[
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": "CNAME",
    "content": "training.56kcloud.io"
  },
  {
    "path": "Cloud/README.md",
    "content": ""
  },
  {
    "path": "DevOps/README.md",
    "content": ""
  },
  {
    "path": "DevOpsDays/readme.md",
    "content": "## DevOpsDays Docker Training\n\n<img src=\"https://raw.githubusercontent.com/56kcloud/Training/master/img/56k.jpg\" alt=\"56K.Cloud Logo\" width=\"150\" height=\"99\">\n\nWelcome to [56K.Cloud](https://www.56k.cloud) Docker Introduction Training.\n\nThis Docker tutorial consists of the following sections:\n\n* [Docker Getting Started with Containers](https://training.play-with-docker.com/ops-s1-hello/)\n* [Docker Images](https://training.play-with-docker.com/ops-s1-images/)\n* [Docker Networking](https://training.play-with-docker.com/docker-networking-hol/)\n* [Docker Swarm](https://training.play-with-docker.com/ops-s1-swarm-intro/)\n"
  },
  {
    "path": "Docker/12factor/00_application.md",
    "content": "# Build the application\n\nTo illustrate the 12 factors, we start by creating a simple Node.js application as a HTTP Rest API exposing CRUD verbs on a *message* model.\n\nThere is a couple of prerequisite to build this application\n* [Node.js 4.4.5 (LTS)](https://nodejs.org/en/)\n* [mongo 3.2](https://docs.mongodb.org/manual/installation/)\n\n## Routes exposed\n\nHTTP verb | URI | Action\n----------| --- | ------\nGET | /message | list all messages\nGET | /message/ID | get message with ID\nPOST | /message | create a new message\nPUT | /message/ID | modify message with ID\nDELETE | /message/ID | delete message with ID\n\n## Setup\n\n* Install Sails.js (it's to Node.js what RoR is to Ruby): `sudo npm install sails -g`\n* Create the  application:  `sails new messageApp && cd messageApp`\n* Launch the application: `sails lift`\n\n## First tests\n\nCreate new messages\n\n```\ncurl -XPOST http://localhost:1337/message?text=hello\ncurl -XPOST http://localhost:1337/message?text=hola\n```\n\nGet list of messages\n\n```\ncurl http://localhost:1337/message\n\n[\n {\n   \"text\": \"hello\",\n   \"createdAt\": \"2015-11-08T13:15:15.363Z\",\n   \"updatedAt\": \"2015-11-08T13:15:15.363Z\",\n   \"id\": \"5638b363c5cd0825511690bd\"\n },\n {\n   \"text\": \"hola\",\n   \"createdAt\": \"2015-11-08T13:15:45.774Z\",\n   \"updatedAt\": \"2015-11-08T13:15:45.774Z\",\n   \"id\": \"5638b381c5cd0825511690be\"\n }\n]\n```\n\nModify a message\n\n```\ncurl -XPUT http://localhost:1337/message/5638b363c5cd0825511690bd?text=hey\n```\n\nDelete a message\n\n ```\n curl -XDELETE http://localhost:1337/message/5638b381c5cd0825511690be\n ```\n\nGet updates list of messages\n\n```\ncurl http://localhost:1337/message\n\n[\n {\n   \"text\": \"hey\",\n   \"createdAt\": \"2015-11-08T13:15:15.363Z\",\n   \"updatedAt\": \"2015-11-08T13:19:40.179Z\",\n   \"id\": \"5638b363c5cd0825511690bd\"\n }\n]\n```\n\n[Next](01_codebase.md)\n"
  },
  {
    "path": "Docker/12factor/01_codebase.md",
    "content": "# 1 - Codebase\n\n**one application <=> one codebase**\n\nIf there are several codebase, it's not an application, it's a distributed system containing multiple applications.\n\nOne codebase used for several deployments of the application\n* development\n* staging\n* production\n\n## What does that mean for our application ?\n\nWe will use Git versioning system (could have chosen subversion, ...) to handle our source code.\n\n* Create a repo on [Github](https://github.com)\n* Put the code under git\n\n```\n$ echo \"# messageApp\" >> README.md\n$ git init\n$ git add .\n$ git commit -m 'First commit'\n$ git remote add origin git@github.com:GITUSER/messageApp.git\n$ git push origin master\n```\n\nThe update we've done is not linked with Docker, but we'll see in a next chapter that this will greatly help the integration of several components of the Docker ecosystem.\n\n[Previous](00_application.md) - [Next](02_dependencies.md)\n"
  },
  {
    "path": "Docker/12factor/02_dependencies.md",
    "content": "# 2 - Dependencies\n\nApplication's dependencies must be declared and isolated\n\n## What does that mean for our application ?\n\nDeclaration are done in package.json file.\n\nLet's add sails-mongo (mongodb driver) as we'll need it very quicky\n\n`npm install sails-mongo --save`\n\nThe package.json file should look like the following:\n\n```\n{\n  \"name\": \"messageApp\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"description\": \"a Sails application\",\n  \"keywords\": [],\n  \"dependencies\": {\n    \"ejs\": \"2.3.4\",\n    \"grunt\": \"0.4.5\",\n    \"grunt-contrib-clean\": \"0.6.0\",\n    \"grunt-contrib-coffee\": \"0.13.0\",\n    \"grunt-contrib-concat\": \"0.5.1\",\n    \"grunt-contrib-copy\": \"0.5.0\",\n    \"grunt-contrib-cssmin\": \"0.9.0\",\n    \"grunt-contrib-jst\": \"0.6.0\",\n    \"grunt-contrib-less\": \"1.1.0\",\n    \"grunt-contrib-uglify\": \"0.7.0\",\n    \"grunt-contrib-watch\": \"0.5.3\",\n    \"grunt-sails-linker\": \"~0.10.1\",\n    \"grunt-sync\": \"0.2.4\",\n    \"include-all\": \"~0.1.6\",\n    \"rc\": \"1.0.1\",\n    \"sails\": \"~0.12.3\",\n    \"sails-disk\": \"~0.10.9\",\n    \"sails-mongo\": \"^0.12.0\"  // Newly added dependency\n  },\n  \"scripts\": {\n    \"debug\": \"node debug app.js\",\n    \"start\": \"node app.js\"\n  },\n  \"main\": \"app.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/GITUSER/messageApp.git\"\n  },\n  \"author\": \"AUTHOR\",\n  \"license\": \"\"\n}\n```\n\nDependencies are isolated within _node-modules_ folder where all the [npm](https://npmjs.org) libraries are compiled and installed.\n\n```\n$ ls node_modules/\nejs                  grunt-contrib-coffee grunt-contrib-cssmin grunt-contrib-uglify grunt-sync           sails\ngrunt                grunt-contrib-concat grunt-contrib-jst    grunt-contrib-watch  include-all          sails-disk\ngrunt-contrib-clean  grunt-contrib-copy   grunt-contrib-less   grunt-sails-linker   rc                   sails-mongo\n```\n\n[Previous](01_codebase.md) - [Next](03_configuration.md)\n"
  },
  {
    "path": "Docker/12factor/03_configuration.md",
    "content": "# 3 - Configuration\n\nConfiguration (credentials, database connection string, ...) should be stored in the environment.\n\n## What does that mean for our application ?\n\nIn _config/connections.js_, we define the _mongo_ connection and use MONGO_URL environment variable to pass the mongo connection string.\n\n```node\nmodule.exports.connections = {\n  mongo: {\n    adapter: 'sails-mongo',\n    url: process.env.MONGO_URL\n  }\n};\n```\n\nIn _config/model.js_, we make sure the _mongo_ connection defined above is the one used.\n\n```node\nmodule.exports.models = {\n  connection: 'mongo',\n  migrate: 'safe'\n};\n```\n\nThose changes enable to provide a different _MONGO_URL_ very easily as it's defined in the environment.\n\n[Previous](02_dependencies.md) - [Next ](04_external_services.md)\n"
  },
  {
    "path": "Docker/12factor/04_external_services.md",
    "content": "# 4 - External services\n\nHandle external services as external resources of the application.\n\nExamples:\n* database\n* log services\n* ...\n\nThis ensure the application is loosely coupled with the services so it can easily switch provider or instance if needed\n\n## What does that mean for our application ?\n\nAt this point, the only external service the application is using is MongoDB database. The loose coupling is already done by the MONGO_URL used to pass the connection string.\n\nIf something wrong happens with our instance of MongoDB (assuming a single instance is used, which is generally a bad idea...), we can easily switch to a new instance, providing a new MONGO_URL environment variable and restarting the application.\n\n[Previous](03_configuration.md) - [Next](05_build_release_run.md)\n"
  },
  {
    "path": "Docker/12factor/05_build_release_run.md",
    "content": "# 5 - Build / Release / Run\n\nBuild / Release and Run phases must be kept separated\n\n![Build/Release/Run](https://dl.dropboxusercontent.com/u/2330187/docker/labs/12factor/build_release_run.png)\n\nA release is deployed on the execution environment and must be immutable.\n\n## What does that mean for our application ?\n\nWe'll use Docker in the whole development pipeline. We will start by adding a Dockerfile that will help define the build phase (during which the dependencies are compiled in _node-modules_ folder)\n\n```\nFROM node:4.4.5\nENV LAST_UPDATED 20160617T185400\n\n# Copy source code\nCOPY . /app\n\n# Change working directory\nWORKDIR /app\n\n# Install dependencies\nRUN npm install\n\n# Expose API port to the outside\nENV PORT 80\nEXPOSE 80\n\n# Launch application\nCMD [\"npm\",\"start\"]\n```\n\nLet's build our application `$ docker build -t message-app:v0.1 .`\n\nAnd verify the resulting image is in the list of available images\n\n```\n$ docker images\nREPOSITORY        TAG           IMAGE ID           CREATED             SIZE\nmessage-app       v0.1          f35464cf4b0b       2 seconds ago       769 MB\n```\n\nNow the image (build) is available, execution environment must be injected to create a release.\n\nThere are several options to inject the configuration in the build, among them\n* create a new image based on the build\n* define a Compose file\n\nWe'll go for the second option and define a docker-compose file where the MONGO_URL will be set with the value of the execution environment\n\n```\nversion: '3'\nservices:\n  mongo:\n    image: mongo:3.2\n    volumes:\n      - mongo-data:/data/db\n    expose:\n      - \"27017\"\n  app:\n    image: message-app:v0.1\n    ports:\n      - \"8000:80\"\n    links:\n      - mongo\n    depends_on:\n      - mongo\n    environment:\n      - MONGO_URL=mongodb://mongo/messageApp\nvolumes:\n  mongo-data:\n```\n\nThis file defines a release as it considers a given build and inject the execution environment.\n\nThe run phase can be done manually with Compose CLI or through an orchestrator (Docker Cloud).\n\nCompose CLI enables to run the global application as simple as `docker-compose up -d`\n\n[Previous](04_external_services.md) - [Next](06_processes.md)\n"
  },
  {
    "path": "Docker/12factor/06_processes.md",
    "content": "# 6 - Processes\n\nAn application is made up of several processes.\n\nEach process must be stateless and must not have local storage (sessions, ...).\n\nThis is required\n* for scalability\n* fault tolerance (crashes, ...)\n\nThe data that need to be persisted, must be saved in a stateful resources (Database, shared filesystem, ...)\n\nEg: sessions can easily be saved in a Redis kv store\n\nNote: Sticky session violate 12 factor.\n\n## What does that mean for our application ?\n\nIn _config/sessions.js_, we need to modify the adapter to store session in a distributed Redis kv store (MongoDB is another possible option).\n\n```\nmodule.exports.session = {\n  ...\n  adapter: 'redis',\n  host: process.env.REDIS_HOST || 'localhost',\n  ...\n};\n```\n\nOnce done, the app needs to be rebuilt `docker build -t message-app:v0.2 .`\n\n**REDIS_HOST** needs to be added to the docker-compose file as the new release will run against this kv store.\n\n```\nversion: '3'\nservices:\n  mongo:\n    image: mongo:3.2\n    volumes:\n      - mongo-data:/data/db\n    expose:\n      - \"27017\"\n  kv:\n    image: redis:alpine\n    volumes:\n      - redis-data:/data\n    expose:\n      - \"6379\"\n  app:\n    image: message-app:v0.2 # New version taking into account REDIS_URL\n    ports:\n      - \"8000:80\"\n    links:\n      - mongo\n    depends_on:\n      - mongo\n    environment:\n      - MONGO_URL=mongodb://mongo/messageApp\n      - REDIS_URL=redis\nvolumes:\n  mongo-data:\n  redis-data:\n```\n\n[Previous](05_build_release_run.md) - [Next](07_port_binding.md)\n"
  },
  {
    "path": "Docker/12factor/07_port_binding.md",
    "content": "# 7 - Port binding\n\nThis factor is related to the exposition of the application to the outside.\n\nTo be compliant with 12 factor, an app must use specialized dependencies (such as http server, ...) and exposes its service through a port.\n\nThe host has the responsibility to route the request to the correct application through port mapping.\n\n## What does that mean for our application ?\n\nDocker already handles that for us, as we can see in the docker-compose file. The **app** container exposes port 80 internally and the host maps it against its port 8000.\n\n```\nversion: '3'\nservices:\n  mongo:\n    image: mongo:3.2\n    volumes:\n      - mongo-data:/data/db\n    expose:\n      - \"27017\"\n  kv:\n    image: redis:alpine\n    volumes:\n      - redis-data:/data\n    expose:\n      - \"6379\"\n  app:\n    image: message-app:v0.2 # New version taking into account REDIS_URL\n    ports:\n      - \"8000:80\"     // app service is exposed on the port 8000 of the host\n    links:\n      - mongo\n    depends_on:\n      - mongo\n    environment:\n      - MONGO_URL=mongodb://mongo/messageApp\n      - REDIS_URL=redis\nvolumes:\n  mongo-data:\n  redis-data:\n```\n\nIf several instances of the app services needs to be deployed, the configuration above cannot be used as a given port on the host cannot map several ports in the containers.\n\nIn this case, we can use a load balancer to which the host will map a port. The load balancer will then be in charge to balance the traffic on the different instances of the services. \n\n[Previous](06_processes.md) - [Next](08_concurrency.md)\n"
  },
  {
    "path": "Docker/12factor/08_concurrency.md",
    "content": "# 8 - Concurrency\n\nHorizontal scalability with the processes model.\n\nThe app can be seen as a set of processes of different types\n* web server\n* worker\n* cron\n\nEach process needs to be able to scale horizontally, it can have its own internal multiplexing.\n\n## What does that mean for our application ?\n\nThe messageApp only have one type of process (http server), it's doing the multiplexing using Node.js http server.\n\nThis process can be easily scalable (stateless process).\n\n[Previous](07_port_binding.md) - [Next](09_disposability.md)\n"
  },
  {
    "path": "Docker/12factor/09_disposability.md",
    "content": "# 9 - Disposability\n\nEach process of an application must be disposable.\n\n* it must have a quick startup\n  * ease the horizontal scalability\n* it must ensure a clean shutdown\n  * stop listening on the port\n  * finish to handle the current request\n  * usage of a queueing system for long lasting (worker type) process\n\n## What does that mean for our application ?\n\nOur application exposes HTTP endPoints that are easy and quick to handle. If we were to have some long lasting worker processes, the usage of a queueing system, like Apache Kafka, would be a great choice.\n\nKafka stores indexes of events processed by each worker. When a worker is restared, it can provide an index indicating at which point in time it needs to restart the event handling. Doing so no events are lost.\n\n[Docker Store](https://store.docker.com) offers several image of Kafka ([Spotify](https://store.docker.com/community/images/spotify/kafka), [Wurstmeister](https://store.docker.com/community/images/wurstmeister/kafka), ...) that can easily be integrated in the docker-compose file of the application.\n\nBelow is an example of how Kafka (and zookeeper) could be added to our docker-compose file. Of course, this means the application has been slightly changed to be able to write and read to/from Kafka.\n\n\n```\n# Kafka message broker\nzookeeper:\n  image: wurstmeister/zookeeper\n  ports:\n    - \"2181:2181\"\nkafka:\n  image: wurstmeister/kafka\n  ports:\n    - \"9092:9092\"\n  links:\n    - zookeeper:zk\n  environment:\n    KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100\n    KAFKA_CREATE_TOPICS: \"DATA:1:1\"\n  volumes:\n    - /var/run/docker.sock:/var/run/docker.sock\n```\n\n[Previous](08_concurrency.md) - [Next](10_dev_prod_parity.md)\n"
  },
  {
    "path": "Docker/12factor/10_dev_prod_parity.md",
    "content": "# 10 - Dev / Prod parity\n\nThe different environments must be as close as possible.\n\nDocker is very good at reducing the gap as the same services can be deployed on the developer machine as they could on any Docker Hosts.\n\nA lot of external services are available on the Docker Store and can be used in an existing application. Using those components enables a developer to use Postgres in development instead of SQLite or other lighter alternative. This reduces the risk of small differences that could show up later, when the app is on production.\n\nThis factor shows an orientation toward continuous deployment, where development can go from dev to production in a very short timeframe, thus avoiding the big bang effect at each release.\n\n\n## What does that mean for our application ?\n\nThe docker-compose file we built so far can be ran on the local machine or on any Docker Host. So Docker really shines at this level as it handles everything for us.\n\nThe exact same application can run on each environment.\n\n[Previous](09_disposability.md) - [Next](11_logs.md)\n"
  },
  {
    "path": "Docker/12factor/11_logs.md",
    "content": "# 11 - Logs\n\nLogs need to be handle as a timeseries of textual events\n\nThe application should not handle or save logs locally but must write them in stdout / stderr.\n\nA lot of services offer a centralized log management ([Elastic Stack / ELK](https://www.elastic.co/products) , [Splunk](http://splunk.com), [Logentries](https://logentries.com), ...), and most of them are very easily integrated with Docker.\n\nExample of Logentries dashboard:\n\n![Logentries](https://dl.dropboxusercontent.com/u/2330187/docker/labs/12factor/logentries.png)\n\n## What does that mean for our application ?\n\nIn order to centralize the logs, we can add a **log** service in our docker-compose file. The API token (provided by logentries) needs to be added to the service.\n\nAs we can see in the volume section, the Docker socket needs to be mounted so logentries container can retrieve each logs emitted by the running containers and send them to logentries external service.\n\n```\nlog:\n  command: '-t XXXXXX-XXXXX-XXXXX-XXXXX'\n  image: 'logentries/docker-logentries’\n  restart: always\n  volumes:\n    - '/var/run/docker.sock:/var/run/docker.sock'\n```\n\n\n[Previous](10_dev_prod_parity.md) - [Next](12_admin_processes.md)\n"
  },
  {
    "path": "Docker/12factor/12_admin_processes.md",
    "content": "# 12 - Admin processes\n\nAdmin process should be seen as a one-off process (opposed to long running processes that make up an application).\n\nUsually used for maintenance task, though a REPL, admin process must be executed on the same release (codebase + configuration) than the application.\n\n## What does that mean for our application ?\n\nIn the docker-compose file we could define an admin service that is ran at the same time as the application and in which we could jump (`docker exec -ti ADMIN_CONTAINER_ID bash`) to execute some admin tasks. The container is able to access all the other containers of the application (provided it belongs to the same networks)\n\n[Previous](11_logs.md)\n"
  },
  {
    "path": "Docker/12factor/README.md",
    "content": "# 12 Factor Application\n\nToday, a lot of applications are services deployed in the cloud, on infrastructure of cloud providers such as Amazon AWS, Google Compute Engine, DigitalOcean, Rackspace, OVH, ...\n\nHeroku is PaaS (Platform as a Service) that relies on Amazon AWS and which makes the deployment of applications as easy as `git push heroku master` (ran from the root of your application).\n\nWith the huge number of applications deployed on Heroku, engineers of the company acquired a great knowledge of what should be done to get cloud native application.\n\n12 factor methodology is the result of their observations. As the name states, it presents 12 principles that will help application to be cloud ready, horizontally scalable, and portable.\n\n# Organisation of this lab\n\nIn this lab, we will start by building a simple Node.js application as an HTTP Rest API exposing CRUD (Create / Read / Update / Delete) verbs on a *message* model.\n\nHTTP verb | URI | Action\n----------| --- | ------\nGET | /message | list all messages\nGET | /message/ID | get message with ID\nPOST | /message | create a message user\nPUT | /message/ID | modify message with ID\nDELETE | /message/ID | delete message with ID\n\nWe will then follow each one of the 12 factor and see how this can leverage our application. At the same time, we will see that Docker is a really great fit for several of those factors.\n\n# Let's get started !\n\n[Build the application](00_application.md)\n\n[1 - Codebase](01_codebase.md)\n\n[2 - Dependencies](02_dependencies.md)\n\n[3 - Configuration](03_configuration.md)\n\n[4 - External services](04_external_services.md)\n\n[5 - Build / Release / Run](05_build_release_run.md)\n\n[6 - Processes](06_processes.md)\n\n[7 - Port binding](07_port_binding.md)\n\n[8 - Concurrency](08_concurrency.md)\n\n[9 - Disposability](09_disposability.md)\n\n[10 - Dev / Prod parity](10_dev_prod_parity.md)\n\n[11 - Logs](11_logs.md)\n\n[12 - Admin processes](12_admin_processes.md)\n\nDo not hesitate to provide comments / feedback you may have in order to improve this lab.\n"
  },
  {
    "path": "Docker/Docker-Orchestration/readme.md",
    "content": "## Advanced Docker Orchestration by Jérôme Petazzoni\n\n- [Slides](https://jpetazzo.github.io/orchestration-workshop)\n- [Orchestration Workshop](https://github.com/docker/orchestration-workshop)\n\n\n## Workshop Outline\n\n- Pre-requirements\n- VM environment\n- Our sample application\n- Running the application\n- Container port mapping\n- Identifying bottlenecks\n- Scaling HTTP on a single node\n- Put a load balancer on it\n- Connecting to containers on other hosts\n- Abstracting remote services with ambassadors\n- Various considerations about ambassadors\n- Docker for ops\n- Backups\n- Starting more containers from your container\n- Docker events stream\n- Attaching labels\n- Logs\n- Storing container logs in an ELK stack\n- Security upgrades\n- Network traffic analysis\n- Dynamic orchestration\n- Hands-on Swarm\n- Deploying Swarm\n- Cluster discovery\n- Resource allocation\n- Connecting containers with ambassadors\n- Setting up Consul and overlay networks\n- Multi-host networking\n- Building images with Swarm\n- Deploying a local registry\n- Scaling workers\n- Distributing Machine credentials\n- Highly available Swarm managers\n- Highly available containers\n- Conclusions\n"
  },
  {
    "path": "Docker/README.md",
    "content": "# Container, Cloud & DevOps Tutorials and Labs\n\n<img src=\"../img/56k.jpg\" alt=\"56K.Cloud Logo\" width=\"150\" height=\"99\">\n\nThis repo contains [Docker](https://docker.com) labs and tutorials authored both by Docker and by members of the community. We welcome contributions and want to grow the repo.\n\n#### Docker Tutorials:\n\n- [Docker Kickstart](kickstart/readme.md)\n- [Docker Training DevOpsDays](DevOpsDays/readme.md)\n- [Docker Swarm Mode](swarm-mode/README.md)\n- [Docker Security](security/README.md)\n- [Docker Networking](networking/)\n\n#### Additional Docker Labs\n\nBe sure to check out the additional Docker resources section aimed at Developers.\n\n- [Docker Additional Resources](additional-ressources/)\n\n#### Contributing\n\nWe want to see this repo grow, so if you have a tutorial to submit or contributions to existing tutorials, please see this guide:\n\n[Guide to submitting your tutorial](./../contribute.md)\n"
  },
  {
    "path": "Docker/additional-ressources/README.md",
    "content": "# Additional Docker Ressources\n\nThis repo contains [Docker](https://docker.com) labs and tutorials, useful links, newsletters, and general Docker ressources. We welcome contributions and want to grow the repo.\n\n#### Useful Links\n\n* [Awesome Docker](http://veggiemonk.github.io/awesome-docker/)\n* [Docker Documentation](http://docs.docker.com)\n* [Docker Labs](https://github.com/docker/labs)\n* [Play-with-Docker](https://labs.play-with-docker.com)\n* [More Hands-On Docker Training](http://training.play-with-docker.com/alacart/)\n\n\n#### Newsletters\n\n* [Docker Newsletter](http://email.docker.com/ZJI6a09YT0000w0vp30KLFC)\n* [5 for Friday](http://brianchristner.us3.list-manage.com/track/click?u=fc0e7be4fb674995b89251efb&id=7205e15ac9&e=f62a500248)\n* [The New Stack](https://thenewstack.io)\n* [Sysdig](https://sysdig.com/blog)\n* []\n\n#### Useful Projects\n\n* [Brian Christner](www.github.com/vegasbrianc/prometheus)\n* [Cloud Native Foundation](https://www.cncf.io)\n* [Jess Frazzle](https://github.com/jessfraz/dockerfiles)\n* [Prometheus](prometheus.io)\n* [Traefik Proxy](https://traefik.io)\n* \n\n\n#### Docker Tutorials:\n* [Configuring developer tools and programming languages](developer-tools/README.md)\n  * Java\n    * [Live Debugging Java with Docker](developer-tools/java-debugging)\n    * [Docker for Java Developers](developer-tools/java/)\n  * Node.js\n    * [Live Debugging a Node.js application in Docker](developer-tools/nodejs-debugging)\n    * [Dockerizing a Node.js application](developer-tools/nodejs/porting/)\n* [Docker for ASP.NET and Windows containers](windows/readme.md)\n* [Building a 12 Factor app with Docker](12factor/README.md)\n* [Hands-on Labs from DockerCon US 2017](dockercon-us-2017/)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/README.md",
    "content": "# Developer Tools Tutorials\n\nThis directory contains tutorials on how to set-up and use common developer tools and programming languages with Docker. We encourage you to [contribute](../contribute.md) your own tutorials here.\n\n## IDEs\n\nWith the introduction of [Docker for Mac](https://www.docker.com/products/docker#/mac) and [Docker for Windows](https://www.docker.com/products/docker#/windows), developers on those platforms got to use a feature that developers on [Docker for Linux](https://www.docker.com/products/docker#linux) had all along: in-container development. With improvements in volume management, Docker is able to detect when code in a volume changes, and update the code in the container. That means you get features like live debugging in a running container, without having to rebuild the container.\n\nYou can also have all your dependencies in a container. All you need is Docker and something to edit your source files on your machine, and you're good to go. That means you can, for instance, debug Node.js in your container without having Node.js on your local machine.\n\nIn order to take advantage of this feature in an IDE, there is some set-up required as there is for any project. The following sections describe how to configure different languages and IDEs to do in-container development.\n\n### [Java Developer Tools](https://github.com/docker/labs/tree/master/developer-tools/java-debugging) including:\n+ Eclipse\n+ IntelliJ\n+ Netbeans\n\n### [Node.js Developer Tools](https://github.com/docker/labs/blob/master/developer-tools/nodejs-debugging/README.md) including:\n+ Visual Studio Code\n\n## Programming languages\nThis is a more comprehensive section detailing how to set-up and optimize your experience using Docker with particular programming languages.\n\n+ [Java](java/)\n+ [Node.js](nodejs/porting/)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/README_es.md",
    "content": "# Tutoriales de Herramientas de Desarrollo\n\nEste directorio contiene tutoriales sobre como configurar y usar herramientas de desarrollo comunes con docker. Te animamos a [contribuir](../contribute.md) con tus propios tutoriales aquí.\n\n## IDEs\n\nCon la introducción de [Docker for Mac](https://www.docker.com/products/docker#/mac) y [Docker for Windows](https://www.docker.com/products/docker#/windows), los desarrolladores pueden ahora desarrollar dentro del contenedor de la misma manera que lo hacen los usuarios que utilizan [Docker for Linux](https://www.docker.com/products/docker#linux). Con mejoras en la administración de volúmenes, Docker permite detectar cuando el código en los volúmenes cambia, y actualizar el código en el contenedor. Esto significa que ahora es posible depurar un contenedor en vivo que se encuentra en ejecución, sin tener que reconstruir el contenedor.\n\n### [Herramientas de Desarrollo Java](https://github.com/docker/labs/tree/master/developer-tools/java-debugging) incluye:\n+ Eclipse\n+ IntelliJ\n+ Netbeans\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/appa-common-commands.adoc",
    "content": "[appendix]\n[[Common_Docker_Commands]]\n== Common Docker Commands\n\nHere is the list of commonly used Docker commands:\n\n[width=\"100%\", options=\"header\"]\n|==================\n| Purpose| Command\n2+^s| Image\n| Build an image| `docker image build --rm=true .`\n| Install an image | `docker image pull ${IMAGE}`\n| List of installed images | `docker image ls`\n| List of installed images (detailed listing) | `docker image ls --no-trunc`\n| Remove an image | `docker image rm ${IMAGE_ID}`\n| Remove unused images | `docker image prune`\n| Remove all images | `docker image rm $(docker image ls -aq)`\n2+^s| Containers\n| Run a container | `docker container run`\n| List of running containers | `docker container ls`\n| List of all containers | `docker container ls -a`\n| Stop a container | `docker container stop ${CID}`\n| Stop all running containers | `docker container stop $(docker container ls -q)`\n| List all exited containers with status 1 | `docker container ls -a --filter \"exited=1\"`\n| Remove a container | `docker container rm ${CID}`\n| Remove container by a regular expression | `docker container ls -a \\| grep wildfly \\| awk '{print $1}' \\| xargs docker container rm -f`\n| Remove all exited containers | `docker container rm -f $(docker container ls -a \\| grep Exit \\| awk '{ print $1 }')`\n| Remove all containers | `docker container rm $(docker container ls -aq)`\n| Find IP address of the container | `docker container inspect --format '{{ .NetworkSettings.IPAddress }}' ${CID}`\n| Attach to a container | `docker container attach ${CID}`\n| Open a shell in to a container | `docker container \texec -it ${CID} bash`\n| Get container id for an image by a regular expression | `docker container ls \\| grep wildfly \\| awk '{print $1}'`\n|==================\n\n=== Exit code status\n\nThe exit code from `docker run` gives information about why the container failed to run or why it exited. The complete list of code is listed:\n\nhttps://docs.docker.com/engine/reference/run/#exit-status\n\nAll other codes are the exit code of the command running in the container."
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/appb-troubleshooting.adoc",
    "content": "[appendix]\n[[Troubleshooting]]\n\n== Troubleshooting Docker\n\n=== Network Timed Out\n\nDepending upon the network speed and restrictions, you may not be able to download Docker images from Docker Store. The error message may look like:\n\n```console\n$ docker pull arungupta/wildfly-mysql-javaee7\nUsing default tag: latest\nPulling repository docker.io/arungupta/wildfly-mysql-javaee7\nNetwork timed out while trying to connect to https://index.docker.io/v1/repositories/arungupta/wildfly-mysql-javaee7/images. You may want to check your internet connection or if you are behind a proxy.\n```\n\nThis section provide a couple of alternatives to solve this.\n\n==== Restart Docker Machine\n\nIt seems like Docker Machine gets into a strange state and restarting it fixes that.\n\n```console\ndocker-machine restart <MACHINE_NAME>\neval $(docker-machine env <MACHINE_NAME>)\n```\n\n=== Cannot create Docker Machine on Windows\n\nAre you not able to create Docker Machine on Windows?\n\nTry starting a `cmd` with Administrator privileges and then give the command again.\n\n=== Docker machine creation fails with an error about dial tcp: i/o timeout\n\nIf you get the following error when creating a docker machine\n\n[source, text]\n----\nError creating machine: Error in driver during machine creation: Get https://api.github.com/repos/boot2docker/boot2docker/releases: dial tcp: i/o timeout\n----\n\nThen you need to go to the boot2docker releases page on\n\nhttps://github.com/boot2docker/boot2docker/releases\n\nAnd download the latest .iso\n\nAfter that you can move that iso to the docker cache directory. This is located in `~/.docker/machine/cache` on Mac & Linux and `/Users/yourUserName/.docker/machine/cache` on Windows.\n\nIssue: https://github.com/docker/machine/issues/2186 is raised so that the docker-machine team can hopefully find a way around this.\n\n=== \"`You may be getting rate limited by Github`\" error message\n\nCredits: https://github.com/docker/machine/blob/master/README.md#troubleshooting\n\nIn order to `create` or `upgrade` virtual machines running Docker, Docker\nMachine will check the Github API for the latest release of the [boot2docker\noperating system](https://github.com/boot2docker/boot2docker).  The Github API\nallows for a small number of unauthenticated requests from a given client, but\nif you share an IP address with many other users (e.g. in an office), you may\nget rate limited by their API, and Docker Machine will error out with messages\nindicating this.\n\nIn order to work around this issue, you can https://help.github.com/articles/creating-an-access-token-for-command-line-use/[generate a\ntoken] and pass it to Docker Machine using the global `--github-api-token` flag:\n\n```console\n$ docker-machine --github-api-token=token create -d virtualbox newbox\n```\n\nThis should eliminate any issues you've been experiencing with rate limiting.\n\n=== Docker Machine Troubleshooting\n\nhttps://github.com/docker/machine/blob/master/README.md#troubleshooting[Docker Machine Troubleshooting] section has good tips on what can possibly go wrong with Docker Machine. Look there if your issue is not explained here.\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/appc-references.adoc",
    "content": "[appendix]\n[[References]]\n\n== References\n\n. Docker Docs: http://docs.docker.com\n. Latest lab content: https://github.com/docker/labs/tree/master/developer-tools/java\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch01-setup.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Setup Environments\n\nThis section describes the hardware and software needed for this workshop, and how to configure them. This workshop is designed for a BYOL (Brying Your Own Laptop) style hands-on-lab.\n\n== Hardware & Software\n\n. Memory: At least 4 GB+, strongly preferred 8 GB\n. Operating System: Mac OS X (10.10.3+), Windows 10 Pro+ 64-bit, Ubuntu 12+, CentOS 7+.\n+\nNOTE: An older version of the operating system may be used. The installation instructions would differ slightly in that case and are explained in the next section.\n. Amazon Web Services credentials with the https://docs.docker.com/docker-for-aws/iam-permissions/[following permissions]. This is only needed for some parts of the workshop.\n\n== Install Docker\n\nDocker runs natively on Mac, Windows and Linux. This lab will use https://www.docker.com/community-edition[Docker Community Edition (CE)]. Download the Docker CE edition for your machine from the https://store.docker.com/search?type=edition&offering=community[Docker Store]. \n\nNOTE: Docker CE requires a fairly recent operating system version. If your machine does not meet the requirements, then you need to install https://www.docker.com/products/docker-toolbox[Docker Toolbox]. \n\nThis workshop is tested with Docker Community Edition `17.09.0-ce-rc2, build 363a3e7` on Mac OS X `10.12.5`.\n\n== Download Images\n\nThis tutorial uses a few Docker images and software. Let's download them before we start the tutorial.\n\nDownload the file from https://raw.githubusercontent.com/docker/labs/master/developer-tools/java/scripts/docker-compose-pull-images.yml and use the following command to pull the required images:\n\n    docker-compose -f docker-compose-pull-images.yml pull --parallel\n\nNOTE: For Linux, `docker-compose` and `docker` commands need `sudo` access. So prefix all commands with `sudo`.\n\n== Other Software\n\nThe software in this section is specific to certain parts of the workshop. Install them only if you plan to attempt them.\n\n. Install https://git-scm.com//[git].\n. Install Docker Cloud CLI following the https://docs.docker.com/docker-cloud/installing-cli/[instructions].\n. Download Java IDE based upon your choice and install.\n.. https://netbeans.org/downloads/[NetBeans 8.2] (`\"Java SE\"` version)\n.. https://www.jetbrains.com/idea/download/[IntelliJ IDEA Community or Ultimate]\n.. http://www.eclipse.org/downloads/eclipse-packages/[Eclipse IDE for Java EE Developers]\n. Download https://maven.apache.org/download.cgi[Maven] and install.\n. Download the OpenJDK build of http://download.java.net/java/GA/jdk9/9/binaries/openjdk-9_linux-x64_bin.tar.gz[JDK 9 for Linux x64].\n  (See also the http://jdk.java.net/9/[OpenJDK JDK 9 download page].)\n. Download the early-access Open JDK build of http://jdk.java.net/9/ea[JDK 9 for Alpine Linux].\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch02-basic-concepts.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n[[Docker_Basics]]\n= Docker Basic Concepts\n\n*PURPOSE*: This chapter introduces the basic terminology of Docker.\n\n[quote, docs.docker.com/]\nDocker is a platform for developers and sysadmins to build, ship, and run applications. Docker lets you quickly assemble applications from components and eliminates the friction that can come when shipping code. Docker lets you test and deploy your code into production as fast as possible.\n\nDocker simplifies software delivery by making it easy to build and share images that contain your application’s entire environment, or _application operating system_.\n\n**What does it mean by an application operating system ?**\n\nYour application typically requires specific versions for your operating system, application server, JDK, and database server, may require to tune the configuration files, and similarly multiple other dependencies. The application may need binding to specific ports and certain amount of memory. The components and configuration together required to run your application is what is referred to as application operating system.\n\nYou can certainly provide an installation script that will download and install these components. Docker simplifies this process by allowing to create an image that contains your application and infrastructure together, managed as one component. These images are then used to create Docker containers which run on the container virtualization platform, provided by Docker.\n\n== Main Components\n\nDocker has three main components:\n\n. __Images__ are the *build component* of Docker and are the read-only templates defining an application operating system.\n. __Containers__ are the *run component* of Docker and created from images. Containers can be run, started, stopped, moved, and deleted.\n. Images are stored, shared, and managed in a __registry__ and are the *distribution component* of Docker. Docker Store is a publicly available registry and is available at http://store.docker.com.\n\nIn order for these three components to work together, the *Docker Daemon* (or Docker Engine) runs on a host machine and does the heavy lifting of building, running, and distributing Docker containers. In addition, the *Client* is a Docker binary which accepts commands from the user and communicates back and forth with the Engine.\n\n.Docker architecture\nimage::docker-architecture.png[]\n\nThe Client communicates with the Engine that is either co-located on the same host or on a different host. Client uses the `pull` command to request the Engine to pull an image from the registry. The Engine then downloads the image from Docker Store, or whichever registry is configured. Multiple images can be downloaded from the registry and installed on the Engine. Client uses the `run` run the container.\n\n== Docker Image\n\nWe've already seen that Docker images are read-only templates from which Docker containers are launched. Each image consists of a series of layers. Docker makes use of union file systems to combine these layers into a single image. Union file systems allow files and directories of separate file systems, known as branches, to be transparently overlaid, forming a single coherent file system.\n\nOne of the reasons Docker is so lightweight is because of these layers. When you change a Docker image—for example, update an application to a new version— a new layer gets built. Thus, rather than replacing the whole image or entirely rebuilding, as you may do with a virtual machine, only that layer is added or updated. Now you don't need to distribute a whole new image, just the update, making distributing Docker images faster and simpler.\n\nEvery image starts from a base image, for example `ubuntu`, a base Ubuntu image, or `fedora`, a base Fedora image. You can also use images of your own as the basis for a new image, for example if you have a base Apache image you could use this as the base of all your web application images.\n\nNOTE: By default, Docker obtains these base images from Docker Store.\n\nDocker images are then built from these base images using a simple, descriptive set of steps we call instructions. Each instruction creates a new layer in our image. Instructions include actions like:\n\n. Run a command\n. Add a file or directory\n. Create an environment variable\n. Run a process when launching a container\n\nThese instructions are stored in a file called a Dockerfile. Docker reads this Dockerfile when you request a build of an image, executes the instructions, and returns a final image.\n\n== Docker Container\n\nA container consists of an operating system, user-added files, and meta-data. As we've seen, each container is built from an image. That image tells Docker what the container holds, what process to run when the container is launched, and a variety of other configuration data. The Docker image is read-only. When Docker runs a container from an image, it adds a read-write layer on top of the image (using a union file system as we saw earlier) in which your application can then run.\n\n== Docker Engine\n\nDocker Host is created as part of installing Docker on your machine. Once your Docker host has been created, it then allows you to manage images and containers. For example, the image can be downloaded and containers can be started, stopped and restarted.\n\n== Docker Client\n\nThe client communicates with the Docker Host and let's you work with images and containers.\n\nCheck if your client is working using the following command:\n\n  docker -v\n\nIt shows the output:\n\n  Docker version 17.09.0-ce-rc3, build 2357fb2\n\nNOTE: The exact version may differ based upon how recently the installation was performed.\n\nThe exact version of Client and Server can be seen using `docker version` command. This shows the output as:\n\n```\nClient:\n Version:      17.09.0-ce-rc3\n API version:  1.32\n Go version:   go1.8.3\n Git commit:   2357fb2\n Built:        Thu Sep 21 02:31:18 2017\n OS/Arch:      darwin/amd64\n\nServer:\n Version:      17.09.0-ce-rc3\n API version:  1.32 (minimum version 1.12)\n Go version:   go1.8.3\n Git commit:   2357fb2\n Built:        Thu Sep 21 02:36:52 2017\n OS/Arch:      linux/amd64\n Experimental: true\n```\n\nThe complete set of commands can be seen using `docker --help`.\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch03-build-image-java-9.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Build a Docker Image with JDK 9\n\n*PURPOSE*: This chapter explains how to create a Docker image with JDK 9.\n\nThe link:ch03-build-image.adoc[prior chapter] explained how, in general, to build a Docker image with Java.\nThis chapter expands on this topic and focuses on JDK 9 features.\n\n== Create a Docker Image using JDK 9\n\nCreate a new directory, for example `docker-jdk9`.\n\nIn that directory, create a new text file `jdk-9-debian-slim.Dockerfile`.\nUse the following contents:\n\n[source, text]\n----\n# A JDK 9 with Debian slim\nFROM debian:stable-slim\n# Download from http://jdk.java.net/9/\n# ADD http://download.java.net/java/GA/jdk9/9/binaries/openjdk-9_linux-x64_bin.tar.gz /opt\nADD openjdk-9_linux-x64_bin.tar.gz /opt\n# Set up env variables\nENV JAVA_HOME=/opt/jdk-9\nENV PATH=$PATH:$JAVA_HOME/bin\nCMD [\"jshell\", \"-J-XX:+UnlockExperimentalVMOptions\", \\\n               \"-J-XX:+UseCGroupMemoryLimitForHeap\", \\\n               \"-R-XX:+UnlockExperimentalVMOptions\", \\\n               \"-R-XX:+UseCGroupMemoryLimitForHeap\"]\n----\n\nThis image uses `debian` slim as the base image and installs the OpenJDK build\nof JDK for linux x64 (see the link:ch01-setup.adoc[setup section] for how to download this into the\ncurrent directory).\n\nThe image is configured by default to run `jshell` the Java REPL. Read more JShell at link:https://docs.oracle.com/javase/9/jshell/introduction-jshell.htm[Introduction to JShell]. The\nexperimental flag `-XX:+UseCGroupMemoryLimitForHeap` is passed to the REPL\nprocess (the frontend Java process managing user input and the backend Java\nprocess managing compilation).  This option will ensure container memory\nconstraints are honored.\n\nBuild the image using the command:\n\n  docker image build -t jdk-9-debian-slim -f jdk-9-debian-slim.Dockerfile .\n\nList the images available using `docker image ls`:\n\n[source, text]\n----\nREPOSITORY              TAG                 IMAGE ID            CREATED             SIZE\njdk-9-debian-slim       latest              023f6999d94a        4 hours ago         400MB\ndebian                  stable-slim         d30525fb4ed2        4 days ago          55.3MB\n----\n\nOther images may be shown as well but we are interested in these two images for\nnow.  The large difference in size is attributed to JDK 9, which is larger\nin size than JDK 8 because it also explicitly provides Java modules that we\nshall see more of later on in this chapter.\n\nRun the container using the command:\n\n  docker container run -m=200M -it --rm jdk-9-debian-slim\n\nto see the output:\n\n[source, text]\n----\nINFO: Created user preferences directory.\n|  Welcome to JShell -- Version 9\n|  For an introduction type: /help intro\n\njshell>\n----\n\nQuery the available memory of the Java process by typing the following\nexpression into the Java REPL:\n\n  Runtime.getRuntime().maxMemory() / (1 << 20)\n\nto see the output:\n\n[source, text]\n----\njshell> Runtime.getRuntime().maxMemory() / (1 << 20)\n$1 ==> 100\n----\n\nNotice that the Java process is honoring memory constraints (see the `--memory`\nof `docker container run`) and will not allocate memory beyond that specified for the\ncontainer.\n\nIn a future release of the JDK it will no longer be necessary to specify an\nexperimental flag (`-XX:+UnlockExperimentalVMOptions`) once the mechanism by\nwhich memory constraints are efficiently detected is stable.\n\nJDK 9 supports the set CPUs constraint (see the `--cpuset-cpus` of\n`docker container run`) but does not currently support other CPU constraints such as\nCPU shares.  This is ongoing work http://openjdk.java.net/jeps/8182070[tracked]\nin the OpenJDK project.\n\nNote: the support for CPU sets and memory constraints have also been backported\nto JDK 8 release 8u131 and above.\n\nType `Ctrl` + `D` to exit out of `jshell`.\n\nTo list all the Java modules distributed with JDK 9 run the following command:\n\n    docker container run -m=200M -it --rm jdk-9-debian-slim java --list-modules\n\nThis will show an output:\n\n[source, text]\n----\njava.activation@9\njava.base@9\njava.compiler@9\njava.corba@9\njava.datatransfer@9\njava.desktop@9\njava.instrument@9\njava.logging@9\njava.management@9\njava.management.rmi@9\njava.naming@9\njava.prefs@9\njava.rmi@9\njava.scripting@9\njava.se@9\njava.se.ee@9\njava.security.jgss@9\njava.security.sasl@9\njava.smartcardio@9\njava.sql@9\njava.sql.rowset@9\njava.transaction@9\njava.xml@9\njava.xml.bind@9\njava.xml.crypto@9\njava.xml.ws@9\njava.xml.ws.annotation@9\njdk.accessibility@9\njdk.aot@9\njdk.attach@9\njdk.charsets@9\njdk.compiler@9\njdk.crypto.cryptoki@9\njdk.crypto.ec@9\njdk.dynalink@9\njdk.editpad@9\njdk.hotspot.agent@9\njdk.httpserver@9\njdk.incubator.httpclient@9\njdk.internal.ed@9\njdk.internal.jvmstat@9\njdk.internal.le@9\njdk.internal.opt@9\njdk.internal.vm.ci@9\njdk.internal.vm.compiler@9\njdk.jartool@9\njdk.javadoc@9\njdk.jcmd@9\njdk.jconsole@9\njdk.jdeps@9\njdk.jdi@9\njdk.jdwp.agent@9\njdk.jlink@9\njdk.jshell@9\njdk.jsobject@9\njdk.jstatd@9\njdk.localedata@9\njdk.management@9\njdk.management.agent@9\njdk.naming.dns@9\njdk.naming.rmi@9\njdk.net@9\njdk.pack@9\njdk.policytool@9\njdk.rmic@9\njdk.scripting.nashorn@9\njdk.scripting.nashorn.shell@9\njdk.sctp@9\njdk.security.auth@9\njdk.security.jgss@9\njdk.unsupported@9\njdk.xml.bind@9\njdk.xml.dom@9\njdk.xml.ws@9\njdk.zipfs@9\n----\n\nIn total there should be 75 modules:\n\n[source, text]\n----\n$ docker container run -m=200M -it --rm jdk-9-debian-slim java --list-modules | wc -l\n      75\n----\n\n== Create a Docker Image using JDK 9 and Alpine Linux\n\nInstead of `debian` as the base image it is possible to use Alpine Linux\nwith an early access build of JDK 9 that is compatible with the muslc library\nshipped with Alpine Linux.\n\nCreate a new text file `jdk-9-alpine.Dockerfile`.\nUse the following contents:\n\n[source, text]\n----\n# A JDK 9 with Alpine Linux\nFROM alpine:3.6\n# Add the musl-based JDK 9 distribution\nRUN mkdir /opt\n# Download from http://jdk.java.net/9/\n# ADD http://download.java.net/java/jdk9-alpine/archive/181/binaries/jdk-9-ea+181_linux-x64-musl_bin.tar.gz\nADD jdk-9-ea+181_linux-x64-musl_bin.tar.gz /opt\n# Set up env variables\nENV JAVA_HOME=/opt/jdk-9\nENV PATH=$PATH:$JAVA_HOME/bin\nCMD [\"jshell\", \"-J-XX:+UnlockExperimentalVMOptions\", \\\n               \"-J-XX:+UseCGroupMemoryLimitForHeap\", \\\n               \"-R-XX:+UnlockExperimentalVMOptions\", \\\n               \"-R-XX:+UseCGroupMemoryLimitForHeap\"]\n----\n\nThis image uses `alpine` 3.6 as the base image and installs the OpenJDK build\nof JDK for Alpine Linux x64 (see the link:ch01-setup.adoc[Setup Environments]\nchapter for how to download this into the current directory).\n\nThe image is configured in the same manner as for the `debian`-based image.\n\nBuild the image using the command:\n\n  docker image build -t jdk-9-alpine -f jdk-9-alpine.Dockerfile .\n\nList the images available using `docker image ls`:\n\n[source, text]\n----\nREPOSITORY              TAG                 IMAGE ID            CREATED             SIZE\njdk-9-debian-slim       latest              023f6999d94a        4 hours ago         400MB\njdk-9-alpine            latest              f5a57382f240        4 hours ago         356MB\ndebian                  stable-slim         d30525fb4ed2        4 days ago          55.3MB\nalpine                  3.6                 7328f6f8b418        3 months ago        3.97MB\n----\n\nNotice the difference in image sizes.  Alpine Linux by design has been carefully\ncrafted to produce a minimal running OS image. A cost of such a design is\nan alternative standard library https://www.musl-libc.org/[musl libc] that is\nnot compatible with the C standard library (libc).  As a result the JDK requires\nmodifications to run on Alpine Linux.  Such modifications have been proposed\nby the OpenJDK http://openjdk.java.net/projects/portola/[Portola Project].\n\n\n== Create a Docker Image using JDK 9 and a Java application\n\nClone the GitHib project https://github.com/PaulSandoz/helloworld-java-9 that\ncontains a simple Java 9-based project:\n\n  git clone https://github.com/PaulSandoz/helloworld-java-9.git\n\n(If you have a github account you may wish to fork it and then clone the fork\nso you can make modifications.)\n\nEnter the directory `helloworld-java-9` and build the project from within a\nrunning Docker container with JDK 9 installed:\n\n  docker container run --volume $PWD:/helloworld-java-9 --workdir /helloworld-java-9 \\\n      -it --rm openjdk:9-jdk-slim \\\n      ./mvnw package\n\n(If you have JDK 9 installed locally on the host system you can build directly\nwith `./mvnw package`.)\n\nIn this case we are using the `openjdk:9-jdk-slim` on Docker hub that has been\nconfigured to work with SSL certificates so that the maven wrapper tool can\nsuccessfully download the maven tool.  This image is not produced or in anyway\nendorsed by the OpenJDK project (unlike the JDK 9 distributions that were\npreviously required).  It is anticipated that future releases of the JDK from\nthe OpenJDK project will have root CA certificates (see issue\nhttps://bugs.openjdk.java.net/browse/JDK-8189131[JDK-8189131])\n\nTo build Docker image for this application use the file `helloworld-jdk-9.Dockerfile` from the checked out repo to build your image. The contents of the file are shown below:\n\n[source, text]\n----\n# Hello world application with JDK 9 and Debian slim\nFROM jdk-9-debian-slim\nCOPY target/helloworld-1.0-SNAPSHOT.jar /opt/helloworld/helloworld-1.0-SNAPSHOT.jar\n# Set up env variables\nCMD java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap \\\n  -cp /opt/helloworld/helloworld-1.0-SNAPSHOT.jar org.examples.java.App\n----\n\nBuild a Docker image containing the simple Java application based of the Docker\nimage `jdk-9-debian-slim`:\n\n    docker image build -t helloworld-jdk-9 -f helloworld-jdk-9.Dockerfile .\n\nList the images available using `docker image ls`:\n\n[source, text]\n----\nREPOSITORY              TAG                 IMAGE ID            CREATED              SIZE\nhelloworld-jdk-9        latest              eb0539e9529a        19 seconds ago       400MB\njdk-9-debian-slim       latest              023f6999d94a        5 hours ago          400MB\njdk-9-alpine            latest              f5a57382f240        5 hours ago          356MB\nopenjdk                 9-jdk-slim          6dca67f4790e        3 days ago           372MB\ndebian                  stable-slim         d30525fb4ed2        4 days ago           55.3MB\nalpine                  3.6                 7328f6f8b418        3 months ago         3.97MB\n----\n\nNotice how large the application image `helloworld-jdk-9`.\n\nRun the `jdeps` tool to see what modules the application depends on:\n\n  docker container run -it --rm helloworld-jdk-9 jdeps --list-deps /opt/helloworld/helloworld-1.0-SNAPSHOT.jar\n\nand observe that the application only depends on the `java.base` module.\n\n== Reduce the size of a Docker Image using JDK 9 and a Java application\n\nThe Java application is extremely simple and as a result uses very little of the\nfunctionality shipped with JDK 9 distribution, specifically the application\nonly depends on functionality present in the `java.base` module.  We can create\na custom Java runtime that only contains the `java.base` module and include\nthat in application Docker image.\n\nCreate a custom Java runtime that is small and only contains the `java.base`\nmodule:\n\n    docker container run --rm \\\n      --volume $PWD:/out \\\n      jdk-9-debian-slim \\\n      jlink --module-path /opt/jdk-9/jmods \\\n        --verbose \\\n        --add-modules java.base \\\n        --compress 2 \\\n        --no-header-files \\\n        --output /out/target/openjdk-9-base_linux-x64\n\nThis command exists as `create-minimal-java-runtime.sh` script in the repo earlier checked out from link:https://github.com/PaulSandoz/helloworld-java-9[helloworld-java-9].\n\nThe JDK 9 tool `jlink` is used to create the custom Java runtime. Read more jlink in the https://docs.oracle.com/javase/9/tools/jlink.htm[Tools Reference]. The tool\nis executed from with the container containing JDK 9 and directory where the\nmodules reside, `/opt/jdk-9/jmods`, is declared in the module path.  Only the\n`java.base` module is selected.\n\nThe custom runtime is output to the `target` directory:\n\n[source, text]\n----\n$ du -k target/openjdk-9-base_linux-x64/\n24      target/openjdk-9-base_linux-x64//bin\n12      target/openjdk-9-base_linux-x64//conf/security/policy/limited\n8       target/openjdk-9-base_linux-x64//conf/security/policy/unlimited\n24      target/openjdk-9-base_linux-x64//conf/security/policy\n68      target/openjdk-9-base_linux-x64//conf/security\n76      target/openjdk-9-base_linux-x64//conf\n44      target/openjdk-9-base_linux-x64//legal/java.base\n44      target/openjdk-9-base_linux-x64//legal\n72      target/openjdk-9-base_linux-x64//lib/jli\n16      target/openjdk-9-base_linux-x64//lib/security\n19824   target/openjdk-9-base_linux-x64//lib/server\n31656   target/openjdk-9-base_linux-x64//lib\n31804   target/openjdk-9-base_linux-x64/\n----\n\nTo build Docker image for this application use the file `helloworld-jdk-9-base.Dockerfile` from the checked out repo. The contents of the file are shown below:\n\n[source, text]\n----\n# Hello world application with custom Java runtime with just the base module and Debian slim\nFROM debian:stable-slim\nCOPY target/openjdk-9-base_linux-x64 /opt/jdk-9\nCOPY target/helloworld-1.0-SNAPSHOT.jar /opt/helloworld/helloworld-1.0-SNAPSHOT.jar\n# Set up env variables\nENV JAVA_HOME=/opt/jdk-9\nENV PATH=$PATH:$JAVA_HOME/bin\nCMD java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap \\\n  -cp /opt/helloworld/helloworld-1.0-SNAPSHOT.jar org.examples.java.App\n----\n\nBuild a Docker image containing the simple Java application based of the Docker\nimage `debian:stable-slim`:\n\n    docker image build -t helloworld-jdk-9-base -f helloworld-jdk-9-base.Dockerfile .\n\nList the images available using `docker image ls`:\n\n[source, text]\n----\nREPOSITORY              TAG                 IMAGE ID            CREATED             SIZE\nhelloworld-jdk-9-base   latest              7052483fdb77        24 seconds ago      87.7MB\nhelloworld-jdk9         latest              eb0539e9529a        17 minutes ago      400MB\njdk-9-debian-slim       latest              023f6999d94a        5 hours ago         400MB\njdk-9-alpine            latest              f5a57382f240        5 hours ago         356MB\nopenjdk                 9-jdk-slim          6dca67f4790e        3 days ago          372MB\ndebian                  stable-slim         d30525fb4ed2        4 days ago          55.3MB\nalpine                  3.6                 7328f6f8b418        3 months ago        3.97MB\n[source, text]\n----\n\nThe `helloworld-jdk-9-base` is much smaller and could be reduced further if\nAlpine Linux was used instead of Debian Slim.\n\nA realistic application will depend on more JDK modules but it's still possible\nto significantly reduce the Java runtime to only the required modules (for\nexample many applications will not require Corba or RMI nor the compiler tools).\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch03-build-image.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Build a Docker Image\n\n*PURPOSE*: This chapter explains how to create a Docker image.\n\n== Dockerfile\n\nDocker build images by reading instructions from a _Dockerfile_. A _Dockerfile_ is a text document that contains all the commands a user could call on the command line to assemble an image. `docker image build` command uses this file and executes all the commands in succession to create an image.\n\n`build` command is also passed a context that is used during image creation. This context can be a path on your local filesystem or a URL to a Git repository.\n\n_Dockerfile_ is usually called _Dockerfile_. The complete list of commands that can be specified in this file are explained at https://docs.docker.com/reference/builder/. The common commands are listed below:\n\n.Common commands for Dockerfile\n[width=\"100%\", options=\"header\", cols=\"1,4,4\"]\n|==================\n| Command | Purpose | Example\n| FROM | First non-comment instruction in _Dockerfile_ | `FROM ubuntu`\n| COPY | Copies mulitple source files from the context to the file system of the container at the specified path | `COPY .bash_profile /home`\n| ENV | Sets the environment variable | `ENV HOSTNAME=test`\n| RUN | Executes a command | `RUN apt-get update`\n| CMD | Defaults for an executing container | `CMD [\"/bin/echo\", \"hello world\"]`\n| EXPOSE | Informs the network ports that the container will listen on | `EXPOSE 8093`\n|==================\n\n== Create your first image\n\nCreate a new directory `hellodocker`.\n\nIn that directory, create a new text file `Dockerfile`. Use the following contents:\n\n[source, text]\n----\nFROM ubuntu:latest\n\nCMD [\"/bin/echo\", \"hello world\"]\n----\n\nThis image uses `ubuntu` as the base image. `CMD` command defines the command that needs to run. It provides a different entry point of `/bin/echo` and gives the argument \"`hello world`\".\n\nBuild the image using the command:\n\n[source, text]\n----\n  docker image build . -t helloworld\n----\n\n`.` in this command is the context for the command `docker image build`. `-t` adds a tag to the image.\n\nThe following output is shown:\n\n[source, text]\n----\nSending build context to Docker daemon  2.048kB\nStep 1/2 : FROM ubuntu:latest\nlatest: Pulling from library/ubuntu\n9fb6c798fa41: Pull complete \n3b61febd4aef: Pull complete \n9d99b9777eb0: Pull complete \nd010c8cf75d7: Pull complete \n7fac07fb303e: Pull complete \nDigest: sha256:31371c117d65387be2640b8254464102c36c4e23d2abe1f6f4667e47716483f1\nStatus: Downloaded newer image for ubuntu:latest\n ---> 2d696327ab2e\nStep 2/2 : CMD /bin/echo hello world\n ---> Running in 9356a508590c\n ---> e61f88f3a0f7\nRemoving intermediate container 9356a508590c\nSuccessfully built e61f88f3a0f7\nSuccessfully tagged helloworld:latest\n----\n\nList the images available using `docker image ls`:\n\n[source, text]\n----\nREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE\nhelloworld          latest              e61f88f3a0f7        3 minutes ago       122MB\nubuntu              latest              2d696327ab2e        4 days ago          122MB\n----\n\nOther images may be shown as well but we are interested in these two images for now.\n\nRun the container using the command:\n\n  docker container run helloworld\n\nto see the output:\n\n  hello world\n\nIf you do not see the expected output, check your Dockerfile that the content exactly matches as shown above. Build the image again and now run it.\n\nChange the base image from `ubuntu` to `busybox` in `Dockerfile`. Build the image again:\n\n  docker image build -t helloworld:2 .\n\nand view the images using `docker image ls` command:\n\n[source, text]\n----\nREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE\nhelloworld          2                   7fbedda27c66        3 seconds ago       1.13MB\nhelloworld          latest              e61f88f3a0f7        5 minutes ago       122MB\nubuntu              latest              2d696327ab2e        4 days ago          122MB\nbusybox             latest              54511612f1c4        9 days ago          1.13MB\n----\n\n`helloworld:2` is the format that allows to specify the image name and assign a tag/version to it separated by `:`.\n\n== Create your first image using Java\n\n=== Create a simple Java application\n\n[NOTE]\n====\nIf you are running OpenJDK 9, `mvn package` may fail with\n[source, text]\n----\n[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project helloworld: Compilation failure: Compilation failure:\n[ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.\n[ERROR] Target option 1.5 is no longer supported. Use 1.6 or later.\n----\nbecause support for Java 5 http://openjdk.java.net/jeps/182[was dropped in JDK9].\n\nYou can add\n[source, xml]\n----\n  <properties>\n    <maven.compiler.source>1.6</maven.compiler.source>\n    <maven.compiler.target>1.6</maven.compiler.target>\n  </properties>\n----\nto the generated `pom.xml` to target 1.6 instead. See also the link:chapters/ch03-build-image-java-9.adoc[Build a Docker Image for Java 9] chapter.\n====\n\nCreate a new Java project:\n\n[source, text]\n----\nmvn archetype:generate -DgroupId=org.examples.java -DartifactId=helloworld -DinteractiveMode=false\n----\n\nBuild the project:\n\n[source, text]\n----\ncd helloworld\nmvn package\n----\n\nRun the Java class:\n\n[source, text]\n----\njava -cp target/helloworld-1.0-SNAPSHOT.jar org.examples.java.App\n----\n\nThis shows the output:\n\n[source, text]\n----\nHello World!\n----\n\nLet's package this application as a Docker image.\n\n==== Java Docker image\n\nRun the OpenJDK container in an interactive manner:\n\n    docker container run -it openjdk\n\nThis will open a terminal in the container. Check the version of Java:\n\n[source, text]\n----\nroot@8d0af9da5258:/# java -version\nopenjdk version \"1.8.0_141\"\nOpenJDK Runtime Environment (build 1.8.0_141-8u141-b15-1~deb9u1-b15)\nOpenJDK 64-Bit Server VM (build 25.141-b15, mixed mode)\n----\n\nA different JDK version may be shown in your case. \n\nExit out of the container by typing `exit` in the container shell.\n\n=== Package and run Java application as Docker image\n\nCreate a new Dockerfile in `helloworld` directory and use the following content:\n\n[source, text]\n----\nFROM openjdk:latest\n\nCOPY target/helloworld-1.0-SNAPSHOT.jar /usr/src/helloworld-1.0-SNAPSHOT.jar\n\nCMD java -cp /usr/src/helloworld-1.0-SNAPSHOT.jar org.examples.java.App\n----\n\nBuild the image:\n\n    docker image build -t hello-java:latest .\n\nRun the image:\n\n    docker container run hello-java:latest\n\nThis displays the output:\n\n    Hello World!\n\nThis shows the exactly same output that was printed when the Java class was invoked using Java CLI.\n\n=== Package and run Java Application using Docker Maven Plugin\n\nhttps://github.com/fabric8io/docker-maven-plugin[Docker Maven Plugin] allows you to manage Docker images and containers using Maven. It comes with predefined goals:\n\n[options=\"header\"]\n|====\n|Goal | Description\n| `docker:build` | Build images\n| `docker:start` | Create and start containers\n| `docker:stop` | Stop and destroy containers\n| `docker:push` | Push images to a registry\n| `docker:remove` | Remove images from local docker host\n| `docker:logs` | Show container logs\n|====\n\nComplete set of goals are listed at https://github.com/fabric8io/docker-maven-plugin.\n\nClone the sample code from https://github.com/arun-gupta/docker-java-sample/.\n\nCreate the Docker image:\n\n    mvn -f docker-java-sample/pom.xml package -Pdocker\n\nThis will show an output like:\n\n[source, text]\n----\n[INFO] Copying files to /Users/argu/workspaces/docker-java-sample/target/docker/hellojava/build/maven\n[INFO] Building tar: /Users/argu/workspaces/docker-java-sample/target/docker/hellojava/tmp/docker-build.tar\n[INFO] DOCKER> [hellojava:latest]: Created docker-build.tar in 87 milliseconds\n[INFO] DOCKER> [hellojava:latest]: Built image sha256:6f815\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n----\n\nThe list of images can be checked using the command `docker image ls | grep hello-java`:\n\n[source, text]\n----\nhello-java                            latest              ea64a9f5011e        5 seconds ago       643 MB\n----\n\nRun the Docker container:\n\n   mvn -f docker-java-sample/pom.xml install -Pdocker\n\nThis will show an output like:\n\n[source, text]\n----\n[INFO] DOCKER> [hellojava:latest]: Start container 30a08791eedb\n30a087> Hello World!\n[INFO] DOCKER> [hellojava:latest]: Waited on log out 'Hello World!' 510 ms\n----\n\nThis is similar output when running the Java application using `java` CLI or the Docker container using `docker container run` command.\n\nThe container is running in the foreground. Use `Ctrl` + `C` to interrupt the container and return back to terminal.\n\nOnly one change was required in the project to enable Docker packaging and running. A Maven profile is added in `pom.xml`:\n\n[source, text]\n----\n<profiles>\n    <profile>\n        <id>docker</id>\n        <build>\n            <plugins>\n                <plugin>\n                    <groupId>io.fabric8</groupId>\n                    <artifactId>docker-maven-plugin</artifactId>\n                    <version>0.22.1</version>\n                    <configuration>\n                        <images>\n                            <image>\n                                <name>hello-java</name>\n                                <build>\n                                    <from>openjdk:latest</from>\n                                    <assembly>\n                                        <descriptorRef>artifact</descriptorRef>\n                                    </assembly>\n                                    <cmd>java -cp maven/${project.name}-${project.version}.jar org.examples.java.App</cmd>\n                                </build>\n                                <run>\n                                    <wait>\n                                        <log>Hello World!</log>\n                                    </wait>\n                                </run>\n                            </image>\n                        </images>\n                    </configuration>\n                    <executions>\n                        <execution>\n                            <id>docker:build</id>\n                            <phase>package</phase>\n                            <goals>\n                                <goal>build</goal>\n                            </goals>\n                        </execution>\n                        <execution>\n                            <id>docker:start</id>\n                            <phase>install</phase>\n                            <goals>\n                                <goal>start</goal>\n                                <goal>logs</goal>\n                            </goals>\n                        </execution>\n                    </executions>\n                </plugin>\n            </plugins>\n        </build>\n    </profile>\n</profiles>\n----\n\n== Dockerfile Command Design Patterns\n\n=== Difference between CMD and ENTRYPOINT\n\n*TL;DR* `CMD` will work for most of the cases.\n\nDefault entry point for a container is `/bin/sh`, the default shell.\n\nRunning a container as `docker container run -it ubuntu` uses that command and starts the default shell. The output is shown as:\n\n```console\n> docker container run -it ubuntu\nroot@88976ddee107:/#\n```\n\n`ENTRYPOINT` allows to override the entry point to some other command, and even customize it. For example, a container can be started as:\n\n```console\n> docker container run -it --entrypoint=/bin/cat ubuntu /etc/passwd\nroot:x:0:0:root:/root:/bin/bash\ndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\nbin:x:2:2:bin:/bin:/usr/sbin/nologin\nsys:x:3:3:sys:/dev:/usr/sbin/nologin\n. . .\n```\n\nThis command overrides the entry point to the container to `/bin/cat`. The argument(s) passed to the CLI are used by the entry point.\n\n=== Difference between ADD and COPY\n\n*TL;DR* `COPY` will work for most of the cases.\n\n`ADD` has all capabilities of `COPY` and has the following additional features:\n\n. Allows tar file auto-extraction in the image, for example, `ADD app.tar.gz /opt/var/myapp`.\n. Allows files to be downloaded from a remote URL. However, the downloaded files will become part of the image. This causes the image size to bloat. So its recommended to use `curl` or `wget` to download the archive explicitly, extract, and remove the archive.\n\n=== Import and export images\n\nDocker images can be saved using `image save` command to a `.tar` file:\n\n  docker image save helloworld > helloworld.tar\n\nThese tar files can then be imported using `load` command:\n\n  docker image load -i helloworld.tar\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch04-run-container.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Run a Docker Container\n\nThe first step in running an application using Docker is to run a container. If you can think of an open source software, there is a very high likelihood that there will be a Docker image available for it at https://store.docker.com[Docker Store]. Docker client can simply run the container by giving the image name. The client will check if the image already exists on Docker Host. If it exists then it'll run the container, otherwise the host will first download the image.\n\n== Pull Image\n\nLet's check if any images are available:\n\n[source, text]\n----\ndocker image ls\n----\n\nAt first, this list is empty. If you've already downloaded the images as specified in the setup chapter, then all the images will be shown here. \n\nList of images can be seen again using the `docker image ls` command. This will show the following output:\n\n[source, text]\n----\nREPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE\nhellojava                    latest              8d76bf5691c4        32 minutes ago      740MB\nhello-java                   latest              93b1180c5d91        36 minutes ago      740MB\nhelloworld                   2                   7fbedda27c66        41 minutes ago      1.13MB\nhelloworld                   latest              e61f88f3a0f7        About an hour ago   122MB\nmysql                        latest              b4e78b89bcf3        3 days ago          412MB\nubuntu                       latest              2d696327ab2e        4 days ago          122MB\njboss/wildfly                latest              9adbdb00cded        8 days ago          592MB\nopenjdk                      latest              6077adce18ea        8 days ago          740MB\nbusybox                      latest              54511612f1c4        9 days ago          1.13MB\ntailtarget/hadoop            2.7.2               ee6b539c886e        6 months ago        1.15GB\ntailtarget/jenkins           2.32.3              71a7d9bcfe2b        6 months ago        859MB\narungupta/couchbase          travel              7929a80707db        7 months ago        583MB\narungupta/couchbase-javaee   travel              2bb52abaad5f        7 months ago        595MB\narungupta/javaee7-hol        latest              da5c9d4f85ca        2 years ago         582MB\n----\n\nMore details about the image can be obtained using `docker image history jboss/wildfly` command:\n\n[source, text]\n----\nIMAGE               CREATED             CREATED BY                                      SIZE                COMMENT\n9adbdb00cded        8 days ago          /bin/sh -c #(nop)  CMD [\"/opt/jboss/wildfl...   0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  EXPOSE 8080/tcp              0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  USER [jboss]                 0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  ENV LAUNCH_JBOSS_IN_BAC...   0B                  \n<missing>           8 days ago          /bin/sh -c cd $HOME     && curl -O https:/...   163MB               \n<missing>           8 days ago          /bin/sh -c #(nop)  USER [root]                  0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  ENV JBOSS_HOME=/opt/jbo...   0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  ENV WILDFLY_SHA1=9ee3c0...   0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  ENV WILDFLY_VERSION=10....   0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/lib/...   0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  USER [jboss]                 0B                  \n<missing>           8 days ago          /bin/sh -c yum -y install java-1.8.0-openj...   204MB               \n<missing>           8 days ago          /bin/sh -c #(nop)  USER [root]                  0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  MAINTAINER Marek Goldma...   0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  USER [jboss]                 0B                  \n<missing>           8 days ago          /bin/sh -c #(nop) WORKDIR /opt/jboss            0B                  \n<missing>           8 days ago          /bin/sh -c groupadd -r jboss -g 1000 && us...   296kB               \n<missing>           8 days ago          /bin/sh -c yum update -y && yum -y install...   28.7MB              \n<missing>           8 days ago          /bin/sh -c #(nop)  MAINTAINER Marek Goldma...   0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  CMD [\"/bin/bash\"]            0B                  \n<missing>           8 days ago          /bin/sh -c #(nop)  LABEL name=CentOS Base ...   0B                  \n<missing>           8 days ago          /bin/sh -c #(nop) ADD file:1ed4d1a29d09a63...   197MB               \n----\n\n== Run Container\n\n=== Interactively\n\nRun WildFly container in an interactive mode.\n\n[source, text]\n----\ndocker container run -it jboss/wildfly\n----\n\nThis will show the output as:\n\n[source, text]\n----\n=========================================================================\n\n  JBoss Bootstrap Environment\n\n  JBOSS_HOME: /opt/jboss/wildfly\n\n  JAVA: /usr/lib/jvm/java/bin/java\n\n. . .\n\n00:26:27,455 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management\n00:26:27,456 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990\n00:26:27,457 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 3796ms - Started 331 of 577 services (393 services are lazy, passive or on-demand)\n----\n\nThis shows that the server started correctly, congratulations!\n\nBy default, Docker runs in the foreground. `-i` allows to interact with the STDIN and `-t` attach a TTY to the process. Switches can be combined together and used as `-it`.\n\nHit Ctrl+C to stop the container.\n\n=== Detached container\n\nRestart the container in detached mode:\n\n[source, text]\n----\ndocker container run -d jboss/wildfly\n254418caddb1e260e8489f872f51af4422bc4801d17746967d9777f565714600\n----\n\n`-d`, instead of `-it`, runs the container in detached mode.\n\nThe output is the unique id assigned to the container. Logs of the container can be seen using the command `docker container logs <CONTAINER_ID>`, where `<CONTAINER_ID>` is the id of the container.\n\nStatus of the container can be checked using the `docker container ls` command:\n\n[source, text]\n----\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES\n254418caddb1        jboss/wildfly       \"/opt/jboss/wildfl...\"   2 minutes ago       Up 2 minutes        8080/tcp            gifted_haibt\n----\n\nAlso try `docker container ls -a` to see all the containers on this machine.\n\n=== With default port\n\nIf you want the container to accept incoming connections, you will need to provide special options when invoking `docker run`. The container, we just started, can't be accessed by our browser. We need to stop it again and restart with different options.\n\n[source, text]\n----\ndocker container stop `docker container ps | grep wildfly | awk '{print $1}'`\n----\n\nRestart the container as:\n\n[source, text]\n----\ndocker container run -d -P --name wildfly jboss/wildfly\n----\n\n`-P` map any exposed ports inside the image to a random port on Docker host. In addition, `--name` option is used to give this container a name. This name can then later be used to get more details about the container or stop it. This can be verified using `docker container ls` command:\n\n[source, text]\n----\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES\n89fbfbceeb56        jboss/wildfly       \"/opt/jboss/wildfl...\"   9 seconds ago       Up 8 seconds        0.0.0.0:32768->8080/tcp   wildfly\n----\n\nThe port mapping is shown in the `PORTS` column. Access WildFly server at http://localhost:32768. Make sure to use the correct port number as shown in your case.\n\nNOTE: Exact port number may be different in your case.\n\nThe page would look like:\n\nimage::wildfly-first-run-default-page.png[]\n\n=== With specified port\n\nStop and remove the previously running container as:\n\n[source, text]\n----\ndocker container stop wildfly\ndocker container rm wildfly\n----\n\nAlternatively, `docker container rm -f wildfly` can be used to stop and remove the container in one command. Be careful with this command because `-f` uses `SIGKILL` to kill the container.\n\nRestart the container as:\n\n[source, text]\n----\ndocker container run -d -p 8080:8080 --name wildfly jboss/wildfly\n----\n\nThe format is `-p hostPort:containerPort`. This option maps a port on the host to a port in the container. This allows us to access the container on the specified port on the host.\n\nNow we're ready to test http://localhost:8080. This works with the exposed port, as expected.\n\nLet's stop and remove the container as:\n\n[source, text]\n----\ndocker container stop wildfly\ndocker container rm wildfly\n----\n\n=== Deploy a WAR file to application server\n\nNow that your application server is running, lets see how to deploy a WAR file to it.\n\nCreate a new directory `hellojavaee`. Create a new text file and name it `Dockerfile`. Use the following contents:\n\n[source, text]\n----\nFROM jboss/wildfly:latest\n\nRUN curl -L https://github.com/javaee-samples/javaee7-simple-sample/releases/download/v1.10/javaee7-simple-sample-1.10.war -o /opt/jboss/wildfly/standalone/deployments/javaee-simple-sample.war\n----\n\nCreate an image:\n\n[source, text]\n----\ndocker image build -t javaee-sample .\n----\n\nStart the container:\n\n[source, text]\n----\ndocker container run -d -p 8080:8080 --name wildfly javaee-sample\n----\n\nAccess the endpoint:\n\n[source, text]\n----\ncurl http://localhost:8080/javaee-simple-sample/resources/persons\n----\n\nSee the output:\n\n[source, text]\n----\n<persons>\n\t<person>\n\t\t<name>\n\t\tPenny\n\t\t</name>\n\t</person>\n\t<person>\n\t\t<name>\n\t\tLeonard\n\t\t</name>\n\t</person>\n\t<person>\n\t\t<name>\n\t\tSheldon\n\t\t</name>\n\t</person>\n\t<person>\n\t\t<name>\n\t\tAmy\n\t\t</name>\n\t</person>\n\t<person>\n\t\t<name>\n\t\tHoward\n\t\t</name>\n\t</person>\n\t<person>\n\t\t<name>\n\t\tBernadette\n\t\t</name>\n\t</person>\n\t<person>\n\t\t<name>\n\t\tRaj\n\t\t</name>\n\t</person>\n\t<person>\n\t\t<name>\n\t\tPriya\n\t\t</name>\n\t</person>\n</persons>\n----\n\nOptional: `brew install XML-Coreutils` will install XML formatting utility on Mac. This output can then be piped to `xml-fmt` to display a formatted result.\n\n== Stop container\n\nStop a specific container by id or name:\n\n[source, text]\n----\ndocker container stop <CONTAINER ID>\ndocker container stop <NAME>\n----\n\nStop all running containers:\n\n[source, text]\n----\ndocker container stop $(docker container ps -q)\n----\n\nStop only the exited containers:\n\n[source, text]\n----\ndocker container ps -a -f \"exited=-1\"\n----\n\n== Remove container\n\nRemove a specific container by id or name:\n\n[source, text]\n----\ndocker container rm <CONTAINER_ID>\ndocker container rm <NAME>\n----\n\nRemove containers meeting a regular expression\n\n[source, text]\n----\ndocker container ps -a | grep wildfly | awk '{print $1}' | xargs docker container rm\n----\n\nRemove all containers, without any criteria\n\n[source, text]\n----\ndocker container rm $(docker container ps -aq)\n----\n\n== Additional ways to find port mapping\n\nThe exact mapped port can also be found using `docker port` command:\n\n[source, text]\n----\ndocker container port <CONTAINER_ID> or <NAME>\n----\n\nThis shows the output as:\n\n[source, text]\n----\n8080/tcp -> 0.0.0.0:8080\n----\n\nPort mapping can be also be found using `docker inspect` command:\n\n[source, text]\n----\ndocker container inspect --format='{{(index (index .NetworkSettings.Ports \"8080/tcp\") 0).HostPort}}' <CONTAINER ID>\n----\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch05-compose.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n[[Docker_Compose]]\n= Multi-container application using Docker Compose\n\n== What is Docker Compose\n\n[quote, github.com/docker/compose]\nDocker Compose is a tool for defining and running complex applications with Docker. With Compose, you define a multi-container application in a single file, then spin your application up in a single command which does everything that needs to be done to get it running.\n\nAn application using Docker containers will typically consist of multiple containers. With Docker Compose, there is no need to write shell scripts to start your containers. All the containers are defined in a configuration file using _services_, and then `docker-compose` script is used to start, stop, and restart the application and all the services in that application, and all the containers within that service. The complete list of commands is:\n\n[options=\"header\"]\n|====\n| Command | Purpose\n| `build` | Build or rebuild services\n| `help` | Get help on a command\n| `kill` | Kill containers\n| `logs` | View output from containers\n| `port` | Print the public port for a port binding\n| `ps` | List containers\n| `pull` | Pulls service images\n| `restart` | Restart services\n| `rm` | Remove stopped containers\n| `run` | Run a one-off command\n| `scale` | Set number of containers for a service\n| `start` | Start services\n| `stop` | Stop services\n| `up` | Create and start containers\n| `migrate-to-labels  Recreate containers to add labels\n|====\n\nThe application used in this section is a Java EE application talking to a database. The application publishes a REST endpoint that can be invoked using `curl. It is deployed using http://wildfly-swarm.io/[WildFly Swarm] that communicates to MySQL database.\n\nWildFly Swarm and MySQL will be running in two separate containers, and thus making this a multi-container application.\n\n== Configuration file\n\nTh entry point to Docker Compose is a Compose file, usually called `docker-compose.yml`. Create a new directory `javaee`. In that directory, create a new file `docker-compose.yml` in it. Use the following contents:\n\n```\nversion: '3.3'\nservices:\n  db:\n    container_name: db\n    image: mysql:8\n    environment:\n      MYSQL_DATABASE: employees\n      MYSQL_USER: mysql\n      MYSQL_PASSWORD: mysql\n      MYSQL_ROOT_PASSWORD: supersecret\n    ports:\n      - 3306:3306\n  web:\n    image: arungupta/docker-javaee:dockerconeu17\n    ports:\n      - 8080:8080\n      - 9990:9990\n    depends_on:\n      - db\n```\n\nIn this Compose file:\n\n. Two services in this Compose are defined by the name `db` and `web` attributes\n. Image name for each service defined using `image` attribute\n. The `mysql:8` image starts the MySQL server.\n. `environment` attribute defines environment variables to initialize MySQL server.\n.. `MYSQL_DATABASE` allows you to specify the name of a database to be created on image startup.\n.. `MYSQL_USER` and `MYSQL_PASSWORD` are used in conjunction to create a new user and to set that user's password. This user will be granted superuser permissions for the database specified by the `MYSQL_DATABASE` variable.\n.. `MYSQL_ROOT_PASSWORD` is mandatory and specifies the password that will be set for the MySQL root superuser account.\n. Java EE application uses the `db` service as specified in the `connection-url` as specified at https://github.com/arun-gupta/docker-javaee/blob/master/employees/src/main/resources/project-defaults.yml/.\n. The `arungupta/docker-javaee:dockerconeu17` image starts WildFly Swarm application server. It consists of the Java EE application built from https://github.com/arun-gupta/docker-javaee. Clone that project if you want to build your own image.\n. Port forwarding is achieved using `ports` attribute.\n. `depends_on` attribute allows to express dependency between services. In this case, MySQL will be started before WildFly. Application-level health check are still user's responsibility.\n\n== Start application\n\nAll services in the application can be started, in detached mode, by giving the command:\n\n```\ndocker-compose up -d\n```\n\nAn alternate Compose file name can be specified using `-f` option.\n\nAn alternate directory where the compose file exists can be specified using `-p` option.\n\nThis shows the output as:\n\n```\ndocker-compose up -d\nCreating network \"javaee_default\" with the default driver\nCreating db ... \nCreating db ... done\nCreating javaee_web_1 ... \nCreating javaee_web_1 ... done\n```\n\nThe output may differ slightly if the images are downloaded as well.\n\nStarted services can be verified using the command `docker-compose ps`:\n\n```\n    Name                  Command               State                       Ports                     \n------------------------------------------------------------------------------------------------------\ndb             docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp                        \njavaee_web_1   /bin/sh -c java -jar /opt/ ...   Up      0.0.0.0:8080->8080/tcp, 0.0.0.0:9990->9990/tcp\n```\n\nThis provides a consolidated view of all the services, and containers within each of them.\n\nAlternatively, the containers in this application, and any additional containers running on this Docker host can be verified by using the usual `docker container ls` command:\n\n```\n    Name                  Command               State                       Ports                     \n------------------------------------------------------------------------------------------------------\ndb             docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp                        \njavaee_web_1   /bin/sh -c java -jar /opt/ ...   Up      0.0.0.0:8080->8080/tcp, 0.0.0.0:9990->9990/tcp\njavaee $ docker container ls\nCONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS                                            NAMES\ne862a5eb9484        arungupta/docker-javaee:dockerconeu17   \"/bin/sh -c 'java ...\"   38 seconds ago      Up 36 seconds       0.0.0.0:8080->8080/tcp, 0.0.0.0:9990->9990/tcp   javaee_web_1\n08792c20c066        mysql:8                                 \"docker-entrypoint...\"   39 seconds ago      Up 37 seconds       0.0.0.0:3306->3306/tcp                           db\n```\n\nService logs can be seen using `docker-compose logs` command, and looks like:\n\n[source, text]\n----\nAttaching to dockerjavaee_web_1, db\nweb_1  | 23:54:21,584 INFO  [org.jboss.msc] (main) JBoss MSC version 1.2.6.Final\nweb_1  | 23:54:21,688 INFO  [org.jboss.as] (MSC service thread 1-8) WFLYSRV0049: WildFly Core 2.0.10.Final \"Kenny\" starting\nweb_1  | 2017-10-06 23:54:22,687 INFO  [org.wildfly.extension.io] (ServerService Thread Pool -- 20) WFLYIO001: Worker 'default' has auto-configured to 8 core threads with 64 task threads based on your 4 available processors\n\n. . .\n\nweb_1  | 2017-10-06 23:54:23,259 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-3) WFLYJCA0001: Bound data source [java:jboss/datasources/ExampleDS]\nweb_1  | 2017-10-06 23:54:24,962 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Core 2.0.10.Final \"Kenny\" started in 3406ms - Started 112 of 124 services (21 services are lazy, passive or on-demand)\nweb_1  | 2017-10-06 23:54:25,020 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) WFLYUT0006: Undertow HTTP listener default listening on 0.0.0.0:8080\nweb_1  | 2017-10-06 23:54:26,146 INFO  [org.wildfly.swarm.runtime.deployer] (main) deploying docker-javaee.war\nweb_1  | 2017-10-06 23:54:26,169 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-3) WFLYSRV0027: Starting deployment of \"docker-javaee.war\" (runtime-name: \"docker-javaee.war\")\nweb_1  | 2017-10-06 23:54:27,748 INFO  [org.jboss.as.jpa] (MSC service thread 1-2) WFLYJPA0002: Read persistence.xml for MyPU\nweb_1  | 2017-10-06 23:54:27,887 WARN  [org.jboss.as.dependency.private] (MSC service thread 1-7) WFLYSRV0018: Deployment \"deployment.docker-javaee.war\" is using a private module (\"org.jboss.jts:main\") which may be changed or removed in future versions without notice.\n\n. . .\n\nweb_1  | 2017-10-06 23:54:29,128 INFO  [stdout] (ServerService Thread Pool -- 4) Hibernate: create table EMPLOYEE_SCHEMA (id integer not null, name varchar(40), primary key (id))\nweb_1  | 2017-10-06 23:54:29,132 INFO  [stdout] (ServerService Thread Pool -- 4) Hibernate: INSERT INTO EMPLOYEE_SCHEMA(ID, NAME) VALUES (1, 'Penny')\nweb_1  | 2017-10-06 23:54:29,133 INFO  [stdout] (ServerService Thread Pool -- 4) Hibernate: INSERT INTO EMPLOYEE_SCHEMA(ID, NAME) VALUES (2, 'Sheldon')\nweb_1  | 2017-10-06 23:54:29,133 INFO  [stdout] (ServerService Thread Pool -- 4) Hibernate: INSERT INTO EMPLOYEE_SCHEMA(ID, NAME) VALUES (3, 'Amy')\nweb_1  | 2017-10-06 23:54:29,133 INFO  [stdout] (ServerService Thread Pool -- 4) Hibernate: INSERT INTO EMPLOYEE_SCHEMA(ID, NAME) VALUES (4, 'Leonard')\n\n. . .\n\nweb_1  | 2017-10-06 23:54:30,050 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 4) WFLYUT0021: Registered web context: /\nweb_1  | 2017-10-06 23:54:30,518 INFO  [org.jboss.as.server] (main) WFLYSRV0010: Deployed \"docker-javaee.war\" (runtime-name : \"docker-javaee.war\")\nweb_1  | 2017-10-06 23:56:01,766 INFO  [stdout] (default task-1) Hibernate: select employee0_.id as id1_0_, employee0_.name as name2_0_ from EMPLOYEE_SCHEMA employee0_\ndb     | Initializing database\n\n. . .\n\ndb     | \ndb     | \ndb     | MySQL init process done. Ready for start up.\ndb     | \n\n. . .\n\ndb     | 2017-10-06T23:54:29.434423Z 0 [Note] /usr/sbin/mysqld: ready for connections. Version: '8.0.3-rc-log'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)\ndb     | 2017-10-06T23:54:30.281973Z 0 [Note] InnoDB: Buffer pool(s) load completed at 171006 23:54:30\n----\n\n`depends_on` attribute in the Compose definition file ensures the container start up order. But application-level start up needs to be ensured by the applications running inside container. In our case, this can be achieved by WildFly Swarm using `swarm.datasources.data-sources.KEY.stale-connection-checker-class-name` as defined at https://reference.wildfly-swarm.io/fractions/datasources.html.\n\n== Verify application\n\nNow that the WildFly Swarm and MySQL have been configured, let's access the application. You need to specify IP address of the host where WildFly is running (`localhost` in our case).\n\nThe endpoint can be accessed in this case as:\n\n    curl -v http://localhost:8080/resources/employees\n\nThe output is shown as:\n\n```\ncurl -v http://localhost:8080/resources/employees\n*   Trying ::1...\n* TCP_NODELAY set\n* Connected to localhost (::1) port 8080 (#0)\n> GET /resources/employees HTTP/1.1\n> Host: localhost:8080\n> User-Agent: curl/7.51.0\n> Accept: */*\n> \n< HTTP/1.1 200 OK\n< Connection: keep-alive\n< Content-Type: application/xml\n< Content-Length: 478\n< Date: Sat, 07 Oct 2017 00:05:41 GMT\n< \n* Curl_http_done: called premature == 0\n* Connection #0 to host localhost left intact\n<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><collection><employee><id>1</id><name>Penny</name></employee><employee><id>2</id><name>Sheldon</name></employee><employee><id>3</id><name>Amy</name></employee><employee><id>4</id><name>Leonard</name></employee><employee><id>5</id><name>Bernadette</name></employee><employee><id>6</id><name>Raj</name></employee><employee><id>7</id><name>Howard</name></employee><employee><id>8</id><name>Priya</name></employee></collection>\n```\n\nThis shows the result from querying the database.\n\nA single resource can be obtained:\n\n    curl -v http://localhost:8080/resources/employees/1\n\nIt shows the output:\n\n```\ncurl -v http://localhost:8080/resources/employees/1\n*   Trying ::1...\n* TCP_NODELAY set\n* Connected to localhost (::1) port 8080 (#0)\n> GET /resources/employees/1 HTTP/1.1\n> Host: localhost:8080\n> User-Agent: curl/7.51.0\n> Accept: */*\n> \n< HTTP/1.1 200 OK\n< Connection: keep-alive\n< Content-Type: application/xml\n< Content-Length: 104\n< Date: Sat, 07 Oct 2017 00:06:33 GMT\n< \n* Curl_http_done: called premature == 0\n* Connection #0 to host localhost left intact\n<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><employee><id>1</id><name>Penny</name></employee>\n```\n\n== Shutdown application\n\nShutdown the application using `docker-compose down`:\n\n```\nStopping javaee_web_1 ... done\nStopping db           ... done\nRemoving javaee_web_1 ... done\nRemoving db           ... done\nRemoving network javaee_default\n```\n\nThis stops the container in each service and removes all the services. It also deletes any networks that were created as part of this application.\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch06-swarm.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n[[Swarm_Mode]]\n= Deploy application using Swarm mode\n\nDocker Engine includes swarm mode for natively managing a cluster of Docker Engines. The Docker CLI can be used to create a swarm, deploy application services to a swarm, and manage swarm behavior. Complete details are available at: https://docs.docker.com/engine/swarm/. It's important to understand the https://docs.docker.com/engine/swarm/key-concepts/[Swarm mode key concepts] before starting with this chapter.\n\nSwarm is typically a cluster of multiple Docker Engines. But for simplicity we'll run a single node Swarm.\n\nThis section will deploy an application that will provide a CRUD/REST interface on a data bucket in https://www.mysql.com/[MySQL]. This is achieved by using a Java EE application deployed on http://wildfly.org[WildFly] to access the database.\n\n== Initialize Swarm\n\nInitialize Swarm mode using the following command:\n\n    docker swarm init\n\nThis starts a Swarm Manager. By default, a manager node is also a worker but can be configured to be a manager-only.\n\nFind some information about this one-node cluster using the command `docker info`\n\n```\nContainers: 0\n Running: 0\n Paused: 0\n Stopped: 0\nImages: 17\nServer Version: 17.09.0-ce\nStorage Driver: overlay2\n Backing Filesystem: extfs\n Supports d_type: true\n Native Overlay Diff: true\nLogging Driver: json-file\nCgroup Driver: cgroupfs\nPlugins:\n Volume: local\n Network: bridge host ipvlan macvlan null overlay\n Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog\nSwarm: active\n NodeID: p9a1tqcjh58ro9ucgtqxa2wgq\n Is Manager: true\n ClusterID: r3xdxly8zv82e4kg38krd0vog\n Managers: 1\n Nodes: 1\n Orchestration:\n  Task History Retention Limit: 5\n Raft:\n  Snapshot Interval: 10000\n  Number of Old Snapshots to Retain: 0\n  Heartbeat Tick: 1\n  Election Tick: 3\n Dispatcher:\n  Heartbeat Period: 5 seconds\n CA Configuration:\n  Expiry Duration: 3 months\n  Force Rotate: 0\n Autolock Managers: false\n Root Rotation In Progress: false\n Node Address: 192.168.65.2\n Manager Addresses:\n  192.168.65.2:2377\nRuntimes: runc\nDefault Runtime: runc\nInit Binary: docker-init\ncontainerd version: 06b9cb35161009dcb7123345749fef02f7cea8e0\nrunc version: 3f2f8b84a77f73d38244dd690525642a72156c64\ninit version: 949e6fa\nSecurity Options:\n seccomp\n  Profile: default\nKernel Version: 4.9.49-moby\nOperating System: Alpine Linux v3.5\nOSType: linux\nArchitecture: x86_64\nCPUs: 4\nTotal Memory: 1.952GiB\nName: moby\nID: TJSZ:O44Y:PWGZ:ZWZM:SA73:2UHI:VVKV:KLAH:5NPO:AXQZ:XWZD:6IRJ\nDocker Root Dir: /var/lib/docker\nDebug Mode (client): false\nDebug Mode (server): true\n File Descriptors: 35\n Goroutines: 142\n System Time: 2017-10-05T20:57:14.037442426Z\n EventsListeners: 1\nRegistry: https://index.docker.io/v1/\nExperimental: true\nInsecure Registries:\n 127.0.0.0/8\nLive Restore Enabled: false\n```\n\nThis cluster has 1 node, and that is a manager. By default, the manager node is also a worker node. This means the containers can run on this node.\n\n== Multi-container application\n\nThis section describes how to deploy a multi-container application using Docker Compose to Swarm mode use Docker CLI. \n\nCreate a new directory and `cd` to it:\n\n    mkdir webapp\n    cd webapp\n\nCreate a new Compose definition `docker-compose.yml` using this link:ch05-compose.adoc#configuration-file[ configuration file].\n\nThis application can be started as:\n\n    docker stack deploy --compose-file=docker-compose.yml webapp\n\nThis shows the output as:\n\n```\nIgnoring deprecated options:\n\ncontainer_name: Setting the container name is not supported.\n\nCreating network webapp_default\nCreating service webapp_db\nCreating service webapp_web\n```\n\nWildFly Swarm and MySQL services are started on this node. Each service has a single container. If the Swarm mode is enabled on multiple nodes then the containers will be distributed across them.\n\nA new overlay network is created. This can be verified using the command `docker network ls`. This network allows multiple containers on different hosts to communicate with each other.\n\n== Verify service and containers in application\n\nVerify that the WildFly and MySQL services are running using `docker service ls`:\n\n```\nID                  NAME                MODE                REPLICAS            IMAGE                                   PORTS\nj21lwelj529f        webapp_db           replicated          1/1                 mysql:8                                 *:3306->3306/tcp\nm0m44axt35cg        webapp_web          replicated          1/1                 arungupta/docker-javaee:dockerconeu17   *:8080->8080/tcp,*:9990->9990/tcp\n```\n\nMore details about the service can be obtained using `docker service inspect webapp_web`:\n\n[source, yml]\n----\n[\n    {\n        \"ID\": \"m0m44axt35cgjetcjwzls7u9r\",\n        \"Version\": {\n            \"Index\": 22\n        },\n        \"CreatedAt\": \"2017-10-07T00:17:44.038961419Z\",\n        \"UpdatedAt\": \"2017-10-07T00:17:44.040746062Z\",\n        \"Spec\": {\n            \"Name\": \"webapp_web\",\n            \"Labels\": {\n                \"com.docker.stack.image\": \"arungupta/docker-javaee:dockerconeu17\",\n                \"com.docker.stack.namespace\": \"webapp\"\n            },\n            \"TaskTemplate\": {\n                \"ContainerSpec\": {\n                    \"Image\": \"arungupta/docker-javaee:dockerconeu17@sha256:6a403c35d2ab4442f029849207068eadd8180c67e2166478bc3294adbf578251\",\n                    \"Labels\": {\n                        \"com.docker.stack.namespace\": \"webapp\"\n                    },\n                    \"Privileges\": {\n                        \"CredentialSpec\": null,\n                        \"SELinuxContext\": null\n                    },\n                    \"StopGracePeriod\": 10000000000,\n                    \"DNSConfig\": {}\n                },\n                \"Resources\": {},\n                \"RestartPolicy\": {\n                    \"Condition\": \"any\",\n                    \"Delay\": 5000000000,\n                    \"MaxAttempts\": 0\n                },\n                \"Placement\": {\n                    \"Platforms\": [\n                        {\n                            \"Architecture\": \"amd64\",\n                            \"OS\": \"linux\"\n                        }\n                    ]\n                },\n                \"Networks\": [\n                    {\n                        \"Target\": \"bwnp1nvkkga68dirhp1ue7qey\",\n                        \"Aliases\": [\n                            \"web\"\n                        ]\n                    }\n                ],\n                \"ForceUpdate\": 0,\n                \"Runtime\": \"container\"\n            },\n            \"Mode\": {\n                \"Replicated\": {\n                    \"Replicas\": 1\n                }\n            },\n            \"UpdateConfig\": {\n                \"Parallelism\": 1,\n                \"FailureAction\": \"pause\",\n                \"Monitor\": 5000000000,\n                \"MaxFailureRatio\": 0,\n                \"Order\": \"stop-first\"\n            },\n            \"RollbackConfig\": {\n                \"Parallelism\": 1,\n                \"FailureAction\": \"pause\",\n                \"Monitor\": 5000000000,\n                \"MaxFailureRatio\": 0,\n                \"Order\": \"stop-first\"\n            },\n            \"EndpointSpec\": {\n                \"Mode\": \"vip\",\n                \"Ports\": [\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 8080,\n                        \"PublishedPort\": 8080,\n                        \"PublishMode\": \"ingress\"\n                    },\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 9990,\n                        \"PublishedPort\": 9990,\n                        \"PublishMode\": \"ingress\"\n                    }\n                ]\n            }\n        },\n        \"Endpoint\": {\n            \"Spec\": {\n                \"Mode\": \"vip\",\n                \"Ports\": [\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 8080,\n                        \"PublishedPort\": 8080,\n                        \"PublishMode\": \"ingress\"\n                    },\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 9990,\n                        \"PublishedPort\": 9990,\n                        \"PublishMode\": \"ingress\"\n                    }\n                ]\n            },\n            \"Ports\": [\n                {\n                    \"Protocol\": \"tcp\",\n                    \"TargetPort\": 8080,\n                    \"PublishedPort\": 8080,\n                    \"PublishMode\": \"ingress\"\n                },\n                {\n                    \"Protocol\": \"tcp\",\n                    \"TargetPort\": 9990,\n                    \"PublishedPort\": 9990,\n                    \"PublishMode\": \"ingress\"\n                }\n            ],\n            \"VirtualIPs\": [\n                {\n                    \"NetworkID\": \"vysfza7wgjepdlutuwuigbws1\",\n                    \"Addr\": \"10.255.0.5/16\"\n                },\n                {\n                    \"NetworkID\": \"bwnp1nvkkga68dirhp1ue7qey\",\n                    \"Addr\": \"10.0.0.4/24\"\n                }\n            ]\n        }\n    }\n]\n----\n\nLogs for the service can be seen using `docker service logs -f webapp_web`:\n\n```\nwebapp_web.1.lf3y5k7pkpt9@moby    | 00:17:47,296 INFO  [org.jboss.msc] (main) JBoss MSC version 1.2.6.Final\nwebapp_web.1.lf3y5k7pkpt9@moby    | 00:17:47,404 INFO  [org.jboss.as] (MSC service thread 1-8) WFLYSRV0049: WildFly Core 2.0.10.Final \"Kenny\" starting\nwebapp_web.1.lf3y5k7pkpt9@moby    | 2017-10-07 00:17:48,636 INFO  [org.wildfly.extension.io] (ServerService Thread Pool -- 20) WFLYIO001: Worker 'default' has auto-configured to 8 core threads with 64 task threads based on your 4 available processors\n\n. . .\n\nwebapp_web.1.lf3y5k7pkpt9@moby    | 2017-10-07 00:17:56,619 INFO  [org.jboss.resteasy.resteasy_jaxrs.i18n] (ServerService Thread Pool -- 12) RESTEASY002225: Deploying javax.ws.rs.core.Application: class org.javaee.samples.employees.MyApplication\nwebapp_web.1.lf3y5k7pkpt9@moby    | 2017-10-07 00:17:56,621 WARN  [org.jboss.as.weld] (ServerService Thread Pool -- 12) WFLYWELD0052: Using deployment classloader to load proxy classes for module com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider:main. Package-private access will not work. To fix this the module should declare dependencies on [org.jboss.weld.core, org.jboss.weld.spi]\nwebapp_web.1.lf3y5k7pkpt9@moby    | 2017-10-07 00:17:56,682 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 12) WFLYUT0021: Registered web context: /\nwebapp_web.1.lf3y5k7pkpt9@moby    | 2017-10-07 00:17:57,094 INFO  [org.jboss.as.server] (main) WFLYSRV0010: Deployed \"docker-javaee.war\" (runtime-name : \"docker-javaee.war\")\n```\n\nMake sure to wait for the last log statement to show.\n\n== Access application\n\nNow that the WildFly and MySQL servers have been configured, let's access the application. You need to specify IP address of the host where WildFly is running (`localhost` in our case).\n\nThe endpoint can be accessed in this case as:\n\n    curl -v http://localhost:8080/resources/employees\n\nThe output is shown as:\n\n```\n*   Trying ::1...\n* TCP_NODELAY set\n* Connected to localhost (::1) port 8080 (#0)\n> GET /resources/employees HTTP/1.1\n> Host: localhost:8080\n> User-Agent: curl/7.51.0\n> Accept: */*\n> \n< HTTP/1.1 200 OK\n< Connection: keep-alive\n< Content-Type: application/xml\n< Content-Length: 478\n< Date: Sat, 07 Oct 2017 00:22:59 GMT\n< \n* Curl_http_done: called premature == 0\n* Connection #0 to host localhost left intact\n<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><collection><employee><id>1</id><name>Penny</name></employee><employee><id>2</id><name>Sheldon</name></employee><employee><id>3</id><name>Amy</name></employee><employee><id>4</id><name>Leonard</name></employee><employee><id>5</id><name>Bernadette</name></employee><employee><id>6</id><name>Raj</name></employee><employee><id>7</id><name>Howard</name></employee><employee><id>8</id><name>Priya</name></employee></collection>\n```\n\nThis shows all employees stored in the database.\n\n== Stop application\n\nIf you only want to stop the application temporarily while keeping any networks that were created as part of this application, the recommended way is to set the amount of service replicas to 0.\n\n    docker service scale webapp_db=0 webapp_web=0\n\nIt shows the output:\n\n```\nwebapp_db scaled to 0\nwebapp_web scaled to 0\nSince --detach=false was not specified, tasks will be scaled in the background.\nIn a future release, --detach=false will become the default.\n```\n\nThis is especially useful if the stack contains volumes and you want to keep the data. It allows you to simply start the stack again with setting the replicas to a number higher than 0.\n\n== Remove application completely\n\nShutdown the application using `docker stack rm webapp`:\n\n```\nRemoving service webapp_db\nRemoving service webapp_web\nRemoving network webapp_default\n```\n\nThis stops the container in each service and removes the services. It also deletes any networks that were created as part of this application.\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch07-eclipse.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n[[Docker_Eclipse]]\n== Docker and Eclipse\n\nThis chapter will show you basic Docker tooling with Eclipse:\n\n- Pull/Push/Build Docker images\n- Run/Start/Stop/Kill Docker containers\n- Customize views\n\nWatch a quick video explaining the key steps in https://www.youtube.com/watch?v=XmhEZiS26os.\n\n=== Install Docker Tooling in Eclipse\n\nDownload http://www.eclipse.org/downloads/eclipse-packages/[Eclipse IDE for Java EE Developers] and install.\n\nGo to \"`Help`\" menu, \"`Install New Software...`\".\n\nSelect Eclipse update site for the release, search for Docker, select \"`Docker Tooling`\".\n\nimage::docker-eclipse-update-site-selection.png[]\n\nClick on \"`Next>`\", \"`Next>`\", accept the license agreement, click on \"`Finish`\" to start the installation.\n\nRestart Eclipse for the installation to complete.\n\n=== Docker Perspective and View\n\nGo to \"`Window`\", \"`Perspective`\", \"`Open Perspective`\", \"`Other...`\", \"`Docker Tooling`\".\n\nimage::docker-eclipse-docker-perspective.png[]\n\nClick on \"`OK`\" to see the perspective.\n\nimage::docker-eclipse-docker-perspective-default-look.png[]\n\nThis has three views:\n\n- *Docker Explorer*: a tree view listing all connected Docker instances, with image and containers.\n- *Docker Images*: a table view listing containers for selected Docker connection.\n- *Docker Containers*: a table view listing containers for selected Docker connection\n\nClick on the text in Docker Explorer to create a new connection. If you are on Mac/Windows, you are likely using Docker for Mac/Windows or Docker Toolbox to setup Docker Host. Eclipse allows to configure Docker Engine using both Docker for Mac/Windows and Docker Toolbox.\n\nIf you are using Docker for Mac/Windows, then the default values are shown:\n\nimage::docker-eclipse-docker-connection.png[]\n\nClick on \"`Test Connection`\" to test the connection.\n\nimage::docker-eclipse-docker-connection-test.png[]\n\nIf you are using Toolbox, enter the values as shown:\n\nimage::docker-eclipse-docker-connection-toolbox.png[]\n\nThe exact value of TCP Connection can be found using `docker-machine ls` command. The path for authentication is the directory name where certificates for your Docker Machine, `couchbase` in this case, are stored.\n\nClick on \"`Test Connection`\" to make sure the connection is successfully configured.\n\nimage::docker-eclipse-docker-connection-test-toolbox.png[]\n\nIn either case, the configuration can be completed once the connection is tested. Click on \"`Finish`\" to complete the configuration.\n\nDocker Explorer is updated to show the connection.\n\nContainers and Images configured for the Docker Machine are shown in tabs. They can be expanded to see the list in Explorer itself.\n\n=== Pull an Image\n\nExpand the connection to see \"`Containers`\" and \"`Images`\".\n\nRight-click on \"`Images`\" and select \"`Pull...`\".\n\nType the image name and click on \"`Finish`\".\n\nimage::docker-eclipse-pull-image.png[]\n\nThis image is now shown in Explorer and Docker Images tab.\n\nimage::docker-eclipse-pulled-image.png[]\n\nAny existing images on the Docker Host will be shown here.\n\n=== Run a Container\n\nSelect an image, right-click on it, and click on \"`Run...`\". It shows the options that can be configured for running the container. Some of them are:\n\n- Publish ports on Docker host interface (`-P` or `-p` in `docker run` command)\n- Keep STDIN open and allocate pseudo-TTY (`-it` on CLI)\n- Remove container after it exits (`--rm` on CLI)\n- Volume mapping (`-v` on CLI)\n- Environment variables (`-e` on CLI)\n\nUncheck \"`Publish all exposed ports`\" box to map to corresponding ports.\n\nimage::docker-eclipse-run-container-config.png[]\n\nClick on \"`Finish`\" to run the container.\n\nRight-click on the started container, select \"`Display Log`\" to show the log.\n\nimage::docker-eclipse-container-display-log.png[]\n\nThe container can be paused, stopped and killed from here as well.\n\nTo see more details about the container, right-click on the container, select \"`Show In`\", \"`Properties`\".\n\nimage::docker-eclipse-container-properties.png[]\n\n=== Build an Image\n\nIn Docker Images tab, click on the hammer icon on top right.\n\nGive the image name, specify an empty directory, click on \"`Edit Dockerfile`\" to edit the contents of Dockerfile\n\nimage::docker-eclipse-build-image.png[]\n\nClick on \"`Save`\" and \"`Finish`\" to create the image.\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch07-intellij.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n[[Docker_IntelliJ]]\n== Docker and IntelliJ IDEA\n\nThis chapter will show you basic Docker tooling with IntelliJ IDEA:\n\n- Pull Docker images\n- Run, stop, delete a Container\n- Build an Image\n\n=== Install Docker Plugin in IDEA\n\nGo to \"`Preferences`\", \"`Plugins`\", \"`Install JetBrains plugin...`\", search on \"`docker`\" and click on \"`Install`\"\n\nimage::docker-intellij-plugin-install.png[]\n\nRestart IntelliJ IDEA to active plugin.\n\nClick on \"`Create New Project`\", select \"`Java`\", \"`Web Application`\"\n\nimage::docker-intellij-create-java-project.png[]\n\nClick on \"`Next`\", give the project a name \"`dockercon`\", click on \"`Finish`\". This will open up the project in IntelliJ window.\n\nGo to \"`Preferences`\", \"`Clouds`\", add a new deployment by clicking on \"`+`\". Click on \"`Import credentials from Docker Machine`\", \"`Detect`\", and see a successful connection. You may have to check the IP address of your Docker Machine. Find the IP address of your Docker Machine as `docker-machine ip <machine-name>` and specify the correct IP address here.\n\nimage::docker-intellij-cloud-connection.png[]\n\nGo to \"`View`\", \"`Tool Windows`\", \"`Docker Tooling Window`\". Click on \"`Connect`\"\" to connect with Docker Machine. Make sure Docker Machine is running. \n\nWARNING: IDEA does not work with \"`Docker for Mac`\" at this time. (ADD BUG #)\n\nimage::docker-intellij-tool-window.png[]\n\n=== Pull an Image\n\nSelect top-level node with the name \"`Docker`\", click on \"`Pull image`\"\n\nimage::docker-intellij-pull-image.png[]\n\nType an image name, such as `arungupta/couchbase`, and \"`OK`\"\n\nimage::docker-intellij-repository-name.png[]\n\nExpand \"`Containers`\" and \"`Images`\" to see existing running containers and images.\n\nThe specified image is now downloaded and shown as well.\n\n=== Run a Container\n\nSelect the downloaded image, click on \"`Create container`\"\n\nSelect \"`After launch`\" and enter the URL as `http://192.168.99.100:8091`. Make sure to match the IP address of your Docker Machine.\n\nimage::docker-intellij-deployment-after-launch.png[]\n\nIn \"`Container`\" tab, add \"`Port bindings`\" for `8091:8091`\n\nimage::docker-intellij-container-ports.png[]\n\nClick on \"`Run`\" to run the container.\n\nThis will bring up the browser window and display the page http://192.168.99.100:8091 and looks like:\n\nimage::docker-intellij-run-container-browser.png[]\n\nThis image uses http://developer.couchbase.com/documentation/server/current/rest-api/rest-endpoints-all.html[Couchbase REST API] to configure the Couchbase server. \n\nRight-click on the running container, select \"`Inspect`\" to see more details about the container.\n\nimage::docker-intellij-container-inspect.png[]\n\nClick on \"`Stop container`\" to stop the container and \"`Delete container`\" to delete the container.\n\n=== Build an Image\n\n. Refer to the instructions https://www.jetbrains.com/help/idea/2016.1/docker.html\n\n. Right-click on the project, create a new directory `docker-dir`\n. Artifact\n.. Click on top-right for \"`Project Structure`\"\n.. select \"`Artifacts`\"\n.. change \"`Type:`\" to \"`Web Application: Archive`\"\n.. change the name to `dockercon`\n.. change `Output directory` to `docker-dir`\n. Create \"`Dockerfile`\" in this directory. Use the contents\n+\n```\nFROM jboss/wildfly\n\nADD dockercon.war /opt/jboss/wildfly/standalone/deployments/\n```\n+\n. \"`Run`\", \"`Edit Configurations`\", add new \"`Docker Deployment`\"\n.. \"`Deployment`\" tab\n... Change the name to `dockercon`\n... Select \"`After launch`\", change the URL to \"`http://192.168.99.100:18080/dockercon/index.jsp`\"\n... In \"`Before launch`\", add \"`Build Artifacts`\" and select the artifact\n.. \"`Container`\" tab\n... Add \"`Port bindings`\" for \"`8080:18080`\"\n. View, Tool Windows, Docker, connect to it\n. Run the project\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch07-netbeans.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n[[Docker_NetBeans]]\n== Docker and NetBeans\n\nThis chapter will show you basic Docker tooling with NetBeans:\n\n- Pull/Build Docker images\n- Run/Start/Stop Docker containers\n\nNOTE: NetBeans only supports configuring Docker Engine running using Docker Toolbox. This means that if you are running Docker for Mac or Docker for Windows then NetBeans cannot be used.\n\n=== Configure Docker Host\n\nIn \"`Services`\" window, right-click on \"`Docker`\", click on \"`Add Docker...`\"\n\nimage::docker-netbeans-add-docker.png[]\n\nSpecify Docker Machine coordinates, click on \"`Test Connection`\" to validate the connection:\n\nimage::docker-netbeans-add-docker-instance.png[]\n\nNOTE: No support for Docker for Mac/Windows, filed as https://netbeans.org/bugzilla/show_bug.cgi?id=262398[#262398].\n\nClick on \"`Finish`\" to see:\n\nimage::docker-netbeans-added-docker-instance.png[]\n\nExpand the connection to see \"`Images`\" and \"`Containers`\".\n\n=== Pull an Image\n\nRight-click on Docker node and select \"`Pull...`\".\n\nimage::docker-netbeans-pull-image.png[]\n\nType the image name to narrow down the search from Docker Store:\n\nimage::docker-netbeans-search-image.png[]\n\nClick on \"`Pull`\" to pull the image.\n\nLog is updated in the Output window:\n\nimage::docker-netbeans-pull-image-output.png[]\n\nThis image is now shown in Services tab\n\nimage::docker-netbeans-pulled-image.png[]\n\nAny existing images on the Docker Host will be shown here as well.\n\n=== Run a Container\n\nSelect an image, right-click on it, and click on \"`Run...`\".\n\nimage::docker-netbeans-run-container.png[]\n\nThis brings up a dialog that allows the options that can be configured for running the container. Some of them are:\n\n- Container name\n- Override the command\n- Keep STDIN open and allocate pseudo-TTY (`-it` on CLI)\n- Publish ports on Docker host interface (`-P` or `-p` in `docker run` command)\n\nimage::docker-netbeans-run-container-option1.png[]\n\nClick on \"`Next>`\" to see the options to configure exposed ports. Click on \"`Add`\" to explicitly map host port \"`8091`\" to container port \"`8091`\".\n\nimage::docker-netbeans-run-container-option2.png[]\n\nClick on \"`Finish`\" to run the container. \"`Services`\" window is updated as:\n\nimage::docker-netbeans-run-container-services.png[]\n\nLog is shown in the \"`Output`\" window:\n\nimage::docker-netbeans-run-container-log.png[]\n\nRight-click on the container, select \"`Show Log`\" to show the log generated by the container. The container can be paused and stopped from here as well.\n\n=== Build an Image\n\nOn the configured Docker Host, right-click and select \"`Build...`\" to build a new image:\n\nimage::docker-netbeans-build-image.png[]\n\nSpecify a directory where `Dockerfile` exists, give the image name:\n\nimage::docker-netbeans-build-image-option1.png[]\n\nClick on \"`Next>`\", choose the options that matter:\n\nimage::docker-netbeans-build-image-option2.png[]\n\nClick on \"`Finish`\" to build the image. The image is shown in the \"`Services`\" window:\n\nimage::docker-netbeans-build-image-services.png[]\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch08-aws.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Docker for AWS\n\nhttps://docs.docker.com/docker-for-aws/[Docker for AWS] is a CloudFormation template that configures Docker in swarm-mode, running on EC2 instances backed by custom AMIs. This allows to create a cluster of Docker Engine in swarm-mode with a single click. This workshop will take the https://github.com/docker/labs/blob/master/developer-tools/java/chapters/ch06-swarm.adoc#multi-container-application[multi-container application] and deploy it on multiple hosts.\n\n== Requirements\n\nWhat is required for creating this CloudFormation template?\n\n. https://docs.docker.com/docker-for-aws/iam-permissions/[Permissions]\n. SSH key in AWS in the region where you want to deploy (required to access the completed Docker install). http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html[Amazon EC2 Key Pair] explains how to add SSH key to your account\n. AWS account that support EC2-VPC\n\n== Create cluster\n\nhttps://console.aws.amazon.com/cloudformation/home#/stacks/new?stackName=Docker&templateURL=https://editions-us-east-1.s3.amazonaws.com/aws/stable/Docker.tmpl[Launch Stack] to create the CloudFormation template.\n\n.Select template\nimage::docker-aws-1.png[]\n\nClick on `Next`\n\n.Swarm size\nimage::docker-aws-2.png[]\n\nSelect the number of Swarm manager (3) and worker (5) nodes. This wll create a 8 node cluster. Each node will initialize a new EC2 instance. Feel free to alter the number of master and worker nodes. For example, a more reasonable number for testing may be 1 master and 3 worker nodes.\n\nSelect the SSH key that will be used to access the cluster.\n\nBy default, the template is configured to redirect all log statements to CloudWatch. Until https://github.com/moby/moby/issues/30691[#30691] is fixed, the logs will only be available using CloudWatch. Alternatively, you may select to not redirect logs to CloudWatch. In this case, the usual command to get the logs will work.\n\nScroll down to select manager and worker properties.\n\n.Swarm manager/worker properties\nimage::docker-aws-3.png[]\n\n`m4.large` (2 vCPU and 8 GB memory) is a good start for manager. `m4.xlarge` (4 vCPU and 16 GB memory) is a good start for worker node. Feel free to choose `m3.medium` (1 vCPU and 3.75 GB memory) for manager and `m3.large` (2 vCPU and 7.5 GB memory) for a smaller cluster. Make sure the EC2 instance size is chosen to accommodate the processing and memory needs of containers that will run there.\n\nClick on `Next`\n\n.Swarm options\nimage::docker-aws-4.png[]\n\nTake default for all the options and click on `Next`.\n\n.Swarm review\nimage::docker-aws-5.png[]\n\n.Swarm IAM accept\nimage::docker-aws-6.png[]\n\nAccept the checkbox for CloudFormation to create IAM resources. Click on `Create` to create the Swarm cluster.\n\nIt will take a few minutes for the CloudFormation template to complete. The output will look like:\n\n.Swarm CloudFormation complete\nimage::docker-aws-7.png[]\n\nhttps://console.aws.amazon.com/ec2/v2/home?#Instances:search=docker;sort=instanceState[EC2 Console] will show the EC2 instances for manager and worker.\n\n.EC2 console\nimage::docker-aws-8.png[]\n\nSelect one of the manager nodes, copy the public IP address:\n\n[[Swarm_manager]]\n.Swarm manager\nimage::docker-aws-9.png[]\n\nCreate a SSH tunnel using the command:\n\n  ssh -i ~/.ssh/arun-us-east1.pem -o StrictHostKeyChecking=no -NL localhost:2374:/var/run/docker.sock docker@ec2-34-200-216-30.compute-1.amazonaws.com &\n\nGet more details about the cluster using the command `docker -H localhost:2374 info`. This shows the output:\n\n```\nContainers: 5\n Running: 4\n Paused: 0\n Stopped: 1\nImages: 5\nServer Version: 17.09.0-ce\nStorage Driver: overlay2\n Backing Filesystem: extfs\n Supports d_type: true\n Native Overlay Diff: true\nLogging Driver: awslogs\nCgroup Driver: cgroupfs\nPlugins:\n Volume: local\n Network: bridge host ipvlan macvlan null overlay\n Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog\nSwarm: active\n NodeID: rb6rju2eln0bn80z7lqocjkuy\n Is Manager: true\n ClusterID: t38bbbex5w3bpfmnogalxn5k1\n Managers: 3\n Nodes: 8\n Orchestration:\n  Task History Retention Limit: 5\n Raft:\n  Snapshot Interval: 10000\n  Number of Old Snapshots to Retain: 0\n  Heartbeat Tick: 1\n  Election Tick: 3\n Dispatcher:\n  Heartbeat Period: 5 seconds\n CA Configuration:\n  Expiry Duration: 3 months\n  Force Rotate: 0\n Autolock Managers: false\n Root Rotation In Progress: false\n Node Address: 172.31.46.94\n Manager Addresses:\n  172.31.26.163:2377\n  172.31.46.94:2377\n  172.31.8.136:2377\nRuntimes: runc\nDefault Runtime: runc\nInit Binary: docker-init\ncontainerd version: 06b9cb35161009dcb7123345749fef02f7cea8e0\nrunc version: 3f2f8b84a77f73d38244dd690525642a72156c64\ninit version: 949e6fa\nSecurity Options:\n seccomp\n  Profile: default\nKernel Version: 4.9.49-moby\nOperating System: Alpine Linux v3.5\nOSType: linux\nArchitecture: x86_64\nCPUs: 2\nTotal Memory: 7.785GiB\nName: ip-172-31-46-94.ec2.internal\nID: F65G:UTHH:7YEM:XPEZ:NBIZ:XN25:ONG6:QN5R:7MGJ:I3RS:BAX3:UO7A\nDocker Root Dir: /var/lib/docker\nDebug Mode (client): false\nDebug Mode (server): true\n File Descriptors: 299\n Goroutines: 399\n System Time: 2017-10-07T01:04:00.971903882Z\n EventsListeners: 0\nRegistry: https://index.docker.io/v1/\nLabels:\n os=linux\n region=us-east-1\n availability_zone=us-east-1c\n instance_type=m4.large\n node_type=manager\nExperimental: true\nInsecure Registries:\n 127.0.0.0/8\nLive Restore Enabled: false\n```\n\nList of nodes in the cluster can be seen using `docker -H localhost:2374 node ls`:\n\n```\nID                            HOSTNAME                        STATUS              AVAILABILITY        MANAGER STATUS\nxdhwdiglfs5wsvkcl0j65wl04     ip-172-31-4-89.ec2.internal     Ready               Active              \nxbrejk2g7mk9v15hg9xzu3syq     ip-172-31-8-136.ec2.internal    Ready               Active              Leader\nbhwc67r78cfqtquri82qdwtnk     ip-172-31-13-38.ec2.internal    Ready               Active              \nygxdfloly3x203x9p5wbpk34d     ip-172-31-17-74.ec2.internal    Ready               Active              \ntoyfec889wuqdix6z618mlj85     ip-172-31-26-163.ec2.internal   Ready               Active              Reachable\n37lzvgrtlnnq0lnr3cip0fwhw     ip-172-31-28-204.ec2.internal   Ready               Active              \nk2aprr08b3q28nvze9uv26821     ip-172-31-39-252.ec2.internal   Ready               Active              \nrb6rju2eln0bn80z7lqocjkuy *   ip-172-31-46-94.ec2.internal    Ready               Active              Reachable\n```\n\n== Multi-container application to multi-host\n\nUse the link:ch05-compose.adoc#configuration-file[Compose file] to deploy a multi-container application to this Docker cluster. This will deploy a multi-container application to multiple hosts.\n\nCreate a new directory and `cd` to it:\n\n    mkdir webapp\n    cd webapp\n\nCreate a new Compose definition `docker-compose.yml` using the configuration file from https://github.com/docker/labs/blob/master/developer-tools/java/chapters/ch05-compose.adoc#configuration-file.\n\nThe command is:\n\n```\ndocker -H localhost:2374 stack deploy --compose-file=docker-compose.yml webapp\n```\n\nThe output is:\n\n```\nIgnoring deprecated options:\n\ncontainer_name: Setting the container name is not supported.\n\nCreating network webapp_default\nCreating service webapp_web\nCreating service webapp_db\n```\n\nWildFly Swarm and MySQL services are started on this cluster. Each service has a single container. A new overlay network is created. This allows multiple containers on different hosts to communicate with each other.\n\n== Verify service and containers in application\n\nVerify that the WildFly and Couchbase services are running using `docker -H localhost:2374 service ls`:\n\n```\nID                  NAME                MODE                REPLICAS            IMAGE                                   PORTS\nq4d578ime45e        webapp_db           replicated          1/1                 mysql:8                                 *:3306->3306/tcp\nqt5qrzp1jpyq        webapp_web          replicated          1/1                 arungupta/docker-javaee:dockerconeu17   *:8080->8080/tcp,*:9990->9990/tcp\n```\n\n`REPLICAS` colum shows that one of one replica for the container is running for each service. It might take a few minutes for the service to be running as the image needs to be downloaded on the host where the container is started.\n\nLet's find out which node the services are running. Do this for the web application first:\n\n```\ndocker -H localhost:2374 service ps webapp_web\nID                  NAME                IMAGE                                   NODE                            DESIRED STATE       CURRENT STATE         ERROR               PORTS\nnpmunk4ll9f4        webapp_web.1        arungupta/docker-javaee:dockerconeu17   ip-172-31-39-252.ec2.internal   Running             Running 2 hours ago\n```\n\nThe `NODE` column shows the internal IP address of the node where this service is running.\n\nNow, do this for the database:\n\n```\ndocker -H localhost:2374 service ps webapp_db\nID                  NAME                IMAGE               NODE                           DESIRED STATE       CURRENT STATE         ERROR               PORTS\nvzaji4xdi2qh        webapp_db.1         mysql:8             ip-172-31-17-74.ec2.internal   Running             Running 2 hours ago   \n```\n\nThe `NODE` column for this service shows that the service is running on a different node.\n\nMore details about the service can be obtained using `docker -H localhost:2374 service inspect webapp_web`:\n\n```\n[\n    {\n        \"ID\": \"qt5qrzp1jpyq1ur7qhg55ijf1\",\n        \"Version\": {\n            \"Index\": 58\n        },\n        \"CreatedAt\": \"2017-10-07T01:09:32.519975146Z\",\n        \"UpdatedAt\": \"2017-10-07T01:09:32.535587602Z\",\n        \"Spec\": {\n            \"Name\": \"webapp_web\",\n            \"Labels\": {\n                \"com.docker.stack.image\": \"arungupta/docker-javaee:dockerconeu17\",\n                \"com.docker.stack.namespace\": \"webapp\"\n            },\n            \"TaskTemplate\": {\n                \"ContainerSpec\": {\n                    \"Image\": \"arungupta/docker-javaee:dockerconeu17@sha256:6a403c35d2ab4442f029849207068eadd8180c67e2166478bc3294adbf578251\",\n                    \"Labels\": {\n                        \"com.docker.stack.namespace\": \"webapp\"\n                    },\n                    \"Privileges\": {\n                        \"CredentialSpec\": null,\n                        \"SELinuxContext\": null\n                    },\n                    \"StopGracePeriod\": 10000000000,\n                    \"DNSConfig\": {}\n                },\n                \"Resources\": {},\n                \"RestartPolicy\": {\n                    \"Condition\": \"any\",\n                    \"Delay\": 5000000000,\n                    \"MaxAttempts\": 0\n                },\n                \"Placement\": {\n                    \"Platforms\": [\n                        {\n                            \"Architecture\": \"amd64\",\n                            \"OS\": \"linux\"\n                        }\n                    ]\n                },\n                \"Networks\": [\n                    {\n                        \"Target\": \"b0ig9m1qsjax95tp9m1i2m4yo\",\n                        \"Aliases\": [\n                            \"web\"\n                        ]\n                    }\n                ],\n                \"ForceUpdate\": 0,\n                \"Runtime\": \"container\"\n            },\n            \"Mode\": {\n                \"Replicated\": {\n                    \"Replicas\": 1\n                }\n            },\n            \"UpdateConfig\": {\n                \"Parallelism\": 1,\n                \"FailureAction\": \"pause\",\n                \"Monitor\": 5000000000,\n                \"MaxFailureRatio\": 0,\n                \"Order\": \"stop-first\"\n            },\n            \"RollbackConfig\": {\n                \"Parallelism\": 1,\n                \"FailureAction\": \"pause\",\n                \"Monitor\": 5000000000,\n                \"MaxFailureRatio\": 0,\n                \"Order\": \"stop-first\"\n            },\n            \"EndpointSpec\": {\n                \"Mode\": \"vip\",\n                \"Ports\": [\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 8080,\n                        \"PublishedPort\": 8080,\n                        \"PublishMode\": \"ingress\"\n                    },\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 9990,\n                        \"PublishedPort\": 9990,\n                        \"PublishMode\": \"ingress\"\n                    }\n                ]\n            }\n        },\n        \"Endpoint\": {\n            \"Spec\": {\n                \"Mode\": \"vip\",\n                \"Ports\": [\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 8080,\n                        \"PublishedPort\": 8080,\n                        \"PublishMode\": \"ingress\"\n                    },\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 9990,\n                        \"PublishedPort\": 9990,\n                        \"PublishMode\": \"ingress\"\n                    }\n                ]\n            },\n            \"Ports\": [\n                {\n                    \"Protocol\": \"tcp\",\n                    \"TargetPort\": 8080,\n                    \"PublishedPort\": 8080,\n                    \"PublishMode\": \"ingress\"\n                },\n                {\n                    \"Protocol\": \"tcp\",\n                    \"TargetPort\": 9990,\n                    \"PublishedPort\": 9990,\n                    \"PublishMode\": \"ingress\"\n                }\n            ],\n            \"VirtualIPs\": [\n                {\n                    \"NetworkID\": \"i41xh4kmuwl5vc47h536l3mxs\",\n                    \"Addr\": \"10.255.0.10/16\"\n                },\n                {\n                    \"NetworkID\": \"b0ig9m1qsjax95tp9m1i2m4yo\",\n                    \"Addr\": \"10.0.0.2/24\"\n                }\n            ]\n        }\n    }\n]\n```\n\nLogs for the service are redirected to CloudWatch and thus cannot be seen using `docker service logs`. This will be fixed with https://github.com/moby/moby/issues/30691[#30691]. Let's view the logs using using https://console.aws.amazon.com/cloudwatch/home?#logs:prefix=Docker[CloudWatch Logs].\n\n.CloudWatch log group\nimage::docker-aws-10.png[]\n\nSelect the log group:\n\n.CloudWatch log stream\nimage::docker-aws-11.png[]\n\nPick `webapp_web.xxx` log stream to see the log statements from WildFly Swarm:\n\n.CloudWatch application log stream\nimage::docker-aws-12.png[]\n\n== Access application\n\nApplication is accessed using manager's IP address and on port 8080. By default, the port 8080 is not open. \n\nIn https://console.aws.amazon.com/ec2/v2/home?#Instances:search=docker;sort=instanceState[EC2 Console], select an EC2 instance with name `Docker-Manager`, click on `Docker-Managerxxx` in `Security groups`. Click on `Inbound`, `Edit`, `Add Rule`, and create a rule to enable TCP traffic on port 8080.\n\n.Open port 8080 in Docker manager\nimage::docker-aws-13.png[]\n\nClick on `Save` to save the rules.\n\nNow, the application is accessible using the command `curl -v http://ec2-34-200-216-30.compute-1.amazonaws.com:8080/resources/employees` and shows output:\n\n```\n*   Trying 34.200.216.30...\n* TCP_NODELAY set\n* Connected to ec2-34-200-216-30.compute-1.amazonaws.com (34.200.216.30) port 8080 (#0)\n> GET /resources/employees HTTP/1.1\n> Host: ec2-34-200-216-30.compute-1.amazonaws.com:8080\n> User-Agent: curl/7.51.0\n> Accept: */*\n> \n< HTTP/1.1 200 OK\n< Connection: keep-alive\n< Content-Type: application/xml\n< Content-Length: 478\n< Date: Sat, 07 Oct 2017 02:53:11 GMT\n< \n* Curl_http_done: called premature == 0\n* Connection #0 to host ec2-34-200-216-30.compute-1.amazonaws.com left intact\n<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><collection><employee><id>1</id><name>Penny</name></employee><employee><id>2</id><name>Sheldon</name></employee><employee><id>3</id><name>Amy</name></employee><employee><id>4</id><name>Leonard</name></employee><employee><id>5</id><name>Bernadette</name></employee><employee><id>6</id><name>Raj</name></employee><employee><id>7</id><name>Howard</name></employee><employee><id>8</id><name>Priya</name></employee></collection>\n```\n\n== Shutdown application\n\nShutdown the application using the command `docker -H localhost:2374 stack rm webapp`:\n\n```\nRemoving service webapp_db\nRemoving service webapp_web\nRemoving network webapp_default\n```\n\nThis stops the container in each service and removes the services. It also deletes any networks that were created as part of this application.\n\n== Shutdown cluster\n\nDocker cluster can be shutdown by deleting the stack created by CloudFormation:\n\n.Delete CloudFormation template\nimage::docker-aws-14.png[]\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch08-azure.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Docker for Azure\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch08-cloud.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Docker Cloud\n\n== Key Concepts\n\nDocker Cloud is a SaaS that allows you to build, deploy and manage Docker containers in physical servers, virtual machine or cloud providers.\n\nThe main concepts of Docker Cloud are: \n\n- *Nodes* are individual Linux hosts/VMs used to deploy and run your applications. New nodes can be provisioned to increase the capacity. Docker Cloud does not provide hosting services. Nodes are provisioned using physical servers, virtual machine or cloud providers.\n- *Node Clusters* are logical groups of nodes of the same type. Node Clusters allow to scale the infrastructure easily by provisioning more nodes.\n- *Services* are logical groups of containers from the same image. Services make it simple to scale your application across different nodes.\n\nThis chapter will show how to use TomEE Docker image and deploy it using Docker Cloud CLI.\n\n=== Docker Cloud CLI\n\nInstall Docker Cloud CLI following the https://docs.docker.com/docker-cloud/installing-cli/[instructions].\n\n== Create new Docker Cloud Node\n\nCreate a new node cluster:\n\n[source, text]\n----\ndocker-cloud nodecluster create -t 1 --tag wildfly wildfly-node aws us-west-1 m3.large\n----\n\nThis node cluster has a single node (`-t 1`) and uses the tag \"`wildfly`\" (`--tag wildfly`). Last four parameters are nodecluster name (`couchbase-node`), provider (`aws`), region (`us-west-1`) and node type (`m3.large`).\n\nEach node in this node cluster will be given the assigned tag. This will be used later to assign services to a specific node or node cluster.\n\nDeploying a node can take a few minutes. Current status can also be seen https://cloud.docker.com/app/arungupta/nodecluster/list/1?page_size=10[Docker Cloud dashboard]:\n\nimage::docker-cloud-nodecluster.png[]\n\n== Create a new Docker Cloud Service\n\nCreate a Docker Cloud Service:\n\n[source, text]\n----\ndocker-cloud service create --name wildfly --tag wildfly -p 8080:8080 jboss/wildfly\n124aa470-4e44-4f19-b0f0-d0c2616510a7\n----\n\nhttps://cloud.docker.com/app/arungupta/service/list/1?name__icontains=wildfly&page=1&page_size=10[Docker Cloud dashboard] will look like:\n\nimage::docker-cloud-services.png[]\n\nStart the Service:\n\n[source, text]\n----\ndocker-cloud service start 124aa470-4e44-4f19-b0f0-d0c2616510a7\n----\n\nCheck the service logs:\n\n[source, text]\n----\ndocker-cloud service logs 124aa470-4e44-4f19-b0f0-d0c2616510a7\n----\n\nIt shows the output as:\n\n[source, text]\n----\nwildfly-1 | 2017-02-04T00:00:22.752881989Z =========================================================================\nwildfly-1 | 2017-02-04T00:00:22.752982683Z \nwildfly-1 | 2017-02-04T00:00:22.753058247Z   JBoss Bootstrap Environment\nwildfly-1 | 2017-02-04T00:00:22.753149954Z \nwildfly-1 | 2017-02-04T00:00:22.753228180Z   JBOSS_HOME: /opt/jboss/wildfly\nwildfly-1 | 2017-02-04T00:00:22.753313935Z \nwildfly-1 | 2017-02-04T00:00:22.753385039Z   JAVA: /usr/lib/jvm/java/bin/java\nwildfly-1 | 2017-02-04T00:00:22.753537123Z \nwildfly-1 | 2017-02-04T00:00:22.753926931Z   JAVA_OPTS:  -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true\n\n. . .\n\nwildfly-1 | 2017-02-04T00:00:28.062486850Z 00:00:28,062 INFO  [org.jboss.ws.common.management] (MSC service thread 1-2) JBWS022052: Starting JBossWS 5.1.5.Final (Apache CXF 3.1.6) \nwildfly-1 | 2017-02-04T00:00:28.360806943Z 00:00:28,359 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management\nwildfly-1 | 2017-02-04T00:00:28.361466490Z 00:00:28,360 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990\nwildfly-1 | 2017-02-04T00:00:28.362342136Z 00:00:28,361 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 5505ms - Started 331 of 577 services (393 services are lazy, passive or on-demand)\n----\n\n== Access WildFly Server in Docker Cloud\n\nInspect the Docker Cloud service for the exposed container ports:\n\n```\ndocker-cloud service inspect 124aa470-4e44-4f19-b0f0-d0c2616510a7 | jq \".container_ports\"\n```\n\nThis shows the output as:\n\n```\n[\n  {\n    \"protocol\": \"tcp\",\n    \"outer_port\": 8080,\n    \"inner_port\": 8080,\n    \"port_name\": \"http-alt\",\n    \"published\": true,\n    \"endpoint_uri\": \"http://wildfly.124aa470.svc.dockerapp.io:8080/\"\n  }\n]\n```\n\nAccess the main page of TomEE at http://wildfly.124aa470.svc.dockerapp.io:8080/ to see:\n\nimage::docker-cloud-wildfly.png[]\n\n== Terminate the Docker Cloud Service and Node\n\nCheck the list of Docker Cloud services running using the command `docker-cloud service ps`:\n\n```\nNAME     UUID      STATUS       #CONTAINERS  IMAGE                 DEPLOYED       PUBLIC DNS                           STACK\nwildfly  124aa470  ▶ Running              1  jboss/wildfly:latest  7 minutes ago  wildfly.124aa470.svc.dockerapp.io\n```\n\nUse the UUID to terminate the service:\n\n[source, text]\n----\ndocker-cloud service terminate 124aa470\n----\n\nCheck the list of nodes using `docker-cloud node ls` command:\n\n```\nUUID      FQDN                                                    LASTSEEN        STATUS      CLUSTER       DOCKER_VER\n0240951d  0240951d-27b6-4295-8ff8-ea443d668765.node.dockerapp.io  28 seconds ago  ▶ Deployed  wildfly-node  1.11.2-cs5\n```\n\nTerminate the node as:\n\n```\ndocker-cloud node rm 0240951d\n```\n\nCheck the list of nodecluster using `docker-cloud nodecluster ls` command:\n\n```\nNAME          UUID      REGION     TYPE      DEPLOYED        STATUS           CURRENT#NODES    TARGET#NODES\nwildfly-node  fb2f6292  us-west-1  m3.large  23 minutes ago  Empty cluster                0               0\n```\n\nRemove the nodecluster as:\n\n```\ndocker-cloud nodecluster rm wildfly-node\n```\n\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch09-cicd.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= CI/CD using Docker\n\n*PURPOSE*: This chapter explains how to use Jenkins and Docker to run continuous integration and continuous delivery.\n\nThere are several possible approaches to run Docker builds with Jenkins:\n\n. Install Jenkins on your Docker host machine. Run Docker commands from your build, either using one of the several Jenkins Docker plugins, or by running Docker commands from a build step.\n. Install Jenkins on your host machine and have a Jenkins slave machine with Docker installed to run your Docker builds\n. Run Jenkins on Docker and use the underlying Docker installed on the host to run Docker commands.\n\nNOTE: Another option is running Jenkins on Docker and do a complete Docker installation inside the Jenkins Docker container. This technique is called Docker in Docker and it is usually a bad idea. There are several discussions about the problems with this approach, like this one: http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ . A better approach is using Docker outside of Docker, as explained here: http://container-solutions.com/running-docker-in-jenkins-in-docker/\n\n== Run Jenkins on Docker\n\nIn this example, we will run Jenkins on Docker and use the underlying Docker installed on the host to run Docker commands. This technique is known as Docker outside of Docker.\n\nFirst, clone the project:\n\n    git clone https://github.com/fabianenardon/jenkins-docker-demo\n\nThen, in the project folder, run:\n\n    docker-compose up\n\nNOTE: if running on Windows, run `dos2unix plugins.txt` before running `docker-compose up`, to avoid possible errors if your file is in the Windows format.\n\nWait for jenkins to start and then go to the browser and open `http://localhost:8081`. Jenkins should be running.\n\nThe Jenkins installation on this lab comes pre-configured. To login use the username `jenkins` and the password `jenkins`.\n\n== Running integration tests Jenkins\n\nFor this Continuous Integration demo, we will run a simple application that saves data on MongoDB. We will then run integration tests to check if the data was correctly saved on the database.\n\nWhen running integration tests, you want to test your application in an environment as close to production as possible, so you can test interactions between the several components, services, databases, network communication, etc. Fortunately, docker can help you a lot with integration tests. There are several strategies to run integration tests, but in this application we are going to use the following:\n\n. Start the services with a `docker-compose.yml` file created for testing purposes. This file won't have any volumes mapped, so when the test is over, no state will be saved. The test `docker-compose.yml` file won't publish any port on the host machine, so we can run simultaneous tests.\n. Run the application, using the services started with the `docker-compose.yml` test file.\n. Run Maven integration tests to check if the application execution produced the expected results. This will be done by checking what was saved on the MongoDB database.\n. Stop the services. No state will be stored, so next time you run the integration tests, you will have a clean environment.\n\nCreate a new job on jenkins:\n\n. Select Freestyle project\n+\nimage::docker-ci-cd-01.png[]\n+\n. In Source Code Management, select Git and add the repository URL: `https://github.com/fabianenardon/mongo-docker-demo.git`\n+\nimage::docker-ci-cd-02.png[]\n+\n. In Build, select Add build step and select Execute shell\n+\nimage::docker-ci-cd-03.png[]\n+\n. In the shell Command, add these instructions:\n+\n[source, text]\n----\ncd sample\n\n# Generates the images\nsudo /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven/bin/mvn clean install -Papp-docker-image\n\n# Starts the mongo service. The -p option allows multiple builds to run at the same time, \n# since we can start multiple instances of the containers\nsudo docker-compose -p app-$BUILD_NUMBER --file src/test/resources/docker-compose.yml up -d mongo\n\n# Waits for containers to start\nsleep 30\n\n# Run the application\nsudo docker-compose -p app-$BUILD_NUMBER --file src/test/resources/docker-compose.yml \\\n     run mongo-docker-demo \\\n     java -jar /maven/jar/mongo-docker-demo-1.0-SNAPSHOT-jar-with-dependencies.jar mongo \n\n# Run the integration tests\nsudo docker-compose -p app-$BUILD_NUMBER --file src/test/resources/docker-compose.yml \\\n     run mongo-docker-demo-tests \\\n     mvn -f /maven/code/pom.xml -Dmaven.repo.local=/m2/repository \\\n     -Pintegration-test verify \n----\n+\n. Click on Add post-build action and select Execute a set of scripts\n+\nimage::docker-ci-cd-04.png[]\n+\n. In Post-build Actions, select Execute shell\n+\nimage::docker-ci-cd-05.png[]\n+\n. In the Command box, add:\n+\n[source, text]\n----\ncd sample\nsudo docker-compose -p app-$BUILD_NUMBER --file src/test/resources/docker-compose.yml down\n----\n+\n. Uncheck the `Execute script only if build succeeds` and `Execute script only if build fails` options, so this script will run always when the build ends. This way, we make sure to always stop the services.\n+\n[NOTE]\n====\n. The `-p app-$BUILD_NUMBER` option allows multiple builds to run at the same time, since we can start multiple instances of the containers. We are using Jenkins $BUILD_NUMBER variable to isolate the containers. This way, each set of services will run on its own network.\n. We are running the commands with sudo because we are actually running the Docker socket on the host. Jenkins runs with the jenkins user and we added the jenkins user to the sudoers list in our image. Obviously, this can have security consequences in a production environment, since one could create a build that would access root level services on the host. You can avoid this by configuring the jenkins user on the host, so it will have access to the Docker socket and then run the commands without sudo.\n====\n+\n. Save the build and then click on `Build now` to run it. You should see a progress bar when the build is running. You can click on the progress bar to see the build console output.\n+\nimage::docker-ci-cd-06.png[]\n+\n. If the build is successful, you should see this on the build console output:\n+\nimage::docker-ci-cd-07.png[]\n\n== Run integration tests outside Jenkins\n\nWhen creating integration tests, it is useful to be able to run and debug them outside Jenkins. In order to do that, you can simply run the same commands you ran in the Jenkins build:\n\n[source, text]\n----\ncd jenkins_home/workspace/ci-test/sample\n\n# Generates the images\nmvn -f pom.xml clean install -Papp-docker-image\n\n# Starts mongo service\ndocker-compose --file src/test/resources/docker-compose.yml up -d mongo \n\n# Waits for services do start\nsleep 30\n\n# Run our application\ndocker-compose --file src/test/resources/docker-compose.yml \\\n               run mongo-docker-demo \\\n               java -jar /maven/jar/mongo-docker-demo-1.0-SNAPSHOT-jar-with-dependencies.jar mongo \n\n# Run our integration tests\ndocker-compose --file src/test/resources/docker-compose.yml \\\n               run mongo-docker-demo-tests mvn -f /maven/code/pom.xml \\\n               -Dmaven.repo.local=/m2/repository -Pintegration-test verify \n\n# Stop all the services\ndocker-compose --file src/test/resources/docker-compose.yml down\n----\n\n== Debug integration tests outside Jenkins\n\nYou can debug integration tests. This can be achieved by making your test wait for a connection at a port for debugging. You can then attach your IDE to this port and debug. The source code for this project is available at https://github.com/fabianenardon/mongo-docker-demo.git.\n\nYou need to start Mongo service and run the application again as shown in previous section.\n\nHere is how you can debug tests in NetBeans:\n\n. Run the integration tests in debug mode with the command shown below:\n+\n```\n# Run integration tests in debug mode\ndocker run -v ~/.m2/repository:/m2/repository \\\n       -p 5005:5005 --link mongo:mongo \\\n       --net resources_default mongo-docker-demo-tests \\\n       mvn -f /maven/code/pom.xml \\\n       -Dmaven.repo.local=/m2/repository \\\n       -Pintegration-test verify -Dmaven.failsafe.debug\n```\n+\nThis command will wait for a connection at port 5005 for debugger.\n+\n. Open the project in NetBeans and setup breakpoint in your test code:\n+\nimage::docker-ci-cd-08.png[]\n+\n. Use `Debug` menu item to attach the debugger:\n+\nimage::docker-ci-cd-09.png[]\n+\n. Attach the debugger by specifying the correct value of `host` and `port`:\n+\nimage::docker-ci-cd-10.png[]\n+\n. Hit a breakpoint in tests:\n+\nimage::docker-ci-cd-11.png[]\n\n== Continuous delivery with Jenkins\n\nContinuous Delivery strategies depend greatly on the application architecture. With a dockerized application like the one in our demo, the continuous delivery strategy could be to publish a new version of the application image if the tests passed. This way, next time the application runs on production, the new image will be downloaded and automatically deployed. You can publish images with Jenkins just like you invoked all the other docker commands in the build.\n\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch10-monitoring.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Monitoring Docker Containers\n\nThis chapter will cover different ways to monitor a Docker container.\n\n== Docker CLI\n\n`docker container stats` command displays a live stream of container(s) runtime metrics. The command supports CPU, memory usage, memory limit, and network IO metrics.\n\n. Start a container: `docker container run --name web -d jboss/wildfly:10.1.0.Final`\n. Check the container stats using `docker container stats web`. It shows the output as:\n+\n```\nCONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS\nweb                 0.14%               274.9MiB / 1.952GiB   13.75%              828B / 0B           96.7MB / 4.1kB      53\n```\n+\nThe output is continually updated. It shows:\n+\n.. Container name\n.. Percent CPU utilization\n.. Total memory usage vs amount available to the container\n.. Percent memory utilization\n.. Network activity\n.. Disk activity\n.. PIDS??\n+\n. Check stats for multiple containers\n.. Terminate single instance of the container\n+\n```\ndocker container stop web\ndocker container rm web\n```\n+\n.. Create a service with multiple replicas of the container\n+\n```\ndocker swarm init\ndocker service create --name=web jboss/wildfly\n```\n+\n.. Now check the stats again:\n+\n```\ndocker stats\n```\n+\nto see the output:\n+\n```\nCONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS\n1f9d5a1c08a8        0.24%               294.9MiB / 1.952GiB   14.75%              828B / 0B           96.5MB / 4.1kB      115\n```\n+\nNote that the container id is shown instead of container's name in this case.\n+\n. Scale the service to 3 replicas:\n+\n```\ndocker service scale web=3\n```\n+\n. The stats are now shown for all three containers:\n+\n```\nCONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS\n1f9d5a1c08a8        0.14%               287.8MiB / 1.952GiB   14.40%              1.03kB / 0B         96.5MB / 4.1kB      53\na3395efbb6ff        0.77%               263.4MiB / 1.952GiB   13.18%              578B / 0B           0B / 4.1kB          114\nf484ff2f4c12        0.06%               294.8MiB / 1.952GiB   14.75%              578B / 0B           0B / 4.1kB          114\n```\n+\n. Display only container id and percent CPU utilization using the command `docker container stats --format \"{{.Container}}: {{.CPUPerc}}\"`:\n+\n```\n55198043b6aa: 0.10%\n5b5dd33b675d: 0.11%\n6e98a9597e6a: 0.10%\n```\n+\n. Format the output in a table. The results should include container name, percent CPU utilization and percent memory utilization. This can be achieved using the command:\n+\n```\ndocker container stats --format \"table {{.Name}}\\t{{.CPUPerc}}\\t{{.MemUsage}}\"\n```\n+\nIt shows the output:\n+\n```\nNAME                              CPU %               MEM USAGE / LIMIT\nweb.2.1ic0vevvvu2nwwyc6css58ref   0.10%               267.5MiB / 1.952GiB\nweb.3.pwcgr58s1xo28gwa1znlrn2s3   0.11%               274.7MiB / 1.952GiB\nweb.1.bg1dcwagl9tzz0azuegxzoys8   0.12%               274MiB / 1.952GiB\n```\n+\n. Display only the first result using the command `docker container stats --no-stream`:\n+\n```\nCONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS\n55198043b6aa        0.12%               267.5MiB / 1.952GiB   13.39%              1.44kB / 0B         0B / 4.1kB          51\n5b5dd33b675d        0.07%               274.7MiB / 1.952GiB   13.75%              1.51kB / 0B         0B / 4.1kB          51\n6e98a9597e6a        0.26%               274.1MiB / 1.952GiB   13.71%              1.69kB / 0B         0B / 4.1kB          51\n```\n\n== Docker Remote API\n\nDocker Remote API provides a lot more details about the health of the container. It can be invoked using the following format:\n\n    curl --unix-socket /var/run/docker.sock http://localhost/containers/<name>/stats\n\nOn Docker for Mac, enabling remote HTTP API still requires a few steps. So this command uses the `--unix-socket` option to invoke the Remote API.\n\nA specific invocation for a container can be done as:\n\n    curl --unix-socket /var/run/docker.sock http://localhost/containers/web.1.bg1dcwagl9tzz0azuegxzoys8/stats\n\nNote, the container name is from the previous run of the service. It will show the output:\n\n```\n{\"read\":\"2017-10-13T14:08:38.045217731Z\",\"preread\":\"0001-01-01T00:00:00Z\",\"pids_stats\":{\"current\":51},\"blkio_stats\":{\"io_service_bytes_recursive\":[{\"major\":8,\"minor\":0,\"op\":\"Read\",\"value\":0},{\"major\":8,\"minor\":0,\"op\":\"Write\",\"value\":4096},{\"major\":8,\"minor\":0,\"op\":\"Sync\",\"value\":0},{\"major\":8,\"minor\":0,\"op\":\"Async\",\"value\":4096},{\"major\":8,\"minor\":0,\"op\":\"Total\",\"value\":4096}],\"io_serviced_recursive\":[{\"major\":8,\"minor\":0,\"op\":\"Read\",\"value\":0},{\"major\":8,\"minor\":0,\"op\":\"Write\",\"value\":1},{\"major\":8,\"minor\":0,\"op\":\"Sync\",\"value\":0},{\"major\":8,\"minor\":0,\"op\":\"Async\",\"value\":1},{\"major\":8,\"minor\":0,\"op\":\"Total\",\"value\":1}],\"io_queue_recursive\":[],\"io_service_time_recursive\":[],\"io_wait_time_recursive\":[],\"io_merged_recursive\":[],\"io_time_recursive\":[],\"sectors_recursive\":[]},\"num_procs\":0,\"storage_stats\":{},\"cpu_stats\":{\"cpu_usage\":{\"total_usage\":11130296115,\"percpu_usage\":[2687118654,3014514615,2971860160,2456802686],\"usage_in_kernelmode\":2700000000,\"usage_in_usermode\":7630000000},\"system_cpu_usage\":952826800000000,\"online_cpus\":4,\"throttling_data\":{\"periods\":0,\"throttled_periods\":0,\"throttled_time\":0}},\"precpu_stats\":{\"cpu_usage\":{\"total_usage\":0,\"usage_in_kernelmode\":0,\"usage_in_usermode\":0},\"throttling_data\":{\"periods\":0,\"throttled_periods\":0,\"throttled_time\":0}},\"memory_stats\":{\"usage\":288051200,\"max_usage\":297189376,\"stats\":{\"active_anon\":283893760,\"active_file\":0,\"cache\":135168,\"dirty\":16384,\"hierarchical_memory_limit\":9223372036854771712,\"hierarchical_memsw_limit\":9223372036854771712,\"inactive_anon\":0,\"inactive_file\":135168,\"mapped_file\":32768,\"pgfault\":83204,\"pgmajfault\":0,\"pgpgin\":78441,\"pgpgout\":9093,\"rss\":283914240,\"rss_huge\":0,\"swap\":0,\"total_active_anon\":283893760,\"total_active_file\":0,\"total_cache\":135168,\"total_dirty\":16384,\"total_inactive_anon\":0,\"total_inactive_file\":135168,\"total_mapped_file\":32768,\"total_pgfault\":83204,\"total_pgmajfault\":0,\"total_pgpgin\":78441,\"total_pgpgout\":9093,\"total_rss\":283914240,\"total_rss_huge\":0,\"total_swap\":0,\"total_unevictable\":0,\"total_writeback\":0,\"unevictable\":0,\"writeback\":0},\"limit\":2095874048},\"name\":\"/web.1.bg1dcwagl9tzz0azuegxzoys8\",\"id\":\"6e98a9597e6af085e73a4d211fff9a164aa012727a46525d4fbaa164b572e23f\",\"networks\":{\"eth0\":{\"rx_bytes\":1882,\"rx_packets\":37,\"rx_errors\":0,\"rx_dropped\":0,\"tx_bytes\":0,\"tx_packets\":0,\"tx_errors\":0,\"tx_dropped\":0}}}\n```\n\nAs you can see, far more details about container's health are shown here. These stats are refereshed every one second. The continuous refresh of metrics can be terminated using `Ctrl + C`.\n\n== Docker Events\n\n`docker system events` provide real time events for the Docker host.\n\n. In one terminal (T1), type `docker system events`. The command does not show output and waits for any event worth reporting to occur. The list of events is listed at https://docs.docker.com/engine/reference/commandline/events/#/extended-description.\n. In a new terminal (T2), kill existing container using `docker service scale web=2`.\n. T1 shows the updated list of events as:\n+\n```\n2017-10-13T07:12:00.223791013-07:00 service update r4i0x8ujnn2q8osj8dowgvw72 (name=web, replicas.new=2, replicas.old=3)\n2017-10-13T07:12:00.332724880-07:00 container kill 5b5dd33b675d3b6be3e6aaf0ecde928b3ac882b0a221ff71e57c86faae8181ab (build-date=20170911, com.docker.swarm.node.id=wgujclh0492kkszpil81d3ugb, com.docker.swarm.service.id=r4i0x8ujnn2q8osj8dowgvw72, com.docker.swarm.service.name=web, com.docker.swarm.task=, com.docker.swarm.task.id=pwcgr58s1xo28gwa1znlrn2s3, com.docker.swarm.task.name=web.3.pwcgr58s1xo28gwa1znlrn2s3, image=jboss/wildfly:latest@sha256:d3af084d024753e4799809c10cd188f675a5b254a8e279b34709035b95d27dc7, license=GPLv2, name=web.3.pwcgr58s1xo28gwa1znlrn2s3, signal=15, vendor=CentOS)\n2017-10-13T07:12:00.613143701-07:00 container die 5b5dd33b675d3b6be3e6aaf0ecde928b3ac882b0a221ff71e57c86faae8181ab (build-date=20170911, com.docker.swarm.node.id=wgujclh0492kkszpil81d3ugb, com.docker.swarm.service.id=r4i0x8ujnn2q8osj8dowgvw72, com.docker.swarm.service.name=web, com.docker.swarm.task=, com.docker.swarm.task.id=pwcgr58s1xo28gwa1znlrn2s3, com.docker.swarm.task.name=web.3.pwcgr58s1xo28gwa1znlrn2s3, exitCode=0, image=jboss/wildfly:latest@sha256:d3af084d024753e4799809c10cd188f675a5b254a8e279b34709035b95d27dc7, license=GPLv2, name=web.3.pwcgr58s1xo28gwa1znlrn2s3, vendor=CentOS)\n2017-10-13T07:12:00.897831488-07:00 network disconnect 8f8e6ce771d6db6065f2472a7e83612ff6a657de3b6d08dab0617b8a596234fa (container=5b5dd33b675d3b6be3e6aaf0ecde928b3ac882b0a221ff71e57c86faae8181ab, name=bridge, type=bridge)\n2017-10-13T07:12:01.017523717-07:00 container stop 5b5dd33b675d3b6be3e6aaf0ecde928b3ac882b0a221ff71e57c86faae8181ab (build-date=20170911, com.docker.swarm.node.id=wgujclh0492kkszpil81d3ugb, com.docker.swarm.service.id=r4i0x8ujnn2q8osj8dowgvw72, com.docker.swarm.service.name=web, com.docker.swarm.task=, com.docker.swarm.task.id=pwcgr58s1xo28gwa1znlrn2s3, com.docker.swarm.task.name=web.3.pwcgr58s1xo28gwa1znlrn2s3, image=jboss/wildfly:latest@sha256:d3af084d024753e4799809c10cd188f675a5b254a8e279b34709035b95d27dc7, license=GPLv2, name=web.3.pwcgr58s1xo28gwa1znlrn2s3, vendor=CentOS)\n2017-10-13T07:12:01.023414108-07:00 container destroy 5b5dd33b675d3b6be3e6aaf0ecde928b3ac882b0a221ff71e57c86faae8181ab (build-date=20170911, com.docker.swarm.node.id=wgujclh0492kkszpil81d3ugb, com.docker.swarm.service.id=r4i0x8ujnn2q8osj8dowgvw72, com.docker.swarm.service.name=web, com.docker.swarm.task=, com.docker.swarm.task.id=pwcgr58s1xo28gwa1znlrn2s3, com.docker.swarm.task.name=web.3.pwcgr58s1xo28gwa1znlrn2s3, image=jboss/wildfly:latest@sha256:d3af084d024753e4799809c10cd188f675a5b254a8e279b34709035b95d27dc7, license=GPLv2, name=web.3.pwcgr58s1xo28gwa1znlrn2s3, vendor=CentOS)\n```\n+\nThe output shows a list of events, one in each line. The events shown here are `container kill`, `container die`, `network disconnect`, `container stop`, and `container destroy`. Date and timestamp for each event is displayed at the beginning of the line. Other event specific information is displayed as well.\n+\n. In T2, scale the service back to 3 replicas: `docker service scale web=3`\n. The output in T1 is updated to show:\n+\n```\n2017-10-13T07:13:47.161848609-07:00 service update r4i0x8ujnn2q8osj8dowgvw72 (name=web, replicas.new=3, replicas.old=2)\n2017-10-13T07:13:47.429074382-07:00 container create 0574d1fd74bef2e6fc54174e1fbeda25efd7ed270dce1d6dbede4ead19c7c485 (build-date=20170911, com.docker.swarm.node.id=wgujclh0492kkszpil81d3ugb, com.docker.swarm.service.id=r4i0x8ujnn2q8osj8dowgvw72, com.docker.swarm.service.name=web, com.docker.swarm.task=, com.docker.swarm.task.id=xcmylcwlag5vot4tp3l5z6oam, com.docker.swarm.task.name=web.3.xcmylcwlag5vot4tp3l5z6oam, image=jboss/wildfly:latest@sha256:d3af084d024753e4799809c10cd188f675a5b254a8e279b34709035b95d27dc7, license=GPLv2, name=web.3.xcmylcwlag5vot4tp3l5z6oam, vendor=CentOS)\n2017-10-13T07:13:47.445010259-07:00 network connect 8f8e6ce771d6db6065f2472a7e83612ff6a657de3b6d08dab0617b8a596234fa (container=0574d1fd74bef2e6fc54174e1fbeda25efd7ed270dce1d6dbede4ead19c7c485, name=bridge, type=bridge)\n2017-10-13T07:13:47.778855117-07:00 container start 0574d1fd74bef2e6fc54174e1fbeda25efd7ed270dce1d6dbede4ead19c7c485 (build-date=20170911, com.docker.swarm.node.id=wgujclh0492kkszpil81d3ugb, com.docker.swarm.service.id=r4i0x8ujnn2q8osj8dowgvw72, com.docker.swarm.service.name=web, com.docker.swarm.task=, com.docker.swarm.task.id=xcmylcwlag5vot4tp3l5z6oam, com.docker.swarm.task.name=web.3.xcmylcwlag5vot4tp3l5z6oam, image=jboss/wildfly:latest@sha256:d3af084d024753e4799809c10cd188f675a5b254a8e279b34709035b95d27dc7, license=GPLv2, name=web.3.xcmylcwlag5vot4tp3l5z6oam, vendor=CentOS)\n```\n+\nThe list of events shown here are `container create`, `network connect`, and `container start`.\n\n=== Use filters\n\nThe list of events can be restricted by filters specified using `--filter` or `-f` option. The currently supported filters are:\n\n. container (`container=<name or id>`)\n. daemon (`daemon=<name or id>`)\n. event (`event=<event action>`)\n. image (`image=<tag or id>`)\n. label (`label=<key>` or `label=<key>=<value>`)\n. network (`network=<name or id>`)\n. plugin (`plugin=<name or id>`)\n. type (`type=<container or image or volume or network or daemon>`)\n. volume (`volume=<name or id>`)\n\nLet's look at the list of running containers first using `docker container ls`, and then learn how to apply these filters.\n\nHere is the list of running containers from the service:\n\n```\nCONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES\n074447f26452        jboss/wildfly:latest   \"/opt/jboss/wildfl...\"   3 minutes ago       Up 3 minutes        8080/tcp            web.1.ytyv0gqi7dzxtetssrlsgvvbu\n0574d1fd74be        jboss/wildfly:latest   \"/opt/jboss/wildfl...\"   8 minutes ago       Up 8 minutes        8080/tcp            web.3.xcmylcwlag5vot4tp3l5z6oam\n55198043b6aa        jboss/wildfly:latest   \"/opt/jboss/wildfl...\"   25 minutes ago      Up 25 minutes       8080/tcp            web.2.1ic0vevvvu2nwwyc6css58ref\n```\n\nLet's apply the filters.\n\n. Show events for a container by name\n.. In T1, give the command to listen to a specific container as:\n+\n```\ndocker system events -f container=web.1.ytyv0gqi7dzxtetssrlsgvvbu\n```\n+\nYou may have to terminate previous run of `docker system events` using `Ctrl` + `C` to give this new command. \n+\n.. In T2, terminate the second replica of the service as `docker container rm -f web.2.1ic0vevvvu2nwwyc6css58ref`. \n.. T1 does not show any events because its only listening for events from the first replica of the service.\n. Show events for an event\n.. In T1, give the command `docker system events -f event=create`.\n.. In T2, scale the service by one more replica:\n+\n```\ndocker service scale web=4\n```\n.. T1 shows the event for container creation\n+\n```\n2017-10-13T07:24:22.971050949-07:00 container create 84e4604ffd983cfcc53ad619b4c11156518834fe23e4a0a8b299905b978a0022 (build-date=20170911, com.docker.swarm.node.id=wgujclh0492kkszpil81d3ugb, com.docker.swarm.service.id=r4i0x8ujnn2q8osj8dowgvw72, com.docker.swarm.service.name=web, com.docker.swarm.task=, com.docker.swarm.task.id=38unfmcsxmnvr844gysn28lwa, com.docker.swarm.task.name=web.4.38unfmcsxmnvr844gysn28lwa, image=jboss/wildfly:latest@sha256:d3af084d024753e4799809c10cd188f675a5b254a8e279b34709035b95d27dc7, license=GPLv2, name=web.4.38unfmcsxmnvr844gysn28lwa, vendor=CentOS)\n```\n+\nThis is accurate as a new container is created and the event is shown in T1 console.\n.. In T2, scale the service back to 2 using the command `docker servie scale web=2`\n.. T1 does not show any additional events because its only looking for create events\n.. More samples are explained at https://docs.docker.com/engine/reference/commandline/events/#/filter-events-by-criteria.\n\n== Prometheus\n\nhttps://prometheus.io/[Prometheus] is an open-source systems monitoring and alerting toolkit. Prometheus collects metrics from monitored targets by scraping metrics from HTTP endpoints on these targets. Docker instance can be configured as Prometheus target.\n\nDifferent targets to scrape are defined in the https://prometheus.io/docs/operating/configuration/[Prometheus configuration file]. Targets may be statically configured via the `static_configs` parameter in the configuration fle or dynamically discovered using one of the supported service-discovery mechanisms (Consul, DNS, Etcd, etc.).\n\nPrometheus collects metrics from monitored targets by scraping metrics from HTTP endpoints on these targets. Since Prometheus also exposes data in the same manner about itself, it can also scrape and monitor its own health.\n\n=== Docker metrics for Prometheus\n\nDocker exposes Prometheus-compatible metrics on port `9323`. This support is only available as an experimental feature.\n\n. For Docker for Mac, click on Docker icon in the status menu\n. Select `Preferences...`, `Daemon`, `Advanced` tab\n. Update daemon settings:\n+\n```\n{\n  \"metrics-addr\" : \"0.0.0.0:9323\",\n  \"experimental\" : true\n}\n```\n+\n. Click on `Apply & Restart` to restart the daemon\n+\nimage::prometheus-metrics-config.png[]\n+\n. Show the complete list of metrics using `curl http://localhost:9323/metrics`\n. Show the list of engine metrics using `curl http://localhost:9323/metrics | grep engine`\n\n==== Start Prometheus\n\nIn this section, we'll start Prometheus and use it to scrape it's own health.\n\n. Create a new directory `prometheus` and change to that directory\n. Create a text file `prometheus.yml` and use the following content\n+\n```\n# A scrape configuration scraping a Node Exporter and the Prometheus server\n# itself.\nscrape_configs:\n  # Scrape Prometheus itself every 5 seconds.\n  - job_name: 'prometheus'\n    scrape_interval: 5s\n    static_configs:\n      - targets: ['localhost:9090']\n```\n+\nThis configuration file scrapes data from the Prometheus container which will be started subsequently on port 9090.\n+\n. Start a single-replica Prometheus service:\n+\n```\ndocker service create \\\n  --replicas 1 \\\n  --name metrics \\\n  --mount type=bind,source=`pwd`/prometheus.yml,destination=/etc/prometheus/prometheus.yml \\\n  --publish 9090:9090/tcp \\\n  prom/prometheus\n```\n+\nThis will start the Prometheus container on port 9090.\n+\n. Prometheus dashboard is at http://localhost:9090. Check the list of enabled targets at http://localhost:9090/targets (also accessible from `Status` -> `Targets` menu).\n+\nimage::prometheus-metrics-target.png[]\n+\nIt shows that the Prometheus endpoint is available for scraping.\n+\n. Click on `Graph` and click on `-insert metric at cursor-` to see the list of metrics available:\n+\nimage::prometheus-metrics1.png[]\n+\nThese are all the metrics published by the Prometheus endpoint.\n+\n. Choose `http_request_total` metrics, click on `Execute`\n+\nimage::prometheus-metrics2.png[]\n+\n. Switch from `Console` to `Graph`\n+\nimage::prometheus-metrics3.png[]\n+\n. Change the duration from `1h` to `5m`\n+\nimage::prometheus-metrics4.png[]\n+\n. Click on `Add Graph`, select a different metric, say `http_requests_duration_microseconds`, and click on `Execute`\n+\nimage::prometheus-metrics5.png[]\n+\n. Switch from `Console` to `Graph` and change the duration from `1h` to `5m`\n+\nimage::prometheus-metrics6.png[]\n+\n. Stop the container: `docker container rm -f metrics`\n\nMultiple graphs can be added this way.\n\n=== Node health\n\nIn this section, we'll start Prometheus node exporter that will publish machine metrics. Then we'll use Prometheus to scrape its health information about the node running Docker.\n\n==== Start Node Exporter\n\n. All containers need to use the same overlay network so that they can communicate with each other. Let's create an overlay network:\n+\n```\ndocker network create --driver overlay prom\n```\n+\n. Start Prometheus node exporter:\n+\n```\ndocker service create --name node \\\n --mode global \\\n --mount type=bind,source=/proc,target=/host/proc \\\n --mount type=bind,source=/sys,target=/host/sys \\\n --mount type=bind,source=/,target=/rootfs \\\n --network prom \\\n --publish 9100:9100 \\\n prom/node-exporter:v0.15.0 \\\n  --path.procfs /host/proc \\\n  --path.sysfs /host/sys \\\n  --collector.filesystem.ignored-mount-points \"^/(sys|proc|dev|host|etc)($|/)\"\n```\n+\nA few observations in this command:\n+\n.. This is started as a global service such that it is started on all nodes of the cluster.\n.. As explained in https://github.com/prometheus/node_exporter/issues/610, node exporter only works with host network on Mac OSX. This is not needed if you are running on Linux.\n.. It uses the overlay network previously created.\n.. It needs access to host's filesystems such that the metrics about the node can be published.\n\n==== Restart Prometheus\n\n. Update `prometheus.yml` to the following text:\n+\n```\nglobal:\n  scrape_interval: 10s\nscrape_configs:\n  - job_name: 'prometheus'\n    static_configs:\n      - targets:\n        - 'localhost:9090'\n  - job_name: 'node resources'\n    dns_sd_configs:\n      - names: ['tasks.node']\n        type: 'A'\n        port: 9100\n    params:\n      collect[]:\n        - cpu\n        - meminfo\n        - diskstats\n        - netdev\n        - netstat\n\n  - job_name: 'node storage'\n    scrape_interval: 1m\n    dns_sd_configs:\n      - names: ['tasks.node']\n        type: 'A'\n        port: 9100\n    params:\n      collect[]:\n        - filefd\n        - filesystem\n        - xfs\n```\n+\nA few observations:\n+\n.. DNS-based service discovery is used to discover the scraper for node-exporter. This is further explained at https://prometheus.io/docs/operating/configuration/#<dns_sd_config>[dns_sd_configs]. A record-based queries are used to discover the service.\n.. Two different jobs are created even though they are scraping from the same endpoint. This provides a more logical way to represent data.\n+\n. Terminate previously running Prometheus service:\n+\n```\ndocker service rm metrics\n```\n+\n. Restart the Prometheus service, this time using the overlay network, as:\n+\n```\ndocker service create \\\n  --replicas 1 \\\n  --name metrics \\\n  --network prom \\\n  --mount type=bind,source=`pwd`/prometheus.yml,destination=/etc/prometheus/prometheus.yml \\\n  --publish 9090:9090/tcp \\\n  prom/prometheus\n```\n\n==== Check metrics\n\n. Confirm that both the services have started:\n+\n```\nID                  NAME                MODE                REPLICAS            IMAGE                       PORTS\nlzl41s2i66jd        metrics             replicated          1/1                 prom/prometheus:latest      *:9090->9090/tcp\ndro3ncpyuchp        node                global              1/1                 prom/node-exporter:latest   \n```\n+\n. Confirm that all the targets are configured correctly at http://localhost:9090/targets[Prometheus dashboard]:\n+\nimage::prometheus-metrics-target2.png[]\n+\n. Now a lot more metrics, this time from the node, are also available:\n+\nimage::prometheus-metrics7.png[]\n+\nConsole output and graphs for all these metrics is now available:\n+\nimage::prometheus-metrics8.png[]\n+\nComplete list of metrics is available at https://github.com/prometheus/node_exporter.\n\n=== Query using PromQL (TODO)\n\nAdd some fun queries from https://prometheus.io/docs/querying/basics/.\n\n== cAdvisor\n\nhttps://github.com/google/cadvisor[cAdvisor] (Container Advisor) provides resource usage and performance characteristics running containers. Let's take a look on how cAdvisor can be used to get these metrics from containers.\n\n. Run `cAdvisor`\n+\n```\ndocker container run \\\n  --volume=/:/rootfs:ro \\\n  --volume=/var/run:/var/run:rw \\\n  --volume=/sys:/sys:ro \\\n  --volume=/var/lib/docker/:/var/lib/docker:ro \\\n  --publish=8080:8080 \\\n  --detach=true \\\n  --name=cadvisor \\\n  google/cadvisor:latest\n```\n+\n. Dashboard is available at http://localhost:8080\n+\nimage::cadvisor-default-dashboard.png[]\n+\n. A high-level CPU and Memory utilization is shown. More details about CPU, memory, network and filesystem usage is shown in the same page. CPU usage looks like as shown:\n+\nimage::cadvisor-cpu-snapshot.png[]\n+\n. All Docker containers are in `/docker` sub-container.\n+\nimage::cadvisor-docker-metrics.png[]\n+\nClick on any of the containers and see more details about the container.\n\ncAdvisor samples once a second and has historical data for only one minute. The data generated from https://github.com/google/cadvisor/blob/master/docs/storage/influxdb.md[cAdvisor can be exported to InfluxDB]. Optionally, you may use a Grafana front end to visualize the data as explained in https://www.brianchristner.io/how-to-setup-docker-monitoring/[How to setup Docker monitoring].\n\n=== Prometheus and cAdvisor\n\ncAdvisor also exposes container statistics as Prometheus metrics out of the box. By default, these metrics are served under the `/metrics` HTTP endpoint. Let's take a look at how these container metrics can be observed using Prometheus.\n\n. Terminate previously running cAdvisor:\n+\n```\ndocker container rm -f cadvisor\n```\n+\n. Start a new cAdvisor service, using the `prom` overlay network created earlier:\n+\n```\ndocker service create \\\n  --name cadvisor \\\n  --network prom \\\n  --mode global \\\n  --mount type=bind,source=/,target=/rootfs \\\n  --mount type=bind,source=/var/run,target=/var/run \\\n  --mount type=bind,source=/sys,target=/sys \\\n  --mount type=bind,source=/var/lib/docker,target=/var/lib/docker \\\n  google/cadvisor:latest\n```\n+\n. Terminate the previously running Prometheus service:\n+\n```\ndocker service rm metrics\n```\n+\n. The update `prometheus.yml` configuration file is:\n+\n```\nglobal:\n  scrape_interval: 10s\nscrape_configs:\n  - job_name: 'prometheus'\n    static_configs:\n      - targets:\n        - 'localhost:9090'\n\n  - job_name: 'node resources'\n    dns_sd_configs:\n      - names: ['tasks.node']\n        type: 'A'\n        port: 9100\n    params:\n      collect[]:\n        - cpu\n        - meminfo\n        - diskstats\n        - netdev\n        - netstat\n\n  - job_name: 'node storage'\n    scrape_interval: 1m\n    dns_sd_configs:\n      - names: ['tasks.node']\n        type: 'A'\n        port: 9100\n    params:\n      collect[]:\n        - filefd\n        - filesystem\n        - xfs\n\n  - job_name: 'cadvisor'\n    dns_sd_configs:\n      - names: ['tasks.cadvisor']\n        type: 'A'\n        port: 8080\n```\n+\n. Start the new Prometheus service\n+\n```\ndocker service create \\\n  --replicas 1 \\\n  --name metrics \\\n  --network prom \\\n  --mount type=bind,source=`pwd`/prometheus.yml,destination=/etc/prometheus/prometheus.yml \\\n  --publish 9090:9090/tcp \\\n  prom/prometheus\n```\n+\n. Confirm that all the targets are configured correctly at http://localhost:9090/targets[Prometheus dashboard]:\n+\nimage::prometheus-metrics-target3.png[]\n+\nNote, all four scrape endpoints are shown here.\n+\n. In Graphs, now, a lot more metrics, this time from cAdvisor, are also available:\n+\nimage::prometheus-metrics9.png[]\n+\nConsole output and graphs for all these metrics is now available:\n+\nimage::prometheus-metrics10.png[]\n+\nComplete list of metrics is available at https://github.com/google/cadvisor.\n\nHere is a basic query written using https://prometheus.io/docs/querying/basics/[PromQL] worth trying:\n\n```\nsum by (container_label_com_docker_swarm_node_id) (\n  irate(\n    container_cpu_usage_seconds_total{\n      container_label_com_docker_swarm_service_name=\"metrics\"\n      }[1m]\n  )\n)\n```\n\nThis shows the average amount of CPU used per minute by the service `metrics` aggregated over multiple CPUs. The graph will look as shown:\n\nimage::prometheus-metrics11.png[]\n\n\n== Monitor Java Applications\n\nThis section will explain how an existing Java application can be updated to publish metrics and monitored by Prometheus.\n\nPrometheus collects metrics from monitored targets by scraping metrics HTTP endpoints on these targets.\n\nAs discussed earlier, Prometheus collects metrics from monitored targets by scraping from an HTTP endpoint on these targets. By default, these metrics are expected to be published at `/metrics`. Any existing Java application can be updated to publish Prometheus-style metrics at this endpoint.\n\nAn link:ch05-compose.adoc#configuration-file[earlier chapter] explained a simple Java EE application that talks to a MySQL database. This application also publishes Prometheus-style metrics for the underlying JVM at `/metrics`. It also publishes application-specific metrics such as total number of times `GET /` and `GET /{id}` is called.\n\nThe complete set of JVM metrics are explained at https://github.com/prometheus/client_java. Refer to https://github.com/arun-gupta/docker-javaee/tree/master/employees/src/main/java/org/javaee/samples/employees/metrics for more details on how these metrics are enabled. \n\n=== Start Java application\n\n. Use the link:ch05-compose.adoc#configuration-file[Compose file] to deploy a simple the Java EE application. This will start WildFly Swarm application and MySQL database.\n+\n    docker stack deploy --compose-file=docker-compose.yml webapp\n+\nThis will create `webapp_default` overlay network, and start the `webapp_web` and `webapp_db` services.\n+\n. Verify the network:\n+\n```\n$ docker network ls\nNETWORK ID          NAME                DRIVER              SCOPE\nu6ybdaqx5h5y        webapp_default      overlay             swarm\n```\n+\nOther networks may be shown here as well.\n+\n. Verify the services:\n+\n```\n$ docker service ls\nID                  NAME                MODE                REPLICAS            IMAGE                            PORTS\nucztcpf1vw0a        webapp_db           replicated          1/1                 mysql:8                          *:3306->3306/tcp\njttfgvr09kre        webapp_web          replicated          1/1                 arungupta/docker-javaee:latest   *:8080->8080/tcp,*:9990->9990/tcp\n```\n+\n. Verify that the endpoint is accessible:\n+\n```\n$ curl http://localhost:8080/resources/employees\n<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><collection><employee><id>1</id><name>Penny</name></employee><employee><id>2</id><name>Sheldon</name></employee><employee><id>3</id><name>Amy</name></employee><employee><id>4</id><name>Leonard</name></employee><employee><id>5</id><name>Bernadette</name></employee><employee><id>6</id><name>Raj</name></employee><employee><id>7</id><name>Howard</name></employee><employee><id>8</id><name>Priya</name></employee></collection>\n```\n+\n. Access the metrics published by the endpoint using `curl http://localhost:8080/metrics` to see the output:\n+\n```\n# HELP jvm_info JVM version info\n# TYPE jvm_info gauge\njvm_info{version=\"1.8.0_141-8u141-b15-1~deb9u1-b15\",vendor=\"Oracle Corporation\",} 1.0\n# HELP jvm_gc_collection_seconds Time spent in a given JVM garbage collector in seconds.\n# TYPE jvm_gc_collection_seconds summary\njvm_gc_collection_seconds_count{gc=\"PS Scavenge\",} 25.0\njvm_gc_collection_seconds_sum{gc=\"PS Scavenge\",} 0.386\njvm_gc_collection_seconds_count{gc=\"PS MarkSweep\",} 6.0\njvm_gc_collection_seconds_sum{gc=\"PS MarkSweep\",} 0.546\n# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.\n# TYPE process_cpu_seconds_total counter\nprocess_cpu_seconds_total 25.5\n# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.\n# TYPE process_start_time_seconds gauge\nprocess_start_time_seconds 1.508056592419E9\n# HELP process_open_fds Number of open file descriptors.\n# TYPE process_open_fds gauge\nprocess_open_fds 499.0\n# HELP process_max_fds Maximum number of open file descriptors.\n# TYPE process_max_fds gauge\nprocess_max_fds 1048576.0\n# HELP process_virtual_memory_bytes Virtual memory size in bytes.\n# TYPE process_virtual_memory_bytes gauge\nprocess_virtual_memory_bytes 4.244393984E9\n# HELP process_resident_memory_bytes Resident memory size in bytes.\n# TYPE process_resident_memory_bytes gauge\nprocess_resident_memory_bytes 5.06601472E8\n# HELP jvm_classes_loaded The number of classes that are currently loaded in the JVM\n# TYPE jvm_classes_loaded gauge\njvm_classes_loaded 13096.0\n# HELP jvm_classes_loaded_total The total number of classes that have been loaded since the JVM has started execution\n# TYPE jvm_classes_loaded_total counter\njvm_classes_loaded_total 13096.0\n# HELP jvm_classes_unloaded_total The total number of classes that have been unloaded since the JVM has started execution\n# TYPE jvm_classes_unloaded_total counter\njvm_classes_unloaded_total 0.0\n# HELP jvm_threads_current Current thread count of a JVM\n# TYPE jvm_threads_current gauge\njvm_threads_current 60.0\n# HELP jvm_threads_daemon Daemon thread count of a JVM\n# TYPE jvm_threads_daemon gauge\njvm_threads_daemon 12.0\n# HELP jvm_threads_peak Peak thread count of a JVM\n# TYPE jvm_threads_peak gauge\njvm_threads_peak 67.0\n# HELP jvm_threads_started_total Started thread count of a JVM\n# TYPE jvm_threads_started_total counter\njvm_threads_started_total 93.0\n# HELP jvm_threads_deadlocked Cycles of JVM-threads that are in deadlock waiting to acquire object monitors or ownable synchronizers\n# TYPE jvm_threads_deadlocked gauge\njvm_threads_deadlocked 0.0\n# HELP jvm_threads_deadlocked_monitor Cycles of JVM-threads that are in deadlock waiting to acquire object monitors\n# TYPE jvm_threads_deadlocked_monitor gauge\njvm_threads_deadlocked_monitor 0.0\n# HELP jvm_memory_bytes_used Used bytes of a given JVM memory area.\n# TYPE jvm_memory_bytes_used gauge\njvm_memory_bytes_used{area=\"heap\",} 1.2072508E8\njvm_memory_bytes_used{area=\"nonheap\",} 9.3550048E7\n# HELP jvm_memory_bytes_committed Committed (bytes) of a given JVM memory area.\n# TYPE jvm_memory_bytes_committed gauge\njvm_memory_bytes_committed{area=\"heap\",} 2.69484032E8\njvm_memory_bytes_committed{area=\"nonheap\",} 1.0133504E8\n# HELP jvm_memory_bytes_max Max (bytes) of a given JVM memory area.\n# TYPE jvm_memory_bytes_max gauge\njvm_memory_bytes_max{area=\"heap\",} 4.66092032E8\njvm_memory_bytes_max{area=\"nonheap\",} -1.0\n# HELP jvm_memory_pool_bytes_used Used bytes of a given JVM memory pool.\n# TYPE jvm_memory_pool_bytes_used gauge\njvm_memory_pool_bytes_used{pool=\"Code Cache\",} 1.4589888E7\njvm_memory_pool_bytes_used{pool=\"Metaspace\",} 6.9998048E7\njvm_memory_pool_bytes_used{pool=\"Compressed Class Space\",} 8962112.0\njvm_memory_pool_bytes_used{pool=\"PS Eden Space\",} 2.3732032E7\njvm_memory_pool_bytes_used{pool=\"PS Survivor Space\",} 6073592.0\njvm_memory_pool_bytes_used{pool=\"PS Old Gen\",} 9.0919456E7\n# HELP jvm_memory_pool_bytes_committed Committed bytes of a given JVM memory pool.\n# TYPE jvm_memory_pool_bytes_committed gauge\njvm_memory_pool_bytes_committed{pool=\"Code Cache\",} 1.47456E7\njvm_memory_pool_bytes_committed{pool=\"Metaspace\",} 7.5800576E7\njvm_memory_pool_bytes_committed{pool=\"Compressed Class Space\",} 1.0788864E7\njvm_memory_pool_bytes_committed{pool=\"PS Eden Space\",} 9.2274688E7\njvm_memory_pool_bytes_committed{pool=\"PS Survivor Space\",} 3.8797312E7\njvm_memory_pool_bytes_committed{pool=\"PS Old Gen\",} 1.38412032E8\n# HELP jvm_memory_pool_bytes_max Max bytes of a given JVM memory pool.\n# TYPE jvm_memory_pool_bytes_max gauge\njvm_memory_pool_bytes_max{pool=\"Code Cache\",} 2.5165824E8\njvm_memory_pool_bytes_max{pool=\"Metaspace\",} -1.0\njvm_memory_pool_bytes_max{pool=\"Compressed Class Space\",} 1.073741824E9\njvm_memory_pool_bytes_max{pool=\"PS Eden Space\",} 9.699328E7\njvm_memory_pool_bytes_max{pool=\"PS Survivor Space\",} 3.8797312E7\njvm_memory_pool_bytes_max{pool=\"PS Old Gen\",} 3.49700096E8\n```\n+\nIt shows all the JVM metrics that are published by the https://github.com/prometheus/client_java[Prometheus JVM Client]. The metrics generated by the application are not shown yet. It requires for the application to be accessed first.\n\nLet's access the JVM metrics in Prometheus dashboard first, and then we'll access the app to show app-specific metrics.\n\n=== Start Prometheus service\n\n. Make sure to terminate any previously running Prometheus endpoints:\n+\n   docker service rm metrics\n+\n. Create a directory `prometheus` and change into that directory.\n. Create a text file `prometheus.yml` and add the following content:\n+\n```\nglobal:\n  scrape_interval: 10s\nscrape_configs:\n  - job_name: 'webapp'\n    dns_sd_configs:\n      - names: ['tasks.webapp_web']\n        type: 'A'\n        port: 8080\n```\n+\nThis defines the configuration for the HTTP endpoint that publishes Prometheus-style metrics from the Java application.\n+\n. Start Prometheus service:\n+\n```\ndocker service create \\\n  --replicas 1 \\\n  --network webapp_default \\\n  --name metrics \\\n  --mount type=bind,source=`pwd`/prometheus.yml,destination=/etc/prometheus/prometheus.yml \\\n  --publish 9090:9090 \\\n  prom/prometheus\n```\n+\nNote, this service is using the `webapp_default` overlay network that is created when the application stack was deployed.\n+\n. Access Prometheus dashboard at http://localhost:9090\n. Check the configured targets at http://localhost:9090/targets:\n+\nimage::prometheus-metrics-target4.png[]\n+\nIt shows that the application metrics HTTP endpoint is configured as a Prometheus target.\n\n=== View application metrics\n\n. On Prometheus dashboard, click on `-insert metric at cursor-` to see the list of metrics available:\n+\nimage::prometheus-metrics12.png[]\n+\nJVM metrics shown earlier are displayed here as well.\n+\n. Select `jvm_memory_pool_bytes_used` metric and click on `Execute` to view the metric.\n+\nimage::prometheus-metrics13.png[]\n+\n. Select `Graph` to view the graphical representation\n+\nimage::prometheus-metrics14.png[]\n+\n. Now access the application using `curl http://localhost:8080/resources/employees` a few times.\n. Refresh Prometheus dashboard and see the updated list of metrics:\n+\nimage::prometheus-metrics15.png[]\n+\nNote, `app*` and `requests*` that are generated by the application.\n+\n. Select `requests_get_all` metric and view the graph:\n+\nimage::prometheus-metrics16.png[]\n+\n. Access the application a few times using `curl http://localhost:8080/resources/employees/5` and then watch the `requests_get_one` metric.\n\n== Grafana\n\nhttps://github.com/grafana/grafana[Grafana] is an open source metric analytics & visualization suite. It supports many different storage backends, called as Data Source. Prometheus can be added as Grafana data source. It even provides support for runnning Prometheus queries from the Grafana dashboard as well. More details can be found in http://docs.grafana.org/features/datasources/prometheus/[Using Prometheus in Grafana].\n\n=== Start Grafana\n\nThis section will explain how to start Grafana, use Prometheus as the data source, and view some container metrics.\n\n. Start Grafana:\n+\n```\ndocker container run \\\n  -d \\\n  -p 3000:3000 \\\n  --name=grafana \\\n  -e \"GF_SECURITY_ADMIN_PASSWORD=secret\" \\\n  grafana/grafana\n```\n+\nUse the login name `admin` and password `secret`.\n+\nRead more details about different http://docs.grafana.org/installation/configuration/[configuration options].\n+\n. Access Grafana dashboard at http://localhost:3000. Use the login and password as credentials to see Grafana console.\n+\nimage::grafana-metrics1.png[]\n\n=== Add Prometheus as data source\n\n. Click the `Add data source` button in the top header.\n. Specify the parameters as shown:\n+\nimage::grafana-metrics2.png[]\n+\n. Click on `Add` to test and save the data source:\n+\nimage::grafana-metrics3.png[]\n+\nThe green bar indicates that the data source was added successfully.\n\n=== Create chart with Prometheus data source\n\n. Click on `Create your first dashboard`, save it and give it a name, say `Docker and Java dashboard`\n. Click on `Graph`, edit, under the `Metrics` tab, select your Prometheus data source.\n. Enter the following Prometheus query expressions in the query field. The graphs will referesh in a few seconds and will look like as shown:\n+\nimage::grafana-metrics4.png[]\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/chapters/ch11-bigdata.adoc",
    "content": ":toc:\n\n:imagesdir: images\n\n= Big Data Processing with Docker and Hadoop\n\n*PURPOSE*: This chapter explains how to use Docker to create a Hadoop cluster and a Big Data application in Java. It highlights several concepts like service scale, dynamic port allocation, container links, integration tests, debugging, etc.\n\nBig Data applications usually involve distributed processing using tools like Hadoop or Spark. These services can be scaled up, running with several nodes to support more parallelism. Running tools like Hadoop and Spark on Docker makes it easy to scale them up and down. This is very useful to simulate a cluster on development time and also to run integration tests before taking your application to production.\n\nThe application on this example reads a file, count how many words are on that file using a MapReduce job implemented on Hadoop and then saves the result on a MongoDB database. In order to do that, we will run a Hadoop cluster and a MongoDB server on Docker.\n\n[NOTE]\n====\nhttp://hadoop.apache.org/[Apache Hadoop] is an open-source software framework used for distributed storage and processing of big data sets using the MapReduce programming model. The core of Apache Hadoop consists of a storage part, known as Hadoop Distributed File System (HDFS), and a processing part which is a MapReduce programming model. Hadoop splits files into large blocks and distributes them across nodes in a cluster. It then transfers packaged code into nodes to process the data in parallel. The Hadoop framework itself is mostly written in Java.\n====\n\n== Clone the sample application\n\nClone the project at `https://github.com/fabianenardon/hadoop-docker-demo`\n\nInspect the `sample/docker/docker-compose.yml` file. It defines a MongoDB service and the services needed to run a Hadoop cluster. It also defines a service for our application. See how the services are linked together.\n\n== Build the application\n\n[source, text]\n----\ncd sample\nmvn clean install -Papp-docker-image\n----\n\nIn the command above, `-Papp-docker-image` will fire up the `app-docker-image` profile, defined in the application `pom.xml`. This profile will create a dockerized version of the application, creating two images:\n\n. `docker-hadoop-example`: docker image used to run the application\n. `docker-hadoop-example-tests`: docker image used to run integration tests\n\n== Start all the services\n\nGo to the `sample/docker` folder and start the services:\n\n    cd docker\n    docker-compose up -d\n\nSee the logs and wait until everything is up:\n\n    docker-compose logs -f\n\nHere is a sample output:\n\n```\nAttaching to docker_nodemanager_1, docker-hadoop-example, yarn, secondarynamenode, docker_datanode_1, namenode, mongo\ndocker-hadoop-example    | Usage: hdfs [--config confdir] [--loglevel loglevel] COMMAND\ndocker-hadoop-example    |        where COMMAND is one of:\n\n. . .\n\nnodemanager_1            | 17/10/11 18:26:27 INFO nodemanager.NodeManager: STARTUP_MSG: \ndocker-hadoop-example    |   zkfc                 run the ZK Failover Controller daemon\nnodemanager_1            | /************************************************************\ndocker-hadoop-example    |   datanode             run a DFS datanode\nnodemanager_1            | STARTUP_MSG: Starting NodeManager\ndocker-hadoop-example    |   dfsadmin             run a DFS admin client\ndatanode_1               | 17/10/11 18:26:25 INFO datanode.DataNode: STARTUP_MSG: \nnodemanager_1            | STARTUP_MSG:   host = db2d63621ba4/172.23.0.8\nnamenode                 | FORMATTING NAMENODE\n\n. . .\n\nsecondarynamenode        | STARTUP_MSG: Starting SecondaryNameNode\ndatanode_1               | STARTUP_MSG:   build = https://git-wip-us.apache.org/repos/asf/hadoop.git -r b165c4fe8a74265c792ce23f546c64604acf0e41; compiled by 'jenkins' on 2016-01-26T00:08Z\ndocker-hadoop-example    |   oev                  apply the offline edits viewer to an edits file\nnamenode                 | STARTUP_MSG:   build = https://git-wip-us.apache.org/repos/asf/hadoop.git -r b165c4fe8a74265c792ce23f546c64604acf0e41; compiled by 'jenkins' on 2016-01-26T00:08Z\nnodemanager_1            | 17/10/11 18:26:27 INFO nodemanager.NodeManager: registered UNIX signal handlers for [TERM, HUP, INT]\nsecondarynamenode        | STARTUP_MSG:   host = secondarynamenode/172.23.0.5\ndatanode_1               | STARTUP_MSG:   java = 1.8.0_112\n\n. . .\n\nnamenode                 | 17/10/11 18:27:31 INFO namenode.TransferFsImage: Transfer took 0.00s at 0.00 KB/s\nnamenode                 | 17/10/11 18:27:31 INFO namenode.TransferFsImage: Downloaded file fsimage.ckpt_0000000000000000015 size 946 bytes.\nnamenode                 | 17/10/11 18:27:31 INFO namenode.NNStorageRetentionManager: Going to retain 2 images with txid >= 0\nsecondarynamenode        | 17/10/11 18:27:32 INFO namenode.TransferFsImage: Uploaded image with txid 15 to namenode at http://namenode:50070 in 0.115 seconds\nsecondarynamenode        | 17/10/11 18:27:32 WARN namenode.SecondaryNameNode: Checkpoint done. New Image Size: 946\n```\n\nIn order to see if everything is up, open `http://localhost:8088/cluster`. You should see 1 active node when everything is up and running.\n\nimage::docker-bigdata-03.png[]\n\n== Running the application\n\nThis application reads a text file from HDFS and counts how many words it has. The result is saved on MongoDB.\n\nFirst, create a folder on HDFS. We will save the file to be processed on it:\n\n    docker-compose exec yarn hdfs dfs -mkdir /files/\n\nIn the command above, we are executing `hdfs dfs -mkdir /files/` on the service `yarn`. This command creates a new folder called `/files/` on HDFS, the distributed file system used by Hadoop.\n\nPut the file we are going to process on HDFS:\n\n[source, text]\n----\ndocker-compose run docker-hadoop-example \\\n               hdfs dfs -put /maven/test-data/text_for_word_count.txt /files/\n----\n\nThe `text_for_word_count.txt` file was added to the application image by maven when we built it, so we can use it to test. The command above will transfer the `text_for_word_count.txt` file from the local disk to the `/files/` folder on HDFS, so the Hadoop process can access it.\n\nRun our application\n\n[source, text]\n----\ndocker-compose run docker-hadoop-example \\\n        hadoop jar /maven/jar/docker-hadoop-example-1.0-SNAPSHOT-mr.jar \\\n        hdfs://namenode:9000 /files mongo yarn:8050\n----\n\nThe command above will run our jar file on the Hadoop cluster. The `hdfs://namenode:9000` parameter is the HDFS address. The `/files` parameter is where the file to process can be found on HDFS. The `mongo` parameter is the MongoDB host address. The `yarn:8050` parameter is the Hadoop yarn address, where the MapReduce job will be deployed. Note that since we are running the Hadoop components (namenode, yarn), MongoDB and our application as Docker services, they can all find each other and we can use the service names as host addresses.\n\nIf you go to `http://localhost:8088/cluster`, you can see your job running. When the job finishes, you should see this:\n\nimage::docker-bigdata-04.png[]\n\nIf everything ran successful, you should be able to see the results on MongoDB.\n\nConnect to the Mongo container:\n\n    docker-compose exec mongo mongo\n\nWhen connected, type:\n\n[source, text]\n----\nuse mongo_hadoop\ndb.word_count.find();\n----\n\nYou should see the results of running the application. Something like this:\n\n[source, text]\n----\n> db.word_count.find();\n{ \"_id\" : \"Counts on Sat Mar 18 18:16:20 UTC 2017\", \"words\" : 256 }\n----\n\n== Scaling the Hadoop cluster\n\n\nIf you want, you can scale your cluster, adding more Hadoop nodes to it:\n\n    docker-compose scale nodemanager=2\n\nThis means that you want to have 2 nodes in your Hadoop cluster. Go to `http://localhost:8088/cluster` and refresh until you see 2 active nodes.\n\nThe trick to scale the nodes is to use dynamically allocated ports and let docker assign a different port to each new nodemanager. See this approach in this snippet of the `docker-compose.yml` file:\n\n[source, text]\n----\nnodemanager:\n  image: tailtarget/hadoop:2.7.2\n  command: yarn nodemanager\n  ports:\n      - \"8042\" # local port dynamically assigned. allows node to be scaled up and down\n  links:\n      - namenode\n      - datanode\n      - yarn\n  hostname: nodemanager\n----\n\n== Stopping the services\n\nStop all the services\n\n    docker-compose down\n\nNote that since our `docker-compose.yml` file defines volume mappings for HDFS and MongoDB, next time you start the services again, your data will still be there.\n\n\n== Debugging your code\n\nDebugging distributed Hadoop applications can be cumbersome. However, you can configure your environment to use the docker Hadoop cluster and debug your code easily from an IDE.\n\nFirst, make sure your services are up:\n\n    docker-compose up -d\n\nThen, add this to your `/etc/hosts`:\n\n[source, text]\n----\n127.0.0.1       datanode\n127.0.0.1       yarn\n127.0.0.1       namenode\n127.0.0.1       secondarynamenode\n127.0.0.1       nodemanager\n----\n\nThis configuration will allow you to access the docker Hadoop cluster from your IDE.\n\nThen, open your project from https://github.com/fabianenardon/hadoop-docker-demo in Netbeans (or any other IDE) and run the application file:\n\nimage::docker-bigdata-01.png[]\n\nNote that you will be connecting to the docker services at localhost.\n\nYou can also set a breakpoint in your application and debug:\n\nimage::docker-bigdata-02.png[]\n\nimage::docker-bigdata-05.png[]\n\nShutdown the services:\n\n    docker-compose down\n\n== Integration tests\n\nWhen running integration tests, you want to test your application in an environment as close to production as possible, so you can test interactions between the several components, services, databases, network communication, etc. Fortunately, docker can help you a lot with integration tests.\n\nThere are several strategies to run integration tests, but in this application we are going to use the following:\n\n. Start the services with a `docker-compose.yml` file created for testing purposes. This file won't have any volumes mapped, so when the test is over, no state will be saved. The test `docker-compose.yml` file won't publish any port on the host machine, so we can run simultaneous tests.\n. Run the application, using the services started with the `docker-compose.yml` test file.\n. Run Maven integration tests to check if the application execution produced the expected results. This will be done by checking what was saved on the MongoDB database.\n. Stop the services. No state will be stored, so next time you run the integration tests, you will have a clean environment.\n\nHere is how to execute this strategy, step by step. The complete source code for this is in the `sample` directory of https://github.com/fabianenardon/hadoop-docker-demo.\n\nStart the services with the test configuration:\n\n[source, text]\n----\ndocker-compose --file src/test/resources/docker-compose.yml up -d\n----\n\nMake sure all services are started and create the folder we need on hdfs to test:\n\n[source, text]\n----\ndocker-compose --file src/test/resources/docker-compose.yml exec yarn hdfs dfs -mkdir /files/\n----\n\nPut the test file on hdfs:\n\n[source, text]\n----\ndocker-compose --file src/test/resources/docker-compose.yml \\\n               run docker-hadoop-example \\\n               hdfs dfs -put /maven/test-data/text_for_word_count.txt /files/\n----\n\nRun the application\n\n[source, text]\n----\ndocker-compose --file src/test/resources/docker-compose.yml \\\n               run docker-hadoop-example \\\n               hadoop jar /maven/jar/docker-hadoop-example-1.0-SNAPSHOT-mr.jar \\\n               hdfs://namenode:9000 /files mongo yarn:8050\n----\n\nRun our integration tests:\n\n[source, text]\n----\ndocker-compose --file src/test/resources/docker-compose.yml \\\n               run docker-hadoop-example-tests mvn -f /maven/code/pom.xml \\\n               -Dmaven.repo.local=/m2/repository -Pintegration-test verify\n----\n\nStop all the services:\n\n[source, text]\n----\ndocker-compose --file src/test/resources/docker-compose.yml down\n----\n\nIf you want to remote debug tests, run the tests this way instead:\n\n[source, text]\n----\ndocker run -v ~/.m2:/m2 -p 5005:5005 \\\n           --link mongo:mongo \\\n           --net resources_default \\\n           docker-hadoop-example-tests \\\n           mvn -f /maven/code/pom.xml \\\n           -Dmaven.repo.local=/m2/repository \\\n           -Pintegration-test verify \\\n           -Dmaven.failsafe.debug\n----\n\nRunning with this configuration, the application will wait until an IDE connects for remote debugging on port 5005.\n\nSee more about integration tests in the link:./ch09-cicd.adoc[CI/CD using Docker] chapter\n\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/readme.adoc",
    "content": "= Docker for Java Developers\n\nThis tutorial offers Java developers an intro-level and self-paced hands-on workshop with Docker.\n\n* link:chapters/ch01-setup.adoc[Setup Environments]\n* link:chapters/ch02-basic-concepts.adoc[Docker Basic Concepts]\n* Building\n** link:chapters/ch03-build-image.adoc[Build a Docker Image]\n** link:chapters/ch03-build-image-java-9.adoc[Build a Docker Image for Java 9]\n* link:chapters/ch04-run-container.adoc[Run a Docker Container]\n* link:chapters/ch05-compose.adoc[Multi-container application using Docker Compose]\n* link:chapters/ch06-swarm.adoc[Multi-container application using Compose and Swarm Mode]\n* Java IDEs\n** link:chapters/ch07-netbeans.adoc[Docker Tooling in NetBeans]\n** link:chapters/ch07-intellij.adoc[Docker Tooling in IntelliJ IDEA]\n** link:chapters/ch07-eclipse.adoc[Docker Tooling in Eclipse]\n* Multi-container application on multi-host\n** link:chapters/ch08-aws.adoc[Docker for AWS]\n** link:chapters/ch08-azure.adoc[Docker for Azure] (coming)\n** link:chapters/ch08-cloud.adoc[Docker Cloud]\n* link:chapters/ch09-cicd.adoc[CI/CD using Docker]\n* link:chapters/ch10-monitoring.adoc[Monitoring Docker Containers with Prometheus and Grafana]\n* link:chapters/ch11-bigdata.adoc[Big Data Processing with Docker and Hadoop]\n* link:chapters/appa-common-commands.adoc[Common Docker Commands]\n* link:chapters/appb-troubleshooting.adoc[Troubleshooting]\n* link:chapters/appc-references.adoc[References]\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java/scripts/docker-compose-pull-images.yml",
    "content": "version: '3'\nservices:\n  ubuntu:\n    image: ubuntu:latest\n  busybox:\n    image: busybox:latest\n  openjdk:\n    image: openjdk:latest\n  wildfly:\n    image: jboss/wildfly:latest\n  javaee7-hol:\n    image: arungupta/javaee7-hol:latest\n  docker-javaee:\n    image: arungupta/docker-javaee:dockerconeu17\n  mysql:\n    image: mysql:8\n  hadoop:\n    image: tailtarget/hadoop:2.7.2\n  jenkins:\n    image: jenkins/jenkins:lts\n  prometheus:\n    image: prom/prometheus:latest\n  node-exporter:\n    image: prom/node-exporter\n  cadvisor:\n    image: google/cadvisor:latest\n  grafana:\n    image: grafana/grafana\n  debian:\n    image: debian:stable-slim\n  alpine:\n    image: alpine:3.6\n  openjdk-slim:\n    image: openjdk:9-jdk-slim\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/Eclipse-README.md",
    "content": "## In-container Java Development: Eclipse\n\n### Pre-requisites\n\n* [Docker for OSX or Docker for Windows](https://www.docker.com/products/docker)\n* [Eclipse](http://www.eclipse.org/downloads/) (install Eclipse IDE for Java EE Developers)\n* [Java Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)\n* [Maven for Eclipse](http://www.eclipse.org/m2e/) (see instructions for adding the Maven plug-in to Eclipse)\n\n### Getting Started\n\nOn the command line clone the [registration-docker](https://github.com/docker/labs) repository\n\n```\ngit clone https://github.com/docker/labs\ncd labs/developer-tools/java-debugging\n```\n\nIn Eclipse, import the app directory of that project as an existing maven project\n\n`File`> `Import` Select `Maven`> `Existing Maven Projects`> `Next`\n\n![](images/eclipse_import_existing_maven_project_1.png)\n \n \nSelect the app subdirectory of the directory where you cloned the project.\n \n![](images/eclipse_import_existing_maven_project_2.png)\n \n \nSelect the pom.xml from the app directory, click `Finish`. \n \n![](images/eclipse_import_existing_maven_project_3.png)\n\n\n### Building the application\n\nThe application is a basic Spring MVC application that receives user input from a form, writes the data to a database, and queries the database.\n\nThe application is built using Maven. To build the application click on `Run` > `Run configurations`\n\n![](images/eclipse_maven_run_config3.png)\n\nSelect `Maven build` > `New`\n\n![](images/eclipse_maven_build_new.png)\n\nEnter a `Name` for the configuration.\n\nSet the base direct of the application `<path>/registration-docker/app`.\n\nSet the `Goals` to `clean install`.\n\nClick `Apply`\n\nClick `Run`\n\n![](images/eclipse_maven_run_config_apply.png)\n\nThe results of the build will be displayed in the console.\n\n![](images/eclipse_maven_console_build_result.png)\n\n### Running the application\n\nOpen a terminal and go to the application directory. Start the application with docker-compose\n\n<pre>&gt; docker-compose up </pre>\n\nDocker will build the images for Apache Tomcat and MySQL and start the containers. It will also mount the application directory (`./app/target/UserSignup`) as a data volume on the host system to the Tomcat webapps directory in the web server container.\n\nOpen a browser window and go to:\n'localhost:8080'; you should see the Tomcat home page\n\n![](images/tomcat_home3.png)\n\nWhen the Tomcat image was built, the user roles were also configured. Click on the `Manager App` button to see the deployed applications. When prompted for username and password, enter `system` and `manager` respectively to log into the Tomcat Web Application Manager page.\n\n![](images/tomcat_web_application_manager3.png)\n\nYou can use the Manager page to `Start`, `Stop`, `Reload` or `Undeploy` web applications.\n\nTo go to the application, Click on `/UserSignup` link.\n\n![](images/app_index_page3.png)\n\n### Debugging the Application\n\nIn the application, click on `Signup` to create a new user. Fill out the registration form and click `Submit`\n\n![](images/app_debug_signup2.png)\n\nClick `Yes` to confirm.\n\n![](images/app_debug_signup_confirm.png)\n\nTest out the login.\n\n![](images/app_debug_login2.png)\n\nOh no!\n\n![](images/app_debug_login_fail2.png)\n\n#### Configure Remote Debugging\n\nTomcat supports remote debugging the Java Platform Debugger Architecture (JPDA). Remote debugging was enabled when the tomcat image (registration-webserver) was built.\n\nTo configure remote debugging in Eclipse, click on `Run` > `Debug Configurations ...`\n\n![](images/eclipse_debug_configure2.png)\n\nSelect `Remote Java Application` and click on `Launch New Configuration` icon\n\n![](images/eclipse_debug_configure_new.png)\n\nEnter a `Name` for the configuration. Select the project using the `browse` button. Click on `Apply` to save the configuration and click on `Debug` to start the debugging connection between Tomcat and Eclipse.\n\n![](images/eclipse_debug_configure_docker.png)\n\n#### Finding the Error\n\nSince the problem is with the password, lets see how the password is set in the User class. In the User class, the setter for password is scrambled using [rot13](https://en.wikipedia.org/wiki/ROT13) before it is saved to the database.\n\n![](images/eclipse_debug_User_password.png)\n\nTry registering a new user using the debugger. In Eclipse, change the view or Perspective to the debugger by clicking on `Window` > `Perspective` > `Open Perspective` > `Debug`\n\n![](images/eclipse_debug_perspective.png)\n\nEclipse will switch to the debug perspective. Since we enable remote debugging earlier, you should see the Daemon Threads for Tomcat in the debug window. Set a breakpoint for in the User class where the password is set.\n\n![](images/eclipse_debug_User_breakpoint.png)\n\nRegister a new user with the username of 'Moby' and with 'm0by' as the password, click `Submit`, click `yes`\n\n![](images/app_register_moby2.png)\n\nEclipse will display the code at the breakpoint and the value of password in the variables window. Note that the value is `m0by`\n\n![](images/eclipse_debug_User_moby.png)\n\nClick on `resume` or press `F8` to let the code run.\n\n![](images/eclipse_debug_resume.png)\n\nNext, set a breakpoint on the getPassword in the User class to see the value returned for password. You can also toggle off the breakpoint for setPassword.\n\n![](images/eclipse_debug_User_getPassword.png)\n\nTry to log into the application. Look at the value for password in the Eclipse variables window, note that it is `z0ol` which is `m0by` using ROT13.\n\n![](images/eclipse_debug_User_show_user.png)\n\nIn this MVC application the UserController uses the findByLogin method in the UserServiceImpl class which uses the findByUsername method to retrieve the information from the database. It then checks to see if the password from the form matches the user password. Since the password from the login form is not scrambled using ROT13, it does not match the user password and you cannot log into the application.\n\nTo fix this, apply ROT13 to the password by adding an import near the top of the file\n\n```\nimport com.docker.UserSignup.util.Rot13\n```\n\nand replace the contents of `findByLogin` with\n\n```\npublic boolean findByLogin(String userName, String password) {  \n    User usr = userRepository.findByUserName(userName);\n\n    String passwd = Rot13.rot13(password);\n\n    if(usr != null && usr.getPassword().equals(passwd)) {\n        return true;\n    }\n\n    return false;\n}\n```\n\n![](images/eclipse_debug_UserServiceImpl_code.png)\n\nSet a breakpoint in UserServiceImpl on the findByLogin method. Log in again and look at the values for the breakpoint. The 'passwd' variable is `z0ol` which matches the password for the user moby.\n\n![](images/eclipse_debug_UserServiceImpl_values.png)\n\nContinue (`F8`) and you should successfully log in.\n\n![](images/app_debug_success.png)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/Eclipse-README_es.md",
    "content": "## Desarrollo Java: Eclipse\n\n### Pre-requisitos\n\n* [Docker for OSX or Docker for Windows](https://www.docker.com/products/docker)\n* [Eclipse](http://www.eclipse.org/downloads/) (instalar Eclipse IDE para desaroolladores Java EE)\n* [Java Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)\n* [Maven for Eclipse](http://www.eclipse.org/m2e/) (ver instrucciones para agregar Maven plug-in en Eclipse)\n\n### Empezando\n\nEn Eclipse, clonar el repositorio [registration-docker](https://github.com/spara/registration-docker.git)\n\n`File`> `Import`\nSeleccionar `Git`> `Projects`> `Next`\n\n![](images/eclipse_git_import_repo2.png)\n\nSeleccionar `Clone URI`> `Next`\n\n![](images/eclipse_git_clone_uri2.png)\n\nIngresar la [`url del repositorio`](https://github.com/spara/registration-docker.git)> `Next`\n\n![](images/eclipse_git_repo_uri2.png)\n\n`Seleccionar el branch master`> `Next`\n\n![](images/eclipse_git_select_branch2.png)\n\n`Ingresar destination directory`> `Next`\n\n![](images/eclipse_git_local_destination2.png)\n\nSeleccionar el asistente de importación, `Import existing Eclipse project`> `Next`\n\n![](images/eclipse_git_import_wizard2.png)\n\nSeleccionar `registration-docker`> `Finish`\n\n![](images/eclipse_git_import_project2.png)\n\n### Construyendo la aplicación\n\nLa aplicación es una aplicación Spring MVC básica que recibe datos del usuario de un formulario, almacena los datos en la base de datos, y realiza consultas.\n\nLa aplicación se construye usando Maven. Para construir la aplicación hacer clic en `Run` > `Run configurations`\n\n![](images/eclipse_maven_run_config3.png)\n\nSeleccionar `Maven build` > `New`\n\n![](images/eclipse_maven_build_new.png)\n\nIngresar `Name` para la configuración.\n\nEstablecer el directorio base de la aplicación `<path>/registration-docker/app`.\n\nEstablecer `Goals` a `clean install`.\n\nClic `Apply`\n\nClic `Run`\n\n![](images/eclipse_maven_run_config_apply.png)\n\nLos resultados del build serán mostrados en la consola.\n\n![](images/eclipse_maven_console_build_result.png)\n\n### Ejecutando la aplicación\n\nAbrir un terminal e ir al directorio de la aplicación. Iniciar la aplicación con docker-compose\n\n<pre>&gt; docker-compose up </pre>\n\nDocker construirá las imágenes para Apache Tomcat y MySQL e iniciará los contenedores. También, montará el directorio de la aplicación (`./app/target/UserSignup`) como volumen de datos en el host del sistema al directorio webapps Tomcat en el contenedor del servidor web.\n\nAbrir una ventana en el explorador e ir a:\n'localhost:8080'; debe ver la página de inicio de Tomcat\n\n![](images/tomcat_home3.png)\n\nCuando la imagen de Tomcat fue construida, los roles de los usuarios fueron configurados. Clic en el botón `Manager App` para visualizar las aplicaciones desplegadas. Cuando se solicite por usuario y contraseña, ingresar `system` y `manager` respectivamente para entrar a la página de Tomcat Web Application Manager.\n\n![](images/tomcat_web_application_manager3.png)\n\nEs posible usar la página Manager para `Start`, `Stop`, `Reload` o `Undeploy` aplicaciones web.\n\nPara ir a la aplicación, clic en el link `/UserSignup`.\n\n![](images/app_index_page3.png)\n\n### Depurando la Aplicación\n\nEn la aplicación, clic en `Signup` para crear un nuevo usuario. Completar el formulario de registro y hacer clic en `Submit`\n\n![](images/app_debug_signup2.png)\n\nClic `Yes` para confirmar.\n\n![](images/app_debug_signup_confirm.png)\n\nProbar el inicio de sesión.\n\n![](images/app_debug_login2.png)\n\nOh no!\n\n![](images/app_debug_login_fail2.png)\n\n#### Configurar Depuración Remota\n\nTomcat soporta depuración remota usando Java Platform Debugger Architecture (JPDA). Debug Remoto fue habilitado cuando la imagen tomcat (registration-webserver) fue construida.\n\nPara configurar la depuración remota en Eclipse, clic en `Run` > `Debug Configurations ...`\n\n![](images/eclipse_debug_configure2.png)\n\nSeleccionar `Remote Java Application` y clic en el icono `Launch New Configuration`\n\n![](images/eclipse_debug_configure_new.png)\n\nIngresar `Name` para la configuración. Seleccionar el proyecto usando el botón `browse`. Clic en `Apply` para guardar la configuración y clic en `Debug` para iniciar la conexión de debug entre Tomcat y Eclipse.\n\n![](images/eclipse_debug_configure_docker.png)\n\n#### Buscando el Error\n\nDado que el problema es la contraseña, hay que ver como la contraseña se establece en la clase User. En la clase User, el setter para la contraseña es mezclado usando [rot13](https://en.wikipedia.org/wiki/ROT13) antes de ser almacenado en la base de datos.\n\n![](images/eclipse_debug_User_password.png)\n\nTratar registrando un nuevo usuario usando el depurador. En Eclipse,  cambiar la vista o perspectiva del depurador haciendo clic en `Window` > `Perspective` > `Open Perspective` > `Debug`\n\n![](images/eclipse_debug_perspective.png)\n\nEclipse cambiará a la perspectiva debug. Dado que habilitamos el depurador remoto previamente, debes ver los Daemon Threads para Tomcat en la ventana de debug. Establece un punto de interrupción para la clase User donde el password es establecido.\n\n![](images/eclipse_debug_User_breakpoint.png)\n\nRegistrar un nuevo usuario con el usuario de 'Moby' y con 'm0by' como contraseña, clic `Submit`, clic `yes`\n\n![](images/app_register_moby2.png)\n\nEclipse mostrará el código en el punto de interrupción y el valor de la contraseña en la ventana variables. Observar que el valor es `m0by`\n\n![](images/eclipse_debug_User_moby.png)\n\nClic en `resume` o presionar `F8` para permitir ejecutar el código.\n\n![](images/eclipse_debug_resume.png)\n\nA continuación, establecer el punto de interrupción en getPassword en la clase User para ver los valores retornados para la contraseña. También puede cambiar el punto de interrupción para setPassword.\n\n![](images/eclipse_debug_User_getPassword.png)\n\nTratar de acceder a la aplicación. Ver el valor de la contraseña en la ventana variables de Eclipse, observar que es `z0ol` el cual es `m0by` usando ROT13.\n\n![](images/eclipse_debug_User_show_user.png)\n\nEn esta aplicación MVC el UserController usa el método findByLogin en la clase UserServiceImpl la cual usa el método findByUsername para recuperar la información de la base de datos. A continuación, verificar que la contraseña del formulario coincide con la contraseña del usuario. Dado que la contraseña del formulario de inicio de sesión no es mezclada usando ROT13, este no coincide con la contraseña del usuario y no es posible acceder a la aplicación.\n\nPara solucionar esto, aplicar ROT13 a la contraseña agregando\n\n```\nimport com.docker.UserSignup.utit.Rot13\n\nString passwd = Rot13.rot13(password);\n```\n![](images/eclipse_debug_UserServiceImpl_code.png)\n\nEstablecer un punto de interrupción en UserServiceImpl en el método findByLogin. Iniciar sesión otra vez y verificar los valores para el punto de interrupción. La variable 'passwd' es 'z0ol' la cual coincide con la contraseña para el usuario moby.\n\n![](images/eclipse_debug_UserServiceImpl_values.png)\n\nContinuar (`F8`) y debe acceder exitosamente.\n\n![](images/app_debug_success.png)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/IntelliJ-README.md",
    "content": "## In-container Java Development: IntelliJ Community Edition\n\n### Pre-requisites\n\n* [Docker for OSX or Docker for Windows](https://www.docker.com/products/docker)\n* [IntelliJ Community Edition](https://www.jetbrains.com/idea/download/)\n* [Java Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)\n\n\n### Getting Started\n\nIn IntelliJ, clone the repository. Click on `Check out from Version Control` > `Github`\n\n![](images/intelliJ_git_open_project.png)\n\nIf this the first time to use IntelliJ with Github, log into your Github account.\n![](images/intelliJ_git_login.png)\n\nOn the command line clone the [docker/labs](https://github.com/docker/labs) repository\n \n![](images/intelliJ_git_clone_repository1.png)\nClick on `Import project from external model`, select `Maven`. Click `Next`\n\n![](images/intellij_github_import_maven.png)\n\nCheck `Search for projects recursively`. Click `Next`\n\n![](images/intellij_github_import_maven_configure.png)\n\nSelect the project and click `Next`\n\n![](images/intellij_github_import_maven_select.png)\n\nSelect the JDK(set the `JDK home path`) and click `Next`\n\n![](images/intellij_github_import_select_sdk.png)\n\nClick `Finish`\n\n![](images/intellij_github_import_project_finish.png)\n\nClick on `Project View` to open the project.\n\n![](images/intelliJ_git_open_project_gui.png)\n\n### Building the application\n\nThe application is a basic Spring MVC application that receives user input from a form, writes the data to a database, and queries the database.\n\nThe application is built using Maven. To build the application click on icon on the bottom left of the IntelliJ window and select `Maven Projects`.\n\n![](images/intellij_maven_setup.png)\n\nThe `Maven Projects` window will open on the right side. Maven goals of `clean` and `install` need to be set to build the application.\n\nTo set the `clean` goal, click on `Lifecycle` to display the tree of goals. Right click on `clean` and select `Create 'UserSignup [clean]'...`\n\n![](images/intellij_maven_goal_clean.png)\n\nClick `OK` in the `Create Run/Debug Configuration` window.\n\n![](images/intellij_maven_goal_clean_menu.png)\n\nConfigure the `install` goal similarly. Click on `install` in the Lifecycle tree. Select `Create 'UserSignup[install]'...`\n\n![](images/intellij_maven_goal_install.png)\n\nClick `OK` in the `Create Run/Debug Configuration` window.\n\n![](images/intelligj_maven_goal_install_menu.png)\n\nTo build the application run `clean`\n\n![](images/intellij_maven_goal_clean_run.png)\n\nThen run `install`\n\n![](images/intellij_maven_goal_install_run.png)\n\nWhen the application builds, you will see a success message in the log window.\n\n![](images/intellij_maven_goal_install_log.png)\n\n### Running the application\n\nOpen a terminal and go to the application directory. Start the application with docker-compose\n\n<pre>&gt; docker-compose up </pre>\n\nDocker will build the images for Apache Tomcat and MySQL then start the containers. It will also mount the application directory (`./app/target/UserSignup`) as a data volume on the host system to the Tomcat webapps directory in the web server container.\n\nOpen a browser window and go to:\n'localhost:8080'; you should see the Tomcat home page\n\n![](images/tomcat_home3.png)\n\nWhen the Tomcat image was built, the user roles were also configured. Click on the `Manager App` button to see the deployed applications. When prompted for username and password, enter `system` and `manager` respectively to log into the Tomcat Web Application Manager page.\n\n![](images/tomcat_web_application_manager3.png)\n\nYou can use the Manager page to `Start`, `Stop`, `Reload` or `Undeploy` web applications.\n\nTo go to the application, Click on `/UserSignup` link.\n\n![](images/app_index_page3.png)\n\n### Debugging the Application\n\nIn the application, click on `Signup` to create a new user. Fill out the registration form and click `Submit`\n\n![](images/app_debug_signup2.png)\n\nClick `Yes` to confirm.\n\n![](images/app_debug_signup_confirm.png)\n\nTest out the login.\n\n![](images/app_debug_login2.png)\n\nOh no!\n\n![](images/app_debug_login_fail2.png)\n\n#### Configure Remote Debugging\n\nTomcat supports remote debugging the Java Platform Debugger Architecture (JPDA). Remote debugging was enabled when the tomcat image (registration-webserver) was built.\n\nTo configure remote debugging in IntelliJ, click on `Run` > `Edit Configuration ...`\n\n![](images/intelij_debug_run_edit_configurations.png)\n\nAdd a new remote configuration.\n\n![](images/intellij_debug_add_remote_configuration.png)\n\nIn the `Run\\Debug Configurations` window, set the `Name` of the configuration as `docker tomcat` and in `Settings` set the port to '8000' as the default Tomcat JPDA debuging port. Click on `OK` to save the configuration.\n\n![](images/intellij_debug_tomcat_remote_settings.png)\n\n#### Finding the Error\n\nSince the problem is with the password, let's see how the password is set in the User class. In the User class, the setter for password is scrambled using [rot13](https://en.wikipedia.org/wiki/ROT13) before it is saved to the database.\n\n![](images/intellij_debug_User_password.png)\n\nTry registering a new user using the debugger. In the menu click on `Run` > `Debug...`\n\n![](images/intellij_run_debug.png)\n\nChoose the remote Tomcat debug configuration. The Debugger console will be displayed at the bottom of the IntelliJ window.\n\n![](images/intellij_debug_choose_remote_tomcat.png)\n\nSet a breakpoint in the User class where the password is set.\n\n![](images/intellij_debug_set_breakpoint_password.png)\n\nRegister a new user with the username of 'Moby' and with 'm0by' as the password, click `Submit`, click `yes`\n\n![](images/app_register_moby2.png)\n\nIntelliJ will display the code at the breakpoint and the value of password in the variables window. Note that the value is `m0by`\n\n![](images/intellij_debug_User_moby.png)\n\nClick on `Resume Program` to let the code run or press `F8` to step over the breakpoint.\n\n![](images/intellij_debug_resume.png)\n\nNext, set a breakpoint on the getPassword in the User class to see the value returned for password. You can also toggle off the breakpoint for setPassword.\n\n![](images/intellij_debug_User_getPassword.png)\n\nTry to log into the application. Look at the value for password in the debugging console, note that it is `z0ol` which is `m0by` using ROT13.\n\n![](images/intellij_debug_User_show_user.png)\n\nIn this MVC application the UserController uses the findByLogin method in the UserServiceImpl class which uses the findByUsername method to retrieve the information from the database. It then checks to see if the password from the form matches the user password. Since the password from the login form is not scrambled using ROT13, it does not match the user password and you cannot log into the application.\n\nTo fix this, apply ROT13 to the password by adding\n\n```\nimport com.docker.UserSignup.utit.Rot13\n\nString passwd = Rot13.rot13(password);\n```\n![](images/intellij_debug_UserServiceImpl_code.png)\n\nSet a breakpoint in UserServiceImpl on the findByLogin method. Log in again and look at the values for the breakpoint. The 'passwd' variable is `z0ol` which matches the password for the user moby.\n\n![](images/intellij_debug_UserServiceImpl_values.png)\n\nContinue (`F8`) and you should successfully log in.\n\n![](images/app_debug_success.png)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/IntelliJ-README_es.md",
    "content": "## Desarrollo Java en Contenedor: IntelliJ Community Edition\n\n### Pre-requisitos\n\n* [Docker for OSX or Docker for Windows](https://www.docker.com/products/docker)\n* [IntelliJ Community Edition](https://www.jetbrains.com/idea/download/)\n* [Java Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)\n\n\n### Empezando\n\nEn IntelliJ, clonar el repositorio. Clic en `Check out from Version Control` > `Github`\n\n![](images/intelliJ_git_open_project.png)\n\nSi esta es la primera vez usando Intellij con Github, ingresar a la cuenta de Github.\n![](images/intelliJ_git_login.png)\n\nClonar el repositorio [registration-docker](https://github.com/spara/registration-docker.git).\n\n![](images/intelliJ_git_clone_repository.png)\nClic en `Import project from external model`, seleccionar `Maven`. Clic `Next`\n\n![](images/intellij_github_import_maven.png)\n\nSeleccionar `Search for projects recursively`. Clic `Next`\n\n![](images/intellij_github_import_maven_configure.png)\n\nSeleccionar el proyecto y clic en `Next`\n\n![](images/intellij_github_import_maven_select.png)\n\nSeleccionar el JDK y clic en `Next`\n\n![](images/intellij_github_import_select_sdk.png)\n\nClic en `Finish`\n\n![](images/intellij_github_import_project_finish.png)\n\nClic en `Project View` para abrir el proyecto.\n\n![](images/intelliJ_git_open_project_gui.png)\n\n### Construyendo la aplicación\n\nLa aplicación es una aplicación Spring MVC básica que recibe datos del usuario de un formulario, almacena los datos en la base de datos, y realiza consultas.\n\nLa aplicación se construye usando Maven. Para construir la aplicación clic en el icono de la parte inferior izquierda de IntelliJ y seleccionar `Maven Projects`.\n\n![](images/intellij_maven_setup.png)\n\nLa ventana `Maven Projects` se abrirá al lado derecho. Las tareas de maven `clean` y `install` necesitan ser establecidas para construir la aplicación.\n\nPara establecer la tarea `clean`, clic en `Lifecycle` para visualizar el árbol de tareas. Clic derecho en `clean` y seleccionar `Create 'UserSignup [clean]'...`\n\n![](images/intellij_maven_goal_clean.png)\n\nClic `OK` en la ventana `Create Run/Debug Configuration`.\n\n![](images/intellij_maven_goal_clean_menu.png)\n\nDe manera similar configurar la tarea `install`. Clic en `install` en el árbol de Lifecycle. Seleccionar `Create 'UserSignup[install]'...`\n\n![](images/intellij_maven_goal_install.png)\n\nClic `OK` en la ventana `Create Run/Debug Configuration`.\n\n![](images/intelligj_maven_goal_install_menu.png)\n\nPara construir la aplicación ejecutar `clean`\n\n![](images/intellij_maven_goal_clean_run.png)\n\nLuego ejecutar `install`\n\n![](images/intellij_maven_goal_install_run.png)\n\nCuando la aplicación se construya se visualizará un mensaje de éxito en la ventana de Log.\n\n![](images/intellij_maven_goal_install_log.png)\n\n### Ejecutando la aplicación\n\nAbrir un terminal e ir al directorio de la aplicación. Iniciar la aplicación con docker-compose\n\n<pre>&gt; docker-compose up </pre>\n\nDocker construirá las imágenes para Apache Tomcat y MySQL e iniciará los contenedores. También, montará el directorio de la aplicación (`./app/target/UserSignup`) como volumen de datos en el host del sistema al directorio webapps Tomcat en el contenedor del servidor web.\n\nAbrir una ventana en el explorador e ir a:\n'localhost:8080'; debes ver la página de inicio de Tomcat\n\n![](images/tomcat_home3.png)\n\nCuando la imagen de Tomcat fue construida, los roles de los usuarios fueron configurados. Clic en el botón `Manager App` para visualizar las aplicaciones desplegadas. Cuando se solicite el usuario y la contraseña, ingresar `system` y `manager` respectivamente para entrar a la página de Tomcat Web Application Manager.\n\n![](images/tomcat_web_application_manager3.png)\n\nEl posible usar la página Manager para `Start`, `Stop`, `Reload` o `Undeploy` aplicaciones web.\n\nPara ir a la aplicación, clic en el link `/UserSignup`.\n\n![](images/app_index_page3.png)\n\n### Depurando la aplicación\n\nEn la aplicación, clic en `Signup` para crear un nuevo usuario. Completar el formulario de registro y clic en `Submit`\n\n![](images/app_debug_signup2.png)\n\nClic `Yes` para confirmar.\n\n![](images/app_debug_signup_confirm.png)\n\nProbar el inicio de sesión.\n\n![](images/app_debug_login2.png)\n\nOh no!\n\n![](images/app_debug_login_fail2.png)\n\n#### Configurar Depuración Remota\n\nTomcat soporta depuración remota usando Java Platform Debugger Architecture (JPDA). Debug Remoto fue habilitado cuando la imagen tomcat (registration-webserver) fue construida.\n\nPara configurar la depuración remota en  IntelliJ, clic en `Run` > `Edit Configuration ...`\n\n![](images/intelij_debug_run_edit_configurations.png)\n\nAgregar una nueva configuración remota.\n\n![](images/intellij_debug_add_remote_configuration.png)\n\nEn la ventana `Run\\Debug Configurations`, establecer el `Name` de la configuración y en `Settings` establecer el puerto '8000' el puerto de depuración de Tomcat JPDA por defecto. Clic en `OK` para guardar la configuración.\n\n![](images/intellij_debug_tomcat_remote_settings.png)\n\n#### Buscando el Error\n\nDado que el problema es la contraseña, veamos como la contraseña se establece en la clase User. En la clase User, el setter para la contraseña es mezclado usando [rot13](https://en.wikipedia.org/wiki/ROT13) antes de ser almacenado en la base de datos.\n\n![](images/intellij_debug_User_password.png)\n\nTratar registrando un nuevo usuario usando el depurador. En el menu clic en `Run` > `Debug...`\n\n![](images/intellij_run_debug.png)\n\nElegir la configuración de depuración remota de Tomcat. La consola de depuración se motrará en la parte inferior de IntelliJ.\n\n![](images/intellij_debug_choose_remote_tomcat.png)\n\nEstablecer un punto de interrupción para la clase User donde el password es establecido.\n\n![](images/intellij_debug_set_breakpoint_password.png)\n\nRegistrar un nuevo usuario con el usuario de 'Moby' y con 'm0by' como contraseña, clic `Submit`, clic `yes`\n\n![](images/app_register_moby2.png)\n\nIntelliJ mostrará el código en el punto de interrupción y el valor de la contraseña en la ventana variables. Observar que el valor es `m0by`\n\n![](images/intellij_debug_User_moby.png)\n\nClic en `Resume Program` para permitir ejecutar el código o presionar `F8` para saltar el punto de interrupción.\n\n![](images/intellij_debug_resume.png)\n\nA continuación, establecer el punto de interrupción en getPassword en la clase User para ver los valores retornados para la contraseña. También es posible cambiar el punto de interrupción a setPassword.\n\n![](images/intellij_debug_User_getPassword.png)\n\nTratar de acceder a la aplicación. Ver el valor de la contraseña en la ventana variables de Eclipse, observar que es `z0ol` el cual es `m0by` usando ROT13.\n\n![](images/intellij_debug_User_show_user.png)\n\nEn esta aplicación MVC el UserController usa el método findByLogin en la clase UserServiceImpl la cual usa el método findByUsername para recuperar la información de la base de datos. A continuación, verificar que la contraseña del formulario conincide con la contraseña del usuario. Dado que la contraseña del formulario de inicio de sesión no es mezclada usando ROT13, este no coincide con la contraseña del usuario y no es posible acceder a la aplicación.\n\nPara solucionar esto, aplicar ROT13 a la contraseña agregando\n\n```\nimport com.docker.UserSignup.utit.Rot13\n\nString passwd = Rot13.rot13(password);\n```\n![](images/intellij_debug_UserServiceImpl_code.png)\n\nEstablecer un punto de interrupción en UserServiceImpl en el método findByLogin. Iniciar sesión otra vez y verificar los valores para el punto de interrupción. La variable 'passwd' es 'z0ol' la cual coincide con la contraseña para el usuario moby.\n\n![](images/intellij_debug_UserServiceImpl_values.png)\n\nContinuar (`F8`) y debe acceder exitosamente.\n\n![](images/app_debug_success.png)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/NetBeans-README.md",
    "content": "## In-container Java Development: NetBeans IDE\n\n### Pre-requisites\n\n* [Docker for OSX or Docker for Windows](https://www.docker.com/products/docker)\n* [NetBeans IDE](https://netbeans.org/downloads/)\n* [Java Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)\n\n### Getting Started\n\nUsing your git client clone the repository.\n\n```\ngit clone https://github.com/docker/labs\ncd labs/developer-tools/java-debugging\n```\n\nOpen NetBeans IDE, Click on `Open Project...`\n\n![](images/netbeans_open_project_menu.png)\n\nSelect `app` and click on `Open Project`.\n\n![](images/netbeans_open_project_app.png)\n\n### Building the application\n\nThe application is a basic Spring MVC application that receives user input from a form, writes the data to a database, and queries the database.\n\nThe application is built using Maven. To build the application click on `Run` > `Build Project`.\n\n![](images/netbeans_build_project_menu.png)\n\nThe results of the build will be displayed in the console.\n\n![](images/netbeans_build_project_console.png)\n\n### Running the application\n\nOpen a terminal and go to the application directory. Start the application with docker-compose\n\n<pre>&gt; docker-compose up </pre>\n\nDocker will build the images for Apache Tomcat and MySQL and start the containers. It will also mount the application directory (`./app/target/UserSignup`) as a data volume on the host system to the Tomcat webapps directory in the web server container.\n\nOpen a browser window and go to:\n'localhost:8080'; you should see the Tomcat home page\n\n![](images/tomcat_home3.png)\n\nWhen the Tomcat image was built, the user roles were also configured. Click on the `Manager App` button to see the deployed applications. When prompted for username and password, enter `system` and `manager` respectively to log into the Tomcat Web Application Manager page.\n\n![](images/tomcat_web_application_manager3.png)\n\nYou can use the Manager page to `Start`, `Stop`, `Reload` or `Undeploy` web applications.\n\nTo go to the application, Click on `/UserSignup` link.\n\n![](images/app_index_page3.png)\n\n### Debugging the Application\n\nIn the application, click on `Signup` to create a new user. Fill out the registration form and click `Submit`\n\n![](images/app_debug_signup2.png)\n\nClick `Yes` to confirm.\n\n![](images/app_debug_signup_confirm.png)\n\nTest out the login.\n\n![](images/app_debug_login2.png)\n\nOh no!\n\n![](images/app_debug_login_fail2.png)\n\n#### Configure Remote Debugging\n\nIn the menu click on `Debug` > `Attach Debugger...`\n\n![](images/netbeans_debug_attach_debugger_menu.png)\n\nMake sure that the port is set to 8000, click on `OK`.\n\n![](images/netbeans_debug_attach_debugger_configure.png)\n\n#### Finding the Error\n\nSince the problem is with the password, lets see how the password is set in the User class. In the User class, the setter for password is scrambled using [rot13](https://en.wikipedia.org/wiki/ROT13) before it is saved to the database.\n\nSince we enabled remote debugging earlier, you should see the Daemon Threads for Tomcat in the `Debugging` window. Set a breakpoint for in the User class where the password is set.\n\n![](images/netbeans_debug_User_breakpoint.png)\n\nRegister a new user with the username of 'Moby' and with 'm0by' as the password, click `Submit`, click `yes`\n\n![](images/app_register_moby2.png)\n\nNetBeans will display the code at the breakpoint and the value of password in the variables window. Note that the value is `m0by`\n\n![](images/netbeans_debug_User_moby.png)\n\nClick on `Continue` icon or press `F5` to let the code run.\n\n![](images/netbeans_debug_resume.png)\n\nNext, set a breakpoint on the getPassword in the User class to see the value returned for password. You can also toggle off the breakpoint for setPassword. Try to log into the application. Look at the value for password in the NetBeans variables window, note that it is `z0ol` which is `m0by` using ROT13.\n\n![](images/netbeans_debug_User_show_user.png)\n\nIn this MVC application the UserController uses the findByLogin method in the UserServiceImpl class which uses the findByUsername method to retrieve the information from the database. It then checks to see if the password from the form matches the user password. Since the password from the login form is not scrambled using ROT13, it does not match the user password and you cannot log into the application.\n\nTo fix this, apply ROT13 to the password by adding\n\n```\nimport com.docker.UserSignup.utit.Rot13\n\nString passwd = Rot13.rot13(password);\n```\n![](images/netbeans_debug_UserServiceImpl_code.png)\n\nSet a breakpoint in UserServiceImpl on the findByLogin method. Press `F11` or click on `Run` > `Build Project` to update the deployed code. Log in again and look at the values for the breakpoint. The 'passwd' variable is `z0ol` which matches the password for the user moby.\n\n![](images/netbeans_debug_UserServiceImpl_values.png)\n\nContinue (`F5`) and you should successfully log in.\n\n![](images/app_debug_success.png)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/NetBeans-README_es.md",
    "content": "## Desarrollo Java en Contenedor: NetBeans IDE\n\n### Pre-requisitos\n\n* [Docker for OSX or Docker for Windows](https://www.docker.com/products/docker)\n* [NetBeans IDE](https://netbeans.org/downloads/)\n* [Java Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)\n\n### Empezando\n\nUsar el cliente git para clonar el repositorio.\n\n```\ngit clone https://github.com/spara/registration-docker.git\n```\n\nAbrir NetBeans IDE, hacer clic en `Open Project...`\n\n![](images/netbeans_open_project_menu.png)\n\nSeleccionar `app` y hacer clic en `Open Project`.\n\n![](images/netbeans_open_project_app.png)\n\n### Construyendo la aplicación\n\nLa aplicación es una aplicación Spring MVC básica que recibe datos del usuario de un formulario, almacena y consulta la informacion en la base de datos.\n\nLa aplicación se construye usando Maven. Para construir la aplicación hacer clic en `Run` > `Build Project`.\n\n![](images/netbeans_build_project_menu.png)\n\nLos resultados del build serán mostrados en la consola.\n\n![](images/netbeans_build_project_console.png)\n\n### Ejecutando la aplicación\n\nAbrir un terminal e ir al directorio de la aplicación. Iniciar la aplicación con docker-compose\n\n<pre>&gt; docker-compose up </pre>\n\nDocker construirá las imágenes para Apache Tomcat y MySQL e iniciará los contenedores. También, montará el directorio de la aplicación (`./app/target/UserSignup`) como volumen de datos en el host del sistema al directorio webapps Tomcat en el contenedor del servidor web.\n\nAbrir una ventana en el explorador e ir a:\n'localhost:8080'; debes ver la página de inicio de Tomcat\n\n![](images/tomcat_home3.png)\n\nCuando la imagen de Tomcat fue construida, los roles de los usuarios fueron configurados. hacer clic en el botón `Manager App` para visualizar las aplicaciones desplegadas. Cuando se solicite por usuario y contraseña, ingresar `system` y `manager` respectivamente para entrar a la página de Tomcat Web Application Manager.\n\n![](images/tomcat_web_application_manager3.png)\n\nPuedes usar la página Manager para `Start`, `Stop`, `Reload` o `Undeploy` aplicaciones web.\n\nPara ir a la aplicación, hacer clic en el link `/UserSignup`.\n\n![](images/app_index_page3.png)\n\n### Depurando la Aplicación\n\nEn la aplicación, hacer clic en `Signup` para crear un nuevo usuario. Completar el formulario de registro y hacer clic en `Submit`\n\n![](images/app_debug_signup2.png)\n\nHacer clic en `Yes` para confirmar.\n\n![](images/app_debug_signup_confirm.png)\n\nProbar el inicio de sesión.\n\n![](images/app_debug_login2.png)\n\nOh no!\n\n![](images/app_debug_login_fail2.png)\n\n#### Configurar Depuración Remota\n\nEn el menu hacer clic en `Debug` > `Attach Debugger...`\n\n![](images/netbeans_debug_attach_debugger_menu.png)\n\nAsegurar que el puerto establecido es 8000, hacer clic en `OK`.\n\n![](images/netbeans_debug_attach_debugger_configure.png)\n\n#### Buscando el Error\n\nDado que el problema es la contraseña, veamos como la contraseña se establece en la clase User. En la clase User, el setter para la contraseña es mezclado usando [rot13](https://en.wikipedia.org/wiki/ROT13) antes almacenarse en la base de datos.\n\nDado que habilitamos el depurador remoto previamente, debe ver los Daemon Threads para Tomcat en la ventana `Debugging`. Establecer un punto de interrupción para la clase User donde el password es establecido.\n\n![](images/netbeans_debug_User_breakpoint.png)\n\nRegistrar un nuevo usuario con el usuario de 'Moby' y con 'm0by' como contraseña, hacer clic en `Submit`, hacer clic en `yes`\n\n![](images/app_register_moby2.png)\n\nNetBeans mostrará el código en el punto de interrupción y el valor de la contraseña en la ventana variables. Observar que el valor es `m0by`\n\n![](images/netbeans_debug_User_moby.png)\n\nHacer clic en el icono `Continue` o presionar `F5` para permitir ejecutar el código.\n\n![](images/netbeans_debug_resume.png)\n\nA continuación, establecer el punto de interrupción en getPassword en la clase User para ver los valores retornados para la contraseña. También puede cambiar el punto de interrupción para setPassword. Tratar de acceder a la aplicación. Ver el valor de la contraseña en la ventana variables, observar que es `z0ol` el cual es `m0by` usando ROT13.\n\n![](images/netbeans_debug_User_show_user.png)\n\nEn esta aplicación MVC el UserController usa el método findByLogin en la clase UserServiceImpl la cual usa el método findByUsername para recuperar la información de la base de datos. A continuación, verifica que la contraseña del formulario conincide con la contraseña del usuario. Dado que la contraseña del formulario de inicio de sesión no es mezclada usando ROT13, este no coincide con la contraseña del usuario y no puedes acceder a la aplicación.\n\nPara solucionar esto, aplicar ROT13 a la contraseña agregando\n\n```\nimport com.docker.UserSignup.utit.Rot13\n\nString passwd = Rot13.rot13(password);\n```\n![](images/netbeans_debug_UserServiceImpl_code.png)\n\nEstablecer un punto de interrupción en UserServiceImpl en el método findByLogin. Presionar `F11` o hacer clic en `Run` > `Build Project` para actualizar el código desplegado. Iniciar sesión otra vez y mirar los valores para el punto de interrupción. La variable 'passwd' es 'z0ol' la cual coincide con la contraseña para el usuario moby.\n\n![](images/netbeans_debug_UserServiceImpl_values.png)\n\nContinuar (`F5`) y debe acceder exitosamente.\n\n![](images/app_debug_success.png)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/README.md",
    "content": "# Tutorial: Debugging Java Applications in Docker\n\nJava developers can use Docker to build a development environment where they can run, test, and live debug code running within a container. Debugging a node.js application was demonstrated at DockerCon 2016 showing that development using containers can be performed on many platforms using other programming languages.\n\n[![Live debugging demo at DockerCon US 2016](https://img.youtube.com/vi/vE1iDPx6-Ok/0.jpg)](https://youtu.be/vE1iDPx6-Ok?list=PLkA60AVN3hh9gnrYwNO6zTb9U3i1Y9FMY&t=2088)\n\n\n\n\nThis tutorial includes Docker images and an application for Java development using containers. An examples for Eclipse, IntelliJ CE, and Netbeans are provided.\n\n* [Eclipse](Eclipse-README.md)\n* [IntelliJ](IntelliJ-README.md)\n* [NetBeans](NetBeans-README.md)\n\nBefore starting the tutorial, please have [Docker](https://www.docker.com/products/overview) installed.\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/README_es.md",
    "content": "# Tutorial: Depurando Aplicaciones Java en Docker\n\nLos programadores de Java pueden utilizar Docker para construir un ambiente de desarrollo donde puedan ejecutar, testear y depurar el código que está ejecutándose en un contenedor.\n\nDurante la DockerCon 2016 se presentó cómo depurar una aplicación node.js, demostrando así que el desarrollo usando contenedores puede ser utilizado en muchas plataformas y con diferentes lenguajes de programación.\n\n[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/vE1iDPx6-Ok/0.jpg)](https://youtu.be/vE1iDPx6-Ok?list=PLkA60AVN3hh9gnrYwNO6zTb9U3i1Y9FMY&t=2088)\n\nEste tutorial incluye imágenes Docker y una aplicación Java usando contenedores. Incluye además, ejemplos para Eclipse, IntelliJ CE y Netbeans.\n\n* [Eclipse](Eclipse-README_es.md)\n* [IntelliJ](IntelliJ-README_es.md)\n* [NetBeans](NetBeans-README_es.md)\n\nAntes de iniciar el tutorial, debe tener instalado [Docker](https://www.docker.com/products/overview) instalado.\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/.gitignore",
    "content": "/target/\nUserSignup.war\nUserSignup.iml\n.DS_Store \n.classpath\n.project\n/out/\n/src/main/main.iml\n.idea\n.settings\n.classpath\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.docker</groupId>\n  <artifactId>UserSignup</artifactId>\n  <packaging>war</packaging>\n  <version>0.0.1-SNAPSHOT</version>\n  <name>UserSignup Maven Webapp</name>\n  <url>http://maven.apache.org</url>\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-webmvc</artifactId>\n      <version>5.2.21.RELEASE</version>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>servlet-api</artifactId>\n      <version>2.5</version>\n      <scope>provided</scope>\n    </dependency>\n    <dependency>\n      <groupId>javax.servlet</groupId>\n      <artifactId>jstl</artifactId>\n      <version>1.2</version>\n    </dependency>\n    <dependency>\n      <groupId>mysql</groupId>\n      <artifactId>mysql-connector-java</artifactId>\n      <version>8.0.16</version>\n    </dependency>\n    <dependency>\n      <groupId>org.hibernate</groupId>\n      <artifactId>hibernate-validator</artifactId>\n      <version>5.3.6.Final</version>\n    </dependency>\n    <dependency>\n      <groupId>org.hibernate</groupId>\n      <artifactId>hibernate-entitymanager</artifactId>\n      <version>4.1.9.Final</version>\n    </dependency>\n    <dependency>\n      <groupId>javax.transaction</groupId>\n      <artifactId>jta</artifactId>\n      <version>1.1</version>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-jdbc</artifactId>\n      <version>3.2.0.RELEASE</version>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework</groupId>\n      <artifactId>spring-orm</artifactId>\n      <version>3.2.0.RELEASE</version>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.data</groupId>\n      <artifactId>spring-data-jpa</artifactId>\n      <version>~> 1.11.20</version>\n      <exclusions>\n          <exclusion>\n              <groupId>org.springframework</groupId>\n              <artifactId>spring-aop</artifactId>\n          </exclusion>\n      </exclusions>\n    </dependency>\n  </dependencies>\n  <build>\n    <finalName>UserSignup</finalName>\n  </build>\n</project>\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/java/com/docker/UserSignup/controller/UserController.java",
    "content": "package com.docker.UserSignup.controller;\n\nimport javax.validation.Valid;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.validation.BindingResult;\nimport org.springframework.web.bind.annotation.ModelAttribute;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.SessionAttributes;\n\nimport com.docker.UserSignup.model.User;\nimport com.docker.UserSignup.model.UserLogin;\nimport com.docker.UserSignup.service.UserService;\n\n@Controller\n@SessionAttributes(\"user\")\npublic class UserController {\n\t\n\t@Autowired\n\tprivate UserService userService;\n\t\t\n\t@RequestMapping(value=\"/signup\", method=RequestMethod.GET)\n\tpublic String signup(Model model) {\n\t\tUser user = new User();\t\t\n\t\tmodel.addAttribute(\"user\", user);\t\t\n\t\treturn \"signup\";\n\t}\n\t\n\t@RequestMapping(value=\"/signup\", method=RequestMethod.POST)\n\tpublic String signup(@Valid @ModelAttribute(\"user\") User user, BindingResult result, Model model) {\t\t\n\t\tif(result.hasErrors()) {\n\t\t\treturn \"signup\";\n\t\t} else if(userService.findByUserName(user.getUserName())) {\n\t\t\tmodel.addAttribute(\"message\", \"User Name exists. Try another user name\");\n\t\t\treturn \"signup\";\n\t\t} else {\n\t\t\tuserService.save(user);\n\t\t\tmodel.addAttribute(\"message\", \"Saved user details\");\n\t\t\treturn \"redirect:login.html\";\n\t\t}\n\t}\n\n\t@RequestMapping(value=\"/login\", method=RequestMethod.GET)\n\tpublic String login(Model model) {\t\t\t\n\t\tUserLogin userLogin = new UserLogin();\t\t\n\t\tmodel.addAttribute(\"userLogin\", userLogin);\n\t\treturn \"login\";\n\t}\n\t\n\t@RequestMapping(value=\"/login\", method=RequestMethod.POST)\n\tpublic String login(@Valid @ModelAttribute(\"userLogin\") UserLogin userLogin, BindingResult result) {\n\t\tif (result.hasErrors()) {\n\t\t\treturn \"login\";\n\t\t} else {\n\t\t\tboolean found = userService.findByLogin(userLogin.getUserName(), userLogin.getPassword());\n\t\t\tif (found) {\t\t\t\t\n\t\t\t\treturn \"success\";\n\t\t\t} else {\t\t\t\t\n\t\t\t\treturn \"failure\";\n\t\t\t}\n\t\t}\n\t\t\n\t}\n}\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/java/com/docker/UserSignup/model/User.java",
    "content": "package com.docker.UserSignup.model;\n\nimport java.util.Date;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.Table;\nimport javax.validation.constraints.NotNull;\nimport javax.validation.constraints.Past;\nimport javax.validation.constraints.Size;\n\nimport org.hibernate.validator.constraints.Email;\nimport org.hibernate.validator.constraints.NotEmpty;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport com.docker.UserSignup.util.Rot13;\n\n@Entity\n@Table(name=\"user\")\npublic class User {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long id;\n\t\n\t@NotEmpty\n\t@Size(min=4, max=20)\n\tprivate String userName;\n\t\n\t@NotEmpty\n\tprivate String firstName;\n\t\n\t@NotEmpty\n\tprivate String lastName;\n\t\n\t@NotEmpty\n\t@Size(min=4, max=8)\n\tprivate String password;\n\t\n\t@NotEmpty\n\t@Email\n\tprivate String emailAddress;\n\t\n\t@NotNull\n\t@Past\n\t@DateTimeFormat(pattern=\"MM/dd/yyyy\")\n\tprivate Date dateOfBirth;\n\t\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n\tpublic String getFirstName() {\n\t\treturn firstName;\n\t}\n\n\tpublic void setFirstName(String firstName) {\n\t\tthis.firstName = firstName;\n\t}\n\n\tpublic String getLastName() {\n\t\treturn lastName;\n\t}\n\n\tpublic void setLastName(String lastName) {\n\t\tthis.lastName = lastName;\n\t}\n\n\tpublic String getPassword() {\n\t\treturn password;\n\t}\n\n\tpublic void setPassword(String password) {\n\t\tthis.password = Rot13.rot13(password);\n\t}\n\n\tpublic String getEmailAddress() {\n\t\treturn emailAddress;\n\t}\n\n\tpublic void setEmailAddress(String emailAddress) {\n\t\tthis.emailAddress = emailAddress;\n\t}\n\n\tpublic Date getDateOfBirth() {\n\t\treturn dateOfBirth;\n\t}\n\n\tpublic void setDateOfBirth(Date dateOfBirth) {\n\t\tthis.dateOfBirth = dateOfBirth;\n\t}\t\n}\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/java/com/docker/UserSignup/model/UserLogin.java",
    "content": "package com.docker.UserSignup.model;\n\nimport javax.validation.constraints.Size;\n\nimport org.hibernate.validator.constraints.NotEmpty;\n\npublic class UserLogin {\n\n\t@NotEmpty\n\t@Size(min=4, max=20)\n\tprivate String userName;\n\t\t\n\t@NotEmpty\n\t@Size(min=4, max=8)\n\tprivate String password;\n\n\tpublic String getPassword() {\n\t\treturn password;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setPassword(String password) {\n\t\tthis.password = password;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\t\n}\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/java/com/docker/UserSignup/repository/UserRepository.java",
    "content": "package com.docker.UserSignup.repository;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.data.jpa.repository.Query;\nimport org.springframework.data.repository.query.Param;\nimport org.springframework.stereotype.Repository;\n\nimport com.docker.UserSignup.model.User;\n\n@Repository(\"userRepository\")\npublic interface UserRepository extends JpaRepository<User, Long> {\n\t\n\t@Query(\"select s from User s where s.userName = :userName\")\n\tUser findByUserName(@Param(\"userName\") String userName);\n\t\n}\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/java/com/docker/UserSignup/service/UserService.java",
    "content": "package com.docker.UserSignup.service;\n\nimport com.docker.UserSignup.model.User;\n\npublic interface UserService {\n\tUser save(User user);\n\tboolean findByLogin(String userName, String password);\n\tboolean findByUserName(String userName);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/java/com/docker/UserSignup/service/UserServiceImpl.java",
    "content": "package com.docker.UserSignup.service;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport com.docker.UserSignup.model.User;\nimport com.docker.UserSignup.repository.UserRepository;\n\n@Service(\"userService\")\npublic class UserServiceImpl implements UserService {\n\n\t@Autowired\n\tprivate UserRepository userRepository;\n\t\n\t@Transactional\n\tpublic User save(User user) {\n\t\treturn userRepository.save(user);\n\t}\n\n\tpublic boolean findByLogin(String userName, String password) {\t\n\t\tUser usr = userRepository.findByUserName(userName);\n\n\t\tif(usr != null && usr.getPassword().equals(password)) {\n\t\t\treturn true;\n\t\t} \n\t\t\n\t\treturn false;\t\t\n\t}\n\n\tpublic boolean findByUserName(String userName) {\n\t\tUser usr = userRepository.findByUserName(userName);\n\t\t\n\t\tif(usr != null) {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/java/com/docker/UserSignup/util/Rot13.java",
    "content": "package com.docker.UserSignup.util;\n\npublic class Rot13 {\n\n\tpublic static String rot13(String password) {\n\t\t  StringBuilder sb = new StringBuilder();\n\t\t  String passwd = password;\n\t\t   for (int i = 0; i < passwd.length(); i++) {\n\t\t       char c = passwd.charAt(i);\n\t\t       if       (c >= 'a' && c <= 'm') c += 13;\n\t\t       else if  (c >= 'A' && c <= 'M') c += 13;\n\t\t       else if  (c >= 'n' && c <= 'z') c -= 13;\n\t\t       else if  (c >= 'N' && c <= 'Z') c -= 13;\n\t\t       sb.append(c);\n\t\t   }\n\t\t   return sb.toString();\n\t}\n}"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/resources/META-INF/persistence.xml",
    "content": "<persistence xmlns=\"http://java.sun.com/xml/ns/persistence\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"{http://java.sun.com/xml/ns/persistence} {http://java.sun.com/xml/ns/persistence_2_0.xsd}\"\n\tversion=\"2.0\">\n\t\n\t<persistence-unit name=\"punit\">\n\t</persistence-unit>\n\t\n</persistence>"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/resources/jpaContext.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:tx=\"http://www.springframework.org/schema/tx\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txmlns:jpa=\"http://www.springframework.org/schema/data/jpa\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n\t\thttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd\n\t\thttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd\n\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n\t<context:annotation-config />\n\t\n\t<jpa:repositories base-package=\"com.docker.UserSignup.repository\" />\n\t\n\t<bean class=\"org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor\" />\n\n\t<bean id=\"entityManagerFactory\" class=\"org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean\">\n\t\t<property name=\"persistenceUnitName\" value=\"punit\" />\n\t\t<property name=\"dataSource\" ref=\"dataSource\" />\n\t\t<property name=\"jpaVendorAdapter\">\n\t\t\t<bean class=\"org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter\">\n\t\t\t\t<property name=\"showSql\" value=\"true\" />\n\t\t\t</bean>\n\t\t</property>\n\t\t<property name=\"jpaPropertyMap\">\n\t\t\t<map>\n\t\t\t\t<entry key=\"hibernate.dialect\" value=\"org.hibernate.dialect.MySQL5InnoDBDialect\" />\n\t\t\t\t<entry key=\"hibernate.hbm2ddl.auto\" value=\"validate\" />\n\t\t\t\t<entry key=\"hibernate.format_sql\" value=\"true\" />\n\t\t\t</map>\n\t\t</property>\n\t</bean>\n\t\n\t<bean id=\"transactionManager\" class=\"org.springframework.orm.jpa.JpaTransactionManager\">\n\t\t<property name=\"entityManagerFactory\" ref=\"entityManagerFactory\" />\n\t</bean>\n\t\n\t<tx:annotation-driven transaction-manager=\"transactionManager\" />\n\t\n\t<bean id=\"dataSource\" class=\"org.springframework.jdbc.datasource.DriverManagerDataSource\">\n\t\t<property name=\"driverClassName\" value=\"com.mysql.jdbc.Driver\" />\n\t\t<property name=\"url\" value=\"jdbc:mysql://registration-database:3306/dockercon2035\" />\n\t\t<property name=\"username\" value=\"gordon\" />\n\t\t<property name=\"password\" value=\"password\" />\n\t</bean>\n</beans>\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/resources/messages.properties",
    "content": "NotEmpty=Field cannot be blank\nNotNull=Field cannot be blank\n\nEmail=Email Address not valid/well-formed\nPast=Date of Birth must be in the past \n\nSize={0} must be between {2} and {1} characters long\ntypeMismatch=Invalid format"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/WEB-INF/config/servletConfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txmlns:context=\"http://www.springframework.org/schema/context\"\n\txmlns:mvc=\"http://www.springframework.org/schema/mvc\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd\n\t\thttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd\n\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd\">\n\n<mvc:annotation-driven />\n\n<context:component-scan base-package=\"com.docker.UserSignup\" />\n\n<bean class=\"org.springframework.web.servlet.view.InternalResourceViewResolver\">\n\t<property name=\"prefix\" value=\"/WEB-INF/jsp/\" />\n\t<property name=\"suffix\" value=\".jsp\" />\n</bean>\n\n<bean id=\"messageSource\" class=\"org.springframework.context.support.ResourceBundleMessageSource\">\n\t<property name=\"basename\" value=\"messages\" />\n</bean>\n\n</beans>\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/WEB-INF/jsp/failure.jsp",
    "content": "<%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\n\tpageEncoding=\"ISO-8859-1\"%>\n<%@ taglib prefix=\"spring\" uri=\"http://www.springframework.org/tags\"%>\n\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n<title>Login Failure</title>\n<link href=\"assets/css/bootstrap-united.css\" rel=\"stylesheet\" />\n\n</head>\n<body>\n\t<script src=\"jquery-1.8.3.js\">\n\t\t\n\t</script>\n\n\t<script src=\"bootstrap/js/bootstrap.js\">\n\t\t\n\t</script>\n\n\t<div class=\"navbar navbar-default\">\n\n\t\t<div class=\"navbar-header\">\n\t\t\t<button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\"\n\t\t\t\tdata-target=\".navbar-responsive-collapse\">\n\t\t\t\t<span class=\"icon-bar\"></span> <span class=\"icon-bar\"></span> <span\n\t\t\t\t\tclass=\"icon-bar\"></span>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class=\"navbar-collapse collapse navbar-responsive-collapse\">\n\t\t\t<form class=\"navbar-form navbar-right\">\n\t\t\t\t<input type=\"text\" class=\"form-control\" placeholder=\"Search\">\n\t\t\t</form>\n\t\t\t<ul class=\"nav navbar-nav navbar-right\">\n\t\t\t\t<li><a href=\"/UserSignup\">Home</a></li>\n\t\t\t\t<li><a href=\"signup.html\">Signup</a></li>\n\t\t\t\t<li class=\"active\"><a href=\"login.html\">Login</a></li>\n\t\t\t\t<li class=\"dropdown\"><a href=\"#\" class=\"dropdown-toggle\"\n\t\t\t\t\tdata-toggle=\"dropdown\">Explore<b class=\"caret\"></b></a>\n\t\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t\t<li><a href=\"#\">Contact us</a></li>\n\t\t\t\t\t\t<li class=\"divider\"></li>\n\t\t\t\t\t\t<li><a href=\"#\">Further Actions</a></li>\n\t\t\t\t\t</ul></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<!-- /.nav-collapse -->\n\t</div>\n\n\n\t<div class=\"panel panel-danger\">\n\t\t<div class=\"panel-heading\">\n\t\t\t<h3 class=\"panel-title\">DockerCon 2035 login failure</h3>\n\t\t</div>\n\t\t<div class=\"panel-body\">\n\t\t\t<div class=\"alert alert-dismissable alert-danger\">\n\t\t\t\t<button type=\"button\" class=\"close\" data-dismiss=\"alert\"></button>\n\t\t\t\t<strong>Oh snap!</strong> Something is wrong. Check your password\n\t\t\t\tand try submitting again.\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div></div>\n\t<div></div>\n\n\t<a class=\"btn btn-primary\" href=\"<spring:url value=\"login.html\"/>\">Try\n\t\tagain?</a>\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/WEB-INF/jsp/login.jsp",
    "content": "<%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\n\tpageEncoding=\"ISO-8859-1\"%>\n<%@ taglib prefix=\"form\" uri=\"http://www.springframework.org/tags/form\"%>\n\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n<link href=\"assets/css/bootstrap-united.css\" rel=\"stylesheet\" />\n\n<style>\n.error {\n\tcolor: #ff0000;\n\tfont-size: 0.9em;\n\tfont-weight: bold;\n}\n\n.errorblock {\n\tcolor: #000;\n\tbackground-color: #ffEEEE;\n\tborder: 3px solid #ff0000;\n\tpadding: 8px;\n\tmargin: 16px;\n}\n</style>\n<title>User Login</title>\n</head>\n<body>\n\t<script src=\"jquery-1.8.3.js\">\n\t\t\n\t</script>\n\n\t<script src=\"bootstrap/js/bootstrap.js\">\n\t\t\n\t</script>\n\n\t<div class=\"navbar navbar-default\">\n\n\t\t<div class=\"navbar-header\">\n\t\t\t<button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\"\n\t\t\t\tdata-target=\".navbar-responsive-collapse\">\n\t\t\t\t<span class=\"icon-bar\"></span> <span class=\"icon-bar\"></span> <span\n\t\t\t\t\tclass=\"icon-bar\"></span>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class=\"navbar-collapse collapse navbar-responsive-collapse\">\n\t\t\t<form class=\"navbar-form navbar-right\">\n\t\t\t\t<input type=\"text\" class=\"form-control\" placeholder=\"Search\">\n\t\t\t</form>\n\t\t\t<ul class=\"nav navbar-nav navbar-right\">\n\t\t\t\t<li><a href=\"/UserSignup\">Home</a></li>\n\t\t\t\t<li><a href=\"signup.html\">Signup</a></li>\n\t\t\t\t<li class=\"active\"><a href=\"login.html\">Login</a></li>\n\t\t\t\t<li class=\"dropdown\"><a href=\"#\" class=\"dropdown-toggle\"\n\t\t\t\t\tdata-toggle=\"dropdown\">Explore<b class=\"caret\"></b></a>\n\t\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t\t<li><a href=\"#\">Contact us</a></li>\n\t\t\t\t\t\t<li class=\"divider\"></li>\n\t\t\t\t\t\t<li><a href=\"#\">Further Actions</a></li>\n\t\t\t\t\t</ul></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<!-- /.nav-collapse -->\n\t</div>\n\n\t<div class=\"container\">\n\t\t<div class=\"jumbotron\">\n\t\t\t<div>\n\t\t\t\t<h1>Welcome to User Login</h1>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div></div>\n\t</div>\n\n\t<div class=\"col-lg-6 col-lg-offset-3\">\n\t\t<div class=\"well\">\n\t\t\t<div class=\"container\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"col-lg-6\">\n\t\t\t\t\t\t<form:form id=\"myForm\" method=\"post\"\n\t\t\t\t\t\t\tclass=\"bs-example form-horizontal\" commandName=\"userLogin\">\n\t\t\t\t\t\t\t<fieldset>\n\t\t\t\t\t\t\t\t<legend>User Login Form</legend>\n\n\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t<label for=\"userNameInput\" class=\"col-lg-3 control-label\">User\n\t\t\t\t\t\t\t\t\t\tName</label>\n\t\t\t\t\t\t\t\t\t<div class=\"col-lg-9\">\n\t\t\t\t\t\t\t\t\t\t<form:input type=\"text\" class=\"form-control\" path=\"userName\"\n\t\t\t\t\t\t\t\t\t\t\tid=\"userNameInput\" placeholder=\"User Name\" />\n\t\t\t\t\t\t\t\t\t\t<form:errors path=\"userName\" cssClass=\"error\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t<label for=\"passwordInput\" class=\"col-lg-3 control-label\">Password</label>\n\t\t\t\t\t\t\t\t\t<div class=\"col-lg-9\">\n\t\t\t\t\t\t\t\t\t\t<form:input type=\"password\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\tpath=\"password\" id=\"passwordInput\" placeholder=\"Password\" />\n\t\t\t\t\t\t\t\t\t\t<form:errors path=\"password\" cssClass=\"error\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"col-lg-9 col-lg-offset-3\">\n\t\t\t\t\t\t\t\t\t<button class=\"btn btn-default\">Cancel</button>\n\n\t\t\t\t\t\t\t\t\t<button class=\"btn btn-primary\">Login</button>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t</form:form>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/WEB-INF/jsp/signup.jsp",
    "content": "<%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\n\tpageEncoding=\"ISO-8859-1\"%>\n\n<%@ taglib prefix=\"c\" uri=\"http://java.sun.com/jsp/jstl/core\"%>\n<%@ taglib prefix=\"form\" uri=\"http://www.springframework.org/tags/form\"%>\n<%@ taglib prefix=\"spring\" uri=\"http://www.springframework.org/tags\"%>\n\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n<title>User Signup</title>\n<link href=\"bootstrap/css/bootstrap.css\" rel=\"stylesheet\" />\n<link href=\"datepicker/css/datepicker.css\" rel=\"stylesheet\" />\n<link href=\"assets/css/bootstrap-united.css\" rel=\"stylesheet\" />\n\n<style>\n.green {\n\tfont-weight: bold;\n\tcolor: green;\n}\n\n.message {\n\tmargin-bottom: 10px;\n}\n\n.error {\n\tcolor: #ff0000;\n\tfont-size: 0.9em;\n\tfont-weight: bold;\n}\n\n.errorblock {\n\tcolor: #000;\n\tbackground-color: #ffEEEE;\n\tborder: 3px solid #ff0000;\n\tpadding: 8px;\n\tmargin: 16px;\n}\n</style>\n</head>\n<body>\n\n\t<div class=\"navbar navbar-default\">\n\n\t\t<div class=\"navbar-header\">\n\t\t\t<button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\"\n\t\t\t\tdata-target=\".navbar-responsive-collapse\">\n\t\t\t\t<span class=\"icon-bar\"></span> <span class=\"icon-bar\"></span> <span\n\t\t\t\t\tclass=\"icon-bar\"></span>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class=\"navbar-collapse collapse navbar-responsive-collapse\">\n\t\t\t<form class=\"navbar-form navbar-right\">\n\t\t\t\t<input type=\"text\" class=\"form-control\" placeholder=\"Search\">\n\t\t\t</form>\n\t\t\t<ul class=\"nav navbar-nav navbar-right\">\n\t\t\t\t<li><a href=\"/UserSignup\">Home</a></li>\n\t\t\t\t<li class=\"active\"><a href=\"signup.html\">Signup</a></li>\n\t\t\t\t<li><a href=\"login.html\">Login</a></li>\n\t\t\t\t<li class=\"dropdown\"><a href=\"#\" class=\"dropdown-toggle\"\n\t\t\t\t\tdata-toggle=\"dropdown\">Explore<b class=\"caret\"></b></a>\n\t\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t\t<li><a href=\"#\">Contact us</a></li>\n\t\t\t\t\t\t<li class=\"divider\"></li>\n\t\t\t\t\t\t<li><a href=\"#\">Further Actions</a></li>\n\t\t\t\t\t</ul></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<!-- /.nav-collapse -->\n\t</div>\n\n\t<script src=\"jquery-1.8.3.js\">\n\t\t\n\t</script>\n\n\t<script src=\"bootstrap/js/bootstrap.js\">\n\t\t\n\t</script>\n\n\t<script src=\"datepicker/js/bootstrap-datepicker.js\">\n\t\t\n\t</script>\n\n\n\t<div class=\"container\">\n\t\t<div class=\"jumbotron\">\n\t\t\t<div>\n\t\t\t\t<h1>Welcome to Registration</h1>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div></div>\n\t</div>\n\n\t<c:if test=\"${not empty message}\">\n\t\t<div class=\"message green\">${message}</div>\n\t</c:if>\n\n\t<div class=\"col-lg-6 col-lg-offset-3\">\n\t\t<div class=\"well\">\n\t\t\t<div class=\"container\">\n\t\t\t\t<div class=\"row\">\n\t\t\t\t\t<div class=\"col-lg-6\">\n\t\t\t\t\t\t<form:form id=\"myForm\" method=\"post\"\n\t\t\t\t\t\t\tclass=\"bs-example form-horizontal\" commandName=\"user\">\n\t\t\t\t\t\t\t<fieldset>\n\t\t\t\t\t\t\t\t<legend>DockerCon 2035 Signup</legend>\n\n\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t<label for=\"userNameInput\" class=\"col-lg-3 control-label\">User\n\t\t\t\t\t\t\t\t\t\tName</label>\n\t\t\t\t\t\t\t\t\t<div class=\"col-lg-9\">\n\t\t\t\t\t\t\t\t\t\t<form:input type=\"text\" class=\"form-control\" path=\"userName\"\n\t\t\t\t\t\t\t\t\t\t\tid=\"userNameInput\" placeholder=\"User Name\" />\n\t\t\t\t\t\t\t\t\t\t<form:errors path=\"userName\" cssClass=\"error\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t<label for=\"passwordInput\" class=\"col-lg-3 control-label\">Password</label>\n\t\t\t\t\t\t\t\t\t<div class=\"col-lg-9\">\n\t\t\t\t\t\t\t\t\t\t<form:input type=\"password\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\tpath=\"password\" id=\"passwordInput\" placeholder=\"Password\" />\n\t\t\t\t\t\t\t\t\t\t<form:errors path=\"password\" cssClass=\"error\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t<label for=\"firstNameInput\" class=\"col-lg-3 control-label\">First\n\t\t\t\t\t\t\t\t\t\tName</label>\n\t\t\t\t\t\t\t\t\t<div class=\"col-lg-9\">\n\t\t\t\t\t\t\t\t\t\t<form:input type=\"text\" class=\"form-control\" path=\"firstName\"\n\t\t\t\t\t\t\t\t\t\t\tid=\"firstNameInput\" placeholder=\"First Name\" />\n\t\t\t\t\t\t\t\t\t\t<form:errors path=\"firstName\" cssClass=\"error\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t<label for=\"lastNameInput\" class=\"col-lg-3 control-label\">Last\n\t\t\t\t\t\t\t\t\t\tName</label>\n\t\t\t\t\t\t\t\t\t<div class=\"col-lg-9\">\n\t\t\t\t\t\t\t\t\t\t<form:input type=\"text\" class=\"form-control\" path=\"lastName\"\n\t\t\t\t\t\t\t\t\t\t\tid=\"lastNameInput\" placeholder=\"Last Name\" />\n\t\t\t\t\t\t\t\t\t\t<form:errors path=\"lastName\" cssClass=\"error\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t<label for=\"dateOfBirthInput\" class=\"col-lg-3 control-label\">Date\n\t\t\t\t\t\t\t\t\t\tof Birth</label>\n\t\t\t\t\t\t\t\t\t<div class=\"date form_date col-lg-9\" data-date-format=\"mm/dd/yyyy\" data-date-viewmode=\"years\">\n\t\t\t\t\t\t\t\t\t\t<form:input type=\"text\" class=\"form-control\"\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tpath=\"dateOfBirth\" id=\"dateOfBirthInput\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Date of Birth\" />\n\t\t\t\t\t\t\t\t\t\t<form:errors path=\"dateOfBirth\" cssClass=\"error\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t<label for=\"emailAddressInput\" class=\"col-lg-3 control-label\">Email\n\t\t\t\t\t\t\t\t\t\tAddress</label>\n\t\t\t\t\t\t\t\t\t<div class=\"col-lg-9\">\n\t\t\t\t\t\t\t\t\t\t<form:input type=\"text\" class=\"form-control\"\n\t\t\t\t\t\t\t\t\t\t\tpath=\"emailAddress\" id=\"emailAddressInput\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Email Address\" />\n\t\t\t\t\t\t\t\t\t\t<form:errors path=\"emailAddress\" cssClass=\"error\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div class=\"col-lg-9 col-lg-offset-3\">\n\t\t\t\t\t\t\t\t\t<button class=\"btn btn-default\">Cancel</button>\n\n\t\t\t\t\t\t\t\t\t<button class=\"btn btn-primary\" data-toggle=\"modal\"\n\t\t\t\t\t\t\t\t\t\tdata-target=\"#themodal\">Submit</button>\n\t\t\t\t\t\t\t\t\t<div id=\"themodal\" class=\"modal fade\" data-backdrop=\"static\">\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t<div class=\"modal-dialog\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"modal-content\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"modal-header\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button type=\"button\" class=\"close\" data-dismiss=\"modal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\">&times;</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<h3>Signup Form Submission</h3>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"modal-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p>Are you sure you want to do this?</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"progress progress-striped active\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div id=\"doitprogress\" class=\"progress-bar\"></div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"modal-footer\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"#\" class=\"btn btn-default\" data-dismiss=\"modal\">Close</a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"submit\" value=\"Yes\" id=\"yesbutton\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"btn btn-primary\" data-loading-text=\"Saving..\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata-complete-text=\"Submit Complete!\">\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t</form:form>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<script>\n\t\t$(function() {\n\t\t\t$('#dateOfBirthInput').datepicker();\n\t\t});\n\t</script>\n\n\t<script type=\"text/javascript\">\n\t\t$(function() {\n\t\t\tvar yesButton = $(\"#yesbutton\");\n\t\t\tvar progress = $(\"#doitprogress\");\t\t\n\t\t\t\n\t\t\tyesButton.click(function() {\t\t\n\t\t\t\tyesButton.button(\"loading\");\n\n\t\t\t\tvar counter = 0;\n\t\t\t\tvar countDown = function() {\n\t\t\t\t\tcounter++;\n\t\t\t\t\tif (counter == 11) {\n\t\t\t\t\t\tyesButton.button(\"complete\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprogress.width(counter * 10 + \"%\");\n\t\t\t\t\t\tsetTimeout(countDown, 100);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tsetTimeout(countDown, 100);\n\t\t\t});\n\t\t\t\n\t\t});\n\t</script>\n\n\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/WEB-INF/jsp/success.jsp",
    "content": "<%@ page language=\"java\" contentType=\"text/html; charset=ISO-8859-1\"\n\tpageEncoding=\"ISO-8859-1\"%>\n<%@ taglib prefix=\"spring\" uri=\"http://www.springframework.org/tags\"%>\n\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n<title>Login Success</title>\n<link href=\"assets/css/bootstrap-united.css\" rel=\"stylesheet\" />\n\n</head>\n<body>\n\t<script src=\"jquery-1.8.3.js\">\n\t\t\n\t</script>\n\n\t<script src=\"bootstrap/js/bootstrap.js\">\n\t\t\n\t</script>\n\n\t<div class=\"navbar navbar-default\">\n\n\t\t<div class=\"navbar-header\">\n\t\t\t<button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\"\n\t\t\t\tdata-target=\".navbar-responsive-collapse\">\n\t\t\t\t<span class=\"icon-bar\"></span> <span class=\"icon-bar\"></span> <span\n\t\t\t\t\tclass=\"icon-bar\"></span>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class=\"navbar-collapse collapse navbar-responsive-collapse\">\n\t\t\t<form class=\"navbar-form navbar-right\">\n\t\t\t\t<input type=\"text\" class=\"form-control\" placeholder=\"Search\">\n\t\t\t</form>\n\t\t\t<ul class=\"nav navbar-nav navbar-right\">\n\t\t\t\t<li><a href=\"/UserSignup\">Home</a></li>\n\t\t\t\t<li><a href=\"signup.html\">Signup</a></li>\n\t\t\t\t<li class=\"active\"><a href=\"login.html\">Login</a></li>\n\t\t\t\t<li class=\"dropdown\"><a href=\"#\" class=\"dropdown-toggle\"\n\t\t\t\t\tdata-toggle=\"dropdown\">Explore<b class=\"caret\"></b></a>\n\t\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t\t<li><a href=\"#\">Contact us</a></li>\n\t\t\t\t\t\t<li class=\"divider\"></li>\n\t\t\t\t\t\t<li><a href=\"#\">Further Actions</a></li>\n\t\t\t\t\t</ul></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<!-- /.nav-collapse -->\n\t</div>\n\n\t<!-- \n\t<legend>User Login Success</legend>\n\t -->\n\t<div class=\"panel panel-success\">\n\t\t<div class=\"panel-heading\">\n\t\t\t<h3 class=\"panel-title\">DockerCon 2035 Login success</h3>\n\t\t</div>\n\t\t<div class=\"panel-body\">\n\t\t<div class=\"alert alert-dismissable alert-success\">\n              <button type=\"button\" class=\"close\" data-dismiss=\"alert\"></button>\n              <strong>Well done!</strong> You have successfully logged-into the system.<p>\n            </div>\n\t\t</div>\n\t</div>\n\t<div></div>\n\t<div></div>\n\t<a class=\"btn btn-primary\" href=\"<spring:url value=\"login.html\"/>\">Login\n\t\tas different user?</a>\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/WEB-INF/web.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<web-app version=\"2.5\"\nxmlns=\"http://java.sun.com/xml/ns/javaee\"\nxmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\nxsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\">\n\n<servlet>\n  <servlet-name>userHibernateServlet</servlet-name>\n  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>\n  <init-param>\n      <param-name>contextConfigLocation</param-name>\n      <param-value>/WEB-INF/config/servletConfig.xml</param-value>\n  </init-param>\n</servlet>\n\n<servlet-mapping>\n  <servlet-name>userHibernateServlet</servlet-name>\n  <url-pattern>*.html</url-pattern>\n</servlet-mapping>\n\n<context-param>\n  <param-name>contextConfigLocation</param-name>\n  <param-value>classpath:/jpaContext.xml</param-value>\n</context-param>\n\n<listener>\n  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>\n</listener>\n\n  <display-name>Archetype Created Web Application</display-name>\n</web-app>"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/assets/css/bootstrap-united.css",
    "content": "@import url(\"//fonts.googleapis.com/css?family=Ubuntu\");\n\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden],\ntemplate {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na {\n  background: transparent;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Ubuntu\", Tahoma, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\na {\n  color: #dd4814;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #97310e;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall,\n.small {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #aea79f;\n}\n\n.text-primary {\n  color: #dd4814;\n}\n\n.text-primary:hover {\n  color: #ae3910;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-warning:hover {\n  color: #a47e3c;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-danger:hover {\n  color: #953b39;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-success:hover {\n  color: #356635;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-info:hover {\n  color: #2d6987;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Ubuntu\", Tahoma, \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #aea79f;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .small {\n  font-size: 75%;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.list-inline > li:first-child {\n  padding-left: 0;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #aea79f;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #aea79f;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\n\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-pull-12 {\n  right: 100%;\n}\n\n.col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n\n.col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n\n.col-xs-pull-9 {\n  right: 75%;\n}\n\n.col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n\n.col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n\n.col-xs-pull-6 {\n  right: 50%;\n}\n\n.col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n\n.col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n\n.col-xs-pull-3 {\n  right: 25%;\n}\n\n.col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n\n.col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n\n.col-xs-pull-0 {\n  right: 0;\n}\n\n.col-xs-push-12 {\n  left: 100%;\n}\n\n.col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n\n.col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n\n.col-xs-push-9 {\n  left: 75%;\n}\n\n.col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n\n.col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n\n.col-xs-push-6 {\n  left: 50%;\n}\n\n.col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n\n.col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n\n.col-xs-push-3 {\n  left: 25%;\n}\n\n.col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n\n.col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n\n.col-xs-push-0 {\n  left: 0;\n}\n\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\noutput {\n  display: block;\n  padding-top: 9px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  vertical-align: middle;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 38px;\n  padding: 8px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control:-moz-placeholder {\n  color: #aea79f;\n}\n\n.form-control::-moz-placeholder {\n  color: #aea79f;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #aea79f;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #aea79f;\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 56px;\n  padding: 14px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 56px;\n  line-height: 56px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 9px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-control-static {\n  padding-top: 9px;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 8px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #ffffff;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #ffffff;\n  background-color: #aea79f;\n  border-color: #aea79f;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #ffffff;\n  background-color: #9b9389;\n  border-color: #92897e;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #aea79f;\n  border-color: #aea79f;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #dd4814;\n  border-color: #dd4814;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #b83c11;\n  border-color: #a5360f;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #dd4814;\n  border-color: #dd4814;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #efb73e;\n  border-color: #efb73e;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #eca918;\n  border-color: #dd9d12;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #efb73e;\n  border-color: #efb73e;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #df382c;\n  border-color: #df382c;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #c4291e;\n  border-color: #b3251b;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #df382c;\n  border-color: #df382c;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #38b44a;\n  border-color: #38b44a;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #2e953d;\n  border-color: #298537;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #38b44a;\n  border-color: #38b44a;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #772953;\n  border-color: #772953;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #591f3e;\n  border-color: #491933;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #772953;\n  border-color: #772953;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #dd4814;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #97310e;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #aea79f;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 14px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.glyphicon:empty {\n  width: 1em;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #dd4814;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #dd4814;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #aea79f;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #aea79f;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #ffffff;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #ffffff;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 14px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 56px;\n  padding: 14px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 56px;\n  line-height: 56px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 8px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #333333;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 14px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n\n.input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #aea79f;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #aea79f;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #dd4814;\n}\n\n.nav .open > a .caret,\n.nav .open > a:hover .caret,\n.nav .open > a:focus .caret {\n  border-top-color: #97310e;\n  border-bottom-color: #97310e;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #777777;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #dd4814;\n}\n\n.nav-pills > li.active > a .caret,\n.nav-pills > li.active > a:hover .caret,\n.nav-pills > li.active > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #dd4814;\n  border-bottom-color: #dd4814;\n}\n\n.nav a:hover .caret {\n  border-top-color: #97310e;\n  border-bottom-color: #97310e;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: auto;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 6px;\n  margin-right: -15px;\n  margin-bottom: 6px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 6px;\n  margin-bottom: 6px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #dd4814;\n  border-color: #bf3e11;\n}\n\n.navbar-default .navbar-brand {\n  color: #ffffff;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #ffffff;\n  background-color: none;\n}\n\n.navbar-default .navbar-text {\n  color: #ffffff;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #ffffff;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: #97310e;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #ae3910;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #97310e;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #97310e;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #bf3e11;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #ae3910;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #ffffff;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: #97310e;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #ae3910;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #ffffff;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #ffffff;\n}\n\n.navbar-inverse {\n  background-color: #772953;\n  border-color: #511c39;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #ffffff;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: none;\n}\n\n.navbar-inverse .navbar-text {\n  color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: #3e152b;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #511c39;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #3e152b;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #3e152b;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #5c2040;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #511c39;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #511c39;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #ffffff;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: #3e152b;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #511c39;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #ffffff;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #aea79f;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 8px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #aea79f;\n  cursor: default;\n  background-color: #f5f5f5;\n  border-color: #f5f5f5;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #aea79f;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 14px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #aea79f;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #aea79f;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #978e83;\n}\n\n.label-primary {\n  background-color: #dd4814;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #ae3910;\n}\n\n.label-success {\n  background-color: #38b44a;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #2c8d3a;\n}\n\n.label-info {\n  background-color: #772953;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #511c39;\n}\n\n.label-warning {\n  background-color: #efb73e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #e7a413;\n}\n\n.label-danger {\n  background-color: #df382c;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #bc271c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #aea79f;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #dd4814;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #dd4814;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.alert-warning hr {\n  border-top-color: #f8e5be;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger hr {\n  border-top-color: #e6c1c7;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #dd4814;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #38b44a;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #772953;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #efb73e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #df382c;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #dd4814;\n  border-color: #dd4814;\n}\n\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #fad1c3;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table,\n.panel > .table-responsive {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n\n.panel > .table-bordered > thead > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n  border-bottom: 0;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-heading > .dropdown .caret {\n  border-color: #333333 transparent;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #dd4814;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #dd4814;\n  border-color: #dd4814;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dd4814;\n}\n\n.panel-primary > .panel-heading > .dropdown .caret {\n  border-color: #ffffff transparent;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dd4814;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading > .dropdown .caret {\n  border-color: #468847 transparent;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading > .dropdown .caret {\n  border-color: #c09853 transparent;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #fbeed5;\n}\n\n.panel-danger {\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading > .dropdown .caret {\n  border-color: #b94a48 transparent;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #eed3d7;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-heading > .dropdown .caret {\n  border-color: #3a87ad transparent;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  position: relative;\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: rgba(0, 0, 0, 0.9);\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: rgba(0, 0, 0, 0.9);\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: rgba(0, 0, 0, 0.9);\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: rgba(0, 0, 0, 0.9);\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: rgba(0, 0, 0, 0.9);\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: rgba(0, 0, 0, 0.9);\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: rgba(0, 0, 0, 0.9);\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: rgba(0, 0, 0, 0.9);\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: rgba(0, 0, 0, 0.9);\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n.visible-xs,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}\n\n.pagination .active > a,\n.pagination .active > a:hover {\n  border-color: #ddd;\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.affix {\n  position: fixed;\n}"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/bootstrap/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.0.2 by @fat and @mdo\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e0e0e0));\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: -moz-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n\n.btn-primary {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#2d6ca2));\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #2d6ca2;\n  background-position: 0 -15px;\n}\n\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #2d6ca2;\n  border-color: #2b669a;\n}\n\n.btn-success {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#419641));\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -moz-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n\n.btn-warning {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#eb9316));\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -moz-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n\n.btn-danger {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c12e2a));\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -moz-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n\n.btn-info {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#2aabd2));\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -moz-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8));\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #357ebd;\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd));\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n\n.navbar-default {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8));\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f3f3f3));\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);\n  background-image: -moz-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n\n.navbar-inverse {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222));\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n  background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#222222), to(#282828));\n  background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%);\n  background-image: -moz-linear-gradient(top, #222222 0%, #282828 100%);\n  background-image: linear-gradient(to bottom, #222222 0%, #282828 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.alert-success {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc));\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n}\n\n.alert-info {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0));\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n}\n\n.alert-warning {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0));\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n}\n\n.alert-danger {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3));\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n}\n\n.progress {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5));\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n\n.progress-bar {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9));\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n}\n\n.progress-bar-success {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44));\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n\n.progress-bar-info {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5));\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n\n.progress-bar-warning {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f));\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n\n.progress-bar-danger {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c));\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #3071a9;\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3));\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);\n  background-repeat: repeat-x;\n  border-color: #3278b3;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);\n}\n\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.panel-default > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8));\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n\n.panel-primary > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd));\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n\n.panel-success > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6));\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n\n.panel-info > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3));\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n\n.panel-warning > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc));\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n\n.panel-danger > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc));\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n\n.well {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5));\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/bootstrap/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.0.2 by @fat and @mdo\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden],\ntemplate {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na {\n  background: transparent;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall,\n.small {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-primary:hover {\n  color: #3071a9;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-warning:hover {\n  color: #a47e3c;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-danger:hover {\n  color: #953b39;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-success:hover {\n  color: #356635;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-info:hover {\n  color: #2d6987;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .small {\n  font-size: 75%;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.list-inline > li:first-child {\n  padding-left: 0;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\n\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-pull-12 {\n  right: 100%;\n}\n\n.col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n\n.col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n\n.col-xs-pull-9 {\n  right: 75%;\n}\n\n.col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n\n.col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n\n.col-xs-pull-6 {\n  right: 50%;\n}\n\n.col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n\n.col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n\n.col-xs-pull-3 {\n  right: 25%;\n}\n\n.col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n\n.col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n\n.col-xs-pull-0 {\n  right: 0;\n}\n\n.col-xs-push-12 {\n  left: 100%;\n}\n\n.col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n\n.col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n\n.col-xs-push-9 {\n  left: 75%;\n}\n\n.col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n\n.col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n\n.col-xs-push-6 {\n  left: 50%;\n}\n\n.col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n\n.col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n\n.col-xs-push-3 {\n  left: 25%;\n}\n\n.col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n\n.col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n\n.col-xs-push-0 {\n  left: 0;\n}\n\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.glyphicon:empty {\n  width: 1em;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #333333;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n\n.input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .open > a .caret,\n.nav .open > a:hover .caret,\n.nav .open > a:focus .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-pills > li.active > a .caret,\n.nav-pills > li.active > a:hover .caret,\n.nav-pills > li.active > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n\n.nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: auto;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table,\n.panel > .table-responsive {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n\n.panel > .table-bordered > thead > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n  border-bottom: 0;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-heading > .dropdown .caret {\n  border-color: #333333 transparent;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-heading > .dropdown .caret {\n  border-color: #ffffff transparent;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading > .dropdown .caret {\n  border-color: #468847 transparent;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #faebcc;\n}\n\n.panel-warning > .panel-heading > .dropdown .caret {\n  border-color: #c09853 transparent;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #faebcc;\n}\n\n.panel-danger {\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading > .dropdown .caret {\n  border-color: #b94a48 transparent;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-heading > .dropdown .caret {\n  border-color: #3a87ad transparent;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  position: relative;\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n.visible-xs,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/bootstrap/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.0.2 by @fat and @mdo\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\nif (typeof jQuery === \"undefined\") { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.2\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.2\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.2\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.2\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.2\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.2\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    var $el = $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.2\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.2\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.2\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.2\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.2\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.2\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/datepicker/css/datepicker.css",
    "content": "/*!\n * Datepicker for Bootstrap\n *\n * Copyright 2012 Stefan Petre\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n */\n.datepicker {\n  top: 0;\n  left: 0;\n  padding: 4px;\n  margin-top: 1px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  /*.dow {\n    border-top: 1px solid #ddd !important;\n  }*/\n\n}\n.datepicker:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n  top: -7px;\n  left: 6px;\n}\n.datepicker:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  position: absolute;\n  top: -6px;\n  left: 7px;\n}\n.datepicker > div {\n  display: none;\n}\n.datepicker table {\n  width: 100%;\n  margin: 0;\n}\n.datepicker td,\n.datepicker th {\n  text-align: center;\n  width: 20px;\n  height: 20px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.datepicker td.day:hover {\n  background: #eeeeee;\n  cursor: pointer;\n}\n.datepicker td.day.disabled {\n  color: #eeeeee;\n}\n.datepicker td.old,\n.datepicker td.new {\n  color: #999999;\n}\n.datepicker td.active,\n.datepicker td.active:hover {\n  color: #ffffff;\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(to bottom, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #0044cc;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker td.active:hover,\n.datepicker td.active:hover:hover,\n.datepicker td.active:focus,\n.datepicker td.active:hover:focus,\n.datepicker td.active:active,\n.datepicker td.active:hover:active,\n.datepicker td.active.active,\n.datepicker td.active:hover.active,\n.datepicker td.active.disabled,\n.datepicker td.active:hover.disabled,\n.datepicker td.active[disabled],\n.datepicker td.active:hover[disabled] {\n  color: #ffffff;\n  background-color: #0044cc;\n  *background-color: #003bb3;\n}\n.datepicker td.active:active,\n.datepicker td.active:hover:active,\n.datepicker td.active.active,\n.datepicker td.active:hover.active {\n  background-color: #003399 \\9;\n}\n.datepicker td span {\n  display: block;\n  width: 47px;\n  height: 54px;\n  line-height: 54px;\n  float: left;\n  margin: 2px;\n  cursor: pointer;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.datepicker td span:hover {\n  background: #eeeeee;\n}\n.datepicker td span.active {\n  color: #ffffff;\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(to bottom, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #0044cc;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  color: #fff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.datepicker td span.active:hover,\n.datepicker td span.active:focus,\n.datepicker td span.active:active,\n.datepicker td span.active.active,\n.datepicker td span.active.disabled,\n.datepicker td span.active[disabled] {\n  color: #ffffff;\n  background-color: #0044cc;\n  *background-color: #003bb3;\n}\n.datepicker td span.active:active,\n.datepicker td span.active.active {\n  background-color: #003399 \\9;\n}\n.datepicker td span.old {\n  color: #999999;\n}\n.datepicker th.switch {\n  width: 145px;\n}\n.datepicker th.next,\n.datepicker th.prev {\n  font-size: 21px;\n}\n.datepicker thead tr:first-child th {\n  cursor: pointer;\n}\n.datepicker thead tr:first-child th:hover {\n  background: #eeeeee;\n}\n.input-append.date .add-on i,\n.input-prepend.date .add-on i {\n  display: block;\n  cursor: pointer;\n  width: 16px;\n  height: 16px;\n}"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/datepicker/js/bootstrap-datepicker.js",
    "content": "/* =========================================================\n * bootstrap-datepicker.js \n * http://www.eyecon.ro/bootstrap-datepicker\n * =========================================================\n * Copyright 2012 Stefan Petre\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n \n!function( $ ) {\n\t\n\t// Picker object\n\t\n\tvar Datepicker = function(element, options){\n\t\tthis.element = $(element);\n\t\tthis.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy');\n\t\tthis.picker = $(DPGlobal.template)\n\t\t\t\t\t\t\t.appendTo('body')\n\t\t\t\t\t\t\t.on({\n\t\t\t\t\t\t\t\tclick: $.proxy(this.click, this)//,\n\t\t\t\t\t\t\t\t//mousedown: $.proxy(this.mousedown, this)\n\t\t\t\t\t\t\t});\n\t\tthis.isInput = this.element.is('input');\n\t\tthis.component = this.element.is('.date') ? this.element.find('.add-on') : false;\n\t\t\n\t\tif (this.isInput) {\n\t\t\tthis.element.on({\n\t\t\t\tfocus: $.proxy(this.show, this),\n\t\t\t\t//blur: $.proxy(this.hide, this),\n\t\t\t\tkeyup: $.proxy(this.update, this)\n\t\t\t});\n\t\t} else {\n\t\t\tif (this.component){\n\t\t\t\tthis.component.on('click', $.proxy(this.show, this));\n\t\t\t} else {\n\t\t\t\tthis.element.on('click', $.proxy(this.show, this));\n\t\t\t}\n\t\t}\n\t\n\t\tthis.minViewMode = options.minViewMode||this.element.data('date-minviewmode')||0;\n\t\tif (typeof this.minViewMode === 'string') {\n\t\t\tswitch (this.minViewMode) {\n\t\t\t\tcase 'months':\n\t\t\t\t\tthis.minViewMode = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'years':\n\t\t\t\t\tthis.minViewMode = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.minViewMode = 0;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.viewMode = options.viewMode||this.element.data('date-viewmode')||0;\n\t\tif (typeof this.viewMode === 'string') {\n\t\t\tswitch (this.viewMode) {\n\t\t\t\tcase 'months':\n\t\t\t\t\tthis.viewMode = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'years':\n\t\t\t\t\tthis.viewMode = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.viewMode = 0;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.startViewMode = this.viewMode;\n\t\tthis.weekStart = options.weekStart||this.element.data('date-weekstart')||0;\n\t\tthis.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1;\n\t\tthis.onRender = options.onRender;\n\t\tthis.fillDow();\n\t\tthis.fillMonths();\n\t\tthis.update();\n\t\tthis.showMode();\n\t};\n\t\n\tDatepicker.prototype = {\n\t\tconstructor: Datepicker,\n\t\t\n\t\tshow: function(e) {\n\t\t\tthis.picker.show();\n\t\t\tthis.height = this.component ? this.component.outerHeight() : this.element.outerHeight();\n\t\t\tthis.place();\n\t\t\t$(window).on('resize', $.proxy(this.place, this));\n\t\t\tif (e ) {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\tif (!this.isInput) {\n\t\t\t}\n\t\t\tvar that = this;\n\t\t\t$(document).on('mousedown', function(ev){\n\t\t\t\tif ($(ev.target).closest('.datepicker').length == 0) {\n\t\t\t\t\tthat.hide();\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.element.trigger({\n\t\t\t\ttype: 'show',\n\t\t\t\tdate: this.date\n\t\t\t});\n\t\t},\n\t\t\n\t\thide: function(){\n\t\t\tthis.picker.hide();\n\t\t\t$(window).off('resize', this.place);\n\t\t\tthis.viewMode = this.startViewMode;\n\t\t\tthis.showMode();\n\t\t\tif (!this.isInput) {\n\t\t\t\t$(document).off('mousedown', this.hide);\n\t\t\t}\n\t\t\t//this.set();\n\t\t\tthis.element.trigger({\n\t\t\t\ttype: 'hide',\n\t\t\t\tdate: this.date\n\t\t\t});\n\t\t},\n\t\t\n\t\tset: function() {\n\t\t\tvar formated = DPGlobal.formatDate(this.date, this.format);\n\t\t\tif (!this.isInput) {\n\t\t\t\tif (this.component){\n\t\t\t\t\tthis.element.find('input').prop('value', formated);\n\t\t\t\t}\n\t\t\t\tthis.element.data('date', formated);\n\t\t\t} else {\n\t\t\t\tthis.element.prop('value', formated);\n\t\t\t}\n\t\t},\n\t\t\n\t\tsetValue: function(newDate) {\n\t\t\tif (typeof newDate === 'string') {\n\t\t\t\tthis.date = DPGlobal.parseDate(newDate, this.format);\n\t\t\t} else {\n\t\t\t\tthis.date = new Date(newDate);\n\t\t\t}\n\t\t\tthis.set();\n\t\t\tthis.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);\n\t\t\tthis.fill();\n\t\t},\n\t\t\n\t\tplace: function(){\n\t\t\tvar offset = this.component ? this.component.offset() : this.element.offset();\n\t\t\tthis.picker.css({\n\t\t\t\ttop: offset.top + this.height,\n\t\t\t\tleft: offset.left\n\t\t\t});\n\t\t},\n\t\t\n\t\tupdate: function(newDate){\n\t\t\tthis.date = DPGlobal.parseDate(\n\t\t\t\ttypeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')),\n\t\t\t\tthis.format\n\t\t\t);\n\t\t\tthis.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0);\n\t\t\tthis.fill();\n\t\t},\n\t\t\n\t\tfillDow: function(){\n\t\t\tvar dowCnt = this.weekStart;\n\t\t\tvar html = '<tr>';\n\t\t\twhile (dowCnt < this.weekStart + 7) {\n\t\t\t\thtml += '<th class=\"dow\">'+DPGlobal.dates.daysMin[(dowCnt++)%7]+'</th>';\n\t\t\t}\n\t\t\thtml += '</tr>';\n\t\t\tthis.picker.find('.datepicker-days thead').append(html);\n\t\t},\n\t\t\n\t\tfillMonths: function(){\n\t\t\tvar html = '';\n\t\t\tvar i = 0\n\t\t\twhile (i < 12) {\n\t\t\t\thtml += '<span class=\"month\">'+DPGlobal.dates.monthsShort[i++]+'</span>';\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-months td').append(html);\n\t\t},\n\t\t\n\t\tfill: function() {\n\t\t\tvar d = new Date(this.viewDate),\n\t\t\t\tyear = d.getFullYear(),\n\t\t\t\tmonth = d.getMonth(),\n\t\t\t\tcurrentDate = this.date.valueOf();\n\t\t\tthis.picker.find('.datepicker-days th:eq(1)')\n\t\t\t\t\t\t.text(DPGlobal.dates.months[month]+' '+year);\n\t\t\tvar prevMonth = new Date(year, month-1, 28,0,0,0,0),\n\t\t\t\tday = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth());\n\t\t\tprevMonth.setDate(day);\n\t\t\tprevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7);\n\t\t\tvar nextMonth = new Date(prevMonth);\n\t\t\tnextMonth.setDate(nextMonth.getDate() + 42);\n\t\t\tnextMonth = nextMonth.valueOf();\n\t\t\tvar html = [];\n\t\t\tvar clsName,\n\t\t\t\tprevY,\n\t\t\t\tprevM;\n\t\t\twhile(prevMonth.valueOf() < nextMonth) {\n\t\t\t\tif (prevMonth.getDay() === this.weekStart) {\n\t\t\t\t\thtml.push('<tr>');\n\t\t\t\t}\n\t\t\t\tclsName = this.onRender(prevMonth);\n\t\t\t\tprevY = prevMonth.getFullYear();\n\t\t\t\tprevM = prevMonth.getMonth();\n\t\t\t\tif ((prevM < month &&  prevY === year) ||  prevY < year) {\n\t\t\t\t\tclsName += ' old';\n\t\t\t\t} else if ((prevM > month && prevY === year) || prevY > year) {\n\t\t\t\t\tclsName += ' new';\n\t\t\t\t}\n\t\t\t\tif (prevMonth.valueOf() === currentDate) {\n\t\t\t\t\tclsName += ' active';\n\t\t\t\t}\n\t\t\t\thtml.push('<td class=\"day '+clsName+'\">'+prevMonth.getDate() + '</td>');\n\t\t\t\tif (prevMonth.getDay() === this.weekEnd) {\n\t\t\t\t\thtml.push('</tr>');\n\t\t\t\t}\n\t\t\t\tprevMonth.setDate(prevMonth.getDate()+1);\n\t\t\t}\n\t\t\tthis.picker.find('.datepicker-days tbody').empty().append(html.join(''));\n\t\t\tvar currentYear = this.date.getFullYear();\n\t\t\t\n\t\t\tvar months = this.picker.find('.datepicker-months')\n\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t.text(year)\n\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t.find('span').removeClass('active');\n\t\t\tif (currentYear === year) {\n\t\t\t\tmonths.eq(this.date.getMonth()).addClass('active');\n\t\t\t}\n\t\t\t\n\t\t\thtml = '';\n\t\t\tyear = parseInt(year/10, 10) * 10;\n\t\t\tvar yearCont = this.picker.find('.datepicker-years')\n\t\t\t\t\t\t\t\t.find('th:eq(1)')\n\t\t\t\t\t\t\t\t\t.text(year + '-' + (year + 9))\n\t\t\t\t\t\t\t\t\t.end()\n\t\t\t\t\t\t\t\t.find('td');\n\t\t\tyear -= 1;\n\t\t\tfor (var i = -1; i < 11; i++) {\n\t\t\t\thtml += '<span class=\"year'+(i === -1 || i === 10 ? ' old' : '')+(currentYear === year ? ' active' : '')+'\">'+year+'</span>';\n\t\t\t\tyear += 1;\n\t\t\t}\n\t\t\tyearCont.html(html);\n\t\t},\n\t\t\n\t\tclick: function(e) {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tvar target = $(e.target).closest('span, td, th');\n\t\t\tif (target.length === 1) {\n\t\t\t\tswitch(target[0].nodeName.toLowerCase()) {\n\t\t\t\t\tcase 'th':\n\t\t\t\t\t\tswitch(target[0].className) {\n\t\t\t\t\t\t\tcase 'switch':\n\t\t\t\t\t\t\t\tthis.showMode(1);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'prev':\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tthis.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call(\n\t\t\t\t\t\t\t\t\tthis.viewDate,\n\t\t\t\t\t\t\t\t\tthis.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) + \n\t\t\t\t\t\t\t\t\tDPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t\t\tthis.set();\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'span':\n\t\t\t\t\t\tif (target.is('.month')) {\n\t\t\t\t\t\t\tvar month = target.parent().find('span').index(target);\n\t\t\t\t\t\t\tthis.viewDate.setMonth(month);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar year = parseInt(target.text(), 10)||0;\n\t\t\t\t\t\t\tthis.viewDate.setFullYear(year);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (this.viewMode !== 0) {\n\t\t\t\t\t\t\tthis.date = new Date(this.viewDate);\n\t\t\t\t\t\t\tthis.element.trigger({\n\t\t\t\t\t\t\t\ttype: 'changeDate',\n\t\t\t\t\t\t\t\tdate: this.date,\n\t\t\t\t\t\t\t\tviewMode: DPGlobal.modes[this.viewMode].clsName\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.showMode(-1);\n\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\tthis.set();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'td':\n\t\t\t\t\t\tif (target.is('.day') && !target.is('.disabled')){\n\t\t\t\t\t\t\tvar day = parseInt(target.text(), 10)||1;\n\t\t\t\t\t\t\tvar month = this.viewDate.getMonth();\n\t\t\t\t\t\t\tif (target.is('.old')) {\n\t\t\t\t\t\t\t\tmonth -= 1;\n\t\t\t\t\t\t\t} else if (target.is('.new')) {\n\t\t\t\t\t\t\t\tmonth += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar year = this.viewDate.getFullYear();\n\t\t\t\t\t\t\tthis.date = new Date(year, month, day,0,0,0,0);\n\t\t\t\t\t\t\tthis.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0);\n\t\t\t\t\t\t\tthis.fill();\n\t\t\t\t\t\t\tthis.set();\n\t\t\t\t\t\t\tthis.element.trigger({\n\t\t\t\t\t\t\t\ttype: 'changeDate',\n\t\t\t\t\t\t\t\tdate: this.date,\n\t\t\t\t\t\t\t\tviewMode: DPGlobal.modes[this.viewMode].clsName\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\n\t\tmousedown: function(e){\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t},\n\t\t\n\t\tshowMode: function(dir) {\n\t\t\tif (dir) {\n\t\t\t\tthis.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir));\n\t\t\t}\n\t\t\tthis.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show();\n\t\t}\n\t};\n\t\n\t$.fn.datepicker = function ( option, val ) {\n\t\treturn this.each(function () {\n\t\t\tvar $this = $(this),\n\t\t\t\tdata = $this.data('datepicker'),\n\t\t\t\toptions = typeof option === 'object' && option;\n\t\t\tif (!data) {\n\t\t\t\t$this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options))));\n\t\t\t}\n\t\t\tif (typeof option === 'string') data[option](val);\n\t\t});\n\t};\n\n\t$.fn.datepicker.defaults = {\n\t\tonRender: function(date) {\n\t\t\treturn '';\n\t\t}\n\t};\n\t$.fn.datepicker.Constructor = Datepicker;\n\t\n\tvar DPGlobal = {\n\t\tmodes: [\n\t\t\t{\n\t\t\t\tclsName: 'days',\n\t\t\t\tnavFnc: 'Month',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'months',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tclsName: 'years',\n\t\t\t\tnavFnc: 'FullYear',\n\t\t\t\tnavStep: 10\n\t\t}],\n\t\tdates:{\n\t\t\tdays: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"],\n\t\t\tdaysShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n\t\t\tdaysMin: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"],\n\t\t\tmonths: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n\t\t\tmonthsShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\t\t},\n\t\tisLeapYear: function (year) {\n\t\t\treturn (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0))\n\t\t},\n\t\tgetDaysInMonth: function (year, month) {\n\t\t\treturn [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]\n\t\t},\n\t\tparseFormat: function(format){\n\t\t\tvar separator = format.match(/[.\\/\\-\\s].*?/),\n\t\t\t\tparts = format.split(/\\W+/);\n\t\t\tif (!separator || !parts || parts.length === 0){\n\t\t\t\tthrow new Error(\"Invalid date format.\");\n\t\t\t}\n\t\t\treturn {separator: separator, parts: parts};\n\t\t},\n\t\tparseDate: function(date, format) {\n\t\t\tvar parts = date.split(format.separator),\n\t\t\t\tdate = new Date(),\n\t\t\t\tval;\n\t\t\tdate.setHours(0);\n\t\t\tdate.setMinutes(0);\n\t\t\tdate.setSeconds(0);\n\t\t\tdate.setMilliseconds(0);\n\t\t\tif (parts.length === format.parts.length) {\n\t\t\t\tvar year = date.getFullYear(), day = date.getDate(), month = date.getMonth();\n\t\t\t\tfor (var i=0, cnt = format.parts.length; i < cnt; i++) {\n\t\t\t\t\tval = parseInt(parts[i], 10)||1;\n\t\t\t\t\tswitch(format.parts[i]) {\n\t\t\t\t\t\tcase 'dd':\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tday = val;\n\t\t\t\t\t\t\tdate.setDate(val);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mm':\n\t\t\t\t\t\tcase 'm':\n\t\t\t\t\t\t\tmonth = val - 1;\n\t\t\t\t\t\t\tdate.setMonth(val - 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'yy':\n\t\t\t\t\t\t\tyear = 2000 + val;\n\t\t\t\t\t\t\tdate.setFullYear(2000 + val);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'yyyy':\n\t\t\t\t\t\t\tyear = val;\n\t\t\t\t\t\t\tdate.setFullYear(val);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdate = new Date(year, month, day, 0 ,0 ,0);\n\t\t\t}\n\t\t\treturn date;\n\t\t},\n\t\tformatDate: function(date, format){\n\t\t\tvar val = {\n\t\t\t\td: date.getDate(),\n\t\t\t\tm: date.getMonth() + 1,\n\t\t\t\tyy: date.getFullYear().toString().substring(2),\n\t\t\t\tyyyy: date.getFullYear()\n\t\t\t};\n\t\t\tval.dd = (val.d < 10 ? '0' : '') + val.d;\n\t\t\tval.mm = (val.m < 10 ? '0' : '') + val.m;\n\t\t\tvar date = [];\n\t\t\tfor (var i=0, cnt = format.parts.length; i < cnt; i++) {\n\t\t\t\tdate.push(val[format.parts[i]]);\n\t\t\t}\n\t\t\treturn date.join(format.separator);\n\t\t},\n\t\theadTemplate: '<thead>'+\n\t\t\t\t\t\t\t'<tr>'+\n\t\t\t\t\t\t\t\t'<th class=\"prev\">&lsaquo;</th>'+\n\t\t\t\t\t\t\t\t'<th colspan=\"5\" class=\"switch\"></th>'+\n\t\t\t\t\t\t\t\t'<th class=\"next\">&rsaquo;</th>'+\n\t\t\t\t\t\t\t'</tr>'+\n\t\t\t\t\t\t'</thead>',\n\t\tcontTemplate: '<tbody><tr><td colspan=\"7\"></td></tr></tbody>'\n\t};\n\tDPGlobal.template = '<div class=\"datepicker dropdown-menu\">'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-days\">'+\n\t\t\t\t\t\t\t\t'<table class=\" table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\t'<tbody></tbody>'+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-months\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t\t'<div class=\"datepicker-years\">'+\n\t\t\t\t\t\t\t\t'<table class=\"table-condensed\">'+\n\t\t\t\t\t\t\t\t\tDPGlobal.headTemplate+\n\t\t\t\t\t\t\t\t\tDPGlobal.contTemplate+\n\t\t\t\t\t\t\t\t'</table>'+\n\t\t\t\t\t\t\t'</div>'+\n\t\t\t\t\t\t'</div>';\n\n}( window.jQuery );"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/datepicker/less/datepicker.less",
    "content": "/*!\n * Datepicker for Bootstrap\n *\n * Copyright 2012 Stefan Petre\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n */\n \n.datepicker {\n\ttop: 0;\n\tleft: 0;\n\tpadding: 4px;\n\tmargin-top: 1px;\n\t.border-radius(4px);\n\t&:before {\n\t\tcontent: '';\n\t\tdisplay: inline-block;\n\t\tborder-left:   7px solid transparent;\n\t\tborder-right:  7px solid transparent;\n\t\tborder-bottom: 7px solid #ccc;\n\t\tborder-bottom-color: rgba(0,0,0,.2);\n\t\tposition: absolute;\n\t\ttop: -7px;\n\t\tleft: 6px;\n\t}\n\t&:after {\n\t\tcontent: '';\n\t\tdisplay: inline-block;\n\t\tborder-left:   6px solid transparent;\n\t\tborder-right:  6px solid transparent;\n\t\tborder-bottom: 6px solid @white;\n\t\tposition: absolute;\n\t\ttop: -6px;\n\t\tleft: 7px;\n\t}\n\t>div {\n\t\tdisplay: none;\n\t}\n\ttable{\n\t\twidth: 100%;\n\t\tmargin: 0;\n\t}\n\ttd,\n\tth{\n\t\ttext-align: center;\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\t.border-radius(4px);\n\t}\n\ttd {\n\t\t&.day:hover {\n\t\t\tbackground: @grayLighter;\n\t\t\tcursor: pointer;\n\t\t}\n\t\t&.day.disabled {\n\t\t\tcolor: @grayLighter;\n\t\t}\n\t\t&.old,\n\t\t&.new {\n\t\t\tcolor: @grayLight;\n\t\t}\n\t\t&.active,\n\t\t&.active:hover {\n\t\t\t.buttonBackground(@btnPrimaryBackground, spin(@btnPrimaryBackground, 20));\n\t\t\tcolor: #fff;\n\t\t\ttext-shadow: 0 -1px 0 rgba(0,0,0,.25);\n\t\t}\n\t\tspan {\n\t\t\tdisplay: block;\n\t\t\twidth: 47px;\n\t\t\theight: 54px;\n\t\t\tline-height: 54px;\n\t\t\tfloat: left;\n\t\t\tmargin: 2px;\n\t\t\tcursor: pointer;\n\t\t\t.border-radius(4px);\n\t\t\t&:hover {\n\t\t\t\tbackground: @grayLighter;\n\t\t\t}\n\t\t\t&.active {\n\t\t\t\t.buttonBackground(@btnPrimaryBackground, spin(@btnPrimaryBackground, 20));\n\t\t\t\tcolor: #fff;\n\t\t\t\ttext-shadow: 0 -1px 0 rgba(0,0,0,.25);\n\t\t\t}\n\t\t\t&.old {\n\t\t\t\tcolor: @grayLight;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tth {\n\t\t&.switch {\n\t\t\twidth: 145px;\n\t\t}\n\t\t&.next,\n\t\t&.prev {\n\t\t\tfont-size: @baseFontSize * 1.5;\n\t\t}\n\t}\n\t\n\tthead tr:first-child th {\n\t\tcursor: pointer;\n\t\t&:hover{\n\t\t\tbackground: @grayLighter;\n\t\t}\n\t}\n\t/*.dow {\n\t\tborder-top: 1px solid #ddd !important;\n\t}*/\n}\n.input-append,\n.input-prepend {\n\t&.date {\n\t\t.add-on i {\n\t\t\tdisplay: block;\n\t\t\tcursor: pointer;\n\t\t\twidth: 16px;\n\t\t\theight: 16px;\n\t\t}\n\t}\n}"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/index.jsp",
    "content": "<html>\n<head>\n<link href=\"assets/css/bootstrap-united.css\" rel=\"stylesheet\" />\n<link href=\"bootstrap/css/bootstrap-responsive.css\" rel=\"stylesheet\" />\n<style>\nbody {\n\theight: 100%;\n\tmargin: 0;\n\tbackground: url(assets/img/dockercon2035.png);\n\tbackground-size: 1440px 800px;\n\tbackground-repeat: no-repeat;\n\tdisplay: compact;\n}\n</style>\n</head>\n<body>\n\t<div class=\"navbar navbar-default\">\n\n\t\t<div class=\"navbar-header\">\n\t\t\t<button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\"\n\t\t\t\tdata-target=\".navbar-responsive-collapse\">\n\t\t\t\t<span class=\"icon-bar\"></span> <span class=\"icon-bar\"></span> <span\n\t\t\t\t\tclass=\"icon-bar\"></span>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class=\"navbar-collapse collapse navbar-responsive-collapse\">\n\t\t\t<form class=\"navbar-form navbar-right\">\n\t\t\t\t<input type=\"text\" class=\"form-control\" placeholder=\"Search\">\n\t\t\t</form>\n\t\t\t<ul class=\"nav navbar-nav navbar-right\">\n\t\t\t\t<li class=\"active\"><a href=\"#\">Home</a></li>\n\t\t\t\t<li><a href=\"signup.html\">Signup</a></li>\n\t\t\t\t<li><a href=\"login.html\">Login</a></li>\n\t\t\t\t<li class=\"dropdown\"><a href=\"#\" class=\"dropdown-toggle\"\n\t\t\t\t\tdata-toggle=\"dropdown\">Explore<b class=\"caret\"></b></a>\n\t\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t\t<li><a href=\"#\">Contact us</a></li>\n\t\t\t\t\t\t<li class=\"divider\"></li>\n\t\t\t\t\t\t<li><a href=\"#\">Further Actions</a></li>\n\t\t\t\t\t</ul></li>\n\t\t\t</ul>\n\t\t</div>\n\t\t<!-- /.nav-collapse -->\n\t</div>\n\t<div class=\"container\">\n\t\t<div class=\"jumbotron\">\n\t\t\t<div>\n\t\t\t\t<h1>Welcome to DockerCon 2035 Registration!</h1>\n\t\t\t\t<p>To get started, enter your details to register. \n\t\t\t\t\tOr login to access your details, if you are already registered.</p>\n\t\t\t</div>\n\n\t\t\t<a class=\"btn btn-primary\" href=\"signup.html\">Signup</a> <a\n\t\t\t\tclass=\"btn btn-primary\" href=\"login.html\">Login</a>\n\t\t</div>\n\n\t\t<div></div>\n\t</div>\n\t<script src=\"jquery-1.8.3.js\">\n</script>\n\n\t<script src=\"bootstrap/js/bootstrap.js\">\n</script>\n\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/app/src/main/webapp/jquery-1.8.3.js",
    "content": "/*!\n * jQuery JavaScript Library v1.8.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)\n */\n(function( window, undefined ) {\nvar\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\tlocation = window.location,\n\tnavigator = window.navigator,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// Save a reference to some core methods\n\tcore_push = Array.prototype.push,\n\tcore_slice = Array.prototype.slice,\n\tcore_indexOf = Array.prototype.indexOf,\n\tcore_toString = Object.prototype.toString,\n\tcore_hasOwn = Object.prototype.hasOwnProperty,\n\tcore_trim = String.prototype.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source,\n\n\t// Used for detecting and trimming whitespace\n\tcore_rnotwhite = /\\S/,\n\tcore_rspace = /\\s+/,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\trquickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn ( letter + \"\" ).toUpperCase();\n\t},\n\n\t// The ready event handler and self cleanup method\n\tDOMContentLoaded = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\t\tjQuery.ready();\n\t\t} else if ( document.readyState === \"complete\" ) {\n\t\t\t// we're here because readyState === \"complete\" in oldIE\n\t\t\t// which is good enough for us to call the dom ready!\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\n\t// [[Class]] -> type pairs\n\tclass2type = {};\n\njQuery.fn = jQuery.prototype = {\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem, ret, doc;\n\n\t\t// Handle $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\t\t\t\t\tdoc = ( context && context.nodeType ? context.ownerDocument || context : document );\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tselector = jQuery.parseHTML( match[1], doc, true );\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tthis.attr.call( selector, context, true );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.8.3\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + ( this.selector ? \" \" : \"\" ) + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\teq: function( i ) {\n\t\ti = +i;\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, i + 1 );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ),\n\t\t\t\"slice\", core_slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\treturn obj == null ?\n\t\t\tString( obj ) :\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// scripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, scripts ) {\n\t\tvar parsed;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tscripts = context;\n\t\t\tcontext = 0;\n\t\t}\n\t\tcontext = context || document;\n\n\t\t// Single tag\n\t\tif ( (parsed = rsingleTag.exec( data )) ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );\n\t\treturn jQuery.merge( [],\n\t\t\t(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\tif ( !data || typeof data !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\treturn ( new Function( \"return \" + data ) )();\n\n\t\t}\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && core_rnotwhite.test( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar name,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in obj ) {\n\t\t\t\t\tif ( callback.apply( obj[ name ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.apply( obj[ i++ ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in obj ) {\n\t\t\t\t\tif ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar type,\n\t\t\tret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n\t\t\ttype = jQuery.type( arr );\n\n\t\t\tif ( arr.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( arr ) ) {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value, key,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\t// jquery objects are treated as arrays\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( key in elems ) {\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, pass ) {\n\t\tvar exec,\n\t\t\tbulk = key == null,\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\n\t\t// Sets many values\n\t\tif ( key && typeof key === \"object\" ) {\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], 1, emptyGet, value );\n\t\t\t}\n\t\t\tchainable = 1;\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\t// Optionally, function values get executed if exec is true\n\t\t\texec = pass === undefined && jQuery.isFunction( value );\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations only iterate when executing function values\n\t\t\t\tif ( exec ) {\n\t\t\t\t\texec = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn exec.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\n\t\t\t\t// Otherwise they run against the entire set\n\t\t\t\t} else {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor (; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchainable = 1;\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready, 1 );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.split( core_rspace ), function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Control if a given callback is in the list\n\t\t\thas: function( fn ) {\n\t\t\t\treturn jQuery.inArray( fn, list ) > -1;\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\targs = args || [];\n\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ]( jQuery.isFunction( fn ) ?\n\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\tvar returned = fn.apply( this, arguments );\n\t\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} :\n\t\t\t\t\t\t\t\tnewDefer[ action ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ] = list.fire\n\t\t\tdeferred[ tuple[0] ] = list.fire;\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function() {\n\n\tvar support,\n\t\tall,\n\t\ta,\n\t\tselect,\n\t\topt,\n\t\tinput,\n\t\tfragment,\n\t\teventName,\n\t\ti,\n\t\tisSupported,\n\t\tclickFn,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Support tests won't run in some limited or non-browser environments\n\tall = div.getElementsByTagName(\"*\");\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !all || !a || !all.length ) {\n\t\treturn {};\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: ( a.getAttribute(\"href\") === \"/a\" ),\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.5/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: ( input.value === \"on\" ),\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Tests for enctype support on a form (#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode\n\t\tboxModel: ( document.compatMode === \"CSS1Compat\" ),\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tboxSizingReliable: true,\n\t\tpixelPosition: false\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent( \"onclick\", clickFn = function() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\t\tdiv.cloneNode( true ).fireEvent(\"onclick\");\n\t\tdiv.detachEvent( \"onclick\", clickFn );\n\t}\n\n\t// Check if a radio maintains its value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute( \"checked\", \"checked\" );\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( div.lastChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tfragment.removeChild( input );\n\tfragment.appendChild( div );\n\n\t// Technique from Juriy Zaytsev\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif ( div.attachEvent ) {\n\t\tfor ( i in {\n\t\t\tsubmit: true,\n\t\t\tchange: true,\n\t\t\tfocusin: true\n\t\t}) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = ( eventName in div );\n\t\t\tif ( !isSupported ) {\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\n\t\t\t}\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\n\t\t}\n\t}\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, div, tds, marginDiv,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;overflow:hidden;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px\";\n\t\tbody.insertBefore( container, body.firstChild );\n\n\t\t// Construct the test element\n\t\tdiv = document.createElement(\"div\");\n\t\tcontainer.appendChild( div );\n\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\t// (only IE 8 fails this test)\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\t// (IE <= 8 fail this test)\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\t\tsupport.boxSizing = ( div.offsetWidth === 4 );\n\t\tsupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );\n\n\t\t// NOTE: To any future maintainer, we've window.getComputedStyle\n\t\t// because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. For more\n\t\t\t// info see bug #3333\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = document.createElement(\"div\");\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\t\t\tdiv.appendChild( marginDiv );\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\t// (IE < 8 does this)\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\t// (IE 6 does this)\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.style.overflow = \"visible\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tcontainer.style.zoom = 1;\n\t\t}\n\n\t\t// Null elements to avoid leaks in IE\n\t\tbody.removeChild( container );\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tfragment.removeChild( div );\n\tall = a = select = opt = input = fragment = div = null;\n\n\treturn support;\n})();\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\njQuery.extend({\n\tcache: {},\n\n\tdeletedIds: [],\n\n\t// Remove at next major release (1.9/2.0)\n\tuuid: 0,\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, ret,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tgetByName = typeof name === \"string\",\n\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t\t// can't GC object references properly across the DOM-JS boundary\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t\t// attached directly to the object so GC can occur automatically\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t\t// Avoid doing any more work than we need to when trying to get data on an\n\t\t// object that has no data at all\n\t\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !id ) {\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t\t// ends up in the global cache\n\t\t\tif ( isNode ) {\n\t\t\t\telem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;\n\t\t\t} else {\n\t\t\t\tid = internalKey;\n\t\t\t}\n\t\t}\n\n\t\tif ( !cache[ id ] ) {\n\t\t\tcache[ id ] = {};\n\n\t\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\n\t\t\t// is serialized using JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\t\t}\n\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t\t// shallow copied over onto the existing cache\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\t\tif ( pvt ) {\n\t\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t\t} else {\n\t\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t\t}\n\t\t}\n\n\t\tthisCache = cache[ id ];\n\n\t\t// jQuery data() is stored in a separate object inside the object's internal data\n\t\t// cache in order to avoid key collisions between internal data and user-defined\n\t\t// data.\n\t\tif ( !pvt ) {\n\t\t\tif ( !thisCache.data ) {\n\t\t\t\tthisCache.data = {};\n\t\t\t}\n\n\t\t\tthisCache = thisCache.data;\n\t\t}\n\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t\t}\n\n\t\t// Check for both converted-to-camel and non-converted data property names\n\t\t// If a data property was specified\n\t\tif ( getByName ) {\n\n\t\t\t// First Try to find as-is property data\n\t\t\tret = thisCache[ name ];\n\n\t\t\t// Test for null|undefined property data\n\t\t\tif ( ret == null ) {\n\n\t\t\t\t// Try to find the camelCased property\n\t\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t\t}\n\t\t} else {\n\t\t\tret = thisCache;\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, i, l,\n\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\t\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t\t// If there is already no cache entry for this object, there is no\n\t\t// purpose in continuing\n\t\tif ( !cache[ id ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( name ) {\n\n\t\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\t\tif ( thisCache ) {\n\n\t\t\t\t// Support array or space separated string names for data keys\n\t\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\t\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t\t}\n\n\t\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t\t// and let the cache object itself get destroyed\n\t\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See jQuery.data for more information\n\t\tif ( !pvt ) {\n\t\t\tdelete cache[ id ].data;\n\n\t\t\t// Don't destroy the parent cache unless the internal data object\n\t\t\t// had been the only thing left in it\n\t\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Destroy the cache\n\t\tif ( isNode ) {\n\t\t\tjQuery.cleanData( [ elem ], true );\n\n\t\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t\tdelete cache[ id ];\n\n\t\t// When all else fails, null\n\t\t} else {\n\t\t\tcache[ id ] = null;\n\t\t}\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn jQuery.data( elem, name, data, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar parts, part, attr, name, l,\n\t\t\telem = this[0],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattr = elem.attributes;\n\t\t\t\t\tfor ( l = attr.length; i < l; i++ ) {\n\t\t\t\t\t\tname = attr[i].name;\n\n\t\t\t\t\t\tif ( !name.indexOf( \"data-\" ) ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tparts = key.split( \".\", 2 );\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\t\tpart = parts[1] + \"!\";\n\n\t\treturn jQuery.access( this, function( value ) {\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\tdata = this.triggerHandler( \"getData\" + part, [ parts[0] ] );\n\n\t\t\t\t// Try to fetch any internally stored data first\n\t\t\t\tif ( data === undefined && elem ) {\n\t\t\t\t\tdata = jQuery.data( elem, key );\n\t\t\t\t\tdata = dataAttr( elem, key, data );\n\t\t\t\t}\n\n\t\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\t\tdata;\n\t\t\t}\n\n\t\t\tparts[1] = value;\n\t\t\tthis.each(function() {\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.triggerHandler( \"setData\" + part, parts );\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t\tself.triggerHandler( \"changeData\" + part, parts );\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, false );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery.removeData( elem, type + \"queue\", true );\n\t\t\t\tjQuery.removeData( elem, key, true );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook, fixSpecified,\n\trclass = /[\\t\\r\\n]/g,\n\trreturn = /\\r/g,\n\trtype = /^(?:button|input)$/i,\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\n\trclickable = /^a(?:rea|)$/i,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classNames, i, l, elem,\n\t\t\tsetClass, c, cl;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\n\t\tif ( value && typeof value === \"string\" ) {\n\t\t\tclassNames = value.split( core_rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className && classNames.length === 1 ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetClass = \" \" + elem.className + \" \";\n\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( setClass.indexOf( \" \" + classNames[ c ] + \" \" ) < 0 ) {\n\t\t\t\t\t\t\t\tsetClass += classNames[ c ] + \" \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar removes, className, elem, c, cl, i, l;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tremoves = ( value || \"\" ).split( core_rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\n\t\t\t\t\tclassName = (\" \" + elem.className + \" \").replace( rclass, \" \" );\n\n\t\t\t\t\t// loop over each item in the removal list\n\t\t\t\t\tfor ( c = 0, cl = removes.length; c < cl; c++ ) {\n\t\t\t\t\t\t// Remove until there is nothing to remove,\n\t\t\t\t\t\twhile ( className.indexOf(\" \" + removes[ c ] + \" \") >= 0 ) {\n\t\t\t\t\t\t\tclassName = className.replace( \" \" + removes[ c ] + \" \" , \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( className ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( core_rspace );\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val,\n\t\t\t\tself = jQuery(this);\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\t// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9\n\tattrFn: {},\n\n\tattr: function( elem, name, value, pass ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( notxml ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\tret = elem.getAttribute( name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret === null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar propName, attrNames, name, isBool,\n\t\t\ti = 0;\n\n\t\tif ( value && elem.nodeType === 1 ) {\n\n\t\t\tattrNames = value.split( core_rspace );\n\n\t\t\tfor ( ; i < attrNames.length; i++ ) {\n\t\t\t\tname = attrNames[ i ];\n\n\t\t\t\tif ( name ) {\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\t\t\tisBool = rboolean.test( name );\n\n\t\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t\t// Do not do this for boolean attributes (see #10870)\n\t\t\t\t\tif ( !isBool ) {\n\t\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t\t}\n\t\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\t\t\tif ( isBool && propName in elem ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to it's default in case type is set after value\n\t\t\t\t\t// This is for element creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Use the value property for back compat\n\t\t// Use the nodeHook for button elements in IE6/7 (#1954)\n\t\tvalue: {\n\t\t\tget: function( elem, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.get( elem, name );\n\t\t\t\t}\n\t\t\t\treturn name in elem ?\n\t\t\t\t\telem.value :\n\t\t\t\t\tnull;\n\t\t\t},\n\t\t\tset: function( elem, value, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.set( elem, value, name );\n\t\t\t\t}\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.value = value;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn ( elem[ name ] = value );\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\t// Align boolean attributes with corresponding properties\n\t\t// Fall back to attribute presence where some booleans are not supported\n\t\tvar attrNode,\n\t\t\tproperty = jQuery.prop( elem, name );\n\t\treturn property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tvar propName;\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\t// value is true since we know at this point it's type boolean and not false\n\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\tif ( propName in elem ) {\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\telem[ propName ] = true;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t}\n\t\treturn name;\n\t}\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\tfixSpecified = {\n\t\tname: true,\n\t\tid: true,\n\t\tcoords: true\n\t};\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret;\n\t\t\tret = elem.getAttributeNode( name );\n\t\t\treturn ret && ( fixSpecified[ name ] ? ret.value !== \"\" : ret.specified ) ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\tret = document.createAttribute( name );\n\t\t\t\telem.setAttributeNode( ret );\n\t\t\t}\n\t\t\treturn ( ret.value = value + \"\" );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tget: nodeHook.get,\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = \"false\";\n\t\t\t}\n\t\t\tnodeHook.set( elem, value, name );\n\t\t}\n\t};\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret === null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Normalize to lowercase since IE uppercases css property names\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t});\n}\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t});\n});\nvar rformElems = /^(?:textarea|input|select)$/i,\n\trtypenamespace = /^([^\\.]*|)(?:\\.(.+)|)$/,\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+|)\\b/,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\thoverHack = function( events ) {\n\t\treturn jQuery.event.special.hover ? events : events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\n\t};\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar elemData, eventHandle, events,\n\t\t\tt, tns, type, namespaces, handleObj,\n\t\t\thandleObjIn, handlers, special;\n\n\t\t// Don't attach events to noData or text/comment nodes (allow plain objects tho)\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tevents = elemData.events;\n\t\tif ( !events ) {\n\t\t\telemData.events = events = {};\n\t\t}\n\t\teventHandle = elemData.handle;\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = jQuery.trim( hoverHack(types) ).split( \" \" );\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = tns[1];\n\t\t\tnamespaces = ( tns[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: tns[1],\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\thandlers = events[ type ];\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar t, tns, type, origType, namespaces, origCount,\n\t\t\tj, events, special, eventType, handleObj,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = jQuery.trim( hoverHack( types || \"\" ) ).split(\" \");\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tns[1];\n\t\t\tnamespaces = tns[2];\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector? special.delegateType : special.bindType ) || type;\n\t\t\teventType = events[ type ] || [];\n\t\t\torigCount = eventType.length;\n\t\t\tnamespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null;\n\n\t\t\t// Remove matching events\n\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\n\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t ( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t ( !namespaces || namespaces.test( handleObj.namespace ) ) &&\n\t\t\t\t\t ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\teventType.splice( j--, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\teventType.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( eventType.length === 0 && origCount !== eventType.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery.removeData( elem, \"events\", true );\n\t\t}\n\t},\n\n\t// Events that are safe to short-circuit if no handlers are attached.\n\t// Native DOM events should not be added, they may have inline handlers.\n\tcustomEvent: {\n\t\t\"getData\": true,\n\t\t\"setData\": true,\n\t\t\"changeData\": true\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Event object or event type\n\t\tvar cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,\n\t\t\ttype = event.type || event,\n\t\t\tnamespaces = [];\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \"!\" ) >= 0 ) {\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\n\t\t\ttype = type.slice(0, -1);\n\t\t\texclusive = true;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an Event, Object, or just an event type string\n\t\tevent = typeof event === \"object\" ?\n\t\t\t// jQuery.Event object\n\t\t\tevent[ jQuery.expando ] ? event :\n\t\t\t// Object literal\n\t\t\tnew jQuery.Event( type, event ) :\n\t\t\t// Just the event type (string)\n\t\t\tnew jQuery.Event( type );\n\n\t\tevent.type = type;\n\t\tevent.isTrigger = true;\n\t\tevent.exclusive = exclusive;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null;\n\t\tontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\n\n\t\t// Handle a global trigger\n\t\tif ( !elem ) {\n\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\n\t\t\tcache = jQuery.cache;\n\t\t\tfor ( i in cache ) {\n\t\t\t\tif ( cache[ i ].events && cache[ i ].events[ type ] ) {\n\t\t\t\t\tjQuery.event.trigger( event, data, cache[ i ].handle.elem, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data != null ? jQuery.makeArray( data ) : [];\n\t\tdata.unshift( event );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\teventPath = [[ elem, special.bindType || type ]];\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tcur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;\n\t\t\tfor ( old = elem; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push([ cur, bubbleType ]);\n\t\t\t\told = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( old === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\tfor ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {\n\n\t\t\tcur = eventPath[i][0];\n\t\t\tevent.type = eventPath[i][1];\n\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\t\t\t// Note that this is a bare JS function and not a jQuery handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486)\n\t\t\t\tif ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\told = elem[ ontype ];\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = old;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event || window.event );\n\n\t\tvar i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,\n\t\t\thandlers = ( (jQuery._data( this, \"events\" ) || {} )[ event.type ] || []),\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\targs = core_slice.call( arguments ),\n\t\t\trun_all = !event.exclusive && !event.namespace,\n\t\t\tspecial = jQuery.event.special[ event.type ] || {},\n\t\t\thandlerQueue = [];\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers that should run if there are delegated events\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && !(event.button && event.type === \"click\") ) {\n\n\t\t\tfor ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tselMatch = {};\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\t\t\t\t\t\tsel = handleObj.selector;\n\n\t\t\t\t\t\tif ( selMatch[ sel ] === undefined ) {\n\t\t\t\t\t\t\tselMatch[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( selMatch[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, matches: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( handlers.length > delegateCount ) {\n\t\t\thandlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\tfor ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\n\t\t\tmatched = handlerQueue[ i ];\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tfor ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {\n\t\t\t\thandleObj = matched.matches[ j ];\n\n\t\t\t\t// Triggered event must either 1) be non-exclusive and have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.data = handleObj.data;\n\t\t\t\t\tevent.handleObj = handleObj;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tevent.result = ret;\n\t\t\t\t\t\tif ( ret === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\t// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\n\tprops: \"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( i = copy.length; i; ) {\n\t\t\tprop = copy[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Target should not be a text node (#504, Safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\n\t\tfocus: {\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{ type: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\n// Some plugins are using, but it's undocumented/deprecated and will be removed.\n// The 1.7 special event interface should provide all the hooks needed now.\njQuery.event.handle = jQuery.event.dispatch;\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === \"undefined\" ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj,\n\t\t\t\tselector = handleObj.selector;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"_submit_attached\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"_submit_attached\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"_change_attached\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"_change_attached\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) { // && selector != null\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tlive: function( types, data, fn ) {\n\t\tjQuery( this.context ).on( types, this.selector, data, fn );\n\t\treturn this;\n\t},\n\tdie: function( types, fn ) {\n\t\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\n\t\treturn this;\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tif ( this[0] ) {\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments,\n\t\t\tguid = fn.guid || jQuery.guid++,\n\t\t\ti = 0,\n\t\t\ttoggler = function( event ) {\n\t\t\t\t// Figure out which function to execute\n\t\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t\t// Make sure that clicks stop\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// and execute the function\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t\t};\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\ttoggler.guid = guid;\n\t\twhile ( i < args.length ) {\n\t\t\targs[ i++ ].guid = guid;\n\t\t}\n\n\t\treturn this.click( toggler );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\tif ( fn == null ) {\n\t\t\tfn = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n\n\tif ( rkeyEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\n\t}\n\n\tif ( rmouseEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\n\t}\n});\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n(function( window, undefined ) {\n\nvar cachedruns,\n\tassertGetIdNotName,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcontains,\n\tcompile,\n\tsortOrder,\n\thasDuplicate,\n\toutermostContext,\n\n\tbaseHasDuplicate = true,\n\tstrundefined = \"undefined\",\n\n\texpando = ( \"sizcache\" + Math.random() ).replace( \".\", \"\" ),\n\n\tToken = String,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\tdirruns = 0,\n\tdone = 0,\n\tpop = [].pop,\n\tpush = [].push,\n\tslice = [].slice,\n\t// Use a stripped-down indexOf if a native one is unavailable\n\tindexOf = [].indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\t// Augment a function for special use by Sizzle\n\tmarkFunction = function( fn, value ) {\n\t\tfn[ expando ] = value == null || value;\n\t\treturn fn;\n\t},\n\n\tcreateCache = function() {\n\t\tvar cache = {},\n\t\t\tkeys = [];\n\n\t\treturn markFunction(function( key, value ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tif ( keys.push( key ) > Expr.cacheLength ) {\n\t\t\t\tdelete cache[ keys.shift() ];\n\t\t\t}\n\n\t\t\t// Retrieve with (key + \" \") to avoid collision with native Object.prototype properties (see Issue #157)\n\t\t\treturn (cache[ key + \" \" ] = value);\n\t\t}, cache );\n\t},\n\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\n\t// Regex\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[-\\\\w]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments not in parens/brackets,\n\t//   then attribute selectors and non-pseudos (denoted by :),\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\2|([^()[\\\\]]*|(?:(?:\" + attributes + \")|[^:]|\\\\\\\\.)*|.*))\\\\)|)\",\n\n\t// For matchExpr.POS and matchExpr.needsContext\n\tpos = \":(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w\\-]+)|(\\w+)|\\.([\\w\\-]+))$/,\n\n\trnot = /^:not/,\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\trendsWithNot = /:not\\($/,\n\n\trheader = /h\\d/i,\n\trinputs = /input|select|textarea|button/i,\n\n\trbackslash = /\\\\(?!\\\\)/g,\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"POS\": new RegExp( pos, \"i\" ),\n\t\t\"CHILD\": new RegExp( \"^:(only|nth|first|last)-child(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|\" + pos, \"i\" )\n\t},\n\n\t// Support\n\n\t// Used for testing something on an element\n\tassert = function( fn ) {\n\t\tvar div = document.createElement(\"div\");\n\n\t\ttry {\n\t\t\treturn fn( div );\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t} finally {\n\t\t\t// release memory in IE\n\t\t\tdiv = null;\n\t\t}\n\t},\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tassertTagNameNoComments = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t}),\n\n\t// Check if getAttribute returns normalized href attributes\n\tassertHrefNotNormalized = assert(function( div ) {\n\t\tdiv.innerHTML = \"<a href='#'></a>\";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}),\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tassertAttributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"<select></select>\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t}),\n\n\t// Check if getElementsByClassName can be trusted\n\tassertUsableClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"<div class='hidden e'></div><div class='hidden'></div>\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t}),\n\n\t// Check if getElementById returns elements by name\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\tassertUsableName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\tdiv.innerHTML = \"<a name='\" + expando + \"'></a><div name='\" + expando + \"'></div>\";\n\t\tdocElem.insertBefore( div, docElem.firstChild );\n\n\t\t// Test\n\t\tvar pass = document.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdocument.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdocument.getElementsByName( expando + 0 ).length;\n\t\tassertGetIdNotName = !document.getElementById( expando );\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n// If slice is not available, provide a backup\ntry {\n\tslice.call( docElem.childNodes, 0 )[0].nodeType;\n} catch ( e ) {\n\tslice = function( i ) {\n\t\tvar elem,\n\t\t\tresults = [];\n\t\tfor ( ; (elem = this[i]); i++ ) {\n\t\t\tresults.push( elem );\n\t\t}\n\t\treturn results;\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tresults = results || [];\n\tcontext = context || document;\n\tvar match, elem, xml, m,\n\t\tnodeType = context.nodeType;\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( nodeType !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\txml = isXML( context );\n\n\tif ( !xml && !seed ) {\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed, xml );\n}\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\treturn Sizzle( expr, null, null, [ elem ] ).length > 0;\n};\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( nodeType ) {\n\t\tif ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t\t// Use textContent for elements\n\t\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\t\treturn elem.textContent;\n\t\t\t} else {\n\t\t\t\t// Traverse its children\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\t\tret += getText( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\t\t// Do not include comment or processing instruction nodes\n\t} else {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t}\n\treturn ret;\n};\n\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Element contains another\ncontains = Sizzle.contains = docElem.contains ?\n\tfunction( a, b ) {\n\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\tbup = b && b.parentNode;\n\t\treturn a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\n\t} :\n\tdocElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\t\treturn b && !!( a.compareDocumentPosition( b ) & 16 );\n\t} :\n\tfunction( a, b ) {\n\t\twhile ( (b = b.parentNode) ) {\n\t\t\tif ( b === a ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\nSizzle.attr = function( elem, name ) {\n\tvar val,\n\t\txml = isXML( elem );\n\n\tif ( !xml ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( xml || assertAttributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\tval = elem.getAttributeNode( name );\n\treturn val ?\n\t\ttypeof elem[ name ] === \"boolean\" ?\n\t\t\telem[ name ] ? name : null :\n\t\t\tval.specified ? val.value : null :\n\t\tnull;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\t// IE6/7 return a modified href\n\tattrHandle: assertHrefNotNormalized ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t},\n\n\tfind: {\n\t\t\"ID\": assertGetIdNotName ?\n\t\t\tfunction( id, context, xml ) {\n\t\t\t\tif ( typeof context.getElementById !== strundefined && !xml ) {\n\t\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t\t}\n\t\t\t} :\n\t\t\tfunction( id, context, xml ) {\n\t\t\t\tif ( typeof context.getElementById !== strundefined && !xml ) {\n\t\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\t\treturn m ?\n\t\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t\t[m] :\n\t\t\t\t\t\t\tundefined :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\"TAG\": assertTagNameNoComments ?\n\t\t\tfunction( tag, context ) {\n\t\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t\t}\n\t\t\t} :\n\t\t\tfunction( tag, context ) {\n\t\t\t\tvar results = context.getElementsByTagName( tag );\n\n\t\t\t\t// Filter out possible comments\n\t\t\t\tif ( tag === \"*\" ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\ttmp = [],\n\t\t\t\t\t\ti = 0;\n\n\t\t\t\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\treturn results;\n\t\t\t},\n\n\t\t\"NAME\": assertUsableName && function( tag, context ) {\n\t\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\t\treturn context.getElementsByName( name );\n\t\t\t}\n\t\t},\n\n\t\t\"CLASS\": assertUsableClassName && function( className, context, xml ) {\n\t\t\tif ( typeof context.getElementsByClassName !== strundefined && !xml ) {\n\t\t\t\treturn context.getElementsByClassName( className );\n\t\t\t}\n\t\t}\n\t},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( rbackslash, \"\" );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( rbackslash, \"\" );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t3 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t4 sign of xn-component\n\t\t\t\t5 x of xn-component\n\t\t\t\t6 sign of y-component\n\t\t\t\t7 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\t// nth-child requires argument\n\t\t\t\tif ( !match[2] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === \"even\" || match[2] === \"odd\" ) );\n\t\t\t\tmatch[4] = +( ( match[6] + match[7] ) || match[2] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar unquoted, excess;\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[3];\n\t\t\t} else if ( (unquoted = match[4]) ) {\n\t\t\t\t// Only check arguments that contain a pseudo\n\t\t\t\tif ( rpseudo.test(unquoted) &&\n\t\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t\t// excess is a negative index\n\t\t\t\t\tunquoted = unquoted.slice( 0, excess );\n\t\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\t}\n\t\t\t\tmatch[2] = unquoted;\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\t\t\"ID\": assertGetIdNotName ?\n\t\t\tfunction( id ) {\n\t\t\t\tid = id.replace( rbackslash, \"\" );\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\treturn elem.getAttribute(\"id\") === id;\n\t\t\t\t};\n\t\t\t} :\n\t\t\tfunction( id ) {\n\t\t\t\tid = id.replace( rbackslash, \"\" );\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\t\treturn node && node.value === id;\n\t\t\t\t};\n\t\t\t},\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\t\t\tnodeName = nodeName.replace( rbackslash, \"\" ).toLowerCase();\n\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ expando ][ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem, context ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.substr( result.length - check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.substr( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, argument, first, last ) {\n\n\t\t\tif ( type === \"nth\" ) {\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\tvar node, diff,\n\t\t\t\t\t\tparent = elem.parentNode;\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( parent ) {\n\t\t\t\t\t\tdiff = 0;\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tdiff++;\n\t\t\t\t\t\t\t\tif ( elem === node ) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Incorporate the offset (or cast to NaN), then check against cycle size\n\t\t\t\t\tdiff -= last;\n\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = elem;\n\n\t\t\t\tswitch ( type ) {\n\t\t\t\t\tcase \"only\":\n\t\t\t\t\tcase \"first\":\n\t\t\t\t\t\twhile ( (node = node.previousSibling) ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type === \"first\" ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnode = elem;\n\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tcase \"last\":\n\t\t\t\t\t\twhile ( (node = node.nextSibling) ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tvar nodeType;\n\t\t\telem = elem.firstChild;\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telem = elem.nextSibling;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar type, attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\t(type = elem.type) === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === type );\n\t\t},\n\n\t\t// Input types\n\t\t\"radio\": createInputPseudo(\"radio\"),\n\t\t\"checkbox\": createInputPseudo(\"checkbox\"),\n\t\t\"file\": createInputPseudo(\"file\"),\n\t\t\"password\": createInputPseudo(\"password\"),\n\t\t\"image\": createInputPseudo(\"image\"),\n\n\t\t\"submit\": createButtonPseudo(\"submit\"),\n\t\t\"reset\": createButtonPseudo(\"reset\"),\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\tvar doc = elem.ownerDocument;\n\t\t\treturn elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t\"active\": function( elem ) {\n\t\t\treturn elem === elem.ownerDocument.activeElement;\n\t\t},\n\n\t\t// Positional types\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tfor ( var i = 0; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tfor ( var i = 1; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tfor ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tfor ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nfunction siblingCheck( a, b, ret ) {\n\tif ( a === b ) {\n\t\treturn ret;\n\t}\n\n\tvar cur = a.nextSibling;\n\n\twhile ( cur ) {\n\t\tif ( cur === b ) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tcur = cur.nextSibling;\n\t}\n\n\treturn 1;\n}\n\nsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\n\t\t\ta.compareDocumentPosition :\n\t\t\ta.compareDocumentPosition(b) & 4\n\t\t) ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn a.sourceIndex - b.sourceIndex;\n\t\t}\n\n\t\tvar al, bl,\n\t\t\tap = [],\n\t\t\tbp = [],\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tcur = aup;\n\n\t\t// If the nodes are siblings (or identical) we can do a quick check\n\t\tif ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\n\t\t// If no parents were found then the nodes are disconnected\n\t\t} else if ( !aup ) {\n\t\t\treturn -1;\n\n\t\t} else if ( !bup ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\t// Otherwise they're somewhere else in the tree so we need\n\t\t// to build up a full list of the parentNodes for comparison\n\t\twhile ( cur ) {\n\t\t\tap.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tcur = bup;\n\n\t\twhile ( cur ) {\n\t\t\tbp.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tal = ap.length;\n\t\tbl = bp.length;\n\n\t\t// Start walking down the tree looking for a discrepancy\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\n\t\t\tif ( ap[i] !== bp[i] ) {\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\n\t\t\t}\n\t\t}\n\n\t\t// We ended someplace up the tree so do a sibling check\n\t\treturn i === al ?\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\n\t\t\tsiblingCheck( ap[i], b, 1 );\n\t};\n\n// Always assume the presence of duplicates if sort doesn't\n// pass them to our comparison function (as in Google Chrome).\n[0, 0].sort( sortOrder );\nbaseHasDuplicate = !hasDuplicate;\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\ti = 1,\n\t\tj = 0;\n\n\thasDuplicate = baseHasDuplicate;\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\tif ( elem === results[ i - 1 ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ expando ][ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\ttokens.push( matched = new Token( match.shift() ) );\n\t\t\tsoFar = soFar.slice( matched.length );\n\n\t\t\t// Cast descendant combinators to space\n\t\t\tmatched.type = match[0].replace( rtrim, \" \" );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\n\t\t\t\ttokens.push( matched = new Token( match.shift() ) );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t\tmatched.type = type;\n\t\t\t\tmatched.matches = match;\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && combinator.dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( checkNonElements || elem.nodeType === 1  ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( !xml ) {\n\t\t\t\tvar cache,\n\t\t\t\t\tdirkey = dirruns + \" \" + doneName + \" \",\n\t\t\t\t\tcachedkey = dirkey + cachedruns;\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( checkNonElements || elem.nodeType === 1 ) {\n\t\t\t\t\t\tif ( (cache = elem[ expando ]) === cachedkey ) {\n\t\t\t\t\t\t\treturn elem.sizset;\n\t\t\t\t\t\t} else if ( typeof cache === \"string\" && cache.indexOf(dirkey) === 0 ) {\n\t\t\t\t\t\t\tif ( elem.sizset ) {\n\t\t\t\t\t\t\t\treturn elem;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ expando ] = cachedkey;\n\t\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\t\telem.sizset = true;\n\t\t\t\t\t\t\t\treturn elem;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telem.sizset = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( checkNonElements || elem.nodeType === 1 ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && tokens.slice( 0, i - 1 ).join(\"\").replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && tokens.join(\"\")\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Nested matchers should use non-integer dirruns\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = superMatcher.el;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tfor ( j = 0; (matcher = elementMatchers[j]); j++ ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++superMatcher.el;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tfor ( j = 0; (matcher = setMatchers[j]); j++ ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\tsuperMatcher.el = 0;\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ expando ][ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed, xml ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector ),\n\t\tj = match.length;\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && !xml &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = Expr.find[\"ID\"]( token.matches[0].replace( rbackslash, \"\" ), context, xml )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\tfor ( i = matchExpr[\"POS\"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( rbackslash, \"\" ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context,\n\t\t\t\t\t\txml\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && tokens.join(\"\");\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, slice.call( seed, 0 ) );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\txml,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\nif ( document.querySelectorAll ) {\n\t(function() {\n\t\tvar disconnectedMatch,\n\t\t\toldSelect = select,\n\t\t\trescape = /'|\\\\/g,\n\t\t\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t\t\t// qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA\n\t\t\t// A support test would require too much code (would include document ready)\n\t\t\trbuggyQSA = [ \":focus\" ],\n\n\t\t\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\t\t\t// A support test would require too much code (would include document ready)\n\t\t\t// just skip matchesSelector for :active\n\t\t\trbuggyMatches = [ \":active\" ],\n\t\t\tmatches = docElem.matchesSelector ||\n\t\t\t\tdocElem.mozMatchesSelector ||\n\t\t\t\tdocElem.webkitMatchesSelector ||\n\t\t\t\tdocElem.oMatchesSelector ||\n\t\t\t\tdocElem.msMatchesSelector;\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explictly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here (do not put tests after this one)\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE9 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"<p test=''></p>\";\n\t\t\tif ( div.querySelectorAll(\"[test^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here (do not put tests after this one)\n\t\t\tdiv.innerHTML = \"<input type='hidden'/>\";\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push(\":enabled\", \":disabled\");\n\t\t\t}\n\t\t});\n\n\t\t// rbuggyQSA always contains :focus, so no need for a length check\n\t\trbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join(\"|\") );\n\n\t\tselect = function( selector, context, results, seed, xml ) {\n\t\t\t// Only use querySelectorAll when not filtering,\n\t\t\t// when this is not xml,\n\t\t\t// and when no QSA bugs apply\n\t\t\tif ( !seed && !xml && !rbuggyQSA.test( selector ) ) {\n\t\t\t\tvar groups, i,\n\t\t\t\t\told = true,\n\t\t\t\t\tnid = expando,\n\t\t\t\t\tnewContext = context,\n\t\t\t\t\tnewSelector = context.nodeType === 9 && selector;\n\n\t\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t\t// IE 8 doesn't work on object elements\n\t\t\t\tif ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t\t}\n\t\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = nid + groups[i].join(\"\");\n\t\t\t\t\t}\n\t\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results, slice.call( newContext.querySelectorAll(\n\t\t\t\t\t\t\tnewSelector\n\t\t\t\t\t\t), 0 ) );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch(qsaError) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn oldSelect( selector, context, results, seed, xml );\n\t\t};\n\n\t\tif ( matches ) {\n\t\t\tassert(function( div ) {\n\t\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t\t// on a disconnected node (IE 9)\n\t\t\t\tdisconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t\t// This should fail with an exception\n\t\t\t\t// Gecko does not error, returns false instead\n\t\t\t\ttry {\n\t\t\t\t\tmatches.call( div, \"[test!='']:sizzle\" );\n\t\t\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t\t\t} catch ( e ) {}\n\t\t\t});\n\n\t\t\t// rbuggyMatches always contains :active and :focus, so no need for a length check\n\t\t\trbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join(\"|\") );\n\n\t\t\tSizzle.matchesSelector = function( elem, expr ) {\n\t\t\t\t// Make sure that attribute selectors are quoted\n\t\t\t\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t\t\t\t// rbuggyMatches always contains :active, so no need for an existence check\n\t\t\t\tif ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\t\t\t\tif ( ret || disconnectedMatch ||\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(e) {}\n\t\t\t\t}\n\n\t\t\t\treturn Sizzle( expr, null, null, [ elem ] ).length > 0;\n\t\t\t};\n\t\t}\n\t})();\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Back-compat\nfunction setFilters() {}\nExpr.filters = setFilters.prototype = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i, l, length, n, r, ret,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tret = this.pushStack( \"\", \"find\", selector );\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && (\n\t\t\ttypeof selector === \"string\" ?\n\t\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\t\trneedsContext.test( selector ) ?\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t}\n\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\treturn this.pushStack( ret, \"closest\", selectors );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( this.length > 1 && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, core_slice.call( arguments ).join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn ( elem === qualifier ) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\trnocache = /<(?:script|object|embed|option|style)/i,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trcheckableType = /^(?:checkbox|radio)$/,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /\\/(java|ecma)script/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)|[\\]\\-]{2}>\\s*$/g,\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n// unless wrapped in a div with non-breaking characters in front of it.\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"X<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tvar set = jQuery.clean( arguments );\n\t\t\treturn this.pushStack( jQuery.merge( set, this ), \"before\", this.selector );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tvar set = jQuery.clean( arguments );\n\t\t\treturn this.pushStack( jQuery.merge( this, set ), \"after\", this.selector );\n\t\t}\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName( \"*\" ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function( value ) {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery( value ).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling,\n\t\t\t\t\tparent = this.parentNode;\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn this.length ?\n\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n\t\t\tthis;\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = [].concat.apply( [], args );\n\n\t\tvar results, first, fragment, iNoClone,\n\t\t\ti = 0,\n\t\t\tvalue = args[0],\n\t\t\tscripts = [],\n\t\t\tl = this.length;\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && l > 1 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call( this, i, table ? self.html() : undefined );\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tresults = jQuery.buildFragment( args, this, scripts );\n\t\t\tfragment = results.fragment;\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\t// Fragments from the fragment cache must always be cloned and never used in place.\n\t\t\t\tfor ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable && jQuery.nodeName( this[i], \"table\" ) ?\n\t\t\t\t\t\t\tfindOrAppend( this[i], \"tbody\" ) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\ti === iNoClone ?\n\t\t\t\t\t\t\tfragment :\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\tfragment = first = null;\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, function( i, elem ) {\n\t\t\t\t\tif ( elem.src ) {\n\t\t\t\t\t\tif ( jQuery.ajax ) {\n\t\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\t\turl: elem.src,\n\t\t\t\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\t\t\t\tdataType: \"script\",\n\t\t\t\t\t\t\t\tasync: false,\n\t\t\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\t\t\t\"throws\": true\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.error(\"no ajax\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction findOrAppend( elem, tag ) {\n\treturn elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction cloneFixAttributes( src, dest ) {\n\tvar nodeName;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// clearAttributes removes the attributes, which we don't want,\n\t// but also removes the attachEvent events, which we *do* want\n\tif ( dest.clearAttributes ) {\n\t\tdest.clearAttributes();\n\t}\n\n\t// mergeAttributes, in contrast, only merges back on the\n\t// original attributes, not the events\n\tif ( dest.mergeAttributes ) {\n\t\tdest.mergeAttributes( src );\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\tif ( nodeName === \"object\" ) {\n\t\t// IE6-10 improperly clones children of object elements using classid.\n\t\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\n\t// IE blanks contents when cloning scripts\n\t} else if ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdest.text = src.text;\n\t}\n\n\t// Event data gets referenced instead of copied if the expando\n\t// gets copied too\n\tdest.removeAttribute( jQuery.expando );\n}\n\njQuery.buildFragment = function( args, context, scripts ) {\n\tvar fragment, cacheable, cachehit,\n\t\tfirst = args[ 0 ];\n\n\t// Set context from what may come in as undefined or a jQuery collection or a node\n\t// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &\n\t// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception\n\tcontext = context || document;\n\tcontext = !context.nodeType && context[0] || context;\n\tcontext = context.ownerDocument || context;\n\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\t// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501\n\tif ( args.length === 1 && typeof first === \"string\" && first.length < 512 && context === document &&\n\t\tfirst.charAt(0) === \"<\" && !rnocache.test( first ) &&\n\t\t(jQuery.support.checkClone || !rchecked.test( first )) &&\n\t\t(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {\n\n\t\t// Mark cacheable and look for a hit\n\t\tcacheable = true;\n\t\tfragment = jQuery.fragments[ first ];\n\t\tcachehit = fragment !== undefined;\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = context.createDocumentFragment();\n\t\tjQuery.clean( args, context, fragment, scripts );\n\n\t\t// Update the cache, but only store false\n\t\t// unless this is a second parsing of the same content\n\t\tif ( cacheable ) {\n\t\t\tjQuery.fragments[ first ] = cachehit && fragment;\n\t\t}\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tl = insert.length,\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\tif ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\t\t} else {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\telems = ( i > 0 ? this.clone(true) : this ).get();\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\nfunction getAll( elem ) {\n\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\treturn elem.getElementsByTagName( \"*\" );\n\n\t} else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\n\t\treturn elem.querySelectorAll( \"*\" );\n\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar srcElements,\n\t\t\tdestElements,\n\t\t\ti,\n\t\t\tclone;\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\n\t\t\t// Calling detachEvent on the clone will also remove the events\n\t\t\t// from the original. In order to get around this, we use some\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\n\t\t\t// guys for this hotness.\n\n\t\t\tcloneFixAttributes( elem, clone );\n\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName instead\n\t\t\tsrcElements = getAll( elem );\n\t\t\tdestElements = getAll( clone );\n\n\t\t\t// Weird iteration because IE will replace the length property\n\t\t\t// with an element if you are cloning the body and one of the\n\t\t\t// elements on the page has a name or id of \"length\"\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tcloneCopyEvent( elem, clone );\n\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = getAll( elem );\n\t\t\t\tdestElements = getAll( clone );\n\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsrcElements = destElements = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tvar i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,\n\t\t\tsafe = context === document && safeFragment,\n\t\t\tret = [];\n\n\t\t// Ensure that context is a document\n\t\tif ( !context || typeof context.createDocumentFragment === \"undefined\" ) {\n\t\t\tcontext = document;\n\t\t}\n\n\t\t// Use the already-created safe fragment if context permits\n\t\tfor ( i = 0; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" ) {\n\t\t\t\tif ( !rhtml.test( elem ) ) {\n\t\t\t\t\telem = context.createTextNode( elem );\n\t\t\t\t} else {\n\t\t\t\t\t// Ensure a safe container in which to render the html\n\t\t\t\t\tsafe = safe || createSafeFragment( context );\n\t\t\t\t\tdiv = context.createElement(\"div\");\n\t\t\t\t\tsafe.appendChild( div );\n\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\tdepth = wrap[0];\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t\t// Move to the right depth\n\t\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\thasBody = rtbody.test(elem);\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\telem = div.childNodes;\n\n\t\t\t\t\t// Take out of fragment container (we need a fresh div each time)\n\t\t\t\t\tdiv.parentNode.removeChild( div );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from safeFragment\n\t\tif ( div ) {\n\t\t\telem = div = safe = null;\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tfor ( i = 0; (elem = ret[i]) != null; i++ ) {\n\t\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tfixDefaultChecked( elem );\n\t\t\t\t} else if ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Append elements to a provided document fragment\n\t\tif ( fragment ) {\n\t\t\t// Special handling of each script element\n\t\t\thandleScript = function( elem ) {\n\t\t\t\t// Check if we consider it executable\n\t\t\t\tif ( !elem.type || rscriptType.test( elem.type ) ) {\n\t\t\t\t\t// Detach the script and store it in the scripts array (if provided) or the fragment\n\t\t\t\t\t// Return truthy to indicate that it has been handled\n\t\t\t\t\treturn scripts ?\n\t\t\t\t\t\tscripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :\n\t\t\t\t\t\tfragment.appendChild( elem );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfor ( i = 0; (elem = ret[i]) != null; i++ ) {\n\t\t\t\t// Check if we're done after handling an executable script\n\t\t\t\tif ( !( jQuery.nodeName( elem, \"script\" ) && handleScript( elem ) ) ) {\n\t\t\t\t\t// Append to fragment and handle embedded scripts\n\t\t\t\t\tfragment.appendChild( elem );\n\t\t\t\t\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\t\t\t// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration\n\t\t\t\t\t\tjsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName(\"script\") ), handleScript );\n\n\t\t\t\t\t\t// Splice the scripts into ret after their former ancestor and advance our index beyond them\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t\ti += jsTags.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar data, id, elem, type,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjQuery.deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n// Limit scope pollution from any deprecated API\n(function() {\n\nvar matched, browser;\n\n// Use of jQuery.browser is frowned upon.\n// More details: http://api.jquery.com/jQuery.browser\n// jQuery.uaMatch maintained for back-compat\njQuery.uaMatch = function( ua ) {\n\tua = ua.toLowerCase();\n\n\tvar match = /(chrome)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(msie) ([\\w.]+)/.exec( ua ) ||\n\t\tua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec( ua ) ||\n\t\t[];\n\n\treturn {\n\t\tbrowser: match[ 1 ] || \"\",\n\t\tversion: match[ 2 ] || \"0\"\n\t};\n};\n\nmatched = jQuery.uaMatch( navigator.userAgent );\nbrowser = {};\n\nif ( matched.browser ) {\n\tbrowser[ matched.browser ] = true;\n\tbrowser.version = matched.version;\n}\n\n// Chrome is Webkit, but Webkit is also Safari.\nif ( browser.chrome ) {\n\tbrowser.webkit = true;\n} else if ( browser.webkit ) {\n\tbrowser.safari = true;\n}\n\njQuery.browser = browser;\n\njQuery.sub = function() {\n\tfunction jQuerySub( selector, context ) {\n\t\treturn new jQuerySub.fn.init( selector, context );\n\t}\n\tjQuery.extend( true, jQuerySub, this );\n\tjQuerySub.superclass = this;\n\tjQuerySub.fn = jQuerySub.prototype = this();\n\tjQuerySub.fn.constructor = jQuerySub;\n\tjQuerySub.sub = this.sub;\n\tjQuerySub.fn.init = function init( selector, context ) {\n\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\tcontext = jQuerySub( context );\n\t\t}\n\n\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t};\n\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\tvar rootjQuerySub = jQuerySub(document);\n\treturn jQuerySub;\n};\n\n})();\nvar curCSS, iframe, iframeDoc,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity=([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([-+])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ],\n\n\teventsToggle = jQuery.fn.toggle;\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar elem, display,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && elem.style.display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\tdisplay = curCSS( elem, \"display\" );\n\n\t\t\tif ( !values[ index ] && display !== \"none\" ) {\n\t\t\t\tjQuery._data( elem, \"olddisplay\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state, fn2 ) {\n\t\tvar bool = typeof state === \"boolean\";\n\n\t\tif ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {\n\t\t\treturn eventsToggle.apply( this, arguments );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( bool ? state : isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, numeric, extra ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( numeric || extra !== undefined ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn numeric || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\n// NOTE: To any future maintainer, we've window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tcurCSS = function( elem, name ) {\n\t\tvar ret, width, minWidth, maxWidth,\n\t\t\tcomputed = window.getComputedStyle( elem, null ),\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tcurCSS = function( elem, name ) {\n\t\tvar left, rsLeft,\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\t// we use jQuery.css instead of curCSS here\n\t\t\t// because of the reliableMarginRight CSS hook!\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true );\n\t\t}\n\n\t\t// From this point on we use curCSS for maximum performance (relevant in animations)\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= parseFloat( curCSS( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= parseFloat( curCSS( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += parseFloat( curCSS( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += parseFloat( curCSS( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tvalueIsBorderBox = true,\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\" ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox\n\t\t)\n\t) + \"px\";\n}\n\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tif ( elemdisplay[ nodeName ] ) {\n\t\treturn elemdisplay[ nodeName ];\n\t}\n\n\tvar elem = jQuery( \"<\" + nodeName + \">\" ).appendTo( document.body ),\n\t\tdisplay = elem.css(\"display\");\n\telem.remove();\n\n\t// If the simple way fails,\n\t// get element's real default display by attaching it to a temp iframe\n\tif ( display === \"none\" || display === \"\" ) {\n\t\t// Use the already-created iframe if possible\n\t\tiframe = document.body.appendChild(\n\t\t\tiframe || jQuery.extend( document.createElement(\"iframe\"), {\n\t\t\t\tframeBorder: 0,\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t})\n\t\t);\n\n\t\t// Create a cacheable copy of the iframe document on first call.\n\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\n\t\t// document to it; WebKit & Firefox won't allow reusing the iframe document.\n\t\tif ( !iframeDoc || !iframe.createElement ) {\n\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n\t\t\tiframeDoc.write(\"<!doctype html><html><body>\");\n\t\t\tiframeDoc.close();\n\t\t}\n\n\t\telem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );\n\n\t\tdisplay = curCSS( elem, \"display\" );\n\t\tdocument.body.removeChild( iframe );\n\t}\n\n\t// Store the correct default display\n\telemdisplay[ nodeName ] = display;\n\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\tif ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, \"display\" ) ) ) {\n\t\t\t\t\treturn jQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\" ) === \"border-box\"\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\tif ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there there is no filter style applied in a css rule, we are done\n\t\t\t\tif ( currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\treturn curCSS( elem, \"marginRight\" );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tvar ret = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + \"px\" : ret;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\treturn ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i,\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ],\n\t\t\t\texpanded = {};\n\n\t\t\tfor ( i = 0; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n\trselectTextarea = /^(?:select|textarea)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\n\t\t\t\t\trinput.test( this.type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val, i ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t// to force array serialization to be shallow.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\n\trhash = /#.*$/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trquery = /\\?/,\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\trts = /([?&])_=[^&]*/,\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = [\"*/\"] + [\"*\"];\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType, list, placeBefore,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),\n\t\t\ti = 0,\n\t\t\tlength = dataTypes.length;\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tdataType = dataTypes[ i ];\n\t\t\t\t// We control if we're asked to add before\n\t\t\t\t// any existing element\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\n\t\t\t\tif ( placeBefore ) {\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\n\t\t\t\t}\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\n\t\t\t\t// then we add to the structure accordingly\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\n\t\tdataType /* internal */, inspected /* internal */ ) {\n\n\tdataType = dataType || options.dataTypes[ 0 ];\n\tinspected = inspected || {};\n\n\tinspected[ dataType ] = true;\n\n\tvar selection,\n\t\tlist = structure[ dataType ],\n\t\ti = 0,\n\t\tlength = list ? list.length : 0,\n\t\texecuteOnly = ( structure === prefilters );\n\n\tfor ( ; i < length && ( executeOnly || !selection ); i++ ) {\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\n\t\t// If we got redirected to another dataType\n\t\t// we try there if executing only and not done already\n\t\tif ( typeof selection === \"string\" ) {\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\n\t\t\t\tselection = undefined;\n\t\t\t} else {\n\t\t\t\toptions.dataTypes.unshift( selection );\n\t\t\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\n\t\t\t}\n\t\t}\n\t}\n\t// If we're only executing or nothing was selected\n\t// we try the catchall dataType if not done already\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\n\t}\n\t// unnecessary when only executing (prefilters)\n\t// but it'll be ignored by the caller in that case\n\treturn selection;\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\t// Don't do a request if no elements are being requested\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// Request the remote document\n\tjQuery.ajax({\n\t\turl: url,\n\n\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\ttype: type,\n\t\tdataType: \"html\",\n\t\tdata: params,\n\t\tcomplete: function( jqXHR, status ) {\n\t\t\tif ( callback ) {\n\t\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t}\n\t\t}\n\t}).done(function( responseText ) {\n\n\t\t// Save response for use in complete callback\n\t\tresponse = arguments;\n\n\t\t// See if a selector was specified\n\t\tself.html( selector ?\n\n\t\t\t// Create a dummy div to hold the results\n\t\t\tjQuery(\"<div>\")\n\n\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t.append( responseText.replace( rscript, \"\" ) )\n\n\t\t\t\t// Locate the specified elements\n\t\t\t\t.find( selector ) :\n\n\t\t\t// If not, just inject the full result\n\t\t\tresponseText );\n\n\t});\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n\tjQuery.fn[ o ] = function( f ){\n\t\treturn this.on( o, f );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: method,\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\tif ( settings ) {\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( target, jQuery.ajaxSettings );\n\t\t} else {\n\t\t\t// Extending ajaxSettings\n\t\t\tsettings = target;\n\t\t\ttarget = jQuery.ajaxSettings;\n\t\t}\n\t\tajaxExtend( target, settings );\n\t\treturn target;\n\t},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\tprocessData: true,\n\t\tasync: true,\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\ttext: \"text/plain\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\t\"*\": allTypes\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// List of data converters\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\tcontext: true,\n\t\t\turl: true\n\t\t}\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // ifModified key\n\t\t\tifModifiedKey,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// transport\n\t\t\ttransport,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events\n\t\t\t// It's the callbackContext if one was provided in the options\n\t\t\t// and if it's a DOM node or a jQuery collection\n\t\t\tglobalEventContext = callbackContext !== s &&\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match === undefined ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tstatusText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( statusText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, statusText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Callback for when everything is done\n\t\t// It is defined here because jslint complains if it is declared\n\t\t// at the end of the function (which would be more logical and readable)\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\n\t\t\t\t\tstatusText = \"notmodified\";\n\t\t\t\t\tisSuccess = true;\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\n\t\t\t\t\tisSuccess = ajaxConvert( s, response );\n\t\t\t\t\tstatusText = isSuccess.state;\n\t\t\t\t\tsuccess = isSuccess.data;\n\t\t\t\t\terror = isSuccess.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( !statusText || status ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\t\tjqXHR.complete = completeDeferred.add;\n\n\t\t// Status-dependent callbacks\n\t\tjqXHR.statusCode = function( map ) {\n\t\t\tif ( map ) {\n\t\t\t\tvar tmp;\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tfor ( tmp in map ) {\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttmp = map[ jqXHR.status ];\n\t\t\t\t\tjqXHR.always( tmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( core_rspace );\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\n\t\t\tifModifiedKey = s.url;\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\n\t\t\t\tvar ts = jQuery.now(),\n\t\t\t\t\t// try replacing _= if it is there\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\n\n\t\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\t\ts.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t\t// Abort if not done already and return\n\t\t\t\treturn jqXHR.abort();\n\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout( function(){\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch (e) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {}\n\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields;\n\n\t// Fill responseXXX fields\n\tfor ( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n\tvar conv, conv2, current, tmp,\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice(),\n\t\tprev = dataTypes[ 0 ],\n\t\tconverters = {},\n\t\ti = 0;\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\t// Convert to each sequential dataType, tolerating list modification\n\tfor ( ; (current = dataTypes[++i]); ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\tif ( current !== \"*\" ) {\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\tif ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split(\" \");\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.splice( i--, 0, current );\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[\"throws\"] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update prev for next iteration\n\t\t\tprev = current;\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\nvar oldCallbacks = [],\n\trquestion = /\\?/,\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/,\n\tnonce = jQuery.now();\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tdata = s.data,\n\t\turl = s.url,\n\t\thasCallback = s.jsonp !== false,\n\t\treplaceInUrl = hasCallback && rjsonp.test( url ),\n\t\treplaceInData = hasCallback && !replaceInUrl && typeof data === \"string\" &&\n\t\t\t!( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") &&\n\t\t\trjsonp.test( data );\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" || replaceInUrl || replaceInData ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\t\toverwritten = window[ callbackName ];\n\n\t\t// Insert callback into url or form data\n\t\tif ( replaceInUrl ) {\n\t\t\ts.url = url.replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( replaceInData ) {\n\t\t\ts.data = data.replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( hasCallback ) {\n\t\t\ts.url += ( rquestion.test( url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /javascript|ecmascript/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = \"async\";\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = undefined;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( 0, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar xhrCallbacks,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\n\t\t// Abort all pending requests\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( 0, 1 );\n\t\t}\n\t} : false,\n\txhrId = 0;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n\tjQuery.extend( jQuery.support, {\n\t\tajax: !!xhr,\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\n\t});\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( _ ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback, 0 );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback(0,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([-+])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar end, unit,\n\t\t\t\ttween = this.createTween( prop, value ),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tstart = +target || 0,\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( parts ) {\n\t\t\t\tend = +parts[2];\n\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\n\t\t\t\t// We need to compute starting value\n\t\t\t\tif ( unit !== \"px\" && start ) {\n\t\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\t\t// Prefer the current property, because this process will be trivial if it uses the same units\n\t\t\t\t\t// Fallback to end or a simple constant\n\t\t\t\t\tstart = jQuery.css( tween.elem, prop, true ) || end || 1;\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t\t// Adjust and apply\n\t\t\t\t\t\tstart = start / scale;\n\t\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t\t}\n\n\t\t\t\ttween.unit = unit;\n\t\t\t\ttween.start = start;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;\n\t\t\t}\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t}, 0 );\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTweens( animation, props ) {\n\tjQuery.each( props, function( prop, value ) {\n\t\tvar collection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\t\tindex = 0,\n\t\t\tlength = collection.length;\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tif ( collection[ index ].call( animation, prop, value ) ) {\n\n\t\t\t\t// we're done with this property\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tindex = 0,\n\t\ttweenerIndex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end, easing ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tcreateTweens( animation, props );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue,\n\t\t\telem: elem\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\tstyle = elem.style,\n\t\torig = {},\n\t\thandled = [],\n\t\thidden = elem.nodeType && isHidden( elem );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.done(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( index in props ) {\n\t\tvalue = props[ index ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ index ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thandled.push( index );\n\t\t}\n\t}\n\n\tlength = handled.length;\n\tif ( length ) {\n\t\tdataShow = jQuery._data( elem, \"fxshow\" ) || jQuery._data( elem, \"fxshow\", {} );\n\t\tif ( \"hidden\" in dataShow ) {\n\t\t\thidden = dataShow.hidden;\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery.removeData( elem, \"fxshow\", true );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( index = 0 ; index < length ; index++ ) {\n\t\t\tprop = handled[ index ];\n\t\t\ttween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );\n\t\t\torig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing any value as a 4th parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, false, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Remove in 2.0 - this supports IE8's panic based approach\n// to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ||\n\t\t\t// special check for .toggle( handler, handler, ... )\n\t\t\t( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations resolve immediately\n\t\t\t\tif ( empty ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) && !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\nvar rroot = /^(?:body|html)$/i;\n\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tif ( (body = doc.body) === elem ) {\n\t\treturn jQuery.offset.bodyOffset( elem );\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== \"undefined\" ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\tclientTop  = docElem.clientTop  || body.clientTop  || 0;\n\tclientLeft = docElem.clientLeft || body.clientLeft || 0;\n\tscrollTop  = win.pageYOffset || docElem.scrollTop;\n\tscrollLeft = win.pageXOffset || docElem.scrollLeft;\n\treturn {\n\t\ttop: box.top  + scrollTop  - clientTop,\n\t\tleft: box.left + scrollLeft - clientLeft\n\t};\n};\n\njQuery.offset = {\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop,\n\t\t\tleft = body.offsetLeft;\n\n\t\tif ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || document.body;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\t top ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, value, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Expose jQuery to the global object\nwindow.jQuery = window.$ = jQuery;\n\n// Expose jQuery as an AMD module, but only for AMD loaders that\n// understand the issues with loading multiple versions of jQuery\n// in a page that all might call define(). The loader will indicate\n// they have special allowances for multiple jQuery versions by\n// specifying define.amd.jQuery = true. Register as a named module,\n// since jQuery can be concatenated with other files that may use define,\n// but not use a proper concatenation script that understands anonymous\n// AMD modules. A named AMD is safest and most robust way to register.\n// Lowercase jquery is used because AMD module names are derived from\n// file names, and jQuery is normally delivered in a lowercase file name.\n// Do this after creating the global so that if an AMD module wants to call\n// noConflict to hide this version of jQuery, it will work.\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n\tdefine( \"jquery\", [], function () { return jQuery; } );\n}\n\n})( window );\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/docker-compose.yml",
    "content": "version: \"2\"\n\nservices:\n\n  database:\n    build:\n      context: ./registration-database\n    image: registration-database\n    # set default mysql root password, change as needed\n    environment:\n      MYSQL_ROOT_PASSWORD: password\n    # Expose port 3306 to host. Not for the application but\n    # handy to inspect the database from the host machine.\n    ports:\n      - \"3306:3306\" \n    restart: always\n\n  webserver:\n    build: \n      context: ./registration-webserver\n    image: registration-webserver\n    # mount point for application in tomcat\n    volumes:\n      - ./app/target/UserSignup:/usr/local/tomcat/webapps/UserSignup\n    links:\n      - database:registration-database\n    # open ports for tomcat and remote debugging\n    ports:\n      - \"8080:8080\" \n      - \"8000:8000\"\n    restart: always\n\n "
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/images/resizeImg.py",
    "content": "#!/usr/bin/env python\n\nimport sys, os\nfrom PIL import Image\n\nprint sys.argv\n\nimgName = sys.argv[1]\nreduceWidth = float(sys.argv[2])\nreduceHeight = float(sys.argv[3])\noutName = sys.argv[4]\n\nimg = Image.open(imgName)\nwidth, height = img.size\nreducedImg = img.resize((int(width/reduceWidth),int(height/reduceHeight)))\nreducedImg.save(outName)\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/registration-database/Dockerfile",
    "content": "FROM mysql:latest\n\n# Copy the database initialize script: \n# Contents of /docker-entrypoint-initdb.d are run on mysqld startup\nADD  docker-entrypoint-initdb.d/ /docker-entrypoint-initdb.d/\n\n# Default values for passwords and database name. Can be overridden on docker run\n# ENV MYSQL_ROOT_PASSWORD=my-secret-pw # Not defaulted for security reasons!\nENV MYSQL_DATABASE=dockercon2035\nENV MYSQL_USER=gordon\nENV MYSQL_PASSWORD=password"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/registration-database/README.md",
    "content": "Database container for the User Signup demo app\n\nThis container is a MySQL 5.6 with the necessary database, tables and passwords set up.\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/registration-database/docker-entrypoint-initdb.d/initialize_db.sql",
    "content": "USE `dockercon2035`;\n\nCREATE TABLE `user` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `dateOfBirth` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ,\n  `emailAddress` varchar(255) NOT NULL,\n  `firstName` varchar(255) NOT NULL,\n  `lastName` varchar(255) NOT NULL,\n  `password` varchar(8) NOT NULL,\n  `userName` varchar(20) NOT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=latin1;"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/registration-webserver/Dockerfile",
    "content": "#FROM pietvandongen/docker-tomcat-development:latest\nFROM tomcat:7-jre8\nMAINTAINER Sophia Parafina <sophia.parafina@docker.com>\n\n# tomcat-users.xml sets up user accounts for the Tomcat manager GUI\n# and script access for Maven deployments\nADD tomcat/tomcat-users.xml $CATALINA_HOME/conf/\n\n# ADD tomcat/catalina.sh $CATALINA_HOME/bin/\nADD tomcat/run.sh $CATALINA_HOME/bin/run.sh\nRUN chmod +x $CATALINA_HOME/bin/run.sh\n\n# add MySQL JDBC driver jar\nADD tomcat/mysql-connector-java-5.1.36-bin.jar $CATALINA_HOME/lib/\n\n# create mount point for volume with application\nRUN mkdir $CATALINA_HOME/webapps/UserSignup\n\n# add tomcat jpda debugging environmental variables\n#ENV JPDA_OPTS=\"-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n\"\nENV JPDA_ADDRESS=\"8000\"\nENV JPDA_TRANSPORT=\"dt_socket\"\n\n# start tomcat7 with remote debugging\nEXPOSE 8080\nCMD [\"run.sh\"]\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/registration-webserver/README.md",
    "content": "Webserver container for the User Signup demo application.\n\nThis container is a Tomcat 7 servlet engine with remote debugging enabled.\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/registration-webserver/tomcat/run.sh",
    "content": "#!/bin/sh\n\nexec ${CATALINA_HOME}/bin/catalina.sh jpda run\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/java-debugging/registration-webserver/tomcat/tomcat-users.xml",
    "content": "<?xml version='1.0' encoding='cp1252'?>\n<tomcat-users>\n\t<user username=\"system\" password=\"manager\" roles=\"admin-gui,manager-gui\" />\n\t<role rolename=\"manager-script\"/>\n\t<user username=\"admin\" password=\"admin\" roles=\"manager-script\"/>\n</tomcat-users>\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs/porting/1_node_application.md",
    "content": "# Setup our sample Node.js application\n\n## Application details\n\n* API HTTP Rest based on Node.js / [Sails.js](sailsjs.org)) and [MongoDB](https://www.mongodb.com/)\n* A couple of prerequisites are needed to run the application locally\n  * [Node.js 4.4.5 (LTS)](https://nodejs.org/en/)\n  * [mongo 3.2](https://docs.mongodb.org/manual/installation/)\n* Provides CRUD (Create / Read / Update / Delete HTTP verbs) on a “Message” model\n\nHTTP verb | URI | Action\n----------| --- | ------\nGET | /message | list all messages\nGET | /message/ID | get message with ID\nPOST | /message | create a new message\nPUT | /message/ID | modify message with ID\nDELETE | /message/ID | delete message with ID\n\n## Setup\n\n* Install Sails.js (it's to Node.js what RoR is to Ruby): ```sudo npm install sails -g``` (should install 0.12.3)\n* Create the  application:  ```sails new messageApp && cd messageApp```\n* Link application to local MongoDB\n  * usage of sails-mongo orm: ```npm install sails-mongo --save```\n  * change the 2 following configuration files\n\n```\nconfig/model.js:\nmodule.exports.models = {\nconnections: 'sails-mongo',\n migrate: 'safe'\n};\n```\n\n```\nconfig/connections.js:\nmodule.exports.connections = {\n  mongo: {\n     adapter: 'sails-mongo',\n     url: process.env.MONGO_URL || 'mongodb://localhost/messageApp'\n  }\n};\n```\n\n* Generate the API scafold  ```sails generate api message```\n* Run the application: ```sails lift```\n* The API is available locally on port 1337 (default Sails.js port)\n\n## Test the application in command line\n\n* Get current list of messages\n  * ```curl http://localhost:1337/message```\n\n```\n[]\n```\n\n* Create new messages\n  * ```curl -XPOST http://localhost:1337/message?text=hello```\n  * ```curl -XPOST http://localhost:1337/message?text=hola```\n  \n* Get list of messages\n  * ```curl http://localhost:1337/message```\n\n```\n[\n  {\n    \"text\": \"hello\",\n    \"createdAt\": \"2015-11-08T13:15:15.363Z\",\n    \"updatedAt\": \"2015-11-08T13:15:15.363Z\",\n    \"id\": \"5638b363c5cd0825511690bd\" \n  },\n  {\n    \"text\": \"hola\",\n    \"createdAt\": \"2015-11-08T13:15:45.774Z\",\n    \"updatedAt\": \"2015-11-08T13:15:45.774Z\",\n    \"id\": \"5638b381c5cd0825511690be\"\n  }\n]\n```\n* Modify a message\n  * ```curl -XPUT http://localhost:1337/message/5638b363c5cd0825511690bd?text=hey```\n\n* Delete a message\n  * ```curl -XDELETE http://localhost:1337/message/5638b381c5cd0825511690be```\n\n* Get list of messages\n  * ```curl http://localhost:1337/message```\n\n```\n[\n  {\n    \"text\": \"hey\",\n    \"createdAt\": \"2015-11-08T13:15:15.363Z\",\n    \"updatedAt\": \"2015-11-08T13:19:40.179Z\",\n    \"id\": \"5638b363c5cd0825511690bd\"\n  }\n]\n```\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs/porting/2_application_image.md",
    "content": "# Create the application's image\n\n* We will use 2 images to package the application\n  * one image for the database\n  * one image for the application\n\n## The application\n\n* There are several possibilities to create the image\n  * extend an official Linux distribution image (Ubuntu, CentOS, ...) and install Node.js runtime\n  * use the official Node.js image (https://store.docker.com/images/node)\n\nWe'll go for the second option as it offers an optimized image.\n\n## Database\n\n* Usage of the official [MongoDB image](https://store.docker.com/images/mongo)\n\n## Dockerfile\n\nWe'll use the following Dockerfile to build our application's image:\n\n```\n# Use node 4.4.5 LTS\nFROM node:4.4.5\nENV LAST_UPDATED 20160605T165400\n\n# Copy source code\nCOPY . /app\n\n# Change working directory\nWORKDIR /app\n\n# Install dependencies\nRUN npm install\n\n# Expose API port to the outside\nEXPOSE 80\n\n# Launch application\nCMD [\"npm\",\"start\"]\n````\n\nBasically, the Dockerfile performs the following actions\n* use the official node:4.4.5 (LTS) image\n* copy application sources\n* install dependencies\n* expose port to the outside from the Docker host\n* define default command ran when instantiating the image\n\n## Image creation\n\n* Create the image ```docker build -t message-app .```\n\n* List all images available on the Docker host ```docker images```\n\n## Let's instantiate a container\n\n```\n$ docker run message-app\nnpm info it worked if it ends with ok\n...\nerror: A hook (`orm`) failed to load!\nerror: Error: Failed to connect to MongoDB.  Are you sure your configured Mongo instance is running?\n Error details:\n{ [MongoError: connect ECONNREFUSED 127.0.0.1:27017]\n  name: 'MongoError',\n  message: 'connect ECONNREFUSED 127.0.0.1:27017' }]\n  originalError:\n   { [MongoError: connect ECONNREFUSED 127.0.0.1:27017]\n     name: 'MongoError',\n     message: 'connect ECONNREFUSED 127.0.0.1:27017' } }\n```\n\n**The application cannot connect to a database as we did not provide external db information nor container running mongodb**\n\n\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs/porting/3_publish_image.md",
    "content": "# Publish image\r\n\r\nThe following procedure describes how to create a repository on Docker Hub and publish an image.\r\n\r\n## Create repository on Docker Public Registry\r\n\r\n* Docker Hub\r\n\r\n![hub.docker.com](images/registry_1.png)\r\n\r\n* List of user’s repositories\r\n\r\n![List of user repository](images/registry_2.png)\r\n\r\n* Repository details\r\n\r\n![Repository details](images/registry_3.png)\r\n\r\n* Repository created\r\n\r\n![Repository created](images/registry_4.png)\r\n\r\n**the newly created repository will contain all the version of the application’s image**\r\n\r\n## Create image\r\n\r\n* Image needs to be created using username of the Docker Cloud account \r\n```docker build -t lucj/message-app .```\r\n\r\n## Push image to Docker Cloud\r\n\r\nBefore publishing an image, authentication must be performed with the following command:\r\n```docker login```\r\n\r\nImage can then be published to the user repository\r\n```docker push lucj/message-app```\r\n\r\n## Instantiate the image\r\n\r\nThe image can then be used form any Docker host (the image is public in this example)\r\n  * ```docker pull lucj/message-app```\r\n  * ```docker run -dP lucj/message-app``` (will start with an error as no database information is provided)\r\n\r\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs/porting/4_single_host_networking.md",
    "content": "# Container networking on a single Docker host\r\n\r\n## Docker host creation\r\n\r\nWe will use [Docker Machine](https://docs.docker.com/machine/) to create our test Docker Host. Driver's option is set to **virtualbox** so the host is created on the local machine as a virtualbox virtual machine.\r\n\r\n```docker-machine create --driver virtualbox node1```\r\n\r\nGet the IP of node1 ```docker-machine ip node1``` (⇒ 192.168.99.100)\r\n\r\n## Default networks\r\n\r\nLet's check the networks attached to the newly created Docker host\r\n\r\n```\r\n$ eval $(docker-machine env node1)\r\n\r\n$ docker network ls\r\nNETWORK ID          NAME            DRIVER\r\nd87b8fc4c466        bridge          bridge\r\nefaf610f57a5        host            host\r\nf7d0de539edd        none            null\r\n```\r\n\r\n**By default (if no --net option is provided), Docker engine will attach each container to the bridge network (id d87b8fc4c466)**\r\n\r\n## Default bridge network\r\n\r\nLet's run 2 container using the default bridge network (without using --net option)\r\n\r\n```\r\n$ docker run --name mongo -d mongo:3.2\r\n$ docker run --name box -d busybox top\r\n```\r\n\r\nMake sure the containers are listed in the bridge network\r\n\r\n```\r\n$ docker network inspect --format='{{json .Containers}}' d87b8fc4c466 | python -m json.tool\r\n{\r\n    \"0b8fedf4613c7275d89861037ea1b23ad4d65ab10f16df67bf976d9cb5652311\": {\r\n        \"EndpointID\": \"0cf0cd3b2e0438c6f68c6a1e2f7587b63c48bda74911af55d1040f0d2fb117d2\",\r\n        \"IPv4Address\": \"172.17.0.3/16\",\r\n        \"IPv6Address\": \"\",\r\n        \"MacAddress\": \"02:42:ac:11:00:03\",\r\n        \"Name\": \"mongo\"\r\n    },\r\n    \"6cb5e5f4a1bcc37925407b39f2dde41f2b370fc48a21f8289da91d17b3763a4c\": {\r\n        \"EndpointID\": \"2a6412d3c3c25545a59ea148e317b2046965c0fe5c1eeae2c51f4f882aaa6b36\",\r\n        \"IPv4Address\": \"172.17.0.2/16\",\r\n        \"IPv6Address\": \"\",\r\n        \"MacAddress\": \"02:42:ac:11:00:02\",\r\n        \"Name\": \"box\"\r\n    }\r\n}\r\n```\r\nBoth containers appear as being linked to the bridge network but **they cannot address each other by their names**\r\n\r\n```\r\n$ docker run -ti busybox /bin/sh\r\n/ # ping mongo\r\nping: bad address 'mongo'\r\n/ # ping box\r\nping: bad address 'box'\r\n```\r\n\r\n## User defined bridge network\r\n\r\nWhen using user defined network, the behaviour is different than the default bridge network.\r\n\r\nLet's create a user defined bridge network with Docker network commands\r\n\r\n````\r\n$ docker network create mongonet\r\nce9ea3b69d6ee2ecf56b40bd35b8a43f8505c8ca0473bc37bdede3711ecf60c1\r\n\r\n$ docker network ls\r\nNETWORK ID          NAME            DRIVER\r\nd87b8fc4c466        bridge          bridge\r\nefaf610f57a5        host            host\r\nce9ea3b69d6e        mongonet        bridge\r\nf7d0de539edd        none            null\r\n````\r\n\r\nLet's now run 2 containers in the newly defined network\r\n\r\n````\r\n$ docker run --name mongo --net mongonet -d mongo:3.2\r\n\r\n$ docker run --net mongonet -ti busybox /bin/sh\r\n/ # / # ping -c 3 mongo\r\nPING mongo (172.18.0.2): 56 data bytes\r\n64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.058 ms\r\n64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.085 ms\r\n64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.072 ms\r\n\r\n--- mongo ping statistics ---\r\n3 packets transmitted, 3 packets received, 0% packet loss\r\nround-trip min/avg/max = 0.058/0.071/0.085 ms\r\n````\r\n\r\nContainers can be addressed by their name through the DNS name server embedded in Docker 1.10+\r\n\r\n## Test our application\r\n\r\nRun db and application containers in the new bridge network\r\n\r\n```\r\n$ docker run --name mongo --net mongonet -d mongo:3.2\r\n$ docker run --name app --net mongonet -p 8000:1337 -d -e “MONGO_URL=mongodb://mongo/messageApp” message-app:v1\r\n```\r\n\r\nNote: MONGO_URL environment variable directly uses **mongo** container’s name\r\n\r\nTest HTTP Rest API\r\n\r\n```\r\n# Create a  new message\r\n$ curl -XPOST http://192.168.99.100:8000/message?text=hello\r\n{\r\n  \"text\": \"hello\",\r\n  \"createdAt\": \"2016-06-06T14:01:05.764Z\",\r\n  \"updatedAt\": \"2016-06-06T14:01:05.764Z\",\r\n  \"id\": \"57558221a4461312009ce88c\"\r\n}\r\n\r\n# Retrieve the list of message and make sure the previous message is present\r\n$ curl -XGET http://192.168.99.100:8000/message\r\n[\r\n  {\r\n    \"text\": \"hello\",\r\n    \"createdAt\": \"2016-06-06T14:01:05.764Z\",\r\n    \"updatedAt\": \"2016-06-06T14:01:05.764Z\",\r\n    \"id\": \"57558221a4461312009ce88c\"\r\n  }\r\n]\r\n```\r\n\r\nThe application container (named **app**) is connected to mongo container using container name (named **mongo**)\r\n\r\n## Packaging of the application with Docker Compose\r\n\r\nThe following file (docker-compose.yml) defines the whole application\r\n\r\n```\r\nversion: '3'\r\nservices:\r\n  mongo:\r\n    image: mongo:3.2\r\n    volumes:\r\n      - mongo-data:/data/db\r\n    expose:\r\n      - \"27017\"\r\n  app:\r\n    image: lucj/message-app\r\n    ports:\r\n      - \"1337\"\r\n    links:\r\n      - mongo\r\n    depends_on:\r\n      - mongo\r\n    environment:\r\n      - MONGO_URL=mongodb://mongo/messageApp\r\nvolumes:\r\n  mongo-data:\r\n```\r\n\r\nThe important part of this file\r\n* Definition of 2 services\r\n  * database service: mongo\r\n  * application service: app\r\n* Link between **app** and **mongo** services done through the MONGO_URL environment variable (using **mongo** service name)\r\n* Port mapping\r\n  * mongo service expose port 27017 (default MongoDB port) only to the other services (not to the Docker host)\r\n  * app service port is mapped to a random port on the host (as no host port as been defined)\r\n* Definition of a user defined volume for mongodb data folder\r\n\r\n## Lifecycle and scalability\r\n\r\nThe following commands are some of the main ones to interact with the application\r\n\r\n* Start the application ```docker-compose up -d```  (-d option enables the application to run in background)\r\n* Check the status of each services conposing the application ```docker-compose ps```\r\n* Stop the application ```docker-compose stop```\r\n* Scale the app service changing the number of instances ```docker-compose scale app=3```\r\n\r\n![3 api containers](https://dl.dropboxusercontent.com/u/2330187/docker/labs/node/single_host_net_1.png)\r\n\r\nSeveral containers of the app service (our Node.js API) are running and are accessible through random port number of the Docker host. Wow are the new instanciated containers addressed ?\r\n\r\n=> Need to add a load balancer that will be updated each time a container is created or removed and that will forward each request to a running instance of the app service.\r\n\r\n## Usage of dockercloud/haproxy image\r\n\r\n[dockercloud/haproxy](https://store.docker.com/images/haproxy) is a good candidate to be used in front of our **app** service.\r\nIt will update it's configuration each time a container is started / stopped.\r\n\r\n![load balancer](https://dl.dropboxusercontent.com/u/2330187/docker/labs/node/single_host_net_2.png)\r\n\r\n## Adding load balancer to our Compose file\r\n\r\nThe new version of our docker-compose.yml is\r\n\r\n```\r\nversion: '3'\r\nservices:\r\n  mongo:\r\n    image: mongo:3.2\r\n    volumes:\r\n      - mongo-data:/data/db\r\n    expose:\r\n      - \"27017\"\r\n lbapp:\r\n    image: dockercloud/haproxy\r\n    links:\r\n      - app\r\n    volumes:\r\n      - /var/run/docker.sock:/var/run/docker.sock\r\n    ports:\r\n      - \"8000:80\"\r\n  app:\r\n    image: message-app\r\n    expose:\r\n      - \"1337\"\r\n    links:\r\n      - mongo\r\n    depends_on:\r\n      - mongo\r\n    environment:\r\n      - MONGO_URL=mongodb://mongo/messageApp\r\nvolumes:\r\n  mongo-data:\r\n```\r\n\r\nThe load balancer service has been added to the picture.\r\nEach request coming to port 8000 of the host (mapped with port 80 of lbapi) will go to the api through the load balancer.\r\n\r\n## Test our application\r\n\r\nRun the new version of our compose file and specify the number of instances of the **app** service\r\n* ```docker-compose up```\r\n* ```docker-compose scale app=3```\r\n\r\nLet's just test the creation and retrieval of a message\r\n\r\n```\r\n$ curl -XPOST http://192.168.99.100:8000/message?text=hola\r\n{\r\n  \"text\": \"hola\",\r\n  \"createdAt\": \"2016-06-08T13:30:18.298Z\",\r\n  \"updatedAt\": \"2016-06-08T13:30:18.298Z\",\r\n  \"id\": \"57581deacde05a1200877fa2\"\r\n}\r\n$ curl -XGET http://192.168.99.100:8000/message\r\n[\r\n  {\r\n    \"text\": \"hola\",\r\n    \"createdAt\": \"2016-06-08T13:30:18.298Z\",\r\n    \"updatedAt\": \"2016-06-08T13:30:18.298Z\",\r\n    \"id\": \"57581deacde05a1200877fa2\"\r\n  }\r\n]\r\n```\r\n\r\nSeems to be good :)\r\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs/porting/5_multiple_hosts_networking.md",
    "content": "# Container networking on multiple Docker hosts\r\n\r\n## Prerequisite\r\n\r\nThe multihost networking is available out the box with libnetwork since Docker 1.9\r\n\r\nThis required to setup a key-value store first\r\n* several are supported: etcd / consul / zookeeper\r\n* keeps all the information regarding (networks / subnetworks, IP addresses of Docker hosts / containers, ...)\r\n\r\n## Creation of a key-value store\r\n\r\nSeveral steps are needed to run the key value store\r\n\r\n* Create dedicated Docker host with Machine ```docker-machine create -d virtualbox consul```\r\n* Switch to the context of the newly created host ```eval \"$(docker-machine env consul)\"```\r\n* Run container based on [progirum/consul image](https://store.docker.com/images/consul) ```docker run -d -p \"8500:8500\" -h \"consul\" progrium/consul -server -bootstrap```\r\n  \r\n## Creation of Docker hosts that will run application containers\r\n\r\nAs for consul, we use Docker Machine to create 2 test Docker hosts\r\n\r\n### Host 1\r\n\r\n```\r\n$ docker-machine create \\\r\n-d virtualbox \\\r\n--engine-opt=\"cluster-store=consul://$(docker-machine ip consul):8500\" \\\r\n--engine-opt=\"cluster-advertise=eth1:2376\" \\\r\nhost1\r\n\r\n$ docker $(docker-machine config host1) network ls\r\nNETWORK ID          NAME                DRIVER\r\n14753b15c63e        bridge              bridge\r\n2cc7d35a48e3        none                null\r\nad05eeca763a        host                host\r\n````\r\n\r\n### Host 2\r\n\r\n```\r\n$ docker-machine create \\\r\n-d virtualbox \\\r\n--engine-opt=\"cluster-store=consul://$(docker-machine ip consul):8500\" \\\r\n--engine-opt=\"cluster-advertise=eth1:2376\" \\\r\nhost2\r\n\r\n$ docker $(docker-machine config host2) network ls\r\nNETWORK ID          NAME                DRIVER\r\nb7765c98adbf        bridge              bridge\r\n48244d2fca3b        none                null\r\n36a3858b68c8        host                host\r\n```\r\n\r\nAs we've seen in a previous chapter, 3 default networks are available on each host: bridge / none / host.\r\nWe will create an overlay user defined network and benefit from the embedded DNS name server that enables container communication across nodes.\r\n\r\n## Creation of an overlay network\r\n\r\nAs seen befire, a user defined network can easily be created. Let's create an overlay network, named **appnet**, from host1.\r\n\r\n```docker $(docker-machine config host1) network create -d overlay appnet```\r\n\r\nThis network is also visible from host2 as we can see below.\r\n\r\n```\r\n$ docker $(docker-machine config host1) network ls\r\nNETWORK ID          NAME                DRIVER\r\nacd47b4c062d        appnet              overlay\r\n14753b15c63e        bridge              bridge\r\n2cc7d35a48e3        none                null\r\nad05eeca763a        host                host\r\n\r\n$ docker $(docker-machine config host2) network ls\r\nNETWORK ID          NAME                DRIVER\r\nacd47b4c062d        appnet              overlay\r\nb7765c98adbf        bridge              bridge\r\n48244d2fca3b        none                null\r\n36a3858b68c8        host                host\r\n```\r\n\r\n## Check cross host communication\r\n\r\n\r\nRun the **mongo** container, based on mongo 3.2 offical image, on appnet network from host1\r\n\r\n```docker $(docker-machine config host1) run -d --name mongo --net=appnet mongo:3.2```\r\n\r\nRun the **box** container, based on busybox) on appnet network from host2\r\n\r\n```docker $(docker-machine config host2) run -ti --name box --net=appnet busybox sh```\r\n\r\nEven if **box** and **mongo** do not run on the same host, **box** can communicate with **mongo** container using its name through the DNS name server embedded in Docker 1.10+\r\n\r\n```\r\n/ # ping mongo\r\nPING mongo (10.0.0.2): 56 data bytes\r\n64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.553 ms\r\n…\r\n/ # ping mongo.appnet\r\nPING mongo.appnet (10.0.0.2): 56 data bytes\r\n64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.474 ms\r\n…\r\n```\r\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs/porting/6_deploy_on_swarm.md",
    "content": "# Deployment on a Docker Swarm\r\n\r\nAs for the multi Docker host environment, a Docker Swarm requires a key value store to gather the nodes / containers configurations and states.\r\n\r\n## Creation of a key-value store\r\n\r\nNote: if you still have the key-value store from the previous chapter do not re-create it and go directly to the creation of the Swarm.\r\n\r\nSeveral steps are needed to run the key-value store\r\n\r\n* Create dedicated Docker host with Machine) ```docker-machine create -d virtualbox consul```\r\n* Switch to context of the newly created machine ```eval \"$(docker-machine env consul)\"```\r\n* Run container based on Consul image ```docker run -d -p \"8500:8500\" -h \"consul\" progrium/consul -server -bootstrap```\r\n\r\n## Creation of the Swarm\r\n\r\nAdditional options need to be provided to docker-machine in order to define a Swarm.\r\n\r\n### Creation of the Swarm master\r\n\r\n```\r\n$ docker-machine create \\\r\n-d virtualbox \\\r\n--swarm \\\r\n--swarm-master \\\r\n--swarm-discovery=\"consul://$(docker-machine ip consul):8500\" \\\r\n--engine-opt=\"cluster-store=consul://$(docker-machine ip consul):8500\" \\\r\n--engine-opt=\"cluster-advertise=eth1:2376\" \\\r\ndemo0\r\n```\r\n\r\n### Creation of the Swarm agent\r\n\r\n```\r\n$ docker-machine create \\\r\n -d virtualbox \\\r\n--swarm \\\r\n--swarm-discovery=\"consul://$(docker-machine ip consul):8500\" \\\r\n--engine-opt=\"cluster-store=consul://$(docker-machine ip consul):8500\" \\\r\n--engine-opt=\"cluster-advertise=eth1:2376\" \\\r\ndemo1\r\n```\r\n\r\n### List the nodes\r\n\r\nWe have created 3 Docker hosts (key-store, Swarm master, Swarm agent)\r\n\r\n```\r\n$ docker-machine ls\r\n\r\nNAME     ACTIVE   DRIVER         STATE     URL                         SWARM\r\nconsul   *        virtualbox     Running   tcp://192.168.99.100:2376\r\ndemo0    -        virtualbox     Running   tcp://192.168.99.101:2376   demo0 (master)\r\ndemo1    -        virtualbox     Running   tcp://192.168.99.102:2376   demo1\r\n```\r\n\r\n## Create a DNS load balancer\r\n\r\nIn order to load balance the traffic towards several instances of our **app** service, we will add a new service. This one uses the DNS round-robin capability of Docker engine (version 1.11) for containers with the same network alias.\r\n\r\nNote: to present the DNS round-robin feature, we do not use the load balancer of the previous chapter (dockercloud/haproxy).\r\n\r\nThe following Dockerfile uses nginx:1.9 official image and add a custom nginx.conf configuration file.\r\n\r\n```\r\nFROM nginx:1.9\r\n\r\n# forward request and error logs to docker log collector\r\nRUN ln -sf /dev/stdout /var/log/nginx/access.log\r\nRUN ln -sf /dev/stderr /var/log/nginx/error.log\r\n\r\nCOPY nginx.conf /etc/nginx/nginx.conf\r\n\r\nEXPOSE 80\r\n\r\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\r\n```\r\n\r\nThe following nginx.conf file define a proxy_pass directive towards **http://apps** for each request received on port 80.\r\n\r\n**apps** is the value we will set as the app service network alias.\r\n\r\n```\r\nuser nginx;\r\nworker_processes 2;\r\nevents {\r\n  worker_connections 1024;\r\n}\r\nhttp {\r\n  access_log /var/log/nginx/access.log;\r\n  error_log /var/log/nginx/error.log;\r\n\r\n  # 127.0.0.11 is the address of the Docker embedded DNS server\r\n  resolver 127.0.0.11 valid=1s;\r\n  server {\r\n    listen 80;\r\n    # apps is the name of the network alias in Docker\r\n    set $alias \"apps\";\r\n\r\n    location / {\r\n      proxy_pass http://$alias;\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nLet's build and publish the image of this load-balancer to Docker Cloud:\r\n\r\n```\r\n# Create image\r\n$ docker build -t lucj/lb-dns .\r\n\r\n# Publish image\r\n$ docker push -t lucj/lb-dns\r\n```\r\n\r\nThe image can now be used in our Docker Compose file.\r\n\r\n## Update our docker-compose file\r\n\r\nThe new version of the docker-compose.yml file is the following one\r\n\r\n```\r\nversion: '3'\r\nservices:\r\n  mongo:\r\n    image: mongo:3.2\r\n    networks:\r\n      - backend\r\n    volumes:\r\n      - mongo-data:/data/db\r\n    expose:\r\n      - \"27017\"\r\n    environment:\r\n      - \"constraint:node==demo0\"\r\n  lbapp:\r\n    image: lucj/lb-dns\r\n    networks:\r\n      - backend\r\n    ports:\r\n      - \"8000:80\"\r\n    environment:\r\n      - \"constraint:node==demo0\"\r\n  app:\r\n    image: lucj/message-app\r\n    expose:\r\n      - \"80\"\r\n    environment:\r\n      - MONGO_URL=mongodb://mongo/messageApp\r\n      - \"constraint:node==demo1\"\r\n    networks:\r\n      backend:\r\n        aliases:\r\n          - apps\r\n    depends_on:\r\n      - lbapp\r\nvolumes:\r\n  mongo-data:\r\nnetworks:\r\n  backend:\r\n    driver: overlay\r\n```\r\n\r\nThere are several important updates here\r\n* usage of the lb-dns image for the load balancer service\r\n* constraints to choose the nodes on which each service will run (needed in our example to illustrate the DNS round robin)\r\n* creation of a new user-defined overlay network to enable each container to communicate with each other through their name\r\n* for each service, definition of the network used\r\n* definition of network alias for the **app** service (crucial item as this is the one that will enable nginx to proxy requests)\r\n\r\n## Deployment and scaling of the application\r\n\r\nIn order to run the application in this Swarm, we will issue the following commands\r\n* switch to the swarm master context ```eval $(docker-machine env --swarm demo0)```\r\n* run the new compose file ```docker-compose up```\r\n* increase the number of **app** service instances ```docker-compose scale app=5```\r\n\r\nOur application is then available through http://192.168.99.101:8000/message\r\n\r\n192.168.99.101 is the IP of the Swarm master. 8000 is the port exported by the load balancer to the outside.\r\n\r\n\r\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs/porting/README.md",
    "content": "# Purpose\n\nThis tutorial starts with a simple Node.js application (HTTP Rest API built with [Sails.js](http://sailsjs.org/)) and details the steps needed to *Dockerize* it and ensure its scalability.\n\nThe application stores data in a MongoDB database. This tutorial does not address the scaling of the MongoDB part.\n\nNote: Do not hesitate to provide any comments / feedback you may have, that will help make this tutorial better.\n\n# Pre-requisites\n\nSome of the Docker basics will be reviewed but it is recommended to follow [Docker for beginners](https://github.com/docker/labs/tree/master/beginner) prior to follow this tutorial in order to get a clear understanding of what is inside Docker and how to use it.\n\n# Let's start\n\n[Setup our sample node application](1_node_application.md)\n\n[Create the application's image](2_application_image.md)\n\n[Publish image on Docker Store](3_publish_image.md)\n\n[Single Docker host networking](4_single_host_networking.md)\n\n[Multiple Docker hosts networking](5_multiple_hosts_networking.md)\n\n[Deploy on a Docker Swarm](6_deploy_on_swarm.md)\n\n# Summary\n\nWe've covered several important aspects of Docker and hopefully this helped to have a better understanding of the platform.\n\n[What we've done so far](summary.md)\n\nOnce again, feedback / comments are more than welcome :)\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs/porting/summary.md",
    "content": "# What we done so far\n\n* setup Docker for a simple Node.js / MongoDB application\n\n* created image for the application\n  * containing all the parts to run the application (runtime Node.js, librairies, application code)\n\n* portable image (dev / test / qa / prod) available through Docker Cloud\n\n* scalability of the application (API)\n  * on a single node (for dev / test purposes)\n  * on a cluster of Docker hosts\n  * on a Docker Swarm\n\n* We also seen several Docker components and how they are integrated together\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/.gitignore",
    "content": "node_modules\n.vscode"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/README.md",
    "content": "# Tutorial: Debugging Node.js Applications in Docker\n\nDebugging an application live in Node.js is relatively easy. Node developers can use Docker to build a development environment where they can run, test, and live debug code running within a container. Debugging a node.js application was demonstrated at DockerCon 2016 showing that development using containers can be performed on many platforms using other programming languages.\n\n[![Live debugging demo at DockerCon US 2016](https://img.youtube.com/vi/vE1iDPx6-Ok/0.jpg)](https://youtu.be/vE1iDPx6-Ok?list=PLkA60AVN3hh9gnrYwNO6zTb9U3i1Y9FMY&t=2088)\n\n\nThis tutorial includes Docker images and an application for Node development using containers.\n\n* [Visual Studio Code](VSCode-README.md)\n\nBefore starting the tutorial, please have [Docker](https://www.docker.com/products/overview) installed."
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/VSCode-README.md",
    "content": "## In-container Node Development: Visual Studio Code\n\n### Pre-requisites\n\n* [Docker for OSX, Docker for Windows, or Docker for Linux](https://www.docker.com/products/docker)\n* [Visual Studio Code](https://code.visualstudio.com/)\n\n### Getting Started\n\nThe first thing to notice is that you don't actually need to have Node.js installed on your machine. You can just use Docker and your IDE. In this case we're going to show you how to use Visual Studio Code.\n\nWe've created a simple application which includes an error. You can see the app in the [app/ directory](https://github.com/docker/labs/tree/master/developer-tools/nodejs-debugging/app) of this repository. You can either clone this repository, or create the files yourself. Make sure they're all in the same directory. You will need the following files:\n\n- app.js\n- package.json\n- index.html\n- Dockerfile\n- docker-compose.yml\n\n`app.js` defines a simple node app. It serves up `index.html`, refreshing every 2 seconds with quote from an array. Here's what it looks like:\n![Image of Browser with quotations from app](images/browser-broken.gif \"Image of a green background with quotes cycling through. Last image is just two quotation marks\")\n\nLet's take a look at the `Dockerfile`:\n\n```\nFROM node:8.2.1-alpine\n\nWORKDIR /code\n\nRUN npm install -g nodemon@1.11.0\n\nCOPY package.json /code/package.json\nRUN npm install && npm ls\nRUN mv /code/node_modules /node_modules\n\nCOPY . /code\n\nCMD [\"npm\", \"start\"]\n```\n\nAs you can see it installs [nodemon](http://nodemon.io/), a utility that will monitor for any changes in your source and automatically restart your server.\n\nYou'll start the app with the `docker-compose.yml`\n\n```\nversion: \"3\"\n\nservices:\n  web:\n    build: .\n    command: nodemon -L --inspect=0.0.0.0:5858\n    volumes:\n      - .:/code\n    ports:\n      - \"8000:8000\"\n      - \"5858:5858\"\n```\n\nA few things are going on here:\n\n* It defines a service called “web”, which uses the image built from the Dockerfile in the current directory.\n* It overrides the command specified in the Dockerfile to enable the remote debugging feature built into Node.js. We do that here because when you ship this application’s container image to production, you don’t want the debugger enabled – it’s a development-only override.\n* It overwrites the application code in the container by mounting the current directory as a volume. This means that the code inside the running container will update whenever you update the local files on your hard drive. This is very useful, as it means you don’t have to rebuild the image every time you make a change to the application.\n* It maps port 8000 inside the container to port 8000 on localhost, so you can actually visit the application.\n* Finally, it maps port 5858 inside the container to the same port on localhost, so you can connect to the remote debugger.\n\n\n### Run the app\n\nUsing your terminal, navigate to the *app* directory (where the docker-compose.yml file is located) and start up the application:\n\n```\n$ docker-compose up\n```\n\nDocker Compose will build the image and start a container for the app. You should see this output:\n```\nCreating network \"nodeexample_default\" with the default driver\nCreating nodeexample_web_1\nAttaching to nodeexample_web_1\nweb_1  | [nodemon] 1.11.0\nweb_1  | [nodemon] to restart at any time, enter `rs`\nweb_1  | [nodemon] watching: *.*\nweb_1  | [nodemon] starting `node --inspect=0.0.0.0:5858 app.js`\nweb_1  | Debugger listening on port 5858\nweb_1  | HTTP server listening on port 80\n```\n\nThe app is now running. Open up [http://localhost:8000/](http://localhost:8000) to see it in action, and take a moment to appreciate the poetry.\n\n![Image of Browser with quotations from app](images/browser-broken.gif \"Image of a green background with quotes cycling through. Last image is just two quotation marks\")\n\nIt’s undoubtedly beautiful, but the problem is obvious: we’re outputting a blank message at the end before cycling back to the first line. It’s time to debug.\n\n### Start debugging\nOpen up the app directory in VSCode. Head over to the debugger by clicking the bug icon in the left-hand sidebar.\n\n![Image of VS Code with debugger icon highlighted](images/debugger-icon.png \"Image of Visual Studio Code with debugger icon highlighted\")\n\nCreate a boilerplate debugger config by clicking the gear icon and selecting “Node.js” in the dropdown.\n\n![Image of VS Code with gear icon highlighted](images/gear-icon.png \"Image of Visual Studio Code with gear icon highlighted\")\n\n![Image of VS Code dropdown list](images/dropdown.png \"Image of Visual Studio Code dropdown list\")\n\nA JSON file will be created and displayed (on the filesystem this file is located at *app/.vscode/launch.json*). Replace its contents with the following \n\n```\n{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Attach\",\n            \"type\": \"node\",\n            \"request\": \"attach\",\n            \"port\": 5858,\n            \"address\": \"localhost\",\n            \"restart\": true,\n            \"sourceMaps\": false,\n            \"outFiles\": [],\n            \"localRoot\": \"${workspaceRoot}/\",\n            \"remoteRoot\": \"/code\"\n        }\n    ]\n}\n```\nThere are three important changes here:\n\n* The whole “Launch” config has been deleted – you’re using Compose to launch the app, not VSCode, so it’s unnecessary.\n* `restart` is set to true, so that the debugger re-attaches when the app restarts.\n* `remoteRoot` is set to the path of the code directory inside the container, because it’s almost certainly different than the path to the code on your machine.\n\nWith the “Attach” config selected, click the “play” button to start the debugger.\n![Image of VS Code attach icon](images/attach.png \"Image of Visual Studio Code attach icon\")\n\nNow go back to app.js and find the line that reads `lineIndex += 1` line, just after we initialize the `message` variable. Set a breakpoint by clicking in the gutter, just to the left of the line number.\n![Image of VS Code breakpoint](images/breakpoint.png \"Image of Visual Studio Code breakpoint\")\n\nIf your browser window is still open and refreshing, in a second or two you should see it hit the breakpoint. If not, go back and refresh it – VSCode will pop back to the front as soon as the debugger hits it.\n\nHit the Play button at the top to resume code execution. It’ll hit the breakpoint every time the browser refreshes, which is every 2 seconds. You can see it cycling through the lines, and then the bug shows up – right after the last line, message gets set to undefined.\n![Animated image of VS Code hititng breakpoint](images/hitting-breakpoint.gif \"Animated image of VS Code hititng breakpoint\")\n\nThe reason becomes clear if you open up the “Closure” section under “VARIABLES”: `lineIndex` has incremented to 4 – the length of the `LINES` array – when it should have been reset after getting to 3. We’ve got an off-by-one error.\n![Image of VS Code lineIndex value](images/variables.png \"Image of Visual Studio Code lineIndex value\")\n\n### Fix the bug\nReplace the `> ` with `>=` in the conditional on the next line:\n![Image of VS Code line 24 to fix](images/fixing-line.png \"Image of Visual Studio Code line 24 to fix\")\n\nNow save the file. A second or two later, you should see the debugger detach and then reattach (the yellow line highlighting the breakpoint will disappear and reappear). This is because several things have just happened:\n\n* Upon saving the file, Docker detected the filesystem change event and proxied it through to the container.\n* nodemon detected the event and restarted the application. You can confirm this by looking at your terminal: there should be a line that reads “restarting due to changes…”\n* Finally, VSCode detected that the remote debugger had gone away and reattached.\n\nThe debugger is now attached again. However, your browser tab might have errored out – go refresh it if so.\n\nYou can now step through the debugger once again and see that the lines cycle properly – no more `undefined`.\n\n![Animated image of VS Code hitting the breakpoint with line fixed](images/attach.png \"Animated image of Visual Studio Code hitting the breakpoint with line fixed\")\n\nRemove the breakpoint and detach the debugger by clicking the stop button. Go back to the browser window and enjoy the updated experience.\n\n![Animated image of browser without error](images/attach.png \"Animated image of browser without error\")\n\nAnd that's it, you're done!\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/app/Dockerfile",
    "content": "FROM node:17.6-alpine\n\nWORKDIR /code\n\nRUN npm install -g nodemon@2.0.15\n\nCOPY package.json /code/package.json\nRUN npm install && npm ls\nRUN mv /code/node_modules /node_modules\n\nCOPY . /code\n\nCMD [\"npm\", \"start\"]\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/app/app.js",
    "content": "var express = require('express');\nvar expressHandlebars = require('express-handlebars');\nvar http = require('http');\n\nvar PORT = 8000;\n\nvar LINES = [\n    \"Hey, now, you're an All Star, get your game on, go play\",\n    \"Hey, now, you're a Rock Star, get the show on, get paid\",\n    \"And all that glitters is gold\",\n    \"Only shooting stars break the mold\",\n];\n\nvar lineIndex = 0;\n\nvar app = express();\napp.engine('html', expressHandlebars());\napp.set('view engine', 'html');\napp.set('views', __dirname);\napp.get('/', function (req, res) {\n    var message = LINES[lineIndex];\n\n    lineIndex += 1;\n    if (lineIndex >= LINES.length) {\n        lineIndex = 0;\n    }\n\n    res.render('index', { message: message });\n});\n\nhttp.Server(app).listen(PORT, function () {\n    console.log(\"HTTP server listening on port %s\", PORT);\n});\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/app/docker-compose.yml",
    "content": "version: \"3\"\n\nservices:\n  web:\n    build: .\n    command: nodemon -L --inspect=0.0.0.0:5858\n    volumes:\n      - .:/code\n    ports:\n      - \"8000:8000\"\n      - \"5858:5858\"\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/app/index.html",
    "content": "<html>\n    <head>\n        <meta http-equiv=\"refresh\" content=\"2\">\n\n        <style type=\"text/css\">\n            body {\n                font-family: Helvetica, Arial, sans-serif;\n                font-weight: 600;\n                font-size: 56pt;\n                text-transform: uppercase;\n                text-align: center;\n                background: #3c3;\n                color: white;\n            }\n        </style>\n    </head>\n\n    <body>&ldquo;{{message}}&rdquo;</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/app/layouts/main.handlebars",
    "content": "<html>\n\n<head>\n  <meta http-equiv=\"refresh\" content=\"2\">\n\n  <style type=\"text/css\">\n    body {\n      font-family: Helvetica, Arial, sans-serif;\n      font-weight: 600;\n      font-size: 56pt;\n      text-transform: uppercase;\n      text-align: center;\n      background: #3c3;\n      color: white;\n    }\n  </style>\n</head>\n\n<body>&ldquo;{{message}}&rdquo;</body>\n\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/nodejs-debugging/app/package.json",
    "content": "{\n    \"main\": \"app.js\",\n    \"dependencies\": {\n        \"express\": \"~4.17.3\",\n        \"express-handlebars\": \"~5.3.1\"\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/developer-tools/ruby/README.md",
    "content": "# Rails on Docker\n\nRuby on Rails is a popular web application framework. Implementng RoR in containers presents challenges because of conflicting workflows and practices between Ruby on Rails and container based development. Developing RoR applications in containers is feasible keeping in mind that these differences can be overcome by changing workflows and practices.\n\n## Challenges and Remediations\n\n### Different versions of Ruby\n\nThere are many different versions of Ruby in use. Ruby applications can be based on 1.8, 1.9, 2.0 and all intermediary versions up to the latest release. This includes \"upstream\" Ruby but also REE (an \"Enterprise Edition\" set of patches, for older versions of Ruby), and a number of \"Ruby on X\" ports: JRuby (on top of the JVM), IronRuby (on top of .NET), Maglev, Rubinius, RubyMotion, and more. \n\nIn contrast, there are also many many versions of Python in use, but the majority of applications use the lastest 2.X or 3.X versions. Similarly, Java applications use the last two major releases of either Java released by Oracle or OpenJDK. \n\nEarlier versions of Ruby are used in production because upgrading presents challenges such as, critical gems are not backward-compatible. Debugging tools like pry, rubocop, byebug... do work on many versions, but not consistently on all Ruby verisons.\n\nAs a result, Ruby developers (and people deploying Ruby apps) rely on tools like [rvm](https://rvm.io/) or [rbenv](https://github.com/rbenv/rbenv) to install a specific version of Ruby. These tools enable developers to switch between different versions of Ruby, and between different sets of gems (when different applications have conflicting requirements).\n\nRuby programmers expect to be able to request a specific version of Ruby on demand. This is not currently available on Docker Store and developers will have to create Dockerfiles that are specific to development environment requirements. Docker Store currently has Ruby 2.1, 2.2, 2.3; which means the images on Docker Store can support newer applications.  However, migrating older applications to a container may require custom builds to meet Ruby version requirements.\n\n\n#### Use RVM to manage Ruby Versions\n\nUsing RVM poses other challenges. Specifically, RVM works with a combination of custom PATH and shell functions. After installing RVM in a Dockerfile (e.g. ```curl get.rvm.io | bash```); to use RVM, it must be run in a login shell. However, the shell started by Docker (when executing a \"RUN\" build step) is not a login shell.\n\nOne workaround is to wrap all commands with \"bash -l -c\", e.g.:\n\n```\nRUN bundle install\n```\n\nBecomes\n\n```\nRUN bash -l -c \"bundle install\"\n```\n\nAnother workaround is to symlink /bin/sh to /usr/local/rvm/bin/rvm-shell. If you do that, you also need to change /bin/which so that it uses #!/bin/dash instead of #!/bin/bash (on many Linux systems, /bin/which is implemented as a shell script; and rvm-shell depends on /bin/which; so you get an infinite loop). Albeit clunky, that workaround is the one that was the most satisfying (less side effects, less potential for mistake if you forget to wrap RUN commands properly, less risk to use system Ruby my mistake...)\n\n### Bundler\n[Bundler](http://bundler.io/) is a very popular tool in the Ruby world. It is \"an exit from dependency hell, and ensures that the gems needed are present in development, staging, and production.\"\n\n#### Adding Gems during development\nBundler makes sure that a Ruby app can access the gems listed in the Gemfile, and only those gems. This is different from Python's pip: with pip, you can install a bunch of dependencies from a requirements.txt file, then manually install a few extras. With bundler, everything has to be in the Gemfile. This is advantage when you want to avoid \"leaking\" dependencies; i.e. being unaware that your project does, in fact, use some gems that are not declared in your Gemfile. However, it means that in a Docker environment, you have to use a separate Gemfile.tip file where you add extra gems during development.\n\n```\n# Example from: https://github.com/cpuguy83/docker-rails-dev-demo/blob/master/Dockerfile\n\nFROM ruby:2.2\nRUN apt-get update && apt-get install -y sqlite3 libsqlite3-dev openssl libssl-dev libyaml-dev libreadline-dev libxml2-dev libxslt1-dev\nWORKDIR /opt/myapp\nENV RAILS_ENV production\n\n# Add Gemfile stuff first as a build optimization\n# This way the `bundle install` is only run when either Gemfile or Gemfile.lock is changed\n# This is because `bundle install` can take a long time\n# Without this optimization `bundle install` would run if _any_ file is changed within the project, no bueno\nADD Gemfile /opt/myapp/\nADD Gemfile.lock /opt/myapp/\nRUN bundle install\n\n# This will now install anything in Gemfile.tip\n# This way you can add new gems without rebuilding _everything_ to add 1 gem\n# Anything that was already installed from the main Gemfile will be re-used\nADD Gemfile.tip /opt/myapp/\nRUN bundle install\n\n\n# Add rake and its dependencies\nADD config /opt/myapp/config\nADD Rakefile /opt/myapp/\n\n# Add everything else\n# Any change to any file after this point (if not in .dockerignore) will cause the build cache to be busted here\n# This includes changes to the Dockerfile itself\n# Goal here is to do as little as possible after this entry\nADD . /opt/myapp\n\nENV PATH /opt/myapp/bin:$PATH\nENTRYPOINT [\"/opt/myapp/bin/start.rb\"]\nCMD [\"server\"]\n```\n#### Caching Gem Files to Avoid Long Build Times\nBundler becomes particularly problematic when switching back and forth between different branches. Each new branch with a different Gemfile (even if 90% of the versions therein are the same) will trigger a full build (which can easily amount to half an hour for an average Rails project, with a decent computer and internet access; and can be multiple hours for a big project and/or a more modest hardware setup or internet access). The [work around](http://ilikestuffblog.com/2014/01/06/how-to-skip-bundle-install-when-deploying-a-rails-app-to-docker/) to Bundler running on each build is to copy the Gemfile and Gemfile.lock to a temporary directory and run Bundler from there. If neither file is changed during subsequent builds, the ADD instructions will be cached. Below is a working example:\n\n```\nFROM ubuntu:12.10\nMAINTAINER brian@morearty.org\n \n# Install dependencies.\nRUN apt-get update\nRUN apt-get install -y curl git build-essential ruby1.9.3 libsqlite3-dev\nRUN gem install rubygems-update --no-ri --no-rdoc\nRUN update_rubygems\nRUN gem install bundler sinatra --no-ri --no-rdoc\n \n# Copy the Gemfile and Gemfile.lock into the image. \n# Temporarily set the working directory to where they are. \nWORKDIR /tmp \nADD railsapp/Gemfile Gemfile\nADD railsapp/Gemfile.lock Gemfile.lock\nRUN bundle install \n \n# Everything up to here was cached. This includes\n# the bundle install, unless the Gemfiles changed.\n# Now copy the app into the image.\nADD railsapp /opt/railsapp\n \n# Set the final working dir to the Rails app's location.\nWORKDIR /opt/railsapp\n \n# Set up a default runtime command\nCMD rails server thin\n```\n\nThe previous issue becomes totally unbearable when doing a git bisect, or trying to find which specific revision introduced a specific bug or broke a specific test. Each modification (even minor) of the Gemfile triggers a 30-minute full rebuild (instead of taking a couple of minutes tops).\n\n#### Using Bundler Under Limited Bandwidth \n\nIn the case of with slow internet connections, it is possible to run a local gem server. Rubygems.org provides a [guide](http://guides.rubygems.org/run-your-own-gem-server/) for running a local gem server. The caveat to a local gem server is that the Dockerfile becomes then less portable, since it relies on the gem server to be up. Note that even with a mirror, a lot of gems take a long time to install, because they build native extensions.\n\nIn practice, the divide and conquer strategy appears to be successful; i.e. spin up cloud instances, split the commits in ranges, and assign a range to each instance, and do a simple \"docker build\" each time. Howerver, in a test of ~100 commits (with more than half of the time spent installing dependencies vs. actually running tests) this took over 6 hours\n\nMounting a volume across builds would help, since bundler could use this as a gem cache. (This also has been asked by people building Python apps, in particular using SciPy and NumPy, which are notoriously slow to build.) People generally understand the argument that build-time volumes break reproducibility of builds, but it still leaves them short of a good solution to achieve fast builds.\n\n### RAILS_ENV\n\nOne of the tenets of Docker is to use the same container images in dev, testing, preprod, and prod. In Rails, there is the notion of environments. A typical Rails project will have dev, production, test, staging. (Not always all of them, sometimes more; but this is typical.)\n\nSetting the RAILS_ENV environment variable switches between environments. Each environment has:\n\n* a different set of gems (you don't have the debugging tools in production),\n* a different way to handle static assets (you don't precompile JS, CSS, etc. in dev),\n* a different database (at least a different server, but sometimes a totally different engine),\n\nThis architecture is not the standard Docker model, but works well for Ruby development practices.\n\n### Assets Pipeline\n\nAssets include javascript, CSS, images... These resources often need to be transformed before being served to the user:\n\n* javascript can be \"minified\";\n* CSS can be compiled (using e.g. SASS or LESS);\n* images can be resized or converted.\n\nIn dev mode, this is done on-the-fly by the application server (a file can be edited and immediately reload in your browser, without having to recompile assets or restart the application server).\n\nIn production, however, assets are pre-compiled, and served by a static server. Sometimes, pre-compiled assets are pushed to a CDN instead of being served directly. \n\nAssets are meant to be heavily cached by the clients. To enable that, asset URLs are seeded, e.g. \"/assets/main.css\" becomes \"/assets/main-eb665b0c5b3ae55b0765b570d225700e.css\", and when the file is modified, the name changes too (to force a cache miss from the clients). This means:\n\n* that at any given time, a client might still have (in cache) an older version of a CSS, JS, or other asset, itself referencing another asset that hasn't been loaded yet (if the asset is loaded on demand, e.g. a hover image); therefore, old versions of assets should be kept forever (or at least long enough to avoid breaking too many users when rolling out a new version);\n* that a manifest is generated after the pre-compilation, containing the mapping giving the seeded path for each asset. The manifest is required by the application server to produce correct URLs pointing to the assets.\n\nThe assets pipeline has an extra challenge: when pre-compiling assets, the whole Rails framework is brought up, including the database connection (even if it's not strictly necessary 99% of the time). This means that the database server must be available to pre-compile the assets. This makes it extra difficult to run the assets pipeline from a Dockerfile.\n\n#### RAILS_ENV and Assets Pipeline\n\nThis requires a departure from the typical Ruby workflow. Having a single environment that always compute assets on the fly is the typical Docker pattern, instead of handling dev and production separately. To avoid overloading the app server with assets compilation, a caching web server can be used such asSquid or Varnish. In this specific scenario, since expiration is not a concern, NGINX can adequately address the issue of computing assets on the fly.\n\n### App Server vs Web Server\n\nRails, like a few other complex frameworks, makes a clear distinction between the application server and the web server. The web server handles static files (and often deals with redirections, logging, conditionals...) and hands off everything else to the app server, which is the actual Ruby part. The web server is (almost always) necessary, because it appears to be unfeasible to achieve high performance static file serving with a pure Ruby solution. The most frequently used web servers are Apache or NGINX, while the popular app servers include Thin, Unicorn, and Mongrel.\n\nSometimes the app server is a module in the web server. While the latter seems simpler from an architectural point of view, it implies a more complex configuration for the web server, since the subtleties of \"which Ruby interpreter to use\" and \"which gem set to activate\" now propagate to the web server. Furthermore, app server and web server have to share some information about the static assets (see previous paragraph).\n\n#### Containerization: App Server vs Web Server\n\nThere are at minimum four possibilities for app server and web server containerization, each with their pros and cons:\n\n* app server and web server in separate containers, assets pre-compiled at build time: this achieves clean separation, and efficient handling of assets; but the assets have to be built in the app server, then extracted to be copied to the web server before building the web server image; moreover, the database has to be available at build time;\n\n* app server and web server in separate containers, assets pre-compiled at run time, placed in a volume: this achieves clean separation; there is a transient period (just after deployment) where assets have yet to be built, and the service is not fully operational; so zero-downtime deployment requires extra steps; since the assets are built at run-time, database availability is not an issue;\n\n* app server and web server in separate processes but in the same container: this considerably simplifies asset handling (though database availability remains an issue), but it requires using a process manager in the container, since we're running two independent processes in the same container;\n\n* app server and web server in the same process (and in the same container): this obviates the question of whether to put them in separate containers or not, but it is much less flexible, since it reduces the choice of app servers down to Passenger and mod_ruby. Also, configuration becomes a bit trickier (but admittedly, this should be a one-time cost).\n\n\n### Database Migrations\n\nRails has a sophisticated database migration mechanism, helping operators to ensure that the database schema is exactly in sync with ActiveRecord models as they are declared in the application code. This is not a problem and Rails even comes with a few functions to run migrations in a rather safe way, i.e. \"bring up the database schema to what it should be, no matter what.\"\n\nHowever, this mechanism hasn't been designed with automation in mind. The typical workflow when deploying a Rails app is to execute Capistrano from a central machine. Capistrano will distribute the new version of the code, pre-compile assets, execute database migrations, and so on. But in a container-based environment, there is no central machine. If migrations are executed by the app container, in a scaled environment, you end up with multiple migrations running at the same time. This requires some extra rules.\n\nIn addition there is an overall reliance on the database for any rake task. It is common practice that virtually all rake tasks (like assets pre-compilations) would bring up the database driver, even when it's not necessary at all. This adds an extra constraint on helper scripts and various tools that people write to maintain and operate their code.\n\n#### Containers and Database Migrations\n\nThis can be alleviated by the use of the (undocumented) rake task \"db:abort_if_pending_migrations\", which assesses whether the database is ready.\n\nThe general idea is to use an entrypoint that will:\n\n* wait for the database server to be up and accepting connections;\n* (if using a separate database for the app) check if the application database exists, and create it otherwise;\n* check if migrations are pending (this will also check if the schema has been created), and run migrations otherwise;\n* if the previous step failed, try again (this will protect against concurrent migration execution by multiple frontends).\n\nThis is probably not optimal (especially from a concurrent execution point of view) but it does the job acceptably.\n\n#### Containers and Database Access\n\nAs indicated above, many things (including asset pre-compilation) require database access, even though it is frequently unnecessary. Heroku veterans told me that their solution had been to mock the database presence when running specific things (like assets pre-compilation) to let those steps run without the database.\n\n## Resources\n\nHere are additional sources to checkout. \n\n* [Ruby on Docker Store](https://store.docker.com/images/ruby)\n* [Compose and Rails Quickstart](https://docs.docker.com/compose/rails/)\n* [Rails & Assets with Docker](http://red-badger.com/blog/2016/06/22/docker-and-assets-and-rails-oh-my/)\n* [Docker on Rails Demo](https://github.com/cpuguy83/docker-rails-dev-demo)\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/README.md",
    "content": "# DockerCon US 2017 Hands-On Labs (HOL)\n\n![dcus2017](images/dockercon.png)\n\nThis repo contains the series of hands-on labs presented at DockerCon 2017 in Austin. They are designed to help you gain experience in various Docker features, products, and solutions. Depending on your experience, each lab requires between 30-45 minutes to complete. They range in difficulty from easy to advanced.\n\nAt the Hands-on Labs at DockerCon 2017 in Austin, we issued [Microsoft Azure](https://azure.microsoft.com/) credentials and hostnames. Many of these labs assumes you have Azure VMs and Docker Datacenter licenses. You can sign up for Azure resources through the Azure site. Each lab will identify prerequists at the begining of the lab. For Linux base nodes you \n\nYou can get a trial license for Docker Datacenter through [Docker Store](https://store.docker.com/search?offering=enterprise&type=edition).\n\n---\n\n## [Continuous Integration With Docker Cloud](./docker-cloud)\n\nIn this lab, you will learn how to configure a continuous integration (CI) pipeline for a web application using Docker Cloud's automated build features. You will complete the following tasks as part of the lab:\n\n> **Difficulty**: Beginner\n>\n> **Time**: Approximately 20 minutes\n>\n> **Tasks / Concepts**\n> \n> - Configure Docker Cloud to Automatically Build Docker Images\n> - Configure Docker Cloud Autobuilds\n> - Trigger an Autobuild\n\n\n\n## [Docker Swarm Orchestration Beginner](./docker-orchestration)\n\nIn this lab you will play around with the container orchestration features of Docker. You will deploy a simple application to a single host and learn how that works. Then, you will configure Docker Swarm Mode, and learn to deploy the same simple application across multiple hosts. You will then see how to scale the application and move the workload across different hosts easily.\n\n> **Difficulty**: Beginner\n>\n> **Time**: Approximately 30 minutes\n>\n> **Tasks / Concepts**\n>\n> * What is Orchestration\n> * Configure Swarm Mode\n> * Deploy applications across multiple hosts\n> * Scale the application\n> * Drain a node and reschedule the containers\n\n## [Docker Swarm Orchestration Advanced](./docker-enterprise)\n\n> **Difficulty**: Intermediate to Advanced\n>\n> **Time**: Approximately 45 minutes\n>\n> **Tasks / Concepts**\n> \n> * Deploy a full 3-node Swarm & UCP cluster\n> * Use the Swarm UI\n> * Deploy a multi-service, multi-node application\n> * Simulate a node failure\n> * Use application load balancing\n> * Overlay networking\n> * Application secrets\n> * Application health checks and self-healing apps\n\n## [Securing Apps with Docker EE Advanced / Docker Trusted Registry](./securing-apps-docker-enterprise)\n\nIn this lab you will integrate Docker EE Advanced in to your development pipeline. You will build your application from a Dockerfile and push your image to the Docker Trusted Registry (DTR). DTR will scan your image for vulnerabilities so they can be fixed before your application is deployed. This helps you build more secure apps!\n\n\n> **Difficulty**: Beginner\n>\n> **Time**: Approximately 30 minutes\n>\n> **Tasks / Concepts**:\n>\n> * Build a Docker Application\n> * Pushing and Scanning Docker Images\n> * Remediating Application Vulnerabilities\n\n\n## [Docker Networking](./docker-networking)\n\nIn this lab you will learn about key Docker Networking concepts. You will get your hands dirty by going through examples of a few basic networking concepts, learn about Bridge and Overlay networking, and finally learning about the Swarm Routing Mesh.\n\n> **Difficulty**: Beginner to Intermediate\n>\n> **Time**: Approximately 45 minutes\n>\n> **Tasks / Concepts**\n>\n> * Networking Basics\n> * Bridge Networking\n> * Overlay Networking\n\n## [Windows Docker Containers 101](./windows-101)\n\nDocker runs natively on Windows 10 and Windows Server 2016. In this lab you'll learn how to package Windows applications as Docker images and run them as Docker containers. You'll learn how to create a cluster of Docker servers in swarm mode, and deploy an application as a highly-available service.\n\n> **Difficulty**: Beginner \n>\n> **Time**: Approximately 30 minutes\n>\n> **Tasks / Concepts**:\n>\n> * Run some simple Windows Docker containers\n> * Package and run a custom app using Docker\n> * Run your app in a highly-available cluster\n\n## [Modernize .NET Apps - for Devs](./windows-modernize-aspnet-dev)\n\nYou can run full .NET Framework apps in Docker using the [Windows Server Core](https://store.docker.com/images/windowsservercore) base image from Microsoft. That image is a headless version of Windows Server 2016, so it has no UI but it has all the other roles and features available. Building on top of that there are also Microsoft images for [IIS](https://store.docker.com/images/iis) and [ASP.NET](https://store.docker.com/images/aspnet), which are already configured to run ASP.NET and ASP.NET 3.5 apps in IIS.\n\nThis lab steps through porting an ASP.NET WebForms app to run in a Docker container on Windows Server 2016. With the app running in Docker, you can easily modernize it - and in the lab you'll add new features quickly and safely by making use of the Docker platform.\n\n> **Difficulty**: Beginner \n>\n> **Time**: Approximately 35 minutes\n>\n>**Tasks / Concepts**\n>\n> - Package an existing ASP.NET application so it runs in Docker, without any application changes.\n> - Run SQL Server Express in a Docker container, and use it for the application database.\n> - Use a feature-driven approach to address problems in the existing application, without an extensive re-write.\n> - Use the Dockerfile and Docker Compose syntax to replace manual deployment documents.\n\n## [Modernize .NET Apps - for Ops](./windows-modernize-aspnet-ops)\n\nYou'll already have a process for deploying ASP.NET apps, but it probably involves a lot of manual steps. Work like copying application content between servers, running interactive setup programs, modifying configuration items and manual smoke tests all add time and risk to deployments. \n\nIn Docker, the process of packaging applications is completely automated, and the platform supports automatic update and rollback for application deployments. You can build Docker images from your existing application artifacts, and run ASP.NET apps in containers without going back to source code.\n\nThis lab is aimed at ops and system admins. It steps through packaging an ASP.NET WebForms app to run in a Docker container on Windows 10 or Windows Server 2016. It starts with an MSI and ends by showing you how to run and update the application as a highly-available service on Docker swam.\n\n>**Difficulty**: Beginner \n>\n>**Time**: Approximately 30 minutes\n>\n>**Tasks / Concepts**\n>\n> - Package an existing ASP.NET MSI so the app runs in Docker, without any application changes.\n> - Create an upgraded package with application updates and Windows patches.\n> - Update and rollback the running application in a production environment with zero downtime.\n\n## [DockerCon 2017 Austin Workshops](workshop-slides/README.md)\n\nAt DockerCon 2017 in Austin, we had [10 workshops](https://2017.dockercon.com/workshops/), each lasting about 3 hours."
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/docker-cloud/README.md",
    "content": "# Continuous Integration With Docker Cloud\r\n\r\n\r\n> **Difficulty**: Beginner\r\n\r\n> **Time**: Approximately 20 minutes\r\n\r\nIn this lab, you will learn how to configure a continuous integration (CI) pipeline for a web application using Docker Cloud's automated build features. You will complete the following tasks as part of the lab:\r\n\r\n> - [Task 0: Configure the prerequisites](#prerequisites)\r\n> - [Task 1: Configure Docker Cloud to Automatically Build Docker Images](#deploy_app)\r\n>  - [Task 1.1: Configure Docker Cloud Autobuilds](#autobuild)\r\n>  - [Task 1.2: Trigger an Autobuild](#test_autobuild)\r\n\r\n\r\n## What is Docker Cloud?\r\n\r\nDocker Cloud is Docker's cloud platform for individual developers and teams to build, ship, and run containerized applications. Docker Cloud enables teams to come together to collaborate on their projects and automate complex continuous delivery flows, which enables you to focus on improving your app, and leave the rest up to Docker Cloud.\r\n\r\n## Document conventions\r\n\r\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \r\n\r\nFor instance if you see `ssh <username>@<hostname>` you would actually type something like `ssh ubuntu@node0-gvs0mgc0216.southcentralus.cloudapp.azure.com`\r\n\r\nYou may be asked to SSH into various nodes. These nodes are referred to as **node0**, **node1** etc. These tags correspond to the very beginning of the hostnames you will find in your welcome email. \r\n\r\n## <a name=\"prerequisites\"></a>Task 0: Prerequisites\r\n\r\nIn order to complete this lab, you will need the following:\r\n\r\n- A Docker ID\r\n- A management host (for this lab you'll need a Linux named **node0**)\r\n- A GitHub account\r\n- Git installed\r\n\r\n### Obtain a Docker ID\r\n\r\nIf you do not already have a Docker ID, you will need to create one now. Creating a Docker ID is free, and allows you to use [Docker Cloud](https://cloud.docker.com).\r\n\r\nIf you already have a Docker ID, skip to the next prerequisite.\r\n\r\nTo create a Docker ID:\r\n\r\n1. Use your web browser to visit [`https://cloud.docker.com`](https://cloud.docker.com).\r\n\r\n2. On the right hand side of the screen, enter your preferred Docker ID, supply your email address, and choose a password.\r\n\r\n3. Click `Sign up`.\r\n\r\n4. Check your email (**including your spam folder**) for a confirmation email.\r\n\r\n5. Follow the steps outlined in the email.\r\n\r\n6. You should be redirected back to `https://cloud.docker.com`.\r\n\r\nYou now have a Docker ID. Remember to keep the password safe and secure. \r\n\t\t\r\n  \r\n### GitHub account\r\n\r\nIn order to complete the CI portions of this lab, you will need an account on GitHub. If you do not already have one, you can create one for free at [GitHub](https://github.com).\r\n\r\nContinue with the lab as soon as you have completed the prerequisites.\r\n\r\n\r\n# <a name=\"deploy_app\"></a>Task 1: Configure Docker Cloud to Automatically Build Docker Images\r\n\r\nOne of the most powerful features of Docker Cloud is the ability to define end-to-end CI/CD pipelines. In this part of the lab, you're going to link your GitHub account to Docker Cloud to facilitate seamless application delivery.\r\n\r\nLet's start by linking your Docker Cloud account to your GitHub account:\r\n\r\n1. Using your web browser, go to <a href=\"https://cloud.docker.com\">https://cloud.docker.com</a> and sign in with your Docker ID.\r\n\r\n2. Click the **Cloud Settings** link in the menu on the left hand side of the Docker Cloud web UI.\r\n\r\n> **Note**: If you cannot see menu on the left, un-select **Swarm Mode** at the top of the screen.\r\n\r\n3. Scroll down to the **Source providers** section. Click the **power plug** icon next to GitHub, and follow the procedure to link your GitHub account.\r\n\r\n![](./images/power_socket.jpg)\r\n\r\nNow that you've got Docker Cloud linked to your GitHub account, we'll start by forking a demo repo.\r\n\r\n1. In your web browser, navigate to <a href=\"https://github.com/Cloud-Demo-Team/voting-demo.git\"> https://github.com/Cloud-Demo-Team/voting-demo.git</a>.\r\n\r\n2. Click the **Fork** button in the upper right hand corner to create your own copy of the source repository.\r\n\r\nNext, we'll clone the repository into our local Docker environment. The following commands will be executed in the terminal or command window from Linux **node0**\r\n\r\n1. If you have not already, log into your Azure VM. For example:\r\n\r\n\t```ssh ubuntu@node0-gvs0mgc0216.southcentralus.cloudapp.azure.com```\r\n\r\n1. Change to your home directory.\r\n\r\n  `$ cd` \r\n\r\n2. Clone the repository (you will need to have `git` installed and the `git` binary present in your PATH).\r\n\r\n\t\t$ git clone https://github.com/<your github user name>/voting-demo.git\r\n\r\n\t\tCloning into 'voting-demo'...\r\n\t\tremote: Counting objects: 481, done.\r\n\t\tremote: Total 481 (delta 0), reused 0 (delta 0), pack-reused 481\r\n\t\tReceiving objects: 100% (481/481), 105.01 KiB | 0 bytes/s, done.\r\n\t\tResolving deltas: 100% (246/246), done.\r\n\t\tChecking connectivity... done.\r\n\r\n  This will create a copy of the forked repo in a directory called `voting-demo` within your home directory.\r\n\r\n# <a name=\"autobuild\"></a>Task 1.1: Configure Autobuilds\r\n\r\nDocker Cloud can automatically build new images when updates are pushed to a repository on GitHub.\r\n\r\nIn this step, you're going to build two GitHub repositories - one for the **voting** part of the app and one for the **results** part. You'll configure two new repositories in Docker Cloud so that each time a change is pushed to the source repo an updated Docker image will be built.\r\n\r\n1. In your web browser, return to Docker Cloud and click the **Repositories** link on the left hand side.\r\n\r\n\t![](images/repositories.png)\r\n\r\n2. Click the **+** icon near the top right of the page and select **Repository**.\r\n\r\n3. Enter the following information in the **Create Repository** section:\r\n\r\n\t+ **Name**: results\r\n\t+ **Description**: Results service for the Docker voting app\r\n    + **Visibilty**: public\r\n\r\n4. In the **Build Settings** section, you should see that your GitHub account is connected. Click the **GitHub icon**. \r\n\r\n5. Make sure the your appropriate GitHub organization is populated from the drop down list, and select **voting-demo** for repository.\r\n\r\n6. Select \"Click here to customize the build settings\" to configure the build rules.\r\n\r\n7. Click **Create** at the bottom of the page.\r\n\r\n  You will be taken to the repository page.\r\n\r\n> Right now Docker Cloud doesn't let you specify the build context when you create a repository, so you need to update the settings\r\n\r\n8. Navigate to the Builds page and click 'Configure Automated Builds'. Scroll down to Build Rule, and set the **Build Context** to **/results**:\r\n\r\n![](images/update-automated-build.png)\r\n\r\n### Create a second repository\r\nRepeat steps 1-8 with the following modifications:\r\n\r\n  Create Repo (Step 3)\r\n  + **Name**: voting\r\n  + **Description**: Voting service for the Docker voting app\r\n\r\nSpecify the Dockerfile path (in Step 7):\r\n  + Enter **/voting/Dockerfile** for the **Dockerfile Path**\r\n\r\n### Check to make sure the repositories were created\r\nIf you click the **Repositories** menu on the left you should see both the ```voting``` and ```results``` respositories were created. \r\n\r\nWell done! You've created two new repos and configured them to autobuild whenever new changes are pushed to the associated GitHub repos.\r\n\r\n# <a name=\"test_autobuild\"></a>Task 1.2: Trigger an Autobuild\r\n\r\nSwitch back the command line of your VM. \r\n\r\n1. If you have not already log into your Azure VM. For example (be sure to use the actual node name supplied in your email):\r\n\r\n\t```ssh ubuntu@node0-gvs0mgc0216.southcentralus.cloudapp.azure.com```\r\n\r\n1. Change to the directory containing the voting app. \r\n\r\n\t\t$ cd ~/voting-demo/voting\r\n\r\n2. Use vi or your favorite text editor to open `app.py`.\r\n  + To use `vi` on Linux: `$ vi app.py`\r\n\r\n3. Scroll down to find the lines containing `optionA` and `optionB`, and change **Dev** and **Ops** to **Futbol** and **Soccer**.\r\n\r\n\t\toptionA = \"Futbol\"\r\n\t\toptionB = \"Soccer\"\r\n\r\n4. Save your changes.\r\n\r\n5. Commit changes to the repository and push to GitHub using `git add`, `git commit`, and `git push`.\r\n       \r\n       ```\r\n\t\t$ git add *\r\n\r\n\t\t$ git commit -m \"changing the voting options\"\r\n\t\t\r\n\t\t[master 2ab640a] changing the voting options\r\n \t\t1 file changed, 3 insertions(+), 2 deletions(-)\r\n\r\n \t\t$ git push origin master\r\n \t\t\r\n \t\tCounting objects: 4, done.\r\n\t\tDelta compression using up to 8 threads.\r\n\t\tCompressing objects: 100% (4/4), done.\r\n\t\tWriting objects: 100% (4/4), 380 bytes | 0 bytes/s, done.\r\n\t\tTotal 4 (delta 3), reused 0 (delta 0)\r\n\t\tTo https://github.com/<your github repo>/voting-demo.git\r\n   \t\tc1788a1..2ab640a  master -> master\r\n       ```\r\n> **Note:** You may be prompted to set your email and name when you attempt to commit your changes. If this is the case, simply follow the instructions provided on your screen.\r\n> \r\n> **Note:** If you have two factor authentication (2FA) configured on your GitHub account you will need to enter your personal access token (PAT) instead of your password when prompted.\r\n\r\n6. In the Docker Cloud web UI, navigate back to the **voting** repo and notice that the status is **BUILDING**.\r\n\r\n\t> **Note**: It can take several minutes for a build job to complete.\r\n\r\n\t![](images/building.png)\r\n\r\n7. Click the **Timeline** tab near the top of the screen.\r\n\r\n8. Click `Build in master:/voting`.\r\n\r\n\tHere you can see the status of the build process:\r\n\r\n\t![](images/build_status.png)\r\n\r\nCongratulations! You have successfully configured Docker Cloud to automatically build a new Docker image each time you push a change to your application's repository on GitHub.\r\n\r\n# <a name=\"autobuild\"></a>Learn More\r\n\r\nTo learn more about Docker Cloud’s continuous integration (CI) capabilities and how to bring more automation and collaboration to your application pipeline, check out:\r\n\r\n- **Video (Automated Builds with Docker Cloud)**: https://www.youtube.com/watch?v=sl2mfyjnkXk\r\n- **Docs**: https://docs.docker.com/docker-cloud/builds/automated-build/\r\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/docker-enterprise/README.md",
    "content": "# Application Orchestration with Docker Enterprise Edition\n\nIn this lab you will deploy an application on Docker Enterprise Edition that takes advantage of some of the latest features of Docker Universal Control Plane (UCP). UCP is an included component of Docker EE Standard and Docker EE Advanced. The tutorial will lead you through building a compose file that can deploy a full application on UCP in one click. Capabilities that you will use in this application deployment include:\n\n- Docker services\n- Application scaling and failure mitigation\n- Layer 7 load balancing\n- Overlay networking\n- Application secrets\n- Application health checks\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 45 - 60 minutes\n\n\n> **Tasks**:\n>\n> * [Prerequisites](#prerequisites)\n> * [Task 1: Installing UCP](#task1)\n>   * [Task 1.1: Installing the UCP Manager](#task1.1)\n>   * [Task 1.2: Joining UCP Worker Nodes](#task1.2)\n> * [Task 2: Deploying a Simple Application with Compose](#task2)\n>   * [Task 2.1: Okay, Let's Deploy!](#task2.1)\n>   * [Task 2.2: Scaling Services](#task2.2)\n>   * [Task 2.3: Deploying the Visualizer App](#task2.3)\n>   * [Task 2.4: Self-Healing Applications](#task2.4)\n> * [Task 3: Deploying a Complex Multi-Service Application](#task3)\n>   * [Task 3.1: Deploying a Stateful Service ](#task3.1)\n>   * [Task 3.2: Configuring Application Secrets](#task3.2)\n>   * [Task 3.3: Using Healthchecks to Control Application Lifecycle](#task3.3)\n>   * [Task 3.4: Upgrading with a Rolling Update](#task3.4)\n>   * [Task 3.5: Configuring Layer 7 Load Balancing](#task3.5)\n\n## Document conventions\n\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \n\n\n## <a name=\"prerequisites\"></a>Prerequisites\n\nThis lab is best done on three separate nodes, though it can be done with a single one. The requirements are as follows:\n\n- 3 Linux hosts on a version and distribution that support Docker\n- Docker Engine 17.03 EE (or higher) installed on each node\n- Open network access between the nodes\n- Ports `443` and `30000` - `30005` open on the lab nodes externally to the lab user\n\nDocker EE needs to be installed on each node. Docker EE installation instructions can be found here. The nodes can be in a cloud provider environment or on locally hosted VMs.\n\nFor the remainder of this lab the three nodes will be referred to as `node0`, `node1`, and `node2`.\n\nYour nodes may be using private IP addresses along with mapped public IP addresses or the lab environment may be entirely private. We will be referring to these IPs as `node0-private-ip`, `node0-public-ip`, or `node0-public-dns`. If you are using only private IPs then you will replace the `public` IP/DNS with the private equivalent.\n\n## <a name=\"task1\"></a>Task 1: Installing UCP\nThe following task will guide you through how to create a UCP cluster on your hosts.\n\n### <a name=\"task1.1\"></a>Task 1.1: Installing the UCP Manager\n\n1. Log in to `node0` of the three nodes you have been given for this lab. You may be prompted whether you want to continue. Answer `yes` and then enter the password.\n\n```\n$ ssh ubuntu@node0-smwqii1akqh.southcentralus.cloudapp.azure.com\n\nThe authenticity of host 'node0-smwqii1akqh.southcentralus.cloudapp.azure.com (13.65.212.221)' can't be established.\nECDSA key fingerprint is SHA256:BKHHGwzrRx/zIuO7zwvyq5boa/5o2cZD9OTlOlOWJvY.\nAre you sure you want to continue connecting (yes/no)? yes\nWarning: Permanently added 'node0-smwqii1akqh.southcentralus.cloudapp.azure.com,13.65.212.221' (ECDSA) to the list of known hosts.\nubuntu@node1-smwqii1akqh.southcentralus.cloudapp.azure.com's password:\n\nWelcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-72-generic x86_64)\n```\n\n2. Check to make sure you are running the correct Docker version. At a minimum you should be running `17.03 EE`\n\n```\n$ docker version\nClient:\n Version:      17.03.0-ee-1\n API version:  1.26\n Go version:   go1.7.5\n Git commit:   9094a76\n Built:        Wed Mar  1 01:20:54 2017\n OS/Arch:      linux/amd64\n\nServer:\n Version:      17.03.0-ee-1\n API version:  1.26 (minimum version 1.12)\n Go version:   go1.7.5\n Git commit:   9094a76\n Built:        Wed Mar  1 01:20:54 2017\n OS/Arch:      linux/amd64\n Experimental: false\n \n```\n\n3. Run the UCP installer to install the UCP Controller node.\n\nYou will have to supply the following values to the install command:\n- `--ucp-password` - This can be a password of your choosing\n- `--san` - This should be the public IP of `node0`\n\nYou may want to open up a text editor to enter in your ucp password and `--san` value.\n\n```\ndocker run --rm -it --name ucp \\\n-v /var/run/docker.sock:/var/run/docker.sock \\\ndocker/ucp:2.1.3 install \\\n--debug \\\n--admin-username admin \\\n--admin-password <your-password> \\\n--san <node0-public-dns> \\\n--host-address <node0-private-ip>\n```\n\nThis is an example of what your final install command might look like ...\n\n```\ndocker run --rm -it --name ucp \\\n-v /var/run/docker.sock:/var/run/docker.sock \\\ndocker/ucp:2.1.3 install \\\n--admin-username admin \\\n--admin-password <your-password> \\\n--san <node0-public-dns> \\\n--host-address <node0-private-ip>\n```\n\nIt will take up to 30 seconds to install.\n\n4. Log in to UCP by going to `https://<node0-public-dns>` in your browswer\n\nDepending on what browser you are using, you will receive a warning about the connection. Proceed through to the UCP URL. The warning is occuring because we UCP uses privately signed certificates by default. In a production installation we would add our own certificates that would be trusted by our browser.\n\n![](images/private.png) \n\nLog in as the user `admin` with the password that you supplied in step 3. You will be asked to upload a license. Skip this step. You will continue the lab without the license.\n\n![](images/ucp-login.png) \n\nYou now have a UCP cluster with a single node. Next you are going to add two nodes to the cluster. These nodes are known as Worker nodes and are the nodes that host application containers. \n\n### Optional: Add Manager Nodes for Cluster High Availability\n\nThis is not a requirement for the lab but is a best practice for any production clusters.\n\n1. In the UCP GUI, click through to Resources / Nodes. Click \"+ Add Node\" and check the box \"Add node as a manager\"\n\n2. On the same screen click \"Copy to Clipboard.\" This will copy the UCP join command.\n\n3. Log in to the other nodes that you would like to configure as managers and paste this join command on the CLI. \n\n\n### <a name=\"Task 1.2\"></a>Task 1.2: Joining UCP Worker Nodes\n\n\n1. In the UCP GUI, click through to Resources / Nodes. Click \"+ Add Node\" and then click \"Copy to Clipboard.\"\n\nThe string you copied will look something like the following:\n\n```\ndocker swarm join --token SWMTKN-1-5mql67at3mftfxdhoelmufv0f50id358xyyeps4gk9odgxfoym-4nqy2vbs5gzi1yhydhn20nh33 172.31.24.143:2377\n\n```\n\nThis is a Swarm join token. It includes the IP address of the UCP/Swarm manager so do not change it in the command. It is a secret token used by nodes so that they can securely join the rest of the UCP cluster.\n \n2. Log in to `node1`.\n\n```\n$ ssh ubuntu@<node1-public-ip>\n```\n\n3. On the command line run the Swarm join token command you copied from UCP. You will get a status message indicating that this node has joined the cluster.\n\n```\n$ docker swarm join \\\n>     --token SWMTKN-1-1dg967kx56j9s0l0o8t8oytwutacsspzjt6f2h2i31s3cevmcm-7tihlxtl2e2uztmxjhtgs5orz \\\n>     172.31.30.254:2377\nThis node joined a swarm as a worker.\n```\n\nThis indicates that this node is now joining your UCP cluster.\n\n4. Repeat steps 1 & 2 for `node2`\n\n5. Go to the UCP GUI and click on Resources / Nodes. You should now see that all of your nodes listed with their respective role as Manager or Worker.\n\n![](images/hosts.png) \n\nCongratulations! You have successfully installed and deployed a full UCP cluster. Wasn't that easy? You are now ready to move on to the rest of the lab.\n\n## <a name=\"Task 2\"></a>Task 2: Deploying a Simple Application with Compose\n\n### <a name=\"compose\"></a>Docker Compose Files\nCompose is a specification for defining and running multi-container Docker applications. With compose, you use a compose file to configure your application’s services. Then, using a single command, you create and start all the services from your configuration. A single compose file can define all aspects of your application deployment including networking, health checks, secrets, and much more. The full specification for compose is defined [here](https://docs.docker.com/compose/compose-file/).\n\n### <a name=\"stack\"></a>Docker Services and Stacks\n\nTo deploy an application on UCP or Swarm, you create a [service](https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/). Frequently a service will be the image for a microservice within the context of some larger application. Examples of services might include an HTTP server, a database, or any other type of executable program that you wish to run in a distributed environment. UCP schedules services across a cluster of UCP worker nodes. Services are managed by UCP throughout their lifecycle and can get rescheduled if they die, scaled up and down, gracefully terminated and more.\n\nA [Docker Stack](https://docs.docker.com/engine/reference/commandline/stack_deploy/#related-commands) is an instantiation of a compose file. When a compose file is deployed on UCP it is deployed as a stack. This stack is a group of related services (applications) that can be defined and deployed together in a single compose file.\n\nIn this section we will deploy the [Docker Pets](https://github.com/mark-church/docker-paas) application using a compose file. In the following sections we will add features to our compose file and make our application progressively more complex and feature-full. Docker Pets is a simple web app that records votes for different animals and uses a persistent backend to record the votes. It's comprised of two images:\n\n- **`chrch/docker-pets`** is a front-end Python Flask container that serves up random images of housepets, depending on the given configuration\n- **`consul`** (which will be used in a later compose file) is a back-end KV store that stores the number of visits that the web services recieve. It's configured to bootstrap itself with 3 replicas so that we have fault tolerant persistence.\n\nThis is the first iteration of our compose file for the Docker Pets application:\n\n```\nversion: '3.1'\nservices:\n    web:\n        image: chrch/docker-pets:1.0\n        ports:\n            - 5000\n        deploy:\n            replicas: 2\n        healthcheck:\n            interval: 10s\n            timeout: 2s\n            retries: 3   \n```\n\n- `version: '3.1'` is the version of the compose format we are using.\n- `web:` is the name that we are giving this service.\n- `image: chrch/docker-pets:1.0` defines the image and version that we are deploying in this service.\n- `ports:` configures the ports that we expose for our application. Our application listens on port `5000` so we are exposing port `5000` internally and mapping it to a random ephemeral port externally. UCP will take care of the port mapping and application load balancing for us.\n- `healthcheck:` defines the health check for our application. We are setting the `interval` for how often the check runs and how many `timeouts` we allow before we consider the container to be unhealthy.\n\n### <a name=\"task2.1\"></a>Task 2.1: Okay, Let's Deploy!\n\n1. Log in to your UCP GUI and go to Resources / Stacks & Applications. Click Deploy. \n\n![](images/deploy-button.png)\n\nPaste the above compose file text into the box under Application Definition. In the Application Name box write `pets`. Click the Create button.\n\n![](images/deploy.png) \n\nYou should see a success message:\n\n```\nCreating network pets_default\nCreating service pets_web\n```\n\nYour `pets` application stack is now deployed and live! It's running as two stateless containers   serving up a web page. \n\n2. Go to Resources and click on the stack that you just deployed. You will see that we deployed a service called `pets_web` and a network called `pets_default`. Click on the `pets_web` service and you will see all of the configured options for this service. Some of these are taken from our compose file and some are default options.\n\n![](images/stack.png) \n\n\n3. On the bottom of the `pets_web` page, UCP will show what ports it is exposing the application on. Click on this link. It will take you to the IP:port of where your application is being served.\n\n![](images/exposed-port.png) \n\nIn your browser you should now see the deployed Docker Pets app. It serves up an image of different pets. Click on \"Serve Another Pet\" and it will reload the picture.\n\n![](images/single-container-deploy.png) \n\n### <a name=\"task2.2\"></a>Task 2.2: Scaling Services\n\nSo far we have deployed a service as a single container. Our application will need some level of redundancy in case there is a crash or node failure, so we are going to scale the `web` service so that it's made of multiple containers running on different hosts.\n\n1. Go to Resources / Services / `pets_web`/ Scheduling. Edit the Scale parameter and change it from `2` to `3`. Click the checkmark and then Save Changes. After a few moments on the Services page we can see that the Status will change to `3/3` as the new container is scheduled and deployed in the cluster. Click on `pets_web` / Tasks. It shows the nodes where our `web` containers were deployed on. \n\n![](images/tasks.png) \n\n2. Now go back to the application `<node1-public-ip>:<published-port>` in your browser. Click Server Another Pet a few times to see the page get reloaded. You should see the Container ID changing between three different values. UCP is automatically load balancing your requests between the three containers in the `pets_web` service.\n\n### <a name=\"task2.3\"></a>Task 2.3: Deploying the Visualizer App\n\nNow we are going to deploy a second service along with our Docker Pets application. It's called the Visualizer and it visually shows how containers are scheduled across a UCP cluster.\n\nNow we are going to update the `pets` stack with the following compose file. We have added a couple things to this compose file. You are going to copy the entire compose file below and place it in to the application deployment field.\n\n```\nversion: '3.1'\nservices:\n    web:\n        image: chrch/docker-pets:1.0\n        deploy:\n            replicas: 3\n        ports:\n            - 5000\n        healthcheck:\n            interval: 10s\n            timeout: 2s\n            retries: 3   \n            \n    visualizer:\n        image: manomarks/visualizer\n        ports:\n            - 8080\n        deploy:\n            placement:\n                constraints: [node.role == manager]\n        volumes:\n            - /var/run/docker.sock:/var/run/docker.sock\n```\n\n- `replicas: 3` defines how many identical copies of a service container we want UCP to schedule. \n- `visualizer:` is a second service we are going deploy as a part of this stack. \n- `constraints: [node.role == manager]` is a scheduling requirement we are applying so that the `visualizer` is only scheduled on the manager node.\n- `- /var/run/docker.sock:/var/run/docker.sock` is a host-mounted volume we are mounting inside our container. This volume is being used so that the `visualizer` can communicate directly with the local docker engine.\n\n1. Go to Resources / Stacks & Applications / Deploy. Paste the above compose file text into the box under Application Definition with the title `pets`. \n\n![](images/deploy2.png) \n\nYou should see the following output:\n\n```\nUpdating service pets_web (id: vyp6gx092d1o6z7t2wy996i7u)\nCreating service pets_visualizer\n```\n\nThe `pets_visualizer` service is created and our existing `pets_web` service is updated. Because no `pets_web` parameters were changed in this compose file, there are no actions done to the `web` containers.\n\n2. Go to the `<node1-public-ip>:<published-port` that is listed on the bottom of the page of the \t`pets_visualizer` service in your browser window. This could actually be any of your three nodes because all traffic is being load balanced. This shows you the nodes of your UCP cluster and where containers are scheduled. You should see that the `pets_web` container is evenly distributed across your nodes.\n\n![](images/visualizer.png) \n\n\n### <a name=\"task2.4\"></a>Task 2.4: Self-Healing Applications with UCP\n\nNow that we have a redundant application that we can view with the Visualizer, we are going to simulate a failure to test UCP's ability to heal applications. We will shut off one of the Docker engines. This will simulate a node failure.\n\n1. Bring the Visualizer app up in your browser. Make note of how the `pets` containers are scheduled across your hosts. They should be distributed equally across all hosts.\n\n2. Log in to the commandline of one of your worker nodes (be sure not to do this to the manager node). Shut the Docker engine off with the following command.\n\n```\n$ sudo service docker stop\ndocker stop/waiting\n```\nThis will turn off the Docker engine and bring down all of the containers on this host.\n\n3. Now watch the visualizer app in your browser. You will see one of the nodes go red, indicating that UCP has detected a node failure. Any containers on this node will now get rescheduled on to other nodes. Since we defined it in our compose file with `replicas: 3`, UCP will ensure that we always have `3` copies of the `web` container running in our cluster.\n\n![](images/node-kill.png) \n\n4. Now return `ucp-worker-1` to a healthy state by turning the Docker engine on again.\n\n```\n$ sudo service docker start\ndocker start/running, process 22882\n```\n\n5. Finally, decommission this `pets` stack in the UCP GUI by clicking on `pets` / Actions / Remove Stack. Confirm the removal. You have just removed all of the containers and also the networks that were created when the stack was first deployed.\n\n![](images/removal.png) \n\n\n## <a name=\"task3\"></a>Task 3: Deploying a Complex Multi-Service Application\n\nIn this task we are going to add another service to the stack. Up to this point the Docker Pets application was a set of stateless web servers. Now we are going to add a persistent backend that will enhance the functionality of the application. We will use `consul` as a redundant backend which will store persistent data for our app, distributed across a set of nodes.\n\nThe resulting application will have 3 `web` frontend containers and 3 `db` consul containers. A backend network will be deployed for secure communication between `web` and `db`. The app is exposing HTTP endpoints for different services on ports `5000` and `7000`. UCP will publish these ports on each node in the UCP cluster. Application traffic to any of the external ports will get load balanced to healthy containers.\n\n\n![](images/pets-dev-arch.png) \n\n### <a name=\"task3.1\"></a>Task 3.1: Deploying a Stateful Service \n\nIn this step we will deploy a new compose file that adds functionality on top of the previous compose files.\n\n```\nversion: '3.1'\nservices:\n    web:\n        image: chrch/docker-pets:1.0\n        deploy:\n            replicas: 3\n        ports:\n            - 5000\n            - 7000\n        healthcheck:\n            interval: 10s\n            timeout: 2s\n            retries: 3\n        environment:\n            DB: 'db'\n        networks:\n        \t  - backend\n            \n    db:\n        image: consul:0.7.2\n        command: agent -server -ui -client=0.0.0.0 -bootstrap-expect=3 -retry-join=db -retry-join=db -retry-join=db -retry-interval 5s\n        deploy:\n            replicas: 3\n        ports:\n            - 8500 \n        environment:\n            CONSUL_BIND_INTERFACE: 'eth2'\n            CONSUL_LOCAL_CONFIG: '{\"skip_leave_on_interrupt\": true}'\n        networks: \n            - backend\n            \n    visualizer:\n        image: manomarks/visualizer\n        ports:\n            - 8080\n        deploy:\n            placement:\n                constraints: [node.role == manager]\n        volumes:\n            - /var/run/docker.sock:/var/run/docker.sock\n    \nnetworks:\n\t backend:\n```\n\n- `- 7000` is exposing a second port on our application. This port will serve traffic to administrate the app.\n- `environment:` defines environment variables that are set inside the container. In this compose file we are setting `DB=db`. Our backend service is named `db` so we are passing in the service name to the front end `web` service. During operations, built-in Docker DNS will resolve the service name to the IPs of the service's containers.\n- `image: consul:0.7.2` is the image and version for our backend data persistence store. We are deploying 3 replicas for a highly available backend.\n- `command:` is passing a specific command line argument to the consul image.\n- `networks: backend:` defines an overlay network that both `web` and `db` will connect to to communicate.\n\n1. Deploy the `pets` stack again with the above compose file. \n\n2. Once all the service tasks are up go to the `web` service externally published `<node1-public-ip>:<port>` that maps to the internal port `5000`. The Docker Pets app is written to take advantage of the stateful backend. Now it gives you the capability to cast a vote for your favorite pet. The vote will be stored by the `db` service along with the number of visits to the application.\n\n3. Submit your name and vote to the app.\n\n![](images/voting.png) \n\nAfter you cast your vote you will get redirected back to the pets landing page. \n\n4. Refresh the page a few times with Server Another Pet. You will see the page views climb while you get served across all three `web` containers.\n\n5. Now go to the `web` service externally published `<node1-public-ip>:<port>` that maps to the internal port `7000`. This page totals the number of votes that are held in the `db` backend.\n\n![](images/results.png) \n\n6. If you go to the `visualizer` service in your browser you will now see that a redundant Consul KV store is deployed on the Swarm. It's storing the votes for the application.\n\n### <a name=\"task3.2\"></a>Task 3.2: Configuring Application Secrets\n\nSecrets are any data that an application uses that is sensitive in nature. Secrets can be PKI certificates, passwords, or even config files. UCP handles secrets as a special class of data. Docker secrets are encrypted them at rest, sent to containers through TLS, and are mounted inside containers in a memory-only file that is never stored on disk. \n\nBefore we can configure our compose file to use a secret, we have to create the secret so it can be stored in the encrypted UCP key-value store. \n\n1. In the UCP GUI go to Resources / Secrets / +Create Secret. Name your secret `admin_password`. Enter the secret password of your choice and click Create.\n\n\n![](images/secret-create.png) \n\nThis secret will now be stored encrypted in the UCP data store. When applications request access to it, the secret will be sent encrypted to the container and mounted in a memory-only file on the host.\n\n2. Update the `pets` stack with the following compose file.\n\n```\nversion: '3.1'\nservices:\n    web:\n        image: chrch/docker-pets:1.0\n        deploy:\n            replicas: 3\n        ports:\n            - 5000\n            - 7000\n        healthcheck:\n            interval: 10s\n            timeout: 2s\n            retries: 3\n        environment:\n            DB: 'db'\n            ADMIN_PASSWORD_FILE: '/run/secrets/admin_password'\n        networks:\n        \t  - backend\n        secrets:\n            - admin_password\n            \n    db:\n        image: consul:0.7.2\n        command: agent -server -ui -client=0.0.0.0 -bootstrap-expect=3 -retry-join=db -retry-join=db -retry-join=db -retry-interval 5s\n        deploy:\n            replicas: 3\n        ports:\n            - 8500 \n        environment:\n            CONSUL_BIND_INTERFACE: 'eth2'\n            CONSUL_LOCAL_CONFIG: '{\"skip_leave_on_interrupt\": true}'\n        networks: \n            - backend\n\n            \n    visualizer:\n        image: manomarks/visualizer\n        ports:\n            - 8080\n        deploy:\n            placement:\n                constraints: [node.role == manager]\n        volumes:\n            - /var/run/docker.sock:/var/run/docker.sock\n    \nnetworks:\n\t backend:\n\nsecrets:\n    admin_password:\n        external: true\n```\n\nWe have made two additions to this compose file:\n\n- `ADMIN_PASSWORD_FILE:` is an environment variable that tells the `web` service that the secret will be stored at the location `/run/secrets/admin_password`\n- `secrets: admin_password` references the secret that we created in UCP. UCP will send the secret to the `web` containers wherever they are scheduled.\n\n3. Now go to the `<node1-public-ip>:<port>` on the `pets_web` service that is mapped to the internal port `7000`. This is the administrator consul that displays the votes. It should be protected by a password now. Use the secret you entered as the `admin_password`.\n\n![](images/password.png)\n\n\n### <a name=\"task3.3\"></a>Task 3.3: Using Healthchecks to Control Application Lifecycle\n\nThe Docker Pets application is built with a `/health` endpoint to advertise it's own health on port `5000`. Docker uses this endpoint to manage the lifecycle of the application.\n\n1. View the application health by going to `<node1-public-ip>:<port>/health` in your browser. You can use the `ip` of any of your UCP nodes. The `port` must be the external port that publishes the internal port `5000`.\n\nYou should receive an `OK` message indicating that this particular container is healthy.\n\n2. Now use your browser and go to the `<node1-public-ip>:<port>/kill` URL. This will toggle the health to unhealthy for one of the `web` containers. \n\nYou should receive a message similar to:\n```\nYou have toggled web instance 87660acc389c to unhealthy\n```\n\n3. Go to the Visualizer in your browser. You will see the healthcheck on one of the containers go to red. After a few more moments UCP will kill the container and reschedule another one. A default grace period is applied to allow existing application traffic to drain from this container. This simulates an application failure that is recovered by UCP.\n\n\n\n### <a name=\"task3.4\"></a>Task 3.4: Upgrading with a Rolling Update\n\nA rolling update is a deployment method to slowly and incrementally update a series of containers with a new version in a way that does not cause downtime for the entire application. One by one, UCP will update containers and check the application health for any issues. If the deployment begins to fail in any way, a rollback can be applied to return the app to the last known working configuration.\n\nIn the following steps we will update the `pets_web` service with a new image version. We will use a purposely broken image to simulate a bad deployment. \n\n1. Click on the `pets_web` service. On the Details page change the image to  `chrch/docker-pets:broken`. Make sure to click the green check so that the change is captured.\n\n2. On the Scheduling page update the following values:\n   - Update Parallelism `1`\n   - Update Delay `5`\n   - Failure Action `pause`\n   - Max Failure Ratio `0.2` (%)\n\n![](images/rolling.png)\n\nThese values mean that during a rolling update, containers will be updated `1` container at a time `5` seconds apart. If more than `20%` of the new containers fail their health checks then UCP will `pause` the rollout and wait for administrator action.\n\n3. The changes you made are now staged but have not yet been applied. Click Save Changes. This will start the rolling update.\n\n4. Now view the Visualizer app in your browser. You will see that the `chrch/docker-pets:broken` image is rolled out to a single container but it fails to pass it's health check. The second `chrch/docker-pets:broken` container will start failing afterwards which will trigger the rolling update to pause.\n\n![](images/paas-broken.png)\n\n5. In UCP, click on the `pets_web` service. You will see the status of the update is now paused because of a failed health check.\n\n![](images/pause.png)\n\n6. In the Details page of `pets_web` click Actions / Rollback. This will automatically rollback the `pets_web` service to the last working image.\n \n![](images/rollback.png)\n\n7. Repeat step 1 but this time use the image `chrch/docker-pets:2.0`.\n\n8. Repeat step 2 with the same values and click Save Changes.\n\n9. Observe a successful rolling update in the Visualizer. You will start to see each container being updated with the new image and in good health. Now go to the `<node1-public-ip>:<port>` that corresponds to the internal port `5000`. After a couple refreshes you should see that some of the containers have already updated.\n\n10. Before you go on to the next section, delete the `pets` stack.\n\n### <a name=\"task3.5\"></a>Task 3.5: Configuring Layer 7 Load Balancing\n\nLayer 7 load balancing in UCP can be provided by a feature called the HTTP Routing Mesh (HRM). In this section of the lab we configure HRM for several different ports and endpoints of `docker-pets`.\n\nThis part of the lab requires external configuration of DNS. An external DNS provider like AWS or an internal DNS should be configured for this lab. The details of the DNS configuration is outside the scope of the tutorial.\n\nSetup: Configure a wildcard DNS entry `*.<yourdomain.com>`. You will insert your URL for `<yourdomain.com>`. You can configure this DNS record to point to a load balancer that balances across multiple UCP nodes. For a simpler configuration, you can also use the IP address of any UCP node as this DNS record.  \n\n1. In the UCP GUI go to Admin Settings / Routing Mesh. In this window, check the box to enable the routing mesh and ensure that it is serving HTTP traffic on port `80`.\n\n![](images/routing-mesh.png)\n\n2. Deploy the following compose file as the `pets` stack. Input your configured URL for `<yourdomain.com>`. In this step we are configuring three URLs, `vote.*`, `admin.*`, and `viz.*` for three different services provided by the app. Go to these URLs and ensure that they are working correctly.\n\n```\nversion: '3.1'\nservices:\n    web:\n        image: chrch/docker-pets:1.0\n        deploy:\n            replicas: 3\n        ports:\n            - 5000\n            - 7000\n        labels:\n                com.docker.ucp.mesh.http.5000: \"external_route=http://vote.<yourdomain.com>,internal_port=5000\"\n                com.docker.ucp.mesh.http.7000: \"external_route=http://admin.<yourdomain.com>,internal_port=7000,sticky_sessions=paas_admin_id\"\n\n        healthcheck:\n            interval: 10s\n            timeout: 2s\n            retries: 3\n        environment:\n            DB: 'db'\n            ADMIN_PASSWORD_FILE: '/run/secrets/admin_password'\n        networks:\n        \t  - backend\n        \t  - ucp-hrm\n        secrets:\n            - admin_password\n            \n    db:\n        image: consul:0.7.2\n        command: agent -server -ui -client=0.0.0.0 -bootstrap-expect=3 -retry-join=db -retry-join=db -retry-join=db -retry-interval 5s\n        deploy:\n            replicas: 3\n        ports:\n            - 8500 \n        environment:\n            CONSUL_BIND_INTERFACE: 'eth2'\n            CONSUL_LOCAL_CONFIG: '{\"skip_leave_on_interrupt\": true}'\n        networks: \n            - backend\n\n            \n    visualizer:\n        image: manomarks/visualizer\n        ports:\n            - 8080\n        labels:\n            com.docker.ucp.mesh.http.8080: \"external_route=http://viz.<yourdomain.com>,internal_port=8080\"\n        deploy:\n            placement:\n                constraints: [node.role == manager]\n        volumes:\n            - /var/run/docker.sock:/var/run/docker.sock\n        networks: \n            - ucp-hrm\n    \nnetworks:\n    backend:\n    ucp-hrm:\n        external: true\n\nsecrets:\n    admin_password:\n        external: true\n```\n\n\n\n\n### Congratulations, you have completed the lab!!\n\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/docker-networking/README.md",
    "content": "# Docker Networking\r\n\r\nHi, welcome to the Networking lab for DockerCon 2017!\r\n\r\nIn this lab you will learn about key Docker Networking concepts. You will get your hands dirty by going through examples of a few basic networking concepts, learn about Bridge networking, and finally Overlay networking.\r\n\r\n> **Difficulty**: Beginner to Intermediate\r\n\r\n> **Time**: Approximately 45 minutes\r\n\r\n> **Tasks**:\r\n>\r\n> * [Prerequisites](#prerequisites)\r\n> * [Section #1 - Networking Basics](#task1)\r\n> * [Section #2 - Bridge Networking](#task2)\r\n> * [Section #3 - Overlay Networking](#task3)\r\n> * [Cleaning Up](#cleanup)\r\n\r\n## Document conventions\r\n\r\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \r\n\r\nFor instance if you see `ssh <username>@<hostname>` you would actually type something like `ssh ubuntu@node0-a.ivaf2i2atqouppoxund0tvddsa.jx.internal.cloudapp.net`\r\n\r\nYou will be asked to SSH into various nodes. These nodes are referred to as **node0-a**, **node1-b**, **node2-c**, etc.\r\n\r\n## <a name=\"prerequisites\"></a>Prerequisites\r\n\r\nThis lab requires two Linux nodes with Docker 17.03 (or higher) installed.\r\n\r\nAlso, please make sure you can SSH into the Linux nodes. If you haven't already done so, please SSH in to **node0-a** and **node1-b**.\r\n\r\n```\r\n$ ssh ubuntu@<node0-a IP address>\r\n```\r\n\r\nand \r\n\r\n```\r\n$ ssh ubuntu@<node1-b IP address>\r\n```\r\n\r\n# <a name=\"Task 1\"></a>Section #1 - Networking Basics\r\n\r\n## <a name=\"list_networks\"></a>Step 1: The Docker Network Command\r\n\r\nIf you haven't already done so, please SSH in to **node0-a**.\r\n\r\n```\r\n$ ssh ubuntu@<node0-a IP address>\r\n```\r\n\r\nThe `docker network` command is the main command for configuring and managing container networks. Run the `docker network` command from **node0-a**.\r\n\r\n```\r\n$ docker network\r\n\r\nUsage:\tdocker network COMMAND\r\n\r\nManage networks\r\n\r\nOptions:\r\n      --help   Print usage\r\n\r\nCommands:\r\n  connect     Connect a container to a network\r\n  create      Create a network\r\n  disconnect  Disconnect a container from a network\r\n  inspect     Display detailed information on one or more networks\r\n  ls          List networks\r\n  prune       Remove all unused networks\r\n  rm          Remove one or more networks\r\n\r\nRun 'docker network COMMAND --help' for more information on a command.\r\n```\r\n\r\nThe command output shows how to use the command as well as all of the `docker network` sub-commands. As you can see from the output, the `docker network` command allows you to create new networks, list existing networks, inspect networks, and remove networks. It also allows you to connect and disconnect containers from networks.\r\n\r\n## <a name=\"list_networks\"></a>Step 2: List networks\r\n\r\nRun a `docker network ls` command on **node0-a** to view existing container networks on the current Docker host.\r\n\r\n```\r\n$ docker network ls\r\nNETWORK ID          NAME                DRIVER              SCOPE\r\n3430ad6f20bf        bridge              bridge              local\r\na7449465c379        host                host                local\r\n06c349b9cc77        none                null                local\r\n```\r\n\r\nThe output above shows the container networks that are created as part of a standard installation of Docker.\r\n\r\nNew networks that you create will also show up in the output of the `docker network ls` command.\r\n\r\nYou can see that each network gets a unique `ID` and `NAME`. Each network is also associated with a single driver. Notice that the \"bridge\" network and the \"host\" network have the same name as their respective drivers.\r\n\r\n## <a name=\"inspect\"></a>Step 3: Inspect a network\r\n\r\nThe `docker network inspect` command is used to view network configuration details. These details include; name, ID, driver, IPAM driver, subnet info, connected containers, and more.\r\n\r\nUse `docker network inspect <network>` on **node0-a** to view configuration details of the container networks on your Docker host. The command below shows the details of the network called `bridge`.\r\n\r\n```\r\n$ docker network inspect bridge\r\n[\r\n    {\r\n        \"Name\": \"bridge\",\r\n        \"Id\": \"3430ad6f20bf1486df2e5f64ddc93cc4ff95d81f59b6baea8a510ad500df2e57\",\r\n        \"Created\": \"2017-04-03T16:49:58.6536278Z\",\r\n        \"Scope\": \"local\",\r\n        \"Driver\": \"bridge\",\r\n        \"EnableIPv6\": false,\r\n        \"IPAM\": {\r\n            \"Driver\": \"default\",\r\n            \"Options\": null,\r\n            \"Config\": [\r\n                {\r\n                    \"Subnet\": \"172.17.0.0/16\",\r\n                    \"Gateway\": \"172.17.0.1\"\r\n                }\r\n            ]\r\n        },\r\n        \"Internal\": false,\r\n        \"Attachable\": false,\r\n        \"Containers\": {},\r\n        \"Options\": {\r\n            \"com.docker.network.bridge.default_bridge\": \"true\",\r\n            \"com.docker.network.bridge.enable_icc\": \"true\",\r\n            \"com.docker.network.bridge.enable_ip_masquerade\": \"true\",\r\n            \"com.docker.network.bridge.host_binding_ipv4\": \"0.0.0.0\",\r\n            \"com.docker.network.bridge.name\": \"docker0\",\r\n            \"com.docker.network.driver.mtu\": \"1500\"\r\n        },\r\n        \"Labels\": {}\r\n    }\r\n]\r\n```\r\n\r\n> **NOTE:** The syntax of the `docker network inspect` command is `docker network inspect <network>`, where `<network>` can be either network name or network ID. In the example above we are showing the configuration details for the network called \"bridge\". Do not confuse this with the \"bridge\" driver.\r\n\r\n\r\n## <a name=\"list_drivers\"></a>Step 4: List network driver plugins\r\n\r\nThe `docker info` command shows a lot of interesting information about a Docker installation.\r\n\r\nRun the `docker info` command on **node0-a** and locate the list of network plugins.\r\n\r\n```\r\n$ docker info\r\nContainers: 0\r\n Running: 0\r\n Paused: 0\r\n Stopped: 0\r\nImages: 0\r\nServer Version: 17.03.1-ee-3\r\nStorage Driver: aufs\r\n<Snip>\r\nPlugins:\r\n Volume: local\r\n Network: bridge host macvlan null overlay\r\nSwarm: inactive\r\nRuntimes: runc\r\n<Snip>\r\n```\r\n\r\nThe output above shows the **bridge**, **host**,**macvlan**, **null**, and **overlay** drivers.\r\n\r\n# <a name=\"Task #2\"></a>Section #2 - Bridge Networking\r\n\r\n## <a name=\"connect-container\"></a>Step 1: The Basics\r\n\r\nEvery clean installation of Docker comes with a pre-built network called **bridge**. Verify this with the `docker network ls` command on **node0-a**.\r\n\r\n```\r\n$ docker network ls\r\nNETWORK ID          NAME                DRIVER              SCOPE\r\n3430ad6f20bf        bridge              bridge              local\r\na7449465c379        host                host                local\r\n06c349b9cc77        none                null                local\r\n```\r\n\r\nThe output above shows that the **bridge** network is associated with the *bridge* driver. It's important to note that the network and the driver are connected, but they are not the same. In this example the network and the driver have the same name - but they are not the same thing!\r\n\r\nThe output above also shows that the **bridge** network is scoped locally. This means that the network only exists on this Docker host. This is true of all networks using the *bridge* driver - the *bridge* driver provides single-host networking.\r\n\r\nAll networks created with the *bridge* driver are based on a Linux bridge (a.k.a. a virtual switch).\r\n\r\nInstall the `brctl` command and use it to list the Linux bridges on your Docker host. You can do this by running `sudo apt-get install bridge-utils` on **node0-a**.\r\n\r\n```\r\n$ sudo apt-get install bridge-utils\r\n```\r\n\r\nThen, list the bridges on your Docker host, by running `brctl show` on **node0-a**.\r\n\r\n```\r\n$ brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\ndocker0\t\t8000.024252ed52f7\tno\r\n```  \r\n\r\nThe output above shows a single Linux bridge called **docker0**. This is the bridge that was automatically created for the **bridge** network. You can see that it has no interfaces currently connected to it.\r\n\r\nYou can also use the `ip a` command on **node0-a** to view details of the **docker0** bridge.\r\n\r\n```\r\n$ ip a\r\n<Snip>\r\n3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default\r\n    link/ether 02:42:52:ed:52:f7 brd ff:ff:ff:ff:ff:ff\r\n    inet 172.17.0.1/16 scope global docker0\r\n       valid_lft forever preferred_lft forever\r\n```\r\n\r\n## <a name=\"connect-container\"></a>Step 2: Connect a container\r\n\r\nThe **bridge** network is the default network for new containers. This means that unless you specify a different network, all new containers will be connected to the **bridge** network.\r\n\r\nCreate a new container on **node0-a** by running `docker run -dt ubuntu sleep infinity`.\r\n\r\n```\r\n$ docker run -dt ubuntu sleep infinity\r\nUnable to find image 'ubuntu:latest' locally\r\nlatest: Pulling from library/ubuntu\r\nd54efb8db41d: Pull complete\r\nf8b845f45a87: Pull complete\r\ne8db7bf7c39f: Pull complete\r\n9654c40e9079: Pull complete\r\n6d9ef359eaaa: Pull complete\r\nDigest: sha256:dd7808d8792c9841d0b460122f1acf0a2dd1f56404f8d1e56298048885e45535\r\nStatus: Downloaded newer image for ubuntu:latest\r\n846af8479944d406843c90a39cba68373c619d1feaa932719260a5f5afddbf71\r\n```\r\n\r\nThis command will create a new container based on the `ubuntu:latest` image and will run the `sleep` command to keep the container running in the background. You can verify our example container is up by running `docker ps` on **node0-a**.\r\n\r\n```\r\n$ docker ps\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\r\n846af8479944        ubuntu              \"sleep infinity\"    55 seconds ago      Up 54 seconds                           heuristic_boyd\r\n```\r\n\r\nAs no network was specified on the `docker run` command, the container will be added to the **bridge** network.\r\n\r\nRun the `brctl show` command again on **node0-a**.\r\n\r\n```\r\n$ brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\ndocker0\t\t8000.024252ed52f7\tno\t\tvethd630437\r\n```\r\n\r\nNotice how the **docker0** bridge now has an interface connected. This interface connects the **docker0** bridge to the new container just created.\r\n\r\nYou can inspect the **bridge** network again, by running `docker network inspect bridge` on **node0-a**, to see the new container attached to it.\r\n\r\n```\r\n$ docker network inspect bridge\r\n<Snip>\r\n        \"Containers\": {\r\n            \"846af8479944d406843c90a39cba68373c619d1feaa932719260a5f5afddbf71\": {\r\n                \"Name\": \"heuristic_boyd\",\r\n                \"EndpointID\": \"1265c418f0b812004d80336bafdc4437eda976f166c11dbcc97d365b2bfa91e5\",\r\n                \"MacAddress\": \"02:42:ac:11:00:02\",\r\n                \"IPv4Address\": \"172.17.0.2/16\",\r\n                \"IPv6Address\": \"\"\r\n            }\r\n        },\r\n<Snip>\r\n```\r\n\r\n## <a name=\"ping_local\"></a>Step 3: Test network connectivity\r\n\r\nThe output to the previous `docker network inspect` command shows the IP address of the new container. In the previous example it is \"172.17.0.2\" but yours might be different.\r\n\r\nPing the IP address of the container from the shell prompt of your Docker host by running `ping -c5 <IPv4 Address>` on **node0-a**. Remember to use the IP of the container in **your** environment.\r\n\r\n```\r\n$ ping -c5 172.17.0.2\r\nPING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.\r\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.055 ms\r\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.031 ms\r\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.034 ms\r\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.041 ms\r\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.047 ms\r\n\r\n--- 172.17.0.2 ping statistics ---\r\n5 packets transmitted, 5 received, 0% packet loss, time 4075ms\r\nrtt min/avg/max/mdev = 0.031/0.041/0.055/0.011 ms\r\n```\r\n\r\nThe replies above show that the Docker host can ping the container over the **bridge** network. But, we can also verify the container can connect to the outside world too. Lets log into the container, install the `ping` program, and then ping `www.docker.com`.\r\n\r\nFirst, we need to get the ID of the container started in the previous step. You can run `docker ps` on **node0-a** to get that.\r\n\r\n```\r\n$ docker ps\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\r\n846af8479944        ubuntu              \"sleep infinity\"    7 minutes ago       Up 7 minutes                            heuristic_boyd\r\n```\r\n\r\nNext, lets run a shell inside that ubuntu container, by running `docker exec -it <CONTAINER ID> /bin/bash` on **node0-a**.\r\n\r\n```\r\n$ docker exec -it 846af8479944 /bin/bash\r\nroot@846af8479944:/#\r\n```\r\n\r\nNext, we need to install the ping program. So, lets run `apt-get update && apt-get install -y iputils-ping`.\r\n\r\n```\r\nroot@846af8479944:/# apt-get update && apt-get install -y iputils-ping\r\n```\r\n\r\nLets ping www.docker.com by running `ping -c5 www.docker.com`\r\n\r\n```\r\nroot@846af8479944:/# ping -c5 www.docker.com\r\nPING www.docker.com (104.239.220.248) 56(84) bytes of data.\r\n64 bytes from 104.239.220.248: icmp_seq=1 ttl=45 time=38.1 ms\r\n64 bytes from 104.239.220.248: icmp_seq=2 ttl=45 time=37.3 ms\r\n64 bytes from 104.239.220.248: icmp_seq=3 ttl=45 time=37.5 ms\r\n64 bytes from 104.239.220.248: icmp_seq=4 ttl=45 time=37.5 ms\r\n64 bytes from 104.239.220.248: icmp_seq=5 ttl=45 time=37.5 ms\r\n\r\n--- www.docker.com ping statistics ---\r\n5 packets transmitted, 5 received, 0% packet loss, time 4003ms\r\nrtt min/avg/max/mdev = 37.372/37.641/38.143/0.314 ms\r\n```\r\n\r\nFinally, lets disconnect our shell from the container, by running `exit`.\r\n\r\n```\r\nroot@846af8479944:/# exit\r\n```\r\n\r\nWe should also stop this container so we clean things up from this test, by running `docker stop <CONTAINER ID>` on **node0-a**.\r\n\r\n```\r\n$ docker stop 846af8479944\r\n```\r\n\r\nThis shows that the new container can ping the internet and therefore has a valid and working network configuration.\r\n\r\n\r\n## <a name=\"nat\"></a>Step 4: Configure NAT for external connectivity\r\n\r\nIn this step we'll start a new **NGINX** container and map port 8080 on the Docker host to port 80 inside of the container. This means that traffic that hits the Docker host on port 8080 will be passed on to port 80 inside the container.\r\n\r\n> **NOTE:** If you start a new container from the official NGINX image without specifying a command to run, the container will run a basic web server on port 80.\r\n\r\nStart a new container based off the official NGINX image by running `docker run --name web1 -d -p 8080:80 nginx` on **node0-a**.\r\n\r\n```\r\n$ docker run --name web1 -d -p 8080:80 nginx\r\nUnable to find image 'nginx:latest' locally\r\nlatest: Pulling from library/nginx\r\n6d827a3ef358: Pull complete\r\nb556b18c7952: Pull complete\r\n03558b976e24: Pull complete\r\n9abee7e1ef9d: Pull complete\r\nDigest: sha256:52f84ace6ea43f2f58937e5f9fc562e99ad6876e82b99d171916c1ece587c188\r\nStatus: Downloaded newer image for nginx:latest\r\n4e0da45b0f169f18b0e1ee9bf779500cb0f756402c0a0821d55565f162741b3e\r\n```\r\n\r\nReview the container status and port mappings by running `docker ps` on **node0-a**.\r\n\r\n```\r\n$ docker ps\r\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES\r\n4e0da45b0f16        nginx               \"nginx -g 'daemon ...\"   2 minutes ago       Up 2 minutes        443/tcp, 0.0.0.0:8080->80/tcp   web1\r\n```\r\n\r\nThe top line shows the new **web1** container running NGINX. Take note of the command the container is running as well as the port mapping - `0.0.0.0:8080->80/tcp` maps port 8080 on all host interfaces to port 80 inside the **web1** container. This port mapping is what effectively makes the containers web service accessible from external sources (via the Docker hosts IP address on port 8080).\r\n\r\nNow that the container is running and mapped to a port on a host interface you can test connectivity to the NGINX web server.\r\n\r\nTo complete the following task you will need the IP address of your Docker host. This will need to be an IP address that you can reach (e.g. your lab is hosted in Azure so this will be the instance's Public IP - the one you SSH'd into). Just point your web browser to the IP and port 8080 of your Docker host. Also, if you try connecting to the same IP address on a different port number it will fail.\r\n\r\nIf for some reason you cannot open a session from a web broswer, you can connect from your Docker host using the `curl 127.0.0.1:8080` command on **node0-a**.\r\n\r\n```\r\n$ curl 127.0.0.1:8080\r\n<!DOCTYPE html>\r\n<html>\r\n<Snip>\r\n<head>\r\n<title>Welcome to nginx!</title>\r\n    <Snip>\r\n<p><em>Thank you for using nginx.</em></p>\r\n</body>\r\n</html>\r\n```\r\n\r\nIf you try and curl the IP address on a different port number it will fail.\r\n\r\n> **NOTE:** The port mapping is actually port address translation (PAT).\r\n\r\n# <a name=\"Task #2\"></a>Section #3 - Overlay Networking\r\n\r\n## <a name=\"connect-container\"></a>Step 1: The Basics\r\n\r\nIn this step you'll initialize a new Swarm, join a single worker node, and verify the operations worked.\r\n\r\nRun `docker swarm init` on **node0-a**.\r\n\r\n```\r\n$ docker swarm init\r\nSwarm initialized: current node (rzyy572arjko2w0j82zvjkc6u) is now a manager.\r\n\r\nTo add a worker to this swarm, run the following command:\r\n\r\n    docker swarm join \\\r\n    --token SWMTKN-1-69b2x1u2wtjdmot0oqxjw1r2d27f0lbmhfxhvj83chln1l6es5-37ykdpul0vylenefe2439cqpf \\\r\n    10.0.0.5:2377\r\n\r\nTo add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\r\n```\r\n\r\nIf you haven't already done so, please SSH in to **node1-b**.\r\n\r\n```\r\n$ ssh ubuntu@<node0-a IP address>\r\n```\r\n\r\nCopy the entire `docker swarm join ...` command that is displayed as part of the output from your terminal output on **node0-a**. Then, paste the copied command into the terminal of **node1-b**.\r\n\r\n```\r\n$ docker swarm join \\\r\n>     --token SWMTKN-1-69b2x1u2wtjdmot0oqxjw1r2d27f0lbmhfxhvj83chln1l6es5-37ykdpul0vylenefe2439cqpf \\\r\n>     10.0.0.5:2377\r\nThis node joined a swarm as a worker.\r\n```\r\n\r\nRun a `docker node ls` on **node0-a** to verify that both nodes are part of the Swarm.\r\n\r\n```\r\n$ docker node ls\r\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\r\nijjmqthkdya65h9rjzyngdn48    node1-b   Ready   Active\r\nrzyy572arjko2w0j82zvjkc6u *  node0-a   Ready   Active        Leader\r\n```\r\n\r\nThe `ID` and `HOSTNAME` values may be different in your lab. The important thing to check is that both nodes have joined the Swarm and are *ready* and *active*.\r\n\r\n## <a name=\"create_network\"></a>Step 2: Create an overlay network\r\n\r\nNow that you have a Swarm initialized it's time to create an **overlay** network.\r\n\r\nCreate a new overlay network called \"overnet\" by running `docker network create -d overlay overnet` on **node0-a**.\r\n\r\n```\r\n$ docker network create -d overlay overnet\r\nwlqnvajmmzskn84bqbdi1ytuy\r\n```\r\n\r\nUse the `docker network ls` command to verify the network was created successfully.\r\n\r\n```\r\n$ docker network ls\r\nNETWORK ID          NAME                DRIVER              SCOPE\r\n3430ad6f20bf        bridge              bridge              local\r\na4d584350f09        docker_gwbridge     bridge              local\r\na7449465c379        host                host                local\r\n8hq1n8nak54x        ingress             overlay             swarm\r\n06c349b9cc77        none                null                local\r\nwlqnvajmmzsk        overnet             overlay             swarm\r\n```\r\n\r\nThe new \"overnet\" network is shown on the last line of the output above. Notice how it is associated with the **overlay** driver and is scoped to the entire Swarm.\r\n\r\n> **NOTE:** The other new networks (ingress and docker_gwbridge) were created automatically when the Swarm cluster was created.\r\n\r\nRun the same `docker network ls` command from **node1-b**\r\n\r\n```\r\n$ docker network ls\r\nNETWORK ID          NAME                DRIVER              SCOPE\r\n55f10b3fb8ed        bridge              bridge              local\r\nb7b30433a639        docker_gwbridge     bridge              local\r\na7449465c379        host                host                local\r\n8hq1n8nak54x        ingress             overlay             swarm\r\n06c349b9cc77        none                null                local\r\n```\r\n\r\nNotice that the \"overnet\" network does **not** appear in the list. This is because Docker only extends overlay networks to hosts when they are needed. This is usually when a host runs a task from a service that is created on the network. We will see this shortly.\r\n\r\nUse the `docker network inspect <network>` command to view more detailed information about the \"overnet\" network. You will need to run this command from **node0-a**.\r\n\r\n```\r\n$ docker network inspect overnet\r\n[\r\n    {\r\n        \"Name\": \"overnet\",\r\n        \"Id\": \"wlqnvajmmzskn84bqbdi1ytuy\",\r\n        \"Created\": \"0001-01-01T00:00:00Z\",\r\n        \"Scope\": \"swarm\",\r\n        \"Driver\": \"overlay\",\r\n        \"EnableIPv6\": false,\r\n        \"IPAM\": {\r\n            \"Driver\": \"default\",\r\n            \"Options\": null,\r\n            \"Config\": []\r\n        },\r\n        \"Internal\": false,\r\n        \"Attachable\": false,\r\n        \"Containers\": null,\r\n        \"Options\": {\r\n            \"com.docker.network.driver.overlay.vxlanid_list\": \"4097\"\r\n        },\r\n        \"Labels\": null\r\n    }\r\n]\r\n```\r\n\r\n## <a name=\"create_service\"></a>Step 3: Create a service\r\n\r\nNow that we have a Swarm initialized and an overlay network, it's time to create a service that uses the network.\r\n\r\nExecute the following command from **node0-a** to create a new service called *myservice* on the *overnet* network with two tasks/replicas.\r\n\r\n```\r\n$ docker service create --name myservice \\\r\n--network overnet \\\r\n--replicas 2 \\\r\nubuntu sleep infinity\r\n\r\nov30itv6t2n7axy2goqbfqt5e\r\n```\r\n\r\nVerify that the service is created and both replicas are up by running `docker service ls`.\r\n\r\n```\r\n$ docker service ls\r\nID            NAME       MODE        REPLICAS  IMAGE\r\nov30itv6t2n7  myservice  replicated  2/2       ubuntu:latest\r\n```\r\n\r\nThe `2/2` in the `REPLICAS` column shows that both tasks in the service are up and running.\r\n\r\nVerify that a single task (replica) is running on each of the two nodes in the Swarm by running `docker service ps myservice`.\r\n\r\n```\r\n$ docker service ps myservice\r\nID            NAME         IMAGE          NODE     DESIRED STATE  CURRENT STATE               ERROR  PORTS\r\nriicggj5tuta  myservice.1  ubuntu:latest  node1-b  Running        Running about a minute ago\r\nnlozn82wsttv  myservice.2  ubuntu:latest  node0-a  Running        Running about a minute ago\r\n```\r\n\r\nThe `ID` and `NODE` values might be different in your output. The important thing to note is that each task/replica is running on a different node.\r\n\r\nNow that **node1-b** is running a task on the \"overnet\" network it will be able to see the \"overnet\" network. Lets run `docker network ls` from **node1-b** to verify this.\r\n\r\n```\r\n$ docker network ls\r\nNETWORK ID          NAME                DRIVER              SCOPE\r\n55f10b3fb8ed        bridge              bridge              local\r\nb7b30433a639        docker_gwbridge     bridge              local\r\na7449465c379        host                host                local\r\n8hq1n8nak54x        ingress             overlay             swarm\r\n06c349b9cc77        none                null                local\r\nwlqnvajmmzsk        overnet             overlay             swarm\r\n```\r\n\r\nWe can also run `docker network inspect overnet` on **node1-b** to get more detailed information about the \"overnet\" network and obtain the IP address of the task running on **node1-b**.\r\n\r\n```\r\n$ docker network inspect overnet\r\n[\r\n    {\r\n        \"Name\": \"overnet\",\r\n        \"Id\": \"wlqnvajmmzskn84bqbdi1ytuy\",\r\n        \"Created\": \"2017-04-04T09:35:47.526642642Z\",\r\n        \"Scope\": \"swarm\",\r\n        \"Driver\": \"overlay\",\r\n        \"EnableIPv6\": false,\r\n        \"IPAM\": {\r\n            \"Driver\": \"default\",\r\n            \"Options\": null,\r\n            \"Config\": [\r\n                {\r\n                    \"Subnet\": \"10.0.0.0/24\",\r\n                    \"Gateway\": \"10.0.0.1\"\r\n                }\r\n            ]\r\n        },\r\n        \"Internal\": false,\r\n        \"Attachable\": false,\r\n        \"Containers\": {\r\n            \"fbc8bb0834429a68b2ccef25d3c90135dbda41e08b300f07845cb7f082bcdf01\": {\r\n                \"Name\": \"myservice.1.riicggj5tutar7h7sgsvqg72r\",\r\n                \"EndpointID\": \"8edf83ebce77aed6d0193295c80c6aa7a5b76a08880a166002ecda3a2099bb6c\",\r\n                \"MacAddress\": \"02:42:0a:00:00:03\",\r\n                \"IPv4Address\": \"10.0.0.3/24\",\r\n                \"IPv6Address\": \"\"\r\n            }\r\n        },\r\n        \"Options\": {\r\n            \"com.docker.network.driver.overlay.vxlanid_list\": \"4097\"\r\n        },\r\n        \"Labels\": {},\r\n        \"Peers\": [\r\n            {\r\n                \"Name\": \"node0-a-f6a6f8e18a9d\",\r\n                \"IP\": \"10.0.0.5\"\r\n            },\r\n            {\r\n                \"Name\": \"node1-b-507a763bed93\",\r\n                \"IP\": \"10.0.0.6\"\r\n            }\r\n        ]\r\n    }\r\n]\r\n```\r\n\r\nYou should note that as of Docker 1.12, `docker network inspect` only shows containers/tasks running on the local node. This means that `10.0.0.3` is the IPv4 address of the container running on **node1-b**. Make a note of this IP address for the next step (the IP address in your lab might be different than the one shown here in the lab guide).\r\n\r\n## <a name=\"test\"></a>Step 4: Test the network\r\n\r\nTo complete this step you will need the IP address of the service task running on **node1-b** that you saw in the previous step (`10.0.0.3`).\r\n\r\nExecute the following commands from **node0-a**.\r\n\r\n```\r\n$ docker network inspect overnet\r\n[\r\n    {\r\n        \"Name\": \"overnet\",\r\n        \"Id\": \"wlqnvajmmzskn84bqbdi1ytuy\",\r\n        \"Created\": \"2017-04-04T09:35:47.362263887Z\",\r\n        \"Scope\": \"swarm\",\r\n        \"Driver\": \"overlay\",\r\n        \"EnableIPv6\": false,\r\n        \"IPAM\": {\r\n            \"Driver\": \"default\",\r\n            \"Options\": null,\r\n            \"Config\": [\r\n                {\r\n                    \"Subnet\": \"10.0.0.0/24\",\r\n                    \"Gateway\": \"10.0.0.1\"\r\n                }\r\n            ]\r\n        },\r\n        \"Internal\": false,\r\n        \"Attachable\": false,\r\n        \"Containers\": {\r\n            \"d676496d18f76c34d3b79fbf6573a5672a81d725d7c8704b49b4f797f6426454\": {\r\n                \"Name\": \"myservice.2.nlozn82wsttv75cs9vs3ju7vs\",\r\n                \"EndpointID\": \"36638a55fcf4ada2989650d0dde193bc2f81e0e9e3c153d3e9d1d85e89a642e6\",\r\n                \"MacAddress\": \"02:42:0a:00:00:04\",\r\n                \"IPv4Address\": \"10.0.0.4/24\",\r\n                \"IPv6Address\": \"\"\r\n            }\r\n        },\r\n        \"Options\": {\r\n            \"com.docker.network.driver.overlay.vxlanid_list\": \"4097\"\r\n        },\r\n        \"Labels\": {},\r\n        \"Peers\": [\r\n            {\r\n                \"Name\": \"node0-a-f6a6f8e18a9d\",\r\n                \"IP\": \"10.0.0.5\"\r\n            },\r\n            {\r\n                \"Name\": \"node1-b-507a763bed93\",\r\n                \"IP\": \"10.0.0.6\"\r\n            }\r\n        ]\r\n    }\r\n]\r\n```\r\n\r\nNotice that the IP address listed for the service task (container) running on **node0-a** is different to the IP address for the service task running on **node1-b**. Note also that they are one the sane \"overnet\" network.\r\n\r\nRun a `docker ps` command to get the ID of the service task on **node0-a** so that you can log in to it in the next step.\r\n\r\n```\r\n$ docker ps\r\nCONTAINER ID        IMAGE                                                                            COMMAND                  CREATED             STATUS              PORTS                           NAMES\r\nd676496d18f7        ubuntu@sha256:dd7808d8792c9841d0b460122f1acf0a2dd1f56404f8d1e56298048885e45535   \"sleep infinity\"         10 minutes ago      Up 10 minutes                                       myservice.2.nlozn82wsttv75cs9vs3ju7vs\r\n<Snip>\r\n```\r\n\r\nLog on to the service task. Be sure to use the container `ID` from your environment as it will be different from the example shown below. We can do this by running `docker exec -it <CONTAINER ID> /bin/bash`.\r\n\r\n```\r\n$ docker exec -it d676496d18f7 /bin/bash\r\nroot@d676496d18f7:/#\r\n```\r\n\r\nInstall the ping command and ping the service task running on **node1-b** where it had a IP address of `10.0.0.3` from the `docker network inspect overnet` command.\r\n\r\n```\r\nroot@d676496d18f7:/# apt-get update && apt-get install -y iputils-ping\r\n```\r\n\r\nNow, lets ping `10.0.0.3`.\r\n\r\n```\r\nroot@d676496d18f7:/# ping -c5 10.0.0.3\r\nPING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.\r\n^C\r\n--- 10.0.0.3 ping statistics ---\r\n4 packets transmitted, 0 received, 100% packet loss, time 2998ms\r\n```\r\n\r\nThe output above shows that both tasks from the **myservice** service are on the same overlay network spanning both nodes and that they can use this network to communicate.\r\n\r\n## <a name=\"discover\"></a>Step 5: Test service discovery\r\n\r\nNow that you have a working service using an overlay network, let's test service discovery.\r\n\r\nIf you are not still inside of the container on **node0-a**, log back into it with the `docker exec -it <CONTAINER ID> /bin/bash` command.\r\n\r\nRun `cat /etc/resolv.conf` form inside of the container on **node0-a**.\r\n\r\n```\r\n$ docker exec -it d676496d18f7 /bin/bash\r\nroot@d676496d18f7:/# cat /etc/resolv.conf\r\nsearch ivaf2i2atqouppoxund0tvddsa.jx.internal.cloudapp.net\r\nnameserver 127.0.0.11\r\noptions ndots:0\r\n```\r\n\r\nThe value that we are interested in is the `nameserver 127.0.0.11`. This value sends all DNS queries from the container to an embedded DNS resolver running inside the container listening on 127.0.0.11:53. All Docker container run an embedded DNS server at this address.\r\n\r\n> **NOTE:** Some of the other values in your file may be different to those shown in this guide.\r\n\r\nTry and ping the \"myservice\" name from within the container by running `ping -c5 myservice`.\r\n\r\n```\r\nroot@d676496d18f7:/# ping -c5 myservice\r\nPING myservice (10.0.0.2) 56(84) bytes of data.\r\n64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.020 ms\r\n64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.052 ms\r\n64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.044 ms\r\n64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.042 ms\r\n64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=0.056 ms\r\n\r\n--- myservice ping statistics ---\r\n5 packets transmitted, 5 received, 0% packet loss, time 4001ms\r\nrtt min/avg/max/mdev = 0.020/0.042/0.056/0.015 ms\r\n```\r\n\r\nThe output clearly shows that the container can ping the `myservice` service by name. Notice that the IP address returned is `10.0.0.2`. In the next few steps we'll verify that this address is the virtual IP (VIP) assigned to the `myservice` service.\r\n\r\nType the `exit` command to leave the `exec` container session and return to the shell prompt of your **node0-a** Docker host.\r\n\r\n```\r\nroot@d676496d18f7:/# exit\r\n```\r\n\r\nInspect the configuration of the \"myservice\" service by running `docker service inspect myservice`. Lets verify that the VIP value matches the value returned by the previous `ping -c5 myservice` command.\r\n\r\n```\r\n$ docker service inspect myservice\r\n[\r\n    {\r\n        \"ID\": \"ov30itv6t2n7axy2goqbfqt5e\",\r\n        \"Version\": {\r\n            \"Index\": 19\r\n        },\r\n        \"CreatedAt\": \"2017-04-04T09:35:47.009730798Z\",\r\n        \"UpdatedAt\": \"2017-04-04T09:35:47.05475096Z\",\r\n        \"Spec\": {\r\n            \"Name\": \"myservice\",\r\n            \"TaskTemplate\": {\r\n                \"ContainerSpec\": {\r\n                    \"Image\": \"ubuntu:latest@sha256:dd7808d8792c9841d0b460122f1acf0a2dd1f56404f8d1e56298048885e45535\",\r\n                    \"Args\": [\r\n                        \"sleep\",\r\n                        \"infinity\"\r\n                    ],\r\n<Snip>\r\n        \"Endpoint\": {\r\n            \"Spec\": {\r\n                \"Mode\": \"vip\"\r\n            },\r\n            \"VirtualIPs\": [\r\n                {\r\n                    \"NetworkID\": \"wlqnvajmmzskn84bqbdi1ytuy\",\r\n                    \"Addr\": \"10.0.0.2/24\"\r\n                }\r\n            ]\r\n        },\r\n<Snip>\r\n```\r\n\r\nTowards the bottom of the output you will see the VIP of the service listed. The VIP in the output above is `10.0.0.2` but the value may be different in your setup. The important point to note is that the VIP listed here matches the value returned by the `ping -c5 myservice` command.\r\n\r\nFeel free to create a new `docker exec` session to the service task (container) running on **node1-b** and perform the same `ping -c5 service` command. You will get a response form the same VIP.\r\n\r\n# <a name=\"cleanup\"></a>Cleaning Up\r\n\r\nHopefully you were able to learn a little about how Docker Networking works during this lab. Lets clean up the service we created, the containers we started, and finally disable Swarm mode.\r\n\r\nExecute the `docker service rm myservice` command on **node0-a** to remove the service called *myservice*.\r\n\r\n```\r\n$ docker service rm myservice\r\n```\r\n\r\nExecute the `docker ps` command on **node0-a** to get a list of running containers.\r\n\r\n```\r\n$ docker ps\r\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES\r\n846af8479944        ubuntu              \"sleep infinity\"         17 minutes ago      Up 17 minutes                                       heuristic_boyd\r\n4e0da45b0f16        nginx               \"nginx -g 'daemon ...\"   12 minutes ago      Up 12 minutes       443/tcp, 0.0.0.0:8080->80/tcp   web1\r\n```\r\n\r\nYou can use the `docker kill <CONTAINER ID ...>` command on **node0-a** to kill the ubunut and nginx containers we started at the beginning.\r\n\r\n```\r\n$ docker kill 846af8479944 4e0da45b0f16\r\n```\r\n\r\nFinally, lets remove node0-a and node1-b from the Swarm. We can use the `docker swarm leave --force` command to do that. \r\n\r\nLets run `docker swarm leave --force` on **node0-a**.\r\n\r\n```\r\n$ docker swarm leave --force\r\n```\r\n\r\nLets also run `docker swarm leave --force` on **node1-b**.\r\n\r\n```\r\n$ docker swarm leave --force\r\n```\r\n\r\nCongratulations! You've completed this lab!\r\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/docker-orchestration/README.md",
    "content": "# Docker Orchestration\n\nHi, welcome to the Orchestration lab for DockerCon 2017!\n\nIn this lab you will play around with the container orchestration features of Docker. You will deploy a simple application to a single host and learn how that works. Then, you will configure Docker Swarm Mode, and learn to deploy the same simple application across multiple hosts. You will then see how to scale the application and move the workload across different hosts easily.\n\n> **Difficulty**: Beginner\n\n> **Time**: Approximately 30 minutes\n\n> **Tasks**:\n>\n> * [Section #1 - What is Orchestration](#basics)\n> * [Section #2 - Configure Swarm Mode](#start-cluster)\n> * [Section #3 - Deploy applications across multiple hosts](#multi-application)\n> * [Section #4 - Scale the application](#scale-application)\n> * [Section #5 - Drain a node and reschedule the containers](#recover-application)\n> * [Cleaning Up](#cleanup)\n\n## Document conventions\n\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \n\nFor instance if you see `ssh <username>@<hostname>` you would actually type something like `ssh ubuntu@node0-a.ivaf2i2atqouppoxund0tvddsa.jx.internal.cloudapp.net`\n\nYou will be asked to SSH into various nodes. These nodes are referred to as **node0-a**, **node1-b**, **node2-c**, etc. \n\n## <a name=\"prerequisites\"></a>Prerequisites\n\nThis lab requires three Linux nodes with Docker 17.03 (or higher) installed.\n\nAlso, please make sure you can SSH into the Linux nodes. If you haven't already done so, please SSH in to **node0-a**, **node1-b**, and **node2-c**.\n\nYou can do that by SSHing into **node0-a**.\n\n```\n$ ssh ubuntu@<node0-a IP address>\n```\n\nThen, **node1-b**.\n\n```\n$ ssh ubuntu@<node1-b IP address>\n```\n\nAnd, finally **node2-c**.\n\n```\n$ ssh ubuntu@<node2-с IP address>\n```\n\n# <a name=\"basics\"></a>Section 1: What is Orchestration\n\nSo, what is Orchestration anyways? Well, Orchestration is probably best described using an example. Lets say that you have an application that has high traffic along with high-availability requirements. Due to these requirements, you typically want to deploy across at least 3+ machines, so that in the event a host fails, your application will still be accessible from at least two others. Obviously, this is just an example and your use-case will likely have its own requirements, but you get the idea.\n\nDeploying your application without Orchestration is typically very time consuming and error prone, because you would have to manually SSH into each machine, start up your application, and then continually keep tabs on things to make sure it is running as you expect.\n\nBut, with Orchestration tooling, you can typically off-load much of this manual work and let automation do the heavy lifting. One cool feature of Orchestration with Docker Swarm, is that you can deploy an application across many hosts with only a single command (once Swarm mode is enabled). Plus, if one of the supporting nodes dies in your Docker Swarm, other nodes will automatically pick up load, and your application will continue to hum along as usual.\n\nIf you are typically only using `docker run` to deploy your applications, then you could likely really benefit from using Docker Compose, Docker Swarm mode, and both Docker Compose and Swarm.\n\n# <a name=\"start-cluster\"></a>Section 2: Configure Swarm Mode\n\nReal-world applications are typically deployed across multiple hosts as discussed earlier. This improves application performance and availability, as well as allowing individual application components to scale independently. Docker has powerful native tools to help you do this.\n\nAn example of running things manually and on a single host would be to create a new container on **node0-a** by running `docker run -dt ubuntu sleep infinity`.\n\n```\n$ docker run -dt ubuntu sleep infinity\nUnable to find image 'ubuntu:latest' locally\nlatest: Pulling from library/ubuntu\nd54efb8db41d: Pull complete\nf8b845f45a87: Pull complete\ne8db7bf7c39f: Pull complete\n9654c40e9079: Pull complete\n6d9ef359eaaa: Pull complete\nDigest: sha256:dd7808d8792c9841d0b460122f1acf0a2dd1f56404f8d1e56298048885e45535\nStatus: Downloaded newer image for ubuntu:latest\n846af8479944d406843c90a39cba68373c619d1feaa932719260a5f5afddbf71\n```\n\nThis command will create a new container based on the `ubuntu:latest` image and will run the `sleep` command to keep the container running in the background. You can verify our example container is up by running `docker ps` on **node0-a**.\n\n```\n$ docker ps\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n044bea1c2277        ubuntu              \"sleep infinity\"    2 seconds ago       Up 1 second                             distracted_mayer\n```\n\nBut, this is only on a single node. What happens if this node goes down? Well, our application just dies and it is never restarted. To restore service, we would have to manually log into this machine, and start tweaking things to get it back up and running. So, it would be helpful if we had some type of system that would allow us to run this \"sleep\" application/service across many machines. \n\nIn this section you will configure *Swarm Mode*. This is a new optional mode in which multiple Docker hosts form into a self-orchestrating group of engines called a *swarm*. Swarm mode enables new features such as *services* and *bundles* that help you deploy and manage multi-container apps across multiple Docker hosts.\n\nYou will complete the following:\n\n- Configure *Swarm mode*\n- Run the app\n- Scale the app\n- Drain nodes for maintenance and reschedule containers\n\nFor the remainder of this lab we will refer to *Docker native clustering* as ***Swarm mode***. The collection of Docker engines configured for Swarm mode will be referred to as the *swarm*.\n\nA swarm comprises one or more *Manager Nodes* and one or more *Worker Nodes*. The manager nodes maintain the state of swarm and schedule application containers. The worker nodes run the application containers. As of Docker 1.12, no external backend, or 3rd party components, are required for a fully functioning swarm - everything is built-in!\n\nIn this part of the demo you will use all three of the nodes in your lab. __node0-a__ will be the Swarm manager, while __node1-b__ and __node2-c__ will be worker nodes. Swarm mode supports a highly available redundant manager nodes, but for the purposes of this lab you will only deploy a single manager node.\n\n## Step 2.1 - Create a Manager node\n\nIf you haven't already done so, please SSH in to **node0-a**.\n\n```\n$ ssh ubuntu@<node0-a IP address>\n```\n\nIn this step you'll initialize a new Swarm, join a single worker node, and verify the operations worked.\n\nRun `docker swarm init` on **node0-a**.\n\n```\n$ docker swarm init\nSwarm initialized: current node (6dlewb50pj2y66q4zi3egnwbi) is now a manager.\n\nTo add a worker to this swarm, run the following command:\n\n    docker swarm join \\\n    --token SWMTKN-1-1wxyoueqgpcrc4xk2t3ec7n1poy75g4kowmwz64p7ulqx611ih-68pazn0mj8p4p4lnuf4ctp8xy \\\n    10.0.0.5:2377\n\nTo add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\n```\n\nYou can run the `docker info` command to verify that **node0-a** was successfully configured as a swarm manager node.\n\n```\n$ docker info\nContainers: 2\n Running: 0\n Paused: 0\n Stopped: 2\nImages: 2\nServer Version: 17.03.1-ee-3\nStorage Driver: aufs\n Root Dir: /var/lib/docker/aufs\n Backing Filesystem: extfs\n Dirs: 13\n Dirperm1 Supported: true\nLogging Driver: json-file\nCgroup Driver: cgroupfs\nPlugins:\n Volume: local\n Network: bridge host macvlan null overlay\nSwarm: active\n NodeID: rwezvezez3bg1kqg0y0f4ju22\n Is Manager: true\n ClusterID: qccn5eanox0uctyj6xtfvesy2\n Managers: 1\n Nodes: 1\n Orchestration:\n  Task History Retention Limit: 5\n Raft:\n  Snapshot Interval: 10000\n  Number of Old Snapshots to Retain: 0\n  Heartbeat Tick: 1\n  Election Tick: 3\n Dispatcher:\n  Heartbeat Period: 5 seconds\n CA Configuration:\n  Expiry Duration: 3 months\n Node Address: 10.0.0.5\n Manager Addresses:\n  10.0.0.5:2377\n<Snip>\n```\n\nThe swarm is now initialized with **node0-a** as the only Manager node. In the next section you will add **node1-b** and **node2-c** as *Worker nodes*.\n\n##  Step 2.2 - Join Worker nodes to the Swarm\n\nYou will perform the following procedure on **node1-b** and **node2-c**. Towards the end of the procedure you will switch back to **node0-a**.\n\nOpen a new SSH session to __node1-b__ (Keep your SSH session to **node0-a** open in another tab or window).\n\n```\n$ ssh ubuntu@<node1-b IP address>\n```\n\nNow, take that entire `docker swarm join ...` command we copied earlier from `node0-a` where it was displayed as terminal output. We need to paste the copied command into the terminal of **node1-b** and **node2-c**.\n\nIt should look something like this for **node1-b**. By the way, if the `docker swarm join ...` command scrolled off your screen already, you can run the `docker swarm join-token worker` command on the Manager node to get it again.\n\n```\n$ docker swarm join \\\n    --token SWMTKN-1-1wxyoueqgpcrc4xk2t3ec7n1poy75g4kowmwz64p7ulqx611ih-68pazn0mj8p4p4lnuf4ctp8xy \\\n    10.0.0.5:2377\n```\n\nAgain, ssh into **node2-c** and it should look something like this.\n\n```\n$ ssh ubuntu@<node2-c IP address>\n```\n\n```\n$ docker swarm join \\\n    --token SWMTKN-1-1wxyoueqgpcrc4xk2t3ec7n1poy75g4kowmwz64p7ulqx611ih-68pazn0mj8p4p4lnuf4ctp8xy \\\n    10.0.0.5:2377\n```\n\nOnce you have run this on **node1-b** and **node2-c**, switch back to **node0-a**, and run a `docker node ls` to verify that both nodes are part of the Swarm. You should see three nodes, **node0-a** as the Manager node and **node1-b** and **node2-c** both as Worker nodes.\n\n```\n$ docker node ls\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\n6dlewb50pj2y66q4zi3egnwbi *  node0-a   Ready   Active        Leader\nym6sdzrcm08s6ohqmjx9mk3dv    node2-c   Ready   Active\nyu3hbegvwsdpy9esh9t2lr431    node1-b   Ready   Active\n```\n\nThe `docker node ls` command shows you all of the nodes that are in the swarm as well as their roles in the swarm. The `*` identifies the node that you are issuing the command from.\n\nCongratulations! You have configured a swarm with one manager node and two worker nodes.\n\n# <a name=\"multi-application\"></a>Section 3: Deploy applications across multiple hosts\n\nNow that you have a swarm up and running, it is time to deploy our really simple sleep application.\n\nYou will perform the following procedure from **node0-a**.\n\n## Step 3.1 - Deploy the application components as Docker services\n\nOur `sleep` application is becoming very popular on the internet (due to hitting Reddit and HN). People just love it. So, you are going to have to scale your application to meet peak demand. You will have to do this across multiple hosts for high availability too. We will use the concept of *Services* to scale our application easily and manage many containers as a single entity.\n\n> *Services* were a new concept in Docker 1.12. They work with swarms and are intended for long-running containers.\n\nYou will perform this procedure from **node0-a**.\n\nLets deploy `sleep` as a *Service* across our Docker Swarm.\n\n```\n$ docker service create --name sleep-app ubuntu sleep infinity\nof5rxsxsmm3asx53dqcq0o29c\n```\n\nVerify that the `service create` has been received by the Swarm manager.\n\n```\n$ docker service ls\nID            NAME       MODE        REPLICAS  IMAGE\nof5rxsxsmm3a  sleep-app  replicated  1/1       ubuntu:latest\n```\n\nThe state of the service may change a couple times until it is running. The image is being downloaded from Docker Store to the other engines in the Swarm. Once the image is downloaded the container goes into a running state on one of the three nodes.\n\nAt this point it may not seem that we have done anything very differently than just running a `docker run ...`. We have again deployed a single container on a single host. The difference here is that the container has been scheduled on a swarm cluster.\n\nWell done. You have deployed the sleep-app to your new Swarm using Docker services. \n\n# <a name=\"scale-application\"></a>Section 4: Scale the application\n\nDemand is crazy! Everybody loves your `sleep` app! It's time to scale out.\n\nOne of the great things about *services* is that you can scale them up and down to meet demand. In this step you'll scale the service up and then back down.\n\nYou will perform the following procedure from **node0-a**.\n\nScale the number of containers in the **sleep-app** service to 7 with the `docker service update --replicas 7 sleep-app` command. `replicas` is the term we use to describe identical containers providing the same service.\n\n```\n$ docker service update --replicas 7 sleep-app\n```\n\t\nThe Swarm manager schedules so that there are 7 `sleep-app` containers in the cluster. These will be scheduled evenly across the Swarm members.\n\nWe are going to use the `docker service ps sleep-app` command. If you do this quick fast enough after using the  `--replicas` option you can see the containers come up in real time.\n\n```\n$ docker service ps sleep-app\nID            NAME         IMAGE          NODE     DESIRED STATE  CURRENT STATE          ERROR  PORTS\n7k0flfh2wpt1  sleep-app.1  ubuntu:latest  node0-a  Running        Running 9 minutes ago\nwol6bzq7xf0v  sleep-app.2  ubuntu:latest  node2-c  Running        Running 2 minutes ago\nid50tzzk1qbm  sleep-app.3  ubuntu:latest  node1-b  Running        Running 2 minutes ago\nozj2itmio16q  sleep-app.4  ubuntu:latest  node2-c  Running        Running 2 minutes ago\no4rk5aiely2o  sleep-app.5  ubuntu:latest  node1-b  Running        Running 2 minutes ago\n35t0eamu0rue  sleep-app.6  ubuntu:latest  node1-b  Running        Running 2 minutes ago\n44s8d59vr4a8  sleep-app.7  ubuntu:latest  node0-a  Running        Running 2 minutes ago\n```\n\nNotice that there are now 7 containers listed. It may take a few seconds for the new containers in the service to all show as **RUNNING**.  The `NODE` column tells us on which node a container is running.\n\nScale the service back down just five containers again with the `docker service update --replicas 4 sleep-app` command. \n\n```\n$ docker service update --replicas 4 sleep-app\n```\n\nVerify that the number of containers has been reduced to 4 using the `docker service ps sleep-app` command.\n\n```\n$ docker service ps sleep-app\nID            NAME         IMAGE          NODE     DESIRED STATE  CURRENT STATE           ERROR  PORTS\n7k0flfh2wpt1  sleep-app.1  ubuntu:latest  node0-a  Running        Running 13 minutes ago\nwol6bzq7xf0v  sleep-app.2  ubuntu:latest  node2-c  Running        Running 5 minutes ago\n35t0eamu0rue  sleep-app.6  ubuntu:latest  node1-b  Running        Running 5 minutes ago\n44s8d59vr4a8  sleep-app.7  ubuntu:latest  node0-a  Running        Running 5 minutes ago\n```\n\nYou have successfully scaled a swarm service up and down.\n\n# <a name=\"recover-application\"></a>Section 5: Drain a node and reschedule the containers\n\nYour sleep-app has been doing amazing after hitting Reddit and HN. It's now number 1 on the Apple Store! You have scaled up during the holidays and down during the slow season. Now you are doing maintenance on one of your servers so you will need to gracefully take a server out of the swarm without interrupting service to your customers.\n\n\nTake a look at the status of your nodes again by running `docker node ls` on **node0-a**.  \n\n```\n$ docker node ls\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\n6dlewb50pj2y66q4zi3egnwbi *  node0-a   Ready   Active        Leader\nym6sdzrcm08s6ohqmjx9mk3dv    node2-c   Ready   Active\nyu3hbegvwsdpy9esh9t2lr431    node1-b   Ready   Active\n```\n\nYou will be taking **node1-b** out of service for maintenance.\n\nIf you haven't already done so, please SSH in to **node1-b**.\n\n```\n$ ssh ubuntu@<node1-b IP address>\n```\n\nThen lets see the containers that you have running there.\n\n```\n$ docker ps\nCONTAINER ID        IMAGE                                                                            COMMAND             CREATED             STATUS              PORTS               NAMES\n4e7ea1154ea4        ubuntu@sha256:dd7808d8792c9841d0b460122f1acf0a2dd1f56404f8d1e56298048885e45535   \"sleep infinity\"    9 minutes ago       Up 9 minutes                            sleep-app.6.35t0eamu0rueeozz0pj2xaesi\n```\n\nYou can see that we have one of the slepp-app containers running here (your output might look different though).\n\nNow lets jump back to **node0-a** (the Swarm manager) and take **node1-b** out of service. To do that, lets run `docker node ls` again.\n\n```\n$ docker node ls\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\n6dlewb50pj2y66q4zi3egnwbi *  node0-a   Ready   Active        Leader\nym6sdzrcm08s6ohqmjx9mk3dv    node2-c   Ready   Active\nyu3hbegvwsdpy9esh9t2lr431    node1-b   Ready   Active\n```\n\nWe are going to take the **ID** for **node1-b** and run `docker node update --availability drain yu3hbegvwsdpy9esh9t2lr431`. We are using the **node1-b** host **ID** as input into our `drain` command. \n\n```\n$ docker node update --availability drain yu3hbegvwsdpy9esh9t2lr431\n```\nCheck the status of the nodes\n\n```\n$ docker node ls\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\n6dlewb50pj2y66q4zi3egnwbi *  node0-a   Ready   Active        Leader\nym6sdzrcm08s6ohqmjx9mk3dv    node2-c   Ready   Active\nyu3hbegvwsdpy9esh9t2lr431    node1-b   Ready   Drain\n```\n\nNode **node1-b** is now in the `Drain` state. \n\n\nSwitch back to **node1-b** and see what is running there by running `docker ps`.\n\n```\n$ docker ps\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n```\n\n **node1-b** does not have any containers running on it.\n\nLastly, check the service again on **node0-a** to make sure that the container were rescheduled. You should see all four containers running on the remaining two nodes.\n\n```\n$ docker service ps sleep-app\nID            NAME             IMAGE          NODE     DESIRED STATE  CURRENT STATE           ERROR  PORTS\n7k0flfh2wpt1  sleep-app.1      ubuntu:latest  node0-a  Running        Running 25 minutes ago\nwol6bzq7xf0v  sleep-app.2      ubuntu:latest  node2-c  Running        Running 18 minutes ago\ns3548wki7rlk  sleep-app.6      ubuntu:latest  node2-c  Running        Running 3 minutes ago\n35t0eamu0rue   \\_ sleep-app.6  ubuntu:latest  node1-b  Shutdown       Shutdown 3 minutes ago\n44s8d59vr4a8  sleep-app.7      ubuntu:latest  node0-a  Running        Running 18 minutes ago\n```\n\n# <a name=\"cleanup\"></a>Cleaning Up\n\nExecute the `docker service rm sleep-app` command on **node0-a** to remove the service called *myservice*.\n\n```\n$ docker service rm sleep-app\n```\n\nExecute the `docker ps` command on **node0-a** to get a list of running containers.\n\n```\n$ docker ps\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n044bea1c2277        ubuntu              \"sleep infinity\"    17 minutes ago      17 minutes ag                           distracted_mayer\n```\n\nYou can use the `docker kill <CONTAINER ID>` command on **node0-a** to kill the sleep container we started at the beginning.\n\n```\n$ docker kill 044bea1c2277\n```\n\nFinally, lets remove node0-a, node1-b, and node2-c from the Swarm. We can use the `docker swarm leave --force` command to do that. \n\nLets run `docker swarm leave --force` on **node0-a**.\n\n```\n$ docker swarm leave --force\n```\n\nThen, run `docker swarm leave --force` on **node1-b**.\n\n```\n$ docker swarm leave --force\n```\n\nFinally, run `docker swarm leave --force` on **node2-c**.\n\n```\n$ docker swarm leave --force\n```\n\nCongratulations! You've completed this lab. You now know how to build a swarm, deploy applications as collections of services, and scale individual services up and down.\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/securing-apps-docker-enterprise/README.md",
    "content": "# Securing Applications with Docker EE Advanced \n\nIn this lab you will integrate Docker EE Advanced in to your development pipeline. You will build your application from a Dockerfile and push your image to the Docker Trusted Registry (DTR). DTR will scan your image for vulnerabilities so they can be fixed before your application is deployed. This helps you build more secure apps!\n\n\n> **Difficulty**: Beginner\n\n> **Time**: Approximately 30 minutes\n\n\n> **Tasks**:\n>\n> * [Prerequisites](#prerequisites)\n> * [Task 1: Build a Docker Application](#task1)\n>   * [Task 1.1: Inspect the Application Source](#task1.1)\n>   * [Task 1.2: Build the Application Image](#task1.2)\n>   * [Task 1.3: Deploy the Application Locally](#task1.3)\n> * [Task 2: Pushing and Scanning Docker Images](#task2)\n>   * [Task 2.1: Creating a Repo](#task2.1)\n>   * [Task 2.2: Pushing to the Docker Trusted Registry](#task2.2)\n> * [Task 3: Remediating Application Vulnerabilities](#task3)\n>   * [Task 3.1: Rebuild the Image](#task3.1)\n>   * [Task 3.2: Rescan the Remediated Application](#task3.2)\n\n\n## Document conventions\n\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \n\nYour nodes may be using private IP addresses along with mapped public IP addresses or the lab environment may be entirely private. We will be referring to these IPs as `node0-private-ip`, `node0-public-ip`, or `node0-public-dns`. If you are using only private IPs then you will replace the `public` IP/DNS with the private equivalent.\n\n\n## <a name=\"prerequisites\"></a>Prerequisites\n\nThis lab requires an instance of Docker Trusted Registry. This lab provides DTR for you. If you are creating this lab yourself then you can see how to install DTR [here.](https://docs.docker.com/datacenter/dtr/2.2/guides/admin/install/)\n\nIn addition to DTR, this lab requires a single node with Docker Enterprise Edition installed on it. Docker EE installation instructions can be found here. The nodes can be in a cloud provider environment or on locally hosted VMs. For the remainer of the lab we will refer to this node as `node0`\n\n\n1. Log in to `node0` \n\n```\n$ ssh ubuntu@node-smwqii1akqh.southcentralus.cloudapp.azure.com\n\nThe authenticity of host 'node-smwqii1akqh.southcentralus.cloudapp.azure.com (13.65.212.221)' can't be established.\nECDSA key fingerprint is SHA256:BKHHGwzrRx/zIuO7zwvyq5boa/5o2cZD9OTlOlOWJvY.\nAre you sure you want to continue connecting (yes/no)? yes\nWarning: Permanently added 'node-smwqii1akqh.southcentralus.cloudapp.azure.com,13.65.212.221' (ECDSA) to the list of known hosts.\nubuntu@node-smwqii1akqh.southcentralus.cloudapp.azure.com's password:\n\nWelcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-72-generic x86_64)\n```\n\n2. Check to make sure you are running the correct Docker version. At a minimum you should be running `17.03 EE`\n\n```\n$ docker version\nClient:\n Version:      17.03.0-ee-1\n API version:  1.26\n Go version:   go1.7.5\n Git commit:   9094a76\n Built:        Wed Mar  1 01:20:54 2017\n OS/Arch:      linux/amd64\n\nServer:\n Version:      17.03.0-ee-1\n API version:  1.26 (minimum version 1.12)\n Go version:   go1.7.5\n Git commit:   9094a76\n Built:        Wed Mar  1 01:20:54 2017\n OS/Arch:      linux/amd64\n Experimental: false\n \n```\n\n\n\n## <a name=\"task1\"></a>Task 1: Build and Running a Docker Application\nThe following task will guide you through how to build your application from a Dockerfile.\n\n### <a name=\"task1.1\"></a>Task 1.1: Inspect the App Source\n\n\n\n1. Clone your application from the [GitHub repo](https://github.com/mark-church/docker-pets) with `git`. Go to the `/web` directory. This is the directory that holds the source for our application.\n\n```\n~$ git clone https://github.com/mark-church/docker-pets\n~$ cd docker-pets/web\n```\n\nInspect the directory.\n\n```\n~/docker-pets/web $ ls\nadmin.py  app.py  Dockerfile  static  templates\n```\n\n- `admin.py` & `app.py` are the source code files for our Python application.\n- `/static` & `/templates` hold the static content, such as pictures and HTML, for our app.\n- `Dockerfile` is the configuration file we will use to build our app.\n\n\n2. Inspect contents of the `Dockerfile` for the web frontend image.\n\n```\n~/docker-pets/web $ cat Dockerfile\nFROM alpine:3.3\n\nRUN apk --no-cache add py-pip libpq python-dev curl\n\nRUN pip install flask==0.10.1 python-consul\n\nADD / /app\n\nWORKDIR /app\n\nHEALTHCHECK CMD curl --fail http://localhost:5000/health || exit 1\n\nCMD python app.py & python admin.py\n```\n\nOur Dockerfile includes a couple notable lines:\n\n- `FROM alpine:3.3` indicates that our Application is based off of an Alpine OS base image.\n- `RUN apk` & `RUN pip` lines install software packages on top of the base OS that our applications needs.\n- `ADD / /app` adds the application code into the image.\n\n### <a name=\"task1.2\"></a>Task 1.2: Build the Application Image\n\n1. Build the image from the Dockerfile. You are going to specify an image tag `docker-pets` that you will reference this image by later. The `.` in the command indicates that you are building from the current directory. Docker will automatically build off of any file in the directory named `Dockerfile`.\n\n```\n~/docker-pets/web $ docker build -t docker-pets .\nSending build context to Docker daemon 26.55 MB\nStep 1/7 : FROM alpine:3.3\n ---> baa5d63471ea\nStep 2/7 : RUN apk --no-cache add py-pip libpq python-dev curl\n ---> Running in 382419b97267\nfetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz\n...\n...\n...\n```\n\nIt should not take more than a minute to build the image.\n\n2. You should now see that the image exists locally on your Docker engine by running `docker images`.\n\n```\n~/docker-pets/web $ docker images\nREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE\ndocker-pets         latest              f0b92696c13f        3 minutes ago       94.9 MB\n```\n\n### <a name=\"task1.2\"></a>Task 1.3: Deploy the App Locally\n\nYou will now deploy the image locally to ensure that it works. Before you do this you need to turn Swarm mode on in your engine so that we can take advantage of Docker Services.\n\n1. Return to the `docker-pets` directory and establish a Swarm.\n\n```\n~/docker-pets/web $ cd ..\n~/docker-pets $ docker swarm init\n```\n\nConfirm that you now have a Swarm cluster of a single node.\n\n```\n~/docker-pets $ docker node ls\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\nfd3ovikiq7tzmdr70zukbsgbs *  moby      Ready   Active        Leader\n```\n\n2. Deploy your application from the compose file. In the `/docker-pets` directory there is a compose file that you will use to deploy this application. You will deploy your application stack as `pets`.\n\n```\n~/docker-pets $ docker stack deploy -c pets-container-compose.yml pets\nCreating network pets_backend\nCreating service pets_web\n```\n\nYou have now deployed your application as a stack on this single node swarm cluster.\n\n3. Verify that your application has been deployed.\n\n```\n~/docker-pets $ docker ps\nCONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS                    \na73f87ba147a        docker-pets:latest   \"/bin/sh -c 'pytho...\"   16 minutes ago      Up 16 minutes (healthy)\n```\n\n4. Go to your browser and in the address bar type in `<node0-public-DNS>`. (The app is serving on port 80 so you don't have to specify the port). This is the address where your local app is being served. If you see something similar to the following then it is working correctly. It may take up to a minute for the app to start up, so try to refresh until it works.\n\n![](images/single-container-deploy.png) \n\n5. Now remove this service.\n\n```\n~/docker-pets $ docker stack rm pets\nRemoving service pets_web\nRemoving network pets_default\n```\n\n## <a name=\"task2\"></a>Task 2: Pushing and Scanning Docker Images\n\n### <a name=\"Task 2.1\"></a>Task 2.1: Creating a Repo\n\nDocker Trusted Registry (DTR) is the enterprise-grade image storage solution from Docker. You install it behind your firewall so that you can securely store and manage the Docker images you use in your applications.\n\nIn this lab, DTR has already been set up for you so you will log in to it and use it.\n\n1. Log in to DTR. Before the lab you should have been assigned a cluster and a username. Use these when logging in.\n\nGo to `https://<dtr-cluster>.dockerdemos.com` and login with your given username and password from your lab welcome email. You should see the DTR home screen.\n\n![](images/dtr-home.png) \n\n2. Before you can push an image to DTR you must create a repository. Click on Repositories / New repository. Fill it with the following values:\n\n- Account: select your username\n- Repository Name: `docker-pets`\n- Description: Write any description\n- Visibility: Private\n- Scan on Push: On\n\n![](images/dtr-repo.png) \n\n3. Click Save. If you click on the `<account>/docker-pets` repo you'll see that it is empty as we have not pushed any images to it yet.\n\n\n### <a name=\"Task 2.1\"></a>Task 2.2: Pushing to the Docker Trusted Registry\n\nNext we will push our local image to DTR. First we will need to authenticate with DTR so that our local engine trusts it. We will use a simple tool that pulls certificates from DTR to our development node.\n\n1. Run the following command. Insert the name of your assigned cluster in the command.\n\n```\n~/docker-pets $ docker run -it --rm -v /etc/docker:/etc/docker \\\n  mbentley/trustdtr <dtr-cluster>.dockerdemos.com\n  \n  \nUsing the root CA certificate for trusting DTR\nAdding certificate to '/etc/docker/certs.d/dtr.church.dckr.org/ca.crt'...done\nVerifying format of certificate...done\n```\n\nFor instance if `dtr3.dockerdemos.com` was your cluster then you would issue the command:\n\n```\ndocker run -it --rm -v /etc/docker:/etc/docker mbentley/trustdtr dtr3.dockerdemos.com\n```\n\n2. Log in to DTR with your username and password.\n\n```\n~/docker-pets $ docker login <dtr-cluster>.dockerdemos.com\nUsername: <username>\nPassword: <password>\nLogin Succeeded\n```\n\n3. Tag the image with the URL of your DTR cluster and with the image tag `1.0` since this is the first version of your app.\n\n```\n~/docker-pets $ docker tag docker-pets <cluster-name>.dockerdemos.com/<username>/docker-pets:1.0\n```\n\n4. Now push your image to DTR.\n\n```\n~/docker-pets $ docker push <dtr-cluster>.docker-pets/<username>/docker-pets:1.0\nThe push refers to a repository [dtr2.dockerdemos.com/mark/docker-pets]\n273eb8eab1c9: Pushed\n7d68ed329d0d: Pushed\n02c1439e0fdc: Pushed\n9f8566ee5135: Pushed\n1.0: digest: sha256:809c6f80331b9d03cb099b43364b7801826f78ab36b26f00ea83988fbefb6cac size: 1163\n```\n\n5. Go to the DTR GUI, click on your `docker-pets` repo, and click Images. The image vulnerability scan should have started already and DTR will display the status of the scan. Once the scan is complete, DTR will display the number of vulnerabilities found. For the `docker-pets` image a critical vulnerability was found.\n\n![](images/scan-status.png) \n\n> You may need to refresh the page to show the status of a scan\n\n6. Click on View details. The Layers tab shows the results of the scan. The scan is able to identify the libraries that are installed as a part of each layer.\n\n![](images/layers.png) \n\n7. Click on Components. The Components tab lists out all of the libraries in the image, arranged from highest to least severity. The CVE is shown in addition to the usage license of the component. If you click on the CVE link it will take you to the official description of the vulnerability.\n\n![](images/components.png) \n\n## <a name=\"task3\"></a>Task 3: Remediating Application Vulnerabilities\n\nWe have built and pushed our application to DTR. DTR image scanning identified a vulnerability and now we are going to remediate the vulnerability and push the image again.\n\n### <a name=\"Task 3.1\"></a>Task 3.1: Rebuild the Image\n\nWe identified that our application has the known vulnerability `CVE-2016-8859`. We can see in the Layers tab that the affected package `musl 1.1.14-r14` is located in the top layer of our image. This is the base layer that was specified in the Dockerfile as `FROM alpine:3.3`. To remediate this we are going to use a more recent version of the `alpine` image, one that has this vulnerability fixed.\n\n1. Go to the `~/docker-pets/web` directory and edit the Dockerfile.\n\n```\n~/docker-pets $ cd web\n~/docker-pets/web $ vi Dockerfile\n```\n\n2. Change the top line `FROM alpine:3.3` to `FROM alpine:3.5`. `alpine:3.5` is  newer version of the base OS that has this vulnerability fixed.\n\n3. Rebuild the image as version `2.0`\n\n```\n~/docker-pets/web $ docker build -t docker-pets .\n\n```\n\n4. Tag the image as the `2.0` and also with the DTR URL.\n\n```\n~/docker-pets/web $ docker tag docker-pets <dtr-cluster>.dockerdemos.com/<username>/docker-pets:2.0\n```\n\n5. Move back to the `docker-pets` directory and deploy the image locally again to ensure that the change did not break the app.\n\n```\n~/docker-pets/web $ cd ..\n\n~/docker-pets $ docker stack deploy -c pets-container-compose.yml pets\nCreating network pets_backend\nCreating service pets_web\n```\n\n6. Go to your browser and in the address pane type in `<node0-public-ip>`. You should see that the app has succesfully deployed with the new change.\n\n### <a name=\"Task 3.2\"></a>Task 3.2: Rescan the Remediated Application\n\nWe have now remediated the fix and verified that the new version works when deployed locally. Next we will push the image to DTR again so that it can be scanned and pulled by other services for additional testing.\n\n1. Push the new image to DTR.\n\n```\n~/docker-pets $ docker push <dtr-cluster>.dockerdemos.com/<username>/docker-pets:2.0\n```\n\n2. Go to the DTR UI and wait for the scan to complete. Once the scan has completed DTR will report that the vulnerability no longer exists in this image. The image is now ready for use by the rest of your team!\n\n> You may need to refresh the page to show the status of a scan\n\n![](images/clean.png) \n\nCongratulations! You just built an application, discovered a security vulnerability, and patched it in just a few easy steps. Pat yourself on the back for helping create safer apps!!\n\n\n### <a name=\"cleanup\"></a>Lab Clean Up\n\nIf you plan to do other labs with these lab nodes then make sure to clean up after yourself! Run the following command and make sure that you remove any running containers.\n\n```\n~/docker-pets $ docker swarm leave --force\nNode left the swarm.\n```\n\n\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/template.md",
    "content": "# Lab X: Lab Title\r\n\r\nQuick description of the lab.\r\n\r\n> **Difficulty**: Beginner | Intermediate | Advanced\r\n\r\n> **Time**: Approximately XX minutes\r\n\r\n> **Tasks**:\r\n>\r\n> * [Prerequisites](#prerequisites)\r\n> * [Task 1](#task1)\n> * [Task 2](#task2)\r\n\r\n## Document conventions\n\r\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \r\n\r\nFor instance if you see `ssh <username>@<hostname>` you would actually type something like `ssh labuser@v111node0-adaflds023asdf-23423kjl.appnet.com`\r\n\r\nYou will be asked to SSH into various nodes. These nodes are referred to as **v111node0**, **v111node1** etc. These tags correspond to the very beginning of the hostnames you will find in your welcome email. \n\n## <a name=\"prerequisites\"></a>Prerequisites\r\n\r\n- Lists all your prerequisites\r\n\r\n## <a name=\"Task 1\"></a>Task #1\r\n\r\nBefore we begin, we will need to:\r\n\r\n1. Provide an overview of what will be done in this section\n2. Use a bulleted list\n\r\n## <a name=\"Task #2\"></a>Task #2\r\n\r\nBefore we begin, we will need to:\r\n\r\n1. Create as many tasks as needed to break the lab into logical steps\r\n\n## Wrap Up\n\r\nThank you for taking the time to complete this lab! Feel free to try any of the other labs. I\r\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-101/README.md",
    "content": "# Windows Docker Containers 101\n\nDocker runs natively on Windows 10 and Windows Server 2016. In this lab you'll learn how to package Windows applications as Docker images and run them as Docker containers. You'll learn how to create a cluster of Docker servers in swarm mode, and deploy an application as a highly-available service.\n\n> **Difficulty**: Beginner \n\n> **Time**: Approximately 30 minutes\n\n> **Tasks**:\n>\n> * [Prerequisites](#prerequisites)\n> * [Task 1: Run some simple Windows Docker containers](#task1)\n>   * [Task 1.1: Run a task in a Nano Server container](#task1.1)\n>   * [Task 1.2: Run an interactive Windows Server Core container](#task1.2)\n>   * [Task 1.3: Run a background IIS web server container](#task1.3)\n> * [Task 2: Package and run a custom app using Docker](#task2)\n>   * [Task 2.1: Build a custom website image](#task2.1)\n>   * [Task 2.2: Push your image to Docker Cloud](#task2.2)\n>   * [Task 2.3: Run your website in a container](#task2.3)\n> * [Task 3: Run your app in a highly-available cluster](#task3)\n>   * [Task 3.1: Create a Docker swarm with Windows Server nodes](#task3.1)\n>   * [Task 3.2: Deploy your website as a service](#task3.2)\n\n## Document conventions\n\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \n\nFor instance if you see `$ip = <ip-address>` you would actually type something like `$ip = '10.0.0.4'`\n\nYou will be asked to RDP into various servers. \n\n## <a name=\"prerequisites\"></a>Prerequisites\n\nYou will need a set of Windows Server 2016 virtual machines running in Azure, which are already configured with Docker and the Windows base images. You do not need Docker running on your laptop, but you will need a Remote Desktop client to connect to the VMs. \n\n- Windows - use the built-in Remote Desktop Connection app.\n- Mac - install [Microsoft Remote Desktop](https://itunes.apple.com/us/app/microsoft-remote-desktop/id715768417?mt=12) from the app store.\n- Linux - install [Remmina](http://www.remmina.org/wp/), or any RDP client you prefer.\n\nYou will build images and push them to Docker Cloud, so you can pull them on different Docker hosts. You will need a Docker ID.\n\n- Sign up for a free Docker ID on [Docker Cloud](https://cloud.docker.com)\n\n## Prerequisite Task: Prepare your lab environment\n\nStart by ensuring you have the latest lab source code. RDP into one of your Azure VMs, and open a PowerShell prompt with the \"Run as Administator\" option.\n\nIf you're using a VM provided for a Docker lab, you will find the source code is already cloned, just run these commands to update it:\n\n```\ncd C:\\scm\\github\\docker\\labs\ngit pull\n```\n\nIf you're using your own VM, clone the lab repo from GitHub:\n\n```\nmkdir -p C:\\scm\\github\\docker\ncd C:\\scm\\github\\docker\ngit clone https://github.com/docker/labs.git\n```\n\nNow set set some variables for your source path and Docker ID, so you can copy and paste commands from the lab:\n\n```\n$labRoot='C:\\scm\\github\\docker\\labs\\dockercon-us-2017\\windows-101'\n$dockerId='<Your Docker ID>'\n```\n\nLastly clear up anything left from a previous lab. You only need to do this if you have used this VM for one of the other Windows labs, but you can run it sefaly to restore Docker to a clean state. \n\nThis stops and removes all running containers, and then leaves the swarm - ignore any error messages you see:\n\n```\ndocker container rm -f $(docker container ls -a -q)\ndocker swarm leave -f\n```\n\n## <a name=\"task1\"></a>Task 1: Run some simple Windows Docker containers\n\nThere are different ways to use containers:\n\n1. In the background for long-running services like websites and databases\n2. Interactively for connecting to the container like a remote server\n3. To run a single task, which could be a PowerShell script or a custom app\n\nIn this section you'll try each of those options and see how Docker manages the workload. Before you start, let's check the Docker service is up and running. RDP into one of your Azure VMs, open a PowerShell prompt from the taskbar shortcut, and run:\n\n```\ndocker version\n```\n\nThe Docker CLI connects to the Docker API running as a Windows Service, and you will see two sets of output. The first tells you the version and operating system where the Docker client is running, and the second tells you the version and operating system where the Docker service is running. Docker is cross-platform, so you can manage Linux hosts from Windows clients, and Windows hosts from Linux or Mac clients.\n\n## <a name=\"task1.1\"></a>Task 1.1: Run a task in a Nano Server container\n\nThis is the simplest kind of container to start with. In PowerShell run:\n\n```\ndocker container run microsoft/nanoserver powershell Write-Output Hello DockerCon 2017!\n```\n\nYou'll see the output written from the PowerShell command. Here's what Docker did:\n\n- created a new container from the [microsoft/nanoserver](https://store.docker.com/images/nanoserver) image, which has a basic Nano Server deployment, maintained by Microsoft\n- started the container, running the `powershell` command and passing the `Write-Output...` arguments\n- relayed the console output from the container to the PowerShell window\n\nDocker keeps a container running as long as the process it started inside the container is still running. In this case the `powershell` process completes when the `Write-Output` command finishes, so the container stops. The Docker platform is cautious with your data - it doesn't delete resources by default, so the container still exists. You can list all the containers on the system and see the Nano Server container is still there, but is in the `Exited` state:\n\n```\n> docker container ls --all\nCONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                      PORTS               NAMES\na525b7fb086b        microsoft/nanoserver   \"powershell Write-...\"   31 seconds ago      Exited (0) 19 seconds ago                       peaceful_benz\n```\n\nContainers which do one task and then exit can be very useful. You could build a Docker image which installs the Azure PowerShell module and bundles a set of custom scripts to create a cloud deployment. Anyone can execute that task just by running the container - they don't need the scripts or the right version of the Azure module, they just need to pull the Docker image.\n\n\n## <a name=\"task1.2\"></a>Task 1.2: Run an interactive Windows Server Core container\n\nNano Server is a new operating system from Microsoft which supports a subset of the full Windows APIs. You can use it to package cross-platform applications like Java, Go, Node.js and .NET Core, but not full .NET Framework apps. For that there's the [microsoft/windowsservercore](https://store.docker.com/images/windowsservercore) image which is a full Windows Server 2016 OS, without the UI.\n\nYou can explore an image by running an interactive container. Run this to start a Windows Server Core container and connect to it:\n\n```\ndocker container run -it --rm microsoft/windowsservercore powershell\n```\n\n- `-it` means run the container interactively, and connect a terminal session\n- `--rm` means automatically remove the container when it exits\n\nWhen the container starts you'll drop into a PowerShell session with the default prompt `PS C:\\>`. This is PowerShell running inside a Windows Server Core container. Docker has attached to the console, relaying input and output between your PowerShell window and the PowerShell session in the container.\n\nRun some commands to see how the Windows Server Core image is built:\n\n- `ls c:\\` - lists the C drive contents, you'll see this is a minimal installation of Windows \n- `Get-Process` - shows all running processes in the container. There are a number of Windows Services, and the PowerShell exe\n- `Get-WindowsFeature` - shows the Windows feature which are available or already installed\n\nYou'll see that the base image has .NET 4.6 installed, which is backwards-compatible so you can run .NET 2.0 apps. Almost all Windows Server features are available (.NET 3.5 is an exception, but the [microsoft/aspnet:3.5](https://store.docker.com/images/aspnet/) image comes with that installed). You can install them with the `Add-WindowsFeature` cmdlet, which is how you would start to build up a custom application image from the base image, adding in the features you need.\n\nInteractive containers are useful when you are putting together your own image. You can run a container and verify all the steps you need to deploy your app. Once you have it working, you can [commit](https://docs.docker.com/engine/reference/commandline/commit/) a running container to an image - but it's much better to capture those steps in a repeatable [Dockerfile](https://docs.docker.com/engine/reference/builder/). You'll do that in a later task.\n\nNow run `exit` to leave the PowerShell session. That stops the container process, so the container exits. You ran the container with the `--rm` flag, so Docker will delete it. Run `docker container ls -a` now and you'll see only the original Nano Server container.\n\n\n## <a name=\"task1.3\"></a>Run a background IIS web server container\n\nBackground containers are how you'll run your application. Here's a simple example using another image from Microsoft - [microsoft/iis](https://store.docker.com/images/iis) which builds on top of the Windows Server Core image and installs the IIS Web Server feature:\n\n```\ndocker container run -d -p 80:80 --name iis microsoft/iis\n```\n\n- `-d` starts in detached mode, Docker runs the container in the background and monitors it\n- `-p` publishes a port. The IIS image is built to allow traffic in on port 80. This maps port 80 on the host to port 80 in the container\n- `--name` gives the container a name so you can refer to it in management commands\n\nOpen a browser on your laptop and go to the address of your VM. You'll see the basic IIS homepage, which is being served by the container:\n\n![IIS in a Windows Server Core container](images/iis.png)\n\nPublishing the container port means any traffic the VM receives on port 80 gets forwarded to the IIS container, and the responses are forwarded back. Back in your Windows Server VM, run `docker container ls` and you'll see the IIS container is still running. Run `Get-Process` and you'll see all the processes running in the VM, which will include a line for the IIS worker process running in the container, `w3wp` - something like this:\n\n```\nHandles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName\n-------  ------    -----      -----     ------     --  -- -----------\n...\n    187      19     4944      13096       0.09   4916   4 w3wp\n```\n\nIt's important to realize that the container process - `w3wp.exe` in this case - is actually running on the host. That's what makes Docker containers so lightweight and so efficient, all containers are sharing the host's operating system. The container is using the filesystem built in the `microsoft/iis` image, which is where the `w3wp.exe` executable lives. The Azure VM doesn't have IIS installed, everything the app needs is packaged in the image.\n\n\n## <a name=\"task2\"></a>Task 2: Package and run a custom app using Docker\n\nNext you'll learn how to package your own Windows app as a Docker image, using a [Dockerfile](https://docs.docker.com/engine/reference/builder/). \n\nThe Dockerfile is a simple script which contains all the steps to deploy your application. You need to use an existing image as the starting point for your app, but you decide which one. You can use the base Windows Server or Nano Server image, or an [official image](https://docs.docker.com/docker-hub/official_repos/) with the app platform you need already installed - like [openjdk:windowsservercore](https://store.docker.com/images/openjdk) which is good for running Java apps in Windows Docker containers.\n\nThe Dockerfile syntax is simple. In this task you'll walk through a Dockerfile for a custom website, and see how to package and run it with Docker.\n\nHave a look at the [Dockerfile for the lab](tweet-app/Dockerfile), which builds a simple static website running on IIS. These are the main features:\n\n- it is based [FROM](https://docs.docker.com/engine/reference/builder/#from) `microsoft/windowsservercore`, so the image will start with a clean Windows Server 2016 deployment\n- it uses the [SHELL](https://docs.docker.com/engine/reference/builder/#shell) instruction to switch to PowerShell when building the Dockerfile, so the commands to run are all in PowerShell\n- it adds the IIS Windows feature and exposes port 80, setting up the web server and allowing traffic into containers on port 80\n- it configures IIS to write all log output to a single file, using the `Set-WebConfigurationProperty` cmdlet\n- it copies the [start.ps1](tweet-app/start.ps1) startup script and [index.html](tweet-app/index.html) files from the host into the image\n- it specifies `start.ps1` as the [CMD](https://docs.docker.com/engine/reference/builder/#cmd) to run when containers start. The script starts the IIS Windows Service and relays the log file entries to the console\n- it adds a [HEALTHCHECK](https://docs.docker.com/engine/reference/builder/#healthcheck) which makes an HTTP GET request to the site and returns whether it got a 200 response code\n\n\n## <a name=\"task2.1\"></a>Task 2.1: Build a custom website image\n\nThe Docker platform has the capability to build, ship and run software.\n\nTo build the Dockerfile into a Docker image, open a PowerShell prompt on the Windows VM, change to the `tweet-app` directory and run the `docker image build` command:\n\n```\ncd $labRoot\\tweet-app\ndocker image build -t \"$dockerId/dockercon-tweet-app\" .\n```\n\n-`-t` tags the image, giving it a name you use to push the image or run containers\n\n> Be sure to use your Docker ID in the image tag. You will share it on Docker Cloud in the next step, and you can only do that if you use your ID. My Docker ID is `sixeyed`, so I run `docker build -t sixeyed/dockercon-tweet-app` \n\nYou'll see output on the screen as Docker runs each instruction in the Dockerfile, starting like this:\n\n```\nSending build context to Docker daemon 6.144 kB\nStep 1/10 : FROM microsoft/windowsservercore\n ---> b4713e4d8bab\nStep 2/10 : SHELL powershell -Command $ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\n...\n```\n\nThe build command will take a little while to run, as the step to install IIS takes a while in Windows. Once it's built you'll see a `Successfully built...` message. If you repeat the `docker build` command again, it will complete in seconds. That's because Docker caches the [image layers](https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/) and only runs instructions if the Dockerfile has changed since the cached version.\n\nNow if you list the images and filter on the `dockercon` name, you'll see your new image:\n\n```\n> docker image ls -f reference=*/dockercon*\n\nREPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE\nsixeyed/dockercon-tweet-app   latest              a14860778046        11 minutes ago      10.4 GB\n```\n\nDocker has built the image but it's only stored on the local machine. Next you'll push it to a public repository.\n\n## <a name=\"task2.2\"></a>Task 2.2: Push your image to Docker Cloud\n\nDistribution is built into the Docker platform. You can build images locally and push them to a [registry](https://docs.docker.com/registry/), making them available to other users. Anyone with access can pull that image and run a container from it. The behavior of the app in the container will be the same for everyone, because the image contains the fully-configured app - the only requirements to run it are Windows and Docker.\n\nYou can push your website image to [Docker Cloud](https://cloud.docker.com), and later in the lab we'll pull it on other servers and run it on a cluster. When you push to Cloud, if you make it a public repository, it is also available to others on [Docker Store](https://store.docker.com), the public registry for Docker images. To push images, you need to log in using the command line and providing your Docker ID credentials:\n\n```\n> docker login\nLogin with your Docker ID to push and pull images from Docker Cloud. If you don't have a Docker ID, head over to https://cloud.docker.com to create one.\nUsername: <DockerID>\nPassword:\nLogin Succeeded\n```\n\nNow upload your image to the Hub:\n\n```\ndocker image push $dockerId/dockercon-tweet-app\n```\n\nYou'll see the upload progress for each layer in the Docker image. The IIS layer is almost 300MB so that will take a few seconds. The whole image is over 10GB, but the bulk of that is in the Windows Server Core base image. Those layers are already stored in Docker Cloud, so they don't get uploaded - only the new parts of the image get pushed.\n\nYou can browse to [https://store.docker.com/community/images/&lt;DockerID&gt;/dockercon-tweet-app](https://store.docker.com/community/images/DockerID/dockercon-tweet-app) and see your newly-pushed app image. This is a public repository, so anyone can pull the image - you don't even need a Docker ID to pull public images.\n\n## <a name=\"task2.3\"></a>Task 2.3: Run your website in a container\n\nIt's time to run your app and see what it does! First, clear up any containers which are still running by forcing them to stop and then removing them:\n\n```\ndocker container rm -f $(docker container ls -a -q)\n```\n\n- `container ls -a -q` lists all containers and just returns the ID - which is suitable to feed into the `rm` command to remove containers\n\nThis is a web application, so you'll run it in the background and publish the HTTP port in the same way that you did with the IIS image:\n\n```\ndocker container run -d -p 80:80 $dockerId/dockercon-tweet-app \n```\n\nWhen the application starts, browse to the VM address from your laptop browser and you'll see the web app:\n\n![The DockerCon Tweet app in a Windows Server Core container](images/tweet-app.png)\n\nGo ahead and hit the button to Tweet about your lab progress! No data gets stored in the container, so your credentials are safe. \n\n## <a name=\"task3\"></a>Task 3: Run your app in a highly-available cluster\n\nYour app is packaged in a portable Docker image, and you can rebuild it any time with a simple script. You've shared it on Docker Cloud and deployed it on a cloud server, but at the moment you just have a single VM serving your app. That doesn't give you high availability, and for a tier 1 app like this you'll want to avoid downtime if there are any issues with the VM.\n\nDocker supports failover and scaling with a clustering technology built right into the engine - [Docker swarm mode](https://docs.docker.com/engine/swarm/). You don't need anything extra to turn a set of machines into a highly-available cluster, just Windows and Docker. In the rest of this lab you'll set up a single-node swarm and deploy your app as a service.\n\n> A single-node swarm doesn't give you high availability, but it's great for testing deployments non-production environments.\n \n## <a name=\"task3.1\"></a> Task 3.1: Create a Docker swarm with Windows Server\n\nThere are two server roles in a Docker swarm - managers and workers. You'll make the VM into a single-node swarm, so it will be a manager. Managers can run application workloads as well as workers. Start by clearing down running containers again:\n\n```\ndocker container rm -f $(docker container ls -a -q)\n```\n\nSwitch to swarm mode. Run the `swarm init` command to initialize the swarm:\n\n```\ndocker swarm init\n```\n\n> Your RDP session may be interrupted because of a network change when the node switches to swarm mode. It will reconnect in a few seconds.\n\nThe output shows you that Docker is now in swarm mode, and it gives you the secret token you need to join other nodes to the swarm. The token is used to stop rogue nodes joining your swarm, so you should keep it secure - like a database connection string. The `swarm init` command output looks like this:\n\n```\nSwarm initialized: current node (i0rfsqu9x53mk4eno0kltocul) is now a manager.\n\nTo add a worker to this swarm, run the following command:\n\n    docker swarm join --token SWMTKN-1-4ceehsi885na4zynpj6eu425863zc360xqu3jvq7jfbi2937j1-da80w5qdzony7iw5u3ap0gps8 10.0.0.7:2377\n\nTo add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\n```\n\n> For a HA environment you would add extra nodes to the swarm. In production you need three managers for failover, and as many workers as you need for your applications.\n\nNow you have a fully-featured Docker swarm, which you can create into cluster of Docker servers. You'll administer the swarm from the manager node.\n\n\n## <a name=\"task3.2\"></a> Task 3.2: Deploy your website as a service\n\nSwarm mode is an orchestration engine - you use it to deploy highly-available, scalable, distributed solutions. You don't run containers in swarm mode - instead you create services and specify the number of replicas each service should have. Replicas are just containers, but the swarm decides which node to create them on, based on the capacity of the nodes when more containers are needed.\n\nYou can run your web app as service with `docker service create`:\n\n```\ndocker service create `\n --publish mode=host,target=80,published=80 `\n --detach=true `\n --replicas=1 `\n --name tweet-app `\n$dockerId/dockercon-tweet-app\n```\n\n- `--publish` publishes the ports, but you use a special syntax in swarm mode\n- `--replicas` states how many containers should run the service\n- `--name` gives the service a name for administration and discovery\n\nDocker will create one container from the image, and schedule it to run across the nodes in the cluster. In a multi-node swarm, the scheduler will use different nodes for each replica if it can, but in this case it can only run the replica on the manager node.\n\nRun `docker service ps` to see the containers which are running the service replicas:\n\n```\n> docker service ps tweet-app\nID                  NAME                IMAGE                                NODE                DESIRED STATE       CURRENT STATE                  ERROR               PORTS\nvhjsgt6a2goh        tweet-app.1         sixeyed/dockercon-tweet-app:latest   avanade-prep3       Running             Preparing about a minute ago\n```\n\nYou'll see there's one container running on the manager node. Browse to the VM address from your laptop and you will see the Tweet app is still running.\n\nIn a production environment you would have a load balancer as the entrypoint to your application, distributing traffic among multiple swarm nodes. Any node can receive a request and respond to it. You would also have a healthcheck in the load balancer so traffic only reached healthy nodes - that lets you do [zero-downtime updates](https://docs.docker.com/engine/swarm/swarm-tutorial/rolling-update/) of your Docker service.\n\n## Wrap Up\n\nThank you for taking the time to complete this lab! You now know how to use Docker on Windows, how to package your own apps as Docker images, and how to run multiple Windows servers as a Docker swarm for high-availability and scale.\n\nDo try the other Windows labs at DockerCon, and make a note to check out the full lab suite when you get home - there are plenty more Windows walkthroughs at [docker/labs](https://github.com/docker/labs/tree/master/windows) on GitHub.\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-101/tweet-app/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Add-WindowsFeature Web-Server\nEXPOSE 80\n\nRUN Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.applicationHost/log' -name 'centralLogFileMode' -value 'CentralW3C'; `\n    Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.applicationHost/log/centralW3CLogFile' -name 'truncateSize' -value 4294967295; `\n    Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.applicationHost/log/centralW3CLogFile' -name 'period' -value 'MaxSize'; `\n    Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.applicationHost/log/centralW3CLogFile' -name 'directory' -value 'c:\\iislog'\n\nWORKDIR C:\\\nCOPY start.ps1 .\nCOPY index.html C:\\inetpub\\wwwroot\n\nCMD .\\start.ps1\n\nHEALTHCHECK CMD powershell -command `\n    try { `\n     $response = Invoke-WebRequest http://localhost -UseBasicParsing; `\n     if ($response.StatusCode -eq 200) { return 0} `\n     else {return 1}; `\n    } catch { return 1 }"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-101/tweet-app/index.html",
    "content": "<html>\n    <head>\n        <style>\n\n        body {\n        \tbackground-image: linear-gradient(-74deg, transparent 90%, rgba(255, 255, 255, 0.23) 20%), linear-gradient(-74deg, transparent 83%, rgba(255, 255, 255, 0.18) 15%), linear-gradient(-74deg, transparent 76%, rgba(255, 255, 255, 0.1) 15%), linear-gradient(to top, #127ab1, #1799e0, #1796db);\n    \t\tbackground-size: cover;\n    \t\tmargin-bottom: 0px!important;\n        }\n\n        div{\n            font-family: 'Geomanist', sans-serif;\n  \t\t\tfont-weight: normal;\n  \t\t\tcolor: white;\n            width: 50%;\n            margin: 0 auto;\n            position: relative;\n            top: 50%;\n            transform: translateY(-50%);\n\n        }\n        </style>\n    </head>\n\n    <body>\n\n       <img src=https://www.docker.com/sites/all/themes/docker/assets/images/brand-full.svg width=20%></img>\n\n       <div class=\"inner\">\n            <h1>Welcome to DockerCon 2017!</h1>\n\n            <p>\n\t\t\tGood job on working through the Windows 101 hands-on-lab! Click to Tweet about your progress!\n\n\t\t  \t<p>\n\n\t\t\t <a href=\"https://twitter.com/intent/tweet?button_hashtag=dockercon\" class=\"twitter-hashtag-button\" data-size=\"large\" data-text=\"I'm working through the #Windows #Docker Containers 101 lab @DockerCon!\" data-url=\"http://www.docker.com\" data-lang=\"en\" data-show-count=\"false\">Tweet</a><script async src=\"//platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n            </div>\n\n    </body>\n\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-101/tweet-app/start.ps1",
    "content": "\nWrite-Output 'Starting w3svc'\nStart-Service W3SVC\n    \nWrite-Output 'Making HTTP GET call'\nInvoke-WebRequest http://localhost -UseBasicParsing | Out-Null\n\nWrite-Output 'Flushing log file'\nnetsh http flush logbuffer | Out-Null\n\nWrite-Output 'Tailing log file'\nGet-Content -path 'c:\\iislog\\W3SVC\\u_extend1.log' -Tail 1 -Wait"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n**/Properties/launchSettings.json\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/\n\n# output from Docker builds\nProductLaunchWeb/\nSaveProspectHandler/"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/README.md",
    "content": "# Modernize .NET Apps - for Devs\n\nYou can run full .NET Framework apps in Docker using the [Windows Server Core](https://store.docker.com/images/windowsservercore) base image from Microsoft. That image is a headless version of Windows Server 2016, so it has no UI but it has all the other roles and features available. Building on top of that there are also Microsoft images for [IIS](https://store.docker.com/images/iis) and [ASP.NET](https://store.docker.com/images/aspnet), which are already configured to run ASP.NET and ASP.NET 3.5 apps in IIS.\n\nThis lab steps through porting an ASP.NET WebForms app to run in a Docker container on Windows Server 2016. With the app running in Docker, you can easily modernize it - and in the lab you'll add new features quickly and safely by making use of the Docker platform.\n\n## What You Will Learn\n\nYou'll learn how to:\n\n- Package an existing ASP.NET application so it runs in Docker, without any application changes.\n\n- Run SQL Server Express in a Docker container, and use it for the application database.\n\n- Use a feature-driven approach to address problems in the existing application, without an extensive re-write.\n\n- Use the Dockerfile and Docker Compose syntax to replace manual deployment documents.\n\n\n> **Difficulty**: Beginner \n\n> **Time**: Approximately 35 minutes\n\n> **Tasks**:\n>\n> * [Prerequisites](#prerequisites)\n> * [Task 1: Building ASP.NET applications with Docker](#task1)\n>   * [Task 1.1: Setting up an ASP.NET build agent in Docker](#task1.1) \n>   * [Task 1.2: Packaging the build agent as a Docker image](#task1.2)\n>   * [Task 1.3: Build the ASP.NET app with the Docker build agent](#task1.3)\n> * [Task 2: Running ASP.NET applications as Docker containers](#task2)\n>   * [Task 2.1: Packaging ASP.NET apps as Docker images](#task2.1)\n>   * [Task 2.2: Connecting to SQL Server in a Docker container](#task2.2)\n>   * [Task 2.3: Running the database and web app in containers](#task2.3)\n> * [Task 3: Breaking up the ASP.NET monolith](#task3)\n>   * [Task 3.1: Breaking the save feature out of the web app](#task3.1)\n>   * [Task 3.2: Implementing the save in a console app](#task3.2)\n>   * [Task 3.3: Running the distributed solution with Docker Compose](#task3.3)\n\n## Document conventions\n\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \n\nFor instance if you see `$ip = <ip-address>` you would actually type something like `$ip = '10.0.0.4'`\n\nYou will be asked to RDP into various servers.\n\n## <a name=\"prerequisites\"></a>Prerequisites\n\nYou need a set of Windows Server 2016 virtual machines running in Azure, which are already configured with Docker and the Windows base images. You do not need Docker running on your laptop, but you will need a Remote Desktop client to connect to the VMs. \n\n- Windows - use the built-in Remote Desktop Connection app.\n- Mac - install [Microsoft Remote Desktop](https://itunes.apple.com/us/app/microsoft-remote-desktop/id715768417?mt=12) from the app store.\n- Linux - install [Remmina](http://www.remmina.org/wp/), or any RDP client you prefer.\n\n> When you connect to the VM, if you are prompted to run Windows Update, you should cancel out. The labs have been tested with the existing VM state and any changes may cause problems.\n\nYou will build images and push them to Docker Cloud, so you can pull them on different Docker hosts. You will need a Docker ID.\n\n- Sign up for a free Docker ID on [Docker Cloud](https://cloud.docker.com)\n\n## Prerequisite Task: Prepare your lab environment\n\nStart by ensuring you have the latest lab source code. RDP into one of your Azure VMs, and open a PowerShell prompt with the \"Run as Administator\" option.\n\nIf you're using a VM provided for a Docker lab, you will find the source code is already cloned, just run these commands to update it:\n\n```\ncd C:\\scm\\github\\docker\\labs\ngit pull\n```\n\nIf you're using your own VM, clone the lab repo from GitHub:\n\n```\nmkdir -p C:\\scm\\github\\docker\ncd C:\\scm\\github\\docker\ngit clone https://github.com/docker/labs.git\n```\n\nNow set set some variables for your source path and Docker ID, so you can copy and paste commands from the lab:\n\n```\n$labRoot='C:\\scm\\github\\docker\\labs\\dockercon-us-2017\\windows-modernize-aspnet-dev'\n$dockerId='<Your Docker ID>'\n```\n\nNow clear up anything left from a previous lab. You only need to do this if you have used this VM for one of the other Windows labs, but you can run it safely to restore Docker to a clean state. \n\nThis stops and removes all running containers, and then leaves the swarm - ignore any error messages you see:\n\n```\ndocker container rm -f $(docker container ls -a -q)\ndocker swarm leave -f\n```\n\n## <a name=\"task1\"></a>Task 1: Building ASP.NET applications with Docker\n\nThe application for this lab is an ASP.NET WebForms app, which showcases a product launch website and lets users sign up to receive more details, storing data in SQL Server. In a dev environment it would normally be deployed with IIS Express and SQL Server LocalDB:\n\n![v1 architecture](images/v1-arch.png)\n\nThe source code is in a [Visual Studio 2015 solution file](v1-src/ProductLaunch/ProductLaunch.sln), but you don't need Visual Studio to build the application. You'll start by building a build agent in Docker, so anyone can build and run the app from source, just using Docker.\n\n\n## <a name=\"task1.1\"></a> Task 1.1: Setting up an ASP.NET build agent in Docker\n\nAll the parts of MSBuild which you need for different project types are available as NuGet packages, so it's easy to put together a Docker image which can build ASP.NET apps from source.\n\nHave a look at the [Dockerfile](v1-src/docker/builder/Dockerfile) for the build agent. It's a simple example with a few things to note:\n\n- `FROM` specifies Windows Server Core as the base image. You need the .NET Framework, so you can't use Nano Server as the base\n- first `RUN` installs Chocolatey as a NuGet package provider, and then installs all the MSBuild tools - including the .NET 4.5 targeting pack, and WebDeploy for publishing the ASP.NET app \n- second `RUN` installs the the Visual Studio web targets, for actually building the `.csproj`.\n\nExplicit versions are specified for all the installs, so this is a repeatable Dockerfile - it will always produce the same build agent with the same set of components.\n\nThe [ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint) is just `powershell`. To build the application, you'll run a container from this image, using [Docker Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume) to give the container access to the source files stored on the host. The source contains a PowerShell build script which the container will run. The output from MSBuild will be written to the host, so the actual container running the build agent is disposable.\n\n## <a name=\"task1.2\"></a> Task 1.2: Packaging the build agent as a Docker image\n\nThe build agent is generic, it can be used to compile any .NET 4.5 web projects. You could add more targeting packs from NuGet in the Dockerfile if you want to support different .NET versions. \n\nTo build the image, change to the builder directory and build the Dockerfile:\n\n```\ncd $labRoot\\v1-src\\docker\\builder\ndocker image build -t $dockerId/modernize-aspnet-builder .\n```\n\nThe output from `docker image build` shows you the Docker engine executing all the steps in the Dockerfile. On your lab VM the base images have already been pulled, but the installations from Chocolatey will take a couple of minutes.\n\nNow you have a Docker image for building the app, which you can share on a public or private registry. Anyone who joins the team can use that image to build the app - and the same image can be used in the CI build, so you don't need to install Visual Studio on the build server.\n\n## <a name=\"task1.3\"></a> Task 1.3: Build the ASP.NET app with the Docker build agent\n\nWith the builder image you can build any ASP.NET application, you just need to prepare a `docker run` command which mounts the host directories into the container and specifies the MSBuild script to run. \n\nThe [build.ps1](v1-src/ProductLaunch/build.ps1) script for version 1 of the app is very simple, it just builds the web project from the expected source location, and publishes to the expected output location. On your lab VM, change to the `v1-src` directory and run a container to build the web app:\n\n```\ncd $labRoot\\v1-src\n\ndocker container run --rm `\n -v $pwd\\ProductLaunch:c:\\src `\n -v $pwd\\docker:c:\\out `\n <DockerID>/modernize-aspnet-builder `\n C:\\src\\build.ps1 \n```\n\nThat command runs a container from the generic ASP.NET builder image with the following configuration:\n\n- the project source folder on the host is mounted as `C:\\src` inside the container\n- the `docker` folder on the host is mounted as `C:\\out` inside the container\n- the `build.ps1` script is executed, which publishes the web project to the output folder.\n\nYou'll see all the familiar output from MSBuild while the container is running. When it finishes, check that the output is there in the `docker` folder:\n\n```\nls .\\docker\\web\n```\n\nYou should see a new folder called `ProductLaunchWeb`, which contains the published website. \n\n## <a name=\"task2\"></a>Task 2: Running ASP.NET applications as Docker containers\n\nNow you have a repeatable way to publish the ASP.NET application, you can build a Docker image which packages the compiled app with all its dependencies. Just by running the app in the Docker platform you get increased compute utilization, improved security, and centralized management. But it's also an enabler for modernizing the app, making use of the great software that runs on Docker to add new features.\n\nTo package the ASP.NET application to run in Docker you'll use a Dockerfile that does the following:\n\n- starts with a clean, up-to-date installation of Windows Server Core\n- installs IIS as the application host and ASP.NET as the app framework\n- copies the application content from the published build\n- configures the application as an IIS website\n\nYou should package your applications individually, with a single ASP.NET app in each image. That lets you deploy, scale and upgrade your applications separately. If you have many ASP.NET apps with similar configurations, all your Dockerfiles will be broadly the same. The content for each app will change, and some may need additional setup, but there will be a lot of commonality. \n\n## <a name=\"task2.1\"></a>Task 2.1: Packaging ASP.NET apps as Docker images\n\nCheck out the [Dockerfile](v1-src/docker/web/Dockerfile) for the ASP.NET app. It starts from `microsoft/aspnet`, a Microsoft-owned image based on Windows Server Core which comes with IIS and ASP.NET already installed. Then it uses PowerShell to configure a new website in IIS:\n\n```\nRUN Remove-Website -Name 'Default Web Site'; `\n    New-Item -Path 'C:\\web-app' -Type Directory; `\n    New-Website -Name 'web-app' -PhysicalPath 'C:\\web-app' -Port 80 -Force\n```\n\nThere's one more `RUN` instruction which you need for multi-container apps, and that turns off the DNS cache in Windows by setting a Registry value:\n\n```\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' `\n     -Name ServerPriorityTimeLimit -Value 0 -Type DWord\n```\n\nDocker has its own DNS server which is how containers can find each other by name. In Windows the DNS cache is too aggressive, and you want every lookup to come back to Docker so when containers are replaced you get the latest IP address.\n\nLastly the Dockerfile copies in the published website from the builder. Build the image to package up the app:\n\n```\ncd $labRoot\\v1-src\\docker\\web\ndocker image build -t $dockerId/modernize-aspnet-web:v1 .\n```\n\n> Be sure to tag the image with your own Docker ID so you can push it to Docker Cloud.\n\n## <a name=\"task2.2\"></a>Task 2.2: Connecting to SQL Server in a Docker container\n\nFor version 1 you're going to package the application as-is, without any code changes, to run it in Docker. But you will need some configuration changes. The connection string in the project is set to use [SQL Server Express LocalDB](https://blogs.msdn.microsoft.com/sqlexpress/2011/07/12/introducing-localdb-an-improved-sql-express/):\n\n```\n... connectionString=\"Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;AttachDbFilename=|DataDirectory|\\ProductLaunch.mdf\"\n```\n\nThat may be OK for developers, as LocalDB comes installed with Visual Studio. You could even install LocalDB in the Docker image and use the same configuration, but that's not good practice. That would mean running one container which hosts both the web app and the database, tightly coupling them and making it difficult to scale or upgrade the components separately. Instead you'll run SQL Server Express in a separate container.\n\nIn the Docker image you've just built, there's a [Web.config](v1-src/docker/web/Web.config) file, which gets copied over the existing `Web.config` file from the published application. The connection string in the new file uses `sql-server` as the database server name, and specifies user credentials:\n\n```\n... connectionString=\"Server=sql-server;Database=ProductLaunch;User Id=sa;Password=DockerCon2017;\"\n```\n\nWhen you run the web application, the DNS server in the Docker platform will resolve the `sql-server` host name to the correct address of the container called `sql-server`.\n\n## <a name=\"task2.3\"></a>Task 2.3: Running the database and web app in containers\n\nMicrosoft provide a SQL Server Express image on Docker Store, which is already pulled on your lab VM. Run it in a container with this command to set up the expected credentials and DNS name:\n\n```\ndocker container run --detach `\n --env sa_password=DockerCon2017 `\n --env ACCEPT_EULA=Y `\n --name sql-server `\n microsoft/mssql-server-windows-express\n```\n\nStarting the website is as simple running a container from the application image you've built:\n\n```\ndocker container run -d -p 80:80 `\n --name web `\n $dockerId/modernize-aspnet-web:v1\n```\n\nIf you run `docker container ls` now, you'll see two containers - one running SQL Server and one running the WebForms app. The SQL Server container doesn't expose any ports, because the web container can connect to it through the Docker network, SQL doesn't need to be publicly available.\n\nThe web container publishes port 80 to the host so you can access the website externally. On your laptop browse to the address of the lab VM and you'll see the product launch website:\n\n![Product launch v1 website](images/app-v1.png)\n\nGo ahead and click the \"Sign Up\" button. The form you see is reading the drop-down values from SQL Server. The web app uses Entity Framework code-first to create the schema and write seed data. Fill out the form and click the \"Go\" button - that makes a synchronous call to SQL Server to insert your data.\n\nBack on your lab VM, you can run a SQL query inside the container using `docker exec`, to check your data is there:\n\n```\ndocker container exec sql-server powershell -Command `\n  \"Invoke-SqlCmd -Query 'SELECT * FROM Prospects' -Database ProductLaunch\"\n```\n\nThe SQL Server image is packaged with the SQL PowerShell module and this `SELECT` command will read out the data you just saved.\n\n## <a name=\"task3\"></a> Task 3: Breaking up the ASP.NET monolith\n\nYou're going to look at one feature improvement in this lab, addressing performance and scalability. In version 1 of the app the sign-up form makes a connection to the database and executes synchronous database queries. That approach doesn't scale. If there's a spike in traffic to the site you can run more web containers to spread the load, but that would make a bottleneck of SQL Server. You'd have to scale the database too, because the web tier is tightly coupled to the data tier.\n\nYou'll address that by making the sign up feature asynchronous. Instead of persisting to the database directly, the sign-up form will publish an event to a message queue, and a handler listening to that event makes the database call:\n\n![v2 architecture](images/v2-arch.png)\n\nThat decouples the web layer from the data layer so you can scale to meet demand just by adding more web containers. At times of high load the message queue will hold onto the events until the handler is ready to action them. There may be a delay between users clicking the button and their data being persisted, but the delay is happening offline - the user will see the thank-you page almost instantly, no matter how much traffic is hitting the site.\n\n## <a name=\"task3.1\"></a> Task 3.1: Breaking the save feature out of the web app\n\nIn the `v2-src` folder there's a new version of the solution which uses messaging to publish an event when a prospect signs up, rather than writing to the database directly. You have VS Code installed on your lab VM so you can go and check out the code.\n\nThe main change is in the [SignUp code-behind](v2-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.cs) for the webform. In version 1 this is where the save happened, but in version 2 that's been replaced with this code to publish an event message:\n\n```\nvar eventMessage = new ProspectSignedUpEvent\n{\n    Prospect = prospect,\n    SignedUpAt = DateTime.UtcNow\n};\n\nMessageQueue.Publish(eventMessage);\n```\n\nThe `ProspectSignedUpEvent` contains a `Prospect` object, populated from the webform input. The `MessageQueue` class is just a wrapper to abstract the type of message queue. In this lab you'll be using [NATS](https://nats.io), a high-performance, low-latency, cross-platform and open-source message server. \n\nNATS is available as an [official image](https://store.docker.com/images/nats) on Docker Store, which means it's a curated image that you can rely on for quality. Publishing a Message to NATS means multiple subscribers can listen for the event, and you start to bring [event-driven architecture](https://msdn.microsoft.com/en-us/library/dd129913.aspx) into the application - just for the one feature that needs it, without a full rewrite of the app.\n\nThere's another change to the web app to use environment variables for configuration settings, using the [Config](v2-src/ProductLaunch/ProductLaunch.Model/Config.cs) class rather than `web.config`. That means we can set the database connection string through the Docker platform and use the same image in every environment.\n\n## <a name=\"task3.2\"></a> Task 3.2: Implementing the save in a console app\n\nIn the version 2 solution there's also a message handler project. It's a .NET console app with all the code in the [Program](v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Program.cs) class. It connects to NATS using the same `MessageQueue` class, and listens for `ProspectSignedUpEvent` messages. For each message it receives, the handler extracts the prospect details from the message and saves them to the database:\n\n```\nvar prospect = eventMessage.Prospect;\nusing (var context = new ProductLaunchContext())\n{\n    //reload child objects:\n    prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n    prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n    context.Prospects.Add(prospect);\n    context.SaveChanges();\n}\n```\n\nThat's the exact same code that was in the web form in version 1. This is a common pattern that applies for any features which are resource-bound and need to scale well. You extract the functionality from the synchronous implementation, and publish a message instead. Then you move the extracted code to a message handler - this is a simple example, but if you have a complex function with multiple external dependencies, the practice is exactly the same.\n\nThe message handler will run in a Docker container too. The [Dockerfile](v2-src/docker/save-handler/Dockerfile) is very simple. .NET is already installed in the `microsoft/windowsservercore` base image, so the Dockerfile just configures the DNS cache, sets the default message queue URL in an environment variable and copies in the compiled console app. \n\n\n## <a name=\"task3.3\"></a> Task 3.3: Running the distributed solution with Docker Compose\n\nYou need to run the builder image to compile the solution, and then build new Docker images for the web application and the message handler. The [build.ps1](v2-src/build.ps1) script does that for you:\n\n```\ncd $labRoot\\v2-src\n.\\build.ps1 $dockerId\n```\n\nWhen that finishes, run `docker image ls -f \"reference=$dockerId/*\"`. You'll see you have lab images for the builder, message handler and a new version of the web app. The app is a distributed solution now, which will run across multiple containers.\n\nFor the app to work properly, the containers need to be started in the right order, with the right parameters and names. You could do that with a PowerShell script, but Docker Compose is a better option. The v2 source has a compose file which defines all the services the solution needs, together with their configuration and the dependencies between them.\n\nOpen the [docker-compose.yml](v2-src/docker-compose.yml) and replace `<DockerID>` in the image names with your Docker ID. Now you can install Docker Compose and use it to manage the app:\n\n```\nInvoke-WebRequest -UseBasicParsing -OutFile 'C:\\Program Files\\Docker\\docker-compose.exe' -Uri https://github.com/docker/compose/releases/download/1.11.2/docker-compose-Windows-x86_64.exe\n```\n\n> On Windows 10, you use [Docker for Windows](https://docs.docker.com/docker-for-windows/) to work with containers, and that installs Docker Compose for you. On Windows Server, Docker is installed from a NuGet package and you need to separately install Docker Compose.\n\nNow you can stop the containers from the v1 app, and start the new app using Docker Compose:\n\n```\ndocker container rm -f $(docker container ls -a -q)\n\ncd $labRoot\\v2-src\ndocker-compose up -d\n```\n\nYou'll see output from compose telling you four containers have been created; the web container is last of all because it has dependencies on the others.\n\nOn your laptop, browse to the VM again and you will see the same product launch website. Complete the form again - the behavior is identical to v1, but behind the scenes the web app now publishes an event to the message queue and the message handler writes your data asynchronously.\n\nYou can check the data is in SQL Server by running:\n\n```\ndocker container exec v2src_product-launch-db_1 powershell -Command `\n  \"Invoke-SqlCmd -Query 'SELECT * FROM Prospects' -Database ProductLaunch\"\n```\n\nAnd also look at the logs of the message handler to verify that it was the handler container which wrote the data:\n\n```\ndocker container logs v2src_save-prospect-handler_1\n```\n\nYou've made one of the app features asynchronous by pulling the functionality out of the website, and into a message handler, using the NATS message queue to plumb them together. Performance problems are a great candidate for taking into a modernization program. With asynchronous messaging you can add scalability and performance by targeting a specific feature.\n\n## Wrap Up\n\nThank you for taking the time to complete this lab! You now know how to build and run an ASP.NET app using Docker - without needing Visual Studio. You also saw how to take a feature-driven approach to app modernization, breaking code out of a monolith and using Docker to plumb components together. Lastly you used Docker Compose to define and run a distributed solution.\n\nDo try the other Windows labs at DockerCon, and make a note to check out the full lab suite when you get home - there are plenty more Windows walkthroughs at [docker/labs](https://github.com/docker/labs/tree/master/windows) on GitHub.\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Core/Env.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Core\n{\n    public class Env\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string DbConnectionString { get { return Get(\"DB_CONNECTION_STRING\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable);\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Core/ProductLaunch.Core.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{35BD1196-DDCB-41FA-98C5-C8116D749446}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Core</RootNamespace>\n    <AssemblyName>ProductLaunch.Core</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Env.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Core/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Core\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Core\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"35bd1196-ddcb-41fa-98c5-c8116d749446\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <section name=\"specFlow\" type=\"TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow\" />\n  </configSections>\n  <specFlow>\n    <unitTestProvider name=\"MsTest\" />\n  </specFlow>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/ProductLaunch.EndToEndTests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.EndToEndTests</RootNamespace>\n    <AssemblyName>ProductLaunch.EndToEndTests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"TechTalk.SpecFlow, Version=2.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SpecFlow.2.1.0\\lib\\net45\\TechTalk.SpecFlow.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.WebDriver.3.0.1\\lib\\net40\\WebDriver.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver.Support, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.Support.3.0.1\\lib\\net40\\WebDriver.Support.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\" />\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"ProspectSignUp.feature.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>ProspectSignUp.feature</DependentUpon>\n    </Compile>\n    <Compile Include=\"ProspectSignUpSteps.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"packages.config\" />\n    <None Include=\"ProspectSignUp.feature\">\n      <Generator>SpecFlowSingleFileGenerator</Generator>\n      <LastGenOutput>ProspectSignUp.feature.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets\" Condition=\"Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"d47cf813-de0e-4cc4-b9ed-8ee4b6f14869\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature",
    "content": "﻿Feature: Prospect Sign Up\n\tAs a prospect interested in the product launch\n\tI want to sign up for notifications\n\tSo that I can be updated with news\n\nScenario Outline: Sign Up with Valid Details\n\tGiven I browse to the Sign Up Page at \"localhost:57120\"\n\tAnd I enter details '<FirstName>' '<LastName>' '<EmailAddress>' '<CompanyName>' '<Country>' '<Role>'\n\tWhen I press Go\n\tThen I should see the Thank You page\n\nExamples:\n\t| FirstName | LastName | EmailAddress           | CompanyName   | Country        | Role           |\n\t| Prospect  | A        | a.prospect@company.com | Company, Inc. | United States  | Decision Maker |\n\t| Prospect  | B        | b.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | C        | c.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | D        | d.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | E        | e.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | F        | f.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | G        | g.prospect@company.com | Company, Inc. | United States  | Engineer       |\n\t| Prospect  | H        | h.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | I        | i.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | J        | j.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | K        | k.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | L        | l.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | M        | m.prospect@company.com | Company, Inc. | Sweden         | Architect      |\n\t| Prospect  | N        | n.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | O        | o.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | P        | p.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | Q        | q.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | R        | r.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | S        | s.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | T        | t.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | U        | u.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | V        | v.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | W        | w.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | X        | x.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | Y        | y.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | Z        | z.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature.cs",
    "content": "﻿// ------------------------------------------------------------------------------\n//  <auto-generated>\n//      This code was generated by SpecFlow (http://www.specflow.org/).\n//      SpecFlow Version:2.1.0.0\n//      SpecFlow Generator Version:2.0.0.0\n// \n//      Changes to this file may cause incorrect behavior and will be lost if\n//      the code is regenerated.\n//  </auto-generated>\n// ------------------------------------------------------------------------------\n#region Designer generated code\n#pragma warning disable\nnamespace ProductLaunch.EndToEndTests\n{\n    using TechTalk.SpecFlow;\n    \n    \n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"TechTalk.SpecFlow\", \"2.1.0.0\")]\n    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()]\n    public partial class ProspectSignUpFeature\n    {\n        \n        private static TechTalk.SpecFlow.ITestRunner testRunner;\n        \n#line 1 \"ProspectSignUp.feature\"\n#line hidden\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()]\n        public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext)\n        {\n            testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(null, 0);\n            TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo(\"en-US\"), \"Prospect Sign Up\", \"\\tAs a prospect interested in the product launch\\r\\n\\tI want to sign up for notificat\" +\n                    \"ions\\r\\n\\tSo that I can be updated with news\", ProgrammingLanguage.CSharp, ((string[])(null)));\n            testRunner.OnFeatureStart(featureInfo);\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()]\n        public static void FeatureTearDown()\n        {\n            testRunner.OnFeatureEnd();\n            testRunner = null;\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()]\n        public virtual void TestInitialize()\n        {\n            if (((testRunner.FeatureContext != null) \n                        && (testRunner.FeatureContext.FeatureInfo.Title != \"Prospect Sign Up\")))\n            {\n                ProductLaunch.EndToEndTests.ProspectSignUpFeature.FeatureSetup(null);\n            }\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()]\n        public virtual void ScenarioTearDown()\n        {\n            testRunner.OnScenarioEnd();\n        }\n        \n        public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)\n        {\n            testRunner.OnScenarioStart(scenarioInfo);\n        }\n        \n        public virtual void ScenarioCleanup()\n        {\n            testRunner.CollectScenarioErrors();\n        }\n        \n        public virtual void SignUpWithValidDetails(string firstName, string lastName, string emailAddress, string companyName, string country, string role, string[] exampleTags)\n        {\n            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo(\"Sign Up with Valid Details\", exampleTags);\n#line 6\nthis.ScenarioSetup(scenarioInfo);\n#line 7\n testRunner.Given(\"I browse to the Sign Up Page at \\\"localhost:57120\\\"\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Given \");\n#line 8\n testRunner.And(string.Format(\"I enter details \\'{0}\\' \\'{1}\\' \\'{2}\\' \\'{3}\\' \\'{4}\\' \\'{5}\\'\", firstName, lastName, emailAddress, companyName, country, role), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"And \");\n#line 9\n testRunner.When(\"I press Go\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"When \");\n#line 10\n testRunner.Then(\"I should see the Thank You page\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Then \");\n#line hidden\n            this.ScenarioCleanup();\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"A\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"a.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant0()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"A\", \"a.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"B\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"b.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant1()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"B\", \"b.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"C\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"c.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant2()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"C\", \"c.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"D\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"d.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant3()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"D\", \"d.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"E\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"e.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant4()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"E\", \"e.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"F\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"f.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant5()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"F\", \"f.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"G\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"g.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Engineer\")]\n        public virtual void SignUpWithValidDetails_Variant6()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"G\", \"g.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Engineer\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"H\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"h.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant7()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"H\", \"h.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"I\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"i.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant8()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"I\", \"i.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"J\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"j.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant9()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"J\", \"j.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"K\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"k.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant10()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"K\", \"k.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"L\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"l.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant11()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"L\", \"l.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"M\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"m.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant12()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"M\", \"m.prospect@company.com\", \"Company, Inc.\", \"Sweden\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"N\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"n.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant13()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"N\", \"n.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"O\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"o.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant14()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"O\", \"o.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"P\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"p.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant15()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"P\", \"p.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Q\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"q.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant16()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Q\", \"q.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"R\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"r.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant17()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"R\", \"r.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"S\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"s.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant18()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"S\", \"s.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"T\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"t.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant19()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"T\", \"t.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"U\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"u.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant20()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"U\", \"u.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"V\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"v.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant21()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"V\", \"v.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"W\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"w.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant22()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"W\", \"w.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"X\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"x.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant23()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"X\", \"x.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Y\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"y.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant24()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Y\", \"y.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Z\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"z.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant25()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Z\", \"z.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n    }\n}\n#pragma warning restore\n#endregion\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUpSteps.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Firefox;\nusing OpenQA.Selenium.Support.UI;\nusing System;\nusing System.Threading;\nusing TechTalk.SpecFlow;\n\nnamespace ProductLaunch.EndToEndTests\n{\n    [Binding]\n    public class ProspectSignUpSteps\n    {\n        private static IWebDriver _Driver;\n\n        [BeforeFeature]\n        public static void Setup()\n        {\n            _Driver = new FirefoxDriver();\n        }\n\n        [AfterFeature]\n        public static void TearDown()\n        {\n            _Driver.Close();\n            _Driver.Dispose();\n        }\n\n        [Given(@\"I browse to the Sign Up Page at \"\"(.*)\"\"\")]\n        public void GivenIBrowseToTheSignUpPageAt(string host)\n        {\n            var url = $\"http://{host}/SignUp\";            \n            _Driver.Navigate().GoToUrl(url);\n        }\n        \n        [Given(@\"I enter details '(.*)' '(.*)' '(.*)' '(.*)' '(.*)' '(.*)'\")]\n        public void GivenIEnterDetails(string firstName, string lastName, string emailAddress, \n                                       string companyName, string country, string role)\n        {            \n            _Driver.FindElement(By.Id(\"MainContent_txtFirstName\")).SendKeys(firstName);\n            _Driver.FindElement(By.Id(\"MainContent_txtLastName\")).SendKeys(lastName);\n            _Driver.FindElement(By.Id(\"MainContent_txtEmail\")).SendKeys(emailAddress);\n            _Driver.FindElement(By.Id(\"MainContent_txtCompanyName\")).SendKeys(companyName);\n\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlCountry\"))).SelectByText(country);\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlRole\"))).SelectByText(role);\n        }\n\n        [When(@\"I press Go\")]\n        public void WhenIPressGo()\n        {\n            var goButton = _Driver.FindElement(By.Id(\"MainContent_btnGo\"));\n            goButton.Click();\n        }\n        \n        [Then(@\"I should see the Thank You page\")]\n        public void ThenIShouldSeeTheThankYouPage()\n        {\n            //HACK\n            Thread.Sleep(1500);\n            Assert.AreEqual(\"Ta\", _Driver.Title);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Selenium.Firefox.WebDriver\" version=\"0.13.0\" targetFramework=\"net452\" />\n  <package id=\"Selenium.Support\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"Selenium.WebDriver\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"SpecFlow\" version=\"2.1.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Entities/Country.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Country\n    {\n        public string CountryCode { get; set; }\n\n        public string CountryName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Entities/ProductLaunch.Entities.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Entities</RootNamespace>\n    <AssemblyName>ProductLaunch.Entities</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Country.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Prospect.cs\" />\n    <Compile Include=\"Role.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Entities/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Entities\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Entities\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Entities/Prospect.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Prospect\n    {\n        public int ProspectId { get; set; }\n        \n        public string FirstName { get; set; }\n        \n        public string LastName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public Role Role { get; set; }\n\n        public Country Country { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Entities/Role.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Role\n    {\n        public string RoleCode { get; set; }\n\n        public string RoleName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string ElasticsearchUrl { get { return Get(\"ELASTICSEARCH_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Documents/Prospect.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Documents\n{\n    public class Prospect\n    {\n        public string FullName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public string RoleName { get; set; }\n\n        public string CountryName { get; set; }\n\n        public DateTime SignUpDate { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Indexer/Index.cs",
    "content": "using Nest;\nusing ProductLaunch.MessageHandlers.IndexProspect.Documents;\nusing System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Indexer\n{\n    public class Index\n    {\n        public static void Setup()\n        {\n            var node = new Uri(Config.ElasticsearchUrl);\n            var settings = new ConnectionSettings(node);\n            var client = new ElasticClient(settings);\n            client.CreateIndex(\"prospects\");\n        }        \n\n        public static void CreateDocument(Prospect prospect)\n        {\n            try\n            {\n                var node = new Uri(Config.ElasticsearchUrl);\n                var client = new ElasticClient(node);                \n                client.Index(prospect, idx => idx.Index(\"prospects\"));\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine($\"Index prospect FAILED, email address: {prospect.EmailAddress}, ex: {ex}\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/ProductLaunch.MessageHandlers.IndexProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1354B5AB-C990-41EA-9F68-5F9933D83700}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.IndexProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.IndexProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Elasticsearch.Net, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Elasticsearch.Net.5.0.1\\lib\\net45\\Elasticsearch.Net.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Nest, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NEST.5.0.1\\lib\\net45\\Nest.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.9.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Documents\\Prospect.cs\" />\n    <Compile Include=\"Indexer\\Index.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.MessageHandlers.IndexProspect.Indexer;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing System;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Initializing Elasticsearch. url: {Config.ElasticsearchUrl}\");\n            Index.Setup();\n\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += IndexProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void IndexProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Indexing prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = new Documents.Prospect\n            {\n                CompanyName = eventMessage.Prospect.CompanyName,\n                CountryName = eventMessage.Prospect.Country.CountryName,\n                EmailAddress = eventMessage.Prospect.EmailAddress,\n                FullName = $\"{eventMessage.Prospect.FirstName} {eventMessage.Prospect.LastName}\",\n                RoleName = eventMessage.Prospect.Role.RoleName,\n                SignUpDate = eventMessage.SignedUpAt\n            };\n            Index.CreateDocument(prospect);\n\n            Console.WriteLine($\"Prospect indexed; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1354b5ab-c990-41ea-9f68-5f9933d83700\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Elasticsearch.Net\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"NEST\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"9.0.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>  \n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n  </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/ProductLaunch.MessageHandlers.SaveProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{65089C80-27F1-4744-979B-4C5A33B0CFF6}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.SaveProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.SaveProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing ProductLaunch.Model;\nusing System;\nusing System.Linq;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.SaveProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += SaveProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void SaveProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Saving new prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = eventMessage.Prospect;\n            using (var context = new ProductLaunchContext())\n            {\n                //reload child objects:\n                prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n                prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n\n            Console.WriteLine($\"Prospect saved. Prospect ID: {eventMessage.Prospect.ProspectId}; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"65089c80-27f1-4744-979b-4c5a33b0cff6\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Messaging/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Messaging\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string MessageQueueUrl { get { return Get(\"MESSAGE_QUEUE_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Messaging/MessageHelper.cs",
    "content": "﻿using Newtonsoft.Json;\nusing ProductLaunch.Messaging.Messages;\nusing System.Text;\n\nnamespace ProductLaunch.Messaging\n{\n    public class MessageHelper\n    {\n        public static byte[] ToData<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            var json = JsonConvert.SerializeObject(message);\n            return Encoding.Unicode.GetBytes(json);\n        }\n\n        public static TMessage FromData<TMessage>(byte[] data)\n            where TMessage : Message\n        {\n            var json = Encoding.Unicode.GetString(data);\n            return (TMessage)JsonConvert.DeserializeObject<TMessage>(json);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Messaging/MessageQueue.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging.Messages;\n\nnamespace ProductLaunch.Messaging\n{\n    public static class MessageQueue\n    {\n\n        public static void Publish<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            using (var connection = CreateConnection())\n            {\n                var data = MessageHelper.ToData(message);\n                connection.Publish(message.Subject, data);\n            }\n        }\n\n        public static IConnection CreateConnection()\n        {\n            return new ConnectionFactory().CreateConnection(Config.MessageQueueUrl);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Messaging/Messages/Events/ProspectSignedUpEvent.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System;\n\nnamespace ProductLaunch.Messaging.Messages.Events\n{\n    public class ProspectSignedUpEvent : Message\n    {\n        public override string Subject { get { return MessageSubject; } }\n\n        public DateTime SignedUpAt { get; set; }\n\n        public Prospect Prospect { get; set; }\n\n        public static string MessageSubject = \"events.prospect.signedup\";\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Messaging/Messages/Message.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.Messaging.Messages\n{\n    public abstract class Message\n    {\n        public string CorrelationId { get; set; }  \n        \n        public abstract string Subject { get; }      \n\n        public Message()\n        {\n            CorrelationId = Guid.NewGuid().ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Messaging/ProductLaunch.Messaging.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Messaging</RootNamespace>\n    <AssemblyName>ProductLaunch.Messaging</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"MessageHelper.cs\" />\n    <Compile Include=\"MessageQueue.cs\" />\n    <Compile Include=\"Messages\\Events\\ProspectSignedUpEvent.cs\" />\n    <Compile Include=\"Messages\\Message.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup />\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Messaging/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"e02eff91-8c52-4dce-8279-3fd1ee0659ef\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Messaging/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  </configSections>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"Data Source=(localdb)\\v13.0; Integrated Security=True; MultipleActiveResultSets=True\" />\n      </parameters>\n    </defaultConnectionFactory>\n  </entityFramework>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model/Initializers/StaticDataInitializer.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model.Initializers\n{\n    public class StaticDataInitializer : CreateDatabaseIfNotExists<ProductLaunchContext>\n    {\n        protected override void Seed(ProductLaunchContext context)\n        {\n            AddRole(context, \"DA\", \"Developer Advocate\");\n            AddRole(context, \"DM\", \"Decision Maker\");\n            AddRole(context, \"AC\", \"Architect\");\n            AddRole(context, \"EN\", \"Engineer\");\n            AddRole(context, \"OP\", \"IT Ops\");\n\n            AddCountry(context, \"GBR\", \"United Kingdom\");\n            AddCountry(context, \"USA\", \"United States\");\n            AddCountry(context, \"SWE\", \"Sweden\");\n\n            context.SaveChanges();\n        }\n\n        private void AddCountry(ProductLaunchContext context, string code, string name)\n        {\n            context.Countries.Add(new Country\n            {\n                CountryCode = code,\n                CountryName = name\n            });\n        }\n\n        private void AddRole(ProductLaunchContext context, string code, string name)\n        {\n            context.Roles.Add(new Role\n            {\n                RoleCode = code,\n                RoleName = name\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model/ProductLaunch.Model.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model</RootNamespace>\n    <AssemblyName>ProductLaunch.Model</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Initializers\\StaticDataInitializer.cs\" />\n    <Compile Include=\"ProductLaunchContext.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model/ProductLaunchContext.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model\n{\n    public class ProductLaunchContext : DbContext\n    {\n        public ProductLaunchContext() : base(\"ProductLaunchDb\") { }\n\n        public DbSet<Country> Countries { get; set; }\n\n        public DbSet<Role> Roles { get; set; }\n\n        public DbSet<Prospect> Prospects { get; set; }\n\n        protected override void OnModelCreating(DbModelBuilder builder)\n        {\n            builder.Entity<Country>().HasKey(c => c.CountryCode);\n            builder.Entity<Role>().HasKey(r => r.RoleCode);\n            builder.Entity<Prospect>().HasOptional<Country>(p => p.Country);\n            builder.Entity<Prospect>().HasOptional<Role>(p => p.Role);            \n        }        \n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"3afc4a48-5db6-48ff-a459-20ec21a2eb28\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" providerName=\"System.Data.SqlClient\" connectionString=\"Server=172.20.244.163;Database=ProductLaunch;User Id=sa;Password=NDC_l0nd0n;\"/>\n  </connectionStrings>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunch.Model.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{49FD06C3-CD52-425A-866D-831D09268CD0}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model.Tests</RootNamespace>\n    <AssemblyName>ProductLaunch.Model.Tests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Data.Entity\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"ProductLaunchContextTest.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunchContextTest.cs",
    "content": "﻿using System;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing ProductLaunch.Entities;\n\nnamespace ProductLaunch.Model.Tests\n{\n    [TestClass]\n    public class ProductLaunchContextTest\n    {\n        [TestMethod]\n        public void Insert()\n        {\n            using (var context = new ProductLaunchContext())\n            {\n                var country = new Country\n                {\n                    CountryCode = \"GBR\",\n                    CountryName = \"United Kingdom\"\n                };\n                context.Countries.Add(country);\n\n                var role = new Role\n                {\n                    RoleCode = \"DM\",\n                    RoleName = \"Decision Maker\"\n                };\n                context.Roles.Add(role);\n\n                var prospect = new Prospect\n                {\n                    FirstName = \"A\",\n                    LastName = \"Prospect\",\n                    CompanyName = \"Docker, Inc.\",\n                    EmailAddress = \"a.prospect@docker.com\",\n                    Country = country,\n                    Role = role\n                };\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model.Tests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"49fd06c3-cd52-425a-866d-831d09268cd0\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Model.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/About.aspx",
    "content": "﻿<%@ Page Title=\"About\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"About.aspx.cs\" Inherits=\"ProductLaunch.Web.About\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your application description page.</h3>\n    <p>Use this area to provide additional information.</p>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/About.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class About : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/About.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class About\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/App_Start/BundleConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public class BundleConfig\n    {\n        // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkID=303951\n        public static void RegisterBundles(BundleCollection bundles)\n        {\n            bundles.Add(new ScriptBundle(\"~/bundles/WebFormsJs\").Include(\n                            \"~/Scripts/WebForms/WebForms.js\",\n                            \"~/Scripts/WebForms/WebUIValidation.js\",\n                            \"~/Scripts/WebForms/MenuStandards.js\",\n                            \"~/Scripts/WebForms/Focus.js\",\n                            \"~/Scripts/WebForms/GridView.js\",\n                            \"~/Scripts/WebForms/DetailsView.js\",\n                            \"~/Scripts/WebForms/TreeView.js\",\n                            \"~/Scripts/WebForms/WebParts.js\"));\n\n            // Order is very important for these files to work, they have explicit dependencies\n            bundles.Add(new ScriptBundle(\"~/bundles/MsAjaxJs\").Include(\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjax.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxApplicationServices.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxTimer.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxWebForms.js\"));\n\n            // Use the Development version of Modernizr to develop with and learn from. Then, when you’re\n            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need\n            bundles.Add(new ScriptBundle(\"~/bundles/modernizr\").Include(\n                            \"~/Scripts/modernizr-*\"));\n\n            ScriptManager.ScriptResourceMapping.AddDefinition(\n                \"respond\",\n                new ScriptResourceDefinition\n                {\n                    Path = \"~/Scripts/respond.min.js\",\n                    DebugPath = \"~/Scripts/respond.js\",\n                });\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/App_Start/RouteConfig.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Web;\nusing System.Web.Routing;\nusing Microsoft.AspNet.FriendlyUrls;\n\nnamespace ProductLaunch.Web\n{\n    public static class RouteConfig\n    {\n        public static void RegisterRoutes(RouteCollection routes)\n        {\n            var settings = new FriendlyUrlSettings();\n            settings.AutoRedirectMode = RedirectMode.Permanent;\n            routes.EnableFriendlyUrls(settings);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/ApplicationInsights.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ApplicationInsights xmlns=\"http://schemas.microsoft.com/ApplicationInsights/2013/Settings\">\n</ApplicationInsights>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Bundle.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<bundles version=\"1.0\">\n  <styleBundle path=\"~/Content/css\">\n    <include path=\"~/Content/bootstrap.css\" />\n    <include path=\"~/Content/Site.css\" />\n  </styleBundle>\n</bundles>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Web\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string HomePageUrl { get { return Get(\"HOMEPAGE_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Contact.aspx",
    "content": "﻿<%@ Page Title=\"Contact\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Contact.aspx.cs\" Inherits=\"ProductLaunch.Web.Contact\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your contact page.</h3>\n    <address>\n        One Microsoft Way<br />\n        Redmond, WA 98052-6399<br />\n        <abbr title=\"Phone\">P:</abbr>\n        425.555.0100\n    </address>\n\n    <address>\n        <strong>Support:</strong>   <a href=\"mailto:Support@example.com\">Support@example.com</a><br />\n        <strong>Marketing:</strong> <a href=\"mailto:Marketing@example.com\">Marketing@example.com</a>\n    </address>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Contact : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class Contact\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Content/Site.css",
    "content": "﻿/* Move down content because we have a fixed navbar that is 50px tall */\nbody {\n    padding-top: 50px;\n    padding-bottom: 20px;\n}\n\n/* Wrapping element */\n/* Set some basic padding to keep content from hitting the edges */\n.body-content {\n    padding-left: 15px;\n    padding-right: 15px;\n}\n\n/* Set widths on the form inputs since otherwise they're 100% wide */\ninput,\nselect,\ntextarea {\n    max-width: 280px;\n}\n\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n    .jumbotron {\n        margin-top: 20px;\n    }\n\n    .body-content {\n        padding: 0;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Content/bootstrap.css",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. The notices and licenses below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden] {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput,\nselect[multiple],\ntextarea {\n  background-image: none;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16.099999999999998px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\nh1 small,\n.h1 small {\n  font-size: 24px;\n}\n\nh2 small,\n.h2 small {\n  font-size: 18px;\n}\n\nh3 small,\n.h3 small,\nh4 small,\n.h4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\npre {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table thead > tr > th,\n.table tbody > tr > th,\n.table tfoot > tr > th,\n.table thead > tr > td,\n.table tbody > tr > td,\n.table tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table caption + thead tr:first-child th,\n.table colgroup + thead tr:first-child th,\n.table thead:first-child tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed thead > tr > th,\n.table-condensed tbody > tr > th,\n.table-condensed tfoot > tr > th,\n.table-condensed thead > tr > td,\n.table-condensed tbody > tr > td,\n.table-condensed tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td {\n  background-color: #d0e9c6;\n  border-color: #c9e2b3;\n}\n\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td {\n  background-color: #ebcccc;\n  border-color: #e6c1c7;\n}\n\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td {\n  background-color: #faf2cc;\n  border-color: #f8e5be;\n}\n\n@media (max-width: 768px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n    background-color: #fff;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > thead > tr:last-child > td,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  padding-top: 7px;\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\1f4bc\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\1f4c5\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\1f4cc\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\1f4ce\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\1f4f7\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\1f512\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\1f514\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\1f516\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\1f525\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\1f527\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #333333;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs.nav-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 5px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n\n.nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  z-index: 1000;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  z-index: 1030;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e6e6e6;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #428bca;\n}\n\n.thumbnail > img {\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.alert-warning hr {\n  border-top-color: #f8e5be;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger hr {\n  border-top-color: #e6c1c7;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #fbeed5;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #fbeed5;\n}\n\n.panel-danger {\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #eed3d7;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #eed3d7;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\nbody.modal-open,\n.modal-open .navbar-fixed-top,\n.modal-open .navbar-fixed-bottom {\n  margin-right: 15px;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    right: auto;\n    left: 50%;\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n@media screen and (max-width: 400px) {\n  @-ms-viewport {\n    width: 320px;\n  }\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.visible-xs {\n  display: none !important;\n}\n\ntr.visible-xs {\n  display: none !important;\n}\n\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm {\n  display: none !important;\n}\n\ntr.visible-sm {\n  display: none !important;\n}\n\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md {\n  display: none !important;\n}\n\ntr.visible-md {\n  display: none !important;\n}\n\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg {\n  display: none !important;\n}\n\ntr.visible-lg {\n  display: none !important;\n}\n\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-md {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-md {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n  tr.hidden-md {\n    display: none !important;\n  }\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-md {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print {\n  display: none !important;\n}\n\ntr.visible-print {\n  display: none !important;\n}\n\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n  tr.hidden-print {\n    display: none !important;\n  }\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Default.aspx",
    "content": "﻿<%@ Page Title=\"Home Page\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Default.aspx.cs\" Inherits=\"ProductLaunch.Web._Default\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>We&#39;re launching a new product!</h1>\n        <p class=\"lead\">Our new product is going to be very, very good.</p>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-8\">\n            <h2>What&#39;s this all about?</h2>\n            <p>\n                Lorem ipsum dolor sit amet lectus. In magna in praesent nibh lorem. Egestas ipsum luctus feugiat sit enim. Libero nec a. Praesent vestibulum quis enim.</p>\n            <p>\n                Morbi fusce placerat et pellentesque qui curabitur dictum nam. Adipiscing pede semper. Tellus at sem. Arcu nibh et. Magna luctus nibh. Eu erat aenean adipiscing vitae pretium. Pede nec laoreet. Adipiscing mauris lorem tortor nec massa distinctio pede justo. Gravida non purus nunc sit consequat imperdiet sodales nullam dolor vel.</p>\n            <p>\n                <a class=\"btn btn-default\" href=\"https://www.docker.com/enterprise\">Check Out Our Other Products &raquo;</a>\n            </p>\n        </div>\n        <div class=\"col-md-4\">\n            <h2>Interested?</h2>\n            <p>\n                Give us your details and we&#39;ll keep you posted.</p>\n            <p>\n                It only takes 30 seconds to sign up.\n            </p>\n            <p>\n                And we probably won't spam you very much.\n            </p>\n            <p>\n                <a class=\"btn btn btn-primary btn-lg\" href=\"SignUp.aspx\">Sign Up &raquo;</a>\n            </p>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Default.aspx.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Net;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public partial class _Default : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n        }        \n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Default.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class _Default\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"ProductLaunch.Web.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Global.asax.cs",
    "content": "﻿using ProductLaunch.Model;\nusing ProductLaunch.Model.Initializers;\nusing System;\nusing System.Data.Entity;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.Routing;\n\nnamespace ProductLaunch.Web\n{\n    public class Global : HttpApplication\n    {\n        void Application_Start(object sender, EventArgs e)\n        {\n            // Code that runs on application startup\n            RouteConfig.RegisterRoutes(RouteTable.Routes);\n            BundleConfig.RegisterBundles(BundleTable.Bundles);\n\n            Database.SetInitializer<ProductLaunchContext>(new StaticDataInitializer());\n            SignUp.PreloadStaticDataCache();\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/ProductLaunch.Web.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Web</RootNamespace>\n    <AssemblyName>ProductLaunch.Web</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <UseIISExpress>false</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.Web.Infrastructure.1.0.0.0\\lib\\net40\\Microsoft.Web.Infrastructure.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.bootstrap\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.bootstrap.3.0.0\\lib\\net45\\AspNet.ScriptManager.bootstrap.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.jQuery\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.jQuery.1.10.2\\lib\\net45\\AspNet.ScriptManager.jQuery.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.MSAjax\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.MSAjax.5.0.0\\lib\\net45\\Microsoft.ScriptManager.MSAjax.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.WebForms\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.WebForms.5.0.0\\lib\\net45\\Microsoft.ScriptManager.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.1.1.3\\lib\\net40\\System.Web.Optimization.dll</HintPath>\n    </Reference>\n    <Reference Include=\"WebGrease\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\WebGrease.1.5.2\\lib\\WebGrease.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Antlr3.Runtime\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Antlr.3.4.1.9004\\lib\\Antlr3.Runtime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.Web.Optimization.WebForms\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.WebForms.1.1.3\\lib\\net45\\Microsoft.AspNet.Web.Optimization.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.FriendlyUrls\">\n      <HintPath>..\\packages\\Microsoft.AspNet.FriendlyUrls.Core.1.0.2\\lib\\net45\\Microsoft.AspNet.FriendlyUrls.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"App_Data\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"About.aspx\" />\n    <Content Include=\"Contact.aspx\" />\n    <Content Include=\"Content\\bootstrap.css\" />\n    <Content Include=\"Content\\bootstrap.min.css\" />\n    <Content Include=\"Content\\Site.css\" />\n    <Content Include=\"SignUp.aspx\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.svg\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.woff\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.ttf\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.eot\" />\n    <Content Include=\"ApplicationInsights.config\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <None Include=\"Scripts\\jquery-1.10.2.intellisense.js\" />\n    <Content Include=\"Scripts\\bootstrap.js\" />\n    <Content Include=\"Scripts\\bootstrap.min.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.js\" />\n    <Content Include=\"Scripts\\modernizr-2.6.2.js\" />\n    <Content Include=\"Scripts\\respond.js\" />\n    <Content Include=\"Scripts\\respond.min.js\" />\n    <Content Include=\"Scripts\\WebForms\\DetailsView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Focus.js\" />\n    <Content Include=\"Scripts\\WebForms\\GridView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Menu.js\" />\n    <Content Include=\"Scripts\\WebForms\\MenuStandards.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjax.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxApplicationServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxComponentModel.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxCore.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxGlobalization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxHistory.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxNetwork.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxSerialization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxTimer.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\SmartNav.js\" />\n    <Content Include=\"Scripts\\WebForms\\TreeView.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebParts.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebUIValidation.js\" />\n    <Content Include=\"Scripts\\_references.js\" />\n    <Content Include=\"Default.aspx\" />\n    <Content Include=\"favicon.ico\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Site.Master\" />\n    <Content Include=\"ThankYou.aspx\" />\n    <Content Include=\"ViewSwitcher.ascx\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <Content Include=\"Bundle.config\" />\n    <Content Include=\"packages.config\" />\n    <None Include=\"Project_Readme.html\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.map\" />\n    <Content Include=\"Site.Mobile.Master\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\BundleConfig.cs\" />\n    <Compile Include=\"About.aspx.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"About.aspx.designer.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"App_Start\\RouteConfig.cs\" />\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Contact.aspx.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Contact.aspx.designer.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.designer.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Default.aspx.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Default.aspx.designer.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Site.Master.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Master.designer.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.designer.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.designer.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.designer.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>57120</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost/ProductLaunch.Web</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Project_Readme.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Your ASP.NET application</title>\n    <style>\n        body {\n            background: #fff;\n            color: #505050;\n            font: 14px 'Segoe UI', tahoma, arial, helvetica, sans-serif;\n            margin: 20px;\n            padding: 0;\n        }\n\n        #header {\n            background: #efefef;\n            padding: 0;\n        }\n\n        h1 {\n            font-size: 48px;\n            font-weight: normal;\n            margin: 0;\n            padding: 0 30px;\n            line-height: 150px;\n        }\n\n        p {\n            font-size: 20px;\n            color: #fff;\n            background: #969696;\n            padding: 0 30px;\n            line-height: 50px;\n        }\n\n        #main {\n            padding: 5px 30px;\n        }\n\n        .section {\n            width: 21.7%;\n            float: left;\n            margin: 0 0 0 4%;\n        }\n\n            .section h2 {\n                font-size: 13px;\n                text-transform: uppercase;\n                margin: 0;\n                border-bottom: 1px solid silver;\n                padding-bottom: 12px;\n                margin-bottom: 8px;\n            }\n\n            .section.first {\n                margin-left: 0;\n            }\n\n                .section.first h2 {\n                    font-size: 24px;\n                    text-transform: none;\n                    margin-bottom: 25px;\n                    border: none;\n                }\n\n                .section.first li {\n                    border-top: 1px solid silver;\n                    padding: 8px 0;\n                }\n\n            .section.last {\n                margin-right: 0;\n            }\n\n        ul {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n            line-height: 20px;\n        }\n\n        li {\n            padding: 4px 0;\n        }\n\n        a {\n            color: #267cb2;\n            text-decoration: none;\n        }\n\n            a:hover {\n                text-decoration: underline;\n            }\n    </style>\n</head>\n<body>\n\n    <div id=\"header\">\n        <h1>Your ASP.NET application</h1>\n        <p>Congratulations! You've created a project</p>\n    </div>\n\n    <div id=\"main\">\n        <div class=\"section first\">\n            <h2>This application consists of:</h2>\n            <ul>\n                <li>Sample pages showing basic nav between Home, About, and Contact.</li>\n                <li>Theming using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615519\">Bootstrap</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615520\">Authentication</a>, if selected, shows how to register and sign in</li>\n                <li>ASP.NET features managed using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615521\">NuGet</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Customize app</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615522\">Get started with ASP.NET Web Forms</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615523\">Change the site's theme</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615524\">Add more libraries using NuGet</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615525\">Configure authentication</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615526\">Customize information about the website users</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615527\">Get information from social providers</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615528\">Add HTTP services using ASP.NET Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615529\">Secure the Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615530\">Add real-time web with ASP.NET SignalR</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615531\">Add components using Scaffolding</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615532\">Test app with Browser Link</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615533\">Share your project</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Deploy</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615534\">Ensure your app is ready for production</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615535\">Microsoft Azure</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615536\">Hosting providers</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section last\">\n            <h2>Get help</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615537\">Get help</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615538\">Get more templates</a></li>\n            </ul>\n        </div>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Web\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Web\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"17a57cf4-a6c1-47c1-aa38-650db6d87f8f\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/DetailsView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/DetailsView.js\nfunction DetailsView() {\n    this.pageIndex = null;\n    this.dataKeys = null;\n    this.createPropertyString = DetailsView_createPropertyString;\n    this.setStateField = DetailsView_setStateValue;\n    this.getHiddenFieldContents = DetailsView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction DetailsView_createPropertyString() {\n    return createPropertyStringFromValues_DetailsView(this.pageIndex, this.dataKeys);\n}\nfunction DetailsView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction DetailsView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[2];\n    for (var i = 3; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_DetailsView(valsArray[0], valsArray[1]);\n}\nfunction DetailsView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_DetailsView(pageIndex, dataKeys) {\n    var value = new Array(pageIndex, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Focus.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_FindFirstFocusableChild(control) {\n    if (!control || !(control.tagName)) {\n        return null;\n    }\n    var tagName = control.tagName.toLowerCase();\n    if (tagName == \"undefined\") {\n        return null;\n    }\n    var children = control.childNodes;\n    if (children) {\n        for (var i = 0; i < children.length; i++) {\n            try {\n                if (WebForm_CanFocus(children[i])) {\n                    return children[i];\n                }\n                else {\n                    var focused = WebForm_FindFirstFocusableChild(children[i]);\n                    if (WebForm_CanFocus(focused)) {\n                        return focused;\n                    }\n                }\n            } catch (e) {\n            }\n        }\n    }\n    return null;\n}\nfunction WebForm_AutoFocus(focusId) {\n    var targetControl;\n    if (__nonMSDOMBrowser) {\n        targetControl = document.getElementById(focusId);\n    }\n    else {\n        targetControl = document.all[focusId];\n    }\n    var focused = targetControl;\n    if (targetControl && (!WebForm_CanFocus(targetControl)) ) {\n        focused = WebForm_FindFirstFocusableChild(targetControl);\n    }\n    if (focused) {\n        try {\n            focused.focus();\n            if (__nonMSDOMBrowser) {\n                focused.scrollIntoView(false);\n            }\n            if (window.__smartNav) {\n                window.__smartNav.ae = focused.id;\n            }\n        }\n        catch (e) {\n        }\n    }\n}\nfunction WebForm_CanFocus(element) {\n    if (!element || !(element.tagName)) return false;\n    var tagName = element.tagName.toLowerCase();\n    return (!(element.disabled) &&\n            (!(element.type) || element.type.toLowerCase() != \"hidden\") &&\n            WebForm_IsFocusableTag(tagName) &&\n            WebForm_IsInVisibleContainer(element)\n            );\n}\nfunction WebForm_IsFocusableTag(tagName) {\n    return (tagName == \"input\" ||\n            tagName == \"textarea\" ||\n            tagName == \"select\" ||\n            tagName == \"button\" ||\n            tagName == \"a\");\n}\nfunction WebForm_IsInVisibleContainer(ctrl) {\n    var current = ctrl;\n    while((typeof(current) != \"undefined\") && (current != null)) {\n        if (current.disabled ||\n            ( typeof(current.style) != \"undefined\" &&\n            ( ( typeof(current.style.display) != \"undefined\" &&\n                current.style.display == \"none\") ||\n                ( typeof(current.style.visibility) != \"undefined\" &&\n                current.style.visibility == \"hidden\") ) ) ) {\n            return false;\n        }\n        if (typeof(current.parentNode) != \"undefined\" &&\n                current.parentNode != null &&\n                current.parentNode != current &&\n                current.parentNode.tagName.toLowerCase() != \"body\") {\n            current = current.parentNode;\n        }\n        else {\n            return true;\n        }\n    }\n    return true;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/GridView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/GridView.js\nfunction GridView() {\n    this.pageIndex = null;\n    this.sortExpression = null;\n    this.sortDirection = null;\n    this.dataKeys = null;\n    this.createPropertyString = GridView_createPropertyString;\n    this.setStateField = GridView_setStateValue;\n    this.getHiddenFieldContents = GridView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction GridView_createPropertyString() {\n    return createPropertyStringFromValues_GridView(this.pageIndex, this.sortDirection, this.sortExpression, this.dataKeys);\n}\nfunction GridView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction GridView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[4];\n    for (var i = 5; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_GridView(valsArray[0], valsArray[1], valsArray[2], valsArray[3]);\n}\nfunction GridView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_GridView(pageIndex, sortDirection, sortExpression, dataKeys) {\n    var value = new Array(pageIndex, sortDirection, sortExpression, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjax.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjax.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjax.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript._scripts={\"MicrosoftAjaxCore.js\":true,\"MicrosoftAjaxGlobalization.js\":true,\"MicrosoftAjaxSerialization.js\":true,\"MicrosoftAjaxComponentModel.js\":true,\"MicrosoftAjaxHistory.js\":true,\"MicrosoftAjaxNetwork.js\":true,\"MicrosoftAjaxWebServices.js\":true};Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};Type.registerNamespace(\"Sys.UI\");Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxApplicationServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxApplicationServices.js\nType._registerScript(\"MicrosoftAjaxApplicationServices.js\",[\"MicrosoftAjaxWebServices.js\"]);Type.registerNamespace(\"Sys.Services\");Sys.Services._ProfileService=function(){Sys.Services._ProfileService.initializeBase(this);this.properties={}};Sys.Services._ProfileService.DefaultWebServicePath=\"\";Sys.Services._ProfileService.prototype={_defaultLoadCompletedCallback:null,_defaultSaveCompletedCallback:null,_path:\"\",_timeout:0,get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_defaultSaveCompletedCallback:function(){return this._defaultSaveCompletedCallback},set_defaultSaveCompletedCallback:function(a){this._defaultSaveCompletedCallback=a},get_path:function(){return this._path||\"\"},load:function(c,d,e,f){var b,a;if(!c){a=\"GetAllPropertiesForCurrentUser\";b={authenticatedUserOnly:false}}else{a=\"GetPropertiesForCurrentUser\";b={properties:this._clonePropertyNames(c),authenticatedUserOnly:false}}this._invoke(this._get_path(),a,false,b,Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[d,e,f])},save:function(d,b,c,e){var a=this._flattenProperties(d,this.properties);this._invoke(this._get_path(),\"SetPropertiesForCurrentUser\",false,{values:a.value,authenticatedUserOnly:false},Function.createDelegate(this,this._onSaveComplete),Function.createDelegate(this,this._onSaveFailed),[b,c,e,a.count])},_clonePropertyNames:function(e){var c=[],d={};for(var b=0;b<e.length;b++){var a=e[b];if(!d[a]){Array.add(c,a);d[a]=true}}return c},_flattenProperties:function(a,i,j){var b={},e,d,g=0;if(a&&a.length===0)return {value:b,count:0};for(var c in i){e=i[c];d=j?j+\".\"+c:c;if(Sys.Services.ProfileGroup.isInstanceOfType(e)){var k=this._flattenProperties(a,e,d),h=k.value;g+=k.count;for(var f in h){var l=h[f];b[f]=l}}else if(!a||Array.indexOf(a,d)!==-1){b[d]=e;g++}}return {value:b,count:g}},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._ProfileService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoadComplete:function(a,e,g){if(typeof a!==\"object\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,g,\"Object\"));var c=this._unflattenProperties(a);for(var b in c)this.properties[b]=c[b];var d=e[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(d){var f=e[2]||this.get_defaultUserContext();d(a.length,f,\"Sys.Services.ProfileService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.load\")}},_onSaveComplete:function(a,b,f){var c=b[3];if(a!==null)if(a instanceof Array)c-=a.length;else if(typeof a===\"number\")c=a;else throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));var d=b[0]||this.get_defaultSaveCompletedCallback()||this.get_defaultSucceededCallback();if(d){var e=b[2]||this.get_defaultUserContext();d(c,e,\"Sys.Services.ProfileService.save\")}},_onSaveFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.save\")}},_unflattenProperties:function(e){var c={},d,f,h=0;for(var a in e){h++;f=e[a];d=a.indexOf(\".\");if(d!==-1){var g=a.substr(0,d);a=a.substr(d+1);var b=c[g];if(!b||!Sys.Services.ProfileGroup.isInstanceOfType(b)){b=new Sys.Services.ProfileGroup;c[g]=b}b[a]=f}else c[a]=f}e.length=h;return c}};Sys.Services._ProfileService.registerClass(\"Sys.Services._ProfileService\",Sys.Net.WebServiceProxy);Sys.Services.ProfileService=new Sys.Services._ProfileService;Sys.Services.ProfileGroup=function(a){if(a)for(var b in a)this[b]=a[b]};Sys.Services.ProfileGroup.registerClass(\"Sys.Services.ProfileGroup\");Sys.Services._AuthenticationService=function(){Sys.Services._AuthenticationService.initializeBase(this)};Sys.Services._AuthenticationService.DefaultWebServicePath=\"\";Sys.Services._AuthenticationService.prototype={_defaultLoginCompletedCallback:null,_defaultLogoutCompletedCallback:null,_path:\"\",_timeout:0,_authenticated:false,get_defaultLoginCompletedCallback:function(){return this._defaultLoginCompletedCallback},set_defaultLoginCompletedCallback:function(a){this._defaultLoginCompletedCallback=a},get_defaultLogoutCompletedCallback:function(){return this._defaultLogoutCompletedCallback},set_defaultLogoutCompletedCallback:function(a){this._defaultLogoutCompletedCallback=a},get_isLoggedIn:function(){return this._authenticated},get_path:function(){return this._path||\"\"},login:function(c,b,a,h,f,d,e,g){this._invoke(this._get_path(),\"Login\",false,{userName:c,password:b,createPersistentCookie:a},Function.createDelegate(this,this._onLoginComplete),Function.createDelegate(this,this._onLoginFailed),[c,b,a,h,f,d,e,g])},logout:function(c,a,b,d){this._invoke(this._get_path(),\"Logout\",false,{},Function.createDelegate(this,this._onLogoutComplete),Function.createDelegate(this,this._onLogoutFailed),[c,a,b,d])},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._AuthenticationService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoginComplete:function(e,c,f){if(typeof e!==\"boolean\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Boolean\"));var b=c[4],d=c[7]||this.get_defaultUserContext(),a=c[5]||this.get_defaultLoginCompletedCallback()||this.get_defaultSucceededCallback();if(e){this._authenticated=true;if(a)a(true,d,\"Sys.Services.AuthenticationService.login\");if(typeof b!==\"undefined\"&&b!==null)window.location.href=b}else if(a)a(false,d,\"Sys.Services.AuthenticationService.login\")},_onLoginFailed:function(d,b){var a=b[6]||this.get_defaultFailedCallback();if(a){var c=b[7]||this.get_defaultUserContext();a(d,c,\"Sys.Services.AuthenticationService.login\")}},_onLogoutComplete:function(f,a,e){if(f!==null)throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,e,\"null\"));var b=a[0],d=a[3]||this.get_defaultUserContext(),c=a[1]||this.get_defaultLogoutCompletedCallback()||this.get_defaultSucceededCallback();this._authenticated=false;if(c)c(null,d,\"Sys.Services.AuthenticationService.logout\");if(!b)window.location.reload();else window.location.href=b},_onLogoutFailed:function(c,b){var a=b[2]||this.get_defaultFailedCallback();if(a)a(c,b[3],\"Sys.Services.AuthenticationService.logout\")},_setAuthenticated:function(a){this._authenticated=a}};Sys.Services._AuthenticationService.registerClass(\"Sys.Services._AuthenticationService\",Sys.Net.WebServiceProxy);Sys.Services.AuthenticationService=new Sys.Services._AuthenticationService;Sys.Services._RoleService=function(){Sys.Services._RoleService.initializeBase(this);this._roles=[]};Sys.Services._RoleService.DefaultWebServicePath=\"\";Sys.Services._RoleService.prototype={_defaultLoadCompletedCallback:null,_rolesIndex:null,_timeout:0,_path:\"\",get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_path:function(){return this._path||\"\"},get_roles:function(){return Array.clone(this._roles)},isUserInRole:function(a){var b=this._get_rolesIndex()[a.trim().toLowerCase()];return !!b},load:function(a,b,c){Sys.Net.WebServiceProxy.invoke(this._get_path(),\"GetRolesForCurrentUser\",false,{},Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[a,b,c],this.get_timeout())},_get_path:function(){var a=this.get_path();if(!a||!a.length)a=Sys.Services._RoleService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_get_rolesIndex:function(){if(!this._rolesIndex){var b={};for(var a=0;a<this._roles.length;a++)b[this._roles[a].toLowerCase()]=true;this._rolesIndex=b}return this._rolesIndex},_onLoadComplete:function(a,c,f){if(a&&!(a instanceof Array))throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));this._roles=a;this._rolesIndex=null;var b=c[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(b){var e=c[2]||this.get_defaultUserContext(),d=Array.clone(a);b(d,e,\"Sys.Services.RoleService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.RoleService.load\")}}};Sys.Services._RoleService.registerClass(\"Sys.Services._RoleService\",Sys.Net.WebServiceProxy);Sys.Services.RoleService=new Sys.Services._RoleService;"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxComponentModel.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxComponentModel.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxComponentModel.js\nType._registerScript(\"MicrosoftAjaxComponentModel.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.UI\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxCore.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxCore.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxCore.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript(\"MicrosoftAjaxCore.js\");Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxGlobalization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxGlobalization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxGlobalization.js\nType._registerScript(\"MicrosoftAjaxGlobalization.js\",[\"MicrosoftAjaxCore.js\"]);Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxHistory.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxHistory.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxHistory.js\nType._registerScript(\"MicrosoftAjaxHistory.js\",[\"MicrosoftAjaxComponentModel.js\",\"MicrosoftAjaxSerialization.js\"]);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxNetwork.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxNetwork.js\nType._registerScript(\"MicrosoftAjaxNetwork.js\",[\"MicrosoftAjaxSerialization.js\"]);if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxSerialization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxSerialization.js\nType._registerScript(\"MicrosoftAjaxSerialization.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxTimer.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxTimer.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxTimer.js\nType._registerScript(\"Timer.js\",[\"MicrosoftAjaxComponentModel.js\"]);Sys.UI._Timer=function(a){Sys.UI._Timer.initializeBase(this,[a]);this._interval=60000;this._enabled=true;this._postbackPending=false;this._raiseTickDelegate=null;this._endRequestHandlerDelegate=null;this._timer=null;this._pageRequestManager=null;this._uniqueID=null};Sys.UI._Timer.prototype={get_enabled:function(){return this._enabled},set_enabled:function(a){this._enabled=a},get_interval:function(){return this._interval},set_interval:function(a){this._interval=a},get_uniqueID:function(){return this._uniqueID},set_uniqueID:function(a){this._uniqueID=a},dispose:function(){this._stopTimer();if(this._pageRequestManager!==null)this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);Sys.UI._Timer.callBaseMethod(this,\"dispose\")},_doPostback:function(){__doPostBack(this.get_uniqueID(),\"\")},_handleEndRequest:function(c,b){var a=b.get_dataItems()[this.get_id()];if(a)this._update(a[0],a[1]);if(this._postbackPending===true&&this._pageRequestManager!==null&&this._pageRequestManager.get_isInAsyncPostBack()===false){this._postbackPending=false;this._doPostback()}},initialize:function(){Sys.UI._Timer.callBaseMethod(this,\"initialize\");this._raiseTickDelegate=Function.createDelegate(this,this._raiseTick);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null)this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate);if(this.get_enabled())this._startTimer()},_raiseTick:function(){this._startTimer();if(this._pageRequestManager===null||!this._pageRequestManager.get_isInAsyncPostBack()){this._doPostback();this._postbackPending=false}else this._postbackPending=true},_startTimer:function(){this._timer=window.setTimeout(Function.createDelegate(this,this._raiseTick),this.get_interval())},_stopTimer:function(){if(this._timer!==null){window.clearTimeout(this._timer);this._timer=null}},_update:function(c,b){var a=!this.get_enabled(),d=this.get_interval()!==b;if(!a&&(!c||d)){this._stopTimer();a=true}this.set_enabled(c);this.set_interval(b);if(this.get_enabled()&&a)this._startTimer()}};Sys.UI._Timer.registerClass(\"Sys.UI._Timer\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebForms.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebForms.js\nType._registerScript(\"MicrosoftAjaxWebForms.js\",[\"MicrosoftAjaxCore.js\",\"MicrosoftAjaxSerialization.js\",\"MicrosoftAjaxNetwork.js\",\"MicrosoftAjaxComponentModel.js\"]);Type.registerNamespace(\"Sys.WebForms\");Sys.WebForms.BeginRequestEventArgs=function(c,b,a){Sys.WebForms.BeginRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.BeginRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]}};Sys.WebForms.BeginRequestEventArgs.registerClass(\"Sys.WebForms.BeginRequestEventArgs\",Sys.EventArgs);Sys.WebForms.EndRequestEventArgs=function(c,a,b){Sys.WebForms.EndRequestEventArgs.initializeBase(this);this._errorHandled=false;this._error=c;this._dataItems=a||{};this._response=b};Sys.WebForms.EndRequestEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_error:function(){return this._error},get_errorHandled:function(){return this._errorHandled},set_errorHandled:function(a){this._errorHandled=a},get_response:function(){return this._response}};Sys.WebForms.EndRequestEventArgs.registerClass(\"Sys.WebForms.EndRequestEventArgs\",Sys.EventArgs);Sys.WebForms.InitializeRequestEventArgs=function(c,b,a){Sys.WebForms.InitializeRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.InitializeRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]},set_updatePanelsToUpdate:function(a){this._updated=true;this._updatePanelsToUpdate=a}};Sys.WebForms.InitializeRequestEventArgs.registerClass(\"Sys.WebForms.InitializeRequestEventArgs\",Sys.CancelEventArgs);Sys.WebForms.PageLoadedEventArgs=function(b,a,c){Sys.WebForms.PageLoadedEventArgs.initializeBase(this);this._panelsUpdated=b;this._panelsCreated=a;this._dataItems=c||{}};Sys.WebForms.PageLoadedEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsCreated:function(){return this._panelsCreated},get_panelsUpdated:function(){return this._panelsUpdated}};Sys.WebForms.PageLoadedEventArgs.registerClass(\"Sys.WebForms.PageLoadedEventArgs\",Sys.EventArgs);Sys.WebForms.PageLoadingEventArgs=function(b,a,c){Sys.WebForms.PageLoadingEventArgs.initializeBase(this);this._panelsUpdating=b;this._panelsDeleting=a;this._dataItems=c||{}};Sys.WebForms.PageLoadingEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsDeleting:function(){return this._panelsDeleting},get_panelsUpdating:function(){return this._panelsUpdating}};Sys.WebForms.PageLoadingEventArgs.registerClass(\"Sys.WebForms.PageLoadingEventArgs\",Sys.EventArgs);Sys._ScriptLoader=function(){this._scriptsToLoad=null;this._sessions=[];this._scriptLoadedDelegate=Function.createDelegate(this,this._scriptLoadedHandler)};Sys._ScriptLoader.prototype={dispose:function(){this._stopSession();this._loading=false;if(this._events)delete this._events;this._sessions=null;this._currentSession=null;this._scriptLoadedDelegate=null},loadScripts:function(d,b,c,a){var e={allScriptsLoadedCallback:b,scriptLoadFailedCallback:c,scriptLoadTimeoutCallback:a,scriptsToLoad:this._scriptsToLoad,scriptTimeout:d};this._scriptsToLoad=null;this._sessions[this._sessions.length]=e;if(!this._loading)this._nextSession()},queueCustomScriptTag:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,a)},queueScriptBlock:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{text:a})},queueScriptReference:function(a,b){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{src:a,fallback:b})},_createScriptElement:function(c){var a=document.createElement(\"script\");a.type=\"text/javascript\";for(var b in c)a[b]=c[b];return a},_loadScriptsInternal:function(){var c=this._currentSession;if(c.scriptsToLoad&&c.scriptsToLoad.length>0){var b=Array.dequeue(c.scriptsToLoad),f=this._scriptLoadedDelegate;if(b.fallback){var g=b.fallback;delete b.fallback;var d=this;f=function(b,a){a||function(){var a=d._createScriptElement({src:g});d._currentTask=new Sys._ScriptLoaderTask(a,d._scriptLoadedDelegate);d._currentTask.execute()}()}}var a=this._createScriptElement(b);if(a.text&&Sys.Browser.agent===Sys.Browser.Safari){a.innerHTML=a.text;delete a.text}if(typeof b.src===\"string\"){this._currentTask=new Sys._ScriptLoaderTask(a,f);this._currentTask.execute()}else{document.getElementsByTagName(\"head\")[0].appendChild(a);Sys._ScriptLoaderTask._clearScript(a);this._loadScriptsInternal()}}else{this._stopSession();var e=c.allScriptsLoadedCallback;if(e)e(this);this._nextSession()}},_nextSession:function(){if(this._sessions.length===0){this._loading=false;this._currentSession=null;return}this._loading=true;var a=Array.dequeue(this._sessions);this._currentSession=a;if(a.scriptTimeout>0)this._timeoutCookie=window.setTimeout(Function.createDelegate(this,this._scriptLoadTimeoutHandler),a.scriptTimeout*1000);this._loadScriptsInternal()},_raiseError:function(){var b=this._currentSession.scriptLoadFailedCallback,a=this._currentTask.get_scriptElement();this._stopSession();if(b){b(this,a);this._nextSession()}else{this._loading=false;throw Sys._ScriptLoader._errorScriptLoadFailed(a.src)}},_scriptLoadedHandler:function(a,b){if(b){Array.add(Sys._ScriptLoader._getLoadedScripts(),a.src);this._currentTask.dispose();this._currentTask=null;this._loadScriptsInternal()}else this._raiseError()},_scriptLoadTimeoutHandler:function(){var a=this._currentSession.scriptLoadTimeoutCallback;this._stopSession();if(a)a(this);this._nextSession()},_stopSession:function(){if(this._timeoutCookie){window.clearTimeout(this._timeoutCookie);this._timeoutCookie=null}if(this._currentTask){this._currentTask.dispose();this._currentTask=null}}};Sys._ScriptLoader.registerClass(\"Sys._ScriptLoader\",null,Sys.IDisposable);Sys._ScriptLoader.getInstance=function(){var a=Sys._ScriptLoader._activeInstance;if(!a)a=Sys._ScriptLoader._activeInstance=new Sys._ScriptLoader;return a};Sys._ScriptLoader.isScriptLoaded=function(b){var a=document.createElement(\"script\");a.src=b;return Array.contains(Sys._ScriptLoader._getLoadedScripts(),a.src)};Sys._ScriptLoader.readLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){var c=Sys._ScriptLoader._referencedScripts=[],d=document.getElementsByTagName(\"script\");for(var b=d.length-1;b>=0;b--){var e=d[b],a=e.src;if(a.length)if(!Array.contains(c,a))Array.add(c,a)}}};Sys._ScriptLoader._errorScriptLoadFailed=function(b){var a;a=Sys.Res.scriptLoadFailed;var d=\"Sys.ScriptLoadFailedException: \"+String.format(a,b),c=Error.create(d,{name:\"Sys.ScriptLoadFailedException\",\"scriptUrl\":b});c.popStackFrame();return c};Sys._ScriptLoader._getLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){Sys._ScriptLoader._referencedScripts=[];Sys._ScriptLoader.readLoadedScripts()}return Sys._ScriptLoader._referencedScripts};Sys.WebForms.PageRequestManager=function(){this._form=null;this._activeDefaultButton=null;this._activeDefaultButtonClicked=false;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._updatePanelHasChildrenAsTriggers=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._scriptManagerID=null;this._pageLoadedHandler=null;this._additionalInput=null;this._onsubmit=null;this._onSubmitStatements=[];this._originalDoPostBack=null;this._originalDoPostBackWithOptions=null;this._originalFireDefaultButton=null;this._originalDoCallback=null;this._isCrossPost=false;this._postBackSettings=null;this._request=null;this._onFormSubmitHandler=null;this._onFormElementClickHandler=null;this._onWindowUnloadHandler=null;this._asyncPostBackTimeout=null;this._controlIDToFocus=null;this._scrollPosition=null;this._processingRequest=false;this._scriptDisposes={};this._transientFields=[\"__VIEWSTATEENCRYPTED\",\"__VIEWSTATEFIELDCOUNT\"];this._textTypes=/^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i};Sys.WebForms.PageRequestManager.prototype={_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_isInAsyncPostBack:function(){return this._request!==null},add_beginRequest:function(a){this._get_eventHandlerList().addHandler(\"beginRequest\",a)},remove_beginRequest:function(a){this._get_eventHandlerList().removeHandler(\"beginRequest\",a)},add_endRequest:function(a){this._get_eventHandlerList().addHandler(\"endRequest\",a)},remove_endRequest:function(a){this._get_eventHandlerList().removeHandler(\"endRequest\",a)},add_initializeRequest:function(a){this._get_eventHandlerList().addHandler(\"initializeRequest\",a)},remove_initializeRequest:function(a){this._get_eventHandlerList().removeHandler(\"initializeRequest\",a)},add_pageLoaded:function(a){this._get_eventHandlerList().addHandler(\"pageLoaded\",a)},remove_pageLoaded:function(a){this._get_eventHandlerList().removeHandler(\"pageLoaded\",a)},add_pageLoading:function(a){this._get_eventHandlerList().addHandler(\"pageLoading\",a)},remove_pageLoading:function(a){this._get_eventHandlerList().removeHandler(\"pageLoading\",a)},abortPostBack:function(){if(!this._processingRequest&&this._request){this._request.get_executor().abort();this._request=null}},beginAsyncPostBack:function(c,a,f,d,e){if(d&&typeof Page_ClientValidate===\"function\"&&!Page_ClientValidate(e||null))return;this._postBackSettings=this._createPostBackSettings(true,c,a);var b=this._form;b.__EVENTTARGET.value=a||\"\";b.__EVENTARGUMENT.value=f||\"\";this._isCrossPost=false;this._additionalInput=null;this._onFormSubmit()},_cancelPendingCallbacks:function(){for(var a=0,e=window.__pendingCallbacks.length;a<e;a++){var c=window.__pendingCallbacks[a];if(c){if(!c.async)window.__synchronousCallBackIndex=-1;window.__pendingCallbacks[a]=null;var d=\"__CALLBACKFRAME\"+a,b=document.getElementById(d);if(b)b.parentNode.removeChild(b)}}},_commitControls:function(a,b){if(a){this._updatePanelIDs=a.updatePanelIDs;this._updatePanelClientIDs=a.updatePanelClientIDs;this._updatePanelHasChildrenAsTriggers=a.updatePanelHasChildrenAsTriggers;this._asyncPostBackControlIDs=a.asyncPostBackControlIDs;this._asyncPostBackControlClientIDs=a.asyncPostBackControlClientIDs;this._postBackControlIDs=a.postBackControlIDs;this._postBackControlClientIDs=a.postBackControlClientIDs}if(typeof b!==\"undefined\"&&b!==null)this._asyncPostBackTimeout=b*1000},_createHiddenField:function(c,d){var b,a=document.getElementById(c);if(a)if(!a._isContained)a.parentNode.removeChild(a);else b=a.parentNode;if(!b){b=document.createElement(\"span\");b.style.cssText=\"display:none !important\";this._form.appendChild(b)}b.innerHTML=\"<input type='hidden' />\";a=b.childNodes[0];a._isContained=true;a.id=a.name=c;a.value=d},_createPageRequestManagerTimeoutError:function(){var b=\"Sys.WebForms.PageRequestManagerTimeoutException: \"+Sys.WebForms.Res.PRM_TimeoutError,a=Error.create(b,{name:\"Sys.WebForms.PageRequestManagerTimeoutException\"});a.popStackFrame();return a},_createPageRequestManagerServerError:function(a,d){var c=\"Sys.WebForms.PageRequestManagerServerErrorException: \"+(d||String.format(Sys.WebForms.Res.PRM_ServerError,a)),b=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerServerErrorException\",httpStatusCode:a});b.popStackFrame();return b},_createPageRequestManagerParserError:function(b){var c=\"Sys.WebForms.PageRequestManagerParserErrorException: \"+String.format(Sys.WebForms.Res.PRM_ParserError,b),a=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerParserErrorException\"});a.popStackFrame();return a},_createPanelID:function(e,b){var c=b.asyncTarget,a=this._ensureUniqueIds(e||b.panelsToUpdate),d=a instanceof Array?a.join(\",\"):a||this._scriptManagerID;if(c)d+=\"|\"+c;return encodeURIComponent(this._scriptManagerID)+\"=\"+encodeURIComponent(d)+\"&\"},_createPostBackSettings:function(d,a,c,b){return {async:d,asyncTarget:c,panelsToUpdate:a,sourceElement:b}},_convertToClientIDs:function(a,f,e,d){if(a)for(var b=0,h=a.length;b<h;b+=d?2:1){var c=a[b],g=(d?a[b+1]:\"\")||this._uniqueIDToClientID(c);Array.add(f,c);Array.add(e,g)}},dispose:function(){if(this._form){Sys.UI.DomEvent.removeHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.removeHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._onWindowUnloadHandler);Sys.UI.DomEvent.removeHandler(window,\"load\",this._pageLoadedHandler)}if(this._originalDoPostBack){window.__doPostBack=this._originalDoPostBack;this._originalDoPostBack=null}if(this._originalDoPostBackWithOptions){window.WebForm_DoPostBackWithOptions=this._originalDoPostBackWithOptions;this._originalDoPostBackWithOptions=null}if(this._originalFireDefaultButton){window.WebForm_FireDefaultButton=this._originalFireDefaultButton;this._originalFireDefaultButton=null}if(this._originalDoCallback){window.WebForm_DoCallback=this._originalDoCallback;this._originalDoCallback=null}this._form=null;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._asyncPostBackTimeout=null;this._scrollPosition=null;this._activeElement=null},_doCallback:function(d,b,c,f,a,e){if(!this.get_isInAsyncPostBack())this._originalDoCallback(d,b,c,f,a,e)},_doPostBack:function(a,k){var f=window.event;if(!f){var d=arguments.callee?arguments.callee.caller:null;if(d){var j=30;while(d.arguments.callee.caller&&--j)d=d.arguments.callee.caller;f=j&&d.arguments.length?d.arguments[0]:null}}this._additionalInput=null;var h=this._form;if(a===null||typeof a===\"undefined\"||this._isCrossPost){this._postBackSettings=this._createPostBackSettings(false);this._isCrossPost=false}else{var c=this._masterPageUniqueID,l=this._uniqueIDToClientID(a),g=document.getElementById(l);if(!g&&c)if(a.indexOf(c+\"$\")===0)g=document.getElementById(l.substr(c.length+1));if(!g)if(Array.contains(this._asyncPostBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(true,null,a);else if(Array.contains(this._postBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(false);else{var e=this._findNearestElement(a);if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{if(c){c+=\"$\";if(a.indexOf(c)===0)e=this._findNearestElement(a.substr(c.length))}if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{var b;try{b=f?f.target||f.srcElement:null}catch(n){}b=b||this._activeElement;var m=/__doPostBack\\(|WebForm_DoPostBackWithOptions\\(/;function i(b){b=b?b.toString():\"\";return m.test(b)&&b.indexOf(\"'\"+a+\"'\")!==-1||b.indexOf('\"'+a+'\"')!==-1}if(b&&(b.name===a||i(b.href)||i(b.onclick)||i(b.onchange)))this._postBackSettings=this._getPostBackSettings(b,a);else this._postBackSettings=this._createPostBackSettings(false)}}}else this._postBackSettings=this._getPostBackSettings(g,a)}if(!this._postBackSettings.async){h.onsubmit=this._onsubmit;this._originalDoPostBack(a,k);h.onsubmit=null;return}h.__EVENTTARGET.value=a;h.__EVENTARGUMENT.value=k;this._onFormSubmit()},_doPostBackWithOptions:function(a){this._isCrossPost=a&&a.actionUrl;var d=true;if(a.validation)if(typeof Page_ClientValidate==\"function\")d=Page_ClientValidate(a.validationGroup);if(d){if(typeof a.actionUrl!=\"undefined\"&&a.actionUrl!=null&&a.actionUrl.length>0)theForm.action=a.actionUrl;if(a.trackFocus){var c=theForm.elements[\"__LASTFOCUS\"];if(typeof c!=\"undefined\"&&c!=null)if(typeof document.activeElement==\"undefined\")c.value=a.eventTarget;else{var b=document.activeElement;if(typeof b!=\"undefined\"&&b!=null)if(typeof b.id!=\"undefined\"&&b.id!=null&&b.id.length>0)c.value=b.id;else if(typeof b.name!=\"undefined\")c.value=b.name}}}if(a.clientSubmit)this._doPostBack(a.eventTarget,a.eventArgument)},_elementContains:function(b,a){while(a){if(a===b)return true;a=a.parentNode}return false},_endPostBack:function(a,d,f){if(this._request===d.get_webRequest()){this._processingRequest=false;this._additionalInput=null;this._request=null}var e=this._get_eventHandlerList().getHandler(\"endRequest\"),b=false;if(e){var c=new Sys.WebForms.EndRequestEventArgs(a,f?f.dataItems:{},d);e(this,c);b=c.get_errorHandled()}if(a&&!b)throw a},_ensureUniqueIds:function(a){if(!a)return a;a=a instanceof Array?a:[a];var c=[];for(var b=0,f=a.length;b<f;b++){var e=a[b],d=Array.indexOf(this._updatePanelClientIDs,e);c.push(d>-1?this._updatePanelIDs[d]:e)}return c},_findNearestElement:function(a){while(a.length>0){var d=this._uniqueIDToClientID(a),c=document.getElementById(d);if(c)return c;var b=a.lastIndexOf(\"$\");if(b===-1)return null;a=a.substring(0,b)}return null},_findText:function(b,a){var c=Math.max(0,a-20),d=Math.min(b.length,a+20);return b.substring(c,d)},_fireDefaultButton:function(a,d){if(a.keyCode===13){var c=a.srcElement||a.target;if(!c||c.tagName.toLowerCase()!==\"textarea\"){var b=document.getElementById(d);if(b&&typeof b.click!==\"undefined\"){this._activeDefaultButton=b;this._activeDefaultButtonClicked=false;try{b.click()}finally{this._activeDefaultButton=null}a.cancelBubble=true;if(typeof a.stopPropagation===\"function\")a.stopPropagation();return false}}}return true},_getPageLoadedEventArgs:function(n,c){var m=[],l=[],k=c?c.version4:false,d=c?c.updatePanelData:null,e,g,h,b;if(!d){e=this._updatePanelIDs;g=this._updatePanelClientIDs;h=null;b=null}else{e=d.updatePanelIDs;g=d.updatePanelClientIDs;h=d.childUpdatePanelIDs;b=d.panelsToRefreshIDs}var a,f,j,i;if(b)for(a=0,f=b.length;a<f;a+=k?2:1){j=b[a];i=(k?b[a+1]:\"\")||this._uniqueIDToClientID(j);Array.add(m,document.getElementById(i))}for(a=0,f=e.length;a<f;a++)if(n||Array.indexOf(h,e[a])!==-1)Array.add(l,document.getElementById(g[a]));return new Sys.WebForms.PageLoadedEventArgs(m,l,c?c.dataItems:{})},_getPageLoadingEventArgs:function(f){var j=[],i=[],c=f.updatePanelData,k=c.oldUpdatePanelIDs,l=c.oldUpdatePanelClientIDs,n=c.updatePanelIDs,m=c.childUpdatePanelIDs,d=c.panelsToRefreshIDs,a,e,b,g,h=f.version4;for(a=0,e=d.length;a<e;a+=h?2:1){b=d[a];g=(h?d[a+1]:\"\")||this._uniqueIDToClientID(b);Array.add(j,document.getElementById(g))}for(a=0,e=k.length;a<e;a++){b=k[a];if(Array.indexOf(d,b)===-1&&(Array.indexOf(n,b)===-1||Array.indexOf(m,b)>-1))Array.add(i,document.getElementById(l[a]))}return new Sys.WebForms.PageLoadingEventArgs(j,i,f.dataItems)},_getPostBackSettings:function(a,c){var d=a,b=null;while(a){if(a.id){if(!b&&Array.contains(this._asyncPostBackControlClientIDs,a.id))b=this._createPostBackSettings(true,null,c,d);else if(!b&&Array.contains(this._postBackControlClientIDs,a.id))return this._createPostBackSettings(false);else{var e=Array.indexOf(this._updatePanelClientIDs,a.id);if(e!==-1)if(this._updatePanelHasChildrenAsTriggers[e])return this._createPostBackSettings(true,[this._updatePanelIDs[e]],c,d);else return this._createPostBackSettings(true,null,c,d)}if(!b&&this._matchesParentIDInList(a.id,this._asyncPostBackControlClientIDs))b=this._createPostBackSettings(true,null,c,d);else if(!b&&this._matchesParentIDInList(a.id,this._postBackControlClientIDs))return this._createPostBackSettings(false)}a=a.parentNode}if(!b)return this._createPostBackSettings(false);else return b},_getScrollPosition:function(){var a=document.documentElement;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else{a=document.body;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else if(this._validPosition(window.pageXOffset)||this._validPosition(window.pageYOffset))return {x:window.pageXOffset,y:window.pageYOffset};else return {x:0,y:0}}},_initializeInternal:function(f,g,a,b,e,c,d){if(this._prmInitialized)throw Error.invalidOperation(Sys.WebForms.Res.PRM_CannotRegisterTwice);this._prmInitialized=true;this._masterPageUniqueID=d;this._scriptManagerID=f;this._form=Sys.UI.DomElement.resolveElement(g);this._onsubmit=this._form.onsubmit;this._form.onsubmit=null;this._onFormSubmitHandler=Function.createDelegate(this,this._onFormSubmit);this._onFormElementClickHandler=Function.createDelegate(this,this._onFormElementClick);this._onWindowUnloadHandler=Function.createDelegate(this,this._onWindowUnload);Sys.UI.DomEvent.addHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.addHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._onWindowUnloadHandler);this._originalDoPostBack=window.__doPostBack;if(this._originalDoPostBack)window.__doPostBack=Function.createDelegate(this,this._doPostBack);this._originalDoPostBackWithOptions=window.WebForm_DoPostBackWithOptions;if(this._originalDoPostBackWithOptions)window.WebForm_DoPostBackWithOptions=Function.createDelegate(this,this._doPostBackWithOptions);this._originalFireDefaultButton=window.WebForm_FireDefaultButton;if(this._originalFireDefaultButton)window.WebForm_FireDefaultButton=Function.createDelegate(this,this._fireDefaultButton);this._originalDoCallback=window.WebForm_DoCallback;if(this._originalDoCallback)window.WebForm_DoCallback=Function.createDelegate(this,this._doCallback);this._pageLoadedHandler=Function.createDelegate(this,this._pageLoadedInitialLoad);Sys.UI.DomEvent.addHandler(window,\"load\",this._pageLoadedHandler);if(a)this._updateControls(a,b,e,c,true)},_matchesParentIDInList:function(c,b){for(var a=0,d=b.length;a<d;a++)if(c.startsWith(b[a]+\"_\"))return true;return false},_onFormElementActive:function(a,d,e){if(a.disabled)return;this._activeElement=a;this._postBackSettings=this._getPostBackSettings(a,a.name);if(a.name){var b=a.tagName.toUpperCase();if(b===\"INPUT\"){var c=a.type;if(c===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value);else if(c===\"image\")this._additionalInput=encodeURIComponent(a.name)+\".x=\"+d+\"&\"+encodeURIComponent(a.name)+\".y=\"+e}else if(b===\"BUTTON\"&&a.name.length!==0&&a.type===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value)}},_onFormElementClick:function(a){this._activeDefaultButtonClicked=a.target===this._activeDefaultButton;this._onFormElementActive(a.target,a.offsetX,a.offsetY)},_onFormSubmit:function(i){var f,x,h=true,z=this._isCrossPost;this._isCrossPost=false;if(this._onsubmit)h=this._onsubmit();if(h)for(f=0,x=this._onSubmitStatements.length;f<x;f++)if(!this._onSubmitStatements[f]()){h=false;break}if(!h){if(i)i.preventDefault();return}var w=this._form;if(z)return;if(this._activeDefaultButton&&!this._activeDefaultButtonClicked)this._onFormElementActive(this._activeDefaultButton,0,0);if(!this._postBackSettings||!this._postBackSettings.async)return;var b=new Sys.StringBuilder,s=w.elements,B=s.length,t=this._createPanelID(null,this._postBackSettings);b.append(t);for(f=0;f<B;f++){var e=s[f],g=e.name;if(typeof g===\"undefined\"||g===null||g.length===0||g===this._scriptManagerID)continue;var n=e.tagName.toUpperCase();if(n===\"INPUT\"){var p=e.type;if(this._textTypes.test(p)||(p===\"checkbox\"||p===\"radio\")&&e.checked){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}else if(n===\"SELECT\"){var A=e.options.length;for(var q=0;q<A;q++){var u=e.options[q];if(u.selected){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(u.value));b.append(\"&\")}}}else if(n===\"TEXTAREA\"){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}b.append(\"__ASYNCPOST=true&\");if(this._additionalInput){b.append(this._additionalInput);this._additionalInput=null}var c=new Sys.Net.WebRequest,a=w.action;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var r=a.indexOf(\"#\");if(r!==-1)a=a.substr(0,r);var o=\"\",v=\"\",m=a.indexOf(\"?\");if(m!==-1){v=a.substr(m);a=a.substr(0,m)}if(/^https?\\:\\/\\/.*$/gi.test(a)){var y=a.indexOf(\"//\")+2,l=a.indexOf(\"/\",y);if(l===-1){o=a;a=\"\"}else{o=a.substr(0,l);a=a.substr(l)}}a=o+encodeURI(decodeURI(a))+v}c.set_url(a);c.get_headers()[\"X-MicrosoftAjax\"]=\"Delta=true\";c.get_headers()[\"Cache-Control\"]=\"no-cache\";c.set_timeout(this._asyncPostBackTimeout);c.add_completed(Function.createDelegate(this,this._onFormSubmitCompleted));c.set_body(b.toString());var j,d,k=this._get_eventHandlerList().getHandler(\"initializeRequest\");if(k){j=this._postBackSettings.panelsToUpdate;d=new Sys.WebForms.InitializeRequestEventArgs(c,this._postBackSettings.sourceElement,j);k(this,d);h=!d.get_cancel()}if(!h){if(i)i.preventDefault();return}if(d&&d._updated){j=d.get_updatePanelsToUpdate();c.set_body(c.get_body().replace(t,this._createPanelID(j,this._postBackSettings)))}this._scrollPosition=this._getScrollPosition();this.abortPostBack();k=this._get_eventHandlerList().getHandler(\"beginRequest\");if(k){d=new Sys.WebForms.BeginRequestEventArgs(c,this._postBackSettings.sourceElement,j||this._postBackSettings.panelsToUpdate);k(this,d)}if(this._originalDoCallback)this._cancelPendingCallbacks();this._request=c;this._processingRequest=false;c.invoke();if(i)i.preventDefault()},_onFormSubmitCompleted:function(c){this._processingRequest=true;if(c.get_timedOut()){this._endPostBack(this._createPageRequestManagerTimeoutError(),c,null);return}if(c.get_aborted()){this._endPostBack(null,c,null);return}if(!this._request||c.get_webRequest()!==this._request)return;if(c.get_statusCode()!==200){this._endPostBack(this._createPageRequestManagerServerError(c.get_statusCode()),c,null);return}var a=this._parseDelta(c);if(!a)return;var b,e;if(a.asyncPostBackControlIDsNode&&a.postBackControlIDsNode&&a.updatePanelIDsNode&&a.panelsToRefreshNode&&a.childUpdatePanelIDsNode){var r=this._updatePanelIDs,n=this._updatePanelClientIDs,i=a.childUpdatePanelIDsNode.content,p=i.length?i.split(\",\"):[],m=this._splitNodeIntoArray(a.asyncPostBackControlIDsNode),o=this._splitNodeIntoArray(a.postBackControlIDsNode),q=this._splitNodeIntoArray(a.updatePanelIDsNode),g=this._splitNodeIntoArray(a.panelsToRefreshNode),h=a.version4;for(b=0,e=g.length;b<e;b+=h?2:1){var j=(h?g[b+1]:\"\")||this._uniqueIDToClientID(g[b]);if(!document.getElementById(j)){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,j)),c,a);return}}var f=this._processUpdatePanelArrays(q,m,o,h);f.oldUpdatePanelIDs=r;f.oldUpdatePanelClientIDs=n;f.childUpdatePanelIDs=p;f.panelsToRefreshIDs=g;a.updatePanelData=f}a.dataItems={};var d;for(b=0,e=a.dataItemNodes.length;b<e;b++){d=a.dataItemNodes[b];a.dataItems[d.id]=d.content}for(b=0,e=a.dataItemJsonNodes.length;b<e;b++){d=a.dataItemJsonNodes[b];a.dataItems[d.id]=Sys.Serialization.JavaScriptSerializer.deserialize(d.content)}var l=this._get_eventHandlerList().getHandler(\"pageLoading\");if(l)l(this,this._getPageLoadingEventArgs(a));Sys._ScriptLoader.readLoadedScripts();Sys.Application.beginCreateComponents();var k=Sys._ScriptLoader.getInstance();this._queueScripts(k,a.scriptBlockNodes,true,false);this._processingRequest=true;k.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadComplete,a)),Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadFailed,a)),null)},_onWindowUnload:function(){this.dispose()},_pageLoaded:function(a,c){var b=this._get_eventHandlerList().getHandler(\"pageLoaded\");if(b)b(this,this._getPageLoadedEventArgs(a,c));if(!a)Sys.Application.raiseLoad()},_pageLoadedInitialLoad:function(){this._pageLoaded(true,null)},_parseDelta:function(h){var c=h.get_responseData(),d,i,E,F,D,b=0,e=null,k=[];while(b<c.length){d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}i=parseInt(c.substring(b,d),10);if(i%1!==0){e=this._findText(c,b);break}b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}E=c.substring(b,d);b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}F=c.substring(b,d);b=d+1;if(b+i>=c.length){e=this._findText(c,c.length);break}D=c.substr(b,i);b+=i;if(c.charAt(b)!==\"|\"){e=this._findText(c,b);break}b++;Array.add(k,{type:E,id:F,content:D})}if(e){this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_ParserErrorDetails,e)),h,null);return null}var x=[],w=[],q=[],j=[],t=[],C=[],A=[],z=[],v=[],s=[],m,p,u,n,o,r,y,g;for(var l=0,G=k.length;l<G;l++){var a=k[l];switch(a.type){case \"#\":g=a;break;case \"updatePanel\":Array.add(x,a);break;case \"hiddenField\":Array.add(w,a);break;case \"arrayDeclaration\":Array.add(q,a);break;case \"scriptBlock\":Array.add(j,a);break;case \"fallbackScript\":j[j.length-1].fallback=a.id;case \"scriptStartupBlock\":Array.add(t,a);break;case \"expando\":Array.add(C,a);break;case \"onSubmit\":Array.add(A,a);break;case \"asyncPostBackControlIDs\":m=a;break;case \"postBackControlIDs\":p=a;break;case \"updatePanelIDs\":u=a;break;case \"asyncPostBackTimeout\":n=a;break;case \"childUpdatePanelIDs\":o=a;break;case \"panelsToRefreshIDs\":r=a;break;case \"formAction\":y=a;break;case \"dataItem\":Array.add(z,a);break;case \"dataItemJson\":Array.add(v,a);break;case \"scriptDispose\":Array.add(s,a);break;case \"pageRedirect\":if(g&&parseFloat(g.content)>=4)a.content=unescape(a.content);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var f=document.createElement(\"a\");f.style.display=\"none\";f.attachEvent(\"onclick\",B);f.href=a.content;this._form.parentNode.insertBefore(f,this._form);f.click();f.detachEvent(\"onclick\",B);this._form.parentNode.removeChild(f);function B(a){a.cancelBubble=true}}else window.location.href=a.content;return null;case \"error\":this._endPostBack(this._createPageRequestManagerServerError(Number.parseInvariant(a.id),a.content),h,null);return null;case \"pageTitle\":document.title=a.content;break;case \"focus\":this._controlIDToFocus=a.content;break;default:this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_UnknownToken,a.type)),h,null);return null}}return {version4:g?parseFloat(g.content)>=4:false,executor:h,updatePanelNodes:x,hiddenFieldNodes:w,arrayDeclarationNodes:q,scriptBlockNodes:j,scriptStartupNodes:t,expandoNodes:C,onSubmitNodes:A,dataItemNodes:z,dataItemJsonNodes:v,scriptDisposeNodes:s,asyncPostBackControlIDsNode:m,postBackControlIDsNode:p,updatePanelIDsNode:u,asyncPostBackTimeoutNode:n,childUpdatePanelIDsNode:o,panelsToRefreshNode:r,formActionNode:y}},_processUpdatePanelArrays:function(e,q,r,f){var d,c,b;if(e){var i=e.length,j=f?2:1;d=new Array(i/j);c=new Array(i/j);b=new Array(i/j);for(var g=0,h=0;g<i;g+=j,h++){var p,a=e[g],k=f?e[g+1]:\"\";p=a.charAt(0)===\"t\";a=a.substr(1);if(!k)k=this._uniqueIDToClientID(a);b[h]=p;d[h]=a;c[h]=k}}else{d=[];c=[];b=[]}var n=[],l=[];this._convertToClientIDs(q,n,l,f);var o=[],m=[];this._convertToClientIDs(r,o,m,f);return {updatePanelIDs:d,updatePanelClientIDs:c,updatePanelHasChildrenAsTriggers:b,asyncPostBackControlIDs:n,asyncPostBackControlClientIDs:l,postBackControlIDs:o,postBackControlClientIDs:m}},_queueScripts:function(scriptLoader,scriptBlockNodes,queueIncludes,queueBlocks){for(var i=0,l=scriptBlockNodes.length;i<l;i++){var scriptBlockType=scriptBlockNodes[i].id;switch(scriptBlockType){case \"ScriptContentNoTags\":if(!queueBlocks)continue;scriptLoader.queueScriptBlock(scriptBlockNodes[i].content);break;case \"ScriptContentWithTags\":var scriptTagAttributes;eval(\"scriptTagAttributes = \"+scriptBlockNodes[i].content);if(scriptTagAttributes.src){if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(scriptTagAttributes.src))continue}else if(!queueBlocks)continue;scriptLoader.queueCustomScriptTag(scriptTagAttributes);break;case \"ScriptPath\":var script=scriptBlockNodes[i];if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(script.content))continue;scriptLoader.queueScriptReference(script.content,script.fallback)}}},_registerDisposeScript:function(a,b){if(!this._scriptDisposes[a])this._scriptDisposes[a]=[b];else Array.add(this._scriptDisposes[a],b)},_scriptIncludesLoadComplete:function(e,b){if(b.executor.get_webRequest()!==this._request)return;this._commitControls(b.updatePanelData,b.asyncPostBackTimeoutNode?b.asyncPostBackTimeoutNode.content:null);if(b.formActionNode)this._form.action=b.formActionNode.content;var a,d,c;for(a=0,d=b.updatePanelNodes.length;a<d;a++){c=b.updatePanelNodes[a];var j=document.getElementById(c.id);if(!j){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,c.id)),b.executor,b);return}this._updatePanel(j,c.content)}for(a=0,d=b.scriptDisposeNodes.length;a<d;a++){c=b.scriptDisposeNodes[a];this._registerDisposeScript(c.id,c.content)}for(a=0,d=this._transientFields.length;a<d;a++){var g=document.getElementById(this._transientFields[a]);if(g){var k=g._isContained?g.parentNode:g;k.parentNode.removeChild(k)}}for(a=0,d=b.hiddenFieldNodes.length;a<d;a++){c=b.hiddenFieldNodes[a];this._createHiddenField(c.id,c.content)}if(b.scriptsFailed)throw Sys._ScriptLoader._errorScriptLoadFailed(b.scriptsFailed.src,b.scriptsFailed.multipleCallbacks);this._queueScripts(e,b.scriptBlockNodes,false,true);var i=\"\";for(a=0,d=b.arrayDeclarationNodes.length;a<d;a++){c=b.arrayDeclarationNodes[a];i+=\"Sys.WebForms.PageRequestManager._addArrayElement('\"+c.id+\"', \"+c.content+\");\\r\\n\"}var h=\"\";for(a=0,d=b.expandoNodes.length;a<d;a++){c=b.expandoNodes[a];h+=c.id+\" = \"+c.content+\"\\r\\n\"}if(i.length)e.queueScriptBlock(i);if(h.length)e.queueScriptBlock(h);this._queueScripts(e,b.scriptStartupNodes,true,true);var f=\"\";for(a=0,d=b.onSubmitNodes.length;a<d;a++){if(a===0)f=\"Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, function() {\\r\\n\";f+=b.onSubmitNodes[a].content+\"\\r\\n\"}if(f.length){f+=\"\\r\\nreturn true;\\r\\n});\\r\\n\";e.queueScriptBlock(f)}e.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptsLoadComplete,b)),null,null)},_scriptIncludesLoadFailed:function(d,c,b,a){a.scriptsFailed={src:c.src,multipleCallbacks:b};this._scriptIncludesLoadComplete(d,a)},_scriptsLoadComplete:function(f,c){var e=c.executor;if(window.__theFormPostData)window.__theFormPostData=\"\";if(window.__theFormPostCollection)window.__theFormPostCollection=[];if(window.WebForm_InitCallback)window.WebForm_InitCallback();if(this._scrollPosition){if(window.scrollTo)window.scrollTo(this._scrollPosition.x,this._scrollPosition.y);this._scrollPosition=null}Sys.Application.endCreateComponents();this._pageLoaded(false,c);this._endPostBack(null,e,c);if(this._controlIDToFocus){var a,d;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var b=$get(this._controlIDToFocus);a=b;if(b&&!WebForm_CanFocus(b))a=WebForm_FindFirstFocusableChild(b);if(a&&typeof a.contentEditable!==\"undefined\"){d=a.contentEditable;a.contentEditable=false}else a=null}WebForm_AutoFocus(this._controlIDToFocus);if(a)a.contentEditable=d;this._controlIDToFocus=null}},_splitNodeIntoArray:function(b){var a=b.content,c=a.length?a.split(\",\"):[];return c},_uniqueIDToClientID:function(a){return a.replace(/\\$/g,\"_\")},_updateControls:function(d,a,c,b,e){this._commitControls(this._processUpdatePanelArrays(d,a,c,e),b)},_updatePanel:function(updatePanelElement,rendering){for(var updatePanelID in this._scriptDisposes)if(this._elementContains(updatePanelElement,document.getElementById(updatePanelID))){var disposeScripts=this._scriptDisposes[updatePanelID];for(var i=0,l=disposeScripts.length;i<l;i++)eval(disposeScripts[i]);delete this._scriptDisposes[updatePanelID]}Sys.Application.disposeElement(updatePanelElement,true);updatePanelElement.innerHTML=rendering},_validPosition:function(a){return typeof a!==\"undefined\"&&a!==null&&a!==0}};Sys.WebForms.PageRequestManager.getInstance=function(){var a=Sys.WebForms.PageRequestManager._instance;if(!a)a=Sys.WebForms.PageRequestManager._instance=new Sys.WebForms.PageRequestManager;return a};Sys.WebForms.PageRequestManager._addArrayElement=function(a){if(!window[a])window[a]=[];for(var b=1,c=arguments.length;b<c;b++)Array.add(window[a],arguments[b])};Sys.WebForms.PageRequestManager._initialize=function(){var a=Sys.WebForms.PageRequestManager.getInstance();a._initializeInternal.apply(a,arguments)};Sys.WebForms.PageRequestManager.registerClass(\"Sys.WebForms.PageRequestManager\");Sys.UI._UpdateProgress=function(a){Sys.UI._UpdateProgress.initializeBase(this,[a]);this._displayAfter=500;this._dynamicLayout=true;this._associatedUpdatePanelId=null;this._beginRequestHandlerDelegate=null;this._startDelegate=null;this._endRequestHandlerDelegate=null;this._pageRequestManager=null;this._timerCookie=null};Sys.UI._UpdateProgress.prototype={get_displayAfter:function(){return this._displayAfter},set_displayAfter:function(a){this._displayAfter=a},get_dynamicLayout:function(){return this._dynamicLayout},set_dynamicLayout:function(a){this._dynamicLayout=a},get_associatedUpdatePanelId:function(){return this._associatedUpdatePanelId},set_associatedUpdatePanelId:function(a){this._associatedUpdatePanelId=a},get_role:function(){return \"status\"},_clearTimeout:function(){if(this._timerCookie){window.clearTimeout(this._timerCookie);this._timerCookie=null}},_getUniqueID:function(b){var a=Array.indexOf(this._pageRequestManager._updatePanelClientIDs,b);return a===-1?null:this._pageRequestManager._updatePanelIDs[a]},_handleBeginRequest:function(f,e){var b=e.get_postBackElement(),a=true,d=this._associatedUpdatePanelId;if(this._associatedUpdatePanelId){var c=e.get_updatePanelsToUpdate();if(c&&c.length)a=Array.contains(c,d)||Array.contains(c,this._getUniqueID(d));else a=false}while(!a&&b){if(b.id&&this._associatedUpdatePanelId===b.id)a=true;b=b.parentNode}if(a)this._timerCookie=window.setTimeout(this._startDelegate,this._displayAfter)},_startRequest:function(){if(this._pageRequestManager.get_isInAsyncPostBack()){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"block\";else a.style.visibility=\"visible\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"false\")}this._timerCookie=null},_handleEndRequest:function(){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"none\";else a.style.visibility=\"hidden\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"true\");this._clearTimeout()},dispose:function(){if(this._beginRequestHandlerDelegate!==null){this._pageRequestManager.remove_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);this._beginRequestHandlerDelegate=null;this._endRequestHandlerDelegate=null}this._clearTimeout();Sys.UI._UpdateProgress.callBaseMethod(this,\"dispose\")},initialize:function(){Sys.UI._UpdateProgress.callBaseMethod(this,\"initialize\");if(this.get_role()===\"status\")this.get_element().setAttribute(\"aria-hidden\",\"true\");this._beginRequestHandlerDelegate=Function.createDelegate(this,this._handleBeginRequest);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);this._startDelegate=Function.createDelegate(this,this._startRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null){this._pageRequestManager.add_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate)}}};Sys.UI._UpdateProgress.registerClass(\"Sys.UI._UpdateProgress\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebServices.js\nType._registerScript(\"MicrosoftAjaxWebServices.js\",[\"MicrosoftAjaxNetwork.js\"]);Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Menu.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/Menu.js\nvar __rootMenuItem;\nvar __menuInterval;\nvar __scrollPanel;\nvar __disappearAfter = 500;\nfunction Menu_ClearInterval() {\n    if (__menuInterval) {\n        window.clearInterval(__menuInterval);\n    }\n}\nfunction Menu_Collapse(item) {\n    Menu_SetRoot(item);\n    if (__rootMenuItem) {\n        Menu_ClearInterval();\n        if (__disappearAfter >= 0) {\n            __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n        }\n    }\n}\nfunction Menu_Expand(item, horizontalOffset, verticalOffset, hideScrollers) {\n    Menu_ClearInterval();\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    var horizontal = true;\n    if (!tr.id) {\n        horizontal = false;\n        tr = tr.parentNode;\n    }\n    var child = Menu_FindSubMenu(item);\n    if (child) {\n        var data = Menu_GetData(item);\n        if (!data) {\n            return null;\n        }\n        child.rel = tr.id;\n        child.x = horizontalOffset;\n        child.y = verticalOffset;\n        if (horizontal) child.pos = \"bottom\";\n        PopOut_Show(child.id, hideScrollers, data);\n    }\n    Menu_SetRoot(item);\n    if (child) {\n        if (!document.body.__oldOnClick && document.body.onclick) {\n            document.body.__oldOnClick = document.body.onclick;\n        }\n        if (__rootMenuItem) {\n            document.body.onclick = Menu_HideItems;\n        }\n    }\n    Menu_ResetSiblings(tr);\n    return child;\n}\nfunction Menu_FindMenu(item) {\n    if (item && item.menu) return item.menu;\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr = tr.parentNode;\n    }\n    for (var i = tr.id.length - 1; i >= 0; i--) {\n        if (tr.id.charAt(i) < '0' || tr.id.charAt(i) > '9') {\n            var menu = WebForm_GetElementById(tr.id.substr(0, i));\n            if (menu) {\n                item.menu = menu;\n                return menu;\n            }\n        }\n    }\n    return null;\n}\nfunction Menu_FindNext(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var first = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        var match = false;\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (Menu_FindParentContainer(link) == parent) {\n                    if (match) {\n                        return link;\n                    }\n                    else if (!first) {\n                        first = link;\n                    }\n                }\n                if (!match && link == a) {\n                    match = true;\n                }\n            }\n        }\n    }\n    return first;\n}\nfunction Menu_FindParentContainer(item) {\n    if (item.menu_ParentContainerCache) return item.menu_ParentContainerCache;\n    var a = (item.tagName.toLowerCase() == \"a\") ? item : WebForm_GetElementByTagName(item, \"A\");\n    var menu = Menu_FindMenu(a);\n    if (menu) {\n        var parent = item;\n        while (parent && parent.tagName &&\n            parent.id != menu.id &&\n            parent.tagName.toLowerCase() != \"div\") {\n            parent = parent.parentNode;\n        }\n        item.menu_ParentContainerCache = parent;\n        return parent;\n    }\n}\nfunction Menu_FindParentItem(item) {\n    var parentContainer = Menu_FindParentContainer(item);\n    var parentContainerID = parentContainer.id;\n    var len = parentContainerID.length;\n    if (parentContainerID && parentContainerID.substr(len - 5) == \"Items\") {\n        var parentItemID = parentContainerID.substr(0, len - 5);\n        return WebForm_GetElementById(parentItemID);\n    }\n    return null;\n}\nfunction Menu_FindPrevious(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var last = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (link == a && last) {\n                    return last;\n                }\n                if (Menu_FindParentContainer(link) == parent) {\n                    last = link;\n                }\n            }\n        }\n    }\n    return last;\n}\nfunction Menu_FindSubMenu(item) {\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr=tr.parentNode;\n    }\n    return WebForm_GetElementById(tr.id + \"Items\");\n}\nfunction Menu_Focus(item) {\n    if (item && item.focus) {\n        var pos = WebForm_GetElementPosition(item);\n        var parentContainer = Menu_FindParentContainer(item);\n        if (!parentContainer.offset) {\n            parentContainer.offset = 0;\n        }\n        var posParent = WebForm_GetElementPosition(parentContainer);\n        var delta;\n        if (pos.y + pos.height > posParent.y + parentContainer.offset + parentContainer.clippedHeight) {\n            delta = pos.y + pos.height - posParent.y - parentContainer.offset - parentContainer.clippedHeight;\n            PopOut_Scroll(parentContainer, delta);\n        }\n        else if (pos.y < posParent.y + parentContainer.offset) {\n            delta = posParent.y + parentContainer.offset - pos.y;\n            PopOut_Scroll(parentContainer, -delta);\n        }\n        PopOut_HideScrollers(parentContainer);\n        item.focus();\n    }\n}\nfunction Menu_GetData(item) {\n    if (!item.data) {\n        var a = (item.tagName.toLowerCase() == \"a\" ? item : WebForm_GetElementByTagName(item, \"a\"));\n        var menu = Menu_FindMenu(a);\n        try {\n            item.data = eval(menu.id + \"_Data\");\n        }\n        catch(e) {}\n    }\n    return item.data;\n}\nfunction Menu_HideItems(items) {\n    if (document.body.__oldOnClick) {\n        document.body.onclick = document.body.__oldOnClick;\n        document.body.__oldOnClick = null;\n    }\n    Menu_ClearInterval();\n    if (!items || ((typeof(items.tagName) == \"undefined\") && (items instanceof Event))) {\n        items = __rootMenuItem;\n    }\n    var table = items;\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        table = WebForm_GetElementByTagName(table, \"TABLE\");\n    }\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        return;\n    }\n    var rows = table.rows ? table.rows : table.firstChild.rows;\n    var isVertical = false;\n    for (var r = 0; r < rows.length; r++) {\n        if (rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, nextLevel;\n    if (isVertical) {\n        for(i = 0; i < rows.length; i++) {\n            if (rows[i].id) {\n                child = WebForm_GetElementById(rows[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else if (rows[i].cells[0]) {\n                nextLevel = WebForm_GetElementByTagName(rows[i].cells[0], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(nextLevel);\n                }\n            }\n        }\n    }\n    else if (rows[0]) {\n        for(i = 0; i < rows[0].cells.length; i++) {\n            if (rows[0].cells[i].id) {\n                child = WebForm_GetElementById(rows[0].cells[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else {\n                nextLevel = WebForm_GetElementByTagName(rows[0].cells[i], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(rows[0].cells[i].firstChild);\n                }\n            }\n        }\n    }\n    if (items && items.id) {\n        PopOut_Hide(items.id);\n    }\n}\nfunction Menu_HoverDisabled(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    node = WebForm_GetElementByTagName(node, \"table\").rows[0].cells[0].childNodes[0];\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverDynamic(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.hoverClass) {\n        nodeTable.hoverClass = data.hoverClass;\n        WebForm_AppendToClassName(nodeTable, data.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.hoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n    }\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverRoot(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) {\n        return null;\n    }\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.staticHoverClass) {\n        nodeTable.hoverClass = data.staticHoverClass;\n        WebForm_AppendToClassName(nodeTable, data.staticHoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.staticHoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.staticHoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.staticHoverHyperLinkClass);\n    }\n    return node;\n}\nfunction Menu_HoverStatic(item) {\n    var node = Menu_HoverRoot(item);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    __disappearAfter = data.disappearAfter;\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_IsHorizontal(item) {\n    if (item) {\n        var a = ((item.tagName && (item.tagName.toLowerCase == \"a\")) ? item : WebForm_GetElementByTagName(item, \"A\"));\n        if (!a) {\n            return false;\n        }\n        var td = a.parentNode.parentNode.parentNode.parentNode.parentNode;\n        if (td.id) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction Menu_IsSelectable(link) {\n    return (link && link.href)\n}\nfunction Menu_Key(item) {\n    var event;\n    if (item.currentTarget) {\n        event = item;\n        item = event.currentTarget;\n    }\n    else {\n        event = window.event;        \n    }\n    var key = (event ? event.keyCode : -1);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var horizontal = Menu_IsHorizontal(item);\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var nextItem, parentItem, previousItem;\n    if ((!horizontal && key == 38) || (horizontal && key == 37)) {\n        previousItem = Menu_FindPrevious(item);\n        while (previousItem && previousItem.disabled) {\n            previousItem = Menu_FindPrevious(previousItem);\n        }\n        if (previousItem) {\n            Menu_Focus(previousItem);\n            Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 40) || (horizontal && key == 39)) {\n        if (horizontal) {\n            var subMenu = Menu_FindSubMenu(a);\n            if (subMenu && subMenu.style && subMenu.style.visibility && \n                subMenu.style.visibility.toLowerCase() == \"hidden\") {\n                Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        nextItem = Menu_FindNext(item);\n        while (nextItem && nextItem.disabled) {\n            nextItem = Menu_FindNext(nextItem);\n        }\n        if (nextItem) {\n            Menu_Focus(nextItem);\n            Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 39) || (horizontal && key == 40)) {\n        var children = Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n        if (children) {\n            var firstChild;\n            children = WebForm_GetElementsByTagName(children, \"A\");\n            for (var i = 0; i < children.length; i++) {\n                if (!children[i].disabled && Menu_IsSelectable(children[i])) {\n                    firstChild = children[i];\n                    break;\n                }\n            }\n            if (firstChild) {\n                Menu_Focus(firstChild);\n                Menu_Expand(firstChild, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        else {\n            parentItem = Menu_FindParentItem(item);\n            while (parentItem && !Menu_IsHorizontal(parentItem)) {\n                parentItem = Menu_FindParentItem(parentItem);\n            }\n            if (parentItem) {\n                nextItem = Menu_FindNext(parentItem);\n                while (nextItem && nextItem.disabled) {\n                    nextItem = Menu_FindNext(nextItem);\n                }\n                if (nextItem) {\n                    Menu_Focus(nextItem);\n                    Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n        }\n    }\n    if ((!horizontal && key == 37) || (horizontal && key == 38)) {\n        parentItem = Menu_FindParentItem(item);\n        if (parentItem) {\n            if (Menu_IsHorizontal(parentItem)) {\n                previousItem = Menu_FindPrevious(parentItem);\n                while (previousItem && previousItem.disabled) {\n                    previousItem = Menu_FindPrevious(previousItem);\n                }\n                if (previousItem) {\n                    Menu_Focus(previousItem);\n                    Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n            var parentA = WebForm_GetElementByTagName(parentItem, \"A\");\n            if (parentA) {\n                Menu_Focus(parentA);\n            }\n            Menu_ResetSiblings(parentItem);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if (key == 27) {\n        Menu_HideItems();\n        event.cancelBubble = true;\n        if (event.stopPropagation) event.stopPropagation();\n        return;\n    }\n}\nfunction Menu_ResetSiblings(item) {\n    var table = (item.tagName.toLowerCase() == \"td\") ?\n        item.parentNode.parentNode.parentNode :\n        item.parentNode.parentNode;\n    var isVertical = false;\n    for (var r = 0; r < table.rows.length; r++) {\n        if (table.rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, childNode;\n    if (isVertical) {\n        for(i = 0; i < table.rows.length; i++) {\n            childNode = table.rows[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    else {\n        for(i = 0; i < table.rows[0].cells.length; i++) {\n            childNode = table.rows[0].cells[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    Menu_ResetTopMenus(table, table, 0, true);\n}\nfunction Menu_ResetTopMenus(table, doNotReset, level, up) {\n    var i, child, childNode;\n    if (up && table.id == \"\") {\n        var parentTable = table.parentNode.parentNode.parentNode.parentNode;\n        if (parentTable.tagName.toLowerCase() == \"table\") {\n            Menu_ResetTopMenus(parentTable, doNotReset, level + 1, true);\n        }\n    }\n    else {\n        if (level == 0 && table != doNotReset) {\n            if (table.rows[0].id) {\n                for(i = 0; i < table.rows.length; i++) {\n                    childNode = table.rows[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n            else {\n                for(i = 0; i < table.rows[0].cells.length; i++) {\n                    childNode = table.rows[0].cells[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n        }\n        else if (level > 0) {\n            for (i = 0; i < table.rows.length; i++) {\n                for (var j = 0; j < table.rows[i].cells.length; j++) {\n                    var subTable = table.rows[i].cells[j].firstChild;\n                    if (subTable && subTable.tagName.toLowerCase() == \"table\") {\n                        Menu_ResetTopMenus(subTable, doNotReset, level - 1, false);\n                    }\n                }\n            }\n        }\n    }\n}\nfunction Menu_RestoreInterval() {\n    if (__menuInterval && __rootMenuItem) {\n        Menu_ClearInterval();\n        __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n    }\n}\nfunction Menu_SetRoot(item) {\n    var newRoot = Menu_FindMenu(item);\n    if (newRoot) {\n        if (__rootMenuItem && __rootMenuItem != newRoot) {\n            Menu_HideItems();\n        }\n        __rootMenuItem = newRoot;\n    }\n}\nfunction Menu_Unhover(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (nodeTable.hoverClass) {\n        WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (node.hoverHyperLinkClass) {\n        WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n    }\n    Menu_Collapse(node);\n}\nfunction PopOut_Clip(element, y, height) {\n    if (element && element.style) {\n        element.style.clip = \"rect(\" + y + \"px auto \" + (y + height) + \"px auto)\";\n        element.style.overflow = \"hidden\";\n    }\n}\nfunction PopOut_Down(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && ((panel.offset + panel.clippedHeight) < panel.physicalHeight)) {\n        PopOut_Scroll(panel, 2)\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Down()\", 8);\n    }\n    else {\n        PopOut_ShowScrollers(panel);\n    }\n}\nfunction PopOut_Hide(panelId) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"hidden\";\n        panel.style.display = \"none\";\n        panel.offset = 0;\n        panel.scrollTop = 0;\n        var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n        if (table) {\n            WebForm_SetElementY(table, 0);\n        }\n        if (window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" &&\n            !window.opera) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            if (childFrame) {\n                childFrame.style.display = \"none\";\n            }\n        }\n    }\n}\nfunction PopOut_HideScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        if (up) {\n            up.style.visibility = \"hidden\";\n            up.style.display = \"none\";\n        }\n        if (dn) {\n            dn.style.visibility = \"hidden\";\n            dn.style.display = \"none\";\n        }\n    }\n}\nfunction PopOut_Position(panel, hideScrollers) {\n    if (window.opera) {\n        panel.parentNode.removeChild(panel);\n        document.forms[0].appendChild(panel);\n    }\n    var rel = WebForm_GetElementById(panel.rel);\n    var relTable = WebForm_GetElementByTagName(rel, \"TABLE\");\n    var relCoordinates = WebForm_GetElementPosition(relTable ? relTable : rel);\n    var panelCoordinates = WebForm_GetElementPosition(panel);\n    var panelHeight = ((typeof(panel.physicalHeight) != \"undefined\") && (panel.physicalHeight != null)) ?\n        panel.physicalHeight :\n        panelCoordinates.height;\n    panel.physicalHeight = panelHeight;\n    var panelParentCoordinates;\n    if (panel.offsetParent) {\n        panelParentCoordinates = WebForm_GetElementPosition(panel.offsetParent);\n    }\n    else {\n        panelParentCoordinates = new Object();\n        panelParentCoordinates.x = 0;\n        panelParentCoordinates.y = 0;\n    }\n    var overflowElement = WebForm_GetElementById(\"__overFlowElement\");\n    if (!overflowElement) {\n        overflowElement = document.createElement(\"img\");\n        overflowElement.id=\"__overFlowElement\";\n        WebForm_SetElementWidth(overflowElement, 1);\n        document.body.appendChild(overflowElement);\n    }\n    WebForm_SetElementHeight(overflowElement, panelHeight + relCoordinates.y + parseInt(panel.y ? panel.y : 0));\n    overflowElement.style.visibility = \"visible\";\n    overflowElement.style.display = \"inline\";\n    var clientHeight = 0;\n    var clientWidth = 0;\n    if (window.innerHeight) {\n        clientHeight = window.innerHeight;\n        clientWidth = window.innerWidth;\n    }\n    else if (document.documentElement && document.documentElement.clientHeight) {\n        clientHeight = document.documentElement.clientHeight;\n        clientWidth = document.documentElement.clientWidth;\n    }\n    else if (document.body && document.body.clientHeight) {\n        clientHeight = document.body.clientHeight;\n        clientWidth = document.body.clientWidth;\n    }\n    var scrollTop = 0;\n    var scrollLeft = 0;\n    if (typeof(window.pageYOffset) != \"undefined\") {\n        scrollTop = window.pageYOffset;\n        scrollLeft = window.pageXOffset;\n    }\n    else if (document.documentElement && (typeof(document.documentElement.scrollTop) != \"undefined\")) {\n        scrollTop = document.documentElement.scrollTop;\n        scrollLeft = document.documentElement.scrollLeft;\n    }\n    else if (document.body && (typeof(document.body.scrollTop) != \"undefined\")) {\n        scrollTop = document.body.scrollTop;\n        scrollLeft = document.body.scrollLeft;\n    }\n    overflowElement.style.visibility = \"hidden\";\n    overflowElement.style.display = \"none\";\n    var bottomWindowBorder = clientHeight + scrollTop;\n    var rightWindowBorder = clientWidth + scrollLeft;\n    var position = panel.pos;\n    if ((typeof(position) == \"undefined\") || (position == null) || (position == \"\")) {\n        position = (WebForm_GetElementDir(rel) == \"rtl\" ? \"middleleft\" : \"middleright\");\n    }\n    position = position.toLowerCase();\n    var y = relCoordinates.y + parseInt(panel.y ? panel.y : 0) - panelParentCoordinates.y;\n    var borderParent = (rel && rel.parentNode && rel.parentNode.parentNode && rel.parentNode.parentNode.parentNode\n        && rel.parentNode.parentNode.parentNode.tagName.toLowerCase() == \"div\") ?\n        rel.parentNode.parentNode.parentNode : null;\n    WebForm_SetElementY(panel, y);\n    PopOut_SetPanelHeight(panel, panelHeight, true);\n    var clip = false;\n    var overflow;\n    if (position.indexOf(\"top\") != -1) {\n        y -= panelHeight;\n        WebForm_SetElementY(panel, y); \n        if (y < -panelParentCoordinates.y) {\n            y = -panelParentCoordinates.y;\n            WebForm_SetElementY(panel, y); \n            if (panelHeight > clientHeight - 2) {\n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    else {\n        if (position.indexOf(\"bottom\") != -1) {\n            y += relCoordinates.height;\n            WebForm_SetElementY(panel, y); \n        }\n        overflow = y + panelParentCoordinates.y + panelHeight - bottomWindowBorder;\n        if (overflow > 0) {\n            y -= overflow;\n            WebForm_SetElementY(panel, y); \n            if (y < -panelParentCoordinates.y) {\n                y = 2 - panelParentCoordinates.y + scrollTop;\n                WebForm_SetElementY(panel, y); \n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    if (!clip) {\n        PopOut_SetPanelHeight(panel, panel.clippedHeight, true);\n    }\n    var panelParentOffsetY = 0;\n    if (panel.offsetParent) {\n        panelParentOffsetY = WebForm_GetElementPosition(panel.offsetParent).y;\n    }\n    var panelY = ((typeof(panel.originY) != \"undefined\") && (panel.originY != null)) ?\n        panel.originY :\n        y - panelParentOffsetY;\n    panel.originY = panelY;\n    if (!hideScrollers) {\n        PopOut_ShowScrollers(panel);\n    }\n    else {\n        PopOut_HideScrollers(panel);\n    }\n    var x = relCoordinates.x + parseInt(panel.x ? panel.x : 0) - panelParentCoordinates.x;\n    if (borderParent && borderParent.clientLeft) {\n        x += 2 * borderParent.clientLeft;\n    }\n    WebForm_SetElementX(panel, x);\n    if (position.indexOf(\"left\") != -1) {\n        x -= panelCoordinates.width;\n        WebForm_SetElementX(panel, x);\n        if (x < -panelParentCoordinates.x) {\n            WebForm_SetElementX(panel, -panelParentCoordinates.x);\n        }\n    }\n    else {\n        if (position.indexOf(\"right\") != -1) {\n            x += relCoordinates.width;\n            WebForm_SetElementX(panel, x);\n        }\n        overflow = x + panelParentCoordinates.x + panelCoordinates.width - rightWindowBorder;\n        if (overflow > 0) {\n            if (position.indexOf(\"bottom\") == -1 && relCoordinates.x > panelCoordinates.width) {\n                x -= relCoordinates.width + panelCoordinates.width;\n            }\n            else {\n                x -= overflow;\n            }\n            WebForm_SetElementX(panel, x);\n            if (x < -panelParentCoordinates.x) {\n                WebForm_SetElementX(panel, -panelParentCoordinates.x);\n            }\n        }\n    }\n}\nfunction PopOut_Scroll(panel, offsetDelta) {\n    var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n    if (!table) return;\n    table.style.position = \"relative\";\n    var tableY = (table.style.top ? parseInt(table.style.top) : 0);\n    panel.offset += offsetDelta;\n    WebForm_SetElementY(table, tableY - offsetDelta);\n}\nfunction PopOut_SetPanelHeight(element, height, doNotClip) {\n    if (element && element.style) {\n        var size = WebForm_GetElementPosition(element);\n        element.physicalWidth = size.width;\n        element.clippedHeight = height;\n        WebForm_SetElementHeight(element, height - (element.clientTop ? (2 * element.clientTop) : 0));\n        if (doNotClip && element.style) {\n            element.style.clip = \"rect(auto auto auto auto)\";\n        }\n        else {\n            PopOut_Clip(element, 0, height);\n        }\n    }\n}\nfunction PopOut_Show(panelId, hideScrollers, data) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"visible\";\n        panel.style.display = \"inline\";\n        if (!panel.offset || hideScrollers) {\n            panel.scrollTop = 0;\n            panel.offset = 0;\n            var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n            if (table) {\n                WebForm_SetElementY(table, 0);\n            }\n        }\n        PopOut_Position(panel, hideScrollers);\n        var z = 1;\n        var isIE = window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" && !window.opera;\n        if (isIE && data) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            var parent = panel.offsetParent;\n            if (!childFrame) {\n                childFrame = document.createElement(\"iframe\");\n                childFrame.id = childFrameId;\n                childFrame.src = (data.iframeUrl ? data.iframeUrl : \"about:blank\");\n                childFrame.style.position = \"absolute\";\n                childFrame.style.display = \"none\";\n                childFrame.scrolling = \"no\";\n                childFrame.frameBorder = \"0\";\n                if (parent.tagName.toLowerCase() == \"html\") {\n                    document.body.appendChild(childFrame);\n                }\n                else {\n                    parent.appendChild(childFrame);\n                }\n            }\n            var pos = WebForm_GetElementPosition(panel);\n            var parentPos = WebForm_GetElementPosition(parent);\n            WebForm_SetElementX(childFrame, pos.x - parentPos.x);\n            WebForm_SetElementY(childFrame, pos.y - parentPos.y);\n            WebForm_SetElementWidth(childFrame, pos.width);\n            WebForm_SetElementHeight(childFrame, pos.height);\n            childFrame.style.display = \"block\";\n            if (panel.currentStyle && panel.currentStyle.zIndex && panel.currentStyle.zIndex != \"auto\") {\n                z = panel.currentStyle.zIndex;\n            }\n            else if (panel.style.zIndex) {\n                z = panel.style.zIndex;\n            }\n        }\n        panel.style.zIndex = z;\n    }\n}\nfunction PopOut_ShowScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        var cnt = 0;\n        if (up && dn) {\n            if (panel.offset && panel.offset > 0) {\n                up.style.visibility = \"visible\";\n                up.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(up, panel.clientWidth\n                        - (up.clientLeft ? (2 * up.clientLeft) : 0));\n                }\n                WebForm_SetElementY(up, 0);\n            }\n            else {\n                up.style.visibility = \"hidden\";\n                up.style.display = \"none\";\n            }\n            if (panel.offset + panel.clippedHeight + 2 <= panel.physicalHeight) {\n                dn.style.visibility = \"visible\";\n                dn.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(dn, panel.clientWidth\n                        - (dn.clientLeft ? (2 * dn.clientLeft) : 0));\n                }\n                WebForm_SetElementY(dn, panel.clippedHeight - WebForm_GetElementPosition(dn).height\n                    - (panel.clientTop ? (2 * panel.clientTop) : 0));\n            }\n            else {\n                dn.style.visibility = \"hidden\";\n                dn.style.display = \"none\";\n            }\n            if (cnt == 0) {\n                panel.style.clip = \"rect(auto auto auto auto)\";\n            }\n        }\n    }\n}\nfunction PopOut_Stop() {\n    if (__scrollPanel && __scrollPanel.interval) {\n        window.clearInterval(__scrollPanel.interval);\n    }\n    Menu_RestoreInterval();\n}\nfunction PopOut_Up(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && panel.offset && panel.offset > 0) {\n        PopOut_Scroll(panel, -2);\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Up()\", 8);\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MenuStandards.js",
    "content": "﻿//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MenuStandards.js\nif (!window.Sys) { window.Sys = {}; }\nif (!Sys.WebForms) { Sys.WebForms = {}; }\nSys.WebForms.Menu = function(options) {\n    this.items = [];\n    this.depth = options.depth || 1;\n    this.parentMenuItem = options.parentMenuItem;\n    this.element = Sys.WebForms.Menu._domHelper.getElement(options.element);\n    if (this.element.tagName === 'DIV') {\n        var containerElement = this.element;\n        this.element = Sys.WebForms.Menu._domHelper.firstChild(containerElement);\n        this.element.tabIndex = options.tabIndex || 0;\n        options.element = containerElement;\n        options.menu = this;\n        this.container = new Sys.WebForms._MenuContainer(options);\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    else {\n        this.container = options.container;\n        this.keyMap = options.keyMap;\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    if (this.parentMenuItem && this.parentMenuItem.parentMenu) {\n        this.parentMenu = this.parentMenuItem.parentMenu;\n        this.rootMenu = this.parentMenu.rootMenu;\n        if (!this.element.id) {\n            this.element.id = (this.container.element.id || 'menu') + ':submenu:' + Sys.WebForms.Menu._elementObjectMapper._computedId;\n        }\n        if (this.depth > this.container.staticDisplayLevels) {\n            this.displayMode = \"dynamic\";\n            this.element.style.display = \"none\";\n            this.element.style.position = \"absolute\";\n            if (this.rootMenu && this.container.orientation === 'horizontal' && this.parentMenu.isStatic()) {\n                this.element.style.top = \"100%\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"0px\";\n                }\n                else {\n                    this.element.style.left = \"0px\";\n                }\n            }\n            else {\n                this.element.style.top = \"0px\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"100%\";\n                }\n                else {\n                    this.element.style.left = \"100%\";\n                }\n            }\n            if (this.container.rightToLeft) {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n            }\n            else {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n            }\n        }\n        else {\n            this.displayMode = \"static\";\n            this.element.style.display = \"block\";\n            if (this.container.orientation === 'horizontal') {\n                Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n            }\n        }\n    }\n    Sys.WebForms.Menu._domHelper.appendCssClass(this.element, this.displayMode);\n    var children = this.element.childNodes;\n    var count = children.length;\n    for (var i = 0; i < count; i++) {\n        var node = children[i];\n        if (node.nodeType !== 1) {   \n            continue;\n        }\n        var topLevelMenuItem = null;\n        if (this.parentMenuItem) {\n            topLevelMenuItem = this.parentMenuItem.topLevelMenuItem;\n        }\n        var menuItem = new Sys.WebForms.MenuItem(this, node, topLevelMenuItem);\n        var previousMenuItem = this.items[this.items.length - 1];\n        if (previousMenuItem) {\n            menuItem.previousSibling = previousMenuItem;\n            previousMenuItem.nextSibling = menuItem;\n        }\n        this.items[this.items.length] = menuItem;\n    }\n};\nSys.WebForms.Menu.prototype = {\n    blur: function() { if (this.container) this.container.blur(); },\n    collapse: function() {\n        this.each(function(menuItem) {\n            menuItem.hover(false);\n            menuItem.blur();\n            var childMenu = menuItem.childMenu;\n            if (childMenu) {\n                childMenu.collapse();\n            }\n        });\n        this.hide();\n    },\n    doDispose: function() { this.each(function(item) { item.doDispose(); }); },\n    each: function(fn) {\n        var count = this.items.length;\n        for (var i = 0; i < count; i++) {\n            fn(this.items[i]);\n        }\n    },\n    firstChild: function() { return this.items[0]; },\n    focus: function() { if (this.container) this.container.focus(); },\n    get_displayed: function() { return this.element.style.display !== 'none'; },\n    get_focused: function() {\n        if (this.container) {\n            return this.container.focused;\n        }\n        return false;\n    },\n    handleKeyPress: function(keyCode) {\n        if (this.keyMap.contains(keyCode)) {\n            if (this.container.focusedMenuItem) {\n                this.container.focusedMenuItem.navigate(keyCode);\n                return;\n            }\n            var firstChild = this.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n    },\n    hide: function() {\n        if (!this.get_displayed()) {\n            return;\n        }\n        this.each(function(item) {\n            if (item.childMenu) {\n                item.childMenu.hide();\n            }\n        });\n        if (!this.isRoot()) {\n            if (this.get_focused()) {\n                this.container.navigateTo(this.parentMenuItem);\n            }\n            this.element.style.display = 'none';\n        }\n    },\n    isRoot: function() { return this.rootMenu === this; },\n    isStatic: function() { return this.displayMode === 'static'; },\n    lastChild: function() { return this.items[this.items.length - 1]; },\n    show: function() { this.element.style.display = 'block'; }\n};\nif (Sys.WebForms.Menu.registerClass) {\n    Sys.WebForms.Menu.registerClass('Sys.WebForms.Menu');\n}\nSys.WebForms.MenuItem = function(parentMenu, listElement, topLevelMenuItem) {\n    this.keyMap = parentMenu.keyMap;\n    this.parentMenu = parentMenu;\n    this.container = parentMenu.container;\n    this.element = listElement;\n    this.topLevelMenuItem = topLevelMenuItem || this;\n    this._anchor = Sys.WebForms.Menu._domHelper.firstChild(listElement);\n    while (this._anchor && this._anchor.tagName !== 'A') {\n        this._anchor = Sys.WebForms.Menu._domHelper.nextSibling(this._anchor);\n    }\n    if (this._anchor) {\n        this._anchor.tabIndex = -1;\n        var subMenu = this._anchor;\n        while (subMenu && subMenu.tagName !== 'UL') {\n            subMenu = Sys.WebForms.Menu._domHelper.nextSibling(subMenu);\n        }\n        if (subMenu) {\n            this.childMenu = new Sys.WebForms.Menu({ element: subMenu, parentMenuItem: this, depth: parentMenu.depth + 1, container: this.container, keyMap: this.keyMap });\n            if (!this.childMenu.isStatic()) {\n                Sys.WebForms.Menu._domHelper.appendCssClass(this.element, 'has-popup');\n                Sys.WebForms.Menu._domHelper.appendAttributeValue(this.element, 'aria-haspopup', this.childMenu.element.id);\n            }\n        }\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(listElement, this);\n    Sys.WebForms.Menu._domHelper.appendAttributeValue(listElement, 'role', 'menuitem');\n    Sys.WebForms.Menu._domHelper.appendCssClass(listElement, parentMenu.displayMode);\n    if (this._anchor) {\n        Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, parentMenu.displayMode);\n    }\n    this.element.style.position = \"relative\";\n    if (this.parentMenu.depth == 1 && this.container.orientation == 'horizontal') {\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    if (!this.container.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n    }\n};\nSys.WebForms.MenuItem.prototype = {\n    applyUp: function(fn, condition) {\n        condition = condition || function(menuItem) { return menuItem; };\n        var menuItem = this;\n        var lastMenuItem = null;\n        while (condition(menuItem)) {\n            fn(menuItem);\n            lastMenuItem = menuItem;\n            menuItem = menuItem.parentMenu.parentMenuItem;\n        }\n        return lastMenuItem;\n    },\n    blur: function() { this.setTabIndex(-1); },\n    doDispose: function() {\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n        if (this.childMenu) {\n            this.childMenu.doDispose();\n        }\n    },\n    focus: function() {\n        if (!this.parentMenu.get_displayed()) {\n            this.parentMenu.show();\n        }\n        this.setTabIndex(0);\n        this.container.focused = true;\n        this._anchor.focus();\n    },\n    get_highlighted: function() { return /(^|\\s)highlighted(\\s|$)/.test(this._anchor.className); },\n    getTabIndex: function() { return this._anchor.tabIndex; },\n    highlight: function(highlighting) {\n        if (highlighting) {\n            this.applyUp(function(menuItem) {\n                menuItem.parentMenu.parentMenuItem.highlight(true);\n            },\n            function(menuItem) {\n                return !menuItem.parentMenu.isStatic() && menuItem.parentMenu.parentMenuItem;\n            }\n        );\n            Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, 'highlighted');\n        }\n        else {\n            Sys.WebForms.Menu._domHelper.removeCssClass(this._anchor, 'highlighted');\n            this.setTabIndex(-1);\n        }\n    },\n    hover: function(hovering) {\n        if (hovering) {\n            var currentHoveredItem = this.container.hoveredMenuItem;\n            if (currentHoveredItem) {\n                currentHoveredItem.hover(false);\n            }\n            var currentFocusedItem = this.container.focusedMenuItem;\n            if (currentFocusedItem && currentFocusedItem !== this) {\n                currentFocusedItem.hover(false);\n            }\n            this.applyUp(function(menuItem) {\n                if (menuItem.childMenu && !menuItem.childMenu.get_displayed()) {\n                    menuItem.childMenu.show();\n                }\n            });\n            this.container.hoveredMenuItem = this;\n            this.highlight(true);\n        }\n        else {\n            var menuItem = this;\n            while (menuItem) {\n                menuItem.highlight(false);\n                if (menuItem.childMenu) {\n                    if (!menuItem.childMenu.isStatic()) {\n                        menuItem.childMenu.hide();\n                    }\n                }\n                menuItem = menuItem.parentMenu.parentMenuItem;\n            }\n        }\n    },\n    isSiblingOf: function(menuItem) { return menuItem.parentMenu === this.parentMenu; },\n    mouseout: function() {\n        var menuItem = this,\n            id = this.container.pendingMouseoutId,\n            disappearAfter = this.container.disappearAfter;\n        if (id) {\n            window.clearTimeout(id);\n        }\n        if (disappearAfter > -1) {\n            this.container.pendingMouseoutId =\n                window.setTimeout(function() { menuItem.hover(false); }, disappearAfter);\n        }\n    },\n    mouseover: function() {\n        var id = this.container.pendingMouseoutId;\n        if (id) {\n            window.clearTimeout(id);\n            this.container.pendingMouseoutId = null;\n        }\n        this.hover(true);\n        if (this.container.menu.get_focused()) {\n            this.container.navigateTo(this);\n        }\n    },\n    navigate: function(keyCode) {\n        switch (this.keyMap[keyCode]) {\n            case this.keyMap.next:\n                this.navigateNext();\n                break;\n            case this.keyMap.previous:\n                this.navigatePrevious();\n                break;\n            case this.keyMap.child:\n                this.navigateChild();\n                break;\n            case this.keyMap.parent:\n                this.navigateParent();\n                break;\n            case this.keyMap.tab:\n                this.navigateOut();\n                break;\n        }\n    },\n    navigateChild: function() {\n        var subMenu = this.childMenu;\n        if (subMenu) {\n            var firstChild = subMenu.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n        else {\n            if (this.container.orientation === 'horizontal') {\n                var nextItem = this.topLevelMenuItem.nextSibling || this.topLevelMenuItem.parentMenu.firstChild();\n                if (nextItem == this.topLevelMenuItem) {\n                    return;\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(nextItem);\n                if (nextItem.childMenu) {\n                    this.container.navigateTo(nextItem.childMenu.firstChild());\n                }\n            }\n        }\n    },\n    navigateNext: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var nextMenuItem = this.nextSibling;\n        if (!nextMenuItem && this.parentMenu.isRoot()) {\n            nextMenuItem = this.parentMenu.parentMenuItem;\n            if (nextMenuItem) {\n                nextMenuItem = nextMenuItem.nextSibling;\n            }\n        }\n        if (!nextMenuItem) {\n            nextMenuItem = this.parentMenu.firstChild();\n        }\n        if (nextMenuItem) {\n            this.container.navigateTo(nextMenuItem);\n        }\n    },\n    navigateOut: function() {\n        this.parentMenu.blur();\n    },\n    navigateParent: function() {\n        var parentMenu = this.parentMenu,\n            horizontal = this.container.orientation === 'horizontal';\n        if (!parentMenu) return;\n        if (horizontal && this.childMenu && parentMenu.isRoot()) {\n            this.navigateChild();\n            return;\n        }\n        if (parentMenu.parentMenuItem && !parentMenu.isRoot()) {\n            if (horizontal && this.parentMenu.depth === 2) {\n                var previousItem = this.parentMenu.parentMenuItem.previousSibling;\n                if (!previousItem) {\n                    previousItem = this.parentMenu.rootMenu.lastChild();\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(previousItem);\n                if (previousItem.childMenu) {\n                    this.container.navigateTo(previousItem.childMenu.firstChild());\n                }\n            }\n            else {\n                this.parentMenu.hide();\n            }\n        }\n    },\n    navigatePrevious: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var previousMenuItem = this.previousSibling;\n        if (previousMenuItem) {\n            var childMenu = previousMenuItem.childMenu;\n            if (childMenu && childMenu.isRoot()) {\n                previousMenuItem = childMenu.lastChild();\n            }\n        }\n        if (!previousMenuItem && this.parentMenu.isRoot()) {\n            previousMenuItem = this.parentMenu.parentMenuItem;\n        }\n        if (!previousMenuItem) {\n            previousMenuItem = this.parentMenu.lastChild();\n        }\n        if (previousMenuItem) {\n            this.container.navigateTo(previousMenuItem);\n        }\n    },\n    setTabIndex: function(index) { if (this._anchor) this._anchor.tabIndex = index; }\n};\nSys.WebForms.MenuItem._onmouseout = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseout();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.MenuItem._onmouseover = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseover();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.Menu._domHelper = {\n    addEvent: function(element, eventName, fn, useCapture) {\n        if (element.addEventListener) {\n            element.addEventListener(eventName, fn, !!useCapture);\n        }\n        else {\n            element['on' + eventName] = fn;\n        }\n    },\n    appendAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('append', element, name, value);\n    },\n    appendCssClass: function(element, value) {\n        this.updateClassName('append', element, name, value);\n    },\n    appendString: function(getString, setString, value) {\n        var currentValue = getString();\n        if (!currentValue) {\n            setString(value);\n            return;\n        }\n        var regex = this._regexes.getRegex('(^| )' + value + '($| )');\n        if (regex.test(currentValue)) {\n            return;\n        }\n        setString(currentValue + ' ' + value);\n    },\n    cancelEvent: function(e) {\n        var event = e || window.event;\n        if (event) {\n            event.cancelBubble = true;\n            if (event.stopPropagation) {\n                event.stopPropagation();\n            }\n        }\n    },\n    contains: function(ancestor, descendant) {\n        for (; descendant && (descendant !== ancestor); descendant = descendant.parentNode) { }\n        return !!descendant;\n    },\n    firstChild: function(element) {\n        var child = element.firstChild;\n        if (child && child.nodeType !== 1) {   \n            child = this.nextSibling(child);\n        }\n        return child;\n    },\n    getElement: function(elementOrId) { return typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId; },\n    getElementDirection: function(element) {\n        if (element) {\n            if (element.dir) {\n                return element.dir;\n            }\n            return this.getElementDirection(element.parentNode);\n        }\n        return \"ltr\";\n    },\n    getKeyCode: function(event) { return event.keyCode || event.charCode || 0; },\n    insertAfter: function(element, elementToInsert) {\n        var next = element.nextSibling;\n        if (next) {\n            element.parentNode.insertBefore(elementToInsert, next);\n        }\n        else if (element.parentNode) {\n            element.parentNode.appendChild(elementToInsert);\n        }\n    },\n    nextSibling: function(element) {\n        var sibling = element.nextSibling;\n        while (sibling) {\n            if (sibling.nodeType === 1) {   \n                return sibling;\n            }\n            sibling = sibling.nextSibling;\n        }\n    },\n    removeAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('remove', element, name, value);\n    },\n    removeCssClass: function(element, value) {\n        this.updateClassName('remove', element, name, value);\n    },\n    removeEvent: function(element, eventName, fn, useCapture) {\n        if (element.removeEventListener) {\n            element.removeEventListener(eventName, fn, !!useCapture);\n        }\n        else if (element.detachEvent) {\n            element.detachEvent('on' + eventName, fn)\n        }\n        element['on' + eventName] = null;\n    },\n    removeString: function(getString, setString, valueToRemove) {\n        var currentValue = getString();\n        if (currentValue) {\n            var regex = this._regexes.getRegex('(\\\\s|\\\\b)' + valueToRemove + '$|\\\\b' + valueToRemove + '\\\\s+');\n            setString(currentValue.replace(regex, ''));\n        }\n    },\n    setFloat: function(element, direction) {\n        element.style.styleFloat = direction;\n        element.style.cssFloat = direction;\n    },\n    updateAttributeValue: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.getAttribute(name);\n                },\n                function(newValue) {\n                    element.setAttribute(name, newValue);\n                },\n                value\n            );\n    },\n    updateClassName: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.className;\n                },\n                function(newValue) {\n                    element.className = newValue;\n                },\n                value\n            );\n    },\n    _regexes: {\n        getRegex: function(pattern) {\n            var regex = this[pattern];\n            if (!regex) {\n                this[pattern] = regex = new RegExp(pattern);\n            }\n            return regex;\n        }\n    }\n};\nSys.WebForms.Menu._elementObjectMapper = {\n    _computedId: 0,\n    _mappings: {},\n    _mappingIdName: 'Sys.WebForms.Menu.Mapping',\n    getMappedObject: function(element) {\n        var id = element[this._mappingIdName];\n        if (id) {\n            return this._mappings[this._mappingIdName + ':' + id];\n        }\n    },\n    map: function(element, theObject) {\n        var mappedObject = element[this._mappingIdName];\n        if (mappedObject === theObject) {\n            return;\n        }\n        var objectId = element[this._mappingIdName] || element.id || '%' + (++this._computedId); \n        element[this._mappingIdName] = objectId;\n        this._mappings[this._mappingIdName + ':' + objectId] = theObject;\n        theObject.mappingId = objectId;\n    }\n};\nSys.WebForms.Menu._keyboardMapping = new (function() {\n    var LEFT_ARROW = 37;\n    var UP_ARROW = 38;\n    var RIGHT_ARROW = 39;\n    var DOWN_ARROW = 40;\n    var TAB = 9;\n    var ESCAPE = 27;\n    this.vertical = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.vertical[DOWN_ARROW] = this.vertical.next;\n    this.vertical[UP_ARROW] = this.vertical.previous;\n    this.vertical[RIGHT_ARROW] = this.vertical.child;\n    this.vertical[LEFT_ARROW] = this.vertical.parent;\n    this.vertical[TAB] = this.vertical[ESCAPE] = this.vertical.tab;\n    this.verticalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.verticalRtl[DOWN_ARROW] = this.verticalRtl.next;\n    this.verticalRtl[UP_ARROW] = this.verticalRtl.previous;\n    this.verticalRtl[LEFT_ARROW] = this.verticalRtl.child;\n    this.verticalRtl[RIGHT_ARROW] = this.verticalRtl.parent;\n    this.verticalRtl[TAB] = this.verticalRtl[ESCAPE] = this.verticalRtl.tab;\n    this.horizontal = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontal[RIGHT_ARROW] = this.horizontal.next;\n    this.horizontal[LEFT_ARROW] = this.horizontal.previous;\n    this.horizontal[DOWN_ARROW] = this.horizontal.child;\n    this.horizontal[UP_ARROW] = this.horizontal.parent;\n    this.horizontal[TAB] = this.horizontal[ESCAPE] = this.horizontal.tab;\n    this.horizontalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontalRtl[RIGHT_ARROW] = this.horizontalRtl.previous;\n    this.horizontalRtl[LEFT_ARROW] = this.horizontalRtl.next;\n    this.horizontalRtl[DOWN_ARROW] = this.horizontalRtl.child;\n    this.horizontalRtl[UP_ARROW] = this.horizontalRtl.parent;\n    this.horizontalRtl[TAB] = this.horizontalRtl[ESCAPE] = this.horizontalRtl.tab;\n    this.horizontal.contains = this.horizontalRtl.contains = this.vertical.contains = this.verticalRtl.contains = function(keycode) {\n        return this[keycode] != null;\n    };\n})();\nSys.WebForms._MenuContainer = function(options) {\n    this.focused = false;\n    this.disabled = options.disabled;\n    this.staticDisplayLevels = options.staticDisplayLevels || 1;\n    this.element = options.element;\n    this.orientation = options.orientation || 'vertical';\n    this.disappearAfter = options.disappearAfter;\n    this.rightToLeft = Sys.WebForms.Menu._domHelper.getElementDirection(this.element) === 'rtl';\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    this.menu = options.menu;\n    this.menu.rootMenu = this.menu;\n    this.menu.displayMode = 'static';\n    this.menu.element.style.position = 'relative';\n    this.menu.element.style.width = 'auto';\n    if (this.orientation === 'vertical') {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menu');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n        }\n    }\n    else {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menubar');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontal;\n        }\n    }\n    var floatBreak = document.createElement('div');\n    floatBreak.style.clear = this.rightToLeft ? \"right\" : \"left\";\n    this.element.appendChild(floatBreak);\n    Sys.WebForms.Menu._domHelper.setFloat(this.element, this.rightToLeft ? \"right\" : \"left\");\n    Sys.WebForms.Menu._domHelper.insertAfter(this.element, floatBreak);\n    if (!this.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'focus', this._onfocus, true);\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'keydown', this._onkeydown);\n        var menuContainer = this;\n        this.element.dispose = function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose = null;\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'focus', menuContainer._onfocus, true);\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'keydown', menuContainer._onkeydown);\n                menuContainer.menu.doDispose();\n            }\n        };\n        Sys.WebForms.Menu._domHelper.addEvent(window, 'unload', function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose();\n            }\n        });\n    }\n};\nSys.WebForms._MenuContainer.prototype = {\n    blur: function() {\n        this.focused = false;\n        this.isBlurring = false;\n        this.menu.collapse();\n        this.focusedMenuItem = null;\n    },\n    focus: function(e) { this.focused = true; },\n    navigateTo: function(menuItem) {\n        if (this.focusedMenuItem && this.focusedMenuItem !== this) {\n            this.focusedMenuItem.highlight(false);\n        }\n        menuItem.highlight(true);\n        menuItem.focus();\n        this.focusedMenuItem = menuItem;\n    },\n    _onfocus: function(e) {\n        var event = e || window.event;\n        if (event.srcElement && this) {\n            if (Sys.WebForms.Menu._domHelper.contains(this.element, event.srcElement)) {\n                if (!this.focused) {\n                    this.focus();\n                }\n            }\n        }\n    },\n    _onkeydown: function(e) {\n        var thisMenu = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n        var keyCode = Sys.WebForms.Menu._domHelper.getKeyCode(e || window.event);\n        if (thisMenu) {\n            thisMenu.handleKeyPress(keyCode);\n        }\n    }\n};\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/SmartNav.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/SmartNav.js\nvar snSrc;\nif ((typeof(window.__smartNav) == \"undefined\") || (window.__smartNav == null))\n{\n    window.__smartNav = new Object();\n    window.__smartNav.update = function()\n    {\n        var sn = window.__smartNav;\n        var fd;\n        document.detachEvent(\"onstop\", sn.stopHif);\n        sn.inPost = false;\n        try { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        var fdr = fd.getElementsByTagName(\"asp_smartnav_rdir\");\n        if (fdr.length > 0)\n        {\n            if ((typeof(sn.sHif) == \"undefined\") || (sn.sHif == null))\n            {\n                sn.sHif = document.createElement(\"IFRAME\");\n                sn.sHif.name = \"__hifSmartNav\";\n                sn.sHif.style.display = \"none\";\n                sn.sHif.src = snSrc;\n            }\n            try {window.location = fdr[0].url;} catch (e) {};\n            return;\n        }\n        var fdurl = fd.location.href;\n        var index = fdurl.indexOf(snSrc);\n        if ((index != -1 && index == fdurl.length-snSrc.length)\n            || fdurl == \"about:blank\")\n            return;\n\t\tvar fdurlb = fdurl.split(\"?\")[0];\n\t\tif (document.location.href.indexOf(fdurlb) < 0)\n\t\t{\n            document.location.href=fdurl;\n\t\t    return;\n\t\t}\n\t\tsn._savedOnLoad = window.onload;\n\t\twindow.onload = null;\n\t\twindow.__smartNav.updateHelper();\n\t}\n\twindow.__smartNav.updateHelper = function()\n\t{\n\t\tif (document.readyState != \"complete\")\n\t\t{\n\t\t    window.setTimeout(window.__smartNav.updateHelper, 25);\n\t\t    return;\n\t\t}\n\t\twindow.__smartNav.loadNewContent();\n\t}\n\twindow.__smartNav.loadNewContent = function()\n\t{\n\t\tvar sn = window.__smartNav;\n\t\tvar fd;\n\t\ttry { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        if ((typeof(sn.sHif) != \"undefined\") && (sn.sHif != null))\n        {\n            sn.sHif.removeNode(true);\n            sn.sHif = null;\n        }\n        var hdm = document.getElementsByTagName(\"head\")[0];\n        var hk = hdm.childNodes;\n        var tt = null;\n        var i;\n        for (i = hk.length - 1; i>= 0; i--)\n        {\n            if (hk[i].tagName == \"TITLE\")\n            {\n                tt = hk[i].outerHTML;\n                continue;\n            }\n            if (hk[i].tagName != \"BASEFONT\" || hk[i].innerHTML.length == 0)\n                hdm.removeChild(hdm.childNodes[i]);\n        }\n        var kids = fd.getElementsByTagName(\"head\")[0].childNodes;\n        for (i = 0; i < kids.length; i++)\n        {\n            var tn = kids[i].tagName;\n            var k = document.createElement(tn);\n            k.id = kids[i].id;\n            k.mergeAttributes(kids[i]);\n            switch(tn)\n            {\n            case \"TITLE\":\n                if (tt == kids[i].outerHTML)\n                    continue;\n                k.innerText = kids[i].text;\n                hdm.insertAdjacentElement(\"afterbegin\", k);\n                continue;\n            case \"BASEFONT\" :\n                if (kids[i].innerHTML.length > 0)\n                    continue;\n                break;\n            default:\n                var o = document.createElement(\"BODY\");\n                o.innerHTML = \"<BODY>\" + kids[i].outerHTML + \"</BODY>\";\n                k = o.firstChild;\n                break;\n            }\n            if((typeof(k) != \"undefined\") && (k != null))\n                hdm.appendChild(k);\n        }\n        document.body.clearAttributes();\n        document.body.id = fd.body.id;\n        document.body.mergeAttributes(fd.body);\n        var newBodyLoad = fd.body.onload;\n        if ((typeof(newBodyLoad) != \"undefined\") && (newBodyLoad != null))\n            document.body.onload = newBodyLoad;\n        else\n            document.body.onload = sn._savedOnLoad;\n        var s = \"<BODY>\" + fd.body.innerHTML + \"</BODY>\";\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hifP = sn.hif.parentElement;\n            if ((typeof(hifP) != \"undefined\") && (hifP != null))\n                sn.sHif=hifP.removeChild(sn.hif);\n        }\n        document.body.innerHTML = s;\n        var sc = document.scripts;\n        for (i = 0; i < sc.length; i++)\n        {\n            sc[i].text = sc[i].text;\n        }\n        sn.hif = document.all(\"__hifSmartNav\");\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hif = sn.hif;\n            sn.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n            frames[\"__hifSmartNav\"].name = sn.hifName;\n            sn.hifDoc = hif.contentWindow.document;\n            if (sn.ie5)\n                hif.parentElement.removeChild(hif);\n            window.setTimeout(sn.restoreFocus,0);\n        }\n        if (typeof(window.onload) == \"string\")\n        {\n            try { eval(window.onload) } catch (e) {};\n        }\n        else if ((typeof(window.onload) != \"undefined\") && (window.onload != null))\n        {\n            try { window.onload() } catch (e) {};\n        }\n        sn._savedOnLoad = null;\n        sn.attachForm();\n    };\n    window.__smartNav.restoreFocus = function()\n    {\n        if (window.__smartNav.inPost == true) return;\n        var curAe = document.activeElement;\n        var sAeId = window.__smartNav.ae;\n        if (((typeof(sAeId) == \"undefined\") || (sAeId == null)) ||\n            (typeof(curAe) != \"undefined\") && (curAe != null) && (curAe.id == sAeId || curAe.name == sAeId))\n            return;\n        var ae = document.all(sAeId);\n        if ((typeof(ae) == \"undefined\") || (ae == null)) return;\n        try { ae.focus(); } catch(e){};\n    }\n    window.__smartNav.saveHistory = function()\n    {\n        if ((typeof(window.__smartNav.hif) != \"undefined\") && (window.__smartNav.hif != null))\n            window.__smartNav.hif.removeNode();\n        if ((typeof(window.__smartNav.sHif) != \"undefined\") && (window.__smartNav.sHif != null)\n            && (typeof(document.all[window.__smartNav.siHif]) != \"undefined\")\n            && (document.all[window.__smartNav.siHif] != null)) {\n            document.all[window.__smartNav.siHif].insertAdjacentElement(\n                        \"BeforeBegin\", window.__smartNav.sHif);\n        }\n    }\n    window.__smartNav.stopHif = function()\n    {\n        document.detachEvent(\"onstop\", window.__smartNav.stopHif);\n        var sn = window.__smartNav;\n        if (((typeof(sn.hifDoc) == \"undefined\") || (sn.hifDoc == null)) &&\n            (typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            try {sn.hifDoc = sn.hif.contentWindow.document;}\n            catch(e){sn.hifDoc=null}\n        }\n        if (sn.hifDoc != null)\n        {\n            try {sn.hifDoc.execCommand(\"stop\");} catch (e){}\n        }\n    }\n    window.__smartNav.init =  function()\n    {\n        var sn = window.__smartNav;\n        window.__smartNav.form.__smartNavPostBack.value = 'true';\n        document.detachEvent(\"onstop\", sn.stopHif);\n        document.attachEvent(\"onstop\", sn.stopHif);\n        try { if (window.event.returnValue == false) return; } catch(e) {}\n        sn.inPost = true;\n        if ((typeof(document.activeElement) != \"undefined\") && (document.activeElement != null))\n        {\n            var ae = document.activeElement.id;\n            if (ae.length == 0)\n                ae = document.activeElement.name;\n            sn.ae = ae;\n        }\n        else\n            sn.ae = null;\n        try {document.selection.empty();} catch (e) {}\n        if ((typeof(sn.hif) == \"undefined\") || (sn.hif == null))\n        {\n            sn.hif = document.all(\"__hifSmartNav\");\n            sn.hifDoc = sn.hif.contentWindow.document;\n        }\n        if ((typeof(sn.hifDoc) != \"undefined\") && (sn.hifDoc != null))\n            try {sn.hifDoc.designMode = \"On\";} catch(e){};\n        if ((typeof(sn.hif.parentElement) == \"undefined\") || (sn.hif.parentElement == null))\n            document.body.appendChild(sn.hif);\n        var hif = sn.hif;\n        hif.detachEvent(\"onload\", sn.update);\n        hif.attachEvent(\"onload\", sn.update);\n        window.__smartNav.fInit = true;\n    };\n    window.__smartNav.submit = function()\n    {\n        window.__smartNav.fInit = false;\n        try { window.__smartNav.init(); } catch(e) {}\n        if (window.__smartNav.fInit) {\n            window.__smartNav.form._submit();\n        }\n    };\n    window.__smartNav.attachForm = function()\n    {\n        var cf = document.forms;\n        for (var i=0; i<cf.length; i++)\n        {\n            if ((typeof(cf[i].__smartNavEnabled) != \"undefined\") && (cf[i].__smartNavEnabled != null))\n            {\n                window.__smartNav.form = cf[i];\n                window.__smartNav.form.insertAdjacentHTML(\"beforeEnd\", \"<input type='hidden' name='__smartNavPostBack' value='false' />\");\n                break;\n            }\n        }\n        var snfm = window.__smartNav.form;\n        if ((typeof(snfm) == \"undefined\") || (snfm == null)) return false;\n        var sft = snfm.target;\n        if (sft.length != 0 && sft.indexOf(\"__hifSmartNav\") != 0) return false;\n        var sfc = snfm.action.split(\"?\")[0];\n        var url = window.location.href.split(\"?\")[0];\n        if (url.charAt(url.length-1) != '/' && url.lastIndexOf(sfc) + sfc.length != url.length) return false;\n        if (snfm.__formAttached == true) return true;\n        snfm.__formAttached = true;\n        snfm.attachEvent(\"onsubmit\", window.__smartNav.init);\n        snfm._submit = snfm.submit;\n        snfm.submit = window.__smartNav.submit;\n        snfm.target = window.__smartNav.hifName;\n        return true;\n    };\n    window.__smartNav.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n    window.__smartNav.ie5 = navigator.appVersion.indexOf(\"MSIE 5\") > 0;\n    var rc = window.__smartNav.attachForm();\n    var hif = document.all(\"__hifSmartNav\");\n    if ((typeof(snSrc) == \"undefined\") || (snSrc == null)) {\n\t    if (typeof(window.dialogHeight) != \"undefined\") {\n\t            snSrc = \"IEsmartnav1\";\n\t\t    hif.src = snSrc;\n\t    } else {\n\t\t    snSrc = hif.src;\n\t    }\n    }\n    if (rc)\n    {\n        var fsn = frames[\"__hifSmartNav\"];\n        fsn.name = window.__smartNav.hifName;\n        window.__smartNav.siHif = hif.sourceIndex;\n        try {\n            if (fsn.document.location != snSrc)\n            {\n                fsn.document.designMode = \"On\";\n                hif.attachEvent(\"onload\",window.__smartNav.update);\n                window.__smartNav.hif = hif;\n            }\n        }\n        catch (e) { window.__smartNav.hif = hif; }\n        window.attachEvent(\"onbeforeunload\", window.__smartNav.saveHistory);\n    }\n    else\n        window.__smartNav = null;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/TreeView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/TreeView.js\nfunction TreeView_HoverNode(data, node) {\n    if (!data) {\n        return;\n    }\n    node.hoverClass = data.hoverClass;\n    WebForm_AppendToClassName(node, data.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n    WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n}\nfunction TreeView_GetNodeText(node) {\n    var trNode = WebForm_GetParentByTagName(node, \"TR\");\n    var outerNodes;\n    if (trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName) {\n        outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"A\");\n        if (!outerNodes || outerNodes.length == 0) {\n            outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"SPAN\");\n        }\n    }\n    var textNode = (outerNodes && outerNodes.length > 0) ?\n        outerNodes[0].childNodes[0] :\n        trNode.childNodes[trNode.childNodes.length - 1].childNodes[0];\n    return (textNode && textNode.nodeValue) ? textNode.nodeValue : \"\";\n}\nfunction TreeView_PopulateNode(data, index, node, selectNode, selectImageNode, lineType, text, path, databound, datapath, parentIsLast) {\n    if (!data) {\n        return;\n    }\n    var context = new Object();\n    context.data = data;\n    context.node = node;\n    context.selectNode = selectNode;\n    context.selectImageNode = selectImageNode;\n    context.lineType = lineType;\n    context.index = index;\n    context.isChecked = \"f\";\n    var tr = WebForm_GetParentByTagName(node, \"TR\");\n    if (tr) {\n        var checkbox = tr.getElementsByTagName(\"INPUT\");\n        if (checkbox && (checkbox.length > 0)) {\n            for (var i = 0; i < checkbox.length; i++) {\n                if (checkbox[i].type.toLowerCase() == \"checkbox\") {\n                    if (checkbox[i].checked) {\n                        context.isChecked = \"t\";\n                    }\n                    break;\n                }\n            }\n        }\n    }\n    var param = index + \"|\" + data.lastIndex + \"|\" + databound + context.isChecked + parentIsLast + \"|\" +\n        text.length + \"|\" + text + datapath.length + \"|\" + datapath + path;\n    TreeView_PopulateNodeDoCallBack(context, param);\n}\nfunction TreeView_ProcessNodeData(result, context) {\n    var treeNode = context.node;\n    if (result.length > 0) {\n        var ci =  result.indexOf(\"|\", 0);\n        context.data.lastIndex = result.substring(0, ci);\n        ci = result.indexOf(\"|\", ci + 1);\n        var newExpandState = result.substring(context.data.lastIndex.length + 1, ci);\n        context.data.expandState.value += newExpandState;\n        var chunk = result.substr(ci + 1);\n        var newChildren, table;\n        if (__nonMSDOMBrowser) {\n            var newDiv = document.createElement(\"div\");\n            newDiv.innerHTML = chunk;\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            newChildren = null;\n            if ((typeof(table.nextSibling) == \"undefined\") || (table.nextSibling == null)) {\n                table.parentNode.insertBefore(newDiv.firstChild, table.nextSibling);\n                newChildren = table.previousSibling;\n            }\n            else {\n                table = table.nextSibling;\n                table.parentNode.insertBefore(newDiv.firstChild, table);\n                newChildren = table.previousSibling;\n            }\n            newChildren = document.getElementById(treeNode.id + \"Nodes\");\n        }\n        else {\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            table.insertAdjacentHTML(\"afterEnd\", chunk);\n            newChildren = document.all[treeNode.id + \"Nodes\"];\n        }\n        if ((typeof(newChildren) != \"undefined\") && (newChildren != null)) {\n            TreeView_ToggleNode(context.data, context.index, treeNode, context.lineType, newChildren);\n            treeNode.href = document.getElementById ?\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",document.getElementById('\" + treeNode.id + \"'),'\" + context.lineType + \"',document.getElementById('\" + newChildren.id + \"'))\" :\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",\" + treeNode.id + \",'\" + context.lineType + \"',\" + newChildren.id + \")\";\n            if ((typeof(context.selectNode) != \"undefined\") && (context.selectNode != null) && context.selectNode.href &&\n                (context.selectNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectNode.href = treeNode.href;\n            }\n            if ((typeof(context.selectImageNode) != \"undefined\") && (context.selectImageNode != null) && context.selectNode.href &&\n                (context.selectImageNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectImageNode.href = treeNode.href;\n            }\n        }\n        context.data.populateLog.value += context.index + \",\";\n    }\n    else {\n        var img = treeNode.childNodes ? treeNode.childNodes[0] : treeNode.children[0];\n        if ((typeof(img) != \"undefined\") && (img != null)) {\n            var lineType = context.lineType;\n            if (lineType == \"l\") {\n                img.src = context.data.images[13];\n            }\n            else if (lineType == \"t\") {\n                img.src = context.data.images[10];\n            }\n            else if (lineType == \"-\") {\n                img.src = context.data.images[16];\n            }\n            else {\n                img.src = context.data.images[3];\n            }\n            var pe;\n            if (__nonMSDOMBrowser) {\n                pe = treeNode.parentNode;\n                pe.insertBefore(img, treeNode);\n                pe.removeChild(treeNode);\n            }\n            else {\n                pe = treeNode.parentElement;\n                treeNode.style.visibility=\"hidden\";\n                treeNode.style.display=\"none\";\n                pe.insertAdjacentElement(\"afterBegin\", img);\n            }\n        }\n    }\n}\nfunction TreeView_SelectNode(data, node, nodeId) {\n    if (!data) {\n        return;\n    }\n    if ((typeof(data.selectedClass) != \"undefined\") && (data.selectedClass != null)) {\n        var id = data.selectedNodeID.value;\n        if (id.length > 0) {\n            var selectedNode = document.getElementById(id);\n            if ((typeof(selectedNode) != \"undefined\") && (selectedNode != null)) {\n                WebForm_RemoveClassName(selectedNode, data.selectedHyperLinkClass);\n                selectedNode = WebForm_GetParentByTagName(selectedNode, \"TD\");\n                WebForm_RemoveClassName(selectedNode, data.selectedClass);\n            }\n        }\n        WebForm_AppendToClassName(node, data.selectedHyperLinkClass);\n        node = WebForm_GetParentByTagName(node, \"TD\");\n        WebForm_AppendToClassName(node, data.selectedClass)\n    }\n    data.selectedNodeID.value = nodeId;\n}\nfunction TreeView_ToggleNode(data, index, node, lineType, children) {\n    if (!data) {\n        return;\n    }\n    var img = node.childNodes[0];\n    var newExpandState;\n    try {\n        if (children.style.display == \"none\") {\n            children.style.display = \"block\";\n            newExpandState = \"e\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[15];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[12];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[18];\n                }\n                else {\n                    img.src = data.images[5];\n                }\n                img.alt = data.collapseToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n        else {\n            children.style.display = \"none\";\n            newExpandState = \"c\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[14];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[11];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[17];\n                }\n                else {\n                    img.src = data.images[4];\n                }\n                img.alt = data.expandToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n    }\n    catch(e) {}\n    data.expandState.value =  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);\n}\nfunction TreeView_UnhoverNode(node) {\n    if (!node.hoverClass) {\n        return;\n    }\n    WebForm_RemoveClassName(node, node.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {\n    this.eventTarget = eventTarget;\n    this.eventArgument = eventArgument;\n    this.validation = validation;\n    this.validationGroup = validationGroup;\n    this.actionUrl = actionUrl;\n    this.trackFocus = trackFocus;\n    this.clientSubmit = clientSubmit;\n}\nfunction WebForm_DoPostBackWithOptions(options) {\n    var validationResult = true;\n    if (options.validation) {\n        if (typeof(Page_ClientValidate) == 'function') {\n            validationResult = Page_ClientValidate(options.validationGroup);\n        }\n    }\n    if (validationResult) {\n        if ((typeof(options.actionUrl) != \"undefined\") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {\n            theForm.action = options.actionUrl;\n        }\n        if (options.trackFocus) {\n            var lastFocus = theForm.elements[\"__LASTFOCUS\"];\n            if ((typeof(lastFocus) != \"undefined\") && (lastFocus != null)) {\n                if (typeof(document.activeElement) == \"undefined\") {\n                    lastFocus.value = options.eventTarget;\n                }\n                else {\n                    var active = document.activeElement;\n                    if ((typeof(active) != \"undefined\") && (active != null)) {\n                        if ((typeof(active.id) != \"undefined\") && (active.id != null) && (active.id.length > 0)) {\n                            lastFocus.value = active.id;\n                        }\n                        else if (typeof(active.name) != \"undefined\") {\n                            lastFocus.value = active.name;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if (options.clientSubmit) {\n        __doPostBack(options.eventTarget, options.eventArgument);\n    }\n}\nvar __pendingCallbacks = new Array();\nvar __synchronousCallBackIndex = -1;\nfunction WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {\n    var postData = __theFormPostData +\n                \"__CALLBACKID=\" + WebForm_EncodeCallback(eventTarget) +\n                \"&__CALLBACKPARAM=\" + WebForm_EncodeCallback(eventArgument);\n    if (theForm[\"__EVENTVALIDATION\"]) {\n        postData += \"&__EVENTVALIDATION=\" + WebForm_EncodeCallback(theForm[\"__EVENTVALIDATION\"].value);\n    }\n    var xmlRequest,e;\n    try {\n        xmlRequest = new XMLHttpRequest();\n    }\n    catch(e) {\n        try {\n            xmlRequest = new ActiveXObject(\"Microsoft.XMLHTTP\");\n        }\n        catch(e) {\n        }\n    }\n    var setRequestHeaderMethodExists = true;\n    try {\n        setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);\n    }\n    catch(e) {}\n    var callback = new Object();\n    callback.eventCallback = eventCallback;\n    callback.context = context;\n    callback.errorCallback = errorCallback;\n    callback.async = useAsync;\n    var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);\n    if (!useAsync) {\n        if (__synchronousCallBackIndex != -1) {\n            __pendingCallbacks[__synchronousCallBackIndex] = null;\n        }\n        __synchronousCallBackIndex = callbackIndex;\n    }\n    if (setRequestHeaderMethodExists) {\n        xmlRequest.onreadystatechange = WebForm_CallbackComplete;\n        callback.xmlRequest = xmlRequest;\n        // e.g. http:\n        var action = theForm.action || document.location.pathname, fragmentIndex = action.indexOf('#');\n        if (fragmentIndex !== -1) {\n            action = action.substr(0, fragmentIndex);\n        }\n        if (!__nonMSDOMBrowser) {\n            var queryIndex = action.indexOf('?');\n            if (queryIndex !== -1) {\n                var path = action.substr(0, queryIndex);\n                if (path.indexOf(\"%\") === -1) {\n                    action = encodeURI(path) + action.substr(queryIndex);\n                }\n            }\n            else if (action.indexOf(\"%\") === -1) {\n                action = encodeURI(action);\n            }\n        }\n        xmlRequest.open(\"POST\", action, true);\n        xmlRequest.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded; charset=utf-8\");\n        xmlRequest.send(postData);\n        return;\n    }\n    callback.xmlRequest = new Object();\n    var callbackFrameID = \"__CALLBACKFRAME\" + callbackIndex;\n    var xmlRequestFrame = document.frames[callbackFrameID];\n    if (!xmlRequestFrame) {\n        xmlRequestFrame = document.createElement(\"IFRAME\");\n        xmlRequestFrame.width = \"1\";\n        xmlRequestFrame.height = \"1\";\n        xmlRequestFrame.frameBorder = \"0\";\n        xmlRequestFrame.id = callbackFrameID;\n        xmlRequestFrame.name = callbackFrameID;\n        xmlRequestFrame.style.position = \"absolute\";\n        xmlRequestFrame.style.top = \"-100px\"\n        xmlRequestFrame.style.left = \"-100px\";\n        try {\n            if (callBackFrameUrl) {\n                xmlRequestFrame.src = callBackFrameUrl;\n            }\n        }\n        catch(e) {}\n        document.body.appendChild(xmlRequestFrame);\n    }\n    var interval = window.setInterval(function() {\n        xmlRequestFrame = document.frames[callbackFrameID];\n        if (xmlRequestFrame && xmlRequestFrame.document) {\n            window.clearInterval(interval);\n            xmlRequestFrame.document.write(\"\");\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.write('<html><body><form method=\"post\"><input type=\"hidden\" name=\"__CALLBACKLOADSCRIPT\" value=\"t\"></form></body></html>');\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.forms[0].action = theForm.action;\n            var count = __theFormPostCollection.length;\n            var element;\n            for (var i = 0; i < count; i++) {\n                element = __theFormPostCollection[i];\n                if (element) {\n                    var fieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                    fieldElement.type = \"hidden\";\n                    fieldElement.name = element.name;\n                    fieldElement.value = element.value;\n                    xmlRequestFrame.document.forms[0].appendChild(fieldElement);\n                }\n            }\n            var callbackIdFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIdFieldElement.type = \"hidden\";\n            callbackIdFieldElement.name = \"__CALLBACKID\";\n            callbackIdFieldElement.value = eventTarget;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);\n            var callbackParamFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackParamFieldElement.type = \"hidden\";\n            callbackParamFieldElement.name = \"__CALLBACKPARAM\";\n            callbackParamFieldElement.value = eventArgument;\n            xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);\n            if (theForm[\"__EVENTVALIDATION\"]) {\n                var callbackValidationFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                callbackValidationFieldElement.type = \"hidden\";\n                callbackValidationFieldElement.name = \"__EVENTVALIDATION\";\n                callbackValidationFieldElement.value = theForm[\"__EVENTVALIDATION\"].value;\n                xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement);\n            }\n            var callbackIndexFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIndexFieldElement.type = \"hidden\";\n            callbackIndexFieldElement.name = \"__CALLBACKINDEX\";\n            callbackIndexFieldElement.value = callbackIndex;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement);\n            xmlRequestFrame.document.forms[0].submit();\n        }\n    }, 10);\n}\nfunction WebForm_CallbackComplete() {\n    for (var i = 0; i < __pendingCallbacks.length; i++) {\n        callbackObject = __pendingCallbacks[i];\n        if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {\n            if (!__pendingCallbacks[i].async) {\n                __synchronousCallBackIndex = -1;\n            }\n            __pendingCallbacks[i] = null;\n            var callbackFrameID = \"__CALLBACKFRAME\" + i;\n            var xmlRequestFrame = document.getElementById(callbackFrameID);\n            if (xmlRequestFrame) {\n                xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);\n            }\n            WebForm_ExecuteCallback(callbackObject);\n        }\n    }\n}\nfunction WebForm_ExecuteCallback(callbackObject) {\n    var response = callbackObject.xmlRequest.responseText;\n    if (response.charAt(0) == \"s\") {\n        if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n            callbackObject.eventCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else if (response.charAt(0) == \"e\") {\n        if ((typeof(callbackObject.errorCallback) != \"undefined\") && (callbackObject.errorCallback != null)) {\n            callbackObject.errorCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else {\n        var separatorIndex = response.indexOf(\"|\");\n        if (separatorIndex != -1) {\n            var validationFieldLength = parseInt(response.substring(0, separatorIndex));\n            if (!isNaN(validationFieldLength)) {\n                var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);\n                if (validationField != \"\") {\n                    var validationFieldElement = theForm[\"__EVENTVALIDATION\"];\n                    if (!validationFieldElement) {\n                        validationFieldElement = document.createElement(\"INPUT\");\n                        validationFieldElement.type = \"hidden\";\n                        validationFieldElement.name = \"__EVENTVALIDATION\";\n                        theForm.appendChild(validationFieldElement);\n                    }\n                    validationFieldElement.value = validationField;\n                }\n                if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n                    callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);\n                }\n            }\n        }\n    }\n}\nfunction WebForm_FillFirstAvailableSlot(array, element) {\n    var i;\n    for (i = 0; i < array.length; i++) {\n        if (!array[i]) break;\n    }\n    array[i] = element;\n    return i;\n}\nvar __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);\nvar __theFormPostData = \"\";\nvar __theFormPostCollection = new Array();\nvar __callbackTextTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction WebForm_InitCallback() {\n    var formElements = theForm.elements,\n        count = formElements.length,\n        element;\n    for (var i = 0; i < count; i++) {\n        element = formElements[i];\n        var tagName = element.tagName.toLowerCase();\n        if (tagName == \"input\") {\n            var type = element.type;\n            if ((__callbackTextTypes.test(type) || ((type == \"checkbox\" || type == \"radio\") && element.checked))\n                && (element.id != \"__EVENTVALIDATION\")) {\n                WebForm_InitCallbackAddField(element.name, element.value);\n            }\n        }\n        else if (tagName == \"select\") {\n            var selectCount = element.options.length;\n            for (var j = 0; j < selectCount; j++) {\n                var selectChild = element.options[j];\n                if (selectChild.selected == true) {\n                    WebForm_InitCallbackAddField(element.name, element.value);\n                }\n            }\n        }\n        else if (tagName == \"textarea\") {\n            WebForm_InitCallbackAddField(element.name, element.value);\n        }\n    }\n}\nfunction WebForm_InitCallbackAddField(name, value) {\n    var nameValue = new Object();\n    nameValue.name = name;\n    nameValue.value = value;\n    __theFormPostCollection[__theFormPostCollection.length] = nameValue;\n    __theFormPostData += WebForm_EncodeCallback(name) + \"=\" + WebForm_EncodeCallback(value) + \"&\";\n}\nfunction WebForm_EncodeCallback(parameter) {\n    if (encodeURIComponent) {\n        return encodeURIComponent(parameter);\n    }\n    else {\n        return escape(parameter);\n    }\n}\nvar __disabledControlArray = new Array();\nfunction WebForm_ReEnableControls() {\n    if (typeof(__enabledControlArray) == 'undefined') {\n        return false;\n    }\n    var disabledIndex = 0;\n    for (var i = 0; i < __enabledControlArray.length; i++) {\n        var c;\n        if (__nonMSDOMBrowser) {\n            c = document.getElementById(__enabledControlArray[i]);\n        }\n        else {\n            c = document.all[__enabledControlArray[i]];\n        }\n        if ((typeof(c) != \"undefined\") && (c != null) && (c.disabled == true)) {\n            c.disabled = false;\n            __disabledControlArray[disabledIndex++] = c;\n        }\n    }\n    setTimeout(\"WebForm_ReDisableControls()\", 0);\n    return true;\n}\nfunction WebForm_ReDisableControls() {\n    for (var i = 0; i < __disabledControlArray.length; i++) {\n        __disabledControlArray[i].disabled = true;\n    }\n}\nfunction WebForm_SimulateClick(element, event) {\n    var clickEvent;\n    if (element) {\n        if (element.click) {\n            element.click();\n        } else { \n            clickEvent = document.createEvent(\"MouseEvents\");\n            clickEvent.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n            if (!element.dispatchEvent(clickEvent)) {\n                return true;\n            }\n        }\n        event.cancelBubble = true;\n        if (event.stopPropagation) {\n            event.stopPropagation();\n        }\n        return false;\n    }\n    return true;\n}\nfunction WebForm_FireDefaultButton(event, target) {\n    if (event.keyCode == 13) {\n        var src = event.srcElement || event.target;\n        if (src &&\n            ((src.tagName.toLowerCase() == \"input\") &&\n             (src.type.toLowerCase() == \"submit\" || src.type.toLowerCase() == \"button\")) ||\n            ((src.tagName.toLowerCase() == \"a\") &&\n             (src.href != null) && (src.href != \"\")) ||\n            (src.tagName.toLowerCase() == \"textarea\")) {\n            return true;\n        }\n        var defaultButton;\n        if (__nonMSDOMBrowser) {\n            defaultButton = document.getElementById(target);\n        }\n        else {\n            defaultButton = document.all[target];\n        }\n        if (defaultButton) {\n            return WebForm_SimulateClick(defaultButton, event);\n        } \n    }\n    return true;\n}\nfunction WebForm_GetScrollX() {\n    if (__nonMSDOMBrowser) {\n        return window.pageXOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollLeft) {\n            return document.documentElement.scrollLeft;\n        }\n        else if (document.body) {\n            return document.body.scrollLeft;\n        }\n    }\n    return 0;\n}\nfunction WebForm_GetScrollY() {\n    if (__nonMSDOMBrowser) {\n        return window.pageYOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollTop) {\n            return document.documentElement.scrollTop;\n        }\n        else if (document.body) {\n            return document.body.scrollTop;\n        }\n    }\n    return 0;\n}\nfunction WebForm_SaveScrollPositionSubmit() {\n    if (__nonMSDOMBrowser) {\n        theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset;\n        theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset;\n    }\n    else {\n        theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n        theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    }\n    if ((typeof(this.oldSubmit) != \"undefined\") && (this.oldSubmit != null)) {\n        return this.oldSubmit();\n    }\n    return true;\n}\nfunction WebForm_SaveScrollPositionOnSubmit() {\n    theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n    theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    if ((typeof(this.oldOnSubmit) != \"undefined\") && (this.oldOnSubmit != null)) {\n        return this.oldOnSubmit();\n    }\n    return true;\n}\nfunction WebForm_RestoreScrollPosition() {\n    if (__nonMSDOMBrowser) {\n        window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value);\n    }\n    else {\n        window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value);\n    }\n    if ((typeof(theForm.oldOnLoad) != \"undefined\") && (theForm.oldOnLoad != null)) {\n        return theForm.oldOnLoad();\n    }\n    return true;\n}\nfunction WebForm_TextBoxKeyHandler(event) {\n    if (event.keyCode == 13) {\n        var target;\n        if (__nonMSDOMBrowser) {\n            target = event.target;\n        }\n        else {\n            target = event.srcElement;\n        }\n        if ((typeof(target) != \"undefined\") && (target != null)) {\n            if (typeof(target.onchange) != \"undefined\") {\n                target.onchange();\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction WebForm_TrimString(value) {\n    return value.replace(/^\\s+|\\s+$/g, '')\n}\nfunction WebForm_AppendToClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index === -1) {\n        element.className = (element.className === '') ? className : element.className + ' ' + className;\n    }\n}\nfunction WebForm_RemoveClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index >= 0) {\n        element.className = WebForm_TrimString(currentClassName.substring(0, index) + ' ' +\n            currentClassName.substring(index + className.length + 1, currentClassName.length));\n    }\n}\nfunction WebForm_GetElementById(elementId) {\n    if (document.getElementById) {\n        return document.getElementById(elementId);\n    }\n    else if (document.all) {\n        return document.all[elementId];\n    }\n    else return null;\n}\nfunction WebForm_GetElementByTagName(element, tagName) {\n    var elements = WebForm_GetElementsByTagName(element, tagName);\n    if (elements && elements.length > 0) {\n        return elements[0];\n    }\n    else return null;\n}\nfunction WebForm_GetElementsByTagName(element, tagName) {\n    if (element && tagName) {\n        if (element.getElementsByTagName) {\n            return element.getElementsByTagName(tagName);\n        }\n        if (element.all && element.all.tags) {\n            return element.all.tags(tagName);\n        }\n    }\n    return null;\n}\nfunction WebForm_GetElementDir(element) {\n    if (element) {\n        if (element.dir) {\n            return element.dir;\n        }\n        return WebForm_GetElementDir(element.parentNode);\n    }\n    return \"ltr\";\n}\nfunction WebForm_GetElementPosition(element) {\n    var result = new Object();\n    result.x = 0;\n    result.y = 0;\n    result.width = 0;\n    result.height = 0;\n    if (element.offsetParent) {\n        result.x = element.offsetLeft;\n        result.y = element.offsetTop;\n        var parent = element.offsetParent;\n        while (parent) {\n            result.x += parent.offsetLeft;\n            result.y += parent.offsetTop;\n            var parentTagName = parent.tagName.toLowerCase();\n            if (parentTagName != \"table\" &&\n                parentTagName != \"body\" && \n                parentTagName != \"html\" && \n                parentTagName != \"div\" && \n                parent.clientTop && \n                parent.clientLeft) {\n                result.x += parent.clientLeft;\n                result.y += parent.clientTop;\n            }\n            parent = parent.offsetParent;\n        }\n    }\n    else if (element.left && element.top) {\n        result.x = element.left;\n        result.y = element.top;\n    }\n    else {\n        if (element.x) {\n            result.x = element.x;\n        }\n        if (element.y) {\n            result.y = element.y;\n        }\n    }\n    if (element.offsetWidth && element.offsetHeight) {\n        result.width = element.offsetWidth;\n        result.height = element.offsetHeight;\n    }\n    else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {\n        result.width = element.style.pixelWidth;\n        result.height = element.style.pixelHeight;\n    }\n    return result;\n}\nfunction WebForm_GetParentByTagName(element, tagName) {\n    var parent = element.parentNode;\n    var upperTagName = tagName.toUpperCase();\n    while (parent && (parent.tagName.toUpperCase() != upperTagName)) {\n        parent = parent.parentNode ? parent.parentNode : parent.parentElement;\n    }\n    return parent;\n}\nfunction WebForm_SetElementHeight(element, height) {\n    if (element && element.style) {\n        element.style.height = height + \"px\";\n    }\n}\nfunction WebForm_SetElementWidth(element, width) {\n    if (element && element.style) {\n        element.style.width = width + \"px\";\n    }\n}\nfunction WebForm_SetElementX(element, x) {\n    if (element && element.style) {\n        element.style.left = x + \"px\";\n    }\n}\nfunction WebForm_SetElementY(element, y) {\n    if (element && element.style) {\n        element.style.top = y + \"px\";\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebParts.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebParts.js\nvar __wpm = null;\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\nfunction __wpTranslateOffset(x, y, offsetElement, relativeToElement, includeScroll) {\n    while ((typeof(offsetElement) != \"undefined\") && (offsetElement != null) && (offsetElement != relativeToElement)) {\n        x += offsetElement.offsetLeft;\n        y += offsetElement.offsetTop;\n        var tagName = offsetElement.tagName;\n        if ((tagName != \"TABLE\") && (tagName != \"BODY\")) {\n            x += offsetElement.clientLeft;\n            y += offsetElement.clientTop;\n        }\n        if (includeScroll && (tagName != \"BODY\")) {\n            x -= offsetElement.scrollLeft;\n            y -= offsetElement.scrollTop;\n        }\n        offsetElement = offsetElement.offsetParent;\n    }\n    return new Point(x, y);\n}\nfunction __wpGetPageEventLocation(event, includeScroll) {\n    if ((typeof(event) == \"undefined\") || (event == null)) {\n        event = window.event;\n    }\n    return __wpTranslateOffset(event.offsetX, event.offsetY, event.srcElement, null, includeScroll);\n}\nfunction __wpClearSelection() {\n    document.selection.empty();\n}\nfunction WebPart(webPartElement, webPartTitleElement, zone, zoneIndex, allowZoneChange) {\n    this.webPartElement = webPartElement;\n    this.allowZoneChange = allowZoneChange;\n    this.zone = zone;\n    this.zoneIndex = zoneIndex;\n    this.title = ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) ?\n        webPartTitleElement.innerText : \"\";\n    webPartElement.__webPart = this;\n    if ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) {\n        webPartTitleElement.style.cursor = \"move\";\n        webPartTitleElement.attachEvent(\"onmousedown\", WebPart_OnMouseDown);\n        webPartElement.attachEvent(\"ondragstart\", WebPart_OnDragStart);\n        webPartElement.attachEvent(\"ondrag\", WebPart_OnDrag);\n        webPartElement.attachEvent(\"ondragend\", WebPart_OnDragEnd);\n    }\n    this.UpdatePosition = WebPart_UpdatePosition;\n    this.Dispose = WebPart_Dispose;\n}\nfunction WebPart_Dispose() {\n    this.webPartElement.__webPart = null    \n}\nfunction WebPart_OnMouseDown() {\n    var currentEvent = window.event;\n    var draggedWebPart = WebPart_GetParentWebPartElement(currentEvent.srcElement);\n    if ((typeof(draggedWebPart) == \"undefined\") || (draggedWebPart == null)) {\n        return;\n    }\n    document.selection.empty();\n    try {\n        __wpm.draggedWebPart = draggedWebPart;\n        __wpm.DragDrop();\n    }\n    catch (e) {\n        __wpm.draggedWebPart = draggedWebPart;\n        window.setTimeout(\"__wpm.DragDrop()\", 0);\n    }\n    currentEvent.returnValue = false;\n    currentEvent.cancelBubble = true;\n}\nfunction WebPart_OnDragStart() {\n    var currentEvent = window.event;\n    var webPartElement = currentEvent.srcElement;\n    if ((typeof(webPartElement.__webPart) == \"undefined\") || (webPartElement.__webPart == null)) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n        return;\n    }\n    var dataObject = currentEvent.dataTransfer;\n    dataObject.effectAllowed = __wpm.InitiateWebPartDragDrop(webPartElement);\n}\nfunction WebPart_OnDrag() {\n    __wpm.ContinueWebPartDragDrop();\n}\nfunction WebPart_OnDragEnd() {\n    __wpm.CompleteWebPartDragDrop();\n}\nfunction WebPart_GetParentWebPartElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__webPart) == \"undefined\") || (elem.__webPart == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction WebPart_UpdatePosition() {\n    var location = __wpTranslateOffset(0, 0, this.webPartElement, null, false);\n    this.middleX = location.x + this.webPartElement.offsetWidth / 2;\n    this.middleY = location.y + this.webPartElement.offsetHeight / 2;\n}\nfunction Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var webPartTable = null;\n    if (zoneElement.rows.length == 1) {\n        webPartTableContainer = zoneElement.rows[0].cells[0];\n    }\n    else {\n        webPartTableContainer = zoneElement.rows[1].cells[0];\n    }\n    var i;\n    for (i = 0; i < webPartTableContainer.childNodes.length; i++) {\n        var node = webPartTableContainer.childNodes[i];\n        if (node.tagName == \"TABLE\") {\n            webPartTable = node;\n            break;\n        }\n    }\n    this.zoneElement = zoneElement;\n    this.zoneIndex = zoneIndex;\n    this.webParts = new Array();\n    this.uniqueID = uniqueID;\n    this.isVertical = isVertical;\n    this.allowLayoutChange = allowLayoutChange;\n    this.allowDrop = false;\n    this.webPartTable = webPartTable;\n    this.highlightColor = highlightColor;\n    this.savedBorderColor = (webPartTable != null) ? webPartTable.style.borderColor : null;\n    this.dropCueElements = new Array();\n    if (webPartTable != null) {\n        if (isVertical) {\n            for (i = 0; i < webPartTable.rows.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[i].cells[0].childNodes[0];\n            }\n        }\n        else {\n            for (i = 0; i < webPartTable.rows[0].cells.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[0].cells[i].childNodes[0];\n            }\n        }\n    }\n    this.AddWebPart = Zone_AddWebPart;\n    this.GetWebPartIndex = Zone_GetWebPartIndex;\n    this.ToggleDropCues = Zone_ToggleDropCues;\n    this.UpdatePosition = Zone_UpdatePosition;\n    this.Dispose = Zone_Dispose;\n    webPartTable.__zone = this;\n    webPartTable.attachEvent(\"ondragenter\", Zone_OnDragEnter);\n    webPartTable.attachEvent(\"ondrop\", Zone_OnDrop);\n}\nfunction Zone_Dispose() {\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].Dispose();\n    }\n    this.webPartTable.__zone = null;\n}\nfunction Zone_OnDragEnter() {\n    var handled = __wpm.ProcessWebPartDragEnter();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDragOver() {\n    var handled = __wpm.ProcessWebPartDragOver();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDrop() {\n    var handled = __wpm.ProcessWebPartDrop();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_GetParentZoneElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__zone) == \"undefined\") || (elem.__zone == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction Zone_AddWebPart(webPartElement, webPartTitleElement, allowZoneChange) {\n    var webPart = null;\n    var zoneIndex = this.webParts.length;\n    if (this.allowLayoutChange && __wpm.IsDragDropEnabled()) {\n        webPart = new WebPart(webPartElement, webPartTitleElement, this, zoneIndex, allowZoneChange);\n    }\n    else {\n        webPart = new WebPart(webPartElement, null, this, zoneIndex, allowZoneChange);\n    }\n    this.webParts[zoneIndex] = webPart;\n    return webPart;\n}\nfunction Zone_ToggleDropCues(show, index, ignoreOutline) {\n    if (ignoreOutline == false) {\n        this.webPartTable.style.borderColor = (show ? this.highlightColor : this.savedBorderColor);\n    }\n    if (index == -1) {\n        return;\n    }\n    var dropCue = this.dropCueElements[index];\n    if (dropCue && dropCue.style) {\n        if (dropCue.style.height == \"100%\" && !dropCue.webPartZoneHorizontalCueResized) {\n            var oldParentHeight = dropCue.parentElement.clientHeight;\n            var realHeight = oldParentHeight - 10;\n            dropCue.style.height = realHeight + \"px\";\n            var dropCueVerticalBar = dropCue.getElementsByTagName(\"DIV\")[0];\n            if (dropCueVerticalBar && dropCueVerticalBar.style) {\n                dropCueVerticalBar.style.height = dropCue.style.height;\n                var heightDiff = (dropCue.parentElement.clientHeight - oldParentHeight);\n                if (heightDiff) {\n                    dropCue.style.height = (realHeight - heightDiff) + \"px\";\n                    dropCueVerticalBar.style.height = dropCue.style.height;\n                }\n            }\n            dropCue.webPartZoneHorizontalCueResized = true;\n        }\n        dropCue.style.visibility = (show ? \"visible\" : \"hidden\");\n    }\n}\nfunction Zone_GetWebPartIndex(location) {\n    var x = location.x;\n    var y = location.y;\n    if ((x < this.webPartTableLeft) || (x > this.webPartTableRight) ||\n        (y < this.webPartTableTop) || (y > this.webPartTableBottom)) {\n        return -1;\n    }\n    var vertical = this.isVertical;\n    var webParts = this.webParts;\n    var webPartsCount = webParts.length;\n    for (var i = 0; i < webPartsCount; i++) {\n        var webPart = webParts[i];\n        if (vertical) {\n            if (y < webPart.middleY) {\n                return i;\n            }\n        }\n        else {\n            if (x < webPart.middleX) {\n                return i;\n            }\n        }\n    }\n    return webPartsCount;\n}\nfunction Zone_UpdatePosition() {\n    var topLeft = __wpTranslateOffset(0, 0, this.webPartTable, null, false);\n    this.webPartTableLeft = topLeft.x;\n    this.webPartTableTop = topLeft.y;\n    this.webPartTableRight = (this.webPartTable != null) ? topLeft.x + this.webPartTable.offsetWidth : topLeft.x;\n    this.webPartTableBottom = (this.webPartTable != null) ? topLeft.y + this.webPartTable.offsetHeight : topLeft.y;\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].UpdatePosition();\n    }\n}\nfunction WebPartDragState(webPartElement, effect) {\n    this.webPartElement = webPartElement;\n    this.dropZoneElement = null;\n    this.dropIndex = -1;\n    this.effect = effect;\n    this.dropped = false;\n}\nfunction WebPartMenu(menuLabelElement, menuDropDownElement, menuElement) {\n    this.menuLabelElement = menuLabelElement;\n    this.menuDropDownElement = menuDropDownElement;\n    this.menuElement = menuElement;\n    this.menuLabelElement.__menu = this;\n    this.menuLabelElement.attachEvent('onclick', WebPartMenu_OnClick);\n    this.menuLabelElement.attachEvent('onkeypress', WebPartMenu_OnKeyPress);\n    this.menuLabelElement.attachEvent('onmouseenter', WebPartMenu_OnMouseEnter);\n    this.menuLabelElement.attachEvent('onmouseleave', WebPartMenu_OnMouseLeave);\n    if ((typeof(this.menuDropDownElement) != \"undefined\") && (this.menuDropDownElement != null)) {\n        this.menuDropDownElement.__menu = this;\n    }\n    this.menuItemStyle = \"\";\n    this.menuItemHoverStyle = \"\";\n    this.popup = null;\n    this.hoverClassName = \"\";\n    this.hoverColor = \"\";\n    this.oldColor = this.menuLabelElement.style.color;\n    this.oldTextDecoration = this.menuLabelElement.style.textDecoration;\n    this.oldClassName = this.menuLabelElement.className;\n    this.Show = WebPartMenu_Show;\n    this.Hide = WebPartMenu_Hide;\n    this.Hover = WebPartMenu_Hover;\n    this.Unhover = WebPartMenu_Unhover;\n    this.Dispose = WebPartMenu_Dispose;\n    var menu = this;\n    this.disposeDelegate = function() { menu.Dispose(); };\n    window.attachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Dispose() {\n    this.menuLabelElement.__menu = null;\n    this.menuDropDownElement.__menu = null;\n    window.detachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Show() {\n    if ((typeof(__wpm.menu) != \"undefined\") && (__wpm.menu != null)) {\n        __wpm.menu.Hide();\n    }\n    var menuHTML =\n        \"<html><head><style>\" +\n        \"a.menuItem, a.menuItem:Link { display: block; padding: 1px; text-decoration: none; \" + this.itemStyle + \" }\" +\n        \"a.menuItem:Hover { \" + this.itemHoverStyle + \" }\" +\n        \"</style><body scroll=\\\"no\\\" style=\\\"border: none; margin: 0; padding: 0;\\\" ondragstart=\\\"window.event.returnValue=false;\\\" onclick=\\\"popup.hide()\\\">\" +\n        this.menuElement.innerHTML +\n        \"</body></html>\";\n    var width = 16;\n    var height = 16;\n    this.popup = window.createPopup();\n    __wpm.menu = this;\n    var popupDocument = this.popup.document;\n    popupDocument.write(menuHTML);\n    this.popup.show(0, 0, width, height);\n    var popupBody = popupDocument.body;\n    width = popupBody.scrollWidth;\n    height = popupBody.scrollHeight;\n    if (width < this.menuLabelElement.offsetWidth) {\n        width = this.menuLabelElement.offsetWidth + 16;\n    }\n    if (this.menuElement.innerHTML.indexOf(\"progid:DXImageTransform.Microsoft.Shadow\") != -1) {\n        popupBody.style.paddingRight = \"4px\";\n    }\n    popupBody.__wpm = __wpm;\n    popupBody.__wpmDeleteWarning = __wpmDeleteWarning;\n    popupBody.__wpmCloseProviderWarning = __wpmCloseProviderWarning;\n    popupBody.popup = this.popup;\n    this.popup.hide();\n    this.popup.show(0, this.menuLabelElement.offsetHeight, width, height, this.menuLabelElement);\n}\nfunction WebPartMenu_Hide() {\n    if (__wpm.menu == this) {\n        __wpm.menu = null;\n        if ((typeof(this.popup) != \"undefined\") && (this.popup != null)) {\n            this.popup.hide();\n            this.popup = null;\n        }\n    }\n}\nfunction WebPartMenu_Hover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.className = this.menuLabelElement.className + \" \" + this.labelHoverClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.labelHoverColor;\n    }\n}\nfunction WebPartMenu_Unhover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.style.textDecoration = this.oldTextDecoration;\n        this.menuLabelElement.className = this.oldClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.oldColor;\n    }\n}\nfunction WebPartMenu_OnClick() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        window.event.returnValue = false;\n        window.event.cancelBubble = true;\n        menu.Show();\n    }\n}\nfunction WebPartMenu_OnKeyPress() {\n    if (window.event.keyCode == 13) {\n        var menu = window.event.srcElement.__menu;\n        if ((typeof(menu) != \"undefined\") && (menu != null)) {\n            window.event.returnValue = false;\n            window.event.cancelBubble = true;\n            menu.Show();\n        }\n    }\n}\nfunction WebPartMenu_OnMouseEnter() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Hover();\n    }\n}\nfunction WebPartMenu_OnMouseLeave() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Unhover();\n    }\n}\nfunction WebPartManager() {\n    this.overlayContainerElement = null;\n    this.zones = new Array();\n    this.dragState = null;\n    this.menu = null;\n    this.draggedWebPart = null;\n    this.AddZone = WebPartManager_AddZone;\n    this.IsDragDropEnabled = WebPartManager_IsDragDropEnabled;\n    this.DragDrop = WebPartManager_DragDrop;\n    this.InitiateWebPartDragDrop = WebPartManager_InitiateWebPartDragDrop;\n    this.CompleteWebPartDragDrop = WebPartManager_CompleteWebPartDragDrop;\n    this.ContinueWebPartDragDrop = WebPartManager_ContinueWebPartDragDrop;\n    this.ProcessWebPartDragEnter = WebPartManager_ProcessWebPartDragEnter;\n    this.ProcessWebPartDragOver = WebPartManager_ProcessWebPartDragOver;\n    this.ProcessWebPartDrop = WebPartManager_ProcessWebPartDrop;\n    this.ShowHelp = WebPartManager_ShowHelp;\n    this.ExportWebPart = WebPartManager_ExportWebPart;\n    this.Execute = WebPartManager_Execute;\n    this.SubmitPage = WebPartManager_SubmitPage;\n    this.UpdatePositions = WebPartManager_UpdatePositions;\n    window.attachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_Dispose() {\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].Dispose();\n    }\n    window.detachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_AddZone(zoneElement, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var zoneIndex = this.zones.length;\n    var zone = new Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor);\n    this.zones[zoneIndex] = zone;\n    return zone;\n}\nfunction WebPartManager_IsDragDropEnabled() {\n    return ((typeof(this.overlayContainerElement) != \"undefined\") && (this.overlayContainerElement != null));\n}\nfunction WebPartManager_DragDrop() {\n    if ((typeof(this.draggedWebPart) != \"undefined\") && (this.draggedWebPart != null)) {\n        var tempWebPart = this.draggedWebPart;\n        this.draggedWebPart = null;\n        tempWebPart.dragDrop();\n        window.setTimeout(\"__wpClearSelection()\", 0);\n    }\n}\nfunction WebPartManager_InitiateWebPartDragDrop(webPartElement) {\n    var webPart = webPartElement.__webPart;\n    this.UpdatePositions();\n    this.dragState = new WebPartDragState(webPartElement, \"move\");\n    var location = __wpGetPageEventLocation(window.event, true);\n    var overlayContainerElement = this.overlayContainerElement;\n    overlayContainerElement.style.left = location.x - webPartElement.offsetWidth / 2;\n    overlayContainerElement.style.top = location.y + 4 + (webPartElement.clientTop ? webPartElement.clientTop : 0);\n    overlayContainerElement.style.display = \"block\";\n    overlayContainerElement.style.width = webPartElement.offsetWidth;\n    overlayContainerElement.style.height = webPartElement.offsetHeight;\n    overlayContainerElement.appendChild(webPartElement.cloneNode(true));\n    if (webPart.allowZoneChange == false) {\n        webPart.zone.allowDrop = true;\n    }\n    else {\n        for (var i = 0; i < __wpm.zones.length; i++) {\n            var zone = __wpm.zones[i];\n            if (zone.allowLayoutChange) {\n                zone.allowDrop = true;\n            }\n        }\n    }\n    document.body.attachEvent(\"ondragover\", Zone_OnDragOver);\n    return \"move\";\n}\nfunction WebPartManager_CompleteWebPartDragDrop() {\n    var dragState = this.dragState;\n    this.dragState = null;\n    if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n    }\n    document.body.detachEvent(\"ondragover\", Zone_OnDragOver);\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].allowDrop = false;\n    }\n    this.overlayContainerElement.removeChild(this.overlayContainerElement.firstChild);\n    this.overlayContainerElement.style.display = \"none\";\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) && (dragState.dropped == true)) {\n        var currentZone = dragState.webPartElement.__webPart.zone;\n        var currentZoneIndex = dragState.webPartElement.__webPart.zoneIndex;\n        if ((currentZone != dragState.dropZoneElement.__zone) ||\n            ((currentZoneIndex != dragState.dropIndex) &&\n             (currentZoneIndex != (dragState.dropIndex - 1)))) {\n            var eventTarget = dragState.dropZoneElement.__zone.uniqueID;\n            var eventArgument = \"Drag:\" + dragState.webPartElement.id + \":\" + dragState.dropIndex;\n            this.SubmitPage(eventTarget, eventArgument);\n        }\n    }\n}\nfunction WebPartManager_ContinueWebPartDragDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var style = this.overlayContainerElement.style;\n        var location = __wpGetPageEventLocation(window.event, true);\n        style.left = location.x - dragState.webPartElement.offsetWidth / 2;\n        style.top = location.y + 4 + (dragState.webPartElement.clientTop ? dragState.webPartElement.clientTop : 0);\n    }\n}\nfunction WebPartManager_Execute(script) {\n    if (this.menu) {\n        this.menu.Hide();\n    }\n    var scriptReference = new Function(script);\n    return (scriptReference() != false);\n}\nfunction WebPartManager_ProcessWebPartDragEnter() {\n    var dragState = __wpm.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var newDropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(newDropZoneElement.__zone) == \"undefined\") || (newDropZoneElement.__zone == null) ||\n            (newDropZoneElement.__zone.allowDrop == false)) {\n            newDropZoneElement = null;\n        }\n        var newDropIndex = -1;\n        if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n            newDropIndex = newDropZoneElement.__zone.GetWebPartIndex(__wpGetPageEventLocation(currentEvent, false));\n            if (newDropIndex == -1) {\n                newDropZoneElement = null;\n            }\n        }\n        if (dragState.dropZoneElement != newDropZoneElement) {\n            if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropZoneElement = newDropZoneElement;\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        else if (dragState.dropIndex != newDropIndex) {\n            if (dragState.dropIndex != -1) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            currentEvent.dataTransfer.effectAllowed = dragState.effect;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ProcessWebPartDragOver() {\n    var dragState = __wpm.dragState;\n    var currentEvent = window.event;\n    var handled = false;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) &&\n        (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if (((typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) &&\n            (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n            dragState.dropZoneElement = null;\n            dragState.dropIndex = -1;\n        }\n        else if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n            var location = __wpGetPageEventLocation(currentEvent, false);\n            var newDropIndex = dropZoneElement.__zone.GetWebPartIndex(location);\n            if (newDropIndex == -1) {\n                dropZoneElement = null;\n            }\n            if (dragState.dropZoneElement != dropZoneElement) {\n                if ((dragState.dropIndex != -1) || (typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) {\n                    dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n                }\n                dragState.dropZoneElement = dropZoneElement;\n            }\n            else {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, true);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n                dropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        handled = true;\n    }\n    if ((typeof(dragState) == \"undefined\") || (dragState == null) ||\n        (typeof(dragState.dropZoneElement) == \"undefined\") || (dragState.dropZoneElement == null)) {\n        currentEvent.dataTransfer.effectAllowed = \"none\";\n    }\n    return handled;\n}\nfunction WebPartManager_ProcessWebPartDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dragState.dropZoneElement == dropZoneElement)) {\n            dragState.dropped = true;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ShowHelp(helpUrl, helpMode) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    if (helpMode == 0 || helpMode == 1) {\n        if (helpMode == 0) {\n            var dialogInfo = \"edge: Sunken; center: yes; help: no; resizable: yes; status: no\";\n            window.showModalDialog(helpUrl, null, dialogInfo);\n        }\n        else {\n            window.open(helpUrl, null, \"scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no\");\n        }\n    }\n    else if (helpMode == 2) {\n        window.location = helpUrl;\n    }\n}\nfunction WebPartManager_ExportWebPart(exportUrl, warn, confirmOnly) {\n    if (warn == true && __wpmExportWarning.length > 0 && this.personalizationScopeShared != true) {\n        if (confirm(__wpmExportWarning) == false) {\n            return false;\n        }\n    }\n    if (confirmOnly == false) {\n        window.location = exportUrl;\n    }\n    return true;\n}\nfunction WebPartManager_UpdatePositions() {\n    for (var i = 0; i < this.zones.length; i++) {\n        this.zones[i].UpdatePosition();\n    }\n}\nfunction WebPartManager_SubmitPage(eventTarget, eventArgument) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    __doPostBack(eventTarget, eventArgument);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebUIValidation.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebUIValidation.js\nvar Page_ValidationVer = \"125\";\nvar Page_IsValid = true;\nvar Page_BlockSubmit = false;\nvar Page_InvalidControlToBeFocused = null;\nvar Page_TextTypes = /^(text|password|file|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction ValidatorUpdateDisplay(val) {\n    if (typeof(val.display) == \"string\") {\n        if (val.display == \"None\") {\n            return;\n        }\n        if (val.display == \"Dynamic\") {\n            val.style.display = val.isvalid ? \"none\" : \"inline\";\n            return;\n        }\n    }\n    if ((navigator.userAgent.indexOf(\"Mac\") > -1) &&\n        (navigator.userAgent.indexOf(\"MSIE\") > -1)) {\n        val.style.display = \"inline\";\n    }\n    val.style.visibility = val.isvalid ? \"hidden\" : \"visible\";\n}\nfunction ValidatorUpdateIsValid() {\n    Page_IsValid = AllValidatorsValid(Page_Validators);\n}\nfunction AllValidatorsValid(validators) {\n    if ((typeof(validators) != \"undefined\") && (validators != null)) {\n        var i;\n        for (i = 0; i < validators.length; i++) {\n            if (!validators[i].isvalid) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction ValidatorHookupControlID(controlID, val) {\n    if (typeof(controlID) != \"string\") {\n        return;\n    }\n    var ctrl = document.getElementById(controlID);\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null)) {\n        ValidatorHookupControl(ctrl, val);\n    }\n    else {\n        val.isvalid = true;\n        val.enabled = false;\n    }\n}\nfunction ValidatorHookupControl(control, val) {\n    if (typeof(control.tagName) != \"string\") {\n        return;  \n    }\n    if (control.tagName != \"INPUT\" && control.tagName != \"TEXTAREA\" && control.tagName != \"SELECT\") {\n        var i;\n        for (i = 0; i < control.childNodes.length; i++) {\n            ValidatorHookupControl(control.childNodes[i], val);\n        }\n        return;\n    }\n    else {\n        if (typeof(control.Validators) == \"undefined\") {\n            control.Validators = new Array;\n            var eventType;\n            if (control.type == \"radio\") {\n                eventType = \"onclick\";\n            } else {\n                eventType = \"onchange\";\n                if (typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                    ValidatorHookupEvent(control, \"onblur\", \"ValidatedControlOnBlur(event); \");\n                }\n            }\n            ValidatorHookupEvent(control, eventType, \"ValidatorOnChange(event); \");\n            if (Page_TextTypes.test(control.type)) {\n                ValidatorHookupEvent(control, \"onkeypress\", \n                    \"event = event || window.event; if (!ValidatedTextBoxOnKeyPress(event)) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } \");\n            }\n        }\n        control.Validators[control.Validators.length] = val;\n    }\n}\nfunction ValidatorHookupEvent(control, eventType, functionPrefix) {\n    var ev = control[eventType];\n    if (typeof(ev) == \"function\") {\n        ev = ev.toString();\n        ev = ev.substring(ev.indexOf(\"{\") + 1, ev.lastIndexOf(\"}\"));\n    }\n    else {\n        ev = \"\";\n    }\n    control[eventType] = new Function(\"event\", functionPrefix + \" \" + ev);\n}\nfunction ValidatorGetValue(id) {\n    var control;\n    control = document.getElementById(id);\n    if (typeof(control.value) == \"string\") {\n        return control.value;\n    }\n    return ValidatorGetValueRecursive(control);\n}\nfunction ValidatorGetValueRecursive(control)\n{\n    if (typeof(control.value) == \"string\" && (control.type != \"radio\" || control.checked == true)) {\n        return control.value;\n    }\n    var i, val;\n    for (i = 0; i<control.childNodes.length; i++) {\n        val = ValidatorGetValueRecursive(control.childNodes[i]);\n        if (val != \"\") return val;\n    }\n    return \"\";\n}\nfunction Page_ClientValidate(validationGroup) {\n    Page_InvalidControlToBeFocused = null;\n    if (typeof(Page_Validators) == \"undefined\") {\n        return true;\n    }\n    var i;\n    for (i = 0; i < Page_Validators.length; i++) {\n        ValidatorValidate(Page_Validators[i], validationGroup, null);\n    }\n    ValidatorUpdateIsValid();\n    ValidationSummaryOnSubmit(validationGroup);\n    Page_BlockSubmit = !Page_IsValid;\n    return Page_IsValid;\n}\nfunction ValidatorCommonOnSubmit() {\n    Page_InvalidControlToBeFocused = null;\n    var result = !Page_BlockSubmit;\n    if ((typeof(window.event) != \"undefined\") && (window.event != null)) {\n        window.event.returnValue = result;\n    }\n    Page_BlockSubmit = false;\n    return result;\n}\nfunction ValidatorEnable(val, enable) {\n    val.enabled = (enable != false);\n    ValidatorValidate(val);\n    ValidatorUpdateIsValid();\n}\nfunction ValidatorOnChange(event) {\n    event = event || window.event;\n    Page_InvalidControlToBeFocused = null;\n    var targetedControl;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        targetedControl = event.srcElement;\n    }\n    else {\n        targetedControl = event.target;\n    }\n    var vals;\n    if (typeof(targetedControl.Validators) != \"undefined\") {\n        vals = targetedControl.Validators;\n    }\n    else {\n        if (targetedControl.tagName.toLowerCase() == \"label\") {\n            targetedControl = document.getElementById(targetedControl.htmlFor);\n            vals = targetedControl.Validators;\n        }\n    }\n    if (vals) {\n        for (var i = 0; i < vals.length; i++) {\n            ValidatorValidate(vals[i], null, event);\n        }\n    }\n    ValidatorUpdateIsValid();\n}\nfunction ValidatedTextBoxOnKeyPress(event) {\n    event = event || window.event;\n    if (event.keyCode == 13) {\n        ValidatorOnChange(event);\n        var vals;\n        if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n            vals = event.srcElement.Validators;\n        }\n        else {\n            vals = event.target.Validators;\n        }\n        return AllValidatorsValid(vals);\n    }\n    return true;\n}\nfunction ValidatedControlOnBlur(event) {\n    event = event || window.event;\n    var control;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        control = event.srcElement;\n    }\n    else {\n        control = event.target;\n    }\n    if ((typeof(control) != \"undefined\") && (control != null) && (Page_InvalidControlToBeFocused == control)) {\n        control.focus();\n        Page_InvalidControlToBeFocused = null;\n    }\n}\nfunction ValidatorValidate(val, validationGroup, event) {\n    val.isvalid = true;\n    if ((typeof(val.enabled) == \"undefined\" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {\n        if (typeof(val.evaluationfunction) == \"function\") {\n            val.isvalid = val.evaluationfunction(val);\n            if (!val.isvalid && Page_InvalidControlToBeFocused == null &&\n                typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                ValidatorSetFocus(val, event);\n            }\n        }\n    }\n    ValidatorUpdateDisplay(val);\n}\nfunction ValidatorSetFocus(val, event) {\n    var ctrl;\n    if (typeof(val.controlhookup) == \"string\") {\n        var eventCtrl;\n        if ((typeof(event) != \"undefined\") && (event != null)) {\n            if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n                eventCtrl = event.srcElement;\n            }\n            else {\n                eventCtrl = event.target;\n            }\n        }\n        if ((typeof(eventCtrl) != \"undefined\") && (eventCtrl != null) &&\n            (typeof(eventCtrl.id) == \"string\") &&\n            (eventCtrl.id == val.controlhookup)) {\n            ctrl = eventCtrl;\n        }\n    }\n    if ((typeof(ctrl) == \"undefined\") || (ctrl == null)) {\n        ctrl = document.getElementById(val.controltovalidate);\n    }\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null) &&\n        (ctrl.tagName.toLowerCase() != \"table\" || (typeof(event) == \"undefined\") || (event == null)) && \n        ((ctrl.tagName.toLowerCase() != \"input\") || (ctrl.type.toLowerCase() != \"hidden\")) &&\n        (typeof(ctrl.disabled) == \"undefined\" || ctrl.disabled == null || ctrl.disabled == false) &&\n        (typeof(ctrl.visible) == \"undefined\" || ctrl.visible == null || ctrl.visible != false) &&\n        (IsInVisibleContainer(ctrl))) {\n        if ((ctrl.tagName.toLowerCase() == \"table\" && (typeof(__nonMSDOMBrowser) == \"undefined\" || __nonMSDOMBrowser)) ||\n            (ctrl.tagName.toLowerCase() == \"span\")) {\n            var inputElements = ctrl.getElementsByTagName(\"input\");\n            var lastInputElement  = inputElements[inputElements.length -1];\n            if (lastInputElement != null) {\n                ctrl = lastInputElement;\n            }\n        }\n        if (typeof(ctrl.focus) != \"undefined\" && ctrl.focus != null) {\n            ctrl.focus();\n            Page_InvalidControlToBeFocused = ctrl;\n        }\n    }\n}\nfunction IsInVisibleContainer(ctrl) {\n    if (typeof(ctrl.style) != \"undefined\" &&\n        ( ( typeof(ctrl.style.display) != \"undefined\" &&\n            ctrl.style.display == \"none\") ||\n          ( typeof(ctrl.style.visibility) != \"undefined\" &&\n            ctrl.style.visibility == \"hidden\") ) ) {\n        return false;\n    }\n    else if (typeof(ctrl.parentNode) != \"undefined\" &&\n             ctrl.parentNode != null &&\n             ctrl.parentNode != ctrl) {\n        return IsInVisibleContainer(ctrl.parentNode);\n    }\n    return true;\n}\nfunction IsValidationGroupMatch(control, validationGroup) {\n    if ((typeof(validationGroup) == \"undefined\") || (validationGroup == null)) {\n        return true;\n    }\n    var controlGroup = \"\";\n    if (typeof(control.validationGroup) == \"string\") {\n        controlGroup = control.validationGroup;\n    }\n    return (controlGroup == validationGroup);\n}\nfunction ValidatorOnLoad() {\n    if (typeof(Page_Validators) == \"undefined\")\n        return;\n    var i, val;\n    for (i = 0; i < Page_Validators.length; i++) {\n        val = Page_Validators[i];\n        if (typeof(val.evaluationfunction) == \"string\") {\n            eval(\"val.evaluationfunction = \" + val.evaluationfunction + \";\");\n        }\n        if (typeof(val.isvalid) == \"string\") {\n            if (val.isvalid == \"False\") {\n                val.isvalid = false;\n                Page_IsValid = false;\n            }\n            else {\n                val.isvalid = true;\n            }\n        } else {\n            val.isvalid = true;\n        }\n        if (typeof(val.enabled) == \"string\") {\n            val.enabled = (val.enabled != \"False\");\n        }\n        if (typeof(val.controltovalidate) == \"string\") {\n            ValidatorHookupControlID(val.controltovalidate, val);\n        }\n        if (typeof(val.controlhookup) == \"string\") {\n            ValidatorHookupControlID(val.controlhookup, val);\n        }\n    }\n    Page_ValidationActive = true;\n}\nfunction ValidatorConvert(op, dataType, val) {\n    function GetFullYear(year) {\n        var twoDigitCutoffYear = val.cutoffyear % 100;\n        var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;\n        return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));\n    }\n    var num, cleanInput, m, exp;\n    if (dataType == \"Integer\") {\n        exp = /^\\s*[-\\+]?\\d+\\s*$/;\n        if (op.match(exp) == null)\n            return null;\n        num = parseInt(op, 10);\n        return (isNaN(num) ? null : num);\n    }\n    else if(dataType == \"Double\") {\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?(\\\\d*)\\\\\" + val.decimalchar + \"?(\\\\d*)\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && m[3].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + (m[2].length>0 ? m[2] : \"0\") + (m[3].length>0 ? \".\" + m[3] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Currency\") {\n        var hasDigits = (val.digits > 0);\n        var beginGroupSize, subsequentGroupSize;\n        var groupSizeNum = parseInt(val.groupsize, 10);\n        if (!isNaN(groupSizeNum) && groupSizeNum > 0) {\n            beginGroupSize = \"{1,\" + groupSizeNum + \"}\";\n            subsequentGroupSize = \"{\" + groupSizeNum + \"}\";\n        }\n        else {\n            beginGroupSize = subsequentGroupSize = \"+\";\n        }\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?((\\\\d\" + beginGroupSize + \"(\\\\\" + val.groupchar + \"\\\\d\" + subsequentGroupSize + \")+)|\\\\d*)\"\n                        + (hasDigits ? \"\\\\\" + val.decimalchar + \"?(\\\\d{0,\" + val.digits + \"})\" : \"\")\n                        + \"\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && hasDigits && m[5].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + m[2].replace(new RegExp(\"(\\\\\" + val.groupchar + \")\", \"g\"), \"\") + ((hasDigits && m[5].length > 0) ? \".\" + m[5] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Date\") {\n        var yearFirstExp = new RegExp(\"^\\\\s*((\\\\d{4})|(\\\\d{2}))([-/]|\\\\. ?)(\\\\d{1,2})\\\\4(\\\\d{1,2})\\\\.?\\\\s*$\");\n        m = op.match(yearFirstExp);\n        var day, month, year;\n        if (m != null && (((typeof(m[2]) != \"undefined\") && (m[2].length == 4)) || val.dateorder == \"ymd\")) {\n            day = m[6];\n            month = m[5];\n            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));\n        }\n        else {\n            if (val.dateorder == \"ymd\"){\n                return null;\n            }\n            var yearLastExp = new RegExp(\"^\\\\s*(\\\\d{1,2})([-/]|\\\\. ?)(\\\\d{1,2})(?:\\\\s|\\\\2)((\\\\d{4})|(\\\\d{2}))(?:\\\\s\\u0433\\\\.|\\\\.)?\\\\s*$\");\n            m = op.match(yearLastExp);\n            if (m == null) {\n                return null;\n            }\n            if (val.dateorder == \"mdy\") {\n                day = m[3];\n                month = m[1];\n            }\n            else {\n                day = m[1];\n                month = m[3];\n            }\n            year = ((typeof(m[5]) != \"undefined\") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10));\n        }\n        month -= 1;\n        var date = new Date(year, month, day);\n        if (year < 100) {\n            date.setFullYear(year);\n        }\n        return (typeof(date) == \"object\" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;\n    }\n    else {\n        return op.toString();\n    }\n}\nfunction ValidatorCompare(operand1, operand2, operator, val) {\n    var dataType = val.type;\n    var op1, op2;\n    if ((op1 = ValidatorConvert(operand1, dataType, val)) == null)\n        return false;\n    if (operator == \"DataTypeCheck\")\n        return true;\n    if ((op2 = ValidatorConvert(operand2, dataType, val)) == null)\n        return true;\n    switch (operator) {\n        case \"NotEqual\":\n            return (op1 != op2);\n        case \"GreaterThan\":\n            return (op1 > op2);\n        case \"GreaterThanEqual\":\n            return (op1 >= op2);\n        case \"LessThan\":\n            return (op1 < op2);\n        case \"LessThanEqual\":\n            return (op1 <= op2);\n        default:\n            return (op1 == op2);\n    }\n}\nfunction CompareValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var compareTo = \"\";\n    if ((typeof(val.controltocompare) != \"string\") ||\n        (typeof(document.getElementById(val.controltocompare)) == \"undefined\") ||\n        (null == document.getElementById(val.controltocompare))) {\n        if (typeof(val.valuetocompare) == \"string\") {\n            compareTo = val.valuetocompare;\n        }\n    }\n    else {\n        compareTo = ValidatorGetValue(val.controltocompare);\n    }\n    var operator = \"Equal\";\n    if (typeof(val.operator) == \"string\") {\n        operator = val.operator;\n    }\n    return ValidatorCompare(value, compareTo, operator, val);\n}\nfunction CustomValidatorEvaluateIsValid(val) {\n    var value = \"\";\n    if (typeof(val.controltovalidate) == \"string\") {\n        value = ValidatorGetValue(val.controltovalidate);\n        if ((ValidatorTrim(value).length == 0) &&\n            ((typeof(val.validateemptytext) != \"string\") || (val.validateemptytext != \"true\"))) {\n            return true;\n        }\n    }\n    var args = { Value:value, IsValid:true };\n    if (typeof(val.clientvalidationfunction) == \"string\") {\n        eval(val.clientvalidationfunction + \"(val, args) ;\");\n    }\n    return args.IsValid;\n}\nfunction RegularExpressionValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var rx = new RegExp(val.validationexpression);\n    var matches = rx.exec(value);\n    return (matches != null && value == matches[0]);\n}\nfunction ValidatorTrim(s) {\n    var m = s.match(/^\\s*(\\S+(\\s+\\S+)*)\\s*$/);\n    return (m == null) ? \"\" : m[1];\n}\nfunction RequiredFieldValidatorEvaluateIsValid(val) {\n    return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))\n}\nfunction RangeValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    return (ValidatorCompare(value, val.minimumvalue, \"GreaterThanEqual\", val) &&\n            ValidatorCompare(value, val.maximumvalue, \"LessThanEqual\", val));\n}\nfunction ValidationSummaryOnSubmit(validationGroup) {\n    if (typeof(Page_ValidationSummaries) == \"undefined\")\n        return;\n    var summary, sums, s;\n    var headerSep, first, pre, post, end;\n    for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {\n        summary = Page_ValidationSummaries[sums];\n        if (!summary) continue;\n        summary.style.display = \"none\";\n        if (!Page_IsValid && IsValidationGroupMatch(summary, validationGroup)) {\n            var i;\n            if (summary.showsummary != \"False\") {\n                summary.style.display = \"\";\n                if (typeof(summary.displaymode) != \"string\") {\n                    summary.displaymode = \"BulletList\";\n                }\n                switch (summary.displaymode) {\n                    case \"List\":\n                        headerSep = \"<br>\";\n                        first = \"\";\n                        pre = \"\";\n                        post = \"<br>\";\n                        end = \"\";\n                        break;\n                    case \"BulletList\":\n                    default:\n                        headerSep = \"\";\n                        first = \"<ul>\";\n                        pre = \"<li>\";\n                        post = \"</li>\";\n                        end = \"</ul>\";\n                        break;\n                    case \"SingleParagraph\":\n                        headerSep = \" \";\n                        first = \"\";\n                        pre = \"\";\n                        post = \" \";\n                        end = \"<br>\";\n                        break;\n                }\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + headerSep;\n                }\n                s += first;\n                for (i=0; i<Page_Validators.length; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        s += pre + Page_Validators[i].errormessage + post;\n                    }\n                }\n                s += end;\n                summary.innerHTML = s;\n                window.scrollTo(0,0);\n            }\n            if (summary.showmessagebox == \"True\") {\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + \"\\r\\n\";\n                }\n                var lastValIndex = Page_Validators.length - 1;\n                for (i=0; i<=lastValIndex; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        switch (summary.displaymode) {\n                            case \"List\":\n                                s += Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"BulletList\":\n                            default:\n                                s += \"- \" + Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"SingleParagraph\":\n                                s += Page_Validators[i].errormessage + \" \";\n                                break;\n                        }\n                    }\n                }\n                alert(s);\n            }\n        }\n    }\n}\nif (window.jQuery) {\n    (function ($) {\n        var dataValidationAttribute = \"data-val\",\n            dataValidationSummaryAttribute = \"data-valsummary\",\n            normalizedAttributes = { validationgroup: \"validationGroup\", focusonerror: \"focusOnError\" };\n        function getAttributesWithPrefix(element, prefix) {\n            var i,\n                attribute,\n                list = {},\n                attributes = element.attributes,\n                length = attributes.length,\n                prefixLength = prefix.length;\n            prefix = prefix.toLowerCase();\n            for (i = 0; i < length; i++) {\n                attribute = attributes[i];\n                if (attribute.specified && attribute.name.substr(0, prefixLength).toLowerCase() === prefix) {\n                    list[attribute.name.substr(prefixLength)] = attribute.value;\n                }\n            }\n            return list;\n        }\n        function normalizeKey(key) {\n            key = key.toLowerCase();\n            return normalizedAttributes[key] === undefined ? key : normalizedAttributes[key];\n        }\n        function addValidationExpando(element) {\n            var attributes = getAttributesWithPrefix(element, dataValidationAttribute + \"-\");\n            $.each(attributes, function (key, value) {\n                element[normalizeKey(key)] = value;\n            });\n        }\n        function dispose(element) {\n            var index = $.inArray(element, Page_Validators);\n            if (index >= 0) {\n                Page_Validators.splice(index, 1);\n            }\n        }\n        function addNormalizedAttribute(name, normalizedName) {\n            normalizedAttributes[name.toLowerCase()] = normalizedName;\n        }\n        function parseSpecificAttribute(selector, attribute, validatorsArray) {\n            return $(selector).find(\"[\" + attribute + \"='true']\").each(function (index, element) {\n                addValidationExpando(element);\n                element.dispose = function () { dispose(element); element.dispose = null; };\n                if ($.inArray(element, validatorsArray) === -1) {\n                    validatorsArray.push(element);\n                }\n            }).length;\n        }\n        function parse(selector) {\n            var length = parseSpecificAttribute(selector, dataValidationAttribute, Page_Validators);\n            length += parseSpecificAttribute(selector, dataValidationSummaryAttribute, Page_ValidationSummaries);\n            return length;\n        }\n        function loadValidators() {\n            if (typeof (ValidatorOnLoad) === \"function\") {\n                ValidatorOnLoad();\n            }\n            if (typeof (ValidatorOnSubmit) === \"undefined\") {\n                window.ValidatorOnSubmit = function () {\n                    return Page_ValidationActive ? ValidatorCommonOnSubmit() : true;\n                };\n            }\n        }\n        function registerUpdatePanel() {\n            if (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {\n                var prm = Sys.WebForms.PageRequestManager.getInstance(),\n                    postBackElement, endRequestHandler;\n                if (prm.get_isInAsyncPostBack()) {\n                    endRequestHandler = function (sender, args) {\n                        if (parse(document)) {\n                            loadValidators();\n                        }\n                        prm.remove_endRequest(endRequestHandler);\n                        endRequestHandler = null;\n                    };\n                    prm.add_endRequest(endRequestHandler);\n                }\n                prm.add_beginRequest(function (sender, args) {\n                    postBackElement = args.get_postBackElement();\n                });\n                prm.add_pageLoaded(function (sender, args) {\n                    var i, panels, valFound = 0;\n                    if (typeof (postBackElement) === \"undefined\") {\n                        return;\n                    }\n                    panels = args.get_panelsUpdated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    panels = args.get_panelsCreated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    if (valFound) {\n                        loadValidators();\n                    }\n                });\n            }\n        }\n        $(function () {\n            if (typeof (Page_Validators) === \"undefined\") {\n                window.Page_Validators = [];\n            }\n            if (typeof (Page_ValidationSummaries) === \"undefined\") {\n                window.Page_ValidationSummaries = [];\n            }\n            if (typeof (Page_ValidationActive) === \"undefined\") {\n                window.Page_ValidationActive = false;\n            }\n            $.WebFormValidator = {\n                addNormalizedAttribute: addNormalizedAttribute,\n                parse: parse\n            };\n            if (parse(document)) {\n                loadValidators();\n            }\n            registerUpdatePanel();\n        });\n    } (jQuery));\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/bootstrap.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n\n/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/\nif (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#carousel\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#collapse\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    var $el = $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#modals\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#popovers\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tabs\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#affix\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.intellisense.js",
    "content": "﻿/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\nintellisense.annotate(jQuery, {\n  'ajax': function() {\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup().</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'ajaxPrefilter': function() {\n    /// <signature>\n    ///   <summary>Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().</summary>\n    ///   <param name=\"dataTypes\" type=\"String\">An optional string containing one or more space-separated dataTypes</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to set default values for future Ajax requests.</param>\n    /// </signature>\n  },\n  'ajaxSetup': function() {\n    /// <signature>\n    ///   <summary>Set default values for future Ajax requests.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A set of key/value pairs that configure the default Ajax request. All options are optional.</param>\n    /// </signature>\n  },\n  'ajaxTransport': function() {\n    /// <signature>\n    ///   <summary>Creates an object that handles the actual transmission of Ajax data.</summary>\n    ///   <param name=\"dataType\" type=\"String\">A string identifying the data type to use</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to return the new transport object to use with the data type provided in the first argument.</param>\n    /// </signature>\n  },\n  'boxModel': function() {\n    /// <summary>Deprecated in jQuery 1.3 (see jQuery.support). States if the current page, in the user's browser, is being rendered using the W3C CSS Box Model.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'browser': function() {\n    /// <summary>Contains flags for the useragent, read from navigator.userAgent. We recommend against using this property; please try to use feature detection instead (see jQuery.support). jQuery.browser may be moved to a plugin in a future release of jQuery.</summary>\n    /// <returns type=\"PlainObject\" />\n  },\n  'browser.version': function() {\n    /// <summary>The version number of the rendering engine for the user's browser.</summary>\n    /// <returns type=\"String\" />\n  },\n  'Callbacks': function() {\n    /// <signature>\n    ///   <summary>A multi-purpose callbacks list object that provides a powerful way to manage callback lists.</summary>\n    ///   <param name=\"flags\" type=\"String\">An optional list of space-separated flags that change how the callback list behaves.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM element is a descendant of another DOM element.</summary>\n    ///   <param name=\"container\" type=\"Element\">The DOM element that may contain the other element.</param>\n    ///   <param name=\"contained\" type=\"Element\">The DOM element that may be contained by (a descendant of) the other element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'cssHooks': function() {\n    /// <summary>Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <param name=\"key\" type=\"String\">Name of the data stored.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'Deferred': function() {\n    /// <signature>\n    ///   <summary>A constructor function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.</summary>\n    ///   <param name=\"beforeStart\" type=\"Function\">A function that is called just before the constructor returns.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove and execute a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    /// </signature>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties.</summary>\n    ///   <param name=\"collection\" type=\"Object\">The object or array to iterate over.</param>\n    ///   <param name=\"callback(indexInArray, valueOfElement)\" type=\"Function\">The function that will be executed on every object.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Takes a string and throws an exception containing it.</summary>\n    ///   <param name=\"message\" type=\"String\">The message to send out.</param>\n    /// </signature>\n  },\n  'extend': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"target\" type=\"Object\">An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"deep\" type=\"Boolean\">If true, the merge becomes recursive (aka. deep copy).</param>\n    ///   <param name=\"target\" type=\"Object\">The object to extend. It will receive the new properties.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP GET request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getJSON': function() {\n    /// <signature>\n    ///   <summary>Load JSON-encoded data from the server using a GET HTTP request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getScript': function() {\n    /// <signature>\n    ///   <summary>Load a JavaScript file from the server using a GET HTTP request, then execute it.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"success(script, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'globalEval': function() {\n    /// <signature>\n    ///   <summary>Execute some JavaScript code globally.</summary>\n    ///   <param name=\"code\" type=\"String\">The JavaScript code to execute.</param>\n    /// </signature>\n  },\n  'grep': function() {\n    /// <signature>\n    ///   <summary>Finds the elements of an array which satisfy a filter function. The original array is not affected.</summary>\n    ///   <param name=\"array\" type=\"Array\">The array to search through.</param>\n    ///   <param name=\"function(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the item, and the second argument is the index.  The function should return a Boolean value.  this will be the global window object.</param>\n    ///   <param name=\"invert\" type=\"Boolean\">If \"invert\" is false, or not provided, then the function returns an array consisting of all elements for which \"callback\" returns true.  If \"invert\" is true, then the function returns an array consisting of all elements for which \"callback\" returns false.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'hasData': function() {\n    /// <signature>\n    ///   <summary>Determine whether an element has any jQuery data associated with it.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to be checked for data.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'holdReady': function() {\n    /// <signature>\n    ///   <summary>Holds or releases the execution of jQuery's ready event.</summary>\n    ///   <param name=\"hold\" type=\"Boolean\">Indicates whether the ready hold is being requested or released</param>\n    /// </signature>\n  },\n  'inArray': function() {\n    /// <signature>\n    ///   <summary>Search for a specified value within an array and return its index (or -1 if not found).</summary>\n    ///   <param name=\"value\" type=\"Anything\">The value to search for.</param>\n    ///   <param name=\"array\" type=\"Array\">An array through which to search.</param>\n    ///   <param name=\"fromIndex\" type=\"Number\">The index of the array at which to begin the search. The default is 0, which will search the whole array.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'isArray': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is an array.</summary>\n    ///   <param name=\"obj\" type=\"Object\">Object to test whether or not it is an array.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isEmptyObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is empty (contains no enumerable properties).</summary>\n    ///   <param name=\"object\" type=\"Object\">The object that will be checked to see if it's empty.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isFunction': function() {\n    /// <signature>\n    ///   <summary>Determine if the argument passed is a Javascript function object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a function.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isNumeric': function() {\n    /// <signature>\n    ///   <summary>Determines whether its argument is a number.</summary>\n    ///   <param name=\"value\" type=\"PlainObject\">The value to be tested.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isPlainObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is a plain object (created using \"{}\" or \"new Object\").</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">The object that will be checked to see if it's a plain object.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isWindow': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is a window.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a window.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isXMLDoc': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM node is within an XML document (or is an XML document).</summary>\n    ///   <param name=\"node\" type=\"Element\">The DOM node that will be checked to see if it's in an XML document.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'makeArray': function() {\n    /// <signature>\n    ///   <summary>Convert an array-like object into a true JavaScript array.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Any object to turn into a native Array.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array to translate.</param>\n    ///   <param name=\"callback(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"arrayOrObject\" type=\"Object\">The Array or Object to translate.</param>\n    ///   <param name=\"callback( value, indexOrKey )\" type=\"Function\">The function to process each item against.  The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'merge': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two arrays together into the first array.</summary>\n    ///   <param name=\"first\" type=\"Array\">The first array to merge, the elements of second added.</param>\n    ///   <param name=\"second\" type=\"Array\">The second array to merge into the first, unaltered.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'noConflict': function() {\n    /// <signature>\n    ///   <summary>Relinquish jQuery's control of the $ variable.</summary>\n    ///   <param name=\"removeAll\" type=\"Boolean\">A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself).</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'noop': function() {\n    /// <summary>An empty function.</summary>\n  },\n  'now': function() {\n    /// <summary>Return a number representing the current time.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'param': function() {\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <param name=\"traditional\" type=\"Boolean\">A Boolean indicating whether to perform a traditional \"shallow\" serialization.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'parseHTML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an array of DOM nodes.</summary>\n    ///   <param name=\"data\" type=\"String\">HTML string to be parsed</param>\n    ///   <param name=\"context\" type=\"Element\">DOM element to serve as the context in which the HTML fragment will be created</param>\n    ///   <param name=\"keepScripts\" type=\"Boolean\">A Boolean indicating whether to include scripts passed in the HTML string</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'parseJSON': function() {\n    /// <signature>\n    ///   <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>\n    ///   <param name=\"json\" type=\"String\">The JSON string to parse.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'parseXML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an XML document.</summary>\n    ///   <param name=\"data\" type=\"String\">a well-formed XML string to be parsed</param>\n    ///   <returns type=\"XMLDocument\" />\n    /// </signature>\n  },\n  'post': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP POST request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'proxy': function() {\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function referenced in the function argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function named in the name argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element where the array of queued functions is attached.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element on which to add a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback()\" type=\"Function\">The new function to add to the queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove data.</param>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'sub': function() {\n    /// <summary>Creates a new copy of jQuery whose properties and methods can be modified without affecting the original jQuery object.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'support': function() {\n    /// <summary>A collection of properties that represent the presence of different browser features or bugs. Primarily intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'trim': function() {\n    /// <signature>\n    ///   <summary>Remove the whitespace from the beginning and end of a string.</summary>\n    ///   <param name=\"str\" type=\"String\">The string to trim.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'type': function() {\n    /// <signature>\n    ///   <summary>Determine the internal JavaScript [[Class]] of an object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to get the internal JavaScript [[Class]] of.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'unique': function() {\n    /// <signature>\n    ///   <summary>Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array of DOM elements.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'when': function() {\n    /// <signature>\n    ///   <summary>Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.</summary>\n    ///   <param name=\"deferreds\" type=\"Deferred\">One or more Deferred objects, or plain JavaScript objects.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nvar _1228819969 = jQuery.Callbacks;\njQuery.Callbacks = function(flags) {\nvar _object = _1228819969(flags);\nintellisense.annotate(_object, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add a callback or a collection of callbacks to a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be added to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'disable': function() {\n    /// <summary>Disable a callback list from doing anything more.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'disabled': function() {\n    /// <summary>Determine if the callbacks list has been disabled.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'empty': function() {\n    /// <summary>Remove all of the callbacks from a list.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'fire': function() {\n    /// <signature>\n    ///   <summary>Call all of the callbacks with the given arguments</summary>\n    ///   <param name=\"arguments\" type=\"Anything\">The argument or list of arguments to pass back to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'fired': function() {\n    /// <summary>Determine if the callbacks have already been called at least once.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'fireWith': function() {\n    /// <signature>\n    ///   <summary>Call all callbacks in a list with the given context and arguments.</summary>\n    ///   <param name=\"context\" type=\"\">A reference to the context in which the callbacks in the list should be fired.</param>\n    ///   <param name=\"args\" type=\"\">An argument, or array of arguments, to pass to the callbacks in the list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Determine whether a supplied callback is in a list</summary>\n    ///   <param name=\"callback\" type=\"Function\">The callback to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'lock': function() {\n    /// <summary>Lock a callback list in its current state.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'locked': function() {\n    /// <summary>Determine if the callbacks list has been locked.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove a callback or a collection of callbacks from a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be removed from the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _1228819969);\n\nvar _731531622 = jQuery.Deferred;\njQuery.Deferred = function(func) {\nvar _object = _731531622(func);\nintellisense.annotate(_object, {\n  'always': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is either resolved or rejected.</summary>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred is resolved or rejected.</param>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'done': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is resolved.</param>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'fail': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is rejected.</summary>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is rejected.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'isRejected': function() {\n    /// <summary>Determine whether a Deferred object has been rejected.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isResolved': function() {\n    /// <summary>Determine whether a Deferred object has been resolved.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'notify': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'notifyWith': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the progressCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'pipe': function() {\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'progress': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object generates progress notifications.</summary>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred generates progress notifications.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Deferred's Promise object.</summary>\n    ///   <param name=\"target\" type=\"Object\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'reject': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'rejectWith': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the failCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolve': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolveWith': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the doneCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'state': function() {\n    /// <summary>Determine the current state of a Deferred object.</summary>\n    /// <returns type=\"String\" />\n  },\n  'then': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">A function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred notifies progress.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _731531622);\n\nintellisense.annotate(jQuery.Event.prototype, {\n  'currentTarget': function() {\n    /// <summary>The current DOM element within the event bubbling phase.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'data': function() {\n    /// <summary>An optional object of data passed to an event method when the current executing handler is bound.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'delegateTarget': function() {\n    /// <summary>The element where the currently-called jQuery event handler was attached.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'isDefaultPrevented': function() {\n    /// <summary>Returns whether event.preventDefault() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isImmediatePropagationStopped': function() {\n    /// <summary>Returns whether event.stopImmediatePropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isPropagationStopped': function() {\n    /// <summary>Returns whether event.stopPropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'metaKey': function() {\n    /// <summary>Indicates whether the META key was pressed when the event fired.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'namespace': function() {\n    /// <summary>The namespace specified when the event was triggered.</summary>\n    /// <returns type=\"String\" />\n  },\n  'pageX': function() {\n    /// <summary>The mouse position relative to the left edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'pageY': function() {\n    /// <summary>The mouse position relative to the top edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'preventDefault': function() {\n    /// <summary>If this method is called, the default action of the event will not be triggered.</summary>\n  },\n  'relatedTarget': function() {\n    /// <summary>The other DOM element involved in the event, if any.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'result': function() {\n    /// <summary>The last value returned by an event handler that was triggered by this event, unless the value was undefined.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'stopImmediatePropagation': function() {\n    /// <summary>Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree.</summary>\n  },\n  'stopPropagation': function() {\n    /// <summary>Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.</summary>\n  },\n  'target': function() {\n    /// <summary>The DOM element that initiated the event.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'timeStamp': function() {\n    /// <summary>The difference in milliseconds between the time the browser created the event and January 1, 1970.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'type': function() {\n    /// <summary>Describes the nature of the event.</summary>\n    /// <returns type=\"String\" />\n  },\n  'which': function() {\n    /// <summary>For key or mouse events, this property indicates the specific key or button that was pressed.</summary>\n    /// <returns type=\"Number\" />\n  },\n});\n\nintellisense.annotate(jQuery.fn, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"html\" type=\"String\">An HTML fragment to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery object \">An existing jQuery object to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <param name=\"context\" type=\"Element\">The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addBack': function() {\n    /// <signature>\n    ///   <summary>Add the previous set of elements on the stack to the current set, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addClass': function() {\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be added to the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"function(index, currentClass)\" type=\"Function\">A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'after': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxComplete': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete. This is an AjaxEvent.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxError': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxSettings, thrownError)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSend': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed before an Ajax request is sent. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStart': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when the first Ajax request begins. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStop': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when all Ajax requests have completed. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSuccess': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'all': function() {\n    /// <summary>Selects all elements.</summary>\n  },\n  'andSelf': function() {\n    /// <summary>Add the previous set of elements on the stack to the current set.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'animate': function() {\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'animated': function() {\n    /// <summary>Select all elements that are in the progress of an animation at the time the selector is run.</summary>\n  },\n  'append': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'appendTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the end of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attr': function() {\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the attribute.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributes\" type=\"PlainObject\">An object of attribute-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"function(index, attr)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attributeContains': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing the a given substring.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsPrefix': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-).</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsWord': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing a given word, delimited by spaces.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEndsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEquals': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value exactly equal to a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeHas': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute, with any value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    /// </signature>\n  },\n  'attributeMultiple': function() {\n    /// <signature>\n    ///   <summary>Matches elements that match all of the specified attribute filters.</summary>\n    ///   <param name=\"attributeFilter1\" type=\"String\">An attribute filter.</param>\n    ///   <param name=\"attributeFilter2\" type=\"String\">Another attribute filter, reducing the selection even more</param>\n    ///   <param name=\"attributeFilterN\" type=\"String\">As many more attribute filters as necessary</param>\n    /// </signature>\n  },\n  'attributeNotEqual': function() {\n    /// <signature>\n    ///   <summary>Select elements that either don't have the specified attribute, or do have the specified attribute but not with a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeStartsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value beginning exactly with a given string.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'before': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert before each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'bind': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"preventBubble\" type=\"Boolean\">Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"events\" type=\"Object\">An object containing one or more DOM event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'blur': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'button': function() {\n    /// <summary>Selects all button elements and elements of type button.</summary>\n  },\n  'change': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'checkbox': function() {\n    /// <summary>Selects all elements of type checkbox.</summary>\n  },\n  'checked': function() {\n    /// <summary>Matches all elements that are checked.</summary>\n  },\n  'child': function() {\n    /// <signature>\n    ///   <summary>Selects all direct child elements specified by \"child\" of elements specified by \"parent\".</summary>\n    ///   <param name=\"parent\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"child\" type=\"String\">A selector to filter the child elements.</param>\n    /// </signature>\n  },\n  'children': function() {\n    /// <signature>\n    ///   <summary>Get the children of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'class': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given class.</summary>\n    ///   <param name=\"class\" type=\"String\">A class to search for. An element can have multiple classes; only one of them must match.</param>\n    /// </signature>\n  },\n  'clearQueue': function() {\n    /// <signature>\n    ///   <summary>Remove from the queue all items that have not yet been run.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'click': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'clone': function() {\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers should be copied along with the elements. As of jQuery 1.4, element data will be copied as well.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back to false in 1.5.1 and up.</param>\n    ///   <param name=\"deepWithDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'closest': function() {\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <param name=\"context\" type=\"Element\">A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Select all elements that contain the specified text.</summary>\n    ///   <param name=\"text\" type=\"String\">A string of text to look for. It's case sensitive.</param>\n    /// </signature>\n  },\n  'contents': function() {\n    /// <summary>Get the children of each element in the set of matched elements, including text and comment nodes.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'context': function() {\n    /// <summary>The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'css': function() {\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"key\" type=\"String\">A string naming the piece of data to set.</param>\n    ///   <param name=\"value\" type=\"Object\">The new data value; it can be any Javascript type including Array or Object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An object of key-value pairs of data to update.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dblclick': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delay': function() {\n    /// <signature>\n    ///   <summary>Set a timer to delay execution of subsequent items in the queue.</summary>\n    ///   <param name=\"duration\" type=\"Number\">An integer indicating the number of milliseconds to delay execution of the next item in the queue.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delegate': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched elements.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'descendant': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are descendants of a given ancestor.</summary>\n    ///   <param name=\"ancestor\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"descendant\" type=\"String\">A selector to filter the descendant elements.</param>\n    /// </signature>\n  },\n  'detach': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'die': function() {\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or keydown.</param>\n    ///   <param name=\"handler\" type=\"String\">The function that is no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types, such as click or keydown and their corresponding functions that are no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'disabled': function() {\n    /// <summary>Selects all elements that are disabled.</summary>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>Iterate over a jQuery object, executing a function for each matched element.</summary>\n    ///   <param name=\"function(index, Element)\" type=\"Function\">A function to execute for each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'element': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given tag name.</summary>\n    ///   <param name=\"element\" type=\"String\">An element to search for. Refers to the tagName of DOM nodes.</param>\n    /// </signature>\n  },\n  'empty': function() {\n    /// <summary>Select all elements that have no children (including text nodes).</summary>\n  },\n  'enabled': function() {\n    /// <summary>Selects all elements that are enabled.</summary>\n  },\n  'end': function() {\n    /// <summary>End the most recent filtering operation in the current chain and return the set of matched elements to its previous state.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'eq': function() {\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index of the element to match.</param>\n    /// </signature>\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"-index\" type=\"Number\">Zero-based index of the element to match, counting backwards from the last element.</param>\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'even': function() {\n    /// <summary>Selects even elements, zero-indexed.  See also odd.</summary>\n  },\n  'fadeIn': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeOut': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeTo': function() {\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'file': function() {\n    /// <summary>Selects all elements of type file.</summary>\n  },\n  'filter': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'find': function() {\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'finish': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'first': function() {\n    /// <summary>Selects the first matched element.</summary>\n  },\n  'first-child': function() {\n    /// <summary>Selects all elements that are the first child of their parent.</summary>\n  },\n  'first-of-type': function() {\n    /// <summary>Selects all elements that are the first among siblings of the same element name.</summary>\n  },\n  'focus': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusin': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Retrieve the DOM elements matched by the jQuery object.</summary>\n    ///   <param name=\"index\" type=\"Number\">A zero-based integer indicating which element to retrieve.</param>\n    ///   <returns type=\"Element, Array\" />\n    /// </signature>\n  },\n  'gt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index greater than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"contained\" type=\"Element\">A DOM element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hasClass': function() {\n    /// <signature>\n    ///   <summary>Determine whether any of the matched elements are assigned the given class.</summary>\n    ///   <param name=\"className\" type=\"String\">The class name to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'header': function() {\n    /// <summary>Selects all elements that are headers, like h1, h2, h3 and so on.</summary>\n  },\n  'height': function() {\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"function(index, height)\" type=\"Function\">A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hidden': function() {\n    /// <summary>Selects all elements that are hidden.</summary>\n  },\n  'hide': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hover': function() {\n    /// <signature>\n    ///   <summary>Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements.</summary>\n    ///   <param name=\"handlerIn(eventObject)\" type=\"Function\">A function to execute when the mouse pointer enters the element.</param>\n    ///   <param name=\"handlerOut(eventObject)\" type=\"Function\">A function to execute when the mouse pointer leaves the element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'html': function() {\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"htmlString\" type=\"String\">A string of HTML to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, oldhtml)\" type=\"Function\">A function returning the HTML content to set. Receives the           index position of the element in the set and the old HTML value as arguments.           jQuery empties the element before calling the function;           use the oldhtml argument to reference the previous content.           Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'id': function() {\n    /// <signature>\n    ///   <summary>Selects a single element with the given id attribute.</summary>\n    ///   <param name=\"id\" type=\"String\">An ID to search for, specified via the id attribute of an element.</param>\n    /// </signature>\n  },\n  'image': function() {\n    /// <summary>Selects all elements of type image.</summary>\n  },\n  'index': function() {\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector representing a jQuery collection in which to look for an element.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"element\" type=\"jQuery\">The DOM element or first element within the jQuery object to look for.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'init': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'innerHeight': function() {\n    /// <summary>Get the current computed height for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'innerWidth': function() {\n    /// <summary>Get the current computed width for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'input': function() {\n    /// <summary>Selects all input, textarea, select and button elements.</summary>\n  },\n  'insertAfter': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements after the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'insertBefore': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements before the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'is': function() {\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'jquery': function() {\n    /// <summary>A string containing the jQuery version number.</summary>\n    /// <returns type=\"String\" />\n  },\n  'keydown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keypress': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keyup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lang': function() {\n    /// <signature>\n    ///   <summary>Selects all elements of the specified language.</summary>\n    ///   <param name=\"language\" type=\"String\">A language code.</param>\n    /// </signature>\n  },\n  'last': function() {\n    /// <summary>Selects the last matched element.</summary>\n  },\n  'last-child': function() {\n    /// <summary>Selects all elements that are the last child of their parent.</summary>\n  },\n  'last-of-type': function() {\n    /// <summary>Selects all elements that are the last among siblings of the same element name.</summary>\n  },\n  'length': function() {\n    /// <summary>The number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'live': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more JavaScript event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'load': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index less than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Pass each element in the current matched set through a function, producing a new jQuery object containing the return values.</summary>\n    ///   <param name=\"callback(index, domElement)\" type=\"Function\">A function object that will be invoked for each element in the current set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousedown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseenter': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseleave': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousemove': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseover': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'multiple': function() {\n    /// <signature>\n    ///   <summary>Selects the combined results of all the specified selectors.</summary>\n    ///   <param name=\"selector1\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"selector2\" type=\"String\">Another valid selector.</param>\n    ///   <param name=\"selectorN\" type=\"String\">As many more valid selectors as you like.</param>\n    /// </signature>\n  },\n  'next': function() {\n    /// <signature>\n    ///   <summary>Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'next adjacent': function() {\n    /// <signature>\n    ///   <summary>Selects all next elements matching \"next\" that are immediately preceded by a sibling \"prev\".</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"next\" type=\"String\">A selector to match the element that is next to the first selector.</param>\n    /// </signature>\n  },\n  'next siblings': function() {\n    /// <signature>\n    ///   <summary>Selects all sibling elements that follow after the \"prev\" element, have the same parent, and match the filtering \"siblings\" selector.</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"siblings\" type=\"String\">A selector to filter elements that are the following siblings of the first selector.</param>\n    /// </signature>\n  },\n  'nextAll': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nextUntil': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'not': function() {\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more DOM elements to remove from the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nth-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-child(even), :nth-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-of-type(even), :nth-last-of-type(4n) )</param>\n    /// </signature>\n  },\n  'nth-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth child of their parent in relation to siblings with the same element name.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-of-type(even), :nth-of-type(4n) )</param>\n    /// </signature>\n  },\n  'odd': function() {\n    /// <summary>Selects odd elements, zero-indexed.  See also even.</summary>\n  },\n  'off': function() {\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, or just namespaces, such as \"click\", \"keydown.myPlugin\", or \".myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A handler function previously attached for the event(s), or the special value false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offset': function() {\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"coordinates\" type=\"PlainObject\">An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"function(index, coords)\" type=\"Function\">A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offsetParent': function() {\n    /// <summary>Get the closest ancestor element that is positioned.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'on': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'one': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing one or more JavaScript event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'only-child': function() {\n    /// <summary>Selects all elements that are the only child of their parent.</summary>\n  },\n  'only-of-type': function() {\n    /// <summary>Selects all elements that have no siblings with the same element name.</summary>\n  },\n  'outerHeight': function() {\n    /// <signature>\n    ///   <summary>Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without \"px\") representation of the value or null if called on an empty set of elements.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'outerWidth': function() {\n    /// <signature>\n    ///   <summary>Get the current computed width for the first element in the set of matched elements, including padding and border.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'parent': function() {\n    /// <signature>\n    ///   <summary>Get the parent of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parents': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parentsUntil': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'password': function() {\n    /// <summary>Selects all elements of type password.</summary>\n  },\n  'position': function() {\n    /// <summary>Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'prepend': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prependTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the beginning of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prev': function() {\n    /// <signature>\n    ///   <summary>Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevAll': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevUntil': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.</summary>\n    ///   <param name=\"type\" type=\"String\">The type of queue that needs to be observed.</param>\n    ///   <param name=\"target\" type=\"PlainObject\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'prop': function() {\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"value\" type=\"Boolean\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"function(index, oldPropertyValue)\" type=\"Function\">A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'pushStack': function() {\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <param name=\"name\" type=\"String\">The name of a jQuery method that generated the array of elements.</param>\n    ///   <param name=\"arguments\" type=\"Array\">The arguments that were passed in to the jQuery method (for serialization).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback( next )\" type=\"Function\">The new function to add to the queue, with a function to call that will dequeue the next item.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'radio': function() {\n    /// <summary>Selects all  elements of type radio.</summary>\n  },\n  'ready': function() {\n    /// <signature>\n    ///   <summary>Specify a function to execute when the DOM is fully loaded.</summary>\n    ///   <param name=\"handler\" type=\"Function\">A function to execute after the DOM is ready.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeAttr': function() {\n    /// <signature>\n    ///   <summary>Remove an attribute from each element in the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">An attribute to remove; as of version 1.7, it can be a space-separated list of attributes.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeClass': function() {\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be removed from the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, class)\" type=\"Function\">A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"list\" type=\"String\">An array or space-separated string naming the pieces of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeProp': function() {\n    /// <signature>\n    ///   <summary>Remove a property for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceAll': function() {\n    /// <signature>\n    ///   <summary>Replace each target element with the set of matched elements.</summary>\n    ///   <param name=\"target\" type=\"String\">A selector expression indicating which element(s) to replace.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceWith': function() {\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"newContent\" type=\"jQuery\">The content to insert. May be an HTML string, DOM element, or jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns content with which to replace the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'reset': function() {\n    /// <summary>Selects all elements of type reset.</summary>\n  },\n  'resize': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'root': function() {\n    /// <signature>\n    ///   <summary>Selects the element that is the root of the document.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'scroll': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollLeft': function() {\n    /// <signature>\n    ///   <summary>Set the current horizontal position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollTop': function() {\n    /// <signature>\n    ///   <summary>Set the current vertical position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'select': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'selected': function() {\n    /// <summary>Selects all elements that are selected.</summary>\n  },\n  'selector': function() {\n    /// <summary>A selector representing selector originally passed to jQuery().</summary>\n    /// <returns type=\"String\" />\n  },\n  'serialize': function() {\n    /// <summary>Encode a set of form elements as a string for submission.</summary>\n    /// <returns type=\"String\" />\n  },\n  'serializeArray': function() {\n    /// <summary>Encode a set of form elements as an array of names and values.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'show': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'siblings': function() {\n    /// <signature>\n    ///   <summary>Get the siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'size': function() {\n    /// <summary>Return the number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'slice': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to a subset specified by a range of indices.</summary>\n    ///   <param name=\"start\" type=\"Number\">An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set.</param>\n    ///   <param name=\"end\" type=\"Number\">An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideDown': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideUp': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'stop': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'submit': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'target': function() {\n    /// <summary>Selects the target element indicated by the fragment identifier of the document's URI.</summary>\n  },\n  'text': function() {\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"textString\" type=\"String\">A string of text to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"function(index, text)\" type=\"Function\">A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toArray': function() {\n    /// <summary>Retrieve all the DOM elements contained in the jQuery set, as an array.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'toggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"showOrHide\" type=\"Boolean\">A Boolean indicating whether to show or hide the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toggleClass': function() {\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"function(index, class, switch)\" type=\"Function\">A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'trigger': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"PlainObject\">Additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"event\" type=\"Event\">A jQuery.Event object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'triggerHandler': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers attached to an element for an event.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"Array\">An array of additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'unbind': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">The function that is to be no longer executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"false\" type=\"Boolean\">Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"event\" type=\"Object\">A JavaScript event object as passed to an event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'undelegate': function() {\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">An object of one or more event types and previously bound functions to unbind from them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"namespace\" type=\"String\">A string containing a namespace to unbind all events from.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unload': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">A plain object of data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unwrap': function() {\n    /// <summary>Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'val': function() {\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Array\">A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'visible': function() {\n    /// <summary>Selects all elements that are visible.</summary>\n  },\n  'width': function() {\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, width)\" type=\"Function\">A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrap': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapAll': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around all elements in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapInner': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"String\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\nintellisense.annotate(window, {\n  '$': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * jQuery JavaScript Library v1.10.2\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:48Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// Support: IE<10\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.10.2\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler\n\tcompleted = function( event ) {\n\n\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\t\tdetach();\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\t// Clean-up method for dom ready events\n\tdetach = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t\t} else {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\t\twindow.detachEvent( \"onload\", completed );\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( jQuery.support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn core_hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.10.2\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\n\t\t});\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val === undefined ?\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull :\n\t\tval;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function( support ) {\n\n\tvar all, a, input, select, fragment, opt, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Finish early in limited (non-browser) environments\n\tall = div.getElementsByTagName(\"*\") || [];\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !a || !a.style || !all.length ) {\n\t\treturn support;\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName(\"tbody\").length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName(\"link\").length;\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Make sure that element opacity exists\n\t// (IE uses filter instead)\n\t// Use a regex to work around a WebKit issue. See #5145\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!a.style.cssFloat;\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone = document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Will be defined later\n\tsupport.inlineBlockNeedsLayout = false;\n\tsupport.shrinkWrapBlocks = false;\n\tsupport.pixelPosition = false;\n\tsupport.deleteExpando = true;\n\tsupport.noCloneEvent = true;\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: IE<9\n\t// Iteration over object's inherited properties before its own.\n\tfor ( i in jQuery( support ) ) {\n\t\tbreak;\n\t}\n\tsupport.ownLast = i !== \"0\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior.\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t\t// Support: IE<8\n\t\t\t\tbody.style.zoom = 1;\n\t\t\t}\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})({});\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"applet\": true,\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\tdata = null,\n\t\t\ti = 0,\n\t\t\telem = this[0];\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf(\"data-\") === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar ret, hooks, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Use proper attribute retrieval(#6932, #12072)\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\telem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\t\tret = isXML ?\n\t\t\t\t\tundefined :\n\t\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\t\tnull;\n\t\t\tjQuery.expr.attrHandle[ name ] = fn;\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\tjQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =\n\t\t// Some attributes are constructed with empty-string values when not defined\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\t(ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t};\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ret.specified ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tcur = ret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\nvar iframe, getStyles, curCSS,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar len, styles,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Otherwise expose jQuery to the global object as usual\n\twindow.jQuery = window.$ = jQuery;\n\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n})( window );\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/modernizr-2.6.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton; http://www.modernizr.com/license/\n *\n * Includes matchMedia polyfill; Copyright (c) 2010 Filament Group, Inc; http://opensource.org/licenses/MIT\n *\n * Includes material adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js; Copyright 2009-2012 by contributors; http://opensource.org/licenses/MIT\n *\n * Includes material from css-support; Copyright (c) 2005-2012 Diego Perini; https://github.com/dperini/css-support/blob/master/LICENSE\n *\n * NUGET: END LICENSE TEXT */\n\n/*!\n * Modernizr v2.6.2\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.6.2',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node, docOverflow,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body || document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style id=\"s', mod, '\">', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = '';\n          //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n          fakeBody.style.overflow = 'hidden';\n          docOverflow = docElement.style.overflow;\n          docElement.style.overflow = 'hidden';\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      if ( !body ) {\n          fakeBody.parentNode.removeChild(fakeBody);\n          docElement.style.overflow = docOverflow;\n      } else {\n          div.parentNode.removeChild(div);\n      }\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq).matches;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProp = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n\n        if (typeof target != \"function\") {\n            throw new TypeError();\n        }\n\n        var args = slice.call(arguments, 1),\n            bound = function () {\n\n            if (this instanceof bound) {\n\n              var F = function(){};\n              F.prototype = target.prototype;\n              var self = new F();\n\n              var result = target.apply(\n                  self,\n                  args.concat(slice.call(arguments))\n              );\n              if (Object(result) === result) {\n                  return result;\n              }\n              return self;\n\n            } else {\n\n              return target.apply(\n                  that,\n                  args.concat(slice.call(arguments))\n              );\n\n            }\n\n        };\n\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    // Because the testing of the CSS property names (with \"-\", as\n    // opposed to the camelCase DOM properties) is non-portable and\n    // non-standard but works in WebKit and IE (but not Gecko or Opera),\n    // we explicitly reject properties with dashes so that authors\n    // developing in WebKit or IE first don't end up with\n    // browser-specific content by accident.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            var prop = props[i];\n            if ( !contains(prop, \"-\") && mStyle[prop] !== undefined ) {\n                return prefixed == 'pfx' ? prop : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexWrap');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return (/(url\\s*\\(.*?){3}/).test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return (/^0.55$/).test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   daneden.me/2011/12/putting-up-with-androids-bullshit/\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1) +\n             // standard syntax             // trailing 'background-image:'\n              prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.getElementById('smodernizr'),\n              sheet = style.sheet || style.styleSheet,\n              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:\"',smile,'\";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 3;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProp(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProp( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (typeof enableClasses !== \"undefined\" && enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n    ;(function(window, document) {\n    /*jshint evil:true */\n      /** Preset options */\n      var options = window.html5 || {};\n\n      /** Used to skip problem elements */\n      var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n      /** Not all elements can be cloned in IE **/\n      var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n      /** Detect whether the browser supports default html5 styles */\n      var supportsHtml5Styles;\n\n      /** Name of the expando, to work with multiple documents or to re-shiv one document */\n      var expando = '_html5shiv';\n\n      /** The id for the the documents expando */\n      var expanID = 0;\n\n      /** Cached data for each document */\n      var expandoData = {};\n\n      /** Detect whether the browser supports unknown elements */\n      var supportsUnknownElements;\n\n      (function() {\n        try {\n            var a = document.createElement('a');\n            a.innerHTML = '<xyz></xyz>';\n            //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n            supportsHtml5Styles = ('hidden' in a);\n\n            supportsUnknownElements = a.childNodes.length == 1 || (function() {\n              // assign a false positive if unable to shiv\n              (document.createElement)('a');\n              var frag = document.createDocumentFragment();\n              return (\n                typeof frag.cloneNode == 'undefined' ||\n                typeof frag.createDocumentFragment == 'undefined' ||\n                typeof frag.createElement == 'undefined'\n              );\n            }());\n        } catch(e) {\n          supportsHtml5Styles = true;\n          supportsUnknownElements = true;\n        }\n\n      }());\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n\n        /**\n       * Returns the data associated to the given document\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @returns {Object} An object of data.\n       */\n      function getExpandoData(ownerDocument) {\n        var data = expandoData[ownerDocument[expando]];\n        if (!data) {\n            data = {};\n            expanID++;\n            ownerDocument[expando] = expanID;\n            expandoData[expanID] = data;\n        }\n        return data;\n      }\n\n      /**\n       * returns a shived element for the given nodeName and document\n       * @memberOf html5\n       * @param {String} nodeName name of the element\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived element.\n       */\n      function createElement(nodeName, ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createElement(nodeName);\n        }\n        if (!data) {\n            data = getExpandoData(ownerDocument);\n        }\n        var node;\n\n        if (data.cache[nodeName]) {\n            node = data.cache[nodeName].cloneNode();\n        } else if (saveClones.test(nodeName)) {\n            node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n        } else {\n            node = data.createElem(nodeName);\n        }\n\n        // Avoid adding some elements to fragments in IE < 9 because\n        // * Attributes like `name` or `type` cannot be set/changed once an element\n        //   is inserted into a document/fragment\n        // * Link elements with `src` attributes that are inaccessible, as with\n        //   a 403 response, will cause the tab/window to crash\n        // * Script elements appended to fragments will execute when their `src`\n        //   or `text` property is set\n        return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;\n      }\n\n      /**\n       * returns a shived DocumentFragment for the given document\n       * @memberOf html5\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived DocumentFragment.\n       */\n      function createDocumentFragment(ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createDocumentFragment();\n        }\n        data = data || getExpandoData(ownerDocument);\n        var clone = data.frag.cloneNode(),\n            i = 0,\n            elems = getElements(),\n            l = elems.length;\n        for(;i<l;i++){\n            clone.createElement(elems[i]);\n        }\n        return clone;\n      }\n\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       * @param {Object} data of the document.\n       */\n      function shivMethods(ownerDocument, data) {\n        if (!data.cache) {\n            data.cache = {};\n            data.createElem = ownerDocument.createElement;\n            data.createFrag = ownerDocument.createDocumentFragment;\n            data.frag = data.createFrag();\n        }\n\n\n        ownerDocument.createElement = function(nodeName) {\n          //abort shiv\n          if (!html5.shivMethods) {\n              return data.createElem(nodeName);\n          }\n          return createElement(nodeName, ownerDocument, data);\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n          'var n=f.cloneNode(),c=n.createElement;' +\n          'h.shivMethods&&(' +\n            // unroll the `createElement` calls\n            getElements().join().replace(/\\w+/g, function(nodeName) {\n              data.createElem(nodeName);\n              data.frag.createElement(nodeName);\n              return 'c(\"' + nodeName + '\")';\n            }) +\n          ');return n}'\n        )(html5, data.frag);\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n      function shivDocument(ownerDocument) {\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        var data = getExpandoData(ownerDocument);\n\n        if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n          data.hasCSS = !!addStyleSheet(ownerDocument,\n            // corrects block display not defined in IE6/7/8/9\n            'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +\n            // adds styling not present in IE6/7/8/9\n            'mark{background:#FF0;color:#000}'\n          );\n        }\n        if (!supportsUnknownElements) {\n          shivMethods(ownerDocument, data);\n        }\n        return ownerDocument;\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n      var html5 = {\n\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': (options.shivCSS !== false),\n\n        /**\n         * Is equal to true if a browser supports creating unknown/HTML5 elements\n         * @memberOf html5\n         * @type boolean\n         */\n        'supportsUnknownElements': supportsUnknownElements,\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': (options.shivMethods !== false),\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument,\n\n        //creates a shived element\n        createElement: createElement,\n\n        //creates a shived documentFragment\n        createDocumentFragment: createDocumentFragment\n      };\n\n      /*--------------------------------------------------------------------------*/\n\n      // expose html5\n      window.html5 = html5;\n\n      // shiv the document\n      shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/respond.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\nwindow.matchMedia = window.matchMedia || (function(doc, undefined){\n  \n  var bool,\n      docElem  = doc.documentElement,\n      refNode  = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement('body'),\n      div      = doc.createElement('div');\n  \n  div.id = 'mq-test-1';\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n  \n  return function(q){\n    \n    div.innerHTML = '&shy;<style media=\"'+q+'\"> #mq-test-1 { width: 42px; }</style>';\n    \n    docElem.insertBefore(fakeBody, refNode);\n    bool = div.offsetWidth == 42;  \n    docElem.removeChild(fakeBody);\n    \n    return { matches: bool, media: q };\n  };\n  \n})(document);\n\n\n\n\n/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\t//exposed namespace\n\twin.respond\t\t= {};\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update\t= function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){ return; }\n\t\n\t//define vars\n\tvar doc \t\t\t= win.document,\n\t\tdocElem \t\t= doc.documentElement,\n\t\tmediastyles\t\t= [],\n\t\trules\t\t\t= [],\n\t\tappendedEls \t= [],\n\t\tparsedSheets \t= {},\n\t\tresizeThrottle\t= 30,\n\t\thead \t\t\t= doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase\t\t\t= doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks\t\t\t= head.getElementsByTagName( \"link\" ),\n\t\trequestQueue\t= [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS\t\t\t= function(){\n\t\t\tvar sheets \t= links,\n\t\t\t\tsl \t\t= sheets.length,\n\t\t\t\ti\t\t= 0,\n\t\t\t\t//vars for loop:\n\t\t\t\tsheet, href, media, isCSS;\n\n\t\t\tfor( ; i < sl; i++ ){\n\t\t\t\tsheet\t= sheets[ i ],\n\t\t\t\thref\t= sheet.href,\n\t\t\t\tmedia\t= sheet.media,\n\t\t\t\tisCSS\t= sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base)\n\t\t\t\t\t\t\t|| href.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\t\t\t\t\tmakeRequests();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate\t\t\t= function( styles, href, media ){\n\t\t\tvar qs\t\t\t= styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql\t\t\t= qs && qs.length || 0,\n\t\t\t\t//try to get CSS path\n\t\t\t\thref\t\t= href.substring( 0, href.lastIndexOf( \"/\" )),\n\t\t\t\trepUrls\t\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia\t= !ql && media,\n\t\t\t\t//vars used in loop\n\t\t\t\ti\t\t\t= 0,\n\t\t\t\tj, fullq, thisq, eachq, eql;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\t\t\t\n\n\t\t\tfor( ; i < ql; i++ ){\n\t\t\t\tj\t= 0;\n\t\t\t\t\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq\t= qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq\t= fullq.split( \",\" );\n\t\t\t\teql\t\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( ; j < eql; j++ ){\n\t\t\t\t\tthisq\t= eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia\t: thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules\t: rules.length - 1,\n\t\t\t\t\t\thasquery: thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw\t: thisq.match( /\\(min\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw\t: thisq.match( /\\(max\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \t\n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue\t\t= function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia\t\t\t= function( fromResize ){\n\t\t\tvar name\t\t= \"clientWidth\",\n\t\t\t\tdocElemProp\t= docElem[ name ],\n\t\t\t\tcurrWidth \t= doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink\t= links[ links.length-1 ],\n\t\t\t\tnow \t\t= (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\tclearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall\t= now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\tminnull = min === null,\n\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\tem = \"em\";\n\t\t\t\t\n\t\t\t\tif( !!min ){\n\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\tif( !!max ){\n\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var i in appendedEls ){\n\t\t\t\tif( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){\n\t\t\t\t\thead.removeChild( appendedEls[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var i in styleBlocks ){\n\t\t\t\tvar ss\t\t= doc.createElement( \"style\" ),\n\t\t\t\t\tcss\t\t= styleBlocks[ i ].join( \"\\n\" );\n\t\t\t\t\n\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\tss.media\t= i;\n\t\t\t\t\n\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\n\t\t\t\tif ( ss.styleSheet ){ \n\t\t        \tss.styleSheet.cssText = css;\n\t\t        } \n\t\t        else {\n\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t        }\n\t\t        \n\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\tappendedEls.push( ss );\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState != 4 || req.status != 200 && req.status != 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t}\n\t\t\tif ( req.readyState == 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx",
    "content": "﻿<%@ Page Title=\"Sign Up\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"SignUp.aspx.cs\" Inherits=\"ProductLaunch.Web.SignUp\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Sign me up!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Just a few details</h2>\n        </div>\n    </div>\n\n    <div class=\"form-group\">\n        <label for=\"txtFirstName\">First Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtFirstName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtLastName\">Last Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtLastName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtEmail\">Email Address</label>\n        <asp:TextBox class=\"form-control\" id=\"txtEmail\" runat=\"server\" />\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlCountry\">Country</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlCountry\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtCompanyName\">Company Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtCompanyName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlRole\">Your Main Role</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlRole\" runat=\"server\" />\n    </div>\n\n    <asp:Button class=\"btn btn-default\" runat=\"server\" Text=\"Go!\" ID=\"btnGo\" OnClick=\"btnGo_Click\" />\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing ProductLaunch.Model;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SignUp : Page\n    {\n        private static Dictionary<string, Country> _Countries;\n        private static Dictionary<string, Role> _Roles;\n\n        public static void PreloadStaticDataCache()\n        {\n            _Countries = new Dictionary<string, Country>();\n            _Roles = new Dictionary<string, Role>();\n            using (var context = new ProductLaunchContext())\n            {\n                foreach (var country in context.Countries.OrderBy(x => x.CountryName))\n                {\n                    _Countries[country.CountryCode] = country;\n                }\n                foreach (var role in context.Roles.OrderBy(x => x.RoleName))\n                {\n                    _Roles[role.RoleCode] = role;\n                }\n            }\n        }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            if (!Page.IsPostBack)\n            {\n                PopulateRoles();\n                PopulateCountries();\n            }\n        }\n\n        private void PopulateRoles()\n        {\n            ddlRole.Items.Clear();\n            ddlRole.Items.AddRange(_Roles.Select(x => new ListItem(x.Value.RoleName, x.Key)).ToArray()); \n        }\n\n        private void PopulateCountries()\n        {\n            ddlCountry.Items.Clear();\n            ddlCountry.Items.AddRange(_Countries.Select(x => new ListItem(x.Value.CountryName, x.Key)).ToArray());\n        }\n\n        protected void btnGo_Click(object sender, EventArgs e)\n        {\n            var country = _Countries[ddlCountry.SelectedValue];\n            var role = _Roles[ddlRole.SelectedValue];\n\n            var prospect = new Prospect\n            {\n                CompanyName = txtCompanyName.Text,\n                EmailAddress = txtEmail.Text,\n                FirstName = txtFirstName.Text,\n                LastName = txtLastName.Text,\n                Country = country,\n                Role = role\n            };\n\n            using (var context = new ProductLaunchContext())\n            {\n                //reload child objects:\n                prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n                prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n\n            Server.Transfer(\"ThankYou.aspx\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SignUp {\n        \n        /// <summary>\n        /// txtFirstName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtFirstName;\n        \n        /// <summary>\n        /// txtLastName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtLastName;\n        \n        /// <summary>\n        /// txtEmail control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtEmail;\n        \n        /// <summary>\n        /// ddlCountry control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlCountry;\n        \n        /// <summary>\n        /// txtCompanyName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtCompanyName;\n        \n        /// <summary>\n        /// ddlRole control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlRole;\n        \n        /// <summary>\n        /// btnGo control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.Button btnGo;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Site.Master",
    "content": "﻿<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.master.cs\" Inherits=\"ProductLaunch.Web.SiteMaster\" %>\n\n<!DOCTYPE html>\n\n<html lang=\"en\">\n<head runat=\"server\">\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title><%: Page.Title %></title>\n\n    <asp:PlaceHolder runat=\"server\">\n        <%: Scripts.Render(\"~/bundles/modernizr\") %>\n    </asp:PlaceHolder>\n\n    <webopt:bundlereference runat=\"server\" path=\"~/Content/css\" />\n    <link href=\"~/favicon.ico\" rel=\"shortcut icon\" type=\"image/x-icon\" />\n\n</head>\n<body>\n    <form runat=\"server\">\n        <asp:ScriptManager runat=\"server\">\n            <Scripts>\n                <%--To learn more about bundling scripts in ScriptManager see http://go.microsoft.com/fwlink/?LinkID=301884 --%>\n                <%--Framework Scripts--%>\n                <asp:ScriptReference Name=\"MsAjaxBundle\" />\n                <asp:ScriptReference Name=\"jquery\" />\n                <asp:ScriptReference Name=\"bootstrap\" />\n                <asp:ScriptReference Name=\"respond\" />\n                <asp:ScriptReference Name=\"WebForms.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebForms.js\" />\n                <asp:ScriptReference Name=\"WebUIValidation.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebUIValidation.js\" />\n                <asp:ScriptReference Name=\"MenuStandards.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/MenuStandards.js\" />\n                <asp:ScriptReference Name=\"GridView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/GridView.js\" />\n                <asp:ScriptReference Name=\"DetailsView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/DetailsView.js\" />\n                <asp:ScriptReference Name=\"TreeView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/TreeView.js\" />\n                <asp:ScriptReference Name=\"WebParts.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebParts.js\" />\n                <asp:ScriptReference Name=\"Focus.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/Focus.js\" />\n                <asp:ScriptReference Name=\"WebFormsBundle\" />\n                <%--Site Scripts--%>\n            </Scripts>\n        </asp:ScriptManager>\n\n        <div class=\"container body-content\">\n            <asp:ContentPlaceHolder ID=\"MainContent\" runat=\"server\">\n            </asp:ContentPlaceHolder>\n            <hr />\n            <footer>\n                <p>&copy; <%: DateTime.Now.Year %> - Company, Inc.</p>\n            </footer>\n        </div>\n\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Site.Master.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SiteMaster : MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Site.Master.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SiteMaster {\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master",
    "content": "<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.Mobile.master.cs\" Inherits=\"ProductLaunch.Web.Site_Mobile\" %>\n<%@ Register Src=\"~/ViewSwitcher.ascx\" TagPrefix=\"friendlyUrls\" TagName=\"ViewSwitcher\" %>\n\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head runat=\"server\">\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title></title>\n    <asp:ContentPlaceHolder runat=\"server\" ID=\"HeadContent\" />\n</head>\n<body>\n    <form id=\"form1\" runat=\"server\">\n    <div>\n        <h1>Mobile Master Page</h1>\n        <asp:ContentPlaceHolder runat=\"server\" ID=\"FeaturedContent\" />\n        <section class=\"content-wrapper main-content clear-fix\">\n            <asp:ContentPlaceHolder runat=\"server\" ID=\"MainContent\" />\n        </section>\n        <friendlyUrls:ViewSwitcher runat=\"server\" />\n    </div>\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Site_Mobile : System.Web.UI.MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class Site_Mobile {\n        \n        /// <summary>\n        /// HeadContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder HeadContent;\n        \n        /// <summary>\n        /// form1 control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.HtmlControls.HtmlForm form1;\n        \n        /// <summary>\n        /// FeaturedContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder FeaturedContent;\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx",
    "content": "﻿<%@ Page Title=\"Ta\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" CodeBehind=\"ThankYou.aspx.cs\" Inherits=\"ProductLaunch.Web.ThankYou\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Thank you!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Good work on signing up. We'll be in touch.</h2>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ThankYou : System.Web.UI.Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ThankYou {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx",
    "content": "<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"ViewSwitcher.ascx.cs\" Inherits=\"ProductLaunch.Web.ViewSwitcher\" %>\n<div id=\"viewSwitcher\">\n    <%: CurrentView %> view | <a href=\"<%: SwitchUrl %>\" data-ajax=\"false\">Switch to <%: AlternateView %></a>\n</div>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Routing;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\nusing Microsoft.AspNet.FriendlyUrls.Resolvers;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ViewSwitcher : System.Web.UI.UserControl\n    {\n        protected string CurrentView { get; private set; }\n\n        protected string AlternateView { get; private set; }\n\n        protected string SwitchUrl { get; private set; }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            // Determine current view\n            var isMobile = WebFormsFriendlyUrlResolver.IsMobileView(new HttpContextWrapper(Context));\n            CurrentView = isMobile ? \"Mobile\" : \"Desktop\";\n\n            // Determine alternate view\n            AlternateView = isMobile ? \"Desktop\" : \"Mobile\";\n\n            // Create switch URL from the route, e.g. ~/__FriendlyUrls_SwitchView/Mobile?ReturnUrl=/Page\n            var switchViewRouteName = \"AspNet.FriendlyUrls.SwitchView\";\n            var switchViewRoute = RouteTable.Routes[switchViewRouteName];\n            if (switchViewRoute == null)\n            {\n                // Friendly URLs is not enabled or the name of the switch view route is out of sync\n                this.Visible = false;\n                return;\n            }\n            var url = GetRouteUrl(switchViewRouteName, new { view = AlternateView, __FriendlyUrls_SwitchViews = true });\n            url += \"?ReturnUrl=\" + HttpUtility.UrlEncode(Request.RawUrl);\n            SwitchUrl = url;\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ViewSwitcher {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" \n         providerName=\"System.Data.SqlClient\" \n         connectionString=\"Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;AttachDbFilename=|DataDirectory|\\ProductLaunch.mdf\"/>\n  </connectionStrings>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\" />\n    <customErrors mode=\"Off\"/>\n    <httpRuntime targetFramework=\"4.5.2\" />\n    <pages>\n      <namespaces>\n        <add namespace=\"System.Web.Optimization\" />\n      </namespaces>\n      <controls>\n        <add assembly=\"Microsoft.AspNet.Web.Optimization.WebForms\" namespace=\"Microsoft.AspNet.Web.Optimization.WebForms\" tagPrefix=\"webopt\" />\n      </controls>\n    </pages>     \n  </system.web>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"WebGrease\" culture=\"neutral\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.5.2.14234\" newVersion=\"1.5.2.14234\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\" />\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.Web/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Antlr\" version=\"3.4.1.9004\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.bootstrap\" version=\"3.0.0\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"bootstrap\" version=<\"3.4.1\" targetFramework=\"net452\" />\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls.Core\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.MSAjax\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.WebForms\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization.WebForms\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.Web.Infrastructure\" version=\"1.0.0.0\" targetFramework=\"net452\" />\n  <package id=\"Modernizr\" version=\"2.6.2\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n  <package id=\"Respond\" version=\"1.2.0\" targetFramework=\"net452\" />\n  <package id=\"WebGrease\" version=\"1.5.2\" targetFramework=\"net452\" />\n</packages>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/ProductLaunch.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Web\", \"ProductLaunch.Web\\ProductLaunch.Web.csproj\", \"{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model\", \"ProductLaunch.Model\\ProductLaunch.Model.csproj\", \"{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Entities\", \"ProductLaunch.Entities\\ProductLaunch.Entities.csproj\", \"{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tests\", \"Tests\", \"{4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model.Tests\", \"ProductLaunch.Model.Tests\\ProductLaunch.Model.Tests.csproj\", \"{49FD06C3-CD52-425A-866D-831D09268CD0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.EndToEndTests\", \"ProductLaunch.EndToEndTests\\ProductLaunch.EndToEndTests.csproj\", \"{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/ProductLaunch/build.ps1",
    "content": "$nuGetPath = \"C:\\Chocolatey\\bin\\nuget.bat\"\n$msBuildPath = \"C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe\"\n\ncd c:\\src\n& $nuGetPath restore .\\ProductLaunch.sln\n& $msBuildPath .\\ProductLaunch.Web\\ProductLaunch.Web.csproj /p:OutputPath=c:\\out\\web\\ProductLaunchWeb /p:DeployOnBuild=true /p:VSToolsPath=C:\\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\\tools\\VSToolsPath"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/build.ps1",
    "content": "\ndocker build `\n -t dockersamples/modernize-aspnet-builder `\n $pwd\\docker\\builder\n\ndocker run --rm `\n -v $pwd\\ProductLaunch:c:\\src `\n -v $pwd\\docker:c:\\out `\n dockersamples/modernize-aspnet-builder `\n C:\\src\\build.ps1 \n\ndocker build `\n -t dockersamples/modernize-aspnet-web:v1 `\n $pwd\\docker\\web"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/docker/builder/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 14.0.25420.1 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force; `\n    Install-Package -Name webdeploy -RequiredVersion 3.5.2 -Force\n\nRUN Install-Package -Name nuget.commandline -RequiredVersion 3.4.3 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install MSBuild.Microsoft.VisualStudio.Web.targets -Version 14.0.0.3\n\nENTRYPOINT [\"powershell\"]"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/docker/web/Dockerfile",
    "content": "# escape=`\nFROM microsoft/aspnet:windowsservercore-10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\n\nRUN Remove-Website -Name 'Default Web Site'; `\n    New-Item -Path 'C:\\web-app' -Type Directory; `\n    New-Website -Name 'web-app' -PhysicalPath 'C:\\web-app' -Port 80 -Force\n\nCOPY ProductLaunchWeb/_PublishedWebsites/ProductLaunch.Web /web-app\nCOPY Web.config /web-app/Web.config"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v1-src/docker/web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" \n         providerName=\"System.Data.SqlClient\" \n         connectionString=\"Server=sql-server;Database=ProductLaunch;User Id=sa;Password=DockerCon2017;\"/>\n  </connectionStrings>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\" />\n    <customErrors mode=\"Off\"/>\n    <httpRuntime targetFramework=\"4.5.2\" />\n    <pages>\n      <namespaces>\n        <add namespace=\"System.Web.Optimization\" />\n      </namespaces>\n      <controls>\n        <add assembly=\"Microsoft.AspNet.Web.Optimization.WebForms\" namespace=\"Microsoft.AspNet.Web.Optimization.WebForms\" tagPrefix=\"webopt\" />\n      </controls>\n    </pages>     \n  </system.web>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"WebGrease\" culture=\"neutral\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.5.2.14234\" newVersion=\"1.5.2.14234\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\" />\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Core/Env.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Core\n{\n    public class Env\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string DbConnectionString { get { return Get(\"DB_CONNECTION_STRING\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable);\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Core/ProductLaunch.Core.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{35BD1196-DDCB-41FA-98C5-C8116D749446}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Core</RootNamespace>\n    <AssemblyName>ProductLaunch.Core</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Env.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Core/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Core\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Core\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"35bd1196-ddcb-41fa-98c5-c8116d749446\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <section name=\"specFlow\" type=\"TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow\" />\n  </configSections>\n  <specFlow>\n    <unitTestProvider name=\"MsTest\" />\n  </specFlow>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/ProductLaunch.EndToEndTests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.EndToEndTests</RootNamespace>\n    <AssemblyName>ProductLaunch.EndToEndTests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"TechTalk.SpecFlow, Version=2.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SpecFlow.2.1.0\\lib\\net45\\TechTalk.SpecFlow.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.WebDriver.3.0.1\\lib\\net40\\WebDriver.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver.Support, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.Support.3.0.1\\lib\\net40\\WebDriver.Support.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\" />\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"ProspectSignUp.feature.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>ProspectSignUp.feature</DependentUpon>\n    </Compile>\n    <Compile Include=\"ProspectSignUpSteps.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"packages.config\" />\n    <None Include=\"ProspectSignUp.feature\">\n      <Generator>SpecFlowSingleFileGenerator</Generator>\n      <LastGenOutput>ProspectSignUp.feature.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets\" Condition=\"Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"d47cf813-de0e-4cc4-b9ed-8ee4b6f14869\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature",
    "content": "﻿Feature: Prospect Sign Up\n\tAs a prospect interested in the product launch\n\tI want to sign up for notifications\n\tSo that I can be updated with news\n\nScenario Outline: Sign Up with Valid Details\n\tGiven I browse to the Sign Up Page at \"172.31.126.66\"\n\tAnd I enter details '<FirstName>' '<LastName>' '<EmailAddress>' '<CompanyName>' '<Country>' '<Role>'\n\tWhen I press Go\n\tThen I should see the Thank You page\n\nExamples:\n\t| FirstName | LastName | EmailAddress           | CompanyName   | Country        | Role           |\n\t| Prospect  | A        | a.prospect@company.com | Company, Inc. | United States  | Decision Maker |\n\t| Prospect  | B        | b.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | C        | c.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | D        | d.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | E        | e.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | F        | f.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | G        | g.prospect@company.com | Company, Inc. | United States  | Engineer       |\n\t| Prospect  | H        | h.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | I        | i.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | J        | j.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | K        | k.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | L        | l.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | M        | m.prospect@company.com | Company, Inc. | Sweden         | Architect      |\n\t| Prospect  | N        | n.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | O        | o.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | P        | p.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | Q        | q.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | R        | r.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | S        | s.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | T        | t.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | U        | u.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | V        | v.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | W        | w.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | X        | x.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | Y        | y.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | Z        | z.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature.cs",
    "content": "﻿// ------------------------------------------------------------------------------\n//  <auto-generated>\n//      This code was generated by SpecFlow (http://www.specflow.org/).\n//      SpecFlow Version:2.1.0.0\n//      SpecFlow Generator Version:2.0.0.0\n// \n//      Changes to this file may cause incorrect behavior and will be lost if\n//      the code is regenerated.\n//  </auto-generated>\n// ------------------------------------------------------------------------------\n#region Designer generated code\n#pragma warning disable\nnamespace ProductLaunch.EndToEndTests\n{\n    using TechTalk.SpecFlow;\n    \n    \n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"TechTalk.SpecFlow\", \"2.1.0.0\")]\n    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()]\n    public partial class ProspectSignUpFeature\n    {\n        \n        private static TechTalk.SpecFlow.ITestRunner testRunner;\n        \n#line 1 \"ProspectSignUp.feature\"\n#line hidden\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()]\n        public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext)\n        {\n            testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(null, 0);\n            TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo(\"en-US\"), \"Prospect Sign Up\", \"\\tAs a prospect interested in the product launch\\r\\n\\tI want to sign up for notificat\" +\n                    \"ions\\r\\n\\tSo that I can be updated with news\", ProgrammingLanguage.CSharp, ((string[])(null)));\n            testRunner.OnFeatureStart(featureInfo);\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()]\n        public static void FeatureTearDown()\n        {\n            testRunner.OnFeatureEnd();\n            testRunner = null;\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()]\n        public virtual void TestInitialize()\n        {\n            if (((testRunner.FeatureContext != null) \n                        && (testRunner.FeatureContext.FeatureInfo.Title != \"Prospect Sign Up\")))\n            {\n                ProductLaunch.EndToEndTests.ProspectSignUpFeature.FeatureSetup(null);\n            }\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()]\n        public virtual void ScenarioTearDown()\n        {\n            testRunner.OnScenarioEnd();\n        }\n        \n        public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)\n        {\n            testRunner.OnScenarioStart(scenarioInfo);\n        }\n        \n        public virtual void ScenarioCleanup()\n        {\n            testRunner.CollectScenarioErrors();\n        }\n        \n        public virtual void SignUpWithValidDetails(string firstName, string lastName, string emailAddress, string companyName, string country, string role, string[] exampleTags)\n        {\n            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo(\"Sign Up with Valid Details\", exampleTags);\n#line 6\nthis.ScenarioSetup(scenarioInfo);\n#line 7\n testRunner.Given(\"I browse to the Sign Up Page at \\\"172.31.126.66\\\"\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Given \");\n#line 8\n testRunner.And(string.Format(\"I enter details \\'{0}\\' \\'{1}\\' \\'{2}\\' \\'{3}\\' \\'{4}\\' \\'{5}\\'\", firstName, lastName, emailAddress, companyName, country, role), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"And \");\n#line 9\n testRunner.When(\"I press Go\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"When \");\n#line 10\n testRunner.Then(\"I should see the Thank You page\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Then \");\n#line hidden\n            this.ScenarioCleanup();\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"A\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"a.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant0()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"A\", \"a.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"B\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"b.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant1()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"B\", \"b.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"C\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"c.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant2()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"C\", \"c.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"D\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"d.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant3()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"D\", \"d.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"E\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"e.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant4()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"E\", \"e.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"F\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"f.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant5()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"F\", \"f.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"G\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"g.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Engineer\")]\n        public virtual void SignUpWithValidDetails_Variant6()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"G\", \"g.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Engineer\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"H\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"h.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant7()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"H\", \"h.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"I\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"i.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant8()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"I\", \"i.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"J\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"j.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant9()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"J\", \"j.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"K\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"k.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant10()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"K\", \"k.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"L\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"l.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant11()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"L\", \"l.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"M\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"m.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant12()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"M\", \"m.prospect@company.com\", \"Company, Inc.\", \"Sweden\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"N\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"n.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant13()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"N\", \"n.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"O\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"o.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant14()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"O\", \"o.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"P\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"p.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant15()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"P\", \"p.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Q\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"q.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant16()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Q\", \"q.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"R\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"r.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant17()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"R\", \"r.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"S\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"s.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant18()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"S\", \"s.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"T\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"t.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant19()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"T\", \"t.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"U\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"u.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant20()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"U\", \"u.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"V\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"v.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant21()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"V\", \"v.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"W\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"w.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant22()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"W\", \"w.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"X\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"x.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant23()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"X\", \"x.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Y\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"y.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant24()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Y\", \"y.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Z\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"z.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant25()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Z\", \"z.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n    }\n}\n#pragma warning restore\n#endregion\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUpSteps.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Firefox;\nusing OpenQA.Selenium.Support.UI;\nusing System;\nusing System.Threading;\nusing TechTalk.SpecFlow;\n\nnamespace ProductLaunch.EndToEndTests\n{\n    [Binding]\n    public class ProspectSignUpSteps\n    {\n        private static IWebDriver _Driver;\n\n        [BeforeFeature]\n        public static void Setup()\n        {\n            _Driver = new FirefoxDriver();\n        }\n\n        [AfterFeature]\n        public static void TearDown()\n        {\n            _Driver.Close();\n            _Driver.Dispose();\n        }\n\n        [Given(@\"I browse to the Sign Up Page at \"\"(.*)\"\"\")]\n        public void GivenIBrowseToTheSignUpPageAt(string host)\n        {\n            var url = $\"http://{host}/SignUp\";            \n            _Driver.Navigate().GoToUrl(url);\n        }\n        \n        [Given(@\"I enter details '(.*)' '(.*)' '(.*)' '(.*)' '(.*)' '(.*)'\")]\n        public void GivenIEnterDetails(string firstName, string lastName, string emailAddress, \n                                       string companyName, string country, string role)\n        {            \n            _Driver.FindElement(By.Id(\"MainContent_txtFirstName\")).SendKeys(firstName);\n            _Driver.FindElement(By.Id(\"MainContent_txtLastName\")).SendKeys(lastName);\n            _Driver.FindElement(By.Id(\"MainContent_txtEmail\")).SendKeys(emailAddress);\n            _Driver.FindElement(By.Id(\"MainContent_txtCompanyName\")).SendKeys(companyName);\n\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlCountry\"))).SelectByText(country);\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlRole\"))).SelectByText(role);\n        }\n\n        [When(@\"I press Go\")]\n        public void WhenIPressGo()\n        {\n            var goButton = _Driver.FindElement(By.Id(\"MainContent_btnGo\"));\n            goButton.Click();\n        }\n        \n        [Then(@\"I should see the Thank You page\")]\n        public void ThenIShouldSeeTheThankYouPage()\n        {\n            //HACK\n            Thread.Sleep(1500);\n            Assert.AreEqual(\"Ta\", _Driver.Title);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Selenium.Firefox.WebDriver\" version=\"0.13.0\" targetFramework=\"net452\" />\n  <package id=\"Selenium.Support\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"Selenium.WebDriver\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"SpecFlow\" version=\"2.1.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Entities/Country.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Country\n    {\n        public string CountryCode { get; set; }\n\n        public string CountryName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Entities/ProductLaunch.Entities.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Entities</RootNamespace>\n    <AssemblyName>ProductLaunch.Entities</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Country.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Prospect.cs\" />\n    <Compile Include=\"Role.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Entities/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Entities\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Entities\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Entities/Prospect.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Prospect\n    {\n        public int ProspectId { get; set; }\n        \n        public string FirstName { get; set; }\n        \n        public string LastName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public Role Role { get; set; }\n\n        public Country Country { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Entities/Role.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Role\n    {\n        public string RoleCode { get; set; }\n\n        public string RoleName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string ElasticsearchUrl { get { return Get(\"ELASTICSEARCH_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Documents/Prospect.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Documents\n{\n    public class Prospect\n    {\n        public string FullName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public string RoleName { get; set; }\n\n        public string CountryName { get; set; }\n\n        public DateTime SignUpDate { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Indexer/Index.cs",
    "content": "using Nest;\nusing ProductLaunch.MessageHandlers.IndexProspect.Documents;\nusing System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Indexer\n{\n    public class Index\n    {\n        public static void Setup()\n        {\n            var node = new Uri(Config.ElasticsearchUrl);\n            var settings = new ConnectionSettings(node);\n            var client = new ElasticClient(settings);\n            client.CreateIndex(\"prospects\");\n        }        \n\n        public static void CreateDocument(Prospect prospect)\n        {\n            try\n            {\n                var node = new Uri(Config.ElasticsearchUrl);\n                var client = new ElasticClient(node);                \n                client.Index(prospect, idx => idx.Index(\"prospects\"));\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine($\"Index prospect FAILED, email address: {prospect.EmailAddress}, ex: {ex}\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/ProductLaunch.MessageHandlers.IndexProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1354B5AB-C990-41EA-9F68-5F9933D83700}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.IndexProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.IndexProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Elasticsearch.Net, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Elasticsearch.Net.5.0.1\\lib\\net45\\Elasticsearch.Net.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Nest, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NEST.5.0.1\\lib\\net45\\Nest.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.9.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Documents\\Prospect.cs\" />\n    <Compile Include=\"Indexer\\Index.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{e02eff91-8c52-4dce-8279-3fd1ee0659ef}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.MessageHandlers.IndexProspect.Indexer;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing System;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Initializing Elasticsearch. url: {Config.ElasticsearchUrl}\");\n            Index.Setup();\n\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += IndexProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void IndexProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Indexing prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = new Documents.Prospect\n            {\n                CompanyName = eventMessage.Prospect.CompanyName,\n                CountryName = eventMessage.Prospect.Country.CountryName,\n                EmailAddress = eventMessage.Prospect.EmailAddress,\n                FullName = $\"{eventMessage.Prospect.FirstName} {eventMessage.Prospect.LastName}\",\n                RoleName = eventMessage.Prospect.Role.RoleName,\n                SignUpDate = eventMessage.SignedUpAt\n            };\n            Index.CreateDocument(prospect);\n\n            Console.WriteLine($\"Prospect indexed; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1354b5ab-c990-41ea-9f68-5f9933d83700\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Elasticsearch.Net\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"NEST\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"9.0.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>  \n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n  </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/ProductLaunch.MessageHandlers.SaveProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{65089C80-27F1-4744-979B-4C5A33B0CFF6}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.SaveProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.SaveProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing ProductLaunch.Model;\nusing System;\nusing System.Linq;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.SaveProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += SaveProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void SaveProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Saving new prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = eventMessage.Prospect;\n            using (var context = new ProductLaunchContext())\n            {\n                //reload child objects:\n                prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n                prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n\n            Console.WriteLine($\"Prospect saved. Prospect ID: {eventMessage.Prospect.ProspectId}; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"65089c80-27f1-4744-979b-4c5a33b0cff6\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Messaging/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Messaging\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string MessageQueueUrl { get { return Get(\"MESSAGE_QUEUE_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Messaging/MessageHelper.cs",
    "content": "﻿using Newtonsoft.Json;\nusing ProductLaunch.Messaging.Messages;\nusing System.Text;\n\nnamespace ProductLaunch.Messaging\n{\n    public class MessageHelper\n    {\n        public static byte[] ToData<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            var json = JsonConvert.SerializeObject(message);\n            return Encoding.Unicode.GetBytes(json);\n        }\n\n        public static TMessage FromData<TMessage>(byte[] data)\n            where TMessage : Message\n        {\n            var json = Encoding.Unicode.GetString(data);\n            return (TMessage)JsonConvert.DeserializeObject<TMessage>(json);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Messaging/MessageQueue.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging.Messages;\n\nnamespace ProductLaunch.Messaging\n{\n    public static class MessageQueue\n    {\n\n        public static void Publish<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            using (var connection = CreateConnection())\n            {\n                var data = MessageHelper.ToData(message);\n                connection.Publish(message.Subject, data);\n            }\n        }\n\n        public static IConnection CreateConnection()\n        {\n            return new ConnectionFactory().CreateConnection(Config.MessageQueueUrl);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Messaging/Messages/Events/ProspectSignedUpEvent.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System;\n\nnamespace ProductLaunch.Messaging.Messages.Events\n{\n    public class ProspectSignedUpEvent : Message\n    {\n        public override string Subject { get { return MessageSubject; } }\n\n        public DateTime SignedUpAt { get; set; }\n\n        public Prospect Prospect { get; set; }\n\n        public static string MessageSubject = \"events.prospect.signedup\";\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Messaging/Messages/Message.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.Messaging.Messages\n{\n    public abstract class Message\n    {\n        public string CorrelationId { get; set; }  \n        \n        public abstract string Subject { get; }      \n\n        public Message()\n        {\n            CorrelationId = Guid.NewGuid().ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Messaging/ProductLaunch.Messaging.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Messaging</RootNamespace>\n    <AssemblyName>ProductLaunch.Messaging</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"MessageHelper.cs\" />\n    <Compile Include=\"MessageQueue.cs\" />\n    <Compile Include=\"Messages\\Events\\ProspectSignedUpEvent.cs\" />\n    <Compile Include=\"Messages\\Message.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup />\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Messaging/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"e02eff91-8c52-4dce-8279-3fd1ee0659ef\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Messaging/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  </configSections>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"Data Source=(localdb)\\v13.0; Integrated Security=True; MultipleActiveResultSets=True\" />\n      </parameters>\n    </defaultConnectionFactory>\n  </entityFramework>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Model\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string DbConnectionString { get { return Get(\"DB_CONNECTION_STRING\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model/Initializers/StaticDataInitializer.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model.Initializers\n{\n    public class StaticDataInitializer : CreateDatabaseIfNotExists<ProductLaunchContext>\n    {\n        protected override void Seed(ProductLaunchContext context)\n        {\n            AddRole(context, \"DA\", \"Developer Advocate\");\n            AddRole(context, \"DM\", \"Decision Maker\");\n            AddRole(context, \"AC\", \"Architect\");\n            AddRole(context, \"EN\", \"Engineer\");\n            AddRole(context, \"OP\", \"IT Ops\");\n\n            AddCountry(context, \"GBR\", \"United Kingdom\");\n            AddCountry(context, \"USA\", \"United States\");\n            AddCountry(context, \"SWE\", \"Sweden\");\n\n            context.SaveChanges();\n        }\n\n        private void AddCountry(ProductLaunchContext context, string code, string name)\n        {\n            context.Countries.Add(new Country\n            {\n                CountryCode = code,\n                CountryName = name\n            });\n        }\n\n        private void AddRole(ProductLaunchContext context, string code, string name)\n        {\n            context.Roles.Add(new Role\n            {\n                RoleCode = code,\n                RoleName = name\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model/ProductLaunch.Model.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model</RootNamespace>\n    <AssemblyName>ProductLaunch.Model</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Initializers\\StaticDataInitializer.cs\" />\n    <Compile Include=\"ProductLaunchContext.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model/ProductLaunchContext.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model\n{\n    public class ProductLaunchContext : DbContext\n    {\n        public ProductLaunchContext() : base(Config.DbConnectionString) { }\n\n        public DbSet<Country> Countries { get; set; }\n\n        public DbSet<Role> Roles { get; set; }\n\n        public DbSet<Prospect> Prospects { get; set; }\n\n        protected override void OnModelCreating(DbModelBuilder builder)\n        {\n            builder.Entity<Country>().HasKey(c => c.CountryCode);\n            builder.Entity<Role>().HasKey(r => r.RoleCode);\n            builder.Entity<Prospect>().HasOptional<Country>(p => p.Country);\n            builder.Entity<Prospect>().HasOptional<Role>(p => p.Role);            \n        }        \n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"3afc4a48-5db6-48ff-a459-20ec21a2eb28\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" providerName=\"System.Data.SqlClient\" connectionString=\"Server=172.20.244.163;Database=ProductLaunch;User Id=sa;Password=NDC_l0nd0n;\"/>\n  </connectionStrings>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunch.Model.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{49FD06C3-CD52-425A-866D-831D09268CD0}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model.Tests</RootNamespace>\n    <AssemblyName>ProductLaunch.Model.Tests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Data.Entity\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"ProductLaunchContextTest.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunchContextTest.cs",
    "content": "﻿using System;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing ProductLaunch.Entities;\n\nnamespace ProductLaunch.Model.Tests\n{\n    [TestClass]\n    public class ProductLaunchContextTest\n    {\n        [TestMethod]\n        public void Insert()\n        {\n            using (var context = new ProductLaunchContext())\n            {\n                var country = new Country\n                {\n                    CountryCode = \"GBR\",\n                    CountryName = \"United Kingdom\"\n                };\n                context.Countries.Add(country);\n\n                var role = new Role\n                {\n                    RoleCode = \"DM\",\n                    RoleName = \"Decision Maker\"\n                };\n                context.Roles.Add(role);\n\n                var prospect = new Prospect\n                {\n                    FirstName = \"A\",\n                    LastName = \"Prospect\",\n                    CompanyName = \"Docker, Inc.\",\n                    EmailAddress = \"a.prospect@docker.com\",\n                    Country = country,\n                    Role = role\n                };\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model.Tests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"49fd06c3-cd52-425a-866d-831d09268cd0\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Model.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/About.aspx",
    "content": "﻿<%@ Page Title=\"About\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"About.aspx.cs\" Inherits=\"ProductLaunch.Web.About\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your application description page.</h3>\n    <p>Use this area to provide additional information.</p>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/About.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class About : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/About.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class About\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/App_Start/BundleConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public class BundleConfig\n    {\n        // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkID=303951\n        public static void RegisterBundles(BundleCollection bundles)\n        {\n            bundles.Add(new ScriptBundle(\"~/bundles/WebFormsJs\").Include(\n                            \"~/Scripts/WebForms/WebForms.js\",\n                            \"~/Scripts/WebForms/WebUIValidation.js\",\n                            \"~/Scripts/WebForms/MenuStandards.js\",\n                            \"~/Scripts/WebForms/Focus.js\",\n                            \"~/Scripts/WebForms/GridView.js\",\n                            \"~/Scripts/WebForms/DetailsView.js\",\n                            \"~/Scripts/WebForms/TreeView.js\",\n                            \"~/Scripts/WebForms/WebParts.js\"));\n\n            // Order is very important for these files to work, they have explicit dependencies\n            bundles.Add(new ScriptBundle(\"~/bundles/MsAjaxJs\").Include(\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjax.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxApplicationServices.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxTimer.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxWebForms.js\"));\n\n            // Use the Development version of Modernizr to develop with and learn from. Then, when you’re\n            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need\n            bundles.Add(new ScriptBundle(\"~/bundles/modernizr\").Include(\n                            \"~/Scripts/modernizr-*\"));\n\n            ScriptManager.ScriptResourceMapping.AddDefinition(\n                \"respond\",\n                new ScriptResourceDefinition\n                {\n                    Path = \"~/Scripts/respond.min.js\",\n                    DebugPath = \"~/Scripts/respond.js\",\n                });\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/App_Start/RouteConfig.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Web;\nusing System.Web.Routing;\nusing Microsoft.AspNet.FriendlyUrls;\n\nnamespace ProductLaunch.Web\n{\n    public static class RouteConfig\n    {\n        public static void RegisterRoutes(RouteCollection routes)\n        {\n            var settings = new FriendlyUrlSettings();\n            settings.AutoRedirectMode = RedirectMode.Permanent;\n            routes.EnableFriendlyUrls(settings);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/ApplicationInsights.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ApplicationInsights xmlns=\"http://schemas.microsoft.com/ApplicationInsights/2013/Settings\">\n</ApplicationInsights>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Bundle.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<bundles version=\"1.0\">\n  <styleBundle path=\"~/Content/css\">\n    <include path=\"~/Content/bootstrap.css\" />\n    <include path=\"~/Content/Site.css\" />\n  </styleBundle>\n</bundles>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Contact.aspx",
    "content": "﻿<%@ Page Title=\"Contact\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Contact.aspx.cs\" Inherits=\"ProductLaunch.Web.Contact\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your contact page.</h3>\n    <address>\n        One Microsoft Way<br />\n        Redmond, WA 98052-6399<br />\n        <abbr title=\"Phone\">P:</abbr>\n        425.555.0100\n    </address>\n\n    <address>\n        <strong>Support:</strong>   <a href=\"mailto:Support@example.com\">Support@example.com</a><br />\n        <strong>Marketing:</strong> <a href=\"mailto:Marketing@example.com\">Marketing@example.com</a>\n    </address>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Contact : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class Contact\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Content/Site.css",
    "content": "﻿/* Move down content because we have a fixed navbar that is 50px tall */\nbody {\n    padding-top: 50px;\n    padding-bottom: 20px;\n}\n\n/* Wrapping element */\n/* Set some basic padding to keep content from hitting the edges */\n.body-content {\n    padding-left: 15px;\n    padding-right: 15px;\n}\n\n/* Set widths on the form inputs since otherwise they're 100% wide */\ninput,\nselect,\ntextarea {\n    max-width: 280px;\n}\n\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n    .jumbotron {\n        margin-top: 20px;\n    }\n\n    .body-content {\n        padding: 0;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Content/bootstrap.css",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. The notices and licenses below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden] {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput,\nselect[multiple],\ntextarea {\n  background-image: none;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16.099999999999998px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\nh1 small,\n.h1 small {\n  font-size: 24px;\n}\n\nh2 small,\n.h2 small {\n  font-size: 18px;\n}\n\nh3 small,\n.h3 small,\nh4 small,\n.h4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\npre {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table thead > tr > th,\n.table tbody > tr > th,\n.table tfoot > tr > th,\n.table thead > tr > td,\n.table tbody > tr > td,\n.table tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table caption + thead tr:first-child th,\n.table colgroup + thead tr:first-child th,\n.table thead:first-child tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed thead > tr > th,\n.table-condensed tbody > tr > th,\n.table-condensed tfoot > tr > th,\n.table-condensed thead > tr > td,\n.table-condensed tbody > tr > td,\n.table-condensed tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td {\n  background-color: #d0e9c6;\n  border-color: #c9e2b3;\n}\n\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td {\n  background-color: #ebcccc;\n  border-color: #e6c1c7;\n}\n\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td {\n  background-color: #faf2cc;\n  border-color: #f8e5be;\n}\n\n@media (max-width: 768px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n    background-color: #fff;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > thead > tr:last-child > td,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  padding-top: 7px;\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\1f4bc\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\1f4c5\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\1f4cc\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\1f4ce\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\1f4f7\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\1f512\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\1f514\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\1f516\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\1f525\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\1f527\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #333333;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs.nav-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 5px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n\n.nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  z-index: 1000;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  z-index: 1030;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e6e6e6;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #428bca;\n}\n\n.thumbnail > img {\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.alert-warning hr {\n  border-top-color: #f8e5be;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger hr {\n  border-top-color: #e6c1c7;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #fbeed5;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #fbeed5;\n}\n\n.panel-danger {\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #eed3d7;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #eed3d7;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\nbody.modal-open,\n.modal-open .navbar-fixed-top,\n.modal-open .navbar-fixed-bottom {\n  margin-right: 15px;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    right: auto;\n    left: 50%;\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n@media screen and (max-width: 400px) {\n  @-ms-viewport {\n    width: 320px;\n  }\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.visible-xs {\n  display: none !important;\n}\n\ntr.visible-xs {\n  display: none !important;\n}\n\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm {\n  display: none !important;\n}\n\ntr.visible-sm {\n  display: none !important;\n}\n\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md {\n  display: none !important;\n}\n\ntr.visible-md {\n  display: none !important;\n}\n\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg {\n  display: none !important;\n}\n\ntr.visible-lg {\n  display: none !important;\n}\n\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-md {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-md {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n  tr.hidden-md {\n    display: none !important;\n  }\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-md {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print {\n  display: none !important;\n}\n\ntr.visible-print {\n  display: none !important;\n}\n\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n  tr.hidden-print {\n    display: none !important;\n  }\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Default.aspx",
    "content": "﻿<%@ Page Title=\"Home Page\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Default.aspx.cs\" Inherits=\"ProductLaunch.Web._Default\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>We&#39;re launching a new product!</h1>\n        <p class=\"lead\">Our new product is going to be very, very good.</p>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-8\">\n            <h2>What&#39;s this all about?</h2>\n            <p>\n                Lorem ipsum dolor sit amet lectus. In magna in praesent nibh lorem. Egestas ipsum luctus feugiat sit enim. Libero nec a. Praesent vestibulum quis enim.</p>\n            <p>\n                Morbi fusce placerat et pellentesque qui curabitur dictum nam. Adipiscing pede semper. Tellus at sem. Arcu nibh et. Magna luctus nibh. Eu erat aenean adipiscing vitae pretium. Pede nec laoreet. Adipiscing mauris lorem tortor nec massa distinctio pede justo. Gravida non purus nunc sit consequat imperdiet sodales nullam dolor vel.</p>\n            <p>\n                <a class=\"btn btn-default\" href=\"https://www.docker.com/enterprise\">Check Out Our Other Products &raquo;</a>\n            </p>\n        </div>\n        <div class=\"col-md-4\">\n            <h2>Interested?</h2>\n            <p>\n                Give us your details and we&#39;ll keep you posted.</p>\n            <p>\n                It only takes 30 seconds to sign up.\n            </p>\n            <p>\n                And we probably won't spam you very much.\n            </p>\n            <p>\n                <a class=\"btn btn btn-primary btn-lg\" href=\"SignUp.aspx\">Sign Up &raquo;</a>\n            </p>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Default.aspx.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Net;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public partial class _Default : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n        }        \n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Default.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class _Default\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"ProductLaunch.Web.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Global.asax.cs",
    "content": "﻿using ProductLaunch.Model;\nusing ProductLaunch.Model.Initializers;\nusing System;\nusing System.Data.Entity;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.Routing;\n\nnamespace ProductLaunch.Web\n{\n    public class Global : HttpApplication\n    {\n        void Application_Start(object sender, EventArgs e)\n        {\n            // Code that runs on application startup\n            RouteConfig.RegisterRoutes(RouteTable.Routes);\n            BundleConfig.RegisterBundles(BundleTable.Bundles);\n\n            Database.SetInitializer<ProductLaunchContext>(new StaticDataInitializer());\n            SignUp.PreloadStaticDataCache();\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/ProductLaunch.Web.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Web</RootNamespace>\n    <AssemblyName>ProductLaunch.Web</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <UseIISExpress>false</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.Web.Infrastructure.1.0.0.0\\lib\\net40\\Microsoft.Web.Infrastructure.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.bootstrap\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.bootstrap.3.0.0\\lib\\net45\\AspNet.ScriptManager.bootstrap.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.jQuery\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.jQuery.1.10.2\\lib\\net45\\AspNet.ScriptManager.jQuery.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.MSAjax\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.MSAjax.5.0.0\\lib\\net45\\Microsoft.ScriptManager.MSAjax.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.WebForms\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.WebForms.5.0.0\\lib\\net45\\Microsoft.ScriptManager.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.1.1.3\\lib\\net40\\System.Web.Optimization.dll</HintPath>\n    </Reference>\n    <Reference Include=\"WebGrease\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\WebGrease.1.5.2\\lib\\WebGrease.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Antlr3.Runtime\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Antlr.3.4.1.9004\\lib\\Antlr3.Runtime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.Web.Optimization.WebForms\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.WebForms.1.1.3\\lib\\net45\\Microsoft.AspNet.Web.Optimization.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.FriendlyUrls\">\n      <HintPath>..\\packages\\Microsoft.AspNet.FriendlyUrls.Core.1.0.2\\lib\\net45\\Microsoft.AspNet.FriendlyUrls.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"App_Data\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"About.aspx\" />\n    <Content Include=\"Contact.aspx\" />\n    <Content Include=\"Content\\bootstrap.css\" />\n    <Content Include=\"Content\\bootstrap.min.css\" />\n    <Content Include=\"Content\\Site.css\" />\n    <Content Include=\"SignUp.aspx\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.svg\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.woff\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.ttf\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.eot\" />\n    <Content Include=\"ApplicationInsights.config\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <None Include=\"Scripts\\jquery-1.10.2.intellisense.js\" />\n    <Content Include=\"Scripts\\bootstrap.js\" />\n    <Content Include=\"Scripts\\bootstrap.min.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.js\" />\n    <Content Include=\"Scripts\\modernizr-2.6.2.js\" />\n    <Content Include=\"Scripts\\respond.js\" />\n    <Content Include=\"Scripts\\respond.min.js\" />\n    <Content Include=\"Scripts\\WebForms\\DetailsView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Focus.js\" />\n    <Content Include=\"Scripts\\WebForms\\GridView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Menu.js\" />\n    <Content Include=\"Scripts\\WebForms\\MenuStandards.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjax.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxApplicationServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxComponentModel.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxCore.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxGlobalization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxHistory.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxNetwork.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxSerialization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxTimer.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\SmartNav.js\" />\n    <Content Include=\"Scripts\\WebForms\\TreeView.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebParts.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebUIValidation.js\" />\n    <Content Include=\"Scripts\\_references.js\" />\n    <Content Include=\"Default.aspx\" />\n    <Content Include=\"favicon.ico\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Site.Master\" />\n    <Content Include=\"ThankYou.aspx\" />\n    <Content Include=\"ViewSwitcher.ascx\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <Content Include=\"Bundle.config\" />\n    <Content Include=\"packages.config\" />\n    <None Include=\"Project_Readme.html\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.map\" />\n    <Content Include=\"Site.Mobile.Master\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\BundleConfig.cs\" />\n    <Compile Include=\"About.aspx.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"About.aspx.designer.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"App_Start\\RouteConfig.cs\" />\n    <Compile Include=\"Contact.aspx.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Contact.aspx.designer.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.designer.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Default.aspx.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Default.aspx.designer.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Site.Master.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Master.designer.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.designer.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.designer.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.designer.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{e02eff91-8c52-4dce-8279-3fd1ee0659ef}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>57120</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost/ProductLaunch.Web</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Project_Readme.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Your ASP.NET application</title>\n    <style>\n        body {\n            background: #fff;\n            color: #505050;\n            font: 14px 'Segoe UI', tahoma, arial, helvetica, sans-serif;\n            margin: 20px;\n            padding: 0;\n        }\n\n        #header {\n            background: #efefef;\n            padding: 0;\n        }\n\n        h1 {\n            font-size: 48px;\n            font-weight: normal;\n            margin: 0;\n            padding: 0 30px;\n            line-height: 150px;\n        }\n\n        p {\n            font-size: 20px;\n            color: #fff;\n            background: #969696;\n            padding: 0 30px;\n            line-height: 50px;\n        }\n\n        #main {\n            padding: 5px 30px;\n        }\n\n        .section {\n            width: 21.7%;\n            float: left;\n            margin: 0 0 0 4%;\n        }\n\n            .section h2 {\n                font-size: 13px;\n                text-transform: uppercase;\n                margin: 0;\n                border-bottom: 1px solid silver;\n                padding-bottom: 12px;\n                margin-bottom: 8px;\n            }\n\n            .section.first {\n                margin-left: 0;\n            }\n\n                .section.first h2 {\n                    font-size: 24px;\n                    text-transform: none;\n                    margin-bottom: 25px;\n                    border: none;\n                }\n\n                .section.first li {\n                    border-top: 1px solid silver;\n                    padding: 8px 0;\n                }\n\n            .section.last {\n                margin-right: 0;\n            }\n\n        ul {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n            line-height: 20px;\n        }\n\n        li {\n            padding: 4px 0;\n        }\n\n        a {\n            color: #267cb2;\n            text-decoration: none;\n        }\n\n            a:hover {\n                text-decoration: underline;\n            }\n    </style>\n</head>\n<body>\n\n    <div id=\"header\">\n        <h1>Your ASP.NET application</h1>\n        <p>Congratulations! You've created a project</p>\n    </div>\n\n    <div id=\"main\">\n        <div class=\"section first\">\n            <h2>This application consists of:</h2>\n            <ul>\n                <li>Sample pages showing basic nav between Home, About, and Contact.</li>\n                <li>Theming using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615519\">Bootstrap</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615520\">Authentication</a>, if selected, shows how to register and sign in</li>\n                <li>ASP.NET features managed using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615521\">NuGet</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Customize app</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615522\">Get started with ASP.NET Web Forms</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615523\">Change the site's theme</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615524\">Add more libraries using NuGet</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615525\">Configure authentication</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615526\">Customize information about the website users</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615527\">Get information from social providers</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615528\">Add HTTP services using ASP.NET Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615529\">Secure the Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615530\">Add real-time web with ASP.NET SignalR</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615531\">Add components using Scaffolding</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615532\">Test app with Browser Link</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615533\">Share your project</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Deploy</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615534\">Ensure your app is ready for production</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615535\">Microsoft Azure</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615536\">Hosting providers</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section last\">\n            <h2>Get help</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615537\">Get help</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615538\">Get more templates</a></li>\n            </ul>\n        </div>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Web\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Web\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"17a57cf4-a6c1-47c1-aa38-650db6d87f8f\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/DetailsView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/DetailsView.js\nfunction DetailsView() {\n    this.pageIndex = null;\n    this.dataKeys = null;\n    this.createPropertyString = DetailsView_createPropertyString;\n    this.setStateField = DetailsView_setStateValue;\n    this.getHiddenFieldContents = DetailsView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction DetailsView_createPropertyString() {\n    return createPropertyStringFromValues_DetailsView(this.pageIndex, this.dataKeys);\n}\nfunction DetailsView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction DetailsView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[2];\n    for (var i = 3; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_DetailsView(valsArray[0], valsArray[1]);\n}\nfunction DetailsView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_DetailsView(pageIndex, dataKeys) {\n    var value = new Array(pageIndex, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Focus.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_FindFirstFocusableChild(control) {\n    if (!control || !(control.tagName)) {\n        return null;\n    }\n    var tagName = control.tagName.toLowerCase();\n    if (tagName == \"undefined\") {\n        return null;\n    }\n    var children = control.childNodes;\n    if (children) {\n        for (var i = 0; i < children.length; i++) {\n            try {\n                if (WebForm_CanFocus(children[i])) {\n                    return children[i];\n                }\n                else {\n                    var focused = WebForm_FindFirstFocusableChild(children[i]);\n                    if (WebForm_CanFocus(focused)) {\n                        return focused;\n                    }\n                }\n            } catch (e) {\n            }\n        }\n    }\n    return null;\n}\nfunction WebForm_AutoFocus(focusId) {\n    var targetControl;\n    if (__nonMSDOMBrowser) {\n        targetControl = document.getElementById(focusId);\n    }\n    else {\n        targetControl = document.all[focusId];\n    }\n    var focused = targetControl;\n    if (targetControl && (!WebForm_CanFocus(targetControl)) ) {\n        focused = WebForm_FindFirstFocusableChild(targetControl);\n    }\n    if (focused) {\n        try {\n            focused.focus();\n            if (__nonMSDOMBrowser) {\n                focused.scrollIntoView(false);\n            }\n            if (window.__smartNav) {\n                window.__smartNav.ae = focused.id;\n            }\n        }\n        catch (e) {\n        }\n    }\n}\nfunction WebForm_CanFocus(element) {\n    if (!element || !(element.tagName)) return false;\n    var tagName = element.tagName.toLowerCase();\n    return (!(element.disabled) &&\n            (!(element.type) || element.type.toLowerCase() != \"hidden\") &&\n            WebForm_IsFocusableTag(tagName) &&\n            WebForm_IsInVisibleContainer(element)\n            );\n}\nfunction WebForm_IsFocusableTag(tagName) {\n    return (tagName == \"input\" ||\n            tagName == \"textarea\" ||\n            tagName == \"select\" ||\n            tagName == \"button\" ||\n            tagName == \"a\");\n}\nfunction WebForm_IsInVisibleContainer(ctrl) {\n    var current = ctrl;\n    while((typeof(current) != \"undefined\") && (current != null)) {\n        if (current.disabled ||\n            ( typeof(current.style) != \"undefined\" &&\n            ( ( typeof(current.style.display) != \"undefined\" &&\n                current.style.display == \"none\") ||\n                ( typeof(current.style.visibility) != \"undefined\" &&\n                current.style.visibility == \"hidden\") ) ) ) {\n            return false;\n        }\n        if (typeof(current.parentNode) != \"undefined\" &&\n                current.parentNode != null &&\n                current.parentNode != current &&\n                current.parentNode.tagName.toLowerCase() != \"body\") {\n            current = current.parentNode;\n        }\n        else {\n            return true;\n        }\n    }\n    return true;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/GridView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/GridView.js\nfunction GridView() {\n    this.pageIndex = null;\n    this.sortExpression = null;\n    this.sortDirection = null;\n    this.dataKeys = null;\n    this.createPropertyString = GridView_createPropertyString;\n    this.setStateField = GridView_setStateValue;\n    this.getHiddenFieldContents = GridView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction GridView_createPropertyString() {\n    return createPropertyStringFromValues_GridView(this.pageIndex, this.sortDirection, this.sortExpression, this.dataKeys);\n}\nfunction GridView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction GridView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[4];\n    for (var i = 5; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_GridView(valsArray[0], valsArray[1], valsArray[2], valsArray[3]);\n}\nfunction GridView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_GridView(pageIndex, sortDirection, sortExpression, dataKeys) {\n    var value = new Array(pageIndex, sortDirection, sortExpression, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjax.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjax.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjax.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript._scripts={\"MicrosoftAjaxCore.js\":true,\"MicrosoftAjaxGlobalization.js\":true,\"MicrosoftAjaxSerialization.js\":true,\"MicrosoftAjaxComponentModel.js\":true,\"MicrosoftAjaxHistory.js\":true,\"MicrosoftAjaxNetwork.js\":true,\"MicrosoftAjaxWebServices.js\":true};Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};Type.registerNamespace(\"Sys.UI\");Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxApplicationServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxApplicationServices.js\nType._registerScript(\"MicrosoftAjaxApplicationServices.js\",[\"MicrosoftAjaxWebServices.js\"]);Type.registerNamespace(\"Sys.Services\");Sys.Services._ProfileService=function(){Sys.Services._ProfileService.initializeBase(this);this.properties={}};Sys.Services._ProfileService.DefaultWebServicePath=\"\";Sys.Services._ProfileService.prototype={_defaultLoadCompletedCallback:null,_defaultSaveCompletedCallback:null,_path:\"\",_timeout:0,get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_defaultSaveCompletedCallback:function(){return this._defaultSaveCompletedCallback},set_defaultSaveCompletedCallback:function(a){this._defaultSaveCompletedCallback=a},get_path:function(){return this._path||\"\"},load:function(c,d,e,f){var b,a;if(!c){a=\"GetAllPropertiesForCurrentUser\";b={authenticatedUserOnly:false}}else{a=\"GetPropertiesForCurrentUser\";b={properties:this._clonePropertyNames(c),authenticatedUserOnly:false}}this._invoke(this._get_path(),a,false,b,Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[d,e,f])},save:function(d,b,c,e){var a=this._flattenProperties(d,this.properties);this._invoke(this._get_path(),\"SetPropertiesForCurrentUser\",false,{values:a.value,authenticatedUserOnly:false},Function.createDelegate(this,this._onSaveComplete),Function.createDelegate(this,this._onSaveFailed),[b,c,e,a.count])},_clonePropertyNames:function(e){var c=[],d={};for(var b=0;b<e.length;b++){var a=e[b];if(!d[a]){Array.add(c,a);d[a]=true}}return c},_flattenProperties:function(a,i,j){var b={},e,d,g=0;if(a&&a.length===0)return {value:b,count:0};for(var c in i){e=i[c];d=j?j+\".\"+c:c;if(Sys.Services.ProfileGroup.isInstanceOfType(e)){var k=this._flattenProperties(a,e,d),h=k.value;g+=k.count;for(var f in h){var l=h[f];b[f]=l}}else if(!a||Array.indexOf(a,d)!==-1){b[d]=e;g++}}return {value:b,count:g}},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._ProfileService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoadComplete:function(a,e,g){if(typeof a!==\"object\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,g,\"Object\"));var c=this._unflattenProperties(a);for(var b in c)this.properties[b]=c[b];var d=e[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(d){var f=e[2]||this.get_defaultUserContext();d(a.length,f,\"Sys.Services.ProfileService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.load\")}},_onSaveComplete:function(a,b,f){var c=b[3];if(a!==null)if(a instanceof Array)c-=a.length;else if(typeof a===\"number\")c=a;else throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));var d=b[0]||this.get_defaultSaveCompletedCallback()||this.get_defaultSucceededCallback();if(d){var e=b[2]||this.get_defaultUserContext();d(c,e,\"Sys.Services.ProfileService.save\")}},_onSaveFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.save\")}},_unflattenProperties:function(e){var c={},d,f,h=0;for(var a in e){h++;f=e[a];d=a.indexOf(\".\");if(d!==-1){var g=a.substr(0,d);a=a.substr(d+1);var b=c[g];if(!b||!Sys.Services.ProfileGroup.isInstanceOfType(b)){b=new Sys.Services.ProfileGroup;c[g]=b}b[a]=f}else c[a]=f}e.length=h;return c}};Sys.Services._ProfileService.registerClass(\"Sys.Services._ProfileService\",Sys.Net.WebServiceProxy);Sys.Services.ProfileService=new Sys.Services._ProfileService;Sys.Services.ProfileGroup=function(a){if(a)for(var b in a)this[b]=a[b]};Sys.Services.ProfileGroup.registerClass(\"Sys.Services.ProfileGroup\");Sys.Services._AuthenticationService=function(){Sys.Services._AuthenticationService.initializeBase(this)};Sys.Services._AuthenticationService.DefaultWebServicePath=\"\";Sys.Services._AuthenticationService.prototype={_defaultLoginCompletedCallback:null,_defaultLogoutCompletedCallback:null,_path:\"\",_timeout:0,_authenticated:false,get_defaultLoginCompletedCallback:function(){return this._defaultLoginCompletedCallback},set_defaultLoginCompletedCallback:function(a){this._defaultLoginCompletedCallback=a},get_defaultLogoutCompletedCallback:function(){return this._defaultLogoutCompletedCallback},set_defaultLogoutCompletedCallback:function(a){this._defaultLogoutCompletedCallback=a},get_isLoggedIn:function(){return this._authenticated},get_path:function(){return this._path||\"\"},login:function(c,b,a,h,f,d,e,g){this._invoke(this._get_path(),\"Login\",false,{userName:c,password:b,createPersistentCookie:a},Function.createDelegate(this,this._onLoginComplete),Function.createDelegate(this,this._onLoginFailed),[c,b,a,h,f,d,e,g])},logout:function(c,a,b,d){this._invoke(this._get_path(),\"Logout\",false,{},Function.createDelegate(this,this._onLogoutComplete),Function.createDelegate(this,this._onLogoutFailed),[c,a,b,d])},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._AuthenticationService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoginComplete:function(e,c,f){if(typeof e!==\"boolean\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Boolean\"));var b=c[4],d=c[7]||this.get_defaultUserContext(),a=c[5]||this.get_defaultLoginCompletedCallback()||this.get_defaultSucceededCallback();if(e){this._authenticated=true;if(a)a(true,d,\"Sys.Services.AuthenticationService.login\");if(typeof b!==\"undefined\"&&b!==null)window.location.href=b}else if(a)a(false,d,\"Sys.Services.AuthenticationService.login\")},_onLoginFailed:function(d,b){var a=b[6]||this.get_defaultFailedCallback();if(a){var c=b[7]||this.get_defaultUserContext();a(d,c,\"Sys.Services.AuthenticationService.login\")}},_onLogoutComplete:function(f,a,e){if(f!==null)throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,e,\"null\"));var b=a[0],d=a[3]||this.get_defaultUserContext(),c=a[1]||this.get_defaultLogoutCompletedCallback()||this.get_defaultSucceededCallback();this._authenticated=false;if(c)c(null,d,\"Sys.Services.AuthenticationService.logout\");if(!b)window.location.reload();else window.location.href=b},_onLogoutFailed:function(c,b){var a=b[2]||this.get_defaultFailedCallback();if(a)a(c,b[3],\"Sys.Services.AuthenticationService.logout\")},_setAuthenticated:function(a){this._authenticated=a}};Sys.Services._AuthenticationService.registerClass(\"Sys.Services._AuthenticationService\",Sys.Net.WebServiceProxy);Sys.Services.AuthenticationService=new Sys.Services._AuthenticationService;Sys.Services._RoleService=function(){Sys.Services._RoleService.initializeBase(this);this._roles=[]};Sys.Services._RoleService.DefaultWebServicePath=\"\";Sys.Services._RoleService.prototype={_defaultLoadCompletedCallback:null,_rolesIndex:null,_timeout:0,_path:\"\",get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_path:function(){return this._path||\"\"},get_roles:function(){return Array.clone(this._roles)},isUserInRole:function(a){var b=this._get_rolesIndex()[a.trim().toLowerCase()];return !!b},load:function(a,b,c){Sys.Net.WebServiceProxy.invoke(this._get_path(),\"GetRolesForCurrentUser\",false,{},Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[a,b,c],this.get_timeout())},_get_path:function(){var a=this.get_path();if(!a||!a.length)a=Sys.Services._RoleService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_get_rolesIndex:function(){if(!this._rolesIndex){var b={};for(var a=0;a<this._roles.length;a++)b[this._roles[a].toLowerCase()]=true;this._rolesIndex=b}return this._rolesIndex},_onLoadComplete:function(a,c,f){if(a&&!(a instanceof Array))throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));this._roles=a;this._rolesIndex=null;var b=c[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(b){var e=c[2]||this.get_defaultUserContext(),d=Array.clone(a);b(d,e,\"Sys.Services.RoleService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.RoleService.load\")}}};Sys.Services._RoleService.registerClass(\"Sys.Services._RoleService\",Sys.Net.WebServiceProxy);Sys.Services.RoleService=new Sys.Services._RoleService;"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxComponentModel.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxComponentModel.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxComponentModel.js\nType._registerScript(\"MicrosoftAjaxComponentModel.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.UI\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxCore.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxCore.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxCore.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript(\"MicrosoftAjaxCore.js\");Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxGlobalization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxGlobalization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxGlobalization.js\nType._registerScript(\"MicrosoftAjaxGlobalization.js\",[\"MicrosoftAjaxCore.js\"]);Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxHistory.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxHistory.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxHistory.js\nType._registerScript(\"MicrosoftAjaxHistory.js\",[\"MicrosoftAjaxComponentModel.js\",\"MicrosoftAjaxSerialization.js\"]);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxNetwork.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxNetwork.js\nType._registerScript(\"MicrosoftAjaxNetwork.js\",[\"MicrosoftAjaxSerialization.js\"]);if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxSerialization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxSerialization.js\nType._registerScript(\"MicrosoftAjaxSerialization.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxTimer.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxTimer.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxTimer.js\nType._registerScript(\"Timer.js\",[\"MicrosoftAjaxComponentModel.js\"]);Sys.UI._Timer=function(a){Sys.UI._Timer.initializeBase(this,[a]);this._interval=60000;this._enabled=true;this._postbackPending=false;this._raiseTickDelegate=null;this._endRequestHandlerDelegate=null;this._timer=null;this._pageRequestManager=null;this._uniqueID=null};Sys.UI._Timer.prototype={get_enabled:function(){return this._enabled},set_enabled:function(a){this._enabled=a},get_interval:function(){return this._interval},set_interval:function(a){this._interval=a},get_uniqueID:function(){return this._uniqueID},set_uniqueID:function(a){this._uniqueID=a},dispose:function(){this._stopTimer();if(this._pageRequestManager!==null)this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);Sys.UI._Timer.callBaseMethod(this,\"dispose\")},_doPostback:function(){__doPostBack(this.get_uniqueID(),\"\")},_handleEndRequest:function(c,b){var a=b.get_dataItems()[this.get_id()];if(a)this._update(a[0],a[1]);if(this._postbackPending===true&&this._pageRequestManager!==null&&this._pageRequestManager.get_isInAsyncPostBack()===false){this._postbackPending=false;this._doPostback()}},initialize:function(){Sys.UI._Timer.callBaseMethod(this,\"initialize\");this._raiseTickDelegate=Function.createDelegate(this,this._raiseTick);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null)this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate);if(this.get_enabled())this._startTimer()},_raiseTick:function(){this._startTimer();if(this._pageRequestManager===null||!this._pageRequestManager.get_isInAsyncPostBack()){this._doPostback();this._postbackPending=false}else this._postbackPending=true},_startTimer:function(){this._timer=window.setTimeout(Function.createDelegate(this,this._raiseTick),this.get_interval())},_stopTimer:function(){if(this._timer!==null){window.clearTimeout(this._timer);this._timer=null}},_update:function(c,b){var a=!this.get_enabled(),d=this.get_interval()!==b;if(!a&&(!c||d)){this._stopTimer();a=true}this.set_enabled(c);this.set_interval(b);if(this.get_enabled()&&a)this._startTimer()}};Sys.UI._Timer.registerClass(\"Sys.UI._Timer\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebForms.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebForms.js\nType._registerScript(\"MicrosoftAjaxWebForms.js\",[\"MicrosoftAjaxCore.js\",\"MicrosoftAjaxSerialization.js\",\"MicrosoftAjaxNetwork.js\",\"MicrosoftAjaxComponentModel.js\"]);Type.registerNamespace(\"Sys.WebForms\");Sys.WebForms.BeginRequestEventArgs=function(c,b,a){Sys.WebForms.BeginRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.BeginRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]}};Sys.WebForms.BeginRequestEventArgs.registerClass(\"Sys.WebForms.BeginRequestEventArgs\",Sys.EventArgs);Sys.WebForms.EndRequestEventArgs=function(c,a,b){Sys.WebForms.EndRequestEventArgs.initializeBase(this);this._errorHandled=false;this._error=c;this._dataItems=a||{};this._response=b};Sys.WebForms.EndRequestEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_error:function(){return this._error},get_errorHandled:function(){return this._errorHandled},set_errorHandled:function(a){this._errorHandled=a},get_response:function(){return this._response}};Sys.WebForms.EndRequestEventArgs.registerClass(\"Sys.WebForms.EndRequestEventArgs\",Sys.EventArgs);Sys.WebForms.InitializeRequestEventArgs=function(c,b,a){Sys.WebForms.InitializeRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.InitializeRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]},set_updatePanelsToUpdate:function(a){this._updated=true;this._updatePanelsToUpdate=a}};Sys.WebForms.InitializeRequestEventArgs.registerClass(\"Sys.WebForms.InitializeRequestEventArgs\",Sys.CancelEventArgs);Sys.WebForms.PageLoadedEventArgs=function(b,a,c){Sys.WebForms.PageLoadedEventArgs.initializeBase(this);this._panelsUpdated=b;this._panelsCreated=a;this._dataItems=c||{}};Sys.WebForms.PageLoadedEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsCreated:function(){return this._panelsCreated},get_panelsUpdated:function(){return this._panelsUpdated}};Sys.WebForms.PageLoadedEventArgs.registerClass(\"Sys.WebForms.PageLoadedEventArgs\",Sys.EventArgs);Sys.WebForms.PageLoadingEventArgs=function(b,a,c){Sys.WebForms.PageLoadingEventArgs.initializeBase(this);this._panelsUpdating=b;this._panelsDeleting=a;this._dataItems=c||{}};Sys.WebForms.PageLoadingEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsDeleting:function(){return this._panelsDeleting},get_panelsUpdating:function(){return this._panelsUpdating}};Sys.WebForms.PageLoadingEventArgs.registerClass(\"Sys.WebForms.PageLoadingEventArgs\",Sys.EventArgs);Sys._ScriptLoader=function(){this._scriptsToLoad=null;this._sessions=[];this._scriptLoadedDelegate=Function.createDelegate(this,this._scriptLoadedHandler)};Sys._ScriptLoader.prototype={dispose:function(){this._stopSession();this._loading=false;if(this._events)delete this._events;this._sessions=null;this._currentSession=null;this._scriptLoadedDelegate=null},loadScripts:function(d,b,c,a){var e={allScriptsLoadedCallback:b,scriptLoadFailedCallback:c,scriptLoadTimeoutCallback:a,scriptsToLoad:this._scriptsToLoad,scriptTimeout:d};this._scriptsToLoad=null;this._sessions[this._sessions.length]=e;if(!this._loading)this._nextSession()},queueCustomScriptTag:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,a)},queueScriptBlock:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{text:a})},queueScriptReference:function(a,b){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{src:a,fallback:b})},_createScriptElement:function(c){var a=document.createElement(\"script\");a.type=\"text/javascript\";for(var b in c)a[b]=c[b];return a},_loadScriptsInternal:function(){var c=this._currentSession;if(c.scriptsToLoad&&c.scriptsToLoad.length>0){var b=Array.dequeue(c.scriptsToLoad),f=this._scriptLoadedDelegate;if(b.fallback){var g=b.fallback;delete b.fallback;var d=this;f=function(b,a){a||function(){var a=d._createScriptElement({src:g});d._currentTask=new Sys._ScriptLoaderTask(a,d._scriptLoadedDelegate);d._currentTask.execute()}()}}var a=this._createScriptElement(b);if(a.text&&Sys.Browser.agent===Sys.Browser.Safari){a.innerHTML=a.text;delete a.text}if(typeof b.src===\"string\"){this._currentTask=new Sys._ScriptLoaderTask(a,f);this._currentTask.execute()}else{document.getElementsByTagName(\"head\")[0].appendChild(a);Sys._ScriptLoaderTask._clearScript(a);this._loadScriptsInternal()}}else{this._stopSession();var e=c.allScriptsLoadedCallback;if(e)e(this);this._nextSession()}},_nextSession:function(){if(this._sessions.length===0){this._loading=false;this._currentSession=null;return}this._loading=true;var a=Array.dequeue(this._sessions);this._currentSession=a;if(a.scriptTimeout>0)this._timeoutCookie=window.setTimeout(Function.createDelegate(this,this._scriptLoadTimeoutHandler),a.scriptTimeout*1000);this._loadScriptsInternal()},_raiseError:function(){var b=this._currentSession.scriptLoadFailedCallback,a=this._currentTask.get_scriptElement();this._stopSession();if(b){b(this,a);this._nextSession()}else{this._loading=false;throw Sys._ScriptLoader._errorScriptLoadFailed(a.src)}},_scriptLoadedHandler:function(a,b){if(b){Array.add(Sys._ScriptLoader._getLoadedScripts(),a.src);this._currentTask.dispose();this._currentTask=null;this._loadScriptsInternal()}else this._raiseError()},_scriptLoadTimeoutHandler:function(){var a=this._currentSession.scriptLoadTimeoutCallback;this._stopSession();if(a)a(this);this._nextSession()},_stopSession:function(){if(this._timeoutCookie){window.clearTimeout(this._timeoutCookie);this._timeoutCookie=null}if(this._currentTask){this._currentTask.dispose();this._currentTask=null}}};Sys._ScriptLoader.registerClass(\"Sys._ScriptLoader\",null,Sys.IDisposable);Sys._ScriptLoader.getInstance=function(){var a=Sys._ScriptLoader._activeInstance;if(!a)a=Sys._ScriptLoader._activeInstance=new Sys._ScriptLoader;return a};Sys._ScriptLoader.isScriptLoaded=function(b){var a=document.createElement(\"script\");a.src=b;return Array.contains(Sys._ScriptLoader._getLoadedScripts(),a.src)};Sys._ScriptLoader.readLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){var c=Sys._ScriptLoader._referencedScripts=[],d=document.getElementsByTagName(\"script\");for(var b=d.length-1;b>=0;b--){var e=d[b],a=e.src;if(a.length)if(!Array.contains(c,a))Array.add(c,a)}}};Sys._ScriptLoader._errorScriptLoadFailed=function(b){var a;a=Sys.Res.scriptLoadFailed;var d=\"Sys.ScriptLoadFailedException: \"+String.format(a,b),c=Error.create(d,{name:\"Sys.ScriptLoadFailedException\",\"scriptUrl\":b});c.popStackFrame();return c};Sys._ScriptLoader._getLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){Sys._ScriptLoader._referencedScripts=[];Sys._ScriptLoader.readLoadedScripts()}return Sys._ScriptLoader._referencedScripts};Sys.WebForms.PageRequestManager=function(){this._form=null;this._activeDefaultButton=null;this._activeDefaultButtonClicked=false;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._updatePanelHasChildrenAsTriggers=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._scriptManagerID=null;this._pageLoadedHandler=null;this._additionalInput=null;this._onsubmit=null;this._onSubmitStatements=[];this._originalDoPostBack=null;this._originalDoPostBackWithOptions=null;this._originalFireDefaultButton=null;this._originalDoCallback=null;this._isCrossPost=false;this._postBackSettings=null;this._request=null;this._onFormSubmitHandler=null;this._onFormElementClickHandler=null;this._onWindowUnloadHandler=null;this._asyncPostBackTimeout=null;this._controlIDToFocus=null;this._scrollPosition=null;this._processingRequest=false;this._scriptDisposes={};this._transientFields=[\"__VIEWSTATEENCRYPTED\",\"__VIEWSTATEFIELDCOUNT\"];this._textTypes=/^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i};Sys.WebForms.PageRequestManager.prototype={_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_isInAsyncPostBack:function(){return this._request!==null},add_beginRequest:function(a){this._get_eventHandlerList().addHandler(\"beginRequest\",a)},remove_beginRequest:function(a){this._get_eventHandlerList().removeHandler(\"beginRequest\",a)},add_endRequest:function(a){this._get_eventHandlerList().addHandler(\"endRequest\",a)},remove_endRequest:function(a){this._get_eventHandlerList().removeHandler(\"endRequest\",a)},add_initializeRequest:function(a){this._get_eventHandlerList().addHandler(\"initializeRequest\",a)},remove_initializeRequest:function(a){this._get_eventHandlerList().removeHandler(\"initializeRequest\",a)},add_pageLoaded:function(a){this._get_eventHandlerList().addHandler(\"pageLoaded\",a)},remove_pageLoaded:function(a){this._get_eventHandlerList().removeHandler(\"pageLoaded\",a)},add_pageLoading:function(a){this._get_eventHandlerList().addHandler(\"pageLoading\",a)},remove_pageLoading:function(a){this._get_eventHandlerList().removeHandler(\"pageLoading\",a)},abortPostBack:function(){if(!this._processingRequest&&this._request){this._request.get_executor().abort();this._request=null}},beginAsyncPostBack:function(c,a,f,d,e){if(d&&typeof Page_ClientValidate===\"function\"&&!Page_ClientValidate(e||null))return;this._postBackSettings=this._createPostBackSettings(true,c,a);var b=this._form;b.__EVENTTARGET.value=a||\"\";b.__EVENTARGUMENT.value=f||\"\";this._isCrossPost=false;this._additionalInput=null;this._onFormSubmit()},_cancelPendingCallbacks:function(){for(var a=0,e=window.__pendingCallbacks.length;a<e;a++){var c=window.__pendingCallbacks[a];if(c){if(!c.async)window.__synchronousCallBackIndex=-1;window.__pendingCallbacks[a]=null;var d=\"__CALLBACKFRAME\"+a,b=document.getElementById(d);if(b)b.parentNode.removeChild(b)}}},_commitControls:function(a,b){if(a){this._updatePanelIDs=a.updatePanelIDs;this._updatePanelClientIDs=a.updatePanelClientIDs;this._updatePanelHasChildrenAsTriggers=a.updatePanelHasChildrenAsTriggers;this._asyncPostBackControlIDs=a.asyncPostBackControlIDs;this._asyncPostBackControlClientIDs=a.asyncPostBackControlClientIDs;this._postBackControlIDs=a.postBackControlIDs;this._postBackControlClientIDs=a.postBackControlClientIDs}if(typeof b!==\"undefined\"&&b!==null)this._asyncPostBackTimeout=b*1000},_createHiddenField:function(c,d){var b,a=document.getElementById(c);if(a)if(!a._isContained)a.parentNode.removeChild(a);else b=a.parentNode;if(!b){b=document.createElement(\"span\");b.style.cssText=\"display:none !important\";this._form.appendChild(b)}b.innerHTML=\"<input type='hidden' />\";a=b.childNodes[0];a._isContained=true;a.id=a.name=c;a.value=d},_createPageRequestManagerTimeoutError:function(){var b=\"Sys.WebForms.PageRequestManagerTimeoutException: \"+Sys.WebForms.Res.PRM_TimeoutError,a=Error.create(b,{name:\"Sys.WebForms.PageRequestManagerTimeoutException\"});a.popStackFrame();return a},_createPageRequestManagerServerError:function(a,d){var c=\"Sys.WebForms.PageRequestManagerServerErrorException: \"+(d||String.format(Sys.WebForms.Res.PRM_ServerError,a)),b=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerServerErrorException\",httpStatusCode:a});b.popStackFrame();return b},_createPageRequestManagerParserError:function(b){var c=\"Sys.WebForms.PageRequestManagerParserErrorException: \"+String.format(Sys.WebForms.Res.PRM_ParserError,b),a=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerParserErrorException\"});a.popStackFrame();return a},_createPanelID:function(e,b){var c=b.asyncTarget,a=this._ensureUniqueIds(e||b.panelsToUpdate),d=a instanceof Array?a.join(\",\"):a||this._scriptManagerID;if(c)d+=\"|\"+c;return encodeURIComponent(this._scriptManagerID)+\"=\"+encodeURIComponent(d)+\"&\"},_createPostBackSettings:function(d,a,c,b){return {async:d,asyncTarget:c,panelsToUpdate:a,sourceElement:b}},_convertToClientIDs:function(a,f,e,d){if(a)for(var b=0,h=a.length;b<h;b+=d?2:1){var c=a[b],g=(d?a[b+1]:\"\")||this._uniqueIDToClientID(c);Array.add(f,c);Array.add(e,g)}},dispose:function(){if(this._form){Sys.UI.DomEvent.removeHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.removeHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._onWindowUnloadHandler);Sys.UI.DomEvent.removeHandler(window,\"load\",this._pageLoadedHandler)}if(this._originalDoPostBack){window.__doPostBack=this._originalDoPostBack;this._originalDoPostBack=null}if(this._originalDoPostBackWithOptions){window.WebForm_DoPostBackWithOptions=this._originalDoPostBackWithOptions;this._originalDoPostBackWithOptions=null}if(this._originalFireDefaultButton){window.WebForm_FireDefaultButton=this._originalFireDefaultButton;this._originalFireDefaultButton=null}if(this._originalDoCallback){window.WebForm_DoCallback=this._originalDoCallback;this._originalDoCallback=null}this._form=null;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._asyncPostBackTimeout=null;this._scrollPosition=null;this._activeElement=null},_doCallback:function(d,b,c,f,a,e){if(!this.get_isInAsyncPostBack())this._originalDoCallback(d,b,c,f,a,e)},_doPostBack:function(a,k){var f=window.event;if(!f){var d=arguments.callee?arguments.callee.caller:null;if(d){var j=30;while(d.arguments.callee.caller&&--j)d=d.arguments.callee.caller;f=j&&d.arguments.length?d.arguments[0]:null}}this._additionalInput=null;var h=this._form;if(a===null||typeof a===\"undefined\"||this._isCrossPost){this._postBackSettings=this._createPostBackSettings(false);this._isCrossPost=false}else{var c=this._masterPageUniqueID,l=this._uniqueIDToClientID(a),g=document.getElementById(l);if(!g&&c)if(a.indexOf(c+\"$\")===0)g=document.getElementById(l.substr(c.length+1));if(!g)if(Array.contains(this._asyncPostBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(true,null,a);else if(Array.contains(this._postBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(false);else{var e=this._findNearestElement(a);if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{if(c){c+=\"$\";if(a.indexOf(c)===0)e=this._findNearestElement(a.substr(c.length))}if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{var b;try{b=f?f.target||f.srcElement:null}catch(n){}b=b||this._activeElement;var m=/__doPostBack\\(|WebForm_DoPostBackWithOptions\\(/;function i(b){b=b?b.toString():\"\";return m.test(b)&&b.indexOf(\"'\"+a+\"'\")!==-1||b.indexOf('\"'+a+'\"')!==-1}if(b&&(b.name===a||i(b.href)||i(b.onclick)||i(b.onchange)))this._postBackSettings=this._getPostBackSettings(b,a);else this._postBackSettings=this._createPostBackSettings(false)}}}else this._postBackSettings=this._getPostBackSettings(g,a)}if(!this._postBackSettings.async){h.onsubmit=this._onsubmit;this._originalDoPostBack(a,k);h.onsubmit=null;return}h.__EVENTTARGET.value=a;h.__EVENTARGUMENT.value=k;this._onFormSubmit()},_doPostBackWithOptions:function(a){this._isCrossPost=a&&a.actionUrl;var d=true;if(a.validation)if(typeof Page_ClientValidate==\"function\")d=Page_ClientValidate(a.validationGroup);if(d){if(typeof a.actionUrl!=\"undefined\"&&a.actionUrl!=null&&a.actionUrl.length>0)theForm.action=a.actionUrl;if(a.trackFocus){var c=theForm.elements[\"__LASTFOCUS\"];if(typeof c!=\"undefined\"&&c!=null)if(typeof document.activeElement==\"undefined\")c.value=a.eventTarget;else{var b=document.activeElement;if(typeof b!=\"undefined\"&&b!=null)if(typeof b.id!=\"undefined\"&&b.id!=null&&b.id.length>0)c.value=b.id;else if(typeof b.name!=\"undefined\")c.value=b.name}}}if(a.clientSubmit)this._doPostBack(a.eventTarget,a.eventArgument)},_elementContains:function(b,a){while(a){if(a===b)return true;a=a.parentNode}return false},_endPostBack:function(a,d,f){if(this._request===d.get_webRequest()){this._processingRequest=false;this._additionalInput=null;this._request=null}var e=this._get_eventHandlerList().getHandler(\"endRequest\"),b=false;if(e){var c=new Sys.WebForms.EndRequestEventArgs(a,f?f.dataItems:{},d);e(this,c);b=c.get_errorHandled()}if(a&&!b)throw a},_ensureUniqueIds:function(a){if(!a)return a;a=a instanceof Array?a:[a];var c=[];for(var b=0,f=a.length;b<f;b++){var e=a[b],d=Array.indexOf(this._updatePanelClientIDs,e);c.push(d>-1?this._updatePanelIDs[d]:e)}return c},_findNearestElement:function(a){while(a.length>0){var d=this._uniqueIDToClientID(a),c=document.getElementById(d);if(c)return c;var b=a.lastIndexOf(\"$\");if(b===-1)return null;a=a.substring(0,b)}return null},_findText:function(b,a){var c=Math.max(0,a-20),d=Math.min(b.length,a+20);return b.substring(c,d)},_fireDefaultButton:function(a,d){if(a.keyCode===13){var c=a.srcElement||a.target;if(!c||c.tagName.toLowerCase()!==\"textarea\"){var b=document.getElementById(d);if(b&&typeof b.click!==\"undefined\"){this._activeDefaultButton=b;this._activeDefaultButtonClicked=false;try{b.click()}finally{this._activeDefaultButton=null}a.cancelBubble=true;if(typeof a.stopPropagation===\"function\")a.stopPropagation();return false}}}return true},_getPageLoadedEventArgs:function(n,c){var m=[],l=[],k=c?c.version4:false,d=c?c.updatePanelData:null,e,g,h,b;if(!d){e=this._updatePanelIDs;g=this._updatePanelClientIDs;h=null;b=null}else{e=d.updatePanelIDs;g=d.updatePanelClientIDs;h=d.childUpdatePanelIDs;b=d.panelsToRefreshIDs}var a,f,j,i;if(b)for(a=0,f=b.length;a<f;a+=k?2:1){j=b[a];i=(k?b[a+1]:\"\")||this._uniqueIDToClientID(j);Array.add(m,document.getElementById(i))}for(a=0,f=e.length;a<f;a++)if(n||Array.indexOf(h,e[a])!==-1)Array.add(l,document.getElementById(g[a]));return new Sys.WebForms.PageLoadedEventArgs(m,l,c?c.dataItems:{})},_getPageLoadingEventArgs:function(f){var j=[],i=[],c=f.updatePanelData,k=c.oldUpdatePanelIDs,l=c.oldUpdatePanelClientIDs,n=c.updatePanelIDs,m=c.childUpdatePanelIDs,d=c.panelsToRefreshIDs,a,e,b,g,h=f.version4;for(a=0,e=d.length;a<e;a+=h?2:1){b=d[a];g=(h?d[a+1]:\"\")||this._uniqueIDToClientID(b);Array.add(j,document.getElementById(g))}for(a=0,e=k.length;a<e;a++){b=k[a];if(Array.indexOf(d,b)===-1&&(Array.indexOf(n,b)===-1||Array.indexOf(m,b)>-1))Array.add(i,document.getElementById(l[a]))}return new Sys.WebForms.PageLoadingEventArgs(j,i,f.dataItems)},_getPostBackSettings:function(a,c){var d=a,b=null;while(a){if(a.id){if(!b&&Array.contains(this._asyncPostBackControlClientIDs,a.id))b=this._createPostBackSettings(true,null,c,d);else if(!b&&Array.contains(this._postBackControlClientIDs,a.id))return this._createPostBackSettings(false);else{var e=Array.indexOf(this._updatePanelClientIDs,a.id);if(e!==-1)if(this._updatePanelHasChildrenAsTriggers[e])return this._createPostBackSettings(true,[this._updatePanelIDs[e]],c,d);else return this._createPostBackSettings(true,null,c,d)}if(!b&&this._matchesParentIDInList(a.id,this._asyncPostBackControlClientIDs))b=this._createPostBackSettings(true,null,c,d);else if(!b&&this._matchesParentIDInList(a.id,this._postBackControlClientIDs))return this._createPostBackSettings(false)}a=a.parentNode}if(!b)return this._createPostBackSettings(false);else return b},_getScrollPosition:function(){var a=document.documentElement;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else{a=document.body;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else if(this._validPosition(window.pageXOffset)||this._validPosition(window.pageYOffset))return {x:window.pageXOffset,y:window.pageYOffset};else return {x:0,y:0}}},_initializeInternal:function(f,g,a,b,e,c,d){if(this._prmInitialized)throw Error.invalidOperation(Sys.WebForms.Res.PRM_CannotRegisterTwice);this._prmInitialized=true;this._masterPageUniqueID=d;this._scriptManagerID=f;this._form=Sys.UI.DomElement.resolveElement(g);this._onsubmit=this._form.onsubmit;this._form.onsubmit=null;this._onFormSubmitHandler=Function.createDelegate(this,this._onFormSubmit);this._onFormElementClickHandler=Function.createDelegate(this,this._onFormElementClick);this._onWindowUnloadHandler=Function.createDelegate(this,this._onWindowUnload);Sys.UI.DomEvent.addHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.addHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._onWindowUnloadHandler);this._originalDoPostBack=window.__doPostBack;if(this._originalDoPostBack)window.__doPostBack=Function.createDelegate(this,this._doPostBack);this._originalDoPostBackWithOptions=window.WebForm_DoPostBackWithOptions;if(this._originalDoPostBackWithOptions)window.WebForm_DoPostBackWithOptions=Function.createDelegate(this,this._doPostBackWithOptions);this._originalFireDefaultButton=window.WebForm_FireDefaultButton;if(this._originalFireDefaultButton)window.WebForm_FireDefaultButton=Function.createDelegate(this,this._fireDefaultButton);this._originalDoCallback=window.WebForm_DoCallback;if(this._originalDoCallback)window.WebForm_DoCallback=Function.createDelegate(this,this._doCallback);this._pageLoadedHandler=Function.createDelegate(this,this._pageLoadedInitialLoad);Sys.UI.DomEvent.addHandler(window,\"load\",this._pageLoadedHandler);if(a)this._updateControls(a,b,e,c,true)},_matchesParentIDInList:function(c,b){for(var a=0,d=b.length;a<d;a++)if(c.startsWith(b[a]+\"_\"))return true;return false},_onFormElementActive:function(a,d,e){if(a.disabled)return;this._activeElement=a;this._postBackSettings=this._getPostBackSettings(a,a.name);if(a.name){var b=a.tagName.toUpperCase();if(b===\"INPUT\"){var c=a.type;if(c===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value);else if(c===\"image\")this._additionalInput=encodeURIComponent(a.name)+\".x=\"+d+\"&\"+encodeURIComponent(a.name)+\".y=\"+e}else if(b===\"BUTTON\"&&a.name.length!==0&&a.type===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value)}},_onFormElementClick:function(a){this._activeDefaultButtonClicked=a.target===this._activeDefaultButton;this._onFormElementActive(a.target,a.offsetX,a.offsetY)},_onFormSubmit:function(i){var f,x,h=true,z=this._isCrossPost;this._isCrossPost=false;if(this._onsubmit)h=this._onsubmit();if(h)for(f=0,x=this._onSubmitStatements.length;f<x;f++)if(!this._onSubmitStatements[f]()){h=false;break}if(!h){if(i)i.preventDefault();return}var w=this._form;if(z)return;if(this._activeDefaultButton&&!this._activeDefaultButtonClicked)this._onFormElementActive(this._activeDefaultButton,0,0);if(!this._postBackSettings||!this._postBackSettings.async)return;var b=new Sys.StringBuilder,s=w.elements,B=s.length,t=this._createPanelID(null,this._postBackSettings);b.append(t);for(f=0;f<B;f++){var e=s[f],g=e.name;if(typeof g===\"undefined\"||g===null||g.length===0||g===this._scriptManagerID)continue;var n=e.tagName.toUpperCase();if(n===\"INPUT\"){var p=e.type;if(this._textTypes.test(p)||(p===\"checkbox\"||p===\"radio\")&&e.checked){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}else if(n===\"SELECT\"){var A=e.options.length;for(var q=0;q<A;q++){var u=e.options[q];if(u.selected){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(u.value));b.append(\"&\")}}}else if(n===\"TEXTAREA\"){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}b.append(\"__ASYNCPOST=true&\");if(this._additionalInput){b.append(this._additionalInput);this._additionalInput=null}var c=new Sys.Net.WebRequest,a=w.action;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var r=a.indexOf(\"#\");if(r!==-1)a=a.substr(0,r);var o=\"\",v=\"\",m=a.indexOf(\"?\");if(m!==-1){v=a.substr(m);a=a.substr(0,m)}if(/^https?\\:\\/\\/.*$/gi.test(a)){var y=a.indexOf(\"//\")+2,l=a.indexOf(\"/\",y);if(l===-1){o=a;a=\"\"}else{o=a.substr(0,l);a=a.substr(l)}}a=o+encodeURI(decodeURI(a))+v}c.set_url(a);c.get_headers()[\"X-MicrosoftAjax\"]=\"Delta=true\";c.get_headers()[\"Cache-Control\"]=\"no-cache\";c.set_timeout(this._asyncPostBackTimeout);c.add_completed(Function.createDelegate(this,this._onFormSubmitCompleted));c.set_body(b.toString());var j,d,k=this._get_eventHandlerList().getHandler(\"initializeRequest\");if(k){j=this._postBackSettings.panelsToUpdate;d=new Sys.WebForms.InitializeRequestEventArgs(c,this._postBackSettings.sourceElement,j);k(this,d);h=!d.get_cancel()}if(!h){if(i)i.preventDefault();return}if(d&&d._updated){j=d.get_updatePanelsToUpdate();c.set_body(c.get_body().replace(t,this._createPanelID(j,this._postBackSettings)))}this._scrollPosition=this._getScrollPosition();this.abortPostBack();k=this._get_eventHandlerList().getHandler(\"beginRequest\");if(k){d=new Sys.WebForms.BeginRequestEventArgs(c,this._postBackSettings.sourceElement,j||this._postBackSettings.panelsToUpdate);k(this,d)}if(this._originalDoCallback)this._cancelPendingCallbacks();this._request=c;this._processingRequest=false;c.invoke();if(i)i.preventDefault()},_onFormSubmitCompleted:function(c){this._processingRequest=true;if(c.get_timedOut()){this._endPostBack(this._createPageRequestManagerTimeoutError(),c,null);return}if(c.get_aborted()){this._endPostBack(null,c,null);return}if(!this._request||c.get_webRequest()!==this._request)return;if(c.get_statusCode()!==200){this._endPostBack(this._createPageRequestManagerServerError(c.get_statusCode()),c,null);return}var a=this._parseDelta(c);if(!a)return;var b,e;if(a.asyncPostBackControlIDsNode&&a.postBackControlIDsNode&&a.updatePanelIDsNode&&a.panelsToRefreshNode&&a.childUpdatePanelIDsNode){var r=this._updatePanelIDs,n=this._updatePanelClientIDs,i=a.childUpdatePanelIDsNode.content,p=i.length?i.split(\",\"):[],m=this._splitNodeIntoArray(a.asyncPostBackControlIDsNode),o=this._splitNodeIntoArray(a.postBackControlIDsNode),q=this._splitNodeIntoArray(a.updatePanelIDsNode),g=this._splitNodeIntoArray(a.panelsToRefreshNode),h=a.version4;for(b=0,e=g.length;b<e;b+=h?2:1){var j=(h?g[b+1]:\"\")||this._uniqueIDToClientID(g[b]);if(!document.getElementById(j)){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,j)),c,a);return}}var f=this._processUpdatePanelArrays(q,m,o,h);f.oldUpdatePanelIDs=r;f.oldUpdatePanelClientIDs=n;f.childUpdatePanelIDs=p;f.panelsToRefreshIDs=g;a.updatePanelData=f}a.dataItems={};var d;for(b=0,e=a.dataItemNodes.length;b<e;b++){d=a.dataItemNodes[b];a.dataItems[d.id]=d.content}for(b=0,e=a.dataItemJsonNodes.length;b<e;b++){d=a.dataItemJsonNodes[b];a.dataItems[d.id]=Sys.Serialization.JavaScriptSerializer.deserialize(d.content)}var l=this._get_eventHandlerList().getHandler(\"pageLoading\");if(l)l(this,this._getPageLoadingEventArgs(a));Sys._ScriptLoader.readLoadedScripts();Sys.Application.beginCreateComponents();var k=Sys._ScriptLoader.getInstance();this._queueScripts(k,a.scriptBlockNodes,true,false);this._processingRequest=true;k.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadComplete,a)),Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadFailed,a)),null)},_onWindowUnload:function(){this.dispose()},_pageLoaded:function(a,c){var b=this._get_eventHandlerList().getHandler(\"pageLoaded\");if(b)b(this,this._getPageLoadedEventArgs(a,c));if(!a)Sys.Application.raiseLoad()},_pageLoadedInitialLoad:function(){this._pageLoaded(true,null)},_parseDelta:function(h){var c=h.get_responseData(),d,i,E,F,D,b=0,e=null,k=[];while(b<c.length){d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}i=parseInt(c.substring(b,d),10);if(i%1!==0){e=this._findText(c,b);break}b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}E=c.substring(b,d);b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}F=c.substring(b,d);b=d+1;if(b+i>=c.length){e=this._findText(c,c.length);break}D=c.substr(b,i);b+=i;if(c.charAt(b)!==\"|\"){e=this._findText(c,b);break}b++;Array.add(k,{type:E,id:F,content:D})}if(e){this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_ParserErrorDetails,e)),h,null);return null}var x=[],w=[],q=[],j=[],t=[],C=[],A=[],z=[],v=[],s=[],m,p,u,n,o,r,y,g;for(var l=0,G=k.length;l<G;l++){var a=k[l];switch(a.type){case \"#\":g=a;break;case \"updatePanel\":Array.add(x,a);break;case \"hiddenField\":Array.add(w,a);break;case \"arrayDeclaration\":Array.add(q,a);break;case \"scriptBlock\":Array.add(j,a);break;case \"fallbackScript\":j[j.length-1].fallback=a.id;case \"scriptStartupBlock\":Array.add(t,a);break;case \"expando\":Array.add(C,a);break;case \"onSubmit\":Array.add(A,a);break;case \"asyncPostBackControlIDs\":m=a;break;case \"postBackControlIDs\":p=a;break;case \"updatePanelIDs\":u=a;break;case \"asyncPostBackTimeout\":n=a;break;case \"childUpdatePanelIDs\":o=a;break;case \"panelsToRefreshIDs\":r=a;break;case \"formAction\":y=a;break;case \"dataItem\":Array.add(z,a);break;case \"dataItemJson\":Array.add(v,a);break;case \"scriptDispose\":Array.add(s,a);break;case \"pageRedirect\":if(g&&parseFloat(g.content)>=4)a.content=unescape(a.content);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var f=document.createElement(\"a\");f.style.display=\"none\";f.attachEvent(\"onclick\",B);f.href=a.content;this._form.parentNode.insertBefore(f,this._form);f.click();f.detachEvent(\"onclick\",B);this._form.parentNode.removeChild(f);function B(a){a.cancelBubble=true}}else window.location.href=a.content;return null;case \"error\":this._endPostBack(this._createPageRequestManagerServerError(Number.parseInvariant(a.id),a.content),h,null);return null;case \"pageTitle\":document.title=a.content;break;case \"focus\":this._controlIDToFocus=a.content;break;default:this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_UnknownToken,a.type)),h,null);return null}}return {version4:g?parseFloat(g.content)>=4:false,executor:h,updatePanelNodes:x,hiddenFieldNodes:w,arrayDeclarationNodes:q,scriptBlockNodes:j,scriptStartupNodes:t,expandoNodes:C,onSubmitNodes:A,dataItemNodes:z,dataItemJsonNodes:v,scriptDisposeNodes:s,asyncPostBackControlIDsNode:m,postBackControlIDsNode:p,updatePanelIDsNode:u,asyncPostBackTimeoutNode:n,childUpdatePanelIDsNode:o,panelsToRefreshNode:r,formActionNode:y}},_processUpdatePanelArrays:function(e,q,r,f){var d,c,b;if(e){var i=e.length,j=f?2:1;d=new Array(i/j);c=new Array(i/j);b=new Array(i/j);for(var g=0,h=0;g<i;g+=j,h++){var p,a=e[g],k=f?e[g+1]:\"\";p=a.charAt(0)===\"t\";a=a.substr(1);if(!k)k=this._uniqueIDToClientID(a);b[h]=p;d[h]=a;c[h]=k}}else{d=[];c=[];b=[]}var n=[],l=[];this._convertToClientIDs(q,n,l,f);var o=[],m=[];this._convertToClientIDs(r,o,m,f);return {updatePanelIDs:d,updatePanelClientIDs:c,updatePanelHasChildrenAsTriggers:b,asyncPostBackControlIDs:n,asyncPostBackControlClientIDs:l,postBackControlIDs:o,postBackControlClientIDs:m}},_queueScripts:function(scriptLoader,scriptBlockNodes,queueIncludes,queueBlocks){for(var i=0,l=scriptBlockNodes.length;i<l;i++){var scriptBlockType=scriptBlockNodes[i].id;switch(scriptBlockType){case \"ScriptContentNoTags\":if(!queueBlocks)continue;scriptLoader.queueScriptBlock(scriptBlockNodes[i].content);break;case \"ScriptContentWithTags\":var scriptTagAttributes;eval(\"scriptTagAttributes = \"+scriptBlockNodes[i].content);if(scriptTagAttributes.src){if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(scriptTagAttributes.src))continue}else if(!queueBlocks)continue;scriptLoader.queueCustomScriptTag(scriptTagAttributes);break;case \"ScriptPath\":var script=scriptBlockNodes[i];if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(script.content))continue;scriptLoader.queueScriptReference(script.content,script.fallback)}}},_registerDisposeScript:function(a,b){if(!this._scriptDisposes[a])this._scriptDisposes[a]=[b];else Array.add(this._scriptDisposes[a],b)},_scriptIncludesLoadComplete:function(e,b){if(b.executor.get_webRequest()!==this._request)return;this._commitControls(b.updatePanelData,b.asyncPostBackTimeoutNode?b.asyncPostBackTimeoutNode.content:null);if(b.formActionNode)this._form.action=b.formActionNode.content;var a,d,c;for(a=0,d=b.updatePanelNodes.length;a<d;a++){c=b.updatePanelNodes[a];var j=document.getElementById(c.id);if(!j){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,c.id)),b.executor,b);return}this._updatePanel(j,c.content)}for(a=0,d=b.scriptDisposeNodes.length;a<d;a++){c=b.scriptDisposeNodes[a];this._registerDisposeScript(c.id,c.content)}for(a=0,d=this._transientFields.length;a<d;a++){var g=document.getElementById(this._transientFields[a]);if(g){var k=g._isContained?g.parentNode:g;k.parentNode.removeChild(k)}}for(a=0,d=b.hiddenFieldNodes.length;a<d;a++){c=b.hiddenFieldNodes[a];this._createHiddenField(c.id,c.content)}if(b.scriptsFailed)throw Sys._ScriptLoader._errorScriptLoadFailed(b.scriptsFailed.src,b.scriptsFailed.multipleCallbacks);this._queueScripts(e,b.scriptBlockNodes,false,true);var i=\"\";for(a=0,d=b.arrayDeclarationNodes.length;a<d;a++){c=b.arrayDeclarationNodes[a];i+=\"Sys.WebForms.PageRequestManager._addArrayElement('\"+c.id+\"', \"+c.content+\");\\r\\n\"}var h=\"\";for(a=0,d=b.expandoNodes.length;a<d;a++){c=b.expandoNodes[a];h+=c.id+\" = \"+c.content+\"\\r\\n\"}if(i.length)e.queueScriptBlock(i);if(h.length)e.queueScriptBlock(h);this._queueScripts(e,b.scriptStartupNodes,true,true);var f=\"\";for(a=0,d=b.onSubmitNodes.length;a<d;a++){if(a===0)f=\"Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, function() {\\r\\n\";f+=b.onSubmitNodes[a].content+\"\\r\\n\"}if(f.length){f+=\"\\r\\nreturn true;\\r\\n});\\r\\n\";e.queueScriptBlock(f)}e.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptsLoadComplete,b)),null,null)},_scriptIncludesLoadFailed:function(d,c,b,a){a.scriptsFailed={src:c.src,multipleCallbacks:b};this._scriptIncludesLoadComplete(d,a)},_scriptsLoadComplete:function(f,c){var e=c.executor;if(window.__theFormPostData)window.__theFormPostData=\"\";if(window.__theFormPostCollection)window.__theFormPostCollection=[];if(window.WebForm_InitCallback)window.WebForm_InitCallback();if(this._scrollPosition){if(window.scrollTo)window.scrollTo(this._scrollPosition.x,this._scrollPosition.y);this._scrollPosition=null}Sys.Application.endCreateComponents();this._pageLoaded(false,c);this._endPostBack(null,e,c);if(this._controlIDToFocus){var a,d;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var b=$get(this._controlIDToFocus);a=b;if(b&&!WebForm_CanFocus(b))a=WebForm_FindFirstFocusableChild(b);if(a&&typeof a.contentEditable!==\"undefined\"){d=a.contentEditable;a.contentEditable=false}else a=null}WebForm_AutoFocus(this._controlIDToFocus);if(a)a.contentEditable=d;this._controlIDToFocus=null}},_splitNodeIntoArray:function(b){var a=b.content,c=a.length?a.split(\",\"):[];return c},_uniqueIDToClientID:function(a){return a.replace(/\\$/g,\"_\")},_updateControls:function(d,a,c,b,e){this._commitControls(this._processUpdatePanelArrays(d,a,c,e),b)},_updatePanel:function(updatePanelElement,rendering){for(var updatePanelID in this._scriptDisposes)if(this._elementContains(updatePanelElement,document.getElementById(updatePanelID))){var disposeScripts=this._scriptDisposes[updatePanelID];for(var i=0,l=disposeScripts.length;i<l;i++)eval(disposeScripts[i]);delete this._scriptDisposes[updatePanelID]}Sys.Application.disposeElement(updatePanelElement,true);updatePanelElement.innerHTML=rendering},_validPosition:function(a){return typeof a!==\"undefined\"&&a!==null&&a!==0}};Sys.WebForms.PageRequestManager.getInstance=function(){var a=Sys.WebForms.PageRequestManager._instance;if(!a)a=Sys.WebForms.PageRequestManager._instance=new Sys.WebForms.PageRequestManager;return a};Sys.WebForms.PageRequestManager._addArrayElement=function(a){if(!window[a])window[a]=[];for(var b=1,c=arguments.length;b<c;b++)Array.add(window[a],arguments[b])};Sys.WebForms.PageRequestManager._initialize=function(){var a=Sys.WebForms.PageRequestManager.getInstance();a._initializeInternal.apply(a,arguments)};Sys.WebForms.PageRequestManager.registerClass(\"Sys.WebForms.PageRequestManager\");Sys.UI._UpdateProgress=function(a){Sys.UI._UpdateProgress.initializeBase(this,[a]);this._displayAfter=500;this._dynamicLayout=true;this._associatedUpdatePanelId=null;this._beginRequestHandlerDelegate=null;this._startDelegate=null;this._endRequestHandlerDelegate=null;this._pageRequestManager=null;this._timerCookie=null};Sys.UI._UpdateProgress.prototype={get_displayAfter:function(){return this._displayAfter},set_displayAfter:function(a){this._displayAfter=a},get_dynamicLayout:function(){return this._dynamicLayout},set_dynamicLayout:function(a){this._dynamicLayout=a},get_associatedUpdatePanelId:function(){return this._associatedUpdatePanelId},set_associatedUpdatePanelId:function(a){this._associatedUpdatePanelId=a},get_role:function(){return \"status\"},_clearTimeout:function(){if(this._timerCookie){window.clearTimeout(this._timerCookie);this._timerCookie=null}},_getUniqueID:function(b){var a=Array.indexOf(this._pageRequestManager._updatePanelClientIDs,b);return a===-1?null:this._pageRequestManager._updatePanelIDs[a]},_handleBeginRequest:function(f,e){var b=e.get_postBackElement(),a=true,d=this._associatedUpdatePanelId;if(this._associatedUpdatePanelId){var c=e.get_updatePanelsToUpdate();if(c&&c.length)a=Array.contains(c,d)||Array.contains(c,this._getUniqueID(d));else a=false}while(!a&&b){if(b.id&&this._associatedUpdatePanelId===b.id)a=true;b=b.parentNode}if(a)this._timerCookie=window.setTimeout(this._startDelegate,this._displayAfter)},_startRequest:function(){if(this._pageRequestManager.get_isInAsyncPostBack()){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"block\";else a.style.visibility=\"visible\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"false\")}this._timerCookie=null},_handleEndRequest:function(){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"none\";else a.style.visibility=\"hidden\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"true\");this._clearTimeout()},dispose:function(){if(this._beginRequestHandlerDelegate!==null){this._pageRequestManager.remove_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);this._beginRequestHandlerDelegate=null;this._endRequestHandlerDelegate=null}this._clearTimeout();Sys.UI._UpdateProgress.callBaseMethod(this,\"dispose\")},initialize:function(){Sys.UI._UpdateProgress.callBaseMethod(this,\"initialize\");if(this.get_role()===\"status\")this.get_element().setAttribute(\"aria-hidden\",\"true\");this._beginRequestHandlerDelegate=Function.createDelegate(this,this._handleBeginRequest);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);this._startDelegate=Function.createDelegate(this,this._startRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null){this._pageRequestManager.add_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate)}}};Sys.UI._UpdateProgress.registerClass(\"Sys.UI._UpdateProgress\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebServices.js\nType._registerScript(\"MicrosoftAjaxWebServices.js\",[\"MicrosoftAjaxNetwork.js\"]);Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Menu.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/Menu.js\nvar __rootMenuItem;\nvar __menuInterval;\nvar __scrollPanel;\nvar __disappearAfter = 500;\nfunction Menu_ClearInterval() {\n    if (__menuInterval) {\n        window.clearInterval(__menuInterval);\n    }\n}\nfunction Menu_Collapse(item) {\n    Menu_SetRoot(item);\n    if (__rootMenuItem) {\n        Menu_ClearInterval();\n        if (__disappearAfter >= 0) {\n            __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n        }\n    }\n}\nfunction Menu_Expand(item, horizontalOffset, verticalOffset, hideScrollers) {\n    Menu_ClearInterval();\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    var horizontal = true;\n    if (!tr.id) {\n        horizontal = false;\n        tr = tr.parentNode;\n    }\n    var child = Menu_FindSubMenu(item);\n    if (child) {\n        var data = Menu_GetData(item);\n        if (!data) {\n            return null;\n        }\n        child.rel = tr.id;\n        child.x = horizontalOffset;\n        child.y = verticalOffset;\n        if (horizontal) child.pos = \"bottom\";\n        PopOut_Show(child.id, hideScrollers, data);\n    }\n    Menu_SetRoot(item);\n    if (child) {\n        if (!document.body.__oldOnClick && document.body.onclick) {\n            document.body.__oldOnClick = document.body.onclick;\n        }\n        if (__rootMenuItem) {\n            document.body.onclick = Menu_HideItems;\n        }\n    }\n    Menu_ResetSiblings(tr);\n    return child;\n}\nfunction Menu_FindMenu(item) {\n    if (item && item.menu) return item.menu;\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr = tr.parentNode;\n    }\n    for (var i = tr.id.length - 1; i >= 0; i--) {\n        if (tr.id.charAt(i) < '0' || tr.id.charAt(i) > '9') {\n            var menu = WebForm_GetElementById(tr.id.substr(0, i));\n            if (menu) {\n                item.menu = menu;\n                return menu;\n            }\n        }\n    }\n    return null;\n}\nfunction Menu_FindNext(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var first = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        var match = false;\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (Menu_FindParentContainer(link) == parent) {\n                    if (match) {\n                        return link;\n                    }\n                    else if (!first) {\n                        first = link;\n                    }\n                }\n                if (!match && link == a) {\n                    match = true;\n                }\n            }\n        }\n    }\n    return first;\n}\nfunction Menu_FindParentContainer(item) {\n    if (item.menu_ParentContainerCache) return item.menu_ParentContainerCache;\n    var a = (item.tagName.toLowerCase() == \"a\") ? item : WebForm_GetElementByTagName(item, \"A\");\n    var menu = Menu_FindMenu(a);\n    if (menu) {\n        var parent = item;\n        while (parent && parent.tagName &&\n            parent.id != menu.id &&\n            parent.tagName.toLowerCase() != \"div\") {\n            parent = parent.parentNode;\n        }\n        item.menu_ParentContainerCache = parent;\n        return parent;\n    }\n}\nfunction Menu_FindParentItem(item) {\n    var parentContainer = Menu_FindParentContainer(item);\n    var parentContainerID = parentContainer.id;\n    var len = parentContainerID.length;\n    if (parentContainerID && parentContainerID.substr(len - 5) == \"Items\") {\n        var parentItemID = parentContainerID.substr(0, len - 5);\n        return WebForm_GetElementById(parentItemID);\n    }\n    return null;\n}\nfunction Menu_FindPrevious(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var last = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (link == a && last) {\n                    return last;\n                }\n                if (Menu_FindParentContainer(link) == parent) {\n                    last = link;\n                }\n            }\n        }\n    }\n    return last;\n}\nfunction Menu_FindSubMenu(item) {\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr=tr.parentNode;\n    }\n    return WebForm_GetElementById(tr.id + \"Items\");\n}\nfunction Menu_Focus(item) {\n    if (item && item.focus) {\n        var pos = WebForm_GetElementPosition(item);\n        var parentContainer = Menu_FindParentContainer(item);\n        if (!parentContainer.offset) {\n            parentContainer.offset = 0;\n        }\n        var posParent = WebForm_GetElementPosition(parentContainer);\n        var delta;\n        if (pos.y + pos.height > posParent.y + parentContainer.offset + parentContainer.clippedHeight) {\n            delta = pos.y + pos.height - posParent.y - parentContainer.offset - parentContainer.clippedHeight;\n            PopOut_Scroll(parentContainer, delta);\n        }\n        else if (pos.y < posParent.y + parentContainer.offset) {\n            delta = posParent.y + parentContainer.offset - pos.y;\n            PopOut_Scroll(parentContainer, -delta);\n        }\n        PopOut_HideScrollers(parentContainer);\n        item.focus();\n    }\n}\nfunction Menu_GetData(item) {\n    if (!item.data) {\n        var a = (item.tagName.toLowerCase() == \"a\" ? item : WebForm_GetElementByTagName(item, \"a\"));\n        var menu = Menu_FindMenu(a);\n        try {\n            item.data = eval(menu.id + \"_Data\");\n        }\n        catch(e) {}\n    }\n    return item.data;\n}\nfunction Menu_HideItems(items) {\n    if (document.body.__oldOnClick) {\n        document.body.onclick = document.body.__oldOnClick;\n        document.body.__oldOnClick = null;\n    }\n    Menu_ClearInterval();\n    if (!items || ((typeof(items.tagName) == \"undefined\") && (items instanceof Event))) {\n        items = __rootMenuItem;\n    }\n    var table = items;\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        table = WebForm_GetElementByTagName(table, \"TABLE\");\n    }\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        return;\n    }\n    var rows = table.rows ? table.rows : table.firstChild.rows;\n    var isVertical = false;\n    for (var r = 0; r < rows.length; r++) {\n        if (rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, nextLevel;\n    if (isVertical) {\n        for(i = 0; i < rows.length; i++) {\n            if (rows[i].id) {\n                child = WebForm_GetElementById(rows[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else if (rows[i].cells[0]) {\n                nextLevel = WebForm_GetElementByTagName(rows[i].cells[0], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(nextLevel);\n                }\n            }\n        }\n    }\n    else if (rows[0]) {\n        for(i = 0; i < rows[0].cells.length; i++) {\n            if (rows[0].cells[i].id) {\n                child = WebForm_GetElementById(rows[0].cells[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else {\n                nextLevel = WebForm_GetElementByTagName(rows[0].cells[i], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(rows[0].cells[i].firstChild);\n                }\n            }\n        }\n    }\n    if (items && items.id) {\n        PopOut_Hide(items.id);\n    }\n}\nfunction Menu_HoverDisabled(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    node = WebForm_GetElementByTagName(node, \"table\").rows[0].cells[0].childNodes[0];\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverDynamic(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.hoverClass) {\n        nodeTable.hoverClass = data.hoverClass;\n        WebForm_AppendToClassName(nodeTable, data.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.hoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n    }\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverRoot(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) {\n        return null;\n    }\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.staticHoverClass) {\n        nodeTable.hoverClass = data.staticHoverClass;\n        WebForm_AppendToClassName(nodeTable, data.staticHoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.staticHoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.staticHoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.staticHoverHyperLinkClass);\n    }\n    return node;\n}\nfunction Menu_HoverStatic(item) {\n    var node = Menu_HoverRoot(item);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    __disappearAfter = data.disappearAfter;\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_IsHorizontal(item) {\n    if (item) {\n        var a = ((item.tagName && (item.tagName.toLowerCase == \"a\")) ? item : WebForm_GetElementByTagName(item, \"A\"));\n        if (!a) {\n            return false;\n        }\n        var td = a.parentNode.parentNode.parentNode.parentNode.parentNode;\n        if (td.id) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction Menu_IsSelectable(link) {\n    return (link && link.href)\n}\nfunction Menu_Key(item) {\n    var event;\n    if (item.currentTarget) {\n        event = item;\n        item = event.currentTarget;\n    }\n    else {\n        event = window.event;        \n    }\n    var key = (event ? event.keyCode : -1);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var horizontal = Menu_IsHorizontal(item);\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var nextItem, parentItem, previousItem;\n    if ((!horizontal && key == 38) || (horizontal && key == 37)) {\n        previousItem = Menu_FindPrevious(item);\n        while (previousItem && previousItem.disabled) {\n            previousItem = Menu_FindPrevious(previousItem);\n        }\n        if (previousItem) {\n            Menu_Focus(previousItem);\n            Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 40) || (horizontal && key == 39)) {\n        if (horizontal) {\n            var subMenu = Menu_FindSubMenu(a);\n            if (subMenu && subMenu.style && subMenu.style.visibility && \n                subMenu.style.visibility.toLowerCase() == \"hidden\") {\n                Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        nextItem = Menu_FindNext(item);\n        while (nextItem && nextItem.disabled) {\n            nextItem = Menu_FindNext(nextItem);\n        }\n        if (nextItem) {\n            Menu_Focus(nextItem);\n            Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 39) || (horizontal && key == 40)) {\n        var children = Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n        if (children) {\n            var firstChild;\n            children = WebForm_GetElementsByTagName(children, \"A\");\n            for (var i = 0; i < children.length; i++) {\n                if (!children[i].disabled && Menu_IsSelectable(children[i])) {\n                    firstChild = children[i];\n                    break;\n                }\n            }\n            if (firstChild) {\n                Menu_Focus(firstChild);\n                Menu_Expand(firstChild, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        else {\n            parentItem = Menu_FindParentItem(item);\n            while (parentItem && !Menu_IsHorizontal(parentItem)) {\n                parentItem = Menu_FindParentItem(parentItem);\n            }\n            if (parentItem) {\n                nextItem = Menu_FindNext(parentItem);\n                while (nextItem && nextItem.disabled) {\n                    nextItem = Menu_FindNext(nextItem);\n                }\n                if (nextItem) {\n                    Menu_Focus(nextItem);\n                    Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n        }\n    }\n    if ((!horizontal && key == 37) || (horizontal && key == 38)) {\n        parentItem = Menu_FindParentItem(item);\n        if (parentItem) {\n            if (Menu_IsHorizontal(parentItem)) {\n                previousItem = Menu_FindPrevious(parentItem);\n                while (previousItem && previousItem.disabled) {\n                    previousItem = Menu_FindPrevious(previousItem);\n                }\n                if (previousItem) {\n                    Menu_Focus(previousItem);\n                    Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n            var parentA = WebForm_GetElementByTagName(parentItem, \"A\");\n            if (parentA) {\n                Menu_Focus(parentA);\n            }\n            Menu_ResetSiblings(parentItem);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if (key == 27) {\n        Menu_HideItems();\n        event.cancelBubble = true;\n        if (event.stopPropagation) event.stopPropagation();\n        return;\n    }\n}\nfunction Menu_ResetSiblings(item) {\n    var table = (item.tagName.toLowerCase() == \"td\") ?\n        item.parentNode.parentNode.parentNode :\n        item.parentNode.parentNode;\n    var isVertical = false;\n    for (var r = 0; r < table.rows.length; r++) {\n        if (table.rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, childNode;\n    if (isVertical) {\n        for(i = 0; i < table.rows.length; i++) {\n            childNode = table.rows[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    else {\n        for(i = 0; i < table.rows[0].cells.length; i++) {\n            childNode = table.rows[0].cells[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    Menu_ResetTopMenus(table, table, 0, true);\n}\nfunction Menu_ResetTopMenus(table, doNotReset, level, up) {\n    var i, child, childNode;\n    if (up && table.id == \"\") {\n        var parentTable = table.parentNode.parentNode.parentNode.parentNode;\n        if (parentTable.tagName.toLowerCase() == \"table\") {\n            Menu_ResetTopMenus(parentTable, doNotReset, level + 1, true);\n        }\n    }\n    else {\n        if (level == 0 && table != doNotReset) {\n            if (table.rows[0].id) {\n                for(i = 0; i < table.rows.length; i++) {\n                    childNode = table.rows[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n            else {\n                for(i = 0; i < table.rows[0].cells.length; i++) {\n                    childNode = table.rows[0].cells[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n        }\n        else if (level > 0) {\n            for (i = 0; i < table.rows.length; i++) {\n                for (var j = 0; j < table.rows[i].cells.length; j++) {\n                    var subTable = table.rows[i].cells[j].firstChild;\n                    if (subTable && subTable.tagName.toLowerCase() == \"table\") {\n                        Menu_ResetTopMenus(subTable, doNotReset, level - 1, false);\n                    }\n                }\n            }\n        }\n    }\n}\nfunction Menu_RestoreInterval() {\n    if (__menuInterval && __rootMenuItem) {\n        Menu_ClearInterval();\n        __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n    }\n}\nfunction Menu_SetRoot(item) {\n    var newRoot = Menu_FindMenu(item);\n    if (newRoot) {\n        if (__rootMenuItem && __rootMenuItem != newRoot) {\n            Menu_HideItems();\n        }\n        __rootMenuItem = newRoot;\n    }\n}\nfunction Menu_Unhover(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (nodeTable.hoverClass) {\n        WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (node.hoverHyperLinkClass) {\n        WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n    }\n    Menu_Collapse(node);\n}\nfunction PopOut_Clip(element, y, height) {\n    if (element && element.style) {\n        element.style.clip = \"rect(\" + y + \"px auto \" + (y + height) + \"px auto)\";\n        element.style.overflow = \"hidden\";\n    }\n}\nfunction PopOut_Down(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && ((panel.offset + panel.clippedHeight) < panel.physicalHeight)) {\n        PopOut_Scroll(panel, 2)\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Down()\", 8);\n    }\n    else {\n        PopOut_ShowScrollers(panel);\n    }\n}\nfunction PopOut_Hide(panelId) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"hidden\";\n        panel.style.display = \"none\";\n        panel.offset = 0;\n        panel.scrollTop = 0;\n        var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n        if (table) {\n            WebForm_SetElementY(table, 0);\n        }\n        if (window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" &&\n            !window.opera) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            if (childFrame) {\n                childFrame.style.display = \"none\";\n            }\n        }\n    }\n}\nfunction PopOut_HideScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        if (up) {\n            up.style.visibility = \"hidden\";\n            up.style.display = \"none\";\n        }\n        if (dn) {\n            dn.style.visibility = \"hidden\";\n            dn.style.display = \"none\";\n        }\n    }\n}\nfunction PopOut_Position(panel, hideScrollers) {\n    if (window.opera) {\n        panel.parentNode.removeChild(panel);\n        document.forms[0].appendChild(panel);\n    }\n    var rel = WebForm_GetElementById(panel.rel);\n    var relTable = WebForm_GetElementByTagName(rel, \"TABLE\");\n    var relCoordinates = WebForm_GetElementPosition(relTable ? relTable : rel);\n    var panelCoordinates = WebForm_GetElementPosition(panel);\n    var panelHeight = ((typeof(panel.physicalHeight) != \"undefined\") && (panel.physicalHeight != null)) ?\n        panel.physicalHeight :\n        panelCoordinates.height;\n    panel.physicalHeight = panelHeight;\n    var panelParentCoordinates;\n    if (panel.offsetParent) {\n        panelParentCoordinates = WebForm_GetElementPosition(panel.offsetParent);\n    }\n    else {\n        panelParentCoordinates = new Object();\n        panelParentCoordinates.x = 0;\n        panelParentCoordinates.y = 0;\n    }\n    var overflowElement = WebForm_GetElementById(\"__overFlowElement\");\n    if (!overflowElement) {\n        overflowElement = document.createElement(\"img\");\n        overflowElement.id=\"__overFlowElement\";\n        WebForm_SetElementWidth(overflowElement, 1);\n        document.body.appendChild(overflowElement);\n    }\n    WebForm_SetElementHeight(overflowElement, panelHeight + relCoordinates.y + parseInt(panel.y ? panel.y : 0));\n    overflowElement.style.visibility = \"visible\";\n    overflowElement.style.display = \"inline\";\n    var clientHeight = 0;\n    var clientWidth = 0;\n    if (window.innerHeight) {\n        clientHeight = window.innerHeight;\n        clientWidth = window.innerWidth;\n    }\n    else if (document.documentElement && document.documentElement.clientHeight) {\n        clientHeight = document.documentElement.clientHeight;\n        clientWidth = document.documentElement.clientWidth;\n    }\n    else if (document.body && document.body.clientHeight) {\n        clientHeight = document.body.clientHeight;\n        clientWidth = document.body.clientWidth;\n    }\n    var scrollTop = 0;\n    var scrollLeft = 0;\n    if (typeof(window.pageYOffset) != \"undefined\") {\n        scrollTop = window.pageYOffset;\n        scrollLeft = window.pageXOffset;\n    }\n    else if (document.documentElement && (typeof(document.documentElement.scrollTop) != \"undefined\")) {\n        scrollTop = document.documentElement.scrollTop;\n        scrollLeft = document.documentElement.scrollLeft;\n    }\n    else if (document.body && (typeof(document.body.scrollTop) != \"undefined\")) {\n        scrollTop = document.body.scrollTop;\n        scrollLeft = document.body.scrollLeft;\n    }\n    overflowElement.style.visibility = \"hidden\";\n    overflowElement.style.display = \"none\";\n    var bottomWindowBorder = clientHeight + scrollTop;\n    var rightWindowBorder = clientWidth + scrollLeft;\n    var position = panel.pos;\n    if ((typeof(position) == \"undefined\") || (position == null) || (position == \"\")) {\n        position = (WebForm_GetElementDir(rel) == \"rtl\" ? \"middleleft\" : \"middleright\");\n    }\n    position = position.toLowerCase();\n    var y = relCoordinates.y + parseInt(panel.y ? panel.y : 0) - panelParentCoordinates.y;\n    var borderParent = (rel && rel.parentNode && rel.parentNode.parentNode && rel.parentNode.parentNode.parentNode\n        && rel.parentNode.parentNode.parentNode.tagName.toLowerCase() == \"div\") ?\n        rel.parentNode.parentNode.parentNode : null;\n    WebForm_SetElementY(panel, y);\n    PopOut_SetPanelHeight(panel, panelHeight, true);\n    var clip = false;\n    var overflow;\n    if (position.indexOf(\"top\") != -1) {\n        y -= panelHeight;\n        WebForm_SetElementY(panel, y); \n        if (y < -panelParentCoordinates.y) {\n            y = -panelParentCoordinates.y;\n            WebForm_SetElementY(panel, y); \n            if (panelHeight > clientHeight - 2) {\n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    else {\n        if (position.indexOf(\"bottom\") != -1) {\n            y += relCoordinates.height;\n            WebForm_SetElementY(panel, y); \n        }\n        overflow = y + panelParentCoordinates.y + panelHeight - bottomWindowBorder;\n        if (overflow > 0) {\n            y -= overflow;\n            WebForm_SetElementY(panel, y); \n            if (y < -panelParentCoordinates.y) {\n                y = 2 - panelParentCoordinates.y + scrollTop;\n                WebForm_SetElementY(panel, y); \n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    if (!clip) {\n        PopOut_SetPanelHeight(panel, panel.clippedHeight, true);\n    }\n    var panelParentOffsetY = 0;\n    if (panel.offsetParent) {\n        panelParentOffsetY = WebForm_GetElementPosition(panel.offsetParent).y;\n    }\n    var panelY = ((typeof(panel.originY) != \"undefined\") && (panel.originY != null)) ?\n        panel.originY :\n        y - panelParentOffsetY;\n    panel.originY = panelY;\n    if (!hideScrollers) {\n        PopOut_ShowScrollers(panel);\n    }\n    else {\n        PopOut_HideScrollers(panel);\n    }\n    var x = relCoordinates.x + parseInt(panel.x ? panel.x : 0) - panelParentCoordinates.x;\n    if (borderParent && borderParent.clientLeft) {\n        x += 2 * borderParent.clientLeft;\n    }\n    WebForm_SetElementX(panel, x);\n    if (position.indexOf(\"left\") != -1) {\n        x -= panelCoordinates.width;\n        WebForm_SetElementX(panel, x);\n        if (x < -panelParentCoordinates.x) {\n            WebForm_SetElementX(panel, -panelParentCoordinates.x);\n        }\n    }\n    else {\n        if (position.indexOf(\"right\") != -1) {\n            x += relCoordinates.width;\n            WebForm_SetElementX(panel, x);\n        }\n        overflow = x + panelParentCoordinates.x + panelCoordinates.width - rightWindowBorder;\n        if (overflow > 0) {\n            if (position.indexOf(\"bottom\") == -1 && relCoordinates.x > panelCoordinates.width) {\n                x -= relCoordinates.width + panelCoordinates.width;\n            }\n            else {\n                x -= overflow;\n            }\n            WebForm_SetElementX(panel, x);\n            if (x < -panelParentCoordinates.x) {\n                WebForm_SetElementX(panel, -panelParentCoordinates.x);\n            }\n        }\n    }\n}\nfunction PopOut_Scroll(panel, offsetDelta) {\n    var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n    if (!table) return;\n    table.style.position = \"relative\";\n    var tableY = (table.style.top ? parseInt(table.style.top) : 0);\n    panel.offset += offsetDelta;\n    WebForm_SetElementY(table, tableY - offsetDelta);\n}\nfunction PopOut_SetPanelHeight(element, height, doNotClip) {\n    if (element && element.style) {\n        var size = WebForm_GetElementPosition(element);\n        element.physicalWidth = size.width;\n        element.clippedHeight = height;\n        WebForm_SetElementHeight(element, height - (element.clientTop ? (2 * element.clientTop) : 0));\n        if (doNotClip && element.style) {\n            element.style.clip = \"rect(auto auto auto auto)\";\n        }\n        else {\n            PopOut_Clip(element, 0, height);\n        }\n    }\n}\nfunction PopOut_Show(panelId, hideScrollers, data) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"visible\";\n        panel.style.display = \"inline\";\n        if (!panel.offset || hideScrollers) {\n            panel.scrollTop = 0;\n            panel.offset = 0;\n            var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n            if (table) {\n                WebForm_SetElementY(table, 0);\n            }\n        }\n        PopOut_Position(panel, hideScrollers);\n        var z = 1;\n        var isIE = window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" && !window.opera;\n        if (isIE && data) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            var parent = panel.offsetParent;\n            if (!childFrame) {\n                childFrame = document.createElement(\"iframe\");\n                childFrame.id = childFrameId;\n                childFrame.src = (data.iframeUrl ? data.iframeUrl : \"about:blank\");\n                childFrame.style.position = \"absolute\";\n                childFrame.style.display = \"none\";\n                childFrame.scrolling = \"no\";\n                childFrame.frameBorder = \"0\";\n                if (parent.tagName.toLowerCase() == \"html\") {\n                    document.body.appendChild(childFrame);\n                }\n                else {\n                    parent.appendChild(childFrame);\n                }\n            }\n            var pos = WebForm_GetElementPosition(panel);\n            var parentPos = WebForm_GetElementPosition(parent);\n            WebForm_SetElementX(childFrame, pos.x - parentPos.x);\n            WebForm_SetElementY(childFrame, pos.y - parentPos.y);\n            WebForm_SetElementWidth(childFrame, pos.width);\n            WebForm_SetElementHeight(childFrame, pos.height);\n            childFrame.style.display = \"block\";\n            if (panel.currentStyle && panel.currentStyle.zIndex && panel.currentStyle.zIndex != \"auto\") {\n                z = panel.currentStyle.zIndex;\n            }\n            else if (panel.style.zIndex) {\n                z = panel.style.zIndex;\n            }\n        }\n        panel.style.zIndex = z;\n    }\n}\nfunction PopOut_ShowScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        var cnt = 0;\n        if (up && dn) {\n            if (panel.offset && panel.offset > 0) {\n                up.style.visibility = \"visible\";\n                up.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(up, panel.clientWidth\n                        - (up.clientLeft ? (2 * up.clientLeft) : 0));\n                }\n                WebForm_SetElementY(up, 0);\n            }\n            else {\n                up.style.visibility = \"hidden\";\n                up.style.display = \"none\";\n            }\n            if (panel.offset + panel.clippedHeight + 2 <= panel.physicalHeight) {\n                dn.style.visibility = \"visible\";\n                dn.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(dn, panel.clientWidth\n                        - (dn.clientLeft ? (2 * dn.clientLeft) : 0));\n                }\n                WebForm_SetElementY(dn, panel.clippedHeight - WebForm_GetElementPosition(dn).height\n                    - (panel.clientTop ? (2 * panel.clientTop) : 0));\n            }\n            else {\n                dn.style.visibility = \"hidden\";\n                dn.style.display = \"none\";\n            }\n            if (cnt == 0) {\n                panel.style.clip = \"rect(auto auto auto auto)\";\n            }\n        }\n    }\n}\nfunction PopOut_Stop() {\n    if (__scrollPanel && __scrollPanel.interval) {\n        window.clearInterval(__scrollPanel.interval);\n    }\n    Menu_RestoreInterval();\n}\nfunction PopOut_Up(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && panel.offset && panel.offset > 0) {\n        PopOut_Scroll(panel, -2);\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Up()\", 8);\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MenuStandards.js",
    "content": "﻿//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MenuStandards.js\nif (!window.Sys) { window.Sys = {}; }\nif (!Sys.WebForms) { Sys.WebForms = {}; }\nSys.WebForms.Menu = function(options) {\n    this.items = [];\n    this.depth = options.depth || 1;\n    this.parentMenuItem = options.parentMenuItem;\n    this.element = Sys.WebForms.Menu._domHelper.getElement(options.element);\n    if (this.element.tagName === 'DIV') {\n        var containerElement = this.element;\n        this.element = Sys.WebForms.Menu._domHelper.firstChild(containerElement);\n        this.element.tabIndex = options.tabIndex || 0;\n        options.element = containerElement;\n        options.menu = this;\n        this.container = new Sys.WebForms._MenuContainer(options);\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    else {\n        this.container = options.container;\n        this.keyMap = options.keyMap;\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    if (this.parentMenuItem && this.parentMenuItem.parentMenu) {\n        this.parentMenu = this.parentMenuItem.parentMenu;\n        this.rootMenu = this.parentMenu.rootMenu;\n        if (!this.element.id) {\n            this.element.id = (this.container.element.id || 'menu') + ':submenu:' + Sys.WebForms.Menu._elementObjectMapper._computedId;\n        }\n        if (this.depth > this.container.staticDisplayLevels) {\n            this.displayMode = \"dynamic\";\n            this.element.style.display = \"none\";\n            this.element.style.position = \"absolute\";\n            if (this.rootMenu && this.container.orientation === 'horizontal' && this.parentMenu.isStatic()) {\n                this.element.style.top = \"100%\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"0px\";\n                }\n                else {\n                    this.element.style.left = \"0px\";\n                }\n            }\n            else {\n                this.element.style.top = \"0px\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"100%\";\n                }\n                else {\n                    this.element.style.left = \"100%\";\n                }\n            }\n            if (this.container.rightToLeft) {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n            }\n            else {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n            }\n        }\n        else {\n            this.displayMode = \"static\";\n            this.element.style.display = \"block\";\n            if (this.container.orientation === 'horizontal') {\n                Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n            }\n        }\n    }\n    Sys.WebForms.Menu._domHelper.appendCssClass(this.element, this.displayMode);\n    var children = this.element.childNodes;\n    var count = children.length;\n    for (var i = 0; i < count; i++) {\n        var node = children[i];\n        if (node.nodeType !== 1) {   \n            continue;\n        }\n        var topLevelMenuItem = null;\n        if (this.parentMenuItem) {\n            topLevelMenuItem = this.parentMenuItem.topLevelMenuItem;\n        }\n        var menuItem = new Sys.WebForms.MenuItem(this, node, topLevelMenuItem);\n        var previousMenuItem = this.items[this.items.length - 1];\n        if (previousMenuItem) {\n            menuItem.previousSibling = previousMenuItem;\n            previousMenuItem.nextSibling = menuItem;\n        }\n        this.items[this.items.length] = menuItem;\n    }\n};\nSys.WebForms.Menu.prototype = {\n    blur: function() { if (this.container) this.container.blur(); },\n    collapse: function() {\n        this.each(function(menuItem) {\n            menuItem.hover(false);\n            menuItem.blur();\n            var childMenu = menuItem.childMenu;\n            if (childMenu) {\n                childMenu.collapse();\n            }\n        });\n        this.hide();\n    },\n    doDispose: function() { this.each(function(item) { item.doDispose(); }); },\n    each: function(fn) {\n        var count = this.items.length;\n        for (var i = 0; i < count; i++) {\n            fn(this.items[i]);\n        }\n    },\n    firstChild: function() { return this.items[0]; },\n    focus: function() { if (this.container) this.container.focus(); },\n    get_displayed: function() { return this.element.style.display !== 'none'; },\n    get_focused: function() {\n        if (this.container) {\n            return this.container.focused;\n        }\n        return false;\n    },\n    handleKeyPress: function(keyCode) {\n        if (this.keyMap.contains(keyCode)) {\n            if (this.container.focusedMenuItem) {\n                this.container.focusedMenuItem.navigate(keyCode);\n                return;\n            }\n            var firstChild = this.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n    },\n    hide: function() {\n        if (!this.get_displayed()) {\n            return;\n        }\n        this.each(function(item) {\n            if (item.childMenu) {\n                item.childMenu.hide();\n            }\n        });\n        if (!this.isRoot()) {\n            if (this.get_focused()) {\n                this.container.navigateTo(this.parentMenuItem);\n            }\n            this.element.style.display = 'none';\n        }\n    },\n    isRoot: function() { return this.rootMenu === this; },\n    isStatic: function() { return this.displayMode === 'static'; },\n    lastChild: function() { return this.items[this.items.length - 1]; },\n    show: function() { this.element.style.display = 'block'; }\n};\nif (Sys.WebForms.Menu.registerClass) {\n    Sys.WebForms.Menu.registerClass('Sys.WebForms.Menu');\n}\nSys.WebForms.MenuItem = function(parentMenu, listElement, topLevelMenuItem) {\n    this.keyMap = parentMenu.keyMap;\n    this.parentMenu = parentMenu;\n    this.container = parentMenu.container;\n    this.element = listElement;\n    this.topLevelMenuItem = topLevelMenuItem || this;\n    this._anchor = Sys.WebForms.Menu._domHelper.firstChild(listElement);\n    while (this._anchor && this._anchor.tagName !== 'A') {\n        this._anchor = Sys.WebForms.Menu._domHelper.nextSibling(this._anchor);\n    }\n    if (this._anchor) {\n        this._anchor.tabIndex = -1;\n        var subMenu = this._anchor;\n        while (subMenu && subMenu.tagName !== 'UL') {\n            subMenu = Sys.WebForms.Menu._domHelper.nextSibling(subMenu);\n        }\n        if (subMenu) {\n            this.childMenu = new Sys.WebForms.Menu({ element: subMenu, parentMenuItem: this, depth: parentMenu.depth + 1, container: this.container, keyMap: this.keyMap });\n            if (!this.childMenu.isStatic()) {\n                Sys.WebForms.Menu._domHelper.appendCssClass(this.element, 'has-popup');\n                Sys.WebForms.Menu._domHelper.appendAttributeValue(this.element, 'aria-haspopup', this.childMenu.element.id);\n            }\n        }\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(listElement, this);\n    Sys.WebForms.Menu._domHelper.appendAttributeValue(listElement, 'role', 'menuitem');\n    Sys.WebForms.Menu._domHelper.appendCssClass(listElement, parentMenu.displayMode);\n    if (this._anchor) {\n        Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, parentMenu.displayMode);\n    }\n    this.element.style.position = \"relative\";\n    if (this.parentMenu.depth == 1 && this.container.orientation == 'horizontal') {\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    if (!this.container.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n    }\n};\nSys.WebForms.MenuItem.prototype = {\n    applyUp: function(fn, condition) {\n        condition = condition || function(menuItem) { return menuItem; };\n        var menuItem = this;\n        var lastMenuItem = null;\n        while (condition(menuItem)) {\n            fn(menuItem);\n            lastMenuItem = menuItem;\n            menuItem = menuItem.parentMenu.parentMenuItem;\n        }\n        return lastMenuItem;\n    },\n    blur: function() { this.setTabIndex(-1); },\n    doDispose: function() {\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n        if (this.childMenu) {\n            this.childMenu.doDispose();\n        }\n    },\n    focus: function() {\n        if (!this.parentMenu.get_displayed()) {\n            this.parentMenu.show();\n        }\n        this.setTabIndex(0);\n        this.container.focused = true;\n        this._anchor.focus();\n    },\n    get_highlighted: function() { return /(^|\\s)highlighted(\\s|$)/.test(this._anchor.className); },\n    getTabIndex: function() { return this._anchor.tabIndex; },\n    highlight: function(highlighting) {\n        if (highlighting) {\n            this.applyUp(function(menuItem) {\n                menuItem.parentMenu.parentMenuItem.highlight(true);\n            },\n            function(menuItem) {\n                return !menuItem.parentMenu.isStatic() && menuItem.parentMenu.parentMenuItem;\n            }\n        );\n            Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, 'highlighted');\n        }\n        else {\n            Sys.WebForms.Menu._domHelper.removeCssClass(this._anchor, 'highlighted');\n            this.setTabIndex(-1);\n        }\n    },\n    hover: function(hovering) {\n        if (hovering) {\n            var currentHoveredItem = this.container.hoveredMenuItem;\n            if (currentHoveredItem) {\n                currentHoveredItem.hover(false);\n            }\n            var currentFocusedItem = this.container.focusedMenuItem;\n            if (currentFocusedItem && currentFocusedItem !== this) {\n                currentFocusedItem.hover(false);\n            }\n            this.applyUp(function(menuItem) {\n                if (menuItem.childMenu && !menuItem.childMenu.get_displayed()) {\n                    menuItem.childMenu.show();\n                }\n            });\n            this.container.hoveredMenuItem = this;\n            this.highlight(true);\n        }\n        else {\n            var menuItem = this;\n            while (menuItem) {\n                menuItem.highlight(false);\n                if (menuItem.childMenu) {\n                    if (!menuItem.childMenu.isStatic()) {\n                        menuItem.childMenu.hide();\n                    }\n                }\n                menuItem = menuItem.parentMenu.parentMenuItem;\n            }\n        }\n    },\n    isSiblingOf: function(menuItem) { return menuItem.parentMenu === this.parentMenu; },\n    mouseout: function() {\n        var menuItem = this,\n            id = this.container.pendingMouseoutId,\n            disappearAfter = this.container.disappearAfter;\n        if (id) {\n            window.clearTimeout(id);\n        }\n        if (disappearAfter > -1) {\n            this.container.pendingMouseoutId =\n                window.setTimeout(function() { menuItem.hover(false); }, disappearAfter);\n        }\n    },\n    mouseover: function() {\n        var id = this.container.pendingMouseoutId;\n        if (id) {\n            window.clearTimeout(id);\n            this.container.pendingMouseoutId = null;\n        }\n        this.hover(true);\n        if (this.container.menu.get_focused()) {\n            this.container.navigateTo(this);\n        }\n    },\n    navigate: function(keyCode) {\n        switch (this.keyMap[keyCode]) {\n            case this.keyMap.next:\n                this.navigateNext();\n                break;\n            case this.keyMap.previous:\n                this.navigatePrevious();\n                break;\n            case this.keyMap.child:\n                this.navigateChild();\n                break;\n            case this.keyMap.parent:\n                this.navigateParent();\n                break;\n            case this.keyMap.tab:\n                this.navigateOut();\n                break;\n        }\n    },\n    navigateChild: function() {\n        var subMenu = this.childMenu;\n        if (subMenu) {\n            var firstChild = subMenu.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n        else {\n            if (this.container.orientation === 'horizontal') {\n                var nextItem = this.topLevelMenuItem.nextSibling || this.topLevelMenuItem.parentMenu.firstChild();\n                if (nextItem == this.topLevelMenuItem) {\n                    return;\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(nextItem);\n                if (nextItem.childMenu) {\n                    this.container.navigateTo(nextItem.childMenu.firstChild());\n                }\n            }\n        }\n    },\n    navigateNext: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var nextMenuItem = this.nextSibling;\n        if (!nextMenuItem && this.parentMenu.isRoot()) {\n            nextMenuItem = this.parentMenu.parentMenuItem;\n            if (nextMenuItem) {\n                nextMenuItem = nextMenuItem.nextSibling;\n            }\n        }\n        if (!nextMenuItem) {\n            nextMenuItem = this.parentMenu.firstChild();\n        }\n        if (nextMenuItem) {\n            this.container.navigateTo(nextMenuItem);\n        }\n    },\n    navigateOut: function() {\n        this.parentMenu.blur();\n    },\n    navigateParent: function() {\n        var parentMenu = this.parentMenu,\n            horizontal = this.container.orientation === 'horizontal';\n        if (!parentMenu) return;\n        if (horizontal && this.childMenu && parentMenu.isRoot()) {\n            this.navigateChild();\n            return;\n        }\n        if (parentMenu.parentMenuItem && !parentMenu.isRoot()) {\n            if (horizontal && this.parentMenu.depth === 2) {\n                var previousItem = this.parentMenu.parentMenuItem.previousSibling;\n                if (!previousItem) {\n                    previousItem = this.parentMenu.rootMenu.lastChild();\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(previousItem);\n                if (previousItem.childMenu) {\n                    this.container.navigateTo(previousItem.childMenu.firstChild());\n                }\n            }\n            else {\n                this.parentMenu.hide();\n            }\n        }\n    },\n    navigatePrevious: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var previousMenuItem = this.previousSibling;\n        if (previousMenuItem) {\n            var childMenu = previousMenuItem.childMenu;\n            if (childMenu && childMenu.isRoot()) {\n                previousMenuItem = childMenu.lastChild();\n            }\n        }\n        if (!previousMenuItem && this.parentMenu.isRoot()) {\n            previousMenuItem = this.parentMenu.parentMenuItem;\n        }\n        if (!previousMenuItem) {\n            previousMenuItem = this.parentMenu.lastChild();\n        }\n        if (previousMenuItem) {\n            this.container.navigateTo(previousMenuItem);\n        }\n    },\n    setTabIndex: function(index) { if (this._anchor) this._anchor.tabIndex = index; }\n};\nSys.WebForms.MenuItem._onmouseout = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseout();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.MenuItem._onmouseover = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseover();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.Menu._domHelper = {\n    addEvent: function(element, eventName, fn, useCapture) {\n        if (element.addEventListener) {\n            element.addEventListener(eventName, fn, !!useCapture);\n        }\n        else {\n            element['on' + eventName] = fn;\n        }\n    },\n    appendAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('append', element, name, value);\n    },\n    appendCssClass: function(element, value) {\n        this.updateClassName('append', element, name, value);\n    },\n    appendString: function(getString, setString, value) {\n        var currentValue = getString();\n        if (!currentValue) {\n            setString(value);\n            return;\n        }\n        var regex = this._regexes.getRegex('(^| )' + value + '($| )');\n        if (regex.test(currentValue)) {\n            return;\n        }\n        setString(currentValue + ' ' + value);\n    },\n    cancelEvent: function(e) {\n        var event = e || window.event;\n        if (event) {\n            event.cancelBubble = true;\n            if (event.stopPropagation) {\n                event.stopPropagation();\n            }\n        }\n    },\n    contains: function(ancestor, descendant) {\n        for (; descendant && (descendant !== ancestor); descendant = descendant.parentNode) { }\n        return !!descendant;\n    },\n    firstChild: function(element) {\n        var child = element.firstChild;\n        if (child && child.nodeType !== 1) {   \n            child = this.nextSibling(child);\n        }\n        return child;\n    },\n    getElement: function(elementOrId) { return typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId; },\n    getElementDirection: function(element) {\n        if (element) {\n            if (element.dir) {\n                return element.dir;\n            }\n            return this.getElementDirection(element.parentNode);\n        }\n        return \"ltr\";\n    },\n    getKeyCode: function(event) { return event.keyCode || event.charCode || 0; },\n    insertAfter: function(element, elementToInsert) {\n        var next = element.nextSibling;\n        if (next) {\n            element.parentNode.insertBefore(elementToInsert, next);\n        }\n        else if (element.parentNode) {\n            element.parentNode.appendChild(elementToInsert);\n        }\n    },\n    nextSibling: function(element) {\n        var sibling = element.nextSibling;\n        while (sibling) {\n            if (sibling.nodeType === 1) {   \n                return sibling;\n            }\n            sibling = sibling.nextSibling;\n        }\n    },\n    removeAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('remove', element, name, value);\n    },\n    removeCssClass: function(element, value) {\n        this.updateClassName('remove', element, name, value);\n    },\n    removeEvent: function(element, eventName, fn, useCapture) {\n        if (element.removeEventListener) {\n            element.removeEventListener(eventName, fn, !!useCapture);\n        }\n        else if (element.detachEvent) {\n            element.detachEvent('on' + eventName, fn)\n        }\n        element['on' + eventName] = null;\n    },\n    removeString: function(getString, setString, valueToRemove) {\n        var currentValue = getString();\n        if (currentValue) {\n            var regex = this._regexes.getRegex('(\\\\s|\\\\b)' + valueToRemove + '$|\\\\b' + valueToRemove + '\\\\s+');\n            setString(currentValue.replace(regex, ''));\n        }\n    },\n    setFloat: function(element, direction) {\n        element.style.styleFloat = direction;\n        element.style.cssFloat = direction;\n    },\n    updateAttributeValue: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.getAttribute(name);\n                },\n                function(newValue) {\n                    element.setAttribute(name, newValue);\n                },\n                value\n            );\n    },\n    updateClassName: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.className;\n                },\n                function(newValue) {\n                    element.className = newValue;\n                },\n                value\n            );\n    },\n    _regexes: {\n        getRegex: function(pattern) {\n            var regex = this[pattern];\n            if (!regex) {\n                this[pattern] = regex = new RegExp(pattern);\n            }\n            return regex;\n        }\n    }\n};\nSys.WebForms.Menu._elementObjectMapper = {\n    _computedId: 0,\n    _mappings: {},\n    _mappingIdName: 'Sys.WebForms.Menu.Mapping',\n    getMappedObject: function(element) {\n        var id = element[this._mappingIdName];\n        if (id) {\n            return this._mappings[this._mappingIdName + ':' + id];\n        }\n    },\n    map: function(element, theObject) {\n        var mappedObject = element[this._mappingIdName];\n        if (mappedObject === theObject) {\n            return;\n        }\n        var objectId = element[this._mappingIdName] || element.id || '%' + (++this._computedId); \n        element[this._mappingIdName] = objectId;\n        this._mappings[this._mappingIdName + ':' + objectId] = theObject;\n        theObject.mappingId = objectId;\n    }\n};\nSys.WebForms.Menu._keyboardMapping = new (function() {\n    var LEFT_ARROW = 37;\n    var UP_ARROW = 38;\n    var RIGHT_ARROW = 39;\n    var DOWN_ARROW = 40;\n    var TAB = 9;\n    var ESCAPE = 27;\n    this.vertical = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.vertical[DOWN_ARROW] = this.vertical.next;\n    this.vertical[UP_ARROW] = this.vertical.previous;\n    this.vertical[RIGHT_ARROW] = this.vertical.child;\n    this.vertical[LEFT_ARROW] = this.vertical.parent;\n    this.vertical[TAB] = this.vertical[ESCAPE] = this.vertical.tab;\n    this.verticalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.verticalRtl[DOWN_ARROW] = this.verticalRtl.next;\n    this.verticalRtl[UP_ARROW] = this.verticalRtl.previous;\n    this.verticalRtl[LEFT_ARROW] = this.verticalRtl.child;\n    this.verticalRtl[RIGHT_ARROW] = this.verticalRtl.parent;\n    this.verticalRtl[TAB] = this.verticalRtl[ESCAPE] = this.verticalRtl.tab;\n    this.horizontal = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontal[RIGHT_ARROW] = this.horizontal.next;\n    this.horizontal[LEFT_ARROW] = this.horizontal.previous;\n    this.horizontal[DOWN_ARROW] = this.horizontal.child;\n    this.horizontal[UP_ARROW] = this.horizontal.parent;\n    this.horizontal[TAB] = this.horizontal[ESCAPE] = this.horizontal.tab;\n    this.horizontalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontalRtl[RIGHT_ARROW] = this.horizontalRtl.previous;\n    this.horizontalRtl[LEFT_ARROW] = this.horizontalRtl.next;\n    this.horizontalRtl[DOWN_ARROW] = this.horizontalRtl.child;\n    this.horizontalRtl[UP_ARROW] = this.horizontalRtl.parent;\n    this.horizontalRtl[TAB] = this.horizontalRtl[ESCAPE] = this.horizontalRtl.tab;\n    this.horizontal.contains = this.horizontalRtl.contains = this.vertical.contains = this.verticalRtl.contains = function(keycode) {\n        return this[keycode] != null;\n    };\n})();\nSys.WebForms._MenuContainer = function(options) {\n    this.focused = false;\n    this.disabled = options.disabled;\n    this.staticDisplayLevels = options.staticDisplayLevels || 1;\n    this.element = options.element;\n    this.orientation = options.orientation || 'vertical';\n    this.disappearAfter = options.disappearAfter;\n    this.rightToLeft = Sys.WebForms.Menu._domHelper.getElementDirection(this.element) === 'rtl';\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    this.menu = options.menu;\n    this.menu.rootMenu = this.menu;\n    this.menu.displayMode = 'static';\n    this.menu.element.style.position = 'relative';\n    this.menu.element.style.width = 'auto';\n    if (this.orientation === 'vertical') {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menu');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n        }\n    }\n    else {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menubar');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontal;\n        }\n    }\n    var floatBreak = document.createElement('div');\n    floatBreak.style.clear = this.rightToLeft ? \"right\" : \"left\";\n    this.element.appendChild(floatBreak);\n    Sys.WebForms.Menu._domHelper.setFloat(this.element, this.rightToLeft ? \"right\" : \"left\");\n    Sys.WebForms.Menu._domHelper.insertAfter(this.element, floatBreak);\n    if (!this.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'focus', this._onfocus, true);\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'keydown', this._onkeydown);\n        var menuContainer = this;\n        this.element.dispose = function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose = null;\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'focus', menuContainer._onfocus, true);\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'keydown', menuContainer._onkeydown);\n                menuContainer.menu.doDispose();\n            }\n        };\n        Sys.WebForms.Menu._domHelper.addEvent(window, 'unload', function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose();\n            }\n        });\n    }\n};\nSys.WebForms._MenuContainer.prototype = {\n    blur: function() {\n        this.focused = false;\n        this.isBlurring = false;\n        this.menu.collapse();\n        this.focusedMenuItem = null;\n    },\n    focus: function(e) { this.focused = true; },\n    navigateTo: function(menuItem) {\n        if (this.focusedMenuItem && this.focusedMenuItem !== this) {\n            this.focusedMenuItem.highlight(false);\n        }\n        menuItem.highlight(true);\n        menuItem.focus();\n        this.focusedMenuItem = menuItem;\n    },\n    _onfocus: function(e) {\n        var event = e || window.event;\n        if (event.srcElement && this) {\n            if (Sys.WebForms.Menu._domHelper.contains(this.element, event.srcElement)) {\n                if (!this.focused) {\n                    this.focus();\n                }\n            }\n        }\n    },\n    _onkeydown: function(e) {\n        var thisMenu = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n        var keyCode = Sys.WebForms.Menu._domHelper.getKeyCode(e || window.event);\n        if (thisMenu) {\n            thisMenu.handleKeyPress(keyCode);\n        }\n    }\n};\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/SmartNav.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/SmartNav.js\nvar snSrc;\nif ((typeof(window.__smartNav) == \"undefined\") || (window.__smartNav == null))\n{\n    window.__smartNav = new Object();\n    window.__smartNav.update = function()\n    {\n        var sn = window.__smartNav;\n        var fd;\n        document.detachEvent(\"onstop\", sn.stopHif);\n        sn.inPost = false;\n        try { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        var fdr = fd.getElementsByTagName(\"asp_smartnav_rdir\");\n        if (fdr.length > 0)\n        {\n            if ((typeof(sn.sHif) == \"undefined\") || (sn.sHif == null))\n            {\n                sn.sHif = document.createElement(\"IFRAME\");\n                sn.sHif.name = \"__hifSmartNav\";\n                sn.sHif.style.display = \"none\";\n                sn.sHif.src = snSrc;\n            }\n            try {window.location = fdr[0].url;} catch (e) {};\n            return;\n        }\n        var fdurl = fd.location.href;\n        var index = fdurl.indexOf(snSrc);\n        if ((index != -1 && index == fdurl.length-snSrc.length)\n            || fdurl == \"about:blank\")\n            return;\n\t\tvar fdurlb = fdurl.split(\"?\")[0];\n\t\tif (document.location.href.indexOf(fdurlb) < 0)\n\t\t{\n            document.location.href=fdurl;\n\t\t    return;\n\t\t}\n\t\tsn._savedOnLoad = window.onload;\n\t\twindow.onload = null;\n\t\twindow.__smartNav.updateHelper();\n\t}\n\twindow.__smartNav.updateHelper = function()\n\t{\n\t\tif (document.readyState != \"complete\")\n\t\t{\n\t\t    window.setTimeout(window.__smartNav.updateHelper, 25);\n\t\t    return;\n\t\t}\n\t\twindow.__smartNav.loadNewContent();\n\t}\n\twindow.__smartNav.loadNewContent = function()\n\t{\n\t\tvar sn = window.__smartNav;\n\t\tvar fd;\n\t\ttry { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        if ((typeof(sn.sHif) != \"undefined\") && (sn.sHif != null))\n        {\n            sn.sHif.removeNode(true);\n            sn.sHif = null;\n        }\n        var hdm = document.getElementsByTagName(\"head\")[0];\n        var hk = hdm.childNodes;\n        var tt = null;\n        var i;\n        for (i = hk.length - 1; i>= 0; i--)\n        {\n            if (hk[i].tagName == \"TITLE\")\n            {\n                tt = hk[i].outerHTML;\n                continue;\n            }\n            if (hk[i].tagName != \"BASEFONT\" || hk[i].innerHTML.length == 0)\n                hdm.removeChild(hdm.childNodes[i]);\n        }\n        var kids = fd.getElementsByTagName(\"head\")[0].childNodes;\n        for (i = 0; i < kids.length; i++)\n        {\n            var tn = kids[i].tagName;\n            var k = document.createElement(tn);\n            k.id = kids[i].id;\n            k.mergeAttributes(kids[i]);\n            switch(tn)\n            {\n            case \"TITLE\":\n                if (tt == kids[i].outerHTML)\n                    continue;\n                k.innerText = kids[i].text;\n                hdm.insertAdjacentElement(\"afterbegin\", k);\n                continue;\n            case \"BASEFONT\" :\n                if (kids[i].innerHTML.length > 0)\n                    continue;\n                break;\n            default:\n                var o = document.createElement(\"BODY\");\n                o.innerHTML = \"<BODY>\" + kids[i].outerHTML + \"</BODY>\";\n                k = o.firstChild;\n                break;\n            }\n            if((typeof(k) != \"undefined\") && (k != null))\n                hdm.appendChild(k);\n        }\n        document.body.clearAttributes();\n        document.body.id = fd.body.id;\n        document.body.mergeAttributes(fd.body);\n        var newBodyLoad = fd.body.onload;\n        if ((typeof(newBodyLoad) != \"undefined\") && (newBodyLoad != null))\n            document.body.onload = newBodyLoad;\n        else\n            document.body.onload = sn._savedOnLoad;\n        var s = \"<BODY>\" + fd.body.innerHTML + \"</BODY>\";\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hifP = sn.hif.parentElement;\n            if ((typeof(hifP) != \"undefined\") && (hifP != null))\n                sn.sHif=hifP.removeChild(sn.hif);\n        }\n        document.body.innerHTML = s;\n        var sc = document.scripts;\n        for (i = 0; i < sc.length; i++)\n        {\n            sc[i].text = sc[i].text;\n        }\n        sn.hif = document.all(\"__hifSmartNav\");\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hif = sn.hif;\n            sn.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n            frames[\"__hifSmartNav\"].name = sn.hifName;\n            sn.hifDoc = hif.contentWindow.document;\n            if (sn.ie5)\n                hif.parentElement.removeChild(hif);\n            window.setTimeout(sn.restoreFocus,0);\n        }\n        if (typeof(window.onload) == \"string\")\n        {\n            try { eval(window.onload) } catch (e) {};\n        }\n        else if ((typeof(window.onload) != \"undefined\") && (window.onload != null))\n        {\n            try { window.onload() } catch (e) {};\n        }\n        sn._savedOnLoad = null;\n        sn.attachForm();\n    };\n    window.__smartNav.restoreFocus = function()\n    {\n        if (window.__smartNav.inPost == true) return;\n        var curAe = document.activeElement;\n        var sAeId = window.__smartNav.ae;\n        if (((typeof(sAeId) == \"undefined\") || (sAeId == null)) ||\n            (typeof(curAe) != \"undefined\") && (curAe != null) && (curAe.id == sAeId || curAe.name == sAeId))\n            return;\n        var ae = document.all(sAeId);\n        if ((typeof(ae) == \"undefined\") || (ae == null)) return;\n        try { ae.focus(); } catch(e){};\n    }\n    window.__smartNav.saveHistory = function()\n    {\n        if ((typeof(window.__smartNav.hif) != \"undefined\") && (window.__smartNav.hif != null))\n            window.__smartNav.hif.removeNode();\n        if ((typeof(window.__smartNav.sHif) != \"undefined\") && (window.__smartNav.sHif != null)\n            && (typeof(document.all[window.__smartNav.siHif]) != \"undefined\")\n            && (document.all[window.__smartNav.siHif] != null)) {\n            document.all[window.__smartNav.siHif].insertAdjacentElement(\n                        \"BeforeBegin\", window.__smartNav.sHif);\n        }\n    }\n    window.__smartNav.stopHif = function()\n    {\n        document.detachEvent(\"onstop\", window.__smartNav.stopHif);\n        var sn = window.__smartNav;\n        if (((typeof(sn.hifDoc) == \"undefined\") || (sn.hifDoc == null)) &&\n            (typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            try {sn.hifDoc = sn.hif.contentWindow.document;}\n            catch(e){sn.hifDoc=null}\n        }\n        if (sn.hifDoc != null)\n        {\n            try {sn.hifDoc.execCommand(\"stop\");} catch (e){}\n        }\n    }\n    window.__smartNav.init =  function()\n    {\n        var sn = window.__smartNav;\n        window.__smartNav.form.__smartNavPostBack.value = 'true';\n        document.detachEvent(\"onstop\", sn.stopHif);\n        document.attachEvent(\"onstop\", sn.stopHif);\n        try { if (window.event.returnValue == false) return; } catch(e) {}\n        sn.inPost = true;\n        if ((typeof(document.activeElement) != \"undefined\") && (document.activeElement != null))\n        {\n            var ae = document.activeElement.id;\n            if (ae.length == 0)\n                ae = document.activeElement.name;\n            sn.ae = ae;\n        }\n        else\n            sn.ae = null;\n        try {document.selection.empty();} catch (e) {}\n        if ((typeof(sn.hif) == \"undefined\") || (sn.hif == null))\n        {\n            sn.hif = document.all(\"__hifSmartNav\");\n            sn.hifDoc = sn.hif.contentWindow.document;\n        }\n        if ((typeof(sn.hifDoc) != \"undefined\") && (sn.hifDoc != null))\n            try {sn.hifDoc.designMode = \"On\";} catch(e){};\n        if ((typeof(sn.hif.parentElement) == \"undefined\") || (sn.hif.parentElement == null))\n            document.body.appendChild(sn.hif);\n        var hif = sn.hif;\n        hif.detachEvent(\"onload\", sn.update);\n        hif.attachEvent(\"onload\", sn.update);\n        window.__smartNav.fInit = true;\n    };\n    window.__smartNav.submit = function()\n    {\n        window.__smartNav.fInit = false;\n        try { window.__smartNav.init(); } catch(e) {}\n        if (window.__smartNav.fInit) {\n            window.__smartNav.form._submit();\n        }\n    };\n    window.__smartNav.attachForm = function()\n    {\n        var cf = document.forms;\n        for (var i=0; i<cf.length; i++)\n        {\n            if ((typeof(cf[i].__smartNavEnabled) != \"undefined\") && (cf[i].__smartNavEnabled != null))\n            {\n                window.__smartNav.form = cf[i];\n                window.__smartNav.form.insertAdjacentHTML(\"beforeEnd\", \"<input type='hidden' name='__smartNavPostBack' value='false' />\");\n                break;\n            }\n        }\n        var snfm = window.__smartNav.form;\n        if ((typeof(snfm) == \"undefined\") || (snfm == null)) return false;\n        var sft = snfm.target;\n        if (sft.length != 0 && sft.indexOf(\"__hifSmartNav\") != 0) return false;\n        var sfc = snfm.action.split(\"?\")[0];\n        var url = window.location.href.split(\"?\")[0];\n        if (url.charAt(url.length-1) != '/' && url.lastIndexOf(sfc) + sfc.length != url.length) return false;\n        if (snfm.__formAttached == true) return true;\n        snfm.__formAttached = true;\n        snfm.attachEvent(\"onsubmit\", window.__smartNav.init);\n        snfm._submit = snfm.submit;\n        snfm.submit = window.__smartNav.submit;\n        snfm.target = window.__smartNav.hifName;\n        return true;\n    };\n    window.__smartNav.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n    window.__smartNav.ie5 = navigator.appVersion.indexOf(\"MSIE 5\") > 0;\n    var rc = window.__smartNav.attachForm();\n    var hif = document.all(\"__hifSmartNav\");\n    if ((typeof(snSrc) == \"undefined\") || (snSrc == null)) {\n\t    if (typeof(window.dialogHeight) != \"undefined\") {\n\t            snSrc = \"IEsmartnav1\";\n\t\t    hif.src = snSrc;\n\t    } else {\n\t\t    snSrc = hif.src;\n\t    }\n    }\n    if (rc)\n    {\n        var fsn = frames[\"__hifSmartNav\"];\n        fsn.name = window.__smartNav.hifName;\n        window.__smartNav.siHif = hif.sourceIndex;\n        try {\n            if (fsn.document.location != snSrc)\n            {\n                fsn.document.designMode = \"On\";\n                hif.attachEvent(\"onload\",window.__smartNav.update);\n                window.__smartNav.hif = hif;\n            }\n        }\n        catch (e) { window.__smartNav.hif = hif; }\n        window.attachEvent(\"onbeforeunload\", window.__smartNav.saveHistory);\n    }\n    else\n        window.__smartNav = null;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/TreeView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/TreeView.js\nfunction TreeView_HoverNode(data, node) {\n    if (!data) {\n        return;\n    }\n    node.hoverClass = data.hoverClass;\n    WebForm_AppendToClassName(node, data.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n    WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n}\nfunction TreeView_GetNodeText(node) {\n    var trNode = WebForm_GetParentByTagName(node, \"TR\");\n    var outerNodes;\n    if (trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName) {\n        outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"A\");\n        if (!outerNodes || outerNodes.length == 0) {\n            outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"SPAN\");\n        }\n    }\n    var textNode = (outerNodes && outerNodes.length > 0) ?\n        outerNodes[0].childNodes[0] :\n        trNode.childNodes[trNode.childNodes.length - 1].childNodes[0];\n    return (textNode && textNode.nodeValue) ? textNode.nodeValue : \"\";\n}\nfunction TreeView_PopulateNode(data, index, node, selectNode, selectImageNode, lineType, text, path, databound, datapath, parentIsLast) {\n    if (!data) {\n        return;\n    }\n    var context = new Object();\n    context.data = data;\n    context.node = node;\n    context.selectNode = selectNode;\n    context.selectImageNode = selectImageNode;\n    context.lineType = lineType;\n    context.index = index;\n    context.isChecked = \"f\";\n    var tr = WebForm_GetParentByTagName(node, \"TR\");\n    if (tr) {\n        var checkbox = tr.getElementsByTagName(\"INPUT\");\n        if (checkbox && (checkbox.length > 0)) {\n            for (var i = 0; i < checkbox.length; i++) {\n                if (checkbox[i].type.toLowerCase() == \"checkbox\") {\n                    if (checkbox[i].checked) {\n                        context.isChecked = \"t\";\n                    }\n                    break;\n                }\n            }\n        }\n    }\n    var param = index + \"|\" + data.lastIndex + \"|\" + databound + context.isChecked + parentIsLast + \"|\" +\n        text.length + \"|\" + text + datapath.length + \"|\" + datapath + path;\n    TreeView_PopulateNodeDoCallBack(context, param);\n}\nfunction TreeView_ProcessNodeData(result, context) {\n    var treeNode = context.node;\n    if (result.length > 0) {\n        var ci =  result.indexOf(\"|\", 0);\n        context.data.lastIndex = result.substring(0, ci);\n        ci = result.indexOf(\"|\", ci + 1);\n        var newExpandState = result.substring(context.data.lastIndex.length + 1, ci);\n        context.data.expandState.value += newExpandState;\n        var chunk = result.substr(ci + 1);\n        var newChildren, table;\n        if (__nonMSDOMBrowser) {\n            var newDiv = document.createElement(\"div\");\n            newDiv.innerHTML = chunk;\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            newChildren = null;\n            if ((typeof(table.nextSibling) == \"undefined\") || (table.nextSibling == null)) {\n                table.parentNode.insertBefore(newDiv.firstChild, table.nextSibling);\n                newChildren = table.previousSibling;\n            }\n            else {\n                table = table.nextSibling;\n                table.parentNode.insertBefore(newDiv.firstChild, table);\n                newChildren = table.previousSibling;\n            }\n            newChildren = document.getElementById(treeNode.id + \"Nodes\");\n        }\n        else {\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            table.insertAdjacentHTML(\"afterEnd\", chunk);\n            newChildren = document.all[treeNode.id + \"Nodes\"];\n        }\n        if ((typeof(newChildren) != \"undefined\") && (newChildren != null)) {\n            TreeView_ToggleNode(context.data, context.index, treeNode, context.lineType, newChildren);\n            treeNode.href = document.getElementById ?\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",document.getElementById('\" + treeNode.id + \"'),'\" + context.lineType + \"',document.getElementById('\" + newChildren.id + \"'))\" :\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",\" + treeNode.id + \",'\" + context.lineType + \"',\" + newChildren.id + \")\";\n            if ((typeof(context.selectNode) != \"undefined\") && (context.selectNode != null) && context.selectNode.href &&\n                (context.selectNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectNode.href = treeNode.href;\n            }\n            if ((typeof(context.selectImageNode) != \"undefined\") && (context.selectImageNode != null) && context.selectNode.href &&\n                (context.selectImageNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectImageNode.href = treeNode.href;\n            }\n        }\n        context.data.populateLog.value += context.index + \",\";\n    }\n    else {\n        var img = treeNode.childNodes ? treeNode.childNodes[0] : treeNode.children[0];\n        if ((typeof(img) != \"undefined\") && (img != null)) {\n            var lineType = context.lineType;\n            if (lineType == \"l\") {\n                img.src = context.data.images[13];\n            }\n            else if (lineType == \"t\") {\n                img.src = context.data.images[10];\n            }\n            else if (lineType == \"-\") {\n                img.src = context.data.images[16];\n            }\n            else {\n                img.src = context.data.images[3];\n            }\n            var pe;\n            if (__nonMSDOMBrowser) {\n                pe = treeNode.parentNode;\n                pe.insertBefore(img, treeNode);\n                pe.removeChild(treeNode);\n            }\n            else {\n                pe = treeNode.parentElement;\n                treeNode.style.visibility=\"hidden\";\n                treeNode.style.display=\"none\";\n                pe.insertAdjacentElement(\"afterBegin\", img);\n            }\n        }\n    }\n}\nfunction TreeView_SelectNode(data, node, nodeId) {\n    if (!data) {\n        return;\n    }\n    if ((typeof(data.selectedClass) != \"undefined\") && (data.selectedClass != null)) {\n        var id = data.selectedNodeID.value;\n        if (id.length > 0) {\n            var selectedNode = document.getElementById(id);\n            if ((typeof(selectedNode) != \"undefined\") && (selectedNode != null)) {\n                WebForm_RemoveClassName(selectedNode, data.selectedHyperLinkClass);\n                selectedNode = WebForm_GetParentByTagName(selectedNode, \"TD\");\n                WebForm_RemoveClassName(selectedNode, data.selectedClass);\n            }\n        }\n        WebForm_AppendToClassName(node, data.selectedHyperLinkClass);\n        node = WebForm_GetParentByTagName(node, \"TD\");\n        WebForm_AppendToClassName(node, data.selectedClass)\n    }\n    data.selectedNodeID.value = nodeId;\n}\nfunction TreeView_ToggleNode(data, index, node, lineType, children) {\n    if (!data) {\n        return;\n    }\n    var img = node.childNodes[0];\n    var newExpandState;\n    try {\n        if (children.style.display == \"none\") {\n            children.style.display = \"block\";\n            newExpandState = \"e\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[15];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[12];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[18];\n                }\n                else {\n                    img.src = data.images[5];\n                }\n                img.alt = data.collapseToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n        else {\n            children.style.display = \"none\";\n            newExpandState = \"c\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[14];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[11];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[17];\n                }\n                else {\n                    img.src = data.images[4];\n                }\n                img.alt = data.expandToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n    }\n    catch(e) {}\n    data.expandState.value =  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);\n}\nfunction TreeView_UnhoverNode(node) {\n    if (!node.hoverClass) {\n        return;\n    }\n    WebForm_RemoveClassName(node, node.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {\n    this.eventTarget = eventTarget;\n    this.eventArgument = eventArgument;\n    this.validation = validation;\n    this.validationGroup = validationGroup;\n    this.actionUrl = actionUrl;\n    this.trackFocus = trackFocus;\n    this.clientSubmit = clientSubmit;\n}\nfunction WebForm_DoPostBackWithOptions(options) {\n    var validationResult = true;\n    if (options.validation) {\n        if (typeof(Page_ClientValidate) == 'function') {\n            validationResult = Page_ClientValidate(options.validationGroup);\n        }\n    }\n    if (validationResult) {\n        if ((typeof(options.actionUrl) != \"undefined\") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {\n            theForm.action = options.actionUrl;\n        }\n        if (options.trackFocus) {\n            var lastFocus = theForm.elements[\"__LASTFOCUS\"];\n            if ((typeof(lastFocus) != \"undefined\") && (lastFocus != null)) {\n                if (typeof(document.activeElement) == \"undefined\") {\n                    lastFocus.value = options.eventTarget;\n                }\n                else {\n                    var active = document.activeElement;\n                    if ((typeof(active) != \"undefined\") && (active != null)) {\n                        if ((typeof(active.id) != \"undefined\") && (active.id != null) && (active.id.length > 0)) {\n                            lastFocus.value = active.id;\n                        }\n                        else if (typeof(active.name) != \"undefined\") {\n                            lastFocus.value = active.name;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if (options.clientSubmit) {\n        __doPostBack(options.eventTarget, options.eventArgument);\n    }\n}\nvar __pendingCallbacks = new Array();\nvar __synchronousCallBackIndex = -1;\nfunction WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {\n    var postData = __theFormPostData +\n                \"__CALLBACKID=\" + WebForm_EncodeCallback(eventTarget) +\n                \"&__CALLBACKPARAM=\" + WebForm_EncodeCallback(eventArgument);\n    if (theForm[\"__EVENTVALIDATION\"]) {\n        postData += \"&__EVENTVALIDATION=\" + WebForm_EncodeCallback(theForm[\"__EVENTVALIDATION\"].value);\n    }\n    var xmlRequest,e;\n    try {\n        xmlRequest = new XMLHttpRequest();\n    }\n    catch(e) {\n        try {\n            xmlRequest = new ActiveXObject(\"Microsoft.XMLHTTP\");\n        }\n        catch(e) {\n        }\n    }\n    var setRequestHeaderMethodExists = true;\n    try {\n        setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);\n    }\n    catch(e) {}\n    var callback = new Object();\n    callback.eventCallback = eventCallback;\n    callback.context = context;\n    callback.errorCallback = errorCallback;\n    callback.async = useAsync;\n    var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);\n    if (!useAsync) {\n        if (__synchronousCallBackIndex != -1) {\n            __pendingCallbacks[__synchronousCallBackIndex] = null;\n        }\n        __synchronousCallBackIndex = callbackIndex;\n    }\n    if (setRequestHeaderMethodExists) {\n        xmlRequest.onreadystatechange = WebForm_CallbackComplete;\n        callback.xmlRequest = xmlRequest;\n        // e.g. http:\n        var action = theForm.action || document.location.pathname, fragmentIndex = action.indexOf('#');\n        if (fragmentIndex !== -1) {\n            action = action.substr(0, fragmentIndex);\n        }\n        if (!__nonMSDOMBrowser) {\n            var queryIndex = action.indexOf('?');\n            if (queryIndex !== -1) {\n                var path = action.substr(0, queryIndex);\n                if (path.indexOf(\"%\") === -1) {\n                    action = encodeURI(path) + action.substr(queryIndex);\n                }\n            }\n            else if (action.indexOf(\"%\") === -1) {\n                action = encodeURI(action);\n            }\n        }\n        xmlRequest.open(\"POST\", action, true);\n        xmlRequest.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded; charset=utf-8\");\n        xmlRequest.send(postData);\n        return;\n    }\n    callback.xmlRequest = new Object();\n    var callbackFrameID = \"__CALLBACKFRAME\" + callbackIndex;\n    var xmlRequestFrame = document.frames[callbackFrameID];\n    if (!xmlRequestFrame) {\n        xmlRequestFrame = document.createElement(\"IFRAME\");\n        xmlRequestFrame.width = \"1\";\n        xmlRequestFrame.height = \"1\";\n        xmlRequestFrame.frameBorder = \"0\";\n        xmlRequestFrame.id = callbackFrameID;\n        xmlRequestFrame.name = callbackFrameID;\n        xmlRequestFrame.style.position = \"absolute\";\n        xmlRequestFrame.style.top = \"-100px\"\n        xmlRequestFrame.style.left = \"-100px\";\n        try {\n            if (callBackFrameUrl) {\n                xmlRequestFrame.src = callBackFrameUrl;\n            }\n        }\n        catch(e) {}\n        document.body.appendChild(xmlRequestFrame);\n    }\n    var interval = window.setInterval(function() {\n        xmlRequestFrame = document.frames[callbackFrameID];\n        if (xmlRequestFrame && xmlRequestFrame.document) {\n            window.clearInterval(interval);\n            xmlRequestFrame.document.write(\"\");\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.write('<html><body><form method=\"post\"><input type=\"hidden\" name=\"__CALLBACKLOADSCRIPT\" value=\"t\"></form></body></html>');\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.forms[0].action = theForm.action;\n            var count = __theFormPostCollection.length;\n            var element;\n            for (var i = 0; i < count; i++) {\n                element = __theFormPostCollection[i];\n                if (element) {\n                    var fieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                    fieldElement.type = \"hidden\";\n                    fieldElement.name = element.name;\n                    fieldElement.value = element.value;\n                    xmlRequestFrame.document.forms[0].appendChild(fieldElement);\n                }\n            }\n            var callbackIdFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIdFieldElement.type = \"hidden\";\n            callbackIdFieldElement.name = \"__CALLBACKID\";\n            callbackIdFieldElement.value = eventTarget;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);\n            var callbackParamFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackParamFieldElement.type = \"hidden\";\n            callbackParamFieldElement.name = \"__CALLBACKPARAM\";\n            callbackParamFieldElement.value = eventArgument;\n            xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);\n            if (theForm[\"__EVENTVALIDATION\"]) {\n                var callbackValidationFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                callbackValidationFieldElement.type = \"hidden\";\n                callbackValidationFieldElement.name = \"__EVENTVALIDATION\";\n                callbackValidationFieldElement.value = theForm[\"__EVENTVALIDATION\"].value;\n                xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement);\n            }\n            var callbackIndexFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIndexFieldElement.type = \"hidden\";\n            callbackIndexFieldElement.name = \"__CALLBACKINDEX\";\n            callbackIndexFieldElement.value = callbackIndex;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement);\n            xmlRequestFrame.document.forms[0].submit();\n        }\n    }, 10);\n}\nfunction WebForm_CallbackComplete() {\n    for (var i = 0; i < __pendingCallbacks.length; i++) {\n        callbackObject = __pendingCallbacks[i];\n        if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {\n            if (!__pendingCallbacks[i].async) {\n                __synchronousCallBackIndex = -1;\n            }\n            __pendingCallbacks[i] = null;\n            var callbackFrameID = \"__CALLBACKFRAME\" + i;\n            var xmlRequestFrame = document.getElementById(callbackFrameID);\n            if (xmlRequestFrame) {\n                xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);\n            }\n            WebForm_ExecuteCallback(callbackObject);\n        }\n    }\n}\nfunction WebForm_ExecuteCallback(callbackObject) {\n    var response = callbackObject.xmlRequest.responseText;\n    if (response.charAt(0) == \"s\") {\n        if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n            callbackObject.eventCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else if (response.charAt(0) == \"e\") {\n        if ((typeof(callbackObject.errorCallback) != \"undefined\") && (callbackObject.errorCallback != null)) {\n            callbackObject.errorCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else {\n        var separatorIndex = response.indexOf(\"|\");\n        if (separatorIndex != -1) {\n            var validationFieldLength = parseInt(response.substring(0, separatorIndex));\n            if (!isNaN(validationFieldLength)) {\n                var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);\n                if (validationField != \"\") {\n                    var validationFieldElement = theForm[\"__EVENTVALIDATION\"];\n                    if (!validationFieldElement) {\n                        validationFieldElement = document.createElement(\"INPUT\");\n                        validationFieldElement.type = \"hidden\";\n                        validationFieldElement.name = \"__EVENTVALIDATION\";\n                        theForm.appendChild(validationFieldElement);\n                    }\n                    validationFieldElement.value = validationField;\n                }\n                if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n                    callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);\n                }\n            }\n        }\n    }\n}\nfunction WebForm_FillFirstAvailableSlot(array, element) {\n    var i;\n    for (i = 0; i < array.length; i++) {\n        if (!array[i]) break;\n    }\n    array[i] = element;\n    return i;\n}\nvar __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);\nvar __theFormPostData = \"\";\nvar __theFormPostCollection = new Array();\nvar __callbackTextTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction WebForm_InitCallback() {\n    var formElements = theForm.elements,\n        count = formElements.length,\n        element;\n    for (var i = 0; i < count; i++) {\n        element = formElements[i];\n        var tagName = element.tagName.toLowerCase();\n        if (tagName == \"input\") {\n            var type = element.type;\n            if ((__callbackTextTypes.test(type) || ((type == \"checkbox\" || type == \"radio\") && element.checked))\n                && (element.id != \"__EVENTVALIDATION\")) {\n                WebForm_InitCallbackAddField(element.name, element.value);\n            }\n        }\n        else if (tagName == \"select\") {\n            var selectCount = element.options.length;\n            for (var j = 0; j < selectCount; j++) {\n                var selectChild = element.options[j];\n                if (selectChild.selected == true) {\n                    WebForm_InitCallbackAddField(element.name, element.value);\n                }\n            }\n        }\n        else if (tagName == \"textarea\") {\n            WebForm_InitCallbackAddField(element.name, element.value);\n        }\n    }\n}\nfunction WebForm_InitCallbackAddField(name, value) {\n    var nameValue = new Object();\n    nameValue.name = name;\n    nameValue.value = value;\n    __theFormPostCollection[__theFormPostCollection.length] = nameValue;\n    __theFormPostData += WebForm_EncodeCallback(name) + \"=\" + WebForm_EncodeCallback(value) + \"&\";\n}\nfunction WebForm_EncodeCallback(parameter) {\n    if (encodeURIComponent) {\n        return encodeURIComponent(parameter);\n    }\n    else {\n        return escape(parameter);\n    }\n}\nvar __disabledControlArray = new Array();\nfunction WebForm_ReEnableControls() {\n    if (typeof(__enabledControlArray) == 'undefined') {\n        return false;\n    }\n    var disabledIndex = 0;\n    for (var i = 0; i < __enabledControlArray.length; i++) {\n        var c;\n        if (__nonMSDOMBrowser) {\n            c = document.getElementById(__enabledControlArray[i]);\n        }\n        else {\n            c = document.all[__enabledControlArray[i]];\n        }\n        if ((typeof(c) != \"undefined\") && (c != null) && (c.disabled == true)) {\n            c.disabled = false;\n            __disabledControlArray[disabledIndex++] = c;\n        }\n    }\n    setTimeout(\"WebForm_ReDisableControls()\", 0);\n    return true;\n}\nfunction WebForm_ReDisableControls() {\n    for (var i = 0; i < __disabledControlArray.length; i++) {\n        __disabledControlArray[i].disabled = true;\n    }\n}\nfunction WebForm_SimulateClick(element, event) {\n    var clickEvent;\n    if (element) {\n        if (element.click) {\n            element.click();\n        } else { \n            clickEvent = document.createEvent(\"MouseEvents\");\n            clickEvent.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n            if (!element.dispatchEvent(clickEvent)) {\n                return true;\n            }\n        }\n        event.cancelBubble = true;\n        if (event.stopPropagation) {\n            event.stopPropagation();\n        }\n        return false;\n    }\n    return true;\n}\nfunction WebForm_FireDefaultButton(event, target) {\n    if (event.keyCode == 13) {\n        var src = event.srcElement || event.target;\n        if (src &&\n            ((src.tagName.toLowerCase() == \"input\") &&\n             (src.type.toLowerCase() == \"submit\" || src.type.toLowerCase() == \"button\")) ||\n            ((src.tagName.toLowerCase() == \"a\") &&\n             (src.href != null) && (src.href != \"\")) ||\n            (src.tagName.toLowerCase() == \"textarea\")) {\n            return true;\n        }\n        var defaultButton;\n        if (__nonMSDOMBrowser) {\n            defaultButton = document.getElementById(target);\n        }\n        else {\n            defaultButton = document.all[target];\n        }\n        if (defaultButton) {\n            return WebForm_SimulateClick(defaultButton, event);\n        } \n    }\n    return true;\n}\nfunction WebForm_GetScrollX() {\n    if (__nonMSDOMBrowser) {\n        return window.pageXOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollLeft) {\n            return document.documentElement.scrollLeft;\n        }\n        else if (document.body) {\n            return document.body.scrollLeft;\n        }\n    }\n    return 0;\n}\nfunction WebForm_GetScrollY() {\n    if (__nonMSDOMBrowser) {\n        return window.pageYOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollTop) {\n            return document.documentElement.scrollTop;\n        }\n        else if (document.body) {\n            return document.body.scrollTop;\n        }\n    }\n    return 0;\n}\nfunction WebForm_SaveScrollPositionSubmit() {\n    if (__nonMSDOMBrowser) {\n        theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset;\n        theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset;\n    }\n    else {\n        theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n        theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    }\n    if ((typeof(this.oldSubmit) != \"undefined\") && (this.oldSubmit != null)) {\n        return this.oldSubmit();\n    }\n    return true;\n}\nfunction WebForm_SaveScrollPositionOnSubmit() {\n    theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n    theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    if ((typeof(this.oldOnSubmit) != \"undefined\") && (this.oldOnSubmit != null)) {\n        return this.oldOnSubmit();\n    }\n    return true;\n}\nfunction WebForm_RestoreScrollPosition() {\n    if (__nonMSDOMBrowser) {\n        window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value);\n    }\n    else {\n        window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value);\n    }\n    if ((typeof(theForm.oldOnLoad) != \"undefined\") && (theForm.oldOnLoad != null)) {\n        return theForm.oldOnLoad();\n    }\n    return true;\n}\nfunction WebForm_TextBoxKeyHandler(event) {\n    if (event.keyCode == 13) {\n        var target;\n        if (__nonMSDOMBrowser) {\n            target = event.target;\n        }\n        else {\n            target = event.srcElement;\n        }\n        if ((typeof(target) != \"undefined\") && (target != null)) {\n            if (typeof(target.onchange) != \"undefined\") {\n                target.onchange();\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction WebForm_TrimString(value) {\n    return value.replace(/^\\s+|\\s+$/g, '')\n}\nfunction WebForm_AppendToClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index === -1) {\n        element.className = (element.className === '') ? className : element.className + ' ' + className;\n    }\n}\nfunction WebForm_RemoveClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index >= 0) {\n        element.className = WebForm_TrimString(currentClassName.substring(0, index) + ' ' +\n            currentClassName.substring(index + className.length + 1, currentClassName.length));\n    }\n}\nfunction WebForm_GetElementById(elementId) {\n    if (document.getElementById) {\n        return document.getElementById(elementId);\n    }\n    else if (document.all) {\n        return document.all[elementId];\n    }\n    else return null;\n}\nfunction WebForm_GetElementByTagName(element, tagName) {\n    var elements = WebForm_GetElementsByTagName(element, tagName);\n    if (elements && elements.length > 0) {\n        return elements[0];\n    }\n    else return null;\n}\nfunction WebForm_GetElementsByTagName(element, tagName) {\n    if (element && tagName) {\n        if (element.getElementsByTagName) {\n            return element.getElementsByTagName(tagName);\n        }\n        if (element.all && element.all.tags) {\n            return element.all.tags(tagName);\n        }\n    }\n    return null;\n}\nfunction WebForm_GetElementDir(element) {\n    if (element) {\n        if (element.dir) {\n            return element.dir;\n        }\n        return WebForm_GetElementDir(element.parentNode);\n    }\n    return \"ltr\";\n}\nfunction WebForm_GetElementPosition(element) {\n    var result = new Object();\n    result.x = 0;\n    result.y = 0;\n    result.width = 0;\n    result.height = 0;\n    if (element.offsetParent) {\n        result.x = element.offsetLeft;\n        result.y = element.offsetTop;\n        var parent = element.offsetParent;\n        while (parent) {\n            result.x += parent.offsetLeft;\n            result.y += parent.offsetTop;\n            var parentTagName = parent.tagName.toLowerCase();\n            if (parentTagName != \"table\" &&\n                parentTagName != \"body\" && \n                parentTagName != \"html\" && \n                parentTagName != \"div\" && \n                parent.clientTop && \n                parent.clientLeft) {\n                result.x += parent.clientLeft;\n                result.y += parent.clientTop;\n            }\n            parent = parent.offsetParent;\n        }\n    }\n    else if (element.left && element.top) {\n        result.x = element.left;\n        result.y = element.top;\n    }\n    else {\n        if (element.x) {\n            result.x = element.x;\n        }\n        if (element.y) {\n            result.y = element.y;\n        }\n    }\n    if (element.offsetWidth && element.offsetHeight) {\n        result.width = element.offsetWidth;\n        result.height = element.offsetHeight;\n    }\n    else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {\n        result.width = element.style.pixelWidth;\n        result.height = element.style.pixelHeight;\n    }\n    return result;\n}\nfunction WebForm_GetParentByTagName(element, tagName) {\n    var parent = element.parentNode;\n    var upperTagName = tagName.toUpperCase();\n    while (parent && (parent.tagName.toUpperCase() != upperTagName)) {\n        parent = parent.parentNode ? parent.parentNode : parent.parentElement;\n    }\n    return parent;\n}\nfunction WebForm_SetElementHeight(element, height) {\n    if (element && element.style) {\n        element.style.height = height + \"px\";\n    }\n}\nfunction WebForm_SetElementWidth(element, width) {\n    if (element && element.style) {\n        element.style.width = width + \"px\";\n    }\n}\nfunction WebForm_SetElementX(element, x) {\n    if (element && element.style) {\n        element.style.left = x + \"px\";\n    }\n}\nfunction WebForm_SetElementY(element, y) {\n    if (element && element.style) {\n        element.style.top = y + \"px\";\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebParts.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebParts.js\nvar __wpm = null;\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\nfunction __wpTranslateOffset(x, y, offsetElement, relativeToElement, includeScroll) {\n    while ((typeof(offsetElement) != \"undefined\") && (offsetElement != null) && (offsetElement != relativeToElement)) {\n        x += offsetElement.offsetLeft;\n        y += offsetElement.offsetTop;\n        var tagName = offsetElement.tagName;\n        if ((tagName != \"TABLE\") && (tagName != \"BODY\")) {\n            x += offsetElement.clientLeft;\n            y += offsetElement.clientTop;\n        }\n        if (includeScroll && (tagName != \"BODY\")) {\n            x -= offsetElement.scrollLeft;\n            y -= offsetElement.scrollTop;\n        }\n        offsetElement = offsetElement.offsetParent;\n    }\n    return new Point(x, y);\n}\nfunction __wpGetPageEventLocation(event, includeScroll) {\n    if ((typeof(event) == \"undefined\") || (event == null)) {\n        event = window.event;\n    }\n    return __wpTranslateOffset(event.offsetX, event.offsetY, event.srcElement, null, includeScroll);\n}\nfunction __wpClearSelection() {\n    document.selection.empty();\n}\nfunction WebPart(webPartElement, webPartTitleElement, zone, zoneIndex, allowZoneChange) {\n    this.webPartElement = webPartElement;\n    this.allowZoneChange = allowZoneChange;\n    this.zone = zone;\n    this.zoneIndex = zoneIndex;\n    this.title = ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) ?\n        webPartTitleElement.innerText : \"\";\n    webPartElement.__webPart = this;\n    if ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) {\n        webPartTitleElement.style.cursor = \"move\";\n        webPartTitleElement.attachEvent(\"onmousedown\", WebPart_OnMouseDown);\n        webPartElement.attachEvent(\"ondragstart\", WebPart_OnDragStart);\n        webPartElement.attachEvent(\"ondrag\", WebPart_OnDrag);\n        webPartElement.attachEvent(\"ondragend\", WebPart_OnDragEnd);\n    }\n    this.UpdatePosition = WebPart_UpdatePosition;\n    this.Dispose = WebPart_Dispose;\n}\nfunction WebPart_Dispose() {\n    this.webPartElement.__webPart = null    \n}\nfunction WebPart_OnMouseDown() {\n    var currentEvent = window.event;\n    var draggedWebPart = WebPart_GetParentWebPartElement(currentEvent.srcElement);\n    if ((typeof(draggedWebPart) == \"undefined\") || (draggedWebPart == null)) {\n        return;\n    }\n    document.selection.empty();\n    try {\n        __wpm.draggedWebPart = draggedWebPart;\n        __wpm.DragDrop();\n    }\n    catch (e) {\n        __wpm.draggedWebPart = draggedWebPart;\n        window.setTimeout(\"__wpm.DragDrop()\", 0);\n    }\n    currentEvent.returnValue = false;\n    currentEvent.cancelBubble = true;\n}\nfunction WebPart_OnDragStart() {\n    var currentEvent = window.event;\n    var webPartElement = currentEvent.srcElement;\n    if ((typeof(webPartElement.__webPart) == \"undefined\") || (webPartElement.__webPart == null)) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n        return;\n    }\n    var dataObject = currentEvent.dataTransfer;\n    dataObject.effectAllowed = __wpm.InitiateWebPartDragDrop(webPartElement);\n}\nfunction WebPart_OnDrag() {\n    __wpm.ContinueWebPartDragDrop();\n}\nfunction WebPart_OnDragEnd() {\n    __wpm.CompleteWebPartDragDrop();\n}\nfunction WebPart_GetParentWebPartElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__webPart) == \"undefined\") || (elem.__webPart == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction WebPart_UpdatePosition() {\n    var location = __wpTranslateOffset(0, 0, this.webPartElement, null, false);\n    this.middleX = location.x + this.webPartElement.offsetWidth / 2;\n    this.middleY = location.y + this.webPartElement.offsetHeight / 2;\n}\nfunction Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var webPartTable = null;\n    if (zoneElement.rows.length == 1) {\n        webPartTableContainer = zoneElement.rows[0].cells[0];\n    }\n    else {\n        webPartTableContainer = zoneElement.rows[1].cells[0];\n    }\n    var i;\n    for (i = 0; i < webPartTableContainer.childNodes.length; i++) {\n        var node = webPartTableContainer.childNodes[i];\n        if (node.tagName == \"TABLE\") {\n            webPartTable = node;\n            break;\n        }\n    }\n    this.zoneElement = zoneElement;\n    this.zoneIndex = zoneIndex;\n    this.webParts = new Array();\n    this.uniqueID = uniqueID;\n    this.isVertical = isVertical;\n    this.allowLayoutChange = allowLayoutChange;\n    this.allowDrop = false;\n    this.webPartTable = webPartTable;\n    this.highlightColor = highlightColor;\n    this.savedBorderColor = (webPartTable != null) ? webPartTable.style.borderColor : null;\n    this.dropCueElements = new Array();\n    if (webPartTable != null) {\n        if (isVertical) {\n            for (i = 0; i < webPartTable.rows.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[i].cells[0].childNodes[0];\n            }\n        }\n        else {\n            for (i = 0; i < webPartTable.rows[0].cells.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[0].cells[i].childNodes[0];\n            }\n        }\n    }\n    this.AddWebPart = Zone_AddWebPart;\n    this.GetWebPartIndex = Zone_GetWebPartIndex;\n    this.ToggleDropCues = Zone_ToggleDropCues;\n    this.UpdatePosition = Zone_UpdatePosition;\n    this.Dispose = Zone_Dispose;\n    webPartTable.__zone = this;\n    webPartTable.attachEvent(\"ondragenter\", Zone_OnDragEnter);\n    webPartTable.attachEvent(\"ondrop\", Zone_OnDrop);\n}\nfunction Zone_Dispose() {\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].Dispose();\n    }\n    this.webPartTable.__zone = null;\n}\nfunction Zone_OnDragEnter() {\n    var handled = __wpm.ProcessWebPartDragEnter();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDragOver() {\n    var handled = __wpm.ProcessWebPartDragOver();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDrop() {\n    var handled = __wpm.ProcessWebPartDrop();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_GetParentZoneElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__zone) == \"undefined\") || (elem.__zone == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction Zone_AddWebPart(webPartElement, webPartTitleElement, allowZoneChange) {\n    var webPart = null;\n    var zoneIndex = this.webParts.length;\n    if (this.allowLayoutChange && __wpm.IsDragDropEnabled()) {\n        webPart = new WebPart(webPartElement, webPartTitleElement, this, zoneIndex, allowZoneChange);\n    }\n    else {\n        webPart = new WebPart(webPartElement, null, this, zoneIndex, allowZoneChange);\n    }\n    this.webParts[zoneIndex] = webPart;\n    return webPart;\n}\nfunction Zone_ToggleDropCues(show, index, ignoreOutline) {\n    if (ignoreOutline == false) {\n        this.webPartTable.style.borderColor = (show ? this.highlightColor : this.savedBorderColor);\n    }\n    if (index == -1) {\n        return;\n    }\n    var dropCue = this.dropCueElements[index];\n    if (dropCue && dropCue.style) {\n        if (dropCue.style.height == \"100%\" && !dropCue.webPartZoneHorizontalCueResized) {\n            var oldParentHeight = dropCue.parentElement.clientHeight;\n            var realHeight = oldParentHeight - 10;\n            dropCue.style.height = realHeight + \"px\";\n            var dropCueVerticalBar = dropCue.getElementsByTagName(\"DIV\")[0];\n            if (dropCueVerticalBar && dropCueVerticalBar.style) {\n                dropCueVerticalBar.style.height = dropCue.style.height;\n                var heightDiff = (dropCue.parentElement.clientHeight - oldParentHeight);\n                if (heightDiff) {\n                    dropCue.style.height = (realHeight - heightDiff) + \"px\";\n                    dropCueVerticalBar.style.height = dropCue.style.height;\n                }\n            }\n            dropCue.webPartZoneHorizontalCueResized = true;\n        }\n        dropCue.style.visibility = (show ? \"visible\" : \"hidden\");\n    }\n}\nfunction Zone_GetWebPartIndex(location) {\n    var x = location.x;\n    var y = location.y;\n    if ((x < this.webPartTableLeft) || (x > this.webPartTableRight) ||\n        (y < this.webPartTableTop) || (y > this.webPartTableBottom)) {\n        return -1;\n    }\n    var vertical = this.isVertical;\n    var webParts = this.webParts;\n    var webPartsCount = webParts.length;\n    for (var i = 0; i < webPartsCount; i++) {\n        var webPart = webParts[i];\n        if (vertical) {\n            if (y < webPart.middleY) {\n                return i;\n            }\n        }\n        else {\n            if (x < webPart.middleX) {\n                return i;\n            }\n        }\n    }\n    return webPartsCount;\n}\nfunction Zone_UpdatePosition() {\n    var topLeft = __wpTranslateOffset(0, 0, this.webPartTable, null, false);\n    this.webPartTableLeft = topLeft.x;\n    this.webPartTableTop = topLeft.y;\n    this.webPartTableRight = (this.webPartTable != null) ? topLeft.x + this.webPartTable.offsetWidth : topLeft.x;\n    this.webPartTableBottom = (this.webPartTable != null) ? topLeft.y + this.webPartTable.offsetHeight : topLeft.y;\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].UpdatePosition();\n    }\n}\nfunction WebPartDragState(webPartElement, effect) {\n    this.webPartElement = webPartElement;\n    this.dropZoneElement = null;\n    this.dropIndex = -1;\n    this.effect = effect;\n    this.dropped = false;\n}\nfunction WebPartMenu(menuLabelElement, menuDropDownElement, menuElement) {\n    this.menuLabelElement = menuLabelElement;\n    this.menuDropDownElement = menuDropDownElement;\n    this.menuElement = menuElement;\n    this.menuLabelElement.__menu = this;\n    this.menuLabelElement.attachEvent('onclick', WebPartMenu_OnClick);\n    this.menuLabelElement.attachEvent('onkeypress', WebPartMenu_OnKeyPress);\n    this.menuLabelElement.attachEvent('onmouseenter', WebPartMenu_OnMouseEnter);\n    this.menuLabelElement.attachEvent('onmouseleave', WebPartMenu_OnMouseLeave);\n    if ((typeof(this.menuDropDownElement) != \"undefined\") && (this.menuDropDownElement != null)) {\n        this.menuDropDownElement.__menu = this;\n    }\n    this.menuItemStyle = \"\";\n    this.menuItemHoverStyle = \"\";\n    this.popup = null;\n    this.hoverClassName = \"\";\n    this.hoverColor = \"\";\n    this.oldColor = this.menuLabelElement.style.color;\n    this.oldTextDecoration = this.menuLabelElement.style.textDecoration;\n    this.oldClassName = this.menuLabelElement.className;\n    this.Show = WebPartMenu_Show;\n    this.Hide = WebPartMenu_Hide;\n    this.Hover = WebPartMenu_Hover;\n    this.Unhover = WebPartMenu_Unhover;\n    this.Dispose = WebPartMenu_Dispose;\n    var menu = this;\n    this.disposeDelegate = function() { menu.Dispose(); };\n    window.attachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Dispose() {\n    this.menuLabelElement.__menu = null;\n    this.menuDropDownElement.__menu = null;\n    window.detachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Show() {\n    if ((typeof(__wpm.menu) != \"undefined\") && (__wpm.menu != null)) {\n        __wpm.menu.Hide();\n    }\n    var menuHTML =\n        \"<html><head><style>\" +\n        \"a.menuItem, a.menuItem:Link { display: block; padding: 1px; text-decoration: none; \" + this.itemStyle + \" }\" +\n        \"a.menuItem:Hover { \" + this.itemHoverStyle + \" }\" +\n        \"</style><body scroll=\\\"no\\\" style=\\\"border: none; margin: 0; padding: 0;\\\" ondragstart=\\\"window.event.returnValue=false;\\\" onclick=\\\"popup.hide()\\\">\" +\n        this.menuElement.innerHTML +\n        \"</body></html>\";\n    var width = 16;\n    var height = 16;\n    this.popup = window.createPopup();\n    __wpm.menu = this;\n    var popupDocument = this.popup.document;\n    popupDocument.write(menuHTML);\n    this.popup.show(0, 0, width, height);\n    var popupBody = popupDocument.body;\n    width = popupBody.scrollWidth;\n    height = popupBody.scrollHeight;\n    if (width < this.menuLabelElement.offsetWidth) {\n        width = this.menuLabelElement.offsetWidth + 16;\n    }\n    if (this.menuElement.innerHTML.indexOf(\"progid:DXImageTransform.Microsoft.Shadow\") != -1) {\n        popupBody.style.paddingRight = \"4px\";\n    }\n    popupBody.__wpm = __wpm;\n    popupBody.__wpmDeleteWarning = __wpmDeleteWarning;\n    popupBody.__wpmCloseProviderWarning = __wpmCloseProviderWarning;\n    popupBody.popup = this.popup;\n    this.popup.hide();\n    this.popup.show(0, this.menuLabelElement.offsetHeight, width, height, this.menuLabelElement);\n}\nfunction WebPartMenu_Hide() {\n    if (__wpm.menu == this) {\n        __wpm.menu = null;\n        if ((typeof(this.popup) != \"undefined\") && (this.popup != null)) {\n            this.popup.hide();\n            this.popup = null;\n        }\n    }\n}\nfunction WebPartMenu_Hover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.className = this.menuLabelElement.className + \" \" + this.labelHoverClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.labelHoverColor;\n    }\n}\nfunction WebPartMenu_Unhover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.style.textDecoration = this.oldTextDecoration;\n        this.menuLabelElement.className = this.oldClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.oldColor;\n    }\n}\nfunction WebPartMenu_OnClick() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        window.event.returnValue = false;\n        window.event.cancelBubble = true;\n        menu.Show();\n    }\n}\nfunction WebPartMenu_OnKeyPress() {\n    if (window.event.keyCode == 13) {\n        var menu = window.event.srcElement.__menu;\n        if ((typeof(menu) != \"undefined\") && (menu != null)) {\n            window.event.returnValue = false;\n            window.event.cancelBubble = true;\n            menu.Show();\n        }\n    }\n}\nfunction WebPartMenu_OnMouseEnter() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Hover();\n    }\n}\nfunction WebPartMenu_OnMouseLeave() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Unhover();\n    }\n}\nfunction WebPartManager() {\n    this.overlayContainerElement = null;\n    this.zones = new Array();\n    this.dragState = null;\n    this.menu = null;\n    this.draggedWebPart = null;\n    this.AddZone = WebPartManager_AddZone;\n    this.IsDragDropEnabled = WebPartManager_IsDragDropEnabled;\n    this.DragDrop = WebPartManager_DragDrop;\n    this.InitiateWebPartDragDrop = WebPartManager_InitiateWebPartDragDrop;\n    this.CompleteWebPartDragDrop = WebPartManager_CompleteWebPartDragDrop;\n    this.ContinueWebPartDragDrop = WebPartManager_ContinueWebPartDragDrop;\n    this.ProcessWebPartDragEnter = WebPartManager_ProcessWebPartDragEnter;\n    this.ProcessWebPartDragOver = WebPartManager_ProcessWebPartDragOver;\n    this.ProcessWebPartDrop = WebPartManager_ProcessWebPartDrop;\n    this.ShowHelp = WebPartManager_ShowHelp;\n    this.ExportWebPart = WebPartManager_ExportWebPart;\n    this.Execute = WebPartManager_Execute;\n    this.SubmitPage = WebPartManager_SubmitPage;\n    this.UpdatePositions = WebPartManager_UpdatePositions;\n    window.attachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_Dispose() {\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].Dispose();\n    }\n    window.detachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_AddZone(zoneElement, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var zoneIndex = this.zones.length;\n    var zone = new Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor);\n    this.zones[zoneIndex] = zone;\n    return zone;\n}\nfunction WebPartManager_IsDragDropEnabled() {\n    return ((typeof(this.overlayContainerElement) != \"undefined\") && (this.overlayContainerElement != null));\n}\nfunction WebPartManager_DragDrop() {\n    if ((typeof(this.draggedWebPart) != \"undefined\") && (this.draggedWebPart != null)) {\n        var tempWebPart = this.draggedWebPart;\n        this.draggedWebPart = null;\n        tempWebPart.dragDrop();\n        window.setTimeout(\"__wpClearSelection()\", 0);\n    }\n}\nfunction WebPartManager_InitiateWebPartDragDrop(webPartElement) {\n    var webPart = webPartElement.__webPart;\n    this.UpdatePositions();\n    this.dragState = new WebPartDragState(webPartElement, \"move\");\n    var location = __wpGetPageEventLocation(window.event, true);\n    var overlayContainerElement = this.overlayContainerElement;\n    overlayContainerElement.style.left = location.x - webPartElement.offsetWidth / 2;\n    overlayContainerElement.style.top = location.y + 4 + (webPartElement.clientTop ? webPartElement.clientTop : 0);\n    overlayContainerElement.style.display = \"block\";\n    overlayContainerElement.style.width = webPartElement.offsetWidth;\n    overlayContainerElement.style.height = webPartElement.offsetHeight;\n    overlayContainerElement.appendChild(webPartElement.cloneNode(true));\n    if (webPart.allowZoneChange == false) {\n        webPart.zone.allowDrop = true;\n    }\n    else {\n        for (var i = 0; i < __wpm.zones.length; i++) {\n            var zone = __wpm.zones[i];\n            if (zone.allowLayoutChange) {\n                zone.allowDrop = true;\n            }\n        }\n    }\n    document.body.attachEvent(\"ondragover\", Zone_OnDragOver);\n    return \"move\";\n}\nfunction WebPartManager_CompleteWebPartDragDrop() {\n    var dragState = this.dragState;\n    this.dragState = null;\n    if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n    }\n    document.body.detachEvent(\"ondragover\", Zone_OnDragOver);\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].allowDrop = false;\n    }\n    this.overlayContainerElement.removeChild(this.overlayContainerElement.firstChild);\n    this.overlayContainerElement.style.display = \"none\";\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) && (dragState.dropped == true)) {\n        var currentZone = dragState.webPartElement.__webPart.zone;\n        var currentZoneIndex = dragState.webPartElement.__webPart.zoneIndex;\n        if ((currentZone != dragState.dropZoneElement.__zone) ||\n            ((currentZoneIndex != dragState.dropIndex) &&\n             (currentZoneIndex != (dragState.dropIndex - 1)))) {\n            var eventTarget = dragState.dropZoneElement.__zone.uniqueID;\n            var eventArgument = \"Drag:\" + dragState.webPartElement.id + \":\" + dragState.dropIndex;\n            this.SubmitPage(eventTarget, eventArgument);\n        }\n    }\n}\nfunction WebPartManager_ContinueWebPartDragDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var style = this.overlayContainerElement.style;\n        var location = __wpGetPageEventLocation(window.event, true);\n        style.left = location.x - dragState.webPartElement.offsetWidth / 2;\n        style.top = location.y + 4 + (dragState.webPartElement.clientTop ? dragState.webPartElement.clientTop : 0);\n    }\n}\nfunction WebPartManager_Execute(script) {\n    if (this.menu) {\n        this.menu.Hide();\n    }\n    var scriptReference = new Function(script);\n    return (scriptReference() != false);\n}\nfunction WebPartManager_ProcessWebPartDragEnter() {\n    var dragState = __wpm.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var newDropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(newDropZoneElement.__zone) == \"undefined\") || (newDropZoneElement.__zone == null) ||\n            (newDropZoneElement.__zone.allowDrop == false)) {\n            newDropZoneElement = null;\n        }\n        var newDropIndex = -1;\n        if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n            newDropIndex = newDropZoneElement.__zone.GetWebPartIndex(__wpGetPageEventLocation(currentEvent, false));\n            if (newDropIndex == -1) {\n                newDropZoneElement = null;\n            }\n        }\n        if (dragState.dropZoneElement != newDropZoneElement) {\n            if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropZoneElement = newDropZoneElement;\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        else if (dragState.dropIndex != newDropIndex) {\n            if (dragState.dropIndex != -1) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            currentEvent.dataTransfer.effectAllowed = dragState.effect;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ProcessWebPartDragOver() {\n    var dragState = __wpm.dragState;\n    var currentEvent = window.event;\n    var handled = false;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) &&\n        (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if (((typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) &&\n            (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n            dragState.dropZoneElement = null;\n            dragState.dropIndex = -1;\n        }\n        else if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n            var location = __wpGetPageEventLocation(currentEvent, false);\n            var newDropIndex = dropZoneElement.__zone.GetWebPartIndex(location);\n            if (newDropIndex == -1) {\n                dropZoneElement = null;\n            }\n            if (dragState.dropZoneElement != dropZoneElement) {\n                if ((dragState.dropIndex != -1) || (typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) {\n                    dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n                }\n                dragState.dropZoneElement = dropZoneElement;\n            }\n            else {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, true);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n                dropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        handled = true;\n    }\n    if ((typeof(dragState) == \"undefined\") || (dragState == null) ||\n        (typeof(dragState.dropZoneElement) == \"undefined\") || (dragState.dropZoneElement == null)) {\n        currentEvent.dataTransfer.effectAllowed = \"none\";\n    }\n    return handled;\n}\nfunction WebPartManager_ProcessWebPartDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dragState.dropZoneElement == dropZoneElement)) {\n            dragState.dropped = true;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ShowHelp(helpUrl, helpMode) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    if (helpMode == 0 || helpMode == 1) {\n        if (helpMode == 0) {\n            var dialogInfo = \"edge: Sunken; center: yes; help: no; resizable: yes; status: no\";\n            window.showModalDialog(helpUrl, null, dialogInfo);\n        }\n        else {\n            window.open(helpUrl, null, \"scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no\");\n        }\n    }\n    else if (helpMode == 2) {\n        window.location = helpUrl;\n    }\n}\nfunction WebPartManager_ExportWebPart(exportUrl, warn, confirmOnly) {\n    if (warn == true && __wpmExportWarning.length > 0 && this.personalizationScopeShared != true) {\n        if (confirm(__wpmExportWarning) == false) {\n            return false;\n        }\n    }\n    if (confirmOnly == false) {\n        window.location = exportUrl;\n    }\n    return true;\n}\nfunction WebPartManager_UpdatePositions() {\n    for (var i = 0; i < this.zones.length; i++) {\n        this.zones[i].UpdatePosition();\n    }\n}\nfunction WebPartManager_SubmitPage(eventTarget, eventArgument) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    __doPostBack(eventTarget, eventArgument);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebUIValidation.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebUIValidation.js\nvar Page_ValidationVer = \"125\";\nvar Page_IsValid = true;\nvar Page_BlockSubmit = false;\nvar Page_InvalidControlToBeFocused = null;\nvar Page_TextTypes = /^(text|password|file|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction ValidatorUpdateDisplay(val) {\n    if (typeof(val.display) == \"string\") {\n        if (val.display == \"None\") {\n            return;\n        }\n        if (val.display == \"Dynamic\") {\n            val.style.display = val.isvalid ? \"none\" : \"inline\";\n            return;\n        }\n    }\n    if ((navigator.userAgent.indexOf(\"Mac\") > -1) &&\n        (navigator.userAgent.indexOf(\"MSIE\") > -1)) {\n        val.style.display = \"inline\";\n    }\n    val.style.visibility = val.isvalid ? \"hidden\" : \"visible\";\n}\nfunction ValidatorUpdateIsValid() {\n    Page_IsValid = AllValidatorsValid(Page_Validators);\n}\nfunction AllValidatorsValid(validators) {\n    if ((typeof(validators) != \"undefined\") && (validators != null)) {\n        var i;\n        for (i = 0; i < validators.length; i++) {\n            if (!validators[i].isvalid) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction ValidatorHookupControlID(controlID, val) {\n    if (typeof(controlID) != \"string\") {\n        return;\n    }\n    var ctrl = document.getElementById(controlID);\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null)) {\n        ValidatorHookupControl(ctrl, val);\n    }\n    else {\n        val.isvalid = true;\n        val.enabled = false;\n    }\n}\nfunction ValidatorHookupControl(control, val) {\n    if (typeof(control.tagName) != \"string\") {\n        return;  \n    }\n    if (control.tagName != \"INPUT\" && control.tagName != \"TEXTAREA\" && control.tagName != \"SELECT\") {\n        var i;\n        for (i = 0; i < control.childNodes.length; i++) {\n            ValidatorHookupControl(control.childNodes[i], val);\n        }\n        return;\n    }\n    else {\n        if (typeof(control.Validators) == \"undefined\") {\n            control.Validators = new Array;\n            var eventType;\n            if (control.type == \"radio\") {\n                eventType = \"onclick\";\n            } else {\n                eventType = \"onchange\";\n                if (typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                    ValidatorHookupEvent(control, \"onblur\", \"ValidatedControlOnBlur(event); \");\n                }\n            }\n            ValidatorHookupEvent(control, eventType, \"ValidatorOnChange(event); \");\n            if (Page_TextTypes.test(control.type)) {\n                ValidatorHookupEvent(control, \"onkeypress\", \n                    \"event = event || window.event; if (!ValidatedTextBoxOnKeyPress(event)) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } \");\n            }\n        }\n        control.Validators[control.Validators.length] = val;\n    }\n}\nfunction ValidatorHookupEvent(control, eventType, functionPrefix) {\n    var ev = control[eventType];\n    if (typeof(ev) == \"function\") {\n        ev = ev.toString();\n        ev = ev.substring(ev.indexOf(\"{\") + 1, ev.lastIndexOf(\"}\"));\n    }\n    else {\n        ev = \"\";\n    }\n    control[eventType] = new Function(\"event\", functionPrefix + \" \" + ev);\n}\nfunction ValidatorGetValue(id) {\n    var control;\n    control = document.getElementById(id);\n    if (typeof(control.value) == \"string\") {\n        return control.value;\n    }\n    return ValidatorGetValueRecursive(control);\n}\nfunction ValidatorGetValueRecursive(control)\n{\n    if (typeof(control.value) == \"string\" && (control.type != \"radio\" || control.checked == true)) {\n        return control.value;\n    }\n    var i, val;\n    for (i = 0; i<control.childNodes.length; i++) {\n        val = ValidatorGetValueRecursive(control.childNodes[i]);\n        if (val != \"\") return val;\n    }\n    return \"\";\n}\nfunction Page_ClientValidate(validationGroup) {\n    Page_InvalidControlToBeFocused = null;\n    if (typeof(Page_Validators) == \"undefined\") {\n        return true;\n    }\n    var i;\n    for (i = 0; i < Page_Validators.length; i++) {\n        ValidatorValidate(Page_Validators[i], validationGroup, null);\n    }\n    ValidatorUpdateIsValid();\n    ValidationSummaryOnSubmit(validationGroup);\n    Page_BlockSubmit = !Page_IsValid;\n    return Page_IsValid;\n}\nfunction ValidatorCommonOnSubmit() {\n    Page_InvalidControlToBeFocused = null;\n    var result = !Page_BlockSubmit;\n    if ((typeof(window.event) != \"undefined\") && (window.event != null)) {\n        window.event.returnValue = result;\n    }\n    Page_BlockSubmit = false;\n    return result;\n}\nfunction ValidatorEnable(val, enable) {\n    val.enabled = (enable != false);\n    ValidatorValidate(val);\n    ValidatorUpdateIsValid();\n}\nfunction ValidatorOnChange(event) {\n    event = event || window.event;\n    Page_InvalidControlToBeFocused = null;\n    var targetedControl;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        targetedControl = event.srcElement;\n    }\n    else {\n        targetedControl = event.target;\n    }\n    var vals;\n    if (typeof(targetedControl.Validators) != \"undefined\") {\n        vals = targetedControl.Validators;\n    }\n    else {\n        if (targetedControl.tagName.toLowerCase() == \"label\") {\n            targetedControl = document.getElementById(targetedControl.htmlFor);\n            vals = targetedControl.Validators;\n        }\n    }\n    if (vals) {\n        for (var i = 0; i < vals.length; i++) {\n            ValidatorValidate(vals[i], null, event);\n        }\n    }\n    ValidatorUpdateIsValid();\n}\nfunction ValidatedTextBoxOnKeyPress(event) {\n    event = event || window.event;\n    if (event.keyCode == 13) {\n        ValidatorOnChange(event);\n        var vals;\n        if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n            vals = event.srcElement.Validators;\n        }\n        else {\n            vals = event.target.Validators;\n        }\n        return AllValidatorsValid(vals);\n    }\n    return true;\n}\nfunction ValidatedControlOnBlur(event) {\n    event = event || window.event;\n    var control;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        control = event.srcElement;\n    }\n    else {\n        control = event.target;\n    }\n    if ((typeof(control) != \"undefined\") && (control != null) && (Page_InvalidControlToBeFocused == control)) {\n        control.focus();\n        Page_InvalidControlToBeFocused = null;\n    }\n}\nfunction ValidatorValidate(val, validationGroup, event) {\n    val.isvalid = true;\n    if ((typeof(val.enabled) == \"undefined\" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {\n        if (typeof(val.evaluationfunction) == \"function\") {\n            val.isvalid = val.evaluationfunction(val);\n            if (!val.isvalid && Page_InvalidControlToBeFocused == null &&\n                typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                ValidatorSetFocus(val, event);\n            }\n        }\n    }\n    ValidatorUpdateDisplay(val);\n}\nfunction ValidatorSetFocus(val, event) {\n    var ctrl;\n    if (typeof(val.controlhookup) == \"string\") {\n        var eventCtrl;\n        if ((typeof(event) != \"undefined\") && (event != null)) {\n            if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n                eventCtrl = event.srcElement;\n            }\n            else {\n                eventCtrl = event.target;\n            }\n        }\n        if ((typeof(eventCtrl) != \"undefined\") && (eventCtrl != null) &&\n            (typeof(eventCtrl.id) == \"string\") &&\n            (eventCtrl.id == val.controlhookup)) {\n            ctrl = eventCtrl;\n        }\n    }\n    if ((typeof(ctrl) == \"undefined\") || (ctrl == null)) {\n        ctrl = document.getElementById(val.controltovalidate);\n    }\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null) &&\n        (ctrl.tagName.toLowerCase() != \"table\" || (typeof(event) == \"undefined\") || (event == null)) && \n        ((ctrl.tagName.toLowerCase() != \"input\") || (ctrl.type.toLowerCase() != \"hidden\")) &&\n        (typeof(ctrl.disabled) == \"undefined\" || ctrl.disabled == null || ctrl.disabled == false) &&\n        (typeof(ctrl.visible) == \"undefined\" || ctrl.visible == null || ctrl.visible != false) &&\n        (IsInVisibleContainer(ctrl))) {\n        if ((ctrl.tagName.toLowerCase() == \"table\" && (typeof(__nonMSDOMBrowser) == \"undefined\" || __nonMSDOMBrowser)) ||\n            (ctrl.tagName.toLowerCase() == \"span\")) {\n            var inputElements = ctrl.getElementsByTagName(\"input\");\n            var lastInputElement  = inputElements[inputElements.length -1];\n            if (lastInputElement != null) {\n                ctrl = lastInputElement;\n            }\n        }\n        if (typeof(ctrl.focus) != \"undefined\" && ctrl.focus != null) {\n            ctrl.focus();\n            Page_InvalidControlToBeFocused = ctrl;\n        }\n    }\n}\nfunction IsInVisibleContainer(ctrl) {\n    if (typeof(ctrl.style) != \"undefined\" &&\n        ( ( typeof(ctrl.style.display) != \"undefined\" &&\n            ctrl.style.display == \"none\") ||\n          ( typeof(ctrl.style.visibility) != \"undefined\" &&\n            ctrl.style.visibility == \"hidden\") ) ) {\n        return false;\n    }\n    else if (typeof(ctrl.parentNode) != \"undefined\" &&\n             ctrl.parentNode != null &&\n             ctrl.parentNode != ctrl) {\n        return IsInVisibleContainer(ctrl.parentNode);\n    }\n    return true;\n}\nfunction IsValidationGroupMatch(control, validationGroup) {\n    if ((typeof(validationGroup) == \"undefined\") || (validationGroup == null)) {\n        return true;\n    }\n    var controlGroup = \"\";\n    if (typeof(control.validationGroup) == \"string\") {\n        controlGroup = control.validationGroup;\n    }\n    return (controlGroup == validationGroup);\n}\nfunction ValidatorOnLoad() {\n    if (typeof(Page_Validators) == \"undefined\")\n        return;\n    var i, val;\n    for (i = 0; i < Page_Validators.length; i++) {\n        val = Page_Validators[i];\n        if (typeof(val.evaluationfunction) == \"string\") {\n            eval(\"val.evaluationfunction = \" + val.evaluationfunction + \";\");\n        }\n        if (typeof(val.isvalid) == \"string\") {\n            if (val.isvalid == \"False\") {\n                val.isvalid = false;\n                Page_IsValid = false;\n            }\n            else {\n                val.isvalid = true;\n            }\n        } else {\n            val.isvalid = true;\n        }\n        if (typeof(val.enabled) == \"string\") {\n            val.enabled = (val.enabled != \"False\");\n        }\n        if (typeof(val.controltovalidate) == \"string\") {\n            ValidatorHookupControlID(val.controltovalidate, val);\n        }\n        if (typeof(val.controlhookup) == \"string\") {\n            ValidatorHookupControlID(val.controlhookup, val);\n        }\n    }\n    Page_ValidationActive = true;\n}\nfunction ValidatorConvert(op, dataType, val) {\n    function GetFullYear(year) {\n        var twoDigitCutoffYear = val.cutoffyear % 100;\n        var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;\n        return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));\n    }\n    var num, cleanInput, m, exp;\n    if (dataType == \"Integer\") {\n        exp = /^\\s*[-\\+]?\\d+\\s*$/;\n        if (op.match(exp) == null)\n            return null;\n        num = parseInt(op, 10);\n        return (isNaN(num) ? null : num);\n    }\n    else if(dataType == \"Double\") {\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?(\\\\d*)\\\\\" + val.decimalchar + \"?(\\\\d*)\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && m[3].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + (m[2].length>0 ? m[2] : \"0\") + (m[3].length>0 ? \".\" + m[3] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Currency\") {\n        var hasDigits = (val.digits > 0);\n        var beginGroupSize, subsequentGroupSize;\n        var groupSizeNum = parseInt(val.groupsize, 10);\n        if (!isNaN(groupSizeNum) && groupSizeNum > 0) {\n            beginGroupSize = \"{1,\" + groupSizeNum + \"}\";\n            subsequentGroupSize = \"{\" + groupSizeNum + \"}\";\n        }\n        else {\n            beginGroupSize = subsequentGroupSize = \"+\";\n        }\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?((\\\\d\" + beginGroupSize + \"(\\\\\" + val.groupchar + \"\\\\d\" + subsequentGroupSize + \")+)|\\\\d*)\"\n                        + (hasDigits ? \"\\\\\" + val.decimalchar + \"?(\\\\d{0,\" + val.digits + \"})\" : \"\")\n                        + \"\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && hasDigits && m[5].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + m[2].replace(new RegExp(\"(\\\\\" + val.groupchar + \")\", \"g\"), \"\") + ((hasDigits && m[5].length > 0) ? \".\" + m[5] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Date\") {\n        var yearFirstExp = new RegExp(\"^\\\\s*((\\\\d{4})|(\\\\d{2}))([-/]|\\\\. ?)(\\\\d{1,2})\\\\4(\\\\d{1,2})\\\\.?\\\\s*$\");\n        m = op.match(yearFirstExp);\n        var day, month, year;\n        if (m != null && (((typeof(m[2]) != \"undefined\") && (m[2].length == 4)) || val.dateorder == \"ymd\")) {\n            day = m[6];\n            month = m[5];\n            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));\n        }\n        else {\n            if (val.dateorder == \"ymd\"){\n                return null;\n            }\n            var yearLastExp = new RegExp(\"^\\\\s*(\\\\d{1,2})([-/]|\\\\. ?)(\\\\d{1,2})(?:\\\\s|\\\\2)((\\\\d{4})|(\\\\d{2}))(?:\\\\s\\u0433\\\\.|\\\\.)?\\\\s*$\");\n            m = op.match(yearLastExp);\n            if (m == null) {\n                return null;\n            }\n            if (val.dateorder == \"mdy\") {\n                day = m[3];\n                month = m[1];\n            }\n            else {\n                day = m[1];\n                month = m[3];\n            }\n            year = ((typeof(m[5]) != \"undefined\") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10));\n        }\n        month -= 1;\n        var date = new Date(year, month, day);\n        if (year < 100) {\n            date.setFullYear(year);\n        }\n        return (typeof(date) == \"object\" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;\n    }\n    else {\n        return op.toString();\n    }\n}\nfunction ValidatorCompare(operand1, operand2, operator, val) {\n    var dataType = val.type;\n    var op1, op2;\n    if ((op1 = ValidatorConvert(operand1, dataType, val)) == null)\n        return false;\n    if (operator == \"DataTypeCheck\")\n        return true;\n    if ((op2 = ValidatorConvert(operand2, dataType, val)) == null)\n        return true;\n    switch (operator) {\n        case \"NotEqual\":\n            return (op1 != op2);\n        case \"GreaterThan\":\n            return (op1 > op2);\n        case \"GreaterThanEqual\":\n            return (op1 >= op2);\n        case \"LessThan\":\n            return (op1 < op2);\n        case \"LessThanEqual\":\n            return (op1 <= op2);\n        default:\n            return (op1 == op2);\n    }\n}\nfunction CompareValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var compareTo = \"\";\n    if ((typeof(val.controltocompare) != \"string\") ||\n        (typeof(document.getElementById(val.controltocompare)) == \"undefined\") ||\n        (null == document.getElementById(val.controltocompare))) {\n        if (typeof(val.valuetocompare) == \"string\") {\n            compareTo = val.valuetocompare;\n        }\n    }\n    else {\n        compareTo = ValidatorGetValue(val.controltocompare);\n    }\n    var operator = \"Equal\";\n    if (typeof(val.operator) == \"string\") {\n        operator = val.operator;\n    }\n    return ValidatorCompare(value, compareTo, operator, val);\n}\nfunction CustomValidatorEvaluateIsValid(val) {\n    var value = \"\";\n    if (typeof(val.controltovalidate) == \"string\") {\n        value = ValidatorGetValue(val.controltovalidate);\n        if ((ValidatorTrim(value).length == 0) &&\n            ((typeof(val.validateemptytext) != \"string\") || (val.validateemptytext != \"true\"))) {\n            return true;\n        }\n    }\n    var args = { Value:value, IsValid:true };\n    if (typeof(val.clientvalidationfunction) == \"string\") {\n        eval(val.clientvalidationfunction + \"(val, args) ;\");\n    }\n    return args.IsValid;\n}\nfunction RegularExpressionValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var rx = new RegExp(val.validationexpression);\n    var matches = rx.exec(value);\n    return (matches != null && value == matches[0]);\n}\nfunction ValidatorTrim(s) {\n    var m = s.match(/^\\s*(\\S+(\\s+\\S+)*)\\s*$/);\n    return (m == null) ? \"\" : m[1];\n}\nfunction RequiredFieldValidatorEvaluateIsValid(val) {\n    return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))\n}\nfunction RangeValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    return (ValidatorCompare(value, val.minimumvalue, \"GreaterThanEqual\", val) &&\n            ValidatorCompare(value, val.maximumvalue, \"LessThanEqual\", val));\n}\nfunction ValidationSummaryOnSubmit(validationGroup) {\n    if (typeof(Page_ValidationSummaries) == \"undefined\")\n        return;\n    var summary, sums, s;\n    var headerSep, first, pre, post, end;\n    for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {\n        summary = Page_ValidationSummaries[sums];\n        if (!summary) continue;\n        summary.style.display = \"none\";\n        if (!Page_IsValid && IsValidationGroupMatch(summary, validationGroup)) {\n            var i;\n            if (summary.showsummary != \"False\") {\n                summary.style.display = \"\";\n                if (typeof(summary.displaymode) != \"string\") {\n                    summary.displaymode = \"BulletList\";\n                }\n                switch (summary.displaymode) {\n                    case \"List\":\n                        headerSep = \"<br>\";\n                        first = \"\";\n                        pre = \"\";\n                        post = \"<br>\";\n                        end = \"\";\n                        break;\n                    case \"BulletList\":\n                    default:\n                        headerSep = \"\";\n                        first = \"<ul>\";\n                        pre = \"<li>\";\n                        post = \"</li>\";\n                        end = \"</ul>\";\n                        break;\n                    case \"SingleParagraph\":\n                        headerSep = \" \";\n                        first = \"\";\n                        pre = \"\";\n                        post = \" \";\n                        end = \"<br>\";\n                        break;\n                }\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + headerSep;\n                }\n                s += first;\n                for (i=0; i<Page_Validators.length; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        s += pre + Page_Validators[i].errormessage + post;\n                    }\n                }\n                s += end;\n                summary.innerHTML = s;\n                window.scrollTo(0,0);\n            }\n            if (summary.showmessagebox == \"True\") {\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + \"\\r\\n\";\n                }\n                var lastValIndex = Page_Validators.length - 1;\n                for (i=0; i<=lastValIndex; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        switch (summary.displaymode) {\n                            case \"List\":\n                                s += Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"BulletList\":\n                            default:\n                                s += \"- \" + Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"SingleParagraph\":\n                                s += Page_Validators[i].errormessage + \" \";\n                                break;\n                        }\n                    }\n                }\n                alert(s);\n            }\n        }\n    }\n}\nif (window.jQuery) {\n    (function ($) {\n        var dataValidationAttribute = \"data-val\",\n            dataValidationSummaryAttribute = \"data-valsummary\",\n            normalizedAttributes = { validationgroup: \"validationGroup\", focusonerror: \"focusOnError\" };\n        function getAttributesWithPrefix(element, prefix) {\n            var i,\n                attribute,\n                list = {},\n                attributes = element.attributes,\n                length = attributes.length,\n                prefixLength = prefix.length;\n            prefix = prefix.toLowerCase();\n            for (i = 0; i < length; i++) {\n                attribute = attributes[i];\n                if (attribute.specified && attribute.name.substr(0, prefixLength).toLowerCase() === prefix) {\n                    list[attribute.name.substr(prefixLength)] = attribute.value;\n                }\n            }\n            return list;\n        }\n        function normalizeKey(key) {\n            key = key.toLowerCase();\n            return normalizedAttributes[key] === undefined ? key : normalizedAttributes[key];\n        }\n        function addValidationExpando(element) {\n            var attributes = getAttributesWithPrefix(element, dataValidationAttribute + \"-\");\n            $.each(attributes, function (key, value) {\n                element[normalizeKey(key)] = value;\n            });\n        }\n        function dispose(element) {\n            var index = $.inArray(element, Page_Validators);\n            if (index >= 0) {\n                Page_Validators.splice(index, 1);\n            }\n        }\n        function addNormalizedAttribute(name, normalizedName) {\n            normalizedAttributes[name.toLowerCase()] = normalizedName;\n        }\n        function parseSpecificAttribute(selector, attribute, validatorsArray) {\n            return $(selector).find(\"[\" + attribute + \"='true']\").each(function (index, element) {\n                addValidationExpando(element);\n                element.dispose = function () { dispose(element); element.dispose = null; };\n                if ($.inArray(element, validatorsArray) === -1) {\n                    validatorsArray.push(element);\n                }\n            }).length;\n        }\n        function parse(selector) {\n            var length = parseSpecificAttribute(selector, dataValidationAttribute, Page_Validators);\n            length += parseSpecificAttribute(selector, dataValidationSummaryAttribute, Page_ValidationSummaries);\n            return length;\n        }\n        function loadValidators() {\n            if (typeof (ValidatorOnLoad) === \"function\") {\n                ValidatorOnLoad();\n            }\n            if (typeof (ValidatorOnSubmit) === \"undefined\") {\n                window.ValidatorOnSubmit = function () {\n                    return Page_ValidationActive ? ValidatorCommonOnSubmit() : true;\n                };\n            }\n        }\n        function registerUpdatePanel() {\n            if (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {\n                var prm = Sys.WebForms.PageRequestManager.getInstance(),\n                    postBackElement, endRequestHandler;\n                if (prm.get_isInAsyncPostBack()) {\n                    endRequestHandler = function (sender, args) {\n                        if (parse(document)) {\n                            loadValidators();\n                        }\n                        prm.remove_endRequest(endRequestHandler);\n                        endRequestHandler = null;\n                    };\n                    prm.add_endRequest(endRequestHandler);\n                }\n                prm.add_beginRequest(function (sender, args) {\n                    postBackElement = args.get_postBackElement();\n                });\n                prm.add_pageLoaded(function (sender, args) {\n                    var i, panels, valFound = 0;\n                    if (typeof (postBackElement) === \"undefined\") {\n                        return;\n                    }\n                    panels = args.get_panelsUpdated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    panels = args.get_panelsCreated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    if (valFound) {\n                        loadValidators();\n                    }\n                });\n            }\n        }\n        $(function () {\n            if (typeof (Page_Validators) === \"undefined\") {\n                window.Page_Validators = [];\n            }\n            if (typeof (Page_ValidationSummaries) === \"undefined\") {\n                window.Page_ValidationSummaries = [];\n            }\n            if (typeof (Page_ValidationActive) === \"undefined\") {\n                window.Page_ValidationActive = false;\n            }\n            $.WebFormValidator = {\n                addNormalizedAttribute: addNormalizedAttribute,\n                parse: parse\n            };\n            if (parse(document)) {\n                loadValidators();\n            }\n            registerUpdatePanel();\n        });\n    } (jQuery));\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/bootstrap.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n\n/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/\nif (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#carousel\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#collapse\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    var $el = $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#modals\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#popovers\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tabs\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#affix\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.intellisense.js",
    "content": "﻿/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\nintellisense.annotate(jQuery, {\n  'ajax': function() {\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup().</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'ajaxPrefilter': function() {\n    /// <signature>\n    ///   <summary>Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().</summary>\n    ///   <param name=\"dataTypes\" type=\"String\">An optional string containing one or more space-separated dataTypes</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to set default values for future Ajax requests.</param>\n    /// </signature>\n  },\n  'ajaxSetup': function() {\n    /// <signature>\n    ///   <summary>Set default values for future Ajax requests.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A set of key/value pairs that configure the default Ajax request. All options are optional.</param>\n    /// </signature>\n  },\n  'ajaxTransport': function() {\n    /// <signature>\n    ///   <summary>Creates an object that handles the actual transmission of Ajax data.</summary>\n    ///   <param name=\"dataType\" type=\"String\">A string identifying the data type to use</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to return the new transport object to use with the data type provided in the first argument.</param>\n    /// </signature>\n  },\n  'boxModel': function() {\n    /// <summary>Deprecated in jQuery 1.3 (see jQuery.support). States if the current page, in the user's browser, is being rendered using the W3C CSS Box Model.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'browser': function() {\n    /// <summary>Contains flags for the useragent, read from navigator.userAgent. We recommend against using this property; please try to use feature detection instead (see jQuery.support). jQuery.browser may be moved to a plugin in a future release of jQuery.</summary>\n    /// <returns type=\"PlainObject\" />\n  },\n  'browser.version': function() {\n    /// <summary>The version number of the rendering engine for the user's browser.</summary>\n    /// <returns type=\"String\" />\n  },\n  'Callbacks': function() {\n    /// <signature>\n    ///   <summary>A multi-purpose callbacks list object that provides a powerful way to manage callback lists.</summary>\n    ///   <param name=\"flags\" type=\"String\">An optional list of space-separated flags that change how the callback list behaves.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM element is a descendant of another DOM element.</summary>\n    ///   <param name=\"container\" type=\"Element\">The DOM element that may contain the other element.</param>\n    ///   <param name=\"contained\" type=\"Element\">The DOM element that may be contained by (a descendant of) the other element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'cssHooks': function() {\n    /// <summary>Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <param name=\"key\" type=\"String\">Name of the data stored.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'Deferred': function() {\n    /// <signature>\n    ///   <summary>A constructor function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.</summary>\n    ///   <param name=\"beforeStart\" type=\"Function\">A function that is called just before the constructor returns.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove and execute a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    /// </signature>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties.</summary>\n    ///   <param name=\"collection\" type=\"Object\">The object or array to iterate over.</param>\n    ///   <param name=\"callback(indexInArray, valueOfElement)\" type=\"Function\">The function that will be executed on every object.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Takes a string and throws an exception containing it.</summary>\n    ///   <param name=\"message\" type=\"String\">The message to send out.</param>\n    /// </signature>\n  },\n  'extend': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"target\" type=\"Object\">An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"deep\" type=\"Boolean\">If true, the merge becomes recursive (aka. deep copy).</param>\n    ///   <param name=\"target\" type=\"Object\">The object to extend. It will receive the new properties.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP GET request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getJSON': function() {\n    /// <signature>\n    ///   <summary>Load JSON-encoded data from the server using a GET HTTP request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getScript': function() {\n    /// <signature>\n    ///   <summary>Load a JavaScript file from the server using a GET HTTP request, then execute it.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"success(script, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'globalEval': function() {\n    /// <signature>\n    ///   <summary>Execute some JavaScript code globally.</summary>\n    ///   <param name=\"code\" type=\"String\">The JavaScript code to execute.</param>\n    /// </signature>\n  },\n  'grep': function() {\n    /// <signature>\n    ///   <summary>Finds the elements of an array which satisfy a filter function. The original array is not affected.</summary>\n    ///   <param name=\"array\" type=\"Array\">The array to search through.</param>\n    ///   <param name=\"function(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the item, and the second argument is the index.  The function should return a Boolean value.  this will be the global window object.</param>\n    ///   <param name=\"invert\" type=\"Boolean\">If \"invert\" is false, or not provided, then the function returns an array consisting of all elements for which \"callback\" returns true.  If \"invert\" is true, then the function returns an array consisting of all elements for which \"callback\" returns false.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'hasData': function() {\n    /// <signature>\n    ///   <summary>Determine whether an element has any jQuery data associated with it.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to be checked for data.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'holdReady': function() {\n    /// <signature>\n    ///   <summary>Holds or releases the execution of jQuery's ready event.</summary>\n    ///   <param name=\"hold\" type=\"Boolean\">Indicates whether the ready hold is being requested or released</param>\n    /// </signature>\n  },\n  'inArray': function() {\n    /// <signature>\n    ///   <summary>Search for a specified value within an array and return its index (or -1 if not found).</summary>\n    ///   <param name=\"value\" type=\"Anything\">The value to search for.</param>\n    ///   <param name=\"array\" type=\"Array\">An array through which to search.</param>\n    ///   <param name=\"fromIndex\" type=\"Number\">The index of the array at which to begin the search. The default is 0, which will search the whole array.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'isArray': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is an array.</summary>\n    ///   <param name=\"obj\" type=\"Object\">Object to test whether or not it is an array.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isEmptyObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is empty (contains no enumerable properties).</summary>\n    ///   <param name=\"object\" type=\"Object\">The object that will be checked to see if it's empty.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isFunction': function() {\n    /// <signature>\n    ///   <summary>Determine if the argument passed is a Javascript function object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a function.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isNumeric': function() {\n    /// <signature>\n    ///   <summary>Determines whether its argument is a number.</summary>\n    ///   <param name=\"value\" type=\"PlainObject\">The value to be tested.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isPlainObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is a plain object (created using \"{}\" or \"new Object\").</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">The object that will be checked to see if it's a plain object.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isWindow': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is a window.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a window.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isXMLDoc': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM node is within an XML document (or is an XML document).</summary>\n    ///   <param name=\"node\" type=\"Element\">The DOM node that will be checked to see if it's in an XML document.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'makeArray': function() {\n    /// <signature>\n    ///   <summary>Convert an array-like object into a true JavaScript array.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Any object to turn into a native Array.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array to translate.</param>\n    ///   <param name=\"callback(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"arrayOrObject\" type=\"Object\">The Array or Object to translate.</param>\n    ///   <param name=\"callback( value, indexOrKey )\" type=\"Function\">The function to process each item against.  The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'merge': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two arrays together into the first array.</summary>\n    ///   <param name=\"first\" type=\"Array\">The first array to merge, the elements of second added.</param>\n    ///   <param name=\"second\" type=\"Array\">The second array to merge into the first, unaltered.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'noConflict': function() {\n    /// <signature>\n    ///   <summary>Relinquish jQuery's control of the $ variable.</summary>\n    ///   <param name=\"removeAll\" type=\"Boolean\">A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself).</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'noop': function() {\n    /// <summary>An empty function.</summary>\n  },\n  'now': function() {\n    /// <summary>Return a number representing the current time.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'param': function() {\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <param name=\"traditional\" type=\"Boolean\">A Boolean indicating whether to perform a traditional \"shallow\" serialization.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'parseHTML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an array of DOM nodes.</summary>\n    ///   <param name=\"data\" type=\"String\">HTML string to be parsed</param>\n    ///   <param name=\"context\" type=\"Element\">DOM element to serve as the context in which the HTML fragment will be created</param>\n    ///   <param name=\"keepScripts\" type=\"Boolean\">A Boolean indicating whether to include scripts passed in the HTML string</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'parseJSON': function() {\n    /// <signature>\n    ///   <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>\n    ///   <param name=\"json\" type=\"String\">The JSON string to parse.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'parseXML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an XML document.</summary>\n    ///   <param name=\"data\" type=\"String\">a well-formed XML string to be parsed</param>\n    ///   <returns type=\"XMLDocument\" />\n    /// </signature>\n  },\n  'post': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP POST request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'proxy': function() {\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function referenced in the function argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function named in the name argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element where the array of queued functions is attached.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element on which to add a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback()\" type=\"Function\">The new function to add to the queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove data.</param>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'sub': function() {\n    /// <summary>Creates a new copy of jQuery whose properties and methods can be modified without affecting the original jQuery object.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'support': function() {\n    /// <summary>A collection of properties that represent the presence of different browser features or bugs. Primarily intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'trim': function() {\n    /// <signature>\n    ///   <summary>Remove the whitespace from the beginning and end of a string.</summary>\n    ///   <param name=\"str\" type=\"String\">The string to trim.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'type': function() {\n    /// <signature>\n    ///   <summary>Determine the internal JavaScript [[Class]] of an object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to get the internal JavaScript [[Class]] of.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'unique': function() {\n    /// <signature>\n    ///   <summary>Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array of DOM elements.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'when': function() {\n    /// <signature>\n    ///   <summary>Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.</summary>\n    ///   <param name=\"deferreds\" type=\"Deferred\">One or more Deferred objects, or plain JavaScript objects.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nvar _1228819969 = jQuery.Callbacks;\njQuery.Callbacks = function(flags) {\nvar _object = _1228819969(flags);\nintellisense.annotate(_object, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add a callback or a collection of callbacks to a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be added to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'disable': function() {\n    /// <summary>Disable a callback list from doing anything more.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'disabled': function() {\n    /// <summary>Determine if the callbacks list has been disabled.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'empty': function() {\n    /// <summary>Remove all of the callbacks from a list.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'fire': function() {\n    /// <signature>\n    ///   <summary>Call all of the callbacks with the given arguments</summary>\n    ///   <param name=\"arguments\" type=\"Anything\">The argument or list of arguments to pass back to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'fired': function() {\n    /// <summary>Determine if the callbacks have already been called at least once.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'fireWith': function() {\n    /// <signature>\n    ///   <summary>Call all callbacks in a list with the given context and arguments.</summary>\n    ///   <param name=\"context\" type=\"\">A reference to the context in which the callbacks in the list should be fired.</param>\n    ///   <param name=\"args\" type=\"\">An argument, or array of arguments, to pass to the callbacks in the list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Determine whether a supplied callback is in a list</summary>\n    ///   <param name=\"callback\" type=\"Function\">The callback to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'lock': function() {\n    /// <summary>Lock a callback list in its current state.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'locked': function() {\n    /// <summary>Determine if the callbacks list has been locked.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove a callback or a collection of callbacks from a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be removed from the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _1228819969);\n\nvar _731531622 = jQuery.Deferred;\njQuery.Deferred = function(func) {\nvar _object = _731531622(func);\nintellisense.annotate(_object, {\n  'always': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is either resolved or rejected.</summary>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred is resolved or rejected.</param>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'done': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is resolved.</param>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'fail': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is rejected.</summary>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is rejected.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'isRejected': function() {\n    /// <summary>Determine whether a Deferred object has been rejected.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isResolved': function() {\n    /// <summary>Determine whether a Deferred object has been resolved.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'notify': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'notifyWith': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the progressCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'pipe': function() {\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'progress': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object generates progress notifications.</summary>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred generates progress notifications.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Deferred's Promise object.</summary>\n    ///   <param name=\"target\" type=\"Object\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'reject': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'rejectWith': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the failCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolve': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolveWith': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the doneCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'state': function() {\n    /// <summary>Determine the current state of a Deferred object.</summary>\n    /// <returns type=\"String\" />\n  },\n  'then': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">A function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred notifies progress.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _731531622);\n\nintellisense.annotate(jQuery.Event.prototype, {\n  'currentTarget': function() {\n    /// <summary>The current DOM element within the event bubbling phase.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'data': function() {\n    /// <summary>An optional object of data passed to an event method when the current executing handler is bound.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'delegateTarget': function() {\n    /// <summary>The element where the currently-called jQuery event handler was attached.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'isDefaultPrevented': function() {\n    /// <summary>Returns whether event.preventDefault() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isImmediatePropagationStopped': function() {\n    /// <summary>Returns whether event.stopImmediatePropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isPropagationStopped': function() {\n    /// <summary>Returns whether event.stopPropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'metaKey': function() {\n    /// <summary>Indicates whether the META key was pressed when the event fired.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'namespace': function() {\n    /// <summary>The namespace specified when the event was triggered.</summary>\n    /// <returns type=\"String\" />\n  },\n  'pageX': function() {\n    /// <summary>The mouse position relative to the left edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'pageY': function() {\n    /// <summary>The mouse position relative to the top edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'preventDefault': function() {\n    /// <summary>If this method is called, the default action of the event will not be triggered.</summary>\n  },\n  'relatedTarget': function() {\n    /// <summary>The other DOM element involved in the event, if any.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'result': function() {\n    /// <summary>The last value returned by an event handler that was triggered by this event, unless the value was undefined.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'stopImmediatePropagation': function() {\n    /// <summary>Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree.</summary>\n  },\n  'stopPropagation': function() {\n    /// <summary>Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.</summary>\n  },\n  'target': function() {\n    /// <summary>The DOM element that initiated the event.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'timeStamp': function() {\n    /// <summary>The difference in milliseconds between the time the browser created the event and January 1, 1970.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'type': function() {\n    /// <summary>Describes the nature of the event.</summary>\n    /// <returns type=\"String\" />\n  },\n  'which': function() {\n    /// <summary>For key or mouse events, this property indicates the specific key or button that was pressed.</summary>\n    /// <returns type=\"Number\" />\n  },\n});\n\nintellisense.annotate(jQuery.fn, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"html\" type=\"String\">An HTML fragment to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery object \">An existing jQuery object to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <param name=\"context\" type=\"Element\">The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addBack': function() {\n    /// <signature>\n    ///   <summary>Add the previous set of elements on the stack to the current set, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addClass': function() {\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be added to the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"function(index, currentClass)\" type=\"Function\">A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'after': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxComplete': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete. This is an AjaxEvent.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxError': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxSettings, thrownError)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSend': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed before an Ajax request is sent. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStart': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when the first Ajax request begins. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStop': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when all Ajax requests have completed. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSuccess': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'all': function() {\n    /// <summary>Selects all elements.</summary>\n  },\n  'andSelf': function() {\n    /// <summary>Add the previous set of elements on the stack to the current set.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'animate': function() {\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'animated': function() {\n    /// <summary>Select all elements that are in the progress of an animation at the time the selector is run.</summary>\n  },\n  'append': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'appendTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the end of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attr': function() {\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the attribute.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributes\" type=\"PlainObject\">An object of attribute-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"function(index, attr)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attributeContains': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing the a given substring.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsPrefix': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-).</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsWord': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing a given word, delimited by spaces.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEndsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEquals': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value exactly equal to a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeHas': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute, with any value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    /// </signature>\n  },\n  'attributeMultiple': function() {\n    /// <signature>\n    ///   <summary>Matches elements that match all of the specified attribute filters.</summary>\n    ///   <param name=\"attributeFilter1\" type=\"String\">An attribute filter.</param>\n    ///   <param name=\"attributeFilter2\" type=\"String\">Another attribute filter, reducing the selection even more</param>\n    ///   <param name=\"attributeFilterN\" type=\"String\">As many more attribute filters as necessary</param>\n    /// </signature>\n  },\n  'attributeNotEqual': function() {\n    /// <signature>\n    ///   <summary>Select elements that either don't have the specified attribute, or do have the specified attribute but not with a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeStartsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value beginning exactly with a given string.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'before': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert before each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'bind': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"preventBubble\" type=\"Boolean\">Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"events\" type=\"Object\">An object containing one or more DOM event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'blur': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'button': function() {\n    /// <summary>Selects all button elements and elements of type button.</summary>\n  },\n  'change': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'checkbox': function() {\n    /// <summary>Selects all elements of type checkbox.</summary>\n  },\n  'checked': function() {\n    /// <summary>Matches all elements that are checked.</summary>\n  },\n  'child': function() {\n    /// <signature>\n    ///   <summary>Selects all direct child elements specified by \"child\" of elements specified by \"parent\".</summary>\n    ///   <param name=\"parent\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"child\" type=\"String\">A selector to filter the child elements.</param>\n    /// </signature>\n  },\n  'children': function() {\n    /// <signature>\n    ///   <summary>Get the children of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'class': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given class.</summary>\n    ///   <param name=\"class\" type=\"String\">A class to search for. An element can have multiple classes; only one of them must match.</param>\n    /// </signature>\n  },\n  'clearQueue': function() {\n    /// <signature>\n    ///   <summary>Remove from the queue all items that have not yet been run.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'click': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'clone': function() {\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers should be copied along with the elements. As of jQuery 1.4, element data will be copied as well.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back to false in 1.5.1 and up.</param>\n    ///   <param name=\"deepWithDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'closest': function() {\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <param name=\"context\" type=\"Element\">A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Select all elements that contain the specified text.</summary>\n    ///   <param name=\"text\" type=\"String\">A string of text to look for. It's case sensitive.</param>\n    /// </signature>\n  },\n  'contents': function() {\n    /// <summary>Get the children of each element in the set of matched elements, including text and comment nodes.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'context': function() {\n    /// <summary>The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'css': function() {\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"key\" type=\"String\">A string naming the piece of data to set.</param>\n    ///   <param name=\"value\" type=\"Object\">The new data value; it can be any Javascript type including Array or Object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An object of key-value pairs of data to update.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dblclick': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delay': function() {\n    /// <signature>\n    ///   <summary>Set a timer to delay execution of subsequent items in the queue.</summary>\n    ///   <param name=\"duration\" type=\"Number\">An integer indicating the number of milliseconds to delay execution of the next item in the queue.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delegate': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched elements.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'descendant': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are descendants of a given ancestor.</summary>\n    ///   <param name=\"ancestor\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"descendant\" type=\"String\">A selector to filter the descendant elements.</param>\n    /// </signature>\n  },\n  'detach': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'die': function() {\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or keydown.</param>\n    ///   <param name=\"handler\" type=\"String\">The function that is no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types, such as click or keydown and their corresponding functions that are no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'disabled': function() {\n    /// <summary>Selects all elements that are disabled.</summary>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>Iterate over a jQuery object, executing a function for each matched element.</summary>\n    ///   <param name=\"function(index, Element)\" type=\"Function\">A function to execute for each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'element': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given tag name.</summary>\n    ///   <param name=\"element\" type=\"String\">An element to search for. Refers to the tagName of DOM nodes.</param>\n    /// </signature>\n  },\n  'empty': function() {\n    /// <summary>Select all elements that have no children (including text nodes).</summary>\n  },\n  'enabled': function() {\n    /// <summary>Selects all elements that are enabled.</summary>\n  },\n  'end': function() {\n    /// <summary>End the most recent filtering operation in the current chain and return the set of matched elements to its previous state.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'eq': function() {\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index of the element to match.</param>\n    /// </signature>\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"-index\" type=\"Number\">Zero-based index of the element to match, counting backwards from the last element.</param>\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'even': function() {\n    /// <summary>Selects even elements, zero-indexed.  See also odd.</summary>\n  },\n  'fadeIn': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeOut': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeTo': function() {\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'file': function() {\n    /// <summary>Selects all elements of type file.</summary>\n  },\n  'filter': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'find': function() {\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'finish': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'first': function() {\n    /// <summary>Selects the first matched element.</summary>\n  },\n  'first-child': function() {\n    /// <summary>Selects all elements that are the first child of their parent.</summary>\n  },\n  'first-of-type': function() {\n    /// <summary>Selects all elements that are the first among siblings of the same element name.</summary>\n  },\n  'focus': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusin': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Retrieve the DOM elements matched by the jQuery object.</summary>\n    ///   <param name=\"index\" type=\"Number\">A zero-based integer indicating which element to retrieve.</param>\n    ///   <returns type=\"Element, Array\" />\n    /// </signature>\n  },\n  'gt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index greater than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"contained\" type=\"Element\">A DOM element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hasClass': function() {\n    /// <signature>\n    ///   <summary>Determine whether any of the matched elements are assigned the given class.</summary>\n    ///   <param name=\"className\" type=\"String\">The class name to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'header': function() {\n    /// <summary>Selects all elements that are headers, like h1, h2, h3 and so on.</summary>\n  },\n  'height': function() {\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"function(index, height)\" type=\"Function\">A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hidden': function() {\n    /// <summary>Selects all elements that are hidden.</summary>\n  },\n  'hide': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hover': function() {\n    /// <signature>\n    ///   <summary>Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements.</summary>\n    ///   <param name=\"handlerIn(eventObject)\" type=\"Function\">A function to execute when the mouse pointer enters the element.</param>\n    ///   <param name=\"handlerOut(eventObject)\" type=\"Function\">A function to execute when the mouse pointer leaves the element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'html': function() {\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"htmlString\" type=\"String\">A string of HTML to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, oldhtml)\" type=\"Function\">A function returning the HTML content to set. Receives the           index position of the element in the set and the old HTML value as arguments.           jQuery empties the element before calling the function;           use the oldhtml argument to reference the previous content.           Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'id': function() {\n    /// <signature>\n    ///   <summary>Selects a single element with the given id attribute.</summary>\n    ///   <param name=\"id\" type=\"String\">An ID to search for, specified via the id attribute of an element.</param>\n    /// </signature>\n  },\n  'image': function() {\n    /// <summary>Selects all elements of type image.</summary>\n  },\n  'index': function() {\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector representing a jQuery collection in which to look for an element.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"element\" type=\"jQuery\">The DOM element or first element within the jQuery object to look for.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'init': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'innerHeight': function() {\n    /// <summary>Get the current computed height for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'innerWidth': function() {\n    /// <summary>Get the current computed width for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'input': function() {\n    /// <summary>Selects all input, textarea, select and button elements.</summary>\n  },\n  'insertAfter': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements after the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'insertBefore': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements before the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'is': function() {\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'jquery': function() {\n    /// <summary>A string containing the jQuery version number.</summary>\n    /// <returns type=\"String\" />\n  },\n  'keydown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keypress': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keyup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lang': function() {\n    /// <signature>\n    ///   <summary>Selects all elements of the specified language.</summary>\n    ///   <param name=\"language\" type=\"String\">A language code.</param>\n    /// </signature>\n  },\n  'last': function() {\n    /// <summary>Selects the last matched element.</summary>\n  },\n  'last-child': function() {\n    /// <summary>Selects all elements that are the last child of their parent.</summary>\n  },\n  'last-of-type': function() {\n    /// <summary>Selects all elements that are the last among siblings of the same element name.</summary>\n  },\n  'length': function() {\n    /// <summary>The number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'live': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more JavaScript event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'load': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index less than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Pass each element in the current matched set through a function, producing a new jQuery object containing the return values.</summary>\n    ///   <param name=\"callback(index, domElement)\" type=\"Function\">A function object that will be invoked for each element in the current set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousedown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseenter': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseleave': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousemove': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseover': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'multiple': function() {\n    /// <signature>\n    ///   <summary>Selects the combined results of all the specified selectors.</summary>\n    ///   <param name=\"selector1\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"selector2\" type=\"String\">Another valid selector.</param>\n    ///   <param name=\"selectorN\" type=\"String\">As many more valid selectors as you like.</param>\n    /// </signature>\n  },\n  'next': function() {\n    /// <signature>\n    ///   <summary>Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'next adjacent': function() {\n    /// <signature>\n    ///   <summary>Selects all next elements matching \"next\" that are immediately preceded by a sibling \"prev\".</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"next\" type=\"String\">A selector to match the element that is next to the first selector.</param>\n    /// </signature>\n  },\n  'next siblings': function() {\n    /// <signature>\n    ///   <summary>Selects all sibling elements that follow after the \"prev\" element, have the same parent, and match the filtering \"siblings\" selector.</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"siblings\" type=\"String\">A selector to filter elements that are the following siblings of the first selector.</param>\n    /// </signature>\n  },\n  'nextAll': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nextUntil': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'not': function() {\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more DOM elements to remove from the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nth-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-child(even), :nth-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-of-type(even), :nth-last-of-type(4n) )</param>\n    /// </signature>\n  },\n  'nth-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth child of their parent in relation to siblings with the same element name.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-of-type(even), :nth-of-type(4n) )</param>\n    /// </signature>\n  },\n  'odd': function() {\n    /// <summary>Selects odd elements, zero-indexed.  See also even.</summary>\n  },\n  'off': function() {\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, or just namespaces, such as \"click\", \"keydown.myPlugin\", or \".myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A handler function previously attached for the event(s), or the special value false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offset': function() {\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"coordinates\" type=\"PlainObject\">An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"function(index, coords)\" type=\"Function\">A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offsetParent': function() {\n    /// <summary>Get the closest ancestor element that is positioned.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'on': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'one': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing one or more JavaScript event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'only-child': function() {\n    /// <summary>Selects all elements that are the only child of their parent.</summary>\n  },\n  'only-of-type': function() {\n    /// <summary>Selects all elements that have no siblings with the same element name.</summary>\n  },\n  'outerHeight': function() {\n    /// <signature>\n    ///   <summary>Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without \"px\") representation of the value or null if called on an empty set of elements.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'outerWidth': function() {\n    /// <signature>\n    ///   <summary>Get the current computed width for the first element in the set of matched elements, including padding and border.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'parent': function() {\n    /// <signature>\n    ///   <summary>Get the parent of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parents': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parentsUntil': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'password': function() {\n    /// <summary>Selects all elements of type password.</summary>\n  },\n  'position': function() {\n    /// <summary>Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'prepend': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prependTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the beginning of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prev': function() {\n    /// <signature>\n    ///   <summary>Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevAll': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevUntil': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.</summary>\n    ///   <param name=\"type\" type=\"String\">The type of queue that needs to be observed.</param>\n    ///   <param name=\"target\" type=\"PlainObject\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'prop': function() {\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"value\" type=\"Boolean\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"function(index, oldPropertyValue)\" type=\"Function\">A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'pushStack': function() {\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <param name=\"name\" type=\"String\">The name of a jQuery method that generated the array of elements.</param>\n    ///   <param name=\"arguments\" type=\"Array\">The arguments that were passed in to the jQuery method (for serialization).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback( next )\" type=\"Function\">The new function to add to the queue, with a function to call that will dequeue the next item.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'radio': function() {\n    /// <summary>Selects all  elements of type radio.</summary>\n  },\n  'ready': function() {\n    /// <signature>\n    ///   <summary>Specify a function to execute when the DOM is fully loaded.</summary>\n    ///   <param name=\"handler\" type=\"Function\">A function to execute after the DOM is ready.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeAttr': function() {\n    /// <signature>\n    ///   <summary>Remove an attribute from each element in the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">An attribute to remove; as of version 1.7, it can be a space-separated list of attributes.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeClass': function() {\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be removed from the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, class)\" type=\"Function\">A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"list\" type=\"String\">An array or space-separated string naming the pieces of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeProp': function() {\n    /// <signature>\n    ///   <summary>Remove a property for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceAll': function() {\n    /// <signature>\n    ///   <summary>Replace each target element with the set of matched elements.</summary>\n    ///   <param name=\"target\" type=\"String\">A selector expression indicating which element(s) to replace.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceWith': function() {\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"newContent\" type=\"jQuery\">The content to insert. May be an HTML string, DOM element, or jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns content with which to replace the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'reset': function() {\n    /// <summary>Selects all elements of type reset.</summary>\n  },\n  'resize': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'root': function() {\n    /// <signature>\n    ///   <summary>Selects the element that is the root of the document.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'scroll': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollLeft': function() {\n    /// <signature>\n    ///   <summary>Set the current horizontal position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollTop': function() {\n    /// <signature>\n    ///   <summary>Set the current vertical position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'select': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'selected': function() {\n    /// <summary>Selects all elements that are selected.</summary>\n  },\n  'selector': function() {\n    /// <summary>A selector representing selector originally passed to jQuery().</summary>\n    /// <returns type=\"String\" />\n  },\n  'serialize': function() {\n    /// <summary>Encode a set of form elements as a string for submission.</summary>\n    /// <returns type=\"String\" />\n  },\n  'serializeArray': function() {\n    /// <summary>Encode a set of form elements as an array of names and values.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'show': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'siblings': function() {\n    /// <signature>\n    ///   <summary>Get the siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'size': function() {\n    /// <summary>Return the number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'slice': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to a subset specified by a range of indices.</summary>\n    ///   <param name=\"start\" type=\"Number\">An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set.</param>\n    ///   <param name=\"end\" type=\"Number\">An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideDown': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideUp': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'stop': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'submit': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'target': function() {\n    /// <summary>Selects the target element indicated by the fragment identifier of the document's URI.</summary>\n  },\n  'text': function() {\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"textString\" type=\"String\">A string of text to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"function(index, text)\" type=\"Function\">A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toArray': function() {\n    /// <summary>Retrieve all the DOM elements contained in the jQuery set, as an array.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'toggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"showOrHide\" type=\"Boolean\">A Boolean indicating whether to show or hide the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toggleClass': function() {\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"function(index, class, switch)\" type=\"Function\">A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'trigger': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"PlainObject\">Additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"event\" type=\"Event\">A jQuery.Event object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'triggerHandler': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers attached to an element for an event.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"Array\">An array of additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'unbind': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">The function that is to be no longer executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"false\" type=\"Boolean\">Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"event\" type=\"Object\">A JavaScript event object as passed to an event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'undelegate': function() {\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">An object of one or more event types and previously bound functions to unbind from them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"namespace\" type=\"String\">A string containing a namespace to unbind all events from.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unload': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">A plain object of data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unwrap': function() {\n    /// <summary>Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'val': function() {\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Array\">A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'visible': function() {\n    /// <summary>Selects all elements that are visible.</summary>\n  },\n  'width': function() {\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, width)\" type=\"Function\">A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrap': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapAll': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around all elements in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapInner': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"String\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\nintellisense.annotate(window, {\n  '$': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * jQuery JavaScript Library v1.10.2\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:48Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// Support: IE<10\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.10.2\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler\n\tcompleted = function( event ) {\n\n\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\t\tdetach();\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\t// Clean-up method for dom ready events\n\tdetach = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t\t} else {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\t\twindow.detachEvent( \"onload\", completed );\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( jQuery.support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn core_hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.10.2\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\n\t\t});\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val === undefined ?\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull :\n\t\tval;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function( support ) {\n\n\tvar all, a, input, select, fragment, opt, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Finish early in limited (non-browser) environments\n\tall = div.getElementsByTagName(\"*\") || [];\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !a || !a.style || !all.length ) {\n\t\treturn support;\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName(\"tbody\").length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName(\"link\").length;\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Make sure that element opacity exists\n\t// (IE uses filter instead)\n\t// Use a regex to work around a WebKit issue. See #5145\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!a.style.cssFloat;\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone = document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Will be defined later\n\tsupport.inlineBlockNeedsLayout = false;\n\tsupport.shrinkWrapBlocks = false;\n\tsupport.pixelPosition = false;\n\tsupport.deleteExpando = true;\n\tsupport.noCloneEvent = true;\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: IE<9\n\t// Iteration over object's inherited properties before its own.\n\tfor ( i in jQuery( support ) ) {\n\t\tbreak;\n\t}\n\tsupport.ownLast = i !== \"0\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior.\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t\t// Support: IE<8\n\t\t\t\tbody.style.zoom = 1;\n\t\t\t}\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})({});\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"applet\": true,\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\tdata = null,\n\t\t\ti = 0,\n\t\t\telem = this[0];\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf(\"data-\") === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar ret, hooks, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Use proper attribute retrieval(#6932, #12072)\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\telem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\t\tret = isXML ?\n\t\t\t\t\tundefined :\n\t\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\t\tnull;\n\t\t\tjQuery.expr.attrHandle[ name ] = fn;\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\tjQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =\n\t\t// Some attributes are constructed with empty-string values when not defined\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\t(ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t};\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ret.specified ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tcur = ret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\nvar iframe, getStyles, curCSS,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar len, styles,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Otherwise expose jQuery to the global object as usual\n\twindow.jQuery = window.$ = jQuery;\n\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n})( window );\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/modernizr-2.6.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton; http://www.modernizr.com/license/\n *\n * Includes matchMedia polyfill; Copyright (c) 2010 Filament Group, Inc; http://opensource.org/licenses/MIT\n *\n * Includes material adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js; Copyright 2009-2012 by contributors; http://opensource.org/licenses/MIT\n *\n * Includes material from css-support; Copyright (c) 2005-2012 Diego Perini; https://github.com/dperini/css-support/blob/master/LICENSE\n *\n * NUGET: END LICENSE TEXT */\n\n/*!\n * Modernizr v2.6.2\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.6.2',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node, docOverflow,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body || document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style id=\"s', mod, '\">', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = '';\n          //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n          fakeBody.style.overflow = 'hidden';\n          docOverflow = docElement.style.overflow;\n          docElement.style.overflow = 'hidden';\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      if ( !body ) {\n          fakeBody.parentNode.removeChild(fakeBody);\n          docElement.style.overflow = docOverflow;\n      } else {\n          div.parentNode.removeChild(div);\n      }\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq).matches;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProp = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n\n        if (typeof target != \"function\") {\n            throw new TypeError();\n        }\n\n        var args = slice.call(arguments, 1),\n            bound = function () {\n\n            if (this instanceof bound) {\n\n              var F = function(){};\n              F.prototype = target.prototype;\n              var self = new F();\n\n              var result = target.apply(\n                  self,\n                  args.concat(slice.call(arguments))\n              );\n              if (Object(result) === result) {\n                  return result;\n              }\n              return self;\n\n            } else {\n\n              return target.apply(\n                  that,\n                  args.concat(slice.call(arguments))\n              );\n\n            }\n\n        };\n\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    // Because the testing of the CSS property names (with \"-\", as\n    // opposed to the camelCase DOM properties) is non-portable and\n    // non-standard but works in WebKit and IE (but not Gecko or Opera),\n    // we explicitly reject properties with dashes so that authors\n    // developing in WebKit or IE first don't end up with\n    // browser-specific content by accident.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            var prop = props[i];\n            if ( !contains(prop, \"-\") && mStyle[prop] !== undefined ) {\n                return prefixed == 'pfx' ? prop : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexWrap');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return (/(url\\s*\\(.*?){3}/).test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return (/^0.55$/).test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   daneden.me/2011/12/putting-up-with-androids-bullshit/\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1) +\n             // standard syntax             // trailing 'background-image:'\n              prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.getElementById('smodernizr'),\n              sheet = style.sheet || style.styleSheet,\n              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:\"',smile,'\";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 3;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProp(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProp( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (typeof enableClasses !== \"undefined\" && enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n    ;(function(window, document) {\n    /*jshint evil:true */\n      /** Preset options */\n      var options = window.html5 || {};\n\n      /** Used to skip problem elements */\n      var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n      /** Not all elements can be cloned in IE **/\n      var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n      /** Detect whether the browser supports default html5 styles */\n      var supportsHtml5Styles;\n\n      /** Name of the expando, to work with multiple documents or to re-shiv one document */\n      var expando = '_html5shiv';\n\n      /** The id for the the documents expando */\n      var expanID = 0;\n\n      /** Cached data for each document */\n      var expandoData = {};\n\n      /** Detect whether the browser supports unknown elements */\n      var supportsUnknownElements;\n\n      (function() {\n        try {\n            var a = document.createElement('a');\n            a.innerHTML = '<xyz></xyz>';\n            //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n            supportsHtml5Styles = ('hidden' in a);\n\n            supportsUnknownElements = a.childNodes.length == 1 || (function() {\n              // assign a false positive if unable to shiv\n              (document.createElement)('a');\n              var frag = document.createDocumentFragment();\n              return (\n                typeof frag.cloneNode == 'undefined' ||\n                typeof frag.createDocumentFragment == 'undefined' ||\n                typeof frag.createElement == 'undefined'\n              );\n            }());\n        } catch(e) {\n          supportsHtml5Styles = true;\n          supportsUnknownElements = true;\n        }\n\n      }());\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n\n        /**\n       * Returns the data associated to the given document\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @returns {Object} An object of data.\n       */\n      function getExpandoData(ownerDocument) {\n        var data = expandoData[ownerDocument[expando]];\n        if (!data) {\n            data = {};\n            expanID++;\n            ownerDocument[expando] = expanID;\n            expandoData[expanID] = data;\n        }\n        return data;\n      }\n\n      /**\n       * returns a shived element for the given nodeName and document\n       * @memberOf html5\n       * @param {String} nodeName name of the element\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived element.\n       */\n      function createElement(nodeName, ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createElement(nodeName);\n        }\n        if (!data) {\n            data = getExpandoData(ownerDocument);\n        }\n        var node;\n\n        if (data.cache[nodeName]) {\n            node = data.cache[nodeName].cloneNode();\n        } else if (saveClones.test(nodeName)) {\n            node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n        } else {\n            node = data.createElem(nodeName);\n        }\n\n        // Avoid adding some elements to fragments in IE < 9 because\n        // * Attributes like `name` or `type` cannot be set/changed once an element\n        //   is inserted into a document/fragment\n        // * Link elements with `src` attributes that are inaccessible, as with\n        //   a 403 response, will cause the tab/window to crash\n        // * Script elements appended to fragments will execute when their `src`\n        //   or `text` property is set\n        return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;\n      }\n\n      /**\n       * returns a shived DocumentFragment for the given document\n       * @memberOf html5\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived DocumentFragment.\n       */\n      function createDocumentFragment(ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createDocumentFragment();\n        }\n        data = data || getExpandoData(ownerDocument);\n        var clone = data.frag.cloneNode(),\n            i = 0,\n            elems = getElements(),\n            l = elems.length;\n        for(;i<l;i++){\n            clone.createElement(elems[i]);\n        }\n        return clone;\n      }\n\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       * @param {Object} data of the document.\n       */\n      function shivMethods(ownerDocument, data) {\n        if (!data.cache) {\n            data.cache = {};\n            data.createElem = ownerDocument.createElement;\n            data.createFrag = ownerDocument.createDocumentFragment;\n            data.frag = data.createFrag();\n        }\n\n\n        ownerDocument.createElement = function(nodeName) {\n          //abort shiv\n          if (!html5.shivMethods) {\n              return data.createElem(nodeName);\n          }\n          return createElement(nodeName, ownerDocument, data);\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n          'var n=f.cloneNode(),c=n.createElement;' +\n          'h.shivMethods&&(' +\n            // unroll the `createElement` calls\n            getElements().join().replace(/\\w+/g, function(nodeName) {\n              data.createElem(nodeName);\n              data.frag.createElement(nodeName);\n              return 'c(\"' + nodeName + '\")';\n            }) +\n          ');return n}'\n        )(html5, data.frag);\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n      function shivDocument(ownerDocument) {\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        var data = getExpandoData(ownerDocument);\n\n        if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n          data.hasCSS = !!addStyleSheet(ownerDocument,\n            // corrects block display not defined in IE6/7/8/9\n            'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +\n            // adds styling not present in IE6/7/8/9\n            'mark{background:#FF0;color:#000}'\n          );\n        }\n        if (!supportsUnknownElements) {\n          shivMethods(ownerDocument, data);\n        }\n        return ownerDocument;\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n      var html5 = {\n\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': (options.shivCSS !== false),\n\n        /**\n         * Is equal to true if a browser supports creating unknown/HTML5 elements\n         * @memberOf html5\n         * @type boolean\n         */\n        'supportsUnknownElements': supportsUnknownElements,\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': (options.shivMethods !== false),\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument,\n\n        //creates a shived element\n        createElement: createElement,\n\n        //creates a shived documentFragment\n        createDocumentFragment: createDocumentFragment\n      };\n\n      /*--------------------------------------------------------------------------*/\n\n      // expose html5\n      window.html5 = html5;\n\n      // shiv the document\n      shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/respond.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\nwindow.matchMedia = window.matchMedia || (function(doc, undefined){\n  \n  var bool,\n      docElem  = doc.documentElement,\n      refNode  = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement('body'),\n      div      = doc.createElement('div');\n  \n  div.id = 'mq-test-1';\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n  \n  return function(q){\n    \n    div.innerHTML = '&shy;<style media=\"'+q+'\"> #mq-test-1 { width: 42px; }</style>';\n    \n    docElem.insertBefore(fakeBody, refNode);\n    bool = div.offsetWidth == 42;  \n    docElem.removeChild(fakeBody);\n    \n    return { matches: bool, media: q };\n  };\n  \n})(document);\n\n\n\n\n/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\t//exposed namespace\n\twin.respond\t\t= {};\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update\t= function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){ return; }\n\t\n\t//define vars\n\tvar doc \t\t\t= win.document,\n\t\tdocElem \t\t= doc.documentElement,\n\t\tmediastyles\t\t= [],\n\t\trules\t\t\t= [],\n\t\tappendedEls \t= [],\n\t\tparsedSheets \t= {},\n\t\tresizeThrottle\t= 30,\n\t\thead \t\t\t= doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase\t\t\t= doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks\t\t\t= head.getElementsByTagName( \"link\" ),\n\t\trequestQueue\t= [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS\t\t\t= function(){\n\t\t\tvar sheets \t= links,\n\t\t\t\tsl \t\t= sheets.length,\n\t\t\t\ti\t\t= 0,\n\t\t\t\t//vars for loop:\n\t\t\t\tsheet, href, media, isCSS;\n\n\t\t\tfor( ; i < sl; i++ ){\n\t\t\t\tsheet\t= sheets[ i ],\n\t\t\t\thref\t= sheet.href,\n\t\t\t\tmedia\t= sheet.media,\n\t\t\t\tisCSS\t= sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base)\n\t\t\t\t\t\t\t|| href.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\t\t\t\t\tmakeRequests();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate\t\t\t= function( styles, href, media ){\n\t\t\tvar qs\t\t\t= styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql\t\t\t= qs && qs.length || 0,\n\t\t\t\t//try to get CSS path\n\t\t\t\thref\t\t= href.substring( 0, href.lastIndexOf( \"/\" )),\n\t\t\t\trepUrls\t\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia\t= !ql && media,\n\t\t\t\t//vars used in loop\n\t\t\t\ti\t\t\t= 0,\n\t\t\t\tj, fullq, thisq, eachq, eql;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\t\t\t\n\n\t\t\tfor( ; i < ql; i++ ){\n\t\t\t\tj\t= 0;\n\t\t\t\t\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq\t= qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq\t= fullq.split( \",\" );\n\t\t\t\teql\t\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( ; j < eql; j++ ){\n\t\t\t\t\tthisq\t= eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia\t: thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules\t: rules.length - 1,\n\t\t\t\t\t\thasquery: thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw\t: thisq.match( /\\(min\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw\t: thisq.match( /\\(max\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \t\n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue\t\t= function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia\t\t\t= function( fromResize ){\n\t\t\tvar name\t\t= \"clientWidth\",\n\t\t\t\tdocElemProp\t= docElem[ name ],\n\t\t\t\tcurrWidth \t= doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink\t= links[ links.length-1 ],\n\t\t\t\tnow \t\t= (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\tclearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall\t= now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\tminnull = min === null,\n\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\tem = \"em\";\n\t\t\t\t\n\t\t\t\tif( !!min ){\n\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\tif( !!max ){\n\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var i in appendedEls ){\n\t\t\t\tif( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){\n\t\t\t\t\thead.removeChild( appendedEls[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var i in styleBlocks ){\n\t\t\t\tvar ss\t\t= doc.createElement( \"style\" ),\n\t\t\t\t\tcss\t\t= styleBlocks[ i ].join( \"\\n\" );\n\t\t\t\t\n\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\tss.media\t= i;\n\t\t\t\t\n\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\n\t\t\t\tif ( ss.styleSheet ){ \n\t\t        \tss.styleSheet.cssText = css;\n\t\t        } \n\t\t        else {\n\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t        }\n\t\t        \n\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\tappendedEls.push( ss );\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState != 4 || req.status != 200 && req.status != 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t}\n\t\t\tif ( req.readyState == 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx",
    "content": "﻿<%@ Page Title=\"Sign Up\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"SignUp.aspx.cs\" Inherits=\"ProductLaunch.Web.SignUp\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Sign me up!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Just a few details</h2>\n        </div>\n    </div>\n\n    <div class=\"form-group\">\n        <label for=\"txtFirstName\">First Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtFirstName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtLastName\">Last Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtLastName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtEmail\">Email Address</label>\n        <asp:TextBox class=\"form-control\" id=\"txtEmail\" runat=\"server\" />\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlCountry\">Country</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlCountry\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtCompanyName\">Company Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtCompanyName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlRole\">Your Main Role</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlRole\" runat=\"server\" />\n    </div>\n\n    <asp:Button class=\"btn btn-default\" runat=\"server\" Text=\"Go!\" ID=\"btnGo\" OnClick=\"btnGo_Click\" />\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing ProductLaunch.Model;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SignUp : Page\n    {\n        private static Dictionary<string, Country> _Countries;\n        private static Dictionary<string, Role> _Roles;\n\n        public static void PreloadStaticDataCache()\n        {\n            _Countries = new Dictionary<string, Country>();\n            _Roles = new Dictionary<string, Role>();\n            using (var context = new ProductLaunchContext())\n            {\n                foreach (var country in context.Countries.OrderBy(x => x.CountryName))\n                {\n                    _Countries[country.CountryCode] = country;\n                }\n                foreach (var role in context.Roles.OrderBy(x => x.RoleName))\n                {\n                    _Roles[role.RoleCode] = role;\n                }\n            }\n        }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            if (!Page.IsPostBack)\n            {\n                PopulateRoles();\n                PopulateCountries();\n            }\n        }\n\n        private void PopulateRoles()\n        {\n            ddlRole.Items.Clear();\n            ddlRole.Items.AddRange(_Roles.Select(x => new ListItem(x.Value.RoleName, x.Key)).ToArray()); \n        }\n\n        private void PopulateCountries()\n        {\n            ddlCountry.Items.Clear();\n            ddlCountry.Items.AddRange(_Countries.Select(x => new ListItem(x.Value.CountryName, x.Key)).ToArray());\n        }\n\n        protected void btnGo_Click(object sender, EventArgs e)\n        {\n            var country = _Countries[ddlCountry.SelectedValue];\n            var role = _Roles[ddlRole.SelectedValue];\n\n            var prospect = new Prospect\n            {\n                CompanyName = txtCompanyName.Text,\n                EmailAddress = txtEmail.Text,\n                FirstName = txtFirstName.Text,\n                LastName = txtLastName.Text,\n                Country = country,\n                Role = role\n            };\n\n            var eventMessage = new ProspectSignedUpEvent\n            {\n                Prospect = prospect,\n                SignedUpAt = DateTime.UtcNow\n            };\n\n            MessageQueue.Publish(eventMessage);\n\n            Server.Transfer(\"ThankYou.aspx\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SignUp {\n        \n        /// <summary>\n        /// txtFirstName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtFirstName;\n        \n        /// <summary>\n        /// txtLastName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtLastName;\n        \n        /// <summary>\n        /// txtEmail control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtEmail;\n        \n        /// <summary>\n        /// ddlCountry control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlCountry;\n        \n        /// <summary>\n        /// txtCompanyName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtCompanyName;\n        \n        /// <summary>\n        /// ddlRole control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlRole;\n        \n        /// <summary>\n        /// btnGo control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.Button btnGo;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Site.Master",
    "content": "﻿<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.master.cs\" Inherits=\"ProductLaunch.Web.SiteMaster\" %>\n\n<!DOCTYPE html>\n\n<html lang=\"en\">\n<head runat=\"server\">\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title><%: Page.Title %></title>\n\n    <asp:PlaceHolder runat=\"server\">\n        <%: Scripts.Render(\"~/bundles/modernizr\") %>\n    </asp:PlaceHolder>\n\n    <webopt:bundlereference runat=\"server\" path=\"~/Content/css\" />\n    <link href=\"~/favicon.ico\" rel=\"shortcut icon\" type=\"image/x-icon\" />\n\n</head>\n<body>\n    <form runat=\"server\">\n        <asp:ScriptManager runat=\"server\">\n            <Scripts>\n                <%--To learn more about bundling scripts in ScriptManager see http://go.microsoft.com/fwlink/?LinkID=301884 --%>\n                <%--Framework Scripts--%>\n                <asp:ScriptReference Name=\"MsAjaxBundle\" />\n                <asp:ScriptReference Name=\"jquery\" />\n                <asp:ScriptReference Name=\"bootstrap\" />\n                <asp:ScriptReference Name=\"respond\" />\n                <asp:ScriptReference Name=\"WebForms.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebForms.js\" />\n                <asp:ScriptReference Name=\"WebUIValidation.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebUIValidation.js\" />\n                <asp:ScriptReference Name=\"MenuStandards.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/MenuStandards.js\" />\n                <asp:ScriptReference Name=\"GridView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/GridView.js\" />\n                <asp:ScriptReference Name=\"DetailsView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/DetailsView.js\" />\n                <asp:ScriptReference Name=\"TreeView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/TreeView.js\" />\n                <asp:ScriptReference Name=\"WebParts.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebParts.js\" />\n                <asp:ScriptReference Name=\"Focus.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/Focus.js\" />\n                <asp:ScriptReference Name=\"WebFormsBundle\" />\n                <%--Site Scripts--%>\n            </Scripts>\n        </asp:ScriptManager>\n\n        <div class=\"container body-content\">\n            <asp:ContentPlaceHolder ID=\"MainContent\" runat=\"server\">\n            </asp:ContentPlaceHolder>\n            <hr />\n            <footer>\n                <p>&copy; <%: DateTime.Now.Year %> - Company, Inc.</p>\n            </footer>\n        </div>\n\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Site.Master.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SiteMaster : MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Site.Master.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SiteMaster {\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master",
    "content": "<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.Mobile.master.cs\" Inherits=\"ProductLaunch.Web.Site_Mobile\" %>\n<%@ Register Src=\"~/ViewSwitcher.ascx\" TagPrefix=\"friendlyUrls\" TagName=\"ViewSwitcher\" %>\n\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head runat=\"server\">\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title></title>\n    <asp:ContentPlaceHolder runat=\"server\" ID=\"HeadContent\" />\n</head>\n<body>\n    <form id=\"form1\" runat=\"server\">\n    <div>\n        <h1>Mobile Master Page</h1>\n        <asp:ContentPlaceHolder runat=\"server\" ID=\"FeaturedContent\" />\n        <section class=\"content-wrapper main-content clear-fix\">\n            <asp:ContentPlaceHolder runat=\"server\" ID=\"MainContent\" />\n        </section>\n        <friendlyUrls:ViewSwitcher runat=\"server\" />\n    </div>\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Site_Mobile : System.Web.UI.MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class Site_Mobile {\n        \n        /// <summary>\n        /// HeadContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder HeadContent;\n        \n        /// <summary>\n        /// form1 control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.HtmlControls.HtmlForm form1;\n        \n        /// <summary>\n        /// FeaturedContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder FeaturedContent;\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx",
    "content": "﻿<%@ Page Title=\"Ta\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" CodeBehind=\"ThankYou.aspx.cs\" Inherits=\"ProductLaunch.Web.ThankYou\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Thank you!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Good work on signing up. We'll be in touch.</h2>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ThankYou : System.Web.UI.Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ThankYou {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx",
    "content": "<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"ViewSwitcher.ascx.cs\" Inherits=\"ProductLaunch.Web.ViewSwitcher\" %>\n<div id=\"viewSwitcher\">\n    <%: CurrentView %> view | <a href=\"<%: SwitchUrl %>\" data-ajax=\"false\">Switch to <%: AlternateView %></a>\n</div>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Routing;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\nusing Microsoft.AspNet.FriendlyUrls.Resolvers;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ViewSwitcher : System.Web.UI.UserControl\n    {\n        protected string CurrentView { get; private set; }\n\n        protected string AlternateView { get; private set; }\n\n        protected string SwitchUrl { get; private set; }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            // Determine current view\n            var isMobile = WebFormsFriendlyUrlResolver.IsMobileView(new HttpContextWrapper(Context));\n            CurrentView = isMobile ? \"Mobile\" : \"Desktop\";\n\n            // Determine alternate view\n            AlternateView = isMobile ? \"Desktop\" : \"Mobile\";\n\n            // Create switch URL from the route, e.g. ~/__FriendlyUrls_SwitchView/Mobile?ReturnUrl=/Page\n            var switchViewRouteName = \"AspNet.FriendlyUrls.SwitchView\";\n            var switchViewRoute = RouteTable.Routes[switchViewRouteName];\n            if (switchViewRoute == null)\n            {\n                // Friendly URLs is not enabled or the name of the switch view route is out of sync\n                this.Visible = false;\n                return;\n            }\n            var url = GetRouteUrl(switchViewRouteName, new { view = AlternateView, __FriendlyUrls_SwitchViews = true });\n            url += \"?ReturnUrl=\" + HttpUtility.UrlEncode(Request.RawUrl);\n            SwitchUrl = url;\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ViewSwitcher {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\" />\n    <customErrors mode=\"Off\"/>\n    <httpRuntime targetFramework=\"4.5.2\" />\n    <pages>\n      <namespaces>\n        <add namespace=\"System.Web.Optimization\" />\n      </namespaces>\n      <controls>\n        <add assembly=\"Microsoft.AspNet.Web.Optimization.WebForms\" namespace=\"Microsoft.AspNet.Web.Optimization.WebForms\" tagPrefix=\"webopt\" />\n      </controls>\n    </pages>     \n  </system.web>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"WebGrease\" culture=\"neutral\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.5.2.14234\" newVersion=\"1.5.2.14234\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\" />\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.Web/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Antlr\" version=\"3.4.1.9004\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.bootstrap\" version=\"3.0.0\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"bootstrap\" version=\"3.4.1\" targetFramework=\"net452\" />\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls.Core\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.MSAjax\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.WebForms\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization.WebForms\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.Web.Infrastructure\" version=\"1.0.0.0\" targetFramework=\"net452\" />\n  <package id=\"Modernizr\" version=\"2.6.2\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n  <package id=\"Respond\" version=\"1.2.0\" targetFramework=\"net452\" />\n  <package id=\"WebGrease\" version=\"1.5.2\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/ProductLaunch.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Web\", \"ProductLaunch.Web\\ProductLaunch.Web.csproj\", \"{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model\", \"ProductLaunch.Model\\ProductLaunch.Model.csproj\", \"{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Entities\", \"ProductLaunch.Entities\\ProductLaunch.Entities.csproj\", \"{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tests\", \"Tests\", \"{4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model.Tests\", \"ProductLaunch.Model.Tests\\ProductLaunch.Model.Tests.csproj\", \"{49FD06C3-CD52-425A-866D-831D09268CD0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.MessageHandlers.SaveProspect\", \"ProductLaunch.MessageHandlers.SaveProspect\\ProductLaunch.MessageHandlers.SaveProspect.csproj\", \"{65089C80-27F1-4744-979B-4C5A33B0CFF6}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Messaging\", \"ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\", \"{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"MessageHandlers\", \"MessageHandlers\", \"{C7DDB104-252C-499C-A144-242DCC2CF946}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.EndToEndTests\", \"ProductLaunch.EndToEndTests\\ProductLaunch.EndToEndTests.csproj\", \"{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6} = {C7DDB104-252C-499C-A144-242DCC2CF946}\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/ProductLaunch/build.ps1",
    "content": "$nuGetPath = \"C:\\Chocolatey\\bin\\nuget.bat\"\n$msBuildPath = \"C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe\"\n\ncd c:\\src\n& $nuGetPath restore .\\ProductLaunch.sln\n\n# publush web app:\n& $msBuildPath .\\ProductLaunch.Web\\ProductLaunch.Web.csproj /p:OutputPath=c:\\out\\web\\ProductLaunchWeb /p:DeployOnBuild=true /p:VSToolsPath=C:\\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\\tools\\VSToolsPath\n\n# publish message handler:\n& $msBuildPath .\\ProductLaunch.MessageHandlers.SaveProspect\\ProductLaunch.MessageHandlers.SaveProspect.csproj /p:OutputPath=c:\\out\\save-prospect\\SaveProspectHandler\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/build.ps1",
    "content": "[CmdletBinding()]\nParam(\n   [Parameter(Mandatory=$True,Position=1)]\n   [string] $dockerID\n)\n\ndocker build `\n -t $dockerID/modernize-aspnet-builder `\n $pwd\\docker\\builder\n\ndocker run --rm `\n -v $pwd\\ProductLaunch:c:\\src `\n -v $pwd\\docker:c:\\out `\n $dockerID/modernize-aspnet-builder `\n C:\\src\\build.ps1 \n\ndocker build `\n -t $dockerID/modernize-aspnet-web:v2 `\n $pwd\\docker\\web\n\n docker build `\n -t $dockerID/modernize-aspnet-handler:v2 `\n $pwd\\docker\\save-prospect"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/docker/builder/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 14.0.25420.1 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force; `\n    Install-Package -Name webdeploy -RequiredVersion 3.5.2 -Force\n\nRUN Install-Package -Name nuget.commandline -RequiredVersion 3.4.3 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install MSBuild.Microsoft.VisualStudio.Web.targets -Version 14.0.0.3\n\nENTRYPOINT [\"powershell\"]"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/docker/save-prospect/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\n\nWORKDIR /save-prospect-handler\nENV MESSAGE_QUEUE_URL=\"nats://message-queue:4222\"\nENTRYPOINT [\"C:\\\\save-prospect-handler\\\\ProductLaunch.MessageHandlers.SaveProspect.exe\"]\n\nCOPY SaveProspectHandler ."
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/docker/web/Dockerfile",
    "content": "# escape=`\nFROM microsoft/aspnet:windowsservercore-10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\n\nRUN Remove-Website -Name 'Default Web Site'; `\n    New-Item -Path 'C:\\web-app' -Type Directory; `\n    New-Website -Name 'web-app' -PhysicalPath 'C:\\web-app' -Port 80 -Force\n\nENV MESSAGE_QUEUE_URL=\"nats://message-queue:4222\"\nENTRYPOINT [\"powershell\", \"./bootstrap.ps1\"]\n\nCOPY bootstrap.ps1 /\nCOPY ProductLaunchWeb/_PublishedWebsites/ProductLaunch.Web /web-app\n\nHEALTHCHECK CMD powershell -command `\n    try { `\n     $response = iwr http://localhost:80 -UseBasicParsing; `\n     if ($response.StatusCode -eq 200) { return 0} `\n     else {return 1}; `\n    } catch { return 1 }"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/docker/web/bootstrap.ps1",
    "content": "Write-Output 'Bootstrap starting'\n\n# copy process-level environment variables (from `docker run`) machine-wide\nforeach($key in [System.Environment]::GetEnvironmentVariables('Process').Keys) {\n    if ([System.Environment]::GetEnvironmentVariable($key, 'Machine') -eq $null) {\n        $value = [System.Environment]::GetEnvironmentVariable($key, 'Process')\n        [System.Environment]::SetEnvironmentVariable($key, $value, 'Machine')\n        Write-Output \"Set environment variable: $key\"\n    }\n}\n\nWrite-Output 'Running ServiceMonitor'\n& C:\\ServiceMonitor.exe w3svc"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-dev/v2-src/docker-compose.yml",
    "content": "version: '3'\n\nservices:\n  \n  product-launch-db:\n    image: microsoft/mssql-server-windows-express\n    ports:\n      - \"1433:1433\"\n    environment: \n      - ACCEPT_EULA=Y\n      - sa_password=d0ck3r_Labs!\n    networks:\n      - app-net\n\n  message-queue:\n    image: nats:nanoserver\n    ports:\n      - \"4222:4222\"\n    networks:\n      - app-net\n\n  product-launch-web:\n    image: <DockerID>/modernize-aspnet-web:v2\n    ports:\n      - \"80:80\"\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\n    depends_on:\n      - product-launch-db\n      - message-queue\n    networks:\n      - app-net\n\n  save-prospect-handler:\n    image: <DockerID>/modernize-aspnet-handler:v2\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\n    depends_on:\n      - product-launch-db\n      - message-queue\n    networks:\n      - app-net\n\nnetworks:\n  app-net:\n    external: \n     name: nat\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-ops/README.md",
    "content": "# Modernize .NET Apps - for Ops\n\nYou'll already have a process for deploying ASP.NET apps, but it probably involves a lot of manual steps. Work like copying application content between servers, running interactive setup programs, modifying configuration items and manual smoke tests all add time and risk to deployments. \n\nIn Docker, the process of packaging applications is completely automated, and the platform supports automatic update and rollback for application deployments. You can build Docker images from your existing application artifacts, and run ASP.NET apps in containers without going back to source code.\n\nThis lab is aimed at ops and system admins. It steps through packaging an ASP.NET WebForms app to run in a Docker container on Windows 10 or Windows Server 2016. It starts with an MSI and ends by showing you how to run and update the application as a highly-available service on Docker swam.\n\n## What You Will Learn\n\nYou'll learn how to:\n\n- Package an existing ASP.NET MSI so the app runs in Docker, without any application changes.\n\n- Create an upgraded package with application updates and Windows patches.\n\n- Update and rollback the running application in a production environment with zero downtime.\n\n> **Difficulty**: Beginner \n\n> **Time**: Approximately 30 minutes\n\n> **Tasks**:\n>\n> * [Prerequisites](#prerequisites)\n> * [Task 1: Packaging ASP.NET apps as Docker images](#task1)\n>   * [Task 1.1: Installing MSIs in Docker images](#task1.1)\n>   * [Task 1.2: Building the v1.0 application image](#task1.2)\n>   * [Task 1.3: Running the application v1.0 in Docker](#task1.3)\n> * [Task 2: Upgrading application images](#task2)\n>   * [Task 2.1: Updating Windows and app versions](#task2.1)\n>   * [Task 2.2: Building the v1.1 application image](#task2.2)\n>   * [Task 2.3: Upgrading the running application](#task2.3)\n> * [Task 3: Zero-Downtime updates](#task3)\n>   * [Task 3.1: Create a Windows Docker swarm](#task3.1)\n>   * [Task 3.2: Run application version 1.0 as a service](#task3.2)\n>   * [Task 3.3: Upgrade to application version 1.1](#task3.3)\n\n## Document conventions\n\nWhen you encounter a phrase in between `<` and `>`  you are meant to substitute in a different value. \n\nFor instance if you see `$ip = <ip-address>` you would actually type something like `$ip = '10.0.0.4'`\n\nYou will be asked to RDP into various servers. You will find the actual server names to use in your welcome email. \n\n## <a name=\"prerequisites\"></a>Prerequisites\n\nYou will need a set of Windows Server 2016 virtual machines running in Azure, which are already configured with Docker and the Windows base images. You do not need Docker running on your laptop, but you will need a Remote Desktop client to connect to the VMs. \n\n- Windows - use the built-in Remote Desktop Connection app.\n- Mac - install [Microsoft Remote Desktop](https://itunes.apple.com/us/app/microsoft-remote-desktop/id715768417?mt=12) from the app store.\n- Linux - install [Remmina](http://www.remmina.org/wp/), or any RDP client you prefer.\n\n> When you connect to the VM, if you are prompted to run Windows Update, you should cancel out. The labs have been tested with the existing VM state and any changes may cause problems.\n\nYou will build images and push them to Docker Cloud, so you can pull them on different Docker hosts. You will need a Docker ID.\n\n- Sign up for a free Docker ID on [Docker Cloud](https://cloud.docker.com)\n\n## Prerequisite Task: Prepare your lab environment\n\nStart by ensuring you have the latest lab source code. RDP into one of your Azure VMs, and open a PowerShell prompt with the \"Run as Administator\" option.\n\nIf you're using a VM provided for a Docker lab, you will find the source code is already cloned, just run these commands to update it:\n\n```\ncd C:\\scm\\github\\docker\\labs\ngit pull\n```\n\nIf you're using your own VM, clone the lab repo from GitHub:\n\n```\nmkdir -p C:\\scm\\github\\docker\ncd C:\\scm\\github\\docker\ngit clone https://github.com/docker/labs.git\n```\n\nNow set set some variables for your source path and Docker ID, so you can copy and paste commands from the lab:\n\n```\n$labRoot='C:\\scm\\github\\docker\\labs\\dockercon-us-2017\\windows-modernize-aspnet-ops'\n$dockerId='<Your Docker ID>'\n```\n\nNow clear up anything left from a previous lab. You only need to do this if you have used this VM for one of the other Windows labs, but you can run it sefaly to restore Docker to a clean state. \n\nThis stops and removes all running containers, and then leaves the swarm - ignore any error messages you see:\n\n```\ndocker container rm -f $(docker container ls -a -q)\ndocker swarm leave -f\n```\n\n## <a name=\"task1\"></a>Task 1: Packaging ASP.NET apps as Docker images\n\nA Docker image packages your application and all the dependencies it needs to run into one unit. Microsoft maintain the [microsoft/aspnet](https://store.docker.com/images/aspnet) image on Docker Store, which you can use as the basis for your own application images. It is based on [microsoft/windowsservercore](https://store.docker.com/images/windowsservercore) and has IIS and ASP.NET already installed. \n\nIn this lab you'll start with an MSI that deploys a web app onto a server and expects IIS and ASP.NET to be configured. If you already have a scripted build process then you may have MSIs or Web Deploy packages already being generated, and it's easy to package them into a Docker image.\n\n## <a name=\"task1.1\"></a> Task 1.1: Installing MSIs in Docker images\n\nBuilding a Docker image from an MSI is simple, you just need to copy in the `msi` file and run `msiexec` to install it. Have a look at the [Dockerfile](v1.0/Dockerfile) for the app you're going to deploy and later upgrade.\n\n> If you noticed the version of [microsoft/windowsservercore](https://store.docker.com/images/windowsservercore) is an old one - that's deliberate. You'll be updating the Windows version as well as the app version in this lab.\n\nThere are just three lines of [Dockerfile instructions](https://docs.docker.com/engine/reference/builder/):\n\n- `FROM` specifies the base image to use as a starting point, in this case a specific version of the ASP.NET image\n- `COPY` copies the existing v1.0 application MSI from the local machine into the Docker image\n- `RUN` installs the MSI using `msiexec`, with the `qn` switch to install silently, and passing a value to the custom `RELEASENAME` variable that the MSI uses\n\n## <a name=\"task1.2\"></a> Task 1.2: Building the v1.0 application image\n\nEvery Docker image has a unique name, and you can also tag images with additional information like application version numbers. On your VM, change to the v1.0 directory and build the Dockerfile:\n\n```\ncd $labRoot\\v1.0\ndocker image build -t $dockerId/modernize-aspnet-ops:1.0 .\n```\n\n> Be sure to tag the image with your own Docker ID - you'll be pushing it to Docker Cloud next.\n\nThe output from `docker build` shows you the Docker engine executing all the steps in the Dockerfile. On your lab VM the base images have already been pulled, so the image should build quickly.\n\nWhen the build completes you'll have a new image stored locally, with the name `<DockerId>/modernize-aspnet-ops` and the tag `1.0` indicating that this is version 1.0 of the app.\n\nLogin to Docker Cloud with your Docker ID and push that image, so it's available for the other VMs you'll use later on:\n\n```\ndocker login\n...\ndocker image push $dockerId/modernize-aspnet-ops:1.0\n```\n\n## <a name=\"task1.3\"></a> Task 1.3: Running the Application v1.0 in Docker\n\nThe sample application for the lab is a simple ASP.NET WebForms app, which the MSI installs to the default IIS website running on port 80. To start the application, use `docker run` and publish the port from the container onto the host, so the website is available externally:\n\n```\ndocker container run -d -p 80:80 --name v1.0 $dockerId/modernize-aspnet-ops:1.0\n```\n\n- `-d` starts the container in detached mode, so Docker keeps it running in the background\n- `-p` publishes port 80 on the container to port 80 on the host, so Docker directs incoming traffic into the container\n- `--name` gives the container the name `v1.0`, so you can refer to it in other Docker commands\n\n`docker ps` will show you that the container is running, together with the port mapping and the command running inside the container:\n\n```\n> docker ps\nCONTAINER ID        IMAGE                              COMMAND                   CREATED             STATUS              PORTS                NAMES\n27b54d30301f        sixeyed/modernize-aspnet-ops:1.0   \"C:\\\\ServiceMonitor...\"   41 seconds ago      Up 38 seconds       0.0.0.0:80->80/tcp   v1.0\n```\n\nYou can get basic management information about the container with `docker container top v1.0` to list the running processes, and `docker container logs v1.0` to view application log entries. In this case, IIS doesn't write any logs to the console so there won't be any log entries surfaced to Docker.\n\nOpen a browser on your laptop and browse to the app on your VM: **http://&lt;azure-vm-address&gt;/UpgradeSample**. You'll see the sample app, which just shows some basic diagnostics details:\n\n![Version 1.0 of the sample app](images/app-v1.0.png)\n\n## <a name=\"task2\"></a>Task 2: Upgrading Application Images\n\nThe Docker image tagged `1.0` is a snapshot of the application, built with a specific version of the app and a specific version of Windows. When you have an upgrade to the app or an operating system update you don't make changes to the running container - you build a new Docker image which packages the updated components and replace the container with a new one. \n\nMicrosoft are releasing [regular updates to the Windows base images](https://store.docker.com/images/windowsservercore) on Docker Store. When your applications are running in Docker containers, there is no 'Patch Tuesday' with manual or semi-automated update processes. The Docker build process is fully automated, so when a new version of the base image is released with security patches, you just need to rebuild your own images and replace the running containers.\n\n## <a name=\"task2\"></a>Task 2.1: Updating Windows and app versions\n\nTake a look at the [updated Dockerfile](v1.1/Dockerfile) for version 1.1 of the application. It's the same structure as 1.0 but with some important changes:\n\n- the `FROM` image is tagged with version `10.0.14393.693`, which is a later Windows image. v1.0 was built on Windows version `10.0.14393.576`\n- the MSI is version `1.1.0.0` which contains an updated application release\n- the MSI parameter `RELEASENAME` has been changed to `2017.03` - this value gets shown in the web app\n\nThe Dockerfile is still a simple 3-line script. All that's changed are the version details for Windows and the application. The regular monthly updates to the Windows images contain all the latest security patches and hotfixes.\n\nVersion 1.1 represents a change to the app which coincides with an updated Windows version being available, so it packages both application and OS updates.\n\n## <a name=\"task2\"></a>Task 2.2: Building the v1.1 Application Image\n\nThe process to build the new version is identical. In PowerShell, switch to the 1.1 directory and run `docker build`, using a new tag to identify the version:\n\n```\ncd $labRoot\\v1.1\ndocker image build -t <DockerId>/modernize-aspnet-ops:1.1 .\n```\n\nNow you have two application images, tagged `1.0` and `1.1`, each containing different versions of the application built on different versions of Windows. You can see the basic image details with the `docker image ls` command:\n\n```\n> docker image ls --filter reference='*/modernize*'\nREPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE\nsixeyed/modernize-aspnet-ops           1.1                 dcea5c0e1be9        41 minutes ago      10.1 GB\nsixeyed/modernize-aspnet-ops           1.0                 e763f76db517        About an hour ago   10 GB\n```\n\nYou can see the images are listed at around 10GB each, but this is the logical size. Physically, the images share the majority of data in read-only image layers. There are a lot more images on your lab VM - run `docker image ls` to see them all, and then run `docker system df` to see how much physical storage they are using.\n\nYou'll see there are around 20 images, with logical sizes totalling over 170GB - but the actual storage used is only around 20GB.\n\n## <a name=\"task2.3\"></a>Task 2.3: Upgrading the running application\n\nVersion 1.0 of the application is still running, and the container port is mapped to port 80 on the host. Only one process can listen on a port, so you can't start a new container which also listens on port 80. \n\nYou can test out the new version locally on the VM by running a new container without publishing any ports:\n\n```\ndocker container run -d --name v1.1 <DockerId>/modernize-aspnet-ops:1.1\n```\n\nWith no published ports, the container is not accessible outside of the VM. To browse the new site on the VM, you need to find the container's IP address by running:\n\n```\ndocker container inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' v1.1\n```\n\nYou can open Firefox on the VM and browse to **http://&lt;container-ip-address&gt;/UpgradeSample** to see the updated version of the app:\n\n![Version 1.1 of the sample app](images/app-v1.1.png)\n\nThe new website content shows the updated application version number, which is read from the app DLL, and the release version number, which is read from the MSI parameter. The colors have changed too, to make the versions stand out when you're running side-by-side. \n\nIn non-production environments you can upgrade just by killing the old container and starting a new one, using the new image and mapping to the original port. That's a manual approach which will incur a few seconds downtime. Docker provides an automated, zero-downtime alternative which you'll use instead.\n\nFor that you'll create a swarm, clustering all three of your lab VMs. The other nodes will need the upgraded image, so push version 1.1 to Docker Cloud too:\n\n```\ndocker image push $dockerId/modernize-aspnet-ops:1.1\n```\n\n## <a name=\"task3\"></a>Task 3: Zero-Downtime updates\n\nThe Docker platform supports automated rolling updates, so you can have a zero-downtime update of your app. To get zero-downtime deployment you need to run your application containers as a service in a Docker swarm - a cluster of machines all running Docker, which you manage as a single unit.\n\nIn an update, Docker incrementally stops the running containers and starts new ones from the updated image. For production environments where you have a load-balancer directing traffic to nodes, it would not send any requests to a node which Docker is updating, so your application stays online.\n\n## <a name=\"task3.1\"></a>Task 3.1: Create a Windows Docker swarm\n\n[Swarm mode](https://docs.docker.com/engine/swarm/) is a clustering technology built into the Docker engine. You need multiple VMs to create a high-availability swarm, but you can create a single-node swarm to learn the management processes.\n\nThere are two server roles in a Docker swarm - managers and workers. You'll make the VM into a single-node swarm, so it will be a manager. Managers can run application workloads as well as workers. Start by clearing down running containers again:\n\n```\ndocker container rm -f $(docker container ls -a -q)\n```\n\nSwitch to swarm mode. Run the `swarm init` command to initialize the swarm:\n\n```\ndocker swarm init\n```\n\n> Your RDP session may be interrupted because of a network change when the node switches to swarm mode. It will reconnect in a few seconds.\n\nThe output tells you this node is now a manager, and gives you a secret token for joining other nodes to the swarm.\n\n## <a name=\"task3.2\"></a>Task 3.2: Run application version 1.0 as a service\n\nIn swarm mode, you don't run individual containers. Instead you create services and the swarm decides which node to run the containers on. For services which run across many containers, Docker will spread them across as many hosts as possible, to maximise redundancy. \n\nTo run the web app on your swarm, create it with a replica level of 3 and Docker will run a container on each node:\n\n```\ndocker service create `\n  --name sample `\n  --publish mode=host,target=80,published=80 `\n  --detach=true `\n  --replicas=1 `\n  --with-registry-auth `\n  $dockerId/modernize-aspnet-ops:1.0\n```\n\n- `--name` - is the name of the service, this is how you refer to the service for management, and in other services that consume this one\n- `--publish` - maps the container port to the host port. Note that the syntax is different in swarm mode, but the functionality is the same\n- `--replicas` - the number of containers that run the service. Docker will maintain the service level by starting new containers when needed\n\nYou can check on the service with `docker service ls`, which should show you have ome out of one replicas running.\n\nRun `service ps` to list the containers in the service and see which nodes they're running on:\n\n```\n> docker service ps sample\nID                  NAME                IMAGE                              NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS\npedhy0x72gih        sample.1            sixeyed/modernize-aspnet-ops:1.0   dcus-win00          Running             Running 41 seconds ago                       *:80->80/tcp\n```\n\nWith a single-node swarm and a sinfle replica, you'll see one container on the manager node. On your laptop you can browse to the Azure VM address and see version 1.0 of the app running.\n\nServices in swarm mode are first-class citizens, and they can be updated using built-in platform functionality.\n\n\n## <a name=\"task3.3\"></a>Task 3.3: Upgrade to application version 1.1\n\nThe update process runs against a service, and updates it to a specified image version. It does that by stopping the existing containers, and starting new ones. \n\nIn a highly-available swarm where you have a service running in many containers on many hosts, fronted by a load-balancer, this is a zero-downtime deployment. The load balancer only sends traffic to active containers, so old containers won't get traffic when they're stopped, and new containers won't get traffic until they're online.\n\nTo update your service to version 1.1, run:\n\n```\ndocker service update --with-registry-auth --image $dockerId/modernize-aspnet-ops:1.1 sample\n```\n\nThat tells Docker to update the `sample` service to version `1.1` of the image. With a multi-node swarm you would configure a load balancer in front the nodes and you would get zero-downtime deployment. \n\nAutomated updates are a huge benefit of the Docker platform. Updating a distributed application in a safe, automated way takes all the risk out of deployments, and makes frequent releases possible. If you don't like the new color scheme in v1.1 you can easily roll back to v1.0:\n\n```\ndocker service update --rollback sample\n```\n\nRolling back is conceptually the same as updating. The existing containers are stopped, and new containers created using the original image version. Browse to the site now and you will see version 1.0 running again. Automated rollback may be an even bigger benefit than automatic update. Knowing you can revert to the previous good version without any downtime and without a lengthy manual procedure gives you confidence in your deployment process, even if there are problems in the application itself.\n\n## Wrap Up\n\nThank you for taking the time to complete this lab! You now know how to package an existing ASP.NET app as a Docker image, without touching the source code. You also know how to package a new version of your image, containing application updates and the latest Windows patches. You've also seen how to run a highly-available service in Docker swarm mode.\n\nDo try the other Windows labs at DockerCon, and make a note to check out the full lab suite when you get home - there are plenty more Windows walkthroughs at [docker/labs](https://github.com/docker/labs/tree/master/windows) on GitHub.\n"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-ops/v1.0/Dockerfile",
    "content": "# escape=`\nFROM microsoft/aspnet:windowsservercore-10.0.14393.576\n\nCOPY UpgradeSample-1.0.0.0.msi /\n\nRUN msiexec /i c:\\UpgradeSample-1.0.0.0.msi RELEASENAME=2017.02 /qn"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/windows-modernize-aspnet-ops/v1.1/Dockerfile",
    "content": "# escape=`\nFROM microsoft/aspnet:windowsservercore-10.0.14393.693\n\nCOPY UpgradeSample-1.1.0.0.msi /\n\nRUN msiexec /i c:\\UpgradeSample-1.1.0.0.msi RELEASENAME=2017.03 /qn"
  },
  {
    "path": "Docker/additional-ressources/dockercon-us-2017/workshop-slides/README.md",
    "content": "# DockerCon 2017 Austin Workshops\n\nAt DockerCon 2017 in Austin, we had [10 workshops](https://2017.dockercon.com/workshops/), each lasting about 3 hours. These are the slides from the workshops so you can get the same content.\n\n* [Learn Docker](./docker-101-workshop-dockercon.pdf)\n* [Orchestration Workshop](https://github.com/jpetazzo/orchestration-workshop) Beginner and Advanced\n* Introduction to Enterprise Docker Operations. Paid training, check out our offerings on [training.docker.com](http://training.docker.com/)\n* [Docker Security](security-workshop-dockercon.pdf)\n* [Networking Workshop](networking-workshop-dockercon.pdf)\n* [Docker for Java Developers](https://github.com/docker/labs/tree/master/developer-tools/java)\n* [Modernizing Monolithic ASP.NET Applications with Docker](mta-asp-dockercon-workshop.pdf)\n* [Hands-on Docker for Raspberry Pi](http://blog.alexellis.io/hands-on-docker-raspberrypi/)\n* [Microservices Lifecycle Explained Through Docker and Continuous Deployment](http://vfarcic.github.io/devops21/workshop.html)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/.gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": "Docker/additional-ressources/windows/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbuild/\nbld/\n[Bb]in/\n[Oo]bj/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n## TODO: Comment the next line if you want to checkin your\n## web deploy settings but do note that will include unencrypted\n## passwords\n#*.pubxml\n\n*.publishproj\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n\n# Windows Azure Build Output\ncsx/\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# LightSwitch generated files\nGeneratedArtifacts/\n_Pvt_Extensions/\nModelManifest.xml\n"
  },
  {
    "path": "Docker/additional-ressources/windows/aspnet-web/README.md",
    "content": "# Beginning ASP.NET Web application\n\nA simple example using asp.net to serve a web page using kestrel. First `clone` this repository, and then you can use either docker-compose or docker run to start the image.\n\n```\n$ git clone https://github.com/docker/labs\n$ cd labs/windows/aspnet-web\n$ docker-compose up\n```\n\nor\n\n```\n$ git clone https://github.com/docker/labs\n$ cd labs/windows/aspnet-web/webserver\n$ docker build -t myaspnet .\n$ docker run myaspnet\n```\nThen open up [http://localhost:5000](http://localhost:5000)"
  },
  {
    "path": "Docker/additional-ressources/windows/aspnet-web/docker-compose.yml",
    "content": "version: \"3\"\n\nservices:\n\n   webserver:\n     build:\n        context: ./webserver\n     image: aspnet-web\n     ports:\n        - \"5000:5000\" \n"
  },
  {
    "path": "Docker/additional-ressources/windows/aspnet-web/webserver/Dockerfile",
    "content": "FROM microsoft/dotnet:latest\n\nWORKDIR /root/\nADD ./app/ ./app/\nWORKDIR /root/app\n\nRUN dotnet restore\nRUN dotnet build\n\nEXPOSE 5000/tcp \n\nENTRYPOINT [\"dotnet\", \"run\", \"--server.urls\", \"http://0.0.0.0:5000\"]\n\n"
  },
  {
    "path": "Docker/additional-ressources/windows/aspnet-web/webserver/app/Program.cs",
    "content": "﻿using System;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace aspnetcoreapp\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            var host = new WebHostBuilder()\n                .UseKestrel()\n                .UseStartup<Startup>()\n                .UseUrls(\"http://*:5000\")\n                .Build();\n\n            host.Run();\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/aspnet-web/webserver/app/Startup.cs",
    "content": "using System;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Http;\n\nnamespace aspnetcoreapp\n{\n    public class Startup\n    {\n        public void Configure(IApplicationBuilder app)\n        {\n            app.Run(context =>\n            {\n                return context.Response.WriteAsync(\"Hello from ASP.NET Core!\");\n            });\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/aspnet-web/webserver/app/project.json",
    "content": "{\n  \"version\": \"1.0.0-*\",\n  \"buildOptions\": {\n    \"debugType\": \"portable\",\n    \"emitEntryPoint\": true\n  },\n  \"dependencies\": {},\n  \"frameworks\": {\n    \"netcoreapp1.0\": {\n      \"dependencies\": {\n        \"Microsoft.NETCore.App\": {\n          \"type\": \"platform\",\n          \"version\": \"1.0.1\"\n        },\n        \"Microsoft.AspNetCore.Server.Kestrel\": \"1.0.0\"\n      },\n      \"imports\": \"dnxcore50\"\n    }\n  }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/aspnet-web/webserver/app/run.bat",
    "content": "dotnet run"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/README.md",
    "content": "# Modernize Traditional Apps\n\nThere are millions of traditional .NET apps running key functions in enterprises. But they're expensive to maintain, complex to upgrade and may be running on old or unsupported versions of Windows. \n\n> You can learn about using Docker to [Modernize .NET Apps on YouTube](https://www.youtube.com/playlist?list=PLkA60AVN3hh88hW4dJXMFIGmTQ4iDBVBp)\n\nTraditional apps are great candidates for moving to Docker, which you can do *without changing code or rewriting the app*. Running .NET apps in a modern application platform adds [agility, portability and security](https://www.docker.com/sites/default/files/DC_SB_Microsoft.pdf) to existing apps.\n\nThese labs walk through modernization programs for typical .NET application architectures. In each case you'll start with a sample app in a Visual Studio solution, then follow the same process:\n\n- Package up a Docker image to compile the application, so you can build it without Visual Studio.\n\n- Package up the application into a Docker image, so the app can run on any Windows machine running Docker.\n\n- Run the app in Docker, together with any dependencies.\n\n- Modernize the app, focusing on key features and using the key benefits of the Docker platform.\n\n## Labs\n\nThe labs focus on specific application profiles, and the modernization benefits for developers and operations.\n\n## For Developers and Architects \n\n- [Modernize ASP.NET Web Applications](modernize-aspnet/README.md)\n\n- Modernize WCF+WPF Smart Client Applications\n\n- Modernize Messaging-Based Integration Apps\n\n\n## For IT Pros and Ops\n\n- [Migrate ASP.NET Apps to Docker](modernize-aspnet-ops/README.md)\n\n- Migrate WCF Service Apps to Docker\n\n- Migrate MSMQ Messaging Apps to Docker\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n**/Properties/launchSettings.json\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/\n\n# output from Docker builds\nProductLaunchWeb/\nSaveProspectHandler/"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/README.md",
    "content": "\n# Modernize ASP.NET Apps Lab\n\nYou can run full .NET Framework apps in Docker using the [Windows Server Core](https://store.docker.com/images/windowsservercore) base image from Microsoft. That image is a headless version of Windows Server 2016, so it has no UI but it has all the other roles and features available. Building on top of that there are also Microsoft images for [IIS]https://store.docker.com/images/iis) and [ASP.NET](https://store.docker.com/images/aspnet), which are already configured to run ASP.NET and ASP.NET 3.5 apps in IIS.\n\nThis lab steps through porting an ASP.NET WebForms app to run in a Docker container on Windows 10 or Windows Server 2016. With the app running in Docker, you can easily modernize it - and in the lab you'll add new features quickly and safely by making use of the Docker platform.\n\n## What You Will Learn\n\nIn this self-paced lab, you'll learn how to:\n\n- Package an existing ASP.NET application so it runs in Docker, without any application changes.\n\n- Run SQL Server Express in a Docker container, and use it for the application database.\n\n- Use a feature-driven approach to address problems in the existing application, without an extensive re-write.\n\n- Use the Dockerfile and Docker Compose syntax to replace manual deployment documents.\n\n## Prerequisites\n\nYou'll need Docker running on Windows. You can follow the [Windows Container Lab Setup](https://github.com/docker/labs/blob/master/windows/windows-containers/Setup.md) to install Docker on Windows 10, or Windows 2016 - locally, or on AWS or Azure.\n\nYou should be familiar with ASP.NET and C#, and with the key [Docker concepts](https://docs.docker.com/engine/understanding-docker/)\n\n### Optional\n\nThe build process for the application uses MSBuild in Docker container and **does not use** Visual Studio, but if you want to view or edit the solution yourself, you can use Visual Studio 2015. The free [Visual Studio Community Edition](https://www.visualstudio.com/vs/community/) is fine, or you can use [Visual Studio Code](http://code.visualstudio.com/).\n\n## The Lab\n\n- [Part 1 - Building ASP.NET applications with Docker](part-1.md)\n- [Part 2 - Packaging ASP.NET applications as Docker images](part-2.md)\n- [Part 3 - Running ASP.NET applications as Docker containers](part-3.md)\n- [Part 4 - Improving performance with asynchronous messaging](part-4.md)\n- [Part 5 - Enabling fast prototyping with separate UI components](part-5.md)"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/part-1.md",
    "content": "\n# Part 1 - Building ASP.NET Applications with Docker\n\nThe first hurdle when you join a project is getting your development environment set up so you can actually build the code and start working on it. The application for this lab is an ASP.NET WebForms app, which showcases a product launch website and lets users sign up to receive more details, storing data in SQL Server:\n\n![v1 architecture](img/v1-arch.png)\n\nThe application source code is in a [Visual Studio 2015 solution file](v1-src/ProductLaunch/ProductLaunch.sln), which is configured for an expected development environment. To run the app with an `F5` experience you need to have a machine set up with:\n\n- Visual Studio 2015 + Web Tools\n- IIS (Internet Information Services)\n- SQL Server LocalDB\n\nIf you don't have the right tools or the right versions installed, you're facing 3-4 hours of downloading and installing before you can even build the application. In the .NET world we're used to installing Visual Studio on build servers too, which adds more management overhead, and means build servers can't be headless - they need to run on a version of Windows with a full UI.\n\nInstead of that you can use Docker to create a packaged build agent, with all the dependencies installed for building ASP.NET applications without Visual Studio. The same build agent can be used on developer laptops and for the CI server, which means anyone can build the app as long as they have Docker installed - they don't need Visual Studio, IIS or even .NET on their Windows machine.\n\n\n## Dockerfile for the ASP.NET App Builder\n\nYou'll start by putting together a Docker image which can be a generic ASP.NET app builder. It will be packaged with .NET, MSBuild, NuGet, WebDeploy and all the tools we need to publish a web application from source. The complete [Dockerfile is here](v1-src/docker/builder/Dockerfile) - you can walk through each part to see how it's built.\n\n```\n# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n```\n\nYou start `FROM` the `microsoft/windowsservercore` base image, which is managed by Microsoft and is publicly available on Docker Store. Using the tag `10.0.14393.693` tells Docker to use a specific version of the image, rather than the default `latest` version. That means the build is repeatable, so any time you build the image you should get the exact same output because the base image will always be the same. If you want to update to a newer base image (Microsoft release regular updates with security patches), you can change the tag and rebuild.\n\nThe `SHELL` instruction tells Docker to switch to using PowerShell, so for the rest of the Dockerfile any commands are run using PowerShell. The shell is configured to fail if there are any errors, and to switch off progress bars for better performance. With this and the `escape` instruction you can use normal PowerShell syntax in the Dockerfile.\n\nNext you'll install the [Chocolatey](https://chocolatey.org/) package provider and use it to install MSBuild, the .NET 4.5 development pack, and the Web Deploy package:\n\n```\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 14.0.25420.1 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force; `\n    Install-Package -Name webdeploy -RequiredVersion 3.5.2 -Force\n```\n\nChocolatey is a great resource for installing dependencies, even in a non-UI environment like Docker. Again you should use specific package versions so the build is repeatable. After this step you'll have the basics of the build agent installed so now you can go on to add NuGet and the MSBuild targets for Visual Studio Web projects:\n\n```\nRUN Install-Package -Name nuget.commandline -RequiredVersion 3.4.3 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install MSBuild.Microsoft.VisualStudio.Web.targets -Version 14.0.0.3\n```\n\nThat gives you the [NuGet](https://www.nuget.org/) command line so you can run package restores as part of the build process, and the additional MSBuild components needed to build Visual Studio web projects. To keep the image flexible, the entrypoint instruction is a simple command to run a PowerShell script:\n\n```\nENTRYPOINT [\"powershell\"]\n```\n\nTo build the application, you'll run a container from this image, using [Docker Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume) to give the container access to the source files stored on the host. The output from MSBuild will be written to the host too, so the actual container running the build agent is disposable.\n\n\n## Building and Running the Builder\n\nFrom the `v1-src\\docker\\builder` directory, build the image using the normal `docker build` command:\n\n```\ndocker build -t dockersamples/modernize-aspnet-builder .\n```\n\n> The image is already built and available on Docker Store as [dockersamples/modernize-aspnet-builder](https://store.docker.com/community/images/dockersamples/modernize-aspnet-builder) so you can run `docker pull dockersamples/modernize-aspnet-builder` to use that version rather than building it yourself.\n\nWith this image you can build any ASP.NET application, you just need to prepare a `docker run` command which mounts the host directories into the container and specifies the MSBuild script to run. The [build.ps1](v1-src/ProductLaunch/build.ps1) script for version 1 of the app is very simple, it just builds the web project from the expected source location, and publishes to the expected output location. Running from the `v1-src` directory, the command to build the ASP.NET project is:\n\n```\ndocker run --rm `\n -v $pwd\\ProductLaunch:c:\\src `\n -v $pwd\\docker:c:\\out `\n dockersamples/modernize-aspnet-builder `\n C:\\src\\build.ps1 \n```\n\nThat command runs a container from the generic ASP.NET builder image with the following configuration:\n\n- the project source folder on the host is mounted as `C:\\src` inside the container\n- the `docker` folder on the host is mounted as `C:\\out` inside the container\n- the `build.ps1` script is executed, which publishes the web project to the output folder.\n\nWhen the container completes, the published project is built and ready to be packaged into a Docker image.\n\n## Part 1 - Recap\n\nYou built a Docker image with NuGet, MSBuild and all the target packages needed to publish a Visual Studio Web project. The builder image can be used on the Continuous Integration server and on developer laptops, so there's no longer a requirement to install full Visual Studio to work on the app.\n\nNow you can move on to packaging the app itself to run in Docker, in [Part 2 - Packaging ASP.NET applications as Docker images](part-2.md).\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/part-2.md",
    "content": "# Part 2 - Packaging ASP.NET Applications as Docker Images\n\nNow you have a repeatable way to publish the ASP.NET application. With the build agent from [Part 1](part-1.md), you can build a Docker image which packages the compiled app with all its dependencies. That's the first step towards modernizing the app. Just by running the app in the Docker platform you get plenty of benefits - increased compute utilization, improved security, and centralized management are a few. But it's also an enabler for adding new features to the app, making use of the great software that runs on Docker, and using the platform to integrate components together.\n\nPackaging an ASP.NET application to run in Docker means writing a Dockerfile that does the following:\n\n- starts with a clean, up-to-date installation of Windows Server Core\n- installs IIS as the application host and ASP.NET as the app framework\n- copies the application content from the published build\n- configures the application as an IIS website\n\nTo get the most out of Docker, you should package your applications individually, with a single ASP.NET app in each image. That lets you deploy, scale and upgrade your applications separately. If you have many ASP.NET apps with similar configurations, all your Dockerfiles will be broadly the same. The content for each app will change, and some may need additional setup, but there will be a lot of commonality. \n\n> If you already have a build process which packages your app - into an MSI or a ZIP file - you can use the output from the existing build. Instead of copying the published website as we do in this lab, you would copy in the ZIP file and extract it, or copy in the MSI and run it in unattended mode.\n\n## Writing Dockerfiles for ASP.NET web apps\n\nA [Dockerfile](v1-src/docker/web/Dockerfile) to package ASP.NET websites will start with the same boilerplate code you use for other Windows images:\n\n```\n# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n```\n\nIn the `FROM` instruction you use the same version of the Windows Server Core base image that you used for the build agent. You could use [microsoft/iis](https://store.docker.com/images/iis) instead, which builds on Server Core and adds IIS, or [microsoft/aspnet](https://store.docker.com/images/aspnet) which builds on the IIS image and adds ASP.NET. Those images are also owned by Microsoft and follow the same release cadence as Windows Server Core, so when there's an OS update all those images have a new release. But it's easy to configure IIS and ASP.NET in the Dockerfile, so you can do it yourself and control what gets installed:\n\n```\nRUN Add-WindowsFeature Web-server, NET-Framework-45-ASPNET, Web-Asp-Net45; `\n    Remove-Website -Name 'Default Web Site'\n```\n\nThe `RUN` instruction executes PowerShell cmdlets to install the IIS and ASP.NET Windows features, and remove the default website which IIS creates. You don't need to install the .NET framework, because that's already there in the base image. So far it's conceptually the same as a manual deployment, where you follow the steps in a document to start from Windows Server and configure IIS and ASP.NET. Using the Dockerfile, these steps are automated and repeatable.\n\nNext you need to make a tweak to the Windows setup which is specific to Docker. The Docker platform has a built-in DNS server, so applications running in containers can use DNS host names to reach other containers in the same Docker network, or other servers on the same physical network. It's all seamless to the application, but Windows uses a DNS cache which can be too aggressive - all DNS lookups should be handled by Docker, so the request is answered with the latest information. With a registry tweak you can turn off the Windows DNS cache:\n\n```\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\n```\n\nSo far it's all generic setup which applies for any ASP.NET app, and now you can configure the sample application. You'll create an empty directory where the website content will live, and configure a new website in IIS using more PowerShell:\n\n```\nRUN New-Item -Path 'C:\\web-app' -Type Directory; `\n    New-Website -Name 'web-app' -PhysicalPath 'C:\\web-app' -Port 80 -Force\n```\n\n> There's no specific application pool, so the new website will use the default app pool. If you're used to running multiple web apps on a server, you would typically have one app pool per site - to get isolation between sites at the process level. With Docker you don't need to do that. Only one web app will be running in this container, which gives you a much higher degree of isolation. To run many websites on our server, you'll be running many Docker containers, and inside each container the site can be using the default app pool.\n\nBy default, applications running in containers are locked down so there's no integration point between them and the host. When the host gets a request on port 80, Docker should route the traffic into the container. To do that you need to explicitly open a port with the `EXPOSE` instruction:\n\n```\nEXPOSE 80\n```\n\nThe Dockerfile for packaging the ASP.NET WebForms app is nearly complete, and you've only written 10 lines of simple instructions. The next thing you need to do is tell Docker how to run the application when a container is started from the image. The Docker platform needs to know the entry point for the application, and it will monitor the process it starts to ensure the container is running. That doesn't work well with ASP.NET apps, where the host is actually a background Windows Service. \n\nTo take advantage of Docker's entry point monitoring without changing the IIS runtime model, Microsoft have a utility called [ServiceMonitor.exe](https://github.com/Microsoft/iis-docker/issues/1) which is used in the IIS Docker image, and you can use in your image:\n\n```\nADD https://github.com/Microsoft/iis-docker/raw/master/windowsservercore/ServiceMonitor.exe C:/ServiceMonitor.exe\nENTRYPOINT [\"C:\\\\ServiceMonitor.exe\", \"w3svc\"]\n```\n\nThe `ADD` instruction downloads the binary file from GitHub and copies it into the image. The `ENTRYPOINT` instruction tells Docker to run `ServiceMonitor.exe` when a container starts, passing `w3svc` as the startup argument. The utility will start the IIS Windows Service and monitor the background process. If IIS stops, `ServiceMonitor` can flag the failure up to Docker, for the platform to take action.\n\nThe Dockerfile is nearly complete - you just need to copy in and configure the sample application.\n\n## Configuring ASP.NET Applications in Docker\n\nFor version 1 you're going to package the application as-is, without any code changes, to run it in Docker. But you will need some configuration changes. The existing configuration expects to use [SQL Server Express LocalDB](https://blogs.msdn.microsoft.com/sqlexpress/2011/07/12/introducing-localdb-an-improved-sql-express/) for the database:\n\n```\n<connectionStrings>\n  <add name=\"ProductLaunchDb\" \n       providerName=\"System.Data.SqlClient\" \n       connectionString=\"Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;AttachDbFilename=|DataDirectory|\\ProductLaunch.mdf\"/>\n</connectionStrings>\n```\n\nThat may be OK for developers, as LocalDB comes installed with Visual Studio. You could even install LocalDB in our Docker image and use the same configuration, but that's not good practice. That would mean running one container which hosts both the web app and the database, tightly coupling them and making it difficult to scale or upgrade the components separately. Instead you'll run SQL Server Express in a separate container, and change the connection string in the config file.\n\nThere is a separate [Web.config](v1-src/docker/web/Web.config) file, which you'll use in your deployment process - copying it over the existing `Web.config` file from the published application. The connection string in the new file uses `sql-server` as the database server name, and specifies user credentials:\n\n```\n<connectionStrings>\n  <add name=\"ProductLaunchDb\" \n       providerName=\"System.Data.SqlClient\" \n       connectionString=\"Server=sql-server;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\"/>\n</connectionStrings>\n```\n\nWhen you run the web application, the DNS server in the Docker platform will resolve the `sql-server` host name to the correct address of the container called `sql-server`.\n\n> There are separate `Web.config` files at this stage to clearly show that you can take an existing app and run it in Docker without any changes. In the next stage of the lab you'll use a different approach to configuration so you can use the Docker platform to manage configuration.\n\nAll you need to do to finish the Dockerfile is copy in the published website, which is the output from running the build agent container, and then copy over the replacement `Web.config` file:\n\n```\nCOPY ProductLaunchWeb/_PublishedWebsites/ProductLaunch.Web /web-app\nCOPY Web.config /web-app/Web.config\n```\n\nYou'll be scripting the whole build process, so you can use hard-coded paths for the file locations in the source and the target, knowing that they will exist.\n\n> The order of the instructions in the Dockerfile is important. Each instruction creates a new read-only [image layer](https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/), which can be cached and used in future builds or in other images. You start with the most generic instructions and get more specific. The final instruction copies in the website content - if you change code and rebuild the image, Docker will re-use all the existing layers and just run the final `COPY` instruction to copy in the new content, which makes for fast, efficient builds.\n\n\n## Packaging the ASP.NET App as a Docker Image\n\nTo create the image you run `docker build` using the new Dockerfile, assuming you have already packaged and run the builder. Or you can run every step with a simple PowerShell script - this is the [build.ps1](v1-src/build.ps1) script for compiling version 1 of the app and packaging it as a Docker image:\n\n```\ndocker build `\n -t dockersamples/modernize-aspnet-builder `\n $pwd\\docker\\builder\n\ndocker run --rm `\n -v $pwd\\ProductLaunch:c:\\src `\n -v $pwd\\docker:c:\\out `\n dockersamples/modernize-aspnet-builder `\n C:\\src\\build.ps1 \n\ndocker build `\n -t dockersamples/modernize-aspnet-web:v1 `\n $pwd\\docker\\web\n```\n\nThe first full build will take a while, as the image are set up with everything they need. But because of the smart way Docker caches and re-uses image layers, subsequent full builds will take very little time. Packaging a new version should take under a minute, and most of that time will be spent in MSBuild. \n\nIf you run `docker images` now, you'll see the Windows Server Core base image, the build agent image, and the application image. `dockersamples/modernize-aspnet-web:v1` is the packaged version of the ASP.NET sample app, configured and ready to run as a Docker container.\n\n## Part 2 - Recap\n\nYou put together a Dockerfile which uses Windows Server Core as the base, installs IIS and ASP.NET and configures a web application. Up to that point, the Dockerfile is suitable for any app, and to customize it you just copied in the published WebForms application.\n\nTo keep the configuration of the app in the Docker image separate from the development configuration, you used a different `Web.config` file for the image, but you'll see a better way of managing configuration later in the lab.\n\nNow you're ready for [Part 3 - Running ASP.NET applications as Docker containers](part-3.md).\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/part-3.md",
    "content": "# Part 3 - Running ASP.NET applications as Docker containers\n\nYou have a Docker image from [Part 2](part-2.md) which contains the configured application with all its dependencies. To run the website you just need to start a container, but the application needs to connect to a database. The networking stack in Docker means you can use a remote SQL Server instance, not running on Docker, or you can run SQL Server in a Docker container:\n\n![v1 architecture in Docker](img/v1-docker-arch.png)\n\nFor this lab, the sample application uses [Entity Framework Code-First](https://weblogs.asp.net/scottgu/code-first-development-with-entity-framework-4), so you don't need to deploy the database schema. When the app first runs, it will create the database if needed, so you can start an empty SQL Server container and let the app initialize the schema. There's an alternative approach in the [Windows SQL Server lab](https://github.com/docker/labs/blob/master/windows/sql-server/README.md), where the schema is packaged into an image using SQL Server Data Tools.\n\n## Running App Dependencies\n\nMicrosoft provide a SQL Server Express image for Windows on Docker Store - [microsoft/mssql-server-windows-express](https://store.docker.com/images/mssql-server-windows-express). [Express Edition](https://www.microsoft.com/en-us/sql-server/sql-server-editions-express) is suitable for non-production and small-scale production environments (the current limitation is 10GB of storage), and with Docker it's easy to run separate databases in SQL Server instances, as separate containers.\n\nTo run SQL Server Express in Docker, you can start a container from Microsoft's image:\n\n```\ndocker run --detach `\n --publish 1433:1433 `\n --env sa_password=d0ck3r_Labs! `\n --env ACCEPT_EULA=Y `\n --name sql-server `\n microsoft/mssql-server-windows-express\n```\n\nIn the `docker run` command you start the container in the background with the `detached` option, and `publish` the standard SQL Server port 1433, so you can connect to SQL Server outside of Docker. The command uses environment variables to specify a password for the SA user account (which match the credentials in the Web.config file for the application), and accept the licence agreement. Lastly the container is given the name `sql-server` which means other containers in the same Docker network will be able to reach the database using that host name.\n\nThe database is the only dependency for version 1 of the app, so now you can run it.\n\n## Running the ASP.NET WebForms App\n\nStarting the website is as simple running a container from the application image we've built:\n\n```\ndocker run -d -p 80:80 `\n --name web `\n dockersamples/modernize-aspnet-web:v1\n```\n\nIf you run `docker ps` now, you'll see two containers - one running SQL Server and one running the WebForms app. To browse to the app, you need to get the IP address of the container (that's a temporary step for now, as [port mapping doesn't work in localhost](https://docs.microsoft.com/en-gb/virtualization/windowscontainers/manage-containers/container-networking)). The `docker inspect` command returns a whole lot of information about the container, and it also takes a format string which we can use to get just the IP address:\n\n```\nPS> docker inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' web\n172.20.250.65\n```\n\nIn this case the website is available at *http://172.20.250.65*, but your container's IP address will be different. Browse to the IP address and you'll see the website:\n\n![img](img/v1-homepage.png)\n\nIt will take a few moments to see the home page, because the container starts up cold - IIS is running, but it will spawn a worker process when it receives the first request, and then the app initializes the database. When you see the 'product launch' homepage, then all the startup tasks are done. The next hit to the website will return much more quickly.\n\n## Verifying Functionality\n\nVersion 1 of the app only really has two features - a landing page to get you interested, and a sign-up page to record your details. You've seen the home page so that feature is working, and you can click through to the sign up page to check the second feature. The form collects basic information:\n\n![img](img/v1-signup.png)\n\nOnce you submit it you see a sign-up page. You can connect to the SQL Server database running in Docker to check the data, or you can make use of another part of the Docker platform and execute a command inside a running container.\n\nThe SQL Server Express Docker image is packaged with the SQL Server PowerShell module, so even if you don't have a SQL client installed you can execute queries by running SQL commands inside the container. `docker exec` is the command for that, and this is how to run a SQL query and show the output:\n\n```\ndocker exec sql-server `\n powershell -Command `\n  \"Invoke-SqlCmd -Query 'SELECT * FROM Prospects' -Database ProductLaunch\"\n```\n\nYou'll see a row for each time you submitted the form, something like this:\n\n```\nProspectId          : 1\nFirstName           : Elton\nLastName            : Stoneman\nCompanyName         : Docker, Inc.\nEmailAddress        : elton@docker.com\nRole_RoleCode       : DA\nCountry_CountryCode : GBR\n```\n\nThat means the app is working correctly and storing the data in SQL Server.\n\n\n## Part 3 - Recap\n\nNow you've taken the .NET WebForms app and it's running in Docker. You have a version tag in the image name, and you could share the image on a public registry like [Docker Store](https://store.docker.com), or run your own [private registry in Docker](https://github.com/docker/labs/blob/master/windows/registry/README.md), or an enterprise-grade solution like [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.1/guides/). Anyone with access to the registry can pull the image and run the application, and it will behave in the exact same way.\n\nAt this stage you need to communicate a dependency on SQL Server for the application, and it's still a manual step to start both the database and application containers. Later in the lab you'll see how to capture all the dependencies for a distributed solution, and automate the startup using [Docker Compose](https://docs.docker.com/compose/overview/).\n\nAlready you've made a big improvement for managing and deploying the application. Automation and repeatability are baked into the process, which is consistent between environments. And now that you have the app running in Docker, you can easily make use of the platform to modernize the app and improve the features - which you'll do in [Part 4 - Improving performance with asynchronous messaging](part-4.md)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/part-4.md",
    "content": "# Part 4 - Improving Performance with Asynchronous Messaging\n\nModernizing apps can be a significant amount of work. You can break a monolithic app into microservices along the lines of bounded contexts, re-platform all the services to use .NET Core and run them in Nano Server containers. There's a lot to gain from doing that, and the Docker platform enables that approach, but it's a rebuild project which needs a lot of investment.  Docker also supports a more targeted, feature-driven modernization, where you take specific features of your app that need improving, and redesign them to take advantage of Docker - without an extensive rebuild.\n\nYou're going to look at one feature improvement in this part, addressing performance and scalability. In version 1 of the app the sign-up form makes a connection to the database and executes synchronous database queries. That approach doesn't scale. If there's a spike in traffic to our site you can run more web containers to spread the load, but you'd hit a bottleneck on the number of open connections the database can handle. You'd have to scale the database too, because the web tier is tightly coupled to the data tier.\n\nFor this scenario, you can easily address that by making the sign up feature asynchronous. Instead of persisting to the database directly, the sign-up form will publish an event to a message queue, and a handler listening to that event makes the database call:\n\n![v2 architecture](img/v2-arch.png)\n\nThat decouples the web layer from the data layer and means you can scale to meet demand just by adding more web containers. At times of high load the message queue will hold onto the events until the handler is ready to action them. There may be a delay between users clicking the button and their data being persisted, but the delay is happening offline - the user will see the thank-you page almost instantly, no matter how much traffic is hitting the site.\n\n## Changing the App to Use Asynchronous Messaging\n\nIn the `v2-src` folder there's a new version of the solution which uses messaging to publish an event when a prospect signs up, rather than writing to the database directly. The main change is in the [SignUp code-behind](v2-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.cs) for the webform. In version 1 the `btnGo_Click` handler used this code, to insert the prospect details into the database:\n\n```\nusing (var context = new ProductLaunchContext())\n{\n    //reload child objects:\n    prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n    prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n    context.Prospects.Add(prospect);\n    context.SaveChanges();\n}\n```\n\nIn version 2, that's been replaced with this code to publish an event message:\n\n```\nvar eventMessage = new ProspectSignedUpEvent\n{\n    Prospect = prospect,\n    SignedUpAt = DateTime.UtcNow\n};\n\nMessageQueue.Publish(eventMessage);\n```\n\nThe `ProspectSignedUpEvent` object contains the original `Prospect` object, populated from the webform input. The `MessageQueue` class is just a wrapper to abstract the type of message queue. In this lab you'll be using [NATS](https://nats.io), a high-performance, low-latency, cross-platform and open-source message server. NATS is available as an [official image](https://store.docker.com/images/nats) on Docker Store, which means it's a curated image that you can rely on for quality. Publishing a Message to NATS means multiple subscribers can listen for the event, and you start to bring [event-driven architecture](https://msdn.microsoft.com/en-us/library/dd129913.aspx) into the application - just for the one feature that needs it, without a full rewrite.\n\n## Changing App Configuration to use Environment Variables\n\nOne other thing has changed in the WebForms app. Instead of using `Web.config` for configuration values which may change between environments, the app now uses environment variables. Lightweight modern app frameworks like [NodeJS](https://nodejs.org/en/) and [.NET Core](www.microsoft.com/net/core) use environment variables for configuration settings, because they're available in pretty much any host platform - Windows, Linux and PaaS platforms in the cloud. You can do the same in full .NET apps, and moving from config files baked into the deployment package to environment variables set by the platform makes your app more portable.\n\nIn the Entity Framework [ProductLaunchContext](v2-src/ProductLaunch/ProductLaunch.Model/ProductLaunchContext.cs) class the database connection string is now loaded from an environment variable, using a simple [Config](v2-src/ProductLaunch/ProductLaunch.Model/Config.cs) class which just reads the value by its key:\n\n```\nvar value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n```\n\nTo configure the database, you need to set the connection string as an environment variable named `DB_CONNECTION_STRING`. A similar [Config](v2-src/ProductLaunch/ProductLaunch.Messaging/Config.cs) class in the message queue project gets the URL for the NATS host from an environment variable named `MESSAGE_QUEUE_URL`. The Docker platform has first-class support for environment variables. They can be created with a default value in a Docker image, and containers can be run with specific values.\n\nIn the [Dockerfile](v2-src/docker/web/Dockerfile) for the web app, the default value for the message queue URL is specified as an environment variable using the `ENV` instruction:\n\n```\nENV MESSAGE_QUEUE_URL=\"nats://message-queue:4222\"\n```\n\nAny container you start from that image will have the same value for the URL, unless you specifically override it. For the message queue, that's what you want because you'll control the name of the message queue container and you can be confident it will always match the expected URL. For the database connection string there isn't a default value, because it needs user crtdentials which are likely to change between environments, so you will specify that at the container level.\n\n## Building a .NET Message handler\n\nNow the web app is built and configured to use messaging, you need another component in the solution to listen for events and save data to the database. Message handlers are typically simple components that do a single job - they listen for a specific type of message and act on it.\n\nIn the version 2 source folder there's a message hanbdler project. It's a .NET console app with all the code in the [Program](v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Program.cs) class. It connects to NATS using the same messaging project, and listens for `ProspectSignedUpEvent` messages. For each message it receives, the handler extracts the prospect details from the message and saves them to the database:\n\n```\nvar prospect = eventMessage.Prospect;\nusing (var context = new ProductLaunchContext())\n{\n    //reload child objects:\n    prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n    prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n    context.Prospects.Add(prospect);\n    context.SaveChanges();\n}\n```\n\nThat's the exact same code that was in the web form in version 1. This is a common pattern that applies for any features which are resource-bound and need to scale well. You extract the functionality from the synchronous implementation, and publish a message instead. Then you move the extracted code to a message handler - this is a simple example, but if you have a complex function with multiple external dependencies, the practice is exactly the same.\n\nIn this case you'll be running a single instance of the message handler, but for performance-critical functions you can run multiple instances and they will share the work from the queue. The message queue acts as a buffer, smoothing out any peaks in demand from the website and presenting a consistent flow of work to the message handler.\n\nThe messaga handler will run in a Docker container too. The [Dockerfile](v2-src/docker/save-handler/Dockerfile) is very simple. .NET is already installed in the `microsoft/windowsservercore` base image, so the Dockerfile just configures the DNS cache, sets the default message queue URL in an environment variable and copies in the compiled console app. In this example there's no `HEALTHCHECK`, but it would be good practice to add an HTTP endpoint to the console app which reported the app status, so you could add a health check to this component.\n\n\n## Co-ordinating Multiple Containers in Docker\n\nThe application has evolved in version 2, and you now have a distributed solution running across four containers. There are dependencies between those containers. The database and the message queue need to be running for the web application to run correctly, and the message handler needs to be running for the full feature set to work. The containers all need to be on the same Docker network so they can communicate, and the dependent containers need to have the expected names so Docker can resolve them by hostname.\n\nYou could manage those dependencies manually by starting containers in the correct order, or you could automate all the `docker run` commands in a PowerShell script. A better option is to use another part of the Docker Platform, [Docker Compose](https://docs.docker.com/compose/). Compose is a tool for capturing complex distributed solutions in a single, executable script file. Just as the Dockerfile replaces the deployment document for a single component, the compose file replaces the deployment document for a whole solution.\n\nThis is the definition of the web application in the [version 2 Docker Compose file](v2-src/docker-compose.yml):\n\n```\n  product-launch-web:\n    image: modernize-aspnet-web:v2\n    ports:\n      - \"80:80\"\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\n    depends_on:\n      - product-launch-db\n      - message-queue\n    networks:\n      - app-net\n```\n\nDocker Compose lets you capture the setup of each service using familiar terminology from `docker run`. You specify the image to create containers from, publish port 80, and set up the database connection string in an environment variable (if you think having the credentials in plain text isn't good, there are [other ways](https://docs.docker.com/compose/env-file/) of dealing with [secrets in Docker](https://docs.docker.com/engine/swarm/secrets/).\n\nThere is extra functionality in Docker Compose too. The `depends_on` attribute lets you explicitly define dependencies between services. In this case the web service is dependent on the database and message queue services - Compose will ensure those services are running before it starts the web service (\"service\" is Compose terminology - a service definition is implemented by running one or more containers).\n\nIn the version 2 code, the [compilation build script](v2-src/ProductLaunch/build.ps1) adds a new step to build the message handler console app. The ASP.NET build agent we put together in [Part 1](part-1.md) can also build the console app, so the [packaging build script](v2-src/build.ps1) uses the same build agent for the website and the console app. There's a new `docker build` step to create the image for the console app, and that's all you need to build and package the full solution.\n\n## Running the Version 2 App with Docker Compose\n\nYou should clean up the previous version of the app by killing and then removing all the containers. **WARNING: this will remove all of your containers**.\n\n```\ndocker kill $(docker ps -a -q)\ndocker rm $(docker ps -a -q)\n```\n\nDocker Compose can be used for running solutions as well as defining them. From the `v2-src` directory you can build and run the application with two commands:\n\n```\n.\\build.ps1\ndocker-compose up -d\n```\n\n> If you're using [Docker for Windows](https://docs.docker.com/docker-for-windows/) on Windows 10, then Docker Compose is already installed as part of the package. On Windows Server 2016 you can download `docker-compose.exe` from the [GitHub release page](https://github.com/docker/compose/releases). \n\nUnder the hood, Docker Compose uses the API from the Docker Engine to run containers. It's a wrapper around the Docker Engine rather than a separate component. When you run this for the first time, Docker will pull down the NATS image (which is a very small layer on top of the Windows Server Core image), and then start all the containers. `docker ps` will show you all the containers, and you can fetch the IP address of the new web container with:\n\n```\ndocker inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' v2src_product-launch-web_1\n```\n\nNow you can browse to the website and enter a new prospect, and the behavior for the user is exactly the same. But the web layer and data layer are decoupled, so to support thousands of concurrent users, you can scale up just by running more containers on more hosts in a [Docker Swarm](https://www.docker.com/products/docker-swarm).\n\nTo verify that the event message is being published and handled, you can look at the logs from the message handler running in the .NET console app:\n\n```\n> docker logs v2src_save-prospect-handler_1\nConnecting to message queue url: nats://message-queue:4222\nListening on subject: events.prospect.signedup\nReceived message, subject: events.prospect.signedup\nSaving new prospect, signed up at: 2/1/2017 8:48:34 PM; event ID: f11fba28-45ee-4476-a9a8-24b3c4689240\nProspect saved. Prospect ID: 1; event ID: f11fba28-45ee-4476-a9a8-24b3c4689240\n```\n\nThat output is from the `Console.WriteLine()` statements in the code, which Docker is able to record and show. And you can still run a SQL command in the database container:\n\n```\ndocker exec v2src_product-launch-db_1 `\n powershell -Command `\n  \"Invoke-SqlCmd -Query 'SELECT * FROM Prospects' -Database ProductLaunch\"\n```\n\nThat will return any data you added since you started version 2:\n\n```\nProspectId          : 1\nFirstName           : Gordon\nLastName            : Turtle\nCompanyName         : Docker, Inc.\nEmailAddress        : gordon.the.turtle@docker.com\nRole_RoleCode       : DM\nCountry_CountryCode : USA\n```\n\n> If you're wondering where all the data went from testing version 1 of the app, in version 2 you're running a completely new container. In this lab you're not using [Docker Volumes](https://docs.docker.com/engine/tutorials/dockervolumes/) to persist data outside of the container, but take a look at the [SQL Server Lab](https://github.com/docker/labs/blob/master/windows/sql-server/README.md) to see how to do that.\n\n\n## Part 4 - Recap\n\nMoving the web app to Docker gives you a modern, scalable and easily pluggable platform to modernize it. Containers running in the same Docker network can communicate with very little overhead, and with [Docker Store](https://store.docker.com) there are thousands of ready-built, enterprise-grade, open-source applications which you can drop straight into your solution.\n\nYou made one of the app features asynchronous by pulling the functionality out of the website, and into a message handler, using the NATS message queue to plumb them together. [NATS](http://nats.io) is a very performant, high-quality messaging system which is perfect for microservice or event-driven architectures, and it can be added to a Dockerized solution with very little effort. Without Docker you would need to commission servers for the message queue and ensure it ran with the same level of high-availability as the web application. With Docker you run the queue and the app on the same cluster, and the whole solution has the same level of HA.\n\nPerformance problems are a great candidate for taking into a modernization program. With asynchronous messaging you can add scalability and performance by targeting a specific feature. In the last part of the lab, you'll see that the Docker platform makes it just as easy to spin out existing features into new containers, but maintain synchronous communication - in [Part 5 - Enabling fast prototyping with separate UI components](part-5.md)."
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/part-5.md",
    "content": "# Part 5 - Enabling Fast Prototyping with Separate UI Components\n\nIn [Part 4](part-4.md) you modernized one part of the sample application by making use of the Docker platform, and addressed a performance feature. That's an improvement which will benefit all the stakeholders of the app - ops folks now have an app which is easy to maintain, upgrade and scale; dev folks have the freedom to bring new technology into the app without a rewrite; business folks have an app which behaves correctly under pressure and continues to work for users.\n\nYou'll modernize one more feature in this lab, which will be similarly beneficial to all stakeholders. A major advantage of microservice architecture is that you can easily replace service implementations without significant work. You can replace a service with a new component without changing consumers, provided the service contract is honored.\n\nThat's a huge enabler for business product owners, which you'll see in this final part. You're going to spin out the homepage for the website into a new component, and decopuple it from the rest of the web app:\n\n![v3 architecture](img/v3-arch.png)\n\nWith that, product owners can iterate on new versions quickly without having to do a full regression test of the whole application. Users only need to test the homepage component, ops only need to release the homepage component, and devs can freely choose the technology stack for the new component.\n\n## Extracting the Homepage from the Web app\n\nIn version 1 and version 2, the WebForms app renders the homepage itself from the [Default.aspx](v3-src/ProductLaunch/ProductLaunch.Web/Default.aspx.cs) page. In version 3, the `Page_Load` method has changed, to let you swap in a different component:\n\n```\nif (!string.IsNullOrEmpty(Config.HomePageUrl))\n{\n    Response.Clear();\n    var request = HttpWebRequest.Create(Config.HomePageUrl);\n    var response = request.GetResponse();\n    using (var stream = response.GetResponseStream())\n    using (var reader = new StreamReader(stream))\n    {\n        var html = reader.ReadToEnd();\n        Response.Write(html);\n    }\n    Response.End();           \n}\n```\n\nThere are a few things to note here:\n\n- the code checks a config value to see if the home page URL has been configured. You can use that as a feature switch to choose between the existing content or a new component;\n- if a URL is specified, the page fetches the complete content of that URL, synchronously with an `HttpWebRequest` object;\n- the page returns the content of the external URL using `Response.Write()` and then ends the response, so the content from the default page is not rendered.\n\nThis is a simplistic approach but it illustrates how you can extract one UI feature from the main web application without changing the routing of the app. Users will still land at the original location, and the new content component doesn't need to be publicly accessible, it can be private to the Docker network.\n\nAs before you now have an environment variable for the new home page location, `HOMEPAGE_URL` which you can set as a default value in the image, or as a specific value in a `docker run` command or a Docker Compose file.\n\n## Building a Homepage Component\n\nThere's no contract between the main web app and the homepage component, other than the expectation that it will return valid HTML. For the new UI you could use ASP.NET MVC, or ASP.NET Core - or in fact any web framework. Decoupling a UI component like this gives the dev team a huge amount of freedom to evaluate new frameworks in a meaningful way. They can go to production quickly and safely, and they can be just as quickly and safely backed out.\n\nIn this lab there's a simple static HTML site for the new landing page, which will run in a Docker container alongside the rest of the solution. The [Dockerfile](v3-src/docker/homepage/Dockerfile) is extremely simple:\n\n```\nFROM microsoft/iis:windowsservercore-10.0.14393.693 \nCOPY index.html c:/inetpub/wwwroot/index.html\n```\n\nThe image uses the [microsoft/iis](https://store.docker.com/images/iis) base image, which is itself based on Windows Server Core, with IIS installed and using the same ServiceMonitor tool. The only other instruction is to copy in the `index.html` file to a known location on the image, which is the content root for the default website in IIS.\n\n> The integration between the web app and the new homepage component is simplified in this example. Dependencies for the new content (stylesheets, scripts and images) would need to be publicly accessible. A better approach would be to use a reverse proxy as the entrypoint to the app, and define the routings in the proxy.\n\n\n## Running the Version 3 App with Docker Compose\n\nThe [compilation build script](v3-src/ProductLaunch/build.ps1) for version 3 is unchanged, because there are no new .NET projects to build. The [packaging build script](v3-src/build.ps1) has an extra step to package the homepage website into a new Docker image. In the [docker-compose.yml](v3-src/docker-compose.yml) file there's a new entry for the homepage service:\n\n```\n  product-launch-homepage:\n    image: dockersamples/modernize-aspnet-homepage:v3 \n    ports:\n      - \"81:80\"\n    networks:\n      - app-net\n```\n\nAnd the defintion of the web app has changed to add the `HOMEPAGE_URL` value, and specify the homepage service as a dependency:\n\n```\n  product-launch-web:\n    image: dockersamples/modernize-aspnet-web:v3\n    ports:\n      - \"80:80\"\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\n      - HOMEPAGE_URL=http://product-launch-homepage\n    depends_on:\n      - product-launch-db\n      - message-queue\n      - product-launch-homepage\n    networks:\n      - app-net\n```\n\nBecause the source is in a different folder for version 3, Docker Compose sees it as a different application. You'll need to start in the `v2-src` folder and tear down the existing containers:\n\n```\ndocker-compose kill\ndocker-compose rm -f\n```\n\nNow in the `v3-src` folder, run the build script to compile and package the images, and then use Docker Compose to run the application:\n\n```\n.\\build.ps1\ndocker-compose up -d\n```\n\nIn a real upgrade scenario, the source locations wouldn't change, and Docker Compose would see it as an upgrade rather than a different application. In that case Docker Compose checks the running containers and it will only upgrade containers where the definition in the Compose file has changed. \n\n> In this case the message handler code hasn't actually changed, so you could have continued to use the `v2` tag and Compose could have retained the previous container. In a distributed solution it can be useful to build all images and tag them with the same version number, so you know you can run the same version of all components and they will work togther. It's not required though, the Compose file explicitly states which versions to use and Docker Compose will only deploy the changed components.\n\n## Testing the Final application\n\nAs before, you need to get the IP address of the web application container, and then you can browse to it and see the new homepage:\n\n```\ndocker inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' v3src_product-launch-web_1\n```\n\nWhen you hit the web application, it will make a call to the homepage component and render the awesome new UI:\n\n![v3 homepage](img/v3-homepage.gif)\n\nIf you can hit the 'Register now' link in between the blinking, you'll see the original sign-up page. As before, when you submit the form the app publishes an event message, and the message handler saves the details to the database. The existing functionality is all preserved, but now you have a new homepage component and the ability to switch out the homepage service, or revert to the original hompeage will just a change to the Docker Compose file.\n\n## Part 5 - Recap\n\nThis section completes the lab. You modified the original application to fetch the home page content from a separate service, and built a replacement landing page using a static HTML site running in IIS. The new landing page probably needs a little design work, but it illustrates the point that you can use any framework for the new UI component. The project team could experiment with [React](https://facebook.github.io/react/) or [Ember](http://emberjs.com/), or even Dockerize a CMS like [Umbraco](https://umbraco.com/umbraco-for-site-owners/) and give the business users self-service content.\n\nIn this lab you started with a monolothic ASP.NET WebForms app, and modernized it using the Docker platform:\n\n- packaging a build agent as a Docker image, to build the app consistently on a laptop or a CI server without needing Visual Studio;\n- packaging the WebForms app as a Docker image, so it runs in the same way on any Windows machine running Docker;\n- extracting key features from the monolith into small services, encapsulated in separate Docker images;\n- integrating enterprise-grade third party software from Docker Store into the solution;\n- capturing the full solution configuration in a runnable format using Docker Compose.\n\nTaking a feature-driven approach to modernization gives you fast and quantifiable return on investment when you move your application to Docker. In the lab you took steps towards an event-driven architecture, and made use of a microservice approach to the UI, without an extensive re-write of the application. You've seen that the Docker platform enables app modernization, with a focus on business value and without a full re-architecture of the application.\n\n\n## Next steps\n\nMoving your own .NET application to Docker is easy. You don't need to follow the full approach of this lab - if you already have a CI build for your app, you can package the current output into a Docker image, without needing to write a build agent. If you don't have a CI process, but you have the app running in a VM, you can use the [Image2Docker](https://blog.docker.com/2016/12/convert-asp-net-web-servers-docker-image2docker/) tool to extract a Dockerfile from the VM's disk for an ASP.NET app.\n\nThe Windows Server Core image is based on the full Windows Server 2016, and it should suitable for running any Windows app in Docker - provided the app and its dependencies can be installed and run without a Windows UI. ASP.NET 2.0 WebForms apps run fine in Docker, and you can use the [microsoft/aspnet:3.5](https://store.docker.com/images/aspnet) image as the base if you need the 3.5 framework. Java, Go, NodeJS and PHP apps all run in Docker, so the platform has the power to host your whole application stack, and underpin your modernization roadmap."
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Core/Env.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Core\n{\n    public class Env\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string DbConnectionString { get { return Get(\"DB_CONNECTION_STRING\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable);\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Core/ProductLaunch.Core.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{35BD1196-DDCB-41FA-98C5-C8116D749446}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Core</RootNamespace>\n    <AssemblyName>ProductLaunch.Core</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Env.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Core/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Core\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Core\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"35bd1196-ddcb-41fa-98c5-c8116d749446\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <section name=\"specFlow\" type=\"TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow\" />\n  </configSections>\n  <specFlow>\n    <unitTestProvider name=\"MsTest\" />\n  </specFlow>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/ProductLaunch.EndToEndTests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.EndToEndTests</RootNamespace>\n    <AssemblyName>ProductLaunch.EndToEndTests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"TechTalk.SpecFlow, Version=2.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SpecFlow.2.1.0\\lib\\net45\\TechTalk.SpecFlow.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.WebDriver.3.0.1\\lib\\net40\\WebDriver.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver.Support, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.Support.3.0.1\\lib\\net40\\WebDriver.Support.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\" />\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"ProspectSignUp.feature.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>ProspectSignUp.feature</DependentUpon>\n    </Compile>\n    <Compile Include=\"ProspectSignUpSteps.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"packages.config\" />\n    <None Include=\"ProspectSignUp.feature\">\n      <Generator>SpecFlowSingleFileGenerator</Generator>\n      <LastGenOutput>ProspectSignUp.feature.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets\" Condition=\"Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"d47cf813-de0e-4cc4-b9ed-8ee4b6f14869\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature",
    "content": "﻿Feature: Prospect Sign Up\n\tAs a prospect interested in the product launch\n\tI want to sign up for notifications\n\tSo that I can be updated with news\n\nScenario Outline: Sign Up with Valid Details\n\tGiven I browse to the Sign Up Page at \"localhost:57120\"\n\tAnd I enter details '<FirstName>' '<LastName>' '<EmailAddress>' '<CompanyName>' '<Country>' '<Role>'\n\tWhen I press Go\n\tThen I should see the Thank You page\n\nExamples:\n\t| FirstName | LastName | EmailAddress           | CompanyName   | Country        | Role           |\n\t| Prospect  | A        | a.prospect@company.com | Company, Inc. | United States  | Decision Maker |\n\t| Prospect  | B        | b.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | C        | c.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | D        | d.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | E        | e.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | F        | f.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | G        | g.prospect@company.com | Company, Inc. | United States  | Engineer       |\n\t| Prospect  | H        | h.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | I        | i.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | J        | j.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | K        | k.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | L        | l.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | M        | m.prospect@company.com | Company, Inc. | Sweden         | Architect      |\n\t| Prospect  | N        | n.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | O        | o.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | P        | p.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | Q        | q.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | R        | r.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | S        | s.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | T        | t.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | U        | u.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | V        | v.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | W        | w.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | X        | x.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | Y        | y.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | Z        | z.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature.cs",
    "content": "﻿// ------------------------------------------------------------------------------\n//  <auto-generated>\n//      This code was generated by SpecFlow (http://www.specflow.org/).\n//      SpecFlow Version:2.1.0.0\n//      SpecFlow Generator Version:2.0.0.0\n// \n//      Changes to this file may cause incorrect behavior and will be lost if\n//      the code is regenerated.\n//  </auto-generated>\n// ------------------------------------------------------------------------------\n#region Designer generated code\n#pragma warning disable\nnamespace ProductLaunch.EndToEndTests\n{\n    using TechTalk.SpecFlow;\n    \n    \n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"TechTalk.SpecFlow\", \"2.1.0.0\")]\n    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()]\n    public partial class ProspectSignUpFeature\n    {\n        \n        private static TechTalk.SpecFlow.ITestRunner testRunner;\n        \n#line 1 \"ProspectSignUp.feature\"\n#line hidden\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()]\n        public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext)\n        {\n            testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(null, 0);\n            TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo(\"en-US\"), \"Prospect Sign Up\", \"\\tAs a prospect interested in the product launch\\r\\n\\tI want to sign up for notificat\" +\n                    \"ions\\r\\n\\tSo that I can be updated with news\", ProgrammingLanguage.CSharp, ((string[])(null)));\n            testRunner.OnFeatureStart(featureInfo);\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()]\n        public static void FeatureTearDown()\n        {\n            testRunner.OnFeatureEnd();\n            testRunner = null;\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()]\n        public virtual void TestInitialize()\n        {\n            if (((testRunner.FeatureContext != null) \n                        && (testRunner.FeatureContext.FeatureInfo.Title != \"Prospect Sign Up\")))\n            {\n                ProductLaunch.EndToEndTests.ProspectSignUpFeature.FeatureSetup(null);\n            }\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()]\n        public virtual void ScenarioTearDown()\n        {\n            testRunner.OnScenarioEnd();\n        }\n        \n        public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)\n        {\n            testRunner.OnScenarioStart(scenarioInfo);\n        }\n        \n        public virtual void ScenarioCleanup()\n        {\n            testRunner.CollectScenarioErrors();\n        }\n        \n        public virtual void SignUpWithValidDetails(string firstName, string lastName, string emailAddress, string companyName, string country, string role, string[] exampleTags)\n        {\n            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo(\"Sign Up with Valid Details\", exampleTags);\n#line 6\nthis.ScenarioSetup(scenarioInfo);\n#line 7\n testRunner.Given(\"I browse to the Sign Up Page at \\\"localhost:57120\\\"\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Given \");\n#line 8\n testRunner.And(string.Format(\"I enter details \\'{0}\\' \\'{1}\\' \\'{2}\\' \\'{3}\\' \\'{4}\\' \\'{5}\\'\", firstName, lastName, emailAddress, companyName, country, role), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"And \");\n#line 9\n testRunner.When(\"I press Go\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"When \");\n#line 10\n testRunner.Then(\"I should see the Thank You page\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Then \");\n#line hidden\n            this.ScenarioCleanup();\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"A\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"a.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant0()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"A\", \"a.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"B\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"b.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant1()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"B\", \"b.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"C\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"c.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant2()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"C\", \"c.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"D\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"d.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant3()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"D\", \"d.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"E\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"e.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant4()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"E\", \"e.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"F\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"f.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant5()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"F\", \"f.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"G\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"g.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Engineer\")]\n        public virtual void SignUpWithValidDetails_Variant6()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"G\", \"g.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Engineer\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"H\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"h.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant7()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"H\", \"h.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"I\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"i.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant8()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"I\", \"i.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"J\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"j.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant9()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"J\", \"j.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"K\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"k.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant10()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"K\", \"k.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"L\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"l.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant11()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"L\", \"l.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"M\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"m.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant12()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"M\", \"m.prospect@company.com\", \"Company, Inc.\", \"Sweden\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"N\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"n.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant13()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"N\", \"n.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"O\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"o.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant14()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"O\", \"o.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"P\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"p.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant15()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"P\", \"p.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Q\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"q.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant16()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Q\", \"q.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"R\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"r.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant17()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"R\", \"r.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"S\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"s.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant18()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"S\", \"s.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"T\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"t.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant19()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"T\", \"t.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"U\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"u.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant20()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"U\", \"u.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"V\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"v.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant21()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"V\", \"v.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"W\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"w.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant22()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"W\", \"w.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"X\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"x.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant23()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"X\", \"x.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Y\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"y.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant24()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Y\", \"y.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Z\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"z.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant25()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Z\", \"z.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n    }\n}\n#pragma warning restore\n#endregion\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUpSteps.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Firefox;\nusing OpenQA.Selenium.Support.UI;\nusing System;\nusing System.Threading;\nusing TechTalk.SpecFlow;\n\nnamespace ProductLaunch.EndToEndTests\n{\n    [Binding]\n    public class ProspectSignUpSteps\n    {\n        private static IWebDriver _Driver;\n\n        [BeforeFeature]\n        public static void Setup()\n        {\n            _Driver = new FirefoxDriver();\n        }\n\n        [AfterFeature]\n        public static void TearDown()\n        {\n            _Driver.Close();\n            _Driver.Dispose();\n        }\n\n        [Given(@\"I browse to the Sign Up Page at \"\"(.*)\"\"\")]\n        public void GivenIBrowseToTheSignUpPageAt(string host)\n        {\n            var url = $\"http://{host}/SignUp\";            \n            _Driver.Navigate().GoToUrl(url);\n        }\n        \n        [Given(@\"I enter details '(.*)' '(.*)' '(.*)' '(.*)' '(.*)' '(.*)'\")]\n        public void GivenIEnterDetails(string firstName, string lastName, string emailAddress, \n                                       string companyName, string country, string role)\n        {            \n            _Driver.FindElement(By.Id(\"MainContent_txtFirstName\")).SendKeys(firstName);\n            _Driver.FindElement(By.Id(\"MainContent_txtLastName\")).SendKeys(lastName);\n            _Driver.FindElement(By.Id(\"MainContent_txtEmail\")).SendKeys(emailAddress);\n            _Driver.FindElement(By.Id(\"MainContent_txtCompanyName\")).SendKeys(companyName);\n\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlCountry\"))).SelectByText(country);\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlRole\"))).SelectByText(role);\n        }\n\n        [When(@\"I press Go\")]\n        public void WhenIPressGo()\n        {\n            var goButton = _Driver.FindElement(By.Id(\"MainContent_btnGo\"));\n            goButton.Click();\n        }\n        \n        [Then(@\"I should see the Thank You page\")]\n        public void ThenIShouldSeeTheThankYouPage()\n        {\n            //HACK\n            Thread.Sleep(1500);\n            Assert.AreEqual(\"Ta\", _Driver.Title);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.EndToEndTests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Selenium.Firefox.WebDriver\" version=\"0.13.0\" targetFramework=\"net452\" />\n  <package id=\"Selenium.Support\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"Selenium.WebDriver\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"SpecFlow\" version=\"2.1.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Entities/Country.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Country\n    {\n        public string CountryCode { get; set; }\n\n        public string CountryName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Entities/ProductLaunch.Entities.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Entities</RootNamespace>\n    <AssemblyName>ProductLaunch.Entities</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Country.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Prospect.cs\" />\n    <Compile Include=\"Role.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Entities/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Entities\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Entities\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Entities/Prospect.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Prospect\n    {\n        public int ProspectId { get; set; }\n        \n        public string FirstName { get; set; }\n        \n        public string LastName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public Role Role { get; set; }\n\n        public Country Country { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Entities/Role.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Role\n    {\n        public string RoleCode { get; set; }\n\n        public string RoleName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string ElasticsearchUrl { get { return Get(\"ELASTICSEARCH_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Documents/Prospect.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Documents\n{\n    public class Prospect\n    {\n        public string FullName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public string RoleName { get; set; }\n\n        public string CountryName { get; set; }\n\n        public DateTime SignUpDate { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Indexer/Index.cs",
    "content": "using Nest;\nusing ProductLaunch.MessageHandlers.IndexProspect.Documents;\nusing System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Indexer\n{\n    public class Index\n    {\n        public static void Setup()\n        {\n            var node = new Uri(Config.ElasticsearchUrl);\n            var settings = new ConnectionSettings(node);\n            var client = new ElasticClient(settings);\n            client.CreateIndex(\"prospects\");\n        }        \n\n        public static void CreateDocument(Prospect prospect)\n        {\n            try\n            {\n                var node = new Uri(Config.ElasticsearchUrl);\n                var client = new ElasticClient(node);                \n                client.Index(prospect, idx => idx.Index(\"prospects\"));\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine($\"Index prospect FAILED, email address: {prospect.EmailAddress}, ex: {ex}\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/ProductLaunch.MessageHandlers.IndexProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1354B5AB-C990-41EA-9F68-5F9933D83700}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.IndexProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.IndexProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Elasticsearch.Net, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Elasticsearch.Net.5.0.1\\lib\\net45\\Elasticsearch.Net.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Nest, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NEST.5.0.1\\lib\\net45\\Nest.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.9.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Documents\\Prospect.cs\" />\n    <Compile Include=\"Indexer\\Index.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.MessageHandlers.IndexProspect.Indexer;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing System;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Initializing Elasticsearch. url: {Config.ElasticsearchUrl}\");\n            Index.Setup();\n\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += IndexProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void IndexProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Indexing prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = new Documents.Prospect\n            {\n                CompanyName = eventMessage.Prospect.CompanyName,\n                CountryName = eventMessage.Prospect.Country.CountryName,\n                EmailAddress = eventMessage.Prospect.EmailAddress,\n                FullName = $\"{eventMessage.Prospect.FirstName} {eventMessage.Prospect.LastName}\",\n                RoleName = eventMessage.Prospect.Role.RoleName,\n                SignUpDate = eventMessage.SignedUpAt\n            };\n            Index.CreateDocument(prospect);\n\n            Console.WriteLine($\"Prospect indexed; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1354b5ab-c990-41ea-9f68-5f9933d83700\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Elasticsearch.Net\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"NEST\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"9.0.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>  \n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n  </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/ProductLaunch.MessageHandlers.SaveProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{65089C80-27F1-4744-979B-4C5A33B0CFF6}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.SaveProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.SaveProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing ProductLaunch.Model;\nusing System;\nusing System.Linq;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.SaveProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += SaveProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void SaveProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Saving new prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = eventMessage.Prospect;\n            using (var context = new ProductLaunchContext())\n            {\n                //reload child objects:\n                prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n                prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n\n            Console.WriteLine($\"Prospect saved. Prospect ID: {eventMessage.Prospect.ProspectId}; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"65089c80-27f1-4744-979b-4c5a33b0cff6\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Messaging/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Messaging\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string MessageQueueUrl { get { return Get(\"MESSAGE_QUEUE_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Messaging/MessageHelper.cs",
    "content": "﻿using Newtonsoft.Json;\nusing ProductLaunch.Messaging.Messages;\nusing System.Text;\n\nnamespace ProductLaunch.Messaging\n{\n    public class MessageHelper\n    {\n        public static byte[] ToData<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            var json = JsonConvert.SerializeObject(message);\n            return Encoding.Unicode.GetBytes(json);\n        }\n\n        public static TMessage FromData<TMessage>(byte[] data)\n            where TMessage : Message\n        {\n            var json = Encoding.Unicode.GetString(data);\n            return (TMessage)JsonConvert.DeserializeObject<TMessage>(json);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Messaging/MessageQueue.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging.Messages;\n\nnamespace ProductLaunch.Messaging\n{\n    public static class MessageQueue\n    {\n\n        public static void Publish<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            using (var connection = CreateConnection())\n            {\n                var data = MessageHelper.ToData(message);\n                connection.Publish(message.Subject, data);\n            }\n        }\n\n        public static IConnection CreateConnection()\n        {\n            return new ConnectionFactory().CreateConnection(Config.MessageQueueUrl);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Messaging/Messages/Events/ProspectSignedUpEvent.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System;\n\nnamespace ProductLaunch.Messaging.Messages.Events\n{\n    public class ProspectSignedUpEvent : Message\n    {\n        public override string Subject { get { return MessageSubject; } }\n\n        public DateTime SignedUpAt { get; set; }\n\n        public Prospect Prospect { get; set; }\n\n        public static string MessageSubject = \"events.prospect.signedup\";\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Messaging/Messages/Message.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.Messaging.Messages\n{\n    public abstract class Message\n    {\n        public string CorrelationId { get; set; }  \n        \n        public abstract string Subject { get; }      \n\n        public Message()\n        {\n            CorrelationId = Guid.NewGuid().ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Messaging/ProductLaunch.Messaging.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Messaging</RootNamespace>\n    <AssemblyName>ProductLaunch.Messaging</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"MessageHelper.cs\" />\n    <Compile Include=\"MessageQueue.cs\" />\n    <Compile Include=\"Messages\\Events\\ProspectSignedUpEvent.cs\" />\n    <Compile Include=\"Messages\\Message.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup />\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Messaging/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"e02eff91-8c52-4dce-8279-3fd1ee0659ef\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Messaging/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  </configSections>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"Data Source=(localdb)\\v13.0; Integrated Security=True; MultipleActiveResultSets=True\" />\n      </parameters>\n    </defaultConnectionFactory>\n  </entityFramework>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model/Initializers/StaticDataInitializer.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model.Initializers\n{\n    public class StaticDataInitializer : CreateDatabaseIfNotExists<ProductLaunchContext>\n    {\n        protected override void Seed(ProductLaunchContext context)\n        {\n            AddRole(context, \"DA\", \"Developer Advocate\");\n            AddRole(context, \"DM\", \"Decision Maker\");\n            AddRole(context, \"AC\", \"Architect\");\n            AddRole(context, \"EN\", \"Engineer\");\n            AddRole(context, \"OP\", \"IT Ops\");\n\n            AddCountry(context, \"GBR\", \"United Kingdom\");\n            AddCountry(context, \"USA\", \"United States\");\n            AddCountry(context, \"SWE\", \"Sweden\");\n\n            context.SaveChanges();\n        }\n\n        private void AddCountry(ProductLaunchContext context, string code, string name)\n        {\n            context.Countries.Add(new Country\n            {\n                CountryCode = code,\n                CountryName = name\n            });\n        }\n\n        private void AddRole(ProductLaunchContext context, string code, string name)\n        {\n            context.Roles.Add(new Role\n            {\n                RoleCode = code,\n                RoleName = name\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model/ProductLaunch.Model.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model</RootNamespace>\n    <AssemblyName>ProductLaunch.Model</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Initializers\\StaticDataInitializer.cs\" />\n    <Compile Include=\"ProductLaunchContext.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model/ProductLaunchContext.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model\n{\n    public class ProductLaunchContext : DbContext\n    {\n        public ProductLaunchContext() : base(\"ProductLaunchDb\") { }\n\n        public DbSet<Country> Countries { get; set; }\n\n        public DbSet<Role> Roles { get; set; }\n\n        public DbSet<Prospect> Prospects { get; set; }\n\n        protected override void OnModelCreating(DbModelBuilder builder)\n        {\n            builder.Entity<Country>().HasKey(c => c.CountryCode);\n            builder.Entity<Role>().HasKey(r => r.RoleCode);\n            builder.Entity<Prospect>().HasOptional<Country>(p => p.Country);\n            builder.Entity<Prospect>().HasOptional<Role>(p => p.Role);            \n        }        \n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"3afc4a48-5db6-48ff-a459-20ec21a2eb28\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" providerName=\"System.Data.SqlClient\" connectionString=\"Server=172.20.244.163;Database=ProductLaunch;User Id=sa;Password=NDC_l0nd0n;\"/>\n  </connectionStrings>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunch.Model.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{49FD06C3-CD52-425A-866D-831D09268CD0}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model.Tests</RootNamespace>\n    <AssemblyName>ProductLaunch.Model.Tests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Data.Entity\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"ProductLaunchContextTest.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunchContextTest.cs",
    "content": "﻿using System;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing ProductLaunch.Entities;\n\nnamespace ProductLaunch.Model.Tests\n{\n    [TestClass]\n    public class ProductLaunchContextTest\n    {\n        [TestMethod]\n        public void Insert()\n        {\n            using (var context = new ProductLaunchContext())\n            {\n                var country = new Country\n                {\n                    CountryCode = \"GBR\",\n                    CountryName = \"United Kingdom\"\n                };\n                context.Countries.Add(country);\n\n                var role = new Role\n                {\n                    RoleCode = \"DM\",\n                    RoleName = \"Decision Maker\"\n                };\n                context.Roles.Add(role);\n\n                var prospect = new Prospect\n                {\n                    FirstName = \"A\",\n                    LastName = \"Prospect\",\n                    CompanyName = \"Docker, Inc.\",\n                    EmailAddress = \"a.prospect@docker.com\",\n                    Country = country,\n                    Role = role\n                };\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model.Tests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"49fd06c3-cd52-425a-866d-831d09268cd0\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Model.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/About.aspx",
    "content": "﻿<%@ Page Title=\"About\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"About.aspx.cs\" Inherits=\"ProductLaunch.Web.About\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your application description page.</h3>\n    <p>Use this area to provide additional information.</p>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/About.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class About : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/About.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class About\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/App_Start/BundleConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public class BundleConfig\n    {\n        // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkID=303951\n        public static void RegisterBundles(BundleCollection bundles)\n        {\n            bundles.Add(new ScriptBundle(\"~/bundles/WebFormsJs\").Include(\n                            \"~/Scripts/WebForms/WebForms.js\",\n                            \"~/Scripts/WebForms/WebUIValidation.js\",\n                            \"~/Scripts/WebForms/MenuStandards.js\",\n                            \"~/Scripts/WebForms/Focus.js\",\n                            \"~/Scripts/WebForms/GridView.js\",\n                            \"~/Scripts/WebForms/DetailsView.js\",\n                            \"~/Scripts/WebForms/TreeView.js\",\n                            \"~/Scripts/WebForms/WebParts.js\"));\n\n            // Order is very important for these files to work, they have explicit dependencies\n            bundles.Add(new ScriptBundle(\"~/bundles/MsAjaxJs\").Include(\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjax.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxApplicationServices.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxTimer.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxWebForms.js\"));\n\n            // Use the Development version of Modernizr to develop with and learn from. Then, when you’re\n            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need\n            bundles.Add(new ScriptBundle(\"~/bundles/modernizr\").Include(\n                            \"~/Scripts/modernizr-*\"));\n\n            ScriptManager.ScriptResourceMapping.AddDefinition(\n                \"respond\",\n                new ScriptResourceDefinition\n                {\n                    Path = \"~/Scripts/respond.min.js\",\n                    DebugPath = \"~/Scripts/respond.js\",\n                });\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/App_Start/RouteConfig.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Web;\nusing System.Web.Routing;\nusing Microsoft.AspNet.FriendlyUrls;\n\nnamespace ProductLaunch.Web\n{\n    public static class RouteConfig\n    {\n        public static void RegisterRoutes(RouteCollection routes)\n        {\n            var settings = new FriendlyUrlSettings();\n            settings.AutoRedirectMode = RedirectMode.Permanent;\n            routes.EnableFriendlyUrls(settings);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/ApplicationInsights.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ApplicationInsights xmlns=\"http://schemas.microsoft.com/ApplicationInsights/2013/Settings\">\n</ApplicationInsights>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Bundle.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<bundles version=\"1.0\">\n  <styleBundle path=\"~/Content/css\">\n    <include path=\"~/Content/bootstrap.css\" />\n    <include path=\"~/Content/Site.css\" />\n  </styleBundle>\n</bundles>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Web\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string HomePageUrl { get { return Get(\"HOMEPAGE_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Contact.aspx",
    "content": "﻿<%@ Page Title=\"Contact\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Contact.aspx.cs\" Inherits=\"ProductLaunch.Web.Contact\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your contact page.</h3>\n    <address>\n        One Microsoft Way<br />\n        Redmond, WA 98052-6399<br />\n        <abbr title=\"Phone\">P:</abbr>\n        425.555.0100\n    </address>\n\n    <address>\n        <strong>Support:</strong>   <a href=\"mailto:Support@example.com\">Support@example.com</a><br />\n        <strong>Marketing:</strong> <a href=\"mailto:Marketing@example.com\">Marketing@example.com</a>\n    </address>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Contact : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class Contact\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Content/Site.css",
    "content": "﻿/* Move down content because we have a fixed navbar that is 50px tall */\nbody {\n    padding-top: 50px;\n    padding-bottom: 20px;\n}\n\n/* Wrapping element */\n/* Set some basic padding to keep content from hitting the edges */\n.body-content {\n    padding-left: 15px;\n    padding-right: 15px;\n}\n\n/* Set widths on the form inputs since otherwise they're 100% wide */\ninput,\nselect,\ntextarea {\n    max-width: 280px;\n}\n\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n    .jumbotron {\n        margin-top: 20px;\n    }\n\n    .body-content {\n        padding: 0;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Content/bootstrap.css",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. The notices and licenses below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden] {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput,\nselect[multiple],\ntextarea {\n  background-image: none;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16.099999999999998px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\nh1 small,\n.h1 small {\n  font-size: 24px;\n}\n\nh2 small,\n.h2 small {\n  font-size: 18px;\n}\n\nh3 small,\n.h3 small,\nh4 small,\n.h4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\npre {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table thead > tr > th,\n.table tbody > tr > th,\n.table tfoot > tr > th,\n.table thead > tr > td,\n.table tbody > tr > td,\n.table tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table caption + thead tr:first-child th,\n.table colgroup + thead tr:first-child th,\n.table thead:first-child tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed thead > tr > th,\n.table-condensed tbody > tr > th,\n.table-condensed tfoot > tr > th,\n.table-condensed thead > tr > td,\n.table-condensed tbody > tr > td,\n.table-condensed tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td {\n  background-color: #d0e9c6;\n  border-color: #c9e2b3;\n}\n\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td {\n  background-color: #ebcccc;\n  border-color: #e6c1c7;\n}\n\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td {\n  background-color: #faf2cc;\n  border-color: #f8e5be;\n}\n\n@media (max-width: 768px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n    background-color: #fff;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > thead > tr:last-child > td,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  padding-top: 7px;\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\1f4bc\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\1f4c5\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\1f4cc\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\1f4ce\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\1f4f7\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\1f512\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\1f514\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\1f516\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\1f525\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\1f527\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #333333;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs.nav-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 5px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n\n.nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  z-index: 1000;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  z-index: 1030;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e6e6e6;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #428bca;\n}\n\n.thumbnail > img {\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.alert-warning hr {\n  border-top-color: #f8e5be;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger hr {\n  border-top-color: #e6c1c7;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #fbeed5;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #fbeed5;\n}\n\n.panel-danger {\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #eed3d7;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #eed3d7;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\nbody.modal-open,\n.modal-open .navbar-fixed-top,\n.modal-open .navbar-fixed-bottom {\n  margin-right: 15px;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    right: auto;\n    left: 50%;\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n@media screen and (max-width: 400px) {\n  @-ms-viewport {\n    width: 320px;\n  }\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.visible-xs {\n  display: none !important;\n}\n\ntr.visible-xs {\n  display: none !important;\n}\n\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm {\n  display: none !important;\n}\n\ntr.visible-sm {\n  display: none !important;\n}\n\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md {\n  display: none !important;\n}\n\ntr.visible-md {\n  display: none !important;\n}\n\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg {\n  display: none !important;\n}\n\ntr.visible-lg {\n  display: none !important;\n}\n\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-md {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-md {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n  tr.hidden-md {\n    display: none !important;\n  }\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-md {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print {\n  display: none !important;\n}\n\ntr.visible-print {\n  display: none !important;\n}\n\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n  tr.hidden-print {\n    display: none !important;\n  }\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Default.aspx",
    "content": "﻿<%@ Page Title=\"Home Page\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Default.aspx.cs\" Inherits=\"ProductLaunch.Web._Default\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>We&#39;re launching a new product!</h1>\n        <p class=\"lead\">Our new product is going to be very, very good.</p>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-8\">\n            <h2>What&#39;s this all about?</h2>\n            <p>\n                Lorem ipsum dolor sit amet lectus. In magna in praesent nibh lorem. Egestas ipsum luctus feugiat sit enim. Libero nec a. Praesent vestibulum quis enim.</p>\n            <p>\n                Morbi fusce placerat et pellentesque qui curabitur dictum nam. Adipiscing pede semper. Tellus at sem. Arcu nibh et. Magna luctus nibh. Eu erat aenean adipiscing vitae pretium. Pede nec laoreet. Adipiscing mauris lorem tortor nec massa distinctio pede justo. Gravida non purus nunc sit consequat imperdiet sodales nullam dolor vel.</p>\n            <p>\n                <a class=\"btn btn-default\" href=\"https://www.docker.com/enterprise\">Check Out Our Other Products &raquo;</a>\n            </p>\n        </div>\n        <div class=\"col-md-4\">\n            <h2>Interested?</h2>\n            <p>\n                Give us your details and we&#39;ll keep you posted.</p>\n            <p>\n                It only takes 30 seconds to sign up.\n            </p>\n            <p>\n                And we probably won't spam you very much.\n            </p>\n            <p>\n                <a class=\"btn btn btn-primary btn-lg\" href=\"SignUp.aspx\">Sign Up &raquo;</a>\n            </p>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Default.aspx.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Net;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public partial class _Default : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n        }        \n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Default.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class _Default\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"ProductLaunch.Web.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Global.asax.cs",
    "content": "﻿using ProductLaunch.Model;\nusing ProductLaunch.Model.Initializers;\nusing System;\nusing System.Data.Entity;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.Routing;\n\nnamespace ProductLaunch.Web\n{\n    public class Global : HttpApplication\n    {\n        void Application_Start(object sender, EventArgs e)\n        {\n            // Code that runs on application startup\n            RouteConfig.RegisterRoutes(RouteTable.Routes);\n            BundleConfig.RegisterBundles(BundleTable.Bundles);\n\n            Database.SetInitializer<ProductLaunchContext>(new StaticDataInitializer());\n            SignUp.PreloadStaticDataCache();\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/ProductLaunch.Web.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Web</RootNamespace>\n    <AssemblyName>ProductLaunch.Web</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <UseIISExpress>false</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.Web.Infrastructure.1.0.0.0\\lib\\net40\\Microsoft.Web.Infrastructure.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.bootstrap\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.bootstrap.3.0.0\\lib\\net45\\AspNet.ScriptManager.bootstrap.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.jQuery\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.jQuery.1.10.2\\lib\\net45\\AspNet.ScriptManager.jQuery.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.MSAjax\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.MSAjax.5.0.0\\lib\\net45\\Microsoft.ScriptManager.MSAjax.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.WebForms\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.WebForms.5.0.0\\lib\\net45\\Microsoft.ScriptManager.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.1.1.3\\lib\\net40\\System.Web.Optimization.dll</HintPath>\n    </Reference>\n    <Reference Include=\"WebGrease\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\WebGrease.1.5.2\\lib\\WebGrease.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Antlr3.Runtime\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Antlr.3.4.1.9004\\lib\\Antlr3.Runtime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.Web.Optimization.WebForms\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.WebForms.1.1.3\\lib\\net45\\Microsoft.AspNet.Web.Optimization.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.FriendlyUrls\">\n      <HintPath>..\\packages\\Microsoft.AspNet.FriendlyUrls.Core.1.0.2\\lib\\net45\\Microsoft.AspNet.FriendlyUrls.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"App_Data\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"About.aspx\" />\n    <Content Include=\"Contact.aspx\" />\n    <Content Include=\"Content\\bootstrap.css\" />\n    <Content Include=\"Content\\bootstrap.min.css\" />\n    <Content Include=\"Content\\Site.css\" />\n    <Content Include=\"SignUp.aspx\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.svg\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.woff\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.ttf\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.eot\" />\n    <Content Include=\"ApplicationInsights.config\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <None Include=\"Scripts\\jquery-1.10.2.intellisense.js\" />\n    <Content Include=\"Scripts\\bootstrap.js\" />\n    <Content Include=\"Scripts\\bootstrap.min.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.js\" />\n    <Content Include=\"Scripts\\modernizr-2.6.2.js\" />\n    <Content Include=\"Scripts\\respond.js\" />\n    <Content Include=\"Scripts\\respond.min.js\" />\n    <Content Include=\"Scripts\\WebForms\\DetailsView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Focus.js\" />\n    <Content Include=\"Scripts\\WebForms\\GridView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Menu.js\" />\n    <Content Include=\"Scripts\\WebForms\\MenuStandards.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjax.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxApplicationServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxComponentModel.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxCore.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxGlobalization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxHistory.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxNetwork.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxSerialization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxTimer.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\SmartNav.js\" />\n    <Content Include=\"Scripts\\WebForms\\TreeView.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebParts.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebUIValidation.js\" />\n    <Content Include=\"Scripts\\_references.js\" />\n    <Content Include=\"Default.aspx\" />\n    <Content Include=\"favicon.ico\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Site.Master\" />\n    <Content Include=\"ThankYou.aspx\" />\n    <Content Include=\"ViewSwitcher.ascx\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <Content Include=\"Bundle.config\" />\n    <Content Include=\"packages.config\" />\n    <None Include=\"Project_Readme.html\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.map\" />\n    <Content Include=\"Site.Mobile.Master\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\BundleConfig.cs\" />\n    <Compile Include=\"About.aspx.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"About.aspx.designer.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"App_Start\\RouteConfig.cs\" />\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Contact.aspx.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Contact.aspx.designer.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.designer.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Default.aspx.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Default.aspx.designer.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Site.Master.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Master.designer.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.designer.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.designer.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.designer.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>57120</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost/ProductLaunch.Web</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Project_Readme.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Your ASP.NET application</title>\n    <style>\n        body {\n            background: #fff;\n            color: #505050;\n            font: 14px 'Segoe UI', tahoma, arial, helvetica, sans-serif;\n            margin: 20px;\n            padding: 0;\n        }\n\n        #header {\n            background: #efefef;\n            padding: 0;\n        }\n\n        h1 {\n            font-size: 48px;\n            font-weight: normal;\n            margin: 0;\n            padding: 0 30px;\n            line-height: 150px;\n        }\n\n        p {\n            font-size: 20px;\n            color: #fff;\n            background: #969696;\n            padding: 0 30px;\n            line-height: 50px;\n        }\n\n        #main {\n            padding: 5px 30px;\n        }\n\n        .section {\n            width: 21.7%;\n            float: left;\n            margin: 0 0 0 4%;\n        }\n\n            .section h2 {\n                font-size: 13px;\n                text-transform: uppercase;\n                margin: 0;\n                border-bottom: 1px solid silver;\n                padding-bottom: 12px;\n                margin-bottom: 8px;\n            }\n\n            .section.first {\n                margin-left: 0;\n            }\n\n                .section.first h2 {\n                    font-size: 24px;\n                    text-transform: none;\n                    margin-bottom: 25px;\n                    border: none;\n                }\n\n                .section.first li {\n                    border-top: 1px solid silver;\n                    padding: 8px 0;\n                }\n\n            .section.last {\n                margin-right: 0;\n            }\n\n        ul {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n            line-height: 20px;\n        }\n\n        li {\n            padding: 4px 0;\n        }\n\n        a {\n            color: #267cb2;\n            text-decoration: none;\n        }\n\n            a:hover {\n                text-decoration: underline;\n            }\n    </style>\n</head>\n<body>\n\n    <div id=\"header\">\n        <h1>Your ASP.NET application</h1>\n        <p>Congratulations! You've created a project</p>\n    </div>\n\n    <div id=\"main\">\n        <div class=\"section first\">\n            <h2>This application consists of:</h2>\n            <ul>\n                <li>Sample pages showing basic nav between Home, About, and Contact.</li>\n                <li>Theming using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615519\">Bootstrap</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615520\">Authentication</a>, if selected, shows how to register and sign in</li>\n                <li>ASP.NET features managed using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615521\">NuGet</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Customize app</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615522\">Get started with ASP.NET Web Forms</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615523\">Change the site's theme</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615524\">Add more libraries using NuGet</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615525\">Configure authentication</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615526\">Customize information about the website users</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615527\">Get information from social providers</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615528\">Add HTTP services using ASP.NET Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615529\">Secure the Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615530\">Add real-time web with ASP.NET SignalR</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615531\">Add components using Scaffolding</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615532\">Test app with Browser Link</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615533\">Share your project</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Deploy</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615534\">Ensure your app is ready for production</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615535\">Microsoft Azure</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615536\">Hosting providers</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section last\">\n            <h2>Get help</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615537\">Get help</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615538\">Get more templates</a></li>\n            </ul>\n        </div>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Web\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Web\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"17a57cf4-a6c1-47c1-aa38-650db6d87f8f\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/DetailsView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/DetailsView.js\nfunction DetailsView() {\n    this.pageIndex = null;\n    this.dataKeys = null;\n    this.createPropertyString = DetailsView_createPropertyString;\n    this.setStateField = DetailsView_setStateValue;\n    this.getHiddenFieldContents = DetailsView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction DetailsView_createPropertyString() {\n    return createPropertyStringFromValues_DetailsView(this.pageIndex, this.dataKeys);\n}\nfunction DetailsView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction DetailsView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[2];\n    for (var i = 3; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_DetailsView(valsArray[0], valsArray[1]);\n}\nfunction DetailsView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_DetailsView(pageIndex, dataKeys) {\n    var value = new Array(pageIndex, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Focus.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_FindFirstFocusableChild(control) {\n    if (!control || !(control.tagName)) {\n        return null;\n    }\n    var tagName = control.tagName.toLowerCase();\n    if (tagName == \"undefined\") {\n        return null;\n    }\n    var children = control.childNodes;\n    if (children) {\n        for (var i = 0; i < children.length; i++) {\n            try {\n                if (WebForm_CanFocus(children[i])) {\n                    return children[i];\n                }\n                else {\n                    var focused = WebForm_FindFirstFocusableChild(children[i]);\n                    if (WebForm_CanFocus(focused)) {\n                        return focused;\n                    }\n                }\n            } catch (e) {\n            }\n        }\n    }\n    return null;\n}\nfunction WebForm_AutoFocus(focusId) {\n    var targetControl;\n    if (__nonMSDOMBrowser) {\n        targetControl = document.getElementById(focusId);\n    }\n    else {\n        targetControl = document.all[focusId];\n    }\n    var focused = targetControl;\n    if (targetControl && (!WebForm_CanFocus(targetControl)) ) {\n        focused = WebForm_FindFirstFocusableChild(targetControl);\n    }\n    if (focused) {\n        try {\n            focused.focus();\n            if (__nonMSDOMBrowser) {\n                focused.scrollIntoView(false);\n            }\n            if (window.__smartNav) {\n                window.__smartNav.ae = focused.id;\n            }\n        }\n        catch (e) {\n        }\n    }\n}\nfunction WebForm_CanFocus(element) {\n    if (!element || !(element.tagName)) return false;\n    var tagName = element.tagName.toLowerCase();\n    return (!(element.disabled) &&\n            (!(element.type) || element.type.toLowerCase() != \"hidden\") &&\n            WebForm_IsFocusableTag(tagName) &&\n            WebForm_IsInVisibleContainer(element)\n            );\n}\nfunction WebForm_IsFocusableTag(tagName) {\n    return (tagName == \"input\" ||\n            tagName == \"textarea\" ||\n            tagName == \"select\" ||\n            tagName == \"button\" ||\n            tagName == \"a\");\n}\nfunction WebForm_IsInVisibleContainer(ctrl) {\n    var current = ctrl;\n    while((typeof(current) != \"undefined\") && (current != null)) {\n        if (current.disabled ||\n            ( typeof(current.style) != \"undefined\" &&\n            ( ( typeof(current.style.display) != \"undefined\" &&\n                current.style.display == \"none\") ||\n                ( typeof(current.style.visibility) != \"undefined\" &&\n                current.style.visibility == \"hidden\") ) ) ) {\n            return false;\n        }\n        if (typeof(current.parentNode) != \"undefined\" &&\n                current.parentNode != null &&\n                current.parentNode != current &&\n                current.parentNode.tagName.toLowerCase() != \"body\") {\n            current = current.parentNode;\n        }\n        else {\n            return true;\n        }\n    }\n    return true;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/GridView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/GridView.js\nfunction GridView() {\n    this.pageIndex = null;\n    this.sortExpression = null;\n    this.sortDirection = null;\n    this.dataKeys = null;\n    this.createPropertyString = GridView_createPropertyString;\n    this.setStateField = GridView_setStateValue;\n    this.getHiddenFieldContents = GridView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction GridView_createPropertyString() {\n    return createPropertyStringFromValues_GridView(this.pageIndex, this.sortDirection, this.sortExpression, this.dataKeys);\n}\nfunction GridView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction GridView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[4];\n    for (var i = 5; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_GridView(valsArray[0], valsArray[1], valsArray[2], valsArray[3]);\n}\nfunction GridView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_GridView(pageIndex, sortDirection, sortExpression, dataKeys) {\n    var value = new Array(pageIndex, sortDirection, sortExpression, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjax.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjax.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjax.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript._scripts={\"MicrosoftAjaxCore.js\":true,\"MicrosoftAjaxGlobalization.js\":true,\"MicrosoftAjaxSerialization.js\":true,\"MicrosoftAjaxComponentModel.js\":true,\"MicrosoftAjaxHistory.js\":true,\"MicrosoftAjaxNetwork.js\":true,\"MicrosoftAjaxWebServices.js\":true};Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};Type.registerNamespace(\"Sys.UI\");Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxApplicationServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxApplicationServices.js\nType._registerScript(\"MicrosoftAjaxApplicationServices.js\",[\"MicrosoftAjaxWebServices.js\"]);Type.registerNamespace(\"Sys.Services\");Sys.Services._ProfileService=function(){Sys.Services._ProfileService.initializeBase(this);this.properties={}};Sys.Services._ProfileService.DefaultWebServicePath=\"\";Sys.Services._ProfileService.prototype={_defaultLoadCompletedCallback:null,_defaultSaveCompletedCallback:null,_path:\"\",_timeout:0,get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_defaultSaveCompletedCallback:function(){return this._defaultSaveCompletedCallback},set_defaultSaveCompletedCallback:function(a){this._defaultSaveCompletedCallback=a},get_path:function(){return this._path||\"\"},load:function(c,d,e,f){var b,a;if(!c){a=\"GetAllPropertiesForCurrentUser\";b={authenticatedUserOnly:false}}else{a=\"GetPropertiesForCurrentUser\";b={properties:this._clonePropertyNames(c),authenticatedUserOnly:false}}this._invoke(this._get_path(),a,false,b,Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[d,e,f])},save:function(d,b,c,e){var a=this._flattenProperties(d,this.properties);this._invoke(this._get_path(),\"SetPropertiesForCurrentUser\",false,{values:a.value,authenticatedUserOnly:false},Function.createDelegate(this,this._onSaveComplete),Function.createDelegate(this,this._onSaveFailed),[b,c,e,a.count])},_clonePropertyNames:function(e){var c=[],d={};for(var b=0;b<e.length;b++){var a=e[b];if(!d[a]){Array.add(c,a);d[a]=true}}return c},_flattenProperties:function(a,i,j){var b={},e,d,g=0;if(a&&a.length===0)return {value:b,count:0};for(var c in i){e=i[c];d=j?j+\".\"+c:c;if(Sys.Services.ProfileGroup.isInstanceOfType(e)){var k=this._flattenProperties(a,e,d),h=k.value;g+=k.count;for(var f in h){var l=h[f];b[f]=l}}else if(!a||Array.indexOf(a,d)!==-1){b[d]=e;g++}}return {value:b,count:g}},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._ProfileService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoadComplete:function(a,e,g){if(typeof a!==\"object\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,g,\"Object\"));var c=this._unflattenProperties(a);for(var b in c)this.properties[b]=c[b];var d=e[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(d){var f=e[2]||this.get_defaultUserContext();d(a.length,f,\"Sys.Services.ProfileService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.load\")}},_onSaveComplete:function(a,b,f){var c=b[3];if(a!==null)if(a instanceof Array)c-=a.length;else if(typeof a===\"number\")c=a;else throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));var d=b[0]||this.get_defaultSaveCompletedCallback()||this.get_defaultSucceededCallback();if(d){var e=b[2]||this.get_defaultUserContext();d(c,e,\"Sys.Services.ProfileService.save\")}},_onSaveFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.save\")}},_unflattenProperties:function(e){var c={},d,f,h=0;for(var a in e){h++;f=e[a];d=a.indexOf(\".\");if(d!==-1){var g=a.substr(0,d);a=a.substr(d+1);var b=c[g];if(!b||!Sys.Services.ProfileGroup.isInstanceOfType(b)){b=new Sys.Services.ProfileGroup;c[g]=b}b[a]=f}else c[a]=f}e.length=h;return c}};Sys.Services._ProfileService.registerClass(\"Sys.Services._ProfileService\",Sys.Net.WebServiceProxy);Sys.Services.ProfileService=new Sys.Services._ProfileService;Sys.Services.ProfileGroup=function(a){if(a)for(var b in a)this[b]=a[b]};Sys.Services.ProfileGroup.registerClass(\"Sys.Services.ProfileGroup\");Sys.Services._AuthenticationService=function(){Sys.Services._AuthenticationService.initializeBase(this)};Sys.Services._AuthenticationService.DefaultWebServicePath=\"\";Sys.Services._AuthenticationService.prototype={_defaultLoginCompletedCallback:null,_defaultLogoutCompletedCallback:null,_path:\"\",_timeout:0,_authenticated:false,get_defaultLoginCompletedCallback:function(){return this._defaultLoginCompletedCallback},set_defaultLoginCompletedCallback:function(a){this._defaultLoginCompletedCallback=a},get_defaultLogoutCompletedCallback:function(){return this._defaultLogoutCompletedCallback},set_defaultLogoutCompletedCallback:function(a){this._defaultLogoutCompletedCallback=a},get_isLoggedIn:function(){return this._authenticated},get_path:function(){return this._path||\"\"},login:function(c,b,a,h,f,d,e,g){this._invoke(this._get_path(),\"Login\",false,{userName:c,password:b,createPersistentCookie:a},Function.createDelegate(this,this._onLoginComplete),Function.createDelegate(this,this._onLoginFailed),[c,b,a,h,f,d,e,g])},logout:function(c,a,b,d){this._invoke(this._get_path(),\"Logout\",false,{},Function.createDelegate(this,this._onLogoutComplete),Function.createDelegate(this,this._onLogoutFailed),[c,a,b,d])},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._AuthenticationService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoginComplete:function(e,c,f){if(typeof e!==\"boolean\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Boolean\"));var b=c[4],d=c[7]||this.get_defaultUserContext(),a=c[5]||this.get_defaultLoginCompletedCallback()||this.get_defaultSucceededCallback();if(e){this._authenticated=true;if(a)a(true,d,\"Sys.Services.AuthenticationService.login\");if(typeof b!==\"undefined\"&&b!==null)window.location.href=b}else if(a)a(false,d,\"Sys.Services.AuthenticationService.login\")},_onLoginFailed:function(d,b){var a=b[6]||this.get_defaultFailedCallback();if(a){var c=b[7]||this.get_defaultUserContext();a(d,c,\"Sys.Services.AuthenticationService.login\")}},_onLogoutComplete:function(f,a,e){if(f!==null)throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,e,\"null\"));var b=a[0],d=a[3]||this.get_defaultUserContext(),c=a[1]||this.get_defaultLogoutCompletedCallback()||this.get_defaultSucceededCallback();this._authenticated=false;if(c)c(null,d,\"Sys.Services.AuthenticationService.logout\");if(!b)window.location.reload();else window.location.href=b},_onLogoutFailed:function(c,b){var a=b[2]||this.get_defaultFailedCallback();if(a)a(c,b[3],\"Sys.Services.AuthenticationService.logout\")},_setAuthenticated:function(a){this._authenticated=a}};Sys.Services._AuthenticationService.registerClass(\"Sys.Services._AuthenticationService\",Sys.Net.WebServiceProxy);Sys.Services.AuthenticationService=new Sys.Services._AuthenticationService;Sys.Services._RoleService=function(){Sys.Services._RoleService.initializeBase(this);this._roles=[]};Sys.Services._RoleService.DefaultWebServicePath=\"\";Sys.Services._RoleService.prototype={_defaultLoadCompletedCallback:null,_rolesIndex:null,_timeout:0,_path:\"\",get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_path:function(){return this._path||\"\"},get_roles:function(){return Array.clone(this._roles)},isUserInRole:function(a){var b=this._get_rolesIndex()[a.trim().toLowerCase()];return !!b},load:function(a,b,c){Sys.Net.WebServiceProxy.invoke(this._get_path(),\"GetRolesForCurrentUser\",false,{},Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[a,b,c],this.get_timeout())},_get_path:function(){var a=this.get_path();if(!a||!a.length)a=Sys.Services._RoleService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_get_rolesIndex:function(){if(!this._rolesIndex){var b={};for(var a=0;a<this._roles.length;a++)b[this._roles[a].toLowerCase()]=true;this._rolesIndex=b}return this._rolesIndex},_onLoadComplete:function(a,c,f){if(a&&!(a instanceof Array))throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));this._roles=a;this._rolesIndex=null;var b=c[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(b){var e=c[2]||this.get_defaultUserContext(),d=Array.clone(a);b(d,e,\"Sys.Services.RoleService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.RoleService.load\")}}};Sys.Services._RoleService.registerClass(\"Sys.Services._RoleService\",Sys.Net.WebServiceProxy);Sys.Services.RoleService=new Sys.Services._RoleService;"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxComponentModel.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxComponentModel.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxComponentModel.js\nType._registerScript(\"MicrosoftAjaxComponentModel.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.UI\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxCore.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxCore.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxCore.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript(\"MicrosoftAjaxCore.js\");Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxGlobalization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxGlobalization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxGlobalization.js\nType._registerScript(\"MicrosoftAjaxGlobalization.js\",[\"MicrosoftAjaxCore.js\"]);Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxHistory.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxHistory.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxHistory.js\nType._registerScript(\"MicrosoftAjaxHistory.js\",[\"MicrosoftAjaxComponentModel.js\",\"MicrosoftAjaxSerialization.js\"]);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxNetwork.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxNetwork.js\nType._registerScript(\"MicrosoftAjaxNetwork.js\",[\"MicrosoftAjaxSerialization.js\"]);if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxSerialization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxSerialization.js\nType._registerScript(\"MicrosoftAjaxSerialization.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxTimer.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxTimer.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxTimer.js\nType._registerScript(\"Timer.js\",[\"MicrosoftAjaxComponentModel.js\"]);Sys.UI._Timer=function(a){Sys.UI._Timer.initializeBase(this,[a]);this._interval=60000;this._enabled=true;this._postbackPending=false;this._raiseTickDelegate=null;this._endRequestHandlerDelegate=null;this._timer=null;this._pageRequestManager=null;this._uniqueID=null};Sys.UI._Timer.prototype={get_enabled:function(){return this._enabled},set_enabled:function(a){this._enabled=a},get_interval:function(){return this._interval},set_interval:function(a){this._interval=a},get_uniqueID:function(){return this._uniqueID},set_uniqueID:function(a){this._uniqueID=a},dispose:function(){this._stopTimer();if(this._pageRequestManager!==null)this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);Sys.UI._Timer.callBaseMethod(this,\"dispose\")},_doPostback:function(){__doPostBack(this.get_uniqueID(),\"\")},_handleEndRequest:function(c,b){var a=b.get_dataItems()[this.get_id()];if(a)this._update(a[0],a[1]);if(this._postbackPending===true&&this._pageRequestManager!==null&&this._pageRequestManager.get_isInAsyncPostBack()===false){this._postbackPending=false;this._doPostback()}},initialize:function(){Sys.UI._Timer.callBaseMethod(this,\"initialize\");this._raiseTickDelegate=Function.createDelegate(this,this._raiseTick);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null)this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate);if(this.get_enabled())this._startTimer()},_raiseTick:function(){this._startTimer();if(this._pageRequestManager===null||!this._pageRequestManager.get_isInAsyncPostBack()){this._doPostback();this._postbackPending=false}else this._postbackPending=true},_startTimer:function(){this._timer=window.setTimeout(Function.createDelegate(this,this._raiseTick),this.get_interval())},_stopTimer:function(){if(this._timer!==null){window.clearTimeout(this._timer);this._timer=null}},_update:function(c,b){var a=!this.get_enabled(),d=this.get_interval()!==b;if(!a&&(!c||d)){this._stopTimer();a=true}this.set_enabled(c);this.set_interval(b);if(this.get_enabled()&&a)this._startTimer()}};Sys.UI._Timer.registerClass(\"Sys.UI._Timer\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebForms.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebForms.js\nType._registerScript(\"MicrosoftAjaxWebForms.js\",[\"MicrosoftAjaxCore.js\",\"MicrosoftAjaxSerialization.js\",\"MicrosoftAjaxNetwork.js\",\"MicrosoftAjaxComponentModel.js\"]);Type.registerNamespace(\"Sys.WebForms\");Sys.WebForms.BeginRequestEventArgs=function(c,b,a){Sys.WebForms.BeginRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.BeginRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]}};Sys.WebForms.BeginRequestEventArgs.registerClass(\"Sys.WebForms.BeginRequestEventArgs\",Sys.EventArgs);Sys.WebForms.EndRequestEventArgs=function(c,a,b){Sys.WebForms.EndRequestEventArgs.initializeBase(this);this._errorHandled=false;this._error=c;this._dataItems=a||{};this._response=b};Sys.WebForms.EndRequestEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_error:function(){return this._error},get_errorHandled:function(){return this._errorHandled},set_errorHandled:function(a){this._errorHandled=a},get_response:function(){return this._response}};Sys.WebForms.EndRequestEventArgs.registerClass(\"Sys.WebForms.EndRequestEventArgs\",Sys.EventArgs);Sys.WebForms.InitializeRequestEventArgs=function(c,b,a){Sys.WebForms.InitializeRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.InitializeRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]},set_updatePanelsToUpdate:function(a){this._updated=true;this._updatePanelsToUpdate=a}};Sys.WebForms.InitializeRequestEventArgs.registerClass(\"Sys.WebForms.InitializeRequestEventArgs\",Sys.CancelEventArgs);Sys.WebForms.PageLoadedEventArgs=function(b,a,c){Sys.WebForms.PageLoadedEventArgs.initializeBase(this);this._panelsUpdated=b;this._panelsCreated=a;this._dataItems=c||{}};Sys.WebForms.PageLoadedEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsCreated:function(){return this._panelsCreated},get_panelsUpdated:function(){return this._panelsUpdated}};Sys.WebForms.PageLoadedEventArgs.registerClass(\"Sys.WebForms.PageLoadedEventArgs\",Sys.EventArgs);Sys.WebForms.PageLoadingEventArgs=function(b,a,c){Sys.WebForms.PageLoadingEventArgs.initializeBase(this);this._panelsUpdating=b;this._panelsDeleting=a;this._dataItems=c||{}};Sys.WebForms.PageLoadingEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsDeleting:function(){return this._panelsDeleting},get_panelsUpdating:function(){return this._panelsUpdating}};Sys.WebForms.PageLoadingEventArgs.registerClass(\"Sys.WebForms.PageLoadingEventArgs\",Sys.EventArgs);Sys._ScriptLoader=function(){this._scriptsToLoad=null;this._sessions=[];this._scriptLoadedDelegate=Function.createDelegate(this,this._scriptLoadedHandler)};Sys._ScriptLoader.prototype={dispose:function(){this._stopSession();this._loading=false;if(this._events)delete this._events;this._sessions=null;this._currentSession=null;this._scriptLoadedDelegate=null},loadScripts:function(d,b,c,a){var e={allScriptsLoadedCallback:b,scriptLoadFailedCallback:c,scriptLoadTimeoutCallback:a,scriptsToLoad:this._scriptsToLoad,scriptTimeout:d};this._scriptsToLoad=null;this._sessions[this._sessions.length]=e;if(!this._loading)this._nextSession()},queueCustomScriptTag:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,a)},queueScriptBlock:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{text:a})},queueScriptReference:function(a,b){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{src:a,fallback:b})},_createScriptElement:function(c){var a=document.createElement(\"script\");a.type=\"text/javascript\";for(var b in c)a[b]=c[b];return a},_loadScriptsInternal:function(){var c=this._currentSession;if(c.scriptsToLoad&&c.scriptsToLoad.length>0){var b=Array.dequeue(c.scriptsToLoad),f=this._scriptLoadedDelegate;if(b.fallback){var g=b.fallback;delete b.fallback;var d=this;f=function(b,a){a||function(){var a=d._createScriptElement({src:g});d._currentTask=new Sys._ScriptLoaderTask(a,d._scriptLoadedDelegate);d._currentTask.execute()}()}}var a=this._createScriptElement(b);if(a.text&&Sys.Browser.agent===Sys.Browser.Safari){a.innerHTML=a.text;delete a.text}if(typeof b.src===\"string\"){this._currentTask=new Sys._ScriptLoaderTask(a,f);this._currentTask.execute()}else{document.getElementsByTagName(\"head\")[0].appendChild(a);Sys._ScriptLoaderTask._clearScript(a);this._loadScriptsInternal()}}else{this._stopSession();var e=c.allScriptsLoadedCallback;if(e)e(this);this._nextSession()}},_nextSession:function(){if(this._sessions.length===0){this._loading=false;this._currentSession=null;return}this._loading=true;var a=Array.dequeue(this._sessions);this._currentSession=a;if(a.scriptTimeout>0)this._timeoutCookie=window.setTimeout(Function.createDelegate(this,this._scriptLoadTimeoutHandler),a.scriptTimeout*1000);this._loadScriptsInternal()},_raiseError:function(){var b=this._currentSession.scriptLoadFailedCallback,a=this._currentTask.get_scriptElement();this._stopSession();if(b){b(this,a);this._nextSession()}else{this._loading=false;throw Sys._ScriptLoader._errorScriptLoadFailed(a.src)}},_scriptLoadedHandler:function(a,b){if(b){Array.add(Sys._ScriptLoader._getLoadedScripts(),a.src);this._currentTask.dispose();this._currentTask=null;this._loadScriptsInternal()}else this._raiseError()},_scriptLoadTimeoutHandler:function(){var a=this._currentSession.scriptLoadTimeoutCallback;this._stopSession();if(a)a(this);this._nextSession()},_stopSession:function(){if(this._timeoutCookie){window.clearTimeout(this._timeoutCookie);this._timeoutCookie=null}if(this._currentTask){this._currentTask.dispose();this._currentTask=null}}};Sys._ScriptLoader.registerClass(\"Sys._ScriptLoader\",null,Sys.IDisposable);Sys._ScriptLoader.getInstance=function(){var a=Sys._ScriptLoader._activeInstance;if(!a)a=Sys._ScriptLoader._activeInstance=new Sys._ScriptLoader;return a};Sys._ScriptLoader.isScriptLoaded=function(b){var a=document.createElement(\"script\");a.src=b;return Array.contains(Sys._ScriptLoader._getLoadedScripts(),a.src)};Sys._ScriptLoader.readLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){var c=Sys._ScriptLoader._referencedScripts=[],d=document.getElementsByTagName(\"script\");for(var b=d.length-1;b>=0;b--){var e=d[b],a=e.src;if(a.length)if(!Array.contains(c,a))Array.add(c,a)}}};Sys._ScriptLoader._errorScriptLoadFailed=function(b){var a;a=Sys.Res.scriptLoadFailed;var d=\"Sys.ScriptLoadFailedException: \"+String.format(a,b),c=Error.create(d,{name:\"Sys.ScriptLoadFailedException\",\"scriptUrl\":b});c.popStackFrame();return c};Sys._ScriptLoader._getLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){Sys._ScriptLoader._referencedScripts=[];Sys._ScriptLoader.readLoadedScripts()}return Sys._ScriptLoader._referencedScripts};Sys.WebForms.PageRequestManager=function(){this._form=null;this._activeDefaultButton=null;this._activeDefaultButtonClicked=false;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._updatePanelHasChildrenAsTriggers=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._scriptManagerID=null;this._pageLoadedHandler=null;this._additionalInput=null;this._onsubmit=null;this._onSubmitStatements=[];this._originalDoPostBack=null;this._originalDoPostBackWithOptions=null;this._originalFireDefaultButton=null;this._originalDoCallback=null;this._isCrossPost=false;this._postBackSettings=null;this._request=null;this._onFormSubmitHandler=null;this._onFormElementClickHandler=null;this._onWindowUnloadHandler=null;this._asyncPostBackTimeout=null;this._controlIDToFocus=null;this._scrollPosition=null;this._processingRequest=false;this._scriptDisposes={};this._transientFields=[\"__VIEWSTATEENCRYPTED\",\"__VIEWSTATEFIELDCOUNT\"];this._textTypes=/^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i};Sys.WebForms.PageRequestManager.prototype={_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_isInAsyncPostBack:function(){return this._request!==null},add_beginRequest:function(a){this._get_eventHandlerList().addHandler(\"beginRequest\",a)},remove_beginRequest:function(a){this._get_eventHandlerList().removeHandler(\"beginRequest\",a)},add_endRequest:function(a){this._get_eventHandlerList().addHandler(\"endRequest\",a)},remove_endRequest:function(a){this._get_eventHandlerList().removeHandler(\"endRequest\",a)},add_initializeRequest:function(a){this._get_eventHandlerList().addHandler(\"initializeRequest\",a)},remove_initializeRequest:function(a){this._get_eventHandlerList().removeHandler(\"initializeRequest\",a)},add_pageLoaded:function(a){this._get_eventHandlerList().addHandler(\"pageLoaded\",a)},remove_pageLoaded:function(a){this._get_eventHandlerList().removeHandler(\"pageLoaded\",a)},add_pageLoading:function(a){this._get_eventHandlerList().addHandler(\"pageLoading\",a)},remove_pageLoading:function(a){this._get_eventHandlerList().removeHandler(\"pageLoading\",a)},abortPostBack:function(){if(!this._processingRequest&&this._request){this._request.get_executor().abort();this._request=null}},beginAsyncPostBack:function(c,a,f,d,e){if(d&&typeof Page_ClientValidate===\"function\"&&!Page_ClientValidate(e||null))return;this._postBackSettings=this._createPostBackSettings(true,c,a);var b=this._form;b.__EVENTTARGET.value=a||\"\";b.__EVENTARGUMENT.value=f||\"\";this._isCrossPost=false;this._additionalInput=null;this._onFormSubmit()},_cancelPendingCallbacks:function(){for(var a=0,e=window.__pendingCallbacks.length;a<e;a++){var c=window.__pendingCallbacks[a];if(c){if(!c.async)window.__synchronousCallBackIndex=-1;window.__pendingCallbacks[a]=null;var d=\"__CALLBACKFRAME\"+a,b=document.getElementById(d);if(b)b.parentNode.removeChild(b)}}},_commitControls:function(a,b){if(a){this._updatePanelIDs=a.updatePanelIDs;this._updatePanelClientIDs=a.updatePanelClientIDs;this._updatePanelHasChildrenAsTriggers=a.updatePanelHasChildrenAsTriggers;this._asyncPostBackControlIDs=a.asyncPostBackControlIDs;this._asyncPostBackControlClientIDs=a.asyncPostBackControlClientIDs;this._postBackControlIDs=a.postBackControlIDs;this._postBackControlClientIDs=a.postBackControlClientIDs}if(typeof b!==\"undefined\"&&b!==null)this._asyncPostBackTimeout=b*1000},_createHiddenField:function(c,d){var b,a=document.getElementById(c);if(a)if(!a._isContained)a.parentNode.removeChild(a);else b=a.parentNode;if(!b){b=document.createElement(\"span\");b.style.cssText=\"display:none !important\";this._form.appendChild(b)}b.innerHTML=\"<input type='hidden' />\";a=b.childNodes[0];a._isContained=true;a.id=a.name=c;a.value=d},_createPageRequestManagerTimeoutError:function(){var b=\"Sys.WebForms.PageRequestManagerTimeoutException: \"+Sys.WebForms.Res.PRM_TimeoutError,a=Error.create(b,{name:\"Sys.WebForms.PageRequestManagerTimeoutException\"});a.popStackFrame();return a},_createPageRequestManagerServerError:function(a,d){var c=\"Sys.WebForms.PageRequestManagerServerErrorException: \"+(d||String.format(Sys.WebForms.Res.PRM_ServerError,a)),b=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerServerErrorException\",httpStatusCode:a});b.popStackFrame();return b},_createPageRequestManagerParserError:function(b){var c=\"Sys.WebForms.PageRequestManagerParserErrorException: \"+String.format(Sys.WebForms.Res.PRM_ParserError,b),a=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerParserErrorException\"});a.popStackFrame();return a},_createPanelID:function(e,b){var c=b.asyncTarget,a=this._ensureUniqueIds(e||b.panelsToUpdate),d=a instanceof Array?a.join(\",\"):a||this._scriptManagerID;if(c)d+=\"|\"+c;return encodeURIComponent(this._scriptManagerID)+\"=\"+encodeURIComponent(d)+\"&\"},_createPostBackSettings:function(d,a,c,b){return {async:d,asyncTarget:c,panelsToUpdate:a,sourceElement:b}},_convertToClientIDs:function(a,f,e,d){if(a)for(var b=0,h=a.length;b<h;b+=d?2:1){var c=a[b],g=(d?a[b+1]:\"\")||this._uniqueIDToClientID(c);Array.add(f,c);Array.add(e,g)}},dispose:function(){if(this._form){Sys.UI.DomEvent.removeHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.removeHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._onWindowUnloadHandler);Sys.UI.DomEvent.removeHandler(window,\"load\",this._pageLoadedHandler)}if(this._originalDoPostBack){window.__doPostBack=this._originalDoPostBack;this._originalDoPostBack=null}if(this._originalDoPostBackWithOptions){window.WebForm_DoPostBackWithOptions=this._originalDoPostBackWithOptions;this._originalDoPostBackWithOptions=null}if(this._originalFireDefaultButton){window.WebForm_FireDefaultButton=this._originalFireDefaultButton;this._originalFireDefaultButton=null}if(this._originalDoCallback){window.WebForm_DoCallback=this._originalDoCallback;this._originalDoCallback=null}this._form=null;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._asyncPostBackTimeout=null;this._scrollPosition=null;this._activeElement=null},_doCallback:function(d,b,c,f,a,e){if(!this.get_isInAsyncPostBack())this._originalDoCallback(d,b,c,f,a,e)},_doPostBack:function(a,k){var f=window.event;if(!f){var d=arguments.callee?arguments.callee.caller:null;if(d){var j=30;while(d.arguments.callee.caller&&--j)d=d.arguments.callee.caller;f=j&&d.arguments.length?d.arguments[0]:null}}this._additionalInput=null;var h=this._form;if(a===null||typeof a===\"undefined\"||this._isCrossPost){this._postBackSettings=this._createPostBackSettings(false);this._isCrossPost=false}else{var c=this._masterPageUniqueID,l=this._uniqueIDToClientID(a),g=document.getElementById(l);if(!g&&c)if(a.indexOf(c+\"$\")===0)g=document.getElementById(l.substr(c.length+1));if(!g)if(Array.contains(this._asyncPostBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(true,null,a);else if(Array.contains(this._postBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(false);else{var e=this._findNearestElement(a);if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{if(c){c+=\"$\";if(a.indexOf(c)===0)e=this._findNearestElement(a.substr(c.length))}if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{var b;try{b=f?f.target||f.srcElement:null}catch(n){}b=b||this._activeElement;var m=/__doPostBack\\(|WebForm_DoPostBackWithOptions\\(/;function i(b){b=b?b.toString():\"\";return m.test(b)&&b.indexOf(\"'\"+a+\"'\")!==-1||b.indexOf('\"'+a+'\"')!==-1}if(b&&(b.name===a||i(b.href)||i(b.onclick)||i(b.onchange)))this._postBackSettings=this._getPostBackSettings(b,a);else this._postBackSettings=this._createPostBackSettings(false)}}}else this._postBackSettings=this._getPostBackSettings(g,a)}if(!this._postBackSettings.async){h.onsubmit=this._onsubmit;this._originalDoPostBack(a,k);h.onsubmit=null;return}h.__EVENTTARGET.value=a;h.__EVENTARGUMENT.value=k;this._onFormSubmit()},_doPostBackWithOptions:function(a){this._isCrossPost=a&&a.actionUrl;var d=true;if(a.validation)if(typeof Page_ClientValidate==\"function\")d=Page_ClientValidate(a.validationGroup);if(d){if(typeof a.actionUrl!=\"undefined\"&&a.actionUrl!=null&&a.actionUrl.length>0)theForm.action=a.actionUrl;if(a.trackFocus){var c=theForm.elements[\"__LASTFOCUS\"];if(typeof c!=\"undefined\"&&c!=null)if(typeof document.activeElement==\"undefined\")c.value=a.eventTarget;else{var b=document.activeElement;if(typeof b!=\"undefined\"&&b!=null)if(typeof b.id!=\"undefined\"&&b.id!=null&&b.id.length>0)c.value=b.id;else if(typeof b.name!=\"undefined\")c.value=b.name}}}if(a.clientSubmit)this._doPostBack(a.eventTarget,a.eventArgument)},_elementContains:function(b,a){while(a){if(a===b)return true;a=a.parentNode}return false},_endPostBack:function(a,d,f){if(this._request===d.get_webRequest()){this._processingRequest=false;this._additionalInput=null;this._request=null}var e=this._get_eventHandlerList().getHandler(\"endRequest\"),b=false;if(e){var c=new Sys.WebForms.EndRequestEventArgs(a,f?f.dataItems:{},d);e(this,c);b=c.get_errorHandled()}if(a&&!b)throw a},_ensureUniqueIds:function(a){if(!a)return a;a=a instanceof Array?a:[a];var c=[];for(var b=0,f=a.length;b<f;b++){var e=a[b],d=Array.indexOf(this._updatePanelClientIDs,e);c.push(d>-1?this._updatePanelIDs[d]:e)}return c},_findNearestElement:function(a){while(a.length>0){var d=this._uniqueIDToClientID(a),c=document.getElementById(d);if(c)return c;var b=a.lastIndexOf(\"$\");if(b===-1)return null;a=a.substring(0,b)}return null},_findText:function(b,a){var c=Math.max(0,a-20),d=Math.min(b.length,a+20);return b.substring(c,d)},_fireDefaultButton:function(a,d){if(a.keyCode===13){var c=a.srcElement||a.target;if(!c||c.tagName.toLowerCase()!==\"textarea\"){var b=document.getElementById(d);if(b&&typeof b.click!==\"undefined\"){this._activeDefaultButton=b;this._activeDefaultButtonClicked=false;try{b.click()}finally{this._activeDefaultButton=null}a.cancelBubble=true;if(typeof a.stopPropagation===\"function\")a.stopPropagation();return false}}}return true},_getPageLoadedEventArgs:function(n,c){var m=[],l=[],k=c?c.version4:false,d=c?c.updatePanelData:null,e,g,h,b;if(!d){e=this._updatePanelIDs;g=this._updatePanelClientIDs;h=null;b=null}else{e=d.updatePanelIDs;g=d.updatePanelClientIDs;h=d.childUpdatePanelIDs;b=d.panelsToRefreshIDs}var a,f,j,i;if(b)for(a=0,f=b.length;a<f;a+=k?2:1){j=b[a];i=(k?b[a+1]:\"\")||this._uniqueIDToClientID(j);Array.add(m,document.getElementById(i))}for(a=0,f=e.length;a<f;a++)if(n||Array.indexOf(h,e[a])!==-1)Array.add(l,document.getElementById(g[a]));return new Sys.WebForms.PageLoadedEventArgs(m,l,c?c.dataItems:{})},_getPageLoadingEventArgs:function(f){var j=[],i=[],c=f.updatePanelData,k=c.oldUpdatePanelIDs,l=c.oldUpdatePanelClientIDs,n=c.updatePanelIDs,m=c.childUpdatePanelIDs,d=c.panelsToRefreshIDs,a,e,b,g,h=f.version4;for(a=0,e=d.length;a<e;a+=h?2:1){b=d[a];g=(h?d[a+1]:\"\")||this._uniqueIDToClientID(b);Array.add(j,document.getElementById(g))}for(a=0,e=k.length;a<e;a++){b=k[a];if(Array.indexOf(d,b)===-1&&(Array.indexOf(n,b)===-1||Array.indexOf(m,b)>-1))Array.add(i,document.getElementById(l[a]))}return new Sys.WebForms.PageLoadingEventArgs(j,i,f.dataItems)},_getPostBackSettings:function(a,c){var d=a,b=null;while(a){if(a.id){if(!b&&Array.contains(this._asyncPostBackControlClientIDs,a.id))b=this._createPostBackSettings(true,null,c,d);else if(!b&&Array.contains(this._postBackControlClientIDs,a.id))return this._createPostBackSettings(false);else{var e=Array.indexOf(this._updatePanelClientIDs,a.id);if(e!==-1)if(this._updatePanelHasChildrenAsTriggers[e])return this._createPostBackSettings(true,[this._updatePanelIDs[e]],c,d);else return this._createPostBackSettings(true,null,c,d)}if(!b&&this._matchesParentIDInList(a.id,this._asyncPostBackControlClientIDs))b=this._createPostBackSettings(true,null,c,d);else if(!b&&this._matchesParentIDInList(a.id,this._postBackControlClientIDs))return this._createPostBackSettings(false)}a=a.parentNode}if(!b)return this._createPostBackSettings(false);else return b},_getScrollPosition:function(){var a=document.documentElement;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else{a=document.body;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else if(this._validPosition(window.pageXOffset)||this._validPosition(window.pageYOffset))return {x:window.pageXOffset,y:window.pageYOffset};else return {x:0,y:0}}},_initializeInternal:function(f,g,a,b,e,c,d){if(this._prmInitialized)throw Error.invalidOperation(Sys.WebForms.Res.PRM_CannotRegisterTwice);this._prmInitialized=true;this._masterPageUniqueID=d;this._scriptManagerID=f;this._form=Sys.UI.DomElement.resolveElement(g);this._onsubmit=this._form.onsubmit;this._form.onsubmit=null;this._onFormSubmitHandler=Function.createDelegate(this,this._onFormSubmit);this._onFormElementClickHandler=Function.createDelegate(this,this._onFormElementClick);this._onWindowUnloadHandler=Function.createDelegate(this,this._onWindowUnload);Sys.UI.DomEvent.addHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.addHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._onWindowUnloadHandler);this._originalDoPostBack=window.__doPostBack;if(this._originalDoPostBack)window.__doPostBack=Function.createDelegate(this,this._doPostBack);this._originalDoPostBackWithOptions=window.WebForm_DoPostBackWithOptions;if(this._originalDoPostBackWithOptions)window.WebForm_DoPostBackWithOptions=Function.createDelegate(this,this._doPostBackWithOptions);this._originalFireDefaultButton=window.WebForm_FireDefaultButton;if(this._originalFireDefaultButton)window.WebForm_FireDefaultButton=Function.createDelegate(this,this._fireDefaultButton);this._originalDoCallback=window.WebForm_DoCallback;if(this._originalDoCallback)window.WebForm_DoCallback=Function.createDelegate(this,this._doCallback);this._pageLoadedHandler=Function.createDelegate(this,this._pageLoadedInitialLoad);Sys.UI.DomEvent.addHandler(window,\"load\",this._pageLoadedHandler);if(a)this._updateControls(a,b,e,c,true)},_matchesParentIDInList:function(c,b){for(var a=0,d=b.length;a<d;a++)if(c.startsWith(b[a]+\"_\"))return true;return false},_onFormElementActive:function(a,d,e){if(a.disabled)return;this._activeElement=a;this._postBackSettings=this._getPostBackSettings(a,a.name);if(a.name){var b=a.tagName.toUpperCase();if(b===\"INPUT\"){var c=a.type;if(c===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value);else if(c===\"image\")this._additionalInput=encodeURIComponent(a.name)+\".x=\"+d+\"&\"+encodeURIComponent(a.name)+\".y=\"+e}else if(b===\"BUTTON\"&&a.name.length!==0&&a.type===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value)}},_onFormElementClick:function(a){this._activeDefaultButtonClicked=a.target===this._activeDefaultButton;this._onFormElementActive(a.target,a.offsetX,a.offsetY)},_onFormSubmit:function(i){var f,x,h=true,z=this._isCrossPost;this._isCrossPost=false;if(this._onsubmit)h=this._onsubmit();if(h)for(f=0,x=this._onSubmitStatements.length;f<x;f++)if(!this._onSubmitStatements[f]()){h=false;break}if(!h){if(i)i.preventDefault();return}var w=this._form;if(z)return;if(this._activeDefaultButton&&!this._activeDefaultButtonClicked)this._onFormElementActive(this._activeDefaultButton,0,0);if(!this._postBackSettings||!this._postBackSettings.async)return;var b=new Sys.StringBuilder,s=w.elements,B=s.length,t=this._createPanelID(null,this._postBackSettings);b.append(t);for(f=0;f<B;f++){var e=s[f],g=e.name;if(typeof g===\"undefined\"||g===null||g.length===0||g===this._scriptManagerID)continue;var n=e.tagName.toUpperCase();if(n===\"INPUT\"){var p=e.type;if(this._textTypes.test(p)||(p===\"checkbox\"||p===\"radio\")&&e.checked){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}else if(n===\"SELECT\"){var A=e.options.length;for(var q=0;q<A;q++){var u=e.options[q];if(u.selected){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(u.value));b.append(\"&\")}}}else if(n===\"TEXTAREA\"){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}b.append(\"__ASYNCPOST=true&\");if(this._additionalInput){b.append(this._additionalInput);this._additionalInput=null}var c=new Sys.Net.WebRequest,a=w.action;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var r=a.indexOf(\"#\");if(r!==-1)a=a.substr(0,r);var o=\"\",v=\"\",m=a.indexOf(\"?\");if(m!==-1){v=a.substr(m);a=a.substr(0,m)}if(/^https?\\:\\/\\/.*$/gi.test(a)){var y=a.indexOf(\"//\")+2,l=a.indexOf(\"/\",y);if(l===-1){o=a;a=\"\"}else{o=a.substr(0,l);a=a.substr(l)}}a=o+encodeURI(decodeURI(a))+v}c.set_url(a);c.get_headers()[\"X-MicrosoftAjax\"]=\"Delta=true\";c.get_headers()[\"Cache-Control\"]=\"no-cache\";c.set_timeout(this._asyncPostBackTimeout);c.add_completed(Function.createDelegate(this,this._onFormSubmitCompleted));c.set_body(b.toString());var j,d,k=this._get_eventHandlerList().getHandler(\"initializeRequest\");if(k){j=this._postBackSettings.panelsToUpdate;d=new Sys.WebForms.InitializeRequestEventArgs(c,this._postBackSettings.sourceElement,j);k(this,d);h=!d.get_cancel()}if(!h){if(i)i.preventDefault();return}if(d&&d._updated){j=d.get_updatePanelsToUpdate();c.set_body(c.get_body().replace(t,this._createPanelID(j,this._postBackSettings)))}this._scrollPosition=this._getScrollPosition();this.abortPostBack();k=this._get_eventHandlerList().getHandler(\"beginRequest\");if(k){d=new Sys.WebForms.BeginRequestEventArgs(c,this._postBackSettings.sourceElement,j||this._postBackSettings.panelsToUpdate);k(this,d)}if(this._originalDoCallback)this._cancelPendingCallbacks();this._request=c;this._processingRequest=false;c.invoke();if(i)i.preventDefault()},_onFormSubmitCompleted:function(c){this._processingRequest=true;if(c.get_timedOut()){this._endPostBack(this._createPageRequestManagerTimeoutError(),c,null);return}if(c.get_aborted()){this._endPostBack(null,c,null);return}if(!this._request||c.get_webRequest()!==this._request)return;if(c.get_statusCode()!==200){this._endPostBack(this._createPageRequestManagerServerError(c.get_statusCode()),c,null);return}var a=this._parseDelta(c);if(!a)return;var b,e;if(a.asyncPostBackControlIDsNode&&a.postBackControlIDsNode&&a.updatePanelIDsNode&&a.panelsToRefreshNode&&a.childUpdatePanelIDsNode){var r=this._updatePanelIDs,n=this._updatePanelClientIDs,i=a.childUpdatePanelIDsNode.content,p=i.length?i.split(\",\"):[],m=this._splitNodeIntoArray(a.asyncPostBackControlIDsNode),o=this._splitNodeIntoArray(a.postBackControlIDsNode),q=this._splitNodeIntoArray(a.updatePanelIDsNode),g=this._splitNodeIntoArray(a.panelsToRefreshNode),h=a.version4;for(b=0,e=g.length;b<e;b+=h?2:1){var j=(h?g[b+1]:\"\")||this._uniqueIDToClientID(g[b]);if(!document.getElementById(j)){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,j)),c,a);return}}var f=this._processUpdatePanelArrays(q,m,o,h);f.oldUpdatePanelIDs=r;f.oldUpdatePanelClientIDs=n;f.childUpdatePanelIDs=p;f.panelsToRefreshIDs=g;a.updatePanelData=f}a.dataItems={};var d;for(b=0,e=a.dataItemNodes.length;b<e;b++){d=a.dataItemNodes[b];a.dataItems[d.id]=d.content}for(b=0,e=a.dataItemJsonNodes.length;b<e;b++){d=a.dataItemJsonNodes[b];a.dataItems[d.id]=Sys.Serialization.JavaScriptSerializer.deserialize(d.content)}var l=this._get_eventHandlerList().getHandler(\"pageLoading\");if(l)l(this,this._getPageLoadingEventArgs(a));Sys._ScriptLoader.readLoadedScripts();Sys.Application.beginCreateComponents();var k=Sys._ScriptLoader.getInstance();this._queueScripts(k,a.scriptBlockNodes,true,false);this._processingRequest=true;k.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadComplete,a)),Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadFailed,a)),null)},_onWindowUnload:function(){this.dispose()},_pageLoaded:function(a,c){var b=this._get_eventHandlerList().getHandler(\"pageLoaded\");if(b)b(this,this._getPageLoadedEventArgs(a,c));if(!a)Sys.Application.raiseLoad()},_pageLoadedInitialLoad:function(){this._pageLoaded(true,null)},_parseDelta:function(h){var c=h.get_responseData(),d,i,E,F,D,b=0,e=null,k=[];while(b<c.length){d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}i=parseInt(c.substring(b,d),10);if(i%1!==0){e=this._findText(c,b);break}b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}E=c.substring(b,d);b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}F=c.substring(b,d);b=d+1;if(b+i>=c.length){e=this._findText(c,c.length);break}D=c.substr(b,i);b+=i;if(c.charAt(b)!==\"|\"){e=this._findText(c,b);break}b++;Array.add(k,{type:E,id:F,content:D})}if(e){this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_ParserErrorDetails,e)),h,null);return null}var x=[],w=[],q=[],j=[],t=[],C=[],A=[],z=[],v=[],s=[],m,p,u,n,o,r,y,g;for(var l=0,G=k.length;l<G;l++){var a=k[l];switch(a.type){case \"#\":g=a;break;case \"updatePanel\":Array.add(x,a);break;case \"hiddenField\":Array.add(w,a);break;case \"arrayDeclaration\":Array.add(q,a);break;case \"scriptBlock\":Array.add(j,a);break;case \"fallbackScript\":j[j.length-1].fallback=a.id;case \"scriptStartupBlock\":Array.add(t,a);break;case \"expando\":Array.add(C,a);break;case \"onSubmit\":Array.add(A,a);break;case \"asyncPostBackControlIDs\":m=a;break;case \"postBackControlIDs\":p=a;break;case \"updatePanelIDs\":u=a;break;case \"asyncPostBackTimeout\":n=a;break;case \"childUpdatePanelIDs\":o=a;break;case \"panelsToRefreshIDs\":r=a;break;case \"formAction\":y=a;break;case \"dataItem\":Array.add(z,a);break;case \"dataItemJson\":Array.add(v,a);break;case \"scriptDispose\":Array.add(s,a);break;case \"pageRedirect\":if(g&&parseFloat(g.content)>=4)a.content=unescape(a.content);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var f=document.createElement(\"a\");f.style.display=\"none\";f.attachEvent(\"onclick\",B);f.href=a.content;this._form.parentNode.insertBefore(f,this._form);f.click();f.detachEvent(\"onclick\",B);this._form.parentNode.removeChild(f);function B(a){a.cancelBubble=true}}else window.location.href=a.content;return null;case \"error\":this._endPostBack(this._createPageRequestManagerServerError(Number.parseInvariant(a.id),a.content),h,null);return null;case \"pageTitle\":document.title=a.content;break;case \"focus\":this._controlIDToFocus=a.content;break;default:this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_UnknownToken,a.type)),h,null);return null}}return {version4:g?parseFloat(g.content)>=4:false,executor:h,updatePanelNodes:x,hiddenFieldNodes:w,arrayDeclarationNodes:q,scriptBlockNodes:j,scriptStartupNodes:t,expandoNodes:C,onSubmitNodes:A,dataItemNodes:z,dataItemJsonNodes:v,scriptDisposeNodes:s,asyncPostBackControlIDsNode:m,postBackControlIDsNode:p,updatePanelIDsNode:u,asyncPostBackTimeoutNode:n,childUpdatePanelIDsNode:o,panelsToRefreshNode:r,formActionNode:y}},_processUpdatePanelArrays:function(e,q,r,f){var d,c,b;if(e){var i=e.length,j=f?2:1;d=new Array(i/j);c=new Array(i/j);b=new Array(i/j);for(var g=0,h=0;g<i;g+=j,h++){var p,a=e[g],k=f?e[g+1]:\"\";p=a.charAt(0)===\"t\";a=a.substr(1);if(!k)k=this._uniqueIDToClientID(a);b[h]=p;d[h]=a;c[h]=k}}else{d=[];c=[];b=[]}var n=[],l=[];this._convertToClientIDs(q,n,l,f);var o=[],m=[];this._convertToClientIDs(r,o,m,f);return {updatePanelIDs:d,updatePanelClientIDs:c,updatePanelHasChildrenAsTriggers:b,asyncPostBackControlIDs:n,asyncPostBackControlClientIDs:l,postBackControlIDs:o,postBackControlClientIDs:m}},_queueScripts:function(scriptLoader,scriptBlockNodes,queueIncludes,queueBlocks){for(var i=0,l=scriptBlockNodes.length;i<l;i++){var scriptBlockType=scriptBlockNodes[i].id;switch(scriptBlockType){case \"ScriptContentNoTags\":if(!queueBlocks)continue;scriptLoader.queueScriptBlock(scriptBlockNodes[i].content);break;case \"ScriptContentWithTags\":var scriptTagAttributes;eval(\"scriptTagAttributes = \"+scriptBlockNodes[i].content);if(scriptTagAttributes.src){if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(scriptTagAttributes.src))continue}else if(!queueBlocks)continue;scriptLoader.queueCustomScriptTag(scriptTagAttributes);break;case \"ScriptPath\":var script=scriptBlockNodes[i];if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(script.content))continue;scriptLoader.queueScriptReference(script.content,script.fallback)}}},_registerDisposeScript:function(a,b){if(!this._scriptDisposes[a])this._scriptDisposes[a]=[b];else Array.add(this._scriptDisposes[a],b)},_scriptIncludesLoadComplete:function(e,b){if(b.executor.get_webRequest()!==this._request)return;this._commitControls(b.updatePanelData,b.asyncPostBackTimeoutNode?b.asyncPostBackTimeoutNode.content:null);if(b.formActionNode)this._form.action=b.formActionNode.content;var a,d,c;for(a=0,d=b.updatePanelNodes.length;a<d;a++){c=b.updatePanelNodes[a];var j=document.getElementById(c.id);if(!j){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,c.id)),b.executor,b);return}this._updatePanel(j,c.content)}for(a=0,d=b.scriptDisposeNodes.length;a<d;a++){c=b.scriptDisposeNodes[a];this._registerDisposeScript(c.id,c.content)}for(a=0,d=this._transientFields.length;a<d;a++){var g=document.getElementById(this._transientFields[a]);if(g){var k=g._isContained?g.parentNode:g;k.parentNode.removeChild(k)}}for(a=0,d=b.hiddenFieldNodes.length;a<d;a++){c=b.hiddenFieldNodes[a];this._createHiddenField(c.id,c.content)}if(b.scriptsFailed)throw Sys._ScriptLoader._errorScriptLoadFailed(b.scriptsFailed.src,b.scriptsFailed.multipleCallbacks);this._queueScripts(e,b.scriptBlockNodes,false,true);var i=\"\";for(a=0,d=b.arrayDeclarationNodes.length;a<d;a++){c=b.arrayDeclarationNodes[a];i+=\"Sys.WebForms.PageRequestManager._addArrayElement('\"+c.id+\"', \"+c.content+\");\\r\\n\"}var h=\"\";for(a=0,d=b.expandoNodes.length;a<d;a++){c=b.expandoNodes[a];h+=c.id+\" = \"+c.content+\"\\r\\n\"}if(i.length)e.queueScriptBlock(i);if(h.length)e.queueScriptBlock(h);this._queueScripts(e,b.scriptStartupNodes,true,true);var f=\"\";for(a=0,d=b.onSubmitNodes.length;a<d;a++){if(a===0)f=\"Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, function() {\\r\\n\";f+=b.onSubmitNodes[a].content+\"\\r\\n\"}if(f.length){f+=\"\\r\\nreturn true;\\r\\n});\\r\\n\";e.queueScriptBlock(f)}e.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptsLoadComplete,b)),null,null)},_scriptIncludesLoadFailed:function(d,c,b,a){a.scriptsFailed={src:c.src,multipleCallbacks:b};this._scriptIncludesLoadComplete(d,a)},_scriptsLoadComplete:function(f,c){var e=c.executor;if(window.__theFormPostData)window.__theFormPostData=\"\";if(window.__theFormPostCollection)window.__theFormPostCollection=[];if(window.WebForm_InitCallback)window.WebForm_InitCallback();if(this._scrollPosition){if(window.scrollTo)window.scrollTo(this._scrollPosition.x,this._scrollPosition.y);this._scrollPosition=null}Sys.Application.endCreateComponents();this._pageLoaded(false,c);this._endPostBack(null,e,c);if(this._controlIDToFocus){var a,d;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var b=$get(this._controlIDToFocus);a=b;if(b&&!WebForm_CanFocus(b))a=WebForm_FindFirstFocusableChild(b);if(a&&typeof a.contentEditable!==\"undefined\"){d=a.contentEditable;a.contentEditable=false}else a=null}WebForm_AutoFocus(this._controlIDToFocus);if(a)a.contentEditable=d;this._controlIDToFocus=null}},_splitNodeIntoArray:function(b){var a=b.content,c=a.length?a.split(\",\"):[];return c},_uniqueIDToClientID:function(a){return a.replace(/\\$/g,\"_\")},_updateControls:function(d,a,c,b,e){this._commitControls(this._processUpdatePanelArrays(d,a,c,e),b)},_updatePanel:function(updatePanelElement,rendering){for(var updatePanelID in this._scriptDisposes)if(this._elementContains(updatePanelElement,document.getElementById(updatePanelID))){var disposeScripts=this._scriptDisposes[updatePanelID];for(var i=0,l=disposeScripts.length;i<l;i++)eval(disposeScripts[i]);delete this._scriptDisposes[updatePanelID]}Sys.Application.disposeElement(updatePanelElement,true);updatePanelElement.innerHTML=rendering},_validPosition:function(a){return typeof a!==\"undefined\"&&a!==null&&a!==0}};Sys.WebForms.PageRequestManager.getInstance=function(){var a=Sys.WebForms.PageRequestManager._instance;if(!a)a=Sys.WebForms.PageRequestManager._instance=new Sys.WebForms.PageRequestManager;return a};Sys.WebForms.PageRequestManager._addArrayElement=function(a){if(!window[a])window[a]=[];for(var b=1,c=arguments.length;b<c;b++)Array.add(window[a],arguments[b])};Sys.WebForms.PageRequestManager._initialize=function(){var a=Sys.WebForms.PageRequestManager.getInstance();a._initializeInternal.apply(a,arguments)};Sys.WebForms.PageRequestManager.registerClass(\"Sys.WebForms.PageRequestManager\");Sys.UI._UpdateProgress=function(a){Sys.UI._UpdateProgress.initializeBase(this,[a]);this._displayAfter=500;this._dynamicLayout=true;this._associatedUpdatePanelId=null;this._beginRequestHandlerDelegate=null;this._startDelegate=null;this._endRequestHandlerDelegate=null;this._pageRequestManager=null;this._timerCookie=null};Sys.UI._UpdateProgress.prototype={get_displayAfter:function(){return this._displayAfter},set_displayAfter:function(a){this._displayAfter=a},get_dynamicLayout:function(){return this._dynamicLayout},set_dynamicLayout:function(a){this._dynamicLayout=a},get_associatedUpdatePanelId:function(){return this._associatedUpdatePanelId},set_associatedUpdatePanelId:function(a){this._associatedUpdatePanelId=a},get_role:function(){return \"status\"},_clearTimeout:function(){if(this._timerCookie){window.clearTimeout(this._timerCookie);this._timerCookie=null}},_getUniqueID:function(b){var a=Array.indexOf(this._pageRequestManager._updatePanelClientIDs,b);return a===-1?null:this._pageRequestManager._updatePanelIDs[a]},_handleBeginRequest:function(f,e){var b=e.get_postBackElement(),a=true,d=this._associatedUpdatePanelId;if(this._associatedUpdatePanelId){var c=e.get_updatePanelsToUpdate();if(c&&c.length)a=Array.contains(c,d)||Array.contains(c,this._getUniqueID(d));else a=false}while(!a&&b){if(b.id&&this._associatedUpdatePanelId===b.id)a=true;b=b.parentNode}if(a)this._timerCookie=window.setTimeout(this._startDelegate,this._displayAfter)},_startRequest:function(){if(this._pageRequestManager.get_isInAsyncPostBack()){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"block\";else a.style.visibility=\"visible\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"false\")}this._timerCookie=null},_handleEndRequest:function(){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"none\";else a.style.visibility=\"hidden\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"true\");this._clearTimeout()},dispose:function(){if(this._beginRequestHandlerDelegate!==null){this._pageRequestManager.remove_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);this._beginRequestHandlerDelegate=null;this._endRequestHandlerDelegate=null}this._clearTimeout();Sys.UI._UpdateProgress.callBaseMethod(this,\"dispose\")},initialize:function(){Sys.UI._UpdateProgress.callBaseMethod(this,\"initialize\");if(this.get_role()===\"status\")this.get_element().setAttribute(\"aria-hidden\",\"true\");this._beginRequestHandlerDelegate=Function.createDelegate(this,this._handleBeginRequest);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);this._startDelegate=Function.createDelegate(this,this._startRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null){this._pageRequestManager.add_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate)}}};Sys.UI._UpdateProgress.registerClass(\"Sys.UI._UpdateProgress\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebServices.js\nType._registerScript(\"MicrosoftAjaxWebServices.js\",[\"MicrosoftAjaxNetwork.js\"]);Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Menu.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/Menu.js\nvar __rootMenuItem;\nvar __menuInterval;\nvar __scrollPanel;\nvar __disappearAfter = 500;\nfunction Menu_ClearInterval() {\n    if (__menuInterval) {\n        window.clearInterval(__menuInterval);\n    }\n}\nfunction Menu_Collapse(item) {\n    Menu_SetRoot(item);\n    if (__rootMenuItem) {\n        Menu_ClearInterval();\n        if (__disappearAfter >= 0) {\n            __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n        }\n    }\n}\nfunction Menu_Expand(item, horizontalOffset, verticalOffset, hideScrollers) {\n    Menu_ClearInterval();\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    var horizontal = true;\n    if (!tr.id) {\n        horizontal = false;\n        tr = tr.parentNode;\n    }\n    var child = Menu_FindSubMenu(item);\n    if (child) {\n        var data = Menu_GetData(item);\n        if (!data) {\n            return null;\n        }\n        child.rel = tr.id;\n        child.x = horizontalOffset;\n        child.y = verticalOffset;\n        if (horizontal) child.pos = \"bottom\";\n        PopOut_Show(child.id, hideScrollers, data);\n    }\n    Menu_SetRoot(item);\n    if (child) {\n        if (!document.body.__oldOnClick && document.body.onclick) {\n            document.body.__oldOnClick = document.body.onclick;\n        }\n        if (__rootMenuItem) {\n            document.body.onclick = Menu_HideItems;\n        }\n    }\n    Menu_ResetSiblings(tr);\n    return child;\n}\nfunction Menu_FindMenu(item) {\n    if (item && item.menu) return item.menu;\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr = tr.parentNode;\n    }\n    for (var i = tr.id.length - 1; i >= 0; i--) {\n        if (tr.id.charAt(i) < '0' || tr.id.charAt(i) > '9') {\n            var menu = WebForm_GetElementById(tr.id.substr(0, i));\n            if (menu) {\n                item.menu = menu;\n                return menu;\n            }\n        }\n    }\n    return null;\n}\nfunction Menu_FindNext(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var first = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        var match = false;\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (Menu_FindParentContainer(link) == parent) {\n                    if (match) {\n                        return link;\n                    }\n                    else if (!first) {\n                        first = link;\n                    }\n                }\n                if (!match && link == a) {\n                    match = true;\n                }\n            }\n        }\n    }\n    return first;\n}\nfunction Menu_FindParentContainer(item) {\n    if (item.menu_ParentContainerCache) return item.menu_ParentContainerCache;\n    var a = (item.tagName.toLowerCase() == \"a\") ? item : WebForm_GetElementByTagName(item, \"A\");\n    var menu = Menu_FindMenu(a);\n    if (menu) {\n        var parent = item;\n        while (parent && parent.tagName &&\n            parent.id != menu.id &&\n            parent.tagName.toLowerCase() != \"div\") {\n            parent = parent.parentNode;\n        }\n        item.menu_ParentContainerCache = parent;\n        return parent;\n    }\n}\nfunction Menu_FindParentItem(item) {\n    var parentContainer = Menu_FindParentContainer(item);\n    var parentContainerID = parentContainer.id;\n    var len = parentContainerID.length;\n    if (parentContainerID && parentContainerID.substr(len - 5) == \"Items\") {\n        var parentItemID = parentContainerID.substr(0, len - 5);\n        return WebForm_GetElementById(parentItemID);\n    }\n    return null;\n}\nfunction Menu_FindPrevious(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var last = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (link == a && last) {\n                    return last;\n                }\n                if (Menu_FindParentContainer(link) == parent) {\n                    last = link;\n                }\n            }\n        }\n    }\n    return last;\n}\nfunction Menu_FindSubMenu(item) {\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr=tr.parentNode;\n    }\n    return WebForm_GetElementById(tr.id + \"Items\");\n}\nfunction Menu_Focus(item) {\n    if (item && item.focus) {\n        var pos = WebForm_GetElementPosition(item);\n        var parentContainer = Menu_FindParentContainer(item);\n        if (!parentContainer.offset) {\n            parentContainer.offset = 0;\n        }\n        var posParent = WebForm_GetElementPosition(parentContainer);\n        var delta;\n        if (pos.y + pos.height > posParent.y + parentContainer.offset + parentContainer.clippedHeight) {\n            delta = pos.y + pos.height - posParent.y - parentContainer.offset - parentContainer.clippedHeight;\n            PopOut_Scroll(parentContainer, delta);\n        }\n        else if (pos.y < posParent.y + parentContainer.offset) {\n            delta = posParent.y + parentContainer.offset - pos.y;\n            PopOut_Scroll(parentContainer, -delta);\n        }\n        PopOut_HideScrollers(parentContainer);\n        item.focus();\n    }\n}\nfunction Menu_GetData(item) {\n    if (!item.data) {\n        var a = (item.tagName.toLowerCase() == \"a\" ? item : WebForm_GetElementByTagName(item, \"a\"));\n        var menu = Menu_FindMenu(a);\n        try {\n            item.data = eval(menu.id + \"_Data\");\n        }\n        catch(e) {}\n    }\n    return item.data;\n}\nfunction Menu_HideItems(items) {\n    if (document.body.__oldOnClick) {\n        document.body.onclick = document.body.__oldOnClick;\n        document.body.__oldOnClick = null;\n    }\n    Menu_ClearInterval();\n    if (!items || ((typeof(items.tagName) == \"undefined\") && (items instanceof Event))) {\n        items = __rootMenuItem;\n    }\n    var table = items;\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        table = WebForm_GetElementByTagName(table, \"TABLE\");\n    }\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        return;\n    }\n    var rows = table.rows ? table.rows : table.firstChild.rows;\n    var isVertical = false;\n    for (var r = 0; r < rows.length; r++) {\n        if (rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, nextLevel;\n    if (isVertical) {\n        for(i = 0; i < rows.length; i++) {\n            if (rows[i].id) {\n                child = WebForm_GetElementById(rows[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else if (rows[i].cells[0]) {\n                nextLevel = WebForm_GetElementByTagName(rows[i].cells[0], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(nextLevel);\n                }\n            }\n        }\n    }\n    else if (rows[0]) {\n        for(i = 0; i < rows[0].cells.length; i++) {\n            if (rows[0].cells[i].id) {\n                child = WebForm_GetElementById(rows[0].cells[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else {\n                nextLevel = WebForm_GetElementByTagName(rows[0].cells[i], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(rows[0].cells[i].firstChild);\n                }\n            }\n        }\n    }\n    if (items && items.id) {\n        PopOut_Hide(items.id);\n    }\n}\nfunction Menu_HoverDisabled(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    node = WebForm_GetElementByTagName(node, \"table\").rows[0].cells[0].childNodes[0];\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverDynamic(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.hoverClass) {\n        nodeTable.hoverClass = data.hoverClass;\n        WebForm_AppendToClassName(nodeTable, data.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.hoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n    }\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverRoot(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) {\n        return null;\n    }\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.staticHoverClass) {\n        nodeTable.hoverClass = data.staticHoverClass;\n        WebForm_AppendToClassName(nodeTable, data.staticHoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.staticHoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.staticHoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.staticHoverHyperLinkClass);\n    }\n    return node;\n}\nfunction Menu_HoverStatic(item) {\n    var node = Menu_HoverRoot(item);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    __disappearAfter = data.disappearAfter;\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_IsHorizontal(item) {\n    if (item) {\n        var a = ((item.tagName && (item.tagName.toLowerCase == \"a\")) ? item : WebForm_GetElementByTagName(item, \"A\"));\n        if (!a) {\n            return false;\n        }\n        var td = a.parentNode.parentNode.parentNode.parentNode.parentNode;\n        if (td.id) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction Menu_IsSelectable(link) {\n    return (link && link.href)\n}\nfunction Menu_Key(item) {\n    var event;\n    if (item.currentTarget) {\n        event = item;\n        item = event.currentTarget;\n    }\n    else {\n        event = window.event;        \n    }\n    var key = (event ? event.keyCode : -1);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var horizontal = Menu_IsHorizontal(item);\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var nextItem, parentItem, previousItem;\n    if ((!horizontal && key == 38) || (horizontal && key == 37)) {\n        previousItem = Menu_FindPrevious(item);\n        while (previousItem && previousItem.disabled) {\n            previousItem = Menu_FindPrevious(previousItem);\n        }\n        if (previousItem) {\n            Menu_Focus(previousItem);\n            Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 40) || (horizontal && key == 39)) {\n        if (horizontal) {\n            var subMenu = Menu_FindSubMenu(a);\n            if (subMenu && subMenu.style && subMenu.style.visibility && \n                subMenu.style.visibility.toLowerCase() == \"hidden\") {\n                Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        nextItem = Menu_FindNext(item);\n        while (nextItem && nextItem.disabled) {\n            nextItem = Menu_FindNext(nextItem);\n        }\n        if (nextItem) {\n            Menu_Focus(nextItem);\n            Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 39) || (horizontal && key == 40)) {\n        var children = Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n        if (children) {\n            var firstChild;\n            children = WebForm_GetElementsByTagName(children, \"A\");\n            for (var i = 0; i < children.length; i++) {\n                if (!children[i].disabled && Menu_IsSelectable(children[i])) {\n                    firstChild = children[i];\n                    break;\n                }\n            }\n            if (firstChild) {\n                Menu_Focus(firstChild);\n                Menu_Expand(firstChild, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        else {\n            parentItem = Menu_FindParentItem(item);\n            while (parentItem && !Menu_IsHorizontal(parentItem)) {\n                parentItem = Menu_FindParentItem(parentItem);\n            }\n            if (parentItem) {\n                nextItem = Menu_FindNext(parentItem);\n                while (nextItem && nextItem.disabled) {\n                    nextItem = Menu_FindNext(nextItem);\n                }\n                if (nextItem) {\n                    Menu_Focus(nextItem);\n                    Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n        }\n    }\n    if ((!horizontal && key == 37) || (horizontal && key == 38)) {\n        parentItem = Menu_FindParentItem(item);\n        if (parentItem) {\n            if (Menu_IsHorizontal(parentItem)) {\n                previousItem = Menu_FindPrevious(parentItem);\n                while (previousItem && previousItem.disabled) {\n                    previousItem = Menu_FindPrevious(previousItem);\n                }\n                if (previousItem) {\n                    Menu_Focus(previousItem);\n                    Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n            var parentA = WebForm_GetElementByTagName(parentItem, \"A\");\n            if (parentA) {\n                Menu_Focus(parentA);\n            }\n            Menu_ResetSiblings(parentItem);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if (key == 27) {\n        Menu_HideItems();\n        event.cancelBubble = true;\n        if (event.stopPropagation) event.stopPropagation();\n        return;\n    }\n}\nfunction Menu_ResetSiblings(item) {\n    var table = (item.tagName.toLowerCase() == \"td\") ?\n        item.parentNode.parentNode.parentNode :\n        item.parentNode.parentNode;\n    var isVertical = false;\n    for (var r = 0; r < table.rows.length; r++) {\n        if (table.rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, childNode;\n    if (isVertical) {\n        for(i = 0; i < table.rows.length; i++) {\n            childNode = table.rows[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    else {\n        for(i = 0; i < table.rows[0].cells.length; i++) {\n            childNode = table.rows[0].cells[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    Menu_ResetTopMenus(table, table, 0, true);\n}\nfunction Menu_ResetTopMenus(table, doNotReset, level, up) {\n    var i, child, childNode;\n    if (up && table.id == \"\") {\n        var parentTable = table.parentNode.parentNode.parentNode.parentNode;\n        if (parentTable.tagName.toLowerCase() == \"table\") {\n            Menu_ResetTopMenus(parentTable, doNotReset, level + 1, true);\n        }\n    }\n    else {\n        if (level == 0 && table != doNotReset) {\n            if (table.rows[0].id) {\n                for(i = 0; i < table.rows.length; i++) {\n                    childNode = table.rows[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n            else {\n                for(i = 0; i < table.rows[0].cells.length; i++) {\n                    childNode = table.rows[0].cells[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n        }\n        else if (level > 0) {\n            for (i = 0; i < table.rows.length; i++) {\n                for (var j = 0; j < table.rows[i].cells.length; j++) {\n                    var subTable = table.rows[i].cells[j].firstChild;\n                    if (subTable && subTable.tagName.toLowerCase() == \"table\") {\n                        Menu_ResetTopMenus(subTable, doNotReset, level - 1, false);\n                    }\n                }\n            }\n        }\n    }\n}\nfunction Menu_RestoreInterval() {\n    if (__menuInterval && __rootMenuItem) {\n        Menu_ClearInterval();\n        __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n    }\n}\nfunction Menu_SetRoot(item) {\n    var newRoot = Menu_FindMenu(item);\n    if (newRoot) {\n        if (__rootMenuItem && __rootMenuItem != newRoot) {\n            Menu_HideItems();\n        }\n        __rootMenuItem = newRoot;\n    }\n}\nfunction Menu_Unhover(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (nodeTable.hoverClass) {\n        WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (node.hoverHyperLinkClass) {\n        WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n    }\n    Menu_Collapse(node);\n}\nfunction PopOut_Clip(element, y, height) {\n    if (element && element.style) {\n        element.style.clip = \"rect(\" + y + \"px auto \" + (y + height) + \"px auto)\";\n        element.style.overflow = \"hidden\";\n    }\n}\nfunction PopOut_Down(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && ((panel.offset + panel.clippedHeight) < panel.physicalHeight)) {\n        PopOut_Scroll(panel, 2)\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Down()\", 8);\n    }\n    else {\n        PopOut_ShowScrollers(panel);\n    }\n}\nfunction PopOut_Hide(panelId) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"hidden\";\n        panel.style.display = \"none\";\n        panel.offset = 0;\n        panel.scrollTop = 0;\n        var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n        if (table) {\n            WebForm_SetElementY(table, 0);\n        }\n        if (window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" &&\n            !window.opera) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            if (childFrame) {\n                childFrame.style.display = \"none\";\n            }\n        }\n    }\n}\nfunction PopOut_HideScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        if (up) {\n            up.style.visibility = \"hidden\";\n            up.style.display = \"none\";\n        }\n        if (dn) {\n            dn.style.visibility = \"hidden\";\n            dn.style.display = \"none\";\n        }\n    }\n}\nfunction PopOut_Position(panel, hideScrollers) {\n    if (window.opera) {\n        panel.parentNode.removeChild(panel);\n        document.forms[0].appendChild(panel);\n    }\n    var rel = WebForm_GetElementById(panel.rel);\n    var relTable = WebForm_GetElementByTagName(rel, \"TABLE\");\n    var relCoordinates = WebForm_GetElementPosition(relTable ? relTable : rel);\n    var panelCoordinates = WebForm_GetElementPosition(panel);\n    var panelHeight = ((typeof(panel.physicalHeight) != \"undefined\") && (panel.physicalHeight != null)) ?\n        panel.physicalHeight :\n        panelCoordinates.height;\n    panel.physicalHeight = panelHeight;\n    var panelParentCoordinates;\n    if (panel.offsetParent) {\n        panelParentCoordinates = WebForm_GetElementPosition(panel.offsetParent);\n    }\n    else {\n        panelParentCoordinates = new Object();\n        panelParentCoordinates.x = 0;\n        panelParentCoordinates.y = 0;\n    }\n    var overflowElement = WebForm_GetElementById(\"__overFlowElement\");\n    if (!overflowElement) {\n        overflowElement = document.createElement(\"img\");\n        overflowElement.id=\"__overFlowElement\";\n        WebForm_SetElementWidth(overflowElement, 1);\n        document.body.appendChild(overflowElement);\n    }\n    WebForm_SetElementHeight(overflowElement, panelHeight + relCoordinates.y + parseInt(panel.y ? panel.y : 0));\n    overflowElement.style.visibility = \"visible\";\n    overflowElement.style.display = \"inline\";\n    var clientHeight = 0;\n    var clientWidth = 0;\n    if (window.innerHeight) {\n        clientHeight = window.innerHeight;\n        clientWidth = window.innerWidth;\n    }\n    else if (document.documentElement && document.documentElement.clientHeight) {\n        clientHeight = document.documentElement.clientHeight;\n        clientWidth = document.documentElement.clientWidth;\n    }\n    else if (document.body && document.body.clientHeight) {\n        clientHeight = document.body.clientHeight;\n        clientWidth = document.body.clientWidth;\n    }\n    var scrollTop = 0;\n    var scrollLeft = 0;\n    if (typeof(window.pageYOffset) != \"undefined\") {\n        scrollTop = window.pageYOffset;\n        scrollLeft = window.pageXOffset;\n    }\n    else if (document.documentElement && (typeof(document.documentElement.scrollTop) != \"undefined\")) {\n        scrollTop = document.documentElement.scrollTop;\n        scrollLeft = document.documentElement.scrollLeft;\n    }\n    else if (document.body && (typeof(document.body.scrollTop) != \"undefined\")) {\n        scrollTop = document.body.scrollTop;\n        scrollLeft = document.body.scrollLeft;\n    }\n    overflowElement.style.visibility = \"hidden\";\n    overflowElement.style.display = \"none\";\n    var bottomWindowBorder = clientHeight + scrollTop;\n    var rightWindowBorder = clientWidth + scrollLeft;\n    var position = panel.pos;\n    if ((typeof(position) == \"undefined\") || (position == null) || (position == \"\")) {\n        position = (WebForm_GetElementDir(rel) == \"rtl\" ? \"middleleft\" : \"middleright\");\n    }\n    position = position.toLowerCase();\n    var y = relCoordinates.y + parseInt(panel.y ? panel.y : 0) - panelParentCoordinates.y;\n    var borderParent = (rel && rel.parentNode && rel.parentNode.parentNode && rel.parentNode.parentNode.parentNode\n        && rel.parentNode.parentNode.parentNode.tagName.toLowerCase() == \"div\") ?\n        rel.parentNode.parentNode.parentNode : null;\n    WebForm_SetElementY(panel, y);\n    PopOut_SetPanelHeight(panel, panelHeight, true);\n    var clip = false;\n    var overflow;\n    if (position.indexOf(\"top\") != -1) {\n        y -= panelHeight;\n        WebForm_SetElementY(panel, y); \n        if (y < -panelParentCoordinates.y) {\n            y = -panelParentCoordinates.y;\n            WebForm_SetElementY(panel, y); \n            if (panelHeight > clientHeight - 2) {\n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    else {\n        if (position.indexOf(\"bottom\") != -1) {\n            y += relCoordinates.height;\n            WebForm_SetElementY(panel, y); \n        }\n        overflow = y + panelParentCoordinates.y + panelHeight - bottomWindowBorder;\n        if (overflow > 0) {\n            y -= overflow;\n            WebForm_SetElementY(panel, y); \n            if (y < -panelParentCoordinates.y) {\n                y = 2 - panelParentCoordinates.y + scrollTop;\n                WebForm_SetElementY(panel, y); \n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    if (!clip) {\n        PopOut_SetPanelHeight(panel, panel.clippedHeight, true);\n    }\n    var panelParentOffsetY = 0;\n    if (panel.offsetParent) {\n        panelParentOffsetY = WebForm_GetElementPosition(panel.offsetParent).y;\n    }\n    var panelY = ((typeof(panel.originY) != \"undefined\") && (panel.originY != null)) ?\n        panel.originY :\n        y - panelParentOffsetY;\n    panel.originY = panelY;\n    if (!hideScrollers) {\n        PopOut_ShowScrollers(panel);\n    }\n    else {\n        PopOut_HideScrollers(panel);\n    }\n    var x = relCoordinates.x + parseInt(panel.x ? panel.x : 0) - panelParentCoordinates.x;\n    if (borderParent && borderParent.clientLeft) {\n        x += 2 * borderParent.clientLeft;\n    }\n    WebForm_SetElementX(panel, x);\n    if (position.indexOf(\"left\") != -1) {\n        x -= panelCoordinates.width;\n        WebForm_SetElementX(panel, x);\n        if (x < -panelParentCoordinates.x) {\n            WebForm_SetElementX(panel, -panelParentCoordinates.x);\n        }\n    }\n    else {\n        if (position.indexOf(\"right\") != -1) {\n            x += relCoordinates.width;\n            WebForm_SetElementX(panel, x);\n        }\n        overflow = x + panelParentCoordinates.x + panelCoordinates.width - rightWindowBorder;\n        if (overflow > 0) {\n            if (position.indexOf(\"bottom\") == -1 && relCoordinates.x > panelCoordinates.width) {\n                x -= relCoordinates.width + panelCoordinates.width;\n            }\n            else {\n                x -= overflow;\n            }\n            WebForm_SetElementX(panel, x);\n            if (x < -panelParentCoordinates.x) {\n                WebForm_SetElementX(panel, -panelParentCoordinates.x);\n            }\n        }\n    }\n}\nfunction PopOut_Scroll(panel, offsetDelta) {\n    var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n    if (!table) return;\n    table.style.position = \"relative\";\n    var tableY = (table.style.top ? parseInt(table.style.top) : 0);\n    panel.offset += offsetDelta;\n    WebForm_SetElementY(table, tableY - offsetDelta);\n}\nfunction PopOut_SetPanelHeight(element, height, doNotClip) {\n    if (element && element.style) {\n        var size = WebForm_GetElementPosition(element);\n        element.physicalWidth = size.width;\n        element.clippedHeight = height;\n        WebForm_SetElementHeight(element, height - (element.clientTop ? (2 * element.clientTop) : 0));\n        if (doNotClip && element.style) {\n            element.style.clip = \"rect(auto auto auto auto)\";\n        }\n        else {\n            PopOut_Clip(element, 0, height);\n        }\n    }\n}\nfunction PopOut_Show(panelId, hideScrollers, data) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"visible\";\n        panel.style.display = \"inline\";\n        if (!panel.offset || hideScrollers) {\n            panel.scrollTop = 0;\n            panel.offset = 0;\n            var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n            if (table) {\n                WebForm_SetElementY(table, 0);\n            }\n        }\n        PopOut_Position(panel, hideScrollers);\n        var z = 1;\n        var isIE = window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" && !window.opera;\n        if (isIE && data) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            var parent = panel.offsetParent;\n            if (!childFrame) {\n                childFrame = document.createElement(\"iframe\");\n                childFrame.id = childFrameId;\n                childFrame.src = (data.iframeUrl ? data.iframeUrl : \"about:blank\");\n                childFrame.style.position = \"absolute\";\n                childFrame.style.display = \"none\";\n                childFrame.scrolling = \"no\";\n                childFrame.frameBorder = \"0\";\n                if (parent.tagName.toLowerCase() == \"html\") {\n                    document.body.appendChild(childFrame);\n                }\n                else {\n                    parent.appendChild(childFrame);\n                }\n            }\n            var pos = WebForm_GetElementPosition(panel);\n            var parentPos = WebForm_GetElementPosition(parent);\n            WebForm_SetElementX(childFrame, pos.x - parentPos.x);\n            WebForm_SetElementY(childFrame, pos.y - parentPos.y);\n            WebForm_SetElementWidth(childFrame, pos.width);\n            WebForm_SetElementHeight(childFrame, pos.height);\n            childFrame.style.display = \"block\";\n            if (panel.currentStyle && panel.currentStyle.zIndex && panel.currentStyle.zIndex != \"auto\") {\n                z = panel.currentStyle.zIndex;\n            }\n            else if (panel.style.zIndex) {\n                z = panel.style.zIndex;\n            }\n        }\n        panel.style.zIndex = z;\n    }\n}\nfunction PopOut_ShowScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        var cnt = 0;\n        if (up && dn) {\n            if (panel.offset && panel.offset > 0) {\n                up.style.visibility = \"visible\";\n                up.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(up, panel.clientWidth\n                        - (up.clientLeft ? (2 * up.clientLeft) : 0));\n                }\n                WebForm_SetElementY(up, 0);\n            }\n            else {\n                up.style.visibility = \"hidden\";\n                up.style.display = \"none\";\n            }\n            if (panel.offset + panel.clippedHeight + 2 <= panel.physicalHeight) {\n                dn.style.visibility = \"visible\";\n                dn.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(dn, panel.clientWidth\n                        - (dn.clientLeft ? (2 * dn.clientLeft) : 0));\n                }\n                WebForm_SetElementY(dn, panel.clippedHeight - WebForm_GetElementPosition(dn).height\n                    - (panel.clientTop ? (2 * panel.clientTop) : 0));\n            }\n            else {\n                dn.style.visibility = \"hidden\";\n                dn.style.display = \"none\";\n            }\n            if (cnt == 0) {\n                panel.style.clip = \"rect(auto auto auto auto)\";\n            }\n        }\n    }\n}\nfunction PopOut_Stop() {\n    if (__scrollPanel && __scrollPanel.interval) {\n        window.clearInterval(__scrollPanel.interval);\n    }\n    Menu_RestoreInterval();\n}\nfunction PopOut_Up(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && panel.offset && panel.offset > 0) {\n        PopOut_Scroll(panel, -2);\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Up()\", 8);\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MenuStandards.js",
    "content": "﻿//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MenuStandards.js\nif (!window.Sys) { window.Sys = {}; }\nif (!Sys.WebForms) { Sys.WebForms = {}; }\nSys.WebForms.Menu = function(options) {\n    this.items = [];\n    this.depth = options.depth || 1;\n    this.parentMenuItem = options.parentMenuItem;\n    this.element = Sys.WebForms.Menu._domHelper.getElement(options.element);\n    if (this.element.tagName === 'DIV') {\n        var containerElement = this.element;\n        this.element = Sys.WebForms.Menu._domHelper.firstChild(containerElement);\n        this.element.tabIndex = options.tabIndex || 0;\n        options.element = containerElement;\n        options.menu = this;\n        this.container = new Sys.WebForms._MenuContainer(options);\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    else {\n        this.container = options.container;\n        this.keyMap = options.keyMap;\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    if (this.parentMenuItem && this.parentMenuItem.parentMenu) {\n        this.parentMenu = this.parentMenuItem.parentMenu;\n        this.rootMenu = this.parentMenu.rootMenu;\n        if (!this.element.id) {\n            this.element.id = (this.container.element.id || 'menu') + ':submenu:' + Sys.WebForms.Menu._elementObjectMapper._computedId;\n        }\n        if (this.depth > this.container.staticDisplayLevels) {\n            this.displayMode = \"dynamic\";\n            this.element.style.display = \"none\";\n            this.element.style.position = \"absolute\";\n            if (this.rootMenu && this.container.orientation === 'horizontal' && this.parentMenu.isStatic()) {\n                this.element.style.top = \"100%\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"0px\";\n                }\n                else {\n                    this.element.style.left = \"0px\";\n                }\n            }\n            else {\n                this.element.style.top = \"0px\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"100%\";\n                }\n                else {\n                    this.element.style.left = \"100%\";\n                }\n            }\n            if (this.container.rightToLeft) {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n            }\n            else {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n            }\n        }\n        else {\n            this.displayMode = \"static\";\n            this.element.style.display = \"block\";\n            if (this.container.orientation === 'horizontal') {\n                Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n            }\n        }\n    }\n    Sys.WebForms.Menu._domHelper.appendCssClass(this.element, this.displayMode);\n    var children = this.element.childNodes;\n    var count = children.length;\n    for (var i = 0; i < count; i++) {\n        var node = children[i];\n        if (node.nodeType !== 1) {   \n            continue;\n        }\n        var topLevelMenuItem = null;\n        if (this.parentMenuItem) {\n            topLevelMenuItem = this.parentMenuItem.topLevelMenuItem;\n        }\n        var menuItem = new Sys.WebForms.MenuItem(this, node, topLevelMenuItem);\n        var previousMenuItem = this.items[this.items.length - 1];\n        if (previousMenuItem) {\n            menuItem.previousSibling = previousMenuItem;\n            previousMenuItem.nextSibling = menuItem;\n        }\n        this.items[this.items.length] = menuItem;\n    }\n};\nSys.WebForms.Menu.prototype = {\n    blur: function() { if (this.container) this.container.blur(); },\n    collapse: function() {\n        this.each(function(menuItem) {\n            menuItem.hover(false);\n            menuItem.blur();\n            var childMenu = menuItem.childMenu;\n            if (childMenu) {\n                childMenu.collapse();\n            }\n        });\n        this.hide();\n    },\n    doDispose: function() { this.each(function(item) { item.doDispose(); }); },\n    each: function(fn) {\n        var count = this.items.length;\n        for (var i = 0; i < count; i++) {\n            fn(this.items[i]);\n        }\n    },\n    firstChild: function() { return this.items[0]; },\n    focus: function() { if (this.container) this.container.focus(); },\n    get_displayed: function() { return this.element.style.display !== 'none'; },\n    get_focused: function() {\n        if (this.container) {\n            return this.container.focused;\n        }\n        return false;\n    },\n    handleKeyPress: function(keyCode) {\n        if (this.keyMap.contains(keyCode)) {\n            if (this.container.focusedMenuItem) {\n                this.container.focusedMenuItem.navigate(keyCode);\n                return;\n            }\n            var firstChild = this.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n    },\n    hide: function() {\n        if (!this.get_displayed()) {\n            return;\n        }\n        this.each(function(item) {\n            if (item.childMenu) {\n                item.childMenu.hide();\n            }\n        });\n        if (!this.isRoot()) {\n            if (this.get_focused()) {\n                this.container.navigateTo(this.parentMenuItem);\n            }\n            this.element.style.display = 'none';\n        }\n    },\n    isRoot: function() { return this.rootMenu === this; },\n    isStatic: function() { return this.displayMode === 'static'; },\n    lastChild: function() { return this.items[this.items.length - 1]; },\n    show: function() { this.element.style.display = 'block'; }\n};\nif (Sys.WebForms.Menu.registerClass) {\n    Sys.WebForms.Menu.registerClass('Sys.WebForms.Menu');\n}\nSys.WebForms.MenuItem = function(parentMenu, listElement, topLevelMenuItem) {\n    this.keyMap = parentMenu.keyMap;\n    this.parentMenu = parentMenu;\n    this.container = parentMenu.container;\n    this.element = listElement;\n    this.topLevelMenuItem = topLevelMenuItem || this;\n    this._anchor = Sys.WebForms.Menu._domHelper.firstChild(listElement);\n    while (this._anchor && this._anchor.tagName !== 'A') {\n        this._anchor = Sys.WebForms.Menu._domHelper.nextSibling(this._anchor);\n    }\n    if (this._anchor) {\n        this._anchor.tabIndex = -1;\n        var subMenu = this._anchor;\n        while (subMenu && subMenu.tagName !== 'UL') {\n            subMenu = Sys.WebForms.Menu._domHelper.nextSibling(subMenu);\n        }\n        if (subMenu) {\n            this.childMenu = new Sys.WebForms.Menu({ element: subMenu, parentMenuItem: this, depth: parentMenu.depth + 1, container: this.container, keyMap: this.keyMap });\n            if (!this.childMenu.isStatic()) {\n                Sys.WebForms.Menu._domHelper.appendCssClass(this.element, 'has-popup');\n                Sys.WebForms.Menu._domHelper.appendAttributeValue(this.element, 'aria-haspopup', this.childMenu.element.id);\n            }\n        }\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(listElement, this);\n    Sys.WebForms.Menu._domHelper.appendAttributeValue(listElement, 'role', 'menuitem');\n    Sys.WebForms.Menu._domHelper.appendCssClass(listElement, parentMenu.displayMode);\n    if (this._anchor) {\n        Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, parentMenu.displayMode);\n    }\n    this.element.style.position = \"relative\";\n    if (this.parentMenu.depth == 1 && this.container.orientation == 'horizontal') {\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    if (!this.container.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n    }\n};\nSys.WebForms.MenuItem.prototype = {\n    applyUp: function(fn, condition) {\n        condition = condition || function(menuItem) { return menuItem; };\n        var menuItem = this;\n        var lastMenuItem = null;\n        while (condition(menuItem)) {\n            fn(menuItem);\n            lastMenuItem = menuItem;\n            menuItem = menuItem.parentMenu.parentMenuItem;\n        }\n        return lastMenuItem;\n    },\n    blur: function() { this.setTabIndex(-1); },\n    doDispose: function() {\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n        if (this.childMenu) {\n            this.childMenu.doDispose();\n        }\n    },\n    focus: function() {\n        if (!this.parentMenu.get_displayed()) {\n            this.parentMenu.show();\n        }\n        this.setTabIndex(0);\n        this.container.focused = true;\n        this._anchor.focus();\n    },\n    get_highlighted: function() { return /(^|\\s)highlighted(\\s|$)/.test(this._anchor.className); },\n    getTabIndex: function() { return this._anchor.tabIndex; },\n    highlight: function(highlighting) {\n        if (highlighting) {\n            this.applyUp(function(menuItem) {\n                menuItem.parentMenu.parentMenuItem.highlight(true);\n            },\n            function(menuItem) {\n                return !menuItem.parentMenu.isStatic() && menuItem.parentMenu.parentMenuItem;\n            }\n        );\n            Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, 'highlighted');\n        }\n        else {\n            Sys.WebForms.Menu._domHelper.removeCssClass(this._anchor, 'highlighted');\n            this.setTabIndex(-1);\n        }\n    },\n    hover: function(hovering) {\n        if (hovering) {\n            var currentHoveredItem = this.container.hoveredMenuItem;\n            if (currentHoveredItem) {\n                currentHoveredItem.hover(false);\n            }\n            var currentFocusedItem = this.container.focusedMenuItem;\n            if (currentFocusedItem && currentFocusedItem !== this) {\n                currentFocusedItem.hover(false);\n            }\n            this.applyUp(function(menuItem) {\n                if (menuItem.childMenu && !menuItem.childMenu.get_displayed()) {\n                    menuItem.childMenu.show();\n                }\n            });\n            this.container.hoveredMenuItem = this;\n            this.highlight(true);\n        }\n        else {\n            var menuItem = this;\n            while (menuItem) {\n                menuItem.highlight(false);\n                if (menuItem.childMenu) {\n                    if (!menuItem.childMenu.isStatic()) {\n                        menuItem.childMenu.hide();\n                    }\n                }\n                menuItem = menuItem.parentMenu.parentMenuItem;\n            }\n        }\n    },\n    isSiblingOf: function(menuItem) { return menuItem.parentMenu === this.parentMenu; },\n    mouseout: function() {\n        var menuItem = this,\n            id = this.container.pendingMouseoutId,\n            disappearAfter = this.container.disappearAfter;\n        if (id) {\n            window.clearTimeout(id);\n        }\n        if (disappearAfter > -1) {\n            this.container.pendingMouseoutId =\n                window.setTimeout(function() { menuItem.hover(false); }, disappearAfter);\n        }\n    },\n    mouseover: function() {\n        var id = this.container.pendingMouseoutId;\n        if (id) {\n            window.clearTimeout(id);\n            this.container.pendingMouseoutId = null;\n        }\n        this.hover(true);\n        if (this.container.menu.get_focused()) {\n            this.container.navigateTo(this);\n        }\n    },\n    navigate: function(keyCode) {\n        switch (this.keyMap[keyCode]) {\n            case this.keyMap.next:\n                this.navigateNext();\n                break;\n            case this.keyMap.previous:\n                this.navigatePrevious();\n                break;\n            case this.keyMap.child:\n                this.navigateChild();\n                break;\n            case this.keyMap.parent:\n                this.navigateParent();\n                break;\n            case this.keyMap.tab:\n                this.navigateOut();\n                break;\n        }\n    },\n    navigateChild: function() {\n        var subMenu = this.childMenu;\n        if (subMenu) {\n            var firstChild = subMenu.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n        else {\n            if (this.container.orientation === 'horizontal') {\n                var nextItem = this.topLevelMenuItem.nextSibling || this.topLevelMenuItem.parentMenu.firstChild();\n                if (nextItem == this.topLevelMenuItem) {\n                    return;\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(nextItem);\n                if (nextItem.childMenu) {\n                    this.container.navigateTo(nextItem.childMenu.firstChild());\n                }\n            }\n        }\n    },\n    navigateNext: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var nextMenuItem = this.nextSibling;\n        if (!nextMenuItem && this.parentMenu.isRoot()) {\n            nextMenuItem = this.parentMenu.parentMenuItem;\n            if (nextMenuItem) {\n                nextMenuItem = nextMenuItem.nextSibling;\n            }\n        }\n        if (!nextMenuItem) {\n            nextMenuItem = this.parentMenu.firstChild();\n        }\n        if (nextMenuItem) {\n            this.container.navigateTo(nextMenuItem);\n        }\n    },\n    navigateOut: function() {\n        this.parentMenu.blur();\n    },\n    navigateParent: function() {\n        var parentMenu = this.parentMenu,\n            horizontal = this.container.orientation === 'horizontal';\n        if (!parentMenu) return;\n        if (horizontal && this.childMenu && parentMenu.isRoot()) {\n            this.navigateChild();\n            return;\n        }\n        if (parentMenu.parentMenuItem && !parentMenu.isRoot()) {\n            if (horizontal && this.parentMenu.depth === 2) {\n                var previousItem = this.parentMenu.parentMenuItem.previousSibling;\n                if (!previousItem) {\n                    previousItem = this.parentMenu.rootMenu.lastChild();\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(previousItem);\n                if (previousItem.childMenu) {\n                    this.container.navigateTo(previousItem.childMenu.firstChild());\n                }\n            }\n            else {\n                this.parentMenu.hide();\n            }\n        }\n    },\n    navigatePrevious: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var previousMenuItem = this.previousSibling;\n        if (previousMenuItem) {\n            var childMenu = previousMenuItem.childMenu;\n            if (childMenu && childMenu.isRoot()) {\n                previousMenuItem = childMenu.lastChild();\n            }\n        }\n        if (!previousMenuItem && this.parentMenu.isRoot()) {\n            previousMenuItem = this.parentMenu.parentMenuItem;\n        }\n        if (!previousMenuItem) {\n            previousMenuItem = this.parentMenu.lastChild();\n        }\n        if (previousMenuItem) {\n            this.container.navigateTo(previousMenuItem);\n        }\n    },\n    setTabIndex: function(index) { if (this._anchor) this._anchor.tabIndex = index; }\n};\nSys.WebForms.MenuItem._onmouseout = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseout();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.MenuItem._onmouseover = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseover();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.Menu._domHelper = {\n    addEvent: function(element, eventName, fn, useCapture) {\n        if (element.addEventListener) {\n            element.addEventListener(eventName, fn, !!useCapture);\n        }\n        else {\n            element['on' + eventName] = fn;\n        }\n    },\n    appendAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('append', element, name, value);\n    },\n    appendCssClass: function(element, value) {\n        this.updateClassName('append', element, name, value);\n    },\n    appendString: function(getString, setString, value) {\n        var currentValue = getString();\n        if (!currentValue) {\n            setString(value);\n            return;\n        }\n        var regex = this._regexes.getRegex('(^| )' + value + '($| )');\n        if (regex.test(currentValue)) {\n            return;\n        }\n        setString(currentValue + ' ' + value);\n    },\n    cancelEvent: function(e) {\n        var event = e || window.event;\n        if (event) {\n            event.cancelBubble = true;\n            if (event.stopPropagation) {\n                event.stopPropagation();\n            }\n        }\n    },\n    contains: function(ancestor, descendant) {\n        for (; descendant && (descendant !== ancestor); descendant = descendant.parentNode) { }\n        return !!descendant;\n    },\n    firstChild: function(element) {\n        var child = element.firstChild;\n        if (child && child.nodeType !== 1) {   \n            child = this.nextSibling(child);\n        }\n        return child;\n    },\n    getElement: function(elementOrId) { return typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId; },\n    getElementDirection: function(element) {\n        if (element) {\n            if (element.dir) {\n                return element.dir;\n            }\n            return this.getElementDirection(element.parentNode);\n        }\n        return \"ltr\";\n    },\n    getKeyCode: function(event) { return event.keyCode || event.charCode || 0; },\n    insertAfter: function(element, elementToInsert) {\n        var next = element.nextSibling;\n        if (next) {\n            element.parentNode.insertBefore(elementToInsert, next);\n        }\n        else if (element.parentNode) {\n            element.parentNode.appendChild(elementToInsert);\n        }\n    },\n    nextSibling: function(element) {\n        var sibling = element.nextSibling;\n        while (sibling) {\n            if (sibling.nodeType === 1) {   \n                return sibling;\n            }\n            sibling = sibling.nextSibling;\n        }\n    },\n    removeAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('remove', element, name, value);\n    },\n    removeCssClass: function(element, value) {\n        this.updateClassName('remove', element, name, value);\n    },\n    removeEvent: function(element, eventName, fn, useCapture) {\n        if (element.removeEventListener) {\n            element.removeEventListener(eventName, fn, !!useCapture);\n        }\n        else if (element.detachEvent) {\n            element.detachEvent('on' + eventName, fn)\n        }\n        element['on' + eventName] = null;\n    },\n    removeString: function(getString, setString, valueToRemove) {\n        var currentValue = getString();\n        if (currentValue) {\n            var regex = this._regexes.getRegex('(\\\\s|\\\\b)' + valueToRemove + '$|\\\\b' + valueToRemove + '\\\\s+');\n            setString(currentValue.replace(regex, ''));\n        }\n    },\n    setFloat: function(element, direction) {\n        element.style.styleFloat = direction;\n        element.style.cssFloat = direction;\n    },\n    updateAttributeValue: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.getAttribute(name);\n                },\n                function(newValue) {\n                    element.setAttribute(name, newValue);\n                },\n                value\n            );\n    },\n    updateClassName: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.className;\n                },\n                function(newValue) {\n                    element.className = newValue;\n                },\n                value\n            );\n    },\n    _regexes: {\n        getRegex: function(pattern) {\n            var regex = this[pattern];\n            if (!regex) {\n                this[pattern] = regex = new RegExp(pattern);\n            }\n            return regex;\n        }\n    }\n};\nSys.WebForms.Menu._elementObjectMapper = {\n    _computedId: 0,\n    _mappings: {},\n    _mappingIdName: 'Sys.WebForms.Menu.Mapping',\n    getMappedObject: function(element) {\n        var id = element[this._mappingIdName];\n        if (id) {\n            return this._mappings[this._mappingIdName + ':' + id];\n        }\n    },\n    map: function(element, theObject) {\n        var mappedObject = element[this._mappingIdName];\n        if (mappedObject === theObject) {\n            return;\n        }\n        var objectId = element[this._mappingIdName] || element.id || '%' + (++this._computedId); \n        element[this._mappingIdName] = objectId;\n        this._mappings[this._mappingIdName + ':' + objectId] = theObject;\n        theObject.mappingId = objectId;\n    }\n};\nSys.WebForms.Menu._keyboardMapping = new (function() {\n    var LEFT_ARROW = 37;\n    var UP_ARROW = 38;\n    var RIGHT_ARROW = 39;\n    var DOWN_ARROW = 40;\n    var TAB = 9;\n    var ESCAPE = 27;\n    this.vertical = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.vertical[DOWN_ARROW] = this.vertical.next;\n    this.vertical[UP_ARROW] = this.vertical.previous;\n    this.vertical[RIGHT_ARROW] = this.vertical.child;\n    this.vertical[LEFT_ARROW] = this.vertical.parent;\n    this.vertical[TAB] = this.vertical[ESCAPE] = this.vertical.tab;\n    this.verticalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.verticalRtl[DOWN_ARROW] = this.verticalRtl.next;\n    this.verticalRtl[UP_ARROW] = this.verticalRtl.previous;\n    this.verticalRtl[LEFT_ARROW] = this.verticalRtl.child;\n    this.verticalRtl[RIGHT_ARROW] = this.verticalRtl.parent;\n    this.verticalRtl[TAB] = this.verticalRtl[ESCAPE] = this.verticalRtl.tab;\n    this.horizontal = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontal[RIGHT_ARROW] = this.horizontal.next;\n    this.horizontal[LEFT_ARROW] = this.horizontal.previous;\n    this.horizontal[DOWN_ARROW] = this.horizontal.child;\n    this.horizontal[UP_ARROW] = this.horizontal.parent;\n    this.horizontal[TAB] = this.horizontal[ESCAPE] = this.horizontal.tab;\n    this.horizontalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontalRtl[RIGHT_ARROW] = this.horizontalRtl.previous;\n    this.horizontalRtl[LEFT_ARROW] = this.horizontalRtl.next;\n    this.horizontalRtl[DOWN_ARROW] = this.horizontalRtl.child;\n    this.horizontalRtl[UP_ARROW] = this.horizontalRtl.parent;\n    this.horizontalRtl[TAB] = this.horizontalRtl[ESCAPE] = this.horizontalRtl.tab;\n    this.horizontal.contains = this.horizontalRtl.contains = this.vertical.contains = this.verticalRtl.contains = function(keycode) {\n        return this[keycode] != null;\n    };\n})();\nSys.WebForms._MenuContainer = function(options) {\n    this.focused = false;\n    this.disabled = options.disabled;\n    this.staticDisplayLevels = options.staticDisplayLevels || 1;\n    this.element = options.element;\n    this.orientation = options.orientation || 'vertical';\n    this.disappearAfter = options.disappearAfter;\n    this.rightToLeft = Sys.WebForms.Menu._domHelper.getElementDirection(this.element) === 'rtl';\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    this.menu = options.menu;\n    this.menu.rootMenu = this.menu;\n    this.menu.displayMode = 'static';\n    this.menu.element.style.position = 'relative';\n    this.menu.element.style.width = 'auto';\n    if (this.orientation === 'vertical') {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menu');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n        }\n    }\n    else {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menubar');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontal;\n        }\n    }\n    var floatBreak = document.createElement('div');\n    floatBreak.style.clear = this.rightToLeft ? \"right\" : \"left\";\n    this.element.appendChild(floatBreak);\n    Sys.WebForms.Menu._domHelper.setFloat(this.element, this.rightToLeft ? \"right\" : \"left\");\n    Sys.WebForms.Menu._domHelper.insertAfter(this.element, floatBreak);\n    if (!this.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'focus', this._onfocus, true);\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'keydown', this._onkeydown);\n        var menuContainer = this;\n        this.element.dispose = function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose = null;\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'focus', menuContainer._onfocus, true);\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'keydown', menuContainer._onkeydown);\n                menuContainer.menu.doDispose();\n            }\n        };\n        Sys.WebForms.Menu._domHelper.addEvent(window, 'unload', function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose();\n            }\n        });\n    }\n};\nSys.WebForms._MenuContainer.prototype = {\n    blur: function() {\n        this.focused = false;\n        this.isBlurring = false;\n        this.menu.collapse();\n        this.focusedMenuItem = null;\n    },\n    focus: function(e) { this.focused = true; },\n    navigateTo: function(menuItem) {\n        if (this.focusedMenuItem && this.focusedMenuItem !== this) {\n            this.focusedMenuItem.highlight(false);\n        }\n        menuItem.highlight(true);\n        menuItem.focus();\n        this.focusedMenuItem = menuItem;\n    },\n    _onfocus: function(e) {\n        var event = e || window.event;\n        if (event.srcElement && this) {\n            if (Sys.WebForms.Menu._domHelper.contains(this.element, event.srcElement)) {\n                if (!this.focused) {\n                    this.focus();\n                }\n            }\n        }\n    },\n    _onkeydown: function(e) {\n        var thisMenu = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n        var keyCode = Sys.WebForms.Menu._domHelper.getKeyCode(e || window.event);\n        if (thisMenu) {\n            thisMenu.handleKeyPress(keyCode);\n        }\n    }\n};\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/SmartNav.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/SmartNav.js\nvar snSrc;\nif ((typeof(window.__smartNav) == \"undefined\") || (window.__smartNav == null))\n{\n    window.__smartNav = new Object();\n    window.__smartNav.update = function()\n    {\n        var sn = window.__smartNav;\n        var fd;\n        document.detachEvent(\"onstop\", sn.stopHif);\n        sn.inPost = false;\n        try { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        var fdr = fd.getElementsByTagName(\"asp_smartnav_rdir\");\n        if (fdr.length > 0)\n        {\n            if ((typeof(sn.sHif) == \"undefined\") || (sn.sHif == null))\n            {\n                sn.sHif = document.createElement(\"IFRAME\");\n                sn.sHif.name = \"__hifSmartNav\";\n                sn.sHif.style.display = \"none\";\n                sn.sHif.src = snSrc;\n            }\n            try {window.location = fdr[0].url;} catch (e) {};\n            return;\n        }\n        var fdurl = fd.location.href;\n        var index = fdurl.indexOf(snSrc);\n        if ((index != -1 && index == fdurl.length-snSrc.length)\n            || fdurl == \"about:blank\")\n            return;\n\t\tvar fdurlb = fdurl.split(\"?\")[0];\n\t\tif (document.location.href.indexOf(fdurlb) < 0)\n\t\t{\n            document.location.href=fdurl;\n\t\t    return;\n\t\t}\n\t\tsn._savedOnLoad = window.onload;\n\t\twindow.onload = null;\n\t\twindow.__smartNav.updateHelper();\n\t}\n\twindow.__smartNav.updateHelper = function()\n\t{\n\t\tif (document.readyState != \"complete\")\n\t\t{\n\t\t    window.setTimeout(window.__smartNav.updateHelper, 25);\n\t\t    return;\n\t\t}\n\t\twindow.__smartNav.loadNewContent();\n\t}\n\twindow.__smartNav.loadNewContent = function()\n\t{\n\t\tvar sn = window.__smartNav;\n\t\tvar fd;\n\t\ttry { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        if ((typeof(sn.sHif) != \"undefined\") && (sn.sHif != null))\n        {\n            sn.sHif.removeNode(true);\n            sn.sHif = null;\n        }\n        var hdm = document.getElementsByTagName(\"head\")[0];\n        var hk = hdm.childNodes;\n        var tt = null;\n        var i;\n        for (i = hk.length - 1; i>= 0; i--)\n        {\n            if (hk[i].tagName == \"TITLE\")\n            {\n                tt = hk[i].outerHTML;\n                continue;\n            }\n            if (hk[i].tagName != \"BASEFONT\" || hk[i].innerHTML.length == 0)\n                hdm.removeChild(hdm.childNodes[i]);\n        }\n        var kids = fd.getElementsByTagName(\"head\")[0].childNodes;\n        for (i = 0; i < kids.length; i++)\n        {\n            var tn = kids[i].tagName;\n            var k = document.createElement(tn);\n            k.id = kids[i].id;\n            k.mergeAttributes(kids[i]);\n            switch(tn)\n            {\n            case \"TITLE\":\n                if (tt == kids[i].outerHTML)\n                    continue;\n                k.innerText = kids[i].text;\n                hdm.insertAdjacentElement(\"afterbegin\", k);\n                continue;\n            case \"BASEFONT\" :\n                if (kids[i].innerHTML.length > 0)\n                    continue;\n                break;\n            default:\n                var o = document.createElement(\"BODY\");\n                o.innerHTML = \"<BODY>\" + kids[i].outerHTML + \"</BODY>\";\n                k = o.firstChild;\n                break;\n            }\n            if((typeof(k) != \"undefined\") && (k != null))\n                hdm.appendChild(k);\n        }\n        document.body.clearAttributes();\n        document.body.id = fd.body.id;\n        document.body.mergeAttributes(fd.body);\n        var newBodyLoad = fd.body.onload;\n        if ((typeof(newBodyLoad) != \"undefined\") && (newBodyLoad != null))\n            document.body.onload = newBodyLoad;\n        else\n            document.body.onload = sn._savedOnLoad;\n        var s = \"<BODY>\" + fd.body.innerHTML + \"</BODY>\";\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hifP = sn.hif.parentElement;\n            if ((typeof(hifP) != \"undefined\") && (hifP != null))\n                sn.sHif=hifP.removeChild(sn.hif);\n        }\n        document.body.innerHTML = s;\n        var sc = document.scripts;\n        for (i = 0; i < sc.length; i++)\n        {\n            sc[i].text = sc[i].text;\n        }\n        sn.hif = document.all(\"__hifSmartNav\");\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hif = sn.hif;\n            sn.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n            frames[\"__hifSmartNav\"].name = sn.hifName;\n            sn.hifDoc = hif.contentWindow.document;\n            if (sn.ie5)\n                hif.parentElement.removeChild(hif);\n            window.setTimeout(sn.restoreFocus,0);\n        }\n        if (typeof(window.onload) == \"string\")\n        {\n            try { eval(window.onload) } catch (e) {};\n        }\n        else if ((typeof(window.onload) != \"undefined\") && (window.onload != null))\n        {\n            try { window.onload() } catch (e) {};\n        }\n        sn._savedOnLoad = null;\n        sn.attachForm();\n    };\n    window.__smartNav.restoreFocus = function()\n    {\n        if (window.__smartNav.inPost == true) return;\n        var curAe = document.activeElement;\n        var sAeId = window.__smartNav.ae;\n        if (((typeof(sAeId) == \"undefined\") || (sAeId == null)) ||\n            (typeof(curAe) != \"undefined\") && (curAe != null) && (curAe.id == sAeId || curAe.name == sAeId))\n            return;\n        var ae = document.all(sAeId);\n        if ((typeof(ae) == \"undefined\") || (ae == null)) return;\n        try { ae.focus(); } catch(e){};\n    }\n    window.__smartNav.saveHistory = function()\n    {\n        if ((typeof(window.__smartNav.hif) != \"undefined\") && (window.__smartNav.hif != null))\n            window.__smartNav.hif.removeNode();\n        if ((typeof(window.__smartNav.sHif) != \"undefined\") && (window.__smartNav.sHif != null)\n            && (typeof(document.all[window.__smartNav.siHif]) != \"undefined\")\n            && (document.all[window.__smartNav.siHif] != null)) {\n            document.all[window.__smartNav.siHif].insertAdjacentElement(\n                        \"BeforeBegin\", window.__smartNav.sHif);\n        }\n    }\n    window.__smartNav.stopHif = function()\n    {\n        document.detachEvent(\"onstop\", window.__smartNav.stopHif);\n        var sn = window.__smartNav;\n        if (((typeof(sn.hifDoc) == \"undefined\") || (sn.hifDoc == null)) &&\n            (typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            try {sn.hifDoc = sn.hif.contentWindow.document;}\n            catch(e){sn.hifDoc=null}\n        }\n        if (sn.hifDoc != null)\n        {\n            try {sn.hifDoc.execCommand(\"stop\");} catch (e){}\n        }\n    }\n    window.__smartNav.init =  function()\n    {\n        var sn = window.__smartNav;\n        window.__smartNav.form.__smartNavPostBack.value = 'true';\n        document.detachEvent(\"onstop\", sn.stopHif);\n        document.attachEvent(\"onstop\", sn.stopHif);\n        try { if (window.event.returnValue == false) return; } catch(e) {}\n        sn.inPost = true;\n        if ((typeof(document.activeElement) != \"undefined\") && (document.activeElement != null))\n        {\n            var ae = document.activeElement.id;\n            if (ae.length == 0)\n                ae = document.activeElement.name;\n            sn.ae = ae;\n        }\n        else\n            sn.ae = null;\n        try {document.selection.empty();} catch (e) {}\n        if ((typeof(sn.hif) == \"undefined\") || (sn.hif == null))\n        {\n            sn.hif = document.all(\"__hifSmartNav\");\n            sn.hifDoc = sn.hif.contentWindow.document;\n        }\n        if ((typeof(sn.hifDoc) != \"undefined\") && (sn.hifDoc != null))\n            try {sn.hifDoc.designMode = \"On\";} catch(e){};\n        if ((typeof(sn.hif.parentElement) == \"undefined\") || (sn.hif.parentElement == null))\n            document.body.appendChild(sn.hif);\n        var hif = sn.hif;\n        hif.detachEvent(\"onload\", sn.update);\n        hif.attachEvent(\"onload\", sn.update);\n        window.__smartNav.fInit = true;\n    };\n    window.__smartNav.submit = function()\n    {\n        window.__smartNav.fInit = false;\n        try { window.__smartNav.init(); } catch(e) {}\n        if (window.__smartNav.fInit) {\n            window.__smartNav.form._submit();\n        }\n    };\n    window.__smartNav.attachForm = function()\n    {\n        var cf = document.forms;\n        for (var i=0; i<cf.length; i++)\n        {\n            if ((typeof(cf[i].__smartNavEnabled) != \"undefined\") && (cf[i].__smartNavEnabled != null))\n            {\n                window.__smartNav.form = cf[i];\n                window.__smartNav.form.insertAdjacentHTML(\"beforeEnd\", \"<input type='hidden' name='__smartNavPostBack' value='false' />\");\n                break;\n            }\n        }\n        var snfm = window.__smartNav.form;\n        if ((typeof(snfm) == \"undefined\") || (snfm == null)) return false;\n        var sft = snfm.target;\n        if (sft.length != 0 && sft.indexOf(\"__hifSmartNav\") != 0) return false;\n        var sfc = snfm.action.split(\"?\")[0];\n        var url = window.location.href.split(\"?\")[0];\n        if (url.charAt(url.length-1) != '/' && url.lastIndexOf(sfc) + sfc.length != url.length) return false;\n        if (snfm.__formAttached == true) return true;\n        snfm.__formAttached = true;\n        snfm.attachEvent(\"onsubmit\", window.__smartNav.init);\n        snfm._submit = snfm.submit;\n        snfm.submit = window.__smartNav.submit;\n        snfm.target = window.__smartNav.hifName;\n        return true;\n    };\n    window.__smartNav.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n    window.__smartNav.ie5 = navigator.appVersion.indexOf(\"MSIE 5\") > 0;\n    var rc = window.__smartNav.attachForm();\n    var hif = document.all(\"__hifSmartNav\");\n    if ((typeof(snSrc) == \"undefined\") || (snSrc == null)) {\n\t    if (typeof(window.dialogHeight) != \"undefined\") {\n\t            snSrc = \"IEsmartnav1\";\n\t\t    hif.src = snSrc;\n\t    } else {\n\t\t    snSrc = hif.src;\n\t    }\n    }\n    if (rc)\n    {\n        var fsn = frames[\"__hifSmartNav\"];\n        fsn.name = window.__smartNav.hifName;\n        window.__smartNav.siHif = hif.sourceIndex;\n        try {\n            if (fsn.document.location != snSrc)\n            {\n                fsn.document.designMode = \"On\";\n                hif.attachEvent(\"onload\",window.__smartNav.update);\n                window.__smartNav.hif = hif;\n            }\n        }\n        catch (e) { window.__smartNav.hif = hif; }\n        window.attachEvent(\"onbeforeunload\", window.__smartNav.saveHistory);\n    }\n    else\n        window.__smartNav = null;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/TreeView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/TreeView.js\nfunction TreeView_HoverNode(data, node) {\n    if (!data) {\n        return;\n    }\n    node.hoverClass = data.hoverClass;\n    WebForm_AppendToClassName(node, data.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n    WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n}\nfunction TreeView_GetNodeText(node) {\n    var trNode = WebForm_GetParentByTagName(node, \"TR\");\n    var outerNodes;\n    if (trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName) {\n        outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"A\");\n        if (!outerNodes || outerNodes.length == 0) {\n            outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"SPAN\");\n        }\n    }\n    var textNode = (outerNodes && outerNodes.length > 0) ?\n        outerNodes[0].childNodes[0] :\n        trNode.childNodes[trNode.childNodes.length - 1].childNodes[0];\n    return (textNode && textNode.nodeValue) ? textNode.nodeValue : \"\";\n}\nfunction TreeView_PopulateNode(data, index, node, selectNode, selectImageNode, lineType, text, path, databound, datapath, parentIsLast) {\n    if (!data) {\n        return;\n    }\n    var context = new Object();\n    context.data = data;\n    context.node = node;\n    context.selectNode = selectNode;\n    context.selectImageNode = selectImageNode;\n    context.lineType = lineType;\n    context.index = index;\n    context.isChecked = \"f\";\n    var tr = WebForm_GetParentByTagName(node, \"TR\");\n    if (tr) {\n        var checkbox = tr.getElementsByTagName(\"INPUT\");\n        if (checkbox && (checkbox.length > 0)) {\n            for (var i = 0; i < checkbox.length; i++) {\n                if (checkbox[i].type.toLowerCase() == \"checkbox\") {\n                    if (checkbox[i].checked) {\n                        context.isChecked = \"t\";\n                    }\n                    break;\n                }\n            }\n        }\n    }\n    var param = index + \"|\" + data.lastIndex + \"|\" + databound + context.isChecked + parentIsLast + \"|\" +\n        text.length + \"|\" + text + datapath.length + \"|\" + datapath + path;\n    TreeView_PopulateNodeDoCallBack(context, param);\n}\nfunction TreeView_ProcessNodeData(result, context) {\n    var treeNode = context.node;\n    if (result.length > 0) {\n        var ci =  result.indexOf(\"|\", 0);\n        context.data.lastIndex = result.substring(0, ci);\n        ci = result.indexOf(\"|\", ci + 1);\n        var newExpandState = result.substring(context.data.lastIndex.length + 1, ci);\n        context.data.expandState.value += newExpandState;\n        var chunk = result.substr(ci + 1);\n        var newChildren, table;\n        if (__nonMSDOMBrowser) {\n            var newDiv = document.createElement(\"div\");\n            newDiv.innerHTML = chunk;\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            newChildren = null;\n            if ((typeof(table.nextSibling) == \"undefined\") || (table.nextSibling == null)) {\n                table.parentNode.insertBefore(newDiv.firstChild, table.nextSibling);\n                newChildren = table.previousSibling;\n            }\n            else {\n                table = table.nextSibling;\n                table.parentNode.insertBefore(newDiv.firstChild, table);\n                newChildren = table.previousSibling;\n            }\n            newChildren = document.getElementById(treeNode.id + \"Nodes\");\n        }\n        else {\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            table.insertAdjacentHTML(\"afterEnd\", chunk);\n            newChildren = document.all[treeNode.id + \"Nodes\"];\n        }\n        if ((typeof(newChildren) != \"undefined\") && (newChildren != null)) {\n            TreeView_ToggleNode(context.data, context.index, treeNode, context.lineType, newChildren);\n            treeNode.href = document.getElementById ?\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",document.getElementById('\" + treeNode.id + \"'),'\" + context.lineType + \"',document.getElementById('\" + newChildren.id + \"'))\" :\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",\" + treeNode.id + \",'\" + context.lineType + \"',\" + newChildren.id + \")\";\n            if ((typeof(context.selectNode) != \"undefined\") && (context.selectNode != null) && context.selectNode.href &&\n                (context.selectNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectNode.href = treeNode.href;\n            }\n            if ((typeof(context.selectImageNode) != \"undefined\") && (context.selectImageNode != null) && context.selectNode.href &&\n                (context.selectImageNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectImageNode.href = treeNode.href;\n            }\n        }\n        context.data.populateLog.value += context.index + \",\";\n    }\n    else {\n        var img = treeNode.childNodes ? treeNode.childNodes[0] : treeNode.children[0];\n        if ((typeof(img) != \"undefined\") && (img != null)) {\n            var lineType = context.lineType;\n            if (lineType == \"l\") {\n                img.src = context.data.images[13];\n            }\n            else if (lineType == \"t\") {\n                img.src = context.data.images[10];\n            }\n            else if (lineType == \"-\") {\n                img.src = context.data.images[16];\n            }\n            else {\n                img.src = context.data.images[3];\n            }\n            var pe;\n            if (__nonMSDOMBrowser) {\n                pe = treeNode.parentNode;\n                pe.insertBefore(img, treeNode);\n                pe.removeChild(treeNode);\n            }\n            else {\n                pe = treeNode.parentElement;\n                treeNode.style.visibility=\"hidden\";\n                treeNode.style.display=\"none\";\n                pe.insertAdjacentElement(\"afterBegin\", img);\n            }\n        }\n    }\n}\nfunction TreeView_SelectNode(data, node, nodeId) {\n    if (!data) {\n        return;\n    }\n    if ((typeof(data.selectedClass) != \"undefined\") && (data.selectedClass != null)) {\n        var id = data.selectedNodeID.value;\n        if (id.length > 0) {\n            var selectedNode = document.getElementById(id);\n            if ((typeof(selectedNode) != \"undefined\") && (selectedNode != null)) {\n                WebForm_RemoveClassName(selectedNode, data.selectedHyperLinkClass);\n                selectedNode = WebForm_GetParentByTagName(selectedNode, \"TD\");\n                WebForm_RemoveClassName(selectedNode, data.selectedClass);\n            }\n        }\n        WebForm_AppendToClassName(node, data.selectedHyperLinkClass);\n        node = WebForm_GetParentByTagName(node, \"TD\");\n        WebForm_AppendToClassName(node, data.selectedClass)\n    }\n    data.selectedNodeID.value = nodeId;\n}\nfunction TreeView_ToggleNode(data, index, node, lineType, children) {\n    if (!data) {\n        return;\n    }\n    var img = node.childNodes[0];\n    var newExpandState;\n    try {\n        if (children.style.display == \"none\") {\n            children.style.display = \"block\";\n            newExpandState = \"e\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[15];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[12];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[18];\n                }\n                else {\n                    img.src = data.images[5];\n                }\n                img.alt = data.collapseToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n        else {\n            children.style.display = \"none\";\n            newExpandState = \"c\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[14];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[11];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[17];\n                }\n                else {\n                    img.src = data.images[4];\n                }\n                img.alt = data.expandToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n    }\n    catch(e) {}\n    data.expandState.value =  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);\n}\nfunction TreeView_UnhoverNode(node) {\n    if (!node.hoverClass) {\n        return;\n    }\n    WebForm_RemoveClassName(node, node.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {\n    this.eventTarget = eventTarget;\n    this.eventArgument = eventArgument;\n    this.validation = validation;\n    this.validationGroup = validationGroup;\n    this.actionUrl = actionUrl;\n    this.trackFocus = trackFocus;\n    this.clientSubmit = clientSubmit;\n}\nfunction WebForm_DoPostBackWithOptions(options) {\n    var validationResult = true;\n    if (options.validation) {\n        if (typeof(Page_ClientValidate) == 'function') {\n            validationResult = Page_ClientValidate(options.validationGroup);\n        }\n    }\n    if (validationResult) {\n        if ((typeof(options.actionUrl) != \"undefined\") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {\n            theForm.action = options.actionUrl;\n        }\n        if (options.trackFocus) {\n            var lastFocus = theForm.elements[\"__LASTFOCUS\"];\n            if ((typeof(lastFocus) != \"undefined\") && (lastFocus != null)) {\n                if (typeof(document.activeElement) == \"undefined\") {\n                    lastFocus.value = options.eventTarget;\n                }\n                else {\n                    var active = document.activeElement;\n                    if ((typeof(active) != \"undefined\") && (active != null)) {\n                        if ((typeof(active.id) != \"undefined\") && (active.id != null) && (active.id.length > 0)) {\n                            lastFocus.value = active.id;\n                        }\n                        else if (typeof(active.name) != \"undefined\") {\n                            lastFocus.value = active.name;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if (options.clientSubmit) {\n        __doPostBack(options.eventTarget, options.eventArgument);\n    }\n}\nvar __pendingCallbacks = new Array();\nvar __synchronousCallBackIndex = -1;\nfunction WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {\n    var postData = __theFormPostData +\n                \"__CALLBACKID=\" + WebForm_EncodeCallback(eventTarget) +\n                \"&__CALLBACKPARAM=\" + WebForm_EncodeCallback(eventArgument);\n    if (theForm[\"__EVENTVALIDATION\"]) {\n        postData += \"&__EVENTVALIDATION=\" + WebForm_EncodeCallback(theForm[\"__EVENTVALIDATION\"].value);\n    }\n    var xmlRequest,e;\n    try {\n        xmlRequest = new XMLHttpRequest();\n    }\n    catch(e) {\n        try {\n            xmlRequest = new ActiveXObject(\"Microsoft.XMLHTTP\");\n        }\n        catch(e) {\n        }\n    }\n    var setRequestHeaderMethodExists = true;\n    try {\n        setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);\n    }\n    catch(e) {}\n    var callback = new Object();\n    callback.eventCallback = eventCallback;\n    callback.context = context;\n    callback.errorCallback = errorCallback;\n    callback.async = useAsync;\n    var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);\n    if (!useAsync) {\n        if (__synchronousCallBackIndex != -1) {\n            __pendingCallbacks[__synchronousCallBackIndex] = null;\n        }\n        __synchronousCallBackIndex = callbackIndex;\n    }\n    if (setRequestHeaderMethodExists) {\n        xmlRequest.onreadystatechange = WebForm_CallbackComplete;\n        callback.xmlRequest = xmlRequest;\n        // e.g. http:\n        var action = theForm.action || document.location.pathname, fragmentIndex = action.indexOf('#');\n        if (fragmentIndex !== -1) {\n            action = action.substr(0, fragmentIndex);\n        }\n        if (!__nonMSDOMBrowser) {\n            var queryIndex = action.indexOf('?');\n            if (queryIndex !== -1) {\n                var path = action.substr(0, queryIndex);\n                if (path.indexOf(\"%\") === -1) {\n                    action = encodeURI(path) + action.substr(queryIndex);\n                }\n            }\n            else if (action.indexOf(\"%\") === -1) {\n                action = encodeURI(action);\n            }\n        }\n        xmlRequest.open(\"POST\", action, true);\n        xmlRequest.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded; charset=utf-8\");\n        xmlRequest.send(postData);\n        return;\n    }\n    callback.xmlRequest = new Object();\n    var callbackFrameID = \"__CALLBACKFRAME\" + callbackIndex;\n    var xmlRequestFrame = document.frames[callbackFrameID];\n    if (!xmlRequestFrame) {\n        xmlRequestFrame = document.createElement(\"IFRAME\");\n        xmlRequestFrame.width = \"1\";\n        xmlRequestFrame.height = \"1\";\n        xmlRequestFrame.frameBorder = \"0\";\n        xmlRequestFrame.id = callbackFrameID;\n        xmlRequestFrame.name = callbackFrameID;\n        xmlRequestFrame.style.position = \"absolute\";\n        xmlRequestFrame.style.top = \"-100px\"\n        xmlRequestFrame.style.left = \"-100px\";\n        try {\n            if (callBackFrameUrl) {\n                xmlRequestFrame.src = callBackFrameUrl;\n            }\n        }\n        catch(e) {}\n        document.body.appendChild(xmlRequestFrame);\n    }\n    var interval = window.setInterval(function() {\n        xmlRequestFrame = document.frames[callbackFrameID];\n        if (xmlRequestFrame && xmlRequestFrame.document) {\n            window.clearInterval(interval);\n            xmlRequestFrame.document.write(\"\");\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.write('<html><body><form method=\"post\"><input type=\"hidden\" name=\"__CALLBACKLOADSCRIPT\" value=\"t\"></form></body></html>');\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.forms[0].action = theForm.action;\n            var count = __theFormPostCollection.length;\n            var element;\n            for (var i = 0; i < count; i++) {\n                element = __theFormPostCollection[i];\n                if (element) {\n                    var fieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                    fieldElement.type = \"hidden\";\n                    fieldElement.name = element.name;\n                    fieldElement.value = element.value;\n                    xmlRequestFrame.document.forms[0].appendChild(fieldElement);\n                }\n            }\n            var callbackIdFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIdFieldElement.type = \"hidden\";\n            callbackIdFieldElement.name = \"__CALLBACKID\";\n            callbackIdFieldElement.value = eventTarget;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);\n            var callbackParamFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackParamFieldElement.type = \"hidden\";\n            callbackParamFieldElement.name = \"__CALLBACKPARAM\";\n            callbackParamFieldElement.value = eventArgument;\n            xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);\n            if (theForm[\"__EVENTVALIDATION\"]) {\n                var callbackValidationFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                callbackValidationFieldElement.type = \"hidden\";\n                callbackValidationFieldElement.name = \"__EVENTVALIDATION\";\n                callbackValidationFieldElement.value = theForm[\"__EVENTVALIDATION\"].value;\n                xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement);\n            }\n            var callbackIndexFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIndexFieldElement.type = \"hidden\";\n            callbackIndexFieldElement.name = \"__CALLBACKINDEX\";\n            callbackIndexFieldElement.value = callbackIndex;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement);\n            xmlRequestFrame.document.forms[0].submit();\n        }\n    }, 10);\n}\nfunction WebForm_CallbackComplete() {\n    for (var i = 0; i < __pendingCallbacks.length; i++) {\n        callbackObject = __pendingCallbacks[i];\n        if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {\n            if (!__pendingCallbacks[i].async) {\n                __synchronousCallBackIndex = -1;\n            }\n            __pendingCallbacks[i] = null;\n            var callbackFrameID = \"__CALLBACKFRAME\" + i;\n            var xmlRequestFrame = document.getElementById(callbackFrameID);\n            if (xmlRequestFrame) {\n                xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);\n            }\n            WebForm_ExecuteCallback(callbackObject);\n        }\n    }\n}\nfunction WebForm_ExecuteCallback(callbackObject) {\n    var response = callbackObject.xmlRequest.responseText;\n    if (response.charAt(0) == \"s\") {\n        if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n            callbackObject.eventCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else if (response.charAt(0) == \"e\") {\n        if ((typeof(callbackObject.errorCallback) != \"undefined\") && (callbackObject.errorCallback != null)) {\n            callbackObject.errorCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else {\n        var separatorIndex = response.indexOf(\"|\");\n        if (separatorIndex != -1) {\n            var validationFieldLength = parseInt(response.substring(0, separatorIndex));\n            if (!isNaN(validationFieldLength)) {\n                var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);\n                if (validationField != \"\") {\n                    var validationFieldElement = theForm[\"__EVENTVALIDATION\"];\n                    if (!validationFieldElement) {\n                        validationFieldElement = document.createElement(\"INPUT\");\n                        validationFieldElement.type = \"hidden\";\n                        validationFieldElement.name = \"__EVENTVALIDATION\";\n                        theForm.appendChild(validationFieldElement);\n                    }\n                    validationFieldElement.value = validationField;\n                }\n                if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n                    callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);\n                }\n            }\n        }\n    }\n}\nfunction WebForm_FillFirstAvailableSlot(array, element) {\n    var i;\n    for (i = 0; i < array.length; i++) {\n        if (!array[i]) break;\n    }\n    array[i] = element;\n    return i;\n}\nvar __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);\nvar __theFormPostData = \"\";\nvar __theFormPostCollection = new Array();\nvar __callbackTextTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction WebForm_InitCallback() {\n    var formElements = theForm.elements,\n        count = formElements.length,\n        element;\n    for (var i = 0; i < count; i++) {\n        element = formElements[i];\n        var tagName = element.tagName.toLowerCase();\n        if (tagName == \"input\") {\n            var type = element.type;\n            if ((__callbackTextTypes.test(type) || ((type == \"checkbox\" || type == \"radio\") && element.checked))\n                && (element.id != \"__EVENTVALIDATION\")) {\n                WebForm_InitCallbackAddField(element.name, element.value);\n            }\n        }\n        else if (tagName == \"select\") {\n            var selectCount = element.options.length;\n            for (var j = 0; j < selectCount; j++) {\n                var selectChild = element.options[j];\n                if (selectChild.selected == true) {\n                    WebForm_InitCallbackAddField(element.name, element.value);\n                }\n            }\n        }\n        else if (tagName == \"textarea\") {\n            WebForm_InitCallbackAddField(element.name, element.value);\n        }\n    }\n}\nfunction WebForm_InitCallbackAddField(name, value) {\n    var nameValue = new Object();\n    nameValue.name = name;\n    nameValue.value = value;\n    __theFormPostCollection[__theFormPostCollection.length] = nameValue;\n    __theFormPostData += WebForm_EncodeCallback(name) + \"=\" + WebForm_EncodeCallback(value) + \"&\";\n}\nfunction WebForm_EncodeCallback(parameter) {\n    if (encodeURIComponent) {\n        return encodeURIComponent(parameter);\n    }\n    else {\n        return escape(parameter);\n    }\n}\nvar __disabledControlArray = new Array();\nfunction WebForm_ReEnableControls() {\n    if (typeof(__enabledControlArray) == 'undefined') {\n        return false;\n    }\n    var disabledIndex = 0;\n    for (var i = 0; i < __enabledControlArray.length; i++) {\n        var c;\n        if (__nonMSDOMBrowser) {\n            c = document.getElementById(__enabledControlArray[i]);\n        }\n        else {\n            c = document.all[__enabledControlArray[i]];\n        }\n        if ((typeof(c) != \"undefined\") && (c != null) && (c.disabled == true)) {\n            c.disabled = false;\n            __disabledControlArray[disabledIndex++] = c;\n        }\n    }\n    setTimeout(\"WebForm_ReDisableControls()\", 0);\n    return true;\n}\nfunction WebForm_ReDisableControls() {\n    for (var i = 0; i < __disabledControlArray.length; i++) {\n        __disabledControlArray[i].disabled = true;\n    }\n}\nfunction WebForm_SimulateClick(element, event) {\n    var clickEvent;\n    if (element) {\n        if (element.click) {\n            element.click();\n        } else { \n            clickEvent = document.createEvent(\"MouseEvents\");\n            clickEvent.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n            if (!element.dispatchEvent(clickEvent)) {\n                return true;\n            }\n        }\n        event.cancelBubble = true;\n        if (event.stopPropagation) {\n            event.stopPropagation();\n        }\n        return false;\n    }\n    return true;\n}\nfunction WebForm_FireDefaultButton(event, target) {\n    if (event.keyCode == 13) {\n        var src = event.srcElement || event.target;\n        if (src &&\n            ((src.tagName.toLowerCase() == \"input\") &&\n             (src.type.toLowerCase() == \"submit\" || src.type.toLowerCase() == \"button\")) ||\n            ((src.tagName.toLowerCase() == \"a\") &&\n             (src.href != null) && (src.href != \"\")) ||\n            (src.tagName.toLowerCase() == \"textarea\")) {\n            return true;\n        }\n        var defaultButton;\n        if (__nonMSDOMBrowser) {\n            defaultButton = document.getElementById(target);\n        }\n        else {\n            defaultButton = document.all[target];\n        }\n        if (defaultButton) {\n            return WebForm_SimulateClick(defaultButton, event);\n        } \n    }\n    return true;\n}\nfunction WebForm_GetScrollX() {\n    if (__nonMSDOMBrowser) {\n        return window.pageXOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollLeft) {\n            return document.documentElement.scrollLeft;\n        }\n        else if (document.body) {\n            return document.body.scrollLeft;\n        }\n    }\n    return 0;\n}\nfunction WebForm_GetScrollY() {\n    if (__nonMSDOMBrowser) {\n        return window.pageYOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollTop) {\n            return document.documentElement.scrollTop;\n        }\n        else if (document.body) {\n            return document.body.scrollTop;\n        }\n    }\n    return 0;\n}\nfunction WebForm_SaveScrollPositionSubmit() {\n    if (__nonMSDOMBrowser) {\n        theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset;\n        theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset;\n    }\n    else {\n        theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n        theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    }\n    if ((typeof(this.oldSubmit) != \"undefined\") && (this.oldSubmit != null)) {\n        return this.oldSubmit();\n    }\n    return true;\n}\nfunction WebForm_SaveScrollPositionOnSubmit() {\n    theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n    theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    if ((typeof(this.oldOnSubmit) != \"undefined\") && (this.oldOnSubmit != null)) {\n        return this.oldOnSubmit();\n    }\n    return true;\n}\nfunction WebForm_RestoreScrollPosition() {\n    if (__nonMSDOMBrowser) {\n        window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value);\n    }\n    else {\n        window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value);\n    }\n    if ((typeof(theForm.oldOnLoad) != \"undefined\") && (theForm.oldOnLoad != null)) {\n        return theForm.oldOnLoad();\n    }\n    return true;\n}\nfunction WebForm_TextBoxKeyHandler(event) {\n    if (event.keyCode == 13) {\n        var target;\n        if (__nonMSDOMBrowser) {\n            target = event.target;\n        }\n        else {\n            target = event.srcElement;\n        }\n        if ((typeof(target) != \"undefined\") && (target != null)) {\n            if (typeof(target.onchange) != \"undefined\") {\n                target.onchange();\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction WebForm_TrimString(value) {\n    return value.replace(/^\\s+|\\s+$/g, '')\n}\nfunction WebForm_AppendToClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index === -1) {\n        element.className = (element.className === '') ? className : element.className + ' ' + className;\n    }\n}\nfunction WebForm_RemoveClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index >= 0) {\n        element.className = WebForm_TrimString(currentClassName.substring(0, index) + ' ' +\n            currentClassName.substring(index + className.length + 1, currentClassName.length));\n    }\n}\nfunction WebForm_GetElementById(elementId) {\n    if (document.getElementById) {\n        return document.getElementById(elementId);\n    }\n    else if (document.all) {\n        return document.all[elementId];\n    }\n    else return null;\n}\nfunction WebForm_GetElementByTagName(element, tagName) {\n    var elements = WebForm_GetElementsByTagName(element, tagName);\n    if (elements && elements.length > 0) {\n        return elements[0];\n    }\n    else return null;\n}\nfunction WebForm_GetElementsByTagName(element, tagName) {\n    if (element && tagName) {\n        if (element.getElementsByTagName) {\n            return element.getElementsByTagName(tagName);\n        }\n        if (element.all && element.all.tags) {\n            return element.all.tags(tagName);\n        }\n    }\n    return null;\n}\nfunction WebForm_GetElementDir(element) {\n    if (element) {\n        if (element.dir) {\n            return element.dir;\n        }\n        return WebForm_GetElementDir(element.parentNode);\n    }\n    return \"ltr\";\n}\nfunction WebForm_GetElementPosition(element) {\n    var result = new Object();\n    result.x = 0;\n    result.y = 0;\n    result.width = 0;\n    result.height = 0;\n    if (element.offsetParent) {\n        result.x = element.offsetLeft;\n        result.y = element.offsetTop;\n        var parent = element.offsetParent;\n        while (parent) {\n            result.x += parent.offsetLeft;\n            result.y += parent.offsetTop;\n            var parentTagName = parent.tagName.toLowerCase();\n            if (parentTagName != \"table\" &&\n                parentTagName != \"body\" && \n                parentTagName != \"html\" && \n                parentTagName != \"div\" && \n                parent.clientTop && \n                parent.clientLeft) {\n                result.x += parent.clientLeft;\n                result.y += parent.clientTop;\n            }\n            parent = parent.offsetParent;\n        }\n    }\n    else if (element.left && element.top) {\n        result.x = element.left;\n        result.y = element.top;\n    }\n    else {\n        if (element.x) {\n            result.x = element.x;\n        }\n        if (element.y) {\n            result.y = element.y;\n        }\n    }\n    if (element.offsetWidth && element.offsetHeight) {\n        result.width = element.offsetWidth;\n        result.height = element.offsetHeight;\n    }\n    else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {\n        result.width = element.style.pixelWidth;\n        result.height = element.style.pixelHeight;\n    }\n    return result;\n}\nfunction WebForm_GetParentByTagName(element, tagName) {\n    var parent = element.parentNode;\n    var upperTagName = tagName.toUpperCase();\n    while (parent && (parent.tagName.toUpperCase() != upperTagName)) {\n        parent = parent.parentNode ? parent.parentNode : parent.parentElement;\n    }\n    return parent;\n}\nfunction WebForm_SetElementHeight(element, height) {\n    if (element && element.style) {\n        element.style.height = height + \"px\";\n    }\n}\nfunction WebForm_SetElementWidth(element, width) {\n    if (element && element.style) {\n        element.style.width = width + \"px\";\n    }\n}\nfunction WebForm_SetElementX(element, x) {\n    if (element && element.style) {\n        element.style.left = x + \"px\";\n    }\n}\nfunction WebForm_SetElementY(element, y) {\n    if (element && element.style) {\n        element.style.top = y + \"px\";\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebParts.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebParts.js\nvar __wpm = null;\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\nfunction __wpTranslateOffset(x, y, offsetElement, relativeToElement, includeScroll) {\n    while ((typeof(offsetElement) != \"undefined\") && (offsetElement != null) && (offsetElement != relativeToElement)) {\n        x += offsetElement.offsetLeft;\n        y += offsetElement.offsetTop;\n        var tagName = offsetElement.tagName;\n        if ((tagName != \"TABLE\") && (tagName != \"BODY\")) {\n            x += offsetElement.clientLeft;\n            y += offsetElement.clientTop;\n        }\n        if (includeScroll && (tagName != \"BODY\")) {\n            x -= offsetElement.scrollLeft;\n            y -= offsetElement.scrollTop;\n        }\n        offsetElement = offsetElement.offsetParent;\n    }\n    return new Point(x, y);\n}\nfunction __wpGetPageEventLocation(event, includeScroll) {\n    if ((typeof(event) == \"undefined\") || (event == null)) {\n        event = window.event;\n    }\n    return __wpTranslateOffset(event.offsetX, event.offsetY, event.srcElement, null, includeScroll);\n}\nfunction __wpClearSelection() {\n    document.selection.empty();\n}\nfunction WebPart(webPartElement, webPartTitleElement, zone, zoneIndex, allowZoneChange) {\n    this.webPartElement = webPartElement;\n    this.allowZoneChange = allowZoneChange;\n    this.zone = zone;\n    this.zoneIndex = zoneIndex;\n    this.title = ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) ?\n        webPartTitleElement.innerText : \"\";\n    webPartElement.__webPart = this;\n    if ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) {\n        webPartTitleElement.style.cursor = \"move\";\n        webPartTitleElement.attachEvent(\"onmousedown\", WebPart_OnMouseDown);\n        webPartElement.attachEvent(\"ondragstart\", WebPart_OnDragStart);\n        webPartElement.attachEvent(\"ondrag\", WebPart_OnDrag);\n        webPartElement.attachEvent(\"ondragend\", WebPart_OnDragEnd);\n    }\n    this.UpdatePosition = WebPart_UpdatePosition;\n    this.Dispose = WebPart_Dispose;\n}\nfunction WebPart_Dispose() {\n    this.webPartElement.__webPart = null    \n}\nfunction WebPart_OnMouseDown() {\n    var currentEvent = window.event;\n    var draggedWebPart = WebPart_GetParentWebPartElement(currentEvent.srcElement);\n    if ((typeof(draggedWebPart) == \"undefined\") || (draggedWebPart == null)) {\n        return;\n    }\n    document.selection.empty();\n    try {\n        __wpm.draggedWebPart = draggedWebPart;\n        __wpm.DragDrop();\n    }\n    catch (e) {\n        __wpm.draggedWebPart = draggedWebPart;\n        window.setTimeout(\"__wpm.DragDrop()\", 0);\n    }\n    currentEvent.returnValue = false;\n    currentEvent.cancelBubble = true;\n}\nfunction WebPart_OnDragStart() {\n    var currentEvent = window.event;\n    var webPartElement = currentEvent.srcElement;\n    if ((typeof(webPartElement.__webPart) == \"undefined\") || (webPartElement.__webPart == null)) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n        return;\n    }\n    var dataObject = currentEvent.dataTransfer;\n    dataObject.effectAllowed = __wpm.InitiateWebPartDragDrop(webPartElement);\n}\nfunction WebPart_OnDrag() {\n    __wpm.ContinueWebPartDragDrop();\n}\nfunction WebPart_OnDragEnd() {\n    __wpm.CompleteWebPartDragDrop();\n}\nfunction WebPart_GetParentWebPartElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__webPart) == \"undefined\") || (elem.__webPart == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction WebPart_UpdatePosition() {\n    var location = __wpTranslateOffset(0, 0, this.webPartElement, null, false);\n    this.middleX = location.x + this.webPartElement.offsetWidth / 2;\n    this.middleY = location.y + this.webPartElement.offsetHeight / 2;\n}\nfunction Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var webPartTable = null;\n    if (zoneElement.rows.length == 1) {\n        webPartTableContainer = zoneElement.rows[0].cells[0];\n    }\n    else {\n        webPartTableContainer = zoneElement.rows[1].cells[0];\n    }\n    var i;\n    for (i = 0; i < webPartTableContainer.childNodes.length; i++) {\n        var node = webPartTableContainer.childNodes[i];\n        if (node.tagName == \"TABLE\") {\n            webPartTable = node;\n            break;\n        }\n    }\n    this.zoneElement = zoneElement;\n    this.zoneIndex = zoneIndex;\n    this.webParts = new Array();\n    this.uniqueID = uniqueID;\n    this.isVertical = isVertical;\n    this.allowLayoutChange = allowLayoutChange;\n    this.allowDrop = false;\n    this.webPartTable = webPartTable;\n    this.highlightColor = highlightColor;\n    this.savedBorderColor = (webPartTable != null) ? webPartTable.style.borderColor : null;\n    this.dropCueElements = new Array();\n    if (webPartTable != null) {\n        if (isVertical) {\n            for (i = 0; i < webPartTable.rows.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[i].cells[0].childNodes[0];\n            }\n        }\n        else {\n            for (i = 0; i < webPartTable.rows[0].cells.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[0].cells[i].childNodes[0];\n            }\n        }\n    }\n    this.AddWebPart = Zone_AddWebPart;\n    this.GetWebPartIndex = Zone_GetWebPartIndex;\n    this.ToggleDropCues = Zone_ToggleDropCues;\n    this.UpdatePosition = Zone_UpdatePosition;\n    this.Dispose = Zone_Dispose;\n    webPartTable.__zone = this;\n    webPartTable.attachEvent(\"ondragenter\", Zone_OnDragEnter);\n    webPartTable.attachEvent(\"ondrop\", Zone_OnDrop);\n}\nfunction Zone_Dispose() {\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].Dispose();\n    }\n    this.webPartTable.__zone = null;\n}\nfunction Zone_OnDragEnter() {\n    var handled = __wpm.ProcessWebPartDragEnter();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDragOver() {\n    var handled = __wpm.ProcessWebPartDragOver();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDrop() {\n    var handled = __wpm.ProcessWebPartDrop();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_GetParentZoneElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__zone) == \"undefined\") || (elem.__zone == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction Zone_AddWebPart(webPartElement, webPartTitleElement, allowZoneChange) {\n    var webPart = null;\n    var zoneIndex = this.webParts.length;\n    if (this.allowLayoutChange && __wpm.IsDragDropEnabled()) {\n        webPart = new WebPart(webPartElement, webPartTitleElement, this, zoneIndex, allowZoneChange);\n    }\n    else {\n        webPart = new WebPart(webPartElement, null, this, zoneIndex, allowZoneChange);\n    }\n    this.webParts[zoneIndex] = webPart;\n    return webPart;\n}\nfunction Zone_ToggleDropCues(show, index, ignoreOutline) {\n    if (ignoreOutline == false) {\n        this.webPartTable.style.borderColor = (show ? this.highlightColor : this.savedBorderColor);\n    }\n    if (index == -1) {\n        return;\n    }\n    var dropCue = this.dropCueElements[index];\n    if (dropCue && dropCue.style) {\n        if (dropCue.style.height == \"100%\" && !dropCue.webPartZoneHorizontalCueResized) {\n            var oldParentHeight = dropCue.parentElement.clientHeight;\n            var realHeight = oldParentHeight - 10;\n            dropCue.style.height = realHeight + \"px\";\n            var dropCueVerticalBar = dropCue.getElementsByTagName(\"DIV\")[0];\n            if (dropCueVerticalBar && dropCueVerticalBar.style) {\n                dropCueVerticalBar.style.height = dropCue.style.height;\n                var heightDiff = (dropCue.parentElement.clientHeight - oldParentHeight);\n                if (heightDiff) {\n                    dropCue.style.height = (realHeight - heightDiff) + \"px\";\n                    dropCueVerticalBar.style.height = dropCue.style.height;\n                }\n            }\n            dropCue.webPartZoneHorizontalCueResized = true;\n        }\n        dropCue.style.visibility = (show ? \"visible\" : \"hidden\");\n    }\n}\nfunction Zone_GetWebPartIndex(location) {\n    var x = location.x;\n    var y = location.y;\n    if ((x < this.webPartTableLeft) || (x > this.webPartTableRight) ||\n        (y < this.webPartTableTop) || (y > this.webPartTableBottom)) {\n        return -1;\n    }\n    var vertical = this.isVertical;\n    var webParts = this.webParts;\n    var webPartsCount = webParts.length;\n    for (var i = 0; i < webPartsCount; i++) {\n        var webPart = webParts[i];\n        if (vertical) {\n            if (y < webPart.middleY) {\n                return i;\n            }\n        }\n        else {\n            if (x < webPart.middleX) {\n                return i;\n            }\n        }\n    }\n    return webPartsCount;\n}\nfunction Zone_UpdatePosition() {\n    var topLeft = __wpTranslateOffset(0, 0, this.webPartTable, null, false);\n    this.webPartTableLeft = topLeft.x;\n    this.webPartTableTop = topLeft.y;\n    this.webPartTableRight = (this.webPartTable != null) ? topLeft.x + this.webPartTable.offsetWidth : topLeft.x;\n    this.webPartTableBottom = (this.webPartTable != null) ? topLeft.y + this.webPartTable.offsetHeight : topLeft.y;\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].UpdatePosition();\n    }\n}\nfunction WebPartDragState(webPartElement, effect) {\n    this.webPartElement = webPartElement;\n    this.dropZoneElement = null;\n    this.dropIndex = -1;\n    this.effect = effect;\n    this.dropped = false;\n}\nfunction WebPartMenu(menuLabelElement, menuDropDownElement, menuElement) {\n    this.menuLabelElement = menuLabelElement;\n    this.menuDropDownElement = menuDropDownElement;\n    this.menuElement = menuElement;\n    this.menuLabelElement.__menu = this;\n    this.menuLabelElement.attachEvent('onclick', WebPartMenu_OnClick);\n    this.menuLabelElement.attachEvent('onkeypress', WebPartMenu_OnKeyPress);\n    this.menuLabelElement.attachEvent('onmouseenter', WebPartMenu_OnMouseEnter);\n    this.menuLabelElement.attachEvent('onmouseleave', WebPartMenu_OnMouseLeave);\n    if ((typeof(this.menuDropDownElement) != \"undefined\") && (this.menuDropDownElement != null)) {\n        this.menuDropDownElement.__menu = this;\n    }\n    this.menuItemStyle = \"\";\n    this.menuItemHoverStyle = \"\";\n    this.popup = null;\n    this.hoverClassName = \"\";\n    this.hoverColor = \"\";\n    this.oldColor = this.menuLabelElement.style.color;\n    this.oldTextDecoration = this.menuLabelElement.style.textDecoration;\n    this.oldClassName = this.menuLabelElement.className;\n    this.Show = WebPartMenu_Show;\n    this.Hide = WebPartMenu_Hide;\n    this.Hover = WebPartMenu_Hover;\n    this.Unhover = WebPartMenu_Unhover;\n    this.Dispose = WebPartMenu_Dispose;\n    var menu = this;\n    this.disposeDelegate = function() { menu.Dispose(); };\n    window.attachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Dispose() {\n    this.menuLabelElement.__menu = null;\n    this.menuDropDownElement.__menu = null;\n    window.detachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Show() {\n    if ((typeof(__wpm.menu) != \"undefined\") && (__wpm.menu != null)) {\n        __wpm.menu.Hide();\n    }\n    var menuHTML =\n        \"<html><head><style>\" +\n        \"a.menuItem, a.menuItem:Link { display: block; padding: 1px; text-decoration: none; \" + this.itemStyle + \" }\" +\n        \"a.menuItem:Hover { \" + this.itemHoverStyle + \" }\" +\n        \"</style><body scroll=\\\"no\\\" style=\\\"border: none; margin: 0; padding: 0;\\\" ondragstart=\\\"window.event.returnValue=false;\\\" onclick=\\\"popup.hide()\\\">\" +\n        this.menuElement.innerHTML +\n        \"</body></html>\";\n    var width = 16;\n    var height = 16;\n    this.popup = window.createPopup();\n    __wpm.menu = this;\n    var popupDocument = this.popup.document;\n    popupDocument.write(menuHTML);\n    this.popup.show(0, 0, width, height);\n    var popupBody = popupDocument.body;\n    width = popupBody.scrollWidth;\n    height = popupBody.scrollHeight;\n    if (width < this.menuLabelElement.offsetWidth) {\n        width = this.menuLabelElement.offsetWidth + 16;\n    }\n    if (this.menuElement.innerHTML.indexOf(\"progid:DXImageTransform.Microsoft.Shadow\") != -1) {\n        popupBody.style.paddingRight = \"4px\";\n    }\n    popupBody.__wpm = __wpm;\n    popupBody.__wpmDeleteWarning = __wpmDeleteWarning;\n    popupBody.__wpmCloseProviderWarning = __wpmCloseProviderWarning;\n    popupBody.popup = this.popup;\n    this.popup.hide();\n    this.popup.show(0, this.menuLabelElement.offsetHeight, width, height, this.menuLabelElement);\n}\nfunction WebPartMenu_Hide() {\n    if (__wpm.menu == this) {\n        __wpm.menu = null;\n        if ((typeof(this.popup) != \"undefined\") && (this.popup != null)) {\n            this.popup.hide();\n            this.popup = null;\n        }\n    }\n}\nfunction WebPartMenu_Hover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.className = this.menuLabelElement.className + \" \" + this.labelHoverClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.labelHoverColor;\n    }\n}\nfunction WebPartMenu_Unhover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.style.textDecoration = this.oldTextDecoration;\n        this.menuLabelElement.className = this.oldClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.oldColor;\n    }\n}\nfunction WebPartMenu_OnClick() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        window.event.returnValue = false;\n        window.event.cancelBubble = true;\n        menu.Show();\n    }\n}\nfunction WebPartMenu_OnKeyPress() {\n    if (window.event.keyCode == 13) {\n        var menu = window.event.srcElement.__menu;\n        if ((typeof(menu) != \"undefined\") && (menu != null)) {\n            window.event.returnValue = false;\n            window.event.cancelBubble = true;\n            menu.Show();\n        }\n    }\n}\nfunction WebPartMenu_OnMouseEnter() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Hover();\n    }\n}\nfunction WebPartMenu_OnMouseLeave() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Unhover();\n    }\n}\nfunction WebPartManager() {\n    this.overlayContainerElement = null;\n    this.zones = new Array();\n    this.dragState = null;\n    this.menu = null;\n    this.draggedWebPart = null;\n    this.AddZone = WebPartManager_AddZone;\n    this.IsDragDropEnabled = WebPartManager_IsDragDropEnabled;\n    this.DragDrop = WebPartManager_DragDrop;\n    this.InitiateWebPartDragDrop = WebPartManager_InitiateWebPartDragDrop;\n    this.CompleteWebPartDragDrop = WebPartManager_CompleteWebPartDragDrop;\n    this.ContinueWebPartDragDrop = WebPartManager_ContinueWebPartDragDrop;\n    this.ProcessWebPartDragEnter = WebPartManager_ProcessWebPartDragEnter;\n    this.ProcessWebPartDragOver = WebPartManager_ProcessWebPartDragOver;\n    this.ProcessWebPartDrop = WebPartManager_ProcessWebPartDrop;\n    this.ShowHelp = WebPartManager_ShowHelp;\n    this.ExportWebPart = WebPartManager_ExportWebPart;\n    this.Execute = WebPartManager_Execute;\n    this.SubmitPage = WebPartManager_SubmitPage;\n    this.UpdatePositions = WebPartManager_UpdatePositions;\n    window.attachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_Dispose() {\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].Dispose();\n    }\n    window.detachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_AddZone(zoneElement, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var zoneIndex = this.zones.length;\n    var zone = new Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor);\n    this.zones[zoneIndex] = zone;\n    return zone;\n}\nfunction WebPartManager_IsDragDropEnabled() {\n    return ((typeof(this.overlayContainerElement) != \"undefined\") && (this.overlayContainerElement != null));\n}\nfunction WebPartManager_DragDrop() {\n    if ((typeof(this.draggedWebPart) != \"undefined\") && (this.draggedWebPart != null)) {\n        var tempWebPart = this.draggedWebPart;\n        this.draggedWebPart = null;\n        tempWebPart.dragDrop();\n        window.setTimeout(\"__wpClearSelection()\", 0);\n    }\n}\nfunction WebPartManager_InitiateWebPartDragDrop(webPartElement) {\n    var webPart = webPartElement.__webPart;\n    this.UpdatePositions();\n    this.dragState = new WebPartDragState(webPartElement, \"move\");\n    var location = __wpGetPageEventLocation(window.event, true);\n    var overlayContainerElement = this.overlayContainerElement;\n    overlayContainerElement.style.left = location.x - webPartElement.offsetWidth / 2;\n    overlayContainerElement.style.top = location.y + 4 + (webPartElement.clientTop ? webPartElement.clientTop : 0);\n    overlayContainerElement.style.display = \"block\";\n    overlayContainerElement.style.width = webPartElement.offsetWidth;\n    overlayContainerElement.style.height = webPartElement.offsetHeight;\n    overlayContainerElement.appendChild(webPartElement.cloneNode(true));\n    if (webPart.allowZoneChange == false) {\n        webPart.zone.allowDrop = true;\n    }\n    else {\n        for (var i = 0; i < __wpm.zones.length; i++) {\n            var zone = __wpm.zones[i];\n            if (zone.allowLayoutChange) {\n                zone.allowDrop = true;\n            }\n        }\n    }\n    document.body.attachEvent(\"ondragover\", Zone_OnDragOver);\n    return \"move\";\n}\nfunction WebPartManager_CompleteWebPartDragDrop() {\n    var dragState = this.dragState;\n    this.dragState = null;\n    if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n    }\n    document.body.detachEvent(\"ondragover\", Zone_OnDragOver);\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].allowDrop = false;\n    }\n    this.overlayContainerElement.removeChild(this.overlayContainerElement.firstChild);\n    this.overlayContainerElement.style.display = \"none\";\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) && (dragState.dropped == true)) {\n        var currentZone = dragState.webPartElement.__webPart.zone;\n        var currentZoneIndex = dragState.webPartElement.__webPart.zoneIndex;\n        if ((currentZone != dragState.dropZoneElement.__zone) ||\n            ((currentZoneIndex != dragState.dropIndex) &&\n             (currentZoneIndex != (dragState.dropIndex - 1)))) {\n            var eventTarget = dragState.dropZoneElement.__zone.uniqueID;\n            var eventArgument = \"Drag:\" + dragState.webPartElement.id + \":\" + dragState.dropIndex;\n            this.SubmitPage(eventTarget, eventArgument);\n        }\n    }\n}\nfunction WebPartManager_ContinueWebPartDragDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var style = this.overlayContainerElement.style;\n        var location = __wpGetPageEventLocation(window.event, true);\n        style.left = location.x - dragState.webPartElement.offsetWidth / 2;\n        style.top = location.y + 4 + (dragState.webPartElement.clientTop ? dragState.webPartElement.clientTop : 0);\n    }\n}\nfunction WebPartManager_Execute(script) {\n    if (this.menu) {\n        this.menu.Hide();\n    }\n    var scriptReference = new Function(script);\n    return (scriptReference() != false);\n}\nfunction WebPartManager_ProcessWebPartDragEnter() {\n    var dragState = __wpm.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var newDropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(newDropZoneElement.__zone) == \"undefined\") || (newDropZoneElement.__zone == null) ||\n            (newDropZoneElement.__zone.allowDrop == false)) {\n            newDropZoneElement = null;\n        }\n        var newDropIndex = -1;\n        if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n            newDropIndex = newDropZoneElement.__zone.GetWebPartIndex(__wpGetPageEventLocation(currentEvent, false));\n            if (newDropIndex == -1) {\n                newDropZoneElement = null;\n            }\n        }\n        if (dragState.dropZoneElement != newDropZoneElement) {\n            if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropZoneElement = newDropZoneElement;\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        else if (dragState.dropIndex != newDropIndex) {\n            if (dragState.dropIndex != -1) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            currentEvent.dataTransfer.effectAllowed = dragState.effect;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ProcessWebPartDragOver() {\n    var dragState = __wpm.dragState;\n    var currentEvent = window.event;\n    var handled = false;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) &&\n        (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if (((typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) &&\n            (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n            dragState.dropZoneElement = null;\n            dragState.dropIndex = -1;\n        }\n        else if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n            var location = __wpGetPageEventLocation(currentEvent, false);\n            var newDropIndex = dropZoneElement.__zone.GetWebPartIndex(location);\n            if (newDropIndex == -1) {\n                dropZoneElement = null;\n            }\n            if (dragState.dropZoneElement != dropZoneElement) {\n                if ((dragState.dropIndex != -1) || (typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) {\n                    dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n                }\n                dragState.dropZoneElement = dropZoneElement;\n            }\n            else {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, true);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n                dropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        handled = true;\n    }\n    if ((typeof(dragState) == \"undefined\") || (dragState == null) ||\n        (typeof(dragState.dropZoneElement) == \"undefined\") || (dragState.dropZoneElement == null)) {\n        currentEvent.dataTransfer.effectAllowed = \"none\";\n    }\n    return handled;\n}\nfunction WebPartManager_ProcessWebPartDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dragState.dropZoneElement == dropZoneElement)) {\n            dragState.dropped = true;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ShowHelp(helpUrl, helpMode) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    if (helpMode == 0 || helpMode == 1) {\n        if (helpMode == 0) {\n            var dialogInfo = \"edge: Sunken; center: yes; help: no; resizable: yes; status: no\";\n            window.showModalDialog(helpUrl, null, dialogInfo);\n        }\n        else {\n            window.open(helpUrl, null, \"scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no\");\n        }\n    }\n    else if (helpMode == 2) {\n        window.location = helpUrl;\n    }\n}\nfunction WebPartManager_ExportWebPart(exportUrl, warn, confirmOnly) {\n    if (warn == true && __wpmExportWarning.length > 0 && this.personalizationScopeShared != true) {\n        if (confirm(__wpmExportWarning) == false) {\n            return false;\n        }\n    }\n    if (confirmOnly == false) {\n        window.location = exportUrl;\n    }\n    return true;\n}\nfunction WebPartManager_UpdatePositions() {\n    for (var i = 0; i < this.zones.length; i++) {\n        this.zones[i].UpdatePosition();\n    }\n}\nfunction WebPartManager_SubmitPage(eventTarget, eventArgument) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    __doPostBack(eventTarget, eventArgument);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebUIValidation.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebUIValidation.js\nvar Page_ValidationVer = \"125\";\nvar Page_IsValid = true;\nvar Page_BlockSubmit = false;\nvar Page_InvalidControlToBeFocused = null;\nvar Page_TextTypes = /^(text|password|file|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction ValidatorUpdateDisplay(val) {\n    if (typeof(val.display) == \"string\") {\n        if (val.display == \"None\") {\n            return;\n        }\n        if (val.display == \"Dynamic\") {\n            val.style.display = val.isvalid ? \"none\" : \"inline\";\n            return;\n        }\n    }\n    if ((navigator.userAgent.indexOf(\"Mac\") > -1) &&\n        (navigator.userAgent.indexOf(\"MSIE\") > -1)) {\n        val.style.display = \"inline\";\n    }\n    val.style.visibility = val.isvalid ? \"hidden\" : \"visible\";\n}\nfunction ValidatorUpdateIsValid() {\n    Page_IsValid = AllValidatorsValid(Page_Validators);\n}\nfunction AllValidatorsValid(validators) {\n    if ((typeof(validators) != \"undefined\") && (validators != null)) {\n        var i;\n        for (i = 0; i < validators.length; i++) {\n            if (!validators[i].isvalid) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction ValidatorHookupControlID(controlID, val) {\n    if (typeof(controlID) != \"string\") {\n        return;\n    }\n    var ctrl = document.getElementById(controlID);\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null)) {\n        ValidatorHookupControl(ctrl, val);\n    }\n    else {\n        val.isvalid = true;\n        val.enabled = false;\n    }\n}\nfunction ValidatorHookupControl(control, val) {\n    if (typeof(control.tagName) != \"string\") {\n        return;  \n    }\n    if (control.tagName != \"INPUT\" && control.tagName != \"TEXTAREA\" && control.tagName != \"SELECT\") {\n        var i;\n        for (i = 0; i < control.childNodes.length; i++) {\n            ValidatorHookupControl(control.childNodes[i], val);\n        }\n        return;\n    }\n    else {\n        if (typeof(control.Validators) == \"undefined\") {\n            control.Validators = new Array;\n            var eventType;\n            if (control.type == \"radio\") {\n                eventType = \"onclick\";\n            } else {\n                eventType = \"onchange\";\n                if (typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                    ValidatorHookupEvent(control, \"onblur\", \"ValidatedControlOnBlur(event); \");\n                }\n            }\n            ValidatorHookupEvent(control, eventType, \"ValidatorOnChange(event); \");\n            if (Page_TextTypes.test(control.type)) {\n                ValidatorHookupEvent(control, \"onkeypress\", \n                    \"event = event || window.event; if (!ValidatedTextBoxOnKeyPress(event)) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } \");\n            }\n        }\n        control.Validators[control.Validators.length] = val;\n    }\n}\nfunction ValidatorHookupEvent(control, eventType, functionPrefix) {\n    var ev = control[eventType];\n    if (typeof(ev) == \"function\") {\n        ev = ev.toString();\n        ev = ev.substring(ev.indexOf(\"{\") + 1, ev.lastIndexOf(\"}\"));\n    }\n    else {\n        ev = \"\";\n    }\n    control[eventType] = new Function(\"event\", functionPrefix + \" \" + ev);\n}\nfunction ValidatorGetValue(id) {\n    var control;\n    control = document.getElementById(id);\n    if (typeof(control.value) == \"string\") {\n        return control.value;\n    }\n    return ValidatorGetValueRecursive(control);\n}\nfunction ValidatorGetValueRecursive(control)\n{\n    if (typeof(control.value) == \"string\" && (control.type != \"radio\" || control.checked == true)) {\n        return control.value;\n    }\n    var i, val;\n    for (i = 0; i<control.childNodes.length; i++) {\n        val = ValidatorGetValueRecursive(control.childNodes[i]);\n        if (val != \"\") return val;\n    }\n    return \"\";\n}\nfunction Page_ClientValidate(validationGroup) {\n    Page_InvalidControlToBeFocused = null;\n    if (typeof(Page_Validators) == \"undefined\") {\n        return true;\n    }\n    var i;\n    for (i = 0; i < Page_Validators.length; i++) {\n        ValidatorValidate(Page_Validators[i], validationGroup, null);\n    }\n    ValidatorUpdateIsValid();\n    ValidationSummaryOnSubmit(validationGroup);\n    Page_BlockSubmit = !Page_IsValid;\n    return Page_IsValid;\n}\nfunction ValidatorCommonOnSubmit() {\n    Page_InvalidControlToBeFocused = null;\n    var result = !Page_BlockSubmit;\n    if ((typeof(window.event) != \"undefined\") && (window.event != null)) {\n        window.event.returnValue = result;\n    }\n    Page_BlockSubmit = false;\n    return result;\n}\nfunction ValidatorEnable(val, enable) {\n    val.enabled = (enable != false);\n    ValidatorValidate(val);\n    ValidatorUpdateIsValid();\n}\nfunction ValidatorOnChange(event) {\n    event = event || window.event;\n    Page_InvalidControlToBeFocused = null;\n    var targetedControl;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        targetedControl = event.srcElement;\n    }\n    else {\n        targetedControl = event.target;\n    }\n    var vals;\n    if (typeof(targetedControl.Validators) != \"undefined\") {\n        vals = targetedControl.Validators;\n    }\n    else {\n        if (targetedControl.tagName.toLowerCase() == \"label\") {\n            targetedControl = document.getElementById(targetedControl.htmlFor);\n            vals = targetedControl.Validators;\n        }\n    }\n    if (vals) {\n        for (var i = 0; i < vals.length; i++) {\n            ValidatorValidate(vals[i], null, event);\n        }\n    }\n    ValidatorUpdateIsValid();\n}\nfunction ValidatedTextBoxOnKeyPress(event) {\n    event = event || window.event;\n    if (event.keyCode == 13) {\n        ValidatorOnChange(event);\n        var vals;\n        if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n            vals = event.srcElement.Validators;\n        }\n        else {\n            vals = event.target.Validators;\n        }\n        return AllValidatorsValid(vals);\n    }\n    return true;\n}\nfunction ValidatedControlOnBlur(event) {\n    event = event || window.event;\n    var control;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        control = event.srcElement;\n    }\n    else {\n        control = event.target;\n    }\n    if ((typeof(control) != \"undefined\") && (control != null) && (Page_InvalidControlToBeFocused == control)) {\n        control.focus();\n        Page_InvalidControlToBeFocused = null;\n    }\n}\nfunction ValidatorValidate(val, validationGroup, event) {\n    val.isvalid = true;\n    if ((typeof(val.enabled) == \"undefined\" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {\n        if (typeof(val.evaluationfunction) == \"function\") {\n            val.isvalid = val.evaluationfunction(val);\n            if (!val.isvalid && Page_InvalidControlToBeFocused == null &&\n                typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                ValidatorSetFocus(val, event);\n            }\n        }\n    }\n    ValidatorUpdateDisplay(val);\n}\nfunction ValidatorSetFocus(val, event) {\n    var ctrl;\n    if (typeof(val.controlhookup) == \"string\") {\n        var eventCtrl;\n        if ((typeof(event) != \"undefined\") && (event != null)) {\n            if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n                eventCtrl = event.srcElement;\n            }\n            else {\n                eventCtrl = event.target;\n            }\n        }\n        if ((typeof(eventCtrl) != \"undefined\") && (eventCtrl != null) &&\n            (typeof(eventCtrl.id) == \"string\") &&\n            (eventCtrl.id == val.controlhookup)) {\n            ctrl = eventCtrl;\n        }\n    }\n    if ((typeof(ctrl) == \"undefined\") || (ctrl == null)) {\n        ctrl = document.getElementById(val.controltovalidate);\n    }\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null) &&\n        (ctrl.tagName.toLowerCase() != \"table\" || (typeof(event) == \"undefined\") || (event == null)) && \n        ((ctrl.tagName.toLowerCase() != \"input\") || (ctrl.type.toLowerCase() != \"hidden\")) &&\n        (typeof(ctrl.disabled) == \"undefined\" || ctrl.disabled == null || ctrl.disabled == false) &&\n        (typeof(ctrl.visible) == \"undefined\" || ctrl.visible == null || ctrl.visible != false) &&\n        (IsInVisibleContainer(ctrl))) {\n        if ((ctrl.tagName.toLowerCase() == \"table\" && (typeof(__nonMSDOMBrowser) == \"undefined\" || __nonMSDOMBrowser)) ||\n            (ctrl.tagName.toLowerCase() == \"span\")) {\n            var inputElements = ctrl.getElementsByTagName(\"input\");\n            var lastInputElement  = inputElements[inputElements.length -1];\n            if (lastInputElement != null) {\n                ctrl = lastInputElement;\n            }\n        }\n        if (typeof(ctrl.focus) != \"undefined\" && ctrl.focus != null) {\n            ctrl.focus();\n            Page_InvalidControlToBeFocused = ctrl;\n        }\n    }\n}\nfunction IsInVisibleContainer(ctrl) {\n    if (typeof(ctrl.style) != \"undefined\" &&\n        ( ( typeof(ctrl.style.display) != \"undefined\" &&\n            ctrl.style.display == \"none\") ||\n          ( typeof(ctrl.style.visibility) != \"undefined\" &&\n            ctrl.style.visibility == \"hidden\") ) ) {\n        return false;\n    }\n    else if (typeof(ctrl.parentNode) != \"undefined\" &&\n             ctrl.parentNode != null &&\n             ctrl.parentNode != ctrl) {\n        return IsInVisibleContainer(ctrl.parentNode);\n    }\n    return true;\n}\nfunction IsValidationGroupMatch(control, validationGroup) {\n    if ((typeof(validationGroup) == \"undefined\") || (validationGroup == null)) {\n        return true;\n    }\n    var controlGroup = \"\";\n    if (typeof(control.validationGroup) == \"string\") {\n        controlGroup = control.validationGroup;\n    }\n    return (controlGroup == validationGroup);\n}\nfunction ValidatorOnLoad() {\n    if (typeof(Page_Validators) == \"undefined\")\n        return;\n    var i, val;\n    for (i = 0; i < Page_Validators.length; i++) {\n        val = Page_Validators[i];\n        if (typeof(val.evaluationfunction) == \"string\") {\n            eval(\"val.evaluationfunction = \" + val.evaluationfunction + \";\");\n        }\n        if (typeof(val.isvalid) == \"string\") {\n            if (val.isvalid == \"False\") {\n                val.isvalid = false;\n                Page_IsValid = false;\n            }\n            else {\n                val.isvalid = true;\n            }\n        } else {\n            val.isvalid = true;\n        }\n        if (typeof(val.enabled) == \"string\") {\n            val.enabled = (val.enabled != \"False\");\n        }\n        if (typeof(val.controltovalidate) == \"string\") {\n            ValidatorHookupControlID(val.controltovalidate, val);\n        }\n        if (typeof(val.controlhookup) == \"string\") {\n            ValidatorHookupControlID(val.controlhookup, val);\n        }\n    }\n    Page_ValidationActive = true;\n}\nfunction ValidatorConvert(op, dataType, val) {\n    function GetFullYear(year) {\n        var twoDigitCutoffYear = val.cutoffyear % 100;\n        var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;\n        return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));\n    }\n    var num, cleanInput, m, exp;\n    if (dataType == \"Integer\") {\n        exp = /^\\s*[-\\+]?\\d+\\s*$/;\n        if (op.match(exp) == null)\n            return null;\n        num = parseInt(op, 10);\n        return (isNaN(num) ? null : num);\n    }\n    else if(dataType == \"Double\") {\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?(\\\\d*)\\\\\" + val.decimalchar + \"?(\\\\d*)\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && m[3].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + (m[2].length>0 ? m[2] : \"0\") + (m[3].length>0 ? \".\" + m[3] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Currency\") {\n        var hasDigits = (val.digits > 0);\n        var beginGroupSize, subsequentGroupSize;\n        var groupSizeNum = parseInt(val.groupsize, 10);\n        if (!isNaN(groupSizeNum) && groupSizeNum > 0) {\n            beginGroupSize = \"{1,\" + groupSizeNum + \"}\";\n            subsequentGroupSize = \"{\" + groupSizeNum + \"}\";\n        }\n        else {\n            beginGroupSize = subsequentGroupSize = \"+\";\n        }\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?((\\\\d\" + beginGroupSize + \"(\\\\\" + val.groupchar + \"\\\\d\" + subsequentGroupSize + \")+)|\\\\d*)\"\n                        + (hasDigits ? \"\\\\\" + val.decimalchar + \"?(\\\\d{0,\" + val.digits + \"})\" : \"\")\n                        + \"\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && hasDigits && m[5].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + m[2].replace(new RegExp(\"(\\\\\" + val.groupchar + \")\", \"g\"), \"\") + ((hasDigits && m[5].length > 0) ? \".\" + m[5] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Date\") {\n        var yearFirstExp = new RegExp(\"^\\\\s*((\\\\d{4})|(\\\\d{2}))([-/]|\\\\. ?)(\\\\d{1,2})\\\\4(\\\\d{1,2})\\\\.?\\\\s*$\");\n        m = op.match(yearFirstExp);\n        var day, month, year;\n        if (m != null && (((typeof(m[2]) != \"undefined\") && (m[2].length == 4)) || val.dateorder == \"ymd\")) {\n            day = m[6];\n            month = m[5];\n            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));\n        }\n        else {\n            if (val.dateorder == \"ymd\"){\n                return null;\n            }\n            var yearLastExp = new RegExp(\"^\\\\s*(\\\\d{1,2})([-/]|\\\\. ?)(\\\\d{1,2})(?:\\\\s|\\\\2)((\\\\d{4})|(\\\\d{2}))(?:\\\\s\\u0433\\\\.|\\\\.)?\\\\s*$\");\n            m = op.match(yearLastExp);\n            if (m == null) {\n                return null;\n            }\n            if (val.dateorder == \"mdy\") {\n                day = m[3];\n                month = m[1];\n            }\n            else {\n                day = m[1];\n                month = m[3];\n            }\n            year = ((typeof(m[5]) != \"undefined\") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10));\n        }\n        month -= 1;\n        var date = new Date(year, month, day);\n        if (year < 100) {\n            date.setFullYear(year);\n        }\n        return (typeof(date) == \"object\" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;\n    }\n    else {\n        return op.toString();\n    }\n}\nfunction ValidatorCompare(operand1, operand2, operator, val) {\n    var dataType = val.type;\n    var op1, op2;\n    if ((op1 = ValidatorConvert(operand1, dataType, val)) == null)\n        return false;\n    if (operator == \"DataTypeCheck\")\n        return true;\n    if ((op2 = ValidatorConvert(operand2, dataType, val)) == null)\n        return true;\n    switch (operator) {\n        case \"NotEqual\":\n            return (op1 != op2);\n        case \"GreaterThan\":\n            return (op1 > op2);\n        case \"GreaterThanEqual\":\n            return (op1 >= op2);\n        case \"LessThan\":\n            return (op1 < op2);\n        case \"LessThanEqual\":\n            return (op1 <= op2);\n        default:\n            return (op1 == op2);\n    }\n}\nfunction CompareValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var compareTo = \"\";\n    if ((typeof(val.controltocompare) != \"string\") ||\n        (typeof(document.getElementById(val.controltocompare)) == \"undefined\") ||\n        (null == document.getElementById(val.controltocompare))) {\n        if (typeof(val.valuetocompare) == \"string\") {\n            compareTo = val.valuetocompare;\n        }\n    }\n    else {\n        compareTo = ValidatorGetValue(val.controltocompare);\n    }\n    var operator = \"Equal\";\n    if (typeof(val.operator) == \"string\") {\n        operator = val.operator;\n    }\n    return ValidatorCompare(value, compareTo, operator, val);\n}\nfunction CustomValidatorEvaluateIsValid(val) {\n    var value = \"\";\n    if (typeof(val.controltovalidate) == \"string\") {\n        value = ValidatorGetValue(val.controltovalidate);\n        if ((ValidatorTrim(value).length == 0) &&\n            ((typeof(val.validateemptytext) != \"string\") || (val.validateemptytext != \"true\"))) {\n            return true;\n        }\n    }\n    var args = { Value:value, IsValid:true };\n    if (typeof(val.clientvalidationfunction) == \"string\") {\n        eval(val.clientvalidationfunction + \"(val, args) ;\");\n    }\n    return args.IsValid;\n}\nfunction RegularExpressionValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var rx = new RegExp(val.validationexpression);\n    var matches = rx.exec(value);\n    return (matches != null && value == matches[0]);\n}\nfunction ValidatorTrim(s) {\n    var m = s.match(/^\\s*(\\S+(\\s+\\S+)*)\\s*$/);\n    return (m == null) ? \"\" : m[1];\n}\nfunction RequiredFieldValidatorEvaluateIsValid(val) {\n    return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))\n}\nfunction RangeValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    return (ValidatorCompare(value, val.minimumvalue, \"GreaterThanEqual\", val) &&\n            ValidatorCompare(value, val.maximumvalue, \"LessThanEqual\", val));\n}\nfunction ValidationSummaryOnSubmit(validationGroup) {\n    if (typeof(Page_ValidationSummaries) == \"undefined\")\n        return;\n    var summary, sums, s;\n    var headerSep, first, pre, post, end;\n    for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {\n        summary = Page_ValidationSummaries[sums];\n        if (!summary) continue;\n        summary.style.display = \"none\";\n        if (!Page_IsValid && IsValidationGroupMatch(summary, validationGroup)) {\n            var i;\n            if (summary.showsummary != \"False\") {\n                summary.style.display = \"\";\n                if (typeof(summary.displaymode) != \"string\") {\n                    summary.displaymode = \"BulletList\";\n                }\n                switch (summary.displaymode) {\n                    case \"List\":\n                        headerSep = \"<br>\";\n                        first = \"\";\n                        pre = \"\";\n                        post = \"<br>\";\n                        end = \"\";\n                        break;\n                    case \"BulletList\":\n                    default:\n                        headerSep = \"\";\n                        first = \"<ul>\";\n                        pre = \"<li>\";\n                        post = \"</li>\";\n                        end = \"</ul>\";\n                        break;\n                    case \"SingleParagraph\":\n                        headerSep = \" \";\n                        first = \"\";\n                        pre = \"\";\n                        post = \" \";\n                        end = \"<br>\";\n                        break;\n                }\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + headerSep;\n                }\n                s += first;\n                for (i=0; i<Page_Validators.length; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        s += pre + Page_Validators[i].errormessage + post;\n                    }\n                }\n                s += end;\n                summary.innerHTML = s;\n                window.scrollTo(0,0);\n            }\n            if (summary.showmessagebox == \"True\") {\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + \"\\r\\n\";\n                }\n                var lastValIndex = Page_Validators.length - 1;\n                for (i=0; i<=lastValIndex; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        switch (summary.displaymode) {\n                            case \"List\":\n                                s += Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"BulletList\":\n                            default:\n                                s += \"- \" + Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"SingleParagraph\":\n                                s += Page_Validators[i].errormessage + \" \";\n                                break;\n                        }\n                    }\n                }\n                alert(s);\n            }\n        }\n    }\n}\nif (window.jQuery) {\n    (function ($) {\n        var dataValidationAttribute = \"data-val\",\n            dataValidationSummaryAttribute = \"data-valsummary\",\n            normalizedAttributes = { validationgroup: \"validationGroup\", focusonerror: \"focusOnError\" };\n        function getAttributesWithPrefix(element, prefix) {\n            var i,\n                attribute,\n                list = {},\n                attributes = element.attributes,\n                length = attributes.length,\n                prefixLength = prefix.length;\n            prefix = prefix.toLowerCase();\n            for (i = 0; i < length; i++) {\n                attribute = attributes[i];\n                if (attribute.specified && attribute.name.substr(0, prefixLength).toLowerCase() === prefix) {\n                    list[attribute.name.substr(prefixLength)] = attribute.value;\n                }\n            }\n            return list;\n        }\n        function normalizeKey(key) {\n            key = key.toLowerCase();\n            return normalizedAttributes[key] === undefined ? key : normalizedAttributes[key];\n        }\n        function addValidationExpando(element) {\n            var attributes = getAttributesWithPrefix(element, dataValidationAttribute + \"-\");\n            $.each(attributes, function (key, value) {\n                element[normalizeKey(key)] = value;\n            });\n        }\n        function dispose(element) {\n            var index = $.inArray(element, Page_Validators);\n            if (index >= 0) {\n                Page_Validators.splice(index, 1);\n            }\n        }\n        function addNormalizedAttribute(name, normalizedName) {\n            normalizedAttributes[name.toLowerCase()] = normalizedName;\n        }\n        function parseSpecificAttribute(selector, attribute, validatorsArray) {\n            return $(selector).find(\"[\" + attribute + \"='true']\").each(function (index, element) {\n                addValidationExpando(element);\n                element.dispose = function () { dispose(element); element.dispose = null; };\n                if ($.inArray(element, validatorsArray) === -1) {\n                    validatorsArray.push(element);\n                }\n            }).length;\n        }\n        function parse(selector) {\n            var length = parseSpecificAttribute(selector, dataValidationAttribute, Page_Validators);\n            length += parseSpecificAttribute(selector, dataValidationSummaryAttribute, Page_ValidationSummaries);\n            return length;\n        }\n        function loadValidators() {\n            if (typeof (ValidatorOnLoad) === \"function\") {\n                ValidatorOnLoad();\n            }\n            if (typeof (ValidatorOnSubmit) === \"undefined\") {\n                window.ValidatorOnSubmit = function () {\n                    return Page_ValidationActive ? ValidatorCommonOnSubmit() : true;\n                };\n            }\n        }\n        function registerUpdatePanel() {\n            if (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {\n                var prm = Sys.WebForms.PageRequestManager.getInstance(),\n                    postBackElement, endRequestHandler;\n                if (prm.get_isInAsyncPostBack()) {\n                    endRequestHandler = function (sender, args) {\n                        if (parse(document)) {\n                            loadValidators();\n                        }\n                        prm.remove_endRequest(endRequestHandler);\n                        endRequestHandler = null;\n                    };\n                    prm.add_endRequest(endRequestHandler);\n                }\n                prm.add_beginRequest(function (sender, args) {\n                    postBackElement = args.get_postBackElement();\n                });\n                prm.add_pageLoaded(function (sender, args) {\n                    var i, panels, valFound = 0;\n                    if (typeof (postBackElement) === \"undefined\") {\n                        return;\n                    }\n                    panels = args.get_panelsUpdated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    panels = args.get_panelsCreated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    if (valFound) {\n                        loadValidators();\n                    }\n                });\n            }\n        }\n        $(function () {\n            if (typeof (Page_Validators) === \"undefined\") {\n                window.Page_Validators = [];\n            }\n            if (typeof (Page_ValidationSummaries) === \"undefined\") {\n                window.Page_ValidationSummaries = [];\n            }\n            if (typeof (Page_ValidationActive) === \"undefined\") {\n                window.Page_ValidationActive = false;\n            }\n            $.WebFormValidator = {\n                addNormalizedAttribute: addNormalizedAttribute,\n                parse: parse\n            };\n            if (parse(document)) {\n                loadValidators();\n            }\n            registerUpdatePanel();\n        });\n    } (jQuery));\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/bootstrap.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n\n/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/\nif (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#carousel\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#collapse\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    var $el = $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#modals\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#popovers\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tabs\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#affix\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.intellisense.js",
    "content": "﻿/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\nintellisense.annotate(jQuery, {\n  'ajax': function() {\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup().</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'ajaxPrefilter': function() {\n    /// <signature>\n    ///   <summary>Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().</summary>\n    ///   <param name=\"dataTypes\" type=\"String\">An optional string containing one or more space-separated dataTypes</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to set default values for future Ajax requests.</param>\n    /// </signature>\n  },\n  'ajaxSetup': function() {\n    /// <signature>\n    ///   <summary>Set default values for future Ajax requests.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A set of key/value pairs that configure the default Ajax request. All options are optional.</param>\n    /// </signature>\n  },\n  'ajaxTransport': function() {\n    /// <signature>\n    ///   <summary>Creates an object that handles the actual transmission of Ajax data.</summary>\n    ///   <param name=\"dataType\" type=\"String\">A string identifying the data type to use</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to return the new transport object to use with the data type provided in the first argument.</param>\n    /// </signature>\n  },\n  'boxModel': function() {\n    /// <summary>Deprecated in jQuery 1.3 (see jQuery.support). States if the current page, in the user's browser, is being rendered using the W3C CSS Box Model.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'browser': function() {\n    /// <summary>Contains flags for the useragent, read from navigator.userAgent. We recommend against using this property; please try to use feature detection instead (see jQuery.support). jQuery.browser may be moved to a plugin in a future release of jQuery.</summary>\n    /// <returns type=\"PlainObject\" />\n  },\n  'browser.version': function() {\n    /// <summary>The version number of the rendering engine for the user's browser.</summary>\n    /// <returns type=\"String\" />\n  },\n  'Callbacks': function() {\n    /// <signature>\n    ///   <summary>A multi-purpose callbacks list object that provides a powerful way to manage callback lists.</summary>\n    ///   <param name=\"flags\" type=\"String\">An optional list of space-separated flags that change how the callback list behaves.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM element is a descendant of another DOM element.</summary>\n    ///   <param name=\"container\" type=\"Element\">The DOM element that may contain the other element.</param>\n    ///   <param name=\"contained\" type=\"Element\">The DOM element that may be contained by (a descendant of) the other element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'cssHooks': function() {\n    /// <summary>Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <param name=\"key\" type=\"String\">Name of the data stored.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'Deferred': function() {\n    /// <signature>\n    ///   <summary>A constructor function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.</summary>\n    ///   <param name=\"beforeStart\" type=\"Function\">A function that is called just before the constructor returns.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove and execute a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    /// </signature>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties.</summary>\n    ///   <param name=\"collection\" type=\"Object\">The object or array to iterate over.</param>\n    ///   <param name=\"callback(indexInArray, valueOfElement)\" type=\"Function\">The function that will be executed on every object.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Takes a string and throws an exception containing it.</summary>\n    ///   <param name=\"message\" type=\"String\">The message to send out.</param>\n    /// </signature>\n  },\n  'extend': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"target\" type=\"Object\">An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"deep\" type=\"Boolean\">If true, the merge becomes recursive (aka. deep copy).</param>\n    ///   <param name=\"target\" type=\"Object\">The object to extend. It will receive the new properties.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP GET request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getJSON': function() {\n    /// <signature>\n    ///   <summary>Load JSON-encoded data from the server using a GET HTTP request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getScript': function() {\n    /// <signature>\n    ///   <summary>Load a JavaScript file from the server using a GET HTTP request, then execute it.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"success(script, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'globalEval': function() {\n    /// <signature>\n    ///   <summary>Execute some JavaScript code globally.</summary>\n    ///   <param name=\"code\" type=\"String\">The JavaScript code to execute.</param>\n    /// </signature>\n  },\n  'grep': function() {\n    /// <signature>\n    ///   <summary>Finds the elements of an array which satisfy a filter function. The original array is not affected.</summary>\n    ///   <param name=\"array\" type=\"Array\">The array to search through.</param>\n    ///   <param name=\"function(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the item, and the second argument is the index.  The function should return a Boolean value.  this will be the global window object.</param>\n    ///   <param name=\"invert\" type=\"Boolean\">If \"invert\" is false, or not provided, then the function returns an array consisting of all elements for which \"callback\" returns true.  If \"invert\" is true, then the function returns an array consisting of all elements for which \"callback\" returns false.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'hasData': function() {\n    /// <signature>\n    ///   <summary>Determine whether an element has any jQuery data associated with it.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to be checked for data.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'holdReady': function() {\n    /// <signature>\n    ///   <summary>Holds or releases the execution of jQuery's ready event.</summary>\n    ///   <param name=\"hold\" type=\"Boolean\">Indicates whether the ready hold is being requested or released</param>\n    /// </signature>\n  },\n  'inArray': function() {\n    /// <signature>\n    ///   <summary>Search for a specified value within an array and return its index (or -1 if not found).</summary>\n    ///   <param name=\"value\" type=\"Anything\">The value to search for.</param>\n    ///   <param name=\"array\" type=\"Array\">An array through which to search.</param>\n    ///   <param name=\"fromIndex\" type=\"Number\">The index of the array at which to begin the search. The default is 0, which will search the whole array.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'isArray': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is an array.</summary>\n    ///   <param name=\"obj\" type=\"Object\">Object to test whether or not it is an array.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isEmptyObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is empty (contains no enumerable properties).</summary>\n    ///   <param name=\"object\" type=\"Object\">The object that will be checked to see if it's empty.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isFunction': function() {\n    /// <signature>\n    ///   <summary>Determine if the argument passed is a Javascript function object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a function.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isNumeric': function() {\n    /// <signature>\n    ///   <summary>Determines whether its argument is a number.</summary>\n    ///   <param name=\"value\" type=\"PlainObject\">The value to be tested.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isPlainObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is a plain object (created using \"{}\" or \"new Object\").</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">The object that will be checked to see if it's a plain object.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isWindow': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is a window.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a window.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isXMLDoc': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM node is within an XML document (or is an XML document).</summary>\n    ///   <param name=\"node\" type=\"Element\">The DOM node that will be checked to see if it's in an XML document.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'makeArray': function() {\n    /// <signature>\n    ///   <summary>Convert an array-like object into a true JavaScript array.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Any object to turn into a native Array.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array to translate.</param>\n    ///   <param name=\"callback(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"arrayOrObject\" type=\"Object\">The Array or Object to translate.</param>\n    ///   <param name=\"callback( value, indexOrKey )\" type=\"Function\">The function to process each item against.  The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'merge': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two arrays together into the first array.</summary>\n    ///   <param name=\"first\" type=\"Array\">The first array to merge, the elements of second added.</param>\n    ///   <param name=\"second\" type=\"Array\">The second array to merge into the first, unaltered.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'noConflict': function() {\n    /// <signature>\n    ///   <summary>Relinquish jQuery's control of the $ variable.</summary>\n    ///   <param name=\"removeAll\" type=\"Boolean\">A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself).</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'noop': function() {\n    /// <summary>An empty function.</summary>\n  },\n  'now': function() {\n    /// <summary>Return a number representing the current time.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'param': function() {\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <param name=\"traditional\" type=\"Boolean\">A Boolean indicating whether to perform a traditional \"shallow\" serialization.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'parseHTML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an array of DOM nodes.</summary>\n    ///   <param name=\"data\" type=\"String\">HTML string to be parsed</param>\n    ///   <param name=\"context\" type=\"Element\">DOM element to serve as the context in which the HTML fragment will be created</param>\n    ///   <param name=\"keepScripts\" type=\"Boolean\">A Boolean indicating whether to include scripts passed in the HTML string</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'parseJSON': function() {\n    /// <signature>\n    ///   <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>\n    ///   <param name=\"json\" type=\"String\">The JSON string to parse.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'parseXML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an XML document.</summary>\n    ///   <param name=\"data\" type=\"String\">a well-formed XML string to be parsed</param>\n    ///   <returns type=\"XMLDocument\" />\n    /// </signature>\n  },\n  'post': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP POST request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'proxy': function() {\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function referenced in the function argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function named in the name argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element where the array of queued functions is attached.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element on which to add a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback()\" type=\"Function\">The new function to add to the queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove data.</param>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'sub': function() {\n    /// <summary>Creates a new copy of jQuery whose properties and methods can be modified without affecting the original jQuery object.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'support': function() {\n    /// <summary>A collection of properties that represent the presence of different browser features or bugs. Primarily intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'trim': function() {\n    /// <signature>\n    ///   <summary>Remove the whitespace from the beginning and end of a string.</summary>\n    ///   <param name=\"str\" type=\"String\">The string to trim.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'type': function() {\n    /// <signature>\n    ///   <summary>Determine the internal JavaScript [[Class]] of an object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to get the internal JavaScript [[Class]] of.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'unique': function() {\n    /// <signature>\n    ///   <summary>Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array of DOM elements.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'when': function() {\n    /// <signature>\n    ///   <summary>Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.</summary>\n    ///   <param name=\"deferreds\" type=\"Deferred\">One or more Deferred objects, or plain JavaScript objects.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nvar _1228819969 = jQuery.Callbacks;\njQuery.Callbacks = function(flags) {\nvar _object = _1228819969(flags);\nintellisense.annotate(_object, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add a callback or a collection of callbacks to a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be added to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'disable': function() {\n    /// <summary>Disable a callback list from doing anything more.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'disabled': function() {\n    /// <summary>Determine if the callbacks list has been disabled.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'empty': function() {\n    /// <summary>Remove all of the callbacks from a list.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'fire': function() {\n    /// <signature>\n    ///   <summary>Call all of the callbacks with the given arguments</summary>\n    ///   <param name=\"arguments\" type=\"Anything\">The argument or list of arguments to pass back to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'fired': function() {\n    /// <summary>Determine if the callbacks have already been called at least once.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'fireWith': function() {\n    /// <signature>\n    ///   <summary>Call all callbacks in a list with the given context and arguments.</summary>\n    ///   <param name=\"context\" type=\"\">A reference to the context in which the callbacks in the list should be fired.</param>\n    ///   <param name=\"args\" type=\"\">An argument, or array of arguments, to pass to the callbacks in the list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Determine whether a supplied callback is in a list</summary>\n    ///   <param name=\"callback\" type=\"Function\">The callback to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'lock': function() {\n    /// <summary>Lock a callback list in its current state.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'locked': function() {\n    /// <summary>Determine if the callbacks list has been locked.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove a callback or a collection of callbacks from a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be removed from the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _1228819969);\n\nvar _731531622 = jQuery.Deferred;\njQuery.Deferred = function(func) {\nvar _object = _731531622(func);\nintellisense.annotate(_object, {\n  'always': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is either resolved or rejected.</summary>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred is resolved or rejected.</param>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'done': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is resolved.</param>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'fail': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is rejected.</summary>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is rejected.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'isRejected': function() {\n    /// <summary>Determine whether a Deferred object has been rejected.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isResolved': function() {\n    /// <summary>Determine whether a Deferred object has been resolved.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'notify': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'notifyWith': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the progressCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'pipe': function() {\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'progress': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object generates progress notifications.</summary>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred generates progress notifications.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Deferred's Promise object.</summary>\n    ///   <param name=\"target\" type=\"Object\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'reject': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'rejectWith': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the failCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolve': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolveWith': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the doneCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'state': function() {\n    /// <summary>Determine the current state of a Deferred object.</summary>\n    /// <returns type=\"String\" />\n  },\n  'then': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">A function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred notifies progress.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _731531622);\n\nintellisense.annotate(jQuery.Event.prototype, {\n  'currentTarget': function() {\n    /// <summary>The current DOM element within the event bubbling phase.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'data': function() {\n    /// <summary>An optional object of data passed to an event method when the current executing handler is bound.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'delegateTarget': function() {\n    /// <summary>The element where the currently-called jQuery event handler was attached.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'isDefaultPrevented': function() {\n    /// <summary>Returns whether event.preventDefault() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isImmediatePropagationStopped': function() {\n    /// <summary>Returns whether event.stopImmediatePropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isPropagationStopped': function() {\n    /// <summary>Returns whether event.stopPropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'metaKey': function() {\n    /// <summary>Indicates whether the META key was pressed when the event fired.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'namespace': function() {\n    /// <summary>The namespace specified when the event was triggered.</summary>\n    /// <returns type=\"String\" />\n  },\n  'pageX': function() {\n    /// <summary>The mouse position relative to the left edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'pageY': function() {\n    /// <summary>The mouse position relative to the top edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'preventDefault': function() {\n    /// <summary>If this method is called, the default action of the event will not be triggered.</summary>\n  },\n  'relatedTarget': function() {\n    /// <summary>The other DOM element involved in the event, if any.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'result': function() {\n    /// <summary>The last value returned by an event handler that was triggered by this event, unless the value was undefined.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'stopImmediatePropagation': function() {\n    /// <summary>Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree.</summary>\n  },\n  'stopPropagation': function() {\n    /// <summary>Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.</summary>\n  },\n  'target': function() {\n    /// <summary>The DOM element that initiated the event.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'timeStamp': function() {\n    /// <summary>The difference in milliseconds between the time the browser created the event and January 1, 1970.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'type': function() {\n    /// <summary>Describes the nature of the event.</summary>\n    /// <returns type=\"String\" />\n  },\n  'which': function() {\n    /// <summary>For key or mouse events, this property indicates the specific key or button that was pressed.</summary>\n    /// <returns type=\"Number\" />\n  },\n});\n\nintellisense.annotate(jQuery.fn, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"html\" type=\"String\">An HTML fragment to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery object \">An existing jQuery object to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <param name=\"context\" type=\"Element\">The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addBack': function() {\n    /// <signature>\n    ///   <summary>Add the previous set of elements on the stack to the current set, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addClass': function() {\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be added to the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"function(index, currentClass)\" type=\"Function\">A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'after': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxComplete': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete. This is an AjaxEvent.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxError': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxSettings, thrownError)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSend': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed before an Ajax request is sent. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStart': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when the first Ajax request begins. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStop': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when all Ajax requests have completed. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSuccess': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'all': function() {\n    /// <summary>Selects all elements.</summary>\n  },\n  'andSelf': function() {\n    /// <summary>Add the previous set of elements on the stack to the current set.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'animate': function() {\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'animated': function() {\n    /// <summary>Select all elements that are in the progress of an animation at the time the selector is run.</summary>\n  },\n  'append': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'appendTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the end of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attr': function() {\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the attribute.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributes\" type=\"PlainObject\">An object of attribute-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"function(index, attr)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attributeContains': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing the a given substring.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsPrefix': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-).</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsWord': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing a given word, delimited by spaces.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEndsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEquals': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value exactly equal to a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeHas': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute, with any value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    /// </signature>\n  },\n  'attributeMultiple': function() {\n    /// <signature>\n    ///   <summary>Matches elements that match all of the specified attribute filters.</summary>\n    ///   <param name=\"attributeFilter1\" type=\"String\">An attribute filter.</param>\n    ///   <param name=\"attributeFilter2\" type=\"String\">Another attribute filter, reducing the selection even more</param>\n    ///   <param name=\"attributeFilterN\" type=\"String\">As many more attribute filters as necessary</param>\n    /// </signature>\n  },\n  'attributeNotEqual': function() {\n    /// <signature>\n    ///   <summary>Select elements that either don't have the specified attribute, or do have the specified attribute but not with a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeStartsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value beginning exactly with a given string.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'before': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert before each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'bind': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"preventBubble\" type=\"Boolean\">Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"events\" type=\"Object\">An object containing one or more DOM event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'blur': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'button': function() {\n    /// <summary>Selects all button elements and elements of type button.</summary>\n  },\n  'change': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'checkbox': function() {\n    /// <summary>Selects all elements of type checkbox.</summary>\n  },\n  'checked': function() {\n    /// <summary>Matches all elements that are checked.</summary>\n  },\n  'child': function() {\n    /// <signature>\n    ///   <summary>Selects all direct child elements specified by \"child\" of elements specified by \"parent\".</summary>\n    ///   <param name=\"parent\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"child\" type=\"String\">A selector to filter the child elements.</param>\n    /// </signature>\n  },\n  'children': function() {\n    /// <signature>\n    ///   <summary>Get the children of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'class': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given class.</summary>\n    ///   <param name=\"class\" type=\"String\">A class to search for. An element can have multiple classes; only one of them must match.</param>\n    /// </signature>\n  },\n  'clearQueue': function() {\n    /// <signature>\n    ///   <summary>Remove from the queue all items that have not yet been run.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'click': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'clone': function() {\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers should be copied along with the elements. As of jQuery 1.4, element data will be copied as well.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back to false in 1.5.1 and up.</param>\n    ///   <param name=\"deepWithDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'closest': function() {\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <param name=\"context\" type=\"Element\">A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Select all elements that contain the specified text.</summary>\n    ///   <param name=\"text\" type=\"String\">A string of text to look for. It's case sensitive.</param>\n    /// </signature>\n  },\n  'contents': function() {\n    /// <summary>Get the children of each element in the set of matched elements, including text and comment nodes.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'context': function() {\n    /// <summary>The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'css': function() {\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"key\" type=\"String\">A string naming the piece of data to set.</param>\n    ///   <param name=\"value\" type=\"Object\">The new data value; it can be any Javascript type including Array or Object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An object of key-value pairs of data to update.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dblclick': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delay': function() {\n    /// <signature>\n    ///   <summary>Set a timer to delay execution of subsequent items in the queue.</summary>\n    ///   <param name=\"duration\" type=\"Number\">An integer indicating the number of milliseconds to delay execution of the next item in the queue.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delegate': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched elements.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'descendant': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are descendants of a given ancestor.</summary>\n    ///   <param name=\"ancestor\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"descendant\" type=\"String\">A selector to filter the descendant elements.</param>\n    /// </signature>\n  },\n  'detach': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'die': function() {\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or keydown.</param>\n    ///   <param name=\"handler\" type=\"String\">The function that is no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types, such as click or keydown and their corresponding functions that are no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'disabled': function() {\n    /// <summary>Selects all elements that are disabled.</summary>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>Iterate over a jQuery object, executing a function for each matched element.</summary>\n    ///   <param name=\"function(index, Element)\" type=\"Function\">A function to execute for each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'element': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given tag name.</summary>\n    ///   <param name=\"element\" type=\"String\">An element to search for. Refers to the tagName of DOM nodes.</param>\n    /// </signature>\n  },\n  'empty': function() {\n    /// <summary>Select all elements that have no children (including text nodes).</summary>\n  },\n  'enabled': function() {\n    /// <summary>Selects all elements that are enabled.</summary>\n  },\n  'end': function() {\n    /// <summary>End the most recent filtering operation in the current chain and return the set of matched elements to its previous state.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'eq': function() {\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index of the element to match.</param>\n    /// </signature>\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"-index\" type=\"Number\">Zero-based index of the element to match, counting backwards from the last element.</param>\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'even': function() {\n    /// <summary>Selects even elements, zero-indexed.  See also odd.</summary>\n  },\n  'fadeIn': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeOut': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeTo': function() {\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'file': function() {\n    /// <summary>Selects all elements of type file.</summary>\n  },\n  'filter': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'find': function() {\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'finish': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'first': function() {\n    /// <summary>Selects the first matched element.</summary>\n  },\n  'first-child': function() {\n    /// <summary>Selects all elements that are the first child of their parent.</summary>\n  },\n  'first-of-type': function() {\n    /// <summary>Selects all elements that are the first among siblings of the same element name.</summary>\n  },\n  'focus': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusin': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Retrieve the DOM elements matched by the jQuery object.</summary>\n    ///   <param name=\"index\" type=\"Number\">A zero-based integer indicating which element to retrieve.</param>\n    ///   <returns type=\"Element, Array\" />\n    /// </signature>\n  },\n  'gt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index greater than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"contained\" type=\"Element\">A DOM element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hasClass': function() {\n    /// <signature>\n    ///   <summary>Determine whether any of the matched elements are assigned the given class.</summary>\n    ///   <param name=\"className\" type=\"String\">The class name to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'header': function() {\n    /// <summary>Selects all elements that are headers, like h1, h2, h3 and so on.</summary>\n  },\n  'height': function() {\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"function(index, height)\" type=\"Function\">A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hidden': function() {\n    /// <summary>Selects all elements that are hidden.</summary>\n  },\n  'hide': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hover': function() {\n    /// <signature>\n    ///   <summary>Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements.</summary>\n    ///   <param name=\"handlerIn(eventObject)\" type=\"Function\">A function to execute when the mouse pointer enters the element.</param>\n    ///   <param name=\"handlerOut(eventObject)\" type=\"Function\">A function to execute when the mouse pointer leaves the element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'html': function() {\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"htmlString\" type=\"String\">A string of HTML to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, oldhtml)\" type=\"Function\">A function returning the HTML content to set. Receives the           index position of the element in the set and the old HTML value as arguments.           jQuery empties the element before calling the function;           use the oldhtml argument to reference the previous content.           Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'id': function() {\n    /// <signature>\n    ///   <summary>Selects a single element with the given id attribute.</summary>\n    ///   <param name=\"id\" type=\"String\">An ID to search for, specified via the id attribute of an element.</param>\n    /// </signature>\n  },\n  'image': function() {\n    /// <summary>Selects all elements of type image.</summary>\n  },\n  'index': function() {\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector representing a jQuery collection in which to look for an element.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"element\" type=\"jQuery\">The DOM element or first element within the jQuery object to look for.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'init': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'innerHeight': function() {\n    /// <summary>Get the current computed height for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'innerWidth': function() {\n    /// <summary>Get the current computed width for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'input': function() {\n    /// <summary>Selects all input, textarea, select and button elements.</summary>\n  },\n  'insertAfter': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements after the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'insertBefore': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements before the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'is': function() {\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'jquery': function() {\n    /// <summary>A string containing the jQuery version number.</summary>\n    /// <returns type=\"String\" />\n  },\n  'keydown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keypress': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keyup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lang': function() {\n    /// <signature>\n    ///   <summary>Selects all elements of the specified language.</summary>\n    ///   <param name=\"language\" type=\"String\">A language code.</param>\n    /// </signature>\n  },\n  'last': function() {\n    /// <summary>Selects the last matched element.</summary>\n  },\n  'last-child': function() {\n    /// <summary>Selects all elements that are the last child of their parent.</summary>\n  },\n  'last-of-type': function() {\n    /// <summary>Selects all elements that are the last among siblings of the same element name.</summary>\n  },\n  'length': function() {\n    /// <summary>The number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'live': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more JavaScript event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'load': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index less than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Pass each element in the current matched set through a function, producing a new jQuery object containing the return values.</summary>\n    ///   <param name=\"callback(index, domElement)\" type=\"Function\">A function object that will be invoked for each element in the current set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousedown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseenter': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseleave': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousemove': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseover': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'multiple': function() {\n    /// <signature>\n    ///   <summary>Selects the combined results of all the specified selectors.</summary>\n    ///   <param name=\"selector1\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"selector2\" type=\"String\">Another valid selector.</param>\n    ///   <param name=\"selectorN\" type=\"String\">As many more valid selectors as you like.</param>\n    /// </signature>\n  },\n  'next': function() {\n    /// <signature>\n    ///   <summary>Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'next adjacent': function() {\n    /// <signature>\n    ///   <summary>Selects all next elements matching \"next\" that are immediately preceded by a sibling \"prev\".</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"next\" type=\"String\">A selector to match the element that is next to the first selector.</param>\n    /// </signature>\n  },\n  'next siblings': function() {\n    /// <signature>\n    ///   <summary>Selects all sibling elements that follow after the \"prev\" element, have the same parent, and match the filtering \"siblings\" selector.</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"siblings\" type=\"String\">A selector to filter elements that are the following siblings of the first selector.</param>\n    /// </signature>\n  },\n  'nextAll': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nextUntil': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'not': function() {\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more DOM elements to remove from the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nth-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-child(even), :nth-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-of-type(even), :nth-last-of-type(4n) )</param>\n    /// </signature>\n  },\n  'nth-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth child of their parent in relation to siblings with the same element name.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-of-type(even), :nth-of-type(4n) )</param>\n    /// </signature>\n  },\n  'odd': function() {\n    /// <summary>Selects odd elements, zero-indexed.  See also even.</summary>\n  },\n  'off': function() {\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, or just namespaces, such as \"click\", \"keydown.myPlugin\", or \".myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A handler function previously attached for the event(s), or the special value false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offset': function() {\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"coordinates\" type=\"PlainObject\">An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"function(index, coords)\" type=\"Function\">A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offsetParent': function() {\n    /// <summary>Get the closest ancestor element that is positioned.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'on': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'one': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing one or more JavaScript event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'only-child': function() {\n    /// <summary>Selects all elements that are the only child of their parent.</summary>\n  },\n  'only-of-type': function() {\n    /// <summary>Selects all elements that have no siblings with the same element name.</summary>\n  },\n  'outerHeight': function() {\n    /// <signature>\n    ///   <summary>Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without \"px\") representation of the value or null if called on an empty set of elements.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'outerWidth': function() {\n    /// <signature>\n    ///   <summary>Get the current computed width for the first element in the set of matched elements, including padding and border.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'parent': function() {\n    /// <signature>\n    ///   <summary>Get the parent of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parents': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parentsUntil': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'password': function() {\n    /// <summary>Selects all elements of type password.</summary>\n  },\n  'position': function() {\n    /// <summary>Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'prepend': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prependTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the beginning of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prev': function() {\n    /// <signature>\n    ///   <summary>Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevAll': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevUntil': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.</summary>\n    ///   <param name=\"type\" type=\"String\">The type of queue that needs to be observed.</param>\n    ///   <param name=\"target\" type=\"PlainObject\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'prop': function() {\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"value\" type=\"Boolean\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"function(index, oldPropertyValue)\" type=\"Function\">A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'pushStack': function() {\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <param name=\"name\" type=\"String\">The name of a jQuery method that generated the array of elements.</param>\n    ///   <param name=\"arguments\" type=\"Array\">The arguments that were passed in to the jQuery method (for serialization).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback( next )\" type=\"Function\">The new function to add to the queue, with a function to call that will dequeue the next item.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'radio': function() {\n    /// <summary>Selects all  elements of type radio.</summary>\n  },\n  'ready': function() {\n    /// <signature>\n    ///   <summary>Specify a function to execute when the DOM is fully loaded.</summary>\n    ///   <param name=\"handler\" type=\"Function\">A function to execute after the DOM is ready.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeAttr': function() {\n    /// <signature>\n    ///   <summary>Remove an attribute from each element in the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">An attribute to remove; as of version 1.7, it can be a space-separated list of attributes.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeClass': function() {\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be removed from the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, class)\" type=\"Function\">A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"list\" type=\"String\">An array or space-separated string naming the pieces of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeProp': function() {\n    /// <signature>\n    ///   <summary>Remove a property for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceAll': function() {\n    /// <signature>\n    ///   <summary>Replace each target element with the set of matched elements.</summary>\n    ///   <param name=\"target\" type=\"String\">A selector expression indicating which element(s) to replace.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceWith': function() {\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"newContent\" type=\"jQuery\">The content to insert. May be an HTML string, DOM element, or jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns content with which to replace the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'reset': function() {\n    /// <summary>Selects all elements of type reset.</summary>\n  },\n  'resize': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'root': function() {\n    /// <signature>\n    ///   <summary>Selects the element that is the root of the document.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'scroll': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollLeft': function() {\n    /// <signature>\n    ///   <summary>Set the current horizontal position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollTop': function() {\n    /// <signature>\n    ///   <summary>Set the current vertical position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'select': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'selected': function() {\n    /// <summary>Selects all elements that are selected.</summary>\n  },\n  'selector': function() {\n    /// <summary>A selector representing selector originally passed to jQuery().</summary>\n    /// <returns type=\"String\" />\n  },\n  'serialize': function() {\n    /// <summary>Encode a set of form elements as a string for submission.</summary>\n    /// <returns type=\"String\" />\n  },\n  'serializeArray': function() {\n    /// <summary>Encode a set of form elements as an array of names and values.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'show': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'siblings': function() {\n    /// <signature>\n    ///   <summary>Get the siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'size': function() {\n    /// <summary>Return the number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'slice': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to a subset specified by a range of indices.</summary>\n    ///   <param name=\"start\" type=\"Number\">An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set.</param>\n    ///   <param name=\"end\" type=\"Number\">An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideDown': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideUp': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'stop': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'submit': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'target': function() {\n    /// <summary>Selects the target element indicated by the fragment identifier of the document's URI.</summary>\n  },\n  'text': function() {\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"textString\" type=\"String\">A string of text to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"function(index, text)\" type=\"Function\">A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toArray': function() {\n    /// <summary>Retrieve all the DOM elements contained in the jQuery set, as an array.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'toggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"showOrHide\" type=\"Boolean\">A Boolean indicating whether to show or hide the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toggleClass': function() {\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"function(index, class, switch)\" type=\"Function\">A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'trigger': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"PlainObject\">Additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"event\" type=\"Event\">A jQuery.Event object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'triggerHandler': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers attached to an element for an event.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"Array\">An array of additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'unbind': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">The function that is to be no longer executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"false\" type=\"Boolean\">Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"event\" type=\"Object\">A JavaScript event object as passed to an event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'undelegate': function() {\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">An object of one or more event types and previously bound functions to unbind from them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"namespace\" type=\"String\">A string containing a namespace to unbind all events from.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unload': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">A plain object of data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unwrap': function() {\n    /// <summary>Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'val': function() {\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Array\">A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'visible': function() {\n    /// <summary>Selects all elements that are visible.</summary>\n  },\n  'width': function() {\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, width)\" type=\"Function\">A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrap': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapAll': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around all elements in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapInner': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"String\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\nintellisense.annotate(window, {\n  '$': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * jQuery JavaScript Library v1.10.2\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:48Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// Support: IE<10\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.10.2\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler\n\tcompleted = function( event ) {\n\n\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\t\tdetach();\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\t// Clean-up method for dom ready events\n\tdetach = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t\t} else {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\t\twindow.detachEvent( \"onload\", completed );\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( jQuery.support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn core_hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.10.2\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\n\t\t});\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val === undefined ?\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull :\n\t\tval;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function( support ) {\n\n\tvar all, a, input, select, fragment, opt, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Finish early in limited (non-browser) environments\n\tall = div.getElementsByTagName(\"*\") || [];\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !a || !a.style || !all.length ) {\n\t\treturn support;\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName(\"tbody\").length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName(\"link\").length;\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Make sure that element opacity exists\n\t// (IE uses filter instead)\n\t// Use a regex to work around a WebKit issue. See #5145\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!a.style.cssFloat;\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone = document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Will be defined later\n\tsupport.inlineBlockNeedsLayout = false;\n\tsupport.shrinkWrapBlocks = false;\n\tsupport.pixelPosition = false;\n\tsupport.deleteExpando = true;\n\tsupport.noCloneEvent = true;\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: IE<9\n\t// Iteration over object's inherited properties before its own.\n\tfor ( i in jQuery( support ) ) {\n\t\tbreak;\n\t}\n\tsupport.ownLast = i !== \"0\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior.\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t\t// Support: IE<8\n\t\t\t\tbody.style.zoom = 1;\n\t\t\t}\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})({});\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"applet\": true,\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\tdata = null,\n\t\t\ti = 0,\n\t\t\telem = this[0];\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf(\"data-\") === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar ret, hooks, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Use proper attribute retrieval(#6932, #12072)\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\telem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\t\tret = isXML ?\n\t\t\t\t\tundefined :\n\t\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\t\tnull;\n\t\t\tjQuery.expr.attrHandle[ name ] = fn;\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\tjQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =\n\t\t// Some attributes are constructed with empty-string values when not defined\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\t(ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t};\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ret.specified ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tcur = ret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\nvar iframe, getStyles, curCSS,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar len, styles,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Otherwise expose jQuery to the global object as usual\n\twindow.jQuery = window.$ = jQuery;\n\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n})( window );\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/modernizr-2.6.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton; http://www.modernizr.com/license/\n *\n * Includes matchMedia polyfill; Copyright (c) 2010 Filament Group, Inc; http://opensource.org/licenses/MIT\n *\n * Includes material adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js; Copyright 2009-2012 by contributors; http://opensource.org/licenses/MIT\n *\n * Includes material from css-support; Copyright (c) 2005-2012 Diego Perini; https://github.com/dperini/css-support/blob/master/LICENSE\n *\n * NUGET: END LICENSE TEXT */\n\n/*!\n * Modernizr v2.6.2\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.6.2',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node, docOverflow,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body || document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style id=\"s', mod, '\">', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = '';\n          //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n          fakeBody.style.overflow = 'hidden';\n          docOverflow = docElement.style.overflow;\n          docElement.style.overflow = 'hidden';\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      if ( !body ) {\n          fakeBody.parentNode.removeChild(fakeBody);\n          docElement.style.overflow = docOverflow;\n      } else {\n          div.parentNode.removeChild(div);\n      }\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq).matches;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProp = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n\n        if (typeof target != \"function\") {\n            throw new TypeError();\n        }\n\n        var args = slice.call(arguments, 1),\n            bound = function () {\n\n            if (this instanceof bound) {\n\n              var F = function(){};\n              F.prototype = target.prototype;\n              var self = new F();\n\n              var result = target.apply(\n                  self,\n                  args.concat(slice.call(arguments))\n              );\n              if (Object(result) === result) {\n                  return result;\n              }\n              return self;\n\n            } else {\n\n              return target.apply(\n                  that,\n                  args.concat(slice.call(arguments))\n              );\n\n            }\n\n        };\n\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    // Because the testing of the CSS property names (with \"-\", as\n    // opposed to the camelCase DOM properties) is non-portable and\n    // non-standard but works in WebKit and IE (but not Gecko or Opera),\n    // we explicitly reject properties with dashes so that authors\n    // developing in WebKit or IE first don't end up with\n    // browser-specific content by accident.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            var prop = props[i];\n            if ( !contains(prop, \"-\") && mStyle[prop] !== undefined ) {\n                return prefixed == 'pfx' ? prop : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexWrap');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return (/(url\\s*\\(.*?){3}/).test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return (/^0.55$/).test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   daneden.me/2011/12/putting-up-with-androids-bullshit/\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1) +\n             // standard syntax             // trailing 'background-image:'\n              prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.getElementById('smodernizr'),\n              sheet = style.sheet || style.styleSheet,\n              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:\"',smile,'\";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 3;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProp(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProp( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (typeof enableClasses !== \"undefined\" && enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n    ;(function(window, document) {\n    /*jshint evil:true */\n      /** Preset options */\n      var options = window.html5 || {};\n\n      /** Used to skip problem elements */\n      var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n      /** Not all elements can be cloned in IE **/\n      var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n      /** Detect whether the browser supports default html5 styles */\n      var supportsHtml5Styles;\n\n      /** Name of the expando, to work with multiple documents or to re-shiv one document */\n      var expando = '_html5shiv';\n\n      /** The id for the the documents expando */\n      var expanID = 0;\n\n      /** Cached data for each document */\n      var expandoData = {};\n\n      /** Detect whether the browser supports unknown elements */\n      var supportsUnknownElements;\n\n      (function() {\n        try {\n            var a = document.createElement('a');\n            a.innerHTML = '<xyz></xyz>';\n            //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n            supportsHtml5Styles = ('hidden' in a);\n\n            supportsUnknownElements = a.childNodes.length == 1 || (function() {\n              // assign a false positive if unable to shiv\n              (document.createElement)('a');\n              var frag = document.createDocumentFragment();\n              return (\n                typeof frag.cloneNode == 'undefined' ||\n                typeof frag.createDocumentFragment == 'undefined' ||\n                typeof frag.createElement == 'undefined'\n              );\n            }());\n        } catch(e) {\n          supportsHtml5Styles = true;\n          supportsUnknownElements = true;\n        }\n\n      }());\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n\n        /**\n       * Returns the data associated to the given document\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @returns {Object} An object of data.\n       */\n      function getExpandoData(ownerDocument) {\n        var data = expandoData[ownerDocument[expando]];\n        if (!data) {\n            data = {};\n            expanID++;\n            ownerDocument[expando] = expanID;\n            expandoData[expanID] = data;\n        }\n        return data;\n      }\n\n      /**\n       * returns a shived element for the given nodeName and document\n       * @memberOf html5\n       * @param {String} nodeName name of the element\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived element.\n       */\n      function createElement(nodeName, ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createElement(nodeName);\n        }\n        if (!data) {\n            data = getExpandoData(ownerDocument);\n        }\n        var node;\n\n        if (data.cache[nodeName]) {\n            node = data.cache[nodeName].cloneNode();\n        } else if (saveClones.test(nodeName)) {\n            node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n        } else {\n            node = data.createElem(nodeName);\n        }\n\n        // Avoid adding some elements to fragments in IE < 9 because\n        // * Attributes like `name` or `type` cannot be set/changed once an element\n        //   is inserted into a document/fragment\n        // * Link elements with `src` attributes that are inaccessible, as with\n        //   a 403 response, will cause the tab/window to crash\n        // * Script elements appended to fragments will execute when their `src`\n        //   or `text` property is set\n        return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;\n      }\n\n      /**\n       * returns a shived DocumentFragment for the given document\n       * @memberOf html5\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived DocumentFragment.\n       */\n      function createDocumentFragment(ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createDocumentFragment();\n        }\n        data = data || getExpandoData(ownerDocument);\n        var clone = data.frag.cloneNode(),\n            i = 0,\n            elems = getElements(),\n            l = elems.length;\n        for(;i<l;i++){\n            clone.createElement(elems[i]);\n        }\n        return clone;\n      }\n\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       * @param {Object} data of the document.\n       */\n      function shivMethods(ownerDocument, data) {\n        if (!data.cache) {\n            data.cache = {};\n            data.createElem = ownerDocument.createElement;\n            data.createFrag = ownerDocument.createDocumentFragment;\n            data.frag = data.createFrag();\n        }\n\n\n        ownerDocument.createElement = function(nodeName) {\n          //abort shiv\n          if (!html5.shivMethods) {\n              return data.createElem(nodeName);\n          }\n          return createElement(nodeName, ownerDocument, data);\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n          'var n=f.cloneNode(),c=n.createElement;' +\n          'h.shivMethods&&(' +\n            // unroll the `createElement` calls\n            getElements().join().replace(/\\w+/g, function(nodeName) {\n              data.createElem(nodeName);\n              data.frag.createElement(nodeName);\n              return 'c(\"' + nodeName + '\")';\n            }) +\n          ');return n}'\n        )(html5, data.frag);\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n      function shivDocument(ownerDocument) {\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        var data = getExpandoData(ownerDocument);\n\n        if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n          data.hasCSS = !!addStyleSheet(ownerDocument,\n            // corrects block display not defined in IE6/7/8/9\n            'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +\n            // adds styling not present in IE6/7/8/9\n            'mark{background:#FF0;color:#000}'\n          );\n        }\n        if (!supportsUnknownElements) {\n          shivMethods(ownerDocument, data);\n        }\n        return ownerDocument;\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n      var html5 = {\n\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': (options.shivCSS !== false),\n\n        /**\n         * Is equal to true if a browser supports creating unknown/HTML5 elements\n         * @memberOf html5\n         * @type boolean\n         */\n        'supportsUnknownElements': supportsUnknownElements,\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': (options.shivMethods !== false),\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument,\n\n        //creates a shived element\n        createElement: createElement,\n\n        //creates a shived documentFragment\n        createDocumentFragment: createDocumentFragment\n      };\n\n      /*--------------------------------------------------------------------------*/\n\n      // expose html5\n      window.html5 = html5;\n\n      // shiv the document\n      shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Scripts/respond.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\nwindow.matchMedia = window.matchMedia || (function(doc, undefined){\n  \n  var bool,\n      docElem  = doc.documentElement,\n      refNode  = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement('body'),\n      div      = doc.createElement('div');\n  \n  div.id = 'mq-test-1';\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n  \n  return function(q){\n    \n    div.innerHTML = '&shy;<style media=\"'+q+'\"> #mq-test-1 { width: 42px; }</style>';\n    \n    docElem.insertBefore(fakeBody, refNode);\n    bool = div.offsetWidth == 42;  \n    docElem.removeChild(fakeBody);\n    \n    return { matches: bool, media: q };\n  };\n  \n})(document);\n\n\n\n\n/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\t//exposed namespace\n\twin.respond\t\t= {};\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update\t= function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){ return; }\n\t\n\t//define vars\n\tvar doc \t\t\t= win.document,\n\t\tdocElem \t\t= doc.documentElement,\n\t\tmediastyles\t\t= [],\n\t\trules\t\t\t= [],\n\t\tappendedEls \t= [],\n\t\tparsedSheets \t= {},\n\t\tresizeThrottle\t= 30,\n\t\thead \t\t\t= doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase\t\t\t= doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks\t\t\t= head.getElementsByTagName( \"link\" ),\n\t\trequestQueue\t= [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS\t\t\t= function(){\n\t\t\tvar sheets \t= links,\n\t\t\t\tsl \t\t= sheets.length,\n\t\t\t\ti\t\t= 0,\n\t\t\t\t//vars for loop:\n\t\t\t\tsheet, href, media, isCSS;\n\n\t\t\tfor( ; i < sl; i++ ){\n\t\t\t\tsheet\t= sheets[ i ],\n\t\t\t\thref\t= sheet.href,\n\t\t\t\tmedia\t= sheet.media,\n\t\t\t\tisCSS\t= sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base)\n\t\t\t\t\t\t\t|| href.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\t\t\t\t\tmakeRequests();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate\t\t\t= function( styles, href, media ){\n\t\t\tvar qs\t\t\t= styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql\t\t\t= qs && qs.length || 0,\n\t\t\t\t//try to get CSS path\n\t\t\t\thref\t\t= href.substring( 0, href.lastIndexOf( \"/\" )),\n\t\t\t\trepUrls\t\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia\t= !ql && media,\n\t\t\t\t//vars used in loop\n\t\t\t\ti\t\t\t= 0,\n\t\t\t\tj, fullq, thisq, eachq, eql;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\t\t\t\n\n\t\t\tfor( ; i < ql; i++ ){\n\t\t\t\tj\t= 0;\n\t\t\t\t\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq\t= qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq\t= fullq.split( \",\" );\n\t\t\t\teql\t\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( ; j < eql; j++ ){\n\t\t\t\t\tthisq\t= eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia\t: thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules\t: rules.length - 1,\n\t\t\t\t\t\thasquery: thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw\t: thisq.match( /\\(min\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw\t: thisq.match( /\\(max\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \t\n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue\t\t= function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia\t\t\t= function( fromResize ){\n\t\t\tvar name\t\t= \"clientWidth\",\n\t\t\t\tdocElemProp\t= docElem[ name ],\n\t\t\t\tcurrWidth \t= doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink\t= links[ links.length-1 ],\n\t\t\t\tnow \t\t= (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\tclearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall\t= now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\tminnull = min === null,\n\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\tem = \"em\";\n\t\t\t\t\n\t\t\t\tif( !!min ){\n\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\tif( !!max ){\n\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var i in appendedEls ){\n\t\t\t\tif( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){\n\t\t\t\t\thead.removeChild( appendedEls[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var i in styleBlocks ){\n\t\t\t\tvar ss\t\t= doc.createElement( \"style\" ),\n\t\t\t\t\tcss\t\t= styleBlocks[ i ].join( \"\\n\" );\n\t\t\t\t\n\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\tss.media\t= i;\n\t\t\t\t\n\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\n\t\t\t\tif ( ss.styleSheet ){ \n\t\t        \tss.styleSheet.cssText = css;\n\t\t        } \n\t\t        else {\n\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t        }\n\t\t        \n\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\tappendedEls.push( ss );\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState != 4 || req.status != 200 && req.status != 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t}\n\t\t\tif ( req.readyState == 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx",
    "content": "﻿<%@ Page Title=\"Sign Up\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"SignUp.aspx.cs\" Inherits=\"ProductLaunch.Web.SignUp\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Sign me up!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Just a few details</h2>\n        </div>\n    </div>\n\n    <div class=\"form-group\">\n        <label for=\"txtFirstName\">First Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtFirstName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtLastName\">Last Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtLastName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtEmail\">Email Address</label>\n        <asp:TextBox class=\"form-control\" id=\"txtEmail\" runat=\"server\" />\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlCountry\">Country</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlCountry\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtCompanyName\">Company Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtCompanyName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlRole\">Your Main Role</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlRole\" runat=\"server\" />\n    </div>\n\n    <asp:Button class=\"btn btn-default\" runat=\"server\" Text=\"Go!\" ID=\"btnGo\" OnClick=\"btnGo_Click\" />\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing ProductLaunch.Model;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SignUp : Page\n    {\n        private static Dictionary<string, Country> _Countries;\n        private static Dictionary<string, Role> _Roles;\n\n        public static void PreloadStaticDataCache()\n        {\n            _Countries = new Dictionary<string, Country>();\n            _Roles = new Dictionary<string, Role>();\n            using (var context = new ProductLaunchContext())\n            {\n                foreach (var country in context.Countries.OrderBy(x => x.CountryName))\n                {\n                    _Countries[country.CountryCode] = country;\n                }\n                foreach (var role in context.Roles.OrderBy(x => x.RoleName))\n                {\n                    _Roles[role.RoleCode] = role;\n                }\n            }\n        }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            if (!Page.IsPostBack)\n            {\n                PopulateRoles();\n                PopulateCountries();\n            }\n        }\n\n        private void PopulateRoles()\n        {\n            ddlRole.Items.Clear();\n            ddlRole.Items.AddRange(_Roles.Select(x => new ListItem(x.Value.RoleName, x.Key)).ToArray()); \n        }\n\n        private void PopulateCountries()\n        {\n            ddlCountry.Items.Clear();\n            ddlCountry.Items.AddRange(_Countries.Select(x => new ListItem(x.Value.CountryName, x.Key)).ToArray());\n        }\n\n        protected void btnGo_Click(object sender, EventArgs e)\n        {\n            var country = _Countries[ddlCountry.SelectedValue];\n            var role = _Roles[ddlRole.SelectedValue];\n\n            var prospect = new Prospect\n            {\n                CompanyName = txtCompanyName.Text,\n                EmailAddress = txtEmail.Text,\n                FirstName = txtFirstName.Text,\n                LastName = txtLastName.Text,\n                Country = country,\n                Role = role\n            };\n\n            using (var context = new ProductLaunchContext())\n            {\n                //reload child objects:\n                prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n                prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n\n            Server.Transfer(\"ThankYou.aspx\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SignUp {\n        \n        /// <summary>\n        /// txtFirstName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtFirstName;\n        \n        /// <summary>\n        /// txtLastName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtLastName;\n        \n        /// <summary>\n        /// txtEmail control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtEmail;\n        \n        /// <summary>\n        /// ddlCountry control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlCountry;\n        \n        /// <summary>\n        /// txtCompanyName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtCompanyName;\n        \n        /// <summary>\n        /// ddlRole control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlRole;\n        \n        /// <summary>\n        /// btnGo control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.Button btnGo;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Site.Master",
    "content": "﻿<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.master.cs\" Inherits=\"ProductLaunch.Web.SiteMaster\" %>\n\n<!DOCTYPE html>\n\n<html lang=\"en\">\n<head runat=\"server\">\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title><%: Page.Title %></title>\n\n    <asp:PlaceHolder runat=\"server\">\n        <%: Scripts.Render(\"~/bundles/modernizr\") %>\n    </asp:PlaceHolder>\n\n    <webopt:bundlereference runat=\"server\" path=\"~/Content/css\" />\n    <link href=\"~/favicon.ico\" rel=\"shortcut icon\" type=\"image/x-icon\" />\n\n</head>\n<body>\n    <form runat=\"server\">\n        <asp:ScriptManager runat=\"server\">\n            <Scripts>\n                <%--To learn more about bundling scripts in ScriptManager see http://go.microsoft.com/fwlink/?LinkID=301884 --%>\n                <%--Framework Scripts--%>\n                <asp:ScriptReference Name=\"MsAjaxBundle\" />\n                <asp:ScriptReference Name=\"jquery\" />\n                <asp:ScriptReference Name=\"bootstrap\" />\n                <asp:ScriptReference Name=\"respond\" />\n                <asp:ScriptReference Name=\"WebForms.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebForms.js\" />\n                <asp:ScriptReference Name=\"WebUIValidation.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebUIValidation.js\" />\n                <asp:ScriptReference Name=\"MenuStandards.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/MenuStandards.js\" />\n                <asp:ScriptReference Name=\"GridView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/GridView.js\" />\n                <asp:ScriptReference Name=\"DetailsView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/DetailsView.js\" />\n                <asp:ScriptReference Name=\"TreeView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/TreeView.js\" />\n                <asp:ScriptReference Name=\"WebParts.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebParts.js\" />\n                <asp:ScriptReference Name=\"Focus.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/Focus.js\" />\n                <asp:ScriptReference Name=\"WebFormsBundle\" />\n                <%--Site Scripts--%>\n            </Scripts>\n        </asp:ScriptManager>\n\n        <div class=\"container body-content\">\n            <asp:ContentPlaceHolder ID=\"MainContent\" runat=\"server\">\n            </asp:ContentPlaceHolder>\n            <hr />\n            <footer>\n                <p>&copy; <%: DateTime.Now.Year %> - Company, Inc.</p>\n            </footer>\n        </div>\n\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Site.Master.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SiteMaster : MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Site.Master.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SiteMaster {\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master",
    "content": "<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.Mobile.master.cs\" Inherits=\"ProductLaunch.Web.Site_Mobile\" %>\n<%@ Register Src=\"~/ViewSwitcher.ascx\" TagPrefix=\"friendlyUrls\" TagName=\"ViewSwitcher\" %>\n\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head runat=\"server\">\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title></title>\n    <asp:ContentPlaceHolder runat=\"server\" ID=\"HeadContent\" />\n</head>\n<body>\n    <form id=\"form1\" runat=\"server\">\n    <div>\n        <h1>Mobile Master Page</h1>\n        <asp:ContentPlaceHolder runat=\"server\" ID=\"FeaturedContent\" />\n        <section class=\"content-wrapper main-content clear-fix\">\n            <asp:ContentPlaceHolder runat=\"server\" ID=\"MainContent\" />\n        </section>\n        <friendlyUrls:ViewSwitcher runat=\"server\" />\n    </div>\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Site_Mobile : System.Web.UI.MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class Site_Mobile {\n        \n        /// <summary>\n        /// HeadContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder HeadContent;\n        \n        /// <summary>\n        /// form1 control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.HtmlControls.HtmlForm form1;\n        \n        /// <summary>\n        /// FeaturedContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder FeaturedContent;\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx",
    "content": "﻿<%@ Page Title=\"Ta\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" CodeBehind=\"ThankYou.aspx.cs\" Inherits=\"ProductLaunch.Web.ThankYou\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Thank you!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Good work on signing up. We'll be in touch.</h2>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ThankYou : System.Web.UI.Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ThankYou {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx",
    "content": "<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"ViewSwitcher.ascx.cs\" Inherits=\"ProductLaunch.Web.ViewSwitcher\" %>\n<div id=\"viewSwitcher\">\n    <%: CurrentView %> view | <a href=\"<%: SwitchUrl %>\" data-ajax=\"false\">Switch to <%: AlternateView %></a>\n</div>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Routing;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\nusing Microsoft.AspNet.FriendlyUrls.Resolvers;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ViewSwitcher : System.Web.UI.UserControl\n    {\n        protected string CurrentView { get; private set; }\n\n        protected string AlternateView { get; private set; }\n\n        protected string SwitchUrl { get; private set; }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            // Determine current view\n            var isMobile = WebFormsFriendlyUrlResolver.IsMobileView(new HttpContextWrapper(Context));\n            CurrentView = isMobile ? \"Mobile\" : \"Desktop\";\n\n            // Determine alternate view\n            AlternateView = isMobile ? \"Desktop\" : \"Mobile\";\n\n            // Create switch URL from the route, e.g. ~/__FriendlyUrls_SwitchView/Mobile?ReturnUrl=/Page\n            var switchViewRouteName = \"AspNet.FriendlyUrls.SwitchView\";\n            var switchViewRoute = RouteTable.Routes[switchViewRouteName];\n            if (switchViewRoute == null)\n            {\n                // Friendly URLs is not enabled or the name of the switch view route is out of sync\n                this.Visible = false;\n                return;\n            }\n            var url = GetRouteUrl(switchViewRouteName, new { view = AlternateView, __FriendlyUrls_SwitchViews = true });\n            url += \"?ReturnUrl=\" + HttpUtility.UrlEncode(Request.RawUrl);\n            SwitchUrl = url;\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ViewSwitcher {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" \n         providerName=\"System.Data.SqlClient\" \n         connectionString=\"Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;AttachDbFilename=|DataDirectory|\\ProductLaunch.mdf\"/>\n  </connectionStrings>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\" />\n    <customErrors mode=\"Off\"/>\n    <httpRuntime targetFramework=\"4.5.2\" />\n    <pages>\n      <namespaces>\n        <add namespace=\"System.Web.Optimization\" />\n      </namespaces>\n      <controls>\n        <add assembly=\"Microsoft.AspNet.Web.Optimization.WebForms\" namespace=\"Microsoft.AspNet.Web.Optimization.WebForms\" tagPrefix=\"webopt\" />\n      </controls>\n    </pages>     \n  </system.web>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"WebGrease\" culture=\"neutral\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.5.2.14234\" newVersion=\"1.5.2.14234\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\" />\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.Web/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Antlr\" version=\"3.4.1.9004\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.bootstrap\" version=\"3.0.0\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"bootstrap\" version=\"3.4.1\" targetFramework=\"net452\" />\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls.Core\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.MSAjax\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.WebForms\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization.WebForms\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.Web.Infrastructure\" version=\"1.0.0.0\" targetFramework=\"net452\" />\n  <package id=\"Modernizr\" version=\"2.6.2\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n  <package id=\"Respond\" version=\"1.2.0\" targetFramework=\"net452\" />\n  <package id=\"WebGrease\" version=\"1.5.2\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/ProductLaunch.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Web\", \"ProductLaunch.Web\\ProductLaunch.Web.csproj\", \"{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model\", \"ProductLaunch.Model\\ProductLaunch.Model.csproj\", \"{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Entities\", \"ProductLaunch.Entities\\ProductLaunch.Entities.csproj\", \"{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tests\", \"Tests\", \"{4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model.Tests\", \"ProductLaunch.Model.Tests\\ProductLaunch.Model.Tests.csproj\", \"{49FD06C3-CD52-425A-866D-831D09268CD0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.EndToEndTests\", \"ProductLaunch.EndToEndTests\\ProductLaunch.EndToEndTests.csproj\", \"{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/ProductLaunch/build.ps1",
    "content": "$nuGetPath = \"C:\\Chocolatey\\bin\\nuget.bat\"\n$msBuildPath = \"C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe\"\n\ncd c:\\src\n& $nuGetPath restore .\\ProductLaunch.sln\n& $msBuildPath .\\ProductLaunch.Web\\ProductLaunch.Web.csproj /p:OutputPath=c:\\out\\web\\ProductLaunchWeb /p:DeployOnBuild=true /p:VSToolsPath=C:\\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\\tools\\VSToolsPath"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/build.ps1",
    "content": "\ndocker build `\n -t dockersamples/modernize-aspnet-builder `\n $pwd\\docker\\builder\n\ndocker run --rm `\n -v $pwd\\ProductLaunch:c:\\src `\n -v $pwd\\docker:c:\\out `\n dockersamples/modernize-aspnet-builder `\n C:\\src\\build.ps1 \n\ndocker build `\n -t dockersamples/modernize-aspnet-web:v1 `\n $pwd\\docker\\web"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/docker/builder/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 14.0.25420.1 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force; `\n    Install-Package -Name webdeploy -RequiredVersion 3.5.2 -Force\n\nRUN Install-Package -Name nuget.commandline -RequiredVersion 3.4.3 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install MSBuild.Microsoft.VisualStudio.Web.targets -Version 14.0.0.3\n\nENTRYPOINT [\"powershell\"]"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/docker/web/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\nRUN Add-WindowsFeature Web-server, NET-Framework-45-ASPNET, Web-Asp-Net45; `\n    Remove-Website -Name 'Default Web Site'    \n\nRUN New-Item -Path 'C:\\web-app' -Type Directory; `\n    New-Website -Name 'web-app' -PhysicalPath 'C:\\web-app' -Port 80 -Force\n\nEXPOSE 80\n\nADD https://github.com/Microsoft/iis-docker/raw/master/windowsservercore/ServiceMonitor.exe C:/ServiceMonitor.exe\nENTRYPOINT [\"C:\\\\ServiceMonitor.exe\", \"w3svc\"]\n\nCOPY ProductLaunchWeb/_PublishedWebsites/ProductLaunch.Web /web-app\nCOPY Web.config /web-app/Web.config"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v1-src/docker/web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" \n         providerName=\"System.Data.SqlClient\" \n         connectionString=\"Server=sql-server;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\"/>\n  </connectionStrings>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\" />\n    <customErrors mode=\"Off\"/>\n    <httpRuntime targetFramework=\"4.5.2\" />\n    <pages>\n      <namespaces>\n        <add namespace=\"System.Web.Optimization\" />\n      </namespaces>\n      <controls>\n        <add assembly=\"Microsoft.AspNet.Web.Optimization.WebForms\" namespace=\"Microsoft.AspNet.Web.Optimization.WebForms\" tagPrefix=\"webopt\" />\n      </controls>\n    </pages>     \n  </system.web>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"WebGrease\" culture=\"neutral\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.5.2.14234\" newVersion=\"1.5.2.14234\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\" />\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Core/Env.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Core\n{\n    public class Env\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string DbConnectionString { get { return Get(\"DB_CONNECTION_STRING\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable);\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Core/ProductLaunch.Core.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{35BD1196-DDCB-41FA-98C5-C8116D749446}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Core</RootNamespace>\n    <AssemblyName>ProductLaunch.Core</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Env.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Core/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Core\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Core\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"35bd1196-ddcb-41fa-98c5-c8116d749446\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <section name=\"specFlow\" type=\"TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow\" />\n  </configSections>\n  <specFlow>\n    <unitTestProvider name=\"MsTest\" />\n  </specFlow>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/ProductLaunch.EndToEndTests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.EndToEndTests</RootNamespace>\n    <AssemblyName>ProductLaunch.EndToEndTests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"TechTalk.SpecFlow, Version=2.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SpecFlow.2.1.0\\lib\\net45\\TechTalk.SpecFlow.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.WebDriver.3.0.1\\lib\\net40\\WebDriver.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver.Support, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.Support.3.0.1\\lib\\net40\\WebDriver.Support.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\" />\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"ProspectSignUp.feature.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>ProspectSignUp.feature</DependentUpon>\n    </Compile>\n    <Compile Include=\"ProspectSignUpSteps.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"packages.config\" />\n    <None Include=\"ProspectSignUp.feature\">\n      <Generator>SpecFlowSingleFileGenerator</Generator>\n      <LastGenOutput>ProspectSignUp.feature.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets\" Condition=\"Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"d47cf813-de0e-4cc4-b9ed-8ee4b6f14869\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature",
    "content": "﻿Feature: Prospect Sign Up\n\tAs a prospect interested in the product launch\n\tI want to sign up for notifications\n\tSo that I can be updated with news\n\nScenario Outline: Sign Up with Valid Details\n\tGiven I browse to the Sign Up Page at \"172.31.126.66\"\n\tAnd I enter details '<FirstName>' '<LastName>' '<EmailAddress>' '<CompanyName>' '<Country>' '<Role>'\n\tWhen I press Go\n\tThen I should see the Thank You page\n\nExamples:\n\t| FirstName | LastName | EmailAddress           | CompanyName   | Country        | Role           |\n\t| Prospect  | A        | a.prospect@company.com | Company, Inc. | United States  | Decision Maker |\n\t| Prospect  | B        | b.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | C        | c.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | D        | d.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | E        | e.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | F        | f.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | G        | g.prospect@company.com | Company, Inc. | United States  | Engineer       |\n\t| Prospect  | H        | h.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | I        | i.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | J        | j.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | K        | k.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | L        | l.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | M        | m.prospect@company.com | Company, Inc. | Sweden         | Architect      |\n\t| Prospect  | N        | n.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | O        | o.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | P        | p.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | Q        | q.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | R        | r.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | S        | s.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | T        | t.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | U        | u.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | V        | v.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | W        | w.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | X        | x.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | Y        | y.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | Z        | z.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature.cs",
    "content": "﻿// ------------------------------------------------------------------------------\n//  <auto-generated>\n//      This code was generated by SpecFlow (http://www.specflow.org/).\n//      SpecFlow Version:2.1.0.0\n//      SpecFlow Generator Version:2.0.0.0\n// \n//      Changes to this file may cause incorrect behavior and will be lost if\n//      the code is regenerated.\n//  </auto-generated>\n// ------------------------------------------------------------------------------\n#region Designer generated code\n#pragma warning disable\nnamespace ProductLaunch.EndToEndTests\n{\n    using TechTalk.SpecFlow;\n    \n    \n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"TechTalk.SpecFlow\", \"2.1.0.0\")]\n    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()]\n    public partial class ProspectSignUpFeature\n    {\n        \n        private static TechTalk.SpecFlow.ITestRunner testRunner;\n        \n#line 1 \"ProspectSignUp.feature\"\n#line hidden\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()]\n        public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext)\n        {\n            testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(null, 0);\n            TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo(\"en-US\"), \"Prospect Sign Up\", \"\\tAs a prospect interested in the product launch\\r\\n\\tI want to sign up for notificat\" +\n                    \"ions\\r\\n\\tSo that I can be updated with news\", ProgrammingLanguage.CSharp, ((string[])(null)));\n            testRunner.OnFeatureStart(featureInfo);\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()]\n        public static void FeatureTearDown()\n        {\n            testRunner.OnFeatureEnd();\n            testRunner = null;\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()]\n        public virtual void TestInitialize()\n        {\n            if (((testRunner.FeatureContext != null) \n                        && (testRunner.FeatureContext.FeatureInfo.Title != \"Prospect Sign Up\")))\n            {\n                ProductLaunch.EndToEndTests.ProspectSignUpFeature.FeatureSetup(null);\n            }\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()]\n        public virtual void ScenarioTearDown()\n        {\n            testRunner.OnScenarioEnd();\n        }\n        \n        public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)\n        {\n            testRunner.OnScenarioStart(scenarioInfo);\n        }\n        \n        public virtual void ScenarioCleanup()\n        {\n            testRunner.CollectScenarioErrors();\n        }\n        \n        public virtual void SignUpWithValidDetails(string firstName, string lastName, string emailAddress, string companyName, string country, string role, string[] exampleTags)\n        {\n            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo(\"Sign Up with Valid Details\", exampleTags);\n#line 6\nthis.ScenarioSetup(scenarioInfo);\n#line 7\n testRunner.Given(\"I browse to the Sign Up Page at \\\"172.31.126.66\\\"\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Given \");\n#line 8\n testRunner.And(string.Format(\"I enter details \\'{0}\\' \\'{1}\\' \\'{2}\\' \\'{3}\\' \\'{4}\\' \\'{5}\\'\", firstName, lastName, emailAddress, companyName, country, role), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"And \");\n#line 9\n testRunner.When(\"I press Go\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"When \");\n#line 10\n testRunner.Then(\"I should see the Thank You page\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Then \");\n#line hidden\n            this.ScenarioCleanup();\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"A\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"a.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant0()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"A\", \"a.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"B\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"b.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant1()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"B\", \"b.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"C\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"c.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant2()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"C\", \"c.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"D\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"d.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant3()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"D\", \"d.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"E\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"e.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant4()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"E\", \"e.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"F\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"f.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant5()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"F\", \"f.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"G\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"g.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Engineer\")]\n        public virtual void SignUpWithValidDetails_Variant6()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"G\", \"g.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Engineer\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"H\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"h.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant7()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"H\", \"h.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"I\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"i.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant8()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"I\", \"i.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"J\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"j.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant9()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"J\", \"j.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"K\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"k.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant10()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"K\", \"k.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"L\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"l.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant11()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"L\", \"l.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"M\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"m.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant12()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"M\", \"m.prospect@company.com\", \"Company, Inc.\", \"Sweden\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"N\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"n.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant13()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"N\", \"n.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"O\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"o.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant14()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"O\", \"o.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"P\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"p.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant15()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"P\", \"p.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Q\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"q.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant16()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Q\", \"q.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"R\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"r.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant17()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"R\", \"r.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"S\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"s.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant18()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"S\", \"s.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"T\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"t.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant19()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"T\", \"t.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"U\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"u.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant20()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"U\", \"u.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"V\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"v.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant21()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"V\", \"v.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"W\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"w.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant22()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"W\", \"w.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"X\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"x.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant23()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"X\", \"x.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Y\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"y.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant24()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Y\", \"y.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Z\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"z.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant25()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Z\", \"z.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n    }\n}\n#pragma warning restore\n#endregion\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUpSteps.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Firefox;\nusing OpenQA.Selenium.Support.UI;\nusing System;\nusing System.Threading;\nusing TechTalk.SpecFlow;\n\nnamespace ProductLaunch.EndToEndTests\n{\n    [Binding]\n    public class ProspectSignUpSteps\n    {\n        private static IWebDriver _Driver;\n\n        [BeforeFeature]\n        public static void Setup()\n        {\n            _Driver = new FirefoxDriver();\n        }\n\n        [AfterFeature]\n        public static void TearDown()\n        {\n            _Driver.Close();\n            _Driver.Dispose();\n        }\n\n        [Given(@\"I browse to the Sign Up Page at \"\"(.*)\"\"\")]\n        public void GivenIBrowseToTheSignUpPageAt(string host)\n        {\n            var url = $\"http://{host}/SignUp\";            \n            _Driver.Navigate().GoToUrl(url);\n        }\n        \n        [Given(@\"I enter details '(.*)' '(.*)' '(.*)' '(.*)' '(.*)' '(.*)'\")]\n        public void GivenIEnterDetails(string firstName, string lastName, string emailAddress, \n                                       string companyName, string country, string role)\n        {            \n            _Driver.FindElement(By.Id(\"MainContent_txtFirstName\")).SendKeys(firstName);\n            _Driver.FindElement(By.Id(\"MainContent_txtLastName\")).SendKeys(lastName);\n            _Driver.FindElement(By.Id(\"MainContent_txtEmail\")).SendKeys(emailAddress);\n            _Driver.FindElement(By.Id(\"MainContent_txtCompanyName\")).SendKeys(companyName);\n\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlCountry\"))).SelectByText(country);\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlRole\"))).SelectByText(role);\n        }\n\n        [When(@\"I press Go\")]\n        public void WhenIPressGo()\n        {\n            var goButton = _Driver.FindElement(By.Id(\"MainContent_btnGo\"));\n            goButton.Click();\n        }\n        \n        [Then(@\"I should see the Thank You page\")]\n        public void ThenIShouldSeeTheThankYouPage()\n        {\n            //HACK\n            Thread.Sleep(1500);\n            Assert.AreEqual(\"Ta\", _Driver.Title);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.EndToEndTests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Selenium.Firefox.WebDriver\" version=\"0.13.0\" targetFramework=\"net452\" />\n  <package id=\"Selenium.Support\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"Selenium.WebDriver\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"SpecFlow\" version=\"2.1.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Entities/Country.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Country\n    {\n        public string CountryCode { get; set; }\n\n        public string CountryName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Entities/ProductLaunch.Entities.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Entities</RootNamespace>\n    <AssemblyName>ProductLaunch.Entities</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Country.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Prospect.cs\" />\n    <Compile Include=\"Role.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Entities/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Entities\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Entities\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Entities/Prospect.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Prospect\n    {\n        public int ProspectId { get; set; }\n        \n        public string FirstName { get; set; }\n        \n        public string LastName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public Role Role { get; set; }\n\n        public Country Country { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Entities/Role.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Role\n    {\n        public string RoleCode { get; set; }\n\n        public string RoleName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string ElasticsearchUrl { get { return Get(\"ELASTICSEARCH_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Documents/Prospect.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Documents\n{\n    public class Prospect\n    {\n        public string FullName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public string RoleName { get; set; }\n\n        public string CountryName { get; set; }\n\n        public DateTime SignUpDate { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Indexer/Index.cs",
    "content": "using Nest;\nusing ProductLaunch.MessageHandlers.IndexProspect.Documents;\nusing System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Indexer\n{\n    public class Index\n    {\n        public static void Setup()\n        {\n            var node = new Uri(Config.ElasticsearchUrl);\n            var settings = new ConnectionSettings(node);\n            var client = new ElasticClient(settings);\n            client.CreateIndex(\"prospects\");\n        }        \n\n        public static void CreateDocument(Prospect prospect)\n        {\n            try\n            {\n                var node = new Uri(Config.ElasticsearchUrl);\n                var client = new ElasticClient(node);                \n                client.Index(prospect, idx => idx.Index(\"prospects\"));\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine($\"Index prospect FAILED, email address: {prospect.EmailAddress}, ex: {ex}\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/ProductLaunch.MessageHandlers.IndexProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1354B5AB-C990-41EA-9F68-5F9933D83700}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.IndexProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.IndexProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Elasticsearch.Net, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Elasticsearch.Net.5.0.1\\lib\\net45\\Elasticsearch.Net.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Nest, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NEST.5.0.1\\lib\\net45\\Nest.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.9.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Documents\\Prospect.cs\" />\n    <Compile Include=\"Indexer\\Index.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{e02eff91-8c52-4dce-8279-3fd1ee0659ef}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.MessageHandlers.IndexProspect.Indexer;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing System;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Initializing Elasticsearch. url: {Config.ElasticsearchUrl}\");\n            Index.Setup();\n\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += IndexProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void IndexProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Indexing prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = new Documents.Prospect\n            {\n                CompanyName = eventMessage.Prospect.CompanyName,\n                CountryName = eventMessage.Prospect.Country.CountryName,\n                EmailAddress = eventMessage.Prospect.EmailAddress,\n                FullName = $\"{eventMessage.Prospect.FirstName} {eventMessage.Prospect.LastName}\",\n                RoleName = eventMessage.Prospect.Role.RoleName,\n                SignUpDate = eventMessage.SignedUpAt\n            };\n            Index.CreateDocument(prospect);\n\n            Console.WriteLine($\"Prospect indexed; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1354b5ab-c990-41ea-9f68-5f9933d83700\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Elasticsearch.Net\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"NEST\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"9.0.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>  \n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n  </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/ProductLaunch.MessageHandlers.SaveProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{65089C80-27F1-4744-979B-4C5A33B0CFF6}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.SaveProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.SaveProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing ProductLaunch.Model;\nusing System;\nusing System.Linq;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.SaveProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += SaveProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void SaveProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Saving new prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = eventMessage.Prospect;\n            using (var context = new ProductLaunchContext())\n            {\n                //reload child objects:\n                prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n                prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n\n            Console.WriteLine($\"Prospect saved. Prospect ID: {eventMessage.Prospect.ProspectId}; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"65089c80-27f1-4744-979b-4c5a33b0cff6\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Messaging/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Messaging\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string MessageQueueUrl { get { return Get(\"MESSAGE_QUEUE_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Messaging/MessageHelper.cs",
    "content": "﻿using Newtonsoft.Json;\nusing ProductLaunch.Messaging.Messages;\nusing System.Text;\n\nnamespace ProductLaunch.Messaging\n{\n    public class MessageHelper\n    {\n        public static byte[] ToData<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            var json = JsonConvert.SerializeObject(message);\n            return Encoding.Unicode.GetBytes(json);\n        }\n\n        public static TMessage FromData<TMessage>(byte[] data)\n            where TMessage : Message\n        {\n            var json = Encoding.Unicode.GetString(data);\n            return (TMessage)JsonConvert.DeserializeObject<TMessage>(json);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Messaging/MessageQueue.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging.Messages;\n\nnamespace ProductLaunch.Messaging\n{\n    public static class MessageQueue\n    {\n\n        public static void Publish<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            using (var connection = CreateConnection())\n            {\n                var data = MessageHelper.ToData(message);\n                connection.Publish(message.Subject, data);\n            }\n        }\n\n        public static IConnection CreateConnection()\n        {\n            return new ConnectionFactory().CreateConnection(Config.MessageQueueUrl);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Messaging/Messages/Events/ProspectSignedUpEvent.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System;\n\nnamespace ProductLaunch.Messaging.Messages.Events\n{\n    public class ProspectSignedUpEvent : Message\n    {\n        public override string Subject { get { return MessageSubject; } }\n\n        public DateTime SignedUpAt { get; set; }\n\n        public Prospect Prospect { get; set; }\n\n        public static string MessageSubject = \"events.prospect.signedup\";\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Messaging/Messages/Message.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.Messaging.Messages\n{\n    public abstract class Message\n    {\n        public string CorrelationId { get; set; }  \n        \n        public abstract string Subject { get; }      \n\n        public Message()\n        {\n            CorrelationId = Guid.NewGuid().ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Messaging/ProductLaunch.Messaging.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Messaging</RootNamespace>\n    <AssemblyName>ProductLaunch.Messaging</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"MessageHelper.cs\" />\n    <Compile Include=\"MessageQueue.cs\" />\n    <Compile Include=\"Messages\\Events\\ProspectSignedUpEvent.cs\" />\n    <Compile Include=\"Messages\\Message.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup />\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Messaging/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"e02eff91-8c52-4dce-8279-3fd1ee0659ef\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Messaging/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  </configSections>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"Data Source=(localdb)\\v13.0; Integrated Security=True; MultipleActiveResultSets=True\" />\n      </parameters>\n    </defaultConnectionFactory>\n  </entityFramework>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Model\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string DbConnectionString { get { return Get(\"DB_CONNECTION_STRING\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model/Initializers/StaticDataInitializer.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model.Initializers\n{\n    public class StaticDataInitializer : CreateDatabaseIfNotExists<ProductLaunchContext>\n    {\n        protected override void Seed(ProductLaunchContext context)\n        {\n            AddRole(context, \"DA\", \"Developer Advocate\");\n            AddRole(context, \"DM\", \"Decision Maker\");\n            AddRole(context, \"AC\", \"Architect\");\n            AddRole(context, \"EN\", \"Engineer\");\n            AddRole(context, \"OP\", \"IT Ops\");\n\n            AddCountry(context, \"GBR\", \"United Kingdom\");\n            AddCountry(context, \"USA\", \"United States\");\n            AddCountry(context, \"SWE\", \"Sweden\");\n\n            context.SaveChanges();\n        }\n\n        private void AddCountry(ProductLaunchContext context, string code, string name)\n        {\n            context.Countries.Add(new Country\n            {\n                CountryCode = code,\n                CountryName = name\n            });\n        }\n\n        private void AddRole(ProductLaunchContext context, string code, string name)\n        {\n            context.Roles.Add(new Role\n            {\n                RoleCode = code,\n                RoleName = name\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model/ProductLaunch.Model.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model</RootNamespace>\n    <AssemblyName>ProductLaunch.Model</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Initializers\\StaticDataInitializer.cs\" />\n    <Compile Include=\"ProductLaunchContext.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model/ProductLaunchContext.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model\n{\n    public class ProductLaunchContext : DbContext\n    {\n        public ProductLaunchContext() : base(Config.DbConnectionString) { }\n\n        public DbSet<Country> Countries { get; set; }\n\n        public DbSet<Role> Roles { get; set; }\n\n        public DbSet<Prospect> Prospects { get; set; }\n\n        protected override void OnModelCreating(DbModelBuilder builder)\n        {\n            builder.Entity<Country>().HasKey(c => c.CountryCode);\n            builder.Entity<Role>().HasKey(r => r.RoleCode);\n            builder.Entity<Prospect>().HasOptional<Country>(p => p.Country);\n            builder.Entity<Prospect>().HasOptional<Role>(p => p.Role);            \n        }        \n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"3afc4a48-5db6-48ff-a459-20ec21a2eb28\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" providerName=\"System.Data.SqlClient\" connectionString=\"Server=172.20.244.163;Database=ProductLaunch;User Id=sa;Password=NDC_l0nd0n;\"/>\n  </connectionStrings>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunch.Model.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{49FD06C3-CD52-425A-866D-831D09268CD0}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model.Tests</RootNamespace>\n    <AssemblyName>ProductLaunch.Model.Tests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Data.Entity\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"ProductLaunchContextTest.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunchContextTest.cs",
    "content": "﻿using System;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing ProductLaunch.Entities;\n\nnamespace ProductLaunch.Model.Tests\n{\n    [TestClass]\n    public class ProductLaunchContextTest\n    {\n        [TestMethod]\n        public void Insert()\n        {\n            using (var context = new ProductLaunchContext())\n            {\n                var country = new Country\n                {\n                    CountryCode = \"GBR\",\n                    CountryName = \"United Kingdom\"\n                };\n                context.Countries.Add(country);\n\n                var role = new Role\n                {\n                    RoleCode = \"DM\",\n                    RoleName = \"Decision Maker\"\n                };\n                context.Roles.Add(role);\n\n                var prospect = new Prospect\n                {\n                    FirstName = \"A\",\n                    LastName = \"Prospect\",\n                    CompanyName = \"Docker, Inc.\",\n                    EmailAddress = \"a.prospect@docker.com\",\n                    Country = country,\n                    Role = role\n                };\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model.Tests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"49fd06c3-cd52-425a-866d-831d09268cd0\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Model.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/About.aspx",
    "content": "﻿<%@ Page Title=\"About\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"About.aspx.cs\" Inherits=\"ProductLaunch.Web.About\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your application description page.</h3>\n    <p>Use this area to provide additional information.</p>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/About.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class About : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/About.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class About\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/App_Start/BundleConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public class BundleConfig\n    {\n        // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkID=303951\n        public static void RegisterBundles(BundleCollection bundles)\n        {\n            bundles.Add(new ScriptBundle(\"~/bundles/WebFormsJs\").Include(\n                            \"~/Scripts/WebForms/WebForms.js\",\n                            \"~/Scripts/WebForms/WebUIValidation.js\",\n                            \"~/Scripts/WebForms/MenuStandards.js\",\n                            \"~/Scripts/WebForms/Focus.js\",\n                            \"~/Scripts/WebForms/GridView.js\",\n                            \"~/Scripts/WebForms/DetailsView.js\",\n                            \"~/Scripts/WebForms/TreeView.js\",\n                            \"~/Scripts/WebForms/WebParts.js\"));\n\n            // Order is very important for these files to work, they have explicit dependencies\n            bundles.Add(new ScriptBundle(\"~/bundles/MsAjaxJs\").Include(\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjax.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxApplicationServices.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxTimer.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxWebForms.js\"));\n\n            // Use the Development version of Modernizr to develop with and learn from. Then, when you’re\n            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need\n            bundles.Add(new ScriptBundle(\"~/bundles/modernizr\").Include(\n                            \"~/Scripts/modernizr-*\"));\n\n            ScriptManager.ScriptResourceMapping.AddDefinition(\n                \"respond\",\n                new ScriptResourceDefinition\n                {\n                    Path = \"~/Scripts/respond.min.js\",\n                    DebugPath = \"~/Scripts/respond.js\",\n                });\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/App_Start/RouteConfig.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Web;\nusing System.Web.Routing;\nusing Microsoft.AspNet.FriendlyUrls;\n\nnamespace ProductLaunch.Web\n{\n    public static class RouteConfig\n    {\n        public static void RegisterRoutes(RouteCollection routes)\n        {\n            var settings = new FriendlyUrlSettings();\n            settings.AutoRedirectMode = RedirectMode.Permanent;\n            routes.EnableFriendlyUrls(settings);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/ApplicationInsights.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ApplicationInsights xmlns=\"http://schemas.microsoft.com/ApplicationInsights/2013/Settings\">\n</ApplicationInsights>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Bundle.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<bundles version=\"1.0\">\n  <styleBundle path=\"~/Content/css\">\n    <include path=\"~/Content/bootstrap.css\" />\n    <include path=\"~/Content/Site.css\" />\n  </styleBundle>\n</bundles>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Contact.aspx",
    "content": "﻿<%@ Page Title=\"Contact\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Contact.aspx.cs\" Inherits=\"ProductLaunch.Web.Contact\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your contact page.</h3>\n    <address>\n        One Microsoft Way<br />\n        Redmond, WA 98052-6399<br />\n        <abbr title=\"Phone\">P:</abbr>\n        425.555.0100\n    </address>\n\n    <address>\n        <strong>Support:</strong>   <a href=\"mailto:Support@example.com\">Support@example.com</a><br />\n        <strong>Marketing:</strong> <a href=\"mailto:Marketing@example.com\">Marketing@example.com</a>\n    </address>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Contact : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class Contact\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Content/Site.css",
    "content": "﻿/* Move down content because we have a fixed navbar that is 50px tall */\nbody {\n    padding-top: 50px;\n    padding-bottom: 20px;\n}\n\n/* Wrapping element */\n/* Set some basic padding to keep content from hitting the edges */\n.body-content {\n    padding-left: 15px;\n    padding-right: 15px;\n}\n\n/* Set widths on the form inputs since otherwise they're 100% wide */\ninput,\nselect,\ntextarea {\n    max-width: 280px;\n}\n\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n    .jumbotron {\n        margin-top: 20px;\n    }\n\n    .body-content {\n        padding: 0;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Content/bootstrap.css",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. The notices and licenses below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden] {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput,\nselect[multiple],\ntextarea {\n  background-image: none;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16.099999999999998px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\nh1 small,\n.h1 small {\n  font-size: 24px;\n}\n\nh2 small,\n.h2 small {\n  font-size: 18px;\n}\n\nh3 small,\n.h3 small,\nh4 small,\n.h4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\npre {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table thead > tr > th,\n.table tbody > tr > th,\n.table tfoot > tr > th,\n.table thead > tr > td,\n.table tbody > tr > td,\n.table tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table caption + thead tr:first-child th,\n.table colgroup + thead tr:first-child th,\n.table thead:first-child tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed thead > tr > th,\n.table-condensed tbody > tr > th,\n.table-condensed tfoot > tr > th,\n.table-condensed thead > tr > td,\n.table-condensed tbody > tr > td,\n.table-condensed tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td {\n  background-color: #d0e9c6;\n  border-color: #c9e2b3;\n}\n\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td {\n  background-color: #ebcccc;\n  border-color: #e6c1c7;\n}\n\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td {\n  background-color: #faf2cc;\n  border-color: #f8e5be;\n}\n\n@media (max-width: 768px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n    background-color: #fff;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > thead > tr:last-child > td,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  padding-top: 7px;\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\1f4bc\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\1f4c5\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\1f4cc\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\1f4ce\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\1f4f7\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\1f512\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\1f514\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\1f516\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\1f525\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\1f527\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #333333;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs.nav-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 5px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n\n.nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  z-index: 1000;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  z-index: 1030;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e6e6e6;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #428bca;\n}\n\n.thumbnail > img {\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.alert-warning hr {\n  border-top-color: #f8e5be;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger hr {\n  border-top-color: #e6c1c7;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #fbeed5;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #fbeed5;\n}\n\n.panel-danger {\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #eed3d7;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #eed3d7;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\nbody.modal-open,\n.modal-open .navbar-fixed-top,\n.modal-open .navbar-fixed-bottom {\n  margin-right: 15px;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    right: auto;\n    left: 50%;\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n@media screen and (max-width: 400px) {\n  @-ms-viewport {\n    width: 320px;\n  }\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.visible-xs {\n  display: none !important;\n}\n\ntr.visible-xs {\n  display: none !important;\n}\n\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm {\n  display: none !important;\n}\n\ntr.visible-sm {\n  display: none !important;\n}\n\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md {\n  display: none !important;\n}\n\ntr.visible-md {\n  display: none !important;\n}\n\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg {\n  display: none !important;\n}\n\ntr.visible-lg {\n  display: none !important;\n}\n\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-md {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-md {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n  tr.hidden-md {\n    display: none !important;\n  }\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-md {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print {\n  display: none !important;\n}\n\ntr.visible-print {\n  display: none !important;\n}\n\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n  tr.hidden-print {\n    display: none !important;\n  }\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Default.aspx",
    "content": "﻿<%@ Page Title=\"Home Page\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Default.aspx.cs\" Inherits=\"ProductLaunch.Web._Default\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>We&#39;re launching a new product!</h1>\n        <p class=\"lead\">Our new product is going to be very, very good.</p>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-8\">\n            <h2>What&#39;s this all about?</h2>\n            <p>\n                Lorem ipsum dolor sit amet lectus. In magna in praesent nibh lorem. Egestas ipsum luctus feugiat sit enim. Libero nec a. Praesent vestibulum quis enim.</p>\n            <p>\n                Morbi fusce placerat et pellentesque qui curabitur dictum nam. Adipiscing pede semper. Tellus at sem. Arcu nibh et. Magna luctus nibh. Eu erat aenean adipiscing vitae pretium. Pede nec laoreet. Adipiscing mauris lorem tortor nec massa distinctio pede justo. Gravida non purus nunc sit consequat imperdiet sodales nullam dolor vel.</p>\n            <p>\n                <a class=\"btn btn-default\" href=\"https://www.docker.com/enterprise\">Check Out Our Other Products &raquo;</a>\n            </p>\n        </div>\n        <div class=\"col-md-4\">\n            <h2>Interested?</h2>\n            <p>\n                Give us your details and we&#39;ll keep you posted.</p>\n            <p>\n                It only takes 30 seconds to sign up.\n            </p>\n            <p>\n                And we probably won't spam you very much.\n            </p>\n            <p>\n                <a class=\"btn btn btn-primary btn-lg\" href=\"SignUp.aspx\">Sign Up &raquo;</a>\n            </p>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Default.aspx.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Net;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public partial class _Default : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n        }        \n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Default.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class _Default\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"ProductLaunch.Web.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Global.asax.cs",
    "content": "﻿using ProductLaunch.Model;\nusing ProductLaunch.Model.Initializers;\nusing System;\nusing System.Data.Entity;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.Routing;\n\nnamespace ProductLaunch.Web\n{\n    public class Global : HttpApplication\n    {\n        void Application_Start(object sender, EventArgs e)\n        {\n            // Code that runs on application startup\n            RouteConfig.RegisterRoutes(RouteTable.Routes);\n            BundleConfig.RegisterBundles(BundleTable.Bundles);\n\n            Database.SetInitializer<ProductLaunchContext>(new StaticDataInitializer());\n            SignUp.PreloadStaticDataCache();\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/ProductLaunch.Web.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Web</RootNamespace>\n    <AssemblyName>ProductLaunch.Web</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <UseIISExpress>false</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.Web.Infrastructure.1.0.0.0\\lib\\net40\\Microsoft.Web.Infrastructure.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.bootstrap\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.bootstrap.3.0.0\\lib\\net45\\AspNet.ScriptManager.bootstrap.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.jQuery\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.jQuery.1.10.2\\lib\\net45\\AspNet.ScriptManager.jQuery.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.MSAjax\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.MSAjax.5.0.0\\lib\\net45\\Microsoft.ScriptManager.MSAjax.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.WebForms\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.WebForms.5.0.0\\lib\\net45\\Microsoft.ScriptManager.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.1.1.3\\lib\\net40\\System.Web.Optimization.dll</HintPath>\n    </Reference>\n    <Reference Include=\"WebGrease\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\WebGrease.1.5.2\\lib\\WebGrease.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Antlr3.Runtime\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Antlr.3.4.1.9004\\lib\\Antlr3.Runtime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.Web.Optimization.WebForms\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.WebForms.1.1.3\\lib\\net45\\Microsoft.AspNet.Web.Optimization.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.FriendlyUrls\">\n      <HintPath>..\\packages\\Microsoft.AspNet.FriendlyUrls.Core.1.0.2\\lib\\net45\\Microsoft.AspNet.FriendlyUrls.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"App_Data\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"About.aspx\" />\n    <Content Include=\"Contact.aspx\" />\n    <Content Include=\"Content\\bootstrap.css\" />\n    <Content Include=\"Content\\bootstrap.min.css\" />\n    <Content Include=\"Content\\Site.css\" />\n    <Content Include=\"SignUp.aspx\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.svg\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.woff\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.ttf\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.eot\" />\n    <Content Include=\"ApplicationInsights.config\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <None Include=\"Scripts\\jquery-1.10.2.intellisense.js\" />\n    <Content Include=\"Scripts\\bootstrap.js\" />\n    <Content Include=\"Scripts\\bootstrap.min.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.js\" />\n    <Content Include=\"Scripts\\modernizr-2.6.2.js\" />\n    <Content Include=\"Scripts\\respond.js\" />\n    <Content Include=\"Scripts\\respond.min.js\" />\n    <Content Include=\"Scripts\\WebForms\\DetailsView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Focus.js\" />\n    <Content Include=\"Scripts\\WebForms\\GridView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Menu.js\" />\n    <Content Include=\"Scripts\\WebForms\\MenuStandards.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjax.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxApplicationServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxComponentModel.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxCore.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxGlobalization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxHistory.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxNetwork.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxSerialization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxTimer.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\SmartNav.js\" />\n    <Content Include=\"Scripts\\WebForms\\TreeView.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebParts.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebUIValidation.js\" />\n    <Content Include=\"Scripts\\_references.js\" />\n    <Content Include=\"Default.aspx\" />\n    <Content Include=\"favicon.ico\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Site.Master\" />\n    <Content Include=\"ThankYou.aspx\" />\n    <Content Include=\"ViewSwitcher.ascx\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <Content Include=\"Bundle.config\" />\n    <Content Include=\"packages.config\" />\n    <None Include=\"Project_Readme.html\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.map\" />\n    <Content Include=\"Site.Mobile.Master\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\BundleConfig.cs\" />\n    <Compile Include=\"About.aspx.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"About.aspx.designer.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"App_Start\\RouteConfig.cs\" />\n    <Compile Include=\"Contact.aspx.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Contact.aspx.designer.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.designer.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Default.aspx.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Default.aspx.designer.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Site.Master.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Master.designer.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.designer.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.designer.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.designer.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{e02eff91-8c52-4dce-8279-3fd1ee0659ef}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>57120</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost/ProductLaunch.Web</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Project_Readme.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Your ASP.NET application</title>\n    <style>\n        body {\n            background: #fff;\n            color: #505050;\n            font: 14px 'Segoe UI', tahoma, arial, helvetica, sans-serif;\n            margin: 20px;\n            padding: 0;\n        }\n\n        #header {\n            background: #efefef;\n            padding: 0;\n        }\n\n        h1 {\n            font-size: 48px;\n            font-weight: normal;\n            margin: 0;\n            padding: 0 30px;\n            line-height: 150px;\n        }\n\n        p {\n            font-size: 20px;\n            color: #fff;\n            background: #969696;\n            padding: 0 30px;\n            line-height: 50px;\n        }\n\n        #main {\n            padding: 5px 30px;\n        }\n\n        .section {\n            width: 21.7%;\n            float: left;\n            margin: 0 0 0 4%;\n        }\n\n            .section h2 {\n                font-size: 13px;\n                text-transform: uppercase;\n                margin: 0;\n                border-bottom: 1px solid silver;\n                padding-bottom: 12px;\n                margin-bottom: 8px;\n            }\n\n            .section.first {\n                margin-left: 0;\n            }\n\n                .section.first h2 {\n                    font-size: 24px;\n                    text-transform: none;\n                    margin-bottom: 25px;\n                    border: none;\n                }\n\n                .section.first li {\n                    border-top: 1px solid silver;\n                    padding: 8px 0;\n                }\n\n            .section.last {\n                margin-right: 0;\n            }\n\n        ul {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n            line-height: 20px;\n        }\n\n        li {\n            padding: 4px 0;\n        }\n\n        a {\n            color: #267cb2;\n            text-decoration: none;\n        }\n\n            a:hover {\n                text-decoration: underline;\n            }\n    </style>\n</head>\n<body>\n\n    <div id=\"header\">\n        <h1>Your ASP.NET application</h1>\n        <p>Congratulations! You've created a project</p>\n    </div>\n\n    <div id=\"main\">\n        <div class=\"section first\">\n            <h2>This application consists of:</h2>\n            <ul>\n                <li>Sample pages showing basic nav between Home, About, and Contact.</li>\n                <li>Theming using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615519\">Bootstrap</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615520\">Authentication</a>, if selected, shows how to register and sign in</li>\n                <li>ASP.NET features managed using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615521\">NuGet</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Customize app</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615522\">Get started with ASP.NET Web Forms</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615523\">Change the site's theme</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615524\">Add more libraries using NuGet</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615525\">Configure authentication</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615526\">Customize information about the website users</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615527\">Get information from social providers</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615528\">Add HTTP services using ASP.NET Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615529\">Secure the Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615530\">Add real-time web with ASP.NET SignalR</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615531\">Add components using Scaffolding</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615532\">Test app with Browser Link</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615533\">Share your project</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Deploy</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615534\">Ensure your app is ready for production</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615535\">Microsoft Azure</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615536\">Hosting providers</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section last\">\n            <h2>Get help</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615537\">Get help</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615538\">Get more templates</a></li>\n            </ul>\n        </div>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Web\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Web\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"17a57cf4-a6c1-47c1-aa38-650db6d87f8f\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/DetailsView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/DetailsView.js\nfunction DetailsView() {\n    this.pageIndex = null;\n    this.dataKeys = null;\n    this.createPropertyString = DetailsView_createPropertyString;\n    this.setStateField = DetailsView_setStateValue;\n    this.getHiddenFieldContents = DetailsView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction DetailsView_createPropertyString() {\n    return createPropertyStringFromValues_DetailsView(this.pageIndex, this.dataKeys);\n}\nfunction DetailsView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction DetailsView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[2];\n    for (var i = 3; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_DetailsView(valsArray[0], valsArray[1]);\n}\nfunction DetailsView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_DetailsView(pageIndex, dataKeys) {\n    var value = new Array(pageIndex, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Focus.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_FindFirstFocusableChild(control) {\n    if (!control || !(control.tagName)) {\n        return null;\n    }\n    var tagName = control.tagName.toLowerCase();\n    if (tagName == \"undefined\") {\n        return null;\n    }\n    var children = control.childNodes;\n    if (children) {\n        for (var i = 0; i < children.length; i++) {\n            try {\n                if (WebForm_CanFocus(children[i])) {\n                    return children[i];\n                }\n                else {\n                    var focused = WebForm_FindFirstFocusableChild(children[i]);\n                    if (WebForm_CanFocus(focused)) {\n                        return focused;\n                    }\n                }\n            } catch (e) {\n            }\n        }\n    }\n    return null;\n}\nfunction WebForm_AutoFocus(focusId) {\n    var targetControl;\n    if (__nonMSDOMBrowser) {\n        targetControl = document.getElementById(focusId);\n    }\n    else {\n        targetControl = document.all[focusId];\n    }\n    var focused = targetControl;\n    if (targetControl && (!WebForm_CanFocus(targetControl)) ) {\n        focused = WebForm_FindFirstFocusableChild(targetControl);\n    }\n    if (focused) {\n        try {\n            focused.focus();\n            if (__nonMSDOMBrowser) {\n                focused.scrollIntoView(false);\n            }\n            if (window.__smartNav) {\n                window.__smartNav.ae = focused.id;\n            }\n        }\n        catch (e) {\n        }\n    }\n}\nfunction WebForm_CanFocus(element) {\n    if (!element || !(element.tagName)) return false;\n    var tagName = element.tagName.toLowerCase();\n    return (!(element.disabled) &&\n            (!(element.type) || element.type.toLowerCase() != \"hidden\") &&\n            WebForm_IsFocusableTag(tagName) &&\n            WebForm_IsInVisibleContainer(element)\n            );\n}\nfunction WebForm_IsFocusableTag(tagName) {\n    return (tagName == \"input\" ||\n            tagName == \"textarea\" ||\n            tagName == \"select\" ||\n            tagName == \"button\" ||\n            tagName == \"a\");\n}\nfunction WebForm_IsInVisibleContainer(ctrl) {\n    var current = ctrl;\n    while((typeof(current) != \"undefined\") && (current != null)) {\n        if (current.disabled ||\n            ( typeof(current.style) != \"undefined\" &&\n            ( ( typeof(current.style.display) != \"undefined\" &&\n                current.style.display == \"none\") ||\n                ( typeof(current.style.visibility) != \"undefined\" &&\n                current.style.visibility == \"hidden\") ) ) ) {\n            return false;\n        }\n        if (typeof(current.parentNode) != \"undefined\" &&\n                current.parentNode != null &&\n                current.parentNode != current &&\n                current.parentNode.tagName.toLowerCase() != \"body\") {\n            current = current.parentNode;\n        }\n        else {\n            return true;\n        }\n    }\n    return true;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/GridView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/GridView.js\nfunction GridView() {\n    this.pageIndex = null;\n    this.sortExpression = null;\n    this.sortDirection = null;\n    this.dataKeys = null;\n    this.createPropertyString = GridView_createPropertyString;\n    this.setStateField = GridView_setStateValue;\n    this.getHiddenFieldContents = GridView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction GridView_createPropertyString() {\n    return createPropertyStringFromValues_GridView(this.pageIndex, this.sortDirection, this.sortExpression, this.dataKeys);\n}\nfunction GridView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction GridView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[4];\n    for (var i = 5; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_GridView(valsArray[0], valsArray[1], valsArray[2], valsArray[3]);\n}\nfunction GridView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_GridView(pageIndex, sortDirection, sortExpression, dataKeys) {\n    var value = new Array(pageIndex, sortDirection, sortExpression, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjax.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjax.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjax.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript._scripts={\"MicrosoftAjaxCore.js\":true,\"MicrosoftAjaxGlobalization.js\":true,\"MicrosoftAjaxSerialization.js\":true,\"MicrosoftAjaxComponentModel.js\":true,\"MicrosoftAjaxHistory.js\":true,\"MicrosoftAjaxNetwork.js\":true,\"MicrosoftAjaxWebServices.js\":true};Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};Type.registerNamespace(\"Sys.UI\");Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxApplicationServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxApplicationServices.js\nType._registerScript(\"MicrosoftAjaxApplicationServices.js\",[\"MicrosoftAjaxWebServices.js\"]);Type.registerNamespace(\"Sys.Services\");Sys.Services._ProfileService=function(){Sys.Services._ProfileService.initializeBase(this);this.properties={}};Sys.Services._ProfileService.DefaultWebServicePath=\"\";Sys.Services._ProfileService.prototype={_defaultLoadCompletedCallback:null,_defaultSaveCompletedCallback:null,_path:\"\",_timeout:0,get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_defaultSaveCompletedCallback:function(){return this._defaultSaveCompletedCallback},set_defaultSaveCompletedCallback:function(a){this._defaultSaveCompletedCallback=a},get_path:function(){return this._path||\"\"},load:function(c,d,e,f){var b,a;if(!c){a=\"GetAllPropertiesForCurrentUser\";b={authenticatedUserOnly:false}}else{a=\"GetPropertiesForCurrentUser\";b={properties:this._clonePropertyNames(c),authenticatedUserOnly:false}}this._invoke(this._get_path(),a,false,b,Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[d,e,f])},save:function(d,b,c,e){var a=this._flattenProperties(d,this.properties);this._invoke(this._get_path(),\"SetPropertiesForCurrentUser\",false,{values:a.value,authenticatedUserOnly:false},Function.createDelegate(this,this._onSaveComplete),Function.createDelegate(this,this._onSaveFailed),[b,c,e,a.count])},_clonePropertyNames:function(e){var c=[],d={};for(var b=0;b<e.length;b++){var a=e[b];if(!d[a]){Array.add(c,a);d[a]=true}}return c},_flattenProperties:function(a,i,j){var b={},e,d,g=0;if(a&&a.length===0)return {value:b,count:0};for(var c in i){e=i[c];d=j?j+\".\"+c:c;if(Sys.Services.ProfileGroup.isInstanceOfType(e)){var k=this._flattenProperties(a,e,d),h=k.value;g+=k.count;for(var f in h){var l=h[f];b[f]=l}}else if(!a||Array.indexOf(a,d)!==-1){b[d]=e;g++}}return {value:b,count:g}},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._ProfileService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoadComplete:function(a,e,g){if(typeof a!==\"object\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,g,\"Object\"));var c=this._unflattenProperties(a);for(var b in c)this.properties[b]=c[b];var d=e[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(d){var f=e[2]||this.get_defaultUserContext();d(a.length,f,\"Sys.Services.ProfileService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.load\")}},_onSaveComplete:function(a,b,f){var c=b[3];if(a!==null)if(a instanceof Array)c-=a.length;else if(typeof a===\"number\")c=a;else throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));var d=b[0]||this.get_defaultSaveCompletedCallback()||this.get_defaultSucceededCallback();if(d){var e=b[2]||this.get_defaultUserContext();d(c,e,\"Sys.Services.ProfileService.save\")}},_onSaveFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.save\")}},_unflattenProperties:function(e){var c={},d,f,h=0;for(var a in e){h++;f=e[a];d=a.indexOf(\".\");if(d!==-1){var g=a.substr(0,d);a=a.substr(d+1);var b=c[g];if(!b||!Sys.Services.ProfileGroup.isInstanceOfType(b)){b=new Sys.Services.ProfileGroup;c[g]=b}b[a]=f}else c[a]=f}e.length=h;return c}};Sys.Services._ProfileService.registerClass(\"Sys.Services._ProfileService\",Sys.Net.WebServiceProxy);Sys.Services.ProfileService=new Sys.Services._ProfileService;Sys.Services.ProfileGroup=function(a){if(a)for(var b in a)this[b]=a[b]};Sys.Services.ProfileGroup.registerClass(\"Sys.Services.ProfileGroup\");Sys.Services._AuthenticationService=function(){Sys.Services._AuthenticationService.initializeBase(this)};Sys.Services._AuthenticationService.DefaultWebServicePath=\"\";Sys.Services._AuthenticationService.prototype={_defaultLoginCompletedCallback:null,_defaultLogoutCompletedCallback:null,_path:\"\",_timeout:0,_authenticated:false,get_defaultLoginCompletedCallback:function(){return this._defaultLoginCompletedCallback},set_defaultLoginCompletedCallback:function(a){this._defaultLoginCompletedCallback=a},get_defaultLogoutCompletedCallback:function(){return this._defaultLogoutCompletedCallback},set_defaultLogoutCompletedCallback:function(a){this._defaultLogoutCompletedCallback=a},get_isLoggedIn:function(){return this._authenticated},get_path:function(){return this._path||\"\"},login:function(c,b,a,h,f,d,e,g){this._invoke(this._get_path(),\"Login\",false,{userName:c,password:b,createPersistentCookie:a},Function.createDelegate(this,this._onLoginComplete),Function.createDelegate(this,this._onLoginFailed),[c,b,a,h,f,d,e,g])},logout:function(c,a,b,d){this._invoke(this._get_path(),\"Logout\",false,{},Function.createDelegate(this,this._onLogoutComplete),Function.createDelegate(this,this._onLogoutFailed),[c,a,b,d])},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._AuthenticationService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoginComplete:function(e,c,f){if(typeof e!==\"boolean\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Boolean\"));var b=c[4],d=c[7]||this.get_defaultUserContext(),a=c[5]||this.get_defaultLoginCompletedCallback()||this.get_defaultSucceededCallback();if(e){this._authenticated=true;if(a)a(true,d,\"Sys.Services.AuthenticationService.login\");if(typeof b!==\"undefined\"&&b!==null)window.location.href=b}else if(a)a(false,d,\"Sys.Services.AuthenticationService.login\")},_onLoginFailed:function(d,b){var a=b[6]||this.get_defaultFailedCallback();if(a){var c=b[7]||this.get_defaultUserContext();a(d,c,\"Sys.Services.AuthenticationService.login\")}},_onLogoutComplete:function(f,a,e){if(f!==null)throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,e,\"null\"));var b=a[0],d=a[3]||this.get_defaultUserContext(),c=a[1]||this.get_defaultLogoutCompletedCallback()||this.get_defaultSucceededCallback();this._authenticated=false;if(c)c(null,d,\"Sys.Services.AuthenticationService.logout\");if(!b)window.location.reload();else window.location.href=b},_onLogoutFailed:function(c,b){var a=b[2]||this.get_defaultFailedCallback();if(a)a(c,b[3],\"Sys.Services.AuthenticationService.logout\")},_setAuthenticated:function(a){this._authenticated=a}};Sys.Services._AuthenticationService.registerClass(\"Sys.Services._AuthenticationService\",Sys.Net.WebServiceProxy);Sys.Services.AuthenticationService=new Sys.Services._AuthenticationService;Sys.Services._RoleService=function(){Sys.Services._RoleService.initializeBase(this);this._roles=[]};Sys.Services._RoleService.DefaultWebServicePath=\"\";Sys.Services._RoleService.prototype={_defaultLoadCompletedCallback:null,_rolesIndex:null,_timeout:0,_path:\"\",get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_path:function(){return this._path||\"\"},get_roles:function(){return Array.clone(this._roles)},isUserInRole:function(a){var b=this._get_rolesIndex()[a.trim().toLowerCase()];return !!b},load:function(a,b,c){Sys.Net.WebServiceProxy.invoke(this._get_path(),\"GetRolesForCurrentUser\",false,{},Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[a,b,c],this.get_timeout())},_get_path:function(){var a=this.get_path();if(!a||!a.length)a=Sys.Services._RoleService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_get_rolesIndex:function(){if(!this._rolesIndex){var b={};for(var a=0;a<this._roles.length;a++)b[this._roles[a].toLowerCase()]=true;this._rolesIndex=b}return this._rolesIndex},_onLoadComplete:function(a,c,f){if(a&&!(a instanceof Array))throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));this._roles=a;this._rolesIndex=null;var b=c[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(b){var e=c[2]||this.get_defaultUserContext(),d=Array.clone(a);b(d,e,\"Sys.Services.RoleService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.RoleService.load\")}}};Sys.Services._RoleService.registerClass(\"Sys.Services._RoleService\",Sys.Net.WebServiceProxy);Sys.Services.RoleService=new Sys.Services._RoleService;"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxComponentModel.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxComponentModel.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxComponentModel.js\nType._registerScript(\"MicrosoftAjaxComponentModel.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.UI\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxCore.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxCore.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxCore.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript(\"MicrosoftAjaxCore.js\");Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxGlobalization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxGlobalization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxGlobalization.js\nType._registerScript(\"MicrosoftAjaxGlobalization.js\",[\"MicrosoftAjaxCore.js\"]);Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxHistory.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxHistory.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxHistory.js\nType._registerScript(\"MicrosoftAjaxHistory.js\",[\"MicrosoftAjaxComponentModel.js\",\"MicrosoftAjaxSerialization.js\"]);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxNetwork.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxNetwork.js\nType._registerScript(\"MicrosoftAjaxNetwork.js\",[\"MicrosoftAjaxSerialization.js\"]);if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxSerialization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxSerialization.js\nType._registerScript(\"MicrosoftAjaxSerialization.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxTimer.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxTimer.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxTimer.js\nType._registerScript(\"Timer.js\",[\"MicrosoftAjaxComponentModel.js\"]);Sys.UI._Timer=function(a){Sys.UI._Timer.initializeBase(this,[a]);this._interval=60000;this._enabled=true;this._postbackPending=false;this._raiseTickDelegate=null;this._endRequestHandlerDelegate=null;this._timer=null;this._pageRequestManager=null;this._uniqueID=null};Sys.UI._Timer.prototype={get_enabled:function(){return this._enabled},set_enabled:function(a){this._enabled=a},get_interval:function(){return this._interval},set_interval:function(a){this._interval=a},get_uniqueID:function(){return this._uniqueID},set_uniqueID:function(a){this._uniqueID=a},dispose:function(){this._stopTimer();if(this._pageRequestManager!==null)this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);Sys.UI._Timer.callBaseMethod(this,\"dispose\")},_doPostback:function(){__doPostBack(this.get_uniqueID(),\"\")},_handleEndRequest:function(c,b){var a=b.get_dataItems()[this.get_id()];if(a)this._update(a[0],a[1]);if(this._postbackPending===true&&this._pageRequestManager!==null&&this._pageRequestManager.get_isInAsyncPostBack()===false){this._postbackPending=false;this._doPostback()}},initialize:function(){Sys.UI._Timer.callBaseMethod(this,\"initialize\");this._raiseTickDelegate=Function.createDelegate(this,this._raiseTick);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null)this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate);if(this.get_enabled())this._startTimer()},_raiseTick:function(){this._startTimer();if(this._pageRequestManager===null||!this._pageRequestManager.get_isInAsyncPostBack()){this._doPostback();this._postbackPending=false}else this._postbackPending=true},_startTimer:function(){this._timer=window.setTimeout(Function.createDelegate(this,this._raiseTick),this.get_interval())},_stopTimer:function(){if(this._timer!==null){window.clearTimeout(this._timer);this._timer=null}},_update:function(c,b){var a=!this.get_enabled(),d=this.get_interval()!==b;if(!a&&(!c||d)){this._stopTimer();a=true}this.set_enabled(c);this.set_interval(b);if(this.get_enabled()&&a)this._startTimer()}};Sys.UI._Timer.registerClass(\"Sys.UI._Timer\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebForms.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebForms.js\nType._registerScript(\"MicrosoftAjaxWebForms.js\",[\"MicrosoftAjaxCore.js\",\"MicrosoftAjaxSerialization.js\",\"MicrosoftAjaxNetwork.js\",\"MicrosoftAjaxComponentModel.js\"]);Type.registerNamespace(\"Sys.WebForms\");Sys.WebForms.BeginRequestEventArgs=function(c,b,a){Sys.WebForms.BeginRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.BeginRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]}};Sys.WebForms.BeginRequestEventArgs.registerClass(\"Sys.WebForms.BeginRequestEventArgs\",Sys.EventArgs);Sys.WebForms.EndRequestEventArgs=function(c,a,b){Sys.WebForms.EndRequestEventArgs.initializeBase(this);this._errorHandled=false;this._error=c;this._dataItems=a||{};this._response=b};Sys.WebForms.EndRequestEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_error:function(){return this._error},get_errorHandled:function(){return this._errorHandled},set_errorHandled:function(a){this._errorHandled=a},get_response:function(){return this._response}};Sys.WebForms.EndRequestEventArgs.registerClass(\"Sys.WebForms.EndRequestEventArgs\",Sys.EventArgs);Sys.WebForms.InitializeRequestEventArgs=function(c,b,a){Sys.WebForms.InitializeRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.InitializeRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]},set_updatePanelsToUpdate:function(a){this._updated=true;this._updatePanelsToUpdate=a}};Sys.WebForms.InitializeRequestEventArgs.registerClass(\"Sys.WebForms.InitializeRequestEventArgs\",Sys.CancelEventArgs);Sys.WebForms.PageLoadedEventArgs=function(b,a,c){Sys.WebForms.PageLoadedEventArgs.initializeBase(this);this._panelsUpdated=b;this._panelsCreated=a;this._dataItems=c||{}};Sys.WebForms.PageLoadedEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsCreated:function(){return this._panelsCreated},get_panelsUpdated:function(){return this._panelsUpdated}};Sys.WebForms.PageLoadedEventArgs.registerClass(\"Sys.WebForms.PageLoadedEventArgs\",Sys.EventArgs);Sys.WebForms.PageLoadingEventArgs=function(b,a,c){Sys.WebForms.PageLoadingEventArgs.initializeBase(this);this._panelsUpdating=b;this._panelsDeleting=a;this._dataItems=c||{}};Sys.WebForms.PageLoadingEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsDeleting:function(){return this._panelsDeleting},get_panelsUpdating:function(){return this._panelsUpdating}};Sys.WebForms.PageLoadingEventArgs.registerClass(\"Sys.WebForms.PageLoadingEventArgs\",Sys.EventArgs);Sys._ScriptLoader=function(){this._scriptsToLoad=null;this._sessions=[];this._scriptLoadedDelegate=Function.createDelegate(this,this._scriptLoadedHandler)};Sys._ScriptLoader.prototype={dispose:function(){this._stopSession();this._loading=false;if(this._events)delete this._events;this._sessions=null;this._currentSession=null;this._scriptLoadedDelegate=null},loadScripts:function(d,b,c,a){var e={allScriptsLoadedCallback:b,scriptLoadFailedCallback:c,scriptLoadTimeoutCallback:a,scriptsToLoad:this._scriptsToLoad,scriptTimeout:d};this._scriptsToLoad=null;this._sessions[this._sessions.length]=e;if(!this._loading)this._nextSession()},queueCustomScriptTag:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,a)},queueScriptBlock:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{text:a})},queueScriptReference:function(a,b){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{src:a,fallback:b})},_createScriptElement:function(c){var a=document.createElement(\"script\");a.type=\"text/javascript\";for(var b in c)a[b]=c[b];return a},_loadScriptsInternal:function(){var c=this._currentSession;if(c.scriptsToLoad&&c.scriptsToLoad.length>0){var b=Array.dequeue(c.scriptsToLoad),f=this._scriptLoadedDelegate;if(b.fallback){var g=b.fallback;delete b.fallback;var d=this;f=function(b,a){a||function(){var a=d._createScriptElement({src:g});d._currentTask=new Sys._ScriptLoaderTask(a,d._scriptLoadedDelegate);d._currentTask.execute()}()}}var a=this._createScriptElement(b);if(a.text&&Sys.Browser.agent===Sys.Browser.Safari){a.innerHTML=a.text;delete a.text}if(typeof b.src===\"string\"){this._currentTask=new Sys._ScriptLoaderTask(a,f);this._currentTask.execute()}else{document.getElementsByTagName(\"head\")[0].appendChild(a);Sys._ScriptLoaderTask._clearScript(a);this._loadScriptsInternal()}}else{this._stopSession();var e=c.allScriptsLoadedCallback;if(e)e(this);this._nextSession()}},_nextSession:function(){if(this._sessions.length===0){this._loading=false;this._currentSession=null;return}this._loading=true;var a=Array.dequeue(this._sessions);this._currentSession=a;if(a.scriptTimeout>0)this._timeoutCookie=window.setTimeout(Function.createDelegate(this,this._scriptLoadTimeoutHandler),a.scriptTimeout*1000);this._loadScriptsInternal()},_raiseError:function(){var b=this._currentSession.scriptLoadFailedCallback,a=this._currentTask.get_scriptElement();this._stopSession();if(b){b(this,a);this._nextSession()}else{this._loading=false;throw Sys._ScriptLoader._errorScriptLoadFailed(a.src)}},_scriptLoadedHandler:function(a,b){if(b){Array.add(Sys._ScriptLoader._getLoadedScripts(),a.src);this._currentTask.dispose();this._currentTask=null;this._loadScriptsInternal()}else this._raiseError()},_scriptLoadTimeoutHandler:function(){var a=this._currentSession.scriptLoadTimeoutCallback;this._stopSession();if(a)a(this);this._nextSession()},_stopSession:function(){if(this._timeoutCookie){window.clearTimeout(this._timeoutCookie);this._timeoutCookie=null}if(this._currentTask){this._currentTask.dispose();this._currentTask=null}}};Sys._ScriptLoader.registerClass(\"Sys._ScriptLoader\",null,Sys.IDisposable);Sys._ScriptLoader.getInstance=function(){var a=Sys._ScriptLoader._activeInstance;if(!a)a=Sys._ScriptLoader._activeInstance=new Sys._ScriptLoader;return a};Sys._ScriptLoader.isScriptLoaded=function(b){var a=document.createElement(\"script\");a.src=b;return Array.contains(Sys._ScriptLoader._getLoadedScripts(),a.src)};Sys._ScriptLoader.readLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){var c=Sys._ScriptLoader._referencedScripts=[],d=document.getElementsByTagName(\"script\");for(var b=d.length-1;b>=0;b--){var e=d[b],a=e.src;if(a.length)if(!Array.contains(c,a))Array.add(c,a)}}};Sys._ScriptLoader._errorScriptLoadFailed=function(b){var a;a=Sys.Res.scriptLoadFailed;var d=\"Sys.ScriptLoadFailedException: \"+String.format(a,b),c=Error.create(d,{name:\"Sys.ScriptLoadFailedException\",\"scriptUrl\":b});c.popStackFrame();return c};Sys._ScriptLoader._getLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){Sys._ScriptLoader._referencedScripts=[];Sys._ScriptLoader.readLoadedScripts()}return Sys._ScriptLoader._referencedScripts};Sys.WebForms.PageRequestManager=function(){this._form=null;this._activeDefaultButton=null;this._activeDefaultButtonClicked=false;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._updatePanelHasChildrenAsTriggers=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._scriptManagerID=null;this._pageLoadedHandler=null;this._additionalInput=null;this._onsubmit=null;this._onSubmitStatements=[];this._originalDoPostBack=null;this._originalDoPostBackWithOptions=null;this._originalFireDefaultButton=null;this._originalDoCallback=null;this._isCrossPost=false;this._postBackSettings=null;this._request=null;this._onFormSubmitHandler=null;this._onFormElementClickHandler=null;this._onWindowUnloadHandler=null;this._asyncPostBackTimeout=null;this._controlIDToFocus=null;this._scrollPosition=null;this._processingRequest=false;this._scriptDisposes={};this._transientFields=[\"__VIEWSTATEENCRYPTED\",\"__VIEWSTATEFIELDCOUNT\"];this._textTypes=/^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i};Sys.WebForms.PageRequestManager.prototype={_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_isInAsyncPostBack:function(){return this._request!==null},add_beginRequest:function(a){this._get_eventHandlerList().addHandler(\"beginRequest\",a)},remove_beginRequest:function(a){this._get_eventHandlerList().removeHandler(\"beginRequest\",a)},add_endRequest:function(a){this._get_eventHandlerList().addHandler(\"endRequest\",a)},remove_endRequest:function(a){this._get_eventHandlerList().removeHandler(\"endRequest\",a)},add_initializeRequest:function(a){this._get_eventHandlerList().addHandler(\"initializeRequest\",a)},remove_initializeRequest:function(a){this._get_eventHandlerList().removeHandler(\"initializeRequest\",a)},add_pageLoaded:function(a){this._get_eventHandlerList().addHandler(\"pageLoaded\",a)},remove_pageLoaded:function(a){this._get_eventHandlerList().removeHandler(\"pageLoaded\",a)},add_pageLoading:function(a){this._get_eventHandlerList().addHandler(\"pageLoading\",a)},remove_pageLoading:function(a){this._get_eventHandlerList().removeHandler(\"pageLoading\",a)},abortPostBack:function(){if(!this._processingRequest&&this._request){this._request.get_executor().abort();this._request=null}},beginAsyncPostBack:function(c,a,f,d,e){if(d&&typeof Page_ClientValidate===\"function\"&&!Page_ClientValidate(e||null))return;this._postBackSettings=this._createPostBackSettings(true,c,a);var b=this._form;b.__EVENTTARGET.value=a||\"\";b.__EVENTARGUMENT.value=f||\"\";this._isCrossPost=false;this._additionalInput=null;this._onFormSubmit()},_cancelPendingCallbacks:function(){for(var a=0,e=window.__pendingCallbacks.length;a<e;a++){var c=window.__pendingCallbacks[a];if(c){if(!c.async)window.__synchronousCallBackIndex=-1;window.__pendingCallbacks[a]=null;var d=\"__CALLBACKFRAME\"+a,b=document.getElementById(d);if(b)b.parentNode.removeChild(b)}}},_commitControls:function(a,b){if(a){this._updatePanelIDs=a.updatePanelIDs;this._updatePanelClientIDs=a.updatePanelClientIDs;this._updatePanelHasChildrenAsTriggers=a.updatePanelHasChildrenAsTriggers;this._asyncPostBackControlIDs=a.asyncPostBackControlIDs;this._asyncPostBackControlClientIDs=a.asyncPostBackControlClientIDs;this._postBackControlIDs=a.postBackControlIDs;this._postBackControlClientIDs=a.postBackControlClientIDs}if(typeof b!==\"undefined\"&&b!==null)this._asyncPostBackTimeout=b*1000},_createHiddenField:function(c,d){var b,a=document.getElementById(c);if(a)if(!a._isContained)a.parentNode.removeChild(a);else b=a.parentNode;if(!b){b=document.createElement(\"span\");b.style.cssText=\"display:none !important\";this._form.appendChild(b)}b.innerHTML=\"<input type='hidden' />\";a=b.childNodes[0];a._isContained=true;a.id=a.name=c;a.value=d},_createPageRequestManagerTimeoutError:function(){var b=\"Sys.WebForms.PageRequestManagerTimeoutException: \"+Sys.WebForms.Res.PRM_TimeoutError,a=Error.create(b,{name:\"Sys.WebForms.PageRequestManagerTimeoutException\"});a.popStackFrame();return a},_createPageRequestManagerServerError:function(a,d){var c=\"Sys.WebForms.PageRequestManagerServerErrorException: \"+(d||String.format(Sys.WebForms.Res.PRM_ServerError,a)),b=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerServerErrorException\",httpStatusCode:a});b.popStackFrame();return b},_createPageRequestManagerParserError:function(b){var c=\"Sys.WebForms.PageRequestManagerParserErrorException: \"+String.format(Sys.WebForms.Res.PRM_ParserError,b),a=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerParserErrorException\"});a.popStackFrame();return a},_createPanelID:function(e,b){var c=b.asyncTarget,a=this._ensureUniqueIds(e||b.panelsToUpdate),d=a instanceof Array?a.join(\",\"):a||this._scriptManagerID;if(c)d+=\"|\"+c;return encodeURIComponent(this._scriptManagerID)+\"=\"+encodeURIComponent(d)+\"&\"},_createPostBackSettings:function(d,a,c,b){return {async:d,asyncTarget:c,panelsToUpdate:a,sourceElement:b}},_convertToClientIDs:function(a,f,e,d){if(a)for(var b=0,h=a.length;b<h;b+=d?2:1){var c=a[b],g=(d?a[b+1]:\"\")||this._uniqueIDToClientID(c);Array.add(f,c);Array.add(e,g)}},dispose:function(){if(this._form){Sys.UI.DomEvent.removeHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.removeHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._onWindowUnloadHandler);Sys.UI.DomEvent.removeHandler(window,\"load\",this._pageLoadedHandler)}if(this._originalDoPostBack){window.__doPostBack=this._originalDoPostBack;this._originalDoPostBack=null}if(this._originalDoPostBackWithOptions){window.WebForm_DoPostBackWithOptions=this._originalDoPostBackWithOptions;this._originalDoPostBackWithOptions=null}if(this._originalFireDefaultButton){window.WebForm_FireDefaultButton=this._originalFireDefaultButton;this._originalFireDefaultButton=null}if(this._originalDoCallback){window.WebForm_DoCallback=this._originalDoCallback;this._originalDoCallback=null}this._form=null;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._asyncPostBackTimeout=null;this._scrollPosition=null;this._activeElement=null},_doCallback:function(d,b,c,f,a,e){if(!this.get_isInAsyncPostBack())this._originalDoCallback(d,b,c,f,a,e)},_doPostBack:function(a,k){var f=window.event;if(!f){var d=arguments.callee?arguments.callee.caller:null;if(d){var j=30;while(d.arguments.callee.caller&&--j)d=d.arguments.callee.caller;f=j&&d.arguments.length?d.arguments[0]:null}}this._additionalInput=null;var h=this._form;if(a===null||typeof a===\"undefined\"||this._isCrossPost){this._postBackSettings=this._createPostBackSettings(false);this._isCrossPost=false}else{var c=this._masterPageUniqueID,l=this._uniqueIDToClientID(a),g=document.getElementById(l);if(!g&&c)if(a.indexOf(c+\"$\")===0)g=document.getElementById(l.substr(c.length+1));if(!g)if(Array.contains(this._asyncPostBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(true,null,a);else if(Array.contains(this._postBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(false);else{var e=this._findNearestElement(a);if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{if(c){c+=\"$\";if(a.indexOf(c)===0)e=this._findNearestElement(a.substr(c.length))}if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{var b;try{b=f?f.target||f.srcElement:null}catch(n){}b=b||this._activeElement;var m=/__doPostBack\\(|WebForm_DoPostBackWithOptions\\(/;function i(b){b=b?b.toString():\"\";return m.test(b)&&b.indexOf(\"'\"+a+\"'\")!==-1||b.indexOf('\"'+a+'\"')!==-1}if(b&&(b.name===a||i(b.href)||i(b.onclick)||i(b.onchange)))this._postBackSettings=this._getPostBackSettings(b,a);else this._postBackSettings=this._createPostBackSettings(false)}}}else this._postBackSettings=this._getPostBackSettings(g,a)}if(!this._postBackSettings.async){h.onsubmit=this._onsubmit;this._originalDoPostBack(a,k);h.onsubmit=null;return}h.__EVENTTARGET.value=a;h.__EVENTARGUMENT.value=k;this._onFormSubmit()},_doPostBackWithOptions:function(a){this._isCrossPost=a&&a.actionUrl;var d=true;if(a.validation)if(typeof Page_ClientValidate==\"function\")d=Page_ClientValidate(a.validationGroup);if(d){if(typeof a.actionUrl!=\"undefined\"&&a.actionUrl!=null&&a.actionUrl.length>0)theForm.action=a.actionUrl;if(a.trackFocus){var c=theForm.elements[\"__LASTFOCUS\"];if(typeof c!=\"undefined\"&&c!=null)if(typeof document.activeElement==\"undefined\")c.value=a.eventTarget;else{var b=document.activeElement;if(typeof b!=\"undefined\"&&b!=null)if(typeof b.id!=\"undefined\"&&b.id!=null&&b.id.length>0)c.value=b.id;else if(typeof b.name!=\"undefined\")c.value=b.name}}}if(a.clientSubmit)this._doPostBack(a.eventTarget,a.eventArgument)},_elementContains:function(b,a){while(a){if(a===b)return true;a=a.parentNode}return false},_endPostBack:function(a,d,f){if(this._request===d.get_webRequest()){this._processingRequest=false;this._additionalInput=null;this._request=null}var e=this._get_eventHandlerList().getHandler(\"endRequest\"),b=false;if(e){var c=new Sys.WebForms.EndRequestEventArgs(a,f?f.dataItems:{},d);e(this,c);b=c.get_errorHandled()}if(a&&!b)throw a},_ensureUniqueIds:function(a){if(!a)return a;a=a instanceof Array?a:[a];var c=[];for(var b=0,f=a.length;b<f;b++){var e=a[b],d=Array.indexOf(this._updatePanelClientIDs,e);c.push(d>-1?this._updatePanelIDs[d]:e)}return c},_findNearestElement:function(a){while(a.length>0){var d=this._uniqueIDToClientID(a),c=document.getElementById(d);if(c)return c;var b=a.lastIndexOf(\"$\");if(b===-1)return null;a=a.substring(0,b)}return null},_findText:function(b,a){var c=Math.max(0,a-20),d=Math.min(b.length,a+20);return b.substring(c,d)},_fireDefaultButton:function(a,d){if(a.keyCode===13){var c=a.srcElement||a.target;if(!c||c.tagName.toLowerCase()!==\"textarea\"){var b=document.getElementById(d);if(b&&typeof b.click!==\"undefined\"){this._activeDefaultButton=b;this._activeDefaultButtonClicked=false;try{b.click()}finally{this._activeDefaultButton=null}a.cancelBubble=true;if(typeof a.stopPropagation===\"function\")a.stopPropagation();return false}}}return true},_getPageLoadedEventArgs:function(n,c){var m=[],l=[],k=c?c.version4:false,d=c?c.updatePanelData:null,e,g,h,b;if(!d){e=this._updatePanelIDs;g=this._updatePanelClientIDs;h=null;b=null}else{e=d.updatePanelIDs;g=d.updatePanelClientIDs;h=d.childUpdatePanelIDs;b=d.panelsToRefreshIDs}var a,f,j,i;if(b)for(a=0,f=b.length;a<f;a+=k?2:1){j=b[a];i=(k?b[a+1]:\"\")||this._uniqueIDToClientID(j);Array.add(m,document.getElementById(i))}for(a=0,f=e.length;a<f;a++)if(n||Array.indexOf(h,e[a])!==-1)Array.add(l,document.getElementById(g[a]));return new Sys.WebForms.PageLoadedEventArgs(m,l,c?c.dataItems:{})},_getPageLoadingEventArgs:function(f){var j=[],i=[],c=f.updatePanelData,k=c.oldUpdatePanelIDs,l=c.oldUpdatePanelClientIDs,n=c.updatePanelIDs,m=c.childUpdatePanelIDs,d=c.panelsToRefreshIDs,a,e,b,g,h=f.version4;for(a=0,e=d.length;a<e;a+=h?2:1){b=d[a];g=(h?d[a+1]:\"\")||this._uniqueIDToClientID(b);Array.add(j,document.getElementById(g))}for(a=0,e=k.length;a<e;a++){b=k[a];if(Array.indexOf(d,b)===-1&&(Array.indexOf(n,b)===-1||Array.indexOf(m,b)>-1))Array.add(i,document.getElementById(l[a]))}return new Sys.WebForms.PageLoadingEventArgs(j,i,f.dataItems)},_getPostBackSettings:function(a,c){var d=a,b=null;while(a){if(a.id){if(!b&&Array.contains(this._asyncPostBackControlClientIDs,a.id))b=this._createPostBackSettings(true,null,c,d);else if(!b&&Array.contains(this._postBackControlClientIDs,a.id))return this._createPostBackSettings(false);else{var e=Array.indexOf(this._updatePanelClientIDs,a.id);if(e!==-1)if(this._updatePanelHasChildrenAsTriggers[e])return this._createPostBackSettings(true,[this._updatePanelIDs[e]],c,d);else return this._createPostBackSettings(true,null,c,d)}if(!b&&this._matchesParentIDInList(a.id,this._asyncPostBackControlClientIDs))b=this._createPostBackSettings(true,null,c,d);else if(!b&&this._matchesParentIDInList(a.id,this._postBackControlClientIDs))return this._createPostBackSettings(false)}a=a.parentNode}if(!b)return this._createPostBackSettings(false);else return b},_getScrollPosition:function(){var a=document.documentElement;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else{a=document.body;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else if(this._validPosition(window.pageXOffset)||this._validPosition(window.pageYOffset))return {x:window.pageXOffset,y:window.pageYOffset};else return {x:0,y:0}}},_initializeInternal:function(f,g,a,b,e,c,d){if(this._prmInitialized)throw Error.invalidOperation(Sys.WebForms.Res.PRM_CannotRegisterTwice);this._prmInitialized=true;this._masterPageUniqueID=d;this._scriptManagerID=f;this._form=Sys.UI.DomElement.resolveElement(g);this._onsubmit=this._form.onsubmit;this._form.onsubmit=null;this._onFormSubmitHandler=Function.createDelegate(this,this._onFormSubmit);this._onFormElementClickHandler=Function.createDelegate(this,this._onFormElementClick);this._onWindowUnloadHandler=Function.createDelegate(this,this._onWindowUnload);Sys.UI.DomEvent.addHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.addHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._onWindowUnloadHandler);this._originalDoPostBack=window.__doPostBack;if(this._originalDoPostBack)window.__doPostBack=Function.createDelegate(this,this._doPostBack);this._originalDoPostBackWithOptions=window.WebForm_DoPostBackWithOptions;if(this._originalDoPostBackWithOptions)window.WebForm_DoPostBackWithOptions=Function.createDelegate(this,this._doPostBackWithOptions);this._originalFireDefaultButton=window.WebForm_FireDefaultButton;if(this._originalFireDefaultButton)window.WebForm_FireDefaultButton=Function.createDelegate(this,this._fireDefaultButton);this._originalDoCallback=window.WebForm_DoCallback;if(this._originalDoCallback)window.WebForm_DoCallback=Function.createDelegate(this,this._doCallback);this._pageLoadedHandler=Function.createDelegate(this,this._pageLoadedInitialLoad);Sys.UI.DomEvent.addHandler(window,\"load\",this._pageLoadedHandler);if(a)this._updateControls(a,b,e,c,true)},_matchesParentIDInList:function(c,b){for(var a=0,d=b.length;a<d;a++)if(c.startsWith(b[a]+\"_\"))return true;return false},_onFormElementActive:function(a,d,e){if(a.disabled)return;this._activeElement=a;this._postBackSettings=this._getPostBackSettings(a,a.name);if(a.name){var b=a.tagName.toUpperCase();if(b===\"INPUT\"){var c=a.type;if(c===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value);else if(c===\"image\")this._additionalInput=encodeURIComponent(a.name)+\".x=\"+d+\"&\"+encodeURIComponent(a.name)+\".y=\"+e}else if(b===\"BUTTON\"&&a.name.length!==0&&a.type===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value)}},_onFormElementClick:function(a){this._activeDefaultButtonClicked=a.target===this._activeDefaultButton;this._onFormElementActive(a.target,a.offsetX,a.offsetY)},_onFormSubmit:function(i){var f,x,h=true,z=this._isCrossPost;this._isCrossPost=false;if(this._onsubmit)h=this._onsubmit();if(h)for(f=0,x=this._onSubmitStatements.length;f<x;f++)if(!this._onSubmitStatements[f]()){h=false;break}if(!h){if(i)i.preventDefault();return}var w=this._form;if(z)return;if(this._activeDefaultButton&&!this._activeDefaultButtonClicked)this._onFormElementActive(this._activeDefaultButton,0,0);if(!this._postBackSettings||!this._postBackSettings.async)return;var b=new Sys.StringBuilder,s=w.elements,B=s.length,t=this._createPanelID(null,this._postBackSettings);b.append(t);for(f=0;f<B;f++){var e=s[f],g=e.name;if(typeof g===\"undefined\"||g===null||g.length===0||g===this._scriptManagerID)continue;var n=e.tagName.toUpperCase();if(n===\"INPUT\"){var p=e.type;if(this._textTypes.test(p)||(p===\"checkbox\"||p===\"radio\")&&e.checked){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}else if(n===\"SELECT\"){var A=e.options.length;for(var q=0;q<A;q++){var u=e.options[q];if(u.selected){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(u.value));b.append(\"&\")}}}else if(n===\"TEXTAREA\"){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}b.append(\"__ASYNCPOST=true&\");if(this._additionalInput){b.append(this._additionalInput);this._additionalInput=null}var c=new Sys.Net.WebRequest,a=w.action;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var r=a.indexOf(\"#\");if(r!==-1)a=a.substr(0,r);var o=\"\",v=\"\",m=a.indexOf(\"?\");if(m!==-1){v=a.substr(m);a=a.substr(0,m)}if(/^https?\\:\\/\\/.*$/gi.test(a)){var y=a.indexOf(\"//\")+2,l=a.indexOf(\"/\",y);if(l===-1){o=a;a=\"\"}else{o=a.substr(0,l);a=a.substr(l)}}a=o+encodeURI(decodeURI(a))+v}c.set_url(a);c.get_headers()[\"X-MicrosoftAjax\"]=\"Delta=true\";c.get_headers()[\"Cache-Control\"]=\"no-cache\";c.set_timeout(this._asyncPostBackTimeout);c.add_completed(Function.createDelegate(this,this._onFormSubmitCompleted));c.set_body(b.toString());var j,d,k=this._get_eventHandlerList().getHandler(\"initializeRequest\");if(k){j=this._postBackSettings.panelsToUpdate;d=new Sys.WebForms.InitializeRequestEventArgs(c,this._postBackSettings.sourceElement,j);k(this,d);h=!d.get_cancel()}if(!h){if(i)i.preventDefault();return}if(d&&d._updated){j=d.get_updatePanelsToUpdate();c.set_body(c.get_body().replace(t,this._createPanelID(j,this._postBackSettings)))}this._scrollPosition=this._getScrollPosition();this.abortPostBack();k=this._get_eventHandlerList().getHandler(\"beginRequest\");if(k){d=new Sys.WebForms.BeginRequestEventArgs(c,this._postBackSettings.sourceElement,j||this._postBackSettings.panelsToUpdate);k(this,d)}if(this._originalDoCallback)this._cancelPendingCallbacks();this._request=c;this._processingRequest=false;c.invoke();if(i)i.preventDefault()},_onFormSubmitCompleted:function(c){this._processingRequest=true;if(c.get_timedOut()){this._endPostBack(this._createPageRequestManagerTimeoutError(),c,null);return}if(c.get_aborted()){this._endPostBack(null,c,null);return}if(!this._request||c.get_webRequest()!==this._request)return;if(c.get_statusCode()!==200){this._endPostBack(this._createPageRequestManagerServerError(c.get_statusCode()),c,null);return}var a=this._parseDelta(c);if(!a)return;var b,e;if(a.asyncPostBackControlIDsNode&&a.postBackControlIDsNode&&a.updatePanelIDsNode&&a.panelsToRefreshNode&&a.childUpdatePanelIDsNode){var r=this._updatePanelIDs,n=this._updatePanelClientIDs,i=a.childUpdatePanelIDsNode.content,p=i.length?i.split(\",\"):[],m=this._splitNodeIntoArray(a.asyncPostBackControlIDsNode),o=this._splitNodeIntoArray(a.postBackControlIDsNode),q=this._splitNodeIntoArray(a.updatePanelIDsNode),g=this._splitNodeIntoArray(a.panelsToRefreshNode),h=a.version4;for(b=0,e=g.length;b<e;b+=h?2:1){var j=(h?g[b+1]:\"\")||this._uniqueIDToClientID(g[b]);if(!document.getElementById(j)){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,j)),c,a);return}}var f=this._processUpdatePanelArrays(q,m,o,h);f.oldUpdatePanelIDs=r;f.oldUpdatePanelClientIDs=n;f.childUpdatePanelIDs=p;f.panelsToRefreshIDs=g;a.updatePanelData=f}a.dataItems={};var d;for(b=0,e=a.dataItemNodes.length;b<e;b++){d=a.dataItemNodes[b];a.dataItems[d.id]=d.content}for(b=0,e=a.dataItemJsonNodes.length;b<e;b++){d=a.dataItemJsonNodes[b];a.dataItems[d.id]=Sys.Serialization.JavaScriptSerializer.deserialize(d.content)}var l=this._get_eventHandlerList().getHandler(\"pageLoading\");if(l)l(this,this._getPageLoadingEventArgs(a));Sys._ScriptLoader.readLoadedScripts();Sys.Application.beginCreateComponents();var k=Sys._ScriptLoader.getInstance();this._queueScripts(k,a.scriptBlockNodes,true,false);this._processingRequest=true;k.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadComplete,a)),Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadFailed,a)),null)},_onWindowUnload:function(){this.dispose()},_pageLoaded:function(a,c){var b=this._get_eventHandlerList().getHandler(\"pageLoaded\");if(b)b(this,this._getPageLoadedEventArgs(a,c));if(!a)Sys.Application.raiseLoad()},_pageLoadedInitialLoad:function(){this._pageLoaded(true,null)},_parseDelta:function(h){var c=h.get_responseData(),d,i,E,F,D,b=0,e=null,k=[];while(b<c.length){d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}i=parseInt(c.substring(b,d),10);if(i%1!==0){e=this._findText(c,b);break}b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}E=c.substring(b,d);b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}F=c.substring(b,d);b=d+1;if(b+i>=c.length){e=this._findText(c,c.length);break}D=c.substr(b,i);b+=i;if(c.charAt(b)!==\"|\"){e=this._findText(c,b);break}b++;Array.add(k,{type:E,id:F,content:D})}if(e){this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_ParserErrorDetails,e)),h,null);return null}var x=[],w=[],q=[],j=[],t=[],C=[],A=[],z=[],v=[],s=[],m,p,u,n,o,r,y,g;for(var l=0,G=k.length;l<G;l++){var a=k[l];switch(a.type){case \"#\":g=a;break;case \"updatePanel\":Array.add(x,a);break;case \"hiddenField\":Array.add(w,a);break;case \"arrayDeclaration\":Array.add(q,a);break;case \"scriptBlock\":Array.add(j,a);break;case \"fallbackScript\":j[j.length-1].fallback=a.id;case \"scriptStartupBlock\":Array.add(t,a);break;case \"expando\":Array.add(C,a);break;case \"onSubmit\":Array.add(A,a);break;case \"asyncPostBackControlIDs\":m=a;break;case \"postBackControlIDs\":p=a;break;case \"updatePanelIDs\":u=a;break;case \"asyncPostBackTimeout\":n=a;break;case \"childUpdatePanelIDs\":o=a;break;case \"panelsToRefreshIDs\":r=a;break;case \"formAction\":y=a;break;case \"dataItem\":Array.add(z,a);break;case \"dataItemJson\":Array.add(v,a);break;case \"scriptDispose\":Array.add(s,a);break;case \"pageRedirect\":if(g&&parseFloat(g.content)>=4)a.content=unescape(a.content);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var f=document.createElement(\"a\");f.style.display=\"none\";f.attachEvent(\"onclick\",B);f.href=a.content;this._form.parentNode.insertBefore(f,this._form);f.click();f.detachEvent(\"onclick\",B);this._form.parentNode.removeChild(f);function B(a){a.cancelBubble=true}}else window.location.href=a.content;return null;case \"error\":this._endPostBack(this._createPageRequestManagerServerError(Number.parseInvariant(a.id),a.content),h,null);return null;case \"pageTitle\":document.title=a.content;break;case \"focus\":this._controlIDToFocus=a.content;break;default:this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_UnknownToken,a.type)),h,null);return null}}return {version4:g?parseFloat(g.content)>=4:false,executor:h,updatePanelNodes:x,hiddenFieldNodes:w,arrayDeclarationNodes:q,scriptBlockNodes:j,scriptStartupNodes:t,expandoNodes:C,onSubmitNodes:A,dataItemNodes:z,dataItemJsonNodes:v,scriptDisposeNodes:s,asyncPostBackControlIDsNode:m,postBackControlIDsNode:p,updatePanelIDsNode:u,asyncPostBackTimeoutNode:n,childUpdatePanelIDsNode:o,panelsToRefreshNode:r,formActionNode:y}},_processUpdatePanelArrays:function(e,q,r,f){var d,c,b;if(e){var i=e.length,j=f?2:1;d=new Array(i/j);c=new Array(i/j);b=new Array(i/j);for(var g=0,h=0;g<i;g+=j,h++){var p,a=e[g],k=f?e[g+1]:\"\";p=a.charAt(0)===\"t\";a=a.substr(1);if(!k)k=this._uniqueIDToClientID(a);b[h]=p;d[h]=a;c[h]=k}}else{d=[];c=[];b=[]}var n=[],l=[];this._convertToClientIDs(q,n,l,f);var o=[],m=[];this._convertToClientIDs(r,o,m,f);return {updatePanelIDs:d,updatePanelClientIDs:c,updatePanelHasChildrenAsTriggers:b,asyncPostBackControlIDs:n,asyncPostBackControlClientIDs:l,postBackControlIDs:o,postBackControlClientIDs:m}},_queueScripts:function(scriptLoader,scriptBlockNodes,queueIncludes,queueBlocks){for(var i=0,l=scriptBlockNodes.length;i<l;i++){var scriptBlockType=scriptBlockNodes[i].id;switch(scriptBlockType){case \"ScriptContentNoTags\":if(!queueBlocks)continue;scriptLoader.queueScriptBlock(scriptBlockNodes[i].content);break;case \"ScriptContentWithTags\":var scriptTagAttributes;eval(\"scriptTagAttributes = \"+scriptBlockNodes[i].content);if(scriptTagAttributes.src){if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(scriptTagAttributes.src))continue}else if(!queueBlocks)continue;scriptLoader.queueCustomScriptTag(scriptTagAttributes);break;case \"ScriptPath\":var script=scriptBlockNodes[i];if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(script.content))continue;scriptLoader.queueScriptReference(script.content,script.fallback)}}},_registerDisposeScript:function(a,b){if(!this._scriptDisposes[a])this._scriptDisposes[a]=[b];else Array.add(this._scriptDisposes[a],b)},_scriptIncludesLoadComplete:function(e,b){if(b.executor.get_webRequest()!==this._request)return;this._commitControls(b.updatePanelData,b.asyncPostBackTimeoutNode?b.asyncPostBackTimeoutNode.content:null);if(b.formActionNode)this._form.action=b.formActionNode.content;var a,d,c;for(a=0,d=b.updatePanelNodes.length;a<d;a++){c=b.updatePanelNodes[a];var j=document.getElementById(c.id);if(!j){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,c.id)),b.executor,b);return}this._updatePanel(j,c.content)}for(a=0,d=b.scriptDisposeNodes.length;a<d;a++){c=b.scriptDisposeNodes[a];this._registerDisposeScript(c.id,c.content)}for(a=0,d=this._transientFields.length;a<d;a++){var g=document.getElementById(this._transientFields[a]);if(g){var k=g._isContained?g.parentNode:g;k.parentNode.removeChild(k)}}for(a=0,d=b.hiddenFieldNodes.length;a<d;a++){c=b.hiddenFieldNodes[a];this._createHiddenField(c.id,c.content)}if(b.scriptsFailed)throw Sys._ScriptLoader._errorScriptLoadFailed(b.scriptsFailed.src,b.scriptsFailed.multipleCallbacks);this._queueScripts(e,b.scriptBlockNodes,false,true);var i=\"\";for(a=0,d=b.arrayDeclarationNodes.length;a<d;a++){c=b.arrayDeclarationNodes[a];i+=\"Sys.WebForms.PageRequestManager._addArrayElement('\"+c.id+\"', \"+c.content+\");\\r\\n\"}var h=\"\";for(a=0,d=b.expandoNodes.length;a<d;a++){c=b.expandoNodes[a];h+=c.id+\" = \"+c.content+\"\\r\\n\"}if(i.length)e.queueScriptBlock(i);if(h.length)e.queueScriptBlock(h);this._queueScripts(e,b.scriptStartupNodes,true,true);var f=\"\";for(a=0,d=b.onSubmitNodes.length;a<d;a++){if(a===0)f=\"Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, function() {\\r\\n\";f+=b.onSubmitNodes[a].content+\"\\r\\n\"}if(f.length){f+=\"\\r\\nreturn true;\\r\\n});\\r\\n\";e.queueScriptBlock(f)}e.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptsLoadComplete,b)),null,null)},_scriptIncludesLoadFailed:function(d,c,b,a){a.scriptsFailed={src:c.src,multipleCallbacks:b};this._scriptIncludesLoadComplete(d,a)},_scriptsLoadComplete:function(f,c){var e=c.executor;if(window.__theFormPostData)window.__theFormPostData=\"\";if(window.__theFormPostCollection)window.__theFormPostCollection=[];if(window.WebForm_InitCallback)window.WebForm_InitCallback();if(this._scrollPosition){if(window.scrollTo)window.scrollTo(this._scrollPosition.x,this._scrollPosition.y);this._scrollPosition=null}Sys.Application.endCreateComponents();this._pageLoaded(false,c);this._endPostBack(null,e,c);if(this._controlIDToFocus){var a,d;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var b=$get(this._controlIDToFocus);a=b;if(b&&!WebForm_CanFocus(b))a=WebForm_FindFirstFocusableChild(b);if(a&&typeof a.contentEditable!==\"undefined\"){d=a.contentEditable;a.contentEditable=false}else a=null}WebForm_AutoFocus(this._controlIDToFocus);if(a)a.contentEditable=d;this._controlIDToFocus=null}},_splitNodeIntoArray:function(b){var a=b.content,c=a.length?a.split(\",\"):[];return c},_uniqueIDToClientID:function(a){return a.replace(/\\$/g,\"_\")},_updateControls:function(d,a,c,b,e){this._commitControls(this._processUpdatePanelArrays(d,a,c,e),b)},_updatePanel:function(updatePanelElement,rendering){for(var updatePanelID in this._scriptDisposes)if(this._elementContains(updatePanelElement,document.getElementById(updatePanelID))){var disposeScripts=this._scriptDisposes[updatePanelID];for(var i=0,l=disposeScripts.length;i<l;i++)eval(disposeScripts[i]);delete this._scriptDisposes[updatePanelID]}Sys.Application.disposeElement(updatePanelElement,true);updatePanelElement.innerHTML=rendering},_validPosition:function(a){return typeof a!==\"undefined\"&&a!==null&&a!==0}};Sys.WebForms.PageRequestManager.getInstance=function(){var a=Sys.WebForms.PageRequestManager._instance;if(!a)a=Sys.WebForms.PageRequestManager._instance=new Sys.WebForms.PageRequestManager;return a};Sys.WebForms.PageRequestManager._addArrayElement=function(a){if(!window[a])window[a]=[];for(var b=1,c=arguments.length;b<c;b++)Array.add(window[a],arguments[b])};Sys.WebForms.PageRequestManager._initialize=function(){var a=Sys.WebForms.PageRequestManager.getInstance();a._initializeInternal.apply(a,arguments)};Sys.WebForms.PageRequestManager.registerClass(\"Sys.WebForms.PageRequestManager\");Sys.UI._UpdateProgress=function(a){Sys.UI._UpdateProgress.initializeBase(this,[a]);this._displayAfter=500;this._dynamicLayout=true;this._associatedUpdatePanelId=null;this._beginRequestHandlerDelegate=null;this._startDelegate=null;this._endRequestHandlerDelegate=null;this._pageRequestManager=null;this._timerCookie=null};Sys.UI._UpdateProgress.prototype={get_displayAfter:function(){return this._displayAfter},set_displayAfter:function(a){this._displayAfter=a},get_dynamicLayout:function(){return this._dynamicLayout},set_dynamicLayout:function(a){this._dynamicLayout=a},get_associatedUpdatePanelId:function(){return this._associatedUpdatePanelId},set_associatedUpdatePanelId:function(a){this._associatedUpdatePanelId=a},get_role:function(){return \"status\"},_clearTimeout:function(){if(this._timerCookie){window.clearTimeout(this._timerCookie);this._timerCookie=null}},_getUniqueID:function(b){var a=Array.indexOf(this._pageRequestManager._updatePanelClientIDs,b);return a===-1?null:this._pageRequestManager._updatePanelIDs[a]},_handleBeginRequest:function(f,e){var b=e.get_postBackElement(),a=true,d=this._associatedUpdatePanelId;if(this._associatedUpdatePanelId){var c=e.get_updatePanelsToUpdate();if(c&&c.length)a=Array.contains(c,d)||Array.contains(c,this._getUniqueID(d));else a=false}while(!a&&b){if(b.id&&this._associatedUpdatePanelId===b.id)a=true;b=b.parentNode}if(a)this._timerCookie=window.setTimeout(this._startDelegate,this._displayAfter)},_startRequest:function(){if(this._pageRequestManager.get_isInAsyncPostBack()){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"block\";else a.style.visibility=\"visible\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"false\")}this._timerCookie=null},_handleEndRequest:function(){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"none\";else a.style.visibility=\"hidden\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"true\");this._clearTimeout()},dispose:function(){if(this._beginRequestHandlerDelegate!==null){this._pageRequestManager.remove_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);this._beginRequestHandlerDelegate=null;this._endRequestHandlerDelegate=null}this._clearTimeout();Sys.UI._UpdateProgress.callBaseMethod(this,\"dispose\")},initialize:function(){Sys.UI._UpdateProgress.callBaseMethod(this,\"initialize\");if(this.get_role()===\"status\")this.get_element().setAttribute(\"aria-hidden\",\"true\");this._beginRequestHandlerDelegate=Function.createDelegate(this,this._handleBeginRequest);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);this._startDelegate=Function.createDelegate(this,this._startRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null){this._pageRequestManager.add_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate)}}};Sys.UI._UpdateProgress.registerClass(\"Sys.UI._UpdateProgress\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebServices.js\nType._registerScript(\"MicrosoftAjaxWebServices.js\",[\"MicrosoftAjaxNetwork.js\"]);Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Menu.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/Menu.js\nvar __rootMenuItem;\nvar __menuInterval;\nvar __scrollPanel;\nvar __disappearAfter = 500;\nfunction Menu_ClearInterval() {\n    if (__menuInterval) {\n        window.clearInterval(__menuInterval);\n    }\n}\nfunction Menu_Collapse(item) {\n    Menu_SetRoot(item);\n    if (__rootMenuItem) {\n        Menu_ClearInterval();\n        if (__disappearAfter >= 0) {\n            __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n        }\n    }\n}\nfunction Menu_Expand(item, horizontalOffset, verticalOffset, hideScrollers) {\n    Menu_ClearInterval();\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    var horizontal = true;\n    if (!tr.id) {\n        horizontal = false;\n        tr = tr.parentNode;\n    }\n    var child = Menu_FindSubMenu(item);\n    if (child) {\n        var data = Menu_GetData(item);\n        if (!data) {\n            return null;\n        }\n        child.rel = tr.id;\n        child.x = horizontalOffset;\n        child.y = verticalOffset;\n        if (horizontal) child.pos = \"bottom\";\n        PopOut_Show(child.id, hideScrollers, data);\n    }\n    Menu_SetRoot(item);\n    if (child) {\n        if (!document.body.__oldOnClick && document.body.onclick) {\n            document.body.__oldOnClick = document.body.onclick;\n        }\n        if (__rootMenuItem) {\n            document.body.onclick = Menu_HideItems;\n        }\n    }\n    Menu_ResetSiblings(tr);\n    return child;\n}\nfunction Menu_FindMenu(item) {\n    if (item && item.menu) return item.menu;\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr = tr.parentNode;\n    }\n    for (var i = tr.id.length - 1; i >= 0; i--) {\n        if (tr.id.charAt(i) < '0' || tr.id.charAt(i) > '9') {\n            var menu = WebForm_GetElementById(tr.id.substr(0, i));\n            if (menu) {\n                item.menu = menu;\n                return menu;\n            }\n        }\n    }\n    return null;\n}\nfunction Menu_FindNext(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var first = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        var match = false;\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (Menu_FindParentContainer(link) == parent) {\n                    if (match) {\n                        return link;\n                    }\n                    else if (!first) {\n                        first = link;\n                    }\n                }\n                if (!match && link == a) {\n                    match = true;\n                }\n            }\n        }\n    }\n    return first;\n}\nfunction Menu_FindParentContainer(item) {\n    if (item.menu_ParentContainerCache) return item.menu_ParentContainerCache;\n    var a = (item.tagName.toLowerCase() == \"a\") ? item : WebForm_GetElementByTagName(item, \"A\");\n    var menu = Menu_FindMenu(a);\n    if (menu) {\n        var parent = item;\n        while (parent && parent.tagName &&\n            parent.id != menu.id &&\n            parent.tagName.toLowerCase() != \"div\") {\n            parent = parent.parentNode;\n        }\n        item.menu_ParentContainerCache = parent;\n        return parent;\n    }\n}\nfunction Menu_FindParentItem(item) {\n    var parentContainer = Menu_FindParentContainer(item);\n    var parentContainerID = parentContainer.id;\n    var len = parentContainerID.length;\n    if (parentContainerID && parentContainerID.substr(len - 5) == \"Items\") {\n        var parentItemID = parentContainerID.substr(0, len - 5);\n        return WebForm_GetElementById(parentItemID);\n    }\n    return null;\n}\nfunction Menu_FindPrevious(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var last = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (link == a && last) {\n                    return last;\n                }\n                if (Menu_FindParentContainer(link) == parent) {\n                    last = link;\n                }\n            }\n        }\n    }\n    return last;\n}\nfunction Menu_FindSubMenu(item) {\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr=tr.parentNode;\n    }\n    return WebForm_GetElementById(tr.id + \"Items\");\n}\nfunction Menu_Focus(item) {\n    if (item && item.focus) {\n        var pos = WebForm_GetElementPosition(item);\n        var parentContainer = Menu_FindParentContainer(item);\n        if (!parentContainer.offset) {\n            parentContainer.offset = 0;\n        }\n        var posParent = WebForm_GetElementPosition(parentContainer);\n        var delta;\n        if (pos.y + pos.height > posParent.y + parentContainer.offset + parentContainer.clippedHeight) {\n            delta = pos.y + pos.height - posParent.y - parentContainer.offset - parentContainer.clippedHeight;\n            PopOut_Scroll(parentContainer, delta);\n        }\n        else if (pos.y < posParent.y + parentContainer.offset) {\n            delta = posParent.y + parentContainer.offset - pos.y;\n            PopOut_Scroll(parentContainer, -delta);\n        }\n        PopOut_HideScrollers(parentContainer);\n        item.focus();\n    }\n}\nfunction Menu_GetData(item) {\n    if (!item.data) {\n        var a = (item.tagName.toLowerCase() == \"a\" ? item : WebForm_GetElementByTagName(item, \"a\"));\n        var menu = Menu_FindMenu(a);\n        try {\n            item.data = eval(menu.id + \"_Data\");\n        }\n        catch(e) {}\n    }\n    return item.data;\n}\nfunction Menu_HideItems(items) {\n    if (document.body.__oldOnClick) {\n        document.body.onclick = document.body.__oldOnClick;\n        document.body.__oldOnClick = null;\n    }\n    Menu_ClearInterval();\n    if (!items || ((typeof(items.tagName) == \"undefined\") && (items instanceof Event))) {\n        items = __rootMenuItem;\n    }\n    var table = items;\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        table = WebForm_GetElementByTagName(table, \"TABLE\");\n    }\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        return;\n    }\n    var rows = table.rows ? table.rows : table.firstChild.rows;\n    var isVertical = false;\n    for (var r = 0; r < rows.length; r++) {\n        if (rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, nextLevel;\n    if (isVertical) {\n        for(i = 0; i < rows.length; i++) {\n            if (rows[i].id) {\n                child = WebForm_GetElementById(rows[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else if (rows[i].cells[0]) {\n                nextLevel = WebForm_GetElementByTagName(rows[i].cells[0], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(nextLevel);\n                }\n            }\n        }\n    }\n    else if (rows[0]) {\n        for(i = 0; i < rows[0].cells.length; i++) {\n            if (rows[0].cells[i].id) {\n                child = WebForm_GetElementById(rows[0].cells[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else {\n                nextLevel = WebForm_GetElementByTagName(rows[0].cells[i], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(rows[0].cells[i].firstChild);\n                }\n            }\n        }\n    }\n    if (items && items.id) {\n        PopOut_Hide(items.id);\n    }\n}\nfunction Menu_HoverDisabled(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    node = WebForm_GetElementByTagName(node, \"table\").rows[0].cells[0].childNodes[0];\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverDynamic(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.hoverClass) {\n        nodeTable.hoverClass = data.hoverClass;\n        WebForm_AppendToClassName(nodeTable, data.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.hoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n    }\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverRoot(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) {\n        return null;\n    }\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.staticHoverClass) {\n        nodeTable.hoverClass = data.staticHoverClass;\n        WebForm_AppendToClassName(nodeTable, data.staticHoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.staticHoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.staticHoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.staticHoverHyperLinkClass);\n    }\n    return node;\n}\nfunction Menu_HoverStatic(item) {\n    var node = Menu_HoverRoot(item);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    __disappearAfter = data.disappearAfter;\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_IsHorizontal(item) {\n    if (item) {\n        var a = ((item.tagName && (item.tagName.toLowerCase == \"a\")) ? item : WebForm_GetElementByTagName(item, \"A\"));\n        if (!a) {\n            return false;\n        }\n        var td = a.parentNode.parentNode.parentNode.parentNode.parentNode;\n        if (td.id) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction Menu_IsSelectable(link) {\n    return (link && link.href)\n}\nfunction Menu_Key(item) {\n    var event;\n    if (item.currentTarget) {\n        event = item;\n        item = event.currentTarget;\n    }\n    else {\n        event = window.event;        \n    }\n    var key = (event ? event.keyCode : -1);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var horizontal = Menu_IsHorizontal(item);\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var nextItem, parentItem, previousItem;\n    if ((!horizontal && key == 38) || (horizontal && key == 37)) {\n        previousItem = Menu_FindPrevious(item);\n        while (previousItem && previousItem.disabled) {\n            previousItem = Menu_FindPrevious(previousItem);\n        }\n        if (previousItem) {\n            Menu_Focus(previousItem);\n            Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 40) || (horizontal && key == 39)) {\n        if (horizontal) {\n            var subMenu = Menu_FindSubMenu(a);\n            if (subMenu && subMenu.style && subMenu.style.visibility && \n                subMenu.style.visibility.toLowerCase() == \"hidden\") {\n                Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        nextItem = Menu_FindNext(item);\n        while (nextItem && nextItem.disabled) {\n            nextItem = Menu_FindNext(nextItem);\n        }\n        if (nextItem) {\n            Menu_Focus(nextItem);\n            Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 39) || (horizontal && key == 40)) {\n        var children = Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n        if (children) {\n            var firstChild;\n            children = WebForm_GetElementsByTagName(children, \"A\");\n            for (var i = 0; i < children.length; i++) {\n                if (!children[i].disabled && Menu_IsSelectable(children[i])) {\n                    firstChild = children[i];\n                    break;\n                }\n            }\n            if (firstChild) {\n                Menu_Focus(firstChild);\n                Menu_Expand(firstChild, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        else {\n            parentItem = Menu_FindParentItem(item);\n            while (parentItem && !Menu_IsHorizontal(parentItem)) {\n                parentItem = Menu_FindParentItem(parentItem);\n            }\n            if (parentItem) {\n                nextItem = Menu_FindNext(parentItem);\n                while (nextItem && nextItem.disabled) {\n                    nextItem = Menu_FindNext(nextItem);\n                }\n                if (nextItem) {\n                    Menu_Focus(nextItem);\n                    Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n        }\n    }\n    if ((!horizontal && key == 37) || (horizontal && key == 38)) {\n        parentItem = Menu_FindParentItem(item);\n        if (parentItem) {\n            if (Menu_IsHorizontal(parentItem)) {\n                previousItem = Menu_FindPrevious(parentItem);\n                while (previousItem && previousItem.disabled) {\n                    previousItem = Menu_FindPrevious(previousItem);\n                }\n                if (previousItem) {\n                    Menu_Focus(previousItem);\n                    Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n            var parentA = WebForm_GetElementByTagName(parentItem, \"A\");\n            if (parentA) {\n                Menu_Focus(parentA);\n            }\n            Menu_ResetSiblings(parentItem);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if (key == 27) {\n        Menu_HideItems();\n        event.cancelBubble = true;\n        if (event.stopPropagation) event.stopPropagation();\n        return;\n    }\n}\nfunction Menu_ResetSiblings(item) {\n    var table = (item.tagName.toLowerCase() == \"td\") ?\n        item.parentNode.parentNode.parentNode :\n        item.parentNode.parentNode;\n    var isVertical = false;\n    for (var r = 0; r < table.rows.length; r++) {\n        if (table.rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, childNode;\n    if (isVertical) {\n        for(i = 0; i < table.rows.length; i++) {\n            childNode = table.rows[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    else {\n        for(i = 0; i < table.rows[0].cells.length; i++) {\n            childNode = table.rows[0].cells[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    Menu_ResetTopMenus(table, table, 0, true);\n}\nfunction Menu_ResetTopMenus(table, doNotReset, level, up) {\n    var i, child, childNode;\n    if (up && table.id == \"\") {\n        var parentTable = table.parentNode.parentNode.parentNode.parentNode;\n        if (parentTable.tagName.toLowerCase() == \"table\") {\n            Menu_ResetTopMenus(parentTable, doNotReset, level + 1, true);\n        }\n    }\n    else {\n        if (level == 0 && table != doNotReset) {\n            if (table.rows[0].id) {\n                for(i = 0; i < table.rows.length; i++) {\n                    childNode = table.rows[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n            else {\n                for(i = 0; i < table.rows[0].cells.length; i++) {\n                    childNode = table.rows[0].cells[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n        }\n        else if (level > 0) {\n            for (i = 0; i < table.rows.length; i++) {\n                for (var j = 0; j < table.rows[i].cells.length; j++) {\n                    var subTable = table.rows[i].cells[j].firstChild;\n                    if (subTable && subTable.tagName.toLowerCase() == \"table\") {\n                        Menu_ResetTopMenus(subTable, doNotReset, level - 1, false);\n                    }\n                }\n            }\n        }\n    }\n}\nfunction Menu_RestoreInterval() {\n    if (__menuInterval && __rootMenuItem) {\n        Menu_ClearInterval();\n        __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n    }\n}\nfunction Menu_SetRoot(item) {\n    var newRoot = Menu_FindMenu(item);\n    if (newRoot) {\n        if (__rootMenuItem && __rootMenuItem != newRoot) {\n            Menu_HideItems();\n        }\n        __rootMenuItem = newRoot;\n    }\n}\nfunction Menu_Unhover(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (nodeTable.hoverClass) {\n        WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (node.hoverHyperLinkClass) {\n        WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n    }\n    Menu_Collapse(node);\n}\nfunction PopOut_Clip(element, y, height) {\n    if (element && element.style) {\n        element.style.clip = \"rect(\" + y + \"px auto \" + (y + height) + \"px auto)\";\n        element.style.overflow = \"hidden\";\n    }\n}\nfunction PopOut_Down(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && ((panel.offset + panel.clippedHeight) < panel.physicalHeight)) {\n        PopOut_Scroll(panel, 2)\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Down()\", 8);\n    }\n    else {\n        PopOut_ShowScrollers(panel);\n    }\n}\nfunction PopOut_Hide(panelId) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"hidden\";\n        panel.style.display = \"none\";\n        panel.offset = 0;\n        panel.scrollTop = 0;\n        var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n        if (table) {\n            WebForm_SetElementY(table, 0);\n        }\n        if (window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" &&\n            !window.opera) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            if (childFrame) {\n                childFrame.style.display = \"none\";\n            }\n        }\n    }\n}\nfunction PopOut_HideScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        if (up) {\n            up.style.visibility = \"hidden\";\n            up.style.display = \"none\";\n        }\n        if (dn) {\n            dn.style.visibility = \"hidden\";\n            dn.style.display = \"none\";\n        }\n    }\n}\nfunction PopOut_Position(panel, hideScrollers) {\n    if (window.opera) {\n        panel.parentNode.removeChild(panel);\n        document.forms[0].appendChild(panel);\n    }\n    var rel = WebForm_GetElementById(panel.rel);\n    var relTable = WebForm_GetElementByTagName(rel, \"TABLE\");\n    var relCoordinates = WebForm_GetElementPosition(relTable ? relTable : rel);\n    var panelCoordinates = WebForm_GetElementPosition(panel);\n    var panelHeight = ((typeof(panel.physicalHeight) != \"undefined\") && (panel.physicalHeight != null)) ?\n        panel.physicalHeight :\n        panelCoordinates.height;\n    panel.physicalHeight = panelHeight;\n    var panelParentCoordinates;\n    if (panel.offsetParent) {\n        panelParentCoordinates = WebForm_GetElementPosition(panel.offsetParent);\n    }\n    else {\n        panelParentCoordinates = new Object();\n        panelParentCoordinates.x = 0;\n        panelParentCoordinates.y = 0;\n    }\n    var overflowElement = WebForm_GetElementById(\"__overFlowElement\");\n    if (!overflowElement) {\n        overflowElement = document.createElement(\"img\");\n        overflowElement.id=\"__overFlowElement\";\n        WebForm_SetElementWidth(overflowElement, 1);\n        document.body.appendChild(overflowElement);\n    }\n    WebForm_SetElementHeight(overflowElement, panelHeight + relCoordinates.y + parseInt(panel.y ? panel.y : 0));\n    overflowElement.style.visibility = \"visible\";\n    overflowElement.style.display = \"inline\";\n    var clientHeight = 0;\n    var clientWidth = 0;\n    if (window.innerHeight) {\n        clientHeight = window.innerHeight;\n        clientWidth = window.innerWidth;\n    }\n    else if (document.documentElement && document.documentElement.clientHeight) {\n        clientHeight = document.documentElement.clientHeight;\n        clientWidth = document.documentElement.clientWidth;\n    }\n    else if (document.body && document.body.clientHeight) {\n        clientHeight = document.body.clientHeight;\n        clientWidth = document.body.clientWidth;\n    }\n    var scrollTop = 0;\n    var scrollLeft = 0;\n    if (typeof(window.pageYOffset) != \"undefined\") {\n        scrollTop = window.pageYOffset;\n        scrollLeft = window.pageXOffset;\n    }\n    else if (document.documentElement && (typeof(document.documentElement.scrollTop) != \"undefined\")) {\n        scrollTop = document.documentElement.scrollTop;\n        scrollLeft = document.documentElement.scrollLeft;\n    }\n    else if (document.body && (typeof(document.body.scrollTop) != \"undefined\")) {\n        scrollTop = document.body.scrollTop;\n        scrollLeft = document.body.scrollLeft;\n    }\n    overflowElement.style.visibility = \"hidden\";\n    overflowElement.style.display = \"none\";\n    var bottomWindowBorder = clientHeight + scrollTop;\n    var rightWindowBorder = clientWidth + scrollLeft;\n    var position = panel.pos;\n    if ((typeof(position) == \"undefined\") || (position == null) || (position == \"\")) {\n        position = (WebForm_GetElementDir(rel) == \"rtl\" ? \"middleleft\" : \"middleright\");\n    }\n    position = position.toLowerCase();\n    var y = relCoordinates.y + parseInt(panel.y ? panel.y : 0) - panelParentCoordinates.y;\n    var borderParent = (rel && rel.parentNode && rel.parentNode.parentNode && rel.parentNode.parentNode.parentNode\n        && rel.parentNode.parentNode.parentNode.tagName.toLowerCase() == \"div\") ?\n        rel.parentNode.parentNode.parentNode : null;\n    WebForm_SetElementY(panel, y);\n    PopOut_SetPanelHeight(panel, panelHeight, true);\n    var clip = false;\n    var overflow;\n    if (position.indexOf(\"top\") != -1) {\n        y -= panelHeight;\n        WebForm_SetElementY(panel, y); \n        if (y < -panelParentCoordinates.y) {\n            y = -panelParentCoordinates.y;\n            WebForm_SetElementY(panel, y); \n            if (panelHeight > clientHeight - 2) {\n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    else {\n        if (position.indexOf(\"bottom\") != -1) {\n            y += relCoordinates.height;\n            WebForm_SetElementY(panel, y); \n        }\n        overflow = y + panelParentCoordinates.y + panelHeight - bottomWindowBorder;\n        if (overflow > 0) {\n            y -= overflow;\n            WebForm_SetElementY(panel, y); \n            if (y < -panelParentCoordinates.y) {\n                y = 2 - panelParentCoordinates.y + scrollTop;\n                WebForm_SetElementY(panel, y); \n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    if (!clip) {\n        PopOut_SetPanelHeight(panel, panel.clippedHeight, true);\n    }\n    var panelParentOffsetY = 0;\n    if (panel.offsetParent) {\n        panelParentOffsetY = WebForm_GetElementPosition(panel.offsetParent).y;\n    }\n    var panelY = ((typeof(panel.originY) != \"undefined\") && (panel.originY != null)) ?\n        panel.originY :\n        y - panelParentOffsetY;\n    panel.originY = panelY;\n    if (!hideScrollers) {\n        PopOut_ShowScrollers(panel);\n    }\n    else {\n        PopOut_HideScrollers(panel);\n    }\n    var x = relCoordinates.x + parseInt(panel.x ? panel.x : 0) - panelParentCoordinates.x;\n    if (borderParent && borderParent.clientLeft) {\n        x += 2 * borderParent.clientLeft;\n    }\n    WebForm_SetElementX(panel, x);\n    if (position.indexOf(\"left\") != -1) {\n        x -= panelCoordinates.width;\n        WebForm_SetElementX(panel, x);\n        if (x < -panelParentCoordinates.x) {\n            WebForm_SetElementX(panel, -panelParentCoordinates.x);\n        }\n    }\n    else {\n        if (position.indexOf(\"right\") != -1) {\n            x += relCoordinates.width;\n            WebForm_SetElementX(panel, x);\n        }\n        overflow = x + panelParentCoordinates.x + panelCoordinates.width - rightWindowBorder;\n        if (overflow > 0) {\n            if (position.indexOf(\"bottom\") == -1 && relCoordinates.x > panelCoordinates.width) {\n                x -= relCoordinates.width + panelCoordinates.width;\n            }\n            else {\n                x -= overflow;\n            }\n            WebForm_SetElementX(panel, x);\n            if (x < -panelParentCoordinates.x) {\n                WebForm_SetElementX(panel, -panelParentCoordinates.x);\n            }\n        }\n    }\n}\nfunction PopOut_Scroll(panel, offsetDelta) {\n    var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n    if (!table) return;\n    table.style.position = \"relative\";\n    var tableY = (table.style.top ? parseInt(table.style.top) : 0);\n    panel.offset += offsetDelta;\n    WebForm_SetElementY(table, tableY - offsetDelta);\n}\nfunction PopOut_SetPanelHeight(element, height, doNotClip) {\n    if (element && element.style) {\n        var size = WebForm_GetElementPosition(element);\n        element.physicalWidth = size.width;\n        element.clippedHeight = height;\n        WebForm_SetElementHeight(element, height - (element.clientTop ? (2 * element.clientTop) : 0));\n        if (doNotClip && element.style) {\n            element.style.clip = \"rect(auto auto auto auto)\";\n        }\n        else {\n            PopOut_Clip(element, 0, height);\n        }\n    }\n}\nfunction PopOut_Show(panelId, hideScrollers, data) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"visible\";\n        panel.style.display = \"inline\";\n        if (!panel.offset || hideScrollers) {\n            panel.scrollTop = 0;\n            panel.offset = 0;\n            var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n            if (table) {\n                WebForm_SetElementY(table, 0);\n            }\n        }\n        PopOut_Position(panel, hideScrollers);\n        var z = 1;\n        var isIE = window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" && !window.opera;\n        if (isIE && data) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            var parent = panel.offsetParent;\n            if (!childFrame) {\n                childFrame = document.createElement(\"iframe\");\n                childFrame.id = childFrameId;\n                childFrame.src = (data.iframeUrl ? data.iframeUrl : \"about:blank\");\n                childFrame.style.position = \"absolute\";\n                childFrame.style.display = \"none\";\n                childFrame.scrolling = \"no\";\n                childFrame.frameBorder = \"0\";\n                if (parent.tagName.toLowerCase() == \"html\") {\n                    document.body.appendChild(childFrame);\n                }\n                else {\n                    parent.appendChild(childFrame);\n                }\n            }\n            var pos = WebForm_GetElementPosition(panel);\n            var parentPos = WebForm_GetElementPosition(parent);\n            WebForm_SetElementX(childFrame, pos.x - parentPos.x);\n            WebForm_SetElementY(childFrame, pos.y - parentPos.y);\n            WebForm_SetElementWidth(childFrame, pos.width);\n            WebForm_SetElementHeight(childFrame, pos.height);\n            childFrame.style.display = \"block\";\n            if (panel.currentStyle && panel.currentStyle.zIndex && panel.currentStyle.zIndex != \"auto\") {\n                z = panel.currentStyle.zIndex;\n            }\n            else if (panel.style.zIndex) {\n                z = panel.style.zIndex;\n            }\n        }\n        panel.style.zIndex = z;\n    }\n}\nfunction PopOut_ShowScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        var cnt = 0;\n        if (up && dn) {\n            if (panel.offset && panel.offset > 0) {\n                up.style.visibility = \"visible\";\n                up.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(up, panel.clientWidth\n                        - (up.clientLeft ? (2 * up.clientLeft) : 0));\n                }\n                WebForm_SetElementY(up, 0);\n            }\n            else {\n                up.style.visibility = \"hidden\";\n                up.style.display = \"none\";\n            }\n            if (panel.offset + panel.clippedHeight + 2 <= panel.physicalHeight) {\n                dn.style.visibility = \"visible\";\n                dn.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(dn, panel.clientWidth\n                        - (dn.clientLeft ? (2 * dn.clientLeft) : 0));\n                }\n                WebForm_SetElementY(dn, panel.clippedHeight - WebForm_GetElementPosition(dn).height\n                    - (panel.clientTop ? (2 * panel.clientTop) : 0));\n            }\n            else {\n                dn.style.visibility = \"hidden\";\n                dn.style.display = \"none\";\n            }\n            if (cnt == 0) {\n                panel.style.clip = \"rect(auto auto auto auto)\";\n            }\n        }\n    }\n}\nfunction PopOut_Stop() {\n    if (__scrollPanel && __scrollPanel.interval) {\n        window.clearInterval(__scrollPanel.interval);\n    }\n    Menu_RestoreInterval();\n}\nfunction PopOut_Up(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && panel.offset && panel.offset > 0) {\n        PopOut_Scroll(panel, -2);\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Up()\", 8);\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MenuStandards.js",
    "content": "﻿//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MenuStandards.js\nif (!window.Sys) { window.Sys = {}; }\nif (!Sys.WebForms) { Sys.WebForms = {}; }\nSys.WebForms.Menu = function(options) {\n    this.items = [];\n    this.depth = options.depth || 1;\n    this.parentMenuItem = options.parentMenuItem;\n    this.element = Sys.WebForms.Menu._domHelper.getElement(options.element);\n    if (this.element.tagName === 'DIV') {\n        var containerElement = this.element;\n        this.element = Sys.WebForms.Menu._domHelper.firstChild(containerElement);\n        this.element.tabIndex = options.tabIndex || 0;\n        options.element = containerElement;\n        options.menu = this;\n        this.container = new Sys.WebForms._MenuContainer(options);\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    else {\n        this.container = options.container;\n        this.keyMap = options.keyMap;\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    if (this.parentMenuItem && this.parentMenuItem.parentMenu) {\n        this.parentMenu = this.parentMenuItem.parentMenu;\n        this.rootMenu = this.parentMenu.rootMenu;\n        if (!this.element.id) {\n            this.element.id = (this.container.element.id || 'menu') + ':submenu:' + Sys.WebForms.Menu._elementObjectMapper._computedId;\n        }\n        if (this.depth > this.container.staticDisplayLevels) {\n            this.displayMode = \"dynamic\";\n            this.element.style.display = \"none\";\n            this.element.style.position = \"absolute\";\n            if (this.rootMenu && this.container.orientation === 'horizontal' && this.parentMenu.isStatic()) {\n                this.element.style.top = \"100%\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"0px\";\n                }\n                else {\n                    this.element.style.left = \"0px\";\n                }\n            }\n            else {\n                this.element.style.top = \"0px\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"100%\";\n                }\n                else {\n                    this.element.style.left = \"100%\";\n                }\n            }\n            if (this.container.rightToLeft) {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n            }\n            else {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n            }\n        }\n        else {\n            this.displayMode = \"static\";\n            this.element.style.display = \"block\";\n            if (this.container.orientation === 'horizontal') {\n                Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n            }\n        }\n    }\n    Sys.WebForms.Menu._domHelper.appendCssClass(this.element, this.displayMode);\n    var children = this.element.childNodes;\n    var count = children.length;\n    for (var i = 0; i < count; i++) {\n        var node = children[i];\n        if (node.nodeType !== 1) {   \n            continue;\n        }\n        var topLevelMenuItem = null;\n        if (this.parentMenuItem) {\n            topLevelMenuItem = this.parentMenuItem.topLevelMenuItem;\n        }\n        var menuItem = new Sys.WebForms.MenuItem(this, node, topLevelMenuItem);\n        var previousMenuItem = this.items[this.items.length - 1];\n        if (previousMenuItem) {\n            menuItem.previousSibling = previousMenuItem;\n            previousMenuItem.nextSibling = menuItem;\n        }\n        this.items[this.items.length] = menuItem;\n    }\n};\nSys.WebForms.Menu.prototype = {\n    blur: function() { if (this.container) this.container.blur(); },\n    collapse: function() {\n        this.each(function(menuItem) {\n            menuItem.hover(false);\n            menuItem.blur();\n            var childMenu = menuItem.childMenu;\n            if (childMenu) {\n                childMenu.collapse();\n            }\n        });\n        this.hide();\n    },\n    doDispose: function() { this.each(function(item) { item.doDispose(); }); },\n    each: function(fn) {\n        var count = this.items.length;\n        for (var i = 0; i < count; i++) {\n            fn(this.items[i]);\n        }\n    },\n    firstChild: function() { return this.items[0]; },\n    focus: function() { if (this.container) this.container.focus(); },\n    get_displayed: function() { return this.element.style.display !== 'none'; },\n    get_focused: function() {\n        if (this.container) {\n            return this.container.focused;\n        }\n        return false;\n    },\n    handleKeyPress: function(keyCode) {\n        if (this.keyMap.contains(keyCode)) {\n            if (this.container.focusedMenuItem) {\n                this.container.focusedMenuItem.navigate(keyCode);\n                return;\n            }\n            var firstChild = this.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n    },\n    hide: function() {\n        if (!this.get_displayed()) {\n            return;\n        }\n        this.each(function(item) {\n            if (item.childMenu) {\n                item.childMenu.hide();\n            }\n        });\n        if (!this.isRoot()) {\n            if (this.get_focused()) {\n                this.container.navigateTo(this.parentMenuItem);\n            }\n            this.element.style.display = 'none';\n        }\n    },\n    isRoot: function() { return this.rootMenu === this; },\n    isStatic: function() { return this.displayMode === 'static'; },\n    lastChild: function() { return this.items[this.items.length - 1]; },\n    show: function() { this.element.style.display = 'block'; }\n};\nif (Sys.WebForms.Menu.registerClass) {\n    Sys.WebForms.Menu.registerClass('Sys.WebForms.Menu');\n}\nSys.WebForms.MenuItem = function(parentMenu, listElement, topLevelMenuItem) {\n    this.keyMap = parentMenu.keyMap;\n    this.parentMenu = parentMenu;\n    this.container = parentMenu.container;\n    this.element = listElement;\n    this.topLevelMenuItem = topLevelMenuItem || this;\n    this._anchor = Sys.WebForms.Menu._domHelper.firstChild(listElement);\n    while (this._anchor && this._anchor.tagName !== 'A') {\n        this._anchor = Sys.WebForms.Menu._domHelper.nextSibling(this._anchor);\n    }\n    if (this._anchor) {\n        this._anchor.tabIndex = -1;\n        var subMenu = this._anchor;\n        while (subMenu && subMenu.tagName !== 'UL') {\n            subMenu = Sys.WebForms.Menu._domHelper.nextSibling(subMenu);\n        }\n        if (subMenu) {\n            this.childMenu = new Sys.WebForms.Menu({ element: subMenu, parentMenuItem: this, depth: parentMenu.depth + 1, container: this.container, keyMap: this.keyMap });\n            if (!this.childMenu.isStatic()) {\n                Sys.WebForms.Menu._domHelper.appendCssClass(this.element, 'has-popup');\n                Sys.WebForms.Menu._domHelper.appendAttributeValue(this.element, 'aria-haspopup', this.childMenu.element.id);\n            }\n        }\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(listElement, this);\n    Sys.WebForms.Menu._domHelper.appendAttributeValue(listElement, 'role', 'menuitem');\n    Sys.WebForms.Menu._domHelper.appendCssClass(listElement, parentMenu.displayMode);\n    if (this._anchor) {\n        Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, parentMenu.displayMode);\n    }\n    this.element.style.position = \"relative\";\n    if (this.parentMenu.depth == 1 && this.container.orientation == 'horizontal') {\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    if (!this.container.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n    }\n};\nSys.WebForms.MenuItem.prototype = {\n    applyUp: function(fn, condition) {\n        condition = condition || function(menuItem) { return menuItem; };\n        var menuItem = this;\n        var lastMenuItem = null;\n        while (condition(menuItem)) {\n            fn(menuItem);\n            lastMenuItem = menuItem;\n            menuItem = menuItem.parentMenu.parentMenuItem;\n        }\n        return lastMenuItem;\n    },\n    blur: function() { this.setTabIndex(-1); },\n    doDispose: function() {\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n        if (this.childMenu) {\n            this.childMenu.doDispose();\n        }\n    },\n    focus: function() {\n        if (!this.parentMenu.get_displayed()) {\n            this.parentMenu.show();\n        }\n        this.setTabIndex(0);\n        this.container.focused = true;\n        this._anchor.focus();\n    },\n    get_highlighted: function() { return /(^|\\s)highlighted(\\s|$)/.test(this._anchor.className); },\n    getTabIndex: function() { return this._anchor.tabIndex; },\n    highlight: function(highlighting) {\n        if (highlighting) {\n            this.applyUp(function(menuItem) {\n                menuItem.parentMenu.parentMenuItem.highlight(true);\n            },\n            function(menuItem) {\n                return !menuItem.parentMenu.isStatic() && menuItem.parentMenu.parentMenuItem;\n            }\n        );\n            Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, 'highlighted');\n        }\n        else {\n            Sys.WebForms.Menu._domHelper.removeCssClass(this._anchor, 'highlighted');\n            this.setTabIndex(-1);\n        }\n    },\n    hover: function(hovering) {\n        if (hovering) {\n            var currentHoveredItem = this.container.hoveredMenuItem;\n            if (currentHoveredItem) {\n                currentHoveredItem.hover(false);\n            }\n            var currentFocusedItem = this.container.focusedMenuItem;\n            if (currentFocusedItem && currentFocusedItem !== this) {\n                currentFocusedItem.hover(false);\n            }\n            this.applyUp(function(menuItem) {\n                if (menuItem.childMenu && !menuItem.childMenu.get_displayed()) {\n                    menuItem.childMenu.show();\n                }\n            });\n            this.container.hoveredMenuItem = this;\n            this.highlight(true);\n        }\n        else {\n            var menuItem = this;\n            while (menuItem) {\n                menuItem.highlight(false);\n                if (menuItem.childMenu) {\n                    if (!menuItem.childMenu.isStatic()) {\n                        menuItem.childMenu.hide();\n                    }\n                }\n                menuItem = menuItem.parentMenu.parentMenuItem;\n            }\n        }\n    },\n    isSiblingOf: function(menuItem) { return menuItem.parentMenu === this.parentMenu; },\n    mouseout: function() {\n        var menuItem = this,\n            id = this.container.pendingMouseoutId,\n            disappearAfter = this.container.disappearAfter;\n        if (id) {\n            window.clearTimeout(id);\n        }\n        if (disappearAfter > -1) {\n            this.container.pendingMouseoutId =\n                window.setTimeout(function() { menuItem.hover(false); }, disappearAfter);\n        }\n    },\n    mouseover: function() {\n        var id = this.container.pendingMouseoutId;\n        if (id) {\n            window.clearTimeout(id);\n            this.container.pendingMouseoutId = null;\n        }\n        this.hover(true);\n        if (this.container.menu.get_focused()) {\n            this.container.navigateTo(this);\n        }\n    },\n    navigate: function(keyCode) {\n        switch (this.keyMap[keyCode]) {\n            case this.keyMap.next:\n                this.navigateNext();\n                break;\n            case this.keyMap.previous:\n                this.navigatePrevious();\n                break;\n            case this.keyMap.child:\n                this.navigateChild();\n                break;\n            case this.keyMap.parent:\n                this.navigateParent();\n                break;\n            case this.keyMap.tab:\n                this.navigateOut();\n                break;\n        }\n    },\n    navigateChild: function() {\n        var subMenu = this.childMenu;\n        if (subMenu) {\n            var firstChild = subMenu.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n        else {\n            if (this.container.orientation === 'horizontal') {\n                var nextItem = this.topLevelMenuItem.nextSibling || this.topLevelMenuItem.parentMenu.firstChild();\n                if (nextItem == this.topLevelMenuItem) {\n                    return;\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(nextItem);\n                if (nextItem.childMenu) {\n                    this.container.navigateTo(nextItem.childMenu.firstChild());\n                }\n            }\n        }\n    },\n    navigateNext: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var nextMenuItem = this.nextSibling;\n        if (!nextMenuItem && this.parentMenu.isRoot()) {\n            nextMenuItem = this.parentMenu.parentMenuItem;\n            if (nextMenuItem) {\n                nextMenuItem = nextMenuItem.nextSibling;\n            }\n        }\n        if (!nextMenuItem) {\n            nextMenuItem = this.parentMenu.firstChild();\n        }\n        if (nextMenuItem) {\n            this.container.navigateTo(nextMenuItem);\n        }\n    },\n    navigateOut: function() {\n        this.parentMenu.blur();\n    },\n    navigateParent: function() {\n        var parentMenu = this.parentMenu,\n            horizontal = this.container.orientation === 'horizontal';\n        if (!parentMenu) return;\n        if (horizontal && this.childMenu && parentMenu.isRoot()) {\n            this.navigateChild();\n            return;\n        }\n        if (parentMenu.parentMenuItem && !parentMenu.isRoot()) {\n            if (horizontal && this.parentMenu.depth === 2) {\n                var previousItem = this.parentMenu.parentMenuItem.previousSibling;\n                if (!previousItem) {\n                    previousItem = this.parentMenu.rootMenu.lastChild();\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(previousItem);\n                if (previousItem.childMenu) {\n                    this.container.navigateTo(previousItem.childMenu.firstChild());\n                }\n            }\n            else {\n                this.parentMenu.hide();\n            }\n        }\n    },\n    navigatePrevious: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var previousMenuItem = this.previousSibling;\n        if (previousMenuItem) {\n            var childMenu = previousMenuItem.childMenu;\n            if (childMenu && childMenu.isRoot()) {\n                previousMenuItem = childMenu.lastChild();\n            }\n        }\n        if (!previousMenuItem && this.parentMenu.isRoot()) {\n            previousMenuItem = this.parentMenu.parentMenuItem;\n        }\n        if (!previousMenuItem) {\n            previousMenuItem = this.parentMenu.lastChild();\n        }\n        if (previousMenuItem) {\n            this.container.navigateTo(previousMenuItem);\n        }\n    },\n    setTabIndex: function(index) { if (this._anchor) this._anchor.tabIndex = index; }\n};\nSys.WebForms.MenuItem._onmouseout = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseout();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.MenuItem._onmouseover = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseover();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.Menu._domHelper = {\n    addEvent: function(element, eventName, fn, useCapture) {\n        if (element.addEventListener) {\n            element.addEventListener(eventName, fn, !!useCapture);\n        }\n        else {\n            element['on' + eventName] = fn;\n        }\n    },\n    appendAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('append', element, name, value);\n    },\n    appendCssClass: function(element, value) {\n        this.updateClassName('append', element, name, value);\n    },\n    appendString: function(getString, setString, value) {\n        var currentValue = getString();\n        if (!currentValue) {\n            setString(value);\n            return;\n        }\n        var regex = this._regexes.getRegex('(^| )' + value + '($| )');\n        if (regex.test(currentValue)) {\n            return;\n        }\n        setString(currentValue + ' ' + value);\n    },\n    cancelEvent: function(e) {\n        var event = e || window.event;\n        if (event) {\n            event.cancelBubble = true;\n            if (event.stopPropagation) {\n                event.stopPropagation();\n            }\n        }\n    },\n    contains: function(ancestor, descendant) {\n        for (; descendant && (descendant !== ancestor); descendant = descendant.parentNode) { }\n        return !!descendant;\n    },\n    firstChild: function(element) {\n        var child = element.firstChild;\n        if (child && child.nodeType !== 1) {   \n            child = this.nextSibling(child);\n        }\n        return child;\n    },\n    getElement: function(elementOrId) { return typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId; },\n    getElementDirection: function(element) {\n        if (element) {\n            if (element.dir) {\n                return element.dir;\n            }\n            return this.getElementDirection(element.parentNode);\n        }\n        return \"ltr\";\n    },\n    getKeyCode: function(event) { return event.keyCode || event.charCode || 0; },\n    insertAfter: function(element, elementToInsert) {\n        var next = element.nextSibling;\n        if (next) {\n            element.parentNode.insertBefore(elementToInsert, next);\n        }\n        else if (element.parentNode) {\n            element.parentNode.appendChild(elementToInsert);\n        }\n    },\n    nextSibling: function(element) {\n        var sibling = element.nextSibling;\n        while (sibling) {\n            if (sibling.nodeType === 1) {   \n                return sibling;\n            }\n            sibling = sibling.nextSibling;\n        }\n    },\n    removeAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('remove', element, name, value);\n    },\n    removeCssClass: function(element, value) {\n        this.updateClassName('remove', element, name, value);\n    },\n    removeEvent: function(element, eventName, fn, useCapture) {\n        if (element.removeEventListener) {\n            element.removeEventListener(eventName, fn, !!useCapture);\n        }\n        else if (element.detachEvent) {\n            element.detachEvent('on' + eventName, fn)\n        }\n        element['on' + eventName] = null;\n    },\n    removeString: function(getString, setString, valueToRemove) {\n        var currentValue = getString();\n        if (currentValue) {\n            var regex = this._regexes.getRegex('(\\\\s|\\\\b)' + valueToRemove + '$|\\\\b' + valueToRemove + '\\\\s+');\n            setString(currentValue.replace(regex, ''));\n        }\n    },\n    setFloat: function(element, direction) {\n        element.style.styleFloat = direction;\n        element.style.cssFloat = direction;\n    },\n    updateAttributeValue: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.getAttribute(name);\n                },\n                function(newValue) {\n                    element.setAttribute(name, newValue);\n                },\n                value\n            );\n    },\n    updateClassName: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.className;\n                },\n                function(newValue) {\n                    element.className = newValue;\n                },\n                value\n            );\n    },\n    _regexes: {\n        getRegex: function(pattern) {\n            var regex = this[pattern];\n            if (!regex) {\n                this[pattern] = regex = new RegExp(pattern);\n            }\n            return regex;\n        }\n    }\n};\nSys.WebForms.Menu._elementObjectMapper = {\n    _computedId: 0,\n    _mappings: {},\n    _mappingIdName: 'Sys.WebForms.Menu.Mapping',\n    getMappedObject: function(element) {\n        var id = element[this._mappingIdName];\n        if (id) {\n            return this._mappings[this._mappingIdName + ':' + id];\n        }\n    },\n    map: function(element, theObject) {\n        var mappedObject = element[this._mappingIdName];\n        if (mappedObject === theObject) {\n            return;\n        }\n        var objectId = element[this._mappingIdName] || element.id || '%' + (++this._computedId); \n        element[this._mappingIdName] = objectId;\n        this._mappings[this._mappingIdName + ':' + objectId] = theObject;\n        theObject.mappingId = objectId;\n    }\n};\nSys.WebForms.Menu._keyboardMapping = new (function() {\n    var LEFT_ARROW = 37;\n    var UP_ARROW = 38;\n    var RIGHT_ARROW = 39;\n    var DOWN_ARROW = 40;\n    var TAB = 9;\n    var ESCAPE = 27;\n    this.vertical = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.vertical[DOWN_ARROW] = this.vertical.next;\n    this.vertical[UP_ARROW] = this.vertical.previous;\n    this.vertical[RIGHT_ARROW] = this.vertical.child;\n    this.vertical[LEFT_ARROW] = this.vertical.parent;\n    this.vertical[TAB] = this.vertical[ESCAPE] = this.vertical.tab;\n    this.verticalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.verticalRtl[DOWN_ARROW] = this.verticalRtl.next;\n    this.verticalRtl[UP_ARROW] = this.verticalRtl.previous;\n    this.verticalRtl[LEFT_ARROW] = this.verticalRtl.child;\n    this.verticalRtl[RIGHT_ARROW] = this.verticalRtl.parent;\n    this.verticalRtl[TAB] = this.verticalRtl[ESCAPE] = this.verticalRtl.tab;\n    this.horizontal = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontal[RIGHT_ARROW] = this.horizontal.next;\n    this.horizontal[LEFT_ARROW] = this.horizontal.previous;\n    this.horizontal[DOWN_ARROW] = this.horizontal.child;\n    this.horizontal[UP_ARROW] = this.horizontal.parent;\n    this.horizontal[TAB] = this.horizontal[ESCAPE] = this.horizontal.tab;\n    this.horizontalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontalRtl[RIGHT_ARROW] = this.horizontalRtl.previous;\n    this.horizontalRtl[LEFT_ARROW] = this.horizontalRtl.next;\n    this.horizontalRtl[DOWN_ARROW] = this.horizontalRtl.child;\n    this.horizontalRtl[UP_ARROW] = this.horizontalRtl.parent;\n    this.horizontalRtl[TAB] = this.horizontalRtl[ESCAPE] = this.horizontalRtl.tab;\n    this.horizontal.contains = this.horizontalRtl.contains = this.vertical.contains = this.verticalRtl.contains = function(keycode) {\n        return this[keycode] != null;\n    };\n})();\nSys.WebForms._MenuContainer = function(options) {\n    this.focused = false;\n    this.disabled = options.disabled;\n    this.staticDisplayLevels = options.staticDisplayLevels || 1;\n    this.element = options.element;\n    this.orientation = options.orientation || 'vertical';\n    this.disappearAfter = options.disappearAfter;\n    this.rightToLeft = Sys.WebForms.Menu._domHelper.getElementDirection(this.element) === 'rtl';\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    this.menu = options.menu;\n    this.menu.rootMenu = this.menu;\n    this.menu.displayMode = 'static';\n    this.menu.element.style.position = 'relative';\n    this.menu.element.style.width = 'auto';\n    if (this.orientation === 'vertical') {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menu');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n        }\n    }\n    else {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menubar');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontal;\n        }\n    }\n    var floatBreak = document.createElement('div');\n    floatBreak.style.clear = this.rightToLeft ? \"right\" : \"left\";\n    this.element.appendChild(floatBreak);\n    Sys.WebForms.Menu._domHelper.setFloat(this.element, this.rightToLeft ? \"right\" : \"left\");\n    Sys.WebForms.Menu._domHelper.insertAfter(this.element, floatBreak);\n    if (!this.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'focus', this._onfocus, true);\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'keydown', this._onkeydown);\n        var menuContainer = this;\n        this.element.dispose = function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose = null;\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'focus', menuContainer._onfocus, true);\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'keydown', menuContainer._onkeydown);\n                menuContainer.menu.doDispose();\n            }\n        };\n        Sys.WebForms.Menu._domHelper.addEvent(window, 'unload', function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose();\n            }\n        });\n    }\n};\nSys.WebForms._MenuContainer.prototype = {\n    blur: function() {\n        this.focused = false;\n        this.isBlurring = false;\n        this.menu.collapse();\n        this.focusedMenuItem = null;\n    },\n    focus: function(e) { this.focused = true; },\n    navigateTo: function(menuItem) {\n        if (this.focusedMenuItem && this.focusedMenuItem !== this) {\n            this.focusedMenuItem.highlight(false);\n        }\n        menuItem.highlight(true);\n        menuItem.focus();\n        this.focusedMenuItem = menuItem;\n    },\n    _onfocus: function(e) {\n        var event = e || window.event;\n        if (event.srcElement && this) {\n            if (Sys.WebForms.Menu._domHelper.contains(this.element, event.srcElement)) {\n                if (!this.focused) {\n                    this.focus();\n                }\n            }\n        }\n    },\n    _onkeydown: function(e) {\n        var thisMenu = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n        var keyCode = Sys.WebForms.Menu._domHelper.getKeyCode(e || window.event);\n        if (thisMenu) {\n            thisMenu.handleKeyPress(keyCode);\n        }\n    }\n};\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/SmartNav.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/SmartNav.js\nvar snSrc;\nif ((typeof(window.__smartNav) == \"undefined\") || (window.__smartNav == null))\n{\n    window.__smartNav = new Object();\n    window.__smartNav.update = function()\n    {\n        var sn = window.__smartNav;\n        var fd;\n        document.detachEvent(\"onstop\", sn.stopHif);\n        sn.inPost = false;\n        try { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        var fdr = fd.getElementsByTagName(\"asp_smartnav_rdir\");\n        if (fdr.length > 0)\n        {\n            if ((typeof(sn.sHif) == \"undefined\") || (sn.sHif == null))\n            {\n                sn.sHif = document.createElement(\"IFRAME\");\n                sn.sHif.name = \"__hifSmartNav\";\n                sn.sHif.style.display = \"none\";\n                sn.sHif.src = snSrc;\n            }\n            try {window.location = fdr[0].url;} catch (e) {};\n            return;\n        }\n        var fdurl = fd.location.href;\n        var index = fdurl.indexOf(snSrc);\n        if ((index != -1 && index == fdurl.length-snSrc.length)\n            || fdurl == \"about:blank\")\n            return;\n\t\tvar fdurlb = fdurl.split(\"?\")[0];\n\t\tif (document.location.href.indexOf(fdurlb) < 0)\n\t\t{\n            document.location.href=fdurl;\n\t\t    return;\n\t\t}\n\t\tsn._savedOnLoad = window.onload;\n\t\twindow.onload = null;\n\t\twindow.__smartNav.updateHelper();\n\t}\n\twindow.__smartNav.updateHelper = function()\n\t{\n\t\tif (document.readyState != \"complete\")\n\t\t{\n\t\t    window.setTimeout(window.__smartNav.updateHelper, 25);\n\t\t    return;\n\t\t}\n\t\twindow.__smartNav.loadNewContent();\n\t}\n\twindow.__smartNav.loadNewContent = function()\n\t{\n\t\tvar sn = window.__smartNav;\n\t\tvar fd;\n\t\ttry { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        if ((typeof(sn.sHif) != \"undefined\") && (sn.sHif != null))\n        {\n            sn.sHif.removeNode(true);\n            sn.sHif = null;\n        }\n        var hdm = document.getElementsByTagName(\"head\")[0];\n        var hk = hdm.childNodes;\n        var tt = null;\n        var i;\n        for (i = hk.length - 1; i>= 0; i--)\n        {\n            if (hk[i].tagName == \"TITLE\")\n            {\n                tt = hk[i].outerHTML;\n                continue;\n            }\n            if (hk[i].tagName != \"BASEFONT\" || hk[i].innerHTML.length == 0)\n                hdm.removeChild(hdm.childNodes[i]);\n        }\n        var kids = fd.getElementsByTagName(\"head\")[0].childNodes;\n        for (i = 0; i < kids.length; i++)\n        {\n            var tn = kids[i].tagName;\n            var k = document.createElement(tn);\n            k.id = kids[i].id;\n            k.mergeAttributes(kids[i]);\n            switch(tn)\n            {\n            case \"TITLE\":\n                if (tt == kids[i].outerHTML)\n                    continue;\n                k.innerText = kids[i].text;\n                hdm.insertAdjacentElement(\"afterbegin\", k);\n                continue;\n            case \"BASEFONT\" :\n                if (kids[i].innerHTML.length > 0)\n                    continue;\n                break;\n            default:\n                var o = document.createElement(\"BODY\");\n                o.innerHTML = \"<BODY>\" + kids[i].outerHTML + \"</BODY>\";\n                k = o.firstChild;\n                break;\n            }\n            if((typeof(k) != \"undefined\") && (k != null))\n                hdm.appendChild(k);\n        }\n        document.body.clearAttributes();\n        document.body.id = fd.body.id;\n        document.body.mergeAttributes(fd.body);\n        var newBodyLoad = fd.body.onload;\n        if ((typeof(newBodyLoad) != \"undefined\") && (newBodyLoad != null))\n            document.body.onload = newBodyLoad;\n        else\n            document.body.onload = sn._savedOnLoad;\n        var s = \"<BODY>\" + fd.body.innerHTML + \"</BODY>\";\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hifP = sn.hif.parentElement;\n            if ((typeof(hifP) != \"undefined\") && (hifP != null))\n                sn.sHif=hifP.removeChild(sn.hif);\n        }\n        document.body.innerHTML = s;\n        var sc = document.scripts;\n        for (i = 0; i < sc.length; i++)\n        {\n            sc[i].text = sc[i].text;\n        }\n        sn.hif = document.all(\"__hifSmartNav\");\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hif = sn.hif;\n            sn.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n            frames[\"__hifSmartNav\"].name = sn.hifName;\n            sn.hifDoc = hif.contentWindow.document;\n            if (sn.ie5)\n                hif.parentElement.removeChild(hif);\n            window.setTimeout(sn.restoreFocus,0);\n        }\n        if (typeof(window.onload) == \"string\")\n        {\n            try { eval(window.onload) } catch (e) {};\n        }\n        else if ((typeof(window.onload) != \"undefined\") && (window.onload != null))\n        {\n            try { window.onload() } catch (e) {};\n        }\n        sn._savedOnLoad = null;\n        sn.attachForm();\n    };\n    window.__smartNav.restoreFocus = function()\n    {\n        if (window.__smartNav.inPost == true) return;\n        var curAe = document.activeElement;\n        var sAeId = window.__smartNav.ae;\n        if (((typeof(sAeId) == \"undefined\") || (sAeId == null)) ||\n            (typeof(curAe) != \"undefined\") && (curAe != null) && (curAe.id == sAeId || curAe.name == sAeId))\n            return;\n        var ae = document.all(sAeId);\n        if ((typeof(ae) == \"undefined\") || (ae == null)) return;\n        try { ae.focus(); } catch(e){};\n    }\n    window.__smartNav.saveHistory = function()\n    {\n        if ((typeof(window.__smartNav.hif) != \"undefined\") && (window.__smartNav.hif != null))\n            window.__smartNav.hif.removeNode();\n        if ((typeof(window.__smartNav.sHif) != \"undefined\") && (window.__smartNav.sHif != null)\n            && (typeof(document.all[window.__smartNav.siHif]) != \"undefined\")\n            && (document.all[window.__smartNav.siHif] != null)) {\n            document.all[window.__smartNav.siHif].insertAdjacentElement(\n                        \"BeforeBegin\", window.__smartNav.sHif);\n        }\n    }\n    window.__smartNav.stopHif = function()\n    {\n        document.detachEvent(\"onstop\", window.__smartNav.stopHif);\n        var sn = window.__smartNav;\n        if (((typeof(sn.hifDoc) == \"undefined\") || (sn.hifDoc == null)) &&\n            (typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            try {sn.hifDoc = sn.hif.contentWindow.document;}\n            catch(e){sn.hifDoc=null}\n        }\n        if (sn.hifDoc != null)\n        {\n            try {sn.hifDoc.execCommand(\"stop\");} catch (e){}\n        }\n    }\n    window.__smartNav.init =  function()\n    {\n        var sn = window.__smartNav;\n        window.__smartNav.form.__smartNavPostBack.value = 'true';\n        document.detachEvent(\"onstop\", sn.stopHif);\n        document.attachEvent(\"onstop\", sn.stopHif);\n        try { if (window.event.returnValue == false) return; } catch(e) {}\n        sn.inPost = true;\n        if ((typeof(document.activeElement) != \"undefined\") && (document.activeElement != null))\n        {\n            var ae = document.activeElement.id;\n            if (ae.length == 0)\n                ae = document.activeElement.name;\n            sn.ae = ae;\n        }\n        else\n            sn.ae = null;\n        try {document.selection.empty();} catch (e) {}\n        if ((typeof(sn.hif) == \"undefined\") || (sn.hif == null))\n        {\n            sn.hif = document.all(\"__hifSmartNav\");\n            sn.hifDoc = sn.hif.contentWindow.document;\n        }\n        if ((typeof(sn.hifDoc) != \"undefined\") && (sn.hifDoc != null))\n            try {sn.hifDoc.designMode = \"On\";} catch(e){};\n        if ((typeof(sn.hif.parentElement) == \"undefined\") || (sn.hif.parentElement == null))\n            document.body.appendChild(sn.hif);\n        var hif = sn.hif;\n        hif.detachEvent(\"onload\", sn.update);\n        hif.attachEvent(\"onload\", sn.update);\n        window.__smartNav.fInit = true;\n    };\n    window.__smartNav.submit = function()\n    {\n        window.__smartNav.fInit = false;\n        try { window.__smartNav.init(); } catch(e) {}\n        if (window.__smartNav.fInit) {\n            window.__smartNav.form._submit();\n        }\n    };\n    window.__smartNav.attachForm = function()\n    {\n        var cf = document.forms;\n        for (var i=0; i<cf.length; i++)\n        {\n            if ((typeof(cf[i].__smartNavEnabled) != \"undefined\") && (cf[i].__smartNavEnabled != null))\n            {\n                window.__smartNav.form = cf[i];\n                window.__smartNav.form.insertAdjacentHTML(\"beforeEnd\", \"<input type='hidden' name='__smartNavPostBack' value='false' />\");\n                break;\n            }\n        }\n        var snfm = window.__smartNav.form;\n        if ((typeof(snfm) == \"undefined\") || (snfm == null)) return false;\n        var sft = snfm.target;\n        if (sft.length != 0 && sft.indexOf(\"__hifSmartNav\") != 0) return false;\n        var sfc = snfm.action.split(\"?\")[0];\n        var url = window.location.href.split(\"?\")[0];\n        if (url.charAt(url.length-1) != '/' && url.lastIndexOf(sfc) + sfc.length != url.length) return false;\n        if (snfm.__formAttached == true) return true;\n        snfm.__formAttached = true;\n        snfm.attachEvent(\"onsubmit\", window.__smartNav.init);\n        snfm._submit = snfm.submit;\n        snfm.submit = window.__smartNav.submit;\n        snfm.target = window.__smartNav.hifName;\n        return true;\n    };\n    window.__smartNav.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n    window.__smartNav.ie5 = navigator.appVersion.indexOf(\"MSIE 5\") > 0;\n    var rc = window.__smartNav.attachForm();\n    var hif = document.all(\"__hifSmartNav\");\n    if ((typeof(snSrc) == \"undefined\") || (snSrc == null)) {\n\t    if (typeof(window.dialogHeight) != \"undefined\") {\n\t            snSrc = \"IEsmartnav1\";\n\t\t    hif.src = snSrc;\n\t    } else {\n\t\t    snSrc = hif.src;\n\t    }\n    }\n    if (rc)\n    {\n        var fsn = frames[\"__hifSmartNav\"];\n        fsn.name = window.__smartNav.hifName;\n        window.__smartNav.siHif = hif.sourceIndex;\n        try {\n            if (fsn.document.location != snSrc)\n            {\n                fsn.document.designMode = \"On\";\n                hif.attachEvent(\"onload\",window.__smartNav.update);\n                window.__smartNav.hif = hif;\n            }\n        }\n        catch (e) { window.__smartNav.hif = hif; }\n        window.attachEvent(\"onbeforeunload\", window.__smartNav.saveHistory);\n    }\n    else\n        window.__smartNav = null;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/TreeView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/TreeView.js\nfunction TreeView_HoverNode(data, node) {\n    if (!data) {\n        return;\n    }\n    node.hoverClass = data.hoverClass;\n    WebForm_AppendToClassName(node, data.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n    WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n}\nfunction TreeView_GetNodeText(node) {\n    var trNode = WebForm_GetParentByTagName(node, \"TR\");\n    var outerNodes;\n    if (trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName) {\n        outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"A\");\n        if (!outerNodes || outerNodes.length == 0) {\n            outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"SPAN\");\n        }\n    }\n    var textNode = (outerNodes && outerNodes.length > 0) ?\n        outerNodes[0].childNodes[0] :\n        trNode.childNodes[trNode.childNodes.length - 1].childNodes[0];\n    return (textNode && textNode.nodeValue) ? textNode.nodeValue : \"\";\n}\nfunction TreeView_PopulateNode(data, index, node, selectNode, selectImageNode, lineType, text, path, databound, datapath, parentIsLast) {\n    if (!data) {\n        return;\n    }\n    var context = new Object();\n    context.data = data;\n    context.node = node;\n    context.selectNode = selectNode;\n    context.selectImageNode = selectImageNode;\n    context.lineType = lineType;\n    context.index = index;\n    context.isChecked = \"f\";\n    var tr = WebForm_GetParentByTagName(node, \"TR\");\n    if (tr) {\n        var checkbox = tr.getElementsByTagName(\"INPUT\");\n        if (checkbox && (checkbox.length > 0)) {\n            for (var i = 0; i < checkbox.length; i++) {\n                if (checkbox[i].type.toLowerCase() == \"checkbox\") {\n                    if (checkbox[i].checked) {\n                        context.isChecked = \"t\";\n                    }\n                    break;\n                }\n            }\n        }\n    }\n    var param = index + \"|\" + data.lastIndex + \"|\" + databound + context.isChecked + parentIsLast + \"|\" +\n        text.length + \"|\" + text + datapath.length + \"|\" + datapath + path;\n    TreeView_PopulateNodeDoCallBack(context, param);\n}\nfunction TreeView_ProcessNodeData(result, context) {\n    var treeNode = context.node;\n    if (result.length > 0) {\n        var ci =  result.indexOf(\"|\", 0);\n        context.data.lastIndex = result.substring(0, ci);\n        ci = result.indexOf(\"|\", ci + 1);\n        var newExpandState = result.substring(context.data.lastIndex.length + 1, ci);\n        context.data.expandState.value += newExpandState;\n        var chunk = result.substr(ci + 1);\n        var newChildren, table;\n        if (__nonMSDOMBrowser) {\n            var newDiv = document.createElement(\"div\");\n            newDiv.innerHTML = chunk;\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            newChildren = null;\n            if ((typeof(table.nextSibling) == \"undefined\") || (table.nextSibling == null)) {\n                table.parentNode.insertBefore(newDiv.firstChild, table.nextSibling);\n                newChildren = table.previousSibling;\n            }\n            else {\n                table = table.nextSibling;\n                table.parentNode.insertBefore(newDiv.firstChild, table);\n                newChildren = table.previousSibling;\n            }\n            newChildren = document.getElementById(treeNode.id + \"Nodes\");\n        }\n        else {\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            table.insertAdjacentHTML(\"afterEnd\", chunk);\n            newChildren = document.all[treeNode.id + \"Nodes\"];\n        }\n        if ((typeof(newChildren) != \"undefined\") && (newChildren != null)) {\n            TreeView_ToggleNode(context.data, context.index, treeNode, context.lineType, newChildren);\n            treeNode.href = document.getElementById ?\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",document.getElementById('\" + treeNode.id + \"'),'\" + context.lineType + \"',document.getElementById('\" + newChildren.id + \"'))\" :\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",\" + treeNode.id + \",'\" + context.lineType + \"',\" + newChildren.id + \")\";\n            if ((typeof(context.selectNode) != \"undefined\") && (context.selectNode != null) && context.selectNode.href &&\n                (context.selectNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectNode.href = treeNode.href;\n            }\n            if ((typeof(context.selectImageNode) != \"undefined\") && (context.selectImageNode != null) && context.selectNode.href &&\n                (context.selectImageNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectImageNode.href = treeNode.href;\n            }\n        }\n        context.data.populateLog.value += context.index + \",\";\n    }\n    else {\n        var img = treeNode.childNodes ? treeNode.childNodes[0] : treeNode.children[0];\n        if ((typeof(img) != \"undefined\") && (img != null)) {\n            var lineType = context.lineType;\n            if (lineType == \"l\") {\n                img.src = context.data.images[13];\n            }\n            else if (lineType == \"t\") {\n                img.src = context.data.images[10];\n            }\n            else if (lineType == \"-\") {\n                img.src = context.data.images[16];\n            }\n            else {\n                img.src = context.data.images[3];\n            }\n            var pe;\n            if (__nonMSDOMBrowser) {\n                pe = treeNode.parentNode;\n                pe.insertBefore(img, treeNode);\n                pe.removeChild(treeNode);\n            }\n            else {\n                pe = treeNode.parentElement;\n                treeNode.style.visibility=\"hidden\";\n                treeNode.style.display=\"none\";\n                pe.insertAdjacentElement(\"afterBegin\", img);\n            }\n        }\n    }\n}\nfunction TreeView_SelectNode(data, node, nodeId) {\n    if (!data) {\n        return;\n    }\n    if ((typeof(data.selectedClass) != \"undefined\") && (data.selectedClass != null)) {\n        var id = data.selectedNodeID.value;\n        if (id.length > 0) {\n            var selectedNode = document.getElementById(id);\n            if ((typeof(selectedNode) != \"undefined\") && (selectedNode != null)) {\n                WebForm_RemoveClassName(selectedNode, data.selectedHyperLinkClass);\n                selectedNode = WebForm_GetParentByTagName(selectedNode, \"TD\");\n                WebForm_RemoveClassName(selectedNode, data.selectedClass);\n            }\n        }\n        WebForm_AppendToClassName(node, data.selectedHyperLinkClass);\n        node = WebForm_GetParentByTagName(node, \"TD\");\n        WebForm_AppendToClassName(node, data.selectedClass)\n    }\n    data.selectedNodeID.value = nodeId;\n}\nfunction TreeView_ToggleNode(data, index, node, lineType, children) {\n    if (!data) {\n        return;\n    }\n    var img = node.childNodes[0];\n    var newExpandState;\n    try {\n        if (children.style.display == \"none\") {\n            children.style.display = \"block\";\n            newExpandState = \"e\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[15];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[12];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[18];\n                }\n                else {\n                    img.src = data.images[5];\n                }\n                img.alt = data.collapseToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n        else {\n            children.style.display = \"none\";\n            newExpandState = \"c\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[14];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[11];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[17];\n                }\n                else {\n                    img.src = data.images[4];\n                }\n                img.alt = data.expandToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n    }\n    catch(e) {}\n    data.expandState.value =  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);\n}\nfunction TreeView_UnhoverNode(node) {\n    if (!node.hoverClass) {\n        return;\n    }\n    WebForm_RemoveClassName(node, node.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {\n    this.eventTarget = eventTarget;\n    this.eventArgument = eventArgument;\n    this.validation = validation;\n    this.validationGroup = validationGroup;\n    this.actionUrl = actionUrl;\n    this.trackFocus = trackFocus;\n    this.clientSubmit = clientSubmit;\n}\nfunction WebForm_DoPostBackWithOptions(options) {\n    var validationResult = true;\n    if (options.validation) {\n        if (typeof(Page_ClientValidate) == 'function') {\n            validationResult = Page_ClientValidate(options.validationGroup);\n        }\n    }\n    if (validationResult) {\n        if ((typeof(options.actionUrl) != \"undefined\") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {\n            theForm.action = options.actionUrl;\n        }\n        if (options.trackFocus) {\n            var lastFocus = theForm.elements[\"__LASTFOCUS\"];\n            if ((typeof(lastFocus) != \"undefined\") && (lastFocus != null)) {\n                if (typeof(document.activeElement) == \"undefined\") {\n                    lastFocus.value = options.eventTarget;\n                }\n                else {\n                    var active = document.activeElement;\n                    if ((typeof(active) != \"undefined\") && (active != null)) {\n                        if ((typeof(active.id) != \"undefined\") && (active.id != null) && (active.id.length > 0)) {\n                            lastFocus.value = active.id;\n                        }\n                        else if (typeof(active.name) != \"undefined\") {\n                            lastFocus.value = active.name;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if (options.clientSubmit) {\n        __doPostBack(options.eventTarget, options.eventArgument);\n    }\n}\nvar __pendingCallbacks = new Array();\nvar __synchronousCallBackIndex = -1;\nfunction WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {\n    var postData = __theFormPostData +\n                \"__CALLBACKID=\" + WebForm_EncodeCallback(eventTarget) +\n                \"&__CALLBACKPARAM=\" + WebForm_EncodeCallback(eventArgument);\n    if (theForm[\"__EVENTVALIDATION\"]) {\n        postData += \"&__EVENTVALIDATION=\" + WebForm_EncodeCallback(theForm[\"__EVENTVALIDATION\"].value);\n    }\n    var xmlRequest,e;\n    try {\n        xmlRequest = new XMLHttpRequest();\n    }\n    catch(e) {\n        try {\n            xmlRequest = new ActiveXObject(\"Microsoft.XMLHTTP\");\n        }\n        catch(e) {\n        }\n    }\n    var setRequestHeaderMethodExists = true;\n    try {\n        setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);\n    }\n    catch(e) {}\n    var callback = new Object();\n    callback.eventCallback = eventCallback;\n    callback.context = context;\n    callback.errorCallback = errorCallback;\n    callback.async = useAsync;\n    var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);\n    if (!useAsync) {\n        if (__synchronousCallBackIndex != -1) {\n            __pendingCallbacks[__synchronousCallBackIndex] = null;\n        }\n        __synchronousCallBackIndex = callbackIndex;\n    }\n    if (setRequestHeaderMethodExists) {\n        xmlRequest.onreadystatechange = WebForm_CallbackComplete;\n        callback.xmlRequest = xmlRequest;\n        // e.g. http:\n        var action = theForm.action || document.location.pathname, fragmentIndex = action.indexOf('#');\n        if (fragmentIndex !== -1) {\n            action = action.substr(0, fragmentIndex);\n        }\n        if (!__nonMSDOMBrowser) {\n            var queryIndex = action.indexOf('?');\n            if (queryIndex !== -1) {\n                var path = action.substr(0, queryIndex);\n                if (path.indexOf(\"%\") === -1) {\n                    action = encodeURI(path) + action.substr(queryIndex);\n                }\n            }\n            else if (action.indexOf(\"%\") === -1) {\n                action = encodeURI(action);\n            }\n        }\n        xmlRequest.open(\"POST\", action, true);\n        xmlRequest.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded; charset=utf-8\");\n        xmlRequest.send(postData);\n        return;\n    }\n    callback.xmlRequest = new Object();\n    var callbackFrameID = \"__CALLBACKFRAME\" + callbackIndex;\n    var xmlRequestFrame = document.frames[callbackFrameID];\n    if (!xmlRequestFrame) {\n        xmlRequestFrame = document.createElement(\"IFRAME\");\n        xmlRequestFrame.width = \"1\";\n        xmlRequestFrame.height = \"1\";\n        xmlRequestFrame.frameBorder = \"0\";\n        xmlRequestFrame.id = callbackFrameID;\n        xmlRequestFrame.name = callbackFrameID;\n        xmlRequestFrame.style.position = \"absolute\";\n        xmlRequestFrame.style.top = \"-100px\"\n        xmlRequestFrame.style.left = \"-100px\";\n        try {\n            if (callBackFrameUrl) {\n                xmlRequestFrame.src = callBackFrameUrl;\n            }\n        }\n        catch(e) {}\n        document.body.appendChild(xmlRequestFrame);\n    }\n    var interval = window.setInterval(function() {\n        xmlRequestFrame = document.frames[callbackFrameID];\n        if (xmlRequestFrame && xmlRequestFrame.document) {\n            window.clearInterval(interval);\n            xmlRequestFrame.document.write(\"\");\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.write('<html><body><form method=\"post\"><input type=\"hidden\" name=\"__CALLBACKLOADSCRIPT\" value=\"t\"></form></body></html>');\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.forms[0].action = theForm.action;\n            var count = __theFormPostCollection.length;\n            var element;\n            for (var i = 0; i < count; i++) {\n                element = __theFormPostCollection[i];\n                if (element) {\n                    var fieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                    fieldElement.type = \"hidden\";\n                    fieldElement.name = element.name;\n                    fieldElement.value = element.value;\n                    xmlRequestFrame.document.forms[0].appendChild(fieldElement);\n                }\n            }\n            var callbackIdFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIdFieldElement.type = \"hidden\";\n            callbackIdFieldElement.name = \"__CALLBACKID\";\n            callbackIdFieldElement.value = eventTarget;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);\n            var callbackParamFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackParamFieldElement.type = \"hidden\";\n            callbackParamFieldElement.name = \"__CALLBACKPARAM\";\n            callbackParamFieldElement.value = eventArgument;\n            xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);\n            if (theForm[\"__EVENTVALIDATION\"]) {\n                var callbackValidationFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                callbackValidationFieldElement.type = \"hidden\";\n                callbackValidationFieldElement.name = \"__EVENTVALIDATION\";\n                callbackValidationFieldElement.value = theForm[\"__EVENTVALIDATION\"].value;\n                xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement);\n            }\n            var callbackIndexFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIndexFieldElement.type = \"hidden\";\n            callbackIndexFieldElement.name = \"__CALLBACKINDEX\";\n            callbackIndexFieldElement.value = callbackIndex;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement);\n            xmlRequestFrame.document.forms[0].submit();\n        }\n    }, 10);\n}\nfunction WebForm_CallbackComplete() {\n    for (var i = 0; i < __pendingCallbacks.length; i++) {\n        callbackObject = __pendingCallbacks[i];\n        if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {\n            if (!__pendingCallbacks[i].async) {\n                __synchronousCallBackIndex = -1;\n            }\n            __pendingCallbacks[i] = null;\n            var callbackFrameID = \"__CALLBACKFRAME\" + i;\n            var xmlRequestFrame = document.getElementById(callbackFrameID);\n            if (xmlRequestFrame) {\n                xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);\n            }\n            WebForm_ExecuteCallback(callbackObject);\n        }\n    }\n}\nfunction WebForm_ExecuteCallback(callbackObject) {\n    var response = callbackObject.xmlRequest.responseText;\n    if (response.charAt(0) == \"s\") {\n        if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n            callbackObject.eventCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else if (response.charAt(0) == \"e\") {\n        if ((typeof(callbackObject.errorCallback) != \"undefined\") && (callbackObject.errorCallback != null)) {\n            callbackObject.errorCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else {\n        var separatorIndex = response.indexOf(\"|\");\n        if (separatorIndex != -1) {\n            var validationFieldLength = parseInt(response.substring(0, separatorIndex));\n            if (!isNaN(validationFieldLength)) {\n                var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);\n                if (validationField != \"\") {\n                    var validationFieldElement = theForm[\"__EVENTVALIDATION\"];\n                    if (!validationFieldElement) {\n                        validationFieldElement = document.createElement(\"INPUT\");\n                        validationFieldElement.type = \"hidden\";\n                        validationFieldElement.name = \"__EVENTVALIDATION\";\n                        theForm.appendChild(validationFieldElement);\n                    }\n                    validationFieldElement.value = validationField;\n                }\n                if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n                    callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);\n                }\n            }\n        }\n    }\n}\nfunction WebForm_FillFirstAvailableSlot(array, element) {\n    var i;\n    for (i = 0; i < array.length; i++) {\n        if (!array[i]) break;\n    }\n    array[i] = element;\n    return i;\n}\nvar __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);\nvar __theFormPostData = \"\";\nvar __theFormPostCollection = new Array();\nvar __callbackTextTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction WebForm_InitCallback() {\n    var formElements = theForm.elements,\n        count = formElements.length,\n        element;\n    for (var i = 0; i < count; i++) {\n        element = formElements[i];\n        var tagName = element.tagName.toLowerCase();\n        if (tagName == \"input\") {\n            var type = element.type;\n            if ((__callbackTextTypes.test(type) || ((type == \"checkbox\" || type == \"radio\") && element.checked))\n                && (element.id != \"__EVENTVALIDATION\")) {\n                WebForm_InitCallbackAddField(element.name, element.value);\n            }\n        }\n        else if (tagName == \"select\") {\n            var selectCount = element.options.length;\n            for (var j = 0; j < selectCount; j++) {\n                var selectChild = element.options[j];\n                if (selectChild.selected == true) {\n                    WebForm_InitCallbackAddField(element.name, element.value);\n                }\n            }\n        }\n        else if (tagName == \"textarea\") {\n            WebForm_InitCallbackAddField(element.name, element.value);\n        }\n    }\n}\nfunction WebForm_InitCallbackAddField(name, value) {\n    var nameValue = new Object();\n    nameValue.name = name;\n    nameValue.value = value;\n    __theFormPostCollection[__theFormPostCollection.length] = nameValue;\n    __theFormPostData += WebForm_EncodeCallback(name) + \"=\" + WebForm_EncodeCallback(value) + \"&\";\n}\nfunction WebForm_EncodeCallback(parameter) {\n    if (encodeURIComponent) {\n        return encodeURIComponent(parameter);\n    }\n    else {\n        return escape(parameter);\n    }\n}\nvar __disabledControlArray = new Array();\nfunction WebForm_ReEnableControls() {\n    if (typeof(__enabledControlArray) == 'undefined') {\n        return false;\n    }\n    var disabledIndex = 0;\n    for (var i = 0; i < __enabledControlArray.length; i++) {\n        var c;\n        if (__nonMSDOMBrowser) {\n            c = document.getElementById(__enabledControlArray[i]);\n        }\n        else {\n            c = document.all[__enabledControlArray[i]];\n        }\n        if ((typeof(c) != \"undefined\") && (c != null) && (c.disabled == true)) {\n            c.disabled = false;\n            __disabledControlArray[disabledIndex++] = c;\n        }\n    }\n    setTimeout(\"WebForm_ReDisableControls()\", 0);\n    return true;\n}\nfunction WebForm_ReDisableControls() {\n    for (var i = 0; i < __disabledControlArray.length; i++) {\n        __disabledControlArray[i].disabled = true;\n    }\n}\nfunction WebForm_SimulateClick(element, event) {\n    var clickEvent;\n    if (element) {\n        if (element.click) {\n            element.click();\n        } else { \n            clickEvent = document.createEvent(\"MouseEvents\");\n            clickEvent.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n            if (!element.dispatchEvent(clickEvent)) {\n                return true;\n            }\n        }\n        event.cancelBubble = true;\n        if (event.stopPropagation) {\n            event.stopPropagation();\n        }\n        return false;\n    }\n    return true;\n}\nfunction WebForm_FireDefaultButton(event, target) {\n    if (event.keyCode == 13) {\n        var src = event.srcElement || event.target;\n        if (src &&\n            ((src.tagName.toLowerCase() == \"input\") &&\n             (src.type.toLowerCase() == \"submit\" || src.type.toLowerCase() == \"button\")) ||\n            ((src.tagName.toLowerCase() == \"a\") &&\n             (src.href != null) && (src.href != \"\")) ||\n            (src.tagName.toLowerCase() == \"textarea\")) {\n            return true;\n        }\n        var defaultButton;\n        if (__nonMSDOMBrowser) {\n            defaultButton = document.getElementById(target);\n        }\n        else {\n            defaultButton = document.all[target];\n        }\n        if (defaultButton) {\n            return WebForm_SimulateClick(defaultButton, event);\n        } \n    }\n    return true;\n}\nfunction WebForm_GetScrollX() {\n    if (__nonMSDOMBrowser) {\n        return window.pageXOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollLeft) {\n            return document.documentElement.scrollLeft;\n        }\n        else if (document.body) {\n            return document.body.scrollLeft;\n        }\n    }\n    return 0;\n}\nfunction WebForm_GetScrollY() {\n    if (__nonMSDOMBrowser) {\n        return window.pageYOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollTop) {\n            return document.documentElement.scrollTop;\n        }\n        else if (document.body) {\n            return document.body.scrollTop;\n        }\n    }\n    return 0;\n}\nfunction WebForm_SaveScrollPositionSubmit() {\n    if (__nonMSDOMBrowser) {\n        theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset;\n        theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset;\n    }\n    else {\n        theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n        theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    }\n    if ((typeof(this.oldSubmit) != \"undefined\") && (this.oldSubmit != null)) {\n        return this.oldSubmit();\n    }\n    return true;\n}\nfunction WebForm_SaveScrollPositionOnSubmit() {\n    theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n    theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    if ((typeof(this.oldOnSubmit) != \"undefined\") && (this.oldOnSubmit != null)) {\n        return this.oldOnSubmit();\n    }\n    return true;\n}\nfunction WebForm_RestoreScrollPosition() {\n    if (__nonMSDOMBrowser) {\n        window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value);\n    }\n    else {\n        window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value);\n    }\n    if ((typeof(theForm.oldOnLoad) != \"undefined\") && (theForm.oldOnLoad != null)) {\n        return theForm.oldOnLoad();\n    }\n    return true;\n}\nfunction WebForm_TextBoxKeyHandler(event) {\n    if (event.keyCode == 13) {\n        var target;\n        if (__nonMSDOMBrowser) {\n            target = event.target;\n        }\n        else {\n            target = event.srcElement;\n        }\n        if ((typeof(target) != \"undefined\") && (target != null)) {\n            if (typeof(target.onchange) != \"undefined\") {\n                target.onchange();\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction WebForm_TrimString(value) {\n    return value.replace(/^\\s+|\\s+$/g, '')\n}\nfunction WebForm_AppendToClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index === -1) {\n        element.className = (element.className === '') ? className : element.className + ' ' + className;\n    }\n}\nfunction WebForm_RemoveClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index >= 0) {\n        element.className = WebForm_TrimString(currentClassName.substring(0, index) + ' ' +\n            currentClassName.substring(index + className.length + 1, currentClassName.length));\n    }\n}\nfunction WebForm_GetElementById(elementId) {\n    if (document.getElementById) {\n        return document.getElementById(elementId);\n    }\n    else if (document.all) {\n        return document.all[elementId];\n    }\n    else return null;\n}\nfunction WebForm_GetElementByTagName(element, tagName) {\n    var elements = WebForm_GetElementsByTagName(element, tagName);\n    if (elements && elements.length > 0) {\n        return elements[0];\n    }\n    else return null;\n}\nfunction WebForm_GetElementsByTagName(element, tagName) {\n    if (element && tagName) {\n        if (element.getElementsByTagName) {\n            return element.getElementsByTagName(tagName);\n        }\n        if (element.all && element.all.tags) {\n            return element.all.tags(tagName);\n        }\n    }\n    return null;\n}\nfunction WebForm_GetElementDir(element) {\n    if (element) {\n        if (element.dir) {\n            return element.dir;\n        }\n        return WebForm_GetElementDir(element.parentNode);\n    }\n    return \"ltr\";\n}\nfunction WebForm_GetElementPosition(element) {\n    var result = new Object();\n    result.x = 0;\n    result.y = 0;\n    result.width = 0;\n    result.height = 0;\n    if (element.offsetParent) {\n        result.x = element.offsetLeft;\n        result.y = element.offsetTop;\n        var parent = element.offsetParent;\n        while (parent) {\n            result.x += parent.offsetLeft;\n            result.y += parent.offsetTop;\n            var parentTagName = parent.tagName.toLowerCase();\n            if (parentTagName != \"table\" &&\n                parentTagName != \"body\" && \n                parentTagName != \"html\" && \n                parentTagName != \"div\" && \n                parent.clientTop && \n                parent.clientLeft) {\n                result.x += parent.clientLeft;\n                result.y += parent.clientTop;\n            }\n            parent = parent.offsetParent;\n        }\n    }\n    else if (element.left && element.top) {\n        result.x = element.left;\n        result.y = element.top;\n    }\n    else {\n        if (element.x) {\n            result.x = element.x;\n        }\n        if (element.y) {\n            result.y = element.y;\n        }\n    }\n    if (element.offsetWidth && element.offsetHeight) {\n        result.width = element.offsetWidth;\n        result.height = element.offsetHeight;\n    }\n    else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {\n        result.width = element.style.pixelWidth;\n        result.height = element.style.pixelHeight;\n    }\n    return result;\n}\nfunction WebForm_GetParentByTagName(element, tagName) {\n    var parent = element.parentNode;\n    var upperTagName = tagName.toUpperCase();\n    while (parent && (parent.tagName.toUpperCase() != upperTagName)) {\n        parent = parent.parentNode ? parent.parentNode : parent.parentElement;\n    }\n    return parent;\n}\nfunction WebForm_SetElementHeight(element, height) {\n    if (element && element.style) {\n        element.style.height = height + \"px\";\n    }\n}\nfunction WebForm_SetElementWidth(element, width) {\n    if (element && element.style) {\n        element.style.width = width + \"px\";\n    }\n}\nfunction WebForm_SetElementX(element, x) {\n    if (element && element.style) {\n        element.style.left = x + \"px\";\n    }\n}\nfunction WebForm_SetElementY(element, y) {\n    if (element && element.style) {\n        element.style.top = y + \"px\";\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebParts.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebParts.js\nvar __wpm = null;\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\nfunction __wpTranslateOffset(x, y, offsetElement, relativeToElement, includeScroll) {\n    while ((typeof(offsetElement) != \"undefined\") && (offsetElement != null) && (offsetElement != relativeToElement)) {\n        x += offsetElement.offsetLeft;\n        y += offsetElement.offsetTop;\n        var tagName = offsetElement.tagName;\n        if ((tagName != \"TABLE\") && (tagName != \"BODY\")) {\n            x += offsetElement.clientLeft;\n            y += offsetElement.clientTop;\n        }\n        if (includeScroll && (tagName != \"BODY\")) {\n            x -= offsetElement.scrollLeft;\n            y -= offsetElement.scrollTop;\n        }\n        offsetElement = offsetElement.offsetParent;\n    }\n    return new Point(x, y);\n}\nfunction __wpGetPageEventLocation(event, includeScroll) {\n    if ((typeof(event) == \"undefined\") || (event == null)) {\n        event = window.event;\n    }\n    return __wpTranslateOffset(event.offsetX, event.offsetY, event.srcElement, null, includeScroll);\n}\nfunction __wpClearSelection() {\n    document.selection.empty();\n}\nfunction WebPart(webPartElement, webPartTitleElement, zone, zoneIndex, allowZoneChange) {\n    this.webPartElement = webPartElement;\n    this.allowZoneChange = allowZoneChange;\n    this.zone = zone;\n    this.zoneIndex = zoneIndex;\n    this.title = ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) ?\n        webPartTitleElement.innerText : \"\";\n    webPartElement.__webPart = this;\n    if ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) {\n        webPartTitleElement.style.cursor = \"move\";\n        webPartTitleElement.attachEvent(\"onmousedown\", WebPart_OnMouseDown);\n        webPartElement.attachEvent(\"ondragstart\", WebPart_OnDragStart);\n        webPartElement.attachEvent(\"ondrag\", WebPart_OnDrag);\n        webPartElement.attachEvent(\"ondragend\", WebPart_OnDragEnd);\n    }\n    this.UpdatePosition = WebPart_UpdatePosition;\n    this.Dispose = WebPart_Dispose;\n}\nfunction WebPart_Dispose() {\n    this.webPartElement.__webPart = null    \n}\nfunction WebPart_OnMouseDown() {\n    var currentEvent = window.event;\n    var draggedWebPart = WebPart_GetParentWebPartElement(currentEvent.srcElement);\n    if ((typeof(draggedWebPart) == \"undefined\") || (draggedWebPart == null)) {\n        return;\n    }\n    document.selection.empty();\n    try {\n        __wpm.draggedWebPart = draggedWebPart;\n        __wpm.DragDrop();\n    }\n    catch (e) {\n        __wpm.draggedWebPart = draggedWebPart;\n        window.setTimeout(\"__wpm.DragDrop()\", 0);\n    }\n    currentEvent.returnValue = false;\n    currentEvent.cancelBubble = true;\n}\nfunction WebPart_OnDragStart() {\n    var currentEvent = window.event;\n    var webPartElement = currentEvent.srcElement;\n    if ((typeof(webPartElement.__webPart) == \"undefined\") || (webPartElement.__webPart == null)) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n        return;\n    }\n    var dataObject = currentEvent.dataTransfer;\n    dataObject.effectAllowed = __wpm.InitiateWebPartDragDrop(webPartElement);\n}\nfunction WebPart_OnDrag() {\n    __wpm.ContinueWebPartDragDrop();\n}\nfunction WebPart_OnDragEnd() {\n    __wpm.CompleteWebPartDragDrop();\n}\nfunction WebPart_GetParentWebPartElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__webPart) == \"undefined\") || (elem.__webPart == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction WebPart_UpdatePosition() {\n    var location = __wpTranslateOffset(0, 0, this.webPartElement, null, false);\n    this.middleX = location.x + this.webPartElement.offsetWidth / 2;\n    this.middleY = location.y + this.webPartElement.offsetHeight / 2;\n}\nfunction Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var webPartTable = null;\n    if (zoneElement.rows.length == 1) {\n        webPartTableContainer = zoneElement.rows[0].cells[0];\n    }\n    else {\n        webPartTableContainer = zoneElement.rows[1].cells[0];\n    }\n    var i;\n    for (i = 0; i < webPartTableContainer.childNodes.length; i++) {\n        var node = webPartTableContainer.childNodes[i];\n        if (node.tagName == \"TABLE\") {\n            webPartTable = node;\n            break;\n        }\n    }\n    this.zoneElement = zoneElement;\n    this.zoneIndex = zoneIndex;\n    this.webParts = new Array();\n    this.uniqueID = uniqueID;\n    this.isVertical = isVertical;\n    this.allowLayoutChange = allowLayoutChange;\n    this.allowDrop = false;\n    this.webPartTable = webPartTable;\n    this.highlightColor = highlightColor;\n    this.savedBorderColor = (webPartTable != null) ? webPartTable.style.borderColor : null;\n    this.dropCueElements = new Array();\n    if (webPartTable != null) {\n        if (isVertical) {\n            for (i = 0; i < webPartTable.rows.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[i].cells[0].childNodes[0];\n            }\n        }\n        else {\n            for (i = 0; i < webPartTable.rows[0].cells.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[0].cells[i].childNodes[0];\n            }\n        }\n    }\n    this.AddWebPart = Zone_AddWebPart;\n    this.GetWebPartIndex = Zone_GetWebPartIndex;\n    this.ToggleDropCues = Zone_ToggleDropCues;\n    this.UpdatePosition = Zone_UpdatePosition;\n    this.Dispose = Zone_Dispose;\n    webPartTable.__zone = this;\n    webPartTable.attachEvent(\"ondragenter\", Zone_OnDragEnter);\n    webPartTable.attachEvent(\"ondrop\", Zone_OnDrop);\n}\nfunction Zone_Dispose() {\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].Dispose();\n    }\n    this.webPartTable.__zone = null;\n}\nfunction Zone_OnDragEnter() {\n    var handled = __wpm.ProcessWebPartDragEnter();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDragOver() {\n    var handled = __wpm.ProcessWebPartDragOver();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDrop() {\n    var handled = __wpm.ProcessWebPartDrop();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_GetParentZoneElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__zone) == \"undefined\") || (elem.__zone == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction Zone_AddWebPart(webPartElement, webPartTitleElement, allowZoneChange) {\n    var webPart = null;\n    var zoneIndex = this.webParts.length;\n    if (this.allowLayoutChange && __wpm.IsDragDropEnabled()) {\n        webPart = new WebPart(webPartElement, webPartTitleElement, this, zoneIndex, allowZoneChange);\n    }\n    else {\n        webPart = new WebPart(webPartElement, null, this, zoneIndex, allowZoneChange);\n    }\n    this.webParts[zoneIndex] = webPart;\n    return webPart;\n}\nfunction Zone_ToggleDropCues(show, index, ignoreOutline) {\n    if (ignoreOutline == false) {\n        this.webPartTable.style.borderColor = (show ? this.highlightColor : this.savedBorderColor);\n    }\n    if (index == -1) {\n        return;\n    }\n    var dropCue = this.dropCueElements[index];\n    if (dropCue && dropCue.style) {\n        if (dropCue.style.height == \"100%\" && !dropCue.webPartZoneHorizontalCueResized) {\n            var oldParentHeight = dropCue.parentElement.clientHeight;\n            var realHeight = oldParentHeight - 10;\n            dropCue.style.height = realHeight + \"px\";\n            var dropCueVerticalBar = dropCue.getElementsByTagName(\"DIV\")[0];\n            if (dropCueVerticalBar && dropCueVerticalBar.style) {\n                dropCueVerticalBar.style.height = dropCue.style.height;\n                var heightDiff = (dropCue.parentElement.clientHeight - oldParentHeight);\n                if (heightDiff) {\n                    dropCue.style.height = (realHeight - heightDiff) + \"px\";\n                    dropCueVerticalBar.style.height = dropCue.style.height;\n                }\n            }\n            dropCue.webPartZoneHorizontalCueResized = true;\n        }\n        dropCue.style.visibility = (show ? \"visible\" : \"hidden\");\n    }\n}\nfunction Zone_GetWebPartIndex(location) {\n    var x = location.x;\n    var y = location.y;\n    if ((x < this.webPartTableLeft) || (x > this.webPartTableRight) ||\n        (y < this.webPartTableTop) || (y > this.webPartTableBottom)) {\n        return -1;\n    }\n    var vertical = this.isVertical;\n    var webParts = this.webParts;\n    var webPartsCount = webParts.length;\n    for (var i = 0; i < webPartsCount; i++) {\n        var webPart = webParts[i];\n        if (vertical) {\n            if (y < webPart.middleY) {\n                return i;\n            }\n        }\n        else {\n            if (x < webPart.middleX) {\n                return i;\n            }\n        }\n    }\n    return webPartsCount;\n}\nfunction Zone_UpdatePosition() {\n    var topLeft = __wpTranslateOffset(0, 0, this.webPartTable, null, false);\n    this.webPartTableLeft = topLeft.x;\n    this.webPartTableTop = topLeft.y;\n    this.webPartTableRight = (this.webPartTable != null) ? topLeft.x + this.webPartTable.offsetWidth : topLeft.x;\n    this.webPartTableBottom = (this.webPartTable != null) ? topLeft.y + this.webPartTable.offsetHeight : topLeft.y;\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].UpdatePosition();\n    }\n}\nfunction WebPartDragState(webPartElement, effect) {\n    this.webPartElement = webPartElement;\n    this.dropZoneElement = null;\n    this.dropIndex = -1;\n    this.effect = effect;\n    this.dropped = false;\n}\nfunction WebPartMenu(menuLabelElement, menuDropDownElement, menuElement) {\n    this.menuLabelElement = menuLabelElement;\n    this.menuDropDownElement = menuDropDownElement;\n    this.menuElement = menuElement;\n    this.menuLabelElement.__menu = this;\n    this.menuLabelElement.attachEvent('onclick', WebPartMenu_OnClick);\n    this.menuLabelElement.attachEvent('onkeypress', WebPartMenu_OnKeyPress);\n    this.menuLabelElement.attachEvent('onmouseenter', WebPartMenu_OnMouseEnter);\n    this.menuLabelElement.attachEvent('onmouseleave', WebPartMenu_OnMouseLeave);\n    if ((typeof(this.menuDropDownElement) != \"undefined\") && (this.menuDropDownElement != null)) {\n        this.menuDropDownElement.__menu = this;\n    }\n    this.menuItemStyle = \"\";\n    this.menuItemHoverStyle = \"\";\n    this.popup = null;\n    this.hoverClassName = \"\";\n    this.hoverColor = \"\";\n    this.oldColor = this.menuLabelElement.style.color;\n    this.oldTextDecoration = this.menuLabelElement.style.textDecoration;\n    this.oldClassName = this.menuLabelElement.className;\n    this.Show = WebPartMenu_Show;\n    this.Hide = WebPartMenu_Hide;\n    this.Hover = WebPartMenu_Hover;\n    this.Unhover = WebPartMenu_Unhover;\n    this.Dispose = WebPartMenu_Dispose;\n    var menu = this;\n    this.disposeDelegate = function() { menu.Dispose(); };\n    window.attachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Dispose() {\n    this.menuLabelElement.__menu = null;\n    this.menuDropDownElement.__menu = null;\n    window.detachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Show() {\n    if ((typeof(__wpm.menu) != \"undefined\") && (__wpm.menu != null)) {\n        __wpm.menu.Hide();\n    }\n    var menuHTML =\n        \"<html><head><style>\" +\n        \"a.menuItem, a.menuItem:Link { display: block; padding: 1px; text-decoration: none; \" + this.itemStyle + \" }\" +\n        \"a.menuItem:Hover { \" + this.itemHoverStyle + \" }\" +\n        \"</style><body scroll=\\\"no\\\" style=\\\"border: none; margin: 0; padding: 0;\\\" ondragstart=\\\"window.event.returnValue=false;\\\" onclick=\\\"popup.hide()\\\">\" +\n        this.menuElement.innerHTML +\n        \"</body></html>\";\n    var width = 16;\n    var height = 16;\n    this.popup = window.createPopup();\n    __wpm.menu = this;\n    var popupDocument = this.popup.document;\n    popupDocument.write(menuHTML);\n    this.popup.show(0, 0, width, height);\n    var popupBody = popupDocument.body;\n    width = popupBody.scrollWidth;\n    height = popupBody.scrollHeight;\n    if (width < this.menuLabelElement.offsetWidth) {\n        width = this.menuLabelElement.offsetWidth + 16;\n    }\n    if (this.menuElement.innerHTML.indexOf(\"progid:DXImageTransform.Microsoft.Shadow\") != -1) {\n        popupBody.style.paddingRight = \"4px\";\n    }\n    popupBody.__wpm = __wpm;\n    popupBody.__wpmDeleteWarning = __wpmDeleteWarning;\n    popupBody.__wpmCloseProviderWarning = __wpmCloseProviderWarning;\n    popupBody.popup = this.popup;\n    this.popup.hide();\n    this.popup.show(0, this.menuLabelElement.offsetHeight, width, height, this.menuLabelElement);\n}\nfunction WebPartMenu_Hide() {\n    if (__wpm.menu == this) {\n        __wpm.menu = null;\n        if ((typeof(this.popup) != \"undefined\") && (this.popup != null)) {\n            this.popup.hide();\n            this.popup = null;\n        }\n    }\n}\nfunction WebPartMenu_Hover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.className = this.menuLabelElement.className + \" \" + this.labelHoverClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.labelHoverColor;\n    }\n}\nfunction WebPartMenu_Unhover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.style.textDecoration = this.oldTextDecoration;\n        this.menuLabelElement.className = this.oldClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.oldColor;\n    }\n}\nfunction WebPartMenu_OnClick() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        window.event.returnValue = false;\n        window.event.cancelBubble = true;\n        menu.Show();\n    }\n}\nfunction WebPartMenu_OnKeyPress() {\n    if (window.event.keyCode == 13) {\n        var menu = window.event.srcElement.__menu;\n        if ((typeof(menu) != \"undefined\") && (menu != null)) {\n            window.event.returnValue = false;\n            window.event.cancelBubble = true;\n            menu.Show();\n        }\n    }\n}\nfunction WebPartMenu_OnMouseEnter() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Hover();\n    }\n}\nfunction WebPartMenu_OnMouseLeave() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Unhover();\n    }\n}\nfunction WebPartManager() {\n    this.overlayContainerElement = null;\n    this.zones = new Array();\n    this.dragState = null;\n    this.menu = null;\n    this.draggedWebPart = null;\n    this.AddZone = WebPartManager_AddZone;\n    this.IsDragDropEnabled = WebPartManager_IsDragDropEnabled;\n    this.DragDrop = WebPartManager_DragDrop;\n    this.InitiateWebPartDragDrop = WebPartManager_InitiateWebPartDragDrop;\n    this.CompleteWebPartDragDrop = WebPartManager_CompleteWebPartDragDrop;\n    this.ContinueWebPartDragDrop = WebPartManager_ContinueWebPartDragDrop;\n    this.ProcessWebPartDragEnter = WebPartManager_ProcessWebPartDragEnter;\n    this.ProcessWebPartDragOver = WebPartManager_ProcessWebPartDragOver;\n    this.ProcessWebPartDrop = WebPartManager_ProcessWebPartDrop;\n    this.ShowHelp = WebPartManager_ShowHelp;\n    this.ExportWebPart = WebPartManager_ExportWebPart;\n    this.Execute = WebPartManager_Execute;\n    this.SubmitPage = WebPartManager_SubmitPage;\n    this.UpdatePositions = WebPartManager_UpdatePositions;\n    window.attachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_Dispose() {\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].Dispose();\n    }\n    window.detachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_AddZone(zoneElement, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var zoneIndex = this.zones.length;\n    var zone = new Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor);\n    this.zones[zoneIndex] = zone;\n    return zone;\n}\nfunction WebPartManager_IsDragDropEnabled() {\n    return ((typeof(this.overlayContainerElement) != \"undefined\") && (this.overlayContainerElement != null));\n}\nfunction WebPartManager_DragDrop() {\n    if ((typeof(this.draggedWebPart) != \"undefined\") && (this.draggedWebPart != null)) {\n        var tempWebPart = this.draggedWebPart;\n        this.draggedWebPart = null;\n        tempWebPart.dragDrop();\n        window.setTimeout(\"__wpClearSelection()\", 0);\n    }\n}\nfunction WebPartManager_InitiateWebPartDragDrop(webPartElement) {\n    var webPart = webPartElement.__webPart;\n    this.UpdatePositions();\n    this.dragState = new WebPartDragState(webPartElement, \"move\");\n    var location = __wpGetPageEventLocation(window.event, true);\n    var overlayContainerElement = this.overlayContainerElement;\n    overlayContainerElement.style.left = location.x - webPartElement.offsetWidth / 2;\n    overlayContainerElement.style.top = location.y + 4 + (webPartElement.clientTop ? webPartElement.clientTop : 0);\n    overlayContainerElement.style.display = \"block\";\n    overlayContainerElement.style.width = webPartElement.offsetWidth;\n    overlayContainerElement.style.height = webPartElement.offsetHeight;\n    overlayContainerElement.appendChild(webPartElement.cloneNode(true));\n    if (webPart.allowZoneChange == false) {\n        webPart.zone.allowDrop = true;\n    }\n    else {\n        for (var i = 0; i < __wpm.zones.length; i++) {\n            var zone = __wpm.zones[i];\n            if (zone.allowLayoutChange) {\n                zone.allowDrop = true;\n            }\n        }\n    }\n    document.body.attachEvent(\"ondragover\", Zone_OnDragOver);\n    return \"move\";\n}\nfunction WebPartManager_CompleteWebPartDragDrop() {\n    var dragState = this.dragState;\n    this.dragState = null;\n    if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n    }\n    document.body.detachEvent(\"ondragover\", Zone_OnDragOver);\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].allowDrop = false;\n    }\n    this.overlayContainerElement.removeChild(this.overlayContainerElement.firstChild);\n    this.overlayContainerElement.style.display = \"none\";\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) && (dragState.dropped == true)) {\n        var currentZone = dragState.webPartElement.__webPart.zone;\n        var currentZoneIndex = dragState.webPartElement.__webPart.zoneIndex;\n        if ((currentZone != dragState.dropZoneElement.__zone) ||\n            ((currentZoneIndex != dragState.dropIndex) &&\n             (currentZoneIndex != (dragState.dropIndex - 1)))) {\n            var eventTarget = dragState.dropZoneElement.__zone.uniqueID;\n            var eventArgument = \"Drag:\" + dragState.webPartElement.id + \":\" + dragState.dropIndex;\n            this.SubmitPage(eventTarget, eventArgument);\n        }\n    }\n}\nfunction WebPartManager_ContinueWebPartDragDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var style = this.overlayContainerElement.style;\n        var location = __wpGetPageEventLocation(window.event, true);\n        style.left = location.x - dragState.webPartElement.offsetWidth / 2;\n        style.top = location.y + 4 + (dragState.webPartElement.clientTop ? dragState.webPartElement.clientTop : 0);\n    }\n}\nfunction WebPartManager_Execute(script) {\n    if (this.menu) {\n        this.menu.Hide();\n    }\n    var scriptReference = new Function(script);\n    return (scriptReference() != false);\n}\nfunction WebPartManager_ProcessWebPartDragEnter() {\n    var dragState = __wpm.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var newDropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(newDropZoneElement.__zone) == \"undefined\") || (newDropZoneElement.__zone == null) ||\n            (newDropZoneElement.__zone.allowDrop == false)) {\n            newDropZoneElement = null;\n        }\n        var newDropIndex = -1;\n        if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n            newDropIndex = newDropZoneElement.__zone.GetWebPartIndex(__wpGetPageEventLocation(currentEvent, false));\n            if (newDropIndex == -1) {\n                newDropZoneElement = null;\n            }\n        }\n        if (dragState.dropZoneElement != newDropZoneElement) {\n            if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropZoneElement = newDropZoneElement;\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        else if (dragState.dropIndex != newDropIndex) {\n            if (dragState.dropIndex != -1) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            currentEvent.dataTransfer.effectAllowed = dragState.effect;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ProcessWebPartDragOver() {\n    var dragState = __wpm.dragState;\n    var currentEvent = window.event;\n    var handled = false;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) &&\n        (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if (((typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) &&\n            (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n            dragState.dropZoneElement = null;\n            dragState.dropIndex = -1;\n        }\n        else if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n            var location = __wpGetPageEventLocation(currentEvent, false);\n            var newDropIndex = dropZoneElement.__zone.GetWebPartIndex(location);\n            if (newDropIndex == -1) {\n                dropZoneElement = null;\n            }\n            if (dragState.dropZoneElement != dropZoneElement) {\n                if ((dragState.dropIndex != -1) || (typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) {\n                    dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n                }\n                dragState.dropZoneElement = dropZoneElement;\n            }\n            else {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, true);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n                dropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        handled = true;\n    }\n    if ((typeof(dragState) == \"undefined\") || (dragState == null) ||\n        (typeof(dragState.dropZoneElement) == \"undefined\") || (dragState.dropZoneElement == null)) {\n        currentEvent.dataTransfer.effectAllowed = \"none\";\n    }\n    return handled;\n}\nfunction WebPartManager_ProcessWebPartDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dragState.dropZoneElement == dropZoneElement)) {\n            dragState.dropped = true;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ShowHelp(helpUrl, helpMode) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    if (helpMode == 0 || helpMode == 1) {\n        if (helpMode == 0) {\n            var dialogInfo = \"edge: Sunken; center: yes; help: no; resizable: yes; status: no\";\n            window.showModalDialog(helpUrl, null, dialogInfo);\n        }\n        else {\n            window.open(helpUrl, null, \"scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no\");\n        }\n    }\n    else if (helpMode == 2) {\n        window.location = helpUrl;\n    }\n}\nfunction WebPartManager_ExportWebPart(exportUrl, warn, confirmOnly) {\n    if (warn == true && __wpmExportWarning.length > 0 && this.personalizationScopeShared != true) {\n        if (confirm(__wpmExportWarning) == false) {\n            return false;\n        }\n    }\n    if (confirmOnly == false) {\n        window.location = exportUrl;\n    }\n    return true;\n}\nfunction WebPartManager_UpdatePositions() {\n    for (var i = 0; i < this.zones.length; i++) {\n        this.zones[i].UpdatePosition();\n    }\n}\nfunction WebPartManager_SubmitPage(eventTarget, eventArgument) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    __doPostBack(eventTarget, eventArgument);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebUIValidation.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebUIValidation.js\nvar Page_ValidationVer = \"125\";\nvar Page_IsValid = true;\nvar Page_BlockSubmit = false;\nvar Page_InvalidControlToBeFocused = null;\nvar Page_TextTypes = /^(text|password|file|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction ValidatorUpdateDisplay(val) {\n    if (typeof(val.display) == \"string\") {\n        if (val.display == \"None\") {\n            return;\n        }\n        if (val.display == \"Dynamic\") {\n            val.style.display = val.isvalid ? \"none\" : \"inline\";\n            return;\n        }\n    }\n    if ((navigator.userAgent.indexOf(\"Mac\") > -1) &&\n        (navigator.userAgent.indexOf(\"MSIE\") > -1)) {\n        val.style.display = \"inline\";\n    }\n    val.style.visibility = val.isvalid ? \"hidden\" : \"visible\";\n}\nfunction ValidatorUpdateIsValid() {\n    Page_IsValid = AllValidatorsValid(Page_Validators);\n}\nfunction AllValidatorsValid(validators) {\n    if ((typeof(validators) != \"undefined\") && (validators != null)) {\n        var i;\n        for (i = 0; i < validators.length; i++) {\n            if (!validators[i].isvalid) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction ValidatorHookupControlID(controlID, val) {\n    if (typeof(controlID) != \"string\") {\n        return;\n    }\n    var ctrl = document.getElementById(controlID);\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null)) {\n        ValidatorHookupControl(ctrl, val);\n    }\n    else {\n        val.isvalid = true;\n        val.enabled = false;\n    }\n}\nfunction ValidatorHookupControl(control, val) {\n    if (typeof(control.tagName) != \"string\") {\n        return;  \n    }\n    if (control.tagName != \"INPUT\" && control.tagName != \"TEXTAREA\" && control.tagName != \"SELECT\") {\n        var i;\n        for (i = 0; i < control.childNodes.length; i++) {\n            ValidatorHookupControl(control.childNodes[i], val);\n        }\n        return;\n    }\n    else {\n        if (typeof(control.Validators) == \"undefined\") {\n            control.Validators = new Array;\n            var eventType;\n            if (control.type == \"radio\") {\n                eventType = \"onclick\";\n            } else {\n                eventType = \"onchange\";\n                if (typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                    ValidatorHookupEvent(control, \"onblur\", \"ValidatedControlOnBlur(event); \");\n                }\n            }\n            ValidatorHookupEvent(control, eventType, \"ValidatorOnChange(event); \");\n            if (Page_TextTypes.test(control.type)) {\n                ValidatorHookupEvent(control, \"onkeypress\", \n                    \"event = event || window.event; if (!ValidatedTextBoxOnKeyPress(event)) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } \");\n            }\n        }\n        control.Validators[control.Validators.length] = val;\n    }\n}\nfunction ValidatorHookupEvent(control, eventType, functionPrefix) {\n    var ev = control[eventType];\n    if (typeof(ev) == \"function\") {\n        ev = ev.toString();\n        ev = ev.substring(ev.indexOf(\"{\") + 1, ev.lastIndexOf(\"}\"));\n    }\n    else {\n        ev = \"\";\n    }\n    control[eventType] = new Function(\"event\", functionPrefix + \" \" + ev);\n}\nfunction ValidatorGetValue(id) {\n    var control;\n    control = document.getElementById(id);\n    if (typeof(control.value) == \"string\") {\n        return control.value;\n    }\n    return ValidatorGetValueRecursive(control);\n}\nfunction ValidatorGetValueRecursive(control)\n{\n    if (typeof(control.value) == \"string\" && (control.type != \"radio\" || control.checked == true)) {\n        return control.value;\n    }\n    var i, val;\n    for (i = 0; i<control.childNodes.length; i++) {\n        val = ValidatorGetValueRecursive(control.childNodes[i]);\n        if (val != \"\") return val;\n    }\n    return \"\";\n}\nfunction Page_ClientValidate(validationGroup) {\n    Page_InvalidControlToBeFocused = null;\n    if (typeof(Page_Validators) == \"undefined\") {\n        return true;\n    }\n    var i;\n    for (i = 0; i < Page_Validators.length; i++) {\n        ValidatorValidate(Page_Validators[i], validationGroup, null);\n    }\n    ValidatorUpdateIsValid();\n    ValidationSummaryOnSubmit(validationGroup);\n    Page_BlockSubmit = !Page_IsValid;\n    return Page_IsValid;\n}\nfunction ValidatorCommonOnSubmit() {\n    Page_InvalidControlToBeFocused = null;\n    var result = !Page_BlockSubmit;\n    if ((typeof(window.event) != \"undefined\") && (window.event != null)) {\n        window.event.returnValue = result;\n    }\n    Page_BlockSubmit = false;\n    return result;\n}\nfunction ValidatorEnable(val, enable) {\n    val.enabled = (enable != false);\n    ValidatorValidate(val);\n    ValidatorUpdateIsValid();\n}\nfunction ValidatorOnChange(event) {\n    event = event || window.event;\n    Page_InvalidControlToBeFocused = null;\n    var targetedControl;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        targetedControl = event.srcElement;\n    }\n    else {\n        targetedControl = event.target;\n    }\n    var vals;\n    if (typeof(targetedControl.Validators) != \"undefined\") {\n        vals = targetedControl.Validators;\n    }\n    else {\n        if (targetedControl.tagName.toLowerCase() == \"label\") {\n            targetedControl = document.getElementById(targetedControl.htmlFor);\n            vals = targetedControl.Validators;\n        }\n    }\n    if (vals) {\n        for (var i = 0; i < vals.length; i++) {\n            ValidatorValidate(vals[i], null, event);\n        }\n    }\n    ValidatorUpdateIsValid();\n}\nfunction ValidatedTextBoxOnKeyPress(event) {\n    event = event || window.event;\n    if (event.keyCode == 13) {\n        ValidatorOnChange(event);\n        var vals;\n        if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n            vals = event.srcElement.Validators;\n        }\n        else {\n            vals = event.target.Validators;\n        }\n        return AllValidatorsValid(vals);\n    }\n    return true;\n}\nfunction ValidatedControlOnBlur(event) {\n    event = event || window.event;\n    var control;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        control = event.srcElement;\n    }\n    else {\n        control = event.target;\n    }\n    if ((typeof(control) != \"undefined\") && (control != null) && (Page_InvalidControlToBeFocused == control)) {\n        control.focus();\n        Page_InvalidControlToBeFocused = null;\n    }\n}\nfunction ValidatorValidate(val, validationGroup, event) {\n    val.isvalid = true;\n    if ((typeof(val.enabled) == \"undefined\" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {\n        if (typeof(val.evaluationfunction) == \"function\") {\n            val.isvalid = val.evaluationfunction(val);\n            if (!val.isvalid && Page_InvalidControlToBeFocused == null &&\n                typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                ValidatorSetFocus(val, event);\n            }\n        }\n    }\n    ValidatorUpdateDisplay(val);\n}\nfunction ValidatorSetFocus(val, event) {\n    var ctrl;\n    if (typeof(val.controlhookup) == \"string\") {\n        var eventCtrl;\n        if ((typeof(event) != \"undefined\") && (event != null)) {\n            if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n                eventCtrl = event.srcElement;\n            }\n            else {\n                eventCtrl = event.target;\n            }\n        }\n        if ((typeof(eventCtrl) != \"undefined\") && (eventCtrl != null) &&\n            (typeof(eventCtrl.id) == \"string\") &&\n            (eventCtrl.id == val.controlhookup)) {\n            ctrl = eventCtrl;\n        }\n    }\n    if ((typeof(ctrl) == \"undefined\") || (ctrl == null)) {\n        ctrl = document.getElementById(val.controltovalidate);\n    }\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null) &&\n        (ctrl.tagName.toLowerCase() != \"table\" || (typeof(event) == \"undefined\") || (event == null)) && \n        ((ctrl.tagName.toLowerCase() != \"input\") || (ctrl.type.toLowerCase() != \"hidden\")) &&\n        (typeof(ctrl.disabled) == \"undefined\" || ctrl.disabled == null || ctrl.disabled == false) &&\n        (typeof(ctrl.visible) == \"undefined\" || ctrl.visible == null || ctrl.visible != false) &&\n        (IsInVisibleContainer(ctrl))) {\n        if ((ctrl.tagName.toLowerCase() == \"table\" && (typeof(__nonMSDOMBrowser) == \"undefined\" || __nonMSDOMBrowser)) ||\n            (ctrl.tagName.toLowerCase() == \"span\")) {\n            var inputElements = ctrl.getElementsByTagName(\"input\");\n            var lastInputElement  = inputElements[inputElements.length -1];\n            if (lastInputElement != null) {\n                ctrl = lastInputElement;\n            }\n        }\n        if (typeof(ctrl.focus) != \"undefined\" && ctrl.focus != null) {\n            ctrl.focus();\n            Page_InvalidControlToBeFocused = ctrl;\n        }\n    }\n}\nfunction IsInVisibleContainer(ctrl) {\n    if (typeof(ctrl.style) != \"undefined\" &&\n        ( ( typeof(ctrl.style.display) != \"undefined\" &&\n            ctrl.style.display == \"none\") ||\n          ( typeof(ctrl.style.visibility) != \"undefined\" &&\n            ctrl.style.visibility == \"hidden\") ) ) {\n        return false;\n    }\n    else if (typeof(ctrl.parentNode) != \"undefined\" &&\n             ctrl.parentNode != null &&\n             ctrl.parentNode != ctrl) {\n        return IsInVisibleContainer(ctrl.parentNode);\n    }\n    return true;\n}\nfunction IsValidationGroupMatch(control, validationGroup) {\n    if ((typeof(validationGroup) == \"undefined\") || (validationGroup == null)) {\n        return true;\n    }\n    var controlGroup = \"\";\n    if (typeof(control.validationGroup) == \"string\") {\n        controlGroup = control.validationGroup;\n    }\n    return (controlGroup == validationGroup);\n}\nfunction ValidatorOnLoad() {\n    if (typeof(Page_Validators) == \"undefined\")\n        return;\n    var i, val;\n    for (i = 0; i < Page_Validators.length; i++) {\n        val = Page_Validators[i];\n        if (typeof(val.evaluationfunction) == \"string\") {\n            eval(\"val.evaluationfunction = \" + val.evaluationfunction + \";\");\n        }\n        if (typeof(val.isvalid) == \"string\") {\n            if (val.isvalid == \"False\") {\n                val.isvalid = false;\n                Page_IsValid = false;\n            }\n            else {\n                val.isvalid = true;\n            }\n        } else {\n            val.isvalid = true;\n        }\n        if (typeof(val.enabled) == \"string\") {\n            val.enabled = (val.enabled != \"False\");\n        }\n        if (typeof(val.controltovalidate) == \"string\") {\n            ValidatorHookupControlID(val.controltovalidate, val);\n        }\n        if (typeof(val.controlhookup) == \"string\") {\n            ValidatorHookupControlID(val.controlhookup, val);\n        }\n    }\n    Page_ValidationActive = true;\n}\nfunction ValidatorConvert(op, dataType, val) {\n    function GetFullYear(year) {\n        var twoDigitCutoffYear = val.cutoffyear % 100;\n        var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;\n        return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));\n    }\n    var num, cleanInput, m, exp;\n    if (dataType == \"Integer\") {\n        exp = /^\\s*[-\\+]?\\d+\\s*$/;\n        if (op.match(exp) == null)\n            return null;\n        num = parseInt(op, 10);\n        return (isNaN(num) ? null : num);\n    }\n    else if(dataType == \"Double\") {\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?(\\\\d*)\\\\\" + val.decimalchar + \"?(\\\\d*)\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && m[3].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + (m[2].length>0 ? m[2] : \"0\") + (m[3].length>0 ? \".\" + m[3] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Currency\") {\n        var hasDigits = (val.digits > 0);\n        var beginGroupSize, subsequentGroupSize;\n        var groupSizeNum = parseInt(val.groupsize, 10);\n        if (!isNaN(groupSizeNum) && groupSizeNum > 0) {\n            beginGroupSize = \"{1,\" + groupSizeNum + \"}\";\n            subsequentGroupSize = \"{\" + groupSizeNum + \"}\";\n        }\n        else {\n            beginGroupSize = subsequentGroupSize = \"+\";\n        }\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?((\\\\d\" + beginGroupSize + \"(\\\\\" + val.groupchar + \"\\\\d\" + subsequentGroupSize + \")+)|\\\\d*)\"\n                        + (hasDigits ? \"\\\\\" + val.decimalchar + \"?(\\\\d{0,\" + val.digits + \"})\" : \"\")\n                        + \"\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && hasDigits && m[5].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + m[2].replace(new RegExp(\"(\\\\\" + val.groupchar + \")\", \"g\"), \"\") + ((hasDigits && m[5].length > 0) ? \".\" + m[5] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Date\") {\n        var yearFirstExp = new RegExp(\"^\\\\s*((\\\\d{4})|(\\\\d{2}))([-/]|\\\\. ?)(\\\\d{1,2})\\\\4(\\\\d{1,2})\\\\.?\\\\s*$\");\n        m = op.match(yearFirstExp);\n        var day, month, year;\n        if (m != null && (((typeof(m[2]) != \"undefined\") && (m[2].length == 4)) || val.dateorder == \"ymd\")) {\n            day = m[6];\n            month = m[5];\n            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));\n        }\n        else {\n            if (val.dateorder == \"ymd\"){\n                return null;\n            }\n            var yearLastExp = new RegExp(\"^\\\\s*(\\\\d{1,2})([-/]|\\\\. ?)(\\\\d{1,2})(?:\\\\s|\\\\2)((\\\\d{4})|(\\\\d{2}))(?:\\\\s\\u0433\\\\.|\\\\.)?\\\\s*$\");\n            m = op.match(yearLastExp);\n            if (m == null) {\n                return null;\n            }\n            if (val.dateorder == \"mdy\") {\n                day = m[3];\n                month = m[1];\n            }\n            else {\n                day = m[1];\n                month = m[3];\n            }\n            year = ((typeof(m[5]) != \"undefined\") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10));\n        }\n        month -= 1;\n        var date = new Date(year, month, day);\n        if (year < 100) {\n            date.setFullYear(year);\n        }\n        return (typeof(date) == \"object\" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;\n    }\n    else {\n        return op.toString();\n    }\n}\nfunction ValidatorCompare(operand1, operand2, operator, val) {\n    var dataType = val.type;\n    var op1, op2;\n    if ((op1 = ValidatorConvert(operand1, dataType, val)) == null)\n        return false;\n    if (operator == \"DataTypeCheck\")\n        return true;\n    if ((op2 = ValidatorConvert(operand2, dataType, val)) == null)\n        return true;\n    switch (operator) {\n        case \"NotEqual\":\n            return (op1 != op2);\n        case \"GreaterThan\":\n            return (op1 > op2);\n        case \"GreaterThanEqual\":\n            return (op1 >= op2);\n        case \"LessThan\":\n            return (op1 < op2);\n        case \"LessThanEqual\":\n            return (op1 <= op2);\n        default:\n            return (op1 == op2);\n    }\n}\nfunction CompareValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var compareTo = \"\";\n    if ((typeof(val.controltocompare) != \"string\") ||\n        (typeof(document.getElementById(val.controltocompare)) == \"undefined\") ||\n        (null == document.getElementById(val.controltocompare))) {\n        if (typeof(val.valuetocompare) == \"string\") {\n            compareTo = val.valuetocompare;\n        }\n    }\n    else {\n        compareTo = ValidatorGetValue(val.controltocompare);\n    }\n    var operator = \"Equal\";\n    if (typeof(val.operator) == \"string\") {\n        operator = val.operator;\n    }\n    return ValidatorCompare(value, compareTo, operator, val);\n}\nfunction CustomValidatorEvaluateIsValid(val) {\n    var value = \"\";\n    if (typeof(val.controltovalidate) == \"string\") {\n        value = ValidatorGetValue(val.controltovalidate);\n        if ((ValidatorTrim(value).length == 0) &&\n            ((typeof(val.validateemptytext) != \"string\") || (val.validateemptytext != \"true\"))) {\n            return true;\n        }\n    }\n    var args = { Value:value, IsValid:true };\n    if (typeof(val.clientvalidationfunction) == \"string\") {\n        eval(val.clientvalidationfunction + \"(val, args) ;\");\n    }\n    return args.IsValid;\n}\nfunction RegularExpressionValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var rx = new RegExp(val.validationexpression);\n    var matches = rx.exec(value);\n    return (matches != null && value == matches[0]);\n}\nfunction ValidatorTrim(s) {\n    var m = s.match(/^\\s*(\\S+(\\s+\\S+)*)\\s*$/);\n    return (m == null) ? \"\" : m[1];\n}\nfunction RequiredFieldValidatorEvaluateIsValid(val) {\n    return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))\n}\nfunction RangeValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    return (ValidatorCompare(value, val.minimumvalue, \"GreaterThanEqual\", val) &&\n            ValidatorCompare(value, val.maximumvalue, \"LessThanEqual\", val));\n}\nfunction ValidationSummaryOnSubmit(validationGroup) {\n    if (typeof(Page_ValidationSummaries) == \"undefined\")\n        return;\n    var summary, sums, s;\n    var headerSep, first, pre, post, end;\n    for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {\n        summary = Page_ValidationSummaries[sums];\n        if (!summary) continue;\n        summary.style.display = \"none\";\n        if (!Page_IsValid && IsValidationGroupMatch(summary, validationGroup)) {\n            var i;\n            if (summary.showsummary != \"False\") {\n                summary.style.display = \"\";\n                if (typeof(summary.displaymode) != \"string\") {\n                    summary.displaymode = \"BulletList\";\n                }\n                switch (summary.displaymode) {\n                    case \"List\":\n                        headerSep = \"<br>\";\n                        first = \"\";\n                        pre = \"\";\n                        post = \"<br>\";\n                        end = \"\";\n                        break;\n                    case \"BulletList\":\n                    default:\n                        headerSep = \"\";\n                        first = \"<ul>\";\n                        pre = \"<li>\";\n                        post = \"</li>\";\n                        end = \"</ul>\";\n                        break;\n                    case \"SingleParagraph\":\n                        headerSep = \" \";\n                        first = \"\";\n                        pre = \"\";\n                        post = \" \";\n                        end = \"<br>\";\n                        break;\n                }\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + headerSep;\n                }\n                s += first;\n                for (i=0; i<Page_Validators.length; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        s += pre + Page_Validators[i].errormessage + post;\n                    }\n                }\n                s += end;\n                summary.innerHTML = s;\n                window.scrollTo(0,0);\n            }\n            if (summary.showmessagebox == \"True\") {\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + \"\\r\\n\";\n                }\n                var lastValIndex = Page_Validators.length - 1;\n                for (i=0; i<=lastValIndex; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        switch (summary.displaymode) {\n                            case \"List\":\n                                s += Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"BulletList\":\n                            default:\n                                s += \"- \" + Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"SingleParagraph\":\n                                s += Page_Validators[i].errormessage + \" \";\n                                break;\n                        }\n                    }\n                }\n                alert(s);\n            }\n        }\n    }\n}\nif (window.jQuery) {\n    (function ($) {\n        var dataValidationAttribute = \"data-val\",\n            dataValidationSummaryAttribute = \"data-valsummary\",\n            normalizedAttributes = { validationgroup: \"validationGroup\", focusonerror: \"focusOnError\" };\n        function getAttributesWithPrefix(element, prefix) {\n            var i,\n                attribute,\n                list = {},\n                attributes = element.attributes,\n                length = attributes.length,\n                prefixLength = prefix.length;\n            prefix = prefix.toLowerCase();\n            for (i = 0; i < length; i++) {\n                attribute = attributes[i];\n                if (attribute.specified && attribute.name.substr(0, prefixLength).toLowerCase() === prefix) {\n                    list[attribute.name.substr(prefixLength)] = attribute.value;\n                }\n            }\n            return list;\n        }\n        function normalizeKey(key) {\n            key = key.toLowerCase();\n            return normalizedAttributes[key] === undefined ? key : normalizedAttributes[key];\n        }\n        function addValidationExpando(element) {\n            var attributes = getAttributesWithPrefix(element, dataValidationAttribute + \"-\");\n            $.each(attributes, function (key, value) {\n                element[normalizeKey(key)] = value;\n            });\n        }\n        function dispose(element) {\n            var index = $.inArray(element, Page_Validators);\n            if (index >= 0) {\n                Page_Validators.splice(index, 1);\n            }\n        }\n        function addNormalizedAttribute(name, normalizedName) {\n            normalizedAttributes[name.toLowerCase()] = normalizedName;\n        }\n        function parseSpecificAttribute(selector, attribute, validatorsArray) {\n            return $(selector).find(\"[\" + attribute + \"='true']\").each(function (index, element) {\n                addValidationExpando(element);\n                element.dispose = function () { dispose(element); element.dispose = null; };\n                if ($.inArray(element, validatorsArray) === -1) {\n                    validatorsArray.push(element);\n                }\n            }).length;\n        }\n        function parse(selector) {\n            var length = parseSpecificAttribute(selector, dataValidationAttribute, Page_Validators);\n            length += parseSpecificAttribute(selector, dataValidationSummaryAttribute, Page_ValidationSummaries);\n            return length;\n        }\n        function loadValidators() {\n            if (typeof (ValidatorOnLoad) === \"function\") {\n                ValidatorOnLoad();\n            }\n            if (typeof (ValidatorOnSubmit) === \"undefined\") {\n                window.ValidatorOnSubmit = function () {\n                    return Page_ValidationActive ? ValidatorCommonOnSubmit() : true;\n                };\n            }\n        }\n        function registerUpdatePanel() {\n            if (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {\n                var prm = Sys.WebForms.PageRequestManager.getInstance(),\n                    postBackElement, endRequestHandler;\n                if (prm.get_isInAsyncPostBack()) {\n                    endRequestHandler = function (sender, args) {\n                        if (parse(document)) {\n                            loadValidators();\n                        }\n                        prm.remove_endRequest(endRequestHandler);\n                        endRequestHandler = null;\n                    };\n                    prm.add_endRequest(endRequestHandler);\n                }\n                prm.add_beginRequest(function (sender, args) {\n                    postBackElement = args.get_postBackElement();\n                });\n                prm.add_pageLoaded(function (sender, args) {\n                    var i, panels, valFound = 0;\n                    if (typeof (postBackElement) === \"undefined\") {\n                        return;\n                    }\n                    panels = args.get_panelsUpdated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    panels = args.get_panelsCreated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    if (valFound) {\n                        loadValidators();\n                    }\n                });\n            }\n        }\n        $(function () {\n            if (typeof (Page_Validators) === \"undefined\") {\n                window.Page_Validators = [];\n            }\n            if (typeof (Page_ValidationSummaries) === \"undefined\") {\n                window.Page_ValidationSummaries = [];\n            }\n            if (typeof (Page_ValidationActive) === \"undefined\") {\n                window.Page_ValidationActive = false;\n            }\n            $.WebFormValidator = {\n                addNormalizedAttribute: addNormalizedAttribute,\n                parse: parse\n            };\n            if (parse(document)) {\n                loadValidators();\n            }\n            registerUpdatePanel();\n        });\n    } (jQuery));\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/bootstrap.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n\n/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/\nif (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#carousel\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#collapse\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    var $el = $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#modals\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#popovers\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tabs\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#affix\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.intellisense.js",
    "content": "﻿/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\nintellisense.annotate(jQuery, {\n  'ajax': function() {\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup().</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'ajaxPrefilter': function() {\n    /// <signature>\n    ///   <summary>Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().</summary>\n    ///   <param name=\"dataTypes\" type=\"String\">An optional string containing one or more space-separated dataTypes</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to set default values for future Ajax requests.</param>\n    /// </signature>\n  },\n  'ajaxSetup': function() {\n    /// <signature>\n    ///   <summary>Set default values for future Ajax requests.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A set of key/value pairs that configure the default Ajax request. All options are optional.</param>\n    /// </signature>\n  },\n  'ajaxTransport': function() {\n    /// <signature>\n    ///   <summary>Creates an object that handles the actual transmission of Ajax data.</summary>\n    ///   <param name=\"dataType\" type=\"String\">A string identifying the data type to use</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to return the new transport object to use with the data type provided in the first argument.</param>\n    /// </signature>\n  },\n  'boxModel': function() {\n    /// <summary>Deprecated in jQuery 1.3 (see jQuery.support). States if the current page, in the user's browser, is being rendered using the W3C CSS Box Model.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'browser': function() {\n    /// <summary>Contains flags for the useragent, read from navigator.userAgent. We recommend against using this property; please try to use feature detection instead (see jQuery.support). jQuery.browser may be moved to a plugin in a future release of jQuery.</summary>\n    /// <returns type=\"PlainObject\" />\n  },\n  'browser.version': function() {\n    /// <summary>The version number of the rendering engine for the user's browser.</summary>\n    /// <returns type=\"String\" />\n  },\n  'Callbacks': function() {\n    /// <signature>\n    ///   <summary>A multi-purpose callbacks list object that provides a powerful way to manage callback lists.</summary>\n    ///   <param name=\"flags\" type=\"String\">An optional list of space-separated flags that change how the callback list behaves.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM element is a descendant of another DOM element.</summary>\n    ///   <param name=\"container\" type=\"Element\">The DOM element that may contain the other element.</param>\n    ///   <param name=\"contained\" type=\"Element\">The DOM element that may be contained by (a descendant of) the other element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'cssHooks': function() {\n    /// <summary>Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <param name=\"key\" type=\"String\">Name of the data stored.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'Deferred': function() {\n    /// <signature>\n    ///   <summary>A constructor function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.</summary>\n    ///   <param name=\"beforeStart\" type=\"Function\">A function that is called just before the constructor returns.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove and execute a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    /// </signature>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties.</summary>\n    ///   <param name=\"collection\" type=\"Object\">The object or array to iterate over.</param>\n    ///   <param name=\"callback(indexInArray, valueOfElement)\" type=\"Function\">The function that will be executed on every object.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Takes a string and throws an exception containing it.</summary>\n    ///   <param name=\"message\" type=\"String\">The message to send out.</param>\n    /// </signature>\n  },\n  'extend': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"target\" type=\"Object\">An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"deep\" type=\"Boolean\">If true, the merge becomes recursive (aka. deep copy).</param>\n    ///   <param name=\"target\" type=\"Object\">The object to extend. It will receive the new properties.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP GET request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getJSON': function() {\n    /// <signature>\n    ///   <summary>Load JSON-encoded data from the server using a GET HTTP request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getScript': function() {\n    /// <signature>\n    ///   <summary>Load a JavaScript file from the server using a GET HTTP request, then execute it.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"success(script, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'globalEval': function() {\n    /// <signature>\n    ///   <summary>Execute some JavaScript code globally.</summary>\n    ///   <param name=\"code\" type=\"String\">The JavaScript code to execute.</param>\n    /// </signature>\n  },\n  'grep': function() {\n    /// <signature>\n    ///   <summary>Finds the elements of an array which satisfy a filter function. The original array is not affected.</summary>\n    ///   <param name=\"array\" type=\"Array\">The array to search through.</param>\n    ///   <param name=\"function(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the item, and the second argument is the index.  The function should return a Boolean value.  this will be the global window object.</param>\n    ///   <param name=\"invert\" type=\"Boolean\">If \"invert\" is false, or not provided, then the function returns an array consisting of all elements for which \"callback\" returns true.  If \"invert\" is true, then the function returns an array consisting of all elements for which \"callback\" returns false.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'hasData': function() {\n    /// <signature>\n    ///   <summary>Determine whether an element has any jQuery data associated with it.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to be checked for data.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'holdReady': function() {\n    /// <signature>\n    ///   <summary>Holds or releases the execution of jQuery's ready event.</summary>\n    ///   <param name=\"hold\" type=\"Boolean\">Indicates whether the ready hold is being requested or released</param>\n    /// </signature>\n  },\n  'inArray': function() {\n    /// <signature>\n    ///   <summary>Search for a specified value within an array and return its index (or -1 if not found).</summary>\n    ///   <param name=\"value\" type=\"Anything\">The value to search for.</param>\n    ///   <param name=\"array\" type=\"Array\">An array through which to search.</param>\n    ///   <param name=\"fromIndex\" type=\"Number\">The index of the array at which to begin the search. The default is 0, which will search the whole array.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'isArray': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is an array.</summary>\n    ///   <param name=\"obj\" type=\"Object\">Object to test whether or not it is an array.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isEmptyObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is empty (contains no enumerable properties).</summary>\n    ///   <param name=\"object\" type=\"Object\">The object that will be checked to see if it's empty.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isFunction': function() {\n    /// <signature>\n    ///   <summary>Determine if the argument passed is a Javascript function object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a function.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isNumeric': function() {\n    /// <signature>\n    ///   <summary>Determines whether its argument is a number.</summary>\n    ///   <param name=\"value\" type=\"PlainObject\">The value to be tested.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isPlainObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is a plain object (created using \"{}\" or \"new Object\").</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">The object that will be checked to see if it's a plain object.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isWindow': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is a window.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a window.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isXMLDoc': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM node is within an XML document (or is an XML document).</summary>\n    ///   <param name=\"node\" type=\"Element\">The DOM node that will be checked to see if it's in an XML document.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'makeArray': function() {\n    /// <signature>\n    ///   <summary>Convert an array-like object into a true JavaScript array.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Any object to turn into a native Array.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array to translate.</param>\n    ///   <param name=\"callback(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"arrayOrObject\" type=\"Object\">The Array or Object to translate.</param>\n    ///   <param name=\"callback( value, indexOrKey )\" type=\"Function\">The function to process each item against.  The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'merge': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two arrays together into the first array.</summary>\n    ///   <param name=\"first\" type=\"Array\">The first array to merge, the elements of second added.</param>\n    ///   <param name=\"second\" type=\"Array\">The second array to merge into the first, unaltered.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'noConflict': function() {\n    /// <signature>\n    ///   <summary>Relinquish jQuery's control of the $ variable.</summary>\n    ///   <param name=\"removeAll\" type=\"Boolean\">A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself).</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'noop': function() {\n    /// <summary>An empty function.</summary>\n  },\n  'now': function() {\n    /// <summary>Return a number representing the current time.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'param': function() {\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <param name=\"traditional\" type=\"Boolean\">A Boolean indicating whether to perform a traditional \"shallow\" serialization.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'parseHTML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an array of DOM nodes.</summary>\n    ///   <param name=\"data\" type=\"String\">HTML string to be parsed</param>\n    ///   <param name=\"context\" type=\"Element\">DOM element to serve as the context in which the HTML fragment will be created</param>\n    ///   <param name=\"keepScripts\" type=\"Boolean\">A Boolean indicating whether to include scripts passed in the HTML string</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'parseJSON': function() {\n    /// <signature>\n    ///   <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>\n    ///   <param name=\"json\" type=\"String\">The JSON string to parse.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'parseXML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an XML document.</summary>\n    ///   <param name=\"data\" type=\"String\">a well-formed XML string to be parsed</param>\n    ///   <returns type=\"XMLDocument\" />\n    /// </signature>\n  },\n  'post': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP POST request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'proxy': function() {\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function referenced in the function argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function named in the name argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element where the array of queued functions is attached.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element on which to add a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback()\" type=\"Function\">The new function to add to the queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove data.</param>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'sub': function() {\n    /// <summary>Creates a new copy of jQuery whose properties and methods can be modified without affecting the original jQuery object.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'support': function() {\n    /// <summary>A collection of properties that represent the presence of different browser features or bugs. Primarily intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'trim': function() {\n    /// <signature>\n    ///   <summary>Remove the whitespace from the beginning and end of a string.</summary>\n    ///   <param name=\"str\" type=\"String\">The string to trim.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'type': function() {\n    /// <signature>\n    ///   <summary>Determine the internal JavaScript [[Class]] of an object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to get the internal JavaScript [[Class]] of.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'unique': function() {\n    /// <signature>\n    ///   <summary>Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array of DOM elements.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'when': function() {\n    /// <signature>\n    ///   <summary>Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.</summary>\n    ///   <param name=\"deferreds\" type=\"Deferred\">One or more Deferred objects, or plain JavaScript objects.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nvar _1228819969 = jQuery.Callbacks;\njQuery.Callbacks = function(flags) {\nvar _object = _1228819969(flags);\nintellisense.annotate(_object, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add a callback or a collection of callbacks to a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be added to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'disable': function() {\n    /// <summary>Disable a callback list from doing anything more.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'disabled': function() {\n    /// <summary>Determine if the callbacks list has been disabled.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'empty': function() {\n    /// <summary>Remove all of the callbacks from a list.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'fire': function() {\n    /// <signature>\n    ///   <summary>Call all of the callbacks with the given arguments</summary>\n    ///   <param name=\"arguments\" type=\"Anything\">The argument or list of arguments to pass back to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'fired': function() {\n    /// <summary>Determine if the callbacks have already been called at least once.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'fireWith': function() {\n    /// <signature>\n    ///   <summary>Call all callbacks in a list with the given context and arguments.</summary>\n    ///   <param name=\"context\" type=\"\">A reference to the context in which the callbacks in the list should be fired.</param>\n    ///   <param name=\"args\" type=\"\">An argument, or array of arguments, to pass to the callbacks in the list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Determine whether a supplied callback is in a list</summary>\n    ///   <param name=\"callback\" type=\"Function\">The callback to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'lock': function() {\n    /// <summary>Lock a callback list in its current state.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'locked': function() {\n    /// <summary>Determine if the callbacks list has been locked.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove a callback or a collection of callbacks from a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be removed from the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _1228819969);\n\nvar _731531622 = jQuery.Deferred;\njQuery.Deferred = function(func) {\nvar _object = _731531622(func);\nintellisense.annotate(_object, {\n  'always': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is either resolved or rejected.</summary>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred is resolved or rejected.</param>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'done': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is resolved.</param>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'fail': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is rejected.</summary>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is rejected.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'isRejected': function() {\n    /// <summary>Determine whether a Deferred object has been rejected.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isResolved': function() {\n    /// <summary>Determine whether a Deferred object has been resolved.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'notify': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'notifyWith': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the progressCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'pipe': function() {\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'progress': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object generates progress notifications.</summary>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred generates progress notifications.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Deferred's Promise object.</summary>\n    ///   <param name=\"target\" type=\"Object\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'reject': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'rejectWith': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the failCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolve': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolveWith': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the doneCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'state': function() {\n    /// <summary>Determine the current state of a Deferred object.</summary>\n    /// <returns type=\"String\" />\n  },\n  'then': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">A function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred notifies progress.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _731531622);\n\nintellisense.annotate(jQuery.Event.prototype, {\n  'currentTarget': function() {\n    /// <summary>The current DOM element within the event bubbling phase.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'data': function() {\n    /// <summary>An optional object of data passed to an event method when the current executing handler is bound.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'delegateTarget': function() {\n    /// <summary>The element where the currently-called jQuery event handler was attached.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'isDefaultPrevented': function() {\n    /// <summary>Returns whether event.preventDefault() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isImmediatePropagationStopped': function() {\n    /// <summary>Returns whether event.stopImmediatePropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isPropagationStopped': function() {\n    /// <summary>Returns whether event.stopPropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'metaKey': function() {\n    /// <summary>Indicates whether the META key was pressed when the event fired.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'namespace': function() {\n    /// <summary>The namespace specified when the event was triggered.</summary>\n    /// <returns type=\"String\" />\n  },\n  'pageX': function() {\n    /// <summary>The mouse position relative to the left edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'pageY': function() {\n    /// <summary>The mouse position relative to the top edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'preventDefault': function() {\n    /// <summary>If this method is called, the default action of the event will not be triggered.</summary>\n  },\n  'relatedTarget': function() {\n    /// <summary>The other DOM element involved in the event, if any.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'result': function() {\n    /// <summary>The last value returned by an event handler that was triggered by this event, unless the value was undefined.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'stopImmediatePropagation': function() {\n    /// <summary>Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree.</summary>\n  },\n  'stopPropagation': function() {\n    /// <summary>Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.</summary>\n  },\n  'target': function() {\n    /// <summary>The DOM element that initiated the event.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'timeStamp': function() {\n    /// <summary>The difference in milliseconds between the time the browser created the event and January 1, 1970.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'type': function() {\n    /// <summary>Describes the nature of the event.</summary>\n    /// <returns type=\"String\" />\n  },\n  'which': function() {\n    /// <summary>For key or mouse events, this property indicates the specific key or button that was pressed.</summary>\n    /// <returns type=\"Number\" />\n  },\n});\n\nintellisense.annotate(jQuery.fn, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"html\" type=\"String\">An HTML fragment to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery object \">An existing jQuery object to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <param name=\"context\" type=\"Element\">The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addBack': function() {\n    /// <signature>\n    ///   <summary>Add the previous set of elements on the stack to the current set, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addClass': function() {\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be added to the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"function(index, currentClass)\" type=\"Function\">A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'after': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxComplete': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete. This is an AjaxEvent.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxError': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxSettings, thrownError)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSend': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed before an Ajax request is sent. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStart': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when the first Ajax request begins. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStop': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when all Ajax requests have completed. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSuccess': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'all': function() {\n    /// <summary>Selects all elements.</summary>\n  },\n  'andSelf': function() {\n    /// <summary>Add the previous set of elements on the stack to the current set.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'animate': function() {\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'animated': function() {\n    /// <summary>Select all elements that are in the progress of an animation at the time the selector is run.</summary>\n  },\n  'append': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'appendTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the end of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attr': function() {\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the attribute.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributes\" type=\"PlainObject\">An object of attribute-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"function(index, attr)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attributeContains': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing the a given substring.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsPrefix': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-).</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsWord': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing a given word, delimited by spaces.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEndsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEquals': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value exactly equal to a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeHas': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute, with any value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    /// </signature>\n  },\n  'attributeMultiple': function() {\n    /// <signature>\n    ///   <summary>Matches elements that match all of the specified attribute filters.</summary>\n    ///   <param name=\"attributeFilter1\" type=\"String\">An attribute filter.</param>\n    ///   <param name=\"attributeFilter2\" type=\"String\">Another attribute filter, reducing the selection even more</param>\n    ///   <param name=\"attributeFilterN\" type=\"String\">As many more attribute filters as necessary</param>\n    /// </signature>\n  },\n  'attributeNotEqual': function() {\n    /// <signature>\n    ///   <summary>Select elements that either don't have the specified attribute, or do have the specified attribute but not with a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeStartsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value beginning exactly with a given string.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'before': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert before each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'bind': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"preventBubble\" type=\"Boolean\">Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"events\" type=\"Object\">An object containing one or more DOM event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'blur': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'button': function() {\n    /// <summary>Selects all button elements and elements of type button.</summary>\n  },\n  'change': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'checkbox': function() {\n    /// <summary>Selects all elements of type checkbox.</summary>\n  },\n  'checked': function() {\n    /// <summary>Matches all elements that are checked.</summary>\n  },\n  'child': function() {\n    /// <signature>\n    ///   <summary>Selects all direct child elements specified by \"child\" of elements specified by \"parent\".</summary>\n    ///   <param name=\"parent\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"child\" type=\"String\">A selector to filter the child elements.</param>\n    /// </signature>\n  },\n  'children': function() {\n    /// <signature>\n    ///   <summary>Get the children of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'class': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given class.</summary>\n    ///   <param name=\"class\" type=\"String\">A class to search for. An element can have multiple classes; only one of them must match.</param>\n    /// </signature>\n  },\n  'clearQueue': function() {\n    /// <signature>\n    ///   <summary>Remove from the queue all items that have not yet been run.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'click': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'clone': function() {\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers should be copied along with the elements. As of jQuery 1.4, element data will be copied as well.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back to false in 1.5.1 and up.</param>\n    ///   <param name=\"deepWithDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'closest': function() {\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <param name=\"context\" type=\"Element\">A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Select all elements that contain the specified text.</summary>\n    ///   <param name=\"text\" type=\"String\">A string of text to look for. It's case sensitive.</param>\n    /// </signature>\n  },\n  'contents': function() {\n    /// <summary>Get the children of each element in the set of matched elements, including text and comment nodes.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'context': function() {\n    /// <summary>The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'css': function() {\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"key\" type=\"String\">A string naming the piece of data to set.</param>\n    ///   <param name=\"value\" type=\"Object\">The new data value; it can be any Javascript type including Array or Object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An object of key-value pairs of data to update.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dblclick': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delay': function() {\n    /// <signature>\n    ///   <summary>Set a timer to delay execution of subsequent items in the queue.</summary>\n    ///   <param name=\"duration\" type=\"Number\">An integer indicating the number of milliseconds to delay execution of the next item in the queue.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delegate': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched elements.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'descendant': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are descendants of a given ancestor.</summary>\n    ///   <param name=\"ancestor\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"descendant\" type=\"String\">A selector to filter the descendant elements.</param>\n    /// </signature>\n  },\n  'detach': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'die': function() {\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or keydown.</param>\n    ///   <param name=\"handler\" type=\"String\">The function that is no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types, such as click or keydown and their corresponding functions that are no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'disabled': function() {\n    /// <summary>Selects all elements that are disabled.</summary>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>Iterate over a jQuery object, executing a function for each matched element.</summary>\n    ///   <param name=\"function(index, Element)\" type=\"Function\">A function to execute for each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'element': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given tag name.</summary>\n    ///   <param name=\"element\" type=\"String\">An element to search for. Refers to the tagName of DOM nodes.</param>\n    /// </signature>\n  },\n  'empty': function() {\n    /// <summary>Select all elements that have no children (including text nodes).</summary>\n  },\n  'enabled': function() {\n    /// <summary>Selects all elements that are enabled.</summary>\n  },\n  'end': function() {\n    /// <summary>End the most recent filtering operation in the current chain and return the set of matched elements to its previous state.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'eq': function() {\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index of the element to match.</param>\n    /// </signature>\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"-index\" type=\"Number\">Zero-based index of the element to match, counting backwards from the last element.</param>\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'even': function() {\n    /// <summary>Selects even elements, zero-indexed.  See also odd.</summary>\n  },\n  'fadeIn': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeOut': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeTo': function() {\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'file': function() {\n    /// <summary>Selects all elements of type file.</summary>\n  },\n  'filter': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'find': function() {\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'finish': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'first': function() {\n    /// <summary>Selects the first matched element.</summary>\n  },\n  'first-child': function() {\n    /// <summary>Selects all elements that are the first child of their parent.</summary>\n  },\n  'first-of-type': function() {\n    /// <summary>Selects all elements that are the first among siblings of the same element name.</summary>\n  },\n  'focus': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusin': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Retrieve the DOM elements matched by the jQuery object.</summary>\n    ///   <param name=\"index\" type=\"Number\">A zero-based integer indicating which element to retrieve.</param>\n    ///   <returns type=\"Element, Array\" />\n    /// </signature>\n  },\n  'gt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index greater than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"contained\" type=\"Element\">A DOM element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hasClass': function() {\n    /// <signature>\n    ///   <summary>Determine whether any of the matched elements are assigned the given class.</summary>\n    ///   <param name=\"className\" type=\"String\">The class name to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'header': function() {\n    /// <summary>Selects all elements that are headers, like h1, h2, h3 and so on.</summary>\n  },\n  'height': function() {\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"function(index, height)\" type=\"Function\">A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hidden': function() {\n    /// <summary>Selects all elements that are hidden.</summary>\n  },\n  'hide': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hover': function() {\n    /// <signature>\n    ///   <summary>Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements.</summary>\n    ///   <param name=\"handlerIn(eventObject)\" type=\"Function\">A function to execute when the mouse pointer enters the element.</param>\n    ///   <param name=\"handlerOut(eventObject)\" type=\"Function\">A function to execute when the mouse pointer leaves the element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'html': function() {\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"htmlString\" type=\"String\">A string of HTML to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, oldhtml)\" type=\"Function\">A function returning the HTML content to set. Receives the           index position of the element in the set and the old HTML value as arguments.           jQuery empties the element before calling the function;           use the oldhtml argument to reference the previous content.           Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'id': function() {\n    /// <signature>\n    ///   <summary>Selects a single element with the given id attribute.</summary>\n    ///   <param name=\"id\" type=\"String\">An ID to search for, specified via the id attribute of an element.</param>\n    /// </signature>\n  },\n  'image': function() {\n    /// <summary>Selects all elements of type image.</summary>\n  },\n  'index': function() {\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector representing a jQuery collection in which to look for an element.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"element\" type=\"jQuery\">The DOM element or first element within the jQuery object to look for.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'init': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'innerHeight': function() {\n    /// <summary>Get the current computed height for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'innerWidth': function() {\n    /// <summary>Get the current computed width for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'input': function() {\n    /// <summary>Selects all input, textarea, select and button elements.</summary>\n  },\n  'insertAfter': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements after the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'insertBefore': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements before the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'is': function() {\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'jquery': function() {\n    /// <summary>A string containing the jQuery version number.</summary>\n    /// <returns type=\"String\" />\n  },\n  'keydown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keypress': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keyup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lang': function() {\n    /// <signature>\n    ///   <summary>Selects all elements of the specified language.</summary>\n    ///   <param name=\"language\" type=\"String\">A language code.</param>\n    /// </signature>\n  },\n  'last': function() {\n    /// <summary>Selects the last matched element.</summary>\n  },\n  'last-child': function() {\n    /// <summary>Selects all elements that are the last child of their parent.</summary>\n  },\n  'last-of-type': function() {\n    /// <summary>Selects all elements that are the last among siblings of the same element name.</summary>\n  },\n  'length': function() {\n    /// <summary>The number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'live': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more JavaScript event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'load': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index less than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Pass each element in the current matched set through a function, producing a new jQuery object containing the return values.</summary>\n    ///   <param name=\"callback(index, domElement)\" type=\"Function\">A function object that will be invoked for each element in the current set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousedown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseenter': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseleave': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousemove': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseover': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'multiple': function() {\n    /// <signature>\n    ///   <summary>Selects the combined results of all the specified selectors.</summary>\n    ///   <param name=\"selector1\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"selector2\" type=\"String\">Another valid selector.</param>\n    ///   <param name=\"selectorN\" type=\"String\">As many more valid selectors as you like.</param>\n    /// </signature>\n  },\n  'next': function() {\n    /// <signature>\n    ///   <summary>Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'next adjacent': function() {\n    /// <signature>\n    ///   <summary>Selects all next elements matching \"next\" that are immediately preceded by a sibling \"prev\".</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"next\" type=\"String\">A selector to match the element that is next to the first selector.</param>\n    /// </signature>\n  },\n  'next siblings': function() {\n    /// <signature>\n    ///   <summary>Selects all sibling elements that follow after the \"prev\" element, have the same parent, and match the filtering \"siblings\" selector.</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"siblings\" type=\"String\">A selector to filter elements that are the following siblings of the first selector.</param>\n    /// </signature>\n  },\n  'nextAll': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nextUntil': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'not': function() {\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more DOM elements to remove from the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nth-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-child(even), :nth-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-of-type(even), :nth-last-of-type(4n) )</param>\n    /// </signature>\n  },\n  'nth-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth child of their parent in relation to siblings with the same element name.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-of-type(even), :nth-of-type(4n) )</param>\n    /// </signature>\n  },\n  'odd': function() {\n    /// <summary>Selects odd elements, zero-indexed.  See also even.</summary>\n  },\n  'off': function() {\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, or just namespaces, such as \"click\", \"keydown.myPlugin\", or \".myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A handler function previously attached for the event(s), or the special value false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offset': function() {\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"coordinates\" type=\"PlainObject\">An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"function(index, coords)\" type=\"Function\">A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offsetParent': function() {\n    /// <summary>Get the closest ancestor element that is positioned.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'on': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'one': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing one or more JavaScript event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'only-child': function() {\n    /// <summary>Selects all elements that are the only child of their parent.</summary>\n  },\n  'only-of-type': function() {\n    /// <summary>Selects all elements that have no siblings with the same element name.</summary>\n  },\n  'outerHeight': function() {\n    /// <signature>\n    ///   <summary>Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without \"px\") representation of the value or null if called on an empty set of elements.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'outerWidth': function() {\n    /// <signature>\n    ///   <summary>Get the current computed width for the first element in the set of matched elements, including padding and border.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'parent': function() {\n    /// <signature>\n    ///   <summary>Get the parent of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parents': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parentsUntil': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'password': function() {\n    /// <summary>Selects all elements of type password.</summary>\n  },\n  'position': function() {\n    /// <summary>Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'prepend': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prependTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the beginning of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prev': function() {\n    /// <signature>\n    ///   <summary>Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevAll': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevUntil': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.</summary>\n    ///   <param name=\"type\" type=\"String\">The type of queue that needs to be observed.</param>\n    ///   <param name=\"target\" type=\"PlainObject\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'prop': function() {\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"value\" type=\"Boolean\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"function(index, oldPropertyValue)\" type=\"Function\">A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'pushStack': function() {\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <param name=\"name\" type=\"String\">The name of a jQuery method that generated the array of elements.</param>\n    ///   <param name=\"arguments\" type=\"Array\">The arguments that were passed in to the jQuery method (for serialization).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback( next )\" type=\"Function\">The new function to add to the queue, with a function to call that will dequeue the next item.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'radio': function() {\n    /// <summary>Selects all  elements of type radio.</summary>\n  },\n  'ready': function() {\n    /// <signature>\n    ///   <summary>Specify a function to execute when the DOM is fully loaded.</summary>\n    ///   <param name=\"handler\" type=\"Function\">A function to execute after the DOM is ready.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeAttr': function() {\n    /// <signature>\n    ///   <summary>Remove an attribute from each element in the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">An attribute to remove; as of version 1.7, it can be a space-separated list of attributes.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeClass': function() {\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be removed from the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, class)\" type=\"Function\">A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"list\" type=\"String\">An array or space-separated string naming the pieces of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeProp': function() {\n    /// <signature>\n    ///   <summary>Remove a property for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceAll': function() {\n    /// <signature>\n    ///   <summary>Replace each target element with the set of matched elements.</summary>\n    ///   <param name=\"target\" type=\"String\">A selector expression indicating which element(s) to replace.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceWith': function() {\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"newContent\" type=\"jQuery\">The content to insert. May be an HTML string, DOM element, or jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns content with which to replace the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'reset': function() {\n    /// <summary>Selects all elements of type reset.</summary>\n  },\n  'resize': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'root': function() {\n    /// <signature>\n    ///   <summary>Selects the element that is the root of the document.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'scroll': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollLeft': function() {\n    /// <signature>\n    ///   <summary>Set the current horizontal position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollTop': function() {\n    /// <signature>\n    ///   <summary>Set the current vertical position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'select': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'selected': function() {\n    /// <summary>Selects all elements that are selected.</summary>\n  },\n  'selector': function() {\n    /// <summary>A selector representing selector originally passed to jQuery().</summary>\n    /// <returns type=\"String\" />\n  },\n  'serialize': function() {\n    /// <summary>Encode a set of form elements as a string for submission.</summary>\n    /// <returns type=\"String\" />\n  },\n  'serializeArray': function() {\n    /// <summary>Encode a set of form elements as an array of names and values.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'show': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'siblings': function() {\n    /// <signature>\n    ///   <summary>Get the siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'size': function() {\n    /// <summary>Return the number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'slice': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to a subset specified by a range of indices.</summary>\n    ///   <param name=\"start\" type=\"Number\">An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set.</param>\n    ///   <param name=\"end\" type=\"Number\">An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideDown': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideUp': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'stop': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'submit': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'target': function() {\n    /// <summary>Selects the target element indicated by the fragment identifier of the document's URI.</summary>\n  },\n  'text': function() {\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"textString\" type=\"String\">A string of text to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"function(index, text)\" type=\"Function\">A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toArray': function() {\n    /// <summary>Retrieve all the DOM elements contained in the jQuery set, as an array.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'toggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"showOrHide\" type=\"Boolean\">A Boolean indicating whether to show or hide the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toggleClass': function() {\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"function(index, class, switch)\" type=\"Function\">A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'trigger': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"PlainObject\">Additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"event\" type=\"Event\">A jQuery.Event object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'triggerHandler': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers attached to an element for an event.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"Array\">An array of additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'unbind': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">The function that is to be no longer executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"false\" type=\"Boolean\">Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"event\" type=\"Object\">A JavaScript event object as passed to an event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'undelegate': function() {\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">An object of one or more event types and previously bound functions to unbind from them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"namespace\" type=\"String\">A string containing a namespace to unbind all events from.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unload': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">A plain object of data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unwrap': function() {\n    /// <summary>Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'val': function() {\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Array\">A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'visible': function() {\n    /// <summary>Selects all elements that are visible.</summary>\n  },\n  'width': function() {\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, width)\" type=\"Function\">A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrap': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapAll': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around all elements in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapInner': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"String\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\nintellisense.annotate(window, {\n  '$': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * jQuery JavaScript Library v1.10.2\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:48Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// Support: IE<10\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.10.2\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler\n\tcompleted = function( event ) {\n\n\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\t\tdetach();\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\t// Clean-up method for dom ready events\n\tdetach = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t\t} else {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\t\twindow.detachEvent( \"onload\", completed );\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( jQuery.support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn core_hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.10.2\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\n\t\t});\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val === undefined ?\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull :\n\t\tval;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function( support ) {\n\n\tvar all, a, input, select, fragment, opt, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Finish early in limited (non-browser) environments\n\tall = div.getElementsByTagName(\"*\") || [];\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !a || !a.style || !all.length ) {\n\t\treturn support;\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName(\"tbody\").length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName(\"link\").length;\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Make sure that element opacity exists\n\t// (IE uses filter instead)\n\t// Use a regex to work around a WebKit issue. See #5145\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!a.style.cssFloat;\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone = document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Will be defined later\n\tsupport.inlineBlockNeedsLayout = false;\n\tsupport.shrinkWrapBlocks = false;\n\tsupport.pixelPosition = false;\n\tsupport.deleteExpando = true;\n\tsupport.noCloneEvent = true;\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: IE<9\n\t// Iteration over object's inherited properties before its own.\n\tfor ( i in jQuery( support ) ) {\n\t\tbreak;\n\t}\n\tsupport.ownLast = i !== \"0\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior.\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t\t// Support: IE<8\n\t\t\t\tbody.style.zoom = 1;\n\t\t\t}\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})({});\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"applet\": true,\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\tdata = null,\n\t\t\ti = 0,\n\t\t\telem = this[0];\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf(\"data-\") === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar ret, hooks, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Use proper attribute retrieval(#6932, #12072)\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\telem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\t\tret = isXML ?\n\t\t\t\t\tundefined :\n\t\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\t\tnull;\n\t\t\tjQuery.expr.attrHandle[ name ] = fn;\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\tjQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =\n\t\t// Some attributes are constructed with empty-string values when not defined\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\t(ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t};\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ret.specified ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tcur = ret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\nvar iframe, getStyles, curCSS,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar len, styles,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Otherwise expose jQuery to the global object as usual\n\twindow.jQuery = window.$ = jQuery;\n\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n})( window );\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/modernizr-2.6.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton; http://www.modernizr.com/license/\n *\n * Includes matchMedia polyfill; Copyright (c) 2010 Filament Group, Inc; http://opensource.org/licenses/MIT\n *\n * Includes material adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js; Copyright 2009-2012 by contributors; http://opensource.org/licenses/MIT\n *\n * Includes material from css-support; Copyright (c) 2005-2012 Diego Perini; https://github.com/dperini/css-support/blob/master/LICENSE\n *\n * NUGET: END LICENSE TEXT */\n\n/*!\n * Modernizr v2.6.2\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.6.2',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node, docOverflow,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body || document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style id=\"s', mod, '\">', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = '';\n          //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n          fakeBody.style.overflow = 'hidden';\n          docOverflow = docElement.style.overflow;\n          docElement.style.overflow = 'hidden';\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      if ( !body ) {\n          fakeBody.parentNode.removeChild(fakeBody);\n          docElement.style.overflow = docOverflow;\n      } else {\n          div.parentNode.removeChild(div);\n      }\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq).matches;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProp = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n\n        if (typeof target != \"function\") {\n            throw new TypeError();\n        }\n\n        var args = slice.call(arguments, 1),\n            bound = function () {\n\n            if (this instanceof bound) {\n\n              var F = function(){};\n              F.prototype = target.prototype;\n              var self = new F();\n\n              var result = target.apply(\n                  self,\n                  args.concat(slice.call(arguments))\n              );\n              if (Object(result) === result) {\n                  return result;\n              }\n              return self;\n\n            } else {\n\n              return target.apply(\n                  that,\n                  args.concat(slice.call(arguments))\n              );\n\n            }\n\n        };\n\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    // Because the testing of the CSS property names (with \"-\", as\n    // opposed to the camelCase DOM properties) is non-portable and\n    // non-standard but works in WebKit and IE (but not Gecko or Opera),\n    // we explicitly reject properties with dashes so that authors\n    // developing in WebKit or IE first don't end up with\n    // browser-specific content by accident.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            var prop = props[i];\n            if ( !contains(prop, \"-\") && mStyle[prop] !== undefined ) {\n                return prefixed == 'pfx' ? prop : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexWrap');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return (/(url\\s*\\(.*?){3}/).test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return (/^0.55$/).test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   daneden.me/2011/12/putting-up-with-androids-bullshit/\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1) +\n             // standard syntax             // trailing 'background-image:'\n              prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.getElementById('smodernizr'),\n              sheet = style.sheet || style.styleSheet,\n              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:\"',smile,'\";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 3;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProp(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProp( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (typeof enableClasses !== \"undefined\" && enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n    ;(function(window, document) {\n    /*jshint evil:true */\n      /** Preset options */\n      var options = window.html5 || {};\n\n      /** Used to skip problem elements */\n      var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n      /** Not all elements can be cloned in IE **/\n      var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n      /** Detect whether the browser supports default html5 styles */\n      var supportsHtml5Styles;\n\n      /** Name of the expando, to work with multiple documents or to re-shiv one document */\n      var expando = '_html5shiv';\n\n      /** The id for the the documents expando */\n      var expanID = 0;\n\n      /** Cached data for each document */\n      var expandoData = {};\n\n      /** Detect whether the browser supports unknown elements */\n      var supportsUnknownElements;\n\n      (function() {\n        try {\n            var a = document.createElement('a');\n            a.innerHTML = '<xyz></xyz>';\n            //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n            supportsHtml5Styles = ('hidden' in a);\n\n            supportsUnknownElements = a.childNodes.length == 1 || (function() {\n              // assign a false positive if unable to shiv\n              (document.createElement)('a');\n              var frag = document.createDocumentFragment();\n              return (\n                typeof frag.cloneNode == 'undefined' ||\n                typeof frag.createDocumentFragment == 'undefined' ||\n                typeof frag.createElement == 'undefined'\n              );\n            }());\n        } catch(e) {\n          supportsHtml5Styles = true;\n          supportsUnknownElements = true;\n        }\n\n      }());\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n\n        /**\n       * Returns the data associated to the given document\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @returns {Object} An object of data.\n       */\n      function getExpandoData(ownerDocument) {\n        var data = expandoData[ownerDocument[expando]];\n        if (!data) {\n            data = {};\n            expanID++;\n            ownerDocument[expando] = expanID;\n            expandoData[expanID] = data;\n        }\n        return data;\n      }\n\n      /**\n       * returns a shived element for the given nodeName and document\n       * @memberOf html5\n       * @param {String} nodeName name of the element\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived element.\n       */\n      function createElement(nodeName, ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createElement(nodeName);\n        }\n        if (!data) {\n            data = getExpandoData(ownerDocument);\n        }\n        var node;\n\n        if (data.cache[nodeName]) {\n            node = data.cache[nodeName].cloneNode();\n        } else if (saveClones.test(nodeName)) {\n            node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n        } else {\n            node = data.createElem(nodeName);\n        }\n\n        // Avoid adding some elements to fragments in IE < 9 because\n        // * Attributes like `name` or `type` cannot be set/changed once an element\n        //   is inserted into a document/fragment\n        // * Link elements with `src` attributes that are inaccessible, as with\n        //   a 403 response, will cause the tab/window to crash\n        // * Script elements appended to fragments will execute when their `src`\n        //   or `text` property is set\n        return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;\n      }\n\n      /**\n       * returns a shived DocumentFragment for the given document\n       * @memberOf html5\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived DocumentFragment.\n       */\n      function createDocumentFragment(ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createDocumentFragment();\n        }\n        data = data || getExpandoData(ownerDocument);\n        var clone = data.frag.cloneNode(),\n            i = 0,\n            elems = getElements(),\n            l = elems.length;\n        for(;i<l;i++){\n            clone.createElement(elems[i]);\n        }\n        return clone;\n      }\n\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       * @param {Object} data of the document.\n       */\n      function shivMethods(ownerDocument, data) {\n        if (!data.cache) {\n            data.cache = {};\n            data.createElem = ownerDocument.createElement;\n            data.createFrag = ownerDocument.createDocumentFragment;\n            data.frag = data.createFrag();\n        }\n\n\n        ownerDocument.createElement = function(nodeName) {\n          //abort shiv\n          if (!html5.shivMethods) {\n              return data.createElem(nodeName);\n          }\n          return createElement(nodeName, ownerDocument, data);\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n          'var n=f.cloneNode(),c=n.createElement;' +\n          'h.shivMethods&&(' +\n            // unroll the `createElement` calls\n            getElements().join().replace(/\\w+/g, function(nodeName) {\n              data.createElem(nodeName);\n              data.frag.createElement(nodeName);\n              return 'c(\"' + nodeName + '\")';\n            }) +\n          ');return n}'\n        )(html5, data.frag);\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n      function shivDocument(ownerDocument) {\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        var data = getExpandoData(ownerDocument);\n\n        if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n          data.hasCSS = !!addStyleSheet(ownerDocument,\n            // corrects block display not defined in IE6/7/8/9\n            'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +\n            // adds styling not present in IE6/7/8/9\n            'mark{background:#FF0;color:#000}'\n          );\n        }\n        if (!supportsUnknownElements) {\n          shivMethods(ownerDocument, data);\n        }\n        return ownerDocument;\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n      var html5 = {\n\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': (options.shivCSS !== false),\n\n        /**\n         * Is equal to true if a browser supports creating unknown/HTML5 elements\n         * @memberOf html5\n         * @type boolean\n         */\n        'supportsUnknownElements': supportsUnknownElements,\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': (options.shivMethods !== false),\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument,\n\n        //creates a shived element\n        createElement: createElement,\n\n        //creates a shived documentFragment\n        createDocumentFragment: createDocumentFragment\n      };\n\n      /*--------------------------------------------------------------------------*/\n\n      // expose html5\n      window.html5 = html5;\n\n      // shiv the document\n      shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Scripts/respond.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\nwindow.matchMedia = window.matchMedia || (function(doc, undefined){\n  \n  var bool,\n      docElem  = doc.documentElement,\n      refNode  = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement('body'),\n      div      = doc.createElement('div');\n  \n  div.id = 'mq-test-1';\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n  \n  return function(q){\n    \n    div.innerHTML = '&shy;<style media=\"'+q+'\"> #mq-test-1 { width: 42px; }</style>';\n    \n    docElem.insertBefore(fakeBody, refNode);\n    bool = div.offsetWidth == 42;  \n    docElem.removeChild(fakeBody);\n    \n    return { matches: bool, media: q };\n  };\n  \n})(document);\n\n\n\n\n/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\t//exposed namespace\n\twin.respond\t\t= {};\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update\t= function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){ return; }\n\t\n\t//define vars\n\tvar doc \t\t\t= win.document,\n\t\tdocElem \t\t= doc.documentElement,\n\t\tmediastyles\t\t= [],\n\t\trules\t\t\t= [],\n\t\tappendedEls \t= [],\n\t\tparsedSheets \t= {},\n\t\tresizeThrottle\t= 30,\n\t\thead \t\t\t= doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase\t\t\t= doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks\t\t\t= head.getElementsByTagName( \"link\" ),\n\t\trequestQueue\t= [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS\t\t\t= function(){\n\t\t\tvar sheets \t= links,\n\t\t\t\tsl \t\t= sheets.length,\n\t\t\t\ti\t\t= 0,\n\t\t\t\t//vars for loop:\n\t\t\t\tsheet, href, media, isCSS;\n\n\t\t\tfor( ; i < sl; i++ ){\n\t\t\t\tsheet\t= sheets[ i ],\n\t\t\t\thref\t= sheet.href,\n\t\t\t\tmedia\t= sheet.media,\n\t\t\t\tisCSS\t= sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base)\n\t\t\t\t\t\t\t|| href.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\t\t\t\t\tmakeRequests();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate\t\t\t= function( styles, href, media ){\n\t\t\tvar qs\t\t\t= styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql\t\t\t= qs && qs.length || 0,\n\t\t\t\t//try to get CSS path\n\t\t\t\thref\t\t= href.substring( 0, href.lastIndexOf( \"/\" )),\n\t\t\t\trepUrls\t\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia\t= !ql && media,\n\t\t\t\t//vars used in loop\n\t\t\t\ti\t\t\t= 0,\n\t\t\t\tj, fullq, thisq, eachq, eql;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\t\t\t\n\n\t\t\tfor( ; i < ql; i++ ){\n\t\t\t\tj\t= 0;\n\t\t\t\t\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq\t= qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq\t= fullq.split( \",\" );\n\t\t\t\teql\t\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( ; j < eql; j++ ){\n\t\t\t\t\tthisq\t= eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia\t: thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules\t: rules.length - 1,\n\t\t\t\t\t\thasquery: thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw\t: thisq.match( /\\(min\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw\t: thisq.match( /\\(max\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \t\n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue\t\t= function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia\t\t\t= function( fromResize ){\n\t\t\tvar name\t\t= \"clientWidth\",\n\t\t\t\tdocElemProp\t= docElem[ name ],\n\t\t\t\tcurrWidth \t= doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink\t= links[ links.length-1 ],\n\t\t\t\tnow \t\t= (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\tclearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall\t= now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\tminnull = min === null,\n\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\tem = \"em\";\n\t\t\t\t\n\t\t\t\tif( !!min ){\n\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\tif( !!max ){\n\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var i in appendedEls ){\n\t\t\t\tif( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){\n\t\t\t\t\thead.removeChild( appendedEls[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var i in styleBlocks ){\n\t\t\t\tvar ss\t\t= doc.createElement( \"style\" ),\n\t\t\t\t\tcss\t\t= styleBlocks[ i ].join( \"\\n\" );\n\t\t\t\t\n\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\tss.media\t= i;\n\t\t\t\t\n\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\n\t\t\t\tif ( ss.styleSheet ){ \n\t\t        \tss.styleSheet.cssText = css;\n\t\t        } \n\t\t        else {\n\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t        }\n\t\t        \n\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\tappendedEls.push( ss );\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState != 4 || req.status != 200 && req.status != 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t}\n\t\t\tif ( req.readyState == 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx",
    "content": "﻿<%@ Page Title=\"Sign Up\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"SignUp.aspx.cs\" Inherits=\"ProductLaunch.Web.SignUp\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Sign me up!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Just a few details</h2>\n        </div>\n    </div>\n\n    <div class=\"form-group\">\n        <label for=\"txtFirstName\">First Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtFirstName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtLastName\">Last Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtLastName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtEmail\">Email Address</label>\n        <asp:TextBox class=\"form-control\" id=\"txtEmail\" runat=\"server\" />\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlCountry\">Country</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlCountry\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtCompanyName\">Company Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtCompanyName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlRole\">Your Main Role</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlRole\" runat=\"server\" />\n    </div>\n\n    <asp:Button class=\"btn btn-default\" runat=\"server\" Text=\"Go!\" ID=\"btnGo\" OnClick=\"btnGo_Click\" />\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing ProductLaunch.Model;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SignUp : Page\n    {\n        private static Dictionary<string, Country> _Countries;\n        private static Dictionary<string, Role> _Roles;\n\n        public static void PreloadStaticDataCache()\n        {\n            _Countries = new Dictionary<string, Country>();\n            _Roles = new Dictionary<string, Role>();\n            using (var context = new ProductLaunchContext())\n            {\n                foreach (var country in context.Countries.OrderBy(x => x.CountryName))\n                {\n                    _Countries[country.CountryCode] = country;\n                }\n                foreach (var role in context.Roles.OrderBy(x => x.RoleName))\n                {\n                    _Roles[role.RoleCode] = role;\n                }\n            }\n        }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            if (!Page.IsPostBack)\n            {\n                PopulateRoles();\n                PopulateCountries();\n            }\n        }\n\n        private void PopulateRoles()\n        {\n            ddlRole.Items.Clear();\n            ddlRole.Items.AddRange(_Roles.Select(x => new ListItem(x.Value.RoleName, x.Key)).ToArray()); \n        }\n\n        private void PopulateCountries()\n        {\n            ddlCountry.Items.Clear();\n            ddlCountry.Items.AddRange(_Countries.Select(x => new ListItem(x.Value.CountryName, x.Key)).ToArray());\n        }\n\n        protected void btnGo_Click(object sender, EventArgs e)\n        {\n            var country = _Countries[ddlCountry.SelectedValue];\n            var role = _Roles[ddlRole.SelectedValue];\n\n            var prospect = new Prospect\n            {\n                CompanyName = txtCompanyName.Text,\n                EmailAddress = txtEmail.Text,\n                FirstName = txtFirstName.Text,\n                LastName = txtLastName.Text,\n                Country = country,\n                Role = role\n            };\n\n            var eventMessage = new ProspectSignedUpEvent\n            {\n                Prospect = prospect,\n                SignedUpAt = DateTime.UtcNow\n            };\n\n            MessageQueue.Publish(eventMessage);\n\n            Server.Transfer(\"ThankYou.aspx\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SignUp {\n        \n        /// <summary>\n        /// txtFirstName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtFirstName;\n        \n        /// <summary>\n        /// txtLastName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtLastName;\n        \n        /// <summary>\n        /// txtEmail control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtEmail;\n        \n        /// <summary>\n        /// ddlCountry control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlCountry;\n        \n        /// <summary>\n        /// txtCompanyName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtCompanyName;\n        \n        /// <summary>\n        /// ddlRole control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlRole;\n        \n        /// <summary>\n        /// btnGo control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.Button btnGo;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Site.Master",
    "content": "﻿<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.master.cs\" Inherits=\"ProductLaunch.Web.SiteMaster\" %>\n\n<!DOCTYPE html>\n\n<html lang=\"en\">\n<head runat=\"server\">\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title><%: Page.Title %></title>\n\n    <asp:PlaceHolder runat=\"server\">\n        <%: Scripts.Render(\"~/bundles/modernizr\") %>\n    </asp:PlaceHolder>\n\n    <webopt:bundlereference runat=\"server\" path=\"~/Content/css\" />\n    <link href=\"~/favicon.ico\" rel=\"shortcut icon\" type=\"image/x-icon\" />\n\n</head>\n<body>\n    <form runat=\"server\">\n        <asp:ScriptManager runat=\"server\">\n            <Scripts>\n                <%--To learn more about bundling scripts in ScriptManager see http://go.microsoft.com/fwlink/?LinkID=301884 --%>\n                <%--Framework Scripts--%>\n                <asp:ScriptReference Name=\"MsAjaxBundle\" />\n                <asp:ScriptReference Name=\"jquery\" />\n                <asp:ScriptReference Name=\"bootstrap\" />\n                <asp:ScriptReference Name=\"respond\" />\n                <asp:ScriptReference Name=\"WebForms.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebForms.js\" />\n                <asp:ScriptReference Name=\"WebUIValidation.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebUIValidation.js\" />\n                <asp:ScriptReference Name=\"MenuStandards.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/MenuStandards.js\" />\n                <asp:ScriptReference Name=\"GridView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/GridView.js\" />\n                <asp:ScriptReference Name=\"DetailsView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/DetailsView.js\" />\n                <asp:ScriptReference Name=\"TreeView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/TreeView.js\" />\n                <asp:ScriptReference Name=\"WebParts.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebParts.js\" />\n                <asp:ScriptReference Name=\"Focus.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/Focus.js\" />\n                <asp:ScriptReference Name=\"WebFormsBundle\" />\n                <%--Site Scripts--%>\n            </Scripts>\n        </asp:ScriptManager>\n\n        <div class=\"container body-content\">\n            <asp:ContentPlaceHolder ID=\"MainContent\" runat=\"server\">\n            </asp:ContentPlaceHolder>\n            <hr />\n            <footer>\n                <p>&copy; <%: DateTime.Now.Year %> - Company, Inc.</p>\n            </footer>\n        </div>\n\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Site.Master.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SiteMaster : MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Site.Master.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SiteMaster {\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master",
    "content": "<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.Mobile.master.cs\" Inherits=\"ProductLaunch.Web.Site_Mobile\" %>\n<%@ Register Src=\"~/ViewSwitcher.ascx\" TagPrefix=\"friendlyUrls\" TagName=\"ViewSwitcher\" %>\n\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head runat=\"server\">\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title></title>\n    <asp:ContentPlaceHolder runat=\"server\" ID=\"HeadContent\" />\n</head>\n<body>\n    <form id=\"form1\" runat=\"server\">\n    <div>\n        <h1>Mobile Master Page</h1>\n        <asp:ContentPlaceHolder runat=\"server\" ID=\"FeaturedContent\" />\n        <section class=\"content-wrapper main-content clear-fix\">\n            <asp:ContentPlaceHolder runat=\"server\" ID=\"MainContent\" />\n        </section>\n        <friendlyUrls:ViewSwitcher runat=\"server\" />\n    </div>\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Site_Mobile : System.Web.UI.MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class Site_Mobile {\n        \n        /// <summary>\n        /// HeadContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder HeadContent;\n        \n        /// <summary>\n        /// form1 control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.HtmlControls.HtmlForm form1;\n        \n        /// <summary>\n        /// FeaturedContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder FeaturedContent;\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx",
    "content": "﻿<%@ Page Title=\"Ta\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" CodeBehind=\"ThankYou.aspx.cs\" Inherits=\"ProductLaunch.Web.ThankYou\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Thank you!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Good work on signing up. We'll be in touch.</h2>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ThankYou : System.Web.UI.Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ThankYou {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx",
    "content": "<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"ViewSwitcher.ascx.cs\" Inherits=\"ProductLaunch.Web.ViewSwitcher\" %>\n<div id=\"viewSwitcher\">\n    <%: CurrentView %> view | <a href=\"<%: SwitchUrl %>\" data-ajax=\"false\">Switch to <%: AlternateView %></a>\n</div>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Routing;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\nusing Microsoft.AspNet.FriendlyUrls.Resolvers;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ViewSwitcher : System.Web.UI.UserControl\n    {\n        protected string CurrentView { get; private set; }\n\n        protected string AlternateView { get; private set; }\n\n        protected string SwitchUrl { get; private set; }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            // Determine current view\n            var isMobile = WebFormsFriendlyUrlResolver.IsMobileView(new HttpContextWrapper(Context));\n            CurrentView = isMobile ? \"Mobile\" : \"Desktop\";\n\n            // Determine alternate view\n            AlternateView = isMobile ? \"Desktop\" : \"Mobile\";\n\n            // Create switch URL from the route, e.g. ~/__FriendlyUrls_SwitchView/Mobile?ReturnUrl=/Page\n            var switchViewRouteName = \"AspNet.FriendlyUrls.SwitchView\";\n            var switchViewRoute = RouteTable.Routes[switchViewRouteName];\n            if (switchViewRoute == null)\n            {\n                // Friendly URLs is not enabled or the name of the switch view route is out of sync\n                this.Visible = false;\n                return;\n            }\n            var url = GetRouteUrl(switchViewRouteName, new { view = AlternateView, __FriendlyUrls_SwitchViews = true });\n            url += \"?ReturnUrl=\" + HttpUtility.UrlEncode(Request.RawUrl);\n            SwitchUrl = url;\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ViewSwitcher {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\" />\n    <customErrors mode=\"Off\"/>\n    <httpRuntime targetFramework=\"4.5.2\" />\n    <pages>\n      <namespaces>\n        <add namespace=\"System.Web.Optimization\" />\n      </namespaces>\n      <controls>\n        <add assembly=\"Microsoft.AspNet.Web.Optimization.WebForms\" namespace=\"Microsoft.AspNet.Web.Optimization.WebForms\" tagPrefix=\"webopt\" />\n      </controls>\n    </pages>     \n  </system.web>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"WebGrease\" culture=\"neutral\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.5.2.14234\" newVersion=\"1.5.2.14234\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\" />\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.Web/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Antlr\" version=\"3.4.1.9004\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.bootstrap\" version=\"3.0.0\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"bootstrap\" version=\"3.4.1\" targetFramework=\"net452\" />\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls.Core\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.MSAjax\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.WebForms\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization.WebForms\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.Web.Infrastructure\" version=\"1.0.0.0\" targetFramework=\"net452\" />\n  <package id=\"Modernizr\" version=\"2.6.2\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n  <package id=\"Respond\" version=\"1.2.0\" targetFramework=\"net452\" />\n  <package id=\"WebGrease\" version=\"1.5.2\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/ProductLaunch.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Web\", \"ProductLaunch.Web\\ProductLaunch.Web.csproj\", \"{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model\", \"ProductLaunch.Model\\ProductLaunch.Model.csproj\", \"{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Entities\", \"ProductLaunch.Entities\\ProductLaunch.Entities.csproj\", \"{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tests\", \"Tests\", \"{4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model.Tests\", \"ProductLaunch.Model.Tests\\ProductLaunch.Model.Tests.csproj\", \"{49FD06C3-CD52-425A-866D-831D09268CD0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.MessageHandlers.SaveProspect\", \"ProductLaunch.MessageHandlers.SaveProspect\\ProductLaunch.MessageHandlers.SaveProspect.csproj\", \"{65089C80-27F1-4744-979B-4C5A33B0CFF6}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Messaging\", \"ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\", \"{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"MessageHandlers\", \"MessageHandlers\", \"{C7DDB104-252C-499C-A144-242DCC2CF946}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.EndToEndTests\", \"ProductLaunch.EndToEndTests\\ProductLaunch.EndToEndTests.csproj\", \"{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6} = {C7DDB104-252C-499C-A144-242DCC2CF946}\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/ProductLaunch/build.ps1",
    "content": "$nuGetPath = \"C:\\Chocolatey\\bin\\nuget.bat\"\n$msBuildPath = \"C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe\"\n\ncd c:\\src\n& $nuGetPath restore .\\ProductLaunch.sln\n\n# publush web app:\n& $msBuildPath .\\ProductLaunch.Web\\ProductLaunch.Web.csproj /p:OutputPath=c:\\out\\web\\ProductLaunchWeb /p:DeployOnBuild=true /p:VSToolsPath=C:\\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\\tools\\VSToolsPath\n\n# publish message handler:\n& $msBuildPath .\\ProductLaunch.MessageHandlers.SaveProspect\\ProductLaunch.MessageHandlers.SaveProspect.csproj /p:OutputPath=c:\\out\\save-prospect\\SaveProspectHandler\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/build.ps1",
    "content": "\ndocker build `\n -t dockersamples/modernize-aspnet-builder `\n $pwd\\docker\\builder\n\ndocker run --rm `\n -v $pwd\\ProductLaunch:c:\\src `\n -v $pwd\\docker:c:\\out `\n dockersamples/modernize-aspnet-builder `\n C:\\src\\build.ps1 \n\ndocker build `\n -t dockersamples/modernize-aspnet-web:v2 `\n $pwd\\docker\\web\n\n docker build `\n -t dockersamples/modernize-aspnet-handler:v2 `\n $pwd\\docker\\save-prospect"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/docker/builder/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 14.0.25420.1 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force; `\n    Install-Package -Name webdeploy -RequiredVersion 3.5.2 -Force\n\nRUN Install-Package -Name nuget.commandline -RequiredVersion 3.4.3 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install MSBuild.Microsoft.VisualStudio.Web.targets -Version 14.0.0.3\n\nENTRYPOINT [\"powershell\"]"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/docker/save-prospect/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\n\nWORKDIR /save-prospect-handler\nENV MESSAGE_QUEUE_URL=\"nats://message-queue:4222\"\nENTRYPOINT [\"C:\\\\save-prospect-handler\\\\ProductLaunch.MessageHandlers.SaveProspect.exe\"]\n\nCOPY SaveProspectHandler ."
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/docker/web/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\nRUN Add-WindowsFeature Web-server, NET-Framework-45-ASPNET, Web-Asp-Net45; `\n    Remove-Website -Name 'Default Web Site'    \n\nRUN New-Item -Path 'C:\\web-app' -Type Directory; `\n    New-Website -Name 'web-app' -PhysicalPath 'C:\\web-app' -Port 80 -Force\n\nEXPOSE 80\nENV MESSAGE_QUEUE_URL=\"nats://message-queue:4222\"\n\nWORKDIR C://\nADD https://github.com/Microsoft/iis-docker/raw/master/windowsservercore/ServiceMonitor.exe ./ServiceMonitor.exe\nCOPY bootstrap.ps1 .\nENTRYPOINT [\"powershell\", \"./bootstrap.ps1\"]\n\nCOPY ProductLaunchWeb/_PublishedWebsites/ProductLaunch.Web /web-app\n\nHEALTHCHECK CMD powershell -command `\n    try { `\n     $response = iwr http://localhost:80 -UseBasicParsing; `\n     if ($response.StatusCode -eq 200) { return 0} `\n     else {return 1}; `\n    } catch { return 1 }"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/docker/web/bootstrap.ps1",
    "content": "Write-Output 'Bootstrap starting'\n\n# copy process-level environment variables (from `docker run`) machine-wide\nforeach($key in [System.Environment]::GetEnvironmentVariables('Process').Keys) {\n    if ([System.Environment]::GetEnvironmentVariable($key, 'Machine') -eq $null) {\n        $value = [System.Environment]::GetEnvironmentVariable($key, 'Process')\n        [System.Environment]::SetEnvironmentVariable($key, $value, 'Machine')\n        Write-Output \"Set environment variable: $key\"\n    }\n}\n\nWrite-Output 'Running ServiceMonitor'\n& C:\\ServiceMonitor.exe w3svc"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v2-src/docker-compose.yml",
    "content": "version: '2'\n\nservices:\n  \n  product-launch-db:\n    image: microsoft/mssql-server-windows-express\n    ports:\n      - \"1433:1433\"\n    environment: \n      - ACCEPT_EULA=Y\n      - sa_password=d0ck3r_Labs!\n    networks:\n      - app-net\n\n  message-queue:\n    image: nats:windowsservercore\n    ports:\n      - \"4222:4222\"\n    networks:\n      - app-net\n\n  product-launch-web:\n    image: dockersamples/modernize-aspnet-web:v2\n    ports:\n      - \"80:80\"\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\n    depends_on:\n      - product-launch-db\n      - message-queue\n    networks:\n      - app-net\n\n  save-prospect-handler:\n    image: dockersamples/modernize-aspnet-handler:v2\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\n    depends_on:\n      - product-launch-db\n      - message-queue\n    networks:\n      - app-net\n\nnetworks:\n  app-net:\n    external: \n     name: nat"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Core/Env.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Core\n{\n    public class Env\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string DbConnectionString { get { return Get(\"DB_CONNECTION_STRING\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable);\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Core/ProductLaunch.Core.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{35BD1196-DDCB-41FA-98C5-C8116D749446}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Core</RootNamespace>\n    <AssemblyName>ProductLaunch.Core</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Env.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Core/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Core\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Core\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"35bd1196-ddcb-41fa-98c5-c8116d749446\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.EndToEndTests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <section name=\"specFlow\" type=\"TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow\" />\n  </configSections>\n  <specFlow>\n    <unitTestProvider name=\"MsTest\" />\n  </specFlow>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.EndToEndTests/ProductLaunch.EndToEndTests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.EndToEndTests</RootNamespace>\n    <AssemblyName>ProductLaunch.EndToEndTests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"TechTalk.SpecFlow, Version=2.1.0.0, Culture=neutral, PublicKeyToken=0778194805d6db41, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\SpecFlow.2.1.0\\lib\\net45\\TechTalk.SpecFlow.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.WebDriver.3.0.1\\lib\\net40\\WebDriver.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"WebDriver.Support, Version=3.0.1.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Selenium.Support.3.0.1\\lib\\net40\\WebDriver.Support.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\" />\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"ProspectSignUp.feature.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>ProspectSignUp.feature</DependentUpon>\n    </Compile>\n    <Compile Include=\"ProspectSignUpSteps.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"packages.config\" />\n    <None Include=\"ProspectSignUp.feature\">\n      <Generator>SpecFlowSingleFileGenerator</Generator>\n      <LastGenOutput>ProspectSignUp.feature.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets\" Condition=\"Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Selenium.Firefox.WebDriver.0.13.0\\build\\Selenium.Firefox.WebDriver.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.EndToEndTests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.EndToEndTests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"d47cf813-de0e-4cc4-b9ed-8ee4b6f14869\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature",
    "content": "﻿Feature: Prospect Sign Up\n\tAs a prospect interested in the product launch\n\tI want to sign up for notifications\n\tSo that I can be updated with news\n\nScenario Outline: Sign Up with Valid Details\n\tGiven I browse to the Sign Up Page at \"172.31.114.254\"\n\tAnd I enter details '<FirstName>' '<LastName>' '<EmailAddress>' '<CompanyName>' '<Country>' '<Role>'\n\tWhen I press Go\n\tThen I should see the Thank You page\n\nExamples:\n\t| FirstName | LastName | EmailAddress           | CompanyName   | Country        | Role           |\n\t| Prospect  | A        | a.prospect@company.com | Company, Inc. | United States  | Decision Maker |\n\t| Prospect  | B        | b.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | C        | c.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | D        | d.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | E        | e.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | F        | f.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | G        | g.prospect@company.com | Company, Inc. | United States  | Engineer       |\n\t| Prospect  | H        | h.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | I        | i.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | J        | j.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | K        | k.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | L        | l.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | M        | m.prospect@company.com | Company, Inc. | Sweden         | Architect      |\n\t| Prospect  | N        | n.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | O        | o.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | P        | p.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | Q        | q.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | R        | r.prospect@company.com | Company, Inc. | United Kingdom | IT Ops         |\n\t| Prospect  | S        | s.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | T        | t.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | U        | u.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | V        | v.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |\n\t| Prospect  | W        | w.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | X        | x.prospect@company.com | Company, Inc. | United Kingdom | Decision Maker |\n\t| Prospect  | Y        | y.prospect@company.com | Company, Inc. | United States  | Architect      |\n\t| Prospect  | Z        | z.prospect@other.com   | Other, Inc.   | Sweden         | Decision Maker |"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUp.feature.cs",
    "content": "﻿// ------------------------------------------------------------------------------\n//  <auto-generated>\n//      This code was generated by SpecFlow (http://www.specflow.org/).\n//      SpecFlow Version:2.1.0.0\n//      SpecFlow Generator Version:2.0.0.0\n// \n//      Changes to this file may cause incorrect behavior and will be lost if\n//      the code is regenerated.\n//  </auto-generated>\n// ------------------------------------------------------------------------------\n#region Designer generated code\n#pragma warning disable\nnamespace ProductLaunch.EndToEndTests\n{\n    using TechTalk.SpecFlow;\n    \n    \n    [System.CodeDom.Compiler.GeneratedCodeAttribute(\"TechTalk.SpecFlow\", \"2.1.0.0\")]\n    [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute()]\n    public partial class ProspectSignUpFeature\n    {\n        \n        private static TechTalk.SpecFlow.ITestRunner testRunner;\n        \n#line 1 \"ProspectSignUp.feature\"\n#line hidden\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassInitializeAttribute()]\n        public static void FeatureSetup(Microsoft.VisualStudio.TestTools.UnitTesting.TestContext testContext)\n        {\n            testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(null, 0);\n            TechTalk.SpecFlow.FeatureInfo featureInfo = new TechTalk.SpecFlow.FeatureInfo(new System.Globalization.CultureInfo(\"en-US\"), \"Prospect Sign Up\", \"\\tAs a prospect interested in the product launch\\r\\n\\tI want to sign up for notificat\" +\n                    \"ions\\r\\n\\tSo that I can be updated with news\", ProgrammingLanguage.CSharp, ((string[])(null)));\n            testRunner.OnFeatureStart(featureInfo);\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.ClassCleanupAttribute()]\n        public static void FeatureTearDown()\n        {\n            testRunner.OnFeatureEnd();\n            testRunner = null;\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute()]\n        public virtual void TestInitialize()\n        {\n            if (((testRunner.FeatureContext != null) \n                        && (testRunner.FeatureContext.FeatureInfo.Title != \"Prospect Sign Up\")))\n            {\n                ProductLaunch.EndToEndTests.ProspectSignUpFeature.FeatureSetup(null);\n            }\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute()]\n        public virtual void ScenarioTearDown()\n        {\n            testRunner.OnScenarioEnd();\n        }\n        \n        public virtual void ScenarioSetup(TechTalk.SpecFlow.ScenarioInfo scenarioInfo)\n        {\n            testRunner.OnScenarioStart(scenarioInfo);\n        }\n        \n        public virtual void ScenarioCleanup()\n        {\n            testRunner.CollectScenarioErrors();\n        }\n        \n        public virtual void SignUpWithValidDetails(string firstName, string lastName, string emailAddress, string companyName, string country, string role, string[] exampleTags)\n        {\n            TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo(\"Sign Up with Valid Details\", exampleTags);\n#line 6\nthis.ScenarioSetup(scenarioInfo);\n#line 7\n testRunner.Given(\"I browse to the Sign Up Page at \\\"172.31.114.254\\\"\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Given \");\n#line 8\n testRunner.And(string.Format(\"I enter details \\'{0}\\' \\'{1}\\' \\'{2}\\' \\'{3}\\' \\'{4}\\' \\'{5}\\'\", firstName, lastName, emailAddress, companyName, country, role), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"And \");\n#line 9\n testRunner.When(\"I press Go\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"When \");\n#line 10\n testRunner.Then(\"I should see the Thank You page\", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), \"Then \");\n#line hidden\n            this.ScenarioCleanup();\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 0\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"A\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"a.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant0()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"A\", \"a.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 1\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"B\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"b.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant1()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"B\", \"b.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 2\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"C\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"c.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant2()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"C\", \"c.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 3\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"D\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"d.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant3()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"D\", \"d.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 4\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"E\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"e.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant4()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"E\", \"e.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 5\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"F\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"f.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant5()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"F\", \"f.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 6\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"G\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"g.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Engineer\")]\n        public virtual void SignUpWithValidDetails_Variant6()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"G\", \"g.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Engineer\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 7\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"H\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"h.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant7()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"H\", \"h.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 8\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"I\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"i.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant8()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"I\", \"i.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 9\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"J\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"j.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant9()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"J\", \"j.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 10\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"K\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"k.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant10()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"K\", \"k.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 11\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"L\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"l.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant11()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"L\", \"l.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 12\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"M\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"m.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant12()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"M\", \"m.prospect@company.com\", \"Company, Inc.\", \"Sweden\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 13\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"N\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"n.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant13()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"N\", \"n.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 14\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"O\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"o.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant14()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"O\", \"o.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 15\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"P\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"p.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant15()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"P\", \"p.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 16\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Q\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"q.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant16()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Q\", \"q.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 17\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"R\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"r.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"IT Ops\")]\n        public virtual void SignUpWithValidDetails_Variant17()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"R\", \"r.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"IT Ops\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 18\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"S\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"s.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant18()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"S\", \"s.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 19\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"T\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"t.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant19()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"T\", \"t.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 20\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"U\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"u.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant20()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"U\", \"u.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 21\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"V\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"v.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant21()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"V\", \"v.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 22\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"W\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"w.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant22()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"W\", \"w.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 23\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"X\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"x.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United Kingdom\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant23()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"X\", \"x.prospect@company.com\", \"Company, Inc.\", \"United Kingdom\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 24\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Y\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"y.prospect@company.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Company, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"United States\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Architect\")]\n        public virtual void SignUpWithValidDetails_Variant24()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Y\", \"y.prospect@company.com\", \"Company, Inc.\", \"United States\", \"Architect\", ((string[])(null)));\n#line hidden\n        }\n        \n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute(\"Sign Up with Valid Details: Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"FeatureTitle\", \"Prospect Sign Up\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"VariantName\", \"Variant 25\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:FirstName\", \"Prospect\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:LastName\", \"Z\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:EmailAddress\", \"z.prospect@other.com\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:CompanyName\", \"Other, Inc.\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Country\", \"Sweden\")]\n        [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute(\"Parameter:Role\", \"Decision Maker\")]\n        public virtual void SignUpWithValidDetails_Variant25()\n        {\n            this.SignUpWithValidDetails(\"Prospect\", \"Z\", \"z.prospect@other.com\", \"Other, Inc.\", \"Sweden\", \"Decision Maker\", ((string[])(null)));\n#line hidden\n        }\n    }\n}\n#pragma warning restore\n#endregion\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.EndToEndTests/ProspectSignUpSteps.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing OpenQA.Selenium;\nusing OpenQA.Selenium.Firefox;\nusing OpenQA.Selenium.Support.UI;\nusing System;\nusing System.Threading;\nusing TechTalk.SpecFlow;\n\nnamespace ProductLaunch.EndToEndTests\n{\n    [Binding]\n    public class ProspectSignUpSteps\n    {\n        private static IWebDriver _Driver;\n\n        [BeforeFeature]\n        public static void Setup()\n        {\n            _Driver = new FirefoxDriver();\n        }\n\n        [AfterFeature]\n        public static void TearDown()\n        {\n            _Driver.Close();\n            _Driver.Dispose();\n        }\n\n        [Given(@\"I browse to the Sign Up Page at \"\"(.*)\"\"\")]\n        public void GivenIBrowseToTheSignUpPageAt(string host)\n        {\n            var url = $\"http://{host}/SignUp\";            \n            _Driver.Navigate().GoToUrl(url);\n        }\n        \n        [Given(@\"I enter details '(.*)' '(.*)' '(.*)' '(.*)' '(.*)' '(.*)'\")]\n        public void GivenIEnterDetails(string firstName, string lastName, string emailAddress, \n                                       string companyName, string country, string role)\n        {            \n            _Driver.FindElement(By.Id(\"MainContent_txtFirstName\")).SendKeys(firstName);\n            _Driver.FindElement(By.Id(\"MainContent_txtLastName\")).SendKeys(lastName);\n            _Driver.FindElement(By.Id(\"MainContent_txtEmail\")).SendKeys(emailAddress);\n            _Driver.FindElement(By.Id(\"MainContent_txtCompanyName\")).SendKeys(companyName);\n\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlCountry\"))).SelectByText(country);\n            new SelectElement(_Driver.FindElement(By.Id(\"MainContent_ddlRole\"))).SelectByText(role);\n        }\n\n        [When(@\"I press Go\")]\n        public void WhenIPressGo()\n        {\n            var goButton = _Driver.FindElement(By.Id(\"MainContent_btnGo\"));\n            goButton.Click();\n        }\n        \n        [Then(@\"I should see the Thank You page\")]\n        public void ThenIShouldSeeTheThankYouPage()\n        {\n            //HACK\n            Thread.Sleep(1500);\n            Assert.AreEqual(\"Ta\", _Driver.Title);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.EndToEndTests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Selenium.Firefox.WebDriver\" version=\"0.13.0\" targetFramework=\"net452\" />\n  <package id=\"Selenium.Support\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"Selenium.WebDriver\" version=\"3.0.1\" targetFramework=\"net452\" />\n  <package id=\"SpecFlow\" version=\"2.1.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Entities/Country.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Country\n    {\n        public string CountryCode { get; set; }\n\n        public string CountryName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Entities/ProductLaunch.Entities.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Entities</RootNamespace>\n    <AssemblyName>ProductLaunch.Entities</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Country.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Prospect.cs\" />\n    <Compile Include=\"Role.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Entities/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Entities\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Entities\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Entities/Prospect.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Prospect\n    {\n        public int ProspectId { get; set; }\n        \n        public string FirstName { get; set; }\n        \n        public string LastName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public Role Role { get; set; }\n\n        public Country Country { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Entities/Role.cs",
    "content": "﻿namespace ProductLaunch.Entities\n{\n    public class Role\n    {\n        public string RoleCode { get; set; }\n\n        public string RoleName { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string ElasticsearchUrl { get { return Get(\"ELASTICSEARCH_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Documents/Prospect.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Documents\n{\n    public class Prospect\n    {\n        public string FullName { get; set; }\n\n        public string CompanyName { get; set; }\n\n        public string EmailAddress { get; set; }\n\n        public string RoleName { get; set; }\n\n        public string CountryName { get; set; }\n\n        public DateTime SignUpDate { get; set; }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Indexer/Index.cs",
    "content": "using Nest;\nusing ProductLaunch.MessageHandlers.IndexProspect.Documents;\nusing System;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect.Indexer\n{\n    public class Index\n    {\n        public static void Setup()\n        {\n            var node = new Uri(Config.ElasticsearchUrl);\n            var settings = new ConnectionSettings(node);\n            var client = new ElasticClient(settings);\n            client.CreateIndex(\"prospects\");\n        }        \n\n        public static void CreateDocument(Prospect prospect)\n        {\n            try\n            {\n                var node = new Uri(Config.ElasticsearchUrl);\n                var client = new ElasticClient(node);                \n                client.Index(prospect, idx => idx.Index(\"prospects\"));\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine($\"Index prospect FAILED, email address: {prospect.EmailAddress}, ex: {ex}\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/ProductLaunch.MessageHandlers.IndexProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1354B5AB-C990-41EA-9F68-5F9933D83700}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.IndexProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.IndexProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Elasticsearch.Net, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Elasticsearch.Net.5.0.1\\lib\\net45\\Elasticsearch.Net.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Nest, Version=5.0.0.0, Culture=neutral, PublicKeyToken=96c599bbe3e70f5d, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NEST.5.0.1\\lib\\net45\\Nest.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.9.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Documents\\Prospect.cs\" />\n    <Compile Include=\"Indexer\\Index.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{e02eff91-8c52-4dce-8279-3fd1ee0659ef}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.MessageHandlers.IndexProspect.Indexer;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing System;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.IndexProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Initializing Elasticsearch. url: {Config.ElasticsearchUrl}\");\n            Index.Setup();\n\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += IndexProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void IndexProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Indexing prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = new Documents.Prospect\n            {\n                CompanyName = eventMessage.Prospect.CompanyName,\n                CountryName = eventMessage.Prospect.Country.CountryName,\n                EmailAddress = eventMessage.Prospect.EmailAddress,\n                FullName = $\"{eventMessage.Prospect.FirstName} {eventMessage.Prospect.LastName}\",\n                RoleName = eventMessage.Prospect.Role.RoleName,\n                SignUpDate = eventMessage.SignedUpAt\n            };\n            Index.CreateDocument(prospect);\n\n            Console.WriteLine($\"Prospect indexed; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.IndexProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1354b5ab-c990-41ea-9f68-5f9933d83700\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.IndexProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Elasticsearch.Net\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"NEST\" version=\"5.0.1\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"9.0.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>  \n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n  </startup>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/ProductLaunch.MessageHandlers.SaveProspect.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{65089C80-27F1-4744-979B-4C5A33B0CFF6}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.MessageHandlers.SaveProspect</RootNamespace>\n    <AssemblyName>ProductLaunch.MessageHandlers.SaveProspect</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Program.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing ProductLaunch.Model;\nusing System;\nusing System.Linq;\nusing System.Threading;\n\nnamespace ProductLaunch.MessageHandlers.SaveProspect\n{\n    class Program\n    {\n        private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);\n\n        static void Main(string[] args)\n        {\n            Console.WriteLine($\"Connecting to message queue url: {Messaging.Config.MessageQueueUrl}\");\n            using (var connection = MessageQueue.CreateConnection())\n            {\n                var subscription = connection.SubscribeAsync(ProspectSignedUpEvent.MessageSubject);\n                subscription.MessageHandler += SaveProspect;\n                subscription.Start();\n                Console.WriteLine($\"Listening on subject: {ProspectSignedUpEvent.MessageSubject}\");\n\n                _ResetEvent.WaitOne();\n                connection.Close();\n            }\n        }\n\n        private static void SaveProspect(object sender, MsgHandlerEventArgs e)\n        {\n            Console.WriteLine($\"Received message, subject: {e.Message.Subject}\");\n            var eventMessage = MessageHelper.FromData<ProspectSignedUpEvent>(e.Message.Data);\n            Console.WriteLine($\"Saving new prospect, signed up at: {eventMessage.SignedUpAt}; event ID: {eventMessage.CorrelationId}\");\n\n            var prospect = eventMessage.Prospect;\n            using (var context = new ProductLaunchContext())\n            {\n                //reload child objects:\n                prospect.Country = context.Countries.Single(x => x.CountryCode == prospect.Country.CountryCode);\n                prospect.Role = context.Roles.Single(x => x.RoleCode == prospect.Role.RoleCode);\n\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n\n            Console.WriteLine($\"Prospect saved. Prospect ID: {eventMessage.Prospect.ProspectId}; event ID: {eventMessage.CorrelationId}\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.MessageHandlers.SaveProspect\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"65089c80-27f1-4744-979b-4c5a33b0cff6\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.MessageHandlers.SaveProspect/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Messaging/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Messaging\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string MessageQueueUrl { get { return Get(\"MESSAGE_QUEUE_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Messaging/MessageHelper.cs",
    "content": "﻿using Newtonsoft.Json;\nusing ProductLaunch.Messaging.Messages;\nusing System.Text;\n\nnamespace ProductLaunch.Messaging\n{\n    public class MessageHelper\n    {\n        public static byte[] ToData<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            var json = JsonConvert.SerializeObject(message);\n            return Encoding.Unicode.GetBytes(json);\n        }\n\n        public static TMessage FromData<TMessage>(byte[] data)\n            where TMessage : Message\n        {\n            var json = Encoding.Unicode.GetString(data);\n            return (TMessage)JsonConvert.DeserializeObject<TMessage>(json);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Messaging/MessageQueue.cs",
    "content": "﻿using NATS.Client;\nusing ProductLaunch.Messaging.Messages;\n\nnamespace ProductLaunch.Messaging\n{\n    public static class MessageQueue\n    {\n\n        public static void Publish<TMessage>(TMessage message)\n            where TMessage : Message\n        {\n            using (var connection = CreateConnection())\n            {\n                var data = MessageHelper.ToData(message);\n                connection.Publish(message.Subject, data);\n            }\n        }\n\n        public static IConnection CreateConnection()\n        {\n            return new ConnectionFactory().CreateConnection(Config.MessageQueueUrl);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Messaging/Messages/Events/ProspectSignedUpEvent.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System;\n\nnamespace ProductLaunch.Messaging.Messages.Events\n{\n    public class ProspectSignedUpEvent : Message\n    {\n        public override string Subject { get { return MessageSubject; } }\n\n        public DateTime SignedUpAt { get; set; }\n\n        public Prospect Prospect { get; set; }\n\n        public static string MessageSubject = \"events.prospect.signedup\";\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Messaging/Messages/Message.cs",
    "content": "﻿using System;\n\nnamespace ProductLaunch.Messaging.Messages\n{\n    public abstract class Message\n    {\n        public string CorrelationId { get; set; }  \n        \n        public abstract string Subject { get; }      \n\n        public Message()\n        {\n            CorrelationId = Guid.NewGuid().ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Messaging/ProductLaunch.Messaging.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Messaging</RootNamespace>\n    <AssemblyName>ProductLaunch.Messaging</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"MessageHelper.cs\" />\n    <Compile Include=\"MessageQueue.cs\" />\n    <Compile Include=\"Messages\\Events\\ProspectSignedUpEvent.cs\" />\n    <Compile Include=\"Messages\\Message.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup />\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Messaging/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Messaging\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"e02eff91-8c52-4dce-8279-3fd1ee0659ef\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Messaging/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  </configSections>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"Data Source=(localdb)\\v13.0; Integrated Security=True; MultipleActiveResultSets=True\" />\n      </parameters>\n    </defaultConnectionFactory>\n  </entityFramework>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Model\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string DbConnectionString { get { return Get(\"DB_CONNECTION_STRING\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model/Initializers/StaticDataInitializer.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model.Initializers\n{\n    public class StaticDataInitializer : CreateDatabaseIfNotExists<ProductLaunchContext>\n    {\n        protected override void Seed(ProductLaunchContext context)\n        {\n            AddRole(context, \"DA\", \"Developer Advocate\");\n            AddRole(context, \"DM\", \"Decision Maker\");\n            AddRole(context, \"AC\", \"Architect\");\n            AddRole(context, \"EN\", \"Engineer\");\n            AddRole(context, \"OP\", \"IT Ops\");\n\n            AddCountry(context, \"GBR\", \"United Kingdom\");\n            AddCountry(context, \"USA\", \"United States\");\n            AddCountry(context, \"SWE\", \"Sweden\");\n\n            context.SaveChanges();\n        }\n\n        private void AddCountry(ProductLaunchContext context, string code, string name)\n        {\n            context.Countries.Add(new Country\n            {\n                CountryCode = code,\n                CountryName = name\n            });\n        }\n\n        private void AddRole(ProductLaunchContext context, string code, string name)\n        {\n            context.Roles.Add(new Role\n            {\n                RoleCode = code,\n                RoleName = name\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model/ProductLaunch.Model.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model</RootNamespace>\n    <AssemblyName>ProductLaunch.Model</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Initializers\\StaticDataInitializer.cs\" />\n    <Compile Include=\"ProductLaunchContext.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model/ProductLaunchContext.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing System.Data.Entity;\n\nnamespace ProductLaunch.Model\n{\n    public class ProductLaunchContext : DbContext\n    {\n        public ProductLaunchContext() : base(Config.DbConnectionString) { }\n\n        public DbSet<Country> Countries { get; set; }\n\n        public DbSet<Role> Roles { get; set; }\n\n        public DbSet<Prospect> Prospects { get; set; }\n\n        protected override void OnModelCreating(DbModelBuilder builder)\n        {\n            builder.Entity<Country>().HasKey(c => c.CountryCode);\n            builder.Entity<Role>().HasKey(r => r.RoleCode);\n            builder.Entity<Prospect>().HasOptional<Country>(p => p.Country);\n            builder.Entity<Prospect>().HasOptional<Role>(p => p.Role);            \n        }        \n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"3afc4a48-5db6-48ff-a459-20ec21a2eb28\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <connectionStrings>\n    <add name=\"ProductLaunchDb\" providerName=\"System.Data.SqlClient\" connectionString=\"Server=172.20.244.163;Database=ProductLaunch;User Id=sa;Password=NDC_l0nd0n;\"/>\n  </connectionStrings>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunch.Model.Tests.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{49FD06C3-CD52-425A-866D-831D09268CD0}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Model.Tests</RootNamespace>\n    <AssemblyName>ProductLaunch.Model.Tests</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Data.Entity\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"ProductLaunchContextTest.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3afc4a48-5db6-48ff-a459-20ec21a2eb28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model.Tests/ProductLaunchContextTest.cs",
    "content": "﻿using System;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing ProductLaunch.Entities;\n\nnamespace ProductLaunch.Model.Tests\n{\n    [TestClass]\n    public class ProductLaunchContextTest\n    {\n        [TestMethod]\n        public void Insert()\n        {\n            using (var context = new ProductLaunchContext())\n            {\n                var country = new Country\n                {\n                    CountryCode = \"GBR\",\n                    CountryName = \"United Kingdom\"\n                };\n                context.Countries.Add(country);\n\n                var role = new Role\n                {\n                    RoleCode = \"DM\",\n                    RoleName = \"Decision Maker\"\n                };\n                context.Roles.Add(role);\n\n                var prospect = new Prospect\n                {\n                    FirstName = \"A\",\n                    LastName = \"Prospect\",\n                    CompanyName = \"Docker, Inc.\",\n                    EmailAddress = \"a.prospect@docker.com\",\n                    Country = country,\n                    Role = role\n                };\n                context.Prospects.Add(prospect);\n                context.SaveChanges();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model.Tests/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Model.Tests\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"49fd06c3-cd52-425a-866d-831d09268cd0\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Model.Tests/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/About.aspx",
    "content": "﻿<%@ Page Title=\"About\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"About.aspx.cs\" Inherits=\"ProductLaunch.Web.About\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your application description page.</h3>\n    <p>Use this area to provide additional information.</p>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/About.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class About : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/About.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class About\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/App_Start/BundleConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public class BundleConfig\n    {\n        // For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkID=303951\n        public static void RegisterBundles(BundleCollection bundles)\n        {\n            bundles.Add(new ScriptBundle(\"~/bundles/WebFormsJs\").Include(\n                            \"~/Scripts/WebForms/WebForms.js\",\n                            \"~/Scripts/WebForms/WebUIValidation.js\",\n                            \"~/Scripts/WebForms/MenuStandards.js\",\n                            \"~/Scripts/WebForms/Focus.js\",\n                            \"~/Scripts/WebForms/GridView.js\",\n                            \"~/Scripts/WebForms/DetailsView.js\",\n                            \"~/Scripts/WebForms/TreeView.js\",\n                            \"~/Scripts/WebForms/WebParts.js\"));\n\n            // Order is very important for these files to work, they have explicit dependencies\n            bundles.Add(new ScriptBundle(\"~/bundles/MsAjaxJs\").Include(\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjax.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxApplicationServices.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxTimer.js\",\n                    \"~/Scripts/WebForms/MsAjax/MicrosoftAjaxWebForms.js\"));\n\n            // Use the Development version of Modernizr to develop with and learn from. Then, when you’re\n            // ready for production, use the build tool at http://modernizr.com to pick only the tests you need\n            bundles.Add(new ScriptBundle(\"~/bundles/modernizr\").Include(\n                            \"~/Scripts/modernizr-*\"));\n\n            ScriptManager.ScriptResourceMapping.AddDefinition(\n                \"respond\",\n                new ScriptResourceDefinition\n                {\n                    Path = \"~/Scripts/respond.min.js\",\n                    DebugPath = \"~/Scripts/respond.js\",\n                });\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/App_Start/RouteConfig.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Web;\nusing System.Web.Routing;\nusing Microsoft.AspNet.FriendlyUrls;\n\nnamespace ProductLaunch.Web\n{\n    public static class RouteConfig\n    {\n        public static void RegisterRoutes(RouteCollection routes)\n        {\n            var settings = new FriendlyUrlSettings();\n            settings.AutoRedirectMode = RedirectMode.Permanent;\n            routes.EnableFriendlyUrls(settings);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/ApplicationInsights.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ApplicationInsights xmlns=\"http://schemas.microsoft.com/ApplicationInsights/2013/Settings\">\n</ApplicationInsights>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Bundle.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<bundles version=\"1.0\">\n  <styleBundle path=\"~/Content/css\">\n    <include path=\"~/Content/bootstrap.css\" />\n    <include path=\"~/Content/Site.css\" />\n  </styleBundle>\n</bundles>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Config.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ProductLaunch.Web\n{\n    public class Config\n    {\n        private static Dictionary<string, string> _Values = new Dictionary<string, string>();\n\n        public static string HomePageUrl { get { return Get(\"HOMEPAGE_URL\"); } }\n        \n        private static string Get(string variable)\n        {\n            if (!_Values.ContainsKey(variable))\n            {\n                var value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Machine);\n                if (string.IsNullOrEmpty(value))\n                {\n                    value = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.Process);\n                }\n                _Values[variable] = value;\n            }\n            return _Values[variable];\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Contact.aspx",
    "content": "﻿<%@ Page Title=\"Contact\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Contact.aspx.cs\" Inherits=\"ProductLaunch.Web.Contact\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n    <h2><%: Title %>.</h2>\n    <h3>Your contact page.</h3>\n    <address>\n        One Microsoft Way<br />\n        Redmond, WA 98052-6399<br />\n        <abbr title=\"Phone\">P:</abbr>\n        425.555.0100\n    </address>\n\n    <address>\n        <strong>Support:</strong>   <a href=\"mailto:Support@example.com\">Support@example.com</a><br />\n        <strong>Marketing:</strong> <a href=\"mailto:Marketing@example.com\">Marketing@example.com</a>\n    </address>\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Contact : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Contact.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class Contact\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Content/Site.css",
    "content": "﻿/* Move down content because we have a fixed navbar that is 50px tall */\nbody {\n    padding-top: 50px;\n    padding-bottom: 20px;\n}\n\n/* Wrapping element */\n/* Set some basic padding to keep content from hitting the edges */\n.body-content {\n    padding-left: 15px;\n    padding-right: 15px;\n}\n\n/* Set widths on the form inputs since otherwise they're 100% wide */\ninput,\nselect,\ntextarea {\n    max-width: 280px;\n}\n\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n    .jumbotron {\n        margin-top: 20px;\n    }\n\n    .body-content {\n        padding: 0;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Content/bootstrap.css",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. The notices and licenses below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden] {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput,\nselect[multiple],\ntextarea {\n  background-image: none;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16.099999999999998px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\nh1 small,\n.h1 small {\n  font-size: 24px;\n}\n\nh2 small,\n.h2 small {\n  font-size: 18px;\n}\n\nh3 small,\n.h3 small,\nh4 small,\n.h4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\npre {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table thead > tr > th,\n.table tbody > tr > th,\n.table tfoot > tr > th,\n.table thead > tr > td,\n.table tbody > tr > td,\n.table tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table caption + thead tr:first-child th,\n.table colgroup + thead tr:first-child th,\n.table thead:first-child tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed thead > tr > th,\n.table-condensed tbody > tr > th,\n.table-condensed tfoot > tr > th,\n.table-condensed thead > tr > td,\n.table-condensed tbody > tr > td,\n.table-condensed tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td {\n  background-color: #d0e9c6;\n  border-color: #c9e2b3;\n}\n\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td {\n  background-color: #ebcccc;\n  border-color: #e6c1c7;\n}\n\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td {\n  background-color: #faf2cc;\n  border-color: #f8e5be;\n}\n\n@media (max-width: 768px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n    background-color: #fff;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > thead > tr:last-child > td,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  padding-top: 7px;\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\1f4bc\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\1f4c5\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\1f4cc\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\1f4ce\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\1f4f7\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\1f512\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\1f514\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\1f516\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\1f525\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\1f527\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #333333;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs.nav-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 5px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n\n.nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  z-index: 1000;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  z-index: 1030;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e6e6e6;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #428bca;\n}\n\n.thumbnail > img {\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.alert-warning hr {\n  border-top-color: #f8e5be;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger hr {\n  border-top-color: #e6c1c7;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #fbeed5;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #fbeed5;\n}\n\n.panel-danger {\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #eed3d7;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #eed3d7;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\nbody.modal-open,\n.modal-open .navbar-fixed-top,\n.modal-open .navbar-fixed-bottom {\n  margin-right: 15px;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    right: auto;\n    left: 50%;\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n@media screen and (max-width: 400px) {\n  @-ms-viewport {\n    width: 320px;\n  }\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.visible-xs {\n  display: none !important;\n}\n\ntr.visible-xs {\n  display: none !important;\n}\n\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm {\n  display: none !important;\n}\n\ntr.visible-sm {\n  display: none !important;\n}\n\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md {\n  display: none !important;\n}\n\ntr.visible-md {\n  display: none !important;\n}\n\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg {\n  display: none !important;\n}\n\ntr.visible-lg {\n  display: none !important;\n}\n\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-md {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-md {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n  tr.hidden-md {\n    display: none !important;\n  }\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-md {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print {\n  display: none !important;\n}\n\ntr.visible-print {\n  display: none !important;\n}\n\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n  tr.hidden-print {\n    display: none !important;\n  }\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Default.aspx",
    "content": "﻿<%@ Page Title=\"Home Page\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Default.aspx.cs\" Inherits=\"ProductLaunch.Web._Default\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>We&#39;re launching a new product!</h1>\n        <p class=\"lead\">Our new product is going to be very, very good.</p>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-8\">\n            <h2>What&#39;s this all about?</h2>\n            <p>\n                Lorem ipsum dolor sit amet lectus. In magna in praesent nibh lorem. Egestas ipsum luctus feugiat sit enim. Libero nec a. Praesent vestibulum quis enim.</p>\n            <p>\n                Morbi fusce placerat et pellentesque qui curabitur dictum nam. Adipiscing pede semper. Tellus at sem. Arcu nibh et. Magna luctus nibh. Eu erat aenean adipiscing vitae pretium. Pede nec laoreet. Adipiscing mauris lorem tortor nec massa distinctio pede justo. Gravida non purus nunc sit consequat imperdiet sodales nullam dolor vel.</p>\n            <p>\n                <a class=\"btn btn-default\" href=\"https://www.docker.com/enterprise\">Check Out Our Other Products &raquo;</a>\n            </p>\n        </div>\n        <div class=\"col-md-4\">\n            <h2>Interested?</h2>\n            <p>\n                Give us your details and we&#39;ll keep you posted.</p>\n            <p>\n                It only takes 30 seconds to sign up.\n            </p>\n            <p>\n                And we probably won't spam you very much.\n            </p>\n            <p>\n                <a class=\"btn btn btn-primary btn-lg\" href=\"SignUp.aspx\">Sign Up &raquo;</a>\n            </p>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Default.aspx.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Net;\nusing System.Web.UI;\n\nnamespace ProductLaunch.Web\n{\n    public partial class _Default : Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            if (!string.IsNullOrEmpty(Config.HomePageUrl))\n            {\n                Response.Clear();\n                var request = HttpWebRequest.Create(Config.HomePageUrl);\n                var response = request.GetResponse();\n                using (var stream = response.GetResponseStream())\n                using (var reader = new StreamReader(stream))\n                {\n                    var html = reader.ReadToEnd();\n                    Response.Write(html);\n                }\n                Response.End();           \n            }\n        }        \n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Default.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web\n{\n\n\n    public partial class _Default\n    {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"ProductLaunch.Web.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Global.asax.cs",
    "content": "﻿using ProductLaunch.Model;\nusing ProductLaunch.Model.Initializers;\nusing System;\nusing System.Data.Entity;\nusing System.Web;\nusing System.Web.Optimization;\nusing System.Web.Routing;\n\nnamespace ProductLaunch.Web\n{\n    public class Global : HttpApplication\n    {\n        void Application_Start(object sender, EventArgs e)\n        {\n            // Code that runs on application startup\n            RouteConfig.RegisterRoutes(RouteTable.Routes);\n            BundleConfig.RegisterBundles(BundleTable.Bundles);\n\n            Database.SetInitializer<ProductLaunchContext>(new StaticDataInitializer());\n            SignUp.PreloadStaticDataCache();\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/ProductLaunch.Web.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProductLaunch.Web</RootNamespace>\n    <AssemblyName>ProductLaunch.Web</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <UseIISExpress>false</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.4.3.1\\lib\\net40\\EntityFramework.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"NATS.Client, Version=0.7.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\NATS.Client.0.7.0\\lib\\net45\\NATS.Client.DLL</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data.Entity\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.Web.Infrastructure.1.0.0.0\\lib\\net40\\Microsoft.Web.Infrastructure.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.bootstrap\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.bootstrap.3.0.0\\lib\\net45\\AspNet.ScriptManager.bootstrap.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AspNet.ScriptManager.jQuery\">\n      <HintPath>..\\packages\\AspNet.ScriptManager.jQuery.1.10.2\\lib\\net45\\AspNet.ScriptManager.jQuery.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.MSAjax\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.MSAjax.5.0.0\\lib\\net45\\Microsoft.ScriptManager.MSAjax.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ScriptManager.WebForms\">\n      <HintPath>..\\packages\\Microsoft.AspNet.ScriptManager.WebForms.5.0.0\\lib\\net45\\Microsoft.ScriptManager.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.1.1.3\\lib\\net40\\System.Web.Optimization.dll</HintPath>\n    </Reference>\n    <Reference Include=\"WebGrease\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\WebGrease.1.5.2\\lib\\WebGrease.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Antlr3.Runtime\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Antlr.3.4.1.9004\\lib\\Antlr3.Runtime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.Web.Optimization.WebForms\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.WebForms.1.1.3\\lib\\net45\\Microsoft.AspNet.Web.Optimization.WebForms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.FriendlyUrls\">\n      <HintPath>..\\packages\\Microsoft.AspNet.FriendlyUrls.Core.1.0.2\\lib\\net45\\Microsoft.AspNet.FriendlyUrls.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"App_Data\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"About.aspx\" />\n    <Content Include=\"Contact.aspx\" />\n    <Content Include=\"Content\\bootstrap.css\" />\n    <Content Include=\"Content\\bootstrap.min.css\" />\n    <Content Include=\"Content\\Site.css\" />\n    <Content Include=\"SignUp.aspx\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.svg\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.woff\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.ttf\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.eot\" />\n    <Content Include=\"ApplicationInsights.config\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <None Include=\"Scripts\\jquery-1.10.2.intellisense.js\" />\n    <Content Include=\"Scripts\\bootstrap.js\" />\n    <Content Include=\"Scripts\\bootstrap.min.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.js\" />\n    <Content Include=\"Scripts\\modernizr-2.6.2.js\" />\n    <Content Include=\"Scripts\\respond.js\" />\n    <Content Include=\"Scripts\\respond.min.js\" />\n    <Content Include=\"Scripts\\WebForms\\DetailsView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Focus.js\" />\n    <Content Include=\"Scripts\\WebForms\\GridView.js\" />\n    <Content Include=\"Scripts\\WebForms\\Menu.js\" />\n    <Content Include=\"Scripts\\WebForms\\MenuStandards.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjax.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxApplicationServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxComponentModel.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxCore.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxGlobalization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxHistory.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxNetwork.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxSerialization.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxTimer.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\MSAjax\\MicrosoftAjaxWebServices.js\" />\n    <Content Include=\"Scripts\\WebForms\\SmartNav.js\" />\n    <Content Include=\"Scripts\\WebForms\\TreeView.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebForms.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebParts.js\" />\n    <Content Include=\"Scripts\\WebForms\\WebUIValidation.js\" />\n    <Content Include=\"Scripts\\_references.js\" />\n    <Content Include=\"Default.aspx\" />\n    <Content Include=\"favicon.ico\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Site.Master\" />\n    <Content Include=\"ThankYou.aspx\" />\n    <Content Include=\"ViewSwitcher.ascx\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <Content Include=\"Bundle.config\" />\n    <Content Include=\"packages.config\" />\n    <None Include=\"Project_Readme.html\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.map\" />\n    <Content Include=\"Site.Mobile.Master\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\BundleConfig.cs\" />\n    <Compile Include=\"About.aspx.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"About.aspx.designer.cs\">\n      <DependentUpon>About.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"App_Start\\RouteConfig.cs\" />\n    <Compile Include=\"Config.cs\" />\n    <Compile Include=\"Contact.aspx.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Contact.aspx.designer.cs\">\n      <DependentUpon>Contact.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"SignUp.aspx.designer.cs\">\n      <DependentUpon>SignUp.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Default.aspx.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Default.aspx.designer.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Site.Master.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Master.designer.cs\">\n      <DependentUpon>Site.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Site.Mobile.Master.designer.cs\">\n      <DependentUpon>Site.Mobile.Master</DependentUpon>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ThankYou.aspx.designer.cs\">\n      <DependentUpon>ThankYou.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"ViewSwitcher.ascx.designer.cs\">\n      <DependentUpon>ViewSwitcher.ascx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProductLaunch.Entities\\ProductLaunch.Entities.csproj\">\n      <Project>{f1bbb80f-eb0c-41b6-a7a9-7994fb3fe5e8}</Project>\n      <Name>ProductLaunch.Entities</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\">\n      <Project>{e02eff91-8c52-4dce-8279-3fd1ee0659ef}</Project>\n      <Name>ProductLaunch.Messaging</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ProductLaunch.Model\\ProductLaunch.Model.csproj\">\n      <Project>{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}</Project>\n      <Name>ProductLaunch.Model</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>57120</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost/ProductLaunch.Web</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Project_Readme.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>Your ASP.NET application</title>\n    <style>\n        body {\n            background: #fff;\n            color: #505050;\n            font: 14px 'Segoe UI', tahoma, arial, helvetica, sans-serif;\n            margin: 20px;\n            padding: 0;\n        }\n\n        #header {\n            background: #efefef;\n            padding: 0;\n        }\n\n        h1 {\n            font-size: 48px;\n            font-weight: normal;\n            margin: 0;\n            padding: 0 30px;\n            line-height: 150px;\n        }\n\n        p {\n            font-size: 20px;\n            color: #fff;\n            background: #969696;\n            padding: 0 30px;\n            line-height: 50px;\n        }\n\n        #main {\n            padding: 5px 30px;\n        }\n\n        .section {\n            width: 21.7%;\n            float: left;\n            margin: 0 0 0 4%;\n        }\n\n            .section h2 {\n                font-size: 13px;\n                text-transform: uppercase;\n                margin: 0;\n                border-bottom: 1px solid silver;\n                padding-bottom: 12px;\n                margin-bottom: 8px;\n            }\n\n            .section.first {\n                margin-left: 0;\n            }\n\n                .section.first h2 {\n                    font-size: 24px;\n                    text-transform: none;\n                    margin-bottom: 25px;\n                    border: none;\n                }\n\n                .section.first li {\n                    border-top: 1px solid silver;\n                    padding: 8px 0;\n                }\n\n            .section.last {\n                margin-right: 0;\n            }\n\n        ul {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n            line-height: 20px;\n        }\n\n        li {\n            padding: 4px 0;\n        }\n\n        a {\n            color: #267cb2;\n            text-decoration: none;\n        }\n\n            a:hover {\n                text-decoration: underline;\n            }\n    </style>\n</head>\n<body>\n\n    <div id=\"header\">\n        <h1>Your ASP.NET application</h1>\n        <p>Congratulations! You've created a project</p>\n    </div>\n\n    <div id=\"main\">\n        <div class=\"section first\">\n            <h2>This application consists of:</h2>\n            <ul>\n                <li>Sample pages showing basic nav between Home, About, and Contact.</li>\n                <li>Theming using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615519\">Bootstrap</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615520\">Authentication</a>, if selected, shows how to register and sign in</li>\n                <li>ASP.NET features managed using <a href=\"http://go.microsoft.com/fwlink/?LinkID=615521\">NuGet</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Customize app</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615522\">Get started with ASP.NET Web Forms</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615523\">Change the site's theme</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615524\">Add more libraries using NuGet</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615525\">Configure authentication</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615526\">Customize information about the website users</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615527\">Get information from social providers</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615528\">Add HTTP services using ASP.NET Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615529\">Secure the Web API</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615530\">Add real-time web with ASP.NET SignalR</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615531\">Add components using Scaffolding</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615532\">Test app with Browser Link</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615533\">Share your project</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>Deploy</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615534\">Ensure your app is ready for production</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615535\">Microsoft Azure</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615536\">Hosting providers</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section last\">\n            <h2>Get help</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615537\">Get help</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=615538\">Get more templates</a></li>\n            </ul>\n        </div>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProductLaunch.Web\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProductLaunch.Web\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"17a57cf4-a6c1-47c1-aa38-650db6d87f8f\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/DetailsView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/DetailsView.js\nfunction DetailsView() {\n    this.pageIndex = null;\n    this.dataKeys = null;\n    this.createPropertyString = DetailsView_createPropertyString;\n    this.setStateField = DetailsView_setStateValue;\n    this.getHiddenFieldContents = DetailsView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction DetailsView_createPropertyString() {\n    return createPropertyStringFromValues_DetailsView(this.pageIndex, this.dataKeys);\n}\nfunction DetailsView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction DetailsView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[2];\n    for (var i = 3; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_DetailsView(valsArray[0], valsArray[1]);\n}\nfunction DetailsView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_DetailsView(pageIndex, dataKeys) {\n    var value = new Array(pageIndex, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Focus.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_FindFirstFocusableChild(control) {\n    if (!control || !(control.tagName)) {\n        return null;\n    }\n    var tagName = control.tagName.toLowerCase();\n    if (tagName == \"undefined\") {\n        return null;\n    }\n    var children = control.childNodes;\n    if (children) {\n        for (var i = 0; i < children.length; i++) {\n            try {\n                if (WebForm_CanFocus(children[i])) {\n                    return children[i];\n                }\n                else {\n                    var focused = WebForm_FindFirstFocusableChild(children[i]);\n                    if (WebForm_CanFocus(focused)) {\n                        return focused;\n                    }\n                }\n            } catch (e) {\n            }\n        }\n    }\n    return null;\n}\nfunction WebForm_AutoFocus(focusId) {\n    var targetControl;\n    if (__nonMSDOMBrowser) {\n        targetControl = document.getElementById(focusId);\n    }\n    else {\n        targetControl = document.all[focusId];\n    }\n    var focused = targetControl;\n    if (targetControl && (!WebForm_CanFocus(targetControl)) ) {\n        focused = WebForm_FindFirstFocusableChild(targetControl);\n    }\n    if (focused) {\n        try {\n            focused.focus();\n            if (__nonMSDOMBrowser) {\n                focused.scrollIntoView(false);\n            }\n            if (window.__smartNav) {\n                window.__smartNav.ae = focused.id;\n            }\n        }\n        catch (e) {\n        }\n    }\n}\nfunction WebForm_CanFocus(element) {\n    if (!element || !(element.tagName)) return false;\n    var tagName = element.tagName.toLowerCase();\n    return (!(element.disabled) &&\n            (!(element.type) || element.type.toLowerCase() != \"hidden\") &&\n            WebForm_IsFocusableTag(tagName) &&\n            WebForm_IsInVisibleContainer(element)\n            );\n}\nfunction WebForm_IsFocusableTag(tagName) {\n    return (tagName == \"input\" ||\n            tagName == \"textarea\" ||\n            tagName == \"select\" ||\n            tagName == \"button\" ||\n            tagName == \"a\");\n}\nfunction WebForm_IsInVisibleContainer(ctrl) {\n    var current = ctrl;\n    while((typeof(current) != \"undefined\") && (current != null)) {\n        if (current.disabled ||\n            ( typeof(current.style) != \"undefined\" &&\n            ( ( typeof(current.style.display) != \"undefined\" &&\n                current.style.display == \"none\") ||\n                ( typeof(current.style.visibility) != \"undefined\" &&\n                current.style.visibility == \"hidden\") ) ) ) {\n            return false;\n        }\n        if (typeof(current.parentNode) != \"undefined\" &&\n                current.parentNode != null &&\n                current.parentNode != current &&\n                current.parentNode.tagName.toLowerCase() != \"body\") {\n            current = current.parentNode;\n        }\n        else {\n            return true;\n        }\n    }\n    return true;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/GridView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/GridView.js\nfunction GridView() {\n    this.pageIndex = null;\n    this.sortExpression = null;\n    this.sortDirection = null;\n    this.dataKeys = null;\n    this.createPropertyString = GridView_createPropertyString;\n    this.setStateField = GridView_setStateValue;\n    this.getHiddenFieldContents = GridView_getHiddenFieldContents;\n    this.stateField = null;\n    this.panelElement = null;\n    this.callback = null;\n}\nfunction GridView_createPropertyString() {\n    return createPropertyStringFromValues_GridView(this.pageIndex, this.sortDirection, this.sortExpression, this.dataKeys);\n}\nfunction GridView_setStateValue() {\n    this.stateField.value = this.createPropertyString();\n}\nfunction GridView_OnCallback (result, context) {\n    var value = new String(result);\n    var valsArray = value.split(\"|\");\n    var innerHtml = valsArray[4];\n    for (var i = 5; i < valsArray.length; i++) {\n        innerHtml += \"|\" + valsArray[i];\n    }\n    context.panelElement.innerHTML = innerHtml;\n    context.stateField.value = createPropertyStringFromValues_GridView(valsArray[0], valsArray[1], valsArray[2], valsArray[3]);\n}\nfunction GridView_getHiddenFieldContents(arg) {\n    return arg + \"|\" + this.stateField.value;\n}\nfunction createPropertyStringFromValues_GridView(pageIndex, sortDirection, sortExpression, dataKeys) {\n    var value = new Array(pageIndex, sortDirection, sortExpression, dataKeys);\n    return value.join(\"|\");\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjax.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjax.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjax.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript._scripts={\"MicrosoftAjaxCore.js\":true,\"MicrosoftAjaxGlobalization.js\":true,\"MicrosoftAjaxSerialization.js\":true,\"MicrosoftAjaxComponentModel.js\":true,\"MicrosoftAjaxHistory.js\":true,\"MicrosoftAjaxNetwork.js\":true,\"MicrosoftAjaxWebServices.js\":true};Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};Type.registerNamespace(\"Sys.UI\");Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxApplicationServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxApplicationServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxApplicationServices.js\nType._registerScript(\"MicrosoftAjaxApplicationServices.js\",[\"MicrosoftAjaxWebServices.js\"]);Type.registerNamespace(\"Sys.Services\");Sys.Services._ProfileService=function(){Sys.Services._ProfileService.initializeBase(this);this.properties={}};Sys.Services._ProfileService.DefaultWebServicePath=\"\";Sys.Services._ProfileService.prototype={_defaultLoadCompletedCallback:null,_defaultSaveCompletedCallback:null,_path:\"\",_timeout:0,get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_defaultSaveCompletedCallback:function(){return this._defaultSaveCompletedCallback},set_defaultSaveCompletedCallback:function(a){this._defaultSaveCompletedCallback=a},get_path:function(){return this._path||\"\"},load:function(c,d,e,f){var b,a;if(!c){a=\"GetAllPropertiesForCurrentUser\";b={authenticatedUserOnly:false}}else{a=\"GetPropertiesForCurrentUser\";b={properties:this._clonePropertyNames(c),authenticatedUserOnly:false}}this._invoke(this._get_path(),a,false,b,Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[d,e,f])},save:function(d,b,c,e){var a=this._flattenProperties(d,this.properties);this._invoke(this._get_path(),\"SetPropertiesForCurrentUser\",false,{values:a.value,authenticatedUserOnly:false},Function.createDelegate(this,this._onSaveComplete),Function.createDelegate(this,this._onSaveFailed),[b,c,e,a.count])},_clonePropertyNames:function(e){var c=[],d={};for(var b=0;b<e.length;b++){var a=e[b];if(!d[a]){Array.add(c,a);d[a]=true}}return c},_flattenProperties:function(a,i,j){var b={},e,d,g=0;if(a&&a.length===0)return {value:b,count:0};for(var c in i){e=i[c];d=j?j+\".\"+c:c;if(Sys.Services.ProfileGroup.isInstanceOfType(e)){var k=this._flattenProperties(a,e,d),h=k.value;g+=k.count;for(var f in h){var l=h[f];b[f]=l}}else if(!a||Array.indexOf(a,d)!==-1){b[d]=e;g++}}return {value:b,count:g}},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._ProfileService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoadComplete:function(a,e,g){if(typeof a!==\"object\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,g,\"Object\"));var c=this._unflattenProperties(a);for(var b in c)this.properties[b]=c[b];var d=e[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(d){var f=e[2]||this.get_defaultUserContext();d(a.length,f,\"Sys.Services.ProfileService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.load\")}},_onSaveComplete:function(a,b,f){var c=b[3];if(a!==null)if(a instanceof Array)c-=a.length;else if(typeof a===\"number\")c=a;else throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));var d=b[0]||this.get_defaultSaveCompletedCallback()||this.get_defaultSucceededCallback();if(d){var e=b[2]||this.get_defaultUserContext();d(c,e,\"Sys.Services.ProfileService.save\")}},_onSaveFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.ProfileService.save\")}},_unflattenProperties:function(e){var c={},d,f,h=0;for(var a in e){h++;f=e[a];d=a.indexOf(\".\");if(d!==-1){var g=a.substr(0,d);a=a.substr(d+1);var b=c[g];if(!b||!Sys.Services.ProfileGroup.isInstanceOfType(b)){b=new Sys.Services.ProfileGroup;c[g]=b}b[a]=f}else c[a]=f}e.length=h;return c}};Sys.Services._ProfileService.registerClass(\"Sys.Services._ProfileService\",Sys.Net.WebServiceProxy);Sys.Services.ProfileService=new Sys.Services._ProfileService;Sys.Services.ProfileGroup=function(a){if(a)for(var b in a)this[b]=a[b]};Sys.Services.ProfileGroup.registerClass(\"Sys.Services.ProfileGroup\");Sys.Services._AuthenticationService=function(){Sys.Services._AuthenticationService.initializeBase(this)};Sys.Services._AuthenticationService.DefaultWebServicePath=\"\";Sys.Services._AuthenticationService.prototype={_defaultLoginCompletedCallback:null,_defaultLogoutCompletedCallback:null,_path:\"\",_timeout:0,_authenticated:false,get_defaultLoginCompletedCallback:function(){return this._defaultLoginCompletedCallback},set_defaultLoginCompletedCallback:function(a){this._defaultLoginCompletedCallback=a},get_defaultLogoutCompletedCallback:function(){return this._defaultLogoutCompletedCallback},set_defaultLogoutCompletedCallback:function(a){this._defaultLogoutCompletedCallback=a},get_isLoggedIn:function(){return this._authenticated},get_path:function(){return this._path||\"\"},login:function(c,b,a,h,f,d,e,g){this._invoke(this._get_path(),\"Login\",false,{userName:c,password:b,createPersistentCookie:a},Function.createDelegate(this,this._onLoginComplete),Function.createDelegate(this,this._onLoginFailed),[c,b,a,h,f,d,e,g])},logout:function(c,a,b,d){this._invoke(this._get_path(),\"Logout\",false,{},Function.createDelegate(this,this._onLogoutComplete),Function.createDelegate(this,this._onLogoutFailed),[c,a,b,d])},_get_path:function(){var a=this.get_path();if(!a.length)a=Sys.Services._AuthenticationService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_onLoginComplete:function(e,c,f){if(typeof e!==\"boolean\")throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Boolean\"));var b=c[4],d=c[7]||this.get_defaultUserContext(),a=c[5]||this.get_defaultLoginCompletedCallback()||this.get_defaultSucceededCallback();if(e){this._authenticated=true;if(a)a(true,d,\"Sys.Services.AuthenticationService.login\");if(typeof b!==\"undefined\"&&b!==null)window.location.href=b}else if(a)a(false,d,\"Sys.Services.AuthenticationService.login\")},_onLoginFailed:function(d,b){var a=b[6]||this.get_defaultFailedCallback();if(a){var c=b[7]||this.get_defaultUserContext();a(d,c,\"Sys.Services.AuthenticationService.login\")}},_onLogoutComplete:function(f,a,e){if(f!==null)throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,e,\"null\"));var b=a[0],d=a[3]||this.get_defaultUserContext(),c=a[1]||this.get_defaultLogoutCompletedCallback()||this.get_defaultSucceededCallback();this._authenticated=false;if(c)c(null,d,\"Sys.Services.AuthenticationService.logout\");if(!b)window.location.reload();else window.location.href=b},_onLogoutFailed:function(c,b){var a=b[2]||this.get_defaultFailedCallback();if(a)a(c,b[3],\"Sys.Services.AuthenticationService.logout\")},_setAuthenticated:function(a){this._authenticated=a}};Sys.Services._AuthenticationService.registerClass(\"Sys.Services._AuthenticationService\",Sys.Net.WebServiceProxy);Sys.Services.AuthenticationService=new Sys.Services._AuthenticationService;Sys.Services._RoleService=function(){Sys.Services._RoleService.initializeBase(this);this._roles=[]};Sys.Services._RoleService.DefaultWebServicePath=\"\";Sys.Services._RoleService.prototype={_defaultLoadCompletedCallback:null,_rolesIndex:null,_timeout:0,_path:\"\",get_defaultLoadCompletedCallback:function(){return this._defaultLoadCompletedCallback},set_defaultLoadCompletedCallback:function(a){this._defaultLoadCompletedCallback=a},get_path:function(){return this._path||\"\"},get_roles:function(){return Array.clone(this._roles)},isUserInRole:function(a){var b=this._get_rolesIndex()[a.trim().toLowerCase()];return !!b},load:function(a,b,c){Sys.Net.WebServiceProxy.invoke(this._get_path(),\"GetRolesForCurrentUser\",false,{},Function.createDelegate(this,this._onLoadComplete),Function.createDelegate(this,this._onLoadFailed),[a,b,c],this.get_timeout())},_get_path:function(){var a=this.get_path();if(!a||!a.length)a=Sys.Services._RoleService.DefaultWebServicePath;if(!a||!a.length)throw Error.invalidOperation(Sys.Res.servicePathNotSet);return a},_get_rolesIndex:function(){if(!this._rolesIndex){var b={};for(var a=0;a<this._roles.length;a++)b[this._roles[a].toLowerCase()]=true;this._rolesIndex=b}return this._rolesIndex},_onLoadComplete:function(a,c,f){if(a&&!(a instanceof Array))throw Error.invalidOperation(String.format(Sys.Res.webServiceInvalidReturnType,f,\"Array\"));this._roles=a;this._rolesIndex=null;var b=c[0]||this.get_defaultLoadCompletedCallback()||this.get_defaultSucceededCallback();if(b){var e=c[2]||this.get_defaultUserContext(),d=Array.clone(a);b(d,e,\"Sys.Services.RoleService.load\")}},_onLoadFailed:function(d,b){var a=b[1]||this.get_defaultFailedCallback();if(a){var c=b[2]||this.get_defaultUserContext();a(d,c,\"Sys.Services.RoleService.load\")}}};Sys.Services._RoleService.registerClass(\"Sys.Services._RoleService\",Sys.Net.WebServiceProxy);Sys.Services.RoleService=new Sys.Services._RoleService;"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxComponentModel.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxComponentModel.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxComponentModel.js\nType._registerScript(\"MicrosoftAjaxComponentModel.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.UI\");Sys.CommandEventArgs=function(c,a,b){Sys.CommandEventArgs.initializeBase(this);this._commandName=c;this._commandArgument=a;this._commandSource=b};Sys.CommandEventArgs.prototype={_commandName:null,_commandArgument:null,_commandSource:null,get_commandName:function(){return this._commandName},get_commandArgument:function(){return this._commandArgument},get_commandSource:function(){return this._commandSource}};Sys.CommandEventArgs.registerClass(\"Sys.CommandEventArgs\",Sys.CancelEventArgs);Sys.INotifyDisposing=function(){};Sys.INotifyDisposing.prototype={};Sys.INotifyDisposing.registerInterface(\"Sys.INotifyDisposing\");Sys.Component=function(){if(Sys.Application)Sys.Application.registerDisposableObject(this)};Sys.Component.prototype={_id:null,_initialized:false,_updating:false,get_events:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_id:function(){return this._id},set_id:function(a){this._id=a},get_isInitialized:function(){return this._initialized},get_isUpdating:function(){return this._updating},add_disposing:function(a){this.get_events().addHandler(\"disposing\",a)},remove_disposing:function(a){this.get_events().removeHandler(\"disposing\",a)},add_propertyChanged:function(a){this.get_events().addHandler(\"propertyChanged\",a)},remove_propertyChanged:function(a){this.get_events().removeHandler(\"propertyChanged\",a)},beginUpdate:function(){this._updating=true},dispose:function(){if(this._events){var a=this._events.getHandler(\"disposing\");if(a)a(this,Sys.EventArgs.Empty)}delete this._events;Sys.Application.unregisterDisposableObject(this);Sys.Application.removeComponent(this)},endUpdate:function(){this._updating=false;if(!this._initialized)this.initialize();this.updated()},initialize:function(){this._initialized=true},raisePropertyChanged:function(b){if(!this._events)return;var a=this._events.getHandler(\"propertyChanged\");if(a)a(this,new Sys.PropertyChangedEventArgs(b))},updated:function(){}};Sys.Component.registerClass(\"Sys.Component\",null,Sys.IDisposable,Sys.INotifyPropertyChange,Sys.INotifyDisposing);function Sys$Component$_setProperties(a,i){var d,j=Object.getType(a),e=j===Object||j===Sys.UI.DomElement,h=Sys.Component.isInstanceOfType(a)&&!a.get_isUpdating();if(h)a.beginUpdate();for(var c in i){var b=i[c],f=e?null:a[\"get_\"+c];if(e||typeof f!==\"function\"){var k=a[c];if(!b||typeof b!==\"object\"||e&&!k)a[c]=b;else Sys$Component$_setProperties(k,b)}else{var l=a[\"set_\"+c];if(typeof l===\"function\")l.apply(a,[b]);else if(b instanceof Array){d=f.apply(a);for(var g=0,m=d.length,n=b.length;g<n;g++,m++)d[m]=b[g]}else if(typeof b===\"object\"&&Object.getType(b)===Object){d=f.apply(a);Sys$Component$_setProperties(d,b)}}}if(h)a.endUpdate()}function Sys$Component$_setReferences(c,b){for(var a in b){var e=c[\"set_\"+a],d=$find(b[a]);e.apply(c,[d])}}var $create=Sys.Component.create=function(h,f,d,c,g){var a=g?new h(g):new h,b=Sys.Application,i=b.get_isCreatingComponents();a.beginUpdate();if(f)Sys$Component$_setProperties(a,f);if(d)for(var e in d)a[\"add_\"+e](d[e]);if(a.get_id())b.addComponent(a);if(i){b._createdComponents[b._createdComponents.length]=a;if(c)b._addComponentToSecondPass(a,c);else a.endUpdate()}else{if(c)Sys$Component$_setReferences(a,c);a.endUpdate()}return a};Sys.UI.MouseButton=function(){throw Error.notImplemented()};Sys.UI.MouseButton.prototype={leftButton:0,middleButton:1,rightButton:2};Sys.UI.MouseButton.registerEnum(\"Sys.UI.MouseButton\");Sys.UI.Key=function(){throw Error.notImplemented()};Sys.UI.Key.prototype={backspace:8,tab:9,enter:13,esc:27,space:32,pageUp:33,pageDown:34,end:35,home:36,left:37,up:38,right:39,down:40,del:127};Sys.UI.Key.registerEnum(\"Sys.UI.Key\");Sys.UI.Point=function(a,b){this.rawX=a;this.rawY=b;this.x=Math.round(a);this.y=Math.round(b)};Sys.UI.Point.registerClass(\"Sys.UI.Point\");Sys.UI.Bounds=function(c,d,b,a){this.x=c;this.y=d;this.height=a;this.width=b};Sys.UI.Bounds.registerClass(\"Sys.UI.Bounds\");Sys.UI.DomEvent=function(e){var a=e,b=this.type=a.type.toLowerCase();this.rawEvent=a;this.altKey=a.altKey;if(typeof a.button!==\"undefined\")this.button=typeof a.which!==\"undefined\"?a.button:a.button===4?Sys.UI.MouseButton.middleButton:a.button===2?Sys.UI.MouseButton.rightButton:Sys.UI.MouseButton.leftButton;if(b===\"keypress\")this.charCode=a.charCode||a.keyCode;else if(a.keyCode&&a.keyCode===46)this.keyCode=127;else this.keyCode=a.keyCode;this.clientX=a.clientX;this.clientY=a.clientY;this.ctrlKey=a.ctrlKey;this.target=a.target?a.target:a.srcElement;if(!b.startsWith(\"key\"))if(typeof a.offsetX!==\"undefined\"&&typeof a.offsetY!==\"undefined\"){this.offsetX=a.offsetX;this.offsetY=a.offsetY}else if(this.target&&this.target.nodeType!==3&&typeof a.clientX===\"number\"){var c=Sys.UI.DomElement.getLocation(this.target),d=Sys.UI.DomElement._getWindow(this.target);this.offsetX=(d.pageXOffset||0)+a.clientX-c.x;this.offsetY=(d.pageYOffset||0)+a.clientY-c.y}this.screenX=a.screenX;this.screenY=a.screenY;this.shiftKey=a.shiftKey};Sys.UI.DomEvent.prototype={preventDefault:function(){if(this.rawEvent.preventDefault)this.rawEvent.preventDefault();else if(window.event)this.rawEvent.returnValue=false},stopPropagation:function(){if(this.rawEvent.stopPropagation)this.rawEvent.stopPropagation();else if(window.event)this.rawEvent.cancelBubble=true}};Sys.UI.DomEvent.registerClass(\"Sys.UI.DomEvent\");var $addHandler=Sys.UI.DomEvent.addHandler=function(a,d,e,g){if(!a._events)a._events={};var c=a._events[d];if(!c)a._events[d]=c=[];var b;if(a.addEventListener){b=function(b){return e.call(a,new Sys.UI.DomEvent(b))};a.addEventListener(d,b,false)}else if(a.attachEvent){b=function(){var b={};try{b=Sys.UI.DomElement._getWindow(a).event}catch(c){}return e.call(a,new Sys.UI.DomEvent(b))};a.attachEvent(\"on\"+d,b)}c[c.length]={handler:e,browserHandler:b,autoRemove:g};if(g){var f=a.dispose;if(f!==Sys.UI.DomEvent._disposeHandlers){a.dispose=Sys.UI.DomEvent._disposeHandlers;if(typeof f!==\"undefined\")a._chainDispose=f}}},$addHandlers=Sys.UI.DomEvent.addHandlers=function(f,d,c,e){for(var b in d){var a=d[b];if(c)a=Function.createDelegate(c,a);$addHandler(f,b,a,e||false)}},$clearHandlers=Sys.UI.DomEvent.clearHandlers=function(a){Sys.UI.DomEvent._clearHandlers(a,false)};Sys.UI.DomEvent._clearHandlers=function(a,g){if(a._events){var e=a._events;for(var b in e){var d=e[b];for(var c=d.length-1;c>=0;c--){var f=d[c];if(!g||f.autoRemove)$removeHandler(a,b,f.handler)}}a._events=null}};Sys.UI.DomEvent._disposeHandlers=function(){Sys.UI.DomEvent._clearHandlers(this,true);var b=this._chainDispose,a=typeof b;if(a!==\"undefined\"){this.dispose=b;this._chainDispose=null;if(a===\"function\")this.dispose()}};var $removeHandler=Sys.UI.DomEvent.removeHandler=function(b,a,c){Sys.UI.DomEvent._removeHandler(b,a,c)};Sys.UI.DomEvent._removeHandler=function(a,e,f){var d=null,c=a._events[e];for(var b=0,g=c.length;b<g;b++)if(c[b].handler===f){d=c[b].browserHandler;break}if(a.removeEventListener)a.removeEventListener(e,d,false);else if(a.detachEvent)a.detachEvent(\"on\"+e,d);c.splice(b,1)};Sys.UI.DomElement=function(){};Sys.UI.DomElement.registerClass(\"Sys.UI.DomElement\");Sys.UI.DomElement.addCssClass=function(a,b){if(!Sys.UI.DomElement.containsCssClass(a,b))if(a.className===\"\")a.className=b;else a.className+=\" \"+b};Sys.UI.DomElement.containsCssClass=function(b,a){return Array.contains(b.className.split(\" \"),a)};Sys.UI.DomElement.getBounds=function(a){var b=Sys.UI.DomElement.getLocation(a);return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)};var $get=Sys.UI.DomElement.getElementById=function(f,e){if(!e)return document.getElementById(f);if(e.getElementById)return e.getElementById(f);var c=[],d=e.childNodes;for(var b=0;b<d.length;b++){var a=d[b];if(a.nodeType==1)c[c.length]=a}while(c.length){a=c.shift();if(a.id==f)return a;d=a.childNodes;for(b=0;b<d.length;b++){a=d[b];if(a.nodeType==1)c[c.length]=a}}return null};if(document.documentElement.getBoundingClientRect)Sys.UI.DomElement.getLocation=function(a){if(a.self||a.nodeType===9||a===document.documentElement||a.parentNode===a.ownerDocument.documentElement)return new Sys.UI.Point(0,0);var f=a.getBoundingClientRect();if(!f)return new Sys.UI.Point(0,0);var e=a.ownerDocument.documentElement,h=a.ownerDocument.body,l,c=Math.round(f.left)+(e.scrollLeft||h.scrollLeft),d=Math.round(f.top)+(e.scrollTop||h.scrollTop);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){try{var g=a.ownerDocument.parentWindow.frameElement||null;if(g){var i=g.frameBorder===\"0\"||g.frameBorder===\"no\"?2:0;c+=i;d+=i}}catch(m){}if(Sys.Browser.version===7&&!document.documentMode){var j=document.body,k=j.getBoundingClientRect(),b=(k.right-k.left)/j.clientWidth;b=Math.round(b*100);b=(b-b%5)/100;if(!isNaN(b)&&b!==1){c=Math.round(c/b);d=Math.round(d/b)}}if((document.documentMode||0)<8){c-=e.clientLeft;d-=e.clientTop}}return new Sys.UI.Point(c,d)};else if(Sys.Browser.agent===Sys.Browser.Safari)Sys.UI.DomElement.getLocation=function(c){if(c.window&&c.window===c||c.nodeType===9)return new Sys.UI.Point(0,0);var d=0,e=0,a,j=null,g=null,b;for(a=c;a;j=a,(g=b,a=a.offsetParent)){b=Sys.UI.DomElement._getCurrentStyle(a);var f=a.tagName?a.tagName.toUpperCase():null;if((a.offsetLeft||a.offsetTop)&&(f!==\"BODY\"||(!g||g.position!==\"absolute\"))){d+=a.offsetLeft;e+=a.offsetTop}if(j&&Sys.Browser.version>=3){d+=parseInt(b.borderLeftWidth);e+=parseInt(b.borderTopWidth)}}b=Sys.UI.DomElement._getCurrentStyle(c);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=c.parentNode;a;a=a.parentNode){f=a.tagName?a.tagName.toUpperCase():null;if(f!==\"BODY\"&&f!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){d-=a.scrollLeft||0;e-=a.scrollTop||0}b=Sys.UI.DomElement._getCurrentStyle(a);var i=b?b.position:null;if(i&&i===\"absolute\")break}return new Sys.UI.Point(d,e)};else Sys.UI.DomElement.getLocation=function(d){if(d.window&&d.window===d||d.nodeType===9)return new Sys.UI.Point(0,0);var e=0,f=0,a,i=null,g=null,b=null;for(a=d;a;i=a,(g=b,a=a.offsetParent)){var c=a.tagName?a.tagName.toUpperCase():null;b=Sys.UI.DomElement._getCurrentStyle(a);if((a.offsetLeft||a.offsetTop)&&!(c===\"BODY\"&&(!g||g.position!==\"absolute\"))){e+=a.offsetLeft;f+=a.offsetTop}if(i!==null&&b){if(c!==\"TABLE\"&&c!==\"TD\"&&c!==\"HTML\"){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}if(c===\"TABLE\"&&(b.position===\"relative\"||b.position===\"absolute\")){e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}}b=Sys.UI.DomElement._getCurrentStyle(d);var h=b?b.position:null;if(!h||h!==\"absolute\")for(a=d.parentNode;a;a=a.parentNode){c=a.tagName?a.tagName.toUpperCase():null;if(c!==\"BODY\"&&c!==\"HTML\"&&(a.scrollLeft||a.scrollTop)){e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);if(b){e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}}}return new Sys.UI.Point(e,f)};Sys.UI.DomElement.isDomElement=function(a){return Sys._isDomElement(a)};Sys.UI.DomElement.removeCssClass=function(d,c){var a=\" \"+d.className+\" \",b=a.indexOf(\" \"+c+\" \");if(b>=0)d.className=(a.substr(0,b)+\" \"+a.substring(b+c.length+1,a.length)).trim()};Sys.UI.DomElement.resolveElement=function(b,c){var a=b;if(!a)return null;if(typeof a===\"string\")a=Sys.UI.DomElement.getElementById(a,c);return a};Sys.UI.DomElement.raiseBubbleEvent=function(c,d){var b=c;while(b){var a=b.control;if(a&&a.onBubbleEvent&&a.raiseBubbleEvent){Sys.UI.DomElement._raiseBubbleEventFromControl(a,c,d);return}b=b.parentNode}};Sys.UI.DomElement._raiseBubbleEventFromControl=function(a,b,c){if(!a.onBubbleEvent(b,c))a._raiseBubbleEvent(b,c)};Sys.UI.DomElement.setLocation=function(b,c,d){var a=b.style;a.position=\"absolute\";a.left=c+\"px\";a.top=d+\"px\"};Sys.UI.DomElement.toggleCssClass=function(b,a){if(Sys.UI.DomElement.containsCssClass(b,a))Sys.UI.DomElement.removeCssClass(b,a);else Sys.UI.DomElement.addCssClass(b,a)};Sys.UI.DomElement.getVisibilityMode=function(a){return a._visibilityMode===Sys.UI.VisibilityMode.hide?Sys.UI.VisibilityMode.hide:Sys.UI.VisibilityMode.collapse};Sys.UI.DomElement.setVisibilityMode=function(a,b){Sys.UI.DomElement._ensureOldDisplayMode(a);if(a._visibilityMode!==b){a._visibilityMode=b;if(Sys.UI.DomElement.getVisible(a)===false)if(a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\";a._visibilityMode=b}};Sys.UI.DomElement.getVisible=function(b){var a=b.currentStyle||Sys.UI.DomElement._getCurrentStyle(b);if(!a)return true;return a.visibility!==\"hidden\"&&a.display!==\"none\"};Sys.UI.DomElement.setVisible=function(a,b){if(b!==Sys.UI.DomElement.getVisible(a)){Sys.UI.DomElement._ensureOldDisplayMode(a);a.style.visibility=b?\"visible\":\"hidden\";if(b||a._visibilityMode===Sys.UI.VisibilityMode.hide)a.style.display=a._oldDisplayMode;else a.style.display=\"none\"}};Sys.UI.DomElement._ensureOldDisplayMode=function(a){if(!a._oldDisplayMode){var b=a.currentStyle||Sys.UI.DomElement._getCurrentStyle(a);a._oldDisplayMode=b?b.display:null;if(!a._oldDisplayMode||a._oldDisplayMode===\"none\")switch(a.tagName.toUpperCase()){case \"DIV\":case \"P\":case \"ADDRESS\":case \"BLOCKQUOTE\":case \"BODY\":case \"COL\":case \"COLGROUP\":case \"DD\":case \"DL\":case \"DT\":case \"FIELDSET\":case \"FORM\":case \"H1\":case \"H2\":case \"H3\":case \"H4\":case \"H5\":case \"H6\":case \"HR\":case \"IFRAME\":case \"LEGEND\":case \"OL\":case \"PRE\":case \"TABLE\":case \"TD\":case \"TH\":case \"TR\":case \"UL\":a._oldDisplayMode=\"block\";break;case \"LI\":a._oldDisplayMode=\"list-item\";break;default:a._oldDisplayMode=\"inline\"}}};Sys.UI.DomElement._getWindow=function(a){var b=a.ownerDocument||a.document||a;return b.defaultView||b.parentWindow};Sys.UI.DomElement._getCurrentStyle=function(a){if(a.nodeType===3)return null;var c=Sys.UI.DomElement._getWindow(a);if(a.documentElement)a=a.documentElement;var b=c&&a!==c&&c.getComputedStyle?c.getComputedStyle(a,null):a.currentStyle||a.style;if(!b&&Sys.Browser.agent===Sys.Browser.Safari&&a.style){var g=a.style.display,f=a.style.position;a.style.position=\"absolute\";a.style.display=\"block\";var e=c.getComputedStyle(a,null);a.style.display=g;a.style.position=f;b={};for(var d in e)b[d]=e[d];b.display=\"none\"}return b};Sys.IContainer=function(){};Sys.IContainer.prototype={};Sys.IContainer.registerInterface(\"Sys.IContainer\");Sys.ApplicationLoadEventArgs=function(b,a){Sys.ApplicationLoadEventArgs.initializeBase(this);this._components=b;this._isPartialLoad=a};Sys.ApplicationLoadEventArgs.prototype={get_components:function(){return this._components},get_isPartialLoad:function(){return this._isPartialLoad}};Sys.ApplicationLoadEventArgs.registerClass(\"Sys.ApplicationLoadEventArgs\",Sys.EventArgs);Sys._Application=function(){Sys._Application.initializeBase(this);this._disposableObjects=[];this._components={};this._createdComponents=[];this._secondPassComponents=[];this._unloadHandlerDelegate=Function.createDelegate(this,this._unloadHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._unloadHandlerDelegate);this._domReady()};Sys._Application.prototype={_creatingComponents:false,_disposing:false,_deleteCount:0,get_isCreatingComponents:function(){return this._creatingComponents},get_isDisposing:function(){return this._disposing},add_init:function(a){if(this._initialized)a(this,Sys.EventArgs.Empty);else this.get_events().addHandler(\"init\",a)},remove_init:function(a){this.get_events().removeHandler(\"init\",a)},add_load:function(a){this.get_events().addHandler(\"load\",a)},remove_load:function(a){this.get_events().removeHandler(\"load\",a)},add_unload:function(a){this.get_events().addHandler(\"unload\",a)},remove_unload:function(a){this.get_events().removeHandler(\"unload\",a)},addComponent:function(a){this._components[a.get_id()]=a},beginCreateComponents:function(){this._creatingComponents=true},dispose:function(){if(!this._disposing){this._disposing=true;if(this._timerCookie){window.clearTimeout(this._timerCookie);delete this._timerCookie}if(this._endRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(this._endRequestHandler);delete this._endRequestHandler}if(this._beginRequestHandler){Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(this._beginRequestHandler);delete this._beginRequestHandler}if(window.pageUnload)window.pageUnload(this,Sys.EventArgs.Empty);var c=this.get_events().getHandler(\"unload\");if(c)c(this,Sys.EventArgs.Empty);var b=Array.clone(this._disposableObjects);for(var a=0,f=b.length;a<f;a++){var d=b[a];if(typeof d!==\"undefined\")d.dispose()}Array.clear(this._disposableObjects);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._unloadHandlerDelegate);if(Sys._ScriptLoader){var e=Sys._ScriptLoader.getInstance();if(e)e.dispose()}Sys._Application.callBaseMethod(this,\"dispose\")}},disposeElement:function(c,j){if(c.nodeType===1){var b,h=c.getElementsByTagName(\"*\"),g=h.length,i=new Array(g);for(b=0;b<g;b++)i[b]=h[b];for(b=g-1;b>=0;b--){var d=i[b],f=d.dispose;if(f&&typeof f===\"function\")d.dispose();else{var e=d.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=d._behaviors;if(a)this._disposeComponents(a);a=d._components;if(a){this._disposeComponents(a);d._components=null}}if(!j){var f=c.dispose;if(f&&typeof f===\"function\")c.dispose();else{var e=c.control;if(e&&typeof e.dispose===\"function\")e.dispose()}var a=c._behaviors;if(a)this._disposeComponents(a);a=c._components;if(a){this._disposeComponents(a);c._components=null}}}},endCreateComponents:function(){var b=this._secondPassComponents;for(var a=0,d=b.length;a<d;a++){var c=b[a].component;Sys$Component$_setReferences(c,b[a].references);c.endUpdate()}this._secondPassComponents=[];this._creatingComponents=false},findComponent:function(b,a){return a?Sys.IContainer.isInstanceOfType(a)?a.findComponent(b):a[b]||null:Sys.Application._components[b]||null},getComponents:function(){var a=[],b=this._components;for(var c in b)a[a.length]=b[c];return a},initialize:function(){if(!this.get_isInitialized()&&!this._disposing){Sys._Application.callBaseMethod(this,\"initialize\");this._raiseInit();if(this.get_stateString){if(Sys.WebForms&&Sys.WebForms.PageRequestManager){this._beginRequestHandler=Function.createDelegate(this,this._onPageRequestManagerBeginRequest);Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);this._endRequestHandler=Function.createDelegate(this,this._onPageRequestManagerEndRequest);Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler)}var a=this.get_stateString();if(a!==this._currentEntry)this._navigate(a);else this._ensureHistory()}this.raiseLoad()}},notifyScriptLoaded:function(){},registerDisposableObject:function(b){if(!this._disposing){var a=this._disposableObjects,c=a.length;a[c]=b;b.__msdisposeindex=c}},raiseLoad:function(){var b=this.get_events().getHandler(\"load\"),a=new Sys.ApplicationLoadEventArgs(Array.clone(this._createdComponents),!!this._loaded);this._loaded=true;if(b)b(this,a);if(window.pageLoad)window.pageLoad(this,a);this._createdComponents=[]},removeComponent:function(b){var a=b.get_id();if(a)delete this._components[a]},unregisterDisposableObject:function(a){if(!this._disposing){var e=a.__msdisposeindex;if(typeof e===\"number\"){var b=this._disposableObjects;delete b[e];delete a.__msdisposeindex;if(++this._deleteCount>1000){var c=[];for(var d=0,f=b.length;d<f;d++){a=b[d];if(typeof a!==\"undefined\"){a.__msdisposeindex=c.length;c.push(a)}}this._disposableObjects=c;this._deleteCount=0}}}},_addComponentToSecondPass:function(b,a){this._secondPassComponents[this._secondPassComponents.length]={component:b,references:a}},_disposeComponents:function(a){if(a)for(var b=a.length-1;b>=0;b--){var c=a[b];if(typeof c.dispose===\"function\")c.dispose()}},_domReady:function(){var a,g,f=this;function b(){f.initialize()}var c=function(){Sys.UI.DomEvent.removeHandler(window,\"load\",c);b()};Sys.UI.DomEvent.addHandler(window,\"load\",c);if(document.addEventListener)try{document.addEventListener(\"DOMContentLoaded\",a=function(){document.removeEventListener(\"DOMContentLoaded\",a,false);b()},false)}catch(h){}else if(document.attachEvent)if(window==window.top&&document.documentElement.doScroll){var e,d=document.createElement(\"div\");a=function(){try{d.doScroll(\"left\")}catch(c){e=window.setTimeout(a,0);return}d=null;b()};a()}else document.attachEvent(\"onreadystatechange\",a=function(){if(document.readyState===\"complete\"){document.detachEvent(\"onreadystatechange\",a);b()}})},_raiseInit:function(){var a=this.get_events().getHandler(\"init\");if(a){this.beginCreateComponents();a(this,Sys.EventArgs.Empty);this.endCreateComponents()}},_unloadHandler:function(){this.dispose()}};Sys._Application.registerClass(\"Sys._Application\",Sys.Component,Sys.IContainer);Sys.Application=new Sys._Application;var $find=Sys.Application.findComponent;Sys.UI.Behavior=function(b){Sys.UI.Behavior.initializeBase(this);this._element=b;var a=b._behaviors;if(!a)b._behaviors=[this];else a[a.length]=this};Sys.UI.Behavior.prototype={_name:null,get_element:function(){return this._element},get_id:function(){var a=Sys.UI.Behavior.callBaseMethod(this,\"get_id\");if(a)return a;if(!this._element||!this._element.id)return \"\";return this._element.id+\"$\"+this.get_name()},get_name:function(){if(this._name)return this._name;var a=Object.getTypeName(this),b=a.lastIndexOf(\".\");if(b!==-1)a=a.substr(b+1);if(!this.get_isInitialized())this._name=a;return a},set_name:function(a){this._name=a},initialize:function(){Sys.UI.Behavior.callBaseMethod(this,\"initialize\");var a=this.get_name();if(a)this._element[a]=this},dispose:function(){Sys.UI.Behavior.callBaseMethod(this,\"dispose\");var a=this._element;if(a){var c=this.get_name();if(c)a[c]=null;var b=a._behaviors;Array.remove(b,this);if(b.length===0)a._behaviors=null;delete this._element}}};Sys.UI.Behavior.registerClass(\"Sys.UI.Behavior\",Sys.Component);Sys.UI.Behavior.getBehaviorByName=function(b,c){var a=b[c];return a&&Sys.UI.Behavior.isInstanceOfType(a)?a:null};Sys.UI.Behavior.getBehaviors=function(a){if(!a._behaviors)return [];return Array.clone(a._behaviors)};Sys.UI.Behavior.getBehaviorsByType=function(d,e){var a=d._behaviors,c=[];if(a)for(var b=0,f=a.length;b<f;b++)if(e.isInstanceOfType(a[b]))c[c.length]=a[b];return c};Sys.UI.VisibilityMode=function(){throw Error.notImplemented()};Sys.UI.VisibilityMode.prototype={hide:0,collapse:1};Sys.UI.VisibilityMode.registerEnum(\"Sys.UI.VisibilityMode\");Sys.UI.Control=function(a){Sys.UI.Control.initializeBase(this);this._element=a;a.control=this;var b=this.get_role();if(b)a.setAttribute(\"role\",b)};Sys.UI.Control.prototype={_parent:null,_visibilityMode:Sys.UI.VisibilityMode.hide,get_element:function(){return this._element},get_id:function(){if(!this._element)return \"\";return this._element.id},set_id:function(){throw Error.invalidOperation(Sys.Res.cantSetId)},get_parent:function(){if(this._parent)return this._parent;if(!this._element)return null;var a=this._element.parentNode;while(a){if(a.control)return a.control;a=a.parentNode}return null},set_parent:function(a){this._parent=a},get_role:function(){return null},get_visibilityMode:function(){return Sys.UI.DomElement.getVisibilityMode(this._element)},set_visibilityMode:function(a){Sys.UI.DomElement.setVisibilityMode(this._element,a)},get_visible:function(){return Sys.UI.DomElement.getVisible(this._element)},set_visible:function(a){Sys.UI.DomElement.setVisible(this._element,a)},addCssClass:function(a){Sys.UI.DomElement.addCssClass(this._element,a)},dispose:function(){Sys.UI.Control.callBaseMethod(this,\"dispose\");if(this._element){this._element.control=null;delete this._element}if(this._parent)delete this._parent},onBubbleEvent:function(){return false},raiseBubbleEvent:function(a,b){this._raiseBubbleEvent(a,b)},_raiseBubbleEvent:function(b,c){var a=this.get_parent();while(a){if(a.onBubbleEvent(b,c))return;a=a.get_parent()}},removeCssClass:function(a){Sys.UI.DomElement.removeCssClass(this._element,a)},toggleCssClass:function(a){Sys.UI.DomElement.toggleCssClass(this._element,a)}};Sys.UI.Control.registerClass(\"Sys.UI.Control\",Sys.Component);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxCore.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxCore.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxCore.js\nFunction.__typeName=\"Function\";Function.__class=true;Function.createCallback=function(b,a){return function(){var e=arguments.length;if(e>0){var d=[];for(var c=0;c<e;c++)d[c]=arguments[c];d[e]=a;return b.apply(this,d)}return b.call(this,a)}};Function.createDelegate=function(a,b){return function(){return b.apply(a,arguments)}};Function.emptyFunction=Function.emptyMethod=function(){};Function.validateParameters=function(c,b,a){return Function._validateParams(c,b,a)};Function._validateParams=function(g,e,c){var a,d=e.length;c=c||typeof c===\"undefined\";a=Function._validateParameterCount(g,e,c);if(a){a.popStackFrame();return a}for(var b=0,i=g.length;b<i;b++){var f=e[Math.min(b,d-1)],h=f.name;if(f.parameterArray)h+=\"[\"+(b-d+1)+\"]\";else if(!c&&b>=d)break;a=Function._validateParameter(g[b],f,h);if(a){a.popStackFrame();return a}}return null};Function._validateParameterCount=function(j,d,i){var a,c,b=d.length,e=j.length;if(e<b){var f=b;for(a=0;a<b;a++){var g=d[a];if(g.optional||g.parameterArray)f--}if(e<f)c=true}else if(i&&e>b){c=true;for(a=0;a<b;a++)if(d[a].parameterArray){c=false;break}}if(c){var h=Error.parameterCount();h.popStackFrame();return h}return null};Function._validateParameter=function(c,a,h){var b,g=a.type,l=!!a.integer,k=!!a.domElement,m=!!a.mayBeNull;b=Function._validateParameterType(c,g,l,k,m,h);if(b){b.popStackFrame();return b}var e=a.elementType,f=!!a.elementMayBeNull;if(g===Array&&typeof c!==\"undefined\"&&c!==null&&(e||!f)){var j=!!a.elementInteger,i=!!a.elementDomElement;for(var d=0;d<c.length;d++){var n=c[d];b=Function._validateParameterType(n,e,j,i,f,h+\"[\"+d+\"]\");if(b){b.popStackFrame();return b}}}return null};Function._validateParameterType=function(b,c,k,j,h,d){var a,g;if(typeof b===\"undefined\")if(h)return null;else{a=Error.argumentUndefined(d);a.popStackFrame();return a}if(b===null)if(h)return null;else{a=Error.argumentNull(d);a.popStackFrame();return a}if(c&&c.__enum){if(typeof b!==\"number\"){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(b%1===0){var e=c.prototype;if(!c.__flags||b===0){for(g in e)if(e[g]===b)return null}else{var i=b;for(g in e){var f=e[g];if(f===0)continue;if((f&b)===f)i-=f;if(i===0)return null}}}a=Error.argumentOutOfRange(d,b,String.format(Sys.Res.enumInvalidValue,b,c.getName()));a.popStackFrame();return a}if(j&&(!Sys._isDomElement(b)||b.nodeType===3)){a=Error.argument(d,Sys.Res.argumentDomElement);a.popStackFrame();return a}if(c&&!Sys._isInstanceOfType(c,b)){a=Error.argumentType(d,Object.getType(b),c);a.popStackFrame();return a}if(c===Number&&k)if(b%1!==0){a=Error.argumentOutOfRange(d,b,Sys.Res.argumentInteger);a.popStackFrame();return a}return null};Error.__typeName=\"Error\";Error.__class=true;Error.create=function(d,b){var a=new Error(d);a.message=d;if(b)for(var c in b)a[c]=b[c];a.popStackFrame();return a};Error.argument=function(a,c){var b=\"Sys.ArgumentException: \"+(c?c:Sys.Res.argument);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentException\",paramName:a});d.popStackFrame();return d};Error.argumentNull=function(a,c){var b=\"Sys.ArgumentNullException: \"+(c?c:Sys.Res.argumentNull);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentNullException\",paramName:a});d.popStackFrame();return d};Error.argumentOutOfRange=function(c,a,d){var b=\"Sys.ArgumentOutOfRangeException: \"+(d?d:Sys.Res.argumentOutOfRange);if(c)b+=\"\\n\"+String.format(Sys.Res.paramName,c);if(typeof a!==\"undefined\"&&a!==null)b+=\"\\n\"+String.format(Sys.Res.actualValue,a);var e=Error.create(b,{name:\"Sys.ArgumentOutOfRangeException\",paramName:c,actualValue:a});e.popStackFrame();return e};Error.argumentType=function(d,c,b,e){var a=\"Sys.ArgumentTypeException: \";if(e)a+=e;else if(c&&b)a+=String.format(Sys.Res.argumentTypeWithTypes,c.getName(),b.getName());else a+=Sys.Res.argumentType;if(d)a+=\"\\n\"+String.format(Sys.Res.paramName,d);var f=Error.create(a,{name:\"Sys.ArgumentTypeException\",paramName:d,actualType:c,expectedType:b});f.popStackFrame();return f};Error.argumentUndefined=function(a,c){var b=\"Sys.ArgumentUndefinedException: \"+(c?c:Sys.Res.argumentUndefined);if(a)b+=\"\\n\"+String.format(Sys.Res.paramName,a);var d=Error.create(b,{name:\"Sys.ArgumentUndefinedException\",paramName:a});d.popStackFrame();return d};Error.format=function(a){var c=\"Sys.FormatException: \"+(a?a:Sys.Res.format),b=Error.create(c,{name:\"Sys.FormatException\"});b.popStackFrame();return b};Error.invalidOperation=function(a){var c=\"Sys.InvalidOperationException: \"+(a?a:Sys.Res.invalidOperation),b=Error.create(c,{name:\"Sys.InvalidOperationException\"});b.popStackFrame();return b};Error.notImplemented=function(a){var c=\"Sys.NotImplementedException: \"+(a?a:Sys.Res.notImplemented),b=Error.create(c,{name:\"Sys.NotImplementedException\"});b.popStackFrame();return b};Error.parameterCount=function(a){var c=\"Sys.ParameterCountException: \"+(a?a:Sys.Res.parameterCount),b=Error.create(c,{name:\"Sys.ParameterCountException\"});b.popStackFrame();return b};Error.prototype.popStackFrame=function(){if(typeof this.stack===\"undefined\"||this.stack===null||typeof this.fileName===\"undefined\"||this.fileName===null||typeof this.lineNumber===\"undefined\"||this.lineNumber===null)return;var a=this.stack.split(\"\\n\"),c=a[0],e=this.fileName+\":\"+this.lineNumber;while(typeof c!==\"undefined\"&&c!==null&&c.indexOf(e)===-1){a.shift();c=a[0]}var d=a[1];if(typeof d===\"undefined\"||d===null)return;var b=d.match(/@(.*):(\\d+)$/);if(typeof b===\"undefined\"||b===null)return;this.fileName=b[1];this.lineNumber=parseInt(b[2]);a.shift();this.stack=a.join(\"\\n\")};Object.__typeName=\"Object\";Object.__class=true;Object.getType=function(b){var a=b.constructor;if(!a||typeof a!==\"function\"||!a.__typeName||a.__typeName===\"Object\")return Object;return a};Object.getTypeName=function(a){return Object.getType(a).getName()};String.__typeName=\"String\";String.__class=true;String.prototype.endsWith=function(a){return this.substr(this.length-a.length)===a};String.prototype.startsWith=function(a){return this.substr(0,a.length)===a};String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")};String.prototype.trimEnd=function(){return this.replace(/\\s+$/,\"\")};String.prototype.trimStart=function(){return this.replace(/^\\s+/,\"\")};String.format=function(){return String._toFormattedString(false,arguments)};String._toFormattedString=function(l,j){var c=\"\",e=j[0];for(var a=0;true;){var f=e.indexOf(\"{\",a),d=e.indexOf(\"}\",a);if(f<0&&d<0){c+=e.slice(a);break}if(d>0&&(d<f||f<0)){c+=e.slice(a,d+1);a=d+2;continue}c+=e.slice(a,f);a=f+1;if(e.charAt(a)===\"{\"){c+=\"{\";a++;continue}if(d<0)break;var h=e.substring(a,d),g=h.indexOf(\":\"),k=parseInt(g<0?h:h.substring(0,g),10)+1,i=g<0?\"\":h.substring(g+1),b=j[k];if(typeof b===\"undefined\"||b===null)b=\"\";if(b.toFormattedString)c+=b.toFormattedString(i);else if(l&&b.localeFormat)c+=b.localeFormat(i);else if(b.format)c+=b.format(i);else c+=b.toString();a=d+1}return c};Boolean.__typeName=\"Boolean\";Boolean.__class=true;Boolean.parse=function(b){var a=b.trim().toLowerCase();if(a===\"false\")return false;if(a===\"true\")return true};Date.__typeName=\"Date\";Date.__class=true;Number.__typeName=\"Number\";Number.__class=true;RegExp.__typeName=\"RegExp\";RegExp.__class=true;if(!window)this.window=this;window.Type=Function;Type.prototype.callBaseMethod=function(a,d,b){var c=Sys._getBaseMethod(this,a,d);if(!b)return c.apply(a);else return c.apply(a,b)};Type.prototype.getBaseMethod=function(a,b){return Sys._getBaseMethod(this,a,b)};Type.prototype.getBaseType=function(){return typeof this.__baseType===\"undefined\"?null:this.__baseType};Type.prototype.getInterfaces=function(){var a=[],b=this;while(b){var c=b.__interfaces;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Array.contains(a,e))a[a.length]=e}b=b.__baseType}return a};Type.prototype.getName=function(){return typeof this.__typeName===\"undefined\"?\"\":this.__typeName};Type.prototype.implementsInterface=function(d){this.resolveInheritance();var c=d.getName(),a=this.__interfaceCache;if(a){var e=a[c];if(typeof e!==\"undefined\")return e}else a=this.__interfaceCache={};var b=this;while(b){var f=b.__interfaces;if(f)if(Array.indexOf(f,d)!==-1)return a[c]=true;b=b.__baseType}return a[c]=false};Type.prototype.inheritsFrom=function(b){this.resolveInheritance();var a=this.__baseType;while(a){if(a===b)return true;a=a.__baseType}return false};Type.prototype.initializeBase=function(a,b){this.resolveInheritance();if(this.__baseType)if(!b)this.__baseType.apply(a);else this.__baseType.apply(a,b);return a};Type.prototype.isImplementedBy=function(a){if(typeof a===\"undefined\"||a===null)return false;var b=Object.getType(a);return !!(b.implementsInterface&&b.implementsInterface(this))};Type.prototype.isInstanceOfType=function(a){return Sys._isInstanceOfType(this,a)};Type.prototype.registerClass=function(c,b,d){this.prototype.constructor=this;this.__typeName=c;this.__class=true;if(b){this.__baseType=b;this.__basePrototypePending=true}Sys.__upperCaseTypes[c.toUpperCase()]=this;if(d){this.__interfaces=[];for(var a=2,f=arguments.length;a<f;a++){var e=arguments[a];this.__interfaces.push(e)}}return this};Type.prototype.registerInterface=function(a){Sys.__upperCaseTypes[a.toUpperCase()]=this;this.prototype.constructor=this;this.__typeName=a;this.__interface=true;return this};Type.prototype.resolveInheritance=function(){if(this.__basePrototypePending){var b=this.__baseType;b.resolveInheritance();for(var a in b.prototype){var c=b.prototype[a];if(!this.prototype[a])this.prototype[a]=c}delete this.__basePrototypePending}};Type.getRootNamespaces=function(){return Array.clone(Sys.__rootNamespaces)};Type.isClass=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__class};Type.isInterface=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__interface};Type.isNamespace=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__namespace};Type.parse=function(typeName,ns){var fn;if(ns){fn=Sys.__upperCaseTypes[ns.getName().toUpperCase()+\".\"+typeName.toUpperCase()];return fn||null}if(!typeName)return null;if(!Type.__htClasses)Type.__htClasses={};fn=Type.__htClasses[typeName];if(!fn){fn=eval(typeName);Type.__htClasses[typeName]=fn}return fn};Type.registerNamespace=function(e){var d=window,c=e.split(\".\");for(var b=0;b<c.length;b++){var f=c[b],a=d[f];if(!a)a=d[f]={};if(!a.__namespace){if(b===0&&e!==\"Sys\")Sys.__rootNamespaces[Sys.__rootNamespaces.length]=a;a.__namespace=true;a.__typeName=c.slice(0,b+1).join(\".\");a.getName=function(){return this.__typeName}}d=a}};Type._checkDependency=function(c,a){var d=Type._registerScript._scripts,b=d?!!d[c]:false;if(typeof a!==\"undefined\"&&!b)throw Error.invalidOperation(String.format(Sys.Res.requiredScriptReferenceNotIncluded,a,c));return b};Type._registerScript=function(a,c){var b=Type._registerScript._scripts;if(!b)Type._registerScript._scripts=b={};if(b[a])throw Error.invalidOperation(String.format(Sys.Res.scriptAlreadyLoaded,a));b[a]=true;if(c)for(var d=0,f=c.length;d<f;d++){var e=c[d];if(!Type._checkDependency(e))throw Error.invalidOperation(String.format(Sys.Res.scriptDependencyNotFound,a,e))}};Type.registerNamespace(\"Sys\");Sys.__upperCaseTypes={};Sys.__rootNamespaces=[Sys];Sys._isInstanceOfType=function(c,b){if(typeof b===\"undefined\"||b===null)return false;if(b instanceof c)return true;var a=Object.getType(b);return !!(a===c)||a.inheritsFrom&&a.inheritsFrom(c)||a.implementsInterface&&a.implementsInterface(c)};Sys._getBaseMethod=function(d,e,c){var b=d.getBaseType();if(b){var a=b.prototype[c];return a instanceof Function?a:null}return null};Sys._isDomElement=function(a){var c=false;if(typeof a.nodeType!==\"number\"){var b=a.ownerDocument||a.document||a;if(b!=a){var d=b.defaultView||b.parentWindow;c=d!=a}else c=typeof b.body===\"undefined\"}return !c};Array.__typeName=\"Array\";Array.__class=true;Array.add=Array.enqueue=function(a,b){a[a.length]=b};Array.addRange=function(a,b){a.push.apply(a,b)};Array.clear=function(a){a.length=0};Array.clone=function(a){if(a.length===1)return [a[0]];else return Array.apply(null,a)};Array.contains=function(a,b){return Sys._indexOf(a,b)>=0};Array.dequeue=function(a){return a.shift()};Array.forEach=function(b,e,d){for(var a=0,f=b.length;a<f;a++){var c=b[a];if(typeof c!==\"undefined\")e.call(d,c,a,b)}};Array.indexOf=function(a,c,b){return Sys._indexOf(a,c,b)};Array.insert=function(a,b,c){a.splice(b,0,c)};Array.parse=function(value){if(!value)return [];return eval(value)};Array.remove=function(b,c){var a=Sys._indexOf(b,c);if(a>=0)b.splice(a,1);return a>=0};Array.removeAt=function(a,b){a.splice(b,1)};Sys._indexOf=function(d,e,a){if(typeof e===\"undefined\")return -1;var c=d.length;if(c!==0){a=a-0;if(isNaN(a))a=0;else{if(isFinite(a))a=a-a%1;if(a<0)a=Math.max(0,c+a)}for(var b=a;b<c;b++)if(typeof d[b]!==\"undefined\"&&d[b]===e)return b}return -1};Type._registerScript(\"MicrosoftAjaxCore.js\");Sys.IDisposable=function(){};Sys.IDisposable.prototype={};Sys.IDisposable.registerInterface(\"Sys.IDisposable\");Sys.StringBuilder=function(a){this._parts=typeof a!==\"undefined\"&&a!==null&&a!==\"\"?[a.toString()]:[];this._value={};this._len=0};Sys.StringBuilder.prototype={append:function(a){this._parts[this._parts.length]=a},appendLine:function(a){this._parts[this._parts.length]=typeof a===\"undefined\"||a===null||a===\"\"?\"\\r\\n\":a+\"\\r\\n\"},clear:function(){this._parts=[];this._value={};this._len=0},isEmpty:function(){if(this._parts.length===0)return true;return this.toString()===\"\"},toString:function(a){a=a||\"\";var b=this._parts;if(this._len!==b.length){this._value={};this._len=b.length}var d=this._value;if(typeof d[a]===\"undefined\"){if(a!==\"\")for(var c=0;c<b.length;)if(typeof b[c]===\"undefined\"||b[c]===\"\"||b[c]===null)b.splice(c,1);else c++;d[a]=this._parts.join(a)}return d[a]}};Sys.StringBuilder.registerClass(\"Sys.StringBuilder\");Sys.Browser={};Sys.Browser.InternetExplorer={};Sys.Browser.Firefox={};Sys.Browser.Safari={};Sys.Browser.Opera={};Sys.Browser.agent=null;Sys.Browser.hasDebuggerStatement=false;Sys.Browser.name=navigator.appName;Sys.Browser.version=parseFloat(navigator.appVersion);Sys.Browser.documentMode=0;if(navigator.userAgent.indexOf(\" MSIE \")>-1){Sys.Browser.agent=Sys.Browser.InternetExplorer;Sys.Browser.version=parseFloat(navigator.userAgent.match(/MSIE (\\d+\\.\\d+)/)[1]);if(Sys.Browser.version>=8)if(document.documentMode>=7)Sys.Browser.documentMode=document.documentMode;Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" Firefox/\")>-1){Sys.Browser.agent=Sys.Browser.Firefox;Sys.Browser.version=parseFloat(navigator.userAgent.match(/Firefox\\/(\\d+\\.\\d+)/)[1]);Sys.Browser.name=\"Firefox\";Sys.Browser.hasDebuggerStatement=true}else if(navigator.userAgent.indexOf(\" AppleWebKit/\")>-1){Sys.Browser.agent=Sys.Browser.Safari;Sys.Browser.version=parseFloat(navigator.userAgent.match(/AppleWebKit\\/(\\d+(\\.\\d+)?)/)[1]);Sys.Browser.name=\"Safari\"}else if(navigator.userAgent.indexOf(\"Opera/\")>-1)Sys.Browser.agent=Sys.Browser.Opera;Sys.EventArgs=function(){};Sys.EventArgs.registerClass(\"Sys.EventArgs\");Sys.EventArgs.Empty=new Sys.EventArgs;Sys.CancelEventArgs=function(){Sys.CancelEventArgs.initializeBase(this);this._cancel=false};Sys.CancelEventArgs.prototype={get_cancel:function(){return this._cancel},set_cancel:function(a){this._cancel=a}};Sys.CancelEventArgs.registerClass(\"Sys.CancelEventArgs\",Sys.EventArgs);Sys.EventHandlerList=function(){this._list={}};Sys.EventHandlerList.prototype={_addHandler:function(b,a){Array.add(this._getEvent(b,true),a)},addHandler:function(b,a){this._addHandler(b,a)},_removeHandler:function(c,b){var a=this._getEvent(c);if(!a)return;Array.remove(a,b)},removeHandler:function(b,a){this._removeHandler(b,a)},getHandler:function(b){var a=this._getEvent(b);if(!a||a.length===0)return null;a=Array.clone(a);return function(c,d){for(var b=0,e=a.length;b<e;b++)a[b](c,d)}},_getEvent:function(a,b){if(!this._list[a]){if(!b)return null;this._list[a]=[]}return this._list[a]}};Sys.EventHandlerList.registerClass(\"Sys.EventHandlerList\");Type.registerNamespace(\"Sys.UI\");Sys._Debug=function(){};Sys._Debug.prototype={_appendConsole:function(a){if(typeof Debug!==\"undefined\"&&Debug.writeln)Debug.writeln(a);if(window.console&&window.console.log)window.console.log(a);if(window.opera)window.opera.postError(a);if(window.debugService)window.debugService.trace(a)},_appendTrace:function(b){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value+=b+\"\\n\"},assert:function(c,a,b){if(!c){a=b&&this.assert.caller?String.format(Sys.Res.assertFailedCaller,a,this.assert.caller):String.format(Sys.Res.assertFailed,a);if(confirm(String.format(Sys.Res.breakIntoDebugger,a)))this.fail(a)}},clearTrace:function(){var a=document.getElementById(\"TraceConsole\");if(a&&a.tagName.toUpperCase()===\"TEXTAREA\")a.value=\"\"},fail:function(message){this._appendConsole(message);if(Sys.Browser.hasDebuggerStatement)eval(\"debugger\")},trace:function(a){this._appendConsole(a);this._appendTrace(a)},traceDump:function(a,b){var c=this._traceDump(a,b,true)},_traceDump:function(a,c,f,b,d){c=c?c:\"traceDump\";b=b?b:\"\";if(a===null){this.trace(b+c+\": null\");return}switch(typeof a){case \"undefined\":this.trace(b+c+\": Undefined\");break;case \"number\":case \"string\":case \"boolean\":this.trace(b+c+\": \"+a);break;default:if(Date.isInstanceOfType(a)||RegExp.isInstanceOfType(a)){this.trace(b+c+\": \"+a.toString());break}if(!d)d=[];else if(Array.contains(d,a)){this.trace(b+c+\": ...\");return}Array.add(d,a);if(a==window||a===document||window.HTMLElement&&a instanceof HTMLElement||typeof a.nodeName===\"string\"){var k=a.tagName?a.tagName:\"DomElement\";if(a.id)k+=\" - \"+a.id;this.trace(b+c+\" {\"+k+\"}\")}else{var i=Object.getTypeName(a);this.trace(b+c+(typeof i===\"string\"?\" {\"+i+\"}\":\"\"));if(b===\"\"||f){b+=\"    \";var e,j,l,g,h;if(Array.isInstanceOfType(a)){j=a.length;for(e=0;e<j;e++)this._traceDump(a[e],\"[\"+e+\"]\",f,b,d)}else for(g in a){h=a[g];if(!Function.isInstanceOfType(h))this._traceDump(h,g,f,b,d)}}}Array.remove(d,a)}}};Sys._Debug.registerClass(\"Sys._Debug\");Sys.Debug=new Sys._Debug;Sys.Debug.isDebug=false;function Sys$Enum$parse(c,e){var a,b,i;if(e){a=this.__lowerCaseValues;if(!a){this.__lowerCaseValues=a={};var g=this.prototype;for(var f in g)a[f.toLowerCase()]=g[f]}}else a=this.prototype;if(!this.__flags){i=e?c.toLowerCase():c;b=a[i.trim()];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c,this.__typeName));return b}else{var h=(e?c.toLowerCase():c).split(\",\"),j=0;for(var d=h.length-1;d>=0;d--){var k=h[d].trim();b=a[k];if(typeof b!==\"number\")throw Error.argument(\"value\",String.format(Sys.Res.enumInvalidValue,c.split(\",\")[d].trim(),this.__typeName));j|=b}return j}}function Sys$Enum$toString(c){if(typeof c===\"undefined\"||c===null)return this.__string;var d=this.prototype,a;if(!this.__flags||c===0){for(a in d)if(d[a]===c)return a}else{var b=this.__sortedValues;if(!b){b=[];for(a in d)b[b.length]={key:a,value:d[a]};b.sort(function(a,b){return a.value-b.value});this.__sortedValues=b}var e=[],g=c;for(a=b.length-1;a>=0;a--){var h=b[a],f=h.value;if(f===0)continue;if((f&c)===f){e[e.length]=h.key;g-=f;if(g===0)break}}if(e.length&&g===0)return e.reverse().join(\", \")}return \"\"}Type.prototype.registerEnum=function(b,c){Sys.__upperCaseTypes[b.toUpperCase()]=this;for(var a in this.prototype)this[a]=this.prototype[a];this.__typeName=b;this.parse=Sys$Enum$parse;this.__string=this.toString();this.toString=Sys$Enum$toString;this.__flags=c;this.__enum=true};Type.isEnum=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__enum};Type.isFlags=function(a){if(typeof a===\"undefined\"||a===null)return false;return !!a.__flags};Sys.CollectionChange=function(e,a,c,b,d){this.action=e;if(a)if(!(a instanceof Array))a=[a];this.newItems=a||null;if(typeof c!==\"number\")c=-1;this.newStartingIndex=c;if(b)if(!(b instanceof Array))b=[b];this.oldItems=b||null;if(typeof d!==\"number\")d=-1;this.oldStartingIndex=d};Sys.CollectionChange.registerClass(\"Sys.CollectionChange\");Sys.NotifyCollectionChangedAction=function(){throw Error.notImplemented()};Sys.NotifyCollectionChangedAction.prototype={add:0,remove:1,reset:2};Sys.NotifyCollectionChangedAction.registerEnum(\"Sys.NotifyCollectionChangedAction\");Sys.NotifyCollectionChangedEventArgs=function(a){this._changes=a;Sys.NotifyCollectionChangedEventArgs.initializeBase(this)};Sys.NotifyCollectionChangedEventArgs.prototype={get_changes:function(){return this._changes||[]}};Sys.NotifyCollectionChangedEventArgs.registerClass(\"Sys.NotifyCollectionChangedEventArgs\",Sys.EventArgs);Sys.INotifyPropertyChange=function(){};Sys.INotifyPropertyChange.prototype={};Sys.INotifyPropertyChange.registerInterface(\"Sys.INotifyPropertyChange\");Sys.PropertyChangedEventArgs=function(a){Sys.PropertyChangedEventArgs.initializeBase(this);this._propertyName=a};Sys.PropertyChangedEventArgs.prototype={get_propertyName:function(){return this._propertyName}};Sys.PropertyChangedEventArgs.registerClass(\"Sys.PropertyChangedEventArgs\",Sys.EventArgs);Sys.Observer=function(){};Sys.Observer.registerClass(\"Sys.Observer\");Sys.Observer.makeObservable=function(a){var c=a instanceof Array,b=Sys.Observer;if(a.setValue===b._observeMethods.setValue)return a;b._addMethods(a,b._observeMethods);if(c)b._addMethods(a,b._arrayMethods);return a};Sys.Observer._addMethods=function(c,b){for(var a in b)c[a]=b[a]};Sys.Observer._addEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._addHandler(a,b)};Sys.Observer.addEventHandler=function(c,a,b){Sys.Observer._addEventHandler(c,a,b)};Sys.Observer._removeEventHandler=function(c,a,b){Sys.Observer._getContext(c,true).events._removeHandler(a,b)};Sys.Observer.removeEventHandler=function(c,a,b){Sys.Observer._removeEventHandler(c,a,b)};Sys.Observer.raiseEvent=function(b,e,d){var c=Sys.Observer._getContext(b);if(!c)return;var a=c.events.getHandler(e);if(a)a(b,d)};Sys.Observer.addPropertyChanged=function(b,a){Sys.Observer._addEventHandler(b,\"propertyChanged\",a)};Sys.Observer.removePropertyChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"propertyChanged\",a)};Sys.Observer.beginUpdate=function(a){Sys.Observer._getContext(a,true).updating=true};Sys.Observer.endUpdate=function(b){var a=Sys.Observer._getContext(b);if(!a||!a.updating)return;a.updating=false;var d=a.dirty;a.dirty=false;if(d){if(b instanceof Array){var c=a.changes;a.changes=null;Sys.Observer.raiseCollectionChanged(b,c)}Sys.Observer.raisePropertyChanged(b,\"\")}};Sys.Observer.isUpdating=function(b){var a=Sys.Observer._getContext(b);return a?a.updating:false};Sys.Observer._setValue=function(a,j,g){var b,f,k=a,d=j.split(\".\");for(var i=0,m=d.length-1;i<m;i++){var l=d[i];b=a[\"get_\"+l];if(typeof b===\"function\")a=b.call(a);else a=a[l];var n=typeof a;if(a===null||n===\"undefined\")throw Error.invalidOperation(String.format(Sys.Res.nullReferenceInPath,j))}var e,c=d[m];b=a[\"get_\"+c];f=a[\"set_\"+c];if(typeof b===\"function\")e=b.call(a);else e=a[c];if(typeof f===\"function\")f.call(a,g);else a[c]=g;if(e!==g){var h=Sys.Observer._getContext(k);if(h&&h.updating){h.dirty=true;return}Sys.Observer.raisePropertyChanged(k,d[0])}};Sys.Observer.setValue=function(b,a,c){Sys.Observer._setValue(b,a,c)};Sys.Observer.raisePropertyChanged=function(b,a){Sys.Observer.raiseEvent(b,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))};Sys.Observer.addCollectionChanged=function(b,a){Sys.Observer._addEventHandler(b,\"collectionChanged\",a)};Sys.Observer.removeCollectionChanged=function(b,a){Sys.Observer._removeEventHandler(b,\"collectionChanged\",a)};Sys.Observer._collectionChange=function(d,c){var a=Sys.Observer._getContext(d);if(a&&a.updating){a.dirty=true;var b=a.changes;if(!b)a.changes=b=[c];else b.push(c)}else{Sys.Observer.raiseCollectionChanged(d,[c]);Sys.Observer.raisePropertyChanged(d,\"length\")}};Sys.Observer.add=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[b],a.length);Array.add(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.addRange=function(a,b){var c=new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,b,a.length);Array.addRange(a,b);Sys.Observer._collectionChange(a,c)};Sys.Observer.clear=function(a){var b=Array.clone(a);Array.clear(a);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.reset,null,-1,b,0))};Sys.Observer.insert=function(a,b,c){Array.insert(a,b,c);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.add,[c],b))};Sys.Observer.remove=function(a,b){var c=Array.indexOf(a,b);if(c!==-1){Array.remove(a,b);Sys.Observer._collectionChange(a,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[b],c));return true}return false};Sys.Observer.removeAt=function(b,a){if(a>-1&&a<b.length){var c=b[a];Array.removeAt(b,a);Sys.Observer._collectionChange(b,new Sys.CollectionChange(Sys.NotifyCollectionChangedAction.remove,null,-1,[c],a))}};Sys.Observer.raiseCollectionChanged=function(b,a){Sys.Observer.raiseEvent(b,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))};Sys.Observer._observeMethods={add_propertyChanged:function(a){Sys.Observer._addEventHandler(this,\"propertyChanged\",a)},remove_propertyChanged:function(a){Sys.Observer._removeEventHandler(this,\"propertyChanged\",a)},addEventHandler:function(a,b){Sys.Observer._addEventHandler(this,a,b)},removeEventHandler:function(a,b){Sys.Observer._removeEventHandler(this,a,b)},get_isUpdating:function(){return Sys.Observer.isUpdating(this)},beginUpdate:function(){Sys.Observer.beginUpdate(this)},endUpdate:function(){Sys.Observer.endUpdate(this)},setValue:function(b,a){Sys.Observer._setValue(this,b,a)},raiseEvent:function(b,a){Sys.Observer.raiseEvent(this,b,a)},raisePropertyChanged:function(a){Sys.Observer.raiseEvent(this,\"propertyChanged\",new Sys.PropertyChangedEventArgs(a))}};Sys.Observer._arrayMethods={add_collectionChanged:function(a){Sys.Observer._addEventHandler(this,\"collectionChanged\",a)},remove_collectionChanged:function(a){Sys.Observer._removeEventHandler(this,\"collectionChanged\",a)},add:function(a){Sys.Observer.add(this,a)},addRange:function(a){Sys.Observer.addRange(this,a)},clear:function(){Sys.Observer.clear(this)},insert:function(a,b){Sys.Observer.insert(this,a,b)},remove:function(a){return Sys.Observer.remove(this,a)},removeAt:function(a){Sys.Observer.removeAt(this,a)},raiseCollectionChanged:function(a){Sys.Observer.raiseEvent(this,\"collectionChanged\",new Sys.NotifyCollectionChangedEventArgs(a))}};Sys.Observer._getContext=function(b,c){var a=b._observerContext;if(a)return a();if(c)return (b._observerContext=Sys.Observer._createContext())();return null};Sys.Observer._createContext=function(){var a={events:new Sys.EventHandlerList};return function(){return a}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxGlobalization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxGlobalization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxGlobalization.js\nType._registerScript(\"MicrosoftAjaxGlobalization.js\",[\"MicrosoftAjaxCore.js\"]);Date._appendPreOrPostMatch=function(e,b){var d=0,a=false;for(var c=0,g=e.length;c<g;c++){var f=e.charAt(c);switch(f){case \"'\":if(a)b.append(\"'\");else d++;a=false;break;case \"\\\\\":if(a)b.append(\"\\\\\");a=!a;break;default:b.append(f);a=false}}return d};Date._expandFormat=function(a,b){if(!b)b=\"F\";var c=b.length;if(c===1)switch(b){case \"d\":return a.ShortDatePattern;case \"D\":return a.LongDatePattern;case \"t\":return a.ShortTimePattern;case \"T\":return a.LongTimePattern;case \"f\":return a.LongDatePattern+\" \"+a.ShortTimePattern;case \"F\":return a.FullDateTimePattern;case \"M\":case \"m\":return a.MonthDayPattern;case \"s\":return a.SortableDateTimePattern;case \"Y\":case \"y\":return a.YearMonthPattern;default:throw Error.format(Sys.Res.formatInvalidString)}else if(c===2&&b.charAt(0)===\"%\")b=b.charAt(1);return b};Date._expandYear=function(c,a){var d=new Date,e=Date._getEra(d);if(a<100){var b=Date._getEraYear(d,c,e);a+=b-b%100;if(a>c.Calendar.TwoDigitYearMax)a-=100}return a};Date._getEra=function(e,c){if(!c)return 0;var b,d=e.getTime();for(var a=0,f=c.length;a<f;a+=4){b=c[a+2];if(b===null||d>=b)return a}return 0};Date._getEraYear=function(d,b,e,c){var a=d.getFullYear();if(!c&&b.eras)a-=b.eras[e+3];return a};Date._getParseRegExp=function(b,e){if(!b._parseRegExp)b._parseRegExp={};else if(b._parseRegExp[e])return b._parseRegExp[e];var c=Date._expandFormat(b,e);c=c.replace(/([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g,\"\\\\\\\\$1\");var a=new Sys.StringBuilder(\"^\"),j=[],f=0,i=0,h=Date._getTokenRegExp(),d;while((d=h.exec(c))!==null){var l=c.slice(f,d.index);f=h.lastIndex;i+=Date._appendPreOrPostMatch(l,a);if(i%2===1){a.append(d[0]);continue}switch(d[0]){case \"dddd\":case \"ddd\":case \"MMMM\":case \"MMM\":case \"gg\":case \"g\":a.append(\"(\\\\D+)\");break;case \"tt\":case \"t\":a.append(\"(\\\\D*)\");break;case \"yyyy\":a.append(\"(\\\\d{4})\");break;case \"fff\":a.append(\"(\\\\d{3})\");break;case \"ff\":a.append(\"(\\\\d{2})\");break;case \"f\":a.append(\"(\\\\d)\");break;case \"dd\":case \"d\":case \"MM\":case \"M\":case \"yy\":case \"y\":case \"HH\":case \"H\":case \"hh\":case \"h\":case \"mm\":case \"m\":case \"ss\":case \"s\":a.append(\"(\\\\d\\\\d?)\");break;case \"zzz\":a.append(\"([+-]?\\\\d\\\\d?:\\\\d{2})\");break;case \"zz\":case \"z\":a.append(\"([+-]?\\\\d\\\\d?)\");break;case \"/\":a.append(\"(\\\\\"+b.DateSeparator+\")\")}Array.add(j,d[0])}Date._appendPreOrPostMatch(c.slice(f),a);a.append(\"$\");var k=a.toString().replace(/\\s+/g,\"\\\\s+\"),g={\"regExp\":k,\"groups\":j};b._parseRegExp[e]=g;return g};Date._getTokenRegExp=function(){return /\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g};Date.parseLocale=function(a){return Date._parse(a,Sys.CultureInfo.CurrentCulture,arguments)};Date.parseInvariant=function(a){return Date._parse(a,Sys.CultureInfo.InvariantCulture,arguments)};Date._parse=function(h,d,i){var a,c,b,f,e,g=false;for(a=1,c=i.length;a<c;a++){f=i[a];if(f){g=true;b=Date._parseExact(h,f,d);if(b)return b}}if(!g){e=d._getDateTimeFormats();for(a=0,c=e.length;a<c;a++){b=Date._parseExact(h,e[a],d);if(b)return b}}return null};Date._parseExact=function(w,D,k){w=w.trim();var g=k.dateTimeFormat,A=Date._getParseRegExp(g,D),C=(new RegExp(A.regExp)).exec(w);if(C===null)return null;var B=A.groups,x=null,e=null,c=null,j=null,i=null,d=0,h,p=0,q=0,f=0,l=null,v=false;for(var s=0,E=B.length;s<E;s++){var a=C[s+1];if(a)switch(B[s]){case \"dd\":case \"d\":j=parseInt(a,10);if(j<1||j>31)return null;break;case \"MMMM\":c=k._getMonthIndex(a);if(c<0||c>11)return null;break;case \"MMM\":c=k._getAbbrMonthIndex(a);if(c<0||c>11)return null;break;case \"M\":case \"MM\":c=parseInt(a,10)-1;if(c<0||c>11)return null;break;case \"y\":case \"yy\":e=Date._expandYear(g,parseInt(a,10));if(e<0||e>9999)return null;break;case \"yyyy\":e=parseInt(a,10);if(e<0||e>9999)return null;break;case \"h\":case \"hh\":d=parseInt(a,10);if(d===12)d=0;if(d<0||d>11)return null;break;case \"H\":case \"HH\":d=parseInt(a,10);if(d<0||d>23)return null;break;case \"m\":case \"mm\":p=parseInt(a,10);if(p<0||p>59)return null;break;case \"s\":case \"ss\":q=parseInt(a,10);if(q<0||q>59)return null;break;case \"tt\":case \"t\":var z=a.toUpperCase();v=z===g.PMDesignator.toUpperCase();if(!v&&z!==g.AMDesignator.toUpperCase())return null;break;case \"f\":f=parseInt(a,10)*100;if(f<0||f>999)return null;break;case \"ff\":f=parseInt(a,10)*10;if(f<0||f>999)return null;break;case \"fff\":f=parseInt(a,10);if(f<0||f>999)return null;break;case \"dddd\":i=k._getDayIndex(a);if(i<0||i>6)return null;break;case \"ddd\":i=k._getAbbrDayIndex(a);if(i<0||i>6)return null;break;case \"zzz\":var u=a.split(/:/);if(u.length!==2)return null;h=parseInt(u[0],10);if(h<-12||h>13)return null;var m=parseInt(u[1],10);if(m<0||m>59)return null;l=h*60+(a.startsWith(\"-\")?-m:m);break;case \"z\":case \"zz\":h=parseInt(a,10);if(h<-12||h>13)return null;l=h*60;break;case \"g\":case \"gg\":var o=a;if(!o||!g.eras)return null;o=o.toLowerCase().trim();for(var r=0,F=g.eras.length;r<F;r+=4)if(o===g.eras[r+1].toLowerCase()){x=r;break}if(x===null)return null}}var b=new Date,t,n=g.Calendar.convert;if(n)t=n.fromGregorian(b)[0];else t=b.getFullYear();if(e===null)e=t;else if(g.eras)e+=g.eras[(x||0)+3];if(c===null)c=0;if(j===null)j=1;if(n){b=n.toGregorian(e,c,j);if(b===null)return null}else{b.setFullYear(e,c,j);if(b.getDate()!==j)return null;if(i!==null&&b.getDay()!==i)return null}if(v&&d<12)d+=12;b.setHours(d,p,q,f);if(l!==null){var y=b.getMinutes()-(l+b.getTimezoneOffset());b.setHours(b.getHours()+parseInt(y/60,10),y%60)}return b};Date.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Date.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Date.prototype._toFormattedString=function(e,j){var b=j.dateTimeFormat,n=b.Calendar.convert;if(!e||!e.length||e===\"i\")if(j&&j.name.length)if(n)return this._toFormattedString(b.FullDateTimePattern,j);else{var r=new Date(this.getTime()),x=Date._getEra(this,b.eras);r.setFullYear(Date._getEraYear(this,b,x));return r.toLocaleString()}else return this.toString();var l=b.eras,k=e===\"s\";e=Date._expandFormat(b,e);var a=new Sys.StringBuilder,c;function d(a){if(a<10)return \"0\"+a;return a.toString()}function m(a){if(a<10)return \"00\"+a;if(a<100)return \"0\"+a;return a.toString()}function v(a){if(a<10)return \"000\"+a;else if(a<100)return \"00\"+a;else if(a<1000)return \"0\"+a;return a.toString()}var h,p,t=/([^d]|^)(d|dd)([^d]|$)/g;function s(){if(h||p)return h;h=t.test(e);p=true;return h}var q=0,o=Date._getTokenRegExp(),f;if(!k&&n)f=n.fromGregorian(this);for(;true;){var w=o.lastIndex,i=o.exec(e),u=e.slice(w,i?i.index:e.length);q+=Date._appendPreOrPostMatch(u,a);if(!i)break;if(q%2===1){a.append(i[0]);continue}function g(a,b){if(f)return f[b];switch(b){case 0:return a.getFullYear();case 1:return a.getMonth();case 2:return a.getDate()}}switch(i[0]){case \"dddd\":a.append(b.DayNames[this.getDay()]);break;case \"ddd\":a.append(b.AbbreviatedDayNames[this.getDay()]);break;case \"dd\":h=true;a.append(d(g(this,2)));break;case \"d\":h=true;a.append(g(this,2));break;case \"MMMM\":a.append(b.MonthGenitiveNames&&s()?b.MonthGenitiveNames[g(this,1)]:b.MonthNames[g(this,1)]);break;case \"MMM\":a.append(b.AbbreviatedMonthGenitiveNames&&s()?b.AbbreviatedMonthGenitiveNames[g(this,1)]:b.AbbreviatedMonthNames[g(this,1)]);break;case \"MM\":a.append(d(g(this,1)+1));break;case \"M\":a.append(g(this,1)+1);break;case \"yyyy\":a.append(v(f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k)));break;case \"yy\":a.append(d((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100));break;case \"y\":a.append((f?f[0]:Date._getEraYear(this,b,Date._getEra(this,l),k))%100);break;case \"hh\":c=this.getHours()%12;if(c===0)c=12;a.append(d(c));break;case \"h\":c=this.getHours()%12;if(c===0)c=12;a.append(c);break;case \"HH\":a.append(d(this.getHours()));break;case \"H\":a.append(this.getHours());break;case \"mm\":a.append(d(this.getMinutes()));break;case \"m\":a.append(this.getMinutes());break;case \"ss\":a.append(d(this.getSeconds()));break;case \"s\":a.append(this.getSeconds());break;case \"tt\":a.append(this.getHours()<12?b.AMDesignator:b.PMDesignator);break;case \"t\":a.append((this.getHours()<12?b.AMDesignator:b.PMDesignator).charAt(0));break;case \"f\":a.append(m(this.getMilliseconds()).charAt(0));break;case \"ff\":a.append(m(this.getMilliseconds()).substr(0,2));break;case \"fff\":a.append(m(this.getMilliseconds()));break;case \"z\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+Math.floor(Math.abs(c)));break;case \"zz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c))));break;case \"zzz\":c=this.getTimezoneOffset()/60;a.append((c<=0?\"+\":\"-\")+d(Math.floor(Math.abs(c)))+\":\"+d(Math.abs(this.getTimezoneOffset()%60)));break;case \"g\":case \"gg\":if(b.eras)a.append(b.eras[Date._getEra(this,l)+1]);break;case \"/\":a.append(b.DateSeparator)}}return a.toString()};String.localeFormat=function(){return String._toFormattedString(true,arguments)};Number.parseLocale=function(a){return Number._parse(a,Sys.CultureInfo.CurrentCulture)};Number.parseInvariant=function(a){return Number._parse(a,Sys.CultureInfo.InvariantCulture)};Number._parse=function(b,o){b=b.trim();if(b.match(/^[+-]?infinity$/i))return parseFloat(b);if(b.match(/^0x[a-f0-9]+$/i))return parseInt(b);var a=o.numberFormat,g=Number._parseNumberNegativePattern(b,a,a.NumberNegativePattern),h=g[0],e=g[1];if(h===\"\"&&a.NumberNegativePattern!==1){g=Number._parseNumberNegativePattern(b,a,1);h=g[0];e=g[1]}if(h===\"\")h=\"+\";var j,d,f=e.indexOf(\"e\");if(f<0)f=e.indexOf(\"E\");if(f<0){d=e;j=null}else{d=e.substr(0,f);j=e.substr(f+1)}var c,k,m=d.indexOf(a.NumberDecimalSeparator);if(m<0){c=d;k=null}else{c=d.substr(0,m);k=d.substr(m+a.NumberDecimalSeparator.length)}c=c.split(a.NumberGroupSeparator).join(\"\");var n=a.NumberGroupSeparator.replace(/\\u00A0/g,\" \");if(a.NumberGroupSeparator!==n)c=c.split(n).join(\"\");var l=h+c;if(k!==null)l+=\".\"+k;if(j!==null){var i=Number._parseNumberNegativePattern(j,a,1);if(i[0]===\"\")i[0]=\"+\";l+=\"e\"+i[0]+i[1]}if(l.match(/^[+-]?\\d*\\.?\\d*(e[+-]?\\d+)?$/))return parseFloat(l);return Number.NaN};Number._parseNumberNegativePattern=function(a,d,e){var b=d.NegativeSign,c=d.PositiveSign;switch(e){case 4:b=\" \"+b;c=\" \"+c;case 3:if(a.endsWith(b))return [\"-\",a.substr(0,a.length-b.length)];else if(a.endsWith(c))return [\"+\",a.substr(0,a.length-c.length)];break;case 2:b+=\" \";c+=\" \";case 1:if(a.startsWith(b))return [\"-\",a.substr(b.length)];else if(a.startsWith(c))return [\"+\",a.substr(c.length)];break;case 0:if(a.startsWith(\"(\")&&a.endsWith(\")\"))return [\"-\",a.substr(1,a.length-2)]}return [\"\",a]};Number.prototype.format=function(a){return this._toFormattedString(a,Sys.CultureInfo.InvariantCulture)};Number.prototype.localeFormat=function(a){return this._toFormattedString(a,Sys.CultureInfo.CurrentCulture)};Number.prototype._toFormattedString=function(e,j){if(!e||e.length===0||e===\"i\")if(j&&j.name.length>0)return this.toLocaleString();else return this.toString();var o=[\"n %\",\"n%\",\"%n\"],n=[\"-n %\",\"-n%\",\"-%n\"],p=[\"(n)\",\"-n\",\"- n\",\"n-\",\"n -\"],m=[\"$n\",\"n$\",\"$ n\",\"n $\"],l=[\"($n)\",\"-$n\",\"$-n\",\"$n-\",\"(n$)\",\"-n$\",\"n-$\",\"n$-\",\"-n $\",\"-$ n\",\"n $-\",\"$ n-\",\"$ -n\",\"n- $\",\"($ n)\",\"(n $)\"];function g(a,c,d){for(var b=a.length;b<c;b++)a=d?\"0\"+a:a+\"0\";return a}function i(j,i,l,n,p){var h=l[0],k=1,o=Math.pow(10,i),m=Math.round(j*o)/o;if(!isFinite(m))m=j;j=m;var b=j.toString(),a=\"\",c,e=b.split(/e/i);b=e[0];c=e.length>1?parseInt(e[1]):0;e=b.split(\".\");b=e[0];a=e.length>1?e[1]:\"\";var q;if(c>0){a=g(a,c,false);b+=a.slice(0,c);a=a.substr(c)}else if(c<0){c=-c;b=g(b,c+1,true);a=b.slice(-c,b.length)+a;b=b.slice(0,-c)}if(i>0){if(a.length>i)a=a.slice(0,i);else a=g(a,i,false);a=p+a}else a=\"\";var d=b.length-1,f=\"\";while(d>=0){if(h===0||h>d)if(f.length>0)return b.slice(0,d+1)+n+f+a;else return b.slice(0,d+1)+a;if(f.length>0)f=b.slice(d-h+1,d+1)+n+f;else f=b.slice(d-h+1,d+1);d-=h;if(k<l.length){h=l[k];k++}}return b.slice(0,d+1)+n+f+a}var a=j.numberFormat,d=Math.abs(this);if(!e)e=\"D\";var b=-1;if(e.length>1)b=parseInt(e.slice(1),10);var c;switch(e.charAt(0)){case \"d\":case \"D\":c=\"n\";if(b!==-1)d=g(\"\"+d,b,true);if(this<0)d=-d;break;case \"c\":case \"C\":if(this<0)c=l[a.CurrencyNegativePattern];else c=m[a.CurrencyPositivePattern];if(b===-1)b=a.CurrencyDecimalDigits;d=i(Math.abs(this),b,a.CurrencyGroupSizes,a.CurrencyGroupSeparator,a.CurrencyDecimalSeparator);break;case \"n\":case \"N\":if(this<0)c=p[a.NumberNegativePattern];else c=\"n\";if(b===-1)b=a.NumberDecimalDigits;d=i(Math.abs(this),b,a.NumberGroupSizes,a.NumberGroupSeparator,a.NumberDecimalSeparator);break;case \"p\":case \"P\":if(this<0)c=n[a.PercentNegativePattern];else c=o[a.PercentPositivePattern];if(b===-1)b=a.PercentDecimalDigits;d=i(Math.abs(this)*100,b,a.PercentGroupSizes,a.PercentGroupSeparator,a.PercentDecimalSeparator);break;default:throw Error.format(Sys.Res.formatBadFormatSpecifier)}var k=/n|\\$|-|%/g,f=\"\";for(;true;){var q=k.lastIndex,h=k.exec(c);f+=c.slice(q,h?h.index:c.length);if(!h)break;switch(h[0]){case \"n\":f+=d;break;case \"$\":f+=a.CurrencySymbol;break;case \"-\":if(/[1-9]/.test(d))f+=a.NegativeSign;break;case \"%\":f+=a.PercentSymbol}}return f};Sys.CultureInfo=function(c,b,a){this.name=c;this.numberFormat=b;this.dateTimeFormat=a};Sys.CultureInfo.prototype={_getDateTimeFormats:function(){if(!this._dateTimeFormats){var a=this.dateTimeFormat;this._dateTimeFormats=[a.MonthDayPattern,a.YearMonthPattern,a.ShortDatePattern,a.ShortTimePattern,a.LongDatePattern,a.LongTimePattern,a.FullDateTimePattern,a.RFC1123Pattern,a.SortableDateTimePattern,a.UniversalSortableDateTimePattern]}return this._dateTimeFormats},_getIndex:function(c,d,e){var b=this._toUpper(c),a=Array.indexOf(d,b);if(a===-1)a=Array.indexOf(e,b);return a},_getMonthIndex:function(a){if(!this._upperMonths){this._upperMonths=this._toUpperArray(this.dateTimeFormat.MonthNames);this._upperMonthsGenitive=this._toUpperArray(this.dateTimeFormat.MonthGenitiveNames)}return this._getIndex(a,this._upperMonths,this._upperMonthsGenitive)},_getAbbrMonthIndex:function(a){if(!this._upperAbbrMonths){this._upperAbbrMonths=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthNames);this._upperAbbrMonthsGenitive=this._toUpperArray(this.dateTimeFormat.AbbreviatedMonthGenitiveNames)}return this._getIndex(a,this._upperAbbrMonths,this._upperAbbrMonthsGenitive)},_getDayIndex:function(a){if(!this._upperDays)this._upperDays=this._toUpperArray(this.dateTimeFormat.DayNames);return Array.indexOf(this._upperDays,this._toUpper(a))},_getAbbrDayIndex:function(a){if(!this._upperAbbrDays)this._upperAbbrDays=this._toUpperArray(this.dateTimeFormat.AbbreviatedDayNames);return Array.indexOf(this._upperAbbrDays,this._toUpper(a))},_toUpperArray:function(c){var b=[];for(var a=0,d=c.length;a<d;a++)b[a]=this._toUpper(c[a]);return b},_toUpper:function(a){return a.split(\"\\u00a0\").join(\" \").toUpperCase()}};Sys.CultureInfo.registerClass(\"Sys.CultureInfo\");Sys.CultureInfo._parse=function(a){var b=a.dateTimeFormat;if(b&&!b.eras)b.eras=a.eras;return new Sys.CultureInfo(a.name,a.numberFormat,b)};Sys.CultureInfo.InvariantCulture=Sys.CultureInfo._parse({\"name\":\"\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":true,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"\\u00a4\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":true},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, dd MMMM yyyy HH:mm:ss\",\"LongDatePattern\":\"dddd, dd MMMM yyyy\",\"LongTimePattern\":\"HH:mm:ss\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"MM/dd/yyyy\",\"ShortTimePattern\":\"HH:mm\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"yyyy MMMM\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":true,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});if(typeof __cultureInfo===\"object\"){Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse(__cultureInfo);delete __cultureInfo}else Sys.CultureInfo.CurrentCulture=Sys.CultureInfo._parse({\"name\":\"en-US\",\"numberFormat\":{\"CurrencyDecimalDigits\":2,\"CurrencyDecimalSeparator\":\".\",\"IsReadOnly\":false,\"CurrencyGroupSizes\":[3],\"NumberGroupSizes\":[3],\"PercentGroupSizes\":[3],\"CurrencyGroupSeparator\":\",\",\"CurrencySymbol\":\"$\",\"NaNSymbol\":\"NaN\",\"CurrencyNegativePattern\":0,\"NumberNegativePattern\":1,\"PercentPositivePattern\":0,\"PercentNegativePattern\":0,\"NegativeInfinitySymbol\":\"-Infinity\",\"NegativeSign\":\"-\",\"NumberDecimalDigits\":2,\"NumberDecimalSeparator\":\".\",\"NumberGroupSeparator\":\",\",\"CurrencyPositivePattern\":0,\"PositiveInfinitySymbol\":\"Infinity\",\"PositiveSign\":\"+\",\"PercentDecimalDigits\":2,\"PercentDecimalSeparator\":\".\",\"PercentGroupSeparator\":\",\",\"PercentSymbol\":\"%\",\"PerMilleSymbol\":\"\\u2030\",\"NativeDigits\":[\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\"],\"DigitSubstitution\":1},\"dateTimeFormat\":{\"AMDesignator\":\"AM\",\"Calendar\":{\"MinSupportedDateTime\":\"@-62135568000000@\",\"MaxSupportedDateTime\":\"@253402300799999@\",\"AlgorithmType\":1,\"CalendarType\":1,\"Eras\":[1],\"TwoDigitYearMax\":2029,\"IsReadOnly\":false},\"DateSeparator\":\"/\",\"FirstDayOfWeek\":0,\"CalendarWeekRule\":0,\"FullDateTimePattern\":\"dddd, MMMM dd, yyyy h:mm:ss tt\",\"LongDatePattern\":\"dddd, MMMM dd, yyyy\",\"LongTimePattern\":\"h:mm:ss tt\",\"MonthDayPattern\":\"MMMM dd\",\"PMDesignator\":\"PM\",\"RFC1123Pattern\":\"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'\",\"ShortDatePattern\":\"M/d/yyyy\",\"ShortTimePattern\":\"h:mm tt\",\"SortableDateTimePattern\":\"yyyy'-'MM'-'dd'T'HH':'mm':'ss\",\"TimeSeparator\":\":\",\"UniversalSortableDateTimePattern\":\"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\"YearMonthPattern\":\"MMMM, yyyy\",\"AbbreviatedDayNames\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"ShortestDayNames\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"DayNames\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"AbbreviatedMonthNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"],\"IsReadOnly\":false,\"NativeCalendarName\":\"Gregorian Calendar\",\"AbbreviatedMonthGenitiveNames\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\",\"\"],\"MonthGenitiveNames\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\",\"\"]},\"eras\":[1,\"A.D.\",null,0]});"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxHistory.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxHistory.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxHistory.js\nType._registerScript(\"MicrosoftAjaxHistory.js\",[\"MicrosoftAjaxComponentModel.js\",\"MicrosoftAjaxSerialization.js\"]);Sys.HistoryEventArgs=function(a){Sys.HistoryEventArgs.initializeBase(this);this._state=a};Sys.HistoryEventArgs.prototype={get_state:function(){return this._state}};Sys.HistoryEventArgs.registerClass(\"Sys.HistoryEventArgs\",Sys.EventArgs);Sys.Application._appLoadHandler=null;Sys.Application._beginRequestHandler=null;Sys.Application._clientId=null;Sys.Application._currentEntry=\"\";Sys.Application._endRequestHandler=null;Sys.Application._history=null;Sys.Application._enableHistory=false;Sys.Application._historyFrame=null;Sys.Application._historyInitialized=false;Sys.Application._historyPointIsNew=false;Sys.Application._ignoreTimer=false;Sys.Application._initialState=null;Sys.Application._state={};Sys.Application._timerCookie=0;Sys.Application._timerHandler=null;Sys.Application._uniqueId=null;Sys._Application.prototype.get_stateString=function(){var a=null;if(Sys.Browser.agent===Sys.Browser.Firefox){var c=window.location.href,b=c.indexOf(\"#\");if(b!==-1)a=c.substring(b+1);else a=\"\";return a}else a=window.location.hash;if(a.length>0&&a.charAt(0)===\"#\")a=a.substring(1);return a};Sys._Application.prototype.get_enableHistory=function(){return this._enableHistory};Sys._Application.prototype.set_enableHistory=function(a){this._enableHistory=a};Sys._Application.prototype.add_navigate=function(a){this.get_events().addHandler(\"navigate\",a)};Sys._Application.prototype.remove_navigate=function(a){this.get_events().removeHandler(\"navigate\",a)};Sys._Application.prototype.addHistoryPoint=function(c,f){this._ensureHistory();var b=this._state;for(var a in c){var d=c[a];if(d===null){if(typeof b[a]!==\"undefined\")delete b[a]}else b[a]=d}var e=this._serializeState(b);this._historyPointIsNew=true;this._setState(e,f);this._raiseNavigate()};Sys._Application.prototype.setServerId=function(a,b){this._clientId=a;this._uniqueId=b};Sys._Application.prototype.setServerState=function(a){this._ensureHistory();this._state.__s=a;this._updateHiddenField(a)};Sys._Application.prototype._deserializeState=function(a){var e={};a=a||\"\";var b=a.indexOf(\"&&\");if(b!==-1&&b+2<a.length){e.__s=a.substr(b+2);a=a.substr(0,b)}var g=a.split(\"&\");for(var f=0,j=g.length;f<j;f++){var d=g[f],c=d.indexOf(\"=\");if(c!==-1&&c+1<d.length){var i=d.substr(0,c),h=d.substr(c+1);e[i]=decodeURIComponent(h)}}return e};Sys._Application.prototype._enableHistoryInScriptManager=function(){this._enableHistory=true};Sys._Application.prototype._ensureHistory=function(){if(!this._historyInitialized&&this._enableHistory){if(Sys.Browser.agent===Sys.Browser.InternetExplorer&&document.documentMode<8){this._historyFrame=document.getElementById(\"__historyFrame\");this._ignoreIFrame=true}this._timerHandler=Function.createDelegate(this,this._onIdle);this._timerCookie=window.setTimeout(this._timerHandler,100);try{this._initialState=this._deserializeState(this.get_stateString())}catch(a){}this._historyInitialized=true}};Sys._Application.prototype._navigate=function(c){this._ensureHistory();var b=this._deserializeState(c);if(this._uniqueId){var d=this._state.__s||\"\",a=b.__s||\"\";if(a!==d){this._updateHiddenField(a);__doPostBack(this._uniqueId,a);this._state=b;return}}this._setState(c);this._state=b;this._raiseNavigate()};Sys._Application.prototype._onIdle=function(){delete this._timerCookie;var a=this.get_stateString();if(a!==this._currentEntry){if(!this._ignoreTimer){this._historyPointIsNew=false;this._navigate(a)}}else this._ignoreTimer=false;this._timerCookie=window.setTimeout(this._timerHandler,100)};Sys._Application.prototype._onIFrameLoad=function(a){if(document.documentMode<8){this._ensureHistory();if(!this._ignoreIFrame){this._historyPointIsNew=false;this._navigate(a)}this._ignoreIFrame=false}};Sys._Application.prototype._onPageRequestManagerBeginRequest=function(){this._ignoreTimer=true;this._originalTitle=document.title};Sys._Application.prototype._onPageRequestManagerEndRequest=function(g,f){var d=f.get_dataItems()[this._clientId],c=this._originalTitle;this._originalTitle=null;var b=document.getElementById(\"__EVENTTARGET\");if(b&&b.value===this._uniqueId)b.value=\"\";if(typeof d!==\"undefined\"){this.setServerState(d);this._historyPointIsNew=true}else this._ignoreTimer=false;var a=this._serializeState(this._state);if(a!==this._currentEntry){this._ignoreTimer=true;if(typeof c===\"string\"){if(Sys.Browser.agent!==Sys.Browser.InternetExplorer||Sys.Browser.version>7){var e=document.title;document.title=c;this._setState(a);document.title=e}else this._setState(a);this._raiseNavigate()}else{this._setState(a);this._raiseNavigate()}}};Sys._Application.prototype._raiseNavigate=function(){var d=this._historyPointIsNew,c=this.get_events().getHandler(\"navigate\"),b={};for(var a in this._state)if(a!==\"__s\")b[a]=this._state[a];var e=new Sys.HistoryEventArgs(b);if(c)c(this,e);if(!d){var f;try{if(Sys.Browser.agent===Sys.Browser.Firefox&&window.location.hash&&(!window.frameElement||window.top.location.hash))Sys.Browser.version<3.5?window.history.go(0):(location.hash=this.get_stateString())}catch(g){}}};Sys._Application.prototype._serializeState=function(d){var b=[];for(var a in d){var e=d[a];if(a===\"__s\")var c=e;else b[b.length]=a+\"=\"+encodeURIComponent(e)}return b.join(\"&\")+(c?\"&&\"+c:\"\")};Sys._Application.prototype._setState=function(a,b){if(this._enableHistory){a=a||\"\";if(a!==this._currentEntry){if(window.theForm){var d=window.theForm.action,e=d.indexOf(\"#\");window.theForm.action=(e!==-1?d.substring(0,e):d)+\"#\"+a}if(this._historyFrame&&this._historyPointIsNew){var f=document.createElement(\"div\");f.appendChild(document.createTextNode(b||document.title));var g=f.innerHTML;this._ignoreIFrame=true;var c=this._historyFrame.contentWindow.document;c.open(\"javascript:'<html></html>'\");c.write(\"<html><head><title>\"+g+\"</title><scri\"+'pt type=\"text/javascript\">parent.Sys.Application._onIFrameLoad('+Sys.Serialization.JavaScriptSerializer.serialize(a)+\");</scri\"+\"pt></head><body></body></html>\");c.close()}this._ignoreTimer=false;this._currentEntry=a;if(this._historyFrame||this._historyPointIsNew){var h=this.get_stateString();if(a!==h){window.location.hash=a;this._currentEntry=this.get_stateString();if(typeof b!==\"undefined\"&&b!==null)document.title=b}}this._historyPointIsNew=false}}};Sys._Application.prototype._updateHiddenField=function(b){if(this._clientId){var a=document.getElementById(this._clientId);if(a)a.value=b}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxNetwork.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxNetwork.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxNetwork.js\nType._registerScript(\"MicrosoftAjaxNetwork.js\",[\"MicrosoftAjaxSerialization.js\"]);if(!window.XMLHttpRequest)window.XMLHttpRequest=function(){var b=[\"Msxml2.XMLHTTP.3.0\",\"Msxml2.XMLHTTP\"];for(var a=0,c=b.length;a<c;a++)try{return new ActiveXObject(b[a])}catch(d){}return null};Type.registerNamespace(\"Sys.Net\");Sys.Net.WebRequestExecutor=function(){this._webRequest=null;this._resultObject=null};Sys.Net.WebRequestExecutor.prototype={get_webRequest:function(){return this._webRequest},_set_webRequest:function(a){this._webRequest=a},get_started:function(){throw Error.notImplemented()},get_responseAvailable:function(){throw Error.notImplemented()},get_timedOut:function(){throw Error.notImplemented()},get_aborted:function(){throw Error.notImplemented()},get_responseData:function(){throw Error.notImplemented()},get_statusCode:function(){throw Error.notImplemented()},get_statusText:function(){throw Error.notImplemented()},get_xml:function(){throw Error.notImplemented()},get_object:function(){if(!this._resultObject)this._resultObject=Sys.Serialization.JavaScriptSerializer.deserialize(this.get_responseData());return this._resultObject},executeRequest:function(){throw Error.notImplemented()},abort:function(){throw Error.notImplemented()},getResponseHeader:function(){throw Error.notImplemented()},getAllResponseHeaders:function(){throw Error.notImplemented()}};Sys.Net.WebRequestExecutor.registerClass(\"Sys.Net.WebRequestExecutor\");Sys.Net.XMLDOM=function(d){if(!window.DOMParser){var c=[\"Msxml2.DOMDocument.3.0\",\"Msxml2.DOMDocument\"];for(var b=0,f=c.length;b<f;b++)try{var a=new ActiveXObject(c[b]);a.async=false;a.loadXML(d);a.setProperty(\"SelectionLanguage\",\"XPath\");return a}catch(g){}}else try{var e=new window.DOMParser;return e.parseFromString(d,\"text/xml\")}catch(g){}return null};Sys.Net.XMLHttpExecutor=function(){Sys.Net.XMLHttpExecutor.initializeBase(this);var a=this;this._xmlHttpRequest=null;this._webRequest=null;this._responseAvailable=false;this._timedOut=false;this._timer=null;this._aborted=false;this._started=false;this._onReadyStateChange=function(){if(a._xmlHttpRequest.readyState===4){try{if(typeof a._xmlHttpRequest.status===\"undefined\")return}catch(b){return}a._clearTimer();a._responseAvailable=true;try{a._webRequest.completed(Sys.EventArgs.Empty)}finally{if(a._xmlHttpRequest!=null){a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest=null}}}};this._clearTimer=function(){if(a._timer!=null){window.clearTimeout(a._timer);a._timer=null}};this._onTimeout=function(){if(!a._responseAvailable){a._clearTimer();a._timedOut=true;a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;a._xmlHttpRequest.abort();a._webRequest.completed(Sys.EventArgs.Empty);a._xmlHttpRequest=null}}};Sys.Net.XMLHttpExecutor.prototype={get_timedOut:function(){return this._timedOut},get_started:function(){return this._started},get_responseAvailable:function(){return this._responseAvailable},get_aborted:function(){return this._aborted},executeRequest:function(){this._webRequest=this.get_webRequest();var c=this._webRequest.get_body(),a=this._webRequest.get_headers();this._xmlHttpRequest=new XMLHttpRequest;this._xmlHttpRequest.onreadystatechange=this._onReadyStateChange;var e=this._webRequest.get_httpVerb();this._xmlHttpRequest.open(e,this._webRequest.getResolvedUrl(),true);this._xmlHttpRequest.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\");if(a)for(var b in a){var f=a[b];if(typeof f!==\"function\")this._xmlHttpRequest.setRequestHeader(b,f)}if(e.toLowerCase()===\"post\"){if(a===null||!a[\"Content-Type\"])this._xmlHttpRequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=utf-8\");if(!c)c=\"\"}var d=this._webRequest.get_timeout();if(d>0)this._timer=window.setTimeout(Function.createDelegate(this,this._onTimeout),d);this._xmlHttpRequest.send(c);this._started=true},getResponseHeader:function(b){var a;try{a=this._xmlHttpRequest.getResponseHeader(b)}catch(c){}if(!a)a=\"\";return a},getAllResponseHeaders:function(){return this._xmlHttpRequest.getAllResponseHeaders()},get_responseData:function(){return this._xmlHttpRequest.responseText},get_statusCode:function(){var a=0;try{a=this._xmlHttpRequest.status}catch(b){}return a},get_statusText:function(){return this._xmlHttpRequest.statusText},get_xml:function(){var a=this._xmlHttpRequest.responseXML;if(!a||!a.documentElement){a=Sys.Net.XMLDOM(this._xmlHttpRequest.responseText);if(!a||!a.documentElement)return null}else if(navigator.userAgent.indexOf(\"MSIE\")!==-1&&typeof a.setProperty!=\"undefined\")a.setProperty(\"SelectionLanguage\",\"XPath\");if(a.documentElement.namespaceURI===\"http://www.mozilla.org/newlayout/xml/parsererror.xml\"&&a.documentElement.tagName===\"parsererror\")return null;if(a.documentElement.firstChild&&a.documentElement.firstChild.tagName===\"parsererror\")return null;return a},abort:function(){if(this._aborted||this._responseAvailable||this._timedOut)return;this._aborted=true;this._clearTimer();if(this._xmlHttpRequest&&!this._responseAvailable){this._xmlHttpRequest.onreadystatechange=Function.emptyMethod;this._xmlHttpRequest.abort();this._xmlHttpRequest=null;this._webRequest.completed(Sys.EventArgs.Empty)}}};Sys.Net.XMLHttpExecutor.registerClass(\"Sys.Net.XMLHttpExecutor\",Sys.Net.WebRequestExecutor);Sys.Net._WebRequestManager=function(){this._defaultTimeout=0;this._defaultExecutorType=\"Sys.Net.XMLHttpExecutor\"};Sys.Net._WebRequestManager.prototype={add_invokingRequest:function(a){this._get_eventHandlerList().addHandler(\"invokingRequest\",a)},remove_invokingRequest:function(a){this._get_eventHandlerList().removeHandler(\"invokingRequest\",a)},add_completedRequest:function(a){this._get_eventHandlerList().addHandler(\"completedRequest\",a)},remove_completedRequest:function(a){this._get_eventHandlerList().removeHandler(\"completedRequest\",a)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_defaultTimeout:function(){return this._defaultTimeout},set_defaultTimeout:function(a){this._defaultTimeout=a},get_defaultExecutorType:function(){return this._defaultExecutorType},set_defaultExecutorType:function(a){this._defaultExecutorType=a},executeRequest:function(webRequest){var executor=webRequest.get_executor();if(!executor){var failed=false;try{var executorType=eval(this._defaultExecutorType);executor=new executorType}catch(a){failed=true}webRequest.set_executor(executor)}if(executor.get_aborted())return;var evArgs=new Sys.Net.NetworkRequestEventArgs(webRequest),handler=this._get_eventHandlerList().getHandler(\"invokingRequest\");if(handler)handler(this,evArgs);if(!evArgs.get_cancel())executor.executeRequest()}};Sys.Net._WebRequestManager.registerClass(\"Sys.Net._WebRequestManager\");Sys.Net.WebRequestManager=new Sys.Net._WebRequestManager;Sys.Net.NetworkRequestEventArgs=function(a){Sys.Net.NetworkRequestEventArgs.initializeBase(this);this._webRequest=a};Sys.Net.NetworkRequestEventArgs.prototype={get_webRequest:function(){return this._webRequest}};Sys.Net.NetworkRequestEventArgs.registerClass(\"Sys.Net.NetworkRequestEventArgs\",Sys.CancelEventArgs);Sys.Net.WebRequest=function(){this._url=\"\";this._headers={};this._body=null;this._userContext=null;this._httpVerb=null;this._executor=null;this._invokeCalled=false;this._timeout=0};Sys.Net.WebRequest.prototype={add_completed:function(a){this._get_eventHandlerList().addHandler(\"completed\",a)},remove_completed:function(a){this._get_eventHandlerList().removeHandler(\"completed\",a)},completed:function(b){var a=Sys.Net.WebRequestManager._get_eventHandlerList().getHandler(\"completedRequest\");if(a)a(this._executor,b);a=this._get_eventHandlerList().getHandler(\"completed\");if(a)a(this._executor,b)},_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_url:function(){return this._url},set_url:function(a){this._url=a},get_headers:function(){return this._headers},get_httpVerb:function(){if(this._httpVerb===null){if(this._body===null)return \"GET\";return \"POST\"}return this._httpVerb},set_httpVerb:function(a){this._httpVerb=a},get_body:function(){return this._body},set_body:function(a){this._body=a},get_userContext:function(){return this._userContext},set_userContext:function(a){this._userContext=a},get_executor:function(){return this._executor},set_executor:function(a){this._executor=a;this._executor._set_webRequest(this)},get_timeout:function(){if(this._timeout===0)return Sys.Net.WebRequestManager.get_defaultTimeout();return this._timeout},set_timeout:function(a){this._timeout=a},getResolvedUrl:function(){return Sys.Net.WebRequest._resolveUrl(this._url)},invoke:function(){Sys.Net.WebRequestManager.executeRequest(this);this._invokeCalled=true}};Sys.Net.WebRequest._resolveUrl=function(b,a){if(b&&b.indexOf(\"://\")!==-1)return b;if(!a||a.length===0){var d=document.getElementsByTagName(\"base\")[0];if(d&&d.href&&d.href.length>0)a=d.href;else a=document.URL}var c=a.indexOf(\"?\");if(c!==-1)a=a.substr(0,c);c=a.indexOf(\"#\");if(c!==-1)a=a.substr(0,c);a=a.substr(0,a.lastIndexOf(\"/\")+1);if(!b||b.length===0)return a;if(b.charAt(0)===\"/\"){var e=a.indexOf(\"://\"),g=a.indexOf(\"/\",e+3);return a.substr(0,g)+b}else{var f=a.lastIndexOf(\"/\");return a.substr(0,f+1)+b}};Sys.Net.WebRequest._createQueryString=function(c,b,f){b=b||encodeURIComponent;var h=0,e,g,d,a=new Sys.StringBuilder;if(c)for(d in c){e=c[d];if(typeof e===\"function\")continue;g=Sys.Serialization.JavaScriptSerializer.serialize(e);if(h++)a.append(\"&\");a.append(d);a.append(\"=\");a.append(b(g))}if(f){if(h)a.append(\"&\");a.append(f)}return a.toString()};Sys.Net.WebRequest._createUrl=function(a,b,c){if(!b&&!c)return a;var d=Sys.Net.WebRequest._createQueryString(b,null,c);return d.length?a+(a&&a.indexOf(\"?\")>=0?\"&\":\"?\")+d:a};Sys.Net.WebRequest.registerClass(\"Sys.Net.WebRequest\");Sys._ScriptLoaderTask=function(b,a){this._scriptElement=b;this._completedCallback=a};Sys._ScriptLoaderTask.prototype={get_scriptElement:function(){return this._scriptElement},dispose:function(){if(this._disposed)return;this._disposed=true;this._removeScriptElementHandlers();Sys._ScriptLoaderTask._clearScript(this._scriptElement);this._scriptElement=null},execute:function(){if(this._ensureReadyStateLoaded())this._executeInternal()},_executeInternal:function(){this._addScriptElementHandlers();document.getElementsByTagName(\"head\")[0].appendChild(this._scriptElement)},_ensureReadyStateLoaded:function(){if(this._useReadyState()&&this._scriptElement.readyState!==\"loaded\"&&this._scriptElement.readyState!==\"complete\"){this._scriptDownloadDelegate=Function.createDelegate(this,this._executeInternal);$addHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);return false}return true},_addScriptElementHandlers:function(){if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}this._scriptLoadDelegate=Function.createDelegate(this,this._scriptLoadHandler);if(this._useReadyState())$addHandler(this._scriptElement,\"readystatechange\",this._scriptLoadDelegate);else $addHandler(this._scriptElement,\"load\",this._scriptLoadDelegate);if(this._scriptElement.addEventListener){this._scriptErrorDelegate=Function.createDelegate(this,this._scriptErrorHandler);this._scriptElement.addEventListener(\"error\",this._scriptErrorDelegate,false)}},_removeScriptElementHandlers:function(){if(this._scriptLoadDelegate){var a=this.get_scriptElement();if(this._scriptDownloadDelegate){$removeHandler(this._scriptElement,\"readystatechange\",this._scriptDownloadDelegate);this._scriptDownloadDelegate=null}if(this._useReadyState()&&this._scriptLoadDelegate)$removeHandler(a,\"readystatechange\",this._scriptLoadDelegate);else $removeHandler(a,\"load\",this._scriptLoadDelegate);if(this._scriptErrorDelegate){this._scriptElement.removeEventListener(\"error\",this._scriptErrorDelegate,false);this._scriptErrorDelegate=null}this._scriptLoadDelegate=null}},_scriptErrorHandler:function(){if(this._disposed)return;this._completedCallback(this.get_scriptElement(),false)},_scriptLoadHandler:function(){if(this._disposed)return;var a=this.get_scriptElement();if(this._useReadyState()&&a.readyState!==\"complete\")return;this._completedCallback(a,true)},_useReadyState:function(){return Sys.Browser.agent===Sys.Browser.InternetExplorer&&(Sys.Browser.version<9||(document.documentMode||0)<9)}};Sys._ScriptLoaderTask.registerClass(\"Sys._ScriptLoaderTask\",null,Sys.IDisposable);Sys._ScriptLoaderTask._clearScript=function(a){if(!Sys.Debug.isDebug&&a.parentNode)a.parentNode.removeChild(a)};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxSerialization.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxSerialization.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxSerialization.js\nType._registerScript(\"MicrosoftAjaxSerialization.js\",[\"MicrosoftAjaxCore.js\"]);Type.registerNamespace(\"Sys.Serialization\");Sys.Serialization.JavaScriptSerializer=function(){};Sys.Serialization.JavaScriptSerializer.registerClass(\"Sys.Serialization.JavaScriptSerializer\");Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs=[];Sys.Serialization.JavaScriptSerializer._charsToEscape=[];Sys.Serialization.JavaScriptSerializer._dateRegEx=new RegExp('(^|[^\\\\\\\\])\\\\\"\\\\\\\\/Date\\\\((-?[0-9]+)(?:[a-zA-Z]|(?:\\\\+|-)[0-9]{4})?\\\\)\\\\\\\\/\\\\\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars={};Sys.Serialization.JavaScriptSerializer._escapeRegEx=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"i\");Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal=new RegExp('[\"\\\\\\\\\\\\x00-\\\\x1F]',\"g\");Sys.Serialization.JavaScriptSerializer._jsonRegEx=new RegExp(\"[^,:{}\\\\[\\\\]0-9.\\\\-+Eaeflnr-u \\\\n\\\\r\\\\t]\",\"g\");Sys.Serialization.JavaScriptSerializer._jsonStringRegEx=new RegExp('\"(\\\\\\\\.|[^\"\\\\\\\\])*\"',\"g\");Sys.Serialization.JavaScriptSerializer._serverTypeFieldName=\"__type\";Sys.Serialization.JavaScriptSerializer._init=function(){var c=[\"\\\\u0000\",\"\\\\u0001\",\"\\\\u0002\",\"\\\\u0003\",\"\\\\u0004\",\"\\\\u0005\",\"\\\\u0006\",\"\\\\u0007\",\"\\\\b\",\"\\\\t\",\"\\\\n\",\"\\\\u000b\",\"\\\\f\",\"\\\\r\",\"\\\\u000e\",\"\\\\u000f\",\"\\\\u0010\",\"\\\\u0011\",\"\\\\u0012\",\"\\\\u0013\",\"\\\\u0014\",\"\\\\u0015\",\"\\\\u0016\",\"\\\\u0017\",\"\\\\u0018\",\"\\\\u0019\",\"\\\\u001a\",\"\\\\u001b\",\"\\\\u001c\",\"\\\\u001d\",\"\\\\u001e\",\"\\\\u001f\"];Sys.Serialization.JavaScriptSerializer._charsToEscape[0]=\"\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[\"\\\\\"]=new RegExp(\"\\\\\\\\\",\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[\"\\\\\"]=\"\\\\\\\\\";Sys.Serialization.JavaScriptSerializer._charsToEscape[1]='\"';Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs['\"']=new RegExp('\"',\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars['\"']='\\\\\"';for(var a=0;a<32;a++){var b=String.fromCharCode(a);Sys.Serialization.JavaScriptSerializer._charsToEscape[a+2]=b;Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b]=new RegExp(b,\"g\");Sys.Serialization.JavaScriptSerializer._escapeChars[b]=c[a]}};Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder=function(b,a){a.append(b.toString())};Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder=function(a,b){if(isFinite(a))b.append(String(a));else throw Error.invalidOperation(Sys.Res.cannotSerializeNonFiniteNumbers)};Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder=function(a,c){c.append('\"');if(Sys.Serialization.JavaScriptSerializer._escapeRegEx.test(a)){if(Sys.Serialization.JavaScriptSerializer._charsToEscape.length===0)Sys.Serialization.JavaScriptSerializer._init();if(a.length<128)a=a.replace(Sys.Serialization.JavaScriptSerializer._escapeRegExGlobal,function(a){return Sys.Serialization.JavaScriptSerializer._escapeChars[a]});else for(var d=0;d<34;d++){var b=Sys.Serialization.JavaScriptSerializer._charsToEscape[d];if(a.indexOf(b)!==-1)if(Sys.Browser.agent===Sys.Browser.Opera||Sys.Browser.agent===Sys.Browser.FireFox)a=a.split(b).join(Sys.Serialization.JavaScriptSerializer._escapeChars[b]);else a=a.replace(Sys.Serialization.JavaScriptSerializer._charsToEscapeRegExs[b],Sys.Serialization.JavaScriptSerializer._escapeChars[b])}}c.append(a);c.append('\"')};Sys.Serialization.JavaScriptSerializer._serializeWithBuilder=function(b,a,i,g){var c;switch(typeof b){case \"object\":if(b)if(Number.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);else if(Boolean.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);else if(String.isInstanceOfType(b))Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);else if(Array.isInstanceOfType(b)){a.append(\"[\");for(c=0;c<b.length;++c){if(c>0)a.append(\",\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b[c],a,false,g)}a.append(\"]\")}else{if(Date.isInstanceOfType(b)){a.append('\"\\\\/Date(');a.append(b.getTime());a.append(')\\\\/\"');break}var d=[],f=0;for(var e in b){if(e.startsWith(\"$\"))continue;if(e===Sys.Serialization.JavaScriptSerializer._serverTypeFieldName&&f!==0){d[f++]=d[0];d[0]=e}else d[f++]=e}if(i)d.sort();a.append(\"{\");var j=false;for(c=0;c<f;c++){var h=b[d[c]];if(typeof h!==\"undefined\"&&typeof h!==\"function\"){if(j)a.append(\",\");else j=true;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(d[c],a,i,g);a.append(\":\");Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(h,a,i,g)}}a.append(\"}\")}else a.append(\"null\");break;case \"number\":Sys.Serialization.JavaScriptSerializer._serializeNumberWithBuilder(b,a);break;case \"string\":Sys.Serialization.JavaScriptSerializer._serializeStringWithBuilder(b,a);break;case \"boolean\":Sys.Serialization.JavaScriptSerializer._serializeBooleanWithBuilder(b,a);break;default:a.append(\"null\")}};Sys.Serialization.JavaScriptSerializer.serialize=function(b){var a=new Sys.StringBuilder;Sys.Serialization.JavaScriptSerializer._serializeWithBuilder(b,a,false);return a.toString()};Sys.Serialization.JavaScriptSerializer.deserialize=function(data,secure){if(data.length===0)throw Error.argument(\"data\",Sys.Res.cannotDeserializeEmptyString);try{var exp=data.replace(Sys.Serialization.JavaScriptSerializer._dateRegEx,\"$1new Date($2)\");if(secure&&Sys.Serialization.JavaScriptSerializer._jsonRegEx.test(exp.replace(Sys.Serialization.JavaScriptSerializer._jsonStringRegEx,\"\")))throw null;return eval(\"(\"+exp+\")\")}catch(a){throw Error.argument(\"data\",Sys.Res.cannotDeserializeInvalidJson)}};"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxTimer.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxTimer.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxTimer.js\nType._registerScript(\"Timer.js\",[\"MicrosoftAjaxComponentModel.js\"]);Sys.UI._Timer=function(a){Sys.UI._Timer.initializeBase(this,[a]);this._interval=60000;this._enabled=true;this._postbackPending=false;this._raiseTickDelegate=null;this._endRequestHandlerDelegate=null;this._timer=null;this._pageRequestManager=null;this._uniqueID=null};Sys.UI._Timer.prototype={get_enabled:function(){return this._enabled},set_enabled:function(a){this._enabled=a},get_interval:function(){return this._interval},set_interval:function(a){this._interval=a},get_uniqueID:function(){return this._uniqueID},set_uniqueID:function(a){this._uniqueID=a},dispose:function(){this._stopTimer();if(this._pageRequestManager!==null)this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);Sys.UI._Timer.callBaseMethod(this,\"dispose\")},_doPostback:function(){__doPostBack(this.get_uniqueID(),\"\")},_handleEndRequest:function(c,b){var a=b.get_dataItems()[this.get_id()];if(a)this._update(a[0],a[1]);if(this._postbackPending===true&&this._pageRequestManager!==null&&this._pageRequestManager.get_isInAsyncPostBack()===false){this._postbackPending=false;this._doPostback()}},initialize:function(){Sys.UI._Timer.callBaseMethod(this,\"initialize\");this._raiseTickDelegate=Function.createDelegate(this,this._raiseTick);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null)this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate);if(this.get_enabled())this._startTimer()},_raiseTick:function(){this._startTimer();if(this._pageRequestManager===null||!this._pageRequestManager.get_isInAsyncPostBack()){this._doPostback();this._postbackPending=false}else this._postbackPending=true},_startTimer:function(){this._timer=window.setTimeout(Function.createDelegate(this,this._raiseTick),this.get_interval())},_stopTimer:function(){if(this._timer!==null){window.clearTimeout(this._timer);this._timer=null}},_update:function(c,b){var a=!this.get_enabled(),d=this.get_interval()!==b;if(!a&&(!c||d)){this._stopTimer();a=true}this.set_enabled(c);this.set_interval(b);if(this.get_enabled()&&a)this._startTimer()}};Sys.UI._Timer.registerClass(\"Sys.UI._Timer\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebForms.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebForms.js\nType._registerScript(\"MicrosoftAjaxWebForms.js\",[\"MicrosoftAjaxCore.js\",\"MicrosoftAjaxSerialization.js\",\"MicrosoftAjaxNetwork.js\",\"MicrosoftAjaxComponentModel.js\"]);Type.registerNamespace(\"Sys.WebForms\");Sys.WebForms.BeginRequestEventArgs=function(c,b,a){Sys.WebForms.BeginRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.BeginRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]}};Sys.WebForms.BeginRequestEventArgs.registerClass(\"Sys.WebForms.BeginRequestEventArgs\",Sys.EventArgs);Sys.WebForms.EndRequestEventArgs=function(c,a,b){Sys.WebForms.EndRequestEventArgs.initializeBase(this);this._errorHandled=false;this._error=c;this._dataItems=a||{};this._response=b};Sys.WebForms.EndRequestEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_error:function(){return this._error},get_errorHandled:function(){return this._errorHandled},set_errorHandled:function(a){this._errorHandled=a},get_response:function(){return this._response}};Sys.WebForms.EndRequestEventArgs.registerClass(\"Sys.WebForms.EndRequestEventArgs\",Sys.EventArgs);Sys.WebForms.InitializeRequestEventArgs=function(c,b,a){Sys.WebForms.InitializeRequestEventArgs.initializeBase(this);this._request=c;this._postBackElement=b;this._updatePanelsToUpdate=a};Sys.WebForms.InitializeRequestEventArgs.prototype={get_postBackElement:function(){return this._postBackElement},get_request:function(){return this._request},get_updatePanelsToUpdate:function(){return this._updatePanelsToUpdate?Array.clone(this._updatePanelsToUpdate):[]},set_updatePanelsToUpdate:function(a){this._updated=true;this._updatePanelsToUpdate=a}};Sys.WebForms.InitializeRequestEventArgs.registerClass(\"Sys.WebForms.InitializeRequestEventArgs\",Sys.CancelEventArgs);Sys.WebForms.PageLoadedEventArgs=function(b,a,c){Sys.WebForms.PageLoadedEventArgs.initializeBase(this);this._panelsUpdated=b;this._panelsCreated=a;this._dataItems=c||{}};Sys.WebForms.PageLoadedEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsCreated:function(){return this._panelsCreated},get_panelsUpdated:function(){return this._panelsUpdated}};Sys.WebForms.PageLoadedEventArgs.registerClass(\"Sys.WebForms.PageLoadedEventArgs\",Sys.EventArgs);Sys.WebForms.PageLoadingEventArgs=function(b,a,c){Sys.WebForms.PageLoadingEventArgs.initializeBase(this);this._panelsUpdating=b;this._panelsDeleting=a;this._dataItems=c||{}};Sys.WebForms.PageLoadingEventArgs.prototype={get_dataItems:function(){return this._dataItems},get_panelsDeleting:function(){return this._panelsDeleting},get_panelsUpdating:function(){return this._panelsUpdating}};Sys.WebForms.PageLoadingEventArgs.registerClass(\"Sys.WebForms.PageLoadingEventArgs\",Sys.EventArgs);Sys._ScriptLoader=function(){this._scriptsToLoad=null;this._sessions=[];this._scriptLoadedDelegate=Function.createDelegate(this,this._scriptLoadedHandler)};Sys._ScriptLoader.prototype={dispose:function(){this._stopSession();this._loading=false;if(this._events)delete this._events;this._sessions=null;this._currentSession=null;this._scriptLoadedDelegate=null},loadScripts:function(d,b,c,a){var e={allScriptsLoadedCallback:b,scriptLoadFailedCallback:c,scriptLoadTimeoutCallback:a,scriptsToLoad:this._scriptsToLoad,scriptTimeout:d};this._scriptsToLoad=null;this._sessions[this._sessions.length]=e;if(!this._loading)this._nextSession()},queueCustomScriptTag:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,a)},queueScriptBlock:function(a){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{text:a})},queueScriptReference:function(a,b){if(!this._scriptsToLoad)this._scriptsToLoad=[];Array.add(this._scriptsToLoad,{src:a,fallback:b})},_createScriptElement:function(c){var a=document.createElement(\"script\");a.type=\"text/javascript\";for(var b in c)a[b]=c[b];return a},_loadScriptsInternal:function(){var c=this._currentSession;if(c.scriptsToLoad&&c.scriptsToLoad.length>0){var b=Array.dequeue(c.scriptsToLoad),f=this._scriptLoadedDelegate;if(b.fallback){var g=b.fallback;delete b.fallback;var d=this;f=function(b,a){a||function(){var a=d._createScriptElement({src:g});d._currentTask=new Sys._ScriptLoaderTask(a,d._scriptLoadedDelegate);d._currentTask.execute()}()}}var a=this._createScriptElement(b);if(a.text&&Sys.Browser.agent===Sys.Browser.Safari){a.innerHTML=a.text;delete a.text}if(typeof b.src===\"string\"){this._currentTask=new Sys._ScriptLoaderTask(a,f);this._currentTask.execute()}else{document.getElementsByTagName(\"head\")[0].appendChild(a);Sys._ScriptLoaderTask._clearScript(a);this._loadScriptsInternal()}}else{this._stopSession();var e=c.allScriptsLoadedCallback;if(e)e(this);this._nextSession()}},_nextSession:function(){if(this._sessions.length===0){this._loading=false;this._currentSession=null;return}this._loading=true;var a=Array.dequeue(this._sessions);this._currentSession=a;if(a.scriptTimeout>0)this._timeoutCookie=window.setTimeout(Function.createDelegate(this,this._scriptLoadTimeoutHandler),a.scriptTimeout*1000);this._loadScriptsInternal()},_raiseError:function(){var b=this._currentSession.scriptLoadFailedCallback,a=this._currentTask.get_scriptElement();this._stopSession();if(b){b(this,a);this._nextSession()}else{this._loading=false;throw Sys._ScriptLoader._errorScriptLoadFailed(a.src)}},_scriptLoadedHandler:function(a,b){if(b){Array.add(Sys._ScriptLoader._getLoadedScripts(),a.src);this._currentTask.dispose();this._currentTask=null;this._loadScriptsInternal()}else this._raiseError()},_scriptLoadTimeoutHandler:function(){var a=this._currentSession.scriptLoadTimeoutCallback;this._stopSession();if(a)a(this);this._nextSession()},_stopSession:function(){if(this._timeoutCookie){window.clearTimeout(this._timeoutCookie);this._timeoutCookie=null}if(this._currentTask){this._currentTask.dispose();this._currentTask=null}}};Sys._ScriptLoader.registerClass(\"Sys._ScriptLoader\",null,Sys.IDisposable);Sys._ScriptLoader.getInstance=function(){var a=Sys._ScriptLoader._activeInstance;if(!a)a=Sys._ScriptLoader._activeInstance=new Sys._ScriptLoader;return a};Sys._ScriptLoader.isScriptLoaded=function(b){var a=document.createElement(\"script\");a.src=b;return Array.contains(Sys._ScriptLoader._getLoadedScripts(),a.src)};Sys._ScriptLoader.readLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){var c=Sys._ScriptLoader._referencedScripts=[],d=document.getElementsByTagName(\"script\");for(var b=d.length-1;b>=0;b--){var e=d[b],a=e.src;if(a.length)if(!Array.contains(c,a))Array.add(c,a)}}};Sys._ScriptLoader._errorScriptLoadFailed=function(b){var a;a=Sys.Res.scriptLoadFailed;var d=\"Sys.ScriptLoadFailedException: \"+String.format(a,b),c=Error.create(d,{name:\"Sys.ScriptLoadFailedException\",\"scriptUrl\":b});c.popStackFrame();return c};Sys._ScriptLoader._getLoadedScripts=function(){if(!Sys._ScriptLoader._referencedScripts){Sys._ScriptLoader._referencedScripts=[];Sys._ScriptLoader.readLoadedScripts()}return Sys._ScriptLoader._referencedScripts};Sys.WebForms.PageRequestManager=function(){this._form=null;this._activeDefaultButton=null;this._activeDefaultButtonClicked=false;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._updatePanelHasChildrenAsTriggers=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._scriptManagerID=null;this._pageLoadedHandler=null;this._additionalInput=null;this._onsubmit=null;this._onSubmitStatements=[];this._originalDoPostBack=null;this._originalDoPostBackWithOptions=null;this._originalFireDefaultButton=null;this._originalDoCallback=null;this._isCrossPost=false;this._postBackSettings=null;this._request=null;this._onFormSubmitHandler=null;this._onFormElementClickHandler=null;this._onWindowUnloadHandler=null;this._asyncPostBackTimeout=null;this._controlIDToFocus=null;this._scrollPosition=null;this._processingRequest=false;this._scriptDisposes={};this._transientFields=[\"__VIEWSTATEENCRYPTED\",\"__VIEWSTATEFIELDCOUNT\"];this._textTypes=/^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i};Sys.WebForms.PageRequestManager.prototype={_get_eventHandlerList:function(){if(!this._events)this._events=new Sys.EventHandlerList;return this._events},get_isInAsyncPostBack:function(){return this._request!==null},add_beginRequest:function(a){this._get_eventHandlerList().addHandler(\"beginRequest\",a)},remove_beginRequest:function(a){this._get_eventHandlerList().removeHandler(\"beginRequest\",a)},add_endRequest:function(a){this._get_eventHandlerList().addHandler(\"endRequest\",a)},remove_endRequest:function(a){this._get_eventHandlerList().removeHandler(\"endRequest\",a)},add_initializeRequest:function(a){this._get_eventHandlerList().addHandler(\"initializeRequest\",a)},remove_initializeRequest:function(a){this._get_eventHandlerList().removeHandler(\"initializeRequest\",a)},add_pageLoaded:function(a){this._get_eventHandlerList().addHandler(\"pageLoaded\",a)},remove_pageLoaded:function(a){this._get_eventHandlerList().removeHandler(\"pageLoaded\",a)},add_pageLoading:function(a){this._get_eventHandlerList().addHandler(\"pageLoading\",a)},remove_pageLoading:function(a){this._get_eventHandlerList().removeHandler(\"pageLoading\",a)},abortPostBack:function(){if(!this._processingRequest&&this._request){this._request.get_executor().abort();this._request=null}},beginAsyncPostBack:function(c,a,f,d,e){if(d&&typeof Page_ClientValidate===\"function\"&&!Page_ClientValidate(e||null))return;this._postBackSettings=this._createPostBackSettings(true,c,a);var b=this._form;b.__EVENTTARGET.value=a||\"\";b.__EVENTARGUMENT.value=f||\"\";this._isCrossPost=false;this._additionalInput=null;this._onFormSubmit()},_cancelPendingCallbacks:function(){for(var a=0,e=window.__pendingCallbacks.length;a<e;a++){var c=window.__pendingCallbacks[a];if(c){if(!c.async)window.__synchronousCallBackIndex=-1;window.__pendingCallbacks[a]=null;var d=\"__CALLBACKFRAME\"+a,b=document.getElementById(d);if(b)b.parentNode.removeChild(b)}}},_commitControls:function(a,b){if(a){this._updatePanelIDs=a.updatePanelIDs;this._updatePanelClientIDs=a.updatePanelClientIDs;this._updatePanelHasChildrenAsTriggers=a.updatePanelHasChildrenAsTriggers;this._asyncPostBackControlIDs=a.asyncPostBackControlIDs;this._asyncPostBackControlClientIDs=a.asyncPostBackControlClientIDs;this._postBackControlIDs=a.postBackControlIDs;this._postBackControlClientIDs=a.postBackControlClientIDs}if(typeof b!==\"undefined\"&&b!==null)this._asyncPostBackTimeout=b*1000},_createHiddenField:function(c,d){var b,a=document.getElementById(c);if(a)if(!a._isContained)a.parentNode.removeChild(a);else b=a.parentNode;if(!b){b=document.createElement(\"span\");b.style.cssText=\"display:none !important\";this._form.appendChild(b)}b.innerHTML=\"<input type='hidden' />\";a=b.childNodes[0];a._isContained=true;a.id=a.name=c;a.value=d},_createPageRequestManagerTimeoutError:function(){var b=\"Sys.WebForms.PageRequestManagerTimeoutException: \"+Sys.WebForms.Res.PRM_TimeoutError,a=Error.create(b,{name:\"Sys.WebForms.PageRequestManagerTimeoutException\"});a.popStackFrame();return a},_createPageRequestManagerServerError:function(a,d){var c=\"Sys.WebForms.PageRequestManagerServerErrorException: \"+(d||String.format(Sys.WebForms.Res.PRM_ServerError,a)),b=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerServerErrorException\",httpStatusCode:a});b.popStackFrame();return b},_createPageRequestManagerParserError:function(b){var c=\"Sys.WebForms.PageRequestManagerParserErrorException: \"+String.format(Sys.WebForms.Res.PRM_ParserError,b),a=Error.create(c,{name:\"Sys.WebForms.PageRequestManagerParserErrorException\"});a.popStackFrame();return a},_createPanelID:function(e,b){var c=b.asyncTarget,a=this._ensureUniqueIds(e||b.panelsToUpdate),d=a instanceof Array?a.join(\",\"):a||this._scriptManagerID;if(c)d+=\"|\"+c;return encodeURIComponent(this._scriptManagerID)+\"=\"+encodeURIComponent(d)+\"&\"},_createPostBackSettings:function(d,a,c,b){return {async:d,asyncTarget:c,panelsToUpdate:a,sourceElement:b}},_convertToClientIDs:function(a,f,e,d){if(a)for(var b=0,h=a.length;b<h;b+=d?2:1){var c=a[b],g=(d?a[b+1]:\"\")||this._uniqueIDToClientID(c);Array.add(f,c);Array.add(e,g)}},dispose:function(){if(this._form){Sys.UI.DomEvent.removeHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.removeHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.removeHandler(window,\"unload\",this._onWindowUnloadHandler);Sys.UI.DomEvent.removeHandler(window,\"load\",this._pageLoadedHandler)}if(this._originalDoPostBack){window.__doPostBack=this._originalDoPostBack;this._originalDoPostBack=null}if(this._originalDoPostBackWithOptions){window.WebForm_DoPostBackWithOptions=this._originalDoPostBackWithOptions;this._originalDoPostBackWithOptions=null}if(this._originalFireDefaultButton){window.WebForm_FireDefaultButton=this._originalFireDefaultButton;this._originalFireDefaultButton=null}if(this._originalDoCallback){window.WebForm_DoCallback=this._originalDoCallback;this._originalDoCallback=null}this._form=null;this._updatePanelIDs=null;this._updatePanelClientIDs=null;this._asyncPostBackControlIDs=null;this._asyncPostBackControlClientIDs=null;this._postBackControlIDs=null;this._postBackControlClientIDs=null;this._asyncPostBackTimeout=null;this._scrollPosition=null;this._activeElement=null},_doCallback:function(d,b,c,f,a,e){if(!this.get_isInAsyncPostBack())this._originalDoCallback(d,b,c,f,a,e)},_doPostBack:function(a,k){var f=window.event;if(!f){var d=arguments.callee?arguments.callee.caller:null;if(d){var j=30;while(d.arguments.callee.caller&&--j)d=d.arguments.callee.caller;f=j&&d.arguments.length?d.arguments[0]:null}}this._additionalInput=null;var h=this._form;if(a===null||typeof a===\"undefined\"||this._isCrossPost){this._postBackSettings=this._createPostBackSettings(false);this._isCrossPost=false}else{var c=this._masterPageUniqueID,l=this._uniqueIDToClientID(a),g=document.getElementById(l);if(!g&&c)if(a.indexOf(c+\"$\")===0)g=document.getElementById(l.substr(c.length+1));if(!g)if(Array.contains(this._asyncPostBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(true,null,a);else if(Array.contains(this._postBackControlIDs,a))this._postBackSettings=this._createPostBackSettings(false);else{var e=this._findNearestElement(a);if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{if(c){c+=\"$\";if(a.indexOf(c)===0)e=this._findNearestElement(a.substr(c.length))}if(e)this._postBackSettings=this._getPostBackSettings(e,a);else{var b;try{b=f?f.target||f.srcElement:null}catch(n){}b=b||this._activeElement;var m=/__doPostBack\\(|WebForm_DoPostBackWithOptions\\(/;function i(b){b=b?b.toString():\"\";return m.test(b)&&b.indexOf(\"'\"+a+\"'\")!==-1||b.indexOf('\"'+a+'\"')!==-1}if(b&&(b.name===a||i(b.href)||i(b.onclick)||i(b.onchange)))this._postBackSettings=this._getPostBackSettings(b,a);else this._postBackSettings=this._createPostBackSettings(false)}}}else this._postBackSettings=this._getPostBackSettings(g,a)}if(!this._postBackSettings.async){h.onsubmit=this._onsubmit;this._originalDoPostBack(a,k);h.onsubmit=null;return}h.__EVENTTARGET.value=a;h.__EVENTARGUMENT.value=k;this._onFormSubmit()},_doPostBackWithOptions:function(a){this._isCrossPost=a&&a.actionUrl;var d=true;if(a.validation)if(typeof Page_ClientValidate==\"function\")d=Page_ClientValidate(a.validationGroup);if(d){if(typeof a.actionUrl!=\"undefined\"&&a.actionUrl!=null&&a.actionUrl.length>0)theForm.action=a.actionUrl;if(a.trackFocus){var c=theForm.elements[\"__LASTFOCUS\"];if(typeof c!=\"undefined\"&&c!=null)if(typeof document.activeElement==\"undefined\")c.value=a.eventTarget;else{var b=document.activeElement;if(typeof b!=\"undefined\"&&b!=null)if(typeof b.id!=\"undefined\"&&b.id!=null&&b.id.length>0)c.value=b.id;else if(typeof b.name!=\"undefined\")c.value=b.name}}}if(a.clientSubmit)this._doPostBack(a.eventTarget,a.eventArgument)},_elementContains:function(b,a){while(a){if(a===b)return true;a=a.parentNode}return false},_endPostBack:function(a,d,f){if(this._request===d.get_webRequest()){this._processingRequest=false;this._additionalInput=null;this._request=null}var e=this._get_eventHandlerList().getHandler(\"endRequest\"),b=false;if(e){var c=new Sys.WebForms.EndRequestEventArgs(a,f?f.dataItems:{},d);e(this,c);b=c.get_errorHandled()}if(a&&!b)throw a},_ensureUniqueIds:function(a){if(!a)return a;a=a instanceof Array?a:[a];var c=[];for(var b=0,f=a.length;b<f;b++){var e=a[b],d=Array.indexOf(this._updatePanelClientIDs,e);c.push(d>-1?this._updatePanelIDs[d]:e)}return c},_findNearestElement:function(a){while(a.length>0){var d=this._uniqueIDToClientID(a),c=document.getElementById(d);if(c)return c;var b=a.lastIndexOf(\"$\");if(b===-1)return null;a=a.substring(0,b)}return null},_findText:function(b,a){var c=Math.max(0,a-20),d=Math.min(b.length,a+20);return b.substring(c,d)},_fireDefaultButton:function(a,d){if(a.keyCode===13){var c=a.srcElement||a.target;if(!c||c.tagName.toLowerCase()!==\"textarea\"){var b=document.getElementById(d);if(b&&typeof b.click!==\"undefined\"){this._activeDefaultButton=b;this._activeDefaultButtonClicked=false;try{b.click()}finally{this._activeDefaultButton=null}a.cancelBubble=true;if(typeof a.stopPropagation===\"function\")a.stopPropagation();return false}}}return true},_getPageLoadedEventArgs:function(n,c){var m=[],l=[],k=c?c.version4:false,d=c?c.updatePanelData:null,e,g,h,b;if(!d){e=this._updatePanelIDs;g=this._updatePanelClientIDs;h=null;b=null}else{e=d.updatePanelIDs;g=d.updatePanelClientIDs;h=d.childUpdatePanelIDs;b=d.panelsToRefreshIDs}var a,f,j,i;if(b)for(a=0,f=b.length;a<f;a+=k?2:1){j=b[a];i=(k?b[a+1]:\"\")||this._uniqueIDToClientID(j);Array.add(m,document.getElementById(i))}for(a=0,f=e.length;a<f;a++)if(n||Array.indexOf(h,e[a])!==-1)Array.add(l,document.getElementById(g[a]));return new Sys.WebForms.PageLoadedEventArgs(m,l,c?c.dataItems:{})},_getPageLoadingEventArgs:function(f){var j=[],i=[],c=f.updatePanelData,k=c.oldUpdatePanelIDs,l=c.oldUpdatePanelClientIDs,n=c.updatePanelIDs,m=c.childUpdatePanelIDs,d=c.panelsToRefreshIDs,a,e,b,g,h=f.version4;for(a=0,e=d.length;a<e;a+=h?2:1){b=d[a];g=(h?d[a+1]:\"\")||this._uniqueIDToClientID(b);Array.add(j,document.getElementById(g))}for(a=0,e=k.length;a<e;a++){b=k[a];if(Array.indexOf(d,b)===-1&&(Array.indexOf(n,b)===-1||Array.indexOf(m,b)>-1))Array.add(i,document.getElementById(l[a]))}return new Sys.WebForms.PageLoadingEventArgs(j,i,f.dataItems)},_getPostBackSettings:function(a,c){var d=a,b=null;while(a){if(a.id){if(!b&&Array.contains(this._asyncPostBackControlClientIDs,a.id))b=this._createPostBackSettings(true,null,c,d);else if(!b&&Array.contains(this._postBackControlClientIDs,a.id))return this._createPostBackSettings(false);else{var e=Array.indexOf(this._updatePanelClientIDs,a.id);if(e!==-1)if(this._updatePanelHasChildrenAsTriggers[e])return this._createPostBackSettings(true,[this._updatePanelIDs[e]],c,d);else return this._createPostBackSettings(true,null,c,d)}if(!b&&this._matchesParentIDInList(a.id,this._asyncPostBackControlClientIDs))b=this._createPostBackSettings(true,null,c,d);else if(!b&&this._matchesParentIDInList(a.id,this._postBackControlClientIDs))return this._createPostBackSettings(false)}a=a.parentNode}if(!b)return this._createPostBackSettings(false);else return b},_getScrollPosition:function(){var a=document.documentElement;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else{a=document.body;if(a&&(this._validPosition(a.scrollLeft)||this._validPosition(a.scrollTop)))return {x:a.scrollLeft,y:a.scrollTop};else if(this._validPosition(window.pageXOffset)||this._validPosition(window.pageYOffset))return {x:window.pageXOffset,y:window.pageYOffset};else return {x:0,y:0}}},_initializeInternal:function(f,g,a,b,e,c,d){if(this._prmInitialized)throw Error.invalidOperation(Sys.WebForms.Res.PRM_CannotRegisterTwice);this._prmInitialized=true;this._masterPageUniqueID=d;this._scriptManagerID=f;this._form=Sys.UI.DomElement.resolveElement(g);this._onsubmit=this._form.onsubmit;this._form.onsubmit=null;this._onFormSubmitHandler=Function.createDelegate(this,this._onFormSubmit);this._onFormElementClickHandler=Function.createDelegate(this,this._onFormElementClick);this._onWindowUnloadHandler=Function.createDelegate(this,this._onWindowUnload);Sys.UI.DomEvent.addHandler(this._form,\"submit\",this._onFormSubmitHandler);Sys.UI.DomEvent.addHandler(this._form,\"click\",this._onFormElementClickHandler);Sys.UI.DomEvent.addHandler(window,\"unload\",this._onWindowUnloadHandler);this._originalDoPostBack=window.__doPostBack;if(this._originalDoPostBack)window.__doPostBack=Function.createDelegate(this,this._doPostBack);this._originalDoPostBackWithOptions=window.WebForm_DoPostBackWithOptions;if(this._originalDoPostBackWithOptions)window.WebForm_DoPostBackWithOptions=Function.createDelegate(this,this._doPostBackWithOptions);this._originalFireDefaultButton=window.WebForm_FireDefaultButton;if(this._originalFireDefaultButton)window.WebForm_FireDefaultButton=Function.createDelegate(this,this._fireDefaultButton);this._originalDoCallback=window.WebForm_DoCallback;if(this._originalDoCallback)window.WebForm_DoCallback=Function.createDelegate(this,this._doCallback);this._pageLoadedHandler=Function.createDelegate(this,this._pageLoadedInitialLoad);Sys.UI.DomEvent.addHandler(window,\"load\",this._pageLoadedHandler);if(a)this._updateControls(a,b,e,c,true)},_matchesParentIDInList:function(c,b){for(var a=0,d=b.length;a<d;a++)if(c.startsWith(b[a]+\"_\"))return true;return false},_onFormElementActive:function(a,d,e){if(a.disabled)return;this._activeElement=a;this._postBackSettings=this._getPostBackSettings(a,a.name);if(a.name){var b=a.tagName.toUpperCase();if(b===\"INPUT\"){var c=a.type;if(c===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value);else if(c===\"image\")this._additionalInput=encodeURIComponent(a.name)+\".x=\"+d+\"&\"+encodeURIComponent(a.name)+\".y=\"+e}else if(b===\"BUTTON\"&&a.name.length!==0&&a.type===\"submit\")this._additionalInput=encodeURIComponent(a.name)+\"=\"+encodeURIComponent(a.value)}},_onFormElementClick:function(a){this._activeDefaultButtonClicked=a.target===this._activeDefaultButton;this._onFormElementActive(a.target,a.offsetX,a.offsetY)},_onFormSubmit:function(i){var f,x,h=true,z=this._isCrossPost;this._isCrossPost=false;if(this._onsubmit)h=this._onsubmit();if(h)for(f=0,x=this._onSubmitStatements.length;f<x;f++)if(!this._onSubmitStatements[f]()){h=false;break}if(!h){if(i)i.preventDefault();return}var w=this._form;if(z)return;if(this._activeDefaultButton&&!this._activeDefaultButtonClicked)this._onFormElementActive(this._activeDefaultButton,0,0);if(!this._postBackSettings||!this._postBackSettings.async)return;var b=new Sys.StringBuilder,s=w.elements,B=s.length,t=this._createPanelID(null,this._postBackSettings);b.append(t);for(f=0;f<B;f++){var e=s[f],g=e.name;if(typeof g===\"undefined\"||g===null||g.length===0||g===this._scriptManagerID)continue;var n=e.tagName.toUpperCase();if(n===\"INPUT\"){var p=e.type;if(this._textTypes.test(p)||(p===\"checkbox\"||p===\"radio\")&&e.checked){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}else if(n===\"SELECT\"){var A=e.options.length;for(var q=0;q<A;q++){var u=e.options[q];if(u.selected){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(u.value));b.append(\"&\")}}}else if(n===\"TEXTAREA\"){b.append(encodeURIComponent(g));b.append(\"=\");b.append(encodeURIComponent(e.value));b.append(\"&\")}}b.append(\"__ASYNCPOST=true&\");if(this._additionalInput){b.append(this._additionalInput);this._additionalInput=null}var c=new Sys.Net.WebRequest,a=w.action;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var r=a.indexOf(\"#\");if(r!==-1)a=a.substr(0,r);var o=\"\",v=\"\",m=a.indexOf(\"?\");if(m!==-1){v=a.substr(m);a=a.substr(0,m)}if(/^https?\\:\\/\\/.*$/gi.test(a)){var y=a.indexOf(\"//\")+2,l=a.indexOf(\"/\",y);if(l===-1){o=a;a=\"\"}else{o=a.substr(0,l);a=a.substr(l)}}a=o+encodeURI(decodeURI(a))+v}c.set_url(a);c.get_headers()[\"X-MicrosoftAjax\"]=\"Delta=true\";c.get_headers()[\"Cache-Control\"]=\"no-cache\";c.set_timeout(this._asyncPostBackTimeout);c.add_completed(Function.createDelegate(this,this._onFormSubmitCompleted));c.set_body(b.toString());var j,d,k=this._get_eventHandlerList().getHandler(\"initializeRequest\");if(k){j=this._postBackSettings.panelsToUpdate;d=new Sys.WebForms.InitializeRequestEventArgs(c,this._postBackSettings.sourceElement,j);k(this,d);h=!d.get_cancel()}if(!h){if(i)i.preventDefault();return}if(d&&d._updated){j=d.get_updatePanelsToUpdate();c.set_body(c.get_body().replace(t,this._createPanelID(j,this._postBackSettings)))}this._scrollPosition=this._getScrollPosition();this.abortPostBack();k=this._get_eventHandlerList().getHandler(\"beginRequest\");if(k){d=new Sys.WebForms.BeginRequestEventArgs(c,this._postBackSettings.sourceElement,j||this._postBackSettings.panelsToUpdate);k(this,d)}if(this._originalDoCallback)this._cancelPendingCallbacks();this._request=c;this._processingRequest=false;c.invoke();if(i)i.preventDefault()},_onFormSubmitCompleted:function(c){this._processingRequest=true;if(c.get_timedOut()){this._endPostBack(this._createPageRequestManagerTimeoutError(),c,null);return}if(c.get_aborted()){this._endPostBack(null,c,null);return}if(!this._request||c.get_webRequest()!==this._request)return;if(c.get_statusCode()!==200){this._endPostBack(this._createPageRequestManagerServerError(c.get_statusCode()),c,null);return}var a=this._parseDelta(c);if(!a)return;var b,e;if(a.asyncPostBackControlIDsNode&&a.postBackControlIDsNode&&a.updatePanelIDsNode&&a.panelsToRefreshNode&&a.childUpdatePanelIDsNode){var r=this._updatePanelIDs,n=this._updatePanelClientIDs,i=a.childUpdatePanelIDsNode.content,p=i.length?i.split(\",\"):[],m=this._splitNodeIntoArray(a.asyncPostBackControlIDsNode),o=this._splitNodeIntoArray(a.postBackControlIDsNode),q=this._splitNodeIntoArray(a.updatePanelIDsNode),g=this._splitNodeIntoArray(a.panelsToRefreshNode),h=a.version4;for(b=0,e=g.length;b<e;b+=h?2:1){var j=(h?g[b+1]:\"\")||this._uniqueIDToClientID(g[b]);if(!document.getElementById(j)){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,j)),c,a);return}}var f=this._processUpdatePanelArrays(q,m,o,h);f.oldUpdatePanelIDs=r;f.oldUpdatePanelClientIDs=n;f.childUpdatePanelIDs=p;f.panelsToRefreshIDs=g;a.updatePanelData=f}a.dataItems={};var d;for(b=0,e=a.dataItemNodes.length;b<e;b++){d=a.dataItemNodes[b];a.dataItems[d.id]=d.content}for(b=0,e=a.dataItemJsonNodes.length;b<e;b++){d=a.dataItemJsonNodes[b];a.dataItems[d.id]=Sys.Serialization.JavaScriptSerializer.deserialize(d.content)}var l=this._get_eventHandlerList().getHandler(\"pageLoading\");if(l)l(this,this._getPageLoadingEventArgs(a));Sys._ScriptLoader.readLoadedScripts();Sys.Application.beginCreateComponents();var k=Sys._ScriptLoader.getInstance();this._queueScripts(k,a.scriptBlockNodes,true,false);this._processingRequest=true;k.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadComplete,a)),Function.createDelegate(this,Function.createCallback(this._scriptIncludesLoadFailed,a)),null)},_onWindowUnload:function(){this.dispose()},_pageLoaded:function(a,c){var b=this._get_eventHandlerList().getHandler(\"pageLoaded\");if(b)b(this,this._getPageLoadedEventArgs(a,c));if(!a)Sys.Application.raiseLoad()},_pageLoadedInitialLoad:function(){this._pageLoaded(true,null)},_parseDelta:function(h){var c=h.get_responseData(),d,i,E,F,D,b=0,e=null,k=[];while(b<c.length){d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}i=parseInt(c.substring(b,d),10);if(i%1!==0){e=this._findText(c,b);break}b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}E=c.substring(b,d);b=d+1;d=c.indexOf(\"|\",b);if(d===-1){e=this._findText(c,b);break}F=c.substring(b,d);b=d+1;if(b+i>=c.length){e=this._findText(c,c.length);break}D=c.substr(b,i);b+=i;if(c.charAt(b)!==\"|\"){e=this._findText(c,b);break}b++;Array.add(k,{type:E,id:F,content:D})}if(e){this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_ParserErrorDetails,e)),h,null);return null}var x=[],w=[],q=[],j=[],t=[],C=[],A=[],z=[],v=[],s=[],m,p,u,n,o,r,y,g;for(var l=0,G=k.length;l<G;l++){var a=k[l];switch(a.type){case \"#\":g=a;break;case \"updatePanel\":Array.add(x,a);break;case \"hiddenField\":Array.add(w,a);break;case \"arrayDeclaration\":Array.add(q,a);break;case \"scriptBlock\":Array.add(j,a);break;case \"fallbackScript\":j[j.length-1].fallback=a.id;case \"scriptStartupBlock\":Array.add(t,a);break;case \"expando\":Array.add(C,a);break;case \"onSubmit\":Array.add(A,a);break;case \"asyncPostBackControlIDs\":m=a;break;case \"postBackControlIDs\":p=a;break;case \"updatePanelIDs\":u=a;break;case \"asyncPostBackTimeout\":n=a;break;case \"childUpdatePanelIDs\":o=a;break;case \"panelsToRefreshIDs\":r=a;break;case \"formAction\":y=a;break;case \"dataItem\":Array.add(z,a);break;case \"dataItemJson\":Array.add(v,a);break;case \"scriptDispose\":Array.add(s,a);break;case \"pageRedirect\":if(g&&parseFloat(g.content)>=4)a.content=unescape(a.content);if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var f=document.createElement(\"a\");f.style.display=\"none\";f.attachEvent(\"onclick\",B);f.href=a.content;this._form.parentNode.insertBefore(f,this._form);f.click();f.detachEvent(\"onclick\",B);this._form.parentNode.removeChild(f);function B(a){a.cancelBubble=true}}else window.location.href=a.content;return null;case \"error\":this._endPostBack(this._createPageRequestManagerServerError(Number.parseInvariant(a.id),a.content),h,null);return null;case \"pageTitle\":document.title=a.content;break;case \"focus\":this._controlIDToFocus=a.content;break;default:this._endPostBack(this._createPageRequestManagerParserError(String.format(Sys.WebForms.Res.PRM_UnknownToken,a.type)),h,null);return null}}return {version4:g?parseFloat(g.content)>=4:false,executor:h,updatePanelNodes:x,hiddenFieldNodes:w,arrayDeclarationNodes:q,scriptBlockNodes:j,scriptStartupNodes:t,expandoNodes:C,onSubmitNodes:A,dataItemNodes:z,dataItemJsonNodes:v,scriptDisposeNodes:s,asyncPostBackControlIDsNode:m,postBackControlIDsNode:p,updatePanelIDsNode:u,asyncPostBackTimeoutNode:n,childUpdatePanelIDsNode:o,panelsToRefreshNode:r,formActionNode:y}},_processUpdatePanelArrays:function(e,q,r,f){var d,c,b;if(e){var i=e.length,j=f?2:1;d=new Array(i/j);c=new Array(i/j);b=new Array(i/j);for(var g=0,h=0;g<i;g+=j,h++){var p,a=e[g],k=f?e[g+1]:\"\";p=a.charAt(0)===\"t\";a=a.substr(1);if(!k)k=this._uniqueIDToClientID(a);b[h]=p;d[h]=a;c[h]=k}}else{d=[];c=[];b=[]}var n=[],l=[];this._convertToClientIDs(q,n,l,f);var o=[],m=[];this._convertToClientIDs(r,o,m,f);return {updatePanelIDs:d,updatePanelClientIDs:c,updatePanelHasChildrenAsTriggers:b,asyncPostBackControlIDs:n,asyncPostBackControlClientIDs:l,postBackControlIDs:o,postBackControlClientIDs:m}},_queueScripts:function(scriptLoader,scriptBlockNodes,queueIncludes,queueBlocks){for(var i=0,l=scriptBlockNodes.length;i<l;i++){var scriptBlockType=scriptBlockNodes[i].id;switch(scriptBlockType){case \"ScriptContentNoTags\":if(!queueBlocks)continue;scriptLoader.queueScriptBlock(scriptBlockNodes[i].content);break;case \"ScriptContentWithTags\":var scriptTagAttributes;eval(\"scriptTagAttributes = \"+scriptBlockNodes[i].content);if(scriptTagAttributes.src){if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(scriptTagAttributes.src))continue}else if(!queueBlocks)continue;scriptLoader.queueCustomScriptTag(scriptTagAttributes);break;case \"ScriptPath\":var script=scriptBlockNodes[i];if(!queueIncludes||Sys._ScriptLoader.isScriptLoaded(script.content))continue;scriptLoader.queueScriptReference(script.content,script.fallback)}}},_registerDisposeScript:function(a,b){if(!this._scriptDisposes[a])this._scriptDisposes[a]=[b];else Array.add(this._scriptDisposes[a],b)},_scriptIncludesLoadComplete:function(e,b){if(b.executor.get_webRequest()!==this._request)return;this._commitControls(b.updatePanelData,b.asyncPostBackTimeoutNode?b.asyncPostBackTimeoutNode.content:null);if(b.formActionNode)this._form.action=b.formActionNode.content;var a,d,c;for(a=0,d=b.updatePanelNodes.length;a<d;a++){c=b.updatePanelNodes[a];var j=document.getElementById(c.id);if(!j){this._endPostBack(Error.invalidOperation(String.format(Sys.WebForms.Res.PRM_MissingPanel,c.id)),b.executor,b);return}this._updatePanel(j,c.content)}for(a=0,d=b.scriptDisposeNodes.length;a<d;a++){c=b.scriptDisposeNodes[a];this._registerDisposeScript(c.id,c.content)}for(a=0,d=this._transientFields.length;a<d;a++){var g=document.getElementById(this._transientFields[a]);if(g){var k=g._isContained?g.parentNode:g;k.parentNode.removeChild(k)}}for(a=0,d=b.hiddenFieldNodes.length;a<d;a++){c=b.hiddenFieldNodes[a];this._createHiddenField(c.id,c.content)}if(b.scriptsFailed)throw Sys._ScriptLoader._errorScriptLoadFailed(b.scriptsFailed.src,b.scriptsFailed.multipleCallbacks);this._queueScripts(e,b.scriptBlockNodes,false,true);var i=\"\";for(a=0,d=b.arrayDeclarationNodes.length;a<d;a++){c=b.arrayDeclarationNodes[a];i+=\"Sys.WebForms.PageRequestManager._addArrayElement('\"+c.id+\"', \"+c.content+\");\\r\\n\"}var h=\"\";for(a=0,d=b.expandoNodes.length;a<d;a++){c=b.expandoNodes[a];h+=c.id+\" = \"+c.content+\"\\r\\n\"}if(i.length)e.queueScriptBlock(i);if(h.length)e.queueScriptBlock(h);this._queueScripts(e,b.scriptStartupNodes,true,true);var f=\"\";for(a=0,d=b.onSubmitNodes.length;a<d;a++){if(a===0)f=\"Array.add(Sys.WebForms.PageRequestManager.getInstance()._onSubmitStatements, function() {\\r\\n\";f+=b.onSubmitNodes[a].content+\"\\r\\n\"}if(f.length){f+=\"\\r\\nreturn true;\\r\\n});\\r\\n\";e.queueScriptBlock(f)}e.loadScripts(0,Function.createDelegate(this,Function.createCallback(this._scriptsLoadComplete,b)),null,null)},_scriptIncludesLoadFailed:function(d,c,b,a){a.scriptsFailed={src:c.src,multipleCallbacks:b};this._scriptIncludesLoadComplete(d,a)},_scriptsLoadComplete:function(f,c){var e=c.executor;if(window.__theFormPostData)window.__theFormPostData=\"\";if(window.__theFormPostCollection)window.__theFormPostCollection=[];if(window.WebForm_InitCallback)window.WebForm_InitCallback();if(this._scrollPosition){if(window.scrollTo)window.scrollTo(this._scrollPosition.x,this._scrollPosition.y);this._scrollPosition=null}Sys.Application.endCreateComponents();this._pageLoaded(false,c);this._endPostBack(null,e,c);if(this._controlIDToFocus){var a,d;if(Sys.Browser.agent===Sys.Browser.InternetExplorer){var b=$get(this._controlIDToFocus);a=b;if(b&&!WebForm_CanFocus(b))a=WebForm_FindFirstFocusableChild(b);if(a&&typeof a.contentEditable!==\"undefined\"){d=a.contentEditable;a.contentEditable=false}else a=null}WebForm_AutoFocus(this._controlIDToFocus);if(a)a.contentEditable=d;this._controlIDToFocus=null}},_splitNodeIntoArray:function(b){var a=b.content,c=a.length?a.split(\",\"):[];return c},_uniqueIDToClientID:function(a){return a.replace(/\\$/g,\"_\")},_updateControls:function(d,a,c,b,e){this._commitControls(this._processUpdatePanelArrays(d,a,c,e),b)},_updatePanel:function(updatePanelElement,rendering){for(var updatePanelID in this._scriptDisposes)if(this._elementContains(updatePanelElement,document.getElementById(updatePanelID))){var disposeScripts=this._scriptDisposes[updatePanelID];for(var i=0,l=disposeScripts.length;i<l;i++)eval(disposeScripts[i]);delete this._scriptDisposes[updatePanelID]}Sys.Application.disposeElement(updatePanelElement,true);updatePanelElement.innerHTML=rendering},_validPosition:function(a){return typeof a!==\"undefined\"&&a!==null&&a!==0}};Sys.WebForms.PageRequestManager.getInstance=function(){var a=Sys.WebForms.PageRequestManager._instance;if(!a)a=Sys.WebForms.PageRequestManager._instance=new Sys.WebForms.PageRequestManager;return a};Sys.WebForms.PageRequestManager._addArrayElement=function(a){if(!window[a])window[a]=[];for(var b=1,c=arguments.length;b<c;b++)Array.add(window[a],arguments[b])};Sys.WebForms.PageRequestManager._initialize=function(){var a=Sys.WebForms.PageRequestManager.getInstance();a._initializeInternal.apply(a,arguments)};Sys.WebForms.PageRequestManager.registerClass(\"Sys.WebForms.PageRequestManager\");Sys.UI._UpdateProgress=function(a){Sys.UI._UpdateProgress.initializeBase(this,[a]);this._displayAfter=500;this._dynamicLayout=true;this._associatedUpdatePanelId=null;this._beginRequestHandlerDelegate=null;this._startDelegate=null;this._endRequestHandlerDelegate=null;this._pageRequestManager=null;this._timerCookie=null};Sys.UI._UpdateProgress.prototype={get_displayAfter:function(){return this._displayAfter},set_displayAfter:function(a){this._displayAfter=a},get_dynamicLayout:function(){return this._dynamicLayout},set_dynamicLayout:function(a){this._dynamicLayout=a},get_associatedUpdatePanelId:function(){return this._associatedUpdatePanelId},set_associatedUpdatePanelId:function(a){this._associatedUpdatePanelId=a},get_role:function(){return \"status\"},_clearTimeout:function(){if(this._timerCookie){window.clearTimeout(this._timerCookie);this._timerCookie=null}},_getUniqueID:function(b){var a=Array.indexOf(this._pageRequestManager._updatePanelClientIDs,b);return a===-1?null:this._pageRequestManager._updatePanelIDs[a]},_handleBeginRequest:function(f,e){var b=e.get_postBackElement(),a=true,d=this._associatedUpdatePanelId;if(this._associatedUpdatePanelId){var c=e.get_updatePanelsToUpdate();if(c&&c.length)a=Array.contains(c,d)||Array.contains(c,this._getUniqueID(d));else a=false}while(!a&&b){if(b.id&&this._associatedUpdatePanelId===b.id)a=true;b=b.parentNode}if(a)this._timerCookie=window.setTimeout(this._startDelegate,this._displayAfter)},_startRequest:function(){if(this._pageRequestManager.get_isInAsyncPostBack()){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"block\";else a.style.visibility=\"visible\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"false\")}this._timerCookie=null},_handleEndRequest:function(){var a=this.get_element();if(this._dynamicLayout)a.style.display=\"none\";else a.style.visibility=\"hidden\";if(this.get_role()===\"status\")a.setAttribute(\"aria-hidden\",\"true\");this._clearTimeout()},dispose:function(){if(this._beginRequestHandlerDelegate!==null){this._pageRequestManager.remove_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);this._beginRequestHandlerDelegate=null;this._endRequestHandlerDelegate=null}this._clearTimeout();Sys.UI._UpdateProgress.callBaseMethod(this,\"dispose\")},initialize:function(){Sys.UI._UpdateProgress.callBaseMethod(this,\"initialize\");if(this.get_role()===\"status\")this.get_element().setAttribute(\"aria-hidden\",\"true\");this._beginRequestHandlerDelegate=Function.createDelegate(this,this._handleBeginRequest);this._endRequestHandlerDelegate=Function.createDelegate(this,this._handleEndRequest);this._startDelegate=Function.createDelegate(this,this._startRequest);if(Sys.WebForms&&Sys.WebForms.PageRequestManager)this._pageRequestManager=Sys.WebForms.PageRequestManager.getInstance();if(this._pageRequestManager!==null){this._pageRequestManager.add_beginRequest(this._beginRequestHandlerDelegate);this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate)}}};Sys.UI._UpdateProgress.registerClass(\"Sys.UI._UpdateProgress\",Sys.UI.Control);"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MSAjax/MicrosoftAjaxWebServices.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MicrosoftAjaxWebServices.js\n//----------------------------------------------------------\n// Copyright (C) Microsoft Corporation. All rights reserved.\n//----------------------------------------------------------\n// MicrosoftAjaxWebServices.js\nType._registerScript(\"MicrosoftAjaxWebServices.js\",[\"MicrosoftAjaxNetwork.js\"]);Type.registerNamespace(\"Sys.Net\");Sys.Net.WebServiceProxy=function(){};Sys.Net.WebServiceProxy.prototype={get_timeout:function(){return this._timeout||0},set_timeout:function(a){if(a<0)throw Error.argumentOutOfRange(\"value\",a,Sys.Res.invalidTimeout);this._timeout=a},get_defaultUserContext:function(){return typeof this._userContext===\"undefined\"?null:this._userContext},set_defaultUserContext:function(a){this._userContext=a},get_defaultSucceededCallback:function(){return this._succeeded||null},set_defaultSucceededCallback:function(a){this._succeeded=a},get_defaultFailedCallback:function(){return this._failed||null},set_defaultFailedCallback:function(a){this._failed=a},get_enableJsonp:function(){return !!this._jsonp},set_enableJsonp:function(a){this._jsonp=a},get_path:function(){return this._path||null},set_path:function(a){this._path=a},get_jsonpCallbackParameter:function(){return this._callbackParameter||\"callback\"},set_jsonpCallbackParameter:function(a){this._callbackParameter=a},_invoke:function(d,e,g,f,c,b,a){c=c||this.get_defaultSucceededCallback();b=b||this.get_defaultFailedCallback();if(a===null||typeof a===\"undefined\")a=this.get_defaultUserContext();return Sys.Net.WebServiceProxy.invoke(d,e,g,f,c,b,a,this.get_timeout(),this.get_enableJsonp(),this.get_jsonpCallbackParameter())}};Sys.Net.WebServiceProxy.registerClass(\"Sys.Net.WebServiceProxy\");Sys.Net.WebServiceProxy.invoke=function(q,a,m,l,j,b,g,e,w,p){var i=w!==false?Sys.Net.WebServiceProxy._xdomain.exec(q):null,c,n=i&&i.length===3&&(i[1]!==location.protocol||i[2]!==location.host);m=n||m;if(n){p=p||\"callback\";c=\"_jsonp\"+Sys._jsonp++}if(!l)l={};var r=l;if(!m||!r)r={};var s,h,f=null,k,o=null,u=Sys.Net.WebRequest._createUrl(a?q+\"/\"+encodeURIComponent(a):q,r,n?p+\"=Sys.\"+c:null);if(n){s=document.createElement(\"script\");s.src=u;k=new Sys._ScriptLoaderTask(s,function(d,b){if(!b||c)t({Message:String.format(Sys.Res.webServiceFailedNoMsg,a)},-1)});function v(){if(f===null)return;f=null;h=new Sys.Net.WebServiceError(true,String.format(Sys.Res.webServiceTimedOut,a));k.dispose();delete Sys[c];if(b)b(h,g,a)}function t(d,e){if(f!==null){window.clearTimeout(f);f=null}k.dispose();delete Sys[c];c=null;if(typeof e!==\"undefined\"&&e!==200){if(b){h=new Sys.Net.WebServiceError(false,d.Message||String.format(Sys.Res.webServiceFailedNoMsg,a),d.StackTrace||null,d.ExceptionType||null,d);h._statusCode=e;b(h,g,a)}}else if(j)j(d,g,a)}Sys[c]=t;e=e||Sys.Net.WebRequestManager.get_defaultTimeout();if(e>0)f=window.setTimeout(v,e);k.execute();return null}var d=new Sys.Net.WebRequest;d.set_url(u);d.get_headers()[\"Content-Type\"]=\"application/json; charset=utf-8\";if(!m){o=Sys.Serialization.JavaScriptSerializer.serialize(l);if(o===\"{}\")o=\"\"}d.set_body(o);d.add_completed(x);if(e&&e>0)d.set_timeout(e);d.invoke();function x(d){if(d.get_responseAvailable()){var f=d.get_statusCode(),c=null;try{var e=d.getResponseHeader(\"Content-Type\");if(e.startsWith(\"application/json\"))c=d.get_object();else if(e.startsWith(\"text/xml\"))c=d.get_xml();else c=d.get_responseData()}catch(m){}var k=d.getResponseHeader(\"jsonerror\"),h=k===\"true\";if(h){if(c)c=new Sys.Net.WebServiceError(false,c.Message,c.StackTrace,c.ExceptionType,c)}else if(e.startsWith(\"application/json\"))c=!c||typeof c.d===\"undefined\"?c:c.d;if(f<200||f>=300||h){if(b){if(!c||!h)c=new Sys.Net.WebServiceError(false,String.format(Sys.Res.webServiceFailedNoMsg,a));c._statusCode=f;b(c,g,a)}}else if(j)j(c,g,a)}else{var i;if(d.get_timedOut())i=String.format(Sys.Res.webServiceTimedOut,a);else i=String.format(Sys.Res.webServiceFailedNoMsg,a);if(b)b(new Sys.Net.WebServiceError(d.get_timedOut(),i,\"\",\"\"),g,a)}}return d};Sys.Net.WebServiceProxy._generateTypedConstructor=function(a){return function(b){if(b)for(var c in b)this[c]=b[c];this.__type=a}};Sys._jsonp=0;Sys.Net.WebServiceProxy._xdomain=/^\\s*([a-zA-Z0-9\\+\\-\\.]+\\:)\\/\\/([^?#\\/]+)/;Sys.Net.WebServiceError=function(d,e,c,a,b){this._timedOut=d;this._message=e;this._stackTrace=c;this._exceptionType=a;this._errorObject=b;this._statusCode=-1};Sys.Net.WebServiceError.prototype={get_timedOut:function(){return this._timedOut},get_statusCode:function(){return this._statusCode},get_message:function(){return this._message},get_stackTrace:function(){return this._stackTrace||\"\"},get_exceptionType:function(){return this._exceptionType||\"\"},get_errorObject:function(){return this._errorObject||null}};Sys.Net.WebServiceError.registerClass(\"Sys.Net.WebServiceError\");"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/Menu.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/Menu.js\nvar __rootMenuItem;\nvar __menuInterval;\nvar __scrollPanel;\nvar __disappearAfter = 500;\nfunction Menu_ClearInterval() {\n    if (__menuInterval) {\n        window.clearInterval(__menuInterval);\n    }\n}\nfunction Menu_Collapse(item) {\n    Menu_SetRoot(item);\n    if (__rootMenuItem) {\n        Menu_ClearInterval();\n        if (__disappearAfter >= 0) {\n            __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n        }\n    }\n}\nfunction Menu_Expand(item, horizontalOffset, verticalOffset, hideScrollers) {\n    Menu_ClearInterval();\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    var horizontal = true;\n    if (!tr.id) {\n        horizontal = false;\n        tr = tr.parentNode;\n    }\n    var child = Menu_FindSubMenu(item);\n    if (child) {\n        var data = Menu_GetData(item);\n        if (!data) {\n            return null;\n        }\n        child.rel = tr.id;\n        child.x = horizontalOffset;\n        child.y = verticalOffset;\n        if (horizontal) child.pos = \"bottom\";\n        PopOut_Show(child.id, hideScrollers, data);\n    }\n    Menu_SetRoot(item);\n    if (child) {\n        if (!document.body.__oldOnClick && document.body.onclick) {\n            document.body.__oldOnClick = document.body.onclick;\n        }\n        if (__rootMenuItem) {\n            document.body.onclick = Menu_HideItems;\n        }\n    }\n    Menu_ResetSiblings(tr);\n    return child;\n}\nfunction Menu_FindMenu(item) {\n    if (item && item.menu) return item.menu;\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr = tr.parentNode;\n    }\n    for (var i = tr.id.length - 1; i >= 0; i--) {\n        if (tr.id.charAt(i) < '0' || tr.id.charAt(i) > '9') {\n            var menu = WebForm_GetElementById(tr.id.substr(0, i));\n            if (menu) {\n                item.menu = menu;\n                return menu;\n            }\n        }\n    }\n    return null;\n}\nfunction Menu_FindNext(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var first = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        var match = false;\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (Menu_FindParentContainer(link) == parent) {\n                    if (match) {\n                        return link;\n                    }\n                    else if (!first) {\n                        first = link;\n                    }\n                }\n                if (!match && link == a) {\n                    match = true;\n                }\n            }\n        }\n    }\n    return first;\n}\nfunction Menu_FindParentContainer(item) {\n    if (item.menu_ParentContainerCache) return item.menu_ParentContainerCache;\n    var a = (item.tagName.toLowerCase() == \"a\") ? item : WebForm_GetElementByTagName(item, \"A\");\n    var menu = Menu_FindMenu(a);\n    if (menu) {\n        var parent = item;\n        while (parent && parent.tagName &&\n            parent.id != menu.id &&\n            parent.tagName.toLowerCase() != \"div\") {\n            parent = parent.parentNode;\n        }\n        item.menu_ParentContainerCache = parent;\n        return parent;\n    }\n}\nfunction Menu_FindParentItem(item) {\n    var parentContainer = Menu_FindParentContainer(item);\n    var parentContainerID = parentContainer.id;\n    var len = parentContainerID.length;\n    if (parentContainerID && parentContainerID.substr(len - 5) == \"Items\") {\n        var parentItemID = parentContainerID.substr(0, len - 5);\n        return WebForm_GetElementById(parentItemID);\n    }\n    return null;\n}\nfunction Menu_FindPrevious(item) {\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var parent = Menu_FindParentContainer(item);\n    var last = null;\n    if (parent) {\n        var links = WebForm_GetElementsByTagName(parent, \"A\");\n        for (var i = 0; i < links.length; i++) {\n            var link = links[i];\n            if (Menu_IsSelectable(link)) {\n                if (link == a && last) {\n                    return last;\n                }\n                if (Menu_FindParentContainer(link) == parent) {\n                    last = link;\n                }\n            }\n        }\n    }\n    return last;\n}\nfunction Menu_FindSubMenu(item) {\n    var tr = item.parentNode.parentNode.parentNode.parentNode.parentNode;\n    if (!tr.id) {\n        tr=tr.parentNode;\n    }\n    return WebForm_GetElementById(tr.id + \"Items\");\n}\nfunction Menu_Focus(item) {\n    if (item && item.focus) {\n        var pos = WebForm_GetElementPosition(item);\n        var parentContainer = Menu_FindParentContainer(item);\n        if (!parentContainer.offset) {\n            parentContainer.offset = 0;\n        }\n        var posParent = WebForm_GetElementPosition(parentContainer);\n        var delta;\n        if (pos.y + pos.height > posParent.y + parentContainer.offset + parentContainer.clippedHeight) {\n            delta = pos.y + pos.height - posParent.y - parentContainer.offset - parentContainer.clippedHeight;\n            PopOut_Scroll(parentContainer, delta);\n        }\n        else if (pos.y < posParent.y + parentContainer.offset) {\n            delta = posParent.y + parentContainer.offset - pos.y;\n            PopOut_Scroll(parentContainer, -delta);\n        }\n        PopOut_HideScrollers(parentContainer);\n        item.focus();\n    }\n}\nfunction Menu_GetData(item) {\n    if (!item.data) {\n        var a = (item.tagName.toLowerCase() == \"a\" ? item : WebForm_GetElementByTagName(item, \"a\"));\n        var menu = Menu_FindMenu(a);\n        try {\n            item.data = eval(menu.id + \"_Data\");\n        }\n        catch(e) {}\n    }\n    return item.data;\n}\nfunction Menu_HideItems(items) {\n    if (document.body.__oldOnClick) {\n        document.body.onclick = document.body.__oldOnClick;\n        document.body.__oldOnClick = null;\n    }\n    Menu_ClearInterval();\n    if (!items || ((typeof(items.tagName) == \"undefined\") && (items instanceof Event))) {\n        items = __rootMenuItem;\n    }\n    var table = items;\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        table = WebForm_GetElementByTagName(table, \"TABLE\");\n    }\n    if ((typeof(table) == \"undefined\") || (table == null) || !table.tagName || (table.tagName.toLowerCase() != \"table\")) {\n        return;\n    }\n    var rows = table.rows ? table.rows : table.firstChild.rows;\n    var isVertical = false;\n    for (var r = 0; r < rows.length; r++) {\n        if (rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, nextLevel;\n    if (isVertical) {\n        for(i = 0; i < rows.length; i++) {\n            if (rows[i].id) {\n                child = WebForm_GetElementById(rows[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else if (rows[i].cells[0]) {\n                nextLevel = WebForm_GetElementByTagName(rows[i].cells[0], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(nextLevel);\n                }\n            }\n        }\n    }\n    else if (rows[0]) {\n        for(i = 0; i < rows[0].cells.length; i++) {\n            if (rows[0].cells[i].id) {\n                child = WebForm_GetElementById(rows[0].cells[i].id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n            else {\n                nextLevel = WebForm_GetElementByTagName(rows[0].cells[i], \"TABLE\");\n                if (nextLevel) {\n                    Menu_HideItems(rows[0].cells[i].firstChild);\n                }\n            }\n        }\n    }\n    if (items && items.id) {\n        PopOut_Hide(items.id);\n    }\n}\nfunction Menu_HoverDisabled(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    node = WebForm_GetElementByTagName(node, \"table\").rows[0].cells[0].childNodes[0];\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverDynamic(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.hoverClass) {\n        nodeTable.hoverClass = data.hoverClass;\n        WebForm_AppendToClassName(nodeTable, data.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.hoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n    }\n    if (data.disappearAfter >= 200) {\n        __disappearAfter = data.disappearAfter;\n    }\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_HoverRoot(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var data = Menu_GetData(item);\n    if (!data) {\n        return null;\n    }\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (data.staticHoverClass) {\n        nodeTable.hoverClass = data.staticHoverClass;\n        WebForm_AppendToClassName(nodeTable, data.staticHoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (data.staticHoverHyperLinkClass) {\n        node.hoverHyperLinkClass = data.staticHoverHyperLinkClass;\n        WebForm_AppendToClassName(node, data.staticHoverHyperLinkClass);\n    }\n    return node;\n}\nfunction Menu_HoverStatic(item) {\n    var node = Menu_HoverRoot(item);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    __disappearAfter = data.disappearAfter;\n    Menu_Expand(node, data.horizontalOffset, data.verticalOffset); \n}\nfunction Menu_IsHorizontal(item) {\n    if (item) {\n        var a = ((item.tagName && (item.tagName.toLowerCase == \"a\")) ? item : WebForm_GetElementByTagName(item, \"A\"));\n        if (!a) {\n            return false;\n        }\n        var td = a.parentNode.parentNode.parentNode.parentNode.parentNode;\n        if (td.id) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction Menu_IsSelectable(link) {\n    return (link && link.href)\n}\nfunction Menu_Key(item) {\n    var event;\n    if (item.currentTarget) {\n        event = item;\n        item = event.currentTarget;\n    }\n    else {\n        event = window.event;        \n    }\n    var key = (event ? event.keyCode : -1);\n    var data = Menu_GetData(item);\n    if (!data) return;\n    var horizontal = Menu_IsHorizontal(item);\n    var a = WebForm_GetElementByTagName(item, \"A\");\n    var nextItem, parentItem, previousItem;\n    if ((!horizontal && key == 38) || (horizontal && key == 37)) {\n        previousItem = Menu_FindPrevious(item);\n        while (previousItem && previousItem.disabled) {\n            previousItem = Menu_FindPrevious(previousItem);\n        }\n        if (previousItem) {\n            Menu_Focus(previousItem);\n            Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 40) || (horizontal && key == 39)) {\n        if (horizontal) {\n            var subMenu = Menu_FindSubMenu(a);\n            if (subMenu && subMenu.style && subMenu.style.visibility && \n                subMenu.style.visibility.toLowerCase() == \"hidden\") {\n                Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        nextItem = Menu_FindNext(item);\n        while (nextItem && nextItem.disabled) {\n            nextItem = Menu_FindNext(nextItem);\n        }\n        if (nextItem) {\n            Menu_Focus(nextItem);\n            Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if ((!horizontal && key == 39) || (horizontal && key == 40)) {\n        var children = Menu_Expand(a, data.horizontalOffset, data.verticalOffset, true);\n        if (children) {\n            var firstChild;\n            children = WebForm_GetElementsByTagName(children, \"A\");\n            for (var i = 0; i < children.length; i++) {\n                if (!children[i].disabled && Menu_IsSelectable(children[i])) {\n                    firstChild = children[i];\n                    break;\n                }\n            }\n            if (firstChild) {\n                Menu_Focus(firstChild);\n                Menu_Expand(firstChild, data.horizontalOffset, data.verticalOffset, true);\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return;\n            }\n        }\n        else {\n            parentItem = Menu_FindParentItem(item);\n            while (parentItem && !Menu_IsHorizontal(parentItem)) {\n                parentItem = Menu_FindParentItem(parentItem);\n            }\n            if (parentItem) {\n                nextItem = Menu_FindNext(parentItem);\n                while (nextItem && nextItem.disabled) {\n                    nextItem = Menu_FindNext(nextItem);\n                }\n                if (nextItem) {\n                    Menu_Focus(nextItem);\n                    Menu_Expand(nextItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n        }\n    }\n    if ((!horizontal && key == 37) || (horizontal && key == 38)) {\n        parentItem = Menu_FindParentItem(item);\n        if (parentItem) {\n            if (Menu_IsHorizontal(parentItem)) {\n                previousItem = Menu_FindPrevious(parentItem);\n                while (previousItem && previousItem.disabled) {\n                    previousItem = Menu_FindPrevious(previousItem);\n                }\n                if (previousItem) {\n                    Menu_Focus(previousItem);\n                    Menu_Expand(previousItem, data.horizontalOffset, data.verticalOffset, true);\n                    event.cancelBubble = true;\n                    if (event.stopPropagation) event.stopPropagation();\n                    return;\n                }\n            }\n            var parentA = WebForm_GetElementByTagName(parentItem, \"A\");\n            if (parentA) {\n                Menu_Focus(parentA);\n            }\n            Menu_ResetSiblings(parentItem);\n            event.cancelBubble = true;\n            if (event.stopPropagation) event.stopPropagation();\n            return;\n        }\n    }\n    if (key == 27) {\n        Menu_HideItems();\n        event.cancelBubble = true;\n        if (event.stopPropagation) event.stopPropagation();\n        return;\n    }\n}\nfunction Menu_ResetSiblings(item) {\n    var table = (item.tagName.toLowerCase() == \"td\") ?\n        item.parentNode.parentNode.parentNode :\n        item.parentNode.parentNode;\n    var isVertical = false;\n    for (var r = 0; r < table.rows.length; r++) {\n        if (table.rows[r].id) {\n            isVertical = true;\n            break;\n        }\n    }\n    var i, child, childNode;\n    if (isVertical) {\n        for(i = 0; i < table.rows.length; i++) {\n            childNode = table.rows[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    else {\n        for(i = 0; i < table.rows[0].cells.length; i++) {\n            childNode = table.rows[0].cells[i];\n            if (childNode != item) {\n                child = WebForm_GetElementById(childNode.id + \"Items\");\n                if (child) {\n                    Menu_HideItems(child);\n                }\n            }\n        }\n    }\n    Menu_ResetTopMenus(table, table, 0, true);\n}\nfunction Menu_ResetTopMenus(table, doNotReset, level, up) {\n    var i, child, childNode;\n    if (up && table.id == \"\") {\n        var parentTable = table.parentNode.parentNode.parentNode.parentNode;\n        if (parentTable.tagName.toLowerCase() == \"table\") {\n            Menu_ResetTopMenus(parentTable, doNotReset, level + 1, true);\n        }\n    }\n    else {\n        if (level == 0 && table != doNotReset) {\n            if (table.rows[0].id) {\n                for(i = 0; i < table.rows.length; i++) {\n                    childNode = table.rows[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n            else {\n                for(i = 0; i < table.rows[0].cells.length; i++) {\n                    childNode = table.rows[0].cells[i];\n                    child = WebForm_GetElementById(childNode.id + \"Items\");\n                    if (child) {\n                        Menu_HideItems(child);\n                    }\n                }\n            }\n        }\n        else if (level > 0) {\n            for (i = 0; i < table.rows.length; i++) {\n                for (var j = 0; j < table.rows[i].cells.length; j++) {\n                    var subTable = table.rows[i].cells[j].firstChild;\n                    if (subTable && subTable.tagName.toLowerCase() == \"table\") {\n                        Menu_ResetTopMenus(subTable, doNotReset, level - 1, false);\n                    }\n                }\n            }\n        }\n    }\n}\nfunction Menu_RestoreInterval() {\n    if (__menuInterval && __rootMenuItem) {\n        Menu_ClearInterval();\n        __menuInterval = window.setInterval(\"Menu_HideItems()\", __disappearAfter);\n    }\n}\nfunction Menu_SetRoot(item) {\n    var newRoot = Menu_FindMenu(item);\n    if (newRoot) {\n        if (__rootMenuItem && __rootMenuItem != newRoot) {\n            Menu_HideItems();\n        }\n        __rootMenuItem = newRoot;\n    }\n}\nfunction Menu_Unhover(item) {\n    var node = (item.tagName.toLowerCase() == \"td\") ?\n        item:\n        item.cells[0];\n    var nodeTable = WebForm_GetElementByTagName(node, \"table\");\n    if (nodeTable.hoverClass) {\n        WebForm_RemoveClassName(nodeTable, nodeTable.hoverClass);\n    }\n    node = nodeTable.rows[0].cells[0].childNodes[0];\n    if (node.hoverHyperLinkClass) {\n        WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n    }\n    Menu_Collapse(node);\n}\nfunction PopOut_Clip(element, y, height) {\n    if (element && element.style) {\n        element.style.clip = \"rect(\" + y + \"px auto \" + (y + height) + \"px auto)\";\n        element.style.overflow = \"hidden\";\n    }\n}\nfunction PopOut_Down(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && ((panel.offset + panel.clippedHeight) < panel.physicalHeight)) {\n        PopOut_Scroll(panel, 2)\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Down()\", 8);\n    }\n    else {\n        PopOut_ShowScrollers(panel);\n    }\n}\nfunction PopOut_Hide(panelId) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"hidden\";\n        panel.style.display = \"none\";\n        panel.offset = 0;\n        panel.scrollTop = 0;\n        var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n        if (table) {\n            WebForm_SetElementY(table, 0);\n        }\n        if (window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" &&\n            !window.opera) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            if (childFrame) {\n                childFrame.style.display = \"none\";\n            }\n        }\n    }\n}\nfunction PopOut_HideScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        if (up) {\n            up.style.visibility = \"hidden\";\n            up.style.display = \"none\";\n        }\n        if (dn) {\n            dn.style.visibility = \"hidden\";\n            dn.style.display = \"none\";\n        }\n    }\n}\nfunction PopOut_Position(panel, hideScrollers) {\n    if (window.opera) {\n        panel.parentNode.removeChild(panel);\n        document.forms[0].appendChild(panel);\n    }\n    var rel = WebForm_GetElementById(panel.rel);\n    var relTable = WebForm_GetElementByTagName(rel, \"TABLE\");\n    var relCoordinates = WebForm_GetElementPosition(relTable ? relTable : rel);\n    var panelCoordinates = WebForm_GetElementPosition(panel);\n    var panelHeight = ((typeof(panel.physicalHeight) != \"undefined\") && (panel.physicalHeight != null)) ?\n        panel.physicalHeight :\n        panelCoordinates.height;\n    panel.physicalHeight = panelHeight;\n    var panelParentCoordinates;\n    if (panel.offsetParent) {\n        panelParentCoordinates = WebForm_GetElementPosition(panel.offsetParent);\n    }\n    else {\n        panelParentCoordinates = new Object();\n        panelParentCoordinates.x = 0;\n        panelParentCoordinates.y = 0;\n    }\n    var overflowElement = WebForm_GetElementById(\"__overFlowElement\");\n    if (!overflowElement) {\n        overflowElement = document.createElement(\"img\");\n        overflowElement.id=\"__overFlowElement\";\n        WebForm_SetElementWidth(overflowElement, 1);\n        document.body.appendChild(overflowElement);\n    }\n    WebForm_SetElementHeight(overflowElement, panelHeight + relCoordinates.y + parseInt(panel.y ? panel.y : 0));\n    overflowElement.style.visibility = \"visible\";\n    overflowElement.style.display = \"inline\";\n    var clientHeight = 0;\n    var clientWidth = 0;\n    if (window.innerHeight) {\n        clientHeight = window.innerHeight;\n        clientWidth = window.innerWidth;\n    }\n    else if (document.documentElement && document.documentElement.clientHeight) {\n        clientHeight = document.documentElement.clientHeight;\n        clientWidth = document.documentElement.clientWidth;\n    }\n    else if (document.body && document.body.clientHeight) {\n        clientHeight = document.body.clientHeight;\n        clientWidth = document.body.clientWidth;\n    }\n    var scrollTop = 0;\n    var scrollLeft = 0;\n    if (typeof(window.pageYOffset) != \"undefined\") {\n        scrollTop = window.pageYOffset;\n        scrollLeft = window.pageXOffset;\n    }\n    else if (document.documentElement && (typeof(document.documentElement.scrollTop) != \"undefined\")) {\n        scrollTop = document.documentElement.scrollTop;\n        scrollLeft = document.documentElement.scrollLeft;\n    }\n    else if (document.body && (typeof(document.body.scrollTop) != \"undefined\")) {\n        scrollTop = document.body.scrollTop;\n        scrollLeft = document.body.scrollLeft;\n    }\n    overflowElement.style.visibility = \"hidden\";\n    overflowElement.style.display = \"none\";\n    var bottomWindowBorder = clientHeight + scrollTop;\n    var rightWindowBorder = clientWidth + scrollLeft;\n    var position = panel.pos;\n    if ((typeof(position) == \"undefined\") || (position == null) || (position == \"\")) {\n        position = (WebForm_GetElementDir(rel) == \"rtl\" ? \"middleleft\" : \"middleright\");\n    }\n    position = position.toLowerCase();\n    var y = relCoordinates.y + parseInt(panel.y ? panel.y : 0) - panelParentCoordinates.y;\n    var borderParent = (rel && rel.parentNode && rel.parentNode.parentNode && rel.parentNode.parentNode.parentNode\n        && rel.parentNode.parentNode.parentNode.tagName.toLowerCase() == \"div\") ?\n        rel.parentNode.parentNode.parentNode : null;\n    WebForm_SetElementY(panel, y);\n    PopOut_SetPanelHeight(panel, panelHeight, true);\n    var clip = false;\n    var overflow;\n    if (position.indexOf(\"top\") != -1) {\n        y -= panelHeight;\n        WebForm_SetElementY(panel, y); \n        if (y < -panelParentCoordinates.y) {\n            y = -panelParentCoordinates.y;\n            WebForm_SetElementY(panel, y); \n            if (panelHeight > clientHeight - 2) {\n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    else {\n        if (position.indexOf(\"bottom\") != -1) {\n            y += relCoordinates.height;\n            WebForm_SetElementY(panel, y); \n        }\n        overflow = y + panelParentCoordinates.y + panelHeight - bottomWindowBorder;\n        if (overflow > 0) {\n            y -= overflow;\n            WebForm_SetElementY(panel, y); \n            if (y < -panelParentCoordinates.y) {\n                y = 2 - panelParentCoordinates.y + scrollTop;\n                WebForm_SetElementY(panel, y); \n                clip = true;\n                PopOut_SetPanelHeight(panel, clientHeight - 2);\n            }\n        }\n    }\n    if (!clip) {\n        PopOut_SetPanelHeight(panel, panel.clippedHeight, true);\n    }\n    var panelParentOffsetY = 0;\n    if (panel.offsetParent) {\n        panelParentOffsetY = WebForm_GetElementPosition(panel.offsetParent).y;\n    }\n    var panelY = ((typeof(panel.originY) != \"undefined\") && (panel.originY != null)) ?\n        panel.originY :\n        y - panelParentOffsetY;\n    panel.originY = panelY;\n    if (!hideScrollers) {\n        PopOut_ShowScrollers(panel);\n    }\n    else {\n        PopOut_HideScrollers(panel);\n    }\n    var x = relCoordinates.x + parseInt(panel.x ? panel.x : 0) - panelParentCoordinates.x;\n    if (borderParent && borderParent.clientLeft) {\n        x += 2 * borderParent.clientLeft;\n    }\n    WebForm_SetElementX(panel, x);\n    if (position.indexOf(\"left\") != -1) {\n        x -= panelCoordinates.width;\n        WebForm_SetElementX(panel, x);\n        if (x < -panelParentCoordinates.x) {\n            WebForm_SetElementX(panel, -panelParentCoordinates.x);\n        }\n    }\n    else {\n        if (position.indexOf(\"right\") != -1) {\n            x += relCoordinates.width;\n            WebForm_SetElementX(panel, x);\n        }\n        overflow = x + panelParentCoordinates.x + panelCoordinates.width - rightWindowBorder;\n        if (overflow > 0) {\n            if (position.indexOf(\"bottom\") == -1 && relCoordinates.x > panelCoordinates.width) {\n                x -= relCoordinates.width + panelCoordinates.width;\n            }\n            else {\n                x -= overflow;\n            }\n            WebForm_SetElementX(panel, x);\n            if (x < -panelParentCoordinates.x) {\n                WebForm_SetElementX(panel, -panelParentCoordinates.x);\n            }\n        }\n    }\n}\nfunction PopOut_Scroll(panel, offsetDelta) {\n    var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n    if (!table) return;\n    table.style.position = \"relative\";\n    var tableY = (table.style.top ? parseInt(table.style.top) : 0);\n    panel.offset += offsetDelta;\n    WebForm_SetElementY(table, tableY - offsetDelta);\n}\nfunction PopOut_SetPanelHeight(element, height, doNotClip) {\n    if (element && element.style) {\n        var size = WebForm_GetElementPosition(element);\n        element.physicalWidth = size.width;\n        element.clippedHeight = height;\n        WebForm_SetElementHeight(element, height - (element.clientTop ? (2 * element.clientTop) : 0));\n        if (doNotClip && element.style) {\n            element.style.clip = \"rect(auto auto auto auto)\";\n        }\n        else {\n            PopOut_Clip(element, 0, height);\n        }\n    }\n}\nfunction PopOut_Show(panelId, hideScrollers, data) {\n    var panel = WebForm_GetElementById(panelId);\n    if (panel && panel.tagName.toLowerCase() == \"div\") {\n        panel.style.visibility = \"visible\";\n        panel.style.display = \"inline\";\n        if (!panel.offset || hideScrollers) {\n            panel.scrollTop = 0;\n            panel.offset = 0;\n            var table = WebForm_GetElementByTagName(panel, \"TABLE\");\n            if (table) {\n                WebForm_SetElementY(table, 0);\n            }\n        }\n        PopOut_Position(panel, hideScrollers);\n        var z = 1;\n        var isIE = window.navigator && window.navigator.appName == \"Microsoft Internet Explorer\" && !window.opera;\n        if (isIE && data) {\n            var childFrameId = panel.id + \"_MenuIFrame\";\n            var childFrame = WebForm_GetElementById(childFrameId);\n            var parent = panel.offsetParent;\n            if (!childFrame) {\n                childFrame = document.createElement(\"iframe\");\n                childFrame.id = childFrameId;\n                childFrame.src = (data.iframeUrl ? data.iframeUrl : \"about:blank\");\n                childFrame.style.position = \"absolute\";\n                childFrame.style.display = \"none\";\n                childFrame.scrolling = \"no\";\n                childFrame.frameBorder = \"0\";\n                if (parent.tagName.toLowerCase() == \"html\") {\n                    document.body.appendChild(childFrame);\n                }\n                else {\n                    parent.appendChild(childFrame);\n                }\n            }\n            var pos = WebForm_GetElementPosition(panel);\n            var parentPos = WebForm_GetElementPosition(parent);\n            WebForm_SetElementX(childFrame, pos.x - parentPos.x);\n            WebForm_SetElementY(childFrame, pos.y - parentPos.y);\n            WebForm_SetElementWidth(childFrame, pos.width);\n            WebForm_SetElementHeight(childFrame, pos.height);\n            childFrame.style.display = \"block\";\n            if (panel.currentStyle && panel.currentStyle.zIndex && panel.currentStyle.zIndex != \"auto\") {\n                z = panel.currentStyle.zIndex;\n            }\n            else if (panel.style.zIndex) {\n                z = panel.style.zIndex;\n            }\n        }\n        panel.style.zIndex = z;\n    }\n}\nfunction PopOut_ShowScrollers(panel) {\n    if (panel && panel.style) {\n        var up = WebForm_GetElementById(panel.id + \"Up\");\n        var dn = WebForm_GetElementById(panel.id + \"Dn\");\n        var cnt = 0;\n        if (up && dn) {\n            if (panel.offset && panel.offset > 0) {\n                up.style.visibility = \"visible\";\n                up.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(up, panel.clientWidth\n                        - (up.clientLeft ? (2 * up.clientLeft) : 0));\n                }\n                WebForm_SetElementY(up, 0);\n            }\n            else {\n                up.style.visibility = \"hidden\";\n                up.style.display = \"none\";\n            }\n            if (panel.offset + panel.clippedHeight + 2 <= panel.physicalHeight) {\n                dn.style.visibility = \"visible\";\n                dn.style.display = \"inline\";\n                cnt++;\n                if (panel.clientWidth) {\n                    WebForm_SetElementWidth(dn, panel.clientWidth\n                        - (dn.clientLeft ? (2 * dn.clientLeft) : 0));\n                }\n                WebForm_SetElementY(dn, panel.clippedHeight - WebForm_GetElementPosition(dn).height\n                    - (panel.clientTop ? (2 * panel.clientTop) : 0));\n            }\n            else {\n                dn.style.visibility = \"hidden\";\n                dn.style.display = \"none\";\n            }\n            if (cnt == 0) {\n                panel.style.clip = \"rect(auto auto auto auto)\";\n            }\n        }\n    }\n}\nfunction PopOut_Stop() {\n    if (__scrollPanel && __scrollPanel.interval) {\n        window.clearInterval(__scrollPanel.interval);\n    }\n    Menu_RestoreInterval();\n}\nfunction PopOut_Up(scroller) {\n    Menu_ClearInterval();\n    var panel;\n    if (scroller) {\n        panel = scroller.parentNode\n    }\n    else {\n        panel = __scrollPanel;\n    }\n    if (panel && panel.offset && panel.offset > 0) {\n        PopOut_Scroll(panel, -2);\n        __scrollPanel = panel;\n        PopOut_ShowScrollers(panel);\n        PopOut_Stop();\n        __scrollPanel.interval = window.setInterval(\"PopOut_Up()\", 8);\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/MenuStandards.js",
    "content": "﻿//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/MenuStandards.js\nif (!window.Sys) { window.Sys = {}; }\nif (!Sys.WebForms) { Sys.WebForms = {}; }\nSys.WebForms.Menu = function(options) {\n    this.items = [];\n    this.depth = options.depth || 1;\n    this.parentMenuItem = options.parentMenuItem;\n    this.element = Sys.WebForms.Menu._domHelper.getElement(options.element);\n    if (this.element.tagName === 'DIV') {\n        var containerElement = this.element;\n        this.element = Sys.WebForms.Menu._domHelper.firstChild(containerElement);\n        this.element.tabIndex = options.tabIndex || 0;\n        options.element = containerElement;\n        options.menu = this;\n        this.container = new Sys.WebForms._MenuContainer(options);\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    else {\n        this.container = options.container;\n        this.keyMap = options.keyMap;\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    if (this.parentMenuItem && this.parentMenuItem.parentMenu) {\n        this.parentMenu = this.parentMenuItem.parentMenu;\n        this.rootMenu = this.parentMenu.rootMenu;\n        if (!this.element.id) {\n            this.element.id = (this.container.element.id || 'menu') + ':submenu:' + Sys.WebForms.Menu._elementObjectMapper._computedId;\n        }\n        if (this.depth > this.container.staticDisplayLevels) {\n            this.displayMode = \"dynamic\";\n            this.element.style.display = \"none\";\n            this.element.style.position = \"absolute\";\n            if (this.rootMenu && this.container.orientation === 'horizontal' && this.parentMenu.isStatic()) {\n                this.element.style.top = \"100%\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"0px\";\n                }\n                else {\n                    this.element.style.left = \"0px\";\n                }\n            }\n            else {\n                this.element.style.top = \"0px\";\n                if (this.container.rightToLeft) {\n                    this.element.style.right = \"100%\";\n                }\n                else {\n                    this.element.style.left = \"100%\";\n                }\n            }\n            if (this.container.rightToLeft) {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n            }\n            else {\n                this.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n            }\n        }\n        else {\n            this.displayMode = \"static\";\n            this.element.style.display = \"block\";\n            if (this.container.orientation === 'horizontal') {\n                Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n            }\n        }\n    }\n    Sys.WebForms.Menu._domHelper.appendCssClass(this.element, this.displayMode);\n    var children = this.element.childNodes;\n    var count = children.length;\n    for (var i = 0; i < count; i++) {\n        var node = children[i];\n        if (node.nodeType !== 1) {   \n            continue;\n        }\n        var topLevelMenuItem = null;\n        if (this.parentMenuItem) {\n            topLevelMenuItem = this.parentMenuItem.topLevelMenuItem;\n        }\n        var menuItem = new Sys.WebForms.MenuItem(this, node, topLevelMenuItem);\n        var previousMenuItem = this.items[this.items.length - 1];\n        if (previousMenuItem) {\n            menuItem.previousSibling = previousMenuItem;\n            previousMenuItem.nextSibling = menuItem;\n        }\n        this.items[this.items.length] = menuItem;\n    }\n};\nSys.WebForms.Menu.prototype = {\n    blur: function() { if (this.container) this.container.blur(); },\n    collapse: function() {\n        this.each(function(menuItem) {\n            menuItem.hover(false);\n            menuItem.blur();\n            var childMenu = menuItem.childMenu;\n            if (childMenu) {\n                childMenu.collapse();\n            }\n        });\n        this.hide();\n    },\n    doDispose: function() { this.each(function(item) { item.doDispose(); }); },\n    each: function(fn) {\n        var count = this.items.length;\n        for (var i = 0; i < count; i++) {\n            fn(this.items[i]);\n        }\n    },\n    firstChild: function() { return this.items[0]; },\n    focus: function() { if (this.container) this.container.focus(); },\n    get_displayed: function() { return this.element.style.display !== 'none'; },\n    get_focused: function() {\n        if (this.container) {\n            return this.container.focused;\n        }\n        return false;\n    },\n    handleKeyPress: function(keyCode) {\n        if (this.keyMap.contains(keyCode)) {\n            if (this.container.focusedMenuItem) {\n                this.container.focusedMenuItem.navigate(keyCode);\n                return;\n            }\n            var firstChild = this.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n    },\n    hide: function() {\n        if (!this.get_displayed()) {\n            return;\n        }\n        this.each(function(item) {\n            if (item.childMenu) {\n                item.childMenu.hide();\n            }\n        });\n        if (!this.isRoot()) {\n            if (this.get_focused()) {\n                this.container.navigateTo(this.parentMenuItem);\n            }\n            this.element.style.display = 'none';\n        }\n    },\n    isRoot: function() { return this.rootMenu === this; },\n    isStatic: function() { return this.displayMode === 'static'; },\n    lastChild: function() { return this.items[this.items.length - 1]; },\n    show: function() { this.element.style.display = 'block'; }\n};\nif (Sys.WebForms.Menu.registerClass) {\n    Sys.WebForms.Menu.registerClass('Sys.WebForms.Menu');\n}\nSys.WebForms.MenuItem = function(parentMenu, listElement, topLevelMenuItem) {\n    this.keyMap = parentMenu.keyMap;\n    this.parentMenu = parentMenu;\n    this.container = parentMenu.container;\n    this.element = listElement;\n    this.topLevelMenuItem = topLevelMenuItem || this;\n    this._anchor = Sys.WebForms.Menu._domHelper.firstChild(listElement);\n    while (this._anchor && this._anchor.tagName !== 'A') {\n        this._anchor = Sys.WebForms.Menu._domHelper.nextSibling(this._anchor);\n    }\n    if (this._anchor) {\n        this._anchor.tabIndex = -1;\n        var subMenu = this._anchor;\n        while (subMenu && subMenu.tagName !== 'UL') {\n            subMenu = Sys.WebForms.Menu._domHelper.nextSibling(subMenu);\n        }\n        if (subMenu) {\n            this.childMenu = new Sys.WebForms.Menu({ element: subMenu, parentMenuItem: this, depth: parentMenu.depth + 1, container: this.container, keyMap: this.keyMap });\n            if (!this.childMenu.isStatic()) {\n                Sys.WebForms.Menu._domHelper.appendCssClass(this.element, 'has-popup');\n                Sys.WebForms.Menu._domHelper.appendAttributeValue(this.element, 'aria-haspopup', this.childMenu.element.id);\n            }\n        }\n    }\n    Sys.WebForms.Menu._elementObjectMapper.map(listElement, this);\n    Sys.WebForms.Menu._domHelper.appendAttributeValue(listElement, 'role', 'menuitem');\n    Sys.WebForms.Menu._domHelper.appendCssClass(listElement, parentMenu.displayMode);\n    if (this._anchor) {\n        Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, parentMenu.displayMode);\n    }\n    this.element.style.position = \"relative\";\n    if (this.parentMenu.depth == 1 && this.container.orientation == 'horizontal') {\n        Sys.WebForms.Menu._domHelper.setFloat(this.element, this.container.rightToLeft ? \"right\" : \"left\");\n    }\n    if (!this.container.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.addEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n    }\n};\nSys.WebForms.MenuItem.prototype = {\n    applyUp: function(fn, condition) {\n        condition = condition || function(menuItem) { return menuItem; };\n        var menuItem = this;\n        var lastMenuItem = null;\n        while (condition(menuItem)) {\n            fn(menuItem);\n            lastMenuItem = menuItem;\n            menuItem = menuItem.parentMenu.parentMenuItem;\n        }\n        return lastMenuItem;\n    },\n    blur: function() { this.setTabIndex(-1); },\n    doDispose: function() {\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseover', Sys.WebForms.MenuItem._onmouseover);\n        Sys.WebForms.Menu._domHelper.removeEvent(this.element, 'mouseout', Sys.WebForms.MenuItem._onmouseout);\n        if (this.childMenu) {\n            this.childMenu.doDispose();\n        }\n    },\n    focus: function() {\n        if (!this.parentMenu.get_displayed()) {\n            this.parentMenu.show();\n        }\n        this.setTabIndex(0);\n        this.container.focused = true;\n        this._anchor.focus();\n    },\n    get_highlighted: function() { return /(^|\\s)highlighted(\\s|$)/.test(this._anchor.className); },\n    getTabIndex: function() { return this._anchor.tabIndex; },\n    highlight: function(highlighting) {\n        if (highlighting) {\n            this.applyUp(function(menuItem) {\n                menuItem.parentMenu.parentMenuItem.highlight(true);\n            },\n            function(menuItem) {\n                return !menuItem.parentMenu.isStatic() && menuItem.parentMenu.parentMenuItem;\n            }\n        );\n            Sys.WebForms.Menu._domHelper.appendCssClass(this._anchor, 'highlighted');\n        }\n        else {\n            Sys.WebForms.Menu._domHelper.removeCssClass(this._anchor, 'highlighted');\n            this.setTabIndex(-1);\n        }\n    },\n    hover: function(hovering) {\n        if (hovering) {\n            var currentHoveredItem = this.container.hoveredMenuItem;\n            if (currentHoveredItem) {\n                currentHoveredItem.hover(false);\n            }\n            var currentFocusedItem = this.container.focusedMenuItem;\n            if (currentFocusedItem && currentFocusedItem !== this) {\n                currentFocusedItem.hover(false);\n            }\n            this.applyUp(function(menuItem) {\n                if (menuItem.childMenu && !menuItem.childMenu.get_displayed()) {\n                    menuItem.childMenu.show();\n                }\n            });\n            this.container.hoveredMenuItem = this;\n            this.highlight(true);\n        }\n        else {\n            var menuItem = this;\n            while (menuItem) {\n                menuItem.highlight(false);\n                if (menuItem.childMenu) {\n                    if (!menuItem.childMenu.isStatic()) {\n                        menuItem.childMenu.hide();\n                    }\n                }\n                menuItem = menuItem.parentMenu.parentMenuItem;\n            }\n        }\n    },\n    isSiblingOf: function(menuItem) { return menuItem.parentMenu === this.parentMenu; },\n    mouseout: function() {\n        var menuItem = this,\n            id = this.container.pendingMouseoutId,\n            disappearAfter = this.container.disappearAfter;\n        if (id) {\n            window.clearTimeout(id);\n        }\n        if (disappearAfter > -1) {\n            this.container.pendingMouseoutId =\n                window.setTimeout(function() { menuItem.hover(false); }, disappearAfter);\n        }\n    },\n    mouseover: function() {\n        var id = this.container.pendingMouseoutId;\n        if (id) {\n            window.clearTimeout(id);\n            this.container.pendingMouseoutId = null;\n        }\n        this.hover(true);\n        if (this.container.menu.get_focused()) {\n            this.container.navigateTo(this);\n        }\n    },\n    navigate: function(keyCode) {\n        switch (this.keyMap[keyCode]) {\n            case this.keyMap.next:\n                this.navigateNext();\n                break;\n            case this.keyMap.previous:\n                this.navigatePrevious();\n                break;\n            case this.keyMap.child:\n                this.navigateChild();\n                break;\n            case this.keyMap.parent:\n                this.navigateParent();\n                break;\n            case this.keyMap.tab:\n                this.navigateOut();\n                break;\n        }\n    },\n    navigateChild: function() {\n        var subMenu = this.childMenu;\n        if (subMenu) {\n            var firstChild = subMenu.firstChild();\n            if (firstChild) {\n                this.container.navigateTo(firstChild);\n            }\n        }\n        else {\n            if (this.container.orientation === 'horizontal') {\n                var nextItem = this.topLevelMenuItem.nextSibling || this.topLevelMenuItem.parentMenu.firstChild();\n                if (nextItem == this.topLevelMenuItem) {\n                    return;\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(nextItem);\n                if (nextItem.childMenu) {\n                    this.container.navigateTo(nextItem.childMenu.firstChild());\n                }\n            }\n        }\n    },\n    navigateNext: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var nextMenuItem = this.nextSibling;\n        if (!nextMenuItem && this.parentMenu.isRoot()) {\n            nextMenuItem = this.parentMenu.parentMenuItem;\n            if (nextMenuItem) {\n                nextMenuItem = nextMenuItem.nextSibling;\n            }\n        }\n        if (!nextMenuItem) {\n            nextMenuItem = this.parentMenu.firstChild();\n        }\n        if (nextMenuItem) {\n            this.container.navigateTo(nextMenuItem);\n        }\n    },\n    navigateOut: function() {\n        this.parentMenu.blur();\n    },\n    navigateParent: function() {\n        var parentMenu = this.parentMenu,\n            horizontal = this.container.orientation === 'horizontal';\n        if (!parentMenu) return;\n        if (horizontal && this.childMenu && parentMenu.isRoot()) {\n            this.navigateChild();\n            return;\n        }\n        if (parentMenu.parentMenuItem && !parentMenu.isRoot()) {\n            if (horizontal && this.parentMenu.depth === 2) {\n                var previousItem = this.parentMenu.parentMenuItem.previousSibling;\n                if (!previousItem) {\n                    previousItem = this.parentMenu.rootMenu.lastChild();\n                }\n                this.topLevelMenuItem.childMenu.hide();\n                this.container.navigateTo(previousItem);\n                if (previousItem.childMenu) {\n                    this.container.navigateTo(previousItem.childMenu.firstChild());\n                }\n            }\n            else {\n                this.parentMenu.hide();\n            }\n        }\n    },\n    navigatePrevious: function() {\n        if (this.childMenu) {\n            this.childMenu.hide();\n        }\n        var previousMenuItem = this.previousSibling;\n        if (previousMenuItem) {\n            var childMenu = previousMenuItem.childMenu;\n            if (childMenu && childMenu.isRoot()) {\n                previousMenuItem = childMenu.lastChild();\n            }\n        }\n        if (!previousMenuItem && this.parentMenu.isRoot()) {\n            previousMenuItem = this.parentMenu.parentMenuItem;\n        }\n        if (!previousMenuItem) {\n            previousMenuItem = this.parentMenu.lastChild();\n        }\n        if (previousMenuItem) {\n            this.container.navigateTo(previousMenuItem);\n        }\n    },\n    setTabIndex: function(index) { if (this._anchor) this._anchor.tabIndex = index; }\n};\nSys.WebForms.MenuItem._onmouseout = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseout();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.MenuItem._onmouseover = function(e) {\n    var menuItem = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n    if (!menuItem) {\n        return;\n    }\n    menuItem.mouseover();\n    Sys.WebForms.Menu._domHelper.cancelEvent(e);\n};\nSys.WebForms.Menu._domHelper = {\n    addEvent: function(element, eventName, fn, useCapture) {\n        if (element.addEventListener) {\n            element.addEventListener(eventName, fn, !!useCapture);\n        }\n        else {\n            element['on' + eventName] = fn;\n        }\n    },\n    appendAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('append', element, name, value);\n    },\n    appendCssClass: function(element, value) {\n        this.updateClassName('append', element, name, value);\n    },\n    appendString: function(getString, setString, value) {\n        var currentValue = getString();\n        if (!currentValue) {\n            setString(value);\n            return;\n        }\n        var regex = this._regexes.getRegex('(^| )' + value + '($| )');\n        if (regex.test(currentValue)) {\n            return;\n        }\n        setString(currentValue + ' ' + value);\n    },\n    cancelEvent: function(e) {\n        var event = e || window.event;\n        if (event) {\n            event.cancelBubble = true;\n            if (event.stopPropagation) {\n                event.stopPropagation();\n            }\n        }\n    },\n    contains: function(ancestor, descendant) {\n        for (; descendant && (descendant !== ancestor); descendant = descendant.parentNode) { }\n        return !!descendant;\n    },\n    firstChild: function(element) {\n        var child = element.firstChild;\n        if (child && child.nodeType !== 1) {   \n            child = this.nextSibling(child);\n        }\n        return child;\n    },\n    getElement: function(elementOrId) { return typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId; },\n    getElementDirection: function(element) {\n        if (element) {\n            if (element.dir) {\n                return element.dir;\n            }\n            return this.getElementDirection(element.parentNode);\n        }\n        return \"ltr\";\n    },\n    getKeyCode: function(event) { return event.keyCode || event.charCode || 0; },\n    insertAfter: function(element, elementToInsert) {\n        var next = element.nextSibling;\n        if (next) {\n            element.parentNode.insertBefore(elementToInsert, next);\n        }\n        else if (element.parentNode) {\n            element.parentNode.appendChild(elementToInsert);\n        }\n    },\n    nextSibling: function(element) {\n        var sibling = element.nextSibling;\n        while (sibling) {\n            if (sibling.nodeType === 1) {   \n                return sibling;\n            }\n            sibling = sibling.nextSibling;\n        }\n    },\n    removeAttributeValue: function(element, name, value) {\n        this.updateAttributeValue('remove', element, name, value);\n    },\n    removeCssClass: function(element, value) {\n        this.updateClassName('remove', element, name, value);\n    },\n    removeEvent: function(element, eventName, fn, useCapture) {\n        if (element.removeEventListener) {\n            element.removeEventListener(eventName, fn, !!useCapture);\n        }\n        else if (element.detachEvent) {\n            element.detachEvent('on' + eventName, fn)\n        }\n        element['on' + eventName] = null;\n    },\n    removeString: function(getString, setString, valueToRemove) {\n        var currentValue = getString();\n        if (currentValue) {\n            var regex = this._regexes.getRegex('(\\\\s|\\\\b)' + valueToRemove + '$|\\\\b' + valueToRemove + '\\\\s+');\n            setString(currentValue.replace(regex, ''));\n        }\n    },\n    setFloat: function(element, direction) {\n        element.style.styleFloat = direction;\n        element.style.cssFloat = direction;\n    },\n    updateAttributeValue: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.getAttribute(name);\n                },\n                function(newValue) {\n                    element.setAttribute(name, newValue);\n                },\n                value\n            );\n    },\n    updateClassName: function(operation, element, name, value) {\n        this[operation + 'String'](\n                function() {\n                    return element.className;\n                },\n                function(newValue) {\n                    element.className = newValue;\n                },\n                value\n            );\n    },\n    _regexes: {\n        getRegex: function(pattern) {\n            var regex = this[pattern];\n            if (!regex) {\n                this[pattern] = regex = new RegExp(pattern);\n            }\n            return regex;\n        }\n    }\n};\nSys.WebForms.Menu._elementObjectMapper = {\n    _computedId: 0,\n    _mappings: {},\n    _mappingIdName: 'Sys.WebForms.Menu.Mapping',\n    getMappedObject: function(element) {\n        var id = element[this._mappingIdName];\n        if (id) {\n            return this._mappings[this._mappingIdName + ':' + id];\n        }\n    },\n    map: function(element, theObject) {\n        var mappedObject = element[this._mappingIdName];\n        if (mappedObject === theObject) {\n            return;\n        }\n        var objectId = element[this._mappingIdName] || element.id || '%' + (++this._computedId); \n        element[this._mappingIdName] = objectId;\n        this._mappings[this._mappingIdName + ':' + objectId] = theObject;\n        theObject.mappingId = objectId;\n    }\n};\nSys.WebForms.Menu._keyboardMapping = new (function() {\n    var LEFT_ARROW = 37;\n    var UP_ARROW = 38;\n    var RIGHT_ARROW = 39;\n    var DOWN_ARROW = 40;\n    var TAB = 9;\n    var ESCAPE = 27;\n    this.vertical = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.vertical[DOWN_ARROW] = this.vertical.next;\n    this.vertical[UP_ARROW] = this.vertical.previous;\n    this.vertical[RIGHT_ARROW] = this.vertical.child;\n    this.vertical[LEFT_ARROW] = this.vertical.parent;\n    this.vertical[TAB] = this.vertical[ESCAPE] = this.vertical.tab;\n    this.verticalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.verticalRtl[DOWN_ARROW] = this.verticalRtl.next;\n    this.verticalRtl[UP_ARROW] = this.verticalRtl.previous;\n    this.verticalRtl[LEFT_ARROW] = this.verticalRtl.child;\n    this.verticalRtl[RIGHT_ARROW] = this.verticalRtl.parent;\n    this.verticalRtl[TAB] = this.verticalRtl[ESCAPE] = this.verticalRtl.tab;\n    this.horizontal = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontal[RIGHT_ARROW] = this.horizontal.next;\n    this.horizontal[LEFT_ARROW] = this.horizontal.previous;\n    this.horizontal[DOWN_ARROW] = this.horizontal.child;\n    this.horizontal[UP_ARROW] = this.horizontal.parent;\n    this.horizontal[TAB] = this.horizontal[ESCAPE] = this.horizontal.tab;\n    this.horizontalRtl = { next: 0, previous: 1, child: 2, parent: 3, tab: 4 };\n    this.horizontalRtl[RIGHT_ARROW] = this.horizontalRtl.previous;\n    this.horizontalRtl[LEFT_ARROW] = this.horizontalRtl.next;\n    this.horizontalRtl[DOWN_ARROW] = this.horizontalRtl.child;\n    this.horizontalRtl[UP_ARROW] = this.horizontalRtl.parent;\n    this.horizontalRtl[TAB] = this.horizontalRtl[ESCAPE] = this.horizontalRtl.tab;\n    this.horizontal.contains = this.horizontalRtl.contains = this.vertical.contains = this.verticalRtl.contains = function(keycode) {\n        return this[keycode] != null;\n    };\n})();\nSys.WebForms._MenuContainer = function(options) {\n    this.focused = false;\n    this.disabled = options.disabled;\n    this.staticDisplayLevels = options.staticDisplayLevels || 1;\n    this.element = options.element;\n    this.orientation = options.orientation || 'vertical';\n    this.disappearAfter = options.disappearAfter;\n    this.rightToLeft = Sys.WebForms.Menu._domHelper.getElementDirection(this.element) === 'rtl';\n    Sys.WebForms.Menu._elementObjectMapper.map(this.element, this);\n    this.menu = options.menu;\n    this.menu.rootMenu = this.menu;\n    this.menu.displayMode = 'static';\n    this.menu.element.style.position = 'relative';\n    this.menu.element.style.width = 'auto';\n    if (this.orientation === 'vertical') {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menu');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.verticalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.vertical;\n        }\n    }\n    else {\n        Sys.WebForms.Menu._domHelper.appendAttributeValue(this.menu.element, 'role', 'menubar');\n        if (this.rightToLeft) {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontalRtl;\n        }\n        else {\n            this.menu.keyMap = Sys.WebForms.Menu._keyboardMapping.horizontal;\n        }\n    }\n    var floatBreak = document.createElement('div');\n    floatBreak.style.clear = this.rightToLeft ? \"right\" : \"left\";\n    this.element.appendChild(floatBreak);\n    Sys.WebForms.Menu._domHelper.setFloat(this.element, this.rightToLeft ? \"right\" : \"left\");\n    Sys.WebForms.Menu._domHelper.insertAfter(this.element, floatBreak);\n    if (!this.disabled) {\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'focus', this._onfocus, true);\n        Sys.WebForms.Menu._domHelper.addEvent(this.menu.element, 'keydown', this._onkeydown);\n        var menuContainer = this;\n        this.element.dispose = function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose = null;\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'focus', menuContainer._onfocus, true);\n                Sys.WebForms.Menu._domHelper.removeEvent(menuContainer.menu.element, 'keydown', menuContainer._onkeydown);\n                menuContainer.menu.doDispose();\n            }\n        };\n        Sys.WebForms.Menu._domHelper.addEvent(window, 'unload', function() {\n            if (menuContainer.element.dispose) {\n                menuContainer.element.dispose();\n            }\n        });\n    }\n};\nSys.WebForms._MenuContainer.prototype = {\n    blur: function() {\n        this.focused = false;\n        this.isBlurring = false;\n        this.menu.collapse();\n        this.focusedMenuItem = null;\n    },\n    focus: function(e) { this.focused = true; },\n    navigateTo: function(menuItem) {\n        if (this.focusedMenuItem && this.focusedMenuItem !== this) {\n            this.focusedMenuItem.highlight(false);\n        }\n        menuItem.highlight(true);\n        menuItem.focus();\n        this.focusedMenuItem = menuItem;\n    },\n    _onfocus: function(e) {\n        var event = e || window.event;\n        if (event.srcElement && this) {\n            if (Sys.WebForms.Menu._domHelper.contains(this.element, event.srcElement)) {\n                if (!this.focused) {\n                    this.focus();\n                }\n            }\n        }\n    },\n    _onkeydown: function(e) {\n        var thisMenu = Sys.WebForms.Menu._elementObjectMapper.getMappedObject(this);\n        var keyCode = Sys.WebForms.Menu._domHelper.getKeyCode(e || window.event);\n        if (thisMenu) {\n            thisMenu.handleKeyPress(keyCode);\n        }\n    }\n};\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/SmartNav.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/SmartNav.js\nvar snSrc;\nif ((typeof(window.__smartNav) == \"undefined\") || (window.__smartNav == null))\n{\n    window.__smartNav = new Object();\n    window.__smartNav.update = function()\n    {\n        var sn = window.__smartNav;\n        var fd;\n        document.detachEvent(\"onstop\", sn.stopHif);\n        sn.inPost = false;\n        try { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        var fdr = fd.getElementsByTagName(\"asp_smartnav_rdir\");\n        if (fdr.length > 0)\n        {\n            if ((typeof(sn.sHif) == \"undefined\") || (sn.sHif == null))\n            {\n                sn.sHif = document.createElement(\"IFRAME\");\n                sn.sHif.name = \"__hifSmartNav\";\n                sn.sHif.style.display = \"none\";\n                sn.sHif.src = snSrc;\n            }\n            try {window.location = fdr[0].url;} catch (e) {};\n            return;\n        }\n        var fdurl = fd.location.href;\n        var index = fdurl.indexOf(snSrc);\n        if ((index != -1 && index == fdurl.length-snSrc.length)\n            || fdurl == \"about:blank\")\n            return;\n\t\tvar fdurlb = fdurl.split(\"?\")[0];\n\t\tif (document.location.href.indexOf(fdurlb) < 0)\n\t\t{\n            document.location.href=fdurl;\n\t\t    return;\n\t\t}\n\t\tsn._savedOnLoad = window.onload;\n\t\twindow.onload = null;\n\t\twindow.__smartNav.updateHelper();\n\t}\n\twindow.__smartNav.updateHelper = function()\n\t{\n\t\tif (document.readyState != \"complete\")\n\t\t{\n\t\t    window.setTimeout(window.__smartNav.updateHelper, 25);\n\t\t    return;\n\t\t}\n\t\twindow.__smartNav.loadNewContent();\n\t}\n\twindow.__smartNav.loadNewContent = function()\n\t{\n\t\tvar sn = window.__smartNav;\n\t\tvar fd;\n\t\ttry { fd = frames[\"__hifSmartNav\"].document; } catch (e) {return;}\n        if ((typeof(sn.sHif) != \"undefined\") && (sn.sHif != null))\n        {\n            sn.sHif.removeNode(true);\n            sn.sHif = null;\n        }\n        var hdm = document.getElementsByTagName(\"head\")[0];\n        var hk = hdm.childNodes;\n        var tt = null;\n        var i;\n        for (i = hk.length - 1; i>= 0; i--)\n        {\n            if (hk[i].tagName == \"TITLE\")\n            {\n                tt = hk[i].outerHTML;\n                continue;\n            }\n            if (hk[i].tagName != \"BASEFONT\" || hk[i].innerHTML.length == 0)\n                hdm.removeChild(hdm.childNodes[i]);\n        }\n        var kids = fd.getElementsByTagName(\"head\")[0].childNodes;\n        for (i = 0; i < kids.length; i++)\n        {\n            var tn = kids[i].tagName;\n            var k = document.createElement(tn);\n            k.id = kids[i].id;\n            k.mergeAttributes(kids[i]);\n            switch(tn)\n            {\n            case \"TITLE\":\n                if (tt == kids[i].outerHTML)\n                    continue;\n                k.innerText = kids[i].text;\n                hdm.insertAdjacentElement(\"afterbegin\", k);\n                continue;\n            case \"BASEFONT\" :\n                if (kids[i].innerHTML.length > 0)\n                    continue;\n                break;\n            default:\n                var o = document.createElement(\"BODY\");\n                o.innerHTML = \"<BODY>\" + kids[i].outerHTML + \"</BODY>\";\n                k = o.firstChild;\n                break;\n            }\n            if((typeof(k) != \"undefined\") && (k != null))\n                hdm.appendChild(k);\n        }\n        document.body.clearAttributes();\n        document.body.id = fd.body.id;\n        document.body.mergeAttributes(fd.body);\n        var newBodyLoad = fd.body.onload;\n        if ((typeof(newBodyLoad) != \"undefined\") && (newBodyLoad != null))\n            document.body.onload = newBodyLoad;\n        else\n            document.body.onload = sn._savedOnLoad;\n        var s = \"<BODY>\" + fd.body.innerHTML + \"</BODY>\";\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hifP = sn.hif.parentElement;\n            if ((typeof(hifP) != \"undefined\") && (hifP != null))\n                sn.sHif=hifP.removeChild(sn.hif);\n        }\n        document.body.innerHTML = s;\n        var sc = document.scripts;\n        for (i = 0; i < sc.length; i++)\n        {\n            sc[i].text = sc[i].text;\n        }\n        sn.hif = document.all(\"__hifSmartNav\");\n        if ((typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            var hif = sn.hif;\n            sn.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n            frames[\"__hifSmartNav\"].name = sn.hifName;\n            sn.hifDoc = hif.contentWindow.document;\n            if (sn.ie5)\n                hif.parentElement.removeChild(hif);\n            window.setTimeout(sn.restoreFocus,0);\n        }\n        if (typeof(window.onload) == \"string\")\n        {\n            try { eval(window.onload) } catch (e) {};\n        }\n        else if ((typeof(window.onload) != \"undefined\") && (window.onload != null))\n        {\n            try { window.onload() } catch (e) {};\n        }\n        sn._savedOnLoad = null;\n        sn.attachForm();\n    };\n    window.__smartNav.restoreFocus = function()\n    {\n        if (window.__smartNav.inPost == true) return;\n        var curAe = document.activeElement;\n        var sAeId = window.__smartNav.ae;\n        if (((typeof(sAeId) == \"undefined\") || (sAeId == null)) ||\n            (typeof(curAe) != \"undefined\") && (curAe != null) && (curAe.id == sAeId || curAe.name == sAeId))\n            return;\n        var ae = document.all(sAeId);\n        if ((typeof(ae) == \"undefined\") || (ae == null)) return;\n        try { ae.focus(); } catch(e){};\n    }\n    window.__smartNav.saveHistory = function()\n    {\n        if ((typeof(window.__smartNav.hif) != \"undefined\") && (window.__smartNav.hif != null))\n            window.__smartNav.hif.removeNode();\n        if ((typeof(window.__smartNav.sHif) != \"undefined\") && (window.__smartNav.sHif != null)\n            && (typeof(document.all[window.__smartNav.siHif]) != \"undefined\")\n            && (document.all[window.__smartNav.siHif] != null)) {\n            document.all[window.__smartNav.siHif].insertAdjacentElement(\n                        \"BeforeBegin\", window.__smartNav.sHif);\n        }\n    }\n    window.__smartNav.stopHif = function()\n    {\n        document.detachEvent(\"onstop\", window.__smartNav.stopHif);\n        var sn = window.__smartNav;\n        if (((typeof(sn.hifDoc) == \"undefined\") || (sn.hifDoc == null)) &&\n            (typeof(sn.hif) != \"undefined\") && (sn.hif != null))\n        {\n            try {sn.hifDoc = sn.hif.contentWindow.document;}\n            catch(e){sn.hifDoc=null}\n        }\n        if (sn.hifDoc != null)\n        {\n            try {sn.hifDoc.execCommand(\"stop\");} catch (e){}\n        }\n    }\n    window.__smartNav.init =  function()\n    {\n        var sn = window.__smartNav;\n        window.__smartNav.form.__smartNavPostBack.value = 'true';\n        document.detachEvent(\"onstop\", sn.stopHif);\n        document.attachEvent(\"onstop\", sn.stopHif);\n        try { if (window.event.returnValue == false) return; } catch(e) {}\n        sn.inPost = true;\n        if ((typeof(document.activeElement) != \"undefined\") && (document.activeElement != null))\n        {\n            var ae = document.activeElement.id;\n            if (ae.length == 0)\n                ae = document.activeElement.name;\n            sn.ae = ae;\n        }\n        else\n            sn.ae = null;\n        try {document.selection.empty();} catch (e) {}\n        if ((typeof(sn.hif) == \"undefined\") || (sn.hif == null))\n        {\n            sn.hif = document.all(\"__hifSmartNav\");\n            sn.hifDoc = sn.hif.contentWindow.document;\n        }\n        if ((typeof(sn.hifDoc) != \"undefined\") && (sn.hifDoc != null))\n            try {sn.hifDoc.designMode = \"On\";} catch(e){};\n        if ((typeof(sn.hif.parentElement) == \"undefined\") || (sn.hif.parentElement == null))\n            document.body.appendChild(sn.hif);\n        var hif = sn.hif;\n        hif.detachEvent(\"onload\", sn.update);\n        hif.attachEvent(\"onload\", sn.update);\n        window.__smartNav.fInit = true;\n    };\n    window.__smartNav.submit = function()\n    {\n        window.__smartNav.fInit = false;\n        try { window.__smartNav.init(); } catch(e) {}\n        if (window.__smartNav.fInit) {\n            window.__smartNav.form._submit();\n        }\n    };\n    window.__smartNav.attachForm = function()\n    {\n        var cf = document.forms;\n        for (var i=0; i<cf.length; i++)\n        {\n            if ((typeof(cf[i].__smartNavEnabled) != \"undefined\") && (cf[i].__smartNavEnabled != null))\n            {\n                window.__smartNav.form = cf[i];\n                window.__smartNav.form.insertAdjacentHTML(\"beforeEnd\", \"<input type='hidden' name='__smartNavPostBack' value='false' />\");\n                break;\n            }\n        }\n        var snfm = window.__smartNav.form;\n        if ((typeof(snfm) == \"undefined\") || (snfm == null)) return false;\n        var sft = snfm.target;\n        if (sft.length != 0 && sft.indexOf(\"__hifSmartNav\") != 0) return false;\n        var sfc = snfm.action.split(\"?\")[0];\n        var url = window.location.href.split(\"?\")[0];\n        if (url.charAt(url.length-1) != '/' && url.lastIndexOf(sfc) + sfc.length != url.length) return false;\n        if (snfm.__formAttached == true) return true;\n        snfm.__formAttached = true;\n        snfm.attachEvent(\"onsubmit\", window.__smartNav.init);\n        snfm._submit = snfm.submit;\n        snfm.submit = window.__smartNav.submit;\n        snfm.target = window.__smartNav.hifName;\n        return true;\n    };\n    window.__smartNav.hifName = \"__hifSmartNav\" + (new Date()).getTime();\n    window.__smartNav.ie5 = navigator.appVersion.indexOf(\"MSIE 5\") > 0;\n    var rc = window.__smartNav.attachForm();\n    var hif = document.all(\"__hifSmartNav\");\n    if ((typeof(snSrc) == \"undefined\") || (snSrc == null)) {\n\t    if (typeof(window.dialogHeight) != \"undefined\") {\n\t            snSrc = \"IEsmartnav1\";\n\t\t    hif.src = snSrc;\n\t    } else {\n\t\t    snSrc = hif.src;\n\t    }\n    }\n    if (rc)\n    {\n        var fsn = frames[\"__hifSmartNav\"];\n        fsn.name = window.__smartNav.hifName;\n        window.__smartNav.siHif = hif.sourceIndex;\n        try {\n            if (fsn.document.location != snSrc)\n            {\n                fsn.document.designMode = \"On\";\n                hif.attachEvent(\"onload\",window.__smartNav.update);\n                window.__smartNav.hif = hif;\n            }\n        }\n        catch (e) { window.__smartNav.hif = hif; }\n        window.attachEvent(\"onbeforeunload\", window.__smartNav.saveHistory);\n    }\n    else\n        window.__smartNav = null;\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/TreeView.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/TreeView.js\nfunction TreeView_HoverNode(data, node) {\n    if (!data) {\n        return;\n    }\n    node.hoverClass = data.hoverClass;\n    WebForm_AppendToClassName(node, data.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    node.hoverHyperLinkClass = data.hoverHyperLinkClass;\n    WebForm_AppendToClassName(node, data.hoverHyperLinkClass);\n}\nfunction TreeView_GetNodeText(node) {\n    var trNode = WebForm_GetParentByTagName(node, \"TR\");\n    var outerNodes;\n    if (trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName) {\n        outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"A\");\n        if (!outerNodes || outerNodes.length == 0) {\n            outerNodes = trNode.childNodes[trNode.childNodes.length - 1].getElementsByTagName(\"SPAN\");\n        }\n    }\n    var textNode = (outerNodes && outerNodes.length > 0) ?\n        outerNodes[0].childNodes[0] :\n        trNode.childNodes[trNode.childNodes.length - 1].childNodes[0];\n    return (textNode && textNode.nodeValue) ? textNode.nodeValue : \"\";\n}\nfunction TreeView_PopulateNode(data, index, node, selectNode, selectImageNode, lineType, text, path, databound, datapath, parentIsLast) {\n    if (!data) {\n        return;\n    }\n    var context = new Object();\n    context.data = data;\n    context.node = node;\n    context.selectNode = selectNode;\n    context.selectImageNode = selectImageNode;\n    context.lineType = lineType;\n    context.index = index;\n    context.isChecked = \"f\";\n    var tr = WebForm_GetParentByTagName(node, \"TR\");\n    if (tr) {\n        var checkbox = tr.getElementsByTagName(\"INPUT\");\n        if (checkbox && (checkbox.length > 0)) {\n            for (var i = 0; i < checkbox.length; i++) {\n                if (checkbox[i].type.toLowerCase() == \"checkbox\") {\n                    if (checkbox[i].checked) {\n                        context.isChecked = \"t\";\n                    }\n                    break;\n                }\n            }\n        }\n    }\n    var param = index + \"|\" + data.lastIndex + \"|\" + databound + context.isChecked + parentIsLast + \"|\" +\n        text.length + \"|\" + text + datapath.length + \"|\" + datapath + path;\n    TreeView_PopulateNodeDoCallBack(context, param);\n}\nfunction TreeView_ProcessNodeData(result, context) {\n    var treeNode = context.node;\n    if (result.length > 0) {\n        var ci =  result.indexOf(\"|\", 0);\n        context.data.lastIndex = result.substring(0, ci);\n        ci = result.indexOf(\"|\", ci + 1);\n        var newExpandState = result.substring(context.data.lastIndex.length + 1, ci);\n        context.data.expandState.value += newExpandState;\n        var chunk = result.substr(ci + 1);\n        var newChildren, table;\n        if (__nonMSDOMBrowser) {\n            var newDiv = document.createElement(\"div\");\n            newDiv.innerHTML = chunk;\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            newChildren = null;\n            if ((typeof(table.nextSibling) == \"undefined\") || (table.nextSibling == null)) {\n                table.parentNode.insertBefore(newDiv.firstChild, table.nextSibling);\n                newChildren = table.previousSibling;\n            }\n            else {\n                table = table.nextSibling;\n                table.parentNode.insertBefore(newDiv.firstChild, table);\n                newChildren = table.previousSibling;\n            }\n            newChildren = document.getElementById(treeNode.id + \"Nodes\");\n        }\n        else {\n            table = WebForm_GetParentByTagName(treeNode, \"TABLE\");\n            table.insertAdjacentHTML(\"afterEnd\", chunk);\n            newChildren = document.all[treeNode.id + \"Nodes\"];\n        }\n        if ((typeof(newChildren) != \"undefined\") && (newChildren != null)) {\n            TreeView_ToggleNode(context.data, context.index, treeNode, context.lineType, newChildren);\n            treeNode.href = document.getElementById ?\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",document.getElementById('\" + treeNode.id + \"'),'\" + context.lineType + \"',document.getElementById('\" + newChildren.id + \"'))\" :\n                \"javascript:TreeView_ToggleNode(\" + context.data.name + \",\" + context.index + \",\" + treeNode.id + \",'\" + context.lineType + \"',\" + newChildren.id + \")\";\n            if ((typeof(context.selectNode) != \"undefined\") && (context.selectNode != null) && context.selectNode.href &&\n                (context.selectNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectNode.href = treeNode.href;\n            }\n            if ((typeof(context.selectImageNode) != \"undefined\") && (context.selectImageNode != null) && context.selectNode.href &&\n                (context.selectImageNode.href.indexOf(\"javascript:TreeView_PopulateNode\", 0) == 0)) {\n                context.selectImageNode.href = treeNode.href;\n            }\n        }\n        context.data.populateLog.value += context.index + \",\";\n    }\n    else {\n        var img = treeNode.childNodes ? treeNode.childNodes[0] : treeNode.children[0];\n        if ((typeof(img) != \"undefined\") && (img != null)) {\n            var lineType = context.lineType;\n            if (lineType == \"l\") {\n                img.src = context.data.images[13];\n            }\n            else if (lineType == \"t\") {\n                img.src = context.data.images[10];\n            }\n            else if (lineType == \"-\") {\n                img.src = context.data.images[16];\n            }\n            else {\n                img.src = context.data.images[3];\n            }\n            var pe;\n            if (__nonMSDOMBrowser) {\n                pe = treeNode.parentNode;\n                pe.insertBefore(img, treeNode);\n                pe.removeChild(treeNode);\n            }\n            else {\n                pe = treeNode.parentElement;\n                treeNode.style.visibility=\"hidden\";\n                treeNode.style.display=\"none\";\n                pe.insertAdjacentElement(\"afterBegin\", img);\n            }\n        }\n    }\n}\nfunction TreeView_SelectNode(data, node, nodeId) {\n    if (!data) {\n        return;\n    }\n    if ((typeof(data.selectedClass) != \"undefined\") && (data.selectedClass != null)) {\n        var id = data.selectedNodeID.value;\n        if (id.length > 0) {\n            var selectedNode = document.getElementById(id);\n            if ((typeof(selectedNode) != \"undefined\") && (selectedNode != null)) {\n                WebForm_RemoveClassName(selectedNode, data.selectedHyperLinkClass);\n                selectedNode = WebForm_GetParentByTagName(selectedNode, \"TD\");\n                WebForm_RemoveClassName(selectedNode, data.selectedClass);\n            }\n        }\n        WebForm_AppendToClassName(node, data.selectedHyperLinkClass);\n        node = WebForm_GetParentByTagName(node, \"TD\");\n        WebForm_AppendToClassName(node, data.selectedClass)\n    }\n    data.selectedNodeID.value = nodeId;\n}\nfunction TreeView_ToggleNode(data, index, node, lineType, children) {\n    if (!data) {\n        return;\n    }\n    var img = node.childNodes[0];\n    var newExpandState;\n    try {\n        if (children.style.display == \"none\") {\n            children.style.display = \"block\";\n            newExpandState = \"e\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[15];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[12];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[18];\n                }\n                else {\n                    img.src = data.images[5];\n                }\n                img.alt = data.collapseToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n        else {\n            children.style.display = \"none\";\n            newExpandState = \"c\";\n            if ((typeof(img) != \"undefined\") && (img != null)) {\n                if (lineType == \"l\") {\n                    img.src = data.images[14];\n                }\n                else if (lineType == \"t\") {\n                    img.src = data.images[11];\n                }\n                else if (lineType == \"-\") {\n                    img.src = data.images[17];\n                }\n                else {\n                    img.src = data.images[4];\n                }\n                img.alt = data.expandToolTip.replace(/\\{0\\}/, TreeView_GetNodeText(node));\n            }\n        }\n    }\n    catch(e) {}\n    data.expandState.value =  data.expandState.value.substring(0, index) + newExpandState + data.expandState.value.slice(index + 1);\n}\nfunction TreeView_UnhoverNode(node) {\n    if (!node.hoverClass) {\n        return;\n    }\n    WebForm_RemoveClassName(node, node.hoverClass);\n    if (__nonMSDOMBrowser) {\n        node = node.childNodes[node.childNodes.length - 1];\n    }\n    else {\n        node = node.children[node.children.length - 1];\n    }\n    WebForm_RemoveClassName(node, node.hoverHyperLinkClass);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebForms.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebForms.js\nfunction WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {\n    this.eventTarget = eventTarget;\n    this.eventArgument = eventArgument;\n    this.validation = validation;\n    this.validationGroup = validationGroup;\n    this.actionUrl = actionUrl;\n    this.trackFocus = trackFocus;\n    this.clientSubmit = clientSubmit;\n}\nfunction WebForm_DoPostBackWithOptions(options) {\n    var validationResult = true;\n    if (options.validation) {\n        if (typeof(Page_ClientValidate) == 'function') {\n            validationResult = Page_ClientValidate(options.validationGroup);\n        }\n    }\n    if (validationResult) {\n        if ((typeof(options.actionUrl) != \"undefined\") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {\n            theForm.action = options.actionUrl;\n        }\n        if (options.trackFocus) {\n            var lastFocus = theForm.elements[\"__LASTFOCUS\"];\n            if ((typeof(lastFocus) != \"undefined\") && (lastFocus != null)) {\n                if (typeof(document.activeElement) == \"undefined\") {\n                    lastFocus.value = options.eventTarget;\n                }\n                else {\n                    var active = document.activeElement;\n                    if ((typeof(active) != \"undefined\") && (active != null)) {\n                        if ((typeof(active.id) != \"undefined\") && (active.id != null) && (active.id.length > 0)) {\n                            lastFocus.value = active.id;\n                        }\n                        else if (typeof(active.name) != \"undefined\") {\n                            lastFocus.value = active.name;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    if (options.clientSubmit) {\n        __doPostBack(options.eventTarget, options.eventArgument);\n    }\n}\nvar __pendingCallbacks = new Array();\nvar __synchronousCallBackIndex = -1;\nfunction WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) {\n    var postData = __theFormPostData +\n                \"__CALLBACKID=\" + WebForm_EncodeCallback(eventTarget) +\n                \"&__CALLBACKPARAM=\" + WebForm_EncodeCallback(eventArgument);\n    if (theForm[\"__EVENTVALIDATION\"]) {\n        postData += \"&__EVENTVALIDATION=\" + WebForm_EncodeCallback(theForm[\"__EVENTVALIDATION\"].value);\n    }\n    var xmlRequest,e;\n    try {\n        xmlRequest = new XMLHttpRequest();\n    }\n    catch(e) {\n        try {\n            xmlRequest = new ActiveXObject(\"Microsoft.XMLHTTP\");\n        }\n        catch(e) {\n        }\n    }\n    var setRequestHeaderMethodExists = true;\n    try {\n        setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader);\n    }\n    catch(e) {}\n    var callback = new Object();\n    callback.eventCallback = eventCallback;\n    callback.context = context;\n    callback.errorCallback = errorCallback;\n    callback.async = useAsync;\n    var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback);\n    if (!useAsync) {\n        if (__synchronousCallBackIndex != -1) {\n            __pendingCallbacks[__synchronousCallBackIndex] = null;\n        }\n        __synchronousCallBackIndex = callbackIndex;\n    }\n    if (setRequestHeaderMethodExists) {\n        xmlRequest.onreadystatechange = WebForm_CallbackComplete;\n        callback.xmlRequest = xmlRequest;\n        // e.g. http:\n        var action = theForm.action || document.location.pathname, fragmentIndex = action.indexOf('#');\n        if (fragmentIndex !== -1) {\n            action = action.substr(0, fragmentIndex);\n        }\n        if (!__nonMSDOMBrowser) {\n            var queryIndex = action.indexOf('?');\n            if (queryIndex !== -1) {\n                var path = action.substr(0, queryIndex);\n                if (path.indexOf(\"%\") === -1) {\n                    action = encodeURI(path) + action.substr(queryIndex);\n                }\n            }\n            else if (action.indexOf(\"%\") === -1) {\n                action = encodeURI(action);\n            }\n        }\n        xmlRequest.open(\"POST\", action, true);\n        xmlRequest.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded; charset=utf-8\");\n        xmlRequest.send(postData);\n        return;\n    }\n    callback.xmlRequest = new Object();\n    var callbackFrameID = \"__CALLBACKFRAME\" + callbackIndex;\n    var xmlRequestFrame = document.frames[callbackFrameID];\n    if (!xmlRequestFrame) {\n        xmlRequestFrame = document.createElement(\"IFRAME\");\n        xmlRequestFrame.width = \"1\";\n        xmlRequestFrame.height = \"1\";\n        xmlRequestFrame.frameBorder = \"0\";\n        xmlRequestFrame.id = callbackFrameID;\n        xmlRequestFrame.name = callbackFrameID;\n        xmlRequestFrame.style.position = \"absolute\";\n        xmlRequestFrame.style.top = \"-100px\"\n        xmlRequestFrame.style.left = \"-100px\";\n        try {\n            if (callBackFrameUrl) {\n                xmlRequestFrame.src = callBackFrameUrl;\n            }\n        }\n        catch(e) {}\n        document.body.appendChild(xmlRequestFrame);\n    }\n    var interval = window.setInterval(function() {\n        xmlRequestFrame = document.frames[callbackFrameID];\n        if (xmlRequestFrame && xmlRequestFrame.document) {\n            window.clearInterval(interval);\n            xmlRequestFrame.document.write(\"\");\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.write('<html><body><form method=\"post\"><input type=\"hidden\" name=\"__CALLBACKLOADSCRIPT\" value=\"t\"></form></body></html>');\n            xmlRequestFrame.document.close();\n            xmlRequestFrame.document.forms[0].action = theForm.action;\n            var count = __theFormPostCollection.length;\n            var element;\n            for (var i = 0; i < count; i++) {\n                element = __theFormPostCollection[i];\n                if (element) {\n                    var fieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                    fieldElement.type = \"hidden\";\n                    fieldElement.name = element.name;\n                    fieldElement.value = element.value;\n                    xmlRequestFrame.document.forms[0].appendChild(fieldElement);\n                }\n            }\n            var callbackIdFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIdFieldElement.type = \"hidden\";\n            callbackIdFieldElement.name = \"__CALLBACKID\";\n            callbackIdFieldElement.value = eventTarget;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIdFieldElement);\n            var callbackParamFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackParamFieldElement.type = \"hidden\";\n            callbackParamFieldElement.name = \"__CALLBACKPARAM\";\n            callbackParamFieldElement.value = eventArgument;\n            xmlRequestFrame.document.forms[0].appendChild(callbackParamFieldElement);\n            if (theForm[\"__EVENTVALIDATION\"]) {\n                var callbackValidationFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n                callbackValidationFieldElement.type = \"hidden\";\n                callbackValidationFieldElement.name = \"__EVENTVALIDATION\";\n                callbackValidationFieldElement.value = theForm[\"__EVENTVALIDATION\"].value;\n                xmlRequestFrame.document.forms[0].appendChild(callbackValidationFieldElement);\n            }\n            var callbackIndexFieldElement = xmlRequestFrame.document.createElement(\"INPUT\");\n            callbackIndexFieldElement.type = \"hidden\";\n            callbackIndexFieldElement.name = \"__CALLBACKINDEX\";\n            callbackIndexFieldElement.value = callbackIndex;\n            xmlRequestFrame.document.forms[0].appendChild(callbackIndexFieldElement);\n            xmlRequestFrame.document.forms[0].submit();\n        }\n    }, 10);\n}\nfunction WebForm_CallbackComplete() {\n    for (var i = 0; i < __pendingCallbacks.length; i++) {\n        callbackObject = __pendingCallbacks[i];\n        if (callbackObject && callbackObject.xmlRequest && (callbackObject.xmlRequest.readyState == 4)) {\n            if (!__pendingCallbacks[i].async) {\n                __synchronousCallBackIndex = -1;\n            }\n            __pendingCallbacks[i] = null;\n            var callbackFrameID = \"__CALLBACKFRAME\" + i;\n            var xmlRequestFrame = document.getElementById(callbackFrameID);\n            if (xmlRequestFrame) {\n                xmlRequestFrame.parentNode.removeChild(xmlRequestFrame);\n            }\n            WebForm_ExecuteCallback(callbackObject);\n        }\n    }\n}\nfunction WebForm_ExecuteCallback(callbackObject) {\n    var response = callbackObject.xmlRequest.responseText;\n    if (response.charAt(0) == \"s\") {\n        if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n            callbackObject.eventCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else if (response.charAt(0) == \"e\") {\n        if ((typeof(callbackObject.errorCallback) != \"undefined\") && (callbackObject.errorCallback != null)) {\n            callbackObject.errorCallback(response.substring(1), callbackObject.context);\n        }\n    }\n    else {\n        var separatorIndex = response.indexOf(\"|\");\n        if (separatorIndex != -1) {\n            var validationFieldLength = parseInt(response.substring(0, separatorIndex));\n            if (!isNaN(validationFieldLength)) {\n                var validationField = response.substring(separatorIndex + 1, separatorIndex + validationFieldLength + 1);\n                if (validationField != \"\") {\n                    var validationFieldElement = theForm[\"__EVENTVALIDATION\"];\n                    if (!validationFieldElement) {\n                        validationFieldElement = document.createElement(\"INPUT\");\n                        validationFieldElement.type = \"hidden\";\n                        validationFieldElement.name = \"__EVENTVALIDATION\";\n                        theForm.appendChild(validationFieldElement);\n                    }\n                    validationFieldElement.value = validationField;\n                }\n                if ((typeof(callbackObject.eventCallback) != \"undefined\") && (callbackObject.eventCallback != null)) {\n                    callbackObject.eventCallback(response.substring(separatorIndex + validationFieldLength + 1), callbackObject.context);\n                }\n            }\n        }\n    }\n}\nfunction WebForm_FillFirstAvailableSlot(array, element) {\n    var i;\n    for (i = 0; i < array.length; i++) {\n        if (!array[i]) break;\n    }\n    array[i] = element;\n    return i;\n}\nvar __nonMSDOMBrowser = (window.navigator.appName.toLowerCase().indexOf('explorer') == -1);\nvar __theFormPostData = \"\";\nvar __theFormPostCollection = new Array();\nvar __callbackTextTypes = /^(text|password|hidden|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction WebForm_InitCallback() {\n    var formElements = theForm.elements,\n        count = formElements.length,\n        element;\n    for (var i = 0; i < count; i++) {\n        element = formElements[i];\n        var tagName = element.tagName.toLowerCase();\n        if (tagName == \"input\") {\n            var type = element.type;\n            if ((__callbackTextTypes.test(type) || ((type == \"checkbox\" || type == \"radio\") && element.checked))\n                && (element.id != \"__EVENTVALIDATION\")) {\n                WebForm_InitCallbackAddField(element.name, element.value);\n            }\n        }\n        else if (tagName == \"select\") {\n            var selectCount = element.options.length;\n            for (var j = 0; j < selectCount; j++) {\n                var selectChild = element.options[j];\n                if (selectChild.selected == true) {\n                    WebForm_InitCallbackAddField(element.name, element.value);\n                }\n            }\n        }\n        else if (tagName == \"textarea\") {\n            WebForm_InitCallbackAddField(element.name, element.value);\n        }\n    }\n}\nfunction WebForm_InitCallbackAddField(name, value) {\n    var nameValue = new Object();\n    nameValue.name = name;\n    nameValue.value = value;\n    __theFormPostCollection[__theFormPostCollection.length] = nameValue;\n    __theFormPostData += WebForm_EncodeCallback(name) + \"=\" + WebForm_EncodeCallback(value) + \"&\";\n}\nfunction WebForm_EncodeCallback(parameter) {\n    if (encodeURIComponent) {\n        return encodeURIComponent(parameter);\n    }\n    else {\n        return escape(parameter);\n    }\n}\nvar __disabledControlArray = new Array();\nfunction WebForm_ReEnableControls() {\n    if (typeof(__enabledControlArray) == 'undefined') {\n        return false;\n    }\n    var disabledIndex = 0;\n    for (var i = 0; i < __enabledControlArray.length; i++) {\n        var c;\n        if (__nonMSDOMBrowser) {\n            c = document.getElementById(__enabledControlArray[i]);\n        }\n        else {\n            c = document.all[__enabledControlArray[i]];\n        }\n        if ((typeof(c) != \"undefined\") && (c != null) && (c.disabled == true)) {\n            c.disabled = false;\n            __disabledControlArray[disabledIndex++] = c;\n        }\n    }\n    setTimeout(\"WebForm_ReDisableControls()\", 0);\n    return true;\n}\nfunction WebForm_ReDisableControls() {\n    for (var i = 0; i < __disabledControlArray.length; i++) {\n        __disabledControlArray[i].disabled = true;\n    }\n}\nfunction WebForm_SimulateClick(element, event) {\n    var clickEvent;\n    if (element) {\n        if (element.click) {\n            element.click();\n        } else { \n            clickEvent = document.createEvent(\"MouseEvents\");\n            clickEvent.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n            if (!element.dispatchEvent(clickEvent)) {\n                return true;\n            }\n        }\n        event.cancelBubble = true;\n        if (event.stopPropagation) {\n            event.stopPropagation();\n        }\n        return false;\n    }\n    return true;\n}\nfunction WebForm_FireDefaultButton(event, target) {\n    if (event.keyCode == 13) {\n        var src = event.srcElement || event.target;\n        if (src &&\n            ((src.tagName.toLowerCase() == \"input\") &&\n             (src.type.toLowerCase() == \"submit\" || src.type.toLowerCase() == \"button\")) ||\n            ((src.tagName.toLowerCase() == \"a\") &&\n             (src.href != null) && (src.href != \"\")) ||\n            (src.tagName.toLowerCase() == \"textarea\")) {\n            return true;\n        }\n        var defaultButton;\n        if (__nonMSDOMBrowser) {\n            defaultButton = document.getElementById(target);\n        }\n        else {\n            defaultButton = document.all[target];\n        }\n        if (defaultButton) {\n            return WebForm_SimulateClick(defaultButton, event);\n        } \n    }\n    return true;\n}\nfunction WebForm_GetScrollX() {\n    if (__nonMSDOMBrowser) {\n        return window.pageXOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollLeft) {\n            return document.documentElement.scrollLeft;\n        }\n        else if (document.body) {\n            return document.body.scrollLeft;\n        }\n    }\n    return 0;\n}\nfunction WebForm_GetScrollY() {\n    if (__nonMSDOMBrowser) {\n        return window.pageYOffset;\n    }\n    else {\n        if (document.documentElement && document.documentElement.scrollTop) {\n            return document.documentElement.scrollTop;\n        }\n        else if (document.body) {\n            return document.body.scrollTop;\n        }\n    }\n    return 0;\n}\nfunction WebForm_SaveScrollPositionSubmit() {\n    if (__nonMSDOMBrowser) {\n        theForm.elements['__SCROLLPOSITIONY'].value = window.pageYOffset;\n        theForm.elements['__SCROLLPOSITIONX'].value = window.pageXOffset;\n    }\n    else {\n        theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n        theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    }\n    if ((typeof(this.oldSubmit) != \"undefined\") && (this.oldSubmit != null)) {\n        return this.oldSubmit();\n    }\n    return true;\n}\nfunction WebForm_SaveScrollPositionOnSubmit() {\n    theForm.__SCROLLPOSITIONX.value = WebForm_GetScrollX();\n    theForm.__SCROLLPOSITIONY.value = WebForm_GetScrollY();\n    if ((typeof(this.oldOnSubmit) != \"undefined\") && (this.oldOnSubmit != null)) {\n        return this.oldOnSubmit();\n    }\n    return true;\n}\nfunction WebForm_RestoreScrollPosition() {\n    if (__nonMSDOMBrowser) {\n        window.scrollTo(theForm.elements['__SCROLLPOSITIONX'].value, theForm.elements['__SCROLLPOSITIONY'].value);\n    }\n    else {\n        window.scrollTo(theForm.__SCROLLPOSITIONX.value, theForm.__SCROLLPOSITIONY.value);\n    }\n    if ((typeof(theForm.oldOnLoad) != \"undefined\") && (theForm.oldOnLoad != null)) {\n        return theForm.oldOnLoad();\n    }\n    return true;\n}\nfunction WebForm_TextBoxKeyHandler(event) {\n    if (event.keyCode == 13) {\n        var target;\n        if (__nonMSDOMBrowser) {\n            target = event.target;\n        }\n        else {\n            target = event.srcElement;\n        }\n        if ((typeof(target) != \"undefined\") && (target != null)) {\n            if (typeof(target.onchange) != \"undefined\") {\n                target.onchange();\n                event.cancelBubble = true;\n                if (event.stopPropagation) event.stopPropagation();\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction WebForm_TrimString(value) {\n    return value.replace(/^\\s+|\\s+$/g, '')\n}\nfunction WebForm_AppendToClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index === -1) {\n        element.className = (element.className === '') ? className : element.className + ' ' + className;\n    }\n}\nfunction WebForm_RemoveClassName(element, className) {\n    var currentClassName = ' ' + WebForm_TrimString(element.className) + ' ';\n    className = WebForm_TrimString(className);\n    var index = currentClassName.indexOf(' ' + className + ' ');\n    if (index >= 0) {\n        element.className = WebForm_TrimString(currentClassName.substring(0, index) + ' ' +\n            currentClassName.substring(index + className.length + 1, currentClassName.length));\n    }\n}\nfunction WebForm_GetElementById(elementId) {\n    if (document.getElementById) {\n        return document.getElementById(elementId);\n    }\n    else if (document.all) {\n        return document.all[elementId];\n    }\n    else return null;\n}\nfunction WebForm_GetElementByTagName(element, tagName) {\n    var elements = WebForm_GetElementsByTagName(element, tagName);\n    if (elements && elements.length > 0) {\n        return elements[0];\n    }\n    else return null;\n}\nfunction WebForm_GetElementsByTagName(element, tagName) {\n    if (element && tagName) {\n        if (element.getElementsByTagName) {\n            return element.getElementsByTagName(tagName);\n        }\n        if (element.all && element.all.tags) {\n            return element.all.tags(tagName);\n        }\n    }\n    return null;\n}\nfunction WebForm_GetElementDir(element) {\n    if (element) {\n        if (element.dir) {\n            return element.dir;\n        }\n        return WebForm_GetElementDir(element.parentNode);\n    }\n    return \"ltr\";\n}\nfunction WebForm_GetElementPosition(element) {\n    var result = new Object();\n    result.x = 0;\n    result.y = 0;\n    result.width = 0;\n    result.height = 0;\n    if (element.offsetParent) {\n        result.x = element.offsetLeft;\n        result.y = element.offsetTop;\n        var parent = element.offsetParent;\n        while (parent) {\n            result.x += parent.offsetLeft;\n            result.y += parent.offsetTop;\n            var parentTagName = parent.tagName.toLowerCase();\n            if (parentTagName != \"table\" &&\n                parentTagName != \"body\" && \n                parentTagName != \"html\" && \n                parentTagName != \"div\" && \n                parent.clientTop && \n                parent.clientLeft) {\n                result.x += parent.clientLeft;\n                result.y += parent.clientTop;\n            }\n            parent = parent.offsetParent;\n        }\n    }\n    else if (element.left && element.top) {\n        result.x = element.left;\n        result.y = element.top;\n    }\n    else {\n        if (element.x) {\n            result.x = element.x;\n        }\n        if (element.y) {\n            result.y = element.y;\n        }\n    }\n    if (element.offsetWidth && element.offsetHeight) {\n        result.width = element.offsetWidth;\n        result.height = element.offsetHeight;\n    }\n    else if (element.style && element.style.pixelWidth && element.style.pixelHeight) {\n        result.width = element.style.pixelWidth;\n        result.height = element.style.pixelHeight;\n    }\n    return result;\n}\nfunction WebForm_GetParentByTagName(element, tagName) {\n    var parent = element.parentNode;\n    var upperTagName = tagName.toUpperCase();\n    while (parent && (parent.tagName.toUpperCase() != upperTagName)) {\n        parent = parent.parentNode ? parent.parentNode : parent.parentElement;\n    }\n    return parent;\n}\nfunction WebForm_SetElementHeight(element, height) {\n    if (element && element.style) {\n        element.style.height = height + \"px\";\n    }\n}\nfunction WebForm_SetElementWidth(element, width) {\n    if (element && element.style) {\n        element.style.width = width + \"px\";\n    }\n}\nfunction WebForm_SetElementX(element, x) {\n    if (element && element.style) {\n        element.style.left = x + \"px\";\n    }\n}\nfunction WebForm_SetElementY(element, y) {\n    if (element && element.style) {\n        element.style.top = y + \"px\";\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebParts.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebParts.js\nvar __wpm = null;\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\nfunction __wpTranslateOffset(x, y, offsetElement, relativeToElement, includeScroll) {\n    while ((typeof(offsetElement) != \"undefined\") && (offsetElement != null) && (offsetElement != relativeToElement)) {\n        x += offsetElement.offsetLeft;\n        y += offsetElement.offsetTop;\n        var tagName = offsetElement.tagName;\n        if ((tagName != \"TABLE\") && (tagName != \"BODY\")) {\n            x += offsetElement.clientLeft;\n            y += offsetElement.clientTop;\n        }\n        if (includeScroll && (tagName != \"BODY\")) {\n            x -= offsetElement.scrollLeft;\n            y -= offsetElement.scrollTop;\n        }\n        offsetElement = offsetElement.offsetParent;\n    }\n    return new Point(x, y);\n}\nfunction __wpGetPageEventLocation(event, includeScroll) {\n    if ((typeof(event) == \"undefined\") || (event == null)) {\n        event = window.event;\n    }\n    return __wpTranslateOffset(event.offsetX, event.offsetY, event.srcElement, null, includeScroll);\n}\nfunction __wpClearSelection() {\n    document.selection.empty();\n}\nfunction WebPart(webPartElement, webPartTitleElement, zone, zoneIndex, allowZoneChange) {\n    this.webPartElement = webPartElement;\n    this.allowZoneChange = allowZoneChange;\n    this.zone = zone;\n    this.zoneIndex = zoneIndex;\n    this.title = ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) ?\n        webPartTitleElement.innerText : \"\";\n    webPartElement.__webPart = this;\n    if ((typeof(webPartTitleElement) != \"undefined\") && (webPartTitleElement != null)) {\n        webPartTitleElement.style.cursor = \"move\";\n        webPartTitleElement.attachEvent(\"onmousedown\", WebPart_OnMouseDown);\n        webPartElement.attachEvent(\"ondragstart\", WebPart_OnDragStart);\n        webPartElement.attachEvent(\"ondrag\", WebPart_OnDrag);\n        webPartElement.attachEvent(\"ondragend\", WebPart_OnDragEnd);\n    }\n    this.UpdatePosition = WebPart_UpdatePosition;\n    this.Dispose = WebPart_Dispose;\n}\nfunction WebPart_Dispose() {\n    this.webPartElement.__webPart = null    \n}\nfunction WebPart_OnMouseDown() {\n    var currentEvent = window.event;\n    var draggedWebPart = WebPart_GetParentWebPartElement(currentEvent.srcElement);\n    if ((typeof(draggedWebPart) == \"undefined\") || (draggedWebPart == null)) {\n        return;\n    }\n    document.selection.empty();\n    try {\n        __wpm.draggedWebPart = draggedWebPart;\n        __wpm.DragDrop();\n    }\n    catch (e) {\n        __wpm.draggedWebPart = draggedWebPart;\n        window.setTimeout(\"__wpm.DragDrop()\", 0);\n    }\n    currentEvent.returnValue = false;\n    currentEvent.cancelBubble = true;\n}\nfunction WebPart_OnDragStart() {\n    var currentEvent = window.event;\n    var webPartElement = currentEvent.srcElement;\n    if ((typeof(webPartElement.__webPart) == \"undefined\") || (webPartElement.__webPart == null)) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n        return;\n    }\n    var dataObject = currentEvent.dataTransfer;\n    dataObject.effectAllowed = __wpm.InitiateWebPartDragDrop(webPartElement);\n}\nfunction WebPart_OnDrag() {\n    __wpm.ContinueWebPartDragDrop();\n}\nfunction WebPart_OnDragEnd() {\n    __wpm.CompleteWebPartDragDrop();\n}\nfunction WebPart_GetParentWebPartElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__webPart) == \"undefined\") || (elem.__webPart == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction WebPart_UpdatePosition() {\n    var location = __wpTranslateOffset(0, 0, this.webPartElement, null, false);\n    this.middleX = location.x + this.webPartElement.offsetWidth / 2;\n    this.middleY = location.y + this.webPartElement.offsetHeight / 2;\n}\nfunction Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var webPartTable = null;\n    if (zoneElement.rows.length == 1) {\n        webPartTableContainer = zoneElement.rows[0].cells[0];\n    }\n    else {\n        webPartTableContainer = zoneElement.rows[1].cells[0];\n    }\n    var i;\n    for (i = 0; i < webPartTableContainer.childNodes.length; i++) {\n        var node = webPartTableContainer.childNodes[i];\n        if (node.tagName == \"TABLE\") {\n            webPartTable = node;\n            break;\n        }\n    }\n    this.zoneElement = zoneElement;\n    this.zoneIndex = zoneIndex;\n    this.webParts = new Array();\n    this.uniqueID = uniqueID;\n    this.isVertical = isVertical;\n    this.allowLayoutChange = allowLayoutChange;\n    this.allowDrop = false;\n    this.webPartTable = webPartTable;\n    this.highlightColor = highlightColor;\n    this.savedBorderColor = (webPartTable != null) ? webPartTable.style.borderColor : null;\n    this.dropCueElements = new Array();\n    if (webPartTable != null) {\n        if (isVertical) {\n            for (i = 0; i < webPartTable.rows.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[i].cells[0].childNodes[0];\n            }\n        }\n        else {\n            for (i = 0; i < webPartTable.rows[0].cells.length; i += 2) {\n                this.dropCueElements[i / 2] = webPartTable.rows[0].cells[i].childNodes[0];\n            }\n        }\n    }\n    this.AddWebPart = Zone_AddWebPart;\n    this.GetWebPartIndex = Zone_GetWebPartIndex;\n    this.ToggleDropCues = Zone_ToggleDropCues;\n    this.UpdatePosition = Zone_UpdatePosition;\n    this.Dispose = Zone_Dispose;\n    webPartTable.__zone = this;\n    webPartTable.attachEvent(\"ondragenter\", Zone_OnDragEnter);\n    webPartTable.attachEvent(\"ondrop\", Zone_OnDrop);\n}\nfunction Zone_Dispose() {\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].Dispose();\n    }\n    this.webPartTable.__zone = null;\n}\nfunction Zone_OnDragEnter() {\n    var handled = __wpm.ProcessWebPartDragEnter();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDragOver() {\n    var handled = __wpm.ProcessWebPartDragOver();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_OnDrop() {\n    var handled = __wpm.ProcessWebPartDrop();\n    var currentEvent = window.event;\n    if (handled) {\n        currentEvent.returnValue = false;\n        currentEvent.cancelBubble = true;\n    }\n}\nfunction Zone_GetParentZoneElement(containedElement) {\n    var elem = containedElement;\n    while ((typeof(elem.__zone) == \"undefined\") || (elem.__zone == null)) {\n        elem = elem.parentElement;\n        if ((typeof(elem) == \"undefined\") || (elem == null)) {\n            break;\n        }\n    }\n    return elem;\n}\nfunction Zone_AddWebPart(webPartElement, webPartTitleElement, allowZoneChange) {\n    var webPart = null;\n    var zoneIndex = this.webParts.length;\n    if (this.allowLayoutChange && __wpm.IsDragDropEnabled()) {\n        webPart = new WebPart(webPartElement, webPartTitleElement, this, zoneIndex, allowZoneChange);\n    }\n    else {\n        webPart = new WebPart(webPartElement, null, this, zoneIndex, allowZoneChange);\n    }\n    this.webParts[zoneIndex] = webPart;\n    return webPart;\n}\nfunction Zone_ToggleDropCues(show, index, ignoreOutline) {\n    if (ignoreOutline == false) {\n        this.webPartTable.style.borderColor = (show ? this.highlightColor : this.savedBorderColor);\n    }\n    if (index == -1) {\n        return;\n    }\n    var dropCue = this.dropCueElements[index];\n    if (dropCue && dropCue.style) {\n        if (dropCue.style.height == \"100%\" && !dropCue.webPartZoneHorizontalCueResized) {\n            var oldParentHeight = dropCue.parentElement.clientHeight;\n            var realHeight = oldParentHeight - 10;\n            dropCue.style.height = realHeight + \"px\";\n            var dropCueVerticalBar = dropCue.getElementsByTagName(\"DIV\")[0];\n            if (dropCueVerticalBar && dropCueVerticalBar.style) {\n                dropCueVerticalBar.style.height = dropCue.style.height;\n                var heightDiff = (dropCue.parentElement.clientHeight - oldParentHeight);\n                if (heightDiff) {\n                    dropCue.style.height = (realHeight - heightDiff) + \"px\";\n                    dropCueVerticalBar.style.height = dropCue.style.height;\n                }\n            }\n            dropCue.webPartZoneHorizontalCueResized = true;\n        }\n        dropCue.style.visibility = (show ? \"visible\" : \"hidden\");\n    }\n}\nfunction Zone_GetWebPartIndex(location) {\n    var x = location.x;\n    var y = location.y;\n    if ((x < this.webPartTableLeft) || (x > this.webPartTableRight) ||\n        (y < this.webPartTableTop) || (y > this.webPartTableBottom)) {\n        return -1;\n    }\n    var vertical = this.isVertical;\n    var webParts = this.webParts;\n    var webPartsCount = webParts.length;\n    for (var i = 0; i < webPartsCount; i++) {\n        var webPart = webParts[i];\n        if (vertical) {\n            if (y < webPart.middleY) {\n                return i;\n            }\n        }\n        else {\n            if (x < webPart.middleX) {\n                return i;\n            }\n        }\n    }\n    return webPartsCount;\n}\nfunction Zone_UpdatePosition() {\n    var topLeft = __wpTranslateOffset(0, 0, this.webPartTable, null, false);\n    this.webPartTableLeft = topLeft.x;\n    this.webPartTableTop = topLeft.y;\n    this.webPartTableRight = (this.webPartTable != null) ? topLeft.x + this.webPartTable.offsetWidth : topLeft.x;\n    this.webPartTableBottom = (this.webPartTable != null) ? topLeft.y + this.webPartTable.offsetHeight : topLeft.y;\n    for (var i = 0; i < this.webParts.length; i++) {\n        this.webParts[i].UpdatePosition();\n    }\n}\nfunction WebPartDragState(webPartElement, effect) {\n    this.webPartElement = webPartElement;\n    this.dropZoneElement = null;\n    this.dropIndex = -1;\n    this.effect = effect;\n    this.dropped = false;\n}\nfunction WebPartMenu(menuLabelElement, menuDropDownElement, menuElement) {\n    this.menuLabelElement = menuLabelElement;\n    this.menuDropDownElement = menuDropDownElement;\n    this.menuElement = menuElement;\n    this.menuLabelElement.__menu = this;\n    this.menuLabelElement.attachEvent('onclick', WebPartMenu_OnClick);\n    this.menuLabelElement.attachEvent('onkeypress', WebPartMenu_OnKeyPress);\n    this.menuLabelElement.attachEvent('onmouseenter', WebPartMenu_OnMouseEnter);\n    this.menuLabelElement.attachEvent('onmouseleave', WebPartMenu_OnMouseLeave);\n    if ((typeof(this.menuDropDownElement) != \"undefined\") && (this.menuDropDownElement != null)) {\n        this.menuDropDownElement.__menu = this;\n    }\n    this.menuItemStyle = \"\";\n    this.menuItemHoverStyle = \"\";\n    this.popup = null;\n    this.hoverClassName = \"\";\n    this.hoverColor = \"\";\n    this.oldColor = this.menuLabelElement.style.color;\n    this.oldTextDecoration = this.menuLabelElement.style.textDecoration;\n    this.oldClassName = this.menuLabelElement.className;\n    this.Show = WebPartMenu_Show;\n    this.Hide = WebPartMenu_Hide;\n    this.Hover = WebPartMenu_Hover;\n    this.Unhover = WebPartMenu_Unhover;\n    this.Dispose = WebPartMenu_Dispose;\n    var menu = this;\n    this.disposeDelegate = function() { menu.Dispose(); };\n    window.attachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Dispose() {\n    this.menuLabelElement.__menu = null;\n    this.menuDropDownElement.__menu = null;\n    window.detachEvent('onunload', this.disposeDelegate);\n}\nfunction WebPartMenu_Show() {\n    if ((typeof(__wpm.menu) != \"undefined\") && (__wpm.menu != null)) {\n        __wpm.menu.Hide();\n    }\n    var menuHTML =\n        \"<html><head><style>\" +\n        \"a.menuItem, a.menuItem:Link { display: block; padding: 1px; text-decoration: none; \" + this.itemStyle + \" }\" +\n        \"a.menuItem:Hover { \" + this.itemHoverStyle + \" }\" +\n        \"</style><body scroll=\\\"no\\\" style=\\\"border: none; margin: 0; padding: 0;\\\" ondragstart=\\\"window.event.returnValue=false;\\\" onclick=\\\"popup.hide()\\\">\" +\n        this.menuElement.innerHTML +\n        \"</body></html>\";\n    var width = 16;\n    var height = 16;\n    this.popup = window.createPopup();\n    __wpm.menu = this;\n    var popupDocument = this.popup.document;\n    popupDocument.write(menuHTML);\n    this.popup.show(0, 0, width, height);\n    var popupBody = popupDocument.body;\n    width = popupBody.scrollWidth;\n    height = popupBody.scrollHeight;\n    if (width < this.menuLabelElement.offsetWidth) {\n        width = this.menuLabelElement.offsetWidth + 16;\n    }\n    if (this.menuElement.innerHTML.indexOf(\"progid:DXImageTransform.Microsoft.Shadow\") != -1) {\n        popupBody.style.paddingRight = \"4px\";\n    }\n    popupBody.__wpm = __wpm;\n    popupBody.__wpmDeleteWarning = __wpmDeleteWarning;\n    popupBody.__wpmCloseProviderWarning = __wpmCloseProviderWarning;\n    popupBody.popup = this.popup;\n    this.popup.hide();\n    this.popup.show(0, this.menuLabelElement.offsetHeight, width, height, this.menuLabelElement);\n}\nfunction WebPartMenu_Hide() {\n    if (__wpm.menu == this) {\n        __wpm.menu = null;\n        if ((typeof(this.popup) != \"undefined\") && (this.popup != null)) {\n            this.popup.hide();\n            this.popup = null;\n        }\n    }\n}\nfunction WebPartMenu_Hover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.className = this.menuLabelElement.className + \" \" + this.labelHoverClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.labelHoverColor;\n    }\n}\nfunction WebPartMenu_Unhover() {\n    if (this.labelHoverClassName != \"\") {\n        this.menuLabelElement.style.textDecoration = this.oldTextDecoration;\n        this.menuLabelElement.className = this.oldClassName;\n    }\n    if (this.labelHoverColor != \"\") {\n        this.menuLabelElement.style.color = this.oldColor;\n    }\n}\nfunction WebPartMenu_OnClick() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        window.event.returnValue = false;\n        window.event.cancelBubble = true;\n        menu.Show();\n    }\n}\nfunction WebPartMenu_OnKeyPress() {\n    if (window.event.keyCode == 13) {\n        var menu = window.event.srcElement.__menu;\n        if ((typeof(menu) != \"undefined\") && (menu != null)) {\n            window.event.returnValue = false;\n            window.event.cancelBubble = true;\n            menu.Show();\n        }\n    }\n}\nfunction WebPartMenu_OnMouseEnter() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Hover();\n    }\n}\nfunction WebPartMenu_OnMouseLeave() {\n    var menu = window.event.srcElement.__menu;\n    if ((typeof(menu) != \"undefined\") && (menu != null)) {\n        menu.Unhover();\n    }\n}\nfunction WebPartManager() {\n    this.overlayContainerElement = null;\n    this.zones = new Array();\n    this.dragState = null;\n    this.menu = null;\n    this.draggedWebPart = null;\n    this.AddZone = WebPartManager_AddZone;\n    this.IsDragDropEnabled = WebPartManager_IsDragDropEnabled;\n    this.DragDrop = WebPartManager_DragDrop;\n    this.InitiateWebPartDragDrop = WebPartManager_InitiateWebPartDragDrop;\n    this.CompleteWebPartDragDrop = WebPartManager_CompleteWebPartDragDrop;\n    this.ContinueWebPartDragDrop = WebPartManager_ContinueWebPartDragDrop;\n    this.ProcessWebPartDragEnter = WebPartManager_ProcessWebPartDragEnter;\n    this.ProcessWebPartDragOver = WebPartManager_ProcessWebPartDragOver;\n    this.ProcessWebPartDrop = WebPartManager_ProcessWebPartDrop;\n    this.ShowHelp = WebPartManager_ShowHelp;\n    this.ExportWebPart = WebPartManager_ExportWebPart;\n    this.Execute = WebPartManager_Execute;\n    this.SubmitPage = WebPartManager_SubmitPage;\n    this.UpdatePositions = WebPartManager_UpdatePositions;\n    window.attachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_Dispose() {\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].Dispose();\n    }\n    window.detachEvent(\"onunload\", WebPartManager_Dispose);\n}\nfunction WebPartManager_AddZone(zoneElement, uniqueID, isVertical, allowLayoutChange, highlightColor) {\n    var zoneIndex = this.zones.length;\n    var zone = new Zone(zoneElement, zoneIndex, uniqueID, isVertical, allowLayoutChange, highlightColor);\n    this.zones[zoneIndex] = zone;\n    return zone;\n}\nfunction WebPartManager_IsDragDropEnabled() {\n    return ((typeof(this.overlayContainerElement) != \"undefined\") && (this.overlayContainerElement != null));\n}\nfunction WebPartManager_DragDrop() {\n    if ((typeof(this.draggedWebPart) != \"undefined\") && (this.draggedWebPart != null)) {\n        var tempWebPart = this.draggedWebPart;\n        this.draggedWebPart = null;\n        tempWebPart.dragDrop();\n        window.setTimeout(\"__wpClearSelection()\", 0);\n    }\n}\nfunction WebPartManager_InitiateWebPartDragDrop(webPartElement) {\n    var webPart = webPartElement.__webPart;\n    this.UpdatePositions();\n    this.dragState = new WebPartDragState(webPartElement, \"move\");\n    var location = __wpGetPageEventLocation(window.event, true);\n    var overlayContainerElement = this.overlayContainerElement;\n    overlayContainerElement.style.left = location.x - webPartElement.offsetWidth / 2;\n    overlayContainerElement.style.top = location.y + 4 + (webPartElement.clientTop ? webPartElement.clientTop : 0);\n    overlayContainerElement.style.display = \"block\";\n    overlayContainerElement.style.width = webPartElement.offsetWidth;\n    overlayContainerElement.style.height = webPartElement.offsetHeight;\n    overlayContainerElement.appendChild(webPartElement.cloneNode(true));\n    if (webPart.allowZoneChange == false) {\n        webPart.zone.allowDrop = true;\n    }\n    else {\n        for (var i = 0; i < __wpm.zones.length; i++) {\n            var zone = __wpm.zones[i];\n            if (zone.allowLayoutChange) {\n                zone.allowDrop = true;\n            }\n        }\n    }\n    document.body.attachEvent(\"ondragover\", Zone_OnDragOver);\n    return \"move\";\n}\nfunction WebPartManager_CompleteWebPartDragDrop() {\n    var dragState = this.dragState;\n    this.dragState = null;\n    if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n    }\n    document.body.detachEvent(\"ondragover\", Zone_OnDragOver);\n    for (var i = 0; i < __wpm.zones.length; i++) {\n        __wpm.zones[i].allowDrop = false;\n    }\n    this.overlayContainerElement.removeChild(this.overlayContainerElement.firstChild);\n    this.overlayContainerElement.style.display = \"none\";\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) && (dragState.dropped == true)) {\n        var currentZone = dragState.webPartElement.__webPart.zone;\n        var currentZoneIndex = dragState.webPartElement.__webPart.zoneIndex;\n        if ((currentZone != dragState.dropZoneElement.__zone) ||\n            ((currentZoneIndex != dragState.dropIndex) &&\n             (currentZoneIndex != (dragState.dropIndex - 1)))) {\n            var eventTarget = dragState.dropZoneElement.__zone.uniqueID;\n            var eventArgument = \"Drag:\" + dragState.webPartElement.id + \":\" + dragState.dropIndex;\n            this.SubmitPage(eventTarget, eventArgument);\n        }\n    }\n}\nfunction WebPartManager_ContinueWebPartDragDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var style = this.overlayContainerElement.style;\n        var location = __wpGetPageEventLocation(window.event, true);\n        style.left = location.x - dragState.webPartElement.offsetWidth / 2;\n        style.top = location.y + 4 + (dragState.webPartElement.clientTop ? dragState.webPartElement.clientTop : 0);\n    }\n}\nfunction WebPartManager_Execute(script) {\n    if (this.menu) {\n        this.menu.Hide();\n    }\n    var scriptReference = new Function(script);\n    return (scriptReference() != false);\n}\nfunction WebPartManager_ProcessWebPartDragEnter() {\n    var dragState = __wpm.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var newDropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(newDropZoneElement.__zone) == \"undefined\") || (newDropZoneElement.__zone == null) ||\n            (newDropZoneElement.__zone.allowDrop == false)) {\n            newDropZoneElement = null;\n        }\n        var newDropIndex = -1;\n        if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n            newDropIndex = newDropZoneElement.__zone.GetWebPartIndex(__wpGetPageEventLocation(currentEvent, false));\n            if (newDropIndex == -1) {\n                newDropZoneElement = null;\n            }\n        }\n        if (dragState.dropZoneElement != newDropZoneElement) {\n            if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropZoneElement = newDropZoneElement;\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        else if (dragState.dropIndex != newDropIndex) {\n            if (dragState.dropIndex != -1) {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, false);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(newDropZoneElement) != \"undefined\") && (newDropZoneElement != null)) {\n                newDropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        if ((typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            currentEvent.dataTransfer.effectAllowed = dragState.effect;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ProcessWebPartDragOver() {\n    var dragState = __wpm.dragState;\n    var currentEvent = window.event;\n    var handled = false;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null) &&\n        (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if (((typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) &&\n            (typeof(dragState.dropZoneElement) != \"undefined\") && (dragState.dropZoneElement != null)) {\n            dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n            dragState.dropZoneElement = null;\n            dragState.dropIndex = -1;\n        }\n        else if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n            var location = __wpGetPageEventLocation(currentEvent, false);\n            var newDropIndex = dropZoneElement.__zone.GetWebPartIndex(location);\n            if (newDropIndex == -1) {\n                dropZoneElement = null;\n            }\n            if (dragState.dropZoneElement != dropZoneElement) {\n                if ((dragState.dropIndex != -1) || (typeof(dropZoneElement) == \"undefined\") || (dropZoneElement == null)) {\n                    dragState.dropZoneElement.__zone.ToggleDropCues(false, __wpm.dragState.dropIndex, false);\n                }\n                dragState.dropZoneElement = dropZoneElement;\n            }\n            else {\n                dragState.dropZoneElement.__zone.ToggleDropCues(false, dragState.dropIndex, true);\n            }\n            dragState.dropIndex = newDropIndex;\n            if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null)) {\n                dropZoneElement.__zone.ToggleDropCues(true, newDropIndex, false);\n            }\n        }\n        handled = true;\n    }\n    if ((typeof(dragState) == \"undefined\") || (dragState == null) ||\n        (typeof(dragState.dropZoneElement) == \"undefined\") || (dragState.dropZoneElement == null)) {\n        currentEvent.dataTransfer.effectAllowed = \"none\";\n    }\n    return handled;\n}\nfunction WebPartManager_ProcessWebPartDrop() {\n    var dragState = this.dragState;\n    if ((typeof(dragState) != \"undefined\") && (dragState != null)) {\n        var currentEvent = window.event;\n        var dropZoneElement = Zone_GetParentZoneElement(currentEvent.srcElement);\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dropZoneElement.__zone.allowDrop == false)) {\n            dropZoneElement = null;\n        }\n        if ((typeof(dropZoneElement) != \"undefined\") && (dropZoneElement != null) && (dragState.dropZoneElement == dropZoneElement)) {\n            dragState.dropped = true;\n        }\n        return true;\n    }\n    return false;\n}\nfunction WebPartManager_ShowHelp(helpUrl, helpMode) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    if (helpMode == 0 || helpMode == 1) {\n        if (helpMode == 0) {\n            var dialogInfo = \"edge: Sunken; center: yes; help: no; resizable: yes; status: no\";\n            window.showModalDialog(helpUrl, null, dialogInfo);\n        }\n        else {\n            window.open(helpUrl, null, \"scrollbars=yes,resizable=yes,status=no,toolbar=no,menubar=no,location=no\");\n        }\n    }\n    else if (helpMode == 2) {\n        window.location = helpUrl;\n    }\n}\nfunction WebPartManager_ExportWebPart(exportUrl, warn, confirmOnly) {\n    if (warn == true && __wpmExportWarning.length > 0 && this.personalizationScopeShared != true) {\n        if (confirm(__wpmExportWarning) == false) {\n            return false;\n        }\n    }\n    if (confirmOnly == false) {\n        window.location = exportUrl;\n    }\n    return true;\n}\nfunction WebPartManager_UpdatePositions() {\n    for (var i = 0; i < this.zones.length; i++) {\n        this.zones[i].UpdatePosition();\n    }\n}\nfunction WebPartManager_SubmitPage(eventTarget, eventArgument) {\n    if ((typeof(this.menu) != \"undefined\") && (this.menu != null)) {\n        this.menu.Hide();\n    }\n    __doPostBack(eventTarget, eventArgument);\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/WebForms/WebUIValidation.js",
    "content": "//CdnPath=http://ajax.aspnetcdn.com/ajax/4.5.1/1/WebUIValidation.js\nvar Page_ValidationVer = \"125\";\nvar Page_IsValid = true;\nvar Page_BlockSubmit = false;\nvar Page_InvalidControlToBeFocused = null;\nvar Page_TextTypes = /^(text|password|file|search|tel|url|email|number|range|color|datetime|date|month|week|time|datetime-local)$/i;\nfunction ValidatorUpdateDisplay(val) {\n    if (typeof(val.display) == \"string\") {\n        if (val.display == \"None\") {\n            return;\n        }\n        if (val.display == \"Dynamic\") {\n            val.style.display = val.isvalid ? \"none\" : \"inline\";\n            return;\n        }\n    }\n    if ((navigator.userAgent.indexOf(\"Mac\") > -1) &&\n        (navigator.userAgent.indexOf(\"MSIE\") > -1)) {\n        val.style.display = \"inline\";\n    }\n    val.style.visibility = val.isvalid ? \"hidden\" : \"visible\";\n}\nfunction ValidatorUpdateIsValid() {\n    Page_IsValid = AllValidatorsValid(Page_Validators);\n}\nfunction AllValidatorsValid(validators) {\n    if ((typeof(validators) != \"undefined\") && (validators != null)) {\n        var i;\n        for (i = 0; i < validators.length; i++) {\n            if (!validators[i].isvalid) {\n                return false;\n            }\n        }\n    }\n    return true;\n}\nfunction ValidatorHookupControlID(controlID, val) {\n    if (typeof(controlID) != \"string\") {\n        return;\n    }\n    var ctrl = document.getElementById(controlID);\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null)) {\n        ValidatorHookupControl(ctrl, val);\n    }\n    else {\n        val.isvalid = true;\n        val.enabled = false;\n    }\n}\nfunction ValidatorHookupControl(control, val) {\n    if (typeof(control.tagName) != \"string\") {\n        return;  \n    }\n    if (control.tagName != \"INPUT\" && control.tagName != \"TEXTAREA\" && control.tagName != \"SELECT\") {\n        var i;\n        for (i = 0; i < control.childNodes.length; i++) {\n            ValidatorHookupControl(control.childNodes[i], val);\n        }\n        return;\n    }\n    else {\n        if (typeof(control.Validators) == \"undefined\") {\n            control.Validators = new Array;\n            var eventType;\n            if (control.type == \"radio\") {\n                eventType = \"onclick\";\n            } else {\n                eventType = \"onchange\";\n                if (typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                    ValidatorHookupEvent(control, \"onblur\", \"ValidatedControlOnBlur(event); \");\n                }\n            }\n            ValidatorHookupEvent(control, eventType, \"ValidatorOnChange(event); \");\n            if (Page_TextTypes.test(control.type)) {\n                ValidatorHookupEvent(control, \"onkeypress\", \n                    \"event = event || window.event; if (!ValidatedTextBoxOnKeyPress(event)) { event.cancelBubble = true; if (event.stopPropagation) event.stopPropagation(); return false; } \");\n            }\n        }\n        control.Validators[control.Validators.length] = val;\n    }\n}\nfunction ValidatorHookupEvent(control, eventType, functionPrefix) {\n    var ev = control[eventType];\n    if (typeof(ev) == \"function\") {\n        ev = ev.toString();\n        ev = ev.substring(ev.indexOf(\"{\") + 1, ev.lastIndexOf(\"}\"));\n    }\n    else {\n        ev = \"\";\n    }\n    control[eventType] = new Function(\"event\", functionPrefix + \" \" + ev);\n}\nfunction ValidatorGetValue(id) {\n    var control;\n    control = document.getElementById(id);\n    if (typeof(control.value) == \"string\") {\n        return control.value;\n    }\n    return ValidatorGetValueRecursive(control);\n}\nfunction ValidatorGetValueRecursive(control)\n{\n    if (typeof(control.value) == \"string\" && (control.type != \"radio\" || control.checked == true)) {\n        return control.value;\n    }\n    var i, val;\n    for (i = 0; i<control.childNodes.length; i++) {\n        val = ValidatorGetValueRecursive(control.childNodes[i]);\n        if (val != \"\") return val;\n    }\n    return \"\";\n}\nfunction Page_ClientValidate(validationGroup) {\n    Page_InvalidControlToBeFocused = null;\n    if (typeof(Page_Validators) == \"undefined\") {\n        return true;\n    }\n    var i;\n    for (i = 0; i < Page_Validators.length; i++) {\n        ValidatorValidate(Page_Validators[i], validationGroup, null);\n    }\n    ValidatorUpdateIsValid();\n    ValidationSummaryOnSubmit(validationGroup);\n    Page_BlockSubmit = !Page_IsValid;\n    return Page_IsValid;\n}\nfunction ValidatorCommonOnSubmit() {\n    Page_InvalidControlToBeFocused = null;\n    var result = !Page_BlockSubmit;\n    if ((typeof(window.event) != \"undefined\") && (window.event != null)) {\n        window.event.returnValue = result;\n    }\n    Page_BlockSubmit = false;\n    return result;\n}\nfunction ValidatorEnable(val, enable) {\n    val.enabled = (enable != false);\n    ValidatorValidate(val);\n    ValidatorUpdateIsValid();\n}\nfunction ValidatorOnChange(event) {\n    event = event || window.event;\n    Page_InvalidControlToBeFocused = null;\n    var targetedControl;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        targetedControl = event.srcElement;\n    }\n    else {\n        targetedControl = event.target;\n    }\n    var vals;\n    if (typeof(targetedControl.Validators) != \"undefined\") {\n        vals = targetedControl.Validators;\n    }\n    else {\n        if (targetedControl.tagName.toLowerCase() == \"label\") {\n            targetedControl = document.getElementById(targetedControl.htmlFor);\n            vals = targetedControl.Validators;\n        }\n    }\n    if (vals) {\n        for (var i = 0; i < vals.length; i++) {\n            ValidatorValidate(vals[i], null, event);\n        }\n    }\n    ValidatorUpdateIsValid();\n}\nfunction ValidatedTextBoxOnKeyPress(event) {\n    event = event || window.event;\n    if (event.keyCode == 13) {\n        ValidatorOnChange(event);\n        var vals;\n        if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n            vals = event.srcElement.Validators;\n        }\n        else {\n            vals = event.target.Validators;\n        }\n        return AllValidatorsValid(vals);\n    }\n    return true;\n}\nfunction ValidatedControlOnBlur(event) {\n    event = event || window.event;\n    var control;\n    if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n        control = event.srcElement;\n    }\n    else {\n        control = event.target;\n    }\n    if ((typeof(control) != \"undefined\") && (control != null) && (Page_InvalidControlToBeFocused == control)) {\n        control.focus();\n        Page_InvalidControlToBeFocused = null;\n    }\n}\nfunction ValidatorValidate(val, validationGroup, event) {\n    val.isvalid = true;\n    if ((typeof(val.enabled) == \"undefined\" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) {\n        if (typeof(val.evaluationfunction) == \"function\") {\n            val.isvalid = val.evaluationfunction(val);\n            if (!val.isvalid && Page_InvalidControlToBeFocused == null &&\n                typeof(val.focusOnError) == \"string\" && val.focusOnError == \"t\") {\n                ValidatorSetFocus(val, event);\n            }\n        }\n    }\n    ValidatorUpdateDisplay(val);\n}\nfunction ValidatorSetFocus(val, event) {\n    var ctrl;\n    if (typeof(val.controlhookup) == \"string\") {\n        var eventCtrl;\n        if ((typeof(event) != \"undefined\") && (event != null)) {\n            if ((typeof(event.srcElement) != \"undefined\") && (event.srcElement != null)) {\n                eventCtrl = event.srcElement;\n            }\n            else {\n                eventCtrl = event.target;\n            }\n        }\n        if ((typeof(eventCtrl) != \"undefined\") && (eventCtrl != null) &&\n            (typeof(eventCtrl.id) == \"string\") &&\n            (eventCtrl.id == val.controlhookup)) {\n            ctrl = eventCtrl;\n        }\n    }\n    if ((typeof(ctrl) == \"undefined\") || (ctrl == null)) {\n        ctrl = document.getElementById(val.controltovalidate);\n    }\n    if ((typeof(ctrl) != \"undefined\") && (ctrl != null) &&\n        (ctrl.tagName.toLowerCase() != \"table\" || (typeof(event) == \"undefined\") || (event == null)) && \n        ((ctrl.tagName.toLowerCase() != \"input\") || (ctrl.type.toLowerCase() != \"hidden\")) &&\n        (typeof(ctrl.disabled) == \"undefined\" || ctrl.disabled == null || ctrl.disabled == false) &&\n        (typeof(ctrl.visible) == \"undefined\" || ctrl.visible == null || ctrl.visible != false) &&\n        (IsInVisibleContainer(ctrl))) {\n        if ((ctrl.tagName.toLowerCase() == \"table\" && (typeof(__nonMSDOMBrowser) == \"undefined\" || __nonMSDOMBrowser)) ||\n            (ctrl.tagName.toLowerCase() == \"span\")) {\n            var inputElements = ctrl.getElementsByTagName(\"input\");\n            var lastInputElement  = inputElements[inputElements.length -1];\n            if (lastInputElement != null) {\n                ctrl = lastInputElement;\n            }\n        }\n        if (typeof(ctrl.focus) != \"undefined\" && ctrl.focus != null) {\n            ctrl.focus();\n            Page_InvalidControlToBeFocused = ctrl;\n        }\n    }\n}\nfunction IsInVisibleContainer(ctrl) {\n    if (typeof(ctrl.style) != \"undefined\" &&\n        ( ( typeof(ctrl.style.display) != \"undefined\" &&\n            ctrl.style.display == \"none\") ||\n          ( typeof(ctrl.style.visibility) != \"undefined\" &&\n            ctrl.style.visibility == \"hidden\") ) ) {\n        return false;\n    }\n    else if (typeof(ctrl.parentNode) != \"undefined\" &&\n             ctrl.parentNode != null &&\n             ctrl.parentNode != ctrl) {\n        return IsInVisibleContainer(ctrl.parentNode);\n    }\n    return true;\n}\nfunction IsValidationGroupMatch(control, validationGroup) {\n    if ((typeof(validationGroup) == \"undefined\") || (validationGroup == null)) {\n        return true;\n    }\n    var controlGroup = \"\";\n    if (typeof(control.validationGroup) == \"string\") {\n        controlGroup = control.validationGroup;\n    }\n    return (controlGroup == validationGroup);\n}\nfunction ValidatorOnLoad() {\n    if (typeof(Page_Validators) == \"undefined\")\n        return;\n    var i, val;\n    for (i = 0; i < Page_Validators.length; i++) {\n        val = Page_Validators[i];\n        if (typeof(val.evaluationfunction) == \"string\") {\n            eval(\"val.evaluationfunction = \" + val.evaluationfunction + \";\");\n        }\n        if (typeof(val.isvalid) == \"string\") {\n            if (val.isvalid == \"False\") {\n                val.isvalid = false;\n                Page_IsValid = false;\n            }\n            else {\n                val.isvalid = true;\n            }\n        } else {\n            val.isvalid = true;\n        }\n        if (typeof(val.enabled) == \"string\") {\n            val.enabled = (val.enabled != \"False\");\n        }\n        if (typeof(val.controltovalidate) == \"string\") {\n            ValidatorHookupControlID(val.controltovalidate, val);\n        }\n        if (typeof(val.controlhookup) == \"string\") {\n            ValidatorHookupControlID(val.controlhookup, val);\n        }\n    }\n    Page_ValidationActive = true;\n}\nfunction ValidatorConvert(op, dataType, val) {\n    function GetFullYear(year) {\n        var twoDigitCutoffYear = val.cutoffyear % 100;\n        var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;\n        return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));\n    }\n    var num, cleanInput, m, exp;\n    if (dataType == \"Integer\") {\n        exp = /^\\s*[-\\+]?\\d+\\s*$/;\n        if (op.match(exp) == null)\n            return null;\n        num = parseInt(op, 10);\n        return (isNaN(num) ? null : num);\n    }\n    else if(dataType == \"Double\") {\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?(\\\\d*)\\\\\" + val.decimalchar + \"?(\\\\d*)\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && m[3].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + (m[2].length>0 ? m[2] : \"0\") + (m[3].length>0 ? \".\" + m[3] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Currency\") {\n        var hasDigits = (val.digits > 0);\n        var beginGroupSize, subsequentGroupSize;\n        var groupSizeNum = parseInt(val.groupsize, 10);\n        if (!isNaN(groupSizeNum) && groupSizeNum > 0) {\n            beginGroupSize = \"{1,\" + groupSizeNum + \"}\";\n            subsequentGroupSize = \"{\" + groupSizeNum + \"}\";\n        }\n        else {\n            beginGroupSize = subsequentGroupSize = \"+\";\n        }\n        exp = new RegExp(\"^\\\\s*([-\\\\+])?((\\\\d\" + beginGroupSize + \"(\\\\\" + val.groupchar + \"\\\\d\" + subsequentGroupSize + \")+)|\\\\d*)\"\n                        + (hasDigits ? \"\\\\\" + val.decimalchar + \"?(\\\\d{0,\" + val.digits + \"})\" : \"\")\n                        + \"\\\\s*$\");\n        m = op.match(exp);\n        if (m == null)\n            return null;\n        if (m[2].length == 0 && hasDigits && m[5].length == 0)\n            return null;\n        cleanInput = (m[1] != null ? m[1] : \"\") + m[2].replace(new RegExp(\"(\\\\\" + val.groupchar + \")\", \"g\"), \"\") + ((hasDigits && m[5].length > 0) ? \".\" + m[5] : \"\");\n        num = parseFloat(cleanInput);\n        return (isNaN(num) ? null : num);\n    }\n    else if (dataType == \"Date\") {\n        var yearFirstExp = new RegExp(\"^\\\\s*((\\\\d{4})|(\\\\d{2}))([-/]|\\\\. ?)(\\\\d{1,2})\\\\4(\\\\d{1,2})\\\\.?\\\\s*$\");\n        m = op.match(yearFirstExp);\n        var day, month, year;\n        if (m != null && (((typeof(m[2]) != \"undefined\") && (m[2].length == 4)) || val.dateorder == \"ymd\")) {\n            day = m[6];\n            month = m[5];\n            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));\n        }\n        else {\n            if (val.dateorder == \"ymd\"){\n                return null;\n            }\n            var yearLastExp = new RegExp(\"^\\\\s*(\\\\d{1,2})([-/]|\\\\. ?)(\\\\d{1,2})(?:\\\\s|\\\\2)((\\\\d{4})|(\\\\d{2}))(?:\\\\s\\u0433\\\\.|\\\\.)?\\\\s*$\");\n            m = op.match(yearLastExp);\n            if (m == null) {\n                return null;\n            }\n            if (val.dateorder == \"mdy\") {\n                day = m[3];\n                month = m[1];\n            }\n            else {\n                day = m[1];\n                month = m[3];\n            }\n            year = ((typeof(m[5]) != \"undefined\") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10));\n        }\n        month -= 1;\n        var date = new Date(year, month, day);\n        if (year < 100) {\n            date.setFullYear(year);\n        }\n        return (typeof(date) == \"object\" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;\n    }\n    else {\n        return op.toString();\n    }\n}\nfunction ValidatorCompare(operand1, operand2, operator, val) {\n    var dataType = val.type;\n    var op1, op2;\n    if ((op1 = ValidatorConvert(operand1, dataType, val)) == null)\n        return false;\n    if (operator == \"DataTypeCheck\")\n        return true;\n    if ((op2 = ValidatorConvert(operand2, dataType, val)) == null)\n        return true;\n    switch (operator) {\n        case \"NotEqual\":\n            return (op1 != op2);\n        case \"GreaterThan\":\n            return (op1 > op2);\n        case \"GreaterThanEqual\":\n            return (op1 >= op2);\n        case \"LessThan\":\n            return (op1 < op2);\n        case \"LessThanEqual\":\n            return (op1 <= op2);\n        default:\n            return (op1 == op2);\n    }\n}\nfunction CompareValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var compareTo = \"\";\n    if ((typeof(val.controltocompare) != \"string\") ||\n        (typeof(document.getElementById(val.controltocompare)) == \"undefined\") ||\n        (null == document.getElementById(val.controltocompare))) {\n        if (typeof(val.valuetocompare) == \"string\") {\n            compareTo = val.valuetocompare;\n        }\n    }\n    else {\n        compareTo = ValidatorGetValue(val.controltocompare);\n    }\n    var operator = \"Equal\";\n    if (typeof(val.operator) == \"string\") {\n        operator = val.operator;\n    }\n    return ValidatorCompare(value, compareTo, operator, val);\n}\nfunction CustomValidatorEvaluateIsValid(val) {\n    var value = \"\";\n    if (typeof(val.controltovalidate) == \"string\") {\n        value = ValidatorGetValue(val.controltovalidate);\n        if ((ValidatorTrim(value).length == 0) &&\n            ((typeof(val.validateemptytext) != \"string\") || (val.validateemptytext != \"true\"))) {\n            return true;\n        }\n    }\n    var args = { Value:value, IsValid:true };\n    if (typeof(val.clientvalidationfunction) == \"string\") {\n        eval(val.clientvalidationfunction + \"(val, args) ;\");\n    }\n    return args.IsValid;\n}\nfunction RegularExpressionValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    var rx = new RegExp(val.validationexpression);\n    var matches = rx.exec(value);\n    return (matches != null && value == matches[0]);\n}\nfunction ValidatorTrim(s) {\n    var m = s.match(/^\\s*(\\S+(\\s+\\S+)*)\\s*$/);\n    return (m == null) ? \"\" : m[1];\n}\nfunction RequiredFieldValidatorEvaluateIsValid(val) {\n    return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))\n}\nfunction RangeValidatorEvaluateIsValid(val) {\n    var value = ValidatorGetValue(val.controltovalidate);\n    if (ValidatorTrim(value).length == 0)\n        return true;\n    return (ValidatorCompare(value, val.minimumvalue, \"GreaterThanEqual\", val) &&\n            ValidatorCompare(value, val.maximumvalue, \"LessThanEqual\", val));\n}\nfunction ValidationSummaryOnSubmit(validationGroup) {\n    if (typeof(Page_ValidationSummaries) == \"undefined\")\n        return;\n    var summary, sums, s;\n    var headerSep, first, pre, post, end;\n    for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {\n        summary = Page_ValidationSummaries[sums];\n        if (!summary) continue;\n        summary.style.display = \"none\";\n        if (!Page_IsValid && IsValidationGroupMatch(summary, validationGroup)) {\n            var i;\n            if (summary.showsummary != \"False\") {\n                summary.style.display = \"\";\n                if (typeof(summary.displaymode) != \"string\") {\n                    summary.displaymode = \"BulletList\";\n                }\n                switch (summary.displaymode) {\n                    case \"List\":\n                        headerSep = \"<br>\";\n                        first = \"\";\n                        pre = \"\";\n                        post = \"<br>\";\n                        end = \"\";\n                        break;\n                    case \"BulletList\":\n                    default:\n                        headerSep = \"\";\n                        first = \"<ul>\";\n                        pre = \"<li>\";\n                        post = \"</li>\";\n                        end = \"</ul>\";\n                        break;\n                    case \"SingleParagraph\":\n                        headerSep = \" \";\n                        first = \"\";\n                        pre = \"\";\n                        post = \" \";\n                        end = \"<br>\";\n                        break;\n                }\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + headerSep;\n                }\n                s += first;\n                for (i=0; i<Page_Validators.length; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        s += pre + Page_Validators[i].errormessage + post;\n                    }\n                }\n                s += end;\n                summary.innerHTML = s;\n                window.scrollTo(0,0);\n            }\n            if (summary.showmessagebox == \"True\") {\n                s = \"\";\n                if (typeof(summary.headertext) == \"string\") {\n                    s += summary.headertext + \"\\r\\n\";\n                }\n                var lastValIndex = Page_Validators.length - 1;\n                for (i=0; i<=lastValIndex; i++) {\n                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == \"string\") {\n                        switch (summary.displaymode) {\n                            case \"List\":\n                                s += Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"BulletList\":\n                            default:\n                                s += \"- \" + Page_Validators[i].errormessage;\n                                if (i < lastValIndex) {\n                                    s += \"\\r\\n\";\n                                }\n                                break;\n                            case \"SingleParagraph\":\n                                s += Page_Validators[i].errormessage + \" \";\n                                break;\n                        }\n                    }\n                }\n                alert(s);\n            }\n        }\n    }\n}\nif (window.jQuery) {\n    (function ($) {\n        var dataValidationAttribute = \"data-val\",\n            dataValidationSummaryAttribute = \"data-valsummary\",\n            normalizedAttributes = { validationgroup: \"validationGroup\", focusonerror: \"focusOnError\" };\n        function getAttributesWithPrefix(element, prefix) {\n            var i,\n                attribute,\n                list = {},\n                attributes = element.attributes,\n                length = attributes.length,\n                prefixLength = prefix.length;\n            prefix = prefix.toLowerCase();\n            for (i = 0; i < length; i++) {\n                attribute = attributes[i];\n                if (attribute.specified && attribute.name.substr(0, prefixLength).toLowerCase() === prefix) {\n                    list[attribute.name.substr(prefixLength)] = attribute.value;\n                }\n            }\n            return list;\n        }\n        function normalizeKey(key) {\n            key = key.toLowerCase();\n            return normalizedAttributes[key] === undefined ? key : normalizedAttributes[key];\n        }\n        function addValidationExpando(element) {\n            var attributes = getAttributesWithPrefix(element, dataValidationAttribute + \"-\");\n            $.each(attributes, function (key, value) {\n                element[normalizeKey(key)] = value;\n            });\n        }\n        function dispose(element) {\n            var index = $.inArray(element, Page_Validators);\n            if (index >= 0) {\n                Page_Validators.splice(index, 1);\n            }\n        }\n        function addNormalizedAttribute(name, normalizedName) {\n            normalizedAttributes[name.toLowerCase()] = normalizedName;\n        }\n        function parseSpecificAttribute(selector, attribute, validatorsArray) {\n            return $(selector).find(\"[\" + attribute + \"='true']\").each(function (index, element) {\n                addValidationExpando(element);\n                element.dispose = function () { dispose(element); element.dispose = null; };\n                if ($.inArray(element, validatorsArray) === -1) {\n                    validatorsArray.push(element);\n                }\n            }).length;\n        }\n        function parse(selector) {\n            var length = parseSpecificAttribute(selector, dataValidationAttribute, Page_Validators);\n            length += parseSpecificAttribute(selector, dataValidationSummaryAttribute, Page_ValidationSummaries);\n            return length;\n        }\n        function loadValidators() {\n            if (typeof (ValidatorOnLoad) === \"function\") {\n                ValidatorOnLoad();\n            }\n            if (typeof (ValidatorOnSubmit) === \"undefined\") {\n                window.ValidatorOnSubmit = function () {\n                    return Page_ValidationActive ? ValidatorCommonOnSubmit() : true;\n                };\n            }\n        }\n        function registerUpdatePanel() {\n            if (window.Sys && Sys.WebForms && Sys.WebForms.PageRequestManager) {\n                var prm = Sys.WebForms.PageRequestManager.getInstance(),\n                    postBackElement, endRequestHandler;\n                if (prm.get_isInAsyncPostBack()) {\n                    endRequestHandler = function (sender, args) {\n                        if (parse(document)) {\n                            loadValidators();\n                        }\n                        prm.remove_endRequest(endRequestHandler);\n                        endRequestHandler = null;\n                    };\n                    prm.add_endRequest(endRequestHandler);\n                }\n                prm.add_beginRequest(function (sender, args) {\n                    postBackElement = args.get_postBackElement();\n                });\n                prm.add_pageLoaded(function (sender, args) {\n                    var i, panels, valFound = 0;\n                    if (typeof (postBackElement) === \"undefined\") {\n                        return;\n                    }\n                    panels = args.get_panelsUpdated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    panels = args.get_panelsCreated();\n                    for (i = 0; i < panels.length; i++) {\n                        valFound += parse(panels[i]);\n                    }\n                    if (valFound) {\n                        loadValidators();\n                    }\n                });\n            }\n        }\n        $(function () {\n            if (typeof (Page_Validators) === \"undefined\") {\n                window.Page_Validators = [];\n            }\n            if (typeof (Page_ValidationSummaries) === \"undefined\") {\n                window.Page_ValidationSummaries = [];\n            }\n            if (typeof (Page_ValidationActive) === \"undefined\") {\n                window.Page_ValidationActive = false;\n            }\n            $.WebFormValidator = {\n                addNormalizedAttribute: addNormalizedAttribute,\n                parse: parse\n            };\n            if (parse(document)) {\n                loadValidators();\n            }\n            registerUpdatePanel();\n        });\n    } (jQuery));\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/bootstrap.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n\n/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/\nif (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#carousel\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#collapse\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    var $el = $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#modals\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#popovers\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tabs\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#affix\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.intellisense.js",
    "content": "﻿/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\nintellisense.annotate(jQuery, {\n  'ajax': function() {\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup().</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'ajaxPrefilter': function() {\n    /// <signature>\n    ///   <summary>Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().</summary>\n    ///   <param name=\"dataTypes\" type=\"String\">An optional string containing one or more space-separated dataTypes</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to set default values for future Ajax requests.</param>\n    /// </signature>\n  },\n  'ajaxSetup': function() {\n    /// <signature>\n    ///   <summary>Set default values for future Ajax requests.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A set of key/value pairs that configure the default Ajax request. All options are optional.</param>\n    /// </signature>\n  },\n  'ajaxTransport': function() {\n    /// <signature>\n    ///   <summary>Creates an object that handles the actual transmission of Ajax data.</summary>\n    ///   <param name=\"dataType\" type=\"String\">A string identifying the data type to use</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to return the new transport object to use with the data type provided in the first argument.</param>\n    /// </signature>\n  },\n  'boxModel': function() {\n    /// <summary>Deprecated in jQuery 1.3 (see jQuery.support). States if the current page, in the user's browser, is being rendered using the W3C CSS Box Model.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'browser': function() {\n    /// <summary>Contains flags for the useragent, read from navigator.userAgent. We recommend against using this property; please try to use feature detection instead (see jQuery.support). jQuery.browser may be moved to a plugin in a future release of jQuery.</summary>\n    /// <returns type=\"PlainObject\" />\n  },\n  'browser.version': function() {\n    /// <summary>The version number of the rendering engine for the user's browser.</summary>\n    /// <returns type=\"String\" />\n  },\n  'Callbacks': function() {\n    /// <signature>\n    ///   <summary>A multi-purpose callbacks list object that provides a powerful way to manage callback lists.</summary>\n    ///   <param name=\"flags\" type=\"String\">An optional list of space-separated flags that change how the callback list behaves.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM element is a descendant of another DOM element.</summary>\n    ///   <param name=\"container\" type=\"Element\">The DOM element that may contain the other element.</param>\n    ///   <param name=\"contained\" type=\"Element\">The DOM element that may be contained by (a descendant of) the other element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'cssHooks': function() {\n    /// <summary>Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <param name=\"key\" type=\"String\">Name of the data stored.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'Deferred': function() {\n    /// <signature>\n    ///   <summary>A constructor function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.</summary>\n    ///   <param name=\"beforeStart\" type=\"Function\">A function that is called just before the constructor returns.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove and execute a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    /// </signature>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties.</summary>\n    ///   <param name=\"collection\" type=\"Object\">The object or array to iterate over.</param>\n    ///   <param name=\"callback(indexInArray, valueOfElement)\" type=\"Function\">The function that will be executed on every object.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Takes a string and throws an exception containing it.</summary>\n    ///   <param name=\"message\" type=\"String\">The message to send out.</param>\n    /// </signature>\n  },\n  'extend': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"target\" type=\"Object\">An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"deep\" type=\"Boolean\">If true, the merge becomes recursive (aka. deep copy).</param>\n    ///   <param name=\"target\" type=\"Object\">The object to extend. It will receive the new properties.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP GET request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getJSON': function() {\n    /// <signature>\n    ///   <summary>Load JSON-encoded data from the server using a GET HTTP request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getScript': function() {\n    /// <signature>\n    ///   <summary>Load a JavaScript file from the server using a GET HTTP request, then execute it.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"success(script, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'globalEval': function() {\n    /// <signature>\n    ///   <summary>Execute some JavaScript code globally.</summary>\n    ///   <param name=\"code\" type=\"String\">The JavaScript code to execute.</param>\n    /// </signature>\n  },\n  'grep': function() {\n    /// <signature>\n    ///   <summary>Finds the elements of an array which satisfy a filter function. The original array is not affected.</summary>\n    ///   <param name=\"array\" type=\"Array\">The array to search through.</param>\n    ///   <param name=\"function(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the item, and the second argument is the index.  The function should return a Boolean value.  this will be the global window object.</param>\n    ///   <param name=\"invert\" type=\"Boolean\">If \"invert\" is false, or not provided, then the function returns an array consisting of all elements for which \"callback\" returns true.  If \"invert\" is true, then the function returns an array consisting of all elements for which \"callback\" returns false.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'hasData': function() {\n    /// <signature>\n    ///   <summary>Determine whether an element has any jQuery data associated with it.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to be checked for data.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'holdReady': function() {\n    /// <signature>\n    ///   <summary>Holds or releases the execution of jQuery's ready event.</summary>\n    ///   <param name=\"hold\" type=\"Boolean\">Indicates whether the ready hold is being requested or released</param>\n    /// </signature>\n  },\n  'inArray': function() {\n    /// <signature>\n    ///   <summary>Search for a specified value within an array and return its index (or -1 if not found).</summary>\n    ///   <param name=\"value\" type=\"Anything\">The value to search for.</param>\n    ///   <param name=\"array\" type=\"Array\">An array through which to search.</param>\n    ///   <param name=\"fromIndex\" type=\"Number\">The index of the array at which to begin the search. The default is 0, which will search the whole array.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'isArray': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is an array.</summary>\n    ///   <param name=\"obj\" type=\"Object\">Object to test whether or not it is an array.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isEmptyObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is empty (contains no enumerable properties).</summary>\n    ///   <param name=\"object\" type=\"Object\">The object that will be checked to see if it's empty.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isFunction': function() {\n    /// <signature>\n    ///   <summary>Determine if the argument passed is a Javascript function object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a function.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isNumeric': function() {\n    /// <signature>\n    ///   <summary>Determines whether its argument is a number.</summary>\n    ///   <param name=\"value\" type=\"PlainObject\">The value to be tested.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isPlainObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is a plain object (created using \"{}\" or \"new Object\").</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">The object that will be checked to see if it's a plain object.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isWindow': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is a window.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a window.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isXMLDoc': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM node is within an XML document (or is an XML document).</summary>\n    ///   <param name=\"node\" type=\"Element\">The DOM node that will be checked to see if it's in an XML document.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'makeArray': function() {\n    /// <signature>\n    ///   <summary>Convert an array-like object into a true JavaScript array.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Any object to turn into a native Array.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array to translate.</param>\n    ///   <param name=\"callback(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"arrayOrObject\" type=\"Object\">The Array or Object to translate.</param>\n    ///   <param name=\"callback( value, indexOrKey )\" type=\"Function\">The function to process each item against.  The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'merge': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two arrays together into the first array.</summary>\n    ///   <param name=\"first\" type=\"Array\">The first array to merge, the elements of second added.</param>\n    ///   <param name=\"second\" type=\"Array\">The second array to merge into the first, unaltered.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'noConflict': function() {\n    /// <signature>\n    ///   <summary>Relinquish jQuery's control of the $ variable.</summary>\n    ///   <param name=\"removeAll\" type=\"Boolean\">A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself).</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'noop': function() {\n    /// <summary>An empty function.</summary>\n  },\n  'now': function() {\n    /// <summary>Return a number representing the current time.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'param': function() {\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <param name=\"traditional\" type=\"Boolean\">A Boolean indicating whether to perform a traditional \"shallow\" serialization.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'parseHTML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an array of DOM nodes.</summary>\n    ///   <param name=\"data\" type=\"String\">HTML string to be parsed</param>\n    ///   <param name=\"context\" type=\"Element\">DOM element to serve as the context in which the HTML fragment will be created</param>\n    ///   <param name=\"keepScripts\" type=\"Boolean\">A Boolean indicating whether to include scripts passed in the HTML string</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'parseJSON': function() {\n    /// <signature>\n    ///   <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>\n    ///   <param name=\"json\" type=\"String\">The JSON string to parse.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'parseXML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an XML document.</summary>\n    ///   <param name=\"data\" type=\"String\">a well-formed XML string to be parsed</param>\n    ///   <returns type=\"XMLDocument\" />\n    /// </signature>\n  },\n  'post': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP POST request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'proxy': function() {\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function referenced in the function argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function named in the name argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element where the array of queued functions is attached.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element on which to add a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback()\" type=\"Function\">The new function to add to the queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove data.</param>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'sub': function() {\n    /// <summary>Creates a new copy of jQuery whose properties and methods can be modified without affecting the original jQuery object.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'support': function() {\n    /// <summary>A collection of properties that represent the presence of different browser features or bugs. Primarily intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'trim': function() {\n    /// <signature>\n    ///   <summary>Remove the whitespace from the beginning and end of a string.</summary>\n    ///   <param name=\"str\" type=\"String\">The string to trim.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'type': function() {\n    /// <signature>\n    ///   <summary>Determine the internal JavaScript [[Class]] of an object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to get the internal JavaScript [[Class]] of.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'unique': function() {\n    /// <signature>\n    ///   <summary>Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array of DOM elements.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'when': function() {\n    /// <signature>\n    ///   <summary>Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.</summary>\n    ///   <param name=\"deferreds\" type=\"Deferred\">One or more Deferred objects, or plain JavaScript objects.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nvar _1228819969 = jQuery.Callbacks;\njQuery.Callbacks = function(flags) {\nvar _object = _1228819969(flags);\nintellisense.annotate(_object, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add a callback or a collection of callbacks to a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be added to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'disable': function() {\n    /// <summary>Disable a callback list from doing anything more.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'disabled': function() {\n    /// <summary>Determine if the callbacks list has been disabled.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'empty': function() {\n    /// <summary>Remove all of the callbacks from a list.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'fire': function() {\n    /// <signature>\n    ///   <summary>Call all of the callbacks with the given arguments</summary>\n    ///   <param name=\"arguments\" type=\"Anything\">The argument or list of arguments to pass back to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'fired': function() {\n    /// <summary>Determine if the callbacks have already been called at least once.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'fireWith': function() {\n    /// <signature>\n    ///   <summary>Call all callbacks in a list with the given context and arguments.</summary>\n    ///   <param name=\"context\" type=\"\">A reference to the context in which the callbacks in the list should be fired.</param>\n    ///   <param name=\"args\" type=\"\">An argument, or array of arguments, to pass to the callbacks in the list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Determine whether a supplied callback is in a list</summary>\n    ///   <param name=\"callback\" type=\"Function\">The callback to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'lock': function() {\n    /// <summary>Lock a callback list in its current state.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'locked': function() {\n    /// <summary>Determine if the callbacks list has been locked.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove a callback or a collection of callbacks from a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be removed from the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _1228819969);\n\nvar _731531622 = jQuery.Deferred;\njQuery.Deferred = function(func) {\nvar _object = _731531622(func);\nintellisense.annotate(_object, {\n  'always': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is either resolved or rejected.</summary>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred is resolved or rejected.</param>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'done': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is resolved.</param>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'fail': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is rejected.</summary>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is rejected.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'isRejected': function() {\n    /// <summary>Determine whether a Deferred object has been rejected.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isResolved': function() {\n    /// <summary>Determine whether a Deferred object has been resolved.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'notify': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'notifyWith': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the progressCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'pipe': function() {\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'progress': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object generates progress notifications.</summary>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred generates progress notifications.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Deferred's Promise object.</summary>\n    ///   <param name=\"target\" type=\"Object\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'reject': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'rejectWith': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the failCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolve': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolveWith': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the doneCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'state': function() {\n    /// <summary>Determine the current state of a Deferred object.</summary>\n    /// <returns type=\"String\" />\n  },\n  'then': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">A function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred notifies progress.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _731531622);\n\nintellisense.annotate(jQuery.Event.prototype, {\n  'currentTarget': function() {\n    /// <summary>The current DOM element within the event bubbling phase.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'data': function() {\n    /// <summary>An optional object of data passed to an event method when the current executing handler is bound.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'delegateTarget': function() {\n    /// <summary>The element where the currently-called jQuery event handler was attached.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'isDefaultPrevented': function() {\n    /// <summary>Returns whether event.preventDefault() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isImmediatePropagationStopped': function() {\n    /// <summary>Returns whether event.stopImmediatePropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isPropagationStopped': function() {\n    /// <summary>Returns whether event.stopPropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'metaKey': function() {\n    /// <summary>Indicates whether the META key was pressed when the event fired.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'namespace': function() {\n    /// <summary>The namespace specified when the event was triggered.</summary>\n    /// <returns type=\"String\" />\n  },\n  'pageX': function() {\n    /// <summary>The mouse position relative to the left edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'pageY': function() {\n    /// <summary>The mouse position relative to the top edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'preventDefault': function() {\n    /// <summary>If this method is called, the default action of the event will not be triggered.</summary>\n  },\n  'relatedTarget': function() {\n    /// <summary>The other DOM element involved in the event, if any.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'result': function() {\n    /// <summary>The last value returned by an event handler that was triggered by this event, unless the value was undefined.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'stopImmediatePropagation': function() {\n    /// <summary>Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree.</summary>\n  },\n  'stopPropagation': function() {\n    /// <summary>Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.</summary>\n  },\n  'target': function() {\n    /// <summary>The DOM element that initiated the event.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'timeStamp': function() {\n    /// <summary>The difference in milliseconds between the time the browser created the event and January 1, 1970.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'type': function() {\n    /// <summary>Describes the nature of the event.</summary>\n    /// <returns type=\"String\" />\n  },\n  'which': function() {\n    /// <summary>For key or mouse events, this property indicates the specific key or button that was pressed.</summary>\n    /// <returns type=\"Number\" />\n  },\n});\n\nintellisense.annotate(jQuery.fn, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"html\" type=\"String\">An HTML fragment to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery object \">An existing jQuery object to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <param name=\"context\" type=\"Element\">The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addBack': function() {\n    /// <signature>\n    ///   <summary>Add the previous set of elements on the stack to the current set, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addClass': function() {\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be added to the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"function(index, currentClass)\" type=\"Function\">A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'after': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxComplete': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete. This is an AjaxEvent.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxError': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxSettings, thrownError)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSend': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed before an Ajax request is sent. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStart': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when the first Ajax request begins. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStop': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when all Ajax requests have completed. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSuccess': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'all': function() {\n    /// <summary>Selects all elements.</summary>\n  },\n  'andSelf': function() {\n    /// <summary>Add the previous set of elements on the stack to the current set.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'animate': function() {\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'animated': function() {\n    /// <summary>Select all elements that are in the progress of an animation at the time the selector is run.</summary>\n  },\n  'append': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'appendTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the end of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attr': function() {\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the attribute.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributes\" type=\"PlainObject\">An object of attribute-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"function(index, attr)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attributeContains': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing the a given substring.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsPrefix': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-).</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsWord': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing a given word, delimited by spaces.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEndsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEquals': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value exactly equal to a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeHas': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute, with any value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    /// </signature>\n  },\n  'attributeMultiple': function() {\n    /// <signature>\n    ///   <summary>Matches elements that match all of the specified attribute filters.</summary>\n    ///   <param name=\"attributeFilter1\" type=\"String\">An attribute filter.</param>\n    ///   <param name=\"attributeFilter2\" type=\"String\">Another attribute filter, reducing the selection even more</param>\n    ///   <param name=\"attributeFilterN\" type=\"String\">As many more attribute filters as necessary</param>\n    /// </signature>\n  },\n  'attributeNotEqual': function() {\n    /// <signature>\n    ///   <summary>Select elements that either don't have the specified attribute, or do have the specified attribute but not with a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeStartsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value beginning exactly with a given string.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'before': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert before each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'bind': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"preventBubble\" type=\"Boolean\">Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"events\" type=\"Object\">An object containing one or more DOM event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'blur': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'button': function() {\n    /// <summary>Selects all button elements and elements of type button.</summary>\n  },\n  'change': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'checkbox': function() {\n    /// <summary>Selects all elements of type checkbox.</summary>\n  },\n  'checked': function() {\n    /// <summary>Matches all elements that are checked.</summary>\n  },\n  'child': function() {\n    /// <signature>\n    ///   <summary>Selects all direct child elements specified by \"child\" of elements specified by \"parent\".</summary>\n    ///   <param name=\"parent\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"child\" type=\"String\">A selector to filter the child elements.</param>\n    /// </signature>\n  },\n  'children': function() {\n    /// <signature>\n    ///   <summary>Get the children of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'class': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given class.</summary>\n    ///   <param name=\"class\" type=\"String\">A class to search for. An element can have multiple classes; only one of them must match.</param>\n    /// </signature>\n  },\n  'clearQueue': function() {\n    /// <signature>\n    ///   <summary>Remove from the queue all items that have not yet been run.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'click': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'clone': function() {\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers should be copied along with the elements. As of jQuery 1.4, element data will be copied as well.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back to false in 1.5.1 and up.</param>\n    ///   <param name=\"deepWithDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'closest': function() {\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <param name=\"context\" type=\"Element\">A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Select all elements that contain the specified text.</summary>\n    ///   <param name=\"text\" type=\"String\">A string of text to look for. It's case sensitive.</param>\n    /// </signature>\n  },\n  'contents': function() {\n    /// <summary>Get the children of each element in the set of matched elements, including text and comment nodes.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'context': function() {\n    /// <summary>The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'css': function() {\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"key\" type=\"String\">A string naming the piece of data to set.</param>\n    ///   <param name=\"value\" type=\"Object\">The new data value; it can be any Javascript type including Array or Object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An object of key-value pairs of data to update.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dblclick': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delay': function() {\n    /// <signature>\n    ///   <summary>Set a timer to delay execution of subsequent items in the queue.</summary>\n    ///   <param name=\"duration\" type=\"Number\">An integer indicating the number of milliseconds to delay execution of the next item in the queue.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delegate': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched elements.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'descendant': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are descendants of a given ancestor.</summary>\n    ///   <param name=\"ancestor\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"descendant\" type=\"String\">A selector to filter the descendant elements.</param>\n    /// </signature>\n  },\n  'detach': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'die': function() {\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or keydown.</param>\n    ///   <param name=\"handler\" type=\"String\">The function that is no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types, such as click or keydown and their corresponding functions that are no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'disabled': function() {\n    /// <summary>Selects all elements that are disabled.</summary>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>Iterate over a jQuery object, executing a function for each matched element.</summary>\n    ///   <param name=\"function(index, Element)\" type=\"Function\">A function to execute for each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'element': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given tag name.</summary>\n    ///   <param name=\"element\" type=\"String\">An element to search for. Refers to the tagName of DOM nodes.</param>\n    /// </signature>\n  },\n  'empty': function() {\n    /// <summary>Select all elements that have no children (including text nodes).</summary>\n  },\n  'enabled': function() {\n    /// <summary>Selects all elements that are enabled.</summary>\n  },\n  'end': function() {\n    /// <summary>End the most recent filtering operation in the current chain and return the set of matched elements to its previous state.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'eq': function() {\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index of the element to match.</param>\n    /// </signature>\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"-index\" type=\"Number\">Zero-based index of the element to match, counting backwards from the last element.</param>\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'even': function() {\n    /// <summary>Selects even elements, zero-indexed.  See also odd.</summary>\n  },\n  'fadeIn': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeOut': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeTo': function() {\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'file': function() {\n    /// <summary>Selects all elements of type file.</summary>\n  },\n  'filter': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'find': function() {\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'finish': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'first': function() {\n    /// <summary>Selects the first matched element.</summary>\n  },\n  'first-child': function() {\n    /// <summary>Selects all elements that are the first child of their parent.</summary>\n  },\n  'first-of-type': function() {\n    /// <summary>Selects all elements that are the first among siblings of the same element name.</summary>\n  },\n  'focus': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusin': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Retrieve the DOM elements matched by the jQuery object.</summary>\n    ///   <param name=\"index\" type=\"Number\">A zero-based integer indicating which element to retrieve.</param>\n    ///   <returns type=\"Element, Array\" />\n    /// </signature>\n  },\n  'gt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index greater than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"contained\" type=\"Element\">A DOM element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hasClass': function() {\n    /// <signature>\n    ///   <summary>Determine whether any of the matched elements are assigned the given class.</summary>\n    ///   <param name=\"className\" type=\"String\">The class name to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'header': function() {\n    /// <summary>Selects all elements that are headers, like h1, h2, h3 and so on.</summary>\n  },\n  'height': function() {\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"function(index, height)\" type=\"Function\">A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hidden': function() {\n    /// <summary>Selects all elements that are hidden.</summary>\n  },\n  'hide': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hover': function() {\n    /// <signature>\n    ///   <summary>Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements.</summary>\n    ///   <param name=\"handlerIn(eventObject)\" type=\"Function\">A function to execute when the mouse pointer enters the element.</param>\n    ///   <param name=\"handlerOut(eventObject)\" type=\"Function\">A function to execute when the mouse pointer leaves the element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'html': function() {\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"htmlString\" type=\"String\">A string of HTML to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, oldhtml)\" type=\"Function\">A function returning the HTML content to set. Receives the           index position of the element in the set and the old HTML value as arguments.           jQuery empties the element before calling the function;           use the oldhtml argument to reference the previous content.           Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'id': function() {\n    /// <signature>\n    ///   <summary>Selects a single element with the given id attribute.</summary>\n    ///   <param name=\"id\" type=\"String\">An ID to search for, specified via the id attribute of an element.</param>\n    /// </signature>\n  },\n  'image': function() {\n    /// <summary>Selects all elements of type image.</summary>\n  },\n  'index': function() {\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector representing a jQuery collection in which to look for an element.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"element\" type=\"jQuery\">The DOM element or first element within the jQuery object to look for.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'init': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'innerHeight': function() {\n    /// <summary>Get the current computed height for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'innerWidth': function() {\n    /// <summary>Get the current computed width for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'input': function() {\n    /// <summary>Selects all input, textarea, select and button elements.</summary>\n  },\n  'insertAfter': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements after the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'insertBefore': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements before the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'is': function() {\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'jquery': function() {\n    /// <summary>A string containing the jQuery version number.</summary>\n    /// <returns type=\"String\" />\n  },\n  'keydown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keypress': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keyup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lang': function() {\n    /// <signature>\n    ///   <summary>Selects all elements of the specified language.</summary>\n    ///   <param name=\"language\" type=\"String\">A language code.</param>\n    /// </signature>\n  },\n  'last': function() {\n    /// <summary>Selects the last matched element.</summary>\n  },\n  'last-child': function() {\n    /// <summary>Selects all elements that are the last child of their parent.</summary>\n  },\n  'last-of-type': function() {\n    /// <summary>Selects all elements that are the last among siblings of the same element name.</summary>\n  },\n  'length': function() {\n    /// <summary>The number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'live': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more JavaScript event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'load': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index less than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Pass each element in the current matched set through a function, producing a new jQuery object containing the return values.</summary>\n    ///   <param name=\"callback(index, domElement)\" type=\"Function\">A function object that will be invoked for each element in the current set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousedown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseenter': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseleave': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousemove': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseover': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'multiple': function() {\n    /// <signature>\n    ///   <summary>Selects the combined results of all the specified selectors.</summary>\n    ///   <param name=\"selector1\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"selector2\" type=\"String\">Another valid selector.</param>\n    ///   <param name=\"selectorN\" type=\"String\">As many more valid selectors as you like.</param>\n    /// </signature>\n  },\n  'next': function() {\n    /// <signature>\n    ///   <summary>Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'next adjacent': function() {\n    /// <signature>\n    ///   <summary>Selects all next elements matching \"next\" that are immediately preceded by a sibling \"prev\".</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"next\" type=\"String\">A selector to match the element that is next to the first selector.</param>\n    /// </signature>\n  },\n  'next siblings': function() {\n    /// <signature>\n    ///   <summary>Selects all sibling elements that follow after the \"prev\" element, have the same parent, and match the filtering \"siblings\" selector.</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"siblings\" type=\"String\">A selector to filter elements that are the following siblings of the first selector.</param>\n    /// </signature>\n  },\n  'nextAll': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nextUntil': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'not': function() {\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more DOM elements to remove from the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nth-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-child(even), :nth-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-of-type(even), :nth-last-of-type(4n) )</param>\n    /// </signature>\n  },\n  'nth-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth child of their parent in relation to siblings with the same element name.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-of-type(even), :nth-of-type(4n) )</param>\n    /// </signature>\n  },\n  'odd': function() {\n    /// <summary>Selects odd elements, zero-indexed.  See also even.</summary>\n  },\n  'off': function() {\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, or just namespaces, such as \"click\", \"keydown.myPlugin\", or \".myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A handler function previously attached for the event(s), or the special value false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offset': function() {\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"coordinates\" type=\"PlainObject\">An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"function(index, coords)\" type=\"Function\">A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offsetParent': function() {\n    /// <summary>Get the closest ancestor element that is positioned.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'on': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'one': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing one or more JavaScript event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'only-child': function() {\n    /// <summary>Selects all elements that are the only child of their parent.</summary>\n  },\n  'only-of-type': function() {\n    /// <summary>Selects all elements that have no siblings with the same element name.</summary>\n  },\n  'outerHeight': function() {\n    /// <signature>\n    ///   <summary>Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without \"px\") representation of the value or null if called on an empty set of elements.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'outerWidth': function() {\n    /// <signature>\n    ///   <summary>Get the current computed width for the first element in the set of matched elements, including padding and border.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'parent': function() {\n    /// <signature>\n    ///   <summary>Get the parent of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parents': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parentsUntil': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'password': function() {\n    /// <summary>Selects all elements of type password.</summary>\n  },\n  'position': function() {\n    /// <summary>Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'prepend': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prependTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the beginning of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prev': function() {\n    /// <signature>\n    ///   <summary>Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevAll': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevUntil': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.</summary>\n    ///   <param name=\"type\" type=\"String\">The type of queue that needs to be observed.</param>\n    ///   <param name=\"target\" type=\"PlainObject\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'prop': function() {\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"value\" type=\"Boolean\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"function(index, oldPropertyValue)\" type=\"Function\">A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'pushStack': function() {\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <param name=\"name\" type=\"String\">The name of a jQuery method that generated the array of elements.</param>\n    ///   <param name=\"arguments\" type=\"Array\">The arguments that were passed in to the jQuery method (for serialization).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback( next )\" type=\"Function\">The new function to add to the queue, with a function to call that will dequeue the next item.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'radio': function() {\n    /// <summary>Selects all  elements of type radio.</summary>\n  },\n  'ready': function() {\n    /// <signature>\n    ///   <summary>Specify a function to execute when the DOM is fully loaded.</summary>\n    ///   <param name=\"handler\" type=\"Function\">A function to execute after the DOM is ready.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeAttr': function() {\n    /// <signature>\n    ///   <summary>Remove an attribute from each element in the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">An attribute to remove; as of version 1.7, it can be a space-separated list of attributes.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeClass': function() {\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be removed from the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, class)\" type=\"Function\">A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"list\" type=\"String\">An array or space-separated string naming the pieces of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeProp': function() {\n    /// <signature>\n    ///   <summary>Remove a property for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceAll': function() {\n    /// <signature>\n    ///   <summary>Replace each target element with the set of matched elements.</summary>\n    ///   <param name=\"target\" type=\"String\">A selector expression indicating which element(s) to replace.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceWith': function() {\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"newContent\" type=\"jQuery\">The content to insert. May be an HTML string, DOM element, or jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns content with which to replace the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'reset': function() {\n    /// <summary>Selects all elements of type reset.</summary>\n  },\n  'resize': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'root': function() {\n    /// <signature>\n    ///   <summary>Selects the element that is the root of the document.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'scroll': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollLeft': function() {\n    /// <signature>\n    ///   <summary>Set the current horizontal position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollTop': function() {\n    /// <signature>\n    ///   <summary>Set the current vertical position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'select': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'selected': function() {\n    /// <summary>Selects all elements that are selected.</summary>\n  },\n  'selector': function() {\n    /// <summary>A selector representing selector originally passed to jQuery().</summary>\n    /// <returns type=\"String\" />\n  },\n  'serialize': function() {\n    /// <summary>Encode a set of form elements as a string for submission.</summary>\n    /// <returns type=\"String\" />\n  },\n  'serializeArray': function() {\n    /// <summary>Encode a set of form elements as an array of names and values.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'show': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'siblings': function() {\n    /// <signature>\n    ///   <summary>Get the siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'size': function() {\n    /// <summary>Return the number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'slice': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to a subset specified by a range of indices.</summary>\n    ///   <param name=\"start\" type=\"Number\">An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set.</param>\n    ///   <param name=\"end\" type=\"Number\">An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideDown': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideUp': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'stop': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'submit': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'target': function() {\n    /// <summary>Selects the target element indicated by the fragment identifier of the document's URI.</summary>\n  },\n  'text': function() {\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"textString\" type=\"String\">A string of text to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"function(index, text)\" type=\"Function\">A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toArray': function() {\n    /// <summary>Retrieve all the DOM elements contained in the jQuery set, as an array.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'toggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"showOrHide\" type=\"Boolean\">A Boolean indicating whether to show or hide the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toggleClass': function() {\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"function(index, class, switch)\" type=\"Function\">A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'trigger': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"PlainObject\">Additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"event\" type=\"Event\">A jQuery.Event object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'triggerHandler': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers attached to an element for an event.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"Array\">An array of additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'unbind': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">The function that is to be no longer executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"false\" type=\"Boolean\">Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"event\" type=\"Object\">A JavaScript event object as passed to an event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'undelegate': function() {\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">An object of one or more event types and previously bound functions to unbind from them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"namespace\" type=\"String\">A string containing a namespace to unbind all events from.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unload': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">A plain object of data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unwrap': function() {\n    /// <summary>Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'val': function() {\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Array\">A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'visible': function() {\n    /// <summary>Selects all elements that are visible.</summary>\n  },\n  'width': function() {\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, width)\" type=\"Function\">A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrap': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapAll': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around all elements in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapInner': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"String\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\nintellisense.annotate(window, {\n  '$': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/jquery-1.10.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * jQuery JavaScript Library v1.10.2\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:48Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// Support: IE<10\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.10.2\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler\n\tcompleted = function( event ) {\n\n\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\t\tdetach();\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\t// Clean-up method for dom ready events\n\tdetach = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t\t} else {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\t\twindow.detachEvent( \"onload\", completed );\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( jQuery.support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn core_hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.10.2\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\n\t\t});\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val === undefined ?\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull :\n\t\tval;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function( support ) {\n\n\tvar all, a, input, select, fragment, opt, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Finish early in limited (non-browser) environments\n\tall = div.getElementsByTagName(\"*\") || [];\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !a || !a.style || !all.length ) {\n\t\treturn support;\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName(\"tbody\").length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName(\"link\").length;\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Make sure that element opacity exists\n\t// (IE uses filter instead)\n\t// Use a regex to work around a WebKit issue. See #5145\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!a.style.cssFloat;\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone = document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Will be defined later\n\tsupport.inlineBlockNeedsLayout = false;\n\tsupport.shrinkWrapBlocks = false;\n\tsupport.pixelPosition = false;\n\tsupport.deleteExpando = true;\n\tsupport.noCloneEvent = true;\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: IE<9\n\t// Iteration over object's inherited properties before its own.\n\tfor ( i in jQuery( support ) ) {\n\t\tbreak;\n\t}\n\tsupport.ownLast = i !== \"0\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior.\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t\t// Support: IE<8\n\t\t\t\tbody.style.zoom = 1;\n\t\t\t}\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})({});\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"applet\": true,\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\tdata = null,\n\t\t\ti = 0,\n\t\t\telem = this[0];\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf(\"data-\") === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar ret, hooks, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Use proper attribute retrieval(#6932, #12072)\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\telem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\t\tret = isXML ?\n\t\t\t\t\tundefined :\n\t\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\t\tnull;\n\t\t\tjQuery.expr.attrHandle[ name ] = fn;\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\tjQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =\n\t\t// Some attributes are constructed with empty-string values when not defined\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\t(ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t};\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ret.specified ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tcur = ret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\nvar iframe, getStyles, curCSS,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar len, styles,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Otherwise expose jQuery to the global object as usual\n\twindow.jQuery = window.$ = jQuery;\n\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n})( window );\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/modernizr-2.6.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton; http://www.modernizr.com/license/\n *\n * Includes matchMedia polyfill; Copyright (c) 2010 Filament Group, Inc; http://opensource.org/licenses/MIT\n *\n * Includes material adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js; Copyright 2009-2012 by contributors; http://opensource.org/licenses/MIT\n *\n * Includes material from css-support; Copyright (c) 2005-2012 Diego Perini; https://github.com/dperini/css-support/blob/master/LICENSE\n *\n * NUGET: END LICENSE TEXT */\n\n/*!\n * Modernizr v2.6.2\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.6.2',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node, docOverflow,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body || document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style id=\"s', mod, '\">', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = '';\n          //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n          fakeBody.style.overflow = 'hidden';\n          docOverflow = docElement.style.overflow;\n          docElement.style.overflow = 'hidden';\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      if ( !body ) {\n          fakeBody.parentNode.removeChild(fakeBody);\n          docElement.style.overflow = docOverflow;\n      } else {\n          div.parentNode.removeChild(div);\n      }\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq).matches;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProp = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n\n        if (typeof target != \"function\") {\n            throw new TypeError();\n        }\n\n        var args = slice.call(arguments, 1),\n            bound = function () {\n\n            if (this instanceof bound) {\n\n              var F = function(){};\n              F.prototype = target.prototype;\n              var self = new F();\n\n              var result = target.apply(\n                  self,\n                  args.concat(slice.call(arguments))\n              );\n              if (Object(result) === result) {\n                  return result;\n              }\n              return self;\n\n            } else {\n\n              return target.apply(\n                  that,\n                  args.concat(slice.call(arguments))\n              );\n\n            }\n\n        };\n\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    // Because the testing of the CSS property names (with \"-\", as\n    // opposed to the camelCase DOM properties) is non-portable and\n    // non-standard but works in WebKit and IE (but not Gecko or Opera),\n    // we explicitly reject properties with dashes so that authors\n    // developing in WebKit or IE first don't end up with\n    // browser-specific content by accident.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            var prop = props[i];\n            if ( !contains(prop, \"-\") && mStyle[prop] !== undefined ) {\n                return prefixed == 'pfx' ? prop : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexWrap');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return (/(url\\s*\\(.*?){3}/).test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return (/^0.55$/).test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   daneden.me/2011/12/putting-up-with-androids-bullshit/\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1) +\n             // standard syntax             // trailing 'background-image:'\n              prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.getElementById('smodernizr'),\n              sheet = style.sheet || style.styleSheet,\n              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:\"',smile,'\";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 3;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProp(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProp( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (typeof enableClasses !== \"undefined\" && enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n    ;(function(window, document) {\n    /*jshint evil:true */\n      /** Preset options */\n      var options = window.html5 || {};\n\n      /** Used to skip problem elements */\n      var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n      /** Not all elements can be cloned in IE **/\n      var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n      /** Detect whether the browser supports default html5 styles */\n      var supportsHtml5Styles;\n\n      /** Name of the expando, to work with multiple documents or to re-shiv one document */\n      var expando = '_html5shiv';\n\n      /** The id for the the documents expando */\n      var expanID = 0;\n\n      /** Cached data for each document */\n      var expandoData = {};\n\n      /** Detect whether the browser supports unknown elements */\n      var supportsUnknownElements;\n\n      (function() {\n        try {\n            var a = document.createElement('a');\n            a.innerHTML = '<xyz></xyz>';\n            //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n            supportsHtml5Styles = ('hidden' in a);\n\n            supportsUnknownElements = a.childNodes.length == 1 || (function() {\n              // assign a false positive if unable to shiv\n              (document.createElement)('a');\n              var frag = document.createDocumentFragment();\n              return (\n                typeof frag.cloneNode == 'undefined' ||\n                typeof frag.createDocumentFragment == 'undefined' ||\n                typeof frag.createElement == 'undefined'\n              );\n            }());\n        } catch(e) {\n          supportsHtml5Styles = true;\n          supportsUnknownElements = true;\n        }\n\n      }());\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n\n        /**\n       * Returns the data associated to the given document\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @returns {Object} An object of data.\n       */\n      function getExpandoData(ownerDocument) {\n        var data = expandoData[ownerDocument[expando]];\n        if (!data) {\n            data = {};\n            expanID++;\n            ownerDocument[expando] = expanID;\n            expandoData[expanID] = data;\n        }\n        return data;\n      }\n\n      /**\n       * returns a shived element for the given nodeName and document\n       * @memberOf html5\n       * @param {String} nodeName name of the element\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived element.\n       */\n      function createElement(nodeName, ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createElement(nodeName);\n        }\n        if (!data) {\n            data = getExpandoData(ownerDocument);\n        }\n        var node;\n\n        if (data.cache[nodeName]) {\n            node = data.cache[nodeName].cloneNode();\n        } else if (saveClones.test(nodeName)) {\n            node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n        } else {\n            node = data.createElem(nodeName);\n        }\n\n        // Avoid adding some elements to fragments in IE < 9 because\n        // * Attributes like `name` or `type` cannot be set/changed once an element\n        //   is inserted into a document/fragment\n        // * Link elements with `src` attributes that are inaccessible, as with\n        //   a 403 response, will cause the tab/window to crash\n        // * Script elements appended to fragments will execute when their `src`\n        //   or `text` property is set\n        return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;\n      }\n\n      /**\n       * returns a shived DocumentFragment for the given document\n       * @memberOf html5\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived DocumentFragment.\n       */\n      function createDocumentFragment(ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createDocumentFragment();\n        }\n        data = data || getExpandoData(ownerDocument);\n        var clone = data.frag.cloneNode(),\n            i = 0,\n            elems = getElements(),\n            l = elems.length;\n        for(;i<l;i++){\n            clone.createElement(elems[i]);\n        }\n        return clone;\n      }\n\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       * @param {Object} data of the document.\n       */\n      function shivMethods(ownerDocument, data) {\n        if (!data.cache) {\n            data.cache = {};\n            data.createElem = ownerDocument.createElement;\n            data.createFrag = ownerDocument.createDocumentFragment;\n            data.frag = data.createFrag();\n        }\n\n\n        ownerDocument.createElement = function(nodeName) {\n          //abort shiv\n          if (!html5.shivMethods) {\n              return data.createElem(nodeName);\n          }\n          return createElement(nodeName, ownerDocument, data);\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n          'var n=f.cloneNode(),c=n.createElement;' +\n          'h.shivMethods&&(' +\n            // unroll the `createElement` calls\n            getElements().join().replace(/\\w+/g, function(nodeName) {\n              data.createElem(nodeName);\n              data.frag.createElement(nodeName);\n              return 'c(\"' + nodeName + '\")';\n            }) +\n          ');return n}'\n        )(html5, data.frag);\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n      function shivDocument(ownerDocument) {\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        var data = getExpandoData(ownerDocument);\n\n        if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n          data.hasCSS = !!addStyleSheet(ownerDocument,\n            // corrects block display not defined in IE6/7/8/9\n            'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +\n            // adds styling not present in IE6/7/8/9\n            'mark{background:#FF0;color:#000}'\n          );\n        }\n        if (!supportsUnknownElements) {\n          shivMethods(ownerDocument, data);\n        }\n        return ownerDocument;\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n      var html5 = {\n\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': (options.shivCSS !== false),\n\n        /**\n         * Is equal to true if a browser supports creating unknown/HTML5 elements\n         * @memberOf html5\n         * @type boolean\n         */\n        'supportsUnknownElements': supportsUnknownElements,\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': (options.shivMethods !== false),\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument,\n\n        //creates a shived element\n        createElement: createElement,\n\n        //creates a shived documentFragment\n        createDocumentFragment: createDocumentFragment\n      };\n\n      /*--------------------------------------------------------------------------*/\n\n      // expose html5\n      window.html5 = html5;\n\n      // shiv the document\n      shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Scripts/respond.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\nwindow.matchMedia = window.matchMedia || (function(doc, undefined){\n  \n  var bool,\n      docElem  = doc.documentElement,\n      refNode  = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement('body'),\n      div      = doc.createElement('div');\n  \n  div.id = 'mq-test-1';\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n  \n  return function(q){\n    \n    div.innerHTML = '&shy;<style media=\"'+q+'\"> #mq-test-1 { width: 42px; }</style>';\n    \n    docElem.insertBefore(fakeBody, refNode);\n    bool = div.offsetWidth == 42;  \n    docElem.removeChild(fakeBody);\n    \n    return { matches: bool, media: q };\n  };\n  \n})(document);\n\n\n\n\n/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\t//exposed namespace\n\twin.respond\t\t= {};\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update\t= function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){ return; }\n\t\n\t//define vars\n\tvar doc \t\t\t= win.document,\n\t\tdocElem \t\t= doc.documentElement,\n\t\tmediastyles\t\t= [],\n\t\trules\t\t\t= [],\n\t\tappendedEls \t= [],\n\t\tparsedSheets \t= {},\n\t\tresizeThrottle\t= 30,\n\t\thead \t\t\t= doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase\t\t\t= doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks\t\t\t= head.getElementsByTagName( \"link\" ),\n\t\trequestQueue\t= [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS\t\t\t= function(){\n\t\t\tvar sheets \t= links,\n\t\t\t\tsl \t\t= sheets.length,\n\t\t\t\ti\t\t= 0,\n\t\t\t\t//vars for loop:\n\t\t\t\tsheet, href, media, isCSS;\n\n\t\t\tfor( ; i < sl; i++ ){\n\t\t\t\tsheet\t= sheets[ i ],\n\t\t\t\thref\t= sheet.href,\n\t\t\t\tmedia\t= sheet.media,\n\t\t\t\tisCSS\t= sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base)\n\t\t\t\t\t\t\t|| href.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\t\t\t\t\tmakeRequests();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate\t\t\t= function( styles, href, media ){\n\t\t\tvar qs\t\t\t= styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql\t\t\t= qs && qs.length || 0,\n\t\t\t\t//try to get CSS path\n\t\t\t\thref\t\t= href.substring( 0, href.lastIndexOf( \"/\" )),\n\t\t\t\trepUrls\t\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia\t= !ql && media,\n\t\t\t\t//vars used in loop\n\t\t\t\ti\t\t\t= 0,\n\t\t\t\tj, fullq, thisq, eachq, eql;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\t\t\t\n\n\t\t\tfor( ; i < ql; i++ ){\n\t\t\t\tj\t= 0;\n\t\t\t\t\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq\t= qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq\t= fullq.split( \",\" );\n\t\t\t\teql\t\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( ; j < eql; j++ ){\n\t\t\t\t\tthisq\t= eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia\t: thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules\t: rules.length - 1,\n\t\t\t\t\t\thasquery: thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw\t: thisq.match( /\\(min\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw\t: thisq.match( /\\(max\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \t\n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue\t\t= function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia\t\t\t= function( fromResize ){\n\t\t\tvar name\t\t= \"clientWidth\",\n\t\t\t\tdocElemProp\t= docElem[ name ],\n\t\t\t\tcurrWidth \t= doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink\t= links[ links.length-1 ],\n\t\t\t\tnow \t\t= (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\tclearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall\t= now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\tminnull = min === null,\n\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\tem = \"em\";\n\t\t\t\t\n\t\t\t\tif( !!min ){\n\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\tif( !!max ){\n\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var i in appendedEls ){\n\t\t\t\tif( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){\n\t\t\t\t\thead.removeChild( appendedEls[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var i in styleBlocks ){\n\t\t\t\tvar ss\t\t= doc.createElement( \"style\" ),\n\t\t\t\t\tcss\t\t= styleBlocks[ i ].join( \"\\n\" );\n\t\t\t\t\n\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\tss.media\t= i;\n\t\t\t\t\n\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\n\t\t\t\tif ( ss.styleSheet ){ \n\t\t        \tss.styleSheet.cssText = css;\n\t\t        } \n\t\t        else {\n\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t        }\n\t\t        \n\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\tappendedEls.push( ss );\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState != 4 || req.status != 200 && req.status != 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t}\n\t\t\tif ( req.readyState == 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx",
    "content": "﻿<%@ Page Title=\"Sign Up\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"SignUp.aspx.cs\" Inherits=\"ProductLaunch.Web.SignUp\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Sign me up!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Just a few details</h2>\n        </div>\n    </div>\n\n    <div class=\"form-group\">\n        <label for=\"txtFirstName\">First Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtFirstName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtLastName\">Last Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtLastName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtEmail\">Email Address</label>\n        <asp:TextBox class=\"form-control\" id=\"txtEmail\" runat=\"server\" />\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlCountry\">Country</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlCountry\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"txtCompanyName\">Company Name</label>\n        <asp:TextBox class=\"form-control\" id=\"txtCompanyName\" runat=\"server\"/>\n    </div>\n    <div class=\"form-group\">\n        <label for=\"ddlRole\">Your Main Role</label>\n        <asp:DropDownList class=\"form-control\" id=\"ddlRole\" runat=\"server\" />\n    </div>\n\n    <asp:Button class=\"btn btn-default\" runat=\"server\" Text=\"Go!\" ID=\"btnGo\" OnClick=\"btnGo_Click\" />\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.cs",
    "content": "﻿using ProductLaunch.Entities;\nusing ProductLaunch.Messaging;\nusing ProductLaunch.Messaging.Messages.Events;\nusing ProductLaunch.Model;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SignUp : Page\n    {\n        private static Dictionary<string, Country> _Countries;\n        private static Dictionary<string, Role> _Roles;\n\n        public static void PreloadStaticDataCache()\n        {\n            _Countries = new Dictionary<string, Country>();\n            _Roles = new Dictionary<string, Role>();\n            using (var context = new ProductLaunchContext())\n            {\n                foreach (var country in context.Countries.OrderBy(x => x.CountryName))\n                {\n                    _Countries[country.CountryCode] = country;\n                }\n                foreach (var role in context.Roles.OrderBy(x => x.RoleName))\n                {\n                    _Roles[role.RoleCode] = role;\n                }\n            }\n        }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            if (!Page.IsPostBack)\n            {\n                PopulateRoles();\n                PopulateCountries();\n            }\n        }\n\n        private void PopulateRoles()\n        {\n            ddlRole.Items.Clear();\n            ddlRole.Items.AddRange(_Roles.Select(x => new ListItem(x.Value.RoleName, x.Key)).ToArray()); \n        }\n\n        private void PopulateCountries()\n        {\n            ddlCountry.Items.Clear();\n            ddlCountry.Items.AddRange(_Countries.Select(x => new ListItem(x.Value.CountryName, x.Key)).ToArray());\n        }\n\n        protected void btnGo_Click(object sender, EventArgs e)\n        {\n            var country = _Countries[ddlCountry.SelectedValue];\n            var role = _Roles[ddlRole.SelectedValue];\n\n            var prospect = new Prospect\n            {\n                CompanyName = txtCompanyName.Text,\n                EmailAddress = txtEmail.Text,\n                FirstName = txtFirstName.Text,\n                LastName = txtLastName.Text,\n                Country = country,\n                Role = role\n            };\n\n            var eventMessage = new ProspectSignedUpEvent\n            {\n                Prospect = prospect,\n                SignedUpAt = DateTime.UtcNow\n            };\n\n            MessageQueue.Publish(eventMessage);\n\n            Server.Transfer(\"ThankYou.aspx\");\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/SignUp.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SignUp {\n        \n        /// <summary>\n        /// txtFirstName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtFirstName;\n        \n        /// <summary>\n        /// txtLastName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtLastName;\n        \n        /// <summary>\n        /// txtEmail control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtEmail;\n        \n        /// <summary>\n        /// ddlCountry control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlCountry;\n        \n        /// <summary>\n        /// txtCompanyName control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.TextBox txtCompanyName;\n        \n        /// <summary>\n        /// ddlRole control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.DropDownList ddlRole;\n        \n        /// <summary>\n        /// btnGo control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.Button btnGo;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Site.Master",
    "content": "﻿<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.master.cs\" Inherits=\"ProductLaunch.Web.SiteMaster\" %>\n\n<!DOCTYPE html>\n\n<html lang=\"en\">\n<head runat=\"server\">\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title><%: Page.Title %></title>\n\n    <asp:PlaceHolder runat=\"server\">\n        <%: Scripts.Render(\"~/bundles/modernizr\") %>\n    </asp:PlaceHolder>\n\n    <webopt:bundlereference runat=\"server\" path=\"~/Content/css\" />\n    <link href=\"~/favicon.ico\" rel=\"shortcut icon\" type=\"image/x-icon\" />\n\n</head>\n<body>\n    <form runat=\"server\">\n        <asp:ScriptManager runat=\"server\">\n            <Scripts>\n                <%--To learn more about bundling scripts in ScriptManager see http://go.microsoft.com/fwlink/?LinkID=301884 --%>\n                <%--Framework Scripts--%>\n                <asp:ScriptReference Name=\"MsAjaxBundle\" />\n                <asp:ScriptReference Name=\"jquery\" />\n                <asp:ScriptReference Name=\"bootstrap\" />\n                <asp:ScriptReference Name=\"respond\" />\n                <asp:ScriptReference Name=\"WebForms.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebForms.js\" />\n                <asp:ScriptReference Name=\"WebUIValidation.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebUIValidation.js\" />\n                <asp:ScriptReference Name=\"MenuStandards.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/MenuStandards.js\" />\n                <asp:ScriptReference Name=\"GridView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/GridView.js\" />\n                <asp:ScriptReference Name=\"DetailsView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/DetailsView.js\" />\n                <asp:ScriptReference Name=\"TreeView.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/TreeView.js\" />\n                <asp:ScriptReference Name=\"WebParts.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/WebParts.js\" />\n                <asp:ScriptReference Name=\"Focus.js\" Assembly=\"System.Web\" Path=\"~/Scripts/WebForms/Focus.js\" />\n                <asp:ScriptReference Name=\"WebFormsBundle\" />\n                <%--Site Scripts--%>\n            </Scripts>\n        </asp:ScriptManager>\n\n        <div class=\"container body-content\">\n            <asp:ContentPlaceHolder ID=\"MainContent\" runat=\"server\">\n            </asp:ContentPlaceHolder>\n            <hr />\n            <footer>\n                <p>&copy; <%: DateTime.Now.Year %> - Company, Inc.</p>\n            </footer>\n        </div>\n\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Site.Master.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class SiteMaster : MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Site.Master.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class SiteMaster {\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master",
    "content": "<%@ Master Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Site.Mobile.master.cs\" Inherits=\"ProductLaunch.Web.Site_Mobile\" %>\n<%@ Register Src=\"~/ViewSwitcher.ascx\" TagPrefix=\"friendlyUrls\" TagName=\"ViewSwitcher\" %>\n\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head runat=\"server\">\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title></title>\n    <asp:ContentPlaceHolder runat=\"server\" ID=\"HeadContent\" />\n</head>\n<body>\n    <form id=\"form1\" runat=\"server\">\n    <div>\n        <h1>Mobile Master Page</h1>\n        <asp:ContentPlaceHolder runat=\"server\" ID=\"FeaturedContent\" />\n        <section class=\"content-wrapper main-content clear-fix\">\n            <asp:ContentPlaceHolder runat=\"server\" ID=\"MainContent\" />\n        </section>\n        <friendlyUrls:ViewSwitcher runat=\"server\" />\n    </div>\n    </form>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class Site_Mobile : System.Web.UI.MasterPage\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Site.Mobile.Master.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class Site_Mobile {\n        \n        /// <summary>\n        /// HeadContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder HeadContent;\n        \n        /// <summary>\n        /// form1 control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.HtmlControls.HtmlForm form1;\n        \n        /// <summary>\n        /// FeaturedContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder FeaturedContent;\n        \n        /// <summary>\n        /// MainContent control.\n        /// </summary>\n        /// <remarks>\n        /// Auto-generated field.\n        /// To modify move field declaration from designer file to code-behind file.\n        /// </remarks>\n        protected global::System.Web.UI.WebControls.ContentPlaceHolder MainContent;\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx",
    "content": "﻿<%@ Page Title=\"Ta\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" CodeBehind=\"ThankYou.aspx.cs\" Inherits=\"ProductLaunch.Web.ThankYou\" %>\n\n<asp:Content ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\" runat=\"server\">\n\n    <div class=\"jumbotron\">\n        <h1>Thank you!</h1>\n    </div>\n\n    <div class=\"row\">\n        <div class=\"col-md-12\">\n            <h2>Good work on signing up. We'll be in touch.</h2>\n        </div>\n    </div>\n\n</asp:Content>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ThankYou : System.Web.UI.Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/ThankYou.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ThankYou {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx",
    "content": "<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"ViewSwitcher.ascx.cs\" Inherits=\"ProductLaunch.Web.ViewSwitcher\" %>\n<div id=\"viewSwitcher\">\n    <%: CurrentView %> view | <a href=\"<%: SwitchUrl %>\" data-ajax=\"false\">Switch to <%: AlternateView %></a>\n</div>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Routing;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\nusing Microsoft.AspNet.FriendlyUrls.Resolvers;\n\nnamespace ProductLaunch.Web\n{\n    public partial class ViewSwitcher : System.Web.UI.UserControl\n    {\n        protected string CurrentView { get; private set; }\n\n        protected string AlternateView { get; private set; }\n\n        protected string SwitchUrl { get; private set; }\n\n        protected void Page_Load(object sender, EventArgs e)\n        {\n            // Determine current view\n            var isMobile = WebFormsFriendlyUrlResolver.IsMobileView(new HttpContextWrapper(Context));\n            CurrentView = isMobile ? \"Mobile\" : \"Desktop\";\n\n            // Determine alternate view\n            AlternateView = isMobile ? \"Desktop\" : \"Mobile\";\n\n            // Create switch URL from the route, e.g. ~/__FriendlyUrls_SwitchView/Mobile?ReturnUrl=/Page\n            var switchViewRouteName = \"AspNet.FriendlyUrls.SwitchView\";\n            var switchViewRoute = RouteTable.Routes[switchViewRouteName];\n            if (switchViewRoute == null)\n            {\n                // Friendly URLs is not enabled or the name of the switch view route is out of sync\n                this.Visible = false;\n                return;\n            }\n            var url = GetRouteUrl(switchViewRouteName, new { view = AlternateView, __FriendlyUrls_SwitchViews = true });\n            url += \"?ReturnUrl=\" + HttpUtility.UrlEncode(Request.RawUrl);\n            SwitchUrl = url;\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/ViewSwitcher.ascx.designer.cs",
    "content": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace ProductLaunch.Web {\n    \n    \n    public partial class ViewSwitcher {\n    }\n}\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\" />\n    <customErrors mode=\"Off\"/>\n    <httpRuntime targetFramework=\"4.5.2\" />\n    <pages>\n      <namespaces>\n        <add namespace=\"System.Web.Optimization\" />\n      </namespaces>\n      <controls>\n        <add assembly=\"Microsoft.AspNet.Web.Optimization.WebForms\" namespace=\"Microsoft.AspNet.Web.Optimization.WebForms\" tagPrefix=\"webopt\" />\n      </controls>\n    </pages>     \n  </system.web>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"WebGrease\" culture=\"neutral\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.5.2.14234\" newVersion=\"1.5.2.14234\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\" />\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.Web/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Antlr\" version=\"3.4.1.9004\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.bootstrap\" version=\"3.0.0\" targetFramework=\"net452\" />\n  <package id=\"AspNet.ScriptManager.jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"bootstrap\" version=<\"3.4.1\" targetFramework=\"net452\" />\n  <package id=\"EntityFramework\" version=\"4.3.1\" targetFramework=\"net452\" />\n  <package id=\"jQuery\" version=\"1.10.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.FriendlyUrls.Core\" version=\"1.0.2\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.MSAjax\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.ScriptManager.WebForms\" version=\"5.0.0\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization.WebForms\" version=\"1.1.3\" targetFramework=\"net452\" />\n  <package id=\"Microsoft.Web.Infrastructure\" version=\"1.0.0.0\" targetFramework=\"net452\" />\n  <package id=\"Modernizr\" version=\"2.6.2\" targetFramework=\"net452\" />\n  <package id=\"NATS.Client\" version=\"0.7.0\" targetFramework=\"net452\" />\n  <package id=\"Newtonsoft.Json\" version=\"6.0.4\" targetFramework=\"net452\" />\n  <package id=\"Respond\" version=\"1.2.0\" targetFramework=\"net452\" />\n  <package id=\"WebGrease\" version=\"1.5.2\" targetFramework=\"net452\" />\n</packages>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/ProductLaunch.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Web\", \"ProductLaunch.Web\\ProductLaunch.Web.csproj\", \"{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model\", \"ProductLaunch.Model\\ProductLaunch.Model.csproj\", \"{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Entities\", \"ProductLaunch.Entities\\ProductLaunch.Entities.csproj\", \"{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Tests\", \"Tests\", \"{4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Model.Tests\", \"ProductLaunch.Model.Tests\\ProductLaunch.Model.Tests.csproj\", \"{49FD06C3-CD52-425A-866D-831D09268CD0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.MessageHandlers.SaveProspect\", \"ProductLaunch.MessageHandlers.SaveProspect\\ProductLaunch.MessageHandlers.SaveProspect.csproj\", \"{65089C80-27F1-4744-979B-4C5A33B0CFF6}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.Messaging\", \"ProductLaunch.Messaging\\ProductLaunch.Messaging.csproj\", \"{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"MessageHandlers\", \"MessageHandlers\", \"{C7DDB104-252C-499C-A144-242DCC2CF946}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.MessageHandlers.IndexProspect\", \"ProductLaunch.MessageHandlers.IndexProspect\\ProductLaunch.MessageHandlers.IndexProspect.csproj\", \"{1354B5AB-C990-41EA-9F68-5F9933D83700}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProductLaunch.EndToEndTests\", \"ProductLaunch.EndToEndTests\\ProductLaunch.EndToEndTests.csproj\", \"{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{17A57CF4-A6C1-47C1-AA38-650DB6D87F8F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3AFC4A48-5DB6-48FF-A459-20EC21A2EB28}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F1BBB80F-EB0C-41B6-A7A9-7994FB3FE5E8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E02EFF91-8C52-4DCE-8279-3FD1EE0659EF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1354B5AB-C990-41EA-9F68-5F9933D83700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1354B5AB-C990-41EA-9F68-5F9933D83700}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1354B5AB-C990-41EA-9F68-5F9933D83700}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1354B5AB-C990-41EA-9F68-5F9933D83700}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{49FD06C3-CD52-425A-866D-831D09268CD0} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\t\t{65089C80-27F1-4744-979B-4C5A33B0CFF6} = {C7DDB104-252C-499C-A144-242DCC2CF946}\n\t\t{1354B5AB-C990-41EA-9F68-5F9933D83700} = {C7DDB104-252C-499C-A144-242DCC2CF946}\n\t\t{D47CF813-DE0E-4CC4-B9ED-8EE4B6F14869} = {4AAE4C5C-129D-46D3-9B08-19F32FB8C60D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/ProductLaunch/build.ps1",
    "content": "$nuGetPath = \"C:\\Chocolatey\\bin\\nuget.bat\"\n$msBuildPath = \"C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe\"\n\ncd c:\\src\n& $nuGetPath restore .\\ProductLaunch.sln\n\n# publish web app:\n& $msBuildPath .\\ProductLaunch.Web\\ProductLaunch.Web.csproj /p:OutputPath=c:\\out\\web\\ProductLaunchWeb /p:DeployOnBuild=true /p:VSToolsPath=C:\\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\\tools\\VSToolsPath\n\n# publish message handler:\n& $msBuildPath .\\ProductLaunch.MessageHandlers.SaveProspect\\ProductLaunch.MessageHandlers.SaveProspect.csproj /p:OutputPath=c:\\out\\save-prospect\\SaveProspectHandler\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/build.ps1",
    "content": "\ndocker build `\n -t dockersamples/modernize-aspnet-builder `\n $pwd\\docker\\builder\n\ndocker run --rm `\n -v $pwd\\ProductLaunch:c:\\src `\n -v $pwd\\docker:c:\\out `\n dockersamples/modernize-aspnet-builder `\n C:\\src\\build.ps1 \n\ndocker build `\n -t dockersamples/modernize-aspnet-web:v3 `\n $pwd\\docker\\web\n\n docker build `\n -t dockersamples/modernize-aspnet-handler:v3 `\n $pwd\\docker\\save-prospect\n\n docker build `\n  -t dockersamples/modernize-aspnet-homepage:v3 `\n  $pwd\\docker\\homepage"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/docker/builder/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 14.0.25420.1 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force; `\n    Install-Package -Name webdeploy -RequiredVersion 3.5.2 -Force\n\nRUN Install-Package -Name nuget.commandline -RequiredVersion 3.4.3 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install MSBuild.Microsoft.VisualStudio.Web.targets -Version 14.0.0.3\n\nENTRYPOINT [\"powershell\"]"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/docker/docker-compose.yml",
    "content": "version: '2'\n\nservices:\n  \n  product-launch-db:\n    image: microsoft/mssql-server-windows-express\n    ports:\n      - \"1433:1433\"\n    environment: \n      - ACCEPT_EULA=Y\n      - sa_password=NDC_l0nd0n\n    networks:\n      - app-net\n\n  message-queue:\n    image: sixeyed/nats:windowsservercore\n    ports:\n      - \"4222:4222\"\n    networks:\n      - app-net\n\n  elasticsearch:\n    image: sixeyed/elasticsearch:windowsservercore\n    ports:\n      - \"9200:9200\"\n    networks:\n      - app-net\n\n  kibana:\n    image: sixeyed/kibana:windowsservercore\n    ports:\n      - \"5601:5601\"\n    depends_on:\n      - elasticsearch\n    networks:\n      - app-net\n\n  homepage:\n    image: sixeyed/product-launch-homepage:v5\n    ports:\n      - \"81:80\"\n    networks:\n      - app-net\n\n  product-launch-web:\n    image: sixeyed/product-launch-web:v5\n    ports:\n      - \"80:80\"\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=NDC_l0nd0n;\n      - HOMEPAGE_URL=http://homepage\n    depends_on:\n      - homepage\n      - product-launch-db\n      - message-queue\n    networks:\n      - app-net\n\n  save-prospect-handler:\n    image: sixeyed/product-launch-save-handler:v5\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=NDC_l0nd0n;\n    depends_on:\n      - product-launch-db\n      - message-queue\n    networks:\n      - app-net\n\n  index-prospect-handler:\n    image: sixeyed/product-launch-index-handler:v5\n    depends_on:\n      - elasticsearch\n      - message-queue\n    networks:\n      - app-net\n\nnetworks:\n  app-net:\n    external:\n      name: nat"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/docker/homepage/Dockerfile",
    "content": "FROM microsoft/iis:windowsservercore-10.0.14393.693\nCOPY index.html c:/inetpub/wwwroot/index.html"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/docker/homepage/index.html",
    "content": "<html>\n    <head>\n        <title>We're launching something new...</title>\n        <script type=\"text/javascript\">\n  function blink() {\n    var blinks = document.getElementsByTagName('blink');\n    for (var i = blinks.length - 1; i >= 0; i--) {\n      var s = blinks[i];\n      s.style.visibility = (s.style.visibility === 'visible') ? 'hidden' : 'visible';\n    }\n    window.setTimeout(blink, 300);\n  }\n  if (document.addEventListener) document.addEventListener(\"DOMContentLoaded\", blink, false);\n  else if (window.addEventListener) window.addEventListener(\"load\", blink, false);\n  else if (window.attachEvent) window.attachEvent(\"onload\", blink);\n  else window.onload = blink;\n</script>\n    </head>\n    <body>\n        <div>\n        <marquee direction=\"down\" width=\"1500\" height=\"300\" behavior=\"alternate\" style=\"border:solid; font-size: 45pt; font-weight: bold; background-color: yellow\">\n             <marquee behavior=\"alternate\">\n                 WE'RE LAUNCHING SOMETHING NEW!\n             </marquee>\n        </marquee>\n        </div>\n        <br/>\n        <br/>\n        <div style=\"width: 1500px; height: 150px; border:solid; font-size: 45pt; font-weight: bold; background-color: blue; text-align: center;\">\n            <blink><a style=\"font-size: 30pt; font-weight: bold; color:aqua;\" href=\"/SignUp.aspx\">Register here for updates!<a></blink>\n        </div>\n    </body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/docker/save-prospect/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\n\nWORKDIR /save-prospect-handler\nENV MESSAGE_QUEUE_URL=\"nats://message-queue:4222\"\nENTRYPOINT [\"C:\\\\save-prospect-handler\\\\ProductLaunch.MessageHandlers.SaveProspect.exe\"]\n\nCOPY SaveProspectHandler ."
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/docker/web/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Set-ItemProperty -path 'HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Dnscache\\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord\nRUN Add-WindowsFeature Web-server, NET-Framework-45-ASPNET, Web-Asp-Net45; `\n    Remove-Website -Name 'Default Web Site'    \n\nRUN New-Item -Path 'C:\\web-app' -Type Directory; `\n    New-Website -Name 'web-app' -PhysicalPath 'C:\\web-app' -Port 80 -Force\n\nEXPOSE 80\nENV MESSAGE_QUEUE_URL=\"nats://message-queue:4222\"\n\nWORKDIR C://\nADD https://github.com/Microsoft/iis-docker/raw/master/windowsservercore/ServiceMonitor.exe ./ServiceMonitor.exe\nCOPY bootstrap.ps1 .\nENTRYPOINT [\"powershell\", \"./bootstrap.ps1\"]\n\nCOPY ProductLaunchWeb/_PublishedWebsites/ProductLaunch.Web /web-app\n\nHEALTHCHECK CMD powershell -command `\n    try { `\n     $response = iwr http://localhost:80 -UseBasicParsing; `\n     if ($response.StatusCode -eq 200) { return 0} `\n     else {return 1}; `\n    } catch { return 1 }"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/docker/web/bootstrap.ps1",
    "content": "Write-Output 'Bootstrap starting'\n\n# copy process-level environment variables (from `docker run`) machine-wide\nforeach($key in [System.Environment]::GetEnvironmentVariables('Process').Keys) {\n    if ([System.Environment]::GetEnvironmentVariable($key, 'Machine') -eq $null) {\n        $value = [System.Environment]::GetEnvironmentVariable($key, 'Process')\n        [System.Environment]::SetEnvironmentVariable($key, $value, 'Machine')\n        Write-Output \"Set environment variable: $key\"\n    }\n}\n\nWrite-Output 'Running ServiceMonitor'\n& C:\\ServiceMonitor.exe w3svc"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet/v3-src/docker-compose.yml",
    "content": "version: '2'\n\nservices:\n  \n  product-launch-db:\n    image: microsoft/mssql-server-windows-express\n    ports:\n      - \"1433:1433\"\n    environment: \n      - ACCEPT_EULA=Y\n      - sa_password=d0ck3r_Labs!\n    networks:\n      - app-net\n\n  message-queue:\n    image: nats:windowsservercore\n    ports:\n      - \"4222:4222\"\n    networks:\n      - app-net\n\n  product-launch-homepage:\n    image: dockersamples/modernize-aspnet-homepage:v3 \n    ports:\n      - \"81:80\"\n    networks:\n      - app-net\n\n  product-launch-web:\n    image: dockersamples/modernize-aspnet-web:v3\n    ports:\n      - \"80:80\"\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\n      - HOMEPAGE_URL=http://product-launch-homepage\n    depends_on:\n      - product-launch-db\n      - message-queue\n      - product-launch-homepage\n    networks:\n      - app-net\n\n  save-prospect-handler:\n    image: dockersamples/modernize-aspnet-handler:v3\n    environment:\n      - DB_CONNECTION_STRING=Server=product-launch-db;Database=ProductLaunch;User Id=sa;Password=d0ck3r_Labs!;\n    depends_on:\n      - product-launch-db\n      - message-queue\n    networks:\n      - app-net\n\nnetworks:\n  app-net:\n    external:\n      name: nat"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n**/Properties/launchSettings.json\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/\n\n# output from Docker builds\ndocker/web/UpgradeSample.Web/"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/README.md",
    "content": "\n# Modernize ASP.NET Apps - Ops Lab\n\nYou'll already have a process for deploying ASP.NET apps, but it probably involves a lot of manual steps. Work like copying application content between servers, running interactive setup programs, modifying configuration items and manual smoke tests all add time and risk to deployments. \n\nIn Docker, the process of packaging applications is completely automated, and the platform supports automatic update and rollback for application deployments. You can build Docker images from your existing application artifacts, and run ASP.NET apps in containers without changing code.\n\nThis lab is aimed at ops and system admins. It steps through packaging an ASP.NET WebForms app to run in a Docker container on Windows 10 or Windows Server 2016. It starts with an MSI and ends by showing you how to package the application from source. You'll see how easy it is to start running applications in Docker, and the benefits you get from a modern application platform.\n\n## What You Will Learn\n\nIn this self-paced lab, you'll learn how to:\n\n- Package an existing ASP.NET MSI so the app runs in Docker, without any application changes.\n\n- Create an upgraded package with application updates and Windows patches.\n\n- Update and rollback the running application in a production environment with zero downtime.\n\n- Package an ASP.NET application from the source code without needing Visual Studio or MSBuild.\n\n## Prerequisites\n\nYou'll need Docker running on Windows. You can follow the [Windows Container Lab Setup](https://github.com/docker/labs/blob/master/windows/windows-containers/Setup.md) to install Docker on Windows 10, or Windows 2016 - locally, or on AWS or Azure.\n\nYou should be familiar with IIS and PowerShell, and with the key [Docker concepts](https://docs.docker.com/engine/understanding-docker/)\n\n## The Lab\n\n- [Part 1 - Packaging ASP.NET Apps as Docker Images](part-1.md)\n- [Part 2 - Upgrading Application Images](part-2.md)\n- [Part 3 - Zero-Downtime Update and Rollback](part-3.md)\n- [Part 4 - Packaging Applications From Source](part-4.md)"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/part-1.md",
    "content": "\n# Packaging ASP.NET Apps as Docker Images\n\nA Docker image packages your application and all the dependencies it needs to run into one unit. Microsoft maintain the [microsoft/aspnet](https://store.docker.com/images/aspnet) image on Docker Store, which you can use as the basis for your own application images. It is based on [microsoft/windowsservercore](https://store.docker.com/images/windowsservercore/) and has IIS and ASP.NET already installed. \n\nIn this lab I start with an MSI that deploys a web app onto a server and expects IIS and ASP.NET to be configured. If you already have a scripted build process then you may have MSIs or Web Deploy packages already being generated, and it's easy to package them into a Docker image.\n\n## Installing MSIs in Docker images\n\nHere's the whole Dockerfile for packaging my custom web application:\n\n```\nFROM microsoft/aspnet:windowsservercore-10.0.14393.576\n\nCOPY UpgradeSample-1.0.0.0.msi /\n\nRUN msiexec /i c:\\UpgradeSample-1.0.0.0.msi RELEASENAME=2017.02 /qn\n```\n\nIt's just three lines of script in the simple [Dockerfile syntax](https://docs.docker.com/engine/reference/builder/):\n\n- `FROM` specifies the base image to use as a starting point, in this case a specific version of the ASP.NET image\n- `COPY` copies the existing v1.0 application MSI from the local machine into the Docker image\n- `RUN` installs the MSI using `msiexec`, with the `qn` switch to install silently, and passing a value to the custom `RELEASENAME` variable that the MSI uses\n\n> Building Docker images is an automated process, there's no support for user input during the build. If you have an MSI which doesn't support unattended installation you'll need a different approach. That's covered in [Part 4](part-4.md).\n\n## Building the v1.0 Application Image\n\nEvery Docker image has a unique name, and you can also tag images with additional information like application version numbers. To build the image, switch to the directory containing the Dockerfile and MSI, and run `docker build`:\n\n```\ncd .\\v1.0\ndocker build -t dockersamples/modernize-aspnet-ops:1.0 .\n```\n\nThe output from `docker build` shows you the Docker engine executing all the steps in the Dockerfile. If you don't have a copy of Microsoft's ASP.NET image locally, then Docker starts by downloading it from Docker Store.\n\nWhen the build completes you'll have a new image stored locally, with the name `dockersamples/modernize-aspnet-ops` and the tag `1.0` indicating that this is version 1.0 of the app.\n\n## Running the Application in Docker\n\nThe sample application for the lab is a simple ASP.NET WebForms app, which the MSI installs to the default IIS website running on port 80. To start the application, use `docker run` and publish the port from the container onto the host, so the website is available externally:\n\n```\ndocker run -d -p 80:80 --name v1.0 dockersamples/modernize-aspnet-ops:1.0\n```\n\n- `-d` starts the container in detached mode, so Docker keeps it running in the background\n- `-p` publishes port 80 on the container to port 80 on the host, so Docker directs incoming traffic into the container\n- `--name` gives the container the name `v1.0`, so you can refer to it in other Docker commands\n\n`docker ps` will show you that the container is running, together with the port mapping and the command running inside the container:\n\n```\n> docker ps\nCONTAINER ID        IMAGE                                    COMMAND                   CREATED             STATUS                    PORTS                NAMES\n1ab0fa9228b8        dockersamples/modernize-aspnet-ops:1.0   \"C:\\\\ServiceMonitor...\"   17 seconds ago      Up 1 second               0.0.0.0:80->80/tcp   v1.0\n```\n\nYou can get basic management information about the container with `docker top v1.0` to list the running processes, and `docker logs v1.0` to view application log entries. In this case, IIS doesn't write any logs to the console so there won't be any log entries surfaced to Docker.\n\n## Accessing the Application \n\nOn a separate machine, you can open a browser and point to the host running your Docker container. The request enters the machine on port 80 which is mapped to the container, so Docker redirects the traffic - the application in the container handles the request and sends the response:\n\n![Version 1.0 of the sample app](img/app-v1.0.png)\n\nOn the machine that's running the container, you can't browse to `localhost` and see the website, because of a [limitation in Windows networking](https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations/). Instead you need to get the internal IP address of the container and browse to that. The `docker inspect` command tells you all about a running container, and you can filter the output to show just the IP address:\n\n```\n> docker inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' v1.0\n172.26.192.68\n```\n\nIn my case the container's IP address is `172.26.192.68`, on your machine it will be different. From the local machine you can browse to that address and see the website.\n\n## Summary\n\nDockerizing an application from an existing MSI is very simple. This exampls uses a 3-line Dockerfile, a `docker build` command to create the image and a `docker run` command to start the container. Any MSI which supports unattended installation can be packaged in a Dockerfile in the same way. \n\nIn the next step you'll see how to manage application upgrades and OS patches, by building a new Docker image and tagging it with an updated release number.\n\n- [Part 2 - Upgrading Application Images](part-2.md)\n\n\n\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/part-2.md",
    "content": "# Upgrading Application Images\n\nThe Docker image from [Part 1](part-1.md) is a snapshot of the application, built with a specific version of the app and a specific version of Windows. When you have an upgrade to the app or an operating system update you don't make changes to the running container - you build a new Docker image which packages the updated components and replace the container with a new one. \n\nMicrosoft are releasing [monthly updates to the Windows base images](https://store.docker.com/images/windowsservercore/plans/1e9acba1-c879-49b0-9109-7cfcf820a47a?tab=tags) on Docker Store. When your applications are running in Docker containers, there is no 'Patch Tuesday' with manual or semi-automated update processes. The Docker build process is fully automated, so when a new version of the base image is released with security patches, you just need to rebuild your own images and replace the running containers.\n\n## Dockerfile for the v1.1 Application Image\n\nThe Dockerfile for v1.0 of the app deliberately used an old version of the Windows base image, so I can show an OS update and an application upgrade for v1.1.\n\nThree details have changed in the new Dockerfile:\n\n```\nFROM microsoft/aspnet:windowsservercore-10.0.14393.693\n\nCOPY UpgradeSample-1.1.0.0.msi /\n\nRUN msiexec /i c:\\UpgradeSample-1.1.0.0.msi RELEASENAME=2017.03 /qn\n```\n\n- the `FROM` image is tagged with version `10.0.14393.693`, this is the latest Windows image. v1.0 was built on Windows version `10.0.14393.576`\n- the MSI is version `1.1.0.0` which contains an updated application release\n- the MSI parameter `RELEASENAME` has been changed to `2017.03` - this value gets shown in the web app\n\nThe Dockerfile is still a simple 3-line script. All that's changed are the version details for Windows and the application. When you choose a base image for your Dockerfile, you can either pin to a specific Windows version as I have, or use the generic tag to get the latest version. You could use `FROM microsoft/aspnet:windowsservercore` to always use the latest version of the base image when you build.\n\nUsing the latest image means you don't need to modify your Dockerfile when there's a new release, you just run `docker build` again, Docker finds the newer version of the base image, and automatically downloads it to use as the base image. The disadvantage is that you can't see from the Dockerfile which version of Windows you're using. The Docker platform doesn't mandate a particular approach, so you can choose whatever best fits your workflow.\n\n\n## Building the Upgraded Application Image\n\nThe process to build the new version is identical, running `docker build` and applying a new tag to identify the version:\n\n```\ncd .\\v1.1\ndocker build -t dockersamples/modernize-aspnet-ops:1.1 .\n```\n\nDocker will download the new version of Microsoft's ASP.NET image as the first step of building the image. Docker images are physically stored in many layers, and the new version will use the same base layers as the previous version. The logical size of the `microsoft/aspnet` image is 10GB, but only a few hundred megabytes have changed between the versions, and only the changed layers are downloaded from the Hub.\n\nNow I have two application images, tagged `1.0` and `1.1`, each containing different versions of the application built on different versions of Windows. You can see the basic image details with the `docker image ls` command:\n\n```\n> docker image ls --filter reference='dockersamples/*'\nREPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE\ndockersamples/modernize-aspnet-ops           1.1                 dcea5c0e1be9        41 minutes ago      10.1 GB\ndockersamples/modernize-aspnet-ops           1.0                 e763f76db517        About an hour ago   10 GB\n```\n\nYou can see the images are listed at around 10GB each, but this is the logical size. Physically, the images share a lot of data in read-only image layers. If you want to see the layers that go into each image, [Docker Captain](https://www.docker.com/community/docker-captains) [Stefan Scherer](twitter.com/stefscherer) has written a great utility which you can use to [inspect Windows Docker images](https://stefanscherer.github.io/winspector/).\n\n## Upgrading the Running Application\n\nVersion 1.0 of the application is still running, and the container port is mapped to port 80 on the host. Only one process can listen on a port, so you can't start a new container which also listens on port 80. If you want to test out the new version, you can run it alongside the existing version by mapping the container to a new port:\n\n```\ndocker run -d -p 8081:80 --name v1.1 dockersamples/modernize-aspnet-ops:1.1\n```\n\nNow you can browse to version 1.1 from a remote machine using port 8081, or on the host machine by finding the new container's IP address:\n\n![Version 1.1 of the sample app](img/app-v1.1.png)\n\nThe new website shows the updated application version, which is read from the app DLL, and the release version number, which is read from the MSI parameter. The colors have changed too, to make the versions stand out when you're running side-by-side. \n\nDocker containers are such a lightweight unit of compute, you can easily run multiple containers like this when you verify a new release. They're isolated too, so the new application could use a different version of the .NET framework, and the containers wouldn't affect each other. \n\nIn non-production environments you can upgrade just by killing the old container and starting a new one, using the new image but mapping to the original port. That's a manual approach which will incur a few seconds downtime. Docker provides an automated, zero-downtimne alternative which I'll cover in the next step.\n\n## Summary\n\nUpgrading your application package in Docker just means updating the versions in the Dockerfile and building a new image. That covers both application upgrades, and operating system patches. \n\nYou can automate the process for all your applications, so when Microsoft release a new version of the Windows base image, all your apps get rebuilt, ready to be upated in production.\n\nIn the next step you'll learn how to use Docker to automate the update and rollback of application versions.\n\n- [Part 3 - Zero-Downtime Update and Rollback](part-3.md)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/part-3.md",
    "content": "# Zero-Downtime Update and Rollback\n\nI have two images packaging different versions of my application, and in a production Docker environment I can use the platform for automatic update and rollback between versions. To get zero-downtime deployment you need to run your application containers as a service in a Docker swarm - a cluster of machines all running Docker, which you can manage as a single unit.\n\nYou need to have Docker 1.13 running to create a swarm in Windows, and currently the networking stack which supports it is [only available in Windows 10](https://blogs.technet.microsoft.com/virtualization/2017/02/09/overlay-network-driver-with-support-for-docker-swarm-mode-now-available-to-windows-insiders-on-windows-10/). An update to Windows Server 2016 to support the functionality should be coming soon. Until then, you can test the update functionality with a single-node swarm on a Windows 10 machine.\n\n## Initializing the swarm\n\n[Swarm mode](https://docs.docker.com/engine/swarm/) is a clustering technology built into the Docker engine. You can join tens, hundreds or [thousands](https://sematext.com/blog/2016/10/18/docker-swarm-swarm3k/) of machines together in one swarm, and manage the whole cluster using the same `docker` CLI. Swarm mode gives you resilience and scale for your services - running them in multiple containers across many hosts. If a host goes down, Docker will recreate the lost containers on other nodes, ensuring quality of service for your applications.\n\nIn testing, you can create a swarm from a single node, using the `docker swarm init` command. On Windows, you need to specify the IP address of the host, in my case that's `192.168.1.50`:\n\n```\n> docker swarm init --listen-addr 192.168.1.50 --advertise-addr 192.168.1.50\nSwarm initialized: current node (oq14rkz5hqys3nc7c0ylthwdy) is now a manager.\n\nTo add a worker to this swarm, run the following command:\n\n    docker swarm join \\\n    --token SWMTKN-1-0bdfuotbv6esxq9h7eurwxz31zubncpmirruk86fvszcj6wvi2-8n7mifpyn507sdjomsmy7vyzj \\\n    192.168.1.50:2377\n\nTo add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\n```\n\nThe output gives you a secret token you can use to join other nodes to the swarm. Any node with Docker running which has network access could join the swarm by running the `docker swarm join` command.\n\n## Running v1.0 as a Service\n\nIn swarm mode, you don't run individual containers. Instead you create services and the swarm decides which engine to run the containers on. For services which run across many containers, Docker will spread them across as many hosts as possible, to maximise redundancy. To run the web app on my single-node swarm, I'll specify a replica level of 1, which means the service will run on a single container:\n\n```\ndocker service create `\n  --name sample `\n  --publish mode=host,target=80,published=80 `\n  --replicas=1 `\n  dockersamples/modernize-aspnet-ops:1.0\n```\n\n- `name` - is the name of the service, this is how you refer to the service for management, and in other services that consume this one\n- `publish` - maps the container port to the host port. Note that the syntax is differnt in swarm mode, but the functionality is the same\n- `replicas` - the number of containers that run the service. Docker will maintain the service level by starting new containers when needed\n\nYou can check on the service with `docker service ls` and `docker service ps`. As I have a single node, the container is running on my Windows 10 machine, so I can use `docker ps` and `docker inspect` to get the IP address of the container. That shows the original version of the application:\n\n![Version 1.0 of the sample app](img/app-v1.0.png)\n\nServices in swarm mode are first-class citizens, and they can be updated using built-in platform functionality.\n\n\n## Updating the App to v1.1\n\nThe update process runs against a service, and updates it to a specified image version. It does that by stopping the existing containers, and starting new ones. When you first [create a service](https://docs.docker.com/engine/reference/commandline/service_create/#/options), you can control the update behavior options - how many containers are upgraded concurrently, how long Docker should monitor new containers for errors, what action Docker should take if the new containers do error. \n\nIn a highly-available swarm where you have a service running in many containers on many hosts, this is a zero-downtime deployment. Docker only sends traffic to active containers, so old containers won't get traffic when they're stopped, and new containers won't get traffic until they're online.\n\nTo update my service to version 1.1, I run:\n\n```\ndocker service update --image dockersamples/modernize-aspnet-ops:1.1 sample\n```\n\nThat tells Docker to update the `sample` service to version `1.1` of the image. On a single node there will be downtime if you request the site in the period when the old container has stopped and the new one is starting, but that should only be a couple of seconds. On an external machine, refresh the browser and you will see the new version. On the Docker host you will need to get the name and IP address of the new container, because the v1.0 container is no longer running:\n\n![Version 1.1 of the sample app](img/app-v1.1.png)\n\nAutomated updates are a huge benefit of the Docker platform. Updating a distributed application in a safe, automated way takes all the risk out of deployments, and makes frequent releases possible.\n\n## Rolling Back to v1.0\n\nIf I found an issue with version 1.1 of the application which wasn't caught in testing, I'll need to roll back to the previous version. This is also an automated feature in Docker - each service update records the details of the previous version, so you can automatically roll back.\n\nRollback is an option of the `docker service update` command:\n\n```\ndocker service update --rollback sample\n```\n\nRolling back is conceptually the same as updating. The existing containers are stopped, and new container created running the original image version. Browse to the site now and you will see version 1.0 running again. Automated rollback may be an even bigger benefit than automatic update. Knowing you can revert to the previous good version without any downtime and without a lengthy manual procedure gives you confidence in your deployment process, even if there are problems in the application itself.\n\n> Rollback always returns to the previous version, and is cyclical. If you roll back from 1.1 to 1.0, and then roll back again - you'll go back to the previous running version, which was actually 1.1.\n\n\n## Summary\n\nIn non-production environments you can run multiple application versions side-by-side, in different containers mapping different client ports. You can update applications on standalone Docker engines by stopping the old container and starting a new one from the updated image. There will be downtime in that approach, so it isn't suitable for production.\n\nIn this step you saw how a production-grade cluster of Docker engines, running in swarm mode, supports zero-downtime updates. That's all automated, which means a risk-free and fast deployment process. When you update you'll be deploying the exact Docker image which has been through the testing process, so there will be no envornmental configuration issues. If there is an application defect, Docker supports automatic rollback to the previous version.\n\nSo far the application package has used the MSI from an existing build process. That's a quick way to get started with Docker but it's not optimal. Next you'll learn how to package an application from source.\n\n- [Part 4 - Packaging Applications From Source](part-4.md)"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/part-4.md",
    "content": "# Packaging Applications From Source\n\nPackaging MSIs into Docker images lets you use your existing build process investment, and move easily to a modern application platform. That's fine to get started, but there are a couple of problems. \n\nBuilding MSIs is not simple, it involves a tool like [the WiX toolset](http://wixtoolset.org) which takes a lot of moving parts and has a steep learning curve. The Dockerfile syntax is clear and simple, but the hard work is done in the MSI, so if you look at the Dockerfile it's not clear what's happening:\n\n```\nFROM microsoft/aspnet:windowsservercore-10.0.14393.693\nCOPY UpgradeSample-1.1.0.0.msi /\nRUN msiexec /i c:\\UpgradeSample-1.1.0.0.msi RELEASENAME=2017.03 /qn\n```\n\nThe Dockerfile should be the definitive source describing how to deploy the application. Putting all the deployment logic in the Dockerfile instead of an MSI makes the setup and structure of the application clear, and that's what we'll do in this step.\n\n## ASP.NET Deployment Steps\n\nIn the [v1.1 Dockerfile](v1.1/Dockerfile) when Docker builds the image the bulk of the work is done in `msiexec`. What the MSI is doing isn't clear - to find that out you need to read the [Product.wxs](v1.2/src/UpgradeSample.Setup/Product.wxs) file, which is 150 lines of XML. In there you'll see that the MSI creates a new virtual directory and web application under the default IIS web site. Having that detail hidden in the MSI causes two problems.:\n\n1. when you look at the Dockerfile you can't see that the app uses port 80 and creates a nested application, so you don't know that the application site is located at `http://[host]/UpgradeSample`\n2. the MSI uses the default IIS website, but that isn't clear from the Dockerfile. If you insert a step to delete the default site without realising it's needed, will the MSI create it or will the build fail?\n\nIt's much better to have every step explicitly stated in the Dockerfile. That makes all the dependencies and the application setup clear. In the Dockerfile you can use PowerShell and run any cmdlets you need - you can even install modules during the build to make extra cmdlets available.\n\nYou may even want to return to the base Windows Server image, rather than use the pre-configured ASP.NET image, so you can control exactly what gets built into your application image. Taking that approach, the Dockerfile will need to:\n\n- install IIS\n- install ASP.NET\n- copy in the compiled web application\n- configure the application in IIS\n\n\n## Dockerfile for the v1.2 Image\n\nI'm upgrading the application version at the same time, so the new image will contain v1.2 and it will build out the whole application stack in the Dockerfile. Here's how it starts:\n\n```\n# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Add-WindowsFeature Web-server, NET-Framework-45-ASPNET, Web-Asp-Net45\n```\n\nThat uses the latest version of Windows Server Core as the base image, and installs IIS and ASP.NET. The base image already has the .NET Framework installed, so at this point the image has everything set up to run ASP.NET applications. Next I create a directory for the website and set up the web app in IIS, using PowerShell:\n\n```\nRUN New-Item -Path 'C:\\web-app' -Type Directory; `   \n    New-WebApplication -Name UpgradeSample -Site 'Default Web Site' -PhysicalPath 'C:\\web-app'\n\nEXPOSE 80\n```\n\nThat makes it clear that the app uses the default web site, and creates the `UpgradeSample` path underneath it, and that the image allows traffic to come in on port 80. \n\nThe application MSI supported a parameter to set the version name for the release, which the user can set at install time. In Docker that release version will be baked into the built image, but I can support users setting the value at build time with the [ARG](https://docs.docker.com/engine/reference/builder/#arg) instruction. The value that gets passed is then used to update the config file, in the same way the MSI did:\n\n```\nARG RELEASENAME\n\nRUN $file = 'c:\\web-app\\Web.config'; `\n    (Get-Content $file) | Foreach-Object { $_ -replace '\\{RELEASENAME\\}', \"$($env:RELEASENAME)\" } | Set-Content $file\n```\n\nThe full [v1.2 Dockerfile](v1.2/docker/web/Dockerfile) also contains a [HEALTHCHECK](https://docs.docker.com/engine/reference/builder/#healthcheck) instruction, which tests the application is running correctly, so Docker knows if the container is healthy.\n\n## Building the Docker Image from Source Code\n\nThere's no packaged application to copy into the image for version 1.2, instead there's the source code and a second [Dockerfile](v1.2/docker/builder/Dockerfile) which has all the components needed to build the application. I can compile the app in a Docker container, copy the output onto the host, and then build the application image using the compiled output. That's a clean workflow which has no dependencies on the host - you don't need Visual Studio or MSBuild installed, you just need Docker.\n\nFor v1.2 there's a [PowerShell build script](v1.2/build.ps1) which captures the full workflow. First the builder Docker image gets built and run to compile the application:\n\n```\ndocker build `\n -t dockersamples/modernize-aspnet-ops-builder `\n $pwd\\docker\\builder\n\ndocker run --rm `\n -v $pwd\\src:c:\\src `\n -v $pwd\\docker:c:\\out `\n dockersamples/modernize-aspnet-ops-builder `\n C:\\src\\build.ps1 \n```\n\nThen the output gets copied to a sensible location and the application image gets built, packaging the compiled output:\n\n```\nMove-Item -Force $pwd\\docker\\web\\UpgradeSample\\_PublishedWebsites\\UpgradeSample.Web $pwd\\docker\\web\n\ndocker build `\n -t dockersamples/modernize-aspnet-ops:1.2 `\n --build-arg RELEASENAME=2017.04 `\n$pwd\\docker\\web\n```\n\nAnyone with Docker installed can run that script to build v1.2 of the application. The two Dockerfiles make it explicitly clear what is needed to compile the application, and to deploy the compiled app. In the `docker build` command, the user can pass a value for the `RELEASENAME` argument, which replicates the install functionality from the MSI.\n\n## Updating to Version 1.2\n\nThe update process is exactly the same for the new version, even though the image is built in a completely different way. Run `docker service update` specifying the service name and the desired image version:\n\n```\ndocker service update --image dockersamples/modernize-aspnet-ops:1.2 sample\n```\n\nWhen the rolling update is complete, browse to the host (or the container IP address), and you'll see the latest version of the app:\n\n![Version 1.2 of the sample app](img/app-v1.2.png)\n\n\n## Summary\n\nThe Dockerfile replaces the manual deployment guide for the application. It should explicitly state all the application dependencies and all the deployment steps needed to package the application. Earlier in the lab the Docker images were built by running existing MSIs, but what happens in the MSI is opaque and that means the Dockerfile is not a complete record of the application setup. In this step I moved all the packaging steps into the Dockerfile. The complete Dockerfile is only 20 lines, but it is a clear and correct set of deployment steps.\n\nTo compile the web application from source code there's another Docker image used as a builder. That image replaces any existing CI build agent, which would need Visual Studio or MSBuild installed. The Docker builder image can compile the ASP.NET application and publish it ready for packaging in the application image. The same builder image can be used by developers and by the build server, so the build is always consistent.\n\n## Lab Summary\n\nThis lab has covered application modernization from an ops perspective, where you may want to take existing applications and run them as containers without changing the application code. You saw how to package an existing MSI into a Docker image, which is a single unit that contains the whole application stack. Just by doing that the application now runs on .NET 4.6 on top of Windows Server 2016 - which is a big security upgrade if you're currently running in .NET 2.0 on Windows Server 2008.\n\nYou saw how to run the application in a Docker swarm, which is a modern application platform. Docker swarm provides a clustered compute environment where you specify the service level for your applications, and the swarm deals with running containers and replacing them if nodes go down. Services in swarm mode can be automatically updated to new application versions, and rolled back to previous versions - so deployments become fast, automated and trouble-free.\n\nLastly the lab covered how OS patches work in the Docker platform. Containers are disposable units, so you don't connect to them and run Windows Update. Instead, Microsoft release a new version of the base image every month with the latest patches. That's your trigger for rebuilding all your application images using the latest version, and rolling out automatic updates. Patch Tuesday goes away in the Docker world and all updates are automated."
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.0/Dockerfile",
    "content": "# escape=`\nFROM microsoft/aspnet:windowsservercore-10.0.14393.576\n\nCOPY UpgradeSample-1.0.0.0.msi /\n\nRUN msiexec /i c:\\UpgradeSample-1.0.0.0.msi RELEASENAME=2017.02 /qn"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.0/build.ps1",
    "content": "docker build `\n -t dockersamples/modernize-aspnet-ops:1.0 `\n ."
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.1/Dockerfile",
    "content": "# escape=`\nFROM microsoft/aspnet:windowsservercore-10.0.14393.693\n\nCOPY UpgradeSample-1.1.0.0.msi /\n\nRUN msiexec /i c:\\UpgradeSample-1.1.0.0.msi RELEASENAME=2017.03 /qn"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.1/build.ps1",
    "content": "docker build `\n -t dockersamples/modernize-aspnet-ops:1.1 `\n ."
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/build.ps1",
    "content": "docker build `\n -t dockersamples/modernize-aspnet-ops-builder `\n $pwd\\docker\\builder\n\ndocker run --rm `\n -v $pwd\\src:c:\\src `\n -v $pwd\\docker:c:\\out `\n dockersamples/modernize-aspnet-ops-builder `\n C:\\src\\build.ps1 \n\nRemove-Item -Recurse -Force $pwd\\docker\\web\\UpgradeSample.Web\nMove-Item -Force $pwd\\docker\\web\\UpgradeSample\\_PublishedWebsites\\UpgradeSample.Web $pwd\\docker\\web\nRemove-Item -Recurse -Force $pwd\\docker\\web\\UpgradeSample\n\ndocker build `\n -t dockersamples/modernize-aspnet-ops:1.2 `\n --build-arg RELEASENAME=2017.04 `\n$pwd\\docker\\web"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/docker/builder/Dockerfile",
    "content": "# escape=`\nFROM microsoft/windowsservercore:10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 14.0.25420.1 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force; `\n    Install-Package -Name webdeploy -RequiredVersion 3.5.2 -Force\n\nRUN Install-Package -Name nuget.commandline -RequiredVersion 3.4.3 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install MSBuild.Microsoft.VisualStudio.Web.targets -Version 14.0.0.3\n\nENTRYPOINT [\"powershell\"]"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/docker/web/Dockerfile",
    "content": "# escape=`\nFROM microsoft/aspnet:windowsservercore-10.0.14393.693\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nRUN Add-WindowsFeature Web-server, NET-Framework-45-ASPNET, Web-Asp-Net45\n\nRUN New-Item -Path 'C:\\web-app' -Type Directory; `\n    New-WebApplication -Name UpgradeSample -Site 'Default Web Site' -PhysicalPath 'C:\\web-app'\n\nEXPOSE 80 \nARG RELEASENAME\n\nHEALTHCHECK CMD powershell -command `\n    try { `\n     $response = iwr http://localhost:80/UpgradeSample -UseBasicParsing; `\n     if ($response.StatusCode -eq 200) { return 0} `\n     else {return 1}; `\n    } catch { return 1 }\n\nCOPY ServiceMonitor.exe /\nCOPY UpgradeSample.Web /web-app\n\nRUN $file = 'c:\\web-app\\Web.config'; `\n    (Get-Content $file) | Foreach-Object { $_ -replace '\\{RELEASENAME\\}', \"$($env:RELEASENAME)\" } | Set-Content $file\n\nCMD [\"C:\\ServiceMonitor.exe\", \"w3svc\"]"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/docker/web/EnableIisRemoteManagement.ps1",
    "content": "\nnet user iisadmin \"!!Sadmin*\" /add\nnet localgroup \"Administrators\" \"iisadmin\" /add\n\nImport-Module servermanager\nAdd-WindowsFeature web-mgmt-service\n\nSet-ItemProperty -Path HKLM:\\SOFTWARE\\Microsoft\\WebManagement\\Server -Name EnableRemoteManagement -Value 1\nstart-service wmsvc"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/docker/web/UpgradeSample.Web/Default.aspx",
    "content": "<%@ Import Namespace=\"System\" %>\n<%@ Import Namespace=\"UpgradeSample.Web\" %>\n<%@ Page Language=\"c#\"%>\n\n<script runat=\"server\">\n    public string GetApplicationVersion()\n    {\n        return typeof(Global).Assembly.GetName().Version.ToString();\n    }\n\n    public string GetReleaseName()\n    {\n        return ConfigurationManager.AppSettings[\"ReleaseName\"];\n    }\n\n\n    public string GetMachineVariables()\n    {\n        IDictionary variables = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine);\n        return FormatEnvironmentVariables(variables);\n    }\n\n    public string GetProcessVariables()\n    {\n        IDictionary variables = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process);\n        return FormatEnvironmentVariables(variables);\n    }\n\n    public string GetUserVariables()\n    {\n        IDictionary variables = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User);\n        return FormatEnvironmentVariables(variables);\n    }\n\n    public string FormatEnvironmentVariables(IDictionary variables)\n    {\n        var sb = new StringBuilder();\n        sb.AppendLine(\"<ul>\");\n        var keys = new ArrayList(variables.Keys);\n        keys.Sort();\n        foreach (var key in keys)\n        {\n            sb.Append(string.Format(\"<li><b>{0}</b>: {1}</li>\", key, variables[key]));\n        }\n        sb.AppendLine(\"</ul>\");\n        return sb.ToString();\n    }\n</script>\n\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\" />\n<title>ASP.NET inline</title>\n<style>\n    body { background-color: navy; color: cyan}\n</style>\n</head>\n<body>\n        <h2>Application Version</h2>\n            <% =GetApplicationVersion() %>\n    <p/>\n    <hr/>\n\n            <h2>Application Release</h2>\n            <% =GetReleaseName() %>\n    <p/>\n    <hr/>\n\n        <h2>Machine-level Environment Variables</h2>\n            <% =GetMachineVariables() %>\n    <p/>\n    <hr/>\n\n        <h2>Process-level Environment Variables</h2>\n            <% =GetProcessVariables() %>\n    <p/>\n    <hr/>\n\n        <h2>User-level Environment Variables</h2>\n            <% =GetUserVariables() %>\n    <p/>        \n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/docker/web/UpgradeSample.Web/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"UpgradeSample.Web.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/docker/web/UpgradeSample.Web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=169433\n  -->\n<configuration>\n  <appSettings>\n    <add key=\"ReleaseName\" value=\"{RELEASENAME}\"/>\n  </appSettings>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\"/>\n    <httpRuntime targetFramework=\"4.5.2\"/>\n    <customErrors mode=\"Off\"/>\n  </system.web>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\"/>\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Setup/Product.wxs",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\"\n     xmlns:iis=\"http://schemas.microsoft.com/wix/IIsExtension\"\n     xmlns:util=\"http://schemas.microsoft.com/wix/UtilExtension\">\n  <Product Id=\"{A9479B57-BAE3-4028-B2F8-4DD6660FEA3E}\"\n    Name=\"Upgrade Sample\"\n    Language=\"1033\"\n    Version=\"1.1.0.0\"\n    Manufacturer=\"Docker Samples\"\n    UpgradeCode=\"{0712A918-F025-4088-9F53-997212F679A1}\">\n\n    <Package InstallerVersion=\"200\" Compressed=\"yes\" />\n\n    <Property Id=\"WIXUI_INSTALLDIR\" Value=\"INSTALLLOCATION\"/>\n    <Property Id=\"ALLUSERS\" Value=\"1\"/>\n    <Property Id=\"RELEASENAME\" Value=\"2017.02\"/>\n\n    <Media Id=\"1\" Cabinet=\"UpgradeSample.cab\" EmbedCab=\"yes\" />\n\n    <Directory Id=\"TARGETDIR\" Name=\"SourceDir\">\n      <Directory Id=\"ProgramFilesFolder\">\n        <Directory Id=\"DockerSamplesFolder\" Name=\"DockerSamples\">\n          <Directory Id=\"INSTALLLOCATION\" Name=\"UpgradeSample\">\n            <Directory Id=\"WebDir\" Name=\"Web\">\n              <Component Id=\"Web.Dir\" Guid=\"{EBB836AB-A0C3-4D5D-B2CB-867E12FFCFA1}\">\n                <File Id=\"DefaultAspx\"\n                Name=\"Default.aspx\"\n                Source=\"C:\\temp\\upgradesample\\Default.aspx\"/>\n                <File Id=\"GlobalAsax\"\n               Name=\"Global.asax\"\n               Source=\"C:\\temp\\upgradesample\\Global.asax\"/>\n                <File Id=\"WebConfig\"\n               Name=\"Web.config\"\n               Source=\"C:\\temp\\upgradesample\\Web.config\"/>\n              </Component>\n              <Directory Id=\"WebBinDir\" Name=\"bin\">\n                <Component Id=\"Web.BinDir\" Guid=\"{42EB7B74-3653-4399-8092-77637067E9DB}\">\n                  <File Id=\"UpgradeSampleWebDll\"\n                                 Name=\"UpgradeSample.Web.dll\"\n                                 Source=\"C:\\temp\\upgradesample\\bin\\UpgradeSample.Web.dll\"/>\n                </Component>\n              </Directory>\n            </Directory>\n          </Directory>\n        </Directory>\n      </Directory>\n\n      <!-- Website -->\n      <Component Id=\"Web.Site\" Guid=\"{CCB38070-C8BC-4C79-A2F1-257718150C79}\">\n        <iis:WebVirtualDir Id=\"WebVirtualDir\"\n                   Alias=\"UpgradeSample\"\n                   Directory=\"WebDir\" WebSite=\"DefaultWebSite\">\n          <iis:WebApplication Id=\"WebApplication\" Name=\"UpgradeSample\" />\n        </iis:WebVirtualDir>\n      </Component>\n\n      <!-- Config update -->\n      <Component Id='Web.ConfigUpdate' Guid='{508AB901-28F8-44FB-80D0-8C189D2B194F}'>\n        <util:XmlFile Id='SetReleaseName'\n                      Action='setValue'\n                      ElementPath=\"/configuration/appSettings/add[\\[]@key='ReleaseName'[\\]]/@value\"\n                      File='[WebDir]Web.Config'\n                      Value='[RELEASENAME]' />\n      </Component>\n\n    </Directory>\n    \n    <iis:WebSite Id=\"DefaultWebSite\" Description=\"Default Web Site\">\n      <iis:WebAddress Id=\"AllUnassigned\" Port=\"80\" />\n    </iis:WebSite>\n\n    <Feature Id=\"ProductFeature\" Title=\"UpgradeSample\" Level=\"1\">\n      <ComponentRef Id=\"Web.Dir\"/>\n      <ComponentRef Id=\"Web.BinDir\"/>\n      <ComponentRef Id=\"Web.Site\"/>\n      <ComponentRef Id=\"Web.ConfigUpdate\"/>\n    </Feature>\n\n    <UIRef Id=\"WixUI_UpgradeSample\" />\n\n  </Product>\n\n  <Fragment>\n    <UI Id=\"WixUI_UpgradeSample\">\n      <TextStyle Id=\"WixUI_Font_Normal\" FaceName=\"Tahoma\" Size=\"8\" />\n      <TextStyle Id=\"WixUI_Font_Bigger\" FaceName=\"Tahoma\" Size=\"12\" />\n      <TextStyle Id=\"WixUI_Font_Title\" FaceName=\"Tahoma\" Size=\"9\" Bold=\"yes\" />\n\n      <Property Id=\"DefaultUIFont\" Value=\"WixUI_Font_Normal\" />\n      <Property Id=\"WixUI_Mode\" Value=\"Mondo\" />\n\n      <DialogRef Id=\"ErrorDlg\" />\n      <DialogRef Id=\"FatalError\" />\n      <DialogRef Id=\"FilesInUse\" />\n      <DialogRef Id=\"MsiRMFilesInUse\" />\n      <DialogRef Id=\"PrepareDlg\" />\n      <DialogRef Id=\"ProgressDlg\" />\n      <DialogRef Id=\"ResumeDlg\" />\n      <DialogRef Id=\"UserExit\" />\n\n      <DialogRef Id=\"BrowseDlg\" />\n\n      <Publish Dialog=\"BrowseDlg\" Control=\"OK\" Event=\"DoAction\" Value=\"WixUIValidatePath\" Order=\"3\">1</Publish>\n      <Publish Dialog=\"BrowseDlg\" Control=\"OK\" Event=\"SpawnDialog\" Value=\"InvalidDirDlg\" Order=\"4\"><![CDATA[WIXUI_INSTALLDIR_VALID<>\"1\"]]></Publish>\n\n\n      <Publish Dialog=\"ExitDialog\" Control=\"Finish\" Event=\"EndDialog\" Value=\"Return\" Order=\"999\">1</Publish>\n\n      <Publish Dialog=\"WelcomeDlg\" Control=\"Next\" Event=\"NewDialog\" Value=\"InstallDirDlg\">1</Publish>\n\n      <Publish Dialog=\"InstallDirDlg\" Control=\"Back\" Event=\"NewDialog\" Value=\"WelcomeDlg\">1</Publish>\n      <Publish Dialog=\"InstallDirDlg\" Control=\"Next\" Event=\"SetTargetPath\" Value=\"[WIXUI_INSTALLDIR]\" Order=\"1\">1</Publish>\n      <Publish Dialog=\"InstallDirDlg\" Control=\"Next\" Event=\"DoAction\" Value=\"WixUIValidatePath\" Order=\"2\">NOT WIXUI_DONTVALIDATEPATH</Publish>\n      <Publish Dialog=\"InstallDirDlg\" Control=\"Next\" Event=\"SpawnDialog\" Value=\"InvalidDirDlg\" Order=\"3\"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>\"1\"]]></Publish>\n      <Publish Dialog=\"InstallDirDlg\" Control=\"Next\" Event=\"NewDialog\" Value=\"ReleaseDlg\" Order=\"4\">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID=\"1\"</Publish>\n      <Publish Dialog=\"InstallDirDlg\" Control=\"ChangeFolder\" Property=\"_BrowseProperty\" Value=\"[WIXUI_INSTALLDIR]\" Order=\"1\">1</Publish>\n      <Publish Dialog=\"InstallDirDlg\" Control=\"ChangeFolder\" Event=\"SpawnDialog\" Value=\"BrowseDlg\" Order=\"2\">1</Publish>\n\n      <Publish Dialog=\"ReleaseDlg\" Control=\"Back\" Event=\"NewDialog\" Value=\"InstallDirDlg\">1</Publish>\n      <Publish Dialog=\"ReleaseDlg\" Control=\"Next\" Event=\"NewDialog\" Value=\"VerifyReadyDlg\" Order=\"1\">1</Publish>\n\n      <Publish Dialog=\"VerifyReadyDlg\" Control=\"Back\" Event=\"NewDialog\" Value=\"InstallDirDlg\">1</Publish>\n      <Publish Dialog=\"VerifyReadyDlg\" Control=\"Back\" Event=\"NewDialog\" Value=\"MaintenanceTypeDlg\" Order=\"2\">WixUI_InstallMode = \"Repair\" OR WixUI_InstallMode = \"Remove\"</Publish>\n\n      <Publish Dialog=\"MaintenanceWelcomeDlg\" Control=\"Next\" Event=\"NewDialog\" Value=\"MaintenanceTypeDlg\">1</Publish>\n\n      <Publish Dialog=\"MaintenanceTypeDlg\" Control=\"RepairButton\" Event=\"NewDialog\" Value=\"VerifyReadyDlg\">1</Publish>\n      <Publish Dialog=\"MaintenanceTypeDlg\" Control=\"RemoveButton\" Event=\"NewDialog\" Value=\"VerifyReadyDlg\">1</Publish>\n      <Publish Dialog=\"MaintenanceTypeDlg\" Control=\"Back\" Event=\"NewDialog\" Value=\"MaintenanceWelcomeDlg\">1</Publish>\n    </UI>\n\n    <UIRef Id=\"WixUI_Common\" />\n\n    <UI>\n      <Dialog Id=\"ReleaseDlg\" Width=\"370\" Height=\"270\" Title=\"!(loc.InstallDirDlg_Title)\">\n        <Control Id=\"Next\" Type=\"PushButton\" X=\"236\" Y=\"243\" Width=\"56\" Height=\"17\" Default=\"yes\" Text=\"!(loc.WixUINext)\" />\n        <Control Id=\"Back\" Type=\"PushButton\" X=\"180\" Y=\"243\" Width=\"56\" Height=\"17\" Text=\"!(loc.WixUIBack)\" />\n        <Control Id=\"Cancel\" Type=\"PushButton\" X=\"304\" Y=\"243\" Width=\"56\" Height=\"17\" Cancel=\"yes\" Text=\"!(loc.WixUICancel)\">\n          <Publish Event=\"SpawnDialog\" Value=\"CancelDlg\">1</Publish>\n        </Control>\n\n        <Control Id=\"Description\" Type=\"Text\" X=\"25\" Y=\"23\" Width=\"280\" Height=\"15\" Transparent=\"yes\" NoPrefix=\"yes\" Text=\"Set release details\" />\n        <Control Id=\"Title\" Type=\"Text\" X=\"15\" Y=\"6\" Width=\"200\" Height=\"15\" Transparent=\"yes\" NoPrefix=\"yes\" Text=\"{\\WixUI_Font_Title}Release Details\" />\n        <Control Id=\"BannerBitmap\" Type=\"Bitmap\" X=\"0\" Y=\"0\" Width=\"370\" Height=\"44\" TabSkip=\"no\" Text=\"!(loc.InstallDirDlgBannerBitmap)\" />\n        <Control Id=\"BannerLine\" Type=\"Line\" X=\"0\" Y=\"44\" Width=\"370\" Height=\"0\" />\n        <Control Id=\"BottomLine\" Type=\"Line\" X=\"0\" Y=\"234\" Width=\"370\" Height=\"0\" />\n\n        <Control Id=\"ReleaseLabel\" Type=\"Text\" X=\"20\" Y=\"70\" Width=\"60\" Height=\"13\" Text=\"Release Name:\" />\n        <Control Id=\"Release\" Type=\"Edit\" X=\"100\" Y=\"68\" Width=\"150\" Height=\"15\" Property=\"RELEASENAME\" />\n      </Dialog>\n    </UI>\n  </Fragment>\n\n</Wix>\n\n\n\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Setup/UpgradeSample.Setup.wixproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProductVersion>3.10</ProductVersion>\n    <ProjectGuid>ae37daf5-9721-41aa-9664-df7417b5c877</ProjectGuid>\n    <SchemaVersion>2.0</SchemaVersion>\n    <OutputName>UpgradeSample.Setup</OutputName>\n    <OutputType>Package</OutputType>\n    <WixTargetsPath Condition=\" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' \">$(MSBuildExtensionsPath32)\\Microsoft\\WiX\\v3.x\\Wix.targets</WixTargetsPath>\n    <WixTargetsPath Condition=\" '$(WixTargetsPath)' == '' \">$(MSBuildExtensionsPath)\\Microsoft\\WiX\\v3.x\\Wix.targets</WixTargetsPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\n    <OutputPath>bin\\$(Configuration)\\</OutputPath>\n    <IntermediateOutputPath>obj\\$(Configuration)\\</IntermediateOutputPath>\n    <DefineConstants>Debug</DefineConstants>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\n    <OutputPath>bin\\$(Configuration)\\</OutputPath>\n    <IntermediateOutputPath>obj\\$(Configuration)\\</IntermediateOutputPath>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"Product.wxs\" />\n  </ItemGroup>\n  <Import Project=\"$(WixTargetsPath)\" />\n  <!--\n\tTo modify your build process, add your task inside one of the targets below and uncomment it.\n\tOther similar extension points exist, see Wix.targets.\n\t<Target Name=\"BeforeBuild\">\n\t</Target>\n\t<Target Name=\"AfterBuild\">\n\t</Target>\n\t-->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Web/Default.aspx",
    "content": "<%@ Import Namespace=\"System\" %>\n<%@ Import Namespace=\"UpgradeSample.Web\" %>\n<%@ Page Language=\"c#\"%>\n\n<script runat=\"server\">\n    public string GetApplicationVersion()\n    {\n        return typeof(Global).Assembly.GetName().Version.ToString();\n    }\n\n    public string GetReleaseName()\n    {\n        return ConfigurationManager.AppSettings[\"ReleaseName\"];\n    }\n\n\n    public string GetMachineVariables()\n    {\n        IDictionary variables = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine);\n        return FormatEnvironmentVariables(variables);\n    }\n\n    public string GetProcessVariables()\n    {\n        IDictionary variables = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process);\n        return FormatEnvironmentVariables(variables);\n    }\n\n    public string GetUserVariables()\n    {\n        IDictionary variables = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User);\n        return FormatEnvironmentVariables(variables);\n    }\n\n    public string FormatEnvironmentVariables(IDictionary variables)\n    {\n        var sb = new StringBuilder();\n        sb.AppendLine(\"<ul>\");\n        var keys = new ArrayList(variables.Keys);\n        keys.Sort();\n        foreach (var key in keys)\n        {\n            sb.Append(string.Format(\"<li><b>{0}</b>: {1}</li>\", key, variables[key]));\n        }\n        sb.AppendLine(\"</ul>\");\n        return sb.ToString();\n    }\n</script>\n\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\" />\n<title>ASP.NET inline</title>\n<style>\n    body { background-color: navy; color: cyan}\n</style>\n</head>\n<body>\n        <h2>Application Version</h2>\n            <% =GetApplicationVersion() %>\n    <p/>\n    <hr/>\n\n            <h2>Application Release</h2>\n            <% =GetReleaseName() %>\n    <p/>\n    <hr/>\n\n        <h2>Machine-level Environment Variables</h2>\n            <% =GetMachineVariables() %>\n    <p/>\n    <hr/>\n\n        <h2>Process-level Environment Variables</h2>\n            <% =GetProcessVariables() %>\n    <p/>\n    <hr/>\n\n        <h2>User-level Environment Variables</h2>\n            <% =GetUserVariables() %>\n    <p/>        \n</body>\n</html>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Web/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"UpgradeSample.Web.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Web/Global.asax.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Security;\nusing System.Web.SessionState;\n\nnamespace UpgradeSample.Web\n{\n    public class Global : System.Web.HttpApplication\n    {\n        protected void Application_Start(object sender, EventArgs e)\n        {\n        }\n    }\n}"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Web/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"UpgradeSample.Web\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"UpgradeSample.Web\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"2822dd41-90c5-46f4-9a75-bc9d65c513e7\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.2.0.0\")]\n[assembly: AssemblyFileVersion(\"1.2.0.0\")]\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Web/UpgradeSample.Web.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{2822DD41-90C5-46F4-9A75-BC9D65C513E7}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>UpgradeSample.Web</RootNamespace>\n    <AssemblyName>UpgradeSample.Web</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Default.aspx\" />\n    <None Include=\"Properties\\PublishProfiles\\local.pubxml\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"App_Data\\\" />\n    <Folder Include=\"Models\\\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>50134</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:50134/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Web/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Web/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.Web/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=169433\n  -->\n<configuration>\n  <appSettings>\n    <add key=\"ReleaseName\" value=\"{RELEASENAME}\"/>\n  </appSettings>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\"/>\n    <httpRuntime targetFramework=\"4.5.2\"/>\n    <customErrors mode=\"Off\"/>\n  </system.web>\n  <system.webServer>\n    <validation validateIntegratedModeConfiguration=\"false\"/>\n  </system.webServer>\n</configuration>"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/UpgradeSample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"UpgradeSample.Web\", \"UpgradeSample.Web\\UpgradeSample.Web.csproj\", \"{2822DD41-90C5-46F4-9A75-BC9D65C513E7}\"\nEndProject\nProject(\"{930C7802-8A8C-48F9-8165-68863BCCD9DD}\") = \"UpgradeSample.Setup\", \"UpgradeSample.Setup\\UpgradeSample.Setup.wixproj\", \"{AE37DAF5-9721-41AA-9664-DF7417B5C877}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Scripts\", \"Scripts\", \"{C5B223C7-8CDC-4961-9DD1-2D0366DB4A6A}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tbuild.ps1 = build.ps1\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{2822DD41-90C5-46F4-9A75-BC9D65C513E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2822DD41-90C5-46F4-9A75-BC9D65C513E7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2822DD41-90C5-46F4-9A75-BC9D65C513E7}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{2822DD41-90C5-46F4-9A75-BC9D65C513E7}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{2822DD41-90C5-46F4-9A75-BC9D65C513E7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2822DD41-90C5-46F4-9A75-BC9D65C513E7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2822DD41-90C5-46F4-9A75-BC9D65C513E7}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{2822DD41-90C5-46F4-9A75-BC9D65C513E7}.Release|x86.Build.0 = Release|Any CPU\n\t\t{AE37DAF5-9721-41AA-9664-DF7417B5C877}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{AE37DAF5-9721-41AA-9664-DF7417B5C877}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{AE37DAF5-9721-41AA-9664-DF7417B5C877}.Debug|x86.Build.0 = Debug|x86\n\t\t{AE37DAF5-9721-41AA-9664-DF7417B5C877}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{AE37DAF5-9721-41AA-9664-DF7417B5C877}.Release|x86.ActiveCfg = Release|x86\n\t\t{AE37DAF5-9721-41AA-9664-DF7417B5C877}.Release|x86.Build.0 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/build.ps1",
    "content": "$nuGetPath = \"C:\\Chocolatey\\bin\\nuget.bat\"\n$msBuildPath = \"C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe\"\n\ncd c:\\src\n& $nuGetPath restore .\\UpgradeSample.sln\n& $msBuildPath .\\UpgradeSample.Web\\UpgradeSample.Web.csproj /p:OutputPath=c:\\out\\web\\UpgradeSample /p:DeployOnBuild=true /p:VSToolsPath=C:\\MSBuild.Microsoft.VisualStudio.Web.targets.14.0.0.3\\tools\\VSToolsPath"
  },
  {
    "path": "Docker/additional-ressources/windows/modernize-traditional-apps/modernize-aspnet-ops/v1.2/src/package-msi.ps1",
    "content": "$wixPath = \"C:\\Program Files (x86)\\WiX Toolset v3.10\\bin\"\n\n& \"$wixPath\\candle.exe\"  -out .\\Output\\UpgradeSample.wixobj .\\UpgradeSample.Setup\\Product.wxs -ext WixIIsExtension -ext WixUiExtension -ext WixUtilExtension\n& \"$wixPath\\light.exe\" -out .\\Output\\UpgradeSample.msi .\\Output\\UpgradeSample.wixobj -ext WixIISExtension -ext WixUiExtension  -ext WixUtilExtension -cultures:en-us \n"
  },
  {
    "path": "Docker/additional-ressources/windows/readme.md",
    "content": "# Windows and .NET Tutorials\n\nWe have these Windows and .NET tutorials:\n\n* [Windows 101 - from DockerCon](../dockercon-us-2017/windows-101)\n* [Getting Started with Windows Containers](windows-containers/)\n* [Beginning ASP.NET Web application](aspnet-web/README.md)\n* [SQL Server Database](sql-server/README.md)\n* [Run a local Docker Registry](registry/README.md)\n\nAnd these tutorials for [modernizing traditional apps](modernize-traditional-apps/README.md):\n\n* [Modernize ASP.NET Web Applications - for Developers](modernize-traditional-apps/modernize-aspnet/README.md)\n* [Modernize ASP.NET Apps - for IT Pros](modernize-traditional-apps/modernize-aspnet-ops/README.md)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/registry/Dockerfile",
    "content": "# escape=`\nFROM microsoft/nanoserver\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop';\"]\n\nEXPOSE 5000\nENV REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=c:\\\\data\n\nWORKDIR c:\\\\registry\nCOPY ./registry/ .\n\nCMD [\"registry\", \"serve\", \"config.yml\"]"
  },
  {
    "path": "Docker/additional-ressources/windows/registry/Dockerfile.builder",
    "content": "# escape=`\n\nFROM golang:windowsservercore\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop';\"]\n\nCMD go get github.com/docker/distribution/cmd/registry ; `\n    cp \\\"$env:GOPATH\\bin\\registry.exe\\\" c:\\out\\ ; `\n    cp \\\"$env:GOPATH\\src\\github.com\\docker\\distribution\\cmd\\registry\\config-example.yml\\\" c:\\out\\config.yml\n\n"
  },
  {
    "path": "Docker/additional-ressources/windows/registry/README.md",
    "content": "# Registry Lab\n\nA registry is a service for storing and accessing Docker images. [Docker Cloud](https://cloud.docker.com) and [Docker Store](https://store.docker.com) are the best-known hosted registries, which you can use to store public and private images. You can also run your own registry using the open-source [Docker Registry](https://docs.docker.com/registry), which is a Go application that can run in a Windows container.\n\n## What You Will Learn\n\nYou'll learn how to:\n\n- build a Docker image which packages the [Docker Registry](https://docs.docker.com/registry) application on Windows Nano Server;\n\n- run a local registry in a container and configure your Docker engine to use the registry;\n\n- generate SSL certificates (using Docker!) and run a secure local registry with a friendly domain name;\n\n- generate encrypted passwords (using Docker!) and run an authenticated, secure local registry over HTTPS with basic auth.\n\n> Note. The open-source registry does not have a Web UI, so there's no friendly interface like [Docker Cloud](https://cloud.docker.com) or [Docker Store](https://store.docker.com). Instead there is a [REST API](https://docs.docker.com/registry/spec/api/) you can use to query the registry. For a local registry which has a Web UI and role-based access control, Docker, Inc. has the [Trusted Registry](https://www.docker.com/sites/default/files/Docker%20Trusted%20Registry.pdf) product.\n\n### Prerequisites\n\nYou'll need Docker running on Windows. You can follow the [Windows Container Lab Setup](https://github.com/docker/labs/blob/master/windows/windows-containers/Setup.md) to install  Docker on Windows 10, or Windows 2016 - locally, on AWS and Azure.\n\nYou should be familiar with the key Docker concepts, and with Docker volumes:\n\n- [Docker concepts](https://docs.docker.com/engine/understanding-docker/)\n- [Docker volumes](https://docs.docker.com/engine/tutorials/dockervolumes/)\n\n## The Lab\n\n- [Part 1 - Building the Registry Image](part-1.md)\n- [Part 2 - Running a Registry Container](part-2.md)\n- [Part 3 - Running a Secured Registry Container](part-3.md)\n- [Part 4 - Using Basic Authentication with a Secured Registry](part-4.md)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/registry/part-1.md",
    "content": "# Part 1 - Building the Registry Image\n\nDocker provides an [official registry image](https://store.docker.com/images/registry) on the Hub, but currently it is only available as a Linux image. The application is written in Go so it can be compiled for Windows and run as a container on Windows 10 and Windows Server 2016.\n\n> Note. Expect the official image to have a Windows variant soon, but this part of the lab is still useful if you want to build from the latest source code yourself.\n\n## Building from Source\n\nThe Go source code for the registry is on GitHub in Docker's [distribution](https://github.com/docker/distribution) repository. Building Go applications is simple with the [go command](https://golang.org/doc/articles/go_command.html), we just need to install the Go tools and run:\n\n```PowerShell\ngo get github.com/docker/distribution/cmd/registry\n```\n\nOn Windows the build will produce a binary file, `registry.exe`, which is a standalone executable. We can package that exe into a Docker image which doesn't need Go installed, so our Windows registry image will be small and focused.\n\nWe won't install Go and Git on our local machine though, instead we'll use the [Docker Builder pattern](http://blog.terranillius.com/post/docker_builder_pattern/) and package up the toolset into an image we can use to build the registry on any Windows host running Docker.\n\n## Dockerfile for the Registry Builder\n\nThe Dockerfile for the registry builder is in [Dockerfile.builder](Dockerfile.builder), and it's very simple. It begins in the usual way for Windows Dockerfiles - overriding the escape character and specifying PowerShell to use as the command shell:\n\n```Dockerfile\n# escape=`\nFROM golang:windowsservercore\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop';\"]\n```\n\nThe base image is the [official Go image](https://store.docker.com/images/golang) which is in the Docker Store.\n\nThere's a single `CMD` instruction to build the latest version of the registry and copy the built files to a known output location:\n\n```Dockerfile\nCMD go get github.com/docker/distribution/cmd/registry ; `\n    cp \\\"$env:GOPATH\\bin\\registry.exe\\\" c:\\out\\ ; `\n    cp \\\"$env:GOPATH\\src\\github.com\\docker\\distribution\\cmd\\registry\\config-example.yml\\\" c:\\out\\config.yml\n```\n\nWhen we run a container from the builder image, it will compile the latest registry code, and we can map the output location to a directory on the host to get the application files.\n\n## Building the Registry Server\n\nFirst we build the builder image - all the images in this lab use [microsoft/windowsservercore](https://store.docker.com/images/windowsservercore) or [microsoft/nanoserver](https://store.docker.com/images/nanoserver) as the base images, so you can only use a Windows host to build and run them. From a PowerShell session, navigate to the lab folder and build the builder:\n\n```PowerShell\ndocker build -t registry-builder -f Dockerfile.builder .\n```\n\nWhen you first run this command, Docker will download the `sixeyed/golang` image, which will take a while. When it's done, you can create a directory for the application, and run a builder container to build the application and copy it to the host:\n\n```PowerShell\nmkdir registry\ndocker run --rm -v $pwd\\registry:c:\\out registry-builder\n```\n\nNow you'll have two files in the `.\\registry` folder in the lab root:\n\n- `registry.exe` - the standalone registry server application (around 18MB);\n- `config.yml` - a basic configuration file for running a local registry (<1KB).\n\nThese are the files we'll package into a registry server image.\n\n## Dockerfile for the Registry Server\n\nThe [Dockerfile](Dockerfile) for the registry image is also very simple. It starts in the standard way and uses `microsoft/nanoserver` as the base, because we don't need any of the additional features in `microsoft/windowsservercore`:\n\n```Dockerfile\n# escape=`\nFROM microsoft/nanoserver\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop';\"]\n```\n\nNext we set up the integration between the container and the host:\n\n```Dockerfile\nEXPOSE 5000\nENV REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=c:\\\\data\n```\n\nPort 5000 is the default port for the registry, so we make that available from the image, and we specify a value for the `REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY` environment variable. That's where the registry stores all the image layers, and we default to a known location, `c:\\data`.\n\nFinally we copy the applcation files into the working directory and set the startup command:\n\n```Dockerfile\nWORKDIR c:\\\\registry\nCOPY ./registry/ .\nCMD [\"registry\", \"serve\", \"config.yml\"]\n```\n\nTo build the image, we just need to run `docker build`:\n\n```PowerShell\ndocker build -t registry .\n```\n\nThe Docker image for the registry running on Nano Server is 310MB compressed and 830MB uncompressed - of which 810MB is the `microsoft/nanoserver` base layer. \n\n## Next\n\n- [Part 2 - Running a Registry Container](part-2.md)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/registry/part-2.md",
    "content": "# Part 2 - Running a Registry Container\n\nThere are several ways to run a registry container from the image we built in [Part 1](part-1.md). The simplest is to run an insecure registry over HTTP, but for that we need to configure Docker to explicitly allow insecure access to the registry. \n\n## Testing the Registry Image\n\nFirst we'll test that the registry image is working correctly, by running it without any special configuration:\n\n```PowerShell\ndocker run -d -p 5000:5000 --name registry registry\n```\n\nTo use the registry we'll need the IP address of the container:\n\n```PowerShell\n> $ip = docker inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' registry\n> $ip\n172.24.194.96\n```\n\nIn my case, the container IP address is `172.24.194.96`, yours will be different. We'll use that as the domain part of the image name for pushing and pulling images.\n\n## Understanding Image Names\n\nTypically we work with images from the Docker Store, which is the default registry for the Docker Engine. Commands using just the image repository name work fine, like this:\n\n```PowerShell\ndocker pull microsoft/nanoserver\n```\n\n`microsoft/nanoserver` is the repository name, which we are using as a short form of the full image name. The full name is `docker.io/microsoft/nanoserver:latest`. That breaks down into three parts:\n\n- `docker.io` - the hostname of the registry which stores the image;\n- `microsoft/nanoserver` - the repository name, in this case in `{userName}/{imageName}` format;\n- `latest` - the image tag.\n\nIf a tag isn't specified, then the default `latest` is used. If a registry hostname isn't specified then the default `docker.io` for Docker Store is used. If you want to use images with any other registry, you need to explicitly specify the hostname - the default is always Docker Store, you can't change to a different default registry.\n\nWith our local registry, the hostname is the IP address, and we also need to specify the custom port we're using. The full registry address is `172.24.194.96:5000`.\n\n## Configuring Docker for the Insecure Registry\n\nDocker expects all registries to run on HTTPS. In the next part of this lab we will run a secure version of our registry container, but the current version runs on HTTP. If you try to use it, Docker will give you an error message like this:\n\n```\nhttp: server gave HTTP response to HTTPS client\n```\n\nWe need to set up the Docker Engine to explictly use HTTP for our insecure registry. The setting is needed for `dockerd.exe`, which is the Windows version of the Docker engine. In Windows it runs as a Windows Service, so first we need to stop and unregister the service.\n\n> Note. This will kill all your running containers.\n\n```PowerShell\nStop-Service docker\ndockerd --unregister-service\n```\n\nNow we'll re-register the service with custom startup options, adding the IP address of the registry container as an insecure registry, where the engine will use HTTP rather than HTTPS:\n\n```\ndockerd --register-service  -G docker -H npipe:// -H 0.0.0.0:2375 --insecure-registry 172.24.194.96:5000\nStart-Service docker\n```\n\nDocker is running again now, so we can restart the registry container. When we stopped the Docker Windows Service, the container was stopped, but it still exists with the original IP address, so we can just start it again:\n\n```PowerShell\ndocker start registry\n``` \n\nThe registry is running at the expected address, and we've configured Docker to allow access, so we can push and pull images to our local registry, just like we can with Docker Cloud and Docker Store.\n\n## Pushing and Pulling from the Local Registry\n\nDocker uses the hostname from the full image name to determine which registry to use. We can buid images and include the local registry hostname in the image tag, or use the `docker tag` command to add a new tag to an existing image.\n\nThese commands pull a public image from Docker Store, tag it for use in the private registry with the full name `172.24.194.96:5000/labs/hello-world:nanoserver`, and then push it to the registry:\n\n```PowerShell\ndocker pull sixeyed/hello-world:nanoserver\ndocker tag sixeyed/hello-world:nanoserver 172.24.194.96:5000/labs/hello-world:nanoserver\ndocker push 172.24.194.96:5000/labs/hello-world:nanoserver\n```\n\nWhen you push the image to your local registry, you'll see similar output to when you push a public image to the Hub:\n\n```\nThe push refers to a repository [172.24.194.96:5000/labs/hello-world]\nd6826c28b1cd: Pushed\n2c195a33d84d: Skipped foreign layer\n342d4e407550: Skipped foreign layer\nnanoserver: digest: sha256:961497c5ca49dc217a6275d4d64b5e4681dd3b2712d94974b8ce4762675720b4 size: 1149\n```\n\n> Note. The two layers from Microsoft's base image are skipped - they don't get stored in the local registry, because the image is not freely redistributable. Check [GitHub issue 27580](https://github.com/moby/moby/issues/27580) for more information.\n\nOn the local machine, you can remove the new image tag and the original image, and pull it again from the local registry to verify it was correctly stored:\n\n```\ndocker rmi 172.24.194.96:5000/labs/hello-world:nanoserver\ndocker rmi sixeyed/hello-world:nanoserver\ndocker pull 172.24.194.96:5000/labs/hello-world:nanoserver\n```\n\nThat exercise shows the registry we built works correctly, but at the moment it's not very useful because all the image data is stored in the container's writeable storage area, which will be lost when the container is removed. To store the data outside of the container, we need to mount a host directory when we start the container.\n\n## Running a Registry Container with External Storage\n\nLet's get rid of the existing registry container - removing the container also removes its storage layer, so any images you had pushed will be lost:\n\n```PowerShell\ndocker kill registry\ndocker rm registry\n```\n\nWe'll use a host-mounted Docker volume for the new container. When the registry server in the container writes image layer data, it will think it's writing to a local directory in the container but it will actually be writing to a folder on the host.\n\nWe also need to specify the IP address, because we want to use the same IP the previous registry had - that's what our Docker Engine is configured to use, and it's how we've tagged our images. The `-v` option maps the host folder, and the `--ip` option specifies an IP address:\n\n\n```PowerShell\nmkdir c:\\registry-data\ndocker run -d -p 5000:5000 --name registry -v c:\\registry-data:c:\\data --ip 172.24.194.96 registry\n```\n\nRepeat the previous `docker push` command to upload an image to the registry container, and the layers will be stored in the container's `C:\\data` directory, which is actually mapped to the `C:\\registry-data` directory on you local machine. The `tree` command will show you the directory structure the registry server uses:\n\n```\n> &tree c:\\registry-data\nFolder PATH listing for volume Windows 2016\nVolume serial number is A456-8058\nC:\\REGISTRY-DATA\n└───docker\n    └───registry\n        └───v2\n            ├───blobs\n            │   └───sha256\n            │       ├───06\n            │       │   └───06162e188174e2f0b76a2fd507645ca13b3beb43204cccddf82dcb0251e34fb4\n            │       ├───96\n            │       │   └───961497c5ca49dc217a6275d4d64b5e4681dd3b2712d94974b8ce4762675720b4\n...\n```\n\nStoring data outside of the container means we can build a new version of the registry image and replace the old container with a new one using the same host mapping - so the new registry container has all the images stored by the previous container.\n\nThis container is still limited though. The container is accessible externally using the host's IP address, but that's different from the container's IP address - so you need to use different tags and a different engine configuration for external clients.\n\nUsing an insecure registry also isn't practical in multi-user scenarios. Effectively there's no security so anyone can push and pull images if they know the registry hostname. The registry server supports authentication, but only over a secure SSL connection. We'll run a secure version of the registry server in a container next.\n\n## Next\n\n- [Part 3 - Running a Secured Registry Container](part-3.md)"
  },
  {
    "path": "Docker/additional-ressources/windows/registry/part-3.md",
    "content": "# Part 3 - Running a Secured Registry Container\n\nWe saw how to run a simple registry container in [Part 2](part-2.md), using the image we built in [Part 1](part-1.md). The registry server con be configured to serve HTTPS traffic on a known domain, so it's straightforward to run a secure registry for private use with a self-signed SSL certificate.\n\n## Generating the SSL Certificate\n\nThe Docker docs explain how to [generate a self-signed certificate](https://docs.docker.com/registry/insecure/#/using-self-signed-certificates) on Linux using a command like this:\n\n```\nopenssl req \\ \n-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \\ \n-x509 -days 365 -out certs/domain.crt\n```\n\n[OpenSSL](https://www.openssl.org/) is a very popular TLS/SSL toolkit in Linux, but it's less common in Windows. There is a Windows build hosted at [indy.fulgan.com](https://indy.fulgan.com/SSL/), but rather than install it onto our Windows host to run a one-off command, we can use a Docker image with OpenSSL installed.\n\nThe [sixeyed/openssl](https://store.docker.com/community/images/sixeyed/openssl) image on Docker Store is built from this [Dockerfile](https://github.com/sixeyed/dockers-windows/blob/master/openssl/Dockerfile), which just installs and configures OpenSSL on top of the Windows Nano Server base image.\n\nWe can use it to generate the SSL certificate for the registry with Docker:\n\n```PowerShell\nmkdir certs\ndocker run -it --rm -v $pwd\\certs:c:\\certs sixeyed/openssl:nanoserver `\n       req -newkey rsa:4096 -nodes -sha256 -x509 -days 365 `\n       -keyout c:\\certs\\registry.local.key -out c:\\certs\\registry.local.crt `\n       -subj '/CN=registry.local/O=sixeyed/C=GB' \n```\n\nThis will create a certificate file `registry.local.crt`, and a private key file `registry.local.key` in the `certs` subdirectory of the working path. The `-subj` option specifies the details for the domain. This example uses `registry.local` for the common name, which needs to match the hostname address for the registry server. The organization name and country aren't used, but need to be valid values.\n\nNow we have an SSL certificate, we can run a secure registry.\n\n## Running the Registry Securely\n\nThe registry server supports several configuration switches as environment variables, including the details for running securely. We can use the same image we've already used, but configured for HTTPS. \n\nIf you have an insecure registry container still running from [Part 2](part-2.md), remove it:\n\n```PowerShell\ndocker kill registry\ndocker rm registry\n```\n\nFor the secure registry, we need to run a container which has the SSL certificate and key files available, which we'll do with an additional volume mount (so we have one volume for registry data, and one for certs). We also need to specify the location of the certificate files, which we'll do with environment variables:\n\n```PowerShell\ndocker run -d -p 5000:5000 --name registry `\n  -v c:\\registry-data:c:\\data -v $pwd\\certs:c:\\certs `\n  -e REGISTRY_HTTP_TLS_CERTIFICATE=c:\\certs\\registry.local.crt `\n  -e REGISTRY_HTTP_TLS_KEY=c:\\certs\\registry.local.key `\n  registry\n```\n\nThe new parts to this command are:\n\n- `-v $pwd\\certs:c:\\certs` - mount the local `certs` folder into the container, so the registry server can access the certificate and key files;\n- `-e REGISTRY_HTTP_TLS_CERTIFICATE` - specify the location of the SSL certificate file;\n- `-e REGISTRY_HTTP_TLS_KEY` - specify the location of the SSL key file.\n\nWe'll let Docker assign a random IP address to this container, because we'll be accessing it by host name. The registry is running securely now, but we've used a self-signed certificate for an internal domain name, so we need to set up Windows to find the host and trust the certificate.\n\n## Configuring Windows to Access the Registry\n\nThe Docker client uses the security of the host operating system when it accesses an HTTPS registry. Windows doesn't trust self-signed certificates because they weren't created by a trusted Certificate Authority, so Windows will block access to our secure registry.\n\nIn our network we can trust our own certificate, but we'll need to add it to the certificate store in every Windows client machine we want to use with the registry. The `registry.local.crt` file we generated is the public certificate which can be safely distributed - the `registry.local.key` file is the private key which should be kept secure.\n\nThese PowerShell commands will install the certificate onto the Windows host:\n\n```PowerShell\n$cert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2 `\n        $pwd\\certs\\registry.local.crt\n$store = new-object System.Security.Cryptography.X509Certificates.X509Store('Root','localmachine')\n$store.Open('ReadWrite')\n$store.Add($cert)\n$store.Close()\n```\n\n> Note. This installs the self-signed certificate as a trusted CA for all users of the machine. If the private key for your cert is compromised then an attacker could exploit the trust you set up here, by signing malicious services with your certificate.\n\nIf you want to use the registry from other Windows machines, you'll need to distribute the `.crt` fike (**not** the `.key` file), and install the certificate on all client machines.\n\nThe next step is to add a DNS entry for the `registry.local` hostname to point to the container's IP address. The easiest way to do that is by adding an entry to the [hosts](https://en.wikipedia.org/wiki/Hosts_(file)) file:\n\n```PowerShell\nAdd-Content -Path 'C:\\Windows\\System32\\drivers\\etc\\hosts' \"$ip registry.local\"\n```\n\nRemote machines will be able to access the registry container from your Docker host, because we publish the port when the container starts - but the hosts entry will be for the IP address of the machine, not the container.\n\n## Accessing the Secure Registry\n\nWe're ready to run a secure registry now. We want a reliable service, so we'll remove the existing container and start a new one with some more options:\n\n```PowerShell\ndocker kill registry\ndocker rm registry\n\ndocker run -d -p 5000:5000 --name registry `\n  --ip $ip --restart unless-stopped `\n  -v c:\\registry-data:c:\\data -v $pwd\\certs:c:\\certs `\n  -e REGISTRY_HTTP_TLS_CERTIFICATE=c:\\certs\\registry.local.crt `\n  -e REGISTRY_HTTP_TLS_KEY=c:\\certs\\registry.local.key `\n  registry\n```\n\nThe new parts here are:\n\n- `--ip $ip` - specify an explicit IP adress. We're using the IP from the previous container, which is what the address we've mapped to the `registry.local` domain name in the `hosts` file;\n- `--restart unless-stopped` - restart the container when it exits, unless it has been explicity stopped. When the host restarts, Docker will start the registry container, so it's always available.\n\nNow we have a domain name for our registry, the image tags are a lot more flexible - we don't need a specific IP address in the image name. We still tag, push and pull images in the same way:\n\n```PowerShell\ndocker tag sixeyed/hello-world:nanoserver registry.local:5000/labs/hello-world\ndocker push registry.local:5000/labs/hello-world\n```\n\n> Note. You can use any valid DNS name for your registry hostname but there must be at least one period in the name - if there's no period then Docker can't distinguish the hostname part from the repository name. The hostname you use has to match the common name you used when you generated the SSL certificate.\n\nThe IP address for my Docker host is `192.168.2.196`, so on a *different* machine I can map the registry hostname to that address by writing to the host file, and install the certificate which I've copied locally:\n\n```PowerShell\nAdd-Content -Path 'C:\\Windows\\System32\\drivers\\etc\\hosts', \"192.168.2.196 registry.local\"\n\n$cert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2 `\n        c:\\drops\\registry.local.crt\n$store = new-object System.Security.Cryptography.X509Certificates.X509Store('Root','localmachine')\n$store.Open('ReadWrite')\n$store.Add($cert)\n$store.Close()\n```\n\nAnd from that machine (with Docker installed), I can pull the image from the registry container running on the remote machine on my local network:\n\n```PowerShell \n> docker pull registry.local:5000/labs/hello-world\nUnable to find image 'registry.local:5000/labs/hello-world:latest' locally\nlatest: Pulling from labs/hello-world\n\n5496abde368a: Already exists\n94b4ce7ac4c7: Pull complete\n06162e188174: Pull complete\nDigest: sha256:961497c5ca49dc217a6275d4d64b5e4681dd3b2712d94974b8ce4762675720b4\nStatus: Downloaded newer image for registry.local:5000/labs/hello-world:latest\n```\n\nIn this case, the client machine already had one of the Windows Nano Server base layers (`5496a`), but it pulled an update layer from Docker Store (`94b4c`), and it pulled the custom layer for my image from my own registry (`06162`).\n\nWe can go one step further with the open-source registry server, and add basic authentication - so we can require users to securely log in to push and pull images.\n\n## Next\n\n- [Part 4 - Using Basic Authentication with a Secured Registry](part-4.md)"
  },
  {
    "path": "Docker/additional-ressources/windows/registry/part-4.md",
    "content": "# Part 4 - Using Basic Authentication with a Secured Registry\n\nFrom [Part 3](part-3.md) we have a registry running in a Docker container, which we can securely access over HTTPS from any machine in our network. We used a self-signed certificate, which has security implications, but you could buy an SSL from a CA instead, and use that for your registry. With secure communication in place, we can set up user authentication.\n\n## Usernames and Passwords\n\nThe registry server and the Docker client support [basic authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) over HTTPS. The server uses a file with a collection of usernames and encrypted passwords. The file uses a common standard from the Linux world - [Apache htpasswd](https://httpd.apache.org/docs/current/programs/htpasswd.html), but as usual we don't want to install Apache on our local machine to use one tool.\n\nOn the Docker Store, the repository [sixeyed/httpd](https://store.docker.com/community/images/sixeyed/httpd) ([Dockerfile](https://github.com/sixeyed/dockers-windows/blob/master/httpd/Dockerfile)) is configured with Apache and the associated tools already installed. We can use that image to run `htpasswd` and generate the encrypted strings. These commands create a new `auth` subdirectory and a new `registry.htpasswd` file with one set of credentials:\n\n```PowerShell\nmkdir auth\n$creds = docker run --rm sixeyed/httpd:windowsservercore htpasswd -b -n -B elton d0cker\nAdd-Content -Path .\\auth\\registry.htpasswd $creds[0]\n```\n\n> Note. The output from `htpasswd` contains additional whitespace which we need to remove - we only write the first line of output in the text file.\n\nThe [htpasswd options](https://httpd.apache.org/docs/current/programs/htpasswd.html) will create the encrypted password in a suitable format for the registry server:\n\n- `-b` - use bcrypt encryption\n- `-n` - read username and password from the command line\n- `elton` - username\n- `d0cker` - password.\n\nTo add new users, repeat the command to append a new entry to the existing file. This adds a new user `francis`, with password `r3gL4b`:\n\n```PowerShell\n$creds = docker run --rm sixeyed/httpd:windowsservercore htpasswd -nb -B francis r3gL4b \nAdd-Content -Path .\\auth\\registry.htpasswd $creds[0]\n``` \n\nWe can verify the entries have been written by checking the file contents - which should show the usernames in plain text and a cipher text password:\n\n```PowerShell\n> cat .\\auth\\registry.htpasswd\nelton:$2y$05$saIVQ.pV.9EPOsLpNP04puj0Mf9r2wMHeGg/XViGhPfdoxb1oaCPO\nfrancis:$2y$05$CWobimW8aoKSCLf4cp9lGulzAXxPfUIqc452PdArxPfyK8zPEOG9a\n```\n\n## Running an Authenticated Secure Registry\n\nAdding authentication to the registry is a similar process to adding SSL - we need to run the registry with access to the `htpasswd` file on the host, and configure authentication using environment variables.\n\nAs before, we'll remove the existing container and run a new one with authentication configured:\n\n```PowerShell\ndocker kill registry\ndocker rm registry\n\ndocker run -d -p 5000:5000 --name registry `\n  --ip $ip --restart unless-stopped `\n  -v c:\\registry-data:c:\\data -v $pwd\\certs:c:\\certs -v $pwd\\auth:c:\\auth `\n  -e REGISTRY_HTTP_TLS_CERTIFICATE=c:\\certs\\registry.local.crt `\n  -e REGISTRY_HTTP_TLS_KEY=c:\\certs\\registry.local.key `\n  -e REGISTRY_AUTH=htpasswd `\n  -e REGISTRY_AUTH_HTPASSWD_REALM='Registry Realm' `\n  -e REGISTRY_AUTH_HTPASSWD_PATH=c:\\auth\\registry.htpasswd `\n  registry\n```\n\nThe new options for this container are:\n\n- `-v $pwd\\auth:c:\\auth` - mount the local `auth` folder into the container, so the registry server can access `htpasswd` file;\n- `-e REGISTRY_AUTH=htpasswd` - use the registry's `htpasswd` authentication method;\n- `-e REGISTRY_AUTH_HTPASSWD_REALM='Registry Realm'` - specify the authentication realm;\n- `-e REGISTRY_AUTH_HTPASSWD_PATH=c:\\auth\\registry.htpasswd` - specify the location of the `htpasswd` file.\n\nNow the registry is using secure transport and user authentication.\n\n## Authenticating with the Registry\n\nWith basic authentication, users cannot push or pull from the registry unless they are authenticated. If you try and pull an image without authenticating, you will get an error:\n\n```PowerShell\n> docker pull registry.local:5000/labs/hello-world\nUsing default tag: latest\nError response from daemon: Get https://registry.local:5000/v2/labs/hello-world/manifests/latest: no basic auth credentials\n```\n\nThe result is the same for valid and invalid image names, so you can't even check a repository exists without authenticating. Logging in to the registry is the same `docker login` command you use for Docker Store, specifying the registry hostname:\n\n```PowerShell\n> docker login registry.local:5000\nUsername: elton\nPassword:\nLogin Succeeded\n```\n\nIf you use the wrong password or a username that doesn't exist, you get a `401` error message:\n\n```\nError response from daemon: login attempt to https://registry.local:5000/v2/ failed with status: 401 Unauthorized\n```\n\nNow you're authenticated, you can push and pull as before:\n\n```PowerShell\n> docker pull registry.local:5000/labs/hello-world\nUsing default tag: latest\nlatest: Pulling from labs/hello-world\nDigest: sha256:961497c5ca49dc217a6275d4d64b5e4681dd3b2712d94974b8ce4762675720b4\nStatus: Image is up to date for registry.local:5000/labs/hello-world:latest\n```\n\n> Note. The open-source registry does not support the same authorization model as Docker Store or Docker Trusted Registry. Once you are logged in to the registry, you can push and pull from any repository, there is no restriction to limit specific users to specific repositories.\n\n## Conclusion\n\n[Docker Registry](https://docs.docker.com/registry/) is a free, open-source application for storing and accessing Docker images. You can run the registry in a container on your own network, or in a virtual network in the cloud, to host private images with secure access. For Linux hosts, there is an [official registry image](https://store.docker.com/images/registry) on Docker Store, but in this lab we saw how to build and run the registry from the lastest source code, in a Windows container.\n\nWe've covered all the options, from running an insecure registry, through adding SSL to encrypt traffic, and finally adding basic authentication to restrict access. By now you know how to set up a usable registry in your own environment, and you've also used some key Docker patterns - using containers as build agents and to run basic commands, without having to install software on your host machines. \n\nThere is still more you can do with Docker Registry - using a different [storage driver](https://docs.docker.com/registry/storage-drivers/) so the image data is saved to reliable share storage, and setting up your registry as a [caching proxy for Docker Store](https://docs.docker.com/registry/recipes/mirror/) are good next steps."
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/.dockerignore",
    "content": "#SSDT \n\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.sqlproj.user\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/.gitignore",
    "content": "#SSDT \n\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.sqlproj.user\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/Dockerfile.builder",
    "content": "# escape=`\nFROM microsoft/windowsservercore\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop';\"]\n\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 15.0.26228.0 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force\n\nRUN Install-Package nuget.commandline -RequiredVersion 3.5.0 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install Microsoft.Data.Tools.Msbuild -Version 10.0.61026\n\nENV MSBUILD_PATH=\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\MSBuild\\15.0\\Bin\"\n\nRUN $env:PATH = $env:MSBUILD_PATH + ';' + $env:PATH; `\n    [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/Dockerfile.v1",
    "content": "# escape=`\nFROM dockersamples/assets-db-builder AS builder\n\nWORKDIR C:\\src\nCOPY src\\Assets.Database-v1\\ .\nRUN msbuild Assets.Database.sqlproj `\n      /p:SQLDBExtensionsRefPath=\"C:\\Microsoft.Data.Tools.Msbuild.10.0.61026\\lib\\net40\" `\n      /p:SqlServerRedistPath=\"C:\\Microsoft.Data.Tools.Msbuild.10.0.61026\\lib\\net40\"\n\n# db image\nFROM microsoft/mssql-server-windows-express\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop';\"]\n\nVOLUME C:\\database\nENV sa_password D0cker!a8s\n\nWORKDIR C:\\init\nCOPY Initialize-Database.ps1 .\nCMD ./Initialize-Database.ps1 -sa_password $env:sa_password -Verbose\n\nCOPY --from=builder C:\\src\\bin\\Debug\\Assets.Database.dacpac ."
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/Dockerfile.v2",
    "content": "# escape=`\nFROM dockersamples/assets-db-builder AS builder\n\nWORKDIR C:\\src\nCOPY src\\Assets.Database-v2\\ .\nRUN msbuild Assets.Database.sqlproj `\n      /p:SQLDBExtensionsRefPath=\"C:\\Microsoft.Data.Tools.Msbuild.10.0.61026\\lib\\net40\" `\n      /p:SqlServerRedistPath=\"C:\\Microsoft.Data.Tools.Msbuild.10.0.61026\\lib\\net40\"\n\n# db image\nFROM microsoft/mssql-server-windows-express\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop';\"]\n\nVOLUME C:\\database\nENV sa_password D0cker!a8s\n\nWORKDIR C:\\init\nCOPY Initialize-Database.ps1 .\nCMD ./Initialize-Database.ps1 -sa_password $env:sa_password -Verbose\n\nCOPY --from=builder C:\\src\\bin\\Debug\\Assets.Database.dacpac ."
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/Initialize-Database.ps1",
    "content": "# Adapted from Microsoft's SQL Server Express sample:\n# https://github.com/Microsoft/sql-server-samples/blob/master/samples/manage/windows-containers/mssql-server-2016-express-windows/start.ps1\n\nparam(\n    [Parameter(Mandatory=$false)]\n    [string]$sa_password)\n\n# start the service\nWrite-Verbose 'Starting SQL Server'\nstart-service MSSQL`$SQLEXPRESS\n\nif ($sa_password -ne \"_\") {\n\tWrite-Verbose 'Changing SA login credentials'\n    $sqlcmd = \"ALTER LOGIN sa with password='$sa_password'; ALTER LOGIN sa ENABLE;\"\n    Invoke-Sqlcmd -Query $sqlcmd -ServerInstance \".\\SQLEXPRESS\" \n}\n\n# attach data files if they exist: \n$mdfPath = 'c:\\database\\AssetsDB_Primary.mdf'\nif ((Test-Path $mdfPath) -eq $true) {\n    $sqlcmd = \"CREATE DATABASE AssetsDB ON (FILENAME = N'$mdfPath')\"\n    $ldfPath = 'c:\\database\\AssetsDB_Primary.ldf'\n    if ((Test-Path $mdfPath) -eq $true) {\n        $sqlcmd =  \"$sqlcmd, (FILENAME = N'$ldfPath')\"\n    }\n    $sqlcmd = \"$sqlcmd FOR ATTACH;\"\n    Write-Verbose \"Invoke-Sqlcmd -Query $($sqlcmd) -ServerInstance '.\\SQLEXPRESS'\"\n    Invoke-Sqlcmd -Query $sqlcmd -ServerInstance \".\\SQLEXPRESS\"\n}\n\n# deploy or upgrade the database:\n$SqlPackagePath = 'C:\\Program Files (x86)\\Microsoft SQL Server\\130\\DAC\\bin\\SqlPackage.exe'\n& $SqlPackagePath  `\n    /sf:Assets.Database.dacpac `\n    /a:Script /op:create.sql /p:CommentOutSetVarDeclarations=true `\n    /tsn:.\\SQLEXPRESS /tdn:AssetsDB /tu:sa /tp:$sa_password \n\n$SqlCmdVars = \"DatabaseName=AssetsDB\", \"DefaultFilePrefix=AssetsDB\", \"DefaultDataPath=c:\\database\\\", \"DefaultLogPath=c:\\database\\\"  \nInvoke-Sqlcmd -InputFile create.sql -Variable $SqlCmdVars -Verbose\n\n# relay SQL event logs to Docker\n$lastCheck = (Get-Date).AddSeconds(-2) \nwhile ($true) { \n    Get-EventLog -LogName Application -Source \"MSSQL*\" -After $lastCheck | Select-Object TimeGenerated, EntryType, Message\t \n    $lastCheck = Get-Date \n    Start-Sleep -Seconds 2 \n}"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/README.md",
    "content": "# SQL Server Lab\n\nMicrosoft SQL Server is available to run in Docker containers on Linux and Windows. This lab focuses on Windows and shows you how to use Docker to modernize your database delivery — bringing modern practices like CI/CD into database management.\n\nThe SQL Server Express image — [microsoft/mssql-server-windows-express](https://store.docker.com/images/mssql-server-windows-express) — lets you run a SQL Server database in a Docker container on Windows, without having SQL Server installed. All you need is Docker. \n\nIn this lab we'll build a Docker image which packages up a whole database schema on top of the SQL Server image, so when you run the container you have a fully-deployed database ready to use from your applications, or from SQL Server Management Studio. \n\n## What You Will Learn\n\nYou'll learn how to:\n\n- write a Dockerfile to package SQL Server schemas. You'll use SSDT and compile the schema in a database deployment [Dacpac](https://www.simple-talk.com/sql/database-delivery/microsoft-and-database-lifecycle-management-dlm-the-dacpac/) file;\n\n- build a Docker image which packages up SQL Server Express together with your Dacpac, configured to deploy the database when you run a container;\n\n- run a disposable database container, where the data is not saved when the container is removed, which is ideal for automated testing and dev environments\n\n- run a persistent database container with a Docker volume, so the data files are stored outside the container and are retained when the container is removed;\n\n- upgrade the database by building a new image with an updated schema, then replacing the existing container, using the same Docker volume to preserve data.\n\n## Prerequisites\n\nYou'll need Docker running on Windows. You can install [Docker for Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows) on Windows 10, or follow the [Windows Container Lab Setup](https://github.com/docker/labs/blob/master/windows/windows-containers/Setup.md) to install Docker on Windows locally, on AWS and Azure.\n\nYou should be familiar with the key Docker concepts, and with Docker volumes:\n\n- [Docker concepts](https://docs.docker.com/engine/understanding-docker/)\n- [Docker volumes](https://docs.docker.com/engine/tutorials/dockervolumes/)\n\n### Optional\n\nYou'll be using SQL Server Data Tools (\"SSDT\") to build the database schema into a deployable package. An understanding of SSDT and Dacpacs will be useful, but is not required:\n\n- [SQL Server Data Tools - SSDT](https://msdn.microsoft.com/en-us/library/mt204009.aspx)\n- [Data Tier Applications - Dacpac](https://msdn.microsoft.com/en-us/library/ee210546.aspx)\n\nThe build process using Docker **does not use** Visual Studio, but if you want to view or edit the SQL Database project yourself, you'll need Visual Studio 2017. The free [Visual Studio Community Edition](https://www.visualstudio.com/vs/community/) comes with SQL Server Data Tools.\n\n## The Lab\n\n- [Part 1 - Building the Dacpac](part-1.md)\n- [Part 2 - Building the SQL Server Image](part-2.md)\n- [Part 3 - Running the SQL Server Container](part-3.md)\n- [Part 4 - Upgrading the SQL Server Database](part-4.md)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/assets.sql",
    "content": "\n--insert sample assets\n\nINSERT INTO Assets (AssetTypeId, LocationId, PurchaseDate, PurchasePrice, AssetTag, AssetDescription)\nVALUES (1, 1, '2016-11-14', '1999.99', 'SC0001', 'New MacBook with Emoji Bar');\n\nINSERT INTO Assets (AssetTypeId, LocationId, PurchaseDate, PurchasePrice, AssetTag, AssetDescription)\nVALUES (1, 1, '2016-11-14', '800', 'SC0002', 'Logitech Office Cam');\n\n--select assets\n\nSELECT * FROM Assets;"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/build.ps1",
    "content": "\n# Part 1 - build the dacpac\ndocker build -t assets-db-builder -f Dockerfile.builder .\nrmdir -Force -Recurse out\nmkdir out\ndocker run --rm -v $pwd\\out:c:\\bin -v $pwd\\src:c:\\src assets-db-builder\n\n# Part 2 - build the SQL server image\ndocker build -t assets-db ."
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/part-1.md",
    "content": "# Part 1 - Building the Dacpac\n\nIn the source folder there are two Visual Studio solutions each with single SQL Server Data Tools Projects - _Assets.Database-v1_ and _Assets.Database-v2_. They represent two versions of a database schema, used for recording company assets.\n\n## The Database Schema\n\nThe sample schema is deliberately basic, so you can focus on the process. Version 1 contains three tables for storing assets, along with the asset type and location:\n\n![V1 Schema](./img/schema-v1.png)\n\nIn the SSDT project, each table is defined as a `CREATE` statement in a SQL script file, and there are post-deployment scripts to insert static data for known asset types and locations.\n\nYou can publish the project from Visual Studio to create the Dacpac, but using Docker you can build the project using a container without needing Visual Studio installed.\n\n## Docker Multi-stage Builds\n\nYou package applications to run in Docker using a Dockerfile. If you use SQL scripts to deploy your schema, you would write a simple Dockerfile which copies the scripts on top of the SQL Server Express image.\n\nMulti-stage Dockerfiles are for more complex tasks, like in this lab. You'll compile the Dacpac in the first stage of the build, and then bundle the Dacpac on top of SQL Server Express in the second stage.\n\nThat approach means anyone can build and run your database from the source code, they don't need Visual Studio, MSBuild or SQL Server installed - the only prerequisite is Docker. That's perfect for CI scenarios, where you don't need to configure a build server with all the SSDT tools.\n\nInstead you package all the build tools into a Docker image that can be used to generate the Dacpac.\n\n## Dockerfile for the build toolchain \n\nThe first Dockerfile is used for the build stage: [Dockerfile.builder](Dockerfile.builder). It's based from Microsoft's Windows Server Core image, and the Dockerfile uses a `SHELL` instruction to switch to PowerShell in the `RUN` instructions:\n\n```Dockerfile\nFROM microsoft/windowsservercore\nSHELL [\"powershell\"]\n``` \n\nThe Dockerfile goes on to install all the tools needed to build SSDT projects. The majority of the tools are available as [Chocolatey](https://chocolatey.org/) packages, so in the Dockerfile the `RUN` instruction installs Chocolatey, the MSBuild tools, and the .NET 4.5.2 target package:\n\n```Dockerfile\nRUN Install-PackageProvider -Name chocolatey -RequiredVersion 2.8.5.130 -Force; `\n    Install-Package -Name microsoft-build-tools -RequiredVersion 15.0.26228.0 -Force; `\n    Install-Package -Name netfx-4.5.2-devpack -RequiredVersion 4.5.5165101 -Force\n``` \n\n> All the packages are installed with specific versions, so when you build the image you will get the exact same versions of the tools, even if newer versions have been released.\n\nAt this point the Docker image will have all the tools to build basic .NET projects, but for SSDT you also need to install [Microsoft.Data.Tools.Msbuild](https://blogs.msdn.microsoft.com/ssdt/2016/08/22/releasing-ssdt-with-visual-studio-15-preview-4-and-introducing-ssdt-msbuild-nuget-package/), which comes as a NuGet package:\n\n```Dockerfile\nRUN Install-Package nuget.commandline -RequiredVersion 3.5.0 -Force; `\n    & C:\\Chocolatey\\bin\\nuget install Microsoft.Data.Tools.Msbuild -Version 10.0.61026\n```\n\nFinally the Dockerfile adds the build tools to the path, so users of the image can run `msbuild` without specifying a full path:\n\n```\nENV MSBUILD_PATH=\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\MSBuild\\15.0\\Bin\"\n\nRUN $env:PATH = $env:MSBUILD_PATH + ';' + $env:PATH; `\n    [Environment]::SetEnvironmentVariable('PATH', $env:PATH, [EnvironmentVariableTarget]::Machine)\n```\n\nThat's all the installation you need to do. When you build this, you'll have a Docker image you can use to compile any SSDT project.\n\n## Building the build agent\n\nFirst you need to build the builder. Open PowerShell, navigate to the root folder for this lab and run: \n\n```Docker\ndocker image build --tag dockersamples/assets-db-builder --file Dockerfile.builder .\n``` \n\n> You don't have to build the image yourself, you can pull the public version `docker image pull dockersamples/assets-db-builder`.\n\nNow you can use the builder in a multi-stage Dockerfile to publish the database schema, and package it in a custom SQL Server image.\n\n## Next\n\n- [Part 2 - Building the SQL Server Image](part-2.md)"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/part-2.md",
    "content": "# Part 2 - Building the SQL Server Image\n\nYour database image will come packaged with the schema, by compiling the Dacpac with the builder image from [Part 1](part-1.md). With the Dacpac in the final image, you can run containers to create a new database, or to upgrade an existing one.\n\n## Dockerfile for the SQL Server Image\n\n[SQL Server Express](https://www.microsoft.com/en-us/sql-server/sql-server-editions-express) is the free version of SQL Server which is suitable for dev and test environments, and even for production with smaller workloads. Microsoft provide a Docker image with SQL Server Expres installed on Docker Hub: [microsoft/mssql-server-windows-express](https://hub.docker.com/r/microsoft/mssql-server-windows-express/). You will use that as the basis for your database image.\n\nVersion 1 of the schema is packaged in [Dockerfile.v1](Dockerfile.v1), using multi-stage builds. The first stage compiles the Dacpac from the SQL Server Data Tools project. It starts by using the builder from [Part 1](part-1.md), and copying in the V1 source code:\n\n```Dockerfile\nFROM dockersamples/assets-db-builder AS builder\nWORKDIR C:\\src\nCOPY src\\Assets.Database-v1\\ .\n```\n\nThen it runs MSBuild to compile the SQL Project, specifying the tool paths - which are well-known because of the specific versions installed in the builder:\n\n```\nRUN msbuild Assets.Database.sqlproj `\n      /p:SQLDBExtensionsRefPath=\"C:\\Microsoft.Data.Tools.Msbuild.10.0.61026\\lib\\net40\" `\n      /p:SqlServerRedistPath=\"C:\\Microsoft.Data.Tools.Msbuild.10.0.61026\\lib\\net40\"\n```\n\nAfter this completes, the Dacpac will be stored in a temporary image used by the build process, and it can be accessed later in the build. The second stage of the same Dockerfile starts with a new `FROM` instruction, using the SQL Server Express Docker image:\n\n```Dockerfile\nFROM microsoft/mssql-server-windows-express\nSHELL [\"powershell\"]\n```\n\nNext it specifies some configuration points between the container and the host. For a persistent database, you want the database files stored outside of the container in a volume, and you also want to set a default value for the `sa` user password:\n\n```Dockerfile\nVOLUME C:\\database\nENV sa_password D0cker!a8s\n```\n\n> This is a simplified approach to securing SQL Server. The Express instance is set up to allow SQL Server authentication, and an environment variable is used in the image for the `sa` password. Users can override the default password when they run a container, but environment variables are not meant for sensitive data. [Docker secrets](https://github.com/dockersamples/newsletter-signup) are a better option.\n\nThe rest of the Dockerfile is straightforward. It sets up a directory for the deployment package and deployment script, copies the script in from the Docker build context, and sets that as the command to run when a container starts:\n\n```Dockerfile\nWORKDIR C:\\init\nCOPY Initialize-Database.ps1 .\nCMD ./Initialize-Database.ps1 -sa_password $env:sa_password -Verbose\n```\n\nLastly it copies in the Dacpac from the `builder` stage, which contains the complete database schema and scripts to insert reference data:\n\n```Dockerfile\nCOPY --from=builder C:\\src\\bin\\Debug\\Assets.Database.dacpac .\n```\n\nThe script in the `CMD` instruction is what initializes the database using the Dacpac. It does a few things to support running disposable and persistent databases, and enable schema upgrades for containers.\n\n> The script is already written for the lab, the next step just walks you through what it does.\n\n## Initializing the Database\n\nThe SQL Server image you're building supports multiple scenarios:\n\n- starting a new container with an empty database\n- starting a new container using an existing database\n- starting a new container and upgrading an existing database.\n\nWhen users have an existing database, they will run a container with a volume mount, containing their existing `MDF` (data) and `LDF` (log) files. The initialize script first checks if files exist in the expected location. If the files are there, it builds a SQL command to attach the database:\n\n```SQL\nCREATE DATABASE AssetsDB ON \n(FILENAME = N'c:\\database\\AssetsDB_Primary.mdf'), \n(FILENAME = N'c:\\database\\AssetsDB_Primary.ldf')\nFOR ATTACH;\n```\n\nThe filenames are hard-coded, because they will have been created by another instance of this container, so it's safe to use the exact locations. \n\nFor all scenarios, whether the user has attached the database or not, the script uses the [SqlPackage](https://msdn.microsoft.com/en-us/library/hh550080(v=vs.103).aspx) tool to generate a deployment SQL script from the Dacpac in the image:\n\n```PowerShell\nSqlPackage.exe `\n    /sf:Assets.Database.dacpac `\n    /a:Script /op:create.sql /p:CommentOutSetVarDeclarations=true `\n    /tsn:.\\SQLEXPRESS /tdn:AssetsDB /tu:sa /tp:$sa_password \n```\n\nSqlPackage compares the existing database to the schema model in the Dacpac and generates DDL instructions to upgrade the database. If the database doesn't already exist, SqlPackage generates a full deployment script. Otherwise it generates a diff script to bring the schema into line with the Dacpac. In both cases, the post-deployment SQL scripts are appended to the generated script.\n\nThe final intialization step is to run the SQL script, specifying the known database name and file locations, which uses [SQLCMD variables](https://msdn.microsoft.com/en-us/library/ms188714.aspx) and the `Invoke-SqlCmd` cmdlet:\n\n```PowerShell\n$SqlCmdVars = \"DatabaseName=AssetsDB\", \"DefaultFilePrefix=AssetsDB\", \"DefaultDataPath=c:\\database\\\", \"DefaultLogPath=c:\\database\\\"  \nInvoke-Sqlcmd -InputFile create.sql -Variable $SqlCmdVars -Verbose\n```\n\nThat's all packaged into the image, so you can run a container and use the database, without needing to know what happens behind the scenes.\n\n## Building the SQL Server Database Image\n\nTo build the database image, just build the multi-stage Dockerfile:\n\n```PowerShell\ndocker image build --tag dockersamples/assets-db:v1 --file Dockerfile.v1 .\n``` \n\nWhen that command completes you have your schema packaged into a Docker image which is a portable unit. You can share it on the public Docker Hub, or on a private registry like [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/). Anyone who has access can pull the image and run a copy of your database in a container.\n\n## Next\n\n- [Part 3 - Running the SQL Server Container](part-3.md)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/part-3.md",
    "content": "# Part 3 - Running the SQL Server Container\n\nYou now have a Docker image with a SQL schema and deployment script, packaged on top of SQL Server Express. The database image was built in [Part 2](part-2.md), compiling the Dacpac using the builder image from [Part 1](part-1.md). You can use that image to spin up a database container in different ways.\n\n## In Development - Running a Disposable Database\n\nThe image can be used in development environments where a fresh database is needed for working on new app features, and you want to easily reset the data to an initial state. In this scenario you don't want to persist data between containers, you want the database container to be disposable:\n\n```Docker\ndocker container run --detach --name assets-db --publish 1433 dockersamples/assets-db:v1\n```\n\nWhen the container starts it runs the deployment script, finds that there are no existing database files and creates a new database. You can check that by viewing the logs from the container - you'll see the output from the script:\n\n```\n> docker container logs assets-db\n...\nVERBOSE: Creating AssetsDB...\nVERBOSE: Changed database context to 'AssetsDB'.\nVERBOSE: Creating [dbo].[Assets]...\nVERBOSE: Creating [dbo].[AssetTypes]...\nVERBOSE: Creating [dbo].[Locations]...\nVERBOSE: Creating [dbo].[FK_Assets_To_Locations]...\nVERBOSE: Creating [dbo].[FK_Assets_To_AssetTypes]...\n```\n\nYou can connect to the database container using SQL Server Management Studio or any other SQL client. From your Docker machine you need to get the IP address of the container with `docker container inspect`: \n\n```PowerShell\n> docker container inspect --format '{{ .NetworkSettings.Networks.nat.IPAddress }}' assets-db\n172.24.192.132\n```\n\nIn my case the IP address is `172.24.192.132` - yours will be different. From your machine you can connect to the databse container with a SQL client, connecting to that IP address. You need to use SQL Server Authentication with the `sa` credentials, and you should see the `AssetsDB` database listed:\n\n![Connecting to AssetsDB](./img/connection-settings.png)\n\nYou can run some SQL to insert test data like this:\n\n```SQL\nINSERT INTO Assets (AssetTypeId, LocationId, PurchaseDate, PurchasePrice, AssetTag, AssetDescription)\nVALUES (1, 1, '2016-11-14', '1999.99', 'SC0001', 'New MacBook with Emoji Bar');\n\nINSERT INTO Assets (AssetTypeId, LocationId, PurchaseDate, PurchasePrice, AssetTag, AssetDescription)\nVALUES (1, 1, '2016-11-14', '800', 'SC0002', 'Logitech Office Cam');\n```\n\nAnd when you `SELECT` from the `Assets` table you'll see the new rows there. \n\nThe data is being stored in a volume, which means the `MDF` and `LDF` files are somewhere on the the host's disk. But if you forcibly remove the container, the volume will be removed when the container stops - so this is a disposable database container, the new data won't survive beyond the life of the container. \n\nYou can see that when you remove the container, and start a new one with the same configuration as the original:\n\n```PowerShell\ndocker container rm --force assets-db\n\ndocker container run --detach --publish 1433 --name assets-db dockersamples/assets-db:v1\n```\n\nInspect this container with `docker container inspect` and you'll see it has a new IP address - this is a whole new container. Connect your SQL client, repeat the `SELECT * FROM Assets` query and you'll see the table is empty - the old data was lost when you removed the container, and its volume was removed. The new container starts with a new database.\n\n## In Test - Running a Persistent Database\n\nTo store the data permanently, you can map the database volume to a location on the host. The first time you run a container, it will create the data and log files in the host directory. When you replace the container and use the same volume mount, the new container will attach the existing database and the data is preserved.  \n\nThe `docker container run` command is essentially the same, you just use the `--volume` option to mount a volume. [Mounting a host directory as a volume](https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume) means that when processes in a container think they're accessing files on the local filesystem, it's actually a symlink and the files are on the host. In this case, when SQL Server uses the `MDF` file in `C:\\databases` in the container, it's actually using the file in `C:\\mssql` on the host:\n\n```PowerShell\ndocker container rm --force assets-db\n\nmkdir C:\\mssql\n\ndocker container run -d -p 1433 --name assets-db --volume C:\\mssql:C:\\database dockersamples/assets-db:v1\n```\n\nWhen the container has started, you can verify that the new database is created and the files are written to the host directory by listing the contents on the host:\n\n```PowerShell\n> ls C:\\mssql\n\n    Directory: C:\\mssql\n\nMode                LastWriteTime         Length Name\n----                -------------         ------ ----\n-a----       25/09/2017     16:20        8388608 AssetsDB_Primary.ldf\n-a----       25/09/2017     16:20        8388608 AssetsDB_Primary.mdf\n```\n\nNow you can inspect the container to get its IP address, connect and insert rows into the `Assets` table. The data will be stored outside of the container, in the directory on the host. You can replace the container without changing the schema - say you rebuild it with a new version of the base image to get the latest Windows updates. As long as you use the same volume mapping as the previous container, you'll retain all the data:\n\n```PowerShell\ndocker container rm -f assets-db\n\ndocker container run -d -p 1433 --name assets-db --volume C:\\mssql:C:\\database dockersamples/assets-db:v1\n```\n\nThis is a new container with a new file system, but the database location is mapped to the same host directory as the previous container. The setup script still runs, but it finds no differences in the current database schema and the schema definition in the Dacpac, so there's no diff script to apply.\n\nWhen the new container starts it attaches the database so all the existing data is available. You can check that by executing a query in a SQL client, or by running one in the container directly:\n\n```PowerShell\n> docker container exec assets-db powershell -Command \"Invoke-SqlCmd -Query 'SELECT * FROM Assets' -Database AssetsDB\"\n\nAssetId          : 1\nAssetTypeId      : 1\nLocationId       : 1\nPurchaseDate     : 11/14/2016 12:00:00 AM\nPurchasePrice    : 1999.99\nAssetTag         : SC0001\nAssetDescription : New MacBook with Emoji Bar\n\nAssetId          : 2\nAssetTypeId      : 1\nLocationId       : 1\nPurchaseDate     : 11/14/2016 12:00:00 AM\nPurchasePrice    : 800.00\nAssetTag         : SC0002\nAssetDescription : Logitech Office Cam\n```\n\n## In Production - Using Shared Storage\n\nFor production databases you can use exactly the same image and the same principle as for test environments, but you may want to use a different type of volume mount. \n\nIn small-scale single-host scenarios, you can mount your database volume from a RAID array on the local server. That gives you data redundancy but not process redundancy - if you lose a disk you won't lose data, but if the server goes down your database won't be accessible.\n\nIn high-availability scenarios, you'll need process redundancy too, so if the server hosting your database container goes down, you can spin up a new container on a different server, but retain all the committed data. That means using a shared storage driver, where the database directory is available from multiple servers, so you can map the same volume from any host.\n\nDocker has a [volume plugin framework](https://docs.docker.com/engine/extend/plugins_volume/) which third parties can use to support Docker volumes on their shared storage solutions. The plugin you choose depends on your infrastructure, but the [volume plugin list](https://docs.docker.com/engine/extend/legacy_plugins/#/volume-plugins) has support for:\n- [vSphere storage](https://github.com/vmware/docker-volume-vsphere)\n- [NetApp](https://github.com/NetApp/netappdvp)\n- [Azure File Storage](https://github.com/Azure/azurefile-dockervolumedriver)\n- [Google Cloud](https://github.com/mcuadros/gce-docker)\n- [HPE 3Par](https://github.com/hpe-storage/python-hpedockerplugin/) \n\nand lots more.\n\n## Next\n\n- [Part 4 - Upgrading the SQL Server Database](part-4.md)"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/part-4.md",
    "content": "# Part 4 - Upgrading the SQL Server Database\n\nIn [Part 3](part-3.md) you saw different ways of running the image you built in [Part 2](part-2.md), which packaged the Dacpac generated with the builder from [Part 1](part-1.md). By using the Dacpac to deploy the database, you can support many scenarios using the same Docker image, and you also have a process to upgrade the database schema in a consistent and reliable way.\n\n## Changing the Database schema\n\nDatabases evolve as the apps they support evolve - new tables are added, columns are dropped, column definitions change. You can use [change scripts](https://www.infoq.com/articles/db-versioning-scripts) to incrementally update a schema, but with static scripts the target database needs to be in the expected state. If the target database [drifts](https://www.simple-talk.com/blogs/tackling-the-problem-of-database-version-drift/), then the change scripts may fail or behave unexpectedly.\n\nSQL Server's Dacpac approach is much cleaner. It contains a model of the desired state of the schema, and you use the SqlPackage tool to generate the change scripts for a target database immediately before you apply them, so the upgrade will always be from the current state to the desired state. \n\nIn this lab you use the Dacpac to underly the fundamental components for a CI/CD pipeline for database upgrades. You just need to change the source code, rebuild and redeploy. In version 2 of the schema, there's a new `Users` table and some aditional columns in the `Assets` table:\n\n![Database schema, version 2](./img/schema-v2.png)\n\nThe builder image from [Part 1](part-1.md) is fine for building version 2 of the schema, there are no changes that need different build tools. To package the new image, build [Dockerfile.v2](Dockerfile.v2). The Dockerfile is exactly the same, except that it builds V2 of the database schema.\n\n> The v1 and v2 Dockerfiles are used to illustrate a schema change over time. In a real project, you would have a single Dockerfile in the source code along with your SQL Project.\n\nYou can build a new database image and tag it as version 2 of the schema:\n\n```PowerShell\ndocker image build --tag dockersamples/assets-db:v2 --file Dockerfile.v2 .\n```\n...\n\n## Upgrading the Database container\n\nNow you have two images locally, each packaging a separate version of the database schema. The container is running `v1` of the schema. To upgrade the database, you replace the existing database container and spin up a new one from the `v2` image, using the same volume mount as the `v1` container. You can use the same commands from [Part 3](part-3.md), but using the new image tag:\n\n```PowerShell\ndocker container rm -f assets-db\n\ndocker container run -d -p 1433 --name assets-db -v C:\\mssql:C:\\database dockersamples/assets-db:v2\n```\n\nWhen this new container starts, the init script attaches the existing data files and runs `SqlPackage`. Noe the schema is different from the Dacpac, so the tool generates a diff script to apply. Then it runs the script to update the schema - you can see the output in `docker container logs`:\n\n```\n> docker container logs assets-db\n...\nVERBOSE: Altering [dbo].[Assets]...\nVERBOSE: Creating [dbo].[Users]...\nVERBOSE: Creating [dbo].[FK_Assets_To_Users]...\n```\n\nThe container retains the upgrade script which `SqlPackage` generates, and you can read it from the container to see the exact SQL statements that were used in the upgrade:\n\n ```PowerShell\n docker container exec assets-db powershell cat C:\\init\\create.sql\n ```\n\nFor the v2 upgrade the script is 150+ lines of SQL, containing the DDL to update the schema, and the DML post-deployment scripts. The DDL includes the table changes and the new table, as in this snippet:\n\n ```SQL \nALTER TABLE [dbo].[Assets] ALTER COLUMN [AssetDescription] NVARCHAR (500) NULL;\nGO\n\nALTER TABLE [dbo].[Assets]\n    ADD [OwnerUserId] INT NULL;\nGO\n\nPRINT N'Creating [dbo].[Users]...';\nGO\n\nCREATE TABLE [dbo].[Users] (\n    [UserId]     INT           IDENTITY (1, 1) NOT NULL,\n    [FirstName]  NVARCHAR (50) NULL,\n    [LastName]   NVARCHAR (50) NULL,\n    [LocationId] INT           NULL,\n    [UserName]   NVARCHAR (50) NOT NULL,\n    PRIMARY KEY CLUSTERED ([UserId] ASC)\n);\nGO\n```\n\nIf you repeat those steps to remove the existing database container and create a new one using the same Docker volume, the upgrade script won't have any DDL changes the next time round. The schema has already been upgraded, so it matches the model in the Dacpac.\n\n## Conclusion\n\nDocker containers are equally well suited to stateful workloads like databases, as they are to stateless workloads like Web servers. The Docker platform supports integration between the container and the host at the network level, so consumers can connect to your database as though it were running in a dedicated machine. And the platform supports integration at the data level with many different storage providers, so you can persist your database files outside the running container, in highly-available shared storage.\n\nSQL Server's Dacpac model is a perfect mechanism for creating a packaged Docker image which contains the database schema and reference data scripts, but not the actual data files. In this lab we saw how to create a database image with a packaged Dacpac which can be used in dev, QA and production environments. We also saw how to use the builder pattern with MSBuild to create the database image. This is the foundation for a database CI/CD pipeline which you can use to build, deploy and run SQL Server databases using Docker on Windows - without needing Visual Studio, MSBuild or SQL Server installed on your machines."
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Assets.Database.refactorlog",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Operations Version=\"1.0\" xmlns=\"http://schemas.microsoft.com/sqlserver/dac/Serialization/2012/02\">\n  \n</Operations>"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Assets.Database.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}\") = \"Assets.Database\", \"Assets.Database.sqlproj\", \"{837785BF-E932-45E8-A8E5-C08C32A3387C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Release|Any CPU.Deploy.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Assets.Database.sqlproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"4.0\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <Name>Assets.Database</Name>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectVersion>4.1</ProjectVersion>\n    <ProjectGuid>{837785bf-e932-45e8-a8e5-c08c32a3387c}</ProjectGuid>\n    <DSP>Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider</DSP>\n    <OutputType>Database</OutputType>\n    <RootPath>\n    </RootPath>\n    <RootNamespace>Assets.Database</RootNamespace>\n    <AssemblyName>Assets.Database</AssemblyName>\n    <ModelCollation>1033, CI</ModelCollation>\n    <DefaultFileStructure>BySchemaAndSchemaType</DefaultFileStructure>\n    <DeployToDatabase>True</DeployToDatabase>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <TargetLanguage>CS</TargetLanguage>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <SqlServerVerification>False</SqlServerVerification>\n    <IncludeCompositeObjects>True</IncludeCompositeObjects>\n    <TargetDatabaseSet>True</TargetDatabaseSet>\n    <TargetFrameworkProfile />\n    <GenerateCreateScript>True</GenerateCreateScript>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>\n    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <DefineDebug>false</DefineDebug>\n    <DefineTrace>true</DefineTrace>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <DefineDebug>true</DefineDebug>\n    <DefineTrace>true</DefineTrace>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">11.0</VisualStudioVersion>\n    <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->\n    <SSDTExists Condition=\"Exists('$(MSBuildExtensionsPath)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\SSDT\\Microsoft.Data.Tools.Schema.SqlTasks.targets')\">True</SSDTExists>\n    <VisualStudioVersion Condition=\"'$(SSDTExists)' == ''\">11.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Condition=\"'$(SQLDBExtensionsRefPath)' != ''\" Project=\"$(SQLDBExtensionsRefPath)\\Microsoft.Data.Tools.Schema.SqlTasks.targets\" />\n  <Import Condition=\"'$(SQLDBExtensionsRefPath)' == ''\" Project=\"$(MSBuildExtensionsPath)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\SSDT\\Microsoft.Data.Tools.Schema.SqlTasks.targets\" />\n  <ItemGroup>\n    <Folder Include=\"Properties\" />\n    <Folder Include=\"Schema Objects\" />\n    <Folder Include=\"Scripts\" />\n    <Folder Include=\"Scripts\\PostDeployment\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Build Include=\"Schema Objects\\Assets.sql\" />\n    <Build Include=\"Schema Objects\\AssetTypes.sql\" />\n    <Build Include=\"Schema Objects\\Locations.sql\" />\n  </ItemGroup>\n  <ItemGroup>\n    <RefactorLog Include=\"Assets.Database.refactorlog\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PostDeploy Include=\"Scripts\\Script.PostDeployment.sql\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Scripts\\PostDeployment\\InsertLocations.sql\" />\n    <None Include=\"Scripts\\PostDeployment\\InsertAssetTypes.sql\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Schema Objects/AssetTypes.sql",
    "content": "﻿CREATE TABLE [dbo].[AssetTypes]\n(\n\t[AssetTypeId] INT NOT NULL PRIMARY KEY IDENTITY, \n    [AssetTypeDescription] NVARCHAR(50) NOT NULL\n)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Schema Objects/Assets.sql",
    "content": "﻿CREATE TABLE [dbo].[Assets]\n(\n\t[AssetId] INT NOT NULL PRIMARY KEY IDENTITY, \n    [AssetTypeId] INT NOT NULL, \n    [LocationId] INT NOT NULL, \n    [PurchaseDate] DATE NULL, \n    [PurchasePrice] DECIMAL(9, 2) NULL, \n    [AssetTag] NVARCHAR(50) NULL, \n    [AssetDescription] NVARCHAR(50) NULL, \n    CONSTRAINT [FK_Assets_To_AssetTypes] FOREIGN KEY ([AssetTypeId]) REFERENCES [AssetTypes]([AssetTypeId]),\n\tCONSTRAINT [FK_Assets_To_Locations] FOREIGN KEY ([LocationId]) REFERENCES [Locations]([LocationId])\n)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Schema Objects/Locations.sql",
    "content": "﻿CREATE TABLE [dbo].[Locations]\n(\n\t[LocationId] INT NOT NULL PRIMARY KEY IDENTITY, \n    [Country] NVARCHAR(50) NOT NULL, \n    [PostalCode] NVARCHAR(50) NULL, \n    [AddressLine1] NVARCHAR(500) NULL\n)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Scripts/PostDeployment/InsertAssetTypes.sql",
    "content": "﻿IF NOT EXISTS (SELECT TOP 1 1 FROM AssetTypes)\nBEGIN\n\n    INSERT INTO [dbo].[AssetTypes] (AssetTypeDescription)\n    VALUES ('Laptop')\n\n    INSERT INTO [dbo].[AssetTypes] (AssetTypeDescription)\n    VALUES ('Monitor')\n\n    INSERT INTO [dbo].[AssetTypes] (AssetTypeDescription)\n    VALUES ('Phone')\n\nEND\nGO"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Scripts/PostDeployment/InsertLocations.sql",
    "content": "﻿IF NOT EXISTS (SELECT TOP 1 1 FROM Locations)\nBEGIN\n\n    INSERT INTO [dbo].[Locations] (Country, PostalCode, AddressLine1)\n    VALUES ('USA', 'DC 20500', '1600 Pennsylvania Ave NW')\n\n    INSERT INTO [dbo].[Locations] (Country, PostalCode, AddressLine1)\n    VALUES ('UK', 'SW1A 0AA', 'Houses of Parliament')\n\nEND\nGO"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v1/Scripts/Script.PostDeployment.sql",
    "content": "﻿\nUSE [$(DatabaseName)];\n\n:r .\\PostDeployment\\InsertAssetTypes.sql\n:r .\\PostDeployment\\InsertLocations.sql"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Assets.Database.refactorlog",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Operations Version=\"1.0\" xmlns=\"http://schemas.microsoft.com/sqlserver/dac/Serialization/2012/02\">\n \n</Operations>"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Assets.Database.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}\") = \"Assets.Database\", \"Assets.Database.sqlproj\", \"{837785BF-E932-45E8-A8E5-C08C32A3387C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{837785BF-E932-45E8-A8E5-C08C32A3387C}.Release|Any CPU.Deploy.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Assets.Database.sqlproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"4.0\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <Name>Assets.Database</Name>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectVersion>4.1</ProjectVersion>\n    <ProjectGuid>{837785bf-e932-45e8-a8e5-c08c32a3387c}</ProjectGuid>\n    <DSP>Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider</DSP>\n    <OutputType>Database</OutputType>\n    <RootPath>\n    </RootPath>\n    <RootNamespace>Assets.Database</RootNamespace>\n    <AssemblyName>Assets.Database</AssemblyName>\n    <ModelCollation>1033, CI</ModelCollation>\n    <DefaultFileStructure>BySchemaAndSchemaType</DefaultFileStructure>\n    <DeployToDatabase>True</DeployToDatabase>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <TargetLanguage>CS</TargetLanguage>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <SqlServerVerification>False</SqlServerVerification>\n    <IncludeCompositeObjects>True</IncludeCompositeObjects>\n    <TargetDatabaseSet>True</TargetDatabaseSet>\n    <TargetFrameworkProfile />\n    <GenerateCreateScript>True</GenerateCreateScript>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>\n    <TreatWarningsAsErrors>False</TreatWarningsAsErrors>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <DefineDebug>false</DefineDebug>\n    <DefineTrace>true</DefineTrace>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <DefineDebug>true</DefineDebug>\n    <DefineTrace>true</DefineTrace>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">11.0</VisualStudioVersion>\n    <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->\n    <SSDTExists Condition=\"Exists('$(MSBuildExtensionsPath)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\SSDT\\Microsoft.Data.Tools.Schema.SqlTasks.targets')\">True</SSDTExists>\n    <VisualStudioVersion Condition=\"'$(SSDTExists)' == ''\">11.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Condition=\"'$(SQLDBExtensionsRefPath)' != ''\" Project=\"$(SQLDBExtensionsRefPath)\\Microsoft.Data.Tools.Schema.SqlTasks.targets\" />\n  <Import Condition=\"'$(SQLDBExtensionsRefPath)' == ''\" Project=\"$(MSBuildExtensionsPath)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\SSDT\\Microsoft.Data.Tools.Schema.SqlTasks.targets\" />\n  <ItemGroup>\n    <Folder Include=\"Properties\" />\n    <Folder Include=\"Schema Objects\" />\n    <Folder Include=\"Scripts\" />\n    <Folder Include=\"Scripts\\PostDeployment\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Build Include=\"Schema Objects\\Assets.sql\" />\n    <Build Include=\"Schema Objects\\AssetTypes.sql\" />\n    <Build Include=\"Schema Objects\\Locations.sql\" />\n    <Build Include=\"Schema Objects\\Users.sql\" />\n  </ItemGroup>\n  <ItemGroup>\n    <RefactorLog Include=\"Assets.Database.refactorlog\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PostDeploy Include=\"Scripts\\Script.PostDeployment.sql\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Scripts\\PostDeployment\\InsertLocations.sql\" />\n    <None Include=\"Scripts\\PostDeployment\\InsertAssetTypes.sql\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Schema Objects/AssetTypes.sql",
    "content": "﻿CREATE TABLE [dbo].[AssetTypes]\n(\n\t[AssetTypeId] INT NOT NULL PRIMARY KEY IDENTITY, \n    [AssetTypeDescription] NVARCHAR(50) NOT NULL\n)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Schema Objects/Assets.sql",
    "content": "﻿CREATE TABLE [dbo].[Assets]\n(\n\t[AssetId] INT NOT NULL PRIMARY KEY IDENTITY, \n    [AssetTypeId] INT NOT NULL, \n    [LocationId] INT NOT NULL, \n    [PurchaseDate] DATE NULL, \n    [PurchasePrice] DECIMAL(9, 2) NULL, \n    [AssetTag] NVARCHAR(50) NULL, \n    [AssetDescription] NVARCHAR(50) NULL, \n    [OwnerUserId] INT NULL, \n    CONSTRAINT [FK_Assets_To_AssetTypes] FOREIGN KEY ([AssetTypeId]) REFERENCES [AssetTypes]([AssetTypeId]),\n\tCONSTRAINT [FK_Assets_To_Locations] FOREIGN KEY ([LocationId]) REFERENCES [Locations]([LocationId]), \n    CONSTRAINT [FK_Assets_To_Users] FOREIGN KEY ([OwnerUserId]) REFERENCES [Users]([UserId])\n)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Schema Objects/Locations.sql",
    "content": "﻿CREATE TABLE [dbo].[Locations]\n(\n\t[LocationId] INT NOT NULL PRIMARY KEY IDENTITY, \n    [Country] NVARCHAR(50) NOT NULL, \n    [PostalCode] NVARCHAR(50) NULL, \n    [AddressLine1] NVARCHAR(500) NULL\n)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Schema Objects/Users.sql",
    "content": "﻿CREATE TABLE [dbo].[Users] (\n    [UserId]     INT           IDENTITY (1, 1) NOT NULL,\n    [FirstName]  NVARCHAR (50) NULL,\n    [LastName]   NVARCHAR (50) NULL,\n    [LocationId] INT           NULL,\n    [UserName]   NVARCHAR (50) NOT NULL,\n    PRIMARY KEY CLUSTERED ([UserId] ASC)\n)"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Scripts/PostDeployment/InsertAssetTypes.sql",
    "content": "﻿IF NOT EXISTS (SELECT TOP 1 1 FROM AssetTypes)\nBEGIN\n\n    INSERT INTO [dbo].[AssetTypes] (AssetTypeDescription)\n    VALUES ('Laptop')\n\n    INSERT INTO [dbo].[AssetTypes] (AssetTypeDescription)\n    VALUES ('Monitor')\n\n    INSERT INTO [dbo].[AssetTypes] (AssetTypeDescription)\n    VALUES ('Phone')\n\nEND\nGO"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Scripts/PostDeployment/InsertLocations.sql",
    "content": "﻿IF NOT EXISTS (SELECT TOP 1 1 FROM Locations)\nBEGIN\n\n    INSERT INTO [dbo].[Locations] (Country, PostalCode, AddressLine1)\n    VALUES ('USA', 'DC 20500', '1600 Pennsylvania Ave NW')\n\n    INSERT INTO [dbo].[Locations] (Country, PostalCode, AddressLine1)\n    VALUES ('UK', 'SW1A 0AA', 'Houses of Parliament')\n\nEND\nGO"
  },
  {
    "path": "Docker/additional-ressources/windows/sql-server/src/Assets.Database-v2/Scripts/Script.PostDeployment.sql",
    "content": "﻿\nUSE [$(DatabaseName)];\n\n:r .\\PostDeployment\\InsertAssetTypes.sql\n:r .\\PostDeployment\\InsertLocations.sql"
  },
  {
    "path": "Docker/additional-ressources/windows/windows-containers/MultiContainerApp.md",
    "content": "## Multi-Container Applications\n\nThis tutorial walks you through building and running the sample Album Viewer application with Windows containers. The [Album Viewer](https://github.com/RickStrahl/AlbumViewerVNext) app is an ASP.NET Core application, maintained by Microsoft MVP [Rick Strahl](https://weblog.west-wind.com). There is a fork at [dockersamples/dotnet-album-viewer](https://github.com/dockersamples/dotnet-album-viewer \"link to forked version of Album Viewer\") which uses Docker Windows containers.\n\n> Docker isn't just for new apps built with .NET Core. You can run full .NET Framework apps in Docker Windows containers, with production support in [Docker EE](https://www.docker.com/enterprise-edition). Check out the labs for [Modernizing .NET apps with Docker](https://github.com/docker/labs/tree/master/windows/modernize-traditional-apps).\n\n## Using Docker Compose on Windows\n\n[Docker Compose](https://docs.docker.com/compose/) is a great way develop distributed applications, where all the components run in their own containers. In this lab you'll use Docker Compose to run SQL Server in a container, as the data store for an ASP.NET Core web application running in another container.\n\nDocker Compose is installed with [Docker for Windows](https://www.docker.com/docker-windows). If you've installed Docker as a Windows Service instead, you can download the compose command line using PowerShell:\n\n```\nInvoke-WebRequest https://github.com/docker/compose/releases/download/1.16.0/docker-compose-Windows-x86_64.exe -UseBasicParsing -OutFile $env:ProgramFiles\\docker\\docker-compose.exe\n```\n\nTo run the sample application in multiple Docker Windows containers, start by cloning the GithUb [dockersamples/dotnet-album-viewer](https://github.com/dockersamples/dotnet-album-viewer/) repository:\n\n```\ngit clone https://github.com/dockersamples/dotnet-album-viewer.git\n```\n\nThe [Dockerfile for the application](https://github.com/dockersamples/dotnet-album-viewer/blob/master/docker/app/Dockerfile) uses [Docker multi-stage builds](https://docs.docker.com/engine/userguide/eng-image/multistage-build/), where the app is compiled inside a container and then packaged into a Docker image. That means you don't need .NET Core installed on your machine to build and run the app from source:\n\n```\ncd dotnet-album-viewer\ndocker-compose build\n```\n\nYou'll see a lot of output here. Docker will pull the .NET Core images if you don't already have them, then it will run `dotnet restore` and `dotnet build` inside a container. You will see the usual NuGet and MSBuild output, even if you don't have the SDK installed.\n\nWhen the build completes, run the app with:\n\n```\ndocker-compose up -d\n```\n\nDocker starts a database container using Microsoft's [SQL Server Express Windows image](https://store.docker.com/images/mssql-server-windows-express), and when the database is running it starts the application container. The database and application containers are in the same Docker network, so they can reach each other.\n\nThe container for the web application maps to port 80 on the host, so from a different machine you can browse to your host address and see the site:\n\n![ASP.NET Core Album Viewer app running in a Docker Windows container](images/dotnet-album-viewer.png)\n\nIf you're working on the host, you need to browse to the container's IP address. You can find it with `docker container inspect`:\n\n```\ndocker container inspect -f \"{{ .NetworkSettings.Networks.nat.IPAddress }}\" dotnetalbumviewer_app_1\n172.21.124.54\n```\n\n### Organizing Distributed Solutions with Docker Compose\n\nTake a closer look at the [docker-compose.yml](https://github.com/dockersamples/dotnet-album-viewer/blob/master/docker-compose.yml) file. There are two [services](https://docs.docker.com/compose/compose-file/#service-configuration-reference) defined, which are the different components of the app that will run in Docker containers. The first is the SQL Server database:\n\n```\n  db:\n    image: microsoft/mssql-server-windows-express\n    environment:\n      sa_password: \"DockerCon!!!\"\n      ACCEPT_EULA: \"Y\"\n```\n\nThis uses Microsoft SQL Server Express, which runs as a Docker Windows container. Express edition has a production licence, so you can use it for live applications. The environment settings configure the database, setting the password for the `sa` user account, and accepting the licence agreement. \n\nThe second service is the ASP.NET Core web application, which uses the custom image you built at the start of the lab:\n\n```\n  app:\n    image: dockersamples/dotnet-album-viewer\n    build:\n      context: .\n      dockerfile: docker/app/Dockerfile\n    environment:\n      - \"Data:useSqLite=false\"\n      - \"Data:SqlServerConnectionString=Server=db;Database=AlbumViewer;User Id=sa;Password=DockerCon!!!;MultipleActiveResultSets=true;App=AlbumViewer\"\n    depends_on:\n      - db\n    ports:\n      - \"80:80\"\n```\n\nThe [build](https://docs.docker.com/compose/compose-file/#build) details capture the path to the Dockerfile. The environment variables are used to configure the app - they override the settings in [appsettings.json](https://github.com/dockersamples/dotnet-album-viewer/blob/master/src/AlbumViewerNetCore/appsettings.json). This configuration uses SQL Server rather than the default SQLite database, and sets the connection string to use the SQL Server container.\n\n> In the database connection string, the server name is `db` - which is the name of the service for the SQL container. Docker has service discovery built-in, so when the app tries to connect using the server name `db`, Docker will direct it to the database container. \n\nThe app definition also captures the [dependency](https://docs.docker.com/compose/compose-file/#depends_on) on the database server, and publishes port 80 so any traffic coming into the host gets directed by Docker into the container.\n\n\n## Packaging ASP.NET Core apps in Docker\n\nHow can you compile and run this app without .NET Core installed? Docker compiles and runs the app using containers. The tasks are in the [Dockerfile](https://github.com/dockersamples/dotnet-album-viewer/blob/master/docker/app/Dockerfile), which captures all the app dependencies so the only pre-requisite you need is Docker. The first stage in the Dockerfile publishes the app:\n\n```\nFROM microsoft/dotnet:2.0.0-sdk-nanoserver AS builder\nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nWORKDIR /album-viewer\nCOPY AlbumViewerNetCore.sln .\nCOPY src/AlbumViewerNetCore/AlbumViewerNetCore.csproj src/AlbumViewerNetCore/AlbumViewerNetCore.csproj\nCOPY src/AlbumViewerBusiness/AlbumViewerBusiness.csproj src/AlbumViewerBusiness/AlbumViewerBusiness.csproj\nCOPY src/Westwind.Utilities/Westwind.Utilities.csproj src/Westwind.Utilities/Westwind.Utilities.csproj\nRUN dotnet restore\n\nCOPY src src\nRUN dotnet publish .\\src\\AlbumViewerNetCore\\AlbumViewerNetCore.csproj\n```\n\nThis uses Microsoft's [.NET Core Docker image](https://store.docker.com/images/dotnet) as the base in the `FROM` instruction. It uses a specific version of the image, with the .NET Core 2.0.0 SDK installed, running on Microsoft Nano Server. Then the `COPY` instructions copy the project files and solution files into the image, and the `RUN` instruction executes `dotnet restore` to restore packages.\n\nDocker caches parts of the image as it build them, and this Dockerfile separates out the restore part to take advantage of that. Unless the solution or project files change, Docker will re-use the image layer with the dependencies already restored, saving time on the `dotnet restore` operation.\n\nAfter the restore, the rest of the source code is copied into the image and Docker runs `dotnet publish` to compile and publish the app.\n\nThe final stage in the Dockerfile packages the published application:\n\n```\n# app image\nFROM microsoft/aspnetcore:2.0.0-nanoserver \nSHELL [\"powershell\", \"-Command\", \"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';\"]\n\nWORKDIR /album-viewer\nCOPY --from=builder /album-viewer/src/AlbumViewerNetCore/bin/Debug/netcoreapp2.0/publish/ .\nCMD [\"dotnet\", \"AlbumViewerNetCore.dll\"]\n```\n\nThis uses a different base image, which is optimized for running [ASP.NET Core](https://store.docker.com/community/images/microsoft/aspnetcore) apps. It has the .NET Core runtime, but not the SDK, and the ASP.NET core packages are already installed. The `COPY` instruction copies the published .NET Core app from the previous stage in the Dockerfile (called `builder`), and the `CMD` instruction tells Docker how to start the app.\n\nThe Dockerfile syntax is simple. You only need to learn a handful of instructions to build production-grade Docker images. Inside the Dockerfile, you can use PowerShell to deploy MSIs, update Windows Registry settings, set file permissions and do anything else you need.\n\n\n## Next Steps\n\nThis lab walked you through building and running a simple .NET Core web application using Docker Windows containers. Take a look at some more Windows container labs to see how your existing apps can be moved into Docker:\n\n* [SQL Server](https://github.com/docker/labs/blob/master/windows/sql-server/README.md)\n* [Modernizing ASP.NET apps - for devs](https://github.com/docker/labs/tree/master/windows/modernize-traditional-apps/modernize-aspnet)\n* [Modernizing ASP.NET apps - for IT Pros](https://github.com/docker/labs/tree/master/windows/modernize-traditional-apps/modernize-aspnet-ops)\n"
  },
  {
    "path": "Docker/additional-ressources/windows/windows-containers/README.md",
    "content": "﻿## Getting Started with Windows Containers\n\nIn September 2016, Microsoft announced the general availability of Windows Server 2016, and with it, Docker engine running containers natively on Windows. This tutorial describes how to get setup to run Docker Windows Containers on Windows 10 or using a Windows Server 2016 VM.\n\nIf you are developing locally, you must be running Windows 10 pro or Windows 2016 in a virtual machine to be able to use this tutorial.\n\nIf you're using a cloud VM, you must use Windows 2016 VM.\n\n\nThis tutorial consists of three parts:\n\n1. [Setup](Setup.md \"Setup\"): Making sure your development environment is properly set-up to work with Windows Containers.\n2. [Getting Started with Windows Containers](WindowsContainers.md \"Getting Started with Windows Containers\"): The basics of Windows Containers.\n3. [Multi-Container Applications](MultiContainerApp.md \"Multi-Container Applications\"): Using [Docker Compose](https://docker.github.io/compose/ \"Docker Compose\") to launch a website based on Microsoft SQL Server.\n"
  },
  {
    "path": "Docker/additional-ressources/windows/windows-containers/Setup-AWS.md",
    "content": "# Setup - AWS\n\nThis chapter explores setting up a Windows environment to properly use Windows containers on Amazon Web Services (AWS).\n\n\n## Windows Server 2016 on AWS\n\nAWS has a pre-baked AMI with Docker Engine already installed. To start an instance, do the following (requires AWS account):\n\n1. Open the [EC2 launch-instance wizard](https://us-west-1.console.aws.amazon.com/ec2/v2/home#LaunchInstanceWizard)\n2. Select the \"Microsoft Windows Server 2016 Base with Containers\" AMI\n3. Input setup parameters\n    - `c4.large` has good performance for development and testing\n    - The default AWS security group settings will let you connect with Remote Desktop\n4. Select \"Review and Launch\"\n5. Once the VM is up, hit \"Connect\". If using macOS, get the free [Remote Desktop app in the Mac App Store](https://itunes.apple.com/us/app/microsoft-remote-desktop/id715768417?mt=12)\n6. See details on [getting the initial Windows Administrator password for your AWS instance](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html)\n7. Start PowerShell\n8. Check that Docker is running with `docker version`\n\n![Connecting to AWS Virtual Machine](images/aws-connect.PNG)\n\n\n# Next Steps\nSee the [Microsoft documentation for more comprehensive instructions](https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome \"Microsoft documentation\").\n\nContinue to Step 2: [Getting Started with Windows Containers](WindowsContainers.md \"Getting Started with Windows Containers\")\n"
  },
  {
    "path": "Docker/additional-ressources/windows/windows-containers/Setup-Azure.md",
    "content": "# Setup - Azure\n\nThis chapter explores setting up a Windows environment to properly use Windows containers on Microsoft Azure.\n\n\n## Windows Server 2016 on Azure\n\nMicrosoft Azure has a pre-baked VM image with Docker engine and base images pre-loaded. To get started (requires Azure account):\n\n 1. Create a [Windows Server 2016 Datacenter - with Containers](https://azure.microsoft.com/en-us/marketplace/partners/microsoft/windowsserver2016datacenterwithcontainers/) VM. This VM image has Docker pre-installed and the Windows base layers pre-loaded.\n 2. Select \"Classic\" deployment model and hit \"Create\"\n 3. Input setup parameters\n    - Default settings are good\n    - Creating a new resource group is fine\n    - `DS2_V2` instance type has good performance for development and testing\n 4. Check the Summary and hit \"OK\". Setup will take a couple of minutes\n 5. Once the VM is running, select \"Connect\" to open a remote desktop connection. If using macOS, get the free [Remote Desktop app in the Mac App Store](https://itunes.apple.com/us/app/microsoft-remote-desktop/id715768417?mt=12)\n 6. Login with the username and password configured during setup\n 7. Start PowerShell\n 8. `Start-Service docker`\n 9. Check that Docker is running with `docker version`\n\n![Creating Azure Virtual Machine](images/Azure-ws2016-Create-Virtual-Machine.PNG)\n\n![Connecting to Azure Virtual Machine](images/Azure-ws2016-Connect.PNG)\n\n# Next Steps\nSee the [Microsoft documentation for more comprehensive instructions](https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome \"Microsoft documentation\").\n\nContinue to Step 2: [Getting Started with Windows Containers](WindowsContainers.md \"Getting Started with Windows Containers\")\n"
  },
  {
    "path": "Docker/additional-ressources/windows/windows-containers/Setup-Server2016.md",
    "content": "# Setup - Windows Server 2016\n\nThis chapter explores setting up a Windows environment to properly use Windows containers on Windows Server 2016, on bare metal or in VM.\n\n## Windows Server 2016 on bare metal or in VM\n\nWindows Server 2016 is where Docker Windows containers should be deployed for production. For developers planning to do lots of Docker Windows container development, it may also be worth setting up a Windows Server 2016 dev system (in a VM, for example), at least until Windows 10 and Docker for Windows support for Windows containers matures. Running a VM with Windows Server 2016 is also a great way to do Docker Windows container development on macOS and older Windows versions.\n\nOnce Windows Server 2016 is running, log in, run Windows Update (use `sconfig` on Windows Server Core) to ensure all the latest updates are installed and install the Windows-native Docker Engine (that is, don't use \"Docker for Windows\"). There are two options: Install using a Powershell Package (recommended) or with DSC.\n\n### PowerShell Package Provider (recommended)\n\nMicrosoft maintains a [PowerShell package provider](https://www.powershellgallery.com/packages/DockerMsftProvider) that lets easily install Docker on Windows Server 2016.\n\nRun the following in an Administrative PowerShell prompt:\n\n```\nInstall-Module -Name DockerMsftProvider -Force\nInstall-Package -Name docker -ProviderName DockerMsftProvider -Force\nRestart-Computer -Force\n```\n\n### PowerShell Desired State Configuration\n\nIf interested in experimenting with [Windows PowerShell Desired State Configuration](https://msdn.microsoft.com/en-us/powershell/dsc/overview), Daniel Scott-Raynsford has built a [prototype script that uses DSC to install Docker Engine](https://www.powershellgallery.com/packages/Install-DockerOnWS2016UsingDSC/1.0.1/DisplayScript). \n\nHere's how to use it:\n\n```\nInstall-Script -Name Install-DockerOnWS2016UsingDSC\nInstall-DockerOnWS2016UsingDSC.ps1\n```\n\nSee Daniel's blog post for [details on installing Docker with DCS](https://dscottraynsford.wordpress.com/2016/10/15/install-docker-on-windows-server-2016-using-dsc/).\n\nWhether using the PowerShell Package Provider or DSC, Docker Engine is now running as a Windows service, listening on the default Docker named pipe.\n\nFor development VMs running (for example) in a Hyper-V VM on Windows 10, it might be advantageous to make the Docker Engine running in the Windows Server 2016 VM available to the Windows 10 host:\n\n    # Open firewall port 2375\n    netsh advfirewall firewall add rule name=\"docker engine\" dir=in action=allow protocol=TCP localport=2375\n    \n    # Configure Docker daemon to listen on both pipe and TCP (replaces docker --register-service invocation above)\n    Stop-Service docker\n    dockerd --unregister-service\n    dockerd -H npipe:// -H 0.0.0.0:2375 --register-service\n    Start-Service docker\n\nThe Windows Server 2016 Docker engine can now be used from the VM host by setting `DOCKER_HOST`:\n`$env:DOCKER_HOST = \"<ip-address-of-vm>:2375\"`\n\n# Next Steps\nSee the [Microsoft documentation for more comprehensive instructions](https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome \"Microsoft documentation\").\n\nContinue to Step 2: [Getting Started with Windows Containers](WindowsContainers.md \"Getting Started with Windows Containers\")\n"
  },
  {
    "path": "Docker/additional-ressources/windows/windows-containers/Setup-Win10.md",
    "content": "# Setup - Windows 10\n\nThis chapter explores setting up a Windows environment to properly use Windows containers on Windows 10.\n\n## Windows 10 with Anniversary Update\n\nFor developers, Windows 10 is a great place to run Docker Windows containers and containerization support was added to the Windows 10 kernel with the [Anniversary Update](https://blogs.windows.com/windowsexperience/2016/08/02/how-to-get-the-windows-10-anniversary-update/) (note that container images can only be based on Windows Server Core and Nanoserver, not Windows 10). All that’s missing is the Windows-native Docker Engine and some image base layers.\n\nThe simplest way to get a Windows Docker Engine is by installing the [Docker for Windows](https://docs.docker.com/docker-for-windows/ \"Docker for Windows\") public beta ([direct download link](https://download.docker.com/win/beta/InstallDocker.msi)). Docker for Windows used to only setup a Linux-based Docker development environment, but the public beta version now sets up both Linux and Windows Docker development environments, and we’re working on improving Windows container support and Linux/Windows container interoperability.\n\nWith the public beta installed, the Docker for Windows tray icon has an option to switch between Linux and Windows container development.\n\n![Image of switching between Linux and Windows development environments](images/docker-for-windows-switch.gif \"Image of switching between Linux and Windows development environments\")\n\n# Next Steps\nSee the [Microsoft documentation for more comprehensive instructions](https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome \"Microsoft documentation\").\n\nContinue to Step 2: [Getting Started with Windows Containers](WindowsContainers.md \"Getting Started with Windows Containers\")\n"
  },
  {
    "path": "Docker/additional-ressources/windows/windows-containers/Setup.md",
    "content": "﻿# Setup\n\nThere are four environments you can use to set-up Windows Containers. We have provided separate guides for each:\n\n+ [Windows 10 with the Anniversary Update](Setup-Win10.md \"Windows 10 Setup\")\n+ [Windows Server 2016 on Azure](Setup-Azure.md \"MS Azure Setup\")\n+ [Windows Server 2016 on AWS](Setup-AWS.md \"AWS Setup\")\n+ [Windows Server 2016 on bare metal or in VM](Setup-Server2016.md \"Setup on Windows 2016\")\n\n# Next Steps\nSee the [Microsoft documentation for more comprehensive instructions](https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome \"Microsoft documentation\").\n\nAfter you have completed setup, you can continue to Step 2: [Getting Started with Windows Containers](WindowsContainers.md \"Getting Started with Windows Containers\")\n"
  },
  {
    "path": "Docker/additional-ressources/windows/windows-containers/WindowsContainers.md",
    "content": "## Getting Started with Windows Containers\n\nThis chapter will cover the basics of using Windows Containers with Docker.\n\n## Running Windows containers\n\nFirst, make sure the Docker installation is working correctly by running `docker version`. The output should tell you the basic details about your Docker environment:\n\n```\n> docker version\nClient:\n Version:      17.06.1-ee-1\n API version:  1.30\n Go version:   go1.8.3\n Git commit:   4dd6e94\n Built:        Sat Aug 12 01:34:13 2017\n OS/Arch:      windows/amd64\n\nServer:\n Version:      17.06.1-ee-1\n API version:  1.30 (minimum version 1.24)\n Go version:   go1.8.3\n Git commit:   4dd6e94\n Built:        Sat Aug 12 02:14:08 2017\n OS/Arch:      windows/amd64\n Experimental: true\n```\n> The `OS/Arch` field tells you the operating system you're using. Docker is cross-platform, so you can manage Windows Docker servers from a Linux client and vice-versa, using the same `docker` commands.\n\nNext, pull a Docker image which you can use to run a Windows container:\n\n```\ndocker image pull microsoft/windowsservercore\n```\n\nThis downloads Microsoft's [Windows Server Core](https://store.docker.com/images/windowsservercore) Docker image onto your environment. That image is a full deployment of Windows Server 2016 Core edition (with no UI), packaged to run as a Docker container. You can use it as the base for your own apps, or you can run containers from it directly.\n\nTry a simple container, passing a command for the container to run:\n\n```\ndocker container run microsoft/windowsservercore hostname\n69c7de26ea48\n```\n\nThis runs a new container from the Windows Server Core image, and tells it to run the `hostname` command. The output is the machine name of the container, which is actually a random ID set by Docker. Repeat the command and you'll see a different host name every time.\n\n## Building and pushing Windows container images\n\nYou package your own apps in Docker by building a Docker image. You share the app by pushing the image to a registry - it could be a public registry like [Docker Cloud](https://cloud.docker.com), or a private registry running in your own environment like [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/). Anyone with access to your image can pull it and run containers - just like you did with Microsoft's public Windows Server Core image.\n\nPushing images to Docker Cloud requires a [free Docker ID](https://cloud.docker.com/ \"Click to create a Docker ID\"). Storing images on Docker Cloud is a great way to share applications, or to create build pipelines that move apps from development to production with Docker.\n\nRegister for an account, and then save your Docker ID in a variable in your PowerShell session. We will use it in the rest of the lab:\n\n```\n$dockerId = '<your-docker-id>'\n```\n\n> Be sure to use your own Docker ID here. Mine is `sixeyed`, so the command I run is `$dockerId = 'sixeyed'`.\n\nDocker images are built with the [docker image build](https://docs.docker.com/engine/reference/commandline/image_build/ \"docker image build reference\") command, using a simple script called a [Dockerfile](https://docs.docker.com/engine/reference/builder/ \"Dockerfile reference\"). The Dockerfile describes the complete deployment of your application and all its dependencies.\n\nYou can generate a very simple Dockerfile with PowerShell:\n\n```\n'FROM microsoft/windowsservercore' | Set-Content Dockerfile\n'CMD echo Hello World!' | Add-Content Dockerfile\n```\n\nAnd now run `docker image build`, giving the image a tag which identifies it with your Docker ID:\n\n```\ndocker image build --tag $dockerId/hello-world .\n```\n\nRun a container from the image, and you'll see it just executes the instruction from the `CMD` line:\n\n```\ndocker container run $dockerId/hello-world\nHello World!\n```\n\nNow you have a Docker image for a simple Hello World app. The image is the portable unit - you can push the image to Docker Cloud, and anyone can pull it and run your app for themselves. First run `docker login` with your credentials, to authenticate with the registry. Then push the image:\n\n```\ndocker image push $dockerId/hello-world\n```\n\nImages stored on Docker Cloud are available in the web interface and public images can be pulled by other Docker users.\n\n### Next Steps\n\nContinue to Step 3: [Multi-Container Applications](MultiContainerApp.md \"Multi-Container Applications\"), to see how to build and run a web application which uses a SQL Server database - all using Docker Windows containers.\n"
  },
  {
    "path": "Docker/kickstart/chapters/alpine.md",
    "content": "# Our First Containers\n\nThe wait is finally over. It's time to roll up our sleeves and start our first container. Get Ready.\n\n> **Tasks**:\n>\n> - [Task 1: Run our First Container](#task-1-running-your-first-container)\n> - [Task 2: Run an Interactive Container](#task-2-run-an-interactive-ubuntu-container)\n> - [Task 3: Run a background MariaDB container](#task-3-run-a-background-mariadb-container)\n> - [Terminology Covered in this section](#terminology)\n\n## Task 1: Running your first container\n\nNow that Docker is set up, it's time to get our hands dirty. In this section, you will run an [Alpine Linux](http://www.alpinelinux.org/) container (a lightweight Linux distribution) on your system and get hands-on with the `docker container run` command.\n\n1. To get started, let's run the following in our terminal:\n\n   ```\n   $ docker image pull alpine\n   Unable to find image 'alpine:latest' locally\n   latest: Pulling from library/alpine\n   88286f41530e: Pull complete\n   Digest: sha256:f006ecbb824d87947d0b51ab8488634bf69fe4094959d935c0c103f4820a417d\n   Status: Downloaded newer image for alpine:latest\n   ```\n\n> **Note:** Depending on how you've installed docker on your system, you might see a `permission denied` error after running the above command. Try the commands from the Getting Started tutorial to [verify your installation](https://docs.docker.com/engine/getstarted/step_one/#/step-3-verify-your-installation). If you're on Linux, you may need to prefix your `docker` commands with `sudo`. Alternatively you can [create a docker group](https://docs.docker.com/engine/installation/linux/ubuntulinux/#/create-a-docker-group) to get rid of this issue.\n\n2. The `pull` command fetches the alpine **image** from the **Docker registry** and saves it in your system. You can use the `docker image ls` command to see a list of all images on your system.\n\n   ```\n   $ docker image ls\n\n   REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE\n   alpine                  latest              3fd9065eaf02        2 weeks ago         4.15MB\n   hello-world             latest              f2a91732366c        2 months ago        1.85kB\n   ```\n\n### Run a single-task Alpine Linux Container\n\n1. Great! Let's now run a Docker **container** based on this image. To do that, you use the `docker container run` command.\n\n   ```\n   $ docker container run alpine hostname\n\n   888e89a3b36\n\n   ```\n\nWhat happened? Behind the scenes, a lot of stuff happened. When you call `docker container run`,\n\n1. The Docker client contacts the Docker daemon to check if the alpine image is available locally; if not, it downloads it from Docker Hub. (Since we have issued `docker pull alpine` before, the download step is not necessary)\n1. The Docker daemon creates the container and then runs a command in that container\n1. The Docker daemon streams the output of the command to the Docker client\n\nWhen you run `docker container run alpine hostname`, you provided the command (`hostname`). Docker then started the container, executed the specified command in this container, and returned its hostname (`888e89a3b36``).\n\n1. Docker keeps a container running as long as the process started inside the container is still running. In this case, the hostname process completes when the output is written, so the container exits. The Docker platform doesn't delete resources by default, so the container still exists in the Exited state.\n\n   List all containers:\n\n   ```\n   $ docker container ls -a\n   CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS            PORTS               NAMES\n   888e89a3b36b        alpine              \"hostname\"          50 seconds ago      Exited (0) 49 seconds ago             awesome_elion\n   ```\n\n   Notice that your Alpine Linux container is in the `Exited` state.\n\n   Note: The container ID is the hostname that the container displayed. In the example above, it's 888e89a3b36b\n\nContainers that do one task and then exit can be handy. You could build a Docker image that executes a script to configure something. Anyone can perform that task just by running the container - they don't need the actual scripts or configuration information.\n\n1. Let's try something more exciting.\n\n   ```\n   $ docker container run alpine echo \"hello from alpine\"\n   hello from alpine\n   ```\n\n   OK, that's some actual output. In this case, the Docker client ran the `echo` command inside our alpine container and exited it. If you've noticed, all of that happened pretty quickly. Compare the same process to booting up a virtual machine, running a command, and then killing it. Now you know why they say containers are fast!\n\n1. Try another command:\n\n   ```\n   $ docker container run alpine /bin/sh\n   ```\n\n   Wait, nothing happened! Is that a bug? Well, no. These interactive shells will exit after running any scripted commands unless they run in an interactive terminal - so for this example to not exit, you need to run:\n\n   ```\n   $ docker container run -it alpine /bin/sh\n   ```\n\nYou are now inside the container shell, and you can try out a few commands like `ls -l`, `uname -a`, and others. Exit out of the container by giving the `exit` command.\n\n1. Now it's time to see the `docker container ls` or the shortcut `docker ps` command. The `docker container ls` command shows you all containers that are currently running.\n\n   ```\n   $ docker container ls\n   CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n   ```\n\n1. Since no containers are running, you see a blank line. Let's try a more helpful variant: `docker container ls -a`\n\n   ```\n   $ docker container ls -a\n   CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES\n   36171a5da744        alpine              \"/bin/sh\"                5 minutes ago       Exited (0) 2 minutes ago                        fervent_newton\n   a6a9d46d0b2f        alpine              \"echo 'hello from alp\"   6 minutes ago       Exited (0) 6 minutes ago                        lonely_kilby\n   ff0a5c3750b9        alpine              \"ls -l\"                  8 minutes ago       Exited (0) 8 minutes ago                        elated_ramanujan\n   c317d0a9e3d2        hello-world         \"/hello\"                 34 seconds ago      Exited (0) 12 minutes ago                       stupefied_mcclintock\n   ```\n\n1. You see above a list of all the containers that you ran. Notice that the `STATUS` column shows these containers exited a few minutes ago. You're probably wondering if there is a way to run more than just one command in a container. Let's try that now:\n\n   ```\n   $ docker container run -it alpine /bin/sh\n   / # ls\n   bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var\n   / # uname -a\n   Linux 97916e8cb5dc 4.4.27-moby #1 SMP Wed Oct 26 14:01:48 UTC 2016 x86_64 Linux\n   ```\n\n   Type `exit` or `CTRL-D` to exit the interactive container. Once we exit the container, it will also exit and stop.\n\n   Running the `run` command with the `-it` flags attaches us to an interactive tty in the container. Now, you can run as many commands in the container as you want. Take some time to run your favorite commands.\n\nThat concludes a whirlwind tour of the `docker container run` command, which you'll often use. It makes sense to spend some time getting comfortable with it. To find out more about `run`, use `docker container run --help` to see a list of all flags it supports. As you proceed, we'll see a few more variants of `docker container run`.\n\n## Task 2: Run an interactive Ubuntu container\n\nYou can run a container based on a different version of Linux than what is running on your Docker host.\n\nIn the following example, we will run an Ubuntu Linux container.\n\n1. Run a Docker container and access its shell.\n\n   In this case we're giving the `docker container run` command three parameters:\n\n   - `--interactive` says you want an interactive session\n   - `--tty` allocates a pseudo-tty\n   - `--rm` tells Docker to go ahead and remove the container when it's done executing\n\n   The first two parameters allow you to interact with the Docker container.\n\n   We're also telling the container to run `bash` as its main process (PID 1).\n\n   ```\n   $ docker container run --interactive --tty --rm ubuntu bash\n   ```\n\n   When the container starts, you'll drop into the bash shell with the default prompt `root@<container id>:/#`. Docker has attached to the shell in the container, relaying input and output between your local session and the shell session in the container.\n\n2. Run some commands in the container:\n\n   - `ls /` - lists the contents of the root directory\n   - `ps aux` - shows all running processes in the container.\n   - `cat /etc/issue` - shows which Linux distro the container is running, in this case Ubuntu 16.04.3 LTS\n\n3. Type `exit` to leave the shell session. This will terminate the `bash` process, causing your container to exit.\n\n   > **Note:** As we used the `--rm` flag when we started the container, Docker removed that container when it stopped. This means if you run another `docker container ls --all` you won't see the Ubuntu container.\n\n4. For fun, let's check the version of our host VM\n\n   ```\n   $ cat /etc/issue\n\n   Ubuntu 16.04.3 LTS \\n \\l\n   ```\n\n   Notice that our host VM is Ubuntu, yet we can run an Ubuntu container. As previously mentioned, the distribution of Linux in the container does not need to match the distribution of Linux running on the Docker host.\n\nInteractive containers are helpful when you are putting together your image. You can run a container, verify all the steps you need to deploy your app and capture them in a Dockerfile.\n\n> **Note:** You _can_ [commit](https://docs.docker.com/engine/reference/commandline/commit/) a container to make an image from it - but you should avoid that wherever possible. It's much better to use a repeatable [Dockerfile](https://docs.docker.com/engine/reference/builder/) to build your image. You'll see that shortly.\n\n5. To exit the shell of the Ubuntu container:\n\n   ```\n   $ exit\n   ```\n\nWe can exit the TTY of the container by typing `exit` or `CTRL-D`\n\n## Task 3: Run a background MariaDB container\n\nBackground containers are how you'll run most applications. Here's a simple example using MariaDB.\n\n1. Let's run MariaDB in the background using the `--detach` flag. We'll also use the `--name` flag to name the running container `mydb`.\n\n   We'll also use an environment variable (`--env`) to set the root password (NOTE: **DON'T DO THIS IN PRODUCTION**):\n\n   ```\n   $ docker container run \\\n   --detach \\\n   --name mydb \\\n   --env MARIADB_ROOT_PASSWORD=my-secret-pw \\\n   mariadb:latest\n\n   Unable to find image 'mariadb:latest' locally\n   latest: Pulling from library/mariadb\n   6c7698a779f6: Pull complete\n   c3beef926275: Pull complete\n   <Snip>\n   fbc99aa6f426: Pull complete\n   Digest: sha256:dd51b32c5c5c6ed56019bb92f48b4f749287208b1b903ac61ef1efa6c2ae2410\n   Status: Downloaded newer image for mariadb:latest\n   762950d93224b25b465167a5b9862cd208d5d4577715aa4dc05b36f898a8b9b0\n   ```\n\n   Once again, the requested image was unavailable locally, so Docker pulled it from Docker Hub.\n\n   As long as the MariaDB process runs, Docker will keep the container running in the background.\n\n2. List running containers\n\n   ```\n   $ docker container ls\n   CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS            NAMES\n   3f4e8da0caf7        mariadb:latest      \"docker-entrypoint...\"   52 seconds ago      Up 51 seconds       3306/tcp         mydb\n   ```\n\n   Notice your container is running\n\n3. You can check what's happening in your containers by using a couple of built-in Docker commands: `docker container logs` and `docker container top`\n\n   ```\n   $ docker container logs mydb\n   <output truncated>\n   2023-06-15  8:29:26 0 [Note] Server socket created on IP: '0.0.0.0'.\n   2023-06-15  8:29:26 0 [Note] Server socket created on IP: '::'.\n   2023-06-15  8:29:26 0 [Note] mariadbd: ready for connections.\n   Version: '11.0.2-MariaDB-1:11.0.2+maria~ubu2204'  socket: '/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution\n   ```\n\n   This shows the logs from your Docker container.\n\n   Let's look at the running processes inside the container.\n\n   ```\n   $ docker container top mydb\n   UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD\n   999                 23256               23229               0                   08:29               ?                   00:00:00            mariadbd\n   ```\n\n   You should see the MariaDB demon (`mariadbd`) is running. Note that the PID shown here is the PID for this process on your docker host. To see the same `mariadbd` process running as the main process of the container (PID 1) try:\n\n   ```\n   $ docker container exec mydb ps -ef\n   UID        PID  PPID  C STIME TTY          TIME CMD\n   mysql        1     0  0 08:29 ?        00:00:00 mariadbd\n   root       139     0  0 08:30 ?        00:00:00 ps -ef\n   ```\n\n   > **Note:** If the `ps` command is not install, you can install it with the following command: `apt update && apt install -y procps`\n\n   Although MariaDB runs, it is isolated within the container because no network ports have been published to the host. Network traffic cannot reach containers from the host unless ports are explicitly published.\n\n4. List the MariaDB version using `docker container exec`.\n\n   `docker container exec` allows you to run a command inside a container. In this example, we'll use `docker container exec` to run the command-line equivalent of `mariadb --user=root --password=$MARIADB_ROOT_PASSWORD --version` inside our MariaDB container.\n\n   ```\n   $ docker container exec -it mydb \\\n   mariadb --user=root --password=$MARIADB_ROOT_PASSWORD --version\n\n   mariadb from 11.0.2-MariaDB, client 15.2 for debian-linux-gnu (aarch64) using  EditLine wrapper\n   ```\n\n   The output above shows the MariaDB version number, as well as a handy warning.\n\n5. You can also use `docker container exec` to connect to a new shell process inside an already-running container. The command below will give you an interactive shell (`sh`) in your MariaDB container.\n\n   ```\n   $ docker exec -it mydb sh\n   #\n   ```\n\n   Notice that your shell prompt has changed. This is because your shell is now connected to the `sh` process running inside of your container.\n\n6. Let's check the version number by running the same command we passed to the container in the previous step.\n\n   ```\n   # mariadb --user=root --password=$MARIADB_ROOT_PASSWORD --version\n\n   mariadb from 11.0.2-MariaDB, client 15.2 for debian-linux-gnu (aarch64) using  EditLine wrapper\n   ```\n\n   Notice the output is the same as before.\n\n7. Type `exit` to leave the interactive shell session.\n\n   Your container will still be running. This is because the `docker container exec` command started a new `sh` process. When you typed `exit`, you exited the `sh` process and left the `mariadbd` process still running.\n\nLet's clean up for the next lab.\n\n8. Stop the MariaDB container\n\n   ```\n   $ docker container stop mydb\n   ```\n\n9. Remove the MariaDB container\n\n   ```\n   $ docker container rm mydb\n   ```\n\n10. Delete the MariaDB image\n\n    ```\n    $ docker image rm mariadb\n    ```\n\n## Terminology\n\nIn the last section, you saw a lot of Docker-specific jargon that might confuse some. So, before you go further, let's clarify some terminology used frequently in the Docker ecosystem.\n\n- _Images_ - The file system and configuration of our application, which are used to create containers. To learn more about a Docker image, run `docker image inspect alpine`. You used the `docker image pull` command to download the **alpine** image. When you executed the command `docker container run hello-world`, it also did a `docker image pull` behind the scenes to download the **hello-world** image.\n- _Containers_ - Running instances of Docker images &mdash; containers run the actual applications. A container includes an application and all of its dependencies. It shares the kernel with other containers and runs as an isolated process in user space on the host OS. You created a container using `docker container run`, which you did using the alpine image you downloaded. You can see a list of running containers by using the `docker container ps` command.\n- _Docker daemon_ - The background service running on the host, that manages building, running and distributing Docker containers.\n- _Docker client_ - The command line tool that allows the user to interact with the Docker daemon.\n- _Docker Hub_ - A [registry](https://hub.docker.com/) of Docker images where you can find trusted and enterprise-ready containers, plugins, and Docker editions. You'll be using this later in this tutorial.\n\n## Next Steps: Webapps with Docker\n\nFor the next step in the tutorial, head over to [Webapps with Docker - Part One](./webapps-part1.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/bridge-network.md",
    "content": "# Bridge networking\n\n\nIn this lab you'll learn how to build, manage, and use **bridge** networks.\n\nYou will complete the following steps as part of this lab.\n\n- [Task 1 - The default **bridge** network](#Task_1)\n- [Task 2 - Connect a container to the default *bridge* network](#Task_2)\n- [Task 3 - Test the network connectivity](#Task_3)\n- [Task 4 - Configure NAT for external access](#Task_4)\n\n## Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker host running Docker 1.12 or higher\n- The lab was built and tested using Ubuntu 16.04\n\n## <a name=\"Task_1\"></a>Task 1: The default **bridge** network\n\nEvery clean installation of Docker comes with a pre-built network called **bridge**. Verify this with the `docker network ls` command.\n\n```\n$ docker network ls\nNETWORK ID          NAME                DRIVER              SCOPE\n1befe23acd58        bridge              bridge              local\n726ead8f4e6b        host                host                local\nef4896538cc7        none                null                local\n```\n\nThe output above shows that the **bridge** network is associated with the *bridge* driver. It's important to note that the network and the driver are connected, but they are not the same. In this example the network and the driver have the same name - but they are not the same thing!\n\nThe output above also shows that the **bridge** network is scoped locally. This means that the network only exists on this Docker host. This is true of all networks using the *bridge* driver - the *bridge* driver provides single-host networking.\n\nAll networks created with the *bridge* driver are based on a Linux bridge (a.k.a. a virtual switch).\n\nInstall the `brctl` command and use it to list the Linux bridges on your Docker host.\n\n```\n# Install the brctl tools\n\n$ apt-get install bridge-utils\n<Snip>\n\n# List the bridges on your Docker host\n\n$ brctl show\nbridge name     bridge id               STP enabled     interfaces\ndocker0         8000.0242f17f89a6       no\n```  \n\nThe output above shows a single Linux bridge called **docker0**. This is the bridge that was automatically created for the **bridge** network. You can see that it has no interfaces currently connected to it.\n\nYou can also use the `ip` command to view details of the **docker0** bridge.\n\n```\n$ ip a\n<Snip>\n3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default\n    link/ether 02:42:f1:7f:89:a6 brd ff:ff:ff:ff:ff:ff\n    inet 172.17.0.1/16 scope global docker0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::42:f1ff:fe7f:89a6/64 scope link\n       valid_lft forever preferred_lft forever\n```\n\n## <a name=\"Task_2\"></a>Task 2: Connect a container\n\nThe **bridge** network is the default network for new containers. This means that unless you specify a different network, all new containers will be connected to the **bridge** network.\n\nCreate a new container.\n\n```\n$ docker run -dt ubuntu sleep infinity\n6dd93d6cdc806df6c7812b6202f6096e43d9a013e56e5e638ee4bfb4ae8779ce\n```\n\nThis command will create a new container based on the `ubuntu:latest` image and will run the `sleep` command to keep the container running in the background. As no network was specified on the `docker run` command, the container will be added to the **bridge** network.\n\nRun the `brctl show` command again.\n\n```\n$ brctl show\nbridge name     bridge id               STP enabled     interfaces\ndocker0         8000.0242f17f89a6       no              veth3a080f\n```\n\nNotice how the **docker0** bridge now has an interface connected. This interface connects the **docker0** bridge to the new container just created.\n\nInspect the **bridge** network again to see the new container attached to it.\n\n```\n$ docker network inspect bridge\n<Snip>\n        \"Containers\": {\n            \"6dd93d6cdc806df6c7812b6202f6096e43d9a013e56e5e638ee4bfb4ae8779ce\": {\n                \"Name\": \"reverent_dubinsky\",\n                \"EndpointID\": \"dda76da5577960b30492fdf1526c7dd7924725e5d654bed57b44e1a6e85e956c\",\n                \"MacAddress\": \"02:42:ac:11:00:02\",\n                \"IPv4Address\": \"172.17.0.2/16\",\n                \"IPv6Address\": \"\"\n            }\n        },\n<Snip>\n```\n\n## <a name=\"Task_3\"></a>Task 3: Test network connectivity\n\nThe output to the previous `docker network inspect` command shows the IP address of the new container. In the previous example it is \"172.17.0.2\" but yours might be different.\n\nPing the IP address of the container from the shell prompt of your Docker host. Remember to use the IP of the container in **your** environment.\n\n```\n$ ping 172.17.0.2\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.069 ms\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.052 ms\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.050 ms\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.049 ms\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.049 ms\n^C\n--- 172.17.0.2 ping statistics ---\n5 packets transmitted, 5 received, 0% packet loss, time 3999ms\nrtt min/avg/max/mdev = 0.049/0.053/0.069/0.012 ms\n```\n\nPress `Ctrl-C` to stop the ping. The replies above show that the Docker host can ping the container over the **bridge** network.\n\nLog in to the container, install the `ping`\n program and ping `www.docker.com`.\n\n ```\n### Get the ID of the container started in the previous step.\n$ docker ps\nCONTAINER ID    IMAGE    COMMAND             CREATED  STATUS  NAMES\n6dd93d6cdc80    ubuntu   \"sleep infinity\"    5 mins   Up      reverent_dubinsky\n\n### Exec into the container\n$ docker exec -it 6dd93d6cdc80 /bin/bash\n\n### Update APT package lists and install the iputils-ping package\nroot@6dd93d6cdc80:/# apt-get update\n <Snip>\n\n apt-get install iputils-ping\n Reading package lists... Done\n<Snip>\n\n### Ping www.docker.com from within the container\n\n```\nroot@6dd93d6cdc80:/# ping www.docker.com\nPING www.docker.com (104.239.220.248) 56(84) bytes of data.\n64 bytes from 104.239.220.248: icmp_seq=1 ttl=39 time=93.9 ms\n64 bytes from 104.239.220.248: icmp_seq=2 ttl=39 time=93.8 ms\n64 bytes from 104.239.220.248: icmp_seq=3 ttl=39 time=93.8 ms\n^C\n--- www.docker.com ping statistics ---\n3 packets transmitted, 3 received, 0% packet loss, time 2002ms\nrtt min/avg/max/mdev = 93.878/93.895/93.928/0.251 ms\n```\n\nThis shows that the new container can ping the internet and therefore has a valid and working network configuration.\n\n\n## <a name=\"Task_4\"></a>Task 4: Configure NAT for external connectivity\n\nIn this step we'll start a new **NGINX** container and map port 8080 on the Docker host to port 80 inside of the container. This means that traffic that hits the Docker host on port 8080 will be passed on to port 80 inside the container.\n\n> **NOTE:** If you start a new container from the official NGINX image without specifying a command to run, the container will run a basic web server on port 80.\n\nStart a new container based off the official NGINX image.\n\n    ```\n    $ docker run --name web1 -d -p 8080:80 nginx\n    Unable to find image 'nginx:latest' locally\n    latest: Pulling from library/nginx\n    386a066cd84a: Pull complete\n    7bdb4b002d7f: Pull complete\n    49b006ddea70: Pull complete\n    Digest: sha256:9038d5645fa5fcca445d12e1b8979c87f46ca42cfb17beb1e5e093785991a639\n    Status: Downloaded newer image for nginx:latest\n    b747d43fa277ec5da4e904b932db2a3fe4047991007c2d3649e3f0c615961038\n    ```\n\nCheck that the container is running and view the port mapping.\n\n    ```\n    $ docker ps\n    CONTAINER ID    IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES\n    b747d43fa277   nginx               \"nginx -g 'daemon off\"   3 seconds ago       Up 2 seconds        443/tcp, 0.0.0.0:8080->80/tcp   web1\n    6dd93d6cdc80        ubuntu              \"sleep infinity\"         About an hour ago   Up About an hour                                    reverent_dubinsky\n    ```\n\nThere are two containers listed in the output above. The top line shows the new **web1** container running NGINX. Take note of the command the container is running as well as the port mapping - `0.0.0.0:8080->80/tcp` maps port 8080 on all host interfaces to port 80 inside the **web1** container. This port mapping is what effectively makes the containers web service accessible from external sources (via the Docker hosts IP address on port 8080).\n\nNow that the container is running and mapped to a port on a host interface you can test connectivity to the NGINX web server.\n\nTo complete the following task you will need the IP address of your Docker host. This will need to be an IP address that you can reach (e.g. if your lab is in AWS this will need to be the instance's Public IP).\n\nPoint your web browser to the IP and port 8080 of your Docker host. The following example shows a web browser pointed to `52.213.169.69:8080`\n\n![](concepts/img/browser.png)\n\nIf you try connecting to the same IP address on a different port number it will fail.\n\nIf for some reason you cannot open a session from a web broswer, you can connect from your Docker host using the `curl` command.\n\n    ```\n    $ curl 127.0.0.1:8080\n    <!DOCTYPE html>\n    <html>\n    <head>\n    <title>Welcome to nginx!</title>\n        <Snip>\n    <p><em>Thank you for using nginx.</em></p>\n    </body>\n    </html>\n    ```\n\n\nIf you try and curl the IP address on a different port number it will fail.\n\n> **NOTE:** The port mapping is actually port address translation (PAT).\n\n## Next Steps\nFor the next step in the tutorial, head over to [Docker Networking](./bridge-network.md)"
  },
  {
    "path": "Docker/kickstart/chapters/devops.md",
    "content": "# Docker and DevOps\n\nNow that we understand how to build Docker images it's now time to start autobuilding our changes with a pipeline `Dockerfile`\n\n> **Tasks**:\n>\n> - [Task 1: Push your image to Docker Hub](#task-1-push-your-image-to-docker-hub)\n> - [Task 2: Setup a Automated Build](#task-2-setup-an-automated-build)\n> - [Task 3: Unit Test our Automated Builds](#task-3-unit-test-our-automated-builds)\n\n## Task 1: Push your image to Docker Hub\n\n### Preparation\n\n1. In order to make commands more copy/paste friendly, export an environment variable containing your DockerID (if you don't have a DockerID you can get one for free via [Docker Hub](https://hub.docker.com))\n\n   ```\n   $ export DOCKERID=<your docker id>\n   ```\n\n   > Special Note: The Windows Command Line does not allow to export the `DOCKERID`. You can therefore either directly set the DockerID in the following commands. Or export the variable via `set DOCKERID=<your docker id>` and then replace the variable with `%DOCKERID%`.\n\n2. To make sure it stored correctly by echoing it back in the terminal\n\n   ```\n   $ echo $DOCKERID\n   <your docker id>\n   ```\n\n### Push your images to Docker Hub\n\nList the images on your Docker host. You will see that you now have two `linux_tweet_app` images - one tagged as `1.0` and the other as `2.0`.\n\n    $ docker image ls\n\n    REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE\n    vegasbrianc/linux_tweet_app   2.0                 01612e05312b        3 minutes ago       108MB\n    vegasbrianc/linux_tweet_app   1.0                 bb32b5783cd3        7 minutes ago       108MB\n\nThese images are only stored in your Docker host's local repository. We want to `push` these images to Docker Hub so we can access the images from anywhere.\n\nDistribution is built into the Docker platform. You can build images locally and push them to a public or private [registry](https://docs.docker.com/registry/), making them available to other users. Anyone with access can pull that image and run a container from it. The behavior of the app in the container will be the same for everyone, because the image contains the fully-configured app - the only requirements to run it are Linux and Docker.\n\n[Docker Hub](https://hub.docker.com) is the default public registry for Docker images.\n\n1. Before you can push your images, you will need to log into Docker Hub.\n\n   ```\n   $ docker login\n   Username: <your docker id>\n   Password: <your docker id password>\n   Login Succeeded\n   ```\n\n   You will need to supply your Docker ID credentials when prompted.\n\n2. Push version `1.0` of your web app using `docker image push`.\n\n   ```\n   $ docker image push $DOCKERID/linux_tweet_app:1.0\n\n   The push refers to a repository [docker.io/<your docker id>/linux_tweet_app]\n   910e84bcef7a: Pushed\n   1dee161c8ba4: Pushed\n   110566462efa: Pushed\n   305e2b6ef454: Pushed\n   24e065a5f328: Pushed\n   1.0: digest: sha256:51e937ec18c7757879722f15fa1044cbfbf2f6b7eaeeb578c7c352baba9aa6dc size: 1363\n   ```\n\n   You'll see the progress as the image is pushed up to hub\n\n3. Now push version `2.0`.\n\n   ```\n   $ docker image push $DOCKERID/linux_tweet_app:2.0\n\n   The push refers to a repository [docker.io/<your docker id>/linux_tweet_app]\n   0b171f8fbe22: Pushed\n   70d38c767c00: Pushed\n   110566462efa: Layer already exists\n   305e2b6ef454: Layer already exists\n   24e065a5f328: Layer already exists\n   2.0: digest: sha256:7c51f77f90b81e5a598a13f129c95543172bae8f5850537225eae0c78e4f3add size: 1363\n   ```\n\n   Notice that several lines of the output say `Layer already exists`. This is because Docker will leverage read-only layers that are the same as any previously uploaded image layers.\n\n   You can browse to `https://hub.docker.com/r/<your docker id>/` and see your newly-pushed Docker images. These are public repositories, so anyone can pull the images - you don't even need a Docker ID to pull public images.\n\n## Task 2: Setup an Automated Build\n\n### Prepare to push our newly created project to GitHub\n\nIt's time to automate our build pipeline. First, we need to create a GitHub Repo.\n\n1. Login to your [www.GitHub.com](https://www.github.com) account and click create new repository\n\n<center><img src=\"../images/Create_new_git_repo.png\" title=\"Create New Git Repo\"></center>\n\n2. Name the new repository `autobuilds` and fill in the description in optional\n\n<center><img src=\"../images/setup_repo.png\" title=\"Create New Git Repo\"></center>\n\n3. From the `linux_tweet_app` directory, initialize the project, commit, and perform the initial push to GitHub. Follow the directions which GitHub provides as seen below.\n\n4. Remove the Git directory\n\n   ```\n   $ rm -Rf .git\n   ```\n\n5. Initialize the Git directory\n\n   ```\n   $ git init\n   ```\n\n6. Change the branch name to main\n\n   ```\n   $ git checkout -b main\n   ```\n\n7. Add your Git Repo configuration to the local index\n\n   ```\n   $ git remote add origin https://github.com/<your GitHub username>/<your github repo name>.git\n   ```\n\n8. Add all files to Git index\n\n   ```\n   $ git add *\n   ```\n\n9. Commit Linux Tweet App files to the GitHub Autobuilds Repo\n\n   ```\n   $ git commit -m \"First commit to Autobuilds\"\n   ```\n\n10. Push the changes to GitHub\n\n    ```\n    $ git push --set-upstream origin main\n    ```\n\nNow that we have pushed our project to GitHub, the next step is to enable [GitHub Actions](https://github.com/features/actions) to build and push the image.\n\n1. Generate a new Access Token on Docker Hub\n\n   Go to the [Docker Hub Account Settings -> Security](https://hub.docker.com/settings/security)\n\n2. Store the access token and further secrets in the GitHub Repository\n\n   Go to Settings -> Secrets -> Actions and add the following _Repository Secrets_:\n\n   - DOCKERHUB_USERNAME: `Your DOCKERID`\n   - DOCKERHUB_TOKEN: `The previously created TOKEN`\n\n3. To add a job, you need to create the `.github/workflows/build-push-and-deploy.yml` file and add the content below to it:\n\n```\n---\nname: Build, Push and Deploy\n\non:\n  pull_request:\n    branches:\n      - 'main'\n  push:\n    branches:\n      - 'main'\n\njobs:\n  build-and-push-image:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2.3.4\n\n      # Configure Docker for Multi-Arch Images\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v1.2.0\n\n      # Login to DockerHub when no pull request\n      - name: Login to DockerHub\n        if: github.event_name != 'pull_request'\n        uses: docker/login-action@v1\n        with:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          password: ${{ secrets.DOCKERHUB_TOKEN }}\n\n      # Configure the Docker Image Meta Data\n      - name: Docker Meta\n        id: docker_meta\n        uses: docker/metadata-action@v3.4.1\n        with:\n          # list of Docker images to use as base name for tags\n          images: |\n            ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }}\n          flavor: |\n            latest=false\n          tags: |\n            type=raw,value=latest\n\n      # Build and push the image\n      - name: Build and Push\n        id: docker_build\n        uses: docker/build-push-action@v2.6.1\n        with:\n          push: ${{ github.event_name != 'pull_request' }}\n          tags: ${{ steps.docker_meta.outputs.tags }}\n          labels: ${{ steps.docker_meta.outputs.labels }}\n```\n\n13. Commit and Push the changes to GitHub\n\n```\n$ git add .github/workflows/build-push-and-deploy.yml\n$ git commit -m \"Added GitHub Actions Script\"\n$ git push\n```\n\n14. After you pushed the changes go to the _Actions_ tab in your GitHub Repository. You should see the Workflow that was just triggered.\n\n### Test Automated Builds\n\nAwesome! To ensure our automated builds are really working let's commit a new version of our `linux_tweet_app` to GitHub. When we push our changes to GitHub this will trigger a new GitHub Action Workflow. Great, let's give it a try.\n\n1.  in the `linux_tweet_app` directory edit the `index.html`\n\n    > Using your favorite editor (vi, emacs, etc)\n\n        Edit the index.html file and edit line number 33 and change the text to \"DevOps is Awesome\"\n\n        $ vi index.html\n\n2.  Commit our new changes to our GitHub Repo\n\n    ```\n    $ git add index.html\n\n    $ git commit -m \"updated index.html text to DevOps is Awesome\"\n\n    $ git push\n    ```\n\n3.  Head back to your GitHub Repository and click on the `Actions` tab. You should now see a new Workflow that was just now triggered (Maybe you need to wait a couple of seconds and refresh the page). If you click on the latest Workflow, you get to the Summary page, where you can see the `build-and-push-image` job. By clicking on this you can see all the logs and also failures, if something went wrong.\n\n## Task 3: Unit Test our Automated Builds\n\nNow, we have an automated Build pipeline in place that is automatically being built every time a new commit is made to GitHub. The next logical step is to add some testing to our project to ensure what we are committing is doing what it is suppose to do.\n\nTo do this, we need to add a new job to our GitHub Actions. This will start the previously build container and tries to connect to the HTTP port.\n\n1. Add the following code snippet to your GitHub Actions file:\n\n   ```\n   test-container:\n      name: Test our container\n      needs: build-and-push-image\n      runs-on: ubuntu-latest\n      steps:\n         - name: Checkout\n           uses: actions/checkout@v2.3.4\n\n         - name: Test\n           run: |\n            docker container run --detach --publish 8080:80  ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }}\n            docker ps\n            while ! curl --retry 10 --retry-delay 5 -v http://0.0.0.0:8080 >/dev/null; do sleep 1; done\n   ```\n\n2. Commit and push your changes to the GitHub repo\n\n   ```\n   $ git add .github/workflows/build-push-and-deploy.yml\n\n   $ git commit -m \"added testing job to our Autobuild Repo\"\n\n   $ git push\n   ```\n\n3. Head back to the GitHub Actions tab in your GitHub Repository. Select the latest workflow. There you should now see two jobs. After a successful build, you should see the following:\n\n   <center><img src=\"../images/github-actions-build-push-and-test.png\" title=\"GitHub Actions Workflow Summary\"></center>\n\n### OPTIONAL: Add Build Status to Project\n\n<center><img src=\"../images/github-actions-build-status.png\" title=\"GitHub Actions Build Status\"></center>\n\nTo add the build status to your project, add the following line to your `README.md` file in your repository root folder.\n\nYou can use your favorite editor (vi, emacs, VSCode, etc) to edit the `README.md` file and paste the following snippet to the first line of the `README.md`\n\n```\n![Build-Push-And-Test Workflow](https://github.com/<OWNER>/<REPOSITORY>/actions/workflows/build-push-and-deploy.yml/badge.svg)\n```\n\n6. Commit the changes to `README.md`\n\n```\n$ git add README.md\n\n$ git commit -m \"Added GitHub Actions build status to our Repo\"\n\n$ git push\n```\n\n## Next Steps\n\nFor the next step in the tutorial, head over to [Deploying an app with Docker Compose](./votingapp-compose.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/docker-devpops.md",
    "content": "## 1.0 Running your first container\nNow that you have everything setup, it's time to get our hands dirty. In this section, you are going to run an [Alpine Linux](http://www.alpinelinux.org/) container (a lightweight linux distribution) on your system and get a taste of the `docker run` command.\n\nTo get started, let's run the following in our terminal:\n```\n$ docker pull alpine\n```\n\n> **Note:** Depending on how you've installed docker on your system, you might see a `permission denied` error after running the above command. Try the commands from the Getting Started tutorial to [verify your installation](https://docs.docker.com/engine/getstarted/step_one/#/step-3-verify-your-installation). If you're on Linux, you may need to prefix your `docker` commands with `sudo`. Alternatively you can [create a docker group](https://docs.docker.com/engine/installation/linux/ubuntulinux/#/create-a-docker-group) to get rid of this issue.\n\nThe `pull` command fetches the alpine **image** from the **Docker registry** and saves it in our system. You can use the `docker images` command to see a list of all images on your system.\n```\n$ docker images\nREPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE\nalpine                 latest              c51f86c28340        4 weeks ago         1.109 MB\nhello-world             latest              690ed74de00f        5 months ago        960 B\n```\n\n### 1.1 Docker Run\nGreat! Let's now run a Docker **container** based on this image. To do that you are going to use the `docker run` command.\n\n```\n$ docker run alpine ls -l\ntotal 48\ndrwxr-xr-x    2 root     root          4096 Mar  2 16:20 bin\ndrwxr-xr-x    5 root     root           360 Mar 18 09:47 dev\ndrwxr-xr-x   13 root     root          4096 Mar 18 09:47 etc\ndrwxr-xr-x    2 root     root          4096 Mar  2 16:20 home\ndrwxr-xr-x    5 root     root          4096 Mar  2 16:20 lib\n......\n......\n```\nWhat happened? Behind the scenes, a lot of stuff happened. When you call `run`,\n1. The Docker client contacts the Docker daemon\n2. The Docker daemon checks local store if the image (alpine in this case) is available locally, and if not, dowloads it from Docker Store. (Since we have issued `docker pull alpine` before, the download step is not necessary)\n3. The Docker daemon creates the container and then runs a command in that container.\n4. The Docker daemon streams the output of the command to the Docker client\n\nWhen you run `docker run alpine`, you provided a command (`ls -l`), so Docker started the command specified and you saw the listing.\n\nLet's try something more exciting.\n\n```\n$ docker run alpine echo \"hello from alpine\"\nhello from alpine\n```\nOK, that's some actual output. In this case, the Docker client dutifully ran the `echo` command in our alpine container and then exited it. If you've noticed, all of that happened pretty quickly. Imagine booting up a virtual machine, running a command and then killing it. Now you know why they say containers are fast!\n\nTry another command.\n```\n$ docker run alpine /bin/sh\n```\n\nWait, nothing happened! Is that a bug? Well, no. These interactive shells will exit after running any scripted commands, unless they are run in an interactive terminal - so for this example to not exit, you need to `docker run -it alpine /bin/sh`.\n\nYou are now inside the container shell and you can try out a few commands like `ls -l`, `uname -a` and others. Exit out of the container by giving the `exit` command.\n\n\nOk, now it's time to see the `docker ps` command. The `docker ps` command shows you all containers that are currently running.\n\n```\n$ docker ps\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n```\n\nSince no containers are running, you see a blank line. Let's try a more useful variant: `docker ps -a`\n\n```\n$ docker ps -a\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES\n36171a5da744        alpine              \"/bin/sh\"                5 minutes ago       Exited (0) 2 minutes ago                        fervent_newton\na6a9d46d0b2f        alpine             \"echo 'hello from alp\"    6 minutes ago       Exited (0) 6 minutes ago                        lonely_kilby\nff0a5c3750b9        alpine             \"ls -l\"                   8 minutes ago       Exited (0) 8 minutes ago                        elated_ramanujan\nc317d0a9e3d2        hello-world         \"/hello\"                 34 seconds ago      Exited (0) 12 minutes ago                       stupefied_mcclintock\n```\n\nWhat you see above is a list of all containers that you ran. Notice that the `STATUS` column shows that these containers exited a few minutes ago. You're probably wondering if there is a way to run more than just one command in a container. Let's try that now:\n\n```\n$ docker run -it alpine /bin/sh\n/ # ls\nbin      dev      etc      home     lib      linuxrc  media    mnt      proc     root     run      sbin     sys      tmp      usr      var\n/ # uname -a\nLinux 97916e8cb5dc 4.4.27-moby #1 SMP Wed Oct 26 14:01:48 UTC 2016 x86_64 Linux\n```\nRunning the `run` command with the `-it` flags attaches us to an interactive tty in the container. Now you can run as many commands in the container as you want. Take some time to run your favorite commands.\n\nThat concludes a whirlwind tour of the `docker run` command which would most likely be the command you'll use most often. It makes sense to spend some time getting comfortable with it. To find out more about `run`, use `docker run --help` to see a list of all flags it supports. As you proceed further, we'll see a few more variants of `docker run`.\n### 1.2 Terminology\nIn the last section, you saw a lot of Docker-specific jargon which might be confusing to some. So before you go further, let's clarify some terminology that is used frequently in the Docker ecosystem.\n\n- *Images* - The file system and configuration of our application which are used to create containers. To find out more about a Docker image, run `docker inspect alpine`. In the demo above, you used the `docker pull` command to download the **alpine** image. When you executed the command `docker run hello-world`, it also did a `docker pull` behind the scenes to download the **hello-world** image.\n- *Containers* - Running instances of Docker images &mdash; containers run the actual applications. A container includes an application and all of its dependencies. It shares the kernel with other containers, and runs as an isolated process in user space on the host OS. You created a container using `docker run` which you did using the alpine image that you downloaded. A list of running containers can be seen using the `docker ps` command.\n- *Docker daemon* - The background service running on the host that manages building, running and distributing Docker containers.\n- *Docker client* - The command line tool that allows the user to interact with the Docker daemon.\n- *Docker Store* - A [registry](https://store.docker.com/) of Docker images, where you can find trusted and enterprise ready containers, plugins, and Docker editions. You'll be using this later in this tutorial.\n\n## Next Steps\nFor the next step in the tutorial, head over to [2.0 Webapps with Docker](./webapps.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/images-and-volumes.md",
    "content": "# Docker Images and Volumes\n\nGreat! So you have now looked at `docker container run`, played with Docker containers, and ran your first web application inside a container. In this section, you will learn about Docker Images and Volumes.\n\n> **Tasks**:\n>\n> - [Task 1: Docker Images](#task-1-docker-images)\n> - [Task 2: Layers and Copy on Write](#task-2-layers-and-copy-on-write)\n> - [Task 3: Understanding Docker Volumes](#task-3-understanding-docker-volumes)\n\n## Task 1: Docker Images\n\nIn this section, we dive into Docker images. You will build your own image, use that image to run an application locally, and finally, push the newly create images to Docker Cloud.\n\nThe [Docker documentation](https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/) gives a great explanation on how storage works with Docker images and containers, but here's the highlights.\n\n- Images are comprised of layers\n- These layers are added by each line in a Dockerfile\n- Images on the same host or registry will share layers if possible\n- When container is started it gets a unique writeable layer of its own to capture changes that occur while it's running\n- Layers exist on the host file system in some form (usually a directory, but not always) and are managed by a [storage driver](https://docs.docker.com/engine/userguide/storagedriver/selectadriver/) to present a logical filesystem in the running container.\n- When a container is removed the unique writeable layer (and everything in it) is removed as well\n- To persist data (and improve performance) Volumes are used.\n- Volumes (and the directories they are built on) are not managed by the storage driver, and will live on if a container is removed.\n\nA Docker image is built up from a series of layers. Each layer represents an instruction in the image’s Dockerfile. Each layer except the very last one is read-only. Consider the following Dockerfile:\n\n```\n    FROM ubuntu:15.04\n    COPY . /app\n    RUN make /app\n    CMD python /app/app.py\n```\n\nThis Dockerfile contains four commands, each of which creates a layer. The `FROM` statement starts out by creating a layer from the ubuntu:15.04 image. The `COPY` command adds some files from your Docker client’s current directory. The `RUN` command builds your application using the make command. Finally, the last layer specifies what command to run within the container.\n\n<center><img src=\"../images/container-layers.jpg\" title=\"Container Layers\"></center>\n\nMultiple Containers can use the same Image. Each container has its own writable container layer, and all changes are stored in this container layer, multiple containers can share access to the same underlying image and yet have their own data state. The diagram below shows multiple containers sharing the same Ubuntu 15.04 image.\n\n<center><img src=\"../images/sharing-layers.jpg\" title=\"Sharing Layers\"></center>\n\nThe following exercises will help to illustrate those concepts in practice.\n\nLet's start by looking at layers and how files written to a container are managed by something called _copy on write_.\n\nDocker images are the basis of containers. In the previous example, you **pulled** the _dockersamples/static-site_ image from the registry and asked the Docker client to run a container **based** on that image. To see the list of images that are available locally on your system, run the `docker images` command.\n\n```\n$ docker images\nREPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE\ndockersamples/static-site   latest              92a386b6e686        2 hours ago        190.5 MB\nnginx                       latest              af4b3d7d5401        3 hours ago        190.5 MB\npython                      2.7                 1c32174fd534        14 hours ago        676.8 MB\npostgres                    9.4                 88d845ac7a88        14 hours ago        263.6 MB\ncontainous/traefik          latest              27b4e0c6b2fd        4 days ago          20.75 MB\nnode                        0.10                42426a5cba5f        6 days ago          633.7 MB\nredis                       latest              4f5f397d4b7c        7 days ago          177.5 MB\nmongo                       latest              467eb21035a8        7 days ago          309.7 MB\nalpine                      3.3                 70c557e50ed6        8 days ago          4.794 MB\njava                        7                   21f6ce84e43c        8 days ago          587.7 MB\n```\n\nAbove is a list of images that we've pulled from the Docker registry and images I created myself (we'll shortly see how). You will have a different list of images on your machine. The `TAG` refers to a particular snapshot of the image and the `ID` is the corresponding unique identifier or hash for that image.\n\nFor simplicity, you can think of an image functions similarly to a git repository - images can be [committed](https://docs.docker.com/engine/reference/commandline/commit/) with changes and have multiple versions. When you do not provide a specific version number, the client defaults to `latest`.\n\n1. Pull a specific version of `ubuntu` image as follows:\n\n   ```\n   $ docker image pull ubuntu:12.04\n   ```\n\n   _Note_ If you do not specify the version number of the image then, as mentioned, the Docker client will default to a version named `latest`.\n\n2. So for example, the `docker image pull` command given below will always pull the `latest` tag of an image. The example below pulls `ubuntu:latest` by default.\n\n   ```\n   $ docker image pull ubuntu\n   ```\n\nTo get a new Docker image you can either get it from a registry (such as the Docker Hub) or create your own. There are hundreds of thousands of images available on [Docker Hub](https://hub.docker.com). You can also search for images directly from the command line using `docker search`.\n\nAn important distinction with regard to images is between _base images_ and _child images_.\n\n- **Base images** are images that have no parent images, usually images with an OS like ubuntu, alpine or debian.\n\n- **Child images** are images that build on base images and add additional functionality.\n\nAnother key concept is the idea of _official images_ and _user images_. (Both of which can be base images or child images.)\n\n- **Official images** are Docker-sanctioned images. Docker, Inc. sponsors a dedicated team that is responsible for reviewing and publishing all Official Repositories content. This team works in collaboration with upstream software maintainers, security experts, and the broader Docker community. These are not prefixed by an organization or user name. In the list of images above, the `python`, `node`, `alpine` and `nginx` images are official (base) images. To find out more about them, check out the [Official Images Documentation](https://docs.docker.com/docker-hub/official_repos/).\n\n- **User images** are images created and shared by users like you. They build on base images and add additional functionality. Typically these are formatted as `user/image-name`. The `user` value in the image name is your Docker Hub user or organization name.\n\n## Task 2: Layers and Copy on Write\n\n1. Pull the Debian:Buster image\n\n   ```\n   $ docker image pull ubuntu:jammy\n   jammy: Pulling from library/ubuntu\n   952b15bbc7fb: Pull complete\n   Digest: sha256:ac58ff7fe25edc58bdf0067ca99df00014dbd032e2246d30a722fa348fd799a5\n   Status: Downloaded newer image for ubuntu:jammy\n   docker.io/library/ubuntu:jammy\n   ```\n\n2. Pull a MariaDB image\n\n   ```\n   $ docker image pull mariadb:11\n   11: Pulling from library/mariadb\n   6c7698a779f6: Already exists\n   c3beef926275: Pull complete\n   dd40ffbb6cb3: Pull complete\n   31691bc52e3b: Pull complete\n   0b4de91620aa: Pull complete\n   1ecbfd4a00bd: Pull complete\n   91656c5c74a8: Pull complete\n   fbc99aa6f426: Pull complete\n   Digest: sha256:b85481f8f2a65c10dec198e562a751676e926da83018e5590d00be86e5c9f635\n   Status: Downloaded newer image for mariadb:11\n   docker.io/library/mariadb:11\n   ```\n\n   What do you notice about the output from the Docker pull request for MySQL?\n\n   The first layer pulled says:\n\n   `6c7698a779f6: Already exists`\n\n   Notice that the layer id (`6c7698a779f6`) is the same for the first layer of the MySQl image and the only layer in the Debian:Jessie image. And because we already had pulled that layer when we pulled the Debian image, we didn't have to pull it again.\n\n   So, what does that tell us about the MySQL image? Since each layer is created by a line in the image's _Dockerfile_, we know that the MySQL image is based on the Debian:Jessie base image. We can confirm this by looking at the [Dockerfile for the Docker Hub](https://github.com/MariaDB/mariadb-docker/blob/e56b3a008e9c47c7199d28db6d77d2cfecde526d/11.0/Dockerfile).\n\n   The first line in the the Dockerfile is: `FROM ubuntu:jammy` This will import that layer into the MySQL image.\n\n   So layers are created by the Dockerfile and are shared between images. When you start a container, a writeable layer is added to the base image.\n\n   Next you will create a file in our container, and see how that's represented on the host file system.\n\n3. Start a Debian container, shell into it.\n\n   ```\n   $ docker run --tty --interactive --name debian debian:stretch-slim bash\n   root@e09203d84deb:/#\n   ```\n\n4. Create a file and then list out the directory to make sure it's there:\n\n   ```\n   root@e09203d84deb:/# touch test-file\n   root@e09203d84deb:/# ls\n   bin  boot  dev\tetc  home  lib\tlib64  media  mnt  opt\tproc  root  run  sbin  srv  sys  test-file  tmp  usr  var\n   ```\n\n   We can see `test-file` exists in the root of the containers file system.\n\n   What has happened is that when a new file was written to the disk, the Docker storage driver placed that file in it's own layer. This is called _copy on write_ - as soon as a change is detected the change is copied into the writeable layer. That layers is represented by a directory on the host file system. All of this is managed by the Docker storage driver.\n\n5. Exit the container but leave it running by pressing `ctrl-p` and then `ctrl-q`\n\n   <center><img src=\"../images/overlay_constructs.jpg\" title=\"Overlay Constructs\"></center>\n\n   Our Docker host utilizes OverlayFS with the [overlay2](https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/#how-the-overlay2-driver-works) storage driver.\n\n   OverlayFS layers two directories on a single Linux host and presents them as a single directory. These directories are called layers and the unification process is referred to as a union mount. OverlayFS refers to the lower directory as lowerdir and the upper directory a upperdir. \"Upper\" and \"Lower\" refer to when the layer was added to the image. In our example the writeable layer is the most \"upper\" layer. The unified view is exposed through its own directory called merged.\n\n6. Stop the container\n\n   ```\n   $ docker container stop debian\n   ```\n\n7. Ensure that your debian container still exists\n\n   ```\n   $ docker container ls --all\n   CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS           PORTS               NAMES\n   674d7abf10c6        debian:stretch-slim \"bash\"              36 minutes ago      Exited (0) 2 minutes ago                       debian\n   ```\n\n8. Start the Debian container again\n\n   ```\n   $ docker container start debian\n   ```\n\n9. Attach to the Debian container hit `enter` twice after completing the command\n\n   ```\n   $ docker container attach debian\n   ```\n\n   Because the container still exists, the files are still available on your file system. At this point the file we created previously still exists.\n\n   However, if we remove the container, the directories on the host file system will be removed, and your changes will be gone.\n\n10. Remove the container and list the directory contents\n\n    ```\n    $ docker container rm debian\n    debian\n    ```\n\n    The files that were created are now gone and the container now reverts back to the base image which it was created from if we start it again.\n\n## Task 3: Understanding Docker Volumes\n\n[Docker volumes](https://docs.docker.com/engine/admin/volumes/volumes/) are directories on the host file system that are not managed by the storage driver. Since they are not managed by the storage drive they offer a couple of important benefits.\n\n- **Performance**: Because the storage driver has to create the logical filesystem in the container from potentially many directories on the local host, accessing data can be slow. Especially if there is a lot of write activity to that container. In fact you should try and minimize the amount of writes that happen to the container's filesystem, and instead direct those writes to a volume\n\n- **Persistence**: Volumes are not removed when the container is deleted. They exist until explicitly removed. This means data written to a volume can be reused by other containers.\n\nVolumes can be anonymous or named. Anonymous volumes have no way to be explicitly referenced. They are almost exclusively used for performance reasons as you cannot persist data effectively with anonymous volumes. Named volumes can be explicitly referenced so they can be used to persist data and increase performance.\n\nThe next sections will cover both anonymous and named volumes.\n\n> Special Note: These next sections were adapted from [Arun Gupta's](https://twitter.com/arungupta) excellent [tutorial](http://blog.arungupta.me/docker-mysql-persistence/)(Outdated) on persisting data with MySQL.\n\n### Anonymous Volumes\n\nTake a look at the MySQL [Dockerfile](https://github.com/docker-library/mysql/blob/0590e4efd2b31ec794383f084d419dea9bc752c4/5.7/Dockerfile) you will find the following line:\n\n```\nVOLUME /var/lib/mysql\n```\n\nThis line sets up an anonymous volume in order to increase database performance by avoiding sending a bunch of writes through the Docker storage driver.\n\n> **Note:** An anonymous volume is a volume that hasn't been explicitly named. This means that it's extremely difficult to use the volume later with a new container. Named volumes solve that problem, and will be covered later in this section.\n\n1. Start a MySQL container\n\n   ```\n   $ docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -d mysql\n   acf185dc16e274b2f332266a1bfc6d1df7d7b4f780e6a7ec6716b40cafa5b3c3\n   ```\n\n   When we start the container the anonymous volume is created:\n\n2. Use Docker inspect to view the details of the anonymous volume\n\n   ```\n   $ docker inspect -f \"in the {{.Name}} container {{(index .Mounts 0).Destination}} is mapped to {{(index .Mounts 0).Source}}\" mysqldb\n   ```\n\n   This command will return: `in the /mysqldb container /var/lib/mysql is mapped to /var/lib/docker/volumes/cd79b3301df29d13a068d624467d6080354b81e34d794b615e6e93dd61f89628/_data`\n\n   As mentioned anonymous volumes will not persist data between containers, they are almost always used to increase performance.\n\n3. Shell into your running MySQL container and log into MySQL\n\n   ```\n   $ docker exec --tty --interactive mysqldb bash\n\n   root@132f4b3ec0dc:/# mysql --user=mysql --password=mysql\n   mysql: [Warning] Using a password on the command line interface can be insecure.\n   Welcome to the MySQL monitor.  Commands end with ; or \\g.\n   Your MySQL connection id is 3\n   Server version: 5.7.19 MySQL Community Server (GPL)\n\n   Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.\n\n   Oracle is a registered trademark of Oracle Corporation and/or its\n   affiliates. Other names may be trademarks of their respective\n   owners.\n\n   Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n   ```\n\n4. Create a new table\n\n   ```\n   mysql> show databases;\n   +--------------------+\n   | Database           |\n   +--------------------+\n   | information_schema |\n   | sample             |\n   +--------------------+\n   2 rows in set (0.00 sec)\n\n   mysql> connect sample;\n   Connection id:    4\n   Current database: sample\n\n   mysql> show tables;\n   Empty set (0.00 sec)\n\n   mysql> create table user(name varchar(50));\n   Query OK, 0 rows affected (0.01 sec)\n\n   mysql> show tables;\n   +------------------+\n   | Tables_in_sample |\n   +------------------+\n   | user             |\n   +------------------+\n   1 row in set (0.00 sec)\n   ```\n\n5. Exit MySQL and the MySQL container.\n\n   ```\n   mysql> exit\n   Bye\n\n   root@132f4b3ec0dc:/# exit\n   exit\n   ```\n\n6. Stop the container and restart it\n\n   ```\n   $ docker stop mysqldb\n   mysqldb\n\n   $ docker start mysqldb\n   mysqldb\n   ```\n\n7. Shell back into the running container and log into MySQL\n\n   ```\n   $ docker exec --interactive --tty mysqldb bash\n\n   root@132f4b3ec0dc:/# mysql --user=mysql --password=mysql\n   mysql: [Warning] Using a password on the command line interface can be insecure.\n   Welcome to the MySQL monitor.  Commands end with ; or \\g.\n   Your MySQL connection id is 3\n   Server version: 5.7.19 MySQL Community Server (GPL)\n\n   Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.\n\n   Oracle is a registered trademark of Oracle Corporation and/or its\n   affiliates. Other names may be trademarks of their respective\n   owners.\n\n   Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n   ```\n\n8. Ensure the table created previously table still exists\n\n   ```\n   mysql> connect sample;\n   Reading table information for completion of table and column names\n   You can turn off this feature to get a quicker startup with -A\n\n   Connection id:    4\n   Current database: sample\n\n   myslq> show tables;\n   +------------------+\n   | Tables_in_sample |\n   +------------------+\n   | user             |\n   +------------------+\n   1 row in set (0.00 sec)\n   ```\n\n9. Exit MySQL and the MySQL container.\n\n   ```\n   mysql> exit\n   Bye\n\n   root@132f4b3ec0dc:/# exit\n   exit\n   ```\n\n   The table persisted across container restarts, which is to be expected. In fact, it would have done this whether or not we had actually used a volume as shown in the previous section.\n\n10. Let's look at the volume again\n\n    ```\n    $ docker inspect -f \"in the {{.Name}} container {{(index .Mounts 0).Destination}} is mapped to {{(index .Mounts 0).Source}}\" mysqldb\n    in the /mysqldb container /var/lib/mysql is mapped to /var/lib/docker/volumes/cd79b3301df29d13a068d624467d6080354b81e34d794b615e6e93dd61f89628/_data\n    ```\n\n    We do see the volume was not affected by the container restart either.\n\n    Where people often get confused is in expecting that the anonymous volume can be used to persist data BETWEEN containers.\n\n    To examine that delete the old container, create a new one with the same command, and check to see if the table exists.\n\n11. Remove the current MySQL container\n\n    ```\n    $ docker container rm --force mysqldb\n    mysqldb\n    ```\n\n12. Start a new container with the same command that was used before\n\n    ```\n    $ docker run --name mysqldb -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=sample -e MYSQL_ROOT_PASSWORD=supersecret -d mysql\n    eb15eb4ecd26d7814a8da3bb27cee1a23304fab1961358dd904db37c061d3798\n    ```\n\n13. List out the volume details for the new container\n\n    ```\n    $ docker inspect -f \"in the {{.Name}} container {{(index .Mounts 0).Destination}} is mapped to {{(index .Mounts 0).Source}}\" mysqldb\n    in the /mysqldb container /var/lib/mysql is mapped to /var/lib/docker/volumes/e0ffdc6b4e0cfc6e795b83cece06b5b807e6af1b52c9d0b787e38a48e159404a/_data\n    ```\n\n    Notice this directory is different than before.\n\n14. Shell back into the running container and log into MySQL\n\n    ```\n    $ docker exec --interactive --tty mysqldb bash\n\n    root@132f4b3ec0dc:/# mysql --user=mysql --password=mysql\n    mysql: [Warning] Using a password on the command line interface can be insecure.\n    Welcome to the MySQL monitor.  Commands end with ; or \\g.\n    Your MySQL connection id is 3\n    Server version: 5.7.19 MySQL Community Server (GPL)\n\n    Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.\n\n    Oracle is a registered trademark of Oracle Corporation and/or its\n    affiliates. Other names may be trademarks of their respective\n    owners.\n\n    Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n    ```\n\n15. Check to see if table created previously table still exists\n\n    ```\n    mysql> connect sample;\n    Connection id:    4\n    Current database: sample\n\n    mysql> show tables;\n    Empty set (0.00 sec)\n    ```\n\n16. Exit MySQL and the MySQL container.\n\n    ```\n    mysql> exit\n    Bye\n\n    root@132f4b3ec0dc:/# exit\n    exit\n    ```\n\n17. Remove the container\n\n    ```\n    docker container rm --force mysqldb\n    mysqldb\n    ```\n\nSo while a volume was used to store the new table in the original container, because it wasn't a named volume the data could not be persisted between containers.\n\nTo achieve persistence a named volume should be used.\n\n### Named Volumes\n\nA named volume (as the name implies) is a volume that's been explicitly named and can easily be referenced.\n\nA named volume can be created on the command line, in a docker-compose file, and when you start a new container. They [CANNOT be created as part of the image's dockerfile](https://github.com/moby/moby/issues/30647).\n\n1. Start a MySQL container with a named volume (`mydbdata`)\n\n   ```\n   $ docker run --name mysqldb \\\n   -e MYSQL_USER=mysql \\\n   -e MYSQL_PASSWORD=mysql \\\n   -e MYSQL_DATABASE=sample \\\n   -e MYSQL_ROOT_PASSWORD=supersecret \\\n   --detach \\\n   --mount type=volume,source=mydbdata,target=/var/lib/mysql \\\n   mysql\n   ```\n\n   Because the newly created volume is empty, Docker will copy over whatever existed in the container at `/var/lib/mysql` when the container starts.\n\n   Docker volumes are primitives just like images and containers. As such, they can be listed and removed in the same way.\n\n2. List the volumes on the Docker host\n\n   ```\n   $ docker volume ls\n   DRIVER              VOLUME NAME\n   local               55c322b9c4a644a5284ccb5e4d7b6b466a0534e26d57c9ef4221637d39cf9a88\n   local               cc44059d23e0a914d4390ea860fd35b2acdaa480e83c025fb381da187b652a66\n   local               e0ffdc6b4e0cfc6e795b83cece06b5b807e6af1b52c9d0b787e38a48e159404a\n   local               mydbdata\n   ```\n\n3. Inspect the volume\n\n   ```\n   $ docker inspect mydbdata\n   [\n       {\n           \"CreatedAt\": \"2017-10-13T19:55:10Z\",\n           \"Driver\": \"local\",\n           \"Labels\": null,\n           \"Mountpoint\": \"/var/lib/docker/volumes/mydbdata/_data\",\n           \"Name\": \"mydbdata\",\n           \"Options\": {},\n           \"Scope\": \"local\"\n       }\n   ]\n   ```\n\n   Any data written to `/var/lib/mysql` in the container will be rerouted to `/var/lib/docker/volumes/mydbdata/_data` instead.\n\n4. Shell into your running MySQL container and log into MySQL\n\n   ```\n   $ docker exec --tty --interactive mysqldb bash\n\n   root@132f4b3ec0dc:/# mysql --user=mysql --password=mysql\n   mysql: [Warning] Using a password on the command line interface can be insecure.\n   Welcome to the MySQL monitor.  Commands end with ; or \\g.\n   Your MySQL connection id is 3\n   Server version: 5.7.19 MySQL Community Server (GPL)\n\n   Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.\n\n   Oracle is a registered trademark of Oracle Corporation and/or its\n   affiliates. Other names may be trademarks of their respective\n   owners.\n\n   Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n   ```\n\n5. Create a new table\n\n   ```\n   mysql> connect sample;\n   Connection id:    4\n   Current database: sample\n\n   mysql> show tables;\n   Empty set (0.00 sec)\n\n   mysql> create table user(name varchar(50));\n   Query OK, 0 rows affected (0.01 sec)\n\n   mysql> show tables;\n   +------------------+\n   | Tables_in_sample |\n   +------------------+\n   | user             |\n   +------------------+\n   1 row in set (0.00 sec)\n   ```\n\n6. Exit MySQL and the MySQL container.\n\n   ```\n   mysql> exit\n   Bye\n\n   root@132f4b3ec0dc:/# exit\n   exit\n   ```\n\n7. Remove the MySQL container\n\n   ```\n   $ docker container rm --force mysqldb\n   ```\n\n   Because the MySQL was writing out to a named volume, we can start a new container with the same data.\n\n   When the container starts it will not overwrite existing data in a volume. So the data created in the previous steps will be left intact and mounted into the new container.\n\n8. Start a new MySQL container\n\n   ```\n   $ docker run --name new_mysqldb \\\n   -e MYSQL_USER=mysql \\\n   -e MYSQL_PASSWORD=mysql \\\n   -e MYSQL_DATABASE=sample \\\n   -e MYSQL_ROOT_PASSWORD=supersecret \\\n   --detach \\\n   --mount type=volume,source=mydbdata,target=/var/lib/mysql \\\n   mysql\n   ```\n\n9. Shell into your running MySQL container and log into MySQL\n\n   ```\n   $ docker exec --tty --interactive new_mysqldb bash\n\n   root@132f4b3ec0dc:/# mysql --user=mysql --password=mysql\n   mysql: [Warning] Using a password on the command line interface can be insecure.\n   Welcome to the MySQL monitor.  Commands end with ; or \\g.\n   Your MySQL connection id is 3\n   Server version: 5.7.19 MySQL Community Server (GPL)\n\n   Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.\n\n   Oracle is a registered trademark of Oracle Corporation and/or its\n   affiliates. Other names may be trademarks of their respective\n   owners.\n\n   Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n   ```\n\n10. Check to see if the previously created table exists in your new container.\n\n    ```\n    mysql> connect sample;\n    Reading table information for completion of table and column names\n    You can turn off this feature to get a quicker startup with -A\n\n    Connection id:    4\n    Current database: sample\n\n    mysql> show tables;\n    +------------------+\n    | Tables_in_sample |\n    +------------------+\n    | user             |\n    +------------------+\n    1 row in set (0.00 sec)\n    ```\n\n    The data will exist until the volume is explicitly deleted.\n\n11. Exit MySQL and the MySQL container.\n\n    ```\n    mysql> exit\n    Bye\n\n    root@132f4b3ec0dc:/# exit\n    exit\n    ```\n\n12. Remove the new MySQL container and volume\n\n    ```\n    $ docker container rm --force new_mysqldb\n    new_mysqldb\n\n    $ docker volume rm mydbdata\n    mydbdata\n    ```\n\n    If a new container was started with the previous command, it would create a new empty volume.\n\n## Let's Take a Break then continue to WebApps Part 2\n\nFor the next step in the tutorial, head over to [Webapps with Docker - Part Two](./webapps-part2.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/mongo-2.md",
    "content": "# Deploying MongoDB\n\nIn this lab you'll learn how to deploy MongoDB with Docker.\n\nYou will complete the following steps as part of this lab.\n\n- [Task 1 - Build Custom Image](#Task_1)\n- [Task 2 - Building a NodeRed Stack](#Task_2)\n- [Task 3 - Configuring Node-RED](#Task_3)\n- [Task 4 - Replicated MongoDB](#Task_4)\n- [Task 5 - Cleanup](#Task_4)\n\nIn this lab the terms *service task* and *container* are used interchangeably.\nIn all examples in the lab a *service tasks* is a container that is running as\npart of a service.\n\n## Overview NodeRed, MongoDB, and Docker\nNodeRed is a flow-based programming tool based on NodeJs. The interface allows for easily dragging and dropping nodes and wiring them together. The real power of NodeRed is when it is combined with Docker. Docker allows easily to provison services which NodeRed can connect to.\n\nIn this chapter we will cover the basics of running NodeRed inside of a Docker container. Once we have accomplished the deplyoment of NodeRed with Docker we will then add a MongoDB database which we will connect to from inside NodeRed.\n\nTo get started, let's run the following in our terminal:\n```\n$ docker run -it -p 1880:1880 --name mynodered nodered/node-red-docker\n```\n\nWe can now access the NodeRed UI via `http://<hostip>:1880`\n\n\n### <a name=\"Task_1\"></a>Task 1: Building Custom Images\n\nCreating a new Docker image, using the public Node-RED images as the base image, allows you to install extra nodes during the build process.\n\nCreate a file called Dockerfile with the content:\n\n```\n FROM nodered/node-red-docker\n RUN npm install node-red-node-twitter\n```\n\nRun the following command to build the image:\n\n```\n docker build -t mynodered:<tag> .\n```\n\nThat will create a Node-RED image that includes the wordpos nodes.\n\n\n### <a name=\"Task_2\"></a>Task 2: Building a NodeRed Stack\nIn the Docker Swarm Chapter, we linked containers together using the Docker compose file.\n\nFor example, if you have a container that providesis your APP and you would like to connect it to a MongoDB to persist the data. In this example, we link the Node-RED container with MongoDB so node-red can store data:\n\nWe will now create a Docker compose stack using the Dockerfile from section 1.3.\n\n1. Create a directory called nodered and change to the nodered directory\n2. Create a file named `Dockerfile` in this directory with the following code:\n\n```\n FROM nodered/node-red-docker\n RUN npm install node-red-node-twitter\n RUN npm install node-red-node-mongodb\n```\n\n1. Create a file name `docker-compose.yml`\n2. Copy the below text into a file named `docker-compose.yml`\n\n\n```\nversion: '3.1'\nnetworks:\n  node-red:\n\nservices:\n nodered:\n   build: .\n   ports:\n     - \"1880:1880\"\n   volumes:\n     - ./data:/data\n     - ./public:/home/nol/node-red-static\n   links:\n    - mongodb:mongodb\n   networks:\n    - node-red\n\n mongodb:\n   image: mongo\n   volumes:\n      - /path/to/mongodb-persistence:/bitnami\n   ports:\n     - \"27017:27017\"\n   networks:\n     - node-red\n```\n\n* Run the command from the CLI: `docker-compose up`\n\n\n## <a name=\"Task_3\"></a>Task 3: Configuring Node-RED to see the new services\nNow, we will walk through how Node-RED can use the new MongoDB\n\nAccess Node-Red `http://<hostip>:1880`\n\n\n## <a name=\"Task_4\"></a>Task 4: Replicated MongoDB\nTo setup a MongoDB cluster is quite easy. To understand how a MongoDB cluster works review the [MongoDB replication documentaiton](https://docs.mongodb.com/manual/replication/)\n\n```\nservices:\n  mongodb-primary:\n    image: 'bitnami/mongodb:latest'\n    environment:\n      - MONGODB_REPLICA_SET_MODE=primary\n      - MONGODB_ROOT_PASSWORD=password123\n      - MONGODB_REPLICA_SET_KEY=replicasetkey123\n    volumes:\n      - 'mongodb_master_data:/bitnami'\n\n  mongodb-secondary:\n    image: 'bitnami/mongodb:latest'\n    depends_on:\n      - mongodb-primary\n    environment:\n      - MONGODB_REPLICA_SET_MODE=secondary\n      - MONGODB_PRIMARY_HOST=mongodb-primary\n      - MONGODB_PRIMARY_PORT_NUMBER=27017\n      - MONGODB_PRIMARY_ROOT_PASSWORD=password123\n      - MONGODB_REPLICA_SET_KEY=replicasetkey123\n\n  mongodb-arbiter:\n    image: 'bitnami/mongodb:latest'\n    depends_on:\n      - mongodb-primary\n    environment:\n      - MONGODB_REPLICA_SET_MODE=arbiter\n      - MONGODB_PRIMARY_HOST=mongodb-primary\n      - MONGODB_PRIMARY_PORT_NUMBER=27017\n      - MONGODB_PRIMARY_ROOT_PASSWORD=password123\n      - MONGODB_REPLICA_SET_KEY=replicasetkey123\n\nvolumes:\n  mongodb_master_data:\n    driver: local\n```\n\nIn the above example we can easily scale our MongoDB cluster:\n\n```\n$ docker-compose scale mongodb-primary=1 mongodb-secondary=3 mongodb-arbiter=1\n```\n\nThe above command scales up the number of secondary nodes to 3\n\n## <a name=\"Task_5\"></a>Task 5: Cleanup\n\nThis is the final cleanup where we will delete all the containers, networks, and volumes from your Docker Host. **Only if you want to**\n\n1. First stop the running MongoDB stack\n\n```\n$ docker-compose rm\n```\n\n2. Prune Docker of all containers, images, networks, and basically everything else.\n\n```\n$ docker system prune\nWARNING! This will remove:\n        - all stopped containers\n        - all networks not used by at least one container\n        - all dangling images\n        - all build cache\nAre you sure you want to continue? [y/N]\n``\n\n\n## Next Steps\n[Additional Ressources](./README.md)"
  },
  {
    "path": "Docker/kickstart/chapters/mongo.md",
    "content": "# Deploying MongoDB\n\nIn this lab you'll learn how to deploy MongoDB with Docker.\n\n## Overview MongoDB and Docker\n\nMongoDB is a free and open-source cross-platform document-oriented database program. Classified as a NoSQL database program, MongoDB uses JSON-like documents with schemas.\n\nTo get started, let's run the following in our terminal:\n\n```\n$ docker run \\\n    -v /data/files/path:/bitnami \\\n    bitnami/mongodb:latest\n```\n\nNow, Mongo is running and is available for internal connections on port 27017 \n\n### Persisting Data in Mongo\n\nRunning a MongoDB container without a persistent data storage will not persist your data if you delete your container. In this section we add a `VOLUME` which will be used to persist data and be always available.\n\n1. Create a file name `docker-compose.yml`\n2. Copy the below text into a file named `docker-compose.yml`\n\n\n```\nversion: '3.1'\nnetworks:\n  mongo-net:\n\nservices:\n  mongodb:\n    image: 'bitnami/mongodb:latest'\n    volumes:\n      - /path/to/mongodb-persistence:/bitnami\n    ports:\n      - \"27017:27017\"\n    environment:\n      - MONGODB_USERNAME=my_user\n      - MONGODB_PASSWORD=password123\n      - MONGODB_DATABASE=my_database\n```\n\n* Run the command from the CLI: `docker-compose up`\n\n\n## Configuring Node-RED to see the new services\nNow, we will walk through how Node-RED can use the new MongoDB\n\nAccess Node-Red `http://<hostip>:1880`\n\n\n## Next Steps\nFor the next step in the tutorial, head over to [MongoDB connected to an APP](./mongo-2.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/networking-basics.md",
    "content": "# Docker Networking Basics\n\nIn this lab you'll look at the most basic networking components that come with a fresh installation of Docker.\n\nYou will complete the following steps as part of this lab.\n\n- [Task 1 - The `docker network` command](#docker_network)\n- [Task 2 - List networks](#list_networks)\n- [Task 3 - Inspect a network](#inspect)\n- [Task 4 - List network driver plugins](#list_drivers)\n- [Task 5 - Create Network](#create_network)\n- [Task 6 - Remove Network](#remove_network)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker Host running Docker 1.12 or higher\n\n# <a name=\"docker_network\"></a>Task 1: The `docker network` command\n\nThe `docker network` command is the main command for configuring and managing container networks.\n\nRun a simple `docker network` command from any of your lab machines.\n\n```\n$ docker network\n\nUsage:  docker network COMMAND\n\nManage Docker networks\n\nOptions:\n      --help   Print usage\n\nCommands:\n  connect     Connect a container to a network\n  create      Create a network\n  disconnect  Disconnect a container from a network\n  inspect     Display detailed information on one or more networks\n  ls          List networks\n  rm          Remove one or more networks\n\nRun 'docker network COMMAND --help' for more information on a command.\n```\n\nThe command output shows how to use the command as well as all of the `docker network` sub-commands. As you can see from the output, the `docker network` command allows you to create new networks, list existing networks, inspect networks, and remove networks. It also allows you to connect and disconnect containers from networks.\n\n# <a name=\"list_networks\"></a>Task 2: List networks\n\nRun a `docker network ls` command to view existing container networks on the current Docker host.\n\n```\n$ docker network ls\nNETWORK ID          NAME                DRIVER              SCOPE\n1befe23acd58        bridge              bridge              local\n726ead8f4e6b        host                host                local\nef4896538cc7        none                null                local\n```\n\nThe output above shows the container networks that are created as part of a standard installation of Docker.\n\nNew networks that you create will also show up in the output of the `docker network ls` command.\n\nYou can see that each network gets a unique `ID` and `NAME`. Each network is also associated with a single driver. Notice that the \"bridge\" network and the \"host\" network have the same name as their respective drivers.\n\n# <a name=\"inspect\"></a>Task 3: Inspect a network\n\nThe `docker network inspect` command is used to view network configuration details. These details include; name, ID, driver, IPAM driver, subnet info, connected containers, and more.\n\nUse `docker network inspect` to view configuration details of the container networks on your Docker host. The command below shows the details of the network called `bridge`.\n\n```\n$ docker network inspect bridge\n[\n    {\n        \"Name\": \"bridge\",\n        \"Id\": \"1befe23acd58cbda7290c45f6d1f5c37a3b43de645d48de6c1ffebd985c8af4b\",\n        \"Scope\": \"local\",\n        \"Driver\": \"bridge\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": null,\n            \"Config\": [\n                {\n                    \"Subnet\": \"172.17.0.0/16\",\n                    \"Gateway\": \"172.17.0.1\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Containers\": {},\n        \"Options\": {\n            \"com.docker.network.bridge.default_bridge\": \"true\",\n            \"com.docker.network.bridge.enable_icc\": \"true\",\n            \"com.docker.network.bridge.enable_ip_masquerade\": \"true\",\n            \"com.docker.network.bridge.host_binding_ipv4\": \"0.0.0.0\",\n            \"com.docker.network.bridge.name\": \"docker0\",\n            \"com.docker.network.driver.mtu\": \"1500\"\n        },\n        \"Labels\": {}\n    }\n]\n```\n\n> **NOTE:** The syntax of the `docker network inspect` command is `docker network inspect <network>`, where `<network>` can be either network name or network ID. In the example above we are showing the configuration details for the network called \"bridge\". Do not confuse this with the \"bridge\" driver.\n\n\n# <a name=\"list_drivers\"></a>Task 4: List network driver plugins\n\nThe `docker info` command shows a lot of interesting information about a Docker installation.\n\nRun a `docker info` command on any of your Docker hosts and locate the list of network plugins.\n\n```\n$ docker info\nContainers: 0\n Running: 0\n Paused: 0\n Stopped: 0\nImages: 0\nServer Version: 1.12.3\nStorage Driver: aufs\n<Snip>\nPlugins:\n Volume: local\n Network: bridge host null overlay    <<<<<<<<\nSwarm: inactive\nRuntimes: runc\n<Snip>\n```\n\nThe output above shows the **bridge**, **host**, **null**, and **overlay** drivers.\n\n# <a name=\"create_network\"></a>Task 5: Create Network\n\nNow we will provision our own network called `my-network` with the following configuration\n\n`--driver` - indicated the network driver to utilize for the network\n`--internal` - configures the network as an internal private network with no internet access\n`--subnet`- define the subnet of the network\n`--ip-range` - IP range available to the containers on this network\n`--gateway`- Network gateway to be used\n\n\n```\n$ docker network create \\\n--driver bridge \\\n--internal \\\n--subnet=172.28.0.0/16 \\\n--ip-range=172.28.5.0/24 \\\n--gateway=172.28.5.254 \\\nmy-network\n\nd6b825e0fb2d96f13719affc3e7658df2c9dc70ccfb4b9e6405348a1624e5d4b\n\n```\n\nLet's have a look at out newly created network\n\n```\ndocker network ls                                                                                                                                                                                                                                                                                                                            \nNETWORK ID          NAME                DRIVER              SCOPE\n4504287a8cd2        bridge              bridge              local\nc6282c586073        docker_gwbridge     bridge              local\nf0d518128cc6        host                host                local\n18789d70fb40        my-network          bridge              local\nf806d1a20208        none                null                local\n```\n\nNow, inspect `my-network`\n\n```\n$ docker network inspect my-network                                                                                                                                                                                                                                                                                                            \n[\n    {\n        \"Name\": \"my-network\",\n        \"Id\": \"09aefb1784bc64cd8ad9ef1e3a2132fa0812137b1ff8477c73eeb3050f9dcc21\",\n        \"Created\": \"2019-12-02T10:04:43.300611371Z\",\n        \"Scope\": \"local\",\n        \"Driver\": \"bridge\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"172.28.0.0/16\",\n                    \"IPRange\": \"172.28.5.0/24\",\n                    \"Gateway\": \"172.28.5.254\"\n                }\n            ]\n        },\n        \"Internal\": true,\n        \"Attachable\": false,\n        \"Ingress\": false,\n        \"ConfigFrom\": {\n            \"Network\": \"\"\n        },\n        \"ConfigOnly\": false,\n        \"Containers\": {},\n        \"Options\": {},\n        \"Labels\": {}\n    }\n]\n\n```\n\n# <a name=\"delete_network\"></a>Task 6: Delete Network\n\nCleanup the newly create `my-network`\n\n\n```\n$ docker network rm my-network\n\n```\n\n## Next Steps, Web Apps\nFor the next step in the tutorial, head over to [Webapps with Docker](./webapps.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/nextsteps.md",
    "content": "#Next Steps\nNow that you've built some images and pushed them to Docker Cloud, and learned the basics of Swarm mode, you can explore more of Docker by checking out [the documentation](https://docs.docker.com). And if you need any help, check out the [Docker Forums](https://forums.docker.com) or [StackOverflow](https://stackoverflow.com/tags/docker/).\n"
  },
  {
    "path": "Docker/kickstart/chapters/nodered.md",
    "content": "## 4.0 Overview NodeRed and Docker\nNodeRed is a flow-based programming tool based on NodeJs. The interface allows for easily dragging and dropping nodes and wiring them together. The real power of NodeRed is when it is combined with Docker. Docker allows easily to provison services which NodeRed can connect to.\n\nIn this chapter we will cover the basics of running NodeRed inside of a Docker container. Once we have accomplished the deplyoment of NodeRed with Docker we will then add a MongoDB database which we will connect to from inside NodeRed.\n\nTo get started, let's run the following in our terminal:\n```\n$ docker run -it -p 1880:1880 --name mynodered nodered/node-red-docker\n```\n\nWe can now access the NodeRed UI via `http://<hostip>:1880`\n\n### 4.1 Configuring Node-RED\nGreat! Let's configure the Node-RED container and add a node:\n\n\n```\n# Open a shell in the container\ndocker exec -it mynodered /bin/bash\n\n# Once inside the container, npm install the nodes in /data\ncd /data\nnpm install node-red-node-smooth\nexit\n```\n\nHit `Ctrl-p` `Ctrl-q` to detach from the container. \n\n### 4.2 Persisting Data\nIn the last section, you saw a lot of Docker-specific jargon which might be confusing to some. So before you go further, let's clarify some terminology that is used frequently in the Docker ecosystem.\n\n\n### 4.3 Building Custom Images\n\nCreating a new Docker image, using the public Node-RED images as the base image, allows you to install extra nodes during the build process.\n\nCreate a file called Dockerfile with the content:\n\n```\n FROM nodered/node-red-docker\n RUN npm install node-red-node-twitter\n```\n\nRun the following command to build the image:\n\n```\n docker build -t mynodered:<tag> .\n```\n\nThat will create a Node-RED image that includes the wordpos nodes.\n\n\n### 4.4 Building a NodeRed Stack\nIn the Docker Swarm Chapter, we linked containers together using the Docker compose file.\n\nFor example, if you have a container that provides an MQTT broker container called mybroker, you can run the Node-RED container with the link parameter to join the two:\n\n```\ndocker run -it -p 1880:1880 --name mynodered --link mybroker:broker nodered/node-red-docker\n```\n\nThis will make broker a known hostname within the Node-RED container that can be used to access the service within a flow, without having to expose it outside of the Docker host.\n\nWe will now create a Docker compose stack using the Dockerfile from section 1.3.\n\n1. Create a directory called nodered and change to the nodered directory\n2. Create a file named `Dockerfile` in this directory with the following code:\n\n```\n FROM nodered/node-red-docker\n RUN npm install node-red-node-twitter\n RUN npm install node-red-node-mongodb\n```\n\n1. Create a file name `docker-compose.yml`\n2. Copy the below text into a file named `docker-compose.yml`\n\n\n```\nversion: '3.1'\nnetworks:\n  node-red:\n\nservices:\n nodered:\n   build: .\n   ports:\n     - \"1880:1880\"\n   volumes:\n     - ./data:/data\n     - ./public:/home/nol/node-red-static\n   links:\n    - mongodb:mongodb\n   networks:\n    - node-red\n\n mongodb:\n   image: mongo\n   ports:\n     - \"27017:27017\"\n   networks:\n     - node-red\n```\n\n* Run the command from the CLI: `docker-compose up`\n\n\n## 4.5 Configuring Node-RED to see the new services\nNow, we will walk through how Node-RED can use the new MongoDB\n\nAccess Node-Red `http://<hostip>:1880`\n\n\n## Next Steps\nFor the next step in the tutorial, head over to [5.0 Deploying an InfluxDB Stack](./influxdb.md)"
  },
  {
    "path": "Docker/kickstart/chapters/prometheus.md",
    "content": "## 1.0 Running your first container\nNow that you have everything setup, it's time to get our hands dirty. In this section, you are going to run an [Alpine Linux](http://www.alpinelinux.org/) container (a lightweight linux distribution) on your system and get a taste of the `docker run` command.\n\nTo get started, let's run the following in our terminal:\n```\n$ docker pull alpine\n```\n\n> **Note:** Depending on how you've installed docker on your system, you might see a `permission denied` error after running the above command. Try the commands from the Getting Started tutorial to [verify your installation](https://docs.docker.com/engine/getstarted/step_one/#/step-3-verify-your-installation). If you're on Linux, you may need to prefix your `docker` commands with `sudo`. Alternatively you can [create a docker group](https://docs.docker.com/engine/installation/linux/ubuntulinux/#/create-a-docker-group) to get rid of this issue.\n\nThe `pull` command fetches the alpine **image** from the **Docker registry** and saves it in our system. You can use the `docker images` command to see a list of all images on your system.\n```\n$ docker images\nREPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE\nalpine                 latest              c51f86c28340        4 weeks ago         1.109 MB\nhello-world             latest              690ed74de00f        5 months ago        960 B\n```\n\n### 1.1 Docker Run\nGreat! Let's now run a Docker **container** based on this image. To do that you are going to use the `docker run` command.\n\n```\n$ docker run alpine ls -l\ntotal 48\ndrwxr-xr-x    2 root     root          4096 Mar  2 16:20 bin\ndrwxr-xr-x    5 root     root           360 Mar 18 09:47 dev\ndrwxr-xr-x   13 root     root          4096 Mar 18 09:47 etc\ndrwxr-xr-x    2 root     root          4096 Mar  2 16:20 home\ndrwxr-xr-x    5 root     root          4096 Mar  2 16:20 lib\n......\n......\n```\nWhat happened? Behind the scenes, a lot of stuff happened. When you call `run`,\n1. The Docker client contacts the Docker daemon\n2. The Docker daemon checks local store if the image (alpine in this case) is available locally, and if not, dowloads it from Docker Store. (Since we have issued `docker pull alpine` before, the download step is not necessary)\n3. The Docker daemon creates the container and then runs a command in that container.\n4. The Docker daemon streams the output of the command to the Docker client\n\nWhen you run `docker run alpine`, you provided a command (`ls -l`), so Docker started the command specified and you saw the listing.\n\nLet's try something more exciting.\n\n```\n$ docker run alpine echo \"hello from alpine\"\nhello from alpine\n```\nOK, that's some actual output. In this case, the Docker client dutifully ran the `echo` command in our alpine container and then exited it. If you've noticed, all of that happened pretty quickly. Imagine booting up a virtual machine, running a command and then killing it. Now you know why they say containers are fast!\n\nTry another command.\n```\n$ docker run alpine /bin/sh\n```\n\nWait, nothing happened! Is that a bug? Well, no. These interactive shells will exit after running any scripted commands, unless they are run in an interactive terminal - so for this example to not exit, you need to `docker run -it alpine /bin/sh`.\n\nYou are now inside the container shell and you can try out a few commands like `ls -l`, `uname -a` and others. Exit out of the container by giving the `exit` command.\n\n\nOk, now it's time to see the `docker ps` command. The `docker ps` command shows you all containers that are currently running.\n\n```\n$ docker ps\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n```\n\nSince no containers are running, you see a blank line. Let's try a more useful variant: `docker ps -a`\n\n```\n$ docker ps -a\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES\n36171a5da744        alpine              \"/bin/sh\"                5 minutes ago       Exited (0) 2 minutes ago                        fervent_newton\na6a9d46d0b2f        alpine             \"echo 'hello from alp\"    6 minutes ago       Exited (0) 6 minutes ago                        lonely_kilby\nff0a5c3750b9        alpine             \"ls -l\"                   8 minutes ago       Exited (0) 8 minutes ago                        elated_ramanujan\nc317d0a9e3d2        hello-world         \"/hello\"                 34 seconds ago      Exited (0) 12 minutes ago                       stupefied_mcclintock\n```\n\nWhat you see above is a list of all containers that you ran. Notice that the `STATUS` column shows that these containers exited a few minutes ago. You're probably wondering if there is a way to run more than just one command in a container. Let's try that now:\n\n```\n$ docker run -it alpine /bin/sh\n/ # ls\nbin      dev      etc      home     lib      linuxrc  media    mnt      proc     root     run      sbin     sys      tmp      usr      var\n/ # uname -a\nLinux 97916e8cb5dc 4.4.27-moby #1 SMP Wed Oct 26 14:01:48 UTC 2016 x86_64 Linux\n```\nRunning the `run` command with the `-it` flags attaches us to an interactive tty in the container. Now you can run as many commands in the container as you want. Take some time to run your favorite commands.\n\nThat concludes a whirlwind tour of the `docker run` command which would most likely be the command you'll use most often. It makes sense to spend some time getting comfortable with it. To find out more about `run`, use `docker run --help` to see a list of all flags it supports. As you proceed further, we'll see a few more variants of `docker run`.\n### 1.2 Terminology\nIn the last section, you saw a lot of Docker-specific jargon which might be confusing to some. So before you go further, let's clarify some terminology that is used frequently in the Docker ecosystem.\n\n- *Images* - The file system and configuration of our application which are used to create containers. To find out more about a Docker image, run `docker inspect alpine`. In the demo above, you used the `docker pull` command to download the **alpine** image. When you executed the command `docker run hello-world`, it also did a `docker pull` behind the scenes to download the **hello-world** image.\n- *Containers* - Running instances of Docker images &mdash; containers run the actual applications. A container includes an application and all of its dependencies. It shares the kernel with other containers, and runs as an isolated process in user space on the host OS. You created a container using `docker run` which you did using the alpine image that you downloaded. A list of running containers can be seen using the `docker ps` command.\n- *Docker daemon* - The background service running on the host that manages building, running and distributing Docker containers.\n- *Docker client* - The command line tool that allows the user to interact with the Docker daemon.\n- *Docker Store* - A [registry](https://store.docker.com/) of Docker images, where you can find trusted and enterprise ready containers, plugins, and Docker editions. You'll be using this later in this tutorial.\n\n## Next Steps\nFor the next step in the tutorial, head over to [Custom Apps with Mongo and Web Servers](chapters/mongo.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/secrets.md",
    "content": "# Managing Docker Secrets\n\nIn this lab you'll learn how to create and manage *secrets* with Docker.\n\nYou will complete the following steps as part of this lab.\n\n- [Task 1 - Create a Secret](#Task_1)\n- [Task 2 - Manage Secrets](#Task_2)\n- [Task 3 - Access the secret within an app](#Task_3)\n- [Task 4 - Clean-up](#Task_4)\n\nIn this lab the terms *service task* and *container* are used interchangeably.\nIn all examples in the lab a *service tasks* is a container that is running as\npart of a service.\n\n## Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Docker Swarm cluster running **Docker 1.13** or higher\n\n## <a name=\"Task_1\"></a>Task 1: Create a Secret\n\nIn this step you'll use the `docker secret create` command to create a new\n*secret*.\n\nPerform the following command from a *manager* node in your Swarm. This lab will assume that you are using **node1** in your lab.\n\n1. Create a new text file containing the text you wish to use as your secret.\n\n    ```\n    $ echo \"secrets are important\" > sec.txt\n    ```\n\n  The command shown above will create a new file called `sec.txt` in your\n  working directory containing the string **secrets are important**. The text\n  string in the file is arbitrary but should be kept secure. You should follow\n  any existing corporate guidelines about keeping secrets safe.\n\n2. Confirm that the file was created.\n\n    ```\n    $ ls -l\n    \n    total 4\n    \"-rw-r--r-- 1 root root 10 Mar 21 18:40 sec.txt\n    ```\n\n3. Use the `docker secret create` command to create a new secret using the file\ncreated in the previous step.\n\n    ```\n    $ docker secret create sec1 ./sec.txt\n    \n    ftu76ghgsk7f9fmcrj3wx3xcd\n    ```\n\n  The return code of the command is the ID of the newly created secret.\n\nCongratulations. You have created a new secret called `sec1`.\n\nIf you created the secret from a remote Docker client, it would be sent to a\nmanager node in the Swarm over a mutual TLS Connection. Once the secret is\nreceived on the manager node it is securely stored in the Swarm's Raft store\nusing the Swarm's native encryption.\n\nYou can now delete the `sec.txt` file used to create the secret.\n\n## <a name=\"Task_2\"></a>Task 2: Manage Secrets\n\nIn this step you'll use the `docker secret` sub-command to list and inspect\nsecrets.\n\nBefore going any further it's important to note that once a secret is created\nit is securely stored in the Swarm's encrypted Raft store. This means that you\ncannot view it in plain text using the `docker secret` command.\n\nPerform all of the following commands from a Swarm *manager*.  The lab assumes you will be using **node1** in your lab.\n\n1. List existing secrets with the `docker secret ls` command.\n\n    ```\n    $ docker secret ls\n    \n    ID                     NAME      CREATED             UPDATED\n    ftu76ghg...rj3wx3xcd   sec1      11 seconds ago      11 seconds ago\n    ```\n\n2. Inspect the **sec1** secret.\n\n    ```\n    $ docker secret inspect sec1\n    \n    [\n      {\n        \"ID\": \"ftu76ghgsk7f9fmcrj3wx3xcd\",\n        \"Version\": {\n            \"Index\": 113\n        },\n        \"CreatedAt\": \"2017-03-21T18:41:08.790769302Z\",\n        \"UpdatedAt\": \"2017-03-21T18:41:08.790769302Z\",\n        \"Spec\": {\n            \"Name\": \"sec1\"\n        }\n    }\n    ]\n    ```\n\n  Notice that the `docker secret inspect` command does not display the\n  unencrypted contents of the secret.\n\n\n## <a name=\"Task_3\"></a>Task 3: Access the secret within an app\n\nIn this step you'll deploy a service and grant it access to the secret. You'll\nthen `exec` on to a task in the service and view the unencrypted contents of the\n secret.\n\nPerform the following commands from a *manager* node in the Swarm and be sure\nto remember that the outputs of the commands might be different in your lab.\nE.g. service tasks in your lab might be scheduled on different nodes to those\nshown in the examples below.\n\n1. Create a new service and attach the `sec1` secret.\n\n    ```\n    $ docker service create --name sec-test --secret=\"sec1\" redis:alpine\n\n    p858ush7oeei8647na2xa12sc\n    ```\n\n  This command creates a new service called **sec-test**. The service has a\n  single task (container), is given access to the **sec1** secret and is based\n  on the `redis:alpine` image.\n\n2. Verify the service is running.\n\n    ```\n    $ docker service ls\n    \n    ID             NAME       MODE         REPLICAS   IMAGE\n    p858ush7oeei   sec-test   replicated   1/1        redis:alpine\n    ```\n\n3. Inspect the `sec-test` service to verify that the secret is associated with\nit.\n\n    ```\n    $ docker service inspect sec-test\n    [\n      {\n        \"ID\": \"p858ush7oeei8647na2xa12sc\",\n        \"Version\": {\n            \"Index\": 116\n        },\n        \"CreatedAt\": \"2017-03-21T19:37:52.254797962Z\",\n        \"UpdatedAt\": \"2017-03-21T19:37:52.254797962Z\",\n        \"Spec\": {\n            \"Name\": \"sec-test\",\n            \"TaskTemplate\": {\n                \"ContainerSpec\": {\n                    \"Image\": \"redis:alpine@sha256:9cd405cd...fb4ec7bdc3ee7\",\n                    \"DNSConfig\": {},\n                    \"Secrets\": [\n                        {\n                            \"File\": {\n                                \"Name\": \"sec1\",\n                                \"UID\": \"0\",\n                                \"GID\": \"0\",\n                                \"Mode\": 292\n                            },\n                            \"SecretID\": \"ftu76ghgsk7f9fmcrj3wx3xcd\",\n                            \"SecretName\": \"sec1\"\n                            <Snip>\n    ```\n\n  The output above shows that the `sec1` secret (ID:ftu76ghgsk7f9fmcrj3wx3xcd)\n  is successfully associated with the `sec-test` service. This is important as\n  it is what ultimately grants tasks within the service access to the secret.\n\n4. Obtain the name of any of the tasks in the `sec-test` service (if you've been\nfollowing along there will only be one task running in the service).\n\n    ```\n    //Run the following docker service ps command to see which node\n    the service task is running on.\n\n    $ docker service ps sec-test\n    \n    ID          NAME        IMAGE         NODE    DESIRED STATE  CURRENT STATE   \n    9qqp...htd  sec-test.1  redis:alpine  node1   Running        Running 8 mins..\n\n    //Log on to the node running the service task (node1 in this example, but\n    might be different in your lab) and run a docker ps command.\n\n    $ docker ps --filter name=sec-test\n    \n    CONTAINER ID    IMAGE                     COMMAND                  CREATED   STATUS      PORTS      NAMES\n    5652c1688f40    redis@sha256:9cd..c3ee7   \"docker-entrypoint...\"   15 mins   Up 15 mins  6379/tcp   sec-test.1.9qqp...vu2aw\n    ```\n\n  You will use the `CONTAINER ID` from the output above in the next step.\n\n  > NOTE: The two commands above start out by listing all the tasks in the\n  `sec-test` service. Part of the output of the first command shows the `NODE`\n  that each task is running on - in the example above this was a single task\n  running on **node1**. The next command (`docker ps`) lists all running\n  containers on **node1** and filters the results to show just the containers\n  where the name starts with **sec-test** - this means that only containers\n  (tasks) that are part of the `sec-test` service are displayed.\n\n5. Use the `docker exec` command to get a shell prompt on to the `sec-test`\nservice task. Be sure to substitute the Container ID in the command below with\na the container ID form your environment (see output of previous step).\n\n    ```\n    $ docker exec -it <CONTAINER ID> sh\n    \n    data#\n    ```\n\n  The `data#` prompt is a shell prompt inside the service task.\n\n6. List the contents of the container's `/run/secrets` directory.\n\n    ```\n    node1$ ls -l /run/secrets\n    total 4\n    \"-r--r--r--  1   root   root     10 Mar 21 19:37 sec1\n    ```\n\n  Secrets are only shared to *service tasks/containers* that are granted access\n  to them, and the secrets are shared with the *service task* via the TLS\n  connections that already exists between nodes in the Swarm. Once a *node* has\n  a secret it mounts it as a regular file into an in-memory filesystem inside\n  the authorized service task (container). This file is mounted at\n  `/run/secrets` with the same name as the secret. In the example above, the\n  `sec1` secret is mounted as a file called **sec1**.\n\n7. View the unencrypted contents of the *secret*.\n\n    ```\n    $ cat /run/secrets/sec1\n    \n    secrets are important\n    ```\n\nIt's important to note several things about this unencrypted secret.\n\n- The secret is only made available to services that have been specifically\ngranted access to it (in our example this was via the `docker service create`\n  command).\n- The secret is issued to the service task by a manager in the Swarm via a\nmutually authenticated TLS connection.\n- Service tasks and nodes cannot request a secret - secrets are always issued\nto the node/task by a manager as part of a service deployment or update.\n- Secrets are only ever mounted to in-memory filesystems inside of authorized\ncontainers/tasks and are never persisted to disk on worker nodes or containers.\n- Nodes do not have access to the unencrypted secret.\n- Other tasks and containers on the same node do not get access to the secret.\n- As soon as a node is no longer running a task for a service it will delete\nthe secret from memory.\n\n**Congratulations**, you have completed this lab on Secrets management.\n\n## <a name=\"Task_4\"></a>Task 4: Clean-up\n\nIn this step you will remove all secrets and services,as well as clean up any other artifacts created in this lab.\n\n\n1. Remove all services on the host.\n\n   This command will remove **all** services on your Docker host. Only perform this step if you know you know you do not need any of the services running on your system.\n\n    ```\n    $ docker service rm $(docker service ls -q)\n    <Snip>\n    ```\n2. Remove all secrets on the host.\n\n   This command will remove **all** secrets on your Docker host. Only perform this step if you know you will not use these secrets again.\n\n    ```\n    $ docker secret rm $(docker secret ls -q)\n    <Snip>\n    ```\n\n3. If you haven;t already done so, delete the file that you used as the source of the secret data in Step 1.\n\n    ```\n    $ rm sec.txt\n    ```\n\n## Docker & Kuberenetes\n\nA brief demo on Docker & Kubernetes\n\n## Next Steps, Docker Monitoring with Prometheus\n\nFor the next step in the tutorial, head over to [Docker monitoring](https://github.com/vegasbrianc/prometheus)\n"
  },
  {
    "path": "Docker/kickstart/chapters/setup.md",
    "content": "## Setup\n\n### Prerequisites\n\nThere are no specific skills needed for this tutorial beyond a basic comfort with the command line and using a text editor. Prior experience in developing web applications will be helpful but is not required.\n\n### <a name=\"Task_1\"></a>Task 1: Setting up your computer\n\nGetting all the tooling setup on your computer can be a daunting task, but getting Docker up and running on your favorite OS has become very easy.\n\nThe _getting started_ guide on Docker has detailed instructions for setting up Docker on [Mac](https://docs.docker.com/docker-for-mac/install/), [Linux](https://docs.docker.com/engine/installation/linux/) and [Windows](https://docs.docker.com/docker-for-windows/install/).\n\n_All commands work in either bash or Powershell on Windows_\n\nOnce you are done installing Docker, test your Docker installation by running the following:\n\n    $ docker container run hello-world\n    Unable to find image 'hello-world:latest' locally\n    latest: Pulling from library/hello-world\n    03f4658f8b78: Pull complete\n    a3ed95caeb02: Pull complete\n    Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7\n    Status: Downloaded newer image for hello-world:latest\n\n    Hello from Docker.\n    This message shows that your installation appears to be working correctly.\n    ...\n\n## Next Steps\n\nFor the next step in the tutorial, head over to [1.0 Running your first container](alpine.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/votingapp-compose.md",
    "content": "# Deploying an app with Docker Compose\n\nThis portion of the tutorial will guide you through using [Docker Compose](https://docs.docker.com/compose), to run and customize a voting app.\n\n> **Tasks**:\n>\n> - [Task 1: Clone Voting App Repo](#task-1-clone-voting-app-repo)\n> - [Task 2: Understand the Compose File](#task-2-understand-the-compose-file)\n> - [Task 3: Run the Vote App with Docker Compose](#task-3-run-the-vote-app-with-docker-compose)\n> - [Task 4: Customize the Voting App](#task-4-customize-the-voting-app)\n> - [Task 5: Remove the containers](#task-5-remove-the-containers)\n\n**Important.**\nTo complete this section, you will need to have Docker installed on your machine as mentioned in the [Setup](./setup.md) section. You'll also need to have git installed. There are many options for installing it. For instance, you can get it from [GitHub](https://help.github.com/articles/set-up-git/).\n\n## Task 1: Clone Voting App Repo\n\nFor this application we will use the [Docker Example Voting App](https://github.com/docker/example-voting-app). This app consists of five components:\n\n- Python webapp which lets you vote between two options\n- Redis queue which collects new votes\n- .NET worker which consumes votes and stores them in...\n- Postgres database backed by a Docker volume\n- Node.js webapp which shows the results of the voting in real time\n\n1. Clone the repository onto your machine and `cd` into the directory:\n\n   ```\n   $ git clone https://github.com/docker/example-voting-app.git\n\n   $ cd example-voting-app\n   ```\n\n## Task 2: Understand the Compose File\n\nLocate the [Docker Compose](https://docs.docker.com/compose) file. The file we are looking for is in the Docker Example Voting App repo at the root level. It's called `docker-compose.yml`.\n\nLet's review what is inside the file:\n\n```\n# version is now using \"compose spec\"\n# v2 and v3 are now combined!\n# docker-compose v1.27+ required\n\nservices:\n  vote:\n    build: ./vote\n    # use python rather than gunicorn for local dev\n    command: python app.py\n    depends_on:\n      redis:\n        condition: service_healthy\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http://localhost\"]\n      interval: 15s\n      timeout: 5s\n      retries: 3\n      start_period: 10s\n    volumes:\n    - ./vote:/app\n    ports:\n      - \"5000:80\"\n    networks:\n      - front-tier\n      - back-tier\n\n  result:\n    build: ./result\n    # use nodemon rather than node for local dev\n    entrypoint: nodemon server.js\n    depends_on:\n      db:\n        condition: service_healthy\n    volumes:\n      - ./result:/app\n    ports:\n      - \"5001:80\"\n      - \"5858:5858\"\n    networks:\n      - front-tier\n      - back-tier\n\n  worker:\n    build:\n      context: ./worker\n    depends_on:\n      redis:\n        condition: service_healthy\n      db:\n        condition: service_healthy\n    networks:\n      - back-tier\n\n  redis:\n    image: redis:alpine\n    volumes:\n      - \"./healthchecks:/healthchecks\"\n    healthcheck:\n      test: /healthchecks/redis.sh\n      interval: \"5s\"\n    networks:\n      - back-tier\n\n  db:\n    image: postgres:15-alpine\n    environment:\n      POSTGRES_USER: \"postgres\"\n      POSTGRES_PASSWORD: \"postgres\"\n    volumes:\n      - \"db-data:/var/lib/postgresql/data\"\n      - \"./healthchecks:/healthchecks\"\n    healthcheck:\n      test: /healthchecks/postgres.sh\n      interval: \"5s\"\n    networks:\n      - back-tier\n\n  # this service runs once to seed the database with votes\n  # it won't run unless you specify the \"seed\" profile\n  # docker compose --profile seed up -d\n  seed:\n    build: ./seed-data\n    profiles: [\"seed\"]\n    depends_on:\n      vote:\n        condition: service_healthy\n    networks:\n      - front-tier\n    restart: \"no\"\n\nvolumes:\n  db-data:\n\nnetworks:\n  front-tier:\n  back-tier:\n```\n\nIf you take a look at `docker-compose.yml`, you will see that the file defines\n\n- vote container based on the vote folder\n- result container based on the result folder\n- redis container based on a redis image, to temporarily store the data.\n- .NET based worker app based on the worker folder\n- Postgres container based on a postgres image\n- optional seed container, to populate the DB with votes\n\nThe Compose file also defines two networks, front-tier and back-tier. Each container is placed on one or two networks. Once on those networks, they can access other services on that network in code just by using the name of the service. Services can be on any number of networks. Services are isolated on their network. Services are only able to discover each other by name if they are on the same network. To learn more about networking check out the [Networking Lab](https://github.com/docker/labs/tree/master/networking).\n\nTake a look at the file again, it start's with the following comment:\n\n```\n# version is now using \"compose spec\"\n# v2 and v3 are now combined!\n# docker-compose v1.27+ required\n```\n\nYou will find many `docker-compose.yml` files that start with either `version: \"2\"` or `version: \"3\"`. These were the two major versions of the [compose specification](https://docs.docker.com/compose/compose-file/). v2 was used for `docker compose` and v3 brought all the features needed for `docker swarm`. However, over time the features where merged into one specification.\n\nYou will see there's also a `services` key, under which there is a separate key for each of the services. Such as:\n\n```\n  vote:\n    build: ./vote\n    # use python rather than gunicorn for local dev\n    command: python app.py\n    depends_on:\n      redis:\n        condition: service_healthy\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http://localhost\"]\n      interval: 15s\n      timeout: 5s\n      retries: 3\n      start_period: 10s\n    volumes:\n    - ./vote:/app\n    ports:\n      - \"5000:80\"\n    networks:\n      - front-tier\n      - back-tier\n```\n\nThe `build` key specifies, were compose can find the `Dockerfile` to build the image to use. You can also use the `image` tag, as you can see in the `redis` or `db` service. This will then pull and start a container based on an existing image.\n\nThe `command` key, allows you to specify the command that is executed inside the container. This will overwrite the `CMD` tag from the `Dockerfile`.\n\nMuch like with `docker run` you can define `volumes`, `ports` and `networks`. There's also a `depends_on` key which allows you to specify that a service is only deployed after another service, in this case `vote` only deploys after `redis`.\n\nWith the `healthcheck` key, you can define a check to figure out if the container is healthy or not. This allows the orchestrator to decide when traffic can be routed to it. Or a new container is needed as the current one is not running properly. You can find more details [here](https://docs.docker.com/compose/compose-file/05-services/#healthcheck).\n\n## Task 3: Run the Vote App with Docker Compose\n\nTo start the app in the background you can run the following command:\n\n```\n$ docker compose up -d\n\n[+] Running 7/7\n ✔ Network example-voting-app_front-tier  Created     0.0s\n ✔ Network example-voting-app_back-tier   Created     0.0s\n ✔ Container example-voting-app-redis-1   Healthy     5.8s\n ✔ Container example-voting-app-db-1      Healthy     5.8s\n ✔ Container example-voting-app-result-1  Started     6.3s\n ✔ Container example-voting-app-worker-1  Started     6.1s\n ✔ Container example-voting-app-vote-1    Started     6.2s\n```\n\nFind out more about the running containers:\n\n```\n$ docker compose ps\nNAME                          IMAGE                       COMMAND                  SERVICE             CREATED              STATUS                        PORTS\nexample-voting-app-db-1       postgres:15-alpine          \"docker-entrypoint.s…\"   db                  About a minute ago   Up About a minute (healthy)   5432/tcp\nexample-voting-app-redis-1    redis:alpine                \"docker-entrypoint.s…\"   redis               About a minute ago   Up About a minute (healthy)   6379/tcp\nexample-voting-app-result-1   example-voting-app-result   \"nodemon server.js\"      result              About a minute ago   Up About a minute             0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp\nexample-voting-app-vote-1     example-voting-app-vote     \"python app.py\"          vote                About a minute ago   Up About a minute (healthy)   0.0.0.0:5002->80/tcp\nexample-voting-app-worker-1   example-voting-app-worker   \"dotnet Worker.dll\"      worker              About a minute ago   Up About a minute\n```\n\nThe next step is to test whether you can access the app with your browser.\n\n1. Access the voting side of the app: [http://localhost:5000](http://localhost:5000)\n\n<img src=\"../images/vote.png\" title=\"vote\">\n\n2. Select either `Dog` or `Cat` to vote.\n\n3. View the results: [http://localhost:5001](http://localhost:5001)\n\n   You should see the result of the previous vote\n\n## Task 4: Customize the Voting App\n\nIn this step, you will customize the app and learn how you can use Docker Compose in your development process.\n\n1. Change the topics you want to vote between\n\n   The vote side of the app is located in the `vote` folder inside the repository. Search for the `app.py` script and replace _Cats_ and _Dogs_ with your choice of vote. After you saved the change, reload the vote page in your browser.\n\n1. Change the result side\n\n   As we are having a micro-services architecture, you also need to change the result page to update the displayed information.\n\n   You can find this information in the `result` folder. Inside this folder, you need to go to the file `views/index.html` and adjust the votes accordingly. Reload the result page in the browser. You should now see that your results reflect the changes you just made.\n\n## Task 5: Remove the containers\n\nTo remove the container you can run the following command:\n\n```\n$ docker compose down\n[+] Running 7/7\n ✔ Container example-voting-app-result-1  Removed     0.4s\n ✔ Container example-voting-app-worker-1  Removed     0.2s\n ✔ Container example-voting-app-vote-1    Removed     0.3s\n ✔ Container example-voting-app-redis-1   Removed     0.1s\n ✔ Container example-voting-app-db-1      Removed     0.1s\n ✔ Network example-voting-app_back-tier   Removed     0.1s\n ✔ Network example-voting-app_front-tier  Removed     0.1s\n\n```\n\nThis will stop the containers and remove them afterwards.\n\n### Next Steps\n\nFor the next step in the tutorial head over to [Deploying an app to Docker Swarm](./votingapp-swarm.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/votingapp-swarm.md",
    "content": "# Deploying an app to a Swarm\n\nThis portion of the tutorial will guide you through deploying a Docker Swarm, the creation and customization of a voting app.\n\n> **Tasks**:\n>\n> - [Task 1: Clone Voting App Repo](#Task_1)\n> - [Task 2: Create Docker Swarm](#Task_2)\n> - [Task 3: Customize the Voting App](#Task_3)\n\n**Important.**\nTo complete this section, you will need to have Docker installed on your machine as mentioned in the [Setup](./setup.md) section. You'll also need to have git installed. There are many options for installing it. For instance, you can get it from [GitHub](https://help.github.com/articles/set-up-git/).\n\n### <a name=\"Task_1\"></a>Task 1: Clone Voting app\n\nFor this application we will use the [Docker Example Voting App](https://github.com/docker/example-voting-app). This app consists of five components:\n\n- Python webapp which lets you vote between two options\n- Redis queue which collects new votes\n- .NET worker which consumes votes and stores them in…\n- Postgres database backed by a Docker volume\n- Node.js webapp which shows the results of the voting in real time\n\n1. Clone the repository onto your machine and `cd` into the directory:\n\n   ```\n   $ git clone https://github.com/docker/example-voting-app.git\n\n   $ cd example-voting-app\n   ```\n\n### <a name=\"Task_2\"></a>Task 2: Initiate Docker Swarm\n\nFor this first stage, we will use existing images that are in Docker Store.\n\nThis app relies on [Docker Swarm mode](https://docs.docker.com/engine/swarm/). Swarm mode is the cluster management and orchestration features embedded in the Docker engine. You can easily deploy to a swarm using a file that declares your desired state for the app. Swarm allows you to run your containers on more than one machine. In this tutorial, you can run on just one machine, or you can use something like [Docker for AWS](https://beta.docker.com/) or [Docker for Azure](https://beta.docker.com/) to quickly create a multiple node machine. Alternately, you can use Docker Machine to create a number of local nodes on your development machine. See [the Swarm Mode lab](../../swarm-mode/beginner-tutorial/README.md#creating-the-nodes-and-swarm) for more information.\n\n1. Query your IP Address\n\n   ```\n   $ ifconfig -a |grep -A 4 en0\n\n   en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500\n   ether 3c:15:c2:d8:28:42\n   inet6 fe80::1080:9acb:32c6:54a0%en0 prefixlen 64 secured scopeid 0x5\n   inet 192.168.2.159 netmask 0xffffff00 broadcast 192.168.2.255\n   nd6 options=201<PERFORMNUD,DAD>\n   media: autoselect\n   status: active\n   ```\n\n   _NOTE_ For Windows users please use the `ipconfig`command to retrieve your IP address\n\n2. Create a Docker Swarm using the IP Address from step 1.\n\n   ```\n   $ docker swarm init --advertise-addr <IP Address from Step 1>\n\n   Swarm initialized: current node (gshy63zz81kw3a7treejl2g4l) is now a manager.\n\n   To add a worker to this swarm, run the following command:\n\n   docker swarm join --token SWMTKN-1-1d764ibq33jqouhrpba7f9dchwzx38bfuw3ei5xmv0w87x00i1-at7fd6t18qj3ku0xu4xxgsh3i 192.168.2.159:2377\n\n   To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\n   ```\n\n3. Next, locate the [Docker Compose](https://docs.docker.com/compose) file. You don't need Docker Compose installed, though if you are using Docker for Mac or Docker for Windows you already have it installed by default. The `docker stack` command utilizes the Docker Compose `YAML` file format. The file you need is in Docker Example Voting App at the root level. It's called docker-stack.yml.\n\n   Let's review what is inside the file:\n\n   ```\n   version: \"3\"\n   services:\n\n     redis:\n       image: redis:alpine\n       ports:\n         - \"6379\"\n       networks:\n         - frontend\n       deploy:\n         replicas: 2\n         update_config:\n           parallelism: 2\n           delay: 10s\n         restart_policy:\n           condition: on-failure\n     db:\n       image: postgres:9.4\n       volumes:\n         - db-data:/var/lib/postgresql/data\n       networks:\n         - backend\n       deploy:\n         placement:\n           constraints: [node.role == manager]\n     vote:\n       image: dockersamples/examplevotingapp_vote:before\n       ports:\n         - 5000:80\n       networks:\n         - frontend\n       depends_on:\n         - redis\n       deploy:\n         replicas: 2\n         update_config:\n           parallelism: 2\n         restart_policy:\n           condition: on-failure\n     result:\n       image: dockersamples/examplevotingapp_result:before\n       ports:\n         - 5001:80\n       networks:\n         - backend\n       depends_on:\n         - db\n       deploy:\n         replicas: 1\n         update_config:\n           parallelism: 2\n           delay: 10s\n         restart_policy:\n           condition: on-failure\n\n     worker:\n       image: dockersamples/examplevotingapp_worker\n       networks:\n         - frontend\n         - backend\n       deploy:\n         mode: replicated\n         replicas: 1\n         labels: [APP=VOTING]\n         restart_policy:\n           condition: on-failure\n           delay: 10s\n           max_attempts: 3\n           window: 120s\n         placement:\n           constraints: [node.role == manager]\n\n     visualizer:\n       image: dockersamples/visualizer\n       ports:\n         - \"8080:8080\"\n       stop_grace_period: 1m30s\n       volumes:\n         - /var/run/docker.sock:/var/run/docker.sock\n       deploy:\n         placement:\n           constraints: [node.role == manager]\n\n   networks:\n     frontend:\n     backend:\n\n   volumes:\n     db-data:\n   ```\n\nIf you take a look at `docker-stack.yml`, you will see that the file defines\n\n- vote container based on a Python image\n- result container based on a Node.js image\n- redis container based on a redis image, to temporarily store the data.\n- .NET based worker app based on a .NET image\n- Postgres container based on a postgres image\n\nThe Compose file also defines two networks, front-tier and back-tier. Each container is placed on one or two networks. Once on those networks, they can access other services on that network in code just by using the name of the service. Services can be on any number of networks. Services are isolated on their network. Services are only able to discover each other by name if they are on the same network. To learn more about networking check out the [Networking Lab](https://github.com/docker/labs/tree/master/networking).\n\nTake a look at the file again. You'll see it starts with\n\n```\nversion: \"3\"\n```\n\nIt's important that you use version 3 of compose files, as `docker stack deploy` won't support use of earlier versions. You will see there's also a `services` key, under which there is a separate key for each of the services. Such as:\n\n```\n  vote:\n    image: dockersamples/examplevotingapp_vote:before\n    ports:\n      - 5000:80\n    networks:\n      - frontend\n    depends_on:\n      - redis\n    deploy:\n      replicas: 2\n      update_config:\n        parallelism: 2\n      restart_policy:\n        condition: on-failure\n```\n\nThe `image` key there specifies which image you can use, in this case the image `dockersamples/examplevotingapp_vote:before`. If you're familiar with Compose, you may know that there's a `build` key, which builds based on a Dockerfile. However, `docker stack deploy` does not support `build`, so you need to use pre-built images.\n\nMuch like `docker run` you will see you can define `ports` and `networks`. There's also a `depends_on` key which allows you to specify that a service is only deployed after another service, in this case `vote` only deploys after `redis`.\n\nThe `deploy` key is new in version 3. It allows you to specify various properties of the deployment to the Swarm. In this case, you are specifying that you want two replicas, that is two containers are deployed on the Swarm. You can specify other properties, like when to restart, what [healthcheck](https://docs.docker.com/engine/reference/builder/#healthcheck) to use, placement constraints, resources.\n\n4. Let's deploy our Vote Application to Docker Swarm:\n\n   ```\n   $ docker stack deploy --compose-file docker-stack.yml vote\n\n   Creating network vote_frontend\n   Creating network vote_backend\n   Creating network vote_default\n   Creating service vote_worker\n   Creating service vote_visualizer\n   Creating service vote_redis\n   Creating service vote_db\n   Creating service vote_vote\n   Creating service vote_result\n   ```\n\n5. Verify your stack was deployed successfully:\n\n   ```\n   $ docker stack services vote\n\n   ID            NAME         MODE        REPLICAS  IMAGE\n   25wo6p7fltyn  vote_db      replicated  1/1       postgres:9.4\n   2ot4sz0cgvw3  vote_worker  replicated  1/1       dockersamples/examplevotingapp_worker:latest\n   9faz4wbvxpck  vote_redis   replicated  2/2       redis:alpine\n   ocm8x2ijtt88  vote_vote    replicated  2/2       dockersamples/examplevotingapp_vote:before\n   p1dcwi0fkcbb  vote_result  replicated  2/2       dockersamples/examplevotingapp_result:before\n   ```\n\n6. We can also check the services this which also provides the published ports:\n\n   ```\n   $ docker service ls\n\n   ID                  NAME                MODE                REPLICAS            IMAGE                                          PORTS\n   praz62mx8pis        vote_db             replicated          1/1                 postgres:9.4\n   kn9m4pbgampm        vote_redis          replicated          1/1                 redis:alpine                                   *:30000->6379/tcp\n   vboktn2bpb82        vote_result         replicated          1/1                 dockersamples/examplevotingapp_result:before   *:5001->80/tcp\n   jqg43scwua0b        vote_visualizer     replicated          1/1                 dockersamples/visualizer:stable                *:8080->8080/tcp\n   x794556ducqr        vote_vote           replicated          2/2                 dockersamples/examplevotingapp_vote:before     *:5000->80/tcp\n   x85zjszmlxai        vote_worker         replicated          1/1                 dockersamples/examplevotingapp_worker:latest\n   ```\n\n#### Test the Vote App\n\n1. Now that the app is running, you can go to `http://localhost:5000` to view the voting side of the app:\n\n<img src=\"../images/vote.png\" title=\"vote\">\n\n2. Select either `Dog` or `Cat` to vote.\n\n3. View the results: `http://localhost:5001`.\n\n   **NOTE**: If you are running this tutorial in a cloud environment like AWS, Azure, Digital Ocean, or GCE you will not have direct access to localhost or 127.0.0.1 via a browser. A work around for this is to leverage ssh port forwarding. Below is an example for Mac OS. Similarly this can be done for Windows and Putty users.\n\n   ```\n   $ ssh -L 5000:localhost:5000 <ssh-user>@<CLOUD_INSTANCE_IP_ADDRESS>\n   ```\n\n### <a name=\"Task_3\"></a>Task 3:Customize the Voting App\n\nIn this step, you will customize the app and redeploy it. We've supplied the same images but with the votes changed from Cats and Dogs to Java and .NET using the `after` tag.\n\n#### Change the images deployed\n\nGo back to `docker-stack.yml`\n\n1. Change the `vote` and `result` images to use the `after` tag, so they look like this:\n\n   ```\n     vote:\n       image: dockersamples/examplevotingapp_vote:after\n       ports:\n         - 5000:80\n       networks:\n         - frontend\n       depends_on:\n         - redis\n       deploy:\n         replicas: 2\n         update_config:\n           parallelism: 2\n         restart_policy:\n           condition: on-failure\n     result:\n       image: dockersamples/examplevotingapp_result:after\n       ports:\n         - 5001:80\n       networks:\n         - backend\n       depends_on:\n         - db\n       deploy:\n         replicas: 2\n         update_config:\n           parallelism: 2\n           delay: 10s\n         restart_policy:\n           condition: on-failure\n\n   ```\n\n#### Redeploy\n\nNext, we want to redeploy our Vote Application stack with the new changes. The `docker stack deploy` will review the `docker-stack.yml`file for changes and update all the services and connections accordingly.\n\n2. Redeploy Vote Stack:\n\n   ```\n   $ docker stack deploy --compose-file docker-stack.yml vote\n\n   Updating service vote_db (id: praz62mx8pisq07tziygllvb5)\n   Updating service vote_vote (id: x794556ducqre2op47nehov32)\n   Updating service vote_result (id: vboktn2bpb822gnfpc3t73qiw)\n   Updating service vote_worker (id: x85zjszmlxaihkub8xvmtuxx3)\n   Updating service vote_visualizer (id: jqg43scwua0bhxpcmyghuur74)\n   Updating service vote_redis (id: kn9m4pbgampm6ewncyycqx94m)\n   ```\n\n#### Another test run\n\nNow place another vote `http://localhost:5000` and view the results `http://localhost:5001`\n\n#### Remove the stack\n\n3. Remove the stack from the swarm.\n\n   ```\n   $ docker stack rm vote\n   ```\n\n### Next Steps\n\nFor the next step in the tutorial, head over to [Docker Secrets](secrets.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/webapps-part1.md",
    "content": "# Deploying Webapps with Docker\n\nGreat! So you have now looked at `docker container run`, played with a Docker container, and also got the hang of some terminology. Armed with all this knowledge, you are now ready to get to the real stuff &#8212; create Docker Images, and deploy these images as web applications with Docker.\n\n## Task 1: Run a static website in a container\n\n> **Note:** Code for this section is in this repo in the [static-site directory](https://github.com/docker/labs/tree/master/beginner/static-site).\n\nFirst, we'll use Docker to run a static website in a container. The website is based on an existing image. We'll pull a Docker image from Docker Hub, run the container, and see how easy it is to set up a web server.\n\nThe image that you are going to use is a single-page website that was already created for this demo and is available on the Docker Hub as [`dockersamples/static-site`](https://hub.docker.com/r/dockersamples/static-site).\n\n1. Run the image directly in one go using `docker run` as follows.\n\n   ```\n   $ docker container run --detach dockersamples/static-site\n   ```\n\n   > **Note:** The current version of this image doesn't run without the `-d` flag. The `-d` flag enables **detached mode**, which detaches the running container from the terminal/shell and returns your prompt after the container starts. We are debugging the problem with this image but for now, use `-d` even for this first example.\n\n   So, what happens when you run this command?\n\n   Since the image doesn't exist on your Docker host, the Docker daemon first fetches it from the registry and then runs it as a container.\n\n   Now that the server is running, do you see the website? What port is it running on? And more importantly, how do you access the container directly from our host machine?\n\n   Actually, you probably won't be able to answer any of these questions yet! &#9786; In this case, the client didn't tell the Docker Engine to publish any of the ports, so you need to re-run the `docker run` command to add this instruction.\n\nLet's re-run the command with some new flags to publish ports and pass your name to the container to customize the message displayed. We'll use the _-d_ option again to run the container in detached mode.\n\n2. Stop the container that you have just launched. In order to do this, we need the container ID.\n\n   Since we ran the container in detached mode, we don't have to launch another terminal to do this. Run `docker container ps` to view the running containers.\n\n   ```\n   $ docker container ps\n   CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES\n   a7a0e504ca3e        dockersamples/static-site   \"/bin/sh -c 'cd /usr/\"   28 seconds ago      Up 26 seconds       80/tcp, 443/tcp     stupefied_mahavira\n   ```\n\n3. Check out the `CONTAINER ID` column. You will need to use this `CONTAINER ID` value, a long sequence of characters, to identify the container you want to stop, and then to remove it. The example below provides the `CONTAINER ID` on our system; you should use the value that you see in your terminal.\n\n   ```\n   $ docker container stop a7a0e504ca3e\n   $ docker container rm   a7a0e504ca3e\n   ```\n\n   > **Note:** A cool feature is that you do not need to specify the entire `CONTAINER ID`. You can just specify a few starting characters and if it is unique among all the containers that you have launched, the Docker client will intelligently pick it up.\n\n4. Launch a container in **detached** mode as shown below:\n   The command summary the above command:\n\n   - `--detach` will create a container with the process detached from our terminal\n   - `-publish-all` will publish all the exposed container ports to random ports on the Docker host\n   - `--env` is how you pass environment variables to the container\n   - `--name` allows you to specify a container name\n   - `AUTHOR` is the environment variable name and `Your Name` is the value that you can pass\n\n   ```\n   $ docker container run --name static-site --env AUTHOR=\"Your Name\" --detach --publish-all dockersamples/static-site\n   e61d12292d69556eabe2a44c16cbd54486b2527e2ce4f95438e504afb7b02810\n   ```\n\n5. Now you can see the ports by running the `docker port` command with the name of the newly created container `static-site`.\n\n   ```\n   $ docker port static-site\n   443/tcp -> 0.0.0.0:32772\n   80/tcp -> 0.0.0.0:32773\n   ```\n\n   > **Note:** If you are running [Docker Desktop for Mac](https://docs.docker.com/desktop/mac), [Docker Desktop for Windows](https://docs.docker.com/desktop/windows/), or [Docker Desktop on Linux](https://docs.docker.com/desktop/linux/), you can open `http://0.0.0.0:[YOUR_PORT_FOR 80/tcp]`. For our example this is `http://localhost:32773`.\n\n6. You can also run a second webserver at the same time, this time specifying a custom host port mapping to the container's webserver. **Be sure to change the name**\n\n   ```\n   $ docker container run --name static-site-2 --env AUTHOR=\"Your Name\" --detach --publish 8888:80 dockersamples/static-site\n   ```\n\n   Open your browser to `http://0.0.0.0:32773` and open a second tab `http://0.0.0.0:8888`. We can now view both websites running in parallel on your Docker Host.\n\n   <center><img src=\"../images/web-app.png\" title=\"web-app\"></center>\n\n   `--publish` will publish instruct the container to map the specified container port to the host port. `8888:80` = Host:Container Port\n\n   Now that you've seen how to run a webserver inside a Docker container, how do you create your own Docker image? This is the question we'll explore in the next section.\n\n7. Stop and remove the containers since we won't be using them anymore.\n\n   ```\n   $ docker container stop static-site\n   $ docker container rm static-site\n   ```\n\n8. Let's use a shortcut to remove the second site:\n\n   ```\n   $ docker container rm -f static-site-2 static-site-3\n   ```\n\n   > **Note:** `rm -f` is the not nice way of removing containers. Be warned\n\n9. Run `docker container ps -a` to make sure the containers are gone.\n\n   ```\n   $ docker container ps -a\n   CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n   ```\n\n## Next Step\n\nFor the next step in the tutorial, head over to [Docker Images and Volumes](./images-and-volumes.md)\n"
  },
  {
    "path": "Docker/kickstart/chapters/webapps-part2.md",
    "content": "# Webapps with Docker Part Deux\n\nNow that we understand the structure of Docker images it's now time to start building our very own Docker image from a `Dockerfile`\n\n> **Tasks**:\n>\n> - [Task 1: Package and run a custom app using Docker](#task-1-package-and-run-a-custom-app-using-docker)\n> - [Task 2: Modify a running website](#task-2-modify-a-running-website)\n> - [Task 3: Create your first image](#task-3-create-your-first-image)\n\n**Prerequisite** Ensure you have a DockerID. If you don't have a DockerID you can get one for free via [Docker Hub](https://hub.docker.com)\n\n## Task 1: Package and run a custom app using Docker\n\nIn this step you'll learn how to package your own apps as Docker images using a [Dockerfile](https://docs.docker.com/engine/reference/builder/).\n\nThe Dockerfile syntax is straightforward. In this task we're going to create an NGINX website from a Dockerfile.\n\n### Clone the Lab GitHub Repo\n\nUse the following command to clone the lab repo from GitHub.\n\n```\n$ git clone https://github.com/dockersamples/linux_tweet_app\nCloning into 'linux_tweet_app'...\nremote: Counting objects: 14, done.\nremote: Compressing objects: 100% (9/9), done.\nremote: Total 14 (delta 5), reused 14 (delta 5), pack-reused 0\nUnpacking objects: 100% (14/14), done.\n```\n\n### Build a simple website image\n\nLet's have a look at the Dockerfile we'll be using, which builds a simple website that allows you to send a tweet.\n\n1. Make sure you're in the `linux_tweet_app` directory:\n\n   ```\n   $ cd ~/linux_tweet_app\n   ```\n\n2. Display the contents of our Dockerfile.\n\n   ```\n   $ cat Dockerfile\n\n   FROM nginx:latest\n\n   COPY index.html /usr/share/nginx/html\n   COPY linux.png /usr/share/nginx/html\n\n   EXPOSE 80 443\n\n   CMD [\"nginx\", \"-g\", \"daemon off;\"]\n   ```\n\n   Let's see what each of these lines in the Dockerfile do.\n\n   - [FROM](https://docs.docker.com/engine/reference/builder/#from) specifies the base image to use as the starting point for this new image you're creating. For this example we're starting from `nginx:latest`.\n   - [COPY](https://docs.docker.com/engine/reference/builder/#copy) copies files from the host into the image, at a known location. In our case it copies `index.html` and a graphic that will be used on our webpage.\n   - [EXPOSE](https://docs.docker.com/engine/reference/builder/#expose) documents which ports the application uses.\n   - [CMD](https://docs.docker.com/engine/reference/builder/#cmd) specifies what command to run when a container is started from the image. Notice that we can specify the command, as well as run-time arguments.\n\n3. In order to make commands more copy/paste friendly, export an environment variable containing your DockerID (if you don't have a DockerID you can get one for free via [Docker Hub](https://hub.docker.com))\n\n   ```\n   $ export DOCKERID=<your docker id>\n   ```\n\n   > Special Note: The Windows Command Line does not allow to export the `DOCKERID`. You can therefore either directly set the DockerID in the following commands. Or export the variable via `set DOCKERID=<your docker id>` and then replace the variable with `%DOCKERID%`.\n\n4. To make sure it stored correctly by echoing it back in the terminal\n\n   ```\n   $ echo $DOCKERID\n   <your docker id>\n   ```\n\n5. Use the `docker image build` command to create a new Docker image using the instructions in your Dockerfile.\n\n   - `--tag` allows us to give the image a custom name. In this case it's comprised of our DockerID, the application name, and a version. Having the Docker ID attached to the name will allow us to store it on Docker Hub in a later step\n   - `.` tells Docker to use the current directory as the build context\n\n   Be sure to include period (`.`) at the end of the command as this indicates the current directory.\n\n   ```\n   $ docker image build --tag $DOCKERID/linux_tweet_app:1.0 .\n\n   Sending build context to Docker daemon  32.77kB\n   Step 1/5 : FROM nginx:latest\n   latest: Pulling from library/nginx\n   afeb2bfd31c0: Pull complete\n   7ff5d10493db: Pull complete\n   d2562f1ae1d0: Pull complete\n   Digest: sha256:af32e714a9cc3157157374e68c818b05ebe9e0737aac06b55a09da374209a8f9\n   Status: Downloaded newer image for nginx:latest\n   ---> da5939581ac8\n   Step 2/5 : COPY index.html /usr/share/nginx/html\n   ---> eba2eec2bea9\n   Step 3/5 : COPY linux.png /usr/share/nginx/html\n   ---> 4d080f499b53\n   Step 4/5 : EXPOSE 80 443\n   ---> Running in 47232cb5699f\n   ---> 74c968a9165f\n   Removing intermediate container 47232cb5699f\n   Step 5/5 : CMD nginx -g daemon off;\n   ---> Running in 4623761274ac\n   ---> 12045a0df899\n   Removing intermediate container 4623761274ac\n   Successfully built 12045a0df899\n   Successfully tagged <your docker ID>/linux_tweet_app:latest\n   ```\n\n   The output above shows the Docker daemon execute each line in the Dockerfile.\n\n   Feel free to run a `docker image ls` command to see the new image you created.\n\n6. Use the `docker container run` command to start a new container from the image you created.\n\n   As this container will be running an NGINX web server, we'll use the `--publish` flag to publish port 80 inside the container onto port 80 on the host. This will allow traffic coming in to the Docker host on port 80 to be directed to port 80 in the container. The format of the `--publish` flag is `host_port`:`container_port`.\n\n   ```\n   $ docker container run \\\n   --detach \\\n   --publish 8080:80 \\\n   --name linux_tweet_app \\\n   $DOCKERID/linux_tweet_app:1.0\n   ```\n\n   Any external traffic coming into the server on port 80 will now be directed into the container.\n\n7. Open your newly created Web App in your Browser `http://0.0.0.0:8080`\n\n8. Once you've accessed the website, shut it down and remove it.\n\n   ```\n   $ docker container rm --force linux_tweet_app\n\n   linux_tweet_app\n   ```\n\n   > **Note**: We used the `--force` parameter to remove the running container without shutting it down. This will ungracefully shutdown the container and permanently remove it from the Docker host.\n   >\n   > In a production environment you may want to use `docker container stop` to gracefully stop the container and leave it on the host. You can then use `docker container rm` to permanently remove it.\n\n## Task 2: Modify a running website\n\nWhen you're actively working on an application it is inconvenient to have to stop the container, rebuild the image, and run a new version every time you make a change to your source code.\n\nOne way to streamline this process is to bind mount the source code directory on the local machine into the running container. This will allow any changes made to the files on the host to be immediately reflected in the container.\n\nWe do this using something called a [bind mount](https://docs.docker.com/engine/admin/volumes/bind-mounts/).\n\nWhen you use a bind mount, a file or directory on the host machine is mounted into a container.\n\n### Start a web app with a bind mount\n\n1. Let's start the web app and mount the current directory into the container.\n\n   In this example we'll use the `--mount` flag to mount the current directory on the host into `/usr/share/nginx/html` inside the container.\n\n   Be sure to run this command from within the `linux_tweet_app` directory on your Docker host.\n\n   ```\n   $ docker container run \\\n   --detach \\\n   --publish 8080:80 \\\n   --name linux_tweet_app \\\n   --mount type=bind,source=\"$(pwd)\",target=/usr/share/nginx/html \\\n   $DOCKERID/linux_tweet_app:1.0\n   ```\n\n   > Remember from our Dockerfile `usr/share/nginx/html` is where are html files are stored for our web app\n\n2. Open the Linux_Tweet App in your Browser `http://0.0.0.0:8080` to verify the website is running (you may need to refresh the browser to get the latest version).\n\n### Modify the running website\n\nBecause we did a bind mount, any changes made to the local filesystem are immediately reflected in the running container.\n\n3. Copy a new `index.html` into the container.\n\n   The Git repo that you pulled earlier contains several different versions of an index.html file. Run an `ls` command from within the `~/linux_tweet_app` directory to see a list of them. In this step we'll replace `index.html` with `index-new.html`.\n\n   ```\n   $ cp index-new.html index.html\n   ```\n\n4. Refresh the web page. The site will have changed.\n\n   > Using your favorite editor (vi, emacs, etc) you can use it to load the `index.html` file and make additional real-time changes. Those too would be reflected when you reload the webpage.\n\n   Edit the index.html file and edit line number 33 and change the text to \"Docker is Awesome!\"\n\n   ```\n   $ vi index.html\n   ```\n\n   Even though we've modified the `index.html` local filesystem and seen it reflected in the running container, we've not actually changed the original Docker image.\n\n   To show this, let's stop the current container and re-run the `1.0` image without a bind mount.\n\n5. Stop and remove the currently running container\n\n   ```\n   $ docker rm --force linux_tweet_app\n\n   linux_tweet_app\n   ```\n\n6. Rerun the current version without a bind mount.\n\n   ```\n   $ docker container run \\\n   --detach \\\n   --publish 8080:80 \\\n   --name linux_tweet_app \\\n   $DOCKERID/linux_tweet_app:1.0\n   ```\n\n7. Open the Tweet Web App in your Browser `http://0.0.0.0:8080` Notice it's back to the original version with the blue background.\n\n8. Stop and remove the current container\n\n   ```\n   $ docker rm --force linux_tweet_app\n\n   linux_tweet app\n   ```\n\n## Task 3: Create your first image\n\nTo save the changes you made to the `index.html` file earlier, you need to build a new version of the image.\n\n1. Build a new image and tag it as `2.0`\n\n   Remember that you have previously modified the `index.html` file on the Docker hosts local filesystem. This means that running another `docker image build` will build a new image with the updated `index.html`.\n\n   Be sure to include the period (`.`) at the end of the command.\n\n   ```\n   $ docker image build --tag $DOCKERID/linux_tweet_app:2.0 .\n   ```\n\n   > Notice how fast that built! This is because Docker only modified the portion of the image that changed vs. rebuilding the whole image.\n\n2. Let's look at the images on our system\n\n   ```\n   $ docker image ls\n   REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE\n   <your docker id>/linux_tweet_app   2.0             01612e05312b        16 seconds ago      108MB\n   <your docker id>/linux_tweet_app   1.0             bb32b5783cd3        4 minutes ago       108MB\n   mysql                          latest              b4e78b89bcf3        2 weeks ago         412MB\n   ubuntu                         latest              2d696327ab2e        2 weeks ago         122MB\n   nginx                          latest              da5939581ac8        3 weeks ago         108MB\n   alpine                         latest              76da55c8019d        3 weeks ago         3.97MB\n   ```\n\n   Notice you have both versions of the web app on your host now.\n\n### Test the new version\n\n1. Run a container from the new version of the image.\n\n   Be sure to reference the image tagged as `2.0`.\n\n   ```\n   $ docker container run \\\n   --detach \\\n   --publish 8080:80 \\\n   --name linux_tweet_app \\\n   $DOCKERID/linux_tweet_app:2.0\n   ```\n\n2. Open the Tweet Web App in your Browser `http://0.0.0.0:8080`\n\n   The web page will have an orange background.\n\n   We can run both versions side by side. The only thing we need to be aware of is that we cannot have two containers using port 8080 on the same host.\n\n   As we're already using port 8080 for the container running from the `2.0` version of the image, we will start a new container and publish it on port 8081. Additionally, we need to give our container a unique name (`old_linux_tweet_app`)\n\n3. Run the old version (make sure you map it to port 8080 on the host, give it the unique name, and reference the 1.0 version of the image).\n\n   ```\n   $ docker container run \\\n   --detach \\\n   --publish 8081:80 \\\n   --name old_linux_tweet_app \\\n   $DOCKERID/linux_tweet_app:1.0\n   ```\n\n4. Open the Tweet Web App in your Browser `http://0.0.0.0:8081` to view the old version of the website.\n\nBravo, we have successfully deployed 2 versions of our web app in parallel to our Docker host.\n\n5. Stop the running containers\n\n   ```\n   $ docker container ps\n\n   $ docker container stop old_linux_tweet_app\n\n   $ docker container stop linux_tweet_app\n   ```\n\n## Review\n\nWhat did we just accomplish?\n\n1. We created a Dockerfile, built a container image and ran a container from this newly create image\n2. Next, we modified the website both the version & index.html file showing real-time updates to the application\n3. Finally, we committed our new changes into a newly created image\n4. We ran version 1 and version 2 side-by-side\n\n### Dockerfile commands summary\n\nHere's a quick summary of the few basic commands we used in our Dockerfile.\n\n- `FROM` starts the Dockerfile. It is a requirement that the Dockerfile must start with the `FROM` command. Images are created in layers, which means you can use another image as the base image for your own. The `FROM` command defines your base layer. As arguments, it takes the name of the image. Optionally, you can add the Docker Hub username of the maintainer and image version, in the format `username/imagename:version`.\n\n- `RUN` is used to build up the Image you're creating. For each `RUN` command, Docker will run the command then create a new layer of the image. This way you can roll back your image to previous states easily. The syntax for a `RUN` instruction is to place the full text of the shell command after the `RUN` (e.g., `RUN mkdir /user/local/foo`). This will automatically run in a `/bin/sh` shell. You can define a different shell like this: `RUN /bin/bash -c 'mkdir /user/local/foo'`\n\n- `COPY` copies local files into the container.\n\n- `CMD` defines the commands that will run on the Image at start-up. Unlike a `RUN`, this does not create a new layer for the Image, but simply runs the command. There can only be one `CMD` per Dockerfile/Image. If you need to run multiple commands, the best way to do that is to have the `CMD` run a script. `CMD` requires that you tell it where to run the command, unlike `RUN`. So example `CMD` commands would be:\n\n```\n  CMD [\"python\", \"./app.py\"]\n\n  CMD [\"/bin/bash\", \"echo\", \"Hello World\"]\n```\n\n- `EXPOSE` creates a hint for users of an image which ports provide services. It is included in the information which\n  can be retrieved via `$ docker inspect <container-id>`.\n\n> **Note:** The `EXPOSE` command does not actually make any ports accessible to the host! Instead, this requires\n> publishing ports by means of the `-p` flag when using `$ docker run`.\n\n- `PUSH` pushes your image to Docker Hub, or alternately to a [private registry](https://docs.docker.com/registry/)\n\n> **Note:** If you want to learn more about Dockerfiles, check out [Best practices for writing Dockerfiles](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/).\n\nGreat! So you have now looked at `docker run`, played with a Docker container and also got the hang of some terminology. Armed with all this knowledge, you are now ready to get to the real stuff &#8212; deploying web applications with Docker.\n\n## Next Steps\n\nFor the next step in the tutorial head over to [Docker & DevOps](./devops.md)\n"
  },
  {
    "path": "Docker/kickstart/flask-app/Dockerfile",
    "content": "# our base image\nFROM alpine:3.5\n\n# Install python and pip\nRUN apk add --update py2-pip\n\n# upgrade pip\nRUN pip install --upgrade pip\n\n# install Python modules needed by the Python app\nCOPY requirements.txt /usr/src/app/\nRUN pip install --no-cache-dir -r /usr/src/app/requirements.txt\n\n# copy files required for the app to run\nCOPY app.py /usr/src/app/\nCOPY templates/index.html /usr/src/app/templates/\n\n# tell the port number the container should expose\nEXPOSE 5000\n\n# run the application\nCMD [\"python\", \"/usr/src/app/app.py\"]\n"
  },
  {
    "path": "Docker/kickstart/flask-app/app.py",
    "content": "from flask import Flask, render_template\nimport random\n\napp = Flask(__name__)\n\n# list of cat images\nimages = [\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26388-1381844103-11.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr01/15/9/anigif_enhanced-buzz-31540-1381844535-8.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26390-1381844163-18.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/10/anigif_enhanced-buzz-1376-1381846217-0.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/9/anigif_enhanced-buzz-3391-1381844336-26.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/10/anigif_enhanced-buzz-29111-1381845968-0.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/9/anigif_enhanced-buzz-3409-1381844582-13.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr02/15/9/anigif_enhanced-buzz-19667-1381844937-10.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr05/15/9/anigif_enhanced-buzz-26358-1381845043-13.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/9/anigif_enhanced-buzz-18774-1381844645-6.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr06/15/9/anigif_enhanced-buzz-25158-1381844793-0.gif\",\n    \"http://ak-hdl.buzzfed.com/static/2013-10/enhanced/webdr03/15/10/anigif_enhanced-buzz-11980-1381846269-1.gif\"\n]\n\n@app.route('/')\ndef index():\n    url = random.choice(images)\n    return render_template('index.html', url=url)\n\nif __name__ == \"__main__\":\n    app.run(host=\"0.0.0.0\")\n"
  },
  {
    "path": "Docker/kickstart/flask-app/requirements.txt",
    "content": "flask>=0.12.3\n"
  },
  {
    "path": "Docker/kickstart/flask-app/templates/index.html",
    "content": "<html>\n  <head>\n    <style type=\"text/css\">\n      body {\n        background: black;\n        color: white;\n      }\n      div.container {\n        max-width: 500px;\n        margin: 100px auto;\n        border: 20px solid white;\n        padding: 10px;\n        text-align: center;\n      }\n      h4 {\n        text-transform: uppercase;\n      }\n    </style>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h4>Cat Gif of the day</h4>\n      <img src=\"{{url}}\" />\n      <p><small>Courtesy: <a href=\"http://www.buzzfeed.com/copyranter/the-best-cat-gif-post-in-the-history-of-cat-gifs\">Buzzfeed</a></small></p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "Docker/kickstart/readme.md",
    "content": "## Docker Kickstarter\n\nThis Docker tutorial consists of the following sections:\n\n- [Setup - Validating Installation](chapters/setup.md)\n- [Running your first container](chapters/alpine.md)\n- [Webapps with Docker - Part One](chapters/webapps-part1.md)\n- [Docker Images and Volumes](chapters/images-and-volumes.md)\n- [Webapps with Docker - Part Two](chapters/webapps-part2.md)\n- [Docker & DevOps](chapters/devops.md)\n- [Deploying an app with Docker Compose](chapters/votingapp-compose.md)\n- [Deploying an app to a Swarm](chapters/votingapp-swarm.md)\n- [Networking](chapters/networking-basics.md)\n- [Secret Management](chapters/secrets.md)\n- [Build and Deploy a Monitoring Stack](https://github.com/56kcloud/Training/blob/master/DockerCon/readme.md)\n"
  },
  {
    "path": "Docker/kickstart/static-site/Dockerfile",
    "content": "FROM nginx\nENV AUTHOR=Docker\n\nWORKDIR /usr/share/nginx/html\nCOPY Hello_docker.html /usr/share/nginx/html\n\nCMD cd /usr/share/nginx/html && sed -e s/Docker/\"$AUTHOR\"/ Hello_docker.html > index.html ; nginx -g 'daemon off;'\n\n"
  },
  {
    "path": "Docker/kickstart/static-site/Hello_docker.html",
    "content": "<!DOCTYPE html><html>\n\n<head>\n<meta charset=\"utf-8\">\n<style type=\"text/css\">\nbody {\n  font-family: Helvetica, arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.6;\n  padding-top: 10px;\n  padding-bottom: 10px;\n  background-color: white;\n  padding: 30px; }\n\nbody > *:first-child {\n  margin-top: 0 !important; }\nbody > *:last-child {\n  margin-bottom: 0 !important; }\n\na {\n  color: #4183C4; }\na.absent {\n  color: #cc0000; }\na.anchor {\n  display: block;\n  padding-left: 30px;\n  margin-left: -30px;\n  cursor: pointer;\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0; }\n\nh1, h2, h3, h4, h5, h6 {\n  margin: 20px 0 10px;\n  padding: 0;\n  font-weight: bold;\n  -webkit-font-smoothing: antialiased;\n  cursor: text;\n  position: relative; }\n\nh1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA09pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoMTMuMCAyMDEyMDMwNS5tLjQxNSAyMDEyLzAzLzA1OjIxOjAwOjAwKSAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM2NjlDQjI4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM2NjlDQjM4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzY2OUNCMDg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzY2OUNCMTg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsQhXeAAAABfSURBVHjaYvz//z8DJYCRUgMYQAbAMBQIAvEqkBQWXI6sHqwHiwG70TTBxGaiWwjCTGgOUgJiF1J8wMRAIUA34B4Q76HUBelAfJYSA0CuMIEaRP8wGIkGMA54bgQIMACAmkXJi0hKJQAAAABJRU5ErkJggg==) no-repeat 10px center;\n  text-decoration: none; }\n\nh1 tt, h1 code {\n  font-size: inherit; }\n\nh2 tt, h2 code {\n  font-size: inherit; }\n\nh3 tt, h3 code {\n  font-size: inherit; }\n\nh4 tt, h4 code {\n  font-size: inherit; }\n\nh5 tt, h5 code {\n  font-size: inherit; }\n\nh6 tt, h6 code {\n  font-size: inherit; }\n\nh1 {\n  font-size: 28px;\n  color: black; }\n\nh2 {\n  font-size: 24px;\n  border-bottom: 1px solid #cccccc;\n  color: black; }\n\nh3 {\n  font-size: 18px; }\n\nh4 {\n  font-size: 16px; }\n\nh5 {\n  font-size: 14px; }\n\nh6 {\n  color: #777777;\n  font-size: 14px; }\n\np, blockquote, ul, ol, dl, li, table, pre {\n  margin: 15px 0; }\n\nhr {\n  background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0;\n  border: 0 none;\n  color: #cccccc;\n  height: 4px;\n  padding: 0;\n}\n\nbody > h2:first-child {\n  margin-top: 0;\n  padding-top: 0; }\nbody > h1:first-child {\n  margin-top: 0;\n  padding-top: 0; }\n  body > h1:first-child + h2 {\n    margin-top: 0;\n    padding-top: 0; }\nbody > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {\n  margin-top: 0;\n  padding-top: 0; }\n\na:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {\n  margin-top: 0;\n  padding-top: 0; }\n\nh1 p, h2 p, h3 p, h4 p, h5 p, h6 p {\n  margin-top: 0; }\n\nli p.first {\n  display: inline-block; }\nli {\n  margin: 0; }\nul, ol {\n  padding-left: 30px; }\n\nul :first-child, ol :first-child {\n  margin-top: 0; }\n\ndl {\n  padding: 0; }\n  dl dt {\n    font-size: 14px;\n    font-weight: bold;\n    font-style: italic;\n    padding: 0;\n    margin: 15px 0 5px; }\n    dl dt:first-child {\n      padding: 0; }\n    dl dt > :first-child {\n      margin-top: 0; }\n    dl dt > :last-child {\n      margin-bottom: 0; }\n  dl dd {\n    margin: 0 0 15px;\n    padding: 0 15px; }\n    dl dd > :first-child {\n      margin-top: 0; }\n    dl dd > :last-child {\n      margin-bottom: 0; }\n\nblockquote {\n  border-left: 4px solid #dddddd;\n  padding: 0 15px;\n  color: #777777; }\n  blockquote > :first-child {\n    margin-top: 0; }\n  blockquote > :last-child {\n    margin-bottom: 0; }\n\ntable {\n  padding: 0;border-collapse: collapse; }\n  table tr {\n    border-top: 1px solid #cccccc;\n    background-color: white;\n    margin: 0;\n    padding: 0; }\n    table tr:nth-child(2n) {\n      background-color: #f8f8f8; }\n    table tr th {\n      font-weight: bold;\n      border: 1px solid #cccccc;\n      margin: 0;\n      padding: 6px 13px; }\n    table tr td {\n      border: 1px solid #cccccc;\n      margin: 0;\n      padding: 6px 13px; }\n    table tr th :first-child, table tr td :first-child {\n      margin-top: 0; }\n    table tr th :last-child, table tr td :last-child {\n      margin-bottom: 0; }\n\nimg {\n  max-width: 100%; }\n\nspan.frame {\n  display: block;\n  overflow: hidden; }\n  span.frame > span {\n    border: 1px solid #dddddd;\n    display: block;\n    float: left;\n    overflow: hidden;\n    margin: 13px 0 0;\n    padding: 7px;\n    width: auto; }\n  span.frame span img {\n    display: block;\n    float: left; }\n  span.frame span span {\n    clear: both;\n    color: #333333;\n    display: block;\n    padding: 5px 0 0; }\nspan.align-center {\n  display: block;\n  overflow: hidden;\n  clear: both; }\n  span.align-center > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px auto 0;\n    text-align: center; }\n  span.align-center span img {\n    margin: 0 auto;\n    text-align: center; }\nspan.align-right {\n  display: block;\n  overflow: hidden;\n  clear: both; }\n  span.align-right > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px 0 0;\n    text-align: right; }\n  span.align-right span img {\n    margin: 0;\n    text-align: right; }\nspan.float-left {\n  display: block;\n  margin-right: 13px;\n  overflow: hidden;\n  float: left; }\n  span.float-left span {\n    margin: 13px 0 0; }\nspan.float-right {\n  display: block;\n  margin-left: 13px;\n  overflow: hidden;\n  float: right; }\n  span.float-right > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px auto 0;\n    text-align: right; }\n\ncode, tt {\n  margin: 0 2px;\n  padding: 0 5px;\n  white-space: nowrap;\n  border: 1px solid #eaeaea;\n  background-color: #f8f8f8;\n  border-radius: 3px; }\n\npre code {\n  margin: 0;\n  padding: 0;\n  white-space: pre;\n  border: none;\n  background: transparent; }\n\n.highlight pre {\n  background-color: #f8f8f8;\n  border: 1px solid #cccccc;\n  font-size: 13px;\n  line-height: 19px;\n  overflow: auto;\n  padding: 6px 10px;\n  border-radius: 3px; }\n\npre {\n  background-color: #f8f8f8;\n  border: 1px solid #cccccc;\n  font-size: 13px;\n  line-height: 19px;\n  overflow: auto;\n  padding: 6px 10px;\n  border-radius: 3px; }\n  pre code, pre tt {\n    background-color: transparent;\n    border: none; }\n\nsup {\n    font-size: 0.83em;\n    vertical-align: super;\n    line-height: 0;\n}\n* {\n\t-webkit-print-color-adjust: exact;\n}\n@media screen and (min-width: 914px) {\n    body {\n        width: 854px;\n        margin:0 auto;\n    }\n}\n@media print {\n\ttable, pre {\n\t\tpage-break-inside: avoid;\n\t}\n\tpre {\n\t\tword-wrap: break-word;\n\t}\n}\n</style>\n</head>\n<body>\n<p><br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br></p>\n\n<h1 id=\"toc_0\">Hello Docker!</h1>\n\n<p>This is being served from a <b>docker</b><br>\ncontainer running Nginx.</p>\n\n\n</body>\n\n</html>\n"
  },
  {
    "path": "Docker/networking/A1-network-basics.md",
    "content": "# Docker Networking Basics\n\n# Lab Meta\n\n> **Difficulty**: Beginner\n\n> **Time**: Approximately 10 minutes\n\nIn this lab you'll look at the most basic networking components that come with a fresh installation of Docker.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - The `docker network` command](#docker_network)\n- [Step 2 - List networks](#list_networks)\n- [Step 3 - Inspect a network](#inspect)\n- [Step 4 - List network driver plugins](#list_drivers)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker Host running Docker 1.12 or higher\n\n# <a name=\"docker_network\"></a>Step 1: The `docker network` command\n\nThe `docker network` command is the main command for configuring and managing container networks.\n\nRun a simple `docker network` command from any of your lab machines.\n\n```\n$ docker network\n\nUsage:  docker network COMMAND\n\nManage Docker networks\n\nOptions:\n      --help   Print usage\n\nCommands:\n  connect     Connect a container to a network\n  create      Create a network\n  disconnect  Disconnect a container from a network\n  inspect     Display detailed information on one or more networks\n  ls          List networks\n  rm          Remove one or more networks\n\nRun 'docker network COMMAND --help' for more information on a command.\n```\n\nThe command output shows how to use the command as well as all of the `docker network` sub-commands. As you can see from the output, the `docker network` command allows you to create new networks, list existing networks, inspect networks, and remove networks. It also allows you to connect and disconnect containers from networks.\n\n# <a name=\"list_networks\"></a>Step 2: List networks\n\nRun a `docker network ls` command to view existing container networks on the current Docker host.\n\n```\n$ docker network ls\nNETWORK ID          NAME                DRIVER              SCOPE\n1befe23acd58        bridge              bridge              local\n726ead8f4e6b        host                host                local\nef4896538cc7        none                null                local\n```\n\nThe output above shows the container networks that are created as part of a standard installation of Docker.\n\nNew networks that you create will also show up in the output of the `docker network ls` command.\n\nYou can see that each network gets a unique `ID` and `NAME`. Each network is also associated with a single driver. Notice that the \"bridge\" network and the \"host\" network have the same name as their respective drivers.\n\n# <a name=\"inspect\"></a>Step 3: Inspect a network\n\nThe `docker network inspect` command is used to view network configuration details. These details include; name, ID, driver, IPAM driver, subnet info, connected containers, and more.\n\nUse `docker network inspect` to view configuration details of the container networks on your Docker host. The command below shows the details of the network called `bridge`.\n\n```\n$ docker network inspect bridge\n[\n    {\n        \"Name\": \"bridge\",\n        \"Id\": \"1befe23acd58cbda7290c45f6d1f5c37a3b43de645d48de6c1ffebd985c8af4b\",\n        \"Scope\": \"local\",\n        \"Driver\": \"bridge\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": null,\n            \"Config\": [\n                {\n                    \"Subnet\": \"172.17.0.0/16\",\n                    \"Gateway\": \"172.17.0.1\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Containers\": {},\n        \"Options\": {\n            \"com.docker.network.bridge.default_bridge\": \"true\",\n            \"com.docker.network.bridge.enable_icc\": \"true\",\n            \"com.docker.network.bridge.enable_ip_masquerade\": \"true\",\n            \"com.docker.network.bridge.host_binding_ipv4\": \"0.0.0.0\",\n            \"com.docker.network.bridge.name\": \"docker0\",\n            \"com.docker.network.driver.mtu\": \"1500\"\n        },\n        \"Labels\": {}\n    }\n]\n```\n\n> **NOTE:** The syntax of the `docker network inspect` command is `docker network inspect <network>`, where `<network>` can be either network name or network ID. In the example above we are showing the configuration details for the network called \"bridge\". Do not confuse this with the \"bridge\" driver.\n\n\n# <a name=\"list_drivers\"></a>Step 4: List network driver plugins\n\nThe `docker info` command shows a lot of interesting information about a Docker installation.\n\nRun a `docker info` command on any of your Docker hosts and locate the list of network plugins.\n\n```\n$ docker info\nContainers: 0\n Running: 0\n Paused: 0\n Stopped: 0\nImages: 0\nServer Version: 1.12.3\nStorage Driver: aufs\n<Snip>\nPlugins:\n Volume: local\n Network: bridge host null overlay    <<<<<<<<\nSwarm: inactive\nRuntimes: runc\n<Snip>\n```\n\nThe output above shows the **bridge**, **host**, **null**, and **overlay** drivers.\n"
  },
  {
    "path": "Docker/networking/A2-bridge-networking.md",
    "content": "# Bridge networking\n\n# Lab Meta\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 15 minutes\n\nIn this lab you'll learn how to build, manage, and use **bridge** networks.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - The default **bridge** network](#default_bridge)\n- [Step 2 - Connect a container to the default *bridge* network](#connect_container)\n- [Step 3 - Test the network connectivity](#ping_local)\n- [Step 4 - Configure NAT for external access](#nat)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker host running Docker 1.12 or higher\n- The lab was built and tested using Ubuntu 16.04\n\n# <a name=\"default_bridge\"></a>Step 1: The default **bridge** network\n\nEvery clean installation of Docker comes with a pre-built network called **bridge**. Verify this with the `docker network ls` command.\n\n```\n$ docker network ls\nNETWORK ID          NAME                DRIVER              SCOPE\n1befe23acd58        bridge              bridge              local\n726ead8f4e6b        host                host                local\nef4896538cc7        none                null                local\n```\n\nThe output above shows that the **bridge** network is associated with the *bridge* driver. It's important to note that the network and the driver are connected, but they are not the same. In this example the network and the driver have the same name - but they are not the same thing!\n\nThe output above also shows that the **bridge** network is scoped locally. This means that the network only exists on this Docker host. This is true of all networks using the *bridge* driver - the *bridge* driver provides single-host networking.\n\nAll networks created with the *bridge* driver are based on a Linux bridge (a.k.a. a virtual switch).\n\nInstall the `brctl` command and use it to list the Linux bridges on your Docker host.\n\n```\n# Install the brctl tools\n\n$ apt-get install bridge-utils\n<Snip>\n\n# List the bridges on your Docker host\n\n$ brctl show\nbridge name     bridge id               STP enabled     interfaces\ndocker0         8000.0242f17f89a6       no\n```  \n\nThe output above shows a single Linux bridge called **docker0**. This is the bridge that was automatically created for the **bridge** network. You can see that it has no interfaces currently connected to it.\n\nYou can also use the `ip` command to view details of the **docker0** bridge.\n\n```\n$ ip a\n<Snip>\n3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default\n    link/ether 02:42:f1:7f:89:a6 brd ff:ff:ff:ff:ff:ff\n    inet 172.17.0.1/16 scope global docker0\n       valid_lft forever preferred_lft forever\n    inet6 fe80::42:f1ff:fe7f:89a6/64 scope link\n       valid_lft forever preferred_lft forever\n```\n\n# <a name=\"connect-container\"></a>Step 2: Connect a container\n\nThe **bridge** network is the default network for new containers. This means that unless you specify a different network, all new containers will be connected to the **bridge** network.\n\nCreate a new container.\n\n```\n$ docker run -dt ubuntu sleep infinity\n6dd93d6cdc806df6c7812b6202f6096e43d9a013e56e5e638ee4bfb4ae8779ce\n```\n\nThis command will create a new container based on the `ubuntu:latest` image and will run the `sleep` command to keep the container running in the background. As no network was specified on the `docker run` command, the container will be added to the **bridge** network.\n\nRun the `brctl show` command again.\n\n```\n$ brctl show\nbridge name     bridge id               STP enabled     interfaces\ndocker0         8000.0242f17f89a6       no              veth3a080f\n```\n\nNotice how the **docker0** bridge now has an interface connected. This interface connects the **docker0** bridge to the new container just created.\n\nInspect the **bridge** network again to see the new container attached to it.\n\n```\n$ docker network inspect bridge\n<Snip>\n        \"Containers\": {\n            \"6dd93d6cdc806df6c7812b6202f6096e43d9a013e56e5e638ee4bfb4ae8779ce\": {\n                \"Name\": \"reverent_dubinsky\",\n                \"EndpointID\": \"dda76da5577960b30492fdf1526c7dd7924725e5d654bed57b44e1a6e85e956c\",\n                \"MacAddress\": \"02:42:ac:11:00:02\",\n                \"IPv4Address\": \"172.17.0.2/16\",\n                \"IPv6Address\": \"\"\n            }\n        },\n<Snip>\n```\n\n# <a name=\"ping_local\"></a>Step 3: Test network connectivity\n\nThe output to the previous `docker network inspect` command shows the IP address of the new container. In the previous example it is \"172.17.0.2\" but yours might be different.\n\nPing the IP address of the container from the shell prompt of your Docker host. Remember to use the IP of the container in **your** environment.\n\n```\n$ ping 172.17.0.2\n64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.069 ms\n64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.052 ms\n64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.050 ms\n64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.049 ms\n64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.049 ms\n^C\n--- 172.17.0.2 ping statistics ---\n5 packets transmitted, 5 received, 0% packet loss, time 3999ms\nrtt min/avg/max/mdev = 0.049/0.053/0.069/0.012 ms\n```\n\nPress `Ctrl-C` to stop the ping. The replies above show that the Docker host can ping the container over the **bridge** network.\n\nLog in to the container, install the `ping`\n program and ping `www.docker.com`.\n\n ```\n# Get the ID of the container started in the previous step.\n$ docker ps\nCONTAINER ID    IMAGE    COMMAND             CREATED  STATUS  NAMES\n6dd93d6cdc80    ubuntu   \"sleep infinity\"    5 mins   Up      reverent_dubinsky\n\n# Exec into the container\n$ docker exec -it 6dd93d6cdc80 /bin/bash\n\n# Update APT package lists and install the iputils-ping package\nroot@6dd93d6cdc80:/# apt-get update\n <Snip>\n\n apt-get install iputils-ping\n Reading package lists... Done\n<Snip>\n\n# Ping www.docker.com from within the container\nroot@6dd93d6cdc80:/# ping www.docker.com\nPING www.docker.com (104.239.220.248) 56(84) bytes of data.\n64 bytes from 104.239.220.248: icmp_seq=1 ttl=39 time=93.9 ms\n64 bytes from 104.239.220.248: icmp_seq=2 ttl=39 time=93.8 ms\n64 bytes from 104.239.220.248: icmp_seq=3 ttl=39 time=93.8 ms\n^C\n--- www.docker.com ping statistics ---\n3 packets transmitted, 3 received, 0% packet loss, time 2002ms\nrtt min/avg/max/mdev = 93.878/93.895/93.928/0.251 ms\n```\n\nThis shows that the new container can ping the internet and therefore has a valid and working network configuration.\n\n\n# <a name=\"nat\"></a>Step 4: Configure NAT for external connectivity\n\nIn this step we'll start a new **NGINX** container and map port 8080 on the Docker host to port 80 inside of the container. This means that traffic that hits the Docker host on port 8080 will be passed on to port 80 inside the container.\n\n> **NOTE:** If you start a new container from the official NGINX image without specifying a command to run, the container will run a basic web server on port 80.\n\nStart a new container based off the official NGINX image.\n\n```\n$ docker run --name web1 -d -p 8080:80 nginx\nUnable to find image 'nginx:latest' locally\nlatest: Pulling from library/nginx\n386a066cd84a: Pull complete\n7bdb4b002d7f: Pull complete\n49b006ddea70: Pull complete\nDigest: sha256:9038d5645fa5fcca445d12e1b8979c87f46ca42cfb17beb1e5e093785991a639\nStatus: Downloaded newer image for nginx:latest\nb747d43fa277ec5da4e904b932db2a3fe4047991007c2d3649e3f0c615961038\n```\n\nCheck that the container is running and view the port mapping.\n\n```\n$ docker ps\nCONTAINER ID    IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES\nb747d43fa277   nginx               \"nginx -g 'daemon off\"   3 seconds ago       Up 2 seconds        443/tcp, 0.0.0.0:8080->80/tcp   web1\n6dd93d6cdc80        ubuntu              \"sleep infinity\"         About an hour ago   Up About an hour                                    reverent_dubinsky\n```\n\nThere are two containers listed in the output above. The top line shows the new **web1** container running NGINX. Take note of the command the container is running as well as the port mapping - `0.0.0.0:8080->80/tcp` maps port 8080 on all host interfaces to port 80 inside the **web1** container. This port mapping is what effectively makes the containers web service accessible from external sources (via the Docker hosts IP address on port 8080).\n\nNow that the container is running and mapped to a port on a host interface you can test connectivity to the NGINX web server.\n\nTo complete the following task you will need the IP address of your Docker host. This will need to be an IP address that you can reach (e.g. if your lab is in AWS this will need to be the instance's Public IP).\n\nPoint your web browser to the IP and port 8080 of your Docker host. The following example shows a web browser pointed to `52.213.169.69:8080`\n\n![](concepts/img/browser.png)\n\nIf you try connecting to the same IP address on a different port number it will fail.\n\nIf for some reason you cannot open a session from a web broswer, you can connect from your Docker host using the `curl` command.\n\n```\n$ curl 127.0.0.1:8080\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n    <Snip>\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n```\n\nIf you try and curl the IP address on a different port number it will fail.\n\n> **NOTE:** The port mapping is actually port address translation (PAT).\n"
  },
  {
    "path": "Docker/networking/A3-overlay-networking.md",
    "content": "# Overlay networking and service discovery\n\n# Lab Meta\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 20 minutes\n\nIn this lab you'll learn how to build, manage, and use an **overlay** network with a *service* in *Swarm mode*.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Create a new Swarm](#swarm_init)\n- [Step 2 - Create an overlay network](#create_network)\n- [Step 3 - Create a service](#create_service)\n- [Step 4 - Test the network](#test)\n- [Step 5 - Test service discovery](#discover)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- Two Linux-based Docker hosts running **Docker 1.12** or higher in Engine mode (i.e. not yet configured for Swarm mode). You should use **node1** and **node2** from your lab.\n\n\n# <a name=\"swarm_init\"></a>Step 1: Create a new Swarm\n\nIn this step you'll initialize a new Swarm, join a single worker node, and verify the operations worked.\n\n1. Execute the following command on **node1**.\n\n    ```\n    node1$ docker swarm init\n    Swarm initialized: current node (cw6jpk7pqfg0jkilff5hr8z42) is now a manager.\n    To add a worker to this swarm, run the following command:\n\n    docker swarm join \\\n    --token SWMTKN-1-3n2iuzpj8jynx0zd8axr0ouoagvy0o75uk5aqjrn0297j4uaz7-63eslya31oza2ob78b88zg5xe \\\n    172.31.34.123:2377\n\n    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.\n    ```\n\n2. Copy the entire `docker swarm join` command that is displayed as part of the output from the command.\n\n3. Paste the copied command into the terminal of **node2**.\n\n    ```\n    node2$ docker swarm join \\\n    >     --token SWMTKN-1-3n2iuzpj8jynx0zd8axr0ouoagvy0o75uk5aqjrn0297j4uaz7-63eslya31oza2ob78b88zg5xe \\\n    >     172.31.34.123:2377\n\n    This node joined a swarm as a worker.\n    ```\n\n4. Run a `docker node ls` on **node1** to verify that both nodes are part of the Swarm.\n\n    ```\n    node1$ docker node ls\n    ID                           HOSTNAME          STATUS  AVAILABILITY  MANAGER STATUS\n    4nb02fhvhy8sb0ygcvwya9skr    ip-172-31-43-74   Ready   Active\n    cw6jpk7pqfg0jkilff5hr8z42 *  ip-172-31-34-123  Ready   Active        Leader\n    ```\n\n    The `ID` and `HOSTNAME` values may be different in your lab. The important thing to check is that both nodes have joined the Swarm and are *ready* and *active*.\n\n# <a name=\"create_network\"></a>Step 2: Create an overlay network\n\nNow that you have a Swarm initialized it's time to create an **overlay** network.\n\n1. Create a new overlay network called \"overnet\" by executing the following command on **node1**.\n\n    ```\n    node1$ docker network create -d overlay overnet\n    0cihm9yiolp0s9kcczchqorhb\n    ```\n\n2. Use the `docker network ls` command to verify the network was created successfully.\n\n    ```\n    node1$ docker network ls\n    NETWORK ID          NAME                DRIVER      SCOPE\n    1befe23acd58        bridge              bridge      local\n    0ea6066635df        docker_gwbridge     bridge      local\n    726ead8f4e6b        host                host        local\n    8eqnahrmp9lv        ingress             overlay     swarm\n    ef4896538cc7        none                null        local\n    0cihm9yiolp0        overnet             overlay     swarm\n    ```\n\n    The new \"overnet\" network is shown on the last line of the output above. Notice how it is associated with the **overlay** driver and is scoped to the entire Swarm.\n\n    > **NOTE:** The other new networks (ingress and docker_gwbridge) were created automatically when the Swarm cluster was created.\n\n3. Run the same `docker network ls` command from **node2**\n\n    ```\n    node2$ docker network ls\n    NETWORK ID          NAME                DRIVER      SCOPE\n    b76635120433        bridge              bridge      local\n    ea13f975a254        docker_gwbridge     bridge      local\n    73edc8c0cc70        host                host        local\n    8eqnahrmp9lv        ingress             overlay     swarm\n    c4fb141606ca        none                null        local\n    ```\n\n    Notice that the \"overnet\" network does not appear in the list. This is because Docker only extends overlay networks to hosts when they are needed. This is usually when a host runs a task from a service that is created on the network. We will see this shortly.\n\n4. Use the `docker network inspect` command to view more detailed information about the \"overnet\" network. You will need to run this command from **node1**.\n\n    ```\n    node1$ docker network inspect overnet\n    [\n        {\n            \"Name\": \"overnet\",\n            \"Id\": \"0cihm9yiolp0s9kcczchqorhb\",\n            \"Scope\": \"swarm\",\n            \"Driver\": \"overlay\",\n            \"EnableIPv6\": false,\n            \"IPAM\": {\n                \"Driver\": \"default\",\n                \"Options\": null,\n                \"Config\": []\n            },\n            \"Internal\": false,\n            \"Containers\": null,\n            \"Options\": {\n                \"com.docker.network.driver.overlay.vxlanid_list\": \"257\"\n            },\n            \"Labels\": null\n        }\n    ]\n    ```\n\n# <a name=\"create_service\"></a>Step 3: Create a service\n\nNow that you have a Swarm initialized and an overlay network, it's time to create a service that uses the network.\n\n1. Execute the following command from **node1** to create a new service called *myservice* on the *overnet* network with two tasks/replicas.\n\n    ```\n    node1$ docker service create --name myservice \\\n    --network overnet \\\n    --replicas 2 \\\n    ubuntu sleep infinity\n\n    e9xu03wsxhub3bij2tqyjey5t\n    ```\n\n2. Verify that the service is created and both replicas are up.\n\n    ```\n    node1$ docker service ls\n    ID            NAME       REPLICAS  IMAGE   COMMAND\n    e9xu03wsxhub  myservice  2/2       ubuntu  sleep infinity\n    ```\n\n    The `2/2` in the `REPLICAS` column shows that both tasks in the service are up and running.\n\n3. Verify that a single task (replica) is running on each of the two nodes in the Swarm.\n\n    ```\n    node1$ docker service ps myservice\n    ID            NAME         IMAGE   NODE   DESIRED STATE  CURRENT STATE  ERROR\n    5t4wh...fsvz  myservice.1  ubuntu  node1  Running        Running 2 mins\n    8d9b4...te27  myservice.2  ubuntu  node2  Running        Running 2 mins\n    ```\n\n    The `ID` and `NODE` values might be different in your output. The important thing to note is that each task/replica is running on a different node.\n\n4. Now that **node2** is running a task on the \"overnet\" network it will be able to see the \"overnet\" network. Run the following command from **node2** to verify this.\n\n    ```\n    node2$ docker network ls\n    NETWORK ID          NAME                DRIVER      SCOPE\n    b76635120433        bridge              bridge      local\n    ea13f975a254        docker_gwbridge     bridge      local\n    73edc8c0cc70        host                host        local\n    8eqnahrmp9lv        ingress             overlay     swarm\n    c4fb141606ca        none                null        local\n    0cihm9yiolp0        overnet             overlay     swarm\n    ```\n\n5. Run the following command on **node2** to get more detailed information about the \"overnet\" network and obtain the IP address of the task running on **node2**.\n\n    ```\n    node2$ docker network inspect overnet\n    [\n        {\n            \"Name\": \"overnet\",\n            \"Id\": \"0cihm9yiolp0s9kcczchqorhb\",\n            \"Scope\": \"swarm\",\n            \"Driver\": \"overlay\",\n            \"EnableIPv6\": false,\n            \"IPAM\": {\n                \"Driver\": \"default\",\n                \"Options\": null,\n                \"Config\": [\n                    {\n                        \"Subnet\": \"10.0.0.0/24\",\n                        \"Gateway\": \"10.0.0.1\"\n                    }\n                    ]\n            },\n            \"Internal\": false,\n            \"Containers\": {\n                \"286d2e98c764...37f5870c868\": {\n                    \"Name\": \"myservice.1.5t4wh7ngrzt9va3zlqxbmfsvz\",\n                    \"EndpointID\": \"43590b5453a...4d641c0c913841d657\",\n                    \"MacAddress\": \"02:42:0a:00:00:04\",\n                    \"IPv4Address\": \"10.0.0.4/24\",\n                    \"IPv6Address\": \"\"\n                }\n            },      \n            \"Options\": {\n                \"com.docker.network.driver.overlay.vxlanid_list\": \"257\"\n                },\n                \"Labels\": {}\n                }\n            ]\n    ```\n\nYou should note that as of Docker 1.12, `docker network inspect` only shows containers/tasks running on the local node. This means that `10.0.0.4` is the IPv4 address of the container running on **node2**. Make a note of this IP address for the next step (the IP address in your lab might be different than the one shown here in the lab guide).\n\n# <a name=\"test\"></a>Step 4: Test the network\n\nTo complete this step you will need the IP address of the service task running on **node2** that you saw in the previous step.\n\n1. Execute the following commands from **node1**.\n\n    ```\n    node1$ docker network inspect overnet\n    [\n        {\n            \"Name\": \"overnet\",\n            \"Id\": \"0cihm9yiolp0s9kcczchqorhb\",\n            \"Scope\": \"swarm\",\n            \"Driver\": \"overlay\",\n            \"Containers\": {\n                \"053abaa...e874f82d346c23a7a\": {\n                    \"Name\": \"myservice.2.8d9b4i6vnm4hf6gdhxt40te27\",\n                    \"EndpointID\": \"25d4d5...faf6abd60dba7ff9b5fff6\",\n                    \"MacAddress\": \"02:42:0a:00:00:03\",\n                    \"IPv4Address\": \"10.0.0.3/24\",\n                    \"IPv6Address\": \"\"\n                }\n            },      \n            \"Options\": {\n                \"com.docker.network.driver.overlay.vxlanid_list\": \"257\"\n            },\n            \"Labels\": {}\n        }\n    ]\n    ```\n\n    Notice that the IP address listed for the service task (container) running on **node1** is different to the IP address for the service task running on **node2**. Note also that they are one the sane \"overnet\" network.\n\n2. Run a `docker ps` command to get the ID of the service task on **node1** so that you can log in to it in the next step.\n\n    ```\n    node1$ docker ps\n    CONTAINER ID   IMAGE           COMMAND            CREATED      STATUS         NAMES\n    053abaac4f93   ubuntu:latest   \"sleep infinity\"   19 mins ago  Up 19 mins     myservice.2.8d9b4i6vnm4hf6gdhxt40te27\n    <Snip>\n    ```\n\n3. Log on to the service task. Be sure to use the container `ID` from your environment as it will be different from the example shown below.\n\n    ```\n    node1$ docker exec -it 053abaac4f93 /bin/bash\n    root@053abaac4f93:/#\n    ```\n\n4. Install the ping command and ping the service task running on **node2**.\n\n    ```\n    root@053abaac4f93:/# apt-get update && apt-get install iputils-ping\n    <Snip>\n    root@053abaac4f93:/#\n    root@053abaac4f93:/#\n    root@053abaac4f93:/# ping 10.0.0.4\n    PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.\n    64 bytes from 10.0.0.4: icmp_seq=1 ttl=64 time=0.726 ms\n    64 bytes from 10.0.0.4: icmp_seq=2 ttl=64 time=0.647 ms\n    ^C\n    --- 10.0.0.4 ping statistics ---\n    2 packets transmitted, 2 received, 0% packet loss, time 999ms\n    rtt min/avg/max/mdev = 0.647/0.686/0.726/0.047 ms\n    ```\n\n    The output above shows that both tasks from the **myservice** service are on the same overlay network spanning both nodes and that they can use this network to communicate.\n\n# <a name=\"discover\"></a>Step 5: Test service discovery\n\nNow that you have a working service using an overlay network, let's test service discovery.\n\nIf you are not still inside of the container on **node1**, log back into it with the `docker exec` command.\n\n1. Run the following command form inside of the container on **node1**.\n\n    ```\n    root@053abaac4f93:/# cat /etc/resolv.conf\n    search eu-west-1.compute.internal\n    nameserver 127.0.0.11\n    options ndots:0\n    ```\n\n    The value that we are interested in is the `nameserver 127.0.0.11`. This value sends all DNS queries from the container to an embedded DNS resolver running inside the container listening on 127.0.0.11:53. All Docker container run an embedded DNS server at this address.\n\n    > **NOTE:** Some of the other values in your file may be different to those shown in this guide.\n\n2. Try and ping the `myservice` name from within the container.\n\n    ```\n    root@053abaac4f93:/# ping myservice\n    PING myservice (10.0.0.2) 56(84) bytes of data.\n    64 bytes from ip-10-0-0-2.eu-west-1.compute.internal (10.0.0.2): icmp_seq=1 ttl=64 time=0.020 ms\n    64 bytes from ip-10-0-0-2.eu-west-1.compute.internal (10.0.0.2): icmp_seq=2 ttl=64 time=0.041 ms\n    64 bytes from ip-10-0-0-2.eu-west-1.compute.internal (10.0.0.2): icmp_seq=3 ttl=64 time=0.039 ms\n    ^C\n    --- myservice ping statistics ---\n    3 packets transmitted, 3 received, 0% packet loss, time 2001ms\n    rtt min/avg/max/mdev = 0.020/0.033/0.041/0.010 ms\n    ```\n\n    The output clearly shows that the container can ping the `myservice` service by name. Notice that the IP address returned is `10.0.0.2`. In the next few steps we'll verify that this address is the virtual IP (VIP) assigned to the `myservice` service.\n\n3. Type the `exit` command to leave the `exec` container session and return to the shell prompt of your **node1** Docker host.\n\n4. Inspect the configuration of the `myservice` service and verify that the VIP value matches the value returned by the previous `ping myservice` command.\n\n    ```\n    node1$ docker service inspect myservice\n    [\n        {\n            \"ID\": \"e9xu03wsxhub3bij2tqyjey5t\",\n            \"Version\": {\n                \"Index\": 20\n            },\n            \"CreatedAt\": \"2016-11-23T09:28:57.888561605Z\",\n            \"UpdatedAt\": \"2016-11-23T09:28:57.890326642Z\",\n            \"Spec\": {\n                \"Name\": \"myservice\",\n                \"TaskTemplate\": {\n                    \"ContainerSpec\": {\n                        \"Image\": \"ubuntu\",\n                        \"Args\": [\n                            \"sleep\",\n                            \"infinity\"\n                        ]\n                    },\n    <Snip>\n            \"Endpoint\": {\n                \"Spec\": {\n                    \"Mode\": \"vip\"\n                },\n                \"VirtualIPs\": [\n                    {\n                        \"NetworkID\": \"0cihm9yiolp0s9kcczchqorhb\",\n                        \"Addr\": \"10.0.0.2/24\"\n                    }\n    <Snip>\n    ```\n\n    Towards the bottom of the output you will see the VIP of the service listed. The VIP in the output above is `10.0.0.2` but the value may be different in your setup. The important point to note is that the VIP listed here matches the value returned by the `ping myservice` command.\n\nFeel free to create a new `docker exec` session to the service task (container) running on **node2** and perform the same `ping service` command. You will get a response form the same VIP.\n"
  },
  {
    "path": "Docker/networking/A4-HTTP Routing Mesh.md",
    "content": "# HTTP Routing Mesh (HRM)\n\n> **NOTE:** This lab assumes two things.\n    >1. You have configured DNS name resolution for red.example.com and white.example.com to point to a load balancer. This name resolution is required for your laptop/desktop and not the Docker nodes that will make up your UCP cluster. Therefore, it can be as simple as a couple of entries in the local `hosts` file of your laptop or desktop. As long as your web browser can resolve red.example.com and white.example.com to a load balancer in front of your Swarm this lab will work.\n    >2. You have configured an external load balancer to accept connections for the two DNS names above and to load balance across all nodes in a UCP cluster.\n\n\n# Lab Meta\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 15 minutes\n\nIn this lab you'll learn how to configure and use the *HTTP Routing Mesh* with *Docker Datacenter*.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Enable the HTTP Routing Mesh (HRM)](#enable_hrm)\n- [Step 2 - Verify the HRM](#verify_hrm)\n- [Step 3 - Create the RED service](#create_red)\n- [Step 4 - Create the WHITE service](#create_white)\n- [Step 5 - Test the configuration](#test)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A UCP Cluster running **Docker 1.12** or higher\n- Credentials to log in to UCP, create services, and enable the HRM\n- Name resolution configured for two DNS names (your lab instructor will give you these)\n\nYour instructor will provide you with the details you require.\n\n> **NOTE:** Throughout this guide we will use *red.example.com* and *white.example.com*. As per the note above, you will need to configure this yourself. You can also substitute other names if you like.That would mean that any time you see *red.example.com* and *white.example.com* you will need to substitute these for *red.* and *white.<your-domain-goes-here>*.\n\n\n# <a name=\"enable_hrm\"></a>Step 1: Enable the HTTP Routing Mesh (HRM)\n\n1. Use a web browser to connect to the Login page of your UCP cluster\n\n2. Enter your credentials as supplied by your lab instructor\n\n3. Navigate to `Admin Settings` > `Routing Mesh` and enable the HTTP Routing Mesh (HRM) on port 80.\n\n   ![](concepts/img/enable-hrm.png)\n\nThe HRM is now configured and ready to use.\n\n# <a name=\"verify_hrm\"></a>Step 2: Verify the HRM\n\nEnabling the HRM creates a new *service* called `ucp-hrm` and a new network called `ucp-hrm`. In this step we'll confirm that both of these constructs have been created correctly.\n\nExecute the following steps in the UCP web UI.\n\n1. Navigate to `Resources` > `Networks` and check for the presence of the `ucp-hrm` network. You may have to `search` for it.\n\n    ![](concepts/img/hrm-network.png)\n\n    The network shows as an overlay network scoped to the entire Swarm cluster.\n\n2. Navigate to `Resources` > `Services` and click the checkbox to `Show system services`.\n\n    ![](concepts/img/hrm-svc1.png)\n\n  The image above shows the `ucp-hrm` service up and running.\n\nYou have now verified that the HRM was configured successfully.\n\nIn the next two steps you'll create two services. Each service will based off the same `ehazlett/docker-demo:latest` image, and runs a web server that counts containers and requests. You will configure each service with a different number of tasks and each with a different value in the `TITLE` variable.\n\n# <a name=\"create_red\"></a>Step 3: Create the RED service\n\nIn this step you'll create a new service called **RED**, and configure it to use the HRM.\n\n1. In `DDC` click `Resources` > `Services` and then `+Create Service`.\n\n2. Configure the service as follows (leave all other options as default and remember to substitute \"red.example.com\" with the DNS name from your environment):\n  - Name: `RED`\n  - Image: `ehazlett/docker-demo:latest`\n  - Scale: `10`\n  - Arguments: `-close-conn`\n  - Published port: Port = `8080/tcp`, Public Port = `5000`\n  - Attached Networks: `ucp-hrm`\n  - Labels: `com.docker.ucp.mesh.http` = `8080=http://red.example.com`\n  - Environment Variables: `TITLE` = `RED`\n\n  It will take a few minutes for this service to pull down the image and start.  Continue with the next step to create the **WHITE** service.\n\n# <a name=\"create_white\"></a>Step 4: Create the WHITE service\n\nIn this step you'll create a new service called **WHITE**. The service will be very similar to the **RED** service created in the previous step.\n\n1. In `DDC` click `Resources` > `Services` and then `+Create Service`.\n\n2. Configure the service as follows (leave all other options as default and remember to substitute \"red.example.com\" with the DNS name from your environment):\n  - Name: `RWHITE`\n  - Image: `ehazlett/docker-demo:latest`\n  - Scale: `5`\n  - Arguments: `-close-conn`\n  - Published port: Port = `8080/tcp`, Public Port = `5001`\n  - Attached Networks: `ucp-hrm`\n  - Labels: `com.docker.ucp.mesh.http` = `8080=http://white.example.com`\n  - Environment Variables: `TITLE` = `WHITE`\n\n  This service will start instantaneously as the image is already pulled on every host in your UCP cluster.\n\n3. Verify that both services are up and running by clicking `Resources` > `Services` and checking that both services are running as shown below.\n\n  ![](concepts/img/check-svc.png)\n\nYou now have two services running. Both are connected to the `ucp-hrm` network and both have the `com.docker.ucp.mesh.http` label. The **RED** service is associated with HTTP requests for `red.example.com` and the **WHITE** service is associated with HTTP requests for `white.example.com`. This mapping of labels to URLs is leveraged by the `ucp-hrm` service which is published on port 80.\n\n\n# <a name=\"test\"></a>Step 5: Test the configuration\n\n> **NOTE: DNS name resolution is required for this step. This can obviously be via the local hosts file, but this step will not work unless the URLs specified in the `com.docker.ucp.mesh.http` labels resolve to the UCP cluster nodes (probably via a load balancer).**\n\nIn this step you will use your web browser to issue HTTP requests to `red.example.com` and `white.example.com`. DNS name resolution is configured so that these URLs resolve to a load balancer which in turn balances requests across all nodes in the UCP cluster.\n\n> Remember to substitute `example.com` with the domain supplied by your lab instructor.\n\n1. Open a web browser tab and point it to `red.example.com`.\n\n  ![](concepts/img/red.png)\n\n  The text below the whale saying \"RED\" indicates that this request was answered by the **RED** service. This is because the `TITLE` environment variable for the **RED** service was configured to display \"RED\" here. You also know it is the **RED** service as this was the service configured with 10 replicas (containers).\n\n2. Open another tab to `white.example.com`.\n\n  ![](concepts/img/white.png)\n\n  The output above shows that this request was routed to the **WHITE** service as it displays \"WHITE\" below the whale and only has 5 replicas (containers).\n\nCongratulations. You configured two services in the same Swarm (UCP cluster) to respond to requests on port 80. Traffic to each service is routed based on the URL included in the `host` field of the HTTP header.\n\nRequests arrive to the Swarm on port 80 and are forwarded to the `ucp-hrm` system service. The `ucp-hrm` service inspects the HTTP headers of requests and routes them to the service with the matching `com.docker.ucp.mesh.http` label.\n"
  },
  {
    "path": "Docker/networking/README.md",
    "content": "# Designing Scalable, Portable Docker Container Networks\n\n## What You Will Learn\n\nDocker containers wrap a piece of software in a complete filesystem that contains everything needed to run: code, runtime, system tools, system libraries – anything that can be installed on a server. This guarantees that the software will always run the same, regardless of its environment. By default, containers isolate applications from one another and the underlying infrastructure, while providing an added layer of protection for the application. \n\nWhat if the applications need to communicate with each other, the host, or an external network? How do you design a network to allow for proper connectivity while maintaining application portability, service discovery, load balancing, security, performance, and scalability? This document addresses these network design challenges as well as the tools available and common deployment patterns. It does not specify or recommend physical network design but provides options for how to design Docker networks while considering the constraints of the application and the physical network.\n\n### Prerequisites\n\nBefore continuing, being familiar with Docker concepts and Docker Swarm is recommended:\n \n- [Docker concepts](https://docs.docker.com/engine/understanding-docker/)\n- [Docker Swarm](https://docs.docker.com/engine/swarm/) and the newly introduced [Swarm mode concepts](https://docs.docker.com/engine/swarm/key-concepts/#/services-and-tasks)\n\n### Networking concepts\nThis tutorial allows you to dive right in and try code in the [Quick Tutorials](tutorials.md) section, or deep dive into this series of tutorials:\n\n1. [Networking Basics](A1-network-basics.md)\n1. [Bridge Networking](A2-bridge-networking.md)\n1. [Overlay Networking](A3-overlay-networking.md)\n1. [HTTP Routing Mesh](A4-HTTP%20Routing%20Mesh.md)\n\nOr you can first dive deep into the [Network Concepts](concepts/) before trying in out in code yourself.\n"
  },
  {
    "path": "Docker/networking/concepts/01-cnm.md",
    "content": "\n## <a name=\"cnm\"></a>The Container Networking Model\nThe Docker networking architecture is built on a set of interfaces called the _Container Networking Model_ (CNM). The philosophy of CNM is to provide application portability across diverse infrastructures. This model strikes a balance to achieve application portability and also takes advantage of special features and capabilities of the infrastructure. \n\n![Container Networking Model](./img/cnm.png)\n\n### CNM Constructs\nThere are several high-level constructs in the CNM. They are all OS and infrastructure agnostic so that applications can have a uniform experience no matter the infrastructure stack.\n\n - __Sandbox__ — A Sandbox contains the configuration of a container's network stack. This includes management of the container's interfaces, routing table, and DNS settings. An implementation of a Sandbox could be a Linux Network Namespace, a FreeBSD Jail, or other similar concept. A Sandbox may contain many endpoints from multiple networks.\n - __Endpoint__ — An Endpoint joins a Sandbox to a Network. The Endpoint construct exists so the actual connection to the network can be abstracted away from the application. This helps maintain portability so that a service can use different types of network drivers without being concerned with how it's connected to that network.\n - __Network__ — The CNM does not specify a Network in terms of the OSI model. An implementation of a Network could be a Linux bridge, a VLAN, etc. A Network is a collection of endpoints that have connectivity between them. Endpoints that are not connected to a network will not have connectivity on a Network.\n\nNext: **[Drivers](02-drivers.md)**"
  },
  {
    "path": "Docker/networking/concepts/02-drivers.md",
    "content": "\n## CNM Driver Interfaces\nThe Container Networking Model provides two pluggable and open interfaces that can be used by users, the community, and vendors to leverage additional functionality, visibility, or control in the network.\n\n### Categories of Network Drivers\n\n - __Network Drivers__ — Docker Network Drivers provide the actual implementation that makes networks work. They are pluggable so that different drivers can be used and interchanged easily to support different use-cases. Multiple network drivers can be used on a given Docker Engine or Cluster concurrently, but each Docker network is only instantiated through a single network driver. There are two broad types of CNM network drivers:\n \t- __Built-In Network Drivers__ — Built-In Network Drivers are a native part of the Docker Engine and are provided by Docker. There are multiple to choose from that support different capabilities like overlay networks or local bridges.\n \t- __Plug-In Network Drivers__ — Plug-In Network Drivers are network drivers created by the community and other vendors. These drivers can be used to provide integration with incumbent software and hardware. Users can also create their own drivers in cases where they desire specific functionality that is not supported by an existing network driver.\n - __IPAM Drivers__ — Docker has a built-in IP Address Management Driver that provides default subnets or IP addresses for Networks and Endpoints if they are not specified. IP addressing can also be manually assigned through network, container, and service create commands. Plug-In IPAM drivers also exist that provide integration to existing IPAM tools. \n\n### Docker Built-In Network Drivers\nThe Docker built-in network drivers are part of Docker Engine and don't require any extra modules. They are invoked and used through standard `docker network` commands. The follow built-in network drivers exist:\n\n- __Bridge__ — The `bridge` driver creates a Linux bridge on the host that is managed by Docker. By default containers on a bridge will be able to communicate with each other. External access to containers can also be configured through the `bridge` driver. \n\n- __Overlay__ — The `overlay` driver creates an overlay network that supports multi-host networks out of the box. It uses a combination of local Linux bridges and VXLAN to overlay container-to-container communications over physical network infrastructure. \n\n- __MACVLAN__ — The `macvlan` driver uses the MACVLAN bridge mode to establish a connection between container interfaces and a parent host interface (or sub-interfaces). It can be used to provide IP addresses to containers that are routable on the physical network. Additionally VLANs can be trunked to the `macvlan` driver to enforce Layer 2 container segmentation.\n\n- __Host__ — With the `host` driver, a container uses the networking stack of the host. There is no namespace separation, and all interfaces on the host can be used directly by the container.\n\n- __None__ — The `none` driver gives a container its own networking stack and network namespace but does not configure interfaces inside the container. Without additional configuration, the container is completely isolated from the host networking stack.\n\n\n### Default Docker Networks\nBy default a `none`, `host`, and `bridge` network will exist on every Docker host. These networks cannot be removed. When instantiating a Swarm, two additional networks, a bridge network named `docker_gwbridge` and an overlay network named `ingress`, are automatically created to facilitate cluster networking. \n\nThe `docker network ls` command shows these default Docker networks for a Docker Swarm:\n\n```\nNETWORK ID          NAME                DRIVER              SCOPE\n1475f03fbecb        bridge              bridge              local\ne2d8a4bd86cb        docker_gwbridge     bridge              local\n407c477060e7        host                host                local\nf4zr3zrswlyg        ingress             overlay             swarm\nc97909a4b198        none                null                local\n```\n\nIn addition to these default networks, [user defined networks](#userdefined) can also be created. They are discussed later in this document.\n\n### Network Scope\nAs seen in the `docker network ls` output, Docker network drivers have a concept of _scope_. The network scope is the domain of the driver which can be the `local` or `swarm` scope. Local scope drivers provide connectivity and network services (such as DNS or IPAM) within the scope of the host. Swarm scope drivers provide connectivity and network services across a swarm cluster. Swarm scope networks will have the same network ID across the entire cluster while local scope networks will have a unique network ID on each host. \n\n### Docker Plug-In Network Drivers\nThe following community- and vendor-created plug-in network drivers are compatible with CNM. Each provides unique capabilities and network services for containers.\n\n| Driver | Description   |\n|------|------|\n| [**contiv**](http://contiv.github.io/) | An open source network plugin led by Cisco Systems to provide infrastructure and security policies for multi-tenant microservices deployments. Contiv also provides integration for non-container workloads and with physical networks, such as ACI. Contiv implements plug-in network and IPAM drivers. |\n| [**weave**](https://www.weave.works/docs/net/latest/introducing-weave/) |  A network plugin that creates a virtual network that connects Docker containers across multiple hosts or clouds. Weave provides automatic discovery of applications, can operate on partially connected networks, does not require an external cluster store, and is operations friendly.   |\n| [**calico**](https://www.projectcalico.org/)     | Calico is an open source solution for virtual networking in cloud datacenters.  It targets datacenters where most of the workloads (VMs, containers, or bare metal servers) only require IP connectivity. Calico provides this connectivity using standard IP routing. Isolation between workloads — whether according to tenant ownership, or any finer grained policy — is achieved via iptables programming on the servers hosting the source and destination workloads.  |\n| [**kuryr**](https://github.com/openstack/kuryr)    | A network plugin developed as part of the OpenStack Kuryr project. It implements the Docker networking (libnetwork) remote driver API by utilizing Neutron, the OpenStack networking service. Kuryr includes an IPAM driver as well. |\n\n### Docker Plug-In IPAM Drivers\nCommunity and vendor created IPAM drivers can also be used to provide integrations with existing systems or special capabilities.\n\n| Driver | Description   |\n|------|------|\n| [**infoblox**](https://store.docker.com/community/images/infoblox/ipam-driver) | An open source IPAM plugin that provides integration with existing Infoblox tools. |\n\n> There are many Docker plugins that exist and more are being created all the time. Docker maintains a list of the [most common plugins.](https://docs.docker.com/engine/extend/legacy_plugins/)\n\nNext: **[Linux Network Fundamentals](03-linux-networking.md)**"
  },
  {
    "path": "Docker/networking/concepts/03-linux-networking.md",
    "content": "\n## <a name=\"drivers\"></a><a name=\"linuxnetworking\"></a>Linux Network Fundamentals\n\nThe Linux kernel features an extremely mature and performant implementation of the TCP/IP stack (in addition to other native kernel features like DNS and VXLAN). Docker networking uses the kernel's networking stack as low level primitives to create higher level network drivers. Simply put, _Docker networking <b>is</b> Linux networking._ \n\nThis implementation of existing Linux kernel features ensures high performance and robustness. Most importantly, it provides portability across many distributions and versions which enhances application portability.\n\nThere are several Linux networking building blocks which Docker uses to implement its built-in CNM network drivers. This list includes **Linux bridges**, **network namespaces**, **veth pairs**,  and **iptables**. The combination of these tools implemented as network drivers provide the forwarding rules, network segmentation, and management tools for complex network policy.\n\n### <a name=\"linuxbridge\"></a>The Linux Bridge\nA **Linux bridge** is a Layer 2 device that is the virtual implementation of a physical switch inside the Linux kernel. It forwards traffic based on MAC addresses which it learns dynamically by inspecting traffic. Linux bridges are used extensively in many of the Docker network drivers. A Linux bridge is not to be confused with the `bridge` Docker network driver which is a higher level implementation of the Linux bridge.\n\n\n### Network Namespaces\nA Linux **network namespace** is an isolated network stack in the kernel with its own interfaces, routes, and firewall rules. It is a security aspect of containers and Linux, used to isolate containers. In networking terminology they are akin to a VRF that segments the network control and data plane inside the host. Network namespaces ensure that two containers on the same host will not be able to communicate with each other or even the host itself unless configured to do so via Docker networks. Typically, CNM network drivers implement separate namespaces for each container. However, containers can share the same network namespace or even be a part of the host's network namespace. The host network namespace contains the host interfaces and host routing table. This network namespace is called the global network namespace.\n\n### Virtual Ethernet Devices\nA **virtual ethernet device** or **veth** is a Linux networking interface that acts as a connecting wire between two network namespaces. A veth is a full duplex link that has a single interface in each namespace. Traffic in one interface is directed out the other interface. Docker network drivers utilize veths to provide explicit connections between namespaces when Docker networks are created. When a container is attached to a Docker network, one end of the veth is placed inside the container (usually seen as the `ethX` interface) while the other is attached to the Docker network. \n\n### iptables\n**`iptables`** is the native packet filtering system that has been a part of the Linux kernel since version 2.4. It's a feature rich L3/L4 firewall that provides rule chains for packet marking, masquerading, and dropping. The built-in Docker network drivers utilize `iptables` extensively to segment network traffic, provide host port mapping, and to mark traffic for load balancing decisions.\n\nNext: **[Docker Network Control Plane](04-docker-network-cp.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/04-docker-network-cp.md",
    "content": "## <a name=\"controlplane\"></a>Docker Network Control Plane\nThe Docker-distributed network control plane manages the state of Swarm-scoped Docker networks in addition to propagating control plane data. It is a built-in capability of Docker Swarm clusters and does not require any extra components such as an external KV store. The control plane uses a [Gossip](https://en.wikipedia.org/wiki/Gossip_protocol) protocol based on [SWIM](https://www.cs.cornell.edu/~asdas/research/dsn02-swim.pdf) to propagate network state information and topology across Docker container clusters. The Gossip protocol is highly efficient at reaching eventual consistency within the cluster while maintaining constant rates of message size, failure detection times, and convergence time across very large scale clusters. This ensures that the network is able to scale across many nodes without introducing scaling issues such as slow convergence or false positive node failures. \n\nThe control plane is highly secure, providing confidentiality, integrity, and authentication through encrypted channels. It is also scoped per network which greatly reduces the updates that any given host will receive. \n\n![Docker Network Control Plane](./img/gossip.png)\n\nIt is composed of several components that work together to achieve fast convergence across large scale networks. The distributed nature of the control plane ensures that cluster controller failures don't affect network performance. \n\nThe Docker network control plane components are as follows:\n\n- **Message Dissemination** updates nodes in a peer-to-peer fashion fanning out the information in each exchange to a larger group of nodes. Fixed intervals and size of peer groups ensures that network usage is constant even as the size of the cluster scales. Exponential information propagation across peers ensures that convergence is fast and bounded across any cluster size.\n- **Failure Detection** utilizes direct and indirect hello messages to rule out network congestion and specific paths from causing false positive node failures. \n- **Full State Syncs** occur periodically to achieve consistency faster and resolve network partitions.\n- **Topology Aware** algorithms understand the relative latency between themselves and other peers. This is used to optimize the peer groups which makes convergence faster and more efficient. \n- **Control Plane Encryption** protects against man in the middle and other attacks that could compromise network security.\n\n> The Docker Network Control Plane is a component of [Swarm](https://docs.docker.com/engine/swarm/) and requires a Swarm cluster to operate.\n\nNext: **[Docker Bridge Network Driver Architecture](05-bridge-networks.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/05-bridge-networks.md",
    "content": "## <a name=\"drivers\"></a>Docker Bridge Network Driver Architecture\n\nThis section explains the default Docker bridge network as well as user-defined bridge networks.\n\n### Default Docker Bridge Network\nOn any host running Docker Engine, there will, by default, be a local Docker network named `bridge`. This network is created using a `bridge` network driver which instantiates a Linux bridge called `docker0`. This may sound confusing. \n\n- `bridge` is the name of the Docker network\n- `bridge` is the network driver, or template, from which this network is created\n- `docker0` is the name of the Linux bridge that is the kernel building block used to implement this network\n\nOn a standalone Docker host, `bridge` is the default network that containers will connect to if no other network is specified. In the following example a container is created with no network parameters. Docker Engine connects it to the `bridge` network by default. Inside the container we can see `eth0` which is created by the `bridge` driver and given an address by the Docker built-in IPAM driver.\n\n\n```bash\n#Create a busybox container named \"c1\" and show its IP addresses\nhost$ docker run -it --name c1 busybox sh\nc1 # ip address\n4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue\n    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff\n    inet 172.17.0.2/16 scope global eth0\n...\n```\n> A container interface's MAC address is dynamically generated and embeds the IP address to avoid collision. Here `ac:11:00:02` corresponds to `172.17.0.2`.\n\nBy using the tool `brctl` on the host, we show the Linux bridges that exist in the host network namespace. It shows a single bridge called `docker0`. `docker0` has one interface, `vetha3788c4`, which provides connectivity from the bridge to the `eth0` interface inside container `c1`.\n\n```\nhost$ brctl show\nbridge name\t\t bridge id\t\t\t  STP enabled    interfaces\ndocker0\t\t     8000.0242504b5200\t  no       \t\t vethb64e8b8\n```\n\nInside container `c1` we can see the container routing table that directs traffic to `eth0` of the container and thus the `docker0` bridge.\n\n```bash\nc1# ip route\ndefault via 172.17.0.1 dev eth0\n172.17.0.0/16 dev eth0  src 172.17.0.2\n```\nA container can have zero to many interfaces depending on how many networks it is connected to. Each Docker network can only have a single interface per container.\n\n![Default Docker Bridge Network](./img/bridge1.png)\n\nWhen we peek into the host routing table we can see the IP interfaces in the global network namespace that now includes `docker0`. The host routing table provides connectivity between `docker0` and `eth0` on the external network, completing the path from inside the container to the external network.\n\n```bash\nhost$ ip route\ndefault via 172.31.16.1 dev eth0\n172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1\n172.31.16.0/20 dev eth0  proto kernel  scope link  src 172.31.16.102\n```\n\nBy default `bridge` will be assigned one subnet from the ranges 172.[17-31].0.0/16 or 192.168.[0-240].0/20 which does not overlap with any existing host interface. The default `bridge` network can be also be configured to use user-supplied address ranges. Also, an existing Linux bridge can be used for the `bridge` network rather than Docker creating one. Go to the [Docker Engine docs](https://docs.docker.com/engine/userguide/networking/default_network/custom-docker0/) for more information about customizing `bridge`. \n\n>  The default `bridge` network is the only network that supports legacy [links](https://docs.docker.com/engine/userguide/networking/default_network/dockerlinks/). Name-based service discovery and user-provided IP addresses are __not__ supported by the default `bridge` network.\n\n\n\n### <a name=\"userdefined\"></a>User-Defined Bridge Networks\nIn addition to the default networks, users can create their own networks called **user-defined networks** of any network driver type. In the case of user-defined `bridge` networks, Docker will create a new Linux bridge on the host. Unlike the default `bridge` network, user-defined networks supports manual IP address and subnet assignment. If an assignment isn't given, then Docker's default IPAM driver will assign the next subnet available in the private IP space. \n\n![User-Defined Bridge Network](./img/bridge2.png)\n\nBelow we are creating a user-defined `bridge` network and attaching two containers to it. We specify a subnet and call the network `my_bridge`. One container is not given IP parameters, so the IPAM driver assigns it the next available IP in the subnet. The other container has its IP specified.\n\n```\n$ docker network create -d bridge my_bridge\n$ docker run -itd --name c2 --net my_bridge busybox sh\n$ docker run -itd --name c3 --net my_bridge --ip 10.0.0.254 busybox sh\n```\n\n`brctl` now shows a second Linux bridge on the host. The name of the Linux bridge, `br-4bcc22f5e5b9`, matches the Network ID of the `my_bridge` network. `my_bridge` also has two `veth` interfaces connected to containers `c2` and `c3`. \n\n```\n$ brctl show\nbridge name\t\t bridge id\t\t\t  STP enabled    interfaces\nbr-b5db4578d8c9\t 8000.02428d936bb1\t  no\t\t     vethc9b3282\n\t\t\t\t\t\t\t                         vethf3ba8b5\ndocker0\t\t     8000.0242504b5200\t  no\t\t     vethb64e8b8\n\n$ docker network ls\nNETWORK ID          NAME                DRIVER              SCOPE\nb5db4578d8c9        my_bridge           bridge              local\ne1cac9da3116        bridge              bridge              local\n...\n```\n\nListing the global network namespace interfaces shows the Linux networking circuitry that's been instantiated by Docker Engine. Each `veth` and Linux bridge interface appears as a link between one of the Linux bridges and the container network namespaces.\n\n```bash\n$ ip link\n\n1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 \n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 \n3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 \n5: vethb64e8b8@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 \n6: br-b5db4578d8c9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 \n8: vethc9b3282@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 \n10: vethf3ba8b5@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 \n...\n```\n\n### External and Internal Connectivity\nBy default all containers on the same `bridge` driver network will have connectivity with each other without extra configuration. This is an aspect of most types of Docker networks. By virtue of the Docker network the containers are able to communicate across their network namespaces and (for multi-host drivers) across external networks as well. **Communication between different Docker networks is firewalled by default.** This is a fundamental security aspect that allows us to provide network policy using Docker networks. For example, in the figure above containers `c2` and `c3` have reachability but they cannot reach `c1`.\n\nDocker `bridge` networks are not exposed on the external (underlay) host network by default. Container interfaces are given IPs on the private subnets of the bridge network. Containers communicating with the external network are port mapped or masqueraded so that their traffic uses an IP address of the host. The example below shows outbound and inbound container traffic passing between the host interface and a user-defined `bridge` network.\n\n![Port Mapping and Masquerading](./img/nat.png)\n\nOutbound (egress) container traffic is allowed by default. Egress connections initiated by containers are masqueraded/SNATed to an ephemeral port (_typically in the range of 32768 to 60999_). Return traffic on this connection is allowed, and thus the container uses the best routable IP address of the host on the ephemeral port.\n\nIngress container access is provided by explicitly exposing ports. This port mapping is done by Docker Engine and can be controlled through UCP or the Engine CLI. A specific or randomly chosen port can be configured to expose a service or container. The port can be set to listen on a specific (or all) host interfaces, and all traffic will be mapped from this port to a port and interface inside the container.\n\nThis previous diagram shows how port mapping and masquerading takes place on a host. Container `C2` is connected to the `my_bridge` network and has an IP address of `10.0.0.2`. When it initiates outbound traffic the traffic will be masqueraded so that it is sourced from ephemeral port `32768` on the host interface `192.168.0.2`. Return traffic will use the same IP address and port for its destination and will be masqueraded internally back to the container address:port `10.0.0.2:33920`. \n\nExposed ports can be configured using `--publish` in the Docker CLI or UCP. The diagram shows an exposed port with the container port `80` mapped to the host interface on port `5000`. The exposed container would be advertised at `192.168.0.2:5000`, and all traffic going to this interface:port would be sent to the container at `10.0.0.2:80`.\n\n\nNext: **[Overlay Driver Network Architecture](06-overlay-networks.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/06-overlay-networks.md",
    "content": "\n## <a name=\"overlaydriver\"></a>Overlay Driver Network Architecture\n\nThe built-in Docker `overlay` network driver radically simplifies many of the challenges in multi-host networking. With the `overlay` driver, multi-host networks are first-class citizens inside Docker without external provisioning or components. `overlay` uses the Swarm-distributed control plane to provide centralized management, stability, and security across very large scale clusters.\n\n### VXLAN Data Plane\nThe `overlay` driver utilizes an industry-standard VXLAN data plane that decouples the container network from the underlying physical network (the _underlay_). The Docker overlay network encapsulates container traffic in a VXLAN header which allows the traffic to traverse the physical Layer 2 or Layer 3 network. The overlay makes network segmentation dynamic and easy to control no matter what the underlying physical topology. Use of the standard IETF VXLAN header promotes standard tooling to inspect and analyze network traffic.\n\n> VXLAN has been a part of the Linux kernel since version 3.7, and Docker uses the native VXLAN features of the kernel to create overlay networks. The Docker overlay datapath is entirely in kernel space. This results in fewer context switches, less CPU overhead, and a low-latency, direct traffic path between applications and the physical NIC. \n\nIETF VXLAN ([RFC 7348](https://datatracker.ietf.org/doc/rfc7348/)) is a data-layer encapsulation format that overlays Layer 2 segments over Layer 3 networks. VXLAN is designed to be used in standard IP networks and can support large-scale, multi-tenant designs on shared physical network infrastructure. Existing on-premises and cloud-based networks can support VXLAN transparently. \n\nVXLAN is defined as a MAC-in-UDP encapsulation that places container Layer 2 frames inside an underlay IP/UDP header. The underlay IP/UDP header provides the transport between hosts on the underlay network. The overlay is the stateless VXLAN tunnel that exists as point-to-multipoint connections between each host participating in a given overlay network. Because the overlay is independent of the underlay topology, applications become more portable. Thus, network policy and connectivity can be transported with the application whether it is on-premises, on a developer desktop, or in a public cloud.\n\n![Packet Flow for an Overlay Network](./img/packetwalk.png)\n\nIn this diagram we see the packet flow on an overlay network. Here are the steps that take place when `c1` sends `c2` packets across their shared overlay network:\n\n- `c1` does a DNS lookup for `c2`. Since both containers are on the same overlay network the Docker Engine local DNS server resolves `c2` to its overlay IP address `10.0.0.3`.\n- An overlay network is a L2 segment so `c1` generates an L2 frame destined for the MAC address of `c2`.\n- The frame is encapsulated with a VXLAN header by the `overlay` network driver. The distributed overlay control plane manages the locations and state of each VXLAN tunnel endpoint so it knows that `c2` resides on `host-B` at the physical address of `192.168.1.3`. That address becomes the destination address of the underlay IP header.\n- Once encapsulated the packet is sent. The physical network is responsible of routing or bridging the VXLAN packet to the correct host.\n- The packet arrives at the `eth0` interface of `host-B` and is decapsulated by the `overlay` network driver. The original L2 frame from `c1` is passed to the `c2`'s `eth0` interface and up to the listening application.\n\n\n\n### Overlay Driver Internal Architecture\nThe Docker Swarm control plane automates all of the provisioning for an overlay network. No VXLAN configuration or Linux networking configuration is required. Data-plane encryption, an optional feature of overlays, is also automatically configured by the overlay driver as networks are created. The user or network operator only has to define the network (`docker network create -d overlay ...`) and attach containers to that network.\n \n![Overlay Network Created by Docker Swarm](./img/overlayarch.png)\n\nDuring overlay network creation, Docker Engine creates the network infrastructure required for overlays on each host. A Linux bridge is created per overlay along with its associated VXLAN interfaces. The Docker Engine intelligently instantiates overlay networks on hosts only when a container attached to that network is scheduled on the host. This prevents sprawl of overlay networks where connected containers do not exist.\n\nIn the following example we create an overlay network and attach a container to that network. We'll then see that Docker Swarm/UCP automatically creates the overlay network.\n\n```bash\n#Create an overlay named \"ovnet\" with the overlay driver\n$ docker network create -d overlay ovnet\n\n#Create a service from an nginx image and connect it to the \"ovnet\" overlay network\n$ docker service create --network ovnet --name container nginx\n```\n\nWhen the overlay network is created, you will notice that several interfaces and bridges are created inside the host.\n\n```bash\n# Run the \"ifconfig\" command inside the nginx container\n$ docker exec -it container ifconfig\n\n#docker_gwbridge network\neth1      Link encap:Ethernet  HWaddr 02:42:AC:12:00:04\n          inet addr:172.18.0.4  Bcast:0.0.0.0  Mask:255.255.0.0\n          inet6 addr: fe80::42:acff:fe12:4/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:8 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0\n          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)\n\n#overlay network\neth2      Link encap:Ethernet  HWaddr 02:42:0A:00:00:07\n          inet addr:10.0.0.7  Bcast:0.0.0.0  Mask:255.255.255.0\n          inet6 addr: fe80::42:aff:fe00:7/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1\n          RX packets:8 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0\n          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)\n     \n#container loopback\nlo        Link encap:Local Loopback\n          inet addr:127.0.0.1  Mask:255.0.0.0\n          inet6 addr: ::1/128 Scope:Host\n          UP LOOPBACK RUNNING  MTU:65536  Metric:1\n          RX packets:48 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:48 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0\n          RX bytes:4032 (3.9 KiB)  TX bytes:4032 (3.9 KiB)\n```\n\nTwo interfaces have been created inside the container that correspond to two bridges that now exist on the host. On overlay networks, each container will have at least two interfaces that connect it to the `overlay` and the `docker_gwbridge`.\n\n| Bridge | Purpose  |\n|:------:|------|\n| **overlay** | The ingress and egress point to the overlay network that VXLAN encapsulates and (optionally) encrypts traffic going between containers on the same overlay network. It extends the overlay across all hosts participating in this particular overlay. One will exist per overlay subnet on a host, and it will have the same name that a particular overlay network is given.    |\n| **docker_gwbridge** |   The egress bridge for traffic leaving the cluster. Only one `docker_gwbridge` will exist per host. Container-to-Container traffic is blocked on this bridge allowing ingress/egress traffic flows only.      |\n\n\n\n> The Docker Overlay driver has existed since Docker Engine 1.9, and an external K/V store was required to manage state for the network. Docker 1.12 integrated the control plane state into Docker Engine so that an external store is no longer required. 1.12 also introduced several new features including encryption and service load balancing. Networking features that are introduced require a Docker Engine version that supports them, and using these features with older versions of Docker Engine is not supported.\n\nNext: **[MACVLAN](07-macvlan.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/07-macvlan.md",
    "content": "## <a name=\"macvlandriver\"></a>MACVLAN \n\nThe `macvlan` driver is a new implementation of the tried and true network virtualization technique. The Linux implementations are extremely lightweight because rather than using a Linux bridge for isolation, they are simply associated with a Linux Ethernet interface or sub-interface to enforce separation between networks and connectivity to the physical network.\n\nMACVLAN offers a number of unique features and capabilities. It has positive performance implications by virtue of having a very simple and lightweight architecture. Rather than port mapping, the MACVLAN driver provides direct access between containers and the physical network. It also allows containers to receive routable IP addresses that are on the subnet of the physical network.\n\nThe `macvlan` driver uses the concept of a parent interface. This interface can be a physical interface such as `eth0`, a sub-interface for 802.1q VLAN tagging like `eth0.10` (`.10` representing `VLAN 10`), or even a bonded host adaptor which bundle two Ethernet interfaces into a single logical interface.\n\nA gateway address is required during MACVLAN network configuration. The gateway must be external to the host provided by the network infrastructure. MACVLAN networks allow access between container on the same network. Access between different MACVLAN networks on the same host is not possible without routing outside the host.\n\n![Connecting Containers with a MACVLAN Network](./img/macvlanarch.png)\n\nIn this example, we bind a MACVLAN network to `eth0` on the host. We attach two containers to the `mvnet` MACVLAN network and show that they can ping between themselves. Each container has an address on the `192.168.0.0/24` physical network subnet and their default gateway is an interface in the physical network.\n\n```bash\n#Creation of MACVLAN network \"mvnet\" bound to eth0 on the host \n$ docker network create -d macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1 -o parent=eth0 mvnet\n\n#Creation of containers on the \"mvnet\" network\n$ docker run -itd --name c1 --net mvnet --ip 192.168.0.3 busybox sh\n$ docker run -it --name c2 --net mvnet --ip 192.168.0.4 busybox sh\n/ # ping 192.168.0.3\nPING 127.0.0.1 (127.0.0.1): 56 data bytes\n64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.052 ms\n```\n\nAs you can see in this diagram, `c1` and `c2` are attached via the MACVLAN network called `macvlan` attached to `eth0` on the host.\n\n### VLAN Trunking with MACVLAN\n\nTrunking 802.1q to a Linux host is notoriously painful for many in operations. It requires configuration file changes in order to be persistent through a reboot. If a bridge is involved, a physical NIC needs to be moved into the bridge, and the bridge then gets the IP address. The `macvlan` driver completely manages sub-interfaces and other components of the MACVLAN network through creation, destruction, and host reboots.\n\n![VLAN Trunking with MACVLAN](./img/trunk-macvlan.png)\n\nWhen the `macvlan` driver is instantiated with sub-interfaces it allows VLAN trunking to the host and segments containers at L2. The `macvlan` driver automatically creates the sub-interfaces and connects them to the container interfaces. As a result each container will be in a different VLAN, and communication will not be possible between them unless traffic is routed in the physical network. \n\n\n```bash\n#Creation of  macvlan10 network that will be in VLAN 10\n$ docker network create -d macvlan --subnet 192.168.10.0/24 --gateway 192.168.10.1 -o parent=eth0.10macvlan10\n\n#Creation of  macvlan20 network that will be in VLAN 20\n$ docker network create -d macvlan --subnet 192.168.20.0/24 --gateway 192.168.20.1 -o parent=eth0.20 macvlan20\n\n#Creation of containers on separate MACVLAN networks\n$ docker run -itd --name c1--net macvlan10 --ip 192.168.10.2 busybox sh\n$ docker run -it --name c2--net macvlan20 --ip 192.168.20.2 busybox sh\n```\n\nIn the preceding configuration we've created two separate networks using the `macvlan` driver that are configured to use a sub-interface as their parent interface. The `macvlan` driver creates the sub-interfaces and connects them between the host's `eth0` and the container interfaces. The host interface and upstream switch must be set to `switchport mode trunk` so that VLANs are tagged going across the interface. One or more containers can be connected to a given MACVLAN network to create complex network policies that are segmented via L2.\n\n> Because multiple MAC addresses are living behind a single host interface you might need to enable promiscuous mode on the interface depending on the NIC's support for MAC filtering.  \n\nNext: **[Host (Native) Network Driver](08-host-networking.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/08-host-networking.md",
    "content": "\n## <a name=\"hostdriver\"></a>Host (Native) Network Driver\n\nThe `host` network driver connects a container directly to the host networking stack. Containers using the `host` driver reside in the same network namespace as the host itself. Thus, containers will have native bare-metal network performance at the cost of namespace isolation. \n\n```bash\n#Create a container attached to the host network namespace and print its network interfaces\n$ docker run -it --net host --name c1 busybox ifconfig\ndocker0   Link encap:Ethernet  HWaddr 02:42:19:5F:BC:F7\n          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0\n          UP BROADCAST MULTICAST  MTU:1500  Metric:1\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0\n          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)\n\neth0      Link encap:Ethernet  HWaddr 08:00:27:85:8E:95\n          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0\n          inet6 addr: fe80::a00:27ff:fe85:8e95/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:190780 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:58407 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000\n          RX bytes:189367384 (180.5 MiB)  TX bytes:3714724 (3.5 MiB)\n...\n\n#Display the interfaces on the host\n$ ifconfig\ndocker0   Link encap:Ethernet  HWaddr 02:42:19:5f:bc:f7\n          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0\n          UP BROADCAST MULTICAST  MTU:1500  Metric:1\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0\n          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)\n\neth0      Link encap:Ethernet  HWaddr 08:00:27:85:8e:95\n          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0\n          inet6 addr: fe80::a00:27ff:fe85:8e95/64 Scope:Link\n          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1\n          RX packets:190812 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:58425 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000\n          RX bytes:189369886 (189.3 MB)  TX bytes:3716346 (3.7 MB)\n...\n```\n\nIn this example we can see that the host and container `c1` share the same interfaces. This has some interesting implications. Traffic passes directly from the container to the host interfaces.\n\nWith the `host` driver, Docker does not manage any portion of the container networking stack such as port mapping or routing rules. This means that common networking flags like `-p` and `--icc` have no meaning for the `host` driver. They will be ignored. If the network admin wishes to provide access and policy to containers then this will have to be self-managed on the host or managed by another tool.\n\nEvery container using the `host` network will all share the same host interfaces. This makes `host` ill suited for multi-tenant or highly secure applications. `host` containers will have access to every other container on the host. \n\nFull host access and no automated policy management may make the `host` driver a difficult fit as a general network driver. However, `host` does have some interesting properties that may be applicable for use cases such as ultra high performance applications, troubleshooting, or monitoring.\n\n## <a name=\"nonedriver\"></a>None (Isolated) Network Driver\n\nSimilar to the `host` network driver, the `none` network driver is essentially an unmanaged networking option. Docker Engine will not create interfaces inside the container, establish port mapping, or install routes for connectivity. A container using `--net=none` will be completely isolated from other containers and the host. The networking admin or external tools must be responsible for providing this plumbing. In the following example we see that a container using `none` only has a loopback interface and no other interfaces.\n\n\n```bash\n#Create a container using --net=none and display its interfaces \n$ docker run -it --net none busybox ifconfig\nlo        Link encap:Local Loopback\n          inet addr:127.0.0.1  Mask:255.0.0.0\n          inet6 addr: ::1/128 Scope:Host\n          UP LOOPBACK RUNNING  MTU:65536  Metric:1\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0\n          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)\n```\n \nUnlike the `host` driver, the `none` driver will create a separate namespace for each container. This guarantees container network isolation between any containers and the host. \n\n > Containers using `--net=none` or `--net=host` cannot be connected to any other Docker networks.\n\n Next: **[Physical Network Design Requirements](09-physical-networking.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/09-physical-networking.md",
    "content": "## <a name=\"requirements\"></a>Physical Network Design Requirements\nDocker Datacenter and Docker networking are designed to run over common data center network infrastructure and topologies. Its centralized controller and fault-tolerant cluster guarantee compatibility across a wide range of network environments. The components that provide networking functionality (network provisioning, MAC learning, overlay encryption) are either a part of Docker Engine, UCP, or the Linux kernel itself. No extra components or special networking features are required to run any of the built-in Docker networking drivers.\n\nMore specifically, the Docker built-in network drivers have NO requirements for:\n\n- Multicast\n- External key-value stores\n- Specific routing protocols \n- Layer 2 adjacencies between hosts\n- Specific topologies such as spine & leaf, traditional 3-tier, and PoD designs. Any of these topologies are supported.\n\nThis is in line with the Container Networking Model which promotes application portability across all environments while still achieving the performance and policy required of applications.\n\n## <a name=\"sd\"></a>Service Discovery Design Considerations\n\nDocker uses embedded DNS to provide service discovery for containers running on a single Docker Engine and `tasks` running in a Docker Swarm. Docker Engine has an internal DNS server that provides name resolution to all of the containers on the host in user-defined bridge, overlay, and MACVLAN networks. Each Docker container ( or `task` in Swarm mode) has a DNS resolver that forwards DNS queries to Docker Engine, which acts as a DNS server. Docker Engine then checks if the DNS query belongs to a container or `service` on network(s) that the requesting container belongs to. If it does, then Docker Engine looks up the IP address that matches a container, `task`, or`service`'s **name** in its key-value store and returns that IP or `service` Virtual IP (VIP) back to the requester. \n\nService discovery is _network-scoped_, meaning only containers or tasks that are on the same network can use the embedded DNS functionality. Containers not on the same network cannot resolve each other's addresses. Additionally, only the nodes that have containers or tasks on a particular network store that network's DNS entries. This promotes security and performance.\n\nIf the destination container or `service` does not belong on same network(s) as source container, then Docker Engine forwards the DNS query to the configured default DNS server. \n\n![Service Discovery](./img/DNS.png)\n\nIn this example there is a service of two containers called `myservice`. A second service (`client`) exists on the same network. The `client` executes two `curl` operations for `docker.com` and `myservice`. These are the resulting actions:\n\n\n - DNS queries are initiated by `client` for `docker.com` and `myservice`.\n - The container's built in resolver intercepts the DNS queries on `127.0.0.11:53` and sends them to Docker Engine's DNS server.\n - `myservice` resolves to the Virtual IP (VIP) of that service which is internally load balanced to the individual task IP addresses. Container names will be resolved as well, albeit directly to their IP address.\n - `docker.com` does not exist as a service name in the `mynet` network and so the request is forwarded to the configured default DNS server.\n \n Next: **[Load Balancing Design Considerations](10-load-balancing.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/10-load-balancing.md",
    "content": "## <a name=\"lb\"></a>Load Balancing Design Considerations\n\nLoad balancing is a major requirement in modern, distributed applications. Docker Swarm mode introduced in 1.12 comes with a native internal and external load balancing functionalities that utilize both `iptables` and `ipvs`, a transport-layer load balancing inside the Linux kernel.\n\n### Internal Load Balancing\nWhen services are created in a Docker Swarm cluster, they are automatically assigned a Virtual IP (VIP) that is part of the service's network. The VIP is returned when resolving the service's name. Traffic to that VIP will be automatically sent to all healthy tasks of that service across the overlay network. This approach avoids any client-side load balancing because only a single IP is returned to the client. Docker takes care of routing and equally distributing the traffic across the healthy service tasks.\n\n\n![Internal Load Balancing](./img/ipvs.png)\n\nTo see the VIP, run a `docker service inspect my_service` as follows:\n\n```\n# Create an overlay network called mynet\n$ docker network create -d overlay mynet\na59umzkdj2r0ua7x8jxd84dhr\n\n# Create myservice with 2 replicas as part of that network\n$ docker service create --network mynet --name myservice --replicas 2 busybox ping localhost\n8t5r8cr0f0h6k2c3k7ih4l6f5\n\n# See the VIP that was created for that service\n$ docker service inspect myservice\n...\n\n\"VirtualIPs\": [\n                {\n                    \"NetworkID\": \"a59umzkdj2r0ua7x8jxd84dhr\",\n                    \"Addr\": \"10.0.0.3/24\"\n                },\n]\n              \n``` \n\n> DNS round robin (DNS RR) load balancing is another load balancing option for services (configured with `--endpoint-mode`). In DNS RR mode a VIP is not created for each service. The Docker DNS server resolves a service name to individual container IPs in round robin fashion.\n\n\n###External Load Balancing (Docker Routing Mesh) \nYou can expose services externally by using the `--publish` flag when creating or updating the service. Publishing ports in Docker Swarm mode means that every node in your cluster will be listening on that port. But what happens if the service's task isn't on the node that is listening on that port?\n\nThis is where routing mesh comes into play. Routing mesh is a feature introduced in Docker 1.12 that combines `ipvs` and `iptables` to create a powerful cluster-wide transport-layer (L4) load balancer. It allows all the Swarm nodes to accept connections on the services' published ports. When any Swarm node receives traffic destined to the published TCP/UDP port of a running `service`, it forwards it to service's VIP using a pre-defined overlay network called `ingress`. The `ingress` network behaves similarly to other overlay networks but its sole purpose is to transport mesh routing traffic from external clients to cluster services. It uses the same VIP-based internal load balancing as described in the previous section.\n\nOnce you launch services, you can create an external DNS record for your applications and map it to any or all Docker Swarm nodes. You do not need to worry about where your container is running as all nodes in your cluster look as one with the routing mesh routing feature.  \n\n```\n#Create a service with two replicas and export port 8000 on the cluster\n$ docker service create --name app --replicas 2 --network appnet -p 8000:80 nginx\n```\n\n\n![Routing Mess](./img/routing-mesh.png) \n\nThis diagram illustrates how the Routing Mesh works.\n\n- A service is created with two replicas, and it is port mapped externally to port `8000`.\n- The routing mesh exposes port `8000` on each host in the cluster.\n- Traffic destined for the `app` can enter on any host. In this case the external LB sends the traffic to a host without a service replica.\n- The kernel's IPVS load balancer redirects traffic on the `ingress` overlay network to a healthy service replica.\n\nNext: **[Network Security and Encryption Design Considerations](11-security.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/11-security.md",
    "content": "## <a name=\"security\"></a>Network Security and Encryption Design Considerations\n\nNetwork security is a top-of-mind consideration when designing and implementing containerized workloads with Docker. In this section, we will go over three key design considerations that are typically raised around Docker network security and how you can utilize Docker features and best practices to address them. \n\n### Container Networking Segmentation\n\nDocker allows you to create an isolated network per application using the `overlay` driver. By default different Docker networks are firewalled from eachother. This approach provides a true network isolation at Layer 3. No malicious container can communicate with your application's container unless it's on the same network or your applications' containers expose services on the host port. Therefore, creating networks for each applications adds another layer of security. The principles of \"Defense in Depth\" still recommends application-level security to protect at L3 and L7.\n\n### Securing the Control Plane\n\nDocker Swarm comes with integrated PKI. All managers and nodes in the Swarm have a cryptographically signed identify in the form of a signed certificate. All manager-to-manager and manager-to-node control communication is secured out of the box with TLS. No need to generate certs externally or set up any CAs manually to get end-to-end control plane traffic secured in Docker Swarm mode. Certificates are periodically and automatically rotated.\n\n### Securing the Data Plane\n\nIn Docker Swarm mode the data path (e.g. application traffic) can be encrypted out-of-the-box. This feature uses IPSec tunnels to encrypt network traffic as it leaves the source container and decrypts it as it enters the destination container.  This ensure that your application traffic is highly secure when it's in transit regardless of the underlying networks. In a hybrid, multi-tenant, or multi-cloud environment, it is crucial to ensure data is secure as it traverses networks you might not have control over. \n\nThis diagram illustrates how to secure communication between two containers running on different hosts in a Docker Swarm. \n\n![Secure Communications between 2 Containers on Different Hosts](img/ipsec.png)\n\nThis feature works with the `overlay` driver in Swarm mode only and can be enabled per network at the time of creation by adding the `--opt encrypted=true` option (e.g `docker network create -d overlay --opt encrypted=true <NETWORK_NAME>`). After the network gets created, you can launch services on that network (e.g `docker service create --network <NETWORK_NAME> <IMAGE> <COMMAND>`). When two tasks of the same services are created on two different hosts, an IPsec tunnel is created between them and traffic gets encrypted as it leaves the source host and gets decrypted as it enters the destination host. \n\nThe Swarm leader periodically regenerates a symmetrical key and distributes it securely to all cluster nodes. This key is used by IPsec to encrypt and decrypt data plane traffic. The encryption is implemented via IPSec in host-to-host transport mode using AES-GCM.\n\nNext: **[IP Address Management](12-ipaddress-management.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/12-ipaddress-management.md",
    "content": "## <a name=\"ipam\"></a>IP Address Management\n\nThe Container Networking Model (CNM) provides flexibility in how IP addresses are managed. There are two methods for IP address management.\n\n- CNM has a built-in IPAM driver that does simple allocation of IP addresses globally for a cluster and prevents overlapping allocations. The built-in IPAM driver is what is used by default if no other driver is specified. \n- CNM has interfaces to use plug-in IPAM drivers from other vendors and the community. These drivers can provide integration into existing vendor or self-built IPAM tools. \n\nManual configuration of container IP addresses and network subnets can be done using UCP, the CLI, or Docker APIs. The address request will go through the chosen driver which will decide how to process the request.\n\nSubnet size and design is largely dependent on a given application and the specific network driver. IP address space design is covered in more depth for each [Network Deployment Model](#models) in the next section. The uses of port mapping, overlays, and MACVLAN all have implications on how IP addressing is arranged. In general, container addressing falls into two buckets. Internal container networks (bridge and overlay) address containers with IP addresses that are not routable on the physical network by default. MACVLAN networks provide IP addresses to containers that are on the subnet of the physical network. Thus, traffic from container interfaces can be routable on the physical network. It is important to note that subnets for internal networks (bridge, overlay) should not conflict with the IP space of the physical underlay network. Overlapping address space can cause traffic to not reach its destination. \n\nNext: **[Network Troubleshooting](13-troubleshooting.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/13-troubleshooting.md",
    "content": "## <a name=\"tshoot\"></a>Network Troubleshooting\n\nDocker network troubleshooting can be difficult for devops and network engineers. With proper understanding of how Docker networking works and the right set of tools, you can troubleshoot and resolve these network issues. One recommended way is to use the [netshoot](https://github.com/nicolaka/netshoot) container to troubleshoot network problems. The `netshoot` container has a set of powerful networking troubleshooting tools that can be used to troubleshoot Docker network issues.  \n\nNext: **[Network Deployment Models](14-network-models.md)**\n"
  },
  {
    "path": "Docker/networking/concepts/14-network-models.md",
    "content": "## <a name=\"models\"></a>Network Deployment Models\nDocker Engine and community provide multiple drivers to use. These drivers can be configured in multiple ways, and the physical network design and configuration will also affect network behavior. This section looks at different configurations and how they interoperate with the application and the physical network. This is not an exhaustive list but a description of common methods of deployment.\n\n![Common Methods of Network Deployment](./img/driver-comparison.png)\n\nBack to [Concepts](README.md)\nor\nOn to [Tutorials](../tutorials.md)\n"
  },
  {
    "path": "Docker/networking/concepts/README.md",
    "content": "## <a name=\"challenges\"></a>Challenges of Networking Containers and Microservices\n\nMicroservices practices have increased the scale of applications which has put even more importance on the methods of connectivity and isolation that we provide to applications. The Docker networking philosophy is application driven. It aims to provide options and flexibility to the network operators as well as the right level of abstraction to the application developers. \n\nLike any design, network design is a balancing act. __Docker Datacenter__ and the Docker ecosystem provides multiple tools to network engineers to achieve the best balance for their applications and environments. Each option provides different benefits and tradeoffs. The remainder of this guide details each of these choices so network engineers can understand what might be best for their environments.\n\nDocker has developed a new way of delivering applications, and with that, containers have also changed some aspects of how we approach networking. The following topics are common design themes for containerized applications:\n\n- __Portability__\n\t- _How do I guarantee maximum portability across diverse network environments while taking advantage of unique network characteristics?_\n\n- __Service Discovery__ \n\t- _How do I know where services are living as they are scaled up and down?_\n\n- __Load Balancing__\n\t- _How do I share load across services as services themselves are brought up and scaled?_\n\n- __Security__ \n\t- _How do I segment to prevent the right containers from accessing each other?_\n\t- _How do I guarantee that a container with application and cluster control traffic is secure?_\n\n- __Performance__  \n \t- _How do I provide advanced network services while minimizing latency and maximizing bandwidth?_\n\n- __Scalability__  \n \t- _How do I ensure that none of these characteristics are sacrificed when scaling applications across many hosts?_\n\n### <a name=\"concepts\"></a>Concepts\nThis section contains 14 different short networking concept chapters. Feel free to skip right to the [tutorials](../tutorials.md) if you feel you are ready and come back here if you need a refresher. The concept chapters are:\n\n1. [The Container Networking Model](01-cnm.md)\n\n1. [Drivers](02-drivers.md)\n\n1. [Linux Networking Fundamentals](03-linux-networking.md)\n\n1. [Docker Network Control Plane](04-docker-network-cp.md)\n\n1. [Bridge Networks](05-bridge-networks.md)\n\n1. [Overlay Networks](06-overlay-networks.md)\n\n1. [MACVLAN](07-macvlan.md)\n\n1. [Host (Native) Network Driver](08-host-networking.md)\n\n1. [Physical Network Design Requirements](09-physical-networking.md)\n\n1. [Load Balancing Design Considerations](10-load-balancing.md)\n\n1. [Security](11-security.md)\n\n1. [IP Address Management](12-ipaddress-management.md)\n\n1. [Troubleshooting](13-troubleshooting.md)\n\n1. [Network Deployment Models](14-network-models.md)\n"
  },
  {
    "path": "Docker/networking/scratch.md",
    "content": "##Service Discovery & Load Balancing\nService discovery is increasingly important in a containerized world. To scale apps developers have broken them in to smaller pieces that can be distributed across different machines to provide load balancing and fault tolerance. This presents challenges from a networking perspective. The challenge is mapping a container to its location (the container's IP address). Containers may be created and destroyed frequently and scheduled across different hosts dynamically. Containers must be able to register themsevles with a mapping authority and other services must be able to query this authority to find the location of those services.\n\nWhen a new service (container) is created it should be able register itself with a service discovery authority. The ```IP address:port``` of the container will then be registered to that service. The mapping of services to containers should dynamically be updated when containers are added or removed from a service. This diagram shows an example of the service discovery process. A container is created, it is registered to a specific service, and then a load balancer is updated with the containers location and service. Converseley when a container is stopped or becomes unhealthy then it should be removed from the service and load balancer. \n\n\n\n<br>\n<p align=\"center\">\n<img src=\"./img/servicediscovery.png\" width=100%>\n</p>\n\n\nThe mechanisms that provide service discovery and load balancing can take many forms. They can be external service or provided natively within Docker without extra infrastructure. In Docker Swarm Mode automatic service discovery and load balancing is provided right out of the box. A service can be defined and traffic is load balanced via DNS to containers. DNS load balancing is covered later in this guide.\n\nExternal solutions for service discovery and/or load balancing is also possible and may be desired to levarage existing infrastructure or to take advantage of special features. Common external service discovery mechanisms include Consul, etcd, and Zookeeper. Common external load balancers include HAproxy, Nginx, F5, and many more. \n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n<br>\n\n\n#####Underlay and Overlay Networks\nThe default behavior of the Docker bridge and overlay driver is to provide an internal subnet for each bridge or overlay network. Bridge networks only have local significance on each host and they provide port mapping to allow containers to reach outside of the host. Overlay networks span across hosts and use VXLAN tunneling to keep its IP namespace separate from other networks.\n\nIn this context we call the physical network (comprised of the host network adapters and upstream switches & routers) the underlay network. Between port mapping and overlay tunneling, containers only receive private IP addresses and are not part of the underlay network. This has many advantages.\n\n* Portability is increased because applications are not tied to the design of the physical network\n* Agility is improved because new networks can be created and destroyed without having to reconfigure physical infrastrture\n\nThere are scenarios where it may be more desirable to place containers directly on the underlay network so that they receive an IP address that is on the underlay subnet. These scenarios include:\n\n- Legacy Applications - Some legacy applications may use hard-coded IP addresses or ports. Applications that require themselves to be advertised on a certain port can cause difficulties with port-contention and may not be suitable to exist on a private bridge or overlay network.\n- Protocol & Application Incompatibilities - Some protocols and applications are incompatible with NAT and port mapping.\n\n#####Attaching Containers Directly to Underlay Networks\nDocker networking also has the ability to place containers directly on the underlay network with the overlay and bridge drivers. To achieve this port-mapping and NAT are turned out and containers are given IP addresses that are on the physical network subnet.\n\n\n\n\n<br>\n<br>\n\n\n#####Policy with Docker Networks\nDocker networks can easily be created dynamically to define the policies defined by applications. In this example we use a combination of overlay and bridge networks to connect multiple containers. We deploy three networks: \n\n - `backnet` for communication between the `web` and `db` containers. It is an overlay network that can span multiple hosts. Purposefully, we will not provide any connectivity between 'backnet' and the outside world. It is purely an internal network.\n - `monitor-net` for communication between the `monitor` container and all other containers on a given host. It is a bridge network as the monitoring communications are only local to each host.\n - `docker0` is the default bridge network. In this case it's not used for container to container communication. It's purely a network created to provide outside access to the `web` containers. \n\n<p align=\"center\">\n<img src=\"./img/app-policy.png\" width=70%>\n</p>\n\n\n\n##Docker Network Deployment Models\n#####Default Bridge Mode (Bridge + NAT/Port Mapping)\nThis is the default deployment of the Docker bridge driver. Each bridge network `br0` is local to the host. Traffic leaving or entering the host is NAT/port-mapped to the IP address of the network interface of the host. \n\n```\n$ docker network create -d bridge --subnet 10.0.0.0/24 --gateway 10.0.0.1 br0\n```\n\n<p align=\"center\">\n<img src=\"./img/bridgenat.png\" width=100%>\n</p>\n\n#####Bridge Mapped to Underlay\nIn the case that a container needs to have an ip address on the subnet of the physical/underlay network then this option can be used. \n\n```\nhost A\n$ docker network create -d bridge --subnet 192.168.1.0/24 --ip-range 192.168.1.0/28 --gateway 192.168.1.100 --aux-address DefaultGatewayIPv4=192.168.1.1 -o com.docker.network.bridge.name=brnet brnet\n\nhost B\n$ docker network create -d bridge --subnet 192.168.1.0/24 --ip-range 192.168.1.32/28 --gateway 192.168.1.101 --aux-address DefaultGatewayIPv4=192.168.1.1 -o com.docker.network.bridge.name=brnet brnet\n\n```\n\n<p align=\"center\">\n<img src=\"./img/bridgetounderlay.png\" width=100%>\n</p>\n\n#####Default Overlay Mode (Overlay + NAT/Port Mapping)\nThe default mode of the overlay network is to use the overlay network for container to container communication and `gw_bridge`  NAT/Port-Mapping for external communication. \n\n\n\n<p align=\"center\">\n<img src=\"./img/overlaydef.png\" width=100%>\n</p>\n\n\n#####MACVLAN\n\n\n\n \n##Docker Network Troubleshooting and Tools\n#####docker network \n#####ip route/address\n#####brctl\n#####nsenter\n\n\n\n\n\n---------------\n####My Questions\n- Possible to connect container to two networks in swarm mode?\n- How does DNS work when a container is connectected to two different networks?\n- Possible to connect both bridge and overlay network to container at same time?\n\n\n\n\n\n####Questions to Ask your Application\n- What segmentation and access is required of the applications?\n- How granular does the segmentation need to be?\n- What are the different tiers or environments that exist?\n\n####Management Network\n- What Docker engine/swarm/ucp/dtr traffic constitutes as management traffic?\n- What are the network policies for docker management traffic?\n\n####Best Practices for IP Address Management\n- How are addresses reserved and released?\n- How does the IPAM driver work?\n- What 3rd party IPAM drivers exist?\n- How to align host subnet layout with swarm labels/host environments?\n\n####Network Security\n- Should the underlay network be subnetted to provide application isolation? Pros/cons\n- Should the docker cluster be one flat IP space with use of overlay networks to provide segmentation? Pros/cons\n- Map container IPs to underlay? Pros/cons\n- Port forwarding/NAt to reach underlay? Pros/cons\n- Methods to connect separate interal overlay networks (different app tiers)\n  - attach multiple overlay networks to intermediary containers\n  - send traffic outside of overlay to gateway router\n  \n  \n\n  \n####Swarm/UCP Network Architecture\n- Can a UCP or swarm instance stretch across multiple AZ/data centers?\n- Ports and network access required for UCP and swarm infrastructure?\n\n  \nNotes\nNo more than 1 bridge when plumbing directly to underlay\nDiscuss docker events -> service discovery\nMention port mapping with port IP, not insecure because port is only expose on that IP\n\nNetworking Challenges\n\n\n\n\n\n\n"
  },
  {
    "path": "Docker/networking/tutorials.md",
    "content": "\n### <a name=\"pets\"></a>Tutorial Application: The Pets App\n\nIn the following example, we will use a fictional app called **[Pets](https://github.com/mark-church/pets)** to illustrate the __Network Deployment Models__.  It serves up images of pets on a web page while counting the number of hits to the page in a backend database. It is configurable via two environment variables, `DB` and `ROLE`.\n\n- `DB` specifies the hostname:port or IP:port of the `db` container for the web front end to use.\n- `ROLE` specifies the \"tenant\" of the application and whether it serves pictures of dogs or cat.\n\nIt consists of `web`, a Python flask container, and `db`, a  redis container. Its architecture and required network policy is described below.\n\n\n![Pets App Architecture and Network](./img/apptopology.png)\n\n\nWe will run this application on different network deployment models to show how we can instantiate connectivity and network policy. Each deployment model exhibits different characteristics that may be advantageous to your application and environment.\n\nWe will explore the following network deployment models in this section:\n\n- Bridge Driver\n- Overlay Driver \n- MACVLAN Bridge Mode Driver\n\n### <a name=\"bridgemodel\"></a>Tutorial App: Bridge Driver\nThis model is the default behavior of the built-in Docker `bridge` network driver. The `bridge` driver creates a private network internal to the host and provides an external port mapping on a host interface for external connectivity.\n\n```bash\n#Create a user-defined bridge network for our application\n$ docker network create -d bridge catnet\n\n#Instantiate the backend DB on the catnet network\n$ docker run -d --net catnet --name cat-db redis\n\n#Instantiate the web frontend on the catnet network and configure it to connect to a container named `cat-db`\n$ docker run -d --net catnet -p 8000:5000 -e 'DB=cat-db' -e 'ROLE=cat' chrch/web \n```\n\n> When an IP address is not specified, port mapping will be exposed on all interfaces of a host. In this case the container's application is exposed on `0.0.0.0:8000`. We can specify a specific IP address to advertise on only a single IP interface with the flag `-p IP:host_port:container_port`. More options to expose ports can be found in the [Docker docs](https://docs.docker.com/engine/reference/run/#/expose-incoming-ports).\n\n\n![Pet App using Bridge Driver](./img/singlehost-bridge.png)\n\n\nThe `web` container takes some environment variables to determine which backend it needs to connect to. Above we supply it with `cat-db` which is the name of our `redis` service. The Docker Engine's built-in DNS will resolve a container's name to its location in any user-defined network. Thus, on a network, a container or service can always be referenced by its name. \n\nWith the above commands we have deployed our application on a single host. The Docker bridge network provides connectivity and name resolution amongst the containers on the same bridge while exposing our frontend container externally.  \n\n```\n$ docker network inspect catnet\n[\n    {\n        \"Name\": \"catnet\",\n        \"Id\": \"81e45d3e3bf4f989abe87c42c8db63273f9bf30c1f5a593bae4667d5f0e33145\",\n        \"Scope\": \"local\",\n        \"Driver\": \"bridge\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": {},\n            \"Config\": [\n                {\n                    \"Subnet\": \"172.19.0.0/16\",\n                    \"Gateway\": \"172.19.0.1/16\"\n                }\n            ]\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Containers\": {\n            \"2a23faa18fb33b5d07eb4e0affb5da36449a78eeb196c944a5af3aaffe1ada37\": {\n                \"Name\": \"backstabbing_pike\",\n                \"EndpointID\": \"9039dae3218c47739ae327a30c9d9b219159deb1c0a6274c6d994d37baf2f7e3\",\n                \"MacAddress\": \"02:42:ac:13:00:03\",\n                \"IPv4Address\": \"172.19.0.3/16\",\n                \"IPv6Address\": \"\"\n            },\n            \"dbf7f59187801e1bcd2b0a7d4731ca5f0a95236dbc4b4157af01697f295d4528\": {\n                \"Name\": \"cat-db\",\n                \"EndpointID\": \"7f7c51a0468acd849fd575adeadbcb5310c5987195555620d60ee3ffad37c680\",\n                \"MacAddress\": \"02:42:ac:13:00:02\",\n                \"IPv4Address\": \"172.19.0.2/16\",\n                \"IPv6Address\": \"\"\n            }\n        },\n        \"Options\": {},\n        \"Labels\": {}\n    }\n]\n```\nIn this output, we can see that our two containers have automatically been given ip addresses from the `172.19.0.0/16` subnet. This is the subnet of the local `catnet` bridge, and it will provide all connected containers a subnet from this range unless they are statically configured.\n\n### Tutorial App: Multi-Host Bridge Driver Deployment\n\nDeploying a multi-host application requires some additional configuration so that distributed components can connect with each other. In the following example we explicitly tell the `web` container the location of `redis` with the environment variable `DB=hostB:8001`. Another change is that we are port mapping port `6379` inside the`redis` container to port `8001` on the `hostB`. Without the port mapping, `redis` would only be accessible on its connected networks (the default `bridge` in this case).\n\n```\nhost-A $ docker run -d -p 8000:5000 -e 'DB=host-B:8001' -e 'ROLE=cat' --name cat-web chrch/web \nhost-B $ docker run -d -p 8001:6379 redis\n```\n\n![Pet App with Multi-Host Bridge Driver](./img/multihost-bridge.png)\n\n> In this example we don't specify a network to use, so the default Docker `bridge` network will exist on every host. \n\nWhen we configure the location of `redis` at `host-B:8001`, we are creating a form of **service discovery**. We are configuring one service to be able to discover another service. In the single host example, this was done automatically because Docker Engine provided built-in DNS resolution for the container names. In this multi-host example we are doing this manually. \n\n- `cat-web` makes a request to the `redis` service at `host-B:8001`\n- On `host-A` the `host-B` hostname is resolved to `host-B`'s IP address by the infrastructure's DNS\n- The request from `cat-web` is masqueraded to use the `host-A` IP address. \n- Traffic is routed or bridged by the external network to `host-B` where port `8001` is exposed.\n- Traffic to port `8001` is NATed and routed on `host-B` to port `6379` on the `cat-db` container.\n\nThe hardcoding of application location is not typically recommended. Service discovery tools exist that provide these mappings dynamically as containers are created and destroyed in a cluster. The `overlay` driver provides global service discovery across a cluster. External tools such as [Consul](https://www.consul.io/) and [etcd](https://coreos.com/etcd/) also provide service discovery as an external service. \n\nIn the overlay driver example we will see that multi-host service discovery is provided out of the box, which is a major advantage of the overlay deployment model.\n\n\n\n#### Bridge Driver Benefits and Use-Cases\n\n- Very simple architecture promotes easy understanding and troubleshooting\n- Widely deployed in current production environments\n- Simple to deploy in any environment from developer laptops to production data center\n\n\n\n### <a name=\"overlaymodel\"></a>Tutorial App: Overlay Driver \n\nThis model utilizes the built-in `overlay` driver to provide multi-host connectivity out of the box. The default settings of the overlay driver will provide external connectivity to the outside world as well as internal connectivity and service discovery within a container application. The [Overlay Driver Architecture](#overlayarch) section reviews the internals of the Overlay driver which you should review before reading this section.\n\nIn this example we are re-using the previous Pets application. Prior to this example we already set up a Docker Swarm. For instructions on how to set up a Swarm read the [Docker docs](https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/). When the Swarm is set up, we can use the `docker service create` command to create containers and networks that will be managed by the Swarm.\n\nThe following shows how to inspect your Swarm, create an overlay network, and then provision some services on that overlay network. All of these commands are run on a UCP/swarm controller node.\n\n\n```bash\n#Display the nodes participating in this swarm cluster\n$ docker node ls\nID                           HOSTNAME          STATUS  AVAILABILITY  MANAGER STATUS\na8dwuh6gy5898z3yeuvxaetjo    host-B  Ready   Active\nelgt0bfuikjrntv3c33hr0752 *  host-A  Ready   Active        Leader\n\n#Create the dognet overlay network\n$ docker network create -d overlay --subnet 10.1.0.0/24 --gateway 10.1.0.1 dognet\n\n#Create the backend service and place it on the dognet network\n$ docker service create --network dognet --name dog-db redis\n\n#Create the frontend service and expose it on port 8000 externally\n$ docker service create --network dognet -p 8000:5000 -e 'DB=dog-db' -e 'ROLE=dog' --name dog-web chrch/web\n```   \n\n![Pets App with Overlay Network](./img/pets-overlay.png)\n\n\n\nWe pass in `DB=dog-db` as an environment variable to the web container. The overlay driver will resolve the service name `dog-db` and load balance it to containers in that service. It is not required to expose the `redis` container on an external port because the overlay network will resolve and provide connectivity within the network. \n\n> Inside overlay and bridge networks, all TCP and UDP ports to containers are open and accessible to all other containers attached to the overlay network.\n\n\nThe `dog-web` service is exposed on port `8000`, but in this case the __routing mesh__ will expose port `8000` on every host in the Swarm. We can test to see if the application is working by going to `<host-A>:8000` or `<host-B>:8000` in the browser. \n\nComplex network policies can easily be achieved with overlay networks. In the following configuration, we add the `cat` tenant to our existing application. This will represent two applications using the same cluster but requirE network micro-segmentation. We add a second overlay network with a second pair of `web` and `redis` containers. We also add an `admin` container that needs to have access to _both_ tenants.\n\nTo accomplish this policy we create a second overlay network, `catnet`, and attach the new containers to it. We also create the `admin` service and attach it to both networks.\n\n```\n$ docker network create -d overlay --subnet 10.2.0.0/24 --gateway 10.2.0.1 catnet\n$ docker service create --network catnet --name cat-db redis\n$ docker service create --network catnet -p 9000:5000 -e 'DB=cat-db' -e 'ROLE=cat' --name cat-web chrch/web\n$ docker service create --network dognet --network catnet -p 7000:5000 -e 'DB1=dog-db' -e 'DB2=cat-db' --name admin chrch/admin \n```\n\nThis example uses the following logical topology:\n\n- `dog-web` and `dog-db` can communicate with each other, but not with the `cat` service.\n- `cat-web` and `cat-db` can communicate with each other, but not with the `dog` service.\n- `admin` is connected to both networks and has reachability to all containers.\n\n![Pets App with Multi-Tenant Network](./img/multitenant.png)\n\n\n\n\n#### Overlay Benefits and Use Cases\n\n- Very simple multi-host connectivity for small and large deployments\n- Provides service discovery and load balancing with no extra configuration or components\n- Useful for east-west micro-segmentation via encrypted overlays\n- Routing mesh can be used to advertise a service across an entire cluster\n\n\n\n### <a name=\"macvlanmodel\"></a>Tutorial App: MACVLAN Bridge Mode\n\nThere may be cases where the application or network environment requires containers to have routable IP addresses that are a part of the underlay subnets. The MACVLAN driver provides an implementation that makes this possible. As described in the [MACVLAN Architecture section](#macvlan), a MACVLAN network binds itself to a host interface. This can be a physical interface, a logical sub-interface, or a bonded logical interface. It acts as a virtual switch and provides communication between containers on the same MACVLAN network. Each container receives a unique MAC address and an IP address of the physical network that the node is attached to.\n\n![Pets App on a MACVLAN Network](./img/2node-macvlan-app.png)\n\nIn this example, the Pets application is deployed on to `host-A` and `host-B`. \n\n```bash\n#Creation of local macvlan network on both hosts\nhost-A $ docker network create -d macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1 -o parent=eth0 macvlan\nhost-B $ docker network create -d macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1 -o parent=eth0 macvlan\n\n#Creation of web container on host-A\nhost-A $ docker run -it --net macvlan --ip 192.168.0.4 -e 'DB=dog-db' -e 'ROLE=dog' --name dog-web chrch/web\n\n#Creation of db container on host-B\nhost-B $ docker run -it --net macvlan --ip 192.168.0.5 --name dog-db redis\n```\n\nWhen `dog-web` communicates with `dog-db`, the physical network will route or switch the packet using the source and destination addresses of the containers. This can simplify network visibility as the packet headers can be linked directly to specific containers. At the same time application portability is decreased as container IPAM is tied to the physical network. Container addressing must adhere to the physical location of container placement in addition to preventing overlapping address assignment. Because of this, care must be taken to manage IPAM externally to a MACVLAN network. Overlapping IP addressing or incorrect subnets can lead to loss of container connectivity.\n\n#### MACVLAN Benefits and Use Cases\n\n- Very low latency applications can benefit from the `macvlan` driver because it does not utilize NAT.\n- MACVLAN can provide an IP per container, which may be a requirement in some environments.\n- More careful consideration for IPAM must be taken in to account.\n\n## Conclusion\n\nDocker is a quickly evolving technology, and the networking options are growing to satisfy more and more use cases every day. Incumbent networking vendors, pure-play SDN vendors, and Docker itself are all contributors to this space. Tighter integration with the physical network, network monitoring, and encryption are all areas of much interest and innovation.  \n\nThis document detailed some but not all of the possible deployments and CNM network drivers that exist. While there are many individual drivers and even more ways to configure those drivers, we hope you can see that there are only a few common models routinely deployed. Understanding the tradeoffs with each model is key to long term success.\n"
  },
  {
    "path": "Docker/registry/README.md",
    "content": "# Linux Registry Lab\n\nA registry is a service for storing and accessing Docker images. [Docker Cloud](https://cloud.docker.com) and [Docker Store](https://store.docker.com) are the best-known hosted registries, which you can use to store public and private images. You can also run your own registry using the open-source [Docker Registry](https://docs.docker.com/registry), which is a Go application in a Alpine Linux container.\n\n## What You Will Learn\n\nYou'll learn how to:\n\n- run a local registry in a container and configure your Docker engine to use the registry;\n\n- generate SSL certificates (using Docker!) and run a secure local registry with a friendly domain name;\n\n- generate encrypted passwords (using Docker!) and run an authenticated, secure local registry over HTTPS with basic auth.\n\n> Note. The open-source registry does not have a Web UI, so there's no friendly interface like [Docker Cloud](https://cloud.docker.com) or [Docker Store](https://store.docker.com). Instead there is a [REST API](https://docs.docker.com/registry/spec/api/) you can use to query the registry. For a local registry which has a Web UI and role-based access control, Docker, Inc. has the [Trusted Registry](https://www.docker.com/sites/default/files/Docker%20Trusted%20Registry.pdf) product.\n\n### Prerequisites\n\nYou'll need Docker running on Linux and be familiar with the key Docker concepts, and with Docker volumes:\n\n- [Docker concepts](https://docs.docker.com/engine/understanding-docker/)\n- [Docker volumes](https://docs.docker.com/engine/tutorials/dockervolumes/)\n\n## The Lab\n\n- [Part 1 - Running a Registry Container](part-1.md)\n- [Part 2 - Running a Secured Registry Container](part-2.md)\n- [Part 3 - Using Basic Authentication with a Secured Registry](part-3.md)\n"
  },
  {
    "path": "Docker/registry/part-1.md",
    "content": "# Part 1 - Running a Registry Container in Linux\n\nThere are several ways to run a registry container. The simplest is to run an insecure registry over HTTP, but for that we need to configure Docker to explicitly allow insecure access to the registry. \n\nDocker expects all registries to run on HTTPS. The next section of this lab will introduce a secure version of our registry container, but for this part of the tutorial we will run a version on HTTP. When registering a image, Docker returns an error message like this:\n```\nhttp: server gave HTTP response to HTTPS client\n```\nThe Docker Engine needs to be explicitly setup to use HTTP for the insecure registry. Edit or create `/etc/docker/docker` file: \n```\n$ sudo vi /etc/docker/docker\n\n# add this line\nDOCKER_OPTS=\"--insecure-registry localhost:5000\"\n```\nClose and save the file, then restart the docker daemon.\n```\n$ sudo service docker restart\n```\nIn Docker for Mac, the `Preferences` menu lets you set the address for an insecure registry under the `Daemon` panel:\n![MacOS menu](images/docker_osx_insecure_registry.png)\n\nIn Docker for Windows, the `Settings` menu lets you set the address for an insecure registry under the `Daemon` panel:\n![MacOS menu](images/docker_windows_insecure_registry.png)\n## Testing the Registry Image\nFirst we'll test that the registry image is working correctly, by running it without any special configuration:\n```\n$ sudo docker run -d -p 5000:5000 --name registry registry:2\n```\n## Understanding Image Names\nTypically we work with images from the Docker Store, which is the default registry for the Docker Engine. Commands using just the image repository name work fine, like this:\n```\n$ sudo docker pull hello-world\n```\n`hello-world` is the repository name, which we are using as a short form of the full image name. The full name is `docker.io/hello-world:latest`. That breaks down into three parts:\n\n- `docker.io` - the hostname of the registry which stores the image;\n- `hello-world` - the repository name, in this case in `{imageName}` format;\n- `latest` - the image tag.\n\nIf a tag isn't specified, then the default `latest` is used. If a registry hostname isn't specified then the default `docker.io` for Docker Store is used. If you want to use images with any other registry, you need to explicitly specify the hostname - the default is always Docker Store, you can't change to a different default registry.\n\nWith a local registry, the hostname and the custom port used by the registry is the full registry address, e.g. `localhost:5000`. \n```\n$ hostname\n```\n\n## Pushing and Pulling from the Local Registry\n\nDocker uses the hostname from the full image name to determine which registry to use. We can build images and include the local registry hostname in the image tag, or use the `docker tag` command to add a new tag to an existing image.\n\nThese commands pull a public image from Docker Store, tag it for use in the private registry with the full name `localhost:5000/hello-world`, and then push it to the registry:\n\n```\n$ sudo docker tag hello-world localhost:5000/hello-world\n$ sudo docker push localhost:5000/hello-world\n```\n\nWhen you push the image to your local registry, you'll see similar output to when you push a public image to the Hub:\n\n```\nThe push refers to a repository [localhost:5000/hello-world]\na55ad2cda2bf: Pushed\ncfbe7916c207: Pushed\nfe4c16cbf7a4: Pushed\nlatest: digest: sha256:79e028398829da5ce98799e733bf04ac2ee39979b238e4b358e321ec549da5d6 size: 948\n```\nOn the local machine, you can remove the new image tag and the original image, and pull it again from the local registry to verify it was correctly stored:\n```\n$ sudo docker rmi localhost:5000/hello-world\n$ sudo docker rmi hello-world\n$ sudo docker pull localhost:5000/hello-world\n```\nThat exercise shows the registry works correctly, but at the moment it's not very useful because all the image data is stored in the container's writable storage area, which will be lost when the container is removed. To store the data outside of the container, we need to mount a host directory when we start the container.\n\n## Running a Registry Container with External Storage\nRemove the existing registry container by removing the container which holds the storage layer. Any images pushed will be deleted:\n```\n$  sudo docker kill registry\n$  sudo docker rm registry\n```\nIn this example, the new container will use a host-mounted Docker volume. When the registry server in the container writes image layer data, it appears to be writing to a local directory in the container but it will be writing to a directory on the host.\n\nCreate the registry:\n```\n$ mkdir registry-data\n$  sudo docker run -d -p 5000:5000 \\ \n--name registry \\\n-v `pwd`/registry-data:/var/lib/registry \\ \nregistry:2\n```\nTag and push the container with the new IP address of the registry.\n```\ndocker tag hello-world localhost:5000/hello-world\ndocker push localhost:5000/hello-world\n```\nRepeating the previous `docker push` command uploads an image to the registry container, and the layers will be stored in the container's `/var/lib/registry` directory, which is actually mapped to the `$(pwd)/registry-data` directory on you local machine. The `tree` command will show the directory structure the registry server uses:\n\n```\n$ tree registry-data\n.\n|____docker\n| |____registry\n| | |____v2\n| | | |____blobs\n| | | | |____sha256\n| | | | | |____1f\n| | | | | | |____1fad42e8a0d9781677d366b1100defcadbe653280300cf62a23e07eb5e9d3a41\n\n...\n```\nStoring data outside of the container means we can build a new version of the registry image and replace the old container with a new one using the same host mapping - so the new registry container has all the images stored by the previous container.\n\nUsing an insecure registry also isn't practical in multi-user scenarios. Effectively there's no security so anyone can push and pull images if they know the registry hostname. The registry server supports authentication, but only over a secure SSL connection. We'll run a secure version of the registry server in a container next.\n\n## Next\n\n- [Part 2 - Running a Secured Registry Container](part-2.md)"
  },
  {
    "path": "Docker/registry/part-2.md",
    "content": "# Part 2 - Running a Secured Registry Container in Linux\n\nWe saw how to run a simple registry container in [Part 1](part-1.md), using the official Docker registry image. The registry server con be configured to serve HTTPS traffic on a known domain, so it's straightforward to run a secure registry for private use with a self-signed SSL certificate.\n\n## Generating the SSL Certificate in Linux\n\nThe Docker docs explain how to [generate a self-signed certificate](https://docs.docker.com/registry/insecure/#/using-self-signed-certificates) on Linux using OpenSSL:\n\n```\n$ mkdir -p certs \n$ openssl req \\ \n  -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \\  \n  -x509 -days 365 -out certs/domain.crt\nGenerating a 4096 bit RSA private key\n........++\n............................................................++\nwriting new private key to 'certs/domain.key'\n-----\nYou are about to be asked to enter information that will be incorporated\ninto your certificate request.\nWhat you are about to enter is what is called a Distinguished Name or a DN.\nThere are quite a few fields but you can leave some blank\nFor some fields there will be a default value,\nIf you enter '.', the field will be left blank.\n-----\nCountry Name (2 letter code) [AU]:US\nState or Province Name (full name) [Some-State]:\nLocality Name (eg, city) []:\nOrganization Name (eg, company) [Internet Widgits Pty Ltd]:Docker\nOrganizational Unit Name (eg, section) []:\nCommon Name (e.g. server FQDN or YOUR name) []:localhost\nEmail Address []:\n```\nIf you are running the registry locally, be sure to use your host name as the CN. \n\nTo get the docker daemon to trust the certificate, copy the domain.crt file.\n```\n$ sudo su\n$ mkdir /etc/docker/certs.d\n$ mkdir /etc/docker/certs.d/<localhost>:5000 \n$ cp `pwd`/certs/domain.crt /etc/docker/certs.d/<localhost>:5000/ca.crt\n```\nMake sure to restart the docker daemon.\n```\n$ sudo service docker restart\n```\nNow we have an SSL certificate and can run a secure registry.\n\n## Running the Registry Securely\n\nThe registry server supports several configuration switches as environment variables, including the details for running securely. We can use the same image we've already used, but configured for HTTPS. \n\nIf you have an insecure registry container still running from [Part 2](part-2.md), remove it:\n\n```\n$ docker kill registry\n$ docker rm registry\n```\n\nFor the secure registry, we need to run a container which has the SSL certificate and key files available, which we'll do with an additional volume mount (so we have one volume for registry data, and one for certs). We also need to specify the location of the certificate files, which we'll do with environment variables:\n\n```\n$ mkdir registry-data\n$ docker run -d -p 5000:5000 --name registry \\\n  --restart unless-stopped \\\n  -v $(pwd)/registry-data:/var/lib/registry -v $(pwd)/certs:/certs \\\n  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \\\n  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \\\n  registry\n```\n\nThe new parts to this command are:\n\n- `--restart unless-stopped` - restart the container when it exits, unless it has been explicitly stopped. When the host restarts, Docker will start the registry container, so it's always available.\n- `-v $pwd\\certs:c:\\certs` - mount the local `certs` folder into the container, so the registry server can access the certificate and key files;\n- `-e REGISTRY_HTTP_TLS_CERTIFICATE` - specify the location of the SSL certificate file;\n- `-e REGISTRY_HTTP_TLS_KEY` - specify the location of the SSL key file.\n\nWe'll let Docker assign a random IP address to this container, because we'll be accessing it by host name. The registry is running securely now, but we've used a self-signed certificate for an internal domain name.\n\n## Accessing the Secure Registry\n\nWe're ready to push an image into our secure registry. \n```\n$ docker push localhost:5000/hello-world\n$ docker pull localhost:5000/hello-world\n```\nWe can go one step further with the open-source registry server, and add basic authentication - so we can require users to securely log in to push and pull images.\n\n## Next\n\n- [Part 3 - Using Basic Authentication with a Secured Registry](part-3.md)"
  },
  {
    "path": "Docker/registry/part-3.md",
    "content": "# Part 3 - Using Basic Authentication with a Secured Registry in Linux\n\nFrom [Part 2](part-2.md) we have a registry running in a Docker container, which we can securely access over HTTPS from any machine in our network. We used a self-signed certificate, which has security implications, but you could buy an SSL from a CA instead, and use that for your registry. With secure communication in place, we can set up user authentication.\n\n## Usernames and Passwords\n\nThe registry server and the Docker client support [basic authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) over HTTPS. The server uses a file with a collection of usernames and encrypted passwords. The file uses Apache's htpasswd.\n\nCreate the password file with an entry for user \"moby\" with password \"gordon\";\n```\n$ mkdir auth\n$ sudo docker run --entrypoint htpasswd registry:latest -Bbn moby gordon > auth/htpasswd\n```\nThe options are:\n\n- --entrypoint Overwrite the default ENTRYPOINT of the image\n<<<<<<< HEAD\n- -B to force bcrypt vs default md5\n=======\n- -B Use bcrypt encryption (required)\n>>>>>>> master\n- -b run in batch mode \n- -n display results\n\nWe can verify the entries have been written by checking the file contents - which shows the user names in plain text and a cipher text password:\n\n```\n$ cat auth/htpasswd\nmoby:$2y$05$Geu2Z4LN0QDpUJBHvP5JVOsKOLH/XPoJBqISv1D8Aeh6LVGvjWWVC\n```\n\n## Running an Authenticated Secure Registry\n\nAdding authentication to the registry is a similar process to adding SSL - we need to run the registry with access to the `htpasswd` file on the host, and configure authentication using environment variables.\n\nAs before, we'll remove the existing container and run a new one with authentication configured:\n\n```\n$ sudo docker kill registry\n$ sudo docker rm registry\n$ sudo docker run -d -p 5000:5000 --name registry \\\n  --restart unless-stopped \\\n  -v $(pwd)/registry-data:/var/lib/registry \\\n  -v $(pwd)/certs:/certs \\\n  -v $(pwd)/auth:/auth \\\n  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \\\n  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \\\n  -e REGISTRY_AUTH=htpasswd \\\n  -e \"REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm\" \\\n  -e \"REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd\" \\\n  registry\n```\n\nThe options for this container are:\n\n- `-v $(pwd)/auth:/auth` - mount the local `auth` folder into the container, so the registry server can access `htpasswd` file;\n- `-e REGISTRY_AUTH=htpasswd` - use the registry's `htpasswd` authentication method;\n- `-e REGISTRY_AUTH_HTPASSWD_REALM='Registry Realm'` - specify the authentication realm;\n- `-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd` - specify the location of the `htpasswd` file.\n\nNow the registry is using secure transport and user authentication.\n\n## Authenticating with the Registry\n\nWith basic authentication, users cannot push or pull from the registry unless they are authenticated. If you try and pull an image without authenticating, you will get an error:\n\n```\n$ sudo docker pull localhost:5000/hello-world\nUsing default tag: latest\nError response from daemon: Get https://localhost:5000/v2/hello-world/manifests/latest: no basic auth credentials\n```\n\nThe result is the same for valid and invalid image names, so you can't even check a repository exists without authenticating. Logging in to the registry is the same `docker login` command you use for Docker Store, specifying the registry hostname:\n\n```\n$ sudo docker login registry.local:5000\nUsername: moby\nPassword:\nLogin Succeeded\n```\n\nIf you use the wrong password or a username that doesn't exist, you get a `401` error message:\n\n```\nError response from daemon: login attempt to https://registry.local:5000/v2/ failed with status: 401 Unauthorized\n```\n\nNow you're authenticated, you can push and pull as before:\n\n```\n$ sudo docker pull localhost:5000/hello-world\nUsing default tag: latest\nlatest: Pulling from hello-world\nDigest: sha256:961497c5ca49dc217a6275d4d64b5e4681dd3b2712d94974b8ce4762675720b4\nStatus: Image is up to date for registry.local:5000/hello-world:latest\n```\n\n> Note. The open-source registry does not support the same authorization model as Docker Store or Docker Trusted Registry. Once you are logged in to the registry, you can push and pull from any repository, there is no restriction to limit specific users to specific repositories.\n\n## Using Docker Compose to Start the Registry\nTyping in all the options to start the registry can become tedious. An easier and simpler way is to use [Docker Compose](https://docs.docker.com/compose/). Here's an example of a `docker-compose.yml` file that will start the registry.\n```\nregistry:\n  restart: always\n  image: registry:2\n  ports:\n    - 5000:5000\n  environment:\n    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt\n    REGISTRY_HTTP_TLS_KEY: /certs/domain.key\n    REGISTRY_AUTH: htpasswd\n    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd\n    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm\n  volumes:\n    - /path/registry-data:/var/lib/registry\n    - /path/certs:/certs\n    - /path/auth:/auth\n```\n\nTo start the registry, type:\n```\n$ sudo docker-compose up\n```\n\n\n## Conclusion\n\n[Docker Registry](https://docs.docker.com/registry/) is a free, open-source application for storing and accessing Docker images. You can run the registry in a container on your own network, or in a virtual network in the cloud, to host private images with secure access. For Linux hosts, there is an [official registry image](https://store.docker.com/images/registry) on Docker Store.\n\nWe've covered all the options, from running an insecure registry, through adding SSL to encrypt traffic, and finally adding basic authentication to restrict access. By now you know how to set up a usable registry in your own environment, and you've also used some key Docker patterns - using containers as build agents and to run basic commands, without having to install software on your host machines. \n\nThere is still more you can do with Docker Registry - using a different [storage driver](https://docs.docker.com/registry/storage-drivers/) so the image data is saved to reliable share storage, and setting up your registry as a [caching proxy for Docker Store](https://docs.docker.com/registry/recipes/mirror/) are good next steps.\n"
  },
  {
    "path": "Docker/security/README.md",
    "content": "# Docker Security\n\nThis directory contains tutorials on how to take advantage of a non-exhaustive collection of Docker security features. Moreover, the tutorials are designed to explain and demonstrate the strong security defaults in Docker for each feature.\n\n## Docker\n* [Content Trust](trust/README.md)\n* [Content Trust Basics](trust-basics/README.md)\n* [Secrets Management](secrets/README.md)\n* [Secrets Management with Docker Datacenter](secrets-ddc/README.md)\n* [Secure Networking Basics](networking/README.md)\n* [Security Scanning](scanning/README.md)\n* [Swarm Mode Security Basics](swarm/README.md)\n\n## Linux\n* [AppArmor](apparmor/README.md)\n* [Capabilities](capabilities/README.md)\n* [Control Groups](cgroups/README.md)\n* [Seccomp](seccomp/README.md)\n* [User Namespaces](userns/README.md)\n"
  },
  {
    "path": "Docker/security/apparmor/README.md",
    "content": "# Lab: AppArmor\n\n> **Difficulty**: Advanced\n\n> **Time**: Approximately 25 minutes\n\nAppArmor (Application Armor) is a Linux Security Module (LSM). It protects the operating system by applying profiles to individual applications or containers. In contrast to managing *capabilities* with `CAP_DROP` and syscalls with *seccomp*, AppArmor allows for much finer-grained control. For example, AppArmor can restrict file operations on specified paths.\n\nIn this lab you will learn the basics of AppArmor and how to use it with Docker for improved security.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - AppArmor primer](#primer)\n- [Step 2 - The `default-docker` AppArmor profile](#default-docker)\n- [Step 3 - Running a Container without an AppArmor profile](#no-profile)\n- [Step 4 - AppArmor and defense in depth](#depth)\n- [Step 5 - Custom AppArmor profile](#custom)\n- [Step 6 - Extra for experts](#extra)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker Host with AppArmor enabled in the kernel (most Debian-based distros)\n- Docker 1.12 or higher\n\nThe following command shows you how to check if AppArmor is enabled in your system's kernel and available to Docker:\n\n   Check from Docker 1.12 or higher\n   ```\n   $ docker info | grep apparmor\n   Security Options: apparmor seccomp   \n   ```\n   If the above output does not return a line with `apparmor` then your system does not have AppArmor enabled in its kernel.\n\n\n# <a name=\"primer\"></a>Step 1: AppArmor primer\n\nBy default, Docker applies the `docker-default` AppArmor profile to new **containers**. In Docker 1.13 and later this is profile is created in `tmpfs` and then loaded into the kernel. On Docker 1.12 and earlier it is located in `/etc/apparmor.d/docker/`. You can find more information about it in the [documentation](https://docs.docker.com/engine/security/apparmor/#understand-the-policies).  \n\nHere are some quick pointers for how to understand AppArmor profiles:\n\n  - `include` statements, such as `#include <abstractions/base>`, behave just like their `C` counterparts by expanding to additional AppArmor profile contents.\n\n  - AppArmor `deny` rules have precedence over `allow` and `owner` rules. This means that `deny` rules cannot be overridden by subsequent `allow` or `owner` rules for the same resource. Moreover, an `allow` will be overridden by a subsequent `deny` on the same resource\n\n  - For file operations, `r` corresponds to read, `w` to write, `k` to lock, `l` to link, and `x` to execute.\n\nFor more information, see the [official AppArmor documentation wiki](http://wiki.apparmor.net/index.php/Documentation) (under active development at this time).\n\n# <a name=\"default-docker\"></a>Step 2: The `default-docker` AppArmor profile\n\nIn this step you will check the status of AppArmor on your Docker Host and learn how to identify whether or not Docker containers are running with an AppArmor profile.\n\n1.  View the status of AppArmor on your Docker Host with the `apparmor_status` command. You may need to preceed the command with `sudo`.\n\n   ```\n   $ apparmor_status\n   apparmor module is loaded.\n   10 profiles are loaded.\n   10 profiles are in enforce mode.\n      /sbin/dhclient\n      /usr/bin/lxc-start\n      /usr/lib/NetworkManager/nm-dhcp-client.action\n      /usr/lib/NetworkManager/nm-dhcp-helper\n      /usr/lib/connman/scripts/dhclient-script\n      /usr/sbin/tcpdump\n      docker-default\n      lxc-container-default\n      lxc-container-default-with-mounting\n      lxc-container-default-with-nesting\n   0 profiles are in complain mode.\n   2 processes have profiles defined.\n   2 processes are in enforce mode.\n      /sbin/dhclient (610)\n   0 processes are in complain mode.\n   0 processes are unconfined but have a profile defined.\n   ```\n\n   Notice the `docker-default` profile is in enforce mode. This is the AppArmor profile that will be applied to new containers unless overridden with the `--security-opts` flag.\n\n2.  Run a new container and put it in the back ground.\n\n   ```\n   $ docker container run -dit --name apparmor1 alpine sh\n   ```\n\n3. Confirm that the container is running.\n\n   ```\n   $ docker container ls\n   CONTAINER ID    IMAGE     COMMAND      CREATED     STATUS        PORTS  NAMES\n   1bb16561bc06    alpine    \"sh\"         2 secs ago  Up 2 seconds         apparmor1\n   ```\n\n4. Run the `apparmor_status` command again.\n\n   ```\n   $ apparmor_status\n   apparmor module is loaded.\n   10 profiles are loaded.\n   10 profiles are in enforce mode.\n      /sbin/dhclient\n      docker-default\n      <SNIP>\n   0 profiles are in complain mode.\n   3 processes have profiles defined.\n   3 processes are in enforce mode.\n      /sbin/dhclient (610)\n      docker-default (19810)\n   0 processes are in complain mode.\n   0 processes are unconfined but have a profile defined.\n   ```\n\n   Notice that `docker-default` is now also listed under **processes are in enforcing mode.** The value in parenthesis is the PID of the container's process as seen from the PID namespace of the Docker Host. If you have multiple containers running you will see multiple `docker-default` policies listed under **processes in enforcing mode**.\n\n    Profiles in *enforce mode* will actively deny operations based on the AppArmor profile. Profiles in *complain mode* will log profile violations but will not block functionality.\n\n5. Stop and remove the container started in the previous steps.\n\n   ```\n   $ docker container rm -f apparmor1\n   1bb16561bc06\n   ```\n\nIn this step you learned how to check the AppArmor status on your Docker Host and how to check if a container is running with the `default-docker` AppArmor profile.\n\n# <a name=\"no-profile\"></a>Step 3: Running a container without an AppArmor profile\n\nIn this step you will see how to run a new container without an AppArmor profile.\n\n1. If you haven't already done so, stop and remove all containers on your system.\n\n   ```\n   $ docker container rm -f $(docker container ls -aq)\n   ```\n\n2. Use the `--security-opt apparmor=unconfined` flag to start a new container in the background without an AppArmor profile.\n\n   ```\n   $ docker container run -dit --name apparmor2 \\\n     --security-opt apparmor=unconfined \\\n     alpine sh\n   ace79581a19a....559bd1178fce431e292277d\n   ```\n\n3. Confirm that the container is running.\n\n   ```\n   $ docker container ls\n   CONTAINER ID   IMAGE     COMMAND   CREATED       STATUS         PORTS    NAMES\n   ace79581a19a   alpine    \"sh\"      41 secs ago   Up 40 secs              apparmor2\n   ```\n\n4. Use the `apparmor_status` command to verify that the new container is not running with an AppArmor profile.\n\n   ```\n   $ apparmor_status\n   apparmor module is loaded.\n   <SNIP>\n      1 processes are in enforce mode.\n      /sbin/dhclient (610)\n   0 processes are in complain mode.\n   0 processes are unconfined but have a profile defined.\n   ```\n\n   Notice that there are no instances of the `docker-default` AppArmor profile loaded under the **processes in enforce mode** section. This means that the container you just started does not have the `docker-default` AppArmor profile attached to it.\n\n5. Stop and remove the container started in the previous steps.\n\n   ```\n   $ docker container rm -f apparmor2\n   ace79581a19a\n   ```\n\nIn this step you learned that the `--security-opt apparmor=unconfined` flag will start a new container without an AppArmor profile.\n\n# <a name=\"depth\"></a>Step 4: AppArmor and defense in depth\n\nDefense in depth is a model where multiple different lines of defense work together to provide increased overall defensive capabilities. Docker uses many Linux technologies, such as AppArmor, seccomp, and Capabilities, to form a deep defense system.\n\nIn this step you will see how AppArmor can protect a Docker Host even when other lines of defense such as seccomp and Capabilities are not effective.\n\n1. If you haven't already done so, stop and remove all containers on your system.\n\n   ```\n   $ docker container rm -f $(docker container ls -aq)\n   ```\n\n2. Start a new Ubuntu container with seccomp disabled and the `SYS_ADMIN` *capability* added.\n\n   ```\n   $ docker container run --rm -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu sh\n   #\n   ```\n\n   This command will start a new container with the `default-docker` AppArmor profile automatically attached. seccomp will be disabled and the CAP_SYS_ADMIN capability added. This means that AppArmor will be the only effective line of defense for this container.\n\n3. Make two new directories and bind mount them as shown below.\n\n   Run this command from within the container you just created.\n\n   ```\n   # mkdir 1; mkdir 2; mount --bind 1 2\n   mount: mount /1 on /2 failed: Permission denied\n   ```\n\n   The operation failed because the `default-docker` AppArmor profile denied the operation.\n\n4. Exit the container using the `exit` command.\n\n5. Confirm that it was the `default-docker` AppArmor profile that denied the operation by starting a new container without an AppArmor profile and retrying the same operation.\n\n   ```\n   $ docker container run --rm -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu sh\n\n   # mkdir 1; mkdir 2; mount --bind 1 2\n   # ls -l\n   total 456\n   drwxr-xr-x   2 root root   4096 Jul 26 11:44 1\n   drwxr-xr-x   2 root root   4096 Jul 26 11:44 2\n   drwxr-xr-x   2 root root   4096 Jul  6 23:15 bin\n   drwxr-xr-x   2 root root   4096 Apr 12 20:14 boot\n   <SNIP>\n   ```\n\n   The operation succeeded this time. This proves that it was the `default-docker` AppArmor profile that prevented the operation in the previous attempt.\n\n6. Exit the container with the `exit` command.\n\nIn this step you have seen how AppArmor works together with seccomp and Capabilities to form a defense in depth security model for Docker. You saw a scenario where even with seccomp and Capabilities not preventing an action, AppArmor still prevented it.\n\n# <a name=\"custom\"></a>Step 5: Custom AppArmor profile\n\nThe [Panama Papers hack](https://en.wikipedia.org/wiki/Panama_Papers) exposed millions of documents from Mossack Fonseca, a Panamanian law firm.  \n\nA probable cause, as described by [Wordfence](https://www.wordfence.com/blog/2016/04/mossack-fonseca-breach-vulnerable-slider-revolution/) and other reports, was an unpatched WordPress plugin. In particular, it has been suggested that the Revolution Slider plugin contained buggy code that allowed another plugin to take its place by making an [unauthenticated AJAX call to the plugin](https://www.wordfence.com/wp-content/uploads/2016/04/Screen-Shot-2016-04-07-at-10.31.37-AM.png).\n\nWordPress and its plugins run as PHP. This means an attacker could upload their own malicious plugin to start a shell on WordPress by simply sending a request to the PHP resource to run the malicious code and spin up the shell.\n\nIn this step we'll show how a custom AppArmor profile could have protected Dockerized WordPress from this attack vector.\n\n1.  If you have not already, clone the lab and `cd` into the lab's `wordpress` directory.\n\n   ```\n   $ git clone https://github.com/docker/labs.git\n   $ cd labs/security/apparmor/wordpress\n   ```\n\n2.  List the files in the directory.\n\n   ```\n   $ ls -l\n   total 24\n   -rw-r--r-- 1 root root  628 Jul 11 10:47 docker-compose.yml\n   -rw-r--r-- 1 root root  443 Jul 11 10:47 Dockerfile\n   drwxr-xr-x 5 root root 4096 Jul 11 10:47 html\n   -rw-r--r-- 1 root root  172 Jul 11 10:47 php.ini\n   -rw-r--r-- 1 root root 1697 Jul 11 10:47 wparmor\n   drwxr-xr-x 6 root root 4096 Jul 11 10:47 zues\n   ```\n\n3. View the contents of the Docker Compose YAML file.\n\n   ```\n   $ cat docker-compose.yml\n   wordpress:\n    image: endophage/wordpress:lean\n    links:\n        - mysql\n    ports:\n        - \"8080:80\"\n    environment:\n        - DB_PASSWORD=2671d40f658f595f49cd585db8e522cc955d916ee92b67002adcf8127196e6b2\n    cpuset: \"0\"\n    cap_drop:\n        - ALL\n    cap_add:\n        - SETUID\n        - SETGID\n        - DAC_OVERRIDE\n        - NET_BIND_SERVICE\n    # **YOUR WORK HERE**\n    # Add an apparmor profile to this image\n   mysql:\n    image: mariadb:10.1.10\n    environment:\n        - MYSQL_DATABASE=wordpress\n        - MYSQL_ROOT_PASSWORD=2671d40f658f595f49cd585db8e522cc955d916ee92b67002adcf8127196e6b2\n    ports:\n        - \"3306\"\n   ```\n\n   You can see that the file is describing a WordPress application with two services:\n    - **wordpress:** a wordpress container that wraps Apache PHP\n    - **mysql:** a database to store data  \n\n4. Bring the application up.\n\n   It may take a minute or two to bring the application up. Once the application is up you will need to hit the <Return> key to bring the prompt to the foreground.\n\n   You may need to install `docker-compose` to complete this step. If your lab machine does not already have Docker Compose isntalled, you can install it with the following commands `sudo apt-get update` and `sudo apt-get install docker-compose`.\n\n   ```\n   $ docker-compose up &\n   Pulling mysql (mariadb:10.1.10)...\n   10.1.10: Pulling from library/mariadb\n   03e1855d4f31: Pull complete\n   a3ed95caeb02: Pull complete\n   <SNIP>\n   mysql_1      | Version: '10.1.10-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution\n   wordpress_1  | [Tue Jul 26 12:51:36.992860 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.18 configured -- resuming normal operations\n   wordpress_1  | [Tue Jul 26 12:51:36.992956 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'\n   ```\n\n5.  Point your browser to the public IP of your lab instance on port 8080.\n\n   You should have received the IP addresses of all of your lab instances from the lab administrator).\n\n   ![](http://i.imgur.com/13Pf7Zm.png)\n\n6. Select your language, click **Continue** and complete the information required on the Welcome page. Make sure you remember the username and password you choose.\n\n7. Login with the username and password you created.\n\n8. Click **Plugins** from the left-hand navigation pane and install a plugin.\n\n   You should notice that the `docker-default` AppArmor prfile does not restrict the plugin installation.\n   We could be exposed to malicious plugins like in the Panama Papers incident!\n\nIn the next few steps you'll apply a new Apparmor profile to a new WordPress container. The purpose of this is to prevent malicious themes and plugins from being uploaded and installed on our WordPress instance.\n\n9. Bring the WordPress application down.\n\n   Run these commands from the shell of your Docker Host, not the shell of the `wordpress` container.\n\n   ```\n   $ docker-compose stop\n   Stopping wordpress_wordpress_1 ... done\n   Stopping wordpress_mysql_1 ... done\n   $\n   $ docker-compose rm\n   Going to remove wordpress_wordpress_1, wordpress_mysql_1\n   Are you sure? [yN] y\n   Removing wordpress_wordpress_1 ... done\n   Removing wordpress_mysql_1 ... done\n   ```\n\n10. Add the `wparmor` profile to the `wordpress` service in the `docker-compose.yml` file. You do this by deleting the two lines starting with `#` and replacing them with the following two lines:\n\n   ```\n   security_opt:\n       - apparmor=wparmor\n   ```\n\n   Be sure to add the lines with the correct indentation as shown below.\n\n   ```\n   wordpress:\n    image: endophage/wordpress:lean\n    links:\n        - mysql\n    <SNIP>\n    security_opt:\n        - apparmor=wparmor\n   mysql:\n    image: mariadb:10.1.10\n    environment:\n        - MYSQL_DATABASE=wordpress\n        - MYSQL_ROOT_PASSWORD=2671d40f658f595f49cd585db8e522cc955d916ee92b67002adcf8127196e6b2\n    ports:\n        - \"3306\"\n   ```\n\n   If you look closely at the output above, you will see that two new lines have been added above the start of the `mysql` service definition -\n\n   **security_opt:**\n       - **apparmor=wparmor**\n\n11. Edit the `wparmor` profile to deny every directory under `/var/www/html/wp-content` except for the `uploads` directory (which is used for media).\n\n   To do this, add the following three lines towards the bottom of the file where it says \"**YOUR WORK HERE**\".\n\n   ```\n   deny /var/www/html/wp-content/plugins/** wlx,\n   deny /var/www/html/wp-content/themes/** wlx,\n   owner /var/www.html/wp-content/uploads/** rw,\n   ```\n\n   The `*` wildcard is only for files at a single level. The `**` wildcard will traverse subdirectories.\n\n12. Parse the `wparmor` profile.\n\n   ```\n   $ sudo apparmor_parser wparmor\n   ```\n\n13. Bring the Docker Compose WordPress app back up.\n\n   ```\n   $ docker-compose up &\n   Pulling mysql (mariadb:10.1.10)...\n   10.1.10: Pulling from library/mariadb\n   03e1855d4f31: Pull complete\n   a3ed95caeb02: Pull complete\n   <SNIP>\n   mysql_1      | Version: '10.1.10-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution\n   wordpress_1  | [Tue Jul 26 12:51:36.992860 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.18 configured -- resuming normal operations\n   wordpress_1  | [Tue Jul 26 12:51:36.992956 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'\n   ```\n\n14. Verify that the app is up.\n\n   ```\n   $ docker-compose ps\n   Name                      Command              State            Ports\n   --------------------------------------------------------------------------------------\n   wordpress_mysql_1       /docker-entrypoint.sh mysqld   Up      0.0.0.0:32770->3306/tcp\n   wordpress_wordpress_1   apache2-foreground             Up      0.0.0.0:8080->80/tcp\n   ```\n\n15. Test that the AppArmor profile is working by uploading an image to the site via the WordPress UI and then trying to upload a plugin. The image upload will work but the plugin upload will fail (when the usual method for uploading plugins fails, WordPress prompts you to upload via FTP - this is a sign that the AppArmor profile has worked).\n\n16. Bring the application down.\n\n   ```\n   $ docker-compose stop\n   Stopping wordpress_wordpress_1 ... done\n   Stopping wordpress_mysql_1 ... done\n   $\n   $ docker-compose rm\n   Going to remove wordpress_wordpress_1, wordpress_mysql_1\n   Are you sure? [yN] y\n   Removing wordpress_wordpress_1 ... done\n   Removing wordpress_mysql_1 ... done\n   ```\n\nCongratulations!  You've secured a WordPress instance against adding malicious plugins :)\n\n# <a name=\"extra\"></a>Step 5: Extra for experts\n\nAppArmor profiles are very application-specific. Although we've had some practice writing our own profiles, the preferred method is using tools to generate and debug them. In this step We'll explore `aa-complain` and `aa-genprof` that ship as part of the `apparmor-utils` package.\n\nThe following steps assume you are using a modern Ubuntu Linux Docker Host with a GUI installed and the FireFox web browser.\n\n1.  Install the `apparmor-utils` package.\n\n    ```\n    $ sudo apt install apparmor-utils -y\n    ```\n\n2.  Start `aa-genprof` to automatically generate a new AppArmor profile for the FireFox app.\n\n   ```\n   $ sudo aa-genprof firefox\n   ```\n\n\tYour terminal will go into interactive mode. This is AppArmor watching the Firefox app.\n\n3. Open Firefox and perform normal web browsing activities such as browsing websites and downloading content.\n\n4. Go back to the terminal running `aa-genprof` and press `s` to view events from the system log and decide whether or not to include these events in your AppArmor profile as an allow or deny statement.  \n\n5. When you're done, press `f` to finish.\n\n   The AppArmor profile will be called `usr.bin.firefox` and will be stored in `/etc/apparmor.d/` on Ubuntu systems.\n\n   You can also use `aa-autodep` to automatically generate profiles, but this will create an even more minimal profile.\n\nTo further refine an existing profile, `aa-logprof` operates in the same manner as `aa-genprof` but for amending a profile by scanning logs.\n\nYou can debug AppArmor profiles with `aa-complain`. As described earlier, AppArmor has a \"complain\" mode that logs disallowed events instead of actively blocking them. This is a great tool for testing and debugging.\n\nType the following command to view the Firefox profile - `sudo aa-complain /etc/apparmor.d/usr.bin.firefox`. Confirm that this set the Firefox policy to complain mode by running `apparmor_status`.  \n\nTo view any complaints from apparmor, run `dmesg`.\n\nCongratulations you have completed this lab on AppArmor!\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/Dockerfile",
    "content": "FROM php:5.6-apache\n\nRUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \\\n\t&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \\\n\t&& docker-php-ext-install gd mysqli opcache \n\nCOPY ./html /var/www/html\nCOPY ./zues /var/www/html/wp-content/themes/zues\nCOPY ./php.ini /usr/local/etc/php/\n\nRUN mkdir /var/www/html/wp-content/uploads\n\nRUN chown -R www-data:www-data /var/www/html\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/docker-compose.yml",
    "content": "wordpress:\n    image: endophage/wordpress:lean\n    links:\n        - mysql\n    ports:\n        - \"8080:80\"\n    environment:\n        - DB_PASSWORD=2671d40f658f595f49cd585db8e522cc955d916ee92b67002adcf8127196e6b2\n    cpuset: \"0\"\n    cap_drop:\n        - ALL\n    cap_add:\n        - SETUID\n        - SETGID\n        - DAC_OVERRIDE\n        - NET_BIND_SERVICE\n    # **YOUR WORK HERE**\n    # Add an apparmor profile to this image\nmysql:\n    image: mariadb:10.1.10\n    environment:\n        - MYSQL_DATABASE=wordpress\n        - MYSQL_ROOT_PASSWORD=2671d40f658f595f49cd585db8e522cc955d916ee92b67002adcf8127196e6b2\n    ports:\n        - \"3306\"\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/index.php",
    "content": "<?php\n/**\n * Front to the WordPress application. This file doesn't do anything, but loads\n * wp-blog-header.php which does and tells WordPress to load the theme.\n *\n * @package WordPress\n */\n\n/**\n * Tells WordPress to load the WordPress theme and output it.\n *\n * @var bool\n */\ndefine('WP_USE_THEMES', true);\n\n/** Loads the WordPress Environment and Template */\nrequire( dirname( __FILE__ ) . '/wp-blog-header.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/license.txt",
    "content": "WordPress - Web publishing software\r\n\r\nCopyright 2016 by the contributors\r\n\r\nThis program is free software; you can redistribute it and/or modify\r\nit under the terms of the GNU General Public License as published by\r\nthe Free Software Foundation; either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with this program; if not, write to the Free Software\r\nFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r\n\r\nThis program incorporates work covered by the following copyright and\r\npermission notices:\r\n\r\n  b2 is (c) 2001, 2002 Michel Valdrighi - m@tidakada.com -\r\n  http://tidakada.com\r\n\r\n  Wherever third party code has been used, credit has been given in the code's\r\n  comments.\r\n\r\n  b2 is released under the GPL\r\n\r\nand\r\n\r\n  WordPress - Web publishing software\r\n\r\n  Copyright 2003-2010 by the contributors\r\n\r\n  WordPress is released under the GPL\r\n\r\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r\n\r\n                    GNU GENERAL PUBLIC LICENSE\r\n                       Version 2, June 1991\r\n\r\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\r\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r\n Everyone is permitted to copy and distribute verbatim copies\r\n of this license document, but changing it is not allowed.\r\n\r\n                            Preamble\r\n\r\n  The licenses for most software are designed to take away your\r\nfreedom to share and change it.  By contrast, the GNU General Public\r\nLicense is intended to guarantee your freedom to share and change free\r\nsoftware--to make sure the software is free for all its users.  This\r\nGeneral Public License applies to most of the Free Software\r\nFoundation's software and to any other program whose authors commit to\r\nusing it.  (Some other Free Software Foundation software is covered by\r\nthe GNU Lesser General Public License instead.)  You can apply it to\r\nyour programs, too.\r\n\r\n  When we speak of free software, we are referring to freedom, not\r\nprice.  Our General Public Licenses are designed to make sure that you\r\nhave the freedom to distribute copies of free software (and charge for\r\nthis service if you wish), that you receive source code or can get it\r\nif you want it, that you can change the software or use pieces of it\r\nin new free programs; and that you know you can do these things.\r\n\r\n  To protect your rights, we need to make restrictions that forbid\r\nanyone to deny you these rights or to ask you to surrender the rights.\r\nThese restrictions translate to certain responsibilities for you if you\r\ndistribute copies of the software, or if you modify it.\r\n\r\n  For example, if you distribute copies of such a program, whether\r\ngratis or for a fee, you must give the recipients all the rights that\r\nyou have.  You must make sure that they, too, receive or can get the\r\nsource code.  And you must show them these terms so they know their\r\nrights.\r\n\r\n  We protect your rights with two steps: (1) copyright the software, and\r\n(2) offer you this license which gives you legal permission to copy,\r\ndistribute and/or modify the software.\r\n\r\n  Also, for each author's protection and ours, we want to make certain\r\nthat everyone understands that there is no warranty for this free\r\nsoftware.  If the software is modified by someone else and passed on, we\r\nwant its recipients to know that what they have is not the original, so\r\nthat any problems introduced by others will not reflect on the original\r\nauthors' reputations.\r\n\r\n  Finally, any free program is threatened constantly by software\r\npatents.  We wish to avoid the danger that redistributors of a free\r\nprogram will individually obtain patent licenses, in effect making the\r\nprogram proprietary.  To prevent this, we have made it clear that any\r\npatent must be licensed for everyone's free use or not licensed at all.\r\n\r\n  The precise terms and conditions for copying, distribution and\r\nmodification follow.\r\n\r\n                    GNU GENERAL PUBLIC LICENSE\r\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r\n\r\n  0. This License applies to any program or other work which contains\r\na notice placed by the copyright holder saying it may be distributed\r\nunder the terms of this General Public License.  The \"Program\", below,\r\nrefers to any such program or work, and a \"work based on the Program\"\r\nmeans either the Program or any derivative work under copyright law:\r\nthat is to say, a work containing the Program or a portion of it,\r\neither verbatim or with modifications and/or translated into another\r\nlanguage.  (Hereinafter, translation is included without limitation in\r\nthe term \"modification\".)  Each licensee is addressed as \"you\".\r\n\r\nActivities other than copying, distribution and modification are not\r\ncovered by this License; they are outside its scope.  The act of\r\nrunning the Program is not restricted, and the output from the Program\r\nis covered only if its contents constitute a work based on the\r\nProgram (independent of having been made by running the Program).\r\nWhether that is true depends on what the Program does.\r\n\r\n  1. You may copy and distribute verbatim copies of the Program's\r\nsource code as you receive it, in any medium, provided that you\r\nconspicuously and appropriately publish on each copy an appropriate\r\ncopyright notice and disclaimer of warranty; keep intact all the\r\nnotices that refer to this License and to the absence of any warranty;\r\nand give any other recipients of the Program a copy of this License\r\nalong with the Program.\r\n\r\nYou may charge a fee for the physical act of transferring a copy, and\r\nyou may at your option offer warranty protection in exchange for a fee.\r\n\r\n  2. You may modify your copy or copies of the Program or any portion\r\nof it, thus forming a work based on the Program, and copy and\r\ndistribute such modifications or work under the terms of Section 1\r\nabove, provided that you also meet all of these conditions:\r\n\r\n    a) You must cause the modified files to carry prominent notices\r\n    stating that you changed the files and the date of any change.\r\n\r\n    b) You must cause any work that you distribute or publish, that in\r\n    whole or in part contains or is derived from the Program or any\r\n    part thereof, to be licensed as a whole at no charge to all third\r\n    parties under the terms of this License.\r\n\r\n    c) If the modified program normally reads commands interactively\r\n    when run, you must cause it, when started running for such\r\n    interactive use in the most ordinary way, to print or display an\r\n    announcement including an appropriate copyright notice and a\r\n    notice that there is no warranty (or else, saying that you provide\r\n    a warranty) and that users may redistribute the program under\r\n    these conditions, and telling the user how to view a copy of this\r\n    License.  (Exception: if the Program itself is interactive but\r\n    does not normally print such an announcement, your work based on\r\n    the Program is not required to print an announcement.)\r\n\r\nThese requirements apply to the modified work as a whole.  If\r\nidentifiable sections of that work are not derived from the Program,\r\nand can be reasonably considered independent and separate works in\r\nthemselves, then this License, and its terms, do not apply to those\r\nsections when you distribute them as separate works.  But when you\r\ndistribute the same sections as part of a whole which is a work based\r\non the Program, the distribution of the whole must be on the terms of\r\nthis License, whose permissions for other licensees extend to the\r\nentire whole, and thus to each and every part regardless of who wrote it.\r\n\r\nThus, it is not the intent of this section to claim rights or contest\r\nyour rights to work written entirely by you; rather, the intent is to\r\nexercise the right to control the distribution of derivative or\r\ncollective works based on the Program.\r\n\r\nIn addition, mere aggregation of another work not based on the Program\r\nwith the Program (or with a work based on the Program) on a volume of\r\na storage or distribution medium does not bring the other work under\r\nthe scope of this License.\r\n\r\n  3. You may copy and distribute the Program (or a work based on it,\r\nunder Section 2) in object code or executable form under the terms of\r\nSections 1 and 2 above provided that you also do one of the following:\r\n\r\n    a) Accompany it with the complete corresponding machine-readable\r\n    source code, which must be distributed under the terms of Sections\r\n    1 and 2 above on a medium customarily used for software interchange; or,\r\n\r\n    b) Accompany it with a written offer, valid for at least three\r\n    years, to give any third party, for a charge no more than your\r\n    cost of physically performing source distribution, a complete\r\n    machine-readable copy of the corresponding source code, to be\r\n    distributed under the terms of Sections 1 and 2 above on a medium\r\n    customarily used for software interchange; or,\r\n\r\n    c) Accompany it with the information you received as to the offer\r\n    to distribute corresponding source code.  (This alternative is\r\n    allowed only for noncommercial distribution and only if you\r\n    received the program in object code or executable form with such\r\n    an offer, in accord with Subsection b above.)\r\n\r\nThe source code for a work means the preferred form of the work for\r\nmaking modifications to it.  For an executable work, complete source\r\ncode means all the source code for all modules it contains, plus any\r\nassociated interface definition files, plus the scripts used to\r\ncontrol compilation and installation of the executable.  However, as a\r\nspecial exception, the source code distributed need not include\r\nanything that is normally distributed (in either source or binary\r\nform) with the major components (compiler, kernel, and so on) of the\r\noperating system on which the executable runs, unless that component\r\nitself accompanies the executable.\r\n\r\nIf distribution of executable or object code is made by offering\r\naccess to copy from a designated place, then offering equivalent\r\naccess to copy the source code from the same place counts as\r\ndistribution of the source code, even though third parties are not\r\ncompelled to copy the source along with the object code.\r\n\r\n  4. You may not copy, modify, sublicense, or distribute the Program\r\nexcept as expressly provided under this License.  Any attempt\r\notherwise to copy, modify, sublicense or distribute the Program is\r\nvoid, and will automatically terminate your rights under this License.\r\nHowever, parties who have received copies, or rights, from you under\r\nthis License will not have their licenses terminated so long as such\r\nparties remain in full compliance.\r\n\r\n  5. You are not required to accept this License, since you have not\r\nsigned it.  However, nothing else grants you permission to modify or\r\ndistribute the Program or its derivative works.  These actions are\r\nprohibited by law if you do not accept this License.  Therefore, by\r\nmodifying or distributing the Program (or any work based on the\r\nProgram), you indicate your acceptance of this License to do so, and\r\nall its terms and conditions for copying, distributing or modifying\r\nthe Program or works based on it.\r\n\r\n  6. Each time you redistribute the Program (or any work based on the\r\nProgram), the recipient automatically receives a license from the\r\noriginal licensor to copy, distribute or modify the Program subject to\r\nthese terms and conditions.  You may not impose any further\r\nrestrictions on the recipients' exercise of the rights granted herein.\r\nYou are not responsible for enforcing compliance by third parties to\r\nthis License.\r\n\r\n  7. If, as a consequence of a court judgment or allegation of patent\r\ninfringement or for any other reason (not limited to patent issues),\r\nconditions are imposed on you (whether by court order, agreement or\r\notherwise) that contradict the conditions of this License, they do not\r\nexcuse you from the conditions of this License.  If you cannot\r\ndistribute so as to satisfy simultaneously your obligations under this\r\nLicense and any other pertinent obligations, then as a consequence you\r\nmay not distribute the Program at all.  For example, if a patent\r\nlicense would not permit royalty-free redistribution of the Program by\r\nall those who receive copies directly or indirectly through you, then\r\nthe only way you could satisfy both it and this License would be to\r\nrefrain entirely from distribution of the Program.\r\n\r\nIf any portion of this section is held invalid or unenforceable under\r\nany particular circumstance, the balance of the section is intended to\r\napply and the section as a whole is intended to apply in other\r\ncircumstances.\r\n\r\nIt is not the purpose of this section to induce you to infringe any\r\npatents or other property right claims or to contest validity of any\r\nsuch claims; this section has the sole purpose of protecting the\r\nintegrity of the free software distribution system, which is\r\nimplemented by public license practices.  Many people have made\r\ngenerous contributions to the wide range of software distributed\r\nthrough that system in reliance on consistent application of that\r\nsystem; it is up to the author/donor to decide if he or she is willing\r\nto distribute software through any other system and a licensee cannot\r\nimpose that choice.\r\n\r\nThis section is intended to make thoroughly clear what is believed to\r\nbe a consequence of the rest of this License.\r\n\r\n  8. If the distribution and/or use of the Program is restricted in\r\ncertain countries either by patents or by copyrighted interfaces, the\r\noriginal copyright holder who places the Program under this License\r\nmay add an explicit geographical distribution limitation excluding\r\nthose countries, so that distribution is permitted only in or among\r\ncountries not thus excluded.  In such case, this License incorporates\r\nthe limitation as if written in the body of this License.\r\n\r\n  9. The Free Software Foundation may publish revised and/or new versions\r\nof the General Public License from time to time.  Such new versions will\r\nbe similar in spirit to the present version, but may differ in detail to\r\naddress new problems or concerns.\r\n\r\nEach version is given a distinguishing version number.  If the Program\r\nspecifies a version number of this License which applies to it and \"any\r\nlater version\", you have the option of following the terms and conditions\r\neither of that version or of any later version published by the Free\r\nSoftware Foundation.  If the Program does not specify a version number of\r\nthis License, you may choose any version ever published by the Free Software\r\nFoundation.\r\n\r\n  10. If you wish to incorporate parts of the Program into other free\r\nprograms whose distribution conditions are different, write to the author\r\nto ask for permission.  For software which is copyrighted by the Free\r\nSoftware Foundation, write to the Free Software Foundation; we sometimes\r\nmake exceptions for this.  Our decision will be guided by the two goals\r\nof preserving the free status of all derivatives of our free software and\r\nof promoting the sharing and reuse of software generally.\r\n\r\n                            NO WARRANTY\r\n\r\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\r\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\r\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\r\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\r\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\r\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\r\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\r\nREPAIR OR CORRECTION.\r\n\r\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\r\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\r\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\r\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\r\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\r\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\r\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\r\nPOSSIBILITY OF SUCH DAMAGES.\r\n\r\n                     END OF TERMS AND CONDITIONS\r\n\r\n            How to Apply These Terms to Your New Programs\r\n\r\n  If you develop a new program, and you want it to be of the greatest\r\npossible use to the public, the best way to achieve this is to make it\r\nfree software which everyone can redistribute and change under these terms.\r\n\r\n  To do so, attach the following notices to the program.  It is safest\r\nto attach them to the start of each source file to most effectively\r\nconvey the exclusion of warranty; and each file should have at least\r\nthe \"copyright\" line and a pointer to where the full notice is found.\r\n\r\n    <one line to give the program's name and a brief idea of what it does.>\r\n    Copyright (C) <year>  <name of author>\r\n\r\n    This program is free software; you can redistribute it and/or modify\r\n    it under the terms of the GNU General Public License as published by\r\n    the Free Software Foundation; either version 2 of the License, or\r\n    (at your option) any later version.\r\n\r\n    This program is distributed in the hope that it will be useful,\r\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\n    GNU General Public License for more details.\r\n\r\n    You should have received a copy of the GNU General Public License along\r\n    with this program; if not, write to the Free Software Foundation, Inc.,\r\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r\n\r\nAlso add information on how to contact you by electronic and paper mail.\r\n\r\nIf the program is interactive, make it output a short notice like this\r\nwhen it starts in an interactive mode:\r\n\r\n    Gnomovision version 69, Copyright (C) year name of author\r\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\r\n    This is free software, and you are welcome to redistribute it\r\n    under certain conditions; type `show c' for details.\r\n\r\nThe hypothetical commands `show w' and `show c' should show the appropriate\r\nparts of the General Public License.  Of course, the commands you use may\r\nbe called something other than `show w' and `show c'; they could even be\r\nmouse-clicks or menu items--whatever suits your program.\r\n\r\nYou should also get your employer (if you work as a programmer) or your\r\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\r\nnecessary.  Here is a sample; alter the names:\r\n\r\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\r\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\r\n\r\n  <signature of Ty Coon>, 1 April 1989\r\n  Ty Coon, President of Vice\r\n\r\nThis General Public License does not permit incorporating your program into\r\nproprietary programs.  If your program is a subroutine library, you may\r\nconsider it more useful to permit linking proprietary applications with the\r\nlibrary.  If this is what you want to do, use the GNU Lesser General\r\nPublic License instead of this License.\r\n\r\nWRITTEN OFFER\r\n\r\nThe source code for any program binaries or compressed scripts that are\r\nincluded with WordPress can be freely obtained at the following URL:\r\n\r\n\thttps://wordpress.org/download/source/\r\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/readme.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta name=\"viewport\" content=\"width=device-width\" />\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title>WordPress &#8250; ReadMe</title>\n\t<link rel=\"stylesheet\" href=\"wp-admin/css/install.css?ver=20100228\" type=\"text/css\" />\n</head>\n<body>\n<h1 id=\"logo\">\n\t<a href=\"https://wordpress.org/\"><img alt=\"WordPress\" src=\"wp-admin/images/wordpress-logo.png\" /></a>\n\t<br /> Version 4.4.2\n</h1>\n<p style=\"text-align: center\">Semantic Personal Publishing Platform</p>\n\n<h2>First Things First</h2>\n<p>Welcome. WordPress is a very special project to me. Every developer and contributor adds something unique to the mix, and together we create something beautiful that I&#8217;m proud to be a part of. Thousands of hours have gone into WordPress, and we&#8217;re dedicated to making it better every day. Thank you for making it part of your world.</p>\n<p style=\"text-align: right\">&#8212; Matt Mullenweg</p>\n\n<h2>Installation: Famous 5-minute install</h2>\n<ol>\n\t<li>Unzip the package in an empty directory and upload everything.</li>\n\t<li>Open <span class=\"file\"><a href=\"wp-admin/install.php\">wp-admin/install.php</a></span> in your browser. It will take you through the process to set up a <code>wp-config.php</code> file with your database connection details.\n\t\t<ol>\n\t\t\t<li>If for some reason this doesn&#8217;t work, don&#8217;t worry. It doesn&#8217;t work on all web hosts. Open up <code>wp-config-sample.php</code> with a text editor like WordPad or similar and fill in your database connection details.</li>\n\t\t\t<li>Save the file as <code>wp-config.php</code> and upload it.</li>\n\t\t\t<li>Open <span class=\"file\"><a href=\"wp-admin/install.php\">wp-admin/install.php</a></span> in your browser.</li>\n\t\t</ol>\n\t</li>\n\t<li>Once the configuration file is set up, the installer will set up the tables needed for your blog. If there is an error, double check your <code>wp-config.php</code> file, and try again. If it fails again, please go to the <a href=\"https://wordpress.org/support/\" title=\"WordPress support\">support forums</a> with as much data as you can gather.</li>\n\t<li><strong>If you did not enter a password, note the password given to you.</strong> If you did not provide a username, it will be <code>admin</code>.</li>\n\t<li>The installer should then send you to the <a href=\"wp-login.php\">login page</a>. Sign in with the username and password you chose during the installation. If a password was generated for you, you can then click on &#8220;Profile&#8221; to change the password.</li>\n</ol>\n\n<h2>Updating</h2>\n<h3>Using the Automatic Updater</h3>\n<p>If you are updating from version 2.7 or higher, you can use the automatic updater:</p>\n<ol>\n\t<li>Open <span class=\"file\"><a href=\"wp-admin/update-core.php\">wp-admin/update-core.php</a></span> in your browser and follow the instructions.</li>\n\t<li>You wanted more, perhaps? That&#8217;s it!</li>\n</ol>\n\n<h3>Updating Manually</h3>\n<ol>\n\t<li>Before you update anything, make sure you have backup copies of any files you may have modified such as <code>index.php</code>.</li>\n\t<li>Delete your old WordPress files, saving ones you&#8217;ve modified.</li>\n\t<li>Upload the new files.</li>\n\t<li>Point your browser to <span class=\"file\"><a href=\"wp-admin/upgrade.php\">/wp-admin/upgrade.php</a>.</span></li>\n</ol>\n\n<h2>Migrating from other systems</h2>\n<p>WordPress can <a href=\"https://codex.wordpress.org/Importing_Content\">import from a number of systems</a>. First you need to get WordPress installed and working as described above, before using <a href=\"wp-admin/import.php\" title=\"Import to WordPress\">our import tools</a>.</p>\n\n<h2>System Requirements</h2>\n<ul>\n\t<li><a href=\"http://php.net/\">PHP</a> version <strong>5.2.4</strong> or higher.</li>\n\t<li><a href=\"http://www.mysql.com/\">MySQL</a> version <strong>5.0</strong> or higher.</li>\n</ul>\n\n<h3>Recommendations</h3>\n<ul>\n\t<li><a href=\"http://php.net/\">PHP</a> version <strong>5.6</strong> or higher.</li>\n\t<li><a href=\"http://www.mysql.com/\">MySQL</a> version <strong>5.6</strong> or higher.</li>\n\t<li>The <a href=\"http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html\">mod_rewrite</a> Apache module.</li>\n\t<li>A link to <a href=\"https://wordpress.org/\">wordpress.org</a> on your site.</li>\n</ul>\n\n<h2>Online Resources</h2>\n<p>If you have any questions that aren&#8217;t addressed in this document, please take advantage of WordPress&#8217; numerous online resources:</p>\n<dl>\n\t<dt><a href=\"https://codex.wordpress.org/\">The WordPress Codex</a></dt>\n\t\t<dd>The Codex is the encyclopedia of all things WordPress. It is the most comprehensive source of information for WordPress available.</dd>\n\t<dt><a href=\"https://wordpress.org/news/\">The WordPress Blog</a></dt>\n\t\t<dd>This is where you&#8217;ll find the latest updates and news related to WordPress. Recent WordPress news appears in your administrative dashboard by default.</dd>\n\t<dt><a href=\"https://planet.wordpress.org/\">WordPress Planet</a></dt>\n\t\t<dd>The WordPress Planet is a news aggregator that brings together posts from WordPress blogs around the web.</dd>\n\t<dt><a href=\"https://wordpress.org/support/\">WordPress Support Forums</a></dt>\n\t\t<dd>If you&#8217;ve looked everywhere and still can&#8217;t find an answer, the support forums are very active and have a large community ready to help. To help them help you be sure to use a descriptive thread title and describe your question in as much detail as possible.</dd>\n\t<dt><a href=\"https://codex.wordpress.org/IRC\">WordPress <abbr title=\"Internet Relay Chat\">IRC</abbr> Channel</a></dt>\n\t\t<dd>There is an online chat channel that is used for discussion among people who use WordPress and occasionally support topics. The above wiki page should point you in the right direction. (<a href=\"irc://irc.freenode.net/wordpress\">irc.freenode.net #wordpress</a>)</dd>\n</dl>\n\n<h2>Final Notes</h2>\n<ul>\n\t<li>If you have any suggestions, ideas, or comments, or if you (gasp!) found a bug, join us in the <a href=\"https://wordpress.org/support/\">Support Forums</a>.</li>\n\t<li>WordPress has a robust plugin <abbr title=\"application programming interface\">API</abbr> that makes extending the code easy. If you are a developer interested in utilizing this, see the <a href=\"https://codex.wordpress.org/Plugin_API\" title=\"WordPress plugin API\">plugin documentation in the Codex</a>. You shouldn&#8217;t modify any of the core code.</li>\n</ul>\n\n<h2>Share the Love</h2>\n<p>WordPress has no multi-million dollar marketing campaign or celebrity sponsors, but we do have something even better&#8212;you. If you enjoy WordPress please consider telling a friend, setting it up for someone less knowledgable than yourself, or writing the author of a media article that overlooks us.</p>\n\n<p>WordPress is the official continuation of <a href=\"http://cafelog.com/\">b2/caf&#233;log</a>, which came from Michel V. The work has been continued by the <a href=\"https://wordpress.org/about/\">WordPress developers</a>. If you would like to support WordPress, please consider <a href=\"https://wordpress.org/donate/\" title=\"Donate to WordPress\">donating</a>.</p>\n\n<h2>License</h2>\n<p>WordPress is free software, and is released under the terms of the <abbr title=\"GNU General Public License\">GPL</abbr> version 2 or (at your option) any later version. See <a href=\"license.txt\">license.txt</a>.</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-activate.php",
    "content": "<?php\n/**\n * Confirms that the activation key that is sent in an email after a user signs\n * up for a new blog matches the key for that user and then displays confirmation.\n *\n * @package WordPress\n */\n\ndefine( 'WP_INSTALLING', true );\n\n/** Sets up the WordPress Environment. */\nrequire( dirname(__FILE__) . '/wp-load.php' );\n\nrequire( dirname( __FILE__ ) . '/wp-blog-header.php' );\n\nif ( !is_multisite() ) {\n\twp_redirect( wp_registration_url() );\n\tdie();\n}\n\nif ( is_object( $wp_object_cache ) )\n\t$wp_object_cache->cache_enabled = false;\n\n// Fix for page title\n$wp_query->is_404 = false;\n\n/**\n * Fires before the Site Activation page is loaded.\n *\n * @since 3.0.0\n */\ndo_action( 'activate_header' );\n\n/**\n * Adds an action hook specific to this page that fires on wp_head\n *\n * @since MU\n */\nfunction do_activate_header() {\n    /**\n     * Fires before the Site Activation page is loaded, but on the wp_head action.\n     *\n     * @since 3.0.0\n     */\n    do_action( 'activate_wp_head' );\n}\nadd_action( 'wp_head', 'do_activate_header' );\n\n/**\n * Loads styles specific to this page.\n *\n * @since MU\n */\nfunction wpmu_activate_stylesheet() {\n\t?>\n\t<style type=\"text/css\">\n\t\tform { margin-top: 2em; }\n\t\t#submit, #key { width: 90%; font-size: 24px; }\n\t\t#language { margin-top: .5em; }\n\t\t.error { background: #f66; }\n\t\tspan.h3 { padding: 0 8px; font-size: 1.3em; font-weight: bold; }\n\t</style>\n\t<?php\n}\nadd_action( 'wp_head', 'wpmu_activate_stylesheet' );\n\nget_header( 'wp-activate' );\n?>\n\n<div id=\"signup-content\" class=\"widecolumn\">\n\t<div class=\"wp-activate-container\">\n\t<?php if ( empty($_GET['key']) && empty($_POST['key']) ) { ?>\n\n\t\t<h2><?php _e('Activation Key Required') ?></h2>\n\t\t<form name=\"activateform\" id=\"activateform\" method=\"post\" action=\"<?php echo network_site_url('wp-activate.php'); ?>\">\n\t\t\t<p>\n\t\t\t    <label for=\"key\"><?php _e('Activation Key:') ?></label>\n\t\t\t    <br /><input type=\"text\" name=\"key\" id=\"key\" value=\"\" size=\"50\" />\n\t\t\t</p>\n\t\t\t<p class=\"submit\">\n\t\t\t    <input id=\"submit\" type=\"submit\" name=\"Submit\" class=\"submit\" value=\"<?php esc_attr_e('Activate') ?>\" />\n\t\t\t</p>\n\t\t</form>\n\n\t<?php } else {\n\n\t\t$key = !empty($_GET['key']) ? $_GET['key'] : $_POST['key'];\n\t\t$result = wpmu_activate_signup( $key );\n\t\tif ( is_wp_error($result) ) {\n\t\t\tif ( 'already_active' == $result->get_error_code() || 'blog_taken' == $result->get_error_code() ) {\n\t\t\t    $signup = $result->get_error_data();\n\t\t\t\t?>\n\t\t\t\t<h2><?php _e('Your account is now active!'); ?></h2>\n\t\t\t\t<?php\n\t\t\t\techo '<p class=\"lead-in\">';\n\t\t\t\tif ( $signup->domain . $signup->path == '' ) {\n\t\t\t\t\tprintf( __('Your account has been activated. You may now <a href=\"%1$s\">log in</a> to the site using your chosen username of &#8220;%2$s&#8221;. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href=\"%4$s\">reset your password</a>.'), network_site_url( 'wp-login.php', 'login' ), $signup->user_login, $signup->user_email, wp_lostpassword_url() );\n\t\t\t\t} else {\n\t\t\t\t\tprintf( __('Your site at <a href=\"%1$s\">%2$s</a> is active. You may now log in to your site using your chosen username of &#8220;%3$s&#8221;. Please check your email inbox at %4$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can <a href=\"%5$s\">reset your password</a>.'), 'http://' . $signup->domain, $signup->domain, $signup->user_login, $signup->user_email, wp_lostpassword_url() );\n\t\t\t\t}\n\t\t\t\techo '</p>';\n\t\t\t} else {\n\t\t\t\t?>\n\t\t\t\t<h2><?php _e('An error occurred during the activation'); ?></h2>\n\t\t\t\t<?php\n\t\t\t    echo '<p>'.$result->get_error_message().'</p>';\n\t\t\t}\n\t\t} else {\n\t\t\t$url = isset( $result['blog_id'] ) ? get_blogaddress_by_id( (int) $result['blog_id'] ) : '';\n\t\t\t$user = get_userdata( (int) $result['user_id'] );\n\t\t\t?>\n\t\t\t<h2><?php _e('Your account is now active!'); ?></h2>\n\n\t\t\t<div id=\"signup-welcome\">\n\t\t\t\t<p><span class=\"h3\"><?php _e('Username:'); ?></span> <?php echo $user->user_login ?></p>\n\t\t\t\t<p><span class=\"h3\"><?php _e('Password:'); ?></span> <?php echo $result['password']; ?></p>\n\t\t\t</div>\n\n\t\t\t<?php if ( $url && $url != network_home_url( '', 'http' ) ) :\n\t\t\t\tswitch_to_blog( (int) $result['blog_id'] ); \n\t\t\t\t$login_url = wp_login_url(); \n\t\t\t\trestore_current_blog(); \n\t\t\t\t?>\n\t\t\t\t<p class=\"view\"><?php printf( __( 'Your account is now activated. <a href=\"%1$s\">View your site</a> or <a href=\"%2$s\">Log in</a>' ), $url, esc_url( $login_url ) ); ?></p>\n\t\t\t<?php else: ?>\n\t\t\t\t<p class=\"view\"><?php printf( __('Your account is now activated. <a href=\"%1$s\">Log in</a> or go back to the <a href=\"%2$s\">homepage</a>.' ), network_site_url('wp-login.php', 'login'), network_home_url() ); ?></p>\n\t\t\t<?php endif;\n\t\t}\n\t}\n\t?>\n\t</div>\n</div>\n<script type=\"text/javascript\">\n\tvar key_input = document.getElementById('key');\n\tkey_input && key_input.focus();\n</script>\n<?php get_footer( 'wp-activate' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/about.php",
    "content": "<?php\n/**\n * About This Version administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_enqueue_style( 'wp-mediaelement' );\nwp_enqueue_script( 'wp-mediaelement' );\nwp_localize_script( 'mediaelement', '_wpmejsSettings', array(\n\t'pluginPath' => includes_url( 'js/mediaelement/', 'relative' ),\n\t'pauseOtherPlayers' => ''\n) );\n\nif ( current_user_can( 'install_plugins' ) ) {\n\tadd_thickbox();\n\twp_enqueue_script( 'plugin-install' );\n}\n\n$video_url = 'https://videopress.com/embed/J44FHXvg?hd=true';\n$locale    = str_replace( '_', '-', get_locale() );\nlist( $locale ) = explode( '-', $locale );\nif ( 'en' !== $locale ) {\n\t$video_url = add_query_arg( 'defaultLangCode', $locale, $video_url );\n}\n\nwp_oembed_add_host_js();\n\n$title = __( 'About' );\n\nlist( $display_version ) = explode( '-', $wp_version );\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\t<div class=\"wrap about-wrap\">\n\t\t<h1><?php printf( __( 'Welcome to WordPress&nbsp;%s' ), $display_version ); ?></h1>\n\n\t\t<div class=\"about-text\"><?php printf( __( 'Thank you for updating! WordPress %s makes your site more connected and responsive.' ), $display_version ); ?></div>\n\t\t<div class=\"wp-badge\"><?php printf( __( 'Version %s' ), $display_version ); ?></div>\n\n\t\t<h2 class=\"nav-tab-wrapper\">\n\t\t\t<a href=\"about.php\" class=\"nav-tab nav-tab-active\"><?php _e( 'What&#8217;s New' ); ?></a>\n\t\t\t<a href=\"credits.php\" class=\"nav-tab\"><?php _e( 'Credits' ); ?></a>\n\t\t\t<a href=\"freedoms.php\" class=\"nav-tab\"><?php _e( 'Freedoms' ); ?></a>\n\t\t</h2>\n\n\t\t<div class=\"changelog point-releases\">\n\t\t\t<h3><?php echo _n( 'Maintenance and Security Release', 'Maintenance and Security Releases', 2 ); ?></h3>\n\t\t\t<p><?php printf( _n( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',\n\t\t\t\t'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.', 17 ), '4.4.2', number_format_i18n( 17 ) ); ?>\n\t\t\t\t<?php printf( __( 'For more information, see <a href=\"%s\">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.4.2' ); ?>\n\t\t\t</p>\n\t\t\t<p><?php printf( _n( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',\n\t\t\t\t'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.', 52 ), '4.4.1', number_format_i18n( 52 ) ); ?>\n\t\t\t\t<?php printf( __( 'For more information, see <a href=\"%s\">the release notes</a>.' ), 'https://codex.wordpress.org/Version_4.4.1' ); ?>\n\t\t\t</p>\n\t\t</div>\n\n\t\t<div class=\"headline-feature feature-video\">\n\t\t\t<iframe width=\"1050\" height=\"591\" src=\"<?php echo esc_url( $video_url ); ?>\" frameborder=\"0\" allowfullscreen></iframe>\n\t\t\t<script src=\"https://videopress.com/videopress-iframe.js\"></script>\n\t\t</div>\n\n\t\t<hr>\n\n\t\t<div class=\"headline-feature feature-section one-col\">\n\t\t\t<h2><?php _e( 'Twenty Sixteen' ); ?></h2>\n\t\t\t<div class=\"media-container\">\n\t\t\t\t<img src=\"https://s.w.org/images/core/4.4/twenty-sixteen-white-fullsize-2x.png\" alt=\"\" srcset=\"https://s.w.org/images/core/4.4/twenty-sixteen-white-smartphone-1x.png 268w, https://s.w.org/images/core/4.4/twenty-sixteen-white-smartphone-2x.png 536w, https://s.w.org/images/core/4.4/twenty-sixteen-white-tablet-1x.png 558w, https://s.w.org/images/core/4.4/twenty-sixteen-white-desktop-1x.png 840w, https://s.w.org/images/core/4.4/twenty-sixteen-white-fullsize-1x.png 1086w, https://s.w.org/images/core/4.4/twenty-sixteen-white-tablet-2x.png 1116w, https://s.w.org/images/core/4.4/twenty-sixteen-white-desktop-2x.png 1680w, https://s.w.org/images/core/4.4/twenty-sixteen-white-fullsize-2x.png 2172w\" sizes=\"(max-width: 500px) calc((100vw - 40px) * .8), (max-width: 782px) calc((100vw - 70px) * .8), (max-width: 960px) calc((100vw - 116px) * .8), (max-width: 1290px) calc((100vw - 240px) * .8), 840px\" />\n\t\t\t</div>\n\t\t\t<div class=\"two-col\">\n\t\t\t\t<div class=\"col\">\n\t\t\t\t\t<h3><?php _e( 'Introducing Twenty Sixteen' ); ?></h3>\n\t\t\t\t\t<p><?php _e( 'Our newest default theme, Twenty Sixteen, is a modern take on a classic blog design.' ); ?></p>\n\t\t\t\t\t<p><?php _e( 'Twenty Sixteen was built to look great on any device. A fluid grid design, flexible header, fun color schemes, and more, will make your content shine.' ); ?></p>\n\t\t\t\t\t<div class=\"horizontal-image\">\n\t\t\t\t\t\t<div class=\"content\">\n\t\t\t\t\t\t\t<img class=\"feature-image horizontal-screen\" src=\"https://s.w.org/images/core/4.4/twenty-sixteen-dark-fullsize-2x.png?2\" alt=\"\"  srcset=\"https://s.w.org/images/core/4.4/twenty-sixteen-dark-smartphone-1x.png?2 268w, https://s.w.org/images/core/4.4/twenty-sixteen-dark-smartphone-2x.png?2 535w, https://s.w.org/images/core/4.4/twenty-sixteen-dark-desktop-1x.png?2 558w, https://s.w.org/images/core/4.4/twenty-sixteen-dark-fullsize-1x.png?2 783w, https://s.w.org/images/core/4.4/twenty-sixteen-dark-desktop-2x.png?2 1116w, https://s.w.org/images/core/4.4/twenty-sixteen-dark-fullsize-2x.png?2 1566w\" sizes=\"(max-width: 500px) calc((100vw - 40px) * .8), (max-width: 782px) calc((100vw - 70px) * .8), (max-width: 960px) calc((100vw - 116px) * .5216), (max-width: 1290px) calc((100vw - 240px) * .5216), 548px\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col feature-image\">\n\t\t\t\t\t<img class=\"vertical-screen\" src=\"https://s.w.org/images/core/4.4/twenty-sixteen-red-fullsize-2x.png\" alt=\"\" srcset=\"https://s.w.org/images/core/4.4/twenty-sixteen-red-smartphone-1x.png 107w, https://s.w.org/images/core/4.4/twenty-sixteen-red-smartphone-2x.png 214w, https://s.w.org/images/core/4.4/twenty-sixteen-red-desktop-1x.png 252w, https://s.w.org/images/core/4.4/twenty-sixteen-red-fullsize-1x.png 410w, https://s.w.org/images/core/4.4/twenty-sixteen-red-desktop-2x.png 504w, https://s.w.org/images/core/4.4/twenty-sixteen-red-fullsize-2x.png 820w\" sizes=\"(max-width: 500px) calc((100vw - 40px) * .32), (max-width: 782px) calc((100vw - 70px) * .32), (max-width: 960px) calc((100vw - 116px) * .24), (max-width: 1290px) calc((100vw - 240px) * .24), 252px\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<hr />\n\n\t\t<div class=\"feature-section two-col\">\n\t\t\t<div class=\"col\">\n\t\t\t\t<div class=\"media-container\">\n\t\t\t\t\t<img src=\"https://s.w.org/images/core/4.4/responsive-devices-fullsize-2x.png\" alt=\"\" srcset=\"https://s.w.org/images/core/4.4/responsive-devices-smartphone-1x.png 335w, https://s.w.org/images/core/4.4/responsive-devices-desktop-1x.png 500w, https://s.w.org/images/core/4.4/responsive-devices-smartphone-2x.png 670w, https://s.w.org/images/core/4.4/responsive-devices-tablet-1x.png 698w, https://s.w.org/images/core/4.4/responsive-devices-desktop-2x.png 1000w, https://s.w.org/images/core/4.4/responsive-devices-fullsize-1x.png 1200w, https://s.w.org/images/core/4.4/responsive-devices-tablet-2x.png 1396w, https://s.w.org/images/core/4.4/responsive-devices-fullsize-2x.png 2400w\" sizes=\"(max-width: 500px) calc(100vw - 40px), (max-width: 782px) calc(100vw - 70px), (max-width: 960px) calc((100vw - 116px) * .476), (max-width: 1290px) calc((100vw - 240px) * .476), 500px\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"col\">\n\t\t\t\t<h3><?php _e( 'Responsive images' ); ?></h3>\n\t\t\t\t<p><?php _e( 'WordPress now takes a smarter approach to displaying appropriate image sizes on any device, ensuring a perfect fit every time. You don&#8217;t need to do anything to your theme, it just works.' ); ?></p>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<hr />\n\n\t\t<div class=\"feature-section two-col\">\n\t\t\t<div class=\"col\">\n\t\t\t\t<div class=\"embed-container\">\n\t\t\t\t\t<blockquote data-secret=\"OcUe7B6Edh\" class=\"wp-embedded-content\"><a href=\"https://wordpress.org/news/2015/12/clifford/\">WordPress 4.4 &ldquo;Clifford&rdquo;</a></blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"display:none;\" src=\"https://wordpress.org/news/2015/12/clifford/embed/#?secret=OcUe7B6Edh\" data-secret=\"OcUe7B6Edh\" width=\"600\" height=\"338\" title=\"<?php esc_attr_e( 'Embedded WordPress Post' ); ?>\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"></iframe>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"col\">\n\t\t\t\t<h3><?php _e( 'Embed your WordPress content' ); ?></h3>\n\t\t\t\t<p><?php _e( 'Now you can embed your posts on other sites, even other WordPress sites. Simply drop a post URL into the editor and see an instant embed preview, complete with the title, excerpt, and featured image if you&#8217;ve set one. We&#8217;ll even include your site icon and links for comments and sharing.' ); ?></p>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<hr />\n\n\t\t<div class=\"feature-section two-col\">\n\t\t\t<div class=\"col\">\n\t\t\t\t<div class=\"embed-container embed-reverbnation\">\n\t\t\t\t\t<iframe width=\"640\" height=\"150\" scrolling=\"no\" frameborder=\"no\" src=\"https://www.reverbnation.com/widget_code/html_widget/artist_607?widget_id=55&amp;pwc[song_ids]=3731874&amp;pwc[size]=small\"></iframe>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"col\">\n\t\t\t\t<h3><?php _e( 'Even more embed providers' ); ?></h3>\n\t\t\t\t<p><?php _e( 'In addition to post embeds, WordPress 4.4 also adds support for five new oEmbed providers: Cloudup, Reddit&nbsp;Comments, ReverbNation, Speaker&nbsp;Deck, and VideoPress.' ); ?></p>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<hr />\n\n\t\t<div class=\"changelog\">\n\t\t\t<h3><?php _e( 'Under the Hood' ); ?></h3>\n\n\t\t\t<div class=\"feature-section under-the-hood one-col\">\n\t\t\t\t<div class=\"col\">\n\t\t\t\t\t<h4><?php _e( 'REST API infrastructure' ); ?></h4>\n\t\t\t\t\t<div class=\"two-col-text\">\n\t\t\t\t\t\t<p><?php _e( 'Infrastructure for the REST API has been integrated into core, marking a new era in developing with WordPress. The REST API serves to provide developers with a path forward for building and extending RESTful APIs on top of WordPress.' ); ?></p>\n\t\t\t\t\t\t<p><?php\n\t\t\t\t\t\t\tif ( current_user_can( 'install_plugins' ) ) {\n\t\t\t\t\t\t\t\t$url_args = array(\n\t\t\t\t\t\t\t\t\t'tab'       => 'plugin-information',\n\t\t\t\t\t\t\t\t\t'plugin'    => 'rest-api',\n\t\t\t\t\t\t\t\t\t'TB_iframe' => true,\n\t\t\t\t\t\t\t\t\t'width'     => 600,\n\t\t\t\t\t\t\t\t\t'height'    => 550\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t$plugin_link = '<a href=\"' . esc_url( add_query_arg( $url_args, network_admin_url( 'plugin-install.php' ) ) ) . '\" class=\"thickbox\">WordPress REST API</a>';\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$plugin_link = '<a href=\"https://wordpress.org/plugins/rest-api\">WordPress REST API</a>';\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/* translators: WordPress REST API plugin link */\n\t\t\t\t\t\t\tprintf( __( 'Infrastructure is the first part of a multi-stage rollout for the REST API. Inclusion of core endpoints is targeted for an upcoming release. To get a sneak peek of the core endpoints, and for more information on extending the REST API, check out the official %s plugin.' ), $plugin_link );\n\t\t\t\t\t\t?></p>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"feature-section under-the-hood three-col\">\n\t\t\t\t<div class=\"col\">\n\t\t\t\t\t<h4><?php _e( 'Term meta' ); ?></h4>\n\t\t\t\t\t<p><?php\n\t\t\t\t\t\t/* translators: 1: add_term_meta() docs link, 2: get_term_meta() docs link, 3: update_term_meta() docs link */\n\t\t\t\t\t\tprintf( __( 'Terms now support metadata, just like posts. See %1$s, %2$s, and %3$s for more information.' ),\n\t\t\t\t\t\t\t'<a href=\"https://developer.wordpress.org/reference/functions/add_term_meta\"><code>add_term_meta()</code></a>',\n\t\t\t\t\t\t\t'<a href=\"https://developer.wordpress.org/reference/functions/get_term_meta\"><code>get_term_meta()</code></a>',\n\t\t\t\t\t\t\t'<a href=\"https://developer.wordpress.org/reference/functions/update_term_meta\"><code>update_term_meta()</code></a>'\n\t\t\t\t         );\n\t\t\t\t\t?></p>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col\">\n\t\t\t\t\t<h4><?php _e( 'Comment query improvements' ); ?></h4>\n\t\t\t\t\t<p><?php\n\t\t\t\t\t\t/* translators: WP_Comment_Query class name */\n\t\t\t\t\t\tprintf( __( 'Comment queries now have cache handling to improve performance. New arguments in %s make crafting robust comment queries simpler.' ), '<code>WP_Comment_Query</code>' );\n\t\t\t\t\t?></p>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col\">\n\t\t\t\t\t<h4><?php _e( 'Term, comment, and network objects' ); ?></h4>\n\t\t\t\t\t<p><?php\n\t\t\t\t\t\t/* translators: 1: WP_Term class name, WP_Comment class name, WP_Network class name */\n\t\t\t\t\t\tprintf( __( 'New %1$s, %2$s, and %3$s objects make interacting with terms, comments, and networks more predictable and intuitive in code.' ),\n\t\t\t\t\t\t\t'<code>WP_Term</code>',\n\t\t\t\t\t\t\t'<code>WP_Comment</code>',\n\t\t\t\t\t\t\t'<code>WP_Network</code>'\n\t\t\t\t\t\t);\n\t\t\t\t\t?></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"return-to-dashboard\">\n\t\t\t\t<?php if ( current_user_can( 'update_core' ) && isset( $_GET['updated'] ) ) : ?>\n\t\t\t\t\t<a href=\"<?php echo esc_url( self_admin_url( 'update-core.php' ) ); ?>\">\n\t\t\t\t\t\t<?php is_multisite() ? _e( 'Return to Updates' ) : _e( 'Return to Dashboard &rarr; Updates' ); ?>\n\t\t\t\t\t</a> |\n\t\t\t\t<?php endif; ?>\n\t\t\t\t<a href=\"<?php echo esc_url( self_admin_url() ); ?>\"><?php is_blog_admin() ? _e( 'Go to Dashboard &rarr; Home' ) : _e( 'Go to Dashboard' ); ?></a>\n\t\t\t</div>\n\n\t\t</div>\n\t</div>\n<?php\n\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\n// These are strings we may use to describe maintenance/security releases, where we aim for no new strings.\nreturn;\n\n__( 'Maintenance Release' );\n__( 'Maintenance Releases' );\n\n__( 'Security Release' );\n__( 'Security Releases' );\n\n__( 'Maintenance and Security Release' );\n__( 'Maintenance and Security Releases' );\n\n/* translators: %s: WordPress version number */\n__( '<strong>Version %s</strong> addressed one security issue.' );\n/* translators: %s: WordPress version number */\n__( '<strong>Version %s</strong> addressed some security issues.' );\n\n/* translators: 1: WordPress version number, 2: plural number of bugs. */\n_n_noop( '<strong>Version %1$s</strong> addressed %2$s bug.',\n         '<strong>Version %1$s</strong> addressed %2$s bugs.' );\n\n/* translators: 1: WordPress version number, 2: plural number of bugs. Singular security issue. */\n_n_noop( '<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bug.',\n         '<strong>Version %1$s</strong> addressed a security issue and fixed %2$s bugs.' );\n\n/* translators: 1: WordPress version number, 2: plural number of bugs. More than one security issue. */\n_n_noop( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',\n         '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.' );\n\n/* translators: %s: Codex URL */\n__( 'For more information, see <a href=\"%s\">the release notes</a>.' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/admin-ajax.php",
    "content": "<?php\n/**\n * WordPress AJAX Process Execution.\n *\n * @package WordPress\n * @subpackage Administration\n *\n * @link https://codex.wordpress.org/AJAX_in_Plugins\n */\n\n/**\n * Executing AJAX process.\n *\n * @since 2.1.0\n */\ndefine( 'DOING_AJAX', true );\nif ( ! defined( 'WP_ADMIN' ) ) {\n\tdefine( 'WP_ADMIN', true );\n}\n\n/** Load WordPress Bootstrap */\nrequire_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );\n\n/** Allow for cross-domain requests (from the frontend). */\nsend_origin_headers();\n\n// Require an action parameter\nif ( empty( $_REQUEST['action'] ) )\n\tdie( '0' );\n\n/** Load WordPress Administration APIs */\nrequire_once( ABSPATH . 'wp-admin/includes/admin.php' );\n\n/** Load Ajax Handlers for WordPress Core */\nrequire_once( ABSPATH . 'wp-admin/includes/ajax-actions.php' );\n\n@header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );\n@header( 'X-Robots-Tag: noindex' );\n\nsend_nosniff_header();\nnocache_headers();\n\n/** This action is documented in wp-admin/admin.php */\ndo_action( 'admin_init' );\n\n$core_actions_get = array(\n\t'fetch-list', 'ajax-tag-search', 'wp-compression-test', 'imgedit-preview', 'oembed-cache',\n\t'autocomplete-user', 'dashboard-widgets', 'logged-in',\n);\n\n$core_actions_post = array(\n\t'oembed-cache', 'image-editor', 'delete-comment', 'delete-tag', 'delete-link',\n\t'delete-meta', 'delete-post', 'trash-post', 'untrash-post', 'delete-page', 'dim-comment',\n\t'add-link-category', 'add-tag', 'get-tagcloud', 'get-comments', 'replyto-comment',\n\t'edit-comment', 'add-menu-item', 'add-meta', 'add-user', 'closed-postboxes',\n\t'hidden-columns', 'update-welcome-panel', 'menu-get-metabox', 'wp-link-ajax',\n\t'menu-locations-save', 'menu-quick-search', 'meta-box-order', 'get-permalink',\n\t'sample-permalink', 'inline-save', 'inline-save-tax', 'find_posts', 'widgets-order',\n\t'save-widget', 'delete-inactive-widgets', 'set-post-thumbnail', 'date_format', 'time_format',\n\t'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment',\n\t'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',\n\t'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs',\n\t'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail',\n\t'parse-media-shortcode', 'destroy-sessions', 'install-plugin', 'update-plugin', 'press-this-save-post',\n\t'press-this-add-category', 'crop-image', 'generate-password', 'save-wporg-username',\n);\n\n// Deprecated\n$core_actions_post[] = 'wp-fullscreen-save-post';\n\n// Register core Ajax calls.\nif ( ! empty( $_GET['action'] ) && in_array( $_GET['action'], $core_actions_get ) )\n\tadd_action( 'wp_ajax_' . $_GET['action'], 'wp_ajax_' . str_replace( '-', '_', $_GET['action'] ), 1 );\n\nif ( ! empty( $_POST['action'] ) && in_array( $_POST['action'], $core_actions_post ) )\n\tadd_action( 'wp_ajax_' . $_POST['action'], 'wp_ajax_' . str_replace( '-', '_', $_POST['action'] ), 1 );\n\nadd_action( 'wp_ajax_nopriv_heartbeat', 'wp_ajax_nopriv_heartbeat', 1 );\n\nif ( is_user_logged_in() ) {\n\t/**\n\t * Fires authenticated AJAX actions for logged-in users.\n\t *\n\t * The dynamic portion of the hook name, `$_REQUEST['action']`,\n\t * refers to the name of the AJAX action callback being fired.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'wp_ajax_' . $_REQUEST['action'] );\n} else {\n\t/**\n\t * Fires non-authenticated AJAX actions for logged-out users.\n\t *\n\t * The dynamic portion of the hook name, `$_REQUEST['action']`,\n\t * refers to the name of the AJAX action callback being fired.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );\n}\n// Default status\ndie( '0' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/admin-footer.php",
    "content": "<?php\n/**\n * WordPress Administration Template Footer\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n// don't load directly\nif ( !defined('ABSPATH') )\n\tdie('-1');\n?>\n\n<div class=\"clear\"></div></div><!-- wpbody-content -->\n<div class=\"clear\"></div></div><!-- wpbody -->\n<div class=\"clear\"></div></div><!-- wpcontent -->\n\n<div id=\"wpfooter\" role=\"contentinfo\">\n\t<?php\n\t/**\n\t * Fires after the opening tag for the admin footer.\n\t *\n\t * @since 2.5.0\n\t */\n\tdo_action( 'in_admin_footer' );\n\t?>\n\t<p id=\"footer-left\" class=\"alignleft\">\n\t\t<?php\n\t\t$text = sprintf( __( 'Thank you for creating with <a href=\"%s\">WordPress</a>.' ), __( 'https://wordpress.org/' ) );\n\t\t/**\n\t\t * Filter the \"Thank you\" text displayed in the admin footer.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param string $text The content that will be printed.\n\t\t */\n\t\techo apply_filters( 'admin_footer_text', '<span id=\"footer-thankyou\">' . $text . '</span>' );\n\t\t?>\n\t</p>\n\t<p id=\"footer-upgrade\" class=\"alignright\">\n\t\t<?php\n\t\t/**\n\t\t * Filter the version/update text displayed in the admin footer.\n\t\t *\n\t\t * WordPress prints the current version and update information,\n\t\t * using core_update_footer() at priority 10.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @see core_update_footer()\n\t\t *\n\t\t * @param string $content The content that will be printed.\n\t\t */\n\t\techo apply_filters( 'update_footer', '' );\n\t\t?>\n\t</p>\n\t<div class=\"clear\"></div>\n</div>\n<?php\n/**\n * Print scripts or data before the default footer scripts.\n *\n * @since 1.2.0\n *\n * @param string $data The data to print.\n */\ndo_action( 'admin_footer', '' );\n\n/**\n * Prints any scripts and data queued for the footer.\n *\n * @since 2.8.0\n */\ndo_action( 'admin_print_footer_scripts' );\n\n/**\n * Print scripts or data after the default footer scripts.\n *\n * The dynamic portion of the hook name, `$GLOBALS['hook_suffix']`,\n * refers to the global hook suffix of the current page.\n *\n * @since 2.8.0\n *\n * @global string $hook_suffix\n * @param string $hook_suffix The current admin page.\n */\ndo_action( \"admin_footer-\" . $GLOBALS['hook_suffix'] );\n\n// get_site_option() won't exist when auto upgrading from <= 2.7\nif ( function_exists('get_site_option') ) {\n\tif ( false === get_site_option('can_compress_scripts') )\n\t\tcompression_test();\n}\n\n?>\n\n<div class=\"clear\"></div></div><!-- wpwrap -->\n<script type=\"text/javascript\">if(typeof wpOnload=='function')wpOnload();</script>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/admin-functions.php",
    "content": "<?php\n/**\n * Administration Functions\n *\n * This file is deprecated, use 'wp-admin/includes/admin.php' instead.\n *\n * @deprecated 2.5.0\n * @package WordPress\n * @subpackage Administration\n */\n\n_deprecated_file( basename(__FILE__), '2.5', 'wp-admin/includes/admin.php' );\n\n/** WordPress Administration API: Includes all Administration functions. */\nrequire_once(ABSPATH . 'wp-admin/includes/admin.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/admin-header.php",
    "content": "<?php\n/**\n * WordPress Administration Template Header\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));\nif ( ! defined( 'WP_ADMIN' ) )\n\trequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n/**\n * In case admin-header.php is included in a function.\n *\n * @global string    $title\n * @global string    $hook_suffix\n * @global WP_Screen $current_screen\n * @global WP_Locale $wp_locale\n * @global string    $pagenow\n * @global string    $wp_version\n * @global string    $update_title\n * @global int       $total_update_count\n * @global string    $parent_file\n */\nglobal $title, $hook_suffix, $current_screen, $wp_locale, $pagenow, $wp_version,\n\t$update_title, $total_update_count, $parent_file;\n\n// Catch plugins that include admin-header.php before admin.php completes.\nif ( empty( $current_screen ) )\n\tset_current_screen();\n\nget_admin_page_title();\n$title = esc_html( strip_tags( $title ) );\n\nif ( is_network_admin() )\n\t$admin_title = sprintf( __( 'Network Admin: %s' ), esc_html( get_current_site()->site_name ) );\nelseif ( is_user_admin() )\n\t$admin_title = sprintf( __( 'User Dashboard: %s' ), esc_html( get_current_site()->site_name ) );\nelse\n\t$admin_title = get_bloginfo( 'name' );\n\nif ( $admin_title == $title )\n\t$admin_title = sprintf( __( '%1$s &#8212; WordPress' ), $title );\nelse\n\t$admin_title = sprintf( __( '%1$s &lsaquo; %2$s &#8212; WordPress' ), $title, $admin_title );\n\n/**\n * Filter the title tag content for an admin page.\n *\n * @since 3.1.0\n *\n * @param string $admin_title The page title, with extra context added.\n * @param string $title       The original page title.\n */\n$admin_title = apply_filters( 'admin_title', $admin_title, $title );\n\nwp_user_settings();\n\n_wp_admin_html_begin();\n?>\n<title><?php echo $admin_title; ?></title>\n<?php\n\nwp_enqueue_style( 'colors' );\nwp_enqueue_style( 'ie' );\nwp_enqueue_script('utils');\nwp_enqueue_script( 'svg-painter' );\n\n$admin_body_class = preg_replace('/[^a-z0-9_-]+/i', '-', $hook_suffix);\n?>\n<script type=\"text/javascript\">\naddLoadEvent = function(func){if(typeof jQuery!=\"undefined\")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};\nvar ajaxurl = '<?php echo admin_url( 'admin-ajax.php', 'relative' ); ?>',\n\tpagenow = '<?php echo $current_screen->id; ?>',\n\ttypenow = '<?php echo $current_screen->post_type; ?>',\n\tadminpage = '<?php echo $admin_body_class; ?>',\n\tthousandsSeparator = '<?php echo addslashes( $wp_locale->number_format['thousands_sep'] ); ?>',\n\tdecimalPoint = '<?php echo addslashes( $wp_locale->number_format['decimal_point'] ); ?>',\n\tisRtl = <?php echo (int) is_rtl(); ?>;\n</script>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\">\n<?php\n\n/**\n * Enqueue scripts for all admin pages.\n *\n * @since 2.8.0\n *\n * @param string $hook_suffix The current admin page.\n */\ndo_action( 'admin_enqueue_scripts', $hook_suffix );\n\n/**\n * Fires when styles are printed for a specific admin page based on $hook_suffix.\n *\n * @since 2.6.0\n */\ndo_action( \"admin_print_styles-$hook_suffix\" );\n\n/**\n * Fires when styles are printed for all admin pages.\n *\n * @since 2.6.0\n */\ndo_action( 'admin_print_styles' );\n\n/**\n * Fires when scripts are printed for a specific admin page based on $hook_suffix.\n *\n * @since 2.1.0\n */\ndo_action( \"admin_print_scripts-$hook_suffix\" );\n\n/**\n * Fires when scripts are printed for all admin pages.\n *\n * @since 2.1.0\n */\ndo_action( 'admin_print_scripts' );\n\n/**\n * Fires in head section for a specific admin page.\n *\n * The dynamic portion of the hook, `$hook_suffix`, refers to the hook suffix\n * for the admin page.\n *\n * @since 2.1.0\n */\ndo_action( \"admin_head-$hook_suffix\" );\n\n/**\n * Fires in head section for all admin pages.\n *\n * @since 2.1.0\n */\ndo_action( 'admin_head' );\n\nif ( get_user_setting('mfold') == 'f' )\n\t$admin_body_class .= ' folded';\n\nif ( !get_user_setting('unfold') )\n\t$admin_body_class .= ' auto-fold';\n\nif ( is_admin_bar_showing() )\n\t$admin_body_class .= ' admin-bar';\n\nif ( is_rtl() )\n\t$admin_body_class .= ' rtl';\n\nif ( $current_screen->post_type )\n\t$admin_body_class .= ' post-type-' . $current_screen->post_type;\n\nif ( $current_screen->taxonomy )\n\t$admin_body_class .= ' taxonomy-' . $current_screen->taxonomy;\n\n$admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', floatval( $wp_version ) );\n$admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', $wp_version ) );\n$admin_body_class .= ' admin-color-' . sanitize_html_class( get_user_option( 'admin_color' ), 'fresh' );\n$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );\n\nif ( wp_is_mobile() )\n\t$admin_body_class .= ' mobile';\n\nif ( is_multisite() )\n\t$admin_body_class .= ' multisite';\n\nif ( is_network_admin() )\n\t$admin_body_class .= ' network-admin';\n\n$admin_body_class .= ' no-customize-support no-svg';\n\n?>\n</head>\n<?php\n/**\n * Filter the CSS classes for the body tag in the admin.\n *\n * This filter differs from the {@see 'post_class'} and {@see 'body_class'} filters\n * in two important ways:\n *\n * 1. `$classes` is a space-separated string of class names instead of an array.\n * 2. Not all core admin classes are filterable, notably: wp-admin, wp-core-ui,\n *    and no-js cannot be removed.\n *\n * @since 2.3.0\n *\n * @param string $classes Space-separated list of CSS classes.\n */\n$admin_body_classes = apply_filters( 'admin_body_class', '' );\n?>\n<body class=\"wp-admin wp-core-ui no-js <?php echo $admin_body_classes . ' ' . $admin_body_class; ?>\">\n<script type=\"text/javascript\">\n\tdocument.body.className = document.body.className.replace('no-js','js');\n</script>\n\n<?php\n// Make sure the customize body classes are correct as early as possible.\nif ( current_user_can( 'customize' ) ) {\n\twp_customize_support_script();\n}\n?>\n\n<div id=\"wpwrap\">\n<?php require(ABSPATH . 'wp-admin/menu-header.php'); ?>\n<div id=\"wpcontent\">\n\n<?php\n/**\n * Fires at the beginning of the content section in an admin page.\n *\n * @since 3.0.0\n */\ndo_action( 'in_admin_header' );\n?>\n\n<div id=\"wpbody\" role=\"main\">\n<?php\nunset($title_class, $blog_name, $total_update_count, $update_title);\n\n$current_screen->set_parentage( $parent_file );\n\n?>\n\n<div id=\"wpbody-content\" aria-label=\"<?php esc_attr_e('Main content'); ?>\" tabindex=\"0\">\n<?php\n\n$current_screen->render_screen_meta();\n\nif ( is_network_admin() ) {\n\t/**\n\t * Print network admin screen notices.\n\t *\n\t * @since 3.1.0\n\t */\n\tdo_action( 'network_admin_notices' );\n} elseif ( is_user_admin() ) {\n\t/**\n\t * Print user admin screen notices.\n\t *\n\t * @since 3.1.0\n\t */\n\tdo_action( 'user_admin_notices' );\n} else {\n\t/**\n\t * Print admin screen notices.\n\t *\n\t * @since 3.1.0\n\t */\n\tdo_action( 'admin_notices' );\n}\n\n/**\n * Print generic admin screen notices.\n *\n * @since 3.1.0\n */\ndo_action( 'all_admin_notices' );\n\nif ( $parent_file == 'options-general.php' )\n\trequire(ABSPATH . 'wp-admin/options-head.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/admin-post.php",
    "content": "<?php\n/**\n * WordPress Generic Request (POST/GET) Handler\n *\n * Intended for form submission handling in themes and plugins.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** We are located in WordPress Administration Screens */\nif ( ! defined( 'WP_ADMIN' ) ) {\n\tdefine( 'WP_ADMIN', true );\n}\n\nif ( defined('ABSPATH') )\n\trequire_once(ABSPATH . 'wp-load.php');\nelse\n\trequire_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );\n\n/** Allow for cross-domain requests (from the frontend). */\nsend_origin_headers();\n\nrequire_once(ABSPATH . 'wp-admin/includes/admin.php');\n\nnocache_headers();\n\n/** This action is documented in wp-admin/admin.php */\ndo_action( 'admin_init' );\n\n$action = empty( $_REQUEST['action'] ) ? '' : $_REQUEST['action'];\n\nif ( ! wp_validate_auth_cookie() ) {\n\tif ( empty( $action ) ) {\n\t\t/**\n\t\t * Fires on a non-authenticated admin post request where no action was supplied.\n\t\t *\n\t\t * @since 2.6.0\n\t\t */\n\t\tdo_action( 'admin_post_nopriv' );\n\t} else {\n\t\t/**\n\t\t * Fires on a non-authenticated admin post request for the given action.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$action`, refers to the given\n\t\t * request action.\n\t\t *\n\t\t * @since 2.6.0\n\t\t */\n\t\tdo_action( \"admin_post_nopriv_{$action}\" );\n\t}\n} else {\n\tif ( empty( $action ) ) {\n\t\t/**\n\t\t * Fires on an authenticated admin post request where no action was supplied.\n\t\t *\n\t\t * @since 2.6.0\n\t\t */\n\t\tdo_action( 'admin_post' );\n\t} else {\n\t\t/**\n\t\t * Fires on an authenticated admin post request for the given action.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$action`, refers to the given\n\t\t * request action.\n\t\t *\n\t\t * @since 2.6.0\n\t\t */\n\t\tdo_action( \"admin_post_{$action}\" );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/admin.php",
    "content": "<?php\n/**\n * WordPress Administration Bootstrap\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * In WordPress Administration Screens\n *\n * @since 2.3.2\n */\nif ( ! defined( 'WP_ADMIN' ) ) {\n\tdefine( 'WP_ADMIN', true );\n}\n\nif ( ! defined('WP_NETWORK_ADMIN') )\n\tdefine('WP_NETWORK_ADMIN', false);\n\nif ( ! defined('WP_USER_ADMIN') )\n\tdefine('WP_USER_ADMIN', false);\n\nif ( ! WP_NETWORK_ADMIN && ! WP_USER_ADMIN ) {\n\tdefine('WP_BLOG_ADMIN', true);\n}\n\nif ( isset($_GET['import']) && !defined('WP_LOAD_IMPORTERS') )\n\tdefine('WP_LOAD_IMPORTERS', true);\n\nrequire_once(dirname(dirname(__FILE__)) . '/wp-load.php');\n\nnocache_headers();\n\nif ( get_option('db_upgraded') ) {\n\tflush_rewrite_rules();\n\tupdate_option( 'db_upgraded',  false );\n\n\t/**\n\t * Fires on the next page load after a successful DB upgrade.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( 'after_db_upgrade' );\n} elseif ( get_option('db_version') != $wp_db_version && empty($_POST) ) {\n\tif ( !is_multisite() ) {\n\t\twp_redirect( admin_url( 'upgrade.php?_wp_http_referer=' . urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) );\n\t\texit;\n\n\t/**\n\t * Filter whether to attempt to perform the multisite DB upgrade routine.\n\t *\n\t * In single site, the user would be redirected to wp-admin/upgrade.php.\n\t * In multisite, the DB upgrade routine is automatically fired, but only\n\t * when this filter returns true.\n\t *\n\t * If the network is 50 sites or less, it will run every time. Otherwise,\n\t * it will throttle itself to reduce load.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param bool true Whether to perform the Multisite upgrade routine. Default true.\n\t */\n\t} elseif ( apply_filters( 'do_mu_upgrade', true ) ) {\n\t\t$c = get_blog_count();\n\n\t\t/*\n\t\t * If there are 50 or fewer sites, run every time. Otherwise, throttle to reduce load:\n\t\t * attempt to do no more than threshold value, with some +/- allowed.\n\t\t */\n\t\tif ( $c <= 50 || ( $c > 50 && mt_rand( 0, (int)( $c / 50 ) ) == 1 ) ) {\n\t\t\trequire_once( ABSPATH . WPINC . '/http.php' );\n\t\t\t$response = wp_remote_get( admin_url( 'upgrade.php?step=1' ), array( 'timeout' => 120, 'httpversion' => '1.1' ) );\n\t\t\t/** This action is documented in wp-admin/network/upgrade.php */\n\t\t\tdo_action( 'after_mu_upgrade', $response );\n\t\t\tunset($response);\n\t\t}\n\t\tunset($c);\n\t}\n}\n\nrequire_once(ABSPATH . 'wp-admin/includes/admin.php');\n\nauth_redirect();\n\n// Schedule trash collection\nif ( ! wp_next_scheduled( 'wp_scheduled_delete' ) && ! wp_installing() )\n\twp_schedule_event(time(), 'daily', 'wp_scheduled_delete');\n\nset_screen_options();\n\n$date_format = get_option('date_format');\n$time_format = get_option('time_format');\n\nwp_enqueue_script( 'common' );\n\n\n\n\n/**\n * $pagenow is set in vars.php\n * $wp_importers is sometimes set in wp-admin/includes/import.php\n * The remaining variables are imported as globals elsewhere, declared as globals here\n *\n * @global string $pagenow\n * @global array  $wp_importers\n * @global string $hook_suffix\n * @global string $plugin_page\n * @global string $typenow\n * @global string $taxnow\n */\nglobal $pagenow, $wp_importers, $hook_suffix, $plugin_page, $typenow, $taxnow;\n\n$page_hook = null;\n\n$editing = false;\n\nif ( isset($_GET['page']) ) {\n\t$plugin_page = wp_unslash( $_GET['page'] );\n\t$plugin_page = plugin_basename($plugin_page);\n}\n\nif ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) )\n\t$typenow = $_REQUEST['post_type'];\nelse\n\t$typenow = '';\n\nif ( isset( $_REQUEST['taxonomy'] ) && taxonomy_exists( $_REQUEST['taxonomy'] ) )\n\t$taxnow = $_REQUEST['taxonomy'];\nelse\n\t$taxnow = '';\n\nif ( WP_NETWORK_ADMIN )\n\trequire(ABSPATH . 'wp-admin/network/menu.php');\nelseif ( WP_USER_ADMIN )\n\trequire(ABSPATH . 'wp-admin/user/menu.php');\nelse\n\trequire(ABSPATH . 'wp-admin/menu.php');\n\nif ( current_user_can( 'manage_options' ) ) {\n\t/**\n\t * Filter the maximum memory limit available for administration screens.\n\t *\n\t * This only applies to administrators, who may require more memory for tasks like updates.\n\t * Memory limits when processing images (uploaded or edited by users of any role) are\n\t * handled separately.\n\t *\n\t * The WP_MAX_MEMORY_LIMIT constant specifically defines the maximum memory limit available\n\t * when in the administration back-end. The default is 256M, or 256 megabytes of memory.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string 'WP_MAX_MEMORY_LIMIT' The maximum WordPress memory limit. Default 256M.\n\t */\n\t@ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );\n}\n\n/**\n * Fires as an admin screen or script is being initialized.\n *\n * Note, this does not just run on user-facing admin screens.\n * It runs on admin-ajax.php and admin-post.php as well.\n *\n * This is roughly analgous to the more general 'init' hook, which fires earlier.\n *\n * @since 2.5.0\n */\ndo_action( 'admin_init' );\n\nif ( isset($plugin_page) ) {\n\tif ( !empty($typenow) )\n\t\t$the_parent = $pagenow . '?post_type=' . $typenow;\n\telse\n\t\t$the_parent = $pagenow;\n\tif ( ! $page_hook = get_plugin_page_hook($plugin_page, $the_parent) ) {\n\t\t$page_hook = get_plugin_page_hook($plugin_page, $plugin_page);\n\n\t\t// Backwards compatibility for plugins using add_management_page().\n\t\tif ( empty( $page_hook ) && 'edit.php' == $pagenow && '' != get_plugin_page_hook($plugin_page, 'tools.php') ) {\n\t\t\t// There could be plugin specific params on the URL, so we need the whole query string\n\t\t\tif ( !empty($_SERVER[ 'QUERY_STRING' ]) )\n\t\t\t\t$query_string = $_SERVER[ 'QUERY_STRING' ];\n\t\t\telse\n\t\t\t\t$query_string = 'page=' . $plugin_page;\n\t\t\twp_redirect( admin_url('tools.php?' . $query_string) );\n\t\t\texit;\n\t\t}\n\t}\n\tunset($the_parent);\n}\n\n$hook_suffix = '';\nif ( isset( $page_hook ) ) {\n\t$hook_suffix = $page_hook;\n} elseif ( isset( $plugin_page ) ) {\n\t$hook_suffix = $plugin_page;\n} elseif ( isset( $pagenow ) ) {\n\t$hook_suffix = $pagenow;\n}\n\nset_current_screen();\n\n// Handle plugin admin pages.\nif ( isset($plugin_page) ) {\n\tif ( $page_hook ) {\n\t\t/**\n\t\t * Fires before a particular screen is loaded.\n\t\t *\n\t\t * The load-* hook fires in a number of contexts. This hook is for plugin screens\n\t\t * where a callback is provided when the screen is registered.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$page_hook`, refers to a mixture of plugin\n\t\t * page information including:\n\t\t * 1. The page type. If the plugin page is registered as a submenu page, such as for\n\t\t *    Settings, the page type would be 'settings'. Otherwise the type is 'toplevel'.\n\t\t * 2. A separator of '_page_'.\n\t\t * 3. The plugin basename minus the file extension.\n\t\t *\n\t\t * Together, the three parts form the `$page_hook`. Citing the example above,\n\t\t * the hook name used would be 'load-settings_page_pluginbasename'.\n\t\t *\n\t\t * @see get_plugin_page_hook()\n\t\t *\n\t\t * @since 2.1.0\n\t\t */\n\t\tdo_action( 'load-' . $page_hook );\n\t\tif (! isset($_GET['noheader']))\n\t\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t/**\n\t\t * Used to call the registered callback for a plugin screen.\n\t\t *\n\t\t * @ignore\n\t\t * @since 1.5.0\n\t\t */\n\t\tdo_action( $page_hook );\n\t} else {\n\t\tif ( validate_file($plugin_page) )\n\t\t\twp_die(__('Invalid plugin page'));\n\n\t\tif ( !( file_exists(WP_PLUGIN_DIR . \"/$plugin_page\") && is_file(WP_PLUGIN_DIR . \"/$plugin_page\") ) && !( file_exists(WPMU_PLUGIN_DIR . \"/$plugin_page\") && is_file(WPMU_PLUGIN_DIR . \"/$plugin_page\") ) )\n\t\t\twp_die(sprintf(__('Cannot load %s.'), htmlentities($plugin_page)));\n\n\t\t/**\n\t\t * Fires before a particular screen is loaded.\n\t\t *\n\t\t * The load-* hook fires in a number of contexts. This hook is for plugin screens\n\t\t * where the file to load is directly included, rather than the use of a function.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$plugin_page`, refers to the plugin basename.\n\t\t *\n\t\t * @see plugin_basename()\n\t\t *\n\t\t * @since 1.5.0\n\t\t */\n\t\tdo_action( 'load-' . $plugin_page );\n\n\t\tif ( !isset($_GET['noheader']))\n\t\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\tif ( file_exists(WPMU_PLUGIN_DIR . \"/$plugin_page\") )\n\t\t\tinclude(WPMU_PLUGIN_DIR . \"/$plugin_page\");\n\t\telse\n\t\t\tinclude(WP_PLUGIN_DIR . \"/$plugin_page\");\n\t}\n\n\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n\texit();\n} elseif ( isset( $_GET['import'] ) ) {\n\n\t$importer = $_GET['import'];\n\n\tif ( ! current_user_can('import') )\n\t\twp_die(__('You are not allowed to import.'));\n\n\tif ( validate_file($importer) ) {\n\t\twp_redirect( admin_url( 'import.php?invalid=' . $importer ) );\n\t\texit;\n\t}\n\n\tif ( ! isset($wp_importers[$importer]) || ! is_callable($wp_importers[$importer][2]) ) {\n\t\twp_redirect( admin_url( 'import.php?invalid=' . $importer ) );\n\t\texit;\n\t}\n\n\t/**\n\t * Fires before an importer screen is loaded.\n\t *\n\t * The dynamic portion of the hook name, `$importer`, refers to the importer slug.\n\t *\n\t * @since 3.5.0\n\t */\n\tdo_action( 'load-importer-' . $importer );\n\n\t$parent_file = 'tools.php';\n\t$submenu_file = 'import.php';\n\t$title = __('Import');\n\n\tif (! isset($_GET['noheader']))\n\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\trequire_once(ABSPATH . 'wp-admin/includes/upgrade.php');\n\n\tdefine('WP_IMPORTING', true);\n\n\t/**\n\t * Whether to filter imported data through kses on import.\n\t *\n\t * Multisite uses this hook to filter all data through kses by default,\n\t * as a super administrator may be assisting an untrusted user.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool false Whether to force data to be filtered through kses. Default false.\n\t */\n\tif ( apply_filters( 'force_filtered_html_on_import', false ) ) {\n\t\tkses_init_filters();  // Always filter imported data with kses on multisite.\n\t}\n\n\tcall_user_func($wp_importers[$importer][2]);\n\n\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n\t// Make sure rules are flushed\n\tflush_rewrite_rules(false);\n\n\texit();\n} else {\n\t/**\n\t * Fires before a particular screen is loaded.\n\t *\n\t * The load-* hook fires in a number of contexts. This hook is for core screens.\n\t *\n\t * The dynamic portion of the hook name, `$pagenow`, is a global variable\n\t * referring to the filename of the current page, such as 'admin.php',\n\t * 'post-new.php' etc. A complete hook for the latter would be\n\t * 'load-post-new.php'.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'load-' . $pagenow );\n\n\t/*\n\t * The following hooks are fired to ensure backward compatibility.\n\t * In all other cases, 'load-' . $pagenow should be used instead.\n\t */\n\tif ( $typenow == 'page' ) {\n\t\tif ( $pagenow == 'post-new.php' )\n\t\t\tdo_action( 'load-page-new.php' );\n\t\telseif ( $pagenow == 'post.php' )\n\t\t\tdo_action( 'load-page.php' );\n\t}  elseif ( $pagenow == 'edit-tags.php' ) {\n\t\tif ( $taxnow == 'category' )\n\t\t\tdo_action( 'load-categories.php' );\n\t\telseif ( $taxnow == 'link_category' )\n\t\t\tdo_action( 'load-edit-link-categories.php' );\n\t}\n}\n\nif ( ! empty( $_REQUEST['action'] ) ) {\n\t/**\n\t * Fires when an 'action' request variable is sent.\n\t *\n\t * The dynamic portion of the hook name, `$_REQUEST['action']`,\n\t * refers to the action derived from the `GET` or `POST` request.\n\t *\n\t * @since 2.6.0\n\t */\n\tdo_action( 'admin_action_' . $_REQUEST['action'] );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/async-upload.php",
    "content": "<?php\n/**\n * Server-side file upload handler from wp-plupload, swfupload or other asynchronous upload methods.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\nif ( isset( $_REQUEST['action'] ) && 'upload-attachment' === $_REQUEST['action'] ) {\n\tdefine( 'DOING_AJAX', true );\n}\n\nif ( ! defined( 'WP_ADMIN' ) ) {\n\tdefine( 'WP_ADMIN', true );\n}\n\nif ( defined('ABSPATH') )\n\trequire_once(ABSPATH . 'wp-load.php');\nelse\n\trequire_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );\n\nif ( ! ( isset( $_REQUEST['action'] ) && 'upload-attachment' == $_REQUEST['action'] ) ) {\n\t// Flash often fails to send cookies with the POST or upload, so we need to pass it in GET or POST instead\n\tif ( is_ssl() && empty($_COOKIE[SECURE_AUTH_COOKIE]) && !empty($_REQUEST['auth_cookie']) )\n\t\t$_COOKIE[SECURE_AUTH_COOKIE] = $_REQUEST['auth_cookie'];\n\telseif ( empty($_COOKIE[AUTH_COOKIE]) && !empty($_REQUEST['auth_cookie']) )\n\t\t$_COOKIE[AUTH_COOKIE] = $_REQUEST['auth_cookie'];\n\tif ( empty($_COOKIE[LOGGED_IN_COOKIE]) && !empty($_REQUEST['logged_in_cookie']) )\n\t\t$_COOKIE[LOGGED_IN_COOKIE] = $_REQUEST['logged_in_cookie'];\n\tunset($current_user);\n}\n\nrequire_once( ABSPATH . 'wp-admin/admin.php' );\n\nheader( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );\n\nif ( isset( $_REQUEST['action'] ) && 'upload-attachment' === $_REQUEST['action'] ) {\n\tinclude( ABSPATH . 'wp-admin/includes/ajax-actions.php' );\n\n\tsend_nosniff_header();\n\tnocache_headers();\n\n\twp_ajax_upload_attachment();\n\tdie( '0' );\n}\n\nif ( ! current_user_can( 'upload_files' ) ) {\n\twp_die( __( 'You do not have permission to upload files.' ) );\n}\n\n// just fetch the detail form for that attachment\nif ( isset($_REQUEST['attachment_id']) && ($id = intval($_REQUEST['attachment_id'])) && $_REQUEST['fetch'] ) {\n\t$post = get_post( $id );\n\tif ( 'attachment' != $post->post_type )\n\t\twp_die( __( 'Unknown post type.' ) );\n\tif ( ! current_user_can( 'edit_post', $id ) )\n\t\twp_die( __( 'You are not allowed to edit this item.' ) );\n\n\tswitch ( $_REQUEST['fetch'] ) {\n\t\tcase 3 :\n\t\t\tif ( $thumb_url = wp_get_attachment_image_src( $id, 'thumbnail', true ) )\n\t\t\t\techo '<img class=\"pinkynail\" src=\"' . esc_url( $thumb_url[0] ) . '\" alt=\"\" />';\n\t\t\techo '<a class=\"edit-attachment\" href=\"' . esc_url( get_edit_post_link( $id ) ) . '\" target=\"_blank\">' . _x( 'Edit', 'media item' ) . '</a>';\n\n\t\t\t// Title shouldn't ever be empty, but use filename just in case.\n\t\t\t$file = get_attached_file( $post->ID );\n\t\t\t$title = $post->post_title ? $post->post_title : wp_basename( $file );\n\t\t\techo '<div class=\"filename new\"><span class=\"title\">' . esc_html( wp_html_excerpt( $title, 60, '&hellip;' ) ) . '</span></div>';\n\t\t\tbreak;\n\t\tcase 2 :\n\t\t\tadd_filter('attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2);\n\t\t\techo get_media_item($id, array( 'send' => false, 'delete' => true ));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tadd_filter('attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2);\n\t\t\techo get_media_item($id);\n\t\t\tbreak;\n\t}\n\texit;\n}\n\ncheck_admin_referer('media-form');\n\n$post_id = 0;\nif ( isset( $_REQUEST['post_id'] ) ) {\n\t$post_id = absint( $_REQUEST['post_id'] );\n\tif ( ! get_post( $post_id ) || ! current_user_can( 'edit_post', $post_id ) )\n\t\t$post_id = 0;\n}\n\n$id = media_handle_upload( 'async-upload', $post_id );\nif ( is_wp_error($id) ) {\n\techo '<div class=\"error-div error\">\n\t<a class=\"dismiss\" href=\"#\" onclick=\"jQuery(this).parents(\\'div.media-item\\').slideUp(200, function(){jQuery(this).remove();});\">' . __('Dismiss') . '</a>\n\t<strong>' . sprintf(__('&#8220;%s&#8221; has failed to upload.'), esc_html($_FILES['async-upload']['name']) ) . '</strong><br />' .\n\tesc_html($id->get_error_message()) . '</div>';\n\texit;\n}\n\nif ( $_REQUEST['short'] ) {\n\t// Short form response - attachment ID only.\n\techo $id;\n} else {\n\t// Long form response - big chunk o html.\n\t$type = $_REQUEST['type'];\n\n\t/**\n\t * Filter the returned ID of an uploaded attachment.\n\t *\n\t * The dynamic portion of the hook name, `$type`, refers to the attachment type,\n\t * such as 'image', 'audio', 'video', 'file', etc.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param int $id Uploaded attachment ID.\n\t */\n\techo apply_filters( \"async_upload_{$type}\", $id );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/comment.php",
    "content": "<?php\n/**\n * Comment Management Screen\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n$parent_file = 'edit-comments.php';\n$submenu_file = 'edit-comments.php';\n\n/**\n * @global string $action\n */\nglobal $action;\nwp_reset_vars( array('action') );\n\nif ( isset( $_POST['deletecomment'] ) )\n\t$action = 'deletecomment';\n\nif ( 'cdc' == $action )\n\t$action = 'delete';\nelseif ( 'mac' == $action )\n\t$action = 'approve';\n\nif ( isset( $_GET['dt'] ) ) {\n\tif ( 'spam' == $_GET['dt'] )\n\t\t$action = 'spam';\n\telseif ( 'trash' == $_GET['dt'] )\n\t\t$action = 'trash';\n}\n\nswitch( $action ) {\n\ncase 'editcomment' :\n\t$title = __('Edit Comment');\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'overview',\n\t\t'title'   => __('Overview'),\n\t\t'content' =>\n\t\t\t'<p>' . __( 'You can edit the information left in a comment if needed. This is often useful when you notice that a commenter has made a typographical error.' ) . '</p>' .\n\t\t\t'<p>' . __( 'You can also moderate the comment from this screen using the Status box, where you can also change the timestamp of the comment.' ) . '</p>'\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Administration_Screens#Comments\" target=\"_blank\">Documentation on Comments</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n\t);\n\n\twp_enqueue_script('comment');\n\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\n\t$comment_id = absint( $_GET['c'] );\n\n\tif ( !$comment = get_comment( $comment_id ) )\n\t\tcomment_footer_die( __( 'Invalid comment ID.' ) . sprintf(' <a href=\"%s\">' . __('Go back') . '</a>.', 'javascript:history.go(-1)') );\n\n\tif ( !current_user_can( 'edit_comment', $comment_id ) )\n\t\tcomment_footer_die( __('You are not allowed to edit this comment.') );\n\n\tif ( 'trash' == $comment->comment_approved )\n\t\tcomment_footer_die( __('This comment is in the Trash. Please move it out of the Trash if you want to edit it.') );\n\n\t$comment = get_comment_to_edit( $comment_id );\n\n\tinclude( ABSPATH . 'wp-admin/edit-form-comment.php' );\n\n\tbreak;\n\ncase 'delete'  :\ncase 'approve' :\ncase 'trash'   :\ncase 'spam'    :\n\n\t$title = __('Moderate Comment');\n\n\t$comment_id = absint( $_GET['c'] );\n\n\tif ( !$comment = get_comment_to_edit( $comment_id ) ) {\n\t\twp_redirect( admin_url('edit-comments.php?error=1') );\n\t\tdie();\n\t}\n\n\tif ( !current_user_can( 'edit_comment', $comment->comment_ID ) ) {\n\t\twp_redirect( admin_url('edit-comments.php?error=2') );\n\t\tdie();\n\t}\n\n\t// No need to re-approve/re-trash/re-spam a comment.\n\tif ( $action == str_replace( '1', 'approve', $comment->comment_approved ) ) {\n\t\twp_redirect( admin_url( 'edit-comments.php?same=' . $comment_id ) );\n\t\tdie();\n \t}\n\n\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\n\t$formaction    = $action . 'comment';\n\t$nonce_action  = 'approve' == $action ? 'approve-comment_' : 'delete-comment_';\n\t$nonce_action .= $comment_id;\n\n?>\n<div class=\"wrap\">\n\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<?php\nswitch ( $action ) {\n\tcase 'spam' :\n\t\t$caution_msg = __('You are about to mark the following comment as spam:');\n\t\t$button      = _x( 'Mark as Spam', 'comment' );\n\t\tbreak;\n\tcase 'trash' :\n\t\t$caution_msg = __('You are about to move the following comment to the Trash:');\n\t\t$button      = __('Move to Trash');\n\t\tbreak;\n\tcase 'delete' :\n\t\t$caution_msg = __('You are about to delete the following comment:');\n\t\t$button      = __('Permanently Delete Comment');\n\t\tbreak;\n\tdefault :\n\t\t$caution_msg = __('You are about to approve the following comment:');\n\t\t$button      = __('Approve Comment');\n\t\tbreak;\n}\n\nif ( $comment->comment_approved != '0' ) { // if not unapproved\n\t$message = '';\n\tswitch ( $comment->comment_approved ) {\n\t\tcase '1' :\n\t\t\t$message = __('This comment is currently approved.');\n\t\t\tbreak;\n\t\tcase 'spam' :\n\t\t\t$message  = __('This comment is currently marked as spam.');\n\t\t\tbreak;\n\t\tcase 'trash' :\n\t\t\t$message  = __('This comment is currently in the Trash.');\n\t\t\tbreak;\n\t}\n\tif ( $message ) {\n\t\techo '<div class=\"notice notice-info\"><p>' . $message . '</p></div>';\n\t}\n}\n?>\n<p><strong><?php _e('Caution:'); ?></strong> <?php echo $caution_msg; ?></p>\n\n<table class=\"form-table comment-ays\">\n<tr>\n<th scope=\"row\"><?php _e('Author'); ?></th>\n<td><?php echo $comment->comment_author; ?></td>\n</tr>\n<?php if ( $comment->comment_author_email ) { ?>\n<tr>\n<th scope=\"row\"><?php _e('Email'); ?></th>\n<td><?php echo $comment->comment_author_email; ?></td>\n</tr>\n<?php } ?>\n<?php if ( $comment->comment_author_url ) { ?>\n<tr>\n<th scope=\"row\"><?php _e('URL'); ?></th>\n<td><a href=\"<?php echo $comment->comment_author_url; ?>\"><?php echo $comment->comment_author_url; ?></a></td>\n</tr>\n<?php } ?>\n<tr>\n\t<th scope=\"row\"><?php /* translators: column name or table row header */ _e( 'In Response To' ); ?></th>\n\t<td>\n\t<?php\n\t\t$post_id = $comment->comment_post_ID;\n\t\tif ( current_user_can( 'edit_post', $post_id ) ) {\n\t\t\t$post_link = \"<a href='\" . esc_url( get_edit_post_link( $post_id ) ) . \"'>\";\n\t\t\t$post_link .= esc_html( get_the_title( $post_id ) ) . '</a>';\n\t\t} else {\n\t\t\t$post_link = esc_html( get_the_title( $post_id ) );\n\t\t}\n\t\techo $post_link;\n\n\t\tif ( $comment->comment_parent ) {\n\t\t\t$parent      = get_comment( $comment->comment_parent );\n\t\t\t$parent_link = esc_url( get_comment_link( $parent ) );\n\t\t\t$name        = get_comment_author( $parent );\n\t\t\tprintf(\n\t\t\t\t/* translators: %s: comment link */\n\t\t\t\t' | ' . __( 'In reply to %s.' ),\n\t\t\t\t'<a href=\"' . $parent_link . '\">' . $name . '</a>'\n\t\t\t);\n\t\t}\n\t?>\n\t</td>\n</tr>\n<tr>\n\t<th scope=\"row\"><?php _e( 'Submitted on' ); ?></th>\n\t<td>\n\t\t<a href=\"<?php echo esc_url( get_comment_link( $comment ) ); ?>\"><?php\n\t\t\t/* translators: 1: comment date, 2: comment time */\n\t\t\tprintf( __( '%1$s at %2$s' ),\n\t\t\t\t/* translators: comment date format. See http://php.net/date */\n\t\t\t\tget_comment_date( __( 'Y/m/d' ), $comment ),\n\t\t\t\tget_comment_date( get_option( 'time_format' ), $comment )\n\t\t\t);\n\t\t?></a>\n\t</td>\n</tr>\n<tr>\n<th scope=\"row\"><?php /* translators: field name in comment form */ _ex('Comment', 'noun'); ?></th>\n<td><?php echo $comment->comment_content; ?></td>\n</tr>\n</table>\n\n<form action=\"comment.php\" method=\"get\" class=\"comment-ays-submit\">\n\n<p>\n\t<?php submit_button( $button, 'primary', 'submit', false ); ?>\n\t<a href=\"<?php echo admin_url('edit-comments.php'); ?>\" class=\"button-cancel\"><?php esc_attr_e( 'Cancel' ); ?></a></td>\n</p>\n\n<?php wp_nonce_field( $nonce_action ); ?>\n<input type=\"hidden\" name=\"action\" value=\"<?php echo esc_attr($formaction); ?>\" />\n<input type=\"hidden\" name=\"c\" value=\"<?php echo esc_attr($comment->comment_ID); ?>\" />\n<input type=\"hidden\" name=\"noredir\" value=\"1\" />\n</form>\n\n</div>\n<?php\n\tbreak;\n\ncase 'deletecomment'    :\ncase 'trashcomment'     :\ncase 'untrashcomment'   :\ncase 'spamcomment'      :\ncase 'unspamcomment'    :\ncase 'approvecomment'   :\ncase 'unapprovecomment' :\n\t$comment_id = absint( $_REQUEST['c'] );\n\n\tif ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ) ) )\n\t\tcheck_admin_referer( 'approve-comment_' . $comment_id );\n\telse\n\t\tcheck_admin_referer( 'delete-comment_' . $comment_id );\n\n\t$noredir = isset($_REQUEST['noredir']);\n\n\tif ( !$comment = get_comment($comment_id) )\n\t\tcomment_footer_die( __( 'Invalid comment ID.' ) . sprintf(' <a href=\"%s\">' . __('Go back') . '</a>.', 'edit-comments.php') );\n\tif ( !current_user_can( 'edit_comment', $comment->comment_ID ) )\n\t\tcomment_footer_die( __('You are not allowed to edit comments on this post.') );\n\n\tif ( '' != wp_get_referer() && ! $noredir && false === strpos(wp_get_referer(), 'comment.php') )\n\t\t$redir = wp_get_referer();\n\telseif ( '' != wp_get_original_referer() && ! $noredir )\n\t\t$redir = wp_get_original_referer();\n\telseif ( in_array( $action, array( 'approvecomment', 'unapprovecomment' ) ) )\n\t\t$redir = admin_url('edit-comments.php?p=' . absint( $comment->comment_post_ID ) );\n\telse\n\t\t$redir = admin_url('edit-comments.php');\n\n\t$redir = remove_query_arg( array('spammed', 'unspammed', 'trashed', 'untrashed', 'deleted', 'ids', 'approved', 'unapproved'), $redir );\n\n\tswitch ( $action ) {\n\t\tcase 'deletecomment' :\n\t\t\twp_delete_comment( $comment );\n\t\t\t$redir = add_query_arg( array('deleted' => '1'), $redir );\n\t\t\tbreak;\n\t\tcase 'trashcomment' :\n\t\t\twp_trash_comment( $comment );\n\t\t\t$redir = add_query_arg( array('trashed' => '1', 'ids' => $comment_id), $redir );\n\t\t\tbreak;\n\t\tcase 'untrashcomment' :\n\t\t\twp_untrash_comment( $comment );\n\t\t\t$redir = add_query_arg( array('untrashed' => '1'), $redir );\n\t\t\tbreak;\n\t\tcase 'spamcomment' :\n\t\t\twp_spam_comment( $comment );\n\t\t\t$redir = add_query_arg( array('spammed' => '1', 'ids' => $comment_id), $redir );\n\t\t\tbreak;\n\t\tcase 'unspamcomment' :\n\t\t\twp_unspam_comment( $comment );\n\t\t\t$redir = add_query_arg( array('unspammed' => '1'), $redir );\n\t\t\tbreak;\n\t\tcase 'approvecomment' :\n\t\t\twp_set_comment_status( $comment, 'approve' );\n\t\t\t$redir = add_query_arg( array( 'approved' => 1 ), $redir );\n\t\t\tbreak;\n\t\tcase 'unapprovecomment' :\n\t\t\twp_set_comment_status( $comment, 'hold' );\n\t\t\t$redir = add_query_arg( array( 'unapproved' => 1 ), $redir );\n\t\t\tbreak;\n\t}\n\n\twp_redirect( $redir );\n\tdie;\n\ncase 'editedcomment' :\n\n\t$comment_id = absint( $_POST['comment_ID'] );\n\t$comment_post_id = absint( $_POST['comment_post_ID'] );\n\n\tcheck_admin_referer( 'update-comment_' . $comment_id );\n\n\tedit_comment();\n\n\t$location = ( empty( $_POST['referredby'] ) ? \"edit-comments.php?p=$comment_post_id\" : $_POST['referredby'] ) . '#comment-' . $comment_id;\n\n\t/**\n\t * Filter the URI the user is redirected to after editing a comment in the admin.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $location The URI the user will be redirected to.\n\t * @param int $comment_id The ID of the comment being edited.\n\t */\n\t$location = apply_filters( 'comment_edit_redirect', $location, $comment_id );\n\twp_redirect( $location );\n\n\texit();\n\ndefault:\n\twp_die( __('Unknown action.') );\n\n} // end switch\n\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/credits.php",
    "content": "<?php\n/**\n * Credits administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\nrequire_once( dirname( __FILE__ ) . '/includes/credits.php' );\n\n$title = __( 'Credits' );\n\nlist( $display_version ) = explode( '-', $wp_version );\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n<div class=\"wrap about-wrap\">\n\n<h1><?php printf( __( 'Welcome to WordPress %s' ), $display_version ); ?></h1>\n\n<div class=\"about-text\"><?php printf( __( 'Thank you for updating! WordPress %s makes your site more connected and responsive.' ), $display_version ); ?></div>\n\n<div class=\"wp-badge\"><?php printf( __( 'Version %s' ), $display_version ); ?></div>\n\n<h2 class=\"nav-tab-wrapper\">\n\t<a href=\"about.php\" class=\"nav-tab\"><?php _e( 'What&#8217;s New' ); ?></a>\n\t<a href=\"credits.php\" class=\"nav-tab nav-tab-active\"><?php _e( 'Credits' ); ?></a>\n\t<a href=\"freedoms.php\" class=\"nav-tab\"><?php _e( 'Freedoms' ); ?></a>\n</h2>\n\n<?php\n\n$credits = wp_credits();\n\nif ( ! $credits ) {\n\techo '<p class=\"about-description\">' . sprintf( __( 'WordPress is created by a <a href=\"%1$s\">worldwide team</a> of passionate individuals. <a href=\"%2$s\">Get involved in WordPress</a>.' ),\n\t\t'https://wordpress.org/about/',\n\t\t/* translators: Url to the codex documentation on contributing to WordPress used on the credits page */\n\t\t__( 'https://codex.wordpress.org/Contributing_to_WordPress' ) ) . '</p>';\n\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\texit;\n}\n\necho '<p class=\"about-description\">' . __( 'WordPress is created by a worldwide team of passionate individuals.' ) . \"</p>\\n\";\n\nforeach ( $credits['groups'] as $group_slug => $group_data ) {\n\tif ( $group_data['name'] ) {\n\t\tif ( 'Translators' == $group_data['name'] ) {\n\t\t\t// Considered a special slug in the API response. (Also, will never be returned for en_US.)\n\t\t\t$title = _x( 'Translators', 'Translate this to be the equivalent of English Translators in your language for the credits page Translators section' );\n\t\t} elseif ( isset( $group_data['placeholders'] ) ) {\n\t\t\t$title = vsprintf( translate( $group_data['name'] ), $group_data['placeholders'] );\n\t\t} else {\n\t\t\t$title = translate( $group_data['name'] );\n\t\t}\n\n\t\techo '<h3 class=\"wp-people-group\">' . esc_html( $title ) . \"</h3>\\n\";\n\t}\n\n\tif ( ! empty( $group_data['shuffle'] ) )\n\t\tshuffle( $group_data['data'] ); // We were going to sort by ability to pronounce \"hierarchical,\" but that wouldn't be fair to Matt.\n\n\tswitch ( $group_data['type'] ) {\n\t\tcase 'list' :\n\t\t\tarray_walk( $group_data['data'], '_wp_credits_add_profile_link', $credits['data']['profiles'] );\n\t\t\techo '<p class=\"wp-credits-list\">' . wp_sprintf( '%l.', $group_data['data'] ) . \"</p>\\n\\n\";\n\t\t\tbreak;\n\t\tcase 'libraries' :\n\t\t\tarray_walk( $group_data['data'], '_wp_credits_build_object_link' );\n\t\t\techo '<p class=\"wp-credits-list\">' . wp_sprintf( '%l.', $group_data['data'] ) . \"</p>\\n\\n\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t$compact = 'compact' == $group_data['type'];\n\t\t\t$classes = 'wp-people-group ' . ( $compact ? 'compact' : '' );\n\t\t\techo '<ul class=\"' . $classes . '\" id=\"wp-people-group-' . $group_slug . '\">' . \"\\n\";\n\t\t\tforeach ( $group_data['data'] as $person_data ) {\n\t\t\t\techo '<li class=\"wp-person\" id=\"wp-person-' . esc_attr( $person_data[2] ) . '\">' . \"\\n\\t\";\n\t\t\t\techo '<a href=\"' . esc_url( sprintf( $credits['data']['profiles'], $person_data[2] ) ) . '\">';\n\t\t\t\t$size = 'compact' == $group_data['type'] ? 30 : 60;\n\t\t\t\t$data = get_avatar_data( $person_data[1] . '@md5.gravatar.com', array( 'size' => $size ) );\n\t\t\t\t$size *= 2;\n\t\t\t\t$data2x = get_avatar_data( $person_data[1] . '@md5.gravatar.com', array( 'size' => $size ) );\n\t\t\t\techo '<img src=\"' . esc_url( $data['url'] ) . '\" srcset=\"' . esc_url( $data2x['url'] ) . ' 2x\" class=\"gravatar\" alt=\"' . esc_attr( $person_data[0] ) . '\" /></a>' . \"\\n\\t\";\n\t\t\t\techo '<a class=\"web\" href=\"' . esc_url( sprintf( $credits['data']['profiles'], $person_data[2] ) ) . '\">' . esc_html( $person_data[0] ) . \"</a>\\n\\t\";\n\t\t\t\tif ( ! $compact )\n\t\t\t\t\techo '<span class=\"title\">' . translate( $person_data[3] ) . \"</span>\\n\";\n\t\t\t\techo \"</li>\\n\";\n\t\t\t}\n\t\t\techo \"</ul>\\n\";\n\t\tbreak;\n\t}\n}\n\n?>\n<p class=\"clear\"><?php printf( __( 'Want to see your name in lights on this page? <a href=\"%s\">Get involved in WordPress</a>.' ),\n\t/* translators: URL to the Make WordPress 'Get Involved' landing page used on the credits page */\n\t__( 'https://make.wordpress.org/' ) ); ?></p>\n\n</div>\n<?php\n\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\nreturn;\n\n// These are strings returned by the API that we want to be translatable\n__( 'Project Leaders' );\n__( 'Extended Core Team' );\n__( 'Core Developers' );\n__( 'Recent Rockstars' );\n__( 'Core Contributors to WordPress %s' );\n__( 'Contributing Developers' );\n__( 'Cofounder, Project Lead' );\n__( 'Lead Developer' );\n__( 'Release Lead' );\n__( 'User Experience Lead' );\n__( 'Core Developer' );\n__( 'Core Committer' );\n__( 'Guest Committer' );\n__( 'Developer' );\n__( 'Designer' );\n__( 'Docs Committer' );\n__( 'XML-RPC' );\n__( 'Internationalization' );\n__( 'External Libraries' );\n__( 'Icon Design' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/about-rtl.css",
    "content": "/*------------------------------------------------------------------------------\n  22.0 - About Pages\n\n   1.0 Global: About, Credits, Freedoms\n    1.1 Typography\n    1.2 Structure\n    1.3 Point Releases\n   2.0 About Page\n    2.1 Typography\n    2.2 Structure\n   3.0 Credits & Freedoms Pages\n------------------------------------------------------------------------------*/\n\n/*------------------------------------------------------------------------------\n  1.0 - Global: About, Credits, Freedoms\n------------------------------------------------------------------------------*/\n\n.about-wrap {\n\tposition: relative;\n\tmargin: 25px 20px 0 40px;\n\tmax-width: 1050px; /* readability */\n\tfont-size: 15px;\n}\n\n.about-wrap div.updated,\n.about-wrap div.error,\n.about-wrap .notice {\n\tdisplay: none !important;\n}\n\n.about-wrap hr {\n\tborder: 0;\n\theight: 0;\n\tmargin: 0;\n\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.about-wrap img {\n\tmargin: 0;\n\tmax-width: 100%;\n\theight: auto;\n\tvertical-align: middle;\n}\n\n.about-wrap .jetpack-video-wrapper {\n\tmargin-bottom: 0;\n}\n\n/* WordPress Version Badge */\n\n.wp-badge {\n\tbackground: #0073aa url(../images/w-logo-white.png?ver=20131202) no-repeat;\n\tbackground-position: center 24px;\n\t-webkit-background-size: 85px 85px;\n\tbackground-size: 85px 85px;\n\tcolor: #78c8e6;\n\tfont-size: 14px;\n\ttext-align: center;\n\tfont-weight: 600;\n\tmargin: 5px 0 0;\n\tpadding-top: 120px;\n\theight: 40px;\n\tdisplay: inline-block;\n\twidth: 150px;\n\ttext-rendering: optimizeLegibility;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.2);\n}\n\n.svg .wp-badge {\n\tbackground-image: url(../images/wordpress-logo-white.svg?ver=20131110);\n}\n\n.about-wrap .wp-badge {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n/* Tabs */\n\n.about-wrap .nav-tab {\n\tpadding-left: 15px;\n\tpadding-right: 15px;\n\tfont-size: 18px;\n}\n\n/* 1.1 - Typography */\n\n.about-wrap p {\n\tline-height: 1.6em;\n\tfont-size: 14px;\n}\n\n.about-wrap h1 {\n\tmargin: 0.2em 0 0 200px;\n\tpadding: 0;\n\tcolor: #32373c;\n\tline-height: 1.2em;\n\tfont-size: 2.8em;\n\tfont-weight: 400;\n}\n\n.about-wrap h3 {\n\tmargin: 1.25em 0 .6em;\n\tfont-size: 1.25em;\n\tline-height: 1.5em;\n}\n\n.about-wrap h4 {\n\tcolor: #23282d;\n}\n\n.about-wrap code,\n.about-wrap ol li p {\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.about-wrap .about-description,\n.about-wrap .about-text {\n\tmargin-top: 1.4em;\n\tfont-weight: normal;\n\tline-height: 1.6em;\n\tfont-size: 19px;\n}\n\n.about-wrap .about-text {\n\tmargin: 1em 0 1em 200px;\n\tmin-height: 60px;\n\tcolor: #777;\n}\n\n/* 1.2 - Structure */\n\n.about-wrap [class$=col] .col {\n\tfloat: right;\n\tposition: relative;\n}\n.about-wrap .two-col .col {\n\tmargin-left: 4.799999999%;\n\twidth: 47.6%;\n}\n.about-wrap .feature-section.two-col .col {\n\tdisplay: inline-block;\n\tfloat: none;\n\tmargin-left: 4.799999999%;\n\twidth: calc( 47.6% - 4px );\n\tvertical-align: middle;\n}\n\n.about-wrap .three-col .col {\n\tmargin-left: 4.999999999%;\n\twidth: 29.95%;\n}\n\n.about-wrap .two-col .col:nth-of-type(2n),\n.about-wrap .three-col .col:nth-of-type(3n) {\n\tmargin-left: 0;\n}\n\n/* 1.3 - Point Releases */\n\n.about-wrap .point-releases {\n\tmargin-top: 5px;\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n.about-wrap .changelog.point-releases h3 {\n\tpadding-top: 35px;\n}\n\n.about-wrap .changelog.point-releases h3:first-child {\n\tpadding-top: 7px;\n}\n\n/*------------------------------------------------------------------------------\n  2.0 - About Page\n------------------------------------------------------------------------------*/\n\n/* 2.1 - Typography */\n\n.about-wrap .headline-feature h2 {\n\tmargin: 30px 0 30px;\n\tfont-size: 2.2em;\n\tfont-weight: 300;\n\tline-height: 1.3;\n\ttext-align: center;\n}\n\n.about-wrap .headline-feature h3 {\n\tmargin-top: 0;\n\ttext-align: right;\n}\n\n.about-wrap .feature-section.two-col h3 {\n\tmargin-top: 0;\n}\n\n.about-wrap .feature-list h2 {\n\tmargin: 30px 0 15px;\n\ttext-align: center;\n}\n\n.about-wrap .feature-section h4 {\n\tmargin: 1.4em 0 0.6em 0;\n\tfont-size: 1em;\n}\n\n.about-wrap .feature-section p {\n\tmargin-top: 0.6em;\n}\n\n.about-wrap .two-col-text {\n\t-webkit-column-count: 2;\n\t-moz-column-count: 2;\n\tcolumn-count: 2;\n\t-webkit-column-gap: 40px;\n\t-moz-column-gap: 40px;\n\tcolumn-gap: 40px;\n}\n\n.about-wrap .two-col-text p:first-of-type {\n\tmargin-top: 0;\n}\n\n/* 2.2 - Structure */\n\n.about-wrap .headline-feature.feature-video {\n\tposition: relative;\n\tmargin: 40px 0;\n\tpadding-bottom: 56.25%;\n\twidth: 100%;\n\tmax-width: 100%;\n\theight: 0;\n\ttext-align: center;\n}\n\n.about-wrap .feature-video embed {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.about-wrap .featured-image {\n\ttext-align: center;\n}\n\n.about-wrap .feature-section {\n\toverflow: hidden;\n\tpadding: 0 0 40px;\n}\n\n.about-wrap .headline-feature {\n\tmargin: 0 auto;\n\tmax-width: 80%;\n}\n\n.about-wrap .feature-section .media-container {\n\toverflow: hidden;\n}\n\n.about-wrap .headline-feature .col {\n\twidth: 65.2%;\n}\n\n.about-wrap .headline-feature .col.feature-image {\n\twidth: 30%;\n}\n\n.about-wrap .headline-feature .vertical-screen {\n\tfloat: left;\n\tmargin-right: 40px;\n\tmax-width: 100%;\n}\n\n.about-wrap .headline-feature .horizontal-screen {\n\tmargin-top: 20px;\n\tmax-width: 100%;\n}\n\n.about-wrap .embed-container {\n\ttext-align: center;\n}\n\n.about-wrap .embed-container iframe {\n\tmax-width: 100%;\n}\n\n.about-wrap .wp-embedded-content {\n\tmax-width: 100%;\n}\n\n.about-wrap .feature-section:not(.under-the-hood) .col {\n\tmargin-top: 40px;\n}\n\n.about-wrap .changelog {\n\tmargin-bottom: 40px;\n}\n\n.about-wrap .changelog.feature-section .col {\n\tmargin-top: 40px;\n}\n\n/* Return to Dashboard Home link */\n\n.about-wrap .return-to-dashboard {\n\tmargin: 30px -5px 0 0;\n\tfont-size: 14px;\n\tfont-weight: bold;\n}\n\n.about-wrap .return-to-dashboard a {\n\ttext-decoration: none;\n\tpadding: 0 5px;\n}\n\n.about-wrap .feature-list.finer-points h4,\n.about-wrap .feature-list.finer-points p {\n\tmargin-right: 115px;\n}\n\n/*------------------------------------------------------------------------------\n  3.0 - Credits & Freedoms Pages\n------------------------------------------------------------------------------*/\n\n/* Credits */\n\n.about-wrap h3.wp-people-group {\n\tmargin: 2.6em 0 1.33em;\n\tfont-size: 16px;\n\tline-height: inherit;\n}\n\n.about-wrap ul.wp-people-group {\n\toverflow: hidden;\n\tpadding: 0 5px;\n\tmargin: 0 -5px 0 -15px;\n}\n\n.about-wrap ul.compact {\n\tmargin-bottom: 0\n}\n\n.about-wrap li.wp-person {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tmargin-left: 10px;\n\tpadding-bottom: 15px;\n\theight: 70px;\n\twidth: 280px;\n}\n\n.about-wrap ul.compact li.wp-person {\n\theight: auto;\n\twidth: 180px;\n\tpadding-bottom: 0;\n\tmargin-bottom: 0;\n}\n\n.about-wrap li.wp-person img.gravatar {\n\tfloat: right;\n\tmargin: 0 0 10px 10px;\n\tpadding: 2px;\n\twidth: 60px;\n\theight: 60px;\n}\n\n.about-wrap ul.compact li.wp-person img.gravatar {\n\twidth: 30px;\n\theight: 30px;\n}\n\n.about-wrap li.wp-person a.web {\n\tdisplay: block;\n\tmargin: 6px 0 2px;\n\tfont-size: 16px;\n\tfont-weight: normal;\n\tline-height: 1.6em;\n\ttext-decoration: none;\n}\n\n.about-wrap #wp-people-group-validators + p.wp-credits-list {\n\tmargin-top: 0;\n}\n\n.about-wrap p.wp-credits-list a {\n\twhite-space: nowrap;\n}\n\n/* Freedoms */\n\n.freedoms-php .about-wrap ol {\n\tmargin: 40px 60px;\n}\n\n.freedoms-php .about-wrap ol li {\n\tlist-style-type: decimal;\n\tfont-weight: bold;\n}\n\n.freedoms-php .about-wrap ol p {\n\tfont-weight: normal;\n\tmargin: 0.6em 0;\n}\n\n/*------------------------------------------------------------------------------\n  4.0 - Media Queries\n------------------------------------------------------------------------------*/\n\n@media screen and ( max-width: 782px ) {\n\t.about-wrap .feature-section {\n\t\tpadding: 0;\n\t\tborder-bottom: none;\n\t}\n\n\t.about-wrap [class$=col] .col {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin: 40px 0 0;\n\t\tpadding: 0 0 40px;\n\t}\n\n\t.about-wrap .headline-feature {\n\t\tposition: relative;\n\t}\n\n\t.about-wrap .headline-feature .col.feature-image {\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\twidth: 40%;\n\t}\n\n\t.about-wrap .headline-feature .horizontal-image {\n\t\tposition: relative;\n\t}\n\n\t.about-wrap .headline-feature .horizontal-image:before {\n\t\tdisplay: block;\n\t\tcontent: \"\";\n\t\twidth: 100%;\n\t\tpadding-top: 80%;\n\t}\n\n\t.about-wrap .headline-feature .horizontal-image > .content {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tleft: 0;\n\t\tbottom: 0;\n\t}\n\n\t.about-wrap .headline-feature .horizontal-image img {\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t}\n\n\t.about-wrap .two-col-text {\n\t\t-webkit-column-count: 1;\n\t\t-moz-column-count: 1;\n\t\tcolumn-count: 1;\n\t}\n\n\t.about-wrap .three-col img {\n\t\tdisplay: block;\n\t\tmargin: 0 auto;\n\t}\n\n\t.about-wrap .feature-list .col {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tborder-bottom: none;\n\t}\n\n\t.about-wrap .headline-feature .feature-section {\n\t\tmax-width: 100%;\n\t}\n\n\t.about-wrap .feature-list .feature-section {\n\t\tpadding: 0 0 40px;\n\t}\n}\n\n@media only screen and (max-width: 500px) {\n\t.about-wrap {\n\t\tmargin-left: 20px;\n\t\tmargin-right: 10px;\n\t}\n\n\t.about-wrap h1,\n\t.about-wrap .about-text {\n\t\tmargin-left: 0;\n\t}\n\n\t.about-wrap .about-text {\n\t\tmargin-bottom: 0.25em;\n\t}\n\n\t.about-wrap .wp-badge {\n\t\tposition: relative;\n\t\tmargin-bottom: 1.5em;\n\t\twidth: 100%;\n\t}\n\n\t.about-wrap .feature-section.two-col .col,\n\t.about-wrap .three-col .col,\n\t.about-wrap .headline-feature .feature-section .col {\n\t\twidth: 100% !important;\n\t\tfloat: none !important;\n\t}\n\n\t.about-wrap .feature-section.two-col .col:last-of-type {\n\t\tmargin-top: 0;\n\t}\n\n\t.feature-section.under-the-hood.three-col .col,\n\t.feature-section.under-the-hood.one-col .col {\n\t\tpadding-bottom: 0;\n\t}\n}\n\n@media only screen and (max-width: 400px) {\n\t.about-wrap .feature-list svg {\n\t\tmargin-top: 15px;\n\t\theight: 65px;\n\t\twidth: 65px;\n\t}\n\t.about-wrap .feature-list.finer-points h4,\n\t.about-wrap .feature-list.finer-points p {\n\t\tmargin-right: 80px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/about.css",
    "content": "/*------------------------------------------------------------------------------\n  22.0 - About Pages\n\n   1.0 Global: About, Credits, Freedoms\n    1.1 Typography\n    1.2 Structure\n    1.3 Point Releases\n   2.0 About Page\n    2.1 Typography\n    2.2 Structure\n   3.0 Credits & Freedoms Pages\n------------------------------------------------------------------------------*/\n\n/*------------------------------------------------------------------------------\n  1.0 - Global: About, Credits, Freedoms\n------------------------------------------------------------------------------*/\n\n.about-wrap {\n\tposition: relative;\n\tmargin: 25px 40px 0 20px;\n\tmax-width: 1050px; /* readability */\n\tfont-size: 15px;\n}\n\n.about-wrap div.updated,\n.about-wrap div.error,\n.about-wrap .notice {\n\tdisplay: none !important;\n}\n\n.about-wrap hr {\n\tborder: 0;\n\theight: 0;\n\tmargin: 0;\n\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.about-wrap img {\n\tmargin: 0;\n\tmax-width: 100%;\n\theight: auto;\n\tvertical-align: middle;\n}\n\n.about-wrap .jetpack-video-wrapper {\n\tmargin-bottom: 0;\n}\n\n/* WordPress Version Badge */\n\n.wp-badge {\n\tbackground: #0073aa url(../images/w-logo-white.png?ver=20131202) no-repeat;\n\tbackground-position: center 24px;\n\t-webkit-background-size: 85px 85px;\n\tbackground-size: 85px 85px;\n\tcolor: #78c8e6;\n\tfont-size: 14px;\n\ttext-align: center;\n\tfont-weight: 600;\n\tmargin: 5px 0 0;\n\tpadding-top: 120px;\n\theight: 40px;\n\tdisplay: inline-block;\n\twidth: 150px;\n\ttext-rendering: optimizeLegibility;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.2);\n}\n\n.svg .wp-badge {\n\tbackground-image: url(../images/wordpress-logo-white.svg?ver=20131110);\n}\n\n.about-wrap .wp-badge {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n}\n\n/* Tabs */\n\n.about-wrap .nav-tab {\n\tpadding-right: 15px;\n\tpadding-left: 15px;\n\tfont-size: 18px;\n}\n\n/* 1.1 - Typography */\n\n.about-wrap p {\n\tline-height: 1.6em;\n\tfont-size: 14px;\n}\n\n.about-wrap h1 {\n\tmargin: 0.2em 200px 0 0;\n\tpadding: 0;\n\tcolor: #32373c;\n\tline-height: 1.2em;\n\tfont-size: 2.8em;\n\tfont-weight: 400;\n}\n\n.about-wrap h3 {\n\tmargin: 1.25em 0 .6em;\n\tfont-size: 1.25em;\n\tline-height: 1.5em;\n}\n\n.about-wrap h4 {\n\tcolor: #23282d;\n}\n\n.about-wrap code,\n.about-wrap ol li p {\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.about-wrap .about-description,\n.about-wrap .about-text {\n\tmargin-top: 1.4em;\n\tfont-weight: normal;\n\tline-height: 1.6em;\n\tfont-size: 19px;\n}\n\n.about-wrap .about-text {\n\tmargin: 1em 200px 1em 0;\n\tmin-height: 60px;\n\tcolor: #777;\n}\n\n/* 1.2 - Structure */\n\n.about-wrap [class$=col] .col {\n\tfloat: left;\n\tposition: relative;\n}\n.about-wrap .two-col .col {\n\tmargin-right: 4.799999999%;\n\twidth: 47.6%;\n}\n.about-wrap .feature-section.two-col .col {\n\tdisplay: inline-block;\n\tfloat: none;\n\tmargin-right: 4.799999999%;\n\twidth: calc( 47.6% - 4px );\n\tvertical-align: middle;\n}\n\n.about-wrap .three-col .col {\n\tmargin-right: 4.999999999%;\n\twidth: 29.95%;\n}\n\n.about-wrap .two-col .col:nth-of-type(2n),\n.about-wrap .three-col .col:nth-of-type(3n) {\n\tmargin-right: 0;\n}\n\n/* 1.3 - Point Releases */\n\n.about-wrap .point-releases {\n\tmargin-top: 5px;\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n.about-wrap .changelog.point-releases h3 {\n\tpadding-top: 35px;\n}\n\n.about-wrap .changelog.point-releases h3:first-child {\n\tpadding-top: 7px;\n}\n\n/*------------------------------------------------------------------------------\n  2.0 - About Page\n------------------------------------------------------------------------------*/\n\n/* 2.1 - Typography */\n\n.about-wrap .headline-feature h2 {\n\tmargin: 30px 0 30px;\n\tfont-size: 2.2em;\n\tfont-weight: 300;\n\tline-height: 1.3;\n\ttext-align: center;\n}\n\n.about-wrap .headline-feature h3 {\n\tmargin-top: 0;\n\ttext-align: left;\n}\n\n.about-wrap .feature-section.two-col h3 {\n\tmargin-top: 0;\n}\n\n.about-wrap .feature-list h2 {\n\tmargin: 30px 0 15px;\n\ttext-align: center;\n}\n\n.about-wrap .feature-section h4 {\n\tmargin: 1.4em 0 0.6em 0;\n\tfont-size: 1em;\n}\n\n.about-wrap .feature-section p {\n\tmargin-top: 0.6em;\n}\n\n.about-wrap .two-col-text {\n\t-webkit-column-count: 2;\n\t-moz-column-count: 2;\n\tcolumn-count: 2;\n\t-webkit-column-gap: 40px;\n\t-moz-column-gap: 40px;\n\tcolumn-gap: 40px;\n}\n\n.about-wrap .two-col-text p:first-of-type {\n\tmargin-top: 0;\n}\n\n/* 2.2 - Structure */\n\n.about-wrap .headline-feature.feature-video {\n\tposition: relative;\n\tmargin: 40px 0;\n\tpadding-bottom: 56.25%;\n\twidth: 100%;\n\tmax-width: 100%;\n\theight: 0;\n\ttext-align: center;\n}\n\n.about-wrap .feature-video embed {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.about-wrap .featured-image {\n\ttext-align: center;\n}\n\n.about-wrap .feature-section {\n\toverflow: hidden;\n\tpadding: 0 0 40px;\n}\n\n.about-wrap .headline-feature {\n\tmargin: 0 auto;\n\tmax-width: 80%;\n}\n\n.about-wrap .feature-section .media-container {\n\toverflow: hidden;\n}\n\n.about-wrap .headline-feature .col {\n\twidth: 65.2%;\n}\n\n.about-wrap .headline-feature .col.feature-image {\n\twidth: 30%;\n}\n\n.about-wrap .headline-feature .vertical-screen {\n\tfloat: right;\n\tmargin-left: 40px;\n\tmax-width: 100%;\n}\n\n.about-wrap .headline-feature .horizontal-screen {\n\tmargin-top: 20px;\n\tmax-width: 100%;\n}\n\n.about-wrap .embed-container {\n\ttext-align: center;\n}\n\n.about-wrap .embed-container iframe {\n\tmax-width: 100%;\n}\n\n.about-wrap .wp-embedded-content {\n\tmax-width: 100%;\n}\n\n.about-wrap .feature-section:not(.under-the-hood) .col {\n\tmargin-top: 40px;\n}\n\n.about-wrap .changelog {\n\tmargin-bottom: 40px;\n}\n\n.about-wrap .changelog.feature-section .col {\n\tmargin-top: 40px;\n}\n\n/* Return to Dashboard Home link */\n\n.about-wrap .return-to-dashboard {\n\tmargin: 30px 0 0 -5px;\n\tfont-size: 14px;\n\tfont-weight: bold;\n}\n\n.about-wrap .return-to-dashboard a {\n\ttext-decoration: none;\n\tpadding: 0 5px;\n}\n\n.about-wrap .feature-list.finer-points h4,\n.about-wrap .feature-list.finer-points p {\n\tmargin-left: 115px;\n}\n\n/*------------------------------------------------------------------------------\n  3.0 - Credits & Freedoms Pages\n------------------------------------------------------------------------------*/\n\n/* Credits */\n\n.about-wrap h3.wp-people-group {\n\tmargin: 2.6em 0 1.33em;\n\tfont-size: 16px;\n\tline-height: inherit;\n}\n\n.about-wrap ul.wp-people-group {\n\toverflow: hidden;\n\tpadding: 0 5px;\n\tmargin: 0 -15px 0 -5px;\n}\n\n.about-wrap ul.compact {\n\tmargin-bottom: 0\n}\n\n.about-wrap li.wp-person {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tmargin-right: 10px;\n\tpadding-bottom: 15px;\n\theight: 70px;\n\twidth: 280px;\n}\n\n.about-wrap ul.compact li.wp-person {\n\theight: auto;\n\twidth: 180px;\n\tpadding-bottom: 0;\n\tmargin-bottom: 0;\n}\n\n.about-wrap li.wp-person img.gravatar {\n\tfloat: left;\n\tmargin: 0 10px 10px 0;\n\tpadding: 2px;\n\twidth: 60px;\n\theight: 60px;\n}\n\n.about-wrap ul.compact li.wp-person img.gravatar {\n\twidth: 30px;\n\theight: 30px;\n}\n\n.about-wrap li.wp-person a.web {\n\tdisplay: block;\n\tmargin: 6px 0 2px;\n\tfont-size: 16px;\n\tfont-weight: normal;\n\tline-height: 1.6em;\n\ttext-decoration: none;\n}\n\n.about-wrap #wp-people-group-validators + p.wp-credits-list {\n\tmargin-top: 0;\n}\n\n.about-wrap p.wp-credits-list a {\n\twhite-space: nowrap;\n}\n\n/* Freedoms */\n\n.freedoms-php .about-wrap ol {\n\tmargin: 40px 60px;\n}\n\n.freedoms-php .about-wrap ol li {\n\tlist-style-type: decimal;\n\tfont-weight: bold;\n}\n\n.freedoms-php .about-wrap ol p {\n\tfont-weight: normal;\n\tmargin: 0.6em 0;\n}\n\n/*------------------------------------------------------------------------------\n  4.0 - Media Queries\n------------------------------------------------------------------------------*/\n\n@media screen and ( max-width: 782px ) {\n\t.about-wrap .feature-section {\n\t\tpadding: 0;\n\t\tborder-bottom: none;\n\t}\n\n\t.about-wrap [class$=col] .col {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin: 40px 0 0;\n\t\tpadding: 0 0 40px;\n\t}\n\n\t.about-wrap .headline-feature {\n\t\tposition: relative;\n\t}\n\n\t.about-wrap .headline-feature .col.feature-image {\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: 40%;\n\t}\n\n\t.about-wrap .headline-feature .horizontal-image {\n\t\tposition: relative;\n\t}\n\n\t.about-wrap .headline-feature .horizontal-image:before {\n\t\tdisplay: block;\n\t\tcontent: \"\";\n\t\twidth: 100%;\n\t\tpadding-top: 80%;\n\t}\n\n\t.about-wrap .headline-feature .horizontal-image > .content {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t}\n\n\t.about-wrap .headline-feature .horizontal-image img {\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t}\n\n\t.about-wrap .two-col-text {\n\t\t-webkit-column-count: 1;\n\t\t-moz-column-count: 1;\n\t\tcolumn-count: 1;\n\t}\n\n\t.about-wrap .three-col img {\n\t\tdisplay: block;\n\t\tmargin: 0 auto;\n\t}\n\n\t.about-wrap .feature-list .col {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tborder-bottom: none;\n\t}\n\n\t.about-wrap .headline-feature .feature-section {\n\t\tmax-width: 100%;\n\t}\n\n\t.about-wrap .feature-list .feature-section {\n\t\tpadding: 0 0 40px;\n\t}\n}\n\n@media only screen and (max-width: 500px) {\n\t.about-wrap {\n\t\tmargin-right: 20px;\n\t\tmargin-left: 10px;\n\t}\n\n\t.about-wrap h1,\n\t.about-wrap .about-text {\n\t\tmargin-right: 0;\n\t}\n\n\t.about-wrap .about-text {\n\t\tmargin-bottom: 0.25em;\n\t}\n\n\t.about-wrap .wp-badge {\n\t\tposition: relative;\n\t\tmargin-bottom: 1.5em;\n\t\twidth: 100%;\n\t}\n\n\t.about-wrap .feature-section.two-col .col,\n\t.about-wrap .three-col .col,\n\t.about-wrap .headline-feature .feature-section .col {\n\t\twidth: 100% !important;\n\t\tfloat: none !important;\n\t}\n\n\t.about-wrap .feature-section.two-col .col:last-of-type {\n\t\tmargin-top: 0;\n\t}\n\n\t.feature-section.under-the-hood.three-col .col,\n\t.feature-section.under-the-hood.one-col .col {\n\t\tpadding-bottom: 0;\n\t}\n}\n\n@media only screen and (max-width: 400px) {\n\t.about-wrap .feature-list svg {\n\t\tmargin-top: 15px;\n\t\theight: 65px;\n\t\twidth: 65px;\n\t}\n\t.about-wrap .feature-list.finer-points h4,\n\t.about-wrap .feature-list.finer-points p {\n\t\tmargin-left: 80px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/admin-menu-rtl.css",
    "content": "#adminmenuback,\n#adminmenuwrap,\n#adminmenu,\n#adminmenu .wp-submenu {\n\twidth: 160px;\n\tbackground-color: #23282d;\n}\n\n#adminmenuback {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: -120px;\n\tz-index: 1; /* positive z-index to avoid elastic scrolling woes in Safari */\n}\n\n#adminmenu {\n\tclear: right;\n\tmargin: 12px 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.folded #adminmenuback,\n.folded #adminmenuwrap,\n.folded #adminmenu,\n.folded #adminmenu li.menu-top {\n\twidth: 36px;\n}\n\n.icon16 {\n\theight: 18px;\n\twidth: 18px;\n\tpadding: 6px 6px;\n\tmargin: -6px -8px 0 0;\n\tfloat: right;\n}\n\n/* New Menu icons */\n\n.icon16:before {\n\tcolor: #999;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tpadding: 6px 0;\n\theight: 34px;\n\twidth: 20px;\n\tdisplay: inline-block;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n.icon16.icon-dashboard:before {\n\tcontent: \"\\f226\";\n}\n\n.icon16.icon-post:before {\n\tcontent: \"\\f109\";\n}\n\n.icon16.icon-media:before {\n\tcontent: \"\\f104\";\n}\n\n.icon16.icon-links:before {\n\tcontent: \"\\f103\";\n}\n\n.icon16.icon-page:before {\n\tcontent: \"\\f105\";\n}\n\n.icon16.icon-comments:before {\n\tcontent: \"\\f101\";\n\tmargin-top: 1px;\n}\n\n.icon16.icon-appearance:before {\n\tcontent: \"\\f100\";\n}\n\n.icon16.icon-plugins:before {\n\tcontent: \"\\f106\";\n}\n\n.icon16.icon-users:before {\n\tcontent: \"\\f110\";\n}\n\n.icon16.icon-tools:before {\n\tcontent: \"\\f107\";\n}\n\n.icon16.icon-settings:before {\n\tcontent: \"\\f108\";\n}\n\n.icon16.icon-site:before {\n\tcontent: \"\\f112\";\n}\n\n.icon16.icon-generic:before {\n\tcontent: \"\\f111\";\n}\n\n/* hide background-image for icons above */\n.icon16.icon-dashboard,\n.menu-icon-dashboard div.wp-menu-image,\n.icon16.icon-post,\n.menu-icon-post div.wp-menu-image,\n.icon16.icon-media,\n.menu-icon-media div.wp-menu-image,\n.icon16.icon-links,\n.menu-icon-links div.wp-menu-image,\n.icon16.icon-page,\n.menu-icon-page div.wp-menu-image,\n.icon16.icon-comments,\n.menu-icon-comments div.wp-menu-image,\n.icon16.icon-appearance,\n.menu-icon-appearance div.wp-menu-image,\n.icon16.icon-plugins,\n.menu-icon-plugins div.wp-menu-image,\n.icon16.icon-users,\n.menu-icon-users div.wp-menu-image,\n.icon16.icon-tools,\n.menu-icon-tools div.wp-menu-image,\n.icon16.icon-settings,\n.menu-icon-settings div.wp-menu-image,\n.icon16.icon-site,\n.menu-icon-site div.wp-menu-image,\n.icon16.icon-generic,\n.menu-icon-generic div.wp-menu-image {\n\tbackground-image: none !important;\n}\n\n/*------------------------------------------------------------------------------\n  7.0 - Main Navigation (Left Menu)\n------------------------------------------------------------------------------*/\n\n#adminmenuwrap {\n\tposition: relative;\n\tfloat: right;\n\tz-index: 9990;\n}\n\n/* side admin menu */\n#adminmenu * {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n#adminmenu li {\n\tmargin: 0;\n\tpadding: 0;\n\tcursor: pointer;\n}\n\n#adminmenu a {\n\tdisplay: block;\n\tline-height: 18px;\n\tpadding: 2px 5px;\n\tcolor: #eee;\n}\n\n#adminmenu .wp-submenu a {\n\tcolor: #b4b9be;\n\tcolor: rgba(240,245,250,0.7);\n}\n\n#adminmenu .wp-submenu a:hover,\n#adminmenu .wp-submenu a:focus {\n\tbackground: none;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top > a:focus,\n#adminmenu .wp-submenu a:hover,\n#adminmenu .wp-submenu a:focus {\n\tcolor: #00b9eb;\n}\n\n#adminmenu li.menu-top {\n\tborder: none;\n\tmin-height: 34px;\n\tposition: relative;\n}\n\n#adminmenu .wp-submenu {\n\tlist-style: none;\n\tposition: absolute;\n\ttop: -1000em;\n\tright: 160px;\n\toverflow: visible;\n\tword-wrap: break-word;\n}\n\n#adminmenu .wp-submenu,\n.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu {\n\tpadding: 7px 0 8px;\n\tz-index: 9999;\n\tbackground-color: #32373c;\n\t-webkit-box-shadow: 0 3px 5px rgba(0,0,0,0.2);\n\tbox-shadow: 0 3px 5px rgba(0,0,0,0.2);\n}\n\n.js #adminmenu .sub-open,\n.js #adminmenu .opensub .wp-submenu,\n#adminmenu a.menu-top:focus + .wp-submenu,\n.no-js li.wp-has-submenu:hover .wp-submenu {\n\ttop: -1px;\n}\n\n#adminmenu .wp-has-current-submenu .wp-submenu,\n.no-js li.wp-has-current-submenu:hover .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu.sub-open,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu {\n\tposition: relative;\n\tz-index: 3;\n\ttop: auto;\n\tright: auto;\n\tleft: auto;\n\tbottom: auto;\n\tborder: 0 none;\n\tmargin-top: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground-color: #32373c;\n}\n\n/* ensure that wp-submenu's box shadow doesn't appear on top of the focused menu item's background. */\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n\tposition: relative;\n\tbackground-color: #191e23;\n\tcolor: #00b9eb;\n}\n\n.folded #adminmenu li.menu-top:hover,\n.folded #adminmenu li.opensub > a.menu-top,\n.folded #adminmenu li > a.menu-top:focus {\n\tz-index: 10000;\n}\n\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.current a.menu-top,\n.folded #adminmenu li.wp-has-current-submenu,\n.folded #adminmenu li.current.menu-top,\n#adminmenu .wp-menu-arrow,\n#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head,\n#adminmenu .wp-menu-arrow div {\n\tbackground: #0073aa;\n\tcolor: #fff;\n}\n\n.folded #adminmenu .wp-submenu.sub-open,\n.folded #adminmenu .opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,\n.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu a.menu-top:focus + .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu,\n.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu  {\n\ttop: 0;\n\tright: 36px;\n}\n\n.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu {\n\tposition: absolute;\n\ttop: -1000em;\n}\n\n#adminmenu .wp-not-current-submenu .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu {\n\tmin-width: 160px;\n\twidth: auto;\n}\n\n#adminmenu .wp-submenu a {\n\tfont-size: 13px;\n\tline-height: 1.2;\n\tmargin: 0;\n\tpadding: 6px 0;\n}\n\n#adminmenu .wp-submenu li.current,\n#adminmenu .wp-submenu li.current a,\n#adminmenu .opensub .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-submenu li.current a:hover,\n#adminmenu .wp-submenu li.current a:focus {\n\tcolor: #fff;\n}\n\n#adminmenu .wp-not-current-submenu li > a,\n.folded #adminmenu .wp-has-current-submenu li > a {\n\tpadding-left: 16px;\n\tpadding-right: 14px;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n#adminmenu .wp-has-current-submenu ul > li > a,\n.folded #adminmenu li.menu-top .wp-submenu > li > a {\n\tpadding: 6px 12px;\n}\n\n#adminmenu a.menu-top,\n#adminmenu .wp-submenu-head {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tline-height: 18px;\n\tpadding: 0;\n}\n\n#adminmenu .wp-submenu-head {\n\tdisplay: none;\n}\n\n.folded #adminmenu .wp-menu-name {\n\tposition: absolute;\n\tright: -999px;\n}\n\n.folded #adminmenu .wp-submenu-head {\n\tdisplay: block;\n}\n\n#adminmenu .wp-submenu li {\n\tpadding: 0;\n\tmargin: 0;\n\toverflow: hidden;\n}\n\n#adminmenu .wp-menu-image img {\n\tpadding: 9px 0 0 0;\n\topacity: 0.6;\n\tfilter: alpha(opacity=60);\n}\n\n#adminmenu div.wp-menu-name {\n\tpadding: 8px 0;\n}\n\n#adminmenu div.wp-menu-image {\n\tfloat: right;\n\twidth: 36px;\n\theight: 34px;\n\tmargin: 0;\n\ttext-align: center;\n}\n\n#adminmenu div.wp-menu-image.svg {\n\tbackground-repeat: no-repeat;\n\tbackground-position: center;\n\t-webkit-background-size: 20px auto;\n\tbackground-size: 20px auto;\n}\n\ndiv.wp-menu-image:before {\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n\tpadding: 7px 0;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n#adminmenu div.wp-menu-image:before {\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n}\n\n#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before,\n#adminmenu .wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu .current div.wp-menu-image:before,\n#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before {\n\tcolor: #fff;\n}\n\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before {\n\tcolor: #00b9eb;\n}\n\n/* IE8 doesn't redraw the pseudo elements unless you make a change to the content, this restore the initial color after hover */\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n\tcolor: #a0a5aa;\n}\n\n.folded #adminmenu div.wp-menu-image {\n\twidth: 35px;\n\theight: 30px;\n\tposition: absolute;\n\tz-index: 25;\n}\n\n.folded #adminmenu a.menu-top {\n\theight: 34px;\n}\n\n/* No @font-face support */\n.no-font-face #adminmenu .wp-menu-image {\n\tdisplay: none;\n}\n\n.no-font-face #adminmenu div.wp-menu-name {\n\tpadding: 8px 12px;\n}\n\n.no-font-face.auto-fold #adminmenu .wp-menu-name {\n\tmargin-right: 0;\n}\n/* End no @font-face support */\n\n/* Sticky admin menu */\n.sticky-menu #adminmenuwrap {\n\tposition: fixed;\n}\n\n/* A new arrow */\n\n.wp-menu-arrow {\n\tdisplay: none !important;\n}\n\nul#adminmenu a.wp-has-current-submenu {\n\tposition: relative;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n\tleft: 0;\n\tborder: solid 8px transparent;\n\tcontent: \" \";\n\theight: 0;\n\twidth: 0;\n\tposition: absolute;\n\tpointer-events: none;\n\tborder-left-color: #f1f1f1;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n\n.folded ul#adminmenu li:hover a.wp-has-current-submenu:after {\n\tdisplay: none;\n}\n\n.folded ul#adminmenu a.wp-has-current-submenu:after,\n.folded ul#adminmenu > li a.current:after {\n\tborder-width: 4px;\n\tmargin-top: -4px;\n}\n\n/* flyout menu arrow */\n#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n\tleft: 0;\n\tborder: solid transparent;\n\tcontent: \" \";\n\theight: 0;\n\twidth: 0;\n\tposition: absolute;\n\tpointer-events: none;\n\tborder-width: 8px;\n\ttop: 10px;\n\tz-index: 10000;\n}\n\n.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n\tborder-width: 4px;\n\tmargin-top: -4px;\n\ttop: 18px;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n\tborder-left-color: #32373c;\n}\n\n#adminmenu li.menu-top:hover .wp-menu-image img,\n#adminmenu li.wp-has-current-submenu .wp-menu-image img {\n\topacity: 1;\n\tfilter: alpha(opacity=100);\n}\n\n#adminmenu li.wp-menu-separator {\n\theight: 5px;\n\tpadding: 0;\n\tmargin: 0 0 6px 0;\n\tcursor: inherit;\n}\n\n/* @todo: is this even needed given that it's nested beneath the above li.wp-menu-separator? */\n#adminmenu div.separator {\n\theight: 2px;\n\tpadding: 0;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n\tcolor: #fff;\n\tfont-weight: 400;\n\tfont-size: 14px;\n\tpadding: 8px 11px 8px 4px;\n\tmargin: -7px 0px 4px;\n}\n\n#adminmenu li.current,\n.folded #adminmenu li.wp-menu-open {\n\tborder: 0 none;\n}\n\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n\tdisplay: inline-block;\n\tbackground-color: #d54e21;\n\tcolor: #fff;\n\tfont-size: 9px;\n\tline-height: 17px;\n\tfont-weight: 600;\n\tmargin: 1px 2px 0 0;\n\tvertical-align: top;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n\tz-index: 26;\n}\n\n#adminmenu li .awaiting-mod span,\n#adminmenu li span.update-plugins span {\n\tdisplay: block;\n\tpadding: 0 6px;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu\tli a.wp-has-current-submenu .update-plugins {\n\tbackground-color: #00b9eb;\n\tcolor: #fff;\n}\n\n#adminmenu li span.count-0 {\n\tdisplay: none;\n}\n\n#collapse-menu {\n\tfont-size: 13px;\n\tline-height: 34px;\n\tmargin-top: 10px;\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n#collapse-menu:hover,\n#collapse-menu:hover #collapse-button div:after {\n\tcolor: #00b9eb;\n}\n\n.folded #collapse-menu span {\n\tdisplay: none;\n}\n\n#collapse-button,\n#collapse-button div {\n\twidth: 15px;\n\theight: 15px;\n}\n\n#collapse-button {\n\tfloat: right;\n\theight: 15px;\n\tmargin: 10px 11px 10px 8px;\n\twidth: 15px;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n}\n\n#wpwrap #collapse-button div {\n\tpadding: 0;\n}\n\n#collapse-button div:after {\n\tcontent: \"\\f148\";\n\tdisplay: block;\n\tline-height: 15px;\n\tright: -3px;\n\ttop: -3px;\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n\tfont: normal 20px/1 dashicons !important;\n\tspeak: none;\n\tmargin: 0 auto;\n\tpadding: 0 !important;\n\tposition: relative;\n\ttext-align: center;\n\twidth: 20px;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* rtl:ignore */\n.folded #collapse-button div:after,\n.rtl #collapse-button div:after {\n\t-webkit-transform: rotate(180deg);\n\t-ms-transform: rotate(180deg);\n\ttransform: rotate(180deg);\n}\n\n.rtl.folded #collapse-button div:after {\n\t-webkit-transform: none;\n\t-ms-transform: none;\n\ttransform: none;\n}\n\n/**\n * Toolbar menu toggle\n */\nli#wp-admin-bar-menu-toggle {\n\tdisplay: none;\n}\n\n/* Hide-if-customize for items we can't add classes to */\n.customize-support #menu-appearance a[href=\"themes.php?page=custom-header\"],\n.customize-support #menu-appearance a[href=\"themes.php?page=custom-background\"] {\n\tdisplay: none;\n}\n\n/* Auto-folding of the admin menu */\n@media only screen and (max-width: 960px) {\n\t.auto-fold #wpcontent,\n\t.auto-fold #wpfooter {\n\t\tmargin-right: 36px;\n\t}\n\n\t.auto-fold #adminmenuback,\n\t.auto-fold #adminmenuwrap,\n\t.auto-fold #adminmenu,\n\t.auto-fold #adminmenu li.menu-top {\n\t\twidth: 36px;\n\t}\n\n\t.auto-fold #adminmenu .wp-submenu.sub-open,\n\t.auto-fold #adminmenu .opensub .wp-submenu,\n\t.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,\n\t.auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n\t.auto-fold #adminmenu a.menu-top:focus + .wp-submenu,\n\t.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu  {\n\t\ttop: 0px;\n\t\tright: 36px;\n\t}\n\n\t.auto-fold #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n\t.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {\n\t\tposition: absolute;\n\t\ttop: -1000em;\n\t\tmargin-left: -1px;\n\t\tpadding: 7px 0 8px;\n\t\tz-index: 9999;\n\t}\n\n\t.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {\n\t\tmin-width: 150px;\n\t\twidth: auto;\n\t}\n\n\t.auto-fold #adminmenu .wp-has-current-submenu li > a {\n\t\tpadding-left: 16px;\n\t\tpadding-right: 14px;\n\t}\n\n\n\t.auto-fold #adminmenu li.menu-top .wp-submenu > li > a {\n\t\tpadding-right: 12px;\n\t}\n\n\t.auto-fold #adminmenu .wp-menu-name {\n\t\tposition: absolute;\n\t\tright: -999px;\n\t}\n\n\t.auto-fold #adminmenu .wp-submenu-head {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold #adminmenu div.wp-menu-image {\n\t\theight: 30px;\n\t\twidth: 34px;\n\t\tposition: absolute;\n\t\tz-index: 25;\n\t}\n\n\t.auto-fold #adminmenu a.menu-top {\n\t\theight: 34px;\n\t}\n\n\t.auto-fold #adminmenu li.wp-menu-open {\n\t\tborder: 0 none;\n\t}\n\n\t.auto-fold #adminmenu .wp-has-current-submenu.menu-top-last {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n\t\tborder-width: 4px;\n\t\tmargin-top: -4px;\n\t\ttop: 16px;\n\t}\n\n\t.auto-fold ul#adminmenu a.wp-has-current-submenu:after,\n\t.auto-fold ul#adminmenu > li a.current:after {\n\t\tborder-width: 4px;\n\t\tmargin-top: -4px;\n\t}\n\n\t.auto-fold #adminmenu li.menu-top:hover,\n\t.auto-fold #adminmenu li.opensub > a.menu-top,\n\t.auto-fold #adminmenu li > a.menu-top:focus {\n\t\tz-index: 10000;\n\t}\n\n\t.auto-fold #collapse-menu span {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold #collapse-button div {\n\t\tbackground: none;\n\t}\n\n\t/* rtl:ignore */\n\t.auto-fold #collapse-button div:after {\n\t\t-webkit-transform: rotate(180deg);\n\t\t-ms-transform: rotate(180deg);\n\t\ttransform: rotate(180deg);\n\t}\n\n\t.rtl.auto-fold #collapse-button div:after {\n\t\t-webkit-transform: none;\n\t\t-ms-transform: none;\n\t\ttransform: none;\n\t}\n\n}\n\n@media screen and ( max-width: 782px ) {\n\t.auto-fold #wpcontent {\n\t\tposition: relative;\n\t\tmargin-right: 0;\n\t\tpadding-right: 10px;\n\t}\n\n\t.sticky-menu #adminmenuwrap {\n\t\tposition: relative;\n\t\tz-index: auto;\n\t\ttop: 0;\n\t}\n\n\t/* Sidebar Adjustments */\n\t.auto-fold #adminmenu,\n\t.auto-fold #adminmenuback,\n\t.auto-fold #adminmenuwrap {\n\t\tposition: absolute;\n\t\twidth: 190px;\n\t\tz-index: 100;\n\t}\n\n\t.auto-fold #adminmenuback,\n\t.auto-fold #adminmenuwrap {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold .wp-responsive-open #adminmenuback,\n\t.auto-fold .wp-responsive-open #adminmenuwrap {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold #adminmenu li.menu-top {\n\t\twidth: 100%;\n\t}\n\n\t/* Resize the admin menu items to a comfortable touch size */\n\t.auto-fold #adminmenu li a {\n\t\tfont-size: 16px;\n\t\tpadding: 5px;\n\t}\n\n\t.auto-fold #adminmenu li.menu-top .wp-submenu > li > a {\n\t\tpadding: 10px 20px 10px 10px;\n\t}\n\n\t/* Restore the menu names */\n\t.auto-fold #adminmenu .wp-menu-name {\n\t\tposition: static;\n\t\tmargin-right: 35px;\n\t}\n\n\t/* Switch the arrow side */\n\t.auto-fold ul#adminmenu a.wp-has-current-submenu:after,\n\t.auto-fold ul#adminmenu > li.current > a.current:after {\n\t\tborder-width: 8px;\n\t\tmargin-top: -8px;\n\t}\n\n\t.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n\t\tdisplay: none;\n\t}\n\n\t/* Make the submenus appear correctly when tapped. */\n\t#adminmenu .wp-submenu {\n\t\tposition: relative;\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold #adminmenu .selected .wp-submenu,\n\t.auto-fold #adminmenu .wp-menu-open .wp-submenu {\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\ttop: 0;\n\t\tright: -1px;\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t}\n\n\t.auto-fold #adminmenu .selected .wp-submenu:after,\n\t.auto-fold #adminmenu .wp-menu-open .wp-submenu:after {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold #adminmenu .opensub .wp-submenu {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold #adminmenu .selected .wp-submenu {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold #adminmenu a.menu-top:focus + .wp-submenu,\n\t.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu {\n\t\tposition: relative;\n\t\tright: -1px;\n\t\tleft: 0;\n\t\ttop: 0;\n\t}\n\n\t/* Remove submenu headers and adjust sub meu*/\n\t#adminmenu .wp-submenu .wp-submenu-head {\n\t\tdisplay: none;\n\t}\n\n\t/* Toolbar menu toggle */\n\t#wp-responsive-toggle {\n\t\tposition: fixed;\n\t\ttop: 5px;\n\t\tright: 4px;\n\t\tpadding-left: 10px;\n\t\tz-index: 99999;\n\t\tborder: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t#wpadminbar #wp-admin-bar-menu-toggle a {\n\t\tdisplay: block;\n\t\tpadding: 0;\n\t\toverflow: hidden;\n\t\toutline: none;\n\t\ttext-decoration: none;\n\t\tborder: 1px solid transparent;\n\t\tbackground: none;\n\t\theight: 44px;\n\t\tmargin-right: -1px;\n\t}\n\n\t.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n\t\tbackground: #32373c;\n\t}\n\n\tli#wp-admin-bar-menu-toggle {\n\t\tdisplay: block;\n\t}\n\n\t#wpadminbar #wp-admin-bar-menu-toggle a:hover {\n\t\tborder: 1px solid transparent;\n\t}\n\n\t#wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n\t\tcontent: \"\\f228\";\n\t\tdisplay: inline-block;\n\t\tfloat: right;\n\t\tfont: normal 40px/45px dashicons;\n\t\tvertical-align: middle;\n\t\toutline: none;\n\t\tmargin: 0;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-moz-osx-font-smoothing: grayscale;\n\t\theight: 44px;\n\t\twidth: 50px;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\ttext-align: center;\n\t\ttext-decoration: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n\t\tcolor: #00b9eb;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t#adminmenuwrap,\n\t#adminmenuback {\n\t\tdisplay: none;\n\t}\n\n\t.wp-responsive-open #adminmenuwrap,\n\t.wp-responsive-open #adminmenuback {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold #adminmenu {\n\t\ttop: 46px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/admin-menu.css",
    "content": "#adminmenuback,\n#adminmenuwrap,\n#adminmenu,\n#adminmenu .wp-submenu {\n\twidth: 160px;\n\tbackground-color: #23282d;\n}\n\n#adminmenuback {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: -120px;\n\tz-index: 1; /* positive z-index to avoid elastic scrolling woes in Safari */\n}\n\n#adminmenu {\n\tclear: left;\n\tmargin: 12px 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.folded #adminmenuback,\n.folded #adminmenuwrap,\n.folded #adminmenu,\n.folded #adminmenu li.menu-top {\n\twidth: 36px;\n}\n\n.icon16 {\n\theight: 18px;\n\twidth: 18px;\n\tpadding: 6px 6px;\n\tmargin: -6px 0 0 -8px;\n\tfloat: left;\n}\n\n/* New Menu icons */\n\n.icon16:before {\n\tcolor: #999;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tpadding: 6px 0;\n\theight: 34px;\n\twidth: 20px;\n\tdisplay: inline-block;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n.icon16.icon-dashboard:before {\n\tcontent: \"\\f226\";\n}\n\n.icon16.icon-post:before {\n\tcontent: \"\\f109\";\n}\n\n.icon16.icon-media:before {\n\tcontent: \"\\f104\";\n}\n\n.icon16.icon-links:before {\n\tcontent: \"\\f103\";\n}\n\n.icon16.icon-page:before {\n\tcontent: \"\\f105\";\n}\n\n.icon16.icon-comments:before {\n\tcontent: \"\\f101\";\n\tmargin-top: 1px;\n}\n\n.icon16.icon-appearance:before {\n\tcontent: \"\\f100\";\n}\n\n.icon16.icon-plugins:before {\n\tcontent: \"\\f106\";\n}\n\n.icon16.icon-users:before {\n\tcontent: \"\\f110\";\n}\n\n.icon16.icon-tools:before {\n\tcontent: \"\\f107\";\n}\n\n.icon16.icon-settings:before {\n\tcontent: \"\\f108\";\n}\n\n.icon16.icon-site:before {\n\tcontent: \"\\f112\";\n}\n\n.icon16.icon-generic:before {\n\tcontent: \"\\f111\";\n}\n\n/* hide background-image for icons above */\n.icon16.icon-dashboard,\n.menu-icon-dashboard div.wp-menu-image,\n.icon16.icon-post,\n.menu-icon-post div.wp-menu-image,\n.icon16.icon-media,\n.menu-icon-media div.wp-menu-image,\n.icon16.icon-links,\n.menu-icon-links div.wp-menu-image,\n.icon16.icon-page,\n.menu-icon-page div.wp-menu-image,\n.icon16.icon-comments,\n.menu-icon-comments div.wp-menu-image,\n.icon16.icon-appearance,\n.menu-icon-appearance div.wp-menu-image,\n.icon16.icon-plugins,\n.menu-icon-plugins div.wp-menu-image,\n.icon16.icon-users,\n.menu-icon-users div.wp-menu-image,\n.icon16.icon-tools,\n.menu-icon-tools div.wp-menu-image,\n.icon16.icon-settings,\n.menu-icon-settings div.wp-menu-image,\n.icon16.icon-site,\n.menu-icon-site div.wp-menu-image,\n.icon16.icon-generic,\n.menu-icon-generic div.wp-menu-image {\n\tbackground-image: none !important;\n}\n\n/*------------------------------------------------------------------------------\n  7.0 - Main Navigation (Left Menu)\n------------------------------------------------------------------------------*/\n\n#adminmenuwrap {\n\tposition: relative;\n\tfloat: left;\n\tz-index: 9990;\n}\n\n/* side admin menu */\n#adminmenu * {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n#adminmenu li {\n\tmargin: 0;\n\tpadding: 0;\n\tcursor: pointer;\n}\n\n#adminmenu a {\n\tdisplay: block;\n\tline-height: 18px;\n\tpadding: 2px 5px;\n\tcolor: #eee;\n}\n\n#adminmenu .wp-submenu a {\n\tcolor: #b4b9be;\n\tcolor: rgba(240,245,250,0.7);\n}\n\n#adminmenu .wp-submenu a:hover,\n#adminmenu .wp-submenu a:focus {\n\tbackground: none;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top > a:focus,\n#adminmenu .wp-submenu a:hover,\n#adminmenu .wp-submenu a:focus {\n\tcolor: #00b9eb;\n}\n\n#adminmenu li.menu-top {\n\tborder: none;\n\tmin-height: 34px;\n\tposition: relative;\n}\n\n#adminmenu .wp-submenu {\n\tlist-style: none;\n\tposition: absolute;\n\ttop: -1000em;\n\tleft: 160px;\n\toverflow: visible;\n\tword-wrap: break-word;\n}\n\n#adminmenu .wp-submenu,\n.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu {\n\tpadding: 7px 0 8px;\n\tz-index: 9999;\n\tbackground-color: #32373c;\n\t-webkit-box-shadow: 0 3px 5px rgba(0,0,0,0.2);\n\tbox-shadow: 0 3px 5px rgba(0,0,0,0.2);\n}\n\n.js #adminmenu .sub-open,\n.js #adminmenu .opensub .wp-submenu,\n#adminmenu a.menu-top:focus + .wp-submenu,\n.no-js li.wp-has-submenu:hover .wp-submenu {\n\ttop: -1px;\n}\n\n#adminmenu .wp-has-current-submenu .wp-submenu,\n.no-js li.wp-has-current-submenu:hover .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu.sub-open,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu {\n\tposition: relative;\n\tz-index: 3;\n\ttop: auto;\n\tleft: auto;\n\tright: auto;\n\tbottom: auto;\n\tborder: 0 none;\n\tmargin-top: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground-color: #32373c;\n}\n\n/* ensure that wp-submenu's box shadow doesn't appear on top of the focused menu item's background. */\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n\tposition: relative;\n\tbackground-color: #191e23;\n\tcolor: #00b9eb;\n}\n\n.folded #adminmenu li.menu-top:hover,\n.folded #adminmenu li.opensub > a.menu-top,\n.folded #adminmenu li > a.menu-top:focus {\n\tz-index: 10000;\n}\n\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.current a.menu-top,\n.folded #adminmenu li.wp-has-current-submenu,\n.folded #adminmenu li.current.menu-top,\n#adminmenu .wp-menu-arrow,\n#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head,\n#adminmenu .wp-menu-arrow div {\n\tbackground: #0073aa;\n\tcolor: #fff;\n}\n\n.folded #adminmenu .wp-submenu.sub-open,\n.folded #adminmenu .opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,\n.folded #adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu a.menu-top:focus + .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu,\n.no-js.folded #adminmenu .wp-has-submenu:hover .wp-submenu  {\n\ttop: 0;\n\tleft: 36px;\n}\n\n.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu {\n\tposition: absolute;\n\ttop: -1000em;\n}\n\n#adminmenu .wp-not-current-submenu .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu {\n\tmin-width: 160px;\n\twidth: auto;\n}\n\n#adminmenu .wp-submenu a {\n\tfont-size: 13px;\n\tline-height: 1.2;\n\tmargin: 0;\n\tpadding: 6px 0;\n}\n\n#adminmenu .wp-submenu li.current,\n#adminmenu .wp-submenu li.current a,\n#adminmenu .opensub .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-submenu li.current a:hover,\n#adminmenu .wp-submenu li.current a:focus {\n\tcolor: #fff;\n}\n\n#adminmenu .wp-not-current-submenu li > a,\n.folded #adminmenu .wp-has-current-submenu li > a {\n\tpadding-right: 16px;\n\tpadding-left: 14px;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n#adminmenu .wp-has-current-submenu ul > li > a,\n.folded #adminmenu li.menu-top .wp-submenu > li > a {\n\tpadding: 6px 12px;\n}\n\n#adminmenu a.menu-top,\n#adminmenu .wp-submenu-head {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tline-height: 18px;\n\tpadding: 0;\n}\n\n#adminmenu .wp-submenu-head {\n\tdisplay: none;\n}\n\n.folded #adminmenu .wp-menu-name {\n\tposition: absolute;\n\tleft: -999px;\n}\n\n.folded #adminmenu .wp-submenu-head {\n\tdisplay: block;\n}\n\n#adminmenu .wp-submenu li {\n\tpadding: 0;\n\tmargin: 0;\n\toverflow: hidden;\n}\n\n#adminmenu .wp-menu-image img {\n\tpadding: 9px 0 0 0;\n\topacity: 0.6;\n\tfilter: alpha(opacity=60);\n}\n\n#adminmenu div.wp-menu-name {\n\tpadding: 8px 0;\n}\n\n#adminmenu div.wp-menu-image {\n\tfloat: left;\n\twidth: 36px;\n\theight: 34px;\n\tmargin: 0;\n\ttext-align: center;\n}\n\n#adminmenu div.wp-menu-image.svg {\n\tbackground-repeat: no-repeat;\n\tbackground-position: center;\n\t-webkit-background-size: 20px auto;\n\tbackground-size: 20px auto;\n}\n\ndiv.wp-menu-image:before {\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n\tpadding: 7px 0;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n#adminmenu div.wp-menu-image:before {\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n}\n\n#adminmenu li.wp-has-current-submenu:hover div.wp-menu-image:before,\n#adminmenu .wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu .current div.wp-menu-image:before,\n#adminmenu a.wp-has-current-submenu:hover div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before {\n\tcolor: #fff;\n}\n\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before {\n\tcolor: #00b9eb;\n}\n\n/* IE8 doesn't redraw the pseudo elements unless you make a change to the content, this restore the initial color after hover */\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n\tcolor: #a0a5aa;\n}\n\n.folded #adminmenu div.wp-menu-image {\n\twidth: 35px;\n\theight: 30px;\n\tposition: absolute;\n\tz-index: 25;\n}\n\n.folded #adminmenu a.menu-top {\n\theight: 34px;\n}\n\n/* No @font-face support */\n.no-font-face #adminmenu .wp-menu-image {\n\tdisplay: none;\n}\n\n.no-font-face #adminmenu div.wp-menu-name {\n\tpadding: 8px 12px;\n}\n\n.no-font-face.auto-fold #adminmenu .wp-menu-name {\n\tmargin-left: 0;\n}\n/* End no @font-face support */\n\n/* Sticky admin menu */\n.sticky-menu #adminmenuwrap {\n\tposition: fixed;\n}\n\n/* A new arrow */\n\n.wp-menu-arrow {\n\tdisplay: none !important;\n}\n\nul#adminmenu a.wp-has-current-submenu {\n\tposition: relative;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n\tright: 0;\n\tborder: solid 8px transparent;\n\tcontent: \" \";\n\theight: 0;\n\twidth: 0;\n\tposition: absolute;\n\tpointer-events: none;\n\tborder-right-color: #f1f1f1;\n\ttop: 50%;\n\tmargin-top: -8px;\n}\n\n.folded ul#adminmenu li:hover a.wp-has-current-submenu:after {\n\tdisplay: none;\n}\n\n.folded ul#adminmenu a.wp-has-current-submenu:after,\n.folded ul#adminmenu > li a.current:after {\n\tborder-width: 4px;\n\tmargin-top: -4px;\n}\n\n/* flyout menu arrow */\n#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n\tright: 0;\n\tborder: solid transparent;\n\tcontent: \" \";\n\theight: 0;\n\twidth: 0;\n\tposition: absolute;\n\tpointer-events: none;\n\tborder-width: 8px;\n\ttop: 10px;\n\tz-index: 10000;\n}\n\n.folded ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n\tborder-width: 4px;\n\tmargin-top: -4px;\n\ttop: 18px;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n\tborder-right-color: #32373c;\n}\n\n#adminmenu li.menu-top:hover .wp-menu-image img,\n#adminmenu li.wp-has-current-submenu .wp-menu-image img {\n\topacity: 1;\n\tfilter: alpha(opacity=100);\n}\n\n#adminmenu li.wp-menu-separator {\n\theight: 5px;\n\tpadding: 0;\n\tmargin: 0 0 6px 0;\n\tcursor: inherit;\n}\n\n/* @todo: is this even needed given that it's nested beneath the above li.wp-menu-separator? */\n#adminmenu div.separator {\n\theight: 2px;\n\tpadding: 0;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n\tcolor: #fff;\n\tfont-weight: 400;\n\tfont-size: 14px;\n\tpadding: 8px 4px 8px 11px;\n\tmargin: -7px 0px 4px;\n}\n\n#adminmenu li.current,\n.folded #adminmenu li.wp-menu-open {\n\tborder: 0 none;\n}\n\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n\tdisplay: inline-block;\n\tbackground-color: #d54e21;\n\tcolor: #fff;\n\tfont-size: 9px;\n\tline-height: 17px;\n\tfont-weight: 600;\n\tmargin: 1px 0 0 2px;\n\tvertical-align: top;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n\tz-index: 26;\n}\n\n#adminmenu li .awaiting-mod span,\n#adminmenu li span.update-plugins span {\n\tdisplay: block;\n\tpadding: 0 6px;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu\tli a.wp-has-current-submenu .update-plugins {\n\tbackground-color: #00b9eb;\n\tcolor: #fff;\n}\n\n#adminmenu li span.count-0 {\n\tdisplay: none;\n}\n\n#collapse-menu {\n\tfont-size: 13px;\n\tline-height: 34px;\n\tmargin-top: 10px;\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n#collapse-menu:hover,\n#collapse-menu:hover #collapse-button div:after {\n\tcolor: #00b9eb;\n}\n\n.folded #collapse-menu span {\n\tdisplay: none;\n}\n\n#collapse-button,\n#collapse-button div {\n\twidth: 15px;\n\theight: 15px;\n}\n\n#collapse-button {\n\tfloat: left;\n\theight: 15px;\n\tmargin: 10px 8px 10px 11px;\n\twidth: 15px;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n}\n\n#wpwrap #collapse-button div {\n\tpadding: 0;\n}\n\n#collapse-button div:after {\n\tcontent: \"\\f148\";\n\tdisplay: block;\n\tline-height: 15px;\n\tleft: -3px;\n\ttop: -3px;\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n\tfont: normal 20px/1 dashicons !important;\n\tspeak: none;\n\tmargin: 0 auto;\n\tpadding: 0 !important;\n\tposition: relative;\n\ttext-align: center;\n\twidth: 20px;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* rtl:ignore */\n.folded #collapse-button div:after,\n.rtl #collapse-button div:after {\n\t-webkit-transform: rotate(180deg);\n\t-ms-transform: rotate(180deg);\n\ttransform: rotate(180deg);\n}\n\n.rtl.folded #collapse-button div:after {\n\t-webkit-transform: none;\n\t-ms-transform: none;\n\ttransform: none;\n}\n\n/**\n * Toolbar menu toggle\n */\nli#wp-admin-bar-menu-toggle {\n\tdisplay: none;\n}\n\n/* Hide-if-customize for items we can't add classes to */\n.customize-support #menu-appearance a[href=\"themes.php?page=custom-header\"],\n.customize-support #menu-appearance a[href=\"themes.php?page=custom-background\"] {\n\tdisplay: none;\n}\n\n/* Auto-folding of the admin menu */\n@media only screen and (max-width: 960px) {\n\t.auto-fold #wpcontent,\n\t.auto-fold #wpfooter {\n\t\tmargin-left: 36px;\n\t}\n\n\t.auto-fold #adminmenuback,\n\t.auto-fold #adminmenuwrap,\n\t.auto-fold #adminmenu,\n\t.auto-fold #adminmenu li.menu-top {\n\t\twidth: 36px;\n\t}\n\n\t.auto-fold #adminmenu .wp-submenu.sub-open,\n\t.auto-fold #adminmenu .opensub .wp-submenu,\n\t.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu.sub-open,\n\t.auto-fold #adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n\t.auto-fold #adminmenu a.menu-top:focus + .wp-submenu,\n\t.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu  {\n\t\ttop: 0px;\n\t\tleft: 36px;\n\t}\n\n\t.auto-fold #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n\t.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {\n\t\tposition: absolute;\n\t\ttop: -1000em;\n\t\tmargin-right: -1px;\n\t\tpadding: 7px 0 8px;\n\t\tz-index: 9999;\n\t}\n\n\t.auto-fold #adminmenu .wp-has-current-submenu .wp-submenu {\n\t\tmin-width: 150px;\n\t\twidth: auto;\n\t}\n\n\t.auto-fold #adminmenu .wp-has-current-submenu li > a {\n\t\tpadding-right: 16px;\n\t\tpadding-left: 14px;\n\t}\n\n\n\t.auto-fold #adminmenu li.menu-top .wp-submenu > li > a {\n\t\tpadding-left: 12px;\n\t}\n\n\t.auto-fold #adminmenu .wp-menu-name {\n\t\tposition: absolute;\n\t\tleft: -999px;\n\t}\n\n\t.auto-fold #adminmenu .wp-submenu-head {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold #adminmenu div.wp-menu-image {\n\t\theight: 30px;\n\t\twidth: 34px;\n\t\tposition: absolute;\n\t\tz-index: 25;\n\t}\n\n\t.auto-fold #adminmenu a.menu-top {\n\t\theight: 34px;\n\t}\n\n\t.auto-fold #adminmenu li.wp-menu-open {\n\t\tborder: 0 none;\n\t}\n\n\t.auto-fold #adminmenu .wp-has-current-submenu.menu-top-last {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n\t\tborder-width: 4px;\n\t\tmargin-top: -4px;\n\t\ttop: 16px;\n\t}\n\n\t.auto-fold ul#adminmenu a.wp-has-current-submenu:after,\n\t.auto-fold ul#adminmenu > li a.current:after {\n\t\tborder-width: 4px;\n\t\tmargin-top: -4px;\n\t}\n\n\t.auto-fold #adminmenu li.menu-top:hover,\n\t.auto-fold #adminmenu li.opensub > a.menu-top,\n\t.auto-fold #adminmenu li > a.menu-top:focus {\n\t\tz-index: 10000;\n\t}\n\n\t.auto-fold #collapse-menu span {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold #collapse-button div {\n\t\tbackground: none;\n\t}\n\n\t/* rtl:ignore */\n\t.auto-fold #collapse-button div:after {\n\t\t-webkit-transform: rotate(180deg);\n\t\t-ms-transform: rotate(180deg);\n\t\ttransform: rotate(180deg);\n\t}\n\n\t.rtl.auto-fold #collapse-button div:after {\n\t\t-webkit-transform: none;\n\t\t-ms-transform: none;\n\t\ttransform: none;\n\t}\n\n}\n\n@media screen and ( max-width: 782px ) {\n\t.auto-fold #wpcontent {\n\t\tposition: relative;\n\t\tmargin-left: 0;\n\t\tpadding-left: 10px;\n\t}\n\n\t.sticky-menu #adminmenuwrap {\n\t\tposition: relative;\n\t\tz-index: auto;\n\t\ttop: 0;\n\t}\n\n\t/* Sidebar Adjustments */\n\t.auto-fold #adminmenu,\n\t.auto-fold #adminmenuback,\n\t.auto-fold #adminmenuwrap {\n\t\tposition: absolute;\n\t\twidth: 190px;\n\t\tz-index: 100;\n\t}\n\n\t.auto-fold #adminmenuback,\n\t.auto-fold #adminmenuwrap {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold .wp-responsive-open #adminmenuback,\n\t.auto-fold .wp-responsive-open #adminmenuwrap {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold #adminmenu li.menu-top {\n\t\twidth: 100%;\n\t}\n\n\t/* Resize the admin menu items to a comfortable touch size */\n\t.auto-fold #adminmenu li a {\n\t\tfont-size: 16px;\n\t\tpadding: 5px;\n\t}\n\n\t.auto-fold #adminmenu li.menu-top .wp-submenu > li > a {\n\t\tpadding: 10px 10px 10px 20px;\n\t}\n\n\t/* Restore the menu names */\n\t.auto-fold #adminmenu .wp-menu-name {\n\t\tposition: static;\n\t\tmargin-left: 35px;\n\t}\n\n\t/* Switch the arrow side */\n\t.auto-fold ul#adminmenu a.wp-has-current-submenu:after,\n\t.auto-fold ul#adminmenu > li.current > a.current:after {\n\t\tborder-width: 8px;\n\t\tmargin-top: -8px;\n\t}\n\n\t.auto-fold ul#adminmenu li.wp-has-submenu.wp-not-current-submenu:hover:after {\n\t\tdisplay: none;\n\t}\n\n\t/* Make the submenus appear correctly when tapped. */\n\t#adminmenu .wp-submenu {\n\t\tposition: relative;\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold #adminmenu .selected .wp-submenu,\n\t.auto-fold #adminmenu .wp-menu-open .wp-submenu {\n\t\tposition: relative;\n\t\tdisplay: block;\n\t\ttop: 0;\n\t\tleft: -1px;\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t}\n\n\t.auto-fold #adminmenu .selected .wp-submenu:after,\n\t.auto-fold #adminmenu .wp-menu-open .wp-submenu:after {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold #adminmenu .opensub .wp-submenu {\n\t\tdisplay: none;\n\t}\n\n\t.auto-fold #adminmenu .selected .wp-submenu {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold ul#adminmenu li:hover a.wp-has-current-submenu:after {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold #adminmenu a.menu-top:focus + .wp-submenu,\n\t.auto-fold #adminmenu .wp-has-current-submenu a.menu-top:focus + .wp-submenu {\n\t\tposition: relative;\n\t\tleft: -1px;\n\t\tright: 0;\n\t\ttop: 0;\n\t}\n\n\t/* Remove submenu headers and adjust sub meu*/\n\t#adminmenu .wp-submenu .wp-submenu-head {\n\t\tdisplay: none;\n\t}\n\n\t/* Toolbar menu toggle */\n\t#wp-responsive-toggle {\n\t\tposition: fixed;\n\t\ttop: 5px;\n\t\tleft: 4px;\n\t\tpadding-right: 10px;\n\t\tz-index: 99999;\n\t\tborder: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t#wpadminbar #wp-admin-bar-menu-toggle a {\n\t\tdisplay: block;\n\t\tpadding: 0;\n\t\toverflow: hidden;\n\t\toutline: none;\n\t\ttext-decoration: none;\n\t\tborder: 1px solid transparent;\n\t\tbackground: none;\n\t\theight: 44px;\n\t\tmargin-left: -1px;\n\t}\n\n\t.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n\t\tbackground: #32373c;\n\t}\n\n\tli#wp-admin-bar-menu-toggle {\n\t\tdisplay: block;\n\t}\n\n\t#wpadminbar #wp-admin-bar-menu-toggle a:hover {\n\t\tborder: 1px solid transparent;\n\t}\n\n\t#wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n\t\tcontent: \"\\f228\";\n\t\tdisplay: inline-block;\n\t\tfloat: left;\n\t\tfont: normal 40px/45px dashicons;\n\t\tvertical-align: middle;\n\t\toutline: none;\n\t\tmargin: 0;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-moz-osx-font-smoothing: grayscale;\n\t\theight: 44px;\n\t\twidth: 50px;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\ttext-align: center;\n\t\ttext-decoration: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n\t\tcolor: #00b9eb;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t#adminmenuwrap,\n\t#adminmenuback {\n\t\tdisplay: none;\n\t}\n\n\t.wp-responsive-open #adminmenuwrap,\n\t.wp-responsive-open #adminmenuback {\n\t\tdisplay: block;\n\t}\n\n\t.auto-fold #adminmenu {\n\t\ttop: 46px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/color-picker-rtl.css",
    "content": ".wp-color-picker {\n\twidth: 80px;\n}\n\n.wp-picker-container .hidden {\n\tdisplay: none;\n}\n\n.wp-color-result {\n\tbackground-color: #f7f7f7;\n\tborder: 1px solid #ccc;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\tcursor: pointer;\n\tdisplay: inline-block;\n\theight: 22px;\n\tmargin: 0 0px 6px 6px;\n\tposition: relative;\n\ttop: 1px;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tvertical-align: bottom;\n\tdisplay: inline-block;\n\tpadding-right: 30px;\n\t-webkit-box-shadow: 0 1px 0 #ccc;\n\tbox-shadow: 0 1px 0 #ccc;\n}\n\n.wp-color-result:after {\n\tbackground: #f7f7f7;\n\t-webkit-border-radius: 2px 0 0 2px;\n\tborder-radius: 2px 0 0 2px;\n\tborder-right: 1px solid #ccc;\n\tcolor: #555;\n\tcontent: attr( title );\n\tdisplay: block;\n\tfont-size: 11px;\n\tline-height: 22px;\n\tpadding: 0 6px;\n\tposition: relative;\n\tleft: 0;\n\ttext-align: center;\n\ttop: 0;\n}\n\n.wp-color-result:hover,\n.wp-color-result:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.wp-color-result:hover:after,\n.wp-color-result:focus:after {\n\tcolor: #23282d;\n\tborder-color: #a0a5aa;\n\tborder-right: 1px solid #999;\n}\n\n.wp-color-result {\n\ttop: 0;\n}\n\n.wp-color-result.wp-picker-open:after {\n\tcontent: attr( data-current );\n}\n\n.wp-picker-container, .wp-picker-container:active {\n\tdisplay: inline-block;\n\toutline: 0;\n}\n\n.wp-color-result:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n\tbox-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n}\n\n.wp-picker-open + .wp-picker-input-wrap {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.wp-picker-container .button {\n\tmargin-right: 6px;\n}\n\n.wp-picker-container .iris-square-slider .ui-slider-handle:focus {\n\tbackground-color: #555\n}\n\n.wp-picker-container .iris-picker {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tborder-color: #dfdfdf;\n\tmargin-top: 6px;\n}\n\n.wp-picker-container input[type=\"text\"].wp-color-picker {\n\twidth: 65px;\n\tfont-size: 12px;\n\tfont-family: monospace;\n\ttext-align: center;\n\tline-height: 16px;\n\tmargin: 0;\n}\n\n.wp-picker-container input[type=\"text\"].wp-color-picker:focus::-webkit-input-placeholder {\n\tcolor: transparent;\n}\n\n.wp-picker-container input[type=\"text\"].wp-color-picker:-moz-placeholder {\n\tcolor: #999;\n}\n\n.wp-picker-container input[type=\"text\"].iris-error {\n\tbackground-color: #ffebe8;\n\tborder-color: #c00;\n\tcolor: #000;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/color-picker.css",
    "content": ".wp-color-picker {\n\twidth: 80px;\n}\n\n.wp-picker-container .hidden {\n\tdisplay: none;\n}\n\n.wp-color-result {\n\tbackground-color: #f7f7f7;\n\tborder: 1px solid #ccc;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\tcursor: pointer;\n\tdisplay: inline-block;\n\theight: 22px;\n\tmargin: 0 6px 6px 0px;\n\tposition: relative;\n\ttop: 1px;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tvertical-align: bottom;\n\tdisplay: inline-block;\n\tpadding-left: 30px;\n\t-webkit-box-shadow: 0 1px 0 #ccc;\n\tbox-shadow: 0 1px 0 #ccc;\n}\n\n.wp-color-result:after {\n\tbackground: #f7f7f7;\n\t-webkit-border-radius: 0 2px 2px 0;\n\tborder-radius: 0 2px 2px 0;\n\tborder-left: 1px solid #ccc;\n\tcolor: #555;\n\tcontent: attr( title );\n\tdisplay: block;\n\tfont-size: 11px;\n\tline-height: 22px;\n\tpadding: 0 6px;\n\tposition: relative;\n\tright: 0;\n\ttext-align: center;\n\ttop: 0;\n}\n\n.wp-color-result:hover,\n.wp-color-result:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.wp-color-result:hover:after,\n.wp-color-result:focus:after {\n\tcolor: #23282d;\n\tborder-color: #a0a5aa;\n\tborder-left: 1px solid #999;\n}\n\n.wp-color-result {\n\ttop: 0;\n}\n\n.wp-color-result.wp-picker-open:after {\n\tcontent: attr( data-current );\n}\n\n.wp-picker-container, .wp-picker-container:active {\n\tdisplay: inline-block;\n\toutline: 0;\n}\n\n.wp-color-result:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n\tbox-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n}\n\n.wp-picker-open + .wp-picker-input-wrap {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.wp-picker-container .button {\n\tmargin-left: 6px;\n}\n\n.wp-picker-container .iris-square-slider .ui-slider-handle:focus {\n\tbackground-color: #555\n}\n\n.wp-picker-container .iris-picker {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tborder-color: #dfdfdf;\n\tmargin-top: 6px;\n}\n\n.wp-picker-container input[type=\"text\"].wp-color-picker {\n\twidth: 65px;\n\tfont-size: 12px;\n\tfont-family: monospace;\n\ttext-align: center;\n\tline-height: 16px;\n\tmargin: 0;\n}\n\n.wp-picker-container input[type=\"text\"].wp-color-picker:focus::-webkit-input-placeholder {\n\tcolor: transparent;\n}\n\n.wp-picker-container input[type=\"text\"].wp-color-picker:-moz-placeholder {\n\tcolor: #999;\n}\n\n.wp-picker-container input[type=\"text\"].iris-error {\n\tbackground-color: #ffebe8;\n\tborder-color: #c00;\n\tcolor: #000;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/_admin.scss",
    "content": "\n@import 'variables';\n@import 'mixins';\n\n\nhtml {\n\tbackground: $body-background;\n}\n\n\n/* Links */\n\na {\n\tcolor: $link;\n\n\t&:hover,\n\t&:active,\n\t&:focus {\n\t\tcolor: $link-focus;\n\t}\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n\tcolor: $link-focus;\n}\n\n\n/* Forms */\n\ninput[type=checkbox]:checked:before {\n\tcolor: $form-checked;\n}\n\ninput[type=radio]:checked:before {\n\tbackground: $form-checked;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n\tcolor: $link-focus;\n}\n\n\n/* Core UI */\n\n.wp-core-ui {\n\t.button-primary {\n\t\t@include button( $button-color );\n\t}\n\n\t.wp-ui-primary {\n\t\tcolor: $text-color;\n\t\tbackground-color: $base-color;\n\t}\n\t.wp-ui-text-primary {\n\t\tcolor: $base-color;\n\t}\n\n\t.wp-ui-highlight {\n\t\tcolor: $menu-highlight-text;\n\t\tbackground-color: $menu-highlight-background;\n\t}\n\t.wp-ui-text-highlight {\n\t\tcolor: $menu-highlight-background;\n\t}\n\n\t.wp-ui-notification {\n\t\tcolor: $menu-bubble-text;\n\t\tbackground-color: $menu-bubble-background;\n\t}\n\t.wp-ui-text-notification {\n\t\tcolor: $menu-bubble-background;\n\t}\n\n\t.wp-ui-text-icon {\n\t\tcolor: $menu-icon;\n\t}\n}\n\n\n/* List tables */\n\n.wrap .add-new-h2:hover, /* deprecated */\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n\tcolor: $menu-text;\n\tbackground-color: $menu-background;\n}\n\n.view-switch a.current:before {\n\tcolor: $menu-background;\n}\n\n.view-switch a:hover:before {\n\tcolor: $menu-bubble-background;\n}\n\n\n/* Admin Menu */\n\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n\tbackground: $menu-background;\n}\n\n#adminmenu a {\n\tcolor: $menu-text;\n}\n\n#adminmenu div.wp-menu-image:before {\n\tcolor: $menu-icon;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n\tcolor: $menu-highlight-text;\n\tbackground-color: $menu-highlight-background;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n\tcolor: $menu-highlight-icon;\n}\n\n\n/* Active tabs use a bottom border color that matches the page background color. */\n\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n\tbackground-color: $body-background;\n\tborder-bottom-color: $body-background;\n}\n\n\n/* Admin Menu: submenu */\n\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n\tbackground: $menu-submenu-background;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n\tborder-right-color: $menu-submenu-background;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n\tcolor: $menu-submenu-text;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n\tcolor: $menu-submenu-text;\n\n\t&:focus, &:hover {\n\t\tcolor: $menu-submenu-focus-text;\n\t}\n}\n\n\n/* Admin Menu: current */\n\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n\tcolor: $menu-submenu-current-text;\n\n\t&:hover, &:focus {\n\t\tcolor: $menu-submenu-focus-text;\n\t}\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n    border-right-color: $body-background;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n\tcolor: $menu-current-text;\n\tbackground: $menu-current-background;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n\tcolor: $menu-current-icon;\n}\n\n\n/* Admin Menu: bubble */\n\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n\tcolor: $menu-bubble-text;\n\tbackground: $menu-bubble-background;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n\tcolor: $menu-bubble-current-text;\n\tbackground: $menu-bubble-current-background;\n}\n\n\n/* Admin Menu: collapse button */\n\n#collapse-menu {\n    color: $menu-collapse-text;\n}\n\n#collapse-menu:hover {\n    color: $menu-collapse-focus-text;\n}\n\n#collapse-button div:after {\n    color: $menu-collapse-icon;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n    color: $menu-collapse-focus-icon;\n}\n\n\n/* Admin Bar */\n\n#wpadminbar {\n\tcolor: $menu-text;\n\tbackground: $menu-background;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n\tcolor: $menu-text;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n\tcolor: $menu-icon;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n\tcolor: $menu-submenu-focus-text;\n\tbackground: $menu-submenu-background;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n\tcolor: $menu-submenu-focus-text;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n\tcolor: $menu-highlight-icon;\n}\n\n\n/* Admin Bar: submenu */\n\n#wpadminbar .menupop .ab-sub-wrapper {\n\tbackground: $menu-submenu-background;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n\tbackground: $menu-submenu-background-alt;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n\tcolor: $menu-submenu-text;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n\tcolor: $menu-icon;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n\tcolor: $menu-submenu-focus-text;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n\tcolor: $menu-submenu-focus-text;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n\tcolor: $menu-icon;\n}\n\n\n/* Admin Bar: search */\n\n#wpadminbar #adminbarsearch:before {\n\tcolor: $menu-icon;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n\tcolor: $menu-text;\n\tbackground: $adminbar-input-background;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder { color: $menu-text; opacity: 0.7; }\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder { color: $menu-text; opacity: 0.7; }\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder { color: $menu-text; opacity: 0.7; }\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder { color: $menu-text; opacity: 0.7; }\n\n\n/* Admin Bar: my account */\n\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n\tborder-color: $adminbar-avatar-frame;\n\tbackground-color: $adminbar-avatar-frame;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n\tcolor: $menu-text;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n\tcolor: $menu-submenu-focus-text;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n\tcolor: $menu-submenu-text;\n}\n\n\n/* Pointers */\n\n.wp-pointer .wp-pointer-content h3 {\n\tbackground-color: $highlight-color;\n\tborder-color: darken( $highlight-color, 5% );\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n\tcolor: $highlight-color;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n\tborder-bottom-color: $highlight-color;\n}\n\n\n/* Media */\n\n.media-item .bar,\n.media-progress-bar div {\n\tbackground-color: $highlight-color;\n}\n\n.details.attachment {\n\tbox-shadow:\n\t\tinset 0 0 0 3px #fff,\n\t\tinset 0 0 0 7px $highlight-color;\n}\n\n.attachment.details .check {\n\tbackground-color: $highlight-color;\n\tbox-shadow: 0 0 0 1px #fff, 0 0 0 2px $highlight-color;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n\t-webkit-box-shadow:\n\t\t0px 0px 0px 1px #fff,\n\t\t0px 0px 0px 3px $highlight-color;\n\tbox-shadow:\n\t\t0px 0px 0px 1px #fff,\n\t\t0px 0px 0px 3px $highlight-color;\n}\n\n\n/* Themes */\n\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n\tbackground: $highlight-color;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n\tcolor: $highlight-color;\n}\n\n.theme-section.current,\n.theme-filter.current {\n\tborder-bottom-color: $menu-background;\n}\n\nbody.more-filters-opened .more-filters {\n\tcolor: $menu-text;\n\tbackground-color: $menu-background;\n}\n\nbody.more-filters-opened .more-filters:before {\n\tcolor: $menu-text;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n\tbackground-color: $menu-highlight-background;\n\tcolor: $menu-highlight-text;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n\tcolor: $menu-highlight-text;\n}\n\n/* Widgets */\n\n.widgets-chooser li.widgets-chooser-selected {\n\tbackground-color: $menu-highlight-background;\n\tcolor: $menu-highlight-text;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n\tcolor: $menu-highlight-text;\n}\n\n/* Customize */\n\n#customize-theme-controls .widget-area-select .selected {\n\tbackground-color: $menu-highlight-background;\n\tcolor: $menu-highlight-text;\n}\n\n/* Responsive Component */\n\ndiv#wp-responsive-toggle a:before {\n\tcolor: $menu-icon;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n\t// ToDo: make inset border\n\tborder-color: transparent;\n\tbackground: $menu-highlight-background;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n\tbackground: $menu-submenu-background;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n\tcolor: $menu-icon;\n}\n\n/* TinyMCE */\n\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n\tbackground: $highlight-color;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/_mixins.scss",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\n@mixin button( $button-color, $text-color: white ) {\n\tbackground: $button-color;\n\tborder-color: darken( $button-color, 10% ) darken( $button-color, 15% ) darken( $button-color, 15% );\n\tcolor: $text-color;\n\tbox-shadow: 0 1px 0 darken( $button-color, 15% );\n\ttext-shadow: 0 -1px 1px darken( $button-color, 15% ),\n\t\t1px 0 1px darken( $button-color, 15% ),\n\t\t0 1px 1px darken( $button-color, 15% ),\n\t\t-1px 0 1px darken( $button-color, 15% );\n\n\t&:hover,\n\t&:focus {\n\t\tbackground: lighten( $button-color, 3% );\n\t\tborder-color: darken( $button-color, 15% );\n\t\tcolor: $text-color;\n\t\tbox-shadow: 0 1px 0 darken( $button-color, 15% );\n\t}\n\n\t&:focus {\n\t\tbox-shadow: inset 0 1px 0 darken( $button-color, 10% ),\n\t\t\t\t\t0 0 2px 1px #33b3db;\n\t}\n\n\t&:active {\n\t\tbackground: darken( $button-color, 10% );\n\t\tborder-color: darken( $button-color, 15% );\n\t \tbox-shadow: inset 0 2px 0 darken( $button-color, 15% );\n\t}\n\n\t&[disabled],\n\t&:disabled,\n\t&.button-primary-disabled,\n\t&.disabled {\n\t\tcolor: hsl( hue( $button-color ), 10%, 80% ) !important;\n\t\tbackground: darken( $button-color, 8% ) !important;\n\t\tborder-color: darken( $button-color, 15% ) !important;\n\t\ttext-shadow: none !important;\n\t}\n\n\t&.button-hero {\n\t\tbox-shadow: 0 2px 0 darken( $button-color, 15% ) !important;\n\t\t&:active {\n\t\t \tbox-shadow: inset 0 3px 0 darken( $button-color, 15% ) !important;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/_variables.scss",
    "content": "// assign default value to all undefined variables\n\n\n// core variables\n\n$text-color: #fff !default;\n$base-color: #23282d !default;\n$icon-color: hsl( hue( $base-color ), 7%, 95% ) !default;\n$highlight-color: #0073aa !default;\n$notification-color: #d54e21 !default;\n\n\n// global\n\n$body-background: #f1f1f1 !default;\n\n$link: #0073aa !default;\n$link-focus: lighten( $link, 10% ) !default;\n\n$button-color: $highlight-color !default;\n$form-checked: $highlight-color !default;\n\n\n// admin menu & admin-bar\n\n$menu-text: $text-color !default;\n$menu-icon: $icon-color !default;\n$menu-background: $base-color !default;\n\n$menu-highlight-text: $text-color !default;\n$menu-highlight-icon: $text-color !default;\n$menu-highlight-background: $highlight-color !default;\n\n$menu-current-text: $menu-highlight-text !default;\n$menu-current-icon: $menu-highlight-icon !default;\n$menu-current-background: $menu-highlight-background !default;\n\n$menu-submenu-text: mix( $base-color, $text-color, 30% ) !default;\n$menu-submenu-background: darken( $base-color, 7% ) !default;\n$menu-submenu-background-alt: desaturate( lighten( $menu-background, 7% ), 7% ) !default;\n\n$menu-submenu-focus-text: $highlight-color !default;\n$menu-submenu-current-text: $text-color !default;\n\n$menu-bubble-text: $text-color !default;\n$menu-bubble-background: $notification-color !default;\n$menu-bubble-current-text: $text-color !default;\n$menu-bubble-current-background: $menu-submenu-background !default;\n\n$menu-collapse-text: $menu-icon !default;\n$menu-collapse-icon: $menu-icon !default;\n$menu-collapse-focus-text: $text-color !default;\n$menu-collapse-focus-icon: $menu-highlight-icon !default;\n\n$adminbar-avatar-frame: lighten( $menu-background, 7% ) !default;\n$adminbar-input-background: lighten( $menu-background, 7% ) !default;\n\n$menu-customizer-text: mix( $base-color, $text-color, 40% ) !default;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/blue/colors-rtl.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #096484;\n}\n\ninput[type=radio]:checked:before {\n  background: #096484;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #e1a948;\n  border-color: #d39323 #bd831f #bd831f;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #bd831f;\n  box-shadow: 0 1px 0 #bd831f;\n  text-shadow: 0 -1px 1px #bd831f, -1px 0 1px #bd831f, 0 1px 1px #bd831f, 1px 0 1px #bd831f;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #e3af55;\n  border-color: #bd831f;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #bd831f;\n  box-shadow: 0 1px 0 #bd831f;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #d39323, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #d39323, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #d39323;\n  border-color: #bd831f;\n  -webkit-box-shadow: inset 0 2px 0 #bd831f;\n  box-shadow: inset 0 2px 0 #bd831f;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #d1cdc7 !important;\n  background: #db9925 !important;\n  border-color: #bd831f !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #bd831f !important;\n  box-shadow: 0 2px 0 #bd831f !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #bd831f !important;\n  box-shadow: inset 0 3px 0 #bd831f !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #52accc;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #52accc;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #096484;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #096484;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #e1a948;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #e1a948;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #e5f8ff;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #52accc;\n}\n\n.view-switch a.current:before {\n  color: #52accc;\n}\n\n.view-switch a:hover:before {\n  color: #e1a948;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #52accc;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #e5f8ff;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #096484;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #4796b3;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-left-color: #4796b3;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #e2ecf1;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #e2ecf1;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #fff;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #fff;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-left-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #096484;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #e1a948;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #4796b3;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #e5f8ff;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #e5f8ff;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #52accc;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #e5f8ff;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #fff;\n  background: #4796b3;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #fff;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #4796b3;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #74b6ce;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #e2ecf1;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #e5f8ff;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #fff;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #fff;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #e5f8ff;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #e5f8ff;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #6eb9d4;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #6eb9d4;\n  background-color: #6eb9d4;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #e2ecf1;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #096484;\n  border-color: #07526c;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #096484;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #096484;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #096484;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #096484;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #096484;\n}\n\n.attachment.details .check {\n  background-color: #096484;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #096484;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #096484;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #096484;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #096484;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #096484;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #096484;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #52accc;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #52accc;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #096484;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #096484;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #096484;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #e5f8ff;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #096484;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #4796b3;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #e5f8ff;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #096484;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/blue/colors.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #096484;\n}\n\ninput[type=radio]:checked:before {\n  background: #096484;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #e1a948;\n  border-color: #d39323 #bd831f #bd831f;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #bd831f;\n  box-shadow: 0 1px 0 #bd831f;\n  text-shadow: 0 -1px 1px #bd831f, 1px 0 1px #bd831f, 0 1px 1px #bd831f, -1px 0 1px #bd831f;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #e3af55;\n  border-color: #bd831f;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #bd831f;\n  box-shadow: 0 1px 0 #bd831f;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #d39323, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #d39323, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #d39323;\n  border-color: #bd831f;\n  -webkit-box-shadow: inset 0 2px 0 #bd831f;\n  box-shadow: inset 0 2px 0 #bd831f;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #d1cdc7 !important;\n  background: #db9925 !important;\n  border-color: #bd831f !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #bd831f !important;\n  box-shadow: 0 2px 0 #bd831f !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #bd831f !important;\n  box-shadow: inset 0 3px 0 #bd831f !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #52accc;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #52accc;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #096484;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #096484;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #e1a948;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #e1a948;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #e5f8ff;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #52accc;\n}\n\n.view-switch a.current:before {\n  color: #52accc;\n}\n\n.view-switch a:hover:before {\n  color: #e1a948;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #52accc;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #e5f8ff;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #096484;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #4796b3;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-right-color: #4796b3;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #e2ecf1;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #e2ecf1;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #fff;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #fff;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-right-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #096484;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #e1a948;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #4796b3;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #e5f8ff;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #e5f8ff;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #52accc;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #e5f8ff;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #fff;\n  background: #4796b3;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #fff;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #4796b3;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #74b6ce;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #e2ecf1;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #e5f8ff;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #fff;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #fff;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #e5f8ff;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #e5f8ff;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #6eb9d4;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #6eb9d4;\n  background-color: #6eb9d4;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #e2ecf1;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #096484;\n  border-color: #07526c;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #096484;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #096484;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #096484;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #096484;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #096484;\n}\n\n.attachment.details .check {\n  background-color: #096484;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #096484;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #096484;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #096484;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #096484;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #096484;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #096484;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #52accc;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #52accc;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #096484;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #096484;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #096484;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #e5f8ff;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #096484;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #4796b3;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #e5f8ff;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #096484;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/blue/colors.scss",
    "content": "$base-color: #52accc;\n$icon-color: #e5f8ff;\n$highlight-color: #096484;\n$notification-color: #e1a948;\n$button-color: #e1a948;\n\n$menu-submenu-text: #e2ecf1;\n$menu-submenu-focus-text: #fff;\n$menu-submenu-background: #4796b3;\n\n@import \"../_admin.scss\";\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/coffee/colors-rtl.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #59524c;\n}\n\ninput[type=radio]:checked:before {\n  background: #59524c;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #c7a589;\n  border-color: #b78b66 #ae7d55 #ae7d55;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ae7d55;\n  box-shadow: 0 1px 0 #ae7d55;\n  text-shadow: 0 -1px 1px #ae7d55, -1px 0 1px #ae7d55, 0 1px 1px #ae7d55, 1px 0 1px #ae7d55;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #ccad93;\n  border-color: #ae7d55;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ae7d55;\n  box-shadow: 0 1px 0 #ae7d55;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #b78b66, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #b78b66, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #b78b66;\n  border-color: #ae7d55;\n  -webkit-box-shadow: inset 0 2px 0 #ae7d55;\n  box-shadow: inset 0 2px 0 #ae7d55;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #d1ccc7 !important;\n  background: #ba906d !important;\n  border-color: #ae7d55 !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #ae7d55 !important;\n  box-shadow: 0 2px 0 #ae7d55 !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #ae7d55 !important;\n  box-shadow: inset 0 3px 0 #ae7d55 !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #59524c;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #59524c;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #c7a589;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #c7a589;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #9ea476;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #9ea476;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #f3f2f1;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #59524c;\n}\n\n.view-switch a.current:before {\n  color: #59524c;\n}\n\n.view-switch a:hover:before {\n  color: #9ea476;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #59524c;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #f3f2f1;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #c7a589;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #46403c;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-left-color: #46403c;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #cdcbc9;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #cdcbc9;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #c7a589;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #c7a589;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-left-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #c7a589;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #9ea476;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #46403c;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #f3f2f1;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #f3f2f1;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #59524c;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #f3f2f1;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #c7a589;\n  background: #46403c;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #c7a589;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #46403c;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #656463;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #cdcbc9;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #f3f2f1;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #c7a589;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #c7a589;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #f3f2f1;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #f3f2f1;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #6c645c;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #6c645c;\n  background-color: #6c645c;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #c7a589;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #cdcbc9;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #c7a589;\n  border-color: #bf9878;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #c7a589;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #c7a589;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #c7a589;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #c7a589;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #c7a589;\n}\n\n.attachment.details .check {\n  background-color: #c7a589;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #c7a589;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #c7a589;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #c7a589;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #c7a589;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #c7a589;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #c7a589;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #59524c;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #59524c;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #c7a589;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #c7a589;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #c7a589;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #f3f2f1;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #c7a589;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #46403c;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #f3f2f1;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #c7a589;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/coffee/colors.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #59524c;\n}\n\ninput[type=radio]:checked:before {\n  background: #59524c;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #c7a589;\n  border-color: #b78b66 #ae7d55 #ae7d55;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ae7d55;\n  box-shadow: 0 1px 0 #ae7d55;\n  text-shadow: 0 -1px 1px #ae7d55, 1px 0 1px #ae7d55, 0 1px 1px #ae7d55, -1px 0 1px #ae7d55;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #ccad93;\n  border-color: #ae7d55;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ae7d55;\n  box-shadow: 0 1px 0 #ae7d55;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #b78b66, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #b78b66, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #b78b66;\n  border-color: #ae7d55;\n  -webkit-box-shadow: inset 0 2px 0 #ae7d55;\n  box-shadow: inset 0 2px 0 #ae7d55;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #d1ccc7 !important;\n  background: #ba906d !important;\n  border-color: #ae7d55 !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #ae7d55 !important;\n  box-shadow: 0 2px 0 #ae7d55 !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #ae7d55 !important;\n  box-shadow: inset 0 3px 0 #ae7d55 !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #59524c;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #59524c;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #c7a589;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #c7a589;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #9ea476;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #9ea476;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #f3f2f1;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #59524c;\n}\n\n.view-switch a.current:before {\n  color: #59524c;\n}\n\n.view-switch a:hover:before {\n  color: #9ea476;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #59524c;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #f3f2f1;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #c7a589;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #46403c;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-right-color: #46403c;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #cdcbc9;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #cdcbc9;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #c7a589;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #c7a589;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-right-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #c7a589;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #9ea476;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #46403c;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #f3f2f1;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #f3f2f1;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #59524c;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #f3f2f1;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #c7a589;\n  background: #46403c;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #c7a589;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #46403c;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #656463;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #cdcbc9;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #f3f2f1;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #c7a589;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #c7a589;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #f3f2f1;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #f3f2f1;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #6c645c;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #6c645c;\n  background-color: #6c645c;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #c7a589;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #cdcbc9;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #c7a589;\n  border-color: #bf9878;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #c7a589;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #c7a589;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #c7a589;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #c7a589;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #c7a589;\n}\n\n.attachment.details .check {\n  background-color: #c7a589;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #c7a589;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #c7a589;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #c7a589;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #c7a589;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #c7a589;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #c7a589;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #59524c;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #59524c;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #c7a589;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #c7a589;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #c7a589;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #f3f2f1;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #c7a589;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #46403c;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #f3f2f1;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #c7a589;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/coffee/colors.scss",
    "content": "$base-color: #59524c;\n$highlight-color: #c7a589;\n$notification-color: #9ea476;\n\n$form-checked: $base-color;\n\n@import \"../_admin.scss\";\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/ectoplasm/colors-rtl.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #523f6d;\n}\n\ninput[type=radio]:checked:before {\n  background: #523f6d;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #a3b745;\n  border-color: #829237 #727f30 #727f30;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #727f30;\n  box-shadow: 0 1px 0 #727f30;\n  text-shadow: 0 -1px 1px #727f30, -1px 0 1px #727f30, 0 1px 1px #727f30, 1px 0 1px #727f30;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #a9bd4f;\n  border-color: #727f30;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #727f30;\n  box-shadow: 0 1px 0 #727f30;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #829237, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #829237, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #829237;\n  border-color: #727f30;\n  -webkit-box-shadow: inset 0 2px 0 #727f30;\n  box-shadow: inset 0 2px 0 #727f30;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #cfd1c7 !important;\n  background: #89993a !important;\n  border-color: #727f30 !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #727f30 !important;\n  box-shadow: 0 2px 0 #727f30 !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #727f30 !important;\n  box-shadow: inset 0 3px 0 #727f30 !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #523f6d;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #523f6d;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #a3b745;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #a3b745;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #d46f15;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #d46f15;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #ece6f6;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #523f6d;\n}\n\n.view-switch a.current:before {\n  color: #523f6d;\n}\n\n.view-switch a:hover:before {\n  color: #d46f15;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #523f6d;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #ece6f6;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #a3b745;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #413256;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-left-color: #413256;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #cbc5d3;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #cbc5d3;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #a3b745;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #a3b745;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-left-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #a3b745;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #d46f15;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #413256;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #ece6f6;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #ece6f6;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #523f6d;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #ece6f6;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #a3b745;\n  background: #413256;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #a3b745;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #413256;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #64537c;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #cbc5d3;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #ece6f6;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #a3b745;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #a3b745;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #ece6f6;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #ece6f6;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #634c84;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #634c84;\n  background-color: #634c84;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #a3b745;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #cbc5d3;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #a3b745;\n  border-color: #93a43e;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #a3b745;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #a3b745;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #a3b745;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #a3b745;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #a3b745;\n}\n\n.attachment.details .check {\n  background-color: #a3b745;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #a3b745;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #a3b745;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #a3b745;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #a3b745;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #a3b745;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #a3b745;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #523f6d;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #523f6d;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #a3b745;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #a3b745;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #a3b745;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #ece6f6;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #a3b745;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #413256;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #ece6f6;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #a3b745;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/ectoplasm/colors.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #523f6d;\n}\n\ninput[type=radio]:checked:before {\n  background: #523f6d;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #a3b745;\n  border-color: #829237 #727f30 #727f30;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #727f30;\n  box-shadow: 0 1px 0 #727f30;\n  text-shadow: 0 -1px 1px #727f30, 1px 0 1px #727f30, 0 1px 1px #727f30, -1px 0 1px #727f30;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #a9bd4f;\n  border-color: #727f30;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #727f30;\n  box-shadow: 0 1px 0 #727f30;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #829237, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #829237, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #829237;\n  border-color: #727f30;\n  -webkit-box-shadow: inset 0 2px 0 #727f30;\n  box-shadow: inset 0 2px 0 #727f30;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #cfd1c7 !important;\n  background: #89993a !important;\n  border-color: #727f30 !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #727f30 !important;\n  box-shadow: 0 2px 0 #727f30 !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #727f30 !important;\n  box-shadow: inset 0 3px 0 #727f30 !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #523f6d;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #523f6d;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #a3b745;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #a3b745;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #d46f15;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #d46f15;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #ece6f6;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #523f6d;\n}\n\n.view-switch a.current:before {\n  color: #523f6d;\n}\n\n.view-switch a:hover:before {\n  color: #d46f15;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #523f6d;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #ece6f6;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #a3b745;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #413256;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-right-color: #413256;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #cbc5d3;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #cbc5d3;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #a3b745;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #a3b745;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-right-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #a3b745;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #d46f15;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #413256;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #ece6f6;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #ece6f6;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #523f6d;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #ece6f6;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #a3b745;\n  background: #413256;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #a3b745;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #413256;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #64537c;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #cbc5d3;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #ece6f6;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #a3b745;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #a3b745;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #ece6f6;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #ece6f6;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #634c84;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #634c84;\n  background-color: #634c84;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #a3b745;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #cbc5d3;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #a3b745;\n  border-color: #93a43e;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #a3b745;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #a3b745;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #a3b745;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #a3b745;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #a3b745;\n}\n\n.attachment.details .check {\n  background-color: #a3b745;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #a3b745;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #a3b745;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #a3b745;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #a3b745;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #a3b745;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #a3b745;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #523f6d;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #523f6d;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #a3b745;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #a3b745;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #a3b745;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #ece6f6;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #a3b745;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #413256;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #ece6f6;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #a3b745;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/ectoplasm/colors.scss",
    "content": "$base-color: #523f6d;\n$icon-color: #ece6f6;\n$highlight-color: #a3b745;\n$notification-color: #d46f15;\n\n$form-checked: $base-color;\n\n@import \"../_admin.scss\";\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/light/colors-rtl.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f5f5f5;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #04a4cc;\n}\n\ninput[type=radio]:checked:before {\n  background: #04a4cc;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #04a4cc;\n  border-color: #037c9a #036881 #036881;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #036881;\n  box-shadow: 0 1px 0 #036881;\n  text-shadow: 0 -1px 1px #036881, -1px 0 1px #036881, 0 1px 1px #036881, 1px 0 1px #036881;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #04b0db;\n  border-color: #036881;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #036881;\n  box-shadow: 0 1px 0 #036881;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #037c9a, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #037c9a, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #037c9a;\n  border-color: #036881;\n  -webkit-box-shadow: inset 0 2px 0 #036881;\n  box-shadow: inset 0 2px 0 #036881;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #c7cfd1 !important;\n  background: #0384a4 !important;\n  border-color: #036881 !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #036881 !important;\n  box-shadow: 0 2px 0 #036881 !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #036881 !important;\n  box-shadow: inset 0 3px 0 #036881 !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #333;\n  background-color: #e5e5e5;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #e5e5e5;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #888;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #888;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #d64e07;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #d64e07;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #999;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #333;\n  background-color: #e5e5e5;\n}\n\n.view-switch a.current:before {\n  color: #e5e5e5;\n}\n\n.view-switch a:hover:before {\n  color: #d64e07;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #e5e5e5;\n}\n\n#adminmenu a {\n  color: #333;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #999;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #888;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #ccc;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f5f5f5;\n  border-bottom-color: #f5f5f5;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #fff;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-left-color: #fff;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #686868;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #686868;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #04a4cc;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #333;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #04a4cc;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-left-color: #f5f5f5;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #888;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #ccc;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #d64e07;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #333;\n  background: #fff;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #777;\n}\n\n#collapse-menu:hover {\n  color: #333;\n}\n\n#collapse-button div:after {\n  color: #999;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #555;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #333;\n  background: #e5e5e5;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #333;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #999;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #04a4cc;\n  background: #fff;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #04a4cc;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #ccc;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #fff;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #f7f7f7;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #686868;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #999;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #04a4cc;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #04a4cc;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #999;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #999;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #333;\n  background: #f7f7f7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #333;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #333;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #333;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #333;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #f7f7f7;\n  background-color: #f7f7f7;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #333;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #04a4cc;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #686868;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #04a4cc;\n  border-color: #0490b3;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #04a4cc;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #04a4cc;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #04a4cc;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #04a4cc;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #04a4cc;\n}\n\n.attachment.details .check {\n  background-color: #04a4cc;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #04a4cc;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #04a4cc;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #04a4cc;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #04a4cc;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #04a4cc;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #04a4cc;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #e5e5e5;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #333;\n  background-color: #e5e5e5;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #333;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #888;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #888;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #888;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #999;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #888;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #fff;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #999;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #04a4cc;\n}\n\n/* temporary fix for admin-bar hover color */\n#wpadminbar .ab-top-menu > li:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.hover > .ab-item,\n#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default li:hover span.ab-label,\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary li.hover span.ab-label,\n#wpadminbar .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #333;\n}\n\n/* Override the theme filter highlight color for this scheme */\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #04a4cc;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/light/colors.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f5f5f5;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #04a4cc;\n}\n\ninput[type=radio]:checked:before {\n  background: #04a4cc;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #04a4cc;\n  border-color: #037c9a #036881 #036881;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #036881;\n  box-shadow: 0 1px 0 #036881;\n  text-shadow: 0 -1px 1px #036881, 1px 0 1px #036881, 0 1px 1px #036881, -1px 0 1px #036881;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #04b0db;\n  border-color: #036881;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #036881;\n  box-shadow: 0 1px 0 #036881;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #037c9a, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #037c9a, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #037c9a;\n  border-color: #036881;\n  -webkit-box-shadow: inset 0 2px 0 #036881;\n  box-shadow: inset 0 2px 0 #036881;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #c7cfd1 !important;\n  background: #0384a4 !important;\n  border-color: #036881 !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #036881 !important;\n  box-shadow: 0 2px 0 #036881 !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #036881 !important;\n  box-shadow: inset 0 3px 0 #036881 !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #333;\n  background-color: #e5e5e5;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #e5e5e5;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #888;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #888;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #d64e07;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #d64e07;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #999;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #333;\n  background-color: #e5e5e5;\n}\n\n.view-switch a.current:before {\n  color: #e5e5e5;\n}\n\n.view-switch a:hover:before {\n  color: #d64e07;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #e5e5e5;\n}\n\n#adminmenu a {\n  color: #333;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #999;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #888;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #ccc;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f5f5f5;\n  border-bottom-color: #f5f5f5;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #fff;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-right-color: #fff;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #686868;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #686868;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #04a4cc;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #333;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #04a4cc;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-right-color: #f5f5f5;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #888;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #ccc;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #d64e07;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #333;\n  background: #fff;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #777;\n}\n\n#collapse-menu:hover {\n  color: #333;\n}\n\n#collapse-button div:after {\n  color: #999;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #555;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #333;\n  background: #e5e5e5;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #333;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #999;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #04a4cc;\n  background: #fff;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #04a4cc;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #ccc;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #fff;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #f7f7f7;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #686868;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #999;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #04a4cc;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #04a4cc;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #999;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #999;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #333;\n  background: #f7f7f7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #333;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #333;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #333;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #333;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #f7f7f7;\n  background-color: #f7f7f7;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #333;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #04a4cc;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #686868;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #04a4cc;\n  border-color: #0490b3;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #04a4cc;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #04a4cc;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #04a4cc;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #04a4cc;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #04a4cc;\n}\n\n.attachment.details .check {\n  background-color: #04a4cc;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #04a4cc;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #04a4cc;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #04a4cc;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #04a4cc;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #04a4cc;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #04a4cc;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #e5e5e5;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #333;\n  background-color: #e5e5e5;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #333;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #888;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #888;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #888;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #999;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #888;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #fff;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #999;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #04a4cc;\n}\n\n/* temporary fix for admin-bar hover color */\n#wpadminbar .ab-top-menu > li:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.hover > .ab-item,\n#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default li:hover span.ab-label,\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary li.hover span.ab-label,\n#wpadminbar .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #333;\n}\n\n/* Override the theme filter highlight color for this scheme */\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #04a4cc;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/light/colors.scss",
    "content": "$base-color: #e5e5e5;\n$icon-color: #999;\n$text-color: #333;\n$highlight-color: #04a4cc;\n$notification-color: #d64e07;\n\n$body-background: #f5f5f5;\n\n$menu-highlight-text: #fff;\n$menu-highlight-icon: #ccc;\n$menu-highlight-background: #888;\n\n$menu-bubble-text: #fff;\n$menu-avatar-frame: #aaa;\n$menu-submenu-background: #fff;\n\n$menu-collapse-text: #777;\n$menu-collapse-focus-icon: #555;\n\n@import \"../_admin.scss\";\n\n/* temporary fix for admin-bar hover color */\n#wpadminbar .ab-top-menu > li:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.hover > .ab-item,\n#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default li:hover span.ab-label,\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary li.hover span.ab-label,\n#wpadminbar .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n\tcolor: $text-color;\n}\n\n/* Override the theme filter highlight color for this scheme */\n.theme-section.current,\n.theme-filter.current {\n\tborder-bottom-color: $highlight-color;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/midnight/colors-rtl.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #e14d43;\n}\n\ninput[type=radio]:checked:before {\n  background: #e14d43;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #e14d43;\n  border-color: #d02c21 #ba281e #ba281e;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ba281e;\n  box-shadow: 0 1px 0 #ba281e;\n  text-shadow: 0 -1px 1px #ba281e, -1px 0 1px #ba281e, 0 1px 1px #ba281e, 1px 0 1px #ba281e;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #e35950;\n  border-color: #ba281e;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ba281e;\n  box-shadow: 0 1px 0 #ba281e;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #d02c21, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #d02c21, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #d02c21;\n  border-color: #ba281e;\n  -webkit-box-shadow: inset 0 2px 0 #ba281e;\n  box-shadow: inset 0 2px 0 #ba281e;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #d1c8c7 !important;\n  background: #d92e23 !important;\n  border-color: #ba281e !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #ba281e !important;\n  box-shadow: 0 2px 0 #ba281e !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #ba281e !important;\n  box-shadow: inset 0 3px 0 #ba281e !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #363b3f;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #363b3f;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #e14d43;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #e14d43;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #69a8bb;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #69a8bb;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #f1f2f3;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #363b3f;\n}\n\n.view-switch a.current:before {\n  color: #363b3f;\n}\n\n.view-switch a:hover:before {\n  color: #69a8bb;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #363b3f;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #f1f2f3;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #e14d43;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #26292c;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-left-color: #26292c;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #c3c4c5;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #c3c4c5;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #e14d43;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #e14d43;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-left-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #e14d43;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #69a8bb;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #26292c;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #f1f2f3;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #f1f2f3;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #363b3f;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #f1f2f3;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #e14d43;\n  background: #26292c;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #e14d43;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #26292c;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #4c4c4d;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #c3c4c5;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #f1f2f3;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #e14d43;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #e14d43;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #f1f2f3;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #f1f2f3;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #464d52;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #464d52;\n  background-color: #464d52;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #e14d43;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #c3c4c5;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #e14d43;\n  border-color: #dd382d;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #e14d43;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #e14d43;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #e14d43;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #e14d43;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #e14d43;\n}\n\n.attachment.details .check {\n  background-color: #e14d43;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #e14d43;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #e14d43;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #e14d43;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #e14d43;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #e14d43;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #e14d43;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #363b3f;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #363b3f;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #e14d43;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #e14d43;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #e14d43;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #f1f2f3;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #e14d43;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #26292c;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #f1f2f3;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #e14d43;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/midnight/colors.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #e14d43;\n}\n\ninput[type=radio]:checked:before {\n  background: #e14d43;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #e14d43;\n  border-color: #d02c21 #ba281e #ba281e;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ba281e;\n  box-shadow: 0 1px 0 #ba281e;\n  text-shadow: 0 -1px 1px #ba281e, 1px 0 1px #ba281e, 0 1px 1px #ba281e, -1px 0 1px #ba281e;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #e35950;\n  border-color: #ba281e;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ba281e;\n  box-shadow: 0 1px 0 #ba281e;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #d02c21, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #d02c21, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #d02c21;\n  border-color: #ba281e;\n  -webkit-box-shadow: inset 0 2px 0 #ba281e;\n  box-shadow: inset 0 2px 0 #ba281e;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #d1c8c7 !important;\n  background: #d92e23 !important;\n  border-color: #ba281e !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #ba281e !important;\n  box-shadow: 0 2px 0 #ba281e !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #ba281e !important;\n  box-shadow: inset 0 3px 0 #ba281e !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #363b3f;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #363b3f;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #e14d43;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #e14d43;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #69a8bb;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #69a8bb;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #f1f2f3;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #363b3f;\n}\n\n.view-switch a.current:before {\n  color: #363b3f;\n}\n\n.view-switch a:hover:before {\n  color: #69a8bb;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #363b3f;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #f1f2f3;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #e14d43;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #26292c;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-right-color: #26292c;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #c3c4c5;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #c3c4c5;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #e14d43;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #e14d43;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-right-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #e14d43;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #69a8bb;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #26292c;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #f1f2f3;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #f1f2f3;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #363b3f;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #f1f2f3;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #e14d43;\n  background: #26292c;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #e14d43;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #26292c;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #4c4c4d;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #c3c4c5;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #f1f2f3;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #e14d43;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #e14d43;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #f1f2f3;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #f1f2f3;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #464d52;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #464d52;\n  background-color: #464d52;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #e14d43;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #c3c4c5;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #e14d43;\n  border-color: #dd382d;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #e14d43;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #e14d43;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #e14d43;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #e14d43;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #e14d43;\n}\n\n.attachment.details .check {\n  background-color: #e14d43;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #e14d43;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #e14d43;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #e14d43;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #e14d43;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #e14d43;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #e14d43;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #363b3f;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #363b3f;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #e14d43;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #e14d43;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #e14d43;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #f1f2f3;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #e14d43;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #26292c;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #f1f2f3;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #e14d43;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/midnight/colors.scss",
    "content": "$base-color: #363b3f;\n$highlight-color: #e14d43;\n$notification-color: #69a8bb;\n\n@import \"../_admin.scss\";\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/ocean/colors-rtl.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #738e96;\n}\n\ninput[type=radio]:checked:before {\n  background: #738e96;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #9ebaa0;\n  border-color: #80a583 #719a74 #719a74;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #719a74;\n  box-shadow: 0 1px 0 #719a74;\n  text-shadow: 0 -1px 1px #719a74, -1px 0 1px #719a74, 0 1px 1px #719a74, 1px 0 1px #719a74;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #a7c0a9;\n  border-color: #719a74;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #719a74;\n  box-shadow: 0 1px 0 #719a74;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #80a583, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #80a583, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #80a583;\n  border-color: #719a74;\n  -webkit-box-shadow: inset 0 2px 0 #719a74;\n  box-shadow: inset 0 2px 0 #719a74;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #c7d1c8 !important;\n  background: #86a989 !important;\n  border-color: #719a74 !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #719a74 !important;\n  box-shadow: 0 2px 0 #719a74 !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #719a74 !important;\n  box-shadow: inset 0 3px 0 #719a74 !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #738e96;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #738e96;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #9ebaa0;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #9ebaa0;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #aa9d88;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #aa9d88;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #f2fcff;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #738e96;\n}\n\n.view-switch a.current:before {\n  color: #738e96;\n}\n\n.view-switch a:hover:before {\n  color: #aa9d88;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #738e96;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #f2fcff;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #9ebaa0;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #627c83;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-left-color: #627c83;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #d5dde0;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #d5dde0;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #9ebaa0;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #9ebaa0;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-left-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #9ebaa0;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #aa9d88;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #627c83;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #f2fcff;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #f2fcff;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #738e96;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #f2fcff;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #9ebaa0;\n  background: #627c83;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #9ebaa0;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #627c83;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #8f9a9e;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #d5dde0;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #f2fcff;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #9ebaa0;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #9ebaa0;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #f2fcff;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #f2fcff;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #879ea5;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #879ea5;\n  background-color: #879ea5;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #9ebaa0;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #d5dde0;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #9ebaa0;\n  border-color: #8faf91;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #9ebaa0;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #9ebaa0;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #9ebaa0;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #9ebaa0;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #9ebaa0;\n}\n\n.attachment.details .check {\n  background-color: #9ebaa0;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #9ebaa0;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #9ebaa0;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #9ebaa0;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #9ebaa0;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #9ebaa0;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #9ebaa0;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #738e96;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #738e96;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #9ebaa0;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #9ebaa0;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #9ebaa0;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #f2fcff;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #9ebaa0;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #627c83;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #f2fcff;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #9ebaa0;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/ocean/colors.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #738e96;\n}\n\ninput[type=radio]:checked:before {\n  background: #738e96;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #9ebaa0;\n  border-color: #80a583 #719a74 #719a74;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #719a74;\n  box-shadow: 0 1px 0 #719a74;\n  text-shadow: 0 -1px 1px #719a74, 1px 0 1px #719a74, 0 1px 1px #719a74, -1px 0 1px #719a74;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #a7c0a9;\n  border-color: #719a74;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #719a74;\n  box-shadow: 0 1px 0 #719a74;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #80a583, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #80a583, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #80a583;\n  border-color: #719a74;\n  -webkit-box-shadow: inset 0 2px 0 #719a74;\n  box-shadow: inset 0 2px 0 #719a74;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #c7d1c8 !important;\n  background: #86a989 !important;\n  border-color: #719a74 !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #719a74 !important;\n  box-shadow: 0 2px 0 #719a74 !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #719a74 !important;\n  box-shadow: inset 0 3px 0 #719a74 !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #738e96;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #738e96;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #9ebaa0;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #9ebaa0;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #aa9d88;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #aa9d88;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #f2fcff;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #738e96;\n}\n\n.view-switch a.current:before {\n  color: #738e96;\n}\n\n.view-switch a:hover:before {\n  color: #aa9d88;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #738e96;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #f2fcff;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #9ebaa0;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #627c83;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-right-color: #627c83;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #d5dde0;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #d5dde0;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #9ebaa0;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #9ebaa0;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-right-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #9ebaa0;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #aa9d88;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #627c83;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #f2fcff;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #f2fcff;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #738e96;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #f2fcff;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #9ebaa0;\n  background: #627c83;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #9ebaa0;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #627c83;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #8f9a9e;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #d5dde0;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #f2fcff;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #9ebaa0;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #9ebaa0;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #f2fcff;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #f2fcff;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #879ea5;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #879ea5;\n  background-color: #879ea5;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #9ebaa0;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #d5dde0;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #9ebaa0;\n  border-color: #8faf91;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #9ebaa0;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #9ebaa0;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #9ebaa0;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #9ebaa0;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #9ebaa0;\n}\n\n.attachment.details .check {\n  background-color: #9ebaa0;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #9ebaa0;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #9ebaa0;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #9ebaa0;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #9ebaa0;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #9ebaa0;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #9ebaa0;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #738e96;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #738e96;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #9ebaa0;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #9ebaa0;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #9ebaa0;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #f2fcff;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #9ebaa0;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #627c83;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #f2fcff;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #9ebaa0;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/ocean/colors.scss",
    "content": "$base-color: #738e96;\n$icon-color: #f2fcff;\n$highlight-color: #9ebaa0;\n$notification-color: #aa9d88;\n\n$form-checked: $base-color;\n\n@import \"../_admin.scss\";\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/sunrise/colors-rtl.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #dd823b;\n}\n\ninput[type=radio]:checked:before {\n  background: #dd823b;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #dd823b;\n  border-color: #c36922 #ad5d1e #ad5d1e;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ad5d1e;\n  box-shadow: 0 1px 0 #ad5d1e;\n  text-shadow: 0 -1px 1px #ad5d1e, -1px 0 1px #ad5d1e, 0 1px 1px #ad5d1e, 1px 0 1px #ad5d1e;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #df8a48;\n  border-color: #ad5d1e;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ad5d1e;\n  box-shadow: 0 1px 0 #ad5d1e;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #c36922, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #c36922, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #c36922;\n  border-color: #ad5d1e;\n  -webkit-box-shadow: inset 0 2px 0 #ad5d1e;\n  box-shadow: inset 0 2px 0 #ad5d1e;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #d1cbc7 !important;\n  background: #cc6d23 !important;\n  border-color: #ad5d1e !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #ad5d1e !important;\n  box-shadow: 0 2px 0 #ad5d1e !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #ad5d1e !important;\n  box-shadow: inset 0 3px 0 #ad5d1e !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #cf4944;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #cf4944;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #dd823b;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #dd823b;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #ccaf0b;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #ccaf0b;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #f3f1f1;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #cf4944;\n}\n\n.view-switch a.current:before {\n  color: #cf4944;\n}\n\n.view-switch a:hover:before {\n  color: #ccaf0b;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #cf4944;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #f3f1f1;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #dd823b;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #be3631;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-left-color: #be3631;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #f1c8c7;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #f1c8c7;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #f7e3d3;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #f7e3d3;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-left-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #dd823b;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #ccaf0b;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #be3631;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #f3f1f1;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #f3f1f1;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #cf4944;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #f3f1f1;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #f7e3d3;\n  background: #be3631;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #f7e3d3;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #be3631;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #cf6b67;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #f1c8c7;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #f3f1f1;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #f7e3d3;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #f7e3d3;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #f3f1f1;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #f3f1f1;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #d66560;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #d66560;\n  background-color: #d66560;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #f7e3d3;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #f1c8c7;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #dd823b;\n  border-color: #d97426;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #dd823b;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #dd823b;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #dd823b;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #dd823b;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #dd823b;\n}\n\n.attachment.details .check {\n  background-color: #dd823b;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #dd823b;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #dd823b;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #dd823b;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #dd823b;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #dd823b;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #dd823b;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #cf4944;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #cf4944;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #dd823b;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #dd823b;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #dd823b;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #f3f1f1;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #dd823b;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #be3631;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #f3f1f1;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #dd823b;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/sunrise/colors.css",
    "content": "/*\n * Button mixin- creates 3d-ish button effect with correct\n * highlights/shadows, based on a base color.\n */\nhtml {\n  background: #f1f1f1;\n}\n\n/* Links */\na {\n  color: #0073aa;\n}\n\na:hover, a:active, a:focus {\n  color: #0096dd;\n}\n\n#media-upload a.del-link:hover,\ndiv.dashboard-widget-submit input:hover,\n.subsubsub a:hover,\n.subsubsub a.current:hover {\n  color: #0096dd;\n}\n\n/* Forms */\ninput[type=checkbox]:checked:before {\n  color: #dd823b;\n}\n\ninput[type=radio]:checked:before {\n  background: #dd823b;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n  color: #0096dd;\n}\n\n/* Core UI */\n.wp-core-ui .button-primary {\n  background: #dd823b;\n  border-color: #c36922 #ad5d1e #ad5d1e;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ad5d1e;\n  box-shadow: 0 1px 0 #ad5d1e;\n  text-shadow: 0 -1px 1px #ad5d1e, 1px 0 1px #ad5d1e, 0 1px 1px #ad5d1e, -1px 0 1px #ad5d1e;\n}\n\n.wp-core-ui .button-primary:hover, .wp-core-ui .button-primary:focus {\n  background: #df8a48;\n  border-color: #ad5d1e;\n  color: white;\n  -webkit-box-shadow: 0 1px 0 #ad5d1e;\n  box-shadow: 0 1px 0 #ad5d1e;\n}\n\n.wp-core-ui .button-primary:focus {\n  -webkit-box-shadow: inset 0 1px 0 #c36922, 0 0 2px 1px #33b3db;\n  box-shadow: inset 0 1px 0 #c36922, 0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary:active {\n  background: #c36922;\n  border-color: #ad5d1e;\n  -webkit-box-shadow: inset 0 2px 0 #ad5d1e;\n  box-shadow: inset 0 2px 0 #ad5d1e;\n}\n\n.wp-core-ui .button-primary[disabled], .wp-core-ui .button-primary:disabled, .wp-core-ui .button-primary.button-primary-disabled, .wp-core-ui .button-primary.disabled {\n  color: #d1cbc7 !important;\n  background: #cc6d23 !important;\n  border-color: #ad5d1e !important;\n  text-shadow: none !important;\n}\n\n.wp-core-ui .button-primary.button-hero {\n  -webkit-box-shadow: 0 2px 0 #ad5d1e !important;\n  box-shadow: 0 2px 0 #ad5d1e !important;\n}\n\n.wp-core-ui .button-primary.button-hero:active {\n  -webkit-box-shadow: inset 0 3px 0 #ad5d1e !important;\n  box-shadow: inset 0 3px 0 #ad5d1e !important;\n}\n\n.wp-core-ui .wp-ui-primary {\n  color: #fff;\n  background-color: #cf4944;\n}\n\n.wp-core-ui .wp-ui-text-primary {\n  color: #cf4944;\n}\n\n.wp-core-ui .wp-ui-highlight {\n  color: #fff;\n  background-color: #dd823b;\n}\n\n.wp-core-ui .wp-ui-text-highlight {\n  color: #dd823b;\n}\n\n.wp-core-ui .wp-ui-notification {\n  color: #fff;\n  background-color: #ccaf0b;\n}\n\n.wp-core-ui .wp-ui-text-notification {\n  color: #ccaf0b;\n}\n\n.wp-core-ui .wp-ui-text-icon {\n  color: #f3f1f1;\n}\n\n/* List tables */\n.wrap .add-new-h2:hover,\n.wrap .page-title-action:hover,\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n  color: #fff;\n  background-color: #cf4944;\n}\n\n.view-switch a.current:before {\n  color: #cf4944;\n}\n\n.view-switch a:hover:before {\n  color: #ccaf0b;\n}\n\n/* Admin Menu */\n#adminmenuback,\n#adminmenuwrap,\n#adminmenu {\n  background: #cf4944;\n}\n\n#adminmenu a {\n  color: #fff;\n}\n\n#adminmenu div.wp-menu-image:before {\n  color: #f3f1f1;\n}\n\n#adminmenu a:hover,\n#adminmenu li.menu-top:hover,\n#adminmenu li.opensub > a.menu-top,\n#adminmenu li > a.menu-top:focus {\n  color: #fff;\n  background-color: #dd823b;\n}\n\n#adminmenu li.menu-top:hover div.wp-menu-image:before,\n#adminmenu li.opensub > a.menu-top div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Active tabs use a bottom border color that matches the page background color. */\n.about-wrap h2 .nav-tab-active,\n.nav-tab-active,\n.nav-tab-active:hover {\n  background-color: #f1f1f1;\n  border-bottom-color: #f1f1f1;\n}\n\n/* Admin Menu: submenu */\n#adminmenu .wp-submenu,\n#adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu {\n  background: #be3631;\n}\n\n#adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after {\n  border-right-color: #be3631;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n  color: #f1c8c7;\n}\n\n#adminmenu .wp-submenu a,\n#adminmenu .wp-has-current-submenu .wp-submenu a,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a {\n  color: #f1c8c7;\n}\n\n#adminmenu .wp-submenu a:focus, #adminmenu .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:focus,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu a:hover {\n  color: #f7e3d3;\n}\n\n/* Admin Menu: current */\n#adminmenu .wp-submenu li.current a,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a {\n  color: #fff;\n}\n\n#adminmenu .wp-submenu li.current a:hover, #adminmenu .wp-submenu li.current a:focus,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:hover,\n#adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a:focus,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:hover,\n#adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a:focus {\n  color: #f7e3d3;\n}\n\nul#adminmenu a.wp-has-current-submenu:after,\nul#adminmenu > li.current > a.current:after {\n  border-right-color: #f1f1f1;\n}\n\n#adminmenu li.current a.menu-top,\n#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,\n#adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head,\n.folded #adminmenu li.current.menu-top {\n  color: #fff;\n  background: #dd823b;\n}\n\n#adminmenu li.wp-has-current-submenu div.wp-menu-image:before,\n#adminmenu a.current:hover div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu a:focus div.wp-menu-image:before,\n#adminmenu li.wp-has-current-submenu.opensub div.wp-menu-image:before,\n#adminmenu li:hover div.wp-menu-image:before,\n#adminmenu li a:focus div.wp-menu-image:before,\n#adminmenu li.opensub div.wp-menu-image:before,\n.ie8 #adminmenu li.opensub div.wp-menu-image:before {\n  color: #fff;\n}\n\n/* Admin Menu: bubble */\n#adminmenu .awaiting-mod,\n#adminmenu .update-plugins {\n  color: #fff;\n  background: #ccaf0b;\n}\n\n#adminmenu li.current a .awaiting-mod,\n#adminmenu li a.wp-has-current-submenu .update-plugins,\n#adminmenu li:hover a .awaiting-mod,\n#adminmenu li.menu-top:hover > a .update-plugins {\n  color: #fff;\n  background: #be3631;\n}\n\n/* Admin Menu: collapse button */\n#collapse-menu {\n  color: #f3f1f1;\n}\n\n#collapse-menu:hover {\n  color: #fff;\n}\n\n#collapse-button div:after {\n  color: #f3f1f1;\n}\n\n#collapse-menu:hover #collapse-button div:after {\n  color: #fff;\n}\n\n/* Admin Bar */\n#wpadminbar {\n  color: #fff;\n  background: #cf4944;\n}\n\n#wpadminbar .ab-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n  color: #fff;\n}\n\n#wpadminbar .ab-icon,\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar .ab-item:after {\n  color: #f3f1f1;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.menupop.hover > .ab-item {\n  color: #f7e3d3;\n  background: #be3631;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n  color: #f7e3d3;\n}\n\n#wpadminbar:not(.mobile) li:hover .ab-icon:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:before,\n#wpadminbar:not(.mobile) li:hover .ab-item:after,\n#wpadminbar:not(.mobile) li:hover #adminbarsearch:before {\n  color: #fff;\n}\n\n/* Admin Bar: submenu */\n#wpadminbar .menupop .ab-sub-wrapper {\n  background: #be3631;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n  background: #cf6b67;\n}\n\n#wpadminbar .ab-submenu .ab-item,\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n  color: #f1c8c7;\n}\n\n#wpadminbar .quicklinks li .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:before {\n  color: #f3f1f1;\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n  color: #f7e3d3;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar,\n#wpadminbar .menupop .menupop > .ab-item:hover:before,\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n  color: #f7e3d3;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n  color: #f3f1f1;\n}\n\n/* Admin Bar: search */\n#wpadminbar #adminbarsearch:before {\n  color: #f3f1f1;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n  color: #fff;\n  background: #d66560;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n  color: #fff;\n  opacity: 0.7;\n}\n\n/* Admin Bar: my account */\n#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n  border-color: #d66560;\n  background-color: #d66560;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name {\n  color: #fff;\n}\n\n#wpadminbar #wp-admin-bar-user-info a:hover .display-name {\n  color: #f7e3d3;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n  color: #f1c8c7;\n}\n\n/* Pointers */\n.wp-pointer .wp-pointer-content h3 {\n  background-color: #dd823b;\n  border-color: #d97426;\n}\n\n.wp-pointer .wp-pointer-content h3:before {\n  color: #dd823b;\n}\n\n.wp-pointer.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow,\n.wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner {\n  border-bottom-color: #dd823b;\n}\n\n/* Media */\n.media-item .bar,\n.media-progress-bar div {\n  background-color: #dd823b;\n}\n\n.details.attachment {\n  -webkit-box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #dd823b;\n  box-shadow: inset 0 0 0 3px #fff, inset 0 0 0 7px #dd823b;\n}\n\n.attachment.details .check {\n  background-color: #dd823b;\n  -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px #dd823b;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 2px #dd823b;\n}\n\n.media-selection .attachment.selection.details .thumbnail {\n  -webkit-box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #dd823b;\n  box-shadow: 0px 0px 0px 1px #fff, 0px 0px 0px 3px #dd823b;\n}\n\n/* Themes */\n.theme-browser .theme.active .theme-name,\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n  background: #dd823b;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n  color: #dd823b;\n}\n\n.theme-section.current,\n.theme-filter.current {\n  border-bottom-color: #cf4944;\n}\n\nbody.more-filters-opened .more-filters {\n  color: #fff;\n  background-color: #cf4944;\n}\n\nbody.more-filters-opened .more-filters:before {\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover,\nbody.more-filters-opened .more-filters:focus {\n  background-color: #dd823b;\n  color: #fff;\n}\n\nbody.more-filters-opened .more-filters:hover:before,\nbody.more-filters-opened .more-filters:focus:before {\n  color: #fff;\n}\n\n/* Widgets */\n.widgets-chooser li.widgets-chooser-selected {\n  background-color: #dd823b;\n  color: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n  color: #fff;\n}\n\n/* Customize */\n#customize-theme-controls .widget-area-select .selected {\n  background-color: #dd823b;\n  color: #fff;\n}\n\n/* Responsive Component */\ndiv#wp-responsive-toggle a:before {\n  color: #f3f1f1;\n}\n\n.wp-responsive-open div#wp-responsive-toggle a {\n  border-color: transparent;\n  background: #dd823b;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a {\n  background: #be3631;\n}\n\n.wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before {\n  color: #f3f1f1;\n}\n\n/* TinyMCE */\n.mce-container.mce-menu .mce-menu-item:hover,\n.mce-container.mce-menu .mce-menu-item.mce-selected,\n.mce-container.mce-menu .mce-menu-item:focus,\n.mce-container.mce-menu .mce-menu-item-normal.mce-active,\n.mce-container.mce-menu .mce-menu-item-preview.mce-active {\n  background: #dd823b;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/colors/sunrise/colors.scss",
    "content": "$base-color: #cf4944;\n$highlight-color: #dd823b;\n$notification-color: #ccaf0b;\n$menu-submenu-focus-text: lighten( $highlight-color, 35% );\n\n@import \"../_admin.scss\";\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/common-rtl.css",
    "content": "/* 2 column liquid layout */\n#wpwrap {\n\theight: auto;\n\tmin-height: 100%;\n\twidth: 100%;\n\tposition: relative;\n\t-webkit-font-smoothing: subpixel-antialiased;\n}\n\n#wpcontent {\n\theight: 100%;\n\tpadding-right: 20px;\n}\n\n#wpcontent,\n#wpfooter {\n\tmargin-right: 160px;\n}\n\n.folded #wpcontent,\n.folded #wpfooter {\n\tmargin-right: 36px;\n}\n\n#wpbody-content {\n\tpadding-bottom: 65px;\n\tfloat: right;\n\twidth: 100%;\n\toverflow: visible !important;\n}\n\n/* inner 2 column liquid layout */\n\n.inner-sidebar {\n\tfloat: left;\n\tclear: left;\n\tdisplay: none;\n\twidth: 281px;\n\tposition: relative;\n}\n\n.columns-2 .inner-sidebar {\n\tmargin-left: auto;\n\twidth: 286px;\n\tdisplay: block;\n}\n\n.inner-sidebar #side-sortables,\n.columns-2 .inner-sidebar #side-sortables {\n\tmin-height: 300px;\n\twidth: 280px;\n\tpadding: 0;\n}\n\n.has-right-sidebar .inner-sidebar {\n\tdisplay: block;\n}\n\n.has-right-sidebar #post-body {\n\tfloat: right;\n\tclear: right;\n\twidth: 100%;\n\tmargin-left: -2000px;\n}\n\n.has-right-sidebar #post-body-content {\n\tmargin-left: 300px;\n\tfloat: none;\n\twidth: auto;\n}\n\n/* 2 columns main area */\n\n#col-container,\n#col-left,\n#col-right {\n\toverflow: hidden;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n#col-left {\n\twidth: 35%;\n}\n\n#col-right {\n\tfloat: left;\n\tclear: left;\n\twidth: 65%;\n}\n\n.col-wrap {\n\tpadding: 0 7px;\n}\n\n/* utility classes */\n.alignleft {\n\tfloat: right;\n}\n\n.alignright {\n\tfloat: left;\n}\n\n.textleft {\n\ttext-align: right;\n}\n\n.textright {\n\ttext-align: left;\n}\n\n.clear {\n\tclear: both;\n}\n\n/* Hide visually but not from screen readers */\n.screen-reader-text,\n.screen-reader-text span,\n.ui-helper-hidden-accessible {\n\tposition: absolute;\n\tmargin: -1px;\n\tpadding: 0;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(0 0 0 0);\n\tborder: 0;\n\tword-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */\n}\n\n.screen-reader-shortcut {\n\tposition: absolute;\n\ttop: -1000em;\n}\n\n.screen-reader-shortcut:focus {\n\tright: 6px;\n\ttop: -25px;\n\theight: auto;\n\twidth: auto;\n\tdisplay: block;\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tpadding: 15px 23px 14px;\n\tbackground: #f1f1f1;\n\tcolor: #0073aa;\n\tz-index: 100000;\n\tline-height: normal;\n\t-webkit-box-shadow: 0 0 2px 2px rgba(0,0,0,.6);\n\tbox-shadow: 0 0 2px 2px rgba(0,0,0,.6);\n\ttext-decoration: none;\n\toutline: none;\n}\n\n.hidden,\n.js .closed .inside,\n.js .hide-if-js,\n.no-js .hide-if-no-js,\n.js.wp-core-ui .hide-if-js,\n.js .wp-core-ui .hide-if-js,\n.no-js.wp-core-ui .hide-if-no-js,\n.no-js .wp-core-ui .hide-if-no-js {\n\tdisplay: none;\n}\n\n/* @todo: Take a second look. Large chunks of shared color, from the colors.css merge */\n.widget-top,\n.menu-item-handle,\n.widget-inside,\n#menu-settings-column .accordion-container,\n#menu-management .menu-edit,\n.manage-menus,\ntable.widefat,\n.stuffbox,\np.popular-tags,\n.widgets-holder-wrap,\n.wp-editor-container,\n.popular-tags,\n.feature-filter,\n.imgedit-group,\n.comment-ays {\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n}\n\ntable.widefat,\n.wp-editor-container,\n.stuffbox,\np.popular-tags,\n.widgets-holder-wrap,\n.popular-tags,\n.feature-filter,\n.imgedit-group,\n.comment-ays {\n\tbackground: #fff;\n}\n\n/* general */\nhtml,\nbody {\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tbackground: #f1f1f1;\n}\n\nbody {\n\tcolor: #444;\n\tfont-family: \"Open Sans\", sans-serif;\n\tfont-size: 13px;\n\tline-height: 1.4em;\n\tmin-width: 600px;\n}\n\nbody.iframe {\n\tmin-width: 0;\n\tpadding-top: 1px;\n}\n\nbody.modal-open {\n\toverflow: hidden;\n}\n\nbody.mobile.modal-open #wpwrap {\n\toverflow: hidden;\n\tposition: fixed;\n\theight: 100%;\n}\n\niframe,\nimg {\n\tborder: 0;\n}\n\ntd {\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tfont-weight: inherit;\n\tline-height: inherit;\n}\n\na {\n\tcolor: #0073aa;\n\t-webkit-transition-property: border, background, color;\n\ttransition-property: border, background, color;\n\t-webkit-transition-duration: .05s;\n\ttransition-duration: .05s;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\na,\ndiv {\n\toutline: 0;\n}\n\na:hover,\na:active {\n\tcolor: #00a0d2;\n}\n\na:focus,\na:focus .media-icon img {\n\tcolor: #124964;\n    -webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 a:focus {\n\toutline: #5b9dd9 solid 1px;\n}\n\n#adminmenu a:focus,\n.screen-reader-text:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n}\n\nblockquote,\nq {\n\tquotes: none;\n}\n\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n\tcontent: \"\";\n\tcontent: none;\n}\n\np {\n\tfont-size: 13px;\n\tline-height: 1.5;\n\tmargin: 1em 0;\n}\n\nblockquote {\n\tmargin: 1em;\n}\n\nli,\ndd {\n\tmargin-bottom: 6px;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tdisplay: block;\n\tfont-weight: 600;\n}\n\nh1 {\n\tcolor: #23282d;\n\tfont-size: 2em;\n\tmargin: .67em 0;\n}\n\nh2,\nh3 {\n\tcolor: #23282d;\n\tfont-size: 1.3em;\n\tmargin: 1em 0;\n}\n\n.update-php h2,\n.update-core-php h2,\nh4 {\n\tfont-size: 1em;\n\tmargin: 1.33em 0;\n}\n\nh5 {\n\tfont-size: 0.83em;\n\tmargin: 1.67em 0;\n}\n\nh6 {\n\tfont-size: 0.67em;\n\tmargin: 2.33em 0;\n}\n\nul,\nol {\n\tpadding: 0;\n}\n\nul {\n\tlist-style: none;\n}\n\nol {\n\tlist-style-type: decimal;\n\tmargin-right: 2em;\n}\n\nul.ul-disc {\n\tlist-style: disc outside;\n}\n\nul.ul-square {\n\tlist-style: square outside;\n}\n\nol.ol-decimal {\n\tlist-style: decimal outside;\n}\n\nul.ul-disc,\nul.ul-square,\nol.ol-decimal {\n\tmargin-right: 1.8em;\n}\n\nul.ul-disc > li,\nul.ul-square > li,\nol.ol-decimal > li {\n\tmargin: 0 0 0.5em;\n}\n\n/* rtl:ignore */\n.ltr {\n\tdirection: ltr;\n}\n\n/* rtl:ignore */\n.code,\ncode {\n\tfont-family: Consolas, Monaco, monospace;\n\tdirection: ltr;\n\tunicode-bidi: embed;\n}\n\nkbd,\ncode {\n\tpadding: 3px 5px 2px 5px;\n\tmargin: 0 1px;\n\tbackground: #eaeaea;\n\tbackground: rgba(0,0,0,0.07);\n\tfont-size: 13px;\n}\n\n.subsubsub {\n\tlist-style: none;\n\tmargin: 8px 0 0;\n\tpadding: 0;\n\tfont-size: 13px;\n\tfloat: right;\n\tcolor: #666;\n}\n\n.subsubsub a {\n\tline-height: 2;\n\tpadding: .2em;\n\ttext-decoration: none;\n}\n\n.subsubsub a .count,\n.subsubsub a.current .count {\n\tcolor: #999;\n\tfont-weight: normal;\n}\n\n.subsubsub a.current {\n\tfont-weight: 600;\n\tborder: none;\n}\n\n.subsubsub li {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n\n/* .widefat - main style for tables */\n.widefat {\n\tborder-spacing: 0;\n\twidth: 100%;\n\tclear: both;\n\tmargin: 0;\n}\n\n.widefat * {\n\tword-wrap: break-word;\n}\n\n.widefat a {\n\ttext-decoration: none;\n}\n\n.widefat td,\n.widefat th {\n\tpadding: 8px 10px;\n}\n\n.widefat thead th,\n.widefat thead td {\n\tborder-bottom: 1px solid #e1e1e1;\n}\n\n.widefat tfoot th,\n.widefat tfoot td {\n\tborder-top: 1px solid #e1e1e1;\n\tborder-bottom: none;\n}\n\n.widefat .no-items td {\n\tborder-bottom-width: 0;\n}\n\n.widefat td {\n\tvertical-align: top;\n}\n\n.widefat td,\n.widefat td p,\n.widefat td ol,\n.widefat td ul {\n\tfont-size: 13px;\n\tline-height: 1.5em;\n}\n\n.widefat th,\n.widefat thead td,\n.widefat tfoot td {\n\ttext-align: right;\n\tline-height: 1.3em;\n\tfont-size: 14px;\n}\n\n.widefat th input,\n.widefat thead td input,\n.widefat tfoot td input {\n\tmargin: 0 8px 0 0;\n\tpadding: 0;\n\tvertical-align: text-top;\n}\n\n.widefat .check-column {\n\twidth: 2.2em;\n\tpadding: 6px 0 25px;\n\tvertical-align: top;\n}\n\n.widefat th input[type=checkbox],\n.widefat thead td input[type=checkbox],\n.widefat tfoot td input[type=checkbox] {\n\tmargin-top: -1px;\n}\n\n.widefat tbody th.check-column {\n\tpadding: 9px 0 22px;\n}\n\n.widefat thead td.check-column,\n.widefat tbody th.check-column,\n.widefat tfoot td.check-column {\n\tpadding: 11px 3px 0 0;\n}\n\n.widefat thead td.check-column,\n.widefat tfoot td.check-column {\n\tpadding-top: 4px;\n\tvertical-align: middle;\n}\n\n.update-php div.updated,\n.update-php div.error {\n\tmargin-right: 0;\n}\n\n.no-js .widefat thead .check-column input,\n.no-js .widefat tfoot .check-column input {\n\tdisplay: none;\n}\n\n.widefat .num,\n.column-comments,\n.column-links,\n.column-posts {\n\ttext-align: center;\n}\n\n.widefat th#comments {\n\tvertical-align: middle;\n}\n\n.wrap {\n\tmargin: 10px 2px 0 20px;\n}\n\n.wrap > h2:first-child, /* Back-compat for pre-4.4 */\n.wrap [class$=\"icon32\"] + h2, /* Back-compat for pre-4.4 */\n.postbox .inside h2, /* Back-compat for pre-4.4 */\n.wrap h1 {\n\tfont-size: 23px;\n\tfont-weight: 400;\n\tmargin: 0;\n\tpadding: 9px 0 4px 15px;\n\tline-height: 29px;\n}\n\n.subtitle {\n\tmargin: 0;\n\tpadding-right: 25px;\n\tcolor: #777;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.wrap .add-new-h2, /* deprecated */\n.wrap .add-new-h2:active, /* deprecated */\n.wrap .page-title-action,\n.wrap .page-title-action:active {\n\tmargin-right: 4px;\n\tpadding: 4px 8px;\n\tposition: relative;\n\ttop: -3px;\n\ttext-decoration: none;\n\tborder: none;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\tbackground: #e0e0e0;\n\ttext-shadow: none;\n\tfont-weight: 600;\n\tfont-size: 13px;\n}\n\n.wrap .add-new-h2:hover, /* deprecated */\n.wrap .page-title-action:hover {\n\tbackground: #00a0d2;\n\tcolor: #fff;\n}\n\n.wrap h1.long-header {\n\tpadding-left: 0;\n}\n\n.wp-dialog {\n\tbackground-color: #fff;\n}\n\n.widgets-chooser ul,\n#widgets-left .widget-in-question .widget-top,\n#available-widgets .widget-top:hover,\ndiv#widgets-right .widget-top:hover,\n#widgets-left .widget-top:hover {\n\tborder-color: #999;\n\t-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 2px rgba(0,0,0,0.1);\n}\n\n.sorthelper {\n\tbackground-color: #ccf3fa;\n}\n\n.ac_match,\n.subsubsub a.current {\n\tcolor: #000;\n}\n\n.striped > tbody > :nth-child(odd),\nul.striped > :nth-child(odd),\n.alternate {\n\tbackground-color: #f9f9f9;\n}\n\n.bar {\n\tbackground-color: #e8e8e8;\n\tborder-left-color: #99d;\n}\n\n.media-upload-form label.form-help,\ntd.help {\n\tcolor: #9a9a9a;\n}\n\n/* Helper classes for plugins to leverage the active WordPress color scheme */\n\n.highlight {\n\tbackground-color: #e4f2fd;\n\tcolor: #000;\n}\n\n.wp-ui-primary {\n\tcolor: #fff;\n\tbackground-color: #32373c;\n}\n.wp-ui-text-primary {\n\tcolor: #32373c;\n}\n\n.wp-ui-highlight {\n\tcolor: white;\n\tbackground-color: #1e8cbe;\n}\n.wp-ui-text-highlight {\n\tcolor: #1e8cbe;\n}\n\n.wp-ui-notification {\n\tcolor: #fff;\n\tbackground-color: #d54e21;\n}\n.wp-ui-text-notification {\n\tcolor: #d54e21;\n}\n\n.wp-ui-text-icon {\n\tcolor: #999;\n}\n\n/* For emoji replacement images */\nimg.emoji {\n\tdisplay: inline !important;\n\tborder: none !important;\n\theight: 1em !important;\n\twidth: 1em !important;\n\tmargin: 0 .07em !important;\n\tvertical-align: -0.1em !important;\n\tbackground: none !important;\n\tpadding: 0 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n}\n\n/*------------------------------------------------------------------------------\n  1.0 - Text Styles\n------------------------------------------------------------------------------*/\n\n.widget .widget-top,\n.postbox .hndle,\n.stuffbox .hndle,\n.control-section .accordion-section-title,\n.sidebar-name,\n#nav-menu-header,\n#nav-menu-footer,\n.menu-item-handle,\n.checkbox,\n.side-info,\n#your-profile #rich_editing,\n.widefat thead th,\n.widefat thead td,\n.widefat tfoot th,\n.widefat tfoot td {\n\tline-height: 1.4em;\n}\n\n.widget .widget-top,\n.menu-item-handle {\n\tbackground: #fafafa;\n\tcolor: #23282d;\n}\n\n.postbox .hndle,\n.stuffbox .hndle {\n\tborder-bottom: 1px solid #eee;\n}\n\n.quicktags,\n.search {\n\tbackground-color: #ccc;\n\tcolor: #000;\n\tfont-size: 12px;\n}\n\n.icon32 {\n\tdisplay: none;\n}\n\n/* @todo can we combine these into a class or use an existing dashicon one? */\n.welcome-panel .welcome-panel-close:before,\n.tagchecklist span a:before,\n#bulk-titles div a:before,\n.notice-dismiss:before {\n\tbackground: none;\n\tcolor: #b4b9be;\n\tcontent: \"\\f153\";\n\tdisplay: block;\n\tfont: normal 16px/20px dashicons;\n\tspeak: none;\n\theight: 20px;\n\ttext-align: center;\n\twidth: 20px;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.welcome-panel .welcome-panel-close:before {\n\tmargin: 0;\n}\n\n.tagchecklist span a:before,\n#bulk-titles div a:before {\n\tmargin: 1px 0;\n}\n\n.welcome-panel .welcome-panel-close:hover:before,\n.welcome-panel .welcome-panel-close:focus:before,\n.tagchecklist span a:hover:before,\n#bulk-titles div a:hover:before {\n\tcolor: #c00;\n}\n\n.key-labels label {\n\tline-height: 24px;\n}\n\nstrong, b {\n\tfont-weight: 600;\n}\n\n.pre {\n\t/* https://developer.mozilla.org/en-US/docs/CSS/white-space */\n\twhite-space: pre-wrap; /* css-3 */\n\tword-wrap: break-word; /* IE 5.5 - 7 */\n}\n\n.howto {\n\tcolor: #666;\n\tfont-style: italic;\n\tdisplay: block;\n}\n\np.install-help {\n\tmargin: 8px 0;\n\tfont-style: italic;\n}\n\n.no-break {\n\twhite-space: nowrap;\n}\n\nhr {\n\tborder: 0;\n\tborder-top: 1px solid #ddd;\n\tborder-bottom: 1px solid #fafafa;\n}\n\n.row-actions span.delete a,\n.row-actions span.trash a,\n.row-actions span.spam a,\n.plugins a.delete,\n#all-plugins-table .plugins a.delete,\n#search-plugins-table .plugins a.delete,\n.submitbox .submitdelete,\n#media-items a.delete,\n#media-items a.delete-permanently,\n#nav-menu-footer .menu-delete {\n\tcolor: #a00;\n}\n\nabbr.required,\n.file-error,\n.widget-control-remove:hover,\n.row-actions .delete a:hover,\n.row-actions .trash a:hover,\n.row-actions .spam a:hover,\n.plugins a.delete:hover,\n#all-plugins-table .plugins a.delete:hover,\n#search-plugins-table .plugins a.delete:hover,\n.submitbox .submitdelete:hover,\n#media-items a.delete:hover,\n#media-items a.delete-permanently:hover,\n#nav-menu-footer .menu-delete:hover {\n\tcolor: #f00;\n\ttext-decoration: none;\n\tborder: none;\n}\n\n/*------------------------------------------------------------------------------\n  3.0 - Actions\n------------------------------------------------------------------------------*/\n\n#major-publishing-actions {\n\tpadding: 10px;\n\tclear: both;\n\tborder-top: 1px solid #ddd;\n\tbackground: #f5f5f5;\n}\n\n#delete-action {\n\tline-height: 28px;\n\tvertical-align: middle;\n\ttext-align: right;\n\tfloat: right;\n}\n\n#publishing-action {\n\ttext-align: left;\n\tfloat: left;\n\tline-height: 23px;\n}\n\n#publishing-action .spinner {\n\tfloat: right;\n}\n\n#misc-publishing-actions {\n\tpadding: 6px 0 0;\n}\n\n.misc-pub-section {\n\tpadding: 6px 10px 8px;\n}\n\n.misc-pub-filename {\n\tword-wrap: break-word;\n}\n\n#minor-publishing-actions {\n\tpadding: 10px 10px 0 10px;\n\ttext-align: left;\n}\n\n#save-post {\n\tfloat: right;\n}\n\n.preview {\n\tfloat: left;\n}\n\n#sticky-span {\n\tmargin-right: 18px;\n}\n\n.side-info {\n\tmargin: 0;\n\tpadding: 4px;\n\tfont-size: 11px;\n}\n\n.side-info h5 {\n\tpadding-bottom: 7px;\n\tfont-size: 14px;\n\tmargin: 12px 2px 5px;\n\tborder-bottom: 1px solid #dadada;\n}\n\n.side-info ul {\n\tmargin: 0;\n\tpadding-right: 18px;\n\tlist-style: square;\n\tcolor: #666;\n}\n\n.approve,\n.unapproved .unapprove {\n\tdisplay: none;\n}\n\n.unapproved .approve,\n.spam .approve,\n.trash .approve {\n\tdisplay: inline;\n}\n\ntd.action-links,\nth.action-links {\n\ttext-align: left;\n}\n\n/* Filter bar */\n.wp-filter {\n\tdisplay: inline-block;\n\tposition: relative;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin: 12px 0 25px;\n\tpadding: 0 10px;\n\twidth: 100%;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tborder: 1px solid #e5e5e5;\n\tbackground: #fff;\n\tcolor: #555;\n\tfont-size: 13px;\n}\n\n.wp-filter a {\n\ttext-decoration: none;\n}\n\n.filter-count {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmin-width: 4em;\n}\n\n.title-count,\n.filter-count .count {\n\tdisplay: inline-block;\n\tposition: relative;\n\ttop: -1px;\n\tpadding: 4px 10px;\n\t-webkit-border-radius: 30px;\n\tborder-radius: 30px;\n\tbackground: #777;\n\tcolor: #fff;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n/* not a part of filter bar, but derived from it, so here for now */\n.title-count {\n\tdisplay: inline;\n\ttop: -3px;\n\tmargin-right: 5px;\n\tmargin-left: 20px;\n}\n\n.filter-items {\n\tfloat: right;\n}\n\n.filter-links {\n\tdisplay: inline-block;\n\tmargin: 0;\n}\n\n.filter-links li {\n\tdisplay: inline-block;\n\tmargin: 0;\n}\n\n.filter-links li > a {\n\tdisplay: inline-block;\n\tmargin: 0 10px;\n\tpadding: 15px 0;\n\tborder-bottom: 4px solid #fff;\n\tcolor: #666;\n\tcursor: pointer;\n}\n\n.filter-links .current {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder-bottom: 4px solid #666;\n\tcolor: #23282d;\n}\n\n.filter-links li > a:hover,\n.filter-links li > a:focus,\n.show-filters .filter-links a.current:hover,\n.show-filters .filter-links a.current:focus {\n\tcolor: #00a0d2;\n}\n\n.wp-filter .search-form {\n\tfloat: left;\n\tmargin: 10px 0;\n}\n\n.wp-filter .search-form input[type=\"search\"] {\n\tmargin: 0;\n\tpadding: 3px 5px;\n\twidth: 280px;\n\tmax-width: 100%;\n\tfont-size: 16px;\n\tfont-weight: 300;\n\tline-height: 1.5;\n}\n\n.wp-filter .search-form select {\n\tmargin: 0;\n\theight: 32px;\n\tvertical-align: top;\n}\n\n.wp-filter .search-form.search-plugins {\n\tdisplay: inline-block;\n}\n\n.wp-filter .drawer-toggle {\n\tdisplay: inline-block;\n\tmargin: 0 10px;\n\tpadding: 4px 6px;\n\tcolor: #666;\n\tcursor: pointer;\n}\n\n.wp-filter .drawer-toggle:before {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tcontent: \"\\f111\";\n\tmargin: 0 0 0 5px;\n\twidth: 16px;\n\theight: 16px;\n\tcolor: #777;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\tfont-family: dashicons;\n\tfont-size: 16px;\n\tline-height: 1;\n\ttext-align: center;\n\ttext-decoration: inherit;\n\tfont-weight: normal;\n\tfont-style: normal;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.wp-filter .drawer-toggle:hover,\n.wp-filter .drawer-toggle:hover:before {\n\tcolor: #00a0d2;\n}\n\n.wp-filter .drawer-toggle.current:before {\n\tcolor: #fff;\n}\n\n.wp-filter .favorites-form {\n\tdisplay: none;\n\tmargin: 0 -20px;\n\tpadding: 20px;\n\tborder-top: 1px solid #eee;\n\tbackground: #fafafa;\n\toverflow: hidden;\n\twidth: 100%;\n}\n\n.show-favorites-form .wp-filter .favorites-form {\n\tdisplay: block;\n}\n\n.filter-drawer {\n\tdisplay: none;\n\tmargin: 0 -20px;\n\tpadding: 20px;\n\tborder-top: 1px solid #eee;\n\tbackground: #fafafa;\n}\n\n.show-filters .filter-drawer {\n\tdisplay: block;\n\toverflow: hidden;\n\twidth: 100%;\n}\n\n.show-filters .wp-filter .drawer-toggle:hover,\n.show-filters .wp-filter .drawer-toggle:focus {\n\tbackground: rgb(46, 162, 204);\n}\n\n.show-filters .filter-links a.current {\n\tborder-bottom: none;\n}\n\n.show-filters .wp-filter .drawer-toggle {\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\tborder: none;\n\tbackground: #777;\n\tcolor: #fff;\n}\n\n.show-filters .wp-filter .drawer-toggle:before {\n\tcolor: #fff;\n}\n\n.filter-group {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tposition: relative;\n\tfloat: right;\n\tmargin: 0 0 0 1%;\n\tpadding: 20px 10px 10px;\n\twidth: 24%;\n\tbackground: #fff;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n}\n\n.filter-group legend {\n\tposition: absolute;\n\ttop: 10px;\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 1em;\n\tfont-weight: 600;\n}\n\n.filter-drawer .filter-group-feature {\n\tmargin: 28px 0 0;\n\tlist-style-type: none;\n\tfont-size: 12px;\n}\n\n.filter-drawer .filter-group-feature input,\n.filter-drawer .filter-group-feature label {\n\tdisplay: inline-block;\n\tmargin: 7px 0 7px 4px;\n\tline-height: 16px;\n}\n\n.filter-drawer .buttons {\n\tmargin-bottom: 20px;\n}\n\n.filter-drawer .buttons .button span {\n\tdisplay: inline-block;\n\topacity: 0.8;\n\tfont-size: 12px;\n\ttext-indent: 10px;\n}\n\n.wp-filter .button.clear-filters {\n\tdisplay: none;\n\tmargin-right: 10px;\n}\n\n.filtered-by {\n\tdisplay: none;\n\tmargin: 0;\n}\n\n.filtered-by > span {\n\tfont-weight: 600;\n}\n\n.filtered-by a {\n\tmargin-right: 10px;\n}\n\n.filtered-by .tags {\n\tdisplay: inline;\n}\n\n.filtered-by .tag {\n\tmargin: 0 5px;\n\tpadding: 4px 8px;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbackground: #fff;\n\tfont-size: 11px;\n}\n\n.filters-applied .filter-group,\n.filters-applied .filter-drawer .buttons,\n.filters-applied .filter-drawer br {\n\tdisplay: none !important;\n}\n\n.filters-applied .filtered-by {\n\tdisplay: block;\n}\n\n.filters-applied .filter-drawer {\n\tpadding: 20px;\n}\n\n.show-filters .content-filterable,\n.show-filters.filters-applied.loading-content .content-filterable,\n.loading-content .content-filterable,\n.error .content-filterable {\n\tdisplay: none;\n}\n\n.show-filters.filters-applied .content-filterable {\n\tdisplay: block;\n}\n\n.loading-content .spinner {\n\tdisplay: block;\n\tmargin: 40px auto 0;\n\tfloat: none;\n}\n\n@media only screen and (max-width: 1120px) {\n\t.filter-drawer {\n\t\tborder-bottom: 1px solid #eee;\n\t}\n\n\t.filter-group {\n\t\tmargin-bottom: 0;\n\t\tmargin-top: 5px;\n\t\twidth: 100%;\n\t}\n\n\t.filter-group li {\n\t\tmargin: 10px 0;\n\t}\n}\n\n@media only screen and (max-width: 1000px) {\n\t.filter-items {\n\t\tfloat: none;\n\t}\n\n\t.wp-filter .media-toolbar-primary,\n\t.wp-filter .media-toolbar-secondary,\n\t.wp-filter .search-form {\n\t\tfloat: none; /* Remove float from media-views.css */\n\t\tposition: relative;\n\t\tmax-width: 100%;\n\t}\n}\n\n@media only screen and (max-width: 782px) {\n\t.filter-group li {\n\t\tpadding: 0;\n\t\twidth: 50%;\n\t}\n}\n\n@media only screen and (max-width: 320px) {\n\t.filter-count {\n\t\tdisplay: none;\n\t}\n\n\t.wp-filter .drawer-toggle {\n\t\tmargin: 10px 0;\n\t}\n\n\t.filter-group li,\n\t.wp-filter .search-form input[type=\"search\"] {\n\t\twidth: 100%;\n\t}\n}\n\n/*------------------------------------------------------------------------------\n  4.0 - Notifications\n------------------------------------------------------------------------------*/\n\n.notice,\ndiv.updated,\ndiv.error {\n\tbackground: #fff;\n\tborder-right: 4px solid #fff;\n\t-webkit-box-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 );\n\tmargin: 5px 15px 2px;\n\tpadding: 1px 12px;\n}\n\n.notice p,\n.notice-title,\ndiv.updated p,\ndiv.error p,\n.form-table td .notice p {\n\tmargin: 0.5em 0;\n\tpadding: 2px;\n}\n\n.error a {\n\ttext-decoration: underline;\n}\n\n.updated a {\n\tpadding-bottom: 2px;\n\ttext-decoration: none;\n}\n\n.notice-alt {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.notice-large {\n\tpadding: 10px 20px;\n}\n\n.notice-title {\n\tdisplay: inline-block;\n\tcolor: #23282d;\n\tfont-size: 18px;\n}\n\n.wp-core-ui .notice.is-dismissible {\n\tpadding-left: 38px;\n\tposition: relative;\n}\n\n.notice-dismiss {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 1px;\n\tborder: none;\n\tmargin: 0;\n\tpadding: 9px;\n\tbackground: none;\n\tcolor: #b4b9be;\n\tcursor: pointer;\n}\n\n.notice-dismiss:hover:before,\n.notice-dismiss:active:before,\n.notice-dismiss:focus:before {\n\tcolor: #c00;\n}\n\n.notice-dismiss:focus {\n\toutline: none;\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 .notice-dismiss:focus {\n\toutline: 1px solid #5b9dd9;\n}\n\n.notice-success,\ndiv.updated {\n\tborder-right-color: #46b450;\n}\n\n.notice-success.notice-alt {\n\tbackground-color: #ecf7ed;\n}\n\n.notice-warning {\n\tborder-right-color: #ffb900;\n}\n\n.notice-warning.notice-alt {\n\tbackground-color: #fff8e5;\n}\n\n.notice-error,\ndiv.error {\n\tborder-right-color: #dc3232;\n}\n\n.notice-error.notice-alt {\n\tbackground-color: #fbeaea;\n}\n\n.notice-info {\n\tborder-right-color: #00a0d2;\n}\n\n.notice-info.notice-alt {\n\tbackground-color: #e5f5fa;\n}\n\n.wrap .notice,\n.wrap div.updated,\n.wrap div.error,\n.media-upload-form .notice,\n.media-upload-form div.error {\n\tmargin: 5px 0 15px;\n}\n\n#update-nag,\n.update-nag {\n\tdisplay: inline-block;\n\tline-height: 19px;\n\tpadding: 11px 15px;\n\tfont-size: 14px;\n\ttext-align: right;\n\tmargin: 25px 2px 0 20px;\n\tbackground-color: #fff;\n\tborder-right: 4px solid #ffba00;\n\t-webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n}\n\n.update-message {\n\tcolor: #000;\n}\n\nul#dismissed-updates {\n\tdisplay: none;\n}\n\nform.upgrade {\n\tmargin-top: 8px;\n}\n\nform.upgrade .hint {\n\tfont-style: italic;\n\tfont-size: 85%;\n\tmargin: -0.5em 0 2em 0;\n}\n\n.update-php .spinner {\n\tfloat: none;\n\tmargin: -4px 0;\n}\n\n#ajax-loading,\n.ajax-loading,\n.ajax-feedback,\n.imgedit-wait-spin,\n.list-ajax-loading { /* deprecated */\n\tvisibility: hidden;\n}\n\n#ajax-response.alignleft {\n\tmargin-right: 2em;\n}\n\n/* @todo: this does not need its own section anymore */\n/*------------------------------------------------------------------------------\n  6.0 - Admin Header\n------------------------------------------------------------------------------*/\n#adminmenu a,\n#taglist a,\n#catlist a {\n\ttext-decoration: none;\n}\n\n/*------------------------------------------------------------------------------\n  6.1 - Screen Options Tabs\n------------------------------------------------------------------------------*/\n\n#screen-options-wrap,\n#contextual-help-wrap {\n\tmargin: 0;\n\tpadding: 8px 20px 12px;\n\tposition: relative;\n}\n\n#contextual-help-wrap {\n\toverflow: auto;\n\tmargin-right: 0 !important;\n}\n\n#screen-meta .screen-reader-text {\n\tvisibility: hidden;\n}\n\n#screen-meta-links {\n\tmargin: 0 0 0 20px;\n}\n\n/* screen options and help tabs revert */\n#screen-meta {\n\tdisplay: none;\n\tmargin: 0 0px -1px 20px;\n\tposition: relative;\n\tbackground-color: #fff;\n\tborder: 1px solid #ddd;\n\tborder-top: none;\n\t-webkit-box-shadow: 0 1px 0 rgba(0,0,0,.025);\n\tbox-shadow: 0 1px 0 rgba(0,0,0,.025);\n}\n\n#screen-options-link-wrap,\n#contextual-help-link-wrap {\n\tfloat: left;\n\theight: 28px;\n\tmargin: 0 6px 0 0;\n\tborder: 1px solid #ddd;\n\tborder-top: none;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);\n}\n\n#screen-meta-links .screen-meta-toggle {\n\tposition: relative;\n\ttop: 0;\n}\n\n#screen-meta-links .show-settings {\n\tborder: 0;\n\tbackground: none;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tcolor: #777;\n\tline-height: 1.7;\n\tpadding: 3px 16px 3px 6px;\n}\n\n#screen-meta-links .show-settings:hover,\n#screen-meta-links .show-settings:active,\n#screen-meta-links .show-settings:focus {\n\tcolor: #32373c;\n}\n\n#screen-meta-links .show-settings:active {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\t-webkit-transform: none;\n\t-ms-transform: none;\n\ttransform: none;\n}\n\n#screen-meta-links .show-settings:after {\n\tleft: 0;\n\tcontent: \"\\f140\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0 0 0 5px;\n\tbottom: 2px;\n\tposition: relative;\n\tvertical-align: bottom;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #b4b9be;\n}\n\n#screen-meta-links .screen-meta-active:after {\n\tcontent: \"\\f142\";\n}\n\n/* end screen options and help tabs */\n\n.toggle-arrow {\n\tbackground-repeat: no-repeat;\n\tbackground-position: top left;\n\tbackground-color: transparent;\n\theight: 22px;\n\tline-height: 22px;\n\tdisplay: block;\n}\n\n.toggle-arrow-active {\n\tbackground-position: bottom left;\n}\n\n#screen-options-wrap h5, /* Back-compat for old plugins */\n#screen-options-wrap legend,\n#contextual-help-wrap h5 {\n\tmargin: 0;\n\tpadding: 8px 0;\n \tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.ie8 #screen-options-wrap legend {\n\tcolor: inherit;\n}\n\n.metabox-prefs label {\n\tdisplay: inline-block;\n\tpadding-left: 15px;\n\tline-height: 30px;\n}\n\n#number-of-columns {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tline-height: 30px;\n}\n\n.metabox-prefs input[type=checkbox] {\n\tmargin-top: 0;\n\tmargin-left: 6px;\n}\n\n.metabox-prefs label input,\n.metabox-prefs label input[type=checkbox] {\n\tmargin: -4px 0 0 5px;\n}\n\n.metabox-prefs .columns-prefs label input {\n\tmargin: -1px 0 0 2px;\n}\n\n.metabox-prefs label a {\n\tdisplay: none;\n}\n\n.metabox-prefs .screen-options input,\n.metabox-prefs .screen-options label {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\tvertical-align: middle;\n}\n\n.metabox-prefs .screen-options .screen-per-page {\n\tmargin-left: 15px;\n}\n\n.metabox-prefs .screen-options label {\n\tline-height: 28px;\n\tpadding-left: 0;\n}\n\n.screen-options + .screen-options {\n    margin-top: 10px;\n}\n\n.metabox-prefs .submit {\n\tmargin-top: 1em;\n\tpadding: 0;\n}\n\n/*------------------------------------------------------------------------------\n  6.2 - Help Menu\n------------------------------------------------------------------------------*/\n\n#contextual-help-wrap {\n\tpadding: 0;\n}\n\n#contextual-help-columns {\n\tposition: relative;\n}\n\n#contextual-help-back {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tright: 150px;\n\tleft: 170px;\n\tborder: 1px solid #e1e1e1;\n\tborder-top: none;\n\tborder-bottom: none;\n\tbackground: #f6fbfd;\n}\n\n#contextual-help-wrap.no-sidebar #contextual-help-back {\n\tleft: 0;\n\tborder-left-width: 0;\n\t-webkit-border-bottom-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n}\n\n.contextual-help-tabs {\n\tfloat: right;\n\twidth: 150px;\n\tmargin: 0;\n}\n\n.contextual-help-tabs ul {\n\tmargin: 1em 0;\n}\n\n.contextual-help-tabs li {\n\tmargin-bottom: 0;\n\tlist-style-type: none;\n\tborder-style: solid;\n\tborder-width: 0 2px 0 0;\n\tborder-color: transparent;\n}\n\n.contextual-help-tabs a {\n\tdisplay: block;\n\tpadding: 5px 12px 5px 5px;\n\tline-height: 18px;\n\ttext-decoration: none;\n\tborder: 1px solid transparent;\n\tborder-left: none;\n\tborder-right: none;\n}\n\n.contextual-help-tabs a:hover {\n\tcolor: #32373c;\n}\n\n.contextual-help-tabs .active {\n\tpadding: 0;\n\tmargin: 0 0 0 -1px;\n\tborder-right: 2px solid #00a0d2;\n\tbackground: #f6fbfd;\n\t-webkit-box-shadow: 0 2px 0 rgba(0,0,0,0.02), 0 1px 0 rgba(0,0,0,0.02);\n\tbox-shadow: 0 2px 0 rgba(0,0,0,0.02), 0 1px 0 rgba(0,0,0,0.02);\n}\n\n.contextual-help-tabs .active a {\n\tborder-color: #e1e1e1;\n\tcolor: #32373c;\n}\n\n.contextual-help-tabs-wrap {\n\tpadding: 0 20px;\n\toverflow: auto;\n}\n\n.help-tab-content {\n\tdisplay: none;\n\tmargin: 0 0 12px 22px;\n\tline-height: 1.6em;\n}\n\n.help-tab-content.active {\n\tdisplay: block;\n}\n\n.help-tab-content ul li {\n\tlist-style-type: disc;\n\tmargin-right: 18px;\n}\n\n.contextual-help-sidebar {\n\twidth: 150px;\n\tfloat: left;\n\tpadding: 0 12px 0 8px;\n\toverflow: auto;\n}\n\n/*------------------------------------------------------------------------------\n  8.0 - Layout Blocks\n------------------------------------------------------------------------------*/\n\nhtml.wp-toolbar {\n\tpadding-top: 32px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.widefat th,\n.widefat td {\n\tcolor: #555;\n}\n\n.widefat th,\n.widefat thead td,\n.widefat tfoot td {\n\tfont-weight: normal;\n}\n\n.widefat thead tr th,\n.widefat thead tr td,\n.widefat tfoot tr th,\n.widefat tfoot tr td {\n\tcolor: #32373c;\n}\n\n.widefat td p {\n\tmargin: 2px 0 0.8em;\n}\n\n.widefat p,\n.widefat ol,\n.widefat ul {\n\tcolor: #32373c;\n}\n\n.widefat .column-comment p {\n\tmargin: 0.6em 0;\n}\n\n/* Screens with postboxes */\n.postbox-container {\n\tfloat: right;\n}\n\n.postbox-container .meta-box-sortables {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#wpbody-content .metabox-holder {\n\tpadding-top: 10px;\n}\n\n.metabox-holder .postbox-container .empty-container {\n\tborder: 3px dashed #b4b9be;\n\theight: 250px;\n}\n\n.metabox-holder.columns-1 .postbox-container .empty-container,\n.columns-2 #postbox-container-3 .empty-container,\n.columns-2 #postbox-container-4 .empty-container,\n.columns-3 #postbox-container-4 .empty-container {\n\tborder: 0 none;\n\theight: 0;\n\tmin-height: 0;\n}\n\n#post-body-content {\n\twidth: 100%;\n\tmin-width: 463px;\n\tfloat: right;\n}\n\n#post-body.columns-2 #postbox-container-1 {\n\tfloat: left;\n\tmargin-left: -300px;\n\twidth: 280px;\n}\n\n#post-body.columns-2 #side-sortables {\n\tmin-height: 250px;\n}\n\n/* one column on the dash */\n@media only screen and (max-width: 799px) {\n\t#wpbody-content .metabox-holder .postbox-container .empty-container {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n}\n\n.js .widget .widget-top,\n.js .postbox .hndle {\n\tcursor: move;\n}\n\n.hndle a {\n\tfont-size: 11px;\n\tfont-weight: normal;\n}\n\n.postbox .handlediv {\n\tdisplay: none;\n\tfloat: left;\n\twidth: 36px;\n\theight: 36px;\n\tpadding: 0;\n}\n\n.js .postbox .handlediv {\n\tdisplay: block;\n}\n\n.sortable-placeholder {\n\tborder: 1px dashed #b4b9be;\n\tmargin-bottom: 20px;\n}\n\n.postbox,\n.stuffbox {\n\tmargin-bottom: 20px;\n\tpadding: 0;\n\tline-height: 1;\n}\n\n/* user-select is not a part of the CSS standard - may change behavior in the future */\n.postbox .hndle,\n.stuffbox .hndle {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.postbox .inside,\n.stuffbox .inside {\n\tpadding: 0 12px 12px;\n\tline-height: 1.4em;\n\tfont-size: 13px;\n}\n\n.postbox .inside {\n\tmargin: 11px 0;\n\tposition: relative;\n}\n\n.postbox .inside > p:last-child,\n.rss-widget ul li:last-child {\n\tmargin-bottom: 1px !important;\n}\n\n.postbox.closed h3 {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.postbox table.form-table {\n\tmargin-bottom: 0;\n}\n\n.postbox table.widefat {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.temp-border {\n\tborder: 1px dotted #ccc;\n}\n\n.columns-prefs label {\n\tpadding: 0 0 0 10px;\n}\n\n/* @todo: what is this doing here */\n#dashboard_right_now .versions .b,\n#post-status-display,\n#post-visibility-display,\n#adminmenu .wp-submenu li.current,\n#adminmenu .wp-submenu li.current a,\n#adminmenu .wp-submenu li.current a:hover,\n.media-item .percent,\n.plugins .name,\n#pass-strength-result.strong,\n#pass-strength-result.short,\n#ed_reply_toolbar #ed_reply_strong,\n.item-controls .item-order a,\n.feature-filter .feature-name {\n\tfont-weight: 600;\n}\n\n/*------------------------------------------------------------------------------\n  21.0 - Admin Footer\n------------------------------------------------------------------------------*/\n\n#wpfooter {\n\tposition: absolute;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\tpadding: 10px 20px;\n\tcolor: #777;\n}\n\n#wpfooter p {\n\tfont-size: 13px;\n\tmargin: 0;\n\tline-height: 20px;\n}\n\n#footer-thankyou {\n\tfont-style: italic;\n}\n\n#wpfooter a {\n\ttext-decoration: none;\n}\n\n#wpfooter a:hover {\n\ttext-decoration: underline;\n}\n\n/*------------------------------------------------------------------------------\n  25.0 - Tabbed Admin Screen Interface (Experimental)\n------------------------------------------------------------------------------*/\n\n.nav-tab {\n\tfloat: right;\n\tborder: 1px solid #ccc;\n\tborder-bottom: none;\n\tmargin-right: 0.5em; /* half the font size so set the font size properly */\n\tpadding: 5px 10px;\n\tfont-size: 14px;\n\tline-height: 24px;\n\tfont-weight: 600;\n\tbackground: #e4e4e4;\n\tcolor: #555;\n\ttext-decoration: none;\n\twhite-space: nowrap;\n}\n\nh3 .nav-tab, /* Back-compat for pre-4.4 */\n.nav-tab-small .nav-tab {\n\tpadding: 5px 14px;\n\tfont-size: 12px;\n\tline-height: 16px;\n}\n\n.nav-tab:hover,\n.nav-tab:focus {\n\tbackground-color: #fff;\n\tcolor: #464646;\n}\n\n.nav-tab-active,\n.nav-tab:focus:active {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.nav-tab-active {\n\tmargin-bottom: -1px;\n\tcolor: #464646;\n}\n\n.nav-tab-active,\n.nav-tab-active:hover,\n.nav-tab-active:focus,\n.nav-tab-active:focus:active {\n\tborder-bottom: 1px solid #f1f1f1;\n\tbackground: #f1f1f1;\n\tcolor: #000;\n}\n\nh1.nav-tab-wrapper, /* Back-compat for pre-4.4 */\n.wrap h2.nav-tab-wrapper, /* higher specificity to override .wrap > h2:first-child */\nh3.nav-tab-wrapper {\n\tborder-bottom: 1px solid #ccc;\n\tmargin: 0;\n\tpadding: 9px 0 0 15px;\n\tline-height: inherit;\n}\n\n/* contain floats */\n.nav-tab-wrapper:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tclear: both;\n}\n\n/*------------------------------------------------------------------------------\n  26.0 - Misc\n------------------------------------------------------------------------------*/\n\n.spinner {\n\tbackground: url(../images/spinner.gif) no-repeat;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\tdisplay: inline-block;\n\tvisibility: hidden;\n\tfloat: left;\n\tvertical-align: middle;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 4px 10px 0;\n}\n\n.spinner.is-active {\n\tvisibility: visible;\n}\n\n#template div {\n\tmargin-left: 190px;\n}\n\n.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */\n.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */\n.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */\n.metabox-holder h2.hndle {\n\tfont-size: 14px;\n\tpadding: 8px 12px;\n\tmargin: 0;\n\tline-height: 1.4;\n}\n\n/* Back-compat for nav-menus screen */\n.nav-menus-php .metabox-holder h3 {\n\tpadding: 10px 14px 11px 10px;\n\tline-height: 21px;\n}\n\n#templateside ul li a {\n\ttext-decoration: none;\n}\n\n.plugin-install #description,\n.plugin-install-network #description {\n\twidth: 60%;\n}\n\ntable .vers,\ntable .column-visible,\ntable .column-rating {\n\ttext-align: right;\n}\n\n.attention,\n.error-message {\n\tcolor: red;\n\tfont-weight: 600;\n}\n\n/* Scrollbar fix for bulk upgrade iframe */\nbody.iframe {\n\theight: 98%;\n}\n\n/* Upgrader styles, Specific to Language Packs */\n.lp-show-latest p {\n\tdisplay: none;\n}\n.lp-show-latest p:last-child,\n.lp-show-latest .lp-error p {\n\tdisplay: block;\n}\n\n/* - Only used once or twice in all of WP - deprecate for global style\n------------------------------------------------------------------------------*/\n.media-icon {\n\twidth: 62px; /* icon + border */\n\ttext-align: center;\n}\n\n.media-icon img {\n\tborder: 1px solid #e7e7e7;\n\tborder: 1px solid rgba(0, 0, 0, 0.07);\n}\n\n#howto {\n\tfont-size: 11px;\n\tmargin: 0 5px;\n\tdisplay: block;\n}\n\n.importers td {\n\tpadding-left: 14px;\n}\n\n.importers {\n\tfont-size: 16px;\n\twidth: auto;\n}\n\n#post-body #post-body-content #namediv h3, /* Back-compat for pre-4.4 */\n#post-body #post-body-content #namediv h2 {\n\tmargin-top: 0;\n}\n\n.edit-comment-author {\n\tfont-size: 14px;\n\tline-height: 1.4;\n\tfont-weight: 600;\n\tcolor: #222;\n\tmargin: 2px 9px 0 0;\n}\n\n#namediv h3 label, /* Back-compat for pre-4.4 */\n#namediv h2 label {\n\tvertical-align: baseline;\n}\n\n#namediv table {\n\twidth: 100%;\n}\n\n#namediv td.first {\n\twidth: 10px;\n\twhite-space: nowrap;\n}\n\n#namediv input {\n\twidth: 98%;\n}\n\n#namediv p {\n\tmargin: 10px 0;\n}\n\n#submitdiv h3 {\n\tmargin-bottom: 0 !important;\n}\n\n/* - Used - but could/should be deprecated with a CSS reset\n------------------------------------------------------------------------------*/\n.zerosize {\n\theight: 0;\n\twidth: 0;\n\tmargin: 0;\n\tborder: 0;\n\tpadding: 0;\n\toverflow: hidden;\n\tposition: absolute;\n}\n\nbr.clear {\n\theight: 2px;\n\tline-height: 2px;\n}\n\n.checkbox {\n\tborder: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nfieldset {\n\tborder: 0;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.post-categories {\n\tdisplay: inline;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.post-categories li {\n\tdisplay: inline;\n}\n\n/* Star Ratings - Back-compat for pre-3.8 */\ndiv.star-holder {\n\tposition: relative;\n\theight: 17px;\n\twidth: 100px;\n\tbackground: url(../images/stars.png?ver=20121108) repeat-x bottom left;\n}\n\ndiv.star-holder .star-rating {\n\tbackground: url(../images/stars.png?ver=20121108) repeat-x top left;\n\theight: 17px;\n\tfloat: right;\n}\n\n/* Star Ratings */\n.star-rating {\n\twhite-space: nowrap;\n}\n.star-rating .star {\n\tdisplay: inline-block;\n\twidth: 20px;\n\theight: 20px;\n\t-webkit-font-smoothing: antialiased;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tvertical-align: top;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\ttext-align: center;\n\tcolor: #ffb900;\n}\n\n.star-rating .star-full:before {\n\tcontent: \"\\f155\";\n}\n\n.star-rating .star-half:before {\n\tcontent: \"\\f459\";\n}\n\n.rtl .star-rating .star-half {\n\t-webkit-transform: rotateY(180deg);\n\t-ms-transform: rotateY(180deg);\n\ttransform: rotateY(180deg);\n}\n\n.star-rating .star-empty:before {\n\tcontent: \"\\f154\";\n}\n\ndiv.action-links {\n\tfont-weight: normal;\n\tmargin: 6px 0 0;\n}\n\n/* Plugin install thickbox */\n#plugin-information {\n\tbackground: #fff;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tright: 0;\n\theight: 100%;\n\tpadding: 0;\n}\n\n#plugin-information-scrollable {\n\toverflow: auto;\n\t-webkit-overflow-scrolling: touch;\n\theight: 100%;\n}\n\n#plugin-information-title {\n\tpadding: 0 20px;\n\tbackground: #f5f5f5;\n\tfont-size: 22px;\n\tfont-weight: 600;\n\tline-height: 56px;\n\tposition: relative;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 56px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n#plugin-information-title.with-banner {\n\tmargin-left: 0;\n\theight: 250px;\n\tbottom: 250px;\n\t-webkit-background-size: cover;\n\tbackground-size: cover;\n}\n\n#plugin-information-title h2 {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tpadding: 0;\n\tmargin: 0;\n\tmax-width: 680px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n#plugin-information-title.with-banner h2 {\n\tfont-family: \"Helvetica Neue\", sans-serif;\n\tdisplay: inline-block;\n\tfont-size: 30px;\n\tline-height: 50px;\n\tpadding: 0 15px;\n\tmargin: 174px 10px 0 0;\n\tcolor: #fff;\n\tbackground: rgba( 30, 30, 30, 0.9 );\n\ttext-shadow: 0 1px 3px rgba( 0, 0, 0, 0.4 );\n\t-webkit-box-shadow: 0 0 30px rgba( 255, 255, 255, 0.1 );\n\tbox-shadow: 0 0 30px rgba( 255, 255, 255, 0.1 );\n\t-webkit-border-radius: 8px;\n\tborder-radius: 8px;\n}\n\n#plugin-information-title div.vignette {\n\tdisplay: none;\n}\n\n#plugin-information-title.with-banner div.vignette {\n\tdisplay: block;\n\tfloat: left;\n\ttop: 0;\n\theight: 250px;\n\twidth: 772px;\n\tmargin: 0 -20px;\n\tbackground: transparent;\n\t-webkit-box-shadow: inset 0 0 50px 4px rgba( 0, 0, 0, 0.2 ), inset 0 -1px 0 rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 0 50px 4px rgba( 0, 0, 0, 0.2 ), inset 0 -1px 0 rgba( 0, 0, 0, 0.1 );\n}\n\n#plugin-information-tabs {\n\tpadding: 0 16px;\n\tposition: relative;\n\tleft: 0;\n\tright: 0;\n\theight: 36px;\n\tz-index: 1;\n\tborder-bottom: 1px solid #ddd;\n\tbackground: #f3f3f3;\n}\n\n#plugin-information-tabs a {\n\tposition: relative;\n\tfloat: right;\n\tpadding: 9px 10px;\n\tmargin: 0;\n\theight: 18px;\n\tline-height: 18px;\n\tfont-size: 14px;\n\ttext-decoration: none;\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n#plugin-information-tabs a.current {\n\tmargin: 0 -1px 0;\n\tbackground: #fff;\n\tborder: 1px solid #ddd;\n\tborder-bottom-color: #fff;\n\tpadding-top: 8px;\n\tcolor: #32373c;\n}\n\n#plugin-information-tabs.with-banner a.current {\n\tborder-top: none;\n\tpadding-top: 9px;\n}\n\n#plugin-information-tabs a:active,\n#plugin-information-tabs a:focus {\n\toutline: none;\n}\n\n#plugin-information-content {\n\toverflow: hidden; /* equal height column trick */\n\tbackground: #fff;\n\tposition: relative;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tmin-height: 100%;\n\t/* Height of title + tabs + install now */\n\tmin-height: -webkit-calc( 100% - 152px );\n\tmin-height: calc( 100% - 152px );\n}\n\n#plugin-information-content.with-banner {\n\t/* Height of banner + tabs + install now */\n\tmin-height: -webkit-calc( 100% - 346px );\n\tmin-height: calc( 100% - 346px );\n}\n\n#section-holder {\n\tposition: relative;\n\ttop: 0;\n\tleft: 250px;\n\tbottom: 0;\n\tright: 0;\n\tmargin-left: 250px; /* FYI box */\n\tpadding: 10px 26px;\n\tmargin-bottom: -99939px; /* 60px less than the padding below to accommodate footer */\n\tpadding-bottom: 99999px; /* equal height column trick */\n}\n\n#section-holder .updated {\n\tmargin: 16px 0;\n}\n\n#plugin-information .fyi {\n\tfloat: left;\n\tposition: relative;\n\ttop: 0;\n\tleft: 0;\n\tpadding: 16px;\n\tmargin-bottom: -99939px; /* 60px less than the padding below to accommodate footer */\n\tpadding-bottom: 99999px; /* equal height column trick */\n\twidth: 217px;\n\tborder-right: 1px solid #ddd;\n\tbackground: #f3f3f3;\n\tcolor: #666;\n}\n\n#plugin-information .fyi strong {\n\tcolor: #464646;\n}\n\n#plugin-information .fyi h3 {\n\tfont-weight: bold;\n\ttext-transform: uppercase;\n\tfont-size: 12px;\n\tcolor: #666;\n\tmargin: 24px 0 8px;\n}\n\n#plugin-information .fyi h2 {\n\tfont-size: 0.9em;\n\tmargin-bottom: 0;\n\tmargin-left: 0;\n}\n\n#plugin-information .fyi ul {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n}\n\n#plugin-information .fyi li {\n\tmargin: 0 0 10px;\n}\n\n#plugin-information .counter-container {\n\tmargin: 3px 0;\n}\n\n#plugin-information .counter-label {\n\tfloat: right;\n\tmargin-left: 5px;\n\tmin-width: 55px;\n}\n\n#plugin-information .counter-back {\n\theight: 17px;\n\twidth: 92px;\n\tbackground-color: #ececec;\n\tfloat: right;\n}\n\n#plugin-information .counter-bar {\n\theight: 17px;\n\tbackground-color: #ffc733; /* slightly lighter than stars due to larger expanse */\n\tfloat: right;\n}\n\n#plugin-information .counter-count {\n\tmargin-right: 5px;\n}\n\n#plugin-information .fyi ul.contributors {\n\tmargin-top: 10px;\n}\n\n#plugin-information .fyi ul.contributors li {\n\tdisplay: inline-block;\n\tmargin-left: 8px;\n\tvertical-align: middle;\n}\n\n#plugin-information .fyi ul.contributors li {\n\tdisplay: inline-block;\n\tmargin-left: 8px;\n\tvertical-align: middle;\n}\n\n#plugin-information .fyi ul.contributors li img {\n\tvertical-align: middle;\n\tmargin-left: 4px;\n}\n\n#plugin-information-footer {\n\tpadding: 13px 16px;\n\tposition: absolute;\n\tleft: 0;\n\tbottom: 0;\n\tright: 0;\n\theight: 33px; /* 33+13+13+1=60 */\n\tborder-top: 1px solid #ddd;\n\tbackground: #f3f3f3;\n}\n\n/* rtl:ignore */\n#plugin-information .section {\n\tdirection: ltr;\n}\n\n/* rtl:ignore */\n#plugin-information .section ul,\n#plugin-information .section ol {\n\tlist-style-type: disc;\n\tmargin-left: 24px;\n}\n\n#plugin-information .section,\n#plugin-information .section p {\n\tfont-size: 14px;\n\tline-height: 1.7;\n}\n\n#plugin-information #section-screenshots ol {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n#plugin-information #section-screenshots li img {\n\tvertical-align: text-top;\n\tmargin-top: 16px;\n\tmax-width: 100%;\n\twidth: auto;\n\theight: auto;\n\t-webkit-box-shadow: 0 1px 2px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 1px 2px rgba( 0, 0, 0, 0.3 );\n}\n\n/* rtl:ignore */\n#plugin-information #section-screenshots li p {\n\tfont-style: italic;\n\tpadding-left: 20px;\n}\n\n#plugin-information pre {\n\tpadding: 7px;\n\toverflow: auto;\n\tborder: 1px solid #ccc;\n}\n\n/* rtl:ignore */\n#plugin-information .review {\n\toverflow: hidden; /* clearfix */\n\twidth: 100%;\n\tmargin-bottom: 20px;\n\tborder-bottom: 1px solid #e6e6e6;\n}\n\n#plugin-information .review-title-section {\n\toverflow: hidden; /* clearfix */\n}\n\n/* rtl:ignore */\n#plugin-information .review-title-section h4 {\n\tdisplay: inline-block;\n\tfloat: left;\n\tmargin: 0 6px 0 0;\n}\n\n#plugin-information .reviewer-info p {\n\tclear: both;\n\tmargin: 0;\n\tpadding-top: 2px;\n}\n\n/* rtl:ignore */\n#plugin-information .reviewer-info .avatar {\n\tfloat: left;\n\tmargin: 4px 6px 0 0;\n}\n\n/* rtl:ignore */\n#plugin-information .reviewer-info .star-rating {\n\tfloat: left;\n}\n\n/* rtl:ignore */\n#plugin-information .review-meta {\n\tfloat: left;\n\tmargin-left: 0.75em;\n}\n\n/* rtl:ignore */\n#plugin-information .review-body {\n\tfloat: left;\n\twidth: 100%;\n}\n\n.plugin-version-author-uri {\n\tfont-size: 13px;\n}\n\n@media screen and ( max-width: 771px ) {\n\t#plugin-information-title.with-banner {\n\t\theight: 100px;\n\t\tbottom: 100px;\n\t}\n\n\t#plugin-information-title.with-banner h2 {\n\t\tmargin-top: 30px;\n\t\tfont-size: 20px;\n\t\tline-height: 40px;\n\t\tmax-width: 85%;\n\t}\n\n\t#plugin-information-title.with-banner div.vignette {\n\t\theight: 100px;\n\t\tbottom: 100px;\n\t\twidth: 800%;\n\t}\n\n\t#plugin-information-tabs {\n\t\toverflow: hidden; /* clearfix */\n\t\tpadding: 0;\n\t\theight: auto; /* let tabs wrap */\n\t}\n\n\t#plugin-information-tabs a.current {\n\t\tmargin-bottom: 0;\n\t\tborder-bottom: none;\n\t}\n\n\t#plugin-information .fyi {\n\t\tfloat: none;\n\t\tborder: 1px solid #ddd;\n\t\tposition: static;\n\t\twidth: auto;\n\t\tmargin: 26px 26px 0;\n\t\tpadding-bottom: 0; /* reset from the two column height fix */\n\t}\n\n\t#section-holder {\n\t\tposition: static;\n\t\tmargin: 0;\n\t\tpadding-bottom: 70px; /* reset from the two column height fix, plus accomodate footer */\n\t}\n\n\t#plugin-information .fyi h3,\n\t#plugin-information .fyi small {\n\t\tdisplay: none;\n\t}\n\n\t#plugin-information-footer {\n\t\tpadding: 12px 16px 0;\n\t\theight: 46px;\n\t}\n}\n\n/* Thickbox for Plugin Install screen */\nbody.about-php #TB_window,\nbody.plugin-install-php #TB_window,\nbody.import-php #TB_window,\nbody.plugins-php #TB_window,\nbody.update-core-php #TB_window,\nbody.index-php #TB_window {\n\tbackground: #fcfcfc;\n}\n\n/* IE 8 needs a change in the pseudo element content */\n.ie8 body.about-php #TB_window:before,\n.ie8 body.plugin-install-php #TB_window:before,\n.ie8 body.import-php #TB_window:before,\n.ie8 body.plugins-php #TB_window:before,\n.ie8 body.update-core-php #TB_window:before,\n.ie8 body.index-php #TB_window:before {\n\tcontent: \" \";\n\tbackground: none;\n}\n\nbody.about-php #TB_window.thickbox-loading:before,\nbody.plugin-install-php #TB_window.thickbox-loading:before,\nbody.import-php #TB_window.thickbox-loading:before,\nbody.plugins-php #TB_window.thickbox-loading:before,\nbody.update-core-php #TB_window.thickbox-loading:before,\nbody.index-php #TB_window.thickbox-loading:before {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 20px;\n\theight: 20px;\n\tposition: absolute;\n\tright: 50%;\n\ttop: 50%;\n\tz-index: -1;\n\tmargin: -10px -10px 0 0;\n\tbackground: #fcfcfc url(../images/spinner.gif) no-repeat center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\t-webkit-transform: translateZ(0);\n\ttransform: translateZ(0);\n}\n\n@media print,\n\t(-webkit-min-device-pixel-ratio: 1.25),\n\t(min-resolution: 120dpi) {\n\n\tbody.about-php #TB_window.thickbox-loading:before,\n\tbody.plugin-install-php #TB_window.thickbox-loading:before,\n\tbody.import-php #TB_window.thickbox-loading:before,\n\tbody.plugins-php #TB_window.thickbox-loading:before,\n\tbody.update-core-php #TB_window.thickbox-loading:before,\n\tbody.index-php #TB_window.thickbox-loading:before {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\nbody.about-php #TB_title,\nbody.plugin-install-php #TB_title,\nbody.import-php #TB_title,\nbody.plugins-php #TB_title,\nbody.update-core-php #TB_title,\nbody.index-php #TB_title {\n\tfloat: right;\n\theight: 1px;\n}\n\nbody.about-php #TB_ajaxWindowTitle,\nbody.plugin-install-php #TB_ajaxWindowTitle,\nbody.import-php #TB_ajaxWindowTitle,\nbody.plugins-php #TB_ajaxWindowTitle,\nbody.update-core-php #TB_ajaxWindowTitle,\nbody.index-php #TB_ajaxWindowTitle {\n\tdisplay: none;\n}\n\nbody.about-php .tb-close-icon,\nbody.plugin-install-php .tb-close-icon,\nbody.import-php .tb-close-icon,\nbody.plugins-php .tb-close-icon,\nbody.update-core-php .tb-close-icon,\nbody.index-php .tb-close-icon {\n\tright: auto;\n\tleft: -30px;\n\tcolor: #eee;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\nbody.about-php #TB_closeWindowButton:focus,\nbody.about-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.about-php .tb-close-icon:focus,\nbody.about-php .tb-close-icon:hover,\nbody.plugin-install-php #TB_closeWindowButton:focus,\nbody.plugin-install-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.plugin-install-php .tb-close-icon:focus,\nbody.plugin-install-php .tb-close-icon:hover,\nbody.import-php #TB_closeWindowButton:focus,\nbody.import-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.import-php .tb-close-icon:focus,\nbody.import-php .tb-close-icon:hover,\nbody.plugins-php #TB_closeWindowButton:focus,\nbody.plugins-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.plugins-php .tb-close-icon:focus,\nbody.plugins-php .tb-close-icon:hover,\nbody.update-core-php #TB_closeWindowButton:focus,\nbody.update-core-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.update-core-php .tb-close-icon:focus,\nbody.update-core-php .tb-close-icon:hover,\nbody.index-php #TB_closeWindowButton:focus,\nbody.index-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.index-php .tb-close-icon:focus,\nbody.index-php .tb-close-icon:hover {\n\tcolor: #00a0d2;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\nbody.about-php .tb-close-icon:before,\nbody.plugin-install-php .tb-close-icon:before,\nbody.import-php .tb-close-icon:before,\nbody.plugins-php .tb-close-icon:before,\nbody.update-core-php .tb-close-icon:before,\nbody.index-php .tb-close-icon:before {\n\tcontent: \"\\f335\";\n\tfont-size: 32px;\n}\n\n/* move plugin install close icon to top on narrow screens */\n@media screen and ( max-width: 830px ) {\n\tbody.about-php .tb-close-icon,\n\tbody.plugin-install-php .tb-close-icon,\n\tbody.import-php .tb-close-icon,\n\tbody.plugins-php .tb-close-icon,\n\tbody.update-core-php .tb-close-icon,\n\tbody.index-php .tb-close-icon {\n\t\tleft: 0;\n\t\ttop: -30px;\n\t}\n}\n\n/* @todo: move this. */\nimg {\n\tborder: none;\n}\n\n/* Header */\n/* @todo: are these also specific to Press This? */\n#wphead {\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n#wphead h1 a {\n\tcolor: #464646;\n}\n\n/* Metabox collapse arrow indicators */\n.js .sidebar-name .sidebar-name-arrow:before,\n.js .meta-box-sortables .postbox .toggle-indicator:before {\n\tcontent: \"\\f142\";\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n}\n\n.js .widgets-holder-wrap.closed .sidebar-name-arrow:before,\n.js .meta-box-sortables .postbox.closed .handlediv .toggle-indicator:before {\n\tcontent: \"\\f140\";\n}\n\n.js .sidebar-name .sidebar-name-arrow:before {\n\tpadding: 10px;\n\tright: 0;\n}\n\n.js #widgets-left .sidebar-name .sidebar-name-arrow {\n\tdisplay: none;\n}\n\n.js #widgets-left .widgets-holder-wrap.closed .sidebar-name .sidebar-name-arrow,\n.js #widgets-left .sidebar-name:hover .sidebar-name-arrow {\n\tdisplay: block;\n}\n\n.js .postbox .handlediv .toggle-indicator:before {\n\tmargin-top: 4px;\n\twidth: 20px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\ttext-indent: -1px; /* account for the dashicon alignment */\n}\n\n.rtl.js .postbox .handlediv .toggle-indicator:before {\n\ttext-indent: 1px; /* account for the dashicon alignment */\n}\n\n.js .postbox .handlediv:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n}\n\n.js .postbox .handlediv:focus .toggle-indicator:before {\n\t-webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n/* @todo: appears to be Press This only and overridden */\n#photo-add-url-div input[type=\"text\"] {\n\twidth: 300px;\n}\n\n/* Theme/Plugin Editor */\n.alignleft h2 {\n\tmargin: 0;\n}\n\n#template textarea {\n\tfont-family: Consolas, Monaco, monospace;\n\tfont-size: 13px;\n\twidth: 97%;\n\tbackground: #f9f9f9;\n\toutline: none;\n}\n\n/* rtl:ignore */\n#template textarea,\n#docs-list {\n\tdirection: ltr;\n}\n\n#template p {\n\twidth: 97%;\n}\n\n#templateside {\n\tfloat: left;\n\twidth: 190px;\n\tword-wrap: break-word;\n}\n\n#templateside h2,\n#postcustomstuff p.submit {\n\tmargin: 0;\n}\n\n#templateside h4 {\n\tmargin: 1em 0 0;\n}\n\n#templateside ol,\n#templateside ul {\n\tmargin: .5em 0;\n\tpadding: 0;\n}\n\n#templateside li {\n\tmargin: 4px 0;\n}\n\n#templateside li a,\n.theme-editor-php .highlight {\n\tdisplay: block;\n\tpadding: 3px 12px 3px 3px;\n\ttext-decoration: none;\n}\n\n.theme-editor-php .highlight {\n\tmargin: -3px -12px -3px 3px;\n}\n\n#templateside .highlight {\n\tborder: none;\n\tfont-weight: bold;\n}\n\n.nonessential {\n\tcolor: #666;\n\tfont-size: 11px;\n\tfont-style: italic;\n\tpadding-right: 12px;\n}\n\n#documentation {\n\tmargin-top: 10px;\n}\n\n#documentation label {\n\tline-height: 22px;\n\tvertical-align: baseline;\n\tfont-weight: 600;\n}\n\n.fileedit-sub {\n\tpadding: 10px 0 8px;\n\tline-height: 180%;\n}\n\n/* @todo: can we use a common class for these? */\n.nav-menus-php .item-edit:before,\n.widget-top a.widget-action:after,\n.control-section .accordion-section-title:after,\n.accordion-section-title:after {\n\tleft: 0;\n\tcontent: \"\\f140\";\n\tborder: none;\n\tbackground: none;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: block;\n\tpadding: 0;\n\ttext-indent: 0;\n\ttext-align: center;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n}\n\n.widget-action,\n.handlediv,\n.item-edit,\n.sidebar-name-arrow,\n.accordion-section-title:after {\n\tcolor: #a0a5aa;\n}\n\n.widget-action:hover,\n.handlediv:hover,\n.handlediv:focus,\n.item-edit:hover,\n.sidebar-name:hover .sidebar-name-arrow,\n.accordion-section-title:hover:after {\n\tcolor: #777;\n}\n\n.widget-top a.widget-action:after {\n\tpadding: 1px 0px 1px 2px;\n\tmargin-top: 10px;\n\tmargin-left: 10px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n}\n\n.widget-top a.widget-action:focus:after {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30,140,190,.8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30,140,190,.8);\n}\n\n.control-section .accordion-section-title:after,\n.accordion-section-title:after {\n\tfloat: left;\n\tleft: 20px;\n\ttop: -2px;\n}\n\n.control-section.open .accordion-section-title:after,\n#customize-info.open .accordion-section-title:after,\n.nav-menus-php .menu-item-edit-active .item-edit:before,\n.widget.open .widget-top a.widget-action:after {\n\tcontent: \"\\f142\";\n}\n\n/*!\n * jQuery UI Draggable/Sortable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-draggable-handle,\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n/* Accordion */\n.accordion-section {\n\tborder-bottom: 1px solid #dfdfdf;\n\tmargin: 0;\n}\n\n.accordion-section.open .accordion-section-content,\n.no-js .accordion-section .accordion-section-content {\n\tdisplay: block;\n}\n\n.accordion-section.open:hover {\n\tborder-bottom-color: #dfdfdf;\n}\n\n.accordion-section-content {\n\tdisplay: none;\n\tpadding: 10px 20px 15px;\n\toverflow: hidden;\n\tbackground: #fff;\n}\n\n.accordion-section-title {\n\tmargin: 0;\n\tpadding: 12px 15px 15px;\n\tposition: relative;\n\tborder-right: 1px solid #dfdfdf;\n\tborder-left: 1px solid #dfdfdf;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.js .accordion-section-title {\n\tcursor: pointer;\n}\n\n.js .accordion-section-title:after {\n\tposition: absolute;\n\ttop: 12px;\n\tleft: 10px;\n\tz-index: 1;\n}\n\n.accordion-section-title:focus {\n\toutline: none;\n}\n\n.accordion-section-title:hover:after,\n.accordion-section-title:focus:after {\n\tborder-color: #a0a5aa transparent;\n}\n\n.cannot-expand .accordion-section-title {\n\tcursor: auto;\n}\n\n.cannot-expand .accordion-section-title:after {\n\tdisplay: none;\n}\n\n.control-section .accordion-section-title {\n\tborder-right: none;\n\tborder-left: none;\n\tpadding: 10px 14px 11px 10px;\n\tline-height: 21px;\n\tbackground: #fff;\n}\n\n.control-section .accordion-section-title:after {\n\ttop: 11px;\n}\n\n.js .control-section:hover .accordion-section-title,\n.js .control-section .accordion-section-title:hover,\n.js .control-section.open .accordion-section-title,\n.js .control-section .accordion-section-title:focus {\n\tcolor: #23282d;\n\tbackground: #f5f5f5;\n}\n\n.control-section.open .accordion-section-title {\n\t/* When expanded */\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n/* Edit Site */\n.network-admin .edit-site-actions {\n\tmargin-top: 0;\n}\n\n/* My Sites */\n.my-sites {\n\tdisplay: block;\n\toverflow: auto;\n\tzoom: 1;\n}\n\n.my-sites li {\n\tdisplay: block;\n\tpadding: 8px 3%;\n\tmin-height: 130px;\n\tmargin: 0;\n}\n\n@media only screen and (max-width: 599px) {\n\t.my-sites li {\n\t\tmin-height: 0;\n\t}\n}\n\n@media only screen and (min-width: 600px) {\n\t.my-sites.striped li {\n\t\tbackground-color: #fff;\n\t\tposition: relative;\n\t}\n\t.my-sites.striped li:after {\n\t\tcontent: \"\";\n\t\twidth: 1px;\n\t\theight: 100%;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tbackground: #ccc;\n\t}\n\n}\n@media only screen and (min-width: 600px) and (max-width: 699px) {\n\t.my-sites li{\n\t\tfloat: right;\n\t\twidth: 44%;\n\t}\n\t.my-sites.striped li {\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(2n+1) {\n\t\tclear: right;\n\t}\n\t.my-sites.striped li:nth-of-type(2n+2):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(4n+1),\n\t.my-sites li:nth-of-type(4n+2) {\n\t\tbackground-color: #f9f9f9;\n\t}\n\n}\n\n@media only screen and (min-width: 700px) and (max-width: 1199px) {\n\t.my-sites li {\n\t\tfloat: right;\n\t\twidth: 27.333333%;\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(3n+3):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(6n+1),\n\t.my-sites li:nth-of-type(6n+2),\n\t.my-sites li:nth-of-type(6n+3) {\n\t\tbackground-color: #f9f9f9;\n\t}\n}\n\n@media only screen and (min-width: 1200px) and (max-width: 1399px) {\n\t.my-sites li {\n\t\tfloat: right;\n\t\twidth: 21%;\n\t\tpadding: 8px 2%;\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(4n+1) {\n\t\tclear: right;\n\t}\n\t.my-sites.striped li:nth-of-type(4n+4):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(8n+1),\n\t.my-sites li:nth-of-type(8n+2),\n\t.my-sites li:nth-of-type(8n+3),\n\t.my-sites li:nth-of-type(8n+4) {\n\t\tbackground-color: #f9f9f9;\n\t}\n}\n\n@media only screen and (min-width: 1400px) and (max-width: 1599px) {\n\t.my-sites li {\n\t\tfloat: right;\n\t\twidth: 16%;\n\t\tpadding: 8px 2%;\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(5n+1) {\n\t\tclear: right;\n\t}\n\t.my-sites.striped li:nth-of-type(5n+5):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(10n+1),\n\t.my-sites li:nth-of-type(10n+2),\n\t.my-sites li:nth-of-type(10n+3),\n\t.my-sites li:nth-of-type(10n+4),\n\t.my-sites li:nth-of-type(10n+5) {\n\t\tbackground-color: #f9f9f9;\n\t}\n}\n\n@media only screen and (min-width: 1600px) {\n\t.my-sites li {\n\t\tfloat: right;\n\t\twidth: 12.666666%;\n\t\tpadding: 8px 2%;\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(6n+1) {\n\t\tclear: right;\n\t}\n\t.my-sites.striped li:nth-of-type(6n+6):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(12n+1),\n\t.my-sites li:nth-of-type(12n+2),\n\t.my-sites li:nth-of-type(12n+3),\n\t.my-sites li:nth-of-type(12n+4),\n\t.my-sites li:nth-of-type(12n+5),\n\t.my-sites li:nth-of-type(12n+6) {\n\t\tbackground-color: #f9f9f9;\n\t}\n}\n\n.my-sites li a {\n\ttext-decoration: none;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/* @todo: de-duplication */\n@media only screen and (min-width: 769px) {\n\t/* categories */\n\t#col-left {\n\t\twidth: 35%;\n\t}\n\n\t#col-right {\n\t\twidth: 65%;\n\t}\n}\n\n@media only screen and (max-width: 860px) {\n\n\t/* categories */\n\t#col-left {\n\t\twidth: 35%;\n\t}\n\n\t#col-right {\n\t\twidth: 65%;\n\t}\n}\n\n@media only screen and (min-width: 980px) {\n\n\t/* categories */\n\t#col-left {\n\t\twidth: 35%;\n\t}\n\n\t#col-right {\n\t\twidth: 65%;\n\t}\n}\n\n@media only screen and (max-width: 768px) {\n\t/* categories */\n\t#col-left {\n\t\twidth: 100%;\n\t}\n\n\t#col-right {\n\t\twidth: 100%;\n\t}\n}\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t/* Back-compat for pre-3.8 */\n\tdiv.star-holder,\n\tdiv.star-holder .star-rating {\n\t\tbackground: url(../images/stars-2x.png?ver=20121108) repeat-x bottom left;\n\t\t-webkit-background-size: 21px 37px;\n\t\tbackground-size: 21px 37px;\n\t}\n\n\t.spinner {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n\n\t/* @todo: evaluate - most of these were likely replaced by dashicons */\n\t.curtime #timestamp,\n\t#screen-meta-links a.show-settings,\n\t.widget-top a.widget-action,\n\t.widget-top a.widget-action:hover,\n\t.sidebar-name-arrow,\n\t.sidebar-name:hover .sidebar-name-arrow,\n\t.meta-box-sortables .postbox:hover .handlediv,\n\t.tagchecklist span a,\n\t#bulk-titles div a,\n\t.tagchecklist span a:hover,\n\t#bulk-titles div a:hover {\n\t\tbackground: none !important;\n\t}\n\n}\n\n@-ms-viewport {\n\twidth: device-width;\n}\n\n@media screen and ( max-width: 782px ) {\n\thtml.wp-toolbar {\n\t\tpadding-top: 46px;\n\t}\n\n\tbody {\n\t\tmin-width: 240px;\n\t\toverflow-x: hidden;\n\t}\n\n\tbody * {\n\t\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;\n\t}\n\n\t#wpcontent {\n\t\tposition: relative;\n\t\tmargin-right: 0;\n\t\tpadding-right: 10px;\n\t}\n\n\t#wpbody-content {\n\t\tpadding-bottom: 100px;\n\t}\n\n\t.wrap {\n\t\tmargin-left: 12px;\n\t\tmargin-right: 0;\n\t}\n\n\t.col-wrap {\n\t\tpadding: 0;\n\t}\n\n\t/* Hidden Elements */\n\t#screen-meta,\n\t#screen-meta-links,\n\t#collapse-menu,\n\t.post-format-select {\n\t\tdisplay: none !important;\n\t}\n\n\t.wrap .add-new-h2, /* deprecated */\n\t.wrap .add-new-h2:active, /* deprecated */\n\t.wrap .page-title-action,\n\t.wrap .page-title-action:active {\n\t\tpadding: 10px 15px;\n\t\tfont-size: 14px;\n\t\twhite-space: nowrap;\n\t}\n\n\t.wp-color-result {\n\t\theight: auto;\n\t\tpadding-right: 45px;\n\t}\n\n\t.wp-color-result:after {\n\t\tfont-size: 14px;\n\t\theight: auto;\n\t\tpadding: 6px 14px;\n\t}\n\n\t/* Feedback Messages */\n\t.notice,\n\t.wrap div.updated,\n\t.wrap div.error,\n\t.media-upload-form div.error {\n\t\tmargin: 20px 0 10px 0;\n\t\tpadding: 5px 10px;\n\t\tfont-size: 14px;\n\t\tline-height: 175%;\n\t}\n\n\t.wp-core-ui .notice.is-dismissible {\n\t\tpadding-left: 46px;\n\t}\n\n\t.notice-dismiss {\n\t\tpadding: 13px;\n\t}\n\n\t.wrap .icon32 + h2 {\n\t\tmargin-top: -2px;\n\t}\n\n\t.wp-responsive-open #wpbody {\n\t\tleft: -190px;\n\t}\n\n\tcode {\n\t\tword-wrap: break-word;\n\t}\n\n\t/* General Metabox */\n\t.postbox {\n\t\tfont-size: 14px;\n\t}\n\n\t.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */\n\t.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */\n\t.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */\n\t.metabox-holder h2 {\n\t\tpadding: 12px;\n\t}\n\n\t.postbox .handlediv {\n\t\tmargin-top: 3px;\n\t}\n\n\t/* Subsubsub Nav */\n\t.subsubsub {\n\t\tfont-size: 16px;\n\t\ttext-align: center;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t/* Theme/Plugin File Editor */\n\t#templateside {\n\t\tfloat: none;\n\t\twidth: auto;\n\t}\n\n\t#templateside li {\n\t\tmargin: 0;\n\t}\n\n\t#templateside li a {\n\t\tdisplay: block;\n\t\tpadding: 5px;\n\t}\n\n\t#templateside .highlight {\n\t\tpadding: 5px;\n\t\tmargin-right: -5px;\n\t\tmargin-top: -5px;\n\t}\n\n\t#template div {\n\t\tfloat: none;\n\t\tmargin: 0;\n\t\twidth: auto;\n\t}\n\n\t#template textarea {\n\t\twidth: 100%;\n\t}\n\n\t.fileedit-sub .alignright {\n\t\tmargin-top: 15px;\n\t}\n\n\t#wpfooter {\n\t\tdisplay: none;\n\t}\n\n\t#comments-form .checkforspam {\n\t\tdisplay: none;\n\t}\n\n\t.edit-comment-author {\n\t\tmargin: 2px 0 0;\n\t}\n\n\t.filter-drawer .filter-group-feature input,\n\t.filter-drawer .filter-group-feature label {\n\t\tline-height: 25px;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t/* Disable horizontal scroll when responsive menu is open\n\t   since we push the main content off to the right. */\n\t#wpwrap.wp-responsive-open {\n\t\toverflow-x: hidden;\n\t}\n\n\thtml.wp-toolbar {\n\t\tpadding-top: 0;\n\t}\n\n\t#wpbody {\n\t\tpadding-top: 46px;\n\t}\n\n\t/* Keep full-width boxes on Edit Post page from causing horizontal scroll */\n\tdiv#post-body.metabox-holder.columns-1 {\n\t\toverflow-x: hidden;\n\t}\n\n\th1.nav-tab-wrapper,\n\t.wrap h2.nav-tab-wrapper,\n\th3.nav-tab-wrapper {\n\t\tpadding-right: 0;\n\t\tborder-bottom: 0;\n\t}\n\n\th1 .nav-tab,\n\th2 .nav-tab,\n\th3 .nav-tab {\n\t\tmargin-top: 10px;\n\t\tmargin-left: 10px;\n\t\tborder-bottom: 1px solid #ccc;\n\t}\n}\n\n@media screen and (max-width: 320px) {\n\t/* Prevent default center alignment and larger font for the Right Now widget when\n\t   the network dashboard is viewed on a small mobile device. */\n\t#network_dashboard_right_now .subsubsub {\n\t\tfont-size: 14px;\n\t\ttext-align: right;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/common.css",
    "content": "/* 2 column liquid layout */\n#wpwrap {\n\theight: auto;\n\tmin-height: 100%;\n\twidth: 100%;\n\tposition: relative;\n\t-webkit-font-smoothing: subpixel-antialiased;\n}\n\n#wpcontent {\n\theight: 100%;\n\tpadding-left: 20px;\n}\n\n#wpcontent,\n#wpfooter {\n\tmargin-left: 160px;\n}\n\n.folded #wpcontent,\n.folded #wpfooter {\n\tmargin-left: 36px;\n}\n\n#wpbody-content {\n\tpadding-bottom: 65px;\n\tfloat: left;\n\twidth: 100%;\n\toverflow: visible !important;\n}\n\n/* inner 2 column liquid layout */\n\n.inner-sidebar {\n\tfloat: right;\n\tclear: right;\n\tdisplay: none;\n\twidth: 281px;\n\tposition: relative;\n}\n\n.columns-2 .inner-sidebar {\n\tmargin-right: auto;\n\twidth: 286px;\n\tdisplay: block;\n}\n\n.inner-sidebar #side-sortables,\n.columns-2 .inner-sidebar #side-sortables {\n\tmin-height: 300px;\n\twidth: 280px;\n\tpadding: 0;\n}\n\n.has-right-sidebar .inner-sidebar {\n\tdisplay: block;\n}\n\n.has-right-sidebar #post-body {\n\tfloat: left;\n\tclear: left;\n\twidth: 100%;\n\tmargin-right: -2000px;\n}\n\n.has-right-sidebar #post-body-content {\n\tmargin-right: 300px;\n\tfloat: none;\n\twidth: auto;\n}\n\n/* 2 columns main area */\n\n#col-container,\n#col-left,\n#col-right {\n\toverflow: hidden;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n#col-left {\n\twidth: 35%;\n}\n\n#col-right {\n\tfloat: right;\n\tclear: right;\n\twidth: 65%;\n}\n\n.col-wrap {\n\tpadding: 0 7px;\n}\n\n/* utility classes */\n.alignleft {\n\tfloat: left;\n}\n\n.alignright {\n\tfloat: right;\n}\n\n.textleft {\n\ttext-align: left;\n}\n\n.textright {\n\ttext-align: right;\n}\n\n.clear {\n\tclear: both;\n}\n\n/* Hide visually but not from screen readers */\n.screen-reader-text,\n.screen-reader-text span,\n.ui-helper-hidden-accessible {\n\tposition: absolute;\n\tmargin: -1px;\n\tpadding: 0;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(0 0 0 0);\n\tborder: 0;\n\tword-wrap: normal !important; /* many screen reader and browser combinations announce broken words as they would appear visually */\n}\n\n.screen-reader-shortcut {\n\tposition: absolute;\n\ttop: -1000em;\n}\n\n.screen-reader-shortcut:focus {\n\tleft: 6px;\n\ttop: -25px;\n\theight: auto;\n\twidth: auto;\n\tdisplay: block;\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tpadding: 15px 23px 14px;\n\tbackground: #f1f1f1;\n\tcolor: #0073aa;\n\tz-index: 100000;\n\tline-height: normal;\n\t-webkit-box-shadow: 0 0 2px 2px rgba(0,0,0,.6);\n\tbox-shadow: 0 0 2px 2px rgba(0,0,0,.6);\n\ttext-decoration: none;\n\toutline: none;\n}\n\n.hidden,\n.js .closed .inside,\n.js .hide-if-js,\n.no-js .hide-if-no-js,\n.js.wp-core-ui .hide-if-js,\n.js .wp-core-ui .hide-if-js,\n.no-js.wp-core-ui .hide-if-no-js,\n.no-js .wp-core-ui .hide-if-no-js {\n\tdisplay: none;\n}\n\n/* @todo: Take a second look. Large chunks of shared color, from the colors.css merge */\n.widget-top,\n.menu-item-handle,\n.widget-inside,\n#menu-settings-column .accordion-container,\n#menu-management .menu-edit,\n.manage-menus,\ntable.widefat,\n.stuffbox,\np.popular-tags,\n.widgets-holder-wrap,\n.wp-editor-container,\n.popular-tags,\n.feature-filter,\n.imgedit-group,\n.comment-ays {\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n}\n\ntable.widefat,\n.wp-editor-container,\n.stuffbox,\np.popular-tags,\n.widgets-holder-wrap,\n.popular-tags,\n.feature-filter,\n.imgedit-group,\n.comment-ays {\n\tbackground: #fff;\n}\n\n/* general */\nhtml,\nbody {\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tbackground: #f1f1f1;\n}\n\nbody {\n\tcolor: #444;\n\tfont-family: \"Open Sans\", sans-serif;\n\tfont-size: 13px;\n\tline-height: 1.4em;\n\tmin-width: 600px;\n}\n\nbody.iframe {\n\tmin-width: 0;\n\tpadding-top: 1px;\n}\n\nbody.modal-open {\n\toverflow: hidden;\n}\n\nbody.mobile.modal-open #wpwrap {\n\toverflow: hidden;\n\tposition: fixed;\n\theight: 100%;\n}\n\niframe,\nimg {\n\tborder: 0;\n}\n\ntd {\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tfont-weight: inherit;\n\tline-height: inherit;\n}\n\na {\n\tcolor: #0073aa;\n\t-webkit-transition-property: border, background, color;\n\ttransition-property: border, background, color;\n\t-webkit-transition-duration: .05s;\n\ttransition-duration: .05s;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\na,\ndiv {\n\toutline: 0;\n}\n\na:hover,\na:active {\n\tcolor: #00a0d2;\n}\n\na:focus,\na:focus .media-icon img {\n\tcolor: #124964;\n    -webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 a:focus {\n\toutline: #5b9dd9 solid 1px;\n}\n\n#adminmenu a:focus,\n.screen-reader-text:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n}\n\nblockquote,\nq {\n\tquotes: none;\n}\n\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n\tcontent: \"\";\n\tcontent: none;\n}\n\np {\n\tfont-size: 13px;\n\tline-height: 1.5;\n\tmargin: 1em 0;\n}\n\nblockquote {\n\tmargin: 1em;\n}\n\nli,\ndd {\n\tmargin-bottom: 6px;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tdisplay: block;\n\tfont-weight: 600;\n}\n\nh1 {\n\tcolor: #23282d;\n\tfont-size: 2em;\n\tmargin: .67em 0;\n}\n\nh2,\nh3 {\n\tcolor: #23282d;\n\tfont-size: 1.3em;\n\tmargin: 1em 0;\n}\n\n.update-php h2,\n.update-core-php h2,\nh4 {\n\tfont-size: 1em;\n\tmargin: 1.33em 0;\n}\n\nh5 {\n\tfont-size: 0.83em;\n\tmargin: 1.67em 0;\n}\n\nh6 {\n\tfont-size: 0.67em;\n\tmargin: 2.33em 0;\n}\n\nul,\nol {\n\tpadding: 0;\n}\n\nul {\n\tlist-style: none;\n}\n\nol {\n\tlist-style-type: decimal;\n\tmargin-left: 2em;\n}\n\nul.ul-disc {\n\tlist-style: disc outside;\n}\n\nul.ul-square {\n\tlist-style: square outside;\n}\n\nol.ol-decimal {\n\tlist-style: decimal outside;\n}\n\nul.ul-disc,\nul.ul-square,\nol.ol-decimal {\n\tmargin-left: 1.8em;\n}\n\nul.ul-disc > li,\nul.ul-square > li,\nol.ol-decimal > li {\n\tmargin: 0 0 0.5em;\n}\n\n/* rtl:ignore */\n.ltr {\n\tdirection: ltr;\n}\n\n/* rtl:ignore */\n.code,\ncode {\n\tfont-family: Consolas, Monaco, monospace;\n\tdirection: ltr;\n\tunicode-bidi: embed;\n}\n\nkbd,\ncode {\n\tpadding: 3px 5px 2px 5px;\n\tmargin: 0 1px;\n\tbackground: #eaeaea;\n\tbackground: rgba(0,0,0,0.07);\n\tfont-size: 13px;\n}\n\n.subsubsub {\n\tlist-style: none;\n\tmargin: 8px 0 0;\n\tpadding: 0;\n\tfont-size: 13px;\n\tfloat: left;\n\tcolor: #666;\n}\n\n.subsubsub a {\n\tline-height: 2;\n\tpadding: .2em;\n\ttext-decoration: none;\n}\n\n.subsubsub a .count,\n.subsubsub a.current .count {\n\tcolor: #999;\n\tfont-weight: normal;\n}\n\n.subsubsub a.current {\n\tfont-weight: 600;\n\tborder: none;\n}\n\n.subsubsub li {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tpadding: 0;\n\twhite-space: nowrap;\n}\n\n/* .widefat - main style for tables */\n.widefat {\n\tborder-spacing: 0;\n\twidth: 100%;\n\tclear: both;\n\tmargin: 0;\n}\n\n.widefat * {\n\tword-wrap: break-word;\n}\n\n.widefat a {\n\ttext-decoration: none;\n}\n\n.widefat td,\n.widefat th {\n\tpadding: 8px 10px;\n}\n\n.widefat thead th,\n.widefat thead td {\n\tborder-bottom: 1px solid #e1e1e1;\n}\n\n.widefat tfoot th,\n.widefat tfoot td {\n\tborder-top: 1px solid #e1e1e1;\n\tborder-bottom: none;\n}\n\n.widefat .no-items td {\n\tborder-bottom-width: 0;\n}\n\n.widefat td {\n\tvertical-align: top;\n}\n\n.widefat td,\n.widefat td p,\n.widefat td ol,\n.widefat td ul {\n\tfont-size: 13px;\n\tline-height: 1.5em;\n}\n\n.widefat th,\n.widefat thead td,\n.widefat tfoot td {\n\ttext-align: left;\n\tline-height: 1.3em;\n\tfont-size: 14px;\n}\n\n.widefat th input,\n.widefat thead td input,\n.widefat tfoot td input {\n\tmargin: 0 0 0 8px;\n\tpadding: 0;\n\tvertical-align: text-top;\n}\n\n.widefat .check-column {\n\twidth: 2.2em;\n\tpadding: 6px 0 25px;\n\tvertical-align: top;\n}\n\n.widefat th input[type=checkbox],\n.widefat thead td input[type=checkbox],\n.widefat tfoot td input[type=checkbox] {\n\tmargin-top: -1px;\n}\n\n.widefat tbody th.check-column {\n\tpadding: 9px 0 22px;\n}\n\n.widefat thead td.check-column,\n.widefat tbody th.check-column,\n.widefat tfoot td.check-column {\n\tpadding: 11px 0 0 3px;\n}\n\n.widefat thead td.check-column,\n.widefat tfoot td.check-column {\n\tpadding-top: 4px;\n\tvertical-align: middle;\n}\n\n.update-php div.updated,\n.update-php div.error {\n\tmargin-left: 0;\n}\n\n.no-js .widefat thead .check-column input,\n.no-js .widefat tfoot .check-column input {\n\tdisplay: none;\n}\n\n.widefat .num,\n.column-comments,\n.column-links,\n.column-posts {\n\ttext-align: center;\n}\n\n.widefat th#comments {\n\tvertical-align: middle;\n}\n\n.wrap {\n\tmargin: 10px 20px 0 2px;\n}\n\n.wrap > h2:first-child, /* Back-compat for pre-4.4 */\n.wrap [class$=\"icon32\"] + h2, /* Back-compat for pre-4.4 */\n.postbox .inside h2, /* Back-compat for pre-4.4 */\n.wrap h1 {\n\tfont-size: 23px;\n\tfont-weight: 400;\n\tmargin: 0;\n\tpadding: 9px 15px 4px 0;\n\tline-height: 29px;\n}\n\n.subtitle {\n\tmargin: 0;\n\tpadding-left: 25px;\n\tcolor: #777;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.wrap .add-new-h2, /* deprecated */\n.wrap .add-new-h2:active, /* deprecated */\n.wrap .page-title-action,\n.wrap .page-title-action:active {\n\tmargin-left: 4px;\n\tpadding: 4px 8px;\n\tposition: relative;\n\ttop: -3px;\n\ttext-decoration: none;\n\tborder: none;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\tbackground: #e0e0e0;\n\ttext-shadow: none;\n\tfont-weight: 600;\n\tfont-size: 13px;\n}\n\n.wrap .add-new-h2:hover, /* deprecated */\n.wrap .page-title-action:hover {\n\tbackground: #00a0d2;\n\tcolor: #fff;\n}\n\n.wrap h1.long-header {\n\tpadding-right: 0;\n}\n\n.wp-dialog {\n\tbackground-color: #fff;\n}\n\n.widgets-chooser ul,\n#widgets-left .widget-in-question .widget-top,\n#available-widgets .widget-top:hover,\ndiv#widgets-right .widget-top:hover,\n#widgets-left .widget-top:hover {\n\tborder-color: #999;\n\t-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 2px rgba(0,0,0,0.1);\n}\n\n.sorthelper {\n\tbackground-color: #ccf3fa;\n}\n\n.ac_match,\n.subsubsub a.current {\n\tcolor: #000;\n}\n\n.striped > tbody > :nth-child(odd),\nul.striped > :nth-child(odd),\n.alternate {\n\tbackground-color: #f9f9f9;\n}\n\n.bar {\n\tbackground-color: #e8e8e8;\n\tborder-right-color: #99d;\n}\n\n.media-upload-form label.form-help,\ntd.help {\n\tcolor: #9a9a9a;\n}\n\n/* Helper classes for plugins to leverage the active WordPress color scheme */\n\n.highlight {\n\tbackground-color: #e4f2fd;\n\tcolor: #000;\n}\n\n.wp-ui-primary {\n\tcolor: #fff;\n\tbackground-color: #32373c;\n}\n.wp-ui-text-primary {\n\tcolor: #32373c;\n}\n\n.wp-ui-highlight {\n\tcolor: white;\n\tbackground-color: #1e8cbe;\n}\n.wp-ui-text-highlight {\n\tcolor: #1e8cbe;\n}\n\n.wp-ui-notification {\n\tcolor: #fff;\n\tbackground-color: #d54e21;\n}\n.wp-ui-text-notification {\n\tcolor: #d54e21;\n}\n\n.wp-ui-text-icon {\n\tcolor: #999;\n}\n\n/* For emoji replacement images */\nimg.emoji {\n\tdisplay: inline !important;\n\tborder: none !important;\n\theight: 1em !important;\n\twidth: 1em !important;\n\tmargin: 0 .07em !important;\n\tvertical-align: -0.1em !important;\n\tbackground: none !important;\n\tpadding: 0 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n}\n\n/*------------------------------------------------------------------------------\n  1.0 - Text Styles\n------------------------------------------------------------------------------*/\n\n.widget .widget-top,\n.postbox .hndle,\n.stuffbox .hndle,\n.control-section .accordion-section-title,\n.sidebar-name,\n#nav-menu-header,\n#nav-menu-footer,\n.menu-item-handle,\n.checkbox,\n.side-info,\n#your-profile #rich_editing,\n.widefat thead th,\n.widefat thead td,\n.widefat tfoot th,\n.widefat tfoot td {\n\tline-height: 1.4em;\n}\n\n.widget .widget-top,\n.menu-item-handle {\n\tbackground: #fafafa;\n\tcolor: #23282d;\n}\n\n.postbox .hndle,\n.stuffbox .hndle {\n\tborder-bottom: 1px solid #eee;\n}\n\n.quicktags,\n.search {\n\tbackground-color: #ccc;\n\tcolor: #000;\n\tfont-size: 12px;\n}\n\n.icon32 {\n\tdisplay: none;\n}\n\n/* @todo can we combine these into a class or use an existing dashicon one? */\n.welcome-panel .welcome-panel-close:before,\n.tagchecklist span a:before,\n#bulk-titles div a:before,\n.notice-dismiss:before {\n\tbackground: none;\n\tcolor: #b4b9be;\n\tcontent: \"\\f153\";\n\tdisplay: block;\n\tfont: normal 16px/20px dashicons;\n\tspeak: none;\n\theight: 20px;\n\ttext-align: center;\n\twidth: 20px;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.welcome-panel .welcome-panel-close:before {\n\tmargin: 0;\n}\n\n.tagchecklist span a:before,\n#bulk-titles div a:before {\n\tmargin: 1px 0;\n}\n\n.welcome-panel .welcome-panel-close:hover:before,\n.welcome-panel .welcome-panel-close:focus:before,\n.tagchecklist span a:hover:before,\n#bulk-titles div a:hover:before {\n\tcolor: #c00;\n}\n\n.key-labels label {\n\tline-height: 24px;\n}\n\nstrong, b {\n\tfont-weight: 600;\n}\n\n.pre {\n\t/* https://developer.mozilla.org/en-US/docs/CSS/white-space */\n\twhite-space: pre-wrap; /* css-3 */\n\tword-wrap: break-word; /* IE 5.5 - 7 */\n}\n\n.howto {\n\tcolor: #666;\n\tfont-style: italic;\n\tdisplay: block;\n}\n\np.install-help {\n\tmargin: 8px 0;\n\tfont-style: italic;\n}\n\n.no-break {\n\twhite-space: nowrap;\n}\n\nhr {\n\tborder: 0;\n\tborder-top: 1px solid #ddd;\n\tborder-bottom: 1px solid #fafafa;\n}\n\n.row-actions span.delete a,\n.row-actions span.trash a,\n.row-actions span.spam a,\n.plugins a.delete,\n#all-plugins-table .plugins a.delete,\n#search-plugins-table .plugins a.delete,\n.submitbox .submitdelete,\n#media-items a.delete,\n#media-items a.delete-permanently,\n#nav-menu-footer .menu-delete {\n\tcolor: #a00;\n}\n\nabbr.required,\n.file-error,\n.widget-control-remove:hover,\n.row-actions .delete a:hover,\n.row-actions .trash a:hover,\n.row-actions .spam a:hover,\n.plugins a.delete:hover,\n#all-plugins-table .plugins a.delete:hover,\n#search-plugins-table .plugins a.delete:hover,\n.submitbox .submitdelete:hover,\n#media-items a.delete:hover,\n#media-items a.delete-permanently:hover,\n#nav-menu-footer .menu-delete:hover {\n\tcolor: #f00;\n\ttext-decoration: none;\n\tborder: none;\n}\n\n/*------------------------------------------------------------------------------\n  3.0 - Actions\n------------------------------------------------------------------------------*/\n\n#major-publishing-actions {\n\tpadding: 10px;\n\tclear: both;\n\tborder-top: 1px solid #ddd;\n\tbackground: #f5f5f5;\n}\n\n#delete-action {\n\tline-height: 28px;\n\tvertical-align: middle;\n\ttext-align: left;\n\tfloat: left;\n}\n\n#publishing-action {\n\ttext-align: right;\n\tfloat: right;\n\tline-height: 23px;\n}\n\n#publishing-action .spinner {\n\tfloat: left;\n}\n\n#misc-publishing-actions {\n\tpadding: 6px 0 0;\n}\n\n.misc-pub-section {\n\tpadding: 6px 10px 8px;\n}\n\n.misc-pub-filename {\n\tword-wrap: break-word;\n}\n\n#minor-publishing-actions {\n\tpadding: 10px 10px 0 10px;\n\ttext-align: right;\n}\n\n#save-post {\n\tfloat: left;\n}\n\n.preview {\n\tfloat: right;\n}\n\n#sticky-span {\n\tmargin-left: 18px;\n}\n\n.side-info {\n\tmargin: 0;\n\tpadding: 4px;\n\tfont-size: 11px;\n}\n\n.side-info h5 {\n\tpadding-bottom: 7px;\n\tfont-size: 14px;\n\tmargin: 12px 2px 5px;\n\tborder-bottom: 1px solid #dadada;\n}\n\n.side-info ul {\n\tmargin: 0;\n\tpadding-left: 18px;\n\tlist-style: square;\n\tcolor: #666;\n}\n\n.approve,\n.unapproved .unapprove {\n\tdisplay: none;\n}\n\n.unapproved .approve,\n.spam .approve,\n.trash .approve {\n\tdisplay: inline;\n}\n\ntd.action-links,\nth.action-links {\n\ttext-align: right;\n}\n\n/* Filter bar */\n.wp-filter {\n\tdisplay: inline-block;\n\tposition: relative;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin: 12px 0 25px;\n\tpadding: 0 10px;\n\twidth: 100%;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tborder: 1px solid #e5e5e5;\n\tbackground: #fff;\n\tcolor: #555;\n\tfont-size: 13px;\n}\n\n.wp-filter a {\n\ttext-decoration: none;\n}\n\n.filter-count {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmin-width: 4em;\n}\n\n.title-count,\n.filter-count .count {\n\tdisplay: inline-block;\n\tposition: relative;\n\ttop: -1px;\n\tpadding: 4px 10px;\n\t-webkit-border-radius: 30px;\n\tborder-radius: 30px;\n\tbackground: #777;\n\tcolor: #fff;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n/* not a part of filter bar, but derived from it, so here for now */\n.title-count {\n\tdisplay: inline;\n\ttop: -3px;\n\tmargin-left: 5px;\n\tmargin-right: 20px;\n}\n\n.filter-items {\n\tfloat: left;\n}\n\n.filter-links {\n\tdisplay: inline-block;\n\tmargin: 0;\n}\n\n.filter-links li {\n\tdisplay: inline-block;\n\tmargin: 0;\n}\n\n.filter-links li > a {\n\tdisplay: inline-block;\n\tmargin: 0 10px;\n\tpadding: 15px 0;\n\tborder-bottom: 4px solid #fff;\n\tcolor: #666;\n\tcursor: pointer;\n}\n\n.filter-links .current {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder-bottom: 4px solid #666;\n\tcolor: #23282d;\n}\n\n.filter-links li > a:hover,\n.filter-links li > a:focus,\n.show-filters .filter-links a.current:hover,\n.show-filters .filter-links a.current:focus {\n\tcolor: #00a0d2;\n}\n\n.wp-filter .search-form {\n\tfloat: right;\n\tmargin: 10px 0;\n}\n\n.wp-filter .search-form input[type=\"search\"] {\n\tmargin: 0;\n\tpadding: 3px 5px;\n\twidth: 280px;\n\tmax-width: 100%;\n\tfont-size: 16px;\n\tfont-weight: 300;\n\tline-height: 1.5;\n}\n\n.wp-filter .search-form select {\n\tmargin: 0;\n\theight: 32px;\n\tvertical-align: top;\n}\n\n.wp-filter .search-form.search-plugins {\n\tdisplay: inline-block;\n}\n\n.wp-filter .drawer-toggle {\n\tdisplay: inline-block;\n\tmargin: 0 10px;\n\tpadding: 4px 6px;\n\tcolor: #666;\n\tcursor: pointer;\n}\n\n.wp-filter .drawer-toggle:before {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tcontent: \"\\f111\";\n\tmargin: 0 5px 0 0;\n\twidth: 16px;\n\theight: 16px;\n\tcolor: #777;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\tfont-family: dashicons;\n\tfont-size: 16px;\n\tline-height: 1;\n\ttext-align: center;\n\ttext-decoration: inherit;\n\tfont-weight: normal;\n\tfont-style: normal;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.wp-filter .drawer-toggle:hover,\n.wp-filter .drawer-toggle:hover:before {\n\tcolor: #00a0d2;\n}\n\n.wp-filter .drawer-toggle.current:before {\n\tcolor: #fff;\n}\n\n.wp-filter .favorites-form {\n\tdisplay: none;\n\tmargin: 0 -20px;\n\tpadding: 20px;\n\tborder-top: 1px solid #eee;\n\tbackground: #fafafa;\n\toverflow: hidden;\n\twidth: 100%;\n}\n\n.show-favorites-form .wp-filter .favorites-form {\n\tdisplay: block;\n}\n\n.filter-drawer {\n\tdisplay: none;\n\tmargin: 0 -20px;\n\tpadding: 20px;\n\tborder-top: 1px solid #eee;\n\tbackground: #fafafa;\n}\n\n.show-filters .filter-drawer {\n\tdisplay: block;\n\toverflow: hidden;\n\twidth: 100%;\n}\n\n.show-filters .wp-filter .drawer-toggle:hover,\n.show-filters .wp-filter .drawer-toggle:focus {\n\tbackground: rgb(46, 162, 204);\n}\n\n.show-filters .filter-links a.current {\n\tborder-bottom: none;\n}\n\n.show-filters .wp-filter .drawer-toggle {\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\tborder: none;\n\tbackground: #777;\n\tcolor: #fff;\n}\n\n.show-filters .wp-filter .drawer-toggle:before {\n\tcolor: #fff;\n}\n\n.filter-group {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tposition: relative;\n\tfloat: left;\n\tmargin: 0 1% 0 0;\n\tpadding: 20px 10px 10px;\n\twidth: 24%;\n\tbackground: #fff;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n}\n\n.filter-group legend {\n\tposition: absolute;\n\ttop: 10px;\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 1em;\n\tfont-weight: 600;\n}\n\n.filter-drawer .filter-group-feature {\n\tmargin: 28px 0 0;\n\tlist-style-type: none;\n\tfont-size: 12px;\n}\n\n.filter-drawer .filter-group-feature input,\n.filter-drawer .filter-group-feature label {\n\tdisplay: inline-block;\n\tmargin: 7px 4px 7px 0;\n\tline-height: 16px;\n}\n\n.filter-drawer .buttons {\n\tmargin-bottom: 20px;\n}\n\n.filter-drawer .buttons .button span {\n\tdisplay: inline-block;\n\topacity: 0.8;\n\tfont-size: 12px;\n\ttext-indent: 10px;\n}\n\n.wp-filter .button.clear-filters {\n\tdisplay: none;\n\tmargin-left: 10px;\n}\n\n.filtered-by {\n\tdisplay: none;\n\tmargin: 0;\n}\n\n.filtered-by > span {\n\tfont-weight: 600;\n}\n\n.filtered-by a {\n\tmargin-left: 10px;\n}\n\n.filtered-by .tags {\n\tdisplay: inline;\n}\n\n.filtered-by .tag {\n\tmargin: 0 5px;\n\tpadding: 4px 8px;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbackground: #fff;\n\tfont-size: 11px;\n}\n\n.filters-applied .filter-group,\n.filters-applied .filter-drawer .buttons,\n.filters-applied .filter-drawer br {\n\tdisplay: none !important;\n}\n\n.filters-applied .filtered-by {\n\tdisplay: block;\n}\n\n.filters-applied .filter-drawer {\n\tpadding: 20px;\n}\n\n.show-filters .content-filterable,\n.show-filters.filters-applied.loading-content .content-filterable,\n.loading-content .content-filterable,\n.error .content-filterable {\n\tdisplay: none;\n}\n\n.show-filters.filters-applied .content-filterable {\n\tdisplay: block;\n}\n\n.loading-content .spinner {\n\tdisplay: block;\n\tmargin: 40px auto 0;\n\tfloat: none;\n}\n\n@media only screen and (max-width: 1120px) {\n\t.filter-drawer {\n\t\tborder-bottom: 1px solid #eee;\n\t}\n\n\t.filter-group {\n\t\tmargin-bottom: 0;\n\t\tmargin-top: 5px;\n\t\twidth: 100%;\n\t}\n\n\t.filter-group li {\n\t\tmargin: 10px 0;\n\t}\n}\n\n@media only screen and (max-width: 1000px) {\n\t.filter-items {\n\t\tfloat: none;\n\t}\n\n\t.wp-filter .media-toolbar-primary,\n\t.wp-filter .media-toolbar-secondary,\n\t.wp-filter .search-form {\n\t\tfloat: none; /* Remove float from media-views.css */\n\t\tposition: relative;\n\t\tmax-width: 100%;\n\t}\n}\n\n@media only screen and (max-width: 782px) {\n\t.filter-group li {\n\t\tpadding: 0;\n\t\twidth: 50%;\n\t}\n}\n\n@media only screen and (max-width: 320px) {\n\t.filter-count {\n\t\tdisplay: none;\n\t}\n\n\t.wp-filter .drawer-toggle {\n\t\tmargin: 10px 0;\n\t}\n\n\t.filter-group li,\n\t.wp-filter .search-form input[type=\"search\"] {\n\t\twidth: 100%;\n\t}\n}\n\n/*------------------------------------------------------------------------------\n  4.0 - Notifications\n------------------------------------------------------------------------------*/\n\n.notice,\ndiv.updated,\ndiv.error {\n\tbackground: #fff;\n\tborder-left: 4px solid #fff;\n\t-webkit-box-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: 0 1px 1px 0 rgba( 0, 0, 0, 0.1 );\n\tmargin: 5px 15px 2px;\n\tpadding: 1px 12px;\n}\n\n.notice p,\n.notice-title,\ndiv.updated p,\ndiv.error p,\n.form-table td .notice p {\n\tmargin: 0.5em 0;\n\tpadding: 2px;\n}\n\n.error a {\n\ttext-decoration: underline;\n}\n\n.updated a {\n\tpadding-bottom: 2px;\n\ttext-decoration: none;\n}\n\n.notice-alt {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.notice-large {\n\tpadding: 10px 20px;\n}\n\n.notice-title {\n\tdisplay: inline-block;\n\tcolor: #23282d;\n\tfont-size: 18px;\n}\n\n.wp-core-ui .notice.is-dismissible {\n\tpadding-right: 38px;\n\tposition: relative;\n}\n\n.notice-dismiss {\n\tposition: absolute;\n\ttop: 0;\n\tright: 1px;\n\tborder: none;\n\tmargin: 0;\n\tpadding: 9px;\n\tbackground: none;\n\tcolor: #b4b9be;\n\tcursor: pointer;\n}\n\n.notice-dismiss:hover:before,\n.notice-dismiss:active:before,\n.notice-dismiss:focus:before {\n\tcolor: #c00;\n}\n\n.notice-dismiss:focus {\n\toutline: none;\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 .notice-dismiss:focus {\n\toutline: 1px solid #5b9dd9;\n}\n\n.notice-success,\ndiv.updated {\n\tborder-left-color: #46b450;\n}\n\n.notice-success.notice-alt {\n\tbackground-color: #ecf7ed;\n}\n\n.notice-warning {\n\tborder-left-color: #ffb900;\n}\n\n.notice-warning.notice-alt {\n\tbackground-color: #fff8e5;\n}\n\n.notice-error,\ndiv.error {\n\tborder-left-color: #dc3232;\n}\n\n.notice-error.notice-alt {\n\tbackground-color: #fbeaea;\n}\n\n.notice-info {\n\tborder-left-color: #00a0d2;\n}\n\n.notice-info.notice-alt {\n\tbackground-color: #e5f5fa;\n}\n\n.wrap .notice,\n.wrap div.updated,\n.wrap div.error,\n.media-upload-form .notice,\n.media-upload-form div.error {\n\tmargin: 5px 0 15px;\n}\n\n#update-nag,\n.update-nag {\n\tdisplay: inline-block;\n\tline-height: 19px;\n\tpadding: 11px 15px;\n\tfont-size: 14px;\n\ttext-align: left;\n\tmargin: 25px 20px 0 2px;\n\tbackground-color: #fff;\n\tborder-left: 4px solid #ffba00;\n\t-webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n}\n\n.update-message {\n\tcolor: #000;\n}\n\nul#dismissed-updates {\n\tdisplay: none;\n}\n\nform.upgrade {\n\tmargin-top: 8px;\n}\n\nform.upgrade .hint {\n\tfont-style: italic;\n\tfont-size: 85%;\n\tmargin: -0.5em 0 2em 0;\n}\n\n.update-php .spinner {\n\tfloat: none;\n\tmargin: -4px 0;\n}\n\n#ajax-loading,\n.ajax-loading,\n.ajax-feedback,\n.imgedit-wait-spin,\n.list-ajax-loading { /* deprecated */\n\tvisibility: hidden;\n}\n\n#ajax-response.alignleft {\n\tmargin-left: 2em;\n}\n\n/* @todo: this does not need its own section anymore */\n/*------------------------------------------------------------------------------\n  6.0 - Admin Header\n------------------------------------------------------------------------------*/\n#adminmenu a,\n#taglist a,\n#catlist a {\n\ttext-decoration: none;\n}\n\n/*------------------------------------------------------------------------------\n  6.1 - Screen Options Tabs\n------------------------------------------------------------------------------*/\n\n#screen-options-wrap,\n#contextual-help-wrap {\n\tmargin: 0;\n\tpadding: 8px 20px 12px;\n\tposition: relative;\n}\n\n#contextual-help-wrap {\n\toverflow: auto;\n\tmargin-left: 0 !important;\n}\n\n#screen-meta .screen-reader-text {\n\tvisibility: hidden;\n}\n\n#screen-meta-links {\n\tmargin: 0 20px 0 0;\n}\n\n/* screen options and help tabs revert */\n#screen-meta {\n\tdisplay: none;\n\tmargin: 0 20px -1px 0px;\n\tposition: relative;\n\tbackground-color: #fff;\n\tborder: 1px solid #ddd;\n\tborder-top: none;\n\t-webkit-box-shadow: 0 1px 0 rgba(0,0,0,.025);\n\tbox-shadow: 0 1px 0 rgba(0,0,0,.025);\n}\n\n#screen-options-link-wrap,\n#contextual-help-link-wrap {\n\tfloat: right;\n\theight: 28px;\n\tmargin: 0 0 0 6px;\n\tborder: 1px solid #ddd;\n\tborder-top: none;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);\n}\n\n#screen-meta-links .screen-meta-toggle {\n\tposition: relative;\n\ttop: 0;\n}\n\n#screen-meta-links .show-settings {\n\tborder: 0;\n\tbackground: none;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tcolor: #777;\n\tline-height: 1.7;\n\tpadding: 3px 6px 3px 16px;\n}\n\n#screen-meta-links .show-settings:hover,\n#screen-meta-links .show-settings:active,\n#screen-meta-links .show-settings:focus {\n\tcolor: #32373c;\n}\n\n#screen-meta-links .show-settings:active {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\t-webkit-transform: none;\n\t-ms-transform: none;\n\ttransform: none;\n}\n\n#screen-meta-links .show-settings:after {\n\tright: 0;\n\tcontent: \"\\f140\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0 5px 0 0;\n\tbottom: 2px;\n\tposition: relative;\n\tvertical-align: bottom;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #b4b9be;\n}\n\n#screen-meta-links .screen-meta-active:after {\n\tcontent: \"\\f142\";\n}\n\n/* end screen options and help tabs */\n\n.toggle-arrow {\n\tbackground-repeat: no-repeat;\n\tbackground-position: top left;\n\tbackground-color: transparent;\n\theight: 22px;\n\tline-height: 22px;\n\tdisplay: block;\n}\n\n.toggle-arrow-active {\n\tbackground-position: bottom left;\n}\n\n#screen-options-wrap h5, /* Back-compat for old plugins */\n#screen-options-wrap legend,\n#contextual-help-wrap h5 {\n\tmargin: 0;\n\tpadding: 8px 0;\n \tfont-size: 13px;\n\tfont-weight: 600;\n}\n\n.ie8 #screen-options-wrap legend {\n\tcolor: inherit;\n}\n\n.metabox-prefs label {\n\tdisplay: inline-block;\n\tpadding-right: 15px;\n\tline-height: 30px;\n}\n\n#number-of-columns {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tline-height: 30px;\n}\n\n.metabox-prefs input[type=checkbox] {\n\tmargin-top: 0;\n\tmargin-right: 6px;\n}\n\n.metabox-prefs label input,\n.metabox-prefs label input[type=checkbox] {\n\tmargin: -4px 5px 0 0;\n}\n\n.metabox-prefs .columns-prefs label input {\n\tmargin: -1px 2px 0 0;\n}\n\n.metabox-prefs label a {\n\tdisplay: none;\n}\n\n.metabox-prefs .screen-options input,\n.metabox-prefs .screen-options label {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\tvertical-align: middle;\n}\n\n.metabox-prefs .screen-options .screen-per-page {\n\tmargin-right: 15px;\n}\n\n.metabox-prefs .screen-options label {\n\tline-height: 28px;\n\tpadding-right: 0;\n}\n\n.screen-options + .screen-options {\n    margin-top: 10px;\n}\n\n.metabox-prefs .submit {\n\tmargin-top: 1em;\n\tpadding: 0;\n}\n\n/*------------------------------------------------------------------------------\n  6.2 - Help Menu\n------------------------------------------------------------------------------*/\n\n#contextual-help-wrap {\n\tpadding: 0;\n}\n\n#contextual-help-columns {\n\tposition: relative;\n}\n\n#contextual-help-back {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 150px;\n\tright: 170px;\n\tborder: 1px solid #e1e1e1;\n\tborder-top: none;\n\tborder-bottom: none;\n\tbackground: #f6fbfd;\n}\n\n#contextual-help-wrap.no-sidebar #contextual-help-back {\n\tright: 0;\n\tborder-right-width: 0;\n\t-webkit-border-bottom-right-radius: 2px;\n\tborder-bottom-right-radius: 2px;\n}\n\n.contextual-help-tabs {\n\tfloat: left;\n\twidth: 150px;\n\tmargin: 0;\n}\n\n.contextual-help-tabs ul {\n\tmargin: 1em 0;\n}\n\n.contextual-help-tabs li {\n\tmargin-bottom: 0;\n\tlist-style-type: none;\n\tborder-style: solid;\n\tborder-width: 0 0 0 2px;\n\tborder-color: transparent;\n}\n\n.contextual-help-tabs a {\n\tdisplay: block;\n\tpadding: 5px 5px 5px 12px;\n\tline-height: 18px;\n\ttext-decoration: none;\n\tborder: 1px solid transparent;\n\tborder-right: none;\n\tborder-left: none;\n}\n\n.contextual-help-tabs a:hover {\n\tcolor: #32373c;\n}\n\n.contextual-help-tabs .active {\n\tpadding: 0;\n\tmargin: 0 -1px 0 0;\n\tborder-left: 2px solid #00a0d2;\n\tbackground: #f6fbfd;\n\t-webkit-box-shadow: 0 2px 0 rgba(0,0,0,0.02), 0 1px 0 rgba(0,0,0,0.02);\n\tbox-shadow: 0 2px 0 rgba(0,0,0,0.02), 0 1px 0 rgba(0,0,0,0.02);\n}\n\n.contextual-help-tabs .active a {\n\tborder-color: #e1e1e1;\n\tcolor: #32373c;\n}\n\n.contextual-help-tabs-wrap {\n\tpadding: 0 20px;\n\toverflow: auto;\n}\n\n.help-tab-content {\n\tdisplay: none;\n\tmargin: 0 22px 12px 0;\n\tline-height: 1.6em;\n}\n\n.help-tab-content.active {\n\tdisplay: block;\n}\n\n.help-tab-content ul li {\n\tlist-style-type: disc;\n\tmargin-left: 18px;\n}\n\n.contextual-help-sidebar {\n\twidth: 150px;\n\tfloat: right;\n\tpadding: 0 8px 0 12px;\n\toverflow: auto;\n}\n\n/*------------------------------------------------------------------------------\n  8.0 - Layout Blocks\n------------------------------------------------------------------------------*/\n\nhtml.wp-toolbar {\n\tpadding-top: 32px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.widefat th,\n.widefat td {\n\tcolor: #555;\n}\n\n.widefat th,\n.widefat thead td,\n.widefat tfoot td {\n\tfont-weight: normal;\n}\n\n.widefat thead tr th,\n.widefat thead tr td,\n.widefat tfoot tr th,\n.widefat tfoot tr td {\n\tcolor: #32373c;\n}\n\n.widefat td p {\n\tmargin: 2px 0 0.8em;\n}\n\n.widefat p,\n.widefat ol,\n.widefat ul {\n\tcolor: #32373c;\n}\n\n.widefat .column-comment p {\n\tmargin: 0.6em 0;\n}\n\n/* Screens with postboxes */\n.postbox-container {\n\tfloat: left;\n}\n\n.postbox-container .meta-box-sortables {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#wpbody-content .metabox-holder {\n\tpadding-top: 10px;\n}\n\n.metabox-holder .postbox-container .empty-container {\n\tborder: 3px dashed #b4b9be;\n\theight: 250px;\n}\n\n.metabox-holder.columns-1 .postbox-container .empty-container,\n.columns-2 #postbox-container-3 .empty-container,\n.columns-2 #postbox-container-4 .empty-container,\n.columns-3 #postbox-container-4 .empty-container {\n\tborder: 0 none;\n\theight: 0;\n\tmin-height: 0;\n}\n\n#post-body-content {\n\twidth: 100%;\n\tmin-width: 463px;\n\tfloat: left;\n}\n\n#post-body.columns-2 #postbox-container-1 {\n\tfloat: right;\n\tmargin-right: -300px;\n\twidth: 280px;\n}\n\n#post-body.columns-2 #side-sortables {\n\tmin-height: 250px;\n}\n\n/* one column on the dash */\n@media only screen and (max-width: 799px) {\n\t#wpbody-content .metabox-holder .postbox-container .empty-container {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n}\n\n.js .widget .widget-top,\n.js .postbox .hndle {\n\tcursor: move;\n}\n\n.hndle a {\n\tfont-size: 11px;\n\tfont-weight: normal;\n}\n\n.postbox .handlediv {\n\tdisplay: none;\n\tfloat: right;\n\twidth: 36px;\n\theight: 36px;\n\tpadding: 0;\n}\n\n.js .postbox .handlediv {\n\tdisplay: block;\n}\n\n.sortable-placeholder {\n\tborder: 1px dashed #b4b9be;\n\tmargin-bottom: 20px;\n}\n\n.postbox,\n.stuffbox {\n\tmargin-bottom: 20px;\n\tpadding: 0;\n\tline-height: 1;\n}\n\n/* user-select is not a part of the CSS standard - may change behavior in the future */\n.postbox .hndle,\n.stuffbox .hndle {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.postbox .inside,\n.stuffbox .inside {\n\tpadding: 0 12px 12px;\n\tline-height: 1.4em;\n\tfont-size: 13px;\n}\n\n.postbox .inside {\n\tmargin: 11px 0;\n\tposition: relative;\n}\n\n.postbox .inside > p:last-child,\n.rss-widget ul li:last-child {\n\tmargin-bottom: 1px !important;\n}\n\n.postbox.closed h3 {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.postbox table.form-table {\n\tmargin-bottom: 0;\n}\n\n.postbox table.widefat {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.temp-border {\n\tborder: 1px dotted #ccc;\n}\n\n.columns-prefs label {\n\tpadding: 0 10px 0 0;\n}\n\n/* @todo: what is this doing here */\n#dashboard_right_now .versions .b,\n#post-status-display,\n#post-visibility-display,\n#adminmenu .wp-submenu li.current,\n#adminmenu .wp-submenu li.current a,\n#adminmenu .wp-submenu li.current a:hover,\n.media-item .percent,\n.plugins .name,\n#pass-strength-result.strong,\n#pass-strength-result.short,\n#ed_reply_toolbar #ed_reply_strong,\n.item-controls .item-order a,\n.feature-filter .feature-name {\n\tfont-weight: 600;\n}\n\n/*------------------------------------------------------------------------------\n  21.0 - Admin Footer\n------------------------------------------------------------------------------*/\n\n#wpfooter {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tpadding: 10px 20px;\n\tcolor: #777;\n}\n\n#wpfooter p {\n\tfont-size: 13px;\n\tmargin: 0;\n\tline-height: 20px;\n}\n\n#footer-thankyou {\n\tfont-style: italic;\n}\n\n#wpfooter a {\n\ttext-decoration: none;\n}\n\n#wpfooter a:hover {\n\ttext-decoration: underline;\n}\n\n/*------------------------------------------------------------------------------\n  25.0 - Tabbed Admin Screen Interface (Experimental)\n------------------------------------------------------------------------------*/\n\n.nav-tab {\n\tfloat: left;\n\tborder: 1px solid #ccc;\n\tborder-bottom: none;\n\tmargin-left: 0.5em; /* half the font size so set the font size properly */\n\tpadding: 5px 10px;\n\tfont-size: 14px;\n\tline-height: 24px;\n\tfont-weight: 600;\n\tbackground: #e4e4e4;\n\tcolor: #555;\n\ttext-decoration: none;\n\twhite-space: nowrap;\n}\n\nh3 .nav-tab, /* Back-compat for pre-4.4 */\n.nav-tab-small .nav-tab {\n\tpadding: 5px 14px;\n\tfont-size: 12px;\n\tline-height: 16px;\n}\n\n.nav-tab:hover,\n.nav-tab:focus {\n\tbackground-color: #fff;\n\tcolor: #464646;\n}\n\n.nav-tab-active,\n.nav-tab:focus:active {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.nav-tab-active {\n\tmargin-bottom: -1px;\n\tcolor: #464646;\n}\n\n.nav-tab-active,\n.nav-tab-active:hover,\n.nav-tab-active:focus,\n.nav-tab-active:focus:active {\n\tborder-bottom: 1px solid #f1f1f1;\n\tbackground: #f1f1f1;\n\tcolor: #000;\n}\n\nh1.nav-tab-wrapper, /* Back-compat for pre-4.4 */\n.wrap h2.nav-tab-wrapper, /* higher specificity to override .wrap > h2:first-child */\nh3.nav-tab-wrapper {\n\tborder-bottom: 1px solid #ccc;\n\tmargin: 0;\n\tpadding: 9px 15px 0 0;\n\tline-height: inherit;\n}\n\n/* contain floats */\n.nav-tab-wrapper:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tclear: both;\n}\n\n/*------------------------------------------------------------------------------\n  26.0 - Misc\n------------------------------------------------------------------------------*/\n\n.spinner {\n\tbackground: url(../images/spinner.gif) no-repeat;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\tdisplay: inline-block;\n\tvisibility: hidden;\n\tfloat: right;\n\tvertical-align: middle;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 4px 10px 0;\n}\n\n.spinner.is-active {\n\tvisibility: visible;\n}\n\n#template div {\n\tmargin-right: 190px;\n}\n\n.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */\n.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */\n.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */\n.metabox-holder h2.hndle {\n\tfont-size: 14px;\n\tpadding: 8px 12px;\n\tmargin: 0;\n\tline-height: 1.4;\n}\n\n/* Back-compat for nav-menus screen */\n.nav-menus-php .metabox-holder h3 {\n\tpadding: 10px 10px 11px 14px;\n\tline-height: 21px;\n}\n\n#templateside ul li a {\n\ttext-decoration: none;\n}\n\n.plugin-install #description,\n.plugin-install-network #description {\n\twidth: 60%;\n}\n\ntable .vers,\ntable .column-visible,\ntable .column-rating {\n\ttext-align: left;\n}\n\n.attention,\n.error-message {\n\tcolor: red;\n\tfont-weight: 600;\n}\n\n/* Scrollbar fix for bulk upgrade iframe */\nbody.iframe {\n\theight: 98%;\n}\n\n/* Upgrader styles, Specific to Language Packs */\n.lp-show-latest p {\n\tdisplay: none;\n}\n.lp-show-latest p:last-child,\n.lp-show-latest .lp-error p {\n\tdisplay: block;\n}\n\n/* - Only used once or twice in all of WP - deprecate for global style\n------------------------------------------------------------------------------*/\n.media-icon {\n\twidth: 62px; /* icon + border */\n\ttext-align: center;\n}\n\n.media-icon img {\n\tborder: 1px solid #e7e7e7;\n\tborder: 1px solid rgba(0, 0, 0, 0.07);\n}\n\n#howto {\n\tfont-size: 11px;\n\tmargin: 0 5px;\n\tdisplay: block;\n}\n\n.importers td {\n\tpadding-right: 14px;\n}\n\n.importers {\n\tfont-size: 16px;\n\twidth: auto;\n}\n\n#post-body #post-body-content #namediv h3, /* Back-compat for pre-4.4 */\n#post-body #post-body-content #namediv h2 {\n\tmargin-top: 0;\n}\n\n.edit-comment-author {\n\tfont-size: 14px;\n\tline-height: 1.4;\n\tfont-weight: 600;\n\tcolor: #222;\n\tmargin: 2px 0 0 9px;\n}\n\n#namediv h3 label, /* Back-compat for pre-4.4 */\n#namediv h2 label {\n\tvertical-align: baseline;\n}\n\n#namediv table {\n\twidth: 100%;\n}\n\n#namediv td.first {\n\twidth: 10px;\n\twhite-space: nowrap;\n}\n\n#namediv input {\n\twidth: 98%;\n}\n\n#namediv p {\n\tmargin: 10px 0;\n}\n\n#submitdiv h3 {\n\tmargin-bottom: 0 !important;\n}\n\n/* - Used - but could/should be deprecated with a CSS reset\n------------------------------------------------------------------------------*/\n.zerosize {\n\theight: 0;\n\twidth: 0;\n\tmargin: 0;\n\tborder: 0;\n\tpadding: 0;\n\toverflow: hidden;\n\tposition: absolute;\n}\n\nbr.clear {\n\theight: 2px;\n\tline-height: 2px;\n}\n\n.checkbox {\n\tborder: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nfieldset {\n\tborder: 0;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.post-categories {\n\tdisplay: inline;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.post-categories li {\n\tdisplay: inline;\n}\n\n/* Star Ratings - Back-compat for pre-3.8 */\ndiv.star-holder {\n\tposition: relative;\n\theight: 17px;\n\twidth: 100px;\n\tbackground: url(../images/stars.png?ver=20121108) repeat-x bottom left;\n}\n\ndiv.star-holder .star-rating {\n\tbackground: url(../images/stars.png?ver=20121108) repeat-x top left;\n\theight: 17px;\n\tfloat: left;\n}\n\n/* Star Ratings */\n.star-rating {\n\twhite-space: nowrap;\n}\n.star-rating .star {\n\tdisplay: inline-block;\n\twidth: 20px;\n\theight: 20px;\n\t-webkit-font-smoothing: antialiased;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tvertical-align: top;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\ttext-align: center;\n\tcolor: #ffb900;\n}\n\n.star-rating .star-full:before {\n\tcontent: \"\\f155\";\n}\n\n.star-rating .star-half:before {\n\tcontent: \"\\f459\";\n}\n\n.rtl .star-rating .star-half {\n\t-webkit-transform: rotateY(180deg);\n\t-ms-transform: rotateY(180deg);\n\ttransform: rotateY(180deg);\n}\n\n.star-rating .star-empty:before {\n\tcontent: \"\\f154\";\n}\n\ndiv.action-links {\n\tfont-weight: normal;\n\tmargin: 6px 0 0;\n}\n\n/* Plugin install thickbox */\n#plugin-information {\n\tbackground: #fff;\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\theight: 100%;\n\tpadding: 0;\n}\n\n#plugin-information-scrollable {\n\toverflow: auto;\n\t-webkit-overflow-scrolling: touch;\n\theight: 100%;\n}\n\n#plugin-information-title {\n\tpadding: 0 20px;\n\tbackground: #f5f5f5;\n\tfont-size: 22px;\n\tfont-weight: 600;\n\tline-height: 56px;\n\tposition: relative;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\theight: 56px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n#plugin-information-title.with-banner {\n\tmargin-right: 0;\n\theight: 250px;\n\tbottom: 250px;\n\t-webkit-background-size: cover;\n\tbackground-size: cover;\n}\n\n#plugin-information-title h2 {\n\tfont-size: 1em;\n\tfont-weight: bold;\n\tpadding: 0;\n\tmargin: 0;\n\tmax-width: 680px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n#plugin-information-title.with-banner h2 {\n\tfont-family: \"Helvetica Neue\", sans-serif;\n\tdisplay: inline-block;\n\tfont-size: 30px;\n\tline-height: 50px;\n\tpadding: 0 15px;\n\tmargin: 174px 0 0 10px;\n\tcolor: #fff;\n\tbackground: rgba( 30, 30, 30, 0.9 );\n\ttext-shadow: 0 1px 3px rgba( 0, 0, 0, 0.4 );\n\t-webkit-box-shadow: 0 0 30px rgba( 255, 255, 255, 0.1 );\n\tbox-shadow: 0 0 30px rgba( 255, 255, 255, 0.1 );\n\t-webkit-border-radius: 8px;\n\tborder-radius: 8px;\n}\n\n#plugin-information-title div.vignette {\n\tdisplay: none;\n}\n\n#plugin-information-title.with-banner div.vignette {\n\tdisplay: block;\n\tfloat: right;\n\ttop: 0;\n\theight: 250px;\n\twidth: 772px;\n\tmargin: 0 -20px;\n\tbackground: transparent;\n\t-webkit-box-shadow: inset 0 0 50px 4px rgba( 0, 0, 0, 0.2 ), inset 0 -1px 0 rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 0 50px 4px rgba( 0, 0, 0, 0.2 ), inset 0 -1px 0 rgba( 0, 0, 0, 0.1 );\n}\n\n#plugin-information-tabs {\n\tpadding: 0 16px;\n\tposition: relative;\n\tright: 0;\n\tleft: 0;\n\theight: 36px;\n\tz-index: 1;\n\tborder-bottom: 1px solid #ddd;\n\tbackground: #f3f3f3;\n}\n\n#plugin-information-tabs a {\n\tposition: relative;\n\tfloat: left;\n\tpadding: 9px 10px;\n\tmargin: 0;\n\theight: 18px;\n\tline-height: 18px;\n\tfont-size: 14px;\n\ttext-decoration: none;\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n#plugin-information-tabs a.current {\n\tmargin: 0 -1px 0;\n\tbackground: #fff;\n\tborder: 1px solid #ddd;\n\tborder-bottom-color: #fff;\n\tpadding-top: 8px;\n\tcolor: #32373c;\n}\n\n#plugin-information-tabs.with-banner a.current {\n\tborder-top: none;\n\tpadding-top: 9px;\n}\n\n#plugin-information-tabs a:active,\n#plugin-information-tabs a:focus {\n\toutline: none;\n}\n\n#plugin-information-content {\n\toverflow: hidden; /* equal height column trick */\n\tbackground: #fff;\n\tposition: relative;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tmin-height: 100%;\n\t/* Height of title + tabs + install now */\n\tmin-height: -webkit-calc( 100% - 152px );\n\tmin-height: calc( 100% - 152px );\n}\n\n#plugin-information-content.with-banner {\n\t/* Height of banner + tabs + install now */\n\tmin-height: -webkit-calc( 100% - 346px );\n\tmin-height: calc( 100% - 346px );\n}\n\n#section-holder {\n\tposition: relative;\n\ttop: 0;\n\tright: 250px;\n\tbottom: 0;\n\tleft: 0;\n\tmargin-right: 250px; /* FYI box */\n\tpadding: 10px 26px;\n\tmargin-bottom: -99939px; /* 60px less than the padding below to accommodate footer */\n\tpadding-bottom: 99999px; /* equal height column trick */\n}\n\n#section-holder .updated {\n\tmargin: 16px 0;\n}\n\n#plugin-information .fyi {\n\tfloat: right;\n\tposition: relative;\n\ttop: 0;\n\tright: 0;\n\tpadding: 16px;\n\tmargin-bottom: -99939px; /* 60px less than the padding below to accommodate footer */\n\tpadding-bottom: 99999px; /* equal height column trick */\n\twidth: 217px;\n\tborder-left: 1px solid #ddd;\n\tbackground: #f3f3f3;\n\tcolor: #666;\n}\n\n#plugin-information .fyi strong {\n\tcolor: #464646;\n}\n\n#plugin-information .fyi h3 {\n\tfont-weight: bold;\n\ttext-transform: uppercase;\n\tfont-size: 12px;\n\tcolor: #666;\n\tmargin: 24px 0 8px;\n}\n\n#plugin-information .fyi h2 {\n\tfont-size: 0.9em;\n\tmargin-bottom: 0;\n\tmargin-right: 0;\n}\n\n#plugin-information .fyi ul {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n}\n\n#plugin-information .fyi li {\n\tmargin: 0 0 10px;\n}\n\n#plugin-information .counter-container {\n\tmargin: 3px 0;\n}\n\n#plugin-information .counter-label {\n\tfloat: left;\n\tmargin-right: 5px;\n\tmin-width: 55px;\n}\n\n#plugin-information .counter-back {\n\theight: 17px;\n\twidth: 92px;\n\tbackground-color: #ececec;\n\tfloat: left;\n}\n\n#plugin-information .counter-bar {\n\theight: 17px;\n\tbackground-color: #ffc733; /* slightly lighter than stars due to larger expanse */\n\tfloat: left;\n}\n\n#plugin-information .counter-count {\n\tmargin-left: 5px;\n}\n\n#plugin-information .fyi ul.contributors {\n\tmargin-top: 10px;\n}\n\n#plugin-information .fyi ul.contributors li {\n\tdisplay: inline-block;\n\tmargin-right: 8px;\n\tvertical-align: middle;\n}\n\n#plugin-information .fyi ul.contributors li {\n\tdisplay: inline-block;\n\tmargin-right: 8px;\n\tvertical-align: middle;\n}\n\n#plugin-information .fyi ul.contributors li img {\n\tvertical-align: middle;\n\tmargin-right: 4px;\n}\n\n#plugin-information-footer {\n\tpadding: 13px 16px;\n\tposition: absolute;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\theight: 33px; /* 33+13+13+1=60 */\n\tborder-top: 1px solid #ddd;\n\tbackground: #f3f3f3;\n}\n\n/* rtl:ignore */\n#plugin-information .section {\n\tdirection: ltr;\n}\n\n/* rtl:ignore */\n#plugin-information .section ul,\n#plugin-information .section ol {\n\tlist-style-type: disc;\n\tmargin-left: 24px;\n}\n\n#plugin-information .section,\n#plugin-information .section p {\n\tfont-size: 14px;\n\tline-height: 1.7;\n}\n\n#plugin-information #section-screenshots ol {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n#plugin-information #section-screenshots li img {\n\tvertical-align: text-top;\n\tmargin-top: 16px;\n\tmax-width: 100%;\n\twidth: auto;\n\theight: auto;\n\t-webkit-box-shadow: 0 1px 2px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 1px 2px rgba( 0, 0, 0, 0.3 );\n}\n\n/* rtl:ignore */\n#plugin-information #section-screenshots li p {\n\tfont-style: italic;\n\tpadding-left: 20px;\n}\n\n#plugin-information pre {\n\tpadding: 7px;\n\toverflow: auto;\n\tborder: 1px solid #ccc;\n}\n\n/* rtl:ignore */\n#plugin-information .review {\n\toverflow: hidden; /* clearfix */\n\twidth: 100%;\n\tmargin-bottom: 20px;\n\tborder-bottom: 1px solid #e6e6e6;\n}\n\n#plugin-information .review-title-section {\n\toverflow: hidden; /* clearfix */\n}\n\n/* rtl:ignore */\n#plugin-information .review-title-section h4 {\n\tdisplay: inline-block;\n\tfloat: left;\n\tmargin: 0 6px 0 0;\n}\n\n#plugin-information .reviewer-info p {\n\tclear: both;\n\tmargin: 0;\n\tpadding-top: 2px;\n}\n\n/* rtl:ignore */\n#plugin-information .reviewer-info .avatar {\n\tfloat: left;\n\tmargin: 4px 6px 0 0;\n}\n\n/* rtl:ignore */\n#plugin-information .reviewer-info .star-rating {\n\tfloat: left;\n}\n\n/* rtl:ignore */\n#plugin-information .review-meta {\n\tfloat: left;\n\tmargin-left: 0.75em;\n}\n\n/* rtl:ignore */\n#plugin-information .review-body {\n\tfloat: left;\n\twidth: 100%;\n}\n\n.plugin-version-author-uri {\n\tfont-size: 13px;\n}\n\n@media screen and ( max-width: 771px ) {\n\t#plugin-information-title.with-banner {\n\t\theight: 100px;\n\t\tbottom: 100px;\n\t}\n\n\t#plugin-information-title.with-banner h2 {\n\t\tmargin-top: 30px;\n\t\tfont-size: 20px;\n\t\tline-height: 40px;\n\t\tmax-width: 85%;\n\t}\n\n\t#plugin-information-title.with-banner div.vignette {\n\t\theight: 100px;\n\t\tbottom: 100px;\n\t\twidth: 800%;\n\t}\n\n\t#plugin-information-tabs {\n\t\toverflow: hidden; /* clearfix */\n\t\tpadding: 0;\n\t\theight: auto; /* let tabs wrap */\n\t}\n\n\t#plugin-information-tabs a.current {\n\t\tmargin-bottom: 0;\n\t\tborder-bottom: none;\n\t}\n\n\t#plugin-information .fyi {\n\t\tfloat: none;\n\t\tborder: 1px solid #ddd;\n\t\tposition: static;\n\t\twidth: auto;\n\t\tmargin: 26px 26px 0;\n\t\tpadding-bottom: 0; /* reset from the two column height fix */\n\t}\n\n\t#section-holder {\n\t\tposition: static;\n\t\tmargin: 0;\n\t\tpadding-bottom: 70px; /* reset from the two column height fix, plus accomodate footer */\n\t}\n\n\t#plugin-information .fyi h3,\n\t#plugin-information .fyi small {\n\t\tdisplay: none;\n\t}\n\n\t#plugin-information-footer {\n\t\tpadding: 12px 16px 0;\n\t\theight: 46px;\n\t}\n}\n\n/* Thickbox for Plugin Install screen */\nbody.about-php #TB_window,\nbody.plugin-install-php #TB_window,\nbody.import-php #TB_window,\nbody.plugins-php #TB_window,\nbody.update-core-php #TB_window,\nbody.index-php #TB_window {\n\tbackground: #fcfcfc;\n}\n\n/* IE 8 needs a change in the pseudo element content */\n.ie8 body.about-php #TB_window:before,\n.ie8 body.plugin-install-php #TB_window:before,\n.ie8 body.import-php #TB_window:before,\n.ie8 body.plugins-php #TB_window:before,\n.ie8 body.update-core-php #TB_window:before,\n.ie8 body.index-php #TB_window:before {\n\tcontent: \" \";\n\tbackground: none;\n}\n\nbody.about-php #TB_window.thickbox-loading:before,\nbody.plugin-install-php #TB_window.thickbox-loading:before,\nbody.import-php #TB_window.thickbox-loading:before,\nbody.plugins-php #TB_window.thickbox-loading:before,\nbody.update-core-php #TB_window.thickbox-loading:before,\nbody.index-php #TB_window.thickbox-loading:before {\n\tcontent: \"\";\n\tdisplay: block;\n\twidth: 20px;\n\theight: 20px;\n\tposition: absolute;\n\tleft: 50%;\n\ttop: 50%;\n\tz-index: -1;\n\tmargin: -10px 0 0 -10px;\n\tbackground: #fcfcfc url(../images/spinner.gif) no-repeat center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\t-webkit-transform: translateZ(0);\n\ttransform: translateZ(0);\n}\n\n@media print,\n\t(-webkit-min-device-pixel-ratio: 1.25),\n\t(min-resolution: 120dpi) {\n\n\tbody.about-php #TB_window.thickbox-loading:before,\n\tbody.plugin-install-php #TB_window.thickbox-loading:before,\n\tbody.import-php #TB_window.thickbox-loading:before,\n\tbody.plugins-php #TB_window.thickbox-loading:before,\n\tbody.update-core-php #TB_window.thickbox-loading:before,\n\tbody.index-php #TB_window.thickbox-loading:before {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\nbody.about-php #TB_title,\nbody.plugin-install-php #TB_title,\nbody.import-php #TB_title,\nbody.plugins-php #TB_title,\nbody.update-core-php #TB_title,\nbody.index-php #TB_title {\n\tfloat: left;\n\theight: 1px;\n}\n\nbody.about-php #TB_ajaxWindowTitle,\nbody.plugin-install-php #TB_ajaxWindowTitle,\nbody.import-php #TB_ajaxWindowTitle,\nbody.plugins-php #TB_ajaxWindowTitle,\nbody.update-core-php #TB_ajaxWindowTitle,\nbody.index-php #TB_ajaxWindowTitle {\n\tdisplay: none;\n}\n\nbody.about-php .tb-close-icon,\nbody.plugin-install-php .tb-close-icon,\nbody.import-php .tb-close-icon,\nbody.plugins-php .tb-close-icon,\nbody.update-core-php .tb-close-icon,\nbody.index-php .tb-close-icon {\n\tleft: auto;\n\tright: -30px;\n\tcolor: #eee;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\nbody.about-php #TB_closeWindowButton:focus,\nbody.about-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.about-php .tb-close-icon:focus,\nbody.about-php .tb-close-icon:hover,\nbody.plugin-install-php #TB_closeWindowButton:focus,\nbody.plugin-install-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.plugin-install-php .tb-close-icon:focus,\nbody.plugin-install-php .tb-close-icon:hover,\nbody.import-php #TB_closeWindowButton:focus,\nbody.import-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.import-php .tb-close-icon:focus,\nbody.import-php .tb-close-icon:hover,\nbody.plugins-php #TB_closeWindowButton:focus,\nbody.plugins-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.plugins-php .tb-close-icon:focus,\nbody.plugins-php .tb-close-icon:hover,\nbody.update-core-php #TB_closeWindowButton:focus,\nbody.update-core-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.update-core-php .tb-close-icon:focus,\nbody.update-core-php .tb-close-icon:hover,\nbody.index-php #TB_closeWindowButton:focus,\nbody.index-php #TB_closeWindowButton:focus .tb-close-icon,\nbody.index-php .tb-close-icon:focus,\nbody.index-php .tb-close-icon:hover {\n\tcolor: #00a0d2;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\nbody.about-php .tb-close-icon:before,\nbody.plugin-install-php .tb-close-icon:before,\nbody.import-php .tb-close-icon:before,\nbody.plugins-php .tb-close-icon:before,\nbody.update-core-php .tb-close-icon:before,\nbody.index-php .tb-close-icon:before {\n\tcontent: \"\\f335\";\n\tfont-size: 32px;\n}\n\n/* move plugin install close icon to top on narrow screens */\n@media screen and ( max-width: 830px ) {\n\tbody.about-php .tb-close-icon,\n\tbody.plugin-install-php .tb-close-icon,\n\tbody.import-php .tb-close-icon,\n\tbody.plugins-php .tb-close-icon,\n\tbody.update-core-php .tb-close-icon,\n\tbody.index-php .tb-close-icon {\n\t\tright: 0;\n\t\ttop: -30px;\n\t}\n}\n\n/* @todo: move this. */\nimg {\n\tborder: none;\n}\n\n/* Header */\n/* @todo: are these also specific to Press This? */\n#wphead {\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n#wphead h1 a {\n\tcolor: #464646;\n}\n\n/* Metabox collapse arrow indicators */\n.js .sidebar-name .sidebar-name-arrow:before,\n.js .meta-box-sortables .postbox .toggle-indicator:before {\n\tcontent: \"\\f142\";\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n}\n\n.js .widgets-holder-wrap.closed .sidebar-name-arrow:before,\n.js .meta-box-sortables .postbox.closed .handlediv .toggle-indicator:before {\n\tcontent: \"\\f140\";\n}\n\n.js .sidebar-name .sidebar-name-arrow:before {\n\tpadding: 10px;\n\tleft: 0;\n}\n\n.js #widgets-left .sidebar-name .sidebar-name-arrow {\n\tdisplay: none;\n}\n\n.js #widgets-left .widgets-holder-wrap.closed .sidebar-name .sidebar-name-arrow,\n.js #widgets-left .sidebar-name:hover .sidebar-name-arrow {\n\tdisplay: block;\n}\n\n.js .postbox .handlediv .toggle-indicator:before {\n\tmargin-top: 4px;\n\twidth: 20px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\ttext-indent: -1px; /* account for the dashicon alignment */\n}\n\n.rtl.js .postbox .handlediv .toggle-indicator:before {\n\ttext-indent: 1px; /* account for the dashicon alignment */\n}\n\n.js .postbox .handlediv:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n}\n\n.js .postbox .handlediv:focus .toggle-indicator:before {\n\t-webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n/* @todo: appears to be Press This only and overridden */\n#photo-add-url-div input[type=\"text\"] {\n\twidth: 300px;\n}\n\n/* Theme/Plugin Editor */\n.alignleft h2 {\n\tmargin: 0;\n}\n\n#template textarea {\n\tfont-family: Consolas, Monaco, monospace;\n\tfont-size: 13px;\n\twidth: 97%;\n\tbackground: #f9f9f9;\n\toutline: none;\n}\n\n/* rtl:ignore */\n#template textarea,\n#docs-list {\n\tdirection: ltr;\n}\n\n#template p {\n\twidth: 97%;\n}\n\n#templateside {\n\tfloat: right;\n\twidth: 190px;\n\tword-wrap: break-word;\n}\n\n#templateside h2,\n#postcustomstuff p.submit {\n\tmargin: 0;\n}\n\n#templateside h4 {\n\tmargin: 1em 0 0;\n}\n\n#templateside ol,\n#templateside ul {\n\tmargin: .5em 0;\n\tpadding: 0;\n}\n\n#templateside li {\n\tmargin: 4px 0;\n}\n\n#templateside li a,\n.theme-editor-php .highlight {\n\tdisplay: block;\n\tpadding: 3px 3px 3px 12px;\n\ttext-decoration: none;\n}\n\n.theme-editor-php .highlight {\n\tmargin: -3px 3px -3px -12px;\n}\n\n#templateside .highlight {\n\tborder: none;\n\tfont-weight: bold;\n}\n\n.nonessential {\n\tcolor: #666;\n\tfont-size: 11px;\n\tfont-style: italic;\n\tpadding-left: 12px;\n}\n\n#documentation {\n\tmargin-top: 10px;\n}\n\n#documentation label {\n\tline-height: 22px;\n\tvertical-align: baseline;\n\tfont-weight: 600;\n}\n\n.fileedit-sub {\n\tpadding: 10px 0 8px;\n\tline-height: 180%;\n}\n\n/* @todo: can we use a common class for these? */\n.nav-menus-php .item-edit:before,\n.widget-top a.widget-action:after,\n.control-section .accordion-section-title:after,\n.accordion-section-title:after {\n\tright: 0;\n\tcontent: \"\\f140\";\n\tborder: none;\n\tbackground: none;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: block;\n\tpadding: 0;\n\ttext-indent: 0;\n\ttext-align: center;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n}\n\n.widget-action,\n.handlediv,\n.item-edit,\n.sidebar-name-arrow,\n.accordion-section-title:after {\n\tcolor: #a0a5aa;\n}\n\n.widget-action:hover,\n.handlediv:hover,\n.handlediv:focus,\n.item-edit:hover,\n.sidebar-name:hover .sidebar-name-arrow,\n.accordion-section-title:hover:after {\n\tcolor: #777;\n}\n\n.widget-top a.widget-action:after {\n\tpadding: 1px 2px 1px 0px;\n\tmargin-top: 10px;\n\tmargin-right: 10px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n}\n\n.widget-top a.widget-action:focus:after {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30,140,190,.8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30,140,190,.8);\n}\n\n.control-section .accordion-section-title:after,\n.accordion-section-title:after {\n\tfloat: right;\n\tright: 20px;\n\ttop: -2px;\n}\n\n.control-section.open .accordion-section-title:after,\n#customize-info.open .accordion-section-title:after,\n.nav-menus-php .menu-item-edit-active .item-edit:before,\n.widget.open .widget-top a.widget-action:after {\n\tcontent: \"\\f142\";\n}\n\n/*!\n * jQuery UI Draggable/Sortable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-draggable-handle,\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n/* Accordion */\n.accordion-section {\n\tborder-bottom: 1px solid #dfdfdf;\n\tmargin: 0;\n}\n\n.accordion-section.open .accordion-section-content,\n.no-js .accordion-section .accordion-section-content {\n\tdisplay: block;\n}\n\n.accordion-section.open:hover {\n\tborder-bottom-color: #dfdfdf;\n}\n\n.accordion-section-content {\n\tdisplay: none;\n\tpadding: 10px 20px 15px;\n\toverflow: hidden;\n\tbackground: #fff;\n}\n\n.accordion-section-title {\n\tmargin: 0;\n\tpadding: 12px 15px 15px;\n\tposition: relative;\n\tborder-left: 1px solid #dfdfdf;\n\tborder-right: 1px solid #dfdfdf;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.js .accordion-section-title {\n\tcursor: pointer;\n}\n\n.js .accordion-section-title:after {\n\tposition: absolute;\n\ttop: 12px;\n\tright: 10px;\n\tz-index: 1;\n}\n\n.accordion-section-title:focus {\n\toutline: none;\n}\n\n.accordion-section-title:hover:after,\n.accordion-section-title:focus:after {\n\tborder-color: #a0a5aa transparent;\n}\n\n.cannot-expand .accordion-section-title {\n\tcursor: auto;\n}\n\n.cannot-expand .accordion-section-title:after {\n\tdisplay: none;\n}\n\n.control-section .accordion-section-title {\n\tborder-left: none;\n\tborder-right: none;\n\tpadding: 10px 10px 11px 14px;\n\tline-height: 21px;\n\tbackground: #fff;\n}\n\n.control-section .accordion-section-title:after {\n\ttop: 11px;\n}\n\n.js .control-section:hover .accordion-section-title,\n.js .control-section .accordion-section-title:hover,\n.js .control-section.open .accordion-section-title,\n.js .control-section .accordion-section-title:focus {\n\tcolor: #23282d;\n\tbackground: #f5f5f5;\n}\n\n.control-section.open .accordion-section-title {\n\t/* When expanded */\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n/* Edit Site */\n.network-admin .edit-site-actions {\n\tmargin-top: 0;\n}\n\n/* My Sites */\n.my-sites {\n\tdisplay: block;\n\toverflow: auto;\n\tzoom: 1;\n}\n\n.my-sites li {\n\tdisplay: block;\n\tpadding: 8px 3%;\n\tmin-height: 130px;\n\tmargin: 0;\n}\n\n@media only screen and (max-width: 599px) {\n\t.my-sites li {\n\t\tmin-height: 0;\n\t}\n}\n\n@media only screen and (min-width: 600px) {\n\t.my-sites.striped li {\n\t\tbackground-color: #fff;\n\t\tposition: relative;\n\t}\n\t.my-sites.striped li:after {\n\t\tcontent: \"\";\n\t\twidth: 1px;\n\t\theight: 100%;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tbackground: #ccc;\n\t}\n\n}\n@media only screen and (min-width: 600px) and (max-width: 699px) {\n\t.my-sites li{\n\t\tfloat: left;\n\t\twidth: 44%;\n\t}\n\t.my-sites.striped li {\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(2n+1) {\n\t\tclear: left;\n\t}\n\t.my-sites.striped li:nth-of-type(2n+2):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(4n+1),\n\t.my-sites li:nth-of-type(4n+2) {\n\t\tbackground-color: #f9f9f9;\n\t}\n\n}\n\n@media only screen and (min-width: 700px) and (max-width: 1199px) {\n\t.my-sites li {\n\t\tfloat: left;\n\t\twidth: 27.333333%;\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(3n+3):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(6n+1),\n\t.my-sites li:nth-of-type(6n+2),\n\t.my-sites li:nth-of-type(6n+3) {\n\t\tbackground-color: #f9f9f9;\n\t}\n}\n\n@media only screen and (min-width: 1200px) and (max-width: 1399px) {\n\t.my-sites li {\n\t\tfloat: left;\n\t\twidth: 21%;\n\t\tpadding: 8px 2%;\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(4n+1) {\n\t\tclear: left;\n\t}\n\t.my-sites.striped li:nth-of-type(4n+4):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(8n+1),\n\t.my-sites li:nth-of-type(8n+2),\n\t.my-sites li:nth-of-type(8n+3),\n\t.my-sites li:nth-of-type(8n+4) {\n\t\tbackground-color: #f9f9f9;\n\t}\n}\n\n@media only screen and (min-width: 1400px) and (max-width: 1599px) {\n\t.my-sites li {\n\t\tfloat: left;\n\t\twidth: 16%;\n\t\tpadding: 8px 2%;\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(5n+1) {\n\t\tclear: left;\n\t}\n\t.my-sites.striped li:nth-of-type(5n+5):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(10n+1),\n\t.my-sites li:nth-of-type(10n+2),\n\t.my-sites li:nth-of-type(10n+3),\n\t.my-sites li:nth-of-type(10n+4),\n\t.my-sites li:nth-of-type(10n+5) {\n\t\tbackground-color: #f9f9f9;\n\t}\n}\n\n@media only screen and (min-width: 1600px) {\n\t.my-sites li {\n\t\tfloat: left;\n\t\twidth: 12.666666%;\n\t\tpadding: 8px 2%;\n\t\tbackground-color: #fff;\n\t}\n\t.my-sites.striped li:nth-of-type(6n+1) {\n\t\tclear: left;\n\t}\n\t.my-sites.striped li:nth-of-type(6n+6):after {\n\t\tcontent: none;\n\t}\n\t.my-sites li:nth-of-type(12n+1),\n\t.my-sites li:nth-of-type(12n+2),\n\t.my-sites li:nth-of-type(12n+3),\n\t.my-sites li:nth-of-type(12n+4),\n\t.my-sites li:nth-of-type(12n+5),\n\t.my-sites li:nth-of-type(12n+6) {\n\t\tbackground-color: #f9f9f9;\n\t}\n}\n\n.my-sites li a {\n\ttext-decoration: none;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/* @todo: de-duplication */\n@media only screen and (min-width: 769px) {\n\t/* categories */\n\t#col-left {\n\t\twidth: 35%;\n\t}\n\n\t#col-right {\n\t\twidth: 65%;\n\t}\n}\n\n@media only screen and (max-width: 860px) {\n\n\t/* categories */\n\t#col-left {\n\t\twidth: 35%;\n\t}\n\n\t#col-right {\n\t\twidth: 65%;\n\t}\n}\n\n@media only screen and (min-width: 980px) {\n\n\t/* categories */\n\t#col-left {\n\t\twidth: 35%;\n\t}\n\n\t#col-right {\n\t\twidth: 65%;\n\t}\n}\n\n@media only screen and (max-width: 768px) {\n\t/* categories */\n\t#col-left {\n\t\twidth: 100%;\n\t}\n\n\t#col-right {\n\t\twidth: 100%;\n\t}\n}\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t/* Back-compat for pre-3.8 */\n\tdiv.star-holder,\n\tdiv.star-holder .star-rating {\n\t\tbackground: url(../images/stars-2x.png?ver=20121108) repeat-x bottom left;\n\t\t-webkit-background-size: 21px 37px;\n\t\tbackground-size: 21px 37px;\n\t}\n\n\t.spinner {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n\n\t/* @todo: evaluate - most of these were likely replaced by dashicons */\n\t.curtime #timestamp,\n\t#screen-meta-links a.show-settings,\n\t.widget-top a.widget-action,\n\t.widget-top a.widget-action:hover,\n\t.sidebar-name-arrow,\n\t.sidebar-name:hover .sidebar-name-arrow,\n\t.meta-box-sortables .postbox:hover .handlediv,\n\t.tagchecklist span a,\n\t#bulk-titles div a,\n\t.tagchecklist span a:hover,\n\t#bulk-titles div a:hover {\n\t\tbackground: none !important;\n\t}\n\n}\n\n@-ms-viewport {\n\twidth: device-width;\n}\n\n@media screen and ( max-width: 782px ) {\n\thtml.wp-toolbar {\n\t\tpadding-top: 46px;\n\t}\n\n\tbody {\n\t\tmin-width: 240px;\n\t\toverflow-x: hidden;\n\t}\n\n\tbody * {\n\t\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;\n\t}\n\n\t#wpcontent {\n\t\tposition: relative;\n\t\tmargin-left: 0;\n\t\tpadding-left: 10px;\n\t}\n\n\t#wpbody-content {\n\t\tpadding-bottom: 100px;\n\t}\n\n\t.wrap {\n\t\tmargin-right: 12px;\n\t\tmargin-left: 0;\n\t}\n\n\t.col-wrap {\n\t\tpadding: 0;\n\t}\n\n\t/* Hidden Elements */\n\t#screen-meta,\n\t#screen-meta-links,\n\t#collapse-menu,\n\t.post-format-select {\n\t\tdisplay: none !important;\n\t}\n\n\t.wrap .add-new-h2, /* deprecated */\n\t.wrap .add-new-h2:active, /* deprecated */\n\t.wrap .page-title-action,\n\t.wrap .page-title-action:active {\n\t\tpadding: 10px 15px;\n\t\tfont-size: 14px;\n\t\twhite-space: nowrap;\n\t}\n\n\t.wp-color-result {\n\t\theight: auto;\n\t\tpadding-left: 45px;\n\t}\n\n\t.wp-color-result:after {\n\t\tfont-size: 14px;\n\t\theight: auto;\n\t\tpadding: 6px 14px;\n\t}\n\n\t/* Feedback Messages */\n\t.notice,\n\t.wrap div.updated,\n\t.wrap div.error,\n\t.media-upload-form div.error {\n\t\tmargin: 20px 0 10px 0;\n\t\tpadding: 5px 10px;\n\t\tfont-size: 14px;\n\t\tline-height: 175%;\n\t}\n\n\t.wp-core-ui .notice.is-dismissible {\n\t\tpadding-right: 46px;\n\t}\n\n\t.notice-dismiss {\n\t\tpadding: 13px;\n\t}\n\n\t.wrap .icon32 + h2 {\n\t\tmargin-top: -2px;\n\t}\n\n\t.wp-responsive-open #wpbody {\n\t\tright: -190px;\n\t}\n\n\tcode {\n\t\tword-wrap: break-word;\n\t}\n\n\t/* General Metabox */\n\t.postbox {\n\t\tfont-size: 14px;\n\t}\n\n\t.metabox-holder h3.hndle, /* Back-compat for pre-4.4 */\n\t.metabox-holder .stuffbox > h3, /* Back-compat for pre-4.4 */\n\t.metabox-holder .postbox > h3, /* Back-compat for pre-4.4 */\n\t.metabox-holder h2 {\n\t\tpadding: 12px;\n\t}\n\n\t.postbox .handlediv {\n\t\tmargin-top: 3px;\n\t}\n\n\t/* Subsubsub Nav */\n\t.subsubsub {\n\t\tfont-size: 16px;\n\t\ttext-align: center;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t/* Theme/Plugin File Editor */\n\t#templateside {\n\t\tfloat: none;\n\t\twidth: auto;\n\t}\n\n\t#templateside li {\n\t\tmargin: 0;\n\t}\n\n\t#templateside li a {\n\t\tdisplay: block;\n\t\tpadding: 5px;\n\t}\n\n\t#templateside .highlight {\n\t\tpadding: 5px;\n\t\tmargin-left: -5px;\n\t\tmargin-top: -5px;\n\t}\n\n\t#template div {\n\t\tfloat: none;\n\t\tmargin: 0;\n\t\twidth: auto;\n\t}\n\n\t#template textarea {\n\t\twidth: 100%;\n\t}\n\n\t.fileedit-sub .alignright {\n\t\tmargin-top: 15px;\n\t}\n\n\t#wpfooter {\n\t\tdisplay: none;\n\t}\n\n\t#comments-form .checkforspam {\n\t\tdisplay: none;\n\t}\n\n\t.edit-comment-author {\n\t\tmargin: 2px 0 0;\n\t}\n\n\t.filter-drawer .filter-group-feature input,\n\t.filter-drawer .filter-group-feature label {\n\t\tline-height: 25px;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t/* Disable horizontal scroll when responsive menu is open\n\t   since we push the main content off to the right. */\n\t#wpwrap.wp-responsive-open {\n\t\toverflow-x: hidden;\n\t}\n\n\thtml.wp-toolbar {\n\t\tpadding-top: 0;\n\t}\n\n\t#wpbody {\n\t\tpadding-top: 46px;\n\t}\n\n\t/* Keep full-width boxes on Edit Post page from causing horizontal scroll */\n\tdiv#post-body.metabox-holder.columns-1 {\n\t\toverflow-x: hidden;\n\t}\n\n\th1.nav-tab-wrapper,\n\t.wrap h2.nav-tab-wrapper,\n\th3.nav-tab-wrapper {\n\t\tpadding-left: 0;\n\t\tborder-bottom: 0;\n\t}\n\n\th1 .nav-tab,\n\th2 .nav-tab,\n\th3 .nav-tab {\n\t\tmargin-top: 10px;\n\t\tmargin-right: 10px;\n\t\tborder-bottom: 1px solid #ccc;\n\t}\n}\n\n@media screen and (max-width: 320px) {\n\t/* Prevent default center alignment and larger font for the Right Now widget when\n\t   the network dashboard is viewed on a small mobile device. */\n\t#network_dashboard_right_now .subsubsub {\n\t\tfont-size: 14px;\n\t\ttext-align: left;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/customize-controls-rtl.css",
    "content": "body {\n\toverflow: hidden;\n\t-webkit-text-size-adjust: 100%;\n}\n\n#customize-controls a {\n\ttext-decoration: none;\n}\n\n#customize-controls h3 {\n\tfont-size: 14px;\n}\n\n#customize-controls img {\n\tmax-width: 100%;\n}\n\n#customize-controls .submit {\n\ttext-align: center;\n}\n\n#customize-controls .description {\n\tcolor: #555;\n}\n\n#customize-header-actions .button-primary {\n\tfloat: left;\n\tmargin-top: 9px;\n}\n\n#customize-header-actions .spinner {\n\tmargin-top: 13px;\n\tmargin-left: 4px;\n}\n\n.saving #customize-header-actions .spinner {\n\tvisibility: visible;\n}\n\n#customize-header-actions {\n\tborder-bottom: 1px solid #ddd;\n}\n\n#customize-controls .wp-full-overlay-sidebar-content {\n\toverflow-y: auto;\n\toverflow-x: hidden;\n}\n\n#customize-controls .customize-info {\n\tborder: none;\n\tborder-top: 1px solid #ddd;\n\tborder-bottom: 1px solid #ddd;\n\tmargin-bottom: 15px;\n}\n\n#customize-controls .customize-info .accordion-section-title {\n\tbackground: #fff;\n\tcolor: #555;\n\tborder-right: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tcursor: default;\n}\n\n#customize-controls .customize-info.open .accordion-section-title:after,\n#customize-controls .customize-info .accordion-section-title:hover:after,\n#customize-controls .customize-info .accordion-section-title:focus:after {\n\tcolor: #333;\n}\n\n#customize-controls .customize-info .accordion-section-title:after {\n\tdisplay: none;\n}\n\n#customize-controls .customize-info .preview-notice {\n\tfont-size: 13px;\n\tline-height: 24px;\n}\n\n#customize-controls .control-section .customize-section-title h3,\n#customize-controls .control-section h3.customize-section-title,\n#customize-controls .customize-info .panel-title {\n\tfont-size: 20px;\n\tfont-weight: 200;\n\tline-height: 26px;\n\tdisplay: block;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n}\n\n#customize-controls .customize-section-title span.customize-action {\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n}\n\n#customize-controls .customize-info .customize-help-toggle {\n\tposition: absolute;\n\ttop: 4px;\n\tleft: 1px;\n\tpadding: 20px 10px 10px 20px;\n\twidth: 20px;\n\theight: 20px;\n\tcursor: pointer;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\t-webkit-appearance: none;\n\tbackground: transparent;\n\tcolor: #555;\n\tborder: none;\n}\n\n#customize-controls .customize-info .customize-help-toggle:before {\n\tposition: absolute;\n\ttop: 5px;\n\tright: 6px;\n}\n\n#customize-controls .customize-info.open .customize-help-toggle,\n#customize-controls .customize-info .customize-help-toggle:focus,\n#customize-controls .customize-info .customize-help-toggle:hover {\n\tcolor: #0073aa;\n}\n\n#customize-controls .customize-info .customize-panel-description,\n#customize-controls .no-widget-areas-rendered-notice {\n\tcolor: #555;\n\tdisplay: none;\n\tbackground: #fff;\n\tpadding: 12px 15px;\n\tborder-top: 1px solid #ddd;\n}\n#customize-controls .customize-info .customize-panel-description.open + .no-widget-areas-rendered-notice {\n\tborder-top: none;\n}\n\n#customize-controls .customize-info .customize-panel-description p:first-child {\n\tmargin-top: 0;\n}\n\n#customize-controls .customize-info .customize-panel-description p:last-child {\n\tmargin-bottom: 0;\n}\n\n#customize-controls .current-panel .control-section > h3.accordion-section-title {\n\tpadding-left: 30px;\n}\n\n#customize-theme-controls .control-section {\n\tborder: none;\n}\n\n#customize-theme-controls .accordion-section-title {\n\tcolor: #555;\n\tbackground-color: #fff;\n\tborder-bottom: 1px solid #eee;\n}\n\n#customize-theme-controls .accordion-section-title:after {\n\tcontent: \"\\f341\";\n}\n\n#customize-theme-controls .accordion-section-content {\n\tcolor: #555;\n\tbackground: transparent;\n}\n\n#customize-controls .control-section:hover > .accordion-section-title,\n#customize-controls .control-section .accordion-section-title:hover,\n#customize-controls .control-section.open .accordion-section-title,\n#customize-controls .control-section .accordion-section-title:focus {\n\tcolor: #23282d;\n\tbackground: #f5f5f5;\n}\n\n.js .control-section:hover .accordion-section-title,\n.js .control-section .accordion-section-title:hover,\n.js .control-section.open .accordion-section-title,\n.js .control-section .accordion-section-title:focus {\n\tbackground: #f5f5f5;\n}\n\n#customize-theme-controls .control-section:hover > .accordion-section-title:after,\n#customize-theme-controls .control-section .accordion-section-title:hover:after,\n#customize-theme-controls .control-section.open .accordion-section-title:after,\n#customize-theme-controls .control-section .accordion-section-title:focus:after {\n\tcolor: #23282d;\n}\n\n#customize-theme-controls .control-section.open {\n\tborder-bottom: 1px solid #eee;\n}\n\n#customize-theme-controls .control-section.open .accordion-section-title {\n\tborder-bottom-color: #eee !important;\n}\n\n#customize-theme-controls .control-section:last-of-type.open,\n#customize-theme-controls .control-section:last-of-type > .accordion-section-title {\n\tborder-bottom-color: #ddd;\n}\n\n#customize-theme-controls > ul {\n\tmargin: 0;\n}\n\n#customize-theme-controls .accordion-section-content {\n\tposition: absolute;\n\ttop: 0;\n\tright: 100%;\n\twidth: 100%;\n\tmargin: 0;\n\tpadding: 12px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.customize-section-description-container {\n\tmargin-bottom: 15px;\n}\n\n.customize-section-title {\n\tmargin: -12px -12px 0 -12px;\n\tborder-bottom: 1px solid #ddd;\n\tbackground: #fff;\n}\n\ndiv.customize-section-description {\n\tmargin-top: 22px;\n}\n\ndiv.customize-section-description p:first-child {\n\tmargin-top: 0;\n}\n\ndiv.customize-section-description p:last-child {\n\tmargin-bottom: 0;\n}\n\n#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child {\n\tborder-bottom: 1px solid #ddd;\n\tpadding: 12px 12px 12px 12px;\n}\n\n.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child {\n\tpadding: 12px 12px 13px 12px;\n}\n\n.customize-section-title h3,\nh3.customize-section-title {\n\tpadding: 10px 14px 12px 10px;\n\tmargin: 0;\n\tline-height: 21px;\n\tcolor: #555;\n}\n\n#customize-theme-controls {\n\tposition: relative;\n\tright: 0;\n\t-webkit-transition: .18s right ease-in-out;\n\ttransition: .18s right ease-in-out;\n}\n\n.ios #customize-theme-controls {\n\t-webkit-transition: right 0s;\n\ttransition: right 0s;\n}\n\n.section-open #customize-info,\n.section-open #customize-theme-controls {\n\tright: -100%;\n}\n\n.accordion-sub-container.control-panel-content {\n\tdisplay: none;\n\tposition: absolute;\n\tright: 300px;\n\ttop: 0;\n\twidth: 300px;\n\t-webkit-transition: right ease-in-out .18s;\n\ttransition: right ease-in-out .18s;\n}\n\n.ios .accordion-sub-container.control-panel-content {\n\t-webkit-transition: right 0s;\n\ttransition: right 0s;\n}\n\n.accordion-sub-container.control-panel-content.animating {\n\tdisplay: block;\n}\n\n.current-panel .accordion-sub-container.control-panel-content {\n\twidth: 100%;\n}\n\n.customize-controls-close {\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 45px;\n\theight: 45px;\n\tpadding: 0 0 0 2px;\n\tbackground: #eee;\n\tborder: none;\n\tborder-left: 1px solid #ddd;\n\tcolor: #444;\n\ttext-align: right;\n\tcursor: pointer;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\n.customize-panel-back,\n.customize-section-back {\n\tdisplay: block;\n\tfloat: right;\n\twidth: 48px;\n\theight: 71px;\n\tpadding: 0 0 0 24px;\n\tmargin: 0;\n\tbackground: #fff;\n\tborder: none;\n\tborder-left: 1px solid #ddd;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcursor: pointer;\n\t-webkit-transition: right .18s ease-in-out, color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: right .18s ease-in-out, color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.customize-section-back {\n\theight: 74px;\n}\n\n.ios .customize-panel-back,\n.ios .customize-section-back {\n\t-webkit-transition: right 0s;\n\ttransition: right 0s;\n}\n\n.ios .customize-panel-back {\n\tdisplay: none;\n}\n\n.ios .expanded.in-sub-panel .customize-panel-back {\n\tdisplay: block;\n}\n\n.panel-meta.customize-info .accordion-section-title {\n\tmargin-right: 48px;\n}\n\n#customize-controls .panel-meta.customize-info .accordion-section-title:hover {\n\tbackground: #fff;\n\tcolor: #555;\n}\n\n.customize-controls-close:focus,\n.customize-controls-close:hover,\n.customize-controls-preview-toggle:focus,\n.customize-controls-preview-toggle:hover {\n\tbackground: #ddd;\n\tborder-color: #ccc;\n\tcolor: #000;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.customize-panel-back:hover,\n.customize-panel-back:focus,\n.customize-section-back:hover,\n.customize-section-back:focus {\n\tcolor: #23282d;\n\tbackground: #f5f5f5;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.customize-controls-close:before {\n\tfont: normal 22px/45px dashicons;\n\tcontent: \"\\f335\";\n\tposition: relative;\n\ttop: 1px;\n\tright: 13px;\n}\n\n.customize-panel-back:before,\n.customize-section-back:before {\n\tfont: normal 20px/72px dashicons;\n\tcontent: \"\\f345\";\n\tposition: relative;\n\tright: 13px;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-header {\n\t-webkit-transition: padding ease-in-out .18s;\n\ttransition: padding ease-in-out .18s;\n}\n\n.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header {\n\tpadding-right: 62px;\n}\n\n#customize-info,\n#customize-theme-controls > ul > .accordion-section {\n\tposition: relative;\n\tright: 0;\n\t-webkit-transition: right ease-in-out .18s;\n\ttransition: right ease-in-out .18s;\n}\n\n.ios #customize-info,\n.ios #customize-theme-controls > ul > .accordion-section {\n\t-webkit-transition: right 0s;\n\ttransition: right 0s;\n}\n\n.in-sub-panel #customize-info,\n.in-sub-panel #customize-theme-controls > ul > .accordion-section {\n\tright: -300px;\n\twidth: 300px;\n}\n\n.in-sub-panel #customize-theme-controls .accordion-section.current-panel {\n\twidth: 100%;\n}\n\n#customize-theme-controls .control-section.current-panel {\n\tpadding: 0;\n}\n\n#customize-theme-controls .control-section > h3.accordion-section-title {\n\tposition: relative;\n\tright: 0;\n}\n\n#customize-theme-controls .control-section.current-panel > h3.accordion-section-title {\n\tright: -354px;\n\t-webkit-transition: right ease-in-out .18s;\n\ttransition: right ease-in-out .18s;\n}\n\n.ios #customize-theme-controls .control-section.current-panel > h3.accordion-section-title {\n\t-webkit-transition: right 0s;\n\ttransition: right 0s;\n}\n\n.wp-full-overlay.section-open #customize-controls .wp-full-overlay-sidebar-content {\n\tvisibility: hidden;\n\toverflow-y: hidden;\n}\n\n.wp-full-overlay.section-open .wp-full-overlay-sidebar-content .accordion-section.open {\n\tvisibility: visible;\n}\n\n.wp-full-overlay.section-open .wp-full-overlay-sidebar-content .accordion-section.open .accordion-section-content {\n\toverflow-y: auto;\n}\n\np.customize-section-description {\n\tfont-style: normal;\n\tmargin-top: 22px;\n\tmargin-bottom: 0;\n}\n\n.customize-control {\n\twidth: 100%;\n\tfloat: right;\n\tclear: both;\n\tmargin-bottom: 12px;\n}\n\n.customize-control select,\n.customize-control input[type=\"radio\"],\n.customize-control input[type=\"checkbox\"] {\n\tline-height: 28px;\n}\n\n.customize-control input[type=\"text\"],\n.customize-control input[type=\"password\"],\n.customize-control input[type=\"email\"],\n.customize-control input[type=\"number\"],\n.customize-control input[type=\"search\"],\n.customize-control input[type=\"tel\"],\n.customize-control input[type=\"url\"] {\n\twidth: 98%;\n\tline-height: 18px;\n\tmargin: 0;\n}\n\n.customize-control-hidden {\n\tmargin: 0;\n}\n\n.customize-control-textarea textarea {\n\twidth: 100%;\n\tresize: vertical;\n}\n\n.customize-control select {\n\tmin-width: 50%;\n\tmax-width: 100%;\n\theight: 28px;\n\tline-height: 28px;\n}\n\n.customize-control select[multiple] {\n\theight: auto;\n}\n\n.customize-control-title {\n\tdisplay: block;\n\tfont-size: 14px;\n\tline-height: 24px;\n\tfont-weight: 600;\n\tmargin-bottom: 5px;\n}\n\n.customize-control-description {\n\tdisplay: block;\n\tfont-style: italic;\n\tline-height: 18px;\n\tmargin-bottom: 5px;\n}\n\n.customize-control-color .color-picker,\n.customize-control-upload div {\n\tline-height: 28px;\n}\n\n.customize-control-radio label,\n.customize-control-checkbox label,\n.customize-control-nav_menu_auto_add label {\n\tline-height: 20px;\n\tdisplay: block;\n\tmargin-right: 24px;\n\tpadding-top: 6px;\n\tpadding-bottom: 6px;\n}\n\n.customize-control-radio input,\n.customize-control-checkbox input,\n.customize-control-nav_menu_auto_add input {\n\tmargin-left: 4px;\n\tmargin-right: -24px;\n}\n\n.customize-control-radio {\n\tpadding: 5px 0 10px;\n}\n\n.customize-control-radio .customize-control-title {\n\tmargin-bottom: 0;\n\tline-height: 22px;\n}\n\n.customize-control-radio .customize-control-title + .customize-control-description {\n\tmargin-top: 7px;\n}\n\n.customize-control .attachment-thumb.type-icon {\n\tfloat: right;\n\tmargin: 10px;\n\twidth: auto;\n}\n\n.customize-control .attachment-title {\n\tfont-weight: bold;\n\tmargin: 0;\n\tpadding: 5px 10px;\n}\n\n.customize-control .attachment-meta {\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tmargin: 0;\n\tpadding: 0 10px;\n}\n\n.customize-control .attachment-meta-title {\n\tpadding-top: 7px;\n}\n\n.customize-control .thumbnail-image {\n\tline-height: 0;\n}\n\n.customize-control .thumbnail-image img {\n\tcursor: pointer;\n}\n\n#customize-controls .thumbnail-audio .thumbnail {\n\tmax-width: 64px;\n\tmax-height: 64px;\n\tmargin: 10px;\n\tfloat: right;\n}\n\n#customize-preview iframe {\n\twidth: 100%;\n\theight: 100%;\n}\n\n.wp-full-overlay-sidebar {\n\tbackground: #eee;\n\tborder-left: 1px solid #ddd;\n}\n\n/* Style for custom settings */\n\n/**\n * Dropdowns\n */\n\n.accordion-section .dropdown {\n\tfloat: right;\n\tdisplay: block;\n\tposition: relative;\n\tcursor: pointer;\n}\n\n.accordion-section .dropdown-content {\n\toverflow: hidden;\n\tfloat: right;\n\tmin-width: 30px;\n\theight: 16px;\n\tline-height: 16px;\n\tmargin-left: 16px;\n\tpadding: 4px 5px;\n\tborder: 2px solid #eee;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.customize-control .dropdown-arrow {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 20px;\n\tbackground: #eee;\n}\n\n.customize-control .dropdown-arrow:after {\n\tcontent: \"\\f140\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: block;\n\tpadding: 0;\n\ttext-indent: 0;\n\ttext-align: center;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #32373c;\n}\n\n.customize-control .dropdown-status {\n\tcolor: #32373c;\n\tbackground: #eee;\n\tdisplay: none;\n\tmax-width: 112px;\n}\n\n/* Color Picker */\n.customize-control-color .color-picker-hex {\n\tdisplay: none;\n}\n\n.customize-control-color.open .color-picker-hex {\n\tdisplay: block;\n}\n\n.customize-control-color .dropdown {\n\tmargin-left: 5px;\n\tmargin-bottom: 5px;\n}\n\n.customize-control-color .dropdown .dropdown-content {\n\tbackground-color: #555;\n\tborder: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.customize-control-color .dropdown:hover .dropdown-content {\n\tborder-color: rgba(0, 0, 0, 0.25);\n}\n\n/**\n * iOS can't scroll iframes,\n * instead it expands the iframe size to match the size of the content\n */\n\n.ios .wp-full-overlay {\n\tposition: relative;\n}\n\n.ios #customize-preview {\n\tposition: relative;\n}\n\n.ios #customize-controls .wp-full-overlay-sidebar-content {\n\t-webkit-overflow-scrolling: touch;\n}\n\n/* Media controls */\n\n.customize-control-media .current,\n.customize-control-upload .current,\n.customize-control-image .current,\n.customize-control-background .current,\n.customize-control-cropped_image .current,\n.customize-control-site_icon .current,\n.customize-control-header .current {\n\tmargin-bottom: 8px;\n}\n\n.customize-control-header .uploaded {\n\tmargin-bottom: 18px;\n}\n\n.customize-control-header .uploaded button:not(.random),\n.customize-control-header .default button:not(.random) {\n\twidth: 100%;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcolor: inherit;\n\tcursor: pointer;\n}\n\n.customize-control-header button img {\n\tdisplay: block;\n}\n\n.customize-control-media .remove-button,\n.customize-control-media .default-button,\n.customize-control-media .upload-button,\n.customize-control-upload .remove-button,\n.customize-control-upload .default-button,\n.customize-control-upload .upload-button,\n.customize-control-image .remove-button,\n.customize-control-image .default-button,\n.customize-control-image .upload-button,\n.customize-control-background .remove-button,\n.customize-control-background .default-button,\n.customize-control-background .upload-button,\n.customize-control-cropped_image .remove-button,\n.customize-control-cropped_image .default-button,\n.customize-control-cropped_image .upload-button,\n.customize-control-site_icon .remove-button,\n.customize-control-site_icon .default-button,\n.customize-control-site_icon .upload-button,\n.customize-control-header button.new,\n.customize-control-header button.remove {\n\twhite-space: normal;\n\twidth: 48%;\n\theight: auto;\n}\n\n.customize-control-media .current .container,\n.customize-control-upload .current .container,\n.customize-control-image .current .container,\n.customize-control-background .current .container,\n.customize-control-cropped_image .current .container,\n.customize-control-site_icon .current .container,\n.customize-control-header .current .container {\n\toverflow: hidden;\n\t-webkit-border-radius: 2px;\n\tborder: 1px solid #eee;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n}\n\n.customize-control-media .current .container,\n.customize-control-upload .current .container,\n.customize-control-background .current .container,\n.customize-control-cropped_image .current .container,\n.customize-control-site_icon .current .container,\n.customize-control-image .current .container {\n\tmin-height: 40px;\n}\n\n.customize-control-media .placeholder,\n.customize-control-upload .placeholder,\n.customize-control-image .placeholder,\n.customize-control-background .placeholder,\n.customize-control-cropped_image .placeholder,\n.customize-control-site_icon .placeholder,\n.customize-control-header .placeholder {\n\twidth: 100%;\n\tposition: relative;\n\ttext-align: center;\n\tcursor: default;\n}\n\n.customize-control-media .inner,\n.customize-control-upload .inner,\n.customize-control-image .inner,\n.customize-control-background .inner,\n.customize-control-cropped_image .inner,\n.customize-control-site_icon .inner,\n.customize-control-header .inner {\n\tdisplay: none;\n\tposition: absolute;\n\twidth: 100%;\n\tcolor: #555;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n\n.customize-control-media .inner,\n.customize-control-upload .inner,\n.customize-control-background .inner,\n.customize-control-cropped_image .inner,\n.customize-control-site_icon .inner,\n.customize-control-image .inner {\n\tdisplay: block;\n\tmin-height: 40px;\n}\n\n.customize-control-media .inner,\n.customize-control-upload .inner,\n.customize-control-image .inner,\n.customize-control-background .inner,\n.customize-control-cropped_image .inner,\n.customize-control-site_icon .inner,\n.customize-control-header .inner,\n.customize-control-header .inner .dashicons {\n\tline-height: 20px;\n\ttop: 10px;\n}\n\n.customize-control-header .list .inner,\n.customize-control-header .list .inner .dashicons {\n\ttop: 9px;\n}\n\n.customize-control-header .header-view {\n\tposition: relative;\n\twidth: 100%;\n\tmargin-bottom: 5px;\n}\n\n.customize-control-header .header-view:last-child {\n\tmargin-bottom: 0px;\n}\n\n/* Convoluted, but 'outline' support isn't good enough yet */\n.customize-control-header .header-view:after {\n\tborder: 0;\n}\n.customize-control-header .header-view.selected:after {\n\tcontent: '';\n\tposition: absolute;\n\theight: auto;\n\ttop: 0; right: 0; bottom: 0; left: 0;\n\tborder: 4px solid #00a0d2;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n}\n.customize-control-header .header-view.button.selected {\n\tborder: 0;\n}\n\n/* Header control: overlay \"close\" button */\n\n.customize-control-header .uploaded .header-view .close {\n\tfont-size: 20px;\n\tcolor: #fff;\n\tbackground: #555;\n\tbackground: rgba(0, 0, 0, 0.5);\n\tposition: absolute;\n\ttop: 10px;\n\tleft: -999px;\n\tz-index: 1;\n\twidth: 26px;\n\theight: 26px;\n\tcursor: pointer;\n}\n\n.customize-control-header .header-view:hover .close,\n.customize-control-header .header-view .close:focus {\n\tleft: 10px;\n}\n\n/* Header control: randomiz(s)er */\n\n.customize-control-header .random.placeholder {\n\tcursor: pointer;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\theight: 40px;\n}\n\n.customize-control-header button.random {\n\twidth: 100%;\n\theight: auto;\n\tmin-height: 40px;\n\twhite-space: normal;\n}\n\n.customize-control-header button.random .dice {\n\tmargin-top: 4px;\n}\n\n.customize-control-header .placeholder:hover .dice,\n.customize-control-header .header-view:hover > button.random .dice {\n\t-webkit-animation: dice-color-change 3s infinite;\n\tanimation: dice-color-change 3s infinite;\n}\n\n@-webkit-keyframes dice-color-change {\n\t0% { color: #d4b146; }\n\t50% { color: #ef54b0; }\n\t75% { color: #7190d3; }\n\t100% { color: #d4b146; }\n}\n\n@keyframes dice-color-change {\n\t0% { color: #d4b146; }\n\t50% { color: #ef54b0; }\n\t75% { color: #7190d3; }\n\t100% { color: #d4b146; }\n}\n\n.customize-control-media .actions,\n.customize-control-upload .actions,\n.customize-control-image .actions,\n.customize-control-background .actions,\n.customize-control-cropped_image .actions,\n.customize-control-site_icon .actions,\n.customize-control-header .actions {\n\tmargin-bottom: 32px;\n}\n\n.customize-control-header .choice {\n\tposition: relative;\n\tdisplay: block;\n\tmargin-bottom: 9px;\n}\n\n.customize-control-header .uploaded div:last-child > .choice {\n\tmargin-bottom: 0;\n}\n\n.customize-control-media img,\n.customize-control-upload img,\n.customize-control-image img,\n.customize-control-background img,\n.customize-control-cropped_image img,\n.customize-control-site_icon img,\n.customize-control-header img {\n\twidth: 100%;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n}\n\n.customize-control-media .remove-button,\n.customize-control-media .default-button,\n.customize-control-upload .remove-button,\n.customize-control-upload .default-button,\n.customize-control-image .remove-button,\n.customize-control-image .default-button,\n.customize-control-background .remove-button,\n.customize-control-background .default-button,\n.customize-control-cropped_image .remove-button,\n.customize-control-cropped_image .default-button,\n.customize-control-site_icon .remove-button,\n.customize-control-site_icon .default-button,\n.customize-control-header .remove {\n\tfloat: right;\n\tmargin-left: 3px;\n}\n\n.customize-control-media .upload-button,\n.customize-control-upload .upload-button,\n.customize-control-image .upload-button,\n.customize-control-background .upload-button,\n.customize-control-cropped_image .upload-button,\n.customize-control-site_icon .upload-button,\n.customize-control-header .new {\n\tfloat: left;\n}\n\n/**\n * Themes\n */\n\n@-webkit-keyframes customize-reload {\n\t0%   { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n@keyframes customize-reload {\n\t0%   { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n/* #customize-container is reused from customize-loader.js, hence the naming. */\n.wp-customizer .customize-loading #customize-container {\n\tdisplay: block;\n\t-webkit-animation: customize-reload .75s; /* Can't use `transition` because `display` changes here. */\n\tanimation: customize-reload .75s;\n}\n\n.control-section-themes .accordion-section-title {\n\tcursor: default;\n}\n\n#customize-theme-controls .control-section-themes .accordion-section-title:hover,\n#customize-theme-controls .control-section-themes .accordion-section-title:focus {\n\tcolor: #555;\n\tbackground-color: #fff;\n}\n\n.control-section-themes .accordion-section-title {\n\tmargin: 15px 0;\n}\n\n.customize-themes-panel .accordion-section-title {\n\tmargin: 15px -8px;\n}\n\n.control-section-themes .accordion-section-title {\n\tpadding-left: 100px; /* Space for the button */\n}\n\n.control-section-themes .accordion-section-title span.customize-action,\n#customize-controls .customize-section-title span.customize-action {\n\tfont-size: 13px;\n\tdisplay: block;\n\tfont-weight: 400;\n}\n\n.control-section-themes .accordion-section-title .change-theme,\n.control-section-themes .accordion-section-title .customize-theme {\n\tposition: absolute;\n\tleft: 10px;\n\ttop: 50%;\n\tmargin-top: -14px;\n\tfont-weight: normal;\n}\n\n.control-section-themes .accordion-section-title:before {\n\tdisplay: none;\n}\n\n.customize-themes-panel {\n\tdisplay: none;\n\tpadding: 0 8px;\n\tbackground: #f1f1f1;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.customize-themes-panel .accordion-section-title:first-child {\n\tmargin-top: 0;\n}\n\n#customize-controls .customize-themes-panel .accordion-section-title:nth-child(2) {\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.customize-themes-panel > h2 {\n\tpadding: 15px 8px 0 8px;\n}\n\n.control-section.open .customize-themes-panel {\n\tdisplay: block;\n}\n\n#customize-theme-controls .customize-themes-panel .accordion-section-content {\n\tbackground: transparent;\n\tdisplay: block;\n}\n\n.customize-control.customize-control-theme {\n\tmargin-bottom: 8px;\n}\n\n#customize-theme-controls .themes.accordion-section-content {\n\tposition: relative;\n\tright: 0;\n\tpadding: 0;\n\twidth: 100%;\n}\n\n.wp-customizer .theme-browser .themes {\n\tpadding-bottom: 8px;\n}\n\n.wp-customizer .theme-browser .theme {\n\tmargin: 0;\n\twidth: 100%;\n}\n\n.wp-customizer .theme-browser .theme .theme-actions {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n\topacity: 1;\n}\n\n#customize-controls h3.theme-name {\n\tfont-size: 15px;\n}\n\n#customize-controls .theme-overlay .theme-name {\n\tfont-size: 32px;\n}\n\n.wp-customizer #themes-filter {\n\tfont-size: 16px;\n\tfont-weight: 300;\n\tline-height: 1.5;\n\twidth: 100%;\n}\n\n#accordion-section-themes .accordion-section-title:after {\n\tdisplay: none;\n}\n\n#customize-theme-controls .control-section-themes.current-panel > h3.accordion-section-title {\n\tright: 0;\n}\n\n.customize-themes-panel.control-panel-content {\n\tposition: absolute;\n\tright: -100%;\n\ttop: 0;\n\twidth: 100%;\n\tborder-top: 1px solid #ddd;\n}\n\n.in-themes-panel #customize-info,\n.in-themes-panel #customize-theme-controls > ul > .accordion-section {\n\tright: 100%;\n}\n\n/* Details View */\n.wp-customizer .theme-overlay {\n\tdisplay: none;\n}\n\n.wp-customizer.modal-open .theme-overlay {\n\tposition: fixed;\n\tright: 0;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tz-index: 109;\n}\n\n.wp-customizer .theme-overlay .theme-backdrop {\n\tbackground: rgba( 238, 238, 238, 0.75 );\n\tposition: fixed;\n\tz-index: 110;\n}\n\n.wp-customizer .theme-overlay .theme-wrap {\n\tright: 90px;\n\tleft: 90px;\n\ttop: 45px;\n\tbottom: 45px;\n\tz-index: 120;\n\tmax-width: 1740px; /* To ensure that theme screenshots are not displayed larger than 880px wide. */\n}\n\n.wp-customizer .theme-overlay .theme-actions {\n\ttext-align: left; /* Because there's only one action, match the pattern of media modals and right-align the action. */\n}\n\n.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content {\n\toverflow: visible; /* Prevent the top-level Customizer controls from becoming visible when elements on the right of the details modal are focused. */\n}\n\n.ie8 .wp-customizer .theme-overlay .theme-header,\n.ie8 .wp-customizer .theme-overlay .theme-about,\n.ie8 .wp-customizer .theme-overlay .theme-actions {\n\tposition: static;\n}\n\n/* Small Screens */\n@media (max-width:850px), (max-height:472px) {\n\t.wp-customizer .theme-overlay .theme-wrap {\n\t\tright: 0;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t}\n}\n\n/* Handle cheaters. */\nbody.cheatin {\n\tfont-size: medium;\n\theight: auto;\n\tbackground: #fff;\n\tmargin: 50px auto 2em;\n\tpadding: 1em 2em;\n\tmax-width: 700px;\n\tmin-width: 0;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.13);\n}\n\nbody.cheatin h1 {\n\tborder-bottom: 1px solid #dadada;\n\tclear: both;\n\tcolor: #666;\n\tfont: 24px \"Open Sans\", sans-serif;\n\tmargin: 30px 0 0 0;\n\tpadding: 0;\n\tpadding-bottom: 7px;\n}\n\nbody.cheatin p {\n\tfont-size: 14px;\n\tline-height: 1.5;\n\tmargin: 25px 0 20px;\n}\n\n/**\n * Widgets and Menus common styles\n */\n\n/* higher specificity than .wp-core-ui .button-secondary */\n#customize-theme-controls .add-new-widget,\n#customize-theme-controls .add-new-menu-item {\n\tcursor: pointer;\n\tfloat: left;\n\tmargin-right: 10px;\n\t-webkit-transition: all 0.2s;\n\ttransition: all 0.2s;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\toutline: none;\n}\n\n.reordering .add-new-widget,\n.reordering .add-new-menu-item {\n\topacity: 0.2;\n\tpointer-events: none;\n\tcursor: not-allowed; /* doesn't work in conjunction with pointer-events */\n}\n\n.add-new-widget:before,\n.add-new-menu-item:before {\n\tcontent: \"\\f132\";\n\tdisplay: inline-block;\n\tposition: relative;\n\tright: -2px;\n\ttop: -1px;\n\tfont: normal 20px/1 dashicons;\n\tvertical-align: middle;\n\t-webkit-transition: all 0.2s;\n\ttransition: all 0.2s;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* Reordering */\n.reorder-toggle {\n\tfloat: left;\n\tpadding: 5px 8px;\n\ttext-decoration: none;\n\tcursor: pointer;\n\toutline: none;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.reorder-toggle:focus {\n\toutline: 1px dotted;\n}\n\n.reorder,\n.reordering .reorder-done {\n\tdisplay: block;\n\tpadding: 5px 8px;\n}\n\n.reorder-done,\n.reordering .reorder {\n\tdisplay: none;\n\tcolor: #0073aa;\n}\n\n.reorder-toggle:hover .reorder-done,\n.reorder-toggle:active .reorder-done,\n.reorder-toggle:focus .reorder-done {\n\tcolor: #00a0d2;\n}\n\n/* Responsive */\n.customize-controls-preview-toggle {\n\tdisplay: none;\n}\n\n@media only screen and (max-width: 782px) {\n\t.wp-customizer .theme:not(.active):hover .theme-actions,\n\t.wp-customizer .theme:not(.active):focus .theme-actions {\n\t\tdisplay: block;\n\t}\n\n\t.wp-customizer .theme-browser .theme.active .theme-name span {\n\t\tdisplay: inline;\n\t}\n\n\t.customize-control-radio label,\n\t.customize-control-checkbox label,\n\t.customize-control-nav_menu_auto_add label {\n\t\tmargin-right: 32px;\n\t}\n\n\t.customize-control-radio input,\n\t.customize-control-checkbox input,\n\t.customize-control-nav_menu_auto_add input {\n\t\tmargin-right: -32px;\n\t}\n\n\t.customize-control input[type=\"radio\"] + label,\n\t.customize-control input[type=\"checkbox\"] + label {\n\t\tline-height: 32px;\n\t}\n}\n\n@media screen and ( max-width: 640px ) {\n\t#customize-controls {\n\t\twidth: 100%;\n\t}\n\n\t.wp-full-overlay.expanded {\n\t\tmargin-right: 0;\n\t}\n\n\t.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {\n\t\tbottom: 0;\n\t}\n\n\t.customize-controls-preview-toggle {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tright: 48px;\n\t\tline-height: 45px;\n\t\tfont-size: 14px;\n\t\tpadding: 0 12px 0 12px;\n\t\tmargin: 0;\n\t\theight: 45px;\n\t\tbackground: #eee;\n\t\tborder-left: 1px solid #ddd;\n\t\tcolor: #444;\n\t\tcursor: pointer;\n\t\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\t\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n\t}\n\n\t#customize-footer-actions,\n\t#customize-preview,\n\t.customize-controls-preview-toggle .controls,\n\t.preview-only .wp-full-overlay-sidebar-content,\n\t.preview-only .customize-controls-preview-toggle .preview {\n\t\tdisplay: none;\n\t}\n\n\t.customize-controls-preview-toggle .preview:before,\n\t.customize-controls-preview-toggle .controls:before {\n\t\tfont: normal 20px/1 dashicons;\n\t\tcontent: \"\\f177\";\n\t\tposition: relative;\n\t\ttop: 4px;\n\t\tmargin-left: 6px;\n\t}\n\n\t.customize-controls-preview-toggle .controls:before {\n\t\tcontent: \"\\f540\";\n\t}\n\n\t.preview-only #customize-controls {\n\t\theight: 45px;\n\t}\n\n\t.preview-only #customize-preview,\n\t.preview-only .customize-controls-preview-toggle .controls {\n\t\tdisplay: block;\n\t}\n\n\t#customize-preview {\n\t\ttop: 45px;\n\t\tbottom: 0;\n\t\theight: auto;\n\t}\n\n\t.wp-core-ui.wp-customizer .button {\n\t\tpadding: 6px 14px;\n\t\tline-height: normal;\n\t\tfont-size: 14px;\n\t\tvertical-align: middle;\n\t\theight: auto;\n\t\tmargin-bottom: 4px;\n\t}\n\n\t#customize-header-actions .button-primary {\n\t\tmargin-top: 6px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/customize-controls.css",
    "content": "body {\n\toverflow: hidden;\n\t-webkit-text-size-adjust: 100%;\n}\n\n#customize-controls a {\n\ttext-decoration: none;\n}\n\n#customize-controls h3 {\n\tfont-size: 14px;\n}\n\n#customize-controls img {\n\tmax-width: 100%;\n}\n\n#customize-controls .submit {\n\ttext-align: center;\n}\n\n#customize-controls .description {\n\tcolor: #555;\n}\n\n#customize-header-actions .button-primary {\n\tfloat: right;\n\tmargin-top: 9px;\n}\n\n#customize-header-actions .spinner {\n\tmargin-top: 13px;\n\tmargin-right: 4px;\n}\n\n.saving #customize-header-actions .spinner {\n\tvisibility: visible;\n}\n\n#customize-header-actions {\n\tborder-bottom: 1px solid #ddd;\n}\n\n#customize-controls .wp-full-overlay-sidebar-content {\n\toverflow-y: auto;\n\toverflow-x: hidden;\n}\n\n#customize-controls .customize-info {\n\tborder: none;\n\tborder-top: 1px solid #ddd;\n\tborder-bottom: 1px solid #ddd;\n\tmargin-bottom: 15px;\n}\n\n#customize-controls .customize-info .accordion-section-title {\n\tbackground: #fff;\n\tcolor: #555;\n\tborder-left: none;\n\tborder-right: none;\n\tborder-bottom: none;\n\tcursor: default;\n}\n\n#customize-controls .customize-info.open .accordion-section-title:after,\n#customize-controls .customize-info .accordion-section-title:hover:after,\n#customize-controls .customize-info .accordion-section-title:focus:after {\n\tcolor: #333;\n}\n\n#customize-controls .customize-info .accordion-section-title:after {\n\tdisplay: none;\n}\n\n#customize-controls .customize-info .preview-notice {\n\tfont-size: 13px;\n\tline-height: 24px;\n}\n\n#customize-controls .control-section .customize-section-title h3,\n#customize-controls .control-section h3.customize-section-title,\n#customize-controls .customize-info .panel-title {\n\tfont-size: 20px;\n\tfont-weight: 200;\n\tline-height: 26px;\n\tdisplay: block;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n}\n\n#customize-controls .customize-section-title span.customize-action {\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n}\n\n#customize-controls .customize-info .customize-help-toggle {\n\tposition: absolute;\n\ttop: 4px;\n\tright: 1px;\n\tpadding: 20px 20px 10px 10px;\n\twidth: 20px;\n\theight: 20px;\n\tcursor: pointer;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\t-webkit-appearance: none;\n\tbackground: transparent;\n\tcolor: #555;\n\tborder: none;\n}\n\n#customize-controls .customize-info .customize-help-toggle:before {\n\tposition: absolute;\n\ttop: 5px;\n\tleft: 6px;\n}\n\n#customize-controls .customize-info.open .customize-help-toggle,\n#customize-controls .customize-info .customize-help-toggle:focus,\n#customize-controls .customize-info .customize-help-toggle:hover {\n\tcolor: #0073aa;\n}\n\n#customize-controls .customize-info .customize-panel-description,\n#customize-controls .no-widget-areas-rendered-notice {\n\tcolor: #555;\n\tdisplay: none;\n\tbackground: #fff;\n\tpadding: 12px 15px;\n\tborder-top: 1px solid #ddd;\n}\n#customize-controls .customize-info .customize-panel-description.open + .no-widget-areas-rendered-notice {\n\tborder-top: none;\n}\n\n#customize-controls .customize-info .customize-panel-description p:first-child {\n\tmargin-top: 0;\n}\n\n#customize-controls .customize-info .customize-panel-description p:last-child {\n\tmargin-bottom: 0;\n}\n\n#customize-controls .current-panel .control-section > h3.accordion-section-title {\n\tpadding-right: 30px;\n}\n\n#customize-theme-controls .control-section {\n\tborder: none;\n}\n\n#customize-theme-controls .accordion-section-title {\n\tcolor: #555;\n\tbackground-color: #fff;\n\tborder-bottom: 1px solid #eee;\n}\n\n#customize-theme-controls .accordion-section-title:after {\n\tcontent: \"\\f345\";\n}\n\n#customize-theme-controls .accordion-section-content {\n\tcolor: #555;\n\tbackground: transparent;\n}\n\n#customize-controls .control-section:hover > .accordion-section-title,\n#customize-controls .control-section .accordion-section-title:hover,\n#customize-controls .control-section.open .accordion-section-title,\n#customize-controls .control-section .accordion-section-title:focus {\n\tcolor: #23282d;\n\tbackground: #f5f5f5;\n}\n\n.js .control-section:hover .accordion-section-title,\n.js .control-section .accordion-section-title:hover,\n.js .control-section.open .accordion-section-title,\n.js .control-section .accordion-section-title:focus {\n\tbackground: #f5f5f5;\n}\n\n#customize-theme-controls .control-section:hover > .accordion-section-title:after,\n#customize-theme-controls .control-section .accordion-section-title:hover:after,\n#customize-theme-controls .control-section.open .accordion-section-title:after,\n#customize-theme-controls .control-section .accordion-section-title:focus:after {\n\tcolor: #23282d;\n}\n\n#customize-theme-controls .control-section.open {\n\tborder-bottom: 1px solid #eee;\n}\n\n#customize-theme-controls .control-section.open .accordion-section-title {\n\tborder-bottom-color: #eee !important;\n}\n\n#customize-theme-controls .control-section:last-of-type.open,\n#customize-theme-controls .control-section:last-of-type > .accordion-section-title {\n\tborder-bottom-color: #ddd;\n}\n\n#customize-theme-controls > ul {\n\tmargin: 0;\n}\n\n#customize-theme-controls .accordion-section-content {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 100%;\n\twidth: 100%;\n\tmargin: 0;\n\tpadding: 12px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.customize-section-description-container {\n\tmargin-bottom: 15px;\n}\n\n.customize-section-title {\n\tmargin: -12px -12px 0 -12px;\n\tborder-bottom: 1px solid #ddd;\n\tbackground: #fff;\n}\n\ndiv.customize-section-description {\n\tmargin-top: 22px;\n}\n\ndiv.customize-section-description p:first-child {\n\tmargin-top: 0;\n}\n\ndiv.customize-section-description p:last-child {\n\tmargin-bottom: 0;\n}\n\n#customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child {\n\tborder-bottom: 1px solid #ddd;\n\tpadding: 12px 12px 12px 12px;\n}\n\n.ios #customize-theme-controls .customize-themes-panel h3.customize-section-title:first-child {\n\tpadding: 12px 12px 13px 12px;\n}\n\n.customize-section-title h3,\nh3.customize-section-title {\n\tpadding: 10px 10px 12px 14px;\n\tmargin: 0;\n\tline-height: 21px;\n\tcolor: #555;\n}\n\n#customize-theme-controls {\n\tposition: relative;\n\tleft: 0;\n\t-webkit-transition: .18s left ease-in-out;\n\ttransition: .18s left ease-in-out;\n}\n\n.ios #customize-theme-controls {\n\t-webkit-transition: left 0s;\n\ttransition: left 0s;\n}\n\n.section-open #customize-info,\n.section-open #customize-theme-controls {\n\tleft: -100%;\n}\n\n.accordion-sub-container.control-panel-content {\n\tdisplay: none;\n\tposition: absolute;\n\tleft: 300px;\n\ttop: 0;\n\twidth: 300px;\n\t-webkit-transition: left ease-in-out .18s;\n\ttransition: left ease-in-out .18s;\n}\n\n.ios .accordion-sub-container.control-panel-content {\n\t-webkit-transition: left 0s;\n\ttransition: left 0s;\n}\n\n.accordion-sub-container.control-panel-content.animating {\n\tdisplay: block;\n}\n\n.current-panel .accordion-sub-container.control-panel-content {\n\twidth: 100%;\n}\n\n.customize-controls-close {\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 45px;\n\theight: 45px;\n\tpadding: 0 2px 0 0;\n\tbackground: #eee;\n\tborder: none;\n\tborder-right: 1px solid #ddd;\n\tcolor: #444;\n\ttext-align: left;\n\tcursor: pointer;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\n.customize-panel-back,\n.customize-section-back {\n\tdisplay: block;\n\tfloat: left;\n\twidth: 48px;\n\theight: 71px;\n\tpadding: 0 24px 0 0;\n\tmargin: 0;\n\tbackground: #fff;\n\tborder: none;\n\tborder-right: 1px solid #ddd;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcursor: pointer;\n\t-webkit-transition: left .18s ease-in-out, color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: left .18s ease-in-out, color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.customize-section-back {\n\theight: 74px;\n}\n\n.ios .customize-panel-back,\n.ios .customize-section-back {\n\t-webkit-transition: left 0s;\n\ttransition: left 0s;\n}\n\n.ios .customize-panel-back {\n\tdisplay: none;\n}\n\n.ios .expanded.in-sub-panel .customize-panel-back {\n\tdisplay: block;\n}\n\n.panel-meta.customize-info .accordion-section-title {\n\tmargin-left: 48px;\n}\n\n#customize-controls .panel-meta.customize-info .accordion-section-title:hover {\n\tbackground: #fff;\n\tcolor: #555;\n}\n\n.customize-controls-close:focus,\n.customize-controls-close:hover,\n.customize-controls-preview-toggle:focus,\n.customize-controls-preview-toggle:hover {\n\tbackground: #ddd;\n\tborder-color: #ccc;\n\tcolor: #000;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.customize-panel-back:hover,\n.customize-panel-back:focus,\n.customize-section-back:hover,\n.customize-section-back:focus {\n\tcolor: #23282d;\n\tbackground: #f5f5f5;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.customize-controls-close:before {\n\tfont: normal 22px/45px dashicons;\n\tcontent: \"\\f335\";\n\tposition: relative;\n\ttop: 1px;\n\tleft: 13px;\n}\n\n.customize-panel-back:before,\n.customize-section-back:before {\n\tfont: normal 20px/72px dashicons;\n\tcontent: \"\\f341\";\n\tposition: relative;\n\tleft: 13px;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-header {\n\t-webkit-transition: padding ease-in-out .18s;\n\ttransition: padding ease-in-out .18s;\n}\n\n.in-sub-panel .wp-full-overlay-sidebar .wp-full-overlay-header {\n\tpadding-left: 62px;\n}\n\n#customize-info,\n#customize-theme-controls > ul > .accordion-section {\n\tposition: relative;\n\tleft: 0;\n\t-webkit-transition: left ease-in-out .18s;\n\ttransition: left ease-in-out .18s;\n}\n\n.ios #customize-info,\n.ios #customize-theme-controls > ul > .accordion-section {\n\t-webkit-transition: left 0s;\n\ttransition: left 0s;\n}\n\n.in-sub-panel #customize-info,\n.in-sub-panel #customize-theme-controls > ul > .accordion-section {\n\tleft: -300px;\n\twidth: 300px;\n}\n\n.in-sub-panel #customize-theme-controls .accordion-section.current-panel {\n\twidth: 100%;\n}\n\n#customize-theme-controls .control-section.current-panel {\n\tpadding: 0;\n}\n\n#customize-theme-controls .control-section > h3.accordion-section-title {\n\tposition: relative;\n\tleft: 0;\n}\n\n#customize-theme-controls .control-section.current-panel > h3.accordion-section-title {\n\tleft: -354px;\n\t-webkit-transition: left ease-in-out .18s;\n\ttransition: left ease-in-out .18s;\n}\n\n.ios #customize-theme-controls .control-section.current-panel > h3.accordion-section-title {\n\t-webkit-transition: left 0s;\n\ttransition: left 0s;\n}\n\n.wp-full-overlay.section-open #customize-controls .wp-full-overlay-sidebar-content {\n\tvisibility: hidden;\n\toverflow-y: hidden;\n}\n\n.wp-full-overlay.section-open .wp-full-overlay-sidebar-content .accordion-section.open {\n\tvisibility: visible;\n}\n\n.wp-full-overlay.section-open .wp-full-overlay-sidebar-content .accordion-section.open .accordion-section-content {\n\toverflow-y: auto;\n}\n\np.customize-section-description {\n\tfont-style: normal;\n\tmargin-top: 22px;\n\tmargin-bottom: 0;\n}\n\n.customize-control {\n\twidth: 100%;\n\tfloat: left;\n\tclear: both;\n\tmargin-bottom: 12px;\n}\n\n.customize-control select,\n.customize-control input[type=\"radio\"],\n.customize-control input[type=\"checkbox\"] {\n\tline-height: 28px;\n}\n\n.customize-control input[type=\"text\"],\n.customize-control input[type=\"password\"],\n.customize-control input[type=\"email\"],\n.customize-control input[type=\"number\"],\n.customize-control input[type=\"search\"],\n.customize-control input[type=\"tel\"],\n.customize-control input[type=\"url\"] {\n\twidth: 98%;\n\tline-height: 18px;\n\tmargin: 0;\n}\n\n.customize-control-hidden {\n\tmargin: 0;\n}\n\n.customize-control-textarea textarea {\n\twidth: 100%;\n\tresize: vertical;\n}\n\n.customize-control select {\n\tmin-width: 50%;\n\tmax-width: 100%;\n\theight: 28px;\n\tline-height: 28px;\n}\n\n.customize-control select[multiple] {\n\theight: auto;\n}\n\n.customize-control-title {\n\tdisplay: block;\n\tfont-size: 14px;\n\tline-height: 24px;\n\tfont-weight: 600;\n\tmargin-bottom: 5px;\n}\n\n.customize-control-description {\n\tdisplay: block;\n\tfont-style: italic;\n\tline-height: 18px;\n\tmargin-bottom: 5px;\n}\n\n.customize-control-color .color-picker,\n.customize-control-upload div {\n\tline-height: 28px;\n}\n\n.customize-control-radio label,\n.customize-control-checkbox label,\n.customize-control-nav_menu_auto_add label {\n\tline-height: 20px;\n\tdisplay: block;\n\tmargin-left: 24px;\n\tpadding-top: 6px;\n\tpadding-bottom: 6px;\n}\n\n.customize-control-radio input,\n.customize-control-checkbox input,\n.customize-control-nav_menu_auto_add input {\n\tmargin-right: 4px;\n\tmargin-left: -24px;\n}\n\n.customize-control-radio {\n\tpadding: 5px 0 10px;\n}\n\n.customize-control-radio .customize-control-title {\n\tmargin-bottom: 0;\n\tline-height: 22px;\n}\n\n.customize-control-radio .customize-control-title + .customize-control-description {\n\tmargin-top: 7px;\n}\n\n.customize-control .attachment-thumb.type-icon {\n\tfloat: left;\n\tmargin: 10px;\n\twidth: auto;\n}\n\n.customize-control .attachment-title {\n\tfont-weight: bold;\n\tmargin: 0;\n\tpadding: 5px 10px;\n}\n\n.customize-control .attachment-meta {\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tmargin: 0;\n\tpadding: 0 10px;\n}\n\n.customize-control .attachment-meta-title {\n\tpadding-top: 7px;\n}\n\n.customize-control .thumbnail-image {\n\tline-height: 0;\n}\n\n.customize-control .thumbnail-image img {\n\tcursor: pointer;\n}\n\n#customize-controls .thumbnail-audio .thumbnail {\n\tmax-width: 64px;\n\tmax-height: 64px;\n\tmargin: 10px;\n\tfloat: left;\n}\n\n#customize-preview iframe {\n\twidth: 100%;\n\theight: 100%;\n}\n\n.wp-full-overlay-sidebar {\n\tbackground: #eee;\n\tborder-right: 1px solid #ddd;\n}\n\n/* Style for custom settings */\n\n/**\n * Dropdowns\n */\n\n.accordion-section .dropdown {\n\tfloat: left;\n\tdisplay: block;\n\tposition: relative;\n\tcursor: pointer;\n}\n\n.accordion-section .dropdown-content {\n\toverflow: hidden;\n\tfloat: left;\n\tmin-width: 30px;\n\theight: 16px;\n\tline-height: 16px;\n\tmargin-right: 16px;\n\tpadding: 4px 5px;\n\tborder: 2px solid #eee;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.customize-control .dropdown-arrow {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tright: 0;\n\twidth: 20px;\n\tbackground: #eee;\n}\n\n.customize-control .dropdown-arrow:after {\n\tcontent: \"\\f140\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: block;\n\tpadding: 0;\n\ttext-indent: 0;\n\ttext-align: center;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #32373c;\n}\n\n.customize-control .dropdown-status {\n\tcolor: #32373c;\n\tbackground: #eee;\n\tdisplay: none;\n\tmax-width: 112px;\n}\n\n/* Color Picker */\n.customize-control-color .color-picker-hex {\n\tdisplay: none;\n}\n\n.customize-control-color.open .color-picker-hex {\n\tdisplay: block;\n}\n\n.customize-control-color .dropdown {\n\tmargin-right: 5px;\n\tmargin-bottom: 5px;\n}\n\n.customize-control-color .dropdown .dropdown-content {\n\tbackground-color: #555;\n\tborder: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.customize-control-color .dropdown:hover .dropdown-content {\n\tborder-color: rgba(0, 0, 0, 0.25);\n}\n\n/**\n * iOS can't scroll iframes,\n * instead it expands the iframe size to match the size of the content\n */\n\n.ios .wp-full-overlay {\n\tposition: relative;\n}\n\n.ios #customize-preview {\n\tposition: relative;\n}\n\n.ios #customize-controls .wp-full-overlay-sidebar-content {\n\t-webkit-overflow-scrolling: touch;\n}\n\n/* Media controls */\n\n.customize-control-media .current,\n.customize-control-upload .current,\n.customize-control-image .current,\n.customize-control-background .current,\n.customize-control-cropped_image .current,\n.customize-control-site_icon .current,\n.customize-control-header .current {\n\tmargin-bottom: 8px;\n}\n\n.customize-control-header .uploaded {\n\tmargin-bottom: 18px;\n}\n\n.customize-control-header .uploaded button:not(.random),\n.customize-control-header .default button:not(.random) {\n\twidth: 100%;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcolor: inherit;\n\tcursor: pointer;\n}\n\n.customize-control-header button img {\n\tdisplay: block;\n}\n\n.customize-control-media .remove-button,\n.customize-control-media .default-button,\n.customize-control-media .upload-button,\n.customize-control-upload .remove-button,\n.customize-control-upload .default-button,\n.customize-control-upload .upload-button,\n.customize-control-image .remove-button,\n.customize-control-image .default-button,\n.customize-control-image .upload-button,\n.customize-control-background .remove-button,\n.customize-control-background .default-button,\n.customize-control-background .upload-button,\n.customize-control-cropped_image .remove-button,\n.customize-control-cropped_image .default-button,\n.customize-control-cropped_image .upload-button,\n.customize-control-site_icon .remove-button,\n.customize-control-site_icon .default-button,\n.customize-control-site_icon .upload-button,\n.customize-control-header button.new,\n.customize-control-header button.remove {\n\twhite-space: normal;\n\twidth: 48%;\n\theight: auto;\n}\n\n.customize-control-media .current .container,\n.customize-control-upload .current .container,\n.customize-control-image .current .container,\n.customize-control-background .current .container,\n.customize-control-cropped_image .current .container,\n.customize-control-site_icon .current .container,\n.customize-control-header .current .container {\n\toverflow: hidden;\n\t-webkit-border-radius: 2px;\n\tborder: 1px solid #eee;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n}\n\n.customize-control-media .current .container,\n.customize-control-upload .current .container,\n.customize-control-background .current .container,\n.customize-control-cropped_image .current .container,\n.customize-control-site_icon .current .container,\n.customize-control-image .current .container {\n\tmin-height: 40px;\n}\n\n.customize-control-media .placeholder,\n.customize-control-upload .placeholder,\n.customize-control-image .placeholder,\n.customize-control-background .placeholder,\n.customize-control-cropped_image .placeholder,\n.customize-control-site_icon .placeholder,\n.customize-control-header .placeholder {\n\twidth: 100%;\n\tposition: relative;\n\ttext-align: center;\n\tcursor: default;\n}\n\n.customize-control-media .inner,\n.customize-control-upload .inner,\n.customize-control-image .inner,\n.customize-control-background .inner,\n.customize-control-cropped_image .inner,\n.customize-control-site_icon .inner,\n.customize-control-header .inner {\n\tdisplay: none;\n\tposition: absolute;\n\twidth: 100%;\n\tcolor: #555;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n\n.customize-control-media .inner,\n.customize-control-upload .inner,\n.customize-control-background .inner,\n.customize-control-cropped_image .inner,\n.customize-control-site_icon .inner,\n.customize-control-image .inner {\n\tdisplay: block;\n\tmin-height: 40px;\n}\n\n.customize-control-media .inner,\n.customize-control-upload .inner,\n.customize-control-image .inner,\n.customize-control-background .inner,\n.customize-control-cropped_image .inner,\n.customize-control-site_icon .inner,\n.customize-control-header .inner,\n.customize-control-header .inner .dashicons {\n\tline-height: 20px;\n\ttop: 10px;\n}\n\n.customize-control-header .list .inner,\n.customize-control-header .list .inner .dashicons {\n\ttop: 9px;\n}\n\n.customize-control-header .header-view {\n\tposition: relative;\n\twidth: 100%;\n\tmargin-bottom: 5px;\n}\n\n.customize-control-header .header-view:last-child {\n\tmargin-bottom: 0px;\n}\n\n/* Convoluted, but 'outline' support isn't good enough yet */\n.customize-control-header .header-view:after {\n\tborder: 0;\n}\n.customize-control-header .header-view.selected:after {\n\tcontent: '';\n\tposition: absolute;\n\theight: auto;\n\ttop: 0; left: 0; bottom: 0; right: 0;\n\tborder: 4px solid #00a0d2;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n}\n.customize-control-header .header-view.button.selected {\n\tborder: 0;\n}\n\n/* Header control: overlay \"close\" button */\n\n.customize-control-header .uploaded .header-view .close {\n\tfont-size: 20px;\n\tcolor: #fff;\n\tbackground: #555;\n\tbackground: rgba(0, 0, 0, 0.5);\n\tposition: absolute;\n\ttop: 10px;\n\tright: -999px;\n\tz-index: 1;\n\twidth: 26px;\n\theight: 26px;\n\tcursor: pointer;\n}\n\n.customize-control-header .header-view:hover .close,\n.customize-control-header .header-view .close:focus {\n\tright: 10px;\n}\n\n/* Header control: randomiz(s)er */\n\n.customize-control-header .random.placeholder {\n\tcursor: pointer;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\theight: 40px;\n}\n\n.customize-control-header button.random {\n\twidth: 100%;\n\theight: auto;\n\tmin-height: 40px;\n\twhite-space: normal;\n}\n\n.customize-control-header button.random .dice {\n\tmargin-top: 4px;\n}\n\n.customize-control-header .placeholder:hover .dice,\n.customize-control-header .header-view:hover > button.random .dice {\n\t-webkit-animation: dice-color-change 3s infinite;\n\tanimation: dice-color-change 3s infinite;\n}\n\n@-webkit-keyframes dice-color-change {\n\t0% { color: #d4b146; }\n\t50% { color: #ef54b0; }\n\t75% { color: #7190d3; }\n\t100% { color: #d4b146; }\n}\n\n@keyframes dice-color-change {\n\t0% { color: #d4b146; }\n\t50% { color: #ef54b0; }\n\t75% { color: #7190d3; }\n\t100% { color: #d4b146; }\n}\n\n.customize-control-media .actions,\n.customize-control-upload .actions,\n.customize-control-image .actions,\n.customize-control-background .actions,\n.customize-control-cropped_image .actions,\n.customize-control-site_icon .actions,\n.customize-control-header .actions {\n\tmargin-bottom: 32px;\n}\n\n.customize-control-header .choice {\n\tposition: relative;\n\tdisplay: block;\n\tmargin-bottom: 9px;\n}\n\n.customize-control-header .uploaded div:last-child > .choice {\n\tmargin-bottom: 0;\n}\n\n.customize-control-media img,\n.customize-control-upload img,\n.customize-control-image img,\n.customize-control-background img,\n.customize-control-cropped_image img,\n.customize-control-site_icon img,\n.customize-control-header img {\n\twidth: 100%;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n}\n\n.customize-control-media .remove-button,\n.customize-control-media .default-button,\n.customize-control-upload .remove-button,\n.customize-control-upload .default-button,\n.customize-control-image .remove-button,\n.customize-control-image .default-button,\n.customize-control-background .remove-button,\n.customize-control-background .default-button,\n.customize-control-cropped_image .remove-button,\n.customize-control-cropped_image .default-button,\n.customize-control-site_icon .remove-button,\n.customize-control-site_icon .default-button,\n.customize-control-header .remove {\n\tfloat: left;\n\tmargin-right: 3px;\n}\n\n.customize-control-media .upload-button,\n.customize-control-upload .upload-button,\n.customize-control-image .upload-button,\n.customize-control-background .upload-button,\n.customize-control-cropped_image .upload-button,\n.customize-control-site_icon .upload-button,\n.customize-control-header .new {\n\tfloat: right;\n}\n\n/**\n * Themes\n */\n\n@-webkit-keyframes customize-reload {\n\t0%   { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n@keyframes customize-reload {\n\t0%   { opacity: 0; }\n\t100% { opacity: 1; }\n}\n\n/* #customize-container is reused from customize-loader.js, hence the naming. */\n.wp-customizer .customize-loading #customize-container {\n\tdisplay: block;\n\t-webkit-animation: customize-reload .75s; /* Can't use `transition` because `display` changes here. */\n\tanimation: customize-reload .75s;\n}\n\n.control-section-themes .accordion-section-title {\n\tcursor: default;\n}\n\n#customize-theme-controls .control-section-themes .accordion-section-title:hover,\n#customize-theme-controls .control-section-themes .accordion-section-title:focus {\n\tcolor: #555;\n\tbackground-color: #fff;\n}\n\n.control-section-themes .accordion-section-title {\n\tmargin: 15px 0;\n}\n\n.customize-themes-panel .accordion-section-title {\n\tmargin: 15px -8px;\n}\n\n.control-section-themes .accordion-section-title {\n\tpadding-right: 100px; /* Space for the button */\n}\n\n.control-section-themes .accordion-section-title span.customize-action,\n#customize-controls .customize-section-title span.customize-action {\n\tfont-size: 13px;\n\tdisplay: block;\n\tfont-weight: 400;\n}\n\n.control-section-themes .accordion-section-title .change-theme,\n.control-section-themes .accordion-section-title .customize-theme {\n\tposition: absolute;\n\tright: 10px;\n\ttop: 50%;\n\tmargin-top: -14px;\n\tfont-weight: normal;\n}\n\n.control-section-themes .accordion-section-title:before {\n\tdisplay: none;\n}\n\n.customize-themes-panel {\n\tdisplay: none;\n\tpadding: 0 8px;\n\tbackground: #f1f1f1;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.customize-themes-panel .accordion-section-title:first-child {\n\tmargin-top: 0;\n}\n\n#customize-controls .customize-themes-panel .accordion-section-title:nth-child(2) {\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n.customize-themes-panel > h2 {\n\tpadding: 15px 8px 0 8px;\n}\n\n.control-section.open .customize-themes-panel {\n\tdisplay: block;\n}\n\n#customize-theme-controls .customize-themes-panel .accordion-section-content {\n\tbackground: transparent;\n\tdisplay: block;\n}\n\n.customize-control.customize-control-theme {\n\tmargin-bottom: 8px;\n}\n\n#customize-theme-controls .themes.accordion-section-content {\n\tposition: relative;\n\tleft: 0;\n\tpadding: 0;\n\twidth: 100%;\n}\n\n.wp-customizer .theme-browser .themes {\n\tpadding-bottom: 8px;\n}\n\n.wp-customizer .theme-browser .theme {\n\tmargin: 0;\n\twidth: 100%;\n}\n\n.wp-customizer .theme-browser .theme .theme-actions {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n\topacity: 1;\n}\n\n#customize-controls h3.theme-name {\n\tfont-size: 15px;\n}\n\n#customize-controls .theme-overlay .theme-name {\n\tfont-size: 32px;\n}\n\n.wp-customizer #themes-filter {\n\tfont-size: 16px;\n\tfont-weight: 300;\n\tline-height: 1.5;\n\twidth: 100%;\n}\n\n#accordion-section-themes .accordion-section-title:after {\n\tdisplay: none;\n}\n\n#customize-theme-controls .control-section-themes.current-panel > h3.accordion-section-title {\n\tleft: 0;\n}\n\n.customize-themes-panel.control-panel-content {\n\tposition: absolute;\n\tleft: -100%;\n\ttop: 0;\n\twidth: 100%;\n\tborder-top: 1px solid #ddd;\n}\n\n.in-themes-panel #customize-info,\n.in-themes-panel #customize-theme-controls > ul > .accordion-section {\n\tleft: 100%;\n}\n\n/* Details View */\n.wp-customizer .theme-overlay {\n\tdisplay: none;\n}\n\n.wp-customizer.modal-open .theme-overlay {\n\tposition: fixed;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tz-index: 109;\n}\n\n.wp-customizer .theme-overlay .theme-backdrop {\n\tbackground: rgba( 238, 238, 238, 0.75 );\n\tposition: fixed;\n\tz-index: 110;\n}\n\n.wp-customizer .theme-overlay .theme-wrap {\n\tleft: 90px;\n\tright: 90px;\n\ttop: 45px;\n\tbottom: 45px;\n\tz-index: 120;\n\tmax-width: 1740px; /* To ensure that theme screenshots are not displayed larger than 880px wide. */\n}\n\n.wp-customizer .theme-overlay .theme-actions {\n\ttext-align: right; /* Because there's only one action, match the pattern of media modals and right-align the action. */\n}\n\n.modal-open .in-themes-panel #customize-controls .wp-full-overlay-sidebar-content {\n\toverflow: visible; /* Prevent the top-level Customizer controls from becoming visible when elements on the right of the details modal are focused. */\n}\n\n.ie8 .wp-customizer .theme-overlay .theme-header,\n.ie8 .wp-customizer .theme-overlay .theme-about,\n.ie8 .wp-customizer .theme-overlay .theme-actions {\n\tposition: static;\n}\n\n/* Small Screens */\n@media (max-width:850px), (max-height:472px) {\n\t.wp-customizer .theme-overlay .theme-wrap {\n\t\tleft: 0;\n\t\tright: 0;\n\t\ttop: 0;\n\t\tbottom: 0;\n\t}\n}\n\n/* Handle cheaters. */\nbody.cheatin {\n\tfont-size: medium;\n\theight: auto;\n\tbackground: #fff;\n\tmargin: 50px auto 2em;\n\tpadding: 1em 2em;\n\tmax-width: 700px;\n\tmin-width: 0;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.13);\n}\n\nbody.cheatin h1 {\n\tborder-bottom: 1px solid #dadada;\n\tclear: both;\n\tcolor: #666;\n\tfont: 24px \"Open Sans\", sans-serif;\n\tmargin: 30px 0 0 0;\n\tpadding: 0;\n\tpadding-bottom: 7px;\n}\n\nbody.cheatin p {\n\tfont-size: 14px;\n\tline-height: 1.5;\n\tmargin: 25px 0 20px;\n}\n\n/**\n * Widgets and Menus common styles\n */\n\n/* higher specificity than .wp-core-ui .button-secondary */\n#customize-theme-controls .add-new-widget,\n#customize-theme-controls .add-new-menu-item {\n\tcursor: pointer;\n\tfloat: right;\n\tmargin-left: 10px;\n\t-webkit-transition: all 0.2s;\n\ttransition: all 0.2s;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\toutline: none;\n}\n\n.reordering .add-new-widget,\n.reordering .add-new-menu-item {\n\topacity: 0.2;\n\tpointer-events: none;\n\tcursor: not-allowed; /* doesn't work in conjunction with pointer-events */\n}\n\n.add-new-widget:before,\n.add-new-menu-item:before {\n\tcontent: \"\\f132\";\n\tdisplay: inline-block;\n\tposition: relative;\n\tleft: -2px;\n\ttop: -1px;\n\tfont: normal 20px/1 dashicons;\n\tvertical-align: middle;\n\t-webkit-transition: all 0.2s;\n\ttransition: all 0.2s;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* Reordering */\n.reorder-toggle {\n\tfloat: right;\n\tpadding: 5px 8px;\n\ttext-decoration: none;\n\tcursor: pointer;\n\toutline: none;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.reorder-toggle:focus {\n\toutline: 1px dotted;\n}\n\n.reorder,\n.reordering .reorder-done {\n\tdisplay: block;\n\tpadding: 5px 8px;\n}\n\n.reorder-done,\n.reordering .reorder {\n\tdisplay: none;\n\tcolor: #0073aa;\n}\n\n.reorder-toggle:hover .reorder-done,\n.reorder-toggle:active .reorder-done,\n.reorder-toggle:focus .reorder-done {\n\tcolor: #00a0d2;\n}\n\n/* Responsive */\n.customize-controls-preview-toggle {\n\tdisplay: none;\n}\n\n@media only screen and (max-width: 782px) {\n\t.wp-customizer .theme:not(.active):hover .theme-actions,\n\t.wp-customizer .theme:not(.active):focus .theme-actions {\n\t\tdisplay: block;\n\t}\n\n\t.wp-customizer .theme-browser .theme.active .theme-name span {\n\t\tdisplay: inline;\n\t}\n\n\t.customize-control-radio label,\n\t.customize-control-checkbox label,\n\t.customize-control-nav_menu_auto_add label {\n\t\tmargin-left: 32px;\n\t}\n\n\t.customize-control-radio input,\n\t.customize-control-checkbox input,\n\t.customize-control-nav_menu_auto_add input {\n\t\tmargin-left: -32px;\n\t}\n\n\t.customize-control input[type=\"radio\"] + label,\n\t.customize-control input[type=\"checkbox\"] + label {\n\t\tline-height: 32px;\n\t}\n}\n\n@media screen and ( max-width: 640px ) {\n\t#customize-controls {\n\t\twidth: 100%;\n\t}\n\n\t.wp-full-overlay.expanded {\n\t\tmargin-left: 0;\n\t}\n\n\t.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {\n\t\tbottom: 0;\n\t}\n\n\t.customize-controls-preview-toggle {\n\t\tdisplay: block;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 48px;\n\t\tline-height: 45px;\n\t\tfont-size: 14px;\n\t\tpadding: 0 12px 0 12px;\n\t\tmargin: 0;\n\t\theight: 45px;\n\t\tbackground: #eee;\n\t\tborder-right: 1px solid #ddd;\n\t\tcolor: #444;\n\t\tcursor: pointer;\n\t\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\t\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n\t}\n\n\t#customize-footer-actions,\n\t#customize-preview,\n\t.customize-controls-preview-toggle .controls,\n\t.preview-only .wp-full-overlay-sidebar-content,\n\t.preview-only .customize-controls-preview-toggle .preview {\n\t\tdisplay: none;\n\t}\n\n\t.customize-controls-preview-toggle .preview:before,\n\t.customize-controls-preview-toggle .controls:before {\n\t\tfont: normal 20px/1 dashicons;\n\t\tcontent: \"\\f177\";\n\t\tposition: relative;\n\t\ttop: 4px;\n\t\tmargin-right: 6px;\n\t}\n\n\t.customize-controls-preview-toggle .controls:before {\n\t\tcontent: \"\\f540\";\n\t}\n\n\t.preview-only #customize-controls {\n\t\theight: 45px;\n\t}\n\n\t.preview-only #customize-preview,\n\t.preview-only .customize-controls-preview-toggle .controls {\n\t\tdisplay: block;\n\t}\n\n\t#customize-preview {\n\t\ttop: 45px;\n\t\tbottom: 0;\n\t\theight: auto;\n\t}\n\n\t.wp-core-ui.wp-customizer .button {\n\t\tpadding: 6px 14px;\n\t\tline-height: normal;\n\t\tfont-size: 14px;\n\t\tvertical-align: middle;\n\t\theight: auto;\n\t\tmargin-bottom: 4px;\n\t}\n\n\t#customize-header-actions .button-primary {\n\t\tmargin-top: 6px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/customize-nav-menus-rtl.css",
    "content": "#accordion-section-menu_locations {\n\tposition: relative;\n\tmargin-bottom: 15px;\n}\n\n.menu-in-location,\n.menu-in-locations {\n\tdisplay: block;\n\tfont-weight: 600;\n\tfont-size: 10px;\n}\n\n#customize-controls .theme-location-set,\n#customize-controls .control-section .accordion-section-title:focus .menu-in-location,\n#customize-controls .control-section .accordion-section-title:hover .menu-in-location,\n#customize-controls .control-section .accordion-section-title:focus .menu-in-locations,\n#customize-controls .control-section .accordion-section-title:hover .menu-in-locations {\n\tcolor: #555;\n}\n\n.wp-customizer .menu-item-bar .menu-item-handle,\n.wp-customizer .menu-item-settings,\n.wp-customizer .menu-item-settings .description-thin {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.wp-customizer .menu-item-bar {\n\tmargin: 0;\n}\n\n.wp-customizer .menu-item-bar .menu-item-handle {\n\twidth: 100%;\n\tbackground: #fff;\n}\n\n.wp-customizer .menu-item-handle .item-title {\n\tmargin-left: 0;\n}\n\n.wp-customizer .menu-item-handle .item-type {\n\tpadding: 1px 5px 0 21px;\n\tfloat: left;\n\ttext-align: left;\n}\n\n.wp-customizer .menu-item-settings {\n\tmax-width: 100%;\n\toverflow: hidden;\n\tpadding: 10px;\n\tbackground: #eee;\n\tborder: 1px solid #999;\n\tborder-top: none;\n}\n\n.wp-customizer .menu-item-settings .description-thin {\n\twidth: 100%;\n\theight: auto;\n\tmargin: 0 0 8px 0;\n}\n\n.wp-customizer .menu-item-settings input[type=\"text\"] {\n\twidth: 100%;\n}\n\n.wp-customizer .menu-item-settings .submitbox {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.wp-customizer .menu-item-settings .link-to-original {\n\tpadding: 5px 0;\n\tborder: none;\n\tfont-style: normal;\n\tmargin: 0;\n\twidth: 100%;\n}\n\n.wp-customizer .menu-item .submitbox .submitdelete {\n\tdisplay: block;\n\tfloat: right;\n\tmargin: 6px 0 0;\n\tpadding: 0;\n\tcursor: pointer;\n}\n\n.wp-customizer .menu-item .submitbox .submitdelete:focus {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n/**\n * Menu items reordering styles\n */\n\n.menu-item-reorder-nav {\n\tdisplay: none;\n\tbackground-color: #fff;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.menu-item-reorder-nav button {\n\tposition: relative;\n\toverflow: hidden;\n\tfloat: right;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 40px;\n\tcolor: #82878c;\n\ttext-indent: -9999px;\n\tcursor: pointer;\n\tbackground: transparent;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n}\n\n.menu-item-reorder-nav button:before {\n\tdisplay: inline-block;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tfont: normal 20px/40px dashicons;\n\ttext-align: center;\n\ttext-indent: 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.menu-item-reorder-nav button:hover,\n.menu-item-reorder-nav button:focus {\n\tcolor: #191e23;\n\tbackground: #eee;\n}\n\n.menus-move-down:before {\n\tcontent: \"\\f347\";\n}\n\n.menus-move-up:before {\n\tcontent: \"\\f343\";\n}\n\n.menus-move-left:before {\n\tcontent: \"\\f345\";\n}\n\n.menus-move-right:before {\n\tcontent: \"\\f341\";\n}\n\n.move-up-disabled .menus-move-up,\n.move-down-disabled .menus-move-down,\n.move-right-disabled .menus-move-right,\n.move-left-disabled .menus-move-left {\n\tcolor: #d5d5d5 !important;\n\tbackground-color: #fff !important;\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.menu-item-reorder-nav:before {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tright: -10px;\n\twidth: 10px;\n\theight: 40px;\n\tbackground: -webkit-gradient(linear, right top, left top, from(rgba(250,250,250,0)), to(rgba(250,250,250,1)));\n\tbackground: -webkit-linear-gradient(right, rgba(250,250,250,0) 0%, rgba(250,250,250,1) 100%);\n\tbackground: linear-gradient(to left, rgba(250,250,250,0) 0%, rgba(250,250,250,1) 100%);\n}\n\n.reordering .menu-item .item-controls,\n.reordering .menu-item .item-type {\n\tdisplay: none;\n}\n\n.reordering .menu-item-reorder-nav {\n\tdisplay: block;\n}\n\n.customize-control input.menu-name-field {\n\twidth: 100%; /* Override the 98% default for customizer inputs, to align with the size of menu items. */\n\tmargin: 12px 0;\n}\n\n.wp-customizer .menu-item .item-edit {\n\tposition: absolute;\n\tleft: -19px;\n\ttop: 2px;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 38px;\n\tmargin-left: 0 !important;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\toverflow: hidden;\n\tcursor: pointer;\n}\n\n.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:after {\n\tcontent: \"\\f142\";\n}\n\n.wp-customizer .menu-item-settings p.description {\n\tfont-style: normal;\n}\n\n.wp-customizer .menu-settings dl {\n\tmargin: 12px 0 0 0;\n\tpadding: 0;\n}\n\n.wp-customizer .menu-settings .checkbox-input {\n\tmargin-top: 8px;\n}\n\n.wp-customizer .menu-settings .menu-theme-locations {\n\tborder-top: 1px solid #ccc;\n}\n\n.wp-customizer .menu-settings {\n\tmargin-top: 36px;\n\tborder-top: none;\n}\n\n.menu-settings .customize-control-checkbox label {\n\tline-height: 1;\n}\n\n/* @todo update selector or potentially remove */\n.menu-settings .customize-control.customize-control-checkbox {\n\tmargin-bottom: 8px; /* Override collapsing at smaller viewports. */\n}\n\n.customize-control-menu {\n\tmargin-top: 4px;\n}\n\n#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle {\n\tcolor: #555;\n}\n\n/* Screen Options */\n.customize-screen-options-toggle {\n\tbackground: none;\n\tborder: none;\n\tcolor: #555;\n\tcursor: pointer;\n\tmargin: 0;\n\tpadding: 20px;\n\tposition: absolute;\n\tleft: 0;\n\ttop: 30px;\n}\n\n#customize-controls .customize-info .customize-help-toggle {\n\tpadding: 20px;\n}\n\n#customize-controls .customize-info .customize-help-toggle:before {\n\tpadding: 4px;\n}\n\n.customize-screen-options-toggle:hover,\n.customize-screen-options-toggle:active,\n.customize-screen-options-toggle:focus,\n.active-menu-screen-options .customize-screen-options-toggle,\n#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,\n#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,\n#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {\n\tcolor: #0073aa;\n}\n\n.customize-screen-options-toggle:focus,\n#customize-controls .customize-info .customize-help-toggle:focus {\n\toutline: none;\n}\n\n.customize-screen-options-toggle:before {\n\t-moz-osx-font-smoothing: grayscale;\n\tborder: none;\n\tcontent: \"\\f111\";\n\tdisplay: block;\n\tfont: 18px/1 dashicons;\n\tpadding: 5px;\n\ttext-align: center;\n\ttext-decoration: none !important;\n\ttext-indent: 0;\n\tright: 6px;\n\tposition: absolute;\n\ttop: 6px;\n}\n\n.customize-screen-options-toggle:focus:before,\n#customize-controls .customize-info .customize-help-toggle:focus:before {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\t-webkit-border-radius: 100%;\n\tborder-radius: 100%;\n}\n\n.wp-customizer #screen-options-wrap {\n\tdisplay: none;\n\tbackground: #fff;\n\tborder-top: 1px solid #ddd;\n\tpadding: 4px 15px 15px;\n}\n\n.wp-customizer .metabox-prefs label {\n\tdisplay: block;\n\tpadding-left: 0;\n\tline-height: 30px;\n}\n\n/* rework the arrow indicator implementation for NVDA bug same as #32715 */\n.wp-customizer .toggle-indicator {\n\tdisplay: inline-block;\n\tfont-size: 20px;\n\tline-height: 1;\n\ttext-indent: -1px; /* account for the dashicon alignment */\n}\n\n.rtl .wp-customizer .toggle-indicator {\n\ttext-indent: 1px; /* account for the dashicon alignment */\n}\n\n.wp-customizer .toggle-indicator:after {\n\tcontent: \"\\f140\";\n\tspeak: none;\n\tvertical-align: top;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tcolor: #a0a5aa;\n\tfont: normal 20px/1 dashicons;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n}\n\n.wp-customizer button:focus .toggle-indicator:after {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#accordion-panel-nav_menus .field-link-target,\n#accordion-panel-nav_menus .field-attr-title,\n#accordion-panel-nav_menus .field-css-classes,\n#accordion-panel-nav_menus .field-xfn,\n#accordion-panel-nav_menus .field-description {\n\tdisplay: none;\n}\n\n#accordion-panel-nav_menus.field-link-target-active .field-link-target,\n#accordion-panel-nav_menus.field-attr-title-active .field-attr-title,\n#accordion-panel-nav_menus.field-css-classes-active .field-css-classes,\n#accordion-panel-nav_menus.field-xfn-active .field-xfn,\n#accordion-panel-nav_menus.field-description-active .field-description {\n\tdisplay: block;\n}\n\n/* WARNING: The 20px factor is hard-coded in JS. */\n.menu-item-depth-0  { margin-right: 0;     }\n.menu-item-depth-1  { margin-right: 20px;  }\n.menu-item-depth-2  { margin-right: 40px;  }\n.menu-item-depth-3  { margin-right: 60px;  }\n.menu-item-depth-4  { margin-right: 80px;  }\n.menu-item-depth-5  { margin-right: 100px; }\n.menu-item-depth-6  { margin-right: 120px; }\n.menu-item-depth-7  { margin-right: 140px; }\n.menu-item-depth-8  { margin-right: 160px; } /* Not likely to be used or useful beyond this depth */\n.menu-item-depth-9  { margin-right: 180px; }\n.menu-item-depth-10 { margin-right: 200px; }\n.menu-item-depth-11 { margin-right: 220px; }\n\n/* @todo handle .menu-item-settings width */\n.menu-item-depth-0  > .menu-item-bar { margin-left: 0;     }\n.menu-item-depth-1  > .menu-item-bar { margin-left: 20px;  }\n.menu-item-depth-2  > .menu-item-bar { margin-left: 40px;  }\n.menu-item-depth-3  > .menu-item-bar { margin-left: 60px;  }\n.menu-item-depth-4  > .menu-item-bar { margin-left: 80px;  }\n.menu-item-depth-5  > .menu-item-bar { margin-left: 100px; }\n.menu-item-depth-6  > .menu-item-bar { margin-left: 120px; }\n.menu-item-depth-7  > .menu-item-bar { margin-left: 140px; }\n.menu-item-depth-8  > .menu-item-bar { margin-left: 160px; }\n.menu-item-depth-9  > .menu-item-bar { margin-left: 180px; }\n.menu-item-depth-10 > .menu-item-bar { margin-left: 200px; }\n.menu-item-depth-11 > .menu-item-bar { margin-left: 220px; }\n\n/* Submenu left margin. */\n.menu-item-depth-0  .menu-item-transport { margin-right: 0;      }\n.menu-item-depth-1  .menu-item-transport { margin-right: -20px;  }\n.menu-item-depth-3  .menu-item-transport { margin-right: -60px;  }\n.menu-item-depth-4  .menu-item-transport { margin-right: -80px;  }\n.menu-item-depth-2  .menu-item-transport { margin-right: -40px;  }\n.menu-item-depth-5  .menu-item-transport { margin-right: -100px; }\n.menu-item-depth-6  .menu-item-transport { margin-right: -120px; }\n.menu-item-depth-7  .menu-item-transport { margin-right: -140px; }\n.menu-item-depth-8  .menu-item-transport { margin-right: -160px; }\n.menu-item-depth-9  .menu-item-transport { margin-right: -180px; }\n.menu-item-depth-10 .menu-item-transport { margin-right: -200px; }\n.menu-item-depth-11 .menu-item-transport { margin-right: -220px; }\n\n/* WARNING: The 20px factor is hard-coded in JS. */\n.reordering .menu-item-depth-0  { margin-right: 0;     }\n.reordering .menu-item-depth-1  { margin-right: 15px;  }\n.reordering .menu-item-depth-2  { margin-right: 30px;  }\n.reordering .menu-item-depth-3  { margin-right: 45px;  }\n.reordering .menu-item-depth-4  { margin-right: 60px;  }\n.reordering .menu-item-depth-5  { margin-right: 75px;  }\n.reordering .menu-item-depth-6  { margin-right: 90px;  }\n.reordering .menu-item-depth-7  { margin-right: 105px; }\n.reordering .menu-item-depth-8  { margin-right: 120px; } /* Not likely to be used or useful beyond this depth */\n.reordering .menu-item-depth-9  { margin-right: 135px; }\n.reordering .menu-item-depth-10 { margin-right: 150px; }\n.reordering .menu-item-depth-11 { margin-right: 165px; }\n\n.reordering .menu-item-depth-0  > .menu-item-bar { margin-left: 0;     }\n.reordering .menu-item-depth-1  > .menu-item-bar { margin-left: 15px;  }\n.reordering .menu-item-depth-2  > .menu-item-bar { margin-left: 30px;  }\n.reordering .menu-item-depth-3  > .menu-item-bar { margin-left: 45px;  }\n.reordering .menu-item-depth-4  > .menu-item-bar { margin-left: 60px;  }\n.reordering .menu-item-depth-5  > .menu-item-bar { margin-left: 75px;  }\n.reordering .menu-item-depth-6  > .menu-item-bar { margin-left: 90px;  }\n.reordering .menu-item-depth-7  > .menu-item-bar { margin-left: 105px; }\n.reordering .menu-item-depth-8  > .menu-item-bar { margin-left: 120px; }\n.reordering .menu-item-depth-9  > .menu-item-bar { margin-left: 135px; }\n.reordering .menu-item-depth-10 > .menu-item-bar { margin-left: 150px; }\n.reordering .menu-item-depth-11 > .menu-item-bar { margin-left: 165px; }\n\n.control-section-nav_menu .menu .menu-item-edit-active {\n\tmargin-right: 0;\n}\n\n.control-section-nav_menu .menu .menu-item-edit-active .menu-item-bar {\n\tmargin-left: 0;\n}\n\n.control-section-nav_menu .menu .sortable-placeholder {\n\tmargin-top: 0;\n\tmargin-bottom: 1px;\n\tmax-width: -webkit-calc(100% - 2px);\n\tmax-width: calc(100% - 2px);\n\tfloat: right;\n\tdisplay: list-item;\n\tborder-color: #a0a5aa;\n}\n\n.menu-item-transport li.customize-control {\n\tfloat: none;\n}\n\n.control-section-nav_menu .menu ul.menu-item-transport .menu-item-bar {\n\tmargin-top: 0;\n}\n\n/**\n * Add-menu-items mode\n */\n\n.wp-full-overlay-main {\n\tleft: auto; /* This overrides a right: 0; which causes the preview to resize rather than slide off screen at the normal size. */\n\twidth: 100%;\n}\n\n.adding-menu-items .control-section {\n\topacity: .4;\n}\n\n.adding-menu-items .control-panel.control-section,\n.adding-menu-items .control-section.open {\n\topacity: 1;\n}\n\n.adding-menu-items .add-new-menu-item,\n.adding-menu-items .add-new-menu-item:hover,\n.add-menu-toggle.open,\n.add-menu-toggle.open:hover {\n\tbackground: #eee;\n\tborder-color: #929793;\n\tcolor: #32373c;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);\n\tbox-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);\n}\n\n.adding-menu-items .add-new-menu-item:before,\n#accordion-section-add_menu .add-new-menu-item.open:before {\n\t-webkit-transform: rotate(-45deg);\n\t-ms-transform: rotate(-45deg);\n\ttransform: rotate(-45deg);\n}\n\n.menu-item-bar .item-delete {\n\tcolor: #a00;\n\tposition: absolute;\n\ttop: 2px;\n\tleft: -19px;\n\twidth: 30px;\n\theight: 38px;\n\tcursor: pointer;\n\tdisplay: none;\n}\n\n.menu-item-bar .item-delete:before {\n\tcontent: \"\\f335\";\n\tposition: absolute;\n\ttop: 9px;\n\tright: 5px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tfont: normal 20px/1 dashicons;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.ie8 .menu-item-bar .item-delete:before {\n\ttop: -10px;\n}\n\n.menu-item-bar .item-delete:hover,\n.menu-item-bar .item-delete:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\tcolor: #f00;\n}\n\n.menu-item-bar .item-delete:focus:before {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.adding-menu-items .menu-item-bar .item-edit {\n\tdisplay: none;\n}\n\n.adding-menu-items .menu-item-bar .item-delete {\n\tdisplay: block;\n}\n\n#available-menu-items .item {\n\tposition: static;\n}\n\n#available-menu-items {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tright: -301px;\n\tvisibility: hidden;\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\twidth: 300px;\n\tmargin: 0;\n\tz-index: 4;\n\tbackground: #eee;\n\t-webkit-transition: right .18s;\n\ttransition: right .18s;\n\tborder-left: 1px solid #ddd;\n}\n\n#available-menu-items.opening {\n\toverflow-y: hidden; /* avoid scrollbar jitter with animating heights */\n}\n\n#available-menu-items #available-menu-items-search.open {\n\theight: 100%;\n\tborder-bottom: none;\n}\n\n#available-menu-items .accordion-section-title {\n\tborder-right: none;\n\tborder-left: none;\n\tbackground: #fff;\n\t-webkit-transition: background-color 0.15s;\n\ttransition: background-color 0.15s;\n}\n\n#available-menu-items .open .accordion-section-title,\n#available-menu-items #available-menu-items-search .accordion-section-title {\n\tbackground: #eee;\n}\n\n/* rework the arrow indicator implementation for NVDA bug see #32715 */\n#available-menu-items .accordion-section-title:after {\n\tcontent: none !important;\n}\n\n#available-menu-items .accordion-section-title:hover .toggle-indicator:after {\n\tcolor: #777;\n}\n\n#available-menu-items .open .accordion-section-title .toggle-indicator:after {\n\tcontent: \"\\f142\";\n}\n\n#available-menu-items .accordion-section-content {\n\toverflow-y: auto;\n\tmax-height: 200px; /* This gets set in JS to fit the screen size, and based on # of sections. */\n\tbackground: transparent;\n}\n\n#available-menu-items .accordion-section-title button {\n\tdisplay: block;\n\twidth: 28px;\n\theight: 35px;\n\tposition: absolute;\n\ttop: 5px;\n\tleft: 5px;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\tcursor: pointer;\n}\n\n#available-menu-items .accordion-section-title .no-items,\n#available-menu-items .cannot-expand .accordion-section-title .spinner,\n#available-menu-items .cannot-expand .accordion-section-title > button {\n\tdisplay: none;\n}\n\n#available-menu-items-search.cannot-expand .accordion-section-title .spinner {\n\tdisplay: block;\n}\n\n#available-menu-items .cannot-expand .accordion-section-title .no-items {\n\tdisplay: block;\n\tcolor: #777;\n\tfont-weight: normal;\n\tfloat: left;\n\tmargin-right: 5px;\n}\n\n#available-menu-items .accordion-section-content {\n\tpadding: 1px 15px 15px 15px;\n\tmargin: 0;\n\tmax-height: 290px;\n}\n\n#available-menu-items #available-menu-items-search .accordion-section-content {\n\tposition: absolute;\n\tright: 1px;\n\ttop: 60px; /* below title div / search input */\n\tbottom: 0px; /* 100% height that still triggers lazy load */\n\tmax-height: none;\n\twidth: 100%;\n\tpadding: 1px 15px 15px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#available-menu-items .menu-item-tpl {\n\tmargin: 0;\n}\n\n#custom-menu-item-name.invalid,\n#custom-menu-item-url.invalid,\n.menu-name-field.invalid,\n.menu-name-field.invalid:focus {\n\tborder: 1px solid #f00;\n}\n\n#available-menu-items .item-tpl {\n\tposition: relative;\n\tpadding: 20px 60px 20px 15px;\n\tborder-bottom: 1px solid #e4e4e4;\n\tcursor: pointer;\n\tdisplay: none;\n}\n\n#available-menu-items .item-tpl:hover,\n#available-menu-items .item-tpl.selected {\n\tbackground: #eee;\n}\n\n#available-menu-items .menu-item-handle .item-type {\n\tpadding-left: 0;\n}\n\n#available-menu-items .menu-item-handle .item-title {\n\tpadding-right: 20px;\n}\n\n#available-menu-items .menu-item-handle {\n\tcursor: pointer;\n}\n\n#available-menu-items .item-top,\n#available-menu-items .item-top:hover {\n\tborder: none;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#available-menu-items .menu-item-handle {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tmargin-top: -1px;\n}\n\n#available-menu-items .menu-item-handle:hover {\n\tz-index: 1;\n}\n\n#available-menu-items .item-title h4 {\n\tpadding: 0 0 5px;\n\tfont-size: 14px;\n}\n\n#available-menu-items .item-add {\n\tposition: absolute;\n\ttop: 1px;\n\tright: 1px;\n\tcolor: #82878c;\n\twidth: 30px;\n\theight: 38px;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\tcursor: pointer;\n}\n\n#available-menu-items .menu-item-handle .item-add:focus {\n\tcolor: #23282d;\n}\n\n#available-menu-items .item-add:before {\n\tcontent: \"\\f543\";\n\tposition: relative;\n\tright: 2px;\n\ttop: 3px;\n\tdisplay: inline-block;\n\theight: 20px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tfont: normal 20px/1.05 dashicons; /* line height is to account for the dashicon's vertical alignment */\n}\n\n#available-menu-items .item-add:focus:before {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#available-menu-items .menu-item-handle.item-added .item-type,\n#available-menu-items .menu-item-handle.item-added .item-title,\n#available-menu-items .menu-item-handle.item-added:hover .item-add,\n#available-menu-items .menu-item-handle.item-added .item-add:focus {\n\tcolor: #82878c;\n}\n\n#available-menu-items .menu-item-handle.item-added .item-add:before {\n\tcontent: \"\\f147\";\n}\n\n#available-menu-items .accordion-section-title.loading .spinner,\n#available-menu-items-search.loading .accordion-section-title .spinner {\n\tvisibility: visible;\n\tmargin: 0 20px;\n}\n\n#available-menu-items-search .clear-results {\n\tposition: absolute;\n\ttop: 20px;\n\tleft: 20px;\n\twidth: 20px;\n\theight: 20px;\n\tcursor: pointer;\n\tcolor: #a00;\n\ttext-decoration: none;\n}\n\n#available-menu-items-search .clear-results,\n#available-menu-items-search.loading .clear-results.is-visible {\n\tdisplay: none;\n}\n\n#available-menu-items-search .clear-results.is-visible {\n\tdisplay: block;\n}\n\n#available-menu-items-search .clear-results:before {\n\tcontent: \"\\f335\";\n\tfont: normal 20px/1 dashicons;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#available-menu-items-search .clear-results:hover,\n#available-menu-items-search .clear-results:focus {\n\tcolor: #f00;\n}\n\n#available-menu-items-search .clear-results:focus {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#available-menu-items-search .spinner {\n\tposition: absolute;\n\ttop: 20px;\n\tmargin: 0 !important;\n\tleft: 20px;\n}\n\n#available-menu-items-search input {\n\tpadding: 6px 10px;\n\twidth: 100%;\n}\n\n#available-menu-items-search .accordion-section-title {\n\tpadding: 12px 15px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#available-menu-items-search .accordion-section-title:after {\n\tdisplay: none;\n}\n\n#available-menu-items-search .accordion-section-content:empty {\n\tmin-height: 0;\n\tpadding: 0;\n}\n\n#available-menu-items-search.loading .accordion-section-content div {\n\topacity: .5;\n}\n\n#available-menu-items-search.loading.loading-more .accordion-section-content div {\n\topacity: 1;\n}\n\n#customize-preview {\n\t-webkit-transition: all 0.2s;\n\ttransition: all 0.2s;\n}\n\nbody.adding-menu-items #available-menu-items {\n\tright: 0;\n\tvisibility: visible;\n}\n\nbody.adding-menu-items .wp-full-overlay-main {\n\tright: 300px;\n}\n\nbody.adding-menu-items #customize-preview {\n\topacity: 0.4;\n}\n\n.menu-item-handle .spinner {\n\tdisplay: none;\n\tfloat: right;\n\tmargin: 0 0 0 8px;\n}\n\n.nav-menu-inserted-item-loading .spinner {\n\tdisplay: block;\n}\n\n.nav-menu-inserted-item-loading .menu-item-handle .item-type {\n\tpadding: 0 8px 0 0;\n}\n\n.nav-menu-inserted-item-loading .menu-item-handle,\n.added-menu-item .menu-item-handle.loading {\n\tpadding: 10px 8px 10px 15px;\n\tcursor: default;\n\topacity: .5;\n\tbackground: #fff;\n\tcolor: #727773;\n}\n\n.added-menu-item .menu-item-handle {\n\t-webkit-transition-property: opacity, background, color;\n\ttransition-property: opacity, background, color;\n\t-webkit-transition-duration: 1.25s;\n\ttransition-duration: 1.25s;\n\t-webkit-transition-timing-function: cubic-bezier( .25, -2.5, .75, 8 );\n\ttransition-timing-function: cubic-bezier( .25, -2.5, .75, 8 ); /* Replacement for .hide().fadeIn('slow') in JS to add emphasis when it's loaded. */\n}\n\n/* Add/delete Menus */\n\n/* @todo update selector */\n#accordion-section-add_menu {\n\tmargin: 15px 12px;\n}\n\n.new-menu-section-content {\n\tdisplay: none;\n\tpadding: 15px 0 0 0;\n\tclear: both;\n}\n\n/* @todo update selector */\n#accordion-section-add_menu .accordion-section-title {\n\tpadding-right: 45px;\n}\n\n/* @todo update selector */\n#accordion-section-add_menu .accordion-section-title:before {\n\tfont: normal 20px/1 dashicons;\n\tposition: absolute;\n\ttop: 12px;\n\tright: 14px;\n\tcontent: \"\\f132\";\n}\n\n#create-new-menu-submit {\n\tfloat: left;\n\tmargin: 0 0 12px 0;\n}\n\n.menu-delete-item {\n\tdisplay: block;\n\tfloat: right;\n\tpadding: 1em 0;\n\twidth: 100%;\n}\n\nli.assigned-to-menu-location .menu-delete-item {\n\tdisplay: none;\n}\n\nli.assigned-to-menu-location .add-new-menu-item {\n\tmargin-bottom: 1em;\n}\n\n.menu-delete {\n\tcolor: #a00;\n\tcursor: pointer;\n\ttext-decoration: underline;\n}\n\n.menu-delete:hover,\n.menu-delete:focus {\n\tcolor: #f00;\n\ttext-decoration: none;\n}\n\n.menu-delete:focus {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.menu-item-handle {\n\tmargin-top: -1px;\n}\n.ui-sortable-disabled .menu-item-handle {\n\tcursor: default;\n}\n\n.menu-item-handle:hover {\n\tposition: relative;\n\tz-index: 10;\n\tcolor: #0073aa;\n}\n\n.menu-item-handle:hover .item-type,\n.menu-item-handle:hover .item-edit,\n#available-menu-items .menu-item-handle:hover .item-add {\n\tcolor: #0073aa;\n}\n\n.menu-item-edit-active .menu-item-handle {\n\tborder-color: #999;\n\tborder-bottom: none;\n}\n\n.customize-control-nav_menu_item {\n\tmargin-bottom: 0;\n}\n\n.customize-control-nav_menu {\n\tmargin-top: 12px;\n}\n\n#available-menu-items .customize-section-title {\n\tdisplay: none;\n}\n\n@media screen and ( max-width: 782px ) {\n\t#available-menu-items #available-menu-items-search .accordion-section-content {\n\t\ttop: 63px;\n\t}\n}\n\n@media screen and ( max-width: 640px ) {\n\tbody.adding-menu-items div#available-menu-items {\n\t\ttop: 46px;\n\t\tright: 0;\n\t\tz-index: 10;\n\t\twidth: 100%;\n\t}\n\n\t#available-menu-items #available-menu-items-search .accordion-section-content {\n\t\ttop: 133px;\n\t}\n\n\t#available-menu-items .customize-section-title {\n\t\tdisplay: block;\n\t\tmargin: 0;\n\t}\n\n\t#available-menu-items .customize-section-back {\n\t\theight: 69px;\n\t}\n\n\t#available-menu-items .customize-section-title h3 {\n\t\tfont-size: 20px;\n\t\tfont-weight: 200;\n\t\tpadding: 9px 14px 12px 10px;\n\t\tmargin: 0;\n\t\tline-height: 24px;\n\t\tcolor: #555;\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t#available-menu-items .customize-section-title .customize-action {\n\t\tfont-size: 13px;\n\t\tdisplay: block;\n\t\tfont-weight: 400;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/customize-nav-menus.css",
    "content": "#accordion-section-menu_locations {\n\tposition: relative;\n\tmargin-bottom: 15px;\n}\n\n.menu-in-location,\n.menu-in-locations {\n\tdisplay: block;\n\tfont-weight: 600;\n\tfont-size: 10px;\n}\n\n#customize-controls .theme-location-set,\n#customize-controls .control-section .accordion-section-title:focus .menu-in-location,\n#customize-controls .control-section .accordion-section-title:hover .menu-in-location,\n#customize-controls .control-section .accordion-section-title:focus .menu-in-locations,\n#customize-controls .control-section .accordion-section-title:hover .menu-in-locations {\n\tcolor: #555;\n}\n\n.wp-customizer .menu-item-bar .menu-item-handle,\n.wp-customizer .menu-item-settings,\n.wp-customizer .menu-item-settings .description-thin {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.wp-customizer .menu-item-bar {\n\tmargin: 0;\n}\n\n.wp-customizer .menu-item-bar .menu-item-handle {\n\twidth: 100%;\n\tbackground: #fff;\n}\n\n.wp-customizer .menu-item-handle .item-title {\n\tmargin-right: 0;\n}\n\n.wp-customizer .menu-item-handle .item-type {\n\tpadding: 1px 21px 0 5px;\n\tfloat: right;\n\ttext-align: right;\n}\n\n.wp-customizer .menu-item-settings {\n\tmax-width: 100%;\n\toverflow: hidden;\n\tpadding: 10px;\n\tbackground: #eee;\n\tborder: 1px solid #999;\n\tborder-top: none;\n}\n\n.wp-customizer .menu-item-settings .description-thin {\n\twidth: 100%;\n\theight: auto;\n\tmargin: 0 0 8px 0;\n}\n\n.wp-customizer .menu-item-settings input[type=\"text\"] {\n\twidth: 100%;\n}\n\n.wp-customizer .menu-item-settings .submitbox {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.wp-customizer .menu-item-settings .link-to-original {\n\tpadding: 5px 0;\n\tborder: none;\n\tfont-style: normal;\n\tmargin: 0;\n\twidth: 100%;\n}\n\n.wp-customizer .menu-item .submitbox .submitdelete {\n\tdisplay: block;\n\tfloat: left;\n\tmargin: 6px 0 0;\n\tpadding: 0;\n\tcursor: pointer;\n}\n\n.wp-customizer .menu-item .submitbox .submitdelete:focus {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n/**\n * Menu items reordering styles\n */\n\n.menu-item-reorder-nav {\n\tdisplay: none;\n\tbackground-color: #fff;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n}\n\n.menu-item-reorder-nav button {\n\tposition: relative;\n\toverflow: hidden;\n\tfloat: left;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 40px;\n\tcolor: #82878c;\n\ttext-indent: -9999px;\n\tcursor: pointer;\n\tbackground: transparent;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n}\n\n.menu-item-reorder-nav button:before {\n\tdisplay: inline-block;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n\theight: 100%;\n\tfont: normal 20px/40px dashicons;\n\ttext-align: center;\n\ttext-indent: 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.menu-item-reorder-nav button:hover,\n.menu-item-reorder-nav button:focus {\n\tcolor: #191e23;\n\tbackground: #eee;\n}\n\n.menus-move-down:before {\n\tcontent: \"\\f347\";\n}\n\n.menus-move-up:before {\n\tcontent: \"\\f343\";\n}\n\n.menus-move-left:before {\n\tcontent: \"\\f341\";\n}\n\n.menus-move-right:before {\n\tcontent: \"\\f345\";\n}\n\n.move-up-disabled .menus-move-up,\n.move-down-disabled .menus-move-down,\n.move-right-disabled .menus-move-right,\n.move-left-disabled .menus-move-left {\n\tcolor: #d5d5d5 !important;\n\tbackground-color: #fff !important;\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.menu-item-reorder-nav:before {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tleft: -10px;\n\twidth: 10px;\n\theight: 40px;\n\tbackground: -webkit-gradient(linear, left top, right top, from(rgba(250,250,250,0)), to(rgba(250,250,250,1)));\n\tbackground: -webkit-linear-gradient(left, rgba(250,250,250,0) 0%, rgba(250,250,250,1) 100%);\n\tbackground: linear-gradient(to right, rgba(250,250,250,0) 0%, rgba(250,250,250,1) 100%);\n}\n\n.reordering .menu-item .item-controls,\n.reordering .menu-item .item-type {\n\tdisplay: none;\n}\n\n.reordering .menu-item-reorder-nav {\n\tdisplay: block;\n}\n\n.customize-control input.menu-name-field {\n\twidth: 100%; /* Override the 98% default for customizer inputs, to align with the size of menu items. */\n\tmargin: 12px 0;\n}\n\n.wp-customizer .menu-item .item-edit {\n\tposition: absolute;\n\tright: -19px;\n\ttop: 2px;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 38px;\n\tmargin-right: 0 !important;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\toverflow: hidden;\n\tcursor: pointer;\n}\n\n.wp-customizer .menu-item.menu-item-edit-active .item-edit .toggle-indicator:after {\n\tcontent: \"\\f142\";\n}\n\n.wp-customizer .menu-item-settings p.description {\n\tfont-style: normal;\n}\n\n.wp-customizer .menu-settings dl {\n\tmargin: 12px 0 0 0;\n\tpadding: 0;\n}\n\n.wp-customizer .menu-settings .checkbox-input {\n\tmargin-top: 8px;\n}\n\n.wp-customizer .menu-settings .menu-theme-locations {\n\tborder-top: 1px solid #ccc;\n}\n\n.wp-customizer .menu-settings {\n\tmargin-top: 36px;\n\tborder-top: none;\n}\n\n.menu-settings .customize-control-checkbox label {\n\tline-height: 1;\n}\n\n/* @todo update selector or potentially remove */\n.menu-settings .customize-control.customize-control-checkbox {\n\tmargin-bottom: 8px; /* Override collapsing at smaller viewports. */\n}\n\n.customize-control-menu {\n\tmargin-top: 4px;\n}\n\n#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle {\n\tcolor: #555;\n}\n\n/* Screen Options */\n.customize-screen-options-toggle {\n\tbackground: none;\n\tborder: none;\n\tcolor: #555;\n\tcursor: pointer;\n\tmargin: 0;\n\tpadding: 20px;\n\tposition: absolute;\n\tright: 0;\n\ttop: 30px;\n}\n\n#customize-controls .customize-info .customize-help-toggle {\n\tpadding: 20px;\n}\n\n#customize-controls .customize-info .customize-help-toggle:before {\n\tpadding: 4px;\n}\n\n.customize-screen-options-toggle:hover,\n.customize-screen-options-toggle:active,\n.customize-screen-options-toggle:focus,\n.active-menu-screen-options .customize-screen-options-toggle,\n#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover,\n#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active,\n#customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus {\n\tcolor: #0073aa;\n}\n\n.customize-screen-options-toggle:focus,\n#customize-controls .customize-info .customize-help-toggle:focus {\n\toutline: none;\n}\n\n.customize-screen-options-toggle:before {\n\t-moz-osx-font-smoothing: grayscale;\n\tborder: none;\n\tcontent: \"\\f111\";\n\tdisplay: block;\n\tfont: 18px/1 dashicons;\n\tpadding: 5px;\n\ttext-align: center;\n\ttext-decoration: none !important;\n\ttext-indent: 0;\n\tleft: 6px;\n\tposition: absolute;\n\ttop: 6px;\n}\n\n.customize-screen-options-toggle:focus:before,\n#customize-controls .customize-info .customize-help-toggle:focus:before {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\t-webkit-border-radius: 100%;\n\tborder-radius: 100%;\n}\n\n.wp-customizer #screen-options-wrap {\n\tdisplay: none;\n\tbackground: #fff;\n\tborder-top: 1px solid #ddd;\n\tpadding: 4px 15px 15px;\n}\n\n.wp-customizer .metabox-prefs label {\n\tdisplay: block;\n\tpadding-right: 0;\n\tline-height: 30px;\n}\n\n/* rework the arrow indicator implementation for NVDA bug same as #32715 */\n.wp-customizer .toggle-indicator {\n\tdisplay: inline-block;\n\tfont-size: 20px;\n\tline-height: 1;\n\ttext-indent: -1px; /* account for the dashicon alignment */\n}\n\n.rtl .wp-customizer .toggle-indicator {\n\ttext-indent: 1px; /* account for the dashicon alignment */\n}\n\n.wp-customizer .toggle-indicator:after {\n\tcontent: \"\\f140\";\n\tspeak: none;\n\tvertical-align: top;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tcolor: #a0a5aa;\n\tfont: normal 20px/1 dashicons;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n}\n\n.wp-customizer button:focus .toggle-indicator:after {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#accordion-panel-nav_menus .field-link-target,\n#accordion-panel-nav_menus .field-attr-title,\n#accordion-panel-nav_menus .field-css-classes,\n#accordion-panel-nav_menus .field-xfn,\n#accordion-panel-nav_menus .field-description {\n\tdisplay: none;\n}\n\n#accordion-panel-nav_menus.field-link-target-active .field-link-target,\n#accordion-panel-nav_menus.field-attr-title-active .field-attr-title,\n#accordion-panel-nav_menus.field-css-classes-active .field-css-classes,\n#accordion-panel-nav_menus.field-xfn-active .field-xfn,\n#accordion-panel-nav_menus.field-description-active .field-description {\n\tdisplay: block;\n}\n\n/* WARNING: The 20px factor is hard-coded in JS. */\n.menu-item-depth-0  { margin-left: 0;     }\n.menu-item-depth-1  { margin-left: 20px;  }\n.menu-item-depth-2  { margin-left: 40px;  }\n.menu-item-depth-3  { margin-left: 60px;  }\n.menu-item-depth-4  { margin-left: 80px;  }\n.menu-item-depth-5  { margin-left: 100px; }\n.menu-item-depth-6  { margin-left: 120px; }\n.menu-item-depth-7  { margin-left: 140px; }\n.menu-item-depth-8  { margin-left: 160px; } /* Not likely to be used or useful beyond this depth */\n.menu-item-depth-9  { margin-left: 180px; }\n.menu-item-depth-10 { margin-left: 200px; }\n.menu-item-depth-11 { margin-left: 220px; }\n\n/* @todo handle .menu-item-settings width */\n.menu-item-depth-0  > .menu-item-bar { margin-right: 0;     }\n.menu-item-depth-1  > .menu-item-bar { margin-right: 20px;  }\n.menu-item-depth-2  > .menu-item-bar { margin-right: 40px;  }\n.menu-item-depth-3  > .menu-item-bar { margin-right: 60px;  }\n.menu-item-depth-4  > .menu-item-bar { margin-right: 80px;  }\n.menu-item-depth-5  > .menu-item-bar { margin-right: 100px; }\n.menu-item-depth-6  > .menu-item-bar { margin-right: 120px; }\n.menu-item-depth-7  > .menu-item-bar { margin-right: 140px; }\n.menu-item-depth-8  > .menu-item-bar { margin-right: 160px; }\n.menu-item-depth-9  > .menu-item-bar { margin-right: 180px; }\n.menu-item-depth-10 > .menu-item-bar { margin-right: 200px; }\n.menu-item-depth-11 > .menu-item-bar { margin-right: 220px; }\n\n/* Submenu left margin. */\n.menu-item-depth-0  .menu-item-transport { margin-left: 0;      }\n.menu-item-depth-1  .menu-item-transport { margin-left: -20px;  }\n.menu-item-depth-3  .menu-item-transport { margin-left: -60px;  }\n.menu-item-depth-4  .menu-item-transport { margin-left: -80px;  }\n.menu-item-depth-2  .menu-item-transport { margin-left: -40px;  }\n.menu-item-depth-5  .menu-item-transport { margin-left: -100px; }\n.menu-item-depth-6  .menu-item-transport { margin-left: -120px; }\n.menu-item-depth-7  .menu-item-transport { margin-left: -140px; }\n.menu-item-depth-8  .menu-item-transport { margin-left: -160px; }\n.menu-item-depth-9  .menu-item-transport { margin-left: -180px; }\n.menu-item-depth-10 .menu-item-transport { margin-left: -200px; }\n.menu-item-depth-11 .menu-item-transport { margin-left: -220px; }\n\n/* WARNING: The 20px factor is hard-coded in JS. */\n.reordering .menu-item-depth-0  { margin-left: 0;     }\n.reordering .menu-item-depth-1  { margin-left: 15px;  }\n.reordering .menu-item-depth-2  { margin-left: 30px;  }\n.reordering .menu-item-depth-3  { margin-left: 45px;  }\n.reordering .menu-item-depth-4  { margin-left: 60px;  }\n.reordering .menu-item-depth-5  { margin-left: 75px;  }\n.reordering .menu-item-depth-6  { margin-left: 90px;  }\n.reordering .menu-item-depth-7  { margin-left: 105px; }\n.reordering .menu-item-depth-8  { margin-left: 120px; } /* Not likely to be used or useful beyond this depth */\n.reordering .menu-item-depth-9  { margin-left: 135px; }\n.reordering .menu-item-depth-10 { margin-left: 150px; }\n.reordering .menu-item-depth-11 { margin-left: 165px; }\n\n.reordering .menu-item-depth-0  > .menu-item-bar { margin-right: 0;     }\n.reordering .menu-item-depth-1  > .menu-item-bar { margin-right: 15px;  }\n.reordering .menu-item-depth-2  > .menu-item-bar { margin-right: 30px;  }\n.reordering .menu-item-depth-3  > .menu-item-bar { margin-right: 45px;  }\n.reordering .menu-item-depth-4  > .menu-item-bar { margin-right: 60px;  }\n.reordering .menu-item-depth-5  > .menu-item-bar { margin-right: 75px;  }\n.reordering .menu-item-depth-6  > .menu-item-bar { margin-right: 90px;  }\n.reordering .menu-item-depth-7  > .menu-item-bar { margin-right: 105px; }\n.reordering .menu-item-depth-8  > .menu-item-bar { margin-right: 120px; }\n.reordering .menu-item-depth-9  > .menu-item-bar { margin-right: 135px; }\n.reordering .menu-item-depth-10 > .menu-item-bar { margin-right: 150px; }\n.reordering .menu-item-depth-11 > .menu-item-bar { margin-right: 165px; }\n\n.control-section-nav_menu .menu .menu-item-edit-active {\n\tmargin-left: 0;\n}\n\n.control-section-nav_menu .menu .menu-item-edit-active .menu-item-bar {\n\tmargin-right: 0;\n}\n\n.control-section-nav_menu .menu .sortable-placeholder {\n\tmargin-top: 0;\n\tmargin-bottom: 1px;\n\tmax-width: -webkit-calc(100% - 2px);\n\tmax-width: calc(100% - 2px);\n\tfloat: left;\n\tdisplay: list-item;\n\tborder-color: #a0a5aa;\n}\n\n.menu-item-transport li.customize-control {\n\tfloat: none;\n}\n\n.control-section-nav_menu .menu ul.menu-item-transport .menu-item-bar {\n\tmargin-top: 0;\n}\n\n/**\n * Add-menu-items mode\n */\n\n.wp-full-overlay-main {\n\tright: auto; /* This overrides a right: 0; which causes the preview to resize rather than slide off screen at the normal size. */\n\twidth: 100%;\n}\n\n.adding-menu-items .control-section {\n\topacity: .4;\n}\n\n.adding-menu-items .control-panel.control-section,\n.adding-menu-items .control-section.open {\n\topacity: 1;\n}\n\n.adding-menu-items .add-new-menu-item,\n.adding-menu-items .add-new-menu-item:hover,\n.add-menu-toggle.open,\n.add-menu-toggle.open:hover {\n\tbackground: #eee;\n\tborder-color: #929793;\n\tcolor: #32373c;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);\n\tbox-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);\n}\n\n.adding-menu-items .add-new-menu-item:before,\n#accordion-section-add_menu .add-new-menu-item.open:before {\n\t-webkit-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n}\n\n.menu-item-bar .item-delete {\n\tcolor: #a00;\n\tposition: absolute;\n\ttop: 2px;\n\tright: -19px;\n\twidth: 30px;\n\theight: 38px;\n\tcursor: pointer;\n\tdisplay: none;\n}\n\n.menu-item-bar .item-delete:before {\n\tcontent: \"\\f335\";\n\tposition: absolute;\n\ttop: 9px;\n\tleft: 5px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tfont: normal 20px/1 dashicons;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.ie8 .menu-item-bar .item-delete:before {\n\ttop: -10px;\n}\n\n.menu-item-bar .item-delete:hover,\n.menu-item-bar .item-delete:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\tcolor: #f00;\n}\n\n.menu-item-bar .item-delete:focus:before {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.adding-menu-items .menu-item-bar .item-edit {\n\tdisplay: none;\n}\n\n.adding-menu-items .menu-item-bar .item-delete {\n\tdisplay: block;\n}\n\n#available-menu-items .item {\n\tposition: static;\n}\n\n#available-menu-items {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: -301px;\n\tvisibility: hidden;\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\twidth: 300px;\n\tmargin: 0;\n\tz-index: 4;\n\tbackground: #eee;\n\t-webkit-transition: left .18s;\n\ttransition: left .18s;\n\tborder-right: 1px solid #ddd;\n}\n\n#available-menu-items.opening {\n\toverflow-y: hidden; /* avoid scrollbar jitter with animating heights */\n}\n\n#available-menu-items #available-menu-items-search.open {\n\theight: 100%;\n\tborder-bottom: none;\n}\n\n#available-menu-items .accordion-section-title {\n\tborder-left: none;\n\tborder-right: none;\n\tbackground: #fff;\n\t-webkit-transition: background-color 0.15s;\n\ttransition: background-color 0.15s;\n}\n\n#available-menu-items .open .accordion-section-title,\n#available-menu-items #available-menu-items-search .accordion-section-title {\n\tbackground: #eee;\n}\n\n/* rework the arrow indicator implementation for NVDA bug see #32715 */\n#available-menu-items .accordion-section-title:after {\n\tcontent: none !important;\n}\n\n#available-menu-items .accordion-section-title:hover .toggle-indicator:after {\n\tcolor: #777;\n}\n\n#available-menu-items .open .accordion-section-title .toggle-indicator:after {\n\tcontent: \"\\f142\";\n}\n\n#available-menu-items .accordion-section-content {\n\toverflow-y: auto;\n\tmax-height: 200px; /* This gets set in JS to fit the screen size, and based on # of sections. */\n\tbackground: transparent;\n}\n\n#available-menu-items .accordion-section-title button {\n\tdisplay: block;\n\twidth: 28px;\n\theight: 35px;\n\tposition: absolute;\n\ttop: 5px;\n\tright: 5px;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\tcursor: pointer;\n}\n\n#available-menu-items .accordion-section-title .no-items,\n#available-menu-items .cannot-expand .accordion-section-title .spinner,\n#available-menu-items .cannot-expand .accordion-section-title > button {\n\tdisplay: none;\n}\n\n#available-menu-items-search.cannot-expand .accordion-section-title .spinner {\n\tdisplay: block;\n}\n\n#available-menu-items .cannot-expand .accordion-section-title .no-items {\n\tdisplay: block;\n\tcolor: #777;\n\tfont-weight: normal;\n\tfloat: right;\n\tmargin-left: 5px;\n}\n\n#available-menu-items .accordion-section-content {\n\tpadding: 1px 15px 15px 15px;\n\tmargin: 0;\n\tmax-height: 290px;\n}\n\n#available-menu-items #available-menu-items-search .accordion-section-content {\n\tposition: absolute;\n\tleft: 1px;\n\ttop: 60px; /* below title div / search input */\n\tbottom: 0px; /* 100% height that still triggers lazy load */\n\tmax-height: none;\n\twidth: 100%;\n\tpadding: 1px 15px 15px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#available-menu-items .menu-item-tpl {\n\tmargin: 0;\n}\n\n#custom-menu-item-name.invalid,\n#custom-menu-item-url.invalid,\n.menu-name-field.invalid,\n.menu-name-field.invalid:focus {\n\tborder: 1px solid #f00;\n}\n\n#available-menu-items .item-tpl {\n\tposition: relative;\n\tpadding: 20px 15px 20px 60px;\n\tborder-bottom: 1px solid #e4e4e4;\n\tcursor: pointer;\n\tdisplay: none;\n}\n\n#available-menu-items .item-tpl:hover,\n#available-menu-items .item-tpl.selected {\n\tbackground: #eee;\n}\n\n#available-menu-items .menu-item-handle .item-type {\n\tpadding-right: 0;\n}\n\n#available-menu-items .menu-item-handle .item-title {\n\tpadding-left: 20px;\n}\n\n#available-menu-items .menu-item-handle {\n\tcursor: pointer;\n}\n\n#available-menu-items .item-top,\n#available-menu-items .item-top:hover {\n\tborder: none;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#available-menu-items .menu-item-handle {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tmargin-top: -1px;\n}\n\n#available-menu-items .menu-item-handle:hover {\n\tz-index: 1;\n}\n\n#available-menu-items .item-title h4 {\n\tpadding: 0 0 5px;\n\tfont-size: 14px;\n}\n\n#available-menu-items .item-add {\n\tposition: absolute;\n\ttop: 1px;\n\tleft: 1px;\n\tcolor: #82878c;\n\twidth: 30px;\n\theight: 38px;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\tcursor: pointer;\n}\n\n#available-menu-items .menu-item-handle .item-add:focus {\n\tcolor: #23282d;\n}\n\n#available-menu-items .item-add:before {\n\tcontent: \"\\f543\";\n\tposition: relative;\n\tleft: 2px;\n\ttop: 3px;\n\tdisplay: inline-block;\n\theight: 20px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tfont: normal 20px/1.05 dashicons; /* line height is to account for the dashicon's vertical alignment */\n}\n\n#available-menu-items .item-add:focus:before {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#available-menu-items .menu-item-handle.item-added .item-type,\n#available-menu-items .menu-item-handle.item-added .item-title,\n#available-menu-items .menu-item-handle.item-added:hover .item-add,\n#available-menu-items .menu-item-handle.item-added .item-add:focus {\n\tcolor: #82878c;\n}\n\n#available-menu-items .menu-item-handle.item-added .item-add:before {\n\tcontent: \"\\f147\";\n}\n\n#available-menu-items .accordion-section-title.loading .spinner,\n#available-menu-items-search.loading .accordion-section-title .spinner {\n\tvisibility: visible;\n\tmargin: 0 20px;\n}\n\n#available-menu-items-search .clear-results {\n\tposition: absolute;\n\ttop: 20px;\n\tright: 20px;\n\twidth: 20px;\n\theight: 20px;\n\tcursor: pointer;\n\tcolor: #a00;\n\ttext-decoration: none;\n}\n\n#available-menu-items-search .clear-results,\n#available-menu-items-search.loading .clear-results.is-visible {\n\tdisplay: none;\n}\n\n#available-menu-items-search .clear-results.is-visible {\n\tdisplay: block;\n}\n\n#available-menu-items-search .clear-results:before {\n\tcontent: \"\\f335\";\n\tfont: normal 20px/1 dashicons;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#available-menu-items-search .clear-results:hover,\n#available-menu-items-search .clear-results:focus {\n\tcolor: #f00;\n}\n\n#available-menu-items-search .clear-results:focus {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#available-menu-items-search .spinner {\n\tposition: absolute;\n\ttop: 20px;\n\tmargin: 0 !important;\n\tright: 20px;\n}\n\n#available-menu-items-search input {\n\tpadding: 6px 10px;\n\twidth: 100%;\n}\n\n#available-menu-items-search .accordion-section-title {\n\tpadding: 12px 15px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#available-menu-items-search .accordion-section-title:after {\n\tdisplay: none;\n}\n\n#available-menu-items-search .accordion-section-content:empty {\n\tmin-height: 0;\n\tpadding: 0;\n}\n\n#available-menu-items-search.loading .accordion-section-content div {\n\topacity: .5;\n}\n\n#available-menu-items-search.loading.loading-more .accordion-section-content div {\n\topacity: 1;\n}\n\n#customize-preview {\n\t-webkit-transition: all 0.2s;\n\ttransition: all 0.2s;\n}\n\nbody.adding-menu-items #available-menu-items {\n\tleft: 0;\n\tvisibility: visible;\n}\n\nbody.adding-menu-items .wp-full-overlay-main {\n\tleft: 300px;\n}\n\nbody.adding-menu-items #customize-preview {\n\topacity: 0.4;\n}\n\n.menu-item-handle .spinner {\n\tdisplay: none;\n\tfloat: left;\n\tmargin: 0 8px 0 0;\n}\n\n.nav-menu-inserted-item-loading .spinner {\n\tdisplay: block;\n}\n\n.nav-menu-inserted-item-loading .menu-item-handle .item-type {\n\tpadding: 0 0 0 8px;\n}\n\n.nav-menu-inserted-item-loading .menu-item-handle,\n.added-menu-item .menu-item-handle.loading {\n\tpadding: 10px 15px 10px 8px;\n\tcursor: default;\n\topacity: .5;\n\tbackground: #fff;\n\tcolor: #727773;\n}\n\n.added-menu-item .menu-item-handle {\n\t-webkit-transition-property: opacity, background, color;\n\ttransition-property: opacity, background, color;\n\t-webkit-transition-duration: 1.25s;\n\ttransition-duration: 1.25s;\n\t-webkit-transition-timing-function: cubic-bezier( .25, -2.5, .75, 8 );\n\ttransition-timing-function: cubic-bezier( .25, -2.5, .75, 8 ); /* Replacement for .hide().fadeIn('slow') in JS to add emphasis when it's loaded. */\n}\n\n/* Add/delete Menus */\n\n/* @todo update selector */\n#accordion-section-add_menu {\n\tmargin: 15px 12px;\n}\n\n.new-menu-section-content {\n\tdisplay: none;\n\tpadding: 15px 0 0 0;\n\tclear: both;\n}\n\n/* @todo update selector */\n#accordion-section-add_menu .accordion-section-title {\n\tpadding-left: 45px;\n}\n\n/* @todo update selector */\n#accordion-section-add_menu .accordion-section-title:before {\n\tfont: normal 20px/1 dashicons;\n\tposition: absolute;\n\ttop: 12px;\n\tleft: 14px;\n\tcontent: \"\\f132\";\n}\n\n#create-new-menu-submit {\n\tfloat: right;\n\tmargin: 0 0 12px 0;\n}\n\n.menu-delete-item {\n\tdisplay: block;\n\tfloat: left;\n\tpadding: 1em 0;\n\twidth: 100%;\n}\n\nli.assigned-to-menu-location .menu-delete-item {\n\tdisplay: none;\n}\n\nli.assigned-to-menu-location .add-new-menu-item {\n\tmargin-bottom: 1em;\n}\n\n.menu-delete {\n\tcolor: #a00;\n\tcursor: pointer;\n\ttext-decoration: underline;\n}\n\n.menu-delete:hover,\n.menu-delete:focus {\n\tcolor: #f00;\n\ttext-decoration: none;\n}\n\n.menu-delete:focus {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.menu-item-handle {\n\tmargin-top: -1px;\n}\n.ui-sortable-disabled .menu-item-handle {\n\tcursor: default;\n}\n\n.menu-item-handle:hover {\n\tposition: relative;\n\tz-index: 10;\n\tcolor: #0073aa;\n}\n\n.menu-item-handle:hover .item-type,\n.menu-item-handle:hover .item-edit,\n#available-menu-items .menu-item-handle:hover .item-add {\n\tcolor: #0073aa;\n}\n\n.menu-item-edit-active .menu-item-handle {\n\tborder-color: #999;\n\tborder-bottom: none;\n}\n\n.customize-control-nav_menu_item {\n\tmargin-bottom: 0;\n}\n\n.customize-control-nav_menu {\n\tmargin-top: 12px;\n}\n\n#available-menu-items .customize-section-title {\n\tdisplay: none;\n}\n\n@media screen and ( max-width: 782px ) {\n\t#available-menu-items #available-menu-items-search .accordion-section-content {\n\t\ttop: 63px;\n\t}\n}\n\n@media screen and ( max-width: 640px ) {\n\tbody.adding-menu-items div#available-menu-items {\n\t\ttop: 46px;\n\t\tleft: 0;\n\t\tz-index: 10;\n\t\twidth: 100%;\n\t}\n\n\t#available-menu-items #available-menu-items-search .accordion-section-content {\n\t\ttop: 133px;\n\t}\n\n\t#available-menu-items .customize-section-title {\n\t\tdisplay: block;\n\t\tmargin: 0;\n\t}\n\n\t#available-menu-items .customize-section-back {\n\t\theight: 69px;\n\t}\n\n\t#available-menu-items .customize-section-title h3 {\n\t\tfont-size: 20px;\n\t\tfont-weight: 200;\n\t\tpadding: 9px 10px 12px 14px;\n\t\tmargin: 0;\n\t\tline-height: 24px;\n\t\tcolor: #555;\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t#available-menu-items .customize-section-title .customize-action {\n\t\tfont-size: 13px;\n\t\tdisplay: block;\n\t\tfont-weight: 400;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/customize-widgets-rtl.css",
    "content": ".wp-full-overlay-sidebar {\n\toverflow: visible;\n}\n\n/**\n * Hide all sidebar sections by default, only show them (via JS) once the\n * preview loads and we know whether the sidebars are used in the template.\n */\n\n.control-section.control-section-sidebar,\n.customize-control-sidebar_widgets label,\n.customize-control-sidebar_widgets .hide-if-js {\n\t/* The link in .customize-control-sidebar_widgets .hide-if-js will fail if it ever gets used. */\n\tdisplay: none;\n}\n\n.control-section.control-section-sidebar .accordion-section-content.ui-sortable {\n\toverflow: visible;\n}\n\n.customize-control-widget_form .widget-top {\n\t-webkit-transition: opacity 0.5s;\n\ttransition: opacity 0.5s;\n}\n\n.customize-control-widget_form:not(.widget-rendered) .widget-top {\n\topacity: 0.5;\n}\n\n.customize-control-widget_form .widget-control-save {\n\tdisplay: none;\n}\n\n.customize-control-widget_form .spinner {\n\tvisibility: hidden;\n\tmargin-top: 0;\n}\n\n.customize-control-widget_form.previewer-loading .spinner {\n\tvisibility: visible;\n}\n\n.customize-control-widget_form.widget-form-disabled .widget-content {\n\topacity: 0.7;\n\tpointer-events: none;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.customize-control-widget_form .widget {\n\tmargin-bottom: 0;\n}\n\n.customize-control-widget_form.wide-widget-control .widget-inside {\n\tposition: fixed;\n\tright: 299px;\n\ttop: 25%;\n\tborder: 1px solid rgb(229, 229, 229);\n\toverflow: auto;\n}\n.customize-control-widget_form.wide-widget-control .widget-inside > .form {\n\tpadding: 20px;\n}\n\n.customize-control-widget_form.wide-widget-control .widget-top {\n\t-webkit-transition: background-color 0.4s;\n\ttransition: background-color 0.4s;\n}\n.customize-control-widget_form.wide-widget-control.expanding .widget-top,\n.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top {\n\tbackground-color: rgb(227, 227, 227);\n}\n\n.widget-inside {\n\tpadding: 1px 10px 10px 10px;\n\tborder-top: none;\n\tline-height: 16px;\n}\n\n.widget-top {\n\tcursor: move;\n}\n\n.customize-control-widget_form.expanded a.widget-action:after {\n\tcontent: \"\\f142\";\n}\n\n.customize-control-widget_form.wide-widget-control a.widget-action:after {\n\tcontent: \"\\f141\";\n}\n\n.customize-control-widget_form.wide-widget-control.expanded a.widget-action:after {\n\tcontent: \"\\f139\";\n}\n\n.widget-title-action {\n\tcursor: pointer;\n}\n\n.customize-control-widget_form .widget .customize-control-title {\n\tcursor: move;\n}\n\n.control-section.accordion-section.highlighted > .accordion-section-title,\n.customize-control-widget_form.highlighted {\n\toutline: none;\n\t-webkit-box-shadow: 0 0 2px rgba(30,140,190,0.8);\n\tbox-shadow: 0 0 2px rgba(30,140,190,0.8);\n\tposition: relative;\n\tz-index: 1;\n}\n\n#widget-customizer-control-templates {\n\tdisplay: none;\n}\n\n/**\n * Widget reordering styles\n */\n\n#customize-theme-controls .widget-reorder-nav {\n\tdisplay: none;\n\tfloat: left;\n\tbackground-color: #fafafa;\n}\n\n.widget-reorder-nav span {\n\tposition: relative;\n\toverflow: hidden;\n\tfloat: right;\n\tdisplay: block;\n\twidth: 33px; /* was 42px for mobile */\n\theight: 43px;\n\tcolor: #82878c;\n\ttext-indent: -9999px;\n\tcursor: pointer;\n\toutline: none;\n}\n\n.widget-reorder-nav span:before {\n\tdisplay: inline-block;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tfont: normal 20px/43px dashicons;\n\ttext-align: center;\n\ttext-indent: 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.widget-reorder-nav span:hover,\n.widget-reorder-nav span:focus {\n\tcolor: #444;\n\tbackground: #eee;\n}\n\n.move-widget:before {\n\tcontent: \"\\f504\";\n}\n\n.move-widget-down:before {\n\tcontent: \"\\f347\";\n}\n\n.move-widget-up:before {\n\tcontent: \"\\f343\";\n}\n\n#customize-theme-controls .first-widget .move-widget-up,\n#customize-theme-controls .last-widget .move-widget-down {\n\tcolor: #d5d5d5;\n\tcursor: default;\n}\n\n#customize-theme-controls .move-widget-area {\n\tdisplay: none;\n\tbackground: #fff;\n\tborder: 1px solid #dedede;\n\tborder-top: none;\n\tcursor: auto;\n}\n\n#customize-theme-controls .reordering .move-widget-area.active {\n\tdisplay: block;\n}\n\n#customize-theme-controls .move-widget-area .description {\n\tmargin: 0;\n\tpadding: 15px 20px;\n\tfont-weight: 400;\n}\n\n#customize-theme-controls .widget-area-select {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n#customize-theme-controls .widget-area-select li {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 13px 42px 15px 15px;\n\tcolor: #555;\n\tborder-top: 1px solid #eee;\n\tcursor: pointer;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n#customize-theme-controls .widget-area-select li:before {\n\tdisplay: none;\n\tcontent: \"\\f147\";\n\tposition: absolute;\n\ttop: 12px;\n\tright: 10px;\n\tfont: normal 20px/1 dashicons;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#customize-theme-controls .widget-area-select li:last-child {\n\tborder-bottom: 1px solid #eee;\n}\n\n#customize-theme-controls .widget-area-select .selected {\n\tcolor: #fff;\n\ttext-shadow: 0 -1px 0 rgba(0,0,0,.4);\n\tbackground: #00a0d2;\n}\n\n#customize-theme-controls .widget-area-select .selected:before {\n\tdisplay: block;\n}\n\n#customize-theme-controls .move-widget-actions {\n\ttext-align: left;\n\tpadding: 12px;\n}\n\n#customize-theme-controls .reordering .widget-title-action {\n\tdisplay: none;\n}\n\n#customize-theme-controls .reordering .widget-reorder-nav {\n\tdisplay: block;\n}\n\n/**\n * Styles for new widget addition panel\n */\n\n.wp-full-overlay-main {\n\tleft: auto; /* this overrides a right: 0; which causes the preview to resize, I'd rather have it go off screen at the normal size. */\n\twidth: 100%;\n}\n\nbody.adding-widget .add-new-widget,\nbody.adding-widget .add-new-widget:hover {\n\tbackground: #eee;\n\tborder-color: #999;\n\tcolor: #32373c;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);\n\tbox-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);\n}\nbody.adding-widget .add-new-widget:before {\n\t-webkit-transform: rotate(-45deg);\n\t-ms-transform: rotate(-45deg);\n\ttransform: rotate(-45deg);\n}\n\n#available-widgets .widget {\n\tposition: static;\n}\n\n/* override widgets admin page rules in wp-admin/css/wp-admin.css */\n#widgets-left #available-widgets .widget {\n\tfloat: none !important;\n\twidth: auto !important;\n}\n\n#available-widgets {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tright: -301px;\n\tvisibility: hidden;\n\toverflow: auto;\n\twidth: 300px;\n\tmargin: 0;\n\tz-index: 1;\n\tbackground: #eee !important;\n\t-webkit-transition: right .18s;\n\ttransition: right .18s;\n\tborder-left: 1px solid #ddd;\n}\n\n.ios #available-widgets {\n\t-webkit-transition: right 0s;\n\ttransition: right 0s;\n}\n\n#available-widgets-list {\n\ttop: 46px;\n\tposition: absolute;\n\toverflow: auto;\n\tbottom: 0;\n\twidth: 100%;\n}\n\n#available-widgets-filter {\n\tposition: fixed;\n\ttop: 0;\n\tz-index: 1;\n\twidth: 300px;\n\theight: 46px;\n\tpadding: 8px 13px 7px 17px;\n\tbackground: #eee;\n\tborder-bottom: 1px solid #e4e4e4;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#available-widgets-filter input {\n\tpadding: 5px 10px 2px 10px;\n\twidth: 100%;\n}\n\n#available-widgets .widget-tpl {\n\tposition: relative;\n\tpadding: 20px 60px 20px 15px;\n\tbackground: #fff;\n\tborder-bottom: 1px solid #e4e4e4;\n\tcursor: pointer;\n\tdisplay: none;\n}\n\n#available-widgets .widget-tpl:hover,\n#available-widgets .widget-tpl.selected {\n\tbackground: #eee;\n\tborder-bottom-color: #ccc;\n}\n\n#available-widgets .widget-top,\n#available-widgets .widget-top:hover {\n\tborder: none;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#customize-controls .widget-title h3 {\n\tfont-size: 1em;\n}\n\n#available-widgets .widget-title h3 {\n\tpadding: 0 0 5px;\n\tfont-size: 14px;\n}\n\n#available-widgets .widget .widget-description {\n\tpadding: 0;\n\tcolor: #777;\n}\n\n#customize-preview {\n\t-webkit-transition: all 0.2s;\n\ttransition: all 0.2s;\n}\n\nbody.adding-widget #available-widgets {\n\tright: 0;\n\tvisibility: visible;\n}\n\nbody.adding-widget .wp-full-overlay-main {\n\tright: 300px;\n}\n\nbody.adding-widget #customize-preview {\n\topacity: 0.4;\n}\n\n\n/**\n * Widget Icon styling\n * No plurals in naming.\n * Ordered from lowest to highest specificity.\n */\n\n#available-widgets .widget-title {\n\tposition: relative;\n}\n\n#available-widgets .widget-title:before {\n\tcontent: \"\\f132\";\n\tposition: absolute;\n\ttop: -3px;\n\tleft: 100%;\n\tmargin-left: 20px;\n\twidth: 20px;\n\theight: 20px;\n\tcolor: #32373c;\n\tfont: normal 20px/1 dashicons;\n\ttext-align: center;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* smiley */\n#available-widgets [class*=\"easy\"] .widget-title:before { content: \"\\f328\"; top: -4px; }\n\n/* star-filled */\n#available-widgets [class*=\"super\"] .widget-title:before,\n#available-widgets [class*=\"like\"] .widget-title:before { content: \"\\f155\"; top: -4px; }\n\n/* wordpress */\n#available-widgets [class*=\"meta\"] .widget-title:before { content: \"\\f120\"; }\n\n/* archive-box */\n#available-widgets [class*=\"archives\"] .widget-title:before { content: \"\\f480\"; top: -4px; }\n\n/* category */\n#available-widgets [class*=\"categor\"] .widget-title:before { content: \"\\f318\"; top: -4px; }\n\n/* comments */\n#available-widgets [class*=\"comment\"] .widget-title:before,\n#available-widgets [class*=\"testimonial\"] .widget-title:before,\n#available-widgets [class*=\"chat\"] .widget-title:before { content: \"\\f101\"; }\n\n/* post */\n#available-widgets [class*=\"post\"] .widget-title:before { content: \"\\f109\"; }\n\n/* admin-page */\n#available-widgets [class*=\"page\"] .widget-title:before { content: \"\\f105\"; }\n\n/* text */\n#available-widgets [class*=\"text\"] .widget-title:before { content: \"\\f478\"; }\n\n/* links */\n#available-widgets [class*=\"link\"] .widget-title:before { content: \"\\f103\"; }\n\n/* search */\n#available-widgets [class*=\"search\"] .widget-title:before { content: \"\\f179\"; }\n\n/* menu */\n#available-widgets [class*=\"menu\"] .widget-title:before,\n#available-widgets [class*=\"nav\"] .widget-title:before { content: \"\\f333\"; }\n\n/* tag-cloud */\n#available-widgets [class*=\"tag\"] .widget-title:before { content: \"\\f479\"; }\n\n/* rss */\n#available-widgets [class*=\"rss\"] .widget-title:before { content: \"\\f303\"; top: -6px; }\n\n/* calendar */\n#available-widgets [class*=\"event\"] .widget-title:before,\n#available-widgets [class*=\"calendar\"] .widget-title:before { content: \"\\f145\"; top: -4px;}\n\n/* format-image */\n#available-widgets [class*=\"image\"] .widget-title:before,\n#available-widgets [class*=\"photo\"] .widget-title:before,\n#available-widgets [class*=\"slide\"] .widget-title:before,\n#available-widgets [class*=\"instagram\"] .widget-title:before { content: \"\\f128\"; }\n\n/* format-gallery */\n#available-widgets [class*=\"album\"] .widget-title:before,\n#available-widgets [class*=\"galler\"] .widget-title:before { content: \"\\f161\"; }\n\n/* format-video */\n#available-widgets [class*=\"video\"] .widget-title:before,\n#available-widgets [class*=\"tube\"] .widget-title:before { content: \"\\f126\"; }\n\n/* format-audio */\n#available-widgets [class*=\"music\"] .widget-title:before,\n#available-widgets [class*=\"radio\"] .widget-title:before,\n#available-widgets [class*=\"audio\"] .widget-title:before { content: \"\\f127\"; }\n\n/* admin-users */\n#available-widgets [class*=\"login\"] .widget-title:before,\n#available-widgets [class*=\"user\"] .widget-title:before,\n#available-widgets [class*=\"member\"] .widget-title:before,\n#available-widgets [class*=\"avatar\"] .widget-title:before,\n#available-widgets [class*=\"subscriber\"] .widget-title:before,\n#available-widgets [class*=\"profile\"] .widget-title:before,\n#available-widgets [class*=\"grofile\"] .widget-title:before { content: \"\\f110\"; }\n\n/* cart */\n#available-widgets [class*=\"commerce\"] .widget-title:before,\n#available-widgets [class*=\"shop\"] .widget-title:before,\n#available-widgets [class*=\"cart\"] .widget-title:before { content: \"\\f174\"; top: -4px; }\n\n/* shield */\n#available-widgets [class*=\"secur\"] .widget-title:before,\n#available-widgets [class*=\"firewall\"] .widget-title:before { content: \"\\f332\"; }\n\n/* chart-bar */\n#available-widgets [class*=\"analytic\"] .widget-title:before,\n#available-widgets [class*=\"stat\"] .widget-title:before,\n#available-widgets [class*=\"poll\"] .widget-title:before { content: \"\\f185\"; }\n\n/* feedback */\n#available-widgets [class*=\"form\"] .widget-title:before { content: \"\\f175\"; }\n\n/* email-alt */\n#available-widgets [class*=\"subscribe\"] .widget-title:before,\n#available-widgets [class*=\"news\"] .widget-title:before,\n#available-widgets [class*=\"contact\"] .widget-title:before,\n#available-widgets [class*=\"mail\"] .widget-title:before { content: \"\\f466\"; }\n\n/* share */\n#available-widgets [class*=\"share\"] .widget-title:before,\n#available-widgets [class*=\"socia\"] .widget-title:before { content: \"\\f237\"; }\n\n/* translation */\n#available-widgets [class*=\"lang\"] .widget-title:before,\n#available-widgets [class*=\"translat\"] .widget-title:before { content: \"\\f326\"; }\n\n/* location-alt */\n#available-widgets [class*=\"locat\"] .widget-title:before,\n#available-widgets [class*=\"map\"] .widget-title:before { content: \"\\f231\"; }\n\n/* download */\n#available-widgets [class*=\"download\"] .widget-title:before { content: \"\\f316\"; }\n\n/* cloud */\n#available-widgets [class*=\"weather\"] .widget-title:before { content: \"\\f176\"; top: -4px;}\n\n/* facebook */\n#available-widgets [class*=\"facebook\"] .widget-title:before { content: \"\\f304\"; }\n\n/* twitter */\n#available-widgets [class*=\"tweet\"] .widget-title:before,\n#available-widgets [class*=\"twitter\"] .widget-title:before { content: \"\\f301\"; }\n\n#available-widgets .customize-section-title {\n\tdisplay: none;\n}\n\n@media screen and (max-height: 700px) and (min-width: 981px) {\n\t.customize-control-widget {\n\t\tmargin-bottom: 0;\n\t}\n\t.widget-top {\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t\tmargin-top: -1px;\n\t}\n\t.widget-top:hover {\n\t\tposition: relative;\n\t\tz-index: 1;\n\t}\n\t.last-widget {\n\t\tmargin-bottom: 15px;\n\t}\n\t.widget-title h3 {\n\t\tpadding: 13px 15px;\n\t}\n\t.widget-reorder-nav span {\n\t\theight: 39px;\n\t}\n\t.widget-reorder-nav span:before {\n\t\tline-height: 39px;\n\t}\n\t#customize-theme-controls .widget-area-select li {\n\t\tpadding: 9px 42px 11px 15px;\n\t}\n\t#customize-theme-controls .widget-area-select li:before {\n\t\ttop: 8px;\n\t}\n}\n\n@media screen and ( max-width: 640px ) {\n\tbody.adding-widget div#available-widgets {\n\t\ttop: 46px;\n\t\tright: 0;\n\t\tz-index: 10;\n\t\twidth: 100%;\n\t}\n\n\t#available-widgets .customize-section-title {\n\t\tdisplay: block;\n\t\tmargin: 0;\n\t}\n\n\t#available-widgets .customize-section-back {\n\t\theight: 69px;\n\t}\n\n\t#available-widgets .customize-section-title h3 {\n\t\tfont-size: 20px;\n\t\tfont-weight: 200;\n\t\tpadding: 9px 14px 12px 10px;\n\t\tmargin: 0;\n\t\tline-height: 24px;\n\t\tcolor: #555;\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t#available-widgets .customize-section-title .customize-action {\n\t\tfont-size: 13px;\n\t\tdisplay: block;\n\t\tfont-weight: 400;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t#available-widgets-filter {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tbackground: #fff;\n\t\theight: auto;\n\t\tpadding: 10px 15px;\n\t}\n\n\t#available-widgets-list {\n\t\ttop: 140px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/customize-widgets.css",
    "content": ".wp-full-overlay-sidebar {\n\toverflow: visible;\n}\n\n/**\n * Hide all sidebar sections by default, only show them (via JS) once the\n * preview loads and we know whether the sidebars are used in the template.\n */\n\n.control-section.control-section-sidebar,\n.customize-control-sidebar_widgets label,\n.customize-control-sidebar_widgets .hide-if-js {\n\t/* The link in .customize-control-sidebar_widgets .hide-if-js will fail if it ever gets used. */\n\tdisplay: none;\n}\n\n.control-section.control-section-sidebar .accordion-section-content.ui-sortable {\n\toverflow: visible;\n}\n\n.customize-control-widget_form .widget-top {\n\t-webkit-transition: opacity 0.5s;\n\ttransition: opacity 0.5s;\n}\n\n.customize-control-widget_form:not(.widget-rendered) .widget-top {\n\topacity: 0.5;\n}\n\n.customize-control-widget_form .widget-control-save {\n\tdisplay: none;\n}\n\n.customize-control-widget_form .spinner {\n\tvisibility: hidden;\n\tmargin-top: 0;\n}\n\n.customize-control-widget_form.previewer-loading .spinner {\n\tvisibility: visible;\n}\n\n.customize-control-widget_form.widget-form-disabled .widget-content {\n\topacity: 0.7;\n\tpointer-events: none;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.customize-control-widget_form .widget {\n\tmargin-bottom: 0;\n}\n\n.customize-control-widget_form.wide-widget-control .widget-inside {\n\tposition: fixed;\n\tleft: 299px;\n\ttop: 25%;\n\tborder: 1px solid rgb(229, 229, 229);\n\toverflow: auto;\n}\n.customize-control-widget_form.wide-widget-control .widget-inside > .form {\n\tpadding: 20px;\n}\n\n.customize-control-widget_form.wide-widget-control .widget-top {\n\t-webkit-transition: background-color 0.4s;\n\ttransition: background-color 0.4s;\n}\n.customize-control-widget_form.wide-widget-control.expanding .widget-top,\n.customize-control-widget_form.wide-widget-control.expanded:not(.collapsing) .widget-top {\n\tbackground-color: rgb(227, 227, 227);\n}\n\n.widget-inside {\n\tpadding: 1px 10px 10px 10px;\n\tborder-top: none;\n\tline-height: 16px;\n}\n\n.widget-top {\n\tcursor: move;\n}\n\n.customize-control-widget_form.expanded a.widget-action:after {\n\tcontent: \"\\f142\";\n}\n\n.customize-control-widget_form.wide-widget-control a.widget-action:after {\n\tcontent: \"\\f139\";\n}\n\n.customize-control-widget_form.wide-widget-control.expanded a.widget-action:after {\n\tcontent: \"\\f141\";\n}\n\n.widget-title-action {\n\tcursor: pointer;\n}\n\n.customize-control-widget_form .widget .customize-control-title {\n\tcursor: move;\n}\n\n.control-section.accordion-section.highlighted > .accordion-section-title,\n.customize-control-widget_form.highlighted {\n\toutline: none;\n\t-webkit-box-shadow: 0 0 2px rgba(30,140,190,0.8);\n\tbox-shadow: 0 0 2px rgba(30,140,190,0.8);\n\tposition: relative;\n\tz-index: 1;\n}\n\n#widget-customizer-control-templates {\n\tdisplay: none;\n}\n\n/**\n * Widget reordering styles\n */\n\n#customize-theme-controls .widget-reorder-nav {\n\tdisplay: none;\n\tfloat: right;\n\tbackground-color: #fafafa;\n}\n\n.widget-reorder-nav span {\n\tposition: relative;\n\toverflow: hidden;\n\tfloat: left;\n\tdisplay: block;\n\twidth: 33px; /* was 42px for mobile */\n\theight: 43px;\n\tcolor: #82878c;\n\ttext-indent: -9999px;\n\tcursor: pointer;\n\toutline: none;\n}\n\n.widget-reorder-nav span:before {\n\tdisplay: inline-block;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n\theight: 100%;\n\tfont: normal 20px/43px dashicons;\n\ttext-align: center;\n\ttext-indent: 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.widget-reorder-nav span:hover,\n.widget-reorder-nav span:focus {\n\tcolor: #444;\n\tbackground: #eee;\n}\n\n.move-widget:before {\n\tcontent: \"\\f504\";\n}\n\n.move-widget-down:before {\n\tcontent: \"\\f347\";\n}\n\n.move-widget-up:before {\n\tcontent: \"\\f343\";\n}\n\n#customize-theme-controls .first-widget .move-widget-up,\n#customize-theme-controls .last-widget .move-widget-down {\n\tcolor: #d5d5d5;\n\tcursor: default;\n}\n\n#customize-theme-controls .move-widget-area {\n\tdisplay: none;\n\tbackground: #fff;\n\tborder: 1px solid #dedede;\n\tborder-top: none;\n\tcursor: auto;\n}\n\n#customize-theme-controls .reordering .move-widget-area.active {\n\tdisplay: block;\n}\n\n#customize-theme-controls .move-widget-area .description {\n\tmargin: 0;\n\tpadding: 15px 20px;\n\tfont-weight: 400;\n}\n\n#customize-theme-controls .widget-area-select {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n#customize-theme-controls .widget-area-select li {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 13px 15px 15px 42px;\n\tcolor: #555;\n\tborder-top: 1px solid #eee;\n\tcursor: pointer;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n#customize-theme-controls .widget-area-select li:before {\n\tdisplay: none;\n\tcontent: \"\\f147\";\n\tposition: absolute;\n\ttop: 12px;\n\tleft: 10px;\n\tfont: normal 20px/1 dashicons;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#customize-theme-controls .widget-area-select li:last-child {\n\tborder-bottom: 1px solid #eee;\n}\n\n#customize-theme-controls .widget-area-select .selected {\n\tcolor: #fff;\n\ttext-shadow: 0 -1px 0 rgba(0,0,0,.4);\n\tbackground: #00a0d2;\n}\n\n#customize-theme-controls .widget-area-select .selected:before {\n\tdisplay: block;\n}\n\n#customize-theme-controls .move-widget-actions {\n\ttext-align: right;\n\tpadding: 12px;\n}\n\n#customize-theme-controls .reordering .widget-title-action {\n\tdisplay: none;\n}\n\n#customize-theme-controls .reordering .widget-reorder-nav {\n\tdisplay: block;\n}\n\n/**\n * Styles for new widget addition panel\n */\n\n.wp-full-overlay-main {\n\tright: auto; /* this overrides a right: 0; which causes the preview to resize, I'd rather have it go off screen at the normal size. */\n\twidth: 100%;\n}\n\nbody.adding-widget .add-new-widget,\nbody.adding-widget .add-new-widget:hover {\n\tbackground: #eee;\n\tborder-color: #999;\n\tcolor: #32373c;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);\n\tbox-shadow: inset 0 2px 5px -3px rgba(0, 0, 0, 0.5);\n}\nbody.adding-widget .add-new-widget:before {\n\t-webkit-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n}\n\n#available-widgets .widget {\n\tposition: static;\n}\n\n/* override widgets admin page rules in wp-admin/css/wp-admin.css */\n#widgets-left #available-widgets .widget {\n\tfloat: none !important;\n\twidth: auto !important;\n}\n\n#available-widgets {\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: -301px;\n\tvisibility: hidden;\n\toverflow: auto;\n\twidth: 300px;\n\tmargin: 0;\n\tz-index: 1;\n\tbackground: #eee !important;\n\t-webkit-transition: left .18s;\n\ttransition: left .18s;\n\tborder-right: 1px solid #ddd;\n}\n\n.ios #available-widgets {\n\t-webkit-transition: left 0s;\n\ttransition: left 0s;\n}\n\n#available-widgets-list {\n\ttop: 46px;\n\tposition: absolute;\n\toverflow: auto;\n\tbottom: 0;\n\twidth: 100%;\n}\n\n#available-widgets-filter {\n\tposition: fixed;\n\ttop: 0;\n\tz-index: 1;\n\twidth: 300px;\n\theight: 46px;\n\tpadding: 8px 17px 7px 13px;\n\tbackground: #eee;\n\tborder-bottom: 1px solid #e4e4e4;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#available-widgets-filter input {\n\tpadding: 5px 10px 2px 10px;\n\twidth: 100%;\n}\n\n#available-widgets .widget-tpl {\n\tposition: relative;\n\tpadding: 20px 15px 20px 60px;\n\tbackground: #fff;\n\tborder-bottom: 1px solid #e4e4e4;\n\tcursor: pointer;\n\tdisplay: none;\n}\n\n#available-widgets .widget-tpl:hover,\n#available-widgets .widget-tpl.selected {\n\tbackground: #eee;\n\tborder-bottom-color: #ccc;\n}\n\n#available-widgets .widget-top,\n#available-widgets .widget-top:hover {\n\tborder: none;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#customize-controls .widget-title h3 {\n\tfont-size: 1em;\n}\n\n#available-widgets .widget-title h3 {\n\tpadding: 0 0 5px;\n\tfont-size: 14px;\n}\n\n#available-widgets .widget .widget-description {\n\tpadding: 0;\n\tcolor: #777;\n}\n\n#customize-preview {\n\t-webkit-transition: all 0.2s;\n\ttransition: all 0.2s;\n}\n\nbody.adding-widget #available-widgets {\n\tleft: 0;\n\tvisibility: visible;\n}\n\nbody.adding-widget .wp-full-overlay-main {\n\tleft: 300px;\n}\n\nbody.adding-widget #customize-preview {\n\topacity: 0.4;\n}\n\n\n/**\n * Widget Icon styling\n * No plurals in naming.\n * Ordered from lowest to highest specificity.\n */\n\n#available-widgets .widget-title {\n\tposition: relative;\n}\n\n#available-widgets .widget-title:before {\n\tcontent: \"\\f132\";\n\tposition: absolute;\n\ttop: -3px;\n\tright: 100%;\n\tmargin-right: 20px;\n\twidth: 20px;\n\theight: 20px;\n\tcolor: #32373c;\n\tfont: normal 20px/1 dashicons;\n\ttext-align: center;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* smiley */\n#available-widgets [class*=\"easy\"] .widget-title:before { content: \"\\f328\"; top: -4px; }\n\n/* star-filled */\n#available-widgets [class*=\"super\"] .widget-title:before,\n#available-widgets [class*=\"like\"] .widget-title:before { content: \"\\f155\"; top: -4px; }\n\n/* wordpress */\n#available-widgets [class*=\"meta\"] .widget-title:before { content: \"\\f120\"; }\n\n/* archive-box */\n#available-widgets [class*=\"archives\"] .widget-title:before { content: \"\\f480\"; top: -4px; }\n\n/* category */\n#available-widgets [class*=\"categor\"] .widget-title:before { content: \"\\f318\"; top: -4px; }\n\n/* comments */\n#available-widgets [class*=\"comment\"] .widget-title:before,\n#available-widgets [class*=\"testimonial\"] .widget-title:before,\n#available-widgets [class*=\"chat\"] .widget-title:before { content: \"\\f101\"; }\n\n/* post */\n#available-widgets [class*=\"post\"] .widget-title:before { content: \"\\f109\"; }\n\n/* admin-page */\n#available-widgets [class*=\"page\"] .widget-title:before { content: \"\\f105\"; }\n\n/* text */\n#available-widgets [class*=\"text\"] .widget-title:before { content: \"\\f478\"; }\n\n/* links */\n#available-widgets [class*=\"link\"] .widget-title:before { content: \"\\f103\"; }\n\n/* search */\n#available-widgets [class*=\"search\"] .widget-title:before { content: \"\\f179\"; }\n\n/* menu */\n#available-widgets [class*=\"menu\"] .widget-title:before,\n#available-widgets [class*=\"nav\"] .widget-title:before { content: \"\\f333\"; }\n\n/* tag-cloud */\n#available-widgets [class*=\"tag\"] .widget-title:before { content: \"\\f479\"; }\n\n/* rss */\n#available-widgets [class*=\"rss\"] .widget-title:before { content: \"\\f303\"; top: -6px; }\n\n/* calendar */\n#available-widgets [class*=\"event\"] .widget-title:before,\n#available-widgets [class*=\"calendar\"] .widget-title:before { content: \"\\f145\"; top: -4px;}\n\n/* format-image */\n#available-widgets [class*=\"image\"] .widget-title:before,\n#available-widgets [class*=\"photo\"] .widget-title:before,\n#available-widgets [class*=\"slide\"] .widget-title:before,\n#available-widgets [class*=\"instagram\"] .widget-title:before { content: \"\\f128\"; }\n\n/* format-gallery */\n#available-widgets [class*=\"album\"] .widget-title:before,\n#available-widgets [class*=\"galler\"] .widget-title:before { content: \"\\f161\"; }\n\n/* format-video */\n#available-widgets [class*=\"video\"] .widget-title:before,\n#available-widgets [class*=\"tube\"] .widget-title:before { content: \"\\f126\"; }\n\n/* format-audio */\n#available-widgets [class*=\"music\"] .widget-title:before,\n#available-widgets [class*=\"radio\"] .widget-title:before,\n#available-widgets [class*=\"audio\"] .widget-title:before { content: \"\\f127\"; }\n\n/* admin-users */\n#available-widgets [class*=\"login\"] .widget-title:before,\n#available-widgets [class*=\"user\"] .widget-title:before,\n#available-widgets [class*=\"member\"] .widget-title:before,\n#available-widgets [class*=\"avatar\"] .widget-title:before,\n#available-widgets [class*=\"subscriber\"] .widget-title:before,\n#available-widgets [class*=\"profile\"] .widget-title:before,\n#available-widgets [class*=\"grofile\"] .widget-title:before { content: \"\\f110\"; }\n\n/* cart */\n#available-widgets [class*=\"commerce\"] .widget-title:before,\n#available-widgets [class*=\"shop\"] .widget-title:before,\n#available-widgets [class*=\"cart\"] .widget-title:before { content: \"\\f174\"; top: -4px; }\n\n/* shield */\n#available-widgets [class*=\"secur\"] .widget-title:before,\n#available-widgets [class*=\"firewall\"] .widget-title:before { content: \"\\f332\"; }\n\n/* chart-bar */\n#available-widgets [class*=\"analytic\"] .widget-title:before,\n#available-widgets [class*=\"stat\"] .widget-title:before,\n#available-widgets [class*=\"poll\"] .widget-title:before { content: \"\\f185\"; }\n\n/* feedback */\n#available-widgets [class*=\"form\"] .widget-title:before { content: \"\\f175\"; }\n\n/* email-alt */\n#available-widgets [class*=\"subscribe\"] .widget-title:before,\n#available-widgets [class*=\"news\"] .widget-title:before,\n#available-widgets [class*=\"contact\"] .widget-title:before,\n#available-widgets [class*=\"mail\"] .widget-title:before { content: \"\\f466\"; }\n\n/* share */\n#available-widgets [class*=\"share\"] .widget-title:before,\n#available-widgets [class*=\"socia\"] .widget-title:before { content: \"\\f237\"; }\n\n/* translation */\n#available-widgets [class*=\"lang\"] .widget-title:before,\n#available-widgets [class*=\"translat\"] .widget-title:before { content: \"\\f326\"; }\n\n/* location-alt */\n#available-widgets [class*=\"locat\"] .widget-title:before,\n#available-widgets [class*=\"map\"] .widget-title:before { content: \"\\f231\"; }\n\n/* download */\n#available-widgets [class*=\"download\"] .widget-title:before { content: \"\\f316\"; }\n\n/* cloud */\n#available-widgets [class*=\"weather\"] .widget-title:before { content: \"\\f176\"; top: -4px;}\n\n/* facebook */\n#available-widgets [class*=\"facebook\"] .widget-title:before { content: \"\\f304\"; }\n\n/* twitter */\n#available-widgets [class*=\"tweet\"] .widget-title:before,\n#available-widgets [class*=\"twitter\"] .widget-title:before { content: \"\\f301\"; }\n\n#available-widgets .customize-section-title {\n\tdisplay: none;\n}\n\n@media screen and (max-height: 700px) and (min-width: 981px) {\n\t.customize-control-widget {\n\t\tmargin-bottom: 0;\n\t}\n\t.widget-top {\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t\tmargin-top: -1px;\n\t}\n\t.widget-top:hover {\n\t\tposition: relative;\n\t\tz-index: 1;\n\t}\n\t.last-widget {\n\t\tmargin-bottom: 15px;\n\t}\n\t.widget-title h3 {\n\t\tpadding: 13px 15px;\n\t}\n\t.widget-reorder-nav span {\n\t\theight: 39px;\n\t}\n\t.widget-reorder-nav span:before {\n\t\tline-height: 39px;\n\t}\n\t#customize-theme-controls .widget-area-select li {\n\t\tpadding: 9px 15px 11px 42px;\n\t}\n\t#customize-theme-controls .widget-area-select li:before {\n\t\ttop: 8px;\n\t}\n}\n\n@media screen and ( max-width: 640px ) {\n\tbody.adding-widget div#available-widgets {\n\t\ttop: 46px;\n\t\tleft: 0;\n\t\tz-index: 10;\n\t\twidth: 100%;\n\t}\n\n\t#available-widgets .customize-section-title {\n\t\tdisplay: block;\n\t\tmargin: 0;\n\t}\n\n\t#available-widgets .customize-section-back {\n\t\theight: 69px;\n\t}\n\n\t#available-widgets .customize-section-title h3 {\n\t\tfont-size: 20px;\n\t\tfont-weight: 200;\n\t\tpadding: 9px 10px 12px 14px;\n\t\tmargin: 0;\n\t\tline-height: 24px;\n\t\tcolor: #555;\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t#available-widgets .customize-section-title .customize-action {\n\t\tfont-size: 13px;\n\t\tdisplay: block;\n\t\tfont-weight: 400;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t#available-widgets-filter {\n\t\tposition: relative;\n\t\twidth: 100%;\n\t\tbackground: #fff;\n\t\theight: auto;\n\t\tpadding: 10px 15px;\n\t}\n\n\t#available-widgets-list {\n\t\ttop: 140px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/dashboard-rtl.css",
    "content": "#wpbody-content #dashboard-widgets.columns-1 .postbox-container {\n\twidth: 100%;\n}\n\n#wpbody-content #dashboard-widgets.columns-2 .postbox-container {\n\twidth: 49.5%;\n}\n\n#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2,\n#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3,\n#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4 {\n\tfloat: left;\n\twidth: 50.5%;\n}\n\n#wpbody-content #dashboard-widgets.columns-3 .postbox-container {\n\twidth: 33.5%;\n}\n\n#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1 {\n\twidth: 33%;\n}\n\n#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3,\n#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4 {\n\tfloat: left;\n}\n\n#wpbody-content #dashboard-widgets.columns-4 .postbox-container {\n\twidth: 25%;\n}\n\n#dashboard-widgets .postbox-container {\n\twidth: 25%;\n}\n\n#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container {\n\tborder: none !important;\n}\n\n.ie8 #wpbody-content #dashboard-widgets .postbox-container {\n\twidth: 49.5%;\n}\n\n.ie8 #wpbody-content #dashboard-widgets #postbox-container-2,\n.ie8 #wpbody-content #dashboard-widgets #postbox-container-3,\n.ie8 #wpbody-content #dashboard-widgets #postbox-container-4 {\n\tfloat: left;\n\twidth: 50.5%;\n}\n\n.ie8 #dashboard-widgets #postbox-container-3 .empty-container,\n.ie8 #dashboard-widgets #postbox-container-4 .empty-container {\n\tborder: 0 none;\n\theight: 0;\n\tmin-height: 0;\n}\n\n/*------------------------------------------------------------------------------\n  9.0 - Dashboard\n------------------------------------------------------------------------------*/\n\n#dashboard-widgets-wrap {\n\toverflow: hidden;\n\tmargin: 0 -8px;\n}\n\n#dashboard-widgets .postbox .inside {\n\tmargin-bottom: 0;\n}\n\n#dashboard-widgets .meta-box-sortables {\n\tmargin: 0 8px;\n\tmin-height: 100px;\n}\n\n/* @todo: this was originally in this section, but likely belongs elsewhere */\n#the-comment-list td.comment p.comment-author {\n\tmargin-top: 0;\n\tmargin-right: 0;\n}\n\n#the-comment-list p.comment-author img {\n\tfloat: right;\n\tmargin-left: 8px;\n}\n\n#the-comment-list p.comment-author strong a {\n\tborder: none;\n}\n\n#the-comment-list td {\n\tvertical-align: top;\n}\n\n#the-comment-list td.comment {\n\tword-wrap: break-word;\n}\n\n#the-comment-list td.comment img {\n\tmax-width: 100%;\n}\n\n/* Welcome Panel */\n.welcome-panel {\n\tposition: relative;\n\toverflow: auto;\n\tmargin: 16px 0;\n\tpadding: 23px 10px 0;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbackground: #fff;\n\tfont-size: 13px;\n\tline-height: 2.1em;\n}\n\n.welcome-panel h2 {\n\tmargin: 0;\n\tfont-size: 21px;\n\tfont-weight: normal;\n\tline-height: 1.2;\n}\n\n.welcome-panel h3 {\n\tmargin: 1.33em 0 0;\n\tfont-size: 16px;\n}\n\n.welcome-panel li {\n\tfont-size: 14px;\n}\n\n.welcome-panel p {\n\tcolor: #777;\n}\n\n.welcome-panel a {\n\ttext-decoration: none;\n}\n\n.welcome-panel .about-description {\n\tfont-size: 16px;\n\tmargin: 0;\n}\n\n.welcome-panel .welcome-panel-close {\n\tposition: absolute;\n\ttop: 10px;\n\tleft: 10px;\n\tpadding: 10px 21px 10px 15px;\n\tfont-size: 13px;\n\tline-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */\n\ttext-decoration: none;\n}\n\n.welcome-panel .welcome-panel-close:before {\n\tposition: absolute;\n\ttop: 8px;\n\tright: 0;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n.wp-core-ui .welcome-panel .button.button-hero {\n\tmargin: 15px 0 3px 13px;\n\tpadding: 12px 36px;\n\theight: auto;\n\tline-height: 1.4285714;\n\twhite-space: normal;\n}\n\n.welcome-panel-content {\n\tmargin-right: 13px;\n\tmax-width: 1500px;\n}\n\n.welcome-panel .welcome-panel-column-container {\n\tclear: both;\n\tposition: relative;\n}\n\n.welcome-panel .welcome-panel-column {\n\twidth: 32%;\n\tmin-width: 200px;\n\tfloat: right;\n}\n\n.ie8 .welcome-panel .welcome-panel-column {\n\tmin-width: 230px;\n}\n\n.welcome-panel .welcome-panel-column:first-child {\n\twidth: 36%;\n}\n\n.welcome-panel-column p.hide-if-no-customize {\n\tmargin-top: 10px;\n}\n\n.welcome-panel-column p {\n\tmargin-top: 7px;\n\tcolor: #464646;\n}\n\n.welcome-panel .welcome-icon {\n\tbackground: transparent !important;\n}\n\n.welcome-panel .welcome-icon:before {\n\tcolor: #82878c;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0 0 0 10px;\n\ttop: -1px;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tvertical-align: top;\n}\n\n.welcome-panel .welcome-write-blog:before,\n.welcome-panel .welcome-edit-page:before {\n\tcontent: \"\\f119\";\n\ttop: -3px;\n}\n\n.welcome-panel .welcome-add-page:before {\n\tcontent: \"\\f132\";\n}\n\n.welcome-panel .welcome-view-site:before {\n\tcontent: \"\\f115\";\n\ttop: -2px;\n}\n\n.welcome-panel .welcome-widgets-menus:before {\n\tcontent: \"\\f116\";\n\ttop: -2px;\n}\n\n.welcome-panel .welcome-comments:before {\n\tcontent: \"\\f117\";\n\ttop: -1px;\n}\n\n.welcome-panel .welcome-learn-more:before {\n\tcontent: \"\\f118\";\n\ttop: -1px;\n}\n\n.welcome-panel .welcome-widgets-menus {\n\tline-height: 16px;\n}\n\n.welcome-panel .welcome-panel-column ul {\n\tmargin: 0.8em 0 1em 1em;\n}\n\n.welcome-panel .welcome-panel-column li {\n\tline-height: 16px;\n\tlist-style-type: none;\n\tpadding: 0 0 8px;\n}\n\n/* Dashboard WordPress news */\n\n#dashboard_primary .inside {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#dashboard_primary .widget-loading,\n#dashboard_primary .dashboard-widget-control-form {\n\tpadding: 12px 12px 0;\n}\n\nbody #dashboard-widgets .postbox form .submit {\n\tmargin: 0;\n}\n\n.dashboard-widget-control-form {\n\toverflow: hidden;\n}\n\n.dashboard-widget-control-form p {\n\tmargin-top: 0;\n}\n\n.rssSummary {\n\tcolor: #777;\n\tmargin-top: 4px;\n}\n\n#dashboard_primary .rss-widget {\n\tborder-bottom: 1px solid #eee;\n\tfont-size: 13px;\n\tpadding: 8px 12px 10px;\n}\n\n#dashboard_primary .rss-widget:last-child {\n\tborder-bottom: none;\n\tpadding-bottom: 8px;\n}\n\n#dashboard_primary .rss-widget a {\n\tfont-weight: normal;\n}\n\n#dashboard_primary .rss-widget span,\n#dashboard_primary .rss-widget span.rss-date {\n\tcolor: #777;\n}\n\n#dashboard_primary .rss-widget span.rss-date {\n\tmargin-right: 12px;\n}\n\n#dashboard_primary .rss-widget ul li {\n\tmargin-bottom: 8px;\n}\n\n/* Dashboard right now */\n\n#dashboard_right_now ul {\n\tmargin: 0;\n\t/* contain floats but don't use overflow: hidden */\n\tdisplay: inline-block;\n\twidth: 100%;\n}\n\n#dashboard_right_now li {\n\twidth: 50%;\n\tfloat: right;\n\tmargin-bottom: 10px;\n}\n\n#dashboard_right_now .inside {\n\tpadding: 0;\n}\n\n#dashboard_right_now .main {\n\tpadding: 0 12px 11px;\n}\n\n#dashboard_right_now .main p {\n\tmargin: 0;\n}\n\n#dashboard_right_now #wp-version-message .button {\n\tfloat: left;\n\tposition: relative;\n\ttop: -5px;\n\tmargin-right: 5px;\n}\n\n.mu-storage {\n\toverflow: hidden;\n}\n\n#dashboard-widgets h3.mu-storage {\n\tmargin: 0 0 10px;\n\tpadding: 0;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n/* Dashboard right now - Colors */\n\n#dashboard_right_now li a:before,\n#dashboard_right_now li span:before {\n\tcolor: #82878c;\n}\n\n#dashboard_right_now .sub {\n\tcolor: #777;\n\tbackground: #f5f5f5;\n\tborder-top: 1px solid #eee;\n\tpadding: 10px 12px 6px 12px;\n}\n\n#dashboard_right_now .sub h3 {\n\tcolor: #555;\n}\n\n#dashboard_right_now .sub p {\n\tmargin: 0 0 1em;\n}\n\n#dashboard_right_now .warning a:before,\n#dashboard_right_now .warning span:before {\n\tcolor: #d54e21;\n}\n\n/* Dashboard right now - Icons */\n#dashboard_right_now li a:before,\n#dashboard_right_now li span:before {\n\tcontent: \"\\f159\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: block;\n\tfloat: right;\n\tmargin: 0 0 0 5px;\n\tpadding: 0;\n\ttext-indent: 0;\n\ttext-align: center;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\ttext-decoration: none !important;\n}\n\n#dashboard_right_now .page-count a:before,\n#dashboard_right_now .page-count span:before {\n\tcontent: \"\\f105\";\n}\n\n#dashboard_right_now .post-count a:before,\n#dashboard_right_now .post-count span:before {\n\tcontent: \"\\f109\";\n}\n\n#dashboard_right_now .comment-count a:before {\n\tcontent: \"\\f101\";\n}\n\n#dashboard_right_now .comment-mod-count a:before {\n\tcontent: \"\\f125\";\n}\n\n#dashboard_right_now .storage-count a:before {\n\tcontent: \"\\f104\";\n}\n\n#dashboard_right_now .storage-count.warning a:before {\n\tcontent: \"\\f153\";\n}\n\n/* Dashboard Quick Draft */\n\n#dashboard_quick_press .inside {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#dashboard_quick_press div.updated {\n\tmargin-bottom: 10px;\n\tborder: 1px solid #eee;\n\tborder-width: 1px 0 1px 1px;\n}\n\n#dashboard_quick_press form {\n\tmargin: 12px;\n}\n\n#dashboard_quick_press .drafts,\n#dashboard_quick_press .easy-blogging {\n\tpadding: 10px 0 0;\n}\n\n/* Dashboard Quick Draft - Form styling */\n\ninput#save-post {\n\tfloat: right;\n}\n\nform.initial-form.quickpress-open label.prompt {\n\tfont-style: normal;\n}\n\nform.initial-form.quickpress-open input#title {\n\theight: auto;\n}\n\n#dashboard_quick_press input,\n#dashboard_quick_press textarea {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin: 0;\n}\n\n#dashboard_quick_press textarea {\n\tresize: vertical;\n}\n\n#dashboard-widgets .postbox form .submit {\n\tmargin: -39px 0;\n\tfloat: left;\n}\n\n#description-wrap {\n\tmargin-top: 12px;\n}\n\n#title-wrap #title-prompt-text,\n.textarea-wrap #content-prompt-text {\n\tcolor: #777;\n}\n\n#title-wrap #title-prompt-text {\n\tfont-size: 1.1em;\n\tpadding: 7px 8px;\n}\n\n.input-text-wrap,\n.textarea-wrap {\n\tposition: relative;\n}\n\n.input-text-wrap .prompt,\n.textarea-wrap .prompt {\n\tposition: absolute;\n}\n\n.textarea-wrap #content-prompt-text {\n\tfont-size: 1.1em;\n\tpadding: 7px 8px;\n}\n\n.textarea-wrap textarea#content {\n\tmargin: 0 0 8px;\n\tpadding: 6px 7px;\n}\n\n#quick-press textarea#content {\n\tmin-height: 90px;\n\tmax-height: 1300px;\n\tresize: none;\n}\n\n/* Dashboard Quick Draft - Drafts list */\n\n.js #dashboard_quick_press .drafts {\n\tborder-top: 1px solid #eee;\n}\n\n#dashboard_quick_press .drafts abbr {\n\tborder: none;\n}\n\n#dashboard_quick_press .drafts .view-all {\n\tfloat: left;\n\tmargin: 0 0 0 12px;\n}\n\n#dashboard_primary a.rsswidget {\n\tfont-weight: normal;\n}\n\n#dashboard_quick_press .drafts ul {\n\tmargin: 0 12px;\n}\n\n#dashboard_quick_press .drafts li {\n\tmargin-bottom: 1em;\n}\n#dashboard_quick_press .drafts li time {\n\tcolor: #777;\n}\n\n#dashboard_quick_press .drafts p {\n\tmargin: 0;\n\tword-wrap: break-word;\n}\n\n#dashboard_quick_press .draft-title {\n\tword-wrap: break-word;\n}\n\n#dashboard_quick_press .draft-title a,\n#dashboard_quick_press .draft-title time {\n\tmargin: 0 0 0 5px;\n}\n\n/* Dashboard common styles */\n\n#dashboard-widgets h4, /* Back-compat for pre-4.4 */\n#dashboard-widgets h3,\n#dashboard_quick_press .drafts h2 {\n\tmargin: 0 12px 8px;\n\tpadding: 0;\n\tfont-size: 14px;\n\tfont-weight: normal;\n\tcolor: #23282d;\n}\n\n#dashboard_quick_press .drafts h2 {\n\tline-height: inherit;\n}\n\n#dashboard-widgets .inside h4, /* Back-compat for pre-4.4 */\n#dashboard-widgets .inside h3 {\n\tmargin-right: 0;\n\tmargin-left: 0;\n}\n\n/* Dashboard activity widget */\n\n#dashboard_activity .comment-meta span.approve:before {\n\tcontent: \"\\f227\";\n\tfont: 20px/.5 dashicons;\n\tmargin-right: 12px;\n\tvertical-align: middle;\n\tposition: relative;\n\ttop: -1px;\n\tmargin-left: 2px;\n}\n\n#dashboard_activity .inside {\n\tmargin: 0;\n\tpadding-bottom: 0;\n}\n\n#dashboard_activity .no-activity {\n\toverflow: hidden;\n\tpadding: 0 0 12px;\n\ttext-align: center;\n}\n\n#dashboard_activity .no-activity p {\n\tcolor: #999;\n\tfont-size: 16px;\n}\n\n#dashboard_activity .no-activity .smiley {\n\tmargin-top: 0;\n}\n\n#dashboard_activity .no-activity .smiley:before {\n\tcontent: \"\\f328\";\n\tfont: normal 120px/1 dashicons;\n\tspeak: none;\n\tdisplay: block;\n\tmargin: 0 0 0 5px;\n\tpadding: 0;\n\ttext-indent: 0;\n\ttext-align: center;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\ttext-decoration: none !important;\n}\n\n#dashboard_activity .subsubsub {\n\tfloat: none;\n\tborder-top: 1px solid #eee;\n\tmargin: 0 -12px;\n\tpadding: 8px 12px 4px;\n}\n\n#future-posts ul,\n#published-posts ul {\n\tclear: both;\n\tmargin-bottom: 0;\n}\n\n#future-posts li,\n#published-posts li {\n\tmargin-bottom: 8px;\n}\n\n#future-posts ul span,\n#published-posts ul span {\n\tdisplay: inline-block;\n\tmargin-left: 5px;\n\tmin-width: 150px;\n\tcolor: #777;\n}\n\n.activity-block {\n\tborder-bottom: 1px solid #eee;\n\tmargin: 0 -12px;\n\tpadding: 8px 12px 4px;\n}\n\n.activity-block:last-child {\n\tborder-bottom: none;\n}\n\n.activity-block .subsubsub li {\n\tcolor: #ddd;\n}\n\n/* Dashboard activity widget - Comments */\n/* @todo: needs serious de-duplication */\n\n#activity-widget #the-comment-list tr.undo,\n#activity-widget #the-comment-list div.undo {\n\tbackground: none;\n\tpadding: 6px 0;\n\tmargin-right: 12px;\n}\n\n#activity-widget #the-comment-list .comment-item {\n\tbackground: #fafafa;\n\tpadding: 12px;\n\tposition: relative;\n}\n\n#activity-widget #the-comment-list .avatar {\n\tposition: absolute;\n\ttop: 13px;\n}\n\n#activity-widget #the-comment-list .dashboard-comment-wrap {\n\tpadding-right: 63px;\n}\n\n#activity-widget #the-comment-list .dashboard-comment-wrap blockquote {\n\tmargin: 1em 0;\n}\n\n#activity-widget #the-comment-list .comment-item p.row-actions {\n\tmargin: 4px 0 0 0;\n}\n\n#activity-widget #the-comment-list .comment-item:first-child {\n\tborder-top: 1px solid #eeeeee;\n}\n\n#activity-widget #the-comment-list .unapproved {\n\tbackground-color: #fef7f1;\n}\n\n#activity-widget #the-comment-list .unapproved:before {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tbackground: #d54e21;\n\twidth: 4px;\n}\n\n#activity-widget #the-comment-list .spam-undo-inside .avatar,\n#activity-widget #the-comment-list .trash-undo-inside .avatar {\n\tposition: relative;\n\ttop: 0;\n}\n\n/* Browse happy box */\n\n#dashboard-widgets #dashboard_browser_nag.postbox .inside {\n\tmargin: 10px;\n}\n\n.edit-box {\n\tdisplay: none;\n}\n\nh3:hover .edit-box {\n\tdisplay: inline;\n}\n\n#dashboard-widgets form .input-text-wrap input {\n\twidth: 100%;\n}\n\n#dashboard-widgets form .textarea-wrap textarea {\n\twidth: 100%;\n}\n\n#dashboard-widgets .postbox form .submit {\n\tfloat: none;\n\tmargin: .5em 0 0;\n\tpadding: 0;\n\tborder: none;\n}\n\n#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish {\n\tmin-width: 0;\n}\n\n#dashboard-widgets a {\n\ttext-decoration: none;\n}\n\n#dashboard-widgets h3 a {\n\ttext-decoration: underline;\n}\n\n#dashboard-widgets h3 .postbox-title-action {\n\tposition: absolute;\n\tleft: 10px;\n\tpadding: 0;\n\ttop: 5px;\n}\n\n.js #dashboard-widgets h3 .postbox-title-action {\n\tleft: 33px;\n}\n\n#dashboard_plugins h5 {\n\tfont-size: 14px;\n}\n\n/* Recent Comments */\n\n#latest-comments #the-comment-list {\n\tposition: relative;\n\tmargin: 0 -12px;\n}\n\n#activity-widget #the-comment-list .comment,\n#activity-widget #the-comment-list .pingback {\n\t-webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.06);\n\tbox-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n\n#activity-widget .comments #the-comment-list .alt {\n\tbackground-color: transparent;\n}\n\n#activity-widget #latest-comments #the-comment-list .comment-item {\n\tpadding: 1em 12px;\n}\n\n#latest-comments #the-comment-list .pingback {\n\tpadding-right: 12px !important;\n}\n\n#latest-comments #the-comment-list .comment-item:first-child {\n\tborder-top: none;\n}\n\n#latest-comments #the-comment-list .comment-meta {\n\tline-height: 1.5em;\n\tmargin: 0;\n\tcolor: #666;\n}\n\n#latest-comments #the-comment-list .comment-meta cite {\n\tfont-style: normal;\n\tfont-weight: normal;\n}\n\n#latest-comments #the-comment-list .comment-item blockquote,\n#latest-comments #the-comment-list .comment-item blockquote p {\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: inline;\n}\n\n#latest-comments #the-comment-list .comment-item p.row-actions {\n\tmargin: 3px 0 0;\n\tpadding: 0;\n\tfont-size: 13px;\n}\n\n/* QuickDraft */\n\n#title-wrap label,\n#description-wrap label {\n\tcursor: text;\n}\n\n#title-wrap #title {\n\tpadding: 2px 6px;\n\tfont-size: 1.3em;\n\toutline: none;\n}\n\n#title-wrap #title-prompt-text {\n\tfont-size: 1.1em;\n\tpadding: 5px 8px;\n}\n\n/* Feeds */\n.rss-widget ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\na.rsswidget {\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tline-height: 1.7em;\n}\n\n.rss-widget ul li {\n\tline-height: 1.5em;\n\tmargin-bottom: 12px;\n}\n\n.rss-widget span.rss-date {\n\tcolor: #999;\n\tfont-size: 13px;\n\tmargin-right: 3px;\n}\n\n.rss-widget cite {\n\tdisplay: block;\n\ttext-align: left;\n\tmargin: 0 0 1em;\n\tpadding: 0;\n}\n\n.rss-widget cite:before {\n\tcontent: \"\\2014\";\n}\n\n.dashboard-comment-wrap {\n\tword-wrap: break-word;\n}\n\n/* Browser Nag */\n#dashboard_browser_nag a.update-browser-link {\n\tfont-size: 1.2em;\n\tfont-weight: 600;\n}\n\n#dashboard_browser_nag a {\n\ttext-decoration: underline;\n}\n\n#dashboard_browser_nag p.browser-update-nag.has-browser-icon {\n\tpadding-left: 125px;\n}\n\n#dashboard_browser_nag .browser-icon {\n\tmargin-top: -35px;\n}\n\n#dashboard_browser_nag.postbox.browser-insecure {\n\tbackground-color: #ac1b1b;\n\tborder-color: #ac1b1b;\n}\n\n#dashboard_browser_nag.postbox {\n\tbackground-color: #e29808;\n\tbackground-image: none;\n\tborder-color: #edc048;\n\tcolor: #fff;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#dashboard_browser_nag.postbox.browser-insecure h2 {\n\tborder-bottom-color: #cd5a5a;\n\tcolor: #fff;\n}\n\n#dashboard_browser_nag.postbox h2 {\n\tborder-bottom-color: #f6e2ac;\n\tbackground: transparent none;\n\tcolor: #fff;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#dashboard_browser_nag a {\n\tcolor: #fff;\n}\n\n/* Make the browser nags easier to read with Open Sans */\n\n#dashboard_browser_nag h2.hndle {\n\tborder: none;\n\tfont-weight: 600;\n\tfont-size: 20px;\n\tpadding-top: 10px;\n}\n\n.postbox#dashboard_browser_nag p a.dismiss {\n\tfont-size: 14px;\n}\n\n.postbox#dashboard_browser_nag p,\n.postbox#dashboard_browser_nag a,\n.postbox#dashboard_browser_nag p.browser-update-nag {\n\tfont-size: 16px;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/* one column on the dash */\n@media only screen and (max-width: 799px) {\n\t#wpbody-content #dashboard-widgets .postbox-container {\n\t\twidth: 100%;\n\t}\n}\n\n/* two columns on the dash, but keep the setting if one is selected */\n@media only screen and (min-width: 800px) and (max-width: 1499px) {\n\t#wpbody-content #dashboard-widgets .postbox-container {\n\t\twidth: 49.5%;\n\t}\n\n\t#wpbody-content #dashboard-widgets #postbox-container-2,\n\t#wpbody-content #dashboard-widgets #postbox-container-3,\n\t#wpbody-content #dashboard-widgets #postbox-container-4 {\n\t\tfloat: left;\n\t\twidth: 50.5%;\n\t}\n\n\t#dashboard-widgets #postbox-container-3 .empty-container,\n\t#dashboard-widgets #postbox-container-4 .empty-container {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n\n\t#wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container {\n\t\twidth: 100%;\n\t}\n\n\t#wpbody #wpbody-content .metabox-holder.columns-1 .postbox-container .empty-container {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n\n\t/* show the radio buttons for column prefs only for one or two columns */\n\t.index-php .screen-layout,\n\t.index-php .columns-prefs {\n\t\tdisplay: block;\n\t}\n\n\t.columns-prefs .columns-prefs-3,\n\t.columns-prefs .columns-prefs-4 {\n\t\tdisplay: none;\n\t}\n}\n\n/* three columns on the dash */\n@media only screen and (min-width: 1500px) and (max-width: 1800px) {\n\t#wpbody-content #dashboard-widgets .postbox-container {\n\t\twidth: 33.5%;\n\t}\n\n\t#wpbody-content #dashboard-widgets #postbox-container-1 {\n\t\twidth: 33%;\n\t}\n\n\t#wpbody-content #dashboard-widgets #postbox-container-3,\n\t#wpbody-content #dashboard-widgets #postbox-container-4 {\n\t\tfloat: left;\n\t}\n\n\t#dashboard-widgets #postbox-container-4 .empty-container {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n}\n\n@media screen and (max-width: 870px) {\n\t.welcome-panel .welcome-panel-column,\n\t.welcome-panel .welcome-panel-column:first-child {\n\t\tdisplay: block;\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\n\t.welcome-panel .welcome-panel-column li {\n\t\tdisplay: inline-block;\n\t\tmargin-left: 13px;\n\t}\n\n\t.welcome-panel .welcome-panel-column ul {\n\t\tmargin: 0.4em 0 0;\n\t}\n\n}\n\n@media screen and ( max-width: 782px ) {\n\t#dashboard_recent_comments #the-comment-list .comment-item .avatar {\n\t\theight: 30px;\n\t\twidth: 30px;\n\t\tmargin: 4px 0 5px 10px;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t/* Keep the close icon from overlapping the Welcome text. */\n\t.welcome-panel .welcome-panel-close {\n\t\toverflow: hidden;\n\t\ttext-indent: 40px;\n\t\twhite-space: nowrap;\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tpadding: 5px;\n\t\ttop: 5px;\n\t\tleft: 5px;\n\t}\n\n\t/* Make the close icon larger for tappability. */\n\t.welcome-panel .welcome-panel-close:before {\n\t\tfont-size: 20px;\n\t\ttop: 5px;\n\t\tright: -35px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/dashboard.css",
    "content": "#wpbody-content #dashboard-widgets.columns-1 .postbox-container {\n\twidth: 100%;\n}\n\n#wpbody-content #dashboard-widgets.columns-2 .postbox-container {\n\twidth: 49.5%;\n}\n\n#wpbody-content #dashboard-widgets.columns-2 #postbox-container-2,\n#wpbody-content #dashboard-widgets.columns-2 #postbox-container-3,\n#wpbody-content #dashboard-widgets.columns-2 #postbox-container-4 {\n\tfloat: right;\n\twidth: 50.5%;\n}\n\n#wpbody-content #dashboard-widgets.columns-3 .postbox-container {\n\twidth: 33.5%;\n}\n\n#wpbody-content #dashboard-widgets.columns-3 #postbox-container-1 {\n\twidth: 33%;\n}\n\n#wpbody-content #dashboard-widgets.columns-3 #postbox-container-3,\n#wpbody-content #dashboard-widgets.columns-3 #postbox-container-4 {\n\tfloat: right;\n}\n\n#wpbody-content #dashboard-widgets.columns-4 .postbox-container {\n\twidth: 25%;\n}\n\n#dashboard-widgets .postbox-container {\n\twidth: 25%;\n}\n\n#dashboard-widgets-wrap .columns-3 #postbox-container-4 .empty-container {\n\tborder: none !important;\n}\n\n.ie8 #wpbody-content #dashboard-widgets .postbox-container {\n\twidth: 49.5%;\n}\n\n.ie8 #wpbody-content #dashboard-widgets #postbox-container-2,\n.ie8 #wpbody-content #dashboard-widgets #postbox-container-3,\n.ie8 #wpbody-content #dashboard-widgets #postbox-container-4 {\n\tfloat: right;\n\twidth: 50.5%;\n}\n\n.ie8 #dashboard-widgets #postbox-container-3 .empty-container,\n.ie8 #dashboard-widgets #postbox-container-4 .empty-container {\n\tborder: 0 none;\n\theight: 0;\n\tmin-height: 0;\n}\n\n/*------------------------------------------------------------------------------\n  9.0 - Dashboard\n------------------------------------------------------------------------------*/\n\n#dashboard-widgets-wrap {\n\toverflow: hidden;\n\tmargin: 0 -8px;\n}\n\n#dashboard-widgets .postbox .inside {\n\tmargin-bottom: 0;\n}\n\n#dashboard-widgets .meta-box-sortables {\n\tmargin: 0 8px;\n\tmin-height: 100px;\n}\n\n/* @todo: this was originally in this section, but likely belongs elsewhere */\n#the-comment-list td.comment p.comment-author {\n\tmargin-top: 0;\n\tmargin-left: 0;\n}\n\n#the-comment-list p.comment-author img {\n\tfloat: left;\n\tmargin-right: 8px;\n}\n\n#the-comment-list p.comment-author strong a {\n\tborder: none;\n}\n\n#the-comment-list td {\n\tvertical-align: top;\n}\n\n#the-comment-list td.comment {\n\tword-wrap: break-word;\n}\n\n#the-comment-list td.comment img {\n\tmax-width: 100%;\n}\n\n/* Welcome Panel */\n.welcome-panel {\n\tposition: relative;\n\toverflow: auto;\n\tmargin: 16px 0;\n\tpadding: 23px 10px 0;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbackground: #fff;\n\tfont-size: 13px;\n\tline-height: 2.1em;\n}\n\n.welcome-panel h2 {\n\tmargin: 0;\n\tfont-size: 21px;\n\tfont-weight: normal;\n\tline-height: 1.2;\n}\n\n.welcome-panel h3 {\n\tmargin: 1.33em 0 0;\n\tfont-size: 16px;\n}\n\n.welcome-panel li {\n\tfont-size: 14px;\n}\n\n.welcome-panel p {\n\tcolor: #777;\n}\n\n.welcome-panel a {\n\ttext-decoration: none;\n}\n\n.welcome-panel .about-description {\n\tfont-size: 16px;\n\tmargin: 0;\n}\n\n.welcome-panel .welcome-panel-close {\n\tposition: absolute;\n\ttop: 10px;\n\tright: 10px;\n\tpadding: 10px 15px 10px 21px;\n\tfont-size: 13px;\n\tline-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */\n\ttext-decoration: none;\n}\n\n.welcome-panel .welcome-panel-close:before {\n\tposition: absolute;\n\ttop: 8px;\n\tleft: 0;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n.wp-core-ui .welcome-panel .button.button-hero {\n\tmargin: 15px 13px 3px 0;\n\tpadding: 12px 36px;\n\theight: auto;\n\tline-height: 1.4285714;\n\twhite-space: normal;\n}\n\n.welcome-panel-content {\n\tmargin-left: 13px;\n\tmax-width: 1500px;\n}\n\n.welcome-panel .welcome-panel-column-container {\n\tclear: both;\n\tposition: relative;\n}\n\n.welcome-panel .welcome-panel-column {\n\twidth: 32%;\n\tmin-width: 200px;\n\tfloat: left;\n}\n\n.ie8 .welcome-panel .welcome-panel-column {\n\tmin-width: 230px;\n}\n\n.welcome-panel .welcome-panel-column:first-child {\n\twidth: 36%;\n}\n\n.welcome-panel-column p.hide-if-no-customize {\n\tmargin-top: 10px;\n}\n\n.welcome-panel-column p {\n\tmargin-top: 7px;\n\tcolor: #464646;\n}\n\n.welcome-panel .welcome-icon {\n\tbackground: transparent !important;\n}\n\n.welcome-panel .welcome-icon:before {\n\tcolor: #82878c;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0 10px 0 0;\n\ttop: -1px;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tvertical-align: top;\n}\n\n.welcome-panel .welcome-write-blog:before,\n.welcome-panel .welcome-edit-page:before {\n\tcontent: \"\\f119\";\n\ttop: -3px;\n}\n\n.welcome-panel .welcome-add-page:before {\n\tcontent: \"\\f132\";\n}\n\n.welcome-panel .welcome-view-site:before {\n\tcontent: \"\\f115\";\n\ttop: -2px;\n}\n\n.welcome-panel .welcome-widgets-menus:before {\n\tcontent: \"\\f116\";\n\ttop: -2px;\n}\n\n.welcome-panel .welcome-comments:before {\n\tcontent: \"\\f117\";\n\ttop: -1px;\n}\n\n.welcome-panel .welcome-learn-more:before {\n\tcontent: \"\\f118\";\n\ttop: -1px;\n}\n\n.welcome-panel .welcome-widgets-menus {\n\tline-height: 16px;\n}\n\n.welcome-panel .welcome-panel-column ul {\n\tmargin: 0.8em 1em 1em 0;\n}\n\n.welcome-panel .welcome-panel-column li {\n\tline-height: 16px;\n\tlist-style-type: none;\n\tpadding: 0 0 8px;\n}\n\n/* Dashboard WordPress news */\n\n#dashboard_primary .inside {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#dashboard_primary .widget-loading,\n#dashboard_primary .dashboard-widget-control-form {\n\tpadding: 12px 12px 0;\n}\n\nbody #dashboard-widgets .postbox form .submit {\n\tmargin: 0;\n}\n\n.dashboard-widget-control-form {\n\toverflow: hidden;\n}\n\n.dashboard-widget-control-form p {\n\tmargin-top: 0;\n}\n\n.rssSummary {\n\tcolor: #777;\n\tmargin-top: 4px;\n}\n\n#dashboard_primary .rss-widget {\n\tborder-bottom: 1px solid #eee;\n\tfont-size: 13px;\n\tpadding: 8px 12px 10px;\n}\n\n#dashboard_primary .rss-widget:last-child {\n\tborder-bottom: none;\n\tpadding-bottom: 8px;\n}\n\n#dashboard_primary .rss-widget a {\n\tfont-weight: normal;\n}\n\n#dashboard_primary .rss-widget span,\n#dashboard_primary .rss-widget span.rss-date {\n\tcolor: #777;\n}\n\n#dashboard_primary .rss-widget span.rss-date {\n\tmargin-left: 12px;\n}\n\n#dashboard_primary .rss-widget ul li {\n\tmargin-bottom: 8px;\n}\n\n/* Dashboard right now */\n\n#dashboard_right_now ul {\n\tmargin: 0;\n\t/* contain floats but don't use overflow: hidden */\n\tdisplay: inline-block;\n\twidth: 100%;\n}\n\n#dashboard_right_now li {\n\twidth: 50%;\n\tfloat: left;\n\tmargin-bottom: 10px;\n}\n\n#dashboard_right_now .inside {\n\tpadding: 0;\n}\n\n#dashboard_right_now .main {\n\tpadding: 0 12px 11px;\n}\n\n#dashboard_right_now .main p {\n\tmargin: 0;\n}\n\n#dashboard_right_now #wp-version-message .button {\n\tfloat: right;\n\tposition: relative;\n\ttop: -5px;\n\tmargin-left: 5px;\n}\n\n.mu-storage {\n\toverflow: hidden;\n}\n\n#dashboard-widgets h3.mu-storage {\n\tmargin: 0 0 10px;\n\tpadding: 0;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n/* Dashboard right now - Colors */\n\n#dashboard_right_now li a:before,\n#dashboard_right_now li span:before {\n\tcolor: #82878c;\n}\n\n#dashboard_right_now .sub {\n\tcolor: #777;\n\tbackground: #f5f5f5;\n\tborder-top: 1px solid #eee;\n\tpadding: 10px 12px 6px 12px;\n}\n\n#dashboard_right_now .sub h3 {\n\tcolor: #555;\n}\n\n#dashboard_right_now .sub p {\n\tmargin: 0 0 1em;\n}\n\n#dashboard_right_now .warning a:before,\n#dashboard_right_now .warning span:before {\n\tcolor: #d54e21;\n}\n\n/* Dashboard right now - Icons */\n#dashboard_right_now li a:before,\n#dashboard_right_now li span:before {\n\tcontent: \"\\f159\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: block;\n\tfloat: left;\n\tmargin: 0 5px 0 0;\n\tpadding: 0;\n\ttext-indent: 0;\n\ttext-align: center;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\ttext-decoration: none !important;\n}\n\n#dashboard_right_now .page-count a:before,\n#dashboard_right_now .page-count span:before {\n\tcontent: \"\\f105\";\n}\n\n#dashboard_right_now .post-count a:before,\n#dashboard_right_now .post-count span:before {\n\tcontent: \"\\f109\";\n}\n\n#dashboard_right_now .comment-count a:before {\n\tcontent: \"\\f101\";\n}\n\n#dashboard_right_now .comment-mod-count a:before {\n\tcontent: \"\\f125\";\n}\n\n#dashboard_right_now .storage-count a:before {\n\tcontent: \"\\f104\";\n}\n\n#dashboard_right_now .storage-count.warning a:before {\n\tcontent: \"\\f153\";\n}\n\n/* Dashboard Quick Draft */\n\n#dashboard_quick_press .inside {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#dashboard_quick_press div.updated {\n\tmargin-bottom: 10px;\n\tborder: 1px solid #eee;\n\tborder-width: 1px 1px 1px 0;\n}\n\n#dashboard_quick_press form {\n\tmargin: 12px;\n}\n\n#dashboard_quick_press .drafts,\n#dashboard_quick_press .easy-blogging {\n\tpadding: 10px 0 0;\n}\n\n/* Dashboard Quick Draft - Form styling */\n\ninput#save-post {\n\tfloat: left;\n}\n\nform.initial-form.quickpress-open label.prompt {\n\tfont-style: normal;\n}\n\nform.initial-form.quickpress-open input#title {\n\theight: auto;\n}\n\n#dashboard_quick_press input,\n#dashboard_quick_press textarea {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin: 0;\n}\n\n#dashboard_quick_press textarea {\n\tresize: vertical;\n}\n\n#dashboard-widgets .postbox form .submit {\n\tmargin: -39px 0;\n\tfloat: right;\n}\n\n#description-wrap {\n\tmargin-top: 12px;\n}\n\n#title-wrap #title-prompt-text,\n.textarea-wrap #content-prompt-text {\n\tcolor: #777;\n}\n\n#title-wrap #title-prompt-text {\n\tfont-size: 1.1em;\n\tpadding: 7px 8px;\n}\n\n.input-text-wrap,\n.textarea-wrap {\n\tposition: relative;\n}\n\n.input-text-wrap .prompt,\n.textarea-wrap .prompt {\n\tposition: absolute;\n}\n\n.textarea-wrap #content-prompt-text {\n\tfont-size: 1.1em;\n\tpadding: 7px 8px;\n}\n\n.textarea-wrap textarea#content {\n\tmargin: 0 0 8px;\n\tpadding: 6px 7px;\n}\n\n#quick-press textarea#content {\n\tmin-height: 90px;\n\tmax-height: 1300px;\n\tresize: none;\n}\n\n/* Dashboard Quick Draft - Drafts list */\n\n.js #dashboard_quick_press .drafts {\n\tborder-top: 1px solid #eee;\n}\n\n#dashboard_quick_press .drafts abbr {\n\tborder: none;\n}\n\n#dashboard_quick_press .drafts .view-all {\n\tfloat: right;\n\tmargin: 0 12px 0 0;\n}\n\n#dashboard_primary a.rsswidget {\n\tfont-weight: normal;\n}\n\n#dashboard_quick_press .drafts ul {\n\tmargin: 0 12px;\n}\n\n#dashboard_quick_press .drafts li {\n\tmargin-bottom: 1em;\n}\n#dashboard_quick_press .drafts li time {\n\tcolor: #777;\n}\n\n#dashboard_quick_press .drafts p {\n\tmargin: 0;\n\tword-wrap: break-word;\n}\n\n#dashboard_quick_press .draft-title {\n\tword-wrap: break-word;\n}\n\n#dashboard_quick_press .draft-title a,\n#dashboard_quick_press .draft-title time {\n\tmargin: 0 5px 0 0;\n}\n\n/* Dashboard common styles */\n\n#dashboard-widgets h4, /* Back-compat for pre-4.4 */\n#dashboard-widgets h3,\n#dashboard_quick_press .drafts h2 {\n\tmargin: 0 12px 8px;\n\tpadding: 0;\n\tfont-size: 14px;\n\tfont-weight: normal;\n\tcolor: #23282d;\n}\n\n#dashboard_quick_press .drafts h2 {\n\tline-height: inherit;\n}\n\n#dashboard-widgets .inside h4, /* Back-compat for pre-4.4 */\n#dashboard-widgets .inside h3 {\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n\n/* Dashboard activity widget */\n\n#dashboard_activity .comment-meta span.approve:before {\n\tcontent: \"\\f227\";\n\tfont: 20px/.5 dashicons;\n\tmargin-left: 12px;\n\tvertical-align: middle;\n\tposition: relative;\n\ttop: -1px;\n\tmargin-right: 2px;\n}\n\n#dashboard_activity .inside {\n\tmargin: 0;\n\tpadding-bottom: 0;\n}\n\n#dashboard_activity .no-activity {\n\toverflow: hidden;\n\tpadding: 0 0 12px;\n\ttext-align: center;\n}\n\n#dashboard_activity .no-activity p {\n\tcolor: #999;\n\tfont-size: 16px;\n}\n\n#dashboard_activity .no-activity .smiley {\n\tmargin-top: 0;\n}\n\n#dashboard_activity .no-activity .smiley:before {\n\tcontent: \"\\f328\";\n\tfont: normal 120px/1 dashicons;\n\tspeak: none;\n\tdisplay: block;\n\tmargin: 0 5px 0 0;\n\tpadding: 0;\n\ttext-indent: 0;\n\ttext-align: center;\n\tposition: relative;\n\t-webkit-font-smoothing: antialiased;\n\ttext-decoration: none !important;\n}\n\n#dashboard_activity .subsubsub {\n\tfloat: none;\n\tborder-top: 1px solid #eee;\n\tmargin: 0 -12px;\n\tpadding: 8px 12px 4px;\n}\n\n#future-posts ul,\n#published-posts ul {\n\tclear: both;\n\tmargin-bottom: 0;\n}\n\n#future-posts li,\n#published-posts li {\n\tmargin-bottom: 8px;\n}\n\n#future-posts ul span,\n#published-posts ul span {\n\tdisplay: inline-block;\n\tmargin-right: 5px;\n\tmin-width: 150px;\n\tcolor: #777;\n}\n\n.activity-block {\n\tborder-bottom: 1px solid #eee;\n\tmargin: 0 -12px;\n\tpadding: 8px 12px 4px;\n}\n\n.activity-block:last-child {\n\tborder-bottom: none;\n}\n\n.activity-block .subsubsub li {\n\tcolor: #ddd;\n}\n\n/* Dashboard activity widget - Comments */\n/* @todo: needs serious de-duplication */\n\n#activity-widget #the-comment-list tr.undo,\n#activity-widget #the-comment-list div.undo {\n\tbackground: none;\n\tpadding: 6px 0;\n\tmargin-left: 12px;\n}\n\n#activity-widget #the-comment-list .comment-item {\n\tbackground: #fafafa;\n\tpadding: 12px;\n\tposition: relative;\n}\n\n#activity-widget #the-comment-list .avatar {\n\tposition: absolute;\n\ttop: 13px;\n}\n\n#activity-widget #the-comment-list .dashboard-comment-wrap {\n\tpadding-left: 63px;\n}\n\n#activity-widget #the-comment-list .dashboard-comment-wrap blockquote {\n\tmargin: 1em 0;\n}\n\n#activity-widget #the-comment-list .comment-item p.row-actions {\n\tmargin: 4px 0 0 0;\n}\n\n#activity-widget #the-comment-list .comment-item:first-child {\n\tborder-top: 1px solid #eeeeee;\n}\n\n#activity-widget #the-comment-list .unapproved {\n\tbackground-color: #fef7f1;\n}\n\n#activity-widget #the-comment-list .unapproved:before {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\tbottom: 0;\n\tbackground: #d54e21;\n\twidth: 4px;\n}\n\n#activity-widget #the-comment-list .spam-undo-inside .avatar,\n#activity-widget #the-comment-list .trash-undo-inside .avatar {\n\tposition: relative;\n\ttop: 0;\n}\n\n/* Browse happy box */\n\n#dashboard-widgets #dashboard_browser_nag.postbox .inside {\n\tmargin: 10px;\n}\n\n.edit-box {\n\tdisplay: none;\n}\n\nh3:hover .edit-box {\n\tdisplay: inline;\n}\n\n#dashboard-widgets form .input-text-wrap input {\n\twidth: 100%;\n}\n\n#dashboard-widgets form .textarea-wrap textarea {\n\twidth: 100%;\n}\n\n#dashboard-widgets .postbox form .submit {\n\tfloat: none;\n\tmargin: .5em 0 0;\n\tpadding: 0;\n\tborder: none;\n}\n\n#dashboard-widgets-wrap #dashboard-widgets .postbox form .submit #publish {\n\tmin-width: 0;\n}\n\n#dashboard-widgets a {\n\ttext-decoration: none;\n}\n\n#dashboard-widgets h3 a {\n\ttext-decoration: underline;\n}\n\n#dashboard-widgets h3 .postbox-title-action {\n\tposition: absolute;\n\tright: 10px;\n\tpadding: 0;\n\ttop: 5px;\n}\n\n.js #dashboard-widgets h3 .postbox-title-action {\n\tright: 33px;\n}\n\n#dashboard_plugins h5 {\n\tfont-size: 14px;\n}\n\n/* Recent Comments */\n\n#latest-comments #the-comment-list {\n\tposition: relative;\n\tmargin: 0 -12px;\n}\n\n#activity-widget #the-comment-list .comment,\n#activity-widget #the-comment-list .pingback {\n\t-webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.06);\n\tbox-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n\n#activity-widget .comments #the-comment-list .alt {\n\tbackground-color: transparent;\n}\n\n#activity-widget #latest-comments #the-comment-list .comment-item {\n\tpadding: 1em 12px;\n}\n\n#latest-comments #the-comment-list .pingback {\n\tpadding-left: 12px !important;\n}\n\n#latest-comments #the-comment-list .comment-item:first-child {\n\tborder-top: none;\n}\n\n#latest-comments #the-comment-list .comment-meta {\n\tline-height: 1.5em;\n\tmargin: 0;\n\tcolor: #666;\n}\n\n#latest-comments #the-comment-list .comment-meta cite {\n\tfont-style: normal;\n\tfont-weight: normal;\n}\n\n#latest-comments #the-comment-list .comment-item blockquote,\n#latest-comments #the-comment-list .comment-item blockquote p {\n\tmargin: 0;\n\tpadding: 0;\n\tdisplay: inline;\n}\n\n#latest-comments #the-comment-list .comment-item p.row-actions {\n\tmargin: 3px 0 0;\n\tpadding: 0;\n\tfont-size: 13px;\n}\n\n/* QuickDraft */\n\n#title-wrap label,\n#description-wrap label {\n\tcursor: text;\n}\n\n#title-wrap #title {\n\tpadding: 2px 6px;\n\tfont-size: 1.3em;\n\toutline: none;\n}\n\n#title-wrap #title-prompt-text {\n\tfont-size: 1.1em;\n\tpadding: 5px 8px;\n}\n\n/* Feeds */\n.rss-widget ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\na.rsswidget {\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tline-height: 1.7em;\n}\n\n.rss-widget ul li {\n\tline-height: 1.5em;\n\tmargin-bottom: 12px;\n}\n\n.rss-widget span.rss-date {\n\tcolor: #999;\n\tfont-size: 13px;\n\tmargin-left: 3px;\n}\n\n.rss-widget cite {\n\tdisplay: block;\n\ttext-align: right;\n\tmargin: 0 0 1em;\n\tpadding: 0;\n}\n\n.rss-widget cite:before {\n\tcontent: \"\\2014\";\n}\n\n.dashboard-comment-wrap {\n\tword-wrap: break-word;\n}\n\n/* Browser Nag */\n#dashboard_browser_nag a.update-browser-link {\n\tfont-size: 1.2em;\n\tfont-weight: 600;\n}\n\n#dashboard_browser_nag a {\n\ttext-decoration: underline;\n}\n\n#dashboard_browser_nag p.browser-update-nag.has-browser-icon {\n\tpadding-right: 125px;\n}\n\n#dashboard_browser_nag .browser-icon {\n\tmargin-top: -35px;\n}\n\n#dashboard_browser_nag.postbox.browser-insecure {\n\tbackground-color: #ac1b1b;\n\tborder-color: #ac1b1b;\n}\n\n#dashboard_browser_nag.postbox {\n\tbackground-color: #e29808;\n\tbackground-image: none;\n\tborder-color: #edc048;\n\tcolor: #fff;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#dashboard_browser_nag.postbox.browser-insecure h2 {\n\tborder-bottom-color: #cd5a5a;\n\tcolor: #fff;\n}\n\n#dashboard_browser_nag.postbox h2 {\n\tborder-bottom-color: #f6e2ac;\n\tbackground: transparent none;\n\tcolor: #fff;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#dashboard_browser_nag a {\n\tcolor: #fff;\n}\n\n/* Make the browser nags easier to read with Open Sans */\n\n#dashboard_browser_nag h2.hndle {\n\tborder: none;\n\tfont-weight: 600;\n\tfont-size: 20px;\n\tpadding-top: 10px;\n}\n\n.postbox#dashboard_browser_nag p a.dismiss {\n\tfont-size: 14px;\n}\n\n.postbox#dashboard_browser_nag p,\n.postbox#dashboard_browser_nag a,\n.postbox#dashboard_browser_nag p.browser-update-nag {\n\tfont-size: 16px;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/* one column on the dash */\n@media only screen and (max-width: 799px) {\n\t#wpbody-content #dashboard-widgets .postbox-container {\n\t\twidth: 100%;\n\t}\n}\n\n/* two columns on the dash, but keep the setting if one is selected */\n@media only screen and (min-width: 800px) and (max-width: 1499px) {\n\t#wpbody-content #dashboard-widgets .postbox-container {\n\t\twidth: 49.5%;\n\t}\n\n\t#wpbody-content #dashboard-widgets #postbox-container-2,\n\t#wpbody-content #dashboard-widgets #postbox-container-3,\n\t#wpbody-content #dashboard-widgets #postbox-container-4 {\n\t\tfloat: right;\n\t\twidth: 50.5%;\n\t}\n\n\t#dashboard-widgets #postbox-container-3 .empty-container,\n\t#dashboard-widgets #postbox-container-4 .empty-container {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n\n\t#wpbody #wpbody-content #dashboard-widgets.columns-1 .postbox-container {\n\t\twidth: 100%;\n\t}\n\n\t#wpbody #wpbody-content .metabox-holder.columns-1 .postbox-container .empty-container {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n\n\t/* show the radio buttons for column prefs only for one or two columns */\n\t.index-php .screen-layout,\n\t.index-php .columns-prefs {\n\t\tdisplay: block;\n\t}\n\n\t.columns-prefs .columns-prefs-3,\n\t.columns-prefs .columns-prefs-4 {\n\t\tdisplay: none;\n\t}\n}\n\n/* three columns on the dash */\n@media only screen and (min-width: 1500px) and (max-width: 1800px) {\n\t#wpbody-content #dashboard-widgets .postbox-container {\n\t\twidth: 33.5%;\n\t}\n\n\t#wpbody-content #dashboard-widgets #postbox-container-1 {\n\t\twidth: 33%;\n\t}\n\n\t#wpbody-content #dashboard-widgets #postbox-container-3,\n\t#wpbody-content #dashboard-widgets #postbox-container-4 {\n\t\tfloat: right;\n\t}\n\n\t#dashboard-widgets #postbox-container-4 .empty-container {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n}\n\n@media screen and (max-width: 870px) {\n\t.welcome-panel .welcome-panel-column,\n\t.welcome-panel .welcome-panel-column:first-child {\n\t\tdisplay: block;\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\n\t.welcome-panel .welcome-panel-column li {\n\t\tdisplay: inline-block;\n\t\tmargin-right: 13px;\n\t}\n\n\t.welcome-panel .welcome-panel-column ul {\n\t\tmargin: 0.4em 0 0;\n\t}\n\n}\n\n@media screen and ( max-width: 782px ) {\n\t#dashboard_recent_comments #the-comment-list .comment-item .avatar {\n\t\theight: 30px;\n\t\twidth: 30px;\n\t\tmargin: 4px 10px 5px 0;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t/* Keep the close icon from overlapping the Welcome text. */\n\t.welcome-panel .welcome-panel-close {\n\t\toverflow: hidden;\n\t\ttext-indent: 40px;\n\t\twhite-space: nowrap;\n\t\twidth: 20px;\n\t\theight: 20px;\n\t\tpadding: 5px;\n\t\ttop: 5px;\n\t\tright: 5px;\n\t}\n\n\t/* Make the close icon larger for tappability. */\n\t.welcome-panel .welcome-panel-close:before {\n\t\tfont-size: 20px;\n\t\ttop: 5px;\n\t\tleft: -35px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/deprecated-media-rtl.css",
    "content": "/* Styles for the media library iframe (not used on the Library screen) */\n\ndiv#media-upload-header {\n\tmargin: 0;\n\tpadding: 5px 5px 0;\n\tfont-weight: bold;\n\tposition: relative;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground: #f9f9f9;\n}\n\n#sidemenu {\n\toverflow: hidden;\n\tfloat: none;\n\tposition: relative;\n\tright: 0;\n\tbottom: -1px;\n\tmargin: 0 5px;\n\tpadding-right: 10px;\n\tlist-style: none;\n\tfont-size: 12px;\n\tfont-weight: normal;\n}\n\n#sidemenu a {\n\tpadding: 0 7px;\n\tdisplay: block;\n\tfloat: right;\n\tline-height: 28px;\n\tborder-top: 1px solid #f9f9f9;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground-color: #f9f9f9;\n\ttext-decoration: none;\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n#sidemenu li {\n\tdisplay: inline;\n\tline-height: 200%;\n\tlist-style: none;\n\ttext-align: center;\n\twhite-space: nowrap;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#sidemenu a.current {\n\tfont-weight: normal;\n\tpadding-right: 6px;\n\tpadding-left: 6px;\n\tborder: 1px solid #dfdfdf;\n\tborder-bottom-color: #f1f1f1;\n\tbackground-color: #f1f1f1;\n\tcolor: #000;\n}\n\n#media-upload:after { /* clearfix */\n\tcontent: \"\";\n\tdisplay: table;\n\tclear: both;\n}\n\n#media-upload .slidetoggle {\n\tborder-top-color: #dfdfdf;\n}\n\n#media-upload input[type=\"radio\"] {\n\tpadding: 0;\n}\n\nform {\n\tmargin: 1em;\n}\n\n#search-filter {\n\ttext-align: left;\n}\n\nth {\n\tposition: relative;\n}\n\n.media-upload-form label.form-help, td.help {\n\tfont-family: sans-serif;\n\tfont-style: italic;\n\tfont-weight: normal;\n}\n\n.media-upload-form p.help {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.media-upload-form fieldset {\n\twidth: 100%;\n\tborder: none;\n\ttext-align: justify;\n\tmargin: 0 0 1em 0;\n\tpadding: 0;\n}\n\n/* specific to the image upload form */\n\n.image-align-none-label {\n\tbackground: url(../images/align-none.png) no-repeat center left;\n}\n\n.image-align-left-label {\n\tbackground: url(../images/align-left.png) no-repeat center left;\n}\n\n.image-align-center-label {\n\tbackground: url(../images/align-center.png) no-repeat center left;\n}\n\n.image-align-right-label {\n\tbackground: url(../images/align-right.png) no-repeat center left;\n}\n\ntr.image-size td {\n\twidth: 460px;\n}\n\ntr.image-size div.image-size-item {\n\tmargin: 0 0 5px;\n}\n\n#library-form .progress,\n#gallery-form .progress,\n.insert-gallery,\n.describe.startopen,\n.describe.startclosed {\n\tdisplay: none;\n}\n\n.media-item .thumbnail {\n\tmax-width: 128px;\n\tmax-height: 128px;\n}\n\nthead.media-item-info tr {\n\tbackground-color: transparent;\n}\n\n.form-table thead.media-item-info {\n\tborder: 8px solid #fff;\n}\n\nabbr.required {\n\ttext-decoration: none;\n\tborder: none;\n}\n\n.describe label {\n\tdisplay: inline;\n}\n\n.describe td.error {\n\tpadding: 2px 8px;\n}\n\n.describe td.A1 {\n\twidth: 132px;\n}\n\n.describe input[type=\"text\"],\n.describe textarea {\n\twidth: 460px;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n\n/* Specific to Uploader */\n\n#media-upload p.ml-submit {\n\tpadding: 1em 0;\n}\n\n#media-upload p.help,\n#media-upload label.help {\n\tfont-family: sans-serif;\n\tfont-style: italic;\n\tfont-weight: normal;\n}\n\n#media-upload .ui-sortable .media-item {\n\tcursor: move;\n}\n\n#media-upload tr.image-size {\n\tmargin-bottom: 1em;\n\theight: 3em;\n}\n\n#media-upload #filter {\n\twidth: 623px;\n}\n\n#media-upload #filter .subsubsub {\n\tmargin: 8px 0;\n}\n\n#filter .tablenav select {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tpadding: 2px;\n\tvertical-align: top;\n\twidth: auto;\n}\n\n#media-upload .del-attachment {\n\tdisplay: none;\n\tmargin: 5px 0;\n}\n\n.menu_order {\n\tfloat: left;\n\tfont-size: 11px;\n\tmargin: 8px 10px 0;\n}\n\n.menu_order_input {\n\tborder: 1px solid #ddd;\n\tfont-size: 10px;\n\tpadding: 1px;\n\twidth: 23px;\n}\n\n.ui-sortable-helper {\n\tbackground-color: #fff;\n\tborder: 1px solid #a0a5aa;\n\topacity: 0.6;\n\tfilter: alpha(opacity=60);\n}\n\n#media-upload th.order-head {\n\twidth: 20%;\n\ttext-align: center;\n}\n\n#media-upload th.actions-head {\n\twidth: 25%;\n\ttext-align: center;\n}\n\n#media-upload a.wp-post-thumbnail {\n\tmargin: 0 20px;\n}\n\n#media-upload .widefat {\n\tborder-style: solid solid none;\n}\n\n.sorthelper {\n\theight: 37px;\n\twidth: 623px;\n\tdisplay: block;\n}\n\n#gallery-settings th.label {\n\twidth: 160px;\n}\n\n#gallery-settings #basic th.label {\n\tpadding: 5px 0 5px 5px;\n}\n\n#gallery-settings .title {\n\tclear: both;\n\tpadding: 0 0 3px;\n\tfont-size: 1.6em;\n\tborder-bottom: 1px solid #DADADA;\n}\n\nh3.media-title  {\n\tfont-size: 1.6em;\n}\n\nh4.media-sub-title  {\n\tborder-bottom: 1px solid #DADADA;\n\tfont-size: 1.3em;\n\tmargin: 12px;\n\tpadding: 0 0 3px;\n}\n\n#gallery-settings .title,\nh3.media-title,\nh4.media-sub-title {\n\tfont-family: Georgia,\"Times New Roman\",Times,serif;\n\tfont-weight: normal;\n\tcolor: #5A5A5A;\n}\n\n#gallery-settings .describe td {\n\tvertical-align: middle;\n\theight: 3em;\n}\n\n#gallery-settings .describe th.label {\n\tpadding-top: .5em;\n\ttext-align: right;\n}\n\n#gallery-settings .describe {\n\tpadding: 5px;\n\twidth: 100%;\n\tclear: both;\n\tcursor: default;\n\tbackground: #fff;\n}\n\n#gallery-settings .describe select {\n\twidth: 15em;\n}\n\n#gallery-settings .describe select option,\n#gallery-settings .describe td {\n\tpadding: 0;\n}\n\n#gallery-settings label,\n#gallery-settings legend {\n\tfont-size: 13px;\n\tcolor: #464646;\n\tmargin-left: 15px;\n}\n\n#gallery-settings .align .field label {\n\tmargin: 0 3px 0 1em;\n}\n\n#gallery-settings p.ml-submit {\n\tborder-top: 1px solid #dfdfdf;\n}\n\n#gallery-settings select#columns {\n\twidth: 6em;\n}\n\n#sort-buttons {\n\tfont-size: 0.8em;\n\tmargin: 3px 0 -8px 25px;\n\ttext-align: left;\n\tmax-width: 625px;\n}\n\n#sort-buttons a {\n\ttext-decoration: none;\n}\n\n#sort-buttons #asc,\n#sort-buttons #showall {\n\tpadding-right: 5px;\n}\n\n#sort-buttons span {\n\tmargin-left: 25px;\n}\n\np.media-types {\n\tpadding: 1em;\n}\n\ntr.not-image {\n\tdisplay: none;\n}\n\ntable.not-image tr.not-image {\n\tdisplay: table-row;\n}\n\ntable.not-image tr.image-only {\n\tdisplay: none;\n}\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\n\t.image-align-none-label {\n\t\tbackground-image: url(../images/align-none-2x.png?ver=20120916);\n\t\t-webkit-background-size: 21px 15px;\n\t\tbackground-size: 21px 15px;\n\t}\n\n\t.image-align-left-label {\n\t\tbackground-image: url(../images/align-left-2x.png?ver=20120916);\n\t\t-webkit-background-size: 22px 15px;\n\t\tbackground-size: 22px 15px;\n\t}\n\n\t.image-align-center-label {\n\t\tbackground-image: url(../images/align-center-2x.png?ver=20120916);\n\t\t-webkit-background-size: 21px 15px;\n\t\tbackground-size: 21px 15px;\n\t}\n\n\t.image-align-right-label {\n\t\tbackground-image: url(../images/align-right-2x.png?ver=20120916);\n\t\t-webkit-background-size: 22px 15px;\n\t\tbackground-size: 22px 15px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/deprecated-media.css",
    "content": "/* Styles for the media library iframe (not used on the Library screen) */\n\ndiv#media-upload-header {\n\tmargin: 0;\n\tpadding: 5px 5px 0;\n\tfont-weight: bold;\n\tposition: relative;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground: #f9f9f9;\n}\n\n#sidemenu {\n\toverflow: hidden;\n\tfloat: none;\n\tposition: relative;\n\tleft: 0;\n\tbottom: -1px;\n\tmargin: 0 5px;\n\tpadding-left: 10px;\n\tlist-style: none;\n\tfont-size: 12px;\n\tfont-weight: normal;\n}\n\n#sidemenu a {\n\tpadding: 0 7px;\n\tdisplay: block;\n\tfloat: left;\n\tline-height: 28px;\n\tborder-top: 1px solid #f9f9f9;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground-color: #f9f9f9;\n\ttext-decoration: none;\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n#sidemenu li {\n\tdisplay: inline;\n\tline-height: 200%;\n\tlist-style: none;\n\ttext-align: center;\n\twhite-space: nowrap;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#sidemenu a.current {\n\tfont-weight: normal;\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n\tborder: 1px solid #dfdfdf;\n\tborder-bottom-color: #f1f1f1;\n\tbackground-color: #f1f1f1;\n\tcolor: #000;\n}\n\n#media-upload:after { /* clearfix */\n\tcontent: \"\";\n\tdisplay: table;\n\tclear: both;\n}\n\n#media-upload .slidetoggle {\n\tborder-top-color: #dfdfdf;\n}\n\n#media-upload input[type=\"radio\"] {\n\tpadding: 0;\n}\n\nform {\n\tmargin: 1em;\n}\n\n#search-filter {\n\ttext-align: right;\n}\n\nth {\n\tposition: relative;\n}\n\n.media-upload-form label.form-help, td.help {\n\tfont-family: sans-serif;\n\tfont-style: italic;\n\tfont-weight: normal;\n}\n\n.media-upload-form p.help {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.media-upload-form fieldset {\n\twidth: 100%;\n\tborder: none;\n\ttext-align: justify;\n\tmargin: 0 0 1em 0;\n\tpadding: 0;\n}\n\n/* specific to the image upload form */\n\n.image-align-none-label {\n\tbackground: url(../images/align-none.png) no-repeat center left;\n}\n\n.image-align-left-label {\n\tbackground: url(../images/align-left.png) no-repeat center left;\n}\n\n.image-align-center-label {\n\tbackground: url(../images/align-center.png) no-repeat center left;\n}\n\n.image-align-right-label {\n\tbackground: url(../images/align-right.png) no-repeat center left;\n}\n\ntr.image-size td {\n\twidth: 460px;\n}\n\ntr.image-size div.image-size-item {\n\tmargin: 0 0 5px;\n}\n\n#library-form .progress,\n#gallery-form .progress,\n.insert-gallery,\n.describe.startopen,\n.describe.startclosed {\n\tdisplay: none;\n}\n\n.media-item .thumbnail {\n\tmax-width: 128px;\n\tmax-height: 128px;\n}\n\nthead.media-item-info tr {\n\tbackground-color: transparent;\n}\n\n.form-table thead.media-item-info {\n\tborder: 8px solid #fff;\n}\n\nabbr.required {\n\ttext-decoration: none;\n\tborder: none;\n}\n\n.describe label {\n\tdisplay: inline;\n}\n\n.describe td.error {\n\tpadding: 2px 8px;\n}\n\n.describe td.A1 {\n\twidth: 132px;\n}\n\n.describe input[type=\"text\"],\n.describe textarea {\n\twidth: 460px;\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n\n/* Specific to Uploader */\n\n#media-upload p.ml-submit {\n\tpadding: 1em 0;\n}\n\n#media-upload p.help,\n#media-upload label.help {\n\tfont-family: sans-serif;\n\tfont-style: italic;\n\tfont-weight: normal;\n}\n\n#media-upload .ui-sortable .media-item {\n\tcursor: move;\n}\n\n#media-upload tr.image-size {\n\tmargin-bottom: 1em;\n\theight: 3em;\n}\n\n#media-upload #filter {\n\twidth: 623px;\n}\n\n#media-upload #filter .subsubsub {\n\tmargin: 8px 0;\n}\n\n#filter .tablenav select {\n\tborder-style: solid;\n\tborder-width: 1px;\n\tpadding: 2px;\n\tvertical-align: top;\n\twidth: auto;\n}\n\n#media-upload .del-attachment {\n\tdisplay: none;\n\tmargin: 5px 0;\n}\n\n.menu_order {\n\tfloat: right;\n\tfont-size: 11px;\n\tmargin: 8px 10px 0;\n}\n\n.menu_order_input {\n\tborder: 1px solid #ddd;\n\tfont-size: 10px;\n\tpadding: 1px;\n\twidth: 23px;\n}\n\n.ui-sortable-helper {\n\tbackground-color: #fff;\n\tborder: 1px solid #a0a5aa;\n\topacity: 0.6;\n\tfilter: alpha(opacity=60);\n}\n\n#media-upload th.order-head {\n\twidth: 20%;\n\ttext-align: center;\n}\n\n#media-upload th.actions-head {\n\twidth: 25%;\n\ttext-align: center;\n}\n\n#media-upload a.wp-post-thumbnail {\n\tmargin: 0 20px;\n}\n\n#media-upload .widefat {\n\tborder-style: solid solid none;\n}\n\n.sorthelper {\n\theight: 37px;\n\twidth: 623px;\n\tdisplay: block;\n}\n\n#gallery-settings th.label {\n\twidth: 160px;\n}\n\n#gallery-settings #basic th.label {\n\tpadding: 5px 5px 5px 0;\n}\n\n#gallery-settings .title {\n\tclear: both;\n\tpadding: 0 0 3px;\n\tfont-size: 1.6em;\n\tborder-bottom: 1px solid #DADADA;\n}\n\nh3.media-title  {\n\tfont-size: 1.6em;\n}\n\nh4.media-sub-title  {\n\tborder-bottom: 1px solid #DADADA;\n\tfont-size: 1.3em;\n\tmargin: 12px;\n\tpadding: 0 0 3px;\n}\n\n#gallery-settings .title,\nh3.media-title,\nh4.media-sub-title {\n\tfont-family: Georgia,\"Times New Roman\",Times,serif;\n\tfont-weight: normal;\n\tcolor: #5A5A5A;\n}\n\n#gallery-settings .describe td {\n\tvertical-align: middle;\n\theight: 3em;\n}\n\n#gallery-settings .describe th.label {\n\tpadding-top: .5em;\n\ttext-align: left;\n}\n\n#gallery-settings .describe {\n\tpadding: 5px;\n\twidth: 100%;\n\tclear: both;\n\tcursor: default;\n\tbackground: #fff;\n}\n\n#gallery-settings .describe select {\n\twidth: 15em;\n}\n\n#gallery-settings .describe select option,\n#gallery-settings .describe td {\n\tpadding: 0;\n}\n\n#gallery-settings label,\n#gallery-settings legend {\n\tfont-size: 13px;\n\tcolor: #464646;\n\tmargin-right: 15px;\n}\n\n#gallery-settings .align .field label {\n\tmargin: 0 1em 0 3px;\n}\n\n#gallery-settings p.ml-submit {\n\tborder-top: 1px solid #dfdfdf;\n}\n\n#gallery-settings select#columns {\n\twidth: 6em;\n}\n\n#sort-buttons {\n\tfont-size: 0.8em;\n\tmargin: 3px 25px -8px 0;\n\ttext-align: right;\n\tmax-width: 625px;\n}\n\n#sort-buttons a {\n\ttext-decoration: none;\n}\n\n#sort-buttons #asc,\n#sort-buttons #showall {\n\tpadding-left: 5px;\n}\n\n#sort-buttons span {\n\tmargin-right: 25px;\n}\n\np.media-types {\n\tpadding: 1em;\n}\n\ntr.not-image {\n\tdisplay: none;\n}\n\ntable.not-image tr.not-image {\n\tdisplay: table-row;\n}\n\ntable.not-image tr.image-only {\n\tdisplay: none;\n}\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\n\t.image-align-none-label {\n\t\tbackground-image: url(../images/align-none-2x.png?ver=20120916);\n\t\t-webkit-background-size: 21px 15px;\n\t\tbackground-size: 21px 15px;\n\t}\n\n\t.image-align-left-label {\n\t\tbackground-image: url(../images/align-left-2x.png?ver=20120916);\n\t\t-webkit-background-size: 22px 15px;\n\t\tbackground-size: 22px 15px;\n\t}\n\n\t.image-align-center-label {\n\t\tbackground-image: url(../images/align-center-2x.png?ver=20120916);\n\t\t-webkit-background-size: 21px 15px;\n\t\tbackground-size: 21px 15px;\n\t}\n\n\t.image-align-right-label {\n\t\tbackground-image: url(../images/align-right-2x.png?ver=20120916);\n\t\t-webkit-background-size: 22px 15px;\n\t\tbackground-size: 22px 15px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/edit-rtl.css",
    "content": "#poststuff {\n\tpadding-top: 10px;\n\tmin-width: 763px;\n}\n\n#poststuff #post-body {\n\tpadding: 0;\n}\n\n#poststuff .postbox-container {\n\twidth: 100%;\n}\n\n#poststuff #post-body.columns-2 {\n\tmargin-left: 300px;\n}\n\n/*------------------------------------------------------------------------------\n  11.0 - Write/Edit Post Screen\n------------------------------------------------------------------------------*/\n\n#show-comments {\n\toverflow: hidden;\n}\n\n#save-action .spinner,\n#show-comments a {\n\tfloat: right;\n}\n\n#show-comments .spinner {\n\tfloat: none;\n\tmargin-top: 0;\n}\n\n#lost-connection-notice .spinner {\n\tvisibility: visible;\n\tfloat: right;\n\tmargin: 0 0 0 5px;\n}\n\n#titlediv {\n\tposition: relative;\n}\n\n#titlediv label {\n\tcursor: text;\n}\n\n#titlediv div.inside {\n\tmargin: 0;\n}\n\n#poststuff #titlewrap {\n\tborder: 0;\n\tpadding: 0;\n}\n\n#titlediv #title {\n\tpadding: 3px 8px;\n\tfont-size: 1.7em;\n\tline-height: 100%;\n\theight: 1.7em;\n\twidth: 100%;\n\toutline: none;\n\tmargin: 0 0 3px;\n\tbackground-color: #fff;\n}\n\n#titlediv #title-prompt-text {\n\tcolor: #777;\n\tposition: absolute;\n\tfont-size: 1.7em;\n\tpadding: 11px 10px;\n}\n\n#poststuff .inside-submitbox,\n#side-sortables .inside-submitbox {\n\tmargin: 0 3px;\n\tfont-size: 11px;\n}\n\ninput#link_description,\ninput#link_url {\n\twidth: 98%;\n}\n\n#pending {\n\tbackground: 100% none;\n\tborder: 0 none;\n\tpadding: 0;\n\tfont-size: 11px;\n\tmargin-top: -1px;\n}\n\n#edit-slug-box,\n#comment-link-box {\n\tline-height: 24px;\n\tmin-height: 25px; /* Yes, line-height + 1 */\n\tmargin-top: 5px;\n\tpadding: 0 10px;\n\tcolor: #666;\n}\n\n#edit-slug-box .cancel {\n\tmargin-left: 10px;\n\tpadding: 0;\n\tfont-size: 11px;\n\ttext-decoration: underline;\n\tcolor: #0073aa;\n}\n\n#comment-link-box {\n\tmargin: 5px 0;\n\tpadding: 0 5px;\n}\n\n#editable-post-name-full {\n\tdisplay: none;\n}\n\n#editable-post-name {\n\tfont-weight: bold;\n}\n\n#editable-post-name input {\n\tfont-size: 13px;\n\tfont-weight: normal;\n\theight: 22px;\n\tmargin: 0;\n\twidth: 16em;\n}\n\n.postarea h3 label {\n\tfloat: right;\n}\n\n.submitbox .submit {\n\ttext-align: right;\n\tpadding: 12px 10px 10px;\n\tfont-size: 11px;\n\tbackground-color: #464646;\n\tcolor: #ccc;\n}\n\n.submitbox .submitdelete {\n\ttext-decoration: none;\n\tpadding: 1px 2px;\n}\n\n/* @todo: do we really need this? word on the street is we don't and this\nstray rule may actually be compensated for elsewhere. */\n#normal-sortables .submitbox .submitdelete:hover {\n\tcolor: #000;\n\tbackground-color: #f00;\n\tborder-bottom-color: #f00;\n}\n\n.submitbox .submit a:hover {\n\ttext-decoration: underline;\n}\n\n.submitbox .submit input {\n\tmargin-bottom: 8px;\n\tmargin-left: 4px;\n\tpadding: 6px;\n}\n\n.inside-submitbox #post_status {\n\tmargin: 2px -2px 2px 0;\n}\n\n#post-status-select {\n\tmargin-top: 3px;\n}\n\n/* Post Screen */\n#post-body #normal-sortables {\n\tmin-height: 50px;\n}\n\n.postbox {\n\tposition: relative;\n\tmin-width: 255px;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbackground: #fff;\n}\n\n#trackback_url {\n\twidth: 99%;\n}\n\n#normal-sortables .postbox .submit {\n\tbackground: transparent none;\n\tborder: 0 none;\n\tfloat: left;\n\tpadding: 0 12px;\n\tmargin:0;\n}\n\n.category-add input[type=\"text\"],\n.category-add select {\n\twidth: 100%;\n\tmax-width: 260px;\n\tvertical-align: baseline;\n}\n\n#side-sortables .category-add input[type=\"text\"],\n#side-sortables .category-add select {\n\tmargin: 0 0 1em;\n}\n\nul.category-tabs li,\n#side-sortables .add-menu-item-tabs li,\n.wp-tab-bar li {\n\tdisplay: inline;\n\tline-height: 1.35em;\n}\n\n.no-js .category-tabs li.hide-if-no-js {\n\tdisplay: none;\n}\n\n.category-tabs a,\n#side-sortables .add-menu-item-tabs a,\n.wp-tab-bar a {\n\ttext-decoration: none;\n}\n\n/* @todo: do these really need to be so specific? */\n#side-sortables .category-tabs .tabs a,\n#side-sortables .add-menu-item-tabs .tabs a,\n.wp-tab-bar .wp-tab-active a,\n#post-body ul.category-tabs li.tabs a,\n#post-body ul.add-menu-item-tabs li.tabs a {\n\tcolor: #32373c;\n}\n\n.category-tabs {\n\tmargin: 8px 0 5px;\n}\n\n/* Back-compat for pre-4.4 */\n#category-adder h4 {\n    margin: 0;\n}\n\n.taxonomy-add-new {\n\tdisplay: inline-block;\n\tmargin: 10px 0;\n\tfont-weight: 600;\n}\n\n#side-sortables .add-menu-item-tabs,\n.wp-tab-bar {\n\tmargin-bottom: 3px;\n}\n\n#normal-sortables .postbox #replyrow .submit {\n\tfloat: none;\n\tmargin: 0;\n\tpadding: 5px 7px 10px;\n\toverflow: hidden;\n}\n\n#side-sortables .submitbox .submit input,\n#side-sortables .submitbox .submit .preview,\n#side-sortables .submitbox .submit a.preview:hover {\n\tborder: 0 none;\n}\n\n#side-sortables .inside-submitbox .insidebox,\n.stuffbox .insidebox {\n\tmargin: 11px 0;\n}\n\n/* @todo: make this a more generic class */\nul.category-tabs,\nul.add-menu-item-tabs,\nul.wp-tab-bar {\n\tmargin-top: 12px;\n}\n\nul.category-tabs li,\nul.add-menu-item-tabs li {\n\tborder: solid 1px transparent;\n\tposition: relative;\n}\n\nul.category-tabs li.tabs,\nul.add-menu-item-tabs li.tabs,\n.wp-tab-active {\n\tborder: 1px solid #dfdfdf;\n\tborder-bottom-color: #fdfdfd;\n\tbackground-color: #fdfdfd;\n}\n\nul.category-tabs li,\nul.add-menu-item-tabs li,\nul.wp-tab-bar li {\n\tpadding: 3px 5px 5px;\n}\n\n#postimagediv .inside img {\n\tmax-width: 100%;\n\theight: auto;\n\twidth: auto;\n\tbackground-image: -webkit-linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), -webkit-linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4);\n\tbackground-image: linear-gradient(-45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4);\n\tbackground-position: 100% 0, 10px 10px;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n}\n\nform#tags-filter {\n\tposition: relative;\n}\n\n/* Global classes */\n.wp-hidden-children .wp-hidden-child,\n.ui-tabs-hide {\n\tdisplay: none;\n}\n\n#post-body .tagsdiv #newtag {\n\tmargin-left: 5px;\n\twidth: 16em;\n}\n\n#side-sortables input#post_password {\n\twidth: 94%\n}\n\n#side-sortables .tagsdiv #newtag {\n\twidth: 68%;\n}\n\n#post-status-info {\n\twidth: 100%;\n\tborder-spacing: 0;\n\tborder: 1px solid #e5e5e5;\n\tborder-top: none;\n\tbackground-color: #f7f7f7;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tz-index: 999;\n}\n\n#post-status-info td {\n\tfont-size: 12px;\n}\n\n.autosave-info {\n\tpadding: 2px 10px;\n\ttext-align: left;\n}\n\n#editorcontent #post-status-info {\n\tborder: none;\n}\n\n#content-resize-handle {\n\tbackground: transparent url(../images/resize.gif) no-repeat scroll left bottom;\n\twidth: 12px;\n\tcursor: row-resize;\n}\n\n.rtl #content-resize-handle {\n\tbackground: transparent url(../images/resize-rtl.gif) no-repeat scroll right bottom;\n}\n\n.wp-editor-expand #content-resize-handle {\n\tdisplay: none;\n}\n\n#postdivrich #content {\n\tresize: none;\n}\n\n#wp-word-count {\n\tdisplay: block;\n\tpadding: 2px 10px;\n}\n\n#wp-content-editor-container {\n\tposition: relative;\n}\n\n#content-textarea-clone {\n\tz-index: -1;\n\tposition: absolute;\n\ttop: 0;\n\tvisibility: hidden;\n\toverflow: hidden;\n\tmax-width: 100%;\n\tborder: 1px solid transparent;\n}\n\n.wp-editor-expand #wp-content-editor-tools {\n\tz-index: 1000;\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n.wp-editor-expand #wp-content-editor-container {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tmargin-top: -1px;\n}\n\n.wp-editor-expand #wp-content-editor-container {\n\tborder-bottom: 0 none;\n}\n\n.wp-editor-expand div.mce-statusbar {\n\tz-index: 1;\n}\n\n.wp-editor-expand #post-status-info {\n\tborder-top: 1px solid #e5e5e5;\n}\n\n.wp-editor-expand div.mce-toolbar-grp {\n\tz-index: 999;\n}\n\n/* TinyMCE native fullscreen mode override */\n.mce-fullscreen #wp-content-wrap .mce-menubar,\n.mce-fullscreen #wp-content-wrap .mce-toolbar-grp,\n.mce-fullscreen #wp-content-wrap .mce-edit-area,\n.mce-fullscreen #wp-content-wrap .mce-statusbar {\n\tposition: static !important;\n\twidth: auto !important;\n\tpadding: 0 !important;\n}\n\n.mce-fullscreen #wp-content-wrap .mce-statusbar {\n\tvisibility: visible !important;\n}\n\n.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw {\n\tdisplay: none;\n}\n\n.post-php.mce-fullscreen #wpadminbar,\n.mce-fullscreen #wp-content-wrap .mce-wp-dfw {\n\tdisplay: none;\n}\n/* End TinyMCE native fullscreen mode override */\n\n#wp-content-editor-tools {\n\tbackground-color: #f1f1f1;\n\tpadding-top: 20px;\n}\n\n#poststuff #post-body.columns-2 #side-sortables {\n\twidth: 280px;\n}\n\n#timestampdiv select {\n\theight: 21px;\n\tline-height: 14px;\n\tpadding: 0;\n\tvertical-align: top;\n\tfont-size: 12px;\n}\n\n#aa, #jj, #hh, #mn {\n\tpadding: 1px;\n\tfont-size: 12px;\n}\n\n#jj, #hh, #mn {\n\twidth: 2em;\n}\n\n#aa {\n\twidth: 3.4em;\n}\n\n.curtime #timestamp {\n\tpadding: 2px 0 1px 0;\n\tdisplay: inline !important;\n\theight: auto !important;\n}\n\n#misc-publishing-actions label[for=\"post_status\"]:before,\n#post-body #visibility:before,\n.curtime #timestamp:before,\n#post-body .misc-pub-revisions:before,\nspan.wp-media-buttons-icon:before {\n\tcolor: #82878c;\n}\n\n#post-body #visibility:before,\n.curtime #timestamp:before,\n#post-body .misc-pub-revisions:before {\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0 0 0 2px;\n\ttop: 0;\n\tright: -1px;\n\tposition: relative;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n}\n\n#post-body #visibility:before {\n\tcontent: \"\\f177\";\n}\n\n.curtime #timestamp:before {\n\tcontent: \"\\f145\";\n\ttop: -1px;\n}\n\n#post-body .misc-pub-revisions:before {\n\tcontent: \"\\f321\";\n}\n\n#timestampdiv {\n\tpadding-top: 5px;\n\tline-height: 23px;\n}\n\n#timestampdiv p {\n\tmargin: 8px 0 6px;\n}\n\n#timestampdiv input {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n\n.notification-dialog {\n\tposition: fixed;\n\ttop: 30%;\n\tmax-height: 70%;\n\tright: 50%;\n\twidth: 450px;\n\tmargin-right: -225px;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tline-height: 1.5;\n\tz-index: 1000005;\n\toverflow-y: auto;\n}\n\n.notification-dialog-background {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 1000000;\n}\n\n#post-lock-dialog .post-locked-message,\n#post-lock-dialog .post-taken-over {\n\tmargin: 25px;\n}\n\n#post-lock-dialog .post-locked-message a.button {\n\tmargin-left: 10px;\n}\n\n#post-lock-dialog .post-locked-avatar {\n\tfloat: right;\n\tmargin: 0 0 20px 20px;\n}\n\n#post-lock-dialog .wp-tab-first {\n\toutline: 0;\n}\n\n#post-lock-dialog .locked-saving img {\n\tfloat: right;\n\tmargin-left: 3px;\n}\n\n#post-lock-dialog.saving .locked-saving,\n#post-lock-dialog.saved .locked-saved {\n\tdisplay: inline;\n}\n\n#excerpt {\n\tdisplay: block;\n\tmargin: 12px 0 0;\n\theight: 4em;\n\twidth: 100%;\n}\n\n.tagchecklist {\n\tmargin-right: 14px;\n\tfont-size: 12px;\n\toverflow: auto;\n}\n\n.tagchecklist br {\n\tdisplay: none;\n}\n\n.tagchecklist strong {\n\tmargin-right: -8px;\n\tposition: absolute;\n}\n\n.tagchecklist span {\n\tmargin-left: 25px;\n\tdisplay: block;\n\tfloat: right;\n\tfont-size: 13px;\n\tline-height: 1.8em;\n\tcursor: default;\n\tmax-width: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.tagchecklist span a {\n\tmargin: 1px -17px 0 0;\n\tcursor: pointer;\n\twidth: 20px;\n\theight: 20px;\n\tdisplay: block;\n\tfloat: right;\n\ttext-indent: 0;\n\toverflow: hidden;\n\tposition: absolute;\n}\n\n#poststuff h3.hndle, /* Back-compat for pre-4.4 */\n#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */\n#poststuff h2 {\n\tfont-size: 14px;\n\tpadding: 8px 12px;\n\tmargin: 0;\n\tline-height: 1.4;\n}\n\n#poststuff .inside {\n\tmargin: 6px 0 0 0;\n}\n\n#poststuff .inside #parent_id,\n#poststuff .inside #page_template {\n\tmax-width: 100%;\n}\n\n#poststuff .inside label.spam,\n#poststuff .inside label.deleted {\n\tcolor: red;\n}\n\n#poststuff .inside label.waiting {\n\tcolor: orange;\n}\n\n#poststuff .inside label.approved {\n\tcolor: green;\n}\n\n.ie8 #poststuff .inside #parent_id,\n.ie8 #poststuff .inside #page_template {\n\twidth: 250px;\n}\n\n#post-visibility-select {\n\tline-height: 1.5em;\n\tmargin-top: 3px;\n}\n\n#poststuff #submitdiv .inside {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#post-body-content,\n.edit-form-section {\n \tmargin-bottom: 20px;\n}\n\n/*------------------------------------------------------------------------------\n  11.1 - Custom Fields\n------------------------------------------------------------------------------*/\n\n#postcustomstuff thead th {\n\tpadding: 5px 8px 8px;\n\tbackground-color: #f1f1f1;\n}\n\n#postcustom #postcustomstuff .submit {\n\tborder: 0 none;\n\tfloat: none;\n\tpadding: 0 8px 8px;\n}\n\n#side-sortables #postcustom #postcustomstuff .submit {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#side-sortables #postcustom #postcustomstuff #the-list textarea {\n\theight: 85px;\n}\n\n#side-sortables #postcustom #postcustomstuff td.left input,\n#side-sortables #postcustom #postcustomstuff td.left select,\n#side-sortables #postcustomstuff #newmetaleft a {\n\tmargin: 3px 3px 0;\n}\n\n#postcustomstuff table {\n\tmargin: 0;\n\twidth: 100%;\n\tborder: 1px solid #dfdfdf;\n\tborder-spacing: 0;\n\tbackground-color: #f9f9f9;\n}\n\n#postcustomstuff tr {\n\tvertical-align: top;\n}\n\n#postcustomstuff table input,\n#postcustomstuff table select,\n#postcustomstuff table textarea {\n\twidth: 96%;\n\tmargin: 8px;\n}\n\n#side-sortables #postcustomstuff table input,\n#side-sortables #postcustomstuff table select,\n#side-sortables #postcustomstuff table textarea {\n\tmargin: 3px;\n}\n\n#postcustomstuff th.left,\n#postcustomstuff td.left {\n\twidth: 38%;\n}\n\n#postcustomstuff .submit input {\n\tmargin: 0;\n\twidth: auto;\n}\n\n#postcustomstuff #newmetaleft a {\n\tdisplay: inline-block;\n\tmargin: 0 8px 8px;\n\ttext-decoration: none;\n}\n\n.no-js #postcustomstuff #enternew {\n\tdisplay: none;\n}\n\n#post-body-content .compat-attachment-fields {\n\tmargin-bottom: 20px;\n}\n\n.compat-attachment-fields th {\n\tpadding-top: 5px;\n\tpadding-left: 10px;\n}\n\n/*------------------------------------------------------------------------------\n  11.3 - Featured Images\n------------------------------------------------------------------------------*/\n\n#select-featured-image {\n\tpadding: 4px 0;\n\toverflow: hidden;\n}\n\n#select-featured-image img {\n\tmax-width: 100%;\n\theight: auto;\n\tmargin-bottom: 10px;\n}\n\n#select-featured-image a {\n\tfloat: right;\n\tclear: both;\n}\n\n#select-featured-image .remove {\n\tdisplay: none;\n\tmargin-top: 10px;\n}\n\n.js #select-featured-image.has-featured-image .remove {\n\tdisplay: inline-block;\n}\n\n.no-js #select-featured-image .choose {\n\tdisplay: none;\n}\n\n/*------------------------------------------------------------------------------\n  11.4 - Post formats\n------------------------------------------------------------------------------*/\n\n.post-state-format {\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\theight: 20px;\n\twidth: 20px;\n\tmargin-left: 5px;\n\tmargin-top: -4px;\n}\n\n.post-state-format:before {\n\tdisplay: block;\n\theight: 20px;\n\twidth: 20px;\n\tfont: normal 20px/1 dashicons !important;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.post-state-format:before,\n.post-format-icon:before {\n\tcolor: #ddd;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\na.post-state-format:hover:before,\na.post-format-icon:hover:before {\n\tcolor: #00a0d2;\n}\n\n#post-formats-select {\n\tline-height: 2em;\n}\n\n#post-formats-select .post-format-icon:before {\n\ttop: 5px;\n}\n\ninput.post-format {\n\tmargin-top: 1px;\n}\n\nlabel.post-format-icon {\n\tmargin-right: 0px;\n\tpadding: 2px 0px 2px 0;\n}\n\n.post-format-icon:before {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-left: 7px;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.post-state-format.post-format-standard:before,\n.post-format-icon.post-format-standard:before,\na.post-state-format.format-standard:before {\n\tcontent: \"\\f109\";\n}\n\n.post-state-format.post-format-image:before,\n.post-format-icon.post-format-image:before,\na.post-state-format.format-image:before {\n\tcontent: \"\\f128\";\n}\n\n.post-state-format.post-format-gallery:before,\n.post-format-icon.post-format-gallery:before,\na.post-state-format.format-gallery:before {\n\tcontent: \"\\f161\";\n}\n\n.post-state-format.post-format-audio:before,\n.post-format-icon.post-format-audio:before,\na.post-state-format.format-audio:before {\n\tcontent: \"\\f127\";\n}\n\n.post-state-format.post-format-video:before,\n.post-format-icon.post-format-video:before,\na.post-state-format.format-video:before {\n\tcontent: \"\\f126\";\n}\n\n.post-state-format.post-format-chat:before,\n.post-format-icon.post-format-chat:before,\na.post-state-format.format-chat:before {\n\tcontent: \"\\f125\";\n}\n\n.post-state-format.post-format-status:before,\n.post-format-icon.post-format-status:before,\na.post-state-format.format-status:before {\n\tcontent: \"\\f130\";\n}\n\n.post-state-format.post-format-aside:before,\n.post-format-icon.post-format-aside:before,\na.post-state-format.format-aside:before {\n\tcontent: \"\\f123\";\n}\n\n.post-state-format.post-format-quote:before,\n.post-format-icon.post-format-quote:before,\na.post-state-format.format-quote:before {\n\tcontent: \"\\f122\";\n}\n\n.post-state-format.post-format-link:before,\n.post-format-icon.post-format-link:before,\na.post-state-format.format-link:before {\n\tcontent: \"\\f103\";\n}\n\n/*------------------------------------------------------------------------------\n  12.0 - Categories\n------------------------------------------------------------------------------*/\n\n.category-adder {\n\tmargin-right: 120px;\n\tpadding: 4px 0;\n}\n\n.category-adder h4 {\n\tmargin: 0 0 8px;\n}\n\n#side-sortables .category-adder {\n\tmargin: 0;\n}\n\n.wp-tab-panel,\n.categorydiv div.tabs-panel,\n.customlinkdiv div.tabs-panel,\n.posttypediv div.tabs-panel,\n.taxonomydiv div.tabs-panel {\n\tmin-height: 42px;\n\tmax-height: 200px;\n\toverflow: auto;\n\tpadding: 0 0.9em;\n\tborder: solid 1px #dfdfdf;\n\tbackground-color: #fdfdfd;\n}\n\ndiv.tabs-panel-active {\n\tdisplay:block;\n}\n\ndiv.tabs-panel-inactive {\n\tdisplay:none;\n}\n\n#front-page-warning,\n#front-static-pages ul,\nul.export-filters,\n.inline-editor ul.cat-checklist ul,\n.categorydiv ul.categorychecklist ul,\n.customlinkdiv ul.categorychecklist ul,\n.posttypediv ul.categorychecklist ul,\n.taxonomydiv ul.categorychecklist ul {\n\tmargin-right: 18px;\n}\n\nul.categorychecklist li {\n\tmargin: 0;\n\tpadding: 0;\n\tline-height: 22px;\n\tword-wrap: break-word;\n}\n\n.categorydiv .tabs-panel,\n.customlinkdiv .tabs-panel,\n.posttypediv .tabs-panel,\n.taxonomydiv .tabs-panel {\n\tborder-width: 3px;\n\tborder-style: solid;\n}\n\n.form-wrap p,\n.form-wrap label {\n\tfont-size: 11px;\n}\n\n.form-wrap label {\n\tdisplay: block;\n\tpadding: 2px;\n\tfont-size: 12px;\n}\n\n.form-field input[type=\"text\"],\n.form-field input[type=\"password\"],\n.form-field input[type=\"email\"],\n.form-field input[type=\"number\"],\n.form-field input[type=\"search\"],\n.form-field input[type=\"tel\"],\n.form-field input[type=\"url\"],\n.form-field textarea {\n\tborder-style: solid;\n\tborder-width: 1px;\n\twidth: 95%;\n}\n\np.description,\n.form-wrap p {\n\tmargin: 2px 0 5px;\n\tcolor: #666;\n}\n\np.help,\np.description,\nspan.description,\n.form-wrap p {\n\tfont-size: 13px;\n\tfont-style: italic;\n}\n\n.form-wrap .form-field {\n\tmargin: 0 0 10px;\n\tpadding: 8px 0;\n}\n\n.form-wrap .form-field #parent {\n\tmax-width: 100%;\n}\n\n.col-wrap h2 {\n\tmargin: 12px 0;\n\tfont-size: 1.1em;\n}\n\n.col-wrap p.submit {\n\tmargin-top: -10px;\n}\n\n\n/*------------------------------------------------------------------------------\n  13.0 - Tags\n------------------------------------------------------------------------------*/\n\n#poststuff .tagsdiv .howto {\n\tmargin: 0 0 6px 0;\n}\n\n.ajaxtag .newtag {\n\tposition: relative;\n}\n\n.tagsdiv .newtag {\n\twidth: 180px;\n}\n\n.tagsdiv .the-tags {\n\tdisplay: block;\n\theight: 60px;\n\tmargin: 0 auto;\n\toverflow: auto;\n\twidth: 260px;\n}\n\n#post-body-content .tagsdiv .the-tags {\n\tmargin: 0 5px;\n}\n\np.popular-tags {\n\tborder: none;\n\tline-height: 2em;\n\tpadding: 8px 12px 12px;\n\ttext-align: justify;\n}\n\np.popular-tags a {\n\tpadding: 0 3px;\n}\n\n.tagcloud {\n\twidth: 97%;\n\tmargin: 0 0 40px;\n\ttext-align: justify;\n}\n\n.tagcloud h2 {\n\tmargin: 2px 0 12px;\n}\n\n.ac_results {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n\tposition: absolute;\n\tz-index: 10000;\n\tdisplay: none;\n\tborder: 1px solid #808080;\n\tbackground-color: #fff;\n}\n\n.wp-customizer .ac_results {\n\tz-index: 500000;\n}\n\n.ac_results li {\n\tpadding: 2px 5px;\n\twhite-space: nowrap;\n\tcolor: #101010;\n\ttext-align: right;\n}\n\n.ac_over {\n\tbackground-color: #f0f0b8;\n\tcursor: pointer;\n}\n\n.ac_match {\n\ttext-decoration: underline;\n}\n\n/* Comments */\n\n.comment-php .wp-editor-area {\n\theight: 200px;\n}\n\n.comment-ays th,\n.comment-ays td {\n\tpadding: 10px 15px;\n}\n\n.comment-ays-submit .button-cancel {\n\tmargin-right: 1em;\n}\n\n.trash-undo-inside,\n.spam-undo-inside {\n\tmargin: 1px 0 1px 8px;\n\tline-height: 16px;\n}\n\n.spam-undo-inside .avatar,\n.trash-undo-inside .avatar {\n\theight: 20px;\n\twidth: 20px;\n\tmargin-left: 8px;\n\tvertical-align: middle;\n}\n\n.stuffbox .editcomment {\n\tclear: none;\n}\n\n#comment-status-radio p {\n\tmargin: 3px 0 5px;\n}\n\n#comment-status-radio input {\n\tmargin: 2px 0 5px 3px;\n\tvertical-align: middle;\n}\n\n#comment-status-radio label {\n\tpadding: 5px 0;\n}\n\n/* links tables */\ntable.links-table {\n\twidth: 100%;\n\tborder-spacing: 0;\n}\n\n.links-table th {\n\tfont-weight: normal;\n\ttext-align: right;\n\tvertical-align: top;\n\tmin-width: 80px;\n\twidth: 20%;\n\tword-wrap: break-word;\n}\n\n.links-table th,\n.links-table td {\n\tpadding: 5px 0;\n}\n\n.links-table td label {\n\tmargin-left: 8px;\n}\n\n.links-table td input[type=\"text\"],\n.links-table td textarea {\n\twidth: 100%;\n}\n\n.links-table #link_rel {\n\tmax-width: 280px;\n}\n\n/* DFW 2\n-------------------------------------------------------------- */\n\n#wp-content-wrap .mce-wp-dfw,\n#qt_content_dfw {\n\tdisplay: none;\n}\n\n.wp-editor-expand #wp-content-wrap .mce-wp-dfw,\n.wp-editor-expand #qt_content_dfw {\n\tdisplay: inline-block;\n}\n\n.focus-on .wrap > h1,\n.focus-on #wpfooter,\n.focus-on .postbox-container > *,\n.focus-on div.updated,\n.focus-on div.error,\n.focus-on div.notice,\n.focus-on .update-nag,\n.focus-on #wp-toolbar,\n.focus-on #screen-meta-links,\n.focus-on #screen-meta {\n\topacity: 0;\n\t-webkit-transition-duration: 0.6s;\n\ttransition-duration: 0.6s;\n\t-webkit-transition-property: opacity;\n\ttransition-property: opacity;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\n.focus-on #wp-toolbar {\n\topacity: 0.3;\n}\n\n.focus-off .wrap > h1,\n.focus-off #wpfooter,\n.focus-off .postbox-container > *,\n.focus-off div.updated,\n.focus-off div.error,\n.focus-off div.notice,\n.focus-off .update-nag,\n.focus-off #wp-toolbar,\n.focus-off #screen-meta-links,\n.focus-off #screen-meta {\n\topacity: 1;\n\t-webkit-transition-duration: 0.2s;\n\ttransition-duration: 0.2s;\n\t-webkit-transition-property: opacity;\n\ttransition-property: opacity;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\n.focus-off #wp-toolbar {\n\t-webkit-transform: translate(0, 0);\n}\n\n.focus-on #adminmenuback,\n.focus-on #adminmenuwrap {\n\t-webkit-transition-duration: 0.6s;\n\ttransition-duration: 0.6s;\n\t-webkit-transition-property: -webkit-transform;\n\ttransition-property: -webkit-transform;\n\ttransition-property: transform;\n\ttransition-property: transform, -webkit-transform;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\n.focus-on #adminmenuback,\n.focus-on #adminmenuwrap {\n\t-webkit-transform: translateX( 100% );\n\t-ms-transform: translateX( 100% );\n\ttransform: translateX( 100% );\n}\n\n.focus-off #adminmenuback,\n.focus-off #adminmenuwrap {\n\t-webkit-transform: translateX( 0 );\n\t-ms-transform: translateX( 0 );\n\ttransform: translateX( 0 );\n\t-webkit-transition-duration: 0.2s;\n\ttransition-duration: 0.2s;\n\t-webkit-transition-property: -webkit-transform;\n\ttransition-property: -webkit-transform;\n\ttransition-property: transform;\n\ttransition-property: transform, -webkit-transform;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t#content-resize-handle,\n\t#post-body .wp_themeSkin .mceStatusbar a.mceResize {\n\t\tbackground: transparent url(../images/resize-2x.gif) no-repeat scroll left bottom;\n\t\t-webkit-background-size: 11px 11px;\n\t\tbackground-size: 11px 11px;\n\t}\n\n\t.rtl #content-resize-handle,\n\t.rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize {\n\t\tbackground: transparent url(../images/resize-rtl-2x.gif) no-repeat scroll left bottom;\n\t}\n}\n\n/* one column on the post write/edit screen */\n@media only screen and (max-width: 850px) {\n\t#poststuff {\n\t\tmin-width: 0;\n\t}\n\n\t#wpbody-content #poststuff #post-body {\n\t\tmargin: 0;\n\t}\n\n\t#wpbody-content #post-body.columns-2 #postbox-container-1 {\n\t\tmargin-left: 0;\n\t\twidth: 100%;\n\t}\n\n\t#poststuff #postbox-container-1 .empty-container,\n\t#poststuff #postbox-container-1 #side-sortables:empty {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n\n\t#poststuff #post-body.columns-2 #side-sortables {\n\t\tmin-height: 0;\n\t\twidth: auto;\n\t}\n\n\t/* hide the radio buttons for column prefs */\n\t.screen-layout,\n\t.columns-prefs {\n\t\tdisplay: none;\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t#post-body-content {\n\t\tmin-width: 0;\n\t}\n\n\t#titlediv #title-prompt-text {\n\t\tpadding: 10px 10px;\n\t}\n\n\t#poststuff h3.hndle, /* Back-compat for pre-4.4 */\n\t#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */\n\t#poststuff h2 {\n\t\tpadding: 12px;\n\t}\n\n\t.post-format-options {\n\t\tpadding-left: 0;\n\t}\n\n\t.post-format-options a {\n\t\tmargin-left: 5px;\n\t\tmargin-bottom: 5px;\n\t\tmin-width: 52px;\n\t}\n\n\t.post-format-options .post-format-title {\n\t\tfont-size: 11px;\n\t}\n\n\t.post-format-options a div {\n\t\theight: 28px;\n\t\twidth: 28px;\n\t}\n\n\t.post-format-options a div:before {\n\t\tfont-size: 26px !important;\n\t}\n\n\t/* Publish Metabox Options */\n\t#post-visibility-select {\n\t\tline-height: 280%;\n\t}\n\n\t.wp-core-ui .save-post-visibility,\n\t.wp-core-ui .save-timestamp {\n\t\tvertical-align: middle;\n\t\tmargin-left: 15px;\n\t}\n\n\t.timestamp-wrap select#mm {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tmargin-bottom: 10px;\n\t}\n\n\t.timestamp-wrap #jj,\n\t.timestamp-wrap #aa,\n\t.timestamp-wrap #hh,\n\t.timestamp-wrap #mn {\n\t\tpadding: 12px 3px;\n\t\tfont-size: 14px;\n\t\tmargin-bottom: 5px;\n\t\twidth: auto;\n\t\ttext-align: center;\n\t}\n\n\t/* Categories Metabox */\n\tul.category-tabs {\n\t\tmargin: 30px 0 15px;\n\t}\n\n\tul.category-tabs li.tabs {\n\t\tpadding: 15px;\n\t}\n\n\tul.categorychecklist li {\n\t\tmargin-bottom: 15px;\n\t}\n\n\tul.categorychecklist ul {\n\t\tmargin-top: 15px;\n\t}\n\n\t.category-add input[type=text],\n\t.category-add select {\n\t\tmax-width: none;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t/* Tags Metabox */\n\t.tagsdiv .newtag {\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t.tagchecklist {\n\t\tmargin: 25px 10px;\n\t}\n\n\t.tagchecklist span {\n\t\tfont-size: 16px;\n\t\tline-height: 1.4;\n\t}\n\n\t/* Discussion */\n\t#commentstatusdiv p {\n\t\tline-height: 2.8;\n\t}\n\n\t/* TinyMCE Adjustments */\n\t.mceToolbar * {\n\t\twhite-space: normal !important;\n\t}\n\n\t.mceToolbar tr,\n\t.mceToolbar td {\n\t\tfloat: right !important;\n\t}\n\n\t.wp_themeSkin a.mceButton {\n\t\twidth: 30px;\n\t\theight: 30px;\n\t}\n\n\t.wp_themeSkin .mceButton .mceIcon {\n\t\tmargin-top: 5px;\n\t\tmargin-right: 5px;\n\t}\n\n\t.wp_themeSkin .mceSplitButton {\n\t\tmargin-top: 1px;\n\t}\n\n\t.wp_themeSkin .mceSplitButton td a.mceAction {\n\t\tpadding-top: 6px;\n\t\tpadding-bottom: 6px;\n\t\tpadding-right: 6px;\n\t\tpadding-left: 3px;\n\t}\n\n\t.wp_themeSkin .mceSplitButton td a.mceOpen,\n\t.wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen {\n\t\tpadding-top: 6px;\n\t\tpadding-bottom: 6px;\n\t\tbackground-position: 1px 6px;\n\t}\n\n\t.wp_themeSkin table.mceListBox {\n\t\tmargin: 5px;\n\t}\n\n\tdiv.quicktags-toolbar input {\n\t\tpadding: 10px 20px;\n\t}\n\n\tbutton.wp-switch-editor {\n\t\tfont-size: 16px;\n\t\tline-height: 1em;\n\t\tmargin: 7px 7px 0 0;\n\t\tpadding: 8px 12px;\n\t}\n\n\t#wp-content-media-buttons a {\n\t\tfont-size: 16px;\n\t\tline-height: 37px;\n\t\theight: 39px;\n\t\tpadding: 0 15px 0 20px;\n\t}\n\n\t.wp-media-buttons span.wp-media-buttons-icon,\n\t.wp-media-buttons span.jetpack-contact-form-icon {\n\t\twidth: 22px !important;\n\t\tmargin-top: -3px !important;\n\t\tmargin-right: -5px !important;\n\t}\n\n\t.wp-media-buttons .add_media span.wp-media-buttons-icon:before,\n\t.wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before {\n\t\tfont-size: 20px !important;\n\t}\n\n\t#content_wp_fullscreen {\n\t\tdisplay: none;\n\t}\n\n\t.misc-pub-section {\n\t\tpadding: 20px 10px 20px;\n\t}\n\n\t.misc-pub-section > a {\n\t\tfloat: left;\n\t\tfont-size: 16px;\n\t}\n\n\t#delete-action,\n\t#publishing-action {\n\t\tline-height: 47px;\n\t}\n\n\t#publishing-action .spinner {\n\t\tfloat: none;\n\t\tmargin-top: -2px; /* Half of the Publish button's bottom margin. */\n\t}\n\n\t/* Moderate Comment */\n\t.comment-ays th,\n\t.comment-ays td {\n\t\tpadding-bottom: 0;\n\t}\n\n\t.comment-ays td {\n\t\tpadding-top: 6px;\n\t}\n\n\t/* Links */\n\t.links-table #link_rel {\n\t\tmax-width: none;\n\t}\n\n\t.links-table th,\n\t.links-table td {\n\t\tpadding: 10px 0;\n\t}\n}\n\n@media only screen and (max-width: 500px) {\n\t/* Align Add Media + Visual + Text tabs */\n\t#wp-content-media-buttons a {\n\t\tfont-size: 14px;\n\t\tpadding: 0 10px 0 10px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/edit.css",
    "content": "#poststuff {\n\tpadding-top: 10px;\n\tmin-width: 763px;\n}\n\n#poststuff #post-body {\n\tpadding: 0;\n}\n\n#poststuff .postbox-container {\n\twidth: 100%;\n}\n\n#poststuff #post-body.columns-2 {\n\tmargin-right: 300px;\n}\n\n/*------------------------------------------------------------------------------\n  11.0 - Write/Edit Post Screen\n------------------------------------------------------------------------------*/\n\n#show-comments {\n\toverflow: hidden;\n}\n\n#save-action .spinner,\n#show-comments a {\n\tfloat: left;\n}\n\n#show-comments .spinner {\n\tfloat: none;\n\tmargin-top: 0;\n}\n\n#lost-connection-notice .spinner {\n\tvisibility: visible;\n\tfloat: left;\n\tmargin: 0 5px 0 0;\n}\n\n#titlediv {\n\tposition: relative;\n}\n\n#titlediv label {\n\tcursor: text;\n}\n\n#titlediv div.inside {\n\tmargin: 0;\n}\n\n#poststuff #titlewrap {\n\tborder: 0;\n\tpadding: 0;\n}\n\n#titlediv #title {\n\tpadding: 3px 8px;\n\tfont-size: 1.7em;\n\tline-height: 100%;\n\theight: 1.7em;\n\twidth: 100%;\n\toutline: none;\n\tmargin: 0 0 3px;\n\tbackground-color: #fff;\n}\n\n#titlediv #title-prompt-text {\n\tcolor: #777;\n\tposition: absolute;\n\tfont-size: 1.7em;\n\tpadding: 11px 10px;\n}\n\n#poststuff .inside-submitbox,\n#side-sortables .inside-submitbox {\n\tmargin: 0 3px;\n\tfont-size: 11px;\n}\n\ninput#link_description,\ninput#link_url {\n\twidth: 98%;\n}\n\n#pending {\n\tbackground: 0 none;\n\tborder: 0 none;\n\tpadding: 0;\n\tfont-size: 11px;\n\tmargin-top: -1px;\n}\n\n#edit-slug-box,\n#comment-link-box {\n\tline-height: 24px;\n\tmin-height: 25px; /* Yes, line-height + 1 */\n\tmargin-top: 5px;\n\tpadding: 0 10px;\n\tcolor: #666;\n}\n\n#edit-slug-box .cancel {\n\tmargin-right: 10px;\n\tpadding: 0;\n\tfont-size: 11px;\n\ttext-decoration: underline;\n\tcolor: #0073aa;\n}\n\n#comment-link-box {\n\tmargin: 5px 0;\n\tpadding: 0 5px;\n}\n\n#editable-post-name-full {\n\tdisplay: none;\n}\n\n#editable-post-name {\n\tfont-weight: bold;\n}\n\n#editable-post-name input {\n\tfont-size: 13px;\n\tfont-weight: normal;\n\theight: 22px;\n\tmargin: 0;\n\twidth: 16em;\n}\n\n.postarea h3 label {\n\tfloat: left;\n}\n\n.submitbox .submit {\n\ttext-align: left;\n\tpadding: 12px 10px 10px;\n\tfont-size: 11px;\n\tbackground-color: #464646;\n\tcolor: #ccc;\n}\n\n.submitbox .submitdelete {\n\ttext-decoration: none;\n\tpadding: 1px 2px;\n}\n\n/* @todo: do we really need this? word on the street is we don't and this\nstray rule may actually be compensated for elsewhere. */\n#normal-sortables .submitbox .submitdelete:hover {\n\tcolor: #000;\n\tbackground-color: #f00;\n\tborder-bottom-color: #f00;\n}\n\n.submitbox .submit a:hover {\n\ttext-decoration: underline;\n}\n\n.submitbox .submit input {\n\tmargin-bottom: 8px;\n\tmargin-right: 4px;\n\tpadding: 6px;\n}\n\n.inside-submitbox #post_status {\n\tmargin: 2px 0 2px -2px;\n}\n\n#post-status-select {\n\tmargin-top: 3px;\n}\n\n/* Post Screen */\n#post-body #normal-sortables {\n\tmin-height: 50px;\n}\n\n.postbox {\n\tposition: relative;\n\tmin-width: 255px;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbackground: #fff;\n}\n\n#trackback_url {\n\twidth: 99%;\n}\n\n#normal-sortables .postbox .submit {\n\tbackground: transparent none;\n\tborder: 0 none;\n\tfloat: right;\n\tpadding: 0 12px;\n\tmargin:0;\n}\n\n.category-add input[type=\"text\"],\n.category-add select {\n\twidth: 100%;\n\tmax-width: 260px;\n\tvertical-align: baseline;\n}\n\n#side-sortables .category-add input[type=\"text\"],\n#side-sortables .category-add select {\n\tmargin: 0 0 1em;\n}\n\nul.category-tabs li,\n#side-sortables .add-menu-item-tabs li,\n.wp-tab-bar li {\n\tdisplay: inline;\n\tline-height: 1.35em;\n}\n\n.no-js .category-tabs li.hide-if-no-js {\n\tdisplay: none;\n}\n\n.category-tabs a,\n#side-sortables .add-menu-item-tabs a,\n.wp-tab-bar a {\n\ttext-decoration: none;\n}\n\n/* @todo: do these really need to be so specific? */\n#side-sortables .category-tabs .tabs a,\n#side-sortables .add-menu-item-tabs .tabs a,\n.wp-tab-bar .wp-tab-active a,\n#post-body ul.category-tabs li.tabs a,\n#post-body ul.add-menu-item-tabs li.tabs a {\n\tcolor: #32373c;\n}\n\n.category-tabs {\n\tmargin: 8px 0 5px;\n}\n\n/* Back-compat for pre-4.4 */\n#category-adder h4 {\n    margin: 0;\n}\n\n.taxonomy-add-new {\n\tdisplay: inline-block;\n\tmargin: 10px 0;\n\tfont-weight: 600;\n}\n\n#side-sortables .add-menu-item-tabs,\n.wp-tab-bar {\n\tmargin-bottom: 3px;\n}\n\n#normal-sortables .postbox #replyrow .submit {\n\tfloat: none;\n\tmargin: 0;\n\tpadding: 5px 7px 10px;\n\toverflow: hidden;\n}\n\n#side-sortables .submitbox .submit input,\n#side-sortables .submitbox .submit .preview,\n#side-sortables .submitbox .submit a.preview:hover {\n\tborder: 0 none;\n}\n\n#side-sortables .inside-submitbox .insidebox,\n.stuffbox .insidebox {\n\tmargin: 11px 0;\n}\n\n/* @todo: make this a more generic class */\nul.category-tabs,\nul.add-menu-item-tabs,\nul.wp-tab-bar {\n\tmargin-top: 12px;\n}\n\nul.category-tabs li,\nul.add-menu-item-tabs li {\n\tborder: solid 1px transparent;\n\tposition: relative;\n}\n\nul.category-tabs li.tabs,\nul.add-menu-item-tabs li.tabs,\n.wp-tab-active {\n\tborder: 1px solid #dfdfdf;\n\tborder-bottom-color: #fdfdfd;\n\tbackground-color: #fdfdfd;\n}\n\nul.category-tabs li,\nul.add-menu-item-tabs li,\nul.wp-tab-bar li {\n\tpadding: 3px 5px 5px;\n}\n\n#postimagediv .inside img {\n\tmax-width: 100%;\n\theight: auto;\n\twidth: auto;\n\tbackground-image: -webkit-linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), -webkit-linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4);\n\tbackground-image: linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4), linear-gradient(45deg, #c4c4c4 25%, transparent 25%, transparent 75%, #c4c4c4 75%, #c4c4c4);\n\tbackground-position: 0 0, 10px 10px;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n}\n\nform#tags-filter {\n\tposition: relative;\n}\n\n/* Global classes */\n.wp-hidden-children .wp-hidden-child,\n.ui-tabs-hide {\n\tdisplay: none;\n}\n\n#post-body .tagsdiv #newtag {\n\tmargin-right: 5px;\n\twidth: 16em;\n}\n\n#side-sortables input#post_password {\n\twidth: 94%\n}\n\n#side-sortables .tagsdiv #newtag {\n\twidth: 68%;\n}\n\n#post-status-info {\n\twidth: 100%;\n\tborder-spacing: 0;\n\tborder: 1px solid #e5e5e5;\n\tborder-top: none;\n\tbackground-color: #f7f7f7;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tz-index: 999;\n}\n\n#post-status-info td {\n\tfont-size: 12px;\n}\n\n.autosave-info {\n\tpadding: 2px 10px;\n\ttext-align: right;\n}\n\n#editorcontent #post-status-info {\n\tborder: none;\n}\n\n#content-resize-handle {\n\tbackground: transparent url(../images/resize.gif) no-repeat scroll right bottom;\n\twidth: 12px;\n\tcursor: row-resize;\n}\n\n.rtl #content-resize-handle {\n\tbackground: transparent url(../images/resize-rtl.gif) no-repeat scroll left bottom;\n}\n\n.wp-editor-expand #content-resize-handle {\n\tdisplay: none;\n}\n\n#postdivrich #content {\n\tresize: none;\n}\n\n#wp-word-count {\n\tdisplay: block;\n\tpadding: 2px 10px;\n}\n\n#wp-content-editor-container {\n\tposition: relative;\n}\n\n#content-textarea-clone {\n\tz-index: -1;\n\tposition: absolute;\n\ttop: 0;\n\tvisibility: hidden;\n\toverflow: hidden;\n\tmax-width: 100%;\n\tborder: 1px solid transparent;\n}\n\n.wp-editor-expand #wp-content-editor-tools {\n\tz-index: 1000;\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n.wp-editor-expand #wp-content-editor-container {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tmargin-top: -1px;\n}\n\n.wp-editor-expand #wp-content-editor-container {\n\tborder-bottom: 0 none;\n}\n\n.wp-editor-expand div.mce-statusbar {\n\tz-index: 1;\n}\n\n.wp-editor-expand #post-status-info {\n\tborder-top: 1px solid #e5e5e5;\n}\n\n.wp-editor-expand div.mce-toolbar-grp {\n\tz-index: 999;\n}\n\n/* TinyMCE native fullscreen mode override */\n.mce-fullscreen #wp-content-wrap .mce-menubar,\n.mce-fullscreen #wp-content-wrap .mce-toolbar-grp,\n.mce-fullscreen #wp-content-wrap .mce-edit-area,\n.mce-fullscreen #wp-content-wrap .mce-statusbar {\n\tposition: static !important;\n\twidth: auto !important;\n\tpadding: 0 !important;\n}\n\n.mce-fullscreen #wp-content-wrap .mce-statusbar {\n\tvisibility: visible !important;\n}\n\n.mce-fullscreen #wp-content-wrap .mce-tinymce .mce-wp-dfw {\n\tdisplay: none;\n}\n\n.post-php.mce-fullscreen #wpadminbar,\n.mce-fullscreen #wp-content-wrap .mce-wp-dfw {\n\tdisplay: none;\n}\n/* End TinyMCE native fullscreen mode override */\n\n#wp-content-editor-tools {\n\tbackground-color: #f1f1f1;\n\tpadding-top: 20px;\n}\n\n#poststuff #post-body.columns-2 #side-sortables {\n\twidth: 280px;\n}\n\n#timestampdiv select {\n\theight: 21px;\n\tline-height: 14px;\n\tpadding: 0;\n\tvertical-align: top;\n\tfont-size: 12px;\n}\n\n#aa, #jj, #hh, #mn {\n\tpadding: 1px;\n\tfont-size: 12px;\n}\n\n#jj, #hh, #mn {\n\twidth: 2em;\n}\n\n#aa {\n\twidth: 3.4em;\n}\n\n.curtime #timestamp {\n\tpadding: 2px 0 1px 0;\n\tdisplay: inline !important;\n\theight: auto !important;\n}\n\n#misc-publishing-actions label[for=\"post_status\"]:before,\n#post-body #visibility:before,\n.curtime #timestamp:before,\n#post-body .misc-pub-revisions:before,\nspan.wp-media-buttons-icon:before {\n\tcolor: #82878c;\n}\n\n#post-body #visibility:before,\n.curtime #timestamp:before,\n#post-body .misc-pub-revisions:before {\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0 2px 0 0;\n\ttop: 0;\n\tleft: -1px;\n\tposition: relative;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n}\n\n#post-body #visibility:before {\n\tcontent: \"\\f177\";\n}\n\n.curtime #timestamp:before {\n\tcontent: \"\\f145\";\n\ttop: -1px;\n}\n\n#post-body .misc-pub-revisions:before {\n\tcontent: \"\\f321\";\n}\n\n#timestampdiv {\n\tpadding-top: 5px;\n\tline-height: 23px;\n}\n\n#timestampdiv p {\n\tmargin: 8px 0 6px;\n}\n\n#timestampdiv input {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n\n.notification-dialog {\n\tposition: fixed;\n\ttop: 30%;\n\tmax-height: 70%;\n\tleft: 50%;\n\twidth: 450px;\n\tmargin-left: -225px;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tline-height: 1.5;\n\tz-index: 1000005;\n\toverflow-y: auto;\n}\n\n.notification-dialog-background {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 1000000;\n}\n\n#post-lock-dialog .post-locked-message,\n#post-lock-dialog .post-taken-over {\n\tmargin: 25px;\n}\n\n#post-lock-dialog .post-locked-message a.button {\n\tmargin-right: 10px;\n}\n\n#post-lock-dialog .post-locked-avatar {\n\tfloat: left;\n\tmargin: 0 20px 20px 0;\n}\n\n#post-lock-dialog .wp-tab-first {\n\toutline: 0;\n}\n\n#post-lock-dialog .locked-saving img {\n\tfloat: left;\n\tmargin-right: 3px;\n}\n\n#post-lock-dialog.saving .locked-saving,\n#post-lock-dialog.saved .locked-saved {\n\tdisplay: inline;\n}\n\n#excerpt {\n\tdisplay: block;\n\tmargin: 12px 0 0;\n\theight: 4em;\n\twidth: 100%;\n}\n\n.tagchecklist {\n\tmargin-left: 14px;\n\tfont-size: 12px;\n\toverflow: auto;\n}\n\n.tagchecklist br {\n\tdisplay: none;\n}\n\n.tagchecklist strong {\n\tmargin-left: -8px;\n\tposition: absolute;\n}\n\n.tagchecklist span {\n\tmargin-right: 25px;\n\tdisplay: block;\n\tfloat: left;\n\tfont-size: 13px;\n\tline-height: 1.8em;\n\tcursor: default;\n\tmax-width: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.tagchecklist span a {\n\tmargin: 1px 0 0 -17px;\n\tcursor: pointer;\n\twidth: 20px;\n\theight: 20px;\n\tdisplay: block;\n\tfloat: left;\n\ttext-indent: 0;\n\toverflow: hidden;\n\tposition: absolute;\n}\n\n#poststuff h3.hndle, /* Back-compat for pre-4.4 */\n#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */\n#poststuff h2 {\n\tfont-size: 14px;\n\tpadding: 8px 12px;\n\tmargin: 0;\n\tline-height: 1.4;\n}\n\n#poststuff .inside {\n\tmargin: 6px 0 0 0;\n}\n\n#poststuff .inside #parent_id,\n#poststuff .inside #page_template {\n\tmax-width: 100%;\n}\n\n#poststuff .inside label.spam,\n#poststuff .inside label.deleted {\n\tcolor: red;\n}\n\n#poststuff .inside label.waiting {\n\tcolor: orange;\n}\n\n#poststuff .inside label.approved {\n\tcolor: green;\n}\n\n.ie8 #poststuff .inside #parent_id,\n.ie8 #poststuff .inside #page_template {\n\twidth: 250px;\n}\n\n#post-visibility-select {\n\tline-height: 1.5em;\n\tmargin-top: 3px;\n}\n\n#poststuff #submitdiv .inside {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#post-body-content,\n.edit-form-section {\n \tmargin-bottom: 20px;\n}\n\n/*------------------------------------------------------------------------------\n  11.1 - Custom Fields\n------------------------------------------------------------------------------*/\n\n#postcustomstuff thead th {\n\tpadding: 5px 8px 8px;\n\tbackground-color: #f1f1f1;\n}\n\n#postcustom #postcustomstuff .submit {\n\tborder: 0 none;\n\tfloat: none;\n\tpadding: 0 8px 8px;\n}\n\n#side-sortables #postcustom #postcustomstuff .submit {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#side-sortables #postcustom #postcustomstuff #the-list textarea {\n\theight: 85px;\n}\n\n#side-sortables #postcustom #postcustomstuff td.left input,\n#side-sortables #postcustom #postcustomstuff td.left select,\n#side-sortables #postcustomstuff #newmetaleft a {\n\tmargin: 3px 3px 0;\n}\n\n#postcustomstuff table {\n\tmargin: 0;\n\twidth: 100%;\n\tborder: 1px solid #dfdfdf;\n\tborder-spacing: 0;\n\tbackground-color: #f9f9f9;\n}\n\n#postcustomstuff tr {\n\tvertical-align: top;\n}\n\n#postcustomstuff table input,\n#postcustomstuff table select,\n#postcustomstuff table textarea {\n\twidth: 96%;\n\tmargin: 8px;\n}\n\n#side-sortables #postcustomstuff table input,\n#side-sortables #postcustomstuff table select,\n#side-sortables #postcustomstuff table textarea {\n\tmargin: 3px;\n}\n\n#postcustomstuff th.left,\n#postcustomstuff td.left {\n\twidth: 38%;\n}\n\n#postcustomstuff .submit input {\n\tmargin: 0;\n\twidth: auto;\n}\n\n#postcustomstuff #newmetaleft a {\n\tdisplay: inline-block;\n\tmargin: 0 8px 8px;\n\ttext-decoration: none;\n}\n\n.no-js #postcustomstuff #enternew {\n\tdisplay: none;\n}\n\n#post-body-content .compat-attachment-fields {\n\tmargin-bottom: 20px;\n}\n\n.compat-attachment-fields th {\n\tpadding-top: 5px;\n\tpadding-right: 10px;\n}\n\n/*------------------------------------------------------------------------------\n  11.3 - Featured Images\n------------------------------------------------------------------------------*/\n\n#select-featured-image {\n\tpadding: 4px 0;\n\toverflow: hidden;\n}\n\n#select-featured-image img {\n\tmax-width: 100%;\n\theight: auto;\n\tmargin-bottom: 10px;\n}\n\n#select-featured-image a {\n\tfloat: left;\n\tclear: both;\n}\n\n#select-featured-image .remove {\n\tdisplay: none;\n\tmargin-top: 10px;\n}\n\n.js #select-featured-image.has-featured-image .remove {\n\tdisplay: inline-block;\n}\n\n.no-js #select-featured-image .choose {\n\tdisplay: none;\n}\n\n/*------------------------------------------------------------------------------\n  11.4 - Post formats\n------------------------------------------------------------------------------*/\n\n.post-state-format {\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\theight: 20px;\n\twidth: 20px;\n\tmargin-right: 5px;\n\tmargin-top: -4px;\n}\n\n.post-state-format:before {\n\tdisplay: block;\n\theight: 20px;\n\twidth: 20px;\n\tfont: normal 20px/1 dashicons !important;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.post-state-format:before,\n.post-format-icon:before {\n\tcolor: #ddd;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\na.post-state-format:hover:before,\na.post-format-icon:hover:before {\n\tcolor: #00a0d2;\n}\n\n#post-formats-select {\n\tline-height: 2em;\n}\n\n#post-formats-select .post-format-icon:before {\n\ttop: 5px;\n}\n\ninput.post-format {\n\tmargin-top: 1px;\n}\n\nlabel.post-format-icon {\n\tmargin-left: 0px;\n\tpadding: 2px 0 2px 0px;\n}\n\n.post-format-icon:before {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.post-state-format.post-format-standard:before,\n.post-format-icon.post-format-standard:before,\na.post-state-format.format-standard:before {\n\tcontent: \"\\f109\";\n}\n\n.post-state-format.post-format-image:before,\n.post-format-icon.post-format-image:before,\na.post-state-format.format-image:before {\n\tcontent: \"\\f128\";\n}\n\n.post-state-format.post-format-gallery:before,\n.post-format-icon.post-format-gallery:before,\na.post-state-format.format-gallery:before {\n\tcontent: \"\\f161\";\n}\n\n.post-state-format.post-format-audio:before,\n.post-format-icon.post-format-audio:before,\na.post-state-format.format-audio:before {\n\tcontent: \"\\f127\";\n}\n\n.post-state-format.post-format-video:before,\n.post-format-icon.post-format-video:before,\na.post-state-format.format-video:before {\n\tcontent: \"\\f126\";\n}\n\n.post-state-format.post-format-chat:before,\n.post-format-icon.post-format-chat:before,\na.post-state-format.format-chat:before {\n\tcontent: \"\\f125\";\n}\n\n.post-state-format.post-format-status:before,\n.post-format-icon.post-format-status:before,\na.post-state-format.format-status:before {\n\tcontent: \"\\f130\";\n}\n\n.post-state-format.post-format-aside:before,\n.post-format-icon.post-format-aside:before,\na.post-state-format.format-aside:before {\n\tcontent: \"\\f123\";\n}\n\n.post-state-format.post-format-quote:before,\n.post-format-icon.post-format-quote:before,\na.post-state-format.format-quote:before {\n\tcontent: \"\\f122\";\n}\n\n.post-state-format.post-format-link:before,\n.post-format-icon.post-format-link:before,\na.post-state-format.format-link:before {\n\tcontent: \"\\f103\";\n}\n\n/*------------------------------------------------------------------------------\n  12.0 - Categories\n------------------------------------------------------------------------------*/\n\n.category-adder {\n\tmargin-left: 120px;\n\tpadding: 4px 0;\n}\n\n.category-adder h4 {\n\tmargin: 0 0 8px;\n}\n\n#side-sortables .category-adder {\n\tmargin: 0;\n}\n\n.wp-tab-panel,\n.categorydiv div.tabs-panel,\n.customlinkdiv div.tabs-panel,\n.posttypediv div.tabs-panel,\n.taxonomydiv div.tabs-panel {\n\tmin-height: 42px;\n\tmax-height: 200px;\n\toverflow: auto;\n\tpadding: 0 0.9em;\n\tborder: solid 1px #dfdfdf;\n\tbackground-color: #fdfdfd;\n}\n\ndiv.tabs-panel-active {\n\tdisplay:block;\n}\n\ndiv.tabs-panel-inactive {\n\tdisplay:none;\n}\n\n#front-page-warning,\n#front-static-pages ul,\nul.export-filters,\n.inline-editor ul.cat-checklist ul,\n.categorydiv ul.categorychecklist ul,\n.customlinkdiv ul.categorychecklist ul,\n.posttypediv ul.categorychecklist ul,\n.taxonomydiv ul.categorychecklist ul {\n\tmargin-left: 18px;\n}\n\nul.categorychecklist li {\n\tmargin: 0;\n\tpadding: 0;\n\tline-height: 22px;\n\tword-wrap: break-word;\n}\n\n.categorydiv .tabs-panel,\n.customlinkdiv .tabs-panel,\n.posttypediv .tabs-panel,\n.taxonomydiv .tabs-panel {\n\tborder-width: 3px;\n\tborder-style: solid;\n}\n\n.form-wrap p,\n.form-wrap label {\n\tfont-size: 11px;\n}\n\n.form-wrap label {\n\tdisplay: block;\n\tpadding: 2px;\n\tfont-size: 12px;\n}\n\n.form-field input[type=\"text\"],\n.form-field input[type=\"password\"],\n.form-field input[type=\"email\"],\n.form-field input[type=\"number\"],\n.form-field input[type=\"search\"],\n.form-field input[type=\"tel\"],\n.form-field input[type=\"url\"],\n.form-field textarea {\n\tborder-style: solid;\n\tborder-width: 1px;\n\twidth: 95%;\n}\n\np.description,\n.form-wrap p {\n\tmargin: 2px 0 5px;\n\tcolor: #666;\n}\n\np.help,\np.description,\nspan.description,\n.form-wrap p {\n\tfont-size: 13px;\n\tfont-style: italic;\n}\n\n.form-wrap .form-field {\n\tmargin: 0 0 10px;\n\tpadding: 8px 0;\n}\n\n.form-wrap .form-field #parent {\n\tmax-width: 100%;\n}\n\n.col-wrap h2 {\n\tmargin: 12px 0;\n\tfont-size: 1.1em;\n}\n\n.col-wrap p.submit {\n\tmargin-top: -10px;\n}\n\n\n/*------------------------------------------------------------------------------\n  13.0 - Tags\n------------------------------------------------------------------------------*/\n\n#poststuff .tagsdiv .howto {\n\tmargin: 0 0 6px 0;\n}\n\n.ajaxtag .newtag {\n\tposition: relative;\n}\n\n.tagsdiv .newtag {\n\twidth: 180px;\n}\n\n.tagsdiv .the-tags {\n\tdisplay: block;\n\theight: 60px;\n\tmargin: 0 auto;\n\toverflow: auto;\n\twidth: 260px;\n}\n\n#post-body-content .tagsdiv .the-tags {\n\tmargin: 0 5px;\n}\n\np.popular-tags {\n\tborder: none;\n\tline-height: 2em;\n\tpadding: 8px 12px 12px;\n\ttext-align: justify;\n}\n\np.popular-tags a {\n\tpadding: 0 3px;\n}\n\n.tagcloud {\n\twidth: 97%;\n\tmargin: 0 0 40px;\n\ttext-align: justify;\n}\n\n.tagcloud h2 {\n\tmargin: 2px 0 12px;\n}\n\n.ac_results {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n\tposition: absolute;\n\tz-index: 10000;\n\tdisplay: none;\n\tborder: 1px solid #808080;\n\tbackground-color: #fff;\n}\n\n.wp-customizer .ac_results {\n\tz-index: 500000;\n}\n\n.ac_results li {\n\tpadding: 2px 5px;\n\twhite-space: nowrap;\n\tcolor: #101010;\n\ttext-align: left;\n}\n\n.ac_over {\n\tbackground-color: #f0f0b8;\n\tcursor: pointer;\n}\n\n.ac_match {\n\ttext-decoration: underline;\n}\n\n/* Comments */\n\n.comment-php .wp-editor-area {\n\theight: 200px;\n}\n\n.comment-ays th,\n.comment-ays td {\n\tpadding: 10px 15px;\n}\n\n.comment-ays-submit .button-cancel {\n\tmargin-left: 1em;\n}\n\n.trash-undo-inside,\n.spam-undo-inside {\n\tmargin: 1px 8px 1px 0;\n\tline-height: 16px;\n}\n\n.spam-undo-inside .avatar,\n.trash-undo-inside .avatar {\n\theight: 20px;\n\twidth: 20px;\n\tmargin-right: 8px;\n\tvertical-align: middle;\n}\n\n.stuffbox .editcomment {\n\tclear: none;\n}\n\n#comment-status-radio p {\n\tmargin: 3px 0 5px;\n}\n\n#comment-status-radio input {\n\tmargin: 2px 3px 5px 0;\n\tvertical-align: middle;\n}\n\n#comment-status-radio label {\n\tpadding: 5px 0;\n}\n\n/* links tables */\ntable.links-table {\n\twidth: 100%;\n\tborder-spacing: 0;\n}\n\n.links-table th {\n\tfont-weight: normal;\n\ttext-align: left;\n\tvertical-align: top;\n\tmin-width: 80px;\n\twidth: 20%;\n\tword-wrap: break-word;\n}\n\n.links-table th,\n.links-table td {\n\tpadding: 5px 0;\n}\n\n.links-table td label {\n\tmargin-right: 8px;\n}\n\n.links-table td input[type=\"text\"],\n.links-table td textarea {\n\twidth: 100%;\n}\n\n.links-table #link_rel {\n\tmax-width: 280px;\n}\n\n/* DFW 2\n-------------------------------------------------------------- */\n\n#wp-content-wrap .mce-wp-dfw,\n#qt_content_dfw {\n\tdisplay: none;\n}\n\n.wp-editor-expand #wp-content-wrap .mce-wp-dfw,\n.wp-editor-expand #qt_content_dfw {\n\tdisplay: inline-block;\n}\n\n.focus-on .wrap > h1,\n.focus-on #wpfooter,\n.focus-on .postbox-container > *,\n.focus-on div.updated,\n.focus-on div.error,\n.focus-on div.notice,\n.focus-on .update-nag,\n.focus-on #wp-toolbar,\n.focus-on #screen-meta-links,\n.focus-on #screen-meta {\n\topacity: 0;\n\t-webkit-transition-duration: 0.6s;\n\ttransition-duration: 0.6s;\n\t-webkit-transition-property: opacity;\n\ttransition-property: opacity;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\n.focus-on #wp-toolbar {\n\topacity: 0.3;\n}\n\n.focus-off .wrap > h1,\n.focus-off #wpfooter,\n.focus-off .postbox-container > *,\n.focus-off div.updated,\n.focus-off div.error,\n.focus-off div.notice,\n.focus-off .update-nag,\n.focus-off #wp-toolbar,\n.focus-off #screen-meta-links,\n.focus-off #screen-meta {\n\topacity: 1;\n\t-webkit-transition-duration: 0.2s;\n\ttransition-duration: 0.2s;\n\t-webkit-transition-property: opacity;\n\ttransition-property: opacity;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\n.focus-off #wp-toolbar {\n\t-webkit-transform: translate(0, 0);\n}\n\n.focus-on #adminmenuback,\n.focus-on #adminmenuwrap {\n\t-webkit-transition-duration: 0.6s;\n\ttransition-duration: 0.6s;\n\t-webkit-transition-property: -webkit-transform;\n\ttransition-property: -webkit-transform;\n\ttransition-property: transform;\n\ttransition-property: transform, -webkit-transform;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\n.focus-on #adminmenuback,\n.focus-on #adminmenuwrap {\n\t-webkit-transform: translateX( -100% );\n\t-ms-transform: translateX( -100% );\n\ttransform: translateX( -100% );\n}\n\n.focus-off #adminmenuback,\n.focus-off #adminmenuwrap {\n\t-webkit-transform: translateX( 0 );\n\t-ms-transform: translateX( 0 );\n\ttransform: translateX( 0 );\n\t-webkit-transition-duration: 0.2s;\n\ttransition-duration: 0.2s;\n\t-webkit-transition-property: -webkit-transform;\n\ttransition-property: -webkit-transform;\n\ttransition-property: transform;\n\ttransition-property: transform, -webkit-transform;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t#content-resize-handle,\n\t#post-body .wp_themeSkin .mceStatusbar a.mceResize {\n\t\tbackground: transparent url(../images/resize-2x.gif) no-repeat scroll right bottom;\n\t\t-webkit-background-size: 11px 11px;\n\t\tbackground-size: 11px 11px;\n\t}\n\n\t.rtl #content-resize-handle,\n\t.rtl #post-body .wp_themeSkin .mceStatusbar a.mceResize {\n\t\tbackground: transparent url(../images/resize-rtl-2x.gif) no-repeat scroll right bottom;\n\t}\n}\n\n/* one column on the post write/edit screen */\n@media only screen and (max-width: 850px) {\n\t#poststuff {\n\t\tmin-width: 0;\n\t}\n\n\t#wpbody-content #poststuff #post-body {\n\t\tmargin: 0;\n\t}\n\n\t#wpbody-content #post-body.columns-2 #postbox-container-1 {\n\t\tmargin-right: 0;\n\t\twidth: 100%;\n\t}\n\n\t#poststuff #postbox-container-1 .empty-container,\n\t#poststuff #postbox-container-1 #side-sortables:empty {\n\t\tborder: 0 none;\n\t\theight: 0;\n\t\tmin-height: 0;\n\t}\n\n\t#poststuff #post-body.columns-2 #side-sortables {\n\t\tmin-height: 0;\n\t\twidth: auto;\n\t}\n\n\t/* hide the radio buttons for column prefs */\n\t.screen-layout,\n\t.columns-prefs {\n\t\tdisplay: none;\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t#post-body-content {\n\t\tmin-width: 0;\n\t}\n\n\t#titlediv #title-prompt-text {\n\t\tpadding: 10px 10px;\n\t}\n\n\t#poststuff h3.hndle, /* Back-compat for pre-4.4 */\n\t#poststuff .stuffbox > h3, /* Back-compat for pre-4.4 */\n\t#poststuff h2 {\n\t\tpadding: 12px;\n\t}\n\n\t.post-format-options {\n\t\tpadding-right: 0;\n\t}\n\n\t.post-format-options a {\n\t\tmargin-right: 5px;\n\t\tmargin-bottom: 5px;\n\t\tmin-width: 52px;\n\t}\n\n\t.post-format-options .post-format-title {\n\t\tfont-size: 11px;\n\t}\n\n\t.post-format-options a div {\n\t\theight: 28px;\n\t\twidth: 28px;\n\t}\n\n\t.post-format-options a div:before {\n\t\tfont-size: 26px !important;\n\t}\n\n\t/* Publish Metabox Options */\n\t#post-visibility-select {\n\t\tline-height: 280%;\n\t}\n\n\t.wp-core-ui .save-post-visibility,\n\t.wp-core-ui .save-timestamp {\n\t\tvertical-align: middle;\n\t\tmargin-right: 15px;\n\t}\n\n\t.timestamp-wrap select#mm {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tmargin-bottom: 10px;\n\t}\n\n\t.timestamp-wrap #jj,\n\t.timestamp-wrap #aa,\n\t.timestamp-wrap #hh,\n\t.timestamp-wrap #mn {\n\t\tpadding: 12px 3px;\n\t\tfont-size: 14px;\n\t\tmargin-bottom: 5px;\n\t\twidth: auto;\n\t\ttext-align: center;\n\t}\n\n\t/* Categories Metabox */\n\tul.category-tabs {\n\t\tmargin: 30px 0 15px;\n\t}\n\n\tul.category-tabs li.tabs {\n\t\tpadding: 15px;\n\t}\n\n\tul.categorychecklist li {\n\t\tmargin-bottom: 15px;\n\t}\n\n\tul.categorychecklist ul {\n\t\tmargin-top: 15px;\n\t}\n\n\t.category-add input[type=text],\n\t.category-add select {\n\t\tmax-width: none;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t/* Tags Metabox */\n\t.tagsdiv .newtag {\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t.tagchecklist {\n\t\tmargin: 25px 10px;\n\t}\n\n\t.tagchecklist span {\n\t\tfont-size: 16px;\n\t\tline-height: 1.4;\n\t}\n\n\t/* Discussion */\n\t#commentstatusdiv p {\n\t\tline-height: 2.8;\n\t}\n\n\t/* TinyMCE Adjustments */\n\t.mceToolbar * {\n\t\twhite-space: normal !important;\n\t}\n\n\t.mceToolbar tr,\n\t.mceToolbar td {\n\t\tfloat: left !important;\n\t}\n\n\t.wp_themeSkin a.mceButton {\n\t\twidth: 30px;\n\t\theight: 30px;\n\t}\n\n\t.wp_themeSkin .mceButton .mceIcon {\n\t\tmargin-top: 5px;\n\t\tmargin-left: 5px;\n\t}\n\n\t.wp_themeSkin .mceSplitButton {\n\t\tmargin-top: 1px;\n\t}\n\n\t.wp_themeSkin .mceSplitButton td a.mceAction {\n\t\tpadding-top: 6px;\n\t\tpadding-bottom: 6px;\n\t\tpadding-left: 6px;\n\t\tpadding-right: 3px;\n\t}\n\n\t.wp_themeSkin .mceSplitButton td a.mceOpen,\n\t.wp_themeSkin .mceSplitButtonEnabled:hover td a.mceOpen {\n\t\tpadding-top: 6px;\n\t\tpadding-bottom: 6px;\n\t\tbackground-position: 1px 6px;\n\t}\n\n\t.wp_themeSkin table.mceListBox {\n\t\tmargin: 5px;\n\t}\n\n\tdiv.quicktags-toolbar input {\n\t\tpadding: 10px 20px;\n\t}\n\n\tbutton.wp-switch-editor {\n\t\tfont-size: 16px;\n\t\tline-height: 1em;\n\t\tmargin: 7px 0 0 7px;\n\t\tpadding: 8px 12px;\n\t}\n\n\t#wp-content-media-buttons a {\n\t\tfont-size: 16px;\n\t\tline-height: 37px;\n\t\theight: 39px;\n\t\tpadding: 0 20px 0 15px;\n\t}\n\n\t.wp-media-buttons span.wp-media-buttons-icon,\n\t.wp-media-buttons span.jetpack-contact-form-icon {\n\t\twidth: 22px !important;\n\t\tmargin-top: -3px !important;\n\t\tmargin-left: -5px !important;\n\t}\n\n\t.wp-media-buttons .add_media span.wp-media-buttons-icon:before,\n\t.wp-media-buttons #insert-jetpack-contact-form span.jetpack-contact-form-icon:before {\n\t\tfont-size: 20px !important;\n\t}\n\n\t#content_wp_fullscreen {\n\t\tdisplay: none;\n\t}\n\n\t.misc-pub-section {\n\t\tpadding: 20px 10px 20px;\n\t}\n\n\t.misc-pub-section > a {\n\t\tfloat: right;\n\t\tfont-size: 16px;\n\t}\n\n\t#delete-action,\n\t#publishing-action {\n\t\tline-height: 47px;\n\t}\n\n\t#publishing-action .spinner {\n\t\tfloat: none;\n\t\tmargin-top: -2px; /* Half of the Publish button's bottom margin. */\n\t}\n\n\t/* Moderate Comment */\n\t.comment-ays th,\n\t.comment-ays td {\n\t\tpadding-bottom: 0;\n\t}\n\n\t.comment-ays td {\n\t\tpadding-top: 6px;\n\t}\n\n\t/* Links */\n\t.links-table #link_rel {\n\t\tmax-width: none;\n\t}\n\n\t.links-table th,\n\t.links-table td {\n\t\tpadding: 10px 0;\n\t}\n}\n\n@media only screen and (max-width: 500px) {\n\t/* Align Add Media + Visual + Text tabs */\n\t#wp-content-media-buttons a {\n\t\tfont-size: 14px;\n\t\tpadding: 0 10px 0 10px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/farbtastic-rtl.css",
    "content": "\n.farbtastic {\n  position: relative;\n}\n\n.farbtastic * {\n  position: absolute;\n  cursor: crosshair;\n}\n\n.farbtastic,\n.farbtastic .wheel {\n  width: 195px;\n  height: 195px;\n}\n\n.farbtastic .color,\n.farbtastic .overlay {\n  top: 47px;\n  right: 47px;\n  width: 101px;\n  height: 101px;\n}\n\n.farbtastic .wheel {\n  background: url(../images/wheel.png) no-repeat;\n  width: 195px;\n  height: 195px;\n}\n\n.farbtastic .overlay {\n  background: url(../images/mask.png) no-repeat;\n}\n\n.farbtastic .marker {\n  width: 17px;\n  height: 17px;\n  margin: -8px -8px 0 0;\n  overflow: hidden;\n  background: url(../images/marker.png) no-repeat;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/farbtastic.css",
    "content": "\n.farbtastic {\n  position: relative;\n}\n\n.farbtastic * {\n  position: absolute;\n  cursor: crosshair;\n}\n\n.farbtastic,\n.farbtastic .wheel {\n  width: 195px;\n  height: 195px;\n}\n\n.farbtastic .color,\n.farbtastic .overlay {\n  top: 47px;\n  left: 47px;\n  width: 101px;\n  height: 101px;\n}\n\n.farbtastic .wheel {\n  background: url(../images/wheel.png) no-repeat;\n  width: 195px;\n  height: 195px;\n}\n\n.farbtastic .overlay {\n  background: url(../images/mask.png) no-repeat;\n}\n\n.farbtastic .marker {\n  width: 17px;\n  height: 17px;\n  margin: -8px 0 0 -8px;\n  overflow: hidden;\n  background: url(../images/marker.png) no-repeat;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/forms-rtl.css",
    "content": "/* Include margin and padding in the width calculation of input and textarea. */\ninput,\ntextarea {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"checkbox\"],\ninput[type=\"color\"],\ninput[type=\"date\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"email\"],\ninput[type=\"month\"],\ninput[type=\"number\"],\ninput[type=\"password\"],\ninput[type=\"search\"],\ninput[type=\"radio\"],\ninput[type=\"tel\"],\ninput[type=\"text\"],\ninput[type=\"time\"],\ninput[type=\"url\"],\ninput[type=\"week\"],\nselect,\ntextarea {\n\tborder: 1px solid #ddd;\n\t-webkit-box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 );\n\tbox-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 );\n\tbackground-color: #fff;\n\tcolor: #32373c;\n\toutline: none;\n\t-webkit-transition: 0.05s border-color ease-in-out;\n\ttransition: 0.05s border-color ease-in-out;\n}\n\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"color\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"checkbox\"]:focus,\ninput[type=\"radio\"]:focus,\nselect:focus,\ntextarea:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 2px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow: 0 0 2px rgba( 30, 140, 190, 0.8 );\n}\n\n/* rtl:ignore */\ninput[type=\"email\"],\ninput[type=\"url\"] {\n\tdirection: ltr;\n}\n\n/* Vertically align the number selector with the input. */\ninput[type=\"number\"] {\n\tline-height: inherit;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\tborder: 1px solid #b4b9be;\n\tbackground: #fff;\n\tcolor: #555;\n\tclear: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n\tline-height: 0;\n\theight: 16px;\n\tmargin: -4px 0 0 4px;\n\toutline: 0;\n\tpadding: 0 !important;\n\ttext-align: center;\n\tvertical-align: middle;\n\twidth: 16px;\n\tmin-width: 16px;\n\t-webkit-appearance: none;\n\t-webkit-box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.1 );\n\t-webkit-transition: .05s border-color ease-in-out;\n\ttransition: .05s border-color ease-in-out;\n}\n\ninput[type=\"radio\"]:checked + label:before {\n\tcolor: #82878c;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n\tcolor: #00a0d2;\n}\n\ntd > input[type=\"checkbox\"],\n.wp-admin p input[type=\"checkbox\"],\n.wp-admin p input[type=\"radio\"] {\n\tmargin-top: 0;\n}\n\n.wp-admin p label input[type=\"checkbox\"] {\n\tmargin-top: -4px;\n}\n\n.wp-admin p label input[type=\"radio\"] {\n\tmargin-top: -2px;\n}\n\ninput[type=\"radio\"] {\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tmargin-left: 4px;\n\tline-height: 10px;\n}\n\ninput[type=\"checkbox\"]:checked:before,\ninput[type=\"radio\"]:checked:before {\n\tfloat: right;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 16px;\n\tfont: normal 21px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\ninput[type=\"checkbox\"]:checked:before {\n\tcontent: \"\\f147\";\n\tmargin: -3px -4px 0 0;\n\tcolor: #1e8cbe;\n}\n\ninput[type=\"radio\"]:checked:before {\n\tcontent: \"\\2022\";\n\ttext-indent: -9999px;\n\t-webkit-border-radius: 50px;\n\tborder-radius: 50px;\n\tfont-size: 24px;\n\twidth: 6px;\n\theight: 6px;\n\tmargin: 4px;\n\tline-height: 16px;\n\tbackground-color: #1e8cbe;\n}\n\n@-moz-document url-prefix() {\n\tinput[type=\"checkbox\"],\n\tinput[type=\"radio\"],\n\t.form-table input.tog {\n\t\tmargin-bottom: -1px;\n\t}\n}\n\n/* Search */\ninput[type=\"search\"] {\n\t-webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration {\n\tdisplay: none;\n}\n\n.ie8 input[type=\"password\"] {\n\tfont-family: sans-serif;\n}\n\ntextarea,\ninput,\nselect,\nbutton {\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tfont-weight: inherit;\n}\n\ntextarea,\ninput,\nselect {\n\tfont-size: 14px;\n\tpadding: 3px 5px;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0; /* Reset mobile webkit's default element styling */\n}\n\ntextarea {\n\toverflow: auto;\n\tpadding: 2px 6px;\n\tline-height: 1.4;\n\tresize: vertical;\n}\n\n.wp-admin input[type=\"file\"] {\n\tpadding: 3px 0;\n}\n\nlabel {\n\tcursor: pointer;\n}\n\ninput,\nselect {\n\tmargin: 1px;\n\tpadding: 3px 5px;\n}\n\ninput.code {\n\tpadding-top: 6px;\n}\n\ntextarea.code {\n\tline-height: 1.4;\n\tpadding: 4px 6px 1px 6px;\n}\n\ninput.readonly,\ninput[readonly],\ntextarea.readonly,\ntextarea[readonly] {\n\tbackground-color: #eee;\n}\n\n:-moz-placeholder,\n.wp-core-ui :-moz-placeholder {\n   color: #a9a9a9;\n}\n\n.form-invalid input, .form-invalid input:focus,\n.form-invalid select, .form-invalid select:focus {\n\tborder-color: #dc3232 !important;\n\t-webkit-box-shadow: 0 0 2px rgba( 204, 0, 0, 0.8 );\n \tbox-shadow: 0 0 2px rgba( 204, 0, 0, 0.8 );\n}\n\n.form-table .form-required.form-invalid td:after {\n\tcontent: \"\\f534\";\n\tfont: normal 20px/1 dashicons;\n\tcolor: #dc3232;\n\tmargin-right: -25px;\n\tvertical-align: middle;\n}\n\n/* Adjust error indicator for password layout */\n.form-table .form-required.user-pass1-wrap.form-invalid td:after {\n\tcontent: '';\n}\n\n.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after {\n\tcontent: '\\f534';\n\tfont: normal 20px/1 dashicons;\n\tcolor: #dc3232;\n\tmargin: 0 -29px 0 6px;\n\tvertical-align: middle;\n}\n\n.form-input-tip {\n\tcolor: #666;\n}\n\ninput:disabled,\ninput.disabled,\nselect:disabled,\nselect.disabled,\ntextarea:disabled,\ntextarea.disabled {\n\tbackground: rgba( 255, 255, 255, 0.5 );\n\tborder-color: rgba( 222, 222, 222, 0.75 );\n\t-webkit-box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.04 );\n\tbox-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.04 );\n\tcolor: rgba( 51, 51, 51, 0.5 );\n}\n\ninput[type=\"file\"]:disabled,\ninput[type=\"file\"].disabled,\ninput[type=\"range\"]:disabled,\ninput[type=\"range\"].disabled {\n\tbackground: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\ninput[type=\"checkbox\"]:disabled,\ninput[type=\"checkbox\"].disabled,\ninput[type=\"radio\"]:disabled,\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"]:disabled:checked:before,\ninput[type=\"checkbox\"].disabled:checked:before,\ninput[type=\"radio\"]:disabled:checked:before,\ninput[type=\"radio\"].disabled:checked:before {\n\topacity: 0.7;\n}\n\n/*------------------------------------------------------------------------------\n  2.0 - Forms\n------------------------------------------------------------------------------*/\n\n\n.wp-admin select {\n\tpadding: 2px;\n\tline-height: 28px;\n\theight: 28px;\n\tvertical-align: middle;\n}\n\n.wp-admin .button-cancel {\n\tpadding: 0 5px;\n\tline-height: 2;\n}\n\n.meta-box-sortables select {\n\tmax-width: 100%;\n}\n\n.wp-admin select[multiple] {\n\theight: auto;\n}\n\n.submit {\n\tpadding: 1.5em 0;\n\tmargin: 5px 0;\n\t-webkit-border-bottom-right-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n\t-webkit-border-bottom-left-radius: 3px;\n\tborder-bottom-left-radius: 3px;\n\tborder: none;\n}\n\nform p.submit a.cancel:hover {\n\ttext-decoration: none;\n}\n\np.submit {\n\ttext-align: right;\n\tmax-width: 100%;\n\tmargin-top: 20px;\n\tpadding-top: 10px;\n}\n\n.textright p.submit {\n\tborder: none;\n\ttext-align: left;\n}\n\ntable.form-table + p.submit,\ntable.form-table + input + p.submit,\ntable.form-table + input + input + p.submit {\n\tborder-top: none;\n\tpadding-top: 0;\n}\n\n#minor-publishing-actions input,\n#major-publishing-actions input,\n#minor-publishing-actions .preview {\n\ttext-align: center;\n}\n\ntextarea.all-options,\ninput.all-options {\n\twidth: 250px;\n}\n\ninput.large-text,\ntextarea.large-text {\n\twidth: 99%;\n}\n\ninput.regular-text {\n\twidth: 25em;\n}\n\ninput.small-text {\n\twidth: 50px;\n\tpadding: 1px 6px;\n}\n\ninput[type=\"number\"].small-text {\n\twidth: 65px;\n}\n\ninput.tiny-text {\n\twidth: 35px;\n}\n\ninput[type=\"number\"].tiny-text {\n\twidth: 45px;\n}\n\n#doaction,\n#doaction2,\n#post-query-submit {\n\tmargin: 1px 0 0 8px;\n}\n\n.tablenav #changeit,\n.tablenav #delete_all,\n.tablenav #clear-recent-list,\n.wp-filter #delete_all {\n\tmargin-top: 1px;\n}\n\n.tablenav .actions select {\n\tfloat: right;\n\tmargin-left: 6px;\n\tmax-width: 200px;\n}\n\n.ie8 .tablenav .actions select {\n\twidth: 155px;\n}\n\n.ie8 .tablenav .actions select#cat {\n\twidth: 200px;\n}\n\n#timezone_string option {\n\tmargin-right: 1em;\n}\n\n#upload-form label {\n\tcolor: #777;\n}\n\nbutton.wp-hide-pw > .dashicons {\n\tposition: relative;\n\ttop: 3px;\n}\n\nlabel,\n#your-profile label + a {\n\tvertical-align: middle;\n}\n\nfieldset label,\n#your-profile label + a {\n\tvertical-align: middle;\n}\n\n.options-media-php label[for*=\"_size_\"],\n#misc-publishing-actions label {\n\tvertical-align: baseline;\n}\n\n#misc-publishing-actions label[for=\"post_status\"]:before {\n\tcontent: \"\\f173\";\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tright: -1px;\n\tpadding: 0 0 0 5px;\n\tposition: relative;\n\ttop: 0;\n\ttext-decoration: none !important;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#pass-strength-result {\n\tbackground-color: #eee;\n\tborder: 1px solid #ddd;\n\tcolor: #23282d;\n\tmargin: -2px 1px 5px 5px;\n\tpadding: 3px 5px;\n\ttext-align: center;\n\twidth: 25em;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\topacity: 0;\n}\n\n#pass-strength-result.short {\n\tbackground-color: #f1adad;\n\tborder-color: #e35b5b;\n\topacity: 1;\n}\n\n#pass-strength-result.bad {\n\tbackground-color: #fbc5a9;\n\tborder-color: #f78b53;\n\topacity: 1;\n}\n\n#pass-strength-result.good {\n\tbackground-color: #ffe399;\n\tborder-color: #ffc733;\n\topacity: 1;\n}\n\n#pass-strength-result.strong {\n\tbackground-color: #c1e1b9;\n\tborder-color: #83c373;\n\topacity: 1;\n}\n\n#pass1.short, #pass1-text.short {\n\tborder-color: #e35b5b;\n}\n\n#pass1.bad, #pass1-text.bad {\n\tborder-color: #f78b53;\n}\n\n#pass1.good, #pass1-text.good {\n\tborder-color: #ffc733;\n}\n\n#pass1.strong, #pass1-text.strong {\n\tborder-color: #83c373;\n}\n\n.pw-weak {\n\tdisplay:none;\n}\n\n.indicator-hint {\n\tpadding-top: 8px;\n}\n\n#pass1-text,\n.show-password #pass1 {\n\tdisplay: none;\n}\n\n.show-password #pass1-text\n{\n\tdisplay: inline-block;\n}\n\n.form-table span.description.important {\n\tfont-size: 12px;\n}\n\np.search-box {\n\tfloat: left;\n\tmargin: 0;\n}\n\n.network-admin.themes-php p.search-box {\n\tclear: right;\n}\n\n.search-box input[name=\"s\"],\n.tablenav .search-plugins input[name=\"s\"],\n.tagsdiv .newtag {\n\tfloat: right;\n\theight: 28px;\n\tmargin: 0 0 0 4px;\n}\n\ninput[type=\"text\"].ui-autocomplete-loading,\ninput[type=\"email\"].ui-autocomplete-loading {\n\tbackground-image: url(../images/loading.gif);\n\tbackground-repeat: no-repeat;\n\tbackground-position: left center;\n\tvisibility: visible;\n}\n\ninput.ui-autocomplete-input.open {\n\tborder-bottom-color: transparent;\n}\n\nul#add-to-blog-users {\n\tmargin: 0 14px 0 0;\n}\n\n.ui-autocomplete {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n\tposition: absolute;\n\tz-index: 10000;\n\tborder: 1px solid #5b9dd9;\n\t-webkit-box-shadow: 0 1px 2px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow: 0 1px 2px rgba( 30, 140, 190, 0.8 );\n\tbackground-color: #fff;\n}\n\n.ui-autocomplete li {\n\tmargin-bottom: 0;\n\tpadding: 4px 10px;\n\twhite-space: nowrap;\n\ttext-align: right;\n}\n\n.ui-autocomplete li.ui-state-focus {\n\tbackground-color: #ddd;\n\tcursor: pointer;\n}\n\n/*------------------------------------------------------------------------------\n  15.0 - Comments Screen\n------------------------------------------------------------------------------*/\n\n.form-table {\n\tborder-collapse: collapse;\n\tmargin-top: 0.5em;\n\twidth: 100%;\n\tclear: both;\n}\n\n.form-table,\n.form-table td,\n.form-table th,\n.form-table td p,\n.form-wrap label {\n\tfont-size: 14px;\n}\n\n.form-table td {\n\tmargin-bottom: 9px;\n\tpadding: 15px 10px;\n\tline-height: 1.3;\n\tvertical-align: middle;\n}\n\n.form-table th,\n.form-wrap label {\n\tcolor: #23282d;\n\tfont-weight: normal;\n\ttext-shadow: none;\n\tvertical-align: baseline;\n}\n\n.form-table th {\n\tvertical-align: top;\n\ttext-align: right;\n\tpadding: 20px 0 20px 10px;\n\twidth: 200px;\n\tline-height: 1.3;\n\tfont-weight: 600;\n}\n\n.form-table th.th-full {\n\twidth: auto;\n\tfont-weight: 400;\n}\n\n.form-table td p {\n\tmargin-top: 4px;\n\tmargin-bottom: 0;\n}\n\n.form-table td fieldset label {\n\tmargin: 0.25em 0 0.5em !important;\n\tdisplay: inline-block;\n}\n\n.form-table td fieldset label,\n.form-table td fieldset p,\n.form-table td fieldset li {\n\tline-height: 1.4em;\n}\n\n.form-table input.tog,\n.form-table input[type=\"radio\"] {\n\tmargin-top: -4px;\n\tmargin-left: 4px;\n\tfloat: none;\n}\n\n.form-table .pre {\n\tpadding: 8px;\n\tmargin: 0;\n}\n\ntable.form-table td .updated {\n\tfont-size: 13px;\n}\n\ntable.form-table td .updated p {\n\tfont-size: 13px;\n\tmargin: 0.3em 0;\n}\n\n/*------------------------------------------------------------------------------\n  18.0 - Users\n------------------------------------------------------------------------------*/\n\n#profile-page .form-table textarea {\n\twidth: 500px;\n\tmargin-bottom: 6px;\n}\n\n#profile-page .form-table #rich_editing {\n\tmargin-left: 5px\n}\n\n#your-profile legend {\n\tfont-size: 22px;\n}\n\n#display_name {\n\twidth: 15em;\n}\n\n#adduser .form-field input,\n#createuser .form-field input {\n\twidth: 25em;\n}\n\n.color-option {\n\tdisplay: inline-block;\n\twidth: 24%;\n\tpadding: 5px 15px 15px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 3px;\n}\n\n.color-option:hover,\n.color-option.selected {\n\tbackground: #ddd;\n}\n\n.color-palette {\n\twidth: 100%;\n\tborder-spacing: 0;\n\tborder-collapse: collapse;\n}\n.color-palette td {\n\theight: 20px;\n\tpadding: 0;\n\tborder: none;\n}\n\n.color-option {\n\tcursor: pointer;\n}\n\n/*------------------------------------------------------------------------------\n  19.0 - Tools\n------------------------------------------------------------------------------*/\n\n.tool-box .title {\n\tmargin: 8px 0;\n\tfont-size: 18px;\n\tfont-weight: normal;\n\tline-height: 24px;\n}\n\n.label-responsive {\n\tvertical-align: middle;\n}\n\n#export-filters p {\n\tmargin: 0 0 1em;\n}\n\n#export-filters p.submit {\n\tmargin: 7px 0 5px;\n}\n\n/* Card styles */\n\n.card {\n\tposition: relative;\n\tmargin-top: 20px;\n\tpadding: 0.7em 2em 1em;\n\tmin-width: 255px;\n\tmax-width: 520px;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbackground: #fff;\n}\n\n/* Press this styles */\n\n.pressthis h4 {\n\tmargin: 2em 0 1em;\n}\n\n.pressthis textarea {\n\twidth: 100%;\n\tfont-size: 1em;\n}\n\n#pressthis-code-wrap {\n\toverflow: auto;\n}\n\n.pressthis-bookmarklet-wrapper {\n\tmargin: 20px 0 8px;\n\tvertical-align: top;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.pressthis-bookmarklet,\n.pressthis-bookmarklet:hover,\n.pressthis-bookmarklet:focus,\n.pressthis-bookmarklet:active {\n\tdisplay: inline-block;\n\tposition: relative;\n\tcursor: move;\n\tcolor: #32373c;\n\tbackground: #e6e6e6;\n\t-webkit-border-radius: 5px;\n\tborder-radius: 5px;\n\tborder: 1px solid #b4b4b4;\n\tfont-style: normal;\n\tline-height: 16px;\n\tfont-size: 14px;\n\ttext-decoration: none;\n}\n\n.pressthis-bookmarklet:active {\n\toutline: none;\n}\n\n.pressthis-bookmarklet:after {\n\tcontent: \"\";\n\twidth: 70%;\n\theight: 55%;\n\tz-index: -1;\n\tposition: absolute;\n\tleft: 10px;\n\tbottom: 9px;\n\tbackground: transparent;\n\t-webkit-transform: skew(-20deg) rotate(-6deg);\n\t-ms-transform: skew(-20deg) rotate(-6deg);\n\ttransform: skew(-20deg) rotate(-6deg);\n\t-webkit-box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6);\n\tbox-shadow: 0 10px 8px rgba(0, 0, 0, 0.6);\n}\n\n.pressthis-bookmarklet:hover:after {\n\t-webkit-transform: skew(-20deg) rotate(-9deg);\n\t-ms-transform: skew(-20deg) rotate(-9deg);\n\ttransform: skew(-20deg) rotate(-9deg);\n\t-webkit-box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7);\n\tbox-shadow: 0 10px 8px rgba(0, 0, 0, 0.7);\n}\n\n.pressthis-bookmarklet span {\n\tdisplay: inline-block;\n\tmargin: 0px 0 0;\n\tpadding: 0px 9px 8px 12px;\n}\n\n.pressthis-bookmarklet span:before {\n\tcolor: #777;\n\tfont: normal 20px/1 dashicons;\n\tcontent: \"\\f157\";\n\tposition: relative;\n\tdisplay: inline-block;\n\ttop: 4px;\n\tmargin-left: 4px;\n}\n\n.pressthis-js-toggle {\n\tmargin-right: 10px;\n\tpadding: 0;\n\theight: auto;\n\tvertical-align: top;\n}\n\n.pressthis-js-toggle .dashicons {\n\tmargin: 5px 7px 6px 8px;\n\tcolor: #777;\n}\n\n/* to override the button class being applied */\n.pressthis-js-toggle.button.button {\n\tmargin-right: 10px;\n\tpadding: 0;\n\theight: auto;\n\tvertical-align: top;\n}\n\n.pressthis-js-toggle .dashicons {\n\tmargin: 5px 7px 6px 8px;\n\tcolor: #777;\n}\n\n/*------------------------------------------------------------------------------\n  20.0 - Settings\n------------------------------------------------------------------------------*/\n\n#utc-time, #local-time {\n\tpadding-right: 25px;\n\tfont-style: italic;\n}\n\n.defaultavatarpicker .avatar {\n\tmargin: 2px 0;\n\tvertical-align: middle;\n}\n\n.options-general-php input.small-text {\n\twidth: 56px;\n}\n\n.options-general-php .spinner {\n\tfloat: none;\n\tmargin: 0 3px;\n}\n\n.settings-php .language-install-spinner,\n.options-general-php .language-install-spinner {\n\tdisplay: inline-block;\n\tfloat: none;\n\tmargin: -3px 5px 0;\n\tvertical-align: middle;\n}\n\n/*------------------------------------------------------------------------------\n  21.0 - Network Admin\n------------------------------------------------------------------------------*/\n\n.setup-php textarea {\n\tmax-width: 100%;\n}\n\n.form-field #site-address {\n\tmax-width: 25em;\n}\n\n.form-field #domain {\n\tmax-width: 22em;\n}\n\n.form-field #site-title,\n.form-field #admin-email,\n.form-field #path,\n.form-field #blog_registered,\n.form-field #blog_last_updated {\n\tmax-width: 25em;\n}\n\n.form-field #path {\n\tmargin-bottom: 5px;\n}\n\n#search-users,\n#search-sites {\n\tmax-width: 100%;\n}\n\n/*------------------------------------------------------------------------------\n   Credentials check dialog for Install and Updates\n------------------------------------------------------------------------------*/\n\n.request-filesystem-credentials-dialog {\n\tdisplay: none;\n}\n\n.request-filesystem-credentials-dialog .notification-dialog {\n\ttop: 15%;\n\tmax-height: 85%;\n}\n\n.request-filesystem-credentials-dialog-content {\n\tmargin: 25px;\n}\n\n#request-filesystem-credentials-title {\n    font-size: 1.3em;\n    margin: 1em 0;\n}\n\n.request-filesystem-credentials-form legend {\n\tfont-size: 1em;\n\tpadding: 1.33em 0;\n\tfont-weight: 600;\n}\n\n.request-filesystem-credentials-form input[type=\"text\"],\n.request-filesystem-credentials-form input[type=\"password\"] {\n\tdisplay: block;\n}\n\n.request-filesystem-credentials-dialog input[type=\"text\"],\n.request-filesystem-credentials-dialog input[type=\"password\"] {\n\twidth: 100%;\n}\n\n.request-filesystem-credentials-form .field-title {\n\tfont-weight: 600;\n}\n\n.request-filesystem-credentials-dialog label[for=\"hostname\"],\n.request-filesystem-credentials-dialog label[for=\"public_key\"],\n.request-filesystem-credentials-dialog label[for=\"private_key\"] {\n\tdisplay: block;\n\tmargin-bottom: 1em;\n}\n\n.request-filesystem-credentials-dialog .ftp-username,\n.request-filesystem-credentials-dialog .ftp-password {\n\tfloat: right;\n\twidth: 48%;\n}\n\n.request-filesystem-credentials-dialog .ftp-password {\n\tmargin-right: 4%;\n}\n\n.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons {\n\ttext-align: left;\n}\n\n.request-filesystem-credentials-dialog label[for=\"ftp\"] {\n\tmargin-left: 10px;\n}\n\n#request-filesystem-credentials-dialog .button:not(:last-child) {\n\tmargin-left: 10px;\n}\n\n#request-filesystem-credentials-form .cancel-button {\n\tdisplay: none;\n}\n\n#request-filesystem-credentials-dialog .cancel-button {\n\tdisplay: inline;\n}\n\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n@media screen and ( max-width: 782px ) {\n\t/* Input Elements */\n\ttextarea {\n\t\t-webkit-appearance: none;\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"search\"],\n\tinput[type=\"password\"],\n\tinput[type=\"number\"] {\n\t\t-webkit-appearance: none;\n\t\tpadding: 6px 10px;\n\t}\n\n\tinput.code {\n\t\tpadding-bottom: 5px;\n\t\tpadding-top: 10px;\n\t}\n\n\tinput[type=\"checkbox\"],\n\t.widefat th input[type=\"checkbox\"],\n\t.widefat thead td input[type=\"checkbox\"],\n\t.widefat tfoot td input[type=\"checkbox\"] {\n\t\t-webkit-appearance: none;\n\t\tpadding: 10px;\n\t}\n\n\t.widefat th input[type=\"checkbox\"],\n\t.widefat thead td input[type=\"checkbox\"],\n\t.widefat tfoot td input[type=\"checkbox\"] {\n\t\tmargin-bottom: 8px;\n\t}\n\n\tinput[type=\"checkbox\"]:checked:before,\n\t.widefat th input[type=\"checkbox\"]:before,\n\t.widefat thead td input[type=\"checkbox\"]:before,\n\t.widefat tfoot td input[type=\"checkbox\"]:before {\n\t\tfont: normal 30px/1 dashicons;\n\t\tmargin: -3px -5px;\n\t}\n\n\tinput[type=\"radio\"],\n\tinput[type=\"checkbox\"] {\n\t\theight: 25px;\n\t\twidth: 25px;\n\t}\n\n\t.wp-admin p input[type=\"checkbox\"],\n\t.wp-admin p input[type=\"radio\"] {\n\t\tmargin-top: -3px;\n\t}\n\n\tinput[type=\"radio\"]:checked:before {\n\t\tvertical-align: middle;\n\t\twidth: 9px;\n\t\theight: 9px;\n\t\tmargin: 7px;\n\t\tline-height: 16px;\n\t}\n\n\t.wp-upload-form input[type=\"submit\"] {\n\t\tmargin-top: 10px;\n\t}\n\n\t#wpbody select {\n\t\theight: 36px;\n\t\tfont-size: 16px;\n\t}\n\n\t.wp-admin .button-cancel {\n\t\tpadding: 0;\n\t\tfont-size: 14px;\n\t}\n\n\t#adduser .form-field input,\n\t#createuser .form-field input {\n\t\twidth: 100%;\n\t}\n\n\t.form-table {\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.form-table th,\n\t.form-table td,\n\t.label-responsive {\n\t\tdisplay: block;\n\t\twidth: auto;\n\t\tvertical-align: middle;\n\t}\n\n\t.label-responsive {\n\t\tmargin: 0.5em 0;\n\t}\n\n\t.export-filters li {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.form-table .color-palette td {\n\t\tdisplay: table-cell;\n\t\twidth: 15px;\n\t}\n\n\t.form-table table.color-palette {\n\t\tmargin-left: 10px;\n\t}\n\n\ttextarea,\n\tinput {\n\t\tfont-size: 16px;\n\t}\n\n\t.form-table td input[type=\"text\"],\n\t.form-table td input[type=\"email\"],\n\t.form-table td input[type=\"password\"],\n\t.form-table td select,\n\t.form-table td textarea,\n\t.form-table span.description,\n\t#profile-page .form-table textarea {\n\t\twidth: 100%;\n\t\tfont-size: 16px;\n\t\tline-height: 1.5;\n\t\tpadding: 7px 10px;\n\t\tdisplay: block;\n\t\tmax-width: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.form-table .form-required.form-invalid td:after {\n\t\tfloat: left;\n\t\tmargin: -30px 0 0 3px;\n\t}\n\n\t#wpbody .form-table td select {\n\t\theight: 40px;\n\t}\n\n\tinput[type=\"text\"].small-text,\n\tinput[type=\"search\"].small-text,\n\tinput[type=\"password\"].small-text,\n\tinput[type=\"number\"].small-text,\n\tinput[type=\"number\"].small-text,\n\t.form-table input[type=\"text\"].small-text {\n\t\twidth: auto;\n\t\tmax-width: 55px;\n\t\tdisplay: inline;\n\t\tpadding: 3px 6px;\n\t\tmargin: 0 3px;\n\t}\n\n\t#pass-strength-result {\n\t\twidth: 100%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tpadding: 8px;\n\t}\n\n\tp.search-box {\n\t\tfloat: none;\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t\twidth: 98%;\n\t\theight: 90px;\n\t\tmargin-bottom: 20px;\n\t}\n\n\tp.search-box input[name=\"s\"] {\n\t\theight: auto;\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin-bottom: 10px;\n\t\tvertical-align: middle;\n\t\t-webkit-appearance: none;\n\t}\n\n\tp.search-box input[type=\"submit\"] {\n\t\tmargin-bottom: 10px;\n\t}\n\n\t.form-table span.description {\n\t\tdisplay: inline;\n\t\tpadding: 4px 0 0;\n\t\tline-height: 1.4em;\n\t\tfont-size: 14px;\n\t}\n\n\t.form-table th {\n\t\tpadding-top: 10px;\n\t\tpadding-bottom: 0;\n\t\tborder-bottom: 0;\n\t}\n\n\t.form-table td {\n\t\tmargin-bottom: 0;\n\t\tpadding-bottom: 6px;\n\t\tpadding-top: 4px;\n\t\tpadding-right: 0;\n\t}\n\n\t.form-table.permalink-structure td code {\n\t\tmargin-right: 32px;\n\t}\n\n\t.form-table.permalink-structure td input[type=\"text\"] {\n\t\tmargin-right: 32px;\n\t\tmargin-top: 4px;\n\t\twidth: 96%;\n\t}\n\n\t.form-table input.regular-text {\n\t\twidth: 100%;\n\t}\n\n\t.form-table label {\n\t\tfont-size: 14px;\n\t}\n\n\t.form-table fieldset label {\n\t\tdisplay: block;\n\t}\n\n\t#utc-time {\n\t\tmargin-top: 10px;\n\t}\n\n\t#utc-time,\n\t#local-time {\n\t\tdisplay: block;\n\t\tfloat: none;\n\t\tpadding: 0;\n\t\tline-height: 2;\n\t}\n\n\t.form-field #domain {\n\t\tmax-width: none;\n\t}\n\n\t/* New Password */\n\t.wp-pwd {\n\t\tposition: relative;\n\t}\n\n\t.wp-pwd [type=\"text\"],\n\t.wp-pwd [type=\"password\"] {\n\t\tpadding-left: 40px;\n\t}\n\n\t.wp-pwd button.button {\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t\tline-height: 2;\n\t\tmargin: 0;\n\t\tpadding: 5px 10px;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\ttop: 0;\n\t}\n\n\t.wp-pwd button.button:hover,\n\t.wp-pwd button.button:focus,\n\t.wp-pwd button.button:active {\n\t\tbackground: transparent;\n\t}\n\n\t.wp-pwd .button .text {\n\t\tdisplay: none;\n\t}\n}\n\n@media only screen and (max-width: 768px) {\n\t.form-field input[type=\"text\"],\n\t.form-field input[type=\"email\"],\n\t.form-field input[type=\"password\"],\n\t.form-field select,\n\t.form-field textarea {\n\t\twidth: 99%;\n\t}\n\n\t.form-wrap .form-field {\n\t\tpadding:0;\n\t}\n\n\t/* users */\n\t#profile-page .form-table textarea {\n\t\tmax-width: 400px;\n\t\twidth: auto;\n\t}\n}\n\n@media only screen and (max-height: 480px) {\n\t/*  Request Credentials */\n\t.request-filesystem-credentials-dialog .notification-dialog{\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmax-height: 100%;\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tmargin: 0;\n\t\tright: 0;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t/* Color Picker Options */\n\t.color-option {\n\t\twidth: 49%;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/forms.css",
    "content": "/* Include margin and padding in the width calculation of input and textarea. */\ninput,\ntextarea {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"checkbox\"],\ninput[type=\"color\"],\ninput[type=\"date\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"email\"],\ninput[type=\"month\"],\ninput[type=\"number\"],\ninput[type=\"password\"],\ninput[type=\"search\"],\ninput[type=\"radio\"],\ninput[type=\"tel\"],\ninput[type=\"text\"],\ninput[type=\"time\"],\ninput[type=\"url\"],\ninput[type=\"week\"],\nselect,\ntextarea {\n\tborder: 1px solid #ddd;\n\t-webkit-box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 );\n\tbox-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 );\n\tbackground-color: #fff;\n\tcolor: #32373c;\n\toutline: none;\n\t-webkit-transition: 0.05s border-color ease-in-out;\n\ttransition: 0.05s border-color ease-in-out;\n}\n\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"color\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"checkbox\"]:focus,\ninput[type=\"radio\"]:focus,\nselect:focus,\ntextarea:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 2px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow: 0 0 2px rgba( 30, 140, 190, 0.8 );\n}\n\n/* rtl:ignore */\ninput[type=\"email\"],\ninput[type=\"url\"] {\n\tdirection: ltr;\n}\n\n/* Vertically align the number selector with the input. */\ninput[type=\"number\"] {\n\tline-height: inherit;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\tborder: 1px solid #b4b9be;\n\tbackground: #fff;\n\tcolor: #555;\n\tclear: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n\tline-height: 0;\n\theight: 16px;\n\tmargin: -4px 4px 0 0;\n\toutline: 0;\n\tpadding: 0 !important;\n\ttext-align: center;\n\tvertical-align: middle;\n\twidth: 16px;\n\tmin-width: 16px;\n\t-webkit-appearance: none;\n\t-webkit-box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.1 );\n\t-webkit-transition: .05s border-color ease-in-out;\n\ttransition: .05s border-color ease-in-out;\n}\n\ninput[type=\"radio\"]:checked + label:before {\n\tcolor: #82878c;\n}\n\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active {\n\tcolor: #00a0d2;\n}\n\ntd > input[type=\"checkbox\"],\n.wp-admin p input[type=\"checkbox\"],\n.wp-admin p input[type=\"radio\"] {\n\tmargin-top: 0;\n}\n\n.wp-admin p label input[type=\"checkbox\"] {\n\tmargin-top: -4px;\n}\n\n.wp-admin p label input[type=\"radio\"] {\n\tmargin-top: -2px;\n}\n\ninput[type=\"radio\"] {\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tmargin-right: 4px;\n\tline-height: 10px;\n}\n\ninput[type=\"checkbox\"]:checked:before,\ninput[type=\"radio\"]:checked:before {\n\tfloat: left;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\twidth: 16px;\n\tfont: normal 21px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\ninput[type=\"checkbox\"]:checked:before {\n\tcontent: \"\\f147\";\n\tmargin: -3px 0 0 -4px;\n\tcolor: #1e8cbe;\n}\n\ninput[type=\"radio\"]:checked:before {\n\tcontent: \"\\2022\";\n\ttext-indent: -9999px;\n\t-webkit-border-radius: 50px;\n\tborder-radius: 50px;\n\tfont-size: 24px;\n\twidth: 6px;\n\theight: 6px;\n\tmargin: 4px;\n\tline-height: 16px;\n\tbackground-color: #1e8cbe;\n}\n\n@-moz-document url-prefix() {\n\tinput[type=\"checkbox\"],\n\tinput[type=\"radio\"],\n\t.form-table input.tog {\n\t\tmargin-bottom: -1px;\n\t}\n}\n\n/* Search */\ninput[type=\"search\"] {\n\t-webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration {\n\tdisplay: none;\n}\n\n.ie8 input[type=\"password\"] {\n\tfont-family: sans-serif;\n}\n\ntextarea,\ninput,\nselect,\nbutton {\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tfont-weight: inherit;\n}\n\ntextarea,\ninput,\nselect {\n\tfont-size: 14px;\n\tpadding: 3px 5px;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0; /* Reset mobile webkit's default element styling */\n}\n\ntextarea {\n\toverflow: auto;\n\tpadding: 2px 6px;\n\tline-height: 1.4;\n\tresize: vertical;\n}\n\n.wp-admin input[type=\"file\"] {\n\tpadding: 3px 0;\n}\n\nlabel {\n\tcursor: pointer;\n}\n\ninput,\nselect {\n\tmargin: 1px;\n\tpadding: 3px 5px;\n}\n\ninput.code {\n\tpadding-top: 6px;\n}\n\ntextarea.code {\n\tline-height: 1.4;\n\tpadding: 4px 6px 1px 6px;\n}\n\ninput.readonly,\ninput[readonly],\ntextarea.readonly,\ntextarea[readonly] {\n\tbackground-color: #eee;\n}\n\n:-moz-placeholder,\n.wp-core-ui :-moz-placeholder {\n   color: #a9a9a9;\n}\n\n.form-invalid input, .form-invalid input:focus,\n.form-invalid select, .form-invalid select:focus {\n\tborder-color: #dc3232 !important;\n\t-webkit-box-shadow: 0 0 2px rgba( 204, 0, 0, 0.8 );\n \tbox-shadow: 0 0 2px rgba( 204, 0, 0, 0.8 );\n}\n\n.form-table .form-required.form-invalid td:after {\n\tcontent: \"\\f534\";\n\tfont: normal 20px/1 dashicons;\n\tcolor: #dc3232;\n\tmargin-left: -25px;\n\tvertical-align: middle;\n}\n\n/* Adjust error indicator for password layout */\n.form-table .form-required.user-pass1-wrap.form-invalid td:after {\n\tcontent: '';\n}\n\n.form-table .form-required.user-pass1-wrap.form-invalid .password-input-wrapper:after {\n\tcontent: '\\f534';\n\tfont: normal 20px/1 dashicons;\n\tcolor: #dc3232;\n\tmargin: 0 6px 0 -29px;\n\tvertical-align: middle;\n}\n\n.form-input-tip {\n\tcolor: #666;\n}\n\ninput:disabled,\ninput.disabled,\nselect:disabled,\nselect.disabled,\ntextarea:disabled,\ntextarea.disabled {\n\tbackground: rgba( 255, 255, 255, 0.5 );\n\tborder-color: rgba( 222, 222, 222, 0.75 );\n\t-webkit-box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.04 );\n\tbox-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.04 );\n\tcolor: rgba( 51, 51, 51, 0.5 );\n}\n\ninput[type=\"file\"]:disabled,\ninput[type=\"file\"].disabled,\ninput[type=\"range\"]:disabled,\ninput[type=\"range\"].disabled {\n\tbackground: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\ninput[type=\"checkbox\"]:disabled,\ninput[type=\"checkbox\"].disabled,\ninput[type=\"radio\"]:disabled,\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"]:disabled:checked:before,\ninput[type=\"checkbox\"].disabled:checked:before,\ninput[type=\"radio\"]:disabled:checked:before,\ninput[type=\"radio\"].disabled:checked:before {\n\topacity: 0.7;\n}\n\n/*------------------------------------------------------------------------------\n  2.0 - Forms\n------------------------------------------------------------------------------*/\n\n\n.wp-admin select {\n\tpadding: 2px;\n\tline-height: 28px;\n\theight: 28px;\n\tvertical-align: middle;\n}\n\n.wp-admin .button-cancel {\n\tpadding: 0 5px;\n\tline-height: 2;\n}\n\n.meta-box-sortables select {\n\tmax-width: 100%;\n}\n\n.wp-admin select[multiple] {\n\theight: auto;\n}\n\n.submit {\n\tpadding: 1.5em 0;\n\tmargin: 5px 0;\n\t-webkit-border-bottom-left-radius: 3px;\n\tborder-bottom-left-radius: 3px;\n\t-webkit-border-bottom-right-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n\tborder: none;\n}\n\nform p.submit a.cancel:hover {\n\ttext-decoration: none;\n}\n\np.submit {\n\ttext-align: left;\n\tmax-width: 100%;\n\tmargin-top: 20px;\n\tpadding-top: 10px;\n}\n\n.textright p.submit {\n\tborder: none;\n\ttext-align: right;\n}\n\ntable.form-table + p.submit,\ntable.form-table + input + p.submit,\ntable.form-table + input + input + p.submit {\n\tborder-top: none;\n\tpadding-top: 0;\n}\n\n#minor-publishing-actions input,\n#major-publishing-actions input,\n#minor-publishing-actions .preview {\n\ttext-align: center;\n}\n\ntextarea.all-options,\ninput.all-options {\n\twidth: 250px;\n}\n\ninput.large-text,\ntextarea.large-text {\n\twidth: 99%;\n}\n\ninput.regular-text {\n\twidth: 25em;\n}\n\ninput.small-text {\n\twidth: 50px;\n\tpadding: 1px 6px;\n}\n\ninput[type=\"number\"].small-text {\n\twidth: 65px;\n}\n\ninput.tiny-text {\n\twidth: 35px;\n}\n\ninput[type=\"number\"].tiny-text {\n\twidth: 45px;\n}\n\n#doaction,\n#doaction2,\n#post-query-submit {\n\tmargin: 1px 8px 0 0;\n}\n\n.tablenav #changeit,\n.tablenav #delete_all,\n.tablenav #clear-recent-list,\n.wp-filter #delete_all {\n\tmargin-top: 1px;\n}\n\n.tablenav .actions select {\n\tfloat: left;\n\tmargin-right: 6px;\n\tmax-width: 200px;\n}\n\n.ie8 .tablenav .actions select {\n\twidth: 155px;\n}\n\n.ie8 .tablenav .actions select#cat {\n\twidth: 200px;\n}\n\n#timezone_string option {\n\tmargin-left: 1em;\n}\n\n#upload-form label {\n\tcolor: #777;\n}\n\nbutton.wp-hide-pw > .dashicons {\n\tposition: relative;\n\ttop: 3px;\n}\n\nlabel,\n#your-profile label + a {\n\tvertical-align: middle;\n}\n\nfieldset label,\n#your-profile label + a {\n\tvertical-align: middle;\n}\n\n.options-media-php label[for*=\"_size_\"],\n#misc-publishing-actions label {\n\tvertical-align: baseline;\n}\n\n#misc-publishing-actions label[for=\"post_status\"]:before {\n\tcontent: \"\\f173\";\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tleft: -1px;\n\tpadding: 0 5px 0 0;\n\tposition: relative;\n\ttop: 0;\n\ttext-decoration: none !important;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#pass-strength-result {\n\tbackground-color: #eee;\n\tborder: 1px solid #ddd;\n\tcolor: #23282d;\n\tmargin: -2px 5px 5px 1px;\n\tpadding: 3px 5px;\n\ttext-align: center;\n\twidth: 25em;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\topacity: 0;\n}\n\n#pass-strength-result.short {\n\tbackground-color: #f1adad;\n\tborder-color: #e35b5b;\n\topacity: 1;\n}\n\n#pass-strength-result.bad {\n\tbackground-color: #fbc5a9;\n\tborder-color: #f78b53;\n\topacity: 1;\n}\n\n#pass-strength-result.good {\n\tbackground-color: #ffe399;\n\tborder-color: #ffc733;\n\topacity: 1;\n}\n\n#pass-strength-result.strong {\n\tbackground-color: #c1e1b9;\n\tborder-color: #83c373;\n\topacity: 1;\n}\n\n#pass1.short, #pass1-text.short {\n\tborder-color: #e35b5b;\n}\n\n#pass1.bad, #pass1-text.bad {\n\tborder-color: #f78b53;\n}\n\n#pass1.good, #pass1-text.good {\n\tborder-color: #ffc733;\n}\n\n#pass1.strong, #pass1-text.strong {\n\tborder-color: #83c373;\n}\n\n.pw-weak {\n\tdisplay:none;\n}\n\n.indicator-hint {\n\tpadding-top: 8px;\n}\n\n#pass1-text,\n.show-password #pass1 {\n\tdisplay: none;\n}\n\n.show-password #pass1-text\n{\n\tdisplay: inline-block;\n}\n\n.form-table span.description.important {\n\tfont-size: 12px;\n}\n\np.search-box {\n\tfloat: right;\n\tmargin: 0;\n}\n\n.network-admin.themes-php p.search-box {\n\tclear: left;\n}\n\n.search-box input[name=\"s\"],\n.tablenav .search-plugins input[name=\"s\"],\n.tagsdiv .newtag {\n\tfloat: left;\n\theight: 28px;\n\tmargin: 0 4px 0 0;\n}\n\ninput[type=\"text\"].ui-autocomplete-loading,\ninput[type=\"email\"].ui-autocomplete-loading {\n\tbackground-image: url(../images/loading.gif);\n\tbackground-repeat: no-repeat;\n\tbackground-position: right center;\n\tvisibility: visible;\n}\n\ninput.ui-autocomplete-input.open {\n\tborder-bottom-color: transparent;\n}\n\nul#add-to-blog-users {\n\tmargin: 0 0 0 14px;\n}\n\n.ui-autocomplete {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style: none;\n\tposition: absolute;\n\tz-index: 10000;\n\tborder: 1px solid #5b9dd9;\n\t-webkit-box-shadow: 0 1px 2px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow: 0 1px 2px rgba( 30, 140, 190, 0.8 );\n\tbackground-color: #fff;\n}\n\n.ui-autocomplete li {\n\tmargin-bottom: 0;\n\tpadding: 4px 10px;\n\twhite-space: nowrap;\n\ttext-align: left;\n}\n\n.ui-autocomplete li.ui-state-focus {\n\tbackground-color: #ddd;\n\tcursor: pointer;\n}\n\n/*------------------------------------------------------------------------------\n  15.0 - Comments Screen\n------------------------------------------------------------------------------*/\n\n.form-table {\n\tborder-collapse: collapse;\n\tmargin-top: 0.5em;\n\twidth: 100%;\n\tclear: both;\n}\n\n.form-table,\n.form-table td,\n.form-table th,\n.form-table td p,\n.form-wrap label {\n\tfont-size: 14px;\n}\n\n.form-table td {\n\tmargin-bottom: 9px;\n\tpadding: 15px 10px;\n\tline-height: 1.3;\n\tvertical-align: middle;\n}\n\n.form-table th,\n.form-wrap label {\n\tcolor: #23282d;\n\tfont-weight: normal;\n\ttext-shadow: none;\n\tvertical-align: baseline;\n}\n\n.form-table th {\n\tvertical-align: top;\n\ttext-align: left;\n\tpadding: 20px 10px 20px 0;\n\twidth: 200px;\n\tline-height: 1.3;\n\tfont-weight: 600;\n}\n\n.form-table th.th-full {\n\twidth: auto;\n\tfont-weight: 400;\n}\n\n.form-table td p {\n\tmargin-top: 4px;\n\tmargin-bottom: 0;\n}\n\n.form-table td fieldset label {\n\tmargin: 0.25em 0 0.5em !important;\n\tdisplay: inline-block;\n}\n\n.form-table td fieldset label,\n.form-table td fieldset p,\n.form-table td fieldset li {\n\tline-height: 1.4em;\n}\n\n.form-table input.tog,\n.form-table input[type=\"radio\"] {\n\tmargin-top: -4px;\n\tmargin-right: 4px;\n\tfloat: none;\n}\n\n.form-table .pre {\n\tpadding: 8px;\n\tmargin: 0;\n}\n\ntable.form-table td .updated {\n\tfont-size: 13px;\n}\n\ntable.form-table td .updated p {\n\tfont-size: 13px;\n\tmargin: 0.3em 0;\n}\n\n/*------------------------------------------------------------------------------\n  18.0 - Users\n------------------------------------------------------------------------------*/\n\n#profile-page .form-table textarea {\n\twidth: 500px;\n\tmargin-bottom: 6px;\n}\n\n#profile-page .form-table #rich_editing {\n\tmargin-right: 5px\n}\n\n#your-profile legend {\n\tfont-size: 22px;\n}\n\n#display_name {\n\twidth: 15em;\n}\n\n#adduser .form-field input,\n#createuser .form-field input {\n\twidth: 25em;\n}\n\n.color-option {\n\tdisplay: inline-block;\n\twidth: 24%;\n\tpadding: 5px 15px 15px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 3px;\n}\n\n.color-option:hover,\n.color-option.selected {\n\tbackground: #ddd;\n}\n\n.color-palette {\n\twidth: 100%;\n\tborder-spacing: 0;\n\tborder-collapse: collapse;\n}\n.color-palette td {\n\theight: 20px;\n\tpadding: 0;\n\tborder: none;\n}\n\n.color-option {\n\tcursor: pointer;\n}\n\n/*------------------------------------------------------------------------------\n  19.0 - Tools\n------------------------------------------------------------------------------*/\n\n.tool-box .title {\n\tmargin: 8px 0;\n\tfont-size: 18px;\n\tfont-weight: normal;\n\tline-height: 24px;\n}\n\n.label-responsive {\n\tvertical-align: middle;\n}\n\n#export-filters p {\n\tmargin: 0 0 1em;\n}\n\n#export-filters p.submit {\n\tmargin: 7px 0 5px;\n}\n\n/* Card styles */\n\n.card {\n\tposition: relative;\n\tmargin-top: 20px;\n\tpadding: 0.7em 2em 1em;\n\tmin-width: 255px;\n\tmax-width: 520px;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbackground: #fff;\n}\n\n/* Press this styles */\n\n.pressthis h4 {\n\tmargin: 2em 0 1em;\n}\n\n.pressthis textarea {\n\twidth: 100%;\n\tfont-size: 1em;\n}\n\n#pressthis-code-wrap {\n\toverflow: auto;\n}\n\n.pressthis-bookmarklet-wrapper {\n\tmargin: 20px 0 8px;\n\tvertical-align: top;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.pressthis-bookmarklet,\n.pressthis-bookmarklet:hover,\n.pressthis-bookmarklet:focus,\n.pressthis-bookmarklet:active {\n\tdisplay: inline-block;\n\tposition: relative;\n\tcursor: move;\n\tcolor: #32373c;\n\tbackground: #e6e6e6;\n\t-webkit-border-radius: 5px;\n\tborder-radius: 5px;\n\tborder: 1px solid #b4b4b4;\n\tfont-style: normal;\n\tline-height: 16px;\n\tfont-size: 14px;\n\ttext-decoration: none;\n}\n\n.pressthis-bookmarklet:active {\n\toutline: none;\n}\n\n.pressthis-bookmarklet:after {\n\tcontent: \"\";\n\twidth: 70%;\n\theight: 55%;\n\tz-index: -1;\n\tposition: absolute;\n\tright: 10px;\n\tbottom: 9px;\n\tbackground: transparent;\n\t-webkit-transform: skew(20deg) rotate(6deg);\n\t-ms-transform: skew(20deg) rotate(6deg);\n\ttransform: skew(20deg) rotate(6deg);\n\t-webkit-box-shadow: 0 10px 8px rgba(0, 0, 0, 0.6);\n\tbox-shadow: 0 10px 8px rgba(0, 0, 0, 0.6);\n}\n\n.pressthis-bookmarklet:hover:after {\n\t-webkit-transform: skew(20deg) rotate(9deg);\n\t-ms-transform: skew(20deg) rotate(9deg);\n\ttransform: skew(20deg) rotate(9deg);\n\t-webkit-box-shadow: 0 10px 8px rgba(0, 0, 0, 0.7);\n\tbox-shadow: 0 10px 8px rgba(0, 0, 0, 0.7);\n}\n\n.pressthis-bookmarklet span {\n\tdisplay: inline-block;\n\tmargin: 0px 0 0;\n\tpadding: 0px 12px 8px 9px;\n}\n\n.pressthis-bookmarklet span:before {\n\tcolor: #777;\n\tfont: normal 20px/1 dashicons;\n\tcontent: \"\\f157\";\n\tposition: relative;\n\tdisplay: inline-block;\n\ttop: 4px;\n\tmargin-right: 4px;\n}\n\n.pressthis-js-toggle {\n\tmargin-left: 10px;\n\tpadding: 0;\n\theight: auto;\n\tvertical-align: top;\n}\n\n.pressthis-js-toggle .dashicons {\n\tmargin: 5px 8px 6px 7px;\n\tcolor: #777;\n}\n\n/* to override the button class being applied */\n.pressthis-js-toggle.button.button {\n\tmargin-left: 10px;\n\tpadding: 0;\n\theight: auto;\n\tvertical-align: top;\n}\n\n.pressthis-js-toggle .dashicons {\n\tmargin: 5px 8px 6px 7px;\n\tcolor: #777;\n}\n\n/*------------------------------------------------------------------------------\n  20.0 - Settings\n------------------------------------------------------------------------------*/\n\n#utc-time, #local-time {\n\tpadding-left: 25px;\n\tfont-style: italic;\n}\n\n.defaultavatarpicker .avatar {\n\tmargin: 2px 0;\n\tvertical-align: middle;\n}\n\n.options-general-php input.small-text {\n\twidth: 56px;\n}\n\n.options-general-php .spinner {\n\tfloat: none;\n\tmargin: 0 3px;\n}\n\n.settings-php .language-install-spinner,\n.options-general-php .language-install-spinner {\n\tdisplay: inline-block;\n\tfloat: none;\n\tmargin: -3px 5px 0;\n\tvertical-align: middle;\n}\n\n/*------------------------------------------------------------------------------\n  21.0 - Network Admin\n------------------------------------------------------------------------------*/\n\n.setup-php textarea {\n\tmax-width: 100%;\n}\n\n.form-field #site-address {\n\tmax-width: 25em;\n}\n\n.form-field #domain {\n\tmax-width: 22em;\n}\n\n.form-field #site-title,\n.form-field #admin-email,\n.form-field #path,\n.form-field #blog_registered,\n.form-field #blog_last_updated {\n\tmax-width: 25em;\n}\n\n.form-field #path {\n\tmargin-bottom: 5px;\n}\n\n#search-users,\n#search-sites {\n\tmax-width: 100%;\n}\n\n/*------------------------------------------------------------------------------\n   Credentials check dialog for Install and Updates\n------------------------------------------------------------------------------*/\n\n.request-filesystem-credentials-dialog {\n\tdisplay: none;\n}\n\n.request-filesystem-credentials-dialog .notification-dialog {\n\ttop: 15%;\n\tmax-height: 85%;\n}\n\n.request-filesystem-credentials-dialog-content {\n\tmargin: 25px;\n}\n\n#request-filesystem-credentials-title {\n    font-size: 1.3em;\n    margin: 1em 0;\n}\n\n.request-filesystem-credentials-form legend {\n\tfont-size: 1em;\n\tpadding: 1.33em 0;\n\tfont-weight: 600;\n}\n\n.request-filesystem-credentials-form input[type=\"text\"],\n.request-filesystem-credentials-form input[type=\"password\"] {\n\tdisplay: block;\n}\n\n.request-filesystem-credentials-dialog input[type=\"text\"],\n.request-filesystem-credentials-dialog input[type=\"password\"] {\n\twidth: 100%;\n}\n\n.request-filesystem-credentials-form .field-title {\n\tfont-weight: 600;\n}\n\n.request-filesystem-credentials-dialog label[for=\"hostname\"],\n.request-filesystem-credentials-dialog label[for=\"public_key\"],\n.request-filesystem-credentials-dialog label[for=\"private_key\"] {\n\tdisplay: block;\n\tmargin-bottom: 1em;\n}\n\n.request-filesystem-credentials-dialog .ftp-username,\n.request-filesystem-credentials-dialog .ftp-password {\n\tfloat: left;\n\twidth: 48%;\n}\n\n.request-filesystem-credentials-dialog .ftp-password {\n\tmargin-left: 4%;\n}\n\n.request-filesystem-credentials-dialog .request-filesystem-credentials-action-buttons {\n\ttext-align: right;\n}\n\n.request-filesystem-credentials-dialog label[for=\"ftp\"] {\n\tmargin-right: 10px;\n}\n\n#request-filesystem-credentials-dialog .button:not(:last-child) {\n\tmargin-right: 10px;\n}\n\n#request-filesystem-credentials-form .cancel-button {\n\tdisplay: none;\n}\n\n#request-filesystem-credentials-dialog .cancel-button {\n\tdisplay: inline;\n}\n\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n@media screen and ( max-width: 782px ) {\n\t/* Input Elements */\n\ttextarea {\n\t\t-webkit-appearance: none;\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"search\"],\n\tinput[type=\"password\"],\n\tinput[type=\"number\"] {\n\t\t-webkit-appearance: none;\n\t\tpadding: 6px 10px;\n\t}\n\n\tinput.code {\n\t\tpadding-bottom: 5px;\n\t\tpadding-top: 10px;\n\t}\n\n\tinput[type=\"checkbox\"],\n\t.widefat th input[type=\"checkbox\"],\n\t.widefat thead td input[type=\"checkbox\"],\n\t.widefat tfoot td input[type=\"checkbox\"] {\n\t\t-webkit-appearance: none;\n\t\tpadding: 10px;\n\t}\n\n\t.widefat th input[type=\"checkbox\"],\n\t.widefat thead td input[type=\"checkbox\"],\n\t.widefat tfoot td input[type=\"checkbox\"] {\n\t\tmargin-bottom: 8px;\n\t}\n\n\tinput[type=\"checkbox\"]:checked:before,\n\t.widefat th input[type=\"checkbox\"]:before,\n\t.widefat thead td input[type=\"checkbox\"]:before,\n\t.widefat tfoot td input[type=\"checkbox\"]:before {\n\t\tfont: normal 30px/1 dashicons;\n\t\tmargin: -3px -5px;\n\t}\n\n\tinput[type=\"radio\"],\n\tinput[type=\"checkbox\"] {\n\t\theight: 25px;\n\t\twidth: 25px;\n\t}\n\n\t.wp-admin p input[type=\"checkbox\"],\n\t.wp-admin p input[type=\"radio\"] {\n\t\tmargin-top: -3px;\n\t}\n\n\tinput[type=\"radio\"]:checked:before {\n\t\tvertical-align: middle;\n\t\twidth: 9px;\n\t\theight: 9px;\n\t\tmargin: 7px;\n\t\tline-height: 16px;\n\t}\n\n\t.wp-upload-form input[type=\"submit\"] {\n\t\tmargin-top: 10px;\n\t}\n\n\t#wpbody select {\n\t\theight: 36px;\n\t\tfont-size: 16px;\n\t}\n\n\t.wp-admin .button-cancel {\n\t\tpadding: 0;\n\t\tfont-size: 14px;\n\t}\n\n\t#adduser .form-field input,\n\t#createuser .form-field input {\n\t\twidth: 100%;\n\t}\n\n\t.form-table {\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.form-table th,\n\t.form-table td,\n\t.label-responsive {\n\t\tdisplay: block;\n\t\twidth: auto;\n\t\tvertical-align: middle;\n\t}\n\n\t.label-responsive {\n\t\tmargin: 0.5em 0;\n\t}\n\n\t.export-filters li {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.form-table .color-palette td {\n\t\tdisplay: table-cell;\n\t\twidth: 15px;\n\t}\n\n\t.form-table table.color-palette {\n\t\tmargin-right: 10px;\n\t}\n\n\ttextarea,\n\tinput {\n\t\tfont-size: 16px;\n\t}\n\n\t.form-table td input[type=\"text\"],\n\t.form-table td input[type=\"email\"],\n\t.form-table td input[type=\"password\"],\n\t.form-table td select,\n\t.form-table td textarea,\n\t.form-table span.description,\n\t#profile-page .form-table textarea {\n\t\twidth: 100%;\n\t\tfont-size: 16px;\n\t\tline-height: 1.5;\n\t\tpadding: 7px 10px;\n\t\tdisplay: block;\n\t\tmax-width: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.form-table .form-required.form-invalid td:after {\n\t\tfloat: right;\n\t\tmargin: -30px 3px 0 0;\n\t}\n\n\t#wpbody .form-table td select {\n\t\theight: 40px;\n\t}\n\n\tinput[type=\"text\"].small-text,\n\tinput[type=\"search\"].small-text,\n\tinput[type=\"password\"].small-text,\n\tinput[type=\"number\"].small-text,\n\tinput[type=\"number\"].small-text,\n\t.form-table input[type=\"text\"].small-text {\n\t\twidth: auto;\n\t\tmax-width: 55px;\n\t\tdisplay: inline;\n\t\tpadding: 3px 6px;\n\t\tmargin: 0 3px;\n\t}\n\n\t#pass-strength-result {\n\t\twidth: 100%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tpadding: 8px;\n\t}\n\n\tp.search-box {\n\t\tfloat: none;\n\t\tposition: absolute;\n\t\tbottom: 0;\n\t\twidth: 98%;\n\t\theight: 90px;\n\t\tmargin-bottom: 20px;\n\t}\n\n\tp.search-box input[name=\"s\"] {\n\t\theight: auto;\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin-bottom: 10px;\n\t\tvertical-align: middle;\n\t\t-webkit-appearance: none;\n\t}\n\n\tp.search-box input[type=\"submit\"] {\n\t\tmargin-bottom: 10px;\n\t}\n\n\t.form-table span.description {\n\t\tdisplay: inline;\n\t\tpadding: 4px 0 0;\n\t\tline-height: 1.4em;\n\t\tfont-size: 14px;\n\t}\n\n\t.form-table th {\n\t\tpadding-top: 10px;\n\t\tpadding-bottom: 0;\n\t\tborder-bottom: 0;\n\t}\n\n\t.form-table td {\n\t\tmargin-bottom: 0;\n\t\tpadding-bottom: 6px;\n\t\tpadding-top: 4px;\n\t\tpadding-left: 0;\n\t}\n\n\t.form-table.permalink-structure td code {\n\t\tmargin-left: 32px;\n\t}\n\n\t.form-table.permalink-structure td input[type=\"text\"] {\n\t\tmargin-left: 32px;\n\t\tmargin-top: 4px;\n\t\twidth: 96%;\n\t}\n\n\t.form-table input.regular-text {\n\t\twidth: 100%;\n\t}\n\n\t.form-table label {\n\t\tfont-size: 14px;\n\t}\n\n\t.form-table fieldset label {\n\t\tdisplay: block;\n\t}\n\n\t#utc-time {\n\t\tmargin-top: 10px;\n\t}\n\n\t#utc-time,\n\t#local-time {\n\t\tdisplay: block;\n\t\tfloat: none;\n\t\tpadding: 0;\n\t\tline-height: 2;\n\t}\n\n\t.form-field #domain {\n\t\tmax-width: none;\n\t}\n\n\t/* New Password */\n\t.wp-pwd {\n\t\tposition: relative;\n\t}\n\n\t.wp-pwd [type=\"text\"],\n\t.wp-pwd [type=\"password\"] {\n\t\tpadding-right: 40px;\n\t}\n\n\t.wp-pwd button.button {\n\t\tbackground: transparent;\n\t\tborder: none;\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t\tline-height: 2;\n\t\tmargin: 0;\n\t\tpadding: 5px 10px;\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 0;\n\t}\n\n\t.wp-pwd button.button:hover,\n\t.wp-pwd button.button:focus,\n\t.wp-pwd button.button:active {\n\t\tbackground: transparent;\n\t}\n\n\t.wp-pwd .button .text {\n\t\tdisplay: none;\n\t}\n}\n\n@media only screen and (max-width: 768px) {\n\t.form-field input[type=\"text\"],\n\t.form-field input[type=\"email\"],\n\t.form-field input[type=\"password\"],\n\t.form-field select,\n\t.form-field textarea {\n\t\twidth: 99%;\n\t}\n\n\t.form-wrap .form-field {\n\t\tpadding:0;\n\t}\n\n\t/* users */\n\t#profile-page .form-table textarea {\n\t\tmax-width: 400px;\n\t\twidth: auto;\n\t}\n}\n\n@media only screen and (max-height: 480px) {\n\t/*  Request Credentials */\n\t.request-filesystem-credentials-dialog .notification-dialog{\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmax-height: 100%;\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tmargin: 0;\n\t\tleft: 0;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t/* Color Picker Options */\n\t.color-option {\n\t\twidth: 49%;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/ie-rtl.css",
    "content": "/* Fixes for IE 7 bugs */\n\n#dashboard-widgets form .input-text-wrap input,\n#dashboard-widgets form .textarea-wrap textarea {\n\twidth: 99%;\n}\n\n#dashboard-widgets form #title {\n\twidth: 98%;\n}\n\n#wpbody-content #dashboard-widgets .postbox-container {\n\twidth: 49.5%;\n}\n\n#wpbody-content #dashboard-widgets #postbox-container-2,\n#wpbody-content #dashboard-widgets #postbox-container-3,\n#wpbody-content #dashboard-widgets #postbox-container-4 {\n\tfloat: left;\n\twidth: 50.5%;\n}\n\n#dashboard-widgets #postbox-container-3 .empty-container,\n#dashboard-widgets #postbox-container-4 .empty-container {\n\tborder: 0 none;\n\theight: 0;\n\tmin-height: 0;\n}\n\n.wp-editor-wrap .wp-editor-tools,\n.wp-editor-wrap .wp-switch-editor,\n.wp-editor-wrap .wp-editor-tabs,\n.wp-editor-wrap .wp-editor-container {\n\tzoom: 100%;\n}\n\n.wp-editor-wrap .wp-editor-container textarea.wp-editor-area {\n\twidth: 97%;\n}\n\n#post-body.columns-2 #postbox-container-1 {\n\tpadding-right: 19px;\n}\n\n.welcome-panel .wp-badge {\n\tposition: absolute;\n}\n\n.welcome-panel .welcome-panel-column:first-child {\n\twidth: 35%;\n}\n\n#adminmenuback {\n\tright: 0;\n\tbackground-image: none;\n}\n\n#adminmenuwrap {\n\tposition: static;\n}\n\n#adminmenu {\n\tposition: relative;\n}\n\n#adminmenu,\n#adminmenu a {\n\tcursor: pointer;\n}\n\n#adminmenu li.wp-menu-separator,\n#adminmenu li.wp-menu-separator-last {\n\tfont-size: 1px;\n\tline-height: 1;\n}\n\n#adminmenu a.menu-top {\n\tborder-bottom: 0 none;\n\tborder-top: 1px solid #ddd;\n}\n\n#adminmenu .separator {\n\tfont-size: 1px;\n\tline-height: 1px;\n}\n\n#adminmenu .wp-submenu {\n\tright: 110px;\n}\n\n#adminmenu .wp-submenu ul {\n\tmargin: 0;\n}\n\n.folded #wpcontent,\n.folded #wpfooter {\n\tmargin-right: 170px;\n}\n\n.folded #adminmenuback,\n.folded #adminmenuwrap,\n.folded #adminmenu,\n.folded #adminmenu li.menu-top {\n\twidth: 150px;\n}\n\n.folded #adminmenu .wp-submenu {\n\tborder-top-color: transparent;\n}\n\n.folded #adminmenu .wp-menu-name {\n\tdisplay: block;\n}\n\n.folded #adminmenu .wp-submenu.sub-open,\n.folded #adminmenu .opensub .wp-submenu {\n\tright: 110px;\n}\n\n.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu {\n\ttop: -1px;\n\tposition: relative;\n}\n\n.folded #adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {\n\tbackground-color: transparent;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n\tborder-top-color: #ddd;\n}\n\n.folded #adminmenu .wp-submenu ul {\n\tmargin-right: 5px;\n}\n\n#adminmenu li.menu-top {\n\tmargin-bottom: -2px;\n}\n\n#adminmenu .wp-menu-arrow {\n\tdisplay: none !important;\n}\n\n.js.folded #adminmenu li.menu-top {\n\tdisplay: block;\n\tzoom: 100%;\n}\n\nul#adminmenu {\n\tz-index: 99;\n}\n\n#adminmenu li.menu-top a.menu-top {\n\tmin-width: auto;\n\twidth: auto;\n}\n\n#wpcontent #adminmenu li.wp-has-current-submenu a.wp-has-submenu {\n\tfont-style: normal;\n}\n\n#wpcontent #adminmenu .wp-submenu li {\n\tpadding: 0;\n}\n\n#adminmenu li.wp-has-current-submenu .wp-submenu {\n\tright: -40px;\n}\n\n#adminmenu .wp-menu-image {\n\tdisplay: none !important;\n}\n\n#adminmenu a.menu-top .wp-menu-name {\n\tpadding-right: 8px;\n}\n\n#collapse-menu {\n\tline-height: 23px;\n}\n\n#wpadminbar .ab-comments-icon {\n\tpadding-top: 7px;\n}\n\n\n.theme-browser .theme {\n\twidth: 30%;\n\tmargin: 0 0 4% 3%;\n\tcursor: auto;\n}\n\n.theme-browser .theme:hover,\n.theme-browser .theme:focus {\n\tcursor: auto;\n}\n\n.theme-browser .theme .theme-screenshot {\n\theight: 180px;\n}\n\n.theme-browser .theme .theme-actions {\n\tposition: static;\n\tbackground-color: #e8e8e8;\n}\n\n.theme-browser .theme .more-details {\n\tdisplay: none;\n}\n\n.plugins td,\n.plugins th {\n\tborder-top: 1px solid #ddd;\n}\n\ntable.fixed th,\ntable.fixed td {\n\tborder-top: 1px solid #ddd;\n}\n\n#wpbody-content input.button,\n#wpbody-content input.button-primary,\n#wpbody-content input.button-secondary {\n\toverflow: visible;\n}\n\n#dashboard-widgets h3 a {\n\theight: 14px;\n\tline-height: 14px;\n}\n\n#dashboard_browser_nag {\n\tcolor: #fff;\n}\n\n#dashboard_browser_nag .browser-icon {\n\tposition: relative;\n}\n\n.tablenav-pages .current-page {\n\tvertical-align: middle;\n}\n\n#wpbody-content .postbox {\n\tborder: 1px solid #dfdfdf;\n}\n\n#wpbody-content .postbox .hndle {\n\tmargin-bottom: -1px;\n}\n\n.major-publishing-actions,\n.wp-submenu,\n.wp-submenu li,\n#template,\n#template div,\n#editcat,\n#addcat {\n\tzoom: 100%;\n}\n\n.wp-menu-arrow {\n\theight: 28px;\n}\n\n.submitbox {\n\tmargin-top: 10px;\n}\n\n/* Inline Editor */\n#wpbody-content .quick-edit-row-post .inline-edit-col-left {\n\twidth: 39%;\n}\n\n#wpbody-content .inline-edit-row-post .inline-edit-col-center {\n\twidth: 19%;\n}\n\n#wpbody-content .quick-edit-row-page .inline-edit-col-left {\n\twidth: 49%;\n}\n\n#wpbody-content .bulk-edit-row .inline-edit-col-left {\n\twidth: 29%;\n}\n\n.inline-edit-row p.submit {\n\tzoom: 100%;\n}\n\n.inline-edit-row fieldset label span.title {\n\tdisplay: block;\n\tfloat: right;\n\twidth: 5em;\n}\n\n.inline-edit-row fieldset label span.input-text-wrap {\n\tmargin-right: 0;\n\tzoom: 100%;\n}\n\n#wpbody-content .inline-edit-row fieldset label span.input-text-wrap input {\n\tline-height: 130%;\n}\n\n#wpbody-content .inline-edit-row .input-text-wrap input {\n\twidth: 95%;\n}\n\n#wpbody-content .inline-edit-row .input-text-wrap input.inline-edit-password-input {\n\twidth: 8em;\n}\n/* end Inline Editor */\n\n#titlediv #title {\n\twidth: 98%;\n}\n\n.button,\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"submit\"] {\n\tpadding: 0 8px;\n\tline-height: 20px;\n\theight: auto;\n}\n\n.button.button-large,\ninput[type=\"reset\"].button-large,\ninput[type=\"button\"].button-large,\ninput[type=\"submit\"].button-large {\n\tpadding: 0 10px;\n\tline-height: 24px;\n\theight: auto;\n}\n\n.button.button-small,\ninput[type=\"reset\"].button-small,\ninput[type=\"button\"].button-small,\ninput[type=\"submit\"].button-small {\n\tpadding: 0 6px;\n\tline-height: 16px;\n\theight: auto;\n}\n\na.button {\n\tmargin: 1px;\n\tpadding: 1px 9px 2px;\n}\n\na.button.button-large {\n\tpadding: 1px 11px 2px;\n}\n\na.button.button-small {\n\tpadding: 1px 7px 2px;\n}\n\n#screen-options-wrap {\n\toverflow: hidden;\n}\n\n#the-comment-list .comment-item,\n#post-status-info,\n#wpwrap,\n#wrap,\n#postdivrich,\n#postdiv,\n#poststuff,\n.metabox-holder,\n#titlediv,\n#post-body,\n#editorcontainer,\n.tablenav,\n.widget-liquid-left,\n.widget-liquid-right,\n#widgets-left,\n.widgets-sortables,\n#dragHelper,\n.widget .widget-top,\n.widget-control-actions,\n.tagchecklist,\n#col-container,\n#col-left,\n#col-right,\n.fileedit-sub {\n\tdisplay: block;\n\tzoom: 100%;\n}\n\np.search-box {\n\tposition: static;\n\tfloat: left;\n\tmargin: -3px 0 4px;\n}\n\n#widget-list .widget {\n\tdisplay: inline;\n}\n\n#editorcontainer #content {\n\toverflow: auto;\n\tmargin: auto;\n\twidth: 98%;\n}\n\nform#template div {\n\twidth: 100%;\n}\n\n.wp-editor-container .quicktags-toolbar input {\n\toverflow: visible;\n\tpadding: 0 4px;\n}\n\n#poststuff h2 {\n\tfont-size: 1.6em;\n}\n\n#poststuff .inside #parent_id,\n#poststuff .inside #page_template,\n.inline-edit-row #post_parent,\n.inline-edit-row select[name=\"page_template\"] {\n\twidth: 250px;\n}\n\n#submitdiv input,\n#submitdiv select,\n#submitdiv a.button {\n\tposition: relative;\n}\n\n#bh {\n\tmargin: 7px 0 0 10px;\n\tfloat: left;\n}\n\n/* without this dashboard widgets appear in one column for some screen widths */\ndiv#dashboard-widgets {\n\tpadding-left: 1px;\n}\n\n.tagchecklist span, .tagchecklist span a {\n\tdisplay: inline-block;\n\tdisplay: block;\n}\n\n.tablenav .button-secondary,\n.nav .button-secondary {\n\tpadding-top: 2px;\n\tpadding-bottom: 2px;\n}\n\n.tablenav select {\n\tfont-size: 13px;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tmargin-top: 2px;\n}\n\n.tablenav .actions select {\n\twidth: 155px;\n}\n\n.subsubsub li {\n\tdisplay: inline;\n}\n\na.post-state-format {\n\ttext-indent: 0;\n\tline-height: 0;\n\tfont-size: 0;\n}\n\ntable.ie-fixed {\n\ttable-layout: fixed;\n}\n\n.widefat tr,\n.widefat th,\n.widefat thead td,\n.widefat tfoot td {\n\tmargin-bottom: 0;\n\tborder-spacing: 0;\n}\n\n.widefat th input,\n.widefat thead td input,\n.widefat tfoot td input {\n\tmargin: 0 5px 0 0;\n}\n\n.widefat thead .check-column,\n.widefat tfoot .check-column {\n\tpadding-top: 6px;\n}\n\n.widefat tbody th.check-column,\n.media.widefat tbody th.check-column {\n\tpadding: 4px 0 0;\n}\n\n.widefat {\n\tempty-cells: show;\n\tborder-collapse: collapse;\n}\n\n.tablenav a.button-secondary {\n\tdisplay: inline-block;\n\tpadding: 2px 5px;\n}\n\n.inactive-sidebar .widgets-sortables {\n\tpadding-bottom: 8px;\n}\n\n#available-widgets .widget-holder {\n\tpadding-bottom: 65px;\n}\n\n#widgets-left .inactive {\n\tpadding-bottom: 10px;\n}\n\n.widget-liquid-right .widget,\n.inactive-sidebar .widget {\n\tposition: relative;\n}\n\n.inactive-sidebar .widget {\n\tdisplay: block;\n\tfloat: right;\n}\n\n#wpcontent .button-primary-disabled {\n\tcolor: #9FD0D5;\n\tbackground: #298CBA;\n}\n\n#the-comment-list .unapproved tr,\n#the-comment-list .unapproved td {\n\tbackground-color: #ffffe0;\n}\n\n.imgedit-submit {\n\twidth: 300px;\n}\n\n#nav-menus-frame,\n#wpbody,\n.menu li {\n\tzoom: 100%;\n}\n\n#update-nav-menu #post-body {\n\toverflow:hidden;\n}\n\n.menu li {\n\tmin-width: 100%;\n}\n\n.menu li.sortable-placeholder {\n\tmin-width: 400px;\n}\n\n.available-theme {\n\tdisplay: inline;\n}\n\n.available-theme ul {\n\tmargin: 0;\n}\n\n.available-theme .action-links li {\n\tpadding-left: 7px;\n\tmargin-left: 7px;\n}\n\n.about-wrap .three-col.about-updates .col-2 {\n\twidth: 15%;\n}\n\n.about-wrap .about-password-meter input {\n\twidth: 98%;\n}\n\n.revisions-tickmarks,\n.revisions-tooltip {\n\tdisplay: none !important;\n}\n\n.revisions.pinned .revisions-controls {\n\tposition: relative;\n}\n\ninput[type=\"password\"],\n.login form .input {\n\tfont-family: sans-serif;\n}\n\n/* TinyMCE icons */\n.mce-btn i.mce-i-bold,\n.mce-btn i.mce-i-italic,\n.mce-btn i.mce-i-bullist,\n.mce-btn i.mce-i-numlist,\n.mce-btn i.mce-i-blockquote,\n.mce-btn i.mce-i-alignleft,\n.mce-btn i.mce-i-aligncenter,\n.mce-btn i.mce-i-alignright,\n.mce-btn i.mce-i-link,\n.mce-btn i.mce-i-unlink,\n.mce-btn i.mce-i-wp_more,\n.mce-btn i.mce-i-strikethrough,\n.mce-btn i.mce-i-spellchecker,\n.mce-btn i.mce-i-fullscreen,\n.mce-btn i.mce-i-wp_fullscreen,\n.mce-btn i.mce-i-wp_adv,\n.mce-btn i.mce-i-underline,\n.mce-btn i.mce-i-alignjustify,\n.mce-btn i.mce-i-forecolor,\n.mce-btn i.mce-i-pastetext,\n.mce-btn i.mce-i-pasteword,\n.mce-btn i.mce-i-removeformat,\n.mce-btn i.mce-i-charmap,\n.mce-btn i.mce-i-outdent,\n.mce-btn i.mce-i-indent,\n.mce-btn i.mce-i-undo,\n.mce-btn i.mce-i-redo,\n.mce-btn i.mce-i-help,\n.mce-btn i.mce-i-wp_help,\n.mce-btn i.mce-i-wp-media-library,\n.mce-btn i.mce-i-ltr,\n.mce-btn i.mce-i-wp_page,\n.mce-btn i.mce-i-hr,\n.mce-close {\n\tfont-family: 'tinymce', Arial;\n\tfont-style: normal;\n\tfont-weight: normal;\n\tfont-variant: normal;\n\tfont-size: 16px;\n\tmargin-right: 0;\n\tpadding-left: 0;\n}\n\n.mce-btn i.mce-i-wp_fullscreen,\n.qt-fullscreen {\n\t-ie7-icon: '\\e023';\n}\n\n.mce-btn i.mce-i-wp_more,\n.mce-btn i.mce-i-wp_page {\n\t-ie7-icon: '\\e027';\n}\n\n.mce-btn i.mce-i-wp_adv {\n\tbackground-color: #a0a5aa;\n}\n\n.mce-btn i.mce-i-help,\n.mce-btn i.mce-i-wp_help {\n\t-ie7-icon: '\\e016';\n}\n\n\n/* IE6 leftovers */\n* html .row-actions {\n\tvisibility: visible;\n}\n\n* html div.widget-liquid-left,\n* html div.widget-liquid-right {\n\tdisplay: block;\n\tposition: relative;\n}\n\n* html #editorcontainer {\n\tpadding: 0;\n}\n\n* html #poststuff h2 {\n\tmargin-right: 0;\n}\n\n* html .stuffbox,\n* html .stuffbox input,\n* html .stuffbox textarea {\n\tborder: 1px solid #DFDFDF;\n}\n\n* html div.widget-liquid-left {\n\twidth: 99%;\n}\n\n* html .widgets-sortables {\n\theight: 50px;\n}\n\n* html a#content_resize {\n\tleft: -2px;\n}\n\n* html .widget-title h4 {\n\twidth: 205px;\n}\n\n* html #removing-widget .in-widget-title {\n\tdisplay: none;\n}\n\n* html .media-item .pinkynail {\n\theight: 32px;\n\twidth: 40px;\n}\n\n* html .describe .field input.text,\n* html .describe .field textarea {\n\twidth: 440px;\n}\n\n* html input {\n\tborder: 1px solid #dfdfdf;\n}\n\n* html .edit-box {\n\tdisplay: inline;\n}\n\n* html .postbox-container .meta-box-sortables {\n\theight: 300px;\n}\n\n* html #wpbody-content #screen-options-link-wrap {\n\tdisplay: inline-block;\n\twidth: 150px;\n\ttext-align: center;\n}\n\n* html #wpbody-content #contextual-help-link-wrap {\n\tdisplay: inline-block;\n\twidth: 100px;\n\ttext-align: center;\n}\n\n* html #adminmenu {\n\tmargin-right: -80px;\n}\n\n* html .folded #adminmenu {\n\tmargin-right: -22px;\n}\n\n* html #wpcontent #adminmenu li.menu-top {\n\tdisplay: inline;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n* html #wpfooter {\n\tmargin: 0;\n}\n\n* html #adminmenu div.wp-menu-image {\n\theight: 29px;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/ie.css",
    "content": "/* Fixes for IE 7 bugs */\n\n#dashboard-widgets form .input-text-wrap input,\n#dashboard-widgets form .textarea-wrap textarea {\n\twidth: 99%;\n}\n\n#dashboard-widgets form #title {\n\twidth: 98%;\n}\n\n#wpbody-content #dashboard-widgets .postbox-container {\n\twidth: 49.5%;\n}\n\n#wpbody-content #dashboard-widgets #postbox-container-2,\n#wpbody-content #dashboard-widgets #postbox-container-3,\n#wpbody-content #dashboard-widgets #postbox-container-4 {\n\tfloat: right;\n\twidth: 50.5%;\n}\n\n#dashboard-widgets #postbox-container-3 .empty-container,\n#dashboard-widgets #postbox-container-4 .empty-container {\n\tborder: 0 none;\n\theight: 0;\n\tmin-height: 0;\n}\n\n.wp-editor-wrap .wp-editor-tools,\n.wp-editor-wrap .wp-switch-editor,\n.wp-editor-wrap .wp-editor-tabs,\n.wp-editor-wrap .wp-editor-container {\n\tzoom: 100%;\n}\n\n.wp-editor-wrap .wp-editor-container textarea.wp-editor-area {\n\twidth: 97%;\n}\n\n#post-body.columns-2 #postbox-container-1 {\n\tpadding-left: 19px;\n}\n\n.welcome-panel .wp-badge {\n\tposition: absolute;\n}\n\n.welcome-panel .welcome-panel-column:first-child {\n\twidth: 35%;\n}\n\n#adminmenuback {\n\tleft: 0;\n\tbackground-image: none;\n}\n\n#adminmenuwrap {\n\tposition: static;\n}\n\n#adminmenu {\n\tposition: relative;\n}\n\n#adminmenu,\n#adminmenu a {\n\tcursor: pointer;\n}\n\n#adminmenu li.wp-menu-separator,\n#adminmenu li.wp-menu-separator-last {\n\tfont-size: 1px;\n\tline-height: 1;\n}\n\n#adminmenu a.menu-top {\n\tborder-bottom: 0 none;\n\tborder-top: 1px solid #ddd;\n}\n\n#adminmenu .separator {\n\tfont-size: 1px;\n\tline-height: 1px;\n}\n\n#adminmenu .wp-submenu {\n\tleft: 110px;\n}\n\n#adminmenu .wp-submenu ul {\n\tmargin: 0;\n}\n\n.folded #wpcontent,\n.folded #wpfooter {\n\tmargin-left: 170px;\n}\n\n.folded #adminmenuback,\n.folded #adminmenuwrap,\n.folded #adminmenu,\n.folded #adminmenu li.menu-top {\n\twidth: 150px;\n}\n\n.folded #adminmenu .wp-submenu {\n\tborder-top-color: transparent;\n}\n\n.folded #adminmenu .wp-menu-name {\n\tdisplay: block;\n}\n\n.folded #adminmenu .wp-submenu.sub-open,\n.folded #adminmenu .opensub .wp-submenu {\n\tleft: 110px;\n}\n\n.folded #adminmenu a.wp-has-current-submenu:focus + .wp-submenu,\n.folded #adminmenu .wp-has-current-submenu .wp-submenu {\n\ttop: -1px;\n\tposition: relative;\n}\n\n.folded #adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {\n\tbackground-color: transparent;\n}\n\n#adminmenu .wp-submenu .wp-submenu-head {\n\tborder-top-color: #ddd;\n}\n\n.folded #adminmenu .wp-submenu ul {\n\tmargin-left: 5px;\n}\n\n#adminmenu li.menu-top {\n\tmargin-bottom: -2px;\n}\n\n#adminmenu .wp-menu-arrow {\n\tdisplay: none !important;\n}\n\n.js.folded #adminmenu li.menu-top {\n\tdisplay: block;\n\tzoom: 100%;\n}\n\nul#adminmenu {\n\tz-index: 99;\n}\n\n#adminmenu li.menu-top a.menu-top {\n\tmin-width: auto;\n\twidth: auto;\n}\n\n#wpcontent #adminmenu li.wp-has-current-submenu a.wp-has-submenu {\n\tfont-style: normal;\n}\n\n#wpcontent #adminmenu .wp-submenu li {\n\tpadding: 0;\n}\n\n#adminmenu li.wp-has-current-submenu .wp-submenu {\n\tleft: -40px;\n}\n\n#adminmenu .wp-menu-image {\n\tdisplay: none !important;\n}\n\n#adminmenu a.menu-top .wp-menu-name {\n\tpadding-left: 8px;\n}\n\n#collapse-menu {\n\tline-height: 23px;\n}\n\n#wpadminbar .ab-comments-icon {\n\tpadding-top: 7px;\n}\n\n\n.theme-browser .theme {\n\twidth: 30%;\n\tmargin: 0 3% 4% 0;\n\tcursor: auto;\n}\n\n.theme-browser .theme:hover,\n.theme-browser .theme:focus {\n\tcursor: auto;\n}\n\n.theme-browser .theme .theme-screenshot {\n\theight: 180px;\n}\n\n.theme-browser .theme .theme-actions {\n\tposition: static;\n\tbackground-color: #e8e8e8;\n}\n\n.theme-browser .theme .more-details {\n\tdisplay: none;\n}\n\n.plugins td,\n.plugins th {\n\tborder-top: 1px solid #ddd;\n}\n\ntable.fixed th,\ntable.fixed td {\n\tborder-top: 1px solid #ddd;\n}\n\n#wpbody-content input.button,\n#wpbody-content input.button-primary,\n#wpbody-content input.button-secondary {\n\toverflow: visible;\n}\n\n#dashboard-widgets h3 a {\n\theight: 14px;\n\tline-height: 14px;\n}\n\n#dashboard_browser_nag {\n\tcolor: #fff;\n}\n\n#dashboard_browser_nag .browser-icon {\n\tposition: relative;\n}\n\n.tablenav-pages .current-page {\n\tvertical-align: middle;\n}\n\n#wpbody-content .postbox {\n\tborder: 1px solid #dfdfdf;\n}\n\n#wpbody-content .postbox .hndle {\n\tmargin-bottom: -1px;\n}\n\n.major-publishing-actions,\n.wp-submenu,\n.wp-submenu li,\n#template,\n#template div,\n#editcat,\n#addcat {\n\tzoom: 100%;\n}\n\n.wp-menu-arrow {\n\theight: 28px;\n}\n\n.submitbox {\n\tmargin-top: 10px;\n}\n\n/* Inline Editor */\n#wpbody-content .quick-edit-row-post .inline-edit-col-left {\n\twidth: 39%;\n}\n\n#wpbody-content .inline-edit-row-post .inline-edit-col-center {\n\twidth: 19%;\n}\n\n#wpbody-content .quick-edit-row-page .inline-edit-col-left {\n\twidth: 49%;\n}\n\n#wpbody-content .bulk-edit-row .inline-edit-col-left {\n\twidth: 29%;\n}\n\n.inline-edit-row p.submit {\n\tzoom: 100%;\n}\n\n.inline-edit-row fieldset label span.title {\n\tdisplay: block;\n\tfloat: left;\n\twidth: 5em;\n}\n\n.inline-edit-row fieldset label span.input-text-wrap {\n\tmargin-left: 0;\n\tzoom: 100%;\n}\n\n#wpbody-content .inline-edit-row fieldset label span.input-text-wrap input {\n\tline-height: 130%;\n}\n\n#wpbody-content .inline-edit-row .input-text-wrap input {\n\twidth: 95%;\n}\n\n#wpbody-content .inline-edit-row .input-text-wrap input.inline-edit-password-input {\n\twidth: 8em;\n}\n/* end Inline Editor */\n\n#titlediv #title {\n\twidth: 98%;\n}\n\n.button,\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"submit\"] {\n\tpadding: 0 8px;\n\tline-height: 20px;\n\theight: auto;\n}\n\n.button.button-large,\ninput[type=\"reset\"].button-large,\ninput[type=\"button\"].button-large,\ninput[type=\"submit\"].button-large {\n\tpadding: 0 10px;\n\tline-height: 24px;\n\theight: auto;\n}\n\n.button.button-small,\ninput[type=\"reset\"].button-small,\ninput[type=\"button\"].button-small,\ninput[type=\"submit\"].button-small {\n\tpadding: 0 6px;\n\tline-height: 16px;\n\theight: auto;\n}\n\na.button {\n\tmargin: 1px;\n\tpadding: 1px 9px 2px;\n}\n\na.button.button-large {\n\tpadding: 1px 11px 2px;\n}\n\na.button.button-small {\n\tpadding: 1px 7px 2px;\n}\n\n#screen-options-wrap {\n\toverflow: hidden;\n}\n\n#the-comment-list .comment-item,\n#post-status-info,\n#wpwrap,\n#wrap,\n#postdivrich,\n#postdiv,\n#poststuff,\n.metabox-holder,\n#titlediv,\n#post-body,\n#editorcontainer,\n.tablenav,\n.widget-liquid-left,\n.widget-liquid-right,\n#widgets-left,\n.widgets-sortables,\n#dragHelper,\n.widget .widget-top,\n.widget-control-actions,\n.tagchecklist,\n#col-container,\n#col-left,\n#col-right,\n.fileedit-sub {\n\tdisplay: block;\n\tzoom: 100%;\n}\n\np.search-box {\n\tposition: static;\n\tfloat: right;\n\tmargin: -3px 0 4px;\n}\n\n#widget-list .widget {\n\tdisplay: inline;\n}\n\n#editorcontainer #content {\n\toverflow: auto;\n\tmargin: auto;\n\twidth: 98%;\n}\n\nform#template div {\n\twidth: 100%;\n}\n\n.wp-editor-container .quicktags-toolbar input {\n\toverflow: visible;\n\tpadding: 0 4px;\n}\n\n#poststuff h2 {\n\tfont-size: 1.6em;\n}\n\n#poststuff .inside #parent_id,\n#poststuff .inside #page_template,\n.inline-edit-row #post_parent,\n.inline-edit-row select[name=\"page_template\"] {\n\twidth: 250px;\n}\n\n#submitdiv input,\n#submitdiv select,\n#submitdiv a.button {\n\tposition: relative;\n}\n\n#bh {\n\tmargin: 7px 10px 0 0;\n\tfloat: right;\n}\n\n/* without this dashboard widgets appear in one column for some screen widths */\ndiv#dashboard-widgets {\n\tpadding-right: 1px;\n}\n\n.tagchecklist span, .tagchecklist span a {\n\tdisplay: inline-block;\n\tdisplay: block;\n}\n\n.tablenav .button-secondary,\n.nav .button-secondary {\n\tpadding-top: 2px;\n\tpadding-bottom: 2px;\n}\n\n.tablenav select {\n\tfont-size: 13px;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tmargin-top: 2px;\n}\n\n.tablenav .actions select {\n\twidth: 155px;\n}\n\n.subsubsub li {\n\tdisplay: inline;\n}\n\na.post-state-format {\n\ttext-indent: 0;\n\tline-height: 0;\n\tfont-size: 0;\n}\n\ntable.ie-fixed {\n\ttable-layout: fixed;\n}\n\n.widefat tr,\n.widefat th,\n.widefat thead td,\n.widefat tfoot td {\n\tmargin-bottom: 0;\n\tborder-spacing: 0;\n}\n\n.widefat th input,\n.widefat thead td input,\n.widefat tfoot td input {\n\tmargin: 0 0 0 5px;\n}\n\n.widefat thead .check-column,\n.widefat tfoot .check-column {\n\tpadding-top: 6px;\n}\n\n.widefat tbody th.check-column,\n.media.widefat tbody th.check-column {\n\tpadding: 4px 0 0;\n}\n\n.widefat {\n\tempty-cells: show;\n\tborder-collapse: collapse;\n}\n\n.tablenav a.button-secondary {\n\tdisplay: inline-block;\n\tpadding: 2px 5px;\n}\n\n.inactive-sidebar .widgets-sortables {\n\tpadding-bottom: 8px;\n}\n\n#available-widgets .widget-holder {\n\tpadding-bottom: 65px;\n}\n\n#widgets-left .inactive {\n\tpadding-bottom: 10px;\n}\n\n.widget-liquid-right .widget,\n.inactive-sidebar .widget {\n\tposition: relative;\n}\n\n.inactive-sidebar .widget {\n\tdisplay: block;\n\tfloat: left;\n}\n\n#wpcontent .button-primary-disabled {\n\tcolor: #9FD0D5;\n\tbackground: #298CBA;\n}\n\n#the-comment-list .unapproved tr,\n#the-comment-list .unapproved td {\n\tbackground-color: #ffffe0;\n}\n\n.imgedit-submit {\n\twidth: 300px;\n}\n\n#nav-menus-frame,\n#wpbody,\n.menu li {\n\tzoom: 100%;\n}\n\n#update-nav-menu #post-body {\n\toverflow:hidden;\n}\n\n.menu li {\n\tmin-width: 100%;\n}\n\n.menu li.sortable-placeholder {\n\tmin-width: 400px;\n}\n\n.available-theme {\n\tdisplay: inline;\n}\n\n.available-theme ul {\n\tmargin: 0;\n}\n\n.available-theme .action-links li {\n\tpadding-right: 7px;\n\tmargin-right: 7px;\n}\n\n.about-wrap .three-col.about-updates .col-2 {\n\twidth: 15%;\n}\n\n.about-wrap .about-password-meter input {\n\twidth: 98%;\n}\n\n.revisions-tickmarks,\n.revisions-tooltip {\n\tdisplay: none !important;\n}\n\n.revisions.pinned .revisions-controls {\n\tposition: relative;\n}\n\ninput[type=\"password\"],\n.login form .input {\n\tfont-family: sans-serif;\n}\n\n/* TinyMCE icons */\n.mce-btn i.mce-i-bold,\n.mce-btn i.mce-i-italic,\n.mce-btn i.mce-i-bullist,\n.mce-btn i.mce-i-numlist,\n.mce-btn i.mce-i-blockquote,\n.mce-btn i.mce-i-alignleft,\n.mce-btn i.mce-i-aligncenter,\n.mce-btn i.mce-i-alignright,\n.mce-btn i.mce-i-link,\n.mce-btn i.mce-i-unlink,\n.mce-btn i.mce-i-wp_more,\n.mce-btn i.mce-i-strikethrough,\n.mce-btn i.mce-i-spellchecker,\n.mce-btn i.mce-i-fullscreen,\n.mce-btn i.mce-i-wp_fullscreen,\n.mce-btn i.mce-i-wp_adv,\n.mce-btn i.mce-i-underline,\n.mce-btn i.mce-i-alignjustify,\n.mce-btn i.mce-i-forecolor,\n.mce-btn i.mce-i-pastetext,\n.mce-btn i.mce-i-pasteword,\n.mce-btn i.mce-i-removeformat,\n.mce-btn i.mce-i-charmap,\n.mce-btn i.mce-i-outdent,\n.mce-btn i.mce-i-indent,\n.mce-btn i.mce-i-undo,\n.mce-btn i.mce-i-redo,\n.mce-btn i.mce-i-help,\n.mce-btn i.mce-i-wp_help,\n.mce-btn i.mce-i-wp-media-library,\n.mce-btn i.mce-i-ltr,\n.mce-btn i.mce-i-wp_page,\n.mce-btn i.mce-i-hr,\n.mce-close {\n\tfont-family: 'tinymce', Arial;\n\tfont-style: normal;\n\tfont-weight: normal;\n\tfont-variant: normal;\n\tfont-size: 16px;\n\tmargin-left: 0;\n\tpadding-right: 0;\n}\n\n.mce-btn i.mce-i-wp_fullscreen,\n.qt-fullscreen {\n\t-ie7-icon: '\\e023';\n}\n\n.mce-btn i.mce-i-wp_more,\n.mce-btn i.mce-i-wp_page {\n\t-ie7-icon: '\\e027';\n}\n\n.mce-btn i.mce-i-wp_adv {\n\tbackground-color: #a0a5aa;\n}\n\n.mce-btn i.mce-i-help,\n.mce-btn i.mce-i-wp_help {\n\t-ie7-icon: '\\e016';\n}\n\n\n/* IE6 leftovers */\n* html .row-actions {\n\tvisibility: visible;\n}\n\n* html div.widget-liquid-left,\n* html div.widget-liquid-right {\n\tdisplay: block;\n\tposition: relative;\n}\n\n* html #editorcontainer {\n\tpadding: 0;\n}\n\n* html #poststuff h2 {\n\tmargin-left: 0;\n}\n\n* html .stuffbox,\n* html .stuffbox input,\n* html .stuffbox textarea {\n\tborder: 1px solid #DFDFDF;\n}\n\n* html div.widget-liquid-left {\n\twidth: 99%;\n}\n\n* html .widgets-sortables {\n\theight: 50px;\n}\n\n* html a#content_resize {\n\tright: -2px;\n}\n\n* html .widget-title h4 {\n\twidth: 205px;\n}\n\n* html #removing-widget .in-widget-title {\n\tdisplay: none;\n}\n\n* html .media-item .pinkynail {\n\theight: 32px;\n\twidth: 40px;\n}\n\n* html .describe .field input.text,\n* html .describe .field textarea {\n\twidth: 440px;\n}\n\n* html input {\n\tborder: 1px solid #dfdfdf;\n}\n\n* html .edit-box {\n\tdisplay: inline;\n}\n\n* html .postbox-container .meta-box-sortables {\n\theight: 300px;\n}\n\n* html #wpbody-content #screen-options-link-wrap {\n\tdisplay: inline-block;\n\twidth: 150px;\n\ttext-align: center;\n}\n\n* html #wpbody-content #contextual-help-link-wrap {\n\tdisplay: inline-block;\n\twidth: 100px;\n\ttext-align: center;\n}\n\n* html #adminmenu {\n\tmargin-left: -80px;\n}\n\n* html .folded #adminmenu {\n\tmargin-left: -22px;\n}\n\n* html #wpcontent #adminmenu li.menu-top {\n\tdisplay: inline;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n* html #wpfooter {\n\tmargin: 0;\n}\n\n* html #adminmenu div.wp-menu-image {\n\theight: 29px;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/install-rtl.css",
    "content": "html {\n\tbackground: #f1f1f1;\n\tmargin: 0 20px;\n}\n\nbody {\n\tbackground: #fff;\n\tcolor: #444;\n\tfont-family: \"Open Sans\", sans-serif;\n\tmargin: 140px auto 25px;\n\tpadding: 20px 20px 10px 20px;\n\tmax-width: 700px;\n\t-webkit-font-smoothing: subpixel-antialiased;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.13);\n}\n\na {\n\tcolor: #0073aa;\n}\n\na:hover,\na:active {\n\tcolor: #00a0d2;\n}\n\na:focus {\n\tcolor: #124964;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 a:focus {\n\toutline: #5b9dd9 solid 1px;\n}\n\nh1, h2 {\n\tborder-bottom: 1px solid #dedede;\n\tclear: both;\n\tcolor: #666;\n\tfont-size: 24px;\n\tpadding: 0;\n\tpadding-bottom: 7px;\n\tfont-weight: normal;\n}\n\nh3 {\n\tfont-size: 16px;\n}\n\np, li, dd, dt {\n\tpadding-bottom: 2px;\n\tfont-size: 14px;\n\tline-height: 1.5;\n}\n\ncode, .code {\n\tfont-family: Consolas, Monaco, monospace;\n}\n\nul, ol, dl {\n\tpadding: 5px 22px 5px 5px;\n}\n\na img {\n\tborder:0\n}\nabbr {\n\tborder: 0;\n\tfont-variant: normal;\n}\n\nfieldset {\n\tborder: 0;\n\tpadding: 0;\n\tmargin: 0;\n}\n\nlabel {\n\tcursor: pointer;\n}\n\n#logo {\n\tmargin: 6px 0 14px 0;\n\tpadding: 0 0 7px 0;\n\tborder-bottom: none;\n\ttext-align:center\n}\n#logo a {\n\tbackground-image: url(../images/w-logo-blue.png?ver=20131202);\n\tbackground-image: none, url(../images/wordpress-logo.svg?ver=20131107);\n\t-webkit-background-size: 84px;\n\tbackground-size: 84px;\n\tbackground-position: center top;\n\tbackground-repeat: no-repeat;\n\tcolor: #999;\n\theight: 84px;\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tline-height: 1.3em;\n\tmargin: -130px auto 25px;\n\tpadding: 0;\n\ttext-decoration: none;\n\twidth: 84px;\n\ttext-indent: -9999px;\n\toutline: none;\n\toverflow: hidden;\n\tdisplay: block;\n}\n\n#logo a:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.step {\n\tmargin: 20px 0 15px;\n}\n.step, th {\n\ttext-align: right;\n\tpadding: 0;\n}\n.language-chooser.wp-core-ui .step .button.button-large {\n\theight: 36px;\n\tvertical-align: middle;\n\tfont-size: 14px;\n}\ntextarea {\n\tborder: 1px solid #dfdfdf;\n\tfont-family: \"Open Sans\", sans-serif;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.form-table {\n\tborder-collapse: collapse;\n\tmargin-top: 1em;\n\twidth: 100%;\n}\n\n.form-table td {\n\tmargin-bottom: 9px;\n\tpadding: 10px 0 10px 20px;\n\tfont-size: 14px;\n\tvertical-align: top\n}\n\n.form-table th {\n\tfont-size: 14px;\n\ttext-align: right;\n\tpadding: 10px 0 10px 20px;\n\twidth: 140px;\n\tvertical-align: top;\n}\n\n.form-table code {\n\tline-height: 18px;\n\tfont-size: 14px;\n}\n\n.form-table p {\n\tmargin: 4px 0 0 0;\n\tfont-size: 11px;\n}\n\n.form-table input {\n\tline-height: 20px;\n\tfont-size: 15px;\n\tpadding: 3px 5px;\n\tborder: 1px solid #ddd;\n\t-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.07);\n\tbox-shadow: inset 0 1px 2px rgba(0,0,0,0.07);\n}\n\ninput,\nsubmit {\n\tfont-family: \"Open Sans\", sans-serif;\n}\n\n.form-table input[type=text],\n.form-table input[type=email],\n.form-table input[type=url],\n.form-table input[type=password] {\n\twidth: 206px;\n}\n\n.form-table th p {\n\tfont-weight: normal;\n}\n\n.form-table.install-success th,\n.form-table.install-success td {\n\tvertical-align: middle;\n\tpadding: 16px 0 16px 20px;\n}\n\n.form-table.install-success td p {\n\tmargin: 0;\n\tfont-size: 14px;\n}\n\n.form-table.install-success td code {\n\tmargin: 0;\n\tfont-size: 18px;\n}\n\n#error-page {\n\tmargin-top: 50px;\n}\n\n#error-page p {\n\tfont-size: 14px;\n\tline-height: 18px;\n\tmargin: 25px 0 20px;\n}\n\n#error-page code, .code {\n\tfont-family: Consolas, Monaco, monospace;\n}\n\n.wp-hide-pw > .dashicons {\n\tline-height: inherit;\n}\n\n#pass-strength-result {\n\tbackground-color: #eee;\n\tborder: 1px solid #ddd;\n\tcolor: #23282d;\n\tmargin: -2px 0px 5px 5px;\n\tpadding: 3px 5px;\n\ttext-align: center;\n\twidth: 218px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\topacity: 0;\n}\n\n#pass-strength-result.short {\n\tbackground-color: #f1adad;\n\tborder-color: #e35b5b;\n\topacity: 1;\n}\n\n#pass-strength-result.bad {\n\tbackground-color: #fbc5a9;\n\tborder-color: #f78b53;\n\topacity: 1;\n}\n\n#pass-strength-result.good {\n\tbackground-color: #ffe399;\n\tborder-color: #ffc733;\n\topacity: 1;\n}\n\n#pass-strength-result.strong {\n\tbackground-color: #c1e1b9;\n\tborder-color: #83c373;\n\topacity: 1;\n}\n\n#pass1.short, #pass1-text.short {\n\tborder-color: #e35b5b;\n}\n\n#pass1.bad, #pass1-text.bad {\n\tborder-color: #f78b53;\n}\n\n#pass1.good, #pass1-text.good {\n\tborder-color: #ffc733;\n}\n\n#pass1.strong, #pass1-text.strong {\n\tborder-color: #83c373;\n}\n\n.pw-weak {\n\tdisplay: none;\n}\n\n.message {\n\tborder: 1px solid #c00;\n\tpadding: 0.5em 0.7em;\n\tmargin: 5px 0 15px;\n\tbackground-color: #ffebe8;\n}\n\n/* rtl:ignore */\n#dbname,\n#uname,\n#pwd,\n#dbhost,\n#prefix,\n#user_login,\n#admin_email,\n#pass1,\n#pass2 {\n\tdirection: ltr;\n}\n\n#pass1-text,\n.show-password #pass1 {\n\tdisplay: none;\n}\n\n.show-password #pass1-text\n{\n\tdisplay: inline-block;\n}\n\n.form-table span.description.important {\n\tfont-size: 12px;\n}\n\n\n/* localization */\nbody.rtl,\n.rtl textarea,\n.rtl input,\n.rtl submit {\n\tfont-family: Tahoma, sans-serif;\n}\n\n:lang(he-il) body.rtl,\n:lang(he-il) .rtl textarea,\n:lang(he-il) .rtl input,\n:lang(he-il) .rtl submit {\n\tfont-family: Arial, sans-serif;\n}\n\n@media only screen and (max-width: 799px) {\n\tbody {\n\t\tmargin-top: 115px;\n\t}\n\t#logo a {\n\t\tmargin: -125px auto 30px;\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\n\t.form-table {\n\t\tmargin-top: 0;\n\t}\n\n\t.form-table th,\n\t.form-table td {\n\t\tdisplay: block;\n\t\twidth: auto;\n\t\tvertical-align: middle;\n\t}\n\n\t.form-table th {\n\t\tpadding: 20px 0 0;\n\t}\n\n\t.form-table td {\n\t\tpadding: 5px 0;\n\t\tborder: 0;\n\t\tmargin: 0;\n\t}\n\n\ttextarea,\n\tinput {\n\t\tfont-size: 16px;\n\t}\n\n\t.form-table td input[type=\"text\"],\n\t.form-table td input[type=\"email\"],\n\t.form-table td input[type=\"url\"],\n\t.form-table td input[type=\"password\"],\n\t.form-table td select,\n\t.form-table td textarea,\n\t.form-table span.description {\n\t\twidth: 100%;\n\t\tfont-size: 16px;\n\t\tline-height: 1.5;\n\t\tpadding: 7px 10px;\n\t\tdisplay: block;\n\t\tmax-width: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n}\n\nbody.language-chooser {\n\tmax-width: 300px;\n}\n\n.language-chooser select {\n\tpadding: 8px;\n\twidth: 100%;\n\tdisplay: block;\n\tborder: 1px solid #ddd;\n\tbackground-color: #fff;\n\tcolor: #32373c;\n\tfont-size: 16px;\n\tfont-family: Arial, sans-serif;\n\tfont-weight: normal;\n}\n\n.language-chooser p {\n\ttext-align: left;\n}\n\n.screen-reader-input,\n.screen-reader-text {\n\tposition: absolute;\n\tmargin: -1px;\n\tpadding: 0;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(0 0 0 0);\n\tborder: 0;\n}\n\n.spinner {\n\tbackground: url(../images/spinner.gif) no-repeat;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\tvisibility: hidden;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 2px 5px 0;\n}\n\n.step .spinner {\n\tdisplay: inline-block;\n\tmargin-top: 8px;\n\tmargin-left: 15px;\n\tvertical-align: top;\n}\n\n.button-secondary.hide-if-no-js,\n.hide-if-no-js {\n\tdisplay: none;\n}\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\n\t.spinner {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/install.css",
    "content": "html {\n\tbackground: #f1f1f1;\n\tmargin: 0 20px;\n}\n\nbody {\n\tbackground: #fff;\n\tcolor: #444;\n\tfont-family: \"Open Sans\", sans-serif;\n\tmargin: 140px auto 25px;\n\tpadding: 20px 20px 10px 20px;\n\tmax-width: 700px;\n\t-webkit-font-smoothing: subpixel-antialiased;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.13);\n}\n\na {\n\tcolor: #0073aa;\n}\n\na:hover,\na:active {\n\tcolor: #00a0d2;\n}\n\na:focus {\n\tcolor: #124964;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 a:focus {\n\toutline: #5b9dd9 solid 1px;\n}\n\nh1, h2 {\n\tborder-bottom: 1px solid #dedede;\n\tclear: both;\n\tcolor: #666;\n\tfont-size: 24px;\n\tpadding: 0;\n\tpadding-bottom: 7px;\n\tfont-weight: normal;\n}\n\nh3 {\n\tfont-size: 16px;\n}\n\np, li, dd, dt {\n\tpadding-bottom: 2px;\n\tfont-size: 14px;\n\tline-height: 1.5;\n}\n\ncode, .code {\n\tfont-family: Consolas, Monaco, monospace;\n}\n\nul, ol, dl {\n\tpadding: 5px 5px 5px 22px;\n}\n\na img {\n\tborder:0\n}\nabbr {\n\tborder: 0;\n\tfont-variant: normal;\n}\n\nfieldset {\n\tborder: 0;\n\tpadding: 0;\n\tmargin: 0;\n}\n\nlabel {\n\tcursor: pointer;\n}\n\n#logo {\n\tmargin: 6px 0 14px 0;\n\tpadding: 0 0 7px 0;\n\tborder-bottom: none;\n\ttext-align:center\n}\n#logo a {\n\tbackground-image: url(../images/w-logo-blue.png?ver=20131202);\n\tbackground-image: none, url(../images/wordpress-logo.svg?ver=20131107);\n\t-webkit-background-size: 84px;\n\tbackground-size: 84px;\n\tbackground-position: center top;\n\tbackground-repeat: no-repeat;\n\tcolor: #999;\n\theight: 84px;\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tline-height: 1.3em;\n\tmargin: -130px auto 25px;\n\tpadding: 0;\n\ttext-decoration: none;\n\twidth: 84px;\n\ttext-indent: -9999px;\n\toutline: none;\n\toverflow: hidden;\n\tdisplay: block;\n}\n\n#logo a:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.step {\n\tmargin: 20px 0 15px;\n}\n.step, th {\n\ttext-align: left;\n\tpadding: 0;\n}\n.language-chooser.wp-core-ui .step .button.button-large {\n\theight: 36px;\n\tvertical-align: middle;\n\tfont-size: 14px;\n}\ntextarea {\n\tborder: 1px solid #dfdfdf;\n\tfont-family: \"Open Sans\", sans-serif;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.form-table {\n\tborder-collapse: collapse;\n\tmargin-top: 1em;\n\twidth: 100%;\n}\n\n.form-table td {\n\tmargin-bottom: 9px;\n\tpadding: 10px 20px 10px 0;\n\tfont-size: 14px;\n\tvertical-align: top\n}\n\n.form-table th {\n\tfont-size: 14px;\n\ttext-align: left;\n\tpadding: 10px 20px 10px 0;\n\twidth: 140px;\n\tvertical-align: top;\n}\n\n.form-table code {\n\tline-height: 18px;\n\tfont-size: 14px;\n}\n\n.form-table p {\n\tmargin: 4px 0 0 0;\n\tfont-size: 11px;\n}\n\n.form-table input {\n\tline-height: 20px;\n\tfont-size: 15px;\n\tpadding: 3px 5px;\n\tborder: 1px solid #ddd;\n\t-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.07);\n\tbox-shadow: inset 0 1px 2px rgba(0,0,0,0.07);\n}\n\ninput,\nsubmit {\n\tfont-family: \"Open Sans\", sans-serif;\n}\n\n.form-table input[type=text],\n.form-table input[type=email],\n.form-table input[type=url],\n.form-table input[type=password] {\n\twidth: 206px;\n}\n\n.form-table th p {\n\tfont-weight: normal;\n}\n\n.form-table.install-success th,\n.form-table.install-success td {\n\tvertical-align: middle;\n\tpadding: 16px 20px 16px 0;\n}\n\n.form-table.install-success td p {\n\tmargin: 0;\n\tfont-size: 14px;\n}\n\n.form-table.install-success td code {\n\tmargin: 0;\n\tfont-size: 18px;\n}\n\n#error-page {\n\tmargin-top: 50px;\n}\n\n#error-page p {\n\tfont-size: 14px;\n\tline-height: 18px;\n\tmargin: 25px 0 20px;\n}\n\n#error-page code, .code {\n\tfont-family: Consolas, Monaco, monospace;\n}\n\n.wp-hide-pw > .dashicons {\n\tline-height: inherit;\n}\n\n#pass-strength-result {\n\tbackground-color: #eee;\n\tborder: 1px solid #ddd;\n\tcolor: #23282d;\n\tmargin: -2px 5px 5px 0px;\n\tpadding: 3px 5px;\n\ttext-align: center;\n\twidth: 218px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\topacity: 0;\n}\n\n#pass-strength-result.short {\n\tbackground-color: #f1adad;\n\tborder-color: #e35b5b;\n\topacity: 1;\n}\n\n#pass-strength-result.bad {\n\tbackground-color: #fbc5a9;\n\tborder-color: #f78b53;\n\topacity: 1;\n}\n\n#pass-strength-result.good {\n\tbackground-color: #ffe399;\n\tborder-color: #ffc733;\n\topacity: 1;\n}\n\n#pass-strength-result.strong {\n\tbackground-color: #c1e1b9;\n\tborder-color: #83c373;\n\topacity: 1;\n}\n\n#pass1.short, #pass1-text.short {\n\tborder-color: #e35b5b;\n}\n\n#pass1.bad, #pass1-text.bad {\n\tborder-color: #f78b53;\n}\n\n#pass1.good, #pass1-text.good {\n\tborder-color: #ffc733;\n}\n\n#pass1.strong, #pass1-text.strong {\n\tborder-color: #83c373;\n}\n\n.pw-weak {\n\tdisplay: none;\n}\n\n.message {\n\tborder: 1px solid #c00;\n\tpadding: 0.5em 0.7em;\n\tmargin: 5px 0 15px;\n\tbackground-color: #ffebe8;\n}\n\n/* rtl:ignore */\n#dbname,\n#uname,\n#pwd,\n#dbhost,\n#prefix,\n#user_login,\n#admin_email,\n#pass1,\n#pass2 {\n\tdirection: ltr;\n}\n\n#pass1-text,\n.show-password #pass1 {\n\tdisplay: none;\n}\n\n.show-password #pass1-text\n{\n\tdisplay: inline-block;\n}\n\n.form-table span.description.important {\n\tfont-size: 12px;\n}\n\n\n/* localization */\nbody.rtl,\n.rtl textarea,\n.rtl input,\n.rtl submit {\n\tfont-family: Tahoma, sans-serif;\n}\n\n:lang(he-il) body.rtl,\n:lang(he-il) .rtl textarea,\n:lang(he-il) .rtl input,\n:lang(he-il) .rtl submit {\n\tfont-family: Arial, sans-serif;\n}\n\n@media only screen and (max-width: 799px) {\n\tbody {\n\t\tmargin-top: 115px;\n\t}\n\t#logo a {\n\t\tmargin: -125px auto 30px;\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\n\t.form-table {\n\t\tmargin-top: 0;\n\t}\n\n\t.form-table th,\n\t.form-table td {\n\t\tdisplay: block;\n\t\twidth: auto;\n\t\tvertical-align: middle;\n\t}\n\n\t.form-table th {\n\t\tpadding: 20px 0 0;\n\t}\n\n\t.form-table td {\n\t\tpadding: 5px 0;\n\t\tborder: 0;\n\t\tmargin: 0;\n\t}\n\n\ttextarea,\n\tinput {\n\t\tfont-size: 16px;\n\t}\n\n\t.form-table td input[type=\"text\"],\n\t.form-table td input[type=\"email\"],\n\t.form-table td input[type=\"url\"],\n\t.form-table td input[type=\"password\"],\n\t.form-table td select,\n\t.form-table td textarea,\n\t.form-table span.description {\n\t\twidth: 100%;\n\t\tfont-size: 16px;\n\t\tline-height: 1.5;\n\t\tpadding: 7px 10px;\n\t\tdisplay: block;\n\t\tmax-width: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n}\n\nbody.language-chooser {\n\tmax-width: 300px;\n}\n\n.language-chooser select {\n\tpadding: 8px;\n\twidth: 100%;\n\tdisplay: block;\n\tborder: 1px solid #ddd;\n\tbackground-color: #fff;\n\tcolor: #32373c;\n\tfont-size: 16px;\n\tfont-family: Arial, sans-serif;\n\tfont-weight: normal;\n}\n\n.language-chooser p {\n\ttext-align: right;\n}\n\n.screen-reader-input,\n.screen-reader-text {\n\tposition: absolute;\n\tmargin: -1px;\n\tpadding: 0;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(0 0 0 0);\n\tborder: 0;\n}\n\n.spinner {\n\tbackground: url(../images/spinner.gif) no-repeat;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\tvisibility: hidden;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 2px 5px 0;\n}\n\n.step .spinner {\n\tdisplay: inline-block;\n\tmargin-top: 8px;\n\tmargin-right: 15px;\n\tvertical-align: top;\n}\n\n.button-secondary.hide-if-no-js,\n.hide-if-no-js {\n\tdisplay: none;\n}\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\n\t.spinner {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/l10n-rtl.css",
    "content": "/*------------------------------------------------------------------------------\n  27.0 - Localization\n------------------------------------------------------------------------------*/\n\n/* RTL except Hebrew (see below): Tahoma as the first font; */\nbody.rtl,\nbody.rtl .press-this a.wp-switch-editor {\n\tfont-family: Tahoma, Arial, sans-serif;\n}\n\n/* Arial is best for RTL headings. */\n.rtl h1,\n.rtl h2,\n.rtl h3,\n.rtl h4,\n.rtl h5,\n.rtl h6 {\n\tfont-family: Arial, sans-serif;\n\tfont-weight: bold;\n}\n\n/* he_IL: Remove Tahoma from the font stack. Arial is best for Hebrew. */\nbody.locale-he-il,\nbody.locale-he-il .press-this a.wp-switch-editor {\n\tfont-family: Arial, sans-serif;\n}\n\n/* he_IL: Have <em> be bold rather than italic. */\n.locale-he-il em {\n\tfont-style: normal;\n\tfont-weight: bold;\n}\n\n/* zh_CN: Remove italic properties. */\n.locale-zh-cn .howto,\n.locale-zh-cn .tablenav .displaying-num,\n.locale-zh-cn .js .input-with-default-title,\n.locale-zh-cn .link-to-original,\n.locale-zh-cn .inline-edit-row fieldset span.title,\n.locale-zh-cn .inline-edit-row fieldset span.checkbox-title,\n.locale-zh-cn #utc-time,\n.locale-zh-cn #local-time,\n.locale-zh-cn p.install-help,\n.locale-zh-cn p.help,\n.locale-zh-cn p.description,\n.locale-zh-cn span.description,\n.locale-zh-cn .form-wrap p {\n\tfont-style: normal;\n}\n\n/* zh_CN: Enlarge dashboard widget 'Configure' link */\n.locale-zh-cn .hdnle a { font-size: 12px; }\n\n/* zn_CH: Enlarge font size, set font-size: normal */\n.locale-zh-cn form.upgrade .hint { font-style: normal; font-size: 100%; }\n\n/* zh_CN: Enlarge font-size. */\n.locale-zh-cn #sort-buttons { font-size: 1em !important; }\n\n/* de_DE: Text needs more space for translation */\n.locale-de-de #customize-header-actions .button,\n.locale-de-de-formal #customize-header-actions .button {\n\tpadding: 0 5px 1px; /* default 0 10px 1px */\n}\n.locale-de-de #customize-header-actions .spinner,\n.locale-de-de-formal #customize-header-actions .spinner {\n\tmargin: 16px 3px 0; /* default 16px 4px 0 5px */\n}\n\n/* ru_RU: Text needs more room to breathe. */\n.locale-ru-ru #adminmenu {\n\twidth: inherit; /* back-compat for pre-3.2 */\n}\n.locale-ru-ru #adminmenu,\n.locale-ru-ru #wpbody {\n\tmargin-right: 0; /* back-compat for pre-3.2 */\n}\n.locale-ru-ru .inline-edit-row fieldset label span.title,\n.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend {\n\twidth: 8em; /* default 6em */\n}\n.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap,\n.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap {\n\tmargin-right: 8em; /* default 6em */\n}\n.locale-ru-ru.post-php .tagsdiv .newtag,\n.locale-ru-ru.post-new-php .tagsdiv .newtag {\n\twidth: 165px; /* default 180px - 15px */\n}\n.locale-ru-ru.press-this .posting {\n\tmargin-left: 277px; /* default 252px + 25px */\n}\n.locale-ru-ru .press-this-sidebar {\n\twidth: 265px; /* default 240px + 25px */\n}\n.locale-ru-ru #customize-header-actions .button {\n\tpadding: 0 5px 1px; /* default 0 10px 1px */\n}\n.locale-ru-ru #customize-header-actions .spinner {\n\tmargin: 16px 3px 0; /* default 16px 4px 0 5px */\n}\n\n/* lt_LT: QuickEdit */\n.locale-lt-lt .inline-edit-row fieldset label span.title,\n.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend {\n\twidth: 8em; /* default 6em */\n}\n.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,\n.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap {\n\tmargin-right: 8em; /* default 6em */\n}\n\n@media screen and (max-width: 782px) {\n\t.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap,\n\t.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,\n\t.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,\n\t.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap {\n\t\tmargin-right: 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/l10n.css",
    "content": "/*------------------------------------------------------------------------------\n  27.0 - Localization\n------------------------------------------------------------------------------*/\n\n/* RTL except Hebrew (see below): Tahoma as the first font; */\nbody.rtl,\nbody.rtl .press-this a.wp-switch-editor {\n\tfont-family: Tahoma, Arial, sans-serif;\n}\n\n/* Arial is best for RTL headings. */\n.rtl h1,\n.rtl h2,\n.rtl h3,\n.rtl h4,\n.rtl h5,\n.rtl h6 {\n\tfont-family: Arial, sans-serif;\n\tfont-weight: bold;\n}\n\n/* he_IL: Remove Tahoma from the font stack. Arial is best for Hebrew. */\nbody.locale-he-il,\nbody.locale-he-il .press-this a.wp-switch-editor {\n\tfont-family: Arial, sans-serif;\n}\n\n/* he_IL: Have <em> be bold rather than italic. */\n.locale-he-il em {\n\tfont-style: normal;\n\tfont-weight: bold;\n}\n\n/* zh_CN: Remove italic properties. */\n.locale-zh-cn .howto,\n.locale-zh-cn .tablenav .displaying-num,\n.locale-zh-cn .js .input-with-default-title,\n.locale-zh-cn .link-to-original,\n.locale-zh-cn .inline-edit-row fieldset span.title,\n.locale-zh-cn .inline-edit-row fieldset span.checkbox-title,\n.locale-zh-cn #utc-time,\n.locale-zh-cn #local-time,\n.locale-zh-cn p.install-help,\n.locale-zh-cn p.help,\n.locale-zh-cn p.description,\n.locale-zh-cn span.description,\n.locale-zh-cn .form-wrap p {\n\tfont-style: normal;\n}\n\n/* zh_CN: Enlarge dashboard widget 'Configure' link */\n.locale-zh-cn .hdnle a { font-size: 12px; }\n\n/* zn_CH: Enlarge font size, set font-size: normal */\n.locale-zh-cn form.upgrade .hint { font-style: normal; font-size: 100%; }\n\n/* zh_CN: Enlarge font-size. */\n.locale-zh-cn #sort-buttons { font-size: 1em !important; }\n\n/* de_DE: Text needs more space for translation */\n.locale-de-de #customize-header-actions .button,\n.locale-de-de-formal #customize-header-actions .button {\n\tpadding: 0 5px 1px; /* default 0 10px 1px */\n}\n.locale-de-de #customize-header-actions .spinner,\n.locale-de-de-formal #customize-header-actions .spinner {\n\tmargin: 16px 3px 0; /* default 16px 4px 0 5px */\n}\n\n/* ru_RU: Text needs more room to breathe. */\n.locale-ru-ru #adminmenu {\n\twidth: inherit; /* back-compat for pre-3.2 */\n}\n.locale-ru-ru #adminmenu,\n.locale-ru-ru #wpbody {\n\tmargin-left: 0; /* back-compat for pre-3.2 */\n}\n.locale-ru-ru .inline-edit-row fieldset label span.title,\n.locale-ru-ru .inline-edit-row fieldset.inline-edit-date legend {\n\twidth: 8em; /* default 6em */\n}\n.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap,\n.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap {\n\tmargin-left: 8em; /* default 6em */\n}\n.locale-ru-ru.post-php .tagsdiv .newtag,\n.locale-ru-ru.post-new-php .tagsdiv .newtag {\n\twidth: 165px; /* default 180px - 15px */\n}\n.locale-ru-ru.press-this .posting {\n\tmargin-right: 277px; /* default 252px + 25px */\n}\n.locale-ru-ru .press-this-sidebar {\n\twidth: 265px; /* default 240px + 25px */\n}\n.locale-ru-ru #customize-header-actions .button {\n\tpadding: 0 5px 1px; /* default 0 10px 1px */\n}\n.locale-ru-ru #customize-header-actions .spinner {\n\tmargin: 16px 3px 0; /* default 16px 4px 0 5px */\n}\n\n/* lt_LT: QuickEdit */\n.locale-lt-lt .inline-edit-row fieldset label span.title,\n.locale-lt-lt .inline-edit-row fieldset.inline-edit-date legend {\n\twidth: 8em; /* default 6em */\n}\n.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,\n.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap {\n\tmargin-left: 8em; /* default 6em */\n}\n\n@media screen and (max-width: 782px) {\n\t.locale-ru-ru .inline-edit-row fieldset label span.input-text-wrap,\n\t.locale-ru-ru .inline-edit-row fieldset .timestamp-wrap,\n\t.locale-lt-lt .inline-edit-row fieldset label span.input-text-wrap,\n\t.locale-lt-lt .inline-edit-row fieldset .timestamp-wrap {\n\t\tmargin-left: 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/list-tables-rtl.css",
    "content": ".response-links {\n\tdisplay: block;\n\tmargin-bottom: 1em;\n}\n\n.response-links a {\n\tdisplay: block;\n}\n\n.response-links a.comments-edit-item-link {\n\tfont-weight: 600;\n}\n\n.response-links a.comments-view-item-link {\n\tfont-size: 12px;\n}\n\n.post-com-count-wrapper strong {\n\tfont-weight: 400;\n}\n\n.comments-view-item-link {\n\tdisplay: inline-block;\n\tclear: both;\n}\n\n.column-response .post-com-count-wrapper,\n.column-comments .post-com-count-wrapper {\n\twhite-space: nowrap;\n\tword-wrap: normal;\n}\n\n/* comments bubble common */\n.column-response .post-com-count,\n.column-comments .post-com-count {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n/* comments bubble approved */\n.column-response .post-com-count-no-comments,\n.column-response .post-com-count-approved,\n.column-comments .post-com-count-no-comments,\n.column-comments .post-com-count-approved {\n\tmargin-top: 5px;\n}\n\n.column-response .comment-count-no-comments,\n.column-response .comment-count-approved,\n.column-comments .comment-count-no-comments,\n.column-comments .comment-count-approved {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tdisplay: block;\n\tpadding: 0 8px;\n\tmin-width: 24px;\n\theight: 2em;\n\t-webkit-border-radius: 5px;\n\tborder-radius: 5px;\n\tbackground-color: #72777c;\n\tcolor: #fff;\n\tfont-size: 11px;\n\tline-height: 21px;\n\ttext-align: center;\n}\n\n.ie8 .column-response .comment-count-no-comments,\n.ie8 .column-response .comment-count-approved,\n.ie8 .column-comments .comment-count-no-comments,\n.ie8 .column-comments .comment-count-approved {\n\tmin-width: 0;\n}\n\n.column-response .post-com-count-no-comments:after,\n.column-response .post-com-count-approved:after,\n.column-comments .post-com-count-no-comments:after,\n.column-comments .post-com-count-approved:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tmargin-right: 8px;\n\twidth: 0;\n\theight: 0;\n\tborder-top: 5px solid #72777c;\n\tborder-left: 5px solid transparent;\n}\n\n.column-response .post-com-count-approved:hover .comment-count-approved,\n.column-response .post-com-count-approved:focus .comment-count-approved,\n.column-comments .post-com-count-approved:hover .comment-count-approved,\n.column-comments .post-com-count-approved:focus .comment-count-approved {\n\tbackground: #0073aa;\n}\n\n.column-response .post-com-count-approved:hover:after,\n.column-response .post-com-count-approved:focus:after,\n.column-comments .post-com-count-approved:hover:after,\n.column-comments .post-com-count-approved:focus:after {\n\tborder-top-color: #0073aa;\n}\n\n/* comments bubble pending */\n.column-response .post-com-count-pending,\n.column-comments .post-com-count-pending {\n\tposition: relative;\n\tright: -3px;\n\tpadding: 0 5px;\n\tmin-width: 7px;\n\theight: 17px;\n\tborder: 2px solid #fff;\n\t-webkit-border-radius: 11px;\n\tborder-radius: 11px;\n\tbackground: #ca4a1f;\n\tcolor: #fff;\n\tfont-size: 9px;\n\tline-height: 17px;\n\ttext-align: center;\n}\n\n.column-response .post-com-count-no-pending,\n.column-comments .post-com-count-no-pending {\n\tdisplay: none;\n}\n\n/* comments */\n\n.commentlist li {\n\tpadding: 1em 1em .2em;\n\tmargin: 0;\n\tborder-bottom: 1px solid #ccc;\n}\n\n.commentlist li li {\n\tborder-bottom: 0;\n\tpadding: 0;\n}\n\n.commentlist p {\n\tpadding: 0;\n\tmargin: 0 0 .8em;\n}\n\n#submitted-on,\n.submitted-on {\n\tcolor: #777;\n}\n\n/* reply to comments */\n#replyrow td {\n\tpadding: 2px;\n}\n\n#replysubmit {\n\tmargin: 0;\n\tpadding: 5px 7px 10px;\n\toverflow: hidden;\n\ttext-align: center;\n}\n\n#replysubmit .button {\n\tmargin-left: 5px;\n}\n\n#replysubmit .error {\n\tcolor: red;\n\tline-height: 21px;\n\ttext-align: center;\n}\n\n#replyrow.inline-edit-row fieldset.comment-reply {\n\tfont-size: inherit;\n\tline-height: inherit;\n}\n\n#replyrow legend {\n\tmargin: 0;\n\tpadding: .2em 5px 0;\n\tfont-size: 13px;\n\tline-height: 1.4;\n\tfont-weight: 600;\n}\n\n#replyrow.inline-edit-row label {\n\tdisplay: inline;\n\tvertical-align: baseline;\n\tline-height: inherit;\n}\n\n#edithead .inside,\n#commentsdiv #edithead .inside {\n\tfloat: right;\n\tpadding: 3px 5px 2px 0;\n\tmargin: 0;\n\ttext-align: center;\n}\n\n#edithead .inside input {\n\twidth: 180px;\n}\n\n#edithead label {\n\tpadding: 2px 0;\n}\n\n#replycontainer {\n\tpadding: 5px;\n}\n\n#replycontent {\n\theight: 120px;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#replyerror {\n\tborder-color: #ddd;\n\tbackground-color: #f9f9f9;\n}\n\n/* @todo: is this used? */\n.commentlist .avatar {\n\tvertical-align: text-top;\n}\n\n#the-comment-list tr.undo,\n#the-comment-list div.undo {\n\tbackground-color: #f4f4f4;\n}\n\n#the-comment-list .unapproved th,\n#the-comment-list .unapproved td {\n\tbackground-color: #fef7f1;\n}\n\n#the-comment-list .unapproved th.check-column {\n\tborder-right: 4px solid #d54e21;\n}\n\n#the-comment-list .unapproved th.check-column input {\n\tmargin-right: 4px;\n}\n\n#the-comment-list .approve a {\n\tcolor: #006505;\n}\n\n#the-comment-list .unapprove a {\n\tcolor: #d98500;\n}\n\n#the-comment-list th,\n#the-comment-list td {\n\t-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\tbox-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n}\n\n#the-comment-list tr:last-child th,\n#the-comment-list tr:last-child td {\n    -webkit-box-shadow: none;\n    box-shadow: none;\n}\n\n#the-comment-list tr.unapproved + tr.approved th,\n#the-comment-list tr.unapproved + tr.approved td {\n    border-top: 1px solid rgba(0, 0, 0, 0.03);\n}\n\n/* table vim shortcuts */\n.vim-current,\n.vim-current th,\n.vim-current td {\n\tbackground-color: #e4f2fd !important;\n}\n\nth .comment-grey-bubble {\n\theight: 16px;\n\twidth: 16px;\n}\n\nth .comment-grey-bubble:before {\n\tcontent: \"\\f101\";\n\tfont: normal 20px/.5 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0;\n\ttop: 4px;\n\tright: -4px;\n\tposition: relative;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #444;\n}\n\n/*------------------------------------------------------------------------------\n  10.0 - List Posts (/Pages/etc)\n------------------------------------------------------------------------------*/\n\ntable.fixed {\n\ttable-layout: fixed;\n}\n\n.fixed .column-rating,\n.fixed .column-visible {\n\twidth: 8%;\n}\n\n.fixed .column-posts,\n.fixed .column-date,\n.fixed .column-parent,\n.fixed .column-links,\n.fixed .column-author,\n.fixed .column-format {\n\twidth: 10%;\n}\n\n.fixed .column-posts {\n\twidth: 74px;\n}\n\n.fixed .column-comment .comment-author {\n\tdisplay: none;\n}\n\n.fixed .column-response,\n.fixed .column-categories,\n.fixed .column-tags,\n.fixed .column-rel,\n.fixed .column-role {\n\twidth: 15%;\n}\n\n.fixed .column-slug {\n\twidth: 25%;\n}\n\n.fixed .column-locations {\n\twidth: 35%;\n}\n\n.fixed .column-comments {\n\twidth: 5.5em;\n\tpadding: 8px 0;\n\ttext-align: right;\n}\n\n.fixed .column-comments .vers {\n\tpadding-right: 3px;\n}\n\ntd.column-title strong,\ntd.plugin-title strong {\n\tdisplay: block;\n\tmargin-bottom: .2em;\n\tfont-size: 14px;\n}\n\ntd.column-title p,\ntd.plugin-title p {\n\tmargin: 6px 0;\n}\n\n/* Media file column */\ntable.media .column-title .media-icon {\n\tfloat: right;\n\tmin-height: 60px;\n \tmargin: 0 0 0 9px;\n}\n\ntable.media .column-title .media-icon img {\n\tmax-width: 60px;\n\theight: auto;\n\tvertical-align: top; /* Remove descender white-space. */\n}\n\ntable.media .column-title .has-media-icon ~ .row-actions {\n\tmargin-right: 70px; /* 60px image + margin */\n}\n\ntable.media .column-title .filename {\n\tmargin-bottom: 0.2em;\n}\n\n/* @todo: pick a consistent list table selector */\n.wp-list-table a {\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n#the-list tr:last-child td,\n#the-list tr:last-child th {\n\tborder-bottom: none !important;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#comments-form .fixed .column-author {\n\twidth: 20%;\n}\n\n#comments-form .fixed .column-date {\n\twidth: 14%;\n}\n\n#commentsdiv.postbox .inside {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#commentsdiv .inside .row-actions {\n\tline-height:18px;\n}\n\n#commentsdiv .inside .column-author {\n\twidth: 25%;\n}\n\n#commentsdiv .column-comment p {\n\tmargin: 0.6em 0;\n\tpadding: 0;\n}\n\n#commentsdiv #replyrow td {\n\tpadding: 0;\n}\n\n#commentsdiv p {\n\tpadding: 8px 10px;\n\tmargin: 0;\n}\n\n#commentsdiv .comments-box {\n\tborder: 0 none;\n}\n\n#commentsdiv .comments-box thead th,\n#commentsdiv .comments-box thead td {\n\tbackground: transparent;\n\tpadding: 0 7px 4px;\n\tfont-style: italic;\n}\n\n#commentsdiv .comments-box tr:last-child td {\n\tborder-bottom: 0 none;\n}\n\n#commentsdiv #edithead .inside input {\n\twidth: 160px;\n}\n\n.sorting-indicator {\n\tdisplay: block;\n\tvisibility: hidden;\n\twidth: 10px;\n\theight: 4px;\n\tmargin-top: 8px;\n\tmargin-right: 7px;\n}\n\n.sorting-indicator:before {\n\tcontent: \"\\f142\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0;\n\ttop: -4px;\n\tright: -8px;\n\tcolor: #444;\n\tline-height: 10px;\n\tposition: relative;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #444;\n}\n\n.column-comments .sorting-indicator:before {\n\ttop: 0;\n\tright: -10px;\n}\n\nth.sorted.asc .sorting-indicator:before,\nth.desc:hover span.sorting-indicator:before,\nth.desc a:focus span.sorting-indicator:before {\n\tcontent: \"\\f142\";\n}\n\nth.sorted.desc .sorting-indicator:before,\nth.asc:hover span.sorting-indicator:before,\nth.asc a:focus span.sorting-indicator:before {\n\tcontent: \"\\f140\";\n}\n\n.wp-list-table .toggle-row {\n\tposition: absolute;\n\tleft: 8px;\n\ttop: 10px;\n\tdisplay: none;\n\tpadding: 0;\n\twidth: 40px;\n\theight: 40px;\n\tborder: none;\n\toutline: none;\n\tbackground: transparent;\n}\n\n.wp-list-table .toggle-row:hover {\n\tcursor: pointer;\n}\n\n.wp-list-table .toggle-row:focus:before {\n    -webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 .wp-list-table .toggle-row:focus:before {\n\toutline: #5b9dd9 solid 1px;\n}\n\n.wp-list-table .toggle-row:active {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-list-table .toggle-row:before {\n\tposition: absolute;\n\ttop: -5px;\n\tright: 10px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tdisplay: block;\n\tpadding: 1px 0 1px 2px;\n\tcolor: #666;\n\tcontent: \"\\f140\";\n\tfont: normal 20px/1 dashicons;\n\tline-height: 1;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tspeak: none;\n}\n\n.wp-list-table .is-expanded .toggle-row:before {\n\tcontent: \"\\f142\";\n}\n\ntr.wp-locked .locked-indicator {\n\tmargin-right: 6px;\n\theight: 20px;\n\twidth: 16px;\n}\n\ntr.wp-locked .locked-indicator:before {\n\tcolor: #82878c;\n\tcontent: \"\\f160\";\n\tdisplay: inline-block;\n\tfloat: right;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: middle;\n\tmargin-right: 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\ntr.wp-locked .check-column label,\ntr.wp-locked .check-column input[type=\"checkbox\"],\ntr.wp-locked .row-actions .inline,\ntr.wp-locked .row-actions .trash {\n\tdisplay: none;\n}\n\ntr .locked-info {\n\theight: 0;\n\topacity: 0;\n}\n\ntr.wp-locked .locked-info {\n\tmargin-top: 8px;\n\theight: auto;\n\topacity: 1;\n}\n\n.locked-text {\n\tvertical-align: top;\n}\n\ntr.locked-info, tr.wp-locked .locked-info {\n\t-webkit-transition: height 1s, opacity 0.5s;\n\ttransition: height 1s, opacity 0.5s;\n}\n\n.fixed .column-comments .sorting-indicator {\n\tmargin-top: 3px;\n}\n\n#menu-locations-wrap .widefat {\n\twidth: 60%;\n}\n\n.widefat th.sortable,\n.widefat th.sorted {\n\tpadding: 0;\n}\n\nth.sortable a,\nth.sorted a {\n\tdisplay: block;\n\toverflow: hidden;\n\tpadding: 8px;\n}\n\n.fixed .column-comments.sortable a,\n.fixed .column-comments.sorted a {\n\tpadding: 8px 0;\n}\n\nth.sortable a span,\nth.sorted a span {\n\tfloat: right;\n\tcursor: pointer;\n}\n\nth.sorted .sorting-indicator,\nth.desc:hover span.sorting-indicator,\nth.desc a:focus span.sorting-indicator,\nth.asc:hover span.sorting-indicator,\nth.asc a:focus span.sorting-indicator {\n\tvisibility: visible;\n}\n\n/* Bulk Actions */\n.tablenav-pages a,\n.tablenav-pages-navspan {\n\tfont-weight: 600;\n\tpadding: 0 2px;\n}\n\n.tablenav-pages .current-page {\n\tmargin: 0 0 0 2px;\n\tpadding-bottom: 5px;\n\tfont-size: 13px;\n\ttext-align: center;\n}\n\n.tablenav .total-pages {\n\tmargin-left: 2px;\n}\n\n.tablenav #table-paging {\n\tmargin-right: 2px;\n}\n\n.tablenav a.button-secondary {\n\tdisplay: block;\n\tmargin: 3px 0 0 8px;\n}\n\n.tablenav {\n\tclear: both;\n\theight: 30px;\n\tmargin: 6px 0 4px;\n\tvertical-align: middle;\n}\n\n.tablenav.themes {\n\tmax-width: 98%;\n}\n\n.tablenav .tablenav-pages {\n\tfloat: left;\n\theight: 28px;\n\tmargin-top: 3px;\n\tcursor: default;\n\tcolor: #555;\n}\n\n.tablenav .no-pages,\n.tablenav .one-page .pagination-links {\n\tdisplay: none;\n}\n\n.tablenav .tablenav-pages a,\n.tablenav-pages span.current  {\n\ttext-decoration: none;\n\tpadding: 3px 6px;\n}\n\n.tablenav .tablenav-pages a,\n.tablenav-pages-navspan {\n\tdisplay: inline-block;\n\tmin-width: 17px;\n\tborder: 1px solid #d2d2d2;\n\tpadding: 3px 5px 7px;\n\tbackground: #e4e4e4;\n\tfont-size: 16px;\n\tline-height: 1;\n\tfont-weight: normal;\n\ttext-align: center;\n}\n\n.tablenav-pages-navspan {\n\theight: 16px;\n\tborder-color: #e8e8e8;\n\tbackground: #ebebeb;\n\tcolor: #b4b4b4;\n}\n\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n\tborder-color: #5b9dd9;\n\tcolor: #fff;\n\tbackground: #00a0d2;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none; /* IE8 */\n}\n\n.tablenav .displaying-num {\n\tmargin-left: 7px;\n}\n\n.tablenav .one-page .displaying-num {\n\tdisplay: inline-block;\n\tmargin-top: 5px;\n\tmargin-left: 0;\n}\n\n.tablenav .actions {\n\toverflow: hidden;\n\tpadding: 2px 0 0 8px;\n}\n\n.wp-filter .actions {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tablenav .delete {\n\tmargin-left: 20px;\n}\n\n/* @todo: unclear if the following tablenav rules are actually used.\nclasses exist in paginate_links() but not seen in list table output. */\n.tablenav .dots {\n\tborder-color: transparent;\n}\n\n.tablenav .next,\n.tablenav .prev {\n\tborder-color: transparent;\n\tcolor: #0073aa;\n}\n\n.tablenav .next:hover,\n.tablenav .prev:hover {\n\tborder-color: transparent;\n\tcolor: #00a0d2;\n}\n\n.tablenav .view-switch {\n\tfloat: left;\n\tmargin: 0 5px;\n\tpadding-top: 3px;\n}\n\n.wp-filter .view-switch {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tpadding: 12px 0;\n\tmargin: 0 2px 0 8px;\n}\n\n.media-toolbar.wp-filter .view-switch {\n\tmargin: 0 2px 0 12px;\n}\n\n.view-switch a {\n\tfloat: right;\n\twidth: 28px;\n\theight: 28px;\n\ttext-align: center;\n\tline-height: 24px;\n\ttext-decoration: none;\n}\n\n.view-switch a:before {\n\tcolor: #b4b9be;\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: middle;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.view-switch a:hover:before,\n.view-switch a:focus:before {\n\tcolor: #727272;\n}\n\n.view-switch a.current:before {\n\tcolor: #0073aa;\n}\n\n.view-switch .view-list:before {\n\tcontent: \"\\f163\";\n}\n\n.view-switch .view-excerpt:before {\n\tcontent: \"\\f164\";\n}\n\n.view-switch .view-grid:before {\n\tcontent: \"\\f509\";\n}\n\n.filter {\n\tfloat: right;\n\tmargin: -5px 10px 0 0;\n}\n\n.filter .subsubsub {\n\tmargin-right: -10px;\n\tmargin-top: 13px;\n}\n.screen-per-page {\n\twidth: 4em;\n}\n\n#posts-filter .wp-filter {\n\tmargin-bottom: 0;\n}\n\n#posts-filter fieldset {\n\tfloat: right;\n\tmargin: 0 0 1em 1.5ex;\n\tpadding: 0;\n}\n\n#posts-filter fieldset legend {\n\tpadding: 0 1px .2em 0;\n}\n\np.pagenav {\n\tmargin: 0;\n\tdisplay: inline;\n}\n\n.pagenav span {\n\tfont-weight: 600;\n\tmargin: 0 6px;\n}\n\n.row-title {\n\tfont-size: 14px !important;\n\tfont-weight: 600;\n}\n\n.column-comment .comment-author {\n\tmargin-bottom: 0.6em;\n}\n\n.column-author img,\n.column-username img,\n.column-comment .comment-author img {\n\tfloat: right;\n\tmargin-left: 10px;\n\tmargin-top: 1px;\n}\n\n.row-actions {\n\tcolor: #ddd;\n\tfont-size: 13px;\n\tpadding: 2px 0 0;\n\tposition: relative;\n\tright: -9999em;\n}\n\n/* ticket #34150 */\n.rtl .row-actions a {\n\tdisplay: inline-block;\n}\n\n.row-actions .network_only,\n.row-actions .network_active {\n\tcolor: #000;\n}\n\n.no-js .row-actions,\ntr:hover .row-actions,\n.mobile .row-actions,\n.row-actions.visible,\ndiv.comment-item:hover .row-actions {\n\tposition: static;\n}\n\n/* deprecated */\n.row-actions-visible {\n\tpadding: 2px 0 0;\n}\n\n\n/*------------------------------------------------------------------------------\n  10.1 - Inline Editing\n------------------------------------------------------------------------------*/\n\n/*\n.quick-edit* is for Quick Edit\n.bulk-edit* is for Bulk Edit\n.inline-edit* is for everything\n*/\n\n/*\tLayout */\n\n#wpbody-content .inline-edit-row fieldset {\n\tfont-size: 12px;\n\tfloat: right;\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 100%;\n}\n\ntr.inline-edit-row td,\n#wpbody-content .inline-edit-row fieldset .inline-edit-col {\n\tpadding: 0 0.5em;\n}\n\n#wpbody-content .quick-edit-row-post .inline-edit-col-left {\n\twidth: 40%;\n}\n\n#wpbody-content .quick-edit-row-post .inline-edit-col-right {\n\twidth: 39%;\n}\n\n#wpbody-content .inline-edit-row-post .inline-edit-col-center {\n\twidth: 20%;\n}\n\n#wpbody-content .quick-edit-row-page .inline-edit-col-left {\n\twidth: 50%;\n}\n\n#wpbody-content .quick-edit-row-page .inline-edit-col-right,\n#wpbody-content .bulk-edit-row-post .inline-edit-col-right {\n\twidth: 49%;\n}\n\n#wpbody-content .bulk-edit-row .inline-edit-col-left {\n\twidth: 30%;\n}\n\n#wpbody-content .bulk-edit-row-page .inline-edit-col-right {\n\twidth: 69%;\n}\n\n#wpbody-content .bulk-edit-row .inline-edit-col-bottom {\n\tfloat: left;\n\twidth: 69%;\n}\n\n#wpbody-content .inline-edit-row-page .inline-edit-col-right {\n\tmargin-top: 27px;\n}\n\n.inline-edit-row fieldset .inline-edit-group {\n\tclear: both;\n\tline-height: 2.5;\n}\n\n.inline-edit-row fieldset .inline-edit-group:after {\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tclear: both;\n\tvisibility: hidden;\n}\n\n.inline-edit-row p.submit {\n\tclear: both;\n\tpadding: 0.5em;\n\tmargin: 0.5em 0 0;\n}\n\n.inline-edit-row span.error {\n\tline-height: 22px;\n\tmargin: 0 15px;\n\tpadding: 3px 5px;\n}\n\n/*\tPositioning */\n\n/* Needs higher specificity for the padding */\n#the-list .inline-edit-row .inline-edit-legend {\n\tmargin: 0;\n\tpadding: 0.2em 0.5em 0;\n\tline-height: 2.5;\n\tfont-weight: 600;\n}\n\n#the-list #bulk-edit.inline-edit-row .inline-edit-legend {\n\tpadding: 0.2em 0.5em;\n}\n\n.inline-edit-row fieldset span.title,\n.inline-edit-row fieldset span.checkbox-title {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.inline-edit-row fieldset label,\n.inline-edit-row fieldset span.inline-edit-categories-label {\n\tdisplay: block;\n\tmargin: .2em 0;\n\tline-height: 2.5;\n}\n\n.inline-edit-row fieldset.inline-edit-date label {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tline-height: 1.5;\n\tvertical-align: baseline;\n}\n\n.inline-edit-row fieldset label.inline-edit-tags {\n\tmargin-top: 0;\n}\n\n.inline-edit-row fieldset label.inline-edit-tags span.title {\n\tmargin: .2em 0;\n\twidth: auto;\n}\n\n.inline-edit-row fieldset label span.title,\n.inline-edit-row fieldset.inline-edit-date legend {\n\tdisplay: block;\n\tfloat: right;\n\twidth: 6em;\n\tline-height: 2.5;\n}\n\n#posts-filter fieldset.inline-edit-date legend {\n\tpadding: 0;\n}\n\n.inline-edit-row fieldset.inline-edit-date select {\n\tmargin: 1px;\n\tline-height: 28px;\n}\n\n.inline-edit-row fieldset label span.input-text-wrap,\n.inline-edit-row fieldset .timestamp-wrap {\n\tdisplay: block;\n\tmargin-right: 6em;\n}\n\n.quick-edit-row-post fieldset.inline-edit-col-right label span.title {\n\twidth: auto;\n\tpadding-left: 0.5em;\n}\n\n.inline-edit-row .inline-edit-or {\n\tmargin: .2em 0 .2em 6px;\n\tline-height: 2.5;\n}\n\n.inline-edit-row .input-text-wrap input[type=text] {\n\twidth: 100%;\n}\n\n.inline-edit-row fieldset label input[type=checkbox] {\n\tvertical-align: middle;\n}\n\n.inline-edit-row fieldset label textarea {\n\twidth: 100%;\n\theight: 4em;\n\tvertical-align: top;\n}\n\n#wpbody-content .bulk-edit-row fieldset .inline-edit-group label {\n\tmax-width: 50%;\n}\n\n#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child {\n\tmargin-left: 0.5em\n}\n\n.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input {\n\twidth: 6em;\n}\n\n/*\tStyling */\n.inline-edit-row .inline-edit-legend {\n\ttext-transform: uppercase;\n}\n\n.inline-edit-row fieldset span.title,\n.inline-edit-row fieldset span.checkbox-title {\n\tfont-style: italic;\n}\n\n/*\tSpecific Elements */\n.inline-edit-row fieldset .inline-edit-date {\n\tfloat: right;\n}\n\n.inline-edit-row fieldset input[name=jj],\n.inline-edit-row fieldset input[name=hh],\n.inline-edit-row fieldset input[name=mn] {\n\tfont-size: 12px;\n\twidth: 2.3em;\n}\n\n.inline-edit-row fieldset input[name=aa] {\n\tfont-size: 12px;\n\twidth: 3.5em;\n}\n\n.inline-edit-row fieldset label input.inline-edit-password-input {\n\twidth: 8em;\n}\n\nul.cat-checklist {\n\theight: 12em;\n\tborder: solid 1px #ddd;\n\toverflow-y: scroll;\n\tpadding: 0 5px;\n\tmargin: 0;\n\tbackground-color: #fff;\n}\n\n#bulk-titles {\n\tdisplay: block;\n\theight: 12em;\n\tborder: 1px solid #ddd;\n\toverflow-y: scroll;\n\tpadding: 0 5px;\n\tmargin: 0 0 5px;\n}\n\n.inline-edit-row fieldset ul.cat-checklist li,\n.inline-edit-row fieldset ul.cat-checklist input {\n\tmargin: 0;\n\tposition: relative; /* RTL fix, #WP27629 */\n}\n\n.inline-edit-row fieldset ul.cat-checklist label,\n.inline-edit-row #bulk-titles div {\n\tfont-style: normal;\n\tfont-size: 11px;\n}\n\n.inline-edit-row fieldset label input.inline-edit-menu-order-input {\n\twidth: 3em;\n}\n\n.inline-edit-row fieldset label input.inline-edit-slug-input {\n\twidth: 75%;\n}\n\n.inline-edit-row #post_parent,\n.inline-edit-row select[name=\"page_template\"] {\n\tmax-width: 80%;\n}\n\n.ie8 .inline-edit-row #post_parent,\n.ie8 .inline-edit-row select[name=\"page_template\"] {\n\twidth: 250px;\n}\n\n.quick-edit-row-post fieldset label.inline-edit-status {\n\tfloat: right;\n}\n\n#bulk-titles {\n\tline-height: 140%;\n}\n#bulk-titles div {\n\tmargin: 0.2em 0.3em;\n}\n\n#bulk-titles div a {\n\tcursor: pointer;\n\tdisplay: block;\n\tfloat: right;\n\theight: 18px;\n\tmargin: 0 -2px 0 3px;\n\toverflow: hidden;\n\tposition: relative;\n\twidth: 20px;\n}\n\n#bulk-titles div a:before {\n\tposition: relative;\n\ttop: -3px;\n}\n\n/*------------------------------------------------------------------------------\n  17.0 - Plugins\n------------------------------------------------------------------------------*/\n\n.plugins tbody th.check-column,\n.plugins tbody {\n\tpadding: 8px 2px 0 0;\n}\n\n.plugins tbody th.check-column input[type=checkbox] {\n\tmargin-top: 4px;\n}\n\n#update-plugins-table tbody td p {\n\tmargin-top: 0;\n}\n\n#update-plugins-table tbody td p strong {\n\tfont-size: 14px;\n}\n\n.plugins thead td.check-column,\n.plugins tfoot td.check-column,\n.plugins .inactive th.check-column {\n\tpadding-right: 6px;\n}\n\n#update-plugins-table thead td.check-column,\n#update-plugins-table tfoot td.check-column {\n\tpadding-top: 11px;\n}\n\n.plugins,\n.plugins th,\n.plugins td {\n\tcolor: #000;\n}\n\n.plugins tr {\n\tbackground: #fff;\n}\n\n.plugins p {\n\tmargin: 0 4px;\n\tpadding: 0;\n}\n\n.plugins .desc p {\n\tmargin: 0 0 8px;\n}\n\n.plugins td.desc {\n\tline-height: 1.5em;\n}\n\n.plugins .desc ul,\n.plugins .desc ol {\n\tmargin: 0 2em 0 0;\n}\n\n.plugins .desc ul {\n\tlist-style-type: disc;\n}\n\n.plugins .row-actions {\n\tfont-size: 13px;\n\tpadding: 0;\n}\n\n.plugins .inactive td,\n.plugins .inactive th,\n.plugins .active td,\n.plugins .active th {\n\tpadding: 10px 9px;\n}\n\n.plugins .active td,\n.plugins .active th {\n\tbackground-color: #f7fcfe;\n}\n\n.plugins .update th,\n.plugins .update td {\n\tborder-bottom: 0;\n}\n\n.plugin-update-tr td {\n\tborder-top: 0;\n}\n\n.plugins .inactive td,\n.plugins .inactive th,\n.plugins .active td,\n.plugins .active th,\n.plugin-install #the-list td,\n.upgrade .plugins td,\n.upgrade .plugins th {\n\t-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n}\n\n.plugins tr.active.plugin-update-tr + tr.inactive th,\n.plugins tr.active.plugin-update-tr + tr.inactive td,\n.plugins tr.active + tr.inactive th,\n.plugins tr.active + tr.inactive td {\n\tborder-top: 1px solid rgba(0,0,0,0.03);\n\t-webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,0.02), inset 0 -1px 0 #e1e1e1;\n\tbox-shadow: inset 0 1px 0 rgba(0,0,0,0.02), inset 0 -1px 0 #e1e1e1;\n}\n\n.plugins .update td,\n.plugins .update th,\n.upgrade .plugins tr:last-of-type td,\n.upgrade .plugins tr:last-of-type th,\n.plugins tr.active + tr.inactive.update th,\n.plugins tr.active + tr.inactive.update td,\n.plugins .updated td,\n.plugins .updated th,\n.plugins tr.active + tr.inactive.updated th,\n.plugins tr.active + tr.inactive.updated td {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.plugins .active.update td,\n.plugins .active.update th,\ntr.active.update + tr.plugin-update-tr .plugin-update {\n\tbackground-color: #fef7f1;\n}\n\n.plugins .active th.check-column,\n.plugin-update-tr.active td {\n\tborder-right: 4px solid #00a0d2;\n}\n\n.plugins .active.update th.check-column,\n.plugins .active.update + .plugin-update-tr .plugin-update {\n\tborder-right: 4px solid #d54e21;\n}\n\n#wpbody-content .plugins .plugin-title,\n#wpbody-content .plugins .theme-title {\n\tpadding-left: 12px;\n\twhite-space:nowrap;\n}\n\n.plugins .inactive .plugin-title strong {\n\tfont-weight: 400;\n}\n\n.plugins .second,\n.plugins .row-actions {\n\tpadding: 0 0 5px;\n}\n\n.plugins .update .second,\n.plugins .update .row-actions,\n.plugins .updated .second,\n.plugins .updated .row-actions {\n\tpadding-bottom: 0;\n}\n\n.plugins-php .widefat tfoot th,\n.plugins-php .widefat tfoot td {\n\tborder-top-style: solid;\n\tborder-top-width: 1px;\n}\n\n.plugin-update-tr .update-message {\n\tfont-size: 13px;\n\tfont-weight: normal;\n\tmargin: 0 31px 8px 10px;\n\tpadding: 6px 40px 8px 12px;\n\tbackground-color: #f7f7f7;\n\tbackground-color: rgba(0,0,0,0.03);\n}\n\n.plugin-update-tr .update-message:before,\n.plugin-card .update-now:before,\n.plugin-card .install-now:before {\n\tcolor: #d54e21;\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tvertical-align: top;\n}\n\n.plugin-update-tr .update-message:before,\n.plugin-card .update-now:before {\n\tcontent: \"\\f463\";\n}\n\n.plugin-update-tr .update-message:before {\n\tmargin: 0 -30px 0 10px;\n}\n\n.plugin-card .update-now:before,\n.plugin-card .install-now:before {\n\tmargin: 3px -2px 0 5px;\n}\n\n.plugin-update-tr .updating-message:before,\n.plugin-card .updating-message:before {\n\tcontent: \"\\f463\";\n\t-webkit-animation: rotation 2s infinite linear;\n\tanimation: rotation 2s infinite linear;\n}\n\n@-webkit-keyframes rotation {\n\t0% {\n\t\t-webkit-transform: rotate(0deg);\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\t-webkit-transform: rotate(-359deg);\n\t\ttransform: rotate(-359deg);\n\t}\n}\n\n@keyframes rotation {\n\t0% {\n\t\t-webkit-transform: rotate(0deg);\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\t-webkit-transform: rotate(-359deg);\n\t\ttransform: rotate(-359deg);\n\t}\n}\n\n.plugin-update-tr .updated-message:before,\n.plugin-card .updated-message:before {\n\tcolor: #79ba49;\n\tcontent: \"\\f147\";\n}\n\n.wp-list-table.plugins tbody tr.plugin-update-tr td.plugin-update {\n\toverflow: hidden; /* clearfix */\n\tpadding: 0;\n\t-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n}\n\n/* update notices for active plugins */\ntr.active + tr.plugin-update-tr .plugin-update {\n\tbackground-color: #f7fcfe;\n}\n\ntr.active + tr.plugin-update-tr:not(.updated) .plugin-update .update-message {\n\tbackground-color: #fcf3ef;\n}\n\n.plugin-install-php h2 {\n\tclear: both;\n}\n\n.plugin-install-php h3 {\n\tmargin: 2.5em 0 8px;\n}\n\n.plugin-install-php .wp-filter {\n\tmargin-bottom: 0;\n}\n\n/* Plugin card table view */\n.plugin-group {\n\toverflow: hidden; /* clearfix */\n\tmargin-top: 1.5em;\n}\n\n.plugin-group h3 {\n\tmargin-top: 0;\n}\n\n.plugin-card {\n\tfloat: right;\n\tmargin: 0 8px 16px;\n\twidth: 48.5%;\n\twidth: -webkit-calc( 50% - 8px );\n\twidth: calc( 50% - 8px );\n\tbackground-color: #fff;\n\tborder: 1px solid #dedede;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.plugin-card:nth-child(odd) {\n\tclear: both;\n\tmargin-right: 0;\n}\n\n.plugin-card:nth-child(even) {\n\tmargin-left: 0;\n}\n\n@media screen and ( min-width: 1600px ) {\n\t.plugin-card {\n\t\twidth: 30%;\n\t\twidth: -webkit-calc( 33.1% - 8px );\n\t\twidth: calc( 33.1% - 8px );\n\t}\n\n\t.plugin-card:nth-child(odd) {\n\t\tclear: none;\n\t\tmargin-right: 8px;\n\t}\n\n\t.plugin-card:nth-child(even) {\n\t\tmargin-left: 8px;\n\t}\n\n\t.plugin-card:nth-child(3n+1) {\n\t\tclear: both;\n\t\tmargin-right: 0;\n\t}\n\n\t.plugin-card:nth-child(3n) {\n\t\tmargin-left: 0;\n\t}\n}\n\n.plugin-card-top {\n\tposition: relative;\n\tpadding: 20px 20px 10px;\n\tmin-height: 135px;\n}\n\ndiv.action-links,\n.plugin-action-buttons {\n\tmargin: 0; /* Override existing margins */\n}\n\n.plugin-card h3 {\n\tmargin: 0 0 12px;\n\tfont-size: 18px;\n\tline-height: 1.3;\n}\n\n.plugin-card .name,\n.plugin-card .desc {\n\tmargin-right: 148px; /* icon + margin */\n\tmargin-left: 120px; /* action links */\n}\n\n.plugin-card .action-links {\n\tposition: absolute;\n\ttop: 20px;\n\tleft: 20px;\n\twidth: 120px;\n}\n\n.plugin-action-buttons {\n\tclear: left;\n\tfloat: left;\n\tmargin-right: 2em;\n\tmargin-bottom: 1em;\n\ttext-align: left;\n}\n\n.plugin-action-buttons li {\n\tmargin-bottom: 10px;\n}\n\n.plugin-card-bottom {\n\tclear: both;\n\tpadding: 12px 20px;\n\tbackground-color: #fafafa;\n\tborder-top: 1px solid #dedede;\n\toverflow: hidden;\n}\n\n.plugin-card-bottom .star-rating {\n\tdisplay: inline;\n}\n\n.plugin-card-update-failed .update-now {\n\tfont-weight: 600;\n}\n\n.plugin-card-update-failed .notice-error {\n\tmargin: 0;\n\tpadding-right: 16px;\n\t-webkit-box-shadow: 0 -1px 0 #dedede;\n\tbox-shadow: 0 -1px 0 #dedede;\n}\n\n.plugin-card-update-failed .plugin-card-bottom {\n\tdisplay: none;\n}\n\n.plugin-card .column-rating {\n\tline-height: 23px;\n}\n\n.plugin-card .column-rating,\n.plugin-card .column-updated {\n\tmargin-bottom: 4px;\n}\n\n.plugin-card .column-rating,\n.plugin-card .column-downloaded {\n\tfloat: right;\n\tclear: right;\n\tmax-width: 180px;\n}\n\n.plugin-card .column-updated,\n.plugin-card .column-compatibility {\n\ttext-align: left;\n\tfloat: left;\n\tclear: left;\n\twidth: 65%;\n\twidth: -webkit-calc( 100% - 180px );\n\twidth: calc( 100% - 180px );\n}\n\n.plugin-card .column-compatibility span:before {\n\tfont: normal 20px/.5 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0;\n\ttop: 4px;\n\tright: -2px;\n\tposition: relative;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #444;\n}\n\n.plugin-card .compatibility-incompatible:before {\n\tcontent: \"\\f158\";\n}\n\n.plugin-card .compatibility-compatible:before {\n\tcontent: \"\\f147\";\n}\n\n.plugin-icon {\n\tposition: absolute;\n\ttop: 20px;\n\tright: 20px;\n\twidth: 128px;\n\theight: 128px;\n\tmargin: 0 0 20px 20px;\n}\n\n.no-plugin-results {\n\tcolor: #999;\n\tfont-size: 18px;\n\tfont-style: normal;\n\tmargin: 0;\n\tpadding: 100px 0 0;\n\ttext-align: center;\n}\n\n/* ms */\n/* Background Color for Site Status */\n.wp-list-table .site-deleted,\n.wp-list-table tr.site-deleted {\n\tbackground: #ff8573;\n}\n.wp-list-table .site-spammed,\n.wp-list-table tr.site-spammed {\n\tbackground: #faafaa;\n}\n.wp-list-table .site-archived,\n.wp-list-table tr.site-archived {\n\tbackground: #ffebe8;\n}\n.wp-list-table .site-mature,\n.wp-list-table tr.site-mature {\n\tbackground: #fecac2;\n}\n\n.sites.fixed .column-lastupdated,\n.sites.fixed .column-registered {\n\twidth: 20%;\n}\n\n.sites.fixed .column-users {\n\twidth: 80px;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n@media screen and ( max-width: 1100px ) and ( min-width: 782px ), ( max-width: 480px ) {\n\t.plugin-card .action-links {\n\t\tposition: static;\n\t\tmargin-right: 148px;\n\t\twidth: auto;\n\t}\n\n\t.plugin-action-buttons {\n\t\tfloat: none;\n\t\tmargin: 1em 0 0;\n\t\ttext-align: right;\n\t}\n\n\t.plugin-action-buttons li {\n\t\tdisplay: inline-block;\n\t\tvertical-align: middle;\n\t}\n\n\t.plugin-action-buttons li .button {\n\t\tmargin-left: 20px;\n\t}\n\n\t.plugin-card .name,\n\t.plugin-card .desc {\n\t\tmargin-left: 0;\n\t}\n\n\t.plugin-card .desc p:first-of-type {\n\t\tmargin-top: 0;\n\t}\n\n\t.fixed .column-date {\n\t\twidth: 14%;\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t/* WP List Table Options & Filters */\n\t.tablenav {\n\t\theight: auto;\n\t}\n\n\t.tablenav.top {\n\t\tmargin: 20px 0 5px 0;\n\t}\n\n\t.tablenav.bottom {\n\t\tposition: relative;\n\t\tmargin-top: 15px;\n\t}\n\n\t.tablenav br {\n\t\tdisplay: none;\n\t}\n\n\t.tablenav br.clear {\n\t\tdisplay: block;\n\t}\n\n\t.tablenav.top .actions,\n\t.tablenav .view-switch {\n\t\tdisplay: none;\n\t}\n\n\t.view-switch a {\n\t\twidth: 36px;\n\t\theight: 36px;\n\t\tline-height: 33px;\n\t}\n\n\t/* Pagination */\n\t.tablenav.top .displaying-num {\n\t\tdisplay: none;\n\t}\n\n\t.tablenav.bottom .displaying-num {\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\ttop: 11px;\n\t\tmargin: 0;\n\t\tfont-size: 14px;\n\t}\n\n\t.tablenav .tablenav-pages {\n\t\twidth: 100%;\n\t\theight: auto;\n\t\ttext-align: center;\n\t\tmargin: 0 0 25px;\n\t}\n\n\t.tablenav.bottom .tablenav-pages {\n\t\tmargin-top: 25px;\n\t}\n\n\t.tablenav.top .tablenav-pages.one-page {\n\t\tdisplay: none;\n\t}\n\n\t.tablenav.bottom .tablenav-pages.one-page {\n\t\tmargin: 15px 0 0 0;\n\t\theight: 0;\n\t}\n\n\t.tablenav-pages .pagination-links {\n\t\tfont-size: 16px;\n\t}\n\n\t.tablenav-pages .pagination-links a,\n\t.tablenav-pages-navspan {\n\t\tpadding: 9px 11px 12px;\n\t\tfont-size: 18px;\n\t}\n\n\t.tablenav-pages-navspan {\n\t\theight: 18px;\n\t}\n\n\t.tablenav-pages .pagination-links .current-page {\n\t\tpadding: 8px 9px 9px;\n\t\tfont-size: 16px;\n\t}\n\n\t/* WP List Table Adjustments: General */\n\t.form-wrap > p {\n\t\tdisplay: none;\n\t}\n\n\t.comment-count {\n\t\tfont-size: 14px;\n\t}\n\n\t.wp-list-table th.column-primary ~ th,\n\t.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {\n\t\tdisplay: none;\n\t}\n\n\t.wp-list-table thead th.column-primary {\n\t\twidth: 100%;\n\t}\n\n\t/* Checkboxes need to show */\n\t.wp-list-table tr th.check-column {\n\t\tdisplay: table-cell;\n\t\twidth: 35px;\n\t}\n\n\t.wp-list-table .column-primary .toggle-row {\n\t\tdisplay: block;\n\t}\n\n\t.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column) {\n\t\tposition: relative;\n\t\tclear: both;\n\t\tdisplay: block;\n\t\twidth: auto !important; /* needs to override some columns that are more specifically targeted */\n\t}\n\n\t.wp-list-table td.column-primary {\n\t\tpadding-left: 50px; /* space for toggle button */\n\t}\n\n\t.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {\n\t\tpadding: 3px 35% 3px 8px;\n\t}\n\n\t.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before {\n\t\tposition: absolute;\n\t\tright: 10px; /* match padding of regular table cell */\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\twidth: 32%; /* leave a little space for a gutter */\n\t\tcontent: attr(data-colname);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t.wp-list-table .is-expanded td:not(.hidden) {\n\t\tdisplay: block !important;\n\t\toverflow: hidden; /* clearfix */\n\t}\n\n\t/* Special cases */\n\t.widefat .num,\n\t.column-posts {\n\t\ttext-align: right;\n\t}\n\n\t#comments-form .fixed .column-author,\n\t#commentsdiv .fixed .column-author {\n\t\tdisplay: none !important;\n\t}\n\n\t.fixed .column-comment .comment-author {\n\t\tdisplay: block;\n\t}\n\n\t#the-comment-list .is-expanded td {\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t}\n\n\t#the-comment-list .is-expanded td:last-child {\n\t\t-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t\tbox-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t}\n\n\t/* Show comment bubble as text instead */\n\t.post-com-count .screen-reader-text {\n\t\tposition: static;\n\t\twidth: auto;\n\t\theight: auto;\n\t\tmargin: 0;\n\t}\n\n\t.column-response .post-com-count-no-comments:after,\n\t.column-response .post-com-count-approved:after,\n\t.column-comments .post-com-count-no-comments:after,\n\t.column-comments .post-com-count-approved:after {\n\t\tcontent: none;\n\t}\n\n\t.column-response .post-com-count [aria-hidden=\"true\"],\n\t.column-comments .post-com-count [aria-hidden=\"true\"] {\n\t\tdisplay: none;\n\t}\n\n\t.column-response .post-com-count-wrapper,\n\t.column-comments .post-com-count-wrapper {\n\t\twhite-space: normal;\n\t}\n\n\t.column-response .post-com-count-wrapper > a,\n\t.column-comments .post-com-count-wrapper > a {\n\t\tdisplay: block;\n\t}\n\n\t.column-response .post-com-count-no-comments,\n\t.column-response .post-com-count-approved,\n\t.column-comments .post-com-count-no-comments,\n\t.column-comments .post-com-count-approved {\n\t\tmargin-top: 0;\n\t\tmargin-left: 0.5em;\n\t}\n\n\t.column-response .post-com-count-pending,\n\t.column-comments .post-com-count-pending {\n\t\tposition: static;\n\t\theight: auto;\n\t\tmin-width: 0;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\t-webkit-border-radius: 0;\n\t\tborder-radius: 0;\n\t\tbackground: none;\n\t\tcolor: #bb2a2a;\n\t\tfont-size: inherit;\n\t\tline-height: inherit;\n\t\ttext-align: right;\n\t}\n\n\t.column-response .post-com-count-pending:hover,\n\t.column-comments .post-com-count-pending:hover {\n\t\tcolor: #dc3232;\n\t}\n\n\t.widefat thead td.check-column,\n\t.widefat tfoot td.check-column {\n\t\tpadding-top: 10px;\n\t}\n\n\t.widefat * {\n\t\tword-wrap: normal;\n\t}\n\n\t/* Quick Edit and Bulk Edit */\n\t#wpbody-content .quick-edit-row-post .inline-edit-col-left,\n\t#wpbody-content .quick-edit-row-post .inline-edit-col-right,\n\t#wpbody-content .inline-edit-row-post .inline-edit-col-center,\n\t#wpbody-content .quick-edit-row-page .inline-edit-col-left,\n\t#wpbody-content .quick-edit-row-page .inline-edit-col-right,\n\t#wpbody-content .bulk-edit-row-post .inline-edit-col-right,\n\t#wpbody-content .bulk-edit-row .inline-edit-col-left,\n\t#wpbody-content .bulk-edit-row-page .inline-edit-col-right,\n\t#wpbody-content .bulk-edit-row .inline-edit-col-bottom {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\n\t#wpbody-content .quick-edit-row fieldset .inline-edit-col label,\n\t#wpbody-content .quick-edit-row fieldset .inline-edit-group label,\n\t#wpbody-content .bulk-edit-row fieldset .inline-edit-col label,\n\t#wpbody-content .bulk-edit-row fieldset .inline-edit-group label {\n\t\tmax-width: none;\n\t\tfloat: none;\n\t\tmargin-bottom: 5px;\n\t}\n\n\t#wpbody .bulk-edit-row fieldset select {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tmax-width: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.inline-edit-row fieldset ul.cat-checklist label,\n\t.inline-edit-row #bulk-titles div {\n\t\tfont-size: 16px;\n\t}\n\n\t.inline-edit-row fieldset label span.title,\n\t.inline-edit-row fieldset.inline-edit-date legend {\n\t\tfloat: none;\n\t}\n\n\t.inline-edit-row fieldset label.inline-edit-tags {\n\t\tpadding: 0 0.5em;\n\t}\n\n\t.inline-edit-row fieldset .inline-edit-col label.inline-edit-tags {\n\t\tpadding: 0;\n\t}\n\n\t.inline-edit-row fieldset label span.input-text-wrap,\n\t.inline-edit-row fieldset .timestamp-wrap {\n\t\tmargin-right: 0;\n\t}\n\n\t.inline-edit-row fieldset input[name=jj],\n\t.inline-edit-row fieldset input[name=hh],\n\t.inline-edit-row fieldset input[name=mn] {\n\t\twidth: 3em;\n\t}\n\n\t.inline-edit-row fieldset input[name=aa] {\n\t\twidth: 4.5em;\n\t}\n\n\t.inline-edit-row .inline-edit-or {\n\t\tmargin: 0 0 0 6px;\n\t}\n\n\t#edithead .inside,\n\t#commentsdiv #edithead .inside {\n\t\tfloat: none;\n\t\ttext-align: right;\n\t\tpadding: 3px 5px;\n\t}\n\n\t#commentsdiv #edithead .inside input,\n\t#edithead .inside input {\n\t\twidth: 100%;\n\t}\n\n\t#edithead label {\n\t\tdisplay: block;\n\t}\n\n\t#bulk-titles div {\n\t\tmargin: 0.8em 0.3em;\n\t}\n\n\t#bulk-titles div a {\n\t\theight: 22px;\n\t}\n\n\t/* Updates */\n\t#wpbody-content #update-themes-table .plugin-title {\n\t\twidth: auto;\n\t\twhite-space: normal;\n\t}\n\n\t/* Links */\n\t.link-manager-php #posts-filter {\n\t\tmargin-top: 25px;\n\t}\n\n\t.link-manager-php .tablenav.bottom {\n\t\toverflow: hidden;\n\t}\n\n\t/* List tables that don't toggle rows */\n\t.comments-box .toggle-row,\n\t.wp-list-table.plugins .toggle-row {\n\t\tdisplay: none;\n\t}\n\n\t/* Plugin/Theme Management */\n\t#wpbody-content .wp-list-table.plugins td {\n\t\tdisplay: block;\n\t\twidth: auto;\n\t\tpadding: 10px 9px; /* reset from other list tables that have a label at this width */\n\t}\n\n\t#wpbody-content .wp-list-table.plugins .column-description {\n\t\tpadding-top: 2px;\n\t}\n\n\t.wp-list-table.plugins .plugin-title,\n\t.wp-list-table.plugins .theme-title {\n\t\tpadding-top: 13px;\n\t\tpadding-bottom: 4px;\n\t}\n\n\t.plugins #the-list tr > td:not(:last-child),\n\t.plugins #the-list .update th,\n\t.plugins #the-list .update td,\n\t.wp-list-table.plugins #the-list .theme-title {\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t\tborder-top: none;\n\t}\n\n\t.plugins #the-list tr td {\n\t\tborder-top: none;\n\t}\n\n\t.plugins tbody {\n\t\tpadding: 1px 0 0;\n\t}\n\n\t.plugins tr.active + tr.inactive th.check-column,\n\t.plugins tr.active + tr.inactive td.column-description,\n\t.plugins .plugin-update-tr:before {\n\t\t-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t\tbox-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t}\n\n\t.plugins tr.active + tr.inactive th.check-column,\n\t.plugins tr.active + tr.inactive td {\n\t\tborder-top: none;\n\t}\n\n\t/* mimic the checkbox th */\n\t.plugins .plugin-update-tr:before {\n\t\tcontent: \"\";\n\t\tdisplay: table-cell;\n\t}\n\n\t.plugins .active.update + .plugin-update-tr:before {\n\t\tborder-right: 4px solid #d54e21;\n\t\tbackground-color: #fef7f1;\n\t}\n\n\t.plugins #the-list .plugin-update-tr .plugin-update {\n\t\tborder-right: none;\n\t}\n\n\t.plugin-update-tr .update-message {\n\t\tmargin-right: 0;\n\t}\n\n\t.wp-list-table.plugins .plugin-title strong,\n\t.wp-list-table.plugins .theme-title strong {\n\t\tfont-size: 1.4em;\n\t\tline-height: 1.6em;\n\t}\n\n\t/* Add New plugins page */\n\ttable.plugin-install .column-name,\n\ttable.plugin-install .column-version,\n\ttable.plugin-install .column-rating,\n\ttable.plugin-install .column-description {\n\t\tdisplay: block;\n\t\twidth: auto;\n\t}\n\n\ttable.plugin-install th.column-name,\n\ttable.plugin-install th.column-version,\n\ttable.plugin-install th.column-rating,\n\ttable.plugin-install th.column-description {\n\t\tdisplay: none;\n\t}\n\n\ttable.plugin-install td.column-name strong {\n\t\tfont-size: 1.4em;\n\t\tline-height: 1.6em;\n\t}\n\n\ttable.plugin-install #the-list td {\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t}\n\n\ttable.plugin-install #the-list tr {\n\t\tdisplay: block;\n\t\t-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n\t\tbox-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n\t}\n\n\t.plugin-card {\n\t\tmargin-right: 0;\n\t\tmargin-left: 0;\n\t\twidth: 100%;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/list-tables.css",
    "content": ".response-links {\n\tdisplay: block;\n\tmargin-bottom: 1em;\n}\n\n.response-links a {\n\tdisplay: block;\n}\n\n.response-links a.comments-edit-item-link {\n\tfont-weight: 600;\n}\n\n.response-links a.comments-view-item-link {\n\tfont-size: 12px;\n}\n\n.post-com-count-wrapper strong {\n\tfont-weight: 400;\n}\n\n.comments-view-item-link {\n\tdisplay: inline-block;\n\tclear: both;\n}\n\n.column-response .post-com-count-wrapper,\n.column-comments .post-com-count-wrapper {\n\twhite-space: nowrap;\n\tword-wrap: normal;\n}\n\n/* comments bubble common */\n.column-response .post-com-count,\n.column-comments .post-com-count {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n/* comments bubble approved */\n.column-response .post-com-count-no-comments,\n.column-response .post-com-count-approved,\n.column-comments .post-com-count-no-comments,\n.column-comments .post-com-count-approved {\n\tmargin-top: 5px;\n}\n\n.column-response .comment-count-no-comments,\n.column-response .comment-count-approved,\n.column-comments .comment-count-no-comments,\n.column-comments .comment-count-approved {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tdisplay: block;\n\tpadding: 0 8px;\n\tmin-width: 24px;\n\theight: 2em;\n\t-webkit-border-radius: 5px;\n\tborder-radius: 5px;\n\tbackground-color: #72777c;\n\tcolor: #fff;\n\tfont-size: 11px;\n\tline-height: 21px;\n\ttext-align: center;\n}\n\n.ie8 .column-response .comment-count-no-comments,\n.ie8 .column-response .comment-count-approved,\n.ie8 .column-comments .comment-count-no-comments,\n.ie8 .column-comments .comment-count-approved {\n\tmin-width: 0;\n}\n\n.column-response .post-com-count-no-comments:after,\n.column-response .post-com-count-approved:after,\n.column-comments .post-com-count-no-comments:after,\n.column-comments .post-com-count-approved:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tmargin-left: 8px;\n\twidth: 0;\n\theight: 0;\n\tborder-top: 5px solid #72777c;\n\tborder-right: 5px solid transparent;\n}\n\n.column-response .post-com-count-approved:hover .comment-count-approved,\n.column-response .post-com-count-approved:focus .comment-count-approved,\n.column-comments .post-com-count-approved:hover .comment-count-approved,\n.column-comments .post-com-count-approved:focus .comment-count-approved {\n\tbackground: #0073aa;\n}\n\n.column-response .post-com-count-approved:hover:after,\n.column-response .post-com-count-approved:focus:after,\n.column-comments .post-com-count-approved:hover:after,\n.column-comments .post-com-count-approved:focus:after {\n\tborder-top-color: #0073aa;\n}\n\n/* comments bubble pending */\n.column-response .post-com-count-pending,\n.column-comments .post-com-count-pending {\n\tposition: relative;\n\tleft: -3px;\n\tpadding: 0 5px;\n\tmin-width: 7px;\n\theight: 17px;\n\tborder: 2px solid #fff;\n\t-webkit-border-radius: 11px;\n\tborder-radius: 11px;\n\tbackground: #ca4a1f;\n\tcolor: #fff;\n\tfont-size: 9px;\n\tline-height: 17px;\n\ttext-align: center;\n}\n\n.column-response .post-com-count-no-pending,\n.column-comments .post-com-count-no-pending {\n\tdisplay: none;\n}\n\n/* comments */\n\n.commentlist li {\n\tpadding: 1em 1em .2em;\n\tmargin: 0;\n\tborder-bottom: 1px solid #ccc;\n}\n\n.commentlist li li {\n\tborder-bottom: 0;\n\tpadding: 0;\n}\n\n.commentlist p {\n\tpadding: 0;\n\tmargin: 0 0 .8em;\n}\n\n#submitted-on,\n.submitted-on {\n\tcolor: #777;\n}\n\n/* reply to comments */\n#replyrow td {\n\tpadding: 2px;\n}\n\n#replysubmit {\n\tmargin: 0;\n\tpadding: 5px 7px 10px;\n\toverflow: hidden;\n\ttext-align: center;\n}\n\n#replysubmit .button {\n\tmargin-right: 5px;\n}\n\n#replysubmit .error {\n\tcolor: red;\n\tline-height: 21px;\n\ttext-align: center;\n}\n\n#replyrow.inline-edit-row fieldset.comment-reply {\n\tfont-size: inherit;\n\tline-height: inherit;\n}\n\n#replyrow legend {\n\tmargin: 0;\n\tpadding: .2em 5px 0;\n\tfont-size: 13px;\n\tline-height: 1.4;\n\tfont-weight: 600;\n}\n\n#replyrow.inline-edit-row label {\n\tdisplay: inline;\n\tvertical-align: baseline;\n\tline-height: inherit;\n}\n\n#edithead .inside,\n#commentsdiv #edithead .inside {\n\tfloat: left;\n\tpadding: 3px 0 2px 5px;\n\tmargin: 0;\n\ttext-align: center;\n}\n\n#edithead .inside input {\n\twidth: 180px;\n}\n\n#edithead label {\n\tpadding: 2px 0;\n}\n\n#replycontainer {\n\tpadding: 5px;\n}\n\n#replycontent {\n\theight: 120px;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#replyerror {\n\tborder-color: #ddd;\n\tbackground-color: #f9f9f9;\n}\n\n/* @todo: is this used? */\n.commentlist .avatar {\n\tvertical-align: text-top;\n}\n\n#the-comment-list tr.undo,\n#the-comment-list div.undo {\n\tbackground-color: #f4f4f4;\n}\n\n#the-comment-list .unapproved th,\n#the-comment-list .unapproved td {\n\tbackground-color: #fef7f1;\n}\n\n#the-comment-list .unapproved th.check-column {\n\tborder-left: 4px solid #d54e21;\n}\n\n#the-comment-list .unapproved th.check-column input {\n\tmargin-left: 4px;\n}\n\n#the-comment-list .approve a {\n\tcolor: #006505;\n}\n\n#the-comment-list .unapprove a {\n\tcolor: #d98500;\n}\n\n#the-comment-list th,\n#the-comment-list td {\n\t-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\tbox-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n}\n\n#the-comment-list tr:last-child th,\n#the-comment-list tr:last-child td {\n    -webkit-box-shadow: none;\n    box-shadow: none;\n}\n\n#the-comment-list tr.unapproved + tr.approved th,\n#the-comment-list tr.unapproved + tr.approved td {\n    border-top: 1px solid rgba(0, 0, 0, 0.03);\n}\n\n/* table vim shortcuts */\n.vim-current,\n.vim-current th,\n.vim-current td {\n\tbackground-color: #e4f2fd !important;\n}\n\nth .comment-grey-bubble {\n\theight: 16px;\n\twidth: 16px;\n}\n\nth .comment-grey-bubble:before {\n\tcontent: \"\\f101\";\n\tfont: normal 20px/.5 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0;\n\ttop: 4px;\n\tleft: -4px;\n\tposition: relative;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #444;\n}\n\n/*------------------------------------------------------------------------------\n  10.0 - List Posts (/Pages/etc)\n------------------------------------------------------------------------------*/\n\ntable.fixed {\n\ttable-layout: fixed;\n}\n\n.fixed .column-rating,\n.fixed .column-visible {\n\twidth: 8%;\n}\n\n.fixed .column-posts,\n.fixed .column-date,\n.fixed .column-parent,\n.fixed .column-links,\n.fixed .column-author,\n.fixed .column-format {\n\twidth: 10%;\n}\n\n.fixed .column-posts {\n\twidth: 74px;\n}\n\n.fixed .column-comment .comment-author {\n\tdisplay: none;\n}\n\n.fixed .column-response,\n.fixed .column-categories,\n.fixed .column-tags,\n.fixed .column-rel,\n.fixed .column-role {\n\twidth: 15%;\n}\n\n.fixed .column-slug {\n\twidth: 25%;\n}\n\n.fixed .column-locations {\n\twidth: 35%;\n}\n\n.fixed .column-comments {\n\twidth: 5.5em;\n\tpadding: 8px 0;\n\ttext-align: left;\n}\n\n.fixed .column-comments .vers {\n\tpadding-left: 3px;\n}\n\ntd.column-title strong,\ntd.plugin-title strong {\n\tdisplay: block;\n\tmargin-bottom: .2em;\n\tfont-size: 14px;\n}\n\ntd.column-title p,\ntd.plugin-title p {\n\tmargin: 6px 0;\n}\n\n/* Media file column */\ntable.media .column-title .media-icon {\n\tfloat: left;\n\tmin-height: 60px;\n \tmargin: 0 9px 0 0;\n}\n\ntable.media .column-title .media-icon img {\n\tmax-width: 60px;\n\theight: auto;\n\tvertical-align: top; /* Remove descender white-space. */\n}\n\ntable.media .column-title .has-media-icon ~ .row-actions {\n\tmargin-left: 70px; /* 60px image + margin */\n}\n\ntable.media .column-title .filename {\n\tmargin-bottom: 0.2em;\n}\n\n/* @todo: pick a consistent list table selector */\n.wp-list-table a {\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n#the-list tr:last-child td,\n#the-list tr:last-child th {\n\tborder-bottom: none !important;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#comments-form .fixed .column-author {\n\twidth: 20%;\n}\n\n#comments-form .fixed .column-date {\n\twidth: 14%;\n}\n\n#commentsdiv.postbox .inside {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#commentsdiv .inside .row-actions {\n\tline-height:18px;\n}\n\n#commentsdiv .inside .column-author {\n\twidth: 25%;\n}\n\n#commentsdiv .column-comment p {\n\tmargin: 0.6em 0;\n\tpadding: 0;\n}\n\n#commentsdiv #replyrow td {\n\tpadding: 0;\n}\n\n#commentsdiv p {\n\tpadding: 8px 10px;\n\tmargin: 0;\n}\n\n#commentsdiv .comments-box {\n\tborder: 0 none;\n}\n\n#commentsdiv .comments-box thead th,\n#commentsdiv .comments-box thead td {\n\tbackground: transparent;\n\tpadding: 0 7px 4px;\n\tfont-style: italic;\n}\n\n#commentsdiv .comments-box tr:last-child td {\n\tborder-bottom: 0 none;\n}\n\n#commentsdiv #edithead .inside input {\n\twidth: 160px;\n}\n\n.sorting-indicator {\n\tdisplay: block;\n\tvisibility: hidden;\n\twidth: 10px;\n\theight: 4px;\n\tmargin-top: 8px;\n\tmargin-left: 7px;\n}\n\n.sorting-indicator:before {\n\tcontent: \"\\f142\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0;\n\ttop: -4px;\n\tleft: -8px;\n\tcolor: #444;\n\tline-height: 10px;\n\tposition: relative;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #444;\n}\n\n.column-comments .sorting-indicator:before {\n\ttop: 0;\n\tleft: -10px;\n}\n\nth.sorted.asc .sorting-indicator:before,\nth.desc:hover span.sorting-indicator:before,\nth.desc a:focus span.sorting-indicator:before {\n\tcontent: \"\\f142\";\n}\n\nth.sorted.desc .sorting-indicator:before,\nth.asc:hover span.sorting-indicator:before,\nth.asc a:focus span.sorting-indicator:before {\n\tcontent: \"\\f140\";\n}\n\n.wp-list-table .toggle-row {\n\tposition: absolute;\n\tright: 8px;\n\ttop: 10px;\n\tdisplay: none;\n\tpadding: 0;\n\twidth: 40px;\n\theight: 40px;\n\tborder: none;\n\toutline: none;\n\tbackground: transparent;\n}\n\n.wp-list-table .toggle-row:hover {\n\tcursor: pointer;\n}\n\n.wp-list-table .toggle-row:focus:before {\n    -webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 .wp-list-table .toggle-row:focus:before {\n\toutline: #5b9dd9 solid 1px;\n}\n\n.wp-list-table .toggle-row:active {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-list-table .toggle-row:before {\n\tposition: absolute;\n\ttop: -5px;\n\tleft: 10px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tdisplay: block;\n\tpadding: 1px 2px 1px 0;\n\tcolor: #666;\n\tcontent: \"\\f140\";\n\tfont: normal 20px/1 dashicons;\n\tline-height: 1;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tspeak: none;\n}\n\n.wp-list-table .is-expanded .toggle-row:before {\n\tcontent: \"\\f142\";\n}\n\ntr.wp-locked .locked-indicator {\n\tmargin-left: 6px;\n\theight: 20px;\n\twidth: 16px;\n}\n\ntr.wp-locked .locked-indicator:before {\n\tcolor: #82878c;\n\tcontent: \"\\f160\";\n\tdisplay: inline-block;\n\tfloat: left;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: middle;\n\tmargin-left: 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\ntr.wp-locked .check-column label,\ntr.wp-locked .check-column input[type=\"checkbox\"],\ntr.wp-locked .row-actions .inline,\ntr.wp-locked .row-actions .trash {\n\tdisplay: none;\n}\n\ntr .locked-info {\n\theight: 0;\n\topacity: 0;\n}\n\ntr.wp-locked .locked-info {\n\tmargin-top: 8px;\n\theight: auto;\n\topacity: 1;\n}\n\n.locked-text {\n\tvertical-align: top;\n}\n\ntr.locked-info, tr.wp-locked .locked-info {\n\t-webkit-transition: height 1s, opacity 0.5s;\n\ttransition: height 1s, opacity 0.5s;\n}\n\n.fixed .column-comments .sorting-indicator {\n\tmargin-top: 3px;\n}\n\n#menu-locations-wrap .widefat {\n\twidth: 60%;\n}\n\n.widefat th.sortable,\n.widefat th.sorted {\n\tpadding: 0;\n}\n\nth.sortable a,\nth.sorted a {\n\tdisplay: block;\n\toverflow: hidden;\n\tpadding: 8px;\n}\n\n.fixed .column-comments.sortable a,\n.fixed .column-comments.sorted a {\n\tpadding: 8px 0;\n}\n\nth.sortable a span,\nth.sorted a span {\n\tfloat: left;\n\tcursor: pointer;\n}\n\nth.sorted .sorting-indicator,\nth.desc:hover span.sorting-indicator,\nth.desc a:focus span.sorting-indicator,\nth.asc:hover span.sorting-indicator,\nth.asc a:focus span.sorting-indicator {\n\tvisibility: visible;\n}\n\n/* Bulk Actions */\n.tablenav-pages a,\n.tablenav-pages-navspan {\n\tfont-weight: 600;\n\tpadding: 0 2px;\n}\n\n.tablenav-pages .current-page {\n\tmargin: 0 2px 0 0;\n\tpadding-bottom: 5px;\n\tfont-size: 13px;\n\ttext-align: center;\n}\n\n.tablenav .total-pages {\n\tmargin-right: 2px;\n}\n\n.tablenav #table-paging {\n\tmargin-left: 2px;\n}\n\n.tablenav a.button-secondary {\n\tdisplay: block;\n\tmargin: 3px 8px 0 0;\n}\n\n.tablenav {\n\tclear: both;\n\theight: 30px;\n\tmargin: 6px 0 4px;\n\tvertical-align: middle;\n}\n\n.tablenav.themes {\n\tmax-width: 98%;\n}\n\n.tablenav .tablenav-pages {\n\tfloat: right;\n\theight: 28px;\n\tmargin-top: 3px;\n\tcursor: default;\n\tcolor: #555;\n}\n\n.tablenav .no-pages,\n.tablenav .one-page .pagination-links {\n\tdisplay: none;\n}\n\n.tablenav .tablenav-pages a,\n.tablenav-pages span.current  {\n\ttext-decoration: none;\n\tpadding: 3px 6px;\n}\n\n.tablenav .tablenav-pages a,\n.tablenav-pages-navspan {\n\tdisplay: inline-block;\n\tmin-width: 17px;\n\tborder: 1px solid #d2d2d2;\n\tpadding: 3px 5px 7px;\n\tbackground: #e4e4e4;\n\tfont-size: 16px;\n\tline-height: 1;\n\tfont-weight: normal;\n\ttext-align: center;\n}\n\n.tablenav-pages-navspan {\n\theight: 16px;\n\tborder-color: #e8e8e8;\n\tbackground: #ebebeb;\n\tcolor: #b4b4b4;\n}\n\n.tablenav .tablenav-pages a:hover,\n.tablenav .tablenav-pages a:focus {\n\tborder-color: #5b9dd9;\n\tcolor: #fff;\n\tbackground: #00a0d2;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none; /* IE8 */\n}\n\n.tablenav .displaying-num {\n\tmargin-right: 7px;\n}\n\n.tablenav .one-page .displaying-num {\n\tdisplay: inline-block;\n\tmargin-top: 5px;\n\tmargin-right: 0;\n}\n\n.tablenav .actions {\n\toverflow: hidden;\n\tpadding: 2px 8px 0 0;\n}\n\n.wp-filter .actions {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tablenav .delete {\n\tmargin-right: 20px;\n}\n\n/* @todo: unclear if the following tablenav rules are actually used.\nclasses exist in paginate_links() but not seen in list table output. */\n.tablenav .dots {\n\tborder-color: transparent;\n}\n\n.tablenav .next,\n.tablenav .prev {\n\tborder-color: transparent;\n\tcolor: #0073aa;\n}\n\n.tablenav .next:hover,\n.tablenav .prev:hover {\n\tborder-color: transparent;\n\tcolor: #00a0d2;\n}\n\n.tablenav .view-switch {\n\tfloat: right;\n\tmargin: 0 5px;\n\tpadding-top: 3px;\n}\n\n.wp-filter .view-switch {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tpadding: 12px 0;\n\tmargin: 0 8px 0 2px;\n}\n\n.media-toolbar.wp-filter .view-switch {\n\tmargin: 0 12px 0 2px;\n}\n\n.view-switch a {\n\tfloat: left;\n\twidth: 28px;\n\theight: 28px;\n\ttext-align: center;\n\tline-height: 24px;\n\ttext-decoration: none;\n}\n\n.view-switch a:before {\n\tcolor: #b4b9be;\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: middle;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.view-switch a:hover:before,\n.view-switch a:focus:before {\n\tcolor: #727272;\n}\n\n.view-switch a.current:before {\n\tcolor: #0073aa;\n}\n\n.view-switch .view-list:before {\n\tcontent: \"\\f163\";\n}\n\n.view-switch .view-excerpt:before {\n\tcontent: \"\\f164\";\n}\n\n.view-switch .view-grid:before {\n\tcontent: \"\\f509\";\n}\n\n.filter {\n\tfloat: left;\n\tmargin: -5px 0 0 10px;\n}\n\n.filter .subsubsub {\n\tmargin-left: -10px;\n\tmargin-top: 13px;\n}\n.screen-per-page {\n\twidth: 4em;\n}\n\n#posts-filter .wp-filter {\n\tmargin-bottom: 0;\n}\n\n#posts-filter fieldset {\n\tfloat: left;\n\tmargin: 0 1.5ex 1em 0;\n\tpadding: 0;\n}\n\n#posts-filter fieldset legend {\n\tpadding: 0 0 .2em 1px;\n}\n\np.pagenav {\n\tmargin: 0;\n\tdisplay: inline;\n}\n\n.pagenav span {\n\tfont-weight: 600;\n\tmargin: 0 6px;\n}\n\n.row-title {\n\tfont-size: 14px !important;\n\tfont-weight: 600;\n}\n\n.column-comment .comment-author {\n\tmargin-bottom: 0.6em;\n}\n\n.column-author img,\n.column-username img,\n.column-comment .comment-author img {\n\tfloat: left;\n\tmargin-right: 10px;\n\tmargin-top: 1px;\n}\n\n.row-actions {\n\tcolor: #ddd;\n\tfont-size: 13px;\n\tpadding: 2px 0 0;\n\tposition: relative;\n\tleft: -9999em;\n}\n\n/* ticket #34150 */\n.rtl .row-actions a {\n\tdisplay: inline-block;\n}\n\n.row-actions .network_only,\n.row-actions .network_active {\n\tcolor: #000;\n}\n\n.no-js .row-actions,\ntr:hover .row-actions,\n.mobile .row-actions,\n.row-actions.visible,\ndiv.comment-item:hover .row-actions {\n\tposition: static;\n}\n\n/* deprecated */\n.row-actions-visible {\n\tpadding: 2px 0 0;\n}\n\n\n/*------------------------------------------------------------------------------\n  10.1 - Inline Editing\n------------------------------------------------------------------------------*/\n\n/*\n.quick-edit* is for Quick Edit\n.bulk-edit* is for Bulk Edit\n.inline-edit* is for everything\n*/\n\n/*\tLayout */\n\n#wpbody-content .inline-edit-row fieldset {\n\tfont-size: 12px;\n\tfloat: left;\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 100%;\n}\n\ntr.inline-edit-row td,\n#wpbody-content .inline-edit-row fieldset .inline-edit-col {\n\tpadding: 0 0.5em;\n}\n\n#wpbody-content .quick-edit-row-post .inline-edit-col-left {\n\twidth: 40%;\n}\n\n#wpbody-content .quick-edit-row-post .inline-edit-col-right {\n\twidth: 39%;\n}\n\n#wpbody-content .inline-edit-row-post .inline-edit-col-center {\n\twidth: 20%;\n}\n\n#wpbody-content .quick-edit-row-page .inline-edit-col-left {\n\twidth: 50%;\n}\n\n#wpbody-content .quick-edit-row-page .inline-edit-col-right,\n#wpbody-content .bulk-edit-row-post .inline-edit-col-right {\n\twidth: 49%;\n}\n\n#wpbody-content .bulk-edit-row .inline-edit-col-left {\n\twidth: 30%;\n}\n\n#wpbody-content .bulk-edit-row-page .inline-edit-col-right {\n\twidth: 69%;\n}\n\n#wpbody-content .bulk-edit-row .inline-edit-col-bottom {\n\tfloat: right;\n\twidth: 69%;\n}\n\n#wpbody-content .inline-edit-row-page .inline-edit-col-right {\n\tmargin-top: 27px;\n}\n\n.inline-edit-row fieldset .inline-edit-group {\n\tclear: both;\n\tline-height: 2.5;\n}\n\n.inline-edit-row fieldset .inline-edit-group:after {\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tclear: both;\n\tvisibility: hidden;\n}\n\n.inline-edit-row p.submit {\n\tclear: both;\n\tpadding: 0.5em;\n\tmargin: 0.5em 0 0;\n}\n\n.inline-edit-row span.error {\n\tline-height: 22px;\n\tmargin: 0 15px;\n\tpadding: 3px 5px;\n}\n\n/*\tPositioning */\n\n/* Needs higher specificity for the padding */\n#the-list .inline-edit-row .inline-edit-legend {\n\tmargin: 0;\n\tpadding: 0.2em 0.5em 0;\n\tline-height: 2.5;\n\tfont-weight: 600;\n}\n\n#the-list #bulk-edit.inline-edit-row .inline-edit-legend {\n\tpadding: 0.2em 0.5em;\n}\n\n.inline-edit-row fieldset span.title,\n.inline-edit-row fieldset span.checkbox-title {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.inline-edit-row fieldset label,\n.inline-edit-row fieldset span.inline-edit-categories-label {\n\tdisplay: block;\n\tmargin: .2em 0;\n\tline-height: 2.5;\n}\n\n.inline-edit-row fieldset.inline-edit-date label {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tline-height: 1.5;\n\tvertical-align: baseline;\n}\n\n.inline-edit-row fieldset label.inline-edit-tags {\n\tmargin-top: 0;\n}\n\n.inline-edit-row fieldset label.inline-edit-tags span.title {\n\tmargin: .2em 0;\n\twidth: auto;\n}\n\n.inline-edit-row fieldset label span.title,\n.inline-edit-row fieldset.inline-edit-date legend {\n\tdisplay: block;\n\tfloat: left;\n\twidth: 6em;\n\tline-height: 2.5;\n}\n\n#posts-filter fieldset.inline-edit-date legend {\n\tpadding: 0;\n}\n\n.inline-edit-row fieldset.inline-edit-date select {\n\tmargin: 1px;\n\tline-height: 28px;\n}\n\n.inline-edit-row fieldset label span.input-text-wrap,\n.inline-edit-row fieldset .timestamp-wrap {\n\tdisplay: block;\n\tmargin-left: 6em;\n}\n\n.quick-edit-row-post fieldset.inline-edit-col-right label span.title {\n\twidth: auto;\n\tpadding-right: 0.5em;\n}\n\n.inline-edit-row .inline-edit-or {\n\tmargin: .2em 6px .2em 0;\n\tline-height: 2.5;\n}\n\n.inline-edit-row .input-text-wrap input[type=text] {\n\twidth: 100%;\n}\n\n.inline-edit-row fieldset label input[type=checkbox] {\n\tvertical-align: middle;\n}\n\n.inline-edit-row fieldset label textarea {\n\twidth: 100%;\n\theight: 4em;\n\tvertical-align: top;\n}\n\n#wpbody-content .bulk-edit-row fieldset .inline-edit-group label {\n\tmax-width: 50%;\n}\n\n#wpbody-content .quick-edit-row fieldset .inline-edit-group label.alignleft:first-child {\n\tmargin-right: 0.5em\n}\n\n.inline-edit-col-right .input-text-wrap input.inline-edit-menu-order-input {\n\twidth: 6em;\n}\n\n/*\tStyling */\n.inline-edit-row .inline-edit-legend {\n\ttext-transform: uppercase;\n}\n\n.inline-edit-row fieldset span.title,\n.inline-edit-row fieldset span.checkbox-title {\n\tfont-style: italic;\n}\n\n/*\tSpecific Elements */\n.inline-edit-row fieldset .inline-edit-date {\n\tfloat: left;\n}\n\n.inline-edit-row fieldset input[name=jj],\n.inline-edit-row fieldset input[name=hh],\n.inline-edit-row fieldset input[name=mn] {\n\tfont-size: 12px;\n\twidth: 2.3em;\n}\n\n.inline-edit-row fieldset input[name=aa] {\n\tfont-size: 12px;\n\twidth: 3.5em;\n}\n\n.inline-edit-row fieldset label input.inline-edit-password-input {\n\twidth: 8em;\n}\n\nul.cat-checklist {\n\theight: 12em;\n\tborder: solid 1px #ddd;\n\toverflow-y: scroll;\n\tpadding: 0 5px;\n\tmargin: 0;\n\tbackground-color: #fff;\n}\n\n#bulk-titles {\n\tdisplay: block;\n\theight: 12em;\n\tborder: 1px solid #ddd;\n\toverflow-y: scroll;\n\tpadding: 0 5px;\n\tmargin: 0 0 5px;\n}\n\n.inline-edit-row fieldset ul.cat-checklist li,\n.inline-edit-row fieldset ul.cat-checklist input {\n\tmargin: 0;\n\tposition: relative; /* RTL fix, #WP27629 */\n}\n\n.inline-edit-row fieldset ul.cat-checklist label,\n.inline-edit-row #bulk-titles div {\n\tfont-style: normal;\n\tfont-size: 11px;\n}\n\n.inline-edit-row fieldset label input.inline-edit-menu-order-input {\n\twidth: 3em;\n}\n\n.inline-edit-row fieldset label input.inline-edit-slug-input {\n\twidth: 75%;\n}\n\n.inline-edit-row #post_parent,\n.inline-edit-row select[name=\"page_template\"] {\n\tmax-width: 80%;\n}\n\n.ie8 .inline-edit-row #post_parent,\n.ie8 .inline-edit-row select[name=\"page_template\"] {\n\twidth: 250px;\n}\n\n.quick-edit-row-post fieldset label.inline-edit-status {\n\tfloat: left;\n}\n\n#bulk-titles {\n\tline-height: 140%;\n}\n#bulk-titles div {\n\tmargin: 0.2em 0.3em;\n}\n\n#bulk-titles div a {\n\tcursor: pointer;\n\tdisplay: block;\n\tfloat: left;\n\theight: 18px;\n\tmargin: 0 3px 0 -2px;\n\toverflow: hidden;\n\tposition: relative;\n\twidth: 20px;\n}\n\n#bulk-titles div a:before {\n\tposition: relative;\n\ttop: -3px;\n}\n\n/*------------------------------------------------------------------------------\n  17.0 - Plugins\n------------------------------------------------------------------------------*/\n\n.plugins tbody th.check-column,\n.plugins tbody {\n\tpadding: 8px 0 0 2px;\n}\n\n.plugins tbody th.check-column input[type=checkbox] {\n\tmargin-top: 4px;\n}\n\n#update-plugins-table tbody td p {\n\tmargin-top: 0;\n}\n\n#update-plugins-table tbody td p strong {\n\tfont-size: 14px;\n}\n\n.plugins thead td.check-column,\n.plugins tfoot td.check-column,\n.plugins .inactive th.check-column {\n\tpadding-left: 6px;\n}\n\n#update-plugins-table thead td.check-column,\n#update-plugins-table tfoot td.check-column {\n\tpadding-top: 11px;\n}\n\n.plugins,\n.plugins th,\n.plugins td {\n\tcolor: #000;\n}\n\n.plugins tr {\n\tbackground: #fff;\n}\n\n.plugins p {\n\tmargin: 0 4px;\n\tpadding: 0;\n}\n\n.plugins .desc p {\n\tmargin: 0 0 8px;\n}\n\n.plugins td.desc {\n\tline-height: 1.5em;\n}\n\n.plugins .desc ul,\n.plugins .desc ol {\n\tmargin: 0 0 0 2em;\n}\n\n.plugins .desc ul {\n\tlist-style-type: disc;\n}\n\n.plugins .row-actions {\n\tfont-size: 13px;\n\tpadding: 0;\n}\n\n.plugins .inactive td,\n.plugins .inactive th,\n.plugins .active td,\n.plugins .active th {\n\tpadding: 10px 9px;\n}\n\n.plugins .active td,\n.plugins .active th {\n\tbackground-color: #f7fcfe;\n}\n\n.plugins .update th,\n.plugins .update td {\n\tborder-bottom: 0;\n}\n\n.plugin-update-tr td {\n\tborder-top: 0;\n}\n\n.plugins .inactive td,\n.plugins .inactive th,\n.plugins .active td,\n.plugins .active th,\n.plugin-install #the-list td,\n.upgrade .plugins td,\n.upgrade .plugins th {\n\t-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n}\n\n.plugins tr.active.plugin-update-tr + tr.inactive th,\n.plugins tr.active.plugin-update-tr + tr.inactive td,\n.plugins tr.active + tr.inactive th,\n.plugins tr.active + tr.inactive td {\n\tborder-top: 1px solid rgba(0,0,0,0.03);\n\t-webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,0.02), inset 0 -1px 0 #e1e1e1;\n\tbox-shadow: inset 0 1px 0 rgba(0,0,0,0.02), inset 0 -1px 0 #e1e1e1;\n}\n\n.plugins .update td,\n.plugins .update th,\n.upgrade .plugins tr:last-of-type td,\n.upgrade .plugins tr:last-of-type th,\n.plugins tr.active + tr.inactive.update th,\n.plugins tr.active + tr.inactive.update td,\n.plugins .updated td,\n.plugins .updated th,\n.plugins tr.active + tr.inactive.updated th,\n.plugins tr.active + tr.inactive.updated td {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.plugins .active.update td,\n.plugins .active.update th,\ntr.active.update + tr.plugin-update-tr .plugin-update {\n\tbackground-color: #fef7f1;\n}\n\n.plugins .active th.check-column,\n.plugin-update-tr.active td {\n\tborder-left: 4px solid #00a0d2;\n}\n\n.plugins .active.update th.check-column,\n.plugins .active.update + .plugin-update-tr .plugin-update {\n\tborder-left: 4px solid #d54e21;\n}\n\n#wpbody-content .plugins .plugin-title,\n#wpbody-content .plugins .theme-title {\n\tpadding-right: 12px;\n\twhite-space:nowrap;\n}\n\n.plugins .inactive .plugin-title strong {\n\tfont-weight: 400;\n}\n\n.plugins .second,\n.plugins .row-actions {\n\tpadding: 0 0 5px;\n}\n\n.plugins .update .second,\n.plugins .update .row-actions,\n.plugins .updated .second,\n.plugins .updated .row-actions {\n\tpadding-bottom: 0;\n}\n\n.plugins-php .widefat tfoot th,\n.plugins-php .widefat tfoot td {\n\tborder-top-style: solid;\n\tborder-top-width: 1px;\n}\n\n.plugin-update-tr .update-message {\n\tfont-size: 13px;\n\tfont-weight: normal;\n\tmargin: 0 10px 8px 31px;\n\tpadding: 6px 12px 8px 40px;\n\tbackground-color: #f7f7f7;\n\tbackground-color: rgba(0,0,0,0.03);\n}\n\n.plugin-update-tr .update-message:before,\n.plugin-card .update-now:before,\n.plugin-card .install-now:before {\n\tcolor: #d54e21;\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tvertical-align: top;\n}\n\n.plugin-update-tr .update-message:before,\n.plugin-card .update-now:before {\n\tcontent: \"\\f463\";\n}\n\n.plugin-update-tr .update-message:before {\n\tmargin: 0 10px 0 -30px;\n}\n\n.plugin-card .update-now:before,\n.plugin-card .install-now:before {\n\tmargin: 3px 5px 0 -2px;\n}\n\n.plugin-update-tr .updating-message:before,\n.plugin-card .updating-message:before {\n\tcontent: \"\\f463\";\n\t-webkit-animation: rotation 2s infinite linear;\n\tanimation: rotation 2s infinite linear;\n}\n\n@-webkit-keyframes rotation {\n\t0% {\n\t\t-webkit-transform: rotate(0deg);\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\t-webkit-transform: rotate(359deg);\n\t\ttransform: rotate(359deg);\n\t}\n}\n\n@keyframes rotation {\n\t0% {\n\t\t-webkit-transform: rotate(0deg);\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\t-webkit-transform: rotate(359deg);\n\t\ttransform: rotate(359deg);\n\t}\n}\n\n.plugin-update-tr .updated-message:before,\n.plugin-card .updated-message:before {\n\tcolor: #79ba49;\n\tcontent: \"\\f147\";\n}\n\n.wp-list-table.plugins tbody tr.plugin-update-tr td.plugin-update {\n\toverflow: hidden; /* clearfix */\n\tpadding: 0;\n\t-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n}\n\n/* update notices for active plugins */\ntr.active + tr.plugin-update-tr .plugin-update {\n\tbackground-color: #f7fcfe;\n}\n\ntr.active + tr.plugin-update-tr:not(.updated) .plugin-update .update-message {\n\tbackground-color: #fcf3ef;\n}\n\n.plugin-install-php h2 {\n\tclear: both;\n}\n\n.plugin-install-php h3 {\n\tmargin: 2.5em 0 8px;\n}\n\n.plugin-install-php .wp-filter {\n\tmargin-bottom: 0;\n}\n\n/* Plugin card table view */\n.plugin-group {\n\toverflow: hidden; /* clearfix */\n\tmargin-top: 1.5em;\n}\n\n.plugin-group h3 {\n\tmargin-top: 0;\n}\n\n.plugin-card {\n\tfloat: left;\n\tmargin: 0 8px 16px;\n\twidth: 48.5%;\n\twidth: -webkit-calc( 50% - 8px );\n\twidth: calc( 50% - 8px );\n\tbackground-color: #fff;\n\tborder: 1px solid #dedede;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.plugin-card:nth-child(odd) {\n\tclear: both;\n\tmargin-left: 0;\n}\n\n.plugin-card:nth-child(even) {\n\tmargin-right: 0;\n}\n\n@media screen and ( min-width: 1600px ) {\n\t.plugin-card {\n\t\twidth: 30%;\n\t\twidth: -webkit-calc( 33.1% - 8px );\n\t\twidth: calc( 33.1% - 8px );\n\t}\n\n\t.plugin-card:nth-child(odd) {\n\t\tclear: none;\n\t\tmargin-left: 8px;\n\t}\n\n\t.plugin-card:nth-child(even) {\n\t\tmargin-right: 8px;\n\t}\n\n\t.plugin-card:nth-child(3n+1) {\n\t\tclear: both;\n\t\tmargin-left: 0;\n\t}\n\n\t.plugin-card:nth-child(3n) {\n\t\tmargin-right: 0;\n\t}\n}\n\n.plugin-card-top {\n\tposition: relative;\n\tpadding: 20px 20px 10px;\n\tmin-height: 135px;\n}\n\ndiv.action-links,\n.plugin-action-buttons {\n\tmargin: 0; /* Override existing margins */\n}\n\n.plugin-card h3 {\n\tmargin: 0 0 12px;\n\tfont-size: 18px;\n\tline-height: 1.3;\n}\n\n.plugin-card .name,\n.plugin-card .desc {\n\tmargin-left: 148px; /* icon + margin */\n\tmargin-right: 120px; /* action links */\n}\n\n.plugin-card .action-links {\n\tposition: absolute;\n\ttop: 20px;\n\tright: 20px;\n\twidth: 120px;\n}\n\n.plugin-action-buttons {\n\tclear: right;\n\tfloat: right;\n\tmargin-left: 2em;\n\tmargin-bottom: 1em;\n\ttext-align: right;\n}\n\n.plugin-action-buttons li {\n\tmargin-bottom: 10px;\n}\n\n.plugin-card-bottom {\n\tclear: both;\n\tpadding: 12px 20px;\n\tbackground-color: #fafafa;\n\tborder-top: 1px solid #dedede;\n\toverflow: hidden;\n}\n\n.plugin-card-bottom .star-rating {\n\tdisplay: inline;\n}\n\n.plugin-card-update-failed .update-now {\n\tfont-weight: 600;\n}\n\n.plugin-card-update-failed .notice-error {\n\tmargin: 0;\n\tpadding-left: 16px;\n\t-webkit-box-shadow: 0 -1px 0 #dedede;\n\tbox-shadow: 0 -1px 0 #dedede;\n}\n\n.plugin-card-update-failed .plugin-card-bottom {\n\tdisplay: none;\n}\n\n.plugin-card .column-rating {\n\tline-height: 23px;\n}\n\n.plugin-card .column-rating,\n.plugin-card .column-updated {\n\tmargin-bottom: 4px;\n}\n\n.plugin-card .column-rating,\n.plugin-card .column-downloaded {\n\tfloat: left;\n\tclear: left;\n\tmax-width: 180px;\n}\n\n.plugin-card .column-updated,\n.plugin-card .column-compatibility {\n\ttext-align: right;\n\tfloat: right;\n\tclear: right;\n\twidth: 65%;\n\twidth: -webkit-calc( 100% - 180px );\n\twidth: calc( 100% - 180px );\n}\n\n.plugin-card .column-compatibility span:before {\n\tfont: normal 20px/.5 dashicons;\n\tspeak: none;\n\tdisplay: inline-block;\n\tpadding: 0;\n\ttop: 4px;\n\tleft: -2px;\n\tposition: relative;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-decoration: none !important;\n\tcolor: #444;\n}\n\n.plugin-card .compatibility-incompatible:before {\n\tcontent: \"\\f158\";\n}\n\n.plugin-card .compatibility-compatible:before {\n\tcontent: \"\\f147\";\n}\n\n.plugin-icon {\n\tposition: absolute;\n\ttop: 20px;\n\tleft: 20px;\n\twidth: 128px;\n\theight: 128px;\n\tmargin: 0 20px 20px 0;\n}\n\n.no-plugin-results {\n\tcolor: #999;\n\tfont-size: 18px;\n\tfont-style: normal;\n\tmargin: 0;\n\tpadding: 100px 0 0;\n\ttext-align: center;\n}\n\n/* ms */\n/* Background Color for Site Status */\n.wp-list-table .site-deleted,\n.wp-list-table tr.site-deleted {\n\tbackground: #ff8573;\n}\n.wp-list-table .site-spammed,\n.wp-list-table tr.site-spammed {\n\tbackground: #faafaa;\n}\n.wp-list-table .site-archived,\n.wp-list-table tr.site-archived {\n\tbackground: #ffebe8;\n}\n.wp-list-table .site-mature,\n.wp-list-table tr.site-mature {\n\tbackground: #fecac2;\n}\n\n.sites.fixed .column-lastupdated,\n.sites.fixed .column-registered {\n\twidth: 20%;\n}\n\n.sites.fixed .column-users {\n\twidth: 80px;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n@media screen and ( max-width: 1100px ) and ( min-width: 782px ), ( max-width: 480px ) {\n\t.plugin-card .action-links {\n\t\tposition: static;\n\t\tmargin-left: 148px;\n\t\twidth: auto;\n\t}\n\n\t.plugin-action-buttons {\n\t\tfloat: none;\n\t\tmargin: 1em 0 0;\n\t\ttext-align: left;\n\t}\n\n\t.plugin-action-buttons li {\n\t\tdisplay: inline-block;\n\t\tvertical-align: middle;\n\t}\n\n\t.plugin-action-buttons li .button {\n\t\tmargin-right: 20px;\n\t}\n\n\t.plugin-card .name,\n\t.plugin-card .desc {\n\t\tmargin-right: 0;\n\t}\n\n\t.plugin-card .desc p:first-of-type {\n\t\tmargin-top: 0;\n\t}\n\n\t.fixed .column-date {\n\t\twidth: 14%;\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t/* WP List Table Options & Filters */\n\t.tablenav {\n\t\theight: auto;\n\t}\n\n\t.tablenav.top {\n\t\tmargin: 20px 0 5px 0;\n\t}\n\n\t.tablenav.bottom {\n\t\tposition: relative;\n\t\tmargin-top: 15px;\n\t}\n\n\t.tablenav br {\n\t\tdisplay: none;\n\t}\n\n\t.tablenav br.clear {\n\t\tdisplay: block;\n\t}\n\n\t.tablenav.top .actions,\n\t.tablenav .view-switch {\n\t\tdisplay: none;\n\t}\n\n\t.view-switch a {\n\t\twidth: 36px;\n\t\theight: 36px;\n\t\tline-height: 33px;\n\t}\n\n\t/* Pagination */\n\t.tablenav.top .displaying-num {\n\t\tdisplay: none;\n\t}\n\n\t.tablenav.bottom .displaying-num {\n\t\tposition: absolute;\n\t\tright: 0;\n\t\ttop: 11px;\n\t\tmargin: 0;\n\t\tfont-size: 14px;\n\t}\n\n\t.tablenav .tablenav-pages {\n\t\twidth: 100%;\n\t\theight: auto;\n\t\ttext-align: center;\n\t\tmargin: 0 0 25px;\n\t}\n\n\t.tablenav.bottom .tablenav-pages {\n\t\tmargin-top: 25px;\n\t}\n\n\t.tablenav.top .tablenav-pages.one-page {\n\t\tdisplay: none;\n\t}\n\n\t.tablenav.bottom .tablenav-pages.one-page {\n\t\tmargin: 15px 0 0 0;\n\t\theight: 0;\n\t}\n\n\t.tablenav-pages .pagination-links {\n\t\tfont-size: 16px;\n\t}\n\n\t.tablenav-pages .pagination-links a,\n\t.tablenav-pages-navspan {\n\t\tpadding: 9px 11px 12px;\n\t\tfont-size: 18px;\n\t}\n\n\t.tablenav-pages-navspan {\n\t\theight: 18px;\n\t}\n\n\t.tablenav-pages .pagination-links .current-page {\n\t\tpadding: 8px 9px 9px;\n\t\tfont-size: 16px;\n\t}\n\n\t/* WP List Table Adjustments: General */\n\t.form-wrap > p {\n\t\tdisplay: none;\n\t}\n\n\t.comment-count {\n\t\tfont-size: 14px;\n\t}\n\n\t.wp-list-table th.column-primary ~ th,\n\t.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {\n\t\tdisplay: none;\n\t}\n\n\t.wp-list-table thead th.column-primary {\n\t\twidth: 100%;\n\t}\n\n\t/* Checkboxes need to show */\n\t.wp-list-table tr th.check-column {\n\t\tdisplay: table-cell;\n\t\twidth: 35px;\n\t}\n\n\t.wp-list-table .column-primary .toggle-row {\n\t\tdisplay: block;\n\t}\n\n\t.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column) {\n\t\tposition: relative;\n\t\tclear: both;\n\t\tdisplay: block;\n\t\twidth: auto !important; /* needs to override some columns that are more specifically targeted */\n\t}\n\n\t.wp-list-table td.column-primary {\n\t\tpadding-right: 50px; /* space for toggle button */\n\t}\n\n\t.wp-list-table tr:not(.inline-edit-row):not(.no-items) td.column-primary ~ td:not(.check-column) {\n\t\tpadding: 3px 8px 3px 35%;\n\t}\n\n\t.wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.column-primary)::before {\n\t\tposition: absolute;\n\t\tleft: 10px; /* match padding of regular table cell */\n\t\tdisplay: block;\n\t\toverflow: hidden;\n\t\twidth: 32%; /* leave a little space for a gutter */\n\t\tcontent: attr(data-colname);\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t.wp-list-table .is-expanded td:not(.hidden) {\n\t\tdisplay: block !important;\n\t\toverflow: hidden; /* clearfix */\n\t}\n\n\t/* Special cases */\n\t.widefat .num,\n\t.column-posts {\n\t\ttext-align: left;\n\t}\n\n\t#comments-form .fixed .column-author,\n\t#commentsdiv .fixed .column-author {\n\t\tdisplay: none !important;\n\t}\n\n\t.fixed .column-comment .comment-author {\n\t\tdisplay: block;\n\t}\n\n\t#the-comment-list .is-expanded td {\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t}\n\n\t#the-comment-list .is-expanded td:last-child {\n\t\t-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t\tbox-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t}\n\n\t/* Show comment bubble as text instead */\n\t.post-com-count .screen-reader-text {\n\t\tposition: static;\n\t\twidth: auto;\n\t\theight: auto;\n\t\tmargin: 0;\n\t}\n\n\t.column-response .post-com-count-no-comments:after,\n\t.column-response .post-com-count-approved:after,\n\t.column-comments .post-com-count-no-comments:after,\n\t.column-comments .post-com-count-approved:after {\n\t\tcontent: none;\n\t}\n\n\t.column-response .post-com-count [aria-hidden=\"true\"],\n\t.column-comments .post-com-count [aria-hidden=\"true\"] {\n\t\tdisplay: none;\n\t}\n\n\t.column-response .post-com-count-wrapper,\n\t.column-comments .post-com-count-wrapper {\n\t\twhite-space: normal;\n\t}\n\n\t.column-response .post-com-count-wrapper > a,\n\t.column-comments .post-com-count-wrapper > a {\n\t\tdisplay: block;\n\t}\n\n\t.column-response .post-com-count-no-comments,\n\t.column-response .post-com-count-approved,\n\t.column-comments .post-com-count-no-comments,\n\t.column-comments .post-com-count-approved {\n\t\tmargin-top: 0;\n\t\tmargin-right: 0.5em;\n\t}\n\n\t.column-response .post-com-count-pending,\n\t.column-comments .post-com-count-pending {\n\t\tposition: static;\n\t\theight: auto;\n\t\tmin-width: 0;\n\t\tpadding: 0;\n\t\tborder: none;\n\t\t-webkit-border-radius: 0;\n\t\tborder-radius: 0;\n\t\tbackground: none;\n\t\tcolor: #bb2a2a;\n\t\tfont-size: inherit;\n\t\tline-height: inherit;\n\t\ttext-align: left;\n\t}\n\n\t.column-response .post-com-count-pending:hover,\n\t.column-comments .post-com-count-pending:hover {\n\t\tcolor: #dc3232;\n\t}\n\n\t.widefat thead td.check-column,\n\t.widefat tfoot td.check-column {\n\t\tpadding-top: 10px;\n\t}\n\n\t.widefat * {\n\t\tword-wrap: normal;\n\t}\n\n\t/* Quick Edit and Bulk Edit */\n\t#wpbody-content .quick-edit-row-post .inline-edit-col-left,\n\t#wpbody-content .quick-edit-row-post .inline-edit-col-right,\n\t#wpbody-content .inline-edit-row-post .inline-edit-col-center,\n\t#wpbody-content .quick-edit-row-page .inline-edit-col-left,\n\t#wpbody-content .quick-edit-row-page .inline-edit-col-right,\n\t#wpbody-content .bulk-edit-row-post .inline-edit-col-right,\n\t#wpbody-content .bulk-edit-row .inline-edit-col-left,\n\t#wpbody-content .bulk-edit-row-page .inline-edit-col-right,\n\t#wpbody-content .bulk-edit-row .inline-edit-col-bottom {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\n\t#wpbody-content .quick-edit-row fieldset .inline-edit-col label,\n\t#wpbody-content .quick-edit-row fieldset .inline-edit-group label,\n\t#wpbody-content .bulk-edit-row fieldset .inline-edit-col label,\n\t#wpbody-content .bulk-edit-row fieldset .inline-edit-group label {\n\t\tmax-width: none;\n\t\tfloat: none;\n\t\tmargin-bottom: 5px;\n\t}\n\n\t#wpbody .bulk-edit-row fieldset select {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tmax-width: none;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t}\n\n\t.inline-edit-row fieldset ul.cat-checklist label,\n\t.inline-edit-row #bulk-titles div {\n\t\tfont-size: 16px;\n\t}\n\n\t.inline-edit-row fieldset label span.title,\n\t.inline-edit-row fieldset.inline-edit-date legend {\n\t\tfloat: none;\n\t}\n\n\t.inline-edit-row fieldset label.inline-edit-tags {\n\t\tpadding: 0 0.5em;\n\t}\n\n\t.inline-edit-row fieldset .inline-edit-col label.inline-edit-tags {\n\t\tpadding: 0;\n\t}\n\n\t.inline-edit-row fieldset label span.input-text-wrap,\n\t.inline-edit-row fieldset .timestamp-wrap {\n\t\tmargin-left: 0;\n\t}\n\n\t.inline-edit-row fieldset input[name=jj],\n\t.inline-edit-row fieldset input[name=hh],\n\t.inline-edit-row fieldset input[name=mn] {\n\t\twidth: 3em;\n\t}\n\n\t.inline-edit-row fieldset input[name=aa] {\n\t\twidth: 4.5em;\n\t}\n\n\t.inline-edit-row .inline-edit-or {\n\t\tmargin: 0 6px 0 0;\n\t}\n\n\t#edithead .inside,\n\t#commentsdiv #edithead .inside {\n\t\tfloat: none;\n\t\ttext-align: left;\n\t\tpadding: 3px 5px;\n\t}\n\n\t#commentsdiv #edithead .inside input,\n\t#edithead .inside input {\n\t\twidth: 100%;\n\t}\n\n\t#edithead label {\n\t\tdisplay: block;\n\t}\n\n\t#bulk-titles div {\n\t\tmargin: 0.8em 0.3em;\n\t}\n\n\t#bulk-titles div a {\n\t\theight: 22px;\n\t}\n\n\t/* Updates */\n\t#wpbody-content #update-themes-table .plugin-title {\n\t\twidth: auto;\n\t\twhite-space: normal;\n\t}\n\n\t/* Links */\n\t.link-manager-php #posts-filter {\n\t\tmargin-top: 25px;\n\t}\n\n\t.link-manager-php .tablenav.bottom {\n\t\toverflow: hidden;\n\t}\n\n\t/* List tables that don't toggle rows */\n\t.comments-box .toggle-row,\n\t.wp-list-table.plugins .toggle-row {\n\t\tdisplay: none;\n\t}\n\n\t/* Plugin/Theme Management */\n\t#wpbody-content .wp-list-table.plugins td {\n\t\tdisplay: block;\n\t\twidth: auto;\n\t\tpadding: 10px 9px; /* reset from other list tables that have a label at this width */\n\t}\n\n\t#wpbody-content .wp-list-table.plugins .column-description {\n\t\tpadding-top: 2px;\n\t}\n\n\t.wp-list-table.plugins .plugin-title,\n\t.wp-list-table.plugins .theme-title {\n\t\tpadding-top: 13px;\n\t\tpadding-bottom: 4px;\n\t}\n\n\t.plugins #the-list tr > td:not(:last-child),\n\t.plugins #the-list .update th,\n\t.plugins #the-list .update td,\n\t.wp-list-table.plugins #the-list .theme-title {\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t\tborder-top: none;\n\t}\n\n\t.plugins #the-list tr td {\n\t\tborder-top: none;\n\t}\n\n\t.plugins tbody {\n\t\tpadding: 1px 0 0;\n\t}\n\n\t.plugins tr.active + tr.inactive th.check-column,\n\t.plugins tr.active + tr.inactive td.column-description,\n\t.plugins .plugin-update-tr:before {\n\t\t-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t\tbox-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t}\n\n\t.plugins tr.active + tr.inactive th.check-column,\n\t.plugins tr.active + tr.inactive td {\n\t\tborder-top: none;\n\t}\n\n\t/* mimic the checkbox th */\n\t.plugins .plugin-update-tr:before {\n\t\tcontent: \"\";\n\t\tdisplay: table-cell;\n\t}\n\n\t.plugins .active.update + .plugin-update-tr:before {\n\t\tborder-left: 4px solid #d54e21;\n\t\tbackground-color: #fef7f1;\n\t}\n\n\t.plugins #the-list .plugin-update-tr .plugin-update {\n\t\tborder-left: none;\n\t}\n\n\t.plugin-update-tr .update-message {\n\t\tmargin-left: 0;\n\t}\n\n\t.wp-list-table.plugins .plugin-title strong,\n\t.wp-list-table.plugins .theme-title strong {\n\t\tfont-size: 1.4em;\n\t\tline-height: 1.6em;\n\t}\n\n\t/* Add New plugins page */\n\ttable.plugin-install .column-name,\n\ttable.plugin-install .column-version,\n\ttable.plugin-install .column-rating,\n\ttable.plugin-install .column-description {\n\t\tdisplay: block;\n\t\twidth: auto;\n\t}\n\n\ttable.plugin-install th.column-name,\n\ttable.plugin-install th.column-version,\n\ttable.plugin-install th.column-rating,\n\ttable.plugin-install th.column-description {\n\t\tdisplay: none;\n\t}\n\n\ttable.plugin-install td.column-name strong {\n\t\tfont-size: 1.4em;\n\t\tline-height: 1.6em;\n\t}\n\n\ttable.plugin-install #the-list td {\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t}\n\n\ttable.plugin-install #the-list tr {\n\t\tdisplay: block;\n\t\t-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n\t\tbox-shadow: inset 0 -1px 0 rgba(0,0,0,0.1);\n\t}\n\n\t.plugin-card {\n\t\tmargin-left: 0;\n\t\tmargin-right: 0;\n\t\twidth: 100%;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/login-rtl.css",
    "content": "@import url(forms-rtl.css);\n@import url(l10n-rtl.css);\n\nhtml,\nbody {\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tbackground: #f1f1f1;\n}\n\nbody {\n\tbackground: #f1f1f1;\n\tmin-width: 0;\n\tcolor: #444;\n\tfont-family: \"Open Sans\", sans-serif;\n\tfont-size: 13px;\n\tline-height: 1.4em;\n}\n\na {\n\tcolor: #0073aa;\n\t-webkit-transition-property: border, background, color;\n\ttransition-property: border, background, color;\n\t-webkit-transition-duration: .05s;\n\ttransition-duration: .05s;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\na {\n\toutline: 0;\n}\n\na:hover,\na:active {\n\tcolor: #00a0d2;\n}\n\na:focus {\n\tcolor: #124964;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 a:focus {\n\toutline: #5b9dd9 solid 1px;\n}\n\np {\n\tline-height: 1.5;\n}\n\n.login .message,\n.login #login_error {\n\tborder-right: 4px solid #00a0d2;\n\tpadding: 12px;\n\tmargin-right: 0;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n}\n\n.login #login_error {\n\tborder-right-color: #dc3232;\n}\n\n#loginform p.submit,\n.login-action-lostpassword p.submit {\n\tborder: none;\n\tmargin: -10px 0 20px; /* May want to revisit this */\n}\n\n.login * {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.login form {\n\tmargin-top: 20px;\n\tmargin-right: 0;\n\tpadding: 26px 24px 46px;\n\tfont-weight: normal;\n\toverflow: hidden;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.13);\n}\n\n.login form .forgetmenot {\n\tfont-weight: normal;\n\tfloat: right;\n\tmargin-bottom: 0;\n}\n\n.login .button-primary {\n\tfloat: left;\n}\n\n#login form p {\n\tmargin-bottom: 0;\n}\n\n#login form p.submit {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.login label {\n\tcolor: #777;\n\tfont-size: 14px;\n}\n\n.login form .forgetmenot label {\n\tfont-size: 12px;\n\tline-height: 19px;\n}\n\n.login h1 {\n\ttext-align: center;\n}\n\n.login h1 a {\n\tbackground-image: url(../images/w-logo-blue.png?ver=20131202);\n\tbackground-image: none, url(../images/wordpress-logo.svg?ver=20131107);\n\t-webkit-background-size: 84px;\n\tbackground-size: 84px;\n\tbackground-position: center top;\n\tbackground-repeat: no-repeat;\n\tcolor: #999;\n\theight: 84px;\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tline-height: 1.3em;\n\tmargin: 0 auto 25px;\n\tpadding: 0;\n\ttext-decoration: none;\n\twidth: 84px;\n\ttext-indent: -9999px;\n\toutline: none;\n\toverflow: hidden;\n\tdisplay: block;\n}\n\n#login {\n\twidth: 320px;\n\tpadding: 8% 0 0;\n\tmargin: auto;\n}\n\n.login #nav,\n.login #backtoblog {\n\tfont-size: 13px;\n\tpadding: 0 24px 0;\n}\n\n.login #nav {\n\tmargin: 24px 0 0 0;\n}\n\n#backtoblog {\n\tmargin: 16px 0;\n}\n\n.login #nav a,\n.login #backtoblog a {\n\ttext-decoration: none;\n\tcolor: #999;\n}\n\n.login #nav a:hover,\n.login #backtoblog a:hover,\n.login h1 a:hover {\n\tcolor: #00a0d2;\n}\n\n.login #nav a:focus,\n.login #backtoblog a:focus,\n.login h1 a:focus {\n\tcolor: #124964;\n}\n\n.login form .input,\n.login input[type=\"text\"] {\n\tfont-size: 24px;\n\twidth: 100%;\n\tpadding: 3px;\n\tmargin: 2px 0 16px 6px;\n}\n\n.login form .input,\n.login input[type=\"text\"],\n.login form input[type=\"checkbox\"] {\n\tbackground: #fbfbfb;\n}\n\n.ie7 .login form .input,\n.ie8 .login form .input {\n\tfont-family: sans-serif;\n}\n\n.login-action-rp input[type=\"text\"] {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tmargin: 0;\n}\n\n.login #pass-strength-result {\n\tfont-weight: 600;\n\tmargin: -1px 0 16px 5px;\n\tpadding: 6px 5px;\n\ttext-align: center;\n\twidth: 100%;\n}\n\n.mobile #login {\n\tpadding: 20px 0;\n}\n\n.mobile #login form {\n\tmargin-right: 0;\n}\n\n.mobile #login #nav,\n.mobile #login #backtoblog {\n\tmargin-right: 8px;\n}\n\nbody.interim-login {\n\theight: auto;\n}\n\n.interim-login #login {\n\tpadding: 0;\n\tmargin: 5px auto 20px;\n}\n\n.interim-login.login h1 a {\n\twidth: auto;\n}\n\n.interim-login #login_error,\n.interim-login.login .message {\n\tmargin: 0 0 16px;\n}\n\n.interim-login.login form {\n\tmargin: 0;\n}\n\n@-ms-viewport {\n\twidth: device-width;\n}\n\n@media screen and ( max-width: 782px ) {\n\t.interim-login input[type=checkbox] {\n\t\theight: 16px;\n\t\twidth: 16px;\n\t}\n\n\t.interim-login input[type=checkbox]:checked:before {\n\t\twidth: 16px;\n\t\tfont: normal 21px/1 dashicons;\n\t\tmargin: -3px -4px 0 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/login.css",
    "content": "@import url(forms.css);\n@import url(l10n.css);\n\nhtml,\nbody {\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tbackground: #f1f1f1;\n}\n\nbody {\n\tbackground: #f1f1f1;\n\tmin-width: 0;\n\tcolor: #444;\n\tfont-family: \"Open Sans\", sans-serif;\n\tfont-size: 13px;\n\tline-height: 1.4em;\n}\n\na {\n\tcolor: #0073aa;\n\t-webkit-transition-property: border, background, color;\n\ttransition-property: border, background, color;\n\t-webkit-transition-duration: .05s;\n\ttransition-duration: .05s;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n}\n\na {\n\toutline: 0;\n}\n\na:hover,\na:active {\n\tcolor: #00a0d2;\n}\n\na:focus {\n\tcolor: #124964;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.ie8 a:focus {\n\toutline: #5b9dd9 solid 1px;\n}\n\np {\n\tline-height: 1.5;\n}\n\n.login .message,\n.login #login_error {\n\tborder-left: 4px solid #00a0d2;\n\tpadding: 12px;\n\tmargin-left: 0;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);\n}\n\n.login #login_error {\n\tborder-left-color: #dc3232;\n}\n\n#loginform p.submit,\n.login-action-lostpassword p.submit {\n\tborder: none;\n\tmargin: -10px 0 20px; /* May want to revisit this */\n}\n\n.login * {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.login form {\n\tmargin-top: 20px;\n\tmargin-left: 0;\n\tpadding: 26px 24px 46px;\n\tfont-weight: normal;\n\toverflow: hidden;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.13);\n}\n\n.login form .forgetmenot {\n\tfont-weight: normal;\n\tfloat: left;\n\tmargin-bottom: 0;\n}\n\n.login .button-primary {\n\tfloat: right;\n}\n\n#login form p {\n\tmargin-bottom: 0;\n}\n\n#login form p.submit {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.login label {\n\tcolor: #777;\n\tfont-size: 14px;\n}\n\n.login form .forgetmenot label {\n\tfont-size: 12px;\n\tline-height: 19px;\n}\n\n.login h1 {\n\ttext-align: center;\n}\n\n.login h1 a {\n\tbackground-image: url(../images/w-logo-blue.png?ver=20131202);\n\tbackground-image: none, url(../images/wordpress-logo.svg?ver=20131107);\n\t-webkit-background-size: 84px;\n\tbackground-size: 84px;\n\tbackground-position: center top;\n\tbackground-repeat: no-repeat;\n\tcolor: #999;\n\theight: 84px;\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tline-height: 1.3em;\n\tmargin: 0 auto 25px;\n\tpadding: 0;\n\ttext-decoration: none;\n\twidth: 84px;\n\ttext-indent: -9999px;\n\toutline: none;\n\toverflow: hidden;\n\tdisplay: block;\n}\n\n#login {\n\twidth: 320px;\n\tpadding: 8% 0 0;\n\tmargin: auto;\n}\n\n.login #nav,\n.login #backtoblog {\n\tfont-size: 13px;\n\tpadding: 0 24px 0;\n}\n\n.login #nav {\n\tmargin: 24px 0 0 0;\n}\n\n#backtoblog {\n\tmargin: 16px 0;\n}\n\n.login #nav a,\n.login #backtoblog a {\n\ttext-decoration: none;\n\tcolor: #999;\n}\n\n.login #nav a:hover,\n.login #backtoblog a:hover,\n.login h1 a:hover {\n\tcolor: #00a0d2;\n}\n\n.login #nav a:focus,\n.login #backtoblog a:focus,\n.login h1 a:focus {\n\tcolor: #124964;\n}\n\n.login form .input,\n.login input[type=\"text\"] {\n\tfont-size: 24px;\n\twidth: 100%;\n\tpadding: 3px;\n\tmargin: 2px 6px 16px 0;\n}\n\n.login form .input,\n.login input[type=\"text\"],\n.login form input[type=\"checkbox\"] {\n\tbackground: #fbfbfb;\n}\n\n.ie7 .login form .input,\n.ie8 .login form .input {\n\tfont-family: sans-serif;\n}\n\n.login-action-rp input[type=\"text\"] {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tmargin: 0;\n}\n\n.login #pass-strength-result {\n\tfont-weight: 600;\n\tmargin: -1px 5px 16px 0;\n\tpadding: 6px 5px;\n\ttext-align: center;\n\twidth: 100%;\n}\n\n.mobile #login {\n\tpadding: 20px 0;\n}\n\n.mobile #login form {\n\tmargin-left: 0;\n}\n\n.mobile #login #nav,\n.mobile #login #backtoblog {\n\tmargin-left: 8px;\n}\n\nbody.interim-login {\n\theight: auto;\n}\n\n.interim-login #login {\n\tpadding: 0;\n\tmargin: 5px auto 20px;\n}\n\n.interim-login.login h1 a {\n\twidth: auto;\n}\n\n.interim-login #login_error,\n.interim-login.login .message {\n\tmargin: 0 0 16px;\n}\n\n.interim-login.login form {\n\tmargin: 0;\n}\n\n@-ms-viewport {\n\twidth: device-width;\n}\n\n@media screen and ( max-width: 782px ) {\n\t.interim-login input[type=checkbox] {\n\t\theight: 16px;\n\t\twidth: 16px;\n\t}\n\n\t.interim-login input[type=checkbox]:checked:before {\n\t\twidth: 16px;\n\t\tfont: normal 21px/1 dashicons;\n\t\tmargin: -3px 0 0 -4px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/media-rtl.css",
    "content": "/*------------------------------------------------------------------------------\n  14.0 - Media Screen\n------------------------------------------------------------------------------*/\n\n.media-item .describe {\n\tborder-collapse: collapse;\n\twidth: 100%;\n\tborder-top: 1px solid #dfdfdf;\n\tclear: both;\n\tcursor: default;\n}\n\n.media-item.media-blank .describe {\n\tborder: 0;\n}\n\n.media-item .describe th {\n\tvertical-align: top;\n\ttext-align: right;\n\tpadding: 5px 10px 10px;\n\twidth: 140px;\n}\n\n.media-item .describe .align th {\n\tpadding-top: 0;\n}\n\n.media-item .media-item-info tr {\n\tbackground-color: transparent;\n}\n\n.media-item .describe td {\n\tpadding: 0 0 8px 8px;\n\tvertical-align: top;\n}\n\n.media-item thead.media-item-info td {\n\tpadding: 4px 10px 0;\n}\n\n.media-item .media-item-info .A1B1 {\n\tpadding: 0 10px 0 0;\n}\n\n.media-item td.savesend {\n\tpadding-bottom: 15px;\n}\n\n.media-item .thumbnail {\n\tmax-height: 128px;\n\tmax-width: 128px;\n}\n\n#wpbody-content #async-upload-wrap a {\n\tdisplay: none;\n}\n\n.media-upload-form {\n\tmargin-top: 20px;\n}\n\n.media-upload-form td label {\n\tmargin-left: 6px;\n\tmargin-right: 2px;\n}\n\n.media-upload-form .align .field label {\n\tdisplay: inline;\n\tpadding: 0 23px 0 0;\n\tmargin: 0 3px 0 1em;\n\tfont-weight: 600;\n}\n\n.media-upload-form tr.image-size label {\n\tmargin: 0 5px 0 0;\n\tfont-weight: 600;\n}\n\n.media-upload-form th.label label {\n\tfont-weight: 600;\n\tmargin: 0.5em;\n\tfont-size: 13px;\n}\n\n.media-upload-form th.label label span {\n\tpadding: 0 5px;\n}\n\n.media-item .describe input[type=\"text\"],\n.media-item .describe textarea {\n\twidth: 460px;\n}\n\n.media-item .describe p.help {\n\tmargin: 0;\n\tpadding: 0 5px 0 0;\n}\n\n.media-item .edit-attachment,\n.describe-toggle-on,\n.describe-toggle-off {\n\tdisplay: block;\n\tline-height: 36px;\n\tfloat: left;\n\tmargin-left: 10px;\n}\n\n.media-item .describe-toggle-off,\n.media-item.open .describe-toggle-on {\n\tdisplay: none;\n}\n\n.media-item.open .describe-toggle-off {\n\tdisplay: block;\n}\n\n.media-upload-form .media-item {\n\tmin-height: 36px;\n\tmargin-bottom: 1px;\n\tposition: relative;\n\twidth: 100%;\n\tbackground: #fff;\n}\n\n.media-upload-form .media-item,\n.media-upload-form .media-item .error {\n\t-webkit-box-shadow: 0 1px 0 #dfdfdf;\n\tbox-shadow: 0 1px 0 #dfdfdf;\n}\n\n#media-items:empty {\n\tborder: 0 none;\n}\n\n.media-item .filename {\n\tline-height: 36px;\n\toverflow: hidden;\n\tmargin-right: 6px;\n}\n\n.media-item .pinkynail {\n\tfloat: right;\n\tmargin: 2px 3px 0 10px;\n\tmax-width: 40px;\n\tmax-height: 32px;\n}\n\n.media-item .startopen,\n.media-item .startclosed {\n\tdisplay: none;\n}\n\n.media-item .original {\n\tposition: relative;\n\theight: 34px;\n}\n\n.media-item .progress {\n\tfloat: left;\n\theight: 22px;\n\tmargin: 7px 6px;\n\twidth: 200px;\n\tline-height: 2em;\n\tpadding: 0;\n\toverflow: hidden;\n\t-webkit-border-radius: 22px;\n\tborder-radius: 22px;\n\tbackground: #ddd;\n\t-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);\n\tbox-shadow: inset 0 1px 2px rgba(0,0,0,0.1);\n}\n\n.media-item .bar {\n\tz-index: 9;\n\twidth: 0;\n\theight: 100%;\n\tmargin-top: -22px;\n\t-webkit-border-radius: 22px;\n\tborder-radius: 22px;\n\tbackground-color: #0073aa;\n\t-webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.3);\n\tbox-shadow: inset 0 0 2px rgba(0,0,0,0.3);\n}\n\n.media-item .progress .percent {\n\tz-index: 10;\n\tposition: relative;\n\twidth: 200px;\n\tpadding: 0;\n\tcolor: #fff;\n\ttext-align: center;\n\tline-height: 22px;\n\tfont-weight: 400;\n\ttext-shadow: 0 1px 2px rgba(0,0,0,0.2);\n}\n\n.upload-php .fixed .column-parent {\n\twidth: 15%;\n}\n\n.js .html-uploader #plupload-upload-ui {\n\tdisplay: none;\n}\n\n.js .html-uploader #html-upload-ui {\n\tdisplay: block;\n}\n\n.media-upload-form .media-item.error,\n.media-upload-form .media-item .error {\n\twidth: auto;\n\tmargin: 0 0 1px 0;\n}\n\n.media-upload-form .media-item .error {\n\tpadding: 10px 14px 10px 0;\n}\n\n.media-item .error-div a.dismiss {\n\tdisplay: block;\n\tfloat: left;\n\tmargin: 0 15px 0 10px;\n}\n\n/*------------------------------------------------------------------------------\n  14.1 - Media Library\n------------------------------------------------------------------------------*/\n\n.find-box {\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\twidth: 600px;\n\toverflow: hidden;\n\tmargin-right: -300px;\n\tposition: fixed;\n\ttop: 30px;\n\tbottom: 30px;\n\tright: 50%;\n\tz-index: 100105;\n}\n\n.find-box-head {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\theight: 36px;\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tline-height: 36px;\n\tpadding: 0 16px 0 36px;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n}\n\n.find-box-inside {\n\toverflow: auto;\n\tpadding: 16px;\n\tbackground-color: #fff;\n\tposition: absolute;\n\ttop: 37px;\n\tbottom: 45px;\n\toverflow-y: scroll;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.find-box-search {\n\tpadding-bottom: 16px;\n}\n\n.find-box-search .spinner {\n\tfloat: none;\n\tright: 105px;\n\tposition: absolute;\n}\n\n.find-box-search,\n#find-posts-response {\n\tposition: relative; /* RTL fix, #WP28010 */\n}\n\n#find-posts-input,\n#find-posts-search {\n\tfloat: right;\n}\n\n#find-posts-input {\n\twidth: 140px;\n\theight: 28px;\n\tmargin: 0 0 0 4px;\n}\n\n.widefat .found-radio {\n\tpadding-left: 0;\n\twidth: 16px;\n}\n\n#find-posts-close {\n\twidth: 36px;\n\theight: 36px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tcursor: pointer;\n\ttext-align: center;\n\tcolor: #666;\n}\n\n#find-posts-close:hover {\n\tcolor: #00a0d2;\n}\n\n#find-posts-close:before {\n\tfont: normal 20px/36px dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcontent: \"\\f158\";\n}\n\n.find-box-buttons {\n\tpadding: 8px 16px;\n\tbackground: #fcfcfc;\n\tborder-top: 1px solid #dfdfdf;\n\tposition: absolute;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n}\n\n@media screen and ( max-width: 782px ) {\n\t.find-box-inside {\n\t\tbottom: 57px;\n\t}\n}\n\n@media screen and ( max-width: 660px ) {\n\n\t.find-box {\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\tleft: 0;\n\t\tmargin: 0;\n\t\twidth: 100%;\n\t}\n\n}\n\n.ui-find-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 100100;\n}\n\nul#dismissed-updates {\n\tdisplay: none;\n}\n\nform.upgrade {\n\tmargin-top: 8px;\n}\n\nform.upgrade .hint {\n\tfont-style: italic;\n\tfont-size: 85%;\n\tmargin: -0.5em 0 2em 0;\n}\n\n#poststuff .inside .the-tagcloud {\n\tmargin: 5px 0 10px;\n\tpadding: 8px;\n\tborder: 1px solid #ddd;\n\tline-height: 1.8em;\n\tword-spacing: 3px;\n}\n\n.drag-drop #drag-drop-area {\n\tborder: 4px dashed #b4b9be;\n\theight: 200px;\n}\n\n.drag-drop .drag-drop-inside {\n\tmargin: 70px auto 0;\n\twidth: 250px;\n}\n\n.drag-drop-inside p {\n\tcolor: #a0a5aa;\n\tfont-size: 14px;\n\tmargin: 5px 0;\n\tdisplay: none;\n}\n\n.drag-drop .drag-drop-inside p {\n\ttext-align: center;\n}\n\n.drag-drop-inside p.drag-drop-info {\n\tfont-size: 20px;\n}\n\n.drag-drop .drag-drop-inside p,\n.drag-drop-inside p.drag-drop-buttons {\n\tdisplay: block;\n}\n\n/*\n#drag-drop-area:-moz-drag-over {\n\tborder-color: #83b4d8;\n}\nborder color while dragging a file over the uploader drop area */\n.drag-drop.drag-over #drag-drop-area {\n\tborder-color: #83b4d8;\n}\n\n#plupload-upload-ui {\n\tposition: relative;\n}\n\n/**\n * Media Library grid view\n */\n\n.media-frame.mode-grid,\n.media-frame.mode-grid .media-frame-content,\n.media-frame.mode-grid .attachments-browser .attachments,\n.media-frame.mode-grid .uploader-inline-content {\n\tposition: static;\n}\n\n/* Regions we don't use at all */\n.media-frame.mode-grid .media-frame-title,\n.media-frame.mode-grid .media-frame-router,\n.media-frame.mode-grid .media-frame-menu {\n\tdisplay: none;\n}\n\n.media-frame.mode-grid .media-frame-content {\n\tbackground-color: transparent;\n\tborder: none;\n}\n\n.upload-php .mode-grid .media-sidebar {\n\tposition: relative;\n\twidth: auto;\n\tmargin-bottom: 16px;\n\tpadding: 0 16px;\n\tborder-right: 4px solid #dd3d36;\n \t-webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);\n \tbox-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);\n\tbackground-color: #fff;\n}\n\n.upload-php .mode-grid .hide-sidebar .media-sidebar {\n\tdisplay: none;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status {\n\tborder-bottom: none;\n\tpadding-bottom: 0;\n\tmax-width: 100%;\n}\n\n.upload-php .mode-grid .media-sidebar .upload-error {\n\tmargin: 12px 0;\n\tpadding: 4px 0 0;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: none;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors {\n\ttop: -10px;\n\tleft: -14px;\n\tpadding: 10px;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:before {\n\tcontent: \"\\f153\";\n\tdisplay: block;\n\tfont: normal 16px/1 dashicons;\n\tcolor: #bbb;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:focus:before,\n.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:hover:before {\n\tcolor: #c00;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h3, /* Back-compat for pre-4.4 */\n.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 {\n\tdisplay: none;\n}\n\n.media-frame.mode-grid .uploader-inline {\n\tposition: relative;\n\ttop: auto;\n\tleft: auto;\n\tright: auto;\n\tbottom: auto;\n\tpadding-top: 0;\n\tmargin-top: 0;\n\tborder: 4px dashed #b4b9be;\n}\n\n.media-frame.mode-select .attachments-browser.fixed .attachments {\n\tposition: relative;\n\ttop: 94px; /* prevent jumping up when the toolbar becomes fixed */\n\tpadding-bottom: 94px; /* offset for above so the bottom doesn't get cut off */\n}\n\n.media-frame.mode-grid .attachment:focus,\n.media-frame.mode-grid .selected.attachment:focus,\n.media-frame.mode-grid .attachment.details:focus {\n\t-webkit-box-shadow:\n\t\tinset 0 0 2px 3px #f1f1f1,\n\t\tinset 0 0 0 7px #5b9dd9;\n\tbox-shadow:\n\t\tinset 0 0 2px 3px #f1f1f1,\n\t\tinset 0 0 0 7px #5b9dd9;\n\toutline: none;\n}\n\n.media-frame.mode-grid .selected.attachment {\n\t-webkit-box-shadow:\n\t\tinset 0 0 0 5px #f1f1f1,\n\t\tinset 0 0 0 7px #ccc;\n\tbox-shadow:\n\t\tinset 0 0 0 5px #f1f1f1,\n\t\tinset 0 0 0 7px #ccc;\n}\n\n.media-frame.mode-grid .attachment.details {\n\t-webkit-box-shadow:\n\t\tinset 0 0 0 3px #f1f1f1,\n\t\tinset 0 0 0 7px #1e8cbe;\n\tbox-shadow:\n\t\tinset 0 0 0 3px #f1f1f1,\n\t\tinset 0 0 0 7px #1e8cbe;\n}\n\n.media-frame.mode-grid.mode-select .attachment .thumbnail {\n\topacity: 0.65;\n}\n\n.media-frame.mode-select .attachment.selected .thumbnail {\n\topacity: 1;\n}\n\n.media-frame.mode-grid .media-toolbar {\n\tmargin-bottom: 15px;\n\theight: auto;\n}\n\n.media-frame.mode-grid .media-toolbar select {\n\tmargin: 0 0 0 10px;\n\tfont-size: 14px;\n}\n\n.media-frame.mode-grid.mode-edit .media-toolbar-secondary > .select-mode-toggle-button {\n\tmargin: 0 0 0 8px;\n\tvertical-align: middle;\n}\n\n.media-frame.mode-grid .attachments-browser .bulk-select {\n\tdisplay: inline-block;\n\tmargin: 0 0 0 10px;\n}\n\n.media-frame.mode-grid .search {\n\tmargin-top: 0;\n}\n\n.media-frame.mode-grid .spinner {\n\tmargin-top: 16px;\n}\n\n.attachments-browser .media-toolbar-secondary > .media-button {\n\tmargin-left: 10px;\n}\n\n.media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n\tposition: fixed;\n\ttop: 32px;\n\tright: auto;\n\tleft: 20px;\n\tmargin-top: 0;\n}\n\n.media-frame.mode-grid .attachments-browser {\n\tpadding: 0;\n}\n\n.media-frame.mode-grid .attachments-browser .attachments {\n\tpadding: 2px;\n}\n\n.media-frame.mode-grid .attachments-browser .no-media {\n\tcolor: #999;\n\tfont-size: 18px;\n\tfont-style: normal;\n\tmargin: 0;\n\tpadding: 100px 0 0;\n\ttext-align: center;\n}\n\n/**\n * Attachment details modal\n */\n\n.edit-attachment-frame {\n\tdisplay: block;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.edit-attachment-frame .edit-media-header {\n\toverflow: hidden;\n}\n\n.upload-php .media-modal-close .media-modal-icon:before {\n\tcontent: \"\\f335\";\n\tfont-size: 22px;\n}\n\n.upload-php .media-modal-close,\n.edit-attachment-frame .edit-media-header .left,\n.edit-attachment-frame .edit-media-header .right {\n\tcursor: pointer;\n\tcolor: #777;\n\tbackground-color: transparent;\n\theight: 50px;\n\twidth: 50px;\n\tpadding: 0;\n\tposition: absolute;\n\ttext-align: center;\n\tborder: 0;\n\tborder-right: 1px solid #ddd;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n    transition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.upload-php .media-modal-close {\n\ttop: 0;\n\tleft: 0;\n}\n\n.edit-attachment-frame .edit-media-header .left {\n\tleft: 102px;\n}\n\n.edit-attachment-frame .edit-media-header .right {\n\tleft: 51px;\n}\n\n.edit-attachment-frame .media-frame-title {\n\tright: 0;\n\tleft: 150px; /* leave space for prev/next/close */\n}\n\n.edit-attachment-frame .edit-media-header .right:before,\n.edit-attachment-frame .edit-media-header .left:before {\n\tfont: normal 20px/50px dashicons !important;\n\tdisplay: inline;\n\tfont-weight: 300;\n}\n\n.upload-php .media-modal-close:hover,\n.upload-php .media-modal-close:focus,\n.edit-attachment-frame .edit-media-header .left:hover,\n.edit-attachment-frame .edit-media-header .right:hover,\n.edit-attachment-frame .edit-media-header .left:focus,\n.edit-attachment-frame .edit-media-header .right:focus {\n\tbackground: #ddd;\n\tborder-color: #ccc;\n\tcolor: #000;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.upload-php .media-modal-close:focus .media-modal-icon:before,\n.upload-php .media-modal-close:hover .media-modal-icon:before {\n\tcolor: #000;\n}\n\n.edit-attachment-frame .edit-media-header .left:before,\n.rtl .edit-attachment-frame .edit-media-header .right:before {\n\tcontent: \"\\f345\";\n}\n\n.edit-attachment-frame .edit-media-header .right:before,\n.rtl .edit-attachment-frame .edit-media-header .left:before {\n\tcontent: \"\\f341\";\n}\n\n.edit-attachment-frame .edit-media-header .left.disabled,\n.edit-attachment-frame .edit-media-header .right.disabled,\n.edit-attachment-frame .edit-media-header .left.disabled:hover,\n.edit-attachment-frame .edit-media-header .right.disabled:hover {\n\tcolor: #ccc;\n\tbackground: inherit;\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.edit-attachment-frame .media-frame-content,\n.edit-attachment-frame .media-frame-router {\n\tright: 0;\n}\n\n.edit-attachment-frame .media-frame-content {\n\tborder-bottom: none;\n\tbottom: 0;\n\ttop: 50px;\n}\n\n.edit-attachment-frame .attachment-details {\n\tposition: absolute;\n\toverflow: auto;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\t-webkit-box-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1);\n\tbox-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1);\n}\n\n.edit-attachment-frame .attachment-media-view {\n\tfloat: right;\n\twidth: 65%;\n\theight: 100%;\n}\n\n.edit-attachment-frame .attachment-media-view .thumbnail {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tpadding: 16px;\n\theight: 100%;\n}\n\n.edit-attachment-frame .attachment-media-view .details-image {\n\tdisplay: block;\n\tmargin-bottom: 16px;\n\tmax-width: 100%;\n\tmax-height: 90%;\n\tmax-height: -webkit-calc( 100% - 42px );\n\tmax-height: calc( 100% - 42px ); /* leave space for actions underneath */\n}\n\n.edit-attachment-frame .wp-media-wrapper {\n\tmargin-bottom: 12px;\n}\n\n.edit-attachment-frame input,\n.edit-attachment-frame textarea {\n\tpadding: 6px 8px;\n\tline-height: 16px;\n}\n\n.edit-attachment-frame .attachment-info {\n\toverflow: auto;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 0;\n\tpadding: 12px 16px 0;\n\twidth: 35%;\n\theight: 100%;\n\t-webkit-box-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1);\n\tbox-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1);\n\tborder-bottom: 0;\n\tborder-right: 1px solid #ddd;\n\tbackground: #f3f3f3;\n}\n\n.edit-attachment-frame .attachment-info .details,\n.edit-attachment-frame .attachment-info .settings {\n\tposition: relative; /* RTL fix, #WP29352 */\n\toverflow: hidden;\n\tfloat: none;\n\tmargin-bottom: 15px;\n\tpadding-bottom: 15px;\n\tborder-bottom: 1px solid #ddd;\n}\n\n.edit-attachment-frame .attachment-info .filename {\n\tfont-weight: normal;\n\tcolor: #666;\n}\n\n.edit-attachment-frame .attachment-info .thumbnail {\n\tmargin-bottom: 12px;\n}\n\n.attachment-info .actions {\n\tmargin-bottom: 16px;\n}\n\n.attachment-info .actions a {\n\tdisplay: inline;\n\ttext-decoration: none;\n}\n\n\n/*------------------------------------------------------------------------------\n  14.2 - Image Editor\n------------------------------------------------------------------------------*/\n\n.wp_attachment_details label[for=\"content\"] {\n\tfont-size: 13px;\n\tline-height: 1.5;\n\tmargin: 1em 0;\n}\n\n.wp_attachment_details #attachment_caption {\n\theight: 4em;\n}\n\n.describe .image-editor {\n\tvertical-align: top;\n}\n\n.imgedit-wrap {\n\tposition: relative;\n}\n\n.imgedit-settings p {\n\tmargin: 8px 0 0;\n}\n\n.describe .imgedit-wrap .imgedit-settings {\n\tpadding: 0 5px;\n}\n\n.wp_attachment_holder div.updated {\n\tmargin-top: 0;\n}\n\n.wp_attachment_holder .imgedit-wrap > div {\n\theight: auto;\n\toverflow: hidden;\n}\n\n.wp_attachment_holder .imgedit-wrap .imgedit-panel-content {\n\tpadding-left: 16px;\n\twidth: auto;\n\toverflow: hidden;\n}\n\n.wp_attachment_holder .imgedit-wrap .imgedit-settings {\n\tfloat: left;\n\twidth: 250px;\n}\n\n.imgedit-settings input {\n\tmargin-top: 0;\n\tvertical-align: middle;\n}\n\n.imgedit-wait {\n\tposition: absolute;\n\ttop: 0;\n\tbackground: #fff url(../images/spinner.gif) no-repeat center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\twidth: 100%;\n\theight: 500px;\n\tdisplay: none;\n}\n\n.no-float {\n\tfloat: none;\n}\n\n.media-disabled,\n.imgedit-settings .disabled {\n\tcolor: grey;\n}\n\n.wp_attachment_image,\n.A1B1 {\n\toverflow: hidden;\n}\n\n.wp_attachment_image .button,\n.A1B1 .button {\n\tfloat: right;\n}\n\n.no-js .wp_attachment_image .button {\n\tdisplay: none;\n}\n\n.wp_attachment_image .spinner,\n.A1B1 .spinner {\n\tfloat: right;\n}\n\n.imgedit-menu {\n\tmargin: 0 0 12px;\n\tmin-width: 300px;\n}\n\n.imgedit-menu div {\n\tfloat: right;\n\twidth: 32px;\n\tborder: 1px solid #d5d5d5;\n\tbackground: #f1f1f1;\n\tmargin: 0 0 0 8px;\n\theight: 32px;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-align: center;\n\tline-height: 28px;\n\tcolor: #777;\n\tcursor: pointer;\n}\n\n.imgedit-menu div:before {\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: middle;\n}\n\n.imgedit-menu div:hover {\n\tborder-color: #c1c1c1;\n\tbackground-color: #eaeaea;\n\tcolor: #32373c;\n}\n\n.imgedit-menu div.disabled {\n\tborder-color: #ccc;\n\tbackground-color: #ddd;\n\tcolor: #777;\n\tfilter: alpha(opacity=50);\n\topacity: 0.5;\n\tcursor: default;\n}\n\n.imgedit-crop:before {\n\tcontent: \"\\f165\";\n}\n\n.imgedit-rleft:before {\n\tcontent: \"\\f166\";\n}\n\n.imgedit-rright:before {\n\tcontent: \"\\f167\";\n}\n\n.imgedit-flipv:before {\n\tcontent: \"\\f168\";\n}\n\n.imgedit-fliph:before {\n\tcontent: \"\\f169\";\n}\n\n.imgedit-undo:before {\n\tcontent: \"\\f171\";\n}\n\n.imgedit-redo:before {\n\tcontent: \"\\f172\";\n}\n\n.imgedit-crop-wrap {\n\tposition: relative;\n}\n\n.imgedit-crop {\n\tmargin: 0 0 0 8px;\n}\n\n.imgedit-rleft {\n\tmargin: 0 3px;\n}\n\n.imgedit-rright {\n\tmargin: 0 3px 0 8px;\n}\n\n.imgedit-flipv {\n\tmargin: 0 3px;\n}\n\n.imgedit-fliph {\n\tmargin: 0 3px 0 8px;\n}\n\n.imgedit-undo {\n\tmargin: 0 3px;\n}\n\n.imgedit-redo {\n\tmargin: 0 3px 0 8px;\n}\n\n.imgedit-applyto img {\n\tmargin: 0 0 0 8px;\n}\n\n#poststuff .imgedit-group-top h3, /* Back-compat for pre-4.4 */\n#poststuff .imgedit-group-top h2 {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 14px;\n\tline-height: 1.4;\n}\n\n.imgedit-group-top h3 a, /* Back-compat for pre-4.4 */\n.imgedit-group-top h2 a {\n\ttext-decoration: none;\n}\n\n.imgedit-applyto .imgedit-label {\n\tpadding: 2px 0 0;\n\tdisplay: block;\n}\n\n.imgedit-help {\n\tdisplay: none;\n\tfont-style: italic;\n}\n\na.imgedit-help-toggle {\n\ttext-decoration: none;\n}\n\n.form-table td.imgedit-response {\n\tpadding: 0;\n}\n\n.imgedit-submit {\n\tmargin: 8px 0 0;\n}\n\n.imgedit-submit-btn {\n\tmargin-right: 20px;\n}\n\n.imgedit-wrap .nowrap {\n\twhite-space: nowrap;\n}\n\nspan.imgedit-scale-warn {\n\tcolor: red;\n\tfont-size: 20px;\n\tfont-style: normal;\n\tvisibility: hidden;\n\tvertical-align: middle;\n}\n\n.imgedit-group {\n\tmargin-bottom: 8px;\n\tpadding: 10px;\n}\n\naudio, video {\n\tdisplay: inline-block;\n\tmax-width: 100%;\n}\n\n.mejs-container {\n\twidth: 100%;\n\tmax-width: 100%;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t.imgedit-wait {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t.wp_attachment_details label[for=\"content\"] {\n\t\tfont-size: 14px;\n\t\tline-height: 1.5em;\n\t}\n\n\t.media-upload-form .media-item.error,\n\t.media-upload-form .media-item .error {\n\t\tfont-size: 13px;\n\t\tline-height: 1.5;\n\t}\n\n\t.media-upload-form .media-item.error {\n\t\tpadding: 1px 10px;\n\t}\n\n\t.media-upload-form .media-item .error {\n\t\tpadding: 10px 12px 10px 0;\n\t}\n}\n\n/**\n * Media queries for media grid.\n */\n\n@media only screen and (max-width: 1120px) {\n\t/* override for media-views.css */\n\t#wp-media-grid .wp-filter .attachment-filters {\n\t\tmax-width: 100%;\n\t}\n}\n\n@media only screen and ( max-width: 782px ) {\n\t.media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n\t\ttop: 46px;\n\t\tleft: 10px;\n\t}\n}\n\n@media only screen and (max-width: 600px) {\n\t.media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n\t\ttop: 0;\n\t}\n}\n\n@media only screen and (max-width: 480px) {\n\t.edit-attachment-frame .media-frame-title {\n\t\tleft: 110px;\n\t}\n\n\t.upload-php .media-modal-close,\n\t.edit-attachment-frame .edit-media-header .left,\n\t.edit-attachment-frame .edit-media-header .right {\n\t\twidth: 40px;\n\t\theight: 40px;\n\t}\n\n\t.upload-php .media-modal-close .media-modal-icon {\n\t\tmargin: 9px 10px;\n\t}\n\n\t.edit-attachment-frame .edit-media-header .right:before,\n\t.edit-attachment-frame .edit-media-header .left:before {\n\t\tline-height: 40px !important;\n\t}\n\n\t.edit-attachment-frame .edit-media-header .left {\n\t\tleft: 82px;\n\t}\n\n\t.edit-attachment-frame .edit-media-header .right {\n\t\tleft: 41px;\n\t}\n\n\t.edit-attachment-frame .media-frame-content {\n\t\ttop: 40px;\n\t}\n\n\t.edit-attachment-frame .attachment-media-view {\n\t\tfloat: none;\n\t\theight: auto;\n\t\twidth: 100%;\n\t}\n\n\t.edit-attachment-frame .attachment-info {\n\t\theight: auto;\n\t\twidth: 100%;\n\t}\n}\n\n@media only screen and (max-width: 640px), screen and (max-height: 400px) {\n\t.upload-php .mode-grid .media-sidebar{\n\t\tmax-width: 100%;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/media.css",
    "content": "/*------------------------------------------------------------------------------\n  14.0 - Media Screen\n------------------------------------------------------------------------------*/\n\n.media-item .describe {\n\tborder-collapse: collapse;\n\twidth: 100%;\n\tborder-top: 1px solid #dfdfdf;\n\tclear: both;\n\tcursor: default;\n}\n\n.media-item.media-blank .describe {\n\tborder: 0;\n}\n\n.media-item .describe th {\n\tvertical-align: top;\n\ttext-align: left;\n\tpadding: 5px 10px 10px;\n\twidth: 140px;\n}\n\n.media-item .describe .align th {\n\tpadding-top: 0;\n}\n\n.media-item .media-item-info tr {\n\tbackground-color: transparent;\n}\n\n.media-item .describe td {\n\tpadding: 0 8px 8px 0;\n\tvertical-align: top;\n}\n\n.media-item thead.media-item-info td {\n\tpadding: 4px 10px 0;\n}\n\n.media-item .media-item-info .A1B1 {\n\tpadding: 0 0 0 10px;\n}\n\n.media-item td.savesend {\n\tpadding-bottom: 15px;\n}\n\n.media-item .thumbnail {\n\tmax-height: 128px;\n\tmax-width: 128px;\n}\n\n#wpbody-content #async-upload-wrap a {\n\tdisplay: none;\n}\n\n.media-upload-form {\n\tmargin-top: 20px;\n}\n\n.media-upload-form td label {\n\tmargin-right: 6px;\n\tmargin-left: 2px;\n}\n\n.media-upload-form .align .field label {\n\tdisplay: inline;\n\tpadding: 0 0 0 23px;\n\tmargin: 0 1em 0 3px;\n\tfont-weight: 600;\n}\n\n.media-upload-form tr.image-size label {\n\tmargin: 0 0 0 5px;\n\tfont-weight: 600;\n}\n\n.media-upload-form th.label label {\n\tfont-weight: 600;\n\tmargin: 0.5em;\n\tfont-size: 13px;\n}\n\n.media-upload-form th.label label span {\n\tpadding: 0 5px;\n}\n\n.media-item .describe input[type=\"text\"],\n.media-item .describe textarea {\n\twidth: 460px;\n}\n\n.media-item .describe p.help {\n\tmargin: 0;\n\tpadding: 0 0 0 5px;\n}\n\n.media-item .edit-attachment,\n.describe-toggle-on,\n.describe-toggle-off {\n\tdisplay: block;\n\tline-height: 36px;\n\tfloat: right;\n\tmargin-right: 10px;\n}\n\n.media-item .describe-toggle-off,\n.media-item.open .describe-toggle-on {\n\tdisplay: none;\n}\n\n.media-item.open .describe-toggle-off {\n\tdisplay: block;\n}\n\n.media-upload-form .media-item {\n\tmin-height: 36px;\n\tmargin-bottom: 1px;\n\tposition: relative;\n\twidth: 100%;\n\tbackground: #fff;\n}\n\n.media-upload-form .media-item,\n.media-upload-form .media-item .error {\n\t-webkit-box-shadow: 0 1px 0 #dfdfdf;\n\tbox-shadow: 0 1px 0 #dfdfdf;\n}\n\n#media-items:empty {\n\tborder: 0 none;\n}\n\n.media-item .filename {\n\tline-height: 36px;\n\toverflow: hidden;\n\tmargin-left: 6px;\n}\n\n.media-item .pinkynail {\n\tfloat: left;\n\tmargin: 2px 10px 0 3px;\n\tmax-width: 40px;\n\tmax-height: 32px;\n}\n\n.media-item .startopen,\n.media-item .startclosed {\n\tdisplay: none;\n}\n\n.media-item .original {\n\tposition: relative;\n\theight: 34px;\n}\n\n.media-item .progress {\n\tfloat: right;\n\theight: 22px;\n\tmargin: 7px 6px;\n\twidth: 200px;\n\tline-height: 2em;\n\tpadding: 0;\n\toverflow: hidden;\n\t-webkit-border-radius: 22px;\n\tborder-radius: 22px;\n\tbackground: #ddd;\n\t-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);\n\tbox-shadow: inset 0 1px 2px rgba(0,0,0,0.1);\n}\n\n.media-item .bar {\n\tz-index: 9;\n\twidth: 0;\n\theight: 100%;\n\tmargin-top: -22px;\n\t-webkit-border-radius: 22px;\n\tborder-radius: 22px;\n\tbackground-color: #0073aa;\n\t-webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.3);\n\tbox-shadow: inset 0 0 2px rgba(0,0,0,0.3);\n}\n\n.media-item .progress .percent {\n\tz-index: 10;\n\tposition: relative;\n\twidth: 200px;\n\tpadding: 0;\n\tcolor: #fff;\n\ttext-align: center;\n\tline-height: 22px;\n\tfont-weight: 400;\n\ttext-shadow: 0 1px 2px rgba(0,0,0,0.2);\n}\n\n.upload-php .fixed .column-parent {\n\twidth: 15%;\n}\n\n.js .html-uploader #plupload-upload-ui {\n\tdisplay: none;\n}\n\n.js .html-uploader #html-upload-ui {\n\tdisplay: block;\n}\n\n.media-upload-form .media-item.error,\n.media-upload-form .media-item .error {\n\twidth: auto;\n\tmargin: 0 0 1px 0;\n}\n\n.media-upload-form .media-item .error {\n\tpadding: 10px 0 10px 14px;\n}\n\n.media-item .error-div a.dismiss {\n\tdisplay: block;\n\tfloat: right;\n\tmargin: 0 10px 0 15px;\n}\n\n/*------------------------------------------------------------------------------\n  14.1 - Media Library\n------------------------------------------------------------------------------*/\n\n.find-box {\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\twidth: 600px;\n\toverflow: hidden;\n\tmargin-left: -300px;\n\tposition: fixed;\n\ttop: 30px;\n\tbottom: 30px;\n\tleft: 50%;\n\tz-index: 100105;\n}\n\n.find-box-head {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\theight: 36px;\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tline-height: 36px;\n\tpadding: 0 36px 0 16px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n}\n\n.find-box-inside {\n\toverflow: auto;\n\tpadding: 16px;\n\tbackground-color: #fff;\n\tposition: absolute;\n\ttop: 37px;\n\tbottom: 45px;\n\toverflow-y: scroll;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.find-box-search {\n\tpadding-bottom: 16px;\n}\n\n.find-box-search .spinner {\n\tfloat: none;\n\tleft: 105px;\n\tposition: absolute;\n}\n\n.find-box-search,\n#find-posts-response {\n\tposition: relative; /* RTL fix, #WP28010 */\n}\n\n#find-posts-input,\n#find-posts-search {\n\tfloat: left;\n}\n\n#find-posts-input {\n\twidth: 140px;\n\theight: 28px;\n\tmargin: 0 4px 0 0;\n}\n\n.widefat .found-radio {\n\tpadding-right: 0;\n\twidth: 16px;\n}\n\n#find-posts-close {\n\twidth: 36px;\n\theight: 36px;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tcursor: pointer;\n\ttext-align: center;\n\tcolor: #666;\n}\n\n#find-posts-close:hover {\n\tcolor: #00a0d2;\n}\n\n#find-posts-close:before {\n\tfont: normal 20px/36px dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcontent: \"\\f158\";\n}\n\n.find-box-buttons {\n\tpadding: 8px 16px;\n\tbackground: #fcfcfc;\n\tborder-top: 1px solid #dfdfdf;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n}\n\n@media screen and ( max-width: 782px ) {\n\t.find-box-inside {\n\t\tbottom: 57px;\n\t}\n}\n\n@media screen and ( max-width: 660px ) {\n\n\t.find-box {\n\t\ttop: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tmargin: 0;\n\t\twidth: 100%;\n\t}\n\n}\n\n.ui-find-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 100100;\n}\n\nul#dismissed-updates {\n\tdisplay: none;\n}\n\nform.upgrade {\n\tmargin-top: 8px;\n}\n\nform.upgrade .hint {\n\tfont-style: italic;\n\tfont-size: 85%;\n\tmargin: -0.5em 0 2em 0;\n}\n\n#poststuff .inside .the-tagcloud {\n\tmargin: 5px 0 10px;\n\tpadding: 8px;\n\tborder: 1px solid #ddd;\n\tline-height: 1.8em;\n\tword-spacing: 3px;\n}\n\n.drag-drop #drag-drop-area {\n\tborder: 4px dashed #b4b9be;\n\theight: 200px;\n}\n\n.drag-drop .drag-drop-inside {\n\tmargin: 70px auto 0;\n\twidth: 250px;\n}\n\n.drag-drop-inside p {\n\tcolor: #a0a5aa;\n\tfont-size: 14px;\n\tmargin: 5px 0;\n\tdisplay: none;\n}\n\n.drag-drop .drag-drop-inside p {\n\ttext-align: center;\n}\n\n.drag-drop-inside p.drag-drop-info {\n\tfont-size: 20px;\n}\n\n.drag-drop .drag-drop-inside p,\n.drag-drop-inside p.drag-drop-buttons {\n\tdisplay: block;\n}\n\n/*\n#drag-drop-area:-moz-drag-over {\n\tborder-color: #83b4d8;\n}\nborder color while dragging a file over the uploader drop area */\n.drag-drop.drag-over #drag-drop-area {\n\tborder-color: #83b4d8;\n}\n\n#plupload-upload-ui {\n\tposition: relative;\n}\n\n/**\n * Media Library grid view\n */\n\n.media-frame.mode-grid,\n.media-frame.mode-grid .media-frame-content,\n.media-frame.mode-grid .attachments-browser .attachments,\n.media-frame.mode-grid .uploader-inline-content {\n\tposition: static;\n}\n\n/* Regions we don't use at all */\n.media-frame.mode-grid .media-frame-title,\n.media-frame.mode-grid .media-frame-router,\n.media-frame.mode-grid .media-frame-menu {\n\tdisplay: none;\n}\n\n.media-frame.mode-grid .media-frame-content {\n\tbackground-color: transparent;\n\tborder: none;\n}\n\n.upload-php .mode-grid .media-sidebar {\n\tposition: relative;\n\twidth: auto;\n\tmargin-bottom: 16px;\n\tpadding: 0 16px;\n\tborder-left: 4px solid #dd3d36;\n \t-webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);\n \tbox-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);\n\tbackground-color: #fff;\n}\n\n.upload-php .mode-grid .hide-sidebar .media-sidebar {\n\tdisplay: none;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status {\n\tborder-bottom: none;\n\tpadding-bottom: 0;\n\tmax-width: 100%;\n}\n\n.upload-php .mode-grid .media-sidebar .upload-error {\n\tmargin: 12px 0;\n\tpadding: 4px 0 0;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: none;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors {\n\ttop: -10px;\n\tright: -14px;\n\tpadding: 10px;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:before {\n\tcontent: \"\\f153\";\n\tdisplay: block;\n\tfont: normal 16px/1 dashicons;\n\tcolor: #bbb;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:focus:before,\n.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:hover:before {\n\tcolor: #c00;\n}\n\n.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h3, /* Back-compat for pre-4.4 */\n.upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 {\n\tdisplay: none;\n}\n\n.media-frame.mode-grid .uploader-inline {\n\tposition: relative;\n\ttop: auto;\n\tright: auto;\n\tleft: auto;\n\tbottom: auto;\n\tpadding-top: 0;\n\tmargin-top: 0;\n\tborder: 4px dashed #b4b9be;\n}\n\n.media-frame.mode-select .attachments-browser.fixed .attachments {\n\tposition: relative;\n\ttop: 94px; /* prevent jumping up when the toolbar becomes fixed */\n\tpadding-bottom: 94px; /* offset for above so the bottom doesn't get cut off */\n}\n\n.media-frame.mode-grid .attachment:focus,\n.media-frame.mode-grid .selected.attachment:focus,\n.media-frame.mode-grid .attachment.details:focus {\n\t-webkit-box-shadow:\n\t\tinset 0 0 2px 3px #f1f1f1,\n\t\tinset 0 0 0 7px #5b9dd9;\n\tbox-shadow:\n\t\tinset 0 0 2px 3px #f1f1f1,\n\t\tinset 0 0 0 7px #5b9dd9;\n\toutline: none;\n}\n\n.media-frame.mode-grid .selected.attachment {\n\t-webkit-box-shadow:\n\t\tinset 0 0 0 5px #f1f1f1,\n\t\tinset 0 0 0 7px #ccc;\n\tbox-shadow:\n\t\tinset 0 0 0 5px #f1f1f1,\n\t\tinset 0 0 0 7px #ccc;\n}\n\n.media-frame.mode-grid .attachment.details {\n\t-webkit-box-shadow:\n\t\tinset 0 0 0 3px #f1f1f1,\n\t\tinset 0 0 0 7px #1e8cbe;\n\tbox-shadow:\n\t\tinset 0 0 0 3px #f1f1f1,\n\t\tinset 0 0 0 7px #1e8cbe;\n}\n\n.media-frame.mode-grid.mode-select .attachment .thumbnail {\n\topacity: 0.65;\n}\n\n.media-frame.mode-select .attachment.selected .thumbnail {\n\topacity: 1;\n}\n\n.media-frame.mode-grid .media-toolbar {\n\tmargin-bottom: 15px;\n\theight: auto;\n}\n\n.media-frame.mode-grid .media-toolbar select {\n\tmargin: 0 10px 0 0;\n\tfont-size: 14px;\n}\n\n.media-frame.mode-grid.mode-edit .media-toolbar-secondary > .select-mode-toggle-button {\n\tmargin: 0 8px 0 0;\n\tvertical-align: middle;\n}\n\n.media-frame.mode-grid .attachments-browser .bulk-select {\n\tdisplay: inline-block;\n\tmargin: 0 10px 0 0;\n}\n\n.media-frame.mode-grid .search {\n\tmargin-top: 0;\n}\n\n.media-frame.mode-grid .spinner {\n\tmargin-top: 16px;\n}\n\n.attachments-browser .media-toolbar-secondary > .media-button {\n\tmargin-right: 10px;\n}\n\n.media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n\tposition: fixed;\n\ttop: 32px;\n\tleft: auto;\n\tright: 20px;\n\tmargin-top: 0;\n}\n\n.media-frame.mode-grid .attachments-browser {\n\tpadding: 0;\n}\n\n.media-frame.mode-grid .attachments-browser .attachments {\n\tpadding: 2px;\n}\n\n.media-frame.mode-grid .attachments-browser .no-media {\n\tcolor: #999;\n\tfont-size: 18px;\n\tfont-style: normal;\n\tmargin: 0;\n\tpadding: 100px 0 0;\n\ttext-align: center;\n}\n\n/**\n * Attachment details modal\n */\n\n.edit-attachment-frame {\n\tdisplay: block;\n\theight: 100%;\n\twidth: 100%;\n}\n\n.edit-attachment-frame .edit-media-header {\n\toverflow: hidden;\n}\n\n.upload-php .media-modal-close .media-modal-icon:before {\n\tcontent: \"\\f335\";\n\tfont-size: 22px;\n}\n\n.upload-php .media-modal-close,\n.edit-attachment-frame .edit-media-header .left,\n.edit-attachment-frame .edit-media-header .right {\n\tcursor: pointer;\n\tcolor: #777;\n\tbackground-color: transparent;\n\theight: 50px;\n\twidth: 50px;\n\tpadding: 0;\n\tposition: absolute;\n\ttext-align: center;\n\tborder: 0;\n\tborder-left: 1px solid #ddd;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n    transition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.upload-php .media-modal-close {\n\ttop: 0;\n\tright: 0;\n}\n\n.edit-attachment-frame .edit-media-header .left {\n\tright: 102px;\n}\n\n.edit-attachment-frame .edit-media-header .right {\n\tright: 51px;\n}\n\n.edit-attachment-frame .media-frame-title {\n\tleft: 0;\n\tright: 150px; /* leave space for prev/next/close */\n}\n\n.edit-attachment-frame .edit-media-header .right:before,\n.edit-attachment-frame .edit-media-header .left:before {\n\tfont: normal 20px/50px dashicons !important;\n\tdisplay: inline;\n\tfont-weight: 300;\n}\n\n.upload-php .media-modal-close:hover,\n.upload-php .media-modal-close:focus,\n.edit-attachment-frame .edit-media-header .left:hover,\n.edit-attachment-frame .edit-media-header .right:hover,\n.edit-attachment-frame .edit-media-header .left:focus,\n.edit-attachment-frame .edit-media-header .right:focus {\n\tbackground: #ddd;\n\tborder-color: #ccc;\n\tcolor: #000;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.upload-php .media-modal-close:focus .media-modal-icon:before,\n.upload-php .media-modal-close:hover .media-modal-icon:before {\n\tcolor: #000;\n}\n\n.edit-attachment-frame .edit-media-header .left:before,\n.rtl .edit-attachment-frame .edit-media-header .right:before {\n\tcontent: \"\\f341\";\n}\n\n.edit-attachment-frame .edit-media-header .right:before,\n.rtl .edit-attachment-frame .edit-media-header .left:before {\n\tcontent: \"\\f345\";\n}\n\n.edit-attachment-frame .edit-media-header .left.disabled,\n.edit-attachment-frame .edit-media-header .right.disabled,\n.edit-attachment-frame .edit-media-header .left.disabled:hover,\n.edit-attachment-frame .edit-media-header .right.disabled:hover {\n\tcolor: #ccc;\n\tbackground: inherit;\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.edit-attachment-frame .media-frame-content,\n.edit-attachment-frame .media-frame-router {\n\tleft: 0;\n}\n\n.edit-attachment-frame .media-frame-content {\n\tborder-bottom: none;\n\tbottom: 0;\n\ttop: 50px;\n}\n\n.edit-attachment-frame .attachment-details {\n\tposition: absolute;\n\toverflow: auto;\n\ttop: 0;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\t-webkit-box-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1);\n\tbox-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1);\n}\n\n.edit-attachment-frame .attachment-media-view {\n\tfloat: left;\n\twidth: 65%;\n\theight: 100%;\n}\n\n.edit-attachment-frame .attachment-media-view .thumbnail {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tpadding: 16px;\n\theight: 100%;\n}\n\n.edit-attachment-frame .attachment-media-view .details-image {\n\tdisplay: block;\n\tmargin-bottom: 16px;\n\tmax-width: 100%;\n\tmax-height: 90%;\n\tmax-height: -webkit-calc( 100% - 42px );\n\tmax-height: calc( 100% - 42px ); /* leave space for actions underneath */\n}\n\n.edit-attachment-frame .wp-media-wrapper {\n\tmargin-bottom: 12px;\n}\n\n.edit-attachment-frame input,\n.edit-attachment-frame textarea {\n\tpadding: 6px 8px;\n\tline-height: 16px;\n}\n\n.edit-attachment-frame .attachment-info {\n\toverflow: auto;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 0;\n\tpadding: 12px 16px 0;\n\twidth: 35%;\n\theight: 100%;\n\t-webkit-box-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1);\n\tbox-shadow: inset 0px 4px 4px -4px rgba(0, 0, 0, 0.1);\n\tborder-bottom: 0;\n\tborder-left: 1px solid #ddd;\n\tbackground: #f3f3f3;\n}\n\n.edit-attachment-frame .attachment-info .details,\n.edit-attachment-frame .attachment-info .settings {\n\tposition: relative; /* RTL fix, #WP29352 */\n\toverflow: hidden;\n\tfloat: none;\n\tmargin-bottom: 15px;\n\tpadding-bottom: 15px;\n\tborder-bottom: 1px solid #ddd;\n}\n\n.edit-attachment-frame .attachment-info .filename {\n\tfont-weight: normal;\n\tcolor: #666;\n}\n\n.edit-attachment-frame .attachment-info .thumbnail {\n\tmargin-bottom: 12px;\n}\n\n.attachment-info .actions {\n\tmargin-bottom: 16px;\n}\n\n.attachment-info .actions a {\n\tdisplay: inline;\n\ttext-decoration: none;\n}\n\n\n/*------------------------------------------------------------------------------\n  14.2 - Image Editor\n------------------------------------------------------------------------------*/\n\n.wp_attachment_details label[for=\"content\"] {\n\tfont-size: 13px;\n\tline-height: 1.5;\n\tmargin: 1em 0;\n}\n\n.wp_attachment_details #attachment_caption {\n\theight: 4em;\n}\n\n.describe .image-editor {\n\tvertical-align: top;\n}\n\n.imgedit-wrap {\n\tposition: relative;\n}\n\n.imgedit-settings p {\n\tmargin: 8px 0 0;\n}\n\n.describe .imgedit-wrap .imgedit-settings {\n\tpadding: 0 5px;\n}\n\n.wp_attachment_holder div.updated {\n\tmargin-top: 0;\n}\n\n.wp_attachment_holder .imgedit-wrap > div {\n\theight: auto;\n\toverflow: hidden;\n}\n\n.wp_attachment_holder .imgedit-wrap .imgedit-panel-content {\n\tpadding-right: 16px;\n\twidth: auto;\n\toverflow: hidden;\n}\n\n.wp_attachment_holder .imgedit-wrap .imgedit-settings {\n\tfloat: right;\n\twidth: 250px;\n}\n\n.imgedit-settings input {\n\tmargin-top: 0;\n\tvertical-align: middle;\n}\n\n.imgedit-wait {\n\tposition: absolute;\n\ttop: 0;\n\tbackground: #fff url(../images/spinner.gif) no-repeat center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\twidth: 100%;\n\theight: 500px;\n\tdisplay: none;\n}\n\n.no-float {\n\tfloat: none;\n}\n\n.media-disabled,\n.imgedit-settings .disabled {\n\tcolor: grey;\n}\n\n.wp_attachment_image,\n.A1B1 {\n\toverflow: hidden;\n}\n\n.wp_attachment_image .button,\n.A1B1 .button {\n\tfloat: left;\n}\n\n.no-js .wp_attachment_image .button {\n\tdisplay: none;\n}\n\n.wp_attachment_image .spinner,\n.A1B1 .spinner {\n\tfloat: left;\n}\n\n.imgedit-menu {\n\tmargin: 0 0 12px;\n\tmin-width: 300px;\n}\n\n.imgedit-menu div {\n\tfloat: left;\n\twidth: 32px;\n\tborder: 1px solid #d5d5d5;\n\tbackground: #f1f1f1;\n\tmargin: 0 8px 0 0;\n\theight: 32px;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttext-align: center;\n\tline-height: 28px;\n\tcolor: #777;\n\tcursor: pointer;\n}\n\n.imgedit-menu div:before {\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: middle;\n}\n\n.imgedit-menu div:hover {\n\tborder-color: #c1c1c1;\n\tbackground-color: #eaeaea;\n\tcolor: #32373c;\n}\n\n.imgedit-menu div.disabled {\n\tborder-color: #ccc;\n\tbackground-color: #ddd;\n\tcolor: #777;\n\tfilter: alpha(opacity=50);\n\topacity: 0.5;\n\tcursor: default;\n}\n\n.imgedit-crop:before {\n\tcontent: \"\\f165\";\n}\n\n.imgedit-rleft:before {\n\tcontent: \"\\f166\";\n}\n\n.imgedit-rright:before {\n\tcontent: \"\\f167\";\n}\n\n.imgedit-flipv:before {\n\tcontent: \"\\f168\";\n}\n\n.imgedit-fliph:before {\n\tcontent: \"\\f169\";\n}\n\n.imgedit-undo:before {\n\tcontent: \"\\f171\";\n}\n\n.imgedit-redo:before {\n\tcontent: \"\\f172\";\n}\n\n.imgedit-crop-wrap {\n\tposition: relative;\n}\n\n.imgedit-crop {\n\tmargin: 0 8px 0 0;\n}\n\n.imgedit-rleft {\n\tmargin: 0 3px;\n}\n\n.imgedit-rright {\n\tmargin: 0 8px 0 3px;\n}\n\n.imgedit-flipv {\n\tmargin: 0 3px;\n}\n\n.imgedit-fliph {\n\tmargin: 0 8px 0 3px;\n}\n\n.imgedit-undo {\n\tmargin: 0 3px;\n}\n\n.imgedit-redo {\n\tmargin: 0 8px 0 3px;\n}\n\n.imgedit-applyto img {\n\tmargin: 0 8px 0 0;\n}\n\n#poststuff .imgedit-group-top h3, /* Back-compat for pre-4.4 */\n#poststuff .imgedit-group-top h2 {\n\tmargin: 0;\n\tpadding: 0;\n\tfont-size: 14px;\n\tline-height: 1.4;\n}\n\n.imgedit-group-top h3 a, /* Back-compat for pre-4.4 */\n.imgedit-group-top h2 a {\n\ttext-decoration: none;\n}\n\n.imgedit-applyto .imgedit-label {\n\tpadding: 2px 0 0;\n\tdisplay: block;\n}\n\n.imgedit-help {\n\tdisplay: none;\n\tfont-style: italic;\n}\n\na.imgedit-help-toggle {\n\ttext-decoration: none;\n}\n\n.form-table td.imgedit-response {\n\tpadding: 0;\n}\n\n.imgedit-submit {\n\tmargin: 8px 0 0;\n}\n\n.imgedit-submit-btn {\n\tmargin-left: 20px;\n}\n\n.imgedit-wrap .nowrap {\n\twhite-space: nowrap;\n}\n\nspan.imgedit-scale-warn {\n\tcolor: red;\n\tfont-size: 20px;\n\tfont-style: normal;\n\tvisibility: hidden;\n\tvertical-align: middle;\n}\n\n.imgedit-group {\n\tmargin-bottom: 8px;\n\tpadding: 10px;\n}\n\naudio, video {\n\tdisplay: inline-block;\n\tmax-width: 100%;\n}\n\n.mejs-container {\n\twidth: 100%;\n\tmax-width: 100%;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t.imgedit-wait {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t.wp_attachment_details label[for=\"content\"] {\n\t\tfont-size: 14px;\n\t\tline-height: 1.5em;\n\t}\n\n\t.media-upload-form .media-item.error,\n\t.media-upload-form .media-item .error {\n\t\tfont-size: 13px;\n\t\tline-height: 1.5;\n\t}\n\n\t.media-upload-form .media-item.error {\n\t\tpadding: 1px 10px;\n\t}\n\n\t.media-upload-form .media-item .error {\n\t\tpadding: 10px 0 10px 12px;\n\t}\n}\n\n/**\n * Media queries for media grid.\n */\n\n@media only screen and (max-width: 1120px) {\n\t/* override for media-views.css */\n\t#wp-media-grid .wp-filter .attachment-filters {\n\t\tmax-width: 100%;\n\t}\n}\n\n@media only screen and ( max-width: 782px ) {\n\t.media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n\t\ttop: 46px;\n\t\tright: 10px;\n\t}\n}\n\n@media only screen and (max-width: 600px) {\n\t.media-frame.mode-select .attachments-browser.fixed .media-toolbar {\n\t\ttop: 0;\n\t}\n}\n\n@media only screen and (max-width: 480px) {\n\t.edit-attachment-frame .media-frame-title {\n\t\tright: 110px;\n\t}\n\n\t.upload-php .media-modal-close,\n\t.edit-attachment-frame .edit-media-header .left,\n\t.edit-attachment-frame .edit-media-header .right {\n\t\twidth: 40px;\n\t\theight: 40px;\n\t}\n\n\t.upload-php .media-modal-close .media-modal-icon {\n\t\tmargin: 9px 10px;\n\t}\n\n\t.edit-attachment-frame .edit-media-header .right:before,\n\t.edit-attachment-frame .edit-media-header .left:before {\n\t\tline-height: 40px !important;\n\t}\n\n\t.edit-attachment-frame .edit-media-header .left {\n\t\tright: 82px;\n\t}\n\n\t.edit-attachment-frame .edit-media-header .right {\n\t\tright: 41px;\n\t}\n\n\t.edit-attachment-frame .media-frame-content {\n\t\ttop: 40px;\n\t}\n\n\t.edit-attachment-frame .attachment-media-view {\n\t\tfloat: none;\n\t\theight: auto;\n\t\twidth: 100%;\n\t}\n\n\t.edit-attachment-frame .attachment-info {\n\t\theight: auto;\n\t\twidth: 100%;\n\t}\n}\n\n@media only screen and (max-width: 640px), screen and (max-height: 400px) {\n\t.upload-php .mode-grid .media-sidebar{\n\t\tmax-width: 100%;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/nav-menus-rtl.css",
    "content": "/* nav-menu */\n\n/* @todo: determine if this is truly for nav menus only */\n.no-js #message {\n\tdisplay: block;\n}\n\nul.add-menu-item-tabs li {\n\tpadding: 3px 8px 3px 5px;\n}\n\n.accordion-section ul.category-tabs,\n.accordion-section ul.add-menu-item-tabs,\n.accordion-section ul.wp-tab-bar {\n\tmargin: 0;\n}\n\n.accordion-section .categorychecklist {\n\tmargin: 13px 0;\n}\n\n#nav-menu-meta .accordion-section-content {\n\tpadding: 18px 13px;\n}\n\n#nav-menu-meta .button-controls {\n\tmargin-bottom: 0;\n}\n\n#nav-menus-frame {\n\tmargin-right: 300px;\n\tmargin-top: 23px;\n}\n\n#wpbody-content #menu-settings-column {\n\tdisplay:inline;\n\twidth:281px;\n\tmargin-right: -300px;\n\tclear: both;\n\tfloat: right;\n\tpadding-top: 0;\n}\n\n#menu-settings-column .inside {\n\tclear: both;\n\tmargin: 10px 0 0;\n}\n\n.metabox-holder-disabled .postbox,\n.metabox-holder-disabled .accordion-section-content,\n.metabox-holder-disabled .accordion-section-title {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50);\n}\n\n.metabox-holder-disabled .button-controls .select-all {\n\tdisplay: none;\n}\n\n#wpbody {\n\tposition: relative;\n}\n\n.blank-slate .menu-name {\n\theight: 2em;\n}\n\n.blank-slate .menu-settings {\n\tborder: none;\n\tmargin-top: 0;\n\tpadding-top: 0;\n\toverflow: hidden;\n}\n\n.is-submenu {\n\tcolor: #999;\n\tfont-style: italic;\n\tfont-weight: normal;\n\tmargin-right: 4px;\n}\n\n.manage-menus {\n\tmargin-top: 23px;\n\tpadding: 10px;\n\toverflow: hidden;\n\tbackground: #fbfbfb;\n}\n\n.manage-menus select {\n\tfloat: right;\n\tmargin-left: 6px;\n}\n\n.manage-menus .selected-menu {\n\tfloat: right;\n\tmargin: 5px 0 0 6px;\n}\n\n.manage-menus .submit-btn {\n\tfloat: right;\n\tmargin-top: 1px;\n}\n\n.menu-edit #post-body-content h3 {\n\tmargin: 1em 0 10px;\n}\n\n.menu-settings {\n\tborder-top: 1px solid #eee;\n\tmargin-top: 2em;\n}\n\n.menu-settings dl {\n\tmargin: 0 0 10px;\n\toverflow: hidden;\n\tpadding-right: 18%;\n}\n\n.menu-settings dd {\n\tfloat: right;\n\tmargin: 0;\n\twidth: 100%;\n}\n\n.menu-settings dt {\n\tfloat: right;\n\tclear: both;\n\twidth: 21.951%;\n\tpadding: 3px 0 0;\n\tmargin-right: -21.951%;\n}\n\n.menu-settings label {\n\tvertical-align: baseline;\n}\n\n.menu-edit .checkbox-input {\n\tmargin-top: 4px;\n}\n\n.theme-location-set {\n\tcolor: #999;\n\tfont-size: 11px;\n}\n\n/* Menu Container */\n#menu-management-liquid {\n\tfloat: right;\n\tmin-width: 100%;\n\tmargin-top: 3px;\n}\n\n#menu-management {\n\tposition: relative;\n\tmargin-left: 20px;\n\tmargin-top: -3px;\n\twidth: 100%;\n\tbackground: #f5f5f5;\n}\n\n#menu-management .menu-edit {\n\tmargin-bottom: 20px;\n}\n\n.nav-menus-php #post-body {\n\tpadding: 0 10px 10px;\n\tborder-top: 1px solid #fff;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground: #fff;\n}\n\n#nav-menu-header,\n#nav-menu-footer {\n\tpadding: 0 10px;\n}\n\n#nav-menu-header {\n\tborder-bottom: 1px solid #dfdfdf;\n\tmargin-bottom: 0;\n}\n\n#nav-menu-header .menu-name-label {\n\tmargin-top: 4px;\n}\n\n.nav-menus-php #post-body div.updated,\n.nav-menus-php #post-body div.error {\n\tmargin: 0;\n}\n\n.nav-menus-php #post-body-content {\n\tposition: relative;\n\tfloat: none;\n}\n\n#menu-management .menu-add-new abbr {\n\tfont-weight:600;\n}\n\n#select-nav-menu-container {\n\ttext-align: left;\n\tpadding: 0 10px 3px 10px;\n\tmargin-bottom: 5px;\n}\n\n#select-nav-menu {\n\twidth: 100px;\n\tdisplay: inline;\n}\n\n#menu-name-label {\n\tmargin-top: -2px;\n}\n\n.widefat .menu-locations tr + tr td {\n\tpadding-top: 0;\n}\n\n.widefat .menu-locations td {\n\tvertical-align: middle;\n}\n\n.menu-location-title label {\n\tfont-weight: bold;\n}\n\n.menu-location-menus select {\n\tfloat: right;\n}\n\n#locations-nav-menu-wrapper {\n\tpadding: 5px 0;\n}\n\n.locations-nav-menu-select select {\n\tfloat: right;\n\twidth: 160px;\n\tmargin-left: 5px;\n}\n\n.locations-row-links {\n\tfloat: right;\n\tmargin: 6px 6px 0 0;\n}\n\n.locations-edit-menu-link,\n.locations-add-menu-link {\n\tmargin: 0 3px;\n}\n\n.locations-edit-menu-link {\n\tpadding-left: 3px;\n\tborder-left: 1px solid #ccc;\n}\n\n#wpbody .open-label {\n\tdisplay: block;\n\tfloat:right;\n}\n\n#wpbody .open-label span {\n\tpadding-left: 10px;\n}\n\n.js .input-with-default-title {\n\tcolor: #a0a5aa;\n\tfont-style: italic;\n}\n\n#menu-management .inside {\n\tpadding: 0 10px;\n}\n\n/* Add Menu Item Boxes */\n.postbox .howto input,\n.accordion-container .howto input {\n\twidth: 180px;\n\tfloat: left;\n}\n\n.accordion-container .outer-border {\n\tmargin: 0;\n}\n\n.customlinkdiv .howto input {\n\twidth: 180px;\n}\n\n.customlinkdiv p {\n\tmargin-top: 0\n}\n\n#nav-menu-theme-locations .howto select {\n\twidth: 100%;\n}\n\n#nav-menu-theme-locations .button-controls {\n\ttext-align: left;\n}\n\n.add-menu-item-view-all {\n\theight: 400px;\n}\n\n/* Button Primary Actions */\n#menu-container .submit {\n\tmargin: 0 0 10px;\n\tpadding: 0;\n}\n\n.nav-menus-php .add-new-menu-action {\n\tfloat: right;\n\tmargin: 6px 6px 0 0;\n\tline-height: 15px;\n}\n\n.nav-menus-php .meta-sep,\n.nav-menus-php .submitdelete,\n.nav-menus-php .submitcancel {\n\tdisplay: block;\n\tfloat: right;\n\tmargin: 6px 0;\n\tline-height: 15px;\n}\n\n.meta-sep {\n\tpadding: 0 2px;\n}\n\n/* @todo: is this actually used? */\n#cancel-save {\n\ttext-decoration: underline;\n\tfont-size: 12px;\n\tmargin-right: 20px;\n\tmargin-top: 5px;\n}\n\n.button.right, .button-secondary.right, .button-primary.right {\n\tfloat: left;\n}\n\n/* Button Secondary Actions */\n.list-controls {\n\tfloat: right;\n\tmargin-top: 5px;\n}\n\n.add-to-menu {\n\tfloat: left;\n}\n\n.button-controls {\n\tclear:both;\n\tmargin: 10px 0;\n}\n\n.show-all,\n.hide-all {\n\tcursor: pointer;\n}\n\n.hide-all {\n\tdisplay: none;\n}\n\n/* Create Menu */\n#menu-name {\n\twidth: 270px;\n}\n\n#manage-menu .inside {\n\tpadding: 0px 0px;\n}\n\n/* Custom Links */\n#available-links dt {\n\tdisplay: block;\n}\n\n#add-custom-link .howto {\n\tfont-size: 12px;\n}\n\n#add-custom-link label span {\n\tdisplay: block;\n\tfloat: right;\n\tmargin-top: 5px;\n\tpadding-left: 5px;\n}\n\n.menu-item-textbox {\n\twidth: 180px;\n}\n\n.nav-menus-php .howto span {\n\tmargin-top: 6px;\n\tdisplay: block;\n\tfloat: right;\n}\n\n/* Menu item types */\n.quick-search {\n\twidth: 190px;\n}\n\n.quick-search-wrap .spinner {\n\tfloat: none;\n\tmargin: -3px 0 0 -10px;\n}\n\n.nav-menus-php .list-wrap {\n\tdisplay: none;\n\tclear: both;\n\tmargin-bottom: 10px;\n}\n\n.nav-menus-php .postbox p.submit {\n\tmargin-bottom: 0;\n}\n\n/* Listings */\n.nav-menus-php .list li {\n\tdisplay: none;\n\tmargin: 0;\n\tmargin-bottom: 5px;\n}\n\n.nav-menus-php .list li .menu-item-title {\n\tcursor: pointer;\n\tdisplay: block;\n}\n\n.nav-menus-php .list li .menu-item-title input {\n\tmargin-left: 3px;\n\tmargin-top: -3px;\n}\n\n.menu-item-title input[type=checkbox] {\n\tdisplay: inline-block;\n\tmargin-top: -4px;\n}\n\n/* Nav Menu */\n#menu-container .inside {\n\tpadding-bottom: 10px;\n}\n\n.menu {\n\tpadding-top:1em;\n}\n\n#menu-to-edit {\n\tmargin: 0;\n\tpadding: 0.1em 0;\n}\n\n.menu ul {\n\twidth: 100%;\n}\n\n.menu li {\n\tmargin-bottom: 0;\n\tposition:relative;\n}\n\n.menu-item-bar {\n\tclear:both;\n\tline-height:1.5em;\n\tposition:relative;\n\tmargin: 9px 0 0;\n}\n\n.menu-item-bar .menu-item-handle {\n\tborder: 1px solid #dfdfdf;\n\tposition: relative;\n\tpadding: 10px 15px;\n\theight: auto;\n\tmin-height: 20px;\n\twidth: 382px;\n\tline-height: 30px;\n\toverflow: hidden;\n\tword-wrap: break-word;\n}\n\n.menu-item-bar .menu-item-handle:hover {\n\tborder-color: #999;\n}\n\n#menu-to-edit .menu-item-invalid .menu-item-handle {\n\tbackground: #f6c9cc;\n\tborder-color: #f1acb1;\n}\n\n.no-js .menu-item-edit-active .item-edit {\n\tdisplay: none;\n}\n\n.js .menu-item-handle {\n\tcursor: move;\n}\n\n.menu li.deleting .menu-item-handle {\n\tbackground-image: none;\n\tbackground-color: #f66;\n}\n\n.menu-item-handle .item-title {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tline-height: 20px;\n\tdisplay: block;\n\tmargin-left: 13em;\n}\n\n.menu-item-handle .menu-item-title.no-title {\n\tcolor: #999;\n}\n\n/* Sortables */\nli.menu-item.ui-sortable-helper .menu-item-bar {\n\tmargin-top: 0;\n}\n\nli.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar {\n\tmargin-top: 13px;\n}\n\n.menu .sortable-placeholder {\n\theight: 35px;\n\twidth: 410px;\n\tmargin-top: 13px;\n}\n\n/* Hide the transport list when it's empty */\n.menu-item .menu-item-transport:empty {\n\tdisplay: none;\n}\n\n/* WARNING: The factor of 30px is hardcoded into the nav-menus JavaScript. */\n.menu-item-depth-0 { margin-right: 0px; }\n.menu-item-depth-1 { margin-right: 30px; }\n.menu-item-depth-2 { margin-right: 60px; }\n.menu-item-depth-3 { margin-right: 90px; }\n.menu-item-depth-4 { margin-right: 120px; }\n.menu-item-depth-5 { margin-right: 150px; }\n.menu-item-depth-6 { margin-right: 180px; }\n.menu-item-depth-7 { margin-right: 210px; }\n.menu-item-depth-8 { margin-right: 240px; }\n.menu-item-depth-9 { margin-right: 270px; }\n.menu-item-depth-10 { margin-right: 300px; }\n.menu-item-depth-11 { margin-right: 330px; }\n\n.menu-item-depth-0 .menu-item-transport { margin-right: 0px; }\n.menu-item-depth-1 .menu-item-transport { margin-right: -30px; }\n.menu-item-depth-2 .menu-item-transport { margin-right: -60px; }\n.menu-item-depth-3 .menu-item-transport { margin-right: -90px; }\n.menu-item-depth-4 .menu-item-transport { margin-right: -120px; }\n.menu-item-depth-5 .menu-item-transport { margin-right: -150px; }\n.menu-item-depth-6 .menu-item-transport { margin-right: -180px; }\n.menu-item-depth-7 .menu-item-transport { margin-right: -210px; }\n.menu-item-depth-8 .menu-item-transport { margin-right: -240px; }\n.menu-item-depth-9 .menu-item-transport { margin-right: -270px; }\n.menu-item-depth-10 .menu-item-transport { margin-right: -300px; }\n.menu-item-depth-11 .menu-item-transport { margin-right: -330px; }\n\nbody.menu-max-depth-0 { min-width: 950px !important; }\nbody.menu-max-depth-1 { min-width: 980px !important; }\nbody.menu-max-depth-2 { min-width: 1010px !important; }\nbody.menu-max-depth-3 { min-width: 1040px !important; }\nbody.menu-max-depth-4 { min-width: 1070px !important; }\nbody.menu-max-depth-5 { min-width: 1100px !important; }\nbody.menu-max-depth-6 { min-width: 1130px !important; }\nbody.menu-max-depth-7 { min-width: 1160px !important; }\nbody.menu-max-depth-8 { min-width: 1190px !important; }\nbody.menu-max-depth-9 { min-width: 1220px !important; }\nbody.menu-max-depth-10 { min-width: 1250px !important; }\nbody.menu-max-depth-11 { min-width: 1280px !important; }\n\n/* Menu item controls */\n.item-type {\n\tdisplay: inline-block;\n\tpadding: 12px 16px;\n\tcolor: #666;\n\tfont-size: 12px;\n\tline-height: 18px;\n}\n\n.item-controls {\n\tfont-size: 12px;\n\tposition: absolute;\n\tleft: 20px;\n\ttop: -1px;\n}\n\n.item-controls a {\n\ttext-decoration: none;\n}\n\n.item-controls a:hover {\n\tcursor: pointer;\n}\n\n.item-controls .item-order {\n\tpadding-left: 10px;\n}\n\n.nav-menus-php .item-edit {\n\tposition: absolute;\n\tleft: -20px;\n\ttop: 0;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 40px;\n\tmargin-left: 0 !important;\n\ttext-indent: 100%;\n\toutline: none;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.nav-menus-php .item-edit:before {\n\tmargin-top: 10px;\n\tmargin-right: 4px;\n\twidth: 20px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\ttext-indent: -1px; /* account for the dashicon alignment */\n}\n\n.rtl .nav-menus-php .item-edit:before {\n\ttext-indent: 1px; /* account for the dashicon alignment */\n}\n\n.nav-menus-php .item-edit:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.nav-menus-php .item-edit:focus:before {\n\t-webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n/* Menu editing */\n.menu-instructions-inactive {\n\tdisplay: none;\n}\n\n.menu-item-settings {\n\tdisplay: block;\n\twidth: 402px;\n\tpadding: 10px 10px 10px 0;\n\tposition: relative;\n\tz-index: 10; /* Keep .item-title's shadow from appearing on top of .menu-item-settings */\n\tborder: 1px solid #e5e5e5;\n\tborder-top: none;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n}\n\n.menu-item-settings .field-move a {\n\tdisplay: none;\n\tmargin: 0 2px;\n}\n\n.menu-item-edit-active .menu-item-settings {\n\tdisplay: block;\n}\n\n.menu-item-edit-inactive .menu-item-settings {\n\tdisplay: none;\n}\n\n.add-menu-item-pagelinks {\n\tmargin: .5em auto;\n\ttext-align: center;\n}\n\n.link-to-original {\n\tdisplay: block;\n\tmargin: 0 0 10px;\n\tpadding: 3px 5px 5px;\n\tborder: 1px solid #dfdfdf;\n\tcolor: #777;\n\tfont-size: 12px;\n\tfont-style: italic;\n}\n\n.link-to-original a {\n\tpadding-right: 4px;\n\tfont-style: normal;\n}\n\n.hidden-field {\n\tdisplay: none;\n}\n\n.menu-item-settings .description-thin,\n.menu-item-settings .description-wide {\n\tmargin-left: 10px;\n\tfloat: right;\n}\n\n.description-thin {\n\twidth: 190px;\n}\n\n.description-wide {\n\twidth: 390px;\n}\n\n.menu-item-actions {\n\tpadding-top: 15px;\n}\n\n#cancel-save {\n\tcursor: pointer;\n}\n\n/* Major/minor publishing actions (classes) */\n.nav-menus-php .major-publishing-actions {\n\tclear: both;\n\tpadding: 3px 0 6px;\n}\n\n.nav-menus-php .major-publishing-actions .publishing-action {\n\ttext-align: left;\n\tfloat: left;\n\tline-height: 23px;\n\tmargin: 4px 0 1px;\n}\n\n.nav-menus-php .blank-slate .menu-settings {\n\tdisplay: none;\n}\n\n.nav-menus-php .delete-action {\n\tfloat: right;\n\tmargin-top: 2px;\n}\n\n.nav-menus-php .submitbox .submitcancel {\n\tborder-bottom: 1px solid #0073aa;\n\tpadding: 1px 2px;\n\tcolor: #0073aa;\n\ttext-decoration: none;\n}\n\n.nav-menus-php .submitbox .submitcancel:hover {\n\tbackground: #0073aa;\n\tcolor: #fff;\n}\n\n.nav-menus-php .major-publishing-actions .form-invalid {\n\tpadding-right: 4px;\n\tmargin-right: -4px;\n}\n\n/* Clearfix */\n#menu-item-name-wrap:after,\n#menu-item-url-wrap:after,\n#menu-name-label:after,\n#menu-settings-column .inside:after,\n#nav-menus-frame:after,\n.nav-menus-php #post-body-content:after,\n.nav-menus-php .button-controls:after,\n.nav-menus-php .major-publishing-actions:after,\n.nav-menus-php .menu-item-settings:after {\n\tclear: both;\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tvisibility: hidden;\n}\n\n#nav-menus-frame,\n.button-controls,\n#menu-item-url-wrap,\n#menu-item-name-wrap {\n\tdisplay: block;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n@media only screen and (min-width: 769px) and (max-width: 1000px){\n\tbody.menu-max-depth-0 {\n\t\tmin-width: 0 !important;\n\t}\n\n\t#menu-management-liquid{\n\t\twidth: 100%;\n\t}\n\n\t.nav-menus-php #post-body-content{\n\t\tmin-width: 0;\n\t}\n\n\t.menu-item-bar .menu-item-handle{\n\t\twidth: 90%;\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\tbody.nav-menus-php {\n\t\tmin-width: 0 !important;\n\t}\n\n\t#nav-menus-frame {\n\t\tmargin-right: 0;\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\n\t#wpbody-content #menu-settings-column {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tfloat: none;\n\t\tmargin-right: 0;\n\t}\n\n\t#side-sortables .add-menu-item-tabs {\n\t\tmargin: 15px 0 14px;\n\t}\n\n\tul.add-menu-item-tabs li.tabs {\n\t\tpadding: 13px 15px 14px;\n\t}\n\n\t.nav-menus-php .item-controls .item-type {\n\t\tmargin-top: 2px;\n\t}\n\n\t.nav-menus-php .customlinkdiv .howto input {\n\t\twidth: 65%;\n\t}\n\n\t.nav-menus-php .quick-search {\n\t\twidth: 85%;\n\t}\n\n\t#menu-management-liquid {\n\t\tmargin-top: 25px;\n\t}\n\n\t.nav-menus-php .menu-name-label.howto span {\n\t\tmargin-top: 13px\n\t}\n\n\t.menu-name-label #menu-name {\n\t\tmargin-top: 4px;\n\t}\n\n\t.nav-menus-php .major-publishing-actions .publishing-action {\n\t\tmargin-top: 6px;\n\t}\n\n\t.nav-menus-php .delete-action {\n\t\tfont-size: 14px;\n\t\tline-height: 50px;\n\t\tmargin-top: 12px;\n\t}\n\n\t.menu-item-bar .menu-item-handle,\n\t.menu-item-settings,\n\t.description-wide {\n\t\twidth: auto;\n\t}\n\n\t.menu-item-settings {\n\t\tpadding: 10px;\n\t}\n\n\t.menu-item-settings .description-thin,\n\t.menu-item-settings .description-wide {\n\t\twidth: 100%;\n\t}\n\n\t.menu-item-settings input {\n\t\twidth: 100%;\n\t}\n\n\t.menu-item-settings input[type=\"checkbox\"],\n\t.menu-item-settings input[type=\"radio\"] {\n\t\twidth: 25px;\n\t}\n\n\t.menu-settings dl {\n\t\tpadding-right: 0;\n\t}\n\n\t.menu-settings dd {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t.menu-settings dt {\n\t\tfloat: none;\n\t\twidth: auto;\n\t\tmargin-right: 0;\n\t\tmargin-bottom: 15px;\n\t}\n}\n\n@media only screen and (max-width: 768px) {\n\t/* menu locations */\n\t#menu-locations-wrap .widefat {\n\t\twidth: 100%;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/nav-menus.css",
    "content": "/* nav-menu */\n\n/* @todo: determine if this is truly for nav menus only */\n.no-js #message {\n\tdisplay: block;\n}\n\nul.add-menu-item-tabs li {\n\tpadding: 3px 5px 3px 8px;\n}\n\n.accordion-section ul.category-tabs,\n.accordion-section ul.add-menu-item-tabs,\n.accordion-section ul.wp-tab-bar {\n\tmargin: 0;\n}\n\n.accordion-section .categorychecklist {\n\tmargin: 13px 0;\n}\n\n#nav-menu-meta .accordion-section-content {\n\tpadding: 18px 13px;\n}\n\n#nav-menu-meta .button-controls {\n\tmargin-bottom: 0;\n}\n\n#nav-menus-frame {\n\tmargin-left: 300px;\n\tmargin-top: 23px;\n}\n\n#wpbody-content #menu-settings-column {\n\tdisplay:inline;\n\twidth:281px;\n\tmargin-left: -300px;\n\tclear: both;\n\tfloat: left;\n\tpadding-top: 0;\n}\n\n#menu-settings-column .inside {\n\tclear: both;\n\tmargin: 10px 0 0;\n}\n\n.metabox-holder-disabled .postbox,\n.metabox-holder-disabled .accordion-section-content,\n.metabox-holder-disabled .accordion-section-title {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50);\n}\n\n.metabox-holder-disabled .button-controls .select-all {\n\tdisplay: none;\n}\n\n#wpbody {\n\tposition: relative;\n}\n\n.blank-slate .menu-name {\n\theight: 2em;\n}\n\n.blank-slate .menu-settings {\n\tborder: none;\n\tmargin-top: 0;\n\tpadding-top: 0;\n\toverflow: hidden;\n}\n\n.is-submenu {\n\tcolor: #999;\n\tfont-style: italic;\n\tfont-weight: normal;\n\tmargin-left: 4px;\n}\n\n.manage-menus {\n\tmargin-top: 23px;\n\tpadding: 10px;\n\toverflow: hidden;\n\tbackground: #fbfbfb;\n}\n\n.manage-menus select {\n\tfloat: left;\n\tmargin-right: 6px;\n}\n\n.manage-menus .selected-menu {\n\tfloat: left;\n\tmargin: 5px 6px 0 0;\n}\n\n.manage-menus .submit-btn {\n\tfloat: left;\n\tmargin-top: 1px;\n}\n\n.menu-edit #post-body-content h3 {\n\tmargin: 1em 0 10px;\n}\n\n.menu-settings {\n\tborder-top: 1px solid #eee;\n\tmargin-top: 2em;\n}\n\n.menu-settings dl {\n\tmargin: 0 0 10px;\n\toverflow: hidden;\n\tpadding-left: 18%;\n}\n\n.menu-settings dd {\n\tfloat: left;\n\tmargin: 0;\n\twidth: 100%;\n}\n\n.menu-settings dt {\n\tfloat: left;\n\tclear: both;\n\twidth: 21.951%;\n\tpadding: 3px 0 0;\n\tmargin-left: -21.951%;\n}\n\n.menu-settings label {\n\tvertical-align: baseline;\n}\n\n.menu-edit .checkbox-input {\n\tmargin-top: 4px;\n}\n\n.theme-location-set {\n\tcolor: #999;\n\tfont-size: 11px;\n}\n\n/* Menu Container */\n#menu-management-liquid {\n\tfloat: left;\n\tmin-width: 100%;\n\tmargin-top: 3px;\n}\n\n#menu-management {\n\tposition: relative;\n\tmargin-right: 20px;\n\tmargin-top: -3px;\n\twidth: 100%;\n\tbackground: #f5f5f5;\n}\n\n#menu-management .menu-edit {\n\tmargin-bottom: 20px;\n}\n\n.nav-menus-php #post-body {\n\tpadding: 0 10px 10px;\n\tborder-top: 1px solid #fff;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground: #fff;\n}\n\n#nav-menu-header,\n#nav-menu-footer {\n\tpadding: 0 10px;\n}\n\n#nav-menu-header {\n\tborder-bottom: 1px solid #dfdfdf;\n\tmargin-bottom: 0;\n}\n\n#nav-menu-header .menu-name-label {\n\tmargin-top: 4px;\n}\n\n.nav-menus-php #post-body div.updated,\n.nav-menus-php #post-body div.error {\n\tmargin: 0;\n}\n\n.nav-menus-php #post-body-content {\n\tposition: relative;\n\tfloat: none;\n}\n\n#menu-management .menu-add-new abbr {\n\tfont-weight:600;\n}\n\n#select-nav-menu-container {\n\ttext-align: right;\n\tpadding: 0 10px 3px 10px;\n\tmargin-bottom: 5px;\n}\n\n#select-nav-menu {\n\twidth: 100px;\n\tdisplay: inline;\n}\n\n#menu-name-label {\n\tmargin-top: -2px;\n}\n\n.widefat .menu-locations tr + tr td {\n\tpadding-top: 0;\n}\n\n.widefat .menu-locations td {\n\tvertical-align: middle;\n}\n\n.menu-location-title label {\n\tfont-weight: bold;\n}\n\n.menu-location-menus select {\n\tfloat: left;\n}\n\n#locations-nav-menu-wrapper {\n\tpadding: 5px 0;\n}\n\n.locations-nav-menu-select select {\n\tfloat: left;\n\twidth: 160px;\n\tmargin-right: 5px;\n}\n\n.locations-row-links {\n\tfloat: left;\n\tmargin: 6px 0 0 6px;\n}\n\n.locations-edit-menu-link,\n.locations-add-menu-link {\n\tmargin: 0 3px;\n}\n\n.locations-edit-menu-link {\n\tpadding-right: 3px;\n\tborder-right: 1px solid #ccc;\n}\n\n#wpbody .open-label {\n\tdisplay: block;\n\tfloat:left;\n}\n\n#wpbody .open-label span {\n\tpadding-right: 10px;\n}\n\n.js .input-with-default-title {\n\tcolor: #a0a5aa;\n\tfont-style: italic;\n}\n\n#menu-management .inside {\n\tpadding: 0 10px;\n}\n\n/* Add Menu Item Boxes */\n.postbox .howto input,\n.accordion-container .howto input {\n\twidth: 180px;\n\tfloat: right;\n}\n\n.accordion-container .outer-border {\n\tmargin: 0;\n}\n\n.customlinkdiv .howto input {\n\twidth: 180px;\n}\n\n.customlinkdiv p {\n\tmargin-top: 0\n}\n\n#nav-menu-theme-locations .howto select {\n\twidth: 100%;\n}\n\n#nav-menu-theme-locations .button-controls {\n\ttext-align: right;\n}\n\n.add-menu-item-view-all {\n\theight: 400px;\n}\n\n/* Button Primary Actions */\n#menu-container .submit {\n\tmargin: 0 0 10px;\n\tpadding: 0;\n}\n\n.nav-menus-php .add-new-menu-action {\n\tfloat: left;\n\tmargin: 6px 0 0 6px;\n\tline-height: 15px;\n}\n\n.nav-menus-php .meta-sep,\n.nav-menus-php .submitdelete,\n.nav-menus-php .submitcancel {\n\tdisplay: block;\n\tfloat: left;\n\tmargin: 6px 0;\n\tline-height: 15px;\n}\n\n.meta-sep {\n\tpadding: 0 2px;\n}\n\n/* @todo: is this actually used? */\n#cancel-save {\n\ttext-decoration: underline;\n\tfont-size: 12px;\n\tmargin-left: 20px;\n\tmargin-top: 5px;\n}\n\n.button.right, .button-secondary.right, .button-primary.right {\n\tfloat: right;\n}\n\n/* Button Secondary Actions */\n.list-controls {\n\tfloat: left;\n\tmargin-top: 5px;\n}\n\n.add-to-menu {\n\tfloat: right;\n}\n\n.button-controls {\n\tclear:both;\n\tmargin: 10px 0;\n}\n\n.show-all,\n.hide-all {\n\tcursor: pointer;\n}\n\n.hide-all {\n\tdisplay: none;\n}\n\n/* Create Menu */\n#menu-name {\n\twidth: 270px;\n}\n\n#manage-menu .inside {\n\tpadding: 0px 0px;\n}\n\n/* Custom Links */\n#available-links dt {\n\tdisplay: block;\n}\n\n#add-custom-link .howto {\n\tfont-size: 12px;\n}\n\n#add-custom-link label span {\n\tdisplay: block;\n\tfloat: left;\n\tmargin-top: 5px;\n\tpadding-right: 5px;\n}\n\n.menu-item-textbox {\n\twidth: 180px;\n}\n\n.nav-menus-php .howto span {\n\tmargin-top: 6px;\n\tdisplay: block;\n\tfloat: left;\n}\n\n/* Menu item types */\n.quick-search {\n\twidth: 190px;\n}\n\n.quick-search-wrap .spinner {\n\tfloat: none;\n\tmargin: -3px -10px 0 0;\n}\n\n.nav-menus-php .list-wrap {\n\tdisplay: none;\n\tclear: both;\n\tmargin-bottom: 10px;\n}\n\n.nav-menus-php .postbox p.submit {\n\tmargin-bottom: 0;\n}\n\n/* Listings */\n.nav-menus-php .list li {\n\tdisplay: none;\n\tmargin: 0;\n\tmargin-bottom: 5px;\n}\n\n.nav-menus-php .list li .menu-item-title {\n\tcursor: pointer;\n\tdisplay: block;\n}\n\n.nav-menus-php .list li .menu-item-title input {\n\tmargin-right: 3px;\n\tmargin-top: -3px;\n}\n\n.menu-item-title input[type=checkbox] {\n\tdisplay: inline-block;\n\tmargin-top: -4px;\n}\n\n/* Nav Menu */\n#menu-container .inside {\n\tpadding-bottom: 10px;\n}\n\n.menu {\n\tpadding-top:1em;\n}\n\n#menu-to-edit {\n\tmargin: 0;\n\tpadding: 0.1em 0;\n}\n\n.menu ul {\n\twidth: 100%;\n}\n\n.menu li {\n\tmargin-bottom: 0;\n\tposition:relative;\n}\n\n.menu-item-bar {\n\tclear:both;\n\tline-height:1.5em;\n\tposition:relative;\n\tmargin: 9px 0 0;\n}\n\n.menu-item-bar .menu-item-handle {\n\tborder: 1px solid #dfdfdf;\n\tposition: relative;\n\tpadding: 10px 15px;\n\theight: auto;\n\tmin-height: 20px;\n\twidth: 382px;\n\tline-height: 30px;\n\toverflow: hidden;\n\tword-wrap: break-word;\n}\n\n.menu-item-bar .menu-item-handle:hover {\n\tborder-color: #999;\n}\n\n#menu-to-edit .menu-item-invalid .menu-item-handle {\n\tbackground: #f6c9cc;\n\tborder-color: #f1acb1;\n}\n\n.no-js .menu-item-edit-active .item-edit {\n\tdisplay: none;\n}\n\n.js .menu-item-handle {\n\tcursor: move;\n}\n\n.menu li.deleting .menu-item-handle {\n\tbackground-image: none;\n\tbackground-color: #f66;\n}\n\n.menu-item-handle .item-title {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tline-height: 20px;\n\tdisplay: block;\n\tmargin-right: 13em;\n}\n\n.menu-item-handle .menu-item-title.no-title {\n\tcolor: #999;\n}\n\n/* Sortables */\nli.menu-item.ui-sortable-helper .menu-item-bar {\n\tmargin-top: 0;\n}\n\nli.menu-item.ui-sortable-helper .menu-item-transport .menu-item-bar {\n\tmargin-top: 13px;\n}\n\n.menu .sortable-placeholder {\n\theight: 35px;\n\twidth: 410px;\n\tmargin-top: 13px;\n}\n\n/* Hide the transport list when it's empty */\n.menu-item .menu-item-transport:empty {\n\tdisplay: none;\n}\n\n/* WARNING: The factor of 30px is hardcoded into the nav-menus JavaScript. */\n.menu-item-depth-0 { margin-left: 0px; }\n.menu-item-depth-1 { margin-left: 30px; }\n.menu-item-depth-2 { margin-left: 60px; }\n.menu-item-depth-3 { margin-left: 90px; }\n.menu-item-depth-4 { margin-left: 120px; }\n.menu-item-depth-5 { margin-left: 150px; }\n.menu-item-depth-6 { margin-left: 180px; }\n.menu-item-depth-7 { margin-left: 210px; }\n.menu-item-depth-8 { margin-left: 240px; }\n.menu-item-depth-9 { margin-left: 270px; }\n.menu-item-depth-10 { margin-left: 300px; }\n.menu-item-depth-11 { margin-left: 330px; }\n\n.menu-item-depth-0 .menu-item-transport { margin-left: 0px; }\n.menu-item-depth-1 .menu-item-transport { margin-left: -30px; }\n.menu-item-depth-2 .menu-item-transport { margin-left: -60px; }\n.menu-item-depth-3 .menu-item-transport { margin-left: -90px; }\n.menu-item-depth-4 .menu-item-transport { margin-left: -120px; }\n.menu-item-depth-5 .menu-item-transport { margin-left: -150px; }\n.menu-item-depth-6 .menu-item-transport { margin-left: -180px; }\n.menu-item-depth-7 .menu-item-transport { margin-left: -210px; }\n.menu-item-depth-8 .menu-item-transport { margin-left: -240px; }\n.menu-item-depth-9 .menu-item-transport { margin-left: -270px; }\n.menu-item-depth-10 .menu-item-transport { margin-left: -300px; }\n.menu-item-depth-11 .menu-item-transport { margin-left: -330px; }\n\nbody.menu-max-depth-0 { min-width: 950px !important; }\nbody.menu-max-depth-1 { min-width: 980px !important; }\nbody.menu-max-depth-2 { min-width: 1010px !important; }\nbody.menu-max-depth-3 { min-width: 1040px !important; }\nbody.menu-max-depth-4 { min-width: 1070px !important; }\nbody.menu-max-depth-5 { min-width: 1100px !important; }\nbody.menu-max-depth-6 { min-width: 1130px !important; }\nbody.menu-max-depth-7 { min-width: 1160px !important; }\nbody.menu-max-depth-8 { min-width: 1190px !important; }\nbody.menu-max-depth-9 { min-width: 1220px !important; }\nbody.menu-max-depth-10 { min-width: 1250px !important; }\nbody.menu-max-depth-11 { min-width: 1280px !important; }\n\n/* Menu item controls */\n.item-type {\n\tdisplay: inline-block;\n\tpadding: 12px 16px;\n\tcolor: #666;\n\tfont-size: 12px;\n\tline-height: 18px;\n}\n\n.item-controls {\n\tfont-size: 12px;\n\tposition: absolute;\n\tright: 20px;\n\ttop: -1px;\n}\n\n.item-controls a {\n\ttext-decoration: none;\n}\n\n.item-controls a:hover {\n\tcursor: pointer;\n}\n\n.item-controls .item-order {\n\tpadding-right: 10px;\n}\n\n.nav-menus-php .item-edit {\n\tposition: absolute;\n\tright: -20px;\n\ttop: 0;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 40px;\n\tmargin-right: 0 !important;\n\ttext-indent: 100%;\n\toutline: none;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.nav-menus-php .item-edit:before {\n\tmargin-top: 10px;\n\tmargin-left: 4px;\n\twidth: 20px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\ttext-indent: -1px; /* account for the dashicon alignment */\n}\n\n.rtl .nav-menus-php .item-edit:before {\n\ttext-indent: 1px; /* account for the dashicon alignment */\n}\n\n.nav-menus-php .item-edit:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.nav-menus-php .item-edit:focus:before {\n\t-webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n/* Menu editing */\n.menu-instructions-inactive {\n\tdisplay: none;\n}\n\n.menu-item-settings {\n\tdisplay: block;\n\twidth: 402px;\n\tpadding: 10px 0 10px 10px;\n\tposition: relative;\n\tz-index: 10; /* Keep .item-title's shadow from appearing on top of .menu-item-settings */\n\tborder: 1px solid #e5e5e5;\n\tborder-top: none;\n\t-webkit-box-shadow: 0 1px 1px rgba(0,0,0,0.04);\n\tbox-shadow: 0 1px 1px rgba(0,0,0,0.04);\n}\n\n.menu-item-settings .field-move a {\n\tdisplay: none;\n\tmargin: 0 2px;\n}\n\n.menu-item-edit-active .menu-item-settings {\n\tdisplay: block;\n}\n\n.menu-item-edit-inactive .menu-item-settings {\n\tdisplay: none;\n}\n\n.add-menu-item-pagelinks {\n\tmargin: .5em auto;\n\ttext-align: center;\n}\n\n.link-to-original {\n\tdisplay: block;\n\tmargin: 0 0 10px;\n\tpadding: 3px 5px 5px;\n\tborder: 1px solid #dfdfdf;\n\tcolor: #777;\n\tfont-size: 12px;\n\tfont-style: italic;\n}\n\n.link-to-original a {\n\tpadding-left: 4px;\n\tfont-style: normal;\n}\n\n.hidden-field {\n\tdisplay: none;\n}\n\n.menu-item-settings .description-thin,\n.menu-item-settings .description-wide {\n\tmargin-right: 10px;\n\tfloat: left;\n}\n\n.description-thin {\n\twidth: 190px;\n}\n\n.description-wide {\n\twidth: 390px;\n}\n\n.menu-item-actions {\n\tpadding-top: 15px;\n}\n\n#cancel-save {\n\tcursor: pointer;\n}\n\n/* Major/minor publishing actions (classes) */\n.nav-menus-php .major-publishing-actions {\n\tclear: both;\n\tpadding: 3px 0 6px;\n}\n\n.nav-menus-php .major-publishing-actions .publishing-action {\n\ttext-align: right;\n\tfloat: right;\n\tline-height: 23px;\n\tmargin: 4px 0 1px;\n}\n\n.nav-menus-php .blank-slate .menu-settings {\n\tdisplay: none;\n}\n\n.nav-menus-php .delete-action {\n\tfloat: left;\n\tmargin-top: 2px;\n}\n\n.nav-menus-php .submitbox .submitcancel {\n\tborder-bottom: 1px solid #0073aa;\n\tpadding: 1px 2px;\n\tcolor: #0073aa;\n\ttext-decoration: none;\n}\n\n.nav-menus-php .submitbox .submitcancel:hover {\n\tbackground: #0073aa;\n\tcolor: #fff;\n}\n\n.nav-menus-php .major-publishing-actions .form-invalid {\n\tpadding-left: 4px;\n\tmargin-left: -4px;\n}\n\n/* Clearfix */\n#menu-item-name-wrap:after,\n#menu-item-url-wrap:after,\n#menu-name-label:after,\n#menu-settings-column .inside:after,\n#nav-menus-frame:after,\n.nav-menus-php #post-body-content:after,\n.nav-menus-php .button-controls:after,\n.nav-menus-php .major-publishing-actions:after,\n.nav-menus-php .menu-item-settings:after {\n\tclear: both;\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tvisibility: hidden;\n}\n\n#nav-menus-frame,\n.button-controls,\n#menu-item-url-wrap,\n#menu-item-name-wrap {\n\tdisplay: block;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n@media only screen and (min-width: 769px) and (max-width: 1000px){\n\tbody.menu-max-depth-0 {\n\t\tmin-width: 0 !important;\n\t}\n\n\t#menu-management-liquid{\n\t\twidth: 100%;\n\t}\n\n\t.nav-menus-php #post-body-content{\n\t\tmin-width: 0;\n\t}\n\n\t.menu-item-bar .menu-item-handle{\n\t\twidth: 90%;\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\tbody.nav-menus-php {\n\t\tmin-width: 0 !important;\n\t}\n\n\t#nav-menus-frame {\n\t\tmargin-left: 0;\n\t\tfloat: none;\n\t\twidth: 100%;\n\t}\n\n\t#wpbody-content #menu-settings-column {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\tfloat: none;\n\t\tmargin-left: 0;\n\t}\n\n\t#side-sortables .add-menu-item-tabs {\n\t\tmargin: 15px 0 14px;\n\t}\n\n\tul.add-menu-item-tabs li.tabs {\n\t\tpadding: 13px 15px 14px;\n\t}\n\n\t.nav-menus-php .item-controls .item-type {\n\t\tmargin-top: 2px;\n\t}\n\n\t.nav-menus-php .customlinkdiv .howto input {\n\t\twidth: 65%;\n\t}\n\n\t.nav-menus-php .quick-search {\n\t\twidth: 85%;\n\t}\n\n\t#menu-management-liquid {\n\t\tmargin-top: 25px;\n\t}\n\n\t.nav-menus-php .menu-name-label.howto span {\n\t\tmargin-top: 13px\n\t}\n\n\t.menu-name-label #menu-name {\n\t\tmargin-top: 4px;\n\t}\n\n\t.nav-menus-php .major-publishing-actions .publishing-action {\n\t\tmargin-top: 6px;\n\t}\n\n\t.nav-menus-php .delete-action {\n\t\tfont-size: 14px;\n\t\tline-height: 50px;\n\t\tmargin-top: 12px;\n\t}\n\n\t.menu-item-bar .menu-item-handle,\n\t.menu-item-settings,\n\t.description-wide {\n\t\twidth: auto;\n\t}\n\n\t.menu-item-settings {\n\t\tpadding: 10px;\n\t}\n\n\t.menu-item-settings .description-thin,\n\t.menu-item-settings .description-wide {\n\t\twidth: 100%;\n\t}\n\n\t.menu-item-settings input {\n\t\twidth: 100%;\n\t}\n\n\t.menu-item-settings input[type=\"checkbox\"],\n\t.menu-item-settings input[type=\"radio\"] {\n\t\twidth: 25px;\n\t}\n\n\t.menu-settings dl {\n\t\tpadding-left: 0;\n\t}\n\n\t.menu-settings dd {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin-bottom: 15px;\n\t}\n\n\t.menu-settings dt {\n\t\tfloat: none;\n\t\twidth: auto;\n\t\tmargin-left: 0;\n\t\tmargin-bottom: 15px;\n\t}\n}\n\n@media only screen and (max-width: 768px) {\n\t/* menu locations */\n\t#menu-locations-wrap .widefat {\n\t\twidth: 100%;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/press-this-editor-rtl.css",
    "content": "/*\nPress This TinyMCE editor styles :)\n*/\n\n\n/**\n* Links\n*/\na {\n\tcolor: #0073aa;\n}\n\na:visited {\n\tcolor: #0073aa;\n}\n\na:hover,\na:focus,\na:active {\n\tcolor: #00a0d2;\n}\n\n\n/**\n* Lists\n*/\nul,\nol {\n\tmargin: 0 3em 1.5em 0;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin-bottom: 0;\n\tmargin-right: 1.5em;\n}\n\ndt {\n\tfont-weight: 700;\n}\n\ndd {\n\tmargin: 0 1.5em 1.5em;\n}\n\n\n/**\n* Media\n*\n* Basic image and object styles\n*/\nimg {\n\tmax-width: 100%;\n\theight: auto;\n}\n\n/* Makes sure embeds and iframes fit inside their containers */\nembed,\niframe,\nobject {\n\tmax-width: 100%;\n}\n\n\n/**\n* TinyMCE styles\n*\n* Pretty dang good.\n*/\nbody {\n\tcolor: #404040;\n\tfont-family: \"Open Sans\", Helvetica, Arial, sans-serif;\n\tfont-size: 20px;\n\tfont-weight: 400;\n\tline-height: 1.6;\n}\n@media (max-width: 900px) {\n\tbody#tinymce {\n\t\tpadding-top: 30px !important;\n\t}\n}\n@media (max-width: 640px) {\n\tbody {\n\t\tfont-size: 16px;\n\t}\n}\n@media (max-width: 320px) {\n\tbody {\n\t\tmargin: 0 15px;\n\t}\n}\n\n#tinymce b,\n#tinymce strong {\n\t/* overrides TinyMCE's !important. Woohoo. */\n\tfont-weight: 700 !important;\n}\n\nblockquote {\n\tmargin: 1em 1.5em;\n\tcolor: #9ea7af;\n\tfont-size: em(25px);\n\tfont-style: italic;\n}\n@media (max-width: 900px) {\n\tblockquote {\n\t\tmargin: 1.5em 1em;\n\t}\n}\n\nul,\nol {\n\tmargin: 0 .75em 1.5em 0;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/press-this-editor.css",
    "content": "/*\nPress This TinyMCE editor styles :)\n*/\n\n\n/**\n* Links\n*/\na {\n\tcolor: #0073aa;\n}\n\na:visited {\n\tcolor: #0073aa;\n}\n\na:hover,\na:focus,\na:active {\n\tcolor: #00a0d2;\n}\n\n\n/**\n* Lists\n*/\nul,\nol {\n\tmargin: 0 0 1.5em 3em;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin-bottom: 0;\n\tmargin-left: 1.5em;\n}\n\ndt {\n\tfont-weight: 700;\n}\n\ndd {\n\tmargin: 0 1.5em 1.5em;\n}\n\n\n/**\n* Media\n*\n* Basic image and object styles\n*/\nimg {\n\tmax-width: 100%;\n\theight: auto;\n}\n\n/* Makes sure embeds and iframes fit inside their containers */\nembed,\niframe,\nobject {\n\tmax-width: 100%;\n}\n\n\n/**\n* TinyMCE styles\n*\n* Pretty dang good.\n*/\nbody {\n\tcolor: #404040;\n\tfont-family: \"Open Sans\", Helvetica, Arial, sans-serif;\n\tfont-size: 20px;\n\tfont-weight: 400;\n\tline-height: 1.6;\n}\n@media (max-width: 900px) {\n\tbody#tinymce {\n\t\tpadding-top: 30px !important;\n\t}\n}\n@media (max-width: 640px) {\n\tbody {\n\t\tfont-size: 16px;\n\t}\n}\n@media (max-width: 320px) {\n\tbody {\n\t\tmargin: 0 15px;\n\t}\n}\n\n#tinymce b,\n#tinymce strong {\n\t/* overrides TinyMCE's !important. Woohoo. */\n\tfont-weight: 700 !important;\n}\n\nblockquote {\n\tmargin: 1em 1.5em;\n\tcolor: #9ea7af;\n\tfont-size: em(25px);\n\tfont-style: italic;\n}\n@media (max-width: 900px) {\n\tblockquote {\n\t\tmargin: 1.5em 1em;\n\t}\n}\n\nul,\nol {\n\tmargin: 0 0 1.5em .75em;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/press-this-rtl.css",
    "content": "/*\nPress This styles :)\n*/\n\n\n/**\n* Normalize\n*\n* normalize.css v3.0.0 | MIT License | git.io/normalize\n*/\nhtml {\n\tfont-family: sans-serif;\n\t-ms-text-size-adjust: 100%;\n\t-webkit-text-size-adjust: 100%;\n}\n\nbody {\n\tmargin: 0;\n}\n\n*,\n*:before,\n*:after {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi) {\n\t*,\n\t*:before,\n\t*:after {\n\t\t-webkit-font-smoothing: antialiased;\n\t}\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n\tdisplay: block;\n}\n\naudio,\ncanvas,\nprogress,\nvideo {\n\tdisplay: inline-block;\n\tvertical-align: baseline;\n}\n\naudio:not([controls]) {\n\tdisplay: none;\n\theight: 0;\n}\n\n[hidden],\ntemplate {\n\tdisplay: none;\n}\n\na {\n\tbackground: transparent;\n}\n\na:active,\na:hover {\n\toutline: 0;\n}\n\nabbr[title] {\n\tborder-bottom: 1px dotted;\n}\n\nb,\nstrong {\n\tfont-weight: bold;\n}\n\ndfn {\n\tfont-style: italic;\n}\n\nh1 {\n\tfont-size: 2em;\n\tmargin: 0.67em 0;\n}\n\nmark {\n\tbackground: #ff0;\n\tcolor: #000;\n}\n\nsmall {\n\tfont-size: 80%;\n}\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nimg {\n\tborder: 0;\n}\n\nsvg:not(:root) {\n\toverflow: hidden;\n}\n\nfigure {\n\tmargin: 1em 40px;\n}\n\nhr {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\theight: 0;\n}\n\npre {\n\toverflow: auto;\n}\n\ncode,\nkbd,\npre,\nsamp {\n\tfont-family: monospace, monospace;\n\tfont-size: 1em;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tcolor: inherit;\n\tfont: inherit;\n\tmargin: 0;\n}\n\nbutton {\n\toverflow: visible;\n}\n\nbutton,\nselect {\n\ttext-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n\t-webkit-appearance: button;\n\tcursor: pointer;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n\tcursor: default;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\ninput {\n\tline-height: normal;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tpadding: 0;\n}\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n\theight: auto;\n}\n\ninput[type=\"search\"] {\n\t-webkit-appearance: textfield;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\nfieldset {\n\tborder: 0;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nlegend {\n\tborder: 0;\n\tpadding: 0;\n}\n\ntextarea {\n\toverflow: auto;\n}\n\noptgroup {\n\tfont-weight: bold;\n}\n\ntable {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntd,\nth {\n\tpadding: 0;\n}\n\n.clearfix:before,\n.clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.clearfix:after {\n\tclear: both;\n}\n\n.hide-if-js {\n\tdisplay: none;\n}\n\n.screen-reader-text {\n\tposition: absolute;\n\tmargin: -1px;\n\tpadding: 0;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(0 0 0 0);\n\tborder: 0;\n}\n\n\n/**\n* Typography\n*\n* Base element typographic styles.\n*/\nbody,\nbutton,\ninput,\nselect,\ntextarea {\n\tcolor: #404040;\n\tfont-family: \"Open Sans\", Helvetica, Arial, sans-serif;\n\tfont-size: 20px;\n\tfont-weight: 400;\n\tline-height: 1.6;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tclear: both;\n}\n\np {\n\tmargin-bottom: 1.5em;\n}\n\nb,\nstrong {\n\tfont-weight: 700;\n}\n\n\n/**\n* Buttons\n*\n* Pushing buttons is what I do.\n*/\n\n.scan-submit {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tpadding: 0 10px 1px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\tfont-size: 13px;\n\tline-height: 2;\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n}\n\n.split-button {\n\tposition: relative;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.split-button-body {\n\tdisplay: none;\n\tposition: absolute;\n\tbottom: 39px;\n\tleft: 0;\n\tborder: 1px solid #ddd;\n\tbackground-color: #fff;\n\tmin-width: 180px;\n\tmax-width: 100%;\n\tmargin: 0;\n\tpadding: 8px;\n\tlist-style: none;\n\t-webkit-box-shadow: -1px 0 4px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: -1px 0 4px rgba( 0, 0, 0, 0.15 );\n}\n\n.split-button-body:before,\n.split-button-body:after {\n\tposition: absolute;\n\tleft: 12px;\n\tdisplay: block;\n\twidth: 0;\n\theight: 0;\n\tborder-style: solid;\n\tborder-color: transparent;\n\tcontent: \"\";\n}\n\n.split-button-body:before {\n\tbottom: -18px;\n\tborder-top-color: #ccc;\n\tborder-width: 9px;\n\tleft: 11px;\n}\n\n.split-button-body:after {\n\tbottom: -16px;\n\tborder-top-color: #fff;\n\tborder-width: 8px;\n}\n\n.split-button-body .split-button-option {\n\tdisplay: block;\n\tpadding: 5px 15px;\n\tmargin: 0;\n\twidth: 100%;\n\ttext-align: right;\n\tline-height: 2;\n}\n\n.is-open .split-button-body {\n\tdisplay: block;\n}\n\n.split-button-primary,\n.split-button-toggle {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tdisplay: block;\n\tmargin: 0;\n\tfont-size: 13px;\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n\tline-height: 2;\n\tpadding: 0 10px 1px;\n\tbackground: #0085ba;\n\tborder-color: #0073aa #006799 #006799;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-box-shadow: 0 1px 0 #006799;\n \tbox-shadow: 0 1px 0 #006799;\n\tcolor: #fff;\n\ttext-shadow: 0 -1px 1px #006799,\n\t\t-1px 0 1px #006799,\n\t\t0 1px 1px #006799,\n\t\t1px 0 1px #006799;\n}\n\n.split-button-primary {\n\t-webkit-border-top-right-radius: 3px;\n\tborder-top-right-radius: 3px;\n\t-webkit-border-bottom-right-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n\tborder-left: 0 none;\n\tfloat: right;\n}\n\n.split-button-toggle {\n\tpadding: 0;\n\t-webkit-border-top-left-radius: 3px;\n\tborder-top-left-radius: 3px;\n\t-webkit-border-bottom-left-radius: 3px;\n\tborder-bottom-left-radius: 3px;\n\tborder-right: 1px solid #006799;\n\tfloat: left;\n}\n\n.split-button-toggle i {\n\tmargin: 4px 0 3px 20px;\n\tpadding: 0 10px;\n}\n\n.split-button-primary:hover,\n.split-button-toggle:hover {\n\toutline: none;\n\tbackground: #008ec2;\n\tborder-color: #006799;\n}\n\n.split-button-primary:focus,\n.split-button-toggle:focus {\n\toutline: none;\n\t-webkit-box-shadow: 0 1px 0 #0073aa,\n\t\t0 0 2px 1px #33b3db;\n\tbox-shadow: 0 1px 0 #0073aa,\n\t\t0 0 2px 1px #33b3db;\n}\n\n.split-button-primary:active,\n.split-button-toggle:active {\n\tbackground: #0073aa;\n\tborder-color: #006799;\n\t-webkit-box-shadow: inset 0 2px 10px #006799, 0 1px 0 #0073aa;\n \tbox-shadow: inset 0 2px 10px #006799, 0 1px 0 #0073aa;\n}\n\n/**\n* Forms\n*\n* So many input types.\n*/\nbutton,\ninput,\nselect,\ntextarea {\n\tfont-size: 100%;\n\tmargin: 0;\n\tvertical-align: baseline;\n\t*vertical-align: middle;\n}\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n\tpadding: 0;\n}\n\n[type=\"search\"] {\n\t-webkit-appearance: textfield;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\n[type=\"text\"],\n[type=\"email\"],\n[type=\"url\"],\n[type=\"password\"],\n[type=\"search\"],\ntextarea {\n\tpadding: 0.4em 0.75em;\n\tcolor: #32373c;\n\tborder: 1px solid #ccc;\n}\n\n[type=\"text\"]:focus,\n[type=\"email\"]:focus,\n[type=\"url\"]:focus,\n[type=\"password\"]:focus,\n[type=\"search\"]:focus,\ntextarea:focus {\n\tcolor: #32373c;\n\toutline: 0;\n}\n\ntextarea {\n\toverflow: auto;\n\tpadding-right: 3px;\n\tvertical-align: top;\n}\n\n\n/**\n* Links\n*/\na {\n\tcolor: #0073aa;\n}\n\na:visited {\n\tcolor: #0073aa;\n}\n\na:hover,\na:focus,\na:active {\n\tcolor: #00a0d2;\n}\n\n\n/**\n* Lists\n*/\nul,\nol {\n\tmargin: 0 3em 1.5em 0;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin-bottom: 0;\n\tmargin-right: 1.5em;\n}\n\ndt {\n\tfont-weight: 700;\n}\n\ndd {\n\tmargin: 0 1.5em 1.5em;\n}\n\n\n/**\n* Post formats\n*\n* Complete styles for post formats UI\n*/\n/* TODO if we remove the <br> during merge, this can go. */\n#post-formats-select br {\n\tdisplay: none;\n}\n\n.post-format {\n\twidth: 1px;\n\theight: 1px;\n\tposition: absolute;\n\ttop: -9999px;\n}\n\n.lt-ie9 .post-format {\n\tmargin: 17px 13px 0 12px;\n\twidth: auto;\n\theight: auto;\n\tposition: static;\n\ttop: auto;\n\tfloat: right;\n\twidth: 16px;\n\theight: 16px;\n}\n\n.post-format-icon {\n\tposition: relative;\n\tdisplay: block;\n\tpadding: 13px 13px 14px 2px;\n\tcursor: pointer;\n}\n\n.post-format-icon:before,\n.post-format-icon:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\twidth: 20px;\n\theight: 20px;\n\tmargin-left: 10px;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tcolor: #9ea7af;\n\tfont-weight: 400;\n\tfont-style: normal;\n\tvertical-align: top;\n\ttext-align: center;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.post-format-icon:before {\n\tcontent: \"\\f109\";\n}\n\n.post-format-icon:after {\n\tdisplay: none;\n\tcontent: \"\\f147\";\n\tfloat: left;\n}\n\n.post-format:checked + .post-format-icon {\n\t-webkit-box-shadow: inset -6px 0 0 #00a0d2;\n\tbox-shadow: inset -6px 0 0 #00a0d2;\n\tbackground: rgba(46, 162, 204, 0.1);\n}\n\n.post-format:checked + .post-format-icon:before,\n.post-format:checked + .post-format-icon:after {\n\tcolor: #32373c;\n}\n\n.post-format:focus + .post-format-icon {\n\tbackground: #00a0d2;\n\tcolor: #fff;\n}\n\n.post-format:focus + .post-format-icon:before,\n.post-format:focus + .post-format-icon:after {\n\tcolor: #fff;\n}\n\n.post-format:checked + .post-format-icon:after {\n\tdisplay: block;\n}\n\n.lt-ie9 .post-format-icon {\n\tmargin-right: 16px;\n}\n\n.post-format-aside:before {\n\tcontent: \"\\f123\";\n}\n\n.post-format-image:before {\n\tcontent: \"\\f128\";\n}\n\n.post-format-video:before {\n\tcontent: \"\\f126\";\n}\n\n.post-format-audio:before {\n\tcontent: \"\\f127\";\n}\n\n.post-format-quote:before {\n\tcontent: \"\\f122\";\n}\n\n.post-format-link:before {\n\tcontent: \"\\f103\";\n}\n\n.post-format-gallery:before {\n\tcontent: \"\\f161\";\n}\n\n\n/**\n* Tags\n*\n* Complete styles for tags UI\n*/\n.tagsdiv p {\n\tmargin: 0;\n}\n\n.tagsdiv .ajaxtag {\n\tposition: relative;\n}\n\n.tagsdiv .newtag {\n\tdisplay: block;\n\tposition: relative;\n\tpadding: 11px 16px 11px 58px;\n\twidth: 100%;\n\tborder: 0;\n\tborder-bottom: 1px solid #e5e5e5;\n\tfont-size: 16px;\n}\n\n.tagsdiv .tagadd {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 1px;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tmargin: 0;\n\tpadding: 0 16px;\n\tbackground: #f7f7f7;\n\tborder-right: 1px solid #f1f1f1;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.tagsdiv .tagadd:hover,\n.tagsdiv .tagadd:active,\n.tagsdiv .tagadd:focus {\n\toutline: 0;\n\tbackground: #2991b7;\n\tborder-color: #20708e;\n\tcolor: #fff;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.tagsdiv .howto {\n\tcolor: #727272;\n\tfont-style: italic;\n\tmargin: 10px 16px 6px 0;\n}\n\n\n/* Tag hint TODO needed? */\n/* Tag suggestions */\n.ac_results {\n\tpadding: 0;\n\tmargin: -1px -1px 0 0;\n\tlist-style: none;\n\tposition: absolute;\n\tz-index: 10000;\n\tdisplay: none;\n\tborder: 1px solid #d8d8d8;\n\tbackground-color: #fff;\n\tfont-size: 14px;\n}\n\n.ac_results li {\n\tpadding: 6px 16px;\n\twhite-space: nowrap;\n\tcolor: #101010;\n\ttext-align: right;\n}\n\n.ac_results .ac_over {\n\tbackground-color: #e5e5e5;\n\tbackground-color: #00a0d2;\n\tcolor: #fff;\n\tcursor: pointer;\n}\n\n.ac_match {\n\ttext-decoration: underline;\n}\n\n/* Tags */\n.tagchecklist {\n\tpadding: 16px 28px 5px;\n}\n\n.tagchecklist:before,\n.tagchecklist:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.tagchecklist:after {\n\tclear: both;\n}\n\n.tagchecklist span {\n\tdisplay: block;\n\tmargin-left: 25px;\n\tfloat: right;\n\tfont-size: 13px;\n\tline-height: 1.8;\n\twhite-space: nowrap;\n\tcursor: default;\n}\n\n@media (max-width: 600px) {\n\t.tagchecklist span {\n\t\tmargin-bottom: 15px;\n\t\tfont-size: 16px;\n\t\tline-height: 1.3;\n\t}\n}\n\n.tagchecklist .ntdelbutton {\n\tmargin: 1px -17px 0 0;\n\tcursor: pointer;\n\twidth: 20px;\n\theight: 20px;\n\tdisplay: block;\n\tfloat: right;\n\ttext-indent: 0;\n\toverflow: hidden;\n\tposition: absolute;\n\toutline: 0;\n}\n\n.tagchecklist .ntdelbutton:before {\n\tcontent: \"\\f153\";\n\tdisplay: block;\n\tmargin: 2px 0;\n\theight: 20px;\n\twidth: 20px;\n\tbackground: 100% 0;\n\tcolor: #9ea7af;\n\tfont: 400 16px/1 dashicons;\n\ttext-align: center;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.tagchecklist .ntdelbutton:focus:before {\n\tcolor: #00a0d2;\n}\n\n\n/* THE TAG CLOUD. */\n.tagsdiv + p {\n\tmargin: 0;\n}\n\n.press-this .tagcloud-link {\n\tdisplay: block;\n\tmargin: 0 16px 5px;\n\tpadding: 0;\n\ttext-decoration: none;\n\toutline: 0;\n}\n\n.tagcloud-link:focus {\n\ttext-decoration: underline;\n}\n\n.popular-tags {\n\tborder: none;\n\tline-height: 2em;\n\tpadding: 8px 12px 12px;\n\ttext-align: justify;\n}\n\n.popular-tags a {\n\tpadding: 0 3px;\n}\n\n.the-tagcloud {\n\tmargin: 0;\n\tpadding: 16px;\n}\n\n.the-tagcloud a {\n\ttext-decoration: none;\n\toutline: 0;\n}\n\n.the-tagcloud a:focus {\n\ttext-decoration: underline;\n}\n\n.tagcloud h3 {\n\tmargin: 2px 0 12px;\n}\n\n\n/**\n* Categories\n*\n* Complete styles for post categories UI\n*/\ninput[type=\"search\"].categories-search,\n.add-category-name {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 0.85714em 1.07143em;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tborder-bottom: 1px solid #e5e5e5;\n\tfont-size: 14px;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tappearance: none;\n}\n\n@media (max-width: 600px) {\n\tinput[type=\"search\"].categories-search,\n\t.add-category-name {\n\t\t/* Needs to be 16px to prevent zooming on iOS. Guh. */\n\t\tfont-size: 16px;\n\t}\n}\n\n.press-this .add-cat-toggle {\n\tfloat: left;\n\tmargin-top: -45px;\n\tline-height: 20px;\n\tpadding: 12px 10px 8px;\n\tcolor: #0073aa;\n}\n\n.press-this .add-cat-toggle:focus {\n\ttext-decoration: none;\n\tcolor: #00a0d2;\n}\n\n.press-this .add-cat-toggle.is-toggled {\n\tpadding: 10px;\n}\n\n.press-this .add-cat-toggle.is-toggled .dashicons:before {\n\tcontent: \"\\f179\";\n}\n\n.add-category {\n\tposition: relative;\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n.add-category.is-hidden {\n\tdisplay: none;\n}\n\n.add-category .add-cat-submit {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tpadding: 12px 16px;\n\tbackground: #f7f7f7;\n\tborder-right: 1px solid #f1f1f1;\n}\n\n.add-category .add-cat-submit:hover,\n.add-category .add-cat-submit:active,\n.add-category .add-cat-submit:focus {\n\toutline: 0;\n\tbackground: #2991b7;\n\tborder-color: #20708e;\n\tcolor: #fff;\n}\n\n/* Parent category select */\n.postform-wrapper {\n\tpadding: 12px;\n}\n\n.postform {\n\tdisplay: block;\n\tmargin: 0;\n\twidth: 100%;\n\theight: 34px;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tborder: 1px solid #e5e5e5;\n\tbackground: #fff;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\toverflow: hidden;\n\tline-height: 21px;\n\ttext-overflow: ellipsis;\n\ttext-decoration: none;\n\tvertical-align: top;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\toutline: 0;\n}\n\n.postform:focus {\n\tborder-color: #0073aa;\n\t-webkit-box-shadow: 0 0 0 3px #00a0d2;\n\tbox-shadow: 0 0 0 3px #00a0d2;\n\toutline: 0;\n\t-moz-outline: none;\n\t-moz-user-focus: ignore;\n}\n\n.postform::-ms-expand {\n\tdisplay: none;\n}\n\n.postform::-ms-value {\n\tbackground: none;\n\tcolor: #727272;\n}\n\n.postform:-moz-focusring {\n\tcolor: transparent;\n\ttext-shadow: 0 0 0 #727272;\n}\n\n/* Category list */\n.categories-select {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.categories-select ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.category {\n\tposition: relative;\n\tdisplay: block;\n\tpadding: 13px 16px 14px 16px;\n\tcursor: pointer;\n\tbackground: #fff;\n}\n\n.category:focus,\n.category.selected:focus {\n\toutline: 0;\n\tbackground: #00a0d2;\n\tcolor: #fff;\n}\n\n.category.selected {\n\t-webkit-box-shadow: inset -6px 0 0 #00a0d2;\n\tbox-shadow: inset -6px 0 0 #00a0d2;\n\tbackground: #E9F5F9;\n}\n\n.category.selected:after {\n\tdisplay: inline-block;\n\tcontent: \"\\f147\";\n\tposition: absolute;\n\ttop: 13px;\n\tleft: 0;\n\twidth: 20px;\n\theight: 20px;\n\tmargin-left: 10px;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tcolor: #23282d;\n\tfont-weight: 400;\n\tfont-style: normal;\n\tvertical-align: top;\n\ttext-align: center;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.category.selected:focus:after {\n\tcolor: #fff;\n}\n\n.categories-select ul .category {\n\tpadding-right: 24px;\n}\n\n.categories-select ul ul .category {\n\tpadding-right: 32px;\n}\n\n.categories-select ul ul ul .category {\n\tpadding-right: 40px;\n}\n\n.categories-select ul ul ul ul .category {\n\tpadding-right: 48px;\n}\n\n.categories-select ul ul ul ul ul .category {\n\tpadding-right: 56px;\n}\n\n.categories-select ul ul ul ul ul ul .category {\n\tpadding-right: 64px;\n}\n\n.categories-select .is-hidden {\n\tdisplay: none;\n}\n\n.categories-select .is-hidden.searched-parent {\n\tdisplay: block;\n}\n\n/* Category search */\n.categories-search-wrapper {\n\tposition: relative;\n}\n\n.categories-search-wrapper.is-hidden {\n\tdisplay: none;\n}\n\n.categories-search-wrapper label {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 10px;\n\tmargin-top: -10px;\n\tcolor: #9ea7af;\n}\n\n\n/**\n* Main\n*/\nhtml {\n\toverflow: auto;\n}\n\nbody {\n\toverflow-x: hidden;\n\theight: 100%;\n}\n\nhtml {\n\tbackground: #fff;\n\t-webkit-box-shadow: 10px 0 0 rgba(0, 0, 0, 0.3);\n\tbox-shadow: 10px 0 0 rgba(0, 0, 0, 0.3);\n}\n\n@media (max-width: 900px) {\n\tbody {\n\t\tfont-size: 16px;\n\t}\n}\n\n@media (max-width: 320px) {\n\tbody {\n\t\tfont-size: 14px;\n\t}\n}\n\n.lt-ie9 {\n\toverflow: visible;\n}\n\n.adminbar {\n\tposition: relative;\n\twidth: 100%;\n\tpadding: 0 0.8em;\n\tmin-height: 3.2em;\n\tbackground: #23282d;\n\tcolor: #fff;\n\tz-index: 9999;\n}\n\n.adminbar:before,\n.adminbar:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.adminbar:after {\n\tclear: both;\n}\n\n.adminbar .dashicons {\n\tcolor: #999;\n}\n\n.press-this .adminbar button {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 6px;\n\tmargin-top: -13px;\n\tpadding: 0 10px 1px;\n\tfont-size: 13px;\n}\n\n@media (max-width: 320px) {\n\t.adminbar {\n\t\tmin-height: 45px;\n\t}\n}\n\n.current-site {\n\tmargin-top: 0.5625em;\n\tfont-size: 16px;\n\tline-height: 44px;\n\tfont-weight: 400;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n}\n\n@media (max-width: 600px) {\n\t.current-site {\n\t\tmargin: 3px 0 0;\n\t}\n}\n\n@media (max-width: 320px) {\n\t.current-site {\n\t\tmargin: 0;\n\t\tfont-size: 14px;\n\t}\n}\n\n.current-site-link {\n\ttext-decoration: none;\n}\n\n.current-site-link:focus {\n\toutline: 0;\n}\n\n.current-site-link:focus .current-site-name{\n\ttext-decoration: underline;\n}\n\n.current-site-name {\n\tcolor: #ededed;\n}\n\n@media (max-width: 320px) {\n\t.current-site-name {\n\t\tfont-weight: 600;\n\t}\n}\n\n.current-site .dashicons-wordpress {\n\tposition: relative;\n\ttop: -1px;\n\tmargin-left: 10px;\n\tvertical-align: middle;\n}\n\n.options,\n.options.open .on-closed,\n.options.closed .on-open {\n\tdisplay: none;\n}\n\n@media (max-width: 900px) {\n\t.options {\n\t\tdisplay: block;\n\t}\n}\n\n.options-panel-back.is-hidden {\n\tdisplay: none;\n}\n\n.options:focus .dashicons {\n\tcolor: #fff;\n\ttext-decoration: none;\n}\n\n.options .dashicons {\n\tmargin-top: 3px;\n}\n\n.options {\n\tcolor: #00a0d2;\n}\n\n.alert {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 16px 50px;\n\tborder-bottom: 1px solid #e5e5e5;\n\tfont-size: 14px;\n}\n\n.alert:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 50%;\n\tright: 30px;\n\twidth: 8px;\n\theight: 8px;\n\tmargin-top: -4px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tbackground: #00a0d2;\n}\n\n@media (max-width: 600px) {\n\t.alert {\n\t\tpadding: 16px 35px;\n\t}\n\t.alert:before {\n\t\tright: 15px;\n\t}\n}\n\n.alert.is-error:before {\n\tbackground: red;\n}\n\n.scan {\n\tposition: relative;\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n@media (max-width: 900px) {\n\t.scan form {\n\t\t-webkit-transition: opacity .3s ease-in-out;\n\t\ttransition: opacity .3s ease-in-out;\n\t}\n\t.scan.is-hidden form {\n\t\topacity: .2;\n\t\tpointer-events: none;\n\t}\n}\n\n.scan-url {\n\tdisplay: block;\n\tborder: 0;\n\tpadding: 0.85714em 1.07143em;\n\tfont-size: 14px;\n\twidth: 100%;\n}\n\n@media (max-width: 600px) {\n\t.scan-url {\n\t\tfont-size: 16px;\n\t}\n}\n\n.scan-submit {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tpadding: 0 1.07143em;\n\tbackground: #f7f7f7;\n\tborder-color: #dedede;\n\tborder: 0;\n\tborder-right: 1px solid #f1f1f1;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tcolor: #555;\n\tfont-size: 14px;\n\tline-height: 1.6;\n}\n\n.scan-submit:hover,\n.scan-submit:focus {\n\tbackground: #008ec2;\n\tborder-color: #006799;\n\tcolor: #fff;\n\toutline: 0;\n}\n\n.scan-submit:active {\n\tbackground: #0073aa;\n\tborder-color: #006799;\n\tcolor: #fff;\n}\n\n.scan-submit:visited {\n\tcolor: #555;\n}\n\n.wrapper {\n\tposition: relative;\n\tmargin-bottom: 60px;\n\tmargin-left: 320px;\n}\n\n.wrapper:before,\n.wrapper:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.wrapper:after {\n\tclear: both;\n}\n\n@media (max-width: 900px) {\n\t.wrapper {\n\t\tmargin: 0;\n\t\twidth: 100%;\n\t}\n}\n\n.editor-wrapper {\n\toverflow: auto;\n\tfloat: right;\n\twidth: 100%;\n}\n\n.editor-wrapper:before,\n.editor-wrapper:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.editor-wrapper:after {\n\tclear: both;\n}\n\n.editor {\n\tpadding: 0 1.5em 4.75em;\n\tmax-width: 700px;\n\tmargin: 0 auto;\n}\n\n.spinner {\n\theight: 20px;\n\twidth: 20px;\n\tdisplay: inline-block;\n\tvisibility: hidden;\n\tbackground: url(../images/spinner.gif) no-repeat center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tline-height: 1;\n\tvertical-align: middle;\n}\n\n@media print,\n\t(-webkit-min-device-pixel-ratio: 1.25),\n\t(min-resolution: 120dpi) {\n\n\t.spinner {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n.spinner.is-active {\n\tvisibility: visible;\n}\n\n/* Make the text inside the editor textarea white. Prevents a \"flash\" on loading the page */\n#pressthis {\n\tcolor: #fff;\n}\n\n@media (min-width: 901px) {\n\t.editor {\n\t\tmax-width: 760px;\n\t}\n}\n\n@media (max-width: 320px) {\n\t.editor {\n\t\tpadding: 0;\n\t}\n}\n\n.post-title,\n.post-title-placeholder {\n\tmargin: 0;\n\tpadding: .83em 0;\n\twidth: 100%;\n\tborder-bottom: 1px solid #e5e5e5;\n\tfont-size: 32px;\n\tline-height: 1.4;\n\tfont-weight: 700;\n}\n\n.post-title:active,\n.post-title:focus,\n.post-title-placeholder:active,\n.post-title-placeholder:focus {\n\toutline: 0;\n\t-webkit-box-shadow: inset 0px -3px 0 #00a0d2;\n\tbox-shadow: inset 0px -3px 0 #00a0d2;\n\tborder-color: #00a0d2;\n}\n\n@media (max-width: 900px) {\n\t.post-title,\n\t.post-title-placeholder {\n\t\tfont-size: 24px;\n\t}\n}\n\n@media (max-height: 400px) {\n\t.post-title,\n\t.post-title-placeholder {\n\t\tpadding: 15px 0;\n\t\tfont-size: 16px;\n\t}\n}\n\n@media (max-width: 320px) {\n\t.post-title,\n\t.post-title-placeholder {\n\t\tfont-size: 16px;\n\t\tfont-weight: 600;\n\t\tpadding: 1.14286em 1.42857em;\n\t}\n}\n\n.post-title {\n\t/* IE8 fallback */\n\tbackground: url(data:image/gif;base64,R0lGODlhAQABAJEAAAAAAP///////wAAACH5BAEHAAIALAAAAAABAAEAAAICVAEAOw==);\n\tbackground: none, none;\n}\n\n.post-title:before {\n\t/* Keeps empty container from collapsing */\n\tcontent: \"\\a0\";\n\tdisplay: inline-block;\n\twidth: 0;\n\tspeak: none;\n}\n\n.post-title-placeholder {\n\tposition: absolute;\n\tborder: 0;\n\tcolor: #9ea7af;\n\tz-index: -1;\n}\n\n.post-title-placeholder.is-hidden {\n\tdisplay: none;\n}\n\n/* Suggested images */\n.media-list-container {\n\tposition: relative;\n\tpadding: 2px 0;\n\tborder-bottom: 1px solid #e5e5e5;\n\tdisplay: none;\n}\n\n.media-list-inner-container {\n\toverflow: auto;\n\tmax-height: 150px;\n\tmax-height: 40vw;\n}\n\n.media-list-container.has-media {\n\tdisplay: block;\n}\n\n.media-list-inner-container:before,\n.media-list-inner-container:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.media-list-inner-container:after {\n\tclear: both;\n}\n\n.media-list {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n@media (min-width: 321px) {\n\t.media-list-inner-container {\n\t\tmax-height: 250px;\n\t\tmax-height: 40vw;\n\t}\n}\n\n@media (min-width: 601px) {\n\t.media-list-inner-container {\n\t\tmax-height: 200px;\n\t\tmax-height: 18.75vw;\n\t}\n}\n\n.wppt-all-media-list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.suggested-media-thumbnail:focus,\n.is-embed:focus {\n\toutline: 0;\n\t-webkit-box-shadow: inset 0 0 0 3px #00a0d2;\n\tbox-shadow: inset 0 0 0 3px #00a0d2;\n}\n\n.suggested-media-thumbnail {\n\tposition: relative;\n\tdisplay: block;\n\tfloat: right;\n\twidth: 16.66%;\n\tpadding: 16.66% 16.66% 0 0;\n\tbackground-position: center;\n\tbackground-repeat: no-repeat;\n\t-webkit-background-size: cover;\n\tbackground-size: cover;\n\tbackground-color: #d8d8d8;\n\tcolor: #fff;\n\tcolor: rgba(255, 255, 255, 0.6);\n\tcursor: pointer;\n}\n\n.suggested-media-thumbnail:hover,\n.suggested-media-thumbnail:active,\n.suggested-media-thumbnail:focus {\n\tcolor: #fff;\n}\n\n.suggested-media-thumbnail:before,\n.suggested-media-thumbnail:after {\n\tdisplay: inline-block;\n\tposition: absolute;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tfont-weight: 400;\n\tfont-style: normal;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.suggested-media-thumbnail:before {\n\tright: 50%;\n\ttop: 50%;\n\tmargin: -20px -20px 0 0;\n\tfont-size: 40px;\n}\n\n.suggested-media-thumbnail:after {\n\tcontent: \"\\f132\";\n\tleft: 3%;\n\tbottom: 2%;\n}\n\n@media (min-width: 601px) {\n\t.suggested-media-thumbnail {\n\t\twidth: 12.5%;\n\t\tpadding: 12.5% 12.5% 0 0;\n\t}\n}\n\n.is-embed:before {\n\tcontent: \"\\f104\";\n\tcolor: #fff;\n\tcolor: rgba(255, 255, 255, 0.9);\n}\n\n.is-embed.is-audio:hover:before,\n.is-embed.is-audio:active:before,\n.is-embed.is-audio:focus:before,\n.is-embed.is-tweet:hover:before,\n.is-embed.is-tweet:active:before,\n.is-embed.is-tweet:focus:before {\n\tcolor: #fff;\n}\n\n.is-embed.is-video {\n\tbackground-color: #23282d;\n}\n\n.is-embed.is-video:hover:before,\n.is-embed.is-video:active:before,\n.is-embed.is-video:focus:before {\n\tcolor: rgba(255, 255, 255, 0.2);\n}\n\n.is-embed.is-video:before {\n\tcontent: \"\\f236\";\n}\n\n.is-embed.is-audio {\n\tbackground-color: #ff7d44;\n}\n\n.is-embed.is-audio:before {\n\tcontent: \"\\f127\";\n}\n\n.is-embed.is-tweet {\n\tbackground-color: #55acee;\n}\n\n.is-embed.is-tweet:before {\n\tcontent: \"\\f301\";\n}\n\n.no-media {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n/* Actions bar */\n.press-this-actions {\n\tposition: fixed;\n\tbottom: 0;\n\tright: 0;\n\twidth: 100%;\n\tbackground: #f1f1f1;\n\tbackground: rgba(241, 241, 241, 0.9);\n\tborder-top: 1px solid #e5e5e5;\n}\n\n@media (max-width: 900px) {\n\t.press-this-actions {\n\t\t-webkit-transform: translateY(0);\n\t\t-ms-transform: translateY(0);\n\t\ttransform: translateY(0);\n\t\t-webkit-transition: -webkit-transform .3s ease-in-out;\n\t\ttransition: -webkit-transform .3s ease-in-out;\n\t\ttransition: transform .3s ease-in-out;\n\t\ttransition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;\n\t}\n\t.press-this-actions.is-hidden {\n\t\t-webkit-transform: translateY(100%);\n\t\t-ms-transform: translateY(100%);\n\t\ttransform: translateY(100%);\n\t}\n}\n\n.add-media {\n\tfloat: right;\n\tmargin: 14px 30px 14px 0;\n\tfont-size: 0;\n}\n\n@media (max-width: 320px) {\n\t.add-media {\n\t\tmargin: 10px 10px 10px 0;\n\t}\n}\n\n.insert-media {\n\tcolor: #9ea7af;\n\tfloat: right;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tborder-left: 1px solid #e5e5e5;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tbackground: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toverflow: hidden;\n}\n\n.insert-media:hover,\n.insert-media:focus,\n.insert-media:active {\n\tmargin: 0;\n\tbackground: none;\n\tborder-color: #e5e5e5;\n\tcolor: #23282d;\n}\n\n.insert-media:focus,\n.insert-media:active {\n\toutline: 0;\n\tcolor: #00a0d2;\n\ttext-decoration: none;\n}\n\n.insert-media .dashicons {\n\tpadding: 11px;\n\twidth: 63px;\n\theight: 58px;\n\tfont-size: 40px;\n}\n\n@media (max-width: 320px) {\n\t.insert-media .dashicons {\n\t\twidth: 55px;\n\t\theight: 49px;\n\t\tpadding: 14px;\n\t\tfont-size: 20px;\n\t}\n}\n\n.post-actions {\n\tfloat: left;\n\tmargin: 14px 0 14px 30px;\n\tfont-size: 13px;\n}\n\n@media (max-width: 320px) {\n\t.post-actions {\n\t\tmargin: 10px 0 10px 10px;\n\t}\n}\n\n.publish-button .saving-draft,\n.publish-button.is-saving .publish {\n\tdisplay: none;\n}\n\n.publish-button.is-saving .saving-draft {\n\tdisplay: inline;\n}\n\n/* TinyMCE styles */\n.editor .wp-media-buttons {\n\tfloat: none;\n}\n\n.editor div.mce-toolbar-grp {\n\tpadding: 0.71429em 0;\n\tbackground: none;\n\tborder: 0;\n}\n\n@media (max-height: 400px), (max-width: 320px) {\n\t.editor div.mce-toolbar-grp {\n\t\tpadding: 0;\n\t}\n}\n\n.mce-stack-layout:before,\n.mce-stack-layout:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.mce-stack-layout:after {\n\tclear: both;\n}\n\n.mce-container.mce-toolbar {\n\tfloat: right;\n}\n\n.mce-container.mce-toolbar:nth-child(2) {\n\tfloat: left;\n}\n\n@media (max-width: 600px) {\n\t.mce-first .mce-btn:nth-child(3),\n\t.mce-first .mce-btn:nth-child(4) {\n\t\tposition: absolute;\n\t\tmargin: -1px;\n\t\tpadding: 0;\n\t\theight: 1px;\n\t\twidth: 1px;\n\t\toverflow: hidden;\n\t\tclip: rect(0 0 0 0);\n\t\tborder: 0;\n\t}\n\n\t.mce-first .mce-btn:nth-child(3):focus,\n\t.mce-first .mce-btn:nth-child(4):focus {\n\t\tposition: static;\n\t\tmargin: 1px;\n\t\tpadding: inherit;\n\t\theight: auto;\n\t\twidth: auto;\n\t\toverflow: visible;\n\t\tclip: auto;\n\t\tborder: 1px solid #999;\n\t}\n}\n\n#wp-link-wrap {\n\tfont-size: 13px;\n}\n\n#wp-link-wrap input[type=\"text\"] {\n\tpadding: 3px 5px;\n\tmargin: 1px;\n}\n\n@media screen and (max-width: 782px) {\n\t#wp-link-wrap {\n\t\tfont-size: 14px;\n\t}\n\n\t#wp-link-wrap input[type=\"text\"] {\n\t\tpadding: 6px 10px;\n\t}\n}\n\n#wp-link-wrap .howto {\n\tcolor: #666;\n\tfont-style: italic;\n}\n\n/* Options panel (sidebar) */\n.options-panel {\n\tposition: relative;\n\tfloat: left;\n\tmargin-left: -320px;\n\twidth: 320px;\n\tborder-right: 1px solid #e5e5e5;\n\tfont-size: 14px;\n\t/* Keeps background the full height of the screen, but only visually. Clicks go through. */\n\t-webkit-box-shadow: -5001px 5000px 0 5000px #fff, -5000px 5000px 0 5000px #e5e5e5;\n\tbox-shadow: -5001px 5000px 0 5000px #fff, -5000px 5000px 0 5000px #e5e5e5;\n\toutline: 0;\n}\n\n.options-panel-back {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\twidth: 320px;\n\toutline: 0;\n}\n\n@media (max-width: 900px) {\n\t.options-panel {\n\t\tbackground: #fff;\n\t\t-webkit-transform: translateX(100%);\n\t\t-ms-transform: translateX(100%);\n\t\ttransform: translateX(100%);\n\t\t-webkit-transition: -webkit-transform .3s ease-in-out;\n\t\ttransition: -webkit-transform .3s ease-in-out;\n\t\ttransition: transform .3s ease-in-out;\n\t\ttransition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;\n\t}\n\n\t.options-panel.is-hidden {\n\t\tvisibility: hidden;\n\t}\n\n\t.options-panel.is-off-screen {\n\t\t-webkit-transform: translateX(0);\n\t\t-ms-transform: translateX(0);\n\t\ttransform: translateX(0);\n\t}\n}\n\n@media (max-width: 320px) {\n\t.options-panel {\n\t\tmargin-left: -100%;\n\t\twidth: 100%;\n\t\tborder: 0;\n\t\t-webkit-box-shadow: -5001px 5000px 0 5000px #fff;\n\t\tbox-shadow: -5001px 5000px 0 5000px #fff;\n\t}\n\n\t.options-panel-back {\n\t\twidth: 100%;\n\t}\n}\n\n.post-options {\n\tbackground: #fff;\n\tposition: absolute;\n\tleft: 0;\n\twidth: 100%;\n\toverflow-x: hidden;\n}\n\n.post-options .post-option-contents {\n\tmargin-right: 3px;\n\tcolor: #32373c;\n}\n\n.post-option-forward:before {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 8px;\n\tmargin-top: -10px;\n\tcontent: \"\\f341\"\n}\n\n.post-option-back:before {\n\tcontent: \"\\f345\";\n}\n\n.lt-ie9 .options-panel,\n.lt-ie9 .post-options {\n\tborder-right: 1px solid #e5e5e5;\n}\n\n.lt-ie9 .post-options.is-off-screen {\n\tborder: 0;\n}\n\n.post-option {\n\tposition: relative;\n}\n\n.post-options .post-option {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 13px 14px 13px 37px;\n\tborder-bottom: 1px solid #e5e5e5;\n\ttext-decoration: none;\n\ttext-align: right;\n\tcolor: #9ea7af;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\t-webkit-transition: -webkit-transform .3s ease-in-out;\n\ttransition: -webkit-transform .3s ease-in-out;\n\ttransition: transform .3s ease-in-out;\n\ttransition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;\n}\n\n.post-options .post-option:focus {\n\toutline: 0;\n\t-webkit-box-shadow: inset -5px 0 0 #00a0d2;\n\tbox-shadow: inset -5px 0 0 #00a0d2;\n\tborder-color: #e5e5e5;\n}\n\n.is-off-screen > .post-option {\n\tleft: 100%;\n}\n\n.is-hidden > .post-option {\n\tvisibility: hidden;\n}\n\n@media (min-width: 1px) {\n\t.is-off-screen > .post-option {\n\t\tleft: auto;\n\t\t-webkit-transform: translateX(100%);\n\t\t-ms-transform: translateX(100%);\n\t\ttransform: translateX(100%);\n\t}\n}\n\n.post-option-title {\n\tdisplay: inline-block;\n\tmargin: 0 8px 0 0;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.setting-modal {\n\tposition: relative;\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n\toverflow: hidden;\n\t-webkit-transition: -webkit-transform .3s ease-in-out;\n\ttransition: -webkit-transform .3s ease-in-out;\n\ttransition: transform .3s ease-in-out;\n\ttransition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;\n}\n\n.setting-modal.is-hidden {\n\tvisibility: hidden;\n\theight: 0;\n}\n\n.setting-modal.is-off-screen {\n\tright: 100%;\n}\n\n@media (min-width: 1px) {\n\t.setting-modal.is-off-screen {\n\t\tright: 0;\n\t\t-webkit-transform: translateX(-100%);\n\t\t-ms-transform: translateX(-100%);\n\t\ttransform: translateX(-100%);\n\t}\n}\n\n.press-this .modal-close {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 13px 14px;\n\tborder-bottom: 1px solid #e5e5e5;\n\tcolor: #00a0d2;\n\ttext-decoration: none;\n\ttext-align: right;\n}\n\n.press-this .modal-close:focus {\n\toutline: 0;\n\t-webkit-box-shadow: inset -5px 0 0 #00a0d2;\n\tbox-shadow: inset -5px 0 0 #00a0d2;\n\tborder-color: #e5e5e5;\n}\n\n.setting-title {\n\tposition: relative;\n\ttop: -1px;\n\tmargin-right: 11px;\n}\n\n/* Text editor */\n#pressthis {\n\tcolor: #404040;\n\tresize: none;\n\tpadding-top: 30px;\n\tfont-size: 16px;\n}\n\n.wp-editor-wrap .quicktags-toolbar {\n\tbackground: transparent;\n\tborder: none;\n}\n\n/* Switch editor buttons */\n.wp-editor-wrap .wp-editor-tools {\n\tz-index: 0;\n}\n\n.wp-editor-wrap .wp-editor-tabs {\n\tpadding: 2px;\n}\n\n.wp-editor-wrap .wp-switch-editor {\n\ttop: 0;\n\tmargin: 3px 5px 0 0;\n\tpadding: 3px 8px;\n\tbackground: #f5f5f5;\n\tcolor: #555;\n\tborder-color: #ccc;\n}\n\n.wp-editor-wrap .wp-switch-editor:hover {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.wp-editor-wrap.tmce-active .switch-tmce,\n.wp-editor-wrap.html-active .switch-html {\n\tbackground: #fff;\n\tborder-color: #d8d8d8;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/press-this.css",
    "content": "/*\nPress This styles :)\n*/\n\n\n/**\n* Normalize\n*\n* normalize.css v3.0.0 | MIT License | git.io/normalize\n*/\nhtml {\n\tfont-family: sans-serif;\n\t-ms-text-size-adjust: 100%;\n\t-webkit-text-size-adjust: 100%;\n}\n\nbody {\n\tmargin: 0;\n}\n\n*,\n*:before,\n*:after {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 144dpi) {\n\t*,\n\t*:before,\n\t*:after {\n\t\t-webkit-font-smoothing: antialiased;\n\t}\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n\tdisplay: block;\n}\n\naudio,\ncanvas,\nprogress,\nvideo {\n\tdisplay: inline-block;\n\tvertical-align: baseline;\n}\n\naudio:not([controls]) {\n\tdisplay: none;\n\theight: 0;\n}\n\n[hidden],\ntemplate {\n\tdisplay: none;\n}\n\na {\n\tbackground: transparent;\n}\n\na:active,\na:hover {\n\toutline: 0;\n}\n\nabbr[title] {\n\tborder-bottom: 1px dotted;\n}\n\nb,\nstrong {\n\tfont-weight: bold;\n}\n\ndfn {\n\tfont-style: italic;\n}\n\nh1 {\n\tfont-size: 2em;\n\tmargin: 0.67em 0;\n}\n\nmark {\n\tbackground: #ff0;\n\tcolor: #000;\n}\n\nsmall {\n\tfont-size: 80%;\n}\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nimg {\n\tborder: 0;\n}\n\nsvg:not(:root) {\n\toverflow: hidden;\n}\n\nfigure {\n\tmargin: 1em 40px;\n}\n\nhr {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\theight: 0;\n}\n\npre {\n\toverflow: auto;\n}\n\ncode,\nkbd,\npre,\nsamp {\n\tfont-family: monospace, monospace;\n\tfont-size: 1em;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tcolor: inherit;\n\tfont: inherit;\n\tmargin: 0;\n}\n\nbutton {\n\toverflow: visible;\n}\n\nbutton,\nselect {\n\ttext-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n\t-webkit-appearance: button;\n\tcursor: pointer;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n\tcursor: default;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\ninput {\n\tline-height: normal;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tpadding: 0;\n}\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n\theight: auto;\n}\n\ninput[type=\"search\"] {\n\t-webkit-appearance: textfield;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\nfieldset {\n\tborder: 0;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nlegend {\n\tborder: 0;\n\tpadding: 0;\n}\n\ntextarea {\n\toverflow: auto;\n}\n\noptgroup {\n\tfont-weight: bold;\n}\n\ntable {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntd,\nth {\n\tpadding: 0;\n}\n\n.clearfix:before,\n.clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n.clearfix:after {\n\tclear: both;\n}\n\n.hide-if-js {\n\tdisplay: none;\n}\n\n.screen-reader-text {\n\tposition: absolute;\n\tmargin: -1px;\n\tpadding: 0;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\tclip: rect(0 0 0 0);\n\tborder: 0;\n}\n\n\n/**\n* Typography\n*\n* Base element typographic styles.\n*/\nbody,\nbutton,\ninput,\nselect,\ntextarea {\n\tcolor: #404040;\n\tfont-family: \"Open Sans\", Helvetica, Arial, sans-serif;\n\tfont-size: 20px;\n\tfont-weight: 400;\n\tline-height: 1.6;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tclear: both;\n}\n\np {\n\tmargin-bottom: 1.5em;\n}\n\nb,\nstrong {\n\tfont-weight: 700;\n}\n\n\n/**\n* Buttons\n*\n* Pushing buttons is what I do.\n*/\n\n.scan-submit {\n\tdisplay: inline-block;\n\tmargin: 0;\n\tpadding: 0 10px 1px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\tfont-size: 13px;\n\tline-height: 2;\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n}\n\n.split-button {\n\tposition: relative;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.split-button-body {\n\tdisplay: none;\n\tposition: absolute;\n\tbottom: 39px;\n\tright: 0;\n\tborder: 1px solid #ddd;\n\tbackground-color: #fff;\n\tmin-width: 180px;\n\tmax-width: 100%;\n\tmargin: 0;\n\tpadding: 8px;\n\tlist-style: none;\n\t-webkit-box-shadow: 1px 0 4px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: 1px 0 4px rgba( 0, 0, 0, 0.15 );\n}\n\n.split-button-body:before,\n.split-button-body:after {\n\tposition: absolute;\n\tright: 12px;\n\tdisplay: block;\n\twidth: 0;\n\theight: 0;\n\tborder-style: solid;\n\tborder-color: transparent;\n\tcontent: \"\";\n}\n\n.split-button-body:before {\n\tbottom: -18px;\n\tborder-top-color: #ccc;\n\tborder-width: 9px;\n\tright: 11px;\n}\n\n.split-button-body:after {\n\tbottom: -16px;\n\tborder-top-color: #fff;\n\tborder-width: 8px;\n}\n\n.split-button-body .split-button-option {\n\tdisplay: block;\n\tpadding: 5px 15px;\n\tmargin: 0;\n\twidth: 100%;\n\ttext-align: left;\n\tline-height: 2;\n}\n\n.is-open .split-button-body {\n\tdisplay: block;\n}\n\n.split-button-primary,\n.split-button-toggle {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tdisplay: block;\n\tmargin: 0;\n\tfont-size: 13px;\n\ttext-decoration: none;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n\tline-height: 2;\n\tpadding: 0 10px 1px;\n\tbackground: #0085ba;\n\tborder-color: #0073aa #006799 #006799;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-box-shadow: 0 1px 0 #006799;\n \tbox-shadow: 0 1px 0 #006799;\n\tcolor: #fff;\n\ttext-shadow: 0 -1px 1px #006799,\n\t\t1px 0 1px #006799,\n\t\t0 1px 1px #006799,\n\t\t-1px 0 1px #006799;\n}\n\n.split-button-primary {\n\t-webkit-border-top-left-radius: 3px;\n\tborder-top-left-radius: 3px;\n\t-webkit-border-bottom-left-radius: 3px;\n\tborder-bottom-left-radius: 3px;\n\tborder-right: 0 none;\n\tfloat: left;\n}\n\n.split-button-toggle {\n\tpadding: 0;\n\t-webkit-border-top-right-radius: 3px;\n\tborder-top-right-radius: 3px;\n\t-webkit-border-bottom-right-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n\tborder-left: 1px solid #006799;\n\tfloat: right;\n}\n\n.split-button-toggle i {\n\tmargin: 4px 20px 3px 0;\n\tpadding: 0 10px;\n}\n\n.split-button-primary:hover,\n.split-button-toggle:hover {\n\toutline: none;\n\tbackground: #008ec2;\n\tborder-color: #006799;\n}\n\n.split-button-primary:focus,\n.split-button-toggle:focus {\n\toutline: none;\n\t-webkit-box-shadow: 0 1px 0 #0073aa,\n\t\t0 0 2px 1px #33b3db;\n\tbox-shadow: 0 1px 0 #0073aa,\n\t\t0 0 2px 1px #33b3db;\n}\n\n.split-button-primary:active,\n.split-button-toggle:active {\n\tbackground: #0073aa;\n\tborder-color: #006799;\n\t-webkit-box-shadow: inset 0 2px 10px #006799, 0 1px 0 #0073aa;\n \tbox-shadow: inset 0 2px 10px #006799, 0 1px 0 #0073aa;\n}\n\n/**\n* Forms\n*\n* So many input types.\n*/\nbutton,\ninput,\nselect,\ntextarea {\n\tfont-size: 100%;\n\tmargin: 0;\n\tvertical-align: baseline;\n\t*vertical-align: middle;\n}\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n\tpadding: 0;\n}\n\n[type=\"search\"] {\n\t-webkit-appearance: textfield;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\n[type=\"text\"],\n[type=\"email\"],\n[type=\"url\"],\n[type=\"password\"],\n[type=\"search\"],\ntextarea {\n\tpadding: 0.4em 0.75em;\n\tcolor: #32373c;\n\tborder: 1px solid #ccc;\n}\n\n[type=\"text\"]:focus,\n[type=\"email\"]:focus,\n[type=\"url\"]:focus,\n[type=\"password\"]:focus,\n[type=\"search\"]:focus,\ntextarea:focus {\n\tcolor: #32373c;\n\toutline: 0;\n}\n\ntextarea {\n\toverflow: auto;\n\tpadding-left: 3px;\n\tvertical-align: top;\n}\n\n\n/**\n* Links\n*/\na {\n\tcolor: #0073aa;\n}\n\na:visited {\n\tcolor: #0073aa;\n}\n\na:hover,\na:focus,\na:active {\n\tcolor: #00a0d2;\n}\n\n\n/**\n* Lists\n*/\nul,\nol {\n\tmargin: 0 0 1.5em 3em;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin-bottom: 0;\n\tmargin-left: 1.5em;\n}\n\ndt {\n\tfont-weight: 700;\n}\n\ndd {\n\tmargin: 0 1.5em 1.5em;\n}\n\n\n/**\n* Post formats\n*\n* Complete styles for post formats UI\n*/\n/* TODO if we remove the <br> during merge, this can go. */\n#post-formats-select br {\n\tdisplay: none;\n}\n\n.post-format {\n\twidth: 1px;\n\theight: 1px;\n\tposition: absolute;\n\ttop: -9999px;\n}\n\n.lt-ie9 .post-format {\n\tmargin: 17px 12px 0 13px;\n\twidth: auto;\n\theight: auto;\n\tposition: static;\n\ttop: auto;\n\tfloat: left;\n\twidth: 16px;\n\theight: 16px;\n}\n\n.post-format-icon {\n\tposition: relative;\n\tdisplay: block;\n\tpadding: 13px 2px 14px 13px;\n\tcursor: pointer;\n}\n\n.post-format-icon:before,\n.post-format-icon:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\twidth: 20px;\n\theight: 20px;\n\tmargin-right: 10px;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tcolor: #9ea7af;\n\tfont-weight: 400;\n\tfont-style: normal;\n\tvertical-align: top;\n\ttext-align: center;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.post-format-icon:before {\n\tcontent: \"\\f109\";\n}\n\n.post-format-icon:after {\n\tdisplay: none;\n\tcontent: \"\\f147\";\n\tfloat: right;\n}\n\n.post-format:checked + .post-format-icon {\n\t-webkit-box-shadow: inset 6px 0 0 #00a0d2;\n\tbox-shadow: inset 6px 0 0 #00a0d2;\n\tbackground: rgba(46, 162, 204, 0.1);\n}\n\n.post-format:checked + .post-format-icon:before,\n.post-format:checked + .post-format-icon:after {\n\tcolor: #32373c;\n}\n\n.post-format:focus + .post-format-icon {\n\tbackground: #00a0d2;\n\tcolor: #fff;\n}\n\n.post-format:focus + .post-format-icon:before,\n.post-format:focus + .post-format-icon:after {\n\tcolor: #fff;\n}\n\n.post-format:checked + .post-format-icon:after {\n\tdisplay: block;\n}\n\n.lt-ie9 .post-format-icon {\n\tmargin-left: 16px;\n}\n\n.post-format-aside:before {\n\tcontent: \"\\f123\";\n}\n\n.post-format-image:before {\n\tcontent: \"\\f128\";\n}\n\n.post-format-video:before {\n\tcontent: \"\\f126\";\n}\n\n.post-format-audio:before {\n\tcontent: \"\\f127\";\n}\n\n.post-format-quote:before {\n\tcontent: \"\\f122\";\n}\n\n.post-format-link:before {\n\tcontent: \"\\f103\";\n}\n\n.post-format-gallery:before {\n\tcontent: \"\\f161\";\n}\n\n\n/**\n* Tags\n*\n* Complete styles for tags UI\n*/\n.tagsdiv p {\n\tmargin: 0;\n}\n\n.tagsdiv .ajaxtag {\n\tposition: relative;\n}\n\n.tagsdiv .newtag {\n\tdisplay: block;\n\tposition: relative;\n\tpadding: 11px 58px 11px 16px;\n\twidth: 100%;\n\tborder: 0;\n\tborder-bottom: 1px solid #e5e5e5;\n\tfont-size: 16px;\n}\n\n.tagsdiv .tagadd {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 1px;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tmargin: 0;\n\tpadding: 0 16px;\n\tbackground: #f7f7f7;\n\tborder-left: 1px solid #f1f1f1;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.tagsdiv .tagadd:hover,\n.tagsdiv .tagadd:active,\n.tagsdiv .tagadd:focus {\n\toutline: 0;\n\tbackground: #2991b7;\n\tborder-color: #20708e;\n\tcolor: #fff;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.tagsdiv .howto {\n\tcolor: #727272;\n\tfont-style: italic;\n\tmargin: 10px 0 6px 16px;\n}\n\n\n/* Tag hint TODO needed? */\n/* Tag suggestions */\n.ac_results {\n\tpadding: 0;\n\tmargin: -1px 0 0 -1px;\n\tlist-style: none;\n\tposition: absolute;\n\tz-index: 10000;\n\tdisplay: none;\n\tborder: 1px solid #d8d8d8;\n\tbackground-color: #fff;\n\tfont-size: 14px;\n}\n\n.ac_results li {\n\tpadding: 6px 16px;\n\twhite-space: nowrap;\n\tcolor: #101010;\n\ttext-align: left;\n}\n\n.ac_results .ac_over {\n\tbackground-color: #e5e5e5;\n\tbackground-color: #00a0d2;\n\tcolor: #fff;\n\tcursor: pointer;\n}\n\n.ac_match {\n\ttext-decoration: underline;\n}\n\n/* Tags */\n.tagchecklist {\n\tpadding: 16px 28px 5px;\n}\n\n.tagchecklist:before,\n.tagchecklist:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.tagchecklist:after {\n\tclear: both;\n}\n\n.tagchecklist span {\n\tdisplay: block;\n\tmargin-right: 25px;\n\tfloat: left;\n\tfont-size: 13px;\n\tline-height: 1.8;\n\twhite-space: nowrap;\n\tcursor: default;\n}\n\n@media (max-width: 600px) {\n\t.tagchecklist span {\n\t\tmargin-bottom: 15px;\n\t\tfont-size: 16px;\n\t\tline-height: 1.3;\n\t}\n}\n\n.tagchecklist .ntdelbutton {\n\tmargin: 1px 0 0 -17px;\n\tcursor: pointer;\n\twidth: 20px;\n\theight: 20px;\n\tdisplay: block;\n\tfloat: left;\n\ttext-indent: 0;\n\toverflow: hidden;\n\tposition: absolute;\n\toutline: 0;\n}\n\n.tagchecklist .ntdelbutton:before {\n\tcontent: \"\\f153\";\n\tdisplay: block;\n\tmargin: 2px 0;\n\theight: 20px;\n\twidth: 20px;\n\tbackground: 0 0;\n\tcolor: #9ea7af;\n\tfont: 400 16px/1 dashicons;\n\ttext-align: center;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.tagchecklist .ntdelbutton:focus:before {\n\tcolor: #00a0d2;\n}\n\n\n/* THE TAG CLOUD. */\n.tagsdiv + p {\n\tmargin: 0;\n}\n\n.press-this .tagcloud-link {\n\tdisplay: block;\n\tmargin: 0 16px 5px;\n\tpadding: 0;\n\ttext-decoration: none;\n\toutline: 0;\n}\n\n.tagcloud-link:focus {\n\ttext-decoration: underline;\n}\n\n.popular-tags {\n\tborder: none;\n\tline-height: 2em;\n\tpadding: 8px 12px 12px;\n\ttext-align: justify;\n}\n\n.popular-tags a {\n\tpadding: 0 3px;\n}\n\n.the-tagcloud {\n\tmargin: 0;\n\tpadding: 16px;\n}\n\n.the-tagcloud a {\n\ttext-decoration: none;\n\toutline: 0;\n}\n\n.the-tagcloud a:focus {\n\ttext-decoration: underline;\n}\n\n.tagcloud h3 {\n\tmargin: 2px 0 12px;\n}\n\n\n/**\n* Categories\n*\n* Complete styles for post categories UI\n*/\ninput[type=\"search\"].categories-search,\n.add-category-name {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 0.85714em 1.07143em;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tborder-bottom: 1px solid #e5e5e5;\n\tfont-size: 14px;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\tappearance: none;\n}\n\n@media (max-width: 600px) {\n\tinput[type=\"search\"].categories-search,\n\t.add-category-name {\n\t\t/* Needs to be 16px to prevent zooming on iOS. Guh. */\n\t\tfont-size: 16px;\n\t}\n}\n\n.press-this .add-cat-toggle {\n\tfloat: right;\n\tmargin-top: -45px;\n\tline-height: 20px;\n\tpadding: 12px 10px 8px;\n\tcolor: #0073aa;\n}\n\n.press-this .add-cat-toggle:focus {\n\ttext-decoration: none;\n\tcolor: #00a0d2;\n}\n\n.press-this .add-cat-toggle.is-toggled {\n\tpadding: 10px;\n}\n\n.press-this .add-cat-toggle.is-toggled .dashicons:before {\n\tcontent: \"\\f179\";\n}\n\n.add-category {\n\tposition: relative;\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n.add-category.is-hidden {\n\tdisplay: none;\n}\n\n.add-category .add-cat-submit {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tpadding: 12px 16px;\n\tbackground: #f7f7f7;\n\tborder-left: 1px solid #f1f1f1;\n}\n\n.add-category .add-cat-submit:hover,\n.add-category .add-cat-submit:active,\n.add-category .add-cat-submit:focus {\n\toutline: 0;\n\tbackground: #2991b7;\n\tborder-color: #20708e;\n\tcolor: #fff;\n}\n\n/* Parent category select */\n.postform-wrapper {\n\tpadding: 12px;\n}\n\n.postform {\n\tdisplay: block;\n\tmargin: 0;\n\twidth: 100%;\n\theight: 34px;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tborder: 1px solid #e5e5e5;\n\tbackground: #fff;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\toverflow: hidden;\n\tline-height: 21px;\n\ttext-overflow: ellipsis;\n\ttext-decoration: none;\n\tvertical-align: top;\n\twhite-space: nowrap;\n\tcursor: pointer;\n\toutline: 0;\n}\n\n.postform:focus {\n\tborder-color: #0073aa;\n\t-webkit-box-shadow: 0 0 0 3px #00a0d2;\n\tbox-shadow: 0 0 0 3px #00a0d2;\n\toutline: 0;\n\t-moz-outline: none;\n\t-moz-user-focus: ignore;\n}\n\n.postform::-ms-expand {\n\tdisplay: none;\n}\n\n.postform::-ms-value {\n\tbackground: none;\n\tcolor: #727272;\n}\n\n.postform:-moz-focusring {\n\tcolor: transparent;\n\ttext-shadow: 0 0 0 #727272;\n}\n\n/* Category list */\n.categories-select {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.categories-select ul {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.category {\n\tposition: relative;\n\tdisplay: block;\n\tpadding: 13px 16px 14px 16px;\n\tcursor: pointer;\n\tbackground: #fff;\n}\n\n.category:focus,\n.category.selected:focus {\n\toutline: 0;\n\tbackground: #00a0d2;\n\tcolor: #fff;\n}\n\n.category.selected {\n\t-webkit-box-shadow: inset 6px 0 0 #00a0d2;\n\tbox-shadow: inset 6px 0 0 #00a0d2;\n\tbackground: #E9F5F9;\n}\n\n.category.selected:after {\n\tdisplay: inline-block;\n\tcontent: \"\\f147\";\n\tposition: absolute;\n\ttop: 13px;\n\tright: 0;\n\twidth: 20px;\n\theight: 20px;\n\tmargin-right: 10px;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tcolor: #23282d;\n\tfont-weight: 400;\n\tfont-style: normal;\n\tvertical-align: top;\n\ttext-align: center;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.category.selected:focus:after {\n\tcolor: #fff;\n}\n\n.categories-select ul .category {\n\tpadding-left: 24px;\n}\n\n.categories-select ul ul .category {\n\tpadding-left: 32px;\n}\n\n.categories-select ul ul ul .category {\n\tpadding-left: 40px;\n}\n\n.categories-select ul ul ul ul .category {\n\tpadding-left: 48px;\n}\n\n.categories-select ul ul ul ul ul .category {\n\tpadding-left: 56px;\n}\n\n.categories-select ul ul ul ul ul ul .category {\n\tpadding-left: 64px;\n}\n\n.categories-select .is-hidden {\n\tdisplay: none;\n}\n\n.categories-select .is-hidden.searched-parent {\n\tdisplay: block;\n}\n\n/* Category search */\n.categories-search-wrapper {\n\tposition: relative;\n}\n\n.categories-search-wrapper.is-hidden {\n\tdisplay: none;\n}\n\n.categories-search-wrapper label {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 10px;\n\tmargin-top: -10px;\n\tcolor: #9ea7af;\n}\n\n\n/**\n* Main\n*/\nhtml {\n\toverflow: auto;\n}\n\nbody {\n\toverflow-x: hidden;\n\theight: 100%;\n}\n\nhtml {\n\tbackground: #fff;\n\t-webkit-box-shadow: -10px 0 0 rgba(0, 0, 0, 0.3);\n\tbox-shadow: -10px 0 0 rgba(0, 0, 0, 0.3);\n}\n\n@media (max-width: 900px) {\n\tbody {\n\t\tfont-size: 16px;\n\t}\n}\n\n@media (max-width: 320px) {\n\tbody {\n\t\tfont-size: 14px;\n\t}\n}\n\n.lt-ie9 {\n\toverflow: visible;\n}\n\n.adminbar {\n\tposition: relative;\n\twidth: 100%;\n\tpadding: 0 0.8em;\n\tmin-height: 3.2em;\n\tbackground: #23282d;\n\tcolor: #fff;\n\tz-index: 9999;\n}\n\n.adminbar:before,\n.adminbar:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.adminbar:after {\n\tclear: both;\n}\n\n.adminbar .dashicons {\n\tcolor: #999;\n}\n\n.press-this .adminbar button {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 6px;\n\tmargin-top: -13px;\n\tpadding: 0 10px 1px;\n\tfont-size: 13px;\n}\n\n@media (max-width: 320px) {\n\t.adminbar {\n\t\tmin-height: 45px;\n\t}\n}\n\n.current-site {\n\tmargin-top: 0.5625em;\n\tfont-size: 16px;\n\tline-height: 44px;\n\tfont-weight: 400;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n}\n\n@media (max-width: 600px) {\n\t.current-site {\n\t\tmargin: 3px 0 0;\n\t}\n}\n\n@media (max-width: 320px) {\n\t.current-site {\n\t\tmargin: 0;\n\t\tfont-size: 14px;\n\t}\n}\n\n.current-site-link {\n\ttext-decoration: none;\n}\n\n.current-site-link:focus {\n\toutline: 0;\n}\n\n.current-site-link:focus .current-site-name{\n\ttext-decoration: underline;\n}\n\n.current-site-name {\n\tcolor: #ededed;\n}\n\n@media (max-width: 320px) {\n\t.current-site-name {\n\t\tfont-weight: 600;\n\t}\n}\n\n.current-site .dashicons-wordpress {\n\tposition: relative;\n\ttop: -1px;\n\tmargin-right: 10px;\n\tvertical-align: middle;\n}\n\n.options,\n.options.open .on-closed,\n.options.closed .on-open {\n\tdisplay: none;\n}\n\n@media (max-width: 900px) {\n\t.options {\n\t\tdisplay: block;\n\t}\n}\n\n.options-panel-back.is-hidden {\n\tdisplay: none;\n}\n\n.options:focus .dashicons {\n\tcolor: #fff;\n\ttext-decoration: none;\n}\n\n.options .dashicons {\n\tmargin-top: 3px;\n}\n\n.options {\n\tcolor: #00a0d2;\n}\n\n.alert {\n\tposition: relative;\n\tmargin: 0;\n\tpadding: 16px 50px;\n\tborder-bottom: 1px solid #e5e5e5;\n\tfont-size: 14px;\n}\n\n.alert:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 30px;\n\twidth: 8px;\n\theight: 8px;\n\tmargin-top: -4px;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tbackground: #00a0d2;\n}\n\n@media (max-width: 600px) {\n\t.alert {\n\t\tpadding: 16px 35px;\n\t}\n\t.alert:before {\n\t\tleft: 15px;\n\t}\n}\n\n.alert.is-error:before {\n\tbackground: red;\n}\n\n.scan {\n\tposition: relative;\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n@media (max-width: 900px) {\n\t.scan form {\n\t\t-webkit-transition: opacity .3s ease-in-out;\n\t\ttransition: opacity .3s ease-in-out;\n\t}\n\t.scan.is-hidden form {\n\t\topacity: .2;\n\t\tpointer-events: none;\n\t}\n}\n\n.scan-url {\n\tdisplay: block;\n\tborder: 0;\n\tpadding: 0.85714em 1.07143em;\n\tfont-size: 14px;\n\twidth: 100%;\n}\n\n@media (max-width: 600px) {\n\t.scan-url {\n\t\tfont-size: 16px;\n\t}\n}\n\n.scan-submit {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tpadding: 0 1.07143em;\n\tbackground: #f7f7f7;\n\tborder-color: #dedede;\n\tborder: 0;\n\tborder-left: 1px solid #f1f1f1;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tcolor: #555;\n\tfont-size: 14px;\n\tline-height: 1.6;\n}\n\n.scan-submit:hover,\n.scan-submit:focus {\n\tbackground: #008ec2;\n\tborder-color: #006799;\n\tcolor: #fff;\n\toutline: 0;\n}\n\n.scan-submit:active {\n\tbackground: #0073aa;\n\tborder-color: #006799;\n\tcolor: #fff;\n}\n\n.scan-submit:visited {\n\tcolor: #555;\n}\n\n.wrapper {\n\tposition: relative;\n\tmargin-bottom: 60px;\n\tmargin-right: 320px;\n}\n\n.wrapper:before,\n.wrapper:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.wrapper:after {\n\tclear: both;\n}\n\n@media (max-width: 900px) {\n\t.wrapper {\n\t\tmargin: 0;\n\t\twidth: 100%;\n\t}\n}\n\n.editor-wrapper {\n\toverflow: auto;\n\tfloat: left;\n\twidth: 100%;\n}\n\n.editor-wrapper:before,\n.editor-wrapper:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.editor-wrapper:after {\n\tclear: both;\n}\n\n.editor {\n\tpadding: 0 1.5em 4.75em;\n\tmax-width: 700px;\n\tmargin: 0 auto;\n}\n\n.spinner {\n\theight: 20px;\n\twidth: 20px;\n\tdisplay: inline-block;\n\tvisibility: hidden;\n\tbackground: url(../images/spinner.gif) no-repeat center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tline-height: 1;\n\tvertical-align: middle;\n}\n\n@media print,\n\t(-webkit-min-device-pixel-ratio: 1.25),\n\t(min-resolution: 120dpi) {\n\n\t.spinner {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n.spinner.is-active {\n\tvisibility: visible;\n}\n\n/* Make the text inside the editor textarea white. Prevents a \"flash\" on loading the page */\n#pressthis {\n\tcolor: #fff;\n}\n\n@media (min-width: 901px) {\n\t.editor {\n\t\tmax-width: 760px;\n\t}\n}\n\n@media (max-width: 320px) {\n\t.editor {\n\t\tpadding: 0;\n\t}\n}\n\n.post-title,\n.post-title-placeholder {\n\tmargin: 0;\n\tpadding: .83em 0;\n\twidth: 100%;\n\tborder-bottom: 1px solid #e5e5e5;\n\tfont-size: 32px;\n\tline-height: 1.4;\n\tfont-weight: 700;\n}\n\n.post-title:active,\n.post-title:focus,\n.post-title-placeholder:active,\n.post-title-placeholder:focus {\n\toutline: 0;\n\t-webkit-box-shadow: inset 0px -3px 0 #00a0d2;\n\tbox-shadow: inset 0px -3px 0 #00a0d2;\n\tborder-color: #00a0d2;\n}\n\n@media (max-width: 900px) {\n\t.post-title,\n\t.post-title-placeholder {\n\t\tfont-size: 24px;\n\t}\n}\n\n@media (max-height: 400px) {\n\t.post-title,\n\t.post-title-placeholder {\n\t\tpadding: 15px 0;\n\t\tfont-size: 16px;\n\t}\n}\n\n@media (max-width: 320px) {\n\t.post-title,\n\t.post-title-placeholder {\n\t\tfont-size: 16px;\n\t\tfont-weight: 600;\n\t\tpadding: 1.14286em 1.42857em;\n\t}\n}\n\n.post-title {\n\t/* IE8 fallback */\n\tbackground: url(data:image/gif;base64,R0lGODlhAQABAJEAAAAAAP///////wAAACH5BAEHAAIALAAAAAABAAEAAAICVAEAOw==);\n\tbackground: none, none;\n}\n\n.post-title:before {\n\t/* Keeps empty container from collapsing */\n\tcontent: \"\\a0\";\n\tdisplay: inline-block;\n\twidth: 0;\n\tspeak: none;\n}\n\n.post-title-placeholder {\n\tposition: absolute;\n\tborder: 0;\n\tcolor: #9ea7af;\n\tz-index: -1;\n}\n\n.post-title-placeholder.is-hidden {\n\tdisplay: none;\n}\n\n/* Suggested images */\n.media-list-container {\n\tposition: relative;\n\tpadding: 2px 0;\n\tborder-bottom: 1px solid #e5e5e5;\n\tdisplay: none;\n}\n\n.media-list-inner-container {\n\toverflow: auto;\n\tmax-height: 150px;\n\tmax-height: 40vw;\n}\n\n.media-list-container.has-media {\n\tdisplay: block;\n}\n\n.media-list-inner-container:before,\n.media-list-inner-container:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.media-list-inner-container:after {\n\tclear: both;\n}\n\n.media-list {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n@media (min-width: 321px) {\n\t.media-list-inner-container {\n\t\tmax-height: 250px;\n\t\tmax-height: 40vw;\n\t}\n}\n\n@media (min-width: 601px) {\n\t.media-list-inner-container {\n\t\tmax-height: 200px;\n\t\tmax-height: 18.75vw;\n\t}\n}\n\n.wppt-all-media-list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.suggested-media-thumbnail:focus,\n.is-embed:focus {\n\toutline: 0;\n\t-webkit-box-shadow: inset 0 0 0 3px #00a0d2;\n\tbox-shadow: inset 0 0 0 3px #00a0d2;\n}\n\n.suggested-media-thumbnail {\n\tposition: relative;\n\tdisplay: block;\n\tfloat: left;\n\twidth: 16.66%;\n\tpadding: 16.66% 0 0 16.66%;\n\tbackground-position: center;\n\tbackground-repeat: no-repeat;\n\t-webkit-background-size: cover;\n\tbackground-size: cover;\n\tbackground-color: #d8d8d8;\n\tcolor: #fff;\n\tcolor: rgba(255, 255, 255, 0.6);\n\tcursor: pointer;\n}\n\n.suggested-media-thumbnail:hover,\n.suggested-media-thumbnail:active,\n.suggested-media-thumbnail:focus {\n\tcolor: #fff;\n}\n\n.suggested-media-thumbnail:before,\n.suggested-media-thumbnail:after {\n\tdisplay: inline-block;\n\tposition: absolute;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tfont-weight: 400;\n\tfont-style: normal;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.suggested-media-thumbnail:before {\n\tleft: 50%;\n\ttop: 50%;\n\tmargin: -20px 0 0 -20px;\n\tfont-size: 40px;\n}\n\n.suggested-media-thumbnail:after {\n\tcontent: \"\\f132\";\n\tright: 3%;\n\tbottom: 2%;\n}\n\n@media (min-width: 601px) {\n\t.suggested-media-thumbnail {\n\t\twidth: 12.5%;\n\t\tpadding: 12.5% 0 0 12.5%;\n\t}\n}\n\n.is-embed:before {\n\tcontent: \"\\f104\";\n\tcolor: #fff;\n\tcolor: rgba(255, 255, 255, 0.9);\n}\n\n.is-embed.is-audio:hover:before,\n.is-embed.is-audio:active:before,\n.is-embed.is-audio:focus:before,\n.is-embed.is-tweet:hover:before,\n.is-embed.is-tweet:active:before,\n.is-embed.is-tweet:focus:before {\n\tcolor: #fff;\n}\n\n.is-embed.is-video {\n\tbackground-color: #23282d;\n}\n\n.is-embed.is-video:hover:before,\n.is-embed.is-video:active:before,\n.is-embed.is-video:focus:before {\n\tcolor: rgba(255, 255, 255, 0.2);\n}\n\n.is-embed.is-video:before {\n\tcontent: \"\\f236\";\n}\n\n.is-embed.is-audio {\n\tbackground-color: #ff7d44;\n}\n\n.is-embed.is-audio:before {\n\tcontent: \"\\f127\";\n}\n\n.is-embed.is-tweet {\n\tbackground-color: #55acee;\n}\n\n.is-embed.is-tweet:before {\n\tcontent: \"\\f301\";\n}\n\n.no-media {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n/* Actions bar */\n.press-this-actions {\n\tposition: fixed;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 100%;\n\tbackground: #f1f1f1;\n\tbackground: rgba(241, 241, 241, 0.9);\n\tborder-top: 1px solid #e5e5e5;\n}\n\n@media (max-width: 900px) {\n\t.press-this-actions {\n\t\t-webkit-transform: translateY(0);\n\t\t-ms-transform: translateY(0);\n\t\ttransform: translateY(0);\n\t\t-webkit-transition: -webkit-transform .3s ease-in-out;\n\t\ttransition: -webkit-transform .3s ease-in-out;\n\t\ttransition: transform .3s ease-in-out;\n\t\ttransition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;\n\t}\n\t.press-this-actions.is-hidden {\n\t\t-webkit-transform: translateY(100%);\n\t\t-ms-transform: translateY(100%);\n\t\ttransform: translateY(100%);\n\t}\n}\n\n.add-media {\n\tfloat: left;\n\tmargin: 14px 0 14px 30px;\n\tfont-size: 0;\n}\n\n@media (max-width: 320px) {\n\t.add-media {\n\t\tmargin: 10px 0 10px 10px;\n\t}\n}\n\n.insert-media {\n\tcolor: #9ea7af;\n\tfloat: left;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tborder-right: 1px solid #e5e5e5;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tbackground: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toverflow: hidden;\n}\n\n.insert-media:hover,\n.insert-media:focus,\n.insert-media:active {\n\tmargin: 0;\n\tbackground: none;\n\tborder-color: #e5e5e5;\n\tcolor: #23282d;\n}\n\n.insert-media:focus,\n.insert-media:active {\n\toutline: 0;\n\tcolor: #00a0d2;\n\ttext-decoration: none;\n}\n\n.insert-media .dashicons {\n\tpadding: 11px;\n\twidth: 63px;\n\theight: 58px;\n\tfont-size: 40px;\n}\n\n@media (max-width: 320px) {\n\t.insert-media .dashicons {\n\t\twidth: 55px;\n\t\theight: 49px;\n\t\tpadding: 14px;\n\t\tfont-size: 20px;\n\t}\n}\n\n.post-actions {\n\tfloat: right;\n\tmargin: 14px 30px 14px 0;\n\tfont-size: 13px;\n}\n\n@media (max-width: 320px) {\n\t.post-actions {\n\t\tmargin: 10px 10px 10px 0;\n\t}\n}\n\n.publish-button .saving-draft,\n.publish-button.is-saving .publish {\n\tdisplay: none;\n}\n\n.publish-button.is-saving .saving-draft {\n\tdisplay: inline;\n}\n\n/* TinyMCE styles */\n.editor .wp-media-buttons {\n\tfloat: none;\n}\n\n.editor div.mce-toolbar-grp {\n\tpadding: 0.71429em 0;\n\tbackground: none;\n\tborder: 0;\n}\n\n@media (max-height: 400px), (max-width: 320px) {\n\t.editor div.mce-toolbar-grp {\n\t\tpadding: 0;\n\t}\n}\n\n.mce-stack-layout:before,\n.mce-stack-layout:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.mce-stack-layout:after {\n\tclear: both;\n}\n\n.mce-container.mce-toolbar {\n\tfloat: left;\n}\n\n.mce-container.mce-toolbar:nth-child(2) {\n\tfloat: right;\n}\n\n@media (max-width: 600px) {\n\t.mce-first .mce-btn:nth-child(3),\n\t.mce-first .mce-btn:nth-child(4) {\n\t\tposition: absolute;\n\t\tmargin: -1px;\n\t\tpadding: 0;\n\t\theight: 1px;\n\t\twidth: 1px;\n\t\toverflow: hidden;\n\t\tclip: rect(0 0 0 0);\n\t\tborder: 0;\n\t}\n\n\t.mce-first .mce-btn:nth-child(3):focus,\n\t.mce-first .mce-btn:nth-child(4):focus {\n\t\tposition: static;\n\t\tmargin: 1px;\n\t\tpadding: inherit;\n\t\theight: auto;\n\t\twidth: auto;\n\t\toverflow: visible;\n\t\tclip: auto;\n\t\tborder: 1px solid #999;\n\t}\n}\n\n#wp-link-wrap {\n\tfont-size: 13px;\n}\n\n#wp-link-wrap input[type=\"text\"] {\n\tpadding: 3px 5px;\n\tmargin: 1px;\n}\n\n@media screen and (max-width: 782px) {\n\t#wp-link-wrap {\n\t\tfont-size: 14px;\n\t}\n\n\t#wp-link-wrap input[type=\"text\"] {\n\t\tpadding: 6px 10px;\n\t}\n}\n\n#wp-link-wrap .howto {\n\tcolor: #666;\n\tfont-style: italic;\n}\n\n/* Options panel (sidebar) */\n.options-panel {\n\tposition: relative;\n\tfloat: right;\n\tmargin-right: -320px;\n\twidth: 320px;\n\tborder-left: 1px solid #e5e5e5;\n\tfont-size: 14px;\n\t/* Keeps background the full height of the screen, but only visually. Clicks go through. */\n\t-webkit-box-shadow: 5001px 5000px 0 5000px #fff, 5000px 5000px 0 5000px #e5e5e5;\n\tbox-shadow: 5001px 5000px 0 5000px #fff, 5000px 5000px 0 5000px #e5e5e5;\n\toutline: 0;\n}\n\n.options-panel-back {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\twidth: 320px;\n\toutline: 0;\n}\n\n@media (max-width: 900px) {\n\t.options-panel {\n\t\tbackground: #fff;\n\t\t-webkit-transform: translateX(-100%);\n\t\t-ms-transform: translateX(-100%);\n\t\ttransform: translateX(-100%);\n\t\t-webkit-transition: -webkit-transform .3s ease-in-out;\n\t\ttransition: -webkit-transform .3s ease-in-out;\n\t\ttransition: transform .3s ease-in-out;\n\t\ttransition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;\n\t}\n\n\t.options-panel.is-hidden {\n\t\tvisibility: hidden;\n\t}\n\n\t.options-panel.is-off-screen {\n\t\t-webkit-transform: translateX(0);\n\t\t-ms-transform: translateX(0);\n\t\ttransform: translateX(0);\n\t}\n}\n\n@media (max-width: 320px) {\n\t.options-panel {\n\t\tmargin-right: -100%;\n\t\twidth: 100%;\n\t\tborder: 0;\n\t\t-webkit-box-shadow: 5001px 5000px 0 5000px #fff;\n\t\tbox-shadow: 5001px 5000px 0 5000px #fff;\n\t}\n\n\t.options-panel-back {\n\t\twidth: 100%;\n\t}\n}\n\n.post-options {\n\tbackground: #fff;\n\tposition: absolute;\n\tright: 0;\n\twidth: 100%;\n\toverflow-x: hidden;\n}\n\n.post-options .post-option-contents {\n\tmargin-left: 3px;\n\tcolor: #32373c;\n}\n\n.post-option-forward:before {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 8px;\n\tmargin-top: -10px;\n\tcontent: \"\\f345\"\n}\n\n.post-option-back:before {\n\tcontent: \"\\f341\";\n}\n\n.lt-ie9 .options-panel,\n.lt-ie9 .post-options {\n\tborder-left: 1px solid #e5e5e5;\n}\n\n.lt-ie9 .post-options.is-off-screen {\n\tborder: 0;\n}\n\n.post-option {\n\tposition: relative;\n}\n\n.post-options .post-option {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 13px 37px 13px 14px;\n\tborder-bottom: 1px solid #e5e5e5;\n\ttext-decoration: none;\n\ttext-align: left;\n\tcolor: #9ea7af;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\t-webkit-transition: -webkit-transform .3s ease-in-out;\n\ttransition: -webkit-transform .3s ease-in-out;\n\ttransition: transform .3s ease-in-out;\n\ttransition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;\n}\n\n.post-options .post-option:focus {\n\toutline: 0;\n\t-webkit-box-shadow: inset 5px 0 0 #00a0d2;\n\tbox-shadow: inset 5px 0 0 #00a0d2;\n\tborder-color: #e5e5e5;\n}\n\n.is-off-screen > .post-option {\n\tright: 100%;\n}\n\n.is-hidden > .post-option {\n\tvisibility: hidden;\n}\n\n@media (min-width: 1px) {\n\t.is-off-screen > .post-option {\n\t\tright: auto;\n\t\t-webkit-transform: translateX(-100%);\n\t\t-ms-transform: translateX(-100%);\n\t\ttransform: translateX(-100%);\n\t}\n}\n\n.post-option-title {\n\tdisplay: inline-block;\n\tmargin: 0 0 0 8px;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.setting-modal {\n\tposition: relative;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\toverflow: hidden;\n\t-webkit-transition: -webkit-transform .3s ease-in-out;\n\ttransition: -webkit-transform .3s ease-in-out;\n\ttransition: transform .3s ease-in-out;\n\ttransition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out;\n}\n\n.setting-modal.is-hidden {\n\tvisibility: hidden;\n\theight: 0;\n}\n\n.setting-modal.is-off-screen {\n\tleft: 100%;\n}\n\n@media (min-width: 1px) {\n\t.setting-modal.is-off-screen {\n\t\tleft: 0;\n\t\t-webkit-transform: translateX(100%);\n\t\t-ms-transform: translateX(100%);\n\t\ttransform: translateX(100%);\n\t}\n}\n\n.press-this .modal-close {\n\tdisplay: block;\n\twidth: 100%;\n\tpadding: 13px 14px;\n\tborder-bottom: 1px solid #e5e5e5;\n\tcolor: #00a0d2;\n\ttext-decoration: none;\n\ttext-align: left;\n}\n\n.press-this .modal-close:focus {\n\toutline: 0;\n\t-webkit-box-shadow: inset 5px 0 0 #00a0d2;\n\tbox-shadow: inset 5px 0 0 #00a0d2;\n\tborder-color: #e5e5e5;\n}\n\n.setting-title {\n\tposition: relative;\n\ttop: -1px;\n\tmargin-left: 11px;\n}\n\n/* Text editor */\n#pressthis {\n\tcolor: #404040;\n\tresize: none;\n\tpadding-top: 30px;\n\tfont-size: 16px;\n}\n\n.wp-editor-wrap .quicktags-toolbar {\n\tbackground: transparent;\n\tborder: none;\n}\n\n/* Switch editor buttons */\n.wp-editor-wrap .wp-editor-tools {\n\tz-index: 0;\n}\n\n.wp-editor-wrap .wp-editor-tabs {\n\tpadding: 2px;\n}\n\n.wp-editor-wrap .wp-switch-editor {\n\ttop: 0;\n\tmargin: 3px 0 0 5px;\n\tpadding: 3px 8px;\n\tbackground: #f5f5f5;\n\tcolor: #555;\n\tborder-color: #ccc;\n}\n\n.wp-editor-wrap .wp-switch-editor:hover {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.wp-editor-wrap.tmce-active .switch-tmce,\n.wp-editor-wrap.html-active .switch-html {\n\tbackground: #fff;\n\tborder-color: #d8d8d8;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/revisions-rtl.css",
    "content": "/*------------------------------------------------------------------------------\n  11.2 - Post Revisions\n------------------------------------------------------------------------------*/\n.revisions-control-frame,\n.revisions-diff-frame {\n\tposition: relative;\n}\n\n.revisions-controls {\n\tpadding-top: 40px;\n\theight: 100px;\n\tz-index: 1;\n}\n\n.revisions-controls input[type=\"checkbox\"] {\n\tposition: relative;\n\ttop: -1px;\n\tvertical-align: text-bottom;\n}\n\n.revisions.pinned .revisions-controls {\n\tposition: fixed;\n\ttop: 0;\n\theight: 82px;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n}\n\n.revisions-tickmarks {\n\tposition: relative;\n\tmargin: 0 auto;\n\theight: 0.7em;\n\ttop: 7px;\n\tmax-width: 70%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tbackground-color: #fff;\n}\n\n.revisions-tickmarks > div {\n\tposition: absolute;\n\theight: 100%;\n\tborder-right: 1px solid #a0a5aa;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.revisions-tickmarks > div:first-child {\n\tborder-width: 0;\n}\n\n.comparing-two-revisions .revisions-controls {\n\theight: 140px;\n}\n\n.comparing-two-revisions.pinned .revisions-controls {\n\theight: 124px;\n}\n\n.revisions .diff-error {\n\tposition: absolute;\n\ttext-align: center;\n\tmargin: 0 auto;\n\twidth: 100%;\n\tdisplay: none;\n}\n\n.revisions.diff-error .diff-error {\n\tdisplay: block;\n}\n\n.revisions .loading-indicator {\n\tposition: absolute;\n\tvertical-align: middle;\n\topacity: 0;\n\twidth: 100%;\n\twidth: -webkit-calc( 100% - 30px );\n\twidth: calc( 100% - 30px );\n\ttop: 50%;\n\ttop: -webkit-calc( 50% - 10px );\n\ttop: calc( 50% - 10px );\n\t-webkit-transition: opacity 0.5s;\n\ttransition: opacity 0.5s;\n\tfilter: alpha(opacity=0); /* ie8 and earlier */\n}\n\nbody.folded .revisions .loading-indicator {\n\tmargin-right: -32px;\n}\n\n.revisions .loading-indicator span.spinner {\n\tdisplay: block;\n\tmargin: 0 auto;\n\tfloat: none;\n}\n\n.revisions.loading .loading-indicator {\n\topacity: 1;\n\tfilter: alpha(opacity=100); /* ie8 and earlier */\n}\n\n.revisions .diff {\n\t-webkit-transition: opacity 0.5s;\n\ttransition: opacity 0.5s;\n}\n\n.revisions.loading .diff {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50); /* ie8 and earlier */\n}\n\n.revisions.diff-error .diff {\n\tvisibility: hidden;\n}\n\n.revisions-meta {\n\tmargin-top: 20px;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n}\n\n.revisions.pinned .revisions-meta {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.revision-toggle-compare-mode {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.comparing-two-revisions .revisions-previous,\n.comparing-two-revisions .revisions-next,\n.revisions-meta .diff-meta-to strong {\n\tdisplay: none;\n}\n\n.revisions-controls .author-card .date {\n\tcolor: #777;\n}\n\n.revisions-controls .author-card.autosave {\n\tcolor: #d54e21;\n}\n\n.revisions-controls .author-card .author-name {\n\tfont-weight: bold;\n}\n\n.comparing-two-revisions .diff-meta-to strong {\n\tdisplay: block;\n}\n\n.revisions.pinned .revisions-buttons {\n\tpadding: 0 11px;\n}\n\n.revisions-previous,\n.revisions-next {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.revisions-previous {\n\tfloat: right;\n}\n\n.revisions-next {\n\tfloat: left;\n}\n\n.revisions-controls .wp-slider {\n\tmax-width: 70%;\n\tmargin: 0 auto;\n\ttop: -3px;\n}\n\n.revisions-diff {\n\tpadding: 15px;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n}\n\n.revisions-diff h3:first-child {\n\tmargin-top: 0;\n}\n\n/* Revision meta box */\n.post-revisions li img,\n#revisions-meta-restored img {\n\tvertical-align: middle;\n}\n\ntable.diff tbody tr td:nth-child(2) {\n\twidth: 4%;\n}\n\ntable.diff {\n\ttable-layout: fixed;\n\twidth: 100%;\n\twhite-space: pre-wrap;\n}\n\ntable.diff col.content {\n\twidth: auto;\n}\n\ntable.diff col.content.diffsplit {\n\twidth: 48%;\n}\n\ntable.diff col.diffsplit.middle {\n\twidth: auto;\n}\n\ntable.diff col.ltype {\n\twidth: 30px;\n}\n\ntable.diff tr {\n\tbackground-color: transparent;\n}\n\ntable.diff td,\ntable.diff th {\n\tfont-family: Consolas, Monaco, monospace;\n\tfont-size: 14px;\n\tline-height: 1.618;\n\tpadding: .5em;\n\tvertical-align: top;\n\tword-wrap: break-word;\n}\n\ntable.diff td h1,\ntable.diff td h2,\ntable.diff td h3,\ntable.diff td h4,\ntable.diff td h5,\ntable.diff td h6 {\n\tmargin: 0;\n}\n\ntable.diff .diff-deletedline del,\ntable.diff .diff-addedline ins {\n\ttext-decoration: none;\n}\n\ntable.diff .diff-deletedline {\n\tbackground-color: #ffe9e9;\n}\n\ntable.diff .diff-deletedline del {\n\tbackground-color: #faa;\n}\n\ntable.diff .diff-addedline {\n\tbackground-color: #e9ffe9;\n}\n\ntable.diff .diff-addedline ins {\n\tbackground-color: #afa;\n}\n\n.diff-meta {\n\tpadding: 5px;\n\tclear: both;\n\tmin-height: 32px;\n}\n\n.diff-title strong {\n\tline-height: 32px;\n\tmin-width: 60px;\n\ttext-align: left;\n\tfloat: right;\n\tmargin-left: 5px;\n}\n\n.revisions-controls .author-card .author-info {\n\tfont-size: 12px;\n\tline-height: 16px;\n}\n\n.revisions-controls .author-card .avatar,\n.revisions-controls .author-card .author-info {\n\tfloat: right;\n\tmargin-right: 6px;\n\tmargin-left: 6px;\n}\n\n.revisions-controls .author-card .byline {\n\tdisplay: block;\n\tfont-size: 12px;\n}\n\n.revisions-controls .author-card .avatar {\n\tvertical-align: middle;\n}\n\n.diff-meta input.restore-revision {\n\tfloat: left;\n\tmargin-right: 6px;\n\tmargin-left: 6px;\n\tmargin-top: 4px;\n}\n\n.diff-meta-from {\n\tdisplay: none;\n}\n\n.comparing-two-revisions .diff-meta-from {\n\tdisplay: block;\n}\n\n.revisions-tooltip {\n\tposition: absolute;\n\tbottom: 105px;\n\tmargin-left: 0;\n\tmargin-right: -69px;\n\tz-index: 0;\n\tmax-width: 350px;\n\tmin-width: 130px;\n\tpadding: 8px 4px;\n\tdisplay: none;\n\topacity: 0;\n}\n\n.revisions-tooltip.flipped {\n\tmargin-right: 0;\n\tmargin-left: -70px;\n}\n\n.revisions.pinned .revisions-tooltip {\n\tdisplay: none !important;\n}\n\n.comparing-two-revisions .revisions-tooltip {\n\tbottom: 145px;\n}\n\n.revisions-tooltip-arrow {\n\twidth: 70px;\n\theight: 15px;\n\toverflow: hidden;\n\tposition: absolute;\n\tright: 0;\n\tmargin-right: 35px;\n\tbottom: -15px;\n}\n\n.revisions-tooltip.flipped .revisions-tooltip-arrow {\n\tmargin-right: 0;\n\tmargin-left: 35px;\n\tright: auto;\n\tleft: 0;\n}\n\n.revisions-tooltip-arrow > span {\n\tcontent: \"\";\n\tposition: absolute;\n\tright: 20px;\n\ttop: -20px;\n\twidth: 25px;\n\theight: 25px;\n\t-webkit-transform: rotate(-45deg);\n\t-ms-transform: rotate(-45deg);\n\ttransform: rotate(-45deg);\n}\n\n.revisions-tooltip.flipped .revisions-tooltip-arrow > span {\n\tright: auto;\n\tleft: 20px;\n}\n\n.ie8 .revisions-tooltip-arrow > span {\n\tright: 15px;\n\ttop: -25px;\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)\";\n}\n\n.ie8 .revisions-tooltip.flipped .revisions-tooltip-arrow > span {\n\tleft: 25px;\n}\n\n.revisions-tooltip,\n.revisions-tooltip-arrow > span {\n\tborder: 1px solid #d7d7d7;\n\tbackground-color: #fff;\n}\n\n.revisions-tooltip {\n\tdisplay: none;\n}\n\n.arrow {\n\twidth: 70px;\n\theight: 16px;\n\toverflow: hidden;\n\tposition: absolute;\n\tright: 0;\n\tmargin-right: -35px;\n\tbottom: 90px;\n\tz-index: 10000;\n}\n\n.arrow:after {\n\tz-index: 9999;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n}\n\n.arrow.top {\n\ttop: -16px;\n\tbottom: auto;\n}\n\n.arrow.left {\n\tright: 20%;\n}\n\n.arrow:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tright: 20px;\n\ttop: -20px;\n\twidth: 25px;\n\theight: 25px;\n\t-webkit-transform: rotate(-45deg);\n\t-ms-transform: rotate(-45deg);\n\ttransform: rotate(-45deg);\n}\n\n.revisions-tooltip,\n.revisions-tooltip-arrow:after {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n\ndiv.revisions-controls > .wp-slider > .ui-slider-handle {\n\tmargin-right: -10px;\n}\n\n.rtl div.revisions-controls > .wp-slider > .ui-slider-handle {\n\tmargin-left: -10px;\n}\n\n/* jQuery UI Slider */\n.wp-slider.ui-slider {\n\tposition: relative;\n\tborder: 1px solid #d7d7d7;\n\ttext-align: right;\n\tcursor: pointer;\n}\n\n.wp-slider .ui-slider-handle {\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\theight: 18px;\n\tmargin-top: -5px;\n\toutline: none;\n\tpadding: 2px;\n\tposition: absolute;\n\twidth: 18px;\n\tz-index: 2;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n.wp-slider .ui-slider-handle,\n.wp-slider .ui-slider-handle.focus {\n\tbackground: #f7f7f7;\n\tborder: 1px solid #ccc;\n\t-webkit-box-shadow: 0 1px 0 #cccccc;\n\tbox-shadow: 0 1px 0 #cccccc;\n}\n\n.wp-slider .ui-slider-handle:hover,\n.wp-slider .ui-slider-handle.ui-state-hover {\n\tbackground: #fafafa;\n\tborder-color: #999;\n}\n\n.wp-slider .ui-slider-handle:active,\n.wp-slider .ui-slider-handle.ui-state-active {\n\tbackground: #eee;\n\tborder-color: #999;\n \t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n \tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n \t-webkit-transform: translateY(1px);\n \t-ms-transform: translateY(1px);\n \ttransform: translateY(1px);\n}\n\n\n.wp-slider .ui-slider-handle:before {\n\tbackground: none;\n\tposition: absolute;\n\ttop: 2px;\n\tright: 2px;\n\tcolor: #555;\n\tcontent: \"\\f229\";\n\tfont: normal 18px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.wp-slider .ui-slider-handle:hover:before,\n.wp-slider .ui-slider-handle.ui-state-hover:before {\n\tcolor: #23282d;\n}\n\n.wp-slider .ui-slider-handle.from-handle:before,\n.wp-slider .ui-slider-handle.to-handle:before {\n\tfont-size: 20px !important;\n\tmargin: -1px -1px 0 0;\n}\n\n.wp-slider .ui-slider-handle.from-handle:before {\n\tcontent: \"\\f141\";\n}\n\n.wp-slider .ui-slider-handle.to-handle:before {\n\tcontent: \"\\f139\";\n}\n\n.rtl .wp-slider .ui-slider-handle.from-handle:before {\n\tcontent: \"\\f139\";\n}\n\n.rtl .wp-slider .ui-slider-handle.to-handle:before {\n\tcontent: \"\\f141\";\n\tleft: -1px;\n}\n\n.wp-slider .ui-slider-range {\n\tposition: absolute;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-color: transparent;\n\tbackground-image: none;\n}\n\n.wp-slider.ui-slider-horizontal {\n\theight: .7em;\n}\n\n.wp-slider.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.25em;\n\tmargin-right: -.6em;\n}\n\n.wp-slider.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n\n.wp-slider.ui-slider-horizontal .ui-slider-range-min {\n\tright: 0;\n}\n\n.wp-slider.ui-slider-horizontal .ui-slider-range-max {\n\tleft: 0;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t.revision-tick.completed-false {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t#diff-next-revision,\n\t#diff-previous-revision {\n\t\tmargin-top: -1em;\n\t}\n\n\ttable.diff {\n\t\t-ms-word-break: break-all;\n\t\tword-break: break-all;\n\t\tword-wrap: break-word;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/revisions.css",
    "content": "/*------------------------------------------------------------------------------\n  11.2 - Post Revisions\n------------------------------------------------------------------------------*/\n.revisions-control-frame,\n.revisions-diff-frame {\n\tposition: relative;\n}\n\n.revisions-controls {\n\tpadding-top: 40px;\n\theight: 100px;\n\tz-index: 1;\n}\n\n.revisions-controls input[type=\"checkbox\"] {\n\tposition: relative;\n\ttop: -1px;\n\tvertical-align: text-bottom;\n}\n\n.revisions.pinned .revisions-controls {\n\tposition: fixed;\n\ttop: 0;\n\theight: 82px;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n}\n\n.revisions-tickmarks {\n\tposition: relative;\n\tmargin: 0 auto;\n\theight: 0.7em;\n\ttop: 7px;\n\tmax-width: 70%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tbackground-color: #fff;\n}\n\n.revisions-tickmarks > div {\n\tposition: absolute;\n\theight: 100%;\n\tborder-left: 1px solid #a0a5aa;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.revisions-tickmarks > div:first-child {\n\tborder-width: 0;\n}\n\n.comparing-two-revisions .revisions-controls {\n\theight: 140px;\n}\n\n.comparing-two-revisions.pinned .revisions-controls {\n\theight: 124px;\n}\n\n.revisions .diff-error {\n\tposition: absolute;\n\ttext-align: center;\n\tmargin: 0 auto;\n\twidth: 100%;\n\tdisplay: none;\n}\n\n.revisions.diff-error .diff-error {\n\tdisplay: block;\n}\n\n.revisions .loading-indicator {\n\tposition: absolute;\n\tvertical-align: middle;\n\topacity: 0;\n\twidth: 100%;\n\twidth: -webkit-calc( 100% - 30px );\n\twidth: calc( 100% - 30px );\n\ttop: 50%;\n\ttop: -webkit-calc( 50% - 10px );\n\ttop: calc( 50% - 10px );\n\t-webkit-transition: opacity 0.5s;\n\ttransition: opacity 0.5s;\n\tfilter: alpha(opacity=0); /* ie8 and earlier */\n}\n\nbody.folded .revisions .loading-indicator {\n\tmargin-left: -32px;\n}\n\n.revisions .loading-indicator span.spinner {\n\tdisplay: block;\n\tmargin: 0 auto;\n\tfloat: none;\n}\n\n.revisions.loading .loading-indicator {\n\topacity: 1;\n\tfilter: alpha(opacity=100); /* ie8 and earlier */\n}\n\n.revisions .diff {\n\t-webkit-transition: opacity 0.5s;\n\ttransition: opacity 0.5s;\n}\n\n.revisions.loading .diff {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50); /* ie8 and earlier */\n}\n\n.revisions.diff-error .diff {\n\tvisibility: hidden;\n}\n\n.revisions-meta {\n\tmargin-top: 20px;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n}\n\n.revisions.pinned .revisions-meta {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.revision-toggle-compare-mode {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n}\n\n.comparing-two-revisions .revisions-previous,\n.comparing-two-revisions .revisions-next,\n.revisions-meta .diff-meta-to strong {\n\tdisplay: none;\n}\n\n.revisions-controls .author-card .date {\n\tcolor: #777;\n}\n\n.revisions-controls .author-card.autosave {\n\tcolor: #d54e21;\n}\n\n.revisions-controls .author-card .author-name {\n\tfont-weight: bold;\n}\n\n.comparing-two-revisions .diff-meta-to strong {\n\tdisplay: block;\n}\n\n.revisions.pinned .revisions-buttons {\n\tpadding: 0 11px;\n}\n\n.revisions-previous,\n.revisions-next {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.revisions-previous {\n\tfloat: left;\n}\n\n.revisions-next {\n\tfloat: right;\n}\n\n.revisions-controls .wp-slider {\n\tmax-width: 70%;\n\tmargin: 0 auto;\n\ttop: -3px;\n}\n\n.revisions-diff {\n\tpadding: 15px;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n}\n\n.revisions-diff h3:first-child {\n\tmargin-top: 0;\n}\n\n/* Revision meta box */\n.post-revisions li img,\n#revisions-meta-restored img {\n\tvertical-align: middle;\n}\n\ntable.diff tbody tr td:nth-child(2) {\n\twidth: 4%;\n}\n\ntable.diff {\n\ttable-layout: fixed;\n\twidth: 100%;\n\twhite-space: pre-wrap;\n}\n\ntable.diff col.content {\n\twidth: auto;\n}\n\ntable.diff col.content.diffsplit {\n\twidth: 48%;\n}\n\ntable.diff col.diffsplit.middle {\n\twidth: auto;\n}\n\ntable.diff col.ltype {\n\twidth: 30px;\n}\n\ntable.diff tr {\n\tbackground-color: transparent;\n}\n\ntable.diff td,\ntable.diff th {\n\tfont-family: Consolas, Monaco, monospace;\n\tfont-size: 14px;\n\tline-height: 1.618;\n\tpadding: .5em;\n\tvertical-align: top;\n\tword-wrap: break-word;\n}\n\ntable.diff td h1,\ntable.diff td h2,\ntable.diff td h3,\ntable.diff td h4,\ntable.diff td h5,\ntable.diff td h6 {\n\tmargin: 0;\n}\n\ntable.diff .diff-deletedline del,\ntable.diff .diff-addedline ins {\n\ttext-decoration: none;\n}\n\ntable.diff .diff-deletedline {\n\tbackground-color: #ffe9e9;\n}\n\ntable.diff .diff-deletedline del {\n\tbackground-color: #faa;\n}\n\ntable.diff .diff-addedline {\n\tbackground-color: #e9ffe9;\n}\n\ntable.diff .diff-addedline ins {\n\tbackground-color: #afa;\n}\n\n.diff-meta {\n\tpadding: 5px;\n\tclear: both;\n\tmin-height: 32px;\n}\n\n.diff-title strong {\n\tline-height: 32px;\n\tmin-width: 60px;\n\ttext-align: right;\n\tfloat: left;\n\tmargin-right: 5px;\n}\n\n.revisions-controls .author-card .author-info {\n\tfont-size: 12px;\n\tline-height: 16px;\n}\n\n.revisions-controls .author-card .avatar,\n.revisions-controls .author-card .author-info {\n\tfloat: left;\n\tmargin-left: 6px;\n\tmargin-right: 6px;\n}\n\n.revisions-controls .author-card .byline {\n\tdisplay: block;\n\tfont-size: 12px;\n}\n\n.revisions-controls .author-card .avatar {\n\tvertical-align: middle;\n}\n\n.diff-meta input.restore-revision {\n\tfloat: right;\n\tmargin-left: 6px;\n\tmargin-right: 6px;\n\tmargin-top: 4px;\n}\n\n.diff-meta-from {\n\tdisplay: none;\n}\n\n.comparing-two-revisions .diff-meta-from {\n\tdisplay: block;\n}\n\n.revisions-tooltip {\n\tposition: absolute;\n\tbottom: 105px;\n\tmargin-right: 0;\n\tmargin-left: -69px;\n\tz-index: 0;\n\tmax-width: 350px;\n\tmin-width: 130px;\n\tpadding: 8px 4px;\n\tdisplay: none;\n\topacity: 0;\n}\n\n.revisions-tooltip.flipped {\n\tmargin-left: 0;\n\tmargin-right: -70px;\n}\n\n.revisions.pinned .revisions-tooltip {\n\tdisplay: none !important;\n}\n\n.comparing-two-revisions .revisions-tooltip {\n\tbottom: 145px;\n}\n\n.revisions-tooltip-arrow {\n\twidth: 70px;\n\theight: 15px;\n\toverflow: hidden;\n\tposition: absolute;\n\tleft: 0;\n\tmargin-left: 35px;\n\tbottom: -15px;\n}\n\n.revisions-tooltip.flipped .revisions-tooltip-arrow {\n\tmargin-left: 0;\n\tmargin-right: 35px;\n\tleft: auto;\n\tright: 0;\n}\n\n.revisions-tooltip-arrow > span {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: 20px;\n\ttop: -20px;\n\twidth: 25px;\n\theight: 25px;\n\t-webkit-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n}\n\n.revisions-tooltip.flipped .revisions-tooltip-arrow > span {\n\tleft: auto;\n\tright: 20px;\n}\n\n.ie8 .revisions-tooltip-arrow > span {\n\tleft: 15px;\n\ttop: -25px;\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)\";\n}\n\n.ie8 .revisions-tooltip.flipped .revisions-tooltip-arrow > span {\n\tright: 25px;\n}\n\n.revisions-tooltip,\n.revisions-tooltip-arrow > span {\n\tborder: 1px solid #d7d7d7;\n\tbackground-color: #fff;\n}\n\n.revisions-tooltip {\n\tdisplay: none;\n}\n\n.arrow {\n\twidth: 70px;\n\theight: 16px;\n\toverflow: hidden;\n\tposition: absolute;\n\tleft: 0;\n\tmargin-left: -35px;\n\tbottom: 90px;\n\tz-index: 10000;\n}\n\n.arrow:after {\n\tz-index: 9999;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.1);\n}\n\n.arrow.top {\n\ttop: -16px;\n\tbottom: auto;\n}\n\n.arrow.left {\n\tleft: 20%;\n}\n\n.arrow:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tleft: 20px;\n\ttop: -20px;\n\twidth: 25px;\n\theight: 25px;\n\t-webkit-transform: rotate(45deg);\n\t-ms-transform: rotate(45deg);\n\ttransform: rotate(45deg);\n}\n\n.revisions-tooltip,\n.revisions-tooltip-arrow:after {\n\tborder-width: 1px;\n\tborder-style: solid;\n}\n\ndiv.revisions-controls > .wp-slider > .ui-slider-handle {\n\tmargin-left: -10px;\n}\n\n.rtl div.revisions-controls > .wp-slider > .ui-slider-handle {\n\tmargin-right: -10px;\n}\n\n/* jQuery UI Slider */\n.wp-slider.ui-slider {\n\tposition: relative;\n\tborder: 1px solid #d7d7d7;\n\ttext-align: left;\n\tcursor: pointer;\n}\n\n.wp-slider .ui-slider-handle {\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\theight: 18px;\n\tmargin-top: -5px;\n\toutline: none;\n\tpadding: 2px;\n\tposition: absolute;\n\twidth: 18px;\n\tz-index: 2;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n.wp-slider .ui-slider-handle,\n.wp-slider .ui-slider-handle.focus {\n\tbackground: #f7f7f7;\n\tborder: 1px solid #ccc;\n\t-webkit-box-shadow: 0 1px 0 #cccccc;\n\tbox-shadow: 0 1px 0 #cccccc;\n}\n\n.wp-slider .ui-slider-handle:hover,\n.wp-slider .ui-slider-handle.ui-state-hover {\n\tbackground: #fafafa;\n\tborder-color: #999;\n}\n\n.wp-slider .ui-slider-handle:active,\n.wp-slider .ui-slider-handle.ui-state-active {\n\tbackground: #eee;\n\tborder-color: #999;\n \t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n \tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n \t-webkit-transform: translateY(1px);\n \t-ms-transform: translateY(1px);\n \ttransform: translateY(1px);\n}\n\n\n.wp-slider .ui-slider-handle:before {\n\tbackground: none;\n\tposition: absolute;\n\ttop: 2px;\n\tleft: 2px;\n\tcolor: #555;\n\tcontent: \"\\f229\";\n\tfont: normal 18px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.wp-slider .ui-slider-handle:hover:before,\n.wp-slider .ui-slider-handle.ui-state-hover:before {\n\tcolor: #23282d;\n}\n\n.wp-slider .ui-slider-handle.from-handle:before,\n.wp-slider .ui-slider-handle.to-handle:before {\n\tfont-size: 20px !important;\n\tmargin: -1px 0 0 -1px;\n}\n\n.wp-slider .ui-slider-handle.from-handle:before {\n\tcontent: \"\\f139\";\n}\n\n.wp-slider .ui-slider-handle.to-handle:before {\n\tcontent: \"\\f141\";\n}\n\n.rtl .wp-slider .ui-slider-handle.from-handle:before {\n\tcontent: \"\\f141\";\n}\n\n.rtl .wp-slider .ui-slider-handle.to-handle:before {\n\tcontent: \"\\f139\";\n\tright: -1px;\n}\n\n.wp-slider .ui-slider-range {\n\tposition: absolute;\n\tfont-size: .7em;\n\tdisplay: block;\n\tborder: 0;\n\tbackground-color: transparent;\n\tbackground-image: none;\n}\n\n.wp-slider.ui-slider-horizontal {\n\theight: .7em;\n}\n\n.wp-slider.ui-slider-horizontal .ui-slider-handle {\n\ttop: -.25em;\n\tmargin-left: -.6em;\n}\n\n.wp-slider.ui-slider-horizontal .ui-slider-range {\n\ttop: 0;\n\theight: 100%;\n}\n\n.wp-slider.ui-slider-horizontal .ui-slider-range-min {\n\tleft: 0;\n}\n\n.wp-slider.ui-slider-horizontal .ui-slider-range-max {\n\tright: 0;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t.revision-tick.completed-false {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t#diff-next-revision,\n\t#diff-previous-revision {\n\t\tmargin-top: -1em;\n\t}\n\n\ttable.diff {\n\t\t-ms-word-break: break-all;\n\t\tword-break: break-all;\n\t\tword-wrap: break-word;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/site-icon-rtl.css",
    "content": "/*------------------------------------------------------------------------------\n  28.0 - Site Icon\n------------------------------------------------------------------------------*/\n\n.site-icon-preview .favicon-preview {\n\tmargin: 5px 0 20px;\n\toverflow: hidden;\n\tposition: relative;\n\tmax-width: 180px;\n}\n\n.site-icon-preview .favicon,\n.site-icon-preview .browser-title {\n\theight: 16px;\n\tright: 88px;\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 16px;\n}\n\n.site-icon-preview .favicon {\n\twidth: 16px;\n}\n\n.site-icon-preview .browser-title {\n\tright: 109px;\n}\n\n.site-icon-preview .app-icon-preview {\n\tbackground-color: #000;\n\t-webkit-border-radius: 16px;\n\tborder-radius: 16px;\n\theight: 64px;\n\toverflow: hidden;\n\twidth: 64px;\n\tmargin-top: 5px;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/site-icon.css",
    "content": "/*------------------------------------------------------------------------------\n  28.0 - Site Icon\n------------------------------------------------------------------------------*/\n\n.site-icon-preview .favicon-preview {\n\tmargin: 5px 0 20px;\n\toverflow: hidden;\n\tposition: relative;\n\tmax-width: 180px;\n}\n\n.site-icon-preview .favicon,\n.site-icon-preview .browser-title {\n\theight: 16px;\n\tleft: 88px;\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 16px;\n}\n\n.site-icon-preview .favicon {\n\twidth: 16px;\n}\n\n.site-icon-preview .browser-title {\n\tleft: 109px;\n}\n\n.site-icon-preview .app-icon-preview {\n\tbackground-color: #000;\n\t-webkit-border-radius: 16px;\n\tborder-radius: 16px;\n\theight: 64px;\n\toverflow: hidden;\n\twidth: 64px;\n\tmargin-top: 5px;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/themes-rtl.css",
    "content": "/*------------------------------------------------------------------------------\n  16.0 - Themes\n------------------------------------------------------------------------------*/\n\n\n/*------------------------------------------------------------------------------\n  16.1 - Manage Themes\n------------------------------------------------------------------------------*/\n\n.theme-browser .themes {\n\tclear: both;\n\tpadding: 0 0 100px;\n}\n\n.themes-php .wrap h1 {\n\tfloat: right;\n\tmargin-bottom: 15px;\n}\n\n.network-admin.themes-php .wrap h1 {\n\tmargin-bottom: 0;\n}\n\n.themes-php .wrap h1 .button {\n\tmargin-right: 20px;\n}\n\n/* Search form */\n.themes-php .wp-filter-search {\n\tposition: relative;\n\ttop: -2px;\n\tright: 20px;\n\tmargin: 0;\n\twidth: 280px;\n\tfont-size: 16px;\n\tfont-weight: 300;\n\tline-height: 1.5;\n}\n\n/* Position admin messages */\n.themes-php div.updated,\n.themes-php div.error,\n.themes-php div.notice {\n\tmargin: 0 0 20px 0;\n\tclear: both;\n}\n\n.themes-php div.updated a {\n\ttext-decoration: underline;\n}\n\n/**\n * Main theme element\n * (has flexible margins)\n */\n.theme-browser .theme {\n\tcursor: pointer;\n\tfloat: right;\n\tmargin: 0 0 4% 4%;\n\tposition: relative;\n\twidth: 30.6%;\n\tborder: 1px solid #dedede;\n\t-webkit-box-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.ie8 .theme-browser .theme {\n\twidth: 30%;\n\tmargin: 0 0 4% 3%;\n}\n\n.theme-browser .theme:nth-child(3n) {\n\tmargin-left: 0;\n}\n\n.theme-browser .theme:hover,\n.theme-browser .theme:focus {\n\tcursor: pointer;\n}\n\n.theme-browser .theme .theme-name {\n\tfont-size: 15px;\n\tfont-weight: 600;\n\theight: 18px;\n\tmargin: 0;\n\tpadding: 15px;\n\t-webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: inset 0 1px 0 rgba(0,0,0,0.1);\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\tbackground: #fff;\n\tbackground: rgba(255,255,255,0.65);\n}\n\n/* Activate and Customize buttons, shown on hover and focus */\n.theme-browser .theme .theme-actions {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n\topacity: 0;\n\t-webkit-transition: opacity 0.1s ease-in-out;\n\ttransition: opacity 0.1s ease-in-out;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\theight: 38px;\n\tpadding: 9px 10px 0 10px;\n\tbackground: rgba(244, 244, 244, 0.7);\n\tborder-right: 1px solid rgba(0,0,0,0.05);\n}\n\n.theme-browser .theme:hover .theme-actions,\n.theme-browser .theme.focus .theme-actions,\n.theme-browser .theme:focus .theme-actions {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n\topacity: 1;\n}\n\n.theme-browser .theme .theme-actions .button-primary {\n\tmargin-left: 3px;\n}\n\n.theme-browser .theme .theme-actions .button-secondary {\n\tfloat: none;\n\tmargin-right: 3px;\n}\n\n/**\n * Theme Screenshot\n *\n * Has a fixed aspect ratio of 1.5 to 1 regardless of screenshot size\n * It is also responsive.\n */\n.theme-browser .theme .theme-screenshot {\n\tdisplay: block;\n\toverflow: hidden;\n\tposition: relative;\n\t-webkit-transition: opacity 0.2s ease-in-out;\n\ttransition: opacity 0.2s ease-in-out;\n}\n\n.theme-browser .theme .theme-screenshot:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tpadding-top: 66.66666%; /* using a 3/2 aspect ratio */\n}\n\n.theme-browser .theme .theme-screenshot img {\n\theight: auto;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\twidth: 100%;\n\t-webkit-transition: opacity 0.2s ease-in-out;\n\ttransition: opacity 0.2s ease-in-out;\n}\n\n.theme-browser .theme:hover .theme-screenshot,\n.theme-browser .theme:focus .theme-screenshot {\n\tbackground: #fff;\n}\n\n.theme-browser.rendered .theme:hover .theme-screenshot img,\n.theme-browser.rendered .theme:focus .theme-screenshot img {\n\topacity: 0.4;\n}\n\n.theme-browser .theme .more-details {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n\topacity: 0;\n\tposition: absolute;\n\ttop: 35%;\n\tleft: 25%;\n\tright: 25%;\n\tbackground: #23282d;\n\tbackground: rgba(0,0,0,0.7);\n\tcolor: #fff;\n\tfont-size: 15px;\n\ttext-shadow: 0 1px 0 rgba(0,0,0,0.6);\n\t-webkit-font-smoothing: antialiased;\n\tfont-weight: 600;\n\tpadding: 15px 12px;\n\ttext-align: center;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\t-webkit-transition: opacity 0.1s ease-in-out;\n\ttransition: opacity 0.1s ease-in-out;\n}\n\n.theme-browser .theme:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 2px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow: 0 0 2px rgba( 30, 140, 190, 0.8 );\n}\n\n.theme-browser .theme:focus .more-details {\n\topacity: 1;\n}\n\n/* Current theme needs to have its action always on view */\n.theme-browser .theme.active:focus .theme-actions {\n\tdisplay: block;\n}\n\n.theme-browser.rendered .theme:hover .more-details,\n.theme-browser.rendered .theme:focus .more-details {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n\topacity: 1;\n}\n\n/**\n * Displays a theme update notice\n * when an update is available.\n */\n.theme-browser .theme .theme-update,\n.theme-browser .theme .theme-installed {\n\tbackground: #d54e21;\n\tbackground: rgba(213, 78, 33, 0.95);\n\tcolor: #fff;\n\tdisplay: block;\n\tfont-size: 13px;\n\tfont-weight: 400;\n\theight: 48px;\n\tline-height: 48px;\n\tpadding: 0 10px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tborder-bottom: 1px solid rgba(0,0,0,0.25);\n\toverflow: hidden;\n}\n\n.theme-browser .theme .theme-update:before,\n.theme-browser .theme .theme-installed:before {\n\tcontent: \"\\f463\";\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tmargin: 0 0 0 6px;\n\topacity: 0.8;\n\tposition: relative;\n\ttop: 5px;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n}\n\n\n/**\n * The currently active theme\n */\n.theme-browser .theme.active .theme-name {\n\tbackground: #2f2f2f;\n\tcolor: #fff;\n\tpadding-left: 110px;\n\tfont-weight: 300;\n\t-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.5);\n\tbox-shadow: inset 0 1px 1px rgba(0,0,0,0.5);\n}\n\n.theme-browser .customize-control .theme.active .theme-name {\n\tpadding-left: 15px;\n}\n\n.theme-browser .theme.active .theme-name span {\n\tfont-weight: 600;\n}\n\n.theme-browser .theme.active .theme-actions {\n\tbackground: rgba(49,49,49,0.7);\n\tborder-right: none;\n\topacity: 1;\n}\n\n.theme-browser .theme.active .theme-actions .button-primary {\n\tmargin-left: 0;\n}\n\n.theme-browser .theme .theme-author {\n\tbackground: #23282d;\n\tcolor: #eee;\n\tdisplay: none;\n\tfont-size: 14px;\n\tmargin: 0 10px;\n\tpadding: 5px 10px;\n\tposition: absolute;\n\tbottom: 56px;\n}\n\n.theme-browser .theme.display-author .theme-author {\n\tdisplay: block;\n}\n\n.theme-browser .theme.display-author .theme-author a {\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n\n/**\n * Add new theme\n */\n.theme-browser .theme.add-new-theme {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.theme-browser .theme.add-new-theme a {\n\tcolor: #999;\n\ttext-decoration: none;\n\tdisplay: block;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.theme-browser .theme.add-new-theme a:after {\n\tdisplay: block;\n\tcontent: \"\";\n\tbackground: transparent;\n\tbackground: rgba(0, 0, 0, 0);\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tpadding: 0;\n\ttext-shadow: none;\n\tborder: 5px dashed #d5d2ca;\n\tborder: 5px dashed rgba(0, 0, 0, 0.1);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.theme-browser .theme.add-new-theme span:after {\n\tbackground: #e5e5e5;\n\tbackground: rgba(153, 153, 153, 0.1);\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tdisplay: inline-block;\n\tcontent: \"\\f132\";\n\t-webkit-font-smoothing: antialiased;\n\tfont: normal 74px/115px dashicons;\n\twidth: 100px;\n\theight: 100px;\n\tvertical-align: middle;\n\ttext-align: center;\n\tcolor: rgb(153, 153, 153);\n\tposition: absolute;\n\ttop: 30%;\n\tright: 50%;\n\tmargin-right: -50px;\n\ttext-indent: -4px;\n\tpadding: 0;\n\ttext-shadow: none;\n\tz-index:4;\n}\n\n.rtl .theme-browser .theme.add-new-theme span:after {\n\ttext-indent: 4px;\n}\n\n.theme-browser .theme.add-new-theme a:hover .theme-screenshot,\n.theme-browser .theme.add-new-theme a:focus .theme-screenshot {\n\tbackground: none;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n\tbackground: #fff;\n\tcolor: #0073aa;\n}\n\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n\tborder-color: transparent;\n\tcolor: #fff;\n\tbackground: #0073aa;\n\tcontent: \"\";\n}\n\n.theme-browser .theme.add-new-theme .theme-name {\n\tbackground: none;\n\ttext-align: center;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tfont-weight: 400;\n\tposition: relative;\n\ttop: 0;\n\tmargin-top: -18px;\n\tpadding-top: 0;\n\tpadding-bottom: 48px;\n}\n\n.theme-browser .theme.add-new-theme a:hover .theme-name,\n.theme-browser .theme.add-new-theme a:focus .theme-name {\n\tcolor: #fff;\n\tz-index: 2;\n}\n\n/**\n * Theme Overlay\n * Shown when clicking a theme\n */\n.theme-overlay .theme-backdrop {\n\tposition: absolute;\n\tright: -20px;\n\tleft: 0;\n\ttop: 0;\n\tbottom: 0;\n\tbackground: #f1f1f1;\n\tbackground: rgba( 238, 238, 238, 0.9 );\n\tz-index: 10000; /* Over WP Pointers. */\n}\n\n.theme-overlay .theme-header {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\theight: 48px;\n\tborder-bottom: 1px solid #ddd;\n}\n\n.theme-overlay .theme-header button {\n\tpadding: 0;\n}\n\n.theme-overlay .theme-header .close {\n\tcursor: pointer;\n\theight: 48px;\n\twidth: 50px;\n\ttext-align: center;\n\tfloat: left;\n\tborder: 0;\n\tborder-right: 1px solid #ddd;\n\tbackground-color: transparent;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.theme-overlay .theme-header .close:before {\n\tfont: normal 22px/50px dashicons !important;\n\tcolor: #777;\n\tdisplay: inline-block;\n\tcontent: \"\\f335\";\n\tfont-weight: 300;\n}\n\n/* Left and right navigation */\n.theme-overlay .theme-header .right,\n.theme-overlay .theme-header .left {\n\tcursor: pointer;\n\tcolor: #777;\n\tbackground-color: transparent;\n\theight: 48px;\n\twidth: 54px;\n\tfloat: right;\n\ttext-align: center;\n\tborder: 0;\n\tborder-left: 1px solid #ddd;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.theme-overlay .theme-header .close:focus,\n.theme-overlay .theme-header .close:hover,\n.theme-overlay .theme-header .right:focus,\n.theme-overlay .theme-header .right:hover,\n.theme-overlay .theme-header .left:focus,\n.theme-overlay .theme-header .left:hover {\n\tbackground: #ddd;\n\tborder-color: #ccc;\n\tcolor: #000;\n}\n\n.theme-overlay .theme-header .close:focus:before,\n.theme-overlay .theme-header .close:hover:before {\n\tcolor: #000;\n}\n\n.theme-overlay .theme-header .close:focus,\n.theme-overlay .theme-header .right:focus,\n.theme-overlay .theme-header .left:focus {\n    -webkit-box-shadow: none;\n    box-shadow: none;\n    outline: none;\n}\n\n.theme-overlay .theme-header .left.disabled,\n.theme-overlay .theme-header .right.disabled,\n.theme-overlay .theme-header .left.disabled:hover,\n.theme-overlay .theme-header .right.disabled:hover {\n\tcolor: #ccc;\n\tbackground: inherit;\n\tcursor: inherit;\n}\n\n.theme-overlay .theme-header .right:before,\n.theme-overlay .theme-header .left:before {\n\tfont: normal 20px/50px dashicons !important;\n\tdisplay: inline;\n\tfont-weight: 300;\n}\n\n.theme-overlay .theme-header .left:before {\n\tcontent: \"\\f345\";\n}\n\n.theme-overlay .theme-header .right:before {\n\tcontent: \"\\f341\";\n}\n\n.theme-overlay .theme-wrap {\n\tclear: both;\n\tposition: fixed;\n\ttop: 9%;\n\tright: 190px;\n\tleft: 30px;\n\tbottom: 3%;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 1px 20px 5px rgba(0, 0, 0, 0.1);\n\tbox-shadow: 0 1px 20px 5px rgba(0, 0, 0, 0.1);\n\tz-index: 10000; /* Over WP Pointers. */\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-overflow-scrolling: touch;\n}\n\n.theme-overlay .theme-wrap:after {\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tclear: both;\n\tvisibility: hidden;\n}\n\nbody.folded .theme-overlay .theme-wrap {\n\tright: 70px;\n}\n\n.theme-overlay .theme-about {\n\tposition: absolute;\n\ttop: 49px;\n\tbottom: 57px;\n\tright: 0;\n\tleft: 0;\n\toverflow: auto;\n\tpadding: 2% 4%;\n}\n.theme-overlay .theme-about:after {\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tclear: both;\n\tvisibility: hidden;\n}\n\n.theme-overlay .theme-actions {\n\tposition: absolute;\n\ttext-align: center;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\tpadding: 10px 25px 5px;\n\tbackground: #f3f3f3;\n\tz-index: 30;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-top: 1px solid #eee;\n}\n\n.ie8 .theme-overlay .theme-actions {\n\tborder: 1px solid #eee;\n}\n\n.theme-overlay .theme-actions a {\n\tmargin-left: 5px;\n\tmargin-bottom: 5px;\n}\n\n/* Hide-if-customize for items we can't add classes to */\n.customize-support .theme-overlay .theme-actions a[href=\"themes.php?page=custom-header\"],\n.customize-support .theme-overlay .theme-actions a[href=\"themes.php?page=custom-background\"] {\n\tdisplay: none;\n}\n\n.broken-themes a.delete-theme,\n.theme-overlay .theme-actions .delete-theme {\n\tcolor: #a00;\n\ttext-decoration: none;\n\tborder-color: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: transparent;\n}\n\n.theme-overlay .theme-actions .delete-theme {\n\tposition: absolute;\n\tleft: 10px;\n\tbottom: 5px;\n}\n\n.broken-themes a.delete-theme:hover,\n.broken-themes a.delete-theme:focus,\n.theme-overlay .theme-actions .delete-theme:hover,\n.theme-overlay .theme-actions .delete-theme:focus {\n\tbackground: #d54e21;\n\tcolor: #fff;\n\tborder-color: #d54e21;\n}\n\n.theme-overlay .theme-actions .active-theme,\n.theme-overlay.active .theme-actions .inactive-theme {\n\tdisplay: none;\n}\n\n.theme-overlay .theme-actions .inactive-theme,\n.theme-overlay.active .theme-actions .active-theme {\n\tdisplay: block;\n}\n\n/**\n * Theme Screenshots gallery\n */\n.theme-overlay .theme-screenshots {\n\tfloat: right;\n\tmargin: 0 0 0 30px;\n\twidth: 55%;\n\tmax-width: 880px;\n\ttext-align: center;\n}\n\n/* First screenshot, shown big */\n.theme-overlay .screenshot {\n\tborder: 1px solid #fff;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\toverflow: hidden;\n\tposition: relative;\n\t-webkit-box-shadow: 0 0 0 1px rgba(0,0,0,0.2);\n\tbox-shadow: 0 0 0 1px rgba(0,0,0,0.2);\n}\n\n.theme-overlay .screenshot:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tpadding-top: 75%; /* using a 4/3 aspect ratio */\n}\n\n.theme-overlay .screenshot img {\n\theight: auto;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\twidth: 100%;\n}\n/* Handles old 300px screenshots */\n.theme-overlay.small-screenshot .theme-screenshots {\n\tposition: absolute;\n\twidth: 302px;\n}\n.theme-overlay.small-screenshot .theme-info {\n\tmargin-right: 350px;\n\twidth: auto;\n}\n\n/* Other screenshots, shown small and square */\n.theme-overlay .screenshot.thumb {\n\tbackground: #ccc;\n\tborder: 1px solid #eee;\n\tfloat: none;\n\tdisplay: inline-block;\n\tmargin: 10px 5px 0;\n\twidth: 140px;\n\theight: 80px;\n\tcursor: pointer;\n}\n\n.theme-overlay .screenshot.thumb:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tpadding-top: 100%; /* using a 1/1 aspect ratio */\n}\n\n.theme-overlay .screenshot.thumb img {\n\tcursor: pointer;\n\theight: auto;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: auto;\n}\n\n.theme-overlay .screenshot.selected {\n\tbackground: transparent;\n\tborder: 2px solid #00a0d2;\n}\n\n.theme-overlay .screenshot.selected img {\n\topacity: 0.8;\n}\n\n/* No screenshot placeholder */\n.theme-browser .theme .theme-screenshot.blank,\n.theme-overlay .screenshot.blank {\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=);\n}\n\n/**\n * Theme heading information\n */\n.theme-overlay .theme-info {\n\twidth: 40%;\n\tfloat: right;\n}\n\n.theme-overlay .current-label {\n\tbackground: #32373c;\n\tcolor: #fff;\n\tfont-size: 11px;\n\tdisplay: inline-block;\n\tpadding: 2px 8px;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\tmargin: 0 0 -10px;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.theme-overlay .theme-name {\n\tcolor: #23282d;\n\tfont-size: 32px;\n\tfont-weight: 100;\n\tmargin: 10px 0 0;\n\tline-height: 1.3;\n}\n\n.theme-overlay .theme-version {\n\tcolor: #999;\n\tfont-size: 13px;\n\tfont-weight: 400;\n\tfloat: none;\n\tdisplay: inline-block;\n\tmargin-right: 10px;\n}\n\n.theme-overlay .theme-author {\n\tmargin: 15px 0 25px;\n\tcolor: #686868;\n\tfont-size: 16px;\n\tfont-weight: 400;\n\tline-height: inherit;\n}\n\n.theme-overlay .theme-author a {\n\ttext-decoration: none;\n}\n\n.theme-overlay .theme-description {\n\tcolor: #555;\n\tfont-size: 15px;\n\tfont-weight: 400;\n\tline-height: 1.5;\n\tmargin: 30px 0 0 0;\n}\n\n.theme-overlay .theme-tags {\n\tborder-top: 3px solid #eee;\n\tcolor: #82878c;\n\tfont-size: 13px;\n\tfont-weight: 400;\n\tmargin: 30px 0 0 0;\n\tpadding-top: 20px;\n}\n\n.theme-overlay .theme-tags span {\n\tcolor: #444;\n\tfont-weight: bold;\n\tmargin-left: 5px;\n}\n\n.theme-overlay .parent-theme {\n\tbackground: #f7fcfe;\n\tborder: 1px solid #eee;\n\tborder-right: 4px solid #00a0d2;\n\tfont-size: 14px;\n\tfont-weight: normal;\n\tmargin-top: 30px;\n\tpadding: 10px 20px 10px 10px;\n}\n\n.theme-overlay .parent-theme strong {\n\tfont-weight: 700;\n}\n\n/**\n * Single Theme Mode\n * Displays detailed view inline when a user has no switch capabilities\n */\n.single-theme .theme-overlay .theme-backdrop,\n.single-theme .theme-overlay .theme-header,\n.single-theme .theme {\n\tdisplay: none;\n}\n\n.single-theme .theme-overlay .theme-wrap {\n\tclear: both;\n\tmin-height: 330px;\n\tposition: relative;\n\tright: auto;\n\tleft: auto;\n\ttop: auto;\n\tbottom: auto;\n\tz-index: 10;\n}\n\n.single-theme .theme-overlay .theme-about {\n\tpadding: 30px 30px 70px;\n\tposition: static;\n}\n\n.single-theme .theme-overlay .theme-actions {\n\tposition: absolute;\n}\n\n/**\n * Basic Responsive structure...\n *\n * Shuffles theme columns around based on screen width\n */\n\n@media only screen and (min-width: 2000px) {\n\t#wpwrap .theme-browser .theme {\n\t\twidth: 17.6%;\n\t\tmargin: 0 0 3% 3%;\n\t}\n\n\t#wpwrap .theme-browser .theme:nth-child(3n),\n\t#wpwrap .theme-browser .theme:nth-child(4n) {\n\t\tmargin-left: 3%;\n\t}\n\n\t#wpwrap .theme-browser .theme:nth-child(5n) {\n\t\tmargin-left: 0;\n\t}\n}\n\n@media only screen and (min-width: 1680px) {\n\t.theme-overlay .theme-wrap {\n\t\twidth: 1450px;\n\t\tmargin: 0 auto;\n\t}\n}\n\n/* Maximum screenshot width reaches 440px */\n@media only screen and (min-width: 1640px) {\n\t.theme-browser .theme {\n\t\twidth: 22.7%;\n\t\tmargin: 0 0 3% 3%;\n\t}\n\t.theme-browser .theme .theme-screenshot:after {\n\t\tpadding-top: 75%; /* using a 4/3 aspect ratio */\n\t}\n\n\t.theme-browser .theme:nth-child(3n) {\n\t\tmargin-left: 3%;\n\t}\n\n\t.theme-browser .theme:nth-child(4n) {\n\t\tmargin-left: 0;\n\t}\n}\n/* Maximum screenshot width reaches 440px */\n@media only screen and (max-width: 1120px) {\n\t.theme-browser .theme {\n\t\twidth: 47.5%;\n\t\tmargin-left: 0;\n\t}\n\n\t.theme-browser .theme:nth-child(even) {\n\t\tmargin-left: 0;\n\t}\n\n\t.theme-browser .theme:nth-child(odd) {\n\t\tmargin-left: 5%;\n\t}\n}\n\n/* Admin menu is folded */\n@media only screen and (max-width: 900px) {\n\t.theme-overlay .theme-wrap {\n\t\tright: 65px;\n\t}\n}\n\n@media only screen and (max-width: 780px) {\n\tbody.folded .theme-overlay .theme-wrap,\n\t.theme-overlay .theme-wrap {\n\t\ttop: 0; /* The adminmenu isn't fixed on mobile, so this can use the full viewport height */\n\t\tleft: 0;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\tpadding: 70px 20px 20px;\n\t\tborder: none;\n\t\tz-index: 100000; /* should overlap #wpadminbar. */\n\t\tposition: fixed;\n\t}\n\n\t.theme-browser .theme.active .theme-name span {\n\t\t/* Hide the \"Active: \" label on smaller screens. */\n\t\tdisplay: none;\n\t}\n\n\t.theme-overlay .theme-screenshots {\n\t\twidth: 40%;\n\t}\n\n\t.theme-overlay .theme-info {\n\t\twidth: 50%;\n\t}\n\t.single-theme .theme-wrap {\n\t\tpadding: 10px;\n\t}\n\n\t.theme-browser .theme .theme-actions {\n\t\tpadding: 5px 10px 4px 10px;\n\t}\n\n\t.theme-overlay.small-screenshot .theme-screenshots {\n\t\tposition: static;\n\t\tfloat: none;\n\t\tmax-width: 302px;\n\t}\n\n\t.theme-overlay.small-screenshot .theme-info {\n\t\tmargin-right: 0;\n\t\twidth: auto;\n\t}\n\n\t.theme:not(.active):hover .theme-actions,\n\t.theme:not(.active):focus .theme-actions,\n\t.theme:hover .more-details,\n\t.theme:focus .more-details {\n\t\tdisplay: none;\n\t}\n\n\t.theme-browser.rendered .theme:hover .theme-screenshot img,\n\t.theme-browser.rendered .theme:focus .theme-screenshot img {\n\t\topacity: 1.0;\n\t}\n}\n\n@media only screen and (max-width: 480px) {\n\t.theme-browser .theme {\n\t\twidth: 100%;\n\t\tmargin-left: 0;\n\t}\n\n\t.theme-browser .theme:nth-child(2n),\n\t.theme-browser .theme:nth-child(3n) {\n\t\tmargin-left: 0;\n\t}\n}\n\n@media only screen and (max-width: 650px) {\n\t.theme-overlay .theme-update,\n\t.theme-overlay .theme-description {\n\t\tmargin-right: 0;\n\t}\n\n\t.theme-overlay .theme-actions .delete-theme {\n\t\tposition: relative;\n\t\tleft: auto;\n\t\tbottom: auto;\n\t}\n\n\t.theme-overlay .theme-actions .inactive-theme {\n\t\tdisplay: inline;\n\t}\n\n\t.theme-overlay .theme-screenshots {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t}\n\n\t.theme-overlay .theme-info {\n\t\twidth: 100%;\n\t}\n\n\t.theme-overlay .theme-author {\n\t\tmargin: 5px 0 15px 0;\n\t}\n\n\t.theme-overlay .current-label {\n\t\tmargin-top: 10px;\n\t\tfont-size: 13px;\n\t}\n\n\t.themes-php .wp-filter-search {\n\t\tfloat: none;\n\t\tclear: both;\n\t\tright: 0;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tmargin: 10px 0;\n\t\twidth: 100%;\n\t\tmax-width: 280px;\n\t}\n\n\t.theme-browser .theme.add-new-theme span:after {\n\t\tfont: normal 60px/90px dashicons;\n\t\twidth: 80px;\n\t\theight: 80px;\n\t\ttop: 30%;\n\t\tright: 50%;\n\t\ttext-indent: 0;\n\t\tmargin-right: -40px;\n\t}\n\n\t.single-theme .theme-wrap {\n\t\tmargin: 0 -10px 0 -12px;\n\t\tpadding: 10px;\n\t}\n\t.single-theme .theme-overlay .theme-about {\n\t\tpadding: 10px;\n\t\toverflow: visible;\n\t}\n\t.single-theme .current-label {\n\t\tdisplay: none;\n\t}\n\t.single-theme .theme-overlay .theme-actions {\n\t\tposition: static;\n\t}\n}\n\n.broken-themes {\n\tclear: both;\n}\n\n.broken-themes table {\n\ttext-align: right;\n\twidth: 50%;\n\tborder-spacing: 3px;\n\tpadding: 3px;\n}\n\n\n/*------------------------------------------------------------------------------\n  16.2 - Install Themes\n------------------------------------------------------------------------------*/\n\n/* Already installed theme */\n.theme-browser .theme .theme-installed {\n\tbackground: #0073aa;\n}\n.theme-browser .theme .theme-installed:before {\n\tcontent: \"\\f147\";\n}\n.theme-browser .theme.is-installed .theme-actions .button-primary {\n\tdisplay: none !important;\n}\n\n.theme-install-php .wp-filter {\n\tpadding: 0 20px;\n}\n\n.theme-install-php a.upload,\n.theme-install-php a.browse-themes {\n\tcursor: pointer;\n}\n.theme-install-php a.browse-themes,\n.theme-install-php.show-upload-theme a.upload {\n\tdisplay: none;\n}\n.theme-install-php.show-upload-theme a.browse-themes {\n\tdisplay: inline;\n}\n.upload-theme,\n.upload-plugin {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tdisplay: none;\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 100%;\n\toverflow: hidden;\n\tposition: relative;\n\ttop: 10px;\n}\nbody.show-upload-theme .upload-theme,\n.upload-plugin {\n\tdisplay: block;\n}\n.upload-theme .wp-upload-form,\n.upload-plugin .wp-upload-form {\n\tbackground: #fafafa;\n\tborder: 1px solid #e5e5e5;\n\tpadding: 30px;\n\tmargin: 30px auto;\n\tmax-width: 380px;\n}\n.upload-theme .install-help,\n.upload-plugin .install-help {\n\tcolor: #999;\n\tfont-size: 18px;\n\tfont-style: normal;\n\tmargin: 0;\n\tpadding: 40px 0 0;\n\ttext-align: center;\n}\nbody.show-upload-theme .upload-theme + .wp-filter,\nbody.show-upload-theme .upload-theme + .wp-filter + .theme-browser {\n\tdisplay: none;\n}\n\np.no-themes {\n\tclear: both;\n\tcolor: #666;\n\tfont-size: 18px;\n\tfont-style: normal;\n\tmargin: 0;\n\tpadding: 0;\n\ttext-align: center;\n\tdisplay: none;\n}\nbody.no-results p.no-themes {\n\tdisplay: block;\n}\nbody.show-upload-theme p.no-themes {\n\tdisplay: none !important;\n}\n\n.theme-install-php .add-new-theme {\n\tdisplay: none !important;\n}\n\n@media only screen and (max-width: 1120px) {\n\t.upload-theme .wp-upload-form {\n\t\tmargin: 20px 0;\n\t\tmax-width: 100%;\n\t}\n\t.upload-theme .install-help {\n\t\tfont-size: 15px;\n\t\tpadding: 20px 0 0;\n\t\ttext-align: right;\n\t}\n}\n\n.theme-details .theme-rating {\n\tline-height: 23px;\n}\n\n.theme-details .star-rating {\n\tdisplay: inline;\n}\n\n.theme-details .num-ratings,\n.theme-details .no-rating {\n\tfont-size: 11px;\n\tcolor: #999;\n}\n\n.theme-details .no-rating {\n\tdisplay: block;\n\tline-height: 20px;\n}\n\n/*------------------------------------------------------------------------------\n  16.3 - Custom Header Screen\n------------------------------------------------------------------------------*/\n\n.appearance_page_custom-header #headimg {\n\tborder: 1px solid #DFDFDF;\n\toverflow: hidden;\n\twidth: 100%;\n}\n\n.appearance_page_custom-header #upload-form p label {\n\tfont-size: 12px;\n}\n\n.appearance_page_custom-header .available-headers .default-header {\n\tfloat: right;\n\tmargin: 0 0 20px 20px;\n}\n\n.appearance_page_custom-header .random-header {\n\tclear: both;\n\tmargin: 0 0 20px 20px;\n\tvertical-align: middle;\n}\n\n.appearance_page_custom-header .available-headers label input,\n.appearance_page_custom-header .random-header label input {\n\tmargin-left: 10px;\n}\n\n.appearance_page_custom-header .available-headers label img {\n\tvertical-align: middle;\n}\n\n\n/*------------------------------------------------------------------------------\n  16.4 - Custom Background Screen\n------------------------------------------------------------------------------*/\n\ndiv#custom-background-image {\n\tmin-height: 100px;\n\tborder: 1px solid #dfdfdf;\n}\n\ndiv#custom-background-image img {\n\tmax-width: 400px;\n\tmax-height: 300px;\n}\n\n/*------------------------------------------------------------------------------\n  23.0 - Full Overlay w/ Sidebar\n------------------------------------------------------------------------------*/\n\nbody.full-overlay-active {\n\toverflow: hidden;\n}\n\n.wp-full-overlay {\n\tbackground: transparent;\n\tz-index: 500000;\n\tposition: fixed;\n\toverflow: visible;\n\ttop: 0;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\theight: 100%;\n\tmin-width: 0;\n}\n\n.wp-full-overlay-sidebar {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tposition: fixed;\n\twidth: 300px;\n\theight: 100%;\n\ttop: 0;\n\tbottom: 0;\n\tright: 0;\n\tpadding: 0;\n\tmargin: 0;\n\tz-index: 10;\n\tbackground: #eee;\n\tborder-left: none;\n}\n\n.wp-full-overlay.collapsed .wp-full-overlay-sidebar {\n\toverflow: visible;\n}\n\n.wp-full-overlay.collapsed,\n.wp-full-overlay.expanded .wp-full-overlay-sidebar {\n\tmargin-right: 0 !important;\n}\n\n.wp-full-overlay.expanded {\n\tmargin-right: 300px;\n}\n\n.wp-full-overlay.collapsed .wp-full-overlay-sidebar {\n\tmargin-right: -300px;\n}\n\n.wp-full-overlay-sidebar:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 3px;\n\tz-index: 1000;\n}\n\n.wp-full-overlay-main {\n\tposition: absolute;\n\tright: 0;\n\tleft: 0;\n\ttop: 0;\n\tbottom: 0;\n\theight: 100%;\n}\n\n#customize-preview.wp-full-overlay-main {\n\tbackground: url(../images/spinner.gif) no-repeat center center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n}\n\n#customize-preview.wp-full-overlay-main.iframe-ready {\n\tbackground: none;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-header {\n\tposition: absolute;\n\tright: 0;\n\tleft: 0;\n\theight: 45px;\n\tpadding: 0 15px;\n\tline-height: 45px;\n\tz-index: 10;\n\tmargin: 0;\n\tborder-top: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-header a.back {\n\tmargin-top: 9px;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-footer {\n\tbottom: 0;\n\tborder-bottom: none;\n\tborder-top: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {\n\tposition: absolute;\n\ttop: 45px;\n\tbottom: 45px;\n\tright: 0;\n\tleft: 0;\n\toverflow: auto;\n}\n\n/* Close & Navigation Links */\n.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header {\n\tpadding: 0;\n}\n\n.theme-install-overlay .close-full-overlay,\n.theme-install-overlay .previous-theme,\n.theme-install-overlay .next-theme {\n\tdisplay: block;\n\tposition: relative;\n\tfloat: right;\n\twidth: 45px;\n\theight: 45px;\n\tpadding-left: 2px;\n\tbackground: #eee;\n\tborder-left: 1px solid #ddd;\n\tcolor: #444;\n\tcursor: pointer;\n\ttext-decoration: none;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.theme-install-overlay .close-full-overlay:hover,\n.theme-install-overlay .close-full-overlay:focus,\n.theme-install-overlay .previous-theme:hover,\n.theme-install-overlay .previous-theme:focus,\n.theme-install-overlay .next-theme:hover,\n.theme-install-overlay .next-theme:focus {\n\tbackground: #ddd;\n\tborder-color: #ccc;\n\tcolor: #000;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.theme-install-overlay .close-full-overlay:before {\n\tfont: normal 22px/1 dashicons;\n\tcontent: \"\\f335\";\n\tposition: relative;\n\ttop: 7px;\n\tright: 13px;\n}\n\n.theme-install-overlay .previous-theme:before {\n\tfont: normal 20px/1 dashicons;\n\tcontent: \"\\f345\";\n\tposition: relative;\n\ttop: 6px;\n\tright: 14px;\n}\n\n.theme-install-overlay .next-theme:before {\n\tfont: normal 20px/1 dashicons;\n\tcontent: \"\\f341\";\n\tposition: relative;\n\ttop: 6px;\n\tright: 13px;\n}\n\n.theme-install-overlay .previous-theme.disabled,\n.theme-install-overlay .next-theme.disabled,\n.theme-install-overlay .previous-theme.disabled:hover,\n.theme-install-overlay .previous-theme.disabled:focus,\n.theme-install-overlay .next-theme.disabled:hover,\n.theme-install-overlay .next-theme.disabled:focus {\n\tcolor: #b4b9be;\n\tbackground: #eee;\n\tcursor: default;\n\tpointer-events: none;\n}\n\n/* Collapse Button */\n.wp-core-ui .wp-full-overlay .collapse-sidebar {\n\tposition: fixed;\n\tbottom: 8px;\n\tright: 10px;\n\tpadding: 0;\n\tcolor: #656a6f;\n\toutline: 0;\n\tline-height: 1;\n\tbackground-color: transparent !important;\n\tborder: none !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n\t-webkit-border-radius: 0 !important;\n\tborder-radius: 0 !important;\n}\n\n.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,\n.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {\n\tcolor: #0073aa;\n}\n\n.wp-full-overlay .collapse-sidebar-arrow,\n.wp-full-overlay .collapse-sidebar-label {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tline-height: 20px;\n}\n\n.wp-full-overlay .collapse-sidebar-arrow {\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 0 2px; /* avoid the focus box-shadow to be cut-off */\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\toverflow: hidden;\n}\n\n.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,\n.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {\n    -webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.wp-full-overlay .collapse-sidebar-label {\n\tmargin-right: 3px;\n}\n\n.wp-full-overlay.collapsed .collapse-sidebar-label {\n\tdisplay: none;\n}\n\n.wp-full-overlay .collapse-sidebar-arrow:before {\n\tdisplay: block;\n\tcontent: \"\\f148\";\n\tbackground: #eee;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tpadding: 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* rtl:ignore */\n.wp-full-overlay.collapsed .collapse-sidebar-arrow:before,\n.rtl .wp-full-overlay .collapse-sidebar-arrow:before {\n\t-webkit-transform: rotate(180.001deg);\n\t-ms-transform: rotate(180.001deg);\n\ttransform: rotate(180.001deg); /* Firefox: promoting to its own layer to trigger anti-aliasing  */\n}\n\n.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before {\n\t-webkit-transform: none;\n\t-ms-transform: none;\n\ttransform: none;\n}\n\n/* Animations */\n.wp-full-overlay,\n.wp-full-overlay-sidebar,\n.wp-full-overlay .collapse-sidebar,\n.wp-full-overlay-main {\n\t-webkit-transition-property: right, left, top, bottom, width, margin;\n\ttransition-property: right, left, top, bottom, width, margin;\n\t-webkit-transition-duration: 0.2s;\n\ttransition-duration: 0.2s;\n}\n\n/*------------------------------------------------------------------------------\n  24.0 - Customize Loader\n------------------------------------------------------------------------------*/\n\n.no-customize-support .hide-if-no-customize,\n.customize-support .hide-if-customize,\n.no-customize-support.wp-core-ui .hide-if-no-customize,\n.no-customize-support .wp-core-ui .hide-if-no-customize,\n.customize-support.wp-core-ui .hide-if-customize,\n.customize-support .wp-core-ui .hide-if-customize {\n\tdisplay: none;\n}\n\n#customize-container {\n\tdisplay: none;\n\tbackground: #fff;\n\tz-index: 500000;\n\tposition: fixed;\n\toverflow: visible;\n\ttop: 0;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\theight: 100%;\n}\n\n.customize-active #customize-container {\n\tdisplay: block;\n}\n\n.customize-loading #customize-container iframe {\n\topacity: 0;\n}\n\n.customize-loading #customize-container {\n\tbackground: #fff url(../images/spinner.gif) no-repeat fixed center center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n}\n\n#customize-container iframe,\n.theme-install-overlay iframe {\n\theight: 100%;\n\twidth: 100%;\n\tz-index: 20;\n\t-webkit-transition: opacity 0.3s;\n\ttransition: opacity 0.3s;\n}\n\n#customize-controls {\n\tmargin-top: 0;\n}\n\n.theme-install-overlay {\n\tdisplay: none;\n}\n\n.theme-install-overlay.single-theme {\n\tdisplay: block;\n}\n\n.install-theme-info {\n\tdisplay: none;\n\tpadding: 10px 20px 60px;\n}\n\n.single-theme .install-theme-info {\n\tpadding-top: 15px;\n}\n\n.theme-install-overlay .install-theme-info {\n\tdisplay: block;\n}\n\n.install-theme-info .theme-install {\n\tfloat: left;\n\tmargin-top: 18px;\n}\n\n.install-theme-info .theme-name {\n\tfont-size: 16px;\n\tline-height: 24px;\n\tmargin-bottom: 0;\n\tmargin-top: 0;\n}\n\n.install-theme-info .theme-screenshot {\n\tmargin: 15px 0;\n\twidth: 258px;\n\tborder: 1px solid #ccc;\n}\n\n.install-theme-info .theme-details {\n\toverflow: hidden;\n}\n\n.theme-details .theme-version {\n\tmargin: 15px 0;\n}\n\n.theme-details .theme-description {\n\tfloat: right;\n\tcolor: #777;\n\tline-height: 20px;\n\tmax-width: 100%;\n}\n\n.theme-install-overlay .wp-full-overlay-header .theme-install {\n\tfloat: left;\n\tmargin: 8px 0 0 10px;\n\t/* For when .theme-install is a span rather than a.button-primary (already installed theme) */\n\tline-height: 26px;\n}\n\n.theme-install-overlay .wp-full-overlay-sidebar {\n\tbackground: #eee;\n\tborder-left: 1px solid #ddd;\n}\n\n.theme-install-overlay .wp-full-overlay-sidebar-content {\n\tbackground: #fff;\n\tborder-top: 1px solid #ddd;\n\tborder-bottom: 1px solid #ddd;\n}\n\n.theme-install-overlay .wp-full-overlay-main {\n\tposition: relative;\n\tz-index: 0;\n\tbackground-color: #fff;\n}\n\n.theme-install-overlay .wp-full-overlay-main:before {\n\tcontent: '';\n\tdisplay: block;\n\twidth: 20px;\n\theight: 20px;\n\tposition: absolute;\n\tright: 50%;\n\ttop: 50%;\n\tz-index: -1;\n\tmargin: -10px -10px 0 0;\n\t-webkit-transform: translateZ(0);\n\ttransform: translateZ(0);\n\tbackground: #fff url(../images/spinner.gif) no-repeat center center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n}\n\n.theme-install-overlay.iframe-ready .wp-full-overlay-main:before {\n\tbackground-image: none;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t.wp-full-overlay .collapse-sidebar-arrow {\n\t\tbackground-image: url(../images/arrows-2x.png);\n\t\t-webkit-background-size: 15px 123px;\n\t\tbackground-size: 15px 123px;\n\t}\n\n\t#customize-preview.wp-full-overlay-main,\n\t.customize-loading #customize-container,\n\t.theme-install-overlay .wp-full-overlay-main:before {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t.available-theme .action-links .delete-theme {\n\t\tfloat: none;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tclear: both;\n\t}\n\n\t.available-theme .action-links .delete-theme a {\n\t\tpadding: 0;\n\t}\n\n\t.broken-themes table {\n\t\twidth: 100%;\n\t}\n\n\t.theme-install-overlay .wp-full-overlay-header .theme-install {\n\t\tmargin-top: 6px;\n\t\tline-height: normal;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/themes.css",
    "content": "/*------------------------------------------------------------------------------\n  16.0 - Themes\n------------------------------------------------------------------------------*/\n\n\n/*------------------------------------------------------------------------------\n  16.1 - Manage Themes\n------------------------------------------------------------------------------*/\n\n.theme-browser .themes {\n\tclear: both;\n\tpadding: 0 0 100px;\n}\n\n.themes-php .wrap h1 {\n\tfloat: left;\n\tmargin-bottom: 15px;\n}\n\n.network-admin.themes-php .wrap h1 {\n\tmargin-bottom: 0;\n}\n\n.themes-php .wrap h1 .button {\n\tmargin-left: 20px;\n}\n\n/* Search form */\n.themes-php .wp-filter-search {\n\tposition: relative;\n\ttop: -2px;\n\tleft: 20px;\n\tmargin: 0;\n\twidth: 280px;\n\tfont-size: 16px;\n\tfont-weight: 300;\n\tline-height: 1.5;\n}\n\n/* Position admin messages */\n.themes-php div.updated,\n.themes-php div.error,\n.themes-php div.notice {\n\tmargin: 0 0 20px 0;\n\tclear: both;\n}\n\n.themes-php div.updated a {\n\ttext-decoration: underline;\n}\n\n/**\n * Main theme element\n * (has flexible margins)\n */\n.theme-browser .theme {\n\tcursor: pointer;\n\tfloat: left;\n\tmargin: 0 4% 4% 0;\n\tposition: relative;\n\twidth: 30.6%;\n\tborder: 1px solid #dedede;\n\t-webkit-box-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 1px -1px rgba(0,0,0,0.1);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.ie8 .theme-browser .theme {\n\twidth: 30%;\n\tmargin: 0 3% 4% 0;\n}\n\n.theme-browser .theme:nth-child(3n) {\n\tmargin-right: 0;\n}\n\n.theme-browser .theme:hover,\n.theme-browser .theme:focus {\n\tcursor: pointer;\n}\n\n.theme-browser .theme .theme-name {\n\tfont-size: 15px;\n\tfont-weight: 600;\n\theight: 18px;\n\tmargin: 0;\n\tpadding: 15px;\n\t-webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);\n\tbox-shadow: inset 0 1px 0 rgba(0,0,0,0.1);\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\tbackground: #fff;\n\tbackground: rgba(255,255,255,0.65);\n}\n\n/* Activate and Customize buttons, shown on hover and focus */\n.theme-browser .theme .theme-actions {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n\topacity: 0;\n\t-webkit-transition: opacity 0.1s ease-in-out;\n\ttransition: opacity 0.1s ease-in-out;\n\tposition: absolute;\n\tbottom: 0;\n\tright: 0;\n\theight: 38px;\n\tpadding: 9px 10px 0 10px;\n\tbackground: rgba(244, 244, 244, 0.7);\n\tborder-left: 1px solid rgba(0,0,0,0.05);\n}\n\n.theme-browser .theme:hover .theme-actions,\n.theme-browser .theme.focus .theme-actions,\n.theme-browser .theme:focus .theme-actions {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n\topacity: 1;\n}\n\n.theme-browser .theme .theme-actions .button-primary {\n\tmargin-right: 3px;\n}\n\n.theme-browser .theme .theme-actions .button-secondary {\n\tfloat: none;\n\tmargin-left: 3px;\n}\n\n/**\n * Theme Screenshot\n *\n * Has a fixed aspect ratio of 1.5 to 1 regardless of screenshot size\n * It is also responsive.\n */\n.theme-browser .theme .theme-screenshot {\n\tdisplay: block;\n\toverflow: hidden;\n\tposition: relative;\n\t-webkit-transition: opacity 0.2s ease-in-out;\n\ttransition: opacity 0.2s ease-in-out;\n}\n\n.theme-browser .theme .theme-screenshot:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tpadding-top: 66.66666%; /* using a 3/2 aspect ratio */\n}\n\n.theme-browser .theme .theme-screenshot img {\n\theight: auto;\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\t-webkit-transition: opacity 0.2s ease-in-out;\n\ttransition: opacity 0.2s ease-in-out;\n}\n\n.theme-browser .theme:hover .theme-screenshot,\n.theme-browser .theme:focus .theme-screenshot {\n\tbackground: #fff;\n}\n\n.theme-browser.rendered .theme:hover .theme-screenshot img,\n.theme-browser.rendered .theme:focus .theme-screenshot img {\n\topacity: 0.4;\n}\n\n.theme-browser .theme .more-details {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";\n\topacity: 0;\n\tposition: absolute;\n\ttop: 35%;\n\tright: 25%;\n\tleft: 25%;\n\tbackground: #23282d;\n\tbackground: rgba(0,0,0,0.7);\n\tcolor: #fff;\n\tfont-size: 15px;\n\ttext-shadow: 0 1px 0 rgba(0,0,0,0.6);\n\t-webkit-font-smoothing: antialiased;\n\tfont-weight: 600;\n\tpadding: 15px 12px;\n\ttext-align: center;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\t-webkit-transition: opacity 0.1s ease-in-out;\n\ttransition: opacity 0.1s ease-in-out;\n}\n\n.theme-browser .theme:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 2px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow: 0 0 2px rgba( 30, 140, 190, 0.8 );\n}\n\n.theme-browser .theme:focus .more-details {\n\topacity: 1;\n}\n\n/* Current theme needs to have its action always on view */\n.theme-browser .theme.active:focus .theme-actions {\n\tdisplay: block;\n}\n\n.theme-browser.rendered .theme:hover .more-details,\n.theme-browser.rendered .theme:focus .more-details {\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)\";\n\topacity: 1;\n}\n\n/**\n * Displays a theme update notice\n * when an update is available.\n */\n.theme-browser .theme .theme-update,\n.theme-browser .theme .theme-installed {\n\tbackground: #d54e21;\n\tbackground: rgba(213, 78, 33, 0.95);\n\tcolor: #fff;\n\tdisplay: block;\n\tfont-size: 13px;\n\tfont-weight: 400;\n\theight: 48px;\n\tline-height: 48px;\n\tpadding: 0 10px;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tborder-bottom: 1px solid rgba(0,0,0,0.25);\n\toverflow: hidden;\n}\n\n.theme-browser .theme .theme-update:before,\n.theme-browser .theme .theme-installed:before {\n\tcontent: \"\\f463\";\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tmargin: 0 6px 0 0;\n\topacity: 0.8;\n\tposition: relative;\n\ttop: 5px;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n}\n\n\n/**\n * The currently active theme\n */\n.theme-browser .theme.active .theme-name {\n\tbackground: #2f2f2f;\n\tcolor: #fff;\n\tpadding-right: 110px;\n\tfont-weight: 300;\n\t-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.5);\n\tbox-shadow: inset 0 1px 1px rgba(0,0,0,0.5);\n}\n\n.theme-browser .customize-control .theme.active .theme-name {\n\tpadding-right: 15px;\n}\n\n.theme-browser .theme.active .theme-name span {\n\tfont-weight: 600;\n}\n\n.theme-browser .theme.active .theme-actions {\n\tbackground: rgba(49,49,49,0.7);\n\tborder-left: none;\n\topacity: 1;\n}\n\n.theme-browser .theme.active .theme-actions .button-primary {\n\tmargin-right: 0;\n}\n\n.theme-browser .theme .theme-author {\n\tbackground: #23282d;\n\tcolor: #eee;\n\tdisplay: none;\n\tfont-size: 14px;\n\tmargin: 0 10px;\n\tpadding: 5px 10px;\n\tposition: absolute;\n\tbottom: 56px;\n}\n\n.theme-browser .theme.display-author .theme-author {\n\tdisplay: block;\n}\n\n.theme-browser .theme.display-author .theme-author a {\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n\n/**\n * Add new theme\n */\n.theme-browser .theme.add-new-theme {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.theme-browser .theme.add-new-theme a {\n\tcolor: #999;\n\ttext-decoration: none;\n\tdisplay: block;\n\tposition: relative;\n\tz-index: 1;\n}\n\n.theme-browser .theme.add-new-theme a:after {\n\tdisplay: block;\n\tcontent: \"\";\n\tbackground: transparent;\n\tbackground: rgba(0, 0, 0, 0);\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tpadding: 0;\n\ttext-shadow: none;\n\tborder: 5px dashed #d5d2ca;\n\tborder: 5px dashed rgba(0, 0, 0, 0.1);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.theme-browser .theme.add-new-theme span:after {\n\tbackground: #e5e5e5;\n\tbackground: rgba(153, 153, 153, 0.1);\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tdisplay: inline-block;\n\tcontent: \"\\f132\";\n\t-webkit-font-smoothing: antialiased;\n\tfont: normal 74px/115px dashicons;\n\twidth: 100px;\n\theight: 100px;\n\tvertical-align: middle;\n\ttext-align: center;\n\tcolor: rgb(153, 153, 153);\n\tposition: absolute;\n\ttop: 30%;\n\tleft: 50%;\n\tmargin-left: -50px;\n\ttext-indent: -4px;\n\tpadding: 0;\n\ttext-shadow: none;\n\tz-index:4;\n}\n\n.rtl .theme-browser .theme.add-new-theme span:after {\n\ttext-indent: 4px;\n}\n\n.theme-browser .theme.add-new-theme a:hover .theme-screenshot,\n.theme-browser .theme.add-new-theme a:focus .theme-screenshot {\n\tbackground: none;\n}\n\n.theme-browser .theme.add-new-theme a:hover span:after,\n.theme-browser .theme.add-new-theme a:focus span:after {\n\tbackground: #fff;\n\tcolor: #0073aa;\n}\n\n.theme-browser .theme.add-new-theme a:hover:after,\n.theme-browser .theme.add-new-theme a:focus:after {\n\tborder-color: transparent;\n\tcolor: #fff;\n\tbackground: #0073aa;\n\tcontent: \"\";\n}\n\n.theme-browser .theme.add-new-theme .theme-name {\n\tbackground: none;\n\ttext-align: center;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tfont-weight: 400;\n\tposition: relative;\n\ttop: 0;\n\tmargin-top: -18px;\n\tpadding-top: 0;\n\tpadding-bottom: 48px;\n}\n\n.theme-browser .theme.add-new-theme a:hover .theme-name,\n.theme-browser .theme.add-new-theme a:focus .theme-name {\n\tcolor: #fff;\n\tz-index: 2;\n}\n\n/**\n * Theme Overlay\n * Shown when clicking a theme\n */\n.theme-overlay .theme-backdrop {\n\tposition: absolute;\n\tleft: -20px;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\tbackground: #f1f1f1;\n\tbackground: rgba( 238, 238, 238, 0.9 );\n\tz-index: 10000; /* Over WP Pointers. */\n}\n\n.theme-overlay .theme-header {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 48px;\n\tborder-bottom: 1px solid #ddd;\n}\n\n.theme-overlay .theme-header button {\n\tpadding: 0;\n}\n\n.theme-overlay .theme-header .close {\n\tcursor: pointer;\n\theight: 48px;\n\twidth: 50px;\n\ttext-align: center;\n\tfloat: right;\n\tborder: 0;\n\tborder-left: 1px solid #ddd;\n\tbackground-color: transparent;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.theme-overlay .theme-header .close:before {\n\tfont: normal 22px/50px dashicons !important;\n\tcolor: #777;\n\tdisplay: inline-block;\n\tcontent: \"\\f335\";\n\tfont-weight: 300;\n}\n\n/* Left and right navigation */\n.theme-overlay .theme-header .right,\n.theme-overlay .theme-header .left {\n\tcursor: pointer;\n\tcolor: #777;\n\tbackground-color: transparent;\n\theight: 48px;\n\twidth: 54px;\n\tfloat: left;\n\ttext-align: center;\n\tborder: 0;\n\tborder-right: 1px solid #ddd;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.theme-overlay .theme-header .close:focus,\n.theme-overlay .theme-header .close:hover,\n.theme-overlay .theme-header .right:focus,\n.theme-overlay .theme-header .right:hover,\n.theme-overlay .theme-header .left:focus,\n.theme-overlay .theme-header .left:hover {\n\tbackground: #ddd;\n\tborder-color: #ccc;\n\tcolor: #000;\n}\n\n.theme-overlay .theme-header .close:focus:before,\n.theme-overlay .theme-header .close:hover:before {\n\tcolor: #000;\n}\n\n.theme-overlay .theme-header .close:focus,\n.theme-overlay .theme-header .right:focus,\n.theme-overlay .theme-header .left:focus {\n    -webkit-box-shadow: none;\n    box-shadow: none;\n    outline: none;\n}\n\n.theme-overlay .theme-header .left.disabled,\n.theme-overlay .theme-header .right.disabled,\n.theme-overlay .theme-header .left.disabled:hover,\n.theme-overlay .theme-header .right.disabled:hover {\n\tcolor: #ccc;\n\tbackground: inherit;\n\tcursor: inherit;\n}\n\n.theme-overlay .theme-header .right:before,\n.theme-overlay .theme-header .left:before {\n\tfont: normal 20px/50px dashicons !important;\n\tdisplay: inline;\n\tfont-weight: 300;\n}\n\n.theme-overlay .theme-header .left:before {\n\tcontent: \"\\f341\";\n}\n\n.theme-overlay .theme-header .right:before {\n\tcontent: \"\\f345\";\n}\n\n.theme-overlay .theme-wrap {\n\tclear: both;\n\tposition: fixed;\n\ttop: 9%;\n\tleft: 190px;\n\tright: 30px;\n\tbottom: 3%;\n\tbackground: #fff;\n\t-webkit-box-shadow: 0 1px 20px 5px rgba(0, 0, 0, 0.1);\n\tbox-shadow: 0 1px 20px 5px rgba(0, 0, 0, 0.1);\n\tz-index: 10000; /* Over WP Pointers. */\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-overflow-scrolling: touch;\n}\n\n.theme-overlay .theme-wrap:after {\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tclear: both;\n\tvisibility: hidden;\n}\n\nbody.folded .theme-overlay .theme-wrap {\n\tleft: 70px;\n}\n\n.theme-overlay .theme-about {\n\tposition: absolute;\n\ttop: 49px;\n\tbottom: 57px;\n\tleft: 0;\n\tright: 0;\n\toverflow: auto;\n\tpadding: 2% 4%;\n}\n.theme-overlay .theme-about:after {\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tclear: both;\n\tvisibility: hidden;\n}\n\n.theme-overlay .theme-actions {\n\tposition: absolute;\n\ttext-align: center;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tpadding: 10px 25px 5px;\n\tbackground: #f3f3f3;\n\tz-index: 30;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tborder-top: 1px solid #eee;\n}\n\n.ie8 .theme-overlay .theme-actions {\n\tborder: 1px solid #eee;\n}\n\n.theme-overlay .theme-actions a {\n\tmargin-right: 5px;\n\tmargin-bottom: 5px;\n}\n\n/* Hide-if-customize for items we can't add classes to */\n.customize-support .theme-overlay .theme-actions a[href=\"themes.php?page=custom-header\"],\n.customize-support .theme-overlay .theme-actions a[href=\"themes.php?page=custom-background\"] {\n\tdisplay: none;\n}\n\n.broken-themes a.delete-theme,\n.theme-overlay .theme-actions .delete-theme {\n\tcolor: #a00;\n\ttext-decoration: none;\n\tborder-color: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: transparent;\n}\n\n.theme-overlay .theme-actions .delete-theme {\n\tposition: absolute;\n\tright: 10px;\n\tbottom: 5px;\n}\n\n.broken-themes a.delete-theme:hover,\n.broken-themes a.delete-theme:focus,\n.theme-overlay .theme-actions .delete-theme:hover,\n.theme-overlay .theme-actions .delete-theme:focus {\n\tbackground: #d54e21;\n\tcolor: #fff;\n\tborder-color: #d54e21;\n}\n\n.theme-overlay .theme-actions .active-theme,\n.theme-overlay.active .theme-actions .inactive-theme {\n\tdisplay: none;\n}\n\n.theme-overlay .theme-actions .inactive-theme,\n.theme-overlay.active .theme-actions .active-theme {\n\tdisplay: block;\n}\n\n/**\n * Theme Screenshots gallery\n */\n.theme-overlay .theme-screenshots {\n\tfloat: left;\n\tmargin: 0 30px 0 0;\n\twidth: 55%;\n\tmax-width: 880px;\n\ttext-align: center;\n}\n\n/* First screenshot, shown big */\n.theme-overlay .screenshot {\n\tborder: 1px solid #fff;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\toverflow: hidden;\n\tposition: relative;\n\t-webkit-box-shadow: 0 0 0 1px rgba(0,0,0,0.2);\n\tbox-shadow: 0 0 0 1px rgba(0,0,0,0.2);\n}\n\n.theme-overlay .screenshot:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tpadding-top: 75%; /* using a 4/3 aspect ratio */\n}\n\n.theme-overlay .screenshot img {\n\theight: auto;\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n}\n/* Handles old 300px screenshots */\n.theme-overlay.small-screenshot .theme-screenshots {\n\tposition: absolute;\n\twidth: 302px;\n}\n.theme-overlay.small-screenshot .theme-info {\n\tmargin-left: 350px;\n\twidth: auto;\n}\n\n/* Other screenshots, shown small and square */\n.theme-overlay .screenshot.thumb {\n\tbackground: #ccc;\n\tborder: 1px solid #eee;\n\tfloat: none;\n\tdisplay: inline-block;\n\tmargin: 10px 5px 0;\n\twidth: 140px;\n\theight: 80px;\n\tcursor: pointer;\n}\n\n.theme-overlay .screenshot.thumb:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tpadding-top: 100%; /* using a 1/1 aspect ratio */\n}\n\n.theme-overlay .screenshot.thumb img {\n\tcursor: pointer;\n\theight: auto;\n\tposition: absolute;\n\tleft: 0;\n\ttop: 0;\n\twidth: 100%;\n\theight: auto;\n}\n\n.theme-overlay .screenshot.selected {\n\tbackground: transparent;\n\tborder: 2px solid #00a0d2;\n}\n\n.theme-overlay .screenshot.selected img {\n\topacity: 0.8;\n}\n\n/* No screenshot placeholder */\n.theme-browser .theme .theme-screenshot.blank,\n.theme-overlay .screenshot.blank {\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYGWO8d+/efwYkoKioiMRjYGBC4WHhUK6A8T8QIJt8//59ZC493AAAQssKpBK4F5AAAAAASUVORK5CYII=);\n}\n\n/**\n * Theme heading information\n */\n.theme-overlay .theme-info {\n\twidth: 40%;\n\tfloat: left;\n}\n\n.theme-overlay .current-label {\n\tbackground: #32373c;\n\tcolor: #fff;\n\tfont-size: 11px;\n\tdisplay: inline-block;\n\tpadding: 2px 8px;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\tmargin: 0 0 -10px;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.theme-overlay .theme-name {\n\tcolor: #23282d;\n\tfont-size: 32px;\n\tfont-weight: 100;\n\tmargin: 10px 0 0;\n\tline-height: 1.3;\n}\n\n.theme-overlay .theme-version {\n\tcolor: #999;\n\tfont-size: 13px;\n\tfont-weight: 400;\n\tfloat: none;\n\tdisplay: inline-block;\n\tmargin-left: 10px;\n}\n\n.theme-overlay .theme-author {\n\tmargin: 15px 0 25px;\n\tcolor: #686868;\n\tfont-size: 16px;\n\tfont-weight: 400;\n\tline-height: inherit;\n}\n\n.theme-overlay .theme-author a {\n\ttext-decoration: none;\n}\n\n.theme-overlay .theme-description {\n\tcolor: #555;\n\tfont-size: 15px;\n\tfont-weight: 400;\n\tline-height: 1.5;\n\tmargin: 30px 0 0 0;\n}\n\n.theme-overlay .theme-tags {\n\tborder-top: 3px solid #eee;\n\tcolor: #82878c;\n\tfont-size: 13px;\n\tfont-weight: 400;\n\tmargin: 30px 0 0 0;\n\tpadding-top: 20px;\n}\n\n.theme-overlay .theme-tags span {\n\tcolor: #444;\n\tfont-weight: bold;\n\tmargin-right: 5px;\n}\n\n.theme-overlay .parent-theme {\n\tbackground: #f7fcfe;\n\tborder: 1px solid #eee;\n\tborder-left: 4px solid #00a0d2;\n\tfont-size: 14px;\n\tfont-weight: normal;\n\tmargin-top: 30px;\n\tpadding: 10px 10px 10px 20px;\n}\n\n.theme-overlay .parent-theme strong {\n\tfont-weight: 700;\n}\n\n/**\n * Single Theme Mode\n * Displays detailed view inline when a user has no switch capabilities\n */\n.single-theme .theme-overlay .theme-backdrop,\n.single-theme .theme-overlay .theme-header,\n.single-theme .theme {\n\tdisplay: none;\n}\n\n.single-theme .theme-overlay .theme-wrap {\n\tclear: both;\n\tmin-height: 330px;\n\tposition: relative;\n\tleft: auto;\n\tright: auto;\n\ttop: auto;\n\tbottom: auto;\n\tz-index: 10;\n}\n\n.single-theme .theme-overlay .theme-about {\n\tpadding: 30px 30px 70px;\n\tposition: static;\n}\n\n.single-theme .theme-overlay .theme-actions {\n\tposition: absolute;\n}\n\n/**\n * Basic Responsive structure...\n *\n * Shuffles theme columns around based on screen width\n */\n\n@media only screen and (min-width: 2000px) {\n\t#wpwrap .theme-browser .theme {\n\t\twidth: 17.6%;\n\t\tmargin: 0 3% 3% 0;\n\t}\n\n\t#wpwrap .theme-browser .theme:nth-child(3n),\n\t#wpwrap .theme-browser .theme:nth-child(4n) {\n\t\tmargin-right: 3%;\n\t}\n\n\t#wpwrap .theme-browser .theme:nth-child(5n) {\n\t\tmargin-right: 0;\n\t}\n}\n\n@media only screen and (min-width: 1680px) {\n\t.theme-overlay .theme-wrap {\n\t\twidth: 1450px;\n\t\tmargin: 0 auto;\n\t}\n}\n\n/* Maximum screenshot width reaches 440px */\n@media only screen and (min-width: 1640px) {\n\t.theme-browser .theme {\n\t\twidth: 22.7%;\n\t\tmargin: 0 3% 3% 0;\n\t}\n\t.theme-browser .theme .theme-screenshot:after {\n\t\tpadding-top: 75%; /* using a 4/3 aspect ratio */\n\t}\n\n\t.theme-browser .theme:nth-child(3n) {\n\t\tmargin-right: 3%;\n\t}\n\n\t.theme-browser .theme:nth-child(4n) {\n\t\tmargin-right: 0;\n\t}\n}\n/* Maximum screenshot width reaches 440px */\n@media only screen and (max-width: 1120px) {\n\t.theme-browser .theme {\n\t\twidth: 47.5%;\n\t\tmargin-right: 0;\n\t}\n\n\t.theme-browser .theme:nth-child(even) {\n\t\tmargin-right: 0;\n\t}\n\n\t.theme-browser .theme:nth-child(odd) {\n\t\tmargin-right: 5%;\n\t}\n}\n\n/* Admin menu is folded */\n@media only screen and (max-width: 900px) {\n\t.theme-overlay .theme-wrap {\n\t\tleft: 65px;\n\t}\n}\n\n@media only screen and (max-width: 780px) {\n\tbody.folded .theme-overlay .theme-wrap,\n\t.theme-overlay .theme-wrap {\n\t\ttop: 0; /* The adminmenu isn't fixed on mobile, so this can use the full viewport height */\n\t\tright: 0;\n\t\tbottom: 0;\n\t\tleft: 0;\n\t\tpadding: 70px 20px 20px;\n\t\tborder: none;\n\t\tz-index: 100000; /* should overlap #wpadminbar. */\n\t\tposition: fixed;\n\t}\n\n\t.theme-browser .theme.active .theme-name span {\n\t\t/* Hide the \"Active: \" label on smaller screens. */\n\t\tdisplay: none;\n\t}\n\n\t.theme-overlay .theme-screenshots {\n\t\twidth: 40%;\n\t}\n\n\t.theme-overlay .theme-info {\n\t\twidth: 50%;\n\t}\n\t.single-theme .theme-wrap {\n\t\tpadding: 10px;\n\t}\n\n\t.theme-browser .theme .theme-actions {\n\t\tpadding: 5px 10px 4px 10px;\n\t}\n\n\t.theme-overlay.small-screenshot .theme-screenshots {\n\t\tposition: static;\n\t\tfloat: none;\n\t\tmax-width: 302px;\n\t}\n\n\t.theme-overlay.small-screenshot .theme-info {\n\t\tmargin-left: 0;\n\t\twidth: auto;\n\t}\n\n\t.theme:not(.active):hover .theme-actions,\n\t.theme:not(.active):focus .theme-actions,\n\t.theme:hover .more-details,\n\t.theme:focus .more-details {\n\t\tdisplay: none;\n\t}\n\n\t.theme-browser.rendered .theme:hover .theme-screenshot img,\n\t.theme-browser.rendered .theme:focus .theme-screenshot img {\n\t\topacity: 1.0;\n\t}\n}\n\n@media only screen and (max-width: 480px) {\n\t.theme-browser .theme {\n\t\twidth: 100%;\n\t\tmargin-right: 0;\n\t}\n\n\t.theme-browser .theme:nth-child(2n),\n\t.theme-browser .theme:nth-child(3n) {\n\t\tmargin-right: 0;\n\t}\n}\n\n@media only screen and (max-width: 650px) {\n\t.theme-overlay .theme-update,\n\t.theme-overlay .theme-description {\n\t\tmargin-left: 0;\n\t}\n\n\t.theme-overlay .theme-actions .delete-theme {\n\t\tposition: relative;\n\t\tright: auto;\n\t\tbottom: auto;\n\t}\n\n\t.theme-overlay .theme-actions .inactive-theme {\n\t\tdisplay: inline;\n\t}\n\n\t.theme-overlay .theme-screenshots {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t}\n\n\t.theme-overlay .theme-info {\n\t\twidth: 100%;\n\t}\n\n\t.theme-overlay .theme-author {\n\t\tmargin: 5px 0 15px 0;\n\t}\n\n\t.theme-overlay .current-label {\n\t\tmargin-top: 10px;\n\t\tfont-size: 13px;\n\t}\n\n\t.themes-php .wp-filter-search {\n\t\tfloat: none;\n\t\tclear: both;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tmargin: 10px 0;\n\t\twidth: 100%;\n\t\tmax-width: 280px;\n\t}\n\n\t.theme-browser .theme.add-new-theme span:after {\n\t\tfont: normal 60px/90px dashicons;\n\t\twidth: 80px;\n\t\theight: 80px;\n\t\ttop: 30%;\n\t\tleft: 50%;\n\t\ttext-indent: 0;\n\t\tmargin-left: -40px;\n\t}\n\n\t.single-theme .theme-wrap {\n\t\tmargin: 0 -12px 0 -10px;\n\t\tpadding: 10px;\n\t}\n\t.single-theme .theme-overlay .theme-about {\n\t\tpadding: 10px;\n\t\toverflow: visible;\n\t}\n\t.single-theme .current-label {\n\t\tdisplay: none;\n\t}\n\t.single-theme .theme-overlay .theme-actions {\n\t\tposition: static;\n\t}\n}\n\n.broken-themes {\n\tclear: both;\n}\n\n.broken-themes table {\n\ttext-align: left;\n\twidth: 50%;\n\tborder-spacing: 3px;\n\tpadding: 3px;\n}\n\n\n/*------------------------------------------------------------------------------\n  16.2 - Install Themes\n------------------------------------------------------------------------------*/\n\n/* Already installed theme */\n.theme-browser .theme .theme-installed {\n\tbackground: #0073aa;\n}\n.theme-browser .theme .theme-installed:before {\n\tcontent: \"\\f147\";\n}\n.theme-browser .theme.is-installed .theme-actions .button-primary {\n\tdisplay: none !important;\n}\n\n.theme-install-php .wp-filter {\n\tpadding: 0 20px;\n}\n\n.theme-install-php a.upload,\n.theme-install-php a.browse-themes {\n\tcursor: pointer;\n}\n.theme-install-php a.browse-themes,\n.theme-install-php.show-upload-theme a.upload {\n\tdisplay: none;\n}\n.theme-install-php.show-upload-theme a.browse-themes {\n\tdisplay: inline;\n}\n.upload-theme,\n.upload-plugin {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tdisplay: none;\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 100%;\n\toverflow: hidden;\n\tposition: relative;\n\ttop: 10px;\n}\nbody.show-upload-theme .upload-theme,\n.upload-plugin {\n\tdisplay: block;\n}\n.upload-theme .wp-upload-form,\n.upload-plugin .wp-upload-form {\n\tbackground: #fafafa;\n\tborder: 1px solid #e5e5e5;\n\tpadding: 30px;\n\tmargin: 30px auto;\n\tmax-width: 380px;\n}\n.upload-theme .install-help,\n.upload-plugin .install-help {\n\tcolor: #999;\n\tfont-size: 18px;\n\tfont-style: normal;\n\tmargin: 0;\n\tpadding: 40px 0 0;\n\ttext-align: center;\n}\nbody.show-upload-theme .upload-theme + .wp-filter,\nbody.show-upload-theme .upload-theme + .wp-filter + .theme-browser {\n\tdisplay: none;\n}\n\np.no-themes {\n\tclear: both;\n\tcolor: #666;\n\tfont-size: 18px;\n\tfont-style: normal;\n\tmargin: 0;\n\tpadding: 0;\n\ttext-align: center;\n\tdisplay: none;\n}\nbody.no-results p.no-themes {\n\tdisplay: block;\n}\nbody.show-upload-theme p.no-themes {\n\tdisplay: none !important;\n}\n\n.theme-install-php .add-new-theme {\n\tdisplay: none !important;\n}\n\n@media only screen and (max-width: 1120px) {\n\t.upload-theme .wp-upload-form {\n\t\tmargin: 20px 0;\n\t\tmax-width: 100%;\n\t}\n\t.upload-theme .install-help {\n\t\tfont-size: 15px;\n\t\tpadding: 20px 0 0;\n\t\ttext-align: left;\n\t}\n}\n\n.theme-details .theme-rating {\n\tline-height: 23px;\n}\n\n.theme-details .star-rating {\n\tdisplay: inline;\n}\n\n.theme-details .num-ratings,\n.theme-details .no-rating {\n\tfont-size: 11px;\n\tcolor: #999;\n}\n\n.theme-details .no-rating {\n\tdisplay: block;\n\tline-height: 20px;\n}\n\n/*------------------------------------------------------------------------------\n  16.3 - Custom Header Screen\n------------------------------------------------------------------------------*/\n\n.appearance_page_custom-header #headimg {\n\tborder: 1px solid #DFDFDF;\n\toverflow: hidden;\n\twidth: 100%;\n}\n\n.appearance_page_custom-header #upload-form p label {\n\tfont-size: 12px;\n}\n\n.appearance_page_custom-header .available-headers .default-header {\n\tfloat: left;\n\tmargin: 0 20px 20px 0;\n}\n\n.appearance_page_custom-header .random-header {\n\tclear: both;\n\tmargin: 0 20px 20px 0;\n\tvertical-align: middle;\n}\n\n.appearance_page_custom-header .available-headers label input,\n.appearance_page_custom-header .random-header label input {\n\tmargin-right: 10px;\n}\n\n.appearance_page_custom-header .available-headers label img {\n\tvertical-align: middle;\n}\n\n\n/*------------------------------------------------------------------------------\n  16.4 - Custom Background Screen\n------------------------------------------------------------------------------*/\n\ndiv#custom-background-image {\n\tmin-height: 100px;\n\tborder: 1px solid #dfdfdf;\n}\n\ndiv#custom-background-image img {\n\tmax-width: 400px;\n\tmax-height: 300px;\n}\n\n/*------------------------------------------------------------------------------\n  23.0 - Full Overlay w/ Sidebar\n------------------------------------------------------------------------------*/\n\nbody.full-overlay-active {\n\toverflow: hidden;\n}\n\n.wp-full-overlay {\n\tbackground: transparent;\n\tz-index: 500000;\n\tposition: fixed;\n\toverflow: visible;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 100%;\n\tmin-width: 0;\n}\n\n.wp-full-overlay-sidebar {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tposition: fixed;\n\twidth: 300px;\n\theight: 100%;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tpadding: 0;\n\tmargin: 0;\n\tz-index: 10;\n\tbackground: #eee;\n\tborder-right: none;\n}\n\n.wp-full-overlay.collapsed .wp-full-overlay-sidebar {\n\toverflow: visible;\n}\n\n.wp-full-overlay.collapsed,\n.wp-full-overlay.expanded .wp-full-overlay-sidebar {\n\tmargin-left: 0 !important;\n}\n\n.wp-full-overlay.expanded {\n\tmargin-left: 300px;\n}\n\n.wp-full-overlay.collapsed .wp-full-overlay-sidebar {\n\tmargin-left: -300px;\n}\n\n.wp-full-overlay-sidebar:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tright: 0;\n\twidth: 3px;\n\tz-index: 1000;\n}\n\n.wp-full-overlay-main {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\theight: 100%;\n}\n\n#customize-preview.wp-full-overlay-main {\n\tbackground: url(../images/spinner.gif) no-repeat center center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n}\n\n#customize-preview.wp-full-overlay-main.iframe-ready {\n\tbackground: none;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-header {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\theight: 45px;\n\tpadding: 0 15px;\n\tline-height: 45px;\n\tz-index: 10;\n\tmargin: 0;\n\tborder-top: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-header a.back {\n\tmargin-top: 9px;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-footer {\n\tbottom: 0;\n\tborder-bottom: none;\n\tborder-top: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-full-overlay-sidebar .wp-full-overlay-sidebar-content {\n\tposition: absolute;\n\ttop: 45px;\n\tbottom: 45px;\n\tleft: 0;\n\tright: 0;\n\toverflow: auto;\n}\n\n/* Close & Navigation Links */\n.theme-install-overlay .wp-full-overlay-sidebar .wp-full-overlay-header {\n\tpadding: 0;\n}\n\n.theme-install-overlay .close-full-overlay,\n.theme-install-overlay .previous-theme,\n.theme-install-overlay .next-theme {\n\tdisplay: block;\n\tposition: relative;\n\tfloat: left;\n\twidth: 45px;\n\theight: 45px;\n\tpadding-right: 2px;\n\tbackground: #eee;\n\tborder-right: 1px solid #ddd;\n\tcolor: #444;\n\tcursor: pointer;\n\ttext-decoration: none;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.theme-install-overlay .close-full-overlay:hover,\n.theme-install-overlay .close-full-overlay:focus,\n.theme-install-overlay .previous-theme:hover,\n.theme-install-overlay .previous-theme:focus,\n.theme-install-overlay .next-theme:hover,\n.theme-install-overlay .next-theme:focus {\n\tbackground: #ddd;\n\tborder-color: #ccc;\n\tcolor: #000;\n\toutline: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.theme-install-overlay .close-full-overlay:before {\n\tfont: normal 22px/1 dashicons;\n\tcontent: \"\\f335\";\n\tposition: relative;\n\ttop: 7px;\n\tleft: 13px;\n}\n\n.theme-install-overlay .previous-theme:before {\n\tfont: normal 20px/1 dashicons;\n\tcontent: \"\\f341\";\n\tposition: relative;\n\ttop: 6px;\n\tleft: 14px;\n}\n\n.theme-install-overlay .next-theme:before {\n\tfont: normal 20px/1 dashicons;\n\tcontent: \"\\f345\";\n\tposition: relative;\n\ttop: 6px;\n\tleft: 13px;\n}\n\n.theme-install-overlay .previous-theme.disabled,\n.theme-install-overlay .next-theme.disabled,\n.theme-install-overlay .previous-theme.disabled:hover,\n.theme-install-overlay .previous-theme.disabled:focus,\n.theme-install-overlay .next-theme.disabled:hover,\n.theme-install-overlay .next-theme.disabled:focus {\n\tcolor: #b4b9be;\n\tbackground: #eee;\n\tcursor: default;\n\tpointer-events: none;\n}\n\n/* Collapse Button */\n.wp-core-ui .wp-full-overlay .collapse-sidebar {\n\tposition: fixed;\n\tbottom: 8px;\n\tleft: 10px;\n\tpadding: 0;\n\tcolor: #656a6f;\n\toutline: 0;\n\tline-height: 1;\n\tbackground-color: transparent !important;\n\tborder: none !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n\t-webkit-border-radius: 0 !important;\n\tborder-radius: 0 !important;\n}\n\n.wp-core-ui .wp-full-overlay .collapse-sidebar:hover,\n.wp-core-ui .wp-full-overlay .collapse-sidebar:focus {\n\tcolor: #0073aa;\n}\n\n.wp-full-overlay .collapse-sidebar-arrow,\n.wp-full-overlay .collapse-sidebar-label {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tline-height: 20px;\n}\n\n.wp-full-overlay .collapse-sidebar-arrow {\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 0 2px; /* avoid the focus box-shadow to be cut-off */\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\toverflow: hidden;\n}\n\n.wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow,\n.wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow {\n    -webkit-box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n    box-shadow:\n    \t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.wp-full-overlay .collapse-sidebar-label {\n\tmargin-left: 3px;\n}\n\n.wp-full-overlay.collapsed .collapse-sidebar-label {\n\tdisplay: none;\n}\n\n.wp-full-overlay .collapse-sidebar-arrow:before {\n\tdisplay: block;\n\tcontent: \"\\f148\";\n\tbackground: #eee;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tpadding: 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* rtl:ignore */\n.wp-full-overlay.collapsed .collapse-sidebar-arrow:before,\n.rtl .wp-full-overlay .collapse-sidebar-arrow:before {\n\t-webkit-transform: rotate(180.001deg);\n\t-ms-transform: rotate(180.001deg);\n\ttransform: rotate(180.001deg); /* Firefox: promoting to its own layer to trigger anti-aliasing  */\n}\n\n.rtl .wp-full-overlay.collapsed .collapse-sidebar-arrow:before {\n\t-webkit-transform: none;\n\t-ms-transform: none;\n\ttransform: none;\n}\n\n/* Animations */\n.wp-full-overlay,\n.wp-full-overlay-sidebar,\n.wp-full-overlay .collapse-sidebar,\n.wp-full-overlay-main {\n\t-webkit-transition-property: left, right, top, bottom, width, margin;\n\ttransition-property: left, right, top, bottom, width, margin;\n\t-webkit-transition-duration: 0.2s;\n\ttransition-duration: 0.2s;\n}\n\n/*------------------------------------------------------------------------------\n  24.0 - Customize Loader\n------------------------------------------------------------------------------*/\n\n.no-customize-support .hide-if-no-customize,\n.customize-support .hide-if-customize,\n.no-customize-support.wp-core-ui .hide-if-no-customize,\n.no-customize-support .wp-core-ui .hide-if-no-customize,\n.customize-support.wp-core-ui .hide-if-customize,\n.customize-support .wp-core-ui .hide-if-customize {\n\tdisplay: none;\n}\n\n#customize-container {\n\tdisplay: none;\n\tbackground: #fff;\n\tz-index: 500000;\n\tposition: fixed;\n\toverflow: visible;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 100%;\n}\n\n.customize-active #customize-container {\n\tdisplay: block;\n}\n\n.customize-loading #customize-container iframe {\n\topacity: 0;\n}\n\n.customize-loading #customize-container {\n\tbackground: #fff url(../images/spinner.gif) no-repeat fixed center center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n}\n\n#customize-container iframe,\n.theme-install-overlay iframe {\n\theight: 100%;\n\twidth: 100%;\n\tz-index: 20;\n\t-webkit-transition: opacity 0.3s;\n\ttransition: opacity 0.3s;\n}\n\n#customize-controls {\n\tmargin-top: 0;\n}\n\n.theme-install-overlay {\n\tdisplay: none;\n}\n\n.theme-install-overlay.single-theme {\n\tdisplay: block;\n}\n\n.install-theme-info {\n\tdisplay: none;\n\tpadding: 10px 20px 60px;\n}\n\n.single-theme .install-theme-info {\n\tpadding-top: 15px;\n}\n\n.theme-install-overlay .install-theme-info {\n\tdisplay: block;\n}\n\n.install-theme-info .theme-install {\n\tfloat: right;\n\tmargin-top: 18px;\n}\n\n.install-theme-info .theme-name {\n\tfont-size: 16px;\n\tline-height: 24px;\n\tmargin-bottom: 0;\n\tmargin-top: 0;\n}\n\n.install-theme-info .theme-screenshot {\n\tmargin: 15px 0;\n\twidth: 258px;\n\tborder: 1px solid #ccc;\n}\n\n.install-theme-info .theme-details {\n\toverflow: hidden;\n}\n\n.theme-details .theme-version {\n\tmargin: 15px 0;\n}\n\n.theme-details .theme-description {\n\tfloat: left;\n\tcolor: #777;\n\tline-height: 20px;\n\tmax-width: 100%;\n}\n\n.theme-install-overlay .wp-full-overlay-header .theme-install {\n\tfloat: right;\n\tmargin: 8px 10px 0 0;\n\t/* For when .theme-install is a span rather than a.button-primary (already installed theme) */\n\tline-height: 26px;\n}\n\n.theme-install-overlay .wp-full-overlay-sidebar {\n\tbackground: #eee;\n\tborder-right: 1px solid #ddd;\n}\n\n.theme-install-overlay .wp-full-overlay-sidebar-content {\n\tbackground: #fff;\n\tborder-top: 1px solid #ddd;\n\tborder-bottom: 1px solid #ddd;\n}\n\n.theme-install-overlay .wp-full-overlay-main {\n\tposition: relative;\n\tz-index: 0;\n\tbackground-color: #fff;\n}\n\n.theme-install-overlay .wp-full-overlay-main:before {\n\tcontent: '';\n\tdisplay: block;\n\twidth: 20px;\n\theight: 20px;\n\tposition: absolute;\n\tleft: 50%;\n\ttop: 50%;\n\tz-index: -1;\n\tmargin: -10px 0 0 -10px;\n\t-webkit-transform: translateZ(0);\n\ttransform: translateZ(0);\n\tbackground: #fff url(../images/spinner.gif) no-repeat center center;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n}\n\n.theme-install-overlay.iframe-ready .wp-full-overlay-main:before {\n\tbackground-image: none;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t.wp-full-overlay .collapse-sidebar-arrow {\n\t\tbackground-image: url(../images/arrows-2x.png);\n\t\t-webkit-background-size: 15px 123px;\n\t\tbackground-size: 15px 123px;\n\t}\n\n\t#customize-preview.wp-full-overlay-main,\n\t.customize-loading #customize-container,\n\t.theme-install-overlay .wp-full-overlay-main:before {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n@media screen and ( max-width: 782px ) {\n\t.available-theme .action-links .delete-theme {\n\t\tfloat: none;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tclear: both;\n\t}\n\n\t.available-theme .action-links .delete-theme a {\n\t\tpadding: 0;\n\t}\n\n\t.broken-themes table {\n\t\twidth: 100%;\n\t}\n\n\t.theme-install-overlay .wp-full-overlay-header .theme-install {\n\t\tmargin-top: 6px;\n\t\tline-height: normal;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/widgets-rtl.css",
    "content": "/* General Widgets Styles */\n\n.widget {\n\tmargin: 0 auto 10px;\n\tposition: relative;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.widget-top {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tbackground: #f7f7f7;\n}\n\n.widget-top a.widget-action,\n.widget-top a.widget-action:hover {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\ttext-decoration: none;\n}\n\n.widget-title h3,\n.widget-title h4 {\n\tmargin: 0;\n\tpadding: 15px;\n\tfont-size: 1em;\n\tline-height: 1;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.widgets-holder-wrap .widget-inside {\n\tborder-top: none;\n\tpadding: 1px 15px 15px 15px;\n\tline-height: 16px;\n}\n\n.in-widget-title,\n#widgets-right a.widget-control-edit,\n#available-widgets .widget-description {\n\tcolor: #666;\n}\n\n.deleting .widget-title,\n.deleting .widget-top a.widget-action:after {\n\tcolor: #a0a5aa;\n}\n\n/* Widget Dragging Helpers */\n.widget.ui-draggable-dragging {\n\tmin-width: 100%;\n}\n\n.widget.ui-sortable-helper {\n\topacity: 0.8;\n}\n\n.widget-placeholder {\n\tborder: 1px dashed #b4b9be;\n\tmargin: 0 auto 10px;\n\theight: 45px;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#widgets-right .widget-placeholder {\n\tmargin-top: 0;\n}\n\n#widgets-right .closed .widget-placeholder {\n\theight: 0;\n\tborder: 0;\n\tmargin-top: -10px;\n}\n\n/* Widget Sidebars */\n.sidebar-name {\n\tposition: relative;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.sidebar-name-arrow {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.js .sidebar-name {\n\tcursor: pointer;\n}\n\n.sidebar-name h2,\n.sidebar-name h3 {\n\tmargin: 0;\n\tpadding: 8px 10px;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.widgets-holder-wrap .description {\n\tpadding: 0 0 15px;\n\tmargin: 0;\n\tfont-style: normal;\n\tcolor: #777;\n}\n\n#widgets-right .widgets-holder-wrap .description {\n\tpadding-right: 7px;\n\tpadding-left: 7px;\n}\n\n/* Widgets 2-col Layout */\ndiv.widget-liquid-left {\n\tmargin: 0;\n\twidth: 38%;\n\tfloat: right;\n}\n\ndiv.widget-liquid-right {\n\tfloat: left;\n\twidth: 58%;\n}\n\n/* Widgets Left - Available Widgets */\n\ndiv#widgets-left {\n\tpadding-top: 12px;\n}\n\ndiv#widgets-left .closed .sidebar-name,\ndiv#widgets-left .inactive-sidebar.closed .sidebar-name {\n\tmargin-bottom: 10px;\n}\n\ndiv#widgets-left .sidebar-name h2,\ndiv#widgets-left .sidebar-name h3 {\n\tpadding: 10px 0;\n\tmargin: 0 0 0 10px;\n}\n\n#widgets-left .sidebar-name .sidebar-name-arrow:before {\n\tpadding: 9px;\n}\n\n#widgets-left #available-widgets,\ndiv#widgets-left .widget-holder {\n\tbackground: transparent;\n\tborder: none;\n}\n\n#widgets-left .widgets-holder-wrap {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#available-widgets .widget-action {\n\tdisplay: none;\n}\n\n#available-widgets .widget {\n\tmargin: 0;\n}\n\n#available-widgets .widget:nth-child(odd) {\n\tclear: both;\n}\n\n#available-widgets .widget .widget-description {\n\tdisplay: block;\n\tpadding: 10px 15px;\n\tfont-size: 12px;\n}\n\n#available-widgets #widget-list {\n\tposition: relative;\n}\n\n/* Inactive Sidebars */\n#widgets-left .inactive-sidebar {\n\tclear: both;\n\twidth: 100%;\n\tbackground: transparent;\n\tpadding: 0;\n\tmargin: 0 0 20px 0;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#widgets-left .inactive-sidebar.first {\n\tmargin-top: 40px;\n}\n\n/* Not sure what this is for... */\ndiv#widgets-left .inactive-sidebar .widget.expanded {\n\tright: auto;\n}\n\n.widget-title-action {\n\tfloat: left;\n\tposition: relative;\n}\n\ndiv#widgets-left .inactive-sidebar .widgets-sortables {\n\tmin-height: 42px;\n\tpadding: 0;\n\tbackground: transparent;\n\tmargin: 0;\n\tposition: relative;\n}\n\n/* Widgets Right */\n\ndiv#widgets-right:after {\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tclear: both;\n\tvisibility: hidden;\n}\n\ndiv#widgets-right .sidebars-column-1,\ndiv#widgets-right .sidebars-column-2 {\n\tmax-width: 450px;\n}\n\ndiv#widgets-right .widgets-holder-wrap {\n\tmargin: 10px 0 0 0;\n}\n\ndiv#widgets-right .sidebar-description {\n\tmin-height: 20px;\n\tmargin-top: -5px;\n}\n\ndiv#widgets-right .sidebar-name h2,\ndiv#widgets-right .sidebar-name h3 {\n\tpadding: 15px 7px;\n}\n\ndiv#widgets-right .sidebar-name .sidebar-name-arrow:before {\n\ttop: 2px;\n}\n\ndiv#widgets-right .widget-top {\n\tpadding: 0;\n}\n\ndiv#widgets-right .widgets-sortables {\n\tpadding: 0 8px;\n\tmargin-bottom: 9px;\n\tposition: relative;\n\tmin-height: 123px;\n}\n\ndiv#widgets-right .closed .widgets-sortables {\n\tmin-height: 0;\n\tmargin-bottom: 0;\n}\n\n.sidebar-name .spinner,\n.remove-inactive-widgets .spinner {\n\tfloat: none;\n\tposition: relative;\n\ttop: -2px;\n\tmargin: -5px 5px;\n}\n\n/* Dragging a widget over a closed sidebar */\n#widgets-right .widgets-holder-wrap.widget-hover {\n\tborder-color: #777;\n\t-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n\tbox-shadow: 0 1px 2px rgba(0,0,0,0.3);\n}\n\n/* Accessibility Mode */\n.widgets_access #widgets-left .widget .widget-top {\n\tcursor: auto;\n}\n\n.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description,\n.widgets_access #wpwrap .widgets-holder-wrap.closed .widget,\n.widgets_access #wpwrap .widget-control-edit {\n\tdisplay: block;\n}\n\n.widgets_access #widgets-left .widget .widget-top:hover,\n.widgets_access #widgets-right .widget .widget-top:hover {\n\tborder-color: #ddd;\n}\n\n#available-widgets .widget-control-edit .edit,\n#widgets-left .inactive-sidebar .widget-control-edit .add,\n#widgets-right .widget-control-edit .add {\n\tdisplay: none;\n}\n\n.widget-control-edit {\n\tdisplay: block;\n\tcolor: #666;\n\tbackground: #EEE;\n\tpadding: 0 15px;\n\tline-height: 43px;\n\tborder-right: 1px solid #DDD;\n}\n\n#widgets-left .widget-control-edit:hover,\n#widgets-right .widget-control-edit:hover {\n\tcolor: #fff;\n\tbackground: #444;\n\tborder-right: 0;\n\toutline: 1px solid #444;\n}\n\n.widgets-holder-wrap .sidebar-name,\n.widgets-holder-wrap .sidebar-description {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.editwidget {\n\tmargin: 0 auto;\n}\n\n.editwidget .widget-inside {\n\tdisplay: block;\n\tpadding: 0 15px;\n}\n\n.editwidget .widget-control-actions {\n\tmargin-top: 20px;\n}\n\n.js .widgets-holder-wrap.closed .widget,\n.js .widgets-holder-wrap.closed .sidebar-description,\n.js .widgets-holder-wrap.closed .remove-inactive-widgets,\n.js .closed br.clear {\n\tdisplay: none;\n}\n\n.js .widgets-holder-wrap.closed .widget.ui-sortable-helper {\n\tdisplay: block;\n}\n\n/* Hide Widget Settings by Default */\n.widget-inside,\n.widget-description {\n\tdisplay: none;\n}\n\n.widget-inside {\n\tbackground: #fff;\n}\n\n/* Dragging widgets over the available widget area show's a \"Deactivate\" message */\n#removing-widget {\n\tdisplay: none;\n\tfont-weight: normal;\n\tpadding-right: 15px;\n\tfont-size: 12px;\n\tline-height: 1;\n\tcolor: black;\n}\n\n.js #removing-widget {\n\tcolor: #00a0d2;\n}\n\n.widget-control-noform,\n#access-off,\n.widgets_access .widget-action,\n.widgets_access .sidebar-name-arrow,\n.widgets_access #access-on,\n.widgets_access .widget-holder .description,\n.no-js .widget-holder .description {\n\tdisplay: none;\n}\n\n.widgets_access .widget-holder,\n.widgets_access #widget-list {\n\tpadding-top: 10px;\n}\n\n.widgets_access #access-off {\n\tdisplay: inline;\n}\n\n.widgets_access .sidebar-name,\n.widgets_access .widget .widget-top {\n\tcursor: default;\n}\n\n\n/* Widgets Area Chooser */\n.widget-liquid-left #widgets-left.chooser #available-widgets .widget,\n.widget-liquid-left #widgets-left.chooser .inactive-sidebar {\n\t-webkit-transition: opacity 0.1s linear;\n\ttransition: opacity 0.1s linear;\n}\n\n.widget-liquid-left #widgets-left.chooser #available-widgets .widget,\n.widget-liquid-left #widgets-left.chooser .inactive-sidebar {\n\t/* -webkit-filter: blur(1px); */\n\topacity: 0.2;\n\tpointer-events: none;\n}\n\n.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question {\n\t/* -webkit-filter: none; */\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n.widgets-chooser ul,\n#widgets-left .widget-in-question .widget-top,\n#available-widgets .widget-top:hover,\ndiv#widgets-right .widget-top:hover,\n#widgets-left .widget-top:hover {\n\tborder-color: #999;\n\t-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 2px rgba(0,0,0,0.1);\n}\n\n.widgets-chooser ul.widgets-chooser-sidebars {\n\tmargin: 0;\n\tlist-style-type: none;\n\tmax-height: 300px;\n\toverflow: auto;\n}\n\n.widgets-chooser {\n\tdisplay: none;\n}\n\n.widgets-chooser ul {\n\tborder: 1px solid #ccc;\n}\n\n.widgets-chooser li {\n\tpadding: 10px 35px 10px 15px;\n\tborder-bottom: 1px solid #ccc;\n\tbackground: #fff;\n\tmargin: 0;\n\tcursor: pointer;\n\toutline: none;\n\tposition: relative;\n\t-webkit-transition: background 0.2s ease-in-out;\n\ttransition: background 0.2s ease-in-out;\n}\n\n.widgets-chooser li:hover,\n.widgets-chooser li:focus {\n\tbackground: rgba(255,255,255,0.7);\n}\n\n.widgets-chooser li:focus:before {\n\tcontent: \"\\f147\";\n\tdisplay: block;\n\t-webkit-font-smoothing: antialiased;\n\tfont: normal 26px/1 dashicons;\n\tcolor: #999;\n\tposition: absolute;\n\ttop: 7px;\n\tright: 5px;\n}\n\n.widgets-chooser li:last-child {\n\tborder: none;\n}\n\n.widgets-chooser li.widgets-chooser-selected {\n\tbackground: #00a0d2;\n\tcolor: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n\tcontent: \"\\f147\";\n\tdisplay: block;\n\t-webkit-font-smoothing: antialiased;\n\tfont: normal 26px/1 dashicons;\n\tcolor: #fff;\n\tposition: absolute;\n\ttop: 7px;\n\tright: 5px;\n}\n\n.widgets-chooser .widgets-chooser-actions {\n\tpadding: 10px 0 12px 0;\n\ttext-align: center;\n}\n\n.widgets-chooser button {\n\tmargin-left: 5px;\n}\n\n#available-widgets .widget .widget-top {\n\tcursor: pointer;\n}\n\n#available-widgets .widget.ui-draggable-dragging .widget-top {\n\tcursor: move;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n@media screen and (max-width: 480px) {\n\tdiv.widget-liquid-left {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t\tborder-left: none;\n\t\tpadding-left: 0;\n\t}\n\n\t#widgets-left .sidebar-name {\n\t\tmargin-left: 0;\n\t}\n\n\t#widgets-left #available-widgets .widget-top {\n\t\tmargin-left: 0;\n\t}\n\n\t#widgets-left .inactive-sidebar .widgets-sortables {\n\t\tmargin-left: 0;\n\t}\n\n\tdiv.widget-liquid-right {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t}\n\n\tdiv.widget {\n\t\tmargin: 0 auto 10px !important;\n\t\tmax-width: 480px;\n\t}\n}\n\n@media screen and (max-width: 320px) {\n\tdiv.widget {\n\t\tmax-width: 320px;\n\t}\n}\n\n@media only screen and (min-width: 1250px) {\n\t#widgets-left #available-widgets .widget {\n\t\twidth: 49%;\n\t\tfloat: right;\n\t}\n\n\t.widget.ui-draggable-dragging {\n\t\tmin-width: 49%;\n\t}\n\n\t#widgets-left #available-widgets .widget:nth-child(even) {\n\t\tfloat: left;\n\t}\n\n\t#widgets-right .sidebars-column-1,\n\t#widgets-right .sidebars-column-2 {\n\t\tfloat: right;\n\t\twidth: 49%;\n\t}\n\n\t#widgets-right .sidebars-column-1 {\n\t\tmargin-left: 2%;\n\t}\n\n\t#widgets-right.single-sidebar .sidebars-column-1,\n\t#widgets-right.single-sidebar .sidebars-column-2 {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin: 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/widgets.css",
    "content": "/* General Widgets Styles */\n\n.widget {\n\tmargin: 0 auto 10px;\n\tposition: relative;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.widget-top {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tbackground: #f7f7f7;\n}\n\n.widget-top a.widget-action,\n.widget-top a.widget-action:hover {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n\ttext-decoration: none;\n}\n\n.widget-title h3,\n.widget-title h4 {\n\tmargin: 0;\n\tpadding: 15px;\n\tfont-size: 1em;\n\tline-height: 1;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.widgets-holder-wrap .widget-inside {\n\tborder-top: none;\n\tpadding: 1px 15px 15px 15px;\n\tline-height: 16px;\n}\n\n.in-widget-title,\n#widgets-right a.widget-control-edit,\n#available-widgets .widget-description {\n\tcolor: #666;\n}\n\n.deleting .widget-title,\n.deleting .widget-top a.widget-action:after {\n\tcolor: #a0a5aa;\n}\n\n/* Widget Dragging Helpers */\n.widget.ui-draggable-dragging {\n\tmin-width: 100%;\n}\n\n.widget.ui-sortable-helper {\n\topacity: 0.8;\n}\n\n.widget-placeholder {\n\tborder: 1px dashed #b4b9be;\n\tmargin: 0 auto 10px;\n\theight: 45px;\n\twidth: 100%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#widgets-right .widget-placeholder {\n\tmargin-top: 0;\n}\n\n#widgets-right .closed .widget-placeholder {\n\theight: 0;\n\tborder: 0;\n\tmargin-top: -10px;\n}\n\n/* Widget Sidebars */\n.sidebar-name {\n\tposition: relative;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.sidebar-name-arrow {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n}\n\n.js .sidebar-name {\n\tcursor: pointer;\n}\n\n.sidebar-name h2,\n.sidebar-name h3 {\n\tmargin: 0;\n\tpadding: 8px 10px;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.widgets-holder-wrap .description {\n\tpadding: 0 0 15px;\n\tmargin: 0;\n\tfont-style: normal;\n\tcolor: #777;\n}\n\n#widgets-right .widgets-holder-wrap .description {\n\tpadding-left: 7px;\n\tpadding-right: 7px;\n}\n\n/* Widgets 2-col Layout */\ndiv.widget-liquid-left {\n\tmargin: 0;\n\twidth: 38%;\n\tfloat: left;\n}\n\ndiv.widget-liquid-right {\n\tfloat: right;\n\twidth: 58%;\n}\n\n/* Widgets Left - Available Widgets */\n\ndiv#widgets-left {\n\tpadding-top: 12px;\n}\n\ndiv#widgets-left .closed .sidebar-name,\ndiv#widgets-left .inactive-sidebar.closed .sidebar-name {\n\tmargin-bottom: 10px;\n}\n\ndiv#widgets-left .sidebar-name h2,\ndiv#widgets-left .sidebar-name h3 {\n\tpadding: 10px 0;\n\tmargin: 0 10px 0 0;\n}\n\n#widgets-left .sidebar-name .sidebar-name-arrow:before {\n\tpadding: 9px;\n}\n\n#widgets-left #available-widgets,\ndiv#widgets-left .widget-holder {\n\tbackground: transparent;\n\tborder: none;\n}\n\n#widgets-left .widgets-holder-wrap {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#available-widgets .widget-action {\n\tdisplay: none;\n}\n\n#available-widgets .widget {\n\tmargin: 0;\n}\n\n#available-widgets .widget:nth-child(odd) {\n\tclear: both;\n}\n\n#available-widgets .widget .widget-description {\n\tdisplay: block;\n\tpadding: 10px 15px;\n\tfont-size: 12px;\n}\n\n#available-widgets #widget-list {\n\tposition: relative;\n}\n\n/* Inactive Sidebars */\n#widgets-left .inactive-sidebar {\n\tclear: both;\n\twidth: 100%;\n\tbackground: transparent;\n\tpadding: 0;\n\tmargin: 0 0 20px 0;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#widgets-left .inactive-sidebar.first {\n\tmargin-top: 40px;\n}\n\n/* Not sure what this is for... */\ndiv#widgets-left .inactive-sidebar .widget.expanded {\n\tleft: auto;\n}\n\n.widget-title-action {\n\tfloat: right;\n\tposition: relative;\n}\n\ndiv#widgets-left .inactive-sidebar .widgets-sortables {\n\tmin-height: 42px;\n\tpadding: 0;\n\tbackground: transparent;\n\tmargin: 0;\n\tposition: relative;\n}\n\n/* Widgets Right */\n\ndiv#widgets-right:after {\n\tcontent: \".\";\n\tdisplay: block;\n\theight: 0;\n\tclear: both;\n\tvisibility: hidden;\n}\n\ndiv#widgets-right .sidebars-column-1,\ndiv#widgets-right .sidebars-column-2 {\n\tmax-width: 450px;\n}\n\ndiv#widgets-right .widgets-holder-wrap {\n\tmargin: 10px 0 0 0;\n}\n\ndiv#widgets-right .sidebar-description {\n\tmin-height: 20px;\n\tmargin-top: -5px;\n}\n\ndiv#widgets-right .sidebar-name h2,\ndiv#widgets-right .sidebar-name h3 {\n\tpadding: 15px 7px;\n}\n\ndiv#widgets-right .sidebar-name .sidebar-name-arrow:before {\n\ttop: 2px;\n}\n\ndiv#widgets-right .widget-top {\n\tpadding: 0;\n}\n\ndiv#widgets-right .widgets-sortables {\n\tpadding: 0 8px;\n\tmargin-bottom: 9px;\n\tposition: relative;\n\tmin-height: 123px;\n}\n\ndiv#widgets-right .closed .widgets-sortables {\n\tmin-height: 0;\n\tmargin-bottom: 0;\n}\n\n.sidebar-name .spinner,\n.remove-inactive-widgets .spinner {\n\tfloat: none;\n\tposition: relative;\n\ttop: -2px;\n\tmargin: -5px 5px;\n}\n\n/* Dragging a widget over a closed sidebar */\n#widgets-right .widgets-holder-wrap.widget-hover {\n\tborder-color: #777;\n\t-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n\tbox-shadow: 0 1px 2px rgba(0,0,0,0.3);\n}\n\n/* Accessibility Mode */\n.widgets_access #widgets-left .widget .widget-top {\n\tcursor: auto;\n}\n\n.widgets_access #wpwrap .widgets-holder-wrap.closed .sidebar-description,\n.widgets_access #wpwrap .widgets-holder-wrap.closed .widget,\n.widgets_access #wpwrap .widget-control-edit {\n\tdisplay: block;\n}\n\n.widgets_access #widgets-left .widget .widget-top:hover,\n.widgets_access #widgets-right .widget .widget-top:hover {\n\tborder-color: #ddd;\n}\n\n#available-widgets .widget-control-edit .edit,\n#widgets-left .inactive-sidebar .widget-control-edit .add,\n#widgets-right .widget-control-edit .add {\n\tdisplay: none;\n}\n\n.widget-control-edit {\n\tdisplay: block;\n\tcolor: #666;\n\tbackground: #EEE;\n\tpadding: 0 15px;\n\tline-height: 43px;\n\tborder-left: 1px solid #DDD;\n}\n\n#widgets-left .widget-control-edit:hover,\n#widgets-right .widget-control-edit:hover {\n\tcolor: #fff;\n\tbackground: #444;\n\tborder-left: 0;\n\toutline: 1px solid #444;\n}\n\n.widgets-holder-wrap .sidebar-name,\n.widgets-holder-wrap .sidebar-description {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.editwidget {\n\tmargin: 0 auto;\n}\n\n.editwidget .widget-inside {\n\tdisplay: block;\n\tpadding: 0 15px;\n}\n\n.editwidget .widget-control-actions {\n\tmargin-top: 20px;\n}\n\n.js .widgets-holder-wrap.closed .widget,\n.js .widgets-holder-wrap.closed .sidebar-description,\n.js .widgets-holder-wrap.closed .remove-inactive-widgets,\n.js .closed br.clear {\n\tdisplay: none;\n}\n\n.js .widgets-holder-wrap.closed .widget.ui-sortable-helper {\n\tdisplay: block;\n}\n\n/* Hide Widget Settings by Default */\n.widget-inside,\n.widget-description {\n\tdisplay: none;\n}\n\n.widget-inside {\n\tbackground: #fff;\n}\n\n/* Dragging widgets over the available widget area show's a \"Deactivate\" message */\n#removing-widget {\n\tdisplay: none;\n\tfont-weight: normal;\n\tpadding-left: 15px;\n\tfont-size: 12px;\n\tline-height: 1;\n\tcolor: black;\n}\n\n.js #removing-widget {\n\tcolor: #00a0d2;\n}\n\n.widget-control-noform,\n#access-off,\n.widgets_access .widget-action,\n.widgets_access .sidebar-name-arrow,\n.widgets_access #access-on,\n.widgets_access .widget-holder .description,\n.no-js .widget-holder .description {\n\tdisplay: none;\n}\n\n.widgets_access .widget-holder,\n.widgets_access #widget-list {\n\tpadding-top: 10px;\n}\n\n.widgets_access #access-off {\n\tdisplay: inline;\n}\n\n.widgets_access .sidebar-name,\n.widgets_access .widget .widget-top {\n\tcursor: default;\n}\n\n\n/* Widgets Area Chooser */\n.widget-liquid-left #widgets-left.chooser #available-widgets .widget,\n.widget-liquid-left #widgets-left.chooser .inactive-sidebar {\n\t-webkit-transition: opacity 0.1s linear;\n\ttransition: opacity 0.1s linear;\n}\n\n.widget-liquid-left #widgets-left.chooser #available-widgets .widget,\n.widget-liquid-left #widgets-left.chooser .inactive-sidebar {\n\t/* -webkit-filter: blur(1px); */\n\topacity: 0.2;\n\tpointer-events: none;\n}\n\n.widget-liquid-left #widgets-left.chooser #available-widgets .widget-in-question {\n\t/* -webkit-filter: none; */\n\topacity: 1;\n\tpointer-events: auto;\n}\n\n.widgets-chooser ul,\n#widgets-left .widget-in-question .widget-top,\n#available-widgets .widget-top:hover,\ndiv#widgets-right .widget-top:hover,\n#widgets-left .widget-top:hover {\n\tborder-color: #999;\n\t-webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.1);\n\tbox-shadow: 0 1px 2px rgba(0,0,0,0.1);\n}\n\n.widgets-chooser ul.widgets-chooser-sidebars {\n\tmargin: 0;\n\tlist-style-type: none;\n\tmax-height: 300px;\n\toverflow: auto;\n}\n\n.widgets-chooser {\n\tdisplay: none;\n}\n\n.widgets-chooser ul {\n\tborder: 1px solid #ccc;\n}\n\n.widgets-chooser li {\n\tpadding: 10px 15px 10px 35px;\n\tborder-bottom: 1px solid #ccc;\n\tbackground: #fff;\n\tmargin: 0;\n\tcursor: pointer;\n\toutline: none;\n\tposition: relative;\n\t-webkit-transition: background 0.2s ease-in-out;\n\ttransition: background 0.2s ease-in-out;\n}\n\n.widgets-chooser li:hover,\n.widgets-chooser li:focus {\n\tbackground: rgba(255,255,255,0.7);\n}\n\n.widgets-chooser li:focus:before {\n\tcontent: \"\\f147\";\n\tdisplay: block;\n\t-webkit-font-smoothing: antialiased;\n\tfont: normal 26px/1 dashicons;\n\tcolor: #999;\n\tposition: absolute;\n\ttop: 7px;\n\tleft: 5px;\n}\n\n.widgets-chooser li:last-child {\n\tborder: none;\n}\n\n.widgets-chooser li.widgets-chooser-selected {\n\tbackground: #00a0d2;\n\tcolor: #fff;\n}\n\n.widgets-chooser li.widgets-chooser-selected:before,\n.widgets-chooser li.widgets-chooser-selected:focus:before {\n\tcontent: \"\\f147\";\n\tdisplay: block;\n\t-webkit-font-smoothing: antialiased;\n\tfont: normal 26px/1 dashicons;\n\tcolor: #fff;\n\tposition: absolute;\n\ttop: 7px;\n\tleft: 5px;\n}\n\n.widgets-chooser .widgets-chooser-actions {\n\tpadding: 10px 0 12px 0;\n\ttext-align: center;\n}\n\n.widgets-chooser button {\n\tmargin-right: 5px;\n}\n\n#available-widgets .widget .widget-top {\n\tcursor: pointer;\n}\n\n#available-widgets .widget.ui-draggable-dragging .widget-top {\n\tcursor: move;\n}\n\n/* =Media Queries\n-------------------------------------------------------------- */\n\n@media screen and (max-width: 480px) {\n\tdiv.widget-liquid-left {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t\tborder-right: none;\n\t\tpadding-right: 0;\n\t}\n\n\t#widgets-left .sidebar-name {\n\t\tmargin-right: 0;\n\t}\n\n\t#widgets-left #available-widgets .widget-top {\n\t\tmargin-right: 0;\n\t}\n\n\t#widgets-left .inactive-sidebar .widgets-sortables {\n\t\tmargin-right: 0;\n\t}\n\n\tdiv.widget-liquid-right {\n\t\twidth: 100%;\n\t\tfloat: none;\n\t}\n\n\tdiv.widget {\n\t\tmargin: 0 auto 10px !important;\n\t\tmax-width: 480px;\n\t}\n}\n\n@media screen and (max-width: 320px) {\n\tdiv.widget {\n\t\tmax-width: 320px;\n\t}\n}\n\n@media only screen and (min-width: 1250px) {\n\t#widgets-left #available-widgets .widget {\n\t\twidth: 49%;\n\t\tfloat: left;\n\t}\n\n\t.widget.ui-draggable-dragging {\n\t\tmin-width: 49%;\n\t}\n\n\t#widgets-left #available-widgets .widget:nth-child(even) {\n\t\tfloat: right;\n\t}\n\n\t#widgets-right .sidebars-column-1,\n\t#widgets-right .sidebars-column-2 {\n\t\tfloat: left;\n\t\twidth: 49%;\n\t}\n\n\t#widgets-right .sidebars-column-1 {\n\t\tmargin-right: 2%;\n\t}\n\n\t#widgets-right.single-sidebar .sidebars-column-1,\n\t#widgets-right.single-sidebar .sidebars-column-2 {\n\t\tfloat: none;\n\t\twidth: 100%;\n\t\tmargin: 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/wp-admin-rtl.css",
    "content": "@import url(common-rtl.css);\n@import url(forms-rtl.css);\n@import url(admin-menu-rtl.css);\n@import url(dashboard-rtl.css);\n@import url(list-tables-rtl.css);\n@import url(edit-rtl.css);\n@import url(revisions-rtl.css);\n@import url(media-rtl.css);\n@import url(themes-rtl.css);\n@import url(about-rtl.css);\n@import url(nav-menus-rtl.css);\n@import url(widgets-rtl.css);\n@import url(site-icon-rtl.css);\n@import url(l10n-rtl.css);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/css/wp-admin.css",
    "content": "@import url(common.css);\n@import url(forms.css);\n@import url(admin-menu.css);\n@import url(dashboard.css);\n@import url(list-tables.css);\n@import url(edit.css);\n@import url(revisions.css);\n@import url(media.css);\n@import url(themes.css);\n@import url(about.css);\n@import url(nav-menus.css);\n@import url(widgets.css);\n@import url(site-icon.css);\n@import url(l10n.css);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/custom-background.php",
    "content": "<?php\n/**\n * The custom background script.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * The custom background class.\n *\n * @since 3.0.0\n * @package WordPress\n * @subpackage Administration\n */\nclass Custom_Background {\n\n\t/**\n\t * Callback for administration header.\n\t *\n\t * @var callable\n\t * @since 3.0.0\n\t */\n\tpublic $admin_header_callback;\n\n\t/**\n\t * Callback for header div.\n\t *\n\t * @var callable\n\t * @since 3.0.0\n\t */\n\tpublic $admin_image_div_callback;\n\n\t/**\n\t * Used to trigger a success message when settings updated and set to true.\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t * @var bool\n\t */\n\tprivate $updated;\n\n\t/**\n\t * Constructor - Register administration header callback.\n\t *\n\t * @since 3.0.0\n\t * @param callable $admin_header_callback\n\t * @param callable $admin_image_div_callback Optional custom image div output callback.\n\t */\n\tpublic function __construct($admin_header_callback = '', $admin_image_div_callback = '') {\n\t\t$this->admin_header_callback = $admin_header_callback;\n\t\t$this->admin_image_div_callback = $admin_image_div_callback;\n\n\t\tadd_action( 'admin_menu', array( $this, 'init' ) );\n\n\t\tadd_action( 'wp_ajax_custom-background-add', array( $this, 'ajax_background_add' ) );\n\n\t\t// Unused since 3.5.0.\n\t\tadd_action( 'wp_ajax_set-background-image', array( $this, 'wp_set_background_image' ) );\n\t}\n\n\t/**\n\t * Set up the hooks for the Custom Background admin page.\n\t *\n\t * @since 3.0.0\n\t */\n\tpublic function init() {\n\t\t$page = add_theme_page( __( 'Background' ), __( 'Background' ), 'edit_theme_options', 'custom-background', array( $this, 'admin_page' ) );\n\t\tif ( ! $page ) {\n\t\t\treturn;\n\t\t}\n\n\t\tadd_action( \"load-$page\", array( $this, 'admin_load' ) );\n\t\tadd_action( \"load-$page\", array( $this, 'take_action' ), 49 );\n\t\tadd_action( \"load-$page\", array( $this, 'handle_upload' ), 49 );\n\n\t\tif ( $this->admin_header_callback ) {\n\t\t\tadd_action( \"admin_head-$page\", $this->admin_header_callback, 51 );\n\t\t}\n\t}\n\n\t/**\n\t * Set up the enqueue for the CSS & JavaScript files.\n\t *\n\t * @since 3.0.0\n\t */\n\tpublic function admin_load() {\n\t\tget_current_screen()->add_help_tab( array(\n\t\t\t'id'      => 'overview',\n\t\t\t'title'   => __('Overview'),\n\t\t\t'content' =>\n\t\t\t\t'<p>' . __( 'You can customize the look of your site without touching any of your theme&#8217;s code by using a custom background. Your background can be an image or a color.' ) . '</p>' .\n\t\t\t\t'<p>' . __( 'To use a background image, simply upload it or choose an image that has already been uploaded to your Media Library by clicking the &#8220;Choose Image&#8221; button. You can display a single instance of your image, or tile it to fill the screen. You can have your background fixed in place, so your site content moves on top of it, or you can have it scroll with your site.' ) . '</p>' .\n\t\t\t\t'<p>' . __( 'You can also choose a background color by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. &#8220;#ff0000&#8221; for red, or by choosing a color using the color picker.' ) . '</p>' .\n\t\t\t\t'<p>' . __( 'Don&#8217;t forget to click on the Save Changes button when you are finished.' ) . '</p>'\n\t\t) );\n\n\t\tget_current_screen()->set_help_sidebar(\n\t\t\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t\t\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Appearance_Background_Screen\" target=\"_blank\">Documentation on Custom Background</a>' ) . '</p>' .\n\t\t\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n\t\t);\n\n\t\twp_enqueue_media();\n\t\twp_enqueue_script('custom-background');\n\t\twp_enqueue_style('wp-color-picker');\n\t}\n\n\t/**\n\t * Execute custom background modification.\n\t *\n\t * @since 3.0.0\n\t */\n\tpublic function take_action() {\n\t\tif ( empty($_POST) )\n\t\t\treturn;\n\n\t\tif ( isset($_POST['reset-background']) ) {\n\t\t\tcheck_admin_referer('custom-background-reset', '_wpnonce-custom-background-reset');\n\t\t\tremove_theme_mod('background_image');\n\t\t\tremove_theme_mod('background_image_thumb');\n\t\t\t$this->updated = true;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isset($_POST['remove-background']) ) {\n\t\t\t// @TODO: Uploaded files are not removed here.\n\t\t\tcheck_admin_referer('custom-background-remove', '_wpnonce-custom-background-remove');\n\t\t\tset_theme_mod('background_image', '');\n\t\t\tset_theme_mod('background_image_thumb', '');\n\t\t\t$this->updated = true;\n\t\t\twp_safe_redirect( $_POST['_wp_http_referer'] );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isset($_POST['background-repeat']) ) {\n\t\t\tcheck_admin_referer('custom-background');\n\t\t\tif ( in_array($_POST['background-repeat'], array('repeat', 'no-repeat', 'repeat-x', 'repeat-y')) )\n\t\t\t\t$repeat = $_POST['background-repeat'];\n\t\t\telse\n\t\t\t\t$repeat = 'repeat';\n\t\t\tset_theme_mod('background_repeat', $repeat);\n\t\t}\n\n\t\tif ( isset($_POST['background-position-x']) ) {\n\t\t\tcheck_admin_referer('custom-background');\n\t\t\tif ( in_array($_POST['background-position-x'], array('center', 'right', 'left')) )\n\t\t\t\t$position = $_POST['background-position-x'];\n\t\t\telse\n\t\t\t\t$position = 'left';\n\t\t\tset_theme_mod('background_position_x', $position);\n\t\t}\n\n\t\tif ( isset($_POST['background-attachment']) ) {\n\t\t\tcheck_admin_referer('custom-background');\n\t\t\tif ( in_array($_POST['background-attachment'], array('fixed', 'scroll')) )\n\t\t\t\t$attachment = $_POST['background-attachment'];\n\t\t\telse\n\t\t\t\t$attachment = 'fixed';\n\t\t\tset_theme_mod('background_attachment', $attachment);\n\t\t}\n\n\t\tif ( isset($_POST['background-color']) ) {\n\t\t\tcheck_admin_referer('custom-background');\n\t\t\t$color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['background-color']);\n\t\t\tif ( strlen($color) == 6 || strlen($color) == 3 )\n\t\t\t\tset_theme_mod('background_color', $color);\n\t\t\telse\n\t\t\t\tset_theme_mod('background_color', '');\n\t\t}\n\n\t\t$this->updated = true;\n\t}\n\n\t/**\n\t * Display the custom background page.\n\t *\n\t * @since 3.0.0\n\t */\n\tpublic function admin_page() {\n?>\n<div class=\"wrap\" id=\"custom-background\">\n<h1><?php _e( 'Custom Background' ); ?></h1>\n\n<?php if ( current_user_can( 'customize' ) ) { ?>\n<div class=\"notice notice-info hide-if-no-customize\">\n\t<p>\n\t\t<?php\n\t\tprintf(\n\t\t\t__( 'You can now manage and live-preview Custom Backgrounds in the <a href=\"%1$s\">Customizer</a>.' ),\n\t\t\tadmin_url( 'customize.php?autofocus[control]=background_image' )\n\t\t);\n\t\t?>\n\t</p>\n</div>\n<?php } ?>\n\n<?php if ( ! empty( $this->updated ) ) { ?>\n<div id=\"message\" class=\"updated\">\n<p><?php printf( __( 'Background updated. <a href=\"%s\">Visit your site</a> to see how it looks.' ), home_url( '/' ) ); ?></p>\n</div>\n<?php } ?>\n\n<h3><?php _e( 'Background Image' ); ?></h3>\n\n<table class=\"form-table\">\n<tbody>\n<tr>\n<th scope=\"row\"><?php _e( 'Preview' ); ?></th>\n<td>\n\t<?php\n\tif ( $this->admin_image_div_callback ) {\n\t\tcall_user_func( $this->admin_image_div_callback );\n\t} else {\n\t\t$background_styles = '';\n\t\tif ( $bgcolor = get_background_color() )\n\t\t\t$background_styles .= 'background-color: #' . $bgcolor . ';';\n\n\t\t$background_image_thumb = get_background_image();\n\t\tif ( $background_image_thumb ) {\n\t\t\t$background_image_thumb = esc_url( set_url_scheme( get_theme_mod( 'background_image_thumb', str_replace( '%', '%%', $background_image_thumb ) ) ) );\n\n\t\t\t// Background-image URL must be single quote, see below.\n\t\t\t$background_styles .= ' background-image: url(\\'' . $background_image_thumb . '\\');'\n\t\t\t\t. ' background-repeat: ' . get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) . ';'\n\t\t\t\t. ' background-position: top ' . get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );\n\t\t}\n\t?>\n\t<div id=\"custom-background-image\" style=\"<?php echo $background_styles; ?>\"><?php // must be double quote, see above ?>\n\t\t<?php if ( $background_image_thumb ) { ?>\n\t\t<img class=\"custom-background-image\" src=\"<?php echo $background_image_thumb; ?>\" style=\"visibility:hidden;\" alt=\"\" /><br />\n\t\t<img class=\"custom-background-image\" src=\"<?php echo $background_image_thumb; ?>\" style=\"visibility:hidden;\" alt=\"\" />\n\t\t<?php } ?>\n\t</div>\n\t<?php } ?>\n</td>\n</tr>\n\n<?php if ( get_background_image() ) : ?>\n<tr>\n<th scope=\"row\"><?php _e('Remove Image'); ?></th>\n<td>\n<form method=\"post\">\n<?php wp_nonce_field('custom-background-remove', '_wpnonce-custom-background-remove'); ?>\n<?php submit_button( __( 'Remove Background Image' ), 'button', 'remove-background', false ); ?><br/>\n<?php _e('This will remove the background image. You will not be able to restore any customizations.') ?>\n</form>\n</td>\n</tr>\n<?php endif; ?>\n\n<?php $default_image = get_theme_support( 'custom-background', 'default-image' ); ?>\n<?php if ( $default_image && get_background_image() != $default_image ) : ?>\n<tr>\n<th scope=\"row\"><?php _e('Restore Original Image'); ?></th>\n<td>\n<form method=\"post\">\n<?php wp_nonce_field('custom-background-reset', '_wpnonce-custom-background-reset'); ?>\n<?php submit_button( __( 'Restore Original Image' ), 'button', 'reset-background', false ); ?><br/>\n<?php _e('This will restore the original background image. You will not be able to restore any customizations.') ?>\n</form>\n</td>\n</tr>\n<?php endif; ?>\n\n<?php if ( current_user_can( 'upload_files' ) ): ?>\n<tr>\n<th scope=\"row\"><?php _e('Select Image'); ?></th>\n<td><form enctype=\"multipart/form-data\" id=\"upload-form\" class=\"wp-upload-form\" method=\"post\">\n\t<p>\n\t\t<label for=\"upload\"><?php _e( 'Choose an image from your computer:' ); ?></label><br />\n\t\t<input type=\"file\" id=\"upload\" name=\"import\" />\n\t\t<input type=\"hidden\" name=\"action\" value=\"save\" />\n\t\t<?php wp_nonce_field( 'custom-background-upload', '_wpnonce-custom-background-upload' ); ?>\n\t\t<?php submit_button( __( 'Upload' ), 'button', 'submit', false ); ?>\n\t</p>\n\t<p>\n\t\t<label for=\"choose-from-library-link\"><?php _e( 'Or choose an image from your media library:' ); ?></label><br />\n\t\t<button id=\"choose-from-library-link\" class=\"button\"\n\t\t\tdata-choose=\"<?php esc_attr_e( 'Choose a Background Image' ); ?>\"\n\t\t\tdata-update=\"<?php esc_attr_e( 'Set as background' ); ?>\"><?php _e( 'Choose Image' ); ?></button>\n\t</p>\n\t</form>\n</td>\n</tr>\n<?php endif; ?>\n</tbody>\n</table>\n\n<h3><?php _e('Display Options') ?></h3>\n<form method=\"post\">\n<table class=\"form-table\">\n<tbody>\n<?php if ( get_background_image() ) : ?>\n<tr>\n<th scope=\"row\"><?php _e( 'Position' ); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e( 'Background Position' ); ?></span></legend>\n<label>\n<input name=\"background-position-x\" type=\"radio\" value=\"left\"<?php checked( 'left', get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) ); ?> />\n<?php _e('Left') ?>\n</label>\n<label>\n<input name=\"background-position-x\" type=\"radio\" value=\"center\"<?php checked( 'center', get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) ); ?> />\n<?php _e('Center') ?>\n</label>\n<label>\n<input name=\"background-position-x\" type=\"radio\" value=\"right\"<?php checked( 'right', get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) ) ); ?> />\n<?php _e('Right') ?>\n</label>\n</fieldset></td>\n</tr>\n\n<tr>\n<th scope=\"row\"><?php _e( 'Repeat' ); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e( 'Background Repeat' ); ?></span></legend>\n<label><input type=\"radio\" name=\"background-repeat\" value=\"no-repeat\"<?php checked( 'no-repeat', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?> /> <?php _e('No Repeat'); ?></label>\n\t<label><input type=\"radio\" name=\"background-repeat\" value=\"repeat\"<?php checked( 'repeat', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?> /> <?php _e('Tile'); ?></label>\n\t<label><input type=\"radio\" name=\"background-repeat\" value=\"repeat-x\"<?php checked( 'repeat-x', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?> /> <?php _e('Tile Horizontally'); ?></label>\n\t<label><input type=\"radio\" name=\"background-repeat\" value=\"repeat-y\"<?php checked( 'repeat-y', get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) ) ); ?> /> <?php _e('Tile Vertically'); ?></label>\n</fieldset></td>\n</tr>\n\n<tr>\n<th scope=\"row\"><?php _ex( 'Attachment', 'Background Attachment' ); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e( 'Background Attachment' ); ?></span></legend>\n<label>\n<input name=\"background-attachment\" type=\"radio\" value=\"scroll\" <?php checked( 'scroll', get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) ) ); ?> />\n<?php _e( 'Scroll' ); ?>\n</label>\n<label>\n<input name=\"background-attachment\" type=\"radio\" value=\"fixed\" <?php checked( 'fixed', get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) ) ); ?> />\n<?php _e( 'Fixed' ); ?>\n</label>\n</fieldset></td>\n</tr>\n<?php endif; // get_background_image() ?>\n<tr>\n<th scope=\"row\"><?php _e( 'Background Color' ); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e( 'Background Color' ); ?></span></legend>\n<?php\n$default_color = '';\nif ( current_theme_supports( 'custom-background', 'default-color' ) )\n\t$default_color = ' data-default-color=\"#' . esc_attr( get_theme_support( 'custom-background', 'default-color' ) ) . '\"';\n?>\n<input type=\"text\" name=\"background-color\" id=\"background-color\" value=\"#<?php echo esc_attr( get_background_color() ); ?>\"<?php echo $default_color ?> />\n</fieldset></td>\n</tr>\n</tbody>\n</table>\n\n<?php wp_nonce_field('custom-background'); ?>\n<?php submit_button( null, 'primary', 'save-background-options' ); ?>\n</form>\n\n</div>\n<?php\n\t}\n\n\t/**\n\t * Handle an Image upload for the background image.\n\t *\n\t * @since 3.0.0\n\t */\n\tpublic function handle_upload() {\n\t\tif ( empty($_FILES) )\n\t\t\treturn;\n\n\t\tcheck_admin_referer('custom-background-upload', '_wpnonce-custom-background-upload');\n\t\t$overrides = array('test_form' => false);\n\n\t\t$uploaded_file = $_FILES['import'];\n\t\t$wp_filetype = wp_check_filetype_and_ext( $uploaded_file['tmp_name'], $uploaded_file['name'] );\n\t\tif ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) )\n\t\t\twp_die( __( 'The uploaded file is not a valid image. Please try again.' ) );\n\n\t\t$file = wp_handle_upload($uploaded_file, $overrides);\n\n\t\tif ( isset($file['error']) )\n\t\t\twp_die( $file['error'] );\n\n\t\t$url = $file['url'];\n\t\t$type = $file['type'];\n\t\t$file = $file['file'];\n\t\t$filename = basename($file);\n\n\t\t// Construct the object array\n\t\t$object = array(\n\t\t\t'post_title' => $filename,\n\t\t\t'post_content' => $url,\n\t\t\t'post_mime_type' => $type,\n\t\t\t'guid' => $url,\n\t\t\t'context' => 'custom-background'\n\t\t);\n\n\t\t// Save the data\n\t\t$id = wp_insert_attachment($object, $file);\n\n\t\t// Add the meta-data\n\t\twp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );\n\t\tupdate_post_meta( $id, '_wp_attachment_is_custom_background', get_option('stylesheet' ) );\n\n\t\tset_theme_mod('background_image', esc_url_raw($url));\n\n\t\t$thumbnail = wp_get_attachment_image_src( $id, 'thumbnail' );\n\t\tset_theme_mod('background_image_thumb', esc_url_raw( $thumbnail[0] ) );\n\n\t\t/** This action is documented in wp-admin/custom-header.php */\n\t\tdo_action( 'wp_create_file_in_uploads', $file, $id ); // For replication\n\t\t$this->updated = true;\n\t}\n\n\t/**\n\t * AJAX handler for adding custom background context to an attachment.\n\t *\n\t * Triggered when the user adds a new background image from the\n\t * Media Manager.\n\t *\n\t * @since 4.1.0\n\t */\n\tpublic function ajax_background_add() {\n\t\tcheck_ajax_referer( 'background-add', 'nonce' );\n\n\t\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\t$attachment_id = absint( $_POST['attachment_id'] );\n\t\tif ( $attachment_id < 1 ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\tupdate_post_meta( $attachment_id, '_wp_attachment_is_custom_background', get_stylesheet() );\n\n\t\twp_send_json_success();\n\t}\n\n\t/**\n\t *\n\t * @since 3.4.0\n\t * @deprecated 3.5.0\n\t *\n\t * @param array $form_fields\n\t * @return array $form_fields\n\t */\n\tpublic function attachment_fields_to_edit( $form_fields ) {\n\t\treturn $form_fields;\n\t}\n\n\t/**\n\t *\n\t * @since 3.4.0\n\t * @deprecated 3.5.0\n\t *\n\t * @param array $tabs\n\t * @return array $tabs\n\t */\n\tpublic function filter_upload_tabs( $tabs ) {\n\t\treturn $tabs;\n\t}\n\n\t/**\n\t *\n\t * @since 3.4.0\n\t * @deprecated 3.5.0\n\t */\n\tpublic function wp_set_background_image() {\n\t\tif ( ! current_user_can('edit_theme_options') || ! isset( $_POST['attachment_id'] ) ) exit;\n\t\t$attachment_id = absint($_POST['attachment_id']);\n\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\t$sizes = array_keys(apply_filters( 'image_size_names_choose', array('thumbnail' => __('Thumbnail'), 'medium' => __('Medium'), 'large' => __('Large'), 'full' => __('Full Size')) ));\n\t\t$size = 'thumbnail';\n\t\tif ( in_array( $_POST['size'], $sizes ) )\n\t\t\t$size = esc_attr( $_POST['size'] );\n\n\t\tupdate_post_meta( $attachment_id, '_wp_attachment_is_custom_background', get_option('stylesheet' ) );\n\t\t$url = wp_get_attachment_image_src( $attachment_id, $size );\n\t\t$thumbnail = wp_get_attachment_image_src( $attachment_id, 'thumbnail' );\n\t\tset_theme_mod( 'background_image', esc_url_raw( $url[0] ) );\n\t\tset_theme_mod( 'background_image_thumb', esc_url_raw( $thumbnail[0] ) );\n\t\texit;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/custom-header.php",
    "content": "<?php\n/**\n * The custom header image script.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * The custom header image class.\n *\n * @since 2.1.0\n * @package WordPress\n * @subpackage Administration\n */\nclass Custom_Image_Header {\n\n\t/**\n\t * Callback for administration header.\n\t *\n\t * @var callable\n\t * @since 2.1.0\n\t */\n\tpublic $admin_header_callback;\n\n\t/**\n\t * Callback for header div.\n\t *\n\t * @var callable\n\t * @since 3.0.0\n\t */\n\tpublic $admin_image_div_callback;\n\n\t/**\n\t * Holds default headers.\n\t *\n\t * @var array\n\t * @since 3.0.0\n\t * @access private\n\t */\n\tpublic $default_headers = array();\n\n\t/**\n\t * Used to trigger a success message when settings updated and set to true.\n \t *\n\t * @since 3.0.0\n\t * @access private\n\t * @var bool\n\t */\n\tprivate $updated;\n\n\t/**\n\t * Constructor - Register administration header callback.\n\t *\n\t * @since 2.1.0\n\t * @param callable $admin_header_callback\n\t * @param callable $admin_image_div_callback Optional custom image div output callback.\n\t */\n\tpublic function __construct($admin_header_callback, $admin_image_div_callback = '') {\n\t\t$this->admin_header_callback = $admin_header_callback;\n\t\t$this->admin_image_div_callback = $admin_image_div_callback;\n\n\t\tadd_action( 'admin_menu', array( $this, 'init' ) );\n\n\t\tadd_action( 'customize_save_after',         array( $this, 'customize_set_last_used' ) );\n\t\tadd_action( 'wp_ajax_custom-header-crop',   array( $this, 'ajax_header_crop'        ) );\n\t\tadd_action( 'wp_ajax_custom-header-add',    array( $this, 'ajax_header_add'         ) );\n\t\tadd_action( 'wp_ajax_custom-header-remove', array( $this, 'ajax_header_remove'      ) );\n\t}\n\n\t/**\n\t * Set up the hooks for the Custom Header admin page.\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function init() {\n\t\t$page = add_theme_page( __( 'Header' ), __( 'Header' ), 'edit_theme_options', 'custom-header', array( $this, 'admin_page' ) );\n\t\tif ( ! $page ) {\n\t\t\treturn;\n\t\t}\n\n\t\tadd_action( \"admin_print_scripts-$page\", array( $this, 'js_includes' ) );\n\t\tadd_action( \"admin_print_styles-$page\", array( $this, 'css_includes' ) );\n\t\tadd_action( \"admin_head-$page\", array( $this, 'help' ) );\n\t\tadd_action( \"admin_head-$page\", array( $this, 'take_action' ), 50 );\n\t\tadd_action( \"admin_head-$page\", array( $this, 'js' ), 50 );\n\t\tif ( $this->admin_header_callback ) {\n\t\t\tadd_action( \"admin_head-$page\", $this->admin_header_callback, 51 );\n\t\t}\n\t}\n\n\t/**\n\t * Adds contextual help.\n\t *\n\t * @since 3.0.0\n\t */\n\tpublic function help() {\n\t\tget_current_screen()->add_help_tab( array(\n\t\t\t'id'      => 'overview',\n\t\t\t'title'   => __('Overview'),\n\t\t\t'content' =>\n\t\t\t\t'<p>' . __( 'This screen is used to customize the header section of your theme.') . '</p>' .\n\t\t\t\t'<p>' . __( 'You can choose from the theme&#8217;s default header images, or use one of your own. You can also customize how your Site Title and Tagline are displayed.') . '<p>'\n\t\t) );\n\n\t\tget_current_screen()->add_help_tab( array(\n\t\t\t'id'      => 'set-header-image',\n\t\t\t'title'   => __('Header Image'),\n\t\t\t'content' =>\n\t\t\t\t'<p>' . __( 'You can set a custom image header for your site. Simply upload the image and crop it, and the new header will go live immediately. Alternatively, you can use an image that has already been uploaded to your Media Library by clicking the &#8220;Choose Image&#8221; button.' ) . '</p>' .\n\t\t\t\t'<p>' . __( 'Some themes come with additional header images bundled. If you see multiple images displayed, select the one you&#8217;d like and click the &#8220;Save Changes&#8221; button.' ) . '</p>' .\n\t\t\t\t'<p>' . __( 'If your theme has more than one default header image, or you have uploaded more than one custom header image, you have the option of having WordPress display a randomly different image on each page of your site. Click the &#8220;Random&#8221; radio button next to the Uploaded Images or Default Images section to enable this feature.') . '</p>' .\n\t\t\t\t'<p>' . __( 'If you don&#8217;t want a header image to be displayed on your site at all, click the &#8220;Remove Header Image&#8221; button at the bottom of the Header Image section of this page. If you want to re-enable the header image later, you just have to select one of the other image options and click &#8220;Save Changes&#8221;.') . '</p>'\n\t\t) );\n\n\t\tget_current_screen()->add_help_tab( array(\n\t\t\t'id'      => 'set-header-text',\n\t\t\t'title'   => __('Header Text'),\n\t\t\t'content' =>\n\t\t\t\t'<p>' . sprintf( __( 'For most themes, the header text is your Site Title and Tagline, as defined in the <a href=\"%1$s\">General Settings</a> section.' ), admin_url( 'options-general.php' ) ) . '<p>' .\n\t\t\t\t'<p>' . __( 'In the Header Text section of this page, you can choose whether to display this text or hide it. You can also choose a color for the text by clicking the Select Color button and either typing in a legitimate HTML hex value, e.g. &#8220;#ff0000&#8221; for red, or by choosing a color using the color picker.' ) . '</p>' .\n\t\t\t\t'<p>' . __( 'Don&#8217;t forget to click &#8220;Save Changes&#8221; when you&#8217;re done!') . '</p>'\n\t\t) );\n\n\t\tget_current_screen()->set_help_sidebar(\n\t\t\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t\t\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Appearance_Header_Screen\" target=\"_blank\">Documentation on Custom Header</a>' ) . '</p>' .\n\t\t\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n\t\t);\n\t}\n\n\t/**\n\t * Get the current step.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @return int Current step\n\t */\n\tpublic function step() {\n\t\tif ( ! isset( $_GET['step'] ) )\n\t\t\treturn 1;\n\n\t\t$step = (int) $_GET['step'];\n\t\tif ( $step < 1 || 3 < $step ||\n\t\t\t( 2 == $step && ! wp_verify_nonce( $_REQUEST['_wpnonce-custom-header-upload'], 'custom-header-upload' ) ) ||\n\t\t\t( 3 == $step && ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'custom-header-crop-image' ) )\n\t\t)\n\t\t\treturn 1;\n\n\t\treturn $step;\n\t}\n\n\t/**\n\t * Set up the enqueue for the JavaScript files.\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function js_includes() {\n\t\t$step = $this->step();\n\n\t\tif ( ( 1 == $step || 3 == $step ) ) {\n\t\t\twp_enqueue_media();\n\t\t\twp_enqueue_script( 'custom-header' );\n\t\t\tif ( current_theme_supports( 'custom-header', 'header-text' ) )\n\t\t\t\twp_enqueue_script( 'wp-color-picker' );\n\t\t} elseif ( 2 == $step ) {\n\t\t\twp_enqueue_script('imgareaselect');\n\t\t}\n\t}\n\n\t/**\n\t * Set up the enqueue for the CSS files\n\t *\n\t * @since 2.7.0\n\t */\n\tpublic function css_includes() {\n\t\t$step = $this->step();\n\n\t\tif ( ( 1 == $step || 3 == $step ) && current_theme_supports( 'custom-header', 'header-text' ) )\n\t\t\twp_enqueue_style( 'wp-color-picker' );\n\t\telseif ( 2 == $step )\n\t\t\twp_enqueue_style('imgareaselect');\n\t}\n\n\t/**\n\t * Execute custom header modification.\n\t *\n\t * @since 2.6.0\n\t */\n\tpublic function take_action() {\n\t\tif ( ! current_user_can('edit_theme_options') )\n\t\t\treturn;\n\n\t\tif ( empty( $_POST ) )\n\t\t\treturn;\n\n\t\t$this->updated = true;\n\n\t\tif ( isset( $_POST['resetheader'] ) ) {\n\t\t\tcheck_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );\n\t\t\t$this->reset_header_image();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isset( $_POST['removeheader'] ) ) {\n\t\t\tcheck_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );\n\t\t\t$this->remove_header_image();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isset( $_POST['text-color'] ) && ! isset( $_POST['display-header-text'] ) ) {\n\t\t\tcheck_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );\n\t\t\tset_theme_mod( 'header_textcolor', 'blank' );\n\t\t} elseif ( isset( $_POST['text-color'] ) ) {\n\t\t\tcheck_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );\n\t\t\t$_POST['text-color'] = str_replace( '#', '', $_POST['text-color'] );\n\t\t\t$color = preg_replace('/[^0-9a-fA-F]/', '', $_POST['text-color']);\n\t\t\tif ( strlen($color) == 6 || strlen($color) == 3 )\n\t\t\t\tset_theme_mod('header_textcolor', $color);\n\t\t\telseif ( ! $color )\n\t\t\t\tset_theme_mod( 'header_textcolor', 'blank' );\n\t\t}\n\n\t\tif ( isset( $_POST['default-header'] ) ) {\n\t\t\tcheck_admin_referer( 'custom-header-options', '_wpnonce-custom-header-options' );\n\t\t\t$this->set_header_image( $_POST['default-header'] );\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Process the default headers\n\t *\n\t * @since 3.0.0\n\t *\n\t * @global array $_wp_default_headers\n\t */\n\tpublic function process_default_headers() {\n\t\tglobal $_wp_default_headers;\n\n\t\tif ( !isset($_wp_default_headers) )\n\t\t\treturn;\n\n\t\tif ( ! empty( $this->default_headers ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->default_headers = $_wp_default_headers;\n\t\t$template_directory_uri = get_template_directory_uri();\n\t\t$stylesheet_directory_uri = get_stylesheet_directory_uri();\n\t\tforeach ( array_keys($this->default_headers) as $header ) {\n\t\t\t$this->default_headers[$header]['url'] =  sprintf( $this->default_headers[$header]['url'], $template_directory_uri, $stylesheet_directory_uri );\n\t\t\t$this->default_headers[$header]['thumbnail_url'] =  sprintf( $this->default_headers[$header]['thumbnail_url'], $template_directory_uri, $stylesheet_directory_uri );\n\t\t}\n\t}\n\n\t/**\n\t * Display UI for selecting one of several default headers.\n\t *\n\t * Show the random image option if this theme has multiple header images.\n\t * Random image option is on by default if no header has been set.\n\t *\n\t * @since 3.0.0\n\t */\n\tpublic function show_header_selector( $type = 'default' ) {\n\t\tif ( 'default' == $type ) {\n\t\t\t$headers = $this->default_headers;\n\t\t} else {\n\t\t\t$headers = get_uploaded_header_images();\n\t\t\t$type = 'uploaded';\n\t\t}\n\n\t\tif ( 1 < count( $headers ) ) {\n\t\t\techo '<div class=\"random-header\">';\n\t\t\techo '<label><input name=\"default-header\" type=\"radio\" value=\"random-' . $type . '-image\"' . checked( is_random_header_image( $type ), true, false ) . ' />';\n\t\t\t_e( '<strong>Random:</strong> Show a different image on each page.' );\n\t\t\techo '</label>';\n\t\t\techo '</div>';\n\t\t}\n\n\t\techo '<div class=\"available-headers\">';\n\t\tforeach ( $headers as $header_key => $header ) {\n\t\t\t$header_thumbnail = $header['thumbnail_url'];\n\t\t\t$header_url = $header['url'];\n\t\t\t$header_desc = empty( $header['description'] ) ? '' : $header['description'];\n\t\t\t$header_alt_text = empty( $header['alt_text'] ) ? $header_desc : $header['alt_text'];\n\t\t\techo '<div class=\"default-header\">';\n\t\t\techo '<label><input name=\"default-header\" type=\"radio\" value=\"' . esc_attr( $header_key ) . '\" ' . checked( $header_url, get_theme_mod( 'header_image' ), false ) . ' />';\n\t\t\t$width = '';\n\t\t\tif ( !empty( $header['attachment_id'] ) )\n\t\t\t\t$width = ' width=\"230\"';\n\t\t\techo '<img src=\"' . set_url_scheme( $header_thumbnail ) . '\" alt=\"' . esc_attr( $header_alt_text ) .'\" title=\"' . esc_attr( $header_desc ) . '\"' . $width . ' /></label>';\n\t\t\techo '</div>';\n\t\t}\n\t\techo '<div class=\"clear\"></div></div>';\n\t}\n\n\t/**\n\t * Execute JavaScript depending on step.\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function js() {\n\t\t$step = $this->step();\n\t\tif ( ( 1 == $step || 3 == $step ) && current_theme_supports( 'custom-header', 'header-text' ) )\n\t\t\t$this->js_1();\n\t\telseif ( 2 == $step )\n\t\t\t$this->js_2();\n\t}\n\n\t/**\n\t * Display JavaScript based on Step 1 and 3.\n\t *\n\t * @since 2.6.0\n\t */\n\tpublic function js_1() {\n\t\t$default_color = '';\n\t\tif ( current_theme_supports( 'custom-header', 'default-text-color' ) ) {\n\t\t\t$default_color = get_theme_support( 'custom-header', 'default-text-color' );\n\t\t\tif ( $default_color && false === strpos( $default_color, '#' ) ) {\n\t\t\t\t$default_color = '#' . $default_color;\n\t\t\t}\n\t\t}\n\t\t?>\n<script type=\"text/javascript\">\n(function($){\n\tvar default_color = '<?php echo $default_color; ?>',\n\t\theader_text_fields;\n\n\tfunction pickColor(color) {\n\t\t$('#name').css('color', color);\n\t\t$('#desc').css('color', color);\n\t\t$('#text-color').val(color);\n\t}\n\n\tfunction toggle_text() {\n\t\tvar checked = $('#display-header-text').prop('checked'),\n\t\t\ttext_color;\n\t\theader_text_fields.toggle( checked );\n\t\tif ( ! checked )\n\t\t\treturn;\n\t\ttext_color = $('#text-color');\n\t\tif ( '' == text_color.val().replace('#', '') ) {\n\t\t\ttext_color.val( default_color );\n\t\t\tpickColor( default_color );\n\t\t} else {\n\t\t\tpickColor( text_color.val() );\n\t\t}\n\t}\n\n\t$(document).ready(function() {\n\t\tvar text_color = $('#text-color');\n\t\theader_text_fields = $('.displaying-header-text');\n\t\ttext_color.wpColorPicker({\n\t\t\tchange: function( event, ui ) {\n\t\t\t\tpickColor( text_color.wpColorPicker('color') );\n\t\t\t},\n\t\t\tclear: function() {\n\t\t\t\tpickColor( '' );\n\t\t\t}\n\t\t});\n\t\t$('#display-header-text').click( toggle_text );\n\t\t<?php if ( ! display_header_text() ) : ?>\n\t\ttoggle_text();\n\t\t<?php endif; ?>\n\t});\n})(jQuery);\n</script>\n<?php\n\t}\n\n\t/**\n\t * Display JavaScript based on Step 2.\n\t *\n\t * @since 2.6.0\n\t */\n\tpublic function js_2() { ?>\n<script type=\"text/javascript\">\n\tfunction onEndCrop( coords ) {\n\t\tjQuery( '#x1' ).val(coords.x);\n\t\tjQuery( '#y1' ).val(coords.y);\n\t\tjQuery( '#width' ).val(coords.w);\n\t\tjQuery( '#height' ).val(coords.h);\n\t}\n\n\tjQuery(document).ready(function() {\n\t\tvar xinit = <?php echo absint( get_theme_support( 'custom-header', 'width' ) ); ?>;\n\t\tvar yinit = <?php echo absint( get_theme_support( 'custom-header', 'height' ) ); ?>;\n\t\tvar ratio = xinit / yinit;\n\t\tvar ximg = jQuery('img#upload').width();\n\t\tvar yimg = jQuery('img#upload').height();\n\n\t\tif ( yimg < yinit || ximg < xinit ) {\n\t\t\tif ( ximg / yimg > ratio ) {\n\t\t\t\tyinit = yimg;\n\t\t\t\txinit = yinit * ratio;\n\t\t\t} else {\n\t\t\t\txinit = ximg;\n\t\t\t\tyinit = xinit / ratio;\n\t\t\t}\n\t\t}\n\n\t\tjQuery('img#upload').imgAreaSelect({\n\t\t\thandles: true,\n\t\t\tkeys: true,\n\t\t\tshow: true,\n\t\t\tx1: 0,\n\t\t\ty1: 0,\n\t\t\tx2: xinit,\n\t\t\ty2: yinit,\n\t\t\t<?php\n\t\t\tif ( ! current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' ) ) {\n\t\t\t?>\n\t\t\taspectRatio: xinit + ':' + yinit,\n\t\t\t<?php\n\t\t\t}\n\t\t\tif ( ! current_theme_supports( 'custom-header', 'flex-height' ) ) {\n\t\t\t?>\n\t\t\tmaxHeight: <?php echo get_theme_support( 'custom-header', 'height' ); ?>,\n\t\t\t<?php\n\t\t\t}\n\t\t\tif ( ! current_theme_supports( 'custom-header', 'flex-width' ) ) {\n\t\t\t?>\n\t\t\tmaxWidth: <?php echo get_theme_support( 'custom-header', 'width' ); ?>,\n\t\t\t<?php\n\t\t\t}\n\t\t\t?>\n\t\t\tonInit: function () {\n\t\t\t\tjQuery('#width').val(xinit);\n\t\t\t\tjQuery('#height').val(yinit);\n\t\t\t},\n\t\t\tonSelectChange: function(img, c) {\n\t\t\t\tjQuery('#x1').val(c.x1);\n\t\t\t\tjQuery('#y1').val(c.y1);\n\t\t\t\tjQuery('#width').val(c.width);\n\t\t\t\tjQuery('#height').val(c.height);\n\t\t\t}\n\t\t});\n\t});\n</script>\n<?php\n\t}\n\n\t/**\n\t * Display first step of custom header image page.\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function step_1() {\n\t\t$this->process_default_headers();\n?>\n\n<div class=\"wrap\">\n<h1><?php _e( 'Custom Header' ); ?></h1>\n\n<?php if ( current_user_can( 'customize' ) ) { ?>\n<div class=\"notice notice-info hide-if-no-customize\">\n\t<p>\n\t\t<?php\n\t\tprintf(\n\t\t\t__( 'You can now manage and live-preview Custom Header in the <a href=\"%1$s\">Customizer</a>.' ),\n\t\t\tadmin_url( 'customize.php?autofocus[control]=header_image' )\n\t\t);\n\t\t?>\n\t</p>\n</div>\n<?php } ?>\n\n<?php if ( ! empty( $this->updated ) ) { ?>\n<div id=\"message\" class=\"updated\">\n<p><?php printf( __( 'Header updated. <a href=\"%s\">Visit your site</a> to see how it looks.' ), home_url( '/' ) ); ?></p>\n</div>\n<?php } ?>\n\n<h3><?php _e( 'Header Image' ); ?></h3>\n\n<table class=\"form-table\">\n<tbody>\n\n<?php if ( get_custom_header() || display_header_text() ) : ?>\n<tr>\n<th scope=\"row\"><?php _e( 'Preview' ); ?></th>\n<td>\n\t<?php\n\tif ( $this->admin_image_div_callback ) {\n\t\tcall_user_func( $this->admin_image_div_callback );\n\t} else {\n\t\t$custom_header = get_custom_header();\n\t\t$header_image = get_header_image();\n\n\t\tif ( $header_image ) {\n\t\t\t$header_image_style = 'background-image:url(' . esc_url( $header_image ) . ');';\n\t\t}  else {\n\t\t\t$header_image_style = '';\n\t\t}\n\n\t\tif ( $custom_header->width )\n\t\t\t$header_image_style .= 'max-width:' . $custom_header->width . 'px;';\n\t\tif ( $custom_header->height )\n\t\t\t$header_image_style .= 'height:' . $custom_header->height . 'px;';\n\t?>\n\t<div id=\"headimg\" style=\"<?php echo $header_image_style; ?>\">\n\t\t<?php\n\t\tif ( display_header_text() )\n\t\t\t$style = ' style=\"color:#' . get_header_textcolor() . ';\"';\n\t\telse\n\t\t\t$style = ' style=\"display:none;\"';\n\t\t?>\n\t\t<h1><a id=\"name\" class=\"displaying-header-text\" <?php echo $style; ?> onclick=\"return false;\" href=\"<?php bloginfo('url'); ?>\" tabindex=\"-1\"><?php bloginfo( 'name' ); ?></a></h1>\n\t\t<div id=\"desc\" class=\"displaying-header-text\" <?php echo $style; ?>><?php bloginfo( 'description' ); ?></div>\n\t</div>\n\t<?php } ?>\n</td>\n</tr>\n<?php endif; ?>\n\n<?php if ( current_user_can( 'upload_files' ) && current_theme_supports( 'custom-header', 'uploads' ) ) : ?>\n<tr>\n<th scope=\"row\"><?php _e( 'Select Image' ); ?></th>\n<td>\n\t<p><?php _e( 'You can select an image to be shown at the top of your site by uploading from your computer or choosing from your media library. After selecting an image you will be able to crop it.' ); ?><br />\n\t<?php\n\tif ( ! current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' ) ) {\n\t\tprintf( __( 'Images of exactly <strong>%1$d &times; %2$d pixels</strong> will be used as-is.' ) . '<br />', get_theme_support( 'custom-header', 'width' ), get_theme_support( 'custom-header', 'height' ) );\n\t} elseif ( current_theme_supports( 'custom-header', 'flex-height' ) ) {\n\t\tif ( ! current_theme_supports( 'custom-header', 'flex-width' ) )\n\t\t\tprintf( __( 'Images should be at least <strong>%1$d pixels</strong> wide.' ) . ' ', get_theme_support( 'custom-header', 'width' ) );\n\t} elseif ( current_theme_supports( 'custom-header', 'flex-width' ) ) {\n\t\tif ( ! current_theme_supports( 'custom-header', 'flex-height' ) )\n\t\t\tprintf( __( 'Images should be at least <strong>%1$d pixels</strong> tall.' ) . ' ', get_theme_support( 'custom-header', 'height' ) );\n\t}\n\tif ( current_theme_supports( 'custom-header', 'flex-height' ) || current_theme_supports( 'custom-header', 'flex-width' ) ) {\n\t\tif ( current_theme_supports( 'custom-header', 'width' ) )\n\t\t\tprintf( __( 'Suggested width is <strong>%1$d pixels</strong>.' ) . ' ', get_theme_support( 'custom-header', 'width' ) );\n\t\tif ( current_theme_supports( 'custom-header', 'height' ) )\n\t\t\tprintf( __( 'Suggested height is <strong>%1$d pixels</strong>.' ) . ' ', get_theme_support( 'custom-header', 'height' ) );\n\t}\n\t?></p>\n\t<form enctype=\"multipart/form-data\" id=\"upload-form\" class=\"wp-upload-form\" method=\"post\" action=\"<?php echo esc_url( add_query_arg( 'step', 2 ) ) ?>\">\n\t<p>\n\t\t<label for=\"upload\"><?php _e( 'Choose an image from your computer:' ); ?></label><br />\n\t\t<input type=\"file\" id=\"upload\" name=\"import\" />\n\t\t<input type=\"hidden\" name=\"action\" value=\"save\" />\n\t\t<?php wp_nonce_field( 'custom-header-upload', '_wpnonce-custom-header-upload' ); ?>\n\t\t<?php submit_button( __( 'Upload' ), 'button', 'submit', false ); ?>\n\t</p>\n\t<?php\n\t\t$modal_update_href = esc_url( add_query_arg( array(\n\t\t\t'page' => 'custom-header',\n\t\t\t'step' => 2,\n\t\t\t'_wpnonce-custom-header-upload' => wp_create_nonce('custom-header-upload'),\n\t\t), admin_url('themes.php') ) );\n\t?>\n\t<p>\n\t\t<label for=\"choose-from-library-link\"><?php _e( 'Or choose an image from your media library:' ); ?></label><br />\n\t\t<button id=\"choose-from-library-link\" class=\"button\"\n\t\t\tdata-update-link=\"<?php echo esc_attr( $modal_update_href ); ?>\"\n\t\t\tdata-choose=\"<?php esc_attr_e( 'Choose a Custom Header' ); ?>\"\n\t\t\tdata-update=\"<?php esc_attr_e( 'Set as header' ); ?>\"><?php _e( 'Choose Image' ); ?></button>\n\t</p>\n\t</form>\n</td>\n</tr>\n<?php endif; ?>\n</tbody>\n</table>\n\n<form method=\"post\" action=\"<?php echo esc_url( add_query_arg( 'step', 1 ) ) ?>\">\n<?php submit_button( null, 'screen-reader-text', 'save-header-options', false ); ?>\n<table class=\"form-table\">\n<tbody>\n\t<?php if ( get_uploaded_header_images() ) : ?>\n<tr>\n<th scope=\"row\"><?php _e( 'Uploaded Images' ); ?></th>\n<td>\n\t<p><?php _e( 'You can choose one of your previously uploaded headers, or show a random one.' ) ?></p>\n\t<?php\n\t\t$this->show_header_selector( 'uploaded' );\n\t?>\n</td>\n</tr>\n\t<?php endif;\n\tif ( ! empty( $this->default_headers ) ) : ?>\n<tr>\n<th scope=\"row\"><?php _e( 'Default Images' ); ?></th>\n<td>\n<?php if ( current_theme_supports( 'custom-header', 'uploads' ) ) : ?>\n\t<p><?php _e( 'If you don&lsquo;t want to upload your own image, you can use one of these cool headers, or show a random one.' ) ?></p>\n<?php else: ?>\n\t<p><?php _e( 'You can use one of these cool headers or show a random one on each page.' ) ?></p>\n<?php endif; ?>\n\t<?php\n\t\t$this->show_header_selector( 'default' );\n\t?>\n</td>\n</tr>\n\t<?php endif;\n\tif ( get_header_image() ) : ?>\n<tr>\n<th scope=\"row\"><?php _e( 'Remove Image' ); ?></th>\n<td>\n\t<p><?php _e( 'This will remove the header image. You will not be able to restore any customizations.' ) ?></p>\n\t<?php submit_button( __( 'Remove Header Image' ), 'button', 'removeheader', false ); ?>\n</td>\n</tr>\n\t<?php endif;\n\n\t$default_image = get_theme_support( 'custom-header', 'default-image' );\n\tif ( $default_image && get_header_image() != $default_image ) : ?>\n<tr>\n<th scope=\"row\"><?php _e( 'Reset Image' ); ?></th>\n<td>\n\t<p><?php _e( 'This will restore the original header image. You will not be able to restore any customizations.' ) ?></p>\n\t<?php submit_button( __( 'Restore Original Header Image' ), 'button', 'resetheader', false ); ?>\n</td>\n</tr>\n\t<?php endif; ?>\n</tbody>\n</table>\n\n<?php if ( current_theme_supports( 'custom-header', 'header-text' ) ) : ?>\n\n<h3><?php _e( 'Header Text' ); ?></h3>\n\n<table class=\"form-table\">\n<tbody>\n<tr>\n<th scope=\"row\"><?php _e( 'Header Text' ); ?></th>\n<td>\n\t<p>\n\t<label><input type=\"checkbox\" name=\"display-header-text\" id=\"display-header-text\"<?php checked( display_header_text() ); ?> /> <?php _e( 'Show header text with your image.' ); ?></label>\n\t</p>\n</td>\n</tr>\n\n<tr class=\"displaying-header-text\">\n<th scope=\"row\"><?php _e( 'Text Color' ); ?></th>\n<td>\n\t<p>\n\t<?php\n\t$default_color = '';\n\tif ( current_theme_supports( 'custom-header', 'default-text-color' ) ) {\n\t\t$default_color = get_theme_support( 'custom-header', 'default-text-color' );\n\t\tif ( $default_color && false === strpos( $default_color, '#' ) ) {\n\t\t\t$default_color = '#' . $default_color;\n\t\t}\n\t}\n\n\t$default_color_attr = $default_color ? ' data-default-color=\"' . esc_attr( $default_color ) . '\"' : '';\n\n\t$header_textcolor = display_header_text() ? get_header_textcolor() : get_theme_support( 'custom-header', 'default-text-color' );\n\tif ( $header_textcolor && false === strpos( $header_textcolor, '#' ) ) {\n\t\t$header_textcolor = '#' . $header_textcolor;\n\t}\n\n\techo '<input type=\"text\" name=\"text-color\" id=\"text-color\" value=\"' . esc_attr( $header_textcolor ) . '\"' . $default_color_attr . ' />';\n\tif ( $default_color ) {\n\t\techo ' <span class=\"description hide-if-js\">' . sprintf( _x( 'Default: %s', 'color' ), esc_html( $default_color ) ) . '</span>';\n\t}\n\t?>\n\t</p>\n</td>\n</tr>\n</tbody>\n</table>\n<?php endif;\n\n/**\n * Fires just before the submit button in the custom header options form.\n *\n * @since 3.1.0\n */\ndo_action( 'custom_header_options' );\n\nwp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?>\n\n<?php submit_button( null, 'primary', 'save-header-options' ); ?>\n</form>\n</div>\n\n<?php }\n\n\t/**\n\t * Display second step of custom header image page.\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function step_2() {\n\t\tcheck_admin_referer('custom-header-upload', '_wpnonce-custom-header-upload');\n\t\tif ( ! current_theme_supports( 'custom-header', 'uploads' ) ) {\n\t\t\twp_die(\n\t\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t\t'<p>' . __( 'The current theme does not support uploading a custom header image.' ) . '</p>',\n\t\t\t\t403\n\t\t\t);\n\t\t}\n\n\t\tif ( empty( $_POST ) && isset( $_GET['file'] ) ) {\n\t\t\t$attachment_id = absint( $_GET['file'] );\n\t\t\t$file = get_attached_file( $attachment_id, true );\n\t\t\t$url = wp_get_attachment_image_src( $attachment_id, 'full' );\n\t\t\t$url = $url[0];\n\t\t} elseif ( isset( $_POST ) ) {\n\t\t\t$data = $this->step_2_manage_upload();\n\t\t\t$attachment_id = $data['attachment_id'];\n\t\t\t$file = $data['file'];\n\t\t\t$url = $data['url'];\n\t\t}\n\n\t\tif ( file_exists( $file ) ) {\n\t\t\tlist( $width, $height, $type, $attr ) = getimagesize( $file );\n\t\t} else {\n\t\t\t$data = wp_get_attachment_metadata( $attachment_id );\n\t\t\t$height = isset( $data[ 'height' ] ) ? $data[ 'height' ] : 0;\n\t\t\t$width = isset( $data[ 'width' ] ) ? $data[ 'width' ] : 0;\n\t\t\tunset( $data );\n\t\t}\n\n\t\t$max_width = 0;\n\t\t// For flex, limit size of image displayed to 1500px unless theme says otherwise\n\t\tif ( current_theme_supports( 'custom-header', 'flex-width' ) )\n\t\t\t$max_width = 1500;\n\n\t\tif ( current_theme_supports( 'custom-header', 'max-width' ) )\n\t\t\t$max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) );\n\t\t$max_width = max( $max_width, get_theme_support( 'custom-header', 'width' ) );\n\n\t\t// If flexible height isn't supported and the image is the exact right size\n\t\tif ( ! current_theme_supports( 'custom-header', 'flex-height' ) && ! current_theme_supports( 'custom-header', 'flex-width' )\n\t\t\t&& $width == get_theme_support( 'custom-header', 'width' ) && $height == get_theme_support( 'custom-header', 'height' ) )\n\t\t{\n\t\t\t// Add the meta-data\n\t\t\tif ( file_exists( $file ) )\n\t\t\t\twp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );\n\n\t\t\t$this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) );\n\n\t\t\t/**\n\t\t\t * Fires after the header image is set or an error is returned.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t *\n\t\t\t * @param string $file          Path to the file.\n\t\t\t * @param int    $attachment_id Attachment ID.\n\t\t\t */\n\t\t\tdo_action( 'wp_create_file_in_uploads', $file, $attachment_id ); // For replication\n\n\t\t\treturn $this->finished();\n\t\t} elseif ( $width > $max_width ) {\n\t\t\t$oitar = $width / $max_width;\n\t\t\t$image = wp_crop_image($attachment_id, 0, 0, $width, $height, $max_width, $height / $oitar, false, str_replace(basename($file), 'midsize-'.basename($file), $file));\n\t\t\tif ( ! $image || is_wp_error( $image ) )\n\t\t\t\twp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );\n\n\t\t\t/** This filter is documented in wp-admin/custom-header.php */\n\t\t\t$image = apply_filters( 'wp_create_file_in_uploads', $image, $attachment_id ); // For replication\n\n\t\t\t$url = str_replace(basename($url), basename($image), $url);\n\t\t\t$width = $width / $oitar;\n\t\t\t$height = $height / $oitar;\n\t\t} else {\n\t\t\t$oitar = 1;\n\t\t}\n\t\t?>\n\n<div class=\"wrap\">\n<h1><?php _e( 'Crop Header Image' ); ?></h1>\n\n<form method=\"post\" action=\"<?php echo esc_url(add_query_arg('step', 3)); ?>\">\n\t<p class=\"hide-if-no-js\"><?php _e('Choose the part of the image you want to use as your header.'); ?></p>\n\t<p class=\"hide-if-js\"><strong><?php _e( 'You need JavaScript to choose a part of the image.'); ?></strong></p>\n\n\t<div id=\"crop_image\" style=\"position: relative\">\n\t\t<img src=\"<?php echo esc_url( $url ); ?>\" id=\"upload\" width=\"<?php echo $width; ?>\" height=\"<?php echo $height; ?>\" alt=\"\" />\n\t</div>\n\n\t<input type=\"hidden\" name=\"x1\" id=\"x1\" value=\"0\"/>\n\t<input type=\"hidden\" name=\"y1\" id=\"y1\" value=\"0\"/>\n\t<input type=\"hidden\" name=\"width\" id=\"width\" value=\"<?php echo esc_attr( $width ); ?>\"/>\n\t<input type=\"hidden\" name=\"height\" id=\"height\" value=\"<?php echo esc_attr( $height ); ?>\"/>\n\t<input type=\"hidden\" name=\"attachment_id\" id=\"attachment_id\" value=\"<?php echo esc_attr( $attachment_id ); ?>\" />\n\t<input type=\"hidden\" name=\"oitar\" id=\"oitar\" value=\"<?php echo esc_attr( $oitar ); ?>\" />\n\t<?php if ( empty( $_POST ) && isset( $_GET['file'] ) ) { ?>\n\t<input type=\"hidden\" name=\"create-new-attachment\" value=\"true\" />\n\t<?php } ?>\n\t<?php wp_nonce_field( 'custom-header-crop-image' ) ?>\n\n\t<p class=\"submit\">\n\t<?php submit_button( __( 'Crop and Publish' ), 'primary', 'submit', false ); ?>\n\t<?php\n\tif ( isset( $oitar ) && 1 == $oitar && ( current_theme_supports( 'custom-header', 'flex-height' ) || current_theme_supports( 'custom-header', 'flex-width' ) ) )\n\t\tsubmit_button( __( 'Skip Cropping, Publish Image as Is' ), 'secondary', 'skip-cropping', false );\n\t?>\n\t</p>\n</form>\n</div>\n\t\t<?php\n\t}\n\n\n\t/**\n\t * Upload the file to be cropped in the second step.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function step_2_manage_upload() {\n\t\t$overrides = array('test_form' => false);\n\n\t\t$uploaded_file = $_FILES['import'];\n\t\t$wp_filetype = wp_check_filetype_and_ext( $uploaded_file['tmp_name'], $uploaded_file['name'] );\n\t\tif ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) )\n\t\t\twp_die( __( 'The uploaded file is not a valid image. Please try again.' ) );\n\n\t\t$file = wp_handle_upload($uploaded_file, $overrides);\n\n\t\tif ( isset($file['error']) )\n\t\t\twp_die( $file['error'],  __( 'Image Upload Error' ) );\n\n\t\t$url = $file['url'];\n\t\t$type = $file['type'];\n\t\t$file = $file['file'];\n\t\t$filename = basename($file);\n\n\t\t// Construct the object array\n\t\t$object = array(\n\t\t\t'post_title'     => $filename,\n\t\t\t'post_content'   => $url,\n\t\t\t'post_mime_type' => $type,\n\t\t\t'guid'           => $url,\n\t\t\t'context'        => 'custom-header'\n\t\t);\n\n\t\t// Save the data\n\t\t$attachment_id = wp_insert_attachment( $object, $file );\n\t\treturn compact( 'attachment_id', 'file', 'filename', 'url', 'type' );\n\t}\n\n\t/**\n\t * Display third step of custom header image page.\n\t *\n\t * @since 2.1.0\n\t * @since 4.4.0 Switched to using wp_get_attachment_url() instead of the guid\n\t *              for retrieving the header image URL.\n\t */\n\tpublic function step_3() {\n\t\tcheck_admin_referer( 'custom-header-crop-image' );\n\n\t\tif ( ! current_theme_supports( 'custom-header', 'uploads' ) ) {\n\t\t\twp_die(\n\t\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t\t'<p>' . __( 'The current theme does not support uploading a custom header image.' ) . '</p>',\n\t\t\t\t403\n\t\t\t);\n\t\t}\n\n\t\tif ( ! empty( $_POST['skip-cropping'] ) && ! ( current_theme_supports( 'custom-header', 'flex-height' ) || current_theme_supports( 'custom-header', 'flex-width' ) ) ) {\n\t\t\twp_die(\n\t\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t\t'<p>' . __( 'The current theme does not support a flexible sized header image.' ) . '</p>',\n\t\t\t\t403\n\t\t\t);\n\t\t}\n\n\t\tif ( $_POST['oitar'] > 1 ) {\n\t\t\t$_POST['x1'] = $_POST['x1'] * $_POST['oitar'];\n\t\t\t$_POST['y1'] = $_POST['y1'] * $_POST['oitar'];\n\t\t\t$_POST['width'] = $_POST['width'] * $_POST['oitar'];\n\t\t\t$_POST['height'] = $_POST['height'] * $_POST['oitar'];\n\t\t}\n\n\t\t$attachment_id = absint( $_POST['attachment_id'] );\n\t\t$original = get_attached_file($attachment_id);\n\n\t\t$dimensions = $this->get_header_dimensions( array(\n\t\t\t'height' => $_POST['height'],\n\t\t\t'width'  => $_POST['width'],\n\t\t) );\n\t\t$height = $dimensions['dst_height'];\n\t\t$width = $dimensions['dst_width'];\n\n\t\tif ( empty( $_POST['skip-cropping'] ) )\n\t\t\t$cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], $width, $height );\n\t\telseif ( ! empty( $_POST['create-new-attachment'] ) )\n\t\t\t$cropped = _copy_image_file( $attachment_id );\n\t\telse\n\t\t\t$cropped = get_attached_file( $attachment_id );\n\n\t\tif ( ! $cropped || is_wp_error( $cropped ) )\n\t\t\twp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );\n\n\t\t/** This filter is documented in wp-admin/custom-header.php */\n\t\t$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication\n\n\t\t$object = $this->create_attachment_object( $cropped, $attachment_id );\n\n\t\tif ( ! empty( $_POST['create-new-attachment'] ) )\n\t\t\tunset( $object['ID'] );\n\n\t\t// Update the attachment\n\t\t$attachment_id = $this->insert_attachment( $object, $cropped );\n\n\t\t$url = wp_get_attachment_url( $attachment_id );\n\t\t$this->set_header_image( compact( 'url', 'attachment_id', 'width', 'height' ) );\n\n\t\t// Cleanup.\n\t\t$medium = str_replace( basename( $original ), 'midsize-' . basename( $original ), $original );\n\t\tif ( file_exists( $medium ) ) {\n\t\t\twp_delete_file( $medium );\n\t\t}\n\n\t\tif ( empty( $_POST['create-new-attachment'] ) && empty( $_POST['skip-cropping'] ) ) {\n\t\t\twp_delete_file( $original );\n\t\t}\n\n\t\treturn $this->finished();\n\t}\n\n\t/**\n\t * Display last step of custom header image page.\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function finished() {\n\t\t$this->updated = true;\n\t\t$this->step_1();\n\t}\n\n\t/**\n\t * Display the page based on the current step.\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function admin_page() {\n\t\tif ( ! current_user_can('edit_theme_options') )\n\t\t\twp_die(__('You do not have permission to customize headers.'));\n\t\t$step = $this->step();\n\t\tif ( 2 == $step )\n\t\t\t$this->step_2();\n\t\telseif ( 3 == $step )\n\t\t\t$this->step_3();\n\t\telse\n\t\t\t$this->step_1();\n\t}\n\n\t/**\n\t * Unused since 3.5.0.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param array $form_fields\n\t * @return array $form_fields\n\t */\n\tpublic function attachment_fields_to_edit( $form_fields ) {\n\t\treturn $form_fields;\n\t}\n\n\t/**\n\t * Unused since 3.5.0.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param array $tabs\n\t * @return array $tabs\n\t */\n\tpublic function filter_upload_tabs( $tabs ) {\n\t\treturn $tabs;\n\t}\n\n\t/**\n\t * Choose a header image, selected from existing uploaded and default headers,\n\t * or provide an array of uploaded header data (either new, or from media library).\n\t *\n\t * @param mixed $choice Which header image to select. Allows for values of 'random-default-image',\n\t * \tfor randomly cycling among the default images; 'random-uploaded-image', for randomly cycling\n\t * \tamong the uploaded images; the key of a default image registered for that theme; and\n\t * \tthe key of an image uploaded for that theme (the basename of the URL).\n\t *  Or an array of arguments: attachment_id, url, width, height. All are required.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param array|object|string $choice\n\t */\n\tfinal public function set_header_image( $choice ) {\n\t\tif ( is_array( $choice ) || is_object( $choice ) ) {\n\t\t\t$choice = (array) $choice;\n\t\t\tif ( ! isset( $choice['attachment_id'] ) || ! isset( $choice['url'] ) )\n\t\t\t\treturn;\n\n\t\t\t$choice['url'] = esc_url_raw( $choice['url'] );\n\n\t\t\t$header_image_data = (object) array(\n\t\t\t\t'attachment_id' => $choice['attachment_id'],\n\t\t\t\t'url'           => $choice['url'],\n\t\t\t\t'thumbnail_url' => $choice['url'],\n\t\t\t\t'height'        => $choice['height'],\n\t\t\t\t'width'         => $choice['width'],\n\t\t\t);\n\n\t\t\tupdate_post_meta( $choice['attachment_id'], '_wp_attachment_is_custom_header', get_stylesheet() );\n\t\t\tset_theme_mod( 'header_image', $choice['url'] );\n\t\t\tset_theme_mod( 'header_image_data', $header_image_data );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( in_array( $choice, array( 'remove-header', 'random-default-image', 'random-uploaded-image' ) ) ) {\n\t\t\tset_theme_mod( 'header_image', $choice );\n\t\t\tremove_theme_mod( 'header_image_data' );\n\t\t\treturn;\n\t\t}\n\n\t\t$uploaded = get_uploaded_header_images();\n\t\tif ( $uploaded && isset( $uploaded[ $choice ] ) ) {\n\t\t\t$header_image_data = $uploaded[ $choice ];\n\n\t\t} else {\n\t\t\t$this->process_default_headers();\n\t\t\tif ( isset( $this->default_headers[ $choice ] ) )\n\t\t\t\t$header_image_data = $this->default_headers[ $choice ];\n\t\t\telse\n\t\t\t\treturn;\n\t\t}\n\n\t\tset_theme_mod( 'header_image', esc_url_raw( $header_image_data['url'] ) );\n\t\tset_theme_mod( 'header_image_data', $header_image_data );\n\t}\n\n\t/**\n\t * Remove a header image.\n\t *\n\t * @since 3.4.0\n\t */\n\tfinal public function remove_header_image() {\n\t\t$this->set_header_image( 'remove-header' );\n\t}\n\n\t/**\n\t * Reset a header image to the default image for the theme.\n\t *\n\t * This method does not do anything if the theme does not have a default header image.\n\t *\n\t * @since 3.4.0\n\t */\n\tfinal public function reset_header_image() {\n\t\t$this->process_default_headers();\n\t\t$default = get_theme_support( 'custom-header', 'default-image' );\n\n\t\tif ( ! $default ) {\n\t\t\t$this->remove_header_image();\n\t\t\treturn;\n\t\t}\n\t\t$default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() );\n\n\t\t$default_data = array();\n\t\tforeach ( $this->default_headers as $header => $details ) {\n\t\t\tif ( $details['url'] == $default ) {\n\t\t\t\t$default_data = $details;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tset_theme_mod( 'header_image', $default );\n\t\tset_theme_mod( 'header_image_data', (object) $default_data );\n\t}\n\n\t/**\n\t * Calculate width and height based on what the currently selected theme supports.\n\t *\n\t * @param array $dimensions\n\t * @return array dst_height and dst_width of header image.\n\t */\n\tfinal public function get_header_dimensions( $dimensions ) {\n\t\t$max_width = 0;\n\t\t$width = absint( $dimensions['width'] );\n\t\t$height = absint( $dimensions['height'] );\n\t\t$theme_height = get_theme_support( 'custom-header', 'height' );\n\t\t$theme_width = get_theme_support( 'custom-header', 'width' );\n\t\t$has_flex_width = current_theme_supports( 'custom-header', 'flex-width' );\n\t\t$has_flex_height = current_theme_supports( 'custom-header', 'flex-height' );\n\t\t$has_max_width = current_theme_supports( 'custom-header', 'max-width' ) ;\n\t\t$dst = array( 'dst_height' => null, 'dst_width' => null );\n\n\t\t// For flex, limit size of image displayed to 1500px unless theme says otherwise\n\t\tif ( $has_flex_width ) {\n\t\t\t$max_width = 1500;\n\t\t}\n\n\t\tif ( $has_max_width ) {\n\t\t\t$max_width = max( $max_width, get_theme_support( 'custom-header', 'max-width' ) );\n\t\t}\n\t\t$max_width = max( $max_width, $theme_width );\n\n\t\tif ( $has_flex_height && ( ! $has_flex_width || $width > $max_width ) ) {\n\t\t\t$dst['dst_height'] = absint( $height * ( $max_width / $width ) );\n\t\t}\n\t\telseif ( $has_flex_height && $has_flex_width ) {\n\t\t\t$dst['dst_height'] = $height;\n\t\t}\n\t\telse {\n\t\t\t$dst['dst_height'] = $theme_height;\n\t\t}\n\n\t\tif ( $has_flex_width && ( ! $has_flex_height || $width > $max_width ) ) {\n\t\t\t$dst['dst_width'] = absint( $width * ( $max_width / $width ) );\n\t\t}\n\t\telseif ( $has_flex_width && $has_flex_height ) {\n\t\t\t$dst['dst_width'] = $width;\n\t\t}\n\t\telse {\n\t\t\t$dst['dst_width'] = $theme_width;\n\t\t}\n\n\t\treturn $dst;\n\t}\n\n\t/**\n\t * Create an attachment 'object'.\n\t *\n\t * @param string $cropped              Cropped image URL.\n\t * @param int    $parent_attachment_id Attachment ID of parent image.\n\t *\n\t * @return array Attachment object.\n\t */\n\tfinal public function create_attachment_object( $cropped, $parent_attachment_id ) {\n\t\t$parent = get_post( $parent_attachment_id );\n\t\t$parent_url = wp_get_attachment_url( $parent->ID );\n\t\t$url = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url );\n\n\t\t$size = @getimagesize( $cropped );\n\t\t$image_type = ( $size ) ? $size['mime'] : 'image/jpeg';\n\n\t\t$object = array(\n\t\t\t'ID' => $parent_attachment_id,\n\t\t\t'post_title' => basename($cropped),\n\t\t\t'post_mime_type' => $image_type,\n\t\t\t'guid' => $url,\n\t\t\t'context' => 'custom-header'\n\t\t);\n\n\t\treturn $object;\n\t}\n\n\t/**\n\t * Insert an attachment and its metadata.\n\t *\n\t * @param array  $object  Attachment object.\n\t * @param string $cropped Cropped image URL.\n\t *\n\t * @return int Attachment ID.\n\t */\n\tfinal public function insert_attachment( $object, $cropped ) {\n\t\t$attachment_id = wp_insert_attachment( $object, $cropped );\n\t\t$metadata = wp_generate_attachment_metadata( $attachment_id, $cropped );\n\t\t/**\n\t\t * Filter the header image attachment metadata.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @see wp_generate_attachment_metadata()\n\t\t *\n\t\t * @param array $metadata Attachment metadata.\n\t\t */\n\t\t$metadata = apply_filters( 'wp_header_image_attachment_metadata', $metadata );\n\t\twp_update_attachment_metadata( $attachment_id, $metadata );\n\t\treturn $attachment_id;\n\t}\n\n\t/**\n\t * Gets attachment uploaded by Media Manager, crops it, then saves it as a\n\t * new object. Returns JSON-encoded object details.\n\t */\n\tpublic function ajax_header_crop() {\n\t\tcheck_ajax_referer( 'image_editor-' . $_POST['id'], 'nonce' );\n\n\t\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\tif ( ! current_theme_supports( 'custom-header', 'uploads' ) ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\t$crop_details = $_POST['cropDetails'];\n\n\t\t$dimensions = $this->get_header_dimensions( array(\n\t\t\t'height' => $crop_details['height'],\n\t\t\t'width'  => $crop_details['width'],\n\t\t) );\n\n\t\t$attachment_id = absint( $_POST['id'] );\n\n\t\t$cropped = wp_crop_image(\n\t\t\t$attachment_id,\n\t\t\t(int) $crop_details['x1'],\n\t\t\t(int) $crop_details['y1'],\n\t\t\t(int) $crop_details['width'],\n\t\t\t(int) $crop_details['height'],\n\t\t\t(int) $dimensions['dst_width'],\n\t\t\t(int) $dimensions['dst_height']\n\t\t);\n\n\t\tif ( ! $cropped || is_wp_error( $cropped ) ) {\n\t\t\twp_send_json_error( array( 'message' => __( 'Image could not be processed. Please go back and try again.' ) ) );\n\t\t}\n\n\t\t/** This filter is documented in wp-admin/custom-header.php */\n\t\t$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication\n\n\t\t$object = $this->create_attachment_object( $cropped, $attachment_id );\n\n\t\tunset( $object['ID'] );\n\n\t\t$new_attachment_id = $this->insert_attachment( $object, $cropped );\n\n\t\t$object['attachment_id'] = $new_attachment_id;\n\t\t$object['url']           = wp_get_attachment_url( $new_attachment_id );;\n\t\t$object['width']         = $dimensions['dst_width'];\n\t\t$object['height']        = $dimensions['dst_height'];\n\n\t\twp_send_json_success( $object );\n\t}\n\n\t/**\n\t * Given an attachment ID for a header image, updates its \"last used\"\n\t * timestamp to now.\n\t *\n\t * Triggered when the user tries adds a new header image from the\n\t * Media Manager, even if s/he doesn't save that change.\n\t */\n\tpublic function ajax_header_add() {\n\t\tcheck_ajax_referer( 'header-add', 'nonce' );\n\n\t\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\t$attachment_id = absint( $_POST['attachment_id'] );\n\t\tif ( $attachment_id < 1 ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\t$key = '_wp_attachment_custom_header_last_used_' . get_stylesheet();\n\t\tupdate_post_meta( $attachment_id, $key, time() );\n\t\tupdate_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() );\n\n\t\twp_send_json_success();\n\t}\n\n\t/**\n\t * Given an attachment ID for a header image, unsets it as a user-uploaded\n\t * header image for the current theme.\n\t *\n\t * Triggered when the user clicks the overlay \"X\" button next to each image\n\t * choice in the Customizer's Header tool.\n\t */\n\tpublic function ajax_header_remove() {\n\t\tcheck_ajax_referer( 'header-remove', 'nonce' );\n\n\t\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\t$attachment_id = absint( $_POST['attachment_id'] );\n\t\tif ( $attachment_id < 1 ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\t$key = '_wp_attachment_custom_header_last_used_' . get_stylesheet();\n\t\tdelete_post_meta( $attachment_id, $key );\n\t\tdelete_post_meta( $attachment_id, '_wp_attachment_is_custom_header', get_stylesheet() );\n\n\t\twp_send_json_success();\n\t}\n\n\t/**\n\t *\n\t * @param WP_Customize_Manager $wp_customize\n\t */\n\tpublic function customize_set_last_used( $wp_customize ) {\n\t\t$data = $wp_customize->get_setting( 'header_image_data' )->post_value();\n\n\t\tif ( ! isset( $data['attachment_id'] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$attachment_id = $data['attachment_id'];\n\t\t$key = '_wp_attachment_custom_header_last_used_' . get_stylesheet();\n\t\tupdate_post_meta( $attachment_id, $key, time() );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_default_header_images() {\n\t\t$this->process_default_headers();\n\n\t\t// Get the default image if there is one.\n\t\t$default = get_theme_support( 'custom-header', 'default-image' );\n\n\t\tif ( ! $default ) { // If not,\n\t\t\treturn $this->default_headers; // easy peasy.\n\t\t}\n\n\t\t$default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() );\n\t\t$already_has_default = false;\n\n\t\tforeach ( $this->default_headers as $k => $h ) {\n\t\t\tif ( $h['url'] === $default ) {\n\t\t\t\t$already_has_default = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( $already_has_default ) {\n\t\t\treturn $this->default_headers;\n\t\t}\n\n\t\t// If the one true image isn't included in the default set, prepend it.\n\t\t$header_images = array();\n\t\t$header_images['default'] = array(\n\t\t\t'url'           => $default,\n\t\t\t'thumbnail_url' => $default,\n\t\t\t'description'   => 'Default'\n\t\t);\n\n\t\t// The rest of the set comes after.\n\t\treturn array_merge( $header_images, $this->default_headers );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_uploaded_header_images() {\n\t\t$header_images = get_uploaded_header_images();\n\t\t$timestamp_key = '_wp_attachment_custom_header_last_used_' . get_stylesheet();\n\t\t$alt_text_key = '_wp_attachment_image_alt';\n\n\t\tforeach ( $header_images as &$header_image ) {\n\t\t\t$header_meta = get_post_meta( $header_image['attachment_id'] );\n\t\t\t$header_image['timestamp'] = isset( $header_meta[ $timestamp_key ] ) ? $header_meta[ $timestamp_key ] : '';\n\t\t\t$header_image['alt_text'] = isset( $header_meta[ $alt_text_key ] ) ? $header_meta[ $alt_text_key ] : '';\n\t\t}\n\n\t\treturn $header_images;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/customize.php",
    "content": "<?php\n/**\n * Theme Customize Screen.\n *\n * @package WordPress\n * @subpackage Customize\n * @since 3.4.0\n */\n\ndefine( 'IFRAME_REQUEST', true );\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'customize' ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to customize the appearance of this site.' ) . '</p>',\n\t\t403\n\t);\n}\n\nwp_reset_vars( array( 'url', 'return', 'autofocus' ) );\nif ( ! empty( $url ) ) {\n\t$wp_customize->set_preview_url( wp_unslash( $url ) );\n}\nif ( ! empty( $return ) ) {\n\t$wp_customize->set_return_url( wp_unslash( $return ) );\n}\nif ( ! empty( $autofocus ) && is_array( $autofocus ) ) {\n\t$wp_customize->set_autofocus( wp_unslash( $autofocus ) );\n}\n\n/**\n * @global WP_Scripts           $wp_scripts\n * @global WP_Customize_Manager $wp_customize\n */\nglobal $wp_scripts, $wp_customize;\n\n$registered = $wp_scripts->registered;\n$wp_scripts = new WP_Scripts;\n$wp_scripts->registered = $registered;\n\nadd_action( 'customize_controls_print_scripts',        'print_head_scripts', 20 );\nadd_action( 'customize_controls_print_footer_scripts', '_wp_footer_scripts'     );\nadd_action( 'customize_controls_print_styles',         'print_admin_styles', 20 );\n\n/**\n * Fires when Customizer controls are initialized, before scripts are enqueued.\n *\n * @since 3.4.0\n */\ndo_action( 'customize_controls_init' );\n\nwp_enqueue_script( 'customize-controls' );\nwp_enqueue_style( 'customize-controls' );\n\n/**\n * Enqueue Customizer control scripts.\n *\n * @since 3.4.0\n */\ndo_action( 'customize_controls_enqueue_scripts' );\n\n// Let's roll.\n@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));\n\nwp_user_settings();\n_wp_admin_html_begin();\n\n$body_class = 'wp-core-ui wp-customizer js';\n\nif ( wp_is_mobile() ) :\n\t$body_class .= ' mobile';\n\n\t?><meta name=\"viewport\" id=\"viewport-meta\" content=\"width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=1.2\" /><?php\nendif;\n\nif ( $wp_customize->is_ios() ) {\n\t$body_class .= ' ios';\n}\n\nif ( is_rtl() ) {\n\t$body_class .= ' rtl';\n}\n$body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );\n\n$admin_title = sprintf( $wp_customize->get_document_title_template(), __( 'Loading&hellip;' ) );\n\n?><title><?php echo $admin_title; ?></title>\n\n<script type=\"text/javascript\">\nvar ajaxurl = <?php echo wp_json_encode( admin_url( 'admin-ajax.php', 'relative' ) ); ?>;\n</script>\n\n<?php\n/**\n * Fires when Customizer control styles are printed.\n *\n * @since 3.4.0\n */\ndo_action( 'customize_controls_print_styles' );\n\n/**\n * Fires when Customizer control scripts are printed.\n *\n * @since 3.4.0\n */\ndo_action( 'customize_controls_print_scripts' );\n?>\n</head>\n<body class=\"<?php echo esc_attr( $body_class ); ?>\">\n<div class=\"wp-full-overlay expanded\">\n\t<form id=\"customize-controls\" class=\"wrap wp-full-overlay-sidebar\">\n\t\t<div id=\"customize-header-actions\" class=\"wp-full-overlay-header\">\n\t\t\t<?php\n\t\t\t$save_text = $wp_customize->is_theme_active() ? __( 'Save &amp; Publish' ) : __( 'Save &amp; Activate' );\n\t\t\tsubmit_button( $save_text, 'primary save', 'save', false );\n\t\t\t?>\n\t\t\t<span class=\"spinner\"></span>\n\t\t\t<a class=\"customize-controls-preview-toggle\" href=\"#\">\n\t\t\t\t<span class=\"controls\"><?php _e( 'Customize' ); ?></span>\n\t\t\t\t<span class=\"preview\"><?php _e( 'Preview' ); ?></span>\n\t\t\t</a>\n\t\t\t<a class=\"customize-controls-close\" href=\"<?php echo esc_url( $wp_customize->get_return_url() ); ?>\">\n\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Cancel' ); ?></span>\n\t\t\t</a>\n\t\t</div>\n\n\t\t<div id=\"widgets-right\"><!-- For Widget Customizer, many widgets try to look for instances under div#widgets-right, so we have to add that ID to a container div in the Customizer for compat -->\n\t\t<div class=\"wp-full-overlay-sidebar-content\" tabindex=\"-1\">\n\t\t\t<div id=\"customize-info\" class=\"accordion-section customize-info\">\n\t\t\t\t<div class=\"accordion-section-title\">\n\t\t\t\t\t<span class=\"preview-notice\"><?php\n\t\t\t\t\t\techo sprintf( __( 'You are customizing %s' ), '<strong class=\"panel-title site-title\">' . get_bloginfo( 'name' ) . '</strong>' );\n\t\t\t\t\t?></span>\n\t\t\t\t\t<button class=\"customize-help-toggle dashicons dashicons-editor-help\" aria-expanded=\"false\"><span class=\"screen-reader-text\"><?php _e( 'Help' ); ?></span></button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"customize-panel-description\"><?php\n\t\t\t\t\t_e( 'The Customizer allows you to preview changes to your site before publishing them. You can also navigate to different pages on your site to preview them.' );\n\t\t\t\t?></div>\n\t\t\t</div>\n\n\t\t\t<div id=\"customize-theme-controls\">\n\t\t\t\t<ul><?php // Panels and sections are managed here via JavaScript ?></ul>\n\t\t\t</div>\n\t\t</div>\n\t\t</div>\n\n\t\t<div id=\"customize-footer-actions\" class=\"wp-full-overlay-footer\">\n\t\t\t<button type=\"button\" class=\"collapse-sidebar button-secondary\" aria-expanded=\"true\" aria-label=\"<?php esc_attr_e( 'Collapse Sidebar' ); ?>\">\n\t\t\t\t<span class=\"collapse-sidebar-arrow\"></span>\n\t\t\t\t<span class=\"collapse-sidebar-label\"><?php _e( 'Collapse' ); ?></span>\n\t\t\t</button>\n\t\t</div>\n\t</form>\n\t<div id=\"customize-preview\" class=\"wp-full-overlay-main\"></div>\n\t<?php\n\n\t/**\n\t * Print templates, control scripts, and settings in the footer.\n\t *\n\t * @since 3.4.0\n\t */\n\tdo_action( 'customize_controls_print_footer_scripts' );\n\t?>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/edit-comments.php",
    "content": "<?php\n/**\n * Edit Comments Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\nif ( ! current_user_can( 'edit_posts' ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to edit comments.' ) . '</p>',\n\t\t403\n\t);\n}\n\n$wp_list_table = _get_list_table('WP_Comments_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n\n$doaction = $wp_list_table->current_action();\n\nif ( $doaction ) {\n\tcheck_admin_referer( 'bulk-comments' );\n\n\tif ( 'delete_all' == $doaction && !empty( $_REQUEST['pagegen_timestamp'] ) ) {\n\t\t$comment_status = wp_unslash( $_REQUEST['comment_status'] );\n\t\t$delete_time = wp_unslash( $_REQUEST['pagegen_timestamp'] );\n\t\t$comment_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = %s AND %s > comment_date_gmt\", $comment_status, $delete_time ) );\n\t\t$doaction = 'delete';\n\t} elseif ( isset( $_REQUEST['delete_comments'] ) ) {\n\t\t$comment_ids = $_REQUEST['delete_comments'];\n\t\t$doaction = ( $_REQUEST['action'] != -1 ) ? $_REQUEST['action'] : $_REQUEST['action2'];\n\t} elseif ( isset( $_REQUEST['ids'] ) ) {\n\t\t$comment_ids = array_map( 'absint', explode( ',', $_REQUEST['ids'] ) );\n\t} elseif ( wp_get_referer() ) {\n\t\twp_safe_redirect( wp_get_referer() );\n\t\texit;\n\t}\n\n\t$approved = $unapproved = $spammed = $unspammed = $trashed = $untrashed = $deleted = 0;\n\n\t$redirect_to = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'spammed', 'unspammed', 'approved', 'unapproved', 'ids' ), wp_get_referer() );\n\t$redirect_to = add_query_arg( 'paged', $pagenum, $redirect_to );\n\n\twp_defer_comment_counting( true );\n\n\tforeach ( $comment_ids as $comment_id ) { // Check the permissions on each\n\t\tif ( !current_user_can( 'edit_comment', $comment_id ) )\n\t\t\tcontinue;\n\n\t\tswitch ( $doaction ) {\n\t\t\tcase 'approve' :\n\t\t\t\twp_set_comment_status( $comment_id, 'approve' );\n\t\t\t\t$approved++;\n\t\t\t\tbreak;\n\t\t\tcase 'unapprove' :\n\t\t\t\twp_set_comment_status( $comment_id, 'hold' );\n\t\t\t\t$unapproved++;\n\t\t\t\tbreak;\n\t\t\tcase 'spam' :\n\t\t\t\twp_spam_comment( $comment_id );\n\t\t\t\t$spammed++;\n\t\t\t\tbreak;\n\t\t\tcase 'unspam' :\n\t\t\t\twp_unspam_comment( $comment_id );\n\t\t\t\t$unspammed++;\n\t\t\t\tbreak;\n\t\t\tcase 'trash' :\n\t\t\t\twp_trash_comment( $comment_id );\n\t\t\t\t$trashed++;\n\t\t\t\tbreak;\n\t\t\tcase 'untrash' :\n\t\t\t\twp_untrash_comment( $comment_id );\n\t\t\t\t$untrashed++;\n\t\t\t\tbreak;\n\t\t\tcase 'delete' :\n\t\t\t\twp_delete_comment( $comment_id );\n\t\t\t\t$deleted++;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\twp_defer_comment_counting( false );\n\n\tif ( $approved )\n\t\t$redirect_to = add_query_arg( 'approved', $approved, $redirect_to );\n\tif ( $unapproved )\n\t\t$redirect_to = add_query_arg( 'unapproved', $unapproved, $redirect_to );\n\tif ( $spammed )\n\t\t$redirect_to = add_query_arg( 'spammed', $spammed, $redirect_to );\n\tif ( $unspammed )\n\t\t$redirect_to = add_query_arg( 'unspammed', $unspammed, $redirect_to );\n\tif ( $trashed )\n\t\t$redirect_to = add_query_arg( 'trashed', $trashed, $redirect_to );\n\tif ( $untrashed )\n\t\t$redirect_to = add_query_arg( 'untrashed', $untrashed, $redirect_to );\n\tif ( $deleted )\n\t\t$redirect_to = add_query_arg( 'deleted', $deleted, $redirect_to );\n\tif ( $trashed || $spammed )\n\t\t$redirect_to = add_query_arg( 'ids', join( ',', $comment_ids ), $redirect_to );\n\n\twp_safe_redirect( $redirect_to );\n\texit;\n} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {\n\t wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );\n\t exit;\n}\n\n$wp_list_table->prepare_items();\n\nwp_enqueue_script('admin-comments');\nenqueue_comment_hotkeys_js();\n\nif ( $post_id ) {\n\t$comments_count = wp_count_comments( $post_id );\n\t$draft_or_post_title = wp_html_excerpt( _draft_or_post_title( $post_id ), 50, '&hellip;' );\n\tif ( $comments_count->moderated > 0 ) {\n\t\t/* translators: 1: comments count 2: post title */\n\t\t$title = sprintf( __( 'Comments (%1$s) on &#8220;%2$s&#8221;' ),\n\t\t\tnumber_format_i18n( $comments_count->moderated ),\n\t\t\t$draft_or_post_title\n\t\t);\n\t} else {\n\t\t/* translators: %s: post title */\n\t\t$title = sprintf( __( 'Comments on &#8220;%s&#8221;' ),\n\t\t\t$draft_or_post_title\n\t\t);\n\t}\n} else {\n\t$comments_count = wp_count_comments();\n\tif ( $comments_count->moderated > 0 ) {\n\t\t/* translators: %s: comments count */\n\t\t$title = sprintf( __( 'Comments (%s)' ),\n\t\t\tnumber_format_i18n( $comments_count->moderated )\n\t\t);\n\t} else {\n\t\t$title = __( 'Comments' );\n\t}\n}\n\nadd_screen_option( 'per_page' );\n\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'overview',\n'title'\t\t=> __('Overview'),\n'content'\t=>\n\t'<p>' . __( 'You can manage comments made on your site similar to the way you manage posts and other content. This screen is customizable in the same ways as other management screens, and you can act on comments using the on-hover action links or the Bulk Actions.' ) . '</p>'\n) );\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'moderating-comments',\n'title'\t\t=> __('Moderating Comments'),\n'content'\t=>\n\t\t'<p>' . __( 'A red bar on the left means the comment is waiting for you to moderate it.' ) . '</p>' .\n\t\t'<p>' . __( 'In the <strong>Author</strong> column, in addition to the author&#8217;s name, email address, and blog URL, the commenter&#8217;s IP address is shown. Clicking on this link will show you all the comments made from this IP address.' ) . '</p>' .\n\t\t'<p>' . __( 'In the <strong>Comment</strong> column, hovering over any comment gives you options to approve, reply (and approve), quick edit, edit, spam mark, or trash that comment.' ) . '</p>' .\n\t\t'<p>' . __( 'In the <strong>In Response To</strong> column, there are three elements. The text is the name of the post that inspired the comment, and links to the post editor for that entry. The View Post link leads to that post on your live site. The small bubble with the number in it shows the number of approved comments that post has received. If there are pending comments, a red notification circle with the number of pending comments is displayed. Clicking the notification circle will filter the comments screen to show only pending comments on that post.' ) . '</p>' .\n\t\t'<p>' . __( 'In the <strong>Submitted On</strong> column, the date and time the comment was left on your site appears. Clicking on the date/time link will take you to that comment on your live site.' ) . '</p>' .\n\t\t'<p>' . __( 'Many people take advantage of keyboard shortcuts to moderate their comments more quickly. Use the link to the side to learn more.' ) . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Administration_Screens#Comments\" target=\"_blank\">Documentation on Comments</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Comment_Spam\" target=\"_blank\">Documentation on Comment Spam</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Keyboard_Shortcuts\" target=\"_blank\">Documentation on Keyboard Shortcuts</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter comments list' ),\n\t'heading_pagination' => __( 'Comments list navigation' ),\n\t'heading_list'       => __( 'Comments list' ),\n) );\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1><?php\nif ( $post_id ) {\n\t/* translators: %s: link to post */\n\tprintf( __( 'Comments on &#8220;%s&#8221;' ),\n\t\tsprintf( '<a href=\"%1$s\">%2$s</a>',\n\t\t\tget_edit_post_link( $post_id ),\n\t\t\twp_html_excerpt( _draft_or_post_title( $post_id ), 50, '&hellip;' )\n\t\t)\n\t);\n} else {\n\t_e( 'Comments' );\n}\n\nif ( isset($_REQUEST['s']) && $_REQUEST['s'] ) {\n\techo '<span class=\"subtitle\">';\n\t/* translators: %s: search keywords */\n\tprintf( __( 'Search results for &#8220;%s&#8221;' ),\n\t\twp_html_excerpt( esc_html( wp_unslash( $_REQUEST['s'] ) ), 50, '&hellip;' )\n\t);\n\techo '</span>';\n}\n?></h1>\n\n<?php\nif ( isset( $_REQUEST['error'] ) ) {\n\t$error = (int) $_REQUEST['error'];\n\t$error_msg = '';\n\tswitch ( $error ) {\n\t\tcase 1 :\n\t\t\t$error_msg = __( 'Invalid comment ID.' );\n\t\t\tbreak;\n\t\tcase 2 :\n\t\t\t$error_msg = __( 'You are not allowed to edit comments on this post.' );\n\t\t\tbreak;\n\t}\n\tif ( $error_msg )\n\t\techo '<div id=\"moderated\" class=\"error\"><p>' . $error_msg . '</p></div>';\n}\n\nif ( isset($_REQUEST['approved']) || isset($_REQUEST['deleted']) || isset($_REQUEST['trashed']) || isset($_REQUEST['untrashed']) || isset($_REQUEST['spammed']) || isset($_REQUEST['unspammed']) || isset($_REQUEST['same']) ) {\n\t$approved  = isset( $_REQUEST['approved']  ) ? (int) $_REQUEST['approved']  : 0;\n\t$deleted   = isset( $_REQUEST['deleted']   ) ? (int) $_REQUEST['deleted']   : 0;\n\t$trashed   = isset( $_REQUEST['trashed']   ) ? (int) $_REQUEST['trashed']   : 0;\n\t$untrashed = isset( $_REQUEST['untrashed'] ) ? (int) $_REQUEST['untrashed'] : 0;\n\t$spammed   = isset( $_REQUEST['spammed']   ) ? (int) $_REQUEST['spammed']   : 0;\n\t$unspammed = isset( $_REQUEST['unspammed'] ) ? (int) $_REQUEST['unspammed'] : 0;\n\t$same      = isset( $_REQUEST['same'] )      ? (int) $_REQUEST['same']      : 0;\n\n\tif ( $approved > 0 || $deleted > 0 || $trashed > 0 || $untrashed > 0 || $spammed > 0 || $unspammed > 0 || $same > 0 ) {\n\t\tif ( $approved > 0 ) {\n\t\t\t/* translators: %s: number of comments approved */\n\t\t\t$messages[] = sprintf( _n( '%s comment approved', '%s comments approved', $approved ), $approved );\n\t\t}\n\n\t\tif ( $spammed > 0 ) {\n\t\t\t$ids = isset($_REQUEST['ids']) ? $_REQUEST['ids'] : 0;\n\t\t\t/* translators: %s: number of comments marked as spam */\n\t\t\t$messages[] = sprintf( _n( '%s comment marked as spam.', '%s comments marked as spam.', $spammed ), $spammed ) . ' <a href=\"' . esc_url( wp_nonce_url( \"edit-comments.php?doaction=undo&action=unspam&ids=$ids\", \"bulk-comments\" ) ) . '\">' . __('Undo') . '</a><br />';\n\t\t}\n\n\t\tif ( $unspammed > 0 ) {\n\t\t\t/* translators: %s: number of comments restored from the spam */\n\t\t\t$messages[] = sprintf( _n( '%s comment restored from the spam', '%s comments restored from the spam', $unspammed ), $unspammed );\n\t\t}\n\n\t\tif ( $trashed > 0 ) {\n\t\t\t$ids = isset($_REQUEST['ids']) ? $_REQUEST['ids'] : 0;\n\t\t\t/* translators: %s: number of comments moved to the Trash */\n\t\t\t$messages[] = sprintf( _n( '%s comment moved to the Trash.', '%s comments moved to the Trash.', $trashed ), $trashed ) . ' <a href=\"' . esc_url( wp_nonce_url( \"edit-comments.php?doaction=undo&action=untrash&ids=$ids\", \"bulk-comments\" ) ) . '\">' . __('Undo') . '</a><br />';\n\t\t}\n\n\t\tif ( $untrashed > 0 ) {\n\t\t\t/* translators: %s: number of comments restored from the Trash */\n\t\t\t$messages[] = sprintf( _n( '%s comment restored from the Trash', '%s comments restored from the Trash', $untrashed ), $untrashed );\n\t\t}\n\n\t\tif ( $deleted > 0 ) {\n\t\t\t/* translators: %s: number of comments permanently deleted */\n\t\t\t$messages[] = sprintf( _n( '%s comment permanently deleted', '%s comments permanently deleted', $deleted ), $deleted );\n\t\t}\n\n\t\tif ( $same > 0 && $comment = get_comment( $same ) ) {\n\t\t\tswitch ( $comment->comment_approved ) {\n\t\t\t\tcase '1' :\n\t\t\t\t\t$messages[] = __('This comment is already approved.') . ' <a href=\"' . esc_url( admin_url( \"comment.php?action=editcomment&c=$same\" ) ) . '\">' . __( 'Edit comment' ) . '</a>';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'trash' :\n\t\t\t\t\t$messages[] = __( 'This comment is already in the Trash.' ) . ' <a href=\"' . esc_url( admin_url( 'edit-comments.php?comment_status=trash' ) ) . '\"> ' . __( 'View Trash' ) . '</a>';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'spam' :\n\t\t\t\t\t$messages[] = __( 'This comment is already marked as spam.' ) . ' <a href=\"' . esc_url( admin_url( \"comment.php?action=editcomment&c=$same\" ) ) . '\">' . __( 'Edit comment' ) . '</a>';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\techo '<div id=\"moderated\" class=\"updated notice is-dismissible\"><p>' . implode( \"<br/>\\n\", $messages ) . '</p></div>';\n\t}\n}\n?>\n\n<?php $wp_list_table->views(); ?>\n\n<form id=\"comments-form\" method=\"get\">\n\n<?php $wp_list_table->search_box( __( 'Search Comments' ), 'comment' ); ?>\n\n<?php if ( $post_id ) : ?>\n<input type=\"hidden\" name=\"p\" value=\"<?php echo esc_attr( intval( $post_id ) ); ?>\" />\n<?php endif; ?>\n<input type=\"hidden\" name=\"comment_status\" value=\"<?php echo esc_attr($comment_status); ?>\" />\n<input type=\"hidden\" name=\"pagegen_timestamp\" value=\"<?php echo esc_attr(current_time('mysql', 1)); ?>\" />\n\n<input type=\"hidden\" name=\"_total\" value=\"<?php echo esc_attr( $wp_list_table->get_pagination_arg('total_items') ); ?>\" />\n<input type=\"hidden\" name=\"_per_page\" value=\"<?php echo esc_attr( $wp_list_table->get_pagination_arg('per_page') ); ?>\" />\n<input type=\"hidden\" name=\"_page\" value=\"<?php echo esc_attr( $wp_list_table->get_pagination_arg('page') ); ?>\" />\n\n<?php if ( isset($_REQUEST['paged']) ) { ?>\n\t<input type=\"hidden\" name=\"paged\" value=\"<?php echo esc_attr( absint( $_REQUEST['paged'] ) ); ?>\" />\n<?php } ?>\n\n<?php $wp_list_table->display(); ?>\n</form>\n</div>\n\n<div id=\"ajax-response\"></div>\n\n<?php\nwp_comment_reply('-1', true, 'detail');\nwp_comment_trashnotice();\ninclude( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/edit-form-advanced.php",
    "content": "<?php\n/**\n * Post advanced form for inclusion in the administration panels.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n// don't load directly\nif ( !defined('ABSPATH') )\n\tdie('-1');\n\n/**\n * @global string  $post_type\n * @global object  $post_type_object\n * @global WP_Post $post\n */\nglobal $post_type, $post_type_object, $post;\n\nwp_enqueue_script('post');\n$_wp_editor_expand = $_content_editor_dfw = false;\n\n/**\n * Filter whether to enable the 'expand' functionality in the post editor.\n *\n * @since 4.0.0\n * @since 4.1.0 Added the `$post_type` parameter.\n *\n * @param bool   $expand    Whether to enable the 'expand' functionality. Default true.\n * @param string $post_type Post type.\n */\nif ( post_type_supports( $post_type, 'editor' ) && ! wp_is_mobile() &&\n\t ! ( $is_IE && preg_match( '/MSIE [5678]/', $_SERVER['HTTP_USER_AGENT'] ) ) &&\n\t apply_filters( 'wp_editor_expand', true, $post_type ) ) {\n\n\twp_enqueue_script('editor-expand');\n\t$_content_editor_dfw = true;\n\t$_wp_editor_expand = ( get_user_setting( 'editor_expand', 'on' ) === 'on' );\n}\n\nif ( wp_is_mobile() )\n\twp_enqueue_script( 'jquery-touch-punch' );\n\n/**\n * Post ID global\n * @name $post_ID\n * @var int\n */\n$post_ID = isset($post_ID) ? (int) $post_ID : 0;\n$user_ID = isset($user_ID) ? (int) $user_ID : 0;\n$action = isset($action) ? $action : '';\n\nif ( $post_ID == get_option( 'page_for_posts' ) && empty( $post->post_content ) ) {\n\tadd_action( 'edit_form_after_title', '_wp_posts_page_notice' );\n\tremove_post_type_support( $post_type, 'editor' );\n}\n\n$thumbnail_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' );\nif ( ! $thumbnail_support && 'attachment' === $post_type && $post->post_mime_type ) {\n\tif ( wp_attachment_is( 'audio', $post ) ) {\n\t\t$thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' );\n\t} elseif ( wp_attachment_is( 'video', $post ) ) {\n\t\t$thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' );\n\t}\n}\n\nif ( $thumbnail_support ) {\n\tadd_thickbox();\n\twp_enqueue_media( array( 'post' => $post_ID ) );\n}\n\n// Add the local autosave notice HTML\nadd_action( 'admin_footer', '_local_storage_notice' );\n\n/*\n * @todo Document the $messages array(s).\n */\n$permalink = get_permalink( $post_ID );\nif ( ! $permalink ) {\n\t$permalink = '';\n}\n\n$messages = array();\n\n$preview_post_link_html = $scheduled_post_link_html = $view_post_link_html = '';\n$preview_page_link_html = $scheduled_page_link_html = $view_page_link_html = '';\n\n$preview_url = get_preview_post_link( $post );\n\n$viewable = is_post_type_viewable( $post_type_object );\n\nif ( $viewable ) {\n\n\t// Preview post link.\n\t$preview_post_link_html = sprintf( ' <a target=\"_blank\" href=\"%1$s\">%2$s</a>',\n\t\tesc_url( $preview_url ),\n\t\t__( 'Preview post' )\n\t);\n\n\t// Scheduled post preview link.\n\t$scheduled_post_link_html = sprintf( ' <a target=\"_blank\" href=\"%1$s\">%2$s</a>',\n\t\tesc_url( $permalink ),\n\t\t__( 'Preview post' )\n\t);\n\n\t// View post link.\n\t$view_post_link_html = sprintf( ' <a href=\"%1$s\">%2$s</a>',\n\t\tesc_url( $permalink ),\n\t\t__( 'View post' )\n\t);\n\n\t// Preview page link.\n\t$preview_page_link_html = sprintf( ' <a target=\"_blank\" href=\"%1$s\">%2$s</a>',\n\t\tesc_url( $preview_url ),\n\t\t__( 'Preview page' )\n\t);\n\n\t// Scheduled page preview link.\n\t$scheduled_page_link_html = sprintf( ' <a target=\"_blank\" href=\"%1$s\">%2$s</a>',\n\t\tesc_url( $permalink ),\n\t\t__( 'Preview page' )\n\t);\n\n\t// View page link.\n\t$view_page_link_html = sprintf( ' <a href=\"%1$s\">%2$s</a>',\n\t\tesc_url( $permalink ),\n\t\t__( 'View page' )\n\t);\n\n}\n\n/* translators: Publish box date format, see http://php.net/date */\n$scheduled_date = date_i18n( __( 'M j, Y @ H:i' ), strtotime( $post->post_date ) );\n\n$messages['post'] = array(\n\t 0 => '', // Unused. Messages start at index 1.\n\t 1 => __( 'Post updated.' ) . $view_post_link_html,\n\t 2 => __( 'Custom field updated.' ),\n\t 3 => __( 'Custom field deleted.' ),\n\t 4 => __( 'Post updated.' ),\n\t/* translators: %s: date and time of the revision */\n\t 5 => isset($_GET['revision']) ? sprintf( __( 'Post restored to revision from %s.' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,\n\t 6 => __( 'Post published.' ) . $view_post_link_html,\n\t 7 => __( 'Post saved.' ),\n\t 8 => __( 'Post submitted.' ) . $preview_post_link_html,\n\t 9 => sprintf( __( 'Post scheduled for: %s.' ), '<strong>' . $scheduled_date . '</strong>' ) . $scheduled_post_link_html,\n\t10 => __( 'Post draft updated.' ) . $preview_post_link_html,\n);\n$messages['page'] = array(\n\t 0 => '', // Unused. Messages start at index 1.\n\t 1 => __( 'Page updated.' ) . $view_page_link_html,\n\t 2 => __( 'Custom field updated.' ),\n\t 3 => __( 'Custom field deleted.' ),\n\t 4 => __( 'Page updated.' ),\n\t/* translators: %s: date and time of the revision */\n\t 5 => isset($_GET['revision']) ? sprintf( __( 'Page restored to revision from %s.' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,\n\t 6 => __( 'Page published.' ) . $view_page_link_html,\n\t 7 => __( 'Page saved.' ),\n\t 8 => __( 'Page submitted.' ) . $preview_page_link_html,\n\t 9 => sprintf( __( 'Page scheduled for: %s.' ), '<strong>' . $scheduled_date . '</strong>' ) . $scheduled_page_link_html,\n\t10 => __( 'Page draft updated.' ) . $preview_page_link_html,\n);\n$messages['attachment'] = array_fill( 1, 10, __( 'Media attachment updated.' ) ); // Hack, for now.\n\n/**\n * Filter the post updated messages.\n *\n * @since 3.0.0\n *\n * @param array $messages Post updated messages. For defaults @see $messages declarations above.\n */\n$messages = apply_filters( 'post_updated_messages', $messages );\n\n$message = false;\nif ( isset($_GET['message']) ) {\n\t$_GET['message'] = absint( $_GET['message'] );\n\tif ( isset($messages[$post_type][$_GET['message']]) )\n\t\t$message = $messages[$post_type][$_GET['message']];\n\telseif ( !isset($messages[$post_type]) && isset($messages['post'][$_GET['message']]) )\n\t\t$message = $messages['post'][$_GET['message']];\n}\n\n$notice = false;\n$form_extra = '';\nif ( 'auto-draft' == $post->post_status ) {\n\tif ( 'edit' == $action )\n\t\t$post->post_title = '';\n\t$autosave = false;\n\t$form_extra .= \"<input type='hidden' id='auto_draft' name='auto_draft' value='1' />\";\n} else {\n\t$autosave = wp_get_post_autosave( $post_ID );\n}\n\n$form_action = 'editpost';\n$nonce_action = 'update-post_' . $post_ID;\n$form_extra .= \"<input type='hidden' id='post_ID' name='post_ID' value='\" . esc_attr($post_ID) . \"' />\";\n\n// Detect if there exists an autosave newer than the post and if that autosave is different than the post\nif ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt, false ) > mysql2date( 'U', $post->post_modified_gmt, false ) ) {\n\tforeach ( _wp_post_revision_fields() as $autosave_field => $_autosave_field ) {\n\t\tif ( normalize_whitespace( $autosave->$autosave_field ) != normalize_whitespace( $post->$autosave_field ) ) {\n\t\t\t$notice = sprintf( __( 'There is an autosave of this post that is more recent than the version below. <a href=\"%s\">View the autosave</a>' ), get_edit_post_link( $autosave->ID ) );\n\t\t\tbreak;\n\t\t}\n\t}\n\t// If this autosave isn't different from the current post, begone.\n\tif ( ! $notice )\n\t\twp_delete_post_revision( $autosave->ID );\n\tunset($autosave_field, $_autosave_field);\n}\n\n$post_type_object = get_post_type_object($post_type);\n\n// All meta boxes should be defined and added before the first do_meta_boxes() call (or potentially during the do_meta_boxes action).\nrequire_once( ABSPATH . 'wp-admin/includes/meta-boxes.php' );\n\n\n$publish_callback_args = null;\nif ( post_type_supports($post_type, 'revisions') && 'auto-draft' != $post->post_status ) {\n\t$revisions = wp_get_post_revisions( $post_ID );\n\n\t// We should aim to show the revisions metabox only when there are revisions.\n\tif ( count( $revisions ) > 1 ) {\n\t\treset( $revisions ); // Reset pointer for key()\n\t\t$publish_callback_args = array( 'revisions_count' => count( $revisions ), 'revision_id' => key( $revisions ) );\n\t\tadd_meta_box('revisionsdiv', __('Revisions'), 'post_revisions_meta_box', null, 'normal', 'core');\n\t}\n}\n\nif ( 'attachment' == $post_type ) {\n\twp_enqueue_script( 'image-edit' );\n\twp_enqueue_style( 'imgareaselect' );\n\tadd_meta_box( 'submitdiv', __('Save'), 'attachment_submit_meta_box', null, 'side', 'core' );\n\tadd_action( 'edit_form_after_title', 'edit_form_image_editor' );\n\n\tif ( wp_attachment_is( 'audio', $post ) ) {\n\t\tadd_meta_box( 'attachment-id3', __( 'Metadata' ), 'attachment_id3_data_meta_box', null, 'normal', 'core' );\n\t}\n} else {\n\tadd_meta_box( 'submitdiv', __( 'Publish' ), 'post_submit_meta_box', null, 'side', 'core', $publish_callback_args );\n}\n\nif ( current_theme_supports( 'post-formats' ) && post_type_supports( $post_type, 'post-formats' ) )\n\tadd_meta_box( 'formatdiv', _x( 'Format', 'post format' ), 'post_format_meta_box', null, 'side', 'core' );\n\n// all taxonomies\nforeach ( get_object_taxonomies( $post ) as $tax_name ) {\n\t$taxonomy = get_taxonomy( $tax_name );\n\tif ( ! $taxonomy->show_ui || false === $taxonomy->meta_box_cb )\n\t\tcontinue;\n\n\t$label = $taxonomy->labels->name;\n\n\tif ( ! is_taxonomy_hierarchical( $tax_name ) )\n\t\t$tax_meta_box_id = 'tagsdiv-' . $tax_name;\n\telse\n\t\t$tax_meta_box_id = $tax_name . 'div';\n\n\tadd_meta_box( $tax_meta_box_id, $label, $taxonomy->meta_box_cb, null, 'side', 'core', array( 'taxonomy' => $tax_name ) );\n}\n\nif ( post_type_supports($post_type, 'page-attributes') )\n\tadd_meta_box('pageparentdiv', 'page' == $post_type ? __('Page Attributes') : __('Attributes'), 'page_attributes_meta_box', null, 'side', 'core');\n\nif ( $thumbnail_support && current_user_can( 'upload_files' ) )\n\tadd_meta_box('postimagediv', esc_html( $post_type_object->labels->featured_image ), 'post_thumbnail_meta_box', null, 'side', 'low');\n\nif ( post_type_supports($post_type, 'excerpt') )\n\tadd_meta_box('postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', null, 'normal', 'core');\n\nif ( post_type_supports($post_type, 'trackbacks') )\n\tadd_meta_box('trackbacksdiv', __('Send Trackbacks'), 'post_trackback_meta_box', null, 'normal', 'core');\n\nif ( post_type_supports($post_type, 'custom-fields') )\n\tadd_meta_box('postcustom', __('Custom Fields'), 'post_custom_meta_box', null, 'normal', 'core');\n\n/**\n * Fires in the middle of built-in meta box registration.\n *\n * @since 2.1.0\n * @deprecated 3.7.0 Use 'add_meta_boxes' instead.\n *\n * @param WP_Post $post Post object.\n */\ndo_action( 'dbx_post_advanced', $post );\n\n// Allow the Discussion meta box to show up if the post type supports comments,\n// or if comments or pings are open.\nif ( comments_open( $post ) || pings_open( $post ) || post_type_supports( $post_type, 'comments' ) ) {\n\tadd_meta_box( 'commentstatusdiv', __( 'Discussion' ), 'post_comment_status_meta_box', null, 'normal', 'core' );\n}\n\n$stati = get_post_stati( array( 'public' => true ) );\nif ( empty( $stati ) ) {\n\t$stati = array( 'publish' );\n}\n$stati[] = 'private';\n\nif ( in_array( get_post_status( $post ), $stati ) ) {\n\t// If the post type support comments, or the post has comments, allow the\n\t// Comments meta box.\n\tif ( comments_open( $post ) || pings_open( $post ) || $post->comment_count > 0 || post_type_supports( $post_type, 'comments' ) ) {\n\t\tadd_meta_box( 'commentsdiv', __( 'Comments' ), 'post_comment_meta_box', null, 'normal', 'core' );\n\t}\n}\n\nif ( ! ( 'pending' == get_post_status( $post ) && ! current_user_can( $post_type_object->cap->publish_posts ) ) )\n\tadd_meta_box('slugdiv', __('Slug'), 'post_slug_meta_box', null, 'normal', 'core');\n\nif ( post_type_supports($post_type, 'author') ) {\n\tif ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) )\n\t\tadd_meta_box('authordiv', __('Author'), 'post_author_meta_box', null, 'normal', 'core');\n}\n\n/**\n * Fires after all built-in meta boxes have been added.\n *\n * @since 3.0.0\n *\n * @param string  $post_type Post type.\n * @param WP_Post $post      Post object.\n */\ndo_action( 'add_meta_boxes', $post_type, $post );\n\n/**\n * Fires after all built-in meta boxes have been added, contextually for the given post type.\n *\n * The dynamic portion of the hook, `$post_type`, refers to the post type of the post.\n *\n * @since 3.0.0\n *\n * @param WP_Post $post Post object.\n */\ndo_action( 'add_meta_boxes_' . $post_type, $post );\n\n/**\n * Fires after meta boxes have been added.\n *\n * Fires once for each of the default meta box contexts: normal, advanced, and side.\n *\n * @since 3.0.0\n *\n * @param string  $post_type Post type of the post.\n * @param string  $context   string  Meta box context.\n * @param WP_Post $post      Post object.\n */\ndo_action( 'do_meta_boxes', $post_type, 'normal', $post );\n/** This action is documented in wp-admin/edit-form-advanced.php */\ndo_action( 'do_meta_boxes', $post_type, 'advanced', $post );\n/** This action is documented in wp-admin/edit-form-advanced.php */\ndo_action( 'do_meta_boxes', $post_type, 'side', $post );\n\nadd_screen_option('layout_columns', array('max' => 2, 'default' => 2) );\n\nif ( 'post' == $post_type ) {\n\t$customize_display = '<p>' . __('The title field and the big Post Editing Area are fixed in place, but you can reposition all the other boxes using drag and drop. You can also minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen.') . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'customize-display',\n\t\t'title'   => __('Customizing This Display'),\n\t\t'content' => $customize_display,\n\t) );\n\n\t$title_and_editor  = '<p>' . __('<strong>Title</strong> &mdash; Enter a title for your post. After you enter a title, you&#8217;ll see the permalink below, which you can edit.') . '</p>';\n\t$title_and_editor .= '<p>' . __( '<strong>Post editor</strong> &mdash; Enter the text for your post. There are two modes of editing: Visual and Text. Choose the mode by clicking on the appropriate tab.' ) . '</p>';\n\t$title_and_editor .= '<p>' . __( 'Visual mode gives you a WYSIWYG editor. Click the last icon in the row to get a second row of controls. ') . '</p>';\n\t$title_and_editor .= '<p>' . __( 'The Text mode allows you to enter HTML along with your post text. Line breaks will be converted to paragraphs automatically.' ) . '</p>';\n\t$title_and_editor .= '<p>' . __( 'You can insert media files by clicking the icons above the post editor and following the directions. You can align or edit images using the inline formatting toolbar available in Visual mode.' ) . '</p>';\n\t$title_and_editor .= '<p>' . __( 'You can enable distraction-free writing mode using the icon to the right. This feature is not available for old browsers or devices with small screens, and requires that the full-height editor be enabled in Screen Options.' ) . '</p>';\n\t$title_and_editor .= '<p>' . __( 'Keyboard users: When you&#8217;re working in the visual editor, you can use <kbd>Alt + F10</kbd> to access the toolbar.' ) . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'title-post-editor',\n\t\t'title'   => __('Title and Post Editor'),\n\t\t'content' => $title_and_editor,\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t\t\t'<p>' . sprintf(__('You can also create posts with the <a href=\"%s\">Press This bookmarklet</a>.'), 'tools.php') . '</p>' .\n\t\t\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t\t\t'<p>' . __('<a href=\"https://codex.wordpress.org/Posts_Add_New_Screen\" target=\"_blank\">Documentation on Writing and Editing Posts</a>') . '</p>' .\n\t\t\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n\t);\n} elseif ( 'page' == $post_type ) {\n\t$about_pages = '<p>' . __('Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the &#8220;Parent&#8221; of the other, creating a group of pages.') . '</p>' .\n\t\t'<p>' . __('Creating a Page is very similar to creating a Post, and the screens can be customized in the same way using drag and drop, the Screen Options tab, and expanding/collapsing boxes as you choose. This screen also has the distraction-free writing space, available in both the Visual and Text modes via the Fullscreen buttons. The Page editor mostly works the same as the Post editor, but there are some Page-specific features in the Page Attributes box.') . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'about-pages',\n\t\t'title'   => __('About Pages'),\n\t\t'content' => $about_pages,\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t\t\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t\t\t'<p>' . __('<a href=\"https://codex.wordpress.org/Pages_Add_New_Screen\" target=\"_blank\">Documentation on Adding New Pages</a>') . '</p>' .\n\t\t\t'<p>' . __('<a href=\"https://codex.wordpress.org/Pages_Screen#Editing_Individual_Pages\" target=\"_blank\">Documentation on Editing Pages</a>') . '</p>' .\n\t\t\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n\t);\n} elseif ( 'attachment' == $post_type ) {\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'overview',\n\t\t'title'   => __('Overview'),\n\t\t'content' =>\n\t\t\t'<p>' . __('This screen allows you to edit four fields for metadata in a file within the media library.') . '</p>' .\n\t\t\t'<p>' . __('For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information.') . '</p>' .\n\t\t\t'<p>' . __('Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping.') . '</p>' .\n\t\t\t'<p>' . __('Remember to click Update Media to save metadata entered or changed.') . '</p>'\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Media_Add_New_Screen#Edit_Media\" target=\"_blank\">Documentation on Edit Media</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n\t);\n}\n\nif ( 'post' == $post_type || 'page' == $post_type ) {\n\t$inserting_media = '<p>' . __( 'You can upload and insert media (images, audio, documents, etc.) by clicking the Add Media button. You can select from the images and files already uploaded to the Media Library, or upload new media to add to your page or post. To create an image gallery, select the images to add and click the &#8220;Create a new gallery&#8221; button.' ) . '</p>';\n\t$inserting_media .= '<p>' . __( 'You can also embed media from many popular websites including Twitter, YouTube, Flickr and others by pasting the media URL on its own line into the content of your post/page. Please refer to the Codex to <a href=\"https://codex.wordpress.org/Embeds\">learn more about embeds</a>.' ) . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'\t\t=> 'inserting-media',\n\t\t'title'\t\t=> __( 'Inserting Media' ),\n\t\t'content' \t=> $inserting_media,\n\t) );\n}\n\nif ( 'post' == $post_type ) {\n\t$publish_box = '<p>' . __('Several boxes on this screen contain settings for how your content will be published, including:') . '</p>';\n\t$publish_box .= '<ul><li>' .\n\t\t__( '<strong>Publish</strong> &mdash; You can set the terms of publishing your post in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a post or making it stay at the top of your blog indefinitely (sticky). Publish (immediately) allows you to set a future or past date and time, so you can schedule a post to be published in the future or backdate a post. The Password protected option allows you to set an arbitrary password for each post. The Private option hides the post from everyone except editors and administrators.' ) .\n\t'</li>';\n\n\tif ( current_theme_supports( 'post-formats' ) && post_type_supports( 'post', 'post-formats' ) ) {\n\t\t$publish_box .= '<li>' . __( '<strong>Format</strong> &mdash; Post Formats designate how your theme will display a specific post. For example, you could have a <em>standard</em> blog post with a title and paragraphs, or a short <em>aside</em> that omits the title and contains a short text blurb. Please refer to the Codex for <a href=\"https://codex.wordpress.org/Post_Formats#Supported_Formats\">descriptions of each post format</a>. Your theme could enable all or some of 10 possible formats.' ) . '</li>';\n\t}\n\n\tif ( current_theme_supports( 'post-thumbnails' ) && post_type_supports( 'post', 'thumbnail' ) ) {\n\t\t/* translators: %s: Featured Image */\n\t\t$publish_box .= '<li>' . sprintf( __( '<strong>%s</strong> &mdash; This allows you to associate an image with your post without inserting it. This is usually useful only if your theme makes use of the image as a post thumbnail on the home page, a custom header, etc.' ), esc_html( $post_type_object->labels->featured_image ) ) . '</li>';\n\t}\n\n\t$publish_box .= '</ul>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'publish-box',\n\t\t'title'   => __('Publish Settings'),\n\t\t'content' => $publish_box,\n\t) );\n\n\t$discussion_settings  = '<p>' . __('<strong>Send Trackbacks</strong> &mdash; Trackbacks are a way to notify legacy blog systems that you&#8217;ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they&#8217;ll be notified automatically using pingbacks, and this field is unnecessary.') . '</p>';\n\t$discussion_settings .= '<p>' . __('<strong>Discussion</strong> &mdash; You can turn comments and pings on or off, and if there are comments on the post, you can see them here and moderate them.') . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'discussion-settings',\n\t\t'title'   => __('Discussion Settings'),\n\t\t'content' => $discussion_settings,\n\t) );\n} elseif ( 'page' == $post_type ) {\n\t$page_attributes = '<p>' . __('<strong>Parent</strong> &mdash; You can arrange your pages in hierarchies. For example, you could have an &#8220;About&#8221; page that has &#8220;Life Story&#8221; and &#8220;My Dog&#8221; pages under it. There are no limits to how many levels you can nest pages.') . '</p>' .\n\t\t'<p>' . __('<strong>Template</strong> &mdash; Some themes have custom templates you can use for certain pages that might have additional features or custom layouts. If so, you&#8217;ll see them in this dropdown menu.') . '</p>' .\n\t\t'<p>' . __('<strong>Order</strong> &mdash; Pages are usually ordered alphabetically, but you can choose your own order by entering a number (1 for first, etc.) in this field.') . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id' => 'page-attributes',\n\t\t'title' => __('Page Attributes'),\n\t\t'content' => $page_attributes,\n\t) );\n}\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1><?php\necho esc_html( $title );\nif ( isset( $post_new_file ) && current_user_can( $post_type_object->cap->create_posts ) )\n\techo ' <a href=\"' . esc_url( admin_url( $post_new_file ) ) . '\" class=\"page-title-action\">' . esc_html( $post_type_object->labels->add_new ) . '</a>';\n?></h1>\n<?php if ( $notice ) : ?>\n<div id=\"notice\" class=\"notice notice-warning\"><p id=\"has-newer-autosave\"><?php echo $notice ?></p></div>\n<?php endif; ?>\n<?php if ( $message ) : ?>\n<div id=\"message\" class=\"updated notice notice-success is-dismissible\"><p><?php echo $message; ?></p></div>\n<?php endif; ?>\n<div id=\"lost-connection-notice\" class=\"error hidden\">\n\t<p><span class=\"spinner\"></span> <?php _e( '<strong>Connection lost.</strong> Saving has been disabled until you&#8217;re reconnected.' ); ?>\n\t<span class=\"hide-if-no-sessionstorage\"><?php _e( 'We&#8217;re backing up this post in your browser, just in case.' ); ?></span>\n\t</p>\n</div>\n<form name=\"post\" action=\"post.php\" method=\"post\" id=\"post\"<?php\n/**\n * Fires inside the post editor form tag.\n *\n * @since 3.0.0\n *\n * @param WP_Post $post Post object.\n */\ndo_action( 'post_edit_form_tag', $post );\n\n$referer = wp_get_referer();\n?>>\n<?php wp_nonce_field($nonce_action); ?>\n<input type=\"hidden\" id=\"user-id\" name=\"user_ID\" value=\"<?php echo (int) $user_ID ?>\" />\n<input type=\"hidden\" id=\"hiddenaction\" name=\"action\" value=\"<?php echo esc_attr( $form_action ) ?>\" />\n<input type=\"hidden\" id=\"originalaction\" name=\"originalaction\" value=\"<?php echo esc_attr( $form_action ) ?>\" />\n<input type=\"hidden\" id=\"post_author\" name=\"post_author\" value=\"<?php echo esc_attr( $post->post_author ); ?>\" />\n<input type=\"hidden\" id=\"post_type\" name=\"post_type\" value=\"<?php echo esc_attr( $post_type ) ?>\" />\n<input type=\"hidden\" id=\"original_post_status\" name=\"original_post_status\" value=\"<?php echo esc_attr( $post->post_status) ?>\" />\n<input type=\"hidden\" id=\"referredby\" name=\"referredby\" value=\"<?php echo $referer ? esc_url( $referer ) : ''; ?>\" />\n<?php if ( ! empty( $active_post_lock ) ) { ?>\n<input type=\"hidden\" id=\"active_post_lock\" value=\"<?php echo esc_attr( implode( ':', $active_post_lock ) ); ?>\" />\n<?php\n}\nif ( 'draft' != get_post_status( $post ) )\n\twp_original_referer_field(true, 'previous');\n\necho $form_extra;\n\nwp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );\nwp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );\n?>\n\n<?php\n/**\n * Fires at the beginning of the edit form.\n *\n * At this point, the required hidden fields and nonces have already been output.\n *\n * @since 3.7.0\n *\n * @param WP_Post $post Post object.\n */\ndo_action( 'edit_form_top', $post ); ?>\n\n<div id=\"poststuff\">\n<div id=\"post-body\" class=\"metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? '1' : '2'; ?>\">\n<div id=\"post-body-content\">\n\n<?php if ( post_type_supports($post_type, 'title') ) { ?>\n<div id=\"titlediv\">\n<div id=\"titlewrap\">\n\t<?php\n\t/**\n\t * Filter the title field placeholder text.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string  $text Placeholder text. Default 'Enter title here'.\n\t * @param WP_Post $post Post object.\n\t */\n\t$title_placeholder = apply_filters( 'enter_title_here', __( 'Enter title here' ), $post );\n\t?>\n\t<label class=\"screen-reader-text\" id=\"title-prompt-text\" for=\"title\"><?php echo $title_placeholder; ?></label>\n\t<input type=\"text\" name=\"post_title\" size=\"30\" value=\"<?php echo esc_attr( $post->post_title ); ?>\" id=\"title\" spellcheck=\"true\" autocomplete=\"off\" />\n</div>\n<?php\n/**\n * Fires before the permalink field in the edit form.\n *\n * @since 4.1.0\n *\n * @param WP_Post $post Post object.\n */\ndo_action( 'edit_form_before_permalink', $post );\n?>\n<div class=\"inside\">\n<?php\nif ( $viewable ) :\n$sample_permalink_html = $post_type_object->public ? get_sample_permalink_html($post->ID) : '';\n\n// As of 4.4, the Get Shortlink button is hidden by default.\nif ( has_filter( 'pre_get_shortlink' ) || has_filter( 'get_shortlink' ) ) {\n\t$shortlink = wp_get_shortlink($post->ID, 'post');\n\n\tif ( !empty( $shortlink ) && $shortlink !== $permalink && $permalink !== home_url('?page_id=' . $post->ID) ) {\n    \t$sample_permalink_html .= '<input id=\"shortlink\" type=\"hidden\" value=\"' . esc_attr($shortlink) . '\" /><a href=\"#\" class=\"button button-small\" onclick=\"prompt(&#39;URL:&#39;, jQuery(\\'#shortlink\\').val()); return false;\">' . __('Get Shortlink') . '</a>';\n\t}\n}\n\nif ( $post_type_object->public && ! ( 'pending' == get_post_status( $post ) && !current_user_can( $post_type_object->cap->publish_posts ) ) ) {\n\t$has_sample_permalink = $sample_permalink_html && 'auto-draft' != $post->post_status;\n?>\n\t<div id=\"edit-slug-box\" class=\"hide-if-no-js\">\n\t<?php\n\t\tif ( $has_sample_permalink )\n\t\t\techo $sample_permalink_html;\n\t?>\n\t</div>\n<?php\n}\nendif;\n?>\n</div>\n<?php\nwp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false );\n?>\n</div><!-- /titlediv -->\n<?php\n}\n/**\n * Fires after the title field.\n *\n * @since 3.5.0\n *\n * @param WP_Post $post Post object.\n */\ndo_action( 'edit_form_after_title', $post );\n\nif ( post_type_supports($post_type, 'editor') ) {\n?>\n<div id=\"postdivrich\" class=\"postarea<?php if ( $_wp_editor_expand ) { echo ' wp-editor-expand'; } ?>\">\n\n<?php wp_editor( $post->post_content, 'content', array(\n\t'_content_editor_dfw' => $_content_editor_dfw,\n\t'drag_drop_upload' => true,\n\t'tabfocus_elements' => 'content-html,save-post',\n\t'editor_height' => 300,\n\t'tinymce' => array(\n\t\t'resize' => false,\n\t\t'wp_autoresize_on' => $_wp_editor_expand,\n\t\t'add_unload_trigger' => false,\n\t),\n) ); ?>\n<table id=\"post-status-info\"><tbody><tr>\n\t<td id=\"wp-word-count\" class=\"hide-if-no-js\"><?php printf( __( 'Word count: %s' ), '<span class=\"word-count\">0</span>' ); ?></td>\n\t<td class=\"autosave-info\">\n\t<span class=\"autosave-message\">&nbsp;</span>\n<?php\n\tif ( 'auto-draft' != $post->post_status ) {\n\t\techo '<span id=\"last-edit\">';\n\t\tif ( $last_user = get_userdata( get_post_meta( $post_ID, '_edit_last', true ) ) ) {\n\t\t\tprintf(__('Last edited by %1$s on %2$s at %3$s'), esc_html( $last_user->display_name ), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified));\n\t\t} else {\n\t\t\tprintf(__('Last edited on %1$s at %2$s'), mysql2date(get_option('date_format'), $post->post_modified), mysql2date(get_option('time_format'), $post->post_modified));\n\t\t}\n\t\techo '</span>';\n\t} ?>\n\t</td>\n\t<td id=\"content-resize-handle\" class=\"hide-if-no-js\"><br /></td>\n</tr></tbody></table>\n\n</div>\n<?php }\n/**\n * Fires after the content editor.\n *\n * @since 3.5.0\n *\n * @param WP_Post $post Post object.\n */\ndo_action( 'edit_form_after_editor', $post );\n?>\n</div><!-- /post-body-content -->\n\n<div id=\"postbox-container-1\" class=\"postbox-container\">\n<?php\n\nif ( 'page' == $post_type ) {\n\t/**\n\t * Fires before meta boxes with 'side' context are output for the 'page' post type.\n\t *\n\t * The submitpage box is a meta box with 'side' context, so this hook fires just before it is output.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param WP_Post $post Post object.\n\t */\n\tdo_action( 'submitpage_box', $post );\n}\nelse {\n\t/**\n\t * Fires before meta boxes with 'side' context are output for all post types other than 'page'.\n\t *\n\t * The submitpost box is a meta box with 'side' context, so this hook fires just before it is output.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param WP_Post $post Post object.\n\t */\n\tdo_action( 'submitpost_box', $post );\n}\n\n\ndo_meta_boxes($post_type, 'side', $post);\n\n?>\n</div>\n<div id=\"postbox-container-2\" class=\"postbox-container\">\n<?php\n\ndo_meta_boxes(null, 'normal', $post);\n\nif ( 'page' == $post_type ) {\n\t/**\n\t * Fires after 'normal' context meta boxes have been output for the 'page' post type.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param WP_Post $post Post object.\n\t */\n\tdo_action( 'edit_page_form', $post );\n}\nelse {\n\t/**\n\t * Fires after 'normal' context meta boxes have been output for all post types other than 'page'.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param WP_Post $post Post object.\n\t */\n\tdo_action( 'edit_form_advanced', $post );\n}\n\n\ndo_meta_boxes(null, 'advanced', $post);\n\n?>\n</div>\n<?php\n/**\n * Fires after all meta box sections have been output, before the closing #post-body div.\n *\n * @since 2.1.0\n *\n * @param WP_Post $post Post object.\n */\ndo_action( 'dbx_post_sidebar', $post );\n\n?>\n</div><!-- /post-body -->\n<br class=\"clear\" />\n</div><!-- /poststuff -->\n</form>\n</div>\n\n<?php\nif ( post_type_supports( $post_type, 'comments' ) )\n\twp_comment_reply();\n?>\n\n<?php if ( ! wp_is_mobile() && post_type_supports( $post_type, 'title' ) && '' === $post->post_title ) : ?>\n<script type=\"text/javascript\">\ntry{document.post.title.focus();}catch(e){}\n</script>\n<?php endif; ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/edit-form-comment.php",
    "content": "<?php\n/**\n * Edit comment form for inclusion in another file.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n// don't load directly\nif ( !defined('ABSPATH') )\n\tdie('-1');\n?>\n<form name=\"post\" action=\"comment.php\" method=\"post\" id=\"post\">\n<?php wp_nonce_field('update-comment_' . $comment->comment_ID) ?>\n<div class=\"wrap\">\n<h1><?php _e( 'Edit Comment' ); ?></h1>\n\n<div id=\"poststuff\">\n<input type=\"hidden\" name=\"action\" value=\"editedcomment\" />\n<input type=\"hidden\" name=\"comment_ID\" value=\"<?php echo esc_attr( $comment->comment_ID ); ?>\" />\n<input type=\"hidden\" name=\"comment_post_ID\" value=\"<?php echo esc_attr( $comment->comment_post_ID ); ?>\" />\n\n<div id=\"post-body\" class=\"metabox-holder columns-2\">\n<div id=\"post-body-content\" class=\"edit-form-section edit-comment-section\">\n<?php\nif ( $comment->comment_post_ID > 0 ):\n\t$comment_link = get_comment_link( $comment );\n?>\n<div class=\"inside\">\n\t<div id=\"comment-link-box\">\n\t\t<strong><?php _ex( 'Permalink:', 'comment' ); ?></strong>\n\t\t<span id=\"sample-permalink\"><a href=\"<?php echo $comment_link; ?>\"><?php echo $comment_link; ?></a></span>\n\t</div>\n</div>\n<?php endif; ?>\n<div id=\"namediv\" class=\"stuffbox\">\n<div class=\"inside\">\n<fieldset>\n<legend class=\"edit-comment-author\"><?php _e( 'Author' ) ?></legend>\n<table class=\"form-table editcomment\">\n<tbody>\n<tr>\n\t<td class=\"first\"><label for=\"name\"><?php _e( 'Name:' ); ?></label></td>\n\t<td><input type=\"text\" name=\"newcomment_author\" size=\"30\" value=\"<?php echo esc_attr( $comment->comment_author ); ?>\" id=\"name\" /></td>\n</tr>\n<tr>\n\t<td class=\"first\"><label for=\"email\"><?php _e( 'Email:' ); ?></label></td>\n\t<td>\n\t\t<input type=\"text\" name=\"newcomment_author_email\" size=\"30\" value=\"<?php echo $comment->comment_author_email; ?>\" id=\"email\" />\n\t</td>\n</tr>\n<tr>\n\t<td class=\"first\"><label for=\"newcomment_author_url\"><?php _e( 'URL:' ); ?></label></td>\n\t<td>\n\t\t<input type=\"text\" id=\"newcomment_author_url\" name=\"newcomment_author_url\" size=\"30\" class=\"code\" value=\"<?php echo esc_attr($comment->comment_author_url); ?>\" />\n\t</td>\n</tr>\n</tbody>\n</table>\n<br />\n</fieldset>\n</div>\n</div>\n\n<div id=\"postdiv\" class=\"postarea\">\n<?php\n\techo '<label for=\"content\" class=\"screen-reader-text\">' . __( 'Comment' ) . '</label>';\n\t$quicktags_settings = array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' );\n\twp_editor( $comment->comment_content, 'content', array( 'media_buttons' => false, 'tinymce' => false, 'quicktags' => $quicktags_settings ) );\n\twp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); ?>\n</div>\n</div><!-- /post-body-content -->\n\n<div id=\"postbox-container-1\" class=\"postbox-container\">\n<div id=\"submitdiv\" class=\"stuffbox\" >\n<h2><?php _e( 'Status' ) ?></h2>\n<div class=\"inside\">\n<div class=\"submitbox\" id=\"submitcomment\">\n<div id=\"minor-publishing\">\n\n<div id=\"misc-publishing-actions\">\n\n<fieldset class=\"misc-pub-section misc-pub-comment-status\" id=\"comment-status-radio\">\n<legend class=\"screen-reader-text\"><?php _e( 'Comment status' ); ?></legend>\n<label class=\"approved\"><input type=\"radio\"<?php checked( $comment->comment_approved, '1' ); ?> name=\"comment_status\" value=\"1\" /><?php /* translators: comment type radio button */ _ex('Approved', 'adjective') ?></label><br />\n<label class=\"waiting\"><input type=\"radio\"<?php checked( $comment->comment_approved, '0' ); ?> name=\"comment_status\" value=\"0\" /><?php /* translators: comment type radio button */ _ex('Pending', 'adjective') ?></label><br />\n<label class=\"spam\"><input type=\"radio\"<?php checked( $comment->comment_approved, 'spam' ); ?> name=\"comment_status\" value=\"spam\" /><?php /* translators: comment type radio button */ _ex('Spam', 'adjective'); ?></label>\n</fieldset>\n\n<div class=\"misc-pub-section curtime misc-pub-curtime\">\n<?php\n/* translators: Publish box date format, see http://php.net/date */\n$datef = __( 'M j, Y @ H:i' );\n?>\n<span id=\"timestamp\"><?php\nprintf(\n\t/* translators: %s: comment date */\n\t__( 'Submitted on: %s' ),\n\t'<b>' . date_i18n( $datef, strtotime( $comment->comment_date ) ) . '</b>'\n);\n?></span>\n<a href=\"#edit_timestamp\" class=\"edit-timestamp hide-if-no-js\"><span aria-hidden=\"true\"><?php _e( 'Edit' ); ?></span> <span class=\"screen-reader-text\"><?php _e( 'Edit date and time' ); ?></span></a>\n<fieldset id='timestampdiv' class='hide-if-js'>\n<legend class=\"screen-reader-text\"><?php _e( 'Date and time' ); ?></legend>\n<?php touch_time( ( 'editcomment' === $action ), 0 ); ?>\n</fieldset>\n</div>\n\n<?php\n$post_id = $comment->comment_post_ID;\nif ( current_user_can( 'edit_post', $post_id ) ) {\n\t$post_link = \"<a href='\" . esc_url( get_edit_post_link( $post_id ) ) . \"'>\";\n\t$post_link .= esc_html( get_the_title( $post_id ) ) . '</a>';\n} else {\n\t$post_link = esc_html( get_the_title( $post_id ) );\n}\n?>\n\n<div class=\"misc-pub-section misc-pub-response-to\">\n\t<?php printf(\n\t\t/* translators: %s: post link */\n\t\t__( 'In response to: %s' ),\n\t\t'<b>' . $post_link . '</b>'\n\t); ?>\n</div>\n\n<?php\nif ( $comment->comment_parent ) :\n\t$parent      = get_comment( $comment->comment_parent );\n\tif ( $parent ) :\n\t\t$parent_link = esc_url( get_comment_link( $parent ) );\n\t\t$name        = get_comment_author( $parent );\n\t?>\n\t<div class=\"misc-pub-section misc-pub-reply-to\">\n\t\t<?php printf(\n\t\t\t/* translators: %s: comment link */\n\t\t\t__( 'In reply to: %s' ),\n\t\t\t'<b><a href=\"' . $parent_link . '\">' . $name . '</a></b>'\n\t\t); ?>\n\t</div>\n<?php endif;\nendif; ?>\n\n<?php\n\t/**\n\t * Filter miscellaneous actions for the edit comment form sidebar.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param string $html    Output HTML to display miscellaneous action.\n\t * @param object $comment Current comment object.\n\t */\n\t echo apply_filters( 'edit_comment_misc_actions', '', $comment );\n?>\n\n</div> <!-- misc actions -->\n<div class=\"clear\"></div>\n</div>\n\n<div id=\"major-publishing-actions\">\n<div id=\"delete-action\">\n<?php echo \"<a class='submitdelete deletion' href='\" . wp_nonce_url(\"comment.php?action=\" . ( !EMPTY_TRASH_DAYS ? 'deletecomment' : 'trashcomment' ) . \"&amp;c=$comment->comment_ID&amp;_wp_original_http_referer=\" . urlencode(wp_get_referer()), 'delete-comment_' . $comment->comment_ID) . \"'>\" . ( !EMPTY_TRASH_DAYS ? __('Delete Permanently') : __('Move to Trash') ) . \"</a>\\n\"; ?>\n</div>\n<div id=\"publishing-action\">\n<?php submit_button( __( 'Update' ), 'primary', 'save', false ); ?>\n</div>\n<div class=\"clear\"></div>\n</div>\n</div>\n</div>\n</div><!-- /submitdiv -->\n</div>\n\n<div id=\"postbox-container-2\" class=\"postbox-container\">\n<?php\n/** This action is documented in wp-admin/edit-form-advanced.php */\ndo_action( 'add_meta_boxes', 'comment', $comment );\n\n/**\n * Fires when comment-specific meta boxes are added.\n *\n * @since 3.0.0\n *\n * @param WP_Comment $comment Comment object.\n */\ndo_action( 'add_meta_boxes_comment', $comment );\n\ndo_meta_boxes(null, 'normal', $comment);\n\n$referer = wp_get_referer();\n?>\n</div>\n\n<input type=\"hidden\" name=\"c\" value=\"<?php echo esc_attr($comment->comment_ID) ?>\" />\n<input type=\"hidden\" name=\"p\" value=\"<?php echo esc_attr($comment->comment_post_ID) ?>\" />\n<input name=\"referredby\" type=\"hidden\" id=\"referredby\" value=\"<?php echo $referer ? esc_url( $referer ) : ''; ?>\" />\n<?php wp_original_referer_field(true, 'previous'); ?>\n<input type=\"hidden\" name=\"noredir\" value=\"1\" />\n\n</div><!-- /post-body -->\n</div>\n</div>\n</form>\n\n<?php if ( ! wp_is_mobile() ) : ?>\n<script type=\"text/javascript\">\ntry{document.post.name.focus();}catch(e){}\n</script>\n<?php endif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/edit-link-form.php",
    "content": "<?php\n/**\n * Edit links form for inclusion in administration panels.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n// don't load directly\nif ( !defined('ABSPATH') )\n\tdie('-1');\n\nif ( ! empty($link_id) ) {\n\t$heading = sprintf( __( '<a href=\"%s\">Links</a> / Edit Link' ), 'link-manager.php' );\n\t$submit_text = __('Update Link');\n\t$form_name = 'editlink';\n\t$nonce_action = 'update-bookmark_' . $link_id;\n} else {\n\t$heading = sprintf( __( '<a href=\"%s\">Links</a> / Add New Link' ), 'link-manager.php' );\n\t$submit_text = __('Add Link');\n\t$form_name = 'addlink';\n\t$nonce_action = 'add-bookmark';\n}\n\nrequire_once( ABSPATH . 'wp-admin/includes/meta-boxes.php' );\n\nadd_meta_box('linksubmitdiv', __('Save'), 'link_submit_meta_box', null, 'side', 'core');\nadd_meta_box('linkcategorydiv', __('Categories'), 'link_categories_meta_box', null, 'normal', 'core');\nadd_meta_box('linktargetdiv', __('Target'), 'link_target_meta_box', null, 'normal', 'core');\nadd_meta_box('linkxfndiv', __('Link Relationship (XFN)'), 'link_xfn_meta_box', null, 'normal', 'core');\nadd_meta_box('linkadvanceddiv', __('Advanced'), 'link_advanced_meta_box', null, 'normal', 'core');\n\n/** This action is documented in wp-admin/edit-form-advanced.php */\ndo_action( 'add_meta_boxes', 'link', $link );\n\n/**\n * Fires when link-specific meta boxes are added.\n *\n * @since 3.0.0\n *\n * @param object $link Link object.\n */\ndo_action( 'add_meta_boxes_link', $link );\n\n/** This action is documented in wp-admin/edit-form-advanced.php */\ndo_action( 'do_meta_boxes', 'link', 'normal', $link );\n/** This action is documented in wp-admin/edit-form-advanced.php */\ndo_action( 'do_meta_boxes', 'link', 'advanced', $link );\n/** This action is documented in wp-admin/edit-form-advanced.php */\ndo_action( 'do_meta_boxes', 'link', 'side', $link );\n\nadd_screen_option('layout_columns', array('max' => 2, 'default' => 2) );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t'<p>' . __( 'You can add or edit links on this screen by entering information in each of the boxes. Only the link&#8217;s web address and name (the text you want to display on your site as the link) are required fields.' ) . '</p>' .\n\t'<p>' . __( 'The boxes for link name, web address, and description have fixed positions, while the others may be repositioned using drag and drop. You can also hide boxes you don&#8217;t use in the Screen Options tab, or minimize boxes by clicking on the title bar of the box.' ) . '</p>' .\n\t'<p>' . __( 'XFN stands for <a href=\"http://gmpg.org/xfn/\" target=\"_blank\">XHTML Friends Network</a>, which is optional. WordPress allows the generation of XFN attributes to show how you are related to the authors/owners of the site to which you are linking.' ) . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Links_Add_New_Screen\" target=\"_blank\">Documentation on Creating Links</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n);\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?>  <a href=\"link-add.php\" class=\"page-title-action\"><?php echo esc_html_x('Add New', 'link'); ?></a></h1>\n\n<?php if ( isset( $_GET['added'] ) ) : ?>\n<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e('Link added.'); ?></p></div>\n<?php endif; ?>\n\n<form name=\"<?php echo esc_attr( $form_name ); ?>\" id=\"<?php echo esc_attr( $form_name ); ?>\" method=\"post\" action=\"link.php\">\n<?php\nif ( ! empty( $link_added ) ) {\n\techo $link_added;\n}\n\nwp_nonce_field( $nonce_action );\nwp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );\nwp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); ?>\n\n<div id=\"poststuff\">\n\n<div id=\"post-body\" class=\"metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? '1' : '2'; ?>\">\n<div id=\"post-body-content\">\n<div id=\"namediv\" class=\"stuffbox\">\n<h2><label for=\"link_name\"><?php _ex( 'Name', 'link name' ) ?></label></h2>\n<div class=\"inside\">\n\t<input type=\"text\" name=\"link_name\" size=\"30\" maxlength=\"255\" value=\"<?php echo esc_attr($link->link_name); ?>\" id=\"link_name\" />\n\t<p><?php _e('Example: Nifty blogging software'); ?></p>\n</div>\n</div>\n\n<div id=\"addressdiv\" class=\"stuffbox\">\n<h2><label for=\"link_url\"><?php _e( 'Web Address' ) ?></label></h2>\n<div class=\"inside\">\n\t<input type=\"text\" name=\"link_url\" size=\"30\" maxlength=\"255\" class=\"code\" value=\"<?php echo esc_attr($link->link_url); ?>\" id=\"link_url\" />\n\t<p><?php _e('Example: <code>http://wordpress.org/</code> &#8212; don&#8217;t forget the <code>http://</code>'); ?></p>\n</div>\n</div>\n\n<div id=\"descriptiondiv\" class=\"stuffbox\">\n<h2><label for=\"link_description\"><?php _e( 'Description' ) ?></label></h2>\n<div class=\"inside\">\n\t<input type=\"text\" name=\"link_description\" size=\"30\" maxlength=\"255\" value=\"<?php echo isset($link->link_description) ? esc_attr($link->link_description) : ''; ?>\" id=\"link_description\" />\n\t<p><?php _e('This will be shown when someone hovers over the link in the blogroll, or optionally below the link.'); ?></p>\n</div>\n</div>\n</div><!-- /post-body-content -->\n\n<div id=\"postbox-container-1\" class=\"postbox-container\">\n<?php\n\n/** This action is documented in wp-admin/includes/meta-boxes.php */\ndo_action( 'submitlink_box' );\n$side_meta_boxes = do_meta_boxes( 'link', 'side', $link );\n\n?>\n</div>\n<div id=\"postbox-container-2\" class=\"postbox-container\">\n<?php\n\ndo_meta_boxes(null, 'normal', $link);\n\ndo_meta_boxes(null, 'advanced', $link);\n\n?>\n</div>\n<?php\n\nif ( $link_id ) : ?>\n<input type=\"hidden\" name=\"action\" value=\"save\" />\n<input type=\"hidden\" name=\"link_id\" value=\"<?php echo (int) $link_id; ?>\" />\n<input type=\"hidden\" name=\"cat_id\" value=\"<?php echo (int) $cat_id ?>\" />\n<?php else: ?>\n<input type=\"hidden\" name=\"action\" value=\"add\" />\n<?php endif; ?>\n\n</div>\n</div>\n\n</form>\n</div>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/edit-tag-form.php",
    "content": "<?php\n/**\n * Edit tag form for inclusion in administration panels.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n// don't load directly\nif ( !defined('ABSPATH') )\n\tdie('-1');\n\nif ( empty($tag_ID) ) { ?>\n\t<div id=\"message\" class=\"updated notice is-dismissible\"><p><strong><?php _e( 'You did not select an item for editing.' ); ?></strong></p></div>\n<?php\n\treturn;\n}\n\n// Back compat hooks\nif ( 'category' == $taxonomy ) {\n\t/**\n \t * Fires before the Edit Category form.\n\t *\n\t * @since 2.1.0\n\t * @deprecated 3.0.0 Use {$taxonomy}_pre_edit_form instead.\n\t *\n\t * @param object $tag Current category term object.\n\t */\n\tdo_action( 'edit_category_form_pre', $tag );\n} elseif ( 'link_category' == $taxonomy ) {\n\t/**\n\t * Fires before the Edit Link Category form.\n\t *\n\t * @since 2.3.0\n\t * @deprecated 3.0.0 Use {$taxonomy}_pre_edit_form instead.\n\t *\n\t * @param object $tag Current link category term object.\n\t */\n\tdo_action( 'edit_link_category_form_pre', $tag );\n} else {\n\t/**\n\t * Fires before the Edit Tag form.\n\t *\n\t * @since 2.5.0\n\t * @deprecated 3.0.0 Use {$taxonomy}_pre_edit_form instead.\n\t *\n\t * @param object $tag Current tag term object.\n\t */\n\tdo_action( 'edit_tag_form_pre', $tag );\n}\n\n/**\n * Use with caution, see http://codex.wordpress.org/Function_Reference/wp_reset_vars\n */\nwp_reset_vars( array( 'wp_http_referer' ) );\n\n$wp_http_referer = remove_query_arg( array( 'action', 'message', 'tag_ID' ), $wp_http_referer );\n\n/** Also used by Edit Tags */\nrequire_once( ABSPATH . 'wp-admin/includes/edit-tag-messages.php' );\n\n/**\n * Fires before the Edit Term form for all taxonomies.\n *\n * The dynamic portion of the hook name, `$taxonomy`, refers to\n * the taxonomy slug.\n *\n * @since 3.0.0\n *\n * @param object $tag      Current taxonomy term object.\n * @param string $taxonomy Current $taxonomy slug.\n */\ndo_action( \"{$taxonomy}_pre_edit_form\", $tag, $taxonomy ); ?>\n\n<div class=\"wrap\">\n<h1><?php echo $tax->labels->edit_item; ?></h1>\n\n<?php if ( $message ) : ?>\n<div id=\"message\" class=\"updated\">\n\t<p><strong><?php echo $message; ?></strong></p>\n\t<?php if ( $wp_http_referer ) { ?>\n\t<p><a href=\"<?php echo esc_url( $wp_http_referer ); ?>\"><?php printf( __( '&larr; Back to %s' ), $tax->labels->name ); ?></a></p>\n\t<?php } else { ?>\n\t<p><a href=\"<?php echo esc_url( wp_get_referer() ); ?>\"><?php printf( __( '&larr; Back to %s' ), $tax->labels->name ); ?></a></p>\n\t<?php } ?>\n</div>\n<?php endif; ?>\n\n<div id=\"ajax-response\"></div>\n\n<form name=\"edittag\" id=\"edittag\" method=\"post\" action=\"edit-tags.php\" class=\"validate\"\n<?php\n/**\n * Fires inside the Edit Term form tag.\n *\n * The dynamic portion of the hook name, `$taxonomy`, refers to\n * the taxonomy slug.\n *\n * @since 3.7.0\n */\ndo_action( \"{$taxonomy}_term_edit_form_tag\" );\n?>>\n<input type=\"hidden\" name=\"action\" value=\"editedtag\" />\n<input type=\"hidden\" name=\"tag_ID\" value=\"<?php echo esc_attr($tag->term_id) ?>\" />\n<input type=\"hidden\" name=\"taxonomy\" value=\"<?php echo esc_attr($taxonomy) ?>\" />\n<?php wp_original_referer_field(true, 'previous'); wp_nonce_field('update-tag_' . $tag_ID); ?>\n\t<table class=\"form-table\">\n\t\t<tr class=\"form-field form-required term-name-wrap\">\n\t\t\t<th scope=\"row\"><label for=\"name\"><?php _ex( 'Name', 'term name' ); ?></label></th>\n\t\t\t<td><input name=\"name\" id=\"name\" type=\"text\" value=\"<?php if ( isset( $tag->name ) ) echo esc_attr($tag->name); ?>\" size=\"40\" aria-required=\"true\" />\n\t\t\t<p class=\"description\"><?php _e('The name is how it appears on your site.'); ?></p></td>\n\t\t</tr>\n<?php if ( !global_terms_enabled() ) { ?>\n\t\t<tr class=\"form-field term-slug-wrap\">\n\t\t\t<th scope=\"row\"><label for=\"slug\"><?php _e( 'Slug' ); ?></label></th>\n\t\t\t<?php\n\t\t\t/**\n\t\t\t * Filter the editable slug.\n\t\t\t *\n\t\t\t * Note: This is a multi-use hook in that it is leveraged both for editable\n\t\t\t * post URIs and term slugs.\n\t\t\t *\n\t\t\t * @since 2.6.0\n\t\t\t * @since 4.4.0 The `$tag` parameter was added.\n\t\t\t *\n\t\t\t * @param string         $slug The editable slug. Will be either a term slug or post URI depending\n\t\t\t *                             upon the context in which it is evaluated.\n\t\t\t * @param object|WP_Post $tag  Term or WP_Post object.\n\t\t\t */\n\t\t\t$slug = isset( $tag->slug ) ? apply_filters( 'editable_slug', $tag->slug, $tag ) : '';\n\t\t\t?>\n\t\t\t<td><input name=\"slug\" id=\"slug\" type=\"text\" value=\"<?php echo esc_attr( $slug ); ?>\" size=\"40\" />\n\t\t\t<p class=\"description\"><?php _e('The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.'); ?></p></td>\n\t\t</tr>\n<?php } ?>\n<?php if ( is_taxonomy_hierarchical($taxonomy) ) : ?>\n\t\t<tr class=\"form-field term-parent-wrap\">\n\t\t\t<th scope=\"row\"><label for=\"parent\"><?php _ex( 'Parent', 'term parent' ); ?></label></th>\n\t\t\t<td>\n\t\t\t\t<?php\n\t\t\t\t$dropdown_args = array(\n\t\t\t\t\t'hide_empty'       => 0,\n\t\t\t\t\t'hide_if_empty'    => false,\n\t\t\t\t\t'taxonomy'         => $taxonomy,\n\t\t\t\t\t'name'             => 'parent',\n\t\t\t\t\t'orderby'          => 'name',\n\t\t\t\t\t'selected'         => $tag->parent,\n\t\t\t\t\t'exclude_tree'     => $tag->term_id,\n\t\t\t\t\t'hierarchical'     => true,\n\t\t\t\t\t'show_option_none' => __( 'None' ),\n\t\t\t\t);\n\n\t\t\t\t/** This filter is documented in wp-admin/edit-tags.php */\n\t\t\t\t$dropdown_args = apply_filters( 'taxonomy_parent_dropdown_args', $dropdown_args, $taxonomy, 'edit' );\n\t\t\t\twp_dropdown_categories( $dropdown_args ); ?>\n\t\t\t\t<?php if ( 'category' == $taxonomy ) : ?>\n\t\t\t\t<p class=\"description\"><?php _e('Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional.'); ?></p>\n\t\t\t\t<?php endif; ?>\n\t\t\t</td>\n\t\t</tr>\n<?php endif; // is_taxonomy_hierarchical() ?>\n\t\t<tr class=\"form-field term-description-wrap\">\n\t\t\t<th scope=\"row\"><label for=\"description\"><?php _e( 'Description' ); ?></label></th>\n\t\t\t<td><textarea name=\"description\" id=\"description\" rows=\"5\" cols=\"50\" class=\"large-text\"><?php echo $tag->description; // textarea_escaped ?></textarea>\n\t\t\t<p class=\"description\"><?php _e('The description is not prominent by default; however, some themes may show it.'); ?></p></td>\n\t\t</tr>\n\t\t<?php\n\t\t// Back compat hooks\n\t\tif ( 'category' == $taxonomy ) {\n\t\t\t/**\n\t\t\t * Fires after the Edit Category form fields are displayed.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t * @deprecated 3.0.0 Use {$taxonomy}_edit_form_fields instead.\n\t\t\t *\n\t\t\t * @param object $tag Current category term object.\n\t\t\t */\n\t\t\tdo_action( 'edit_category_form_fields', $tag );\n\t\t} elseif ( 'link_category' == $taxonomy ) {\n\t\t\t/**\n\t\t\t * Fires after the Edit Link Category form fields are displayed.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t * @deprecated 3.0.0 Use {$taxonomy}_edit_form_fields instead.\n\t\t\t *\n\t\t\t * @param object $tag Current link category term object.\n\t\t\t */\n\t\t\tdo_action( 'edit_link_category_form_fields', $tag );\n\t\t} else {\n\t\t\t/**\n\t\t\t * Fires after the Edit Tag form fields are displayed.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t * @deprecated 3.0.0 Use {$taxonomy}_edit_form_fields instead.\n\t\t\t *\n\t\t\t * @param object $tag Current tag term object.\n\t\t\t */\n\t\t\tdo_action( 'edit_tag_form_fields', $tag );\n\t\t}\n\t\t/**\n\t\t * Fires after the Edit Term form fields are displayed.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$taxonomy`, refers to\n\t\t * the taxonomy slug.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param object $tag      Current taxonomy term object.\n\t\t * @param string $taxonomy Current taxonomy slug.\n\t\t */\n\t\tdo_action( \"{$taxonomy}_edit_form_fields\", $tag, $taxonomy );\n\t\t?>\n\t</table>\n<?php\n// Back compat hooks\nif ( 'category' == $taxonomy ) {\n\t/** This action is documented in wp-admin/edit-tags.php */\n\tdo_action( 'edit_category_form', $tag );\n} elseif ( 'link_category' == $taxonomy ) {\n\t/** This action is documented in wp-admin/edit-tags.php */\n\tdo_action( 'edit_link_category_form', $tag );\n} else {\n\t/**\n\t * Fires at the end of the Edit Term form.\n\t *\n\t * @since 2.5.0\n\t * @deprecated 3.0.0 Use {$taxonomy}_edit_form instead.\n\t *\n\t * @param object $tag Current taxonomy term object.\n\t */\n\tdo_action( 'edit_tag_form', $tag );\n}\n/**\n * Fires at the end of the Edit Term form for all taxonomies.\n *\n * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n *\n * @since 3.0.0\n *\n * @param object $tag      Current taxonomy term object.\n * @param string $taxonomy Current taxonomy slug.\n */\ndo_action( \"{$taxonomy}_edit_form\", $tag, $taxonomy );\n\nsubmit_button( __('Update') );\n?>\n</form>\n</div>\n\n<?php if ( ! wp_is_mobile() ) : ?>\n<script type=\"text/javascript\">\ntry{document.forms.edittag.name.focus();}catch(e){}\n</script>\n<?php endif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/edit-tags.php",
    "content": "<?php\n/**\n * Edit Tags Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! $taxnow )\n\twp_die( __( 'Invalid taxonomy' ) );\n\n$tax = get_taxonomy( $taxnow );\n\nif ( ! $tax )\n\twp_die( __( 'Invalid taxonomy' ) );\n\nif ( ! in_array( $tax->name, get_taxonomies( array( 'show_ui' => true ) ) ) ) {\n   wp_die( __( 'You are not allowed to manage these items.' ) );\n}\n\nif ( ! current_user_can( $tax->cap->manage_terms ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to manage these items.' ) . '</p>',\n\t\t403\n\t);\n}\n\n/**\n * $post_type is set when the WP_Terms_List_Table instance is created\n *\n * @global string $post_type\n */\nglobal $post_type;\n\n$wp_list_table = _get_list_table('WP_Terms_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n\n$title = $tax->labels->name;\n\nif ( 'post' != $post_type ) {\n\t$parent_file = ( 'attachment' == $post_type ) ? 'upload.php' : \"edit.php?post_type=$post_type\";\n\t$submenu_file = \"edit-tags.php?taxonomy=$taxonomy&amp;post_type=$post_type\";\n} elseif ( 'link_category' == $tax->name ) {\n\t$parent_file = 'link-manager.php';\n\t$submenu_file = 'edit-tags.php?taxonomy=link_category';\n} else {\n\t$parent_file = 'edit.php';\n\t$submenu_file = \"edit-tags.php?taxonomy=$taxonomy\";\n}\n\nadd_screen_option( 'per_page', array( 'default' => 20, 'option' => 'edit_' . $tax->name . '_per_page' ) );\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_pagination' => $tax->labels->items_list_navigation,\n\t'heading_list'       => $tax->labels->items_list,\n) );\n\n$location = false;\n$referer = wp_get_referer();\n\nswitch ( $wp_list_table->current_action() ) {\n\ncase 'add-tag':\n\n\tcheck_admin_referer( 'add-tag', '_wpnonce_add-tag' );\n\n\tif ( ! current_user_can( $tax->cap->edit_terms ) ) {\n\t\twp_die(\n\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t'<p>' . __( 'You are not allowed to add this item.' ) . '</p>',\n\t\t\t403\n\t\t);\n\t}\n\n\t$ret = wp_insert_term( $_POST['tag-name'], $taxonomy, $_POST );\n\t$location = 'edit-tags.php?taxonomy=' . $taxonomy;\n\tif ( 'post' != $post_type )\n\t\t$location .= '&post_type=' . $post_type;\n\n\tif ( $referer && false !== strpos( $referer, 'edit-tags.php' ) ) {\n\t\t$location = $referer;\n\t}\n\n\tif ( $ret && !is_wp_error( $ret ) )\n\t\t$location = add_query_arg( 'message', 1, $location );\n\telse\n\t\t$location = add_query_arg( array( 'error' => true, 'message' => 4 ), $location );\n\n\tbreak;\n\ncase 'delete':\n\t$location = 'edit-tags.php?taxonomy=' . $taxonomy;\n\tif ( 'post' != $post_type )\n\t\t$location .= '&post_type=' . $post_type;\n\n\tif ( $referer && false !== strpos( $referer, 'edit-tags.php' ) ) {\n\t\t$location = $referer;\n\t}\n\n\tif ( ! isset( $_REQUEST['tag_ID'] ) ) {\n\t\tbreak;\n\t}\n\n\t$tag_ID = (int) $_REQUEST['tag_ID'];\n\tcheck_admin_referer( 'delete-tag_' . $tag_ID );\n\n\tif ( ! current_user_can( $tax->cap->delete_terms ) ) {\n\t\twp_die(\n\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t'<p>' . __( 'You are not allowed to delete this item.' ) . '</p>',\n\t\t\t403\n\t\t);\n\t}\n\n\twp_delete_term( $tag_ID, $taxonomy );\n\n\t$location = add_query_arg( 'message', 2, $location );\n\n\tbreak;\n\ncase 'bulk-delete':\n\tcheck_admin_referer( 'bulk-tags' );\n\n\tif ( ! current_user_can( $tax->cap->delete_terms ) ) {\n\t\twp_die(\n\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t'<p>' . __( 'You are not allowed to delete these items.' ) . '</p>',\n\t\t\t403\n\t\t);\n\t}\n\n\t$tags = (array) $_REQUEST['delete_tags'];\n\tforeach ( $tags as $tag_ID ) {\n\t\twp_delete_term( $tag_ID, $taxonomy );\n\t}\n\n\t$location = 'edit-tags.php?taxonomy=' . $taxonomy;\n\tif ( 'post' != $post_type )\n\t\t$location .= '&post_type=' . $post_type;\n\tif ( $referer && false !== strpos( $referer, 'edit-tags.php' ) ) {\n\t\t$location = $referer;\n\t}\n\n\t$location = add_query_arg( 'message', 6, $location );\n\n\tbreak;\n\ncase 'edit':\n\t$title = $tax->labels->edit_item;\n\n\t$tag_ID = (int) $_REQUEST['tag_ID'];\n\n\t$tag = get_term( $tag_ID, $taxonomy, OBJECT, 'edit' );\n\tif ( ! $tag )\n\t\twp_die( __( 'You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?' ) );\n\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\tinclude( ABSPATH . 'wp-admin/edit-tag-form.php' );\n\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\n\texit;\n\ncase 'editedtag':\n\t$tag_ID = (int) $_POST['tag_ID'];\n\tcheck_admin_referer( 'update-tag_' . $tag_ID );\n\n\tif ( ! current_user_can( $tax->cap->edit_terms ) ) {\n\t\twp_die(\n\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t'<p>' . __( 'You are not allowed to edit this item.' ) . '</p>',\n\t\t\t403\n\t\t);\n\t}\n\n\t$tag = get_term( $tag_ID, $taxonomy );\n\tif ( ! $tag )\n\t\twp_die( __( 'You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?' ) );\n\n\t$ret = wp_update_term( $tag_ID, $taxonomy, $_POST );\n\n\t$location = 'edit-tags.php?taxonomy=' . $taxonomy;\n\tif ( 'post' != $post_type )\n\t\t$location .= '&post_type=' . $post_type;\n\n\tif ( $referer && false !== strpos( $referer, 'edit-tags.php' ) ) {\n\t\t$location = $referer;\n\t}\n\n\tif ( $ret && !is_wp_error( $ret ) )\n\t\t$location = add_query_arg( 'message', 3, $location );\n\telse\n\t\t$location = add_query_arg( array( 'error' => true, 'message' => 5 ), $location );\n\tbreak;\n}\n\nif ( ! $location && ! empty( $_REQUEST['_wp_http_referer'] ) ) {\n\t$location = remove_query_arg( array('_wp_http_referer', '_wpnonce'), wp_unslash($_SERVER['REQUEST_URI']) );\n}\n\nif ( $location ) {\n\tif ( ! empty( $_REQUEST['paged'] ) ) {\n\t\t$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );\n\t}\n\twp_redirect( $location );\n\texit;\n}\n\n$wp_list_table->prepare_items();\n$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );\n\nif ( $pagenum > $total_pages && $total_pages > 0 ) {\n\twp_redirect( add_query_arg( 'paged', $total_pages ) );\n\texit;\n}\n\nwp_enqueue_script('admin-tags');\nif ( current_user_can($tax->cap->edit_terms) )\n\twp_enqueue_script('inline-edit-tax');\n\nif ( 'category' == $taxonomy || 'link_category' == $taxonomy || 'post_tag' == $taxonomy  ) {\n\t$help ='';\n\tif ( 'category' == $taxonomy )\n\t\t$help = '<p>' . sprintf(__( 'You can use categories to define sections of your site and group related posts. The default category is &#8220;Uncategorized&#8221; until you change it in your <a href=\"%s\">writing settings</a>.' ) , 'options-writing.php' ) . '</p>';\n\telseif ( 'link_category' == $taxonomy )\n\t\t$help = '<p>' . __( 'You can create groups of links by using Link Categories. Link Category names must be unique and Link Categories are separate from the categories you use for posts.' ) . '</p>';\n\telse\n\t\t$help = '<p>' . __( 'You can assign keywords to your posts using <strong>tags</strong>. Unlike categories, tags have no hierarchy, meaning there&#8217;s no relationship from one tag to another.' ) . '</p>';\n\n\tif ( 'link_category' == $taxonomy )\n\t\t$help .= '<p>' . __( 'You can delete Link Categories in the Bulk Action pull-down, but that action does not delete the links within the category. Instead, it moves them to the default Link Category.' ) . '</p>';\n\telse\n\t\t$help .='<p>' . __( 'What&#8217;s the difference between categories and tags? Normally, tags are ad-hoc keywords that identify important information in your post (names, subjects, etc) that may or may not recur in other posts, while categories are pre-determined sections. If you think of your site like a book, the categories are like the Table of Contents and the tags are like the terms in the index.' ) . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'overview',\n\t\t'title'   => __('Overview'),\n\t\t'content' => $help,\n\t) );\n\n\tif ( 'category' == $taxonomy || 'post_tag' == $taxonomy ) {\n\t\tif ( 'category' == $taxonomy )\n\t\t\t$help = '<p>' . __( 'When adding a new category on this screen, you&#8217;ll fill in the following fields:' ) . '</p>';\n\t\telse\n\t\t\t$help = '<p>' . __( 'When adding a new tag on this screen, you&#8217;ll fill in the following fields:' ) . '</p>';\n\n\t\t$help .= '<ul>' .\n\t\t'<li>' . __( '<strong>Name</strong> &mdash; The name is how it appears on your site.' ) . '</li>';\n\n\t\tif ( ! global_terms_enabled() )\n\t\t\t$help .= '<li>' . __( '<strong>Slug</strong> &mdash; The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' ) . '</li>';\n\n\t\tif ( 'category' == $taxonomy )\n\t\t\t$help .= '<li>' . __( '<strong>Parent</strong> &mdash; Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have child categories for Bebop and Big Band. Totally optional. To create a subcategory, just choose another category from the Parent dropdown.' ) . '</li>';\n\n\t\t$help .= '<li>' . __( '<strong>Description</strong> &mdash; The description is not prominent by default; however, some themes may display it.' ) . '</li>' .\n\t\t'</ul>' .\n\t\t'<p>' . __( 'You can change the display of this screen using the Screen Options tab to set how many items are displayed per screen and to display/hide columns in the table.' ) . '</p>';\n\n\t\tget_current_screen()->add_help_tab( array(\n\t\t\t'id'      => 'adding-terms',\n\t\t\t'title'   => 'category' == $taxonomy ? __( 'Adding Categories' ) : __( 'Adding Tags' ),\n\t\t\t'content' => $help,\n\t\t) );\n\t}\n\n\t$help = '<p><strong>' . __( 'For more information:' ) . '</strong></p>';\n\n\tif ( 'category' == $taxonomy )\n\t\t$help .= '<p>' . __( '<a href=\"https://codex.wordpress.org/Posts_Categories_Screen\" target=\"_blank\">Documentation on Categories</a>' ) . '</p>';\n\telseif ( 'link_category' == $taxonomy )\n\t\t$help .= '<p>' . __( '<a href=\"https://codex.wordpress.org/Links_Link_Categories_Screen\" target=\"_blank\">Documentation on Link Categories</a>' ) . '</p>';\n\telse\n\t\t$help .= '<p>' . __( '<a href=\"https://codex.wordpress.org/Posts_Tags_Screen\" target=\"_blank\">Documentation on Tags</a>' ) . '</p>';\n\n\t$help .= '<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>';\n\n\tget_current_screen()->set_help_sidebar( $help );\n\n\tunset( $help );\n}\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\nif ( ! current_user_can( $tax->cap->edit_terms ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to edit this item.' ) . '</p>',\n\t\t403\n\t);\n}\n\n/** Also used by the Edit Tag  form */\nrequire_once( ABSPATH . 'wp-admin/includes/edit-tag-messages.php' );\n\n$class = ( isset( $_REQUEST['error'] ) ) ? 'error' : 'updated';\n\nif ( is_plugin_active( 'wpcat2tag-importer/wpcat2tag-importer.php' ) ) {\n\t$import_link = admin_url( 'admin.php?import=wpcat2tag' );\n} else {\n\t$import_link = admin_url( 'import.php' );\n}\n\n?>\n\n<div class=\"wrap nosubsub\">\n<h1><?php echo esc_html( $title );\nif ( !empty($_REQUEST['s']) )\n\tprintf( '<span class=\"subtitle\">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( wp_unslash($_REQUEST['s']) ) ); ?>\n</h1>\n\n<?php if ( $message ) : ?>\n<div id=\"message\" class=\"<?php echo $class; ?> notice is-dismissible\"><p><?php echo $message; ?></p></div>\n<?php $_SERVER['REQUEST_URI'] = remove_query_arg( array( 'message', 'error' ), $_SERVER['REQUEST_URI'] );\nendif; ?>\n<div id=\"ajax-response\"></div>\n\n<form class=\"search-form\" method=\"get\">\n<input type=\"hidden\" name=\"taxonomy\" value=\"<?php echo esc_attr($taxonomy); ?>\" />\n<input type=\"hidden\" name=\"post_type\" value=\"<?php echo esc_attr($post_type); ?>\" />\n\n<?php $wp_list_table->search_box( $tax->labels->search_items, 'tag' ); ?>\n\n</form>\n<br class=\"clear\" />\n\n<div id=\"col-container\">\n\n<div id=\"col-right\">\n<div class=\"col-wrap\">\n<form id=\"posts-filter\" method=\"post\">\n<input type=\"hidden\" name=\"taxonomy\" value=\"<?php echo esc_attr($taxonomy); ?>\" />\n<input type=\"hidden\" name=\"post_type\" value=\"<?php echo esc_attr($post_type); ?>\" />\n\n<?php $wp_list_table->display(); ?>\n\n<br class=\"clear\" />\n</form>\n\n<?php if ( 'category' == $taxonomy ) : ?>\n<div class=\"form-wrap\">\n<p>\n\t<?php\n\techo '<strong>' . __( 'Note:' ) . '</strong><br />';\n\tprintf(\n\t\t/* translators: %s: default category */\n\t\t__( 'Deleting a category does not delete the posts in that category. Instead, posts that were only assigned to the deleted category are set to the category %s.' ),\n\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t'<strong>' . apply_filters( 'the_category', get_cat_name( get_option( 'default_category') ) ) . '</strong>'\n\t);\n\t?>\n</p>\n<?php if ( current_user_can( 'import' ) ) : ?>\n<p><?php printf( __( 'Categories can be selectively converted to tags using the <a href=\"%s\">category to tag converter</a>.' ), esc_url( $import_link ) ) ?></p>\n<?php endif; ?>\n</div>\n<?php elseif ( 'post_tag' == $taxonomy && current_user_can( 'import' ) ) : ?>\n<div class=\"form-wrap\">\n<p><?php printf( __( 'Tags can be selectively converted to categories using the <a href=\"%s\">tag to category converter</a>.' ), esc_url( $import_link ) ) ;?></p>\n</div>\n<?php endif;\n\n/**\n * Fires after the taxonomy list table.\n *\n * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n *\n * @since 3.0.0\n *\n * @param string $taxonomy The taxonomy name.\n */\ndo_action( \"after-{$taxonomy}-table\", $taxonomy );\n?>\n\n</div>\n</div><!-- /col-right -->\n\n<div id=\"col-left\">\n<div class=\"col-wrap\">\n\n<?php\n\nif ( !is_null( $tax->labels->popular_items ) ) {\n\tif ( current_user_can( $tax->cap->edit_terms ) )\n\t\t$tag_cloud = wp_tag_cloud( array( 'taxonomy' => $taxonomy, 'post_type' => $post_type, 'echo' => false, 'link' => 'edit' ) );\n\telse\n\t\t$tag_cloud = wp_tag_cloud( array( 'taxonomy' => $taxonomy, 'echo' => false ) );\n\n\tif ( $tag_cloud ) :\n\t?>\n<div class=\"tagcloud\">\n<h2><?php echo $tax->labels->popular_items; ?></h2>\n<?php echo $tag_cloud; unset( $tag_cloud ); ?>\n</div>\n<?php\nendif;\n}\n\nif ( current_user_can($tax->cap->edit_terms) ) {\n\tif ( 'category' == $taxonomy ) {\n\t\t/**\n \t\t * Fires before the Add Category form.\n\t\t *\n\t\t * @since 2.1.0\n\t\t * @deprecated 3.0.0 Use {$taxonomy}_pre_add_form instead.\n\t\t *\n\t\t * @param object $arg Optional arguments cast to an object.\n\t\t */\n\t\tdo_action( 'add_category_form_pre', (object) array( 'parent' => 0 ) );\n\t} elseif ( 'link_category' == $taxonomy ) {\n\t\t/**\n\t\t * Fires before the link category form.\n\t\t *\n\t\t * @since 2.3.0\n\t\t * @deprecated 3.0.0 Use {$taxonomy}_pre_add_form instead.\n\t\t *\n\t\t * @param object $arg Optional arguments cast to an object.\n\t\t */\n\t\tdo_action( 'add_link_category_form_pre', (object) array( 'parent' => 0 ) );\n\t} else {\n\t\t/**\n\t\t * Fires before the Add Tag form.\n\t\t *\n\t\t * @since 2.5.0\n\t\t * @deprecated 3.0.0 Use {$taxonomy}_pre_add_form instead.\n\t\t *\n\t\t * @param string $taxonomy The taxonomy slug.\n\t\t */\n\t\tdo_action( 'add_tag_form_pre', $taxonomy );\n\t}\n\n\t/**\n\t * Fires before the Add Term form for all taxonomies.\n\t *\n\t * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $taxonomy The taxonomy slug.\n\t */\n\tdo_action( \"{$taxonomy}_pre_add_form\", $taxonomy );\n?>\n\n<div class=\"form-wrap\">\n<h2><?php echo $tax->labels->add_new_item; ?></h2>\n<form id=\"addtag\" method=\"post\" action=\"edit-tags.php\" class=\"validate\"\n<?php\n/**\n * Fires at the beginning of the Add Tag form.\n *\n * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n *\n * @since 3.7.0\n */\ndo_action( \"{$taxonomy}_term_new_form_tag\" );\n?>>\n<input type=\"hidden\" name=\"action\" value=\"add-tag\" />\n<input type=\"hidden\" name=\"screen\" value=\"<?php echo esc_attr($current_screen->id); ?>\" />\n<input type=\"hidden\" name=\"taxonomy\" value=\"<?php echo esc_attr($taxonomy); ?>\" />\n<input type=\"hidden\" name=\"post_type\" value=\"<?php echo esc_attr($post_type); ?>\" />\n<?php wp_nonce_field('add-tag', '_wpnonce_add-tag'); ?>\n\n<div class=\"form-field form-required term-name-wrap\">\n\t<label for=\"tag-name\"><?php _ex( 'Name', 'term name' ); ?></label>\n\t<input name=\"tag-name\" id=\"tag-name\" type=\"text\" value=\"\" size=\"40\" aria-required=\"true\" />\n\t<p><?php _e('The name is how it appears on your site.'); ?></p>\n</div>\n<?php if ( ! global_terms_enabled() ) : ?>\n<div class=\"form-field term-slug-wrap\">\n\t<label for=\"tag-slug\"><?php _e( 'Slug' ); ?></label>\n\t<input name=\"slug\" id=\"tag-slug\" type=\"text\" value=\"\" size=\"40\" />\n\t<p><?php _e('The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.'); ?></p>\n</div>\n<?php endif; // global_terms_enabled() ?>\n<?php if ( is_taxonomy_hierarchical($taxonomy) ) : ?>\n<div class=\"form-field term-parent-wrap\">\n\t<label for=\"parent\"><?php _ex( 'Parent', 'term parent' ); ?></label>\n\t<?php\n\t$dropdown_args = array(\n\t\t'hide_empty'       => 0,\n\t\t'hide_if_empty'    => false,\n\t\t'taxonomy'         => $taxonomy,\n\t\t'name'             => 'parent',\n\t\t'orderby'          => 'name',\n\t\t'hierarchical'     => true,\n\t\t'show_option_none' => __( 'None' ),\n\t);\n\n\t/**\n\t * Filter the taxonomy parent drop-down on the Edit Term page.\n\t *\n\t * @since 3.7.0\n\t * @since 4.2.0 Added `$context` parameter.\n\t *\n\t * @param array  $dropdown_args {\n\t *     An array of taxonomy parent drop-down arguments.\n\t *\n\t *     @type int|bool $hide_empty       Whether to hide terms not attached to any posts. Default 0|false.\n\t *     @type bool     $hide_if_empty    Whether to hide the drop-down if no terms exist. Default false.\n\t *     @type string   $taxonomy         The taxonomy slug.\n\t *     @type string   $name             Value of the name attribute to use for the drop-down select element.\n\t *                                      Default 'parent'.\n\t *     @type string   $orderby          The field to order by. Default 'name'.\n\t *     @type bool     $hierarchical     Whether the taxonomy is hierarchical. Default true.\n\t *     @type string   $show_option_none Label to display if there are no terms. Default 'None'.\n\t * }\n\t * @param string $taxonomy The taxonomy slug.\n\t * @param string $context  Filter context. Accepts 'new' or 'edit'.\n\t */\n\t$dropdown_args = apply_filters( 'taxonomy_parent_dropdown_args', $dropdown_args, $taxonomy, 'new' );\n\n\twp_dropdown_categories( $dropdown_args );\n\t?>\n\t<?php if ( 'category' == $taxonomy ) : // @todo: Generic text for hierarchical taxonomies ?>\n\t\t<p><?php _e('Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional.'); ?></p>\n\t<?php endif; ?>\n</div>\n<?php endif; // is_taxonomy_hierarchical() ?>\n<div class=\"form-field term-description-wrap\">\n\t<label for=\"tag-description\"><?php _e( 'Description' ); ?></label>\n\t<textarea name=\"description\" id=\"tag-description\" rows=\"5\" cols=\"40\"></textarea>\n\t<p><?php _e('The description is not prominent by default; however, some themes may show it.'); ?></p>\n</div>\n\n<?php\nif ( ! is_taxonomy_hierarchical( $taxonomy ) ) {\n\t/**\n\t * Fires after the Add Tag form fields for non-hierarchical taxonomies.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $taxonomy The taxonomy slug.\n\t */\n\tdo_action( 'add_tag_form_fields', $taxonomy );\n}\n\n/**\n * Fires after the Add Term form fields.\n *\n * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n *\n * @since 3.0.0\n *\n * @param string $taxonomy The taxonomy slug.\n */\ndo_action( \"{$taxonomy}_add_form_fields\", $taxonomy );\n\nsubmit_button( $tax->labels->add_new_item );\n\nif ( 'category' == $taxonomy ) {\n\t/**\n\t * Fires at the end of the Edit Category form.\n\t *\n\t * @since 2.1.0\n\t * @deprecated 3.0.0 Use {$taxonomy}_add_form instead.\n\t *\n\t * @param object $arg Optional arguments cast to an object.\n\t */\n\tdo_action( 'edit_category_form', (object) array( 'parent' => 0 ) );\n} elseif ( 'link_category' == $taxonomy ) {\n\t/**\n\t * Fires at the end of the Edit Link form.\n\t *\n\t * @since 2.3.0\n\t * @deprecated 3.0.0 Use {$taxonomy}_add_form instead.\n\t *\n\t * @param object $arg Optional arguments cast to an object.\n\t */\n\tdo_action( 'edit_link_category_form', (object) array( 'parent' => 0 ) );\n} else {\n\t/**\n\t * Fires at the end of the Add Tag form.\n\t *\n\t * @since 2.7.0\n\t * @deprecated 3.0.0 Use {$taxonomy}_add_form instead.\n\t *\n\t * @param string $taxonomy The taxonomy slug.\n\t */\n\tdo_action( 'add_tag_form', $taxonomy );\n}\n\n/**\n * Fires at the end of the Add Term form for all taxonomies.\n *\n * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n *\n * @since 3.0.0\n *\n * @param string $taxonomy The taxonomy slug.\n */\ndo_action( \"{$taxonomy}_add_form\", $taxonomy );\n?>\n</form></div>\n<?php } ?>\n\n</div>\n</div><!-- /col-left -->\n\n</div><!-- /col-container -->\n</div><!-- /wrap -->\n\n<?php if ( ! wp_is_mobile() ) : ?>\n<script type=\"text/javascript\">\ntry{document.forms.addtag['tag-name'].focus();}catch(e){}\n</script>\n<?php\nendif;\n\n$wp_list_table->inline_edit();\n\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/edit.php",
    "content": "<?php\n/**\n * Edit Posts Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! $typenow )\n\twp_die( __( 'Invalid post type' ) );\n\nif ( ! in_array( $typenow, get_post_types( array( 'show_ui' => true ) ) ) ) {\n\twp_die( __( 'You are not allowed to edit posts in this post type.' ) );\n}\n\nif ( 'attachment' === $typenow ) {\n\tif ( wp_redirect( admin_url( 'upload.php' ) ) ) {\n\t\texit;\n\t}\n}\n\n/**\n * @global string $post_type\n * @global object $post_type_object\n */\nglobal $post_type, $post_type_object;\n\n$post_type = $typenow;\n$post_type_object = get_post_type_object( $post_type );\n\nif ( ! $post_type_object )\n\twp_die( __( 'Invalid post type' ) );\n\nif ( ! current_user_can( $post_type_object->cap->edit_posts ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to edit posts in this post type.' ) . '</p>',\n\t\t403\n\t);\n}\n\n$wp_list_table = _get_list_table('WP_Posts_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n\n// Back-compat for viewing comments of an entry\nforeach ( array( 'p', 'attachment_id', 'page_id' ) as $_redirect ) {\n\tif ( ! empty( $_REQUEST[ $_redirect ] ) ) {\n\t\twp_redirect( admin_url( 'edit-comments.php?p=' . absint( $_REQUEST[ $_redirect ] ) ) );\n\t\texit;\n\t}\n}\nunset( $_redirect );\n\nif ( 'post' != $post_type ) {\n\t$parent_file = \"edit.php?post_type=$post_type\";\n\t$submenu_file = \"edit.php?post_type=$post_type\";\n\t$post_new_file = \"post-new.php?post_type=$post_type\";\n} else {\n\t$parent_file = 'edit.php';\n\t$submenu_file = 'edit.php';\n\t$post_new_file = 'post-new.php';\n}\n\n$doaction = $wp_list_table->current_action();\n\nif ( $doaction ) {\n\tcheck_admin_referer('bulk-posts');\n\n\t$sendback = remove_query_arg( array('trashed', 'untrashed', 'deleted', 'locked', 'ids'), wp_get_referer() );\n\tif ( ! $sendback )\n\t\t$sendback = admin_url( $parent_file );\n\t$sendback = add_query_arg( 'paged', $pagenum, $sendback );\n\tif ( strpos($sendback, 'post.php') !== false )\n\t\t$sendback = admin_url($post_new_file);\n\n\tif ( 'delete_all' == $doaction ) {\n\t\t// Prepare for deletion of all posts with a specified post status (i.e. Empty trash).\n\t\t$post_status = preg_replace('/[^a-z0-9_-]+/i', '', $_REQUEST['post_status']);\n\t\t// Validate the post status exists.\n\t\tif ( get_post_status_object( $post_status ) ) {\n\t\t\t$post_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT ID FROM $wpdb->posts WHERE post_type=%s AND post_status = %s\", $post_type, $post_status ) );\n\t\t}\n\t\t$doaction = 'delete';\n\t} elseif ( isset( $_REQUEST['media'] ) ) {\n\t\t$post_ids = $_REQUEST['media'];\n\t} elseif ( isset( $_REQUEST['ids'] ) ) {\n\t\t$post_ids = explode( ',', $_REQUEST['ids'] );\n\t} elseif ( !empty( $_REQUEST['post'] ) ) {\n\t\t$post_ids = array_map('intval', $_REQUEST['post']);\n\t}\n\n\tif ( !isset( $post_ids ) ) {\n\t\twp_redirect( $sendback );\n\t\texit;\n\t}\n\n\tswitch ( $doaction ) {\n\t\tcase 'trash':\n\t\t\t$trashed = $locked = 0;\n\n\t\t\tforeach ( (array) $post_ids as $post_id ) {\n\t\t\t\tif ( !current_user_can( 'delete_post', $post_id) )\n\t\t\t\t\twp_die( __('You are not allowed to move this item to the Trash.') );\n\n\t\t\t\tif ( wp_check_post_lock( $post_id ) ) {\n\t\t\t\t\t$locked++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( !wp_trash_post($post_id) )\n\t\t\t\t\twp_die( __('Error in moving to Trash.') );\n\n\t\t\t\t$trashed++;\n\t\t\t}\n\n\t\t\t$sendback = add_query_arg( array('trashed' => $trashed, 'ids' => join(',', $post_ids), 'locked' => $locked ), $sendback );\n\t\t\tbreak;\n\t\tcase 'untrash':\n\t\t\t$untrashed = 0;\n\t\t\tforeach ( (array) $post_ids as $post_id ) {\n\t\t\t\tif ( !current_user_can( 'delete_post', $post_id) )\n\t\t\t\t\twp_die( __('You are not allowed to restore this item from the Trash.') );\n\n\t\t\t\tif ( !wp_untrash_post($post_id) )\n\t\t\t\t\twp_die( __('Error in restoring from Trash.') );\n\n\t\t\t\t$untrashed++;\n\t\t\t}\n\t\t\t$sendback = add_query_arg('untrashed', $untrashed, $sendback);\n\t\t\tbreak;\n\t\tcase 'delete':\n\t\t\t$deleted = 0;\n\t\t\tforeach ( (array) $post_ids as $post_id ) {\n\t\t\t\t$post_del = get_post($post_id);\n\n\t\t\t\tif ( !current_user_can( 'delete_post', $post_id ) )\n\t\t\t\t\twp_die( __('You are not allowed to delete this item.') );\n\n\t\t\t\tif ( $post_del->post_type == 'attachment' ) {\n\t\t\t\t\tif ( ! wp_delete_attachment($post_id) )\n\t\t\t\t\t\twp_die( __('Error in deleting.') );\n\t\t\t\t} else {\n\t\t\t\t\tif ( !wp_delete_post($post_id) )\n\t\t\t\t\t\twp_die( __('Error in deleting.') );\n\t\t\t\t}\n\t\t\t\t$deleted++;\n\t\t\t}\n\t\t\t$sendback = add_query_arg('deleted', $deleted, $sendback);\n\t\t\tbreak;\n\t\tcase 'edit':\n\t\t\tif ( isset($_REQUEST['bulk_edit']) ) {\n\t\t\t\t$done = bulk_edit_posts($_REQUEST);\n\n\t\t\t\tif ( is_array($done) ) {\n\t\t\t\t\t$done['updated'] = count( $done['updated'] );\n\t\t\t\t\t$done['skipped'] = count( $done['skipped'] );\n\t\t\t\t\t$done['locked'] = count( $done['locked'] );\n\t\t\t\t\t$sendback = add_query_arg( $done, $sendback );\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\t$sendback = remove_query_arg( array('action', 'action2', 'tags_input', 'post_author', 'comment_status', 'ping_status', '_status', 'post', 'bulk_edit', 'post_view'), $sendback );\n\n\twp_redirect($sendback);\n\texit();\n} elseif ( ! empty($_REQUEST['_wp_http_referer']) ) {\n\t wp_redirect( remove_query_arg( array('_wp_http_referer', '_wpnonce'), wp_unslash($_SERVER['REQUEST_URI']) ) );\n\t exit;\n}\n\n$wp_list_table->prepare_items();\n\nwp_enqueue_script('inline-edit-post');\nwp_enqueue_script('heartbeat');\n\n$title = $post_type_object->labels->name;\n\nif ( 'post' == $post_type ) {\n\tget_current_screen()->add_help_tab( array(\n\t'id'\t\t=> 'overview',\n\t'title'\t\t=> __('Overview'),\n\t'content'\t=>\n\t\t'<p>' . __('This screen provides access to all of your posts. You can customize the display of this screen to suit your workflow.') . '</p>'\n\t) );\n\tget_current_screen()->add_help_tab( array(\n\t'id'\t\t=> 'screen-content',\n\t'title'\t\t=> __('Screen Content'),\n\t'content'\t=>\n\t\t'<p>' . __('You can customize the display of this screen&#8217;s contents in a number of ways:') . '</p>' .\n\t\t'<ul>' .\n\t\t\t'<li>' . __('You can hide/display columns based on your needs and decide how many posts to list per screen using the Screen Options tab.') . '</li>' .\n\t\t\t'<li>' . __('You can filter the list of posts by post status using the text links in the upper left to show All, Published, Draft, or Trashed posts. The default view is to show all posts.') . '</li>' .\n\t\t\t'<li>' . __('You can view posts in a simple title list or with an excerpt using the Screen Options tab.') . '</li>' .\n\t\t\t'<li>' . __('You can refine the list to show only posts in a specific category or from a specific month by using the dropdown menus above the posts list. Click the Filter button after making your selection. You also can refine the list by clicking on the post author, category or tag in the posts list.') . '</li>' .\n\t\t'</ul>'\n\t) );\n\tget_current_screen()->add_help_tab( array(\n\t'id'\t\t=> 'action-links',\n\t'title'\t\t=> __('Available Actions'),\n\t'content'\t=>\n\t\t'<p>' . __('Hovering over a row in the posts list will display action links that allow you to manage your post. You can perform the following actions:') . '</p>' .\n\t\t'<ul>' .\n\t\t\t'<li>' . __('<strong>Edit</strong> takes you to the editing screen for that post. You can also reach that screen by clicking on the post title.') . '</li>' .\n\t\t\t'<li>' . __('<strong>Quick Edit</strong> provides inline access to the metadata of your post, allowing you to update post details without leaving this screen.') . '</li>' .\n\t\t\t'<li>' . __('<strong>Trash</strong> removes your post from this list and places it in the trash, from which you can permanently delete it.') . '</li>' .\n\t\t\t'<li>' . __('<strong>Preview</strong> will show you what your draft post will look like if you publish it. View will take you to your live site to view the post. Which link is available depends on your post&#8217;s status.') . '</li>' .\n\t\t'</ul>'\n\t) );\n\tget_current_screen()->add_help_tab( array(\n\t'id'\t\t=> 'bulk-actions',\n\t'title'\t\t=> __('Bulk Actions'),\n\t'content'\t=>\n\t\t'<p>' . __('You can also edit or move multiple posts to the trash at once. Select the posts you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply.') . '</p>' .\n\t\t\t\t'<p>' . __('When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected posts at once. To remove a post from the grouping, just click the x next to its name in the Bulk Edit area that appears.') . '</p>'\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Posts_Screen\" target=\"_blank\">Documentation on Managing Posts</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n\t);\n\n} elseif ( 'page' == $post_type ) {\n\tget_current_screen()->add_help_tab( array(\n\t'id'\t\t=> 'overview',\n\t'title'\t\t=> __('Overview'),\n\t'content'\t=>\n\t\t'<p>' . __('Pages are similar to posts in that they have a title, body text, and associated metadata, but they are different in that they are not part of the chronological blog stream, kind of like permanent posts. Pages are not categorized or tagged, but can have a hierarchy. You can nest pages under other pages by making one the &#8220;Parent&#8221; of the other, creating a group of pages.') . '</p>'\n\t) );\n\tget_current_screen()->add_help_tab( array(\n\t'id'\t\t=> 'managing-pages',\n\t'title'\t\t=> __('Managing Pages'),\n\t'content'\t=>\n\t\t'<p>' . __('Managing pages is very similar to managing posts, and the screens can be customized in the same way.') . '</p>' .\n\t\t'<p>' . __('You can also perform the same types of actions, including narrowing the list by using the filters, acting on a page using the action links that appear when you hover over a row, or using the Bulk Actions menu to edit the metadata for multiple pages at once.') . '</p>'\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Pages_Screen\" target=\"_blank\">Documentation on Managing Pages</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n\t);\n\n}\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => $post_type_object->labels->filter_items_list,\n\t'heading_pagination' => $post_type_object->labels->items_list_navigation,\n\t'heading_list'       => $post_type_object->labels->items_list,\n) );\n\nadd_screen_option( 'per_page', array( 'default' => 20, 'option' => 'edit_' . $post_type . '_per_page' ) );\n\n$bulk_counts = array(\n\t'updated'   => isset( $_REQUEST['updated'] )   ? absint( $_REQUEST['updated'] )   : 0,\n\t'locked'    => isset( $_REQUEST['locked'] )    ? absint( $_REQUEST['locked'] )    : 0,\n\t'deleted'   => isset( $_REQUEST['deleted'] )   ? absint( $_REQUEST['deleted'] )   : 0,\n\t'trashed'   => isset( $_REQUEST['trashed'] )   ? absint( $_REQUEST['trashed'] )   : 0,\n\t'untrashed' => isset( $_REQUEST['untrashed'] ) ? absint( $_REQUEST['untrashed'] ) : 0,\n);\n\n$bulk_messages = array();\n$bulk_messages['post'] = array(\n\t'updated'   => _n( '%s post updated.', '%s posts updated.', $bulk_counts['updated'] ),\n\t'locked'    => ( 1 == $bulk_counts['locked'] ) ? __( '1 post not updated, somebody is editing it.' ) :\n\t                   _n( '%s post not updated, somebody is editing it.', '%s posts not updated, somebody is editing them.', $bulk_counts['locked'] ),\n\t'deleted'   => _n( '%s post permanently deleted.', '%s posts permanently deleted.', $bulk_counts['deleted'] ),\n\t'trashed'   => _n( '%s post moved to the Trash.', '%s posts moved to the Trash.', $bulk_counts['trashed'] ),\n\t'untrashed' => _n( '%s post restored from the Trash.', '%s posts restored from the Trash.', $bulk_counts['untrashed'] ),\n);\n$bulk_messages['page'] = array(\n\t'updated'   => _n( '%s page updated.', '%s pages updated.', $bulk_counts['updated'] ),\n\t'locked'    => ( 1 == $bulk_counts['locked'] ) ? __( '1 page not updated, somebody is editing it.' ) :\n\t                   _n( '%s page not updated, somebody is editing it.', '%s pages not updated, somebody is editing them.', $bulk_counts['locked'] ),\n\t'deleted'   => _n( '%s page permanently deleted.', '%s pages permanently deleted.', $bulk_counts['deleted'] ),\n\t'trashed'   => _n( '%s page moved to the Trash.', '%s pages moved to the Trash.', $bulk_counts['trashed'] ),\n\t'untrashed' => _n( '%s page restored from the Trash.', '%s pages restored from the Trash.', $bulk_counts['untrashed'] ),\n);\n\n/**\n * Filter the bulk action updated messages.\n *\n * By default, custom post types use the messages for the 'post' post type.\n *\n * @since 3.7.0\n *\n * @param array $bulk_messages Arrays of messages, each keyed by the corresponding post type. Messages are\n *                             keyed with 'updated', 'locked', 'deleted', 'trashed', and 'untrashed'.\n * @param array $bulk_counts   Array of item counts for each message, used to build internationalized strings.\n */\n$bulk_messages = apply_filters( 'bulk_post_updated_messages', $bulk_messages, $bulk_counts );\n$bulk_counts = array_filter( $bulk_counts );\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n<div class=\"wrap\">\n<h1><?php\necho esc_html( $post_type_object->labels->name );\nif ( current_user_can( $post_type_object->cap->create_posts ) )\n\techo ' <a href=\"' . esc_url( admin_url( $post_new_file ) ) . '\" class=\"page-title-action\">' . esc_html( $post_type_object->labels->add_new ) . '</a>';\nif ( ! empty( $_REQUEST['s'] ) )\n\tprintf( ' <span class=\"subtitle\">' . __('Search results for &#8220;%s&#8221;') . '</span>', get_search_query() );\n?></h1>\n\n<?php\n// If we have a bulk message to issue:\n$messages = array();\nforeach ( $bulk_counts as $message => $count ) {\n\tif ( isset( $bulk_messages[ $post_type ][ $message ] ) )\n\t\t$messages[] = sprintf( $bulk_messages[ $post_type ][ $message ], number_format_i18n( $count ) );\n\telseif ( isset( $bulk_messages['post'][ $message ] ) )\n\t\t$messages[] = sprintf( $bulk_messages['post'][ $message ], number_format_i18n( $count ) );\n\n\tif ( $message == 'trashed' && isset( $_REQUEST['ids'] ) ) {\n\t\t$ids = preg_replace( '/[^0-9,]/', '', $_REQUEST['ids'] );\n\t\t$messages[] = '<a href=\"' . esc_url( wp_nonce_url( \"edit.php?post_type=$post_type&doaction=undo&action=untrash&ids=$ids\", \"bulk-posts\" ) ) . '\">' . __('Undo') . '</a>';\n\t}\n}\n\nif ( $messages )\n\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . join( ' ', $messages ) . '</p></div>';\nunset( $messages );\n\n$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'locked', 'skipped', 'updated', 'deleted', 'trashed', 'untrashed' ), $_SERVER['REQUEST_URI'] );\n?>\n\n<?php $wp_list_table->views(); ?>\n\n<form id=\"posts-filter\" method=\"get\">\n\n<?php $wp_list_table->search_box( $post_type_object->labels->search_items, 'post' ); ?>\n\n<input type=\"hidden\" name=\"post_status\" class=\"post_status_page\" value=\"<?php echo !empty($_REQUEST['post_status']) ? esc_attr($_REQUEST['post_status']) : 'all'; ?>\" />\n<input type=\"hidden\" name=\"post_type\" class=\"post_type_page\" value=\"<?php echo $post_type; ?>\" />\n<?php if ( ! empty( $_REQUEST['show_sticky'] ) ) { ?>\n<input type=\"hidden\" name=\"show_sticky\" value=\"1\" />\n<?php } ?>\n\n<?php $wp_list_table->display(); ?>\n\n</form>\n\n<?php\nif ( $wp_list_table->has_items() )\n\t$wp_list_table->inline_edit();\n?>\n\n<div id=\"ajax-response\"></div>\n<br class=\"clear\" />\n</div>\n\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/export.php",
    "content": "<?php\n/**\n * WordPress Export Administration Screen\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( !current_user_can('export') )\n\twp_die(__('You do not have sufficient permissions to export the content of this site.'));\n\n/** Load WordPress export API */\nrequire_once( ABSPATH . 'wp-admin/includes/export.php' );\n$title = __('Export');\n\n/**\n * Display JavaScript on the page.\n *\n * @since 3.5.0\n */\nfunction export_add_js() {\n?>\n<script type=\"text/javascript\">\n\tjQuery(document).ready(function($){\n \t\tvar form = $('#export-filters'),\n \t\t\tfilters = form.find('.export-filters');\n \t\tfilters.hide();\n \t\tform.find('input:radio').change(function() {\n\t\t\tfilters.slideUp('fast');\n\t\t\tswitch ( $(this).val() ) {\n\t\t\t\tcase 'attachment': $('#attachment-filters').slideDown(); break;\n\t\t\t\tcase 'posts': $('#post-filters').slideDown(); break;\n\t\t\t\tcase 'pages': $('#page-filters').slideDown(); break;\n\t\t\t}\n \t\t});\n\t});\n</script>\n<?php\n}\nadd_action( 'admin_head', 'export_add_js' );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => '<p>' . __('You can export a file of your site&#8217;s content in order to import it into another installation or platform. The export file will be an XML file format called WXR. Posts, pages, comments, custom fields, categories, and tags can be included. You can choose for the WXR file to include only certain posts or pages by setting the dropdown filters to limit the export by category, author, date range by month, or publishing status.') . '</p>' .\n\t\t'<p>' . __('Once generated, your WXR file can be imported by another WordPress site or by another blogging platform able to access this format.') . '</p>',\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Tools_Export_Screen\" target=\"_blank\">Documentation on Export</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\n// If the 'download' URL parameter is set, a WXR export file is baked and returned.\nif ( isset( $_GET['download'] ) ) {\n\t$args = array();\n\n\tif ( ! isset( $_GET['content'] ) || 'all' == $_GET['content'] ) {\n\t\t$args['content'] = 'all';\n\t} elseif ( 'posts' == $_GET['content'] ) {\n\t\t$args['content'] = 'post';\n\n\t\tif ( $_GET['cat'] )\n\t\t\t$args['category'] = (int) $_GET['cat'];\n\n\t\tif ( $_GET['post_author'] )\n\t\t\t$args['author'] = (int) $_GET['post_author'];\n\n\t\tif ( $_GET['post_start_date'] || $_GET['post_end_date'] ) {\n\t\t\t$args['start_date'] = $_GET['post_start_date'];\n\t\t\t$args['end_date'] = $_GET['post_end_date'];\n\t\t}\n\n\t\tif ( $_GET['post_status'] )\n\t\t\t$args['status'] = $_GET['post_status'];\n\t} elseif ( 'pages' == $_GET['content'] ) {\n\t\t$args['content'] = 'page';\n\n\t\tif ( $_GET['page_author'] )\n\t\t\t$args['author'] = (int) $_GET['page_author'];\n\n\t\tif ( $_GET['page_start_date'] || $_GET['page_end_date'] ) {\n\t\t\t$args['start_date'] = $_GET['page_start_date'];\n\t\t\t$args['end_date'] = $_GET['page_end_date'];\n\t\t}\n\n\t\tif ( $_GET['page_status'] )\n\t\t\t$args['status'] = $_GET['page_status'];\n\t} elseif ( 'attachment' == $_GET['content'] ) {\n\t\t$args['content'] = 'attachment';\n\n\t\tif ( $_GET['attachment_start_date'] || $_GET['attachment_end_date'] ) {\n\t\t\t$args['start_date'] = $_GET['attachment_start_date'];\n\t\t\t$args['end_date'] = $_GET['attachment_end_date'];\n\t\t}\n\t}\n\telse {\n\t\t$args['content'] = $_GET['content'];\n\t}\n\n\t/**\n\t * Filter the export args.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array $args The arguments to send to the exporter.\n\t */\n\t$args = apply_filters( 'export_args', $args );\n\n\texport_wp( $args );\n\tdie();\n}\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\n/**\n * Create the date options fields for exporting a given post type.\n *\n * @global wpdb      $wpdb      WordPress database abstraction object.\n * @global WP_Locale $wp_locale Date and Time Locale object.\n *\n * @since 3.1.0\n *\n * @param string $post_type The post type. Default 'post'.\n */\nfunction export_date_options( $post_type = 'post' ) {\n\tglobal $wpdb, $wp_locale;\n\n\t$months = $wpdb->get_results( $wpdb->prepare( \"\n\t\tSELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month\n\t\tFROM $wpdb->posts\n\t\tWHERE post_type = %s AND post_status != 'auto-draft'\n\t\tORDER BY post_date DESC\n\t\", $post_type ) );\n\n\t$month_count = count( $months );\n\tif ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) )\n\t\treturn;\n\n\tforeach ( $months as $date ) {\n\t\tif ( 0 == $date->year )\n\t\t\tcontinue;\n\n\t\t$month = zeroise( $date->month, 2 );\n\t\techo '<option value=\"' . $date->year . '-' . $month . '\">' . $wp_locale->get_month( $month ) . ' ' . $date->year . '</option>';\n\t}\n}\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<p><?php _e('When you click the button below WordPress will create an XML file for you to save to your computer.'); ?></p>\n<p><?php _e('This format, which we call WordPress eXtended RSS or WXR, will contain your posts, pages, comments, custom fields, categories, and tags.'); ?></p>\n<p><?php _e('Once you&#8217;ve saved the download file, you can use the Import function in another WordPress installation to import the content from this site.'); ?></p>\n\n<h2><?php _e( 'Choose what to export' ); ?></h2>\n<form method=\"get\" id=\"export-filters\">\n<fieldset>\n<legend class=\"screen-reader-text\"><?php _e( 'Content to export' ); ?></legend>\n<input type=\"hidden\" name=\"download\" value=\"true\" />\n<p><label><input type=\"radio\" name=\"content\" value=\"all\" checked=\"checked\" aria-describedby=\"all-content-desc\" /> <?php _e( 'All content' ); ?></label></p>\n<p class=\"description\" id=\"all-content-desc\"><?php _e( 'This will contain all of your posts, pages, comments, custom fields, terms, navigation menus and custom posts.' ); ?></p>\n\n<p><label><input type=\"radio\" name=\"content\" value=\"posts\" /> <?php _e( 'Posts' ); ?></label></p>\n<ul id=\"post-filters\" class=\"export-filters\">\n\t<li>\n\t\t<label><span class=\"label-responsive\"><?php _e( 'Categories:' ); ?></span>\n\t\t<?php wp_dropdown_categories( array( 'show_option_all' => __('All') ) ); ?>\n\t\t</label>\n\t</li>\n\t<li>\n\t\t<label><span class=\"label-responsive\"><?php _e( 'Authors:' ); ?></span>\n\t\t<?php\n\t\t$authors = $wpdb->get_col( \"SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'post'\" );\n\t\twp_dropdown_users( array( 'include' => $authors, 'name' => 'post_author', 'multi' => true, 'show_option_all' => __('All') ) );\n\t\t?>\n\t\t</label>\n\t</li>\n\t<li>\n\t\t<fieldset>\n\t\t<legend class=\"screen-reader-text\"><?php _e( 'Date range:' ); ?></legend>\n\t\t<label for=\"post-start-date\" class=\"label-responsive\"><?php _e( 'Start date:' ); ?></label>\n\t\t<select name=\"post_start_date\" id=\"post-start-date\">\n\t\t\t<option value=\"0\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n\t\t\t<?php export_date_options(); ?>\n\t\t</select>\n\t\t<label for=\"post-end-date\" class=\"label-responsive\"><?php _e( 'End date:' ); ?></label>\n\t\t<select name=\"post_end_date\" id=\"post-end-date\">\n\t\t\t<option value=\"0\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n\t\t\t<?php export_date_options(); ?>\n\t\t</select>\n\t\t</fieldset>\n\t</li>\n\t<li>\n\t\t<label for=\"post-status\" class=\"label-responsive\"><?php _e( 'Status:' ); ?></label>\n\t\t<select name=\"post_status\" id=\"post-status\">\n\t\t\t<option value=\"0\"><?php _e( 'All' ); ?></option>\n\t\t\t<?php $post_stati = get_post_stati( array( 'internal' => false ), 'objects' );\n\t\t\tforeach ( $post_stati as $status ) : ?>\n\t\t\t<option value=\"<?php echo esc_attr( $status->name ); ?>\"><?php echo esc_html( $status->label ); ?></option>\n\t\t\t<?php endforeach; ?>\n\t\t</select>\n\t</li>\n</ul>\n\n<p><label><input type=\"radio\" name=\"content\" value=\"pages\" /> <?php _e( 'Pages' ); ?></label></p>\n<ul id=\"page-filters\" class=\"export-filters\">\n\t<li>\n\t\t<label><span class=\"label-responsive\"><?php _e( 'Authors:' ); ?></span>\n\t\t<?php\n\t\t$authors = $wpdb->get_col( \"SELECT DISTINCT post_author FROM {$wpdb->posts} WHERE post_type = 'page'\" );\n\t\twp_dropdown_users( array( 'include' => $authors, 'name' => 'page_author', 'multi' => true, 'show_option_all' => __('All') ) );\n\t\t?>\n\t\t</label>\n\t</li>\n\t<li>\n\t\t<fieldset>\n\t\t<legend class=\"screen-reader-text\"><?php _e( 'Date range:' ); ?></legend>\n\t\t<label for=\"page-start-date\" class=\"label-responsive\"><?php _e( 'Start date:' ); ?></label>\n\t\t<select name=\"page_start_date\" id=\"page-start-date\">\n\t\t\t<option value=\"0\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n\t\t\t<?php export_date_options( 'page' ); ?>\n\t\t</select>\n\t\t<label for=\"page-end-date\" class=\"label-responsive\"><?php _e( 'End date:' ); ?></label>\n\t\t<select name=\"page_end_date\" id=\"page-end-date\">\n\t\t\t<option value=\"0\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n\t\t\t<?php export_date_options( 'page' ); ?>\n\t\t</select>\n\t\t</fieldset>\n\t</li>\n\t<li>\n\t\t<label for=\"page-status\" class=\"label-responsive\"><?php _e( 'Status:' ); ?></label>\n\t\t<select name=\"page_status\" id=\"page-status\">\n\t\t\t<option value=\"0\"><?php _e( 'All' ); ?></option>\n\t\t\t<?php foreach ( $post_stati as $status ) : ?>\n\t\t\t<option value=\"<?php echo esc_attr( $status->name ); ?>\"><?php echo esc_html( $status->label ); ?></option>\n\t\t\t<?php endforeach; ?>\n\t\t</select>\n\t</li>\n</ul>\n\n<?php foreach ( get_post_types( array( '_builtin' => false, 'can_export' => true ), 'objects' ) as $post_type ) : ?>\n<p><label><input type=\"radio\" name=\"content\" value=\"<?php echo esc_attr( $post_type->name ); ?>\" /> <?php echo esc_html( $post_type->label ); ?></label></p>\n<?php endforeach; ?>\n\n<p><label><input type=\"radio\" name=\"content\" value=\"attachment\" /> <?php _e( 'Media' ); ?></label></p>\n<ul id=\"attachment-filters\" class=\"export-filters\">\n\t<li>\n\t\t<fieldset>\n\t\t<legend class=\"screen-reader-text\"><?php _e( 'Date range:' ); ?></legend>\n\t\t<label for=\"attachment-start-date\" class=\"label-responsive\"><?php _e( 'Start date:' ); ?></label>\n\t\t<select name=\"attachment_start_date\" id=\"attachment-start-date\">\n\t\t\t<option value=\"0\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n\t\t\t<?php export_date_options( 'attachment' ); ?>\n\t\t</select>\n\t\t<label for=\"attachment-end-date\" class=\"label-responsive\"><?php _e( 'End date:' ); ?></label>\n\t\t<select name=\"attachment_end_date\" id=\"attachment-end-date\">\n\t\t\t<option value=\"0\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n\t\t\t<?php export_date_options( 'attachment' ); ?>\n\t\t</select>\n\t\t</fieldset>\n\t</li>\n</ul>\n\n</fieldset>\n<?php\n/**\n * Fires at the end of the export filters form.\n *\n * @since 3.5.0\n */\ndo_action( 'export_filters' );\n?>\n\n<?php submit_button( __('Download Export File') ); ?>\n</form>\n</div>\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/freedoms.php",
    "content": "<?php\n/**\n * Your Rights administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n$title = __( 'Freedoms' );\n\nlist( $display_version ) = explode( '-', $wp_version );\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n<div class=\"wrap about-wrap\">\n\n<h1><?php printf( __( 'Welcome to WordPress %s' ), $display_version ); ?></h1>\n\n<div class=\"about-text\"><?php printf( __( 'Thank you for updating! WordPress %s makes your site more connected and responsive.' ), $display_version ); ?></div>\n\n<div class=\"wp-badge\"><?php printf( __( 'Version %s' ), $display_version ); ?></div>\n\n<h2 class=\"nav-tab-wrapper\">\n\t<a href=\"about.php\" class=\"nav-tab\"><?php _e( 'What&#8217;s New' ); ?></a>\n\t<a href=\"credits.php\" class=\"nav-tab\"><?php _e( 'Credits' ); ?></a>\n\t<a href=\"freedoms.php\" class=\"nav-tab nav-tab-active\"><?php _e( 'Freedoms' ); ?></a>\n</h2>\n\n<p class=\"about-description\"><?php printf( __( 'WordPress is Free and open source software, built by a distributed community of mostly volunteer developers from around the world. WordPress comes with some awesome, worldview-changing rights courtesy of its <a href=\"%s\">license</a>, the GPL.' ), 'https://wordpress.org/about/license/' ); ?></p>\n\n<ol start=\"0\">\n\t<li><p><?php _e( 'You have the freedom to run the program, for any purpose.' ); ?></p></li>\n\t<li><p><?php _e( 'You have access to the source code, the freedom to study how the program works, and the freedom to change it to make it do what you wish.' ); ?></p></li>\n\t<li><p><?php _e( 'You have the freedom to redistribute copies of the original program so you can help your neighbor.' ); ?></p></li>\n\t<li><p><?php _e( 'You have the freedom to distribute copies of your modified versions to others. By doing this you can give the whole community a chance to benefit from your changes.' ); ?></p></li>\n</ol>\n\n<p><?php printf( __( 'WordPress grows when people like you tell their friends about it, and the thousands of businesses and services that are built on and around WordPress share that fact with their users. We&#8217;re flattered every time someone spreads the good word, just make sure to <a href=\"%s\">check out our trademark guidelines</a> first.' ), 'http://wordpressfoundation.org/trademark-policy/' ); ?></p>\n\n<p><?php\n\n$plugins_url = current_user_can( 'activate_plugins' ) ? admin_url( 'plugins.php' ) : 'https://wordpress.org/plugins/';\n$themes_url = current_user_can( 'switch_themes' ) ? admin_url( 'themes.php' ) : 'https://wordpress.org/themes/';\n\nprintf( __( 'Every plugin and theme in WordPress.org&#8217;s directory is 100%% GPL or a similarly free and compatible license, so you can feel safe finding <a href=\"%1$s\">plugins</a> and <a href=\"%2$s\">themes</a> there. If you get a plugin or theme from another source, make sure to <a href=\"%3$s\">ask them if it&#8217;s GPL</a> first. If they don&#8217;t respect the WordPress license, we don&#8217;t recommend them.' ), $plugins_url, $themes_url, 'https://wordpress.org/about/license/' ); ?></p>\n\n<p><?php _e( 'Don&#8217;t you wish all software came with these freedoms? So do we! For more information, check out the <a href=\"http://www.fsf.org/\">Free Software Foundation</a>.' ); ?></p>\n\n</div>\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/import.php",
    "content": "<?php\n/**\n * Import WordPress Administration Screen\n *\n * @package WordPress\n * @subpackage Administration\n */\n\ndefine('WP_LOAD_IMPORTERS', true);\n\n/** Load WordPress Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( !current_user_can('import') )\n\twp_die(__('You do not have sufficient permissions to import content in this site.'));\n\n$title = __('Import');\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => '<p>' . __('This screen lists links to plugins to import data from blogging/content management platforms. Choose the platform you want to import from, and click Install Now when you are prompted in the popup window. If your platform is not listed, click the link to search the plugin directory for other importer plugins to see if there is one for your platform.') . '</p>' .\n\t\t'<p>' . __('In previous versions of WordPress, all importers were built-in. They have been turned into plugins since most people only use them once or infrequently.') . '</p>',\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Tools_Import_Screen\" target=\"_blank\">Documentation on Import</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nif ( current_user_can( 'install_plugins' ) )\n\t$popular_importers = wp_get_popular_importers();\nelse\n\t$popular_importers = array();\n\n// Detect and redirect invalid importers like 'movabletype', which is registered as 'mt'\nif ( ! empty( $_GET['invalid'] ) && isset( $popular_importers[ $_GET['invalid'] ] ) ) {\n\t$importer_id = $popular_importers[ $_GET['invalid'] ]['importer-id'];\n\tif ( $importer_id != $_GET['invalid'] ) { // Prevent redirect loops.\n\t\twp_redirect( admin_url( 'admin.php?import=' . $importer_id ) );\n\t\texit;\n\t}\n\tunset( $importer_id );\n}\n\nadd_thickbox();\nwp_enqueue_script( 'plugin-install' );\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n$parent_file = 'tools.php';\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n<?php if ( ! empty( $_GET['invalid'] ) ) : ?>\n\t<div class=\"error\"><p><strong><?php _e('ERROR:')?></strong> <?php printf( __('The <strong>%s</strong> importer is invalid or is not installed.'), esc_html( $_GET['invalid'] ) ); ?></p></div>\n<?php endif; ?>\n<p><?php _e('If you have posts or comments in another system, WordPress can import those into this site. To get started, choose a system to import from below:'); ?></p>\n\n<?php\n\n$importers = get_importers();\n\n// If a popular importer is not registered, create a dummy registration that links to the plugin installer.\nforeach ( $popular_importers as $pop_importer => $pop_data ) {\n\tif ( isset( $importers[ $pop_importer ] ) )\n\t\tcontinue;\n\tif ( isset( $importers[ $pop_data['importer-id'] ] ) )\n\t\tcontinue;\n\t$importers[ $pop_data['importer-id'] ] = array( $pop_data['name'], $pop_data['description'], 'install' => $pop_data['plugin-slug'] );\n}\n\nif ( empty( $importers ) ) {\n\techo '<p>' . __('No importers are available.') . '</p>'; // TODO: make more helpful\n} else {\n\tuasort( $importers, '_usort_by_first_member' );\n?>\n<table class=\"widefat importers striped\">\n\n<?php\n\tforeach ($importers as $importer_id => $data) {\n\t\t$action = '';\n\t\tif ( isset( $data['install'] ) ) {\n\t\t\t$plugin_slug = $data['install'];\n\t\t\tif ( file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug ) ) {\n\t\t\t\t// Looks like Importer is installed, But not active\n\t\t\t\t$plugins = get_plugins( '/' . $plugin_slug );\n\t\t\t\tif ( !empty($plugins) ) {\n\t\t\t\t\t$keys = array_keys($plugins);\n\t\t\t\t\t$plugin_file = $plugin_slug . '/' . $keys[0];\n\t\t\t\t\t$action = '<a href=\"' . esc_url(wp_nonce_url(admin_url('plugins.php?action=activate&plugin=' . $plugin_file . '&from=import'), 'activate-plugin_' . $plugin_file)) .\n\t\t\t\t\t\t\t\t\t\t\t'\"title=\"' . esc_attr__('Activate importer') . '\"\">' . $data[0] . '</a>';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( empty($action) ) {\n\t\t\t\tif ( is_main_site() ) {\n\t\t\t\t\t$action = '<a href=\"' . esc_url( network_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_slug .\n\t\t\t\t\t\t\t\t\t\t'&from=import&TB_iframe=true&width=600&height=550' ) ) . '\" class=\"thickbox\" title=\"' .\n\t\t\t\t\t\t\t\t\t\tesc_attr__('Install importer') . '\">' . $data[0] . '</a>';\n\t\t\t\t} else {\n\t\t\t\t\t$action = $data[0];\n\t\t\t\t\t$data[1] = sprintf( __( 'This importer is not installed. Please install importers from <a href=\"%s\">the main site</a>.' ), get_admin_url( $current_site->blog_id, 'import.php' ) );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t$action = \"<a href='\" . esc_url( \"admin.php?import=$importer_id\" ) . \"' title='\" . esc_attr( wptexturize( strip_tags( $data[1] ) ) ) .\"'>{$data[0]}</a>\";\n\t\t}\n\n\t\techo \"\n\t\t\t<tr>\n\t\t\t\t<td class='import-system row-title'>$action</td>\n\t\t\t\t<td class='desc'>{$data[1]}</td>\n\t\t\t</tr>\";\n\t}\n?>\n\n</table>\n<?php\n}\n\nif ( current_user_can('install_plugins') )\n\techo '<p>' . sprintf( __('If the importer you need is not listed, <a href=\"%s\">search the plugin directory</a> to see if an importer is available.'), esc_url( network_admin_url( 'plugin-install.php?tab=search&type=tag&s=importer' ) ) ) . '</p>';\n?>\n\n</div>\n\n<?php\n\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/admin-filters.php",
    "content": "<?php\n/**\n * Administration API: Default admin hooks\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.3.0\n */\n\n// Bookmark hooks.\nadd_action( 'admin_page_access_denied', 'wp_link_manager_disabled_message' );\n\n// Dashboard hooks.\nadd_action( 'activity_box_end', 'wp_dashboard_quota' );\n\n// Media hooks.\nadd_action( 'attachment_submitbox_misc_actions', 'attachment_submitbox_metadata' );\n\nadd_action( 'media_upload_image', 'wp_media_upload_handler' );\nadd_action( 'media_upload_audio', 'wp_media_upload_handler' );\nadd_action( 'media_upload_video', 'wp_media_upload_handler' );\nadd_action( 'media_upload_file',  'wp_media_upload_handler' );\n\nadd_action( 'post-plupload-upload-ui', 'media_upload_flash_bypass' );\n\nadd_action( 'post-html-upload-ui', 'media_upload_html_bypass'  );\n\nadd_filter( 'async_upload_image', 'get_media_item', 10, 2 );\nadd_filter( 'async_upload_audio', 'get_media_item', 10, 2 );\nadd_filter( 'async_upload_video', 'get_media_item', 10, 2 );\nadd_filter( 'async_upload_file',  'get_media_item', 10, 2 );\n\nadd_filter( 'attachment_fields_to_save', 'image_attachment_fields_to_save', 10, 2 );\n\nadd_filter( 'media_upload_gallery', 'media_upload_gallery' );\nadd_filter( 'media_upload_library', 'media_upload_library' );\n\nadd_filter( 'media_upload_tabs', 'update_gallery_tab' );\n\n// Misc hooks.\nadd_action( 'admin_head', 'wp_admin_canonical_url'   );\nadd_action( 'admin_head', 'wp_color_scheme_settings' );\nadd_action( 'admin_head', 'wp_site_icon'             );\nadd_action( 'admin_head', '_ipad_meta'               );\n\nadd_action( 'post_edit_form_tag', 'post_form_autocomplete_off' );\n\nadd_action( 'update_option_home',          'update_home_siteurl', 10, 2 );\nadd_action( 'update_option_siteurl',       'update_home_siteurl', 10, 2 );\nadd_action( 'update_option_page_on_front', 'update_home_siteurl', 10, 2 );\n\nadd_filter( 'heartbeat_received', 'wp_check_locked_posts',  10,  3 );\nadd_filter( 'heartbeat_received', 'wp_refresh_post_lock',   10,  3 );\nadd_filter( 'wp_refresh_nonces', 'wp_refresh_post_nonces', 10,  3 );\nadd_filter( 'heartbeat_received', 'heartbeat_autosave',     500, 2 );\n\nadd_filter( 'heartbeat_settings', 'wp_heartbeat_set_suspension' );\n\n// Nav Menu hooks.\nadd_action( 'admin_head-nav-menus.php', '_wp_delete_orphaned_draft_menu_items' );\n\n// Plugin hooks.\nadd_filter( 'whitelist_options', 'option_update_filter' );\n\n// Plugin Install hooks.\nadd_action( 'install_plugins_featured',               'install_dashboard' );\nadd_action( 'install_plugins_upload',                 'install_plugins_upload' );\nadd_action( 'install_plugins_search',                 'display_plugins_table' );\nadd_action( 'install_plugins_popular',                'display_plugins_table' );\nadd_action( 'install_plugins_recommended',            'display_plugins_table' );\nadd_action( 'install_plugins_new',                    'display_plugins_table' );\nadd_action( 'install_plugins_beta',                   'display_plugins_table' );\nadd_action( 'install_plugins_favorites',              'display_plugins_table' );\nadd_action( 'install_plugins_pre_plugin-information', 'install_plugin_information' );\n\n// Template hooks.\nadd_action( 'admin_enqueue_scripts', array( 'WP_Internal_Pointers', 'enqueue_scripts'                ) );\nadd_action( 'user_register',         array( 'WP_Internal_Pointers', 'dismiss_pointers_for_new_users' ) );\n\n// Theme hooks.\nadd_action( 'customize_controls_print_footer_scripts', 'customize_themes_print_templates' );\n\n// Theme Install hooks.\n// add_action('install_themes_dashboard', 'install_themes_dashboard');\n// add_action('install_themes_upload', 'install_themes_upload', 10, 0);\n// add_action('install_themes_search', 'display_themes');\n// add_action('install_themes_featured', 'display_themes');\n// add_action('install_themes_new', 'display_themes');\n// add_action('install_themes_updated', 'display_themes');\nadd_action( 'install_themes_pre_theme-information', 'install_theme_information' );\n\n// User hooks.\nadd_action( 'admin_init', 'default_password_nag_handler' );\n\nadd_action( 'admin_notices', 'default_password_nag' );\n\nadd_action( 'profile_update', 'default_password_nag_edit_user', 10, 2 );\n\n// Update hooks.\nadd_action( 'admin_init', 'wp_plugin_update_rows' );\nadd_action( 'admin_init', 'wp_theme_update_rows'  );\n\nadd_action( 'admin_notices', 'update_nag',      3  );\nadd_action( 'admin_notices', 'maintenance_nag', 10 );\n\nadd_filter( 'update_footer', 'core_update_footer' );\n\n// Update Core hooks.\nadd_action( '_core_updated_successfully', '_redirect_to_about_wordpress' );\n\n// Upgrade hooks.\nadd_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/admin.php",
    "content": "<?php\n/**\n * Core Administration API\n *\n * @package WordPress\n * @subpackage Administration\n * @since 2.3.0\n */\n\nif ( ! defined('WP_ADMIN') ) {\n\t/*\n\t * This file is being included from a file other than wp-admin/admin.php, so\n\t * some setup was skipped. Make sure the admin message catalog is loaded since\n\t * load_default_textdomain() will not have done so in this context.\n\t */\n\tload_textdomain( 'default', WP_LANG_DIR . '/admin-' . get_locale() . '.mo' );\n}\n\n/** WordPress Administration Hooks */\nrequire_once(ABSPATH . 'wp-admin/includes/admin-filters.php');\n\n/** WordPress Bookmark Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/bookmark.php');\n\n/** WordPress Comment Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/comment.php');\n\n/** WordPress Administration File API */\nrequire_once(ABSPATH . 'wp-admin/includes/file.php');\n\n/** WordPress Image Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/image.php');\n\n/** WordPress Media Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/media.php');\n\n/** WordPress Import Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/import.php');\n\n/** WordPress Misc Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/misc.php');\n\n/** WordPress Options Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/options.php');\n\n/** WordPress Plugin Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/plugin.php');\n\n/** WordPress Post Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/post.php');\n\n/** WordPress Administration Screen API */\nrequire_once(ABSPATH . 'wp-admin/includes/class-wp-screen.php');\nrequire_once(ABSPATH . 'wp-admin/includes/screen.php');\n\n/** WordPress Taxonomy Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/taxonomy.php');\n\n/** WordPress Template Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/template.php');\n\n/** WordPress List Table Administration API and base class */\nrequire_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');\nrequire_once(ABSPATH . 'wp-admin/includes/list-table.php');\n\n/** WordPress Theme Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/theme.php');\n\n/** WordPress User Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/user.php');\n\n/** WordPress Site Icon API */\nrequire_once(ABSPATH . 'wp-admin/includes/class-wp-site-icon.php');\n\n/** WordPress Update Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/update.php');\n\n/** WordPress Deprecated Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/deprecated.php');\n\n/** WordPress Multisite support API */\nif ( is_multisite() ) {\n\trequire_once(ABSPATH . 'wp-admin/includes/ms-admin-filters.php');\n\trequire_once(ABSPATH . 'wp-admin/includes/ms.php');\n\trequire_once(ABSPATH . 'wp-admin/includes/ms-deprecated.php');\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/ajax-actions.php",
    "content": "<?php\n/**\n * Administration API: Core Ajax handlers\n *\n * @package WordPress\n * @subpackage Administration\n * @since 2.1.0\n */\n\n//\n// No-privilege Ajax handlers.\n//\n\n/**\n * Ajax handler for the Heartbeat API in\n * the no-privilege context.\n *\n * Runs when the user is not logged in.\n *\n * @since 3.6.0\n */\nfunction wp_ajax_nopriv_heartbeat() {\n\t$response = array();\n\n\t// screen_id is the same as $current_screen->id and the JS global 'pagenow'.\n\tif ( ! empty($_POST['screen_id']) )\n\t\t$screen_id = sanitize_key($_POST['screen_id']);\n\telse\n\t\t$screen_id = 'front';\n\n\tif ( ! empty($_POST['data']) ) {\n\t\t$data = wp_unslash( (array) $_POST['data'] );\n\n\t\t/**\n\t\t * Filter Heartbeat AJAX response in no-privilege environments.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param array|object $response  The no-priv Heartbeat response object or array.\n\t\t * @param array        $data      An array of data passed via $_POST.\n\t\t * @param string       $screen_id The screen id.\n\t\t */\n\t\t$response = apply_filters( 'heartbeat_nopriv_received', $response, $data, $screen_id );\n\t}\n\n\t/**\n\t * Filter Heartbeat AJAX response when no data is passed.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array|object $response  The Heartbeat response object or array.\n\t * @param string       $screen_id The screen id.\n\t */\n\t$response = apply_filters( 'heartbeat_nopriv_send', $response, $screen_id );\n\n\t/**\n\t * Fires when Heartbeat ticks in no-privilege environments.\n\t *\n\t * Allows the transport to be easily replaced with long-polling.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array|object $response  The no-priv Heartbeat response.\n\t * @param string       $screen_id The screen id.\n\t */\n\tdo_action( 'heartbeat_nopriv_tick', $response, $screen_id );\n\n\t// Send the current time according to the server.\n\t$response['server_time'] = time();\n\n\twp_send_json($response);\n}\n\n//\n// GET-based Ajax handlers.\n//\n\n/**\n * Ajax handler for fetching a list table.\n *\n * @since 3.1.0\n *\n * @global WP_List_Table $wp_list_table\n */\nfunction wp_ajax_fetch_list() {\n\tglobal $wp_list_table;\n\n\t$list_class = $_GET['list_args']['class'];\n\tcheck_ajax_referer( \"fetch-list-$list_class\", '_ajax_fetch_list_nonce' );\n\n\t$wp_list_table = _get_list_table( $list_class, array( 'screen' => $_GET['list_args']['screen']['id'] ) );\n\tif ( ! $wp_list_table )\n\t\twp_die( 0 );\n\n\tif ( ! $wp_list_table->ajax_user_can() )\n\t\twp_die( -1 );\n\n\t$wp_list_table->ajax_response();\n\n\twp_die( 0 );\n}\n\n/**\n * Ajax handler for tag search.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_ajax_tag_search() {\n\tif ( ! isset( $_GET['tax'] ) ) {\n\t\twp_die( 0 );\n\t}\n\n\t$taxonomy = sanitize_key( $_GET['tax'] );\n\t$tax = get_taxonomy( $taxonomy );\n\tif ( ! $tax ) {\n\t\twp_die( 0 );\n\t}\n\n\tif ( ! current_user_can( $tax->cap->assign_terms ) ) {\n\t\twp_die( -1 );\n\t}\n\n\t$s = wp_unslash( $_GET['q'] );\n\n\t$comma = _x( ',', 'tag delimiter' );\n\tif ( ',' !== $comma )\n\t\t$s = str_replace( $comma, ',', $s );\n\tif ( false !== strpos( $s, ',' ) ) {\n\t\t$s = explode( ',', $s );\n\t\t$s = $s[count( $s ) - 1];\n\t}\n\t$s = trim( $s );\n\n\t/**\n\t * Filter the minimum number of characters required to fire a tag search via AJAX.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param int    $characters The minimum number of characters required. Default 2.\n\t * @param object $tax        The taxonomy object.\n\t * @param string $s          The search term.\n\t */\n\t$term_search_min_chars = (int) apply_filters( 'term_search_min_chars', 2, $tax, $s );\n\n\t/*\n\t * Require $term_search_min_chars chars for matching (default: 2)\n\t * ensure it's a non-negative, non-zero integer.\n\t */\n\tif ( ( $term_search_min_chars == 0 ) || ( strlen( $s ) < $term_search_min_chars ) ){\n\t\twp_die();\n\t}\n\n\t$results = get_terms( $taxonomy, array( 'name__like' => $s, 'fields' => 'names', 'hide_empty' => false ) );\n\n\techo join( $results, \"\\n\" );\n\twp_die();\n}\n\n/**\n * Ajax handler for compression testing.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_wp_compression_test() {\n\tif ( !current_user_can( 'manage_options' ) )\n\t\twp_die( -1 );\n\n\tif ( ini_get('zlib.output_compression') || 'ob_gzhandler' == ini_get('output_handler') ) {\n\t\tupdate_site_option('can_compress_scripts', 0);\n\t\twp_die( 0 );\n\t}\n\n\tif ( isset($_GET['test']) ) {\n\t\theader( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );\n\t\theader( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );\n\t\theader( 'Cache-Control: no-cache, must-revalidate, max-age=0' );\n\t\theader( 'Pragma: no-cache' );\n\t\theader('Content-Type: application/javascript; charset=UTF-8');\n\t\t$force_gzip = ( defined('ENFORCE_GZIP') && ENFORCE_GZIP );\n\t\t$test_str = '\"wpCompressionTest Lorem ipsum dolor sit amet consectetuer mollis sapien urna ut a. Eu nonummy condimentum fringilla tempor pretium platea vel nibh netus Maecenas. Hac molestie amet justo quis pellentesque est ultrices interdum nibh Morbi. Cras mattis pretium Phasellus ante ipsum ipsum ut sociis Suspendisse Lorem. Ante et non molestie. Porta urna Vestibulum egestas id congue nibh eu risus gravida sit. Ac augue auctor Ut et non a elit massa id sodales. Elit eu Nulla at nibh adipiscing mattis lacus mauris at tempus. Netus nibh quis suscipit nec feugiat eget sed lorem et urna. Pellentesque lacus at ut massa consectetuer ligula ut auctor semper Pellentesque. Ut metus massa nibh quam Curabitur molestie nec mauris congue. Volutpat molestie elit justo facilisis neque ac risus Ut nascetur tristique. Vitae sit lorem tellus et quis Phasellus lacus tincidunt nunc Fusce. Pharetra wisi Suspendisse mus sagittis libero lacinia Integer consequat ac Phasellus. Et urna ac cursus tortor aliquam Aliquam amet tellus volutpat Vestibulum. Justo interdum condimentum In augue congue tellus sollicitudin Quisque quis nibh.\"';\n\n\t\t if ( 1 == $_GET['test'] ) {\n\t\t \techo $test_str;\n\t\t \twp_die();\n\t\t } elseif ( 2 == $_GET['test'] ) {\n\t\t\tif ( !isset($_SERVER['HTTP_ACCEPT_ENCODING']) )\n\t\t\t\twp_die( -1 );\n\t\t\tif ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && function_exists('gzdeflate') && ! $force_gzip ) {\n\t\t\t\theader('Content-Encoding: deflate');\n\t\t\t\t$out = gzdeflate( $test_str, 1 );\n\t\t\t} elseif ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode') ) {\n\t\t\t\theader('Content-Encoding: gzip');\n\t\t\t\t$out = gzencode( $test_str, 1 );\n\t\t\t} else {\n\t\t\t\twp_die( -1 );\n\t\t\t}\n\t\t\techo $out;\n\t\t\twp_die();\n\t\t} elseif ( 'no' == $_GET['test'] ) {\n\t\t\tupdate_site_option('can_compress_scripts', 0);\n\t\t} elseif ( 'yes' == $_GET['test'] ) {\n\t\t\tupdate_site_option('can_compress_scripts', 1);\n\t\t}\n\t}\n\n\twp_die( 0 );\n}\n\n/**\n * Ajax handler for image editor previews.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_imgedit_preview() {\n\t$post_id = intval($_GET['postid']);\n\tif ( empty($post_id) || !current_user_can('edit_post', $post_id) )\n\t\twp_die( -1 );\n\n\tcheck_ajax_referer( \"image_editor-$post_id\" );\n\n\tinclude_once( ABSPATH . 'wp-admin/includes/image-edit.php' );\n\tif ( ! stream_preview_image($post_id) )\n\t\twp_die( -1 );\n\n\twp_die();\n}\n\n/**\n * Ajax handler for oEmbed caching.\n *\n * @since 3.1.0\n *\n * @global WP_Embed $wp_embed\n */\nfunction wp_ajax_oembed_cache() {\n\t$GLOBALS['wp_embed']->cache_oembed( $_GET['post'] );\n\twp_die( 0 );\n}\n\n/**\n * Ajax handler for user autocomplete.\n *\n * @since 3.4.0\n */\nfunction wp_ajax_autocomplete_user() {\n\tif ( ! is_multisite() || ! current_user_can( 'promote_users' ) || wp_is_large_network( 'users' ) )\n\t\twp_die( -1 );\n\n\t/** This filter is documented in wp-admin/user-new.php */\n\tif ( ! is_super_admin() && ! apply_filters( 'autocomplete_users_for_site_admins', false ) )\n\t\twp_die( -1 );\n\n\t$return = array();\n\n\t// Check the type of request\n\t// Current allowed values are `add` and `search`\n\tif ( isset( $_REQUEST['autocomplete_type'] ) && 'search' === $_REQUEST['autocomplete_type'] ) {\n\t\t$type = $_REQUEST['autocomplete_type'];\n\t} else {\n\t\t$type = 'add';\n\t}\n\n\t// Check the desired field for value\n\t// Current allowed values are `user_email` and `user_login`\n\tif ( isset( $_REQUEST['autocomplete_field'] ) && 'user_email' === $_REQUEST['autocomplete_field'] ) {\n\t\t$field = $_REQUEST['autocomplete_field'];\n\t} else {\n\t\t$field = 'user_login';\n\t}\n\n\t// Exclude current users of this blog\n\tif ( isset( $_REQUEST['site_id'] ) ) {\n\t\t$id = absint( $_REQUEST['site_id'] );\n\t} else {\n\t\t$id = get_current_blog_id();\n\t}\n\n\t$include_blog_users = ( $type == 'search' ? get_users( array( 'blog_id' => $id, 'fields' => 'ID' ) ) : array() );\n\t$exclude_blog_users = ( $type == 'add' ? get_users( array( 'blog_id' => $id, 'fields' => 'ID' ) ) : array() );\n\n\t$users = get_users( array(\n\t\t'blog_id' => false,\n\t\t'search'  => '*' . $_REQUEST['term'] . '*',\n\t\t'include' => $include_blog_users,\n\t\t'exclude' => $exclude_blog_users,\n\t\t'search_columns' => array( 'user_login', 'user_nicename', 'user_email' ),\n\t) );\n\n\tforeach ( $users as $user ) {\n\t\t$return[] = array(\n\t\t\t/* translators: 1: user_login, 2: user_email */\n\t\t\t'label' => sprintf( __( '%1$s (%2$s)' ), $user->user_login, $user->user_email ),\n\t\t\t'value' => $user->$field,\n\t\t);\n\t}\n\n\twp_die( wp_json_encode( $return ) );\n}\n\n/**\n * Ajax handler for dashboard widgets.\n *\n * @since 3.4.0\n */\nfunction wp_ajax_dashboard_widgets() {\n\trequire_once ABSPATH . 'wp-admin/includes/dashboard.php';\n\n\t$pagenow = $_GET['pagenow'];\n\tif ( $pagenow === 'dashboard-user' || $pagenow === 'dashboard-network' || $pagenow === 'dashboard' ) {\n\t\tset_current_screen( $pagenow );\n\t}\n\n\tswitch ( $_GET['widget'] ) {\n\t\tcase 'dashboard_primary' :\n\t\t\twp_dashboard_primary();\n\t\t\tbreak;\n\t}\n\twp_die();\n}\n\n/**\n * Ajax handler for Customizer preview logged-in status.\n *\n * @since 3.4.0\n */\nfunction wp_ajax_logged_in() {\n\twp_die( 1 );\n}\n\n//\n// Ajax helpers.\n//\n\n/**\n * Sends back current comment total and new page links if they need to be updated.\n *\n * Contrary to normal success AJAX response (\"1\"), die with time() on success.\n *\n * @since 2.7.0\n *\n * @param int $comment_id\n * @param int $delta\n */\nfunction _wp_ajax_delete_comment_response( $comment_id, $delta = -1 ) {\n\t$total    = isset( $_POST['_total'] )    ? (int) $_POST['_total']    : 0;\n\t$per_page = isset( $_POST['_per_page'] ) ? (int) $_POST['_per_page'] : 0;\n\t$page     = isset( $_POST['_page'] )     ? (int) $_POST['_page']     : 0;\n\t$url      = isset( $_POST['_url'] )      ? esc_url_raw( $_POST['_url'] ) : '';\n\n\t// JS didn't send us everything we need to know. Just die with success message\n\tif ( ! $total || ! $per_page || ! $page || ! $url ) {\n\t\t$time = time();\n\t\t$comment = get_comment( $comment_id );\n\n\t\t$counts = wp_count_comments();\n\n\t\t$x = new WP_Ajax_Response( array(\n\t\t\t'what' => 'comment',\n\t\t\t// Here for completeness - not used.\n\t\t\t'id' => $comment_id,\n\t\t\t'supplemental' => array(\n\t\t\t\t'status' => $comment ? $comment->comment_approved : '',\n\t\t\t\t'postId' => $comment ? $comment->comment_post_ID : '',\n\t\t\t\t'time' => $time,\n\t\t\t\t'in_moderation' => $counts->moderated,\n\t\t\t\t'i18n_comments_text' => sprintf(\n\t\t\t\t\t_n( '%s Comment', '%s Comments', $counts->approved ),\n\t\t\t\t\tnumber_format_i18n( $counts->approved )\n\t\t\t\t),\n\t\t\t\t'i18n_moderation_text' => sprintf(\n\t\t\t\t\t_nx( '%s in moderation', '%s in moderation', $counts->moderated, 'comments' ),\n\t\t\t\t\tnumber_format_i18n( $counts->moderated )\n\t\t\t\t)\n\t\t\t)\n\t\t) );\n\t\t$x->send();\n\t}\n\n\t$total += $delta;\n\tif ( $total < 0 )\n\t\t$total = 0;\n\n\t// Only do the expensive stuff on a page-break, and about 1 other time per page\n\tif ( 0 == $total % $per_page || 1 == mt_rand( 1, $per_page ) ) {\n\t\t$post_id = 0;\n\t\t// What type of comment count are we looking for?\n\t\t$status = 'all';\n\t\t$parsed = parse_url( $url );\n\t\tif ( isset( $parsed['query'] ) ) {\n\t\t\tparse_str( $parsed['query'], $query_vars );\n\t\t\tif ( !empty( $query_vars['comment_status'] ) )\n\t\t\t\t$status = $query_vars['comment_status'];\n\t\t\tif ( !empty( $query_vars['p'] ) )\n\t\t\t\t$post_id = (int) $query_vars['p'];\n\t\t}\n\n\t\t$comment_count = wp_count_comments($post_id);\n\n\t\t// We're looking for a known type of comment count.\n\t\tif ( isset( $comment_count->$status ) )\n\t\t\t$total = $comment_count->$status;\n\t\t\t// Else use the decremented value from above.\n\t}\n\n\t// The time since the last comment count.\n\t$time = time();\n\t$comment = get_comment( $comment_id );\n\n\t$x = new WP_Ajax_Response( array(\n\t\t'what' => 'comment',\n\t\t// Here for completeness - not used.\n\t\t'id' => $comment_id,\n\t\t'supplemental' => array(\n\t\t\t'status' => $comment ? $comment->comment_approved : '',\n\t\t\t'postId' => $comment ? $comment->comment_post_ID : '',\n\t\t\t'total_items_i18n' => sprintf( _n( '%s item', '%s items', $total ), number_format_i18n( $total ) ),\n\t\t\t'total_pages' => ceil( $total / $per_page ),\n\t\t\t'total_pages_i18n' => number_format_i18n( ceil( $total / $per_page ) ),\n\t\t\t'total' => $total,\n\t\t\t'time' => $time\n\t\t)\n\t) );\n\t$x->send();\n}\n\n//\n// POST-based Ajax handlers.\n//\n\n/**\n * Ajax handler for adding a hierarchical term.\n *\n * @since 3.1.0\n */\nfunction _wp_ajax_add_hierarchical_term() {\n\t$action = $_POST['action'];\n\t$taxonomy = get_taxonomy(substr($action, 4));\n\tcheck_ajax_referer( $action, '_ajax_nonce-add-' . $taxonomy->name );\n\tif ( !current_user_can( $taxonomy->cap->edit_terms ) )\n\t\twp_die( -1 );\n\t$names = explode(',', $_POST['new'.$taxonomy->name]);\n\t$parent = isset($_POST['new'.$taxonomy->name.'_parent']) ? (int) $_POST['new'.$taxonomy->name.'_parent'] : 0;\n\tif ( 0 > $parent )\n\t\t$parent = 0;\n\tif ( $taxonomy->name == 'category' )\n\t\t$post_category = isset($_POST['post_category']) ? (array) $_POST['post_category'] : array();\n\telse\n\t\t$post_category = ( isset($_POST['tax_input']) && isset($_POST['tax_input'][$taxonomy->name]) ) ? (array) $_POST['tax_input'][$taxonomy->name] : array();\n\t$checked_categories = array_map( 'absint', (array) $post_category );\n\t$popular_ids = wp_popular_terms_checklist($taxonomy->name, 0, 10, false);\n\n\tforeach ( $names as $cat_name ) {\n\t\t$cat_name = trim($cat_name);\n\t\t$category_nicename = sanitize_title($cat_name);\n\t\tif ( '' === $category_nicename )\n\t\t\tcontinue;\n\t\tif ( !$cat_id = term_exists( $cat_name, $taxonomy->name, $parent ) )\n\t\t\t$cat_id = wp_insert_term( $cat_name, $taxonomy->name, array( 'parent' => $parent ) );\n\t\tif ( is_wp_error( $cat_id ) ) {\n\t\t\tcontinue;\n\t\t} elseif ( is_array( $cat_id ) ) {\n\t\t\t$cat_id = $cat_id['term_id'];\n\t\t}\n\t\t$checked_categories[] = $cat_id;\n\t\tif ( $parent ) // Do these all at once in a second\n\t\t\tcontinue;\n\n\t\tob_start();\n\n\t\twp_terms_checklist( 0, array( 'taxonomy' => $taxonomy->name, 'descendants_and_self' => $cat_id, 'selected_cats' => $checked_categories, 'popular_cats' => $popular_ids ));\n\n\t\t$data = ob_get_clean();\n\n\t\t$add = array(\n\t\t\t'what' => $taxonomy->name,\n\t\t\t'id' => $cat_id,\n\t\t\t'data' => str_replace( array(\"\\n\", \"\\t\"), '', $data),\n\t\t\t'position' => -1\n\t\t);\n\t}\n\n\tif ( $parent ) { // Foncy - replace the parent and all its children\n\t\t$parent = get_term( $parent, $taxonomy->name );\n\t\t$term_id = $parent->term_id;\n\n\t\twhile ( $parent->parent ) { // get the top parent\n\t\t\t$parent = get_term( $parent->parent, $taxonomy->name );\n\t\t\tif ( is_wp_error( $parent ) )\n\t\t\t\tbreak;\n\t\t\t$term_id = $parent->term_id;\n\t\t}\n\n\t\tob_start();\n\n\t\twp_terms_checklist( 0, array('taxonomy' => $taxonomy->name, 'descendants_and_self' => $term_id, 'selected_cats' => $checked_categories, 'popular_cats' => $popular_ids));\n\n\t\t$data = ob_get_clean();\n\n\t\t$add = array(\n\t\t\t'what' => $taxonomy->name,\n\t\t\t'id' => $term_id,\n\t\t\t'data' => str_replace( array(\"\\n\", \"\\t\"), '', $data),\n\t\t\t'position' => -1\n\t\t);\n\t}\n\n\tob_start();\n\n\twp_dropdown_categories( array(\n\t\t'taxonomy' => $taxonomy->name, 'hide_empty' => 0, 'name' => 'new'.$taxonomy->name.'_parent', 'orderby' => 'name',\n\t\t'hierarchical' => 1, 'show_option_none' => '&mdash; '.$taxonomy->labels->parent_item.' &mdash;'\n\t) );\n\n\t$sup = ob_get_clean();\n\n\t$add['supplemental'] = array( 'newcat_parent' => $sup );\n\n\t$x = new WP_Ajax_Response( $add );\n\t$x->send();\n}\n\n/**\n * Ajax handler for deleting a comment.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_delete_comment() {\n\t$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;\n\n\tif ( !$comment = get_comment( $id ) )\n\t\twp_die( time() );\n\tif ( ! current_user_can( 'edit_comment', $comment->comment_ID ) )\n\t\twp_die( -1 );\n\n\tcheck_ajax_referer( \"delete-comment_$id\" );\n\t$status = wp_get_comment_status( $comment );\n\n\t$delta = -1;\n\tif ( isset($_POST['trash']) && 1 == $_POST['trash'] ) {\n\t\tif ( 'trash' == $status )\n\t\t\twp_die( time() );\n\t\t$r = wp_trash_comment( $comment );\n\t} elseif ( isset($_POST['untrash']) && 1 == $_POST['untrash'] ) {\n\t\tif ( 'trash' != $status )\n\t\t\twp_die( time() );\n\t\t$r = wp_untrash_comment( $comment );\n\t\tif ( ! isset( $_POST['comment_status'] ) || $_POST['comment_status'] != 'trash' ) // undo trash, not in trash\n\t\t\t$delta = 1;\n\t} elseif ( isset($_POST['spam']) && 1 == $_POST['spam'] ) {\n\t\tif ( 'spam' == $status )\n\t\t\twp_die( time() );\n\t\t$r = wp_spam_comment( $comment );\n\t} elseif ( isset($_POST['unspam']) && 1 == $_POST['unspam'] ) {\n\t\tif ( 'spam' != $status )\n\t\t\twp_die( time() );\n\t\t$r = wp_unspam_comment( $comment );\n\t\tif ( ! isset( $_POST['comment_status'] ) || $_POST['comment_status'] != 'spam' ) // undo spam, not in spam\n\t\t\t$delta = 1;\n\t} elseif ( isset($_POST['delete']) && 1 == $_POST['delete'] ) {\n\t\t$r = wp_delete_comment( $comment );\n\t} else {\n\t\twp_die( -1 );\n\t}\n\n\tif ( $r ) // Decide if we need to send back '1' or a more complicated response including page links and comment counts\n\t\t_wp_ajax_delete_comment_response( $comment->comment_ID, $delta );\n\twp_die( 0 );\n}\n\n/**\n * Ajax handler for deleting a tag.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_delete_tag() {\n\t$tag_id = (int) $_POST['tag_ID'];\n\tcheck_ajax_referer( \"delete-tag_$tag_id\" );\n\n\t$taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag';\n\t$tax = get_taxonomy($taxonomy);\n\n\tif ( !current_user_can( $tax->cap->delete_terms ) )\n\t\twp_die( -1 );\n\n\t$tag = get_term( $tag_id, $taxonomy );\n\tif ( !$tag || is_wp_error( $tag ) )\n\t\twp_die( 1 );\n\n\tif ( wp_delete_term($tag_id, $taxonomy))\n\t\twp_die( 1 );\n\telse\n\t\twp_die( 0 );\n}\n\n/**\n * Ajax handler for deleting a link.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_delete_link() {\n\t$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;\n\n\tcheck_ajax_referer( \"delete-bookmark_$id\" );\n\tif ( !current_user_can( 'manage_links' ) )\n\t\twp_die( -1 );\n\n\t$link = get_bookmark( $id );\n\tif ( !$link || is_wp_error( $link ) )\n\t\twp_die( 1 );\n\n\tif ( wp_delete_link( $id ) )\n\t\twp_die( 1 );\n\telse\n\t\twp_die( 0 );\n}\n\n/**\n * Ajax handler for deleting meta.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_delete_meta() {\n\t$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;\n\n\tcheck_ajax_referer( \"delete-meta_$id\" );\n\tif ( !$meta = get_metadata_by_mid( 'post', $id ) )\n\t\twp_die( 1 );\n\n\tif ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta',  $meta->post_id, $meta->meta_key ) )\n\t\twp_die( -1 );\n\tif ( delete_meta( $meta->meta_id ) )\n\t\twp_die( 1 );\n\twp_die( 0 );\n}\n\n/**\n * Ajax handler for deleting a post.\n *\n * @since 3.1.0\n *\n * @param string $action Action to perform.\n */\nfunction wp_ajax_delete_post( $action ) {\n\tif ( empty( $action ) )\n\t\t$action = 'delete-post';\n\t$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;\n\n\tcheck_ajax_referer( \"{$action}_$id\" );\n\tif ( !current_user_can( 'delete_post', $id ) )\n\t\twp_die( -1 );\n\n\tif ( !get_post( $id ) )\n\t\twp_die( 1 );\n\n\tif ( wp_delete_post( $id ) )\n\t\twp_die( 1 );\n\telse\n\t\twp_die( 0 );\n}\n\n/**\n * Ajax handler for sending a post to the trash.\n *\n * @since 3.1.0\n *\n * @param string $action Action to perform.\n */\nfunction wp_ajax_trash_post( $action ) {\n\tif ( empty( $action ) )\n\t\t$action = 'trash-post';\n\t$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;\n\n\tcheck_ajax_referer( \"{$action}_$id\" );\n\tif ( !current_user_can( 'delete_post', $id ) )\n\t\twp_die( -1 );\n\n\tif ( !get_post( $id ) )\n\t\twp_die( 1 );\n\n\tif ( 'trash-post' == $action )\n\t\t$done = wp_trash_post( $id );\n\telse\n\t\t$done = wp_untrash_post( $id );\n\n\tif ( $done )\n\t\twp_die( 1 );\n\n\twp_die( 0 );\n}\n\n/**\n * Ajax handler to restore a post from the trash.\n *\n * @since 3.1.0\n *\n * @param string $action Action to perform.\n */\nfunction wp_ajax_untrash_post( $action ) {\n\tif ( empty( $action ) )\n\t\t$action = 'untrash-post';\n\twp_ajax_trash_post( $action );\n}\n\n/**\n * @since 3.1.0\n *\n * @param string $action\n */\nfunction wp_ajax_delete_page( $action ) {\n\tif ( empty( $action ) )\n\t\t$action = 'delete-page';\n\t$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;\n\n\tcheck_ajax_referer( \"{$action}_$id\" );\n\tif ( !current_user_can( 'delete_page', $id ) )\n\t\twp_die( -1 );\n\n\tif ( ! get_post( $id ) )\n\t\twp_die( 1 );\n\n\tif ( wp_delete_post( $id ) )\n\t\twp_die( 1 );\n\telse\n\t\twp_die( 0 );\n}\n\n/**\n * Ajax handler to dim a comment.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_dim_comment() {\n\t$id = isset( $_POST['id'] ) ? (int) $_POST['id'] : 0;\n\n\tif ( !$comment = get_comment( $id ) ) {\n\t\t$x = new WP_Ajax_Response( array(\n\t\t\t'what' => 'comment',\n\t\t\t'id' => new WP_Error('invalid_comment', sprintf(__('Comment %d does not exist'), $id))\n\t\t) );\n\t\t$x->send();\n\t}\n\n\tif ( ! current_user_can( 'edit_comment', $comment->comment_ID ) && ! current_user_can( 'moderate_comments' ) )\n\t\twp_die( -1 );\n\n\t$current = wp_get_comment_status( $comment );\n\tif ( isset( $_POST['new'] ) && $_POST['new'] == $current )\n\t\twp_die( time() );\n\n\tcheck_ajax_referer( \"approve-comment_$id\" );\n\tif ( in_array( $current, array( 'unapproved', 'spam' ) ) ) {\n\t\t$result = wp_set_comment_status( $comment, 'approve', true );\n\t} else {\n\t\t$result = wp_set_comment_status( $comment, 'hold', true );\n\t}\n\n\tif ( is_wp_error($result) ) {\n\t\t$x = new WP_Ajax_Response( array(\n\t\t\t'what' => 'comment',\n\t\t\t'id' => $result\n\t\t) );\n\t\t$x->send();\n\t}\n\n\t// Decide if we need to send back '1' or a more complicated response including page links and comment counts\n\t_wp_ajax_delete_comment_response( $comment->comment_ID );\n\twp_die( 0 );\n}\n\n/**\n * Ajax handler for deleting a link category.\n *\n * @since 3.1.0\n *\n * @param string $action Action to perform.\n */\nfunction wp_ajax_add_link_category( $action ) {\n\tif ( empty( $action ) )\n\t\t$action = 'add-link-category';\n\tcheck_ajax_referer( $action );\n\tif ( !current_user_can( 'manage_categories' ) )\n\t\twp_die( -1 );\n\t$names = explode(',', wp_unslash( $_POST['newcat'] ) );\n\t$x = new WP_Ajax_Response();\n\tforeach ( $names as $cat_name ) {\n\t\t$cat_name = trim($cat_name);\n\t\t$slug = sanitize_title($cat_name);\n\t\tif ( '' === $slug )\n\t\t\tcontinue;\n\t\tif ( !$cat_id = term_exists( $cat_name, 'link_category' ) )\n\t\t\t$cat_id = wp_insert_term( $cat_name, 'link_category' );\n\t\tif ( is_wp_error( $cat_id ) ) {\n\t\t\tcontinue;\n\t\t} elseif ( is_array( $cat_id ) ) {\n\t\t\t$cat_id = $cat_id['term_id'];\n\t\t}\n\t\t$cat_name = esc_html( $cat_name );\n\t\t$x->add( array(\n\t\t\t'what' => 'link-category',\n\t\t\t'id' => $cat_id,\n\t\t\t'data' => \"<li id='link-category-$cat_id'><label for='in-link-category-$cat_id' class='selectit'><input value='\" . esc_attr($cat_id) . \"' type='checkbox' checked='checked' name='link_category[]' id='in-link-category-$cat_id'/> $cat_name</label></li>\",\n\t\t\t'position' => -1\n\t\t) );\n\t}\n\t$x->send();\n}\n\n/**\n * Ajax handler to add a tag.\n *\n * @since 3.1.0\n *\n * @global WP_List_Table $wp_list_table\n */\nfunction wp_ajax_add_tag() {\n\tglobal $wp_list_table;\n\n\tcheck_ajax_referer( 'add-tag', '_wpnonce_add-tag' );\n\t$taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag';\n\t$tax = get_taxonomy($taxonomy);\n\n\tif ( !current_user_can( $tax->cap->edit_terms ) )\n\t\twp_die( -1 );\n\n\t$x = new WP_Ajax_Response();\n\n\t$tag = wp_insert_term($_POST['tag-name'], $taxonomy, $_POST );\n\n\tif ( !$tag || is_wp_error($tag) || (!$tag = get_term( $tag['term_id'], $taxonomy )) ) {\n\t\t$message = __('An error has occurred. Please reload the page and try again.');\n\t\tif ( is_wp_error($tag) && $tag->get_error_message() )\n\t\t\t$message = $tag->get_error_message();\n\n\t\t$x->add( array(\n\t\t\t'what' => 'taxonomy',\n\t\t\t'data' => new WP_Error('error', $message )\n\t\t) );\n\t\t$x->send();\n\t}\n\n\t$wp_list_table = _get_list_table( 'WP_Terms_List_Table', array( 'screen' => $_POST['screen'] ) );\n\n\t$level = 0;\n\tif ( is_taxonomy_hierarchical($taxonomy) ) {\n\t\t$level = count( get_ancestors( $tag->term_id, $taxonomy, 'taxonomy' ) );\n\t\tob_start();\n\t\t$wp_list_table->single_row( $tag, $level );\n\t\t$noparents = ob_get_clean();\n\t}\n\n\tob_start();\n\t$wp_list_table->single_row( $tag );\n\t$parents = ob_get_clean();\n\n\t$x->add( array(\n\t\t'what' => 'taxonomy',\n\t\t'supplemental' => compact('parents', 'noparents')\n\t) );\n\t$x->add( array(\n\t\t'what' => 'term',\n\t\t'position' => $level,\n\t\t'supplemental' => (array) $tag\n\t) );\n\t$x->send();\n}\n\n/**\n * Ajax handler for getting a tagcloud.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_get_tagcloud() {\n\tif ( ! isset( $_POST['tax'] ) ) {\n\t\twp_die( 0 );\n\t}\n\n\t$taxonomy = sanitize_key( $_POST['tax'] );\n\t$tax = get_taxonomy( $taxonomy );\n\tif ( ! $tax ) {\n\t\twp_die( 0 );\n\t}\n\n\tif ( ! current_user_can( $tax->cap->assign_terms ) ) {\n\t\twp_die( -1 );\n\t}\n\n\t$tags = get_terms( $taxonomy, array( 'number' => 45, 'orderby' => 'count', 'order' => 'DESC' ) );\n\n\tif ( empty( $tags ) )\n\t\twp_die( $tax->labels->not_found );\n\n\tif ( is_wp_error( $tags ) )\n\t\twp_die( $tags->get_error_message() );\n\n\tforeach ( $tags as $key => $tag ) {\n\t\t$tags[ $key ]->link = '#';\n\t\t$tags[ $key ]->id = $tag->term_id;\n\t}\n\n\t// We need raw tag names here, so don't filter the output\n\t$return = wp_generate_tag_cloud( $tags, array('filter' => 0) );\n\n\tif ( empty($return) )\n\t\twp_die( 0 );\n\n\techo $return;\n\n\twp_die();\n}\n\n/**\n * Ajax handler for getting comments.\n *\n * @since 3.1.0\n *\n * @global WP_List_Table $wp_list_table\n * @global int           $post_id\n *\n * @param string $action Action to perform.\n */\nfunction wp_ajax_get_comments( $action ) {\n\tglobal $wp_list_table, $post_id;\n\tif ( empty( $action ) )\n\t\t$action = 'get-comments';\n\n\tcheck_ajax_referer( $action );\n\n\tif ( empty( $post_id ) && ! empty( $_REQUEST['p'] ) ) {\n\t\t$id = absint( $_REQUEST['p'] );\n\t\tif ( ! empty( $id ) )\n\t\t\t$post_id = $id;\n\t}\n\n\tif ( empty( $post_id ) )\n\t\twp_die( -1 );\n\n\t$wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) );\n\n\tif ( ! current_user_can( 'edit_post', $post_id ) )\n\t\twp_die( -1 );\n\n\t$wp_list_table->prepare_items();\n\n\tif ( !$wp_list_table->has_items() )\n\t\twp_die( 1 );\n\n\t$x = new WP_Ajax_Response();\n\tob_start();\n\tforeach ( $wp_list_table->items as $comment ) {\n\t\tif ( ! current_user_can( 'edit_comment', $comment->comment_ID ) )\n\t\t\tcontinue;\n\t\tget_comment( $comment );\n\t\t$wp_list_table->single_row( $comment );\n\t}\n\t$comment_list_item = ob_get_clean();\n\n\t$x->add( array(\n\t\t'what' => 'comments',\n\t\t'data' => $comment_list_item\n\t) );\n\t$x->send();\n}\n\n/**\n * Ajax handler for replying to a comment.\n *\n * @since 3.1.0\n *\n * @global WP_List_Table $wp_list_table\n *\n * @param string $action Action to perform.\n */\nfunction wp_ajax_replyto_comment( $action ) {\n\tglobal $wp_list_table;\n\tif ( empty( $action ) )\n\t\t$action = 'replyto-comment';\n\n\tcheck_ajax_referer( $action, '_ajax_nonce-replyto-comment' );\n\n\t$comment_post_ID = (int) $_POST['comment_post_ID'];\n\t$post = get_post( $comment_post_ID );\n\tif ( ! $post )\n\t\twp_die( -1 );\n\n\tif ( !current_user_can( 'edit_post', $comment_post_ID ) )\n\t\twp_die( -1 );\n\n\tif ( empty( $post->post_status ) )\n\t\twp_die( 1 );\n\telseif ( in_array($post->post_status, array('draft', 'pending', 'trash') ) )\n\t\twp_die( __('ERROR: you are replying to a comment on a draft post.') );\n\n\t$user = wp_get_current_user();\n\tif ( $user->exists() ) {\n\t\t$user_ID = $user->ID;\n\t\t$comment_author       = wp_slash( $user->display_name );\n\t\t$comment_author_email = wp_slash( $user->user_email );\n\t\t$comment_author_url   = wp_slash( $user->user_url );\n\t\t$comment_content      = trim( $_POST['content'] );\n\t\t$comment_type         = isset( $_POST['comment_type'] ) ? trim( $_POST['comment_type'] ) : '';\n\t\tif ( current_user_can( 'unfiltered_html' ) ) {\n\t\t\tif ( ! isset( $_POST['_wp_unfiltered_html_comment'] ) )\n\t\t\t\t$_POST['_wp_unfiltered_html_comment'] = '';\n\n\t\t\tif ( wp_create_nonce( 'unfiltered-html-comment' ) != $_POST['_wp_unfiltered_html_comment'] ) {\n\t\t\t\tkses_remove_filters(); // start with a clean slate\n\t\t\t\tkses_init_filters(); // set up the filters\n\t\t\t}\n\t\t}\n\t} else {\n\t\twp_die( __( 'Sorry, you must be logged in to reply to a comment.' ) );\n\t}\n\n\tif ( '' == $comment_content )\n\t\twp_die( __( 'ERROR: please type a comment.' ) );\n\n\t$comment_parent = 0;\n\tif ( isset( $_POST['comment_ID'] ) )\n\t\t$comment_parent = absint( $_POST['comment_ID'] );\n\t$comment_auto_approved = false;\n\t$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');\n\n\t// Automatically approve parent comment.\n\tif ( !empty($_POST['approve_parent']) ) {\n\t\t$parent = get_comment( $comment_parent );\n\n\t\tif ( $parent && $parent->comment_approved === '0' && $parent->comment_post_ID == $comment_post_ID ) {\n\t\t\tif ( ! current_user_can( 'edit_comment', $parent->comment_ID ) ) {\n\t\t\t\twp_die( -1 );\n\t\t\t}\n\n\t\t\tif ( wp_set_comment_status( $parent, 'approve' ) )\n\t\t\t\t$comment_auto_approved = true;\n\t\t}\n\t}\n\n\t$comment_id = wp_new_comment( $commentdata );\n\t$comment = get_comment($comment_id);\n\tif ( ! $comment ) wp_die( 1 );\n\n\t$position = ( isset($_POST['position']) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1';\n\n\tob_start();\n\tif ( isset( $_REQUEST['mode'] ) && 'dashboard' == $_REQUEST['mode'] ) {\n\t\trequire_once( ABSPATH . 'wp-admin/includes/dashboard.php' );\n\t\t_wp_dashboard_recent_comments_row( $comment );\n\t} else {\n\t\tif ( isset( $_REQUEST['mode'] ) && 'single' == $_REQUEST['mode'] ) {\n\t\t\t$wp_list_table = _get_list_table('WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) );\n\t\t} else {\n\t\t\t$wp_list_table = _get_list_table('WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) );\n\t\t}\n\t\t$wp_list_table->single_row( $comment );\n\t}\n\t$comment_list_item = ob_get_clean();\n\n\t$response =  array(\n\t\t'what' => 'comment',\n\t\t'id' => $comment->comment_ID,\n\t\t'data' => $comment_list_item,\n\t\t'position' => $position\n\t);\n\n\t$counts = wp_count_comments();\n\t$response['supplemental'] = array(\n\t\t'in_moderation' => $counts->moderated,\n\t\t'i18n_comments_text' => sprintf(\n\t\t\t_n( '%s Comment', '%s Comments', $counts->approved ),\n\t\t\tnumber_format_i18n( $counts->approved )\n\t\t),\n\t\t'i18n_moderation_text' => sprintf(\n\t\t\t_nx( '%s in moderation', '%s in moderation', $counts->moderated, 'comments' ),\n\t\t\tnumber_format_i18n( $counts->moderated )\n\t\t)\n\t);\n\n\tif ( $comment_auto_approved ) {\n\t\t$response['supplemental']['parent_approved'] = $parent->comment_ID;\n\t\t$response['supplemental']['parent_post_id'] = $parent->comment_post_ID;\n\t}\n\n\t$x = new WP_Ajax_Response();\n\t$x->add( $response );\n\t$x->send();\n}\n\n/**\n * Ajax handler for editing a comment.\n *\n * @since 3.1.0\n *\n * @global WP_List_Table $wp_list_table\n */\nfunction wp_ajax_edit_comment() {\n\tglobal $wp_list_table;\n\n\tcheck_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' );\n\n\t$comment_id = (int) $_POST['comment_ID'];\n\tif ( ! current_user_can( 'edit_comment', $comment_id ) )\n\t\twp_die( -1 );\n\n\tif ( '' == $_POST['content'] )\n\t\twp_die( __( 'ERROR: please type a comment.' ) );\n\n\tif ( isset( $_POST['status'] ) )\n\t\t$_POST['comment_status'] = $_POST['status'];\n\tedit_comment();\n\n\t$position = ( isset($_POST['position']) && (int) $_POST['position']) ? (int) $_POST['position'] : '-1';\n\t$checkbox = ( isset($_POST['checkbox']) && true == $_POST['checkbox'] ) ? 1 : 0;\n\t$wp_list_table = _get_list_table( $checkbox ? 'WP_Comments_List_Table' : 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) );\n\n\t$comment = get_comment( $comment_id );\n\tif ( empty( $comment->comment_ID ) )\n\t\twp_die( -1 );\n\n\tob_start();\n\t$wp_list_table->single_row( $comment );\n\t$comment_list_item = ob_get_clean();\n\n\t$x = new WP_Ajax_Response();\n\n\t$x->add( array(\n\t\t'what' => 'edit_comment',\n\t\t'id' => $comment->comment_ID,\n\t\t'data' => $comment_list_item,\n\t\t'position' => $position\n\t));\n\n\t$x->send();\n}\n\n/**\n * Ajax handler for adding a menu item.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_add_menu_item() {\n\tcheck_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' );\n\n\tif ( ! current_user_can( 'edit_theme_options' ) )\n\t\twp_die( -1 );\n\n\trequire_once ABSPATH . 'wp-admin/includes/nav-menu.php';\n\n\t// For performance reasons, we omit some object properties from the checklist.\n\t// The following is a hacky way to restore them when adding non-custom items.\n\n\t$menu_items_data = array();\n\tforeach ( (array) $_POST['menu-item'] as $menu_item_data ) {\n\t\tif (\n\t\t\t! empty( $menu_item_data['menu-item-type'] ) &&\n\t\t\t'custom' != $menu_item_data['menu-item-type'] &&\n\t\t\t! empty( $menu_item_data['menu-item-object-id'] )\n\t\t) {\n\t\t\tswitch( $menu_item_data['menu-item-type'] ) {\n\t\t\t\tcase 'post_type' :\n\t\t\t\t\t$_object = get_post( $menu_item_data['menu-item-object-id'] );\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'post_type_archive' :\n\t\t\t\t\t$_object = get_post_type_object( $menu_item_data['menu-item-object'] );\n\t\t\t\tbreak;\n\n\t\t\t\tcase 'taxonomy' :\n\t\t\t\t\t$_object = get_term( $menu_item_data['menu-item-object-id'], $menu_item_data['menu-item-object'] );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$_menu_items = array_map( 'wp_setup_nav_menu_item', array( $_object ) );\n\t\t\t$_menu_item = reset( $_menu_items );\n\n\t\t\t// Restore the missing menu item properties\n\t\t\t$menu_item_data['menu-item-description'] = $_menu_item->description;\n\t\t}\n\n\t\t$menu_items_data[] = $menu_item_data;\n\t}\n\n\t$item_ids = wp_save_nav_menu_items( 0, $menu_items_data );\n\tif ( is_wp_error( $item_ids ) )\n\t\twp_die( 0 );\n\n\t$menu_items = array();\n\n\tforeach ( (array) $item_ids as $menu_item_id ) {\n\t\t$menu_obj = get_post( $menu_item_id );\n\t\tif ( ! empty( $menu_obj->ID ) ) {\n\t\t\t$menu_obj = wp_setup_nav_menu_item( $menu_obj );\n\t\t\t$menu_obj->label = $menu_obj->title; // don't show \"(pending)\" in ajax-added items\n\t\t\t$menu_items[] = $menu_obj;\n\t\t}\n\t}\n\n\t/** This filter is documented in wp-admin/includes/nav-menu.php */\n\t$walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $_POST['menu'] );\n\n\tif ( ! class_exists( $walker_class_name ) )\n\t\twp_die( 0 );\n\n\tif ( ! empty( $menu_items ) ) {\n\t\t$args = array(\n\t\t\t'after' => '',\n\t\t\t'before' => '',\n\t\t\t'link_after' => '',\n\t\t\t'link_before' => '',\n\t\t\t'walker' => new $walker_class_name,\n\t\t);\n\t\techo walk_nav_menu_tree( $menu_items, 0, (object) $args );\n\t}\n\twp_die();\n}\n\n/**\n * Ajax handler for adding meta.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_add_meta() {\n\tcheck_ajax_referer( 'add-meta', '_ajax_nonce-add-meta' );\n\t$c = 0;\n\t$pid = (int) $_POST['post_id'];\n\t$post = get_post( $pid );\n\n\tif ( isset($_POST['metakeyselect']) || isset($_POST['metakeyinput']) ) {\n\t\tif ( !current_user_can( 'edit_post', $pid ) )\n\t\t\twp_die( -1 );\n\t\tif ( isset($_POST['metakeyselect']) && '#NONE#' == $_POST['metakeyselect'] && empty($_POST['metakeyinput']) )\n\t\t\twp_die( 1 );\n\n\t\t// If the post is an autodraft, save the post as a draft and then attempt to save the meta.\n\t\tif ( $post->post_status == 'auto-draft' ) {\n\t\t\t$post_data = array();\n\t\t\t$post_data['action'] = 'draft'; // Warning fix\n\t\t\t$post_data['post_ID'] = $pid;\n\t\t\t$post_data['post_type'] = $post->post_type;\n\t\t\t$post_data['post_status'] = 'draft';\n\t\t\t$now = current_time('timestamp', 1);\n\t\t\t$post_data['post_title'] = sprintf( __( 'Draft created on %1$s at %2$s' ), date( get_option( 'date_format' ), $now ), date( get_option( 'time_format' ), $now ) );\n\n\t\t\t$pid = edit_post( $post_data );\n\t\t\tif ( $pid ) {\n\t\t\t\tif ( is_wp_error( $pid ) ) {\n\t\t\t\t\t$x = new WP_Ajax_Response( array(\n\t\t\t\t\t\t'what' => 'meta',\n\t\t\t\t\t\t'data' => $pid\n\t\t\t\t\t) );\n\t\t\t\t\t$x->send();\n\t\t\t\t}\n\n\t\t\t\tif ( !$mid = add_meta( $pid ) )\n\t\t\t\t\twp_die( __( 'Please provide a custom field value.' ) );\n\t\t\t} else {\n\t\t\t\twp_die( 0 );\n\t\t\t}\n\t\t} elseif ( ! $mid = add_meta( $pid ) ) {\n\t\t\twp_die( __( 'Please provide a custom field value.' ) );\n\t\t}\n\n\t\t$meta = get_metadata_by_mid( 'post', $mid );\n\t\t$pid = (int) $meta->post_id;\n\t\t$meta = get_object_vars( $meta );\n\t\t$x = new WP_Ajax_Response( array(\n\t\t\t'what' => 'meta',\n\t\t\t'id' => $mid,\n\t\t\t'data' => _list_meta_row( $meta, $c ),\n\t\t\t'position' => 1,\n\t\t\t'supplemental' => array('postid' => $pid)\n\t\t) );\n\t} else { // Update?\n\t\t$mid = (int) key( $_POST['meta'] );\n\t\t$key = wp_unslash( $_POST['meta'][$mid]['key'] );\n\t\t$value = wp_unslash( $_POST['meta'][$mid]['value'] );\n\t\tif ( '' == trim($key) )\n\t\t\twp_die( __( 'Please provide a custom field name.' ) );\n\t\tif ( '' == trim($value) )\n\t\t\twp_die( __( 'Please provide a custom field value.' ) );\n\t\tif ( ! $meta = get_metadata_by_mid( 'post', $mid ) )\n\t\t\twp_die( 0 ); // if meta doesn't exist\n\t\tif ( is_protected_meta( $meta->meta_key, 'post' ) || is_protected_meta( $key, 'post' ) ||\n\t\t\t! current_user_can( 'edit_post_meta', $meta->post_id, $meta->meta_key ) ||\n\t\t\t! current_user_can( 'edit_post_meta', $meta->post_id, $key ) )\n\t\t\twp_die( -1 );\n\t\tif ( $meta->meta_value != $value || $meta->meta_key != $key ) {\n\t\t\tif ( !$u = update_metadata_by_mid( 'post', $mid, $value, $key ) )\n\t\t\t\twp_die( 0 ); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).\n\t\t}\n\n\t\t$x = new WP_Ajax_Response( array(\n\t\t\t'what' => 'meta',\n\t\t\t'id' => $mid, 'old_id' => $mid,\n\t\t\t'data' => _list_meta_row( array(\n\t\t\t\t'meta_key' => $key,\n\t\t\t\t'meta_value' => $value,\n\t\t\t\t'meta_id' => $mid\n\t\t\t), $c ),\n\t\t\t'position' => 0,\n\t\t\t'supplemental' => array('postid' => $meta->post_id)\n\t\t) );\n\t}\n\t$x->send();\n}\n\n/**\n * Ajax handler for adding a user.\n *\n * @since 3.1.0\n *\n * @global WP_List_Table $wp_list_table\n *\n * @param string $action Action to perform.\n */\nfunction wp_ajax_add_user( $action ) {\n\tglobal $wp_list_table;\n\tif ( empty( $action ) )\n\t\t$action = 'add-user';\n\n\tcheck_ajax_referer( $action );\n\tif ( ! current_user_can('create_users') )\n\t\twp_die( -1 );\n\tif ( ! $user_id = edit_user() ) {\n\t\twp_die( 0 );\n\t} elseif ( is_wp_error( $user_id ) ) {\n\t\t$x = new WP_Ajax_Response( array(\n\t\t\t'what' => 'user',\n\t\t\t'id' => $user_id\n\t\t) );\n\t\t$x->send();\n\t}\n\t$user_object = get_userdata( $user_id );\n\n\t$wp_list_table = _get_list_table('WP_Users_List_Table');\n\n\t$role = current( $user_object->roles );\n\n\t$x = new WP_Ajax_Response( array(\n\t\t'what' => 'user',\n\t\t'id' => $user_id,\n\t\t'data' => $wp_list_table->single_row( $user_object, '', $role ),\n\t\t'supplemental' => array(\n\t\t\t'show-link' => sprintf(\n\t\t\t\t/* translators: %s: the new user */\n\t\t\t\t__( 'User %s added' ),\n\t\t\t\t'<a href=\"#user-' . $user_id . '\">' . $user_object->user_login . '</a>'\n\t\t\t),\n\t\t\t'role' => $role,\n\t\t)\n\t) );\n\t$x->send();\n}\n\n/**\n * Ajax handler for closed post boxes.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_closed_postboxes() {\n\tcheck_ajax_referer( 'closedpostboxes', 'closedpostboxesnonce' );\n\t$closed = isset( $_POST['closed'] ) ? explode( ',', $_POST['closed']) : array();\n\t$closed = array_filter($closed);\n\n\t$hidden = isset( $_POST['hidden'] ) ? explode( ',', $_POST['hidden']) : array();\n\t$hidden = array_filter($hidden);\n\n\t$page = isset( $_POST['page'] ) ? $_POST['page'] : '';\n\n\tif ( $page != sanitize_key( $page ) )\n\t\twp_die( 0 );\n\n\tif ( ! $user = wp_get_current_user() )\n\t\twp_die( -1 );\n\n\tif ( is_array($closed) )\n\t\tupdate_user_option($user->ID, \"closedpostboxes_$page\", $closed, true);\n\n\tif ( is_array($hidden) ) {\n\t\t$hidden = array_diff( $hidden, array('submitdiv', 'linksubmitdiv', 'manage-menu', 'create-menu') ); // postboxes that are always shown\n\t\tupdate_user_option($user->ID, \"metaboxhidden_$page\", $hidden, true);\n\t}\n\n\twp_die( 1 );\n}\n\n/**\n * Ajax handler for hidden columns.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_hidden_columns() {\n\tcheck_ajax_referer( 'screen-options-nonce', 'screenoptionnonce' );\n\t$page = isset( $_POST['page'] ) ? $_POST['page'] : '';\n\n\tif ( $page != sanitize_key( $page ) )\n\t\twp_die( 0 );\n\n\tif ( ! $user = wp_get_current_user() )\n\t\twp_die( -1 );\n\n\t$hidden = ! empty( $_POST['hidden'] ) ? explode( ',', $_POST['hidden'] ) : array();\n\tupdate_user_option( $user->ID, \"manage{$page}columnshidden\", $hidden, true );\n\n\twp_die( 1 );\n}\n\n/**\n * Ajax handler for updating whether to display the welcome panel.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_update_welcome_panel() {\n\tcheck_ajax_referer( 'welcome-panel-nonce', 'welcomepanelnonce' );\n\n\tif ( ! current_user_can( 'edit_theme_options' ) )\n\t\twp_die( -1 );\n\n\tupdate_user_meta( get_current_user_id(), 'show_welcome_panel', empty( $_POST['visible'] ) ? 0 : 1 );\n\n\twp_die( 1 );\n}\n\n/**\n * Ajax handler for retrieving menu meta boxes.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_menu_get_metabox() {\n\tif ( ! current_user_can( 'edit_theme_options' ) )\n\t\twp_die( -1 );\n\n\trequire_once ABSPATH . 'wp-admin/includes/nav-menu.php';\n\n\tif ( isset( $_POST['item-type'] ) && 'post_type' == $_POST['item-type'] ) {\n\t\t$type = 'posttype';\n\t\t$callback = 'wp_nav_menu_item_post_type_meta_box';\n\t\t$items = (array) get_post_types( array( 'show_in_nav_menus' => true ), 'object' );\n\t} elseif ( isset( $_POST['item-type'] ) && 'taxonomy' == $_POST['item-type'] ) {\n\t\t$type = 'taxonomy';\n\t\t$callback = 'wp_nav_menu_item_taxonomy_meta_box';\n\t\t$items = (array) get_taxonomies( array( 'show_ui' => true ), 'object' );\n\t}\n\n\tif ( ! empty( $_POST['item-object'] ) && isset( $items[$_POST['item-object']] ) ) {\n\t\t$menus_meta_box_object = $items[ $_POST['item-object'] ];\n\n\t\t/** This filter is documented in wp-admin/includes/nav-menu.php */\n\t\t$item = apply_filters( 'nav_menu_meta_box_object', $menus_meta_box_object );\n\t\tob_start();\n\t\tcall_user_func_array($callback, array(\n\t\t\tnull,\n\t\t\tarray(\n\t\t\t\t'id' => 'add-' . $item->name,\n\t\t\t\t'title' => $item->labels->name,\n\t\t\t\t'callback' => $callback,\n\t\t\t\t'args' => $item,\n\t\t\t)\n\t\t));\n\n\t\t$markup = ob_get_clean();\n\n\t\techo wp_json_encode(array(\n\t\t\t'replace-id' => $type . '-' . $item->name,\n\t\t\t'markup' => $markup,\n\t\t));\n\t}\n\n\twp_die();\n}\n\n/**\n * Ajax handler for internal linking.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_wp_link_ajax() {\n\tcheck_ajax_referer( 'internal-linking', '_ajax_linking_nonce' );\n\n\t$args = array();\n\n\tif ( isset( $_POST['search'] ) )\n\t\t$args['s'] = wp_unslash( $_POST['search'] );\n\t$args['pagenum'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1;\n\n\trequire(ABSPATH . WPINC . '/class-wp-editor.php');\n\t$results = _WP_Editors::wp_link_query( $args );\n\n\tif ( ! isset( $results ) )\n\t\twp_die( 0 );\n\n\techo wp_json_encode( $results );\n\techo \"\\n\";\n\n\twp_die();\n}\n\n/**\n * Ajax handler for menu locations save.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_menu_locations_save() {\n\tif ( ! current_user_can( 'edit_theme_options' ) )\n\t\twp_die( -1 );\n\tcheck_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' );\n\tif ( ! isset( $_POST['menu-locations'] ) )\n\t\twp_die( 0 );\n\tset_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) );\n\twp_die( 1 );\n}\n\n/**\n * Ajax handler for saving the meta box order.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_meta_box_order() {\n\tcheck_ajax_referer( 'meta-box-order' );\n\t$order = isset( $_POST['order'] ) ? (array) $_POST['order'] : false;\n\t$page_columns = isset( $_POST['page_columns'] ) ? $_POST['page_columns'] : 'auto';\n\n\tif ( $page_columns != 'auto' )\n\t\t$page_columns = (int) $page_columns;\n\n\t$page = isset( $_POST['page'] ) ? $_POST['page'] : '';\n\n\tif ( $page != sanitize_key( $page ) )\n\t\twp_die( 0 );\n\n\tif ( ! $user = wp_get_current_user() )\n\t\twp_die( -1 );\n\n\tif ( $order )\n\t\tupdate_user_option($user->ID, \"meta-box-order_$page\", $order, true);\n\n\tif ( $page_columns )\n\t\tupdate_user_option($user->ID, \"screen_layout_$page\", $page_columns, true);\n\n\twp_die( 1 );\n}\n\n/**\n * Ajax handler for menu quick searching.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_menu_quick_search() {\n\tif ( ! current_user_can( 'edit_theme_options' ) )\n\t\twp_die( -1 );\n\n\trequire_once ABSPATH . 'wp-admin/includes/nav-menu.php';\n\n\t_wp_ajax_menu_quick_search( $_POST );\n\n\twp_die();\n}\n\n/**\n * Ajax handler to retrieve a permalink.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_get_permalink() {\n\tcheck_ajax_referer( 'getpermalink', 'getpermalinknonce' );\n\t$post_id = isset($_POST['post_id'])? intval($_POST['post_id']) : 0;\n\twp_die( get_preview_post_link( $post_id ) );\n}\n\n/**\n * Ajax handler to retrieve a sample permalink.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_sample_permalink() {\n\tcheck_ajax_referer( 'samplepermalink', 'samplepermalinknonce' );\n\t$post_id = isset($_POST['post_id'])? intval($_POST['post_id']) : 0;\n\t$title = isset($_POST['new_title'])? $_POST['new_title'] : '';\n\t$slug = isset($_POST['new_slug'])? $_POST['new_slug'] : null;\n\twp_die( get_sample_permalink_html( $post_id, $title, $slug ) );\n}\n\n/**\n * Ajax handler for Quick Edit saving a post from a list table.\n *\n * @since 3.1.0\n *\n * @global WP_List_Table $wp_list_table\n */\nfunction wp_ajax_inline_save() {\n\tglobal $wp_list_table, $mode;\n\n\tcheck_ajax_referer( 'inlineeditnonce', '_inline_edit' );\n\n\tif ( ! isset($_POST['post_ID']) || ! ( $post_ID = (int) $_POST['post_ID'] ) )\n\t\twp_die();\n\n\tif ( 'page' == $_POST['post_type'] ) {\n\t\tif ( ! current_user_can( 'edit_page', $post_ID ) )\n\t\t\twp_die( __( 'You are not allowed to edit this page.' ) );\n\t} else {\n\t\tif ( ! current_user_can( 'edit_post', $post_ID ) )\n\t\t\twp_die( __( 'You are not allowed to edit this post.' ) );\n\t}\n\n\tif ( $last = wp_check_post_lock( $post_ID ) ) {\n\t\t$last_user = get_userdata( $last );\n\t\t$last_user_name = $last_user ? $last_user->display_name : __( 'Someone' );\n\t\tprintf( $_POST['post_type'] == 'page' ? __( 'Saving is disabled: %s is currently editing this page.' ) : __( 'Saving is disabled: %s is currently editing this post.' ),\tesc_html( $last_user_name ) );\n\t\twp_die();\n\t}\n\n\t$data = &$_POST;\n\n\t$post = get_post( $post_ID, ARRAY_A );\n\n\t// Since it's coming from the database.\n\t$post = wp_slash($post);\n\n\t$data['content'] = $post['post_content'];\n\t$data['excerpt'] = $post['post_excerpt'];\n\n\t// Rename.\n\t$data['user_ID'] = get_current_user_id();\n\n\tif ( isset($data['post_parent']) )\n\t\t$data['parent_id'] = $data['post_parent'];\n\n\t// Status.\n\tif ( isset( $data['keep_private'] ) && 'private' == $data['keep_private'] ) {\n\t\t$data['visibility']  = 'private';\n\t\t$data['post_status'] = 'private';\n\t} else {\n\t\t$data['post_status'] = $data['_status'];\n\t}\n\n\tif ( empty($data['comment_status']) )\n\t\t$data['comment_status'] = 'closed';\n\tif ( empty($data['ping_status']) )\n\t\t$data['ping_status'] = 'closed';\n\n\t// Exclude terms from taxonomies that are not supposed to appear in Quick Edit.\n\tif ( ! empty( $data['tax_input'] ) ) {\n\t\tforeach ( $data['tax_input'] as $taxonomy => $terms ) {\n\t\t\t$tax_object = get_taxonomy( $taxonomy );\n\t\t\t/** This filter is documented in wp-admin/includes/class-wp-posts-list-table.php */\n\t\t\tif ( ! apply_filters( 'quick_edit_show_taxonomy', $tax_object->show_in_quick_edit, $taxonomy, $post['post_type'] ) ) {\n\t\t\t\tunset( $data['tax_input'][ $taxonomy ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Hack: wp_unique_post_slug() doesn't work for drafts, so we will fake that our post is published.\n\tif ( ! empty( $data['post_name'] ) && in_array( $post['post_status'], array( 'draft', 'pending' ) ) ) {\n\t\t$post['post_status'] = 'publish';\n\t\t$data['post_name'] = wp_unique_post_slug( $data['post_name'], $post['ID'], $post['post_status'], $post['post_type'], $post['post_parent'] );\n\t}\n\n\t// Update the post.\n\tedit_post();\n\n\t$wp_list_table = _get_list_table( 'WP_Posts_List_Table', array( 'screen' => $_POST['screen'] ) );\n\n\t$mode = $_POST['post_view'] === 'excerpt' ? 'excerpt' : 'list';\n\n\t$level = 0;\n\t$request_post = array( get_post( $_POST['post_ID'] ) );\n\t$parent = $request_post[0]->post_parent;\n\n\twhile ( $parent > 0 ) {\n\t\t$parent_post = get_post( $parent );\n\t\t$parent = $parent_post->post_parent;\n\t\t$level++;\n\t}\n\n\t$wp_list_table->display_rows( array( get_post( $_POST['post_ID'] ) ), $level );\n\n\twp_die();\n}\n\n/**\n * Ajax handler for quick edit saving for a term.\n *\n * @since 3.1.0\n *\n * @global WP_List_Table $wp_list_table\n */\nfunction wp_ajax_inline_save_tax() {\n\tglobal $wp_list_table;\n\n\tcheck_ajax_referer( 'taxinlineeditnonce', '_inline_edit' );\n\n\t$taxonomy = sanitize_key( $_POST['taxonomy'] );\n\t$tax = get_taxonomy( $taxonomy );\n\tif ( ! $tax )\n\t\twp_die( 0 );\n\n\tif ( ! current_user_can( $tax->cap->edit_terms ) )\n\t\twp_die( -1 );\n\n\t$wp_list_table = _get_list_table( 'WP_Terms_List_Table', array( 'screen' => 'edit-' . $taxonomy ) );\n\n\tif ( ! isset($_POST['tax_ID']) || ! ( $id = (int) $_POST['tax_ID'] ) )\n\t\twp_die( -1 );\n\n\t$tag = get_term( $id, $taxonomy );\n\t$_POST['description'] = $tag->description;\n\n\t$updated = wp_update_term($id, $taxonomy, $_POST);\n\tif ( $updated && !is_wp_error($updated) ) {\n\t\t$tag = get_term( $updated['term_id'], $taxonomy );\n\t\tif ( !$tag || is_wp_error( $tag ) ) {\n\t\t\tif ( is_wp_error($tag) && $tag->get_error_message() )\n\t\t\t\twp_die( $tag->get_error_message() );\n\t\t\twp_die( __( 'Item not updated.' ) );\n\t\t}\n\t} else {\n\t\tif ( is_wp_error($updated) && $updated->get_error_message() )\n\t\t\twp_die( $updated->get_error_message() );\n\t\twp_die( __( 'Item not updated.' ) );\n\t}\n\t$level = 0;\n\t$parent = $tag->parent;\n\twhile ( $parent > 0 ) {\n\t\t$parent_tag = get_term( $parent, $taxonomy );\n\t\t$parent = $parent_tag->parent;\n\t\t$level++;\n\t}\n\t$wp_list_table->single_row( $tag, $level );\n\twp_die();\n}\n\n/**\n * Ajax handler for querying posts for the Find Posts modal.\n *\n * @see window.findPosts\n *\n * @since 3.1.0\n */\nfunction wp_ajax_find_posts() {\n\tcheck_ajax_referer( 'find-posts' );\n\n\t$post_types = get_post_types( array( 'public' => true ), 'objects' );\n\tunset( $post_types['attachment'] );\n\n\t$s = wp_unslash( $_POST['ps'] );\n\t$args = array(\n\t\t'post_type' => array_keys( $post_types ),\n\t\t'post_status' => 'any',\n\t\t'posts_per_page' => 50,\n\t);\n\tif ( '' !== $s )\n\t\t$args['s'] = $s;\n\n\t$posts = get_posts( $args );\n\n\tif ( ! $posts ) {\n\t\twp_send_json_error( __( 'No items found.' ) );\n\t}\n\n\t$html = '<table class=\"widefat\"><thead><tr><th class=\"found-radio\"><br /></th><th>'.__('Title').'</th><th class=\"no-break\">'.__('Type').'</th><th class=\"no-break\">'.__('Date').'</th><th class=\"no-break\">'.__('Status').'</th></tr></thead><tbody>';\n\t$alt = '';\n\tforeach ( $posts as $post ) {\n\t\t$title = trim( $post->post_title ) ? $post->post_title : __( '(no title)' );\n\t\t$alt = ( 'alternate' == $alt ) ? '' : 'alternate';\n\n\t\tswitch ( $post->post_status ) {\n\t\t\tcase 'publish' :\n\t\t\tcase 'private' :\n\t\t\t\t$stat = __('Published');\n\t\t\t\tbreak;\n\t\t\tcase 'future' :\n\t\t\t\t$stat = __('Scheduled');\n\t\t\t\tbreak;\n\t\t\tcase 'pending' :\n\t\t\t\t$stat = __('Pending Review');\n\t\t\t\tbreak;\n\t\t\tcase 'draft' :\n\t\t\t\t$stat = __('Draft');\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( '0000-00-00 00:00:00' == $post->post_date ) {\n\t\t\t$time = '';\n\t\t} else {\n\t\t\t/* translators: date format in table columns, see http://php.net/date */\n\t\t\t$time = mysql2date(__('Y/m/d'), $post->post_date);\n\t\t}\n\n\t\t$html .= '<tr class=\"' . trim( 'found-posts ' . $alt ) . '\"><td class=\"found-radio\"><input type=\"radio\" id=\"found-'.$post->ID.'\" name=\"found_post_id\" value=\"' . esc_attr($post->ID) . '\"></td>';\n\t\t$html .= '<td><label for=\"found-'.$post->ID.'\">' . esc_html( $title ) . '</label></td><td class=\"no-break\">' . esc_html( $post_types[$post->post_type]->labels->singular_name ) . '</td><td class=\"no-break\">'.esc_html( $time ) . '</td><td class=\"no-break\">' . esc_html( $stat ). ' </td></tr>' . \"\\n\\n\";\n\t}\n\n\t$html .= '</tbody></table>';\n\n\twp_send_json_success( $html );\n}\n\n/**\n * Ajax handler for saving the widgets order.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_widgets_order() {\n\tcheck_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );\n\n\tif ( !current_user_can('edit_theme_options') )\n\t\twp_die( -1 );\n\n\tunset( $_POST['savewidgets'], $_POST['action'] );\n\n\t// Save widgets order for all sidebars.\n\tif ( is_array($_POST['sidebars']) ) {\n\t\t$sidebars = array();\n\t\tforeach ( $_POST['sidebars'] as $key => $val ) {\n\t\t\t$sb = array();\n\t\t\tif ( !empty($val) ) {\n\t\t\t\t$val = explode(',', $val);\n\t\t\t\tforeach ( $val as $k => $v ) {\n\t\t\t\t\tif ( strpos($v, 'widget-') === false )\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t$sb[$k] = substr($v, strpos($v, '_') + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\t$sidebars[$key] = $sb;\n\t\t}\n\t\twp_set_sidebars_widgets($sidebars);\n\t\twp_die( 1 );\n\t}\n\n\twp_die( -1 );\n}\n\n/**\n * Ajax handler for saving a widget.\n *\n * @since 3.1.0\n *\n * @global array $wp_registered_widgets\n * @global array $wp_registered_widget_controls\n * @global array $wp_registered_widget_updates\n */\nfunction wp_ajax_save_widget() {\n\tglobal $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;\n\n\tcheck_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );\n\n\tif ( !current_user_can('edit_theme_options') || !isset($_POST['id_base']) )\n\t\twp_die( -1 );\n\n\tunset( $_POST['savewidgets'], $_POST['action'] );\n\n\t/**\n\t * Fires early when editing the widgets displayed in sidebars.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( 'load-widgets.php' );\n\n\t/**\n\t * Fires early when editing the widgets displayed in sidebars.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( 'widgets.php' );\n\n\t/** This action is documented in wp-admin/widgets.php */\n\tdo_action( 'sidebar_admin_setup' );\n\n\t$id_base = $_POST['id_base'];\n\t$widget_id = $_POST['widget-id'];\n\t$sidebar_id = $_POST['sidebar'];\n\t$multi_number = !empty($_POST['multi_number']) ? (int) $_POST['multi_number'] : 0;\n\t$settings = isset($_POST['widget-' . $id_base]) && is_array($_POST['widget-' . $id_base]) ? $_POST['widget-' . $id_base] : false;\n\t$error = '<p>' . __('An error has occurred. Please reload the page and try again.') . '</p>';\n\n\t$sidebars = wp_get_sidebars_widgets();\n\t$sidebar = isset($sidebars[$sidebar_id]) ? $sidebars[$sidebar_id] : array();\n\n\t// Delete.\n\tif ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {\n\n\t\tif ( !isset($wp_registered_widgets[$widget_id]) )\n\t\t\twp_die( $error );\n\n\t\t$sidebar = array_diff( $sidebar, array($widget_id) );\n\t\t$_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');\n\n\t\t/** This action is documented in wp-admin/widgets.php */\n\t\tdo_action( 'delete_widget', $widget_id, $sidebar_id, $id_base );\n\n\t} elseif ( $settings && preg_match( '/__i__|%i%/', key($settings) ) ) {\n\t\tif ( !$multi_number )\n\t\t\twp_die( $error );\n\n\t\t$_POST[ 'widget-' . $id_base ] = array( $multi_number => reset( $settings ) );\n\t\t$widget_id = $id_base . '-' . $multi_number;\n\t\t$sidebar[] = $widget_id;\n\t}\n\t$_POST['widget-id'] = $sidebar;\n\n\tforeach ( (array) $wp_registered_widget_updates as $name => $control ) {\n\n\t\tif ( $name == $id_base ) {\n\t\t\tif ( !is_callable( $control['callback'] ) )\n\t\t\t\tcontinue;\n\n\t\t\tob_start();\n\t\t\t\tcall_user_func_array( $control['callback'], $control['params'] );\n\t\t\tob_end_clean();\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {\n\t\t$sidebars[$sidebar_id] = $sidebar;\n\t\twp_set_sidebars_widgets($sidebars);\n\t\techo \"deleted:$widget_id\";\n\t\twp_die();\n\t}\n\n\tif ( !empty($_POST['add_new']) )\n\t\twp_die();\n\n\tif ( $form = $wp_registered_widget_controls[$widget_id] )\n\t\tcall_user_func_array( $form['callback'], $form['params'] );\n\n\twp_die();\n}\n\n/**\n * Ajax handler for saving a widget.\n *\n * @since 3.9.0\n *\n * @global WP_Customize_Manager $wp_customize\n */\nfunction wp_ajax_update_widget() {\n\tglobal $wp_customize;\n\t$wp_customize->widgets->wp_ajax_update_widget();\n}\n\n/**\n * Ajax handler for removing inactive widgets.\n *\n * @since 4.4.0\n */\nfunction wp_ajax_delete_inactive_widgets() {\n\tcheck_ajax_referer( 'remove-inactive-widgets', 'removeinactivewidgets' );\n\n\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\twp_die( -1 );\n\t}\n\n\tunset( $_POST['removeinactivewidgets'], $_POST['action'] );\n\n\tdo_action( 'load-widgets.php' );\n\tdo_action( 'widgets.php' );\n\tdo_action( 'sidebar_admin_setup' );\n\n\t$sidebars_widgets = wp_get_sidebars_widgets();\n\n\tforeach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {\n\t\t$pieces = explode( '-', $widget_id );\n\t\t$multi_number = array_pop( $pieces );\n\t\t$id_base = implode( '-', $pieces );\n\t\t$widget = get_option( 'widget_' . $id_base );\n\t\tunset( $widget[$multi_number] );\n\t\tupdate_option( 'widget_' . $id_base, $widget );\n\t\tunset( $sidebars_widgets['wp_inactive_widgets'][$key] );\n\t}\n\n\twp_set_sidebars_widgets( $sidebars_widgets );\n\n\twp_die();\n}\n\n/**\n * Ajax handler for uploading attachments\n *\n * @since 3.3.0\n */\nfunction wp_ajax_upload_attachment() {\n\tcheck_ajax_referer( 'media-form' );\n\t/*\n\t * This function does not use wp_send_json_success() / wp_send_json_error()\n\t * as the html4 Plupload handler requires a text/html content-type for older IE.\n\t * See https://core.trac.wordpress.org/ticket/31037\n\t */\n\n\tif ( ! current_user_can( 'upload_files' ) ) {\n\t\techo wp_json_encode( array(\n\t\t\t'success' => false,\n\t\t\t'data'    => array(\n\t\t\t\t'message'  => __( 'You do not have permission to upload files.' ),\n\t\t\t\t'filename' => $_FILES['async-upload']['name'],\n\t\t\t)\n\t\t) );\n\n\t\twp_die();\n\t}\n\n\tif ( isset( $_REQUEST['post_id'] ) ) {\n\t\t$post_id = $_REQUEST['post_id'];\n\t\tif ( ! current_user_can( 'edit_post', $post_id ) ) {\n\t\t\techo wp_json_encode( array(\n\t\t\t\t'success' => false,\n\t\t\t\t'data'    => array(\n\t\t\t\t\t'message'  => __( \"You don't have permission to attach files to this post.\" ),\n\t\t\t\t\t'filename' => $_FILES['async-upload']['name'],\n\t\t\t\t)\n\t\t\t) );\n\n\t\t\twp_die();\n\t\t}\n\t} else {\n\t\t$post_id = null;\n\t}\n\n\t$post_data = isset( $_REQUEST['post_data'] ) ? $_REQUEST['post_data'] : array();\n\n\t// If the context is custom header or background, make sure the uploaded file is an image.\n\tif ( isset( $post_data['context'] ) && in_array( $post_data['context'], array( 'custom-header', 'custom-background' ) ) ) {\n\t\t$wp_filetype = wp_check_filetype_and_ext( $_FILES['async-upload']['tmp_name'], $_FILES['async-upload']['name'] );\n\t\tif ( ! wp_match_mime_types( 'image', $wp_filetype['type'] ) ) {\n\t\t\techo wp_json_encode( array(\n\t\t\t\t'success' => false,\n\t\t\t\t'data'    => array(\n\t\t\t\t\t'message'  => __( 'The uploaded file is not a valid image. Please try again.' ),\n\t\t\t\t\t'filename' => $_FILES['async-upload']['name'],\n\t\t\t\t)\n\t\t\t) );\n\n\t\t\twp_die();\n\t\t}\n\t}\n\n\t$attachment_id = media_handle_upload( 'async-upload', $post_id, $post_data );\n\n\tif ( is_wp_error( $attachment_id ) ) {\n\t\techo wp_json_encode( array(\n\t\t\t'success' => false,\n\t\t\t'data'    => array(\n\t\t\t\t'message'  => $attachment_id->get_error_message(),\n\t\t\t\t'filename' => $_FILES['async-upload']['name'],\n\t\t\t)\n\t\t) );\n\n\t\twp_die();\n\t}\n\n\tif ( isset( $post_data['context'] ) && isset( $post_data['theme'] ) ) {\n\t\tif ( 'custom-background' === $post_data['context'] )\n\t\t\tupdate_post_meta( $attachment_id, '_wp_attachment_is_custom_background', $post_data['theme'] );\n\n\t\tif ( 'custom-header' === $post_data['context'] )\n\t\t\tupdate_post_meta( $attachment_id, '_wp_attachment_is_custom_header', $post_data['theme'] );\n\t}\n\n\tif ( ! $attachment = wp_prepare_attachment_for_js( $attachment_id ) )\n\t\twp_die();\n\n\techo wp_json_encode( array(\n\t\t'success' => true,\n\t\t'data'    => $attachment,\n\t) );\n\n\twp_die();\n}\n\n/**\n * Ajax handler for image editing.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_image_editor() {\n\t$attachment_id = intval($_POST['postid']);\n\tif ( empty($attachment_id) || !current_user_can('edit_post', $attachment_id) )\n\t\twp_die( -1 );\n\n\tcheck_ajax_referer( \"image_editor-$attachment_id\" );\n\tinclude_once( ABSPATH . 'wp-admin/includes/image-edit.php' );\n\n\t$msg = false;\n\tswitch ( $_POST['do'] ) {\n\t\tcase 'save' :\n\t\t\t$msg = wp_save_image($attachment_id);\n\t\t\t$msg = wp_json_encode($msg);\n\t\t\twp_die( $msg );\n\t\t\tbreak;\n\t\tcase 'scale' :\n\t\t\t$msg = wp_save_image($attachment_id);\n\t\t\tbreak;\n\t\tcase 'restore' :\n\t\t\t$msg = wp_restore_image($attachment_id);\n\t\t\tbreak;\n\t}\n\n\twp_image_editor($attachment_id, $msg);\n\twp_die();\n}\n\n/**\n * Ajax handler for setting the featured image.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_set_post_thumbnail() {\n\t$json = ! empty( $_REQUEST['json'] ); // New-style request\n\n\t$post_ID = intval( $_POST['post_id'] );\n\tif ( ! current_user_can( 'edit_post', $post_ID ) )\n\t\twp_die( -1 );\n\n\t$thumbnail_id = intval( $_POST['thumbnail_id'] );\n\n\tif ( $json )\n\t\tcheck_ajax_referer( \"update-post_$post_ID\" );\n\telse\n\t\tcheck_ajax_referer( \"set_post_thumbnail-$post_ID\" );\n\n\tif ( $thumbnail_id == '-1' ) {\n\t\tif ( delete_post_thumbnail( $post_ID ) ) {\n\t\t\t$return = _wp_post_thumbnail_html( null, $post_ID );\n\t\t\t$json ? wp_send_json_success( $return ) : wp_die( $return );\n\t\t} else {\n\t\t\twp_die( 0 );\n\t\t}\n\t}\n\n\tif ( set_post_thumbnail( $post_ID, $thumbnail_id ) ) {\n\t\t$return = _wp_post_thumbnail_html( $thumbnail_id, $post_ID );\n\t\t$json ? wp_send_json_success( $return ) : wp_die( $return );\n\t}\n\n\twp_die( 0 );\n}\n\n/**\n * AJAX handler for setting the featured image for an attachment.\n *\n * @since 4.0.0\n *\n * @see set_post_thumbnail()\n */\nfunction wp_ajax_set_attachment_thumbnail() {\n\tif ( empty( $_POST['urls'] ) || ! is_array( $_POST['urls'] ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$thumbnail_id = (int) $_POST['thumbnail_id'];\n\tif ( empty( $thumbnail_id ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$post_ids = array();\n\t// For each URL, try to find its corresponding post ID.\n\tforeach ( $_POST['urls'] as $url ) {\n\t\t$post_id = attachment_url_to_postid( $url );\n\t\tif ( ! empty( $post_id ) ) {\n\t\t\t$post_ids[] = $post_id;\n\t\t}\n\t}\n\n\tif ( empty( $post_ids ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$success = 0;\n\t// For each found attachment, set its thumbnail.\n\tforeach ( $post_ids as $post_id ) {\n\t\tif ( ! current_user_can( 'edit_post', $post_id ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( set_post_thumbnail( $post_id, $thumbnail_id ) ) {\n\t\t\t$success++;\n\t\t}\n\t}\n\n\tif ( 0 === $success ) {\n\t\twp_send_json_error();\n\t} else {\n\t\twp_send_json_success();\n\t}\n\n\twp_send_json_error();\n}\n\n/**\n * Ajax handler for date formatting.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_date_format() {\n\twp_die( date_i18n( sanitize_option( 'date_format', wp_unslash( $_POST['date'] ) ) ) );\n}\n\n/**\n * Ajax handler for time formatting.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_time_format() {\n\twp_die( date_i18n( sanitize_option( 'time_format', wp_unslash( $_POST['date'] ) ) ) );\n}\n\n/**\n * Ajax handler for saving posts from the fullscreen editor.\n *\n * @since 3.1.0\n * @deprecated 4.3.0\n */\nfunction wp_ajax_wp_fullscreen_save_post() {\n\t$post_id = isset( $_POST['post_ID'] ) ? (int) $_POST['post_ID'] : 0;\n\n\t$post = null;\n\n\tif ( $post_id )\n\t\t$post = get_post( $post_id );\n\n\tcheck_ajax_referer('update-post_' . $post_id, '_wpnonce');\n\n\t$post_id = edit_post();\n\n\tif ( is_wp_error( $post_id ) ) {\n\t\twp_send_json_error();\n\t}\n\n\tif ( $post ) {\n\t\t$last_date = mysql2date( get_option('date_format'), $post->post_modified );\n\t\t$last_time = mysql2date( get_option('time_format'), $post->post_modified );\n\t} else {\n\t\t$last_date = date_i18n( get_option('date_format') );\n\t\t$last_time = date_i18n( get_option('time_format') );\n\t}\n\n\tif ( $last_id = get_post_meta( $post_id, '_edit_last', true ) ) {\n\t\t$last_user = get_userdata( $last_id );\n\t\t$last_edited = sprintf( __('Last edited by %1$s on %2$s at %3$s'), esc_html( $last_user->display_name ), $last_date, $last_time );\n\t} else {\n\t\t$last_edited = sprintf( __('Last edited on %1$s at %2$s'), $last_date, $last_time );\n\t}\n\n\twp_send_json_success( array( 'last_edited' => $last_edited ) );\n}\n\n/**\n * Ajax handler for removing a post lock.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_wp_remove_post_lock() {\n\tif ( empty( $_POST['post_ID'] ) || empty( $_POST['active_post_lock'] ) )\n\t\twp_die( 0 );\n\t$post_id = (int) $_POST['post_ID'];\n\tif ( ! $post = get_post( $post_id ) )\n\t\twp_die( 0 );\n\n\tcheck_ajax_referer( 'update-post_' . $post_id );\n\n\tif ( ! current_user_can( 'edit_post', $post_id ) )\n\t\twp_die( -1 );\n\n\t$active_lock = array_map( 'absint', explode( ':', $_POST['active_post_lock'] ) );\n\tif ( $active_lock[1] != get_current_user_id() )\n\t\twp_die( 0 );\n\n\t/**\n\t * Filter the post lock window duration.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param int $interval The interval in seconds the post lock duration\n\t *                      should last, plus 5 seconds. Default 150.\n\t */\n\t$new_lock = ( time() - apply_filters( 'wp_check_post_lock_window', 150 ) + 5 ) . ':' . $active_lock[1];\n\tupdate_post_meta( $post_id, '_edit_lock', $new_lock, implode( ':', $active_lock ) );\n\twp_die( 1 );\n}\n\n/**\n * Ajax handler for dismissing a WordPress pointer.\n *\n * @since 3.1.0\n */\nfunction wp_ajax_dismiss_wp_pointer() {\n\t$pointer = $_POST['pointer'];\n\tif ( $pointer != sanitize_key( $pointer ) )\n\t\twp_die( 0 );\n\n//\tcheck_ajax_referer( 'dismiss-pointer_' . $pointer );\n\n\t$dismissed = array_filter( explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) ) );\n\n\tif ( in_array( $pointer, $dismissed ) )\n\t\twp_die( 0 );\n\n\t$dismissed[] = $pointer;\n\t$dismissed = implode( ',', $dismissed );\n\n\tupdate_user_meta( get_current_user_id(), 'dismissed_wp_pointers', $dismissed );\n\twp_die( 1 );\n}\n\n/**\n * Ajax handler for getting an attachment.\n *\n * @since 3.5.0\n */\nfunction wp_ajax_get_attachment() {\n\tif ( ! isset( $_REQUEST['id'] ) )\n\t\twp_send_json_error();\n\n\tif ( ! $id = absint( $_REQUEST['id'] ) )\n\t\twp_send_json_error();\n\n\tif ( ! $post = get_post( $id ) )\n\t\twp_send_json_error();\n\n\tif ( 'attachment' != $post->post_type )\n\t\twp_send_json_error();\n\n\tif ( ! current_user_can( 'upload_files' ) )\n\t\twp_send_json_error();\n\n\tif ( ! $attachment = wp_prepare_attachment_for_js( $id ) )\n\t\twp_send_json_error();\n\n\twp_send_json_success( $attachment );\n}\n\n/**\n * Ajax handler for querying attachments.\n *\n * @since 3.5.0\n */\nfunction wp_ajax_query_attachments() {\n\tif ( ! current_user_can( 'upload_files' ) )\n\t\twp_send_json_error();\n\n\t$query = isset( $_REQUEST['query'] ) ? (array) $_REQUEST['query'] : array();\n\t$keys = array(\n\t\t's', 'order', 'orderby', 'posts_per_page', 'paged', 'post_mime_type',\n\t\t'post_parent', 'post__in', 'post__not_in', 'year', 'monthnum'\n\t);\n\tforeach ( get_taxonomies_for_attachments( 'objects' ) as $t ) {\n\t\tif ( $t->query_var && isset( $query[ $t->query_var ] ) ) {\n\t\t\t$keys[] = $t->query_var;\n\t\t}\n\t}\n\n\t$query = array_intersect_key( $query, array_flip( $keys ) );\n\t$query['post_type'] = 'attachment';\n\tif ( MEDIA_TRASH\n\t\t&& ! empty( $_REQUEST['query']['post_status'] )\n\t\t&& 'trash' === $_REQUEST['query']['post_status'] ) {\n\t\t$query['post_status'] = 'trash';\n\t} else {\n\t\t$query['post_status'] = 'inherit';\n\t}\n\n\tif ( current_user_can( get_post_type_object( 'attachment' )->cap->read_private_posts ) )\n\t\t$query['post_status'] .= ',private';\n\n\t/**\n\t * Filter the arguments passed to WP_Query during an AJAX\n\t * call for querying attachments.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @see WP_Query::parse_query()\n\t *\n\t * @param array $query An array of query variables.\n\t */\n\t$query = apply_filters( 'ajax_query_attachments_args', $query );\n\t$query = new WP_Query( $query );\n\n\t$posts = array_map( 'wp_prepare_attachment_for_js', $query->posts );\n\t$posts = array_filter( $posts );\n\n\twp_send_json_success( $posts );\n}\n\n/**\n * Ajax handler for updating attachment attributes.\n *\n * @since 3.5.0\n */\nfunction wp_ajax_save_attachment() {\n\tif ( ! isset( $_REQUEST['id'] ) || ! isset( $_REQUEST['changes'] ) )\n\t\twp_send_json_error();\n\n\tif ( ! $id = absint( $_REQUEST['id'] ) )\n\t\twp_send_json_error();\n\n\tcheck_ajax_referer( 'update-post_' . $id, 'nonce' );\n\n\tif ( ! current_user_can( 'edit_post', $id ) )\n\t\twp_send_json_error();\n\n\t$changes = $_REQUEST['changes'];\n\t$post    = get_post( $id, ARRAY_A );\n\n\tif ( 'attachment' != $post['post_type'] )\n\t\twp_send_json_error();\n\n\tif ( isset( $changes['parent'] ) )\n\t\t$post['post_parent'] = $changes['parent'];\n\n\tif ( isset( $changes['title'] ) )\n\t\t$post['post_title'] = $changes['title'];\n\n\tif ( isset( $changes['caption'] ) )\n\t\t$post['post_excerpt'] = $changes['caption'];\n\n\tif ( isset( $changes['description'] ) )\n\t\t$post['post_content'] = $changes['description'];\n\n\tif ( MEDIA_TRASH && isset( $changes['status'] ) )\n\t\t$post['post_status'] = $changes['status'];\n\n\tif ( isset( $changes['alt'] ) ) {\n\t\t$alt = wp_unslash( $changes['alt'] );\n\t\tif ( $alt != get_post_meta( $id, '_wp_attachment_image_alt', true ) ) {\n\t\t\t$alt = wp_strip_all_tags( $alt, true );\n\t\t\tupdate_post_meta( $id, '_wp_attachment_image_alt', wp_slash( $alt ) );\n\t\t}\n\t}\n\n\tif ( wp_attachment_is( 'audio', $post['ID'] ) ) {\n\t\t$changed = false;\n\t\t$id3data = wp_get_attachment_metadata( $post['ID'] );\n\t\tif ( ! is_array( $id3data ) ) {\n\t\t\t$changed = true;\n\t\t\t$id3data = array();\n\t\t}\n\t\tforeach ( wp_get_attachment_id3_keys( (object) $post, 'edit' ) as $key => $label ) {\n\t\t\tif ( isset( $changes[ $key ] ) ) {\n\t\t\t\t$changed = true;\n\t\t\t\t$id3data[ $key ] = sanitize_text_field( wp_unslash( $changes[ $key ] ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( $changed ) {\n\t\t\twp_update_attachment_metadata( $id, $id3data );\n\t\t}\n\t}\n\n\tif ( MEDIA_TRASH && isset( $changes['status'] ) && 'trash' === $changes['status'] ) {\n\t\twp_delete_post( $id );\n\t} else {\n\t\twp_update_post( $post );\n\t}\n\n\twp_send_json_success();\n}\n\n/**\n * Ajax handler for saving backwards compatible attachment attributes.\n *\n * @since 3.5.0\n */\nfunction wp_ajax_save_attachment_compat() {\n\tif ( ! isset( $_REQUEST['id'] ) )\n\t\twp_send_json_error();\n\n\tif ( ! $id = absint( $_REQUEST['id'] ) )\n\t\twp_send_json_error();\n\n\tif ( empty( $_REQUEST['attachments'] ) || empty( $_REQUEST['attachments'][ $id ] ) )\n\t\twp_send_json_error();\n\t$attachment_data = $_REQUEST['attachments'][ $id ];\n\n\tcheck_ajax_referer( 'update-post_' . $id, 'nonce' );\n\n\tif ( ! current_user_can( 'edit_post', $id ) )\n\t\twp_send_json_error();\n\n\t$post = get_post( $id, ARRAY_A );\n\n\tif ( 'attachment' != $post['post_type'] )\n\t\twp_send_json_error();\n\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$post = apply_filters( 'attachment_fields_to_save', $post, $attachment_data );\n\n\tif ( isset( $post['errors'] ) ) {\n\t\t$errors = $post['errors']; // @todo return me and display me!\n\t\tunset( $post['errors'] );\n\t}\n\n\twp_update_post( $post );\n\n\tforeach ( get_attachment_taxonomies( $post ) as $taxonomy ) {\n\t\tif ( isset( $attachment_data[ $taxonomy ] ) )\n\t\t\twp_set_object_terms( $id, array_map( 'trim', preg_split( '/,+/', $attachment_data[ $taxonomy ] ) ), $taxonomy, false );\n\t}\n\n\tif ( ! $attachment = wp_prepare_attachment_for_js( $id ) )\n\t\twp_send_json_error();\n\n\twp_send_json_success( $attachment );\n}\n\n/**\n * Ajax handler for saving the attachment order.\n *\n * @since 3.5.0\n */\nfunction wp_ajax_save_attachment_order() {\n\tif ( ! isset( $_REQUEST['post_id'] ) )\n\t\twp_send_json_error();\n\n\tif ( ! $post_id = absint( $_REQUEST['post_id'] ) )\n\t\twp_send_json_error();\n\n\tif ( empty( $_REQUEST['attachments'] ) )\n\t\twp_send_json_error();\n\n\tcheck_ajax_referer( 'update-post_' . $post_id, 'nonce' );\n\n\t$attachments = $_REQUEST['attachments'];\n\n\tif ( ! current_user_can( 'edit_post', $post_id ) )\n\t\twp_send_json_error();\n\n\tforeach ( $attachments as $attachment_id => $menu_order ) {\n\t\tif ( ! current_user_can( 'edit_post', $attachment_id ) )\n\t\t\tcontinue;\n\t\tif ( ! $attachment = get_post( $attachment_id ) )\n\t\t\tcontinue;\n\t\tif ( 'attachment' != $attachment->post_type )\n\t\t\tcontinue;\n\n\t\twp_update_post( array( 'ID' => $attachment_id, 'menu_order' => $menu_order ) );\n\t}\n\n\twp_send_json_success();\n}\n\n/**\n * Ajax handler for sending an attachment to the editor.\n *\n * Generates the HTML to send an attachment to the editor.\n * Backwards compatible with the media_send_to_editor filter\n * and the chain of filters that follow.\n *\n * @since 3.5.0\n */\nfunction wp_ajax_send_attachment_to_editor() {\n\tcheck_ajax_referer( 'media-send-to-editor', 'nonce' );\n\n\t$attachment = wp_unslash( $_POST['attachment'] );\n\n\t$id = intval( $attachment['id'] );\n\n\tif ( ! $post = get_post( $id ) )\n\t\twp_send_json_error();\n\n\tif ( 'attachment' != $post->post_type )\n\t\twp_send_json_error();\n\n\tif ( current_user_can( 'edit_post', $id ) ) {\n\t\t// If this attachment is unattached, attach it. Primarily a back compat thing.\n\t\tif ( 0 == $post->post_parent && $insert_into_post_id = intval( $_POST['post_id'] ) ) {\n\t\t\twp_update_post( array( 'ID' => $id, 'post_parent' => $insert_into_post_id ) );\n\t\t}\n\t}\n\n\t$rel = '';\n\t$url = empty( $attachment['url'] ) ? '' : $attachment['url'];\n\tif ( strpos( $url, 'attachment_id') || get_attachment_link( $id ) == $url ) {\n\t\t$rel = 'attachment wp-att-' . $id;\n\t}\n\n\tremove_filter( 'media_send_to_editor', 'image_media_send_to_editor' );\n\n\tif ( 'image' === substr( $post->post_mime_type, 0, 5 ) ) {\n\t\t$align = isset( $attachment['align'] ) ? $attachment['align'] : 'none';\n\t\t$size = isset( $attachment['image-size'] ) ? $attachment['image-size'] : 'medium';\n\t\t$alt = isset( $attachment['image_alt'] ) ? $attachment['image_alt'] : '';\n\n\t\t// No whitespace-only captions.\n\t\t$caption = isset( $attachment['post_excerpt'] ) ? $attachment['post_excerpt'] : '';\n\t\tif ( '' === trim( $caption ) ) {\n\t\t\t$caption = '';\n\t\t}\n\n\t\t$title = ''; // We no longer insert title tags into <img> tags, as they are redundant.\n\t\t$html = get_image_send_to_editor( $id, $caption, $title, $align, $url, $rel, $size, $alt );\n\t} elseif ( wp_attachment_is( 'video', $post ) || wp_attachment_is( 'audio', $post )  ) {\n\t\t$html = stripslashes_deep( $_POST['html'] );\n\t} else {\n\t\t$html = isset( $attachment['post_title'] ) ? $attachment['post_title'] : '';\n\t\tif ( ! empty( $url ) ) {\n\t\t\t$html = '<a href=\"' . esc_url( $url ) . '\"' . 'rel=\"' . esc_attr( $rel ) . '\">' . $html . '</a>';\n\t\t}\n\t}\n\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$html = apply_filters( 'media_send_to_editor', $html, $id, $attachment );\n\n\twp_send_json_success( $html );\n}\n\n/**\n * Ajax handler for sending a link to the editor.\n *\n * Generates the HTML to send a non-image embed link to the editor.\n *\n * Backwards compatible with the following filters:\n * - file_send_to_editor_url\n * - audio_send_to_editor_url\n * - video_send_to_editor_url\n *\n * @since 3.5.0\n *\n * @global WP_Post  $post\n * @global WP_Embed $wp_embed\n */\nfunction wp_ajax_send_link_to_editor() {\n\tglobal $post, $wp_embed;\n\n\tcheck_ajax_referer( 'media-send-to-editor', 'nonce' );\n\n\tif ( ! $src = wp_unslash( $_POST['src'] ) )\n\t\twp_send_json_error();\n\n\tif ( ! strpos( $src, '://' ) )\n\t\t$src = 'http://' . $src;\n\n\tif ( ! $src = esc_url_raw( $src ) )\n\t\twp_send_json_error();\n\n\tif ( ! $link_text = trim( wp_unslash( $_POST['link_text'] ) ) )\n\t\t$link_text = wp_basename( $src );\n\n\t$post = get_post( isset( $_POST['post_id'] ) ? $_POST['post_id'] : 0 );\n\n\t// Ping WordPress for an embed.\n\t$check_embed = $wp_embed->run_shortcode( '[embed]'. $src .'[/embed]' );\n\n\t// Fallback that WordPress creates when no oEmbed was found.\n\t$fallback = $wp_embed->maybe_make_link( $src );\n\n\tif ( $check_embed !== $fallback ) {\n\t\t// TinyMCE view for [embed] will parse this\n\t\t$html = '[embed]' . $src . '[/embed]';\n\t} elseif ( $link_text ) {\n\t\t$html = '<a href=\"' . esc_url( $src ) . '\">' . $link_text . '</a>';\n\t} else {\n\t\t$html = '';\n\t}\n\n\t// Figure out what filter to run:\n\t$type = 'file';\n\tif ( ( $ext = preg_replace( '/^.+?\\.([^.]+)$/', '$1', $src ) ) && ( $ext_type = wp_ext2type( $ext ) )\n\t\t&& ( 'audio' == $ext_type || 'video' == $ext_type ) )\n\t\t\t$type = $ext_type;\n\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$html = apply_filters( $type . '_send_to_editor_url', $html, $src, $link_text );\n\n\twp_send_json_success( $html );\n}\n\n/**\n * Ajax handler for the Heartbeat API.\n *\n * Runs when the user is logged in.\n *\n * @since 3.6.0\n */\nfunction wp_ajax_heartbeat() {\n\tif ( empty( $_POST['_nonce'] ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$response = $data = array();\n\t$nonce_state = wp_verify_nonce( $_POST['_nonce'], 'heartbeat-nonce' );\n\n\t// screen_id is the same as $current_screen->id and the JS global 'pagenow'.\n\tif ( ! empty( $_POST['screen_id'] ) ) {\n\t\t$screen_id = sanitize_key($_POST['screen_id']);\n\t} else {\n\t\t$screen_id = 'front';\n\t}\n\n\tif ( ! empty( $_POST['data'] ) ) {\n\t\t$data = wp_unslash( (array) $_POST['data'] );\n\t}\n\n\tif ( 1 !== $nonce_state ) {\n\t\t$response = apply_filters( 'wp_refresh_nonces', $response, $data, $screen_id );\n\n\t\tif ( false === $nonce_state ) {\n\t\t\t// User is logged in but nonces have expired.\n\t\t\t$response['nonces_expired'] = true;\n\t\t\twp_send_json( $response );\n\t\t}\n\t}\n\n\tif ( ! empty( $data ) ) {\n\t\t/**\n\t\t * Filter the Heartbeat response received.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param array|object $response  The Heartbeat response object or array.\n\t\t * @param array        $data      The $_POST data sent.\n\t\t * @param string       $screen_id The screen id.\n\t\t */\n\t\t$response = apply_filters( 'heartbeat_received', $response, $data, $screen_id );\n\t}\n\n\t/**\n\t * Filter the Heartbeat response sent.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array|object $response  The Heartbeat response object or array.\n\t * @param string       $screen_id The screen id.\n\t */\n\t$response = apply_filters( 'heartbeat_send', $response, $screen_id );\n\n\t/**\n\t * Fires when Heartbeat ticks in logged-in environments.\n\t *\n\t * Allows the transport to be easily replaced with long-polling.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array|object $response  The Heartbeat response object or array.\n\t * @param string       $screen_id The screen id.\n\t */\n\tdo_action( 'heartbeat_tick', $response, $screen_id );\n\n\t// Send the current time according to the server\n\t$response['server_time'] = time();\n\n\twp_send_json( $response );\n}\n\n/**\n * Ajax handler for getting revision diffs.\n *\n * @since 3.6.0\n */\nfunction wp_ajax_get_revision_diffs() {\n\trequire ABSPATH . 'wp-admin/includes/revision.php';\n\n\tif ( ! $post = get_post( (int) $_REQUEST['post_id'] ) )\n\t\twp_send_json_error();\n\n\tif ( ! current_user_can( 'read_post', $post->ID ) )\n\t\twp_send_json_error();\n\n\t// Really just pre-loading the cache here.\n\tif ( ! $revisions = wp_get_post_revisions( $post->ID, array( 'check_enabled' => false ) ) )\n\t\twp_send_json_error();\n\n\t$return = array();\n\t@set_time_limit( 0 );\n\n\tforeach ( $_REQUEST['compare'] as $compare_key ) {\n\t\tlist( $compare_from, $compare_to ) = explode( ':', $compare_key ); // from:to\n\n\t\t$return[] = array(\n\t\t\t'id' => $compare_key,\n\t\t\t'fields' => wp_get_revision_ui_diff( $post, $compare_from, $compare_to ),\n\t\t);\n\t}\n\twp_send_json_success( $return );\n}\n\n/**\n * Ajax handler for auto-saving the selected color scheme for\n * a user's own profile.\n *\n * @since 3.8.0\n *\n * @global array $_wp_admin_css_colors\n */\nfunction wp_ajax_save_user_color_scheme() {\n\tglobal $_wp_admin_css_colors;\n\n\tcheck_ajax_referer( 'save-color-scheme', 'nonce' );\n\n\t$color_scheme = sanitize_key( $_POST['color_scheme'] );\n\n\tif ( ! isset( $_wp_admin_css_colors[ $color_scheme ] ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$previous_color_scheme = get_user_meta( get_current_user_id(), 'admin_color', true );\n\tupdate_user_meta( get_current_user_id(), 'admin_color', $color_scheme );\n\n\twp_send_json_success( array(\n\t\t'previousScheme' => 'admin-color-' . $previous_color_scheme,\n\t\t'currentScheme'  => 'admin-color-' . $color_scheme\n\t) );\n}\n\n/**\n * Ajax handler for getting themes from themes_api().\n *\n * @since 3.9.0\n *\n * @global array $themes_allowedtags\n * @global array $theme_field_defaults\n */\nfunction wp_ajax_query_themes() {\n\tglobal $themes_allowedtags, $theme_field_defaults;\n\n\tif ( ! current_user_can( 'install_themes' ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$args = wp_parse_args( wp_unslash( $_REQUEST['request'] ), array(\n\t\t'per_page' => 20,\n\t\t'fields'   => $theme_field_defaults\n\t) );\n\n\tif ( isset( $args['browse'] ) && 'favorites' === $args['browse'] && ! isset( $args['user'] ) ) {\n\t\t$user = get_user_option( 'wporg_favorites' );\n\t\tif ( $user ) {\n\t\t\t$args['user'] = $user;\n\t\t}\n\t}\n\n\t$old_filter = isset( $args['browse'] ) ? $args['browse'] : 'search';\n\n\t/** This filter is documented in wp-admin/includes/class-wp-theme-install-list-table.php */\n\t$args = apply_filters( 'install_themes_table_api_args_' . $old_filter, $args );\n\n\t$api = themes_api( 'query_themes', $args );\n\n\tif ( is_wp_error( $api ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$update_php = network_admin_url( 'update.php?action=install-theme' );\n\tforeach ( $api->themes as &$theme ) {\n\t\t$theme->install_url = add_query_arg( array(\n\t\t\t'theme'    => $theme->slug,\n\t\t\t'_wpnonce' => wp_create_nonce( 'install-theme_' . $theme->slug )\n\t\t), $update_php );\n\n\t\t$theme->name        = wp_kses( $theme->name, $themes_allowedtags );\n\t\t$theme->author      = wp_kses( $theme->author, $themes_allowedtags );\n\t\t$theme->version     = wp_kses( $theme->version, $themes_allowedtags );\n\t\t$theme->description = wp_kses( $theme->description, $themes_allowedtags );\n\t\t$theme->stars       = wp_star_rating( array( 'rating' => $theme->rating, 'type' => 'percent', 'number' => $theme->num_ratings, 'echo' => false ) );\n\t\t$theme->num_ratings = number_format_i18n( $theme->num_ratings );\n\t\t$theme->preview_url = set_url_scheme( $theme->preview_url );\n\t}\n\n\twp_send_json_success( $api );\n}\n\n/**\n * Apply [embed] AJAX handlers to a string.\n *\n * @since 4.0.0\n *\n * @global WP_Post    $post       Global $post.\n * @global WP_Embed   $wp_embed   Embed API instance.\n * @global WP_Scripts $wp_scripts\n */\nfunction wp_ajax_parse_embed() {\n\tglobal $post, $wp_embed;\n\n\tif ( ! $post = get_post( (int) $_POST['post_ID'] ) ) {\n\t\twp_send_json_error();\n\t}\n\n\tif ( empty( $_POST['shortcode'] ) || ! current_user_can( 'edit_post', $post->ID ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$shortcode = wp_unslash( $_POST['shortcode'] );\n\n\tpreg_match( '/' . get_shortcode_regex() . '/s', $shortcode, $matches );\n\t$atts = shortcode_parse_atts( $matches[3] );\n\tif ( ! empty( $matches[5] ) ) {\n\t\t$url = $matches[5];\n\t} elseif ( ! empty( $atts['src'] ) ) {\n\t\t$url = $atts['src'];\n\t} else {\n\t\t$url = '';\n\t}\n\n\t$parsed = false;\n\tsetup_postdata( $post );\n\n\t$wp_embed->return_false_on_fail = true;\n\n\tif ( is_ssl() && 0 === strpos( $url, 'http://' ) ) {\n\t\t// Admin is ssl and the user pasted non-ssl URL.\n\t\t// Check if the provider supports ssl embeds and use that for the preview.\n\t\t$ssl_shortcode = preg_replace( '%^(\\\\[embed[^\\\\]]*\\\\])http://%i', '$1https://', $shortcode );\n\t\t$parsed = $wp_embed->run_shortcode( $ssl_shortcode );\n\n\t\tif ( ! $parsed ) {\n\t\t\t$no_ssl_support = true;\n\t\t}\n\t}\n\n\tif ( $url && ! $parsed ) {\n\t\t$parsed = $wp_embed->run_shortcode( $shortcode );\n\t}\n\n\tif ( ! $parsed ) {\n\t\twp_send_json_error( array(\n\t\t\t'type' => 'not-embeddable',\n\t\t\t'message' => sprintf( __( '%s failed to embed.' ), '<code>' . esc_html( $url ) . '</code>' ),\n\t\t) );\n\t}\n\n\tif ( has_shortcode( $parsed, 'audio' ) || has_shortcode( $parsed, 'video' ) ) {\n\t\t$styles = '';\n\t\t$mce_styles = wpview_media_sandbox_styles();\n\t\tforeach ( $mce_styles as $style ) {\n\t\t\t$styles .= sprintf( '<link rel=\"stylesheet\" href=\"%s\"/>', $style );\n\t\t}\n\n\t\t$html = do_shortcode( $parsed );\n\n\t\tglobal $wp_scripts;\n\t\tif ( ! empty( $wp_scripts ) ) {\n\t\t\t$wp_scripts->done = array();\n\t\t}\n\t\tob_start();\n\t\twp_print_scripts( 'wp-mediaelement' );\n\t\t$scripts = ob_get_clean();\n\n\t\t$parsed = $styles . $html . $scripts;\n\t}\n\n\n\tif ( ! empty( $no_ssl_support ) || ( is_ssl() && ( preg_match( '%<(iframe|script|embed) [^>]*src=\"http://%', $parsed ) ||\n\t\tpreg_match( '%<link [^>]*href=\"http://%', $parsed ) ) ) ) {\n\t\t// Admin is ssl and the embed is not. Iframes, scripts, and other \"active content\" will be blocked.\n\t\twp_send_json_error( array(\n\t\t\t'type' => 'not-ssl',\n\t\t\t'message' => __( 'This preview is unavailable in the editor.' ),\n\t\t) );\n\t}\n\n\twp_send_json_success( array(\n\t\t'body' => $parsed,\n\t\t'attr' => $wp_embed->last_attr\n\t) );\n}\n\n/**\n * @since 4.0.0\n *\n * @global WP_Post    $post\n * @global WP_Scripts $wp_scripts\n */\nfunction wp_ajax_parse_media_shortcode() {\n\tglobal $post, $wp_scripts;\n\n\tif ( empty( $_POST['shortcode'] ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$shortcode = wp_unslash( $_POST['shortcode'] );\n\n\tif ( ! empty( $_POST['post_ID'] ) ) {\n\t\t$post = get_post( (int) $_POST['post_ID'] );\n\t}\n\n\t// the embed shortcode requires a post\n\tif ( ! $post || ! current_user_can( 'edit_post', $post->ID ) ) {\n\t\tif ( 'embed' === $shortcode ) {\n\t\t\twp_send_json_error();\n\t\t}\n\t} else {\n\t\tsetup_postdata( $post );\n\t}\n\n\t$parsed = do_shortcode( $shortcode  );\n\n\tif ( empty( $parsed ) ) {\n\t\twp_send_json_error( array(\n\t\t\t'type' => 'no-items',\n\t\t\t'message' => __( 'No items found.' ),\n\t\t) );\n\t}\n\n\t$head = '';\n\t$styles = wpview_media_sandbox_styles();\n\n\tforeach ( $styles as $style ) {\n\t\t$head .= '<link type=\"text/css\" rel=\"stylesheet\" href=\"' . $style . '\">';\n\t}\n\n\tif ( ! empty( $wp_scripts ) ) {\n\t\t$wp_scripts->done = array();\n\t}\n\n\tob_start();\n\n\techo $parsed;\n\n\tif ( 'playlist' === $_REQUEST['type'] ) {\n\t\twp_underscore_playlist_templates();\n\n\t\twp_print_scripts( 'wp-playlist' );\n\t} else {\n\t\twp_print_scripts( array( 'froogaloop', 'wp-mediaelement' ) );\n\t}\n\n\twp_send_json_success( array(\n\t\t'head' => $head,\n\t\t'body' => ob_get_clean()\n\t) );\n}\n\n/**\n * AJAX handler for destroying multiple open sessions for a user.\n *\n * @since 4.1.0\n */\nfunction wp_ajax_destroy_sessions() {\n\t$user = get_userdata( (int) $_POST['user_id'] );\n\tif ( $user ) {\n\t\tif ( ! current_user_can( 'edit_user', $user->ID ) ) {\n\t\t\t$user = false;\n\t\t} elseif ( ! wp_verify_nonce( $_POST['nonce'], 'update-user_' . $user->ID ) ) {\n\t\t\t$user = false;\n\t\t}\n\t}\n\n\tif ( ! $user ) {\n\t\twp_send_json_error( array(\n\t\t\t'message' => __( 'Could not log out user sessions. Please try again.' ),\n\t\t) );\n\t}\n\n\t$sessions = WP_Session_Tokens::get_instance( $user->ID );\n\n\tif ( $user->ID === get_current_user_id() ) {\n\t\t$sessions->destroy_others( wp_get_session_token() );\n\t\t$message = __( 'You are now logged out everywhere else.' );\n\t} else {\n\t\t$sessions->destroy_all();\n\t\t/* translators: 1: User's display name. */\n\t\t$message = sprintf( __( '%s has been logged out.' ), $user->display_name );\n\t}\n\n\twp_send_json_success( array( 'message' => $message ) );\n}\n\n\n/**\n * AJAX handler for updating a plugin.\n *\n * @since 4.2.0\n *\n * @see Plugin_Upgrader\n */\nfunction wp_ajax_update_plugin() {\n\tglobal $wp_filesystem;\n\n\t$plugin = urldecode( $_POST['plugin'] );\n\n\t$status = array(\n\t\t'update'     => 'plugin',\n\t\t'plugin'     => $plugin,\n\t\t'slug'       => sanitize_key( $_POST['slug'] ),\n\t\t'oldVersion' => '',\n\t\t'newVersion' => '',\n\t);\n\n\t$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );\n\tif ( $plugin_data['Version'] ) {\n\t\t$status['oldVersion'] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );\n\t}\n\n\tif ( ! current_user_can( 'update_plugins' ) ) {\n\t\t$status['error'] = __( 'You do not have sufficient permissions to update plugins for this site.' );\n \t\twp_send_json_error( $status );\n\t}\n\n\tcheck_ajax_referer( 'updates' );\n\n\tinclude_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );\n\n\twp_update_plugins();\n\n\t$skin = new Automatic_Upgrader_Skin();\n\t$upgrader = new Plugin_Upgrader( $skin );\n\t$result = $upgrader->bulk_upgrade( array( $plugin ) );\n\n\tif ( is_array( $result ) && empty( $result[$plugin] ) && is_wp_error( $skin->result ) ) {\n\t\t$result = $skin->result;\n\t}\n\n\tif ( is_array( $result ) && !empty( $result[ $plugin ] ) ) {\n\t\t$plugin_update_data = current( $result );\n\n\t\t/*\n\t\t * If the `update_plugins` site transient is empty (e.g. when you update\n\t\t * two plugins in quick succession before the transient repopulates),\n\t\t * this may be the return.\n\t\t *\n\t\t * Preferably something can be done to ensure `update_plugins` isn't empty.\n\t\t * For now, surface some sort of error here.\n\t\t */\n\t\tif ( $plugin_update_data === true ) {\n\t\t\t$status['error'] = __( 'Plugin update failed.' );\n \t\t\twp_send_json_error( $status );\n\t\t}\n\n\t\t$plugin_data = get_plugins( '/' . $result[ $plugin ]['destination_name'] );\n\t\t$plugin_data = reset( $plugin_data );\n\n\t\tif ( $plugin_data['Version'] ) {\n\t\t\t$status['newVersion'] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );\n\t\t}\n\n\t\twp_send_json_success( $status );\n\t} else if ( is_wp_error( $result ) ) {\n\t\t$status['error'] = $result->get_error_message();\n \t\twp_send_json_error( $status );\n\n \t} else if ( is_bool( $result ) && ! $result ) {\n\t\t$status['errorCode'] = 'unable_to_connect_to_filesystem';\n\t\t$status['error'] = __( 'Unable to connect to the filesystem. Please confirm your credentials.' );\n\n\t\t// Pass through the error from WP_Filesystem if one was raised\n\t\tif ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {\n\t\t\t$status['error'] = $wp_filesystem->errors->get_error_message();\n\t\t}\n\n\t\twp_send_json_error( $status );\n\n\t} else {\n\t\t// An unhandled error occured\n\t\t$status['error'] = __( 'Plugin update failed.' );\n\t\twp_send_json_error( $status );\n\t}\n}\n\n/**\n * AJAX handler for saving a post from Press This.\n *\n * @since 4.2.0\n *\n * @global WP_Press_This $wp_press_this\n */\nfunction wp_ajax_press_this_save_post() {\n\tif ( empty( $GLOBALS['wp_press_this'] ) ) {\n\t\tinclude( ABSPATH . 'wp-admin/includes/class-wp-press-this.php' );\n\t}\n\n\t$GLOBALS['wp_press_this']->save_post();\n}\n\n/**\n * AJAX handler for creating new category from Press This.\n *\n * @since 4.2.0\n *\n * @global WP_Press_This $wp_press_this\n */\nfunction wp_ajax_press_this_add_category() {\n\tif ( empty( $GLOBALS['wp_press_this'] ) ) {\n\t\tinclude( ABSPATH . 'wp-admin/includes/class-wp-press-this.php' );\n\t}\n\n\t$GLOBALS['wp_press_this']->add_category();\n}\n\n/**\n * AJAX handler for cropping an image.\n *\n * @since 4.3.0\n *\n * @global WP_Site_Icon $wp_site_icon\n */\nfunction wp_ajax_crop_image() {\n\t$attachment_id = absint( $_POST['id'] );\n\n\tcheck_ajax_referer( 'image_editor-' . $attachment_id, 'nonce' );\n\tif ( ! current_user_can( 'customize' ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$context = str_replace( '_', '-', $_POST['context'] );\n\t$data    = array_map( 'absint', $_POST['cropDetails'] );\n\t$cropped = wp_crop_image( $attachment_id, $data['x1'], $data['y1'], $data['width'], $data['height'], $data['dst_width'], $data['dst_height'] );\n\n\tif ( ! $cropped || is_wp_error( $cropped ) ) {\n\t\twp_send_json_error( array( 'message' => __( 'Image could not be processed.' ) ) );\n\t}\n\n\tswitch ( $context ) {\n\t\tcase 'site-icon':\n\t\t\trequire_once ABSPATH . '/wp-admin/includes/class-wp-site-icon.php';\n\t\t\tglobal $wp_site_icon;\n\n\t\t\t// Skip creating a new attachment if the attachment is a Site Icon.\n\t\t\tif ( get_post_meta( $attachment_id, '_wp_attachment_context', true ) == $context ) {\n\n\t\t\t\t// Delete the temporary cropped file, we don't need it.\n\t\t\t\twp_delete_file( $cropped );\n\n\t\t\t\t// Additional sizes in wp_prepare_attachment_for_js().\n\t\t\t\tadd_filter( 'image_size_names_choose', array( $wp_site_icon, 'additional_sizes' ) );\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/** This filter is documented in wp-admin/custom-header.php */\n\t\t\t$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication.\n\t\t\t$object  = $wp_site_icon->create_attachment_object( $cropped, $attachment_id );\n\t\t\tunset( $object['ID'] );\n\n\t\t\t// Update the attachment.\n\t\t\tadd_filter( 'intermediate_image_sizes_advanced', array( $wp_site_icon, 'additional_sizes' ) );\n\t\t\t$attachment_id = $wp_site_icon->insert_attachment( $object, $cropped );\n\t\t\tremove_filter( 'intermediate_image_sizes_advanced', array( $wp_site_icon, 'additional_sizes' ) );\n\n\t\t\t// Additional sizes in wp_prepare_attachment_for_js().\n\t\t\tadd_filter( 'image_size_names_choose', array( $wp_site_icon, 'additional_sizes' ) );\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\t/**\n\t\t\t * Fires before a cropped image is saved.\n\t\t\t *\n\t\t\t * Allows to add filters to modify the way a cropped image is saved.\n\t\t\t *\n\t\t\t * @since 4.3.0\n\t\t\t *\n\t\t\t * @param string $context       The Customizer control requesting the cropped image.\n\t\t\t * @param int    $attachment_id The attachment ID of the original image.\n\t\t\t * @param string $cropped       Path to the cropped image file.\n\t\t\t */\n\t\t\tdo_action( 'wp_ajax_crop_image_pre_save', $context, $attachment_id, $cropped );\n\n\t\t\t/** This filter is documented in wp-admin/custom-header.php */\n\t\t\t$cropped = apply_filters( 'wp_create_file_in_uploads', $cropped, $attachment_id ); // For replication.\n\n\t\t\t$parent_url = wp_get_attachment_url( $attachment_id );\n\t\t\t$url        = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url );\n\n\t\t\t$size       = @getimagesize( $cropped );\n\t\t\t$image_type = ( $size ) ? $size['mime'] : 'image/jpeg';\n\n\t\t\t$object = array(\n\t\t\t\t'post_title'     => basename( $cropped ),\n\t\t\t\t'post_content'   => $url,\n\t\t\t\t'post_mime_type' => $image_type,\n\t\t\t\t'guid'           => $url,\n\t\t\t\t'context'        => $context,\n\t\t\t);\n\n\t\t\t$attachment_id = wp_insert_attachment( $object, $cropped );\n\t\t\t$metadata = wp_generate_attachment_metadata( $attachment_id, $cropped );\n\n\t\t\t/**\n\t\t\t * Filter the cropped image attachment metadata.\n\t\t\t *\n\t\t\t * @since 4.3.0\n\t\t\t *\n\t\t\t * @see wp_generate_attachment_metadata()\n\t\t\t *\n\t\t\t * @param array $metadata Attachment metadata.\n\t\t\t */\n\t\t\t$metadata = apply_filters( 'wp_ajax_cropped_attachment_metadata', $metadata );\n\t\t\twp_update_attachment_metadata( $attachment_id, $metadata );\n\n\t\t\t/**\n\t\t\t * Filter the attachment ID for a cropped image.\n\t\t\t *\n\t\t\t * @since 4.3.0\n\t\t\t *\n\t\t\t * @param int    $attachment_id The attachment ID of the cropped image.\n\t\t\t * @param string $context       The Customizer control requesting the cropped image.\n\t\t\t */\n\t\t\t$attachment_id = apply_filters( 'wp_ajax_cropped_attachment_id', $attachment_id, $context );\n\t}\n\n\twp_send_json_success( wp_prepare_attachment_for_js( $attachment_id ) );\n}\n\n/**\n * Ajax handler for generating a password.\n *\n * @since 4.4.0\n */\nfunction wp_ajax_generate_password() {\n\twp_send_json_success( wp_generate_password( 24 ) );\n}\n\n/**\n * Ajax handler for saving the user's WordPress.org username.\n *\n * @since 4.4.0\n */\nfunction wp_ajax_save_wporg_username() {\n\tif ( ! current_user_can( 'install_themes' ) && ! current_user_can( 'install_plugins' ) ) {\n\t\twp_send_json_error();\n\t}\n\n\t$username = isset( $_REQUEST['username'] ) ? wp_unslash( $_REQUEST['username'] ) : false;\n\n\tif ( ! $username ) {\n\t\twp_send_json_error();\n\t}\n\n\twp_send_json_success( update_user_meta( get_current_user_id(), 'wporg_favorites', $username ) );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/bookmark.php",
    "content": "<?php\n/**\n * WordPress Bookmark Administration API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Add a link to using values provided in $_POST.\n *\n * @since 2.0.0\n *\n * @return int|WP_Error Value 0 or WP_Error on failure. The link ID on success.\n */\nfunction add_link() {\n\treturn edit_link();\n}\n\n/**\n * Updates or inserts a link using values provided in $_POST.\n *\n * @since 2.0.0\n *\n * @param int $link_id Optional. ID of the link to edit. Default 0.\n * @return int|WP_Error Value 0 or WP_Error on failure. The link ID on success.\n */\nfunction edit_link( $link_id = 0 ) {\n\tif ( ! current_user_can( 'manage_links' ) ) {\n\t\twp_die(\n\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t'<p>' . __( 'You do not have sufficient permissions to edit the links for this site.' ) . '</p>',\n\t\t\t403\n\t\t);\n\t}\n\n\t$_POST['link_url'] = esc_html( $_POST['link_url'] );\n\t$_POST['link_url'] = esc_url($_POST['link_url']);\n\t$_POST['link_name'] = esc_html( $_POST['link_name'] );\n\t$_POST['link_image'] = esc_html( $_POST['link_image'] );\n\t$_POST['link_rss'] = esc_url($_POST['link_rss']);\n\tif ( !isset($_POST['link_visible']) || 'N' != $_POST['link_visible'] )\n\t\t$_POST['link_visible'] = 'Y';\n\n\tif ( !empty( $link_id ) ) {\n\t\t$_POST['link_id'] = $link_id;\n\t\treturn wp_update_link( $_POST );\n\t} else {\n\t\treturn wp_insert_link( $_POST );\n\t}\n}\n\n/**\n * Retrieves the default link for editing.\n *\n * @since 2.0.0\n *\n * @return stdClass Default link object.\n */\nfunction get_default_link_to_edit() {\n\t$link = new stdClass;\n\tif ( isset( $_GET['linkurl'] ) )\n\t\t$link->link_url = esc_url( wp_unslash( $_GET['linkurl'] ) );\n\telse\n\t\t$link->link_url = '';\n\n\tif ( isset( $_GET['name'] ) )\n\t\t$link->link_name = esc_attr( wp_unslash( $_GET['name'] ) );\n\telse\n\t\t$link->link_name = '';\n\n\t$link->link_visible = 'Y';\n\n\treturn $link;\n}\n\n/**\n * Deletes a specified link from the database.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $link_id ID of the link to delete\n * @return true Always true.\n */\nfunction wp_delete_link( $link_id ) {\n\tglobal $wpdb;\n\t/**\n\t * Fires before a link is deleted.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param int $link_id ID of the link to delete.\n\t */\n\tdo_action( 'delete_link', $link_id );\n\n\twp_delete_object_term_relationships( $link_id, 'link_category' );\n\n\t$wpdb->delete( $wpdb->links, array( 'link_id' => $link_id ) );\n\n\t/**\n\t * Fires after a link has been deleted.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param int $link_id ID of the deleted link.\n\t */\n\tdo_action( 'deleted_link', $link_id );\n\n\tclean_bookmark_cache( $link_id );\n\n\treturn true;\n}\n\n/**\n * Retrieves the link categories associated with the link specified.\n *\n * @since 2.1.0\n *\n * @param int $link_id Link ID to look up\n * @return array The requested link's categories\n */\nfunction wp_get_link_cats( $link_id = 0 ) {\n\t$cats = wp_get_object_terms( $link_id, 'link_category', array('fields' => 'ids') );\n\treturn array_unique( $cats );\n}\n\n/**\n * Retrieves link data based on its ID.\n *\n * @since 2.0.0\n *\n * @param int $link_id ID of link to retrieve.\n * @return object Link object for editing.\n */\nfunction get_link_to_edit( $link_id ) {\n\treturn get_bookmark( $link_id, OBJECT, 'edit' );\n}\n\n/**\n * Inserts/updates links into/in the database.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $linkdata Elements that make up the link to insert.\n * @param bool  $wp_error Optional. Whether to return a WP_Error object on failure. Default false.\n * @return int|WP_Error Value 0 or WP_Error on failure. The link ID on success.\n */\nfunction wp_insert_link( $linkdata, $wp_error = false ) {\n\tglobal $wpdb;\n\n\t$defaults = array( 'link_id' => 0, 'link_name' => '', 'link_url' => '', 'link_rating' => 0 );\n\n\t$args = wp_parse_args( $linkdata, $defaults );\n\t$r = wp_unslash( sanitize_bookmark( $args, 'db' ) );\n\n\t$link_id   = $r['link_id'];\n\t$link_name = $r['link_name'];\n\t$link_url  = $r['link_url'];\n\n\t$update = false;\n\tif ( ! empty( $link_id ) ) {\n\t\t$update = true;\n\t}\n\n\tif ( trim( $link_name ) == '' ) {\n\t\tif ( trim( $link_url ) != '' ) {\n\t\t\t$link_name = $link_url;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tif ( trim( $link_url ) == '' ) {\n\t\treturn 0;\n\t}\n\n\t$link_rating      = ( ! empty( $r['link_rating'] ) ) ? $r['link_rating'] : 0;\n\t$link_image       = ( ! empty( $r['link_image'] ) ) ? $r['link_image'] : '';\n\t$link_target      = ( ! empty( $r['link_target'] ) ) ? $r['link_target'] : '';\n\t$link_visible     = ( ! empty( $r['link_visible'] ) ) ? $r['link_visible'] : 'Y';\n\t$link_owner       = ( ! empty( $r['link_owner'] ) ) ? $r['link_owner'] : get_current_user_id();\n\t$link_notes       = ( ! empty( $r['link_notes'] ) ) ? $r['link_notes'] : '';\n\t$link_description = ( ! empty( $r['link_description'] ) ) ? $r['link_description'] : '';\n\t$link_rss         = ( ! empty( $r['link_rss'] ) ) ? $r['link_rss'] : '';\n\t$link_rel         = ( ! empty( $r['link_rel'] ) ) ? $r['link_rel'] : '';\n\t$link_category    = ( ! empty( $r['link_category'] ) ) ? $r['link_category'] : array();\n\n\t// Make sure we set a valid category.\n\tif ( ! is_array( $link_category ) || 0 == count( $link_category ) ) {\n\t\t$link_category = array( get_option( 'default_link_category' ) );\n\t}\n\n\tif ( $update ) {\n\t\tif ( false === $wpdb->update( $wpdb->links, compact( 'link_url', 'link_name', 'link_image', 'link_target', 'link_description', 'link_visible', 'link_rating', 'link_rel', 'link_notes', 'link_rss' ), compact( 'link_id' ) ) ) {\n\t\t\tif ( $wp_error ) {\n\t\t\t\treturn new WP_Error( 'db_update_error', __( 'Could not update link in the database' ), $wpdb->last_error );\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ( false === $wpdb->insert( $wpdb->links, compact( 'link_url', 'link_name', 'link_image', 'link_target', 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_rel', 'link_notes', 'link_rss' ) ) ) {\n\t\t\tif ( $wp_error ) {\n\t\t\t\treturn new WP_Error( 'db_insert_error', __( 'Could not insert link into the database' ), $wpdb->last_error );\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\t$link_id = (int) $wpdb->insert_id;\n\t}\n\n\twp_set_link_cats( $link_id, $link_category );\n\n\tif ( $update ) {\n\t\t/**\n\t\t * Fires after a link was updated in the database.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param int $link_id ID of the link that was updated.\n\t\t */\n\t\tdo_action( 'edit_link', $link_id );\n\t} else {\n\t\t/**\n\t\t * Fires after a link was added to the database.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param int $link_id ID of the link that was added.\n\t\t */\n\t\tdo_action( 'add_link', $link_id );\n\t}\n\tclean_bookmark_cache( $link_id );\n\n\treturn $link_id;\n}\n\n/**\n * Update link with the specified link categories.\n *\n * @since 2.1.0\n *\n * @param int   $link_id         ID of the link to update.\n * @param array $link_categories Array of link categories to add the link to.\n */\nfunction wp_set_link_cats( $link_id = 0, $link_categories = array() ) {\n\t// If $link_categories isn't already an array, make it one:\n\tif ( !is_array( $link_categories ) || 0 == count( $link_categories ) )\n\t\t$link_categories = array( get_option( 'default_link_category' ) );\n\n\t$link_categories = array_map( 'intval', $link_categories );\n\t$link_categories = array_unique( $link_categories );\n\n\twp_set_object_terms( $link_id, $link_categories, 'link_category' );\n\n\tclean_bookmark_cache( $link_id );\n}\n\n/**\n * Updates a link in the database.\n *\n * @since 2.0.0\n *\n * @param array $linkdata Link data to update.\n * @return int|WP_Error Value 0 or WP_Error on failure. The updated link ID on success.\n */\nfunction wp_update_link( $linkdata ) {\n\t$link_id = (int) $linkdata['link_id'];\n\n\t$link = get_bookmark( $link_id, ARRAY_A );\n\n\t// Escape data pulled from DB.\n\t$link = wp_slash( $link );\n\n\t// Passed link category list overwrites existing category list if not empty.\n\tif ( isset( $linkdata['link_category'] ) && is_array( $linkdata['link_category'] )\n\t\t\t && 0 != count( $linkdata['link_category'] ) )\n\t\t$link_cats = $linkdata['link_category'];\n\telse\n\t\t$link_cats = $link['link_category'];\n\n\t// Merge old and new fields with new fields overwriting old ones.\n\t$linkdata = array_merge( $link, $linkdata );\n\t$linkdata['link_category'] = $link_cats;\n\n\treturn wp_insert_link( $linkdata );\n}\n\n/**\n * Outputs the 'disabled' message for the WordPress Link Manager.\n *\n * @since 3.5.0\n * @access private\n *\n * @global string $pagenow\n */\nfunction wp_link_manager_disabled_message() {\n\tglobal $pagenow;\n\tif ( 'link-manager.php' != $pagenow && 'link-add.php' != $pagenow && 'link.php' != $pagenow )\n\t\treturn;\n\n\tadd_filter( 'pre_option_link_manager_enabled', '__return_true', 100 );\n\t$really_can_manage_links = current_user_can( 'manage_links' );\n\tremove_filter( 'pre_option_link_manager_enabled', '__return_true', 100 );\n\n\tif ( $really_can_manage_links && current_user_can( 'install_plugins' ) ) {\n\t\t$link = network_admin_url( 'plugin-install.php?tab=search&amp;s=Link+Manager' );\n\t\twp_die( sprintf( __( 'If you are looking to use the link manager, please install the <a href=\"%s\">Link Manager</a> plugin.' ), $link ) );\n\t}\n\n\twp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-ftp-pure.php",
    "content": "<?php\n/**\n * PemFTP - A Ftp implementation in pure PHP\n *\n * @package PemFTP\n * @since 2.5.0\n *\n * @version 1.0\n * @copyright Alexey Dotsenko\n * @author Alexey Dotsenko\n * @link http://www.phpclasses.org/browse/package/1743.html Site\n * @license LGPL http://www.opensource.org/licenses/lgpl-license.html\n */\n\n/**\n * FTP implementation using fsockopen to connect.\n *\n * @package PemFTP\n * @subpackage Pure\n * @since 2.5.0\n *\n * @version 1.0\n * @copyright Alexey Dotsenko\n * @author Alexey Dotsenko\n * @link http://www.phpclasses.org/browse/package/1743.html Site\n * @license LGPL http://www.opensource.org/licenses/lgpl-license.html\n */\nclass ftp extends ftp_base {\n\n\tfunction __construct($verb=FALSE, $le=FALSE) {\n\t\tparent::__construct(false, $verb, $le);\n\t}\n\n\tfunction ftp($verb=FALSE, $le=FALSE) {\n\t\t$this->__construct($verb, $le);\n\t}\n\n// <!-- --------------------------------------------------------------------------------------- -->\n// <!--       Private functions                                                                 -->\n// <!-- --------------------------------------------------------------------------------------- -->\n\n\tfunction _settimeout($sock) {\n\t\tif(!@stream_set_timeout($sock, $this->_timeout)) {\n\t\t\t$this->PushError('_settimeout','socket set send timeout');\n\t\t\t$this->_quit();\n\t\t\treturn FALSE;\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\tfunction _connect($host, $port) {\n\t\t$this->SendMSG(\"Creating socket\");\n\t\t$sock = @fsockopen($host, $port, $errno, $errstr, $this->_timeout);\n\t\tif (!$sock) {\n\t\t\t$this->PushError('_connect','socket connect failed', $errstr.\" (\".$errno.\")\");\n\t\t\treturn FALSE;\n\t\t}\n\t\t$this->_connected=true;\n\t\treturn $sock;\n\t}\n\n\tfunction _readmsg($fnction=\"_readmsg\"){\n\t\tif(!$this->_connected) {\n\t\t\t$this->PushError($fnction, 'Connect first');\n\t\t\treturn FALSE;\n\t\t}\n\t\t$result=true;\n\t\t$this->_message=\"\";\n\t\t$this->_code=0;\n\t\t$go=true;\n\t\tdo {\n\t\t\t$tmp=@fgets($this->_ftp_control_sock, 512);\n\t\t\tif($tmp===false) {\n\t\t\t\t$go=$result=false;\n\t\t\t\t$this->PushError($fnction,'Read failed');\n\t\t\t} else {\n\t\t\t\t$this->_message.=$tmp;\n\t\t\t\tif(preg_match(\"/^([0-9]{3})(-(.*[\".CRLF.\"]{1,2})+\\\\1)? [^\".CRLF.\"]+[\".CRLF.\"]{1,2}$/\", $this->_message, $regs)) $go=false;\n\t\t\t}\n\t\t} while($go);\n\t\tif($this->LocalEcho) echo \"GET < \".rtrim($this->_message, CRLF).CRLF;\n\t\t$this->_code=(int)$regs[1];\n\t\treturn $result;\n\t}\n\n\tfunction _exec($cmd, $fnction=\"_exec\") {\n\t\tif(!$this->_ready) {\n\t\t\t$this->PushError($fnction,'Connect first');\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->LocalEcho) echo \"PUT > \",$cmd,CRLF;\n\t\t$status=@fputs($this->_ftp_control_sock, $cmd.CRLF);\n\t\tif($status===false) {\n\t\t\t$this->PushError($fnction,'socket write failed');\n\t\t\treturn FALSE;\n\t\t}\n\t\t$this->_lastaction=time();\n\t\tif(!$this->_readmsg($fnction)) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction _data_prepare($mode=FTP_ASCII) {\n\t\tif(!$this->_settype($mode)) return FALSE;\n\t\tif($this->_passive) {\n\t\t\tif(!$this->_exec(\"PASV\", \"pasv\")) {\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tif(!$this->_checkCode()) {\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\t$ip_port = explode(\",\", preg_replace(\"/^.+ \\\\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\\\)?.*$/s\", \"\\\\1\", $this->_message));\n\t\t\t$this->_datahost=$ip_port[0].\".\".$ip_port[1].\".\".$ip_port[2].\".\".$ip_port[3];\n            $this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]);\n\t\t\t$this->SendMSG(\"Connecting to \".$this->_datahost.\":\".$this->_dataport);\n\t\t\t$this->_ftp_data_sock=@fsockopen($this->_datahost, $this->_dataport, $errno, $errstr, $this->_timeout);\n\t\t\tif(!$this->_ftp_data_sock) {\n\t\t\t\t$this->PushError(\"_data_prepare\",\"fsockopen fails\", $errstr.\" (\".$errno.\")\");\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telse $this->_ftp_data_sock;\n\t\t} else {\n\t\t\t$this->SendMSG(\"Only passive connections available!\");\n\t\t\treturn FALSE;\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\tfunction _data_read($mode=FTP_ASCII, $fp=NULL) {\n\t\tif(is_resource($fp)) $out=0;\n\t\telse $out=\"\";\n\t\tif(!$this->_passive) {\n\t\t\t$this->SendMSG(\"Only passive connections available!\");\n\t\t\treturn FALSE;\n\t\t}\n\t\twhile (!feof($this->_ftp_data_sock)) {\n\t\t\t$block=fread($this->_ftp_data_sock, $this->_ftp_buff_size);\n\t\t\tif($mode!=FTP_BINARY) $block=preg_replace(\"/\\r\\n|\\r|\\n/\", $this->_eol_code[$this->OS_local], $block);\n\t\t\tif(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block));\n\t\t\telse $out.=$block;\n\t\t}\n\t\treturn $out;\n\t}\n\n\tfunction _data_write($mode=FTP_ASCII, $fp=NULL) {\n\t\tif(is_resource($fp)) $out=0;\n\t\telse $out=\"\";\n\t\tif(!$this->_passive) {\n\t\t\t$this->SendMSG(\"Only passive connections available!\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(is_resource($fp)) {\n\t\t\twhile(!feof($fp)) {\n\t\t\t\t$block=fread($fp, $this->_ftp_buff_size);\n\t\t\t\tif(!$this->_data_write_block($mode, $block)) return false;\n\t\t\t}\n\t\t} elseif(!$this->_data_write_block($mode, $fp)) return false;\n\t\treturn TRUE;\n\t}\n\n\tfunction _data_write_block($mode, $block) {\n\t\tif($mode!=FTP_BINARY) $block=preg_replace(\"/\\r\\n|\\r|\\n/\", $this->_eol_code[$this->OS_remote], $block);\n\t\tdo {\n\t\t\tif(($t=@fwrite($this->_ftp_data_sock, $block))===FALSE) {\n\t\t\t\t$this->PushError(\"_data_write\",\"Can't write to socket\");\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\t$block=substr($block, $t);\n\t\t} while(!empty($block));\n\t\treturn true;\n\t}\n\n\tfunction _data_close() {\n\t\t@fclose($this->_ftp_data_sock);\n\t\t$this->SendMSG(\"Disconnected data from remote host\");\n\t\treturn TRUE;\n\t}\n\n\tfunction _quit($force=FALSE) {\n\t\tif($this->_connected or $force) {\n\t\t\t@fclose($this->_ftp_control_sock);\n\t\t\t$this->_connected=false;\n\t\t\t$this->SendMSG(\"Socket closed\");\n\t\t}\n\t}\n}\n\n?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-ftp-sockets.php",
    "content": "<?php\n/**\n * PemFTP - A Ftp implementation in pure PHP\n *\n * @package PemFTP\n * @since 2.5.0\n *\n * @version 1.0\n * @copyright Alexey Dotsenko\n * @author Alexey Dotsenko\n * @link http://www.phpclasses.org/browse/package/1743.html Site\n * @license LGPL http://www.opensource.org/licenses/lgpl-license.html\n */\n\n/**\n * Socket Based FTP implementation\n *\n * @package PemFTP\n * @subpackage Socket\n * @since 2.5.0\n *\n * @version 1.0\n * @copyright Alexey Dotsenko\n * @author Alexey Dotsenko\n * @link http://www.phpclasses.org/browse/package/1743.html Site\n * @license LGPL http://www.opensource.org/licenses/lgpl-license.html\n */\nclass ftp extends ftp_base {\n\n\tfunction __construct($verb=FALSE, $le=FALSE) {\n\t\tparent::__construct(true, $verb, $le);\n\t}\n\n\tfunction ftp($verb=FALSE, $le=FALSE) {\n\t\t$this->__construct($verb, $le);\n\t}\n\n// <!-- --------------------------------------------------------------------------------------- -->\n// <!--       Private functions                                                                 -->\n// <!-- --------------------------------------------------------------------------------------- -->\n\n\tfunction _settimeout($sock) {\n\t\tif(!@socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array(\"sec\"=>$this->_timeout, \"usec\"=>0))) {\n\t\t\t$this->PushError('_connect','socket set receive timeout',socket_strerror(socket_last_error($sock)));\n\t\t\t@socket_close($sock);\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!@socket_set_option($sock, SOL_SOCKET , SO_SNDTIMEO, array(\"sec\"=>$this->_timeout, \"usec\"=>0))) {\n\t\t\t$this->PushError('_connect','socket set send timeout',socket_strerror(socket_last_error($sock)));\n\t\t\t@socket_close($sock);\n\t\t\treturn FALSE;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction _connect($host, $port) {\n\t\t$this->SendMSG(\"Creating socket\");\n\t\tif(!($sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {\n\t\t\t$this->PushError('_connect','socket create failed',socket_strerror(socket_last_error($sock)));\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_settimeout($sock)) return FALSE;\n\t\t$this->SendMSG(\"Connecting to \\\"\".$host.\":\".$port.\"\\\"\");\n\t\tif (!($res = @socket_connect($sock, $host, $port))) {\n\t\t\t$this->PushError('_connect','socket connect failed',socket_strerror(socket_last_error($sock)));\n\t\t\t@socket_close($sock);\n\t\t\treturn FALSE;\n\t\t}\n\t\t$this->_connected=true;\n\t\treturn $sock;\n\t}\n\n\tfunction _readmsg($fnction=\"_readmsg\"){\n\t\tif(!$this->_connected) {\n\t\t\t$this->PushError($fnction,'Connect first');\n\t\t\treturn FALSE;\n\t\t}\n\t\t$result=true;\n\t\t$this->_message=\"\";\n\t\t$this->_code=0;\n\t\t$go=true;\n\t\tdo {\n\t\t\t$tmp=@socket_read($this->_ftp_control_sock, 4096, PHP_BINARY_READ);\n\t\t\tif($tmp===false) {\n\t\t\t\t$go=$result=false;\n\t\t\t\t$this->PushError($fnction,'Read failed', socket_strerror(socket_last_error($this->_ftp_control_sock)));\n\t\t\t} else {\n\t\t\t\t$this->_message.=$tmp;\n\t\t\t\t$go = !preg_match(\"/^([0-9]{3})(-.+\\\\1)? [^\".CRLF.\"]+\".CRLF.\"$/Us\", $this->_message, $regs);\n\t\t\t}\n\t\t} while($go);\n\t\tif($this->LocalEcho) echo \"GET < \".rtrim($this->_message, CRLF).CRLF;\n\t\t$this->_code=(int)$regs[1];\n\t\treturn $result;\n\t}\n\n\tfunction _exec($cmd, $fnction=\"_exec\") {\n\t\tif(!$this->_ready) {\n\t\t\t$this->PushError($fnction,'Connect first');\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->LocalEcho) echo \"PUT > \",$cmd,CRLF;\n\t\t$status=@socket_write($this->_ftp_control_sock, $cmd.CRLF);\n\t\tif($status===false) {\n\t\t\t$this->PushError($fnction,'socket write failed', socket_strerror(socket_last_error($this->stream)));\n\t\t\treturn FALSE;\n\t\t}\n\t\t$this->_lastaction=time();\n\t\tif(!$this->_readmsg($fnction)) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction _data_prepare($mode=FTP_ASCII) {\n\t\tif(!$this->_settype($mode)) return FALSE;\n\t\t$this->SendMSG(\"Creating data socket\");\n\t\t$this->_ftp_data_sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);\n\t\tif ($this->_ftp_data_sock < 0) {\n\t\t\t$this->PushError('_data_prepare','socket create failed',socket_strerror(socket_last_error($this->_ftp_data_sock)));\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_settimeout($this->_ftp_data_sock)) {\n\t\t\t$this->_data_close();\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->_passive) {\n\t\t\tif(!$this->_exec(\"PASV\", \"pasv\")) {\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tif(!$this->_checkCode()) {\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\t$ip_port = explode(\",\", preg_replace(\"/^.+ \\\\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\\\)?.*$/s\", \"\\\\1\", $this->_message));\n\t\t\t$this->_datahost=$ip_port[0].\".\".$ip_port[1].\".\".$ip_port[2].\".\".$ip_port[3];\n\t\t\t$this->_dataport=(((int)$ip_port[4])<<8) + ((int)$ip_port[5]);\n\t\t\t$this->SendMSG(\"Connecting to \".$this->_datahost.\":\".$this->_dataport);\n\t\t\tif(!@socket_connect($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) {\n\t\t\t\t$this->PushError(\"_data_prepare\",\"socket_connect\", socket_strerror(socket_last_error($this->_ftp_data_sock)));\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\telse $this->_ftp_temp_sock=$this->_ftp_data_sock;\n\t\t} else {\n\t\t\tif(!@socket_getsockname($this->_ftp_control_sock, $addr, $port)) {\n\t\t\t\t$this->PushError(\"_data_prepare\",\"can't get control socket information\", socket_strerror(socket_last_error($this->_ftp_control_sock)));\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tif(!@socket_bind($this->_ftp_data_sock,$addr)){\n\t\t\t\t$this->PushError(\"_data_prepare\",\"can't bind data socket\", socket_strerror(socket_last_error($this->_ftp_data_sock)));\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tif(!@socket_listen($this->_ftp_data_sock)) {\n\t\t\t\t$this->PushError(\"_data_prepare\",\"can't listen data socket\", socket_strerror(socket_last_error($this->_ftp_data_sock)));\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tif(!@socket_getsockname($this->_ftp_data_sock, $this->_datahost, $this->_dataport)) {\n\t\t\t\t$this->PushError(\"_data_prepare\",\"can't get data socket information\", socket_strerror(socket_last_error($this->_ftp_data_sock)));\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tif(!$this->_exec('PORT '.str_replace('.',',',$this->_datahost.'.'.($this->_dataport>>8).'.'.($this->_dataport&0x00FF)), \"_port\")) {\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\tif(!$this->_checkCode()) {\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\tfunction _data_read($mode=FTP_ASCII, $fp=NULL) {\n\t\t$NewLine=$this->_eol_code[$this->OS_local];\n\t\tif(is_resource($fp)) $out=0;\n\t\telse $out=\"\";\n\t\tif(!$this->_passive) {\n\t\t\t$this->SendMSG(\"Connecting to \".$this->_datahost.\":\".$this->_dataport);\n\t\t\t$this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock);\n\t\t\tif($this->_ftp_temp_sock===FALSE) {\n\t\t\t\t$this->PushError(\"_data_read\",\"socket_accept\", socket_strerror(socket_last_error($this->_ftp_temp_sock)));\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\n\t\twhile(($block=@socket_read($this->_ftp_temp_sock, $this->_ftp_buff_size, PHP_BINARY_READ))!==false) {\n\t\t\tif($block===\"\") break;\n\t\t\tif($mode!=FTP_BINARY) $block=preg_replace(\"/\\r\\n|\\r|\\n/\", $this->_eol_code[$this->OS_local], $block);\n\t\t\tif(is_resource($fp)) $out+=fwrite($fp, $block, strlen($block));\n\t\t\telse $out.=$block;\n\t\t}\n\t\treturn $out;\n\t}\n\n\tfunction _data_write($mode=FTP_ASCII, $fp=NULL) {\n\t\t$NewLine=$this->_eol_code[$this->OS_local];\n\t\tif(is_resource($fp)) $out=0;\n\t\telse $out=\"\";\n\t\tif(!$this->_passive) {\n\t\t\t$this->SendMSG(\"Connecting to \".$this->_datahost.\":\".$this->_dataport);\n\t\t\t$this->_ftp_temp_sock=socket_accept($this->_ftp_data_sock);\n\t\t\tif($this->_ftp_temp_sock===FALSE) {\n\t\t\t\t$this->PushError(\"_data_write\",\"socket_accept\", socket_strerror(socket_last_error($this->_ftp_temp_sock)));\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(is_resource($fp)) {\n\t\t\twhile(!feof($fp)) {\n\t\t\t\t$block=fread($fp, $this->_ftp_buff_size);\n\t\t\t\tif(!$this->_data_write_block($mode, $block)) return false;\n\t\t\t}\n\t\t} elseif(!$this->_data_write_block($mode, $fp)) return false;\n\t\treturn true;\n\t}\n\n\tfunction _data_write_block($mode, $block) {\n\t\tif($mode!=FTP_BINARY) $block=preg_replace(\"/\\r\\n|\\r|\\n/\", $this->_eol_code[$this->OS_remote], $block);\n\t\tdo {\n\t\t\tif(($t=@socket_write($this->_ftp_temp_sock, $block))===FALSE) {\n\t\t\t\t$this->PushError(\"_data_write\",\"socket_write\", socket_strerror(socket_last_error($this->_ftp_temp_sock)));\n\t\t\t\t$this->_data_close();\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t\t$block=substr($block, $t);\n\t\t} while(!empty($block));\n\t\treturn true;\n\t}\n\n\tfunction _data_close() {\n\t\t@socket_close($this->_ftp_temp_sock);\n\t\t@socket_close($this->_ftp_data_sock);\n\t\t$this->SendMSG(\"Disconnected data from remote host\");\n\t\treturn TRUE;\n\t}\n\n\tfunction _quit() {\n\t\tif($this->_connected) {\n\t\t\t@socket_close($this->_ftp_control_sock);\n\t\t\t$this->_connected=false;\n\t\t\t$this->SendMSG(\"Socket closed\");\n\t\t}\n\t}\n}\n?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-ftp.php",
    "content": "<?php\n/**\n * PemFTP - A Ftp implementation in pure PHP\n *\n * @package PemFTP\n * @since 2.5\n *\n * @version 1.0\n * @copyright Alexey Dotsenko\n * @author Alexey Dotsenko\n * @link http://www.phpclasses.org/browse/package/1743.html Site\n * @license LGPL http://www.opensource.org/licenses/lgpl-license.html\n */\n\n/**\n * Defines the newline characters, if not defined already.\n *\n * This can be redefined.\n *\n * @since 2.5\n * @var string\n */\nif(!defined('CRLF')) define('CRLF',\"\\r\\n\");\n\n/**\n * Sets whatever to autodetect ASCII mode.\n *\n * This can be redefined.\n *\n * @since 2.5\n * @var int\n */\nif(!defined(\"FTP_AUTOASCII\")) define(\"FTP_AUTOASCII\", -1);\n\n/**\n *\n * This can be redefined.\n * @since 2.5\n * @var int\n */\nif(!defined(\"FTP_BINARY\")) define(\"FTP_BINARY\", 1);\n\n/**\n *\n * This can be redefined.\n * @since 2.5\n * @var int\n */\nif(!defined(\"FTP_ASCII\")) define(\"FTP_ASCII\", 0);\n\n/**\n * Whether to force FTP.\n *\n * This can be redefined.\n *\n * @since 2.5\n * @var bool\n */\nif(!defined('FTP_FORCE')) define('FTP_FORCE', true);\n\n/**\n * @since 2.5\n * @var string\n */\ndefine('FTP_OS_Unix','u');\n\n/**\n * @since 2.5\n * @var string\n */\ndefine('FTP_OS_Windows','w');\n\n/**\n * @since 2.5\n * @var string\n */\ndefine('FTP_OS_Mac','m');\n\n/**\n * PemFTP base class\n *\n */\nclass ftp_base {\n\t/* Public variables */\n\tvar $LocalEcho;\n\tvar $Verbose;\n\tvar $OS_local;\n\tvar $OS_remote;\n\n\t/* Private variables */\n\tvar $_lastaction;\n\tvar $_errors;\n\tvar $_type;\n\tvar $_umask;\n\tvar $_timeout;\n\tvar $_passive;\n\tvar $_host;\n\tvar $_fullhost;\n\tvar $_port;\n\tvar $_datahost;\n\tvar $_dataport;\n\tvar $_ftp_control_sock;\n\tvar $_ftp_data_sock;\n\tvar $_ftp_temp_sock;\n\tvar $_ftp_buff_size;\n\tvar $_login;\n\tvar $_password;\n\tvar $_connected;\n\tvar $_ready;\n\tvar $_code;\n\tvar $_message;\n\tvar $_can_restore;\n\tvar $_port_available;\n\tvar $_curtype;\n\tvar $_features;\n\n\tvar $_error_array;\n\tvar $AuthorizedTransferMode;\n\tvar $OS_FullName;\n\tvar $_eol_code;\n\tvar $AutoAsciiExt;\n\n\t/* Constructor */\n\tfunction __construct($port_mode=FALSE, $verb=FALSE, $le=FALSE) {\n\t\t$this->LocalEcho=$le;\n\t\t$this->Verbose=$verb;\n\t\t$this->_lastaction=NULL;\n\t\t$this->_error_array=array();\n\t\t$this->_eol_code=array(FTP_OS_Unix=>\"\\n\", FTP_OS_Mac=>\"\\r\", FTP_OS_Windows=>\"\\r\\n\");\n\t\t$this->AuthorizedTransferMode=array(FTP_AUTOASCII, FTP_ASCII, FTP_BINARY);\n\t\t$this->OS_FullName=array(FTP_OS_Unix => 'UNIX', FTP_OS_Windows => 'WINDOWS', FTP_OS_Mac => 'MACOS');\n\t\t$this->AutoAsciiExt=array(\"ASP\",\"BAT\",\"C\",\"CPP\",\"CSS\",\"CSV\",\"JS\",\"H\",\"HTM\",\"HTML\",\"SHTML\",\"INI\",\"LOG\",\"PHP3\",\"PHTML\",\"PL\",\"PERL\",\"SH\",\"SQL\",\"TXT\");\n\t\t$this->_port_available=($port_mode==TRUE);\n\t\t$this->SendMSG(\"Staring FTP client class\".($this->_port_available?\"\":\" without PORT mode support\"));\n\t\t$this->_connected=FALSE;\n\t\t$this->_ready=FALSE;\n\t\t$this->_can_restore=FALSE;\n\t\t$this->_code=0;\n\t\t$this->_message=\"\";\n\t\t$this->_ftp_buff_size=4096;\n\t\t$this->_curtype=NULL;\n\t\t$this->SetUmask(0022);\n\t\t$this->SetType(FTP_AUTOASCII);\n\t\t$this->SetTimeout(30);\n\t\t$this->Passive(!$this->_port_available);\n\t\t$this->_login=\"anonymous\";\n\t\t$this->_password=\"anon@ftp.com\";\n\t\t$this->_features=array();\n\t    $this->OS_local=FTP_OS_Unix;\n\t\t$this->OS_remote=FTP_OS_Unix;\n\t\t$this->features=array();\n\t\tif(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') $this->OS_local=FTP_OS_Windows;\n\t\telseif(strtoupper(substr(PHP_OS, 0, 3)) === 'MAC') $this->OS_local=FTP_OS_Mac;\n\t}\n\n\tfunction ftp_base($port_mode=FALSE) {\n\t\t$this->__construct($port_mode);\n\t}\n\n// <!-- --------------------------------------------------------------------------------------- -->\n// <!--       Public functions                                                                  -->\n// <!-- --------------------------------------------------------------------------------------- -->\n\n\tfunction parselisting($line) {\n\t\t$is_windows = ($this->OS_remote == FTP_OS_Windows);\n\t\tif ($is_windows && preg_match(\"/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)/\",$line,$lucifer)) {\n\t\t\t$b = array();\n\t\t\tif ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix\n\t\t\t$b['isdir'] = ($lucifer[7]==\"<DIR>\");\n\t\t\tif ( $b['isdir'] )\n\t\t\t\t$b['type'] = 'd';\n\t\t\telse\n\t\t\t\t$b['type'] = 'f';\n\t\t\t$b['size'] = $lucifer[7];\n\t\t\t$b['month'] = $lucifer[1];\n\t\t\t$b['day'] = $lucifer[2];\n\t\t\t$b['year'] = $lucifer[3];\n\t\t\t$b['hour'] = $lucifer[4];\n\t\t\t$b['minute'] = $lucifer[5];\n\t\t\t$b['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],\"PM\")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);\n\t\t\t$b['am/pm'] = $lucifer[6];\n\t\t\t$b['name'] = $lucifer[8];\n\t\t} else if (!$is_windows && $lucifer=preg_split(\"/[ ]/\",$line,9,PREG_SPLIT_NO_EMPTY)) {\n\t\t\t//echo $line.\"\\n\";\n\t\t\t$lcount=count($lucifer);\n\t\t\tif ($lcount<8) return '';\n\t\t\t$b = array();\n\t\t\t$b['isdir'] = $lucifer[0]{0} === \"d\";\n\t\t\t$b['islink'] = $lucifer[0]{0} === \"l\";\n\t\t\tif ( $b['isdir'] )\n\t\t\t\t$b['type'] = 'd';\n\t\t\telseif ( $b['islink'] )\n\t\t\t\t$b['type'] = 'l';\n\t\t\telse\n\t\t\t\t$b['type'] = 'f';\n\t\t\t$b['perms'] = $lucifer[0];\n\t\t\t$b['number'] = $lucifer[1];\n\t\t\t$b['owner'] = $lucifer[2];\n\t\t\t$b['group'] = $lucifer[3];\n\t\t\t$b['size'] = $lucifer[4];\n\t\t\tif ($lcount==8) {\n\t\t\t\tsscanf($lucifer[5],\"%d-%d-%d\",$b['year'],$b['month'],$b['day']);\n\t\t\t\tsscanf($lucifer[6],\"%d:%d\",$b['hour'],$b['minute']);\n\t\t\t\t$b['time'] = @mktime($b['hour'],$b['minute'],0,$b['month'],$b['day'],$b['year']);\n\t\t\t\t$b['name'] = $lucifer[7];\n\t\t\t} else {\n\t\t\t\t$b['month'] = $lucifer[5];\n\t\t\t\t$b['day'] = $lucifer[6];\n\t\t\t\tif (preg_match(\"/([0-9]{2}):([0-9]{2})/\",$lucifer[7],$l2)) {\n\t\t\t\t\t$b['year'] = date(\"Y\");\n\t\t\t\t\t$b['hour'] = $l2[1];\n\t\t\t\t\t$b['minute'] = $l2[2];\n\t\t\t\t} else {\n\t\t\t\t\t$b['year'] = $lucifer[7];\n\t\t\t\t\t$b['hour'] = 0;\n\t\t\t\t\t$b['minute'] = 0;\n\t\t\t\t}\n\t\t\t\t$b['time'] = strtotime(sprintf(\"%d %s %d %02d:%02d\",$b['day'],$b['month'],$b['year'],$b['hour'],$b['minute']));\n\t\t\t\t$b['name'] = $lucifer[8];\n\t\t\t}\n\t\t}\n\n\t\treturn $b;\n\t}\n\n\tfunction SendMSG($message = \"\", $crlf=true) {\n\t\tif ($this->Verbose) {\n\t\t\techo $message.($crlf?CRLF:\"\");\n\t\t\tflush();\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\tfunction SetType($mode=FTP_AUTOASCII) {\n\t\tif(!in_array($mode, $this->AuthorizedTransferMode)) {\n\t\t\t$this->SendMSG(\"Wrong type\");\n\t\t\treturn FALSE;\n\t\t}\n\t\t$this->_type=$mode;\n\t\t$this->SendMSG(\"Transfer type: \".($this->_type==FTP_BINARY?\"binary\":($this->_type==FTP_ASCII?\"ASCII\":\"auto ASCII\") ) );\n\t\treturn TRUE;\n\t}\n\n\tfunction _settype($mode=FTP_ASCII) {\n\t\tif($this->_ready) {\n\t\t\tif($mode==FTP_BINARY) {\n\t\t\t\tif($this->_curtype!=FTP_BINARY) {\n\t\t\t\t\tif(!$this->_exec(\"TYPE I\", \"SetType\")) return FALSE;\n\t\t\t\t\t$this->_curtype=FTP_BINARY;\n\t\t\t\t}\n\t\t\t} elseif($this->_curtype!=FTP_ASCII) {\n\t\t\t\tif(!$this->_exec(\"TYPE A\", \"SetType\")) return FALSE;\n\t\t\t\t$this->_curtype=FTP_ASCII;\n\t\t\t}\n\t\t} else return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction Passive($pasv=NULL) {\n\t\tif(is_null($pasv)) $this->_passive=!$this->_passive;\n\t\telse $this->_passive=$pasv;\n\t\tif(!$this->_port_available and !$this->_passive) {\n\t\t\t$this->SendMSG(\"Only passive connections available!\");\n\t\t\t$this->_passive=TRUE;\n\t\t\treturn FALSE;\n\t\t}\n\t\t$this->SendMSG(\"Passive mode \".($this->_passive?\"on\":\"off\"));\n\t\treturn TRUE;\n\t}\n\n\tfunction SetServer($host, $port=21, $reconnect=true) {\n\t\tif(!is_long($port)) {\n\t        $this->verbose=true;\n    \t    $this->SendMSG(\"Incorrect port syntax\");\n\t\t\treturn FALSE;\n\t\t} else {\n\t\t\t$ip=@gethostbyname($host);\n\t        $dns=@gethostbyaddr($host);\n\t        if(!$ip) $ip=$host;\n\t        if(!$dns) $dns=$host;\n\t        // Validate the IPAddress PHP4 returns -1 for invalid, PHP5 false\n\t        // -1 === \"255.255.255.255\" which is the broadcast address which is also going to be invalid\n\t        $ipaslong = ip2long($ip);\n\t\t\tif ( ($ipaslong == false) || ($ipaslong === -1) ) {\n\t\t\t\t$this->SendMSG(\"Wrong host name/address \\\"\".$host.\"\\\"\");\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t        $this->_host=$ip;\n\t        $this->_fullhost=$dns;\n\t        $this->_port=$port;\n\t        $this->_dataport=$port-1;\n\t\t}\n\t\t$this->SendMSG(\"Host \\\"\".$this->_fullhost.\"(\".$this->_host.\"):\".$this->_port.\"\\\"\");\n\t\tif($reconnect){\n\t\t\tif($this->_connected) {\n\t\t\t\t$this->SendMSG(\"Reconnecting\");\n\t\t\t\tif(!$this->quit(FTP_FORCE)) return FALSE;\n\t\t\t\tif(!$this->connect()) return FALSE;\n\t\t\t}\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\tfunction SetUmask($umask=0022) {\n\t\t$this->_umask=$umask;\n\t\tumask($this->_umask);\n\t\t$this->SendMSG(\"UMASK 0\".decoct($this->_umask));\n\t\treturn TRUE;\n\t}\n\n\tfunction SetTimeout($timeout=30) {\n\t\t$this->_timeout=$timeout;\n\t\t$this->SendMSG(\"Timeout \".$this->_timeout);\n\t\tif($this->_connected)\n\t\t\tif(!$this->_settimeout($this->_ftp_control_sock)) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction connect($server=NULL) {\n\t\tif(!empty($server)) {\n\t\t\tif(!$this->SetServer($server)) return false;\n\t\t}\n\t\tif($this->_ready) return true;\n\t    $this->SendMsg('Local OS : '.$this->OS_FullName[$this->OS_local]);\n\t\tif(!($this->_ftp_control_sock = $this->_connect($this->_host, $this->_port))) {\n\t\t\t$this->SendMSG(\"Error : Cannot connect to remote host \\\"\".$this->_fullhost.\" :\".$this->_port.\"\\\"\");\n\t\t\treturn FALSE;\n\t\t}\n\t\t$this->SendMSG(\"Connected to remote host \\\"\".$this->_fullhost.\":\".$this->_port.\"\\\". Waiting for greeting.\");\n\t\tdo {\n\t\t\tif(!$this->_readmsg()) return FALSE;\n\t\t\tif(!$this->_checkCode()) return FALSE;\n\t\t\t$this->_lastaction=time();\n\t\t} while($this->_code<200);\n\t\t$this->_ready=true;\n\t\t$syst=$this->systype();\n\t\tif(!$syst) $this->SendMSG(\"Can't detect remote OS\");\n\t\telse {\n\t\t\tif(preg_match(\"/win|dos|novell/i\", $syst[0])) $this->OS_remote=FTP_OS_Windows;\n\t\t\telseif(preg_match(\"/os/i\", $syst[0])) $this->OS_remote=FTP_OS_Mac;\n\t\t\telseif(preg_match(\"/(li|u)nix/i\", $syst[0])) $this->OS_remote=FTP_OS_Unix;\n\t\t\telse $this->OS_remote=FTP_OS_Mac;\n\t\t\t$this->SendMSG(\"Remote OS: \".$this->OS_FullName[$this->OS_remote]);\n\t\t}\n\t\tif(!$this->features()) $this->SendMSG(\"Can't get features list. All supported - disabled\");\n\t\telse $this->SendMSG(\"Supported features: \".implode(\", \", array_keys($this->_features)));\n\t\treturn TRUE;\n\t}\n\n\tfunction quit($force=false) {\n\t\tif($this->_ready) {\n\t\t\tif(!$this->_exec(\"QUIT\") and !$force) return FALSE;\n\t\t\tif(!$this->_checkCode() and !$force) return FALSE;\n\t\t\t$this->_ready=false;\n\t\t\t$this->SendMSG(\"Session finished\");\n\t\t}\n\t\t$this->_quit();\n\t\treturn TRUE;\n\t}\n\n\tfunction login($user=NULL, $pass=NULL) {\n\t\tif(!is_null($user)) $this->_login=$user;\n\t\telse $this->_login=\"anonymous\";\n\t\tif(!is_null($pass)) $this->_password=$pass;\n\t\telse $this->_password=\"anon@anon.com\";\n\t\tif(!$this->_exec(\"USER \".$this->_login, \"login\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\tif($this->_code!=230) {\n\t\t\tif(!$this->_exec((($this->_code==331)?\"PASS \":\"ACCT \").$this->_password, \"login\")) return FALSE;\n\t\t\tif(!$this->_checkCode()) return FALSE;\n\t\t}\n\t\t$this->SendMSG(\"Authentication succeeded\");\n\t\tif(empty($this->_features)) {\n\t\t\tif(!$this->features()) $this->SendMSG(\"Can't get features list. All supported - disabled\");\n\t\t\telse $this->SendMSG(\"Supported features: \".implode(\", \", array_keys($this->_features)));\n\t\t}\n\t\treturn TRUE;\n\t}\n\n\tfunction pwd() {\n\t\tif(!$this->_exec(\"PWD\", \"pwd\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn preg_replace(\"/^[0-9]{3} \\\"(.+)\\\".*$/s\", \"\\\\1\", $this->_message);\n\t}\n\n\tfunction cdup() {\n\t\tif(!$this->_exec(\"CDUP\", \"cdup\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn true;\n\t}\n\n\tfunction chdir($pathname) {\n\t\tif(!$this->_exec(\"CWD \".$pathname, \"chdir\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction rmdir($pathname) {\n\t\tif(!$this->_exec(\"RMD \".$pathname, \"rmdir\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction mkdir($pathname) {\n\t\tif(!$this->_exec(\"MKD \".$pathname, \"mkdir\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction rename($from, $to) {\n\t\tif(!$this->_exec(\"RNFR \".$from, \"rename\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\tif($this->_code==350) {\n\t\t\tif(!$this->_exec(\"RNTO \".$to, \"rename\")) return FALSE;\n\t\t\tif(!$this->_checkCode()) return FALSE;\n\t\t} else return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction filesize($pathname) {\n\t\tif(!isset($this->_features[\"SIZE\"])) {\n\t\t\t$this->PushError(\"filesize\", \"not supported by server\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_exec(\"SIZE \".$pathname, \"filesize\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn preg_replace(\"/^[0-9]{3} ([0-9]+).*$/s\", \"\\\\1\", $this->_message);\n\t}\n\n\tfunction abort() {\n\t\tif(!$this->_exec(\"ABOR\", \"abort\")) return FALSE;\n\t\tif(!$this->_checkCode()) {\n\t\t\tif($this->_code!=426) return FALSE;\n\t\t\tif(!$this->_readmsg(\"abort\")) return FALSE;\n\t\t\tif(!$this->_checkCode()) return FALSE;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction mdtm($pathname) {\n\t\tif(!isset($this->_features[\"MDTM\"])) {\n\t\t\t$this->PushError(\"mdtm\", \"not supported by server\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_exec(\"MDTM \".$pathname, \"mdtm\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\t$mdtm = preg_replace(\"/^[0-9]{3} ([0-9]+).*$/s\", \"\\\\1\", $this->_message);\n\t\t$date = sscanf($mdtm, \"%4d%2d%2d%2d%2d%2d\");\n\t\t$timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);\n\t\treturn $timestamp;\n\t}\n\n\tfunction systype() {\n\t\tif(!$this->_exec(\"SYST\", \"systype\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\t$DATA = explode(\" \", $this->_message);\n\t\treturn array($DATA[1], $DATA[3]);\n\t}\n\n\tfunction delete($pathname) {\n\t\tif(!$this->_exec(\"DELE \".$pathname, \"delete\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction site($command, $fnction=\"site\") {\n\t\tif(!$this->_exec(\"SITE \".$command, $fnction)) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction chmod($pathname, $mode) {\n\t\tif(!$this->site( sprintf('CHMOD %o %s', $mode, $pathname), \"chmod\")) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction restore($from) {\n\t\tif(!isset($this->_features[\"REST\"])) {\n\t\t\t$this->PushError(\"restore\", \"not supported by server\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->_curtype!=FTP_BINARY) {\n\t\t\t$this->PushError(\"restore\", \"can't restore in ASCII mode\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_exec(\"REST \".$from, \"resore\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn TRUE;\n\t}\n\n\tfunction features() {\n\t\tif(!$this->_exec(\"FEAT\", \"features\")) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\t$f=preg_split(\"/[\".CRLF.\"]+/\", preg_replace(\"/[0-9]{3}[ -].*[\".CRLF.\"]+/\", \"\", $this->_message), -1, PREG_SPLIT_NO_EMPTY);\n\t\t$this->_features=array();\n\t\tforeach($f as $k=>$v) {\n\t\t\t$v=explode(\" \", trim($v));\n\t\t\t$this->_features[array_shift($v)]=$v;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction rawlist($pathname=\"\", $arg=\"\") {\n\t\treturn $this->_list(($arg?\" \".$arg:\"\").($pathname?\" \".$pathname:\"\"), \"LIST\", \"rawlist\");\n\t}\n\n\tfunction nlist($pathname=\"\", $arg=\"\") {\n\t\treturn $this->_list(($arg?\" \".$arg:\"\").($pathname?\" \".$pathname:\"\"), \"NLST\", \"nlist\");\n\t}\n\n\tfunction is_exists($pathname) {\n\t\treturn $this->file_exists($pathname);\n\t}\n\n\tfunction file_exists($pathname) {\n\t\t$exists=true;\n\t\tif(!$this->_exec(\"RNFR \".$pathname, \"rename\")) $exists=FALSE;\n\t\telse {\n\t\t\tif(!$this->_checkCode()) $exists=FALSE;\n\t\t\t$this->abort();\n\t\t}\n\t\tif($exists) $this->SendMSG(\"Remote file \".$pathname.\" exists\");\n\t\telse $this->SendMSG(\"Remote file \".$pathname.\" does not exist\");\n\t\treturn $exists;\n\t}\n\n\tfunction fget($fp, $remotefile,$rest=0) {\n\t\tif($this->_can_restore and $rest!=0) fseek($fp, $rest);\n\t\t$pi=pathinfo($remotefile);\n\t\tif($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi[\"extension\"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;\n\t\telse $mode=FTP_BINARY;\n\t\tif(!$this->_data_prepare($mode)) {\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->_can_restore and $rest!=0) $this->restore($rest);\n\t\tif(!$this->_exec(\"RETR \".$remotefile, \"get\")) {\n\t\t\t$this->_data_close();\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_checkCode()) {\n\t\t\t$this->_data_close();\n\t\t\treturn FALSE;\n\t\t}\n\t\t$out=$this->_data_read($mode, $fp);\n\t\t$this->_data_close();\n\t\tif(!$this->_readmsg()) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn $out;\n\t}\n\n\tfunction get($remotefile, $localfile=NULL, $rest=0) {\n\t\tif(is_null($localfile)) $localfile=$remotefile;\n\t\tif (@file_exists($localfile)) $this->SendMSG(\"Warning : local file will be overwritten\");\n\t\t$fp = @fopen($localfile, \"w\");\n\t\tif (!$fp) {\n\t\t\t$this->PushError(\"get\",\"can't open local file\", \"Cannot create \\\"\".$localfile.\"\\\"\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->_can_restore and $rest!=0) fseek($fp, $rest);\n\t\t$pi=pathinfo($remotefile);\n\t\tif($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi[\"extension\"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;\n\t\telse $mode=FTP_BINARY;\n\t\tif(!$this->_data_prepare($mode)) {\n\t\t\tfclose($fp);\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->_can_restore and $rest!=0) $this->restore($rest);\n\t\tif(!$this->_exec(\"RETR \".$remotefile, \"get\")) {\n\t\t\t$this->_data_close();\n\t\t\tfclose($fp);\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_checkCode()) {\n\t\t\t$this->_data_close();\n\t\t\tfclose($fp);\n\t\t\treturn FALSE;\n\t\t}\n\t\t$out=$this->_data_read($mode, $fp);\n\t\tfclose($fp);\n\t\t$this->_data_close();\n\t\tif(!$this->_readmsg()) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn $out;\n\t}\n\n\tfunction fput($remotefile, $fp) {\n\t\tif($this->_can_restore and $rest!=0) fseek($fp, $rest);\n\t\t$pi=pathinfo($remotefile);\n\t\tif($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi[\"extension\"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;\n\t\telse $mode=FTP_BINARY;\n\t\tif(!$this->_data_prepare($mode)) {\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->_can_restore and $rest!=0) $this->restore($rest);\n\t\tif(!$this->_exec(\"STOR \".$remotefile, \"put\")) {\n\t\t\t$this->_data_close();\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_checkCode()) {\n\t\t\t$this->_data_close();\n\t\t\treturn FALSE;\n\t\t}\n\t\t$ret=$this->_data_write($mode, $fp);\n\t\t$this->_data_close();\n\t\tif(!$this->_readmsg()) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn $ret;\n\t}\n\n\tfunction put($localfile, $remotefile=NULL, $rest=0) {\n\t\tif(is_null($remotefile)) $remotefile=$localfile;\n\t\tif (!file_exists($localfile)) {\n\t\t\t$this->PushError(\"put\",\"can't open local file\", \"No such file or directory \\\"\".$localfile.\"\\\"\");\n\t\t\treturn FALSE;\n\t\t}\n\t\t$fp = @fopen($localfile, \"r\");\n\n\t\tif (!$fp) {\n\t\t\t$this->PushError(\"put\",\"can't open local file\", \"Cannot read file \\\"\".$localfile.\"\\\"\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->_can_restore and $rest!=0) fseek($fp, $rest);\n\t\t$pi=pathinfo($localfile);\n\t\tif($this->_type==FTP_ASCII or ($this->_type==FTP_AUTOASCII and in_array(strtoupper($pi[\"extension\"]), $this->AutoAsciiExt))) $mode=FTP_ASCII;\n\t\telse $mode=FTP_BINARY;\n\t\tif(!$this->_data_prepare($mode)) {\n\t\t\tfclose($fp);\n\t\t\treturn FALSE;\n\t\t}\n\t\tif($this->_can_restore and $rest!=0) $this->restore($rest);\n\t\tif(!$this->_exec(\"STOR \".$remotefile, \"put\")) {\n\t\t\t$this->_data_close();\n\t\t\tfclose($fp);\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_checkCode()) {\n\t\t\t$this->_data_close();\n\t\t\tfclose($fp);\n\t\t\treturn FALSE;\n\t\t}\n\t\t$ret=$this->_data_write($mode, $fp);\n\t\tfclose($fp);\n\t\t$this->_data_close();\n\t\tif(!$this->_readmsg()) return FALSE;\n\t\tif(!$this->_checkCode()) return FALSE;\n\t\treturn $ret;\n\t}\n\n\tfunction mput($local=\".\", $remote=NULL, $continious=false) {\n\t\t$local=realpath($local);\n\t\tif(!@file_exists($local)) {\n\t\t\t$this->PushError(\"mput\",\"can't open local folder\", \"Cannot stat folder \\\"\".$local.\"\\\"\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!is_dir($local)) return $this->put($local, $remote);\n\t\tif(empty($remote)) $remote=\".\";\n\t\telseif(!$this->file_exists($remote) and !$this->mkdir($remote)) return FALSE;\n\t\tif($handle = opendir($local)) {\n\t\t\t$list=array();\n\t\t\twhile (false !== ($file = readdir($handle))) {\n\t\t\t\tif ($file != \".\" && $file != \"..\") $list[]=$file;\n\t\t\t}\n\t\t\tclosedir($handle);\n\t\t} else {\n\t\t\t$this->PushError(\"mput\",\"can't open local folder\", \"Cannot read folder \\\"\".$local.\"\\\"\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(empty($list)) return TRUE;\n\t\t$ret=true;\n\t\tforeach($list as $el) {\n\t\t\tif(is_dir($local.\"/\".$el)) $t=$this->mput($local.\"/\".$el, $remote.\"/\".$el);\n\t\t\telse $t=$this->put($local.\"/\".$el, $remote.\"/\".$el);\n\t\t\tif(!$t) {\n\t\t\t\t$ret=FALSE;\n\t\t\t\tif(!$continious) break;\n\t\t\t}\n\t\t}\n\t\treturn $ret;\n\n\t}\n\n\tfunction mget($remote, $local=\".\", $continious=false) {\n\t\t$list=$this->rawlist($remote, \"-lA\");\n\t\tif($list===false) {\n\t\t\t$this->PushError(\"mget\",\"can't read remote folder list\", \"Can't read remote folder \\\"\".$remote.\"\\\" contents\");\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(empty($list)) return true;\n\t\tif(!@file_exists($local)) {\n\t\t\tif(!@mkdir($local)) {\n\t\t\t\t$this->PushError(\"mget\",\"can't create local folder\", \"Cannot create folder \\\"\".$local.\"\\\"\");\n\t\t\t\treturn FALSE;\n\t\t\t}\n\t\t}\n\t\tforeach($list as $k=>$v) {\n\t\t\t$list[$k]=$this->parselisting($v);\n\t\t\tif($list[$k][\"name\"]==\".\" or $list[$k][\"name\"]==\"..\") unset($list[$k]);\n\t\t}\n\t\t$ret=true;\n\t\tforeach($list as $el) {\n\t\t\tif($el[\"type\"]==\"d\") {\n\t\t\t\tif(!$this->mget($remote.\"/\".$el[\"name\"], $local.\"/\".$el[\"name\"], $continious)) {\n\t\t\t\t\t$this->PushError(\"mget\", \"can't copy folder\", \"Can't copy remote folder \\\"\".$remote.\"/\".$el[\"name\"].\"\\\" to local \\\"\".$local.\"/\".$el[\"name\"].\"\\\"\");\n\t\t\t\t\t$ret=false;\n\t\t\t\t\tif(!$continious) break;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!$this->get($remote.\"/\".$el[\"name\"], $local.\"/\".$el[\"name\"])) {\n\t\t\t\t\t$this->PushError(\"mget\", \"can't copy file\", \"Can't copy remote file \\\"\".$remote.\"/\".$el[\"name\"].\"\\\" to local \\\"\".$local.\"/\".$el[\"name\"].\"\\\"\");\n\t\t\t\t\t$ret=false;\n\t\t\t\t\tif(!$continious) break;\n\t\t\t\t}\n\t\t\t}\n\t\t\t@chmod($local.\"/\".$el[\"name\"], $el[\"perms\"]);\n\t\t\t$t=strtotime($el[\"date\"]);\n\t\t\tif($t!==-1 and $t!==false) @touch($local.\"/\".$el[\"name\"], $t);\n\t\t}\n\t\treturn $ret;\n\t}\n\n\tfunction mdel($remote, $continious=false) {\n\t\t$list=$this->rawlist($remote, \"-la\");\n\t\tif($list===false) {\n\t\t\t$this->PushError(\"mdel\",\"can't read remote folder list\", \"Can't read remote folder \\\"\".$remote.\"\\\" contents\");\n\t\t\treturn false;\n\t\t}\n\n\t\tforeach($list as $k=>$v) {\n\t\t\t$list[$k]=$this->parselisting($v);\n\t\t\tif($list[$k][\"name\"]==\".\" or $list[$k][\"name\"]==\"..\") unset($list[$k]);\n\t\t}\n\t\t$ret=true;\n\n\t\tforeach($list as $el) {\n\t\t\tif ( empty($el) )\n\t\t\t\tcontinue;\n\n\t\t\tif($el[\"type\"]==\"d\") {\n\t\t\t\tif(!$this->mdel($remote.\"/\".$el[\"name\"], $continious)) {\n\t\t\t\t\t$ret=false;\n\t\t\t\t\tif(!$continious) break;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (!$this->delete($remote.\"/\".$el[\"name\"])) {\n\t\t\t\t\t$this->PushError(\"mdel\", \"can't delete file\", \"Can't delete remote file \\\"\".$remote.\"/\".$el[\"name\"].\"\\\"\");\n\t\t\t\t\t$ret=false;\n\t\t\t\t\tif(!$continious) break;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(!$this->rmdir($remote)) {\n\t\t\t$this->PushError(\"mdel\", \"can't delete folder\", \"Can't delete remote folder \\\"\".$remote.\"/\".$el[\"name\"].\"\\\"\");\n\t\t\t$ret=false;\n\t\t}\n\t\treturn $ret;\n\t}\n\n\tfunction mmkdir($dir, $mode = 0777) {\n\t\tif(empty($dir)) return FALSE;\n\t\tif($this->is_exists($dir) or $dir == \"/\" ) return TRUE;\n\t\tif(!$this->mmkdir(dirname($dir), $mode)) return false;\n\t\t$r=$this->mkdir($dir, $mode);\n\t\t$this->chmod($dir,$mode);\n\t\treturn $r;\n\t}\n\n\tfunction glob($pattern, $handle=NULL) {\n\t\t$path=$output=null;\n\t\tif(PHP_OS=='WIN32') $slash='\\\\';\n\t\telse $slash='/';\n\t\t$lastpos=strrpos($pattern,$slash);\n\t\tif(!($lastpos===false)) {\n\t\t\t$path=substr($pattern,0,-$lastpos-1);\n\t\t\t$pattern=substr($pattern,$lastpos);\n\t\t} else $path=getcwd();\n\t\tif(is_array($handle) and !empty($handle)) {\n\t\t\twhile($dir=each($handle)) {\n\t\t\t\tif($this->glob_pattern_match($pattern,$dir))\n\t\t\t\t$output[]=$dir;\n\t\t\t}\n\t\t} else {\n\t\t\t$handle=@opendir($path);\n\t\t\tif($handle===false) return false;\n\t\t\twhile($dir=readdir($handle)) {\n\t\t\t\tif($this->glob_pattern_match($pattern,$dir))\n\t\t\t\t$output[]=$dir;\n\t\t\t}\n\t\t\tclosedir($handle);\n\t\t}\n\t\tif(is_array($output)) return $output;\n\t\treturn false;\n\t}\n\n\tfunction glob_pattern_match($pattern,$string) {\n\t\t$out=null;\n\t\t$chunks=explode(';',$pattern);\n\t\tforeach($chunks as $pattern) {\n\t\t\t$escape=array('$','^','.','{','}','(',')','[',']','|');\n\t\t\twhile(strpos($pattern,'**')!==false)\n\t\t\t\t$pattern=str_replace('**','*',$pattern);\n\t\t\tforeach($escape as $probe)\n\t\t\t\t$pattern=str_replace($probe,\"\\\\$probe\",$pattern);\n\t\t\t$pattern=str_replace('?*','*',\n\t\t\t\tstr_replace('*?','*',\n\t\t\t\t\tstr_replace('*',\".*\",\n\t\t\t\t\t\tstr_replace('?','.{1,1}',$pattern))));\n\t\t\t$out[]=$pattern;\n\t\t}\n\t\tif(count($out)==1) return($this->glob_regexp(\"^$out[0]$\",$string));\n\t\telse {\n\t\t\tforeach($out as $tester)\n\t\t\t\tif($this->my_regexp(\"^$tester$\",$string)) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction glob_regexp($pattern,$probe) {\n\t\t$sensitive=(PHP_OS!='WIN32');\n\t\treturn ($sensitive?\n\t\t\tpreg_match( '/' . preg_quote( $pattern, '/' ) . '/', $probe ) : \n\t\t\tpreg_match( '/' . preg_quote( $pattern, '/' ) . '/i', $probe )\n\t\t);\n\t}\n\n\tfunction dirlist($remote) {\n\t\t$list=$this->rawlist($remote, \"-la\");\n\t\tif($list===false) {\n\t\t\t$this->PushError(\"dirlist\",\"can't read remote folder list\", \"Can't read remote folder \\\"\".$remote.\"\\\" contents\");\n\t\t\treturn false;\n\t\t}\n\n\t\t$dirlist = array();\n\t\tforeach($list as $k=>$v) {\n\t\t\t$entry=$this->parselisting($v);\n\t\t\tif ( empty($entry) )\n\t\t\t\tcontinue;\n\n\t\t\tif($entry[\"name\"]==\".\" or $entry[\"name\"]==\"..\")\n\t\t\t\tcontinue;\n\n\t\t\t$dirlist[$entry['name']] = $entry;\n\t\t}\n\n\t\treturn $dirlist;\n\t}\n// <!-- --------------------------------------------------------------------------------------- -->\n// <!--       Private functions                                                                 -->\n// <!-- --------------------------------------------------------------------------------------- -->\n\tfunction _checkCode() {\n\t\treturn ($this->_code<400 and $this->_code>0);\n\t}\n\n\tfunction _list($arg=\"\", $cmd=\"LIST\", $fnction=\"_list\") {\n\t\tif(!$this->_data_prepare()) return false;\n\t\tif(!$this->_exec($cmd.$arg, $fnction)) {\n\t\t\t$this->_data_close();\n\t\t\treturn FALSE;\n\t\t}\n\t\tif(!$this->_checkCode()) {\n\t\t\t$this->_data_close();\n\t\t\treturn FALSE;\n\t\t}\n\t\t$out=\"\";\n\t\tif($this->_code<200) {\n\t\t\t$out=$this->_data_read();\n\t\t\t$this->_data_close();\n\t\t\tif(!$this->_readmsg()) return FALSE;\n\t\t\tif(!$this->_checkCode()) return FALSE;\n\t\t\tif($out === FALSE ) return FALSE;\n\t\t\t$out=preg_split(\"/[\".CRLF.\"]+/\", $out, -1, PREG_SPLIT_NO_EMPTY);\n//\t\t\t$this->SendMSG(implode($this->_eol_code[$this->OS_local], $out));\n\t\t}\n\t\treturn $out;\n\t}\n\n// <!-- --------------------------------------------------------------------------------------- -->\n// <!-- Partie : gestion des erreurs                                                            -->\n// <!-- --------------------------------------------------------------------------------------- -->\n// Gnre une erreur pour traitement externe  la classe\n\tfunction PushError($fctname,$msg,$desc=false){\n\t\t$error=array();\n\t\t$error['time']=time();\n\t\t$error['fctname']=$fctname;\n\t\t$error['msg']=$msg;\n\t\t$error['desc']=$desc;\n\t\tif($desc) $tmp=' ('.$desc.')'; else $tmp='';\n\t\t$this->SendMSG($fctname.': '.$msg.$tmp);\n\t\treturn(array_push($this->_error_array,$error));\n\t}\n\n// Rcupre une erreur externe\n\tfunction PopError(){\n\t\tif(count($this->_error_array)) return(array_pop($this->_error_array));\n\t\t\telse return(false);\n\t}\n}\n\n$mod_sockets = extension_loaded( 'sockets' );\nif ( ! $mod_sockets && function_exists( 'dl' ) && is_callable( 'dl' ) ) {\n\t$prefix = ( PHP_SHLIB_SUFFIX == 'dll' ) ? 'php_' : '';\n\t@dl( $prefix . 'sockets.' . PHP_SHLIB_SUFFIX );\n\t$mod_sockets = extension_loaded( 'sockets' );\n}\n\nrequire_once dirname( __FILE__ ) . \"/class-ftp-\" . ( $mod_sockets ? \"sockets\" : \"pure\" ) . \".php\";\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-pclzip.php",
    "content": "<?php\n// --------------------------------------------------------------------------------\n// PhpConcept Library - Zip Module 2.8.2\n// --------------------------------------------------------------------------------\n// License GNU/LGPL - Vincent Blavet - August 2009\n// http://www.phpconcept.net\n// --------------------------------------------------------------------------------\n//\n// Presentation :\n//   PclZip is a PHP library that manage ZIP archives.\n//   So far tests show that archives generated by PclZip are readable by\n//   WinZip application and other tools.\n//\n// Description :\n//   See readme.txt and http://www.phpconcept.net\n//\n// Warning :\n//   This library and the associated files are non commercial, non professional\n//   work.\n//   It should not have unexpected results. However if any damage is caused by\n//   this software the author can not be responsible.\n//   The use of this software is at the risk of the user.\n//\n// --------------------------------------------------------------------------------\n// $Id: pclzip.lib.php,v 1.60 2009/09/30 21:01:04 vblavet Exp $\n// --------------------------------------------------------------------------------\n\n  // ----- Constants\n  if (!defined('PCLZIP_READ_BLOCK_SIZE')) {\n    define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );\n  }\n\n  // ----- File list separator\n  // In version 1.x of PclZip, the separator for file list is a space\n  // (which is not a very smart choice, specifically for windows paths !).\n  // A better separator should be a comma (,). This constant gives you the\n  // abilty to change that.\n  // However notice that changing this value, may have impact on existing\n  // scripts, using space separated filenames.\n  // Recommanded values for compatibility with older versions :\n  //define( 'PCLZIP_SEPARATOR', ' ' );\n  // Recommanded values for smart separation of filenames.\n  if (!defined('PCLZIP_SEPARATOR')) {\n    define( 'PCLZIP_SEPARATOR', ',' );\n  }\n\n  // ----- Error configuration\n  // 0 : PclZip Class integrated error handling\n  // 1 : PclError external library error handling. By enabling this\n  //     you must ensure that you have included PclError library.\n  // [2,...] : reserved for futur use\n  if (!defined('PCLZIP_ERROR_EXTERNAL')) {\n    define( 'PCLZIP_ERROR_EXTERNAL', 0 );\n  }\n\n  // ----- Optional static temporary directory\n  //       By default temporary files are generated in the script current\n  //       path.\n  //       If defined :\n  //       - MUST BE terminated by a '/'.\n  //       - MUST be a valid, already created directory\n  //       Samples :\n  // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );\n  // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );\n  if (!defined('PCLZIP_TEMPORARY_DIR')) {\n    define( 'PCLZIP_TEMPORARY_DIR', '' );\n  }\n\n  // ----- Optional threshold ratio for use of temporary files\n  //       Pclzip sense the size of the file to add/extract and decide to\n  //       use or not temporary file. The algorythm is looking for\n  //       memory_limit of PHP and apply a ratio.\n  //       threshold = memory_limit * ratio.\n  //       Recommended values are under 0.5. Default 0.47.\n  //       Samples :\n  // define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.5 );\n  if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) {\n    define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 );\n  }\n\n// --------------------------------------------------------------------------------\n// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****\n// --------------------------------------------------------------------------------\n\n  // ----- Global variables\n  $g_pclzip_version = \"2.8.2\";\n\n  // ----- Error codes\n  //   -1 : Unable to open file in binary write mode\n  //   -2 : Unable to open file in binary read mode\n  //   -3 : Invalid parameters\n  //   -4 : File does not exist\n  //   -5 : Filename is too long (max. 255)\n  //   -6 : Not a valid zip file\n  //   -7 : Invalid extracted file size\n  //   -8 : Unable to create directory\n  //   -9 : Invalid archive extension\n  //  -10 : Invalid archive format\n  //  -11 : Unable to delete file (unlink)\n  //  -12 : Unable to rename file (rename)\n  //  -13 : Invalid header checksum\n  //  -14 : Invalid archive size\n  define( 'PCLZIP_ERR_USER_ABORTED', 2 );\n  define( 'PCLZIP_ERR_NO_ERROR', 0 );\n  define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );\n  define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );\n  define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );\n  define( 'PCLZIP_ERR_MISSING_FILE', -4 );\n  define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );\n  define( 'PCLZIP_ERR_INVALID_ZIP', -6 );\n  define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );\n  define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );\n  define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );\n  define( 'PCLZIP_ERR_BAD_FORMAT', -10 );\n  define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );\n  define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );\n  define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );\n  define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );\n  define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );\n  define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );\n  define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );\n  define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );\n  define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );\n  define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );\n  define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );\n\n  // ----- Options values\n  define( 'PCLZIP_OPT_PATH', 77001 );\n  define( 'PCLZIP_OPT_ADD_PATH', 77002 );\n  define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );\n  define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );\n  define( 'PCLZIP_OPT_SET_CHMOD', 77005 );\n  define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );\n  define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );\n  define( 'PCLZIP_OPT_BY_NAME', 77008 );\n  define( 'PCLZIP_OPT_BY_INDEX', 77009 );\n  define( 'PCLZIP_OPT_BY_EREG', 77010 );\n  define( 'PCLZIP_OPT_BY_PREG', 77011 );\n  define( 'PCLZIP_OPT_COMMENT', 77012 );\n  define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );\n  define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );\n  define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );\n  define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );\n  define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );\n  // Having big trouble with crypt. Need to multiply 2 long int\n  // which is not correctly supported by PHP ...\n  //define( 'PCLZIP_OPT_CRYPT', 77018 );\n  define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );\n  define( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 );\n  define( 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020 ); // alias\n  define( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 );\n  define( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 ); // alias\n  define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 );\n  define( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 ); // alias\n\n  // ----- File description attributes\n  define( 'PCLZIP_ATT_FILE_NAME', 79001 );\n  define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );\n  define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );\n  define( 'PCLZIP_ATT_FILE_MTIME', 79004 );\n  define( 'PCLZIP_ATT_FILE_CONTENT', 79005 );\n  define( 'PCLZIP_ATT_FILE_COMMENT', 79006 );\n\n  // ----- Call backs values\n  define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );\n  define( 'PCLZIP_CB_POST_EXTRACT', 78002 );\n  define( 'PCLZIP_CB_PRE_ADD', 78003 );\n  define( 'PCLZIP_CB_POST_ADD', 78004 );\n  /* For futur use\n  define( 'PCLZIP_CB_PRE_LIST', 78005 );\n  define( 'PCLZIP_CB_POST_LIST', 78006 );\n  define( 'PCLZIP_CB_PRE_DELETE', 78007 );\n  define( 'PCLZIP_CB_POST_DELETE', 78008 );\n  */\n\n  // --------------------------------------------------------------------------------\n  // Class : PclZip\n  // Description :\n  //   PclZip is the class that represent a Zip archive.\n  //   The public methods allow the manipulation of the archive.\n  // Attributes :\n  //   Attributes must not be accessed directly.\n  // Methods :\n  //   PclZip() : Object creator\n  //   create() : Creates the Zip archive\n  //   listContent() : List the content of the Zip archive\n  //   extract() : Extract the content of the archive\n  //   properties() : List the properties of the archive\n  // --------------------------------------------------------------------------------\n  class PclZip\n  {\n    // ----- Filename of the zip file\n    var $zipname = '';\n\n    // ----- File descriptor of the zip file\n    var $zip_fd = 0;\n\n    // ----- Internal error handling\n    var $error_code = 1;\n    var $error_string = '';\n\n    // ----- Current status of the magic_quotes_runtime\n    // This value store the php configuration for magic_quotes\n    // The class can then disable the magic_quotes and reset it after\n    var $magic_quotes_status;\n\n  // --------------------------------------------------------------------------------\n  // Function : PclZip()\n  // Description :\n  //   Creates a PclZip object and set the name of the associated Zip archive\n  //   filename.\n  //   Note that no real action is taken, if the archive does not exist it is not\n  //   created. Use create() for that.\n  // --------------------------------------------------------------------------------\n  function __construct($p_zipname)\n  {\n\n    // ----- Tests the zlib\n    if (!function_exists('gzopen'))\n    {\n      die('Abort '.basename(__FILE__).' : Missing zlib extensions');\n    }\n\n    // ----- Set the attributes\n    $this->zipname = $p_zipname;\n    $this->zip_fd = 0;\n    $this->magic_quotes_status = -1;\n\n    // ----- Return\n    return;\n  }\n\n  public function PclZip($p_zipname) {\n    self::__construct($p_zipname);\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function :\n  //   create($p_filelist, $p_add_dir=\"\", $p_remove_dir=\"\")\n  //   create($p_filelist, $p_option, $p_option_value, ...)\n  // Description :\n  //   This method supports two different synopsis. The first one is historical.\n  //   This method creates a Zip Archive. The Zip file is created in the\n  //   filesystem. The files and directories indicated in $p_filelist\n  //   are added in the archive. See the parameters description for the\n  //   supported format of $p_filelist.\n  //   When a directory is in the list, the directory and its content is added\n  //   in the archive.\n  //   In this synopsis, the function takes an optional variable list of\n  //   options. See bellow the supported options.\n  // Parameters :\n  //   $p_filelist : An array containing file or directory names, or\n  //                 a string containing one filename or one directory name, or\n  //                 a string containing a list of filenames and/or directory\n  //                 names separated by spaces.\n  //   $p_add_dir : A path to add before the real path of the archived file,\n  //                in order to have it memorized in the archive.\n  //   $p_remove_dir : A path to remove from the real path of the file to archive,\n  //                   in order to have a shorter path memorized in the archive.\n  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir\n  //                   is removed first, before $p_add_dir is added.\n  // Options :\n  //   PCLZIP_OPT_ADD_PATH :\n  //   PCLZIP_OPT_REMOVE_PATH :\n  //   PCLZIP_OPT_REMOVE_ALL_PATH :\n  //   PCLZIP_OPT_COMMENT :\n  //   PCLZIP_CB_PRE_ADD :\n  //   PCLZIP_CB_POST_ADD :\n  // Return Values :\n  //   0 on failure,\n  //   The list of the added files, with a status of the add action.\n  //   (see PclZip::listContent() for list entry format)\n  // --------------------------------------------------------------------------------\n  function create($p_filelist)\n  {\n    $v_result=1;\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Set default values\n    $v_options = array();\n    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;\n\n    // ----- Look for variable options arguments\n    $v_size = func_num_args();\n\n    // ----- Look for arguments\n    if ($v_size > 1) {\n      // ----- Get the arguments\n      $v_arg_list = func_get_args();\n\n      // ----- Remove from the options list the first argument\n      array_shift($v_arg_list);\n      $v_size--;\n\n      // ----- Look for first arg\n      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n\n        // ----- Parse the options\n        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,\n                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',\n                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                                                   PCLZIP_OPT_ADD_PATH => 'optional',\n                                                   PCLZIP_CB_PRE_ADD => 'optional',\n                                                   PCLZIP_CB_POST_ADD => 'optional',\n                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',\n                                                   PCLZIP_OPT_COMMENT => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                                                   //, PCLZIP_OPT_CRYPT => 'optional'\n                                             ));\n        if ($v_result != 1) {\n          return 0;\n        }\n      }\n\n      // ----- Look for 2 args\n      // Here we need to support the first historic synopsis of the\n      // method.\n      else {\n\n        // ----- Get the first argument\n        $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];\n\n        // ----- Look for the optional second argument\n        if ($v_size == 2) {\n          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];\n        }\n        else if ($v_size > 2) {\n          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,\n\t\t                       \"Invalid number / type of arguments\");\n          return 0;\n        }\n      }\n    }\n\n    // ----- Look for default option values\n    $this->privOptionDefaultThreshold($v_options);\n\n    // ----- Init\n    $v_string_list = array();\n    $v_att_list = array();\n    $v_filedescr_list = array();\n    $p_result_list = array();\n\n    // ----- Look if the $p_filelist is really an array\n    if (is_array($p_filelist)) {\n\n      // ----- Look if the first element is also an array\n      //       This will mean that this is a file description entry\n      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {\n        $v_att_list = $p_filelist;\n      }\n\n      // ----- The list is a list of string names\n      else {\n        $v_string_list = $p_filelist;\n      }\n    }\n\n    // ----- Look if the $p_filelist is a string\n    else if (is_string($p_filelist)) {\n      // ----- Create a list from the string\n      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);\n    }\n\n    // ----- Invalid variable type for $p_filelist\n    else {\n      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_filelist\");\n      return 0;\n    }\n\n    // ----- Reformat the string list\n    if (sizeof($v_string_list) != 0) {\n      foreach ($v_string_list as $v_string) {\n        if ($v_string != '') {\n          $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;\n        }\n        else {\n        }\n      }\n    }\n\n    // ----- For each file in the list check the attributes\n    $v_supported_attributes\n    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'\n             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'\n             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'\n             ,PCLZIP_ATT_FILE_MTIME => 'optional'\n             ,PCLZIP_ATT_FILE_CONTENT => 'optional'\n             ,PCLZIP_ATT_FILE_COMMENT => 'optional'\n\t\t\t\t\t\t);\n    foreach ($v_att_list as $v_entry) {\n      $v_result = $this->privFileDescrParseAtt($v_entry,\n                                               $v_filedescr_list[],\n                                               $v_options,\n                                               $v_supported_attributes);\n      if ($v_result != 1) {\n        return 0;\n      }\n    }\n\n    // ----- Expand the filelist (expand directories)\n    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);\n    if ($v_result != 1) {\n      return 0;\n    }\n\n    // ----- Call the create fct\n    $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);\n    if ($v_result != 1) {\n      return 0;\n    }\n\n    // ----- Return\n    return $p_result_list;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function :\n  //   add($p_filelist, $p_add_dir=\"\", $p_remove_dir=\"\")\n  //   add($p_filelist, $p_option, $p_option_value, ...)\n  // Description :\n  //   This method supports two synopsis. The first one is historical.\n  //   This methods add the list of files in an existing archive.\n  //   If a file with the same name already exists, it is added at the end of the\n  //   archive, the first one is still present.\n  //   If the archive does not exist, it is created.\n  // Parameters :\n  //   $p_filelist : An array containing file or directory names, or\n  //                 a string containing one filename or one directory name, or\n  //                 a string containing a list of filenames and/or directory\n  //                 names separated by spaces.\n  //   $p_add_dir : A path to add before the real path of the archived file,\n  //                in order to have it memorized in the archive.\n  //   $p_remove_dir : A path to remove from the real path of the file to archive,\n  //                   in order to have a shorter path memorized in the archive.\n  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir\n  //                   is removed first, before $p_add_dir is added.\n  // Options :\n  //   PCLZIP_OPT_ADD_PATH :\n  //   PCLZIP_OPT_REMOVE_PATH :\n  //   PCLZIP_OPT_REMOVE_ALL_PATH :\n  //   PCLZIP_OPT_COMMENT :\n  //   PCLZIP_OPT_ADD_COMMENT :\n  //   PCLZIP_OPT_PREPEND_COMMENT :\n  //   PCLZIP_CB_PRE_ADD :\n  //   PCLZIP_CB_POST_ADD :\n  // Return Values :\n  //   0 on failure,\n  //   The list of the added files, with a status of the add action.\n  //   (see PclZip::listContent() for list entry format)\n  // --------------------------------------------------------------------------------\n  function add($p_filelist)\n  {\n    $v_result=1;\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Set default values\n    $v_options = array();\n    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;\n\n    // ----- Look for variable options arguments\n    $v_size = func_num_args();\n\n    // ----- Look for arguments\n    if ($v_size > 1) {\n      // ----- Get the arguments\n      $v_arg_list = func_get_args();\n\n      // ----- Remove form the options list the first argument\n      array_shift($v_arg_list);\n      $v_size--;\n\n      // ----- Look for first arg\n      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n\n        // ----- Parse the options\n        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,\n                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',\n                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                                                   PCLZIP_OPT_ADD_PATH => 'optional',\n                                                   PCLZIP_CB_PRE_ADD => 'optional',\n                                                   PCLZIP_CB_POST_ADD => 'optional',\n                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',\n                                                   PCLZIP_OPT_COMMENT => 'optional',\n                                                   PCLZIP_OPT_ADD_COMMENT => 'optional',\n                                                   PCLZIP_OPT_PREPEND_COMMENT => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n                                                   //, PCLZIP_OPT_CRYPT => 'optional'\n\t\t\t\t\t\t\t\t\t\t\t\t   ));\n        if ($v_result != 1) {\n          return 0;\n        }\n      }\n\n      // ----- Look for 2 args\n      // Here we need to support the first historic synopsis of the\n      // method.\n      else {\n\n        // ----- Get the first argument\n        $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];\n\n        // ----- Look for the optional second argument\n        if ($v_size == 2) {\n          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];\n        }\n        else if ($v_size > 2) {\n          // ----- Error log\n          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n          // ----- Return\n          return 0;\n        }\n      }\n    }\n\n    // ----- Look for default option values\n    $this->privOptionDefaultThreshold($v_options);\n\n    // ----- Init\n    $v_string_list = array();\n    $v_att_list = array();\n    $v_filedescr_list = array();\n    $p_result_list = array();\n\n    // ----- Look if the $p_filelist is really an array\n    if (is_array($p_filelist)) {\n\n      // ----- Look if the first element is also an array\n      //       This will mean that this is a file description entry\n      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {\n        $v_att_list = $p_filelist;\n      }\n\n      // ----- The list is a list of string names\n      else {\n        $v_string_list = $p_filelist;\n      }\n    }\n\n    // ----- Look if the $p_filelist is a string\n    else if (is_string($p_filelist)) {\n      // ----- Create a list from the string\n      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);\n    }\n\n    // ----- Invalid variable type for $p_filelist\n    else {\n      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type '\".gettype($p_filelist).\"' for p_filelist\");\n      return 0;\n    }\n\n    // ----- Reformat the string list\n    if (sizeof($v_string_list) != 0) {\n      foreach ($v_string_list as $v_string) {\n        $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;\n      }\n    }\n\n    // ----- For each file in the list check the attributes\n    $v_supported_attributes\n    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'\n             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'\n             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'\n             ,PCLZIP_ATT_FILE_MTIME => 'optional'\n             ,PCLZIP_ATT_FILE_CONTENT => 'optional'\n             ,PCLZIP_ATT_FILE_COMMENT => 'optional'\n\t\t\t\t\t\t);\n    foreach ($v_att_list as $v_entry) {\n      $v_result = $this->privFileDescrParseAtt($v_entry,\n                                               $v_filedescr_list[],\n                                               $v_options,\n                                               $v_supported_attributes);\n      if ($v_result != 1) {\n        return 0;\n      }\n    }\n\n    // ----- Expand the filelist (expand directories)\n    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);\n    if ($v_result != 1) {\n      return 0;\n    }\n\n    // ----- Call the create fct\n    $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);\n    if ($v_result != 1) {\n      return 0;\n    }\n\n    // ----- Return\n    return $p_result_list;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : listContent()\n  // Description :\n  //   This public method, gives the list of the files and directories, with their\n  //   properties.\n  //   The properties of each entries in the list are (used also in other functions) :\n  //     filename : Name of the file. For a create or add action it is the filename\n  //                given by the user. For an extract function it is the filename\n  //                of the extracted file.\n  //     stored_filename : Name of the file / directory stored in the archive.\n  //     size : Size of the stored file.\n  //     compressed_size : Size of the file's data compressed in the archive\n  //                       (without the headers overhead)\n  //     mtime : Last known modification date of the file (UNIX timestamp)\n  //     comment : Comment associated with the file\n  //     folder : true | false\n  //     index : index of the file in the archive\n  //     status : status of the action (depending of the action) :\n  //              Values are :\n  //                ok : OK !\n  //                filtered : the file / dir is not extracted (filtered by user)\n  //                already_a_directory : the file can not be extracted because a\n  //                                      directory with the same name already exists\n  //                write_protected : the file can not be extracted because a file\n  //                                  with the same name already exists and is\n  //                                  write protected\n  //                newer_exist : the file was not extracted because a newer file exists\n  //                path_creation_fail : the file is not extracted because the folder\n  //                                     does not exist and can not be created\n  //                write_error : the file was not extracted because there was a\n  //                              error while writing the file\n  //                read_error : the file was not extracted because there was a error\n  //                             while reading the file\n  //                invalid_header : the file was not extracted because of an archive\n  //                                 format error (bad file header)\n  //   Note that each time a method can continue operating when there\n  //   is an action error on a file, the error is only logged in the file status.\n  // Return Values :\n  //   0 on an unrecoverable failure,\n  //   The list of the files in the archive.\n  // --------------------------------------------------------------------------------\n  function listContent()\n  {\n    $v_result=1;\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Check archive\n    if (!$this->privCheckFormat()) {\n      return(0);\n    }\n\n    // ----- Call the extracting fct\n    $p_list = array();\n    if (($v_result = $this->privList($p_list)) != 1)\n    {\n      unset($p_list);\n      return(0);\n    }\n\n    // ----- Return\n    return $p_list;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function :\n  //   extract($p_path=\"./\", $p_remove_path=\"\")\n  //   extract([$p_option, $p_option_value, ...])\n  // Description :\n  //   This method supports two synopsis. The first one is historical.\n  //   This method extract all the files / directories from the archive to the\n  //   folder indicated in $p_path.\n  //   If you want to ignore the 'root' part of path of the memorized files\n  //   you can indicate this in the optional $p_remove_path parameter.\n  //   By default, if a newer file with the same name already exists, the\n  //   file is not extracted.\n  //\n  //   If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions\n  //   are used, the path indicated in PCLZIP_OPT_ADD_PATH is append\n  //   at the end of the path value of PCLZIP_OPT_PATH.\n  // Parameters :\n  //   $p_path : Path where the files and directories are to be extracted\n  //   $p_remove_path : First part ('root' part) of the memorized path\n  //                    (if any similar) to remove while extracting.\n  // Options :\n  //   PCLZIP_OPT_PATH :\n  //   PCLZIP_OPT_ADD_PATH :\n  //   PCLZIP_OPT_REMOVE_PATH :\n  //   PCLZIP_OPT_REMOVE_ALL_PATH :\n  //   PCLZIP_CB_PRE_EXTRACT :\n  //   PCLZIP_CB_POST_EXTRACT :\n  // Return Values :\n  //   0 or a negative value on failure,\n  //   The list of the extracted files, with a status of the action.\n  //   (see PclZip::listContent() for list entry format)\n  // --------------------------------------------------------------------------------\n  function extract()\n  {\n    $v_result=1;\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Check archive\n    if (!$this->privCheckFormat()) {\n      return(0);\n    }\n\n    // ----- Set default values\n    $v_options = array();\n//    $v_path = \"./\";\n    $v_path = '';\n    $v_remove_path = \"\";\n    $v_remove_all_path = false;\n\n    // ----- Look for variable options arguments\n    $v_size = func_num_args();\n\n    // ----- Default values for option\n    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;\n\n    // ----- Look for arguments\n    if ($v_size > 0) {\n      // ----- Get the arguments\n      $v_arg_list = func_get_args();\n\n      // ----- Look for first arg\n      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n\n        // ----- Parse the options\n        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,\n                                            array (PCLZIP_OPT_PATH => 'optional',\n                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',\n                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                                                   PCLZIP_OPT_ADD_PATH => 'optional',\n                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',\n                                                   PCLZIP_CB_POST_EXTRACT => 'optional',\n                                                   PCLZIP_OPT_SET_CHMOD => 'optional',\n                                                   PCLZIP_OPT_BY_NAME => 'optional',\n                                                   PCLZIP_OPT_BY_EREG => 'optional',\n                                                   PCLZIP_OPT_BY_PREG => 'optional',\n                                                   PCLZIP_OPT_BY_INDEX => 'optional',\n                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',\n                                                   PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',\n                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'\n                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'\n                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n\t\t\t\t\t\t\t\t\t\t\t\t    ));\n        if ($v_result != 1) {\n          return 0;\n        }\n\n        // ----- Set the arguments\n        if (isset($v_options[PCLZIP_OPT_PATH])) {\n          $v_path = $v_options[PCLZIP_OPT_PATH];\n        }\n        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {\n          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];\n        }\n        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n        }\n        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {\n          // ----- Check for '/' in last path char\n          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {\n            $v_path .= '/';\n          }\n          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];\n        }\n      }\n\n      // ----- Look for 2 args\n      // Here we need to support the first historic synopsis of the\n      // method.\n      else {\n\n        // ----- Get the first argument\n        $v_path = $v_arg_list[0];\n\n        // ----- Look for the optional second argument\n        if ($v_size == 2) {\n          $v_remove_path = $v_arg_list[1];\n        }\n        else if ($v_size > 2) {\n          // ----- Error log\n          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n          // ----- Return\n          return 0;\n        }\n      }\n    }\n\n    // ----- Look for default option values\n    $this->privOptionDefaultThreshold($v_options);\n\n    // ----- Trace\n\n    // ----- Call the extracting fct\n    $p_list = array();\n    $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,\n\t                                     $v_remove_all_path, $v_options);\n    if ($v_result < 1) {\n      unset($p_list);\n      return(0);\n    }\n\n    // ----- Return\n    return $p_list;\n  }\n  // --------------------------------------------------------------------------------\n\n\n  // --------------------------------------------------------------------------------\n  // Function :\n  //   extractByIndex($p_index, $p_path=\"./\", $p_remove_path=\"\")\n  //   extractByIndex($p_index, [$p_option, $p_option_value, ...])\n  // Description :\n  //   This method supports two synopsis. The first one is historical.\n  //   This method is doing a partial extract of the archive.\n  //   The extracted files or folders are identified by their index in the\n  //   archive (from 0 to n).\n  //   Note that if the index identify a folder, only the folder entry is\n  //   extracted, not all the files included in the archive.\n  // Parameters :\n  //   $p_index : A single index (integer) or a string of indexes of files to\n  //              extract. The form of the string is \"0,4-6,8-12\" with only numbers\n  //              and '-' for range or ',' to separate ranges. No spaces or ';'\n  //              are allowed.\n  //   $p_path : Path where the files and directories are to be extracted\n  //   $p_remove_path : First part ('root' part) of the memorized path\n  //                    (if any similar) to remove while extracting.\n  // Options :\n  //   PCLZIP_OPT_PATH :\n  //   PCLZIP_OPT_ADD_PATH :\n  //   PCLZIP_OPT_REMOVE_PATH :\n  //   PCLZIP_OPT_REMOVE_ALL_PATH :\n  //   PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and\n  //     not as files.\n  //     The resulting content is in a new field 'content' in the file\n  //     structure.\n  //     This option must be used alone (any other options are ignored).\n  //   PCLZIP_CB_PRE_EXTRACT :\n  //   PCLZIP_CB_POST_EXTRACT :\n  // Return Values :\n  //   0 on failure,\n  //   The list of the extracted files, with a status of the action.\n  //   (see PclZip::listContent() for list entry format)\n  // --------------------------------------------------------------------------------\n  //function extractByIndex($p_index, options...)\n  function extractByIndex($p_index)\n  {\n    $v_result=1;\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Check archive\n    if (!$this->privCheckFormat()) {\n      return(0);\n    }\n\n    // ----- Set default values\n    $v_options = array();\n//    $v_path = \"./\";\n    $v_path = '';\n    $v_remove_path = \"\";\n    $v_remove_all_path = false;\n\n    // ----- Look for variable options arguments\n    $v_size = func_num_args();\n\n    // ----- Default values for option\n    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;\n\n    // ----- Look for arguments\n    if ($v_size > 1) {\n      // ----- Get the arguments\n      $v_arg_list = func_get_args();\n\n      // ----- Remove form the options list the first argument\n      array_shift($v_arg_list);\n      $v_size--;\n\n      // ----- Look for first arg\n      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {\n\n        // ----- Parse the options\n        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,\n                                            array (PCLZIP_OPT_PATH => 'optional',\n                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',\n                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',\n                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',\n                                                   PCLZIP_OPT_ADD_PATH => 'optional',\n                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',\n                                                   PCLZIP_CB_POST_EXTRACT => 'optional',\n                                                   PCLZIP_OPT_SET_CHMOD => 'optional',\n                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'\n                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'\n                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',\n                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'\n\t\t\t\t\t\t\t\t\t\t\t\t   ));\n        if ($v_result != 1) {\n          return 0;\n        }\n\n        // ----- Set the arguments\n        if (isset($v_options[PCLZIP_OPT_PATH])) {\n          $v_path = $v_options[PCLZIP_OPT_PATH];\n        }\n        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {\n          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];\n        }\n        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n        }\n        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {\n          // ----- Check for '/' in last path char\n          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {\n            $v_path .= '/';\n          }\n          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];\n        }\n        if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {\n          $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;\n        }\n        else {\n        }\n      }\n\n      // ----- Look for 2 args\n      // Here we need to support the first historic synopsis of the\n      // method.\n      else {\n\n        // ----- Get the first argument\n        $v_path = $v_arg_list[0];\n\n        // ----- Look for the optional second argument\n        if ($v_size == 2) {\n          $v_remove_path = $v_arg_list[1];\n        }\n        else if ($v_size > 2) {\n          // ----- Error log\n          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid number / type of arguments\");\n\n          // ----- Return\n          return 0;\n        }\n      }\n    }\n\n    // ----- Trace\n\n    // ----- Trick\n    // Here I want to reuse extractByRule(), so I need to parse the $p_index\n    // with privParseOptions()\n    $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);\n    $v_options_trick = array();\n    $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,\n                                        array (PCLZIP_OPT_BY_INDEX => 'optional' ));\n    if ($v_result != 1) {\n        return 0;\n    }\n    $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];\n\n    // ----- Look for default option values\n    $this->privOptionDefaultThreshold($v_options);\n\n    // ----- Call the extracting fct\n    if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {\n        return(0);\n    }\n\n    // ----- Return\n    return $p_list;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function :\n  //   delete([$p_option, $p_option_value, ...])\n  // Description :\n  //   This method removes files from the archive.\n  //   If no parameters are given, then all the archive is emptied.\n  // Parameters :\n  //   None or optional arguments.\n  // Options :\n  //   PCLZIP_OPT_BY_INDEX :\n  //   PCLZIP_OPT_BY_NAME :\n  //   PCLZIP_OPT_BY_EREG :\n  //   PCLZIP_OPT_BY_PREG :\n  // Return Values :\n  //   0 on failure,\n  //   The list of the files which are still present in the archive.\n  //   (see PclZip::listContent() for list entry format)\n  // --------------------------------------------------------------------------------\n  function delete()\n  {\n    $v_result=1;\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Check archive\n    if (!$this->privCheckFormat()) {\n      return(0);\n    }\n\n    // ----- Set default values\n    $v_options = array();\n\n    // ----- Look for variable options arguments\n    $v_size = func_num_args();\n\n    // ----- Look for arguments\n    if ($v_size > 0) {\n      // ----- Get the arguments\n      $v_arg_list = func_get_args();\n\n      // ----- Parse the options\n      $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,\n                                        array (PCLZIP_OPT_BY_NAME => 'optional',\n                                               PCLZIP_OPT_BY_EREG => 'optional',\n                                               PCLZIP_OPT_BY_PREG => 'optional',\n                                               PCLZIP_OPT_BY_INDEX => 'optional' ));\n      if ($v_result != 1) {\n          return 0;\n      }\n    }\n\n    // ----- Magic quotes trick\n    $this->privDisableMagicQuotes();\n\n    // ----- Call the delete fct\n    $v_list = array();\n    if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {\n      $this->privSwapBackMagicQuotes();\n      unset($v_list);\n      return(0);\n    }\n\n    // ----- Magic quotes trick\n    $this->privSwapBackMagicQuotes();\n\n    // ----- Return\n    return $v_list;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : deleteByIndex()\n  // Description :\n  //   ***** Deprecated *****\n  //   delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered.\n  // --------------------------------------------------------------------------------\n  function deleteByIndex($p_index)\n  {\n\n    $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);\n\n    // ----- Return\n    return $p_list;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : properties()\n  // Description :\n  //   This method gives the properties of the archive.\n  //   The properties are :\n  //     nb : Number of files in the archive\n  //     comment : Comment associated with the archive file\n  //     status : not_exist, ok\n  // Parameters :\n  //   None\n  // Return Values :\n  //   0 on failure,\n  //   An array with the archive properties.\n  // --------------------------------------------------------------------------------\n  function properties()\n  {\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Magic quotes trick\n    $this->privDisableMagicQuotes();\n\n    // ----- Check archive\n    if (!$this->privCheckFormat()) {\n      $this->privSwapBackMagicQuotes();\n      return(0);\n    }\n\n    // ----- Default properties\n    $v_prop = array();\n    $v_prop['comment'] = '';\n    $v_prop['nb'] = 0;\n    $v_prop['status'] = 'not_exist';\n\n    // ----- Look if file exists\n    if (@is_file($this->zipname))\n    {\n      // ----- Open the zip file\n      if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)\n      {\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\''.$this->zipname.'\\' in binary read mode');\n\n        // ----- Return\n        return 0;\n      }\n\n      // ----- Read the central directory informations\n      $v_central_dir = array();\n      if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)\n      {\n        $this->privSwapBackMagicQuotes();\n        return 0;\n      }\n\n      // ----- Close the zip file\n      $this->privCloseFd();\n\n      // ----- Set the user attributes\n      $v_prop['comment'] = $v_central_dir['comment'];\n      $v_prop['nb'] = $v_central_dir['entries'];\n      $v_prop['status'] = 'ok';\n    }\n\n    // ----- Magic quotes trick\n    $this->privSwapBackMagicQuotes();\n\n    // ----- Return\n    return $v_prop;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : duplicate()\n  // Description :\n  //   This method creates an archive by copying the content of an other one. If\n  //   the archive already exist, it is replaced by the new one without any warning.\n  // Parameters :\n  //   $p_archive : The filename of a valid archive, or\n  //                a valid PclZip object.\n  // Return Values :\n  //   1 on success.\n  //   0 or a negative value on error (error code).\n  // --------------------------------------------------------------------------------\n  function duplicate($p_archive)\n  {\n    $v_result = 1;\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Look if the $p_archive is a PclZip object\n    if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))\n    {\n\n      // ----- Duplicate the archive\n      $v_result = $this->privDuplicate($p_archive->zipname);\n    }\n\n    // ----- Look if the $p_archive is a string (so a filename)\n    else if (is_string($p_archive))\n    {\n\n      // ----- Check that $p_archive is a valid zip file\n      // TBC : Should also check the archive format\n      if (!is_file($p_archive)) {\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"No file with filename '\".$p_archive.\"'\");\n        $v_result = PCLZIP_ERR_MISSING_FILE;\n      }\n      else {\n        // ----- Duplicate the archive\n        $v_result = $this->privDuplicate($p_archive);\n      }\n    }\n\n    // ----- Invalid variable\n    else\n    {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_archive_to_add\");\n      $v_result = PCLZIP_ERR_INVALID_PARAMETER;\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : merge()\n  // Description :\n  //   This method merge the $p_archive_to_add archive at the end of the current\n  //   one ($this).\n  //   If the archive ($this) does not exist, the merge becomes a duplicate.\n  //   If the $p_archive_to_add archive does not exist, the merge is a success.\n  // Parameters :\n  //   $p_archive_to_add : It can be directly the filename of a valid zip archive,\n  //                       or a PclZip object archive.\n  // Return Values :\n  //   1 on success,\n  //   0 or negative values on error (see below).\n  // --------------------------------------------------------------------------------\n  function merge($p_archive_to_add)\n  {\n    $v_result = 1;\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Check archive\n    if (!$this->privCheckFormat()) {\n      return(0);\n    }\n\n    // ----- Look if the $p_archive_to_add is a PclZip object\n    if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))\n    {\n\n      // ----- Merge the archive\n      $v_result = $this->privMerge($p_archive_to_add);\n    }\n\n    // ----- Look if the $p_archive_to_add is a string (so a filename)\n    else if (is_string($p_archive_to_add))\n    {\n\n      // ----- Create a temporary archive\n      $v_object_archive = new PclZip($p_archive_to_add);\n\n      // ----- Merge the archive\n      $v_result = $this->privMerge($v_object_archive);\n    }\n\n    // ----- Invalid variable\n    else\n    {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid variable type p_archive_to_add\");\n      $v_result = PCLZIP_ERR_INVALID_PARAMETER;\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n\n\n  // --------------------------------------------------------------------------------\n  // Function : errorCode()\n  // Description :\n  // Parameters :\n  // --------------------------------------------------------------------------------\n  function errorCode()\n  {\n    if (PCLZIP_ERROR_EXTERNAL == 1) {\n      return(PclErrorCode());\n    }\n    else {\n      return($this->error_code);\n    }\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : errorName()\n  // Description :\n  // Parameters :\n  // --------------------------------------------------------------------------------\n  function errorName($p_with_code=false)\n  {\n    $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',\n                      PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',\n                      PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',\n                      PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',\n                      PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',\n                      PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',\n                      PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',\n                      PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',\n                      PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',\n                      PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',\n                      PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',\n                      PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',\n                      PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',\n                      PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',\n                      PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',\n                      PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',\n                      PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',\n                      PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',\n                      PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'\n                      ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'\n                      ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'\n                    );\n\n    if (isset($v_name[$this->error_code])) {\n      $v_value = $v_name[$this->error_code];\n    }\n    else {\n      $v_value = 'NoName';\n    }\n\n    if ($p_with_code) {\n      return($v_value.' ('.$this->error_code.')');\n    }\n    else {\n      return($v_value);\n    }\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : errorInfo()\n  // Description :\n  // Parameters :\n  // --------------------------------------------------------------------------------\n  function errorInfo($p_full=false)\n  {\n    if (PCLZIP_ERROR_EXTERNAL == 1) {\n      return(PclErrorString());\n    }\n    else {\n      if ($p_full) {\n        return($this->errorName(true).\" : \".$this->error_string);\n      }\n      else {\n        return($this->error_string.\" [code \".$this->error_code.\"]\");\n      }\n    }\n  }\n  // --------------------------------------------------------------------------------\n\n\n// --------------------------------------------------------------------------------\n// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****\n// *****                                                        *****\n// *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY       *****\n// --------------------------------------------------------------------------------\n\n\n\n  // --------------------------------------------------------------------------------\n  // Function : privCheckFormat()\n  // Description :\n  //   This method check that the archive exists and is a valid zip archive.\n  //   Several level of check exists. (futur)\n  // Parameters :\n  //   $p_level : Level of check. Default 0.\n  //              0 : Check the first bytes (magic codes) (default value))\n  //              1 : 0 + Check the central directory (futur)\n  //              2 : 1 + Check each file header (futur)\n  // Return Values :\n  //   true on success,\n  //   false on error, the error code is set.\n  // --------------------------------------------------------------------------------\n  function privCheckFormat($p_level=0)\n  {\n    $v_result = true;\n\n\t// ----- Reset the file system cache\n    clearstatcache();\n\n    // ----- Reset the error handler\n    $this->privErrorReset();\n\n    // ----- Look if the file exits\n    if (!is_file($this->zipname)) {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"Missing archive file '\".$this->zipname.\"'\");\n      return(false);\n    }\n\n    // ----- Check that the file is readeable\n    if (!is_readable($this->zipname)) {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to read archive '\".$this->zipname.\"'\");\n      return(false);\n    }\n\n    // ----- Check the magic code\n    // TBC\n\n    // ----- Check the central header\n    // TBC\n\n    // ----- Check each file header\n    // TBC\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privParseOptions()\n  // Description :\n  //   This internal methods reads the variable list of arguments ($p_options_list,\n  //   $p_size) and generate an array with the options and values ($v_result_list).\n  //   $v_requested_options contains the options that can be present and those that\n  //   must be present.\n  //   $v_requested_options is an array, with the option value as key, and 'optional',\n  //   or 'mandatory' as value.\n  // Parameters :\n  //   See above.\n  // Return Values :\n  //   1 on success.\n  //   0 on failure.\n  // --------------------------------------------------------------------------------\n  function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)\n  {\n    $v_result=1;\n\n    // ----- Read the options\n    $i=0;\n    while ($i<$p_size) {\n\n      // ----- Check if the option is supported\n      if (!isset($v_requested_options[$p_options_list[$i]])) {\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid optional parameter '\".$p_options_list[$i].\"' for this method\");\n\n        // ----- Return\n        return PclZip::errorCode();\n      }\n\n      // ----- Look for next option\n      switch ($p_options_list[$i]) {\n        // ----- Look for options that request a path value\n        case PCLZIP_OPT_PATH :\n        case PCLZIP_OPT_REMOVE_PATH :\n        case PCLZIP_OPT_ADD_PATH :\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value\n          $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);\n          $i++;\n        break;\n\n        case PCLZIP_OPT_TEMP_FILE_THRESHOLD :\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n            return PclZip::errorCode();\n          }\n\n          // ----- Check for incompatible options\n          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\".PclZipUtilOptionText($p_options_list[$i]).\"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'\");\n            return PclZip::errorCode();\n          }\n\n          // ----- Check the value\n          $v_value = $p_options_list[$i+1];\n          if ((!is_integer($v_value)) || ($v_value<0)) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Integer expected for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value (and convert it in bytes)\n          $v_result_list[$p_options_list[$i]] = $v_value*1048576;\n          $i++;\n        break;\n\n        case PCLZIP_OPT_TEMP_FILE_ON :\n          // ----- Check for incompatible options\n          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\".PclZipUtilOptionText($p_options_list[$i]).\"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'\");\n            return PclZip::errorCode();\n          }\n\n          $v_result_list[$p_options_list[$i]] = true;\n        break;\n\n        case PCLZIP_OPT_TEMP_FILE_OFF :\n          // ----- Check for incompatible options\n          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\".PclZipUtilOptionText($p_options_list[$i]).\"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'\");\n            return PclZip::errorCode();\n          }\n          // ----- Check for incompatible options\n          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Option '\".PclZipUtilOptionText($p_options_list[$i]).\"' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'\");\n            return PclZip::errorCode();\n          }\n\n          $v_result_list[$p_options_list[$i]] = true;\n        break;\n\n        case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value\n          if (   is_string($p_options_list[$i+1])\n              && ($p_options_list[$i+1] != '')) {\n            $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);\n            $i++;\n          }\n          else {\n          }\n        break;\n\n        // ----- Look for options that request an array of string for value\n        case PCLZIP_OPT_BY_NAME :\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value\n          if (is_string($p_options_list[$i+1])) {\n              $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];\n          }\n          else if (is_array($p_options_list[$i+1])) {\n              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];\n          }\n          else {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Wrong parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n          $i++;\n        break;\n\n        // ----- Look for options that request an EREG or PREG expression\n        case PCLZIP_OPT_BY_EREG :\n          // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG\n          // to PCLZIP_OPT_BY_PREG\n          $p_options_list[$i] = PCLZIP_OPT_BY_PREG;\n        case PCLZIP_OPT_BY_PREG :\n        //case PCLZIP_OPT_CRYPT :\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value\n          if (is_string($p_options_list[$i+1])) {\n              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];\n          }\n          else {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Wrong parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n          $i++;\n        break;\n\n        // ----- Look for options that takes a string\n        case PCLZIP_OPT_COMMENT :\n        case PCLZIP_OPT_ADD_COMMENT :\n        case PCLZIP_OPT_PREPEND_COMMENT :\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,\n\t\t\t                     \"Missing parameter value for option '\"\n\t\t\t\t\t\t\t\t .PclZipUtilOptionText($p_options_list[$i])\n\t\t\t\t\t\t\t\t .\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value\n          if (is_string($p_options_list[$i+1])) {\n              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];\n          }\n          else {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,\n\t\t\t                     \"Wrong parameter value for option '\"\n\t\t\t\t\t\t\t\t .PclZipUtilOptionText($p_options_list[$i])\n\t\t\t\t\t\t\t\t .\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n          $i++;\n        break;\n\n        // ----- Look for options that request an array of index\n        case PCLZIP_OPT_BY_INDEX :\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value\n          $v_work_list = array();\n          if (is_string($p_options_list[$i+1])) {\n\n              // ----- Remove spaces\n              $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');\n\n              // ----- Parse items\n              $v_work_list = explode(\",\", $p_options_list[$i+1]);\n          }\n          else if (is_integer($p_options_list[$i+1])) {\n              $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];\n          }\n          else if (is_array($p_options_list[$i+1])) {\n              $v_work_list = $p_options_list[$i+1];\n          }\n          else {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Value must be integer, string or array for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Reduce the index list\n          // each index item in the list must be a couple with a start and\n          // an end value : [0,3], [5-5], [8-10], ...\n          // ----- Check the format of each item\n          $v_sort_flag=false;\n          $v_sort_value=0;\n          for ($j=0; $j<sizeof($v_work_list); $j++) {\n              // ----- Explode the item\n              $v_item_list = explode(\"-\", $v_work_list[$j]);\n              $v_size_item_list = sizeof($v_item_list);\n\n              // ----- TBC : Here we might check that each item is a\n              // real integer ...\n\n              // ----- Look for single value\n              if ($v_size_item_list == 1) {\n                  // ----- Set the option value\n                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];\n                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];\n              }\n              elseif ($v_size_item_list == 2) {\n                  // ----- Set the option value\n                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];\n                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];\n              }\n              else {\n                  // ----- Error log\n                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Too many values in index range for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n                  // ----- Return\n                  return PclZip::errorCode();\n              }\n\n\n              // ----- Look for list sort\n              if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {\n                  $v_sort_flag=true;\n\n                  // ----- TBC : An automatic sort should be writen ...\n                  // ----- Error log\n                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Invalid order of index range for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n                  // ----- Return\n                  return PclZip::errorCode();\n              }\n              $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];\n          }\n\n          // ----- Sort the items\n          if ($v_sort_flag) {\n              // TBC : To Be Completed\n          }\n\n          // ----- Next option\n          $i++;\n        break;\n\n        // ----- Look for options that request no value\n        case PCLZIP_OPT_REMOVE_ALL_PATH :\n        case PCLZIP_OPT_EXTRACT_AS_STRING :\n        case PCLZIP_OPT_NO_COMPRESSION :\n        case PCLZIP_OPT_EXTRACT_IN_OUTPUT :\n        case PCLZIP_OPT_REPLACE_NEWER :\n        case PCLZIP_OPT_STOP_ON_ERROR :\n          $v_result_list[$p_options_list[$i]] = true;\n        break;\n\n        // ----- Look for options that request an octal value\n        case PCLZIP_OPT_SET_CHMOD :\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value\n          $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];\n          $i++;\n        break;\n\n        // ----- Look for options that request a call-back\n        case PCLZIP_CB_PRE_EXTRACT :\n        case PCLZIP_CB_POST_EXTRACT :\n        case PCLZIP_CB_PRE_ADD :\n        case PCLZIP_CB_POST_ADD :\n        /* for futur use\n        case PCLZIP_CB_PRE_DELETE :\n        case PCLZIP_CB_POST_DELETE :\n        case PCLZIP_CB_PRE_LIST :\n        case PCLZIP_CB_POST_LIST :\n        */\n          // ----- Check the number of parameters\n          if (($i+1) >= $p_size) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, \"Missing parameter value for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Get the value\n          $v_function_name = $p_options_list[$i+1];\n\n          // ----- Check that the value is a valid existing function\n          if (!function_exists($v_function_name)) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, \"Function '\".$v_function_name.\"()' is not an existing function for option '\".PclZipUtilOptionText($p_options_list[$i]).\"'\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n\n          // ----- Set the attribute\n          $v_result_list[$p_options_list[$i]] = $v_function_name;\n          $i++;\n        break;\n\n        default :\n          // ----- Error log\n          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,\n\t\t                       \"Unknown parameter '\"\n\t\t\t\t\t\t\t   .$p_options_list[$i].\"'\");\n\n          // ----- Return\n          return PclZip::errorCode();\n      }\n\n      // ----- Next options\n      $i++;\n    }\n\n    // ----- Look for mandatory options\n    if ($v_requested_options !== false) {\n      for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {\n        // ----- Look for mandatory option\n        if ($v_requested_options[$key] == 'mandatory') {\n          // ----- Look if present\n          if (!isset($v_result_list[$key])) {\n            // ----- Error log\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Missing mandatory parameter \".PclZipUtilOptionText($key).\"(\".$key.\")\");\n\n            // ----- Return\n            return PclZip::errorCode();\n          }\n        }\n      }\n    }\n\n    // ----- Look for default values\n    if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {\n\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privOptionDefaultThreshold()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privOptionDefaultThreshold(&$p_options)\n  {\n    $v_result=1;\n\n    if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])\n        || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) {\n      return $v_result;\n    }\n\n    // ----- Get 'memory_limit' configuration value\n    $v_memory_limit = ini_get('memory_limit');\n    $v_memory_limit = trim($v_memory_limit);\n    $last = strtolower(substr($v_memory_limit, -1));\n\n    if($last == 'g')\n        //$v_memory_limit = $v_memory_limit*1024*1024*1024;\n        $v_memory_limit = $v_memory_limit*1073741824;\n    if($last == 'm')\n        //$v_memory_limit = $v_memory_limit*1024*1024;\n        $v_memory_limit = $v_memory_limit*1048576;\n    if($last == 'k')\n        $v_memory_limit = $v_memory_limit*1024;\n\n    $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO);\n\n\n    // ----- Sanity check : No threshold if value lower than 1M\n    if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {\n      unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]);\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privFileDescrParseAtt()\n  // Description :\n  // Parameters :\n  // Return Values :\n  //   1 on success.\n  //   0 on failure.\n  // --------------------------------------------------------------------------------\n  function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)\n  {\n    $v_result=1;\n\n    // ----- For each file in the list check the attributes\n    foreach ($p_file_list as $v_key => $v_value) {\n\n      // ----- Check if the option is supported\n      if (!isset($v_requested_options[$v_key])) {\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid file attribute '\".$v_key.\"' for this file\");\n\n        // ----- Return\n        return PclZip::errorCode();\n      }\n\n      // ----- Look for attribute\n      switch ($v_key) {\n        case PCLZIP_ATT_FILE_NAME :\n          if (!is_string($v_value)) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". String expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n            return PclZip::errorCode();\n          }\n\n          $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);\n\n          if ($p_filedescr['filename'] == '') {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty filename for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n            return PclZip::errorCode();\n          }\n\n        break;\n\n        case PCLZIP_ATT_FILE_NEW_SHORT_NAME :\n          if (!is_string($v_value)) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". String expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n            return PclZip::errorCode();\n          }\n\n          $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);\n\n          if ($p_filedescr['new_short_name'] == '') {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty short filename for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n            return PclZip::errorCode();\n          }\n        break;\n\n        case PCLZIP_ATT_FILE_NEW_FULL_NAME :\n          if (!is_string($v_value)) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". String expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n            return PclZip::errorCode();\n          }\n\n          $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);\n\n          if ($p_filedescr['new_full_name'] == '') {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid empty full filename for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n            return PclZip::errorCode();\n          }\n        break;\n\n        // ----- Look for options that takes a string\n        case PCLZIP_ATT_FILE_COMMENT :\n          if (!is_string($v_value)) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". String expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n            return PclZip::errorCode();\n          }\n\n          $p_filedescr['comment'] = $v_value;\n        break;\n\n        case PCLZIP_ATT_FILE_MTIME :\n          if (!is_integer($v_value)) {\n            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, \"Invalid type \".gettype($v_value).\". Integer expected for attribute '\".PclZipUtilOptionText($v_key).\"'\");\n            return PclZip::errorCode();\n          }\n\n          $p_filedescr['mtime'] = $v_value;\n        break;\n\n        case PCLZIP_ATT_FILE_CONTENT :\n          $p_filedescr['content'] = $v_value;\n        break;\n\n        default :\n          // ----- Error log\n          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,\n\t\t                           \"Unknown parameter '\".$v_key.\"'\");\n\n          // ----- Return\n          return PclZip::errorCode();\n      }\n\n      // ----- Look for mandatory options\n      if ($v_requested_options !== false) {\n        for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {\n          // ----- Look for mandatory option\n          if ($v_requested_options[$key] == 'mandatory') {\n            // ----- Look if present\n            if (!isset($p_file_list[$key])) {\n              PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Missing mandatory parameter \".PclZipUtilOptionText($key).\"(\".$key.\")\");\n              return PclZip::errorCode();\n            }\n          }\n        }\n      }\n\n    // end foreach\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privFileDescrExpand()\n  // Description :\n  //   This method look for each item of the list to see if its a file, a folder\n  //   or a string to be added as file. For any other type of files (link, other)\n  //   just ignore the item.\n  //   Then prepare the information that will be stored for that file.\n  //   When its a folder, expand the folder with all the files that are in that\n  //   folder (recursively).\n  // Parameters :\n  // Return Values :\n  //   1 on success.\n  //   0 on failure.\n  // --------------------------------------------------------------------------------\n  function privFileDescrExpand(&$p_filedescr_list, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Create a result list\n    $v_result_list = array();\n\n    // ----- Look each entry\n    for ($i=0; $i<sizeof($p_filedescr_list); $i++) {\n\n      // ----- Get filedescr\n      $v_descr = $p_filedescr_list[$i];\n\n      // ----- Reduce the filename\n      $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);\n      $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);\n\n      // ----- Look for real file or folder\n      if (file_exists($v_descr['filename'])) {\n        if (@is_file($v_descr['filename'])) {\n          $v_descr['type'] = 'file';\n        }\n        else if (@is_dir($v_descr['filename'])) {\n          $v_descr['type'] = 'folder';\n        }\n        else if (@is_link($v_descr['filename'])) {\n          // skip\n          continue;\n        }\n        else {\n          // skip\n          continue;\n        }\n      }\n\n      // ----- Look for string added as file\n      else if (isset($v_descr['content'])) {\n        $v_descr['type'] = 'virtual_file';\n      }\n\n      // ----- Missing file\n      else {\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"File '\".$v_descr['filename'].\"' does not exist\");\n\n        // ----- Return\n        return PclZip::errorCode();\n      }\n\n      // ----- Calculate the stored filename\n      $this->privCalculateStoredFilename($v_descr, $p_options);\n\n      // ----- Add the descriptor in result list\n      $v_result_list[sizeof($v_result_list)] = $v_descr;\n\n      // ----- Look for folder\n      if ($v_descr['type'] == 'folder') {\n        // ----- List of items in folder\n        $v_dirlist_descr = array();\n        $v_dirlist_nb = 0;\n        if ($v_folder_handler = @opendir($v_descr['filename'])) {\n          while (($v_item_handler = @readdir($v_folder_handler)) !== false) {\n\n            // ----- Skip '.' and '..'\n            if (($v_item_handler == '.') || ($v_item_handler == '..')) {\n                continue;\n            }\n\n            // ----- Compose the full filename\n            $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;\n\n            // ----- Look for different stored filename\n            // Because the name of the folder was changed, the name of the\n            // files/sub-folders also change\n            if (($v_descr['stored_filename'] != $v_descr['filename'])\n                 && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {\n              if ($v_descr['stored_filename'] != '') {\n                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;\n              }\n              else {\n                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;\n              }\n            }\n\n            $v_dirlist_nb++;\n          }\n\n          @closedir($v_folder_handler);\n        }\n        else {\n          // TBC : unable to open folder in read mode\n        }\n\n        // ----- Expand each element of the list\n        if ($v_dirlist_nb != 0) {\n          // ----- Expand\n          if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {\n            return $v_result;\n          }\n\n          // ----- Concat the resulting list\n          $v_result_list = array_merge($v_result_list, $v_dirlist_descr);\n        }\n        else {\n        }\n\n        // ----- Free local array\n        unset($v_dirlist_descr);\n      }\n    }\n\n    // ----- Get the result list\n    $p_filedescr_list = $v_result_list;\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privCreate()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privCreate($p_filedescr_list, &$p_result_list, &$p_options)\n  {\n    $v_result=1;\n    $v_list_detail = array();\n\n    // ----- Magic quotes trick\n    $this->privDisableMagicQuotes();\n\n    // ----- Open the file in write mode\n    if (($v_result = $this->privOpenFd('wb')) != 1)\n    {\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Add the list of files\n    $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);\n\n    // ----- Close\n    $this->privCloseFd();\n\n    // ----- Magic quotes trick\n    $this->privSwapBackMagicQuotes();\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privAdd()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privAdd($p_filedescr_list, &$p_result_list, &$p_options)\n  {\n    $v_result=1;\n    $v_list_detail = array();\n\n    // ----- Look if the archive exists or is empty\n    if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))\n    {\n\n      // ----- Do a create\n      $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);\n\n      // ----- Return\n      return $v_result;\n    }\n    // ----- Magic quotes trick\n    $this->privDisableMagicQuotes();\n\n    // ----- Open the zip file\n    if (($v_result=$this->privOpenFd('rb')) != 1)\n    {\n      // ----- Magic quotes trick\n      $this->privSwapBackMagicQuotes();\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Read the central directory informations\n    $v_central_dir = array();\n    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)\n    {\n      $this->privCloseFd();\n      $this->privSwapBackMagicQuotes();\n      return $v_result;\n    }\n\n    // ----- Go to beginning of File\n    @rewind($this->zip_fd);\n\n    // ----- Creates a temporay file\n    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';\n\n    // ----- Open the temporary file in write mode\n    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)\n    {\n      $this->privCloseFd();\n      $this->privSwapBackMagicQuotes();\n\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_zip_temp_name.'\\' in binary write mode');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Copy the files from the archive to the temporary file\n    // TBC : Here I should better append the file and go back to erase the central dir\n    $v_size = $v_central_dir['offset'];\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = fread($this->zip_fd, $v_read_size);\n      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Swap the file descriptor\n    // Here is a trick : I swap the temporary fd with the zip fd, in order to use\n    // the following methods on the temporary fil and not the real archive\n    $v_swap = $this->zip_fd;\n    $this->zip_fd = $v_zip_temp_fd;\n    $v_zip_temp_fd = $v_swap;\n\n    // ----- Add the files\n    $v_header_list = array();\n    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)\n    {\n      fclose($v_zip_temp_fd);\n      $this->privCloseFd();\n      @unlink($v_zip_temp_name);\n      $this->privSwapBackMagicQuotes();\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Store the offset of the central dir\n    $v_offset = @ftell($this->zip_fd);\n\n    // ----- Copy the block of file headers from the old archive\n    $v_size = $v_central_dir['size'];\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = @fread($v_zip_temp_fd, $v_read_size);\n      @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Create the Central Dir files header\n    for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)\n    {\n      // ----- Create the file header\n      if ($v_header_list[$i]['status'] == 'ok') {\n        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n          fclose($v_zip_temp_fd);\n          $this->privCloseFd();\n          @unlink($v_zip_temp_name);\n          $this->privSwapBackMagicQuotes();\n\n          // ----- Return\n          return $v_result;\n        }\n        $v_count++;\n      }\n\n      // ----- Transform the header to a 'usable' info\n      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n    }\n\n    // ----- Zip file comment\n    $v_comment = $v_central_dir['comment'];\n    if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n      $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n    }\n    if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {\n      $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];\n    }\n    if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {\n      $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;\n    }\n\n    // ----- Calculate the size of the central header\n    $v_size = @ftell($this->zip_fd)-$v_offset;\n\n    // ----- Create the central dir footer\n    if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)\n    {\n      // ----- Reset the file list\n      unset($v_header_list);\n      $this->privSwapBackMagicQuotes();\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Swap back the file descriptor\n    $v_swap = $this->zip_fd;\n    $this->zip_fd = $v_zip_temp_fd;\n    $v_zip_temp_fd = $v_swap;\n\n    // ----- Close\n    $this->privCloseFd();\n\n    // ----- Close the temporary file\n    @fclose($v_zip_temp_fd);\n\n    // ----- Magic quotes trick\n    $this->privSwapBackMagicQuotes();\n\n    // ----- Delete the zip file\n    // TBC : I should test the result ...\n    @unlink($this->zipname);\n\n    // ----- Rename the temporary file\n    // TBC : I should test the result ...\n    //@rename($v_zip_temp_name, $this->zipname);\n    PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privOpenFd()\n  // Description :\n  // Parameters :\n  // --------------------------------------------------------------------------------\n  function privOpenFd($p_mode)\n  {\n    $v_result=1;\n\n    // ----- Look if already open\n    if ($this->zip_fd != 0)\n    {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \\''.$this->zipname.'\\' already open');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Open the zip file\n    if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)\n    {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\''.$this->zipname.'\\' in '.$p_mode.' mode');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privCloseFd()\n  // Description :\n  // Parameters :\n  // --------------------------------------------------------------------------------\n  function privCloseFd()\n  {\n    $v_result=1;\n\n    if ($this->zip_fd != 0)\n      @fclose($this->zip_fd);\n    $this->zip_fd = 0;\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privAddList()\n  // Description :\n  //   $p_add_dir and $p_remove_dir will give the ability to memorize a path which is\n  //   different from the real path of the file. This is usefull if you want to have PclTar\n  //   running in any directory, and memorize relative path from an other directory.\n  // Parameters :\n  //   $p_list : An array containing the file or directory names to add in the tar\n  //   $p_result_list : list of added files with their properties (specially the status field)\n  //   $p_add_dir : Path to add in the filename path archived\n  //   $p_remove_dir : Path to remove in the filename path archived\n  // Return Values :\n  // --------------------------------------------------------------------------------\n//  function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)\n  function privAddList($p_filedescr_list, &$p_result_list, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Add the files\n    $v_header_list = array();\n    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)\n    {\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Store the offset of the central dir\n    $v_offset = @ftell($this->zip_fd);\n\n    // ----- Create the Central Dir files header\n    for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)\n    {\n      // ----- Create the file header\n      if ($v_header_list[$i]['status'] == 'ok') {\n        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n          // ----- Return\n          return $v_result;\n        }\n        $v_count++;\n      }\n\n      // ----- Transform the header to a 'usable' info\n      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n    }\n\n    // ----- Zip file comment\n    $v_comment = '';\n    if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n      $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n    }\n\n    // ----- Calculate the size of the central header\n    $v_size = @ftell($this->zip_fd)-$v_offset;\n\n    // ----- Create the central dir footer\n    if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)\n    {\n      // ----- Reset the file list\n      unset($v_header_list);\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privAddFileList()\n  // Description :\n  // Parameters :\n  //   $p_filedescr_list : An array containing the file description\n  //                      or directory names to add in the zip\n  //   $p_result_list : list of added files with their properties (specially the status field)\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)\n  {\n    $v_result=1;\n    $v_header = array();\n\n    // ----- Recuperate the current number of elt in list\n    $v_nb = sizeof($p_result_list);\n\n    // ----- Loop on the files\n    for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {\n      // ----- Format the filename\n      $p_filedescr_list[$j]['filename']\n      = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);\n\n\n      // ----- Skip empty file names\n      // TBC : Can this be possible ? not checked in DescrParseAtt ?\n      if ($p_filedescr_list[$j]['filename'] == \"\") {\n        continue;\n      }\n\n      // ----- Check the filename\n      if (   ($p_filedescr_list[$j]['type'] != 'virtual_file')\n          && (!file_exists($p_filedescr_list[$j]['filename']))) {\n        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, \"File '\".$p_filedescr_list[$j]['filename'].\"' does not exist\");\n        return PclZip::errorCode();\n      }\n\n      // ----- Look if it is a file or a dir with no all path remove option\n      // or a dir with all its path removed\n//      if (   (is_file($p_filedescr_list[$j]['filename']))\n//          || (   is_dir($p_filedescr_list[$j]['filename'])\n      if (   ($p_filedescr_list[$j]['type'] == 'file')\n          || ($p_filedescr_list[$j]['type'] == 'virtual_file')\n          || (   ($p_filedescr_list[$j]['type'] == 'folder')\n              && (   !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])\n                  || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))\n          ) {\n\n        // ----- Add the file\n        $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,\n                                       $p_options);\n        if ($v_result != 1) {\n          return $v_result;\n        }\n\n        // ----- Store the file infos\n        $p_result_list[$v_nb++] = $v_header;\n      }\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privAddFile()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privAddFile($p_filedescr, &$p_header, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Working variable\n    $p_filename = $p_filedescr['filename'];\n\n    // TBC : Already done in the fileAtt check ... ?\n    if ($p_filename == \"\") {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, \"Invalid file list parameter (invalid or empty list)\");\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Look for a stored different filename\n    /* TBC : Removed\n    if (isset($p_filedescr['stored_filename'])) {\n      $v_stored_filename = $p_filedescr['stored_filename'];\n    }\n    else {\n      $v_stored_filename = $p_filedescr['stored_filename'];\n    }\n    */\n\n    // ----- Set the file properties\n    clearstatcache();\n    $p_header['version'] = 20;\n    $p_header['version_extracted'] = 10;\n    $p_header['flag'] = 0;\n    $p_header['compression'] = 0;\n    $p_header['crc'] = 0;\n    $p_header['compressed_size'] = 0;\n    $p_header['filename_len'] = strlen($p_filename);\n    $p_header['extra_len'] = 0;\n    $p_header['disk'] = 0;\n    $p_header['internal'] = 0;\n    $p_header['offset'] = 0;\n    $p_header['filename'] = $p_filename;\n// TBC : Removed    $p_header['stored_filename'] = $v_stored_filename;\n    $p_header['stored_filename'] = $p_filedescr['stored_filename'];\n    $p_header['extra'] = '';\n    $p_header['status'] = 'ok';\n    $p_header['index'] = -1;\n\n    // ----- Look for regular file\n    if ($p_filedescr['type']=='file') {\n      $p_header['external'] = 0x00000000;\n      $p_header['size'] = filesize($p_filename);\n    }\n\n    // ----- Look for regular folder\n    else if ($p_filedescr['type']=='folder') {\n      $p_header['external'] = 0x00000010;\n      $p_header['mtime'] = filemtime($p_filename);\n      $p_header['size'] = filesize($p_filename);\n    }\n\n    // ----- Look for virtual file\n    else if ($p_filedescr['type'] == 'virtual_file') {\n      $p_header['external'] = 0x00000000;\n      $p_header['size'] = strlen($p_filedescr['content']);\n    }\n\n\n    // ----- Look for filetime\n    if (isset($p_filedescr['mtime'])) {\n      $p_header['mtime'] = $p_filedescr['mtime'];\n    }\n    else if ($p_filedescr['type'] == 'virtual_file') {\n      $p_header['mtime'] = time();\n    }\n    else {\n      $p_header['mtime'] = filemtime($p_filename);\n    }\n\n    // ------ Look for file comment\n    if (isset($p_filedescr['comment'])) {\n      $p_header['comment_len'] = strlen($p_filedescr['comment']);\n      $p_header['comment'] = $p_filedescr['comment'];\n    }\n    else {\n      $p_header['comment_len'] = 0;\n      $p_header['comment'] = '';\n    }\n\n    // ----- Look for pre-add callback\n    if (isset($p_options[PCLZIP_CB_PRE_ADD])) {\n\n      // ----- Generate a local information\n      $v_local_header = array();\n      $this->privConvertHeader2FileInfo($p_header, $v_local_header);\n\n      // ----- Call the callback\n      // Here I do not use call_user_func() because I need to send a reference to the\n      // header.\n      $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header);\n      if ($v_result == 0) {\n        // ----- Change the file status\n        $p_header['status'] = \"skipped\";\n        $v_result = 1;\n      }\n\n      // ----- Update the informations\n      // Only some fields can be modified\n      if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {\n        $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);\n      }\n    }\n\n    // ----- Look for empty stored filename\n    if ($p_header['stored_filename'] == \"\") {\n      $p_header['status'] = \"filtered\";\n    }\n\n    // ----- Check the path length\n    if (strlen($p_header['stored_filename']) > 0xFF) {\n      $p_header['status'] = 'filename_too_long';\n    }\n\n    // ----- Look if no error, or file not skipped\n    if ($p_header['status'] == 'ok') {\n\n      // ----- Look for a file\n      if ($p_filedescr['type'] == 'file') {\n        // ----- Look for using temporary file to zip\n        if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))\n            && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])\n                || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])\n                    && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) {\n          $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);\n          if ($v_result < PCLZIP_ERR_NO_ERROR) {\n            return $v_result;\n          }\n        }\n\n        // ----- Use \"in memory\" zip algo\n        else {\n\n        // ----- Open the source file\n        if (($v_file = @fopen($p_filename, \"rb\")) == 0) {\n          PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to open file '$p_filename' in binary read mode\");\n          return PclZip::errorCode();\n        }\n\n        // ----- Read the file content\n        $v_content = @fread($v_file, $p_header['size']);\n\n        // ----- Close the file\n        @fclose($v_file);\n\n        // ----- Calculate the CRC\n        $p_header['crc'] = @crc32($v_content);\n\n        // ----- Look for no compression\n        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {\n          // ----- Set header parameters\n          $p_header['compressed_size'] = $p_header['size'];\n          $p_header['compression'] = 0;\n        }\n\n        // ----- Look for normal compression\n        else {\n          // ----- Compress the content\n          $v_content = @gzdeflate($v_content);\n\n          // ----- Set header parameters\n          $p_header['compressed_size'] = strlen($v_content);\n          $p_header['compression'] = 8;\n        }\n\n        // ----- Call the header generation\n        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n          @fclose($v_file);\n          return $v_result;\n        }\n\n        // ----- Write the compressed (or not) content\n        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);\n\n        }\n\n      }\n\n      // ----- Look for a virtual file (a file from string)\n      else if ($p_filedescr['type'] == 'virtual_file') {\n\n        $v_content = $p_filedescr['content'];\n\n        // ----- Calculate the CRC\n        $p_header['crc'] = @crc32($v_content);\n\n        // ----- Look for no compression\n        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {\n          // ----- Set header parameters\n          $p_header['compressed_size'] = $p_header['size'];\n          $p_header['compression'] = 0;\n        }\n\n        // ----- Look for normal compression\n        else {\n          // ----- Compress the content\n          $v_content = @gzdeflate($v_content);\n\n          // ----- Set header parameters\n          $p_header['compressed_size'] = strlen($v_content);\n          $p_header['compression'] = 8;\n        }\n\n        // ----- Call the header generation\n        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n          @fclose($v_file);\n          return $v_result;\n        }\n\n        // ----- Write the compressed (or not) content\n        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);\n      }\n\n      // ----- Look for a directory\n      else if ($p_filedescr['type'] == 'folder') {\n        // ----- Look for directory last '/'\n        if (@substr($p_header['stored_filename'], -1) != '/') {\n          $p_header['stored_filename'] .= '/';\n        }\n\n        // ----- Set the file properties\n        $p_header['size'] = 0;\n        //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked\n        $p_header['external'] = 0x00000010;   // Value for a folder : to be checked\n\n        // ----- Call the header generation\n        if (($v_result = $this->privWriteFileHeader($p_header)) != 1)\n        {\n          return $v_result;\n        }\n      }\n    }\n\n    // ----- Look for post-add callback\n    if (isset($p_options[PCLZIP_CB_POST_ADD])) {\n\n      // ----- Generate a local information\n      $v_local_header = array();\n      $this->privConvertHeader2FileInfo($p_header, $v_local_header);\n\n      // ----- Call the callback\n      // Here I do not use call_user_func() because I need to send a reference to the\n      // header.\n      $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header);\n      if ($v_result == 0) {\n        // ----- Ignored\n        $v_result = 1;\n      }\n\n      // ----- Update the informations\n      // Nothing can be modified\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privAddFileUsingTempFile()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options)\n  {\n    $v_result=PCLZIP_ERR_NO_ERROR;\n\n    // ----- Working variable\n    $p_filename = $p_filedescr['filename'];\n\n\n    // ----- Open the source file\n    if (($v_file = @fopen($p_filename, \"rb\")) == 0) {\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, \"Unable to open file '$p_filename' in binary read mode\");\n      return PclZip::errorCode();\n    }\n\n    // ----- Creates a compressed temporary file\n    $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';\n    if (($v_file_compressed = @gzopen($v_gzip_temp_name, \"wb\")) == 0) {\n      fclose($v_file);\n      PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary write mode');\n      return PclZip::errorCode();\n    }\n\n    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n    $v_size = filesize($p_filename);\n    while ($v_size != 0) {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = @fread($v_file, $v_read_size);\n      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n      @gzputs($v_file_compressed, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Close the file\n    @fclose($v_file);\n    @gzclose($v_file_compressed);\n\n    // ----- Check the minimum file size\n    if (filesize($v_gzip_temp_name) < 18) {\n      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \\''.$v_gzip_temp_name.'\\' has invalid filesize - should be minimum 18 bytes');\n      return PclZip::errorCode();\n    }\n\n    // ----- Extract the compressed attributes\n    if (($v_file_compressed = @fopen($v_gzip_temp_name, \"rb\")) == 0) {\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary read mode');\n      return PclZip::errorCode();\n    }\n\n    // ----- Read the gzip file header\n    $v_binary_data = @fread($v_file_compressed, 10);\n    $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data);\n\n    // ----- Check some parameters\n    $v_data_header['os'] = bin2hex($v_data_header['os']);\n\n    // ----- Read the gzip file footer\n    @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8);\n    $v_binary_data = @fread($v_file_compressed, 8);\n    $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data);\n\n    // ----- Set the attributes\n    $p_header['compression'] = ord($v_data_header['cm']);\n    //$p_header['mtime'] = $v_data_header['mtime'];\n    $p_header['crc'] = $v_data_footer['crc'];\n    $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18;\n\n    // ----- Close the file\n    @fclose($v_file_compressed);\n\n    // ----- Call the header generation\n    if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {\n      return $v_result;\n    }\n\n    // ----- Add the compressed data\n    if (($v_file_compressed = @fopen($v_gzip_temp_name, \"rb\")) == 0)\n    {\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary read mode');\n      return PclZip::errorCode();\n    }\n\n    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n    fseek($v_file_compressed, 10);\n    $v_size = $p_header['compressed_size'];\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = @fread($v_file_compressed, $v_read_size);\n      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n      @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Close the file\n    @fclose($v_file_compressed);\n\n    // ----- Unlink the temporary file\n    @unlink($v_gzip_temp_name);\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privCalculateStoredFilename()\n  // Description :\n  //   Based on file descriptor properties and global options, this method\n  //   calculate the filename that will be stored in the archive.\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privCalculateStoredFilename(&$p_filedescr, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Working variables\n    $p_filename = $p_filedescr['filename'];\n    if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {\n      $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];\n    }\n    else {\n      $p_add_dir = '';\n    }\n    if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {\n      $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];\n    }\n    else {\n      $p_remove_dir = '';\n    }\n    if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {\n      $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];\n    }\n    else {\n      $p_remove_all_dir = 0;\n    }\n\n\n    // ----- Look for full name change\n    if (isset($p_filedescr['new_full_name'])) {\n      // ----- Remove drive letter if any\n      $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);\n    }\n\n    // ----- Look for path and/or short name change\n    else {\n\n      // ----- Look for short name change\n      // Its when we cahnge just the filename but not the path\n      if (isset($p_filedescr['new_short_name'])) {\n        $v_path_info = pathinfo($p_filename);\n        $v_dir = '';\n        if ($v_path_info['dirname'] != '') {\n          $v_dir = $v_path_info['dirname'].'/';\n        }\n        $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];\n      }\n      else {\n        // ----- Calculate the stored filename\n        $v_stored_filename = $p_filename;\n      }\n\n      // ----- Look for all path to remove\n      if ($p_remove_all_dir) {\n        $v_stored_filename = basename($p_filename);\n      }\n      // ----- Look for partial path remove\n      else if ($p_remove_dir != \"\") {\n        if (substr($p_remove_dir, -1) != '/')\n          $p_remove_dir .= \"/\";\n\n        if (   (substr($p_filename, 0, 2) == \"./\")\n            || (substr($p_remove_dir, 0, 2) == \"./\")) {\n\n          if (   (substr($p_filename, 0, 2) == \"./\")\n              && (substr($p_remove_dir, 0, 2) != \"./\")) {\n            $p_remove_dir = \"./\".$p_remove_dir;\n          }\n          if (   (substr($p_filename, 0, 2) != \"./\")\n              && (substr($p_remove_dir, 0, 2) == \"./\")) {\n            $p_remove_dir = substr($p_remove_dir, 2);\n          }\n        }\n\n        $v_compare = PclZipUtilPathInclusion($p_remove_dir,\n                                             $v_stored_filename);\n        if ($v_compare > 0) {\n          if ($v_compare == 2) {\n            $v_stored_filename = \"\";\n          }\n          else {\n            $v_stored_filename = substr($v_stored_filename,\n                                        strlen($p_remove_dir));\n          }\n        }\n      }\n\n      // ----- Remove drive letter if any\n      $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);\n\n      // ----- Look for path to add\n      if ($p_add_dir != \"\") {\n        if (substr($p_add_dir, -1) == \"/\")\n          $v_stored_filename = $p_add_dir.$v_stored_filename;\n        else\n          $v_stored_filename = $p_add_dir.\"/\".$v_stored_filename;\n      }\n    }\n\n    // ----- Filename (reduce the path of stored name)\n    $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);\n    $p_filedescr['stored_filename'] = $v_stored_filename;\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privWriteFileHeader()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privWriteFileHeader(&$p_header)\n  {\n    $v_result=1;\n\n    // ----- Store the offset position of the file\n    $p_header['offset'] = ftell($this->zip_fd);\n\n    // ----- Transform UNIX mtime to DOS format mdate/mtime\n    $v_date = getdate($p_header['mtime']);\n    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;\n    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];\n\n    // ----- Packed data\n    $v_binary_data = pack(\"VvvvvvVVVvv\", 0x04034b50,\n\t                      $p_header['version_extracted'], $p_header['flag'],\n                          $p_header['compression'], $v_mtime, $v_mdate,\n                          $p_header['crc'], $p_header['compressed_size'],\n\t\t\t\t\t\t  $p_header['size'],\n                          strlen($p_header['stored_filename']),\n\t\t\t\t\t\t  $p_header['extra_len']);\n\n    // ----- Write the first 148 bytes of the header in the archive\n    fputs($this->zip_fd, $v_binary_data, 30);\n\n    // ----- Write the variable fields\n    if (strlen($p_header['stored_filename']) != 0)\n    {\n      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));\n    }\n    if ($p_header['extra_len'] != 0)\n    {\n      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privWriteCentralFileHeader()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privWriteCentralFileHeader(&$p_header)\n  {\n    $v_result=1;\n\n    // TBC\n    //for(reset($p_header); $key = key($p_header); next($p_header)) {\n    //}\n\n    // ----- Transform UNIX mtime to DOS format mdate/mtime\n    $v_date = getdate($p_header['mtime']);\n    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;\n    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];\n\n\n    // ----- Packed data\n    $v_binary_data = pack(\"VvvvvvvVVVvvvvvVV\", 0x02014b50,\n\t                      $p_header['version'], $p_header['version_extracted'],\n                          $p_header['flag'], $p_header['compression'],\n\t\t\t\t\t\t  $v_mtime, $v_mdate, $p_header['crc'],\n                          $p_header['compressed_size'], $p_header['size'],\n                          strlen($p_header['stored_filename']),\n\t\t\t\t\t\t  $p_header['extra_len'], $p_header['comment_len'],\n                          $p_header['disk'], $p_header['internal'],\n\t\t\t\t\t\t  $p_header['external'], $p_header['offset']);\n\n    // ----- Write the 42 bytes of the header in the zip file\n    fputs($this->zip_fd, $v_binary_data, 46);\n\n    // ----- Write the variable fields\n    if (strlen($p_header['stored_filename']) != 0)\n    {\n      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));\n    }\n    if ($p_header['extra_len'] != 0)\n    {\n      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);\n    }\n    if ($p_header['comment_len'] != 0)\n    {\n      fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privWriteCentralHeader()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)\n  {\n    $v_result=1;\n\n    // ----- Packed data\n    $v_binary_data = pack(\"VvvvvVVv\", 0x06054b50, 0, 0, $p_nb_entries,\n\t                      $p_nb_entries, $p_size,\n\t\t\t\t\t\t  $p_offset, strlen($p_comment));\n\n    // ----- Write the 22 bytes of the header in the zip file\n    fputs($this->zip_fd, $v_binary_data, 22);\n\n    // ----- Write the variable fields\n    if (strlen($p_comment) != 0)\n    {\n      fputs($this->zip_fd, $p_comment, strlen($p_comment));\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privList()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privList(&$p_list)\n  {\n    $v_result=1;\n\n    // ----- Magic quotes trick\n    $this->privDisableMagicQuotes();\n\n    // ----- Open the zip file\n    if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)\n    {\n      // ----- Magic quotes trick\n      $this->privSwapBackMagicQuotes();\n\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \\''.$this->zipname.'\\' in binary read mode');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Read the central directory informations\n    $v_central_dir = array();\n    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)\n    {\n      $this->privSwapBackMagicQuotes();\n      return $v_result;\n    }\n\n    // ----- Go to beginning of Central Dir\n    @rewind($this->zip_fd);\n    if (@fseek($this->zip_fd, $v_central_dir['offset']))\n    {\n      $this->privSwapBackMagicQuotes();\n\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Read each entry\n    for ($i=0; $i<$v_central_dir['entries']; $i++)\n    {\n      // ----- Read the file header\n      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)\n      {\n        $this->privSwapBackMagicQuotes();\n        return $v_result;\n      }\n      $v_header['index'] = $i;\n\n      // ----- Get the only interesting attributes\n      $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);\n      unset($v_header);\n    }\n\n    // ----- Close the zip file\n    $this->privCloseFd();\n\n    // ----- Magic quotes trick\n    $this->privSwapBackMagicQuotes();\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privConvertHeader2FileInfo()\n  // Description :\n  //   This function takes the file informations from the central directory\n  //   entries and extract the interesting parameters that will be given back.\n  //   The resulting file infos are set in the array $p_info\n  //     $p_info['filename'] : Filename with full path. Given by user (add),\n  //                           extracted in the filesystem (extract).\n  //     $p_info['stored_filename'] : Stored filename in the archive.\n  //     $p_info['size'] = Size of the file.\n  //     $p_info['compressed_size'] = Compressed size of the file.\n  //     $p_info['mtime'] = Last modification date of the file.\n  //     $p_info['comment'] = Comment associated with the file.\n  //     $p_info['folder'] = true/false : indicates if the entry is a folder or not.\n  //     $p_info['status'] = status of the action on the file.\n  //     $p_info['crc'] = CRC of the file content.\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privConvertHeader2FileInfo($p_header, &$p_info)\n  {\n    $v_result=1;\n\n    // ----- Get the interesting attributes\n    $v_temp_path = PclZipUtilPathReduction($p_header['filename']);\n    $p_info['filename'] = $v_temp_path;\n    $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']);\n    $p_info['stored_filename'] = $v_temp_path;\n    $p_info['size'] = $p_header['size'];\n    $p_info['compressed_size'] = $p_header['compressed_size'];\n    $p_info['mtime'] = $p_header['mtime'];\n    $p_info['comment'] = $p_header['comment'];\n    $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);\n    $p_info['index'] = $p_header['index'];\n    $p_info['status'] = $p_header['status'];\n    $p_info['crc'] = $p_header['crc'];\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privExtractByRule()\n  // Description :\n  //   Extract a file or directory depending of rules (by index, by name, ...)\n  // Parameters :\n  //   $p_file_list : An array where will be placed the properties of each\n  //                  extracted file\n  //   $p_path : Path to add while writing the extracted files\n  //   $p_remove_path : Path to remove (from the file memorized path) while writing the\n  //                    extracted files. If the path does not match the file path,\n  //                    the file is extracted with its memorized path.\n  //                    $p_remove_path does not apply to 'list' mode.\n  //                    $p_path and $p_remove_path are commulative.\n  // Return Values :\n  //   1 on success,0 or less on error (see error code list)\n  // --------------------------------------------------------------------------------\n  function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Magic quotes trick\n    $this->privDisableMagicQuotes();\n\n    // ----- Check the path\n    if (   ($p_path == \"\")\n\t    || (   (substr($p_path, 0, 1) != \"/\")\n\t\t    && (substr($p_path, 0, 3) != \"../\")\n\t\t\t&& (substr($p_path,1,2)!=\":/\")))\n      $p_path = \"./\".$p_path;\n\n    // ----- Reduce the path last (and duplicated) '/'\n    if (($p_path != \"./\") && ($p_path != \"/\"))\n    {\n      // ----- Look for the path end '/'\n      while (substr($p_path, -1) == \"/\")\n      {\n        $p_path = substr($p_path, 0, strlen($p_path)-1);\n      }\n    }\n\n    // ----- Look for path to remove format (should end by /)\n    if (($p_remove_path != \"\") && (substr($p_remove_path, -1) != '/'))\n    {\n      $p_remove_path .= '/';\n    }\n    $p_remove_path_size = strlen($p_remove_path);\n\n    // ----- Open the zip file\n    if (($v_result = $this->privOpenFd('rb')) != 1)\n    {\n      $this->privSwapBackMagicQuotes();\n      return $v_result;\n    }\n\n    // ----- Read the central directory informations\n    $v_central_dir = array();\n    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)\n    {\n      // ----- Close the zip file\n      $this->privCloseFd();\n      $this->privSwapBackMagicQuotes();\n\n      return $v_result;\n    }\n\n    // ----- Start at beginning of Central Dir\n    $v_pos_entry = $v_central_dir['offset'];\n\n    // ----- Read each entry\n    $j_start = 0;\n    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)\n    {\n\n      // ----- Read next Central dir entry\n      @rewind($this->zip_fd);\n      if (@fseek($this->zip_fd, $v_pos_entry))\n      {\n        // ----- Close the zip file\n        $this->privCloseFd();\n        $this->privSwapBackMagicQuotes();\n\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n        // ----- Return\n        return PclZip::errorCode();\n      }\n\n      // ----- Read the file header\n      $v_header = array();\n      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)\n      {\n        // ----- Close the zip file\n        $this->privCloseFd();\n        $this->privSwapBackMagicQuotes();\n\n        return $v_result;\n      }\n\n      // ----- Store the index\n      $v_header['index'] = $i;\n\n      // ----- Store the file position\n      $v_pos_entry = ftell($this->zip_fd);\n\n      // ----- Look for the specific extract rules\n      $v_extract = false;\n\n      // ----- Look for extract by name rule\n      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))\n          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {\n\n          // ----- Look if the filename is in the list\n          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {\n\n              // ----- Look for a directory\n              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == \"/\") {\n\n                  // ----- Look if the directory is in the filename path\n                  if (   (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))\n                      && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {\n                      $v_extract = true;\n                  }\n              }\n              // ----- Look for a filename\n              elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {\n                  $v_extract = true;\n              }\n          }\n      }\n\n      // ----- Look for extract by ereg rule\n      // ereg() is deprecated with PHP 5.3\n      /*\n      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))\n               && ($p_options[PCLZIP_OPT_BY_EREG] != \"\")) {\n\n          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {\n              $v_extract = true;\n          }\n      }\n      */\n\n      // ----- Look for extract by preg rule\n      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))\n               && ($p_options[PCLZIP_OPT_BY_PREG] != \"\")) {\n\n          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {\n              $v_extract = true;\n          }\n      }\n\n      // ----- Look for extract by index rule\n      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))\n               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {\n\n          // ----- Look if the index is in the list\n          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {\n\n              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {\n                  $v_extract = true;\n              }\n              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {\n                  $j_start = $j+1;\n              }\n\n              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {\n                  break;\n              }\n          }\n      }\n\n      // ----- Look for no rule, which means extract all the archive\n      else {\n          $v_extract = true;\n      }\n\n\t  // ----- Check compression method\n\t  if (   ($v_extract)\n\t      && (   ($v_header['compression'] != 8)\n\t\t      && ($v_header['compression'] != 0))) {\n          $v_header['status'] = 'unsupported_compression';\n\n          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))\n\t\t      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {\n\n              $this->privSwapBackMagicQuotes();\n\n              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,\n\t\t\t                       \"Filename '\".$v_header['stored_filename'].\"' is \"\n\t\t\t\t  \t    \t  \t   .\"compressed by an unsupported compression \"\n\t\t\t\t  \t    \t  \t   .\"method (\".$v_header['compression'].\") \");\n\n              return PclZip::errorCode();\n\t\t  }\n\t  }\n\n\t  // ----- Check encrypted files\n\t  if (($v_extract) && (($v_header['flag'] & 1) == 1)) {\n          $v_header['status'] = 'unsupported_encryption';\n\n          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))\n\t\t      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {\n\n              $this->privSwapBackMagicQuotes();\n\n              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,\n\t\t\t                       \"Unsupported encryption for \"\n\t\t\t\t  \t    \t  \t   .\" filename '\".$v_header['stored_filename']\n\t\t\t\t\t\t\t\t   .\"'\");\n\n              return PclZip::errorCode();\n\t\t  }\n    }\n\n      // ----- Look for real extraction\n      if (($v_extract) && ($v_header['status'] != 'ok')) {\n          $v_result = $this->privConvertHeader2FileInfo($v_header,\n\t\t                                        $p_file_list[$v_nb_extracted++]);\n          if ($v_result != 1) {\n              $this->privCloseFd();\n              $this->privSwapBackMagicQuotes();\n              return $v_result;\n          }\n\n          $v_extract = false;\n      }\n\n      // ----- Look for real extraction\n      if ($v_extract)\n      {\n\n        // ----- Go to the file position\n        @rewind($this->zip_fd);\n        if (@fseek($this->zip_fd, $v_header['offset']))\n        {\n          // ----- Close the zip file\n          $this->privCloseFd();\n\n          $this->privSwapBackMagicQuotes();\n\n          // ----- Error log\n          PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n          // ----- Return\n          return PclZip::errorCode();\n        }\n\n        // ----- Look for extraction as string\n        if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {\n\n          $v_string = '';\n\n          // ----- Extracting the file\n          $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);\n          if ($v_result1 < 1) {\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n            return $v_result1;\n          }\n\n          // ----- Get the only interesting attributes\n          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)\n          {\n            // ----- Close the zip file\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n\n            return $v_result;\n          }\n\n          // ----- Set the file content\n          $p_file_list[$v_nb_extracted]['content'] = $v_string;\n\n          // ----- Next extracted file\n          $v_nb_extracted++;\n\n          // ----- Look for user callback abort\n          if ($v_result1 == 2) {\n          \tbreak;\n          }\n        }\n        // ----- Look for extraction in standard output\n        elseif (   (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))\n\t\t        && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {\n          // ----- Extracting the file in standard output\n          $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);\n          if ($v_result1 < 1) {\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n            return $v_result1;\n          }\n\n          // ----- Get the only interesting attributes\n          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n            return $v_result;\n          }\n\n          // ----- Look for user callback abort\n          if ($v_result1 == 2) {\n          \tbreak;\n          }\n        }\n        // ----- Look for normal extraction\n        else {\n          // ----- Extracting the file\n          $v_result1 = $this->privExtractFile($v_header,\n\t\t                                      $p_path, $p_remove_path,\n\t\t\t\t\t\t\t\t\t\t\t  $p_remove_all_path,\n\t\t\t\t\t\t\t\t\t\t\t  $p_options);\n          if ($v_result1 < 1) {\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n            return $v_result1;\n          }\n\n          // ----- Get the only interesting attributes\n          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)\n          {\n            // ----- Close the zip file\n            $this->privCloseFd();\n            $this->privSwapBackMagicQuotes();\n\n            return $v_result;\n          }\n\n          // ----- Look for user callback abort\n          if ($v_result1 == 2) {\n          \tbreak;\n          }\n        }\n      }\n    }\n\n    // ----- Close the zip file\n    $this->privCloseFd();\n    $this->privSwapBackMagicQuotes();\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privExtractFile()\n  // Description :\n  // Parameters :\n  // Return Values :\n  //\n  // 1 : ... ?\n  // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback\n  // --------------------------------------------------------------------------------\n  function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Read the file header\n    if (($v_result = $this->privReadFileHeader($v_header)) != 1)\n    {\n      // ----- Return\n      return $v_result;\n    }\n\n\n    // ----- Check that the file header is coherent with $p_entry info\n    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n        // TBC\n    }\n\n    // ----- Look for all path to remove\n    if ($p_remove_all_path == true) {\n        // ----- Look for folder entry that not need to be extracted\n        if (($p_entry['external']&0x00000010)==0x00000010) {\n\n            $p_entry['status'] = \"filtered\";\n\n            return $v_result;\n        }\n\n        // ----- Get the basename of the path\n        $p_entry['filename'] = basename($p_entry['filename']);\n    }\n\n    // ----- Look for path to remove\n    else if ($p_remove_path != \"\")\n    {\n      if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)\n      {\n\n        // ----- Change the file status\n        $p_entry['status'] = \"filtered\";\n\n        // ----- Return\n        return $v_result;\n      }\n\n      $p_remove_path_size = strlen($p_remove_path);\n      if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)\n      {\n\n        // ----- Remove the path\n        $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);\n\n      }\n    }\n\n    // ----- Add the path\n    if ($p_path != '') {\n      $p_entry['filename'] = $p_path.\"/\".$p_entry['filename'];\n    }\n\n    // ----- Check a base_dir_restriction\n    if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {\n      $v_inclusion\n      = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],\n                                $p_entry['filename']);\n      if ($v_inclusion == 0) {\n\n        PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,\n\t\t\t                     \"Filename '\".$p_entry['filename'].\"' is \"\n\t\t\t\t\t\t\t\t .\"outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION\");\n\n        return PclZip::errorCode();\n      }\n    }\n\n    // ----- Look for pre-extract callback\n    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n\n      // ----- Generate a local information\n      $v_local_header = array();\n      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n      // ----- Call the callback\n      // Here I do not use call_user_func() because I need to send a reference to the\n      // header.\n      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n      if ($v_result == 0) {\n        // ----- Change the file status\n        $p_entry['status'] = \"skipped\";\n        $v_result = 1;\n      }\n\n      // ----- Look for abort result\n      if ($v_result == 2) {\n        // ----- This status is internal and will be changed in 'skipped'\n        $p_entry['status'] = \"aborted\";\n      \t$v_result = PCLZIP_ERR_USER_ABORTED;\n      }\n\n      // ----- Update the informations\n      // Only some fields can be modified\n      $p_entry['filename'] = $v_local_header['filename'];\n    }\n\n\n    // ----- Look if extraction should be done\n    if ($p_entry['status'] == 'ok') {\n\n    // ----- Look for specific actions while the file exist\n    if (file_exists($p_entry['filename']))\n    {\n\n      // ----- Look if file is a directory\n      if (is_dir($p_entry['filename']))\n      {\n\n        // ----- Change the file status\n        $p_entry['status'] = \"already_a_directory\";\n\n        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n        // For historical reason first PclZip implementation does not stop\n        // when this kind of error occurs.\n        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))\n\t\t    && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {\n\n            PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,\n\t\t\t                     \"Filename '\".$p_entry['filename'].\"' is \"\n\t\t\t\t\t\t\t\t .\"already used by an existing directory\");\n\n            return PclZip::errorCode();\n\t\t    }\n      }\n      // ----- Look if file is write protected\n      else if (!is_writeable($p_entry['filename']))\n      {\n\n        // ----- Change the file status\n        $p_entry['status'] = \"write_protected\";\n\n        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n        // For historical reason first PclZip implementation does not stop\n        // when this kind of error occurs.\n        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))\n\t\t    && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {\n\n            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,\n\t\t\t                     \"Filename '\".$p_entry['filename'].\"' exists \"\n\t\t\t\t\t\t\t\t .\"and is write protected\");\n\n            return PclZip::errorCode();\n\t\t    }\n      }\n\n      // ----- Look if the extracted file is older\n      else if (filemtime($p_entry['filename']) > $p_entry['mtime'])\n      {\n        // ----- Change the file status\n        if (   (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))\n\t\t    && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {\n\t  \t  }\n\t\t    else {\n            $p_entry['status'] = \"newer_exist\";\n\n            // ----- Look for PCLZIP_OPT_STOP_ON_ERROR\n            // For historical reason first PclZip implementation does not stop\n            // when this kind of error occurs.\n            if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))\n\t\t        && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {\n\n                PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,\n\t\t\t             \"Newer version of '\".$p_entry['filename'].\"' exists \"\n\t\t\t\t\t    .\"and option PCLZIP_OPT_REPLACE_NEWER is not selected\");\n\n                return PclZip::errorCode();\n\t\t      }\n\t\t    }\n      }\n      else {\n      }\n    }\n\n    // ----- Check the directory availability and create it if necessary\n    else {\n      if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))\n        $v_dir_to_check = $p_entry['filename'];\n      else if (!strstr($p_entry['filename'], \"/\"))\n        $v_dir_to_check = \"\";\n      else\n        $v_dir_to_check = dirname($p_entry['filename']);\n\n        if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {\n\n          // ----- Change the file status\n          $p_entry['status'] = \"path_creation_fail\";\n\n          // ----- Return\n          //return $v_result;\n          $v_result = 1;\n        }\n      }\n    }\n\n    // ----- Look if extraction should be done\n    if ($p_entry['status'] == 'ok') {\n\n      // ----- Do the extraction (if not a folder)\n      if (!(($p_entry['external']&0x00000010)==0x00000010))\n      {\n        // ----- Look for not compressed file\n        if ($p_entry['compression'] == 0) {\n\n    \t\t  // ----- Opening destination file\n          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)\n          {\n\n            // ----- Change the file status\n            $p_entry['status'] = \"write_error\";\n\n            // ----- Return\n            return $v_result;\n          }\n\n\n          // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n          $v_size = $p_entry['compressed_size'];\n          while ($v_size != 0)\n          {\n            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n            $v_buffer = @fread($this->zip_fd, $v_read_size);\n            /* Try to speed up the code\n            $v_binary_data = pack('a'.$v_read_size, $v_buffer);\n            @fwrite($v_dest_file, $v_binary_data, $v_read_size);\n            */\n            @fwrite($v_dest_file, $v_buffer, $v_read_size);\n            $v_size -= $v_read_size;\n          }\n\n          // ----- Closing the destination file\n          fclose($v_dest_file);\n\n          // ----- Change the file mtime\n          touch($p_entry['filename'], $p_entry['mtime']);\n\n\n        }\n        else {\n          // ----- TBC\n          // Need to be finished\n          if (($p_entry['flag'] & 1) == 1) {\n            PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \\''.$p_entry['filename'].'\\' is encrypted. Encrypted files are not supported.');\n            return PclZip::errorCode();\n          }\n\n\n          // ----- Look for using temporary file to unzip\n          if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))\n              && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])\n                  || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])\n                      && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) {\n            $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options);\n            if ($v_result < PCLZIP_ERR_NO_ERROR) {\n              return $v_result;\n            }\n          }\n\n          // ----- Look for extract in memory\n          else {\n\n\n            // ----- Read the compressed file in a buffer (one shot)\n            $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n            // ----- Decompress the file\n            $v_file_content = @gzinflate($v_buffer);\n            unset($v_buffer);\n            if ($v_file_content === FALSE) {\n\n              // ----- Change the file status\n              // TBC\n              $p_entry['status'] = \"error\";\n\n              return $v_result;\n            }\n\n            // ----- Opening destination file\n            if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {\n\n              // ----- Change the file status\n              $p_entry['status'] = \"write_error\";\n\n              return $v_result;\n            }\n\n            // ----- Write the uncompressed data\n            @fwrite($v_dest_file, $v_file_content, $p_entry['size']);\n            unset($v_file_content);\n\n            // ----- Closing the destination file\n            @fclose($v_dest_file);\n\n          }\n\n          // ----- Change the file mtime\n          @touch($p_entry['filename'], $p_entry['mtime']);\n        }\n\n        // ----- Look for chmod option\n        if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {\n\n          // ----- Change the mode of the file\n          @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);\n        }\n\n      }\n    }\n\n  \t// ----- Change abort status\n  \tif ($p_entry['status'] == \"aborted\") {\n        $p_entry['status'] = \"skipped\";\n  \t}\n\n    // ----- Look for post-extract callback\n    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n\n      // ----- Generate a local information\n      $v_local_header = array();\n      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n      // ----- Call the callback\n      // Here I do not use call_user_func() because I need to send a reference to the\n      // header.\n      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n      // ----- Look for abort result\n      if ($v_result == 2) {\n      \t$v_result = PCLZIP_ERR_USER_ABORTED;\n      }\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privExtractFileUsingTempFile()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privExtractFileUsingTempFile(&$p_entry, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Creates a temporary file\n    $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';\n    if (($v_dest_file = @fopen($v_gzip_temp_name, \"wb\")) == 0) {\n      fclose($v_file);\n      PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary write mode');\n      return PclZip::errorCode();\n    }\n\n\n    // ----- Write gz file format header\n    $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3));\n    @fwrite($v_dest_file, $v_binary_data, 10);\n\n    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n    $v_size = $p_entry['compressed_size'];\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = @fread($this->zip_fd, $v_read_size);\n      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n      @fwrite($v_dest_file, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Write gz file format footer\n    $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']);\n    @fwrite($v_dest_file, $v_binary_data, 8);\n\n    // ----- Close the temporary file\n    @fclose($v_dest_file);\n\n    // ----- Opening destination file\n    if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {\n      $p_entry['status'] = \"write_error\";\n      return $v_result;\n    }\n\n    // ----- Open the temporary gz file\n    if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) {\n      @fclose($v_dest_file);\n      $p_entry['status'] = \"read_error\";\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_gzip_temp_name.'\\' in binary read mode');\n      return PclZip::errorCode();\n    }\n\n\n    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks\n    $v_size = $p_entry['size'];\n    while ($v_size != 0) {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = @gzread($v_src_file, $v_read_size);\n      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);\n      @fwrite($v_dest_file, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n    @fclose($v_dest_file);\n    @gzclose($v_src_file);\n\n    // ----- Delete the temporary file\n    @unlink($v_gzip_temp_name);\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privExtractFileInOutput()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privExtractFileInOutput(&$p_entry, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Read the file header\n    if (($v_result = $this->privReadFileHeader($v_header)) != 1) {\n      return $v_result;\n    }\n\n\n    // ----- Check that the file header is coherent with $p_entry info\n    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n        // TBC\n    }\n\n    // ----- Look for pre-extract callback\n    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n\n      // ----- Generate a local information\n      $v_local_header = array();\n      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n      // ----- Call the callback\n      // Here I do not use call_user_func() because I need to send a reference to the\n      // header.\n//      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');\n      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n      if ($v_result == 0) {\n        // ----- Change the file status\n        $p_entry['status'] = \"skipped\";\n        $v_result = 1;\n      }\n\n      // ----- Look for abort result\n      if ($v_result == 2) {\n        // ----- This status is internal and will be changed in 'skipped'\n        $p_entry['status'] = \"aborted\";\n      \t$v_result = PCLZIP_ERR_USER_ABORTED;\n      }\n\n      // ----- Update the informations\n      // Only some fields can be modified\n      $p_entry['filename'] = $v_local_header['filename'];\n    }\n\n    // ----- Trace\n\n    // ----- Look if extraction should be done\n    if ($p_entry['status'] == 'ok') {\n\n      // ----- Do the extraction (if not a folder)\n      if (!(($p_entry['external']&0x00000010)==0x00000010)) {\n        // ----- Look for not compressed file\n        if ($p_entry['compressed_size'] == $p_entry['size']) {\n\n          // ----- Read the file in a buffer (one shot)\n          $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n          // ----- Send the file to the output\n          echo $v_buffer;\n          unset($v_buffer);\n        }\n        else {\n\n          // ----- Read the compressed file in a buffer (one shot)\n          $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n          // ----- Decompress the file\n          $v_file_content = gzinflate($v_buffer);\n          unset($v_buffer);\n\n          // ----- Send the file to the output\n          echo $v_file_content;\n          unset($v_file_content);\n        }\n      }\n    }\n\n\t// ----- Change abort status\n\tif ($p_entry['status'] == \"aborted\") {\n      $p_entry['status'] = \"skipped\";\n\t}\n\n    // ----- Look for post-extract callback\n    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n\n      // ----- Generate a local information\n      $v_local_header = array();\n      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n      // ----- Call the callback\n      // Here I do not use call_user_func() because I need to send a reference to the\n      // header.\n      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n      // ----- Look for abort result\n      if ($v_result == 2) {\n      \t$v_result = PCLZIP_ERR_USER_ABORTED;\n      }\n    }\n\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privExtractFileAsString()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privExtractFileAsString(&$p_entry, &$p_string, &$p_options)\n  {\n    $v_result=1;\n\n    // ----- Read the file header\n    $v_header = array();\n    if (($v_result = $this->privReadFileHeader($v_header)) != 1)\n    {\n      // ----- Return\n      return $v_result;\n    }\n\n\n    // ----- Check that the file header is coherent with $p_entry info\n    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {\n        // TBC\n    }\n\n    // ----- Look for pre-extract callback\n    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {\n\n      // ----- Generate a local information\n      $v_local_header = array();\n      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n      // ----- Call the callback\n      // Here I do not use call_user_func() because I need to send a reference to the\n      // header.\n      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);\n      if ($v_result == 0) {\n        // ----- Change the file status\n        $p_entry['status'] = \"skipped\";\n        $v_result = 1;\n      }\n\n      // ----- Look for abort result\n      if ($v_result == 2) {\n        // ----- This status is internal and will be changed in 'skipped'\n        $p_entry['status'] = \"aborted\";\n      \t$v_result = PCLZIP_ERR_USER_ABORTED;\n      }\n\n      // ----- Update the informations\n      // Only some fields can be modified\n      $p_entry['filename'] = $v_local_header['filename'];\n    }\n\n\n    // ----- Look if extraction should be done\n    if ($p_entry['status'] == 'ok') {\n\n      // ----- Do the extraction (if not a folder)\n      if (!(($p_entry['external']&0x00000010)==0x00000010)) {\n        // ----- Look for not compressed file\n  //      if ($p_entry['compressed_size'] == $p_entry['size'])\n        if ($p_entry['compression'] == 0) {\n\n          // ----- Reading the file\n          $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);\n        }\n        else {\n\n          // ----- Reading the file\n          $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);\n\n          // ----- Decompress the file\n          if (($p_string = @gzinflate($v_data)) === FALSE) {\n              // TBC\n          }\n        }\n\n        // ----- Trace\n      }\n      else {\n          // TBC : error : can not extract a folder in a string\n      }\n\n    }\n\n  \t// ----- Change abort status\n  \tif ($p_entry['status'] == \"aborted\") {\n        $p_entry['status'] = \"skipped\";\n  \t}\n\n    // ----- Look for post-extract callback\n    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {\n\n      // ----- Generate a local information\n      $v_local_header = array();\n      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);\n\n      // ----- Swap the content to header\n      $v_local_header['content'] = $p_string;\n      $p_string = '';\n\n      // ----- Call the callback\n      // Here I do not use call_user_func() because I need to send a reference to the\n      // header.\n      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);\n\n      // ----- Swap back the content to header\n      $p_string = $v_local_header['content'];\n      unset($v_local_header['content']);\n\n      // ----- Look for abort result\n      if ($v_result == 2) {\n      \t$v_result = PCLZIP_ERR_USER_ABORTED;\n      }\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privReadFileHeader()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privReadFileHeader(&$p_header)\n  {\n    $v_result=1;\n\n    // ----- Read the 4 bytes signature\n    $v_binary_data = @fread($this->zip_fd, 4);\n    $v_data = unpack('Vid', $v_binary_data);\n\n    // ----- Check signature\n    if ($v_data['id'] != 0x04034b50)\n    {\n\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Read the first 42 bytes of the header\n    $v_binary_data = fread($this->zip_fd, 26);\n\n    // ----- Look for invalid block size\n    if (strlen($v_binary_data) != 26)\n    {\n      $p_header['filename'] = \"\";\n      $p_header['status'] = \"invalid_header\";\n\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid block size : \".strlen($v_binary_data));\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Extract the values\n    $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);\n\n    // ----- Get filename\n    $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);\n\n    // ----- Get extra_fields\n    if ($v_data['extra_len'] != 0) {\n      $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);\n    }\n    else {\n      $p_header['extra'] = '';\n    }\n\n    // ----- Extract properties\n    $p_header['version_extracted'] = $v_data['version'];\n    $p_header['compression'] = $v_data['compression'];\n    $p_header['size'] = $v_data['size'];\n    $p_header['compressed_size'] = $v_data['compressed_size'];\n    $p_header['crc'] = $v_data['crc'];\n    $p_header['flag'] = $v_data['flag'];\n    $p_header['filename_len'] = $v_data['filename_len'];\n\n    // ----- Recuperate date in UNIX format\n    $p_header['mdate'] = $v_data['mdate'];\n    $p_header['mtime'] = $v_data['mtime'];\n    if ($p_header['mdate'] && $p_header['mtime'])\n    {\n      // ----- Extract time\n      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;\n      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;\n      $v_seconde = ($p_header['mtime'] & 0x001F)*2;\n\n      // ----- Extract date\n      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;\n      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;\n      $v_day = $p_header['mdate'] & 0x001F;\n\n      // ----- Get UNIX date format\n      $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);\n\n    }\n    else\n    {\n      $p_header['mtime'] = time();\n    }\n\n    // TBC\n    //for(reset($v_data); $key = key($v_data); next($v_data)) {\n    //}\n\n    // ----- Set the stored filename\n    $p_header['stored_filename'] = $p_header['filename'];\n\n    // ----- Set the status field\n    $p_header['status'] = \"ok\";\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privReadCentralFileHeader()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privReadCentralFileHeader(&$p_header)\n  {\n    $v_result=1;\n\n    // ----- Read the 4 bytes signature\n    $v_binary_data = @fread($this->zip_fd, 4);\n    $v_data = unpack('Vid', $v_binary_data);\n\n    // ----- Check signature\n    if ($v_data['id'] != 0x02014b50)\n    {\n\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Read the first 42 bytes of the header\n    $v_binary_data = fread($this->zip_fd, 42);\n\n    // ----- Look for invalid block size\n    if (strlen($v_binary_data) != 42)\n    {\n      $p_header['filename'] = \"\";\n      $p_header['status'] = \"invalid_header\";\n\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid block size : \".strlen($v_binary_data));\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Extract the values\n    $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);\n\n    // ----- Get filename\n    if ($p_header['filename_len'] != 0)\n      $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);\n    else\n      $p_header['filename'] = '';\n\n    // ----- Get extra\n    if ($p_header['extra_len'] != 0)\n      $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);\n    else\n      $p_header['extra'] = '';\n\n    // ----- Get comment\n    if ($p_header['comment_len'] != 0)\n      $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);\n    else\n      $p_header['comment'] = '';\n\n    // ----- Extract properties\n\n    // ----- Recuperate date in UNIX format\n    //if ($p_header['mdate'] && $p_header['mtime'])\n    // TBC : bug : this was ignoring time with 0/0/0\n    if (1)\n    {\n      // ----- Extract time\n      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;\n      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;\n      $v_seconde = ($p_header['mtime'] & 0x001F)*2;\n\n      // ----- Extract date\n      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;\n      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;\n      $v_day = $p_header['mdate'] & 0x001F;\n\n      // ----- Get UNIX date format\n      $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);\n\n    }\n    else\n    {\n      $p_header['mtime'] = time();\n    }\n\n    // ----- Set the stored filename\n    $p_header['stored_filename'] = $p_header['filename'];\n\n    // ----- Set default status to ok\n    $p_header['status'] = 'ok';\n\n    // ----- Look if it is a directory\n    if (substr($p_header['filename'], -1) == '/') {\n      //$p_header['external'] = 0x41FF0010;\n      $p_header['external'] = 0x00000010;\n    }\n\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privCheckFileHeaders()\n  // Description :\n  // Parameters :\n  // Return Values :\n  //   1 on success,\n  //   0 on error;\n  // --------------------------------------------------------------------------------\n  function privCheckFileHeaders(&$p_local_header, &$p_central_header)\n  {\n    $v_result=1;\n\n  \t// ----- Check the static values\n  \t// TBC\n  \tif ($p_local_header['filename'] != $p_central_header['filename']) {\n  \t}\n  \tif ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {\n  \t}\n  \tif ($p_local_header['flag'] != $p_central_header['flag']) {\n  \t}\n  \tif ($p_local_header['compression'] != $p_central_header['compression']) {\n  \t}\n  \tif ($p_local_header['mtime'] != $p_central_header['mtime']) {\n  \t}\n  \tif ($p_local_header['filename_len'] != $p_central_header['filename_len']) {\n  \t}\n\n  \t// ----- Look for flag bit 3\n  \tif (($p_local_header['flag'] & 8) == 8) {\n          $p_local_header['size'] = $p_central_header['size'];\n          $p_local_header['compressed_size'] = $p_central_header['compressed_size'];\n          $p_local_header['crc'] = $p_central_header['crc'];\n  \t}\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privReadEndCentralDir()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privReadEndCentralDir(&$p_central_dir)\n  {\n    $v_result=1;\n\n    // ----- Go to the end of the zip file\n    $v_size = filesize($this->zipname);\n    @fseek($this->zip_fd, $v_size);\n    if (@ftell($this->zip_fd) != $v_size)\n    {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \\''.$this->zipname.'\\'');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- First try : look if this is an archive with no commentaries (most of the time)\n    // in this case the end of central dir is at 22 bytes of the file end\n    $v_found = 0;\n    if ($v_size > 26) {\n      @fseek($this->zip_fd, $v_size-22);\n      if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))\n      {\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \\''.$this->zipname.'\\'');\n\n        // ----- Return\n        return PclZip::errorCode();\n      }\n\n      // ----- Read for bytes\n      $v_binary_data = @fread($this->zip_fd, 4);\n      $v_data = @unpack('Vid', $v_binary_data);\n\n      // ----- Check signature\n      if ($v_data['id'] == 0x06054b50) {\n        $v_found = 1;\n      }\n\n      $v_pos = ftell($this->zip_fd);\n    }\n\n    // ----- Go back to the maximum possible size of the Central Dir End Record\n    if (!$v_found) {\n      $v_maximum_size = 65557; // 0xFFFF + 22;\n      if ($v_maximum_size > $v_size)\n        $v_maximum_size = $v_size;\n      @fseek($this->zip_fd, $v_size-$v_maximum_size);\n      if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))\n      {\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \\''.$this->zipname.'\\'');\n\n        // ----- Return\n        return PclZip::errorCode();\n      }\n\n      // ----- Read byte per byte in order to find the signature\n      $v_pos = ftell($this->zip_fd);\n      $v_bytes = 0x00000000;\n      while ($v_pos < $v_size)\n      {\n        // ----- Read a byte\n        $v_byte = @fread($this->zip_fd, 1);\n\n        // -----  Add the byte\n        //$v_bytes = ($v_bytes << 8) | Ord($v_byte);\n        // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number\n        // Otherwise on systems where we have 64bit integers the check below for the magic number will fail.\n        $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);\n\n        // ----- Compare the bytes\n        if ($v_bytes == 0x504b0506)\n        {\n          $v_pos++;\n          break;\n        }\n\n        $v_pos++;\n      }\n\n      // ----- Look if not found end of central dir\n      if ($v_pos == $v_size)\n      {\n\n        // ----- Error log\n        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Unable to find End of Central Dir Record signature\");\n\n        // ----- Return\n        return PclZip::errorCode();\n      }\n    }\n\n    // ----- Read the first 18 bytes of the header\n    $v_binary_data = fread($this->zip_fd, 18);\n\n    // ----- Look for invalid block size\n    if (strlen($v_binary_data) != 18)\n    {\n\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, \"Invalid End of Central Dir Record size : \".strlen($v_binary_data));\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Extract the values\n    $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);\n\n    // ----- Check the global size\n    if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {\n\n\t  // ----- Removed in release 2.2 see readme file\n\t  // The check of the file size is a little too strict.\n\t  // Some bugs where found when a zip is encrypted/decrypted with 'crypt'.\n\t  // While decrypted, zip has training 0 bytes\n\t  if (0) {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,\n\t                       'The central dir is not at the end of the archive.'\n\t\t\t\t\t\t   .' Some trailing bytes exists after the archive.');\n\n      // ----- Return\n      return PclZip::errorCode();\n\t  }\n    }\n\n    // ----- Get comment\n    if ($v_data['comment_size'] != 0) {\n      $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);\n    }\n    else\n      $p_central_dir['comment'] = '';\n\n    $p_central_dir['entries'] = $v_data['entries'];\n    $p_central_dir['disk_entries'] = $v_data['disk_entries'];\n    $p_central_dir['offset'] = $v_data['offset'];\n    $p_central_dir['size'] = $v_data['size'];\n    $p_central_dir['disk'] = $v_data['disk'];\n    $p_central_dir['disk_start'] = $v_data['disk_start'];\n\n    // TBC\n    //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {\n    //}\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privDeleteByRule()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privDeleteByRule(&$p_result_list, &$p_options)\n  {\n    $v_result=1;\n    $v_list_detail = array();\n\n    // ----- Open the zip file\n    if (($v_result=$this->privOpenFd('rb')) != 1)\n    {\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Read the central directory informations\n    $v_central_dir = array();\n    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)\n    {\n      $this->privCloseFd();\n      return $v_result;\n    }\n\n    // ----- Go to beginning of File\n    @rewind($this->zip_fd);\n\n    // ----- Scan all the files\n    // ----- Start at beginning of Central Dir\n    $v_pos_entry = $v_central_dir['offset'];\n    @rewind($this->zip_fd);\n    if (@fseek($this->zip_fd, $v_pos_entry))\n    {\n      // ----- Close the zip file\n      $this->privCloseFd();\n\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Read each entry\n    $v_header_list = array();\n    $j_start = 0;\n    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)\n    {\n\n      // ----- Read the file header\n      $v_header_list[$v_nb_extracted] = array();\n      if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)\n      {\n        // ----- Close the zip file\n        $this->privCloseFd();\n\n        return $v_result;\n      }\n\n\n      // ----- Store the index\n      $v_header_list[$v_nb_extracted]['index'] = $i;\n\n      // ----- Look for the specific extract rules\n      $v_found = false;\n\n      // ----- Look for extract by name rule\n      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))\n          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {\n\n          // ----- Look if the filename is in the list\n          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {\n\n              // ----- Look for a directory\n              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == \"/\") {\n\n                  // ----- Look if the directory is in the filename path\n                  if (   (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))\n                      && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {\n                      $v_found = true;\n                  }\n                  elseif (   (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */\n                          && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {\n                      $v_found = true;\n                  }\n              }\n              // ----- Look for a filename\n              elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {\n                  $v_found = true;\n              }\n          }\n      }\n\n      // ----- Look for extract by ereg rule\n      // ereg() is deprecated with PHP 5.3\n      /*\n      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))\n               && ($p_options[PCLZIP_OPT_BY_EREG] != \"\")) {\n\n          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {\n              $v_found = true;\n          }\n      }\n      */\n\n      // ----- Look for extract by preg rule\n      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))\n               && ($p_options[PCLZIP_OPT_BY_PREG] != \"\")) {\n\n          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {\n              $v_found = true;\n          }\n      }\n\n      // ----- Look for extract by index rule\n      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))\n               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {\n\n          // ----- Look if the index is in the list\n          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {\n\n              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {\n                  $v_found = true;\n              }\n              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {\n                  $j_start = $j+1;\n              }\n\n              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {\n                  break;\n              }\n          }\n      }\n      else {\n      \t$v_found = true;\n      }\n\n      // ----- Look for deletion\n      if ($v_found)\n      {\n        unset($v_header_list[$v_nb_extracted]);\n      }\n      else\n      {\n        $v_nb_extracted++;\n      }\n    }\n\n    // ----- Look if something need to be deleted\n    if ($v_nb_extracted > 0) {\n\n        // ----- Creates a temporay file\n        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';\n\n        // ----- Creates a temporary zip archive\n        $v_temp_zip = new PclZip($v_zip_temp_name);\n\n        // ----- Open the temporary zip file in write mode\n        if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {\n            $this->privCloseFd();\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Look which file need to be kept\n        for ($i=0; $i<sizeof($v_header_list); $i++) {\n\n            // ----- Calculate the position of the header\n            @rewind($this->zip_fd);\n            if (@fseek($this->zip_fd,  $v_header_list[$i]['offset'])) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n                $v_temp_zip->privCloseFd();\n                @unlink($v_zip_temp_name);\n\n                // ----- Error log\n                PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');\n\n                // ----- Return\n                return PclZip::errorCode();\n            }\n\n            // ----- Read the file header\n            $v_local_header = array();\n            if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n                $v_temp_zip->privCloseFd();\n                @unlink($v_zip_temp_name);\n\n                // ----- Return\n                return $v_result;\n            }\n\n            // ----- Check that local file header is same as central file header\n            if ($this->privCheckFileHeaders($v_local_header,\n\t\t\t                                $v_header_list[$i]) != 1) {\n                // TBC\n            }\n            unset($v_local_header);\n\n            // ----- Write the file header\n            if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n                $v_temp_zip->privCloseFd();\n                @unlink($v_zip_temp_name);\n\n                // ----- Return\n                return $v_result;\n            }\n\n            // ----- Read/write the data block\n            if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {\n                // ----- Close the zip file\n                $this->privCloseFd();\n                $v_temp_zip->privCloseFd();\n                @unlink($v_zip_temp_name);\n\n                // ----- Return\n                return $v_result;\n            }\n        }\n\n        // ----- Store the offset of the central dir\n        $v_offset = @ftell($v_temp_zip->zip_fd);\n\n        // ----- Re-Create the Central Dir files header\n        for ($i=0; $i<sizeof($v_header_list); $i++) {\n            // ----- Create the file header\n            if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {\n                $v_temp_zip->privCloseFd();\n                $this->privCloseFd();\n                @unlink($v_zip_temp_name);\n\n                // ----- Return\n                return $v_result;\n            }\n\n            // ----- Transform the header to a 'usable' info\n            $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);\n        }\n\n\n        // ----- Zip file comment\n        $v_comment = '';\n        if (isset($p_options[PCLZIP_OPT_COMMENT])) {\n          $v_comment = $p_options[PCLZIP_OPT_COMMENT];\n        }\n\n        // ----- Calculate the size of the central header\n        $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;\n\n        // ----- Create the central dir footer\n        if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {\n            // ----- Reset the file list\n            unset($v_header_list);\n            $v_temp_zip->privCloseFd();\n            $this->privCloseFd();\n            @unlink($v_zip_temp_name);\n\n            // ----- Return\n            return $v_result;\n        }\n\n        // ----- Close\n        $v_temp_zip->privCloseFd();\n        $this->privCloseFd();\n\n        // ----- Delete the zip file\n        // TBC : I should test the result ...\n        @unlink($this->zipname);\n\n        // ----- Rename the temporary file\n        // TBC : I should test the result ...\n        //@rename($v_zip_temp_name, $this->zipname);\n        PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n        // ----- Destroy the temporary archive\n        unset($v_temp_zip);\n    }\n\n    // ----- Remove every files : reset the file\n    else if ($v_central_dir['entries'] != 0) {\n        $this->privCloseFd();\n\n        if (($v_result = $this->privOpenFd('wb')) != 1) {\n          return $v_result;\n        }\n\n        if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {\n          return $v_result;\n        }\n\n        $this->privCloseFd();\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privDirCheck()\n  // Description :\n  //   Check if a directory exists, if not it creates it and all the parents directory\n  //   which may be useful.\n  // Parameters :\n  //   $p_dir : Directory path to check.\n  // Return Values :\n  //    1 : OK\n  //   -1 : Unable to create directory\n  // --------------------------------------------------------------------------------\n  function privDirCheck($p_dir, $p_is_dir=false)\n  {\n    $v_result = 1;\n\n\n    // ----- Remove the final '/'\n    if (($p_is_dir) && (substr($p_dir, -1)=='/'))\n    {\n      $p_dir = substr($p_dir, 0, strlen($p_dir)-1);\n    }\n\n    // ----- Check the directory availability\n    if ((is_dir($p_dir)) || ($p_dir == \"\"))\n    {\n      return 1;\n    }\n\n    // ----- Extract parent directory\n    $p_parent_dir = dirname($p_dir);\n\n    // ----- Just a check\n    if ($p_parent_dir != $p_dir)\n    {\n      // ----- Look for parent directory\n      if ($p_parent_dir != \"\")\n      {\n        if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)\n        {\n          return $v_result;\n        }\n      }\n    }\n\n    // ----- Create the directory\n    if (!@mkdir($p_dir, 0777))\n    {\n      // ----- Error log\n      PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, \"Unable to create directory '$p_dir'\");\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privMerge()\n  // Description :\n  //   If $p_archive_to_add does not exist, the function exit with a success result.\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privMerge(&$p_archive_to_add)\n  {\n    $v_result=1;\n\n    // ----- Look if the archive_to_add exists\n    if (!is_file($p_archive_to_add->zipname))\n    {\n\n      // ----- Nothing to merge, so merge is a success\n      $v_result = 1;\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Look if the archive exists\n    if (!is_file($this->zipname))\n    {\n\n      // ----- Do a duplicate\n      $v_result = $this->privDuplicate($p_archive_to_add->zipname);\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Open the zip file\n    if (($v_result=$this->privOpenFd('rb')) != 1)\n    {\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Read the central directory informations\n    $v_central_dir = array();\n    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)\n    {\n      $this->privCloseFd();\n      return $v_result;\n    }\n\n    // ----- Go to beginning of File\n    @rewind($this->zip_fd);\n\n    // ----- Open the archive_to_add file\n    if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)\n    {\n      $this->privCloseFd();\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Read the central directory informations\n    $v_central_dir_to_add = array();\n    if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)\n    {\n      $this->privCloseFd();\n      $p_archive_to_add->privCloseFd();\n\n      return $v_result;\n    }\n\n    // ----- Go to beginning of File\n    @rewind($p_archive_to_add->zip_fd);\n\n    // ----- Creates a temporay file\n    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';\n\n    // ----- Open the temporary file in write mode\n    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)\n    {\n      $this->privCloseFd();\n      $p_archive_to_add->privCloseFd();\n\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \\''.$v_zip_temp_name.'\\' in binary write mode');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Copy the files from the archive to the temporary file\n    // TBC : Here I should better append the file and go back to erase the central dir\n    $v_size = $v_central_dir['offset'];\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = fread($this->zip_fd, $v_read_size);\n      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Copy the files from the archive_to_add into the temporary file\n    $v_size = $v_central_dir_to_add['offset'];\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);\n      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Store the offset of the central dir\n    $v_offset = @ftell($v_zip_temp_fd);\n\n    // ----- Copy the block of file headers from the old archive\n    $v_size = $v_central_dir['size'];\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = @fread($this->zip_fd, $v_read_size);\n      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Copy the block of file headers from the archive_to_add\n    $v_size = $v_central_dir_to_add['size'];\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);\n      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Merge the file comments\n    $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];\n\n    // ----- Calculate the size of the (new) central header\n    $v_size = @ftell($v_zip_temp_fd)-$v_offset;\n\n    // ----- Swap the file descriptor\n    // Here is a trick : I swap the temporary fd with the zip fd, in order to use\n    // the following methods on the temporary fil and not the real archive fd\n    $v_swap = $this->zip_fd;\n    $this->zip_fd = $v_zip_temp_fd;\n    $v_zip_temp_fd = $v_swap;\n\n    // ----- Create the central dir footer\n    if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)\n    {\n      $this->privCloseFd();\n      $p_archive_to_add->privCloseFd();\n      @fclose($v_zip_temp_fd);\n      $this->zip_fd = null;\n\n      // ----- Reset the file list\n      unset($v_header_list);\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Swap back the file descriptor\n    $v_swap = $this->zip_fd;\n    $this->zip_fd = $v_zip_temp_fd;\n    $v_zip_temp_fd = $v_swap;\n\n    // ----- Close\n    $this->privCloseFd();\n    $p_archive_to_add->privCloseFd();\n\n    // ----- Close the temporary file\n    @fclose($v_zip_temp_fd);\n\n    // ----- Delete the zip file\n    // TBC : I should test the result ...\n    @unlink($this->zipname);\n\n    // ----- Rename the temporary file\n    // TBC : I should test the result ...\n    //@rename($v_zip_temp_name, $this->zipname);\n    PclZipUtilRename($v_zip_temp_name, $this->zipname);\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privDuplicate()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privDuplicate($p_archive_filename)\n  {\n    $v_result=1;\n\n    // ----- Look if the $p_archive_filename exists\n    if (!is_file($p_archive_filename))\n    {\n\n      // ----- Nothing to duplicate, so duplicate is a success.\n      $v_result = 1;\n\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Open the zip file\n    if (($v_result=$this->privOpenFd('wb')) != 1)\n    {\n      // ----- Return\n      return $v_result;\n    }\n\n    // ----- Open the temporary file in write mode\n    if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)\n    {\n      $this->privCloseFd();\n\n      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \\''.$p_archive_filename.'\\' in binary write mode');\n\n      // ----- Return\n      return PclZip::errorCode();\n    }\n\n    // ----- Copy the files from the archive to the temporary file\n    // TBC : Here I should better append the file and go back to erase the central dir\n    $v_size = filesize($p_archive_filename);\n    while ($v_size != 0)\n    {\n      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);\n      $v_buffer = fread($v_zip_temp_fd, $v_read_size);\n      @fwrite($this->zip_fd, $v_buffer, $v_read_size);\n      $v_size -= $v_read_size;\n    }\n\n    // ----- Close\n    $this->privCloseFd();\n\n    // ----- Close the temporary file\n    @fclose($v_zip_temp_fd);\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privErrorLog()\n  // Description :\n  // Parameters :\n  // --------------------------------------------------------------------------------\n  function privErrorLog($p_error_code=0, $p_error_string='')\n  {\n    if (PCLZIP_ERROR_EXTERNAL == 1) {\n      PclError($p_error_code, $p_error_string);\n    }\n    else {\n      $this->error_code = $p_error_code;\n      $this->error_string = $p_error_string;\n    }\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privErrorReset()\n  // Description :\n  // Parameters :\n  // --------------------------------------------------------------------------------\n  function privErrorReset()\n  {\n    if (PCLZIP_ERROR_EXTERNAL == 1) {\n      PclErrorReset();\n    }\n    else {\n      $this->error_code = 0;\n      $this->error_string = '';\n    }\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privDisableMagicQuotes()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privDisableMagicQuotes()\n  {\n    $v_result=1;\n\n    // ----- Look if function exists\n    if (   (!function_exists(\"get_magic_quotes_runtime\"))\n\t    || (!function_exists(\"set_magic_quotes_runtime\"))) {\n      return $v_result;\n\t}\n\n    // ----- Look if already done\n    if ($this->magic_quotes_status != -1) {\n      return $v_result;\n\t}\n\n\t// ----- Get and memorize the magic_quote value\n\t$this->magic_quotes_status = @get_magic_quotes_runtime();\n\n\t// ----- Disable magic_quotes\n\tif ($this->magic_quotes_status == 1) {\n\t  @set_magic_quotes_runtime(0);\n\t}\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : privSwapBackMagicQuotes()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function privSwapBackMagicQuotes()\n  {\n    $v_result=1;\n\n    // ----- Look if function exists\n    if (   (!function_exists(\"get_magic_quotes_runtime\"))\n\t    || (!function_exists(\"set_magic_quotes_runtime\"))) {\n      return $v_result;\n\t}\n\n    // ----- Look if something to do\n    if ($this->magic_quotes_status != -1) {\n      return $v_result;\n\t}\n\n\t// ----- Swap back magic_quotes\n\tif ($this->magic_quotes_status == 1) {\n  \t  @set_magic_quotes_runtime($this->magic_quotes_status);\n\t}\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  }\n  // End of class\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : PclZipUtilPathReduction()\n  // Description :\n  // Parameters :\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function PclZipUtilPathReduction($p_dir)\n  {\n    $v_result = \"\";\n\n    // ----- Look for not empty path\n    if ($p_dir != \"\") {\n      // ----- Explode path by directory names\n      $v_list = explode(\"/\", $p_dir);\n\n      // ----- Study directories from last to first\n      $v_skip = 0;\n      for ($i=sizeof($v_list)-1; $i>=0; $i--) {\n        // ----- Look for current path\n        if ($v_list[$i] == \".\") {\n          // ----- Ignore this directory\n          // Should be the first $i=0, but no check is done\n        }\n        else if ($v_list[$i] == \"..\") {\n\t\t  $v_skip++;\n        }\n        else if ($v_list[$i] == \"\") {\n\t\t  // ----- First '/' i.e. root slash\n\t\t  if ($i == 0) {\n            $v_result = \"/\".$v_result;\n\t\t    if ($v_skip > 0) {\n\t\t        // ----- It is an invalid path, so the path is not modified\n\t\t        // TBC\n\t\t        $v_result = $p_dir;\n                $v_skip = 0;\n\t\t    }\n\t\t  }\n\t\t  // ----- Last '/' i.e. indicates a directory\n\t\t  else if ($i == (sizeof($v_list)-1)) {\n            $v_result = $v_list[$i];\n\t\t  }\n\t\t  // ----- Double '/' inside the path\n\t\t  else {\n            // ----- Ignore only the double '//' in path,\n            // but not the first and last '/'\n\t\t  }\n        }\n        else {\n\t\t  // ----- Look for item to skip\n\t\t  if ($v_skip > 0) {\n\t\t    $v_skip--;\n\t\t  }\n\t\t  else {\n            $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?\"/\".$v_result:\"\");\n\t\t  }\n        }\n      }\n\n      // ----- Look for skip\n      if ($v_skip > 0) {\n        while ($v_skip > 0) {\n            $v_result = '../'.$v_result;\n            $v_skip--;\n        }\n      }\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : PclZipUtilPathInclusion()\n  // Description :\n  //   This function indicates if the path $p_path is under the $p_dir tree. Or,\n  //   said in an other way, if the file or sub-dir $p_path is inside the dir\n  //   $p_dir.\n  //   The function indicates also if the path is exactly the same as the dir.\n  //   This function supports path with duplicated '/' like '//', but does not\n  //   support '.' or '..' statements.\n  // Parameters :\n  // Return Values :\n  //   0 if $p_path is not inside directory $p_dir\n  //   1 if $p_path is inside directory $p_dir\n  //   2 if $p_path is exactly the same as $p_dir\n  // --------------------------------------------------------------------------------\n  function PclZipUtilPathInclusion($p_dir, $p_path)\n  {\n    $v_result = 1;\n\n    // ----- Look for path beginning by ./\n    if (   ($p_dir == '.')\n        || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {\n      $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);\n    }\n    if (   ($p_path == '.')\n        || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {\n      $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);\n    }\n\n    // ----- Explode dir and path by directory separator\n    $v_list_dir = explode(\"/\", $p_dir);\n    $v_list_dir_size = sizeof($v_list_dir);\n    $v_list_path = explode(\"/\", $p_path);\n    $v_list_path_size = sizeof($v_list_path);\n\n    // ----- Study directories paths\n    $i = 0;\n    $j = 0;\n    while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {\n\n      // ----- Look for empty dir (path reduction)\n      if ($v_list_dir[$i] == '') {\n        $i++;\n        continue;\n      }\n      if ($v_list_path[$j] == '') {\n        $j++;\n        continue;\n      }\n\n      // ----- Compare the items\n      if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != ''))  {\n        $v_result = 0;\n      }\n\n      // ----- Next items\n      $i++;\n      $j++;\n    }\n\n    // ----- Look if everything seems to be the same\n    if ($v_result) {\n      // ----- Skip all the empty items\n      while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;\n      while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;\n\n      if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {\n        // ----- There are exactly the same\n        $v_result = 2;\n      }\n      else if ($i < $v_list_dir_size) {\n        // ----- The path is shorter than the dir\n        $v_result = 0;\n      }\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : PclZipUtilCopyBlock()\n  // Description :\n  // Parameters :\n  //   $p_mode : read/write compression mode\n  //             0 : src & dest normal\n  //             1 : src gzip, dest normal\n  //             2 : src normal, dest gzip\n  //             3 : src & dest gzip\n  // Return Values :\n  // --------------------------------------------------------------------------------\n  function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0)\n  {\n    $v_result = 1;\n\n    if ($p_mode==0)\n    {\n      while ($p_size != 0)\n      {\n        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n        $v_buffer = @fread($p_src, $v_read_size);\n        @fwrite($p_dest, $v_buffer, $v_read_size);\n        $p_size -= $v_read_size;\n      }\n    }\n    else if ($p_mode==1)\n    {\n      while ($p_size != 0)\n      {\n        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n        $v_buffer = @gzread($p_src, $v_read_size);\n        @fwrite($p_dest, $v_buffer, $v_read_size);\n        $p_size -= $v_read_size;\n      }\n    }\n    else if ($p_mode==2)\n    {\n      while ($p_size != 0)\n      {\n        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n        $v_buffer = @fread($p_src, $v_read_size);\n        @gzwrite($p_dest, $v_buffer, $v_read_size);\n        $p_size -= $v_read_size;\n      }\n    }\n    else if ($p_mode==3)\n    {\n      while ($p_size != 0)\n      {\n        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);\n        $v_buffer = @gzread($p_src, $v_read_size);\n        @gzwrite($p_dest, $v_buffer, $v_read_size);\n        $p_size -= $v_read_size;\n      }\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : PclZipUtilRename()\n  // Description :\n  //   This function tries to do a simple rename() function. If it fails, it\n  //   tries to copy the $p_src file in a new $p_dest file and then unlink the\n  //   first one.\n  // Parameters :\n  //   $p_src : Old filename\n  //   $p_dest : New filename\n  // Return Values :\n  //   1 on success, 0 on failure.\n  // --------------------------------------------------------------------------------\n  function PclZipUtilRename($p_src, $p_dest)\n  {\n    $v_result = 1;\n\n    // ----- Try to rename the files\n    if (!@rename($p_src, $p_dest)) {\n\n      // ----- Try to copy & unlink the src\n      if (!@copy($p_src, $p_dest)) {\n        $v_result = 0;\n      }\n      else if (!@unlink($p_src)) {\n        $v_result = 0;\n      }\n    }\n\n    // ----- Return\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : PclZipUtilOptionText()\n  // Description :\n  //   Translate option value in text. Mainly for debug purpose.\n  // Parameters :\n  //   $p_option : the option value.\n  // Return Values :\n  //   The option text value.\n  // --------------------------------------------------------------------------------\n  function PclZipUtilOptionText($p_option)\n  {\n\n    $v_list = get_defined_constants();\n    for (reset($v_list); $v_key = key($v_list); next($v_list)) {\n\t    $v_prefix = substr($v_key, 0, 10);\n\t    if ((   ($v_prefix == 'PCLZIP_OPT')\n           || ($v_prefix == 'PCLZIP_CB_')\n           || ($v_prefix == 'PCLZIP_ATT'))\n\t        && ($v_list[$v_key] == $p_option)) {\n        return $v_key;\n\t    }\n    }\n\n    $v_result = 'Unknown';\n\n    return $v_result;\n  }\n  // --------------------------------------------------------------------------------\n\n  // --------------------------------------------------------------------------------\n  // Function : PclZipUtilTranslateWinPath()\n  // Description :\n  //   Translate windows path by replacing '\\' by '/' and optionally removing\n  //   drive letter.\n  // Parameters :\n  //   $p_path : path to translate.\n  //   $p_remove_disk_letter : true | false\n  // Return Values :\n  //   The path translated.\n  // --------------------------------------------------------------------------------\n  function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true)\n  {\n    if (stristr(php_uname(), 'windows')) {\n      // ----- Look for potential disk letter\n      if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {\n          $p_path = substr($p_path, $v_position+1);\n      }\n      // ----- Change potential windows directory separator\n      if ((strpos($p_path, '\\\\') > 0) || (substr($p_path, 0,1) == '\\\\')) {\n          $p_path = strtr($p_path, '\\\\', '/');\n      }\n    }\n    return $p_path;\n  }\n  // --------------------------------------------------------------------------------\n\n\n?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-walker-category-checklist.php",
    "content": "<?php\n/**\n * Taxonomy API: Walker_Category_Checklist class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Core walker class to output an unordered list of category checkbox input elements.\n *\n * @since 2.5.1\n *\n * @see Walker\n * @see wp_category_checklist()\n * @see wp_terms_checklist()\n */\nclass Walker_Category_Checklist extends Walker {\n\tpublic $tree_type = 'category';\n\tpublic $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this\n\n\t/**\n\t * Starts the list before the elements are added.\n\t *\n\t * @see Walker:start_lvl()\n\t *\n\t * @since 2.5.1\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of category. Used for tab indentation.\n\t * @param array  $args   An array of arguments. @see wp_terms_checklist()\n\t */\n\tpublic function start_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$indent = str_repeat(\"\\t\", $depth);\n\t\t$output .= \"$indent<ul class='children'>\\n\";\n\t}\n\n\t/**\n\t * Ends the list of after the elements are added.\n\t *\n\t * @see Walker::end_lvl()\n\t *\n\t * @since 2.5.1\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of category. Used for tab indentation.\n\t * @param array  $args   An array of arguments. @see wp_terms_checklist()\n\t */\n\tpublic function end_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$indent = str_repeat(\"\\t\", $depth);\n\t\t$output .= \"$indent</ul>\\n\";\n\t}\n\n\t/**\n\t * Start the element output.\n\t *\n\t * @see Walker::start_el()\n\t *\n\t * @since 2.5.1\n\t *\n\t * @param string $output   Passed by reference. Used to append additional content.\n\t * @param object $category The current term object.\n\t * @param int    $depth    Depth of the term in reference to parents. Default 0.\n\t * @param array  $args     An array of arguments. @see wp_terms_checklist()\n\t * @param int    $id       ID of the current term.\n\t */\n\tpublic function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {\n\t\tif ( empty( $args['taxonomy'] ) ) {\n\t\t\t$taxonomy = 'category';\n\t\t} else {\n\t\t\t$taxonomy = $args['taxonomy'];\n\t\t}\n\n\t\tif ( $taxonomy == 'category' ) {\n\t\t\t$name = 'post_category';\n\t\t} else {\n\t\t\t$name = 'tax_input[' . $taxonomy . ']';\n\t\t}\n\n\t\t$args['popular_cats'] = empty( $args['popular_cats'] ) ? array() : $args['popular_cats'];\n\t\t$class = in_array( $category->term_id, $args['popular_cats'] ) ? ' class=\"popular-category\"' : '';\n\n\t\t$args['selected_cats'] = empty( $args['selected_cats'] ) ? array() : $args['selected_cats'];\n\n\t\tif ( ! empty( $args['list_only'] ) ) {\n\t\t\t$aria_cheched = 'false';\n\t\t\t$inner_class = 'category';\n\n\t\t\tif ( in_array( $category->term_id, $args['selected_cats'] ) ) {\n\t\t\t\t$inner_class .= ' selected';\n\t\t\t\t$aria_cheched = 'true';\n\t\t\t}\n\n\t\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t\t$output .= \"\\n\" . '<li' . $class . '>' .\n\t\t\t\t'<div class=\"' . $inner_class . '\" data-term-id=' . $category->term_id .\n\t\t\t\t' tabindex=\"0\" role=\"checkbox\" aria-checked=\"' . $aria_cheched . '\">' .\n\t\t\t\tesc_html( apply_filters( 'the_category', $category->name ) ) . '</div>';\n\t\t} else {\n\t\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t\t$output .= \"\\n<li id='{$taxonomy}-{$category->term_id}'$class>\" .\n\t\t\t\t'<label class=\"selectit\"><input value=\"' . $category->term_id . '\" type=\"checkbox\" name=\"'.$name.'[]\" id=\"in-'.$taxonomy.'-' . $category->term_id . '\"' .\n\t\t\t\tchecked( in_array( $category->term_id, $args['selected_cats'] ), true, false ) .\n\t\t\t\tdisabled( empty( $args['disabled'] ), false, false ) . ' /> ' .\n\t\t\t\tesc_html( apply_filters( 'the_category', $category->name ) ) . '</label>';\n\t\t}\n\t}\n\n\t/**\n\t * Ends the element output, if needed.\n\t *\n\t * @see Walker::end_el()\n\t *\n\t * @since 2.5.1\n\t *\n\t * @param string $output   Passed by reference. Used to append additional content.\n\t * @param object $category The current term object.\n\t * @param int    $depth    Depth of the term in reference to parents. Default 0.\n\t * @param array  $args     An array of arguments. @see wp_terms_checklist()\n\t */\n\tpublic function end_el( &$output, $category, $depth = 0, $args = array() ) {\n\t\t$output .= \"</li>\\n\";\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-walker-nav-menu-checklist.php",
    "content": "<?php\n/**\n * Navigation Menu API: Walker_Nav_Menu_Checklist class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Create HTML list of nav menu input items.\n *\n * @since 3.0.0\n * @uses Walker_Nav_Menu\n */\nclass Walker_Nav_Menu_Checklist extends Walker_Nav_Menu {\n\t/**\n\t *\n\t * @param array $fields\n\t */\n\tpublic function __construct( $fields = false ) {\n\t\tif ( $fields ) {\n\t\t\t$this->db_fields = $fields;\n\t\t}\n\t}\n\n\t/**\n\t * Starts the list before the elements are added.\n\t *\n\t * @see Walker_Nav_Menu::start_lvl()\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of page. Used for padding.\n\t * @param array  $args   Not used.\n\t */\n\tpublic function start_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$indent = str_repeat( \"\\t\", $depth );\n\t\t$output .= \"\\n$indent<ul class='children'>\\n\";\n\t}\n\n\t/**\n\t * Ends the list of after the elements are added.\n\t *\n\t * @see Walker_Nav_Menu::end_lvl()\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of page. Used for padding.\n\t * @param array  $args   Not used.\n\t */\n\tpublic function end_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$indent = str_repeat( \"\\t\", $depth );\n\t\t$output .= \"\\n$indent</ul>\";\n\t}\n\n\t/**\n\t * Start the element output.\n\t *\n\t * @see Walker_Nav_Menu::start_el()\n\t *\n\t * @since 3.0.0\n\t *\n\t * @global int $_nav_menu_placeholder\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param object $item   Menu item data object.\n\t * @param int    $depth  Depth of menu item. Used for padding.\n\t * @param array  $args   Not used.\n\t * @param int    $id     Not used.\n\t */\n\tpublic function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {\n\t\tglobal $_nav_menu_placeholder;\n\n\t\t$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;\n\t\t$possible_object_id = isset( $item->post_type ) && 'nav_menu_item' == $item->post_type ? $item->object_id : $_nav_menu_placeholder;\n\t\t$possible_db_id = ( ! empty( $item->ID ) ) && ( 0 < $possible_object_id ) ? (int) $item->ID : 0;\n\n\t\t$indent = ( $depth ) ? str_repeat( \"\\t\", $depth ) : '';\n\n\t\t$output .= $indent . '<li>';\n\t\t$output .= '<label class=\"menu-item-title\">';\n\t\t$output .= '<input type=\"checkbox\" class=\"menu-item-checkbox';\n\n\t\tif ( ! empty( $item->front_or_home ) )\n\t\t\t$output .= ' add-to-top';\n\n\t\t$output .= '\" name=\"menu-item[' . $possible_object_id . '][menu-item-object-id]\" value=\"'. esc_attr( $item->object_id ) .'\" /> ';\n\n\t\tif ( ! empty( $item->label ) ) {\n\t\t\t$title = $item->label;\n\t\t} elseif ( isset( $item->post_type ) ) {\n\t\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t\t$title = apply_filters( 'the_title', $item->post_title, $item->ID );\n\t\t\tif ( ! empty( $item->front_or_home ) && _x( 'Home', 'nav menu home label' ) !== $title )\n\t\t\t\t$title = sprintf( _x( 'Home: %s', 'nav menu front page title' ), $title );\n\t\t}\n\n\t\t$output .= isset( $title ) ? esc_html( $title ) : esc_html( $item->title );\n \t\t$output .= '</label>';\n\n\t\t// Menu item hidden fields\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-db-id\" name=\"menu-item[' . $possible_object_id . '][menu-item-db-id]\" value=\"' . $possible_db_id . '\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-object\" name=\"menu-item[' . $possible_object_id . '][menu-item-object]\" value=\"'. esc_attr( $item->object ) .'\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-parent-id\" name=\"menu-item[' . $possible_object_id . '][menu-item-parent-id]\" value=\"'. esc_attr( $item->menu_item_parent ) .'\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-type\" name=\"menu-item[' . $possible_object_id . '][menu-item-type]\" value=\"'. esc_attr( $item->type ) .'\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-title\" name=\"menu-item[' . $possible_object_id . '][menu-item-title]\" value=\"'. esc_attr( $item->title ) .'\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-url\" name=\"menu-item[' . $possible_object_id . '][menu-item-url]\" value=\"'. esc_attr( $item->url ) .'\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-target\" name=\"menu-item[' . $possible_object_id . '][menu-item-target]\" value=\"'. esc_attr( $item->target ) .'\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-attr_title\" name=\"menu-item[' . $possible_object_id . '][menu-item-attr_title]\" value=\"'. esc_attr( $item->attr_title ) .'\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-classes\" name=\"menu-item[' . $possible_object_id . '][menu-item-classes]\" value=\"'. esc_attr( implode( ' ', $item->classes ) ) .'\" />';\n\t\t$output .= '<input type=\"hidden\" class=\"menu-item-xfn\" name=\"menu-item[' . $possible_object_id . '][menu-item-xfn]\" value=\"'. esc_attr( $item->xfn ) .'\" />';\n\t}\n\n} // Walker_Nav_Menu_Checklist\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-walker-nav-menu-edit.php",
    "content": "<?php\n/**\n * Navigation Menu API: Walker_Nav_Menu_Edit class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Create HTML list of nav menu input items.\n *\n * @package WordPress\n * @since 3.0.0\n * @uses Walker_Nav_Menu\n */\nclass Walker_Nav_Menu_Edit extends Walker_Nav_Menu {\n\t/**\n\t * Starts the list before the elements are added.\n\t *\n\t * @see Walker_Nav_Menu::start_lvl()\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $output Passed by reference.\n\t * @param int    $depth  Depth of menu item. Used for padding.\n\t * @param array  $args   Not used.\n\t */\n\tpublic function start_lvl( &$output, $depth = 0, $args = array() ) {}\n\n\t/**\n\t * Ends the list of after the elements are added.\n\t *\n\t * @see Walker_Nav_Menu::end_lvl()\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $output Passed by reference.\n\t * @param int    $depth  Depth of menu item. Used for padding.\n\t * @param array  $args   Not used.\n\t */\n\tpublic function end_lvl( &$output, $depth = 0, $args = array() ) {}\n\n\t/**\n\t * Start the element output.\n\t *\n\t * @see Walker_Nav_Menu::start_el()\n\t * @since 3.0.0\n\t *\n\t * @global int $_wp_nav_menu_max_depth\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param object $item   Menu item data object.\n\t * @param int    $depth  Depth of menu item. Used for padding.\n\t * @param array  $args   Not used.\n\t * @param int    $id     Not used.\n\t */\n\tpublic function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {\n\t\tglobal $_wp_nav_menu_max_depth;\n\t\t$_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;\n\n\t\tob_start();\n\t\t$item_id = esc_attr( $item->ID );\n\t\t$removed_args = array(\n\t\t\t'action',\n\t\t\t'customlink-tab',\n\t\t\t'edit-menu-item',\n\t\t\t'menu-item',\n\t\t\t'page-tab',\n\t\t\t'_wpnonce',\n\t\t);\n\n\t\t$original_title = '';\n\t\tif ( 'taxonomy' == $item->type ) {\n\t\t\t$original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );\n\t\t\tif ( is_wp_error( $original_title ) )\n\t\t\t\t$original_title = false;\n\t\t} elseif ( 'post_type' == $item->type ) {\n\t\t\t$original_object = get_post( $item->object_id );\n\t\t\t$original_title = get_the_title( $original_object->ID );\n\t\t} elseif ( 'post_type_archive' == $item->type ) {\n\t\t\t$original_object = get_post_type_object( $item->object );\n\t\t\t$original_title = $original_object->labels->archives;\n\t\t}\n\n\t\t$classes = array(\n\t\t\t'menu-item menu-item-depth-' . $depth,\n\t\t\t'menu-item-' . esc_attr( $item->object ),\n\t\t\t'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive'),\n\t\t);\n\n\t\t$title = $item->title;\n\n\t\tif ( ! empty( $item->_invalid ) ) {\n\t\t\t$classes[] = 'menu-item-invalid';\n\t\t\t/* translators: %s: title of menu item which is invalid */\n\t\t\t$title = sprintf( __( '%s (Invalid)' ), $item->title );\n\t\t} elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) {\n\t\t\t$classes[] = 'pending';\n\t\t\t/* translators: %s: title of menu item in draft status */\n\t\t\t$title = sprintf( __('%s (Pending)'), $item->title );\n\t\t}\n\n\t\t$title = ( ! isset( $item->label ) || '' == $item->label ) ? $title : $item->label;\n\n\t\t$submenu_text = '';\n\t\tif ( 0 == $depth )\n\t\t\t$submenu_text = 'style=\"display: none;\"';\n\n\t\t?>\n\t\t<li id=\"menu-item-<?php echo $item_id; ?>\" class=\"<?php echo implode(' ', $classes ); ?>\">\n\t\t\t<div class=\"menu-item-bar\">\n\t\t\t\t<div class=\"menu-item-handle\">\n\t\t\t\t\t<span class=\"item-title\"><span class=\"menu-item-title\"><?php echo esc_html( $title ); ?></span> <span class=\"is-submenu\" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span></span>\n\t\t\t\t\t<span class=\"item-controls\">\n\t\t\t\t\t\t<span class=\"item-type\"><?php echo esc_html( $item->type_label ); ?></span>\n\t\t\t\t\t\t<span class=\"item-order hide-if-js\">\n\t\t\t\t\t\t\t<a href=\"<?php\n\t\t\t\t\t\t\t\techo wp_nonce_url(\n\t\t\t\t\t\t\t\t\tadd_query_arg(\n\t\t\t\t\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t\t\t\t\t'action' => 'move-up-menu-item',\n\t\t\t\t\t\t\t\t\t\t\t'menu-item' => $item_id,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\tremove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t'move-menu_item'\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t?>\" class=\"item-move-up\"><abbr title=\"<?php esc_attr_e('Move up'); ?>\">&#8593;</abbr></a>\n\t\t\t\t\t\t\t|\n\t\t\t\t\t\t\t<a href=\"<?php\n\t\t\t\t\t\t\t\techo wp_nonce_url(\n\t\t\t\t\t\t\t\t\tadd_query_arg(\n\t\t\t\t\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t\t\t\t\t'action' => 'move-down-menu-item',\n\t\t\t\t\t\t\t\t\t\t\t'menu-item' => $item_id,\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\tremove_query_arg($removed_args, admin_url( 'nav-menus.php' ) )\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t'move-menu_item'\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t?>\" class=\"item-move-down\"><abbr title=\"<?php esc_attr_e('Move down'); ?>\">&#8595;</abbr></a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<a class=\"item-edit\" id=\"edit-<?php echo $item_id; ?>\" title=\"<?php esc_attr_e('Edit Menu Item'); ?>\" href=\"<?php\n\t\t\t\t\t\t\techo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.php' ) : add_query_arg( 'edit-menu-item', $item_id, remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) ) );\n\t\t\t\t\t\t?>\"><?php _e( 'Edit Menu Item' ); ?></a>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"menu-item-settings\" id=\"menu-item-settings-<?php echo $item_id; ?>\">\n\t\t\t\t<?php if ( 'custom' == $item->type ) : ?>\n\t\t\t\t\t<p class=\"field-url description description-wide\">\n\t\t\t\t\t\t<label for=\"edit-menu-item-url-<?php echo $item_id; ?>\">\n\t\t\t\t\t\t\t<?php _e( 'URL' ); ?><br />\n\t\t\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-url-<?php echo $item_id; ?>\" class=\"widefat code edit-menu-item-url\" name=\"menu-item-url[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->url ); ?>\" />\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</p>\n\t\t\t\t<?php endif; ?>\n\t\t\t\t<p class=\"description description-wide\">\n\t\t\t\t\t<label for=\"edit-menu-item-title-<?php echo $item_id; ?>\">\n\t\t\t\t\t\t<?php _e( 'Navigation Label' ); ?><br />\n\t\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-title-<?php echo $item_id; ?>\" class=\"widefat edit-menu-item-title\" name=\"menu-item-title[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->title ); ?>\" />\n\t\t\t\t\t</label>\n\t\t\t\t</p>\n\t\t\t\t<p class=\"field-title-attribute description description-wide\">\n\t\t\t\t\t<label for=\"edit-menu-item-attr-title-<?php echo $item_id; ?>\">\n\t\t\t\t\t\t<?php _e( 'Title Attribute' ); ?><br />\n\t\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-attr-title-<?php echo $item_id; ?>\" class=\"widefat edit-menu-item-attr-title\" name=\"menu-item-attr-title[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->post_excerpt ); ?>\" />\n\t\t\t\t\t</label>\n\t\t\t\t</p>\n\t\t\t\t<p class=\"field-link-target description\">\n\t\t\t\t\t<label for=\"edit-menu-item-target-<?php echo $item_id; ?>\">\n\t\t\t\t\t\t<input type=\"checkbox\" id=\"edit-menu-item-target-<?php echo $item_id; ?>\" value=\"_blank\" name=\"menu-item-target[<?php echo $item_id; ?>]\"<?php checked( $item->target, '_blank' ); ?> />\n\t\t\t\t\t\t<?php _e( 'Open link in a new tab' ); ?>\n\t\t\t\t\t</label>\n\t\t\t\t</p>\n\t\t\t\t<p class=\"field-css-classes description description-thin\">\n\t\t\t\t\t<label for=\"edit-menu-item-classes-<?php echo $item_id; ?>\">\n\t\t\t\t\t\t<?php _e( 'CSS Classes (optional)' ); ?><br />\n\t\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-classes-<?php echo $item_id; ?>\" class=\"widefat code edit-menu-item-classes\" name=\"menu-item-classes[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( implode(' ', $item->classes ) ); ?>\" />\n\t\t\t\t\t</label>\n\t\t\t\t</p>\n\t\t\t\t<p class=\"field-xfn description description-thin\">\n\t\t\t\t\t<label for=\"edit-menu-item-xfn-<?php echo $item_id; ?>\">\n\t\t\t\t\t\t<?php _e( 'Link Relationship (XFN)' ); ?><br />\n\t\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-xfn-<?php echo $item_id; ?>\" class=\"widefat code edit-menu-item-xfn\" name=\"menu-item-xfn[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->xfn ); ?>\" />\n\t\t\t\t\t</label>\n\t\t\t\t</p>\n\t\t\t\t<p class=\"field-description description description-wide\">\n\t\t\t\t\t<label for=\"edit-menu-item-description-<?php echo $item_id; ?>\">\n\t\t\t\t\t\t<?php _e( 'Description' ); ?><br />\n\t\t\t\t\t\t<textarea id=\"edit-menu-item-description-<?php echo $item_id; ?>\" class=\"widefat edit-menu-item-description\" rows=\"3\" cols=\"20\" name=\"menu-item-description[<?php echo $item_id; ?>]\"><?php echo esc_html( $item->description ); // textarea_escaped ?></textarea>\n\t\t\t\t\t\t<span class=\"description\"><?php _e('The description will be displayed in the menu if the current theme supports it.'); ?></span>\n\t\t\t\t\t</label>\n\t\t\t\t</p>\n\n\t\t\t\t<p class=\"field-move hide-if-no-js description description-wide\">\n\t\t\t\t\t<label>\n\t\t\t\t\t\t<span><?php _e( 'Move' ); ?></span>\n\t\t\t\t\t\t<a href=\"#\" class=\"menus-move menus-move-up\" data-dir=\"up\"><?php _e( 'Up one' ); ?></a>\n\t\t\t\t\t\t<a href=\"#\" class=\"menus-move menus-move-down\" data-dir=\"down\"><?php _e( 'Down one' ); ?></a>\n\t\t\t\t\t\t<a href=\"#\" class=\"menus-move menus-move-left\" data-dir=\"left\"></a>\n\t\t\t\t\t\t<a href=\"#\" class=\"menus-move menus-move-right\" data-dir=\"right\"></a>\n\t\t\t\t\t\t<a href=\"#\" class=\"menus-move menus-move-top\" data-dir=\"top\"><?php _e( 'To the top' ); ?></a>\n\t\t\t\t\t</label>\n\t\t\t\t</p>\n\n\t\t\t\t<div class=\"menu-item-actions description-wide submitbox\">\n\t\t\t\t\t<?php if ( 'custom' != $item->type && $original_title !== false ) : ?>\n\t\t\t\t\t\t<p class=\"link-to-original\">\n\t\t\t\t\t\t\t<?php printf( __('Original: %s'), '<a href=\"' . esc_attr( $item->url ) . '\">' . esc_html( $original_title ) . '</a>' ); ?>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t<a class=\"item-delete submitdelete deletion\" id=\"delete-<?php echo $item_id; ?>\" href=\"<?php\n\t\t\t\t\techo wp_nonce_url(\n\t\t\t\t\t\tadd_query_arg(\n\t\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t\t'action' => 'delete-menu-item',\n\t\t\t\t\t\t\t\t'menu-item' => $item_id,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tadmin_url( 'nav-menus.php' )\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'delete-menu_item_' . $item_id\n\t\t\t\t\t); ?>\"><?php _e( 'Remove' ); ?></a> <span class=\"meta-sep hide-if-no-js\"> | </span> <a class=\"item-cancel submitcancel hide-if-no-js\" id=\"cancel-<?php echo $item_id; ?>\" href=\"<?php echo esc_url( add_query_arg( array( 'edit-menu-item' => $item_id, 'cancel' => time() ), admin_url( 'nav-menus.php' ) ) );\n\t\t\t\t\t\t?>#menu-item-settings-<?php echo $item_id; ?>\"><?php _e('Cancel'); ?></a>\n\t\t\t\t</div>\n\n\t\t\t\t<input class=\"menu-item-data-db-id\" type=\"hidden\" name=\"menu-item-db-id[<?php echo $item_id; ?>]\" value=\"<?php echo $item_id; ?>\" />\n\t\t\t\t<input class=\"menu-item-data-object-id\" type=\"hidden\" name=\"menu-item-object-id[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->object_id ); ?>\" />\n\t\t\t\t<input class=\"menu-item-data-object\" type=\"hidden\" name=\"menu-item-object[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->object ); ?>\" />\n\t\t\t\t<input class=\"menu-item-data-parent-id\" type=\"hidden\" name=\"menu-item-parent-id[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->menu_item_parent ); ?>\" />\n\t\t\t\t<input class=\"menu-item-data-position\" type=\"hidden\" name=\"menu-item-position[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->menu_order ); ?>\" />\n\t\t\t\t<input class=\"menu-item-data-type\" type=\"hidden\" name=\"menu-item-type[<?php echo $item_id; ?>]\" value=\"<?php echo esc_attr( $item->type ); ?>\" />\n\t\t\t</div><!-- .menu-item-settings-->\n\t\t\t<ul class=\"menu-item-transport\"></ul>\n\t\t<?php\n\t\t$output .= ob_get_clean();\n\t}\n\n} // Walker_Nav_Menu_Edit\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-comments-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Comments_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying comments in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_Comments_List_Table extends WP_List_Table {\n\n\tpublic $checkbox = true;\n\n\tpublic $pending_count = array();\n\n\tpublic $extra_items;\n\n\tprivate $user_can;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @global int $post_id\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\tglobal $post_id;\n\n\t\t$post_id = isset( $_REQUEST['p'] ) ? absint( $_REQUEST['p'] ) : 0;\n\n\t\tif ( get_option( 'show_avatars' ) ) {\n\t\t\tadd_filter( 'comment_author', array( $this, 'floated_admin_avatar' ), 10, 2 );\n\t\t}\n\n\t\tparent::__construct( array(\n\t\t\t'plural' => 'comments',\n\t\t\t'singular' => 'comment',\n\t\t\t'ajax' => true,\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\t}\n\n\tpublic function floated_admin_avatar( $name, $comment_ID ) {\n\t\t$comment = get_comment( $comment_ID );\n\t\t$avatar = get_avatar( $comment, 32, 'mystery' );\n\t\treturn \"$avatar $name\";\n\t}\n\n\t/**\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can('edit_posts');\n\t}\n\n\t/**\n\t *\n\t * @global int    $post_id\n\t * @global string $comment_status\n\t * @global string $search\n\t * @global string $comment_type\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $post_id, $comment_status, $search, $comment_type;\n\n\t\t$comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';\n\t\tif ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )\n\t\t\t$comment_status = 'all';\n\n\t\t$comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';\n\n\t\t$search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';\n\n\t\t$post_type = ( isset( $_REQUEST['post_type'] ) ) ? sanitize_key( $_REQUEST['post_type'] ) : '';\n\n\t\t$user_id = ( isset( $_REQUEST['user_id'] ) ) ? $_REQUEST['user_id'] : '';\n\n\t\t$orderby = ( isset( $_REQUEST['orderby'] ) ) ? $_REQUEST['orderby'] : '';\n\t\t$order = ( isset( $_REQUEST['order'] ) ) ? $_REQUEST['order'] : '';\n\n\t\t$comments_per_page = $this->get_per_page( $comment_status );\n\n\t\t$doing_ajax = defined( 'DOING_AJAX' ) && DOING_AJAX;\n\n\t\tif ( isset( $_REQUEST['number'] ) ) {\n\t\t\t$number = (int) $_REQUEST['number'];\n\t\t}\n\t\telse {\n\t\t\t$number = $comments_per_page + min( 8, $comments_per_page ); // Grab a few extra\n\t\t}\n\n\t\t$page = $this->get_pagenum();\n\n\t\tif ( isset( $_REQUEST['start'] ) ) {\n\t\t\t$start = $_REQUEST['start'];\n\t\t} else {\n\t\t\t$start = ( $page - 1 ) * $comments_per_page;\n\t\t}\n\n\t\tif ( $doing_ajax && isset( $_REQUEST['offset'] ) ) {\n\t\t\t$start += $_REQUEST['offset'];\n\t\t}\n\n\t\t$status_map = array(\n\t\t\t'moderated' => 'hold',\n\t\t\t'approved' => 'approve',\n\t\t\t'all' => '',\n\t\t);\n\n\t\t$args = array(\n\t\t\t'status' => isset( $status_map[$comment_status] ) ? $status_map[$comment_status] : $comment_status,\n\t\t\t'search' => $search,\n\t\t\t'user_id' => $user_id,\n\t\t\t'offset' => $start,\n\t\t\t'number' => $number,\n\t\t\t'post_id' => $post_id,\n\t\t\t'type' => $comment_type,\n\t\t\t'orderby' => $orderby,\n\t\t\t'order' => $order,\n\t\t\t'post_type' => $post_type,\n\t\t);\n\n\t\t$_comments = get_comments( $args );\n\t\tif ( is_array( $_comments ) ) {\n\t\t\tupdate_comment_cache( $_comments );\n\n\t\t\t$this->items = array_slice( $_comments, 0, $comments_per_page );\n\t\t\t$this->extra_items = array_slice( $_comments, $comments_per_page );\n\n\t\t\t$_comment_post_ids = array_unique( wp_list_pluck( $_comments, 'comment_post_ID' ) );\n\n\t\t\t$this->pending_count = get_pending_comments_num( $_comment_post_ids );\n\t\t}\n\n\t\t$total_comments = get_comments( array_merge( $args, array(\n\t\t\t'count' => true,\n\t\t\t'offset' => 0,\n\t\t\t'number' => 0\n\t\t) ) );\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $total_comments,\n\t\t\t'per_page' => $comments_per_page,\n\t\t) );\n\t}\n\n\t/**\n\t *\n\t * @param string $comment_status\n\t * @return int\n\t */\n\tpublic function get_per_page( $comment_status = 'all' ) {\n\t\t$comments_per_page = $this->get_items_per_page( 'edit_comments_per_page' );\n\t\t/**\n\t\t * Filter the number of comments listed per page in the comments list table.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param int    $comments_per_page The number of comments to list per page.\n\t\t * @param string $comment_status    The comment status name. Default 'All'.\n\t\t */\n\t\treturn apply_filters( 'comments_per_page', $comments_per_page, $comment_status );\n\t}\n\n\t/**\n\t *\n\t * @global string $comment_status\n\t */\n\tpublic function no_items() {\n\t\tglobal $comment_status;\n\n\t\tif ( 'moderated' === $comment_status ) {\n\t\t\t_e( 'No comments awaiting moderation.' );\n\t\t} else {\n\t\t\t_e( 'No comments found.' );\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @global int $post_id\n\t * @global string $comment_status\n\t * @global string $comment_type\n\t */\n\tprotected function get_views() {\n\t\tglobal $post_id, $comment_status, $comment_type;\n\n\t\t$status_links = array();\n\t\t$num_comments = ( $post_id ) ? wp_count_comments( $post_id ) : wp_count_comments();\n\t\t//, number_format_i18n($num_comments->moderated) ), \"<span class='comment-count'>\" . number_format_i18n($num_comments->moderated) . \"</span>\"),\n\t\t//, number_format_i18n($num_comments->spam) ), \"<span class='spam-comment-count'>\" . number_format_i18n($num_comments->spam) . \"</span>\")\n\t\t$stati = array(\n\t\t\t/* translators: %s: all comments count */\n\t\t\t'all' => _nx_noop(\n\t\t\t\t'All <span class=\"count\">(%s)</span>',\n\t\t\t\t'All <span class=\"count\">(%s)</span>',\n\t\t\t\t'comments'\n\t\t\t), // singular not used\n\n\t\t\t/* translators: %s: pending comments count */\n\t\t\t'moderated' => _nx_noop(\n\t\t\t\t'Pending <span class=\"count\">(%s)</span>',\n\t\t\t\t'Pending <span class=\"count\">(%s)</span>',\n\t\t\t\t'comments'\n\t\t\t),\n\n\t\t\t/* translators: %s: approved comments count */\n\t\t\t'approved' => _nx_noop(\n\t\t\t\t'Approved <span class=\"count\">(%s)</span>',\n\t\t\t\t'Approved <span class=\"count\">(%s)</span>',\n\t\t\t\t'comments'\n\t\t\t),\n\n\t\t\t/* translators: %s: spam comments count */\n\t\t\t'spam' => _nx_noop(\n\t\t\t\t'Spam <span class=\"count\">(%s)</span>',\n\t\t\t\t'Spam <span class=\"count\">(%s)</span>',\n\t\t\t\t'comments'\n\t\t\t),\n\n\t\t\t/* translators: %s: trashed comments count */\n\t\t\t'trash' => _nx_noop(\n\t\t\t\t'Trash <span class=\"count\">(%s)</span>',\n\t\t\t\t'Trash <span class=\"count\">(%s)</span>',\n\t\t\t\t'comments'\n\t\t\t)\n\t\t);\n\n\t\tif ( !EMPTY_TRASH_DAYS )\n\t\t\tunset($stati['trash']);\n\n\t\t$link = admin_url( 'edit-comments.php' );\n\t\tif ( !empty($comment_type) && 'all' != $comment_type )\n\t\t\t$link = add_query_arg( 'comment_type', $comment_type, $link );\n\n\t\tforeach ( $stati as $status => $label ) {\n\t\t\t$class = ( $status === $comment_status ) ? ' class=\"current\"' : '';\n\n\t\t\tif ( !isset( $num_comments->$status ) )\n\t\t\t\t$num_comments->$status = 10;\n\t\t\t$link = add_query_arg( 'comment_status', $status, $link );\n\t\t\tif ( $post_id )\n\t\t\t\t$link = add_query_arg( 'p', absint( $post_id ), $link );\n\t\t\t/*\n\t\t\t// I toyed with this, but decided against it. Leaving it in here in case anyone thinks it is a good idea. ~ Mark\n\t\t\tif ( !empty( $_REQUEST['s'] ) )\n\t\t\t\t$link = add_query_arg( 's', esc_attr( wp_unslash( $_REQUEST['s'] ) ), $link );\n\t\t\t*/\n\t\t\t$status_links[ $status ] = \"<a href='$link'$class>\" . sprintf(\n\t\t\t\ttranslate_nooped_plural( $label, $num_comments->$status ),\n\t\t\t\tsprintf( '<span class=\"%s-count\">%s</span>',\n\t\t\t\t\t( 'moderated' === $status ) ? 'pending' : $status,\n\t\t\t\t\tnumber_format_i18n( $num_comments->$status )\n\t\t\t\t)\n\t\t\t) . '</a>';\n\t\t}\n\n\t\t/**\n\t\t * Filter the comment status links.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $status_links An array of fully-formed status links. Default 'All'.\n\t\t *                            Accepts 'All', 'Pending', 'Approved', 'Spam', and 'Trash'.\n\t\t */\n\t\treturn apply_filters( 'comment_status_links', $status_links );\n\t}\n\n\t/**\n\t *\n\t * @global string $comment_status\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\tglobal $comment_status;\n\n\t\t$actions = array();\n\t\tif ( in_array( $comment_status, array( 'all', 'approved' ) ) )\n\t\t\t$actions['unapprove'] = __( 'Unapprove' );\n\t\tif ( in_array( $comment_status, array( 'all', 'moderated' ) ) )\n\t\t\t$actions['approve'] = __( 'Approve' );\n\t\tif ( in_array( $comment_status, array( 'all', 'moderated', 'approved', 'trash' ) ) )\n\t\t\t$actions['spam'] = _x( 'Mark as Spam', 'comment' );\n\n\t\tif ( 'trash' === $comment_status ) {\n\t\t\t$actions['untrash'] = __( 'Restore' );\n\t\t} elseif ( 'spam' === $comment_status ) {\n\t\t\t$actions['unspam'] = _x( 'Not Spam', 'comment' );\n\t\t}\n\n\t\tif ( in_array( $comment_status, array( 'trash', 'spam' ) ) || !EMPTY_TRASH_DAYS )\n\t\t\t$actions['delete'] = __( 'Delete Permanently' );\n\t\telse\n\t\t\t$actions['trash'] = __( 'Move to Trash' );\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t *\n\t * @global string $comment_status\n\t * @global string $comment_type\n\t *\n\t * @param string $which\n\t */\n\tprotected function extra_tablenav( $which ) {\n\t\tglobal $comment_status, $comment_type;\n?>\n\t\t<div class=\"alignleft actions\">\n<?php\n\t\tif ( 'top' === $which ) {\n?>\n\t\t\t<label class=\"screen-reader-text\" for=\"filter-by-comment-type\"><?php _e( 'Filter by comment type' ); ?></label>\n\t\t\t<select id=\"filter-by-comment-type\" name=\"comment_type\">\n\t\t\t\t<option value=\"\"><?php _e( 'All comment types' ); ?></option>\n<?php\n\t\t\t\t/**\n\t\t\t\t * Filter the comment types dropdown menu.\n\t\t\t\t *\n\t\t\t\t * @since 2.7.0\n\t\t\t\t *\n\t\t\t\t * @param array $comment_types An array of comment types. Accepts 'Comments', 'Pings'.\n\t\t\t\t */\n\t\t\t\t$comment_types = apply_filters( 'admin_comment_types_dropdown', array(\n\t\t\t\t\t'comment' => __( 'Comments' ),\n\t\t\t\t\t'pings' => __( 'Pings' ),\n\t\t\t\t) );\n\n\t\t\t\tforeach ( $comment_types as $type => $label )\n\t\t\t\t\techo \"\\t\" . '<option value=\"' . esc_attr( $type ) . '\"' . selected( $comment_type, $type, false ) . \">$label</option>\\n\";\n\t\t\t?>\n\t\t\t</select>\n<?php\n\t\t\t/**\n\t\t\t * Fires just before the Filter submit button for comment types.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t */\n\t\t\tdo_action( 'restrict_manage_comments' );\n\t\t\tsubmit_button( __( 'Filter' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) );\n\t\t}\n\n\t\tif ( ( 'spam' === $comment_status || 'trash' === $comment_status ) && current_user_can( 'moderate_comments' ) ) {\n\t\t\twp_nonce_field( 'bulk-destroy', '_destroy_nonce' );\n\t\t\t$title = ( 'spam' === $comment_status ) ? esc_attr__( 'Empty Spam' ) : esc_attr__( 'Empty Trash' );\n\t\t\tsubmit_button( $title, 'apply', 'delete_all', false );\n\t\t}\n\t\t/**\n\t\t * Fires after the Filter submit button for comment types.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $comment_status The comment status name. Default 'All'.\n\t\t */\n\t\tdo_action( 'manage_comments_nav', $comment_status );\n\t\techo '</div>';\n\t}\n\n\t/**\n\t * @return string|false\n\t */\n\tpublic function current_action() {\n\t\tif ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )\n\t\t\treturn 'delete_all';\n\n\t\treturn parent::current_action();\n\t}\n\n\t/**\n\t *\n\t * @global int $post_id\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\tglobal $post_id;\n\n\t\t$columns = array();\n\n\t\tif ( $this->checkbox )\n\t\t\t$columns['cb'] = '<input type=\"checkbox\" />';\n\n\t\t$columns['author'] = __( 'Author' );\n\t\t$columns['comment'] = _x( 'Comment', 'column name' );\n\n\t\tif ( ! $post_id ) {\n\t\t\t/* translators: column name or table row header */\n\t\t\t$columns['response'] = __( 'In Response To' );\n\t\t}\n\n\t\t$columns['date'] = _x( 'Submitted On', 'column name' );\n\n\t\treturn $columns;\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array(\n\t\t\t'author'   => 'comment_author',\n\t\t\t'response' => 'comment_post_ID',\n\t\t\t'date'     => 'comment_date'\n\t\t);\n\t}\n\n\t/**\n\t * Get the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, 'comment'.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\treturn 'comment';\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function display() {\n\t\twp_nonce_field( \"fetch-list-\" . get_class( $this ), '_ajax_fetch_list_nonce' );\n\n\t\t$this->display_tablenav( 'top' );\n\n\t\t$this->screen->render_screen_reader_content( 'heading_list' );\n\n?>\n<table class=\"wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>\">\n\t<thead>\n\t<tr>\n\t\t<?php $this->print_column_headers(); ?>\n\t</tr>\n\t</thead>\n\n\t<tbody id=\"the-comment-list\" data-wp-lists=\"list:comment\">\n\t\t<?php $this->display_rows_or_placeholder(); ?>\n\t</tbody>\n\n\t<tbody id=\"the-extra-comment-list\" data-wp-lists=\"list:comment\" style=\"display: none;\">\n\t\t<?php\n\t\t\t$this->items = $this->extra_items;\n\t\t\t$this->display_rows_or_placeholder();\n\t\t?>\n\t</tbody>\n\n\t<tfoot>\n\t<tr>\n\t\t<?php $this->print_column_headers( false ); ?>\n\t</tr>\n\t</tfoot>\n\n</table>\n<?php\n\n\t\t$this->display_tablenav( 'bottom' );\n\t}\n\n\t/**\n\t * @global WP_Post    $post\n\t * @global WP_Comment $comment\n\t *\n\t * @param WP_Comment $item\n\t */\n\tpublic function single_row( $item ) {\n\t\tglobal $post, $comment;\n\n\t\t$comment = $item;\n\n\t\t$the_comment_class = wp_get_comment_status( $comment );\n\t\tif ( ! $the_comment_class ) {\n\t\t\t$the_comment_class = '';\n\t\t}\n\t\t$the_comment_class = join( ' ', get_comment_class( $the_comment_class, $comment, $comment->comment_post_ID ) );\n\n\t\tif ( $comment->comment_post_ID > 0 ) {\n\t\t\t$post = get_post( $comment->comment_post_ID );\n\t\t}\n\t\t$this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );\n\n\t\techo \"<tr id='comment-$comment->comment_ID' class='$the_comment_class'>\";\n\t\t$this->single_row_columns( $comment );\n\t\techo \"</tr>\\n\";\n\n\t\tunset( $post, $comment );\n\t}\n\n \t/**\n \t * Generate and display row actions links.\n \t *\n \t * @since 4.3.0\n \t * @access protected\n \t *\n \t * @global string $comment_status Status for the current listed comments.\n \t *\n \t * @param object $comment     Comment being acted upon.\n \t * @param string $column_name Current column name.\n \t * @param string $primary     Primary column name.\n \t * @return string|void Comment row actions output.\n \t */\n \tprotected function handle_row_actions( $comment, $column_name, $primary ) {\n \t\tglobal $comment_status;\n\n\t\tif ( $primary !== $column_name ) {\n\t\t\treturn '';\n\t\t}\n\n \t\tif ( ! $this->user_can ) {\n \t\t\treturn;\n\t\t}\n\n\t\t$the_comment_status = wp_get_comment_status( $comment );\n\n\t\t$out = '';\n\n\t\t$del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( \"delete-comment_$comment->comment_ID\" ) );\n\t\t$approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( \"approve-comment_$comment->comment_ID\" ) );\n\n\t\t$url = \"comment.php?c=$comment->comment_ID\";\n\n\t\t$approve_url = esc_url( $url . \"&action=approvecomment&$approve_nonce\" );\n\t\t$unapprove_url = esc_url( $url . \"&action=unapprovecomment&$approve_nonce\" );\n\t\t$spam_url = esc_url( $url . \"&action=spamcomment&$del_nonce\" );\n\t\t$unspam_url = esc_url( $url . \"&action=unspamcomment&$del_nonce\" );\n\t\t$trash_url = esc_url( $url . \"&action=trashcomment&$del_nonce\" );\n\t\t$untrash_url = esc_url( $url . \"&action=untrashcomment&$del_nonce\" );\n\t\t$delete_url = esc_url( $url . \"&action=deletecomment&$del_nonce\" );\n\n\t\t// Preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash.\n\t\t$actions = array(\n\t\t\t'approve' => '', 'unapprove' => '',\n\t\t\t'reply' => '',\n\t\t\t'quickedit' => '',\n\t\t\t'edit' => '',\n\t\t\t'spam' => '', 'unspam' => '',\n\t\t\t'trash' => '', 'untrash' => '', 'delete' => ''\n\t\t);\n\n\t\t// Not looking at all comments.\n\t\tif ( $comment_status && 'all' != $comment_status ) {\n\t\t\tif ( 'approved' === $the_comment_status ) {\n\t\t\t\t$actions['unapprove'] = \"<a href='$unapprove_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=unapproved' class='vim-u vim-destructive' title='\" . esc_attr__( 'Unapprove this comment' ) . \"'>\" . __( 'Unapprove' ) . '</a>';\n\t\t\t} elseif ( 'unapproved' === $the_comment_status ) {\n\t\t\t\t$actions['approve'] = \"<a href='$approve_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=approved' class='vim-a vim-destructive' title='\" . esc_attr__( 'Approve this comment' ) . \"'>\" . __( 'Approve' ) . '</a>';\n\t\t\t}\n\t\t} else {\n\t\t\t$actions['approve'] = \"<a href='$approve_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved' class='vim-a' title='\" . esc_attr__( 'Approve this comment' ) . \"'>\" . __( 'Approve' ) . '</a>';\n\t\t\t$actions['unapprove'] = \"<a href='$unapprove_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved' class='vim-u' title='\" . esc_attr__( 'Unapprove this comment' ) . \"'>\" . __( 'Unapprove' ) . '</a>';\n\t\t}\n\n\t\tif ( 'spam' !== $the_comment_status ) {\n\t\t\t$actions['spam'] = \"<a href='$spam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::spam=1' class='vim-s vim-destructive' title='\" . esc_attr__( 'Mark this comment as spam' ) . \"'>\" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';\n\t\t} elseif ( 'spam' === $the_comment_status ) {\n\t\t\t$actions['unspam'] = \"<a href='$unspam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1' class='vim-z vim-destructive'>\" . _x( 'Not Spam', 'comment' ) . '</a>';\n\t\t}\n\n\t\tif ( 'trash' === $the_comment_status ) {\n\t\t\t$actions['untrash'] = \"<a href='$untrash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1' class='vim-z vim-destructive'>\" . __( 'Restore' ) . '</a>';\n\t\t}\n\n\t\tif ( 'spam' === $the_comment_status || 'trash' === $the_comment_status || !EMPTY_TRASH_DAYS ) {\n\t\t\t$actions['delete'] = \"<a href='$delete_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::delete=1' class='delete vim-d vim-destructive'>\" . __( 'Delete Permanently' ) . '</a>';\n\t\t} else {\n\t\t\t$actions['trash'] = \"<a href='$trash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive' title='\" . esc_attr__( 'Move this comment to the trash' ) . \"'>\" . _x( 'Trash', 'verb' ) . '</a>';\n\t\t}\n\n\t\tif ( 'spam' !== $the_comment_status && 'trash' !== $the_comment_status ) {\n\t\t\t$actions['edit'] = \"<a href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='\" . esc_attr__( 'Edit comment' ) . \"'>\". __( 'Edit' ) . '</a>';\n\n\t\t\t$format = '<a data-comment-id=\"%d\" data-post-id=\"%d\" data-action=\"%s\" class=\"%s\" title=\"%s\" href=\"#\">%s</a>';\n\n\t\t\t$actions['quickedit'] = sprintf( $format, $comment->comment_ID, $comment->comment_post_ID, 'edit', 'vim-q comment-inline',esc_attr__( 'Edit this item inline' ), __( 'Quick&nbsp;Edit' ) );\n\n\t\t\t$actions['reply'] = sprintf( $format, $comment->comment_ID, $comment->comment_post_ID, 'replyto', 'vim-r comment-inline', esc_attr__( 'Reply to this comment' ), __( 'Reply' ) );\n\t\t}\n\n\t\t/** This filter is documented in wp-admin/includes/dashboard.php */\n\t\t$actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );\n\n\t\t$i = 0;\n\t\t$out .= '<div class=\"row-actions\">';\n\t\tforeach ( $actions as $action => $link ) {\n\t\t\t++$i;\n\t\t\t( ( ( 'approve' === $action || 'unapprove' === $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';\n\n\t\t\t// Reply and quickedit need a hide-if-no-js span when not added with ajax\n\t\t\tif ( ( 'reply' === $action || 'quickedit' === $action ) && ! defined('DOING_AJAX') )\n\t\t\t\t$action .= ' hide-if-no-js';\n\t\t\telseif ( ( $action === 'untrash' && $the_comment_status === 'trash' ) || ( $action === 'unspam' && $the_comment_status === 'spam' ) ) {\n\t\t\t\tif ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )\n\t\t\t\t\t$action .= ' approve';\n\t\t\t\telse\n\t\t\t\t\t$action .= ' unapprove';\n\t\t\t}\n\n\t\t\t$out .= \"<span class='$action'>$sep$link</span>\";\n\t\t}\n\t\t$out .= '</div>';\n\n\t\t$out .= '<button type=\"button\" class=\"toggle-row\"><span class=\"screen-reader-text\">' . __( 'Show more details' ) . '</span></button>';\n\n\t\treturn $out;\n\t}\n\n\t/**\n\t *\n\t * @param object $comment\n\t */\n\tpublic function column_cb( $comment ) {\n\t\tif ( $this->user_can ) { ?>\n\t\t<label class=\"screen-reader-text\" for=\"cb-select-<?php echo $comment->comment_ID; ?>\"><?php _e( 'Select comment' ); ?></label>\n\t\t<input id=\"cb-select-<?php echo $comment->comment_ID; ?>\" type=\"checkbox\" name=\"delete_comments[]\" value=\"<?php echo $comment->comment_ID; ?>\" />\n\t\t<?php\n\t\t}\n\t}\n\n\t/**\n\t * @param object $comment\n\t */\n\tpublic function column_comment( $comment ) {\n\t\techo '<div class=\"comment-author\">';\n\t\t\t$this->column_author( $comment );\n\t\techo '</div>';\n\n\t\tif ( $comment->comment_parent ) {\n\t\t\t$parent = get_comment( $comment->comment_parent );\n\t\t\tif ( $parent ) {\n\t\t\t\t$parent_link = esc_url( get_comment_link( $parent ) );\n\t\t\t\t$name = get_comment_author( $parent );\n\t\t\t\tprintf(\n\t\t\t\t\t/* translators: %s: comment link */\n\t\t\t\t\t__( 'In reply to %s.' ),\n\t\t\t\t\t'<a href=\"' . $parent_link . '\">' . $name . '</a>'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tcomment_text( $comment );\n\t\tif ( $this->user_can ) { ?>\n\t\t<div id=\"inline-<?php echo $comment->comment_ID; ?>\" class=\"hidden\">\n\t\t<textarea class=\"comment\" rows=\"1\" cols=\"1\"><?php\n\t\t\t/** This filter is documented in wp-admin/includes/comment.php */\n\t\t\techo esc_textarea( apply_filters( 'comment_edit_pre', $comment->comment_content ) );\n\t\t?></textarea>\n\t\t<div class=\"author-email\"><?php echo esc_attr( $comment->comment_author_email ); ?></div>\n\t\t<div class=\"author\"><?php echo esc_attr( $comment->comment_author ); ?></div>\n\t\t<div class=\"author-url\"><?php echo esc_attr( $comment->comment_author_url ); ?></div>\n\t\t<div class=\"comment_status\"><?php echo $comment->comment_approved; ?></div>\n\t\t</div>\n\t\t<?php\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @global string $comment_status\n\t *\n\t * @param object $comment\n\t */\n\tpublic function column_author( $comment ) {\n\t\tglobal $comment_status;\n\n\t\t$author_url = get_comment_author_url( $comment );\n\n\t\t$author_url_display = untrailingslashit( preg_replace( '|^http(s)?://(www\\.)?|i', '', $author_url ) );\n\t\tif ( strlen( $author_url_display ) > 50 ) {\n\t\t\t$author_url_display = wp_html_excerpt( $author_url_display, 49, '&hellip;' );\n\t\t}\n\n\t\techo \"<strong>\"; comment_author( $comment ); echo '</strong><br />';\n\t\tif ( ! empty( $author_url_display ) ) {\n\t\t\tprintf( '<a href=\"%s\">%s</a><br />', esc_url( $author_url ), esc_html( $author_url_display ) );\n\t\t}\n\n\t\tif ( $this->user_can ) {\n\t\t\tif ( ! empty( $comment->comment_author_email ) ) {\n\t\t\t\t/* This filter is documented in wp-includes/comment-template.php */\n\t\t\t\t$email = apply_filters( 'comment_email', $comment->comment_author_email, $comment );\n\n\t\t\t\tif ( ! empty( $email ) && '@' !== $email ) {\n\t\t\t\t\tprintf( '<a href=\"%1$s\">%2$s</a><br />', esc_url( 'mailto:' . $email ), esc_html( $email ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$author_ip = get_comment_author_IP( $comment );\n\t\t\tif ( $author_ip ) {\n\t\t\t\t$author_ip_url = add_query_arg( array( 's' => $author_ip, 'mode' => 'detail' ), admin_url( 'edit-comments.php' ) );\n\t\t\t\tif ( 'spam' === $comment_status ) {\n\t\t\t\t\t$author_ip_url = add_query_arg( 'comment_status', 'spam', $author_ip_url );\n\t\t\t\t}\n\t\t\t\tprintf( '<a href=\"%1$s\">%2$s</a>', esc_url( $author_ip_url ), esc_html( $author_ip ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function column_date( $comment ) {\n\t\techo '<div class=\"submitted-on\">';\n\t\techo '<a href=\"' . esc_url( get_comment_link( $comment ) ) . '\">';\n\t\t/* translators: 1: comment date, 2: comment time */\n\t\tprintf( __( '%1$s at %2$s' ),\n\t\t\t/* translators: comment date format. See http://php.net/date */\n\t\t\tget_comment_date( __( 'Y/m/d' ), $comment ),\n\t\t\tget_comment_date( get_option( 'time_format' ), $comment )\n\t\t);\n\t\techo '</a>';\n\t\techo '</div>';\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function column_response() {\n\t\t$post = get_post();\n\n\t\tif ( ! $post ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isset( $this->pending_count[$post->ID] ) ) {\n\t\t\t$pending_comments = $this->pending_count[$post->ID];\n\t\t} else {\n\t\t\t$_pending_count_temp = get_pending_comments_num( array( $post->ID ) );\n\t\t\t$pending_comments = $this->pending_count[$post->ID] = $_pending_count_temp[$post->ID];\n\t\t}\n\n\t\tif ( current_user_can( 'edit_post', $post->ID ) ) {\n\t\t\t$post_link = \"<a href='\" . get_edit_post_link( $post->ID ) . \"' class='comments-edit-item-link'>\";\n\t\t\t$post_link .= esc_html( get_the_title( $post->ID ) ) . '</a>';\n\t\t} else {\n\t\t\t$post_link = esc_html( get_the_title( $post->ID ) );\n\t\t}\n\n\t\techo '<div class=\"response-links\">';\n\t\tif ( 'attachment' === $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array( 80, 60 ), true ) ) ) {\n\t\t\techo $thumb;\n\t\t}\n\t\techo $post_link;\n\t\t$post_type_object = get_post_type_object( $post->post_type );\n\t\techo \"<a href='\" . get_permalink( $post->ID ) . \"' class='comments-view-item-link'>\" . $post_type_object->labels->view_item . '</a>';\n\t\techo '<span class=\"post-com-count-wrapper post-com-count-', $post->ID, '\">';\n\t\t$this->comments_bubble( $post->ID, $pending_comments );\n\t\techo '</span> ';\n\t\techo '</div>';\n\t}\n\n\t/**\n\t *\n\t * @param object $comment\n\t * @param string $column_name\n\t */\n\tpublic function column_default( $comment, $column_name ) {\n\t\t/**\n\t\t * Fires when the default column output is displayed for a single row.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param string $column_name         The custom column's name.\n\t\t * @param int    $comment->comment_ID The custom column's unique ID number.\n\t\t */\n\t\tdo_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-filesystem-base.php",
    "content": "<?php\n/**\n * Base WordPress Filesystem\n *\n * @package WordPress\n * @subpackage Filesystem\n */\n\n/**\n * Base WordPress Filesystem class for which Filesystem implementations extend\n *\n * @since 2.5.0\n */\nclass WP_Filesystem_Base {\n\t/**\n\t * Whether to display debug data for the connection.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @var bool\n\t */\n\tpublic $verbose = false;\n\n\t/**\n\t * Cached list of local filepaths to mapped remote filepaths.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t * @var array\n\t */\n\tpublic $cache = array();\n\n\t/**\n\t * The Access method of the current connection, Set automatically.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @var string\n\t */\n\tpublic $method = '';\n\n\t/**\n\t * @access public\n\t */\n\tpublic $errors = null;\n\n\t/**\n\t * @access public\n\t */\n\tpublic $options = array();\n\n\t/**\n\t * Return the path on the remote filesystem of ABSPATH.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @return string The location of the remote path.\n\t */\n\tpublic function abspath() {\n\t\t$folder = $this->find_folder(ABSPATH);\n\t\t// Perhaps the FTP folder is rooted at the WordPress install, Check for wp-includes folder in root, Could have some false positives, but rare.\n\t\tif ( ! $folder && $this->is_dir( '/' . WPINC ) )\n\t\t\t$folder = '/';\n\t\treturn $folder;\n\t}\n\n\t/**\n\t * Return the path on the remote filesystem of WP_CONTENT_DIR.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @return string The location of the remote path.\n\t */\n\tpublic function wp_content_dir() {\n\t\treturn $this->find_folder(WP_CONTENT_DIR);\n\t}\n\n\t/**\n\t * Return the path on the remote filesystem of WP_PLUGIN_DIR.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @return string The location of the remote path.\n\t */\n\tpublic function wp_plugins_dir() {\n\t\treturn $this->find_folder(WP_PLUGIN_DIR);\n\t}\n\n\t/**\n\t * Return the path on the remote filesystem of the Themes Directory.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @param string $theme The Theme stylesheet or template for the directory.\n\t * @return string The location of the remote path.\n\t */\n\tpublic function wp_themes_dir( $theme = false ) {\n\t\t$theme_root = get_theme_root( $theme );\n\n\t\t// Account for relative theme roots\n\t\tif ( '/themes' == $theme_root || ! is_dir( $theme_root ) )\n\t\t\t$theme_root = WP_CONTENT_DIR . $theme_root;\n\n\t\treturn $this->find_folder( $theme_root );\n\t}\n\n\t/**\n\t * Return the path on the remote filesystem of WP_LANG_DIR.\n\t *\n\t * @access public\n\t * @since 3.2.0\n\t *\n\t * @return string The location of the remote path.\n\t */\n\tpublic function wp_lang_dir() {\n\t\treturn $this->find_folder(WP_LANG_DIR);\n\t}\n\n\t/**\n\t * Locate a folder on the remote filesystem.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @deprecated 2.7.0 use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() instead.\n\t * @see WP_Filesystem::abspath()\n\t * @see WP_Filesystem::wp_content_dir()\n\t * @see WP_Filesystem::wp_plugins_dir()\n\t * @see WP_Filesystem::wp_themes_dir()\n\t * @see WP_Filesystem::wp_lang_dir()\n\t *\n\t * @param string $base The folder to start searching from.\n\t * @param bool   $echo True to display debug information.\n\t *                     Default false.\n\t * @return string The location of the remote path.\n\t */\n\tpublic function find_base_dir( $base = '.', $echo = false ) {\n\t\t_deprecated_function(__FUNCTION__, '2.7', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' );\n\t\t$this->verbose = $echo;\n\t\treturn $this->abspath();\n\t}\n\n\t/**\n\t * Locate a folder on the remote filesystem.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @deprecated 2.7.0 use WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir() methods instead.\n\t * @see WP_Filesystem::abspath()\n\t * @see WP_Filesystem::wp_content_dir()\n\t * @see WP_Filesystem::wp_plugins_dir()\n\t * @see WP_Filesystem::wp_themes_dir()\n\t * @see WP_Filesystem::wp_lang_dir()\n\t *\n\t * @param string $base The folder to start searching from.\n\t * @param bool   $echo True to display debug information.\n\t * @return string The location of the remote path.\n\t */\n\tpublic function get_base_dir( $base = '.', $echo = false ) {\n\t\t_deprecated_function(__FUNCTION__, '2.7', 'WP_Filesystem::abspath() or WP_Filesystem::wp_*_dir()' );\n\t\t$this->verbose = $echo;\n\t\treturn $this->abspath();\n\t}\n\n\t/**\n\t * Locate a folder on the remote filesystem.\n\t *\n\t * Assumes that on Windows systems, Stripping off the Drive\n\t * letter is OK Sanitizes \\\\ to / in windows filepaths.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @param string $folder the folder to locate.\n\t * @return string|false The location of the remote path, false on failure.\n\t */\n\tpublic function find_folder( $folder ) {\n\t\tif ( isset( $this->cache[ $folder ] ) )\n\t\t\treturn $this->cache[ $folder ];\n\n\t\tif ( stripos($this->method, 'ftp') !== false ) {\n\t\t\t$constant_overrides = array(\n\t\t\t\t'FTP_BASE' => ABSPATH,\n\t\t\t\t'FTP_CONTENT_DIR' => WP_CONTENT_DIR,\n\t\t\t\t'FTP_PLUGIN_DIR' => WP_PLUGIN_DIR,\n\t\t\t\t'FTP_LANG_DIR' => WP_LANG_DIR\n\t\t\t);\n\n\t\t\t// Direct matches ( folder = CONSTANT/ )\n\t\t\tforeach ( $constant_overrides as $constant => $dir ) {\n\t\t\t\tif ( ! defined( $constant ) )\n\t\t\t\t\tcontinue;\n\t\t\t\tif ( $folder === $dir )\n\t\t\t\t\treturn trailingslashit( constant( $constant ) );\n\t\t\t}\n\n\t\t\t// Prefix Matches ( folder = CONSTANT/subdir )\n\t\t\tforeach ( $constant_overrides as $constant => $dir ) {\n\t\t\t\tif ( ! defined( $constant ) )\n\t\t\t\t\tcontinue;\n\t\t\t\tif ( 0 === stripos( $folder, $dir ) ) { // $folder starts with $dir\n\t\t\t\t\t$potential_folder = preg_replace( '#^' . preg_quote( $dir, '#' ) . '/#i', trailingslashit( constant( $constant ) ), $folder );\n\t\t\t\t\t$potential_folder = trailingslashit( $potential_folder );\n\n\t\t\t\t\tif ( $this->is_dir( $potential_folder ) ) {\n\t\t\t\t\t\t$this->cache[ $folder ] = $potential_folder;\n\t\t\t\t\t\treturn $potential_folder;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} elseif ( 'direct' == $this->method ) {\n\t\t\t$folder = str_replace('\\\\', '/', $folder); // Windows path sanitisation\n\t\t\treturn trailingslashit($folder);\n\t\t}\n\n\t\t$folder = preg_replace('|^([a-z]{1}):|i', '', $folder); // Strip out windows drive letter if it's there.\n\t\t$folder = str_replace('\\\\', '/', $folder); // Windows path sanitisation\n\n\t\tif ( isset($this->cache[ $folder ] ) )\n\t\t\treturn $this->cache[ $folder ];\n\n\t\tif ( $this->exists($folder) ) { // Folder exists at that absolute path.\n\t\t\t$folder = trailingslashit($folder);\n\t\t\t$this->cache[ $folder ] = $folder;\n\t\t\treturn $folder;\n\t\t}\n\t\tif ( $return = $this->search_for_folder($folder) )\n\t\t\t$this->cache[ $folder ] = $return;\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Locate a folder on the remote filesystem.\n\t *\n\t * Expects Windows sanitized path.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @param string $folder The folder to locate.\n\t * @param string $base   The folder to start searching from.\n\t * @param bool   $loop   If the function has recursed, Internal use only.\n\t * @return string|false The location of the remote path, false to cease looping.\n\t */\n\tpublic function search_for_folder( $folder, $base = '.', $loop = false ) {\n\t\tif ( empty( $base ) || '.' == $base )\n\t\t\t$base = trailingslashit($this->cwd());\n\n\t\t$folder = untrailingslashit($folder);\n\n\t\tif ( $this->verbose ) {\n\t\t\t/* translators: 1: folder to locate, 2: folder to start searching from */\n\t\t\tprintf( \"\\n\" . __( 'Looking for %1$s in %2$s' ) . \"<br/>\\n\", $folder, $base );\n\t\t}\n\n\t\t$folder_parts = explode('/', $folder);\n\t\t$folder_part_keys = array_keys( $folder_parts );\n\t\t$last_index = array_pop( $folder_part_keys );\n\t\t$last_path = $folder_parts[ $last_index ];\n\n\t\t$files = $this->dirlist( $base );\n\n\t\tforeach ( $folder_parts as $index => $key ) {\n\t\t\tif ( $index == $last_index )\n\t\t\t\tcontinue; // We want this to be caught by the next code block.\n\n\t\t\t/*\n\t\t\t * Working from /home/ to /user/ to /wordpress/ see if that file exists within\n\t\t\t * the current folder, If it's found, change into it and follow through looking\n\t\t\t * for it. If it cant find WordPress down that route, it'll continue onto the next\n\t\t\t * folder level, and see if that matches, and so on. If it reaches the end, and still\n\t\t\t * cant find it, it'll return false for the entire function.\n\t\t\t */\n\t\t\tif ( isset($files[ $key ]) ){\n\n\t\t\t\t// Let's try that folder:\n\t\t\t\t$newdir = trailingslashit(path_join($base, $key));\n\t\t\t\tif ( $this->verbose ) {\n\t\t\t\t\t/* translators: %s: directory name */\n\t\t\t\t\tprintf( \"\\n\" . __( 'Changing to %s' ) . \"<br/>\\n\", $newdir );\n\t\t\t\t}\n\n\t\t\t\t// Only search for the remaining path tokens in the directory, not the full path again.\n\t\t\t\t$newfolder = implode( '/', array_slice( $folder_parts, $index + 1 ) );\n\t\t\t\tif ( $ret = $this->search_for_folder( $newfolder, $newdir, $loop) )\n\t\t\t\t\treturn $ret;\n\t\t\t}\n\t\t}\n\n\t\t// Only check this as a last resort, to prevent locating the incorrect install.\n\t\t// All above procedures will fail quickly if this is the right branch to take.\n\t\tif (isset( $files[ $last_path ] ) ) {\n\t\t\tif ( $this->verbose ) {\n\t\t\t\t/* translators: %s: directory name */\n\t\t\t\tprintf( \"\\n\" . __( 'Found %s' ) . \"<br/>\\n\",  $base . $last_path );\n\t\t\t}\n\t\t\treturn trailingslashit($base . $last_path);\n\t\t}\n\n\t\t// Prevent this function from looping again.\n\t\t// No need to proceed if we've just searched in /\n\t\tif ( $loop || '/' == $base )\n\t\t\treturn false;\n\n\t\t// As an extra last resort, Change back to / if the folder wasn't found.\n\t\t// This comes into effect when the CWD is /home/user/ but WP is at /var/www/....\n\t\treturn $this->search_for_folder( $folder, '/', true );\n\n\t}\n\n\t/**\n\t * Return the *nix-style file permissions for a file.\n\t *\n\t * From the PHP documentation page for fileperms().\n\t *\n\t * @link http://docs.php.net/fileperms\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t *\n\t * @param string $file String filename.\n\t * @return string The *nix-style representation of permissions.\n\t */\n\tpublic function gethchmod( $file ){\n\t\t$perms = intval( $this->getchmod( $file ), 8 );\n\t\tif (($perms & 0xC000) == 0xC000) // Socket\n\t\t\t$info = 's';\n\t\telseif (($perms & 0xA000) == 0xA000) // Symbolic Link\n\t\t\t$info = 'l';\n\t\telseif (($perms & 0x8000) == 0x8000) // Regular\n\t\t\t$info = '-';\n\t\telseif (($perms & 0x6000) == 0x6000) // Block special\n\t\t\t$info = 'b';\n\t\telseif (($perms & 0x4000) == 0x4000) // Directory\n\t\t\t$info = 'd';\n\t\telseif (($perms & 0x2000) == 0x2000) // Character special\n\t\t\t$info = 'c';\n\t\telseif (($perms & 0x1000) == 0x1000) // FIFO pipe\n\t\t\t$info = 'p';\n\t\telse // Unknown\n\t\t\t$info = 'u';\n\n\t\t// Owner\n\t\t$info .= (($perms & 0x0100) ? 'r' : '-');\n\t\t$info .= (($perms & 0x0080) ? 'w' : '-');\n\t\t$info .= (($perms & 0x0040) ?\n\t\t\t\t\t(($perms & 0x0800) ? 's' : 'x' ) :\n\t\t\t\t\t(($perms & 0x0800) ? 'S' : '-'));\n\n\t\t// Group\n\t\t$info .= (($perms & 0x0020) ? 'r' : '-');\n\t\t$info .= (($perms & 0x0010) ? 'w' : '-');\n\t\t$info .= (($perms & 0x0008) ?\n\t\t\t\t\t(($perms & 0x0400) ? 's' : 'x' ) :\n\t\t\t\t\t(($perms & 0x0400) ? 'S' : '-'));\n\n\t\t// World\n\t\t$info .= (($perms & 0x0004) ? 'r' : '-');\n\t\t$info .= (($perms & 0x0002) ? 'w' : '-');\n\t\t$info .= (($perms & 0x0001) ?\n\t\t\t\t\t(($perms & 0x0200) ? 't' : 'x' ) :\n\t\t\t\t\t(($perms & 0x0200) ? 'T' : '-'));\n\t\treturn $info;\n\t}\n\n\t/**\n\t * Gets the permissions of the specified file or filepath in their octal format\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @param string $file\n\t * @return string the last 3 characters of the octal number\n\t */\n\tpublic function getchmod( $file ) {\n\t\treturn '777';\n\t}\n\n\t/**\n\t * Convert *nix-style file permissions to a octal number.\n\t *\n\t * Converts '-rw-r--r--' to 0644\n\t * From \"info at rvgate dot nl\"'s comment on the PHP documentation for chmod()\n \t *\n\t * @link http://docs.php.net/manual/en/function.chmod.php#49614\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t *\n\t * @param string $mode string The *nix-style file permission.\n\t * @return int octal representation\n\t */\n\tpublic function getnumchmodfromh( $mode ) {\n\t\t$realmode = '';\n\t\t$legal =  array('', 'w', 'r', 'x', '-');\n\t\t$attarray = preg_split('//', $mode);\n\n\t\tfor ( $i = 0, $c = count( $attarray ); $i < $c; $i++ ) {\n\t\t   if ($key = array_search($attarray[$i], $legal)) {\n\t\t\t   $realmode .= $legal[$key];\n\t\t   }\n\t\t}\n\n\t\t$mode = str_pad($realmode, 10, '-', STR_PAD_LEFT);\n\t\t$trans = array('-'=>'0', 'r'=>'4', 'w'=>'2', 'x'=>'1');\n\t\t$mode = strtr($mode,$trans);\n\n\t\t$newmode = $mode[0];\n\t\t$newmode .= $mode[1] + $mode[2] + $mode[3];\n\t\t$newmode .= $mode[4] + $mode[5] + $mode[6];\n\t\t$newmode .= $mode[7] + $mode[8] + $mode[9];\n\t\treturn $newmode;\n\t}\n\n\t/**\n\t * Determine if the string provided contains binary characters.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @param string $text String to test against.\n\t * @return bool true if string is binary, false otherwise.\n\t */\n\tpublic function is_binary( $text ) {\n\t\treturn (bool) preg_match( '|[^\\x20-\\x7E]|', $text ); // chr(32)..chr(127)\n\t}\n\n\t/**\n\t * Change the ownership of a file / folder.\n\t *\n\t * Default behavior is to do nothing, override this in your subclass, if desired.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t *\n\t * @param string $file      Path to the file.\n\t * @param mixed  $owner     A user name or number.\n\t * @param bool   $recursive Optional. If set True changes file owner recursivly. Defaults to False.\n\t * @return bool Returns true on success or false on failure.\n\t */\n\tpublic function chown( $file, $owner, $recursive = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Connect filesystem.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @return bool True on success or false on failure (always true for WP_Filesystem_Direct).\n\t */\n\tpublic function connect() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Read entire file into a string.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file Name of the file to read.\n\t * @return mixed|bool Returns the read data or false on failure.\n\t */\n\tpublic function get_contents( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Read entire file into an array.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file Path to the file.\n\t * @return array|bool the file contents in an array or false on failure.\n\t */\n\tpublic function get_contents_array( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Write a string to a file.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file     Remote path to the file where to write the data.\n\t * @param string $contents The data to write.\n\t * @param int    $mode     Optional. The file permissions as octal number, usually 0644.\n\t * @return bool False on failure.\n\t */\n\tpublic function put_contents( $file, $contents, $mode = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get the current working directory.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @return string|bool The current working directory on success, or false on failure.\n\t */\n\tpublic function cwd() {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Change current directory.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $dir The new current directory.\n\t * @return bool|string\n\t */\n\tpublic function chdir( $dir ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Change the file group.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file      Path to the file.\n\t * @param mixed  $group     A group name or number.\n\t * @param bool   $recursive Optional. If set True changes file group recursively. Defaults to False.\n\t * @return bool|string\n\t */\n\tpublic function chgrp( $file, $group, $recursive = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Change filesystem permissions.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file      Path to the file.\n\t * @param int    $mode      Optional. The permissions as octal number, usually 0644 for files, 0755 for dirs.\n\t * @param bool   $recursive Optional. If set True changes file group recursively. Defaults to False.\n\t * @return bool|string\n\t */\n\tpublic function chmod( $file, $mode = false, $recursive = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get the file owner.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t * \n\t * @param string $file Path to the file.\n\t * @return string|bool Username of the user or false on error.\n\t */\n\tpublic function owner( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get the file's group.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file Path to the file.\n\t * @return string|bool The group or false on error.\n\t */\n\tpublic function group( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Copy a file.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $source      Path to the source file.\n\t * @param string $destination Path to the destination file.\n\t * @param bool   $overwrite   Optional. Whether to overwrite the destination file if it exists.\n\t *                            Default false.\n\t * @param int    $mode        Optional. The permissions as octal number, usually 0644 for files, 0755 for dirs.\n\t *                            Default false.\n\t * @return bool True if file copied successfully, False otherwise.\n\t */\n\tpublic function copy( $source, $destination, $overwrite = false, $mode = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Move a file.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $source      Path to the source file.\n\t * @param string $destination Path to the destination file.\n\t * @param bool   $overwrite   Optional. Whether to overwrite the destination file if it exists.\n\t *                            Default false.\n\t * @return bool True if file copied successfully, False otherwise.\n\t */\n\tpublic function move( $source, $destination, $overwrite = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Delete a file or directory.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file      Path to the file.\n\t * @param bool   $recursive Optional. If set True changes file group recursively. Defaults to False.\n\t *                          Default false.\n\t * @param bool   $type      Type of resource. 'f' for file, 'd' for directory.\n\t *                          Default false.\n\t * @return bool True if the file or directory was deleted, false on failure.\n\t */\n\tpublic function delete( $file, $recursive = false, $type = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if a file or directory exists.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file Path to file/directory.\n\t * @return bool Whether $file exists or not.\n\t */\n\tpublic function exists( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if resource is a file.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file File path.\n\t * @return bool Whether $file is a file.\n\t */\n\tpublic function is_file( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if resource is a directory.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $path Directory path.\n\t * @return bool Whether $path is a directory.\n\t */\n\tpublic function is_dir( $path ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if a file is readable.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file Path to file.\n\t * @return bool Whether $file is readable.\n\t */\n\tpublic function is_readable( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if a file or directory is writable.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @return bool Whether $file is writable.\n\t */\n\tpublic function is_writable( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Gets the file's last access time.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file Path to file.\n\t * @return int|bool Unix timestamp representing last access time.\n\t */\n\tpublic function atime( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Gets the file modification time.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file Path to file.\n\t * @return int|bool Unix timestamp representing modification time.\n\t */\n\tpublic function mtime( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Gets the file size (in bytes).\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file Path to file.\n\t * @return int|bool Size of the file in bytes.\n\t */\n\tpublic function size( $file ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Set the access and modification times of a file.\n\t *\n\t * Note: If $file doesn't exist, it will be created.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $file  Path to file.\n\t * @param int    $time  Optional. Modified time to set for file.\n\t *                      Default 0.\n\t * @param int    $atime Optional. Access time to set for file.\n\t *                      Default 0.\n\t * @return bool Whether operation was successful or not.\n\t */\n\tpublic function touch( $file, $time = 0, $atime = 0 ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Create a directory.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $path  Path for new directory.\n\t * @param mixed  $chmod Optional. The permissions as octal number, (or False to skip chmod)\n\t *                      Default false.\n\t * @param mixed  $chown Optional. A user name or number (or False to skip chown)\n\t *                      Default false.\n\t * @param mixed  $chgrp Optional. A group name or number (or False to skip chgrp).\n\t *                      Default false.\n\t * @return bool False if directory cannot be created, true otherwise.\n\t */\n\tpublic function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Delete a directory.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $path      Path to directory.\n\t * @param bool   $recursive Optional. Whether to recursively remove files/directories.\n\t *                          Default false.\n\t * @return bool Whether directory is deleted successfully or not.\n\t */\n\tpublic function rmdir( $path, $recursive = false ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get details for files in a directory or a specific file.\n\t *\n\t * @access public\n\t * @since 2.5.0\n\t * @abstract\n\t *\n\t * @param string $path           Path to directory or file.\n\t * @param bool   $include_hidden Optional. Whether to include details of hidden (\".\" prefixed) files.\n\t *                               Default true.\n\t * @param bool   $recursive      Optional. Whether to recursively include file details in nested directories.\n\t *                               Default false.\n\t * @return array|bool {\n\t *     Array of files. False if unable to list directory contents.\n\t *\n\t *     @type string $name        Name of the file/directory.\n\t *     @type string $perms       *nix representation of permissions.\n\t *     @type int    $permsn      Octal representation of permissions.\n\t *     @type string $owner       Owner name or ID.\n\t *     @type int    $size        Size of file in bytes.\n\t *     @type int    $lastmodunix Last modified unix timestamp.\n\t *     @type mixed  $lastmod     Last modified month (3 letter) and day (without leading 0).\n\t *     @type int    $time        Last modified time.\n\t *     @type string $type        Type of resource. 'f' for file, 'd' for directory.\n\t *     @type mixed  $files       If a directory and $recursive is true, contains another array of files.\n\t * }\n\t */\n\tpublic function dirlist( $path, $include_hidden = true, $recursive = false ) {\n\t\treturn false;\n\t}\n\n} // WP_Filesystem_Base\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-filesystem-direct.php",
    "content": "<?php\n/**\n * WordPress Direct Filesystem.\n *\n * @package WordPress\n * @subpackage Filesystem\n */\n\n/**\n * WordPress Filesystem Class for direct PHP file and folder manipulation.\n *\n * @since 2.5.0\n * @package WordPress\n * @subpackage Filesystem\n * @uses WP_Filesystem_Base Extends class\n */\nclass WP_Filesystem_Direct extends WP_Filesystem_Base {\n\n\t/**\n\t * constructor\n\t *\n\t * @access public\n\t *\n\t * @param mixed $arg ignored argument\n\t */\n\tpublic function __construct($arg) {\n\t\t$this->method = 'direct';\n\t\t$this->errors = new WP_Error();\n\t}\n\n\t/**\n\t * Reads entire file into a string\n\t *\n\t * @access public\n\t *\n\t * @param string $file Name of the file to read.\n\t * @return string|bool The function returns the read data or false on failure.\n\t */\n\tpublic function get_contents($file) {\n\t\treturn @file_get_contents($file);\n\t}\n\n\t/**\n\t * Reads entire file into an array\n\t *\n\t * @access public\n\t *\n\t * @param string $file Path to the file.\n\t * @return array|bool the file contents in an array or false on failure.\n\t */\n\tpublic function get_contents_array($file) {\n\t\treturn @file($file);\n\t}\n\n\t/**\n\t * Write a string to a file\n\t *\n\t * @access public\n\t *\n\t * @param string $file     Remote path to the file where to write the data.\n\t * @param string $contents The data to write.\n\t * @param int    $mode     Optional. The file permissions as octal number, usually 0644.\n\t *                         Default false.\n\t * @return bool False upon failure, true otherwise.\n\t */\n\tpublic function put_contents( $file, $contents, $mode = false ) {\n\t\t$fp = @fopen( $file, 'wb' );\n\t\tif ( ! $fp )\n\t\t\treturn false;\n\n\t\tmbstring_binary_safe_encoding();\n\n\t\t$data_length = strlen( $contents );\n\n\t\t$bytes_written = fwrite( $fp, $contents );\n\n\t\treset_mbstring_encoding();\n\n\t\tfclose( $fp );\n\n\t\tif ( $data_length !== $bytes_written )\n\t\t\treturn false;\n\n\t\t$this->chmod( $file, $mode );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Gets the current working directory\n\t *\n\t * @access public\n\t *\n\t * @return string|bool the current working directory on success, or false on failure.\n\t */\n\tpublic function cwd() {\n\t\treturn @getcwd();\n\t}\n\n\t/**\n\t * Change directory\n\t *\n\t * @access public\n\t *\n\t * @param string $dir The new current directory.\n\t * @return bool Returns true on success or false on failure.\n\t */\n\tpublic function chdir($dir) {\n\t\treturn @chdir($dir);\n\t}\n\n\t/**\n\t * Changes file group\n\t *\n\t * @access public\n\t *\n\t * @param string $file      Path to the file.\n\t * @param mixed  $group     A group name or number.\n\t * @param bool   $recursive Optional. If set True changes file group recursively. Default false.\n\t * @return bool Returns true on success or false on failure.\n\t */\n\tpublic function chgrp($file, $group, $recursive = false) {\n\t\tif ( ! $this->exists($file) )\n\t\t\treturn false;\n\t\tif ( ! $recursive )\n\t\t\treturn @chgrp($file, $group);\n\t\tif ( ! $this->is_dir($file) )\n\t\t\treturn @chgrp($file, $group);\n\t\t// Is a directory, and we want recursive\n\t\t$file = trailingslashit($file);\n\t\t$filelist = $this->dirlist($file);\n\t\tforeach ($filelist as $filename)\n\t\t\t$this->chgrp($file . $filename, $group, $recursive);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Changes filesystem permissions\n\t *\n\t * @access public\n\t *\n\t * @param string $file      Path to the file.\n\t * @param int    $mode      Optional. The permissions as octal number, usually 0644 for files,\n\t *                          0755 for dirs. Default false.\n\t * @param bool   $recursive Optional. If set True changes file group recursively. Default false.\n\t * @return bool Returns true on success or false on failure.\n\t */\n\tpublic function chmod($file, $mode = false, $recursive = false) {\n\t\tif ( ! $mode ) {\n\t\t\tif ( $this->is_file($file) )\n\t\t\t\t$mode = FS_CHMOD_FILE;\n\t\t\telseif ( $this->is_dir($file) )\n\t\t\t\t$mode = FS_CHMOD_DIR;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! $recursive || ! $this->is_dir($file) )\n\t\t\treturn @chmod($file, $mode);\n\t\t// Is a directory, and we want recursive\n\t\t$file = trailingslashit($file);\n\t\t$filelist = $this->dirlist($file);\n\t\tforeach ( (array)$filelist as $filename => $filemeta)\n\t\t\t$this->chmod($file . $filename, $mode, $recursive);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Changes file owner\n\t *\n\t * @access public\n\t *\n\t * @param string $file      Path to the file.\n\t * @param mixed  $owner     A user name or number.\n\t * @param bool   $recursive Optional. If set True changes file owner recursively.\n\t *                          Default false.\n\t * @return bool Returns true on success or false on failure.\n\t */\n\tpublic function chown($file, $owner, $recursive = false) {\n\t\tif ( ! $this->exists($file) )\n\t\t\treturn false;\n\t\tif ( ! $recursive )\n\t\t\treturn @chown($file, $owner);\n\t\tif ( ! $this->is_dir($file) )\n\t\t\treturn @chown($file, $owner);\n\t\t// Is a directory, and we want recursive\n\t\t$filelist = $this->dirlist($file);\n\t\tforeach ($filelist as $filename) {\n\t\t\t$this->chown($file . '/' . $filename, $owner, $recursive);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Gets file owner\n\t *\n\t * @access public\n\t *\n\t * @param string $file Path to the file.\n\t * @return string|bool Username of the user or false on error.\n\t */\n\tpublic function owner($file) {\n\t\t$owneruid = @fileowner($file);\n\t\tif ( ! $owneruid )\n\t\t\treturn false;\n\t\tif ( ! function_exists('posix_getpwuid') )\n\t\t\treturn $owneruid;\n\t\t$ownerarray = posix_getpwuid($owneruid);\n\t\treturn $ownerarray['name'];\n\t}\n\n\t/**\n\t * Gets file permissions\n\t *\n\t * FIXME does not handle errors in fileperms()\n\t *\n\t * @access public\n\t *\n\t * @param string $file Path to the file.\n\t * @return string Mode of the file (last 3 digits).\n\t */\n\tpublic function getchmod($file) {\n\t\treturn substr( decoct( @fileperms( $file ) ), -3 );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string|false\n\t */\n\tpublic function group($file) {\n\t\t$gid = @filegroup($file);\n\t\tif ( ! $gid )\n\t\t\treturn false;\n\t\tif ( ! function_exists('posix_getgrgid') )\n\t\t\treturn $gid;\n\t\t$grouparray = posix_getgrgid($gid);\n\t\treturn $grouparray['name'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $source\n\t * @param string $destination\n\t * @param bool   $overwrite\n\t * @param int    $mode\n\t * @return bool\n\t */\n\tpublic function copy($source, $destination, $overwrite = false, $mode = false) {\n\t\tif ( ! $overwrite && $this->exists($destination) )\n\t\t\treturn false;\n\n\t\t$rtval = copy($source, $destination);\n\t\tif ( $mode )\n\t\t\t$this->chmod($destination, $mode);\n\t\treturn $rtval;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $source\n\t * @param string $destination\n\t * @param bool $overwrite\n\t * @return bool\n\t */\n\tpublic function move($source, $destination, $overwrite = false) {\n\t\tif ( ! $overwrite && $this->exists($destination) )\n\t\t\treturn false;\n\n\t\t// Try using rename first. if that fails (for example, source is read only) try copy.\n\t\tif ( @rename($source, $destination) )\n\t\t\treturn true;\n\n\t\tif ( $this->copy($source, $destination, $overwrite) && $this->exists($destination) ) {\n\t\t\t$this->delete($source);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param bool $recursive\n\t * @param string $type\n\t * @return bool\n\t */\n\tpublic function delete($file, $recursive = false, $type = false) {\n\t\tif ( empty( $file ) ) // Some filesystems report this as /, which can cause non-expected recursive deletion of all files in the filesystem.\n\t\t\treturn false;\n\t\t$file = str_replace( '\\\\', '/', $file ); // for win32, occasional problems deleting files otherwise\n\n\t\tif ( 'f' == $type || $this->is_file($file) )\n\t\t\treturn @unlink($file);\n\t\tif ( ! $recursive && $this->is_dir($file) )\n\t\t\treturn @rmdir($file);\n\n\t\t// At this point it's a folder, and we're in recursive mode\n\t\t$file = trailingslashit($file);\n\t\t$filelist = $this->dirlist($file, true);\n\n\t\t$retval = true;\n\t\tif ( is_array( $filelist ) ) {\n\t\t\tforeach ( $filelist as $filename => $fileinfo ) {\n\t\t\t\tif ( ! $this->delete($file . $filename, $recursive, $fileinfo['type']) )\n\t\t\t\t\t$retval = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( file_exists($file) && ! @rmdir($file) )\n\t\t\t$retval = false;\n\n\t\treturn $retval;\n\t}\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function exists($file) {\n\t\treturn @file_exists($file);\n\t}\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_file($file) {\n\t\treturn @is_file($file);\n\t}\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @return bool\n\t */\n\tpublic function is_dir($path) {\n\t\treturn @is_dir($path);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_readable($file) {\n\t\treturn @is_readable($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_writable($file) {\n\t\treturn @is_writable($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function atime($file) {\n\t\treturn @fileatime($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function mtime($file) {\n\t\treturn @filemtime($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function size($file) {\n\t\treturn @filesize($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param int $time\n\t * @param int $atime\n\t * @return bool\n\t */\n\tpublic function touch($file, $time = 0, $atime = 0) {\n\t\tif ($time == 0)\n\t\t\t$time = time();\n\t\tif ($atime == 0)\n\t\t\t$atime = time();\n\t\treturn @touch($file, $time, $atime);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param mixed  $chmod\n\t * @param mixed  $chown\n\t * @param mixed  $chgrp\n\t * @return bool\n\t */\n\tpublic function mkdir($path, $chmod = false, $chown = false, $chgrp = false) {\n\t\t// Safe mode fails with a trailing slash under certain PHP versions.\n\t\t$path = untrailingslashit($path);\n\t\tif ( empty($path) )\n\t\t\treturn false;\n\n\t\tif ( ! $chmod )\n\t\t\t$chmod = FS_CHMOD_DIR;\n\n\t\tif ( ! @mkdir($path) )\n\t\t\treturn false;\n\t\t$this->chmod($path, $chmod);\n\t\tif ( $chown )\n\t\t\t$this->chown($path, $chown);\n\t\tif ( $chgrp )\n\t\t\t$this->chgrp($path, $chgrp);\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param bool $recursive\n\t * @return bool\n\t */\n\tpublic function rmdir($path, $recursive = false) {\n\t\treturn $this->delete($path, $recursive);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param bool $include_hidden\n\t * @param bool $recursive\n\t * @return bool|array\n\t */\n\tpublic function dirlist($path, $include_hidden = true, $recursive = false) {\n\t\tif ( $this->is_file($path) ) {\n\t\t\t$limit_file = basename($path);\n\t\t\t$path = dirname($path);\n\t\t} else {\n\t\t\t$limit_file = false;\n\t\t}\n\n\t\tif ( ! $this->is_dir($path) )\n\t\t\treturn false;\n\n\t\t$dir = @dir($path);\n\t\tif ( ! $dir )\n\t\t\treturn false;\n\n\t\t$ret = array();\n\n\t\twhile (false !== ($entry = $dir->read()) ) {\n\t\t\t$struc = array();\n\t\t\t$struc['name'] = $entry;\n\n\t\t\tif ( '.' == $struc['name'] || '..' == $struc['name'] )\n\t\t\t\tcontinue;\n\n\t\t\tif ( ! $include_hidden && '.' == $struc['name'][0] )\n\t\t\t\tcontinue;\n\n\t\t\tif ( $limit_file && $struc['name'] != $limit_file)\n\t\t\t\tcontinue;\n\n\t\t\t$struc['perms'] \t= $this->gethchmod($path.'/'.$entry);\n\t\t\t$struc['permsn']\t= $this->getnumchmodfromh($struc['perms']);\n\t\t\t$struc['number'] \t= false;\n\t\t\t$struc['owner']    \t= $this->owner($path.'/'.$entry);\n\t\t\t$struc['group']    \t= $this->group($path.'/'.$entry);\n\t\t\t$struc['size']    \t= $this->size($path.'/'.$entry);\n\t\t\t$struc['lastmodunix']= $this->mtime($path.'/'.$entry);\n\t\t\t$struc['lastmod']   = date('M j',$struc['lastmodunix']);\n\t\t\t$struc['time']    \t= date('h:i:s',$struc['lastmodunix']);\n\t\t\t$struc['type']\t\t= $this->is_dir($path.'/'.$entry) ? 'd' : 'f';\n\n\t\t\tif ( 'd' == $struc['type'] ) {\n\t\t\t\tif ( $recursive )\n\t\t\t\t\t$struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive);\n\t\t\t\telse\n\t\t\t\t\t$struc['files'] = array();\n\t\t\t}\n\n\t\t\t$ret[ $struc['name'] ] = $struc;\n\t\t}\n\t\t$dir->close();\n\t\tunset($dir);\n\t\treturn $ret;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-filesystem-ftpext.php",
    "content": "<?php\n/**\n * WordPress FTP Filesystem.\n *\n * @package WordPress\n * @subpackage Filesystem\n */\n\n/**\n * WordPress Filesystem Class for implementing FTP.\n *\n * @since 2.5.0\n * @package WordPress\n * @subpackage Filesystem\n * @uses WP_Filesystem_Base Extends class\n */\nclass WP_Filesystem_FTPext extends WP_Filesystem_Base {\n\tpublic $link;\n\n\t/**\n\t * @access public\n\t *\n\t * @param array $opt\n\t */\n\tpublic function __construct( $opt = '' ) {\n\t\t$this->method = 'ftpext';\n\t\t$this->errors = new WP_Error();\n\n\t\t// Check if possible to use ftp functions.\n\t\tif ( ! extension_loaded('ftp') ) {\n\t\t\t$this->errors->add('no_ftp_ext', __('The ftp PHP extension is not available'));\n\t\t\treturn;\n\t\t}\n\n\t\t// This Class uses the timeout on a per-connection basis, Others use it on a per-action basis.\n\n\t\tif ( ! defined('FS_TIMEOUT') )\n\t\t\tdefine('FS_TIMEOUT', 240);\n\n\t\tif ( empty($opt['port']) )\n\t\t\t$this->options['port'] = 21;\n\t\telse\n\t\t\t$this->options['port'] = $opt['port'];\n\n\t\tif ( empty($opt['hostname']) )\n\t\t\t$this->errors->add('empty_hostname', __('FTP hostname is required'));\n\t\telse\n\t\t\t$this->options['hostname'] = $opt['hostname'];\n\n\t\t// Check if the options provided are OK.\n\t\tif ( empty($opt['username']) )\n\t\t\t$this->errors->add('empty_username', __('FTP username is required'));\n\t\telse\n\t\t\t$this->options['username'] = $opt['username'];\n\n\t\tif ( empty($opt['password']) )\n\t\t\t$this->errors->add('empty_password', __('FTP password is required'));\n\t\telse\n\t\t\t$this->options['password'] = $opt['password'];\n\n\t\t$this->options['ssl'] = false;\n\t\tif ( isset($opt['connection_type']) && 'ftps' == $opt['connection_type'] )\n\t\t\t$this->options['ssl'] = true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @return bool\n\t */\n\tpublic function connect() {\n\t\tif ( isset($this->options['ssl']) && $this->options['ssl'] && function_exists('ftp_ssl_connect') )\n\t\t\t$this->link = @ftp_ssl_connect($this->options['hostname'], $this->options['port'], FS_CONNECT_TIMEOUT);\n\t\telse\n\t\t\t$this->link = @ftp_connect($this->options['hostname'], $this->options['port'], FS_CONNECT_TIMEOUT);\n\n\t\tif ( ! $this->link ) {\n\t\t\t$this->errors->add( 'connect',\n\t\t\t\t/* translators: %s: hostname:port */\n\t\t\t\tsprintf( __( 'Failed to connect to FTP Server %s' ),\n\t\t\t\t\t$this->options['hostname'] . ':' . $this->options['port']\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! @ftp_login( $this->link,$this->options['username'], $this->options['password'] ) ) {\n\t\t\t$this->errors->add( 'auth',\n\t\t\t\t/* translators: %s: username */\n\t\t\t\tsprintf( __( 'Username/Password incorrect for %s' ),\n\t\t\t\t\t$this->options['username']\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Set the Connection to use Passive FTP\n\t\t@ftp_pasv( $this->link, true );\n\t\tif ( @ftp_get_option($this->link, FTP_TIMEOUT_SEC) < FS_TIMEOUT )\n\t\t\t@ftp_set_option($this->link, FTP_TIMEOUT_SEC, FS_TIMEOUT);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Retrieves the file contents.\n\t *\n\t * @since 2.5.0\n\t * @access public\n\t *\n\t * @param string $file Filename.\n\t * @return string|false File contents on success, false if no temp file could be opened,\n\t *                      or if the file couldn't be retrieved.\n\t */\n\tpublic function get_contents( $file ) {\n\t\t$tempfile = wp_tempnam($file);\n\t\t$temp = fopen($tempfile, 'w+');\n\n\t\tif ( ! $temp )\n\t\t\treturn false;\n\n\t\tif ( ! @ftp_fget($this->link, $temp, $file, FTP_BINARY ) )\n\t\t\treturn false;\n\n\t\tfseek( $temp, 0 ); // Skip back to the start of the file being written to\n\t\t$contents = '';\n\n\t\twhile ( ! feof($temp) )\n\t\t\t$contents .= fread($temp, 8192);\n\n\t\tfclose($temp);\n\t\tunlink($tempfile);\n\t\treturn $contents;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return array\n\t */\n\tpublic function get_contents_array($file) {\n\t\treturn explode(\"\\n\", $this->get_contents($file));\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param string $contents\n\t * @param bool|int $mode\n\t * @return bool\n\t */\n\tpublic function put_contents($file, $contents, $mode = false ) {\n\t\t$tempfile = wp_tempnam($file);\n\t\t$temp = fopen( $tempfile, 'wb+' );\n\t\tif ( ! $temp )\n\t\t\treturn false;\n\n\t\tmbstring_binary_safe_encoding();\n\n\t\t$data_length = strlen( $contents );\n\t\t$bytes_written = fwrite( $temp, $contents );\n\n\t\treset_mbstring_encoding();\n\n\t\tif ( $data_length !== $bytes_written ) {\n\t\t\tfclose( $temp );\n\t\t\tunlink( $tempfile );\n\t\t\treturn false;\n\t\t}\n\n\t\tfseek( $temp, 0 ); // Skip back to the start of the file being written to\n\n\t\t$ret = @ftp_fput( $this->link, $file, $temp, FTP_BINARY );\n\n\t\tfclose($temp);\n\t\tunlink($tempfile);\n\n\t\t$this->chmod($file, $mode);\n\n\t\treturn $ret;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @return string\n\t */\n\tpublic function cwd() {\n\t\t$cwd = @ftp_pwd($this->link);\n\t\tif ( $cwd )\n\t\t\t$cwd = trailingslashit($cwd);\n\t\treturn $cwd;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $dir\n\t * @return bool\n\t */\n\tpublic function chdir($dir) {\n\t\treturn @ftp_chdir($this->link, $dir);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param int $mode\n\t * @param bool $recursive\n\t * @return bool\n\t */\n\tpublic function chmod($file, $mode = false, $recursive = false) {\n\t\tif ( ! $mode ) {\n\t\t\tif ( $this->is_file($file) )\n\t\t\t\t$mode = FS_CHMOD_FILE;\n\t\t\telseif ( $this->is_dir($file) )\n\t\t\t\t$mode = FS_CHMOD_DIR;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\t// chmod any sub-objects if recursive.\n\t\tif ( $recursive && $this->is_dir($file) ) {\n\t\t\t$filelist = $this->dirlist($file);\n\t\t\tforeach ( (array)$filelist as $filename => $filemeta )\n\t\t\t\t$this->chmod($file . '/' . $filename, $mode, $recursive);\n\t\t}\n\n\t\t// chmod the file or directory\n\t\tif ( ! function_exists('ftp_chmod') )\n\t\t\treturn (bool)@ftp_site($this->link, sprintf('CHMOD %o %s', $mode, $file));\n\t\treturn (bool)@ftp_chmod($this->link, $mode, $file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string\n\t */\n\tpublic function owner($file) {\n\t\t$dir = $this->dirlist($file);\n\t\treturn $dir[$file]['owner'];\n\t}\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string\n\t */\n\tpublic function getchmod($file) {\n\t\t$dir = $this->dirlist($file);\n\t\treturn $dir[$file]['permsn'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string\n\t */\n\tpublic function group($file) {\n\t\t$dir = $this->dirlist($file);\n\t\treturn $dir[$file]['group'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $source\n\t * @param string $destination\n\t * @param bool   $overwrite\n\t * @param string|bool $mode\n\t * @return bool\n\t */\n\tpublic function copy($source, $destination, $overwrite = false, $mode = false) {\n\t\tif ( ! $overwrite && $this->exists($destination) )\n\t\t\treturn false;\n\t\t$content = $this->get_contents($source);\n\t\tif ( false === $content )\n\t\t\treturn false;\n\t\treturn $this->put_contents($destination, $content, $mode);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $source\n\t * @param string $destination\n\t * @param bool $overwrite\n\t * @return bool\n\t */\n\tpublic function move($source, $destination, $overwrite = false) {\n\t\treturn ftp_rename($this->link, $source, $destination);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param bool $recursive\n\t * @param string $type\n\t * @return bool\n\t */\n\tpublic function delete($file, $recursive = false, $type = false) {\n\t\tif ( empty($file) )\n\t\t\treturn false;\n\t\tif ( 'f' == $type || $this->is_file($file) )\n\t\t\treturn @ftp_delete($this->link, $file);\n\t\tif ( !$recursive )\n\t\t\treturn @ftp_rmdir($this->link, $file);\n\n\t\t$filelist = $this->dirlist( trailingslashit($file) );\n\t\tif ( !empty($filelist) )\n\t\t\tforeach ( $filelist as $delete_file )\n\t\t\t\t$this->delete( trailingslashit($file) . $delete_file['name'], $recursive, $delete_file['type'] );\n\t\treturn @ftp_rmdir($this->link, $file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function exists($file) {\n\t\t$list = @ftp_nlist($this->link, $file);\n\n\t\tif ( empty( $list ) && $this->is_dir( $file ) ) {\n\t\t\treturn true; // File is an empty directory.\n\t\t}\n\n\t\treturn !empty($list); //empty list = no file, so invert.\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_file($file) {\n\t\treturn $this->exists($file) && !$this->is_dir($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @return bool\n\t */\n\tpublic function is_dir($path) {\n\t\t$cwd = $this->cwd();\n\t\t$result = @ftp_chdir($this->link, trailingslashit($path) );\n\t\tif ( $result && $path == $this->cwd() || $this->cwd() != $cwd ) {\n\t\t\t@ftp_chdir($this->link, $cwd);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_readable($file) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_writable($file) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function atime($file) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function mtime($file) {\n\t\treturn ftp_mdtm($this->link, $file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function size($file) {\n\t\treturn ftp_size($this->link, $file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function touch($file, $time = 0, $atime = 0) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param mixed $chmod\n\t * @param mixed $chown\n\t * @param mixed $chgrp\n\t * @return bool\n\t */\n\tpublic function mkdir($path, $chmod = false, $chown = false, $chgrp = false) {\n\t\t$path = untrailingslashit($path);\n\t\tif ( empty($path) )\n\t\t\treturn false;\n\n\t\tif ( !@ftp_mkdir($this->link, $path) )\n\t\t\treturn false;\n\t\t$this->chmod($path, $chmod);\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param bool $recursive\n\t * @return bool\n\t */\n\tpublic function rmdir($path, $recursive = false) {\n\t\treturn $this->delete($path, $recursive);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @staticvar bool $is_windows\n\t * @param string $line\n\t * @return array\n\t */\n\tpublic function parselisting($line) {\n\t\tstatic $is_windows = null;\n\t\tif ( is_null($is_windows) )\n\t\t\t$is_windows = stripos( ftp_systype($this->link), 'win') !== false;\n\n\t\tif ( $is_windows && preg_match('/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)/', $line, $lucifer) ) {\n\t\t\t$b = array();\n\t\t\tif ( $lucifer[3] < 70 )\n\t\t\t\t$lucifer[3] +=2000;\n\t\t\telse\n\t\t\t\t$lucifer[3] += 1900; // 4digit year fix\n\t\t\t$b['isdir'] = ( $lucifer[7] == '<DIR>');\n\t\t\tif ( $b['isdir'] )\n\t\t\t\t$b['type'] = 'd';\n\t\t\telse\n\t\t\t\t$b['type'] = 'f';\n\t\t\t$b['size'] = $lucifer[7];\n\t\t\t$b['month'] = $lucifer[1];\n\t\t\t$b['day'] = $lucifer[2];\n\t\t\t$b['year'] = $lucifer[3];\n\t\t\t$b['hour'] = $lucifer[4];\n\t\t\t$b['minute'] = $lucifer[5];\n\t\t\t$b['time'] = @mktime($lucifer[4] + (strcasecmp($lucifer[6], \"PM\") == 0 ? 12 : 0), $lucifer[5], 0, $lucifer[1], $lucifer[2], $lucifer[3]);\n\t\t\t$b['am/pm'] = $lucifer[6];\n\t\t\t$b['name'] = $lucifer[8];\n\t\t} elseif ( !$is_windows && $lucifer = preg_split('/[ ]/', $line, 9, PREG_SPLIT_NO_EMPTY)) {\n\t\t\t//echo $line.\"\\n\";\n\t\t\t$lcount = count($lucifer);\n\t\t\tif ( $lcount < 8 )\n\t\t\t\treturn '';\n\t\t\t$b = array();\n\t\t\t$b['isdir'] = $lucifer[0]{0} === 'd';\n\t\t\t$b['islink'] = $lucifer[0]{0} === 'l';\n\t\t\tif ( $b['isdir'] )\n\t\t\t\t$b['type'] = 'd';\n\t\t\telseif ( $b['islink'] )\n\t\t\t\t$b['type'] = 'l';\n\t\t\telse\n\t\t\t\t$b['type'] = 'f';\n\t\t\t$b['perms'] = $lucifer[0];\n\t\t\t$b['permsn'] = $this->getnumchmodfromh( $b['perms'] );\n\t\t\t$b['number'] = $lucifer[1];\n\t\t\t$b['owner'] = $lucifer[2];\n\t\t\t$b['group'] = $lucifer[3];\n\t\t\t$b['size'] = $lucifer[4];\n\t\t\tif ( $lcount == 8 ) {\n\t\t\t\tsscanf($lucifer[5], '%d-%d-%d', $b['year'], $b['month'], $b['day']);\n\t\t\t\tsscanf($lucifer[6], '%d:%d', $b['hour'], $b['minute']);\n\t\t\t\t$b['time'] = @mktime($b['hour'], $b['minute'], 0, $b['month'], $b['day'], $b['year']);\n\t\t\t\t$b['name'] = $lucifer[7];\n\t\t\t} else {\n\t\t\t\t$b['month'] = $lucifer[5];\n\t\t\t\t$b['day'] = $lucifer[6];\n\t\t\t\tif ( preg_match('/([0-9]{2}):([0-9]{2})/', $lucifer[7], $l2) ) {\n\t\t\t\t\t$b['year'] = date(\"Y\");\n\t\t\t\t\t$b['hour'] = $l2[1];\n\t\t\t\t\t$b['minute'] = $l2[2];\n\t\t\t\t} else {\n\t\t\t\t\t$b['year'] = $lucifer[7];\n\t\t\t\t\t$b['hour'] = 0;\n\t\t\t\t\t$b['minute'] = 0;\n\t\t\t\t}\n\t\t\t\t$b['time'] = strtotime( sprintf('%d %s %d %02d:%02d', $b['day'], $b['month'], $b['year'], $b['hour'], $b['minute']) );\n\t\t\t\t$b['name'] = $lucifer[8];\n\t\t\t}\n\t\t}\n\n\t\t// Replace symlinks formatted as \"source -> target\" with just the source name\n\t\tif ( isset( $b['islink'] ) && $b['islink'] ) {\n\t\t\t$b['name'] = preg_replace( '/(\\s*->\\s*.*)$/', '', $b['name'] );\n\t\t}\n\n\t\treturn $b;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param bool $include_hidden\n\t * @param bool $recursive\n\t * @return bool|array\n\t */\n\tpublic function dirlist($path = '.', $include_hidden = true, $recursive = false) {\n\t\tif ( $this->is_file($path) ) {\n\t\t\t$limit_file = basename($path);\n\t\t\t$path = dirname($path) . '/';\n\t\t} else {\n\t\t\t$limit_file = false;\n\t\t}\n\n\t\t$pwd = @ftp_pwd($this->link);\n\t\tif ( ! @ftp_chdir($this->link, $path) ) // Cant change to folder = folder doesn't exist\n\t\t\treturn false;\n\t\t$list = @ftp_rawlist($this->link, '-a', false);\n\t\t@ftp_chdir($this->link, $pwd);\n\n\t\tif ( empty($list) ) // Empty array = non-existent folder (real folder will show . at least)\n\t\t\treturn false;\n\n\t\t$dirlist = array();\n\t\tforeach ( $list as $k => $v ) {\n\t\t\t$entry = $this->parselisting($v);\n\t\t\tif ( empty($entry) )\n\t\t\t\tcontinue;\n\n\t\t\tif ( '.' == $entry['name'] || '..' == $entry['name'] )\n\t\t\t\tcontinue;\n\n\t\t\tif ( ! $include_hidden && '.' == $entry['name'][0] )\n\t\t\t\tcontinue;\n\n\t\t\tif ( $limit_file && $entry['name'] != $limit_file)\n\t\t\t\tcontinue;\n\n\t\t\t$dirlist[ $entry['name'] ] = $entry;\n\t\t}\n\n\t\t$ret = array();\n\t\tforeach ( (array)$dirlist as $struc ) {\n\t\t\tif ( 'd' == $struc['type'] ) {\n\t\t\t\tif ( $recursive )\n\t\t\t\t\t$struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive);\n\t\t\t\telse\n\t\t\t\t\t$struc['files'] = array();\n\t\t\t}\n\n\t\t\t$ret[ $struc['name'] ] = $struc;\n\t\t}\n\t\treturn $ret;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function __destruct() {\n\t\tif ( $this->link )\n\t\t\tftp_close($this->link);\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-filesystem-ftpsockets.php",
    "content": "<?php\n/**\n * WordPress FTP Sockets Filesystem.\n *\n * @package WordPress\n * @subpackage Filesystem\n */\n\n/**\n * WordPress Filesystem Class for implementing FTP Sockets.\n *\n * @since 2.5.0\n * @package WordPress\n * @subpackage Filesystem\n * @uses WP_Filesystem_Base Extends class\n */\nclass WP_Filesystem_ftpsockets extends WP_Filesystem_Base {\n\t/**\n\t * @access public\n\t * @var ftp\n\t */\n\tpublic $ftp;\n\n\t/**\n\t * @access public\n\t *\n\t * @param array $opt\n\t */\n\tpublic function __construct( $opt  = '' ) {\n\t\t$this->method = 'ftpsockets';\n\t\t$this->errors = new WP_Error();\n\n\t\t// Check if possible to use ftp functions.\n\t\tif ( ! @include_once( ABSPATH . 'wp-admin/includes/class-ftp.php' ) ) {\n\t\t\treturn;\n\t\t}\n\t\t$this->ftp = new ftp();\n\n\t\tif ( empty($opt['port']) )\n\t\t\t$this->options['port'] = 21;\n\t\telse\n\t\t\t$this->options['port'] = $opt['port'];\n\n\t\tif ( empty($opt['hostname']) )\n\t\t\t$this->errors->add('empty_hostname', __('FTP hostname is required'));\n\t\telse\n\t\t\t$this->options['hostname'] = $opt['hostname'];\n\n\t\t// Check if the options provided are OK.\n\t\tif ( empty ($opt['username']) )\n\t\t\t$this->errors->add('empty_username', __('FTP username is required'));\n\t\telse\n\t\t\t$this->options['username'] = $opt['username'];\n\n\t\tif ( empty ($opt['password']) )\n\t\t\t$this->errors->add('empty_password', __('FTP password is required'));\n\t\telse\n\t\t\t$this->options['password'] = $opt['password'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @return bool\n\t */\n\tpublic function connect() {\n\t\tif ( ! $this->ftp )\n\t\t\treturn false;\n\n\t\t$this->ftp->setTimeout(FS_CONNECT_TIMEOUT);\n\n\t\tif ( ! $this->ftp->SetServer( $this->options['hostname'], $this->options['port'] ) ) {\n\t\t\t$this->errors->add( 'connect',\n\t\t\t\t/* translators: %s: hostname:port */\n\t\t\t\tsprintf( __( 'Failed to connect to FTP Server %s' ),\n\t\t\t\t\t$this->options['hostname'] . ':' . $this->options['port']\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! $this->ftp->connect() ) {\n\t\t\t$this->errors->add( 'connect',\n\t\t\t\t/* translators: %s: hostname:port */\n\t\t\t\tsprintf( __( 'Failed to connect to FTP Server %s' ),\n\t\t\t\t\t$this->options['hostname'] . ':' . $this->options['port']\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! $this->ftp->login( $this->options['username'], $this->options['password'] ) ) {\n\t\t\t$this->errors->add( 'auth',\n\t\t\t\t/* translators: %s: username */\n\t\t\t\tsprintf( __( 'Username/Password incorrect for %s' ),\n\t\t\t\t\t$this->options['username']\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->ftp->SetType( FTP_BINARY );\n\t\t$this->ftp->Passive( true );\n\t\t$this->ftp->setTimeout( FS_TIMEOUT );\n\t\treturn true;\n\t}\n\n\t/**\n\t * Retrieves the file contents.\n\t *\n\t * @since 2.5.0\n\t * @access public\n\t *\n\t * @param string $file Filename.\n\t * @return string|false File contents on success, false if no temp file could be opened,\n\t *                      or if the file doesn't exist.\n\t */\n\tpublic function get_contents( $file ) {\n\t\tif ( ! $this->exists($file) )\n\t\t\treturn false;\n\n\t\t$temp = wp_tempnam( $file );\n\n\t\tif ( ! $temphandle = fopen($temp, 'w+') )\n\t\t\treturn false;\n\n\t\tmbstring_binary_safe_encoding();\n\n\t\tif ( ! $this->ftp->fget($temphandle, $file) ) {\n\t\t\tfclose($temphandle);\n\t\t\tunlink($temp);\n\n\t\t\treset_mbstring_encoding();\n\n\t\t\treturn ''; // Blank document, File does exist, It's just blank.\n\t\t}\n\n\t\treset_mbstring_encoding();\n\n\t\tfseek( $temphandle, 0 ); // Skip back to the start of the file being written to\n\t\t$contents = '';\n\n\t\twhile ( ! feof($temphandle) )\n\t\t\t$contents .= fread($temphandle, 8192);\n\n\t\tfclose($temphandle);\n\t\tunlink($temp);\n\t\treturn $contents;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return array\n\t */\n\tpublic function get_contents_array($file) {\n\t\treturn explode(\"\\n\", $this->get_contents($file) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param string $contents\n\t * @param int|bool $mode\n\t * @return bool\n\t */\n\tpublic function put_contents($file, $contents, $mode = false ) {\n\t\t$temp = wp_tempnam( $file );\n\t\tif ( ! $temphandle = @fopen($temp, 'w+') ) {\n\t\t\tunlink($temp);\n\t\t\treturn false;\n\t\t}\n\n\t\t// The FTP class uses string functions internally during file download/upload\n\t\tmbstring_binary_safe_encoding();\n\n\t\t$bytes_written = fwrite( $temphandle, $contents );\n\t\tif ( false === $bytes_written || $bytes_written != strlen( $contents ) ) {\n\t\t\tfclose( $temphandle );\n\t\t\tunlink( $temp );\n\n\t\t\treset_mbstring_encoding();\n\n\t\t\treturn false;\n\t\t}\n\n\t\tfseek( $temphandle, 0 ); // Skip back to the start of the file being written to\n\n\t\t$ret = $this->ftp->fput($file, $temphandle);\n\n\t\treset_mbstring_encoding();\n\n\t\tfclose($temphandle);\n\t\tunlink($temp);\n\n\t\t$this->chmod($file, $mode);\n\n\t\treturn $ret;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @return string\n\t */\n\tpublic function cwd() {\n\t\t$cwd = $this->ftp->pwd();\n\t\tif ( $cwd )\n\t\t\t$cwd = trailingslashit($cwd);\n\t\treturn $cwd;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function chdir($file) {\n\t\treturn $this->ftp->chdir($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param int|bool $mode\n\t * @param bool $recursive\n\t * @return bool\n\t */\n\tpublic function chmod($file, $mode = false, $recursive = false ) {\n\t\tif ( ! $mode ) {\n\t\t\tif ( $this->is_file($file) )\n\t\t\t\t$mode = FS_CHMOD_FILE;\n\t\t\telseif ( $this->is_dir($file) )\n\t\t\t\t$mode = FS_CHMOD_DIR;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\t// chmod any sub-objects if recursive.\n\t\tif ( $recursive && $this->is_dir($file) ) {\n\t\t\t$filelist = $this->dirlist($file);\n\t\t\tforeach ( (array)$filelist as $filename => $filemeta )\n\t\t\t\t$this->chmod($file . '/' . $filename, $mode, $recursive);\n\t\t}\n\n\t\t// chmod the file or directory\n\t\treturn $this->ftp->chmod($file, $mode);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string\n\t */\n\tpublic function owner($file) {\n\t\t$dir = $this->dirlist($file);\n\t\treturn $dir[$file]['owner'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string\n\t */\n\tpublic function getchmod($file) {\n\t\t$dir = $this->dirlist($file);\n\t\treturn $dir[$file]['permsn'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string\n\t */\n\tpublic function group($file) {\n\t\t$dir = $this->dirlist($file);\n\t\treturn $dir[$file]['group'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string   $source\n\t * @param string   $destination\n\t * @param bool     $overwrite\n\t * @param int|bool $mode\n\t * @return bool\n\t */\n\tpublic function copy($source, $destination, $overwrite = false, $mode = false) {\n\t\tif ( ! $overwrite && $this->exists($destination) )\n\t\t\treturn false;\n\n\t\t$content = $this->get_contents($source);\n\t\tif ( false === $content )\n\t\t\treturn false;\n\n\t\treturn $this->put_contents($destination, $content, $mode);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $source\n\t * @param string $destination\n\t * @param bool   $overwrite\n\t * @return bool\n\t */\n\tpublic function move($source, $destination, $overwrite = false ) {\n\t\treturn $this->ftp->rename($source, $destination);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param bool   $recursive\n\t * @param string $type\n\t * @return bool\n\t */\n\tpublic function delete($file, $recursive = false, $type = false) {\n\t\tif ( empty($file) )\n\t\t\treturn false;\n\t\tif ( 'f' == $type || $this->is_file($file) )\n\t\t\treturn $this->ftp->delete($file);\n\t\tif ( !$recursive )\n\t\t\treturn $this->ftp->rmdir($file);\n\n\t\treturn $this->ftp->mdel($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function exists( $file ) {\n\t\t$list = $this->ftp->nlist( $file );\n\n\t\tif ( empty( $list ) && $this->is_dir( $file ) ) {\n\t\t\treturn true; // File is an empty directory.\n\t\t}\n\n\t\treturn !empty( $list ); //empty list = no file, so invert.\n\t\t// Return $this->ftp->is_exists($file); has issues with ABOR+426 responses on the ncFTPd server.\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_file($file) {\n\t\tif ( $this->is_dir($file) )\n\t\t\treturn false;\n\t\tif ( $this->exists($file) )\n\t\t\treturn true;\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @return bool\n\t */\n\tpublic function is_dir($path) {\n\t\t$cwd = $this->cwd();\n\t\tif ( $this->chdir($path) ) {\n\t\t\t$this->chdir($cwd);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_readable($file) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_writable($file) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function atime($file) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function mtime($file) {\n\t\treturn $this->ftp->mdtm($file);\n\t}\n\n\t/**\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function size($file) {\n\t\treturn $this->ftp->filesize($file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param int $time\n\t * @param int $atime\n\t * @return bool\n\t */\n\tpublic function touch($file, $time = 0, $atime = 0 ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param mixed  $chmod\n\t * @param mixed  $chown\n\t * @param mixed  $chgrp\n\t * @return bool\n\t */\n\tpublic function mkdir($path, $chmod = false, $chown = false, $chgrp = false ) {\n\t\t$path = untrailingslashit($path);\n\t\tif ( empty($path) )\n\t\t\treturn false;\n\n\t\tif ( ! $this->ftp->mkdir($path) )\n\t\t\treturn false;\n\t\tif ( ! $chmod )\n\t\t\t$chmod = FS_CHMOD_DIR;\n\t\t$this->chmod($path, $chmod);\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param bool $recursive\n\t */\n\tpublic function rmdir($path, $recursive = false ) {\n\t\t$this->delete($path, $recursive);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param bool   $include_hidden\n\t * @param bool   $recursive\n\t * @return bool|array\n\t */\n\tpublic function dirlist($path = '.', $include_hidden = true, $recursive = false ) {\n\t\tif ( $this->is_file($path) ) {\n\t\t\t$limit_file = basename($path);\n\t\t\t$path = dirname($path) . '/';\n\t\t} else {\n\t\t\t$limit_file = false;\n\t\t}\n\n\t\tmbstring_binary_safe_encoding();\n\n\t\t$list = $this->ftp->dirlist($path);\n\t\tif ( empty( $list ) && ! $this->exists( $path ) ) {\n\n\t\t\treset_mbstring_encoding();\n\n\t\t\treturn false;\n\t\t}\n\n\t\t$ret = array();\n\t\tforeach ( $list as $struc ) {\n\n\t\t\tif ( '.' == $struc['name'] || '..' == $struc['name'] )\n\t\t\t\tcontinue;\n\n\t\t\tif ( ! $include_hidden && '.' == $struc['name'][0] )\n\t\t\t\tcontinue;\n\n\t\t\tif ( $limit_file && $struc['name'] != $limit_file )\n\t\t\t\tcontinue;\n\n\t\t\tif ( 'd' == $struc['type'] ) {\n\t\t\t\tif ( $recursive )\n\t\t\t\t\t$struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive);\n\t\t\t\telse\n\t\t\t\t\t$struc['files'] = array();\n\t\t\t}\n\n\t\t\t// Replace symlinks formatted as \"source -> target\" with just the source name\n\t\t\tif ( $struc['islink'] )\n\t\t\t\t$struc['name'] = preg_replace( '/(\\s*->\\s*.*)$/', '', $struc['name'] );\n\n\t\t\t// Add the Octal representation of the file permissions\n\t\t\t$struc['permsn'] = $this->getnumchmodfromh( $struc['perms'] );\n\n\t\t\t$ret[ $struc['name'] ] = $struc;\n\t\t}\n\n\t\treset_mbstring_encoding();\n\n\t\treturn $ret;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function __destruct() {\n\t\t$this->ftp->quit();\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-filesystem-ssh2.php",
    "content": "<?php\n/**\n * WordPress Filesystem Class for implementing SSH2\n *\n * To use this class you must follow these steps for PHP 5.2.6+\n *\n * @contrib http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/ - Installation Notes\n *\n * Complie libssh2 (Note: Only 0.14 is officaly working with PHP 5.2.6+ right now, But many users have found the latest versions work)\n *\n * cd /usr/src\n * wget http://surfnet.dl.sourceforge.net/sourceforge/libssh2/libssh2-0.14.tar.gz\n * tar -zxvf libssh2-0.14.tar.gz\n * cd libssh2-0.14/\n * ./configure\n * make all install\n *\n * Note: Do not leave the directory yet!\n *\n * Enter: pecl install -f ssh2\n *\n * Copy the ssh.so file it creates to your PHP Module Directory.\n * Open up your PHP.INI file and look for where extensions are placed.\n * Add in your PHP.ini file: extension=ssh2.so\n *\n * Restart Apache!\n * Check phpinfo() streams to confirm that: ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp  exist.\n *\n * Note: as of WordPress 2.8, This utilises the PHP5+ function 'stream_get_contents'\n *\n * @since 2.7.0\n *\n * @package WordPress\n * @subpackage Filesystem\n */\nclass WP_Filesystem_SSH2 extends WP_Filesystem_Base {\n\n\t/**\n\t * @access public\n\t */\n\tpublic $link = false;\n\n\t/**\n\t * @access public\n\t * @var resource\n\t */\n\tpublic $sftp_link;\n\tpublic $keys = false;\n\n\t/**\n\t * @access public\n\t *\n\t * @param array $opt\n\t */\n\tpublic function __construct( $opt = '' ) {\n\t\t$this->method = 'ssh2';\n\t\t$this->errors = new WP_Error();\n\n\t\t//Check if possible to use ssh2 functions.\n\t\tif ( ! extension_loaded('ssh2') ) {\n\t\t\t$this->errors->add('no_ssh2_ext', __('The ssh2 PHP extension is not available'));\n\t\t\treturn;\n\t\t}\n\t\tif ( !function_exists('stream_get_contents') ) {\n\t\t\t$this->errors->add('ssh2_php_requirement', __('The ssh2 PHP extension is available, however, we require the PHP5 function <code>stream_get_contents()</code>'));\n\t\t\treturn;\n\t\t}\n\n\t\t// Set defaults:\n\t\tif ( empty($opt['port']) )\n\t\t\t$this->options['port'] = 22;\n\t\telse\n\t\t\t$this->options['port'] = $opt['port'];\n\n\t\tif ( empty($opt['hostname']) )\n\t\t\t$this->errors->add('empty_hostname', __('SSH2 hostname is required'));\n\t\telse\n\t\t\t$this->options['hostname'] = $opt['hostname'];\n\n\t\t// Check if the options provided are OK.\n\t\tif ( !empty ($opt['public_key']) && !empty ($opt['private_key']) ) {\n\t\t\t$this->options['public_key'] = $opt['public_key'];\n\t\t\t$this->options['private_key'] = $opt['private_key'];\n\n\t\t\t$this->options['hostkey'] = array('hostkey' => 'ssh-rsa');\n\n\t\t\t$this->keys = true;\n\t\t} elseif ( empty ($opt['username']) ) {\n\t\t\t$this->errors->add('empty_username', __('SSH2 username is required'));\n\t\t}\n\n\t\tif ( !empty($opt['username']) )\n\t\t\t$this->options['username'] = $opt['username'];\n\n\t\tif ( empty ($opt['password']) ) {\n\t\t\t// Password can be blank if we are using keys.\n\t\t\tif ( !$this->keys )\n\t\t\t\t$this->errors->add('empty_password', __('SSH2 password is required'));\n\t\t} else {\n\t\t\t$this->options['password'] = $opt['password'];\n\t\t}\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @return bool\n\t */\n\tpublic function connect() {\n\t\tif ( ! $this->keys ) {\n\t\t\t$this->link = @ssh2_connect($this->options['hostname'], $this->options['port']);\n\t\t} else {\n\t\t\t$this->link = @ssh2_connect($this->options['hostname'], $this->options['port'], $this->options['hostkey']);\n\t\t}\n\n\t\tif ( ! $this->link ) {\n\t\t\t$this->errors->add( 'connect',\n\t\t\t\t/* translators: %s: hostname:port */\n\t\t\t\tsprintf( __( 'Failed to connect to SSH2 Server %s' ),\n\t\t\t\t\t$this->options['hostname'] . ':' . $this->options['port']\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !$this->keys ) {\n\t\t\tif ( ! @ssh2_auth_password($this->link, $this->options['username'], $this->options['password']) ) {\n\t\t\t\t$this->errors->add( 'auth',\n\t\t\t\t\t/* translators: %s: username */\n\t\t\t\t\tsprintf( __( 'Username/Password incorrect for %s' ),\n\t\t\t\t\t\t$this->options['username']\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\tif ( ! @ssh2_auth_pubkey_file($this->link, $this->options['username'], $this->options['public_key'], $this->options['private_key'], $this->options['password'] ) ) {\n\t\t\t\t$this->errors->add( 'auth',\n\t\t\t\t\t/* translators: %s: username */\n\t\t\t\t\tsprintf( __( 'Public and Private keys incorrect for %s' ),\n\t\t\t\t\t\t$this->options['username']\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t$this->sftp_link = ssh2_sftp( $this->link );\n\t\tif ( ! $this->sftp_link ) {\n\t\t\t$this->errors->add( 'connect',\n\t\t\t\t/* translators: %s: hostname:port */\n\t\t\t\tsprintf( __( 'Failed to initialize a SFTP subsystem session with the SSH2 Server %s' ),\n\t\t\t\t\t$this->options['hostname'] . ':' . $this->options['port']\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Gets the ssh2.sftp PHP stream wrapper path to open for the given file.\n\t *\n\t * This method also works around a PHP bug where the root directory (/) cannot\n\t * be opened by PHP functions, causing a false failure. In order to work around\n\t * this, the path is converted to /./ which is semantically the same as /\n\t * See https://bugs.php.net/bug.php?id=64169 for more details.\n\t *\n\t * @access public\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $path The File/Directory path on the remote server to return\n\t * @return string The ssh2.sftp:// wrapped path to use.\n\t */\n\tpublic function sftp_path( $path ) {\n\t\tif ( '/' === $path ) {\n\t\t\t$path = '/./';\n\t\t}\n\t\treturn 'ssh2.sftp://' . $this->sftp_link . '/' . ltrim( $path, '/' );\n\t}\n\n\t/**\n\t * @access public\n\t * \n\t * @param string $command\n\t * @param bool $returnbool\n\t * @return bool|string\n\t */\n\tpublic function run_command( $command, $returnbool = false ) {\n\t\tif ( ! $this->link )\n\t\t\treturn false;\n\n\t\tif ( ! ($stream = ssh2_exec($this->link, $command)) ) {\n\t\t\t$this->errors->add( 'command',\n\t\t\t\t/* translators: %s: command */\n\t\t\t\tsprintf( __( 'Unable to perform command: %s'),\n\t\t\t\t\t$command\n\t\t\t\t)\n\t\t\t);\n\t\t} else {\n\t\t\tstream_set_blocking( $stream, true );\n\t\t\tstream_set_timeout( $stream, FS_TIMEOUT );\n\t\t\t$data = stream_get_contents( $stream );\n\t\t\tfclose( $stream );\n\n\t\t\tif ( $returnbool )\n\t\t\t\treturn ( $data === false ) ? false : '' != trim($data);\n\t\t\telse\n\t\t\t\treturn $data;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string|false\n\t */\n\tpublic function get_contents( $file ) {\n\t\treturn file_get_contents( $this->sftp_path( $file ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return array\n\t */\n\tpublic function get_contents_array($file) {\n\t\treturn file( $this->sftp_path( $file ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string   $file\n\t * @param string   $contents\n\t * @param bool|int $mode\n\t * @return bool\n\t */\n\tpublic function put_contents($file, $contents, $mode = false ) {\n\t\t$ret = file_put_contents( $this->sftp_path( $file ), $contents );\n\n\t\tif ( $ret !== strlen( $contents ) )\n\t\t\treturn false;\n\n\t\t$this->chmod($file, $mode);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @return bool\n\t */\n\tpublic function cwd() {\n\t\t$cwd = ssh2_sftp_realpath( $this->sftp_link, '.' );\n\t\tif ( $cwd ) {\n\t\t\t$cwd = trailingslashit( trim( $cwd ) );\n\t\t}\n\t\treturn $cwd;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $dir\n\t * @return bool|string\n\t */\n\tpublic function chdir($dir) {\n\t\treturn $this->run_command('cd ' . $dir, true);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param string $group\n\t * @param bool   $recursive\n\t *\n\t * @return bool\n\t */\n\tpublic function chgrp($file, $group, $recursive = false ) {\n\t\tif ( ! $this->exists($file) )\n\t\t\treturn false;\n\t\tif ( ! $recursive || ! $this->is_dir($file) )\n\t\t\treturn $this->run_command(sprintf('chgrp %s %s', escapeshellarg($group), escapeshellarg($file)), true);\n\t\treturn $this->run_command(sprintf('chgrp -R %s %s', escapeshellarg($group), escapeshellarg($file)), true);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param int    $mode\n\t * @param bool   $recursive\n\t * @return bool|string\n\t */\n\tpublic function chmod($file, $mode = false, $recursive = false) {\n\t\tif ( ! $this->exists($file) )\n\t\t\treturn false;\n\n\t\tif ( ! $mode ) {\n\t\t\tif ( $this->is_file($file) )\n\t\t\t\t$mode = FS_CHMOD_FILE;\n\t\t\telseif ( $this->is_dir($file) )\n\t\t\t\t$mode = FS_CHMOD_DIR;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! $recursive || ! $this->is_dir($file) )\n\t\t\treturn $this->run_command(sprintf('chmod %o %s', $mode, escapeshellarg($file)), true);\n\t\treturn $this->run_command(sprintf('chmod -R %o %s', $mode, escapeshellarg($file)), true);\n\t}\n\n\t/**\n\t * Change the ownership of a file / folder.\n\t *\n\t * @access public\n\t *\n\t * @param string     $file    Path to the file.\n\t * @param string|int $owner   A user name or number.\n\t * @param bool       $recursive Optional. If set True changes file owner recursivly. Defaults to False.\n\t * @return bool|string Returns true on success or false on failure.\n\t */\n\tpublic function chown( $file, $owner, $recursive = false ) {\n\t\tif ( ! $this->exists($file) )\n\t\t\treturn false;\n\t\tif ( ! $recursive || ! $this->is_dir($file) )\n\t\t\treturn $this->run_command(sprintf('chown %s %s', escapeshellarg($owner), escapeshellarg($file)), true);\n\t\treturn $this->run_command(sprintf('chown -R %s %s', escapeshellarg($owner), escapeshellarg($file)), true);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string|false\n\t */\n\tpublic function owner($file) {\n\t\t$owneruid = @fileowner( $this->sftp_path( $file ) );\n\t\tif ( ! $owneruid )\n\t\t\treturn false;\n\t\tif ( ! function_exists('posix_getpwuid') )\n\t\t\treturn $owneruid;\n\t\t$ownerarray = posix_getpwuid($owneruid);\n\t\treturn $ownerarray['name'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string\n\t */\n\tpublic function getchmod($file) {\n\t\treturn substr( decoct( @fileperms( $this->sftp_path( $file ) ) ), -3 );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return string|false\n\t */\n\tpublic function group($file) {\n\t\t$gid = @filegroup( $this->sftp_path( $file ) );\n\t\tif ( ! $gid )\n\t\t\treturn false;\n\t\tif ( ! function_exists('posix_getgrgid') )\n\t\t\treturn $gid;\n\t\t$grouparray = posix_getgrgid($gid);\n\t\treturn $grouparray['name'];\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string   $source\n\t * @param string   $destination\n\t * @param bool     $overwrite\n\t * @param int|bool $mode\n\t * @return bool\n\t */\n\tpublic function copy($source, $destination, $overwrite = false, $mode = false) {\n\t\tif ( ! $overwrite && $this->exists($destination) )\n\t\t\treturn false;\n\t\t$content = $this->get_contents($source);\n\t\tif ( false === $content)\n\t\t\treturn false;\n\t\treturn $this->put_contents($destination, $content, $mode);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $source\n\t * @param string $destination\n\t * @param bool   $overwrite\n\t * @return bool\n\t */\n\tpublic function move($source, $destination, $overwrite = false) {\n\t\treturn @ssh2_sftp_rename( $this->sftp_link, $source, $destination );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string      $file\n\t * @param bool        $recursive\n\t * @param string|bool $type\n\t * @return bool\n\t */\n\tpublic function delete($file, $recursive = false, $type = false) {\n\t\tif ( 'f' == $type || $this->is_file($file) )\n\t\t\treturn ssh2_sftp_unlink($this->sftp_link, $file);\n\t\tif ( ! $recursive )\n\t\t\t return ssh2_sftp_rmdir($this->sftp_link, $file);\n\t\t$filelist = $this->dirlist($file);\n\t\tif ( is_array($filelist) ) {\n\t\t\tforeach ( $filelist as $filename => $fileinfo) {\n\t\t\t\t$this->delete($file . '/' . $filename, $recursive, $fileinfo['type']);\n\t\t\t}\n\t\t}\n\t\treturn ssh2_sftp_rmdir($this->sftp_link, $file);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function exists($file) {\n\t\treturn file_exists( $this->sftp_path( $file ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_file($file) {\n\t\treturn is_file( $this->sftp_path( $file ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @return bool\n\t */\n\tpublic function is_dir($path) {\n\t\treturn is_dir( $this->sftp_path( $path ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_readable($file) {\n\t\treturn is_readable( $this->sftp_path( $file ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return bool\n\t */\n\tpublic function is_writable($file) {\n\t\t// PHP will base it's writable checks on system_user === file_owner, not ssh_user === file_owner\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function atime($file) {\n\t\treturn fileatime( $this->sftp_path( $file ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function mtime($file) {\n\t\treturn filemtime( $this->sftp_path( $file ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @return int\n\t */\n\tpublic function size($file) {\n\t\treturn filesize( $this->sftp_path( $file ) );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $file\n\t * @param int    $time\n\t * @param int    $atime\n\t */\n\tpublic function touch($file, $time = 0, $atime = 0) {\n\t\t//Not implemented.\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param mixed  $chmod\n\t * @param mixed  $chown\n\t * @param mixed  $chgrp\n\t * @return bool\n\t */\n\tpublic function mkdir($path, $chmod = false, $chown = false, $chgrp = false) {\n\t\t$path = untrailingslashit($path);\n\t\tif ( empty($path) )\n\t\t\treturn false;\n\n\t\tif ( ! $chmod )\n\t\t\t$chmod = FS_CHMOD_DIR;\n\t\tif ( ! ssh2_sftp_mkdir($this->sftp_link, $path, $chmod, true) )\n\t\t\treturn false;\n\t\tif ( $chown )\n\t\t\t$this->chown($path, $chown);\n\t\tif ( $chgrp )\n\t\t\t$this->chgrp($path, $chgrp);\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param bool   $recursive\n\t * @return bool\n\t */\n\tpublic function rmdir($path, $recursive = false) {\n\t\treturn $this->delete($path, $recursive);\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @param string $path\n\t * @param bool   $include_hidden\n\t * @param bool   $recursive\n\t * @return bool|array\n\t */\n\tpublic function dirlist($path, $include_hidden = true, $recursive = false) {\n\t\tif ( $this->is_file($path) ) {\n\t\t\t$limit_file = basename($path);\n\t\t\t$path = dirname($path);\n\t\t} else {\n\t\t\t$limit_file = false;\n\t\t}\n\n\t\tif ( ! $this->is_dir($path) )\n\t\t\treturn false;\n\n\t\t$ret = array();\n\t\t$dir = @dir( $this->sftp_path( $path ) );\n\n\t\tif ( ! $dir )\n\t\t\treturn false;\n\n\t\twhile (false !== ($entry = $dir->read()) ) {\n\t\t\t$struc = array();\n\t\t\t$struc['name'] = $entry;\n\n\t\t\tif ( '.' == $struc['name'] || '..' == $struc['name'] )\n\t\t\t\tcontinue; //Do not care about these folders.\n\n\t\t\tif ( ! $include_hidden && '.' == $struc['name'][0] )\n\t\t\t\tcontinue;\n\n\t\t\tif ( $limit_file && $struc['name'] != $limit_file )\n\t\t\t\tcontinue;\n\n\t\t\t$struc['perms'] \t= $this->gethchmod($path.'/'.$entry);\n\t\t\t$struc['permsn']\t= $this->getnumchmodfromh($struc['perms']);\n\t\t\t$struc['number'] \t= false;\n\t\t\t$struc['owner']    \t= $this->owner($path.'/'.$entry);\n\t\t\t$struc['group']    \t= $this->group($path.'/'.$entry);\n\t\t\t$struc['size']    \t= $this->size($path.'/'.$entry);\n\t\t\t$struc['lastmodunix']= $this->mtime($path.'/'.$entry);\n\t\t\t$struc['lastmod']   = date('M j',$struc['lastmodunix']);\n\t\t\t$struc['time']    \t= date('h:i:s',$struc['lastmodunix']);\n\t\t\t$struc['type']\t\t= $this->is_dir($path.'/'.$entry) ? 'd' : 'f';\n\n\t\t\tif ( 'd' == $struc['type'] ) {\n\t\t\t\tif ( $recursive )\n\t\t\t\t\t$struc['files'] = $this->dirlist($path . '/' . $struc['name'], $include_hidden, $recursive);\n\t\t\t\telse\n\t\t\t\t\t$struc['files'] = array();\n\t\t\t}\n\n\t\t\t$ret[ $struc['name'] ] = $struc;\n\t\t}\n\t\t$dir->close();\n\t\tunset($dir);\n\t\treturn $ret;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-importer.php",
    "content": "<?php\n/**\n * WP_Importer base class\n */\nclass WP_Importer {\n\t/**\n\t * Class Constructor\n\t *\n\t */\n\tpublic function __construct() {}\n\n\t/**\n\t * Returns array with imported permalinks from WordPress database\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $importer_name\n\t * @param string $bid\n\t * @return array\n\t */\n\tpublic function get_imported_posts( $importer_name, $bid ) {\n\t\tglobal $wpdb;\n\n\t\t$hashtable = array();\n\n\t\t$limit = 100;\n\t\t$offset = 0;\n\n\t\t// Grab all posts in chunks\n\t\tdo {\n\t\t\t$meta_key = $importer_name . '_' . $bid . '_permalink';\n\t\t\t$sql = $wpdb->prepare( \"SELECT post_id, meta_value FROM $wpdb->postmeta WHERE meta_key = '%s' LIMIT %d,%d\", $meta_key, $offset, $limit );\n\t\t\t$results = $wpdb->get_results( $sql );\n\n\t\t\t// Increment offset\n\t\t\t$offset = ( $limit + $offset );\n\n\t\t\tif ( !empty( $results ) ) {\n\t\t\t\tforeach ( $results as $r ) {\n\t\t\t\t\t// Set permalinks into array\n\t\t\t\t\t$hashtable[$r->meta_value] = intval( $r->post_id );\n\t\t\t\t}\n\t\t\t}\n\t\t} while ( count( $results ) == $limit );\n\n\t\t// Unset to save memory.\n\t\tunset( $results, $r );\n\n\t\treturn $hashtable;\n\t}\n\n\t/**\n\t * Return count of imported permalinks from WordPress database\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $importer_name\n\t * @param string $bid\n\t * @return int\n\t */\n\tpublic function count_imported_posts( $importer_name, $bid ) {\n\t\tglobal $wpdb;\n\n\t\t$count = 0;\n\n\t\t// Get count of permalinks\n\t\t$meta_key = $importer_name . '_' . $bid . '_permalink';\n\t\t$sql = $wpdb->prepare( \"SELECT COUNT( post_id ) AS cnt FROM $wpdb->postmeta WHERE meta_key = '%s'\", $meta_key );\n\n\t\t$result = $wpdb->get_results( $sql );\n\n\t\tif ( !empty( $result ) )\n\t\t\t$count = intval( $result[0]->cnt );\n\n\t\t// Unset to save memory.\n\t\tunset( $results );\n\n\t\treturn $count;\n\t}\n\n\t/**\n\t * Set array with imported comments from WordPress database\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $bid\n\t * @return array\n\t */\n\tpublic function get_imported_comments( $bid ) {\n\t\tglobal $wpdb;\n\n\t\t$hashtable = array();\n\n\t\t$limit = 100;\n\t\t$offset = 0;\n\n\t\t// Grab all comments in chunks\n\t\tdo {\n\t\t\t$sql = $wpdb->prepare( \"SELECT comment_ID, comment_agent FROM $wpdb->comments LIMIT %d,%d\", $offset, $limit );\n\t\t\t$results = $wpdb->get_results( $sql );\n\n\t\t\t// Increment offset\n\t\t\t$offset = ( $limit + $offset );\n\n\t\t\tif ( !empty( $results ) ) {\n\t\t\t\tforeach ( $results as $r ) {\n\t\t\t\t\t// Explode comment_agent key\n\t\t\t\t\tlist ( $ca_bid, $source_comment_id ) = explode( '-', $r->comment_agent );\n\t\t\t\t\t$source_comment_id = intval( $source_comment_id );\n\n\t\t\t\t\t// Check if this comment came from this blog\n\t\t\t\t\tif ( $bid == $ca_bid ) {\n\t\t\t\t\t\t$hashtable[$source_comment_id] = intval( $r->comment_ID );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} while ( count( $results ) == $limit );\n\n\t\t// Unset to save memory.\n\t\tunset( $results, $r );\n\n\t\treturn $hashtable;\n\t}\n\n\t/**\n\t *\n\t * @param int $blog_id\n\t * @return int|void\n\t */\n\tpublic function set_blog( $blog_id ) {\n\t\tif ( is_numeric( $blog_id ) ) {\n\t\t\t$blog_id = (int) $blog_id;\n\t\t} else {\n\t\t\t$blog = 'http://' . preg_replace( '#^https?://#', '', $blog_id );\n\t\t\tif ( ( !$parsed = parse_url( $blog ) ) || empty( $parsed['host'] ) ) {\n\t\t\t\tfwrite( STDERR, \"Error: can not determine blog_id from $blog_id\\n\" );\n\t\t\t\texit();\n\t\t\t}\n\t\t\tif ( empty( $parsed['path'] ) )\n\t\t\t\t$parsed['path'] = '/';\n\t\t\t$blog = get_blog_details( array( 'domain' => $parsed['host'], 'path' => $parsed['path'] ) );\n\t\t\tif ( !$blog ) {\n\t\t\t\tfwrite( STDERR, \"Error: Could not find blog\\n\" );\n\t\t\t\texit();\n\t\t\t}\n\t\t\t$blog_id = (int) $blog->blog_id;\n\t\t}\n\n\t\tif ( function_exists( 'is_multisite' ) ) {\n\t\t\tif ( is_multisite() )\n\t\t\t\tswitch_to_blog( $blog_id );\n\t\t}\n\n\t\treturn $blog_id;\n\t}\n\n\t/**\n\t *\n\t * @param int $user_id\n\t * @return int|void\n\t */\n\tpublic function set_user( $user_id ) {\n\t\tif ( is_numeric( $user_id ) ) {\n\t\t\t$user_id = (int) $user_id;\n\t\t} else {\n\t\t\t$user_id = (int) username_exists( $user_id );\n\t\t}\n\n\t\tif ( !$user_id || !wp_set_current_user( $user_id ) ) {\n\t\t\tfwrite( STDERR, \"Error: can not find user\\n\" );\n\t\t\texit();\n\t\t}\n\n\t\treturn $user_id;\n\t}\n\n\t/**\n\t * Sort by strlen, longest string first\n\t *\n\t * @param string $a\n\t * @param string $b\n\t * @return int\n\t */\n\tpublic function cmpr_strlen( $a, $b ) {\n\t\treturn strlen( $b ) - strlen( $a );\n\t}\n\n\t/**\n\t * GET URL\n\t *\n\t * @param string $url\n\t * @param string $username\n\t * @param string $password\n\t * @param bool   $head\n\t * @return array\n\t */\n\tpublic function get_page( $url, $username = '', $password = '', $head = false ) {\n\t\t// Increase the timeout\n\t\tadd_filter( 'http_request_timeout', array( $this, 'bump_request_timeout' ) );\n\n\t\t$headers = array();\n\t\t$args = array();\n\t\tif ( true === $head )\n\t\t\t$args['method'] = 'HEAD';\n\t\tif ( !empty( $username ) && !empty( $password ) )\n\t\t\t$headers['Authorization'] = 'Basic ' . base64_encode( \"$username:$password\" );\n\n\t\t$args['headers'] = $headers;\n\n\t\treturn wp_safe_remote_request( $url, $args );\n\t}\n\n\t/**\n\t * Bump up the request timeout for http requests\n\t *\n\t * @param int $val\n\t * @return int\n\t */\n\tpublic function bump_request_timeout( $val ) {\n\t\treturn 60;\n\t}\n\n\t/**\n\t * Check if user has exceeded disk quota\n\t *\n\t * @return bool\n\t */\n\tpublic function is_user_over_quota() {\n\t\tif ( function_exists( 'upload_is_user_over_quota' ) ) {\n\t\t\tif ( upload_is_user_over_quota() ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Replace newlines, tabs, and multiple spaces with a single space\n\t *\n\t * @param string $string\n\t * @return string\n\t */\n\tpublic function min_whitespace( $string ) {\n\t\treturn preg_replace( '|[\\r\\n\\t ]+|', ' ', $string );\n\t}\n\n\t/**\n\t * Reset global variables that grow out of control during imports\n\t *\n\t * @global wpdb  $wpdb\n\t * @global array $wp_actions\n\t */\n\tpublic function stop_the_insanity() {\n\t\tglobal $wpdb, $wp_actions;\n\t\t// Or define( 'WP_IMPORTING', true );\n\t\t$wpdb->queries = array();\n\t\t// Reset $wp_actions to keep it from growing out of control\n\t\t$wp_actions = array();\n\t}\n}\n\n/**\n * Returns value of command line params.\n * Exits when a required param is not set.\n *\n * @param string $param\n * @param bool   $required\n * @return mixed\n */\nfunction get_cli_args( $param, $required = false ) {\n\t$args = $_SERVER['argv'];\n\n\t$out = array();\n\n\t$last_arg = null;\n\t$return = null;\n\n\t$il = sizeof( $args );\n\n\tfor ( $i = 1, $il; $i < $il; $i++ ) {\n\t\tif ( (bool) preg_match( \"/^--(.+)/\", $args[$i], $match ) ) {\n\t\t\t$parts = explode( \"=\", $match[1] );\n\t\t\t$key = preg_replace( \"/[^a-z0-9]+/\", \"\", $parts[0] );\n\n\t\t\tif ( isset( $parts[1] ) ) {\n\t\t\t\t$out[$key] = $parts[1];\n\t\t\t} else {\n\t\t\t\t$out[$key] = true;\n\t\t\t}\n\n\t\t\t$last_arg = $key;\n\t\t} elseif ( (bool) preg_match( \"/^-([a-zA-Z0-9]+)/\", $args[$i], $match ) ) {\n\t\t\tfor ( $j = 0, $jl = strlen( $match[1] ); $j < $jl; $j++ ) {\n\t\t\t\t$key = $match[1]{$j};\n\t\t\t\t$out[$key] = true;\n\t\t\t}\n\n\t\t\t$last_arg = $key;\n\t\t} elseif ( $last_arg !== null ) {\n\t\t\t$out[$last_arg] = $args[$i];\n\t\t}\n\t}\n\n\t// Check array for specified param\n\tif ( isset( $out[$param] ) ) {\n\t\t// Set return value\n\t\t$return = $out[$param];\n\t}\n\n\t// Check for missing required param\n\tif ( !isset( $out[$param] ) && $required ) {\n\t\t// Display message and exit\n\t\techo \"\\\"$param\\\" parameter is required but was not specified\\n\";\n\t\texit();\n\t}\n\n\treturn $return;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-internal-pointers.php",
    "content": "<?php\n/**\n * Administration API: WP_Internal_Pointers class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement an internal admin pointers API.\n *\n * @since 3.3.0\n */\nfinal class WP_Internal_Pointers {\n\t/**\n\t * Initializes the new feature pointers.\n\t *\n\t * @since 3.3.0\n\t *\n\t * All pointers can be disabled using the following:\n\t *     remove_action( 'admin_enqueue_scripts', array( 'WP_Internal_Pointers', 'enqueue_scripts' ) );\n\t *\n\t * Individual pointers (e.g. wp390_widgets) can be disabled using the following:\n\t *     remove_action( 'admin_print_footer_scripts', array( 'WP_Internal_Pointers', 'pointer_wp390_widgets' ) );\n\t *\n\t * @static\n\t *\n\t * @param string $hook_suffix The current admin page.\n\t */\n\tpublic static function enqueue_scripts( $hook_suffix ) {\n\t\t/*\n\t\t * Register feature pointers\n\t\t *\n\t\t * Format:\n\t\t *     array(\n\t\t *         hook_suffix => pointer callback\n\t\t *     )\n\t\t *\n\t\t * Example:\n\t\t *     array(\n\t\t *         'themes.php' => 'wp390_widgets'\n\t\t *     )\n\t\t */\n\t\t$registered_pointers = array(\n\t\t\t// None currently\n\t\t);\n\n\t\t// Check if screen related pointer is registered\n\t\tif ( empty( $registered_pointers[ $hook_suffix ] ) )\n\t\t\treturn;\n\n\t\t$pointers = (array) $registered_pointers[ $hook_suffix ];\n\n\t\t/*\n\t\t * Specify required capabilities for feature pointers\n\t\t *\n\t\t * Format:\n\t\t *     array(\n\t\t *         pointer callback => Array of required capabilities\n\t\t *     )\n\t\t *\n\t\t * Example:\n\t\t *     array(\n\t\t *         'wp390_widgets' => array( 'edit_theme_options' )\n\t\t *     )\n\t\t */\n\t\t$caps_required = array(\n\t\t\t// None currently\n\t\t);\n\n\t\t// Get dismissed pointers\n\t\t$dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );\n\n\t\t$got_pointers = false;\n\t\tforeach ( array_diff( $pointers, $dismissed ) as $pointer ) {\n\t\t\tif ( isset( $caps_required[ $pointer ] ) ) {\n\t\t\t\tforeach ( $caps_required[ $pointer ] as $cap ) {\n\t\t\t\t\tif ( ! current_user_can( $cap ) )\n\t\t\t\t\t\tcontinue 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Bind pointer print function\n\t\t\tadd_action( 'admin_print_footer_scripts', array( 'WP_Internal_Pointers', 'pointer_' . $pointer ) );\n\t\t\t$got_pointers = true;\n\t\t}\n\n\t\tif ( ! $got_pointers )\n\t\t\treturn;\n\n\t\t// Add pointers script and style to queue\n\t\twp_enqueue_style( 'wp-pointer' );\n\t\twp_enqueue_script( 'wp-pointer' );\n\t}\n\n\t/**\n\t * Print the pointer JavaScript data.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @static\n\t *\n\t * @param string $pointer_id The pointer ID.\n\t * @param string $selector The HTML elements, on which the pointer should be attached.\n\t * @param array  $args Arguments to be passed to the pointer JS (see wp-pointer.js).\n\t */\n\tprivate static function print_js( $pointer_id, $selector, $args ) {\n\t\tif ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) )\n\t\t\treturn;\n\n\t\t?>\n\t\t<script type=\"text/javascript\">\n\t\t(function($){\n\t\t\tvar options = <?php echo wp_json_encode( $args ); ?>, setup;\n\n\t\t\tif ( ! options )\n\t\t\t\treturn;\n\n\t\t\toptions = $.extend( options, {\n\t\t\t\tclose: function() {\n\t\t\t\t\t$.post( ajaxurl, {\n\t\t\t\t\t\tpointer: '<?php echo $pointer_id; ?>',\n\t\t\t\t\t\taction: 'dismiss-wp-pointer'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsetup = function() {\n\t\t\t\t$('<?php echo $selector; ?>').first().pointer( options ).pointer('open');\n\t\t\t};\n\n\t\t\tif ( options.position && options.position.defer_loading )\n\t\t\t\t$(window).bind( 'load.wp-pointers', setup );\n\t\t\telse\n\t\t\t\t$(document).ready( setup );\n\n\t\t})( jQuery );\n\t\t</script>\n\t\t<?php\n\t}\n\n\tpublic static function pointer_wp330_toolbar() {}\n\tpublic static function pointer_wp330_media_uploader() {}\n\tpublic static function pointer_wp330_saving_widgets() {}\n\tpublic static function pointer_wp340_customize_current_theme_link() {}\n\tpublic static function pointer_wp340_choose_image_from_library() {}\n\tpublic static function pointer_wp350_media() {}\n\tpublic static function pointer_wp360_revisions() {}\n\tpublic static function pointer_wp360_locks() {}\n\tpublic static function pointer_wp390_widgets() {}\n\tpublic static function pointer_wp410_dfw() {}\n\n\t/**\n\t * Prevents new users from seeing existing 'new feature' pointers.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @static\n\t *\n\t * @param int $user_id User ID.\n\t */\n\tpublic static function dismiss_pointers_for_new_users( $user_id ) {\n\t\tadd_user_meta( $user_id, 'dismissed_wp_pointers', '' );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-links-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Links_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying links in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Tsble\n */\nclass WP_Links_List_Table extends WP_List_Table {\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\tparent::__construct( array(\n\t\t\t'plural' => 'bookmarks',\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can( 'manage_links' );\n\t}\n\n\t/**\n\t *\n\t * @global int    $cat_id\n\t * @global string $s\n\t * @global string $orderby\n\t * @global string $order\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $cat_id, $s, $orderby, $order;\n\n\t\twp_reset_vars( array( 'action', 'cat_id', 'link_id', 'orderby', 'order', 's' ) );\n\n\t\t$args = array( 'hide_invisible' => 0, 'hide_empty' => 0 );\n\n\t\tif ( 'all' != $cat_id )\n\t\t\t$args['category'] = $cat_id;\n\t\tif ( !empty( $s ) )\n\t\t\t$args['search'] = $s;\n\t\tif ( !empty( $orderby ) )\n\t\t\t$args['orderby'] = $orderby;\n\t\tif ( !empty( $order ) )\n\t\t\t$args['order'] = $order;\n\n\t\t$this->items = get_bookmarks( $args );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\t_e( 'No links found.' );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\t$actions = array();\n\t\t$actions['delete'] = __( 'Delete' );\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t *\n\t * @global int $cat_id\n\t * @param string $which\n\t */\n\tprotected function extra_tablenav( $which ) {\n\t\tglobal $cat_id;\n\n\t\tif ( 'top' != $which )\n\t\t\treturn;\n?>\n\t\t<div class=\"alignleft actions\">\n<?php\n\t\t\t$dropdown_options = array(\n\t\t\t\t'selected' => $cat_id,\n\t\t\t\t'name' => 'cat_id',\n\t\t\t\t'taxonomy' => 'link_category',\n\t\t\t\t'show_option_all' => __( 'All categories' ),\n\t\t\t\t'hide_empty' => true,\n\t\t\t\t'hierarchical' => 1,\n\t\t\t\t'show_count' => 0,\n\t\t\t\t'orderby' => 'name',\n\t\t\t);\n\n\t\t\techo '<label class=\"screen-reader-text\" for=\"cat_id\">' . __( 'Filter by category' ) . '</label>';\n\t\t\twp_dropdown_categories( $dropdown_options );\n\t\t\tsubmit_button( __( 'Filter' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) );\n?>\n\t\t</div>\n<?php\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\treturn array(\n\t\t\t'cb'         => '<input type=\"checkbox\" />',\n\t\t\t'name'       => _x( 'Name', 'link name' ),\n\t\t\t'url'        => __( 'URL' ),\n\t\t\t'categories' => __( 'Categories' ),\n\t\t\t'rel'        => __( 'Relationship' ),\n\t\t\t'visible'    => __( 'Visible' ),\n\t\t\t'rating'     => __( 'Rating' )\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array(\n\t\t\t'name'    => 'name',\n\t\t\t'url'     => 'url',\n\t\t\t'visible' => 'visible',\n\t\t\t'rating'  => 'rating'\n\t\t);\n\t}\n\n\t/**\n\t * Get the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, 'name'.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\treturn 'name';\n\t}\n\n\t/**\n\t * Handles the checkbox column ouput.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param object $link The current link object.\n\t */\n\tpublic function column_cb( $link ) {\n\t\t?>\n\t\t<label class=\"screen-reader-text\" for=\"cb-select-<?php echo $link->link_id; ?>\"><?php echo sprintf( __( 'Select %s' ), $link->link_name ); ?></label>\n\t\t<input type=\"checkbox\" name=\"linkcheck[]\" id=\"cb-select-<?php echo $link->link_id; ?>\" value=\"<?php echo esc_attr( $link->link_id ); ?>\" />\n\t\t<?php\n\t}\n\n\t/**\n\t * Handles the link name column ouput.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param object $link The current link object.\n\t */\n\tpublic function column_name( $link ) {\n\t\t$edit_link = get_edit_bookmark_link( $link );\n\t\t?>\n\t\t<strong><a class=\"row-title\" href=\"<?php echo $edit_link ?>\" title=\"<?php\n\t\t\techo esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $link->link_name ) );\n\t\t?>\"><?php echo $link->link_name ?></a></strong><br />\n\t\t<?php\n\t}\n\n\t/**\n\t * Handles the link URL column ouput.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param object $link The current link object.\n\t */\n\tpublic function column_url( $link ) {\n\t\t$short_url = url_shorten( $link->link_url );\n\t\techo \"<a href='$link->link_url' title='\". esc_attr( sprintf( __( 'Visit %s' ), $link->link_name ) ).\"'>$short_url</a>\";\n\t}\n\n\t/**\n\t * Handles the link categories column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @global $cat_id\n\t *\n\t * @param object $link The current link object.\n\t */\n\tpublic function column_categories( $link ) {\n\t\tglobal $cat_id;\n\n\t\t$cat_names = array();\n\t\tforeach ( $link->link_category as $category ) {\n\t\t\t$cat = get_term( $category, 'link_category', OBJECT, 'display' );\n\t\t\tif ( is_wp_error( $cat ) ) {\n\t\t\t\techo $cat->get_error_message();\n\t\t\t}\n\t\t\t$cat_name = $cat->name;\n\t\t\tif ( $cat_id != $category ) {\n\t\t\t\t$cat_name = \"<a href='link-manager.php?cat_id=$category'>$cat_name</a>\";\n\t\t\t}\n\t\t\t$cat_names[] = $cat_name;\n\t\t}\n\t\techo implode( ', ', $cat_names );\n\t}\n\n\t/**\n\t * Handles the link relation column ouput.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param object $link The current link object.\n\t */\n\tpublic function column_rel( $link ) {\n\t\techo empty( $link->link_rel ) ? '<br />' : $link->link_rel;\n\t}\n\n\t/**\n\t * Handles the link visibility column ouput.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param object $link The current link object.\n\t */\n\tpublic function column_visible( $link ) {\n\t\tif ( 'Y' === $link->link_visible ) {\n\t\t\t_e( 'Yes' );\n\t\t} else {\n\t\t\t_e( 'No' );\n\t\t}\n\t}\n\n\t/**\n\t * Handles the link rating column ouput.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param object $link The current link object.\n\t */\n\tpublic function column_rating( $link ) {\n\t\techo $link->link_rating;\n\t}\n\n\t/**\n\t * Handles the default column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param object $link        Link object.\n\t * @param string $column_name Current column name.\n\t */\n\tpublic function column_default( $link, $column_name ) {\n\t\t/**\n\t\t * Fires for each registered custom link column.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $column_name Name of the custom column.\n\t\t * @param int    $link_id     Link ID.\n\t\t */\n\t\tdo_action( 'manage_link_custom_column', $column_name, $link->link_id );\n\t}\n\n\tpublic function display_rows() {\n\t\tforeach ( $this->items as $link ) {\n\t\t\t$link = sanitize_bookmark( $link );\n\t\t\t$link->link_name = esc_attr( $link->link_name );\n\t\t\t$link->link_category = wp_get_link_cats( $link->link_id );\n?>\n\t\t<tr id=\"link-<?php echo $link->link_id; ?>\">\n\t\t\t<?php $this->single_row_columns( $link ) ?>\n\t\t</tr>\n<?php\n\t\t}\n\t}\n\n\t/**\n\t * Generates and displays row action links.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param object $link        Link being acted upon.\n\t * @param string $column_name Current column name.\n\t * @param string $primary     Primary column name.\n\t * @return string Row action output for links.\n\t */\n\tprotected function handle_row_actions( $link, $column_name, $primary ) {\n\t\tif ( $primary !== $column_name ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t$edit_link = get_edit_bookmark_link( $link );\n\n\t\t$actions = array();\n\t\t$actions['edit'] = '<a href=\"' . $edit_link . '\">' . __('Edit') . '</a>';\n\t\t$actions['delete'] = \"<a class='submitdelete' href='\" . wp_nonce_url(\"link.php?action=delete&amp;link_id=$link->link_id\", 'delete-bookmark_' . $link->link_id) . \"' onclick=\\\"if ( confirm( '\" . esc_js(sprintf(__(\"You are about to delete this link '%s'\\n  'Cancel' to stop, 'OK' to delete.\"), $link->link_name)) . \"' ) ) { return true;}return false;\\\">\" . __('Delete') . \"</a>\";\n\t\treturn $this->row_actions( $actions );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-list-table.php",
    "content": "<?php\n/**\n * Administration API: WP_List_Table class\n *\n * @package WordPress\n * @subpackage List_Table\n * @since 3.1.0\n */\n\n/**\n * Base class for displaying a list of items in an ajaxified HTML table.\n *\n * @since 3.1.0\n * @access private\n */\nclass WP_List_Table {\n\n\t/**\n\t * The current list of items.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $items;\n\n\t/**\n\t * Various information about the current table.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $_args;\n\n\t/**\n\t * Various information needed for displaying the pagination.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $_pagination_args = array();\n\n\t/**\n\t * The current screen.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t * @var object\n\t */\n\tprotected $screen;\n\n\t/**\n\t * Cached bulk actions.\n\t *\n\t * @since 3.1.0\n\t * @access private\n\t * @var array\n\t */\n\tprivate $_actions;\n\n\t/**\n\t * Cached pagination output.\n\t *\n\t * @since 3.1.0\n\t * @access private\n\t * @var string\n\t */\n\tprivate $_pagination;\n\n\t/**\n\t * The view switcher modes.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $modes = array();\n\n\t/**\n\t * Stores the value returned by ->get_column_info().\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $_column_headers;\n\n\t/**\n\t * {@internal Missing Summary}\n\t *\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $compat_fields = array( '_args', '_pagination_args', 'screen', '_actions', '_pagination' );\n\n\t/**\n\t * {@internal Missing Summary}\n\t *\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $compat_methods = array( 'set_pagination_args', 'get_views', 'get_bulk_actions', 'bulk_actions',\n\t\t'row_actions', 'months_dropdown', 'view_switcher', 'comments_bubble', 'get_items_per_page', 'pagination',\n\t\t'get_sortable_columns', 'get_column_info', 'get_table_classes', 'display_tablenav', 'extra_tablenav',\n\t\t'single_row_columns' );\n\n\t/**\n\t * Constructor.\n\t *\n\t * The child class should call this constructor from its own constructor to override\n\t * the default $args.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @param array|string $args {\n\t *     Array or string of arguments.\n\t *\n\t *     @type string $plural   Plural value used for labels and the objects being listed.\n\t *                            This affects things such as CSS class-names and nonces used\n\t *                            in the list table, e.g. 'posts'. Default empty.\n\t *     @type string $singular Singular label for an object being listed, e.g. 'post'.\n\t *                            Default empty\n\t *     @type bool   $ajax     Whether the list table supports AJAX. This includes loading\n\t *                            and sorting data, for example. If true, the class will call\n\t *                            the {@see _js_vars()} method in the footer to provide variables\n\t *                            to any scripts handling AJAX events. Default false.\n\t *     @type string $screen   String containing the hook name used to determine the current\n\t *                            screen. If left null, the current screen will be automatically set.\n\t *                            Default null.\n\t * }\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\t$args = wp_parse_args( $args, array(\n\t\t\t'plural' => '',\n\t\t\t'singular' => '',\n\t\t\t'ajax' => false,\n\t\t\t'screen' => null,\n\t\t) );\n\n\t\t$this->screen = convert_to_screen( $args['screen'] );\n\n\t\tadd_filter( \"manage_{$this->screen->id}_columns\", array( $this, 'get_columns' ), 0 );\n\n\t\tif ( !$args['plural'] )\n\t\t\t$args['plural'] = $this->screen->base;\n\n\t\t$args['plural'] = sanitize_key( $args['plural'] );\n\t\t$args['singular'] = sanitize_key( $args['singular'] );\n\n\t\t$this->_args = $args;\n\n\t\tif ( $args['ajax'] ) {\n\t\t\t// wp_enqueue_script( 'list-table' );\n\t\t\tadd_action( 'admin_footer', array( $this, '_js_vars' ) );\n\t\t}\n\n\t\tif ( empty( $this->modes ) ) {\n\t\t\t$this->modes = array(\n\t\t\t\t'list'    => __( 'List View' ),\n\t\t\t\t'excerpt' => __( 'Excerpt View' )\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to get.\n\t * @return mixed Property.\n\t */\n\tpublic function __get( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn $this->$name;\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties settable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name  Property to check if set.\n\t * @param mixed  $value Property value.\n\t * @return mixed Newly-set property.\n\t */\n\tpublic function __set( $name, $value ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn $this->$name = $value;\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties checkable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to check if set.\n\t * @return bool Whether the property is set.\n\t */\n\tpublic function __isset( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn isset( $this->$name );\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties un-settable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to unset.\n\t */\n\tpublic function __unset( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\tunset( $this->$name );\n\t\t}\n\t}\n\n\t/**\n\t * Make private/protected methods readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param callable $name      Method to call.\n\t * @param array    $arguments Arguments to pass when calling.\n\t * @return mixed|bool Return value of the callback, false otherwise.\n\t */\n\tpublic function __call( $name, $arguments ) {\n\t\tif ( in_array( $name, $this->compat_methods ) ) {\n\t\t\treturn call_user_func_array( array( $this, $name ), $arguments );\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Checks the current user's permissions\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @abstract\n\t */\n\tpublic function ajax_user_can() {\n\t\tdie( 'function WP_List_Table::ajax_user_can() must be over-ridden in a sub-class.' );\n\t}\n\n\t/**\n\t * Prepares the list of items for displaying.\n\t * @uses WP_List_Table::set_pagination_args()\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @abstract\n\t */\n\tpublic function prepare_items() {\n\t\tdie( 'function WP_List_Table::prepare_items() must be over-ridden in a sub-class.' );\n\t}\n\n\t/**\n\t * An internal method that sets all the necessary pagination arguments\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param array|string $args Array or string of arguments with information about the pagination.\n\t */\n\tprotected function set_pagination_args( $args ) {\n\t\t$args = wp_parse_args( $args, array(\n\t\t\t'total_items' => 0,\n\t\t\t'total_pages' => 0,\n\t\t\t'per_page' => 0,\n\t\t) );\n\n\t\tif ( !$args['total_pages'] && $args['per_page'] > 0 )\n\t\t\t$args['total_pages'] = ceil( $args['total_items'] / $args['per_page'] );\n\n\t\t// Redirect if page number is invalid and headers are not already sent.\n\t\tif ( ! headers_sent() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) && $args['total_pages'] > 0 && $this->get_pagenum() > $args['total_pages'] ) {\n\t\t\twp_redirect( add_query_arg( 'paged', $args['total_pages'] ) );\n\t\t\texit;\n\t\t}\n\n\t\t$this->_pagination_args = $args;\n\t}\n\n\t/**\n\t * Access the pagination args.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @param string $key Pagination argument to retrieve. Common values include 'total_items',\n\t *                    'total_pages', 'per_page', or 'infinite_scroll'.\n\t * @return int Number of items that correspond to the given pagination argument.\n\t */\n\tpublic function get_pagination_arg( $key ) {\n\t\tif ( 'page' === $key ) {\n\t\t\treturn $this->get_pagenum();\n\t\t}\n\n\t\tif ( isset( $this->_pagination_args[$key] ) ) {\n\t\t\treturn $this->_pagination_args[$key];\n\t\t}\n\t}\n\n\t/**\n\t * Whether the table has items to display or not\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @return bool\n\t */\n\tpublic function has_items() {\n\t\treturn !empty( $this->items );\n\t}\n\n\t/**\n\t * Message to be displayed when there are no items\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\t_e( 'No items found.' );\n\t}\n\n\t/**\n\t * Display the search box.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @param string $text The search button text\n\t * @param string $input_id The search input id\n\t */\n\tpublic function search_box( $text, $input_id ) {\n\t\tif ( empty( $_REQUEST['s'] ) && !$this->has_items() )\n\t\t\treturn;\n\n\t\t$input_id = $input_id . '-search-input';\n\n\t\tif ( ! empty( $_REQUEST['orderby'] ) )\n\t\t\techo '<input type=\"hidden\" name=\"orderby\" value=\"' . esc_attr( $_REQUEST['orderby'] ) . '\" />';\n\t\tif ( ! empty( $_REQUEST['order'] ) )\n\t\t\techo '<input type=\"hidden\" name=\"order\" value=\"' . esc_attr( $_REQUEST['order'] ) . '\" />';\n\t\tif ( ! empty( $_REQUEST['post_mime_type'] ) )\n\t\t\techo '<input type=\"hidden\" name=\"post_mime_type\" value=\"' . esc_attr( $_REQUEST['post_mime_type'] ) . '\" />';\n\t\tif ( ! empty( $_REQUEST['detached'] ) )\n\t\t\techo '<input type=\"hidden\" name=\"detached\" value=\"' . esc_attr( $_REQUEST['detached'] ) . '\" />';\n?>\n<p class=\"search-box\">\n\t<label class=\"screen-reader-text\" for=\"<?php echo $input_id ?>\"><?php echo $text; ?>:</label>\n\t<input type=\"search\" id=\"<?php echo $input_id ?>\" name=\"s\" value=\"<?php _admin_search_query(); ?>\" />\n\t<?php submit_button( $text, 'button', '', false, array('id' => 'search-submit') ); ?>\n</p>\n<?php\n\t}\n\n\t/**\n\t * Get an associative array ( id => link ) with the list\n\t * of views available on this table.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @return array\n\t */\n\tprotected function get_views() {\n\t\treturn array();\n\t}\n\n\t/**\n\t * Display the list of views available on this table.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t */\n\tpublic function views() {\n\t\t$views = $this->get_views();\n\t\t/**\n\t\t * Filter the list of available list table views.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$this->screen->id`, refers\n\t\t * to the ID of the current screen, usually a string.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param array $views An array of available list table views.\n\t\t */\n\t\t$views = apply_filters( \"views_{$this->screen->id}\", $views );\n\n\t\tif ( empty( $views ) )\n\t\t\treturn;\n\n\t\t$this->screen->render_screen_reader_content( 'heading_views' );\n\n\t\techo \"<ul class='subsubsub'>\\n\";\n\t\tforeach ( $views as $class => $view ) {\n\t\t\t$views[ $class ] = \"\\t<li class='$class'>$view\";\n\t\t}\n\t\techo implode( \" |</li>\\n\", $views ) . \"</li>\\n\";\n\t\techo \"</ul>\";\n\t}\n\n\t/**\n\t * Get an associative array ( option_name => option_title ) with the list\n\t * of bulk actions available on this table.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\treturn array();\n\t}\n\n\t/**\n\t * Display the bulk actions dropdown.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param string $which The location of the bulk actions: 'top' or 'bottom'.\n\t *                      This is designated as optional for backwards-compatibility.\n\t */\n\tprotected function bulk_actions( $which = '' ) {\n\t\tif ( is_null( $this->_actions ) ) {\n\t\t\t$no_new_actions = $this->_actions = $this->get_bulk_actions();\n\t\t\t/**\n\t\t\t * Filter the list table Bulk Actions drop-down.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$this->screen->id`, refers\n\t\t\t * to the ID of the current screen, usually a string.\n\t\t\t *\n\t\t\t * This filter can currently only be used to remove bulk actions.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param array $actions An array of the available bulk actions.\n\t\t\t */\n\t\t\t$this->_actions = apply_filters( \"bulk_actions-{$this->screen->id}\", $this->_actions );\n\t\t\t$this->_actions = array_intersect_assoc( $this->_actions, $no_new_actions );\n\t\t\t$two = '';\n\t\t} else {\n\t\t\t$two = '2';\n\t\t}\n\n\t\tif ( empty( $this->_actions ) )\n\t\t\treturn;\n\n\t\techo '<label for=\"bulk-action-selector-' . esc_attr( $which ) . '\" class=\"screen-reader-text\">' . __( 'Select bulk action' ) . '</label>';\n\t\techo '<select name=\"action' . $two . '\" id=\"bulk-action-selector-' . esc_attr( $which ) . \"\\\">\\n\";\n\t\techo '<option value=\"-1\">' . __( 'Bulk Actions' ) . \"</option>\\n\";\n\n\t\tforeach ( $this->_actions as $name => $title ) {\n\t\t\t$class = 'edit' === $name ? ' class=\"hide-if-no-js\"' : '';\n\n\t\t\techo \"\\t\" . '<option value=\"' . $name . '\"' . $class . '>' . $title . \"</option>\\n\";\n\t\t}\n\n\t\techo \"</select>\\n\";\n\n\t\tsubmit_button( __( 'Apply' ), 'action', '', false, array( 'id' => \"doaction$two\" ) );\n\t\techo \"\\n\";\n\t}\n\n\t/**\n\t * Get the current action selected from the bulk actions dropdown.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @return string|false The action name or False if no action was selected\n\t */\n\tpublic function current_action() {\n\t\tif ( isset( $_REQUEST['filter_action'] ) && ! empty( $_REQUEST['filter_action'] ) )\n\t\t\treturn false;\n\n\t\tif ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] )\n\t\t\treturn $_REQUEST['action'];\n\n\t\tif ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] )\n\t\t\treturn $_REQUEST['action2'];\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Generate row actions div\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param array $actions The list of actions\n\t * @param bool $always_visible Whether the actions should be always visible\n\t * @return string\n\t */\n\tprotected function row_actions( $actions, $always_visible = false ) {\n\t\t$action_count = count( $actions );\n\t\t$i = 0;\n\n\t\tif ( !$action_count )\n\t\t\treturn '';\n\n\t\t$out = '<div class=\"' . ( $always_visible ? 'row-actions visible' : 'row-actions' ) . '\">';\n\t\tforeach ( $actions as $action => $link ) {\n\t\t\t++$i;\n\t\t\t( $i == $action_count ) ? $sep = '' : $sep = ' | ';\n\t\t\t$out .= \"<span class='$action'>$link$sep</span>\";\n\t\t}\n\t\t$out .= '</div>';\n\n\t\t$out .= '<button type=\"button\" class=\"toggle-row\"><span class=\"screen-reader-text\">' . __( 'Show more details' ) . '</span></button>';\n\n\t\treturn $out;\n\t}\n\n\t/**\n\t * Display a monthly dropdown for filtering items\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @global wpdb      $wpdb\n\t * @global WP_Locale $wp_locale\n\t *\n\t * @param string $post_type\n\t */\n\tprotected function months_dropdown( $post_type ) {\n\t\tglobal $wpdb, $wp_locale;\n\n\t\t/**\n\t\t * Filter whether to remove the 'Months' drop-down from the post list table.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param bool   $disable   Whether to disable the drop-down. Default false.\n\t\t * @param string $post_type The post type.\n\t\t */\n\t\tif ( apply_filters( 'disable_months_dropdown', false, $post_type ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$extra_checks = \"AND post_status != 'auto-draft'\";\n\t\tif ( ! isset( $_GET['post_status'] ) || 'trash' !== $_GET['post_status'] ) {\n\t\t\t$extra_checks .= \" AND post_status != 'trash'\";\n\t\t} elseif ( isset( $_GET['post_status'] ) ) {\n\t\t\t$extra_checks = $wpdb->prepare( ' AND post_status = %s', $_GET['post_status'] );\n\t\t}\n\n\t\t$months = $wpdb->get_results( $wpdb->prepare( \"\n\t\t\tSELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month\n\t\t\tFROM $wpdb->posts\n\t\t\tWHERE post_type = %s\n\t\t\t$extra_checks\n\t\t\tORDER BY post_date DESC\n\t\t\", $post_type ) );\n\n\t\t/**\n\t\t * Filter the 'Months' drop-down results.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param object $months    The months drop-down query results.\n\t\t * @param string $post_type The post type.\n\t\t */\n\t\t$months = apply_filters( 'months_dropdown_results', $months, $post_type );\n\n\t\t$month_count = count( $months );\n\n\t\tif ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) )\n\t\t\treturn;\n\n\t\t$m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;\n?>\n\t\t<label for=\"filter-by-date\" class=\"screen-reader-text\"><?php _e( 'Filter by date' ); ?></label>\n\t\t<select name=\"m\" id=\"filter-by-date\">\n\t\t\t<option<?php selected( $m, 0 ); ?> value=\"0\"><?php _e( 'All dates' ); ?></option>\n<?php\n\t\tforeach ( $months as $arc_row ) {\n\t\t\tif ( 0 == $arc_row->year )\n\t\t\t\tcontinue;\n\n\t\t\t$month = zeroise( $arc_row->month, 2 );\n\t\t\t$year = $arc_row->year;\n\n\t\t\tprintf( \"<option %s value='%s'>%s</option>\\n\",\n\t\t\t\tselected( $m, $year . $month, false ),\n\t\t\t\tesc_attr( $arc_row->year . $month ),\n\t\t\t\t/* translators: 1: month name, 2: 4-digit year */\n\t\t\t\tsprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )\n\t\t\t);\n\t\t}\n?>\n\t\t</select>\n<?php\n\t}\n\n\t/**\n\t * Display a view switcher\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param string $current_mode\n\t */\n\tprotected function view_switcher( $current_mode ) {\n?>\n\t\t<input type=\"hidden\" name=\"mode\" value=\"<?php echo esc_attr( $current_mode ); ?>\" />\n\t\t<div class=\"view-switch\">\n<?php\n\t\t\tforeach ( $this->modes as $mode => $title ) {\n\t\t\t\t$classes = array( 'view-' . $mode );\n\t\t\t\tif ( $current_mode === $mode )\n\t\t\t\t\t$classes[] = 'current';\n\t\t\t\tprintf(\n\t\t\t\t\t\"<a href='%s' class='%s' id='view-switch-$mode'><span class='screen-reader-text'>%s</span></a>\\n\",\n\t\t\t\t\tesc_url( add_query_arg( 'mode', $mode ) ),\n\t\t\t\t\timplode( ' ', $classes ),\n\t\t\t\t\t$title\n\t\t\t\t);\n\t\t\t}\n\t\t?>\n\t\t</div>\n<?php\n\t}\n\n\t/**\n\t * Display a comment count bubble\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param int $post_id          The post ID.\n\t * @param int $pending_comments Number of pending comments.\n\t */\n\tprotected function comments_bubble( $post_id, $pending_comments ) {\n\t\t$approved_comments = get_comments_number();\n\n\t\t$approved_comments_number = number_format_i18n( $approved_comments );\n\t\t$pending_comments_number = number_format_i18n( $pending_comments );\n\n\t\t$approved_only_phrase = sprintf( _n( '%s comment', '%s comments', $approved_comments ), $approved_comments_number );\n\t\t$approved_phrase = sprintf( _n( '%s approved comment', '%s approved comments', $approved_comments ), $approved_comments_number );\n\t\t$pending_phrase = sprintf( _n( '%s pending comment', '%s pending comments', $pending_comments ), $pending_comments_number );\n\n\t\t// No comments at all.\n\t\tif ( ! $approved_comments && ! $pending_comments ) {\n\t\t\tprintf( '<span aria-hidden=\"true\">—</span><span class=\"screen-reader-text\">%s</span>',\n\t\t\t\t__( 'No comments' )\n\t\t\t);\n\t\t// Approved comments have different display depending on some conditions.\n\t\t} elseif ( $approved_comments ) {\n\t\t\tprintf( '<a href=\"%s\" class=\"post-com-count post-com-count-approved\"><span class=\"comment-count-approved\" aria-hidden=\"true\">%s</span><span class=\"screen-reader-text\">%s</span></a>',\n\t\t\t\tesc_url( add_query_arg( array( 'p' => $post_id, 'comment_status' => 'approved' ), admin_url( 'edit-comments.php' ) ) ),\n\t\t\t\t$approved_comments_number,\n\t\t\t\t$pending_comments ? $approved_phrase : $approved_only_phrase\n\t\t\t);\n\t\t} else {\n\t\t\tprintf( '<span class=\"post-com-count post-com-count-no-comments\"><span class=\"comment-count comment-count-no-comments\" aria-hidden=\"true\">%s</span><span class=\"screen-reader-text\">%s</span></span>',\n\t\t\t\t$approved_comments_number,\n\t\t\t\t$pending_comments ? __( 'No approved comments' ) : __( 'No comments' )\n\t\t\t);\n\t\t}\n\n\t\tif ( $pending_comments ) {\n\t\t\tprintf( '<a href=\"%s\" class=\"post-com-count post-com-count-pending\"><span class=\"comment-count-pending\" aria-hidden=\"true\">%s</span><span class=\"screen-reader-text\">%s</span></a>',\n\t\t\t\tesc_url( add_query_arg( array( 'p' => $post_id, 'comment_status' => 'moderated' ), admin_url( 'edit-comments.php' ) ) ),\n\t\t\t\t$pending_comments_number,\n\t\t\t\t$pending_phrase\n\t\t\t);\n\t\t} else {\n\t\t\tprintf( '<span class=\"post-com-count post-com-count-pending post-com-count-no-pending\"><span class=\"comment-count comment-count-no-pending\" aria-hidden=\"true\">%s</span><span class=\"screen-reader-text\">%s</span></span>',\n\t\t\t\t$pending_comments_number,\n\t\t\t\t$approved_comments ? __( 'No pending comments' ) : __( 'No comments' )\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the current page number\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @return int\n\t */\n\tpublic function get_pagenum() {\n\t\t$pagenum = isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 0;\n\n\t\tif ( isset( $this->_pagination_args['total_pages'] ) && $pagenum > $this->_pagination_args['total_pages'] )\n\t\t\t$pagenum = $this->_pagination_args['total_pages'];\n\n\t\treturn max( 1, $pagenum );\n\t}\n\n\t/**\n\t * Get number of items to display on a single page\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param string $option\n\t * @param int    $default\n\t * @return int\n\t */\n\tprotected function get_items_per_page( $option, $default = 20 ) {\n\t\t$per_page = (int) get_user_option( $option );\n\t\tif ( empty( $per_page ) || $per_page < 1 )\n\t\t\t$per_page = $default;\n\n\t\t/**\n\t\t * Filter the number of items to be displayed on each page of the list table.\n\t\t *\n\t\t * The dynamic hook name, $option, refers to the `per_page` option depending\n\t\t * on the type of list table in use. Possible values include: 'edit_comments_per_page',\n\t\t * 'sites_network_per_page', 'site_themes_network_per_page', 'themes_network_per_page',\n\t\t * 'users_network_per_page', 'edit_post_per_page', 'edit_page_per_page',\n\t\t * 'edit_{$post_type}_per_page', etc.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $per_page Number of items to be displayed. Default 20.\n\t\t */\n\t\treturn (int) apply_filters( $option, $per_page );\n\t}\n\n\t/**\n\t * Display the pagination.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param string $which\n\t */\n\tprotected function pagination( $which ) {\n\t\tif ( empty( $this->_pagination_args ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$total_items = $this->_pagination_args['total_items'];\n\t\t$total_pages = $this->_pagination_args['total_pages'];\n\t\t$infinite_scroll = false;\n\t\tif ( isset( $this->_pagination_args['infinite_scroll'] ) ) {\n\t\t\t$infinite_scroll = $this->_pagination_args['infinite_scroll'];\n\t\t}\n\n\t\tif ( 'top' === $which && $total_pages > 1 ) {\n\t\t\t$this->screen->render_screen_reader_content( 'heading_pagination' );\n\t\t}\n\n\t\t$output = '<span class=\"displaying-num\">' . sprintf( _n( '%s item', '%s items', $total_items ), number_format_i18n( $total_items ) ) . '</span>';\n\n\t\t$current = $this->get_pagenum();\n\n\t\t$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );\n\n\t\t$current_url = remove_query_arg( array( 'hotkeys_highlight_last', 'hotkeys_highlight_first' ), $current_url );\n\n\t\t$page_links = array();\n\n\t\t$total_pages_before = '<span class=\"paging-input\">';\n\t\t$total_pages_after  = '</span>';\n\n\t\t$disable_first = $disable_last = $disable_prev = $disable_next = false;\n\n \t\tif ( $current == 1 ) {\n\t\t\t$disable_first = true;\n\t\t\t$disable_prev = true;\n \t\t}\n\t\tif ( $current == 2 ) {\n\t\t\t$disable_first = true;\n\t\t}\n \t\tif ( $current == $total_pages ) {\n\t\t\t$disable_last = true;\n\t\t\t$disable_next = true;\n \t\t}\n\t\tif ( $current == $total_pages - 1 ) {\n\t\t\t$disable_last = true;\n\t\t}\n\n\t\tif ( $disable_first ) {\n\t\t\t$page_links[] = '<span class=\"tablenav-pages-navspan\" aria-hidden=\"true\">&laquo;</span>';\n\t\t} else {\n\t\t\t$page_links[] = sprintf( \"<a class='first-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>\",\n\t\t\t\tesc_url( remove_query_arg( 'paged', $current_url ) ),\n\t\t\t\t__( 'First page' ),\n\t\t\t\t'&laquo;'\n\t\t\t);\n\t\t}\n\n\t\tif ( $disable_prev ) {\n\t\t\t$page_links[] = '<span class=\"tablenav-pages-navspan\" aria-hidden=\"true\">&lsaquo;</span>';\n\t\t} else {\n\t\t\t$page_links[] = sprintf( \"<a class='prev-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>\",\n\t\t\t\tesc_url( add_query_arg( 'paged', max( 1, $current-1 ), $current_url ) ),\n\t\t\t\t__( 'Previous page' ),\n\t\t\t\t'&lsaquo;'\n\t\t\t);\n\t\t}\n\n\t\tif ( 'bottom' === $which ) {\n\t\t\t$html_current_page  = $current;\n\t\t\t$total_pages_before = '<span class=\"screen-reader-text\">' . __( 'Current Page' ) . '</span><span id=\"table-paging\" class=\"paging-input\">';\n\t\t} else {\n\t\t\t$html_current_page = sprintf( \"%s<input class='current-page' id='current-page-selector' type='text' name='paged' value='%s' size='%d' aria-describedby='table-paging' />\",\n\t\t\t\t'<label for=\"current-page-selector\" class=\"screen-reader-text\">' . __( 'Current Page' ) . '</label>',\n\t\t\t\t$current,\n\t\t\t\tstrlen( $total_pages )\n\t\t\t);\n\t\t}\n\t\t$html_total_pages = sprintf( \"<span class='total-pages'>%s</span>\", number_format_i18n( $total_pages ) );\n\t\t$page_links[] = $total_pages_before . sprintf( _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . $total_pages_after;\n\n\t\tif ( $disable_next ) {\n\t\t\t$page_links[] = '<span class=\"tablenav-pages-navspan\" aria-hidden=\"true\">&rsaquo;</span>';\n\t\t} else {\n\t\t\t$page_links[] = sprintf( \"<a class='next-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>\",\n\t\t\t\tesc_url( add_query_arg( 'paged', min( $total_pages, $current+1 ), $current_url ) ),\n\t\t\t\t__( 'Next page' ),\n\t\t\t\t'&rsaquo;'\n\t\t\t);\n\t\t}\n\n\t\tif ( $disable_last ) {\n\t\t\t$page_links[] = '<span class=\"tablenav-pages-navspan\" aria-hidden=\"true\">&raquo;</span>';\n\t\t} else {\n\t\t\t$page_links[] = sprintf( \"<a class='last-page' href='%s'><span class='screen-reader-text'>%s</span><span aria-hidden='true'>%s</span></a>\",\n\t\t\t\tesc_url( add_query_arg( 'paged', $total_pages, $current_url ) ),\n\t\t\t\t__( 'Last page' ),\n\t\t\t\t'&raquo;'\n\t\t\t);\n\t\t}\n\n\t\t$pagination_links_class = 'pagination-links';\n\t\tif ( ! empty( $infinite_scroll ) ) {\n\t\t\t$pagination_links_class = ' hide-if-js';\n\t\t}\n\t\t$output .= \"\\n<span class='$pagination_links_class'>\" . join( \"\\n\", $page_links ) . '</span>';\n\n\t\tif ( $total_pages ) {\n\t\t\t$page_class = $total_pages < 2 ? ' one-page' : '';\n\t\t} else {\n\t\t\t$page_class = ' no-pages';\n\t\t}\n\t\t$this->_pagination = \"<div class='tablenav-pages{$page_class}'>$output</div>\";\n\n\t\techo $this->_pagination;\n\t}\n\n\t/**\n\t * Get a list of columns. The format is:\n\t * 'internal-name' => 'Title'\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @abstract\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\tdie( 'function WP_List_Table::get_columns() must be over-ridden in a sub-class.' );\n\t}\n\n\t/**\n\t * Get a list of sortable columns. The format is:\n\t * 'internal-name' => 'orderby'\n\t * or\n\t * 'internal-name' => array( 'orderby', true )\n\t *\n\t * The second format will make the initial sorting order be descending\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array();\n\t}\n\n\t/**\n\t * Gets the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, an empty string.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\t$columns = $this->get_columns();\n\t\t$column = '';\n\n\t\tif ( empty( $columns ) ) {\n\t\t\treturn $column;\n\t\t}\n\n\t\t// We need a primary defined so responsive views show something,\n\t\t// so let's fall back to the first non-checkbox column.\n\t\tforeach ( $columns as $col => $column_name ) {\n\t\t\tif ( 'cb' === $col ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$column = $col;\n\t\t\tbreak;\n\t\t}\n\n\t\treturn $column;\n\t}\n\n\t/**\n\t * Public wrapper for WP_List_Table::get_default_primary_column_name().\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return string Name of the default primary column.\n\t */\n\tpublic function get_primary_column() {\n\t\treturn $this->get_primary_column_name();\n\t}\n\n\t/**\n\t * Gets the name of the primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string The name of the primary column.\n\t */\n\tprotected function get_primary_column_name() {\n\t\t$columns = get_column_headers( $this->screen );\n\t\t$default = $this->get_default_primary_column_name();\n\n\t\t// If the primary column doesn't exist fall back to the\n\t\t// first non-checkbox column.\n\t\tif ( ! isset( $columns[ $default ] ) ) {\n\t\t\t$default = WP_List_Table::get_default_primary_column_name();\n\t\t}\n\n\t\t/**\n\t\t * Filter the name of the primary column for the current list table.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @param string $default Column name default for the specific list table, e.g. 'name'.\n\t\t * @param string $context Screen ID for specific list table, e.g. 'plugins'.\n\t\t */\n\t\t$column  = apply_filters( 'list_table_primary_column', $default, $this->screen->id );\n\n\t\tif ( empty( $column ) || ! isset( $columns[ $column ] ) ) {\n\t\t\t$column = $default;\n\t\t}\n\n\t\treturn $column;\n\t}\n\n\t/**\n\t * Get a list of all, hidden and sortable columns, with filter applied\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @return array\n\t */\n\tprotected function get_column_info() {\n\t\t// $_column_headers is already set / cached\n\t\tif ( isset( $this->_column_headers ) && is_array( $this->_column_headers ) ) {\n\t\t\t// Back-compat for list tables that have been manually setting $_column_headers for horse reasons.\n\t\t\t// In 4.3, we added a fourth argument for primary column.\n\t\t\t$column_headers = array( array(), array(), array(), $this->get_primary_column_name() );\n\t\t\tforeach ( $this->_column_headers as $key => $value ) {\n\t\t\t\t$column_headers[ $key ] = $value;\n\t\t\t}\n\n\t\t\treturn $column_headers;\n\t\t}\n\n\t\t$columns = get_column_headers( $this->screen );\n\t\t$hidden = get_hidden_columns( $this->screen );\n\n\t\t$sortable_columns = $this->get_sortable_columns();\n\t\t/**\n\t\t * Filter the list table sortable columns for a specific screen.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$this->screen->id`, refers\n\t\t * to the ID of the current screen, usually a string.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param array $sortable_columns An array of sortable columns.\n\t\t */\n\t\t$_sortable = apply_filters( \"manage_{$this->screen->id}_sortable_columns\", $sortable_columns );\n\n\t\t$sortable = array();\n\t\tforeach ( $_sortable as $id => $data ) {\n\t\t\tif ( empty( $data ) )\n\t\t\t\tcontinue;\n\n\t\t\t$data = (array) $data;\n\t\t\tif ( !isset( $data[1] ) )\n\t\t\t\t$data[1] = false;\n\n\t\t\t$sortable[$id] = $data;\n\t\t}\n\n\t\t$primary = $this->get_primary_column_name();\n\t\t$this->_column_headers = array( $columns, $hidden, $sortable, $primary );\n\n\t\treturn $this->_column_headers;\n\t}\n\n\t/**\n\t * Return number of visible columns\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @return int\n\t */\n\tpublic function get_column_count() {\n\t\tlist ( $columns, $hidden ) = $this->get_column_info();\n\t\t$hidden = array_intersect( array_keys( $columns ), array_filter( $hidden ) );\n\t\treturn count( $columns ) - count( $hidden );\n\t}\n\n\t/**\n\t * Print column headers, accounting for hidden and sortable columns.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @staticvar int $cb_counter\n\t *\n\t * @param bool $with_id Whether to set the id attribute or not\n\t */\n\tpublic function print_column_headers( $with_id = true ) {\n\t\tlist( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();\n\n\t\t$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );\n\t\t$current_url = remove_query_arg( 'paged', $current_url );\n\n\t\tif ( isset( $_GET['orderby'] ) ) {\n\t\t\t$current_orderby = $_GET['orderby'];\n\t\t} else {\n\t\t\t$current_orderby = '';\n\t\t}\n\n\t\tif ( isset( $_GET['order'] ) && 'desc' === $_GET['order'] ) {\n\t\t\t$current_order = 'desc';\n\t\t} else {\n\t\t\t$current_order = 'asc';\n\t\t}\n\n\t\tif ( ! empty( $columns['cb'] ) ) {\n\t\t\tstatic $cb_counter = 1;\n\t\t\t$columns['cb'] = '<label class=\"screen-reader-text\" for=\"cb-select-all-' . $cb_counter . '\">' . __( 'Select All' ) . '</label>'\n\t\t\t\t. '<input id=\"cb-select-all-' . $cb_counter . '\" type=\"checkbox\" />';\n\t\t\t$cb_counter++;\n\t\t}\n\n\t\tforeach ( $columns as $column_key => $column_display_name ) {\n\t\t\t$class = array( 'manage-column', \"column-$column_key\" );\n\n\t\t\tif ( in_array( $column_key, $hidden ) ) {\n\t\t\t\t$class[] = 'hidden';\n\t\t\t}\n\n\t\t\tif ( 'cb' === $column_key )\n\t\t\t\t$class[] = 'check-column';\n\t\t\telseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) )\n\t\t\t\t$class[] = 'num';\n\n\t\t\tif ( $column_key === $primary ) {\n\t\t\t\t$class[] = 'column-primary';\n\t\t\t}\n\n\t\t\tif ( isset( $sortable[$column_key] ) ) {\n\t\t\t\tlist( $orderby, $desc_first ) = $sortable[$column_key];\n\n\t\t\t\tif ( $current_orderby === $orderby ) {\n\t\t\t\t\t$order = 'asc' === $current_order ? 'desc' : 'asc';\n\t\t\t\t\t$class[] = 'sorted';\n\t\t\t\t\t$class[] = $current_order;\n\t\t\t\t} else {\n\t\t\t\t\t$order = $desc_first ? 'desc' : 'asc';\n\t\t\t\t\t$class[] = 'sortable';\n\t\t\t\t\t$class[] = $desc_first ? 'asc' : 'desc';\n\t\t\t\t}\n\n\t\t\t\t$column_display_name = '<a href=\"' . esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ) . '\"><span>' . $column_display_name . '</span><span class=\"sorting-indicator\"></span></a>';\n\t\t\t}\n\n\t\t\t$tag = ( 'cb' === $column_key ) ? 'td' : 'th';\n\t\t\t$scope = ( 'th' === $tag ) ? 'scope=\"col\"' : '';\n\t\t\t$id = $with_id ? \"id='$column_key'\" : '';\n\n\t\t\tif ( !empty( $class ) )\n\t\t\t\t$class = \"class='\" . join( ' ', $class ) . \"'\";\n\n\t\t\techo \"<$tag $scope $id $class>$column_display_name</$tag>\";\n\t\t}\n\t}\n\n\t/**\n\t * Display the table\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t */\n\tpublic function display() {\n\t\t$singular = $this->_args['singular'];\n\n\t\t$this->display_tablenav( 'top' );\n\n\t\t$this->screen->render_screen_reader_content( 'heading_list' );\n?>\n<table class=\"wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>\">\n\t<thead>\n\t<tr>\n\t\t<?php $this->print_column_headers(); ?>\n\t</tr>\n\t</thead>\n\n\t<tbody id=\"the-list\"<?php\n\t\tif ( $singular ) {\n\t\t\techo \" data-wp-lists='list:$singular'\";\n\t\t} ?>>\n\t\t<?php $this->display_rows_or_placeholder(); ?>\n\t</tbody>\n\n\t<tfoot>\n\t<tr>\n\t\t<?php $this->print_column_headers( false ); ?>\n\t</tr>\n\t</tfoot>\n\n</table>\n<?php\n\t\t$this->display_tablenav( 'bottom' );\n\t}\n\n\t/**\n\t * Get a list of CSS classes for the list table table tag.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @return array List of CSS classes for the table tag.\n\t */\n\tprotected function get_table_classes() {\n\t\treturn array( 'widefat', 'fixed', 'striped', $this->_args['plural'] );\n\t}\n\n\t/**\n\t * Generate the table navigation above or below the table\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t * @param string $which\n\t */\n\tprotected function display_tablenav( $which ) {\n\t\tif ( 'top' === $which ) {\n\t\t\twp_nonce_field( 'bulk-' . $this->_args['plural'] );\n\t\t}\n\t\t?>\n\t<div class=\"tablenav <?php echo esc_attr( $which ); ?>\">\n\n\t\t<?php if ( $this->has_items() ): ?>\n\t\t<div class=\"alignleft actions bulkactions\">\n\t\t\t<?php $this->bulk_actions( $which ); ?>\n\t\t</div>\n\t\t<?php endif;\n\t\t$this->extra_tablenav( $which );\n\t\t$this->pagination( $which );\n?>\n\n\t\t<br class=\"clear\" />\n\t</div>\n<?php\n\t}\n\n\t/**\n\t * Extra controls to be displayed between bulk actions and pagination\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param string $which\n\t */\n\tprotected function extra_tablenav( $which ) {}\n\n\t/**\n\t * Generate the tbody element for the list table.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t */\n\tpublic function display_rows_or_placeholder() {\n\t\tif ( $this->has_items() ) {\n\t\t\t$this->display_rows();\n\t\t} else {\n\t\t\techo '<tr class=\"no-items\"><td class=\"colspanchange\" colspan=\"' . $this->get_column_count() . '\">';\n\t\t\t$this->no_items();\n\t\t\techo '</td></tr>';\n\t\t}\n\t}\n\n\t/**\n\t * Generate the table rows\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t */\n\tpublic function display_rows() {\n\t\tforeach ( $this->items as $item )\n\t\t\t$this->single_row( $item );\n\t}\n\n\t/**\n\t * Generates content for a single row of the table\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @param object $item The current item\n\t */\n\tpublic function single_row( $item ) {\n\t\techo '<tr>';\n\t\t$this->single_row_columns( $item );\n\t\techo '</tr>';\n\t}\n\n\t/**\n\t *\n\t * @param object $item\n\t * @param string $column_name\n\t */\n\tprotected function column_default( $item, $column_name ) {}\n\n\t/**\n\t *\n\t * @param object $item\n\t */\n\tprotected function column_cb( $item ) {}\n\n\t/**\n\t * Generates the columns for a single row of the table\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param object $item The current item\n\t */\n\tprotected function single_row_columns( $item ) {\n\t\tlist( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();\n\n\t\tforeach ( $columns as $column_name => $column_display_name ) {\n\t\t\t$classes = \"$column_name column-$column_name\";\n\t\t\tif ( $primary === $column_name ) {\n\t\t\t\t$classes .= ' has-row-actions column-primary';\n\t\t\t}\n\n\t\t\tif ( in_array( $column_name, $hidden ) ) {\n\t\t\t\t$classes .= ' hidden';\n\t\t\t}\n\n\t\t\t// Comments column uses HTML in the display name with screen reader text.\n\t\t\t// Instead of using esc_attr(), we strip tags to get closer to a user-friendly string.\n\t\t\t$data = 'data-colname=\"' . wp_strip_all_tags( $column_display_name ) . '\"';\n\n\t\t\t$attributes = \"class='$classes' $data\";\n\n\t\t\tif ( 'cb' === $column_name ) {\n\t\t\t\techo '<th scope=\"row\" class=\"check-column\">';\n\t\t\t\techo $this->column_cb( $item );\n\t\t\t\techo '</th>';\n\t\t\t} elseif ( method_exists( $this, '_column_' . $column_name ) ) {\n\t\t\t\techo call_user_func(\n\t\t\t\t\tarray( $this, '_column_' . $column_name ),\n\t\t\t\t\t$item,\n\t\t\t\t\t$classes,\n\t\t\t\t\t$data,\n\t\t\t\t\t$primary\n\t\t\t\t);\n\t\t\t} elseif ( method_exists( $this, 'column_' . $column_name ) ) {\n\t\t\t\techo \"<td $attributes>\";\n\t\t\t\techo call_user_func( array( $this, 'column_' . $column_name ), $item );\n\t\t\t\techo $this->handle_row_actions( $item, $column_name, $primary );\n\t\t\t\techo \"</td>\";\n\t\t\t} else {\n\t\t\t\techo \"<td $attributes>\";\n\t\t\t\techo $this->column_default( $item, $column_name );\n\t\t\t\techo $this->handle_row_actions( $item, $column_name, $primary );\n\t\t\t\techo \"</td>\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generates and display row actions links for the list table.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param object $item        The item being acted upon.\n\t * @param string $column_name Current column name.\n\t * @param string $primary     Primary column name.\n\t * @return string The row actions HTML, or an empty string if the current column is the primary column.\n\t */\n\tprotected function handle_row_actions( $item, $column_name, $primary ) {\n\t\treturn $column_name === $primary ? '<button type=\"button\" class=\"toggle-row\"><span class=\"screen-reader-text\">' . __( 'Show more details' ) . '</span></button>' : '';\n \t}\n\n\t/**\n\t * Handle an incoming ajax request (called from admin-ajax.php)\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t */\n\tpublic function ajax_response() {\n\t\t$this->prepare_items();\n\n\t\tob_start();\n\t\tif ( ! empty( $_REQUEST['no_placeholder'] ) ) {\n\t\t\t$this->display_rows();\n\t\t} else {\n\t\t\t$this->display_rows_or_placeholder();\n\t\t}\n\n\t\t$rows = ob_get_clean();\n\n\t\t$response = array( 'rows' => $rows );\n\n\t\tif ( isset( $this->_pagination_args['total_items'] ) ) {\n\t\t\t$response['total_items_i18n'] = sprintf(\n\t\t\t\t_n( '%s item', '%s items', $this->_pagination_args['total_items'] ),\n\t\t\t\tnumber_format_i18n( $this->_pagination_args['total_items'] )\n\t\t\t);\n\t\t}\n\t\tif ( isset( $this->_pagination_args['total_pages'] ) ) {\n\t\t\t$response['total_pages'] = $this->_pagination_args['total_pages'];\n\t\t\t$response['total_pages_i18n'] = number_format_i18n( $this->_pagination_args['total_pages'] );\n\t\t}\n\n\t\tdie( wp_json_encode( $response ) );\n\t}\n\n\t/**\n\t * Send required variables to JavaScript land\n\t *\n\t * @access public\n\t */\n\tpublic function _js_vars() {\n\t\t$args = array(\n\t\t\t'class'  => get_class( $this ),\n\t\t\t'screen' => array(\n\t\t\t\t'id'   => $this->screen->id,\n\t\t\t\t'base' => $this->screen->base,\n\t\t\t)\n\t\t);\n\n\t\tprintf( \"<script type='text/javascript'>list_args = %s;</script>\\n\", wp_json_encode( $args ) );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-media-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Media_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying media items in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_Media_List_Table extends WP_List_Table {\n\t/**\n\t * Holds the number of pending comments for each post.\n\t *\n\t * @since 4.4.0\n\t * @var array\n\t * @access protected\n\t */\n\tprotected $comment_pending_count = array();\n\n\tprivate $detached;\n\n\tprivate $is_trash;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\t$this->detached = ( isset( $_REQUEST['attachment-filter'] ) && 'detached' === $_REQUEST['attachment-filter'] );\n\n\t\t$this->modes = array(\n\t\t\t'list' => __( 'List View' ),\n\t\t\t'grid' => __( 'Grid View' )\n\t\t);\n\n\t\tparent::__construct( array(\n\t\t\t'plural' => 'media',\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can('upload_files');\n\t}\n\n\t/**\n\t *\n\t * @global WP_Query $wp_query\n\t * @global array    $post_mime_types\n\t * @global array    $avail_post_mime_types\n\t * @global string   $mode\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $wp_query, $post_mime_types, $avail_post_mime_types, $mode;\n\n\t\tlist( $post_mime_types, $avail_post_mime_types ) = wp_edit_attachments_query( $_REQUEST );\n\n \t\t$this->is_trash = isset( $_REQUEST['attachment-filter'] ) && 'trash' === $_REQUEST['attachment-filter'];\n\n \t\t$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $wp_query->found_posts,\n\t\t\t'total_pages' => $wp_query->max_num_pages,\n\t\t\t'per_page' => $wp_query->query_vars['posts_per_page'],\n\t\t) );\n\t}\n\n\t/**\n\t * @global array $post_mime_types\n\t * @global array $avail_post_mime_types\n\t * @return array\n\t */\n\tprotected function get_views() {\n\t\tglobal $post_mime_types, $avail_post_mime_types;\n\n\t\t$type_links = array();\n\n\t\t$filter = empty( $_GET['attachment-filter'] ) ? '' : $_GET['attachment-filter'];\n\n\t\t$type_links['all'] = sprintf(\n\t\t\t'<option value=\"\"%s>%s</option>',\n\t\t\tselected( $filter, true, false ),\n\t\t\t__( 'All media items' )\n\t\t);\n\n\t\tforeach ( $post_mime_types as $mime_type => $label ) {\n\t\t\tif ( ! wp_match_mime_types( $mime_type, $avail_post_mime_types ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$selected = selected(\n\t\t\t\t$filter && 0 === strpos( $filter, 'post_mime_type:' ) &&\n\t\t\t\t\twp_match_mime_types( $mime_type, str_replace( 'post_mime_type:', '', $filter ) ),\n\t\t\t\ttrue,\n\t\t\t\tfalse\n\t\t\t);\n\n\t\t\t$type_links[$mime_type] = sprintf(\n\t\t\t\t'<option value=\"post_mime_type:%s\"%s>%s</option>',\n\t\t\t\tesc_attr( $mime_type ),\n\t\t\t\t$selected,\n\t\t\t\t$label[0]\n\t\t\t);\n\t\t}\n\t\t$type_links['detached'] = '<option value=\"detached\"' . ( $this->detached ? ' selected=\"selected\"' : '' ) . '>' . __( 'Unattached' ) . '</option>';\n\n\t\tif ( $this->is_trash || ( defined( 'MEDIA_TRASH') && MEDIA_TRASH ) ) {\n\t\t\t$type_links['trash'] = sprintf(\n\t\t\t\t'<option value=\"trash\"%s>%s</option>',\n\t\t\t\tselected( 'trash' === $filter, true, false ),\n\t\t\t\t__( 'Trash' )\n\t\t\t);\n\t\t}\n\t\treturn $type_links;\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\t$actions = array();\n\t\tif ( MEDIA_TRASH ) {\n\t\t\tif ( $this->is_trash ) {\n\t\t\t\t$actions['untrash'] = __( 'Restore' );\n\t\t\t\t$actions['delete'] = __( 'Delete Permanently' );\n\t\t\t} else {\n\t\t\t\t$actions['trash'] = __( 'Trash' );\n\t\t\t}\n\t\t} else {\n\t\t\t$actions['delete'] = __( 'Delete Permanently' );\n\t\t}\n\n\t\tif ( $this->detached )\n\t\t\t$actions['attach'] = __( 'Attach' );\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t * @param string $which\n\t */\n\tprotected function extra_tablenav( $which ) {\n\t\tif ( 'bar' !== $which ) {\n\t\t\treturn;\n\t\t}\n?>\n\t\t<div class=\"actions\">\n<?php\n\t\tif ( ! is_singular() ) {\n\t\t\tif ( ! $this->is_trash ) {\n\t\t\t\t$this->months_dropdown( 'attachment' );\n\t\t\t}\n\n\t\t\t/** This action is documented in wp-admin/includes/class-wp-posts-list-table.php */\n\t\t\tdo_action( 'restrict_manage_posts', $this->screen->post_type );\n\n\t\t\tsubmit_button( __( 'Filter' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) );\n\t\t}\n\n\t\tif ( $this->is_trash && current_user_can( 'edit_others_posts' ) ) {\n\t\t\tsubmit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false );\n\t\t} ?>\n\t\t</div>\n<?php\n\t}\n\n\t/**\n\t *\n\t * @return string\n\t */\n\tpublic function current_action() {\n\t\tif ( isset( $_REQUEST['found_post_id'] ) && isset( $_REQUEST['media'] ) )\n\t\t\treturn 'attach';\n\n\t\tif ( isset( $_REQUEST['parent_post_id'] ) && isset( $_REQUEST['media'] ) )\n\t\t\treturn 'detach';\n\n\t\tif ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )\n\t\t\treturn 'delete_all';\n\n\t\treturn parent::current_action();\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function has_items() {\n\t\treturn have_posts();\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\t_e( 'No media attachments found.' );\n\t}\n\n\t/**\n\t * Override parent views so we can use the filter bar display.\n\t *\n\t * @global string $mode\n\t */\n\tpublic function views() {\n\t\tglobal $mode;\n\n\t\t$views = $this->get_views();\n\n\t\t$this->screen->render_screen_reader_content( 'heading_views' );\n?>\n<div class=\"wp-filter\">\n\t<div class=\"filter-items\">\n\t\t<?php $this->view_switcher( $mode ); ?>\n\n\t\t<label for=\"attachment-filter\" class=\"screen-reader-text\"><?php _e( 'Filter by type' ); ?></label>\n\t\t<select class=\"attachment-filters\" name=\"attachment-filter\" id=\"attachment-filter\">\n\t\t\t<?php\n\t\t\tif ( ! empty( $views ) ) {\n\t\t\t\tforeach ( $views as $class => $view ) {\n\t\t\t\t\techo \"\\t$view\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t\t?>\n\t\t</select>\n\n<?php\n\t\t$this->extra_tablenav( 'bar' );\n\n\t\t/** This filter is documented in wp-admin/inclues/class-wp-list-table.php */\n\t\t$views = apply_filters( \"views_{$this->screen->id}\", array() );\n\n\t\t// Back compat for pre-4.0 view links.\n\t\tif ( ! empty( $views ) ) {\n\t\t\techo '<ul class=\"filter-links\">';\n\t\t\tforeach ( $views as $class => $view ) {\n\t\t\t\techo \"<li class='$class'>$view</li>\";\n\t\t\t}\n\t\t\techo '</ul>';\n\t\t}\n?>\n\t</div>\n\n\t<div class=\"search-form\">\n\t\t<label for=\"media-search-input\" class=\"screen-reader-text\"><?php esc_html_e( 'Search Media' ); ?></label>\n\t\t<input type=\"search\" placeholder=\"<?php esc_attr_e( 'Search' ) ?>\" id=\"media-search-input\" class=\"search\" name=\"s\" value=\"<?php _admin_search_query(); ?>\"></div>\n\t</div>\n\t<?php\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\t$posts_columns = array();\n\t\t$posts_columns['cb'] = '<input type=\"checkbox\" />';\n\t\t/* translators: column name */\n\t\t$posts_columns['title'] = _x( 'File', 'column name' );\n\t\t$posts_columns['author'] = __( 'Author' );\n\n\t\t$taxonomies = get_taxonomies_for_attachments( 'objects' );\n\t\t$taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' );\n\n\t\t/**\n\t\t * Filter the taxonomy columns for attachments in the Media list table.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param array  $taxonomies An array of registered taxonomies to show for attachments.\n\t\t * @param string $post_type  The post type. Default 'attachment'.\n\t\t */\n\t\t$taxonomies = apply_filters( 'manage_taxonomies_for_attachment_columns', $taxonomies, 'attachment' );\n\t\t$taxonomies = array_filter( $taxonomies, 'taxonomy_exists' );\n\n\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\tif ( 'category' === $taxonomy ) {\n\t\t\t\t$column_key = 'categories';\n\t\t\t} elseif ( 'post_tag' === $taxonomy ) {\n\t\t\t\t$column_key = 'tags';\n\t\t\t} else {\n\t\t\t\t$column_key = 'taxonomy-' . $taxonomy;\n\t\t\t}\n\t\t\t$posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name;\n\t\t}\n\n\t\t/* translators: column name */\n\t\tif ( !$this->detached ) {\n\t\t\t$posts_columns['parent'] = _x( 'Uploaded to', 'column name' );\n\t\t\tif ( post_type_supports( 'attachment', 'comments' ) )\n\t\t\t\t$posts_columns['comments'] = '<span class=\"vers comment-grey-bubble\" title=\"' . esc_attr__( 'Comments' ) . '\"><span class=\"screen-reader-text\">' . __( 'Comments' ) . '</span></span>';\n\t\t}\n\t\t/* translators: column name */\n\t\t$posts_columns['date'] = _x( 'Date', 'column name' );\n\t\t/**\n\t\t * Filter the Media list table columns.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $posts_columns An array of columns displayed in the Media list table.\n\t\t * @param bool  $detached      Whether the list table contains media not attached\n\t\t *                             to any posts. Default true.\n\t\t */\n\t\treturn apply_filters( 'manage_media_columns', $posts_columns, $this->detached );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array(\n\t\t\t'title'    => 'title',\n\t\t\t'author'   => 'author',\n\t\t\t'parent'   => 'parent',\n\t\t\t'comments' => 'comment_count',\n\t\t\t'date'     => array( 'date', true ),\n\t\t);\n\t}\n\n\t/**\n\t * Handles the checkbox column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_cb( $post ) {\n\t\tif ( current_user_can( 'edit_post', $post->ID ) ) { ?>\n\t\t\t<label class=\"screen-reader-text\" for=\"cb-select-<?php echo $post->ID; ?>\"><?php\n\t\t\t\techo sprintf( __( 'Select %s' ), _draft_or_post_title() );\n\t\t\t?></label>\n\t\t\t<input type=\"checkbox\" name=\"media[]\" id=\"cb-select-<?php echo $post->ID; ?>\" value=\"<?php echo $post->ID; ?>\" />\n\t\t<?php }\n\t}\n\n\t/**\n\t * Handles the title column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_title( $post ) {\n\t\tlist( $mime ) = explode( '/', $post->post_mime_type );\n\n\t\t$title = _draft_or_post_title();\n\t\t$thumb = wp_get_attachment_image( $post->ID, array( 60, 60 ), true, array( 'alt' => '' ) );\n\t\t$link_start = $link_end = '';\n\n\t\tif ( current_user_can( 'edit_post', $post->ID ) && ! $this->is_trash ) {\n\t\t\t$link_start = '<a href=\"' . get_edit_post_link( $post->ID ) . '\">';\n\t\t\t$link_end = '</a>';\n\t\t}\n\n\t\t$class = $thumb ? ' class=\"has-media-icon\"' : '';\n\n\t\t?>\n\t\t<strong<?php echo $class; ?>>\n\t\t\t<?php echo $link_start; ?>\n\t\t\t\t<?php if ( $thumb ) : ?>\n\t\t\t\t<span class=\"media-icon <?php echo sanitize_html_class( $mime . '-icon' ); ?>\"><?php echo $thumb; ?></span>\n\t\t\t\t<?php endif; ?>\n\n\t\t\t\t<span aria-hidden=\"true\"><?php echo $title; ?></span>\n\t\t\t\t<span class=\"screen-reader-text\"><?php printf( __( 'Edit &#8220;%s&#8221;' ), $title ); ?></span>\n\t\t\t<?php echo $link_end; ?>\n\t\t\t<?php _media_states( $post ); ?>\n\t\t</strong>\n\t\t<p class=\"filename\">\n\t\t\t<span class=\"screen-reader-text\"><?php _e( 'File name:' ); ?> </span>\n\t\t\t<?php\n\t\t\t$file = get_attached_file( $post->ID );\n\t\t\techo wp_basename( $file );\n\t\t\t?>\n\t\t</p>\n\t\t<?php\n\t}\n\n\t/**\n\t * Handles the author column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_author( $post ) {\n\t\tprintf( '<a href=\"%s\">%s</a>',\n\t\t\tesc_url( add_query_arg( array( 'author' => get_the_author_meta('ID') ), 'upload.php' ) ),\n\t\t\tget_the_author()\n\t\t);\n\t}\n\n\t/**\n\t * Handles the description column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_desc( $post ) {\n\t\techo has_excerpt() ? $post->post_excerpt : '';\n\t}\n\n\t/**\n\t * Handles the date column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_date( $post ) {\n\t\tif ( '0000-00-00 00:00:00' === $post->post_date ) {\n\t\t\t$h_time = __( 'Unpublished' );\n\t\t} else {\n\t\t\t$m_time = $post->post_date;\n\t\t\t$time = get_post_time( 'G', true, $post, false );\n\t\t\tif ( ( abs( $t_diff = time() - $time ) ) < DAY_IN_SECONDS ) {\n\t\t\t\tif ( $t_diff < 0 ) {\n\t\t\t\t\t$h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );\n\t\t\t\t} else {\n\t\t\t\t\t$h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$h_time = mysql2date( __( 'Y/m/d' ), $m_time );\n\t\t\t}\n\t\t}\n\n\t\techo $h_time;\n\t}\n\n\t/**\n\t * Handles the parent column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_parent( $post ) {\n\t\t$user_can_edit = current_user_can( 'edit_post', $post->ID );\n\n\t\tif ( $post->post_parent > 0 ) {\n\t\t\t$parent = get_post( $post->post_parent );\n\t\t} else {\n\t\t\t$parent = false;\n\t\t}\n\n\t\tif ( $parent ) {\n\t\t\t$title = _draft_or_post_title( $post->post_parent );\n\t\t\t$parent_type = get_post_type_object( $parent->post_type );\n?>\n\t\t\t<strong>\n\t\t\t<?php if ( $parent_type && $parent_type->show_ui && current_user_can( 'edit_post', $post->post_parent ) ) { ?>\n\t\t\t\t<a href=\"<?php echo get_edit_post_link( $post->post_parent ); ?>\">\n\t\t\t\t\t<?php echo $title ?></a><?php\n\t\t\t} else {\n\t\t\t\techo $title;\n\t\t\t} ?></strong>\n\t\t\t<br />\n\t\t\t<?php\n\t\t\tif ( $user_can_edit ):\n\t\t\t\t$detach_url = add_query_arg( array(\n\t\t\t\t\t'parent_post_id' => $post->post_parent,\n\t\t\t\t\t'media[]' => $post->ID,\n\t\t\t\t\t'_wpnonce' => wp_create_nonce( 'bulk-' . $this->_args['plural'] )\n\t\t\t\t), 'upload.php' ); ?>\n\t\t\t<a class=\"hide-if-no-js detach-from-parent\" href=\"<?php echo $detach_url ?>\"><?php _e( 'Detach' ); ?></a>\n\t\t\t<?php endif;\n\t\t} else {\n\t\t\t_e( '(Unattached)' ); ?><br />\n\t\t\t<?php if ( $user_can_edit ) { ?>\n\t\t\t\t<a class=\"hide-if-no-js\"\n\t\t\t\t\tonclick=\"findPosts.open( 'media[]','<?php echo $post->ID ?>' ); return false;\"\n\t\t\t\t\thref=\"#the-list\">\n\t\t\t\t\t<?php _e( 'Attach' ); ?></a>\n\t\t\t<?php }\n\t\t}\n\t}\n\n\t/**\n\t * Handles the comments column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_comments( $post ) {\n\t\techo '<div class=\"post-com-count-wrapper\">';\n\n\t\tif ( isset( $this->comment_pending_count[ $post->ID ] ) ) {\n\t\t\t$pending_comments = $this->comment_pending_count[ $post->ID ];\n\t\t} else {\n\t\t\t$pending_comments = get_pending_comments_num( $post->ID );\n\t\t}\n\n\t\t$this->comments_bubble( $post->ID, $pending_comments );\n\n\t\techo '</div>';\n\t}\n\n\t/**\n\t * Handles output for the default column.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post        The current WP_Post object.\n\t * @param string  $column_name Current column name.\n\t */\n\tpublic function column_default( $post, $column_name ) {\n\t\tif ( 'categories' === $column_name ) {\n\t\t\t$taxonomy = 'category';\n\t\t} elseif ( 'tags' === $column_name ) {\n\t\t\t$taxonomy = 'post_tag';\n\t\t} elseif ( 0 === strpos( $column_name, 'taxonomy-' ) ) {\n\t\t\t$taxonomy = substr( $column_name, 9 );\n\t\t} else {\n\t\t\t$taxonomy = false;\n\t\t}\n\n\t\tif ( $taxonomy ) {\n\t\t\t$terms = get_the_terms( $post->ID, $taxonomy );\n\t\t\tif ( is_array( $terms ) ) {\n\t\t\t\t$out = array();\n\t\t\t\tforeach ( $terms as $t ) {\n\t\t\t\t\t$posts_in_term_qv = array();\n\t\t\t\t\t$posts_in_term_qv['taxonomy'] = $taxonomy;\n\t\t\t\t\t$posts_in_term_qv['term'] = $t->slug;\n\n\t\t\t\t\t$out[] = sprintf( '<a href=\"%s\">%s</a>',\n\t\t\t\t\t\tesc_url( add_query_arg( $posts_in_term_qv, 'upload.php' ) ),\n\t\t\t\t\t\tesc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t/* translators: used between list items, there is a space after the comma */\n\t\t\t\techo join( __( ', ' ), $out );\n\t\t\t} else {\n\t\t\t\techo '<span aria-hidden=\"true\">&#8212;</span><span class=\"screen-reader-text\">' . get_taxonomy( $taxonomy )->labels->no_terms . '</span>';\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Fires for each custom column in the Media list table.\n\t\t *\n\t\t * Custom columns are registered using the {@see 'manage_media_columns'} filter.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $column_name Name of the custom column.\n\t\t * @param int    $post_id     Attachment ID.\n\t\t */\n\t\tdo_action( 'manage_media_custom_column', $column_name, $post->ID );\n\t}\n\n\t/**\n\t *\n\t * @global WP_Post $post\n\t */\n\tpublic function display_rows() {\n\t\tglobal $post, $wp_query;\n\n\t\t$post_ids = wp_list_pluck( $wp_query->posts, 'ID' );\n\t\treset( $wp_query->posts );\n\n\t\t$this->comment_pending_count = get_pending_comments_num( $post_ids );\n\n\t\tadd_filter( 'the_title','esc_html' );\n\n\t\twhile ( have_posts() ) : the_post();\n\t\t\tif (\n\t\t\t\t( $this->is_trash && $post->post_status != 'trash' )\n\t\t\t\t|| ( ! $this->is_trash && $post->post_status === 'trash' )\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t$post_owner = ( get_current_user_id() == $post->post_author ) ? 'self' : 'other';\n\t\t?>\n\t\t\t<tr id=\"post-<?php echo $post->ID; ?>\" class=\"<?php echo trim( ' author-' . $post_owner . ' status-' . $post->post_status ); ?>\">\n\t\t\t\t<?php $this->single_row_columns( $post ); ?>\n\t\t\t</tr>\n\t\t<?php\n\t\tendwhile;\n\t}\n\n\t/**\n\t * Gets the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, 'title'.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\treturn 'title';\n\t}\n\n\t/**\n\t * @param WP_Post $post\n\t * @param string  $att_title\n\t *\n\t * @return array\n\t */\n\tprivate function _get_row_actions( $post, $att_title ) {\n\t\t$actions = array();\n\n\t\tif ( $this->detached ) {\n\t\t\tif ( current_user_can( 'edit_post', $post->ID ) )\n\t\t\t\t$actions['edit'] = '<a href=\"' . get_edit_post_link( $post->ID ) . '\">' . __( 'Edit' ) . '</a>';\n\t\t\tif ( current_user_can( 'delete_post', $post->ID ) )\n\t\t\t\tif ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {\n\t\t\t\t\t$actions['trash'] = \"<a class='submitdelete' href='\" . wp_nonce_url( \"post.php?action=trash&amp;post=$post->ID\", 'trash-post_' . $post->ID ) . \"'>\" . __( 'Trash' ) . \"</a>\";\n\t\t\t\t} else {\n\t\t\t\t\t$delete_ays = !MEDIA_TRASH ? \" onclick='return showNotice.warn();'\" : '';\n\t\t\t\t\t$actions['delete'] = \"<a class='submitdelete'$delete_ays href='\" . wp_nonce_url( \"post.php?action=delete&amp;post=$post->ID\", 'delete-post_' . $post->ID ) . \"'>\" . __( 'Delete Permanently' ) . \"</a>\";\n\t\t\t\t}\n\t\t\t$actions['view'] = '<a href=\"' . get_permalink( $post->ID ) . '\" title=\"' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;' ), $att_title ) ) . '\" rel=\"permalink\">' . __( 'View' ) . '</a>';\n\t\t\tif ( current_user_can( 'edit_post', $post->ID ) )\n\t\t\t\t$actions['attach'] = '<a href=\"#the-list\" onclick=\"findPosts.open( \\'media[]\\',\\''.$post->ID.'\\' );return false;\" class=\"hide-if-no-js\">'.__( 'Attach' ).'</a>';\n\t\t}\n\t\telse {\n\t\t\tif ( current_user_can( 'edit_post', $post->ID ) && !$this->is_trash )\n\t\t\t\t$actions['edit'] = '<a href=\"' . get_edit_post_link( $post->ID ) . '\">' . __( 'Edit' ) . '</a>';\n\t\t\tif ( current_user_can( 'delete_post', $post->ID ) ) {\n\t\t\t\tif ( $this->is_trash )\n\t\t\t\t\t$actions['untrash'] = \"<a class='submitdelete' href='\" . wp_nonce_url( \"post.php?action=untrash&amp;post=$post->ID\", 'untrash-post_' . $post->ID ) . \"'>\" . __( 'Restore' ) . \"</a>\";\n\t\t\t\telseif ( EMPTY_TRASH_DAYS && MEDIA_TRASH )\n\t\t\t\t\t$actions['trash'] = \"<a class='submitdelete' href='\" . wp_nonce_url( \"post.php?action=trash&amp;post=$post->ID\", 'trash-post_' . $post->ID ) . \"'>\" . __( 'Trash' ) . \"</a>\";\n\t\t\t\tif ( $this->is_trash || !EMPTY_TRASH_DAYS || !MEDIA_TRASH ) {\n\t\t\t\t\t$delete_ays = ( !$this->is_trash && !MEDIA_TRASH ) ? \" onclick='return showNotice.warn();'\" : '';\n\t\t\t\t\t$actions['delete'] = \"<a class='submitdelete'$delete_ays href='\" . wp_nonce_url( \"post.php?action=delete&amp;post=$post->ID\", 'delete-post_' . $post->ID ) . \"'>\" . __( 'Delete Permanently' ) . \"</a>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !$this->is_trash ) {\n\t\t\t\t$title =_draft_or_post_title( $post->post_parent );\n\t\t\t\t$actions['view'] = '<a href=\"' . get_permalink( $post->ID ) . '\" title=\"' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;' ), $title ) ) . '\" rel=\"permalink\">' . __( 'View' ) . '</a>';\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the action links for each attachment in the Media list table.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array   $actions  An array of action links for each attachment.\n\t\t *                          Default 'Edit', 'Delete Permanently', 'View'.\n\t\t * @param WP_Post $post     WP_Post object for the current attachment.\n\t\t * @param bool    $detached Whether the list table contains media not attached\n\t\t *                          to any posts. Default true.\n\t\t */\n\t\treturn apply_filters( 'media_row_actions', $actions, $post, $this->detached );\n\t}\n\n\t/**\n\t * Generates and displays row action links.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param object $post        Attachment being acted upon.\n\t * @param string $column_name Current column name.\n\t * @param string $primary     Primary column name.\n\t * @return string Row actions output for media attachments.\n\t */\n\tprotected function handle_row_actions( $post, $column_name, $primary ) {\n\t\tif ( $primary !== $column_name ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t$att_title = _draft_or_post_title();\n\t\treturn $this->row_actions( $this->_get_row_actions( $post, $att_title ) );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-ms-sites-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_MS_Sites_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying sites in a list table for the network admin.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_MS_Sites_List_Table extends WP_List_Table {\n\n\t/**\n\t * Site status list.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $status_list;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\t$this->status_list = array(\n\t\t\t'archived' => array( 'site-archived', __( 'Archived' ) ),\n\t\t\t'spam'     => array( 'site-spammed', _x( 'Spam', 'site' ) ),\n\t\t\t'deleted'  => array( 'site-deleted', __( 'Deleted' ) ),\n\t\t\t'mature'   => array( 'site-mature', __( 'Mature' ) )\n\t\t);\n\n\t\tparent::__construct( array(\n\t\t\t'plural' => 'sites',\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can( 'manage_sites' );\n\t}\n\n\t/**\n\t *\n\t * @global string $s\n\t * @global string $mode\n\t * @global wpdb   $wpdb\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $s, $mode, $wpdb;\n\n\t\t$current_site = get_current_site();\n\n\t\t$mode = ( empty( $_REQUEST['mode'] ) ) ? 'list' : $_REQUEST['mode'];\n\n\t\t$per_page = $this->get_items_per_page( 'sites_network_per_page' );\n\n\t\t$pagenum = $this->get_pagenum();\n\n\t\t$s = isset( $_REQUEST['s'] ) ? wp_unslash( trim( $_REQUEST[ 's' ] ) ) : '';\n\t\t$wild = '';\n\t\tif ( false !== strpos($s, '*') ) {\n\t\t\t$wild = '%';\n\t\t\t$s = trim($s, '*');\n\t\t}\n\n\t\t/*\n\t\t * If the network is large and a search is not being performed, show only\n\t\t * the latest blogs with no paging in order to avoid expensive count queries.\n\t\t */\n\t\tif ( !$s && wp_is_large_network() ) {\n\t\t\tif ( !isset($_REQUEST['orderby']) )\n\t\t\t\t$_GET['orderby'] = $_REQUEST['orderby'] = '';\n\t\t\tif ( !isset($_REQUEST['order']) )\n\t\t\t\t$_GET['order'] = $_REQUEST['order'] = 'DESC';\n\t\t}\n\n\t\t$query = \"SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' \";\n\n\t\tif ( empty($s) ) {\n\t\t\t// Nothing to do.\n\t\t} elseif ( preg_match( '/^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$/', $s ) ||\n\t\t\t\t\tpreg_match( '/^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.?$/', $s ) ||\n\t\t\t\t\tpreg_match( '/^[0-9]{1,3}\\.[0-9]{1,3}\\.?$/', $s ) ||\n\t\t\t\t\tpreg_match( '/^[0-9]{1,3}\\.$/', $s ) ) {\n\t\t\t// IPv4 address\n\t\t\t$sql = $wpdb->prepare( \"SELECT blog_id FROM {$wpdb->registration_log} WHERE {$wpdb->registration_log}.IP LIKE %s\", $wpdb->esc_like( $s ) . $wild );\n\t\t\t$reg_blog_ids = $wpdb->get_col( $sql );\n\n\t\t\tif ( !$reg_blog_ids )\n\t\t\t\t$reg_blog_ids = array( 0 );\n\n\t\t\t$query = \"SELECT *\n\t\t\t\tFROM {$wpdb->blogs}\n\t\t\t\tWHERE site_id = '{$wpdb->siteid}'\n\t\t\t\tAND {$wpdb->blogs}.blog_id IN (\" . implode( ', ', $reg_blog_ids ) . \")\";\n\t\t} else {\n\t\t\tif ( is_numeric($s) && empty( $wild ) ) {\n\t\t\t\t$query .= $wpdb->prepare( \" AND ( {$wpdb->blogs}.blog_id = %s )\", $s );\n\t\t\t} elseif ( is_subdomain_install() ) {\n\t\t\t\t$blog_s = str_replace( '.' . $current_site->domain, '', $s );\n\t\t\t\t$blog_s = $wpdb->esc_like( $blog_s ) . $wild . $wpdb->esc_like( '.' . $current_site->domain );\n\t\t\t\t$query .= $wpdb->prepare( \" AND ( {$wpdb->blogs}.domain LIKE %s ) \", $blog_s );\n\t\t\t} else {\n\t\t\t\tif ( $s != trim('/', $current_site->path) ) {\n\t\t\t\t\t$blog_s = $wpdb->esc_like( $current_site->path . $s ) . $wild . $wpdb->esc_like( '/' );\n\t\t\t\t} else {\n\t\t\t\t\t$blog_s = $wpdb->esc_like( $s );\n\t\t\t\t}\n\t\t\t\t$query .= $wpdb->prepare( \" AND  ( {$wpdb->blogs}.path LIKE %s )\", $blog_s );\n\t\t\t}\n\t\t}\n\n\t\t$order_by = isset( $_REQUEST['orderby'] ) ? $_REQUEST['orderby'] : '';\n\t\tif ( $order_by === 'registered' ) {\n\t\t\t$query .= ' ORDER BY registered ';\n\t\t} elseif ( $order_by === 'lastupdated' ) {\n\t\t\t$query .= ' ORDER BY last_updated ';\n\t\t} elseif ( $order_by === 'blogname' ) {\n\t\t\tif ( is_subdomain_install() ) {\n\t\t\t\t$query .= ' ORDER BY domain ';\n\t\t\t} else {\n\t\t\t\t$query .= ' ORDER BY path ';\n\t\t\t}\n\t\t} elseif ( $order_by === 'blog_id' ) {\n\t\t\t$query .= ' ORDER BY blog_id ';\n\t\t} else {\n\t\t\t$order_by = null;\n\t\t}\n\n\t\tif ( isset( $order_by ) ) {\n\t\t\t$order = ( isset( $_REQUEST['order'] ) && 'DESC' === strtoupper( $_REQUEST['order'] ) ) ? \"DESC\" : \"ASC\";\n\t\t\t$query .= $order;\n\t\t}\n\n\t\t// Don't do an unbounded count on large networks\n\t\tif ( ! wp_is_large_network() )\n\t\t\t$total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );\n\n\t\t$query .= \" LIMIT \" . intval( ( $pagenum - 1 ) * $per_page ) . \", \" . intval( $per_page );\n\t\t$this->items = $wpdb->get_results( $query, ARRAY_A );\n\n\t\tif ( wp_is_large_network() )\n\t\t\t$total = count($this->items);\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $total,\n\t\t\t'per_page' => $per_page,\n\t\t) );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\t_e( 'No sites found.' );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\t$actions = array();\n\t\tif ( current_user_can( 'delete_sites' ) )\n\t\t\t$actions['delete'] = __( 'Delete' );\n\t\t$actions['spam'] = _x( 'Mark as Spam', 'site' );\n\t\t$actions['notspam'] = _x( 'Not Spam', 'site' );\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t * @global string $mode\n\t *\n\t * @param string $which\n\t */\n\tprotected function pagination( $which ) {\n\t\tglobal $mode;\n\n\t\tparent::pagination( $which );\n\n\t\tif ( 'top' === $which )\n\t\t\t$this->view_switcher( $mode );\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\t$sites_columns = array(\n\t\t\t'cb'          => '<input type=\"checkbox\" />',\n\t\t\t'blogname'    => __( 'URL' ),\n\t\t\t'lastupdated' => __( 'Last Updated' ),\n\t\t\t'registered'  => _x( 'Registered', 'site' ),\n\t\t\t'users'       => __( 'Users' ),\n\t\t);\n\n\t\tif ( has_filter( 'wpmublogsaction' ) ) {\n\t\t\t$sites_columns['plugins'] = __( 'Actions' );\n\t\t}\n\n\t\t/**\n\t\t * Filter the displayed site columns in Sites list table.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param array $sites_columns An array of displayed site columns. Default 'cb',\n\t\t *                             'blogname', 'lastupdated', 'registered', 'users'.\n\t\t */\n\t\treturn apply_filters( 'wpmu_blogs_columns', $sites_columns );\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array(\n\t\t\t'blogname'    => 'blogname',\n\t\t\t'lastupdated' => 'lastupdated',\n\t\t\t'registered'  => 'blog_id',\n\t\t);\n\t}\n\n\t/**\n\t * Handles the checkbox column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $blog Current site.\n\t */\n\tpublic function column_cb( $blog ) {\n\t\tif ( ! is_main_site( $blog['blog_id'] ) ) :\n\t\t\t$blogname = untrailingslashit( $blog['domain'] . $blog['path'] );\n\t\t?>\n\t\t\t<label class=\"screen-reader-text\" for=\"blog_<?php echo $blog['blog_id']; ?>\"><?php\n\t\t\t\tprintf( __( 'Select %s' ), $blogname );\n\t\t\t?></label>\n\t\t\t<input type=\"checkbox\" id=\"blog_<?php echo $blog['blog_id'] ?>\" name=\"allblogs[]\" value=\"<?php echo esc_attr( $blog['blog_id'] ) ?>\" />\n\t\t<?php endif;\n\t}\n\n\t/**\n\t * Handles the ID column output.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $blog Current site.\n\t */\n\tpublic function column_id( $blog ) {\n\t\techo $blog['blog_id'];\n\t}\n\n\t/**\n\t * Handles the blogname column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @global string $mode\n\t *\n\t * @param array $blog Current blog.\n\t */\n\tpublic function column_blogname( $blog ) {\n\t\tglobal $mode;\n\n\t\t$blogname = untrailingslashit( $blog['domain'] . $blog['path'] );\n\t\t$blog_states = array();\n\t\treset( $this->status_list );\n\n\t\tforeach ( $this->status_list as $status => $col ) {\n\t\t\tif ( $blog[ $status ] == 1 ) {\n\t\t\t\t$blog_states[] = $col[1];\n\t\t\t}\n\t\t}\n\t\t$blog_state = '';\n\t\tif ( ! empty( $blog_states ) ) {\n\t\t\t$state_count = count( $blog_states );\n\t\t\t$i = 0;\n\t\t\t$blog_state .= ' - ';\n\t\t\tforeach ( $blog_states as $state ) {\n\t\t\t\t++$i;\n\t\t\t\t$sep = ( $i == $state_count ) ? '' : ', ';\n\t\t\t\t$blog_state .= \"<span class='post-state'>$state$sep</span>\";\n\t\t\t}\n\t\t}\n\n\t\t?>\n\t\t<a href=\"<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>\" class=\"edit\"><?php echo $blogname . $blog_state; ?></a>\n\t\t<?php\n\t\tif ( 'list' !== $mode ) {\n\t\t\tswitch_to_blog( $blog['blog_id'] );\n\t\t\t/* translators: 1: site name, 2: site tagline. */\n\t\t\techo '<p>' . sprintf( __( '%1$s &#8211; <em>%2$s</em>' ), get_option( 'blogname' ), get_option( 'blogdescription ' ) ) . '</p>';\n\t\t\trestore_current_blog();\n\t\t}\n\t}\n\n\t/**\n\t * Handles the lastupdated column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $blog Current site.\n\t */\n\tpublic function column_lastupdated( $blog ) {\n\t\tglobal $mode;\n\n\t\tif ( 'list' === $mode ) {\n\t\t\t$date = __( 'Y/m/d' );\n\t\t} else {\n\t\t\t$date = __( 'Y/m/d g:i:s a' );\n\t\t}\n\n\t\techo ( $blog['last_updated'] === '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] );\n\t}\n\n\t/**\n\t * Handles the registered column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $blog Current site.\n\t */\n\tpublic function column_registered( $blog ) {\n\t\tglobal $mode;\n\n\t\tif ( 'list' === $mode ) {\n\t\t\t$date = __( 'Y/m/d' );\n\t\t} else {\n\t\t\t$date = __( 'Y/m/d g:i:s a' );\n\t\t}\n\n\t\tif ( $blog['registered'] === '0000-00-00 00:00:00' ) {\n\t\t\techo '&#x2014;';\n\t\t} else {\n\t\t\techo mysql2date( $date, $blog['registered'] );\n\t\t}\n\t}\n\n\t/**\n\t * Handles the users column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $blog Current site.\n\t */\n\tpublic function column_users( $blog ) {\n\t\t$user_count = wp_cache_get( $blog['blog_id'] . '_user_count', 'blog-details' );\n\t\tif ( ! $user_count ) {\n\t\t\t$blog_users = get_users( array( 'blog_id' => $blog['blog_id'], 'fields' => 'ID' ) );\n\t\t\t$user_count = count( $blog_users );\n\t\t\tunset( $blog_users );\n\t\t\twp_cache_set( $blog['blog_id'] . '_user_count', $user_count, 'blog-details', 12 * HOUR_IN_SECONDS );\n\t\t}\n\n\t\tprintf(\n\t\t\t'<a href=\"%s\">%s</a>',\n\t\t\tesc_url( network_admin_url( 'site-users.php?id=' . $blog['blog_id'] ) ),\n\t\t\tnumber_format_i18n( $user_count )\n\t\t);\n\t}\n\n\t/**\n\t * Handles the plugins column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $blog Current site.\n\t */\n\tpublic function column_plugins( $blog ) {\n\t\tif ( has_filter( 'wpmublogsaction' ) ) {\n\t\t\t/**\n\t\t\t * Fires inside the auxiliary 'Actions' column of the Sites list table.\n\t\t\t *\n\t\t\t * By default this column is hidden unless something is hooked to the action.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param int $blog_id The site ID.\n\t\t\t */\n\t\t\tdo_action( 'wpmublogsaction', $blog['blog_id'] );\n\t\t}\n\t}\n\n\t/**\n\t * Handles output for the default column.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array  $blog        Current site.\n\t * @param string $column_name Current column name.\n\t */\n\tpublic function column_default( $blog, $column_name ) {\n\t\t/**\n\t\t * Fires for each registered custom column in the Sites list table.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param string $column_name The name of the column to display.\n\t\t * @param int    $blog_id     The site ID.\n\t\t */\n\t\tdo_action( 'manage_sites_custom_column', $column_name, $blog['blog_id'] );\n\t}\n\n\t/**\n\t *\n\t * @global string $mode\n\t */\n\tpublic function display_rows() {\n\t\tforeach ( $this->items as $blog ) {\n\t\t\t$class = '';\n\t\t\treset( $this->status_list );\n\n\t\t\tforeach ( $this->status_list as $status => $col ) {\n\t\t\t\tif ( $blog[ $status ] == 1 ) {\n\t\t\t\t\t$class = \" class='{$col[0]}'\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\techo \"<tr{$class}>\";\n\n\t\t\t$this->single_row_columns( $blog );\n\n\t\t\techo '</tr>';\n\t\t}\n\t}\n\n\t/**\n\t * Gets the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, 'blogname'.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\treturn 'blogname';\n\t}\n\n\t/**\n\t * Generates and displays row action links.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param object $blog        Blog being acted upon.\n\t * @param string $column_name Current column name.\n\t * @param string $primary     Primary column name.\n\t * @return string Row actions output.\n\t */\n\tprotected function handle_row_actions( $blog, $column_name, $primary ) {\n\t\tif ( $primary !== $column_name ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$blogname = untrailingslashit( $blog['domain'] . $blog['path'] );\n\n\t\t// Preordered.\n\t\t$actions = array(\n\t\t\t'edit' => '', 'backend' => '',\n\t\t\t'activate' => '', 'deactivate' => '',\n\t\t\t'archive' => '', 'unarchive' => '',\n\t\t\t'spam' => '', 'unspam' => '',\n\t\t\t'delete' => '',\n\t\t\t'visit' => '',\n\t\t);\n\n\t\t$actions['edit']\t= '<a href=\"' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '\">' . __( 'Edit' ) . '</a>';\n\t\t$actions['backend']\t= \"<a href='\" . esc_url( get_admin_url( $blog['blog_id'] ) ) . \"' class='edit'>\" . __( 'Dashboard' ) . '</a>';\n\t\tif ( get_current_site()->blog_id != $blog['blog_id'] ) {\n\t\t\tif ( $blog['deleted'] == '1' ) {\n\t\t\t\t$actions['activate']   = '<a href=\"' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=activateblog&amp;id=' . $blog['blog_id'] ), 'activateblog_' . $blog['blog_id'] ) ) . '\">' . __( 'Activate' ) . '</a>';\n\t\t\t} else {\n\t\t\t\t$actions['deactivate'] = '<a href=\"' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=deactivateblog&amp;id=' . $blog['blog_id'] ), 'deactivateblog_' . $blog['blog_id'] ) ) . '\">' . __( 'Deactivate' ) . '</a>';\n\t\t\t}\n\n\t\t\tif ( $blog['archived'] == '1' ) {\n\t\t\t\t$actions['unarchive'] = '<a href=\"' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=unarchiveblog&amp;id=' . $blog['blog_id'] ), 'unarchiveblog_' . $blog['blog_id'] ) ) . '\">' . __( 'Unarchive' ) . '</a>';\n\t\t\t} else {\n\t\t\t\t$actions['archive']   = '<a href=\"' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=archiveblog&amp;id=' . $blog['blog_id'] ), 'archiveblog_' . $blog['blog_id'] ) ) . '\">' . _x( 'Archive', 'verb; site' ) . '</a>';\n\t\t\t}\n\n\t\t\tif ( $blog['spam'] == '1' ) {\n\t\t\t\t$actions['unspam'] = '<a href=\"' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=unspamblog&amp;id=' . $blog['blog_id'] ), 'unspamblog_' . $blog['blog_id'] ) ) . '\">' . _x( 'Not Spam', 'site' ) . '</a>';\n\t\t\t} else {\n\t\t\t\t$actions['spam']   = '<a href=\"' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=spamblog&amp;id=' . $blog['blog_id'] ), 'spamblog_' . $blog['blog_id'] ) ) . '\">' . _x( 'Spam', 'site' ) . '</a>';\n\t\t\t}\n\n\t\t\tif ( current_user_can( 'delete_site', $blog['blog_id'] ) ) {\n\t\t\t\t$actions['delete'] = '<a href=\"' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=deleteblog&amp;id=' . $blog['blog_id'] ), 'deleteblog_' . $blog['blog_id'] ) ) . '\">' . __( 'Delete' ) . '</a>';\n\t\t\t}\n\t\t}\n\n\t\t$actions['visit']\t= \"<a href='\" . esc_url( get_home_url( $blog['blog_id'], '/' ) ) . \"' rel='permalink'>\" . __( 'Visit' ) . '</a>';\n\n\t\t/**\n\t\t * Filter the action links displayed for each site in the Sites list table.\n\t\t *\n\t\t * The 'Edit', 'Dashboard', 'Delete', and 'Visit' links are displayed by\n\t\t * default for each site. The site's status determines whether to show the\n\t\t * 'Activate' or 'Deactivate' link, 'Unarchive' or 'Archive' links, and\n\t\t * 'Not Spam' or 'Spam' link for each site.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array  $actions  An array of action links to be displayed.\n\t\t * @param int    $blog_id  The site ID.\n\t\t * @param string $blogname Site path, formatted depending on whether it is a sub-domain\n\t\t *                         or subdirectory multisite install.\n\t\t */\n\t\t$actions = apply_filters( 'manage_sites_action_links', array_filter( $actions ), $blog['blog_id'], $blogname );\n\t\treturn $this->row_actions( $actions );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-ms-themes-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_MS_Themes_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying themes in a list table for the network admin.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_MS_Themes_List_Table extends WP_List_Table {\n\n\tpublic $site_id;\n\tpublic $is_site_themes;\n\n\tprivate $has_items;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @global string $status\n\t * @global int    $page\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\tglobal $status, $page;\n\n\t\tparent::__construct( array(\n\t\t\t'plural' => 'themes',\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\n\t\t$status = isset( $_REQUEST['theme_status'] ) ? $_REQUEST['theme_status'] : 'all';\n\t\tif ( !in_array( $status, array( 'all', 'enabled', 'disabled', 'upgrade', 'search', 'broken' ) ) )\n\t\t\t$status = 'all';\n\n\t\t$page = $this->get_pagenum();\n\n\t\t$this->is_site_themes = ( 'site-themes-network' === $this->screen->id ) ? true : false;\n\n\t\tif ( $this->is_site_themes )\n\t\t\t$this->site_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0;\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_table_classes() {\n\t\t// todo: remove and add CSS for .themes\n\t\treturn array( 'widefat', 'plugins' );\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\tif ( $this->is_site_themes )\n\t\t\treturn current_user_can( 'manage_sites' );\n\t\telse\n\t\t\treturn current_user_can( 'manage_network_themes' );\n\t}\n\n\t/**\n\t *\n\t * @global string $status\n\t * @global array $totals\n\t * @global int $page\n\t * @global string $orderby\n\t * @global string $order\n\t * @global string $s\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $status, $totals, $page, $orderby, $order, $s;\n\n\t\twp_reset_vars( array( 'orderby', 'order', 's' ) );\n\n\t\t$themes = array(\n\t\t\t/**\n\t\t\t * Filter the full array of WP_Theme objects to list in the Multisite\n\t\t\t * themes list table.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param array $all An array of WP_Theme objects to display in the list table.\n\t\t\t */\n\t\t\t'all' => apply_filters( 'all_themes', wp_get_themes() ),\n\t\t\t'search' => array(),\n\t\t\t'enabled' => array(),\n\t\t\t'disabled' => array(),\n\t\t\t'upgrade' => array(),\n\t\t\t'broken' => $this->is_site_themes ? array() : wp_get_themes( array( 'errors' => true ) ),\n\t\t);\n\n\t\tif ( $this->is_site_themes ) {\n\t\t\t$themes_per_page = $this->get_items_per_page( 'site_themes_network_per_page' );\n\t\t\t$allowed_where = 'site';\n\t\t} else {\n\t\t\t$themes_per_page = $this->get_items_per_page( 'themes_network_per_page' );\n\t\t\t$allowed_where = 'network';\n\t\t}\n\n\t\t$maybe_update = current_user_can( 'update_themes' ) && ! $this->is_site_themes && $current = get_site_transient( 'update_themes' );\n\n\t\tforeach ( (array) $themes['all'] as $key => $theme ) {\n\t\t\tif ( $this->is_site_themes && $theme->is_allowed( 'network' ) ) {\n\t\t\t\tunset( $themes['all'][ $key ] );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( $maybe_update && isset( $current->response[ $key ] ) ) {\n\t\t\t\t$themes['all'][ $key ]->update = true;\n\t\t\t\t$themes['upgrade'][ $key ] = $themes['all'][ $key ];\n\t\t\t}\n\n\t\t\t$filter = $theme->is_allowed( $allowed_where, $this->site_id ) ? 'enabled' : 'disabled';\n\t\t\t$themes[ $filter ][ $key ] = $themes['all'][ $key ];\n\t\t}\n\n\t\tif ( $s ) {\n\t\t\t$status = 'search';\n\t\t\t$themes['search'] = array_filter( array_merge( $themes['all'], $themes['broken'] ), array( $this, '_search_callback' ) );\n\t\t}\n\n\t\t$totals = array();\n\t\tforeach ( $themes as $type => $list )\n\t\t\t$totals[ $type ] = count( $list );\n\n\t\tif ( empty( $themes[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )\n\t\t\t$status = 'all';\n\n\t\t$this->items = $themes[ $status ];\n\t\tWP_Theme::sort_by_name( $this->items );\n\n\t\t$this->has_items = ! empty( $themes['all'] );\n\t\t$total_this_page = $totals[ $status ];\n\n\t\tif ( $orderby ) {\n\t\t\t$orderby = ucfirst( $orderby );\n\t\t\t$order = strtoupper( $order );\n\n\t\t\tif ( $orderby === 'Name' ) {\n\t\t\t\tif ( 'ASC' === $order ) {\n\t\t\t\t\t$this->items = array_reverse( $this->items );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tuasort( $this->items, array( $this, '_order_callback' ) );\n\t\t\t}\n\t\t}\n\n\t\t$start = ( $page - 1 ) * $themes_per_page;\n\n\t\tif ( $total_this_page > $themes_per_page )\n\t\t\t$this->items = array_slice( $this->items, $start, $themes_per_page, true );\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $total_this_page,\n\t\t\t'per_page' => $themes_per_page,\n\t\t) );\n\t}\n\n\t/**\n\t * @staticvar string $term\n\t * @param WP_Theme $theme\n\t * @return bool\n\t */\n\tpublic function _search_callback( $theme ) {\n\t\tstatic $term = null;\n\t\tif ( is_null( $term ) )\n\t\t\t$term = wp_unslash( $_REQUEST['s'] );\n\n\t\tforeach ( array( 'Name', 'Description', 'Author', 'Author', 'AuthorURI' ) as $field ) {\n\t\t\t// Don't mark up; Do translate.\n\t\t\tif ( false !== stripos( $theme->display( $field, false, true ), $term ) )\n\t\t\t\treturn true;\n\t\t}\n\n\t\tif ( false !== stripos( $theme->get_stylesheet(), $term ) )\n\t\t\treturn true;\n\n\t\tif ( false !== stripos( $theme->get_template(), $term ) )\n\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\t// Not used by any core columns.\n\t/**\n\t * @global string $orderby\n\t * @global string $order\n\t * @param array $theme_a\n\t * @param array $theme_b\n\t * @return int\n\t */\n\tpublic function _order_callback( $theme_a, $theme_b ) {\n\t\tglobal $orderby, $order;\n\n\t\t$a = $theme_a[ $orderby ];\n\t\t$b = $theme_b[ $orderby ];\n\n\t\tif ( $a == $b )\n\t\t\treturn 0;\n\n\t\tif ( 'DESC' === $order )\n\t\t\treturn ( $a < $b ) ? 1 : -1;\n\t\telse\n\t\t\treturn ( $a < $b ) ? -1 : 1;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\tif ( $this->has_items ) {\n\t\t\t_e( 'No themes found.' );\n\t\t} else {\n\t\t\t_e( 'You do not appear to have any themes available at this time.' );\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\treturn array(\n\t\t\t'cb'          => '<input type=\"checkbox\" />',\n\t\t\t'name'        => __( 'Theme' ),\n\t\t\t'description' => __( 'Description' ),\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array(\n\t\t\t'name'         => 'name',\n\t\t);\n\t}\n\n\t/**\n\t * Gets the name of the primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Unalterable name of the primary column name, in this case, 'name'.\n\t */\n\tprotected function get_primary_column_name() {\n\t\treturn 'name';\n\t}\n\n\t/**\n\t *\n\t * @global array $totals\n\t * @global string $status\n\t * @return array\n\t */\n\tprotected function get_views() {\n\t\tglobal $totals, $status;\n\n\t\t$status_links = array();\n\t\tforeach ( $totals as $type => $count ) {\n\t\t\tif ( !$count )\n\t\t\t\tcontinue;\n\n\t\t\tswitch ( $type ) {\n\t\t\t\tcase 'all':\n\t\t\t\t\t$text = _nx( 'All <span class=\"count\">(%s)</span>', 'All <span class=\"count\">(%s)</span>', $count, 'themes' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'enabled':\n\t\t\t\t\t$text = _n( 'Enabled <span class=\"count\">(%s)</span>', 'Enabled <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'disabled':\n\t\t\t\t\t$text = _n( 'Disabled <span class=\"count\">(%s)</span>', 'Disabled <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'upgrade':\n\t\t\t\t\t$text = _n( 'Update Available <span class=\"count\">(%s)</span>', 'Update Available <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'broken' :\n\t\t\t\t\t$text = _n( 'Broken <span class=\"count\">(%s)</span>', 'Broken <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ( $this->is_site_themes )\n\t\t\t\t$url = 'site-themes.php?id=' . $this->site_id;\n\t\t\telse\n\t\t\t\t$url = 'themes.php';\n\n\t\t\tif ( 'search' != $type ) {\n\t\t\t\t$status_links[$type] = sprintf( \"<a href='%s' %s>%s</a>\",\n\t\t\t\t\tesc_url( add_query_arg('theme_status', $type, $url) ),\n\t\t\t\t\t( $type === $status ) ? ' class=\"current\"' : '',\n\t\t\t\t\tsprintf( $text, number_format_i18n( $count ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn $status_links;\n\t}\n\n\t/**\n\t * @global string $status\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\tglobal $status;\n\n\t\t$actions = array();\n\t\tif ( 'enabled' != $status )\n\t\t\t$actions['enable-selected'] = $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' );\n\t\tif ( 'disabled' != $status )\n\t\t\t$actions['disable-selected'] = $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' );\n\t\tif ( ! $this->is_site_themes ) {\n\t\t\tif ( current_user_can( 'update_themes' ) )\n\t\t\t\t$actions['update-selected'] = __( 'Update' );\n\t\t\tif ( current_user_can( 'delete_themes' ) )\n\t\t\t\t$actions['delete-selected'] = __( 'Delete' );\n\t\t}\n\t\treturn $actions;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function display_rows() {\n\t\tforeach ( $this->items as $theme )\n\t\t\t$this->single_row( $theme );\n\t}\n\n\t/**\n\t * Handles the checkbox column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Theme $theme The current WP_Theme object.\n\t */\n\tpublic function column_cb( $theme ) {\n\t\t$checkbox_id = 'checkbox_' . md5( $theme->get('Name') );\n\t\t?>\n\t\t<input type=\"checkbox\" name=\"checked[]\" value=\"<?php echo esc_attr( $theme->get_stylesheet() ) ?>\" id=\"<?php echo $checkbox_id ?>\" />\n\t\t<label class=\"screen-reader-text\" for=\"<?php echo $checkbox_id ?>\" ><?php _e( 'Select' ) ?>  <?php echo $theme->display( 'Name' ) ?></label>\n\t\t<?php\n\t}\n\n\t/**\n\t * Handles the name column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @global string $status\n\t * @global int    $page\n\t * @global string $s\n\t *\n\t * @param WP_Theme $theme The current WP_Theme object.\n\t */\n\tpublic function column_name( $theme ) {\n\t\tglobal $status, $page, $s;\n\n\t\t$context = $status;\n\n\t\tif ( $this->is_site_themes ) {\n\t\t\t$url = \"site-themes.php?id={$this->site_id}&amp;\";\n\t\t\t$allowed = $theme->is_allowed( 'site', $this->site_id );\n\t\t} else {\n\t\t\t$url = 'themes.php?';\n\t\t\t$allowed = $theme->is_allowed( 'network' );\n\t\t}\n\n\t\t// Pre-order.\n\t\t$actions = array(\n\t\t\t'enable' => '',\n\t\t\t'disable' => '',\n\t\t\t'edit' => '',\n\t\t\t'delete' => ''\n\t\t);\n\n\t\t$stylesheet = $theme->get_stylesheet();\n\t\t$theme_key = urlencode( $stylesheet );\n\n\t\tif ( ! $allowed ) {\n\t\t\tif ( ! $theme->errors() ) {\n\t\t\t\t$actions['enable'] = '<a href=\"' . esc_url( wp_nonce_url($url . 'action=enable&amp;theme=' . $theme_key . '&amp;paged=' . $page . '&amp;s=' . $s, 'enable-theme_' . $stylesheet ) ) . '\" title=\"' . esc_attr__('Enable this theme') . '\" class=\"edit\">' . ( $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' ) ) . '</a>';\n\t\t\t}\n\t\t} else {\n\t\t\t$actions['disable'] = '<a href=\"' . esc_url( wp_nonce_url($url . 'action=disable&amp;theme=' . $theme_key . '&amp;paged=' . $page . '&amp;s=' . $s, 'disable-theme_' . $stylesheet ) ) . '\" title=\"' . esc_attr__('Disable this theme') . '\">' . ( $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' ) ) . '</a>';\n\t\t}\n\n\t\tif ( current_user_can('edit_themes') ) {\n\t\t\t$actions['edit'] = '<a href=\"' . esc_url('theme-editor.php?theme=' . $theme_key ) . '\" title=\"' . esc_attr__('Open this theme in the Theme Editor') . '\" class=\"edit\">' . __('Edit') . '</a>';\n\t\t}\n\n\t\tif ( ! $allowed && current_user_can( 'delete_themes' ) && ! $this->is_site_themes && $stylesheet != get_option( 'stylesheet' ) && $stylesheet != get_option( 'template' ) ) {\n\t\t\t$actions['delete'] = '<a href=\"' . esc_url( wp_nonce_url( 'themes.php?action=delete-selected&amp;checked[]=' . $theme_key . '&amp;theme_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-themes' ) ) . '\" title=\"' . esc_attr__( 'Delete this theme' ) . '\" class=\"delete\">' . __( 'Delete' ) . '</a>';\n\t\t}\n\t\t/**\n\t\t * Filter the action links displayed for each theme in the Multisite\n\t\t * themes list table.\n\t\t *\n\t\t * The action links displayed are determined by the theme's status, and\n\t\t * which Multisite themes list table is being displayed - the Network\n\t\t * themes list table (themes.php), which displays all installed themes,\n\t\t * or the Site themes list table (site-themes.php), which displays the\n\t\t * non-network enabled themes when editing a site in the Network admin.\n\t\t *\n\t\t * The default action links for the Network themes list table include\n\t\t * 'Network Enable', 'Network Disable', 'Edit', and 'Delete'.\n\t\t *\n\t\t * The default action links for the Site themes list table include\n\t\t * 'Enable', 'Disable', and 'Edit'.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array    $actions An array of action links.\n\t\t * @param WP_Theme $theme   The current WP_Theme object.\n\t\t * @param string   $context Status of the theme.\n\t\t */\n\t\t$actions = apply_filters( 'theme_action_links', array_filter( $actions ), $theme, $context );\n\n\t\t/**\n\t\t * Filter the action links of a specific theme in the Multisite themes\n\t\t * list table.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$stylesheet`, refers to the\n\t\t * directory name of the theme, which in most cases is synonymous\n\t\t * with the template name.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array    $actions An array of action links.\n\t\t * @param WP_Theme $theme   The current WP_Theme object.\n\t\t * @param string   $context Status of the theme.\n\t\t */\n\t\t$actions = apply_filters( \"theme_action_links_$stylesheet\", $actions, $theme, $context );\n\n\t\techo $this->row_actions( $actions, true );\n\t}\n\n\t/**\n\t * Handles the description column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @global string $status\n\t * @global array  $totals\n\t *\n\t * @param WP_Theme $theme The current WP_Theme object.\n\t */\n\tpublic function column_description( $theme ) {\n\t\tglobal $status, $totals;\n\t\tif ( $theme->errors() ) {\n\t\t\t$pre = $status === 'broken' ? __( 'Broken Theme:' ) . ' ' : '';\n\t\t\techo '<p><strong class=\"error-message\">' . $pre . $theme->errors()->get_error_message() . '</strong></p>';\n\t\t}\n\n\t\tif ( $this->is_site_themes ) {\n\t\t\t$allowed = $theme->is_allowed( 'site', $this->site_id );\n\t\t} else {\n\t\t\t$allowed = $theme->is_allowed( 'network' );\n\t\t}\n\n\t\t$class = ! $allowed ? 'inactive' : 'active';\n\t\tif ( ! empty( $totals['upgrade'] ) && ! empty( $theme->update ) )\n\t\t\t$class .= ' update';\n\n\t\techo \"<div class='theme-description'><p>\" . $theme->display( 'Description' ) . \"</p></div>\n\t\t\t<div class='$class second theme-version-author-uri'>\";\n\n\t\t$stylesheet = $theme->get_stylesheet();\n\t\t$theme_meta = array();\n\n\t\tif ( $theme->get('Version') ) {\n\t\t\t$theme_meta[] = sprintf( __( 'Version %s' ), $theme->display('Version') );\n\t\t}\n\t\t$theme_meta[] = sprintf( __( 'By %s' ), $theme->display('Author') );\n\n\t\tif ( $theme->get('ThemeURI') ) {\n\t\t\t$theme_meta[] = '<a href=\"' . $theme->display('ThemeURI') . '\" title=\"' . esc_attr__( 'Visit theme homepage' ) . '\">' . __( 'Visit Theme Site' ) . '</a>';\n\t\t}\n\t\t/**\n\t\t * Filter the array of row meta for each theme in the Multisite themes\n\t\t * list table.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array    $theme_meta An array of the theme's metadata,\n\t\t *                             including the version, author, and\n\t\t *                             theme URI.\n\t\t * @param string   $stylesheet Directory name of the theme.\n\t\t * @param WP_Theme $theme      WP_Theme object.\n\t\t * @param string   $status     Status of the theme.\n\t\t */\n\t\t$theme_meta = apply_filters( 'theme_row_meta', $theme_meta, $stylesheet, $theme, $status );\n\t\techo implode( ' | ', $theme_meta );\n\n\t\techo '</div>';\n\t}\n\n\t/**\n\t * Handles default column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Theme $theme       The current WP_Theme object.\n\t * @param string   $column_name The current column name.\n\t */\n\tpublic function column_default( $theme, $column_name ) {\n\t\t$stylesheet = $theme->get_stylesheet();\n\n\t\t/**\n\t\t * Fires inside each custom column of the Multisite themes list table.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param string   $column_name Name of the column.\n\t\t * @param string   $stylesheet  Directory name of the theme.\n\t\t * @param WP_Theme $theme       Current WP_Theme object.\n\t\t */\n\t\tdo_action( 'manage_themes_custom_column', $column_name, $stylesheet, $theme );\n\t}\n\n\t/**\n\t * Handles the output for a single table row.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Theme $item The current WP_Theme object.\n\t */\n\tpublic function single_row_columns( $item ) {\n\t\tlist( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();\n\n\t\tforeach ( $columns as $column_name => $column_display_name ) {\n\t\t\t$extra_classes = '';\n\t\t\tif ( in_array( $column_name, $hidden ) ) {\n\t\t\t\t$extra_classes .= ' hidden';\n\t\t\t}\n\n\t\t\tswitch ( $column_name ) {\n\t\t\t\tcase 'cb':\n\t\t\t\t\techo '<th scope=\"row\" class=\"check-column\">';\n\n\t\t\t\t\t$this->column_cb( $item );\n\n\t\t\t\t\techo '</th>';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'name':\n\t\t\t\t\techo \"<td class='theme-title column-primary{$extra_classes}'><strong>\" . $item->display('Name') . \"</strong>\";\n\n\t\t\t\t\t$this->column_name( $item );\n\n\t\t\t\t\techo \"</td>\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'description':\n\t\t\t\t\techo \"<td class='column-description desc{$extra_classes}'>\";\n\n\t\t\t\t\t$this->column_description( $item );\n\n\t\t\t\t\techo '</td>';\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\techo \"<td class='$column_name column-$column_name{$extra_classes}'>\";\n\n\t\t\t\t\t$this->column_default( $item, $column_name );\n\n\t\t\t\t\techo \"</td>\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @global string $status\n\t * @global array  $totals\n\t *\n\t * @param WP_Theme $theme\n\t */\n\tpublic function single_row( $theme ) {\n\t\tglobal $status, $totals;\n\n\t\tif ( $this->is_site_themes ) {\n\t\t\t$allowed = $theme->is_allowed( 'site', $this->site_id );\n\t\t} else {\n\t\t\t$allowed = $theme->is_allowed( 'network' );\n\t\t}\n\n\t\t$stylesheet = $theme->get_stylesheet();\n\n\t\t$class = ! $allowed ? 'inactive' : 'active';\n\n\t\t$id = sanitize_html_class( $theme->get_stylesheet() );\n\n\t\tif ( ! empty( $totals['upgrade'] ) && ! empty( $theme->update ) ) {\n\t\t\t$class .= ' update';\n\t\t}\n\n\t\techo \"<tr id='$id' class='$class'>\";\n\n\t\t$this->single_row_columns( $theme );\n\n\t\techo \"</tr>\";\n\n\t\tif ( $this->is_site_themes )\n\t\t\tremove_action( \"after_theme_row_$stylesheet\", 'wp_theme_update_row' );\n\n\t\t/**\n\t\t * Fires after each row in the Multisite themes list table.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param string   $stylesheet Directory name of the theme.\n\t\t * @param WP_Theme $theme      Current WP_Theme object.\n\t\t * @param string   $status     Status of the theme.\n\t\t */\n\t\tdo_action( 'after_theme_row', $stylesheet, $theme, $status );\n\n\t\t/**\n\t\t * Fires after each specific row in the Multisite themes list table.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$stylesheet`, refers to the\n\t\t * directory name of the theme, most often synonymous with the template\n\t\t * name of the theme.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param string   $stylesheet Directory name of the theme.\n\t\t * @param WP_Theme $theme      Current WP_Theme object.\n\t\t * @param string   $status     Status of the theme.\n\t\t */\n\t\tdo_action( \"after_theme_row_$stylesheet\", $stylesheet, $theme, $status );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-ms-users-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_MS_Users_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying users in a list table for the network admin.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_MS_Users_List_Table extends WP_List_Table {\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can( 'manage_network_users' );\n\t}\n\n\t/**\n\t *\n\t * @global string $usersearch\n\t * @global string $role\n\t * @global wpdb   $wpdb\n\t * @global string $mode\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $usersearch, $role, $wpdb, $mode;\n\n\t\t$usersearch = isset( $_REQUEST['s'] ) ? wp_unslash( trim( $_REQUEST['s'] ) ) : '';\n\n\t\t$users_per_page = $this->get_items_per_page( 'users_network_per_page' );\n\n\t\t$role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';\n\n\t\t$paged = $this->get_pagenum();\n\n\t\t$args = array(\n\t\t\t'number' => $users_per_page,\n\t\t\t'offset' => ( $paged-1 ) * $users_per_page,\n\t\t\t'search' => $usersearch,\n\t\t\t'blog_id' => 0,\n\t\t\t'fields' => 'all_with_meta'\n\t\t);\n\n\t\tif ( wp_is_large_network( 'users' ) ) {\n\t\t\t$args['search'] = ltrim( $args['search'], '*' );\n\t\t} else if ( '' !== $args['search'] ) {\n\t\t\t$args['search'] = trim( $args['search'], '*' );\n\t\t\t$args['search'] = '*' . $args['search'] . '*';\n\t\t}\n\n\t\tif ( $role === 'super' ) {\n\t\t\t$logins = implode( \"', '\", get_super_admins() );\n\t\t\t$args['include'] = $wpdb->get_col( \"SELECT ID FROM $wpdb->users WHERE user_login IN ('$logins')\" );\n\t\t}\n\n\t\t/*\n\t\t * If the network is large and a search is not being performed,\n\t\t * show only the latest users with no paging in order to avoid\n\t\t * expensive count queries.\n\t\t */\n\t\tif ( !$usersearch && wp_is_large_network( 'users' ) ) {\n\t\t\tif ( !isset($_REQUEST['orderby']) )\n\t\t\t\t$_GET['orderby'] = $_REQUEST['orderby'] = 'id';\n\t\t\tif ( !isset($_REQUEST['order']) )\n\t\t\t\t$_GET['order'] = $_REQUEST['order'] = 'DESC';\n\t\t\t$args['count_total'] = false;\n\t\t}\n\n\t\tif ( isset( $_REQUEST['orderby'] ) )\n\t\t\t$args['orderby'] = $_REQUEST['orderby'];\n\n\t\tif ( isset( $_REQUEST['order'] ) )\n\t\t\t$args['order'] = $_REQUEST['order'];\n\n\t\t$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];\n\n\t\t/** This filter is documented in wp-admin/includes/class-wp-users-list-table.php */\n\t\t$args = apply_filters( 'users_list_table_query_args', $args );\n\n\t\t// Query the user IDs for this page\n\t\t$wp_user_search = new WP_User_Query( $args );\n\n\t\t$this->items = $wp_user_search->get_results();\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $wp_user_search->get_total(),\n\t\t\t'per_page' => $users_per_page,\n\t\t) );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\t$actions = array();\n\t\tif ( current_user_can( 'delete_users' ) )\n\t\t\t$actions['delete'] = __( 'Delete' );\n\t\t$actions['spam'] = _x( 'Mark as Spam', 'user' );\n\t\t$actions['notspam'] = _x( 'Not Spam', 'user' );\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\t_e( 'No users found.' );\n\t}\n\n\t/**\n\t *\n\t * @global string $role\n\t * @return array\n\t */\n\tprotected function get_views() {\n\t\tglobal $role;\n\n\t\t$total_users = get_user_count();\n\t\t$super_admins = get_super_admins();\n\t\t$total_admins = count( $super_admins );\n\n\t\t$class = $role != 'super' ? ' class=\"current\"' : '';\n\t\t$role_links = array();\n\t\t$role_links['all'] = \"<a href='\" . network_admin_url('users.php') . \"'$class>\" . sprintf( _nx( 'All <span class=\"count\">(%s)</span>', 'All <span class=\"count\">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';\n\t\t$class = $role === 'super' ? ' class=\"current\"' : '';\n\t\t$role_links['super'] = \"<a href='\" . network_admin_url('users.php?role=super') . \"'$class>\" . sprintf( _n( 'Super Admin <span class=\"count\">(%s)</span>', 'Super Admins <span class=\"count\">(%s)</span>', $total_admins ), number_format_i18n( $total_admins ) ) . '</a>';\n\n\t\treturn $role_links;\n\t}\n\n\t/**\n\t * @global string $mode\n\t * @param string $which\n\t */\n\tprotected function pagination( $which ) {\n\t\tglobal $mode;\n\n\t\tparent::pagination ( $which );\n\n\t\tif ( 'top' === $which ) {\n\t\t\t$this->view_switcher( $mode );\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\t$users_columns = array(\n\t\t\t'cb'         => '<input type=\"checkbox\" />',\n\t\t\t'username'   => __( 'Username' ),\n\t\t\t'name'       => __( 'Name' ),\n\t\t\t'email'      => __( 'Email' ),\n\t\t\t'registered' => _x( 'Registered', 'user' ),\n\t\t\t'blogs'      => __( 'Sites' )\n\t\t);\n\t\t/**\n\t\t * Filter the columns displayed in the Network Admin Users list table.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param array $users_columns An array of user columns. Default 'cb', 'username',\n\t\t *                             'name', 'email', 'registered', 'blogs'.\n\t\t */\n\t\treturn apply_filters( 'wpmu_users_columns', $users_columns );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array(\n\t\t\t'username'   => 'login',\n\t\t\t'name'       => 'name',\n\t\t\t'email'      => 'email',\n\t\t\t'registered' => 'id',\n\t\t);\n\t}\n\n\t/**\n\t * Handles the checkbox column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_User $user The current WP_User object.\n\t */\n\tpublic function column_cb( $user ) {\n\t\tif ( is_super_admin( $user->ID ) ) {\n\t\t\treturn;\n\t\t}\n\t\t?>\n\t\t<label class=\"screen-reader-text\" for=\"blog_<?php echo $user->ID; ?>\"><?php echo sprintf( __( 'Select %s' ), $user->user_login ); ?></label>\n\t\t<input type=\"checkbox\" id=\"blog_<?php echo $user->ID ?>\" name=\"allusers[]\" value=\"<?php echo esc_attr( $user->ID ) ?>\" />\n\t\t<?php\n\t}\n\n\t/**\n\t * Handles the ID column output.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_User $user The current WP_User object.\n\t */\n\tpublic function column_id( $user ) {\n\t\techo $user->ID;\n\t}\n\n\t/**\n\t * Handles the username column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_User $user The current WP_User object.\n\t */\n\tpublic function column_username( $user ) {\n\t\t$super_admins = get_super_admins();\n\t\t$avatar\t= get_avatar( $user->user_email, 32 );\n\t\t$edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user->ID ) ) );\n\n\t\techo $avatar;\n\n\t\t?><strong><a href=\"<?php echo $edit_link; ?>\" class=\"edit\"><?php echo $user->user_login; ?></a><?php\n\t\tif ( in_array( $user->user_login, $super_admins ) ) {\n\t\t\techo ' - ' . __( 'Super Admin' );\n\t\t}\n\t\t?></strong>\n\t<?php\n\t}\n\n\t/**\n\t * Handles the name column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_User $user The current WP_User object.\n\t */\n\tpublic function column_name( $user ) {\n\t\techo \"$user->first_name $user->last_name\";\n\t}\n\n\t/**\n\t * Handles the email column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_User $user The current WP_User object.\n\t */\n\tpublic function column_email( $user ) {\n\t\techo \"<a href='\" . esc_url( \"mailto:$user->user_email\" ) . \"'>$user->user_email</a>\";\n\t}\n\n\t/**\n\t * Handles the registered date column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @global string $mode\n\t *\n\t * @param WP_User $user The current WP_User object.\n\t */\n\tpublic function column_registered( $user ) {\n\t\tglobal $mode;\n\t\tif ( 'list' === $mode ) {\n\t\t\t$date = __( 'Y/m/d' );\n\t\t} else {\n\t\t\t$date = __( 'Y/m/d g:i:s a' );\n\t\t}\n\t\techo mysql2date( $date, $user->user_registered );\n\t}\n\n\t/**\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param WP_User $user\n\t * @param string  $classes\n\t * @param string  $data\n\t * @param string  $primary\n\t */\n\tprotected function _column_blogs( $user, $classes, $data, $primary ) {\n\t\techo '<td class=\"', $classes, ' has-row-actions\" ', $data, '>';\n\t\techo $this->column_blogs( $user );\n\t\techo $this->handle_row_actions( $user, 'blogs', $primary );\n\t\techo '</td>';\n\t}\n\n\t/**\n\t * Handles the blogs/sites column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_User $user The current WP_User object.\n\t */\n\tpublic function column_blogs( $user ) {\n\t\t$blogs = get_blogs_of_user( $user->ID, true );\n\t\tif ( ! is_array( $blogs ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tforeach ( $blogs as $val ) {\n\t\t\tif ( ! can_edit_network( $val->site_id ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$path\t= ( $val->path === '/' ) ? '' : $val->path;\n\t\t\techo '<span class=\"site-' . $val->site_id . '\" >';\n\t\t\techo '<a href=\"'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'\">' . str_replace( '.' . get_current_site()->domain, '', $val->domain . $path ) . '</a>';\n\t\t\techo ' <small class=\"row-actions\">';\n\t\t\t$actions = array();\n\t\t\t$actions['edit'] = '<a href=\"'. esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) .'\">' . __( 'Edit' ) . '</a>';\n\n\t\t\t$class = '';\n\t\t\tif ( $val->spam == 1 ) {\n\t\t\t\t$class .= 'site-spammed ';\n\t\t\t}\n\t\t\tif ( $val->mature == 1 ) {\n\t\t\t\t$class .= 'site-mature ';\n\t\t\t}\n\t\t\tif ( $val->deleted == 1 ) {\n\t\t\t\t$class .= 'site-deleted ';\n\t\t\t}\n\t\t\tif ( $val->archived == 1 ) {\n\t\t\t\t$class .= 'site-archived ';\n\t\t\t}\n\n\t\t\t$actions['view'] = '<a class=\"' . $class . '\" href=\"' . esc_url( get_home_url( $val->userblog_id ) ) . '\">' . __( 'View' ) . '</a>';\n\n\t\t\t/**\n\t\t\t * Filter the action links displayed next the sites a user belongs to\n\t\t\t * in the Network Admin Users list table.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param array $actions     An array of action links to be displayed.\n\t\t\t *                           Default 'Edit', 'View'.\n\t\t\t * @param int   $userblog_id The site ID.\n\t\t\t */\n\t\t\t$actions = apply_filters( 'ms_user_list_site_actions', $actions, $val->userblog_id );\n\n\t\t\t$i=0;\n\t\t\t$action_count = count( $actions );\n\t\t\tforeach ( $actions as $action => $link ) {\n\t\t\t\t++$i;\n\t\t\t\t$sep = ( $i == $action_count ) ? '' : ' | ';\n\t\t\t\techo \"<span class='$action'>$link$sep</span>\";\n\t\t\t}\n\t\t\techo '</small></span><br/>';\n\t\t}\n\t}\n\n\t/**\n\t * Handles the default column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_User $user       The current WP_User object.\n\t * @param string $column_name The current column name.\n\t */\n\tpublic function column_default( $user, $column_name ) {\n\t\t/** This filter is documented in wp-admin/includes/class-wp-users-list-table.php */\n\t\techo apply_filters( 'manage_users_custom_column', '', $column_name, $user->ID );\n\t}\n\n\tpublic function display_rows() {\n\t\tforeach ( $this->items as $user ) {\n\t\t\t$class = '';\n\n\t\t\t$status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );\n\n\t\t\tforeach ( $status_list as $status => $col ) {\n\t\t\t\tif ( $user->$status ) {\n\t\t\t\t\t$class .= \" $col\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t?>\n\t\t\t<tr class=\"<?php echo trim( $class ); ?>\">\n\t\t\t\t<?php $this->single_row_columns( $user ); ?>\n\t\t\t</tr>\n\t\t\t<?php\n\t\t}\n\t}\n\n\t/**\n\t * Gets the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, 'username'.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\treturn 'username';\n\t}\n\n\t/**\n\t * Generates and displays row action links.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param object $user        User being acted upon.\n\t * @param string $column_name Current column name.\n\t * @param string $primary     Primary column name.\n\t * @return string Row actions output for users in Multisite.\n\t */\n\tprotected function handle_row_actions( $user, $column_name, $primary ) {\n\t\tif ( $primary !== $column_name ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t$super_admins = get_super_admins();\n\t\t$edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user->ID ) ) );\n\n\t\t$actions = array();\n\t\t$actions['edit'] = '<a href=\"' . $edit_link . '\">' . __( 'Edit' ) . '</a>';\n\n\t\tif ( current_user_can( 'delete_user', $user->ID ) && ! in_array( $user->user_login, $super_admins ) ) {\n\t\t\t$actions['delete'] = '<a href=\"' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'users.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '\" class=\"delete\">' . __( 'Delete' ) . '</a>';\n\t\t}\n\n\t\t/**\n\t\t * Filter the action links displayed under each user in the Network Admin Users list table.\n\t\t *\n\t\t * @since 3.2.0\n\t\t *\n\t\t * @param array   $actions An array of action links to be displayed.\n\t\t *                         Default 'Edit', 'Delete'.\n\t\t * @param WP_User $user    WP_User object.\n\t\t */\n\t\t$actions = apply_filters( 'ms_user_row_actions', $actions, $user );\n\t\treturn $this->row_actions( $actions );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-plugin-install-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Plugin_Install_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying plugins to install in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_Plugin_Install_List_Table extends WP_List_Table {\n\n\tpublic $order = 'ASC';\n\tpublic $orderby = null;\n\tpublic $groups = array();\n\n\tprivate $error;\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can('install_plugins');\n\t}\n\n\t/**\n\t * Return a list of slugs of installed plugins, if known.\n\t *\n\t * Uses the transient data from the updates API to determine the slugs of\n\t * known installed plugins. This might be better elsewhere, perhaps even\n\t * within get_plugins().\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @return array\n\t */\n\tprotected function get_installed_plugin_slugs() {\n\t\t$slugs = array();\n\n\t\t$plugin_info = get_site_transient( 'update_plugins' );\n\t\tif ( isset( $plugin_info->no_update ) ) {\n\t\t\tforeach ( $plugin_info->no_update as $plugin ) {\n\t\t\t\t$slugs[] = $plugin->slug;\n\t\t\t}\n\t\t}\n\n\t\tif ( isset( $plugin_info->response ) ) {\n\t\t\tforeach ( $plugin_info->response as $plugin ) {\n\t\t\t\t$slugs[] = $plugin->slug;\n\t\t\t}\n\t\t}\n\n\t\treturn $slugs;\n\t}\n\n\t/**\n\t *\n\t * @global array  $tabs\n\t * @global string $tab\n\t * @global int    $paged\n\t * @global string $type\n\t * @global string $term\n\t * @global string $wp_version\n\t */\n\tpublic function prepare_items() {\n\t\tinclude( ABSPATH . 'wp-admin/includes/plugin-install.php' );\n\n\t\tglobal $tabs, $tab, $paged, $type, $term;\n\n\t\twp_reset_vars( array( 'tab' ) );\n\n\t\t$paged = $this->get_pagenum();\n\n\t\t$per_page = 30;\n\n\t\t// These are the tabs which are shown on the page\n\t\t$tabs = array();\n\n\t\tif ( 'search' === $tab ) {\n\t\t\t$tabs['search']\t= __( 'Search Results' );\n\t\t}\n\t\t$tabs['featured']  = _x( 'Featured', 'Plugin Installer' );\n\t\t$tabs['popular']   = _x( 'Popular', 'Plugin Installer' );\n\t\t$tabs['recommended']   = _x( 'Recommended', 'Plugin Installer' );\n\t\t$tabs['favorites'] = _x( 'Favorites', 'Plugin Installer' );\n\t\tif ( $tab === 'beta' || false !== strpos( $GLOBALS['wp_version'], '-' ) ) {\n\t\t\t$tabs['beta']      = _x( 'Beta Testing', 'Plugin Installer' );\n\t\t}\n\t\tif ( current_user_can( 'upload_plugins' ) ) {\n\t\t\t// No longer a real tab. Here for filter compatibility.\n\t\t\t// Gets skipped in get_views().\n\t\t\t$tabs['upload'] = __( 'Upload Plugin' );\n\t\t}\n\n\t\t$nonmenu_tabs = array( 'plugin-information' ); // Valid actions to perform which do not have a Menu item.\n\n\t\t/**\n\t\t * Filter the tabs shown on the Plugin Install screen.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array $tabs The tabs shown on the Plugin Install screen. Defaults include 'featured', 'popular',\n\t\t *                    'recommended', 'favorites', and 'upload'.\n\t\t */\n\t\t$tabs = apply_filters( 'install_plugins_tabs', $tabs );\n\n\t\t/**\n\t\t * Filter tabs not associated with a menu item on the Plugin Install screen.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array $nonmenu_tabs The tabs that don't have a Menu item on the Plugin Install screen.\n\t\t */\n\t\t$nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );\n\n\t\t// If a non-valid menu tab has been selected, And it's not a non-menu action.\n\t\tif ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )\n\t\t\t$tab = key( $tabs );\n\n\t\t$args = array(\n\t\t\t'page' => $paged,\n\t\t\t'per_page' => $per_page,\n\t\t\t'fields' => array(\n\t\t\t\t'last_updated' => true,\n\t\t\t\t'icons' => true,\n\t\t\t\t'active_installs' => true\n\t\t\t),\n\t\t\t// Send the locale and installed plugin slugs to the API so it can provide context-sensitive results.\n\t\t\t'locale' => get_locale(),\n\t\t\t'installed_plugins' => $this->get_installed_plugin_slugs(),\n\t\t);\n\n\t\tswitch ( $tab ) {\n\t\t\tcase 'search':\n\t\t\t\t$type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';\n\t\t\t\t$term = isset( $_REQUEST['s'] ) ? wp_unslash( $_REQUEST['s'] ) : '';\n\n\t\t\t\tswitch ( $type ) {\n\t\t\t\t\tcase 'tag':\n\t\t\t\t\t\t$args['tag'] = sanitize_title_with_dashes( $term );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'term':\n\t\t\t\t\t\t$args['search'] = $term;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'author':\n\t\t\t\t\t\t$args['author'] = $term;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'featured':\n\t\t\t\t$args['fields']['group'] = true;\n\t\t\t\t$this->orderby = 'group';\n\t\t\t\t// No break!\n\t\t\tcase 'popular':\n\t\t\tcase 'new':\n\t\t\tcase 'beta':\n\t\t\tcase 'recommended':\n\t\t\t\t$args['browse'] = $tab;\n\t\t\t\tbreak;\n\n\t\t\tcase 'favorites':\n\t\t\t\t$user = isset( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' );\n\t\t\t\tupdate_user_meta( get_current_user_id(), 'wporg_favorites', $user );\n\t\t\t\tif ( $user )\n\t\t\t\t\t$args['user'] = $user;\n\t\t\t\telse\n\t\t\t\t\t$args = false;\n\n\t\t\t\tadd_action( 'install_plugins_favorites', 'install_plugins_favorites_form', 9, 0 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$args = false;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/**\n\t\t * Filter API request arguments for each Plugin Install screen tab.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$tab`, refers to the plugin install tabs.\n\t\t * Default tabs include 'featured', 'popular', 'recommended', 'favorites', and 'upload'.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array|bool $args Plugin Install API arguments.\n\t\t */\n\t\t$args = apply_filters( \"install_plugins_table_api_args_$tab\", $args );\n\n\t\tif ( !$args )\n\t\t\treturn;\n\n\t\t$api = plugins_api( 'query_plugins', $args );\n\n\t\tif ( is_wp_error( $api ) ) {\n\t\t\t$this->error = $api;\n\t\t\treturn;\n\t\t}\n\n\t\t$this->items = $api->plugins;\n\n\t\tif ( $this->orderby ) {\n\t\t\tuasort( $this->items, array( $this, 'order_callback' ) );\n\t\t}\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $api->info['results'],\n\t\t\t'per_page' => $args['per_page'],\n\t\t) );\n\n\t\tif ( isset( $api->info['groups'] ) ) {\n\t\t\t$this->groups = $api->info['groups'];\n\t\t}\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\tif ( isset( $this->error ) ) {\n\t\t\t$message = $this->error->get_error_message() . '<p class=\"hide-if-no-js\"><a href=\"#\" class=\"button\" onclick=\"document.location.reload(); return false;\">' . __( 'Try again' ) . '</a></p>';\n\t\t} else {\n\t\t\t$message = __( 'No plugins match your request.' );\n\t\t}\n\t\techo '<div class=\"no-plugin-results\">' . $message . '</div>';\n\t}\n\n\t/**\n\t *\n\t * @global array $tabs\n\t * @global string $tab\n\t *\n\t * @return array\n\t */\n\tprotected function get_views() {\n\t\tglobal $tabs, $tab;\n\n\t\t$display_tabs = array();\n\t\tforeach ( (array) $tabs as $action => $text ) {\n\t\t\t$class = ( $action === $tab ) ? ' current' : '';\n\t\t\t$href = self_admin_url('plugin-install.php?tab=' . $action);\n\t\t\t$display_tabs['plugin-install-'.$action] = \"<a href='$href' class='$class'>$text</a>\";\n\t\t}\n\t\t// No longer a real tab.\n\t\tunset( $display_tabs['plugin-install-upload'] );\n\n\t\treturn $display_tabs;\n\t}\n\n\t/**\n\t * Override parent views so we can use the filter bar display.\n\t */\n\tpublic function views() {\n\t\t$views = $this->get_views();\n\n\t\t/** This filter is documented in wp-admin/inclues/class-wp-list-table.php */\n\t\t$views = apply_filters( \"views_{$this->screen->id}\", $views );\n\n\t\t$this->screen->render_screen_reader_content( 'heading_views' );\n?>\n<div class=\"wp-filter\">\n\t<ul class=\"filter-links\">\n\t\t<?php\n\t\tif ( ! empty( $views ) ) {\n\t\t\tforeach ( $views as $class => $view ) {\n\t\t\t\t$views[ $class ] = \"\\t<li class='$class'>$view\";\n\t\t\t}\n\t\t\techo implode( \" </li>\\n\", $views ) . \"</li>\\n\";\n\t\t}\n\t\t?>\n\t</ul>\n\n\t<?php install_search_form( isset( $views['plugin-install-search'] ) ); ?>\n</div>\n<?php\n\t}\n\n\t/**\n\t * Override the parent display() so we can provide a different container.\n\t */\n\tpublic function display() {\n\t\t$singular = $this->_args['singular'];\n\n\t\t$data_attr = '';\n\n\t\tif ( $singular ) {\n\t\t\t$data_attr = \" data-wp-lists='list:$singular'\";\n\t\t}\n\n\t\t$this->display_tablenav( 'top' );\n\n?>\n<div class=\"wp-list-table <?php echo implode( ' ', $this->get_table_classes() ); ?>\">\n<?php\n\t$this->screen->render_screen_reader_content( 'heading_list' );\n?>\n\t<div id=\"the-list\"<?php echo $data_attr; ?>>\n\t\t<?php $this->display_rows_or_placeholder(); ?>\n\t</div>\n</div>\n<?php\n\t\t$this->display_tablenav( 'bottom' );\n\t}\n\n\t/**\n\t * @global string $tab\n\t *\n\t * @param string $which\n\t */\n\tprotected function display_tablenav( $which ) {\n\t\tif ( $GLOBALS['tab'] === 'featured' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( 'top' === $which ) {\n\t\t\twp_referer_field();\n\t\t?>\n\t\t\t<div class=\"tablenav top\">\n\t\t\t\t<div class=\"alignleft actions\">\n\t\t\t\t\t<?php\n\t\t\t\t\t/**\n\t\t\t\t\t * Fires before the Plugin Install table header pagination is displayed.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.7.0\n\t\t\t\t\t */\n\t\t\t\t\tdo_action( 'install_plugins_table_header' ); ?>\n\t\t\t\t</div>\n\t\t\t\t<?php $this->pagination( $which ); ?>\n\t\t\t\t<br class=\"clear\" />\n\t\t\t</div>\n\t\t<?php } else { ?>\n\t\t\t<div class=\"tablenav bottom\">\n\t\t\t\t<?php $this->pagination( $which ); ?>\n\t\t\t\t<br class=\"clear\" />\n\t\t\t</div>\n\t\t<?php\n\t\t}\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tprotected function get_table_classes() {\n\t\treturn array( 'widefat', $this->_args['plural'] );\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\treturn array();\n\t}\n\n\t/**\n\t * @param object $plugin_a\n\t * @param object $plugin_b\n\t * @return int\n\t */\n\tprivate function order_callback( $plugin_a, $plugin_b ) {\n\t\t$orderby = $this->orderby;\n\t\tif ( ! isset( $plugin_a->$orderby, $plugin_b->$orderby ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t$a = $plugin_a->$orderby;\n\t\t$b = $plugin_b->$orderby;\n\n\t\tif ( $a == $b ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( 'DESC' === $this->order ) {\n\t\t\treturn ( $a < $b ) ? 1 : -1;\n\t\t} else {\n\t\t\treturn ( $a < $b ) ? -1 : 1;\n\t\t}\n\t}\n\n\t/**\n\t * @global string $wp_version\n\t */\n\tpublic function display_rows() {\n\t\t$plugins_allowedtags = array(\n\t\t\t'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),\n\t\t\t'abbr' => array( 'title' => array() ),'acronym' => array( 'title' => array() ),\n\t\t\t'code' => array(), 'pre' => array(), 'em' => array(),'strong' => array(),\n\t\t\t'ul' => array(), 'ol' => array(), 'li' => array(), 'p' => array(), 'br' => array()\n\t\t);\n\n\t\t$plugins_group_titles = array(\n\t\t\t'Performance' => _x( 'Performance', 'Plugin installer group title' ),\n\t\t\t'Social'      => _x( 'Social',      'Plugin installer group title' ),\n\t\t\t'Tools'       => _x( 'Tools',       'Plugin installer group title' ),\n\t\t);\n\n\t\t$group = null;\n\n\t\tforeach ( (array) $this->items as $plugin ) {\n\t\t\tif ( is_object( $plugin ) ) {\n\t\t\t\t$plugin = (array) $plugin;\n\t\t\t}\n\n\t\t\t// Display the group heading if there is one\n\t\t\tif ( isset( $plugin['group'] ) && $plugin['group'] != $group ) {\n\t\t\t\tif ( isset( $this->groups[ $plugin['group'] ] ) ) {\n\t\t\t\t\t$group_name = $this->groups[ $plugin['group'] ];\n\t\t\t\t\tif ( isset( $plugins_group_titles[ $group_name ] ) ) {\n\t\t\t\t\t\t$group_name = $plugins_group_titles[ $group_name ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$group_name = $plugin['group'];\n\t\t\t\t}\n\n\t\t\t\t// Starting a new group, close off the divs of the last one\n\t\t\t\tif ( ! empty( $group ) ) {\n\t\t\t\t\techo '</div></div>';\n\t\t\t\t}\n\n\t\t\t\techo '<div class=\"plugin-group\"><h3>' . esc_html( $group_name ) . '</h3>';\n\t\t\t\t// needs an extra wrapping div for nth-child selectors to work\n\t\t\t\techo '<div class=\"plugin-items\">';\n\n\t\t\t\t$group = $plugin['group'];\n\t\t\t}\n\t\t\t$title = wp_kses( $plugin['name'], $plugins_allowedtags );\n\n\t\t\t// Remove any HTML from the description.\n\t\t\t$description = strip_tags( $plugin['short_description'] );\n\t\t\t$version = wp_kses( $plugin['version'], $plugins_allowedtags );\n\n\t\t\t$name = strip_tags( $title . ' ' . $version );\n\n\t\t\t$author = wp_kses( $plugin['author'], $plugins_allowedtags );\n\t\t\tif ( ! empty( $author ) ) {\n\t\t\t\t$author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '</cite>';\n\t\t\t}\n\n\t\t\t$action_links = array();\n\n\t\t\tif ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {\n\t\t\t\t$status = install_plugin_install_status( $plugin );\n\n\t\t\t\tswitch ( $status['status'] ) {\n\t\t\t\t\tcase 'install':\n\t\t\t\t\t\tif ( $status['url'] ) {\n\t\t\t\t\t\t\t/* translators: 1: Plugin name and version. */\n\t\t\t\t\t\t\t$action_links[] = '<a class=\"install-now button\" data-slug=\"' . esc_attr( $plugin['slug'] ) . '\" href=\"' . esc_url( $status['url'] ) . '\" aria-label=\"' . esc_attr( sprintf( __( 'Install %s now' ), $name ) ) . '\" data-name=\"' . esc_attr( $name ) . '\">' . __( 'Install Now' ) . '</a>';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'update_available':\n\t\t\t\t\t\tif ( $status['url'] ) {\n\t\t\t\t\t\t\t/* translators: 1: Plugin name and version */\n\t\t\t\t\t\t\t$action_links[] = '<a class=\"update-now button\" data-plugin=\"' . esc_attr( $status['file'] ) . '\" data-slug=\"' . esc_attr( $plugin['slug'] ) . '\" href=\"' . esc_url( $status['url'] ) . '\" aria-label=\"' . esc_attr( sprintf( __( 'Update %s now' ), $name ) ) . '\" data-name=\"' . esc_attr( $name ) . '\">' . __( 'Update Now' ) . '</a>';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'latest_installed':\n\t\t\t\t\tcase 'newer_installed':\n\t\t\t\t\t\t$action_links[] = '<span class=\"button button-disabled\" title=\"' . esc_attr__( 'This plugin is already installed and is up to date' ) . ' \">' . _x( 'Installed', 'plugin' ) . '</span>';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$details_link   = self_admin_url( 'plugin-install.php?tab=plugin-information&amp;plugin=' . $plugin['slug'] .\n\t\t\t\t\t\t\t\t'&amp;TB_iframe=true&amp;width=600&amp;height=550' );\n\n\t\t\t/* translators: 1: Plugin name and version. */\n\t\t\t$action_links[] = '<a href=\"' . esc_url( $details_link ) . '\" class=\"thickbox\" aria-label=\"' . esc_attr( sprintf( __( 'More information about %s' ), $name ) ) . '\" data-title=\"' . esc_attr( $name ) . '\">' . __( 'More Details' ) . '</a>';\n\n\t\t\tif ( !empty( $plugin['icons']['svg'] ) ) {\n\t\t\t\t$plugin_icon_url = $plugin['icons']['svg'];\n\t\t\t} elseif ( !empty( $plugin['icons']['2x'] ) ) {\n\t\t\t\t$plugin_icon_url = $plugin['icons']['2x'];\n\t\t\t} elseif ( !empty( $plugin['icons']['1x'] ) ) {\n\t\t\t\t$plugin_icon_url = $plugin['icons']['1x'];\n\t\t\t} else {\n\t\t\t\t$plugin_icon_url = $plugin['icons']['default'];\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter the install action links for a plugin.\n\t\t\t *\n\t\t\t * @since 2.7.0\n\t\t\t *\n\t\t\t * @param array $action_links An array of plugin action hyperlinks. Defaults are links to Details and Install Now.\n\t\t\t * @param array $plugin       The plugin currently being listed.\n\t\t\t */\n\t\t\t$action_links = apply_filters( 'plugin_install_action_links', $action_links, $plugin );\n\n\t\t\t$date_format = __( 'M j, Y @ H:i' );\n\t\t\t$last_updated_timestamp = strtotime( $plugin['last_updated'] );\n\t\t?>\n\t\t<div class=\"plugin-card plugin-card-<?php echo sanitize_html_class( $plugin['slug'] ); ?>\">\n\t\t\t<div class=\"plugin-card-top\">\n\t\t\t\t<div class=\"name column-name\">\n\t\t\t\t\t<h3>\n\t\t\t\t\t\t<a href=\"<?php echo esc_url( $details_link ); ?>\" class=\"thickbox\">\n\t\t\t\t\t\t<?php echo $title; ?>\n\t\t\t\t\t\t<img src=\"<?php echo esc_attr( $plugin_icon_url ) ?>\" class=\"plugin-icon\" alt=\"\">\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</h3>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"action-links\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\tif ( $action_links ) {\n\t\t\t\t\t\t\techo '<ul class=\"plugin-action-buttons\"><li>' . implode( '</li><li>', $action_links ) . '</li></ul>';\n\t\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"desc column-description\">\n\t\t\t\t\t<p><?php echo $description; ?></p>\n\t\t\t\t\t<p class=\"authors\"><?php echo $author; ?></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"plugin-card-bottom\">\n\t\t\t\t<div class=\"vers column-rating\">\n\t\t\t\t\t<?php wp_star_rating( array( 'rating' => $plugin['rating'], 'type' => 'percent', 'number' => $plugin['num_ratings'] ) ); ?>\n\t\t\t\t\t<span class=\"num-ratings\">(<?php echo number_format_i18n( $plugin['num_ratings'] ); ?>)</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"column-updated\">\n\t\t\t\t\t<strong><?php _e( 'Last Updated:' ); ?></strong> <span title=\"<?php echo esc_attr( date_i18n( $date_format, $last_updated_timestamp ) ); ?>\">\n\t\t\t\t\t\t<?php printf( __( '%s ago' ), human_time_diff( $last_updated_timestamp ) ); ?>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"column-downloaded\">\n\t\t\t\t\t<?php\n\t\t\t\t\tif ( $plugin['active_installs'] >= 1000000 ) {\n\t\t\t\t\t\t$active_installs_text = _x( '1+ Million', 'Active plugin installs' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$active_installs_text = number_format_i18n( $plugin['active_installs'] ) . '+';\n\t\t\t\t\t}\n\t\t\t\t\tprintf( __( '%s Active Installs' ), $active_installs_text );\n\t\t\t\t\t?>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"column-compatibility\">\n\t\t\t\t\t<?php\n\t\t\t\t\tif ( ! empty( $plugin['tested'] ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $plugin['tested'] ) ), $plugin['tested'], '>' ) ) {\n\t\t\t\t\t\techo '<span class=\"compatibility-untested\">' . __( 'Untested with your version of WordPress' ) . '</span>';\n\t\t\t\t\t} elseif ( ! empty( $plugin['requires'] ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $plugin['requires'] ) ), $plugin['requires'], '<' ) ) {\n\t\t\t\t\t\techo '<span class=\"compatibility-incompatible\">' . __( '<strong>Incompatible</strong> with your version of WordPress' ) . '</span>';\n\t\t\t\t\t} else {\n\t\t\t\t\t\techo '<span class=\"compatibility-compatible\">' . __( '<strong>Compatible</strong> with your version of WordPress' ) . '</span>';\n\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<?php\n\t\t}\n\n\t\t// Close off the group divs of the last one\n\t\tif ( ! empty( $group ) ) {\n\t\t\techo '</div></div>';\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-plugins-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Plugins_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying installed plugins in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_Plugins_List_Table extends WP_List_Table {\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @global string $status\n\t * @global int    $page\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\tglobal $status, $page;\n\n\t\tparent::__construct( array(\n\t\t\t'plural' => 'plugins',\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\n\t\t$status = 'all';\n\t\tif ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'active', 'inactive', 'recently_activated', 'upgrade', 'mustuse', 'dropins', 'search' ) ) )\n\t\t\t$status = $_REQUEST['plugin_status'];\n\n\t\tif ( isset($_REQUEST['s']) )\n\t\t\t$_SERVER['REQUEST_URI'] = add_query_arg('s', wp_unslash($_REQUEST['s']) );\n\n\t\t$page = $this->get_pagenum();\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tprotected function get_table_classes() {\n\t\treturn array( 'widefat', $this->_args['plural'] );\n\t}\n\n\t/**\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can('activate_plugins');\n\t}\n\n\t/**\n\t *\n\t * @global string $status\n\t * @global type   $plugins\n\t * @global array  $totals\n\t * @global int    $page\n\t * @global string $orderby\n\t * @global string $order\n\t * @global string $s\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $status, $plugins, $totals, $page, $orderby, $order, $s;\n\n\t\twp_reset_vars( array( 'orderby', 'order', 's' ) );\n\n\t\t/**\n\t\t * Filter the full array of plugins to list in the Plugins list table.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @see get_plugins()\n\t\t *\n\t\t * @param array $plugins An array of plugins to display in the list table.\n\t\t */\n\t\t$plugins = array(\n\t\t\t'all' => apply_filters( 'all_plugins', get_plugins() ),\n\t\t\t'search' => array(),\n\t\t\t'active' => array(),\n\t\t\t'inactive' => array(),\n\t\t\t'recently_activated' => array(),\n\t\t\t'upgrade' => array(),\n\t\t\t'mustuse' => array(),\n\t\t\t'dropins' => array()\n\t\t);\n\n\t\t$screen = $this->screen;\n\n\t\tif ( ! is_multisite() || ( $screen->in_admin( 'network' ) && current_user_can( 'manage_network_plugins' ) ) ) {\n\n\t\t\t/**\n\t\t\t * Filter whether to display the advanced plugins list table.\n\t\t\t *\n\t\t\t * There are two types of advanced plugins - must-use and drop-ins -\n\t\t\t * which can be used in a single site or Multisite network.\n\t\t\t *\n\t\t\t * The $type parameter allows you to differentiate between the type of advanced\n\t\t\t * plugins to filter the display of. Contexts include 'mustuse' and 'dropins'.\n\t\t\t *\n\t\t\t * @since 3.0.0\n\t\t\t *\n\t\t\t * @param bool   $show Whether to show the advanced plugins for the specified\n\t\t\t *                     plugin type. Default true.\n\t\t\t * @param string $type The plugin type. Accepts 'mustuse', 'dropins'.\n\t\t\t */\n\t\t\tif ( apply_filters( 'show_advanced_plugins', true, 'mustuse' ) ) {\n\t\t\t\t$plugins['mustuse'] = get_mu_plugins();\n\t\t\t}\n\n\t\t\t/** This action is documented in wp-admin/includes/class-wp-plugins-list-table.php */\n\t\t\tif ( apply_filters( 'show_advanced_plugins', true, 'dropins' ) )\n\t\t\t\t$plugins['dropins'] = get_dropins();\n\n\t\t\tif ( current_user_can( 'update_plugins' ) ) {\n\t\t\t\t$current = get_site_transient( 'update_plugins' );\n\t\t\t\tforeach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {\n\t\t\t\t\tif ( isset( $current->response[ $plugin_file ] ) ) {\n\t\t\t\t\t\t$plugins['all'][ $plugin_file ]['update'] = true;\n\t\t\t\t\t\t$plugins['upgrade'][ $plugin_file ] = $plugins['all'][ $plugin_file ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $screen->in_admin( 'network' ) ) {\n\t\t\t$show = current_user_can( 'manage_network_plugins' );\n\t\t\t/**\n\t\t\t * Filter whether to display network-active plugins alongside plugins active for the current site.\n\t\t\t *\n\t\t\t * This also controls the display of inactive network-only plugins (plugins with\n\t\t\t * \"Network: true\" in the plugin header).\n\t\t\t *\n\t\t\t * Plugins cannot be network-activated or network-deactivated from this screen.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param bool $show Whether to show network-active plugins. Default is whether the current\n\t\t\t *                   user can manage network plugins (ie. a Super Admin).\n\t\t\t */\n\t\t\t$show_network_active = apply_filters( 'show_network_active_plugins', $show );\n\t\t}\n\n\t\tset_transient( 'plugin_slugs', array_keys( $plugins['all'] ), DAY_IN_SECONDS );\n\n\t\tif ( $screen->in_admin( 'network' ) ) {\n\t\t\t$recently_activated = get_site_option( 'recently_activated', array() );\n\t\t} else {\n\t\t\t$recently_activated = get_option( 'recently_activated', array() );\n\t\t}\n\n\t\tforeach ( $recently_activated as $key => $time ) {\n\t\t\tif ( $time + WEEK_IN_SECONDS < time() ) {\n\t\t\t\tunset( $recently_activated[$key] );\n\t\t\t}\n\t\t}\n\n\t\tif ( $screen->in_admin( 'network' ) ) {\n\t\t\tupdate_site_option( 'recently_activated', $recently_activated );\n\t\t} else {\n\t\t\tupdate_option( 'recently_activated', $recently_activated );\n\t\t}\n\n\t\t$plugin_info = get_site_transient( 'update_plugins' );\n\n\t\tforeach ( (array) $plugins['all'] as $plugin_file => $plugin_data ) {\n\t\t\t// Extra info if known. array_merge() ensures $plugin_data has precedence if keys collide.\n\t\t\tif ( isset( $plugin_info->response[ $plugin_file ] ) ) {\n\t\t\t\t$plugins['all'][ $plugin_file ] = $plugin_data = array_merge( (array) $plugin_info->response[ $plugin_file ], $plugin_data );\n\t\t\t\t// Make sure that $plugins['upgrade'] also receives the extra info since it is used on ?plugin_status=upgrade\n\t\t\t\tif ( isset( $plugins['upgrade'][ $plugin_file ] ) ) {\n\t\t\t\t\t$plugins['upgrade'][ $plugin_file ] = $plugin_data = array_merge( (array) $plugin_info->response[ $plugin_file ], $plugin_data );\n\t\t\t\t}\n\n\t\t\t} elseif ( isset( $plugin_info->no_update[ $plugin_file ] ) ) {\n\t\t\t\t$plugins['all'][ $plugin_file ] = $plugin_data = array_merge( (array) $plugin_info->no_update[ $plugin_file ], $plugin_data );\n\t\t\t\t// Make sure that $plugins['upgrade'] also receives the extra info since it is used on ?plugin_status=upgrade\n\t\t\t\tif ( isset( $plugins['upgrade'][ $plugin_file ] ) ) {\n\t\t\t\t\t$plugins['upgrade'][ $plugin_file ] = $plugin_data = array_merge( (array) $plugin_info->no_update[ $plugin_file ], $plugin_data );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Filter into individual sections\n\t\t\tif ( is_multisite() && ! $screen->in_admin( 'network' ) && is_network_only_plugin( $plugin_file ) && ! is_plugin_active( $plugin_file ) ) {\n\t\t\t\tif ( $show_network_active ) {\n\t\t\t\t\t// On the non-network screen, show inactive network-only plugins if allowed\n\t\t\t\t\t$plugins['inactive'][ $plugin_file ] = $plugin_data;\n\t\t\t\t} else {\n\t\t\t\t\t// On the non-network screen, filter out network-only plugins as long as they're not individually active\n\t\t\t\t\tunset( $plugins['all'][ $plugin_file ] );\n\t\t\t\t}\n\t\t\t} elseif ( ! $screen->in_admin( 'network' ) && is_plugin_active_for_network( $plugin_file ) ) {\n\t\t\t\tif ( $show_network_active ) {\n\t\t\t\t\t// On the non-network screen, show network-active plugins if allowed\n\t\t\t\t\t$plugins['active'][ $plugin_file ] = $plugin_data;\n\t\t\t\t} else {\n\t\t\t\t\t// On the non-network screen, filter out network-active plugins\n\t\t\t\t\tunset( $plugins['all'][ $plugin_file ] );\n\t\t\t\t}\n\t\t\t} elseif ( ( ! $screen->in_admin( 'network' ) && is_plugin_active( $plugin_file ) )\n\t\t\t\t|| ( $screen->in_admin( 'network' ) && is_plugin_active_for_network( $plugin_file ) ) ) {\n\t\t\t\t// On the non-network screen, populate the active list with plugins that are individually activated\n\t\t\t\t// On the network-admin screen, populate the active list with plugins that are network activated\n\t\t\t\t$plugins['active'][ $plugin_file ] = $plugin_data;\n\t\t\t} else {\n\t\t\t\tif ( isset( $recently_activated[ $plugin_file ] ) ) {\n\t\t\t\t\t// Populate the recently activated list with plugins that have been recently activated\n\t\t\t\t\t$plugins['recently_activated'][ $plugin_file ] = $plugin_data;\n\t\t\t\t}\n\t\t\t\t// Populate the inactive list with plugins that aren't activated\n\t\t\t\t$plugins['inactive'][ $plugin_file ] = $plugin_data;\n\t\t\t}\n\t\t}\n\n\t\tif ( $s ) {\n\t\t\t$status = 'search';\n\t\t\t$plugins['search'] = array_filter( $plugins['all'], array( $this, '_search_callback' ) );\n\t\t}\n\n\t\t$totals = array();\n\t\tforeach ( $plugins as $type => $list )\n\t\t\t$totals[ $type ] = count( $list );\n\n\t\tif ( empty( $plugins[ $status ] ) && !in_array( $status, array( 'all', 'search' ) ) )\n\t\t\t$status = 'all';\n\n\t\t$this->items = array();\n\t\tforeach ( $plugins[ $status ] as $plugin_file => $plugin_data ) {\n\t\t\t// Translate, Don't Apply Markup, Sanitize HTML\n\t\t\t$this->items[$plugin_file] = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, false, true );\n\t\t}\n\n\t\t$total_this_page = $totals[ $status ];\n\n\t\tif ( ! $orderby ) {\n\t\t\t$orderby = 'Name';\n\t\t} else {\n\t\t\t$orderby = ucfirst( $orderby );\n\t\t}\n\n\t\t$order = strtoupper( $order );\n\n\t\tuasort( $this->items, array( $this, '_order_callback' ) );\n\n\t\t$plugins_per_page = $this->get_items_per_page( str_replace( '-', '_', $screen->id . '_per_page' ), 999 );\n\n\t\t$start = ( $page - 1 ) * $plugins_per_page;\n\n\t\tif ( $total_this_page > $plugins_per_page )\n\t\t\t$this->items = array_slice( $this->items, $start, $plugins_per_page );\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $total_this_page,\n\t\t\t'per_page' => $plugins_per_page,\n\t\t) );\n\t}\n\n\t/**\n\t * @staticvar string $term\n\t * @param array $plugin\n\t * @return bool\n\t */\n\tpublic function _search_callback( $plugin ) {\n\t\tstatic $term = null;\n\t\tif ( is_null( $term ) )\n\t\t\t$term = wp_unslash( $_REQUEST['s'] );\n\n\t\tforeach ( $plugin as $value ) {\n\t\t\tif ( false !== stripos( strip_tags( $value ), $term ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * @global string $orderby\n\t * @global string $order\n\t * @param array $plugin_a\n\t * @param array $plugin_b\n\t * @return int\n\t */\n\tpublic function _order_callback( $plugin_a, $plugin_b ) {\n\t\tglobal $orderby, $order;\n\n\t\t$a = $plugin_a[$orderby];\n\t\t$b = $plugin_b[$orderby];\n\n\t\tif ( $a == $b )\n\t\t\treturn 0;\n\n\t\tif ( 'DESC' === $order ) {\n\t\t\treturn strcasecmp( $b, $a );\n\t\t} else {\n\t\t\treturn strcasecmp( $a, $b );\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @global array $plugins\n\t */\n\tpublic function no_items() {\n\t\tglobal $plugins;\n\n\t\tif ( !empty( $plugins['all'] ) )\n\t\t\t_e( 'No plugins found.' );\n\t\telse\n\t\t\t_e( 'You do not appear to have any plugins available at this time.' );\n\t}\n\n\t/**\n\t *\n\t * @global string $status\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\tglobal $status;\n\n\t\treturn array(\n\t\t\t'cb'          => !in_array( $status, array( 'mustuse', 'dropins' ) ) ? '<input type=\"checkbox\" />' : '',\n\t\t\t'name'        => __( 'Plugin' ),\n\t\t\t'description' => __( 'Description' ),\n\t\t);\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array();\n\t}\n\n\t/**\n\t *\n\t * @global array $totals\n\t * @global string $status\n\t * @return array\n\t */\n\tprotected function get_views() {\n\t\tglobal $totals, $status;\n\n\t\t$status_links = array();\n\t\tforeach ( $totals as $type => $count ) {\n\t\t\tif ( !$count )\n\t\t\t\tcontinue;\n\n\t\t\tswitch ( $type ) {\n\t\t\t\tcase 'all':\n\t\t\t\t\t$text = _nx( 'All <span class=\"count\">(%s)</span>', 'All <span class=\"count\">(%s)</span>', $count, 'plugins' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'active':\n\t\t\t\t\t$text = _n( 'Active <span class=\"count\">(%s)</span>', 'Active <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'recently_activated':\n\t\t\t\t\t$text = _n( 'Recently Active <span class=\"count\">(%s)</span>', 'Recently Active <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'inactive':\n\t\t\t\t\t$text = _n( 'Inactive <span class=\"count\">(%s)</span>', 'Inactive <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'mustuse':\n\t\t\t\t\t$text = _n( 'Must-Use <span class=\"count\">(%s)</span>', 'Must-Use <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'dropins':\n\t\t\t\t\t$text = _n( 'Drop-ins <span class=\"count\">(%s)</span>', 'Drop-ins <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'upgrade':\n\t\t\t\t\t$text = _n( 'Update Available <span class=\"count\">(%s)</span>', 'Update Available <span class=\"count\">(%s)</span>', $count );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ( 'search' !== $type ) {\n\t\t\t\t$status_links[$type] = sprintf( \"<a href='%s' %s>%s</a>\",\n\t\t\t\t\tadd_query_arg('plugin_status', $type, 'plugins.php'),\n\t\t\t\t\t( $type === $status ) ? ' class=\"current\"' : '',\n\t\t\t\t\tsprintf( $text, number_format_i18n( $count ) )\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn $status_links;\n\t}\n\n\t/**\n\t *\n\t * @global string $status\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\tglobal $status;\n\n\t\t$actions = array();\n\n\t\tif ( 'active' != $status )\n\t\t\t$actions['activate-selected'] = $this->screen->in_admin( 'network' ) ? __( 'Network Activate' ) : __( 'Activate' );\n\n\t\tif ( 'inactive' != $status && 'recent' != $status )\n\t\t\t$actions['deactivate-selected'] = $this->screen->in_admin( 'network' ) ? __( 'Network Deactivate' ) : __( 'Deactivate' );\n\n\t\tif ( !is_multisite() || $this->screen->in_admin( 'network' ) ) {\n\t\t\tif ( current_user_can( 'update_plugins' ) )\n\t\t\t\t$actions['update-selected'] = __( 'Update' );\n\t\t\tif ( current_user_can( 'delete_plugins' ) && ( 'active' != $status ) )\n\t\t\t\t$actions['delete-selected'] = __( 'Delete' );\n\t\t}\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t * @global string $status\n\t * @param string $which\n\t */\n\tpublic function bulk_actions( $which = '' ) {\n\t\tglobal $status;\n\n\t\tif ( in_array( $status, array( 'mustuse', 'dropins' ) ) )\n\t\t\treturn;\n\n\t\tparent::bulk_actions( $which );\n\t}\n\n\t/**\n\t * @global string $status\n\t * @param string $which\n\t */\n\tprotected function extra_tablenav( $which ) {\n\t\tglobal $status;\n\n\t\tif ( ! in_array($status, array('recently_activated', 'mustuse', 'dropins') ) )\n\t\t\treturn;\n\n\t\techo '<div class=\"alignleft actions\">';\n\n\t\tif ( 'recently_activated' == $status ) {\n\t\t\tsubmit_button( __( 'Clear List' ), 'button', 'clear-recent-list', false );\n\t\t} elseif ( 'top' === $which && 'mustuse' === $status ) {\n\t\t\t/* translators: %s: mu-plugins directory name */\n\t\t\techo '<p>' . sprintf( __( 'Files in the %s directory are executed automatically.' ),\n\t\t\t\t'<code>' . str_replace( ABSPATH, '/', WPMU_PLUGIN_DIR ) . '</code>'\n\t\t\t) . '</p>';\n\t\t} elseif ( 'top' === $which && 'dropins' === $status ) {\n\t\t\t/* translators: %s: wp-content directory name */\n\t\t\techo '<p>' . sprintf( __( 'Drop-ins are advanced plugins in the %s directory that replace WordPress functionality when present.' ),\n\t\t\t\t'<code>' . str_replace( ABSPATH, '', WP_CONTENT_DIR ) . '</code>'\n\t\t\t) . '</p>';\n\t\t}\n\t\techo '</div>';\n\t}\n\n\t/**\n\t * @return string\n\t */\n\tpublic function current_action() {\n\t\tif ( isset($_POST['clear-recent-list']) )\n\t\t\treturn 'clear-recent-list';\n\n\t\treturn parent::current_action();\n\t}\n\n\t/**\n\t *\n\t * @global string $status\n\t */\n\tpublic function display_rows() {\n\t\tglobal $status;\n\n\t\tif ( is_multisite() && ! $this->screen->in_admin( 'network' ) && in_array( $status, array( 'mustuse', 'dropins' ) ) )\n\t\t\treturn;\n\n\t\tforeach ( $this->items as $plugin_file => $plugin_data )\n\t\t\t$this->single_row( array( $plugin_file, $plugin_data ) );\n\t}\n\n\t/**\n\t * @global string $status\n\t * @global int $page\n\t * @global string $s\n\t * @global array $totals\n\t *\n\t * @param array $item\n\t */\n\tpublic function single_row( $item ) {\n\t\tglobal $status, $page, $s, $totals;\n\n\t\tlist( $plugin_file, $plugin_data ) = $item;\n\t\t$context = $status;\n\t\t$screen = $this->screen;\n\n\t\t// Pre-order.\n\t\t$actions = array(\n\t\t\t'deactivate' => '',\n\t\t\t'activate' => '',\n\t\t\t'details' => '',\n\t\t\t'edit' => '',\n\t\t\t'delete' => '',\n\t\t);\n\n\t\t// Do not restrict by default\n\t\t$restrict_network_active = false;\n\t\t$restrict_network_only = false;\n\n\t\tif ( 'mustuse' === $context ) {\n\t\t\t$is_active = true;\n\t\t} elseif ( 'dropins' === $context ) {\n\t\t\t$dropins = _get_dropins();\n\t\t\t$plugin_name = $plugin_file;\n\t\t\tif ( $plugin_file != $plugin_data['Name'] )\n\t\t\t\t$plugin_name .= '<br/>' . $plugin_data['Name'];\n\t\t\tif ( true === ( $dropins[ $plugin_file ][1] ) ) { // Doesn't require a constant\n\t\t\t\t$is_active = true;\n\t\t\t\t$description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';\n\t\t\t} elseif ( defined( $dropins[ $plugin_file ][1] ) && constant( $dropins[ $plugin_file ][1] ) ) { // Constant is true\n\t\t\t\t$is_active = true;\n\t\t\t\t$description = '<p><strong>' . $dropins[ $plugin_file ][0] . '</strong></p>';\n\t\t\t} else {\n\t\t\t\t$is_active = false;\n\t\t\t\t$description = '<p><strong>' . $dropins[ $plugin_file ][0] . ' <span class=\"error-message\">' . __( 'Inactive:' ) . '</span></strong> ' .\n\t\t\t\t\t/* translators: 1: drop-in constant name, 2: wp-config.php */\n\t\t\t\t\tsprintf( __( 'Requires %1$s in %2$s file.' ),\n\t\t\t\t\t\t\"<code>define('\" . $dropins[ $plugin_file ][1] . \"', true);</code>\",\n\t\t\t\t\t\t'<code>wp-config.php</code>'\n\t\t\t\t\t) . '</p>';\n\t\t\t}\n\t\t\tif ( $plugin_data['Description'] )\n\t\t\t\t$description .= '<p>' . $plugin_data['Description'] . '</p>';\n\t\t} else {\n\t\t\tif ( $screen->in_admin( 'network' ) ) {\n\t\t\t\t$is_active = is_plugin_active_for_network( $plugin_file );\n\t\t\t} else {\n\t\t\t\t$is_active = is_plugin_active( $plugin_file );\n\t\t\t\t$restrict_network_active = ( is_multisite() && is_plugin_active_for_network( $plugin_file ) );\n\t\t\t\t$restrict_network_only = ( is_multisite() && is_network_only_plugin( $plugin_file ) && ! $is_active );\n\t\t\t}\n\n\t\t\tif ( $screen->in_admin( 'network' ) ) {\n\t\t\t\tif ( $is_active ) {\n\t\t\t\t\tif ( current_user_can( 'manage_network_plugins' ) ) {\n\t\t\t\t\t\t/* translators: %s: plugin name */\n\t\t\t\t\t\t$actions['deactivate'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ) . '\" aria-label=\"' . esc_attr( sprintf( __( 'Network deactivate %s' ), $plugin_data['Name'] ) ) . '\">' . __( 'Network Deactivate' ) . '</a>';\n\t\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( current_user_can( 'manage_network_plugins' ) ) {\n\t\t\t\t\t\t/* translators: %s: plugin name */\n\t\t\t\t\t\t$actions['activate'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ) . '\" class=\"edit\" aria-label=\"' . esc_attr( sprintf( __( 'Network Activate %s' ), $plugin_data['Name'] ) ) . '\">' . __( 'Network Activate' ) . '</a>';\n\t\t\t\t\t}\n\t\t\t\t\tif ( current_user_can( 'delete_plugins' ) && ! is_plugin_active( $plugin_file ) ) {\n\t\t\t\t\t\t/* translators: %s: plugin name */\n\t\t\t\t\t\t$actions['delete'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=delete-selected&amp;checked[]=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins' ) . '\" class=\"delete\" aria-label=\"' . esc_attr( sprintf( __( 'Delete %s' ), $plugin_data['Name'] ) ) . '\">' . __( 'Delete' ) . '</a>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( $restrict_network_active ) {\n\t\t\t\t\t$actions = array(\n\t\t\t\t\t\t'network_active' => __( 'Network Active' ),\n\t\t\t\t\t);\n\t\t\t\t} elseif ( $restrict_network_only ) {\n\t\t\t\t\t$actions = array(\n\t\t\t\t\t\t'network_only' => __( 'Network Only' ),\n\t\t\t\t\t);\n\t\t\t\t} elseif ( $is_active ) {\n\t\t\t\t\t/* translators: %s: plugin name */\n\t\t\t\t\t$actions['deactivate'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=deactivate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'deactivate-plugin_' . $plugin_file ) . '\" aria-label=\"' . esc_attr( sprintf( __( 'Deactivate %s' ), $plugin_data['Name'] ) ) . '\">' . __( 'Deactivate' ) . '</a>';\n\t\t\t\t} else {\n\t\t\t\t\t/* translators: %s: plugin name */\n\t\t\t\t\t$actions['activate'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'activate-plugin_' . $plugin_file ) . '\" class=\"edit\" aria-label=\"' . esc_attr( sprintf( __( 'Activate %s' ), $plugin_data['Name'] ) ) . '\">' . __( 'Activate' ) . '</a>';\n\n\t\t\t\t\tif ( ! is_multisite() && current_user_can( 'delete_plugins' ) ) {\n\t\t\t\t\t\t/* translators: %s: plugin name */\n\t\t\t\t\t\t$actions['delete'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=delete-selected&amp;checked[]=' . $plugin_file . '&amp;plugin_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-plugins' ) . '\" class=\"delete\" aria-label=\"' . esc_attr( sprintf( __( 'Delete %s' ), $plugin_data['Name'] ) ) . '\">' . __( 'Delete' ) . '</a>';\n\t\t\t\t\t}\n\t\t\t\t} // end if $is_active\n\n\t\t\t } // end if $screen->in_admin( 'network' )\n\n\t\t\tif ( ( ! is_multisite() || $screen->in_admin( 'network' ) ) && current_user_can( 'edit_plugins' ) && is_writable( WP_PLUGIN_DIR . '/' . $plugin_file ) ) {\n\t\t\t\t/* translators: %s: plugin name */\n\t\t\t\t$actions['edit'] = '<a href=\"plugin-editor.php?file=' . $plugin_file . '\" class=\"edit\" aria-label=\"' . esc_attr( sprintf( __( 'Edit %s' ), $plugin_data['Name'] ) ) . '\">' . __( 'Edit' ) . '</a>';\n\t\t\t}\n\t\t} // end if $context\n\n\t\t$actions = array_filter( $actions );\n\n\t\tif ( $screen->in_admin( 'network' ) ) {\n\n\t\t\t/**\n\t\t\t * Filter the action links displayed for each plugin in the Network Admin Plugins list table.\n\t\t\t *\n\t\t\t * The default action links for the Network plugins list table include\n\t\t\t * 'Network Activate', 'Network Deactivate', 'Edit', and 'Delete'.\n\t\t\t *\n\t\t\t * @since 3.1.0 As `{$prefix}_plugin_action_links`\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param array  $actions     An array of plugin action links.\n\t\t\t * @param string $plugin_file Path to the plugin file relative to the plugins directory.\n\t\t\t * @param array  $plugin_data An array of plugin data.\n\t\t\t * @param string $context     The plugin context. Defaults are 'All', 'Active',\n\t\t\t *                            'Inactive', 'Recently Activated', 'Upgrade',\n\t\t\t *                            'Must-Use', 'Drop-ins', 'Search'.\n\t\t\t */\n\t\t\t$actions = apply_filters( 'network_admin_plugin_action_links', $actions, $plugin_file, $plugin_data, $context );\n\n\t\t\t/**\n\t\t\t * Filter the list of action links displayed for a specific plugin in the Network Admin Plugins list table.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, $plugin_file, refers to the path\n\t\t\t * to the plugin file, relative to the plugins directory.\n\t\t\t *\n\t\t\t * @since 3.1.0 As `{$prefix}_plugin_action_links_{$plugin_file}`\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param array  $actions     An array of plugin action links.\n\t\t\t * @param string $plugin_file Path to the plugin file relative to the plugins directory.\n\t\t\t * @param array  $plugin_data An array of plugin data.\n\t\t\t * @param string $context     The plugin context. Defaults are 'All', 'Active',\n\t\t\t *                            'Inactive', 'Recently Activated', 'Upgrade',\n\t\t\t *                            'Must-Use', 'Drop-ins', 'Search'.\n\t\t\t */\n\t\t\t$actions = apply_filters( \"network_admin_plugin_action_links_{$plugin_file}\", $actions, $plugin_file, $plugin_data, $context );\n\n\t\t} else {\n\n\t\t\t/**\n\t\t\t * Filter the action links displayed for each plugin in the Plugins list table.\n\t\t\t *\n\t\t\t * The default action links for the site plugins list table include\n\t\t\t * 'Activate', 'Deactivate', and 'Edit', for a network site, and\n\t\t\t * 'Activate', 'Deactivate', 'Edit', and 'Delete' for a single site.\n\t\t\t *\n\t\t\t * @since 2.5.0 As `{$prefix}_plugin_action_links`\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param array  $actions     An array of plugin action links.\n\t\t\t * @param string $plugin_file Path to the plugin file relative to the plugins directory.\n\t\t\t * @param array  $plugin_data An array of plugin data.\n\t\t\t * @param string $context     The plugin context. Defaults are 'All', 'Active',\n\t\t\t *                            'Inactive', 'Recently Activated', 'Upgrade',\n\t\t\t *                            'Must-Use', 'Drop-ins', 'Search'.\n\t\t\t */\n\t\t\t$actions = apply_filters( 'plugin_action_links', $actions, $plugin_file, $plugin_data, $context );\n\n\t\t\t/**\n\t\t\t * Filter the list of action links displayed for a specific plugin in the Plugins list table.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, $plugin_file, refers to the path\n\t\t\t * to the plugin file, relative to the plugins directory.\n\t\t\t *\n\t\t\t * @since 2.7.0 As `{$prefix}_plugin_action_links_{$plugin_file}`\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param array  $actions     An array of plugin action links.\n\t\t\t * @param string $plugin_file Path to the plugin file relative to the plugins directory.\n\t\t\t * @param array  $plugin_data An array of plugin data.\n\t\t\t * @param string $context     The plugin context. Defaults are 'All', 'Active',\n\t\t\t *                            'Inactive', 'Recently Activated', 'Upgrade',\n\t\t\t *                            'Must-Use', 'Drop-ins', 'Search'.\n\t\t\t */\n\t\t\t$actions = apply_filters( \"plugin_action_links_{$plugin_file}\", $actions, $plugin_file, $plugin_data, $context );\n\n\t\t}\n\n\t\t$class = $is_active ? 'active' : 'inactive';\n\t\t$checkbox_id =  \"checkbox_\" . md5($plugin_data['Name']);\n\t\tif ( $restrict_network_active || $restrict_network_only || in_array( $status, array( 'mustuse', 'dropins' ) ) ) {\n\t\t\t$checkbox = '';\n\t\t} else {\n\t\t\t$checkbox = \"<label class='screen-reader-text' for='\" . $checkbox_id . \"' >\" . sprintf( __( 'Select %s' ), $plugin_data['Name'] ) . \"</label>\"\n\t\t\t\t. \"<input type='checkbox' name='checked[]' value='\" . esc_attr( $plugin_file ) . \"' id='\" . $checkbox_id . \"' />\";\n\t\t}\n\t\tif ( 'dropins' != $context ) {\n\t\t\t$description = '<p>' . ( $plugin_data['Description'] ? $plugin_data['Description'] : '&nbsp;' ) . '</p>';\n\t\t\t$plugin_name = $plugin_data['Name'];\n\t\t}\n\n\t\t$id = sanitize_title( $plugin_name );\n\t\tif ( ! empty( $totals['upgrade'] ) && ! empty( $plugin_data['update'] ) )\n\t\t\t$class .= ' update';\n\n\t\t$plugin_slug = ( isset( $plugin_data['slug'] ) ) ? $plugin_data['slug'] : '';\n\t\tprintf( \"<tr id='%s' class='%s' data-slug='%s'>\",\n\t\t\t$id,\n\t\t\t$class,\n\t\t\t$plugin_slug\n\t\t);\n\n\t\tlist( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();\n\n\t\tforeach ( $columns as $column_name => $column_display_name ) {\n\t\t\t$extra_classes = '';\n\t\t\tif ( in_array( $column_name, $hidden ) ) {\n\t\t\t\t$extra_classes = ' hidden';\n\t\t\t}\n\n\t\t\tswitch ( $column_name ) {\n\t\t\t\tcase 'cb':\n\t\t\t\t\techo \"<th scope='row' class='check-column'>$checkbox</th>\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'name':\n\t\t\t\t\techo \"<td class='plugin-title column-primary'><strong>$plugin_name</strong>\";\n\t\t\t\t\techo $this->row_actions( $actions, true );\n\t\t\t\t\techo \"</td>\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'description':\n\t\t\t\t\t$classes = 'column-description desc';\n\n\t\t\t\t\techo \"<td class='$classes{$extra_classes}'>\n\t\t\t\t\t\t<div class='plugin-description'>$description</div>\n\t\t\t\t\t\t<div class='$class second plugin-version-author-uri'>\";\n\n\t\t\t\t\t$plugin_meta = array();\n\t\t\t\t\tif ( !empty( $plugin_data['Version'] ) )\n\t\t\t\t\t\t$plugin_meta[] = sprintf( __( 'Version %s' ), $plugin_data['Version'] );\n\t\t\t\t\tif ( !empty( $plugin_data['Author'] ) ) {\n\t\t\t\t\t\t$author = $plugin_data['Author'];\n\t\t\t\t\t\tif ( !empty( $plugin_data['AuthorURI'] ) )\n\t\t\t\t\t\t\t$author = '<a href=\"' . $plugin_data['AuthorURI'] . '\">' . $plugin_data['Author'] . '</a>';\n\t\t\t\t\t\t$plugin_meta[] = sprintf( __( 'By %s' ), $author );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Details link using API info, if available\n\t\t\t\t\tif ( isset( $plugin_data['slug'] ) && current_user_can( 'install_plugins' ) ) {\n\t\t\t\t\t\t$plugin_meta[] = sprintf( '<a href=\"%s\" class=\"thickbox\" aria-label=\"%s\" data-title=\"%s\">%s</a>',\n\t\t\t\t\t\t\tesc_url( network_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $plugin_data['slug'] .\n\t\t\t\t\t\t\t\t'&TB_iframe=true&width=600&height=550' ) ),\n\t\t\t\t\t\t\tesc_attr( sprintf( __( 'More information about %s' ), $plugin_name ) ),\n\t\t\t\t\t\t\tesc_attr( $plugin_name ),\n\t\t\t\t\t\t\t__( 'View details' )\n\t\t\t\t\t\t);\n\t\t\t\t\t} elseif ( ! empty( $plugin_data['PluginURI'] ) ) {\n\t\t\t\t\t\t$plugin_meta[] = sprintf( '<a href=\"%s\">%s</a>',\n\t\t\t\t\t\t\tesc_url( $plugin_data['PluginURI'] ),\n\t\t\t\t\t\t\t__( 'Visit plugin site' )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the array of row meta for each plugin in the Plugins list table.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.8.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param array  $plugin_meta An array of the plugin's metadata,\n\t\t\t\t\t *                            including the version, author,\n\t\t\t\t\t *                            author URI, and plugin URI.\n\t\t\t\t\t * @param string $plugin_file Path to the plugin file, relative to the plugins directory.\n\t\t\t\t\t * @param array  $plugin_data An array of plugin data.\n\t\t\t\t\t * @param string $status      Status of the plugin. Defaults are 'All', 'Active',\n\t\t\t\t\t *                            'Inactive', 'Recently Activated', 'Upgrade', 'Must-Use',\n\t\t\t\t\t *                            'Drop-ins', 'Search'.\n\t\t\t\t\t */\n\t\t\t\t\t$plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );\n\t\t\t\t\techo implode( ' | ', $plugin_meta );\n\n\t\t\t\t\techo \"</div></td>\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$classes = \"$column_name column-$column_name$class\";\n\n\t\t\t\t\techo \"<td class='$classes{$extra_classes}'>\";\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Fires inside each custom column of the Plugins list table.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 3.1.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param string $column_name Name of the column.\n\t\t\t\t\t * @param string $plugin_file Path to the plugin file.\n\t\t\t\t\t * @param array  $plugin_data An array of plugin data.\n\t\t\t\t\t */\n\t\t\t\t\tdo_action( 'manage_plugins_custom_column', $column_name, $plugin_file, $plugin_data );\n\n\t\t\t\t\techo \"</td>\";\n\t\t\t}\n\t\t}\n\n\t\techo \"</tr>\";\n\n\t\t/**\n\t\t * Fires after each row in the Plugins list table.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param string $plugin_file Path to the plugin file, relative to the plugins directory.\n\t\t * @param array  $plugin_data An array of plugin data.\n\t\t * @param string $status      Status of the plugin. Defaults are 'All', 'Active',\n\t\t *                            'Inactive', 'Recently Activated', 'Upgrade', 'Must-Use',\n\t\t *                            'Drop-ins', 'Search'.\n\t\t */\n\t\tdo_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );\n\n\t\t/**\n\t\t * Fires after each specific row in the Plugins list table.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$plugin_file`, refers to the path\n\t\t * to the plugin file, relative to the plugins directory.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param string $plugin_file Path to the plugin file, relative to the plugins directory.\n\t\t * @param array  $plugin_data An array of plugin data.\n\t\t * @param string $status      Status of the plugin. Defaults are 'All', 'Active',\n\t\t *                            'Inactive', 'Recently Activated', 'Upgrade', 'Must-Use',\n\t\t *                            'Drop-ins', 'Search'.\n\t\t */\n\t\tdo_action( \"after_plugin_row_$plugin_file\", $plugin_file, $plugin_data, $status );\n\t}\n\n\t/**\n\t * Gets the name of the primary column for this specific list table.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Unalterable name for the primary column, in this case, 'name'.\n\t */\n\tprotected function get_primary_column_name() {\n\t\treturn 'name';\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-post-comments-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Post_Comments_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement displaying post comments in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_Comments_List_Table\n */\nclass WP_Post_Comments_List_Table extends WP_Comments_List_Table {\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_column_info() {\n\t\treturn array(\n\t\t\tarray(\n\t\t\t\t'author'   => __( 'Author' ),\n\t\t\t\t'comment'  => _x( 'Comment', 'column name' ),\n\t\t\t),\n\t\t\tarray(),\n\t\t\tarray(),\n\t\t\t'comment',\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_table_classes() {\n\t\t$classes = parent::get_table_classes();\n\t\t$classes[] = 'wp-list-table';\n\t\t$classes[] = 'comments-box';\n\t\treturn $classes;\n\t}\n\n\t/**\n\t *\n\t * @param bool $output_empty\n\t */\n\tpublic function display( $output_empty = false ) {\n\t\t$singular = $this->_args['singular'];\n\n\t\twp_nonce_field( \"fetch-list-\" . get_class( $this ), '_ajax_fetch_list_nonce' );\n?>\n<table class=\"<?php echo implode( ' ', $this->get_table_classes() ); ?>\" style=\"display:none;\">\n\t<tbody id=\"the-comment-list\"<?php\n\t\tif ( $singular ) {\n\t\t\techo \" data-wp-lists='list:$singular'\";\n\t\t} ?>>\n\t\t<?php if ( ! $output_empty ) {\n\t\t\t$this->display_rows_or_placeholder();\n\t\t} ?>\n\t</tbody>\n</table>\n<?php\n\t}\n\n\t/**\n\t *\n\t * @param bool $comment_status\n\t * @return int\n\t */\n\tpublic function get_per_page( $comment_status = false ) {\n\t\treturn 10;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-posts-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Posts_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying posts in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_Posts_List_Table extends WP_List_Table {\n\n\t/**\n\t * Whether the items should be displayed hierarchically or linearly.\n\t *\n\t * @since 3.1.0\n\t * @var bool\n\t * @access protected\n\t */\n\tprotected $hierarchical_display;\n\n\t/**\n\t * Holds the number of pending comments for each post.\n\t *\n\t * @since 3.1.0\n\t * @var array\n\t * @access protected\n\t */\n\tprotected $comment_pending_count;\n\n\t/**\n\t * Holds the number of posts for this user.\n\t *\n\t * @since 3.1.0\n\t * @var int\n\t * @access private\n\t */\n\tprivate $user_posts_count;\n\n\t/**\n\t * Holds the number of posts which are sticky.\n\t *\n\t * @since 3.1.0\n\t * @var int\n\t * @access private\n\t */\n\tprivate $sticky_posts_count = 0;\n\n\tprivate $is_trash;\n\n\t/**\n\t * Current level for output.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @var int\n\t */\n\tprotected $current_level = 0;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @global object $post_type_object\n\t * @global wpdb   $wpdb\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\tglobal $post_type_object, $wpdb;\n\n\t\tparent::__construct( array(\n\t\t\t'plural' => 'posts',\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\n\t\t$post_type        = $this->screen->post_type;\n\t\t$post_type_object = get_post_type_object( $post_type );\n\n\t\t$exclude_states   = get_post_stati( array(\n\t\t\t'show_in_admin_all_list' => false,\n\t\t) );\n\t\t$this->user_posts_count = intval( $wpdb->get_var( $wpdb->prepare( \"\n\t\t\tSELECT COUNT( 1 )\n\t\t\tFROM $wpdb->posts\n\t\t\tWHERE post_type = %s\n\t\t\tAND post_status NOT IN ( '\" . implode( \"','\", $exclude_states ) . \"' )\n\t\t\tAND post_author = %d\n\t\t\", $post_type, get_current_user_id() ) ) );\n\n\t\tif ( $this->user_posts_count && ! current_user_can( $post_type_object->cap->edit_others_posts ) && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['all_posts'] ) && empty( $_REQUEST['author'] ) && empty( $_REQUEST['show_sticky'] ) ) {\n\t\t\t$_GET['author'] = get_current_user_id();\n\t\t}\n\n\t\tif ( 'post' === $post_type && $sticky_posts = get_option( 'sticky_posts' ) ) {\n\t\t\t$sticky_posts = implode( ', ', array_map( 'absint', (array) $sticky_posts ) );\n\t\t\t$this->sticky_posts_count = $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT( 1 ) FROM $wpdb->posts WHERE post_type = %s AND post_status NOT IN ('trash', 'auto-draft') AND ID IN ($sticky_posts)\", $post_type ) );\n\t\t}\n\t}\n\n\t/**\n\t * Sets whether the table layout should be hierarchical or not.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param bool $display Whether the table layout should be hierarchical.\n\t */\n\tpublic function set_hierarchical_display( $display ) {\n\t\t$this->hierarchical_display = $display;\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_posts );\n\t}\n\n\t/**\n\t *\n\t * @global array    $avail_post_stati\n\t * @global WP_Query $wp_query\n\t * @global int      $per_page\n\t * @global string   $mode\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $avail_post_stati, $wp_query, $per_page, $mode;\n\n\t\t// is going to call wp()\n\t\t$avail_post_stati = wp_edit_posts_query();\n\n\t\t$this->set_hierarchical_display( is_post_type_hierarchical( $this->screen->post_type ) && 'menu_order title' === $wp_query->query['orderby'] );\n\n\t\t$post_type = $this->screen->post_type;\n\t\t$per_page = $this->get_items_per_page( 'edit_' . $post_type . '_per_page' );\n\n\t\t/** This filter is documented in wp-admin/includes/post.php */\n \t\t$per_page = apply_filters( 'edit_posts_per_page', $per_page, $post_type );\n\n\t\tif ( $this->hierarchical_display ) {\n\t\t\t$total_items = $wp_query->post_count;\n\t\t} elseif ( $wp_query->found_posts || $this->get_pagenum() === 1 ) {\n\t\t\t$total_items = $wp_query->found_posts;\n\t\t} else {\n\t\t\t$post_counts = (array) wp_count_posts( $post_type, 'readable' );\n\n\t\t\tif ( isset( $_REQUEST['post_status'] ) && in_array( $_REQUEST['post_status'] , $avail_post_stati ) ) {\n\t\t\t\t$total_items = $post_counts[ $_REQUEST['post_status'] ];\n\t\t\t} elseif ( isset( $_REQUEST['show_sticky'] ) && $_REQUEST['show_sticky'] ) {\n\t\t\t\t$total_items = $this->sticky_posts_count;\n\t\t\t} elseif ( isset( $_GET['author'] ) && $_GET['author'] == get_current_user_id() ) {\n\t\t\t\t$total_items = $this->user_posts_count;\n\t\t\t} else {\n\t\t\t\t$total_items = array_sum( $post_counts );\n\n\t\t\t\t// Subtract post types that are not included in the admin all list.\n\t\t\t\tforeach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) {\n\t\t\t\t\t$total_items -= $post_counts[ $state ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $_REQUEST['mode'] ) ) {\n\t\t\t$mode = $_REQUEST['mode'] === 'excerpt' ? 'excerpt' : 'list';\n\t\t\tset_user_setting ( 'posts_list_mode', $mode );\n\t\t} else {\n\t\t\t$mode = get_user_setting ( 'posts_list_mode', 'list' );\n\t\t}\n\n\t\t$this->is_trash = isset( $_REQUEST['post_status'] ) && $_REQUEST['post_status'] === 'trash';\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $total_items,\n\t\t\t'per_page' => $per_page\n\t\t) );\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function has_items() {\n\t\treturn have_posts();\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\tif ( isset( $_REQUEST['post_status'] ) && 'trash' === $_REQUEST['post_status'] )\n\t\t\techo get_post_type_object( $this->screen->post_type )->labels->not_found_in_trash;\n\t\telse\n\t\t\techo get_post_type_object( $this->screen->post_type )->labels->not_found;\n\t}\n\n\t/**\n\t * Determine if the current view is the \"All\" view.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @return bool Whether the current view is the \"All\" view.\n\t */\n\tprotected function is_base_request() {\n\t\t$vars = $_GET;\n\t\tunset( $vars['paged'] );\n\n\t\tif ( empty( $vars ) ) {\n\t\t\treturn true;\n\t\t} elseif ( 1 === count( $vars ) && ! empty( $vars['post_type'] ) ) {\n\t\t\treturn $this->screen->post_type === $vars['post_type'];\n\t\t}\n\n\t\treturn 1 === count( $vars ) && ! empty( $vars['mode'] );\n\t}\n\n\t/**\n\t * Helper to create links to edit.php with params.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @param array  $args  URL parameters for the link.\n\t * @param string $label Link text.\n\t * @param string $class Optional. Class attribute. Default empty string.\n\t * @return string The formatted link string.\n\t */\n\tprotected function get_edit_link( $args, $label, $class = '' ) {\n\t\t$url = add_query_arg( $args, 'edit.php' );\n\n\t\t$class_html = '';\n\t\tif ( ! empty( $class ) ) {\n\t\t\t $class_html = sprintf(\n\t\t\t\t' class=\"%s\"',\n\t\t\t\tesc_attr( $class )\n\t\t\t);\n\t\t}\n\n\t\treturn sprintf(\n\t\t\t'<a href=\"%s\"%s>%s</a>',\n\t\t\tesc_url( $url ),\n\t\t\t$class_html,\n\t\t\t$label\n\t\t);\n\t}\n\n\t/**\n\t *\n\t * @global array $locked_post_status This seems to be deprecated.\n\t * @global array $avail_post_stati\n\t * @return array\n\t */\n\tprotected function get_views() {\n\t\tglobal $locked_post_status, $avail_post_stati;\n\n\t\t$post_type = $this->screen->post_type;\n\n\t\tif ( !empty($locked_post_status) )\n\t\t\treturn array();\n\n\t\t$status_links = array();\n\t\t$num_posts = wp_count_posts( $post_type, 'readable' );\n\t\t$total_posts = array_sum( (array) $num_posts );\n\t\t$class = '';\n\n\t\t$current_user_id = get_current_user_id();\n\t\t$all_args = array( 'post_type' => $post_type );\n\t\t$mine = '';\n\n\t\t// Subtract post types that are not included in the admin all list.\n\t\tforeach ( get_post_stati( array( 'show_in_admin_all_list' => false ) ) as $state ) {\n\t\t\t$total_posts -= $num_posts->$state;\n\t\t}\n\n\t\tif ( $this->user_posts_count && $this->user_posts_count !== $total_posts ) {\n\t\t\tif ( isset( $_GET['author'] ) && ( $_GET['author'] == $current_user_id ) ) {\n\t\t\t\t$class = 'current';\n\t\t\t}\n\n\t\t\t$mine_args = array(\n\t\t\t\t'post_type' => $post_type,\n\t\t\t\t'author' => $current_user_id\n\t\t\t);\n\n\t\t\t$mine_inner_html = sprintf(\n\t\t\t\t_nx(\n\t\t\t\t\t'Mine <span class=\"count\">(%s)</span>',\n\t\t\t\t\t'Mine <span class=\"count\">(%s)</span>',\n\t\t\t\t\t$this->user_posts_count,\n\t\t\t\t\t'posts'\n\t\t\t\t),\n\t\t\t\tnumber_format_i18n( $this->user_posts_count )\n\t\t\t);\n\n\t\t\t$mine = $this->get_edit_link( $mine_args, $mine_inner_html, $class );\n\n\t\t\t$all_args['all_posts'] = 1;\n\t\t\t$class = '';\n\t\t}\n\n\t\tif ( empty( $class ) && ( $this->is_base_request() || isset( $_REQUEST['all_posts'] ) ) ) {\n\t\t\t$class = 'current';\n\t\t}\n\n\t\t$all_inner_html = sprintf(\n\t\t\t_nx(\n\t\t\t\t'All <span class=\"count\">(%s)</span>',\n\t\t\t\t'All <span class=\"count\">(%s)</span>',\n\t\t\t\t$total_posts,\n\t\t\t\t'posts'\n\t\t\t),\n\t\t\tnumber_format_i18n( $total_posts )\n\t\t);\n\n\t\t$status_links['all'] = $this->get_edit_link( $all_args, $all_inner_html, $class );\n\t\tif ( $mine ) {\n\t\t\t$status_links['mine'] = $mine;\n\t\t}\n\n\t\tforeach ( get_post_stati(array('show_in_admin_status_list' => true), 'objects') as $status ) {\n\t\t\t$class = '';\n\n\t\t\t$status_name = $status->name;\n\n\t\t\tif ( ! in_array( $status_name, $avail_post_stati ) || empty( $num_posts->$status_name ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( isset($_REQUEST['post_status']) && $status_name === $_REQUEST['post_status'] ) {\n\t\t\t\t$class = 'current';\n\t\t\t}\n\n\t\t\t$status_args = array(\n\t\t\t\t'post_status' => $status_name,\n\t\t\t\t'post_type' => $post_type,\n\t\t\t);\n\n\t\t\t$status_label = sprintf(\n\t\t\t\ttranslate_nooped_plural( $status->label_count, $num_posts->$status_name ),\n\t\t\t\tnumber_format_i18n( $num_posts->$status_name )\n\t\t\t);\n\n\t\t\t$status_links[ $status_name ] = $this->get_edit_link( $status_args, $status_label, $class );\n\t\t}\n\n\t\tif ( ! empty( $this->sticky_posts_count ) ) {\n\t\t\t$class = ! empty( $_REQUEST['show_sticky'] ) ? 'current' : '';\n\n\t\t\t$sticky_args = array(\n\t\t\t\t'post_type'\t=> $post_type,\n\t\t\t\t'show_sticky' => 1\n\t\t\t);\n\n\t\t\t$sticky_inner_html = sprintf(\n\t\t\t\t_nx(\n\t\t\t\t\t'Sticky <span class=\"count\">(%s)</span>',\n\t\t\t\t\t'Sticky <span class=\"count\">(%s)</span>',\n\t\t\t\t\t$this->sticky_posts_count,\n\t\t\t\t\t'posts'\n\t\t\t\t),\n\t\t\t\tnumber_format_i18n( $this->sticky_posts_count )\n\t\t\t);\n\n\t\t\t$sticky_link = array(\n\t\t\t\t'sticky' => $this->get_edit_link( $sticky_args, $sticky_inner_html, $class )\n\t\t\t);\n\n\t\t\t// Sticky comes after Publish, or if not listed, after All.\n\t\t\t$split = 1 + array_search( ( isset( $status_links['publish'] ) ? 'publish' : 'all' ), array_keys( $status_links ) );\n\t\t\t$status_links = array_merge( array_slice( $status_links, 0, $split ), $sticky_link, array_slice( $status_links, $split ) );\n\t\t}\n\n\t\treturn $status_links;\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\t$actions = array();\n\t\t$post_type_obj = get_post_type_object( $this->screen->post_type );\n\n\t\tif ( current_user_can( $post_type_obj->cap->edit_posts ) ) {\n\t\t\tif ( $this->is_trash ) {\n\t\t\t\t$actions['untrash'] = __( 'Restore' );\n\t\t\t} else {\n\t\t\t\t$actions['edit'] = __( 'Edit' );\n\t\t\t}\n\t\t}\n\n\t\tif ( current_user_can( $post_type_obj->cap->delete_posts ) ) {\n\t\t\tif ( $this->is_trash || ! EMPTY_TRASH_DAYS ) {\n\t\t\t\t$actions['delete'] = __( 'Delete Permanently' );\n\t\t\t} else {\n\t\t\t\t$actions['trash'] = __( 'Move to Trash' );\n\t\t\t}\n\t\t}\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t * @global int $cat\n\t * @param string $which\n\t */\n\tprotected function extra_tablenav( $which ) {\n\t\tglobal $cat;\n?>\n\t\t<div class=\"alignleft actions\">\n<?php\n\t\tif ( 'top' === $which && !is_singular() ) {\n\n\t\t\t$this->months_dropdown( $this->screen->post_type );\n\n\t\t\tif ( is_object_in_taxonomy( $this->screen->post_type, 'category' ) ) {\n\t\t\t\t$dropdown_options = array(\n\t\t\t\t\t'show_option_all' => __( 'All categories' ),\n\t\t\t\t\t'hide_empty' => 0,\n\t\t\t\t\t'hierarchical' => 1,\n\t\t\t\t\t'show_count' => 0,\n\t\t\t\t\t'orderby' => 'name',\n\t\t\t\t\t'selected' => $cat\n\t\t\t\t);\n\n\t\t\t\techo '<label class=\"screen-reader-text\" for=\"cat\">' . __( 'Filter by category' ) . '</label>';\n\t\t\t\twp_dropdown_categories( $dropdown_options );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Fires before the Filter button on the Posts and Pages list tables.\n\t\t\t *\n\t\t\t * The Filter button allows sorting by date and/or category on the\n\t\t\t * Posts list table, and sorting by date on the Pages list table.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t * @since 4.4.0 The `$post_type` parameter was added.\n\t\t\t *\n\t\t\t * @param string $post_type The post type slug.\n\t\t\t */\n\t\t\tdo_action( 'restrict_manage_posts', $this->screen->post_type );\n\n\t\t\tsubmit_button( __( 'Filter' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) );\n\t\t}\n\n\t\tif ( $this->is_trash && current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_others_posts ) ) {\n\t\t\tsubmit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false );\n\t\t}\n?>\n\t\t</div>\n<?php\n\t\t/**\n\t\t * Fires immediately following the closing \"actions\" div in the tablenav for the posts\n\t\t * list table.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string $which The location of the extra table nav markup: 'top' or 'bottom'.\n\t\t */\n\t\tdo_action( 'manage_posts_extra_tablenav', $which );\n\t}\n\n\t/**\n\t *\n\t * @return string\n\t */\n\tpublic function current_action() {\n\t\tif ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )\n\t\t\treturn 'delete_all';\n\n\t\treturn parent::current_action();\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_table_classes() {\n\t\treturn array( 'widefat', 'fixed', 'striped', is_post_type_hierarchical( $this->screen->post_type ) ? 'pages' : 'posts' );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\t$post_type = $this->screen->post_type;\n\n\t\t$posts_columns = array();\n\n\t\t$posts_columns['cb'] = '<input type=\"checkbox\" />';\n\n\t\t/* translators: manage posts column name */\n\t\t$posts_columns['title'] = _x( 'Title', 'column name' );\n\n\t\tif ( post_type_supports( $post_type, 'author' ) ) {\n\t\t\t$posts_columns['author'] = __( 'Author' );\n\t\t}\n\n\t\t$taxonomies = get_object_taxonomies( $post_type, 'objects' );\n\t\t$taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' );\n\n\t\t/**\n\t\t * Filter the taxonomy columns in the Posts list table.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$post_type`, refers to the post\n\t\t * type slug.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param array  $taxonomies Array of taxonomies to show columns for.\n\t\t * @param string $post_type  The post type.\n\t\t */\n\t\t$taxonomies = apply_filters( \"manage_taxonomies_for_{$post_type}_columns\", $taxonomies, $post_type );\n\t\t$taxonomies = array_filter( $taxonomies, 'taxonomy_exists' );\n\n\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\tif ( 'category' === $taxonomy )\n\t\t\t\t$column_key = 'categories';\n\t\t\telseif ( 'post_tag' === $taxonomy )\n\t\t\t\t$column_key = 'tags';\n\t\t\telse\n\t\t\t\t$column_key = 'taxonomy-' . $taxonomy;\n\n\t\t\t$posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name;\n\t\t}\n\n\t\t$post_status = !empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all';\n\t\tif ( post_type_supports( $post_type, 'comments' ) && !in_array( $post_status, array( 'pending', 'draft', 'future' ) ) )\n\t\t\t$posts_columns['comments'] = '<span class=\"vers comment-grey-bubble\" title=\"' . esc_attr__( 'Comments' ) . '\"><span class=\"screen-reader-text\">' . __( 'Comments' ) . '</span></span>';\n\n\t\t$posts_columns['date'] = __( 'Date' );\n\n\t\tif ( 'page' === $post_type ) {\n\n\t\t\t/**\n\t\t\t * Filter the columns displayed in the Pages list table.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param array $post_columns An array of column names.\n\t\t\t */\n\t\t\t$posts_columns = apply_filters( 'manage_pages_columns', $posts_columns );\n\t\t} else {\n\n\t\t\t/**\n\t\t\t * Filter the columns displayed in the Posts list table.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t *\n\t\t\t * @param array  $posts_columns An array of column names.\n\t\t\t * @param string $post_type     The post type slug.\n\t\t\t */\n\t\t\t$posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type );\n\t\t}\n\n\t\t/**\n\t\t * Filter the columns displayed in the Posts list table for a specific post type.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$post_type`, refers to the post type slug.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $post_columns An array of column names.\n\t\t */\n\t\treturn apply_filters( \"manage_{$post_type}_posts_columns\", $posts_columns );\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array(\n\t\t\t'title'    => 'title',\n\t\t\t'parent'   => 'parent',\n\t\t\t'comments' => 'comment_count',\n\t\t\t'date'     => array( 'date', true )\n\t\t);\n\t}\n\n\t/**\n\t * @global WP_Query $wp_query\n\t * @global int $per_page\n\t * @param array $posts\n\t * @param int $level\n\t */\n\tpublic function display_rows( $posts = array(), $level = 0 ) {\n\t\tglobal $wp_query, $per_page;\n\n\t\tif ( empty( $posts ) )\n\t\t\t$posts = $wp_query->posts;\n\n\t\tadd_filter( 'the_title', 'esc_html' );\n\n\t\tif ( $this->hierarchical_display ) {\n\t\t\t$this->_display_rows_hierarchical( $posts, $this->get_pagenum(), $per_page );\n\t\t} else {\n\t\t\t$this->_display_rows( $posts, $level );\n\t\t}\n\t}\n\n\t/**\n\t * @param array $posts\n\t * @param int $level\n\t */\n\tprivate function _display_rows( $posts, $level = 0 ) {\n\t\t// Create array of post IDs.\n\t\t$post_ids = array();\n\n\t\tforeach ( $posts as $a_post )\n\t\t\t$post_ids[] = $a_post->ID;\n\n\t\t$this->comment_pending_count = get_pending_comments_num( $post_ids );\n\n\t\tforeach ( $posts as $post )\n\t\t\t$this->single_row( $post, $level );\n\t}\n\n\t/**\n\t * @global wpdb    $wpdb\n\t * @global WP_Post $post\n\t * @param array $pages\n\t * @param int $pagenum\n\t * @param int $per_page\n\t */\n\tprivate function _display_rows_hierarchical( $pages, $pagenum = 1, $per_page = 20 ) {\n\t\tglobal $wpdb;\n\n\t\t$level = 0;\n\n\t\tif ( ! $pages ) {\n\t\t\t$pages = get_pages( array( 'sort_column' => 'menu_order' ) );\n\n\t\t\tif ( ! $pages )\n\t\t\t\treturn;\n\t\t}\n\n\t\t/*\n\t\t * Arrange pages into two parts: top level pages and children_pages\n\t\t * children_pages is two dimensional array, eg.\n\t\t * children_pages[10][] contains all sub-pages whose parent is 10.\n\t\t * It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations\n\t\t * If searching, ignore hierarchy and treat everything as top level\n\t\t */\n\t\tif ( empty( $_REQUEST['s'] ) ) {\n\n\t\t\t$top_level_pages = array();\n\t\t\t$children_pages = array();\n\n\t\t\tforeach ( $pages as $page ) {\n\n\t\t\t\t// Catch and repair bad pages.\n\t\t\t\tif ( $page->post_parent == $page->ID ) {\n\t\t\t\t\t$page->post_parent = 0;\n\t\t\t\t\t$wpdb->update( $wpdb->posts, array( 'post_parent' => 0 ), array( 'ID' => $page->ID ) );\n\t\t\t\t\tclean_post_cache( $page );\n\t\t\t\t}\n\n\t\t\t\tif ( 0 == $page->post_parent )\n\t\t\t\t\t$top_level_pages[] = $page;\n\t\t\t\telse\n\t\t\t\t\t$children_pages[ $page->post_parent ][] = $page;\n\t\t\t}\n\n\t\t\t$pages = &$top_level_pages;\n\t\t}\n\n\t\t$count = 0;\n\t\t$start = ( $pagenum - 1 ) * $per_page;\n\t\t$end = $start + $per_page;\n\t\t$to_display = array();\n\n\t\tforeach ( $pages as $page ) {\n\t\t\tif ( $count >= $end )\n\t\t\t\tbreak;\n\n\t\t\tif ( $count >= $start ) {\n\t\t\t\t$to_display[$page->ID] = $level;\n\t\t\t}\n\n\t\t\t$count++;\n\n\t\t\tif ( isset( $children_pages ) )\n\t\t\t\t$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );\n\t\t}\n\n\t\t// If it is the last pagenum and there are orphaned pages, display them with paging as well.\n\t\tif ( isset( $children_pages ) && $count < $end ){\n\t\t\tforeach ( $children_pages as $orphans ){\n\t\t\t\tforeach ( $orphans as $op ) {\n\t\t\t\t\tif ( $count >= $end )\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tif ( $count >= $start ) {\n\t\t\t\t\t\t$to_display[$op->ID] = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t$count++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$ids = array_keys( $to_display );\n\t\t_prime_post_caches( $ids );\n\n\t\tif ( ! isset( $GLOBALS['post'] ) ) {\n\t\t\t$GLOBALS['post'] = reset( $ids );\n\t\t}\n\n\t\tforeach ( $to_display as $page_id => $level ) {\n\t\t\techo \"\\t\";\n\t\t\t$this->single_row( $page_id, $level );\n\t\t}\n\t}\n\n\t/**\n\t * Given a top level page ID, display the nested hierarchy of sub-pages\n\t * together with paging support\n\t *\n\t * @since 3.1.0 (Standalone function exists since 2.6.0)\n\t * @since 4.2.0 Added the `$to_display` parameter.\n\t *\n\t * @param array $children_pages\n\t * @param int $count\n\t * @param int $parent\n\t * @param int $level\n\t * @param int $pagenum\n\t * @param int $per_page\n\t * @param array $to_display List of pages to be displayed. Passed by reference.\n\t */\n\tprivate function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page, &$to_display ) {\n\t\tif ( ! isset( $children_pages[$parent] ) )\n\t\t\treturn;\n\n\t\t$start = ( $pagenum - 1 ) * $per_page;\n\t\t$end = $start + $per_page;\n\n\t\tforeach ( $children_pages[$parent] as $page ) {\n\t\t\tif ( $count >= $end )\n\t\t\t\tbreak;\n\n\t\t\t// If the page starts in a subtree, print the parents.\n\t\t\tif ( $count == $start && $page->post_parent > 0 ) {\n\t\t\t\t$my_parents = array();\n\t\t\t\t$my_parent = $page->post_parent;\n\t\t\t\twhile ( $my_parent ) {\n\t\t\t\t\t// Get the ID from the list or the attribute if my_parent is an object\n\t\t\t\t\t$parent_id = $my_parent;\n\t\t\t\t\tif ( is_object( $my_parent ) ) {\n\t\t\t\t\t\t$parent_id = $my_parent->ID;\n\t\t\t\t\t}\n\n\t\t\t\t\t$my_parent = get_post( $parent_id );\n\t\t\t\t\t$my_parents[] = $my_parent;\n\t\t\t\t\tif ( !$my_parent->post_parent )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t$my_parent = $my_parent->post_parent;\n\t\t\t\t}\n\t\t\t\t$num_parents = count( $my_parents );\n\t\t\t\twhile ( $my_parent = array_pop( $my_parents ) ) {\n\t\t\t\t\t$to_display[$my_parent->ID] = $level - $num_parents;\n\t\t\t\t\t$num_parents--;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $count >= $start ) {\n\t\t\t\t$to_display[$page->ID] = $level;\n\t\t\t}\n\n\t\t\t$count++;\n\n\t\t\t$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page, $to_display );\n\t\t}\n\n\t\tunset( $children_pages[$parent] ); //required in order to keep track of orphans\n\t}\n\n\t/**\n\t * Handles the checkbox column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_cb( $post ) {\n\t\tif ( current_user_can( 'edit_post', $post->ID ) ): ?>\n\t\t\t<label class=\"screen-reader-text\" for=\"cb-select-<?php the_ID(); ?>\"><?php\n\t\t\t\tprintf( __( 'Select %s' ), _draft_or_post_title() );\n\t\t\t?></label>\n\t\t\t<input id=\"cb-select-<?php the_ID(); ?>\" type=\"checkbox\" name=\"post[]\" value=\"<?php the_ID(); ?>\" />\n\t\t\t<div class=\"locked-indicator\"></div>\n\t\t<?php endif;\n\t}\n\n\t/**\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param WP_Post $post\n\t * @param string  $classes\n\t * @param string  $data\n\t * @param string  $primary\n\t */\n\tprotected function _column_title( $post, $classes, $data, $primary ) {\n\t\techo '<td class=\"' . $classes . ' page-title\" ', $data, '>';\n\t\techo $this->column_title( $post );\n\t\techo $this->handle_row_actions( $post, 'title', $primary );\n\t\techo '</td>';\n\t}\n\n\t/**\n\t * Handles the title column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @global string $mode\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_title( $post ) {\n\t\tglobal $mode;\n\n\t\tif ( $this->hierarchical_display ) {\n\t\t\tif ( 0 === $this->current_level && (int) $post->post_parent > 0 ) {\n\t\t\t\t// Sent level 0 by accident, by default, or because we don't know the actual level.\n\t\t\t\t$find_main_page = (int) $post->post_parent;\n\t\t\t\twhile ( $find_main_page > 0 ) {\n\t\t\t\t\t$parent = get_post( $find_main_page );\n\n\t\t\t\t\tif ( is_null( $parent ) ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t$this->current_level++;\n\t\t\t\t\t$find_main_page = (int) $parent->post_parent;\n\n\t\t\t\t\tif ( ! isset( $parent_name ) ) {\n\t\t\t\t\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t\t\t\t\t$parent_name = apply_filters( 'the_title', $parent->post_title, $parent->ID );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$pad = str_repeat( '&#8212; ', $this->current_level );\n\t\techo \"<strong>\";\n\n\t\t$format = get_post_format( $post->ID );\n\t\tif ( $format ) {\n\t\t\t$label = get_post_format_string( $format );\n\n\t\t\t$format_class = 'post-state-format post-format-icon post-format-' . $format;\n\n\t\t\t$format_args = array(\n\t\t\t\t'post_format' => $format,\n\t\t\t\t'post_type' => $post->post_type\n\t\t\t);\n\n\t\t\techo $this->get_edit_link( $format_args, $label . ':', $format_class );\n\t\t}\n\n\t\t$can_edit_post = current_user_can( 'edit_post', $post->ID );\n\t\t$title = _draft_or_post_title();\n\n\t\tif ( $can_edit_post && $post->post_status != 'trash' ) {\n\t\t\t$edit_link = get_edit_post_link( $post->ID );\n\t\t\techo '<a class=\"row-title\" href=\"' . $edit_link . '\" title=\"' . esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $title ) ) . '\">' . $pad . $title . '</a>';\n\t\t} else {\n\t\t\techo $pad . $title;\n\t\t}\n\t\t_post_states( $post );\n\n\t\tif ( isset( $parent_name ) ) {\n\t\t\t$post_type_object = get_post_type_object( $post->post_type );\n\t\t\techo ' | ' . $post_type_object->labels->parent_item_colon . ' ' . esc_html( $parent_name );\n\t\t}\n\t\techo \"</strong>\\n\";\n\n\t\tif ( $can_edit_post && $post->post_status != 'trash' ) {\n\t\t\t$lock_holder = wp_check_post_lock( $post->ID );\n\n\t\t\tif ( $lock_holder ) {\n\t\t\t\t$lock_holder = get_userdata( $lock_holder );\n\t\t\t\t$locked_avatar = get_avatar( $lock_holder->ID, 18 );\n\t\t\t\t$locked_text = esc_html( sprintf( __( '%s is currently editing' ), $lock_holder->display_name ) );\n\t\t\t} else {\n\t\t\t\t$locked_avatar = $locked_text = '';\n\t\t\t}\n\n\t\t\techo '<div class=\"locked-info\"><span class=\"locked-avatar\">' . $locked_avatar . '</span> <span class=\"locked-text\">' . $locked_text . \"</span></div>\\n\";\n\t\t}\n\n\t\tif ( ! is_post_type_hierarchical( $this->screen->post_type ) && 'excerpt' === $mode && current_user_can( 'read_post', $post->ID ) ) {\n\t\t\tthe_excerpt();\n\t\t}\n\n\t\tget_inline_data( $post );\n\t}\n\n\t/**\n\t * Handles the post date column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @global string $mode\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_date( $post ) {\n\t\tglobal $mode;\n\n\t\tif ( '0000-00-00 00:00:00' === $post->post_date ) {\n\t\t\t$t_time = $h_time = __( 'Unpublished' );\n\t\t\t$time_diff = 0;\n\t\t} else {\n\t\t\t$t_time = get_the_time( __( 'Y/m/d g:i:s a' ) );\n\t\t\t$m_time = $post->post_date;\n\t\t\t$time = get_post_time( 'G', true, $post );\n\n\t\t\t$time_diff = time() - $time;\n\n\t\t\tif ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) {\n\t\t\t\t$h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );\n\t\t\t} else {\n\t\t\t\t$h_time = mysql2date( __( 'Y/m/d' ), $m_time );\n\t\t\t}\n\t\t}\n\n\t\tif ( 'publish' === $post->post_status ) {\n\t\t\t_e( 'Published' );\n\t\t} elseif ( 'future' === $post->post_status ) {\n\t\t\tif ( $time_diff > 0 ) {\n\t\t\t\techo '<strong class=\"error-message\">' . __( 'Missed schedule' ) . '</strong>';\n\t\t\t} else {\n\t\t\t\t_e( 'Scheduled' );\n\t\t\t}\n\t\t} else {\n\t\t\t_e( 'Last Modified' );\n\t\t}\n\t\techo '<br />';\n\t\tif ( 'excerpt' === $mode ) {\n\t\t\t/**\n\t\t\t * Filter the published time of the post.\n\t\t\t *\n\t\t\t * If `$mode` equals 'excerpt', the published time and date are both displayed.\n\t\t\t * If `$mode` equals 'list' (default), the publish date is displayed, with the\n\t\t\t * time and date together available as an abbreviation definition.\n\t\t\t *\n\t\t\t * @since 2.5.1\n\t\t\t *\n\t\t\t * @param string  $t_time      The published time.\n\t\t\t * @param WP_Post $post        Post object.\n\t\t\t * @param string  $column_name The column name.\n\t\t\t * @param string  $mode        The list display mode ('excerpt' or 'list').\n\t\t\t */\n\t\t\techo apply_filters( 'post_date_column_time', $t_time, $post, 'date', $mode );\n\t\t} else {\n\n\t\t\t/** This filter is documented in wp-admin/includes/class-wp-posts-list-table.php */\n\t\t\techo '<abbr title=\"' . $t_time . '\">' . apply_filters( 'post_date_column_time', $h_time, $post, 'date', $mode ) . '</abbr>';\n\t\t}\n\t}\n\n\t/**\n\t * Handles the comments column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_comments( $post ) {\n\t\t?>\n\t\t<div class=\"post-com-count-wrapper\">\n\t\t<?php\n\t\t\t$pending_comments = isset( $this->comment_pending_count[$post->ID] ) ? $this->comment_pending_count[$post->ID] : 0;\n\n\t\t\t$this->comments_bubble( $post->ID, $pending_comments );\n\t\t?>\n\t\t</div>\n\t\t<?php\n\t}\n\n\t/**\n\t * Handles the post author column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post The current WP_Post object.\n\t */\n\tpublic function column_author( $post ) {\n\t\t$args = array(\n\t\t\t'post_type' => $post->post_type,\n\t\t\t'author' => get_the_author_meta( 'ID' )\n\t\t);\n\t\techo $this->get_edit_link( $args, get_the_author() );\n\t}\n\n\t/**\n\t * Handles the default column output.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Post $post        The current WP_Post object.\n\t * @param string  $column_name The current column name.\n\t */\n\tpublic function column_default( $post, $column_name ) {\n\t\tif ( 'categories' === $column_name ) {\n\t\t\t$taxonomy = 'category';\n\t\t} elseif ( 'tags' === $column_name ) {\n\t\t\t$taxonomy = 'post_tag';\n\t\t} elseif ( 0 === strpos( $column_name, 'taxonomy-' ) ) {\n\t\t\t$taxonomy = substr( $column_name, 9 );\n\t\t} else {\n\t\t\t$taxonomy = false;\n\t\t}\n\t\tif ( $taxonomy ) {\n\t\t\t$taxonomy_object = get_taxonomy( $taxonomy );\n\t\t\t$terms = get_the_terms( $post->ID, $taxonomy );\n\t\t\tif ( is_array( $terms ) ) {\n\t\t\t\t$out = array();\n\t\t\t\tforeach ( $terms as $t ) {\n\t\t\t\t\t$posts_in_term_qv = array();\n\t\t\t\t\tif ( 'post' != $post->post_type ) {\n\t\t\t\t\t\t$posts_in_term_qv['post_type'] = $post->post_type;\n\t\t\t\t\t}\n\t\t\t\t\tif ( $taxonomy_object->query_var ) {\n\t\t\t\t\t\t$posts_in_term_qv[ $taxonomy_object->query_var ] = $t->slug;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$posts_in_term_qv['taxonomy'] = $taxonomy;\n\t\t\t\t\t\t$posts_in_term_qv['term'] = $t->slug;\n\t\t\t\t\t}\n\n\t\t\t\t\t$label = esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) );\n\t\t\t\t\t$out[] = $this->get_edit_link( $posts_in_term_qv, $label );\n\t\t\t\t}\n\t\t\t\t/* translators: used between list items, there is a space after the comma */\n\t\t\t\techo join( __( ', ' ), $out );\n\t\t\t} else {\n\t\t\t\techo '<span aria-hidden=\"true\">&#8212;</span><span class=\"screen-reader-text\">' . $taxonomy_object->labels->no_terms . '</span>';\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif ( is_post_type_hierarchical( $post->post_type ) ) {\n\n\t\t\t/**\n\t\t\t * Fires in each custom column on the Posts list table.\n\t\t\t *\n\t\t\t * This hook only fires if the current post type is hierarchical,\n\t\t\t * such as pages.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string $column_name The name of the column to display.\n\t\t\t * @param int    $post_id     The current post ID.\n\t\t\t */\n\t\t\tdo_action( 'manage_pages_custom_column', $column_name, $post->ID );\n\t\t} else {\n\n\t\t\t/**\n\t\t\t * Fires in each custom column in the Posts list table.\n\t\t\t *\n\t\t\t * This hook only fires if the current post type is non-hierarchical,\n\t\t\t * such as posts.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t *\n\t\t\t * @param string $column_name The name of the column to display.\n\t\t\t * @param int    $post_id     The current post ID.\n\t\t\t */\n\t\t\tdo_action( 'manage_posts_custom_column', $column_name, $post->ID );\n\t\t}\n\n\t\t/**\n\t\t * Fires for each custom column of a specific post type in the Posts list table.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$post->post_type`, refers to the post type.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param string $column_name The name of the column to display.\n\t\t * @param int    $post_id     The current post ID.\n\t\t */\n\t\tdo_action( \"manage_{$post->post_type}_posts_custom_column\", $column_name, $post->ID );\n\t}\n\n\t/**\n\t * @global WP_Post $post\n\t *\n\t * @param int|WP_Post $post\n\t * @param int         $level\n\t */\n\tpublic function single_row( $post, $level = 0 ) {\n\t\t$global_post = get_post();\n\n\t\t$post = get_post( $post );\n\t\t$this->current_level = $level;\n\n\t\t$GLOBALS['post'] = $post;\n\t\tsetup_postdata( $post );\n\n\t\t$classes = 'iedit author-' . ( get_current_user_id() == $post->post_author ? 'self' : 'other' );\n\n\t\t$lock_holder = wp_check_post_lock( $post->ID );\n\t\tif ( $lock_holder ) {\n\t\t\t$classes .= ' wp-locked';\n\t\t}\n\n\t\tif ( $post->post_parent ) {\n\t\t    $count = count( get_post_ancestors( $post->ID ) );\n\t\t    $classes .= ' level-'. $count;\n\t\t} else {\n\t\t    $classes .= ' level-0';\n\t\t}\n\t?>\n\t\t<tr id=\"post-<?php echo $post->ID; ?>\" class=\"<?php echo implode( ' ', get_post_class( $classes, $post->ID ) ); ?>\">\n\t\t\t<?php $this->single_row_columns( $post ); ?>\n\t\t</tr>\n\t<?php\n\t\t$GLOBALS['post'] = $global_post;\n\t}\n\n\t/**\n\t * Gets the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, 'title'.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\treturn 'title';\n\t}\n\n\t/**\n\t * Generates and displays row action links.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param object $post        Post being acted upon.\n\t * @param string $column_name Current column name.\n\t * @param string $primary     Primary column name.\n\t * @return string Row actions output for posts.\n\t */\n\tprotected function handle_row_actions( $post, $column_name, $primary ) {\n\t\tif ( $primary !== $column_name ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t$post_type_object = get_post_type_object( $post->post_type );\n\t\t$can_edit_post = current_user_can( 'edit_post', $post->ID );\n\t\t$actions = array();\n\n\t\tif ( $can_edit_post && 'trash' != $post->post_status ) {\n\t\t\t$actions['edit'] = '<a href=\"' . get_edit_post_link( $post->ID ) . '\" title=\"' . esc_attr__( 'Edit this item' ) . '\">' . __( 'Edit' ) . '</a>';\n\t\t\t$actions['inline hide-if-no-js'] = '<a href=\"#\" class=\"editinline\" title=\"' . esc_attr__( 'Edit this item inline' ) . '\">' . __( 'Quick&nbsp;Edit' ) . '</a>';\n\t\t}\n\n\t\tif ( current_user_can( 'delete_post', $post->ID ) ) {\n\t\t\tif ( 'trash' === $post->post_status )\n\t\t\t\t$actions['untrash'] = \"<a title='\" . esc_attr__( 'Restore this item from the Trash' ) . \"' href='\" . wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $post->ID ) ), 'untrash-post_' . $post->ID ) . \"'>\" . __( 'Restore' ) . \"</a>\";\n\t\t\telseif ( EMPTY_TRASH_DAYS )\n\t\t\t\t$actions['trash'] = \"<a class='submitdelete' title='\" . esc_attr__( 'Move this item to the Trash' ) . \"' href='\" . get_delete_post_link( $post->ID ) . \"'>\" . __( 'Trash' ) . \"</a>\";\n\t\t\tif ( 'trash' === $post->post_status || !EMPTY_TRASH_DAYS )\n\t\t\t\t$actions['delete'] = \"<a class='submitdelete' title='\" . esc_attr__( 'Delete this item permanently' ) . \"' href='\" . get_delete_post_link( $post->ID, '', true ) . \"'>\" . __( 'Delete Permanently' ) . \"</a>\";\n\t\t}\n\n\t\tif ( is_post_type_viewable( $post_type_object ) ) {\n\t\t\t$title = _draft_or_post_title();\n\t\t\tif ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ) ) ) {\n\t\t\t\tif ( $can_edit_post ) {\n\t\t\t\t\t$unpublished_link = set_url_scheme( get_permalink( $post ) );\n\t\t\t\t\t$preview_link = get_preview_post_link( $post, array(), $unpublished_link );\n\t\t\t\t\t$actions['view'] = '<a href=\"' . esc_url( $preview_link ) . '\" title=\"' . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $title ) ) . '\" rel=\"permalink\">' . __( 'Preview' ) . '</a>';\n\t\t\t\t}\n\t\t\t} elseif ( 'trash' != $post->post_status ) {\n\t\t\t\t$actions['view'] = '<a href=\"' . get_permalink( $post->ID ) . '\" title=\"' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;' ), $title ) ) . '\" rel=\"permalink\">' . __( 'View' ) . '</a>';\n\t\t\t}\n\t\t}\n\n\t\tif ( is_post_type_hierarchical( $post->post_type ) ) {\n\n\t\t\t/**\n\t\t\t * Filter the array of row action links on the Pages list table.\n\t\t\t *\n\t\t\t * The filter is evaluated only for hierarchical post types.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param array $actions An array of row action links. Defaults are\n\t\t\t *                         'Edit', 'Quick Edit', 'Restore, 'Trash',\n\t\t\t *                         'Delete Permanently', 'Preview', and 'View'.\n\t\t\t * @param WP_Post $post The post object.\n\t\t\t */\n\t\t\t$actions = apply_filters( 'page_row_actions', $actions, $post );\n\t\t} else {\n\n\t\t\t/**\n\t\t\t * Filter the array of row action links on the Posts list table.\n\t\t\t *\n\t\t\t * The filter is evaluated only for non-hierarchical post types.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param array $actions An array of row action links. Defaults are\n\t\t\t *                         'Edit', 'Quick Edit', 'Restore, 'Trash',\n\t\t\t *                         'Delete Permanently', 'Preview', and 'View'.\n\t\t\t * @param WP_Post $post The post object.\n\t\t\t */\n\t\t\t$actions = apply_filters( 'post_row_actions', $actions, $post );\n\t\t}\n\n\t\treturn $this->row_actions( $actions );\n\t}\n\n\t/**\n\t * Outputs the hidden row displayed when inline editing\n\t *\n\t * @since 3.1.0\n\t *\n\t * @global string $mode\n\t */\n\tpublic function inline_edit() {\n\t\tglobal $mode;\n\n\t\t$screen = $this->screen;\n\n\t\t$post = get_default_post_to_edit( $screen->post_type );\n\t\t$post_type_object = get_post_type_object( $screen->post_type );\n\n\t\t$taxonomy_names = get_object_taxonomies( $screen->post_type );\n\t\t$hierarchical_taxonomies = array();\n\t\t$flat_taxonomies = array();\n\t\tforeach ( $taxonomy_names as $taxonomy_name ) {\n\n\t\t\t$taxonomy = get_taxonomy( $taxonomy_name );\n\n\t\t\t$show_in_quick_edit = $taxonomy->show_in_quick_edit;\n\n\t\t\t/**\n\t\t\t * Filter whether the current taxonomy should be shown in the Quick Edit panel.\n\t\t\t *\n\t\t\t * @since 4.2.0\n\t\t\t *\n\t\t\t * @param bool   $show_in_quick_edit Whether to show the current taxonomy in Quick Edit.\n\t\t\t * @param string $taxonomy_name      Taxonomy name.\n\t\t\t * @param string $post_type          Post type of current Quick Edit post.\n\t\t\t */\n\t\t\tif ( ! apply_filters( 'quick_edit_show_taxonomy', $show_in_quick_edit, $taxonomy_name, $screen->post_type ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( $taxonomy->hierarchical )\n\t\t\t\t$hierarchical_taxonomies[] = $taxonomy;\n\t\t\telse\n\t\t\t\t$flat_taxonomies[] = $taxonomy;\n\t\t}\n\n\t\t$m = ( isset( $mode ) && 'excerpt' === $mode ) ? 'excerpt' : 'list';\n\t\t$can_publish = current_user_can( $post_type_object->cap->publish_posts );\n\t\t$core_columns = array( 'cb' => true, 'date' => true, 'title' => true, 'categories' => true, 'tags' => true, 'comments' => true, 'author' => true );\n\n\t?>\n\n\t<form method=\"get\"><table style=\"display: none\"><tbody id=\"inlineedit\">\n\t\t<?php\n\t\t$hclass = count( $hierarchical_taxonomies ) ? 'post' : 'page';\n\t\t$bulk = 0;\n\t\twhile ( $bulk < 2 ) { ?>\n\n\t\t<tr id=\"<?php echo $bulk ? 'bulk-edit' : 'inline-edit'; ?>\" class=\"inline-edit-row inline-edit-row-<?php echo \"$hclass inline-edit-\" . $screen->post_type;\n\t\t\techo $bulk ? \" bulk-edit-row bulk-edit-row-$hclass bulk-edit-{$screen->post_type}\" : \" quick-edit-row quick-edit-row-$hclass inline-edit-{$screen->post_type}\";\n\t\t?>\" style=\"display: none\"><td colspan=\"<?php echo $this->get_column_count(); ?>\" class=\"colspanchange\">\n\n\t\t<fieldset class=\"inline-edit-col-left\">\n\t\t\t<legend class=\"inline-edit-legend\"><?php echo $bulk ? __( 'Bulk Edit' ) : __( 'Quick Edit' ); ?></legend>\n\t\t\t<div class=\"inline-edit-col\">\n\t<?php\n\n\tif ( post_type_supports( $screen->post_type, 'title' ) ) :\n\t\tif ( $bulk ) : ?>\n\t\t\t<div id=\"bulk-title-div\">\n\t\t\t\t<div id=\"bulk-titles\"></div>\n\t\t\t</div>\n\n\t<?php else : // $bulk ?>\n\n\t\t\t<label>\n\t\t\t\t<span class=\"title\"><?php _e( 'Title' ); ?></span>\n\t\t\t\t<span class=\"input-text-wrap\"><input type=\"text\" name=\"post_title\" class=\"ptitle\" value=\"\" /></span>\n\t\t\t</label>\n\n\t\t\t<label>\n\t\t\t\t<span class=\"title\"><?php _e( 'Slug' ); ?></span>\n\t\t\t\t<span class=\"input-text-wrap\"><input type=\"text\" name=\"post_name\" value=\"\" /></span>\n\t\t\t</label>\n\n\t<?php endif; // $bulk\n\tendif; // post_type_supports title ?>\n\n\t<?php if ( !$bulk ) : ?>\n\t\t\t<fieldset class=\"inline-edit-date\">\n\t\t\t<legend><span class=\"title\"><?php _e( 'Date' ); ?></span></legend>\n\t\t\t\t<?php touch_time( 1, 1, 0, 1 ); ?>\n\t\t\t</fieldset>\n\t\t\t<br class=\"clear\" />\n\t<?php endif; // $bulk\n\n\t\tif ( post_type_supports( $screen->post_type, 'author' ) ) :\n\t\t\t$authors_dropdown = '';\n\n\t\t\tif ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) ) :\n\t\t\t\t$users_opt = array(\n\t\t\t\t\t'hide_if_only_one_author' => false,\n\t\t\t\t\t'who' => 'authors',\n\t\t\t\t\t'name' => 'post_author',\n\t\t\t\t\t'class'=> 'authors',\n\t\t\t\t\t'multi' => 1,\n\t\t\t\t\t'echo' => 0\n\t\t\t\t);\n\t\t\t\tif ( $bulk )\n\t\t\t\t\t$users_opt['show_option_none'] = __( '&mdash; No Change &mdash;' );\n\n\t\t\t\tif ( $authors = wp_dropdown_users( $users_opt ) ) :\n\t\t\t\t\t$authors_dropdown  = '<label class=\"inline-edit-author\">';\n\t\t\t\t\t$authors_dropdown .= '<span class=\"title\">' . __( 'Author' ) . '</span>';\n\t\t\t\t\t$authors_dropdown .= $authors;\n\t\t\t\t\t$authors_dropdown .= '</label>';\n\t\t\t\tendif;\n\t\t\tendif; // authors\n\t?>\n\n\t<?php if ( !$bulk ) echo $authors_dropdown;\n\tendif; // post_type_supports author\n\n\tif ( !$bulk && $can_publish ) :\n\t?>\n\n\t\t\t<div class=\"inline-edit-group\">\n\t\t\t\t<label class=\"alignleft\">\n\t\t\t\t\t<span class=\"title\"><?php _e( 'Password' ); ?></span>\n\t\t\t\t\t<span class=\"input-text-wrap\"><input type=\"text\" name=\"post_password\" class=\"inline-edit-password-input\" value=\"\" /></span>\n\t\t\t\t</label>\n\n\t\t\t\t<em class=\"alignleft inline-edit-or\">\n\t\t\t\t\t<?php\n\t\t\t\t\t/* translators: Between password field and private checkbox on post quick edit interface */\n\t\t\t\t\t_e( '&ndash;OR&ndash;' );\n\t\t\t\t\t?>\n\t\t\t\t</em>\n\t\t\t\t<label class=\"alignleft inline-edit-private\">\n\t\t\t\t\t<input type=\"checkbox\" name=\"keep_private\" value=\"private\" />\n\t\t\t\t\t<span class=\"checkbox-title\"><?php _e( 'Private' ); ?></span>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t<?php endif; ?>\n\n\t\t</div></fieldset>\n\n\t<?php if ( count( $hierarchical_taxonomies ) && !$bulk ) : ?>\n\n\t\t<fieldset class=\"inline-edit-col-center inline-edit-categories\"><div class=\"inline-edit-col\">\n\n\t<?php foreach ( $hierarchical_taxonomies as $taxonomy ) : ?>\n\n\t\t\t<span class=\"title inline-edit-categories-label\"><?php echo esc_html( $taxonomy->labels->name ) ?></span>\n\t\t\t<input type=\"hidden\" name=\"<?php echo ( $taxonomy->name === 'category' ) ? 'post_category[]' : 'tax_input[' . esc_attr( $taxonomy->name ) . '][]'; ?>\" value=\"0\" />\n\t\t\t<ul class=\"cat-checklist <?php echo esc_attr( $taxonomy->name )?>-checklist\">\n\t\t\t\t<?php wp_terms_checklist( null, array( 'taxonomy' => $taxonomy->name ) ) ?>\n\t\t\t</ul>\n\n\t<?php endforeach; //$hierarchical_taxonomies as $taxonomy ?>\n\n\t\t</div></fieldset>\n\n\t<?php endif; // count( $hierarchical_taxonomies ) && !$bulk ?>\n\n\t\t<fieldset class=\"inline-edit-col-right\"><div class=\"inline-edit-col\">\n\n\t<?php\n\t\tif ( post_type_supports( $screen->post_type, 'author' ) && $bulk )\n\t\t\techo $authors_dropdown;\n\n\t\tif ( post_type_supports( $screen->post_type, 'page-attributes' ) ) :\n\n\t\t\tif ( $post_type_object->hierarchical ) :\n\t\t?>\n\t\t\t<label>\n\t\t\t\t<span class=\"title\"><?php _e( 'Parent' ); ?></span>\n\t<?php\n\t\t$dropdown_args = array(\n\t\t\t'post_type'         => $post_type_object->name,\n\t\t\t'selected'          => $post->post_parent,\n\t\t\t'name'              => 'post_parent',\n\t\t\t'show_option_none'  => __( 'Main Page (no parent)' ),\n\t\t\t'option_none_value' => 0,\n\t\t\t'sort_column'       => 'menu_order, post_title',\n\t\t);\n\n\t\tif ( $bulk )\n\t\t\t$dropdown_args['show_option_no_change'] =  __( '&mdash; No Change &mdash;' );\n\n\t\t/**\n\t\t * Filter the arguments used to generate the Quick Edit page-parent drop-down.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @see wp_dropdown_pages()\n\t\t *\n\t\t * @param array $dropdown_args An array of arguments.\n\t\t */\n\t\t$dropdown_args = apply_filters( 'quick_edit_dropdown_pages_args', $dropdown_args );\n\n\t\twp_dropdown_pages( $dropdown_args );\n\t?>\n\t\t\t</label>\n\n\t<?php\n\t\t\tendif; // hierarchical\n\n\t\t\tif ( !$bulk ) : ?>\n\n\t\t\t<label>\n\t\t\t\t<span class=\"title\"><?php _e( 'Order' ); ?></span>\n\t\t\t\t<span class=\"input-text-wrap\"><input type=\"text\" name=\"menu_order\" class=\"inline-edit-menu-order-input\" value=\"<?php echo $post->menu_order ?>\" /></span>\n\t\t\t</label>\n\n\t<?php\tendif; // !$bulk\n\n\t\t\tif ( 'page' === $screen->post_type ) :\n\t?>\n\n\t\t\t<label>\n\t\t\t\t<span class=\"title\"><?php _e( 'Template' ); ?></span>\n\t\t\t\t<select name=\"page_template\">\n\t<?php\tif ( $bulk ) : ?>\n\t\t\t\t\t<option value=\"-1\"><?php _e( '&mdash; No Change &mdash;' ); ?></option>\n\t<?php\tendif; // $bulk ?>\n    \t\t\t\t<?php\n\t\t\t\t\t/** This filter is documented in wp-admin/includes/meta-boxes.php */\n\t\t\t\t\t$default_title = apply_filters( 'default_page_template_title',  __( 'Default Template' ), 'quick-edit' );\n    \t\t\t\t?>\n\t\t\t\t\t<option value=\"default\"><?php echo esc_html( $default_title ); ?></option>\n\t\t\t\t\t<?php page_template_dropdown() ?>\n\t\t\t\t</select>\n\t\t\t</label>\n\n\t<?php\n\t\t\tendif; // page post_type\n\t\tendif; // page-attributes\n\t?>\n\n\t<?php if ( count( $flat_taxonomies ) && !$bulk ) : ?>\n\n\t<?php foreach ( $flat_taxonomies as $taxonomy ) : ?>\n\t\t<?php if ( current_user_can( $taxonomy->cap->assign_terms ) ) : ?>\n\t\t\t<label class=\"inline-edit-tags\">\n\t\t\t\t<span class=\"title\"><?php echo esc_html( $taxonomy->labels->name ) ?></span>\n\t\t\t\t<textarea cols=\"22\" rows=\"1\" name=\"tax_input[<?php echo esc_attr( $taxonomy->name )?>]\" class=\"tax_input_<?php echo esc_attr( $taxonomy->name )?>\"></textarea>\n\t\t\t</label>\n\t\t<?php endif; ?>\n\n\t<?php endforeach; //$flat_taxonomies as $taxonomy ?>\n\n\t<?php endif; // count( $flat_taxonomies ) && !$bulk  ?>\n\n\t<?php if ( post_type_supports( $screen->post_type, 'comments' ) || post_type_supports( $screen->post_type, 'trackbacks' ) ) :\n\t\tif ( $bulk ) : ?>\n\n\t\t\t<div class=\"inline-edit-group\">\n\t\t<?php if ( post_type_supports( $screen->post_type, 'comments' ) ) : ?>\n\t\t\t<label class=\"alignleft\">\n\t\t\t\t<span class=\"title\"><?php _e( 'Comments' ); ?></span>\n\t\t\t\t<select name=\"comment_status\">\n\t\t\t\t\t<option value=\"\"><?php _e( '&mdash; No Change &mdash;' ); ?></option>\n\t\t\t\t\t<option value=\"open\"><?php _e( 'Allow' ); ?></option>\n\t\t\t\t\t<option value=\"closed\"><?php _e( 'Do not allow' ); ?></option>\n\t\t\t\t</select>\n\t\t\t</label>\n\t\t<?php endif; if ( post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>\n\t\t\t<label class=\"alignright\">\n\t\t\t\t<span class=\"title\"><?php _e( 'Pings' ); ?></span>\n\t\t\t\t<select name=\"ping_status\">\n\t\t\t\t\t<option value=\"\"><?php _e( '&mdash; No Change &mdash;' ); ?></option>\n\t\t\t\t\t<option value=\"open\"><?php _e( 'Allow' ); ?></option>\n\t\t\t\t\t<option value=\"closed\"><?php _e( 'Do not allow' ); ?></option>\n\t\t\t\t</select>\n\t\t\t</label>\n\t\t<?php endif; ?>\n\t\t\t</div>\n\n\t<?php else : // $bulk ?>\n\n\t\t\t<div class=\"inline-edit-group\">\n\t\t\t<?php if ( post_type_supports( $screen->post_type, 'comments' ) ) : ?>\n\t\t\t\t<label class=\"alignleft\">\n\t\t\t\t\t<input type=\"checkbox\" name=\"comment_status\" value=\"open\" />\n\t\t\t\t\t<span class=\"checkbox-title\"><?php _e( 'Allow Comments' ); ?></span>\n\t\t\t\t</label>\n\t\t\t<?php endif; if ( post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>\n\t\t\t\t<label class=\"alignleft\">\n\t\t\t\t\t<input type=\"checkbox\" name=\"ping_status\" value=\"open\" />\n\t\t\t\t\t<span class=\"checkbox-title\"><?php _e( 'Allow Pings' ); ?></span>\n\t\t\t\t</label>\n\t\t\t<?php endif; ?>\n\t\t\t</div>\n\n\t<?php endif; // $bulk\n\tendif; // post_type_supports comments or pings ?>\n\n\t\t\t<div class=\"inline-edit-group\">\n\t\t\t\t<label class=\"inline-edit-status alignleft\">\n\t\t\t\t\t<span class=\"title\"><?php _e( 'Status' ); ?></span>\n\t\t\t\t\t<select name=\"_status\">\n\t<?php if ( $bulk ) : ?>\n\t\t\t\t\t\t<option value=\"-1\"><?php _e( '&mdash; No Change &mdash;' ); ?></option>\n\t<?php endif; // $bulk ?>\n\t\t\t\t\t<?php if ( $can_publish ) : // Contributors only get \"Unpublished\" and \"Pending Review\" ?>\n\t\t\t\t\t\t<option value=\"publish\"><?php _e( 'Published' ); ?></option>\n\t\t\t\t\t\t<option value=\"future\"><?php _e( 'Scheduled' ); ?></option>\n\t<?php if ( $bulk ) : ?>\n\t\t\t\t\t\t<option value=\"private\"><?php _e( 'Private' ) ?></option>\n\t<?php endif; // $bulk ?>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t<option value=\"pending\"><?php _e( 'Pending Review' ); ?></option>\n\t\t\t\t\t\t<option value=\"draft\"><?php _e( 'Draft' ); ?></option>\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\n\t<?php if ( 'post' === $screen->post_type && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>\n\n\t<?php\tif ( $bulk ) : ?>\n\n\t\t\t\t<label class=\"alignright\">\n\t\t\t\t\t<span class=\"title\"><?php _e( 'Sticky' ); ?></span>\n\t\t\t\t\t<select name=\"sticky\">\n\t\t\t\t\t\t<option value=\"-1\"><?php _e( '&mdash; No Change &mdash;' ); ?></option>\n\t\t\t\t\t\t<option value=\"sticky\"><?php _e( 'Sticky' ); ?></option>\n\t\t\t\t\t\t<option value=\"unsticky\"><?php _e( 'Not Sticky' ); ?></option>\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\n\t<?php\telse : // $bulk ?>\n\n\t\t\t\t<label class=\"alignleft\">\n\t\t\t\t\t<input type=\"checkbox\" name=\"sticky\" value=\"sticky\" />\n\t\t\t\t\t<span class=\"checkbox-title\"><?php _e( 'Make this post sticky' ); ?></span>\n\t\t\t\t</label>\n\n\t<?php\tendif; // $bulk ?>\n\n\t<?php endif; // 'post' && $can_publish && current_user_can( 'edit_others_cap' ) ?>\n\n\t\t\t</div>\n\n\t<?php\n\n\tif ( $bulk && current_theme_supports( 'post-formats' ) && post_type_supports( $screen->post_type, 'post-formats' ) ) {\n\t\t$post_formats = get_theme_support( 'post-formats' );\n\n\t\t?>\n\t\t<label class=\"alignleft\">\n\t\t<span class=\"title\"><?php _ex( 'Format', 'post format' ); ?></span>\n\t\t<select name=\"post_format\">\n\t\t\t<option value=\"-1\"><?php _e( '&mdash; No Change &mdash;' ); ?></option>\n\t\t\t<option value=\"0\"><?php echo get_post_format_string( 'standard' ); ?></option>\n\t\t\t<?php\n\t\t\tif ( is_array( $post_formats[0] ) ) {\n\t\t\t\tforeach ( $post_formats[0] as $format ) {\n\t\t\t\t\t?>\n\t\t\t\t\t<option value=\"<?php echo esc_attr( $format ); ?>\"><?php echo esc_html( get_post_format_string( $format ) ); ?></option>\n\t\t\t\t\t<?php\n\t\t\t\t}\n\t\t\t}\n\t\t\t?>\n\t\t</select></label>\n\t<?php\n\n\t}\n\n\t?>\n\n\t\t</div></fieldset>\n\n\t<?php\n\t\tlist( $columns ) = $this->get_column_info();\n\n\t\tforeach ( $columns as $column_name => $column_display_name ) {\n\t\t\tif ( isset( $core_columns[$column_name] ) )\n\t\t\t\tcontinue;\n\n\t\t\tif ( $bulk ) {\n\n\t\t\t\t/**\n\t\t\t\t * Fires once for each column in Bulk Edit mode.\n\t\t\t\t *\n\t\t\t\t * @since 2.7.0\n\t\t\t\t *\n\t\t\t\t * @param string  $column_name Name of the column to edit.\n\t\t\t\t * @param WP_Post $post_type   The post type slug.\n\t\t\t\t */\n\t\t\t\tdo_action( 'bulk_edit_custom_box', $column_name, $screen->post_type );\n\t\t\t} else {\n\n\t\t\t\t/**\n\t\t\t\t * Fires once for each column in Quick Edit mode.\n\t\t\t\t *\n\t\t\t\t * @since 2.7.0\n\t\t\t\t *\n\t\t\t\t * @param string $column_name Name of the column to edit.\n\t\t\t\t * @param string $post_type   The post type slug.\n\t\t\t\t */\n\t\t\t\tdo_action( 'quick_edit_custom_box', $column_name, $screen->post_type );\n\t\t\t}\n\n\t\t}\n\t?>\n\t\t<p class=\"submit inline-edit-save\">\n\t\t\t<button type=\"button\" class=\"button-secondary cancel alignleft\"><?php _e( 'Cancel' ); ?></button>\n\t\t\t<?php if ( ! $bulk ) {\n\t\t\t\twp_nonce_field( 'inlineeditnonce', '_inline_edit', false );\n\t\t\t\t?>\n\t\t\t\t<button type=\"button\" class=\"button-primary save alignright\"><?php _e( 'Update' ); ?></button>\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t<?php } else {\n\t\t\t\tsubmit_button( __( 'Update' ), 'button-primary alignright', 'bulk_edit', false );\n\t\t\t} ?>\n\t\t\t<input type=\"hidden\" name=\"post_view\" value=\"<?php echo esc_attr( $m ); ?>\" />\n\t\t\t<input type=\"hidden\" name=\"screen\" value=\"<?php echo esc_attr( $screen->id ); ?>\" />\n\t\t\t<?php if ( ! $bulk && ! post_type_supports( $screen->post_type, 'author' ) ) { ?>\n\t\t\t\t<input type=\"hidden\" name=\"post_author\" value=\"<?php echo esc_attr( $post->post_author ); ?>\" />\n\t\t\t<?php } ?>\n\t\t\t<span class=\"error\" style=\"display:none\"></span>\n\t\t\t<br class=\"clear\" />\n\t\t</p>\n\t\t</td></tr>\n\t<?php\n\t\t$bulk++;\n\t\t}\n?>\n\t\t</tbody></table></form>\n<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-press-this.php",
    "content": "<?php\n/**\n * Press This class and display functionality\n *\n * @package WordPress\n * @subpackage Press_This\n * @since 4.2.0\n */\n\n/**\n * Press This class.\n *\n * @since 4.2.0\n */\nclass WP_Press_This {\n\n\t// Used to trigger the bookmarklet update notice.\n\tpublic $version = 8;\n\n\tprivate $images = array();\n\n\tprivate $embeds = array();\n\n\tprivate $domain = '';\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t */\n\tpublic function __construct() {}\n\n\t/**\n\t * App and site settings data, including i18n strings for the client-side.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @return array Site settings.\n\t */\n\tpublic function site_settings() {\n\t\treturn array(\n\t\t\t/**\n\t\t\t * Filter whether or not Press This should redirect the user in the parent window upon save.\n\t\t\t *\n\t\t\t * @since 4.2.0\n\t\t\t *\n\t\t\t * @param bool false Whether to redirect in parent window or not. Default false.\n\t\t\t */\n\t\t\t'redirInParent' => apply_filters( 'press_this_redirect_in_parent', false ),\n\t\t);\n\t}\n\n\t/**\n\t * Get the source's images and save them locally, for posterity, unless we can't.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param int    $post_id Post ID.\n\t * @param string $content Optional. Current expected markup for Press This. Expects slashed. Default empty.\n\t * @return string New markup with old image URLs replaced with the local attachment ones if swapped.\n\t */\n\tpublic function side_load_images( $post_id, $content = '' ) {\n\t\t$content = wp_unslash( $content );\n\n\t\tif ( preg_match_all( '/<img [^>]+>/', $content, $matches ) && current_user_can( 'upload_files' ) ) {\n\t\t\tforeach ( (array) $matches[0] as $image ) {\n\t\t\t\t// This is inserted from our JS so HTML attributes should always be in double quotes.\n\t\t\t\tif ( ! preg_match( '/src=\"([^\"]+)\"/', $image, $url_matches ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$image_src = $url_matches[1];\n\n\t\t\t\t// Don't try to sideload a file without a file extension, leads to WP upload error.\n\t\t\t\tif ( ! preg_match( '/[^\\?]+\\.(?:jpe?g|jpe|gif|png)(?:\\?|$)/i', $image_src ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Sideload image, which gives us a new image src.\n\t\t\t\t$new_src = media_sideload_image( $image_src, $post_id, null, 'src' );\n\n\t\t\t\tif ( ! is_wp_error( $new_src ) ) {\n\t\t\t\t\t// Replace the POSTED content <img> with correct uploaded ones.\n\t\t\t\t\t// Need to do it in two steps so we don't replace links to the original image if any.\n\t\t\t\t\t$new_image = str_replace( $image_src, $new_src, $image );\n\t\t\t\t\t$content = str_replace( $image, $new_image, $content );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Edxpected slashed\n\t\treturn wp_slash( $content );\n\t}\n\n\t/**\n\t * AJAX handler for saving the post as draft or published.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t */\n\tpublic function save_post() {\n\t\tif ( empty( $_POST['post_ID'] ) || ! $post_id = (int) $_POST['post_ID'] ) {\n\t\t\twp_send_json_error( array( 'errorMessage' => __( 'Missing post ID.' ) ) );\n\t\t}\n\n\t\tif ( empty( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'update-post_' . $post_id ) ||\n\t\t\t! current_user_can( 'edit_post', $post_id ) ) {\n\n\t\t\twp_send_json_error( array( 'errorMessage' => __( 'Invalid post.' ) ) );\n\t\t}\n\n\t\t$post = array(\n\t\t\t'ID'            => $post_id,\n\t\t\t'post_title'    => ( ! empty( $_POST['post_title'] ) ) ? sanitize_text_field( trim( $_POST['post_title'] ) ) : '',\n\t\t\t'post_content'  => ( ! empty( $_POST['post_content'] ) ) ? trim( $_POST['post_content'] ) : '',\n\t\t\t'post_type'     => 'post',\n\t\t\t'post_status'   => 'draft',\n\t\t\t'post_format'   => ( ! empty( $_POST['post_format'] ) ) ? sanitize_text_field( $_POST['post_format'] ) : '',\n\t\t\t'tax_input'     => ( ! empty( $_POST['tax_input'] ) ) ? $_POST['tax_input'] : array(),\n\t\t\t'post_category' => ( ! empty( $_POST['post_category'] ) ) ? $_POST['post_category'] : array(),\n\t\t);\n\n\t\tif ( ! empty( $_POST['post_status'] ) && 'publish' === $_POST['post_status'] ) {\n\t\t\tif ( current_user_can( 'publish_posts' ) ) {\n\t\t\t\t$post['post_status'] = 'publish';\n\t\t\t} else {\n\t\t\t\t$post['post_status'] = 'pending';\n\t\t\t}\n\t\t}\n\n\t\t$post['post_content'] = $this->side_load_images( $post_id, $post['post_content'] );\n\n\t\t$updated = wp_update_post( $post, true );\n\n\t\tif ( is_wp_error( $updated ) ) {\n\t\t\twp_send_json_error( array( 'errorMessage' => $updated->get_error_message() ) );\n\t\t} else {\n\t\t\tif ( isset( $post['post_format'] ) ) {\n\t\t\t\tif ( current_theme_supports( 'post-formats', $post['post_format'] ) ) {\n\t\t\t\t\tset_post_format( $post_id, $post['post_format'] );\n\t\t\t\t} elseif ( $post['post_format'] ) {\n\t\t\t\t\tset_post_format( $post_id, false );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$forceRedirect = false;\n\n\t\t\tif ( 'publish' === get_post_status( $post_id ) ) {\n\t\t\t\t$redirect = get_post_permalink( $post_id );\n\t\t\t} elseif ( isset( $_POST['pt-force-redirect'] ) && $_POST['pt-force-redirect'] === 'true' ) {\n\t\t\t\t$forceRedirect = true;\n\t\t\t\t$redirect = get_edit_post_link( $post_id, 'js' );\n\t\t\t} else {\n\t\t\t\t$redirect = false;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter the URL to redirect to when Press This saves.\n\t\t\t *\n\t\t\t * @since 4.2.0\n\t\t\t *\n\t\t\t * @param string $url     Redirect URL. If `$status` is 'publish', this will be the post permalink.\n\t\t\t *                        Otherwise, the default is false resulting in no redirect.\n\t\t\t * @param int    $post_id Post ID.\n\t\t\t * @param string $status  Post status.\n\t\t\t */\n\t\t\t$redirect = apply_filters( 'press_this_save_redirect', $redirect, $post_id, $post['post_status'] );\n\n\t\t\tif ( $redirect ) {\n\t\t\t\twp_send_json_success( array( 'redirect' => $redirect, 'force' => $forceRedirect ) );\n\t\t\t} else {\n\t\t\t\twp_send_json_success( array( 'postSaved' => true ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * AJAX handler for adding a new category.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t */\n\tpublic function add_category() {\n\t\tif ( false === wp_verify_nonce( $_POST['new_cat_nonce'], 'add-category' ) ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\t$taxonomy = get_taxonomy( 'category' );\n\n\t\tif ( ! current_user_can( $taxonomy->cap->edit_terms ) || empty( $_POST['name'] ) ) {\n\t\t\twp_send_json_error();\n\t\t}\n\n\t\t$parent = isset( $_POST['parent'] ) && (int) $_POST['parent'] > 0 ? (int) $_POST['parent'] : 0;\n\t\t$names = explode( ',', $_POST['name'] );\n\t\t$added = $data = array();\n\n\t\tforeach ( $names as $cat_name ) {\n\t\t\t$cat_name = trim( $cat_name );\n\t\t\t$cat_nicename = sanitize_title( $cat_name );\n\n\t\t\tif ( empty( $cat_nicename ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// @todo Find a more performant way to check existence, maybe get_term() with a separate parent check.\n\t\t\tif ( term_exists( $cat_name, $taxonomy->name, $parent ) ) {\n\t\t\t\tif ( count( $names ) === 1 ) {\n\t\t\t\t\twp_send_json_error( array( 'errorMessage' => __( 'This category already exists.' ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$cat_id = wp_insert_term( $cat_name, $taxonomy->name, array( 'parent' => $parent ) );\n\n\t\t\tif ( is_wp_error( $cat_id ) ) {\n\t\t\t\tcontinue;\n\t\t\t} elseif ( is_array( $cat_id ) ) {\n\t\t\t\t$cat_id = $cat_id['term_id'];\n\t\t\t}\n\n\t\t\t$added[] = $cat_id;\n\t\t}\n\n\t\tif ( empty( $added ) ) {\n\t\t\twp_send_json_error( array( 'errorMessage' => __( 'This category cannot be added. Please change the name and try again.' ) ) );\n\t\t}\n\n\t\tforeach ( $added as $new_cat_id ) {\n\t\t\t$new_cat = get_category( $new_cat_id );\n\n\t\t\tif ( is_wp_error( $new_cat ) ) {\n\t\t\t\twp_send_json_error( array( 'errorMessage' => __( 'Error while adding the category. Please try again later.' ) ) );\n\t\t\t}\n\n\t\t\t$data[] = array(\n\t\t\t\t'term_id' => $new_cat->term_id,\n\t\t\t\t'name' => $new_cat->name,\n\t\t\t\t'parent' => $new_cat->parent,\n\t\t\t);\n\t\t}\n\t\twp_send_json_success( $data );\n\t}\n\n\t/**\n\t * Downloads the source's HTML via server-side call for the given URL.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param string $url URL to scan.\n\t * @return string Source's HTML sanitized markup\n\t */\n\tpublic function fetch_source_html( $url ) {\n\t\tglobal $wp_version;\n\n\t\tif ( empty( $url ) ) {\n\t\t\treturn new WP_Error( 'invalid-url', __( 'A valid URL was not provided.' ) );\n\t\t}\n\n\t\t$remote_url = wp_safe_remote_get( $url, array(\n\t\t\t'timeout' => 30,\n\t\t\t// Use an explicit user-agent for Press This\n\t\t\t'user-agent' => 'Press This (WordPress/' . $wp_version . '); ' . get_bloginfo( 'url' )\n\t\t) );\n\n\t\tif ( is_wp_error( $remote_url ) ) {\n\t\t\treturn $remote_url;\n\t\t}\n\n\t\t$useful_html_elements = array(\n\t\t\t'img' => array(\n\t\t\t\t'src'      => true,\n\t\t\t\t'width'    => true,\n\t\t\t\t'height'   => true,\n\t\t\t),\n\t\t\t'iframe' => array(\n\t\t\t\t'src'      => true,\n\t\t\t),\n\t\t\t'link' => array(\n\t\t\t\t'rel'      => true,\n\t\t\t\t'itemprop' => true,\n\t\t\t\t'href'     => true,\n\t\t\t),\n\t\t\t'meta' => array(\n\t\t\t\t'property' => true,\n\t\t\t\t'name'     => true,\n\t\t\t\t'content'  => true,\n\t\t\t)\n\t\t);\n\n\t\t$source_content = wp_remote_retrieve_body( $remote_url );\n\t\t$source_content = wp_kses( $source_content, $useful_html_elements );\n\n\t\treturn $source_content;\n\t}\n\n\t/**\n\t * Utility method to limit an array to 50 values.\n\t *\n\t * @ignore\n\t * @since 4.2.0\n\t *\n\t * @param array $value Array to limit.\n\t * @return array Original array if fewer than 50 values, limited array, empty array otherwise.\n\t */\n\tprivate function _limit_array( $value ) {\n\t\tif ( is_array( $value ) ) {\n\t\t\tif ( count( $value ) > 50 ) {\n\t\t\t\treturn array_slice( $value, 0, 50 );\n\t\t\t}\n\n\t\t\treturn $value;\n\t\t}\n\n\t\treturn array();\n\t}\n\n\t/**\n\t * Utility method to limit the length of a given string to 5,000 characters.\n\t *\n\t * @ignore\n\t * @since 4.2.0\n\t *\n\t * @param string $value String to limit.\n\t * @return bool|int|string If boolean or integer, that value. If a string, the original value\n\t *                         if fewer than 5,000 characters, a truncated version, otherwise an\n\t *                         empty string.\n\t */\n\tprivate function _limit_string( $value ) {\n\t\t$return = '';\n\n\t\tif ( is_numeric( $value ) || is_bool( $value ) ) {\n\t\t\t$return = $value;\n\t\t} else if ( is_string( $value ) ) {\n\t\t\tif ( mb_strlen( $value ) > 5000 ) {\n\t\t\t\t$return = mb_substr( $value, 0, 5000 );\n\t\t\t} else {\n\t\t\t\t$return = $value;\n\t\t\t}\n\n\t\t\t$return = html_entity_decode( $return, ENT_QUOTES, 'UTF-8' );\n\t\t\t$return = sanitize_text_field( trim( $return ) );\n\t\t}\n\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Utility method to limit a given URL to 2,048 characters.\n\t *\n\t * @ignore\n\t * @since 4.2.0\n\t *\n\t * @param string $url URL to check for length and validity.\n\t * @return string Escaped URL if of valid length (< 2048) and makeup. Empty string otherwise.\n\t */\n\tprivate function _limit_url( $url ) {\n\t\tif ( ! is_string( $url ) ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t// HTTP 1.1 allows 8000 chars but the \"de-facto\" standard supported in all current browsers is 2048.\n\t\tif ( strlen( $url ) > 2048 ) {\n\t\t\treturn ''; // Return empty rather than a truncated/invalid URL\n\t\t}\n\n\t\t// Does not look like an URL.\n\t\tif ( ! preg_match( '/^([!#$&-;=?-\\[\\]_a-z~]|%[0-9a-fA-F]{2})+$/', $url ) ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t// If the URL is root-relative, prepend the protocol and domain name\n\t\tif ( $url && $this->domain && preg_match( '%^/[^/]+%', $url ) ) {\n\t\t\t$url = $this->domain . $url;\n\t\t}\n\n\t\t// Not absolute or protocol-relative URL.\n\t\tif ( ! preg_match( '%^(?:https?:)?//[^/]+%', $url ) ) {\n\t\t\treturn '';\n\t\t}\n\n\t\treturn esc_url_raw( $url, array( 'http', 'https' ) );\n\t}\n\n\t/**\n\t * Utility method to limit image source URLs.\n\t *\n\t * Excluded URLs include share-this type buttons, loaders, spinners, spacers, WordPress interface images,\n\t * tiny buttons or thumbs, mathtag.com or quantserve.com images, or the WordPress.com stats gif.\n\t *\n\t * @ignore\n\t * @since 4.2.0\n\t *\n\t * @param string $src Image source URL.\n\t * @return string If not matched an excluded URL type, the original URL, empty string otherwise.\n\t */\n\tprivate function _limit_img( $src ) {\n\t\t$src = $this->_limit_url( $src );\n\n\t\tif ( preg_match( '!/ad[sx]?/!i', $src ) ) {\n\t\t\t// Ads\n\t\t\treturn '';\n\t\t} else if ( preg_match( '!(/share-?this[^.]+?\\.[a-z0-9]{3,4})(\\?.*)?$!i', $src ) ) {\n\t\t\t// Share-this type button\n\t\t\treturn '';\n\t\t} else if ( preg_match( '!/(spinner|loading|spacer|blank|rss)\\.(gif|jpg|png)!i', $src ) ) {\n\t\t\t// Loaders, spinners, spacers\n\t\t\treturn '';\n\t\t} else if ( preg_match( '!/([^./]+[-_])?(spinner|loading|spacer|blank)s?([-_][^./]+)?\\.[a-z0-9]{3,4}!i', $src ) ) {\n\t\t\t// Fancy loaders, spinners, spacers\n\t\t\treturn '';\n\t\t} else if ( preg_match( '!([^./]+[-_])?thumb[^.]*\\.(gif|jpg|png)$!i', $src ) ) {\n\t\t\t// Thumbnails, too small, usually irrelevant to context\n\t\t\treturn '';\n\t\t} else if ( false !== stripos( $src, '/wp-includes/' ) ) {\n\t\t\t// Classic WordPress interface images\n\t\t\treturn '';\n\t\t} else if ( preg_match( '![^\\d]\\d{1,2}x\\d+\\.(gif|jpg|png)$!i', $src ) ) {\n\t\t\t// Most often tiny buttons/thumbs (< 100px wide)\n\t\t\treturn '';\n\t\t} else if ( preg_match( '!/pixel\\.(mathtag|quantserve)\\.com!i', $src ) ) {\n\t\t\t// See mathtag.com and https://www.quantcast.com/how-we-do-it/iab-standard-measurement/how-we-collect-data/\n\t\t\treturn '';\n\t\t} else if ( preg_match( '!/[gb]\\.gif(\\?.+)?$!i', $src ) ) {\n\t\t\t// WordPress.com stats gif\n\t\t\treturn '';\n\t\t}\n\n\t\treturn $src;\n\t}\n\n\t/**\n\t * Limit embed source URLs to specific providers.\n\t *\n\t * Not all core oEmbed providers are supported. Supported providers include YouTube, Vimeo,\n\t * Vine, Daily Motion, SoundCloud, and Twitter.\n\t *\n\t * @ignore\n\t * @since 4.2.0\n\t *\n\t * @param string $src Embed source URL.\n\t * @return string If not from a supported provider, an empty string. Otherwise, a reformattd embed URL.\n\t */\n\tprivate function _limit_embed( $src ) {\n\t\t$src = $this->_limit_url( $src );\n\n\t\tif ( empty( $src ) )\n\t\t\treturn '';\n\n\t\tif ( preg_match( '!//(m|www)\\.youtube\\.com/(embed|v)/([^?]+)\\?.+$!i', $src, $src_matches ) ) {\n\t\t\t// Embedded Youtube videos (www or mobile)\n\t\t\t$src = 'https://www.youtube.com/watch?v=' . $src_matches[3];\n\t\t} else if ( preg_match( '!//player\\.vimeo\\.com/video/([\\d]+)([?/].*)?$!i', $src, $src_matches ) ) {\n\t\t\t// Embedded Vimeo iframe videos\n\t\t\t$src = 'https://vimeo.com/' . (int) $src_matches[1];\n\t\t} else if ( preg_match( '!//vimeo\\.com/moogaloop\\.swf\\?clip_id=([\\d]+)$!i', $src, $src_matches ) ) {\n\t\t\t// Embedded Vimeo Flash videos\n\t\t\t$src = 'https://vimeo.com/' . (int) $src_matches[1];\n\t\t} else if ( preg_match( '!//vine\\.co/v/([^/]+)/embed!i', $src, $src_matches ) ) {\n\t\t\t// Embedded Vine videos\n\t\t\t$src = 'https://vine.co/v/' . $src_matches[1];\n\t\t} else if ( preg_match( '!//(www\\.)?dailymotion\\.com/embed/video/([^/?]+)([/?].+)?!i', $src, $src_matches ) ) {\n\t\t\t// Embedded Daily Motion videos\n\t\t\t$src = 'https://www.dailymotion.com/video/' . $src_matches[2];\n\t\t} else {\n\t\t\trequire_once( ABSPATH . WPINC . '/class-oembed.php' );\n\t\t\t$oembed = _wp_oembed_get_object();\n\n\t\t\tif ( ! $oembed->get_provider( $src, array( 'discover' => false ) ) ) {\n\t\t\t\t$src = '';\n\t\t\t}\n\t\t}\n\n\t\treturn $src;\n\t}\n\n\t/**\n\t * Process a meta data entry from the source.\n\t *\n\t * @ignore\n\t * @since 4.2.0\n\t *\n\t * @param string $meta_name  Meta key name.\n\t * @param mixed  $meta_value Meta value.\n\t * @param array  $data       Associative array of source data.\n\t * @return array Processed data array.\n\t */\n\tprivate function _process_meta_entry( $meta_name, $meta_value, $data ) {\n\t\tif ( preg_match( '/:?(title|description|keywords|site_name)$/', $meta_name ) ) {\n\t\t\t$data['_meta'][ $meta_name ] = $meta_value;\n\t\t} else {\n\t\t\tswitch ( $meta_name ) {\n\t\t\t\tcase 'og:url':\n\t\t\t\tcase 'og:video':\n\t\t\t\tcase 'og:video:secure_url':\n\t\t\t\t\t$meta_value = $this->_limit_embed( $meta_value );\n\n\t\t\t\t\tif ( ! isset( $data['_embeds'] ) ) {\n\t\t\t\t\t\t$data['_embeds'] = array();\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! empty( $meta_value ) && ! in_array( $meta_value, $data['_embeds'] ) ) {\n\t\t\t\t\t\t$data['_embeds'][] = $meta_value;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'og:image':\n\t\t\t\tcase 'og:image:secure_url':\n\t\t\t\tcase 'twitter:image0:src':\n\t\t\t\tcase 'twitter:image0':\n\t\t\t\tcase 'twitter:image:src':\n\t\t\t\tcase 'twitter:image':\n\t\t\t\t\t$meta_value = $this->_limit_img( $meta_value );\n\n\t\t\t\t\tif ( ! isset( $data['_images'] ) ) {\n\t\t\t\t\t\t$data['_images'] = array();\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! empty( $meta_value ) && ! in_array( $meta_value, $data['_images'] ) ) {\n\t\t\t\t\t\t$data['_images'][] = $meta_value;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Fetches and parses _meta, _images, and _links data from the source.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param string $url  URL to scan.\n\t * @param array  $data Optional. Existing data array if you have one. Default empty array.\n\t * @return array New data array.\n\t */\n\tpublic function source_data_fetch_fallback( $url, $data = array() ) {\n\t\tif ( empty( $url ) ) {\n\t\t\treturn array();\n\t\t}\n\n\t\t// Download source page to tmp file.\n\t\t$source_content = $this->fetch_source_html( $url );\n\t\tif ( is_wp_error( $source_content ) ) {\n\t\t\treturn array( 'errors' => $source_content->get_error_messages() );\n\t\t}\n\n\t\t// Fetch and gather <meta> data first, so discovered media is offered 1st to user.\n\t\tif ( empty( $data['_meta'] ) ) {\n\t\t\t$data['_meta'] = array();\n\t\t}\n\n\t\tif ( preg_match_all( '/<meta [^>]+>/', $source_content, $matches ) ) {\n\t\t\t$items = $this->_limit_array( $matches[0] );\n\n\t\t\tforeach ( $items as $value ) {\n\t\t\t\tif ( preg_match( '/(property|name)=\"([^\"]+)\"[^>]+content=\"([^\"]+)\"/', $value, $new_matches ) ) {\n\t\t\t\t\t$meta_name  = $this->_limit_string( $new_matches[2] );\n\t\t\t\t\t$meta_value = $this->_limit_string( $new_matches[3] );\n\n\t\t\t\t\t// Sanity check. $key is usually things like 'title', 'description', 'keywords', etc.\n\t\t\t\t\tif ( strlen( $meta_name ) > 100 ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$data = $this->_process_meta_entry( $meta_name, $meta_value, $data );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fetch and gather <img> data.\n\t\tif ( empty( $data['_images'] ) ) {\n\t\t\t$data['_images'] = array();\n\t\t}\n\n\t\tif ( preg_match_all( '/<img [^>]+>/', $source_content, $matches ) ) {\n\t\t\t$items = $this->_limit_array( $matches[0] );\n\n\t\t\tforeach ( $items as $value ) {\n\t\t\t\tif ( ( preg_match( '/width=(\\'|\")(\\d+)\\\\1/i', $value, $new_matches ) && $new_matches[2] < 256 ) ||\n\t\t\t\t\t( preg_match( '/height=(\\'|\")(\\d+)\\\\1/i', $value, $new_matches ) && $new_matches[2] < 128 ) ) {\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( preg_match( '/src=(\\'|\")([^\\'\"]+)\\\\1/i', $value, $new_matches ) ) {\n\t\t\t\t\t$src = $this->_limit_img( $new_matches[2] );\n\t\t\t\t\tif ( ! empty( $src ) && ! in_array( $src, $data['_images'] ) ) {\n\t\t\t\t\t\t$data['_images'][] = $src;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fetch and gather <iframe> data.\n\t\tif ( empty( $data['_embeds'] ) ) {\n\t\t\t$data['_embeds'] = array();\n\t\t}\n\n\t\tif ( preg_match_all( '/<iframe [^>]+>/', $source_content, $matches ) ) {\n\t\t\t$items = $this->_limit_array( $matches[0] );\n\n\t\t\tforeach ( $items as $value ) {\n\t\t\t\tif ( preg_match( '/src=(\\'|\")([^\\'\"]+)\\\\1/', $value, $new_matches ) ) {\n\t\t\t\t\t$src = $this->_limit_embed( $new_matches[2] );\n\n\t\t\t\t\tif ( ! empty( $src ) && ! in_array( $src, $data['_embeds'] ) ) {\n\t\t\t\t\t\t$data['_embeds'][] = $src;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fetch and gather <link> data.\n\t\tif ( empty( $data['_links'] ) ) {\n\t\t\t$data['_links'] = array();\n\t\t}\n\n\t\tif ( preg_match_all( '/<link [^>]+>/', $source_content, $matches ) ) {\n\t\t\t$items = $this->_limit_array( $matches[0] );\n\n\t\t\tforeach ( $items as $value ) {\n\t\t\t\tif ( preg_match( '/rel=[\"\\'](canonical|shortlink|icon)[\"\\']/i', $value, $matches_rel ) && preg_match( '/href=[\\'\"]([^\\'\" ]+)[\\'\"]/i', $value, $matches_url ) ) {\n\t\t\t\t\t$rel = $matches_rel[1];\n\t\t\t\t\t$url = $this->_limit_url( $matches_url[1] );\n\n\t\t\t\t\tif ( ! empty( $url ) && empty( $data['_links'][ $rel ] ) ) {\n\t\t\t\t\t\t$data['_links'][ $rel ] = $url;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Handles backward-compat with the legacy version of Press This by supporting its query string params.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @return array\n\t */\n\tpublic function merge_or_fetch_data() {\n\t\t// Get data from $_POST and $_GET, as appropriate ($_POST > $_GET), to remain backward compatible.\n\t\t$data = array();\n\n\t\t// Only instantiate the keys we want. Sanity check and sanitize each one.\n\t\tforeach ( array( 'u', 's', 't', 'v' ) as $key ) {\n\t\t\tif ( ! empty( $_POST[ $key ] ) ) {\n\t\t\t\t$value = wp_unslash( $_POST[ $key ] );\n\t\t\t} else if ( ! empty( $_GET[ $key ] ) ) {\n\t\t\t\t$value = wp_unslash( $_GET[ $key ] );\n\t\t\t} else {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( 'u' === $key ) {\n\t\t\t\t$value = $this->_limit_url( $value );\n\n\t\t\t\tif ( preg_match( '%^(?:https?:)?//[^/]+%i', $value, $domain_match ) ) {\n\t\t\t\t\t$this->domain = $domain_match[0];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$value = $this->_limit_string( $value );\n\t\t\t}\n\n\t\t\tif ( ! empty( $value ) ) {\n\t\t\t\t$data[ $key ] = $value;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter whether to enable in-source media discovery in Press This.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param bool $enable Whether to enable media discovery.\n\t\t */\n\t\tif ( apply_filters( 'enable_press_this_media_discovery', true ) ) {\n\t\t\t/*\n\t\t\t * If no title, _images, _embed, and _meta was passed via $_POST, fetch data from source as fallback,\n\t\t\t * making PT fully backward compatible with the older bookmarklet.\n\t\t\t */\n\t\t\tif ( empty( $_POST ) && ! empty( $data['u'] ) ) {\n\t\t\t\t$data = $this->source_data_fetch_fallback( $data['u'], $data );\n\t\t\t} else {\n\t\t\t\tforeach ( array( '_images', '_embeds' ) as $type ) {\n\t\t\t\t\tif ( empty( $_POST[ $type ] ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$data[ $type ] = array();\n\t\t\t\t\t$items = $this->_limit_array( $_POST[ $type ] );\n\n\t\t\t\t\tforeach ( $items as $key => $value ) {\n\t\t\t\t\t\tif ( $type === '_images' ) {\n\t\t\t\t\t\t\t$value = $this->_limit_img( wp_unslash( $value ) );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$value = $this->_limit_embed( wp_unslash( $value ) );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! empty( $value ) ) {\n\t\t\t\t\t\t\t$data[ $type ][] = $value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tforeach ( array( '_meta', '_links' ) as $type ) {\n\t\t\t\t\tif ( empty( $_POST[ $type ] ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$data[ $type ] = array();\n\t\t\t\t\t$items = $this->_limit_array( $_POST[ $type ] );\n\n\t\t\t\t\tforeach ( $items as $key => $value ) {\n\t\t\t\t\t\t// Sanity check. These are associative arrays, $key is usually things like 'title', 'description', 'keywords', etc.\n\t\t\t\t\t\tif ( empty( $key ) || strlen( $key ) > 100 ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( $type === '_meta' ) {\n\t\t\t\t\t\t\t$value = $this->_limit_string( wp_unslash( $value ) );\n\n\t\t\t\t\t\t\tif ( ! empty( $value ) ) {\n\t\t\t\t\t\t\t\t$data = $this->_process_meta_entry( $key, $value, $data );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif ( in_array( $key, array( 'canonical', 'shortlink', 'icon' ), true ) ) {\n\t\t\t\t\t\t\t\t$data[ $type ][ $key ] = $this->_limit_url( wp_unslash( $value ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Support passing a single image src as `i`\n\t\t\tif ( ! empty( $_REQUEST['i'] ) && ( $img_src = $this->_limit_img( wp_unslash( $_REQUEST['i'] ) ) ) ) {\n\t\t\t\tif ( empty( $data['_images'] ) ) {\n\t\t\t\t\t$data['_images'] = array( $img_src );\n\t\t\t\t} elseif ( ! in_array( $img_src, $data['_images'], true ) ) {\n\t\t\t\t\tarray_unshift( $data['_images'], $img_src );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the Press This data array.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param array $data Press This Data array.\n\t\t */\n\t\treturn apply_filters( 'press_this_data', $data );\n\t}\n\n\t/**\n\t * Adds another stylesheet inside TinyMCE.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param string $styles URL to editor stylesheet.\n\t * @return string Possibly modified stylesheets list.\n\t */\n\tpublic function add_editor_style( $styles ) {\n\t\tif ( ! empty( $styles ) ) {\n\t\t\t$styles .= ',';\n\t\t}\n\n\t\t$press_this = admin_url( 'css/press-this-editor.css' );\n\t\tif ( is_rtl() ) {\n\t\t\t$press_this = str_replace( '.css', '-rtl.css', $press_this );\n\t\t}\n\n\t\t$open_sans_font_url = '';\n\n\t\t/* translators: If there are characters in your language that are not supported\n\t\t * by Open Sans, translate this to 'off'. Do not translate into your own language.\n\t\t */\n\t\tif ( 'off' !== _x( 'on', 'Open Sans font: on or off' ) ) {\n\t\t\t$subsets = 'latin,latin-ext';\n\n\t\t\t/* translators: To add an additional Open Sans character subset specific to your language,\n\t\t\t * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language.\n\t\t\t */\n\t\t\t$subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)' );\n\n\t\t\tif ( 'cyrillic' == $subset ) {\n\t\t\t\t$subsets .= ',cyrillic,cyrillic-ext';\n\t\t\t} elseif ( 'greek' == $subset ) {\n\t\t\t\t$subsets .= ',greek,greek-ext';\n\t\t\t} elseif ( 'vietnamese' == $subset ) {\n\t\t\t\t$subsets .= ',vietnamese';\n\t\t\t}\n\n\t\t\t$query_args = array(\n\t\t\t\t'family' => urlencode( 'Open Sans:400italic,700italic,400,600,700' ),\n\t\t\t\t'subset' => urlencode( $subsets ),\n\t\t\t);\n\n\t\t\t$open_sans_font_url = ',' . add_query_arg( $query_args, 'https://fonts.googleapis.com/css' );\n\t\t}\n\n\t\treturn $styles . $press_this . $open_sans_font_url;\n\t}\n\n\t/**\n\t * Outputs the post format selection HTML.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param WP_Post $post Post object.\n\t */\n\tpublic function post_formats_html( $post ) {\n\t\tif ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) ) {\n\t\t\t$post_formats = get_theme_support( 'post-formats' );\n\n\t\t\tif ( is_array( $post_formats[0] ) ) {\n\t\t\t\t$post_format = get_post_format( $post->ID );\n\n\t\t\t\tif ( ! $post_format ) {\n\t\t\t\t\t$post_format = '0';\n\t\t\t\t}\n\n\t\t\t\t// Add in the current one if it isn't there yet, in case the current theme doesn't support it.\n\t\t\t\tif ( $post_format && ! in_array( $post_format, $post_formats[0] ) ) {\n\t\t\t\t\t$post_formats[0][] = $post_format;\n\t\t\t\t}\n\n\t\t\t\t?>\n\t\t\t\t<div id=\"post-formats-select\">\n\t\t\t\t<fieldset><legend class=\"screen-reader-text\"><?php _e( 'Post Formats' ); ?></legend>\n\t\t\t\t\t<input type=\"radio\" name=\"post_format\" class=\"post-format\" id=\"post-format-0\" value=\"0\" <?php checked( $post_format, '0' ); ?> />\n\t\t\t\t\t<label for=\"post-format-0\" class=\"post-format-icon post-format-standard\"><?php echo get_post_format_string( 'standard' ); ?></label>\n\t\t\t\t\t<?php\n\n\t\t\t\t\tforeach ( $post_formats[0] as $format ) {\n\t\t\t\t\t\t$attr_format = esc_attr( $format );\n\t\t\t\t\t\t?>\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t<input type=\"radio\" name=\"post_format\" class=\"post-format\" id=\"post-format-<?php echo $attr_format; ?>\" value=\"<?php echo $attr_format; ?>\" <?php checked( $post_format, $format ); ?> />\n\t\t\t\t\t\t<label for=\"post-format-<?php echo $attr_format ?>\" class=\"post-format-icon post-format-<?php echo $attr_format; ?>\"><?php echo esc_html( get_post_format_string( $format ) ); ?></label>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t }\n\n\t\t\t\t\t ?>\n\t\t\t\t</fieldset>\n\t\t\t\t</div>\n\t\t\t\t<?php\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Outputs the categories HTML.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param WP_Post $post Post object.\n\t */\n\tpublic function categories_html( $post ) {\n\t\t$taxonomy = get_taxonomy( 'category' );\n\n\t\tif ( current_user_can( $taxonomy->cap->edit_terms ) ) {\n\t\t\t?>\n\t\t\t<button type=\"button\" class=\"add-cat-toggle button-link\" aria-expanded=\"false\">\n\t\t\t\t<span class=\"dashicons dashicons-plus\"></span><span class=\"screen-reader-text\"><?php _e( 'Toggle add category' ); ?></span>\n\t\t\t</button>\n\t\t\t<div class=\"add-category is-hidden\">\n\t\t\t\t<label class=\"screen-reader-text\" for=\"new-category\"><?php echo $taxonomy->labels->add_new_item; ?></label>\n\t\t\t\t<input type=\"text\" id=\"new-category\" class=\"add-category-name\" placeholder=\"<?php echo esc_attr( $taxonomy->labels->new_item_name ); ?>\" value=\"\" aria-required=\"true\">\n\t\t\t\t<label class=\"screen-reader-text\" for=\"new-category-parent\"><?php echo $taxonomy->labels->parent_item_colon; ?></label>\n\t\t\t\t<div class=\"postform-wrapper\">\n\t\t\t\t\t<?php\n\t\t\t\t\twp_dropdown_categories( array(\n\t\t\t\t\t\t'taxonomy'         => 'category',\n\t\t\t\t\t\t'hide_empty'       => 0,\n\t\t\t\t\t\t'name'             => 'new-category-parent',\n\t\t\t\t\t\t'orderby'          => 'name',\n\t\t\t\t\t\t'hierarchical'     => 1,\n\t\t\t\t\t\t'show_option_none' => '&mdash; ' . $taxonomy->labels->parent_item . ' &mdash;'\n\t\t\t\t\t) );\n\t\t\t\t\t?>\n\t\t\t\t</div>\n\t\t\t\t<button type=\"button\" class=\"add-cat-submit\"><?php _e( 'Add' ); ?></button>\n\t\t\t</div>\n\t\t\t<?php\n\n\t\t}\n\t\t?>\n\t\t<div class=\"categories-search-wrapper\">\n\t\t\t<input id=\"categories-search\" type=\"search\" class=\"categories-search\" placeholder=\"<?php esc_attr_e( 'Search categories by name' ) ?>\">\n\t\t\t<label for=\"categories-search\">\n\t\t\t\t<span class=\"dashicons dashicons-search\"></span><span class=\"screen-reader-text\"><?php _e( 'Search categories' ); ?></span>\n\t\t\t</label>\n\t\t</div>\n\t\t<div aria-label=\"<?php esc_attr_e( 'Categories' ); ?>\">\n\t\t\t<ul class=\"categories-select\">\n\t\t\t\t<?php wp_terms_checklist( $post->ID, array( 'taxonomy' => 'category', 'list_only' => true ) ); ?>\n\t\t\t</ul>\n\t\t</div>\n\t\t<?php\n\t}\n\n\t/**\n\t * Outputs the tags HTML.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param WP_Post $post Post object.\n\t */\n\tpublic function tags_html( $post ) {\n\t\t$taxonomy              = get_taxonomy( 'post_tag' );\n\t\t$user_can_assign_terms = current_user_can( $taxonomy->cap->assign_terms );\n\t\t$esc_tags              = get_terms_to_edit( $post->ID, 'post_tag' );\n\n\t\tif ( ! $esc_tags || is_wp_error( $esc_tags ) ) {\n\t\t\t$esc_tags = '';\n\t\t}\n\n\t\t?>\n\t\t<div class=\"tagsdiv\" id=\"post_tag\">\n\t\t\t<div class=\"jaxtag\">\n\t\t\t<input type=\"hidden\" name=\"tax_input[post_tag]\" class=\"the-tags\" value=\"<?php echo $esc_tags; // escaped in get_terms_to_edit() ?>\">\n\t\t \t<?php\n\n\t\t\tif ( $user_can_assign_terms ) {\n\t\t\t\t?>\n\t\t\t\t<div class=\"ajaxtag hide-if-no-js\">\n\t\t\t\t\t<label class=\"screen-reader-text\" for=\"new-tag-post_tag\"><?php _e( 'Tags' ); ?></label>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<input type=\"text\" id=\"new-tag-post_tag\" name=\"newtag[post_tag]\" class=\"newtag form-input-tip\" size=\"16\" autocomplete=\"off\" value=\"\" aria-describedby=\"new-tag-desc\" />\n\t\t\t\t\t\t<button type=\"button\" class=\"tagadd\"><?php _e( 'Add' ); ?></button>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<p class=\"howto\" id=\"new-tag-desc\">\n\t\t\t\t\t<?php echo $taxonomy->labels->separate_items_with_commas; ?>\n\t\t\t\t</p>\n\t\t\t\t<?php\n\t\t\t}\n\n\t\t\t?>\n\t\t\t</div>\n\t\t\t<div class=\"tagchecklist\"></div>\n\t\t</div>\n\t\t<?php\n\n\t\tif ( $user_can_assign_terms ) {\n\t\t\t?>\n\t\t\t<button type=\"button\" class=\"button-link tagcloud-link\" id=\"link-post_tag\"><?php echo $taxonomy->labels->choose_from_most_used; ?></button>\n\t\t\t<?php\n\t\t}\n\t}\n\n\t/**\n\t * Get a list of embeds with no duplicates.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param array $data The site's data.\n\t * @return array Embeds selected to be available.\n\t */\n\tpublic function get_embeds( $data ) {\n\t\t$selected_embeds = array();\n\n\t\t// Make sure to add the Pressed page if it's a valid oembed itself\n\t\tif ( ! empty ( $data['u'] ) && $this->_limit_embed( $data['u'] ) ) {\n\t\t\t$data['_embeds'][] = $data['u'];\n\t\t}\n\n\t\tif ( ! empty( $data['_embeds'] ) ) {\n\t\t\tforeach ( $data['_embeds'] as $src ) {\n\t\t\t\t$prot_relative_src = preg_replace( '/^https?:/', '', $src );\n\n\t\t\t\tif ( in_array( $prot_relative_src, $this->embeds ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$selected_embeds[] = $src;\n\t\t\t\t$this->embeds[] = $prot_relative_src;\n\t\t\t}\n\t\t}\n\n\t\treturn $selected_embeds;\n\t}\n\n\t/**\n\t * Get a list of images with no duplicates.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param array $data The site's data.\n\t * @return array\n\t */\n\tpublic function get_images( $data ) {\n\t\t$selected_images = array();\n\n\t\tif ( ! empty( $data['_images'] ) ) {\n\t\t\tforeach ( $data['_images'] as $src ) {\n\t\t\t\tif ( false !== strpos( $src, 'gravatar.com' ) ) {\n\t\t\t\t\t$src = preg_replace( '%http://[\\d]+\\.gravatar\\.com/%', 'https://secure.gravatar.com/', $src );\n\t\t\t\t}\n\n\t\t\t\t$prot_relative_src = preg_replace( '/^https?:/', '', $src );\n\n\t\t\t\tif ( in_array( $prot_relative_src, $this->images ) ||\n\t\t\t\t\t( false !== strpos( $src, 'avatar' ) && count( $this->images ) > 15 ) ) {\n\t\t\t\t\t// Skip: already selected or some type of avatar and we've already gathered more than 15 images.\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$selected_images[] = $src;\n\t\t\t\t$this->images[] = $prot_relative_src;\n\t\t\t}\n\t\t}\n\n\t\treturn $selected_images;\n\t}\n\n\t/**\n\t * Gets the source page's canonical link, based on passed location and meta data.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n \t * @param array $data The site's data.\n\t * @return string Discovered canonical URL, or empty\n\t */\n\tpublic function get_canonical_link( $data ) {\n\t\t$link = '';\n\n\t\tif ( ! empty( $data['_links']['canonical'] ) ) {\n\t\t\t$link = $data['_links']['canonical'];\n\t\t} elseif ( ! empty( $data['u'] ) ) {\n\t\t\t$link = $data['u'];\n\t\t} elseif ( ! empty( $data['_meta'] ) ) {\n\t\t\tif ( ! empty( $data['_meta']['twitter:url'] ) ) {\n\t\t\t\t$link = $data['_meta']['twitter:url'];\n\t\t\t} else if ( ! empty( $data['_meta']['og:url'] ) ) {\n\t\t\t\t$link = $data['_meta']['og:url'];\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $link ) && ! empty( $data['_links']['shortlink'] ) ) {\n\t\t\t$link = $data['_links']['shortlink'];\n\t\t}\n\n\t\treturn $link;\n\t}\n\n\t/**\n\t * Gets the source page's site name, based on passed meta data.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param array $data The site's data.\n\t * @return string Discovered site name, or empty\n\t */\n\tpublic function get_source_site_name( $data ) {\n\t\t$name = '';\n\n\t\tif ( ! empty( $data['_meta'] ) ) {\n\t\t\tif ( ! empty( $data['_meta']['og:site_name'] ) ) {\n\t\t\t\t$name = $data['_meta']['og:site_name'];\n\t\t\t} else if ( ! empty( $data['_meta']['application-name'] ) ) {\n\t\t\t\t$name = $data['_meta']['application-name'];\n\t\t\t}\n\t\t}\n\n\t\treturn $name;\n\t}\n\n\t/**\n\t * Gets the source page's title, based on passed title and meta data.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param array $data The site's data.\n\t * @return string Discovered page title, or empty\n\t */\n\tpublic function get_suggested_title( $data ) {\n\t\t$title = '';\n\n\t\tif ( ! empty( $data['t'] ) ) {\n\t\t\t$title = $data['t'];\n\t\t} elseif ( ! empty( $data['_meta'] ) ) {\n\t\t\tif ( ! empty( $data['_meta']['twitter:title'] ) ) {\n\t\t\t\t$title = $data['_meta']['twitter:title'];\n\t\t\t} else if ( ! empty( $data['_meta']['og:title'] ) ) {\n\t\t\t\t$title = $data['_meta']['og:title'];\n\t\t\t} else if ( ! empty( $data['_meta']['title'] ) ) {\n\t\t\t\t$title = $data['_meta']['title'];\n\t\t\t}\n\t\t}\n\n\t\treturn $title;\n\t}\n\n\t/**\n\t * Gets the source page's suggested content, based on passed data (description, selection, etc).\n\t *\n\t * Features a blockquoted excerpt, as well as content attribution, if any.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param array $data The site's data.\n\t * @return string Discovered content, or empty\n\t */\n\tpublic function get_suggested_content( $data ) {\n\t\t$content = $text = '';\n\n\t\tif ( ! empty( $data['s'] ) ) {\n\t\t\t$text = $data['s'];\n\t\t} else if ( ! empty( $data['_meta'] ) ) {\n\t\t\tif ( ! empty( $data['_meta']['twitter:description'] ) ) {\n\t\t\t\t$text = $data['_meta']['twitter:description'];\n\t\t\t} else if ( ! empty( $data['_meta']['og:description'] ) ) {\n\t\t\t\t$text = $data['_meta']['og:description'];\n\t\t\t} else if ( ! empty( $data['_meta']['description'] ) ) {\n\t\t\t\t$text = $data['_meta']['description'];\n\t\t\t}\n\n\t\t\t// If there is an ellipsis at the end, the description is very likely auto-generated. Better to ignore it.\n\t\t\tif ( $text && substr( $text, -3 ) === '...' ) {\n\t\t\t\t$text = '';\n\t\t\t}\n\t\t}\n\n\t\t$default_html = array( 'quote' => '', 'link' => '', 'embed' => '' );\n\n\t\tif ( ! empty( $data['u'] ) && $this->_limit_embed( $data['u'] ) ) {\n\t\t\t$default_html['embed'] = '<p>[embed]' . $data['u'] . '[/embed]</p>';\n\n\t\t\tif ( ! empty( $data['s'] ) ) {\n\t\t\t\t// If the user has selected some text, do quote it.\n\t\t\t\t$default_html['quote'] = '<blockquote>%1$s</blockquote>';\n\t\t\t}\n\t\t} else {\n\t\t\t$default_html['quote'] = '<blockquote>%1$s</blockquote>';\n\t\t\t$default_html['link'] = '<p>' . _x( 'Source:', 'Used in Press This to indicate where the content comes from.' ) .\n\t\t\t\t' <em><a href=\"%1$s\">%2$s</a></em></p>';\n\t\t}\n\n\t\t/**\n\t\t * Filter the default HTML for the Press This editor.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param array $default_html Associative array with two keys: 'quote' where %1$s is replaced with the site description\n\t\t *                            or the selected content, and 'link' there %1$s is link href, %2$s is link text.\n\t\t */\n\t\t$default_html = apply_filters( 'press_this_suggested_html', $default_html, $data );\n\n\t\tif ( ! empty( $default_html['embed'] ) ) {\n\t\t\t$content .= $default_html['embed'];\n\t\t}\n\n\t\t// Wrap suggested content in the specified HTML.\n\t\tif ( ! empty( $default_html['quote'] ) && $text ) {\n\t\t\t$content .= sprintf( $default_html['quote'], $text );\n\t\t}\n\n\t\t// Add source attribution if there is one available.\n\t\tif ( ! empty( $default_html['link'] ) ) {\n\t\t\t$title = $this->get_suggested_title( $data );\n\t\t\t$url = $this->get_canonical_link( $data );\n\n\t\t\tif ( ! $title ) {\n\t\t\t\t$title = $this->get_source_site_name( $data );\n\t\t\t}\n\n\t\t\tif ( $url && $title ) {\n\t\t\t\t$content .= sprintf( $default_html['link'], $url, $title );\n\t\t\t}\n\t\t}\n\n\t\treturn $content;\n\t}\n\n\t/**\n\t * Serves the app's base HTML, which in turns calls the load script.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @global WP_Locale $wp_locale\n\t * @global string    $wp_version\n\t * @global bool      $is_IE\n\t */\n\tpublic function html() {\n\t\tglobal $wp_locale, $wp_version;\n\n\t\t// Get data, new (POST) and old (GET).\n\t\t$data = $this->merge_or_fetch_data();\n\n\t\t$post_title = $this->get_suggested_title( $data );\n\n\t\t$post_content = $this->get_suggested_content( $data );\n\n\t\t// Get site settings array/data.\n\t\t$site_settings = $this->site_settings();\n\n\t\t// Pass the images and embeds\n\t\t$images = $this->get_images( $data );\n\t\t$embeds = $this->get_embeds( $data );\n\n\t\t$site_data = array(\n\t\t\t'v' => ! empty( $data['v'] ) ? $data['v'] : '',\n\t\t\t'u' => ! empty( $data['u'] ) ? $data['u'] : '',\n\t\t\t'hasData' => ! empty( $data ),\n\t\t);\n\n\t\tif ( ! empty( $images ) ) {\n\t\t\t$site_data['_images'] = $images;\n\t\t}\n\n\t\tif ( ! empty( $embeds ) ) {\n\t\t\t$site_data['_embeds'] = $embeds;\n\t\t}\n\n\t\t// Add press-this-editor.css and remove theme's editor-style.css, if any.\n\t\tremove_editor_styles();\n\n\t\tadd_filter( 'mce_css', array( $this, 'add_editor_style' ) );\n\n\t\tif ( ! empty( $GLOBALS['is_IE'] ) ) {\n\t\t\t@header( 'X-UA-Compatible: IE=edge' );\n\t\t}\n\n\t\t@header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );\n\n?>\n<!DOCTYPE html>\n<!--[if IE 7]>         <html class=\"lt-ie9 lt-ie8\" <?php language_attributes(); ?>> <![endif]-->\n<!--[if IE 8]>         <html class=\"lt-ie9\" <?php language_attributes(); ?>> <![endif]-->\n<!--[if gt IE 8]><!--> <html <?php language_attributes(); ?>> <!--<![endif]-->\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"<?php echo esc_attr( get_bloginfo( 'html_type' ) ); ?>; charset=<?php echo esc_attr( get_option( 'blog_charset' ) ); ?>\" />\n\t<meta name=\"viewport\" content=\"width=device-width\">\n\t<title><?php esc_html_e( 'Press This!' ) ?></title>\n\n\t<script>\n\t\twindow.wpPressThisData   = <?php echo wp_json_encode( $site_data ); ?>;\n\t\twindow.wpPressThisConfig = <?php echo wp_json_encode( $site_settings ); ?>;\n\t</script>\n\n\t<script type=\"text/javascript\">\n\t\tvar ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>',\n\t\t\tpagenow = 'press-this',\n\t\t\ttypenow = 'post',\n\t\t\tadminpage = 'press-this-php',\n\t\t\tthousandsSeparator = '<?php echo addslashes( $wp_locale->number_format['thousands_sep'] ); ?>',\n\t\t\tdecimalPoint = '<?php echo addslashes( $wp_locale->number_format['decimal_point'] ); ?>',\n\t\t\tisRtl = <?php echo (int) is_rtl(); ?>;\n\t</script>\n\n\t<?php\n\t\t/*\n\t\t * $post->ID is needed for the embed shortcode so we can show oEmbed previews in the editor.\n\t\t * Maybe find a way without it.\n\t\t */\n\t\t$post = get_default_post_to_edit( 'post', true );\n\t\t$post_ID = (int) $post->ID;\n\n\t\twp_enqueue_media( array( 'post' => $post_ID ) );\n\t\twp_enqueue_style( 'press-this' );\n\t\twp_enqueue_script( 'press-this' );\n\t\twp_enqueue_script( 'json2' );\n\t\twp_enqueue_script( 'editor' );\n\n\t\t$supports_formats = false;\n\t\t$post_format      = 0;\n\n\t\tif ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) ) {\n\t\t\t$supports_formats = true;\n\n\t\t\tif ( ! ( $post_format = get_post_format( $post_ID ) ) ) {\n\t\t\t\t$post_format = 0;\n\t\t\t}\n\t\t}\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_enqueue_scripts', 'press-this.php' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_print_styles-press-this.php' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_print_styles' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_print_scripts-press-this.php' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_print_scripts' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_head-press-this.php' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_head' );\n\t?>\n</head>\n<?php\n\n\t$admin_body_class  = 'press-this';\n\t$admin_body_class .= ( is_rtl() ) ? ' rtl' : '';\n\t$admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', floatval( $wp_version ) );\n\t$admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', $wp_version ) );\n\t$admin_body_class .= ' admin-color-' . sanitize_html_class( get_user_option( 'admin_color' ), 'fresh' );\n\t$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );\n\n\t/** This filter is documented in wp-admin/admin-header.php */\n\t$admin_body_classes = apply_filters( 'admin_body_class', '' );\n\n?>\n<body class=\"wp-admin wp-core-ui <?php echo $admin_body_classes . ' ' . $admin_body_class; ?>\">\n\t<div id=\"adminbar\" class=\"adminbar\">\n\t\t<h1 id=\"current-site\" class=\"current-site\">\n\t\t\t<a class=\"current-site-link\" href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" target=\"_blank\" rel=\"home\">\n\t\t\t\t<span class=\"dashicons dashicons-wordpress\"></span>\n\t\t\t\t<span class=\"current-site-name\"><?php bloginfo( 'name' ); ?></span>\n\t\t\t</a>\n\t\t</h1>\n\t\t<button type=\"button\" class=\"options button-link closed\">\n\t\t\t<span class=\"dashicons dashicons-tag on-closed\"></span>\n\t\t\t<span class=\"screen-reader-text on-closed\"><?php _e( 'Show post options' ); ?></span>\n\t\t\t<span aria-hidden=\"true\" class=\"on-open\"><?php _e( 'Done' ); ?></span>\n\t\t\t<span class=\"screen-reader-text on-open\"><?php _e( 'Hide post options' ); ?></span>\n\t\t</button>\n\t</div>\n\n\t<div id=\"scanbar\" class=\"scan\">\n\t\t<form method=\"GET\">\n\t\t\t<label for=\"url-scan\" class=\"screen-reader-text\"><?php _e( 'Scan site for content' ); ?></label>\n\t\t\t<input type=\"url\" name=\"u\" id=\"url-scan\" class=\"scan-url\" value=\"\" placeholder=\"<?php esc_attr_e( 'Enter a URL to scan' ) ?>\" />\n\t\t\t<input type=\"submit\" name=\"url-scan-submit\" id=\"url-scan-submit\" class=\"scan-submit\" value=\"<?php esc_attr_e( 'Scan' ) ?>\" />\n\t\t</form>\n\t</div>\n\n\t<form id=\"pressthis-form\" method=\"post\" action=\"post.php\" autocomplete=\"off\">\n\t\t<input type=\"hidden\" name=\"post_ID\" id=\"post_ID\" value=\"<?php echo $post_ID; ?>\" />\n\t\t<input type=\"hidden\" name=\"action\" value=\"press-this-save-post\" />\n\t\t<input type=\"hidden\" name=\"post_status\" id=\"post_status\" value=\"draft\" />\n\t\t<input type=\"hidden\" name=\"wp-preview\" id=\"wp-preview\" value=\"\" />\n\t\t<input type=\"hidden\" name=\"post_title\" id=\"post_title\" value=\"\" />\n\t\t<input type=\"hidden\" name=\"pt-force-redirect\" id=\"pt-force-redirect\" value=\"\" />\n\t\t<?php\n\n\t\twp_nonce_field( 'update-post_' . $post_ID, '_wpnonce', false );\n\t\twp_nonce_field( 'add-category', '_ajax_nonce-add-category', false );\n\n\t\t?>\n\n\t<div class=\"wrapper\">\n\t\t<div class=\"editor-wrapper\">\n\t\t\t<div class=\"alerts\" role=\"alert\" aria-live=\"assertive\" aria-relevant=\"all\" aria-atomic=\"true\">\n\t\t\t\t<?php\n\n\t\t\t\tif ( isset( $data['v'] ) && $this->version > $data['v'] ) {\n\t\t\t\t\t?>\n\t\t\t\t\t<p class=\"alert is-notice\">\n\t\t\t\t\t\t<?php printf( __( 'You should upgrade <a href=\"%s\" target=\"_blank\">your bookmarklet</a> to the latest version!' ), admin_url( 'tools.php' ) ); ?>\n\t\t\t\t\t</p>\n\t\t\t\t\t<?php\n\t\t\t\t}\n\n\t\t\t\t?>\n\t\t\t</div>\n\n\t\t\t<div id=\"app-container\" class=\"editor\">\n\t\t\t\t<span id=\"title-container-label\" class=\"post-title-placeholder\" aria-hidden=\"true\"><?php _e( 'Post title' ); ?></span>\n\t\t\t\t<h2 id=\"title-container\" class=\"post-title\" contenteditable=\"true\" spellcheck=\"true\" aria-label=\"<?php esc_attr_e( 'Post title' ); ?>\" tabindex=\"0\"><?php echo esc_html( $post_title ); ?></h2>\n\n\t\t\t\t<div class=\"media-list-container\">\n\t\t\t\t\t<div class=\"media-list-inner-container\">\n\t\t\t\t\t\t<h2 class=\"screen-reader-text\"><?php _e( 'Suggested media' ); ?></h2>\n\t\t\t\t\t\t<ul class=\"media-list\"></ul>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<?php\n\t\t\t\twp_editor( $post_content, 'pressthis', array(\n\t\t\t\t\t'drag_drop_upload' => true,\n\t\t\t\t\t'editor_height'    => 600,\n\t\t\t\t\t'media_buttons'    => false,\n\t\t\t\t\t'textarea_name'    => 'post_content',\n\t\t\t\t\t'teeny'            => true,\n\t\t\t\t\t'tinymce'          => array(\n\t\t\t\t\t\t'resize'                => false,\n\t\t\t\t\t\t'wordpress_adv_hidden'  => false,\n\t\t\t\t\t\t'add_unload_trigger'    => false,\n\t\t\t\t\t\t'statusbar'             => false,\n\t\t\t\t\t\t'autoresize_min_height' => 600,\n\t\t\t\t\t\t'wp_autoresize_on'      => true,\n\t\t\t\t\t\t'plugins'               => 'lists,media,paste,tabfocus,fullscreen,wordpress,wpautoresize,wpeditimage,wpgallery,wplink,wptextpattern,wpview',\n\t\t\t\t\t\t'toolbar1'              => 'bold,italic,bullist,numlist,blockquote,link,unlink',\n\t\t\t\t\t\t'toolbar2'              => 'undo,redo',\n\t\t\t\t\t),\n\t\t\t\t\t'quicktags' => array(\n\t\t\t\t\t\t'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,more',\n\t\t\t\t\t),\n\t\t\t\t) );\n\n\t\t\t\t?>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"options-panel-back is-hidden\" tabindex=\"-1\"></div>\n\t\t<div class=\"options-panel is-off-screen is-hidden\" tabindex=\"-1\">\n\t\t\t<div class=\"post-options\">\n\n\t\t\t\t<?php if ( $supports_formats ) : ?>\n\t\t\t\t\t<button type=\"button\" class=\"button-link post-option\">\n\t\t\t\t\t\t<span class=\"dashicons dashicons-admin-post\"></span>\n\t\t\t\t\t\t<span class=\"post-option-title\"><?php _ex( 'Format', 'post format' ); ?></span>\n\t\t\t\t\t\t<span class=\"post-option-contents\" id=\"post-option-post-format\"><?php echo esc_html( get_post_format_string( $post_format ) ); ?></span>\n\t\t\t\t\t\t<span class=\"dashicons post-option-forward\"></span>\n\t\t\t\t\t</button>\n\t\t\t\t<?php endif; ?>\n\n\t\t\t\t<button type=\"button\" class=\"button-link post-option\">\n\t\t\t\t\t<span class=\"dashicons dashicons-category\"></span>\n\t\t\t\t\t<span class=\"post-option-title\"><?php _e( 'Categories' ); ?></span>\n\t\t\t\t\t<span class=\"dashicons post-option-forward\"></span>\n\t\t\t\t</button>\n\n\t\t\t\t<button type=\"button\" class=\"button-link post-option\">\n\t\t\t\t\t<span class=\"dashicons dashicons-tag\"></span>\n\t\t\t\t\t<span class=\"post-option-title\"><?php _e( 'Tags' ); ?></span>\n\t\t\t\t\t<span class=\"dashicons post-option-forward\"></span>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<?php if ( $supports_formats ) : ?>\n\t\t\t\t<div class=\"setting-modal is-off-screen is-hidden\">\n\t\t\t\t\t<button type=\"button\" class=\"button-link modal-close\">\n\t\t\t\t\t\t<span class=\"dashicons post-option-back\"></span>\n\t\t\t\t\t\t<span class=\"setting-title\" aria-hidden=\"true\"><?php _ex( 'Format', 'post format' ); ?></span>\n\t\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Back to post options' ) ?></span>\n\t\t\t\t\t</button>\n\t\t\t\t\t<?php $this->post_formats_html( $post ); ?>\n\t\t\t\t</div>\n\t\t\t<?php endif; ?>\n\n\t\t\t<div class=\"setting-modal is-off-screen is-hidden\">\n\t\t\t\t<button type=\"button\" class=\"button-link modal-close\">\n\t\t\t\t\t<span class=\"dashicons post-option-back\"></span>\n\t\t\t\t\t<span class=\"setting-title\" aria-hidden=\"true\"><?php _e( 'Categories' ); ?></span>\n\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Back to post options' ) ?></span>\n\t\t\t\t</button>\n\t\t\t\t<?php $this->categories_html( $post ); ?>\n\t\t\t</div>\n\n\t\t\t<div class=\"setting-modal tags is-off-screen is-hidden\">\n\t\t\t\t<button type=\"button\" class=\"button-link modal-close\">\n\t\t\t\t\t<span class=\"dashicons post-option-back\"></span>\n\t\t\t\t\t<span class=\"setting-title\" aria-hidden=\"true\"><?php _e( 'Tags' ); ?></span>\n\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Back to post options' ) ?></span>\n\t\t\t\t</button>\n\t\t\t\t<?php $this->tags_html( $post ); ?>\n\t\t\t</div>\n\t\t</div><!-- .options-panel -->\n\t</div><!-- .wrapper -->\n\n\t<div class=\"press-this-actions\">\n\t\t<div class=\"pressthis-media-buttons\">\n\t\t\t<button type=\"button\" class=\"insert-media button-link\" data-editor=\"pressthis\">\n\t\t\t\t<span class=\"dashicons dashicons-admin-media\"></span>\n\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Add Media' ); ?></span>\n\t\t\t</button>\n\t\t</div>\n\t\t<div class=\"post-actions\">\n\t\t\t<span class=\"spinner\">&nbsp;</span>\n\t\t\t<div class=\"split-button\">\n\t\t\t\t<div class=\"split-button-head\">\n\t\t\t\t\t<button type=\"button\" class=\"publish-button split-button-primary\" aria-live=\"polite\">\n\t\t\t\t\t\t<span class=\"publish\"><?php echo ( current_user_can( 'publish_posts' ) ) ? __( 'Publish' ) : __( 'Submit for Review' ); ?></span>\n\t\t\t\t\t\t<span class=\"saving-draft\"><?php _e( 'Saving&hellip;' ); ?></span>\n\t\t\t\t\t</button><button type=\"button\" class=\"split-button-toggle\" aria-haspopup=\"true\" aria-expanded=\"false\">\n\t\t\t\t\t\t<i class=\"dashicons dashicons-arrow-down-alt2\"></i>\n\t\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e('More actions'); ?></span>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<ul class=\"split-button-body\">\n\t\t\t\t\t<li><button type=\"button\" class=\"button-link draft-button split-button-option\"><?php _e( 'Save Draft' ); ?></button></li>\n\t\t\t\t\t<li><button type=\"button\" class=\"button-link standard-editor-button split-button-option\"><?php _e( 'Standard Editor' ); ?></button></li>\n\t\t\t\t\t<li><button type=\"button\" class=\"button-link preview-button split-button-option\"><?php _e( 'Preview' ); ?></button></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t</form>\n\n\t<?php\n\t/** This action is documented in wp-admin/admin-footer.php */\n\tdo_action( 'admin_footer' );\n\n\t/** This action is documented in wp-admin/admin-footer.php */\n\tdo_action( 'admin_print_footer_scripts' );\n\n\t/** This action is documented in wp-admin/admin-footer.php */\n\tdo_action( 'admin_footer-press-this.php' );\n\t?>\n</body>\n</html>\n<?php\n\t\tdie();\n\t}\n}\n\n/**\n *\n * @global WP_Press_This $wp_press_this\n */\n$GLOBALS['wp_press_this'] = new WP_Press_This;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-screen.php",
    "content": "<?php\n/**\n * Screen API: WP_Screen class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement an admin screen API.\n *\n * @since 3.3.0\n */\nfinal class WP_Screen {\n\t/**\n\t * Any action associated with the screen. 'add' for *-add.php and *-new.php screens. Empty otherwise.\n\t *\n\t * @since 3.3.0\n\t * @var string\n\t * @access public\n\t */\n\tpublic $action;\n\n\t/**\n\t * The base type of the screen. This is typically the same as $id but with any post types and taxonomies stripped.\n\t * For example, for an $id of 'edit-post' the base is 'edit'.\n\t *\n\t * @since 3.3.0\n\t * @var string\n\t * @access public\n\t */\n\tpublic $base;\n\n\t/**\n\t * The number of columns to display. Access with get_columns().\n\t *\n\t * @since 3.4.0\n\t * @var int\n\t * @access private\n\t */\n\tprivate $columns = 0;\n\n\t/**\n\t * The unique ID of the screen.\n\t *\n\t * @since 3.3.0\n\t * @var string\n\t * @access public\n\t */\n\tpublic $id;\n\n\t/**\n\t * Which admin the screen is in. network | user | site | false\n\t *\n\t * @since 3.5.0\n\t * @var string\n\t * @access protected\n\t */\n\tprotected $in_admin;\n\n\t/**\n\t * Whether the screen is in the network admin.\n\t *\n\t * Deprecated. Use in_admin() instead.\n\t *\n\t * @since 3.3.0\n\t * @deprecated 3.5.0\n\t * @var bool\n\t * @access public\n\t */\n\tpublic $is_network;\n\n\t/**\n\t * Whether the screen is in the user admin.\n\t *\n\t * Deprecated. Use in_admin() instead.\n\t *\n\t * @since 3.3.0\n\t * @deprecated 3.5.0\n\t * @var bool\n\t * @access public\n\t */\n\tpublic $is_user;\n\n\t/**\n\t * The base menu parent.\n\t * This is derived from $parent_file by removing the query string and any .php extension.\n\t * $parent_file values of 'edit.php?post_type=page' and 'edit.php?post_type=post' have a $parent_base of 'edit'.\n\t *\n\t * @since 3.3.0\n\t * @var string\n\t * @access public\n\t */\n\tpublic $parent_base;\n\n\t/**\n\t * The parent_file for the screen per the admin menu system.\n\t * Some $parent_file values are 'edit.php?post_type=page', 'edit.php', and 'options-general.php'.\n\t *\n\t * @since 3.3.0\n\t * @var string\n\t * @access public\n\t */\n\tpublic $parent_file;\n\n\t/**\n\t * The post type associated with the screen, if any.\n\t * The 'edit.php?post_type=page' screen has a post type of 'page'.\n\t * The 'edit-tags.php?taxonomy=$taxonomy&post_type=page' screen has a post type of 'page'.\n\t *\n\t * @since 3.3.0\n\t * @var string\n\t * @access public\n\t */\n\tpublic $post_type;\n\n\t/**\n\t * The taxonomy associated with the screen, if any.\n\t * The 'edit-tags.php?taxonomy=category' screen has a taxonomy of 'category'.\n\t * @since 3.3.0\n\t * @var string\n\t * @access public\n\t */\n\tpublic $taxonomy;\n\n\t/**\n\t * The help tab data associated with the screen, if any.\n\t *\n\t * @since 3.3.0\n\t * @var array\n\t * @access private\n\t */\n\tprivate $_help_tabs = array();\n\n\t/**\n\t * The help sidebar data associated with screen, if any.\n\t *\n\t * @since 3.3.0\n\t * @var string\n\t * @access private\n\t */\n\tprivate $_help_sidebar = '';\n\n \t/**\n\t * The accessible hidden headings and text associated with the screen, if any.\n\t *\n\t * @since 4.4.0\n\t * @access private\n\t * @var array\n\t */\n\tprivate $_screen_reader_content = array();\n\n\t/**\n\t * Stores old string-based help.\n\t *\n\t * @static\n\t * @access private\n\t *\n\t * @var array\n\t */\n\tprivate static $_old_compat_help = array();\n\n\t/**\n\t * The screen options associated with screen, if any.\n\t *\n\t * @since 3.3.0\n\t * @var array\n\t * @access private\n\t */\n\tprivate $_options = array();\n\n\t/**\n\t * The screen object registry.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @static\n\t * @access private\n\t *\n\t * @var array\n\t */\n\tprivate static $_registry = array();\n\n\t/**\n\t * Stores the result of the public show_screen_options function.\n\t *\n\t * @since 3.3.0\n\t * @var bool\n\t * @access private\n\t */\n\tprivate $_show_screen_options;\n\n\t/**\n\t * Stores the 'screen_settings' section of screen options.\n\t *\n\t * @since 3.3.0\n\t * @var string\n\t * @access private\n\t */\n\tprivate $_screen_settings;\n\n\t/**\n\t * Fetches a screen object.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t *\n\t * @static\n\t *\n\t * @global string $hook_suffix\n\t *\n\t * @param string|WP_Screen $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen.\n\t * \t                                  Defaults to the current $hook_suffix global.\n\t * @return WP_Screen Screen object.\n\t */\n\tpublic static function get( $hook_name = '' ) {\n\t\tif ( $hook_name instanceof WP_Screen ) {\n\t\t\treturn $hook_name;\n\t\t}\n\n\t\t$post_type = $taxonomy = null;\n\t\t$in_admin = false;\n\t\t$action = '';\n\n\t\tif ( $hook_name )\n\t\t\t$id = $hook_name;\n\t\telse\n\t\t\t$id = $GLOBALS['hook_suffix'];\n\n\t\t// For those pesky meta boxes.\n\t\tif ( $hook_name && post_type_exists( $hook_name ) ) {\n\t\t\t$post_type = $id;\n\t\t\t$id = 'post'; // changes later. ends up being $base.\n\t\t} else {\n\t\t\tif ( '.php' == substr( $id, -4 ) )\n\t\t\t\t$id = substr( $id, 0, -4 );\n\n\t\t\tif ( 'post-new' == $id || 'link-add' == $id || 'media-new' == $id || 'user-new' == $id ) {\n\t\t\t\t$id = substr( $id, 0, -4 );\n\t\t\t\t$action = 'add';\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $post_type && $hook_name ) {\n\t\t\tif ( '-network' == substr( $id, -8 ) ) {\n\t\t\t\t$id = substr( $id, 0, -8 );\n\t\t\t\t$in_admin = 'network';\n\t\t\t} elseif ( '-user' == substr( $id, -5 ) ) {\n\t\t\t\t$id = substr( $id, 0, -5 );\n\t\t\t\t$in_admin = 'user';\n\t\t\t}\n\n\t\t\t$id = sanitize_key( $id );\n\t\t\tif ( 'edit-comments' != $id && 'edit-tags' != $id && 'edit-' == substr( $id, 0, 5 ) ) {\n\t\t\t\t$maybe = substr( $id, 5 );\n\t\t\t\tif ( taxonomy_exists( $maybe ) ) {\n\t\t\t\t\t$id = 'edit-tags';\n\t\t\t\t\t$taxonomy = $maybe;\n\t\t\t\t} elseif ( post_type_exists( $maybe ) ) {\n\t\t\t\t\t$id = 'edit';\n\t\t\t\t\t$post_type = $maybe;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! $in_admin )\n\t\t\t\t$in_admin = 'site';\n\t\t} else {\n\t\t\tif ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN )\n\t\t\t\t$in_admin = 'network';\n\t\t\telseif ( defined( 'WP_USER_ADMIN' ) && WP_USER_ADMIN )\n\t\t\t\t$in_admin = 'user';\n\t\t\telse\n\t\t\t\t$in_admin = 'site';\n\t\t}\n\n\t\tif ( 'index' == $id )\n\t\t\t$id = 'dashboard';\n\t\telseif ( 'front' == $id )\n\t\t\t$in_admin = false;\n\n\t\t$base = $id;\n\n\t\t// If this is the current screen, see if we can be more accurate for post types and taxonomies.\n\t\tif ( ! $hook_name ) {\n\t\t\tif ( isset( $_REQUEST['post_type'] ) )\n\t\t\t\t$post_type = post_type_exists( $_REQUEST['post_type'] ) ? $_REQUEST['post_type'] : false;\n\t\t\tif ( isset( $_REQUEST['taxonomy'] ) )\n\t\t\t\t$taxonomy = taxonomy_exists( $_REQUEST['taxonomy'] ) ? $_REQUEST['taxonomy'] : false;\n\n\t\t\tswitch ( $base ) {\n\t\t\t\tcase 'post' :\n\t\t\t\t\tif ( isset( $_GET['post'] ) )\n\t\t\t\t\t\t$post_id = (int) $_GET['post'];\n\t\t\t\t\telseif ( isset( $_POST['post_ID'] ) )\n\t\t\t\t\t\t$post_id = (int) $_POST['post_ID'];\n\t\t\t\t\telse\n\t\t\t\t\t\t$post_id = 0;\n\n\t\t\t\t\tif ( $post_id ) {\n\t\t\t\t\t\t$post = get_post( $post_id );\n\t\t\t\t\t\tif ( $post )\n\t\t\t\t\t\t\t$post_type = $post->post_type;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'edit-tags' :\n\t\t\t\t\tif ( null === $post_type && is_object_in_taxonomy( 'post', $taxonomy ? $taxonomy : 'post_tag' ) )\n\t\t\t\t\t\t$post_type = 'post';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tswitch ( $base ) {\n\t\t\tcase 'post' :\n\t\t\t\tif ( null === $post_type )\n\t\t\t\t\t$post_type = 'post';\n\t\t\t\t$id = $post_type;\n\t\t\t\tbreak;\n\t\t\tcase 'edit' :\n\t\t\t\tif ( null === $post_type )\n\t\t\t\t\t$post_type = 'post';\n\t\t\t\t$id .= '-' . $post_type;\n\t\t\t\tbreak;\n\t\t\tcase 'edit-tags' :\n\t\t\t\tif ( null === $taxonomy )\n\t\t\t\t\t$taxonomy = 'post_tag';\n\t\t\t\t// The edit-tags ID does not contain the post type. Look for it in the request.\n\t\t\t\tif ( null === $post_type ) {\n\t\t\t\t\t$post_type = 'post';\n\t\t\t\t\tif ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) )\n\t\t\t\t\t\t$post_type = $_REQUEST['post_type'];\n\t\t\t\t}\n\n\t\t\t\t$id = 'edit-' . $taxonomy;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( 'network' == $in_admin ) {\n\t\t\t$id   .= '-network';\n\t\t\t$base .= '-network';\n\t\t} elseif ( 'user' == $in_admin ) {\n\t\t\t$id   .= '-user';\n\t\t\t$base .= '-user';\n\t\t}\n\n\t\tif ( isset( self::$_registry[ $id ] ) ) {\n\t\t\t$screen = self::$_registry[ $id ];\n\t\t\tif ( $screen === get_current_screen() )\n\t\t\t\treturn $screen;\n\t\t} else {\n\t\t\t$screen = new WP_Screen();\n\t\t\t$screen->id     = $id;\n\t\t}\n\n\t\t$screen->base       = $base;\n\t\t$screen->action     = $action;\n\t\t$screen->post_type  = (string) $post_type;\n\t\t$screen->taxonomy   = (string) $taxonomy;\n\t\t$screen->is_user    = ( 'user' == $in_admin );\n\t\t$screen->is_network = ( 'network' == $in_admin );\n\t\t$screen->in_admin   = $in_admin;\n\n\t\tself::$_registry[ $id ] = $screen;\n\n\t\treturn $screen;\n\t}\n\n\t/**\n\t * Makes the screen object the current screen.\n\t *\n\t * @see set_current_screen()\n\t * @since 3.3.0\n\t *\n\t * @global WP_Screen $current_screen\n\t * @global string    $taxnow\n\t * @global string    $typenow\n\t */\n\tpublic function set_current_screen() {\n\t\tglobal $current_screen, $taxnow, $typenow;\n\t\t$current_screen = $this;\n\t\t$taxnow = $this->taxonomy;\n\t\t$typenow = $this->post_type;\n\n\t\t/**\n\t\t * Fires after the current screen has been set.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param WP_Screen $current_screen Current WP_Screen object.\n\t\t */\n\t\tdo_action( 'current_screen', $current_screen );\n\t}\n\n\t/**\n\t * Constructor\n\t *\n\t * @since 3.3.0\n\t * @access private\n\t */\n\tprivate function __construct() {}\n\n\t/**\n\t * Indicates whether the screen is in a particular admin\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param string $admin The admin to check against (network | user | site).\n\t *                      If empty any of the three admins will result in true.\n\t * @return bool True if the screen is in the indicated admin, false otherwise.\n\t */\n\tpublic function in_admin( $admin = null ) {\n\t\tif ( empty( $admin ) )\n\t\t\treturn (bool) $this->in_admin;\n\n\t\treturn ( $admin == $this->in_admin );\n\t}\n\n\t/**\n\t * Sets the old string-based contextual help for the screen.\n\t *\n\t * For backwards compatibility.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @static\n\t *\n\t * @param WP_Screen $screen A screen object.\n\t * @param string $help Help text.\n\t */\n\tpublic static function add_old_compat_help( $screen, $help ) {\n\t\tself::$_old_compat_help[ $screen->id ] = $help;\n\t}\n\n\t/**\n\t * Set the parent information for the screen.\n\t * This is called in admin-header.php after the menu parent for the screen has been determined.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $parent_file The parent file of the screen. Typically the $parent_file global.\n\t */\n\tpublic function set_parentage( $parent_file ) {\n\t\t$this->parent_file = $parent_file;\n\t\tlist( $this->parent_base ) = explode( '?', $parent_file );\n\t\t$this->parent_base = str_replace( '.php', '', $this->parent_base );\n\t}\n\n\t/**\n\t * Adds an option for the screen.\n\t * Call this in template files after admin.php is loaded and before admin-header.php is loaded to add screen options.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $option Option ID\n\t * @param mixed $args Option-dependent arguments.\n\t */\n\tpublic function add_option( $option, $args = array() ) {\n\t\t$this->_options[ $option ] = $args;\n\t}\n\n\t/**\n\t * Remove an option from the screen.\n\t *\n\t * @since 3.8.0\n\t *\n\t * @param string $option Option ID.\n\t */\n\tpublic function remove_option( $option ) {\n\t\tunset( $this->_options[ $option ] );\n\t}\n\n\t/**\n\t * Remove all options from the screen.\n\t *\n\t * @since 3.8.0\n\t */\n\tpublic function remove_options() {\n\t\t$this->_options = array();\n\t}\n\n\t/**\n\t * Get the options registered for the screen.\n\t *\n\t * @since 3.8.0\n\t *\n\t * @return array Options with arguments.\n\t */\n\tpublic function get_options() {\n\t\treturn $this->_options;\n\t}\n\n\t/**\n\t * Gets the arguments for an option for the screen.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $option Option name.\n\t * @param string $key    Optional. Specific array key for when the option is an array.\n\t *                       Default false.\n\t * @return string The option value if set, null otherwise.\n\t */\n\tpublic function get_option( $option, $key = false ) {\n\t\tif ( ! isset( $this->_options[ $option ] ) )\n\t\t\treturn null;\n\t\tif ( $key ) {\n\t\t\tif ( isset( $this->_options[ $option ][ $key ] ) )\n\t\t\t\treturn $this->_options[ $option ][ $key ];\n\t\t\treturn null;\n\t\t}\n\t\treturn $this->_options[ $option ];\n\t}\n\n\t/**\n\t * Gets the help tabs registered for the screen.\n\t *\n\t * @since 3.4.0\n\t * @since 4.4.0 Help tabs are ordered by their priority.\n\t *\n\t * @return array Help tabs with arguments.\n\t */\n\tpublic function get_help_tabs() {\n\t\t$help_tabs = $this->_help_tabs;\n\n\t\t$priorities = array();\n\t\tforeach ( $help_tabs as $help_tab ) {\n\t\t\tif ( isset( $priorities[ $help_tab['priority'] ] ) ) {\n\t\t\t\t$priorities[ $help_tab['priority'] ][] = $help_tab;\n\t\t\t} else {\n\t\t\t\t$priorities[ $help_tab['priority'] ] = array( $help_tab );\n\t\t\t}\n\t\t}\n\n\t\tksort( $priorities );\n\n\t\t$sorted = array();\n\t\tforeach ( $priorities as $list ) {\n\t\t\tforeach ( $list as $tab ) {\n\t\t\t\t$sorted[ $tab['id'] ] = $tab;\n\t\t\t}\n\t\t}\n\n\t\treturn $sorted;\n\t}\n\n\t/**\n\t * Gets the arguments for a help tab.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $id Help Tab ID.\n\t * @return array Help tab arguments.\n\t */\n\tpublic function get_help_tab( $id ) {\n\t\tif ( ! isset( $this->_help_tabs[ $id ] ) )\n\t\t\treturn null;\n\t\treturn $this->_help_tabs[ $id ];\n\t}\n\n\t/**\n\t * Add a help tab to the contextual help for the screen.\n\t * Call this on the load-$pagenow hook for the relevant screen.\n\t *\n\t * @since 3.3.0\n\t * @since 4.4.0 The `$priority` argument was added.\n\t *\n\t * @param array $args {\n\t *     Array of arguments used to display the help tab.\n\t *\n\t *     @type string $title    Title for the tab. Default false.\n\t *     @type string $id       Tab ID. Must be HTML-safe. Default false.\n\t *     @type string $content  Optional. Help tab content in plain text or HTML. Default empty string.\n\t *     @type string $callback Optional. A callback to generate the tab content. Default false.\n\t *     @type int    $priority Optional. The priority of the tab, used for ordering. Default 10.\n\t * }\n\t */\n\tpublic function add_help_tab( $args ) {\n\t\t$defaults = array(\n\t\t\t'title'    => false,\n\t\t\t'id'       => false,\n\t\t\t'content'  => '',\n\t\t\t'callback' => false,\n\t\t\t'priority' => 10,\n\t\t);\n\t\t$args = wp_parse_args( $args, $defaults );\n\n\t\t$args['id'] = sanitize_html_class( $args['id'] );\n\n\t\t// Ensure we have an ID and title.\n\t\tif ( ! $args['id'] || ! $args['title'] )\n\t\t\treturn;\n\n\t\t// Allows for overriding an existing tab with that ID.\n\t\t$this->_help_tabs[ $args['id'] ] = $args;\n\t}\n\n\t/**\n\t * Removes a help tab from the contextual help for the screen.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $id The help tab ID.\n\t */\n\tpublic function remove_help_tab( $id ) {\n\t\tunset( $this->_help_tabs[ $id ] );\n\t}\n\n\t/**\n\t * Removes all help tabs from the contextual help for the screen.\n\t *\n\t * @since 3.3.0\n\t */\n\tpublic function remove_help_tabs() {\n\t\t$this->_help_tabs = array();\n\t}\n\n\t/**\n\t * Gets the content from a contextual help sidebar.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return string Contents of the help sidebar.\n\t */\n\tpublic function get_help_sidebar() {\n\t\treturn $this->_help_sidebar;\n\t}\n\n\t/**\n\t * Add a sidebar to the contextual help for the screen.\n\t * Call this in template files after admin.php is loaded and before admin-header.php is loaded to add a sidebar to the contextual help.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $content Sidebar content in plain text or HTML.\n\t */\n\tpublic function set_help_sidebar( $content ) {\n\t\t$this->_help_sidebar = $content;\n\t}\n\n\t/**\n\t * Gets the number of layout columns the user has selected.\n\t *\n\t * The layout_columns option controls the max number and default number of\n\t * columns. This method returns the number of columns within that range selected\n\t * by the user via Screen Options. If no selection has been made, the default\n\t * provisioned in layout_columns is returned. If the screen does not support\n\t * selecting the number of layout columns, 0 is returned.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return int Number of columns to display.\n\t */\n\tpublic function get_columns() {\n\t\treturn $this->columns;\n\t}\n\n \t/**\n\t * Get the accessible hidden headings and text used in the screen.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @see set_screen_reader_content() For more information on the array format.\n\t *\n\t * @return array An associative array of screen reader text strings.\n\t */\n\tpublic function get_screen_reader_content() {\n\t\treturn $this->_screen_reader_content;\n\t}\n\n\t/**\n\t * Get a screen reader text string.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $key Screen reader text array named key.\n\t * @return string Screen reader text string.\n\t */\n\tpublic function get_screen_reader_text( $key ) {\n\t\tif ( ! isset( $this->_screen_reader_content[ $key ] ) ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn $this->_screen_reader_content[ $key ];\n\t}\n\n\t/**\n\t * Add accessible hidden headings and text for the screen.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $content {\n\t *     An associative array of screen reader text strings.\n\t *\n\t *     @type string $heading_views      Screen reader text for the filter links heading.\n\t *                                      Default 'Filter items list'.\n\t *     @type string $heading_pagination Screen reader text for the pagination heading.\n\t *                                      Default 'Items list navigation'.\n\t *     @type string heading_list        Screen reader text for the items list heading.\n\t *                                      Default 'Items list'.\n\t * }\n\t */\n\tpublic function set_screen_reader_content( $content = array() ) {\n\t\t$defaults = array(\n\t\t\t'heading_views'      => __( 'Filter items list' ),\n\t\t\t'heading_pagination' => __( 'Items list navigation' ),\n\t\t\t'heading_list'       => __( 'Items list' ),\n\t\t);\n\t\t$content = wp_parse_args( $content, $defaults );\n\n\t\t$this->_screen_reader_content = $content;\n\t}\n\n\t/**\n\t * Remove all the accessible hidden headings and text for the screen.\n\t *\n\t * @since 4.4.0\n\t */\n\tpublic function remove_screen_reader_content() {\n\t\t$this->_screen_reader_content = array();\n\t}\n\n\t/**\n\t * Render the screen's help section.\n\t *\n\t * This will trigger the deprecated filters for backwards compatibility.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @global string $screen_layout_columns\n\t */\n\tpublic function render_screen_meta() {\n\n\t\t/**\n\t\t * Filter the legacy contextual help list.\n\t\t *\n\t\t * @since 2.7.0\n\t\t * @deprecated 3.3.0 Use get_current_screen()->add_help_tab() or\n\t\t *                   get_current_screen()->remove_help_tab() instead.\n\t\t *\n\t\t * @param array     $old_compat_help Old contextual help.\n\t\t * @param WP_Screen $this            Current WP_Screen instance.\n\t\t */\n\t\tself::$_old_compat_help = apply_filters( 'contextual_help_list', self::$_old_compat_help, $this );\n\n\t\t$old_help = isset( self::$_old_compat_help[ $this->id ] ) ? self::$_old_compat_help[ $this->id ] : '';\n\n\t\t/**\n\t\t * Filter the legacy contextual help text.\n\t\t *\n\t\t * @since 2.7.0\n\t\t * @deprecated 3.3.0 Use get_current_screen()->add_help_tab() or\n\t\t *                   get_current_screen()->remove_help_tab() instead.\n\t\t *\n\t\t * @param string    $old_help  Help text that appears on the screen.\n\t\t * @param string    $screen_id Screen ID.\n\t\t * @param WP_Screen $this      Current WP_Screen instance.\n\t\t *\n\t\t */\n\t\t$old_help = apply_filters( 'contextual_help', $old_help, $this->id, $this );\n\n\t\t// Default help only if there is no old-style block of text and no new-style help tabs.\n\t\tif ( empty( $old_help ) && ! $this->get_help_tabs() ) {\n\n\t\t\t/**\n\t\t\t * Filter the default legacy contextual help text.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t * @deprecated 3.3.0 Use get_current_screen()->add_help_tab() or\n\t\t\t *                   get_current_screen()->remove_help_tab() instead.\n\t\t\t *\n\t\t\t * @param string $old_help_default Default contextual help text.\n\t\t\t */\n\t\t\t$default_help = apply_filters( 'default_contextual_help', '' );\n\t\t\tif ( $default_help )\n\t\t\t\t$old_help = '<p>' . $default_help . '</p>';\n\t\t}\n\n\t\tif ( $old_help ) {\n\t\t\t$this->add_help_tab( array(\n\t\t\t\t'id'      => 'old-contextual-help',\n\t\t\t\t'title'   => __('Overview'),\n\t\t\t\t'content' => $old_help,\n\t\t\t) );\n\t\t}\n\n\t\t$help_sidebar = $this->get_help_sidebar();\n\n\t\t$help_class = 'hidden';\n\t\tif ( ! $help_sidebar )\n\t\t\t$help_class .= ' no-sidebar';\n\n\t\t// Time to render!\n\t\t?>\n\t\t<div id=\"screen-meta\" class=\"metabox-prefs\">\n\n\t\t\t<div id=\"contextual-help-wrap\" class=\"<?php echo esc_attr( $help_class ); ?>\" tabindex=\"-1\" aria-label=\"<?php esc_attr_e('Contextual Help Tab'); ?>\">\n\t\t\t\t<div id=\"contextual-help-back\"></div>\n\t\t\t\t<div id=\"contextual-help-columns\">\n\t\t\t\t\t<div class=\"contextual-help-tabs\">\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t$class = ' class=\"active\"';\n\t\t\t\t\t\tforeach ( $this->get_help_tabs() as $tab ) :\n\t\t\t\t\t\t\t$link_id  = \"tab-link-{$tab['id']}\";\n\t\t\t\t\t\t\t$panel_id = \"tab-panel-{$tab['id']}\";\n\t\t\t\t\t\t\t?>\n\n\t\t\t\t\t\t\t<li id=\"<?php echo esc_attr( $link_id ); ?>\"<?php echo $class; ?>>\n\t\t\t\t\t\t\t\t<a href=\"<?php echo esc_url( \"#$panel_id\" ); ?>\" aria-controls=\"<?php echo esc_attr( $panel_id ); ?>\">\n\t\t\t\t\t\t\t\t\t<?php echo esc_html( $tab['title'] ); ?>\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t$class = '';\n\t\t\t\t\t\tendforeach;\n\t\t\t\t\t\t?>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<?php if ( $help_sidebar ) : ?>\n\t\t\t\t\t<div class=\"contextual-help-sidebar\">\n\t\t\t\t\t\t<?php echo $help_sidebar; ?>\n\t\t\t\t\t</div>\n\t\t\t\t\t<?php endif; ?>\n\n\t\t\t\t\t<div class=\"contextual-help-tabs-wrap\">\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t$classes = 'help-tab-content active';\n\t\t\t\t\t\tforeach ( $this->get_help_tabs() as $tab ):\n\t\t\t\t\t\t\t$panel_id = \"tab-panel-{$tab['id']}\";\n\t\t\t\t\t\t\t?>\n\n\t\t\t\t\t\t\t<div id=\"<?php echo esc_attr( $panel_id ); ?>\" class=\"<?php echo $classes; ?>\">\n\t\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\t// Print tab content.\n\t\t\t\t\t\t\t\techo $tab['content'];\n\n\t\t\t\t\t\t\t\t// If it exists, fire tab callback.\n\t\t\t\t\t\t\t\tif ( ! empty( $tab['callback'] ) )\n\t\t\t\t\t\t\t\t\tcall_user_func_array( $tab['callback'], array( $this, $tab ) );\n\t\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t$classes = 'help-tab-content';\n\t\t\t\t\t\tendforeach;\n\t\t\t\t\t\t?>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t<?php\n\t\t// Setup layout columns\n\n\t\t/**\n\t\t * Filter the array of screen layout columns.\n\t\t *\n\t\t * This hook provides back-compat for plugins using the back-compat\n\t\t * filter instead of add_screen_option().\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array     $empty_columns Empty array.\n\t\t * @param string    $screen_id     Screen ID.\n\t\t * @param WP_Screen $this          Current WP_Screen instance.\n\t\t */\n\t\t$columns = apply_filters( 'screen_layout_columns', array(), $this->id, $this );\n\n\t\tif ( ! empty( $columns ) && isset( $columns[ $this->id ] ) )\n\t\t\t$this->add_option( 'layout_columns', array('max' => $columns[ $this->id ] ) );\n\n\t\tif ( $this->get_option( 'layout_columns' ) ) {\n\t\t\t$this->columns = (int) get_user_option(\"screen_layout_$this->id\");\n\n\t\t\tif ( ! $this->columns && $this->get_option( 'layout_columns', 'default' ) )\n\t\t\t\t$this->columns = $this->get_option( 'layout_columns', 'default' );\n\t\t}\n\t\t$GLOBALS[ 'screen_layout_columns' ] = $this->columns; // Set the global for back-compat.\n\n\t\t// Add screen options\n\t\tif ( $this->show_screen_options() )\n\t\t\t$this->render_screen_options();\n\t\t?>\n\t\t</div>\n\t\t<?php\n\t\tif ( ! $this->get_help_tabs() && ! $this->show_screen_options() )\n\t\t\treturn;\n\t\t?>\n\t\t<div id=\"screen-meta-links\">\n\t\t<?php if ( $this->get_help_tabs() ) : ?>\n\t\t\t<div id=\"contextual-help-link-wrap\" class=\"hide-if-no-js screen-meta-toggle\">\n\t\t\t<button type=\"button\" id=\"contextual-help-link\" class=\"button show-settings\" aria-controls=\"contextual-help-wrap\" aria-expanded=\"false\"><?php _e( 'Help' ); ?></button>\n\t\t\t</div>\n\t\t<?php endif;\n\t\tif ( $this->show_screen_options() ) : ?>\n\t\t\t<div id=\"screen-options-link-wrap\" class=\"hide-if-no-js screen-meta-toggle\">\n\t\t\t<button type=\"button\" id=\"show-settings-link\" class=\"button show-settings\" aria-controls=\"screen-options-wrap\" aria-expanded=\"false\"><?php _e( 'Screen Options' ); ?></button>\n\t\t\t</div>\n\t\t<?php endif; ?>\n\t\t</div>\n\t\t<?php\n\t}\n\n\t/**\n\t *\n\t * @global array $wp_meta_boxes\n\t *\n\t * @return bool\n\t */\n\tpublic function show_screen_options() {\n\t\tglobal $wp_meta_boxes;\n\n\t\tif ( is_bool( $this->_show_screen_options ) )\n\t\t\treturn $this->_show_screen_options;\n\n\t\t$columns = get_column_headers( $this );\n\n\t\t$show_screen = ! empty( $wp_meta_boxes[ $this->id ] ) || $columns || $this->get_option( 'per_page' );\n\n\t\tswitch ( $this->base ) {\n\t\t\tcase 'widgets':\n\t\t\t\t$this->_screen_settings = '<p><a id=\"access-on\" href=\"widgets.php?widgets-access=on\">' . __('Enable accessibility mode') . '</a><a id=\"access-off\" href=\"widgets.php?widgets-access=off\">' . __('Disable accessibility mode') . \"</a></p>\\n\";\n\t\t\t\tbreak;\n\t\t\tcase 'post' :\n\t\t\t\t$expand = '<fieldset class=\"editor-expand hidden\"><legend>' . __( 'Additional settings' ) . '</legend><label for=\"editor-expand-toggle\">';\n\t\t\t\t$expand .= '<input type=\"checkbox\" id=\"editor-expand-toggle\"' . checked( get_user_setting( 'editor_expand', 'on' ), 'on', false ) . ' />';\n\t\t\t\t$expand .= __( 'Enable full-height editor and distraction-free functionality.' ) . '</label></fieldset>';\n\t\t\t\t$this->_screen_settings = $expand;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$this->_screen_settings = '';\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/**\n\t\t * Filter the screen settings text displayed in the Screen Options tab.\n\t\t *\n\t\t * This filter is currently only used on the Widgets screen to enable\n\t\t * accessibility mode.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string    $screen_settings Screen settings.\n\t\t * @param WP_Screen $this            WP_Screen object.\n\t\t */\n\t\t$this->_screen_settings = apply_filters( 'screen_settings', $this->_screen_settings, $this );\n\n\t\tif ( $this->_screen_settings || $this->_options )\n\t\t\t$show_screen = true;\n\n\t\t/**\n\t\t * Filter whether to show the Screen Options tab.\n\t\t *\n\t\t * @since 3.2.0\n\t\t *\n\t\t * @param bool      $show_screen Whether to show Screen Options tab.\n\t\t *                               Default true.\n\t\t * @param WP_Screen $this        Current WP_Screen instance.\n\t\t */\n\t\t$this->_show_screen_options = apply_filters( 'screen_options_show_screen', $show_screen, $this );\n\t\treturn $this->_show_screen_options;\n\t}\n\n\t/**\n\t * Render the screen options tab.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param array $options {\n\t *     @type bool $wrap  Whether the screen-options-wrap div will be included. Defaults to true.\n\t * }\n\t */\n\tpublic function render_screen_options( $options = array() ) {\n\t\t$options = wp_parse_args( $options, array(\n\t\t\t'wrap' => true,\n\t\t) );\n\n\t\t$wrapper_start = $wrapper_end = $form_start = $form_end = '';\n\n\t\t// Output optional wrapper.\n\t\tif ( $options['wrap'] ) {\n\t\t\t$wrapper_start = '<div id=\"screen-options-wrap\" class=\"hidden\" tabindex=\"-1\" aria-label=\"' . esc_attr__( 'Screen Options Tab' ) . '\">';\n\t\t\t$wrapper_end = '</div>';\n\t\t}\n\n\t\t// Don't output the form and nonce for the widgets accessibility mode links.\n\t\tif ( 'widgets' !== $this->base ) {\n\t\t\t$form_start = \"\\n<form id='adv-settings' method='post'>\\n\";\n\t\t\t$form_end = \"\\n\" . wp_nonce_field( 'screen-options-nonce', 'screenoptionnonce', false, false ) . \"\\n</form>\\n\";\n\t\t}\n\n\t\techo $wrapper_start . $form_start;\n\n\t\t$this->render_meta_boxes_preferences();\n\t\t$this->render_list_table_columns_preferences();\n\t\t$this->render_screen_layout();\n\t\t$this->render_per_page_options();\n\t\t$this->render_view_mode();\n\t\techo $this->_screen_settings;\n\n\t\t/**\n\t\t * Filter whether to show the Screen Options submit button.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param bool      $show_button Whether to show Screen Options submit button.\n\t\t *                               Default false.\n\t\t * @param WP_Screen $this        Current WP_Screen instance.\n\t\t */\n\t\t$show_button = apply_filters( 'screen_options_show_submit', false, $this );\n\n\t\tif ( $show_button ) {\n\t\t\tsubmit_button( __( 'Apply' ), 'primary', 'screen-options-apply', true );\n\t\t}\n\n\t\techo $form_end . $wrapper_end;\n\t}\n\n\t/**\n\t * Render the meta boxes preferences.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @global array $wp_meta_boxes\n\t */\n\tpublic function render_meta_boxes_preferences() {\n\t\tglobal $wp_meta_boxes;\n\n\t\tif ( ! isset( $wp_meta_boxes[ $this->id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t\t?>\n\t\t<fieldset class=\"metabox-prefs\">\n\t\t<legend><?php _e( 'Boxes' ); ?></legend>\n\t\t<?php\n\t\t\tmeta_box_prefs( $this );\n\n\t\t\tif ( 'dashboard' === $this->id && has_action( 'welcome_panel' ) && current_user_can( 'edit_theme_options' ) ) {\n\t\t\t\tif ( isset( $_GET['welcome'] ) ) {\n\t\t\t\t\t$welcome_checked = empty( $_GET['welcome'] ) ? 0 : 1;\n\t\t\t\t\tupdate_user_meta( get_current_user_id(), 'show_welcome_panel', $welcome_checked );\n\t\t\t\t} else {\n\t\t\t\t\t$welcome_checked = get_user_meta( get_current_user_id(), 'show_welcome_panel', true );\n\t\t\t\t\tif ( 2 == $welcome_checked && wp_get_current_user()->user_email != get_option( 'admin_email' ) ) {\n\t\t\t\t\t\t$welcome_checked = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\techo '<label for=\"wp_welcome_panel-hide\">';\n\t\t\t\techo '<input type=\"checkbox\" id=\"wp_welcome_panel-hide\"' . checked( (bool) $welcome_checked, true, false ) . ' />';\n\t\t\t\techo _x( 'Welcome', 'Welcome panel' ) . \"</label>\\n\";\n\t\t\t}\n\t\t?>\n\t\t</fieldset>\n\t\t<?php\n\t}\n\n\t/**\n\t * Render the list table columns preferences.\n\t *\n\t * @since 4.4.0\n\t */\n\tpublic function render_list_table_columns_preferences() {\n\n\t\t$columns = get_column_headers( $this );\n\t\t$hidden  = get_hidden_columns( $this );\n\n\t\tif ( ! $columns ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$legend = ! empty( $columns['_title'] ) ? $columns['_title'] : __( 'Columns' );\n\t\t?>\n\t\t<fieldset class=\"metabox-prefs\">\n\t\t<legend><?php echo $legend; ?></legend>\n\t\t<?php\n\t\t$special = array( '_title', 'cb', 'comment', 'media', 'name', 'title', 'username', 'blogname' );\n\n\t\tforeach ( $columns as $column => $title ) {\n\t\t\t// Can't hide these for they are special\n\t\t\tif ( in_array( $column, $special ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( empty( $title ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( 'comments' == $column ) {\n\t\t\t\t$title = __( 'Comments' );\n\t\t\t}\n\n\t\t\t$id = \"$column-hide\";\n\t\t\techo '<label>';\n\t\t\techo '<input class=\"hide-column-tog\" name=\"' . $id . '\" type=\"checkbox\" id=\"' . $id . '\" value=\"' . $column . '\"' . checked( ! in_array( $column, $hidden ), true, false ) . ' />';\n\t\t\techo \"$title</label>\\n\";\n\t\t}\n\t\t?>\n\t\t</fieldset>\n\t\t<?php\n\t}\n\n\t/**\n\t * Render the option for number of columns on the page\n\t *\n\t * @since 3.3.0\n\t */\n\tpublic function render_screen_layout() {\n\t\tif ( ! $this->get_option( 'layout_columns' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$screen_layout_columns = $this->get_columns();\n\t\t$num = $this->get_option( 'layout_columns', 'max' );\n\n\t\t?>\n\t\t<fieldset class='columns-prefs'>\n\t\t<legend class=\"screen-layout\"><?php _e( 'Layout' ); ?></legend><?php\n\t\t\tfor ( $i = 1; $i <= $num; ++$i ):\n\t\t\t\t?>\n\t\t\t\t<label class=\"columns-prefs-<?php echo $i; ?>\">\n\t\t\t\t\t<input type='radio' name='screen_columns' value='<?php echo esc_attr( $i ); ?>'\n\t\t\t\t\t\t<?php checked( $screen_layout_columns, $i ); ?> />\n\t\t\t\t\t<?php printf( _n( '%s column', '%s columns', $i ), number_format_i18n( $i ) ); ?>\n\t\t\t\t</label>\n\t\t\t\t<?php\n\t\t\tendfor; ?>\n\t\t</fieldset>\n\t\t<?php\n\t}\n\n\t/**\n\t * Render the items per page option\n\t *\n\t * @since 3.3.0\n\t */\n\tpublic function render_per_page_options() {\n\t\tif ( null === $this->get_option( 'per_page' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$per_page_label = $this->get_option( 'per_page', 'label' );\n\t\tif ( null === $per_page_label ) {\n\t\t\t$per_page_label = __( 'Number of items per page:' );\n\t\t}\n\n\t\t$option = $this->get_option( 'per_page', 'option' );\n\t\tif ( ! $option ) {\n\t\t\t$option = str_replace( '-', '_', \"{$this->id}_per_page\" );\n\t\t}\n\n\t\t$per_page = (int) get_user_option( $option );\n\t\tif ( empty( $per_page ) || $per_page < 1 ) {\n\t\t\t$per_page = $this->get_option( 'per_page', 'default' );\n\t\t\tif ( ! $per_page ) {\n\t\t\t\t$per_page = 20;\n\t\t\t}\n\t\t}\n\n\t\tif ( 'edit_comments_per_page' == $option ) {\n\t\t\t$comment_status = isset( $_REQUEST['comment_status'] ) ? $_REQUEST['comment_status'] : 'all';\n\n\t\t\t/** This filter is documented in wp-admin/includes/class-wp-comments-list-table.php */\n\t\t\t$per_page = apply_filters( 'comments_per_page', $per_page, $comment_status );\n\t\t} elseif ( 'categories_per_page' == $option ) {\n\t\t\t/** This filter is documented in wp-admin/includes/class-wp-terms-list-table.php */\n\t\t\t$per_page = apply_filters( 'edit_categories_per_page', $per_page );\n\t\t} else {\n\t\t\t/** This filter is documented in wp-admin/includes/class-wp-list-table.php */\n\t\t\t$per_page = apply_filters( $option, $per_page );\n\t\t}\n\n\t\t// Back compat\n\t\tif ( isset( $this->post_type ) ) {\n\t\t\t/** This filter is documented in wp-admin/includes/post.php */\n\t\t\t$per_page = apply_filters( 'edit_posts_per_page', $per_page, $this->post_type );\n\t\t}\n\n\t\t// This needs a submit button\n\t\tadd_filter( 'screen_options_show_submit', '__return_true' );\n\n\t\t?>\n\t\t<fieldset class=\"screen-options\">\n\t\t<legend><?php _e( 'Pagination' ); ?></legend>\n\t\t\t<?php if ( $per_page_label ) : ?>\n\t\t\t\t<label for=\"<?php echo esc_attr( $option ); ?>\"><?php echo $per_page_label; ?></label>\n\t\t\t\t<input type=\"number\" step=\"1\" min=\"1\" max=\"999\" class=\"screen-per-page\" name=\"wp_screen_options[value]\"\n\t\t\t\t\tid=\"<?php echo esc_attr( $option ); ?>\" maxlength=\"3\"\n\t\t\t\t\tvalue=\"<?php echo esc_attr( $per_page ); ?>\" />\n\t\t\t<?php endif; ?>\n\t\t\t\t<input type=\"hidden\" name=\"wp_screen_options[option]\" value=\"<?php echo esc_attr( $option ); ?>\" />\n\t\t</fieldset>\n\t\t<?php\n\t}\n\n\t/**\n\t * Render the list table view mode preferences.\n\t *\n\t * @since 4.4.0\n\t */\n\tpublic function render_view_mode() {\n\t\t$screen = get_current_screen();\n\n\t\t// Currently only enabled for posts lists\n\t\tif ( 'edit' !== $screen->base ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Filter the post types that have different view mode options.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array $view_mode_post_types Array of post types that can change view modes.\n\t\t *                                    Default hierarchical post types with show_ui on.\n\t\t */\n\t\t$view_mode_post_types = get_post_types( array( 'hierarchical' => false, 'show_ui' => true ) );\n\t\t$view_mode_post_types = apply_filters( 'view_mode_post_types', $view_mode_post_types );\n\n\t\tif ( ! in_array( $this->post_type, $view_mode_post_types ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tglobal $mode;\n\n\t\t// This needs a submit button\n\t\tadd_filter( 'screen_options_show_submit', '__return_true' );\n?>\n\t\t<fieldset class=\"metabox-prefs view-mode\">\n\t\t<legend><?php _e( 'View Mode' ); ?></legend>\n\t\t\t\t<label for=\"list-view-mode\">\n\t\t\t\t\t<input id=\"list-view-mode\" type=\"radio\" name=\"mode\" value=\"list\" <?php checked( 'list', $mode ); ?> />\n\t\t\t\t\t<?php _e( 'List View' ); ?>\n\t\t\t\t</label>\n\t\t\t\t<label for=\"excerpt-view-mode\">\n\t\t\t\t\t<input id=\"excerpt-view-mode\" type=\"radio\" name=\"mode\" value=\"excerpt\" <?php checked( 'excerpt', $mode ); ?> />\n\t\t\t\t\t<?php _e( 'Excerpt View' ); ?>\n\t\t\t\t</label>\n\t\t</fieldset>\n<?php\n\t}\n\n\t/**\n\t * Render screen reader text.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $key The screen reader text array named key.\n\t * @param string $tag Optional. The HTML tag to wrap the screen reader text. Default h2.\n\t */\n\tpublic function render_screen_reader_content( $key = '', $tag = 'h2' ) {\n\n\t\tif ( ! isset( $this->_screen_reader_content[ $key ] ) ) {\n\t\t\treturn;\n\t\t}\n\t\techo \"<$tag class='screen-reader-text'>\" . $this->_screen_reader_content[ $key ] . \"</$tag>\";\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-site-icon.php",
    "content": "<?php\n/**\n * Administration API: WP_Site_Icon class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.3.0\n */\n\n/**\n * Core class used to implement site icon functionality.\n *\n * @since 4.3.0\n */\nclass WP_Site_Icon {\n\n\t/**\n\t * The minimum size of the site icon.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $min_size  = 512;\n\n\t/**\n\t * The size to which to crop the image so that we can display it in the UI nicely.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $page_crop = 512;\n\n\t/**\n\t * List of site icon sizes.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $site_icon_sizes = array(\n\t\t/*\n\t\t * Square, medium sized tiles for IE11+.\n\t\t *\n\t\t * See https://msdn.microsoft.com/library/dn455106(v=vs.85).aspx\n\t\t */\n\t\t270,\n\n\t\t/*\n\t\t * App icon for Android/Chrome.\n\t\t *\n\t\t * @link https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android\n\t\t * @link https://developer.chrome.com/multidevice/android/installtohomescreen\n\t\t */\n\t\t192,\n\n\t\t/*\n\t\t * App icons up to iPhone 6 Plus.\n\t\t *\n\t\t * See https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html\n\t\t */\n\t\t180,\n\n\t\t// Our regular Favicon.\n\t\t32,\n\t);\n\n\t/**\n\t * Registers actions and filters.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\tadd_action( 'delete_attachment', array( $this, 'delete_attachment_data' ) );\n\t\tadd_filter( 'get_post_metadata', array( $this, 'get_post_metadata' ), 10, 4 );\n\t}\n\n\t/**\n\t * Creates an attachment 'object'.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param string $cropped              Cropped image URL.\n\t * @param int    $parent_attachment_id Attachment ID of parent image.\n\t * @return array Attachment object.\n\t */\n\tpublic function create_attachment_object( $cropped, $parent_attachment_id ) {\n\t\t$parent     = get_post( $parent_attachment_id );\n\t\t$parent_url = wp_get_attachment_url( $parent->ID );\n\t\t$url        = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url );\n\n\t\t$size       = @getimagesize( $cropped );\n\t\t$image_type = ( $size ) ? $size['mime'] : 'image/jpeg';\n\n\t\t$object = array(\n\t\t\t'ID'             => $parent_attachment_id,\n\t\t\t'post_title'     => basename( $cropped ),\n\t\t\t'post_content'   => $url,\n\t\t\t'post_mime_type' => $image_type,\n\t\t\t'guid'           => $url,\n\t\t\t'context'        => 'site-icon'\n\t\t);\n\n\t\treturn $object;\n\t}\n\n\t/**\n\t * Inserts an attachment.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array  $object Attachment object.\n\t * @param string $file   File path of the attached image.\n\t * @return int           Attachment ID\n\t */\n\tpublic function insert_attachment( $object, $file ) {\n\t\t$attachment_id = wp_insert_attachment( $object, $file );\n\t\t$metadata      = wp_generate_attachment_metadata( $attachment_id, $file );\n\n\t\t/**\n\t\t * Filter the site icon attachment metadata.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @see wp_generate_attachment_metadata()\n\t\t *\n\t\t * @param array $metadata Attachment metadata.\n\t\t */\n\t\t$metadata = apply_filters( 'site_icon_attachment_metadata', $metadata );\n\t\twp_update_attachment_metadata( $attachment_id, $metadata );\n\n\t\treturn $attachment_id;\n\t}\n\n\t/**\n\t * Adds additional sizes to be made when creating the site_icon images.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $sizes List of additional sizes.\n\t * @return array Additional image sizes.\n\t */\n\tpublic function additional_sizes( $sizes = array() ) {\n\t\t$only_crop_sizes = array();\n\n\t\t/**\n\t\t * Filter the different dimensions that a site icon is saved in.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @param array $site_icon_sizes Sizes available for the Site Icon.\n\t\t */\n\t\t$this->site_icon_sizes = apply_filters( 'site_icon_image_sizes', $this->site_icon_sizes );\n\n\t\t// Use a natural sort of numbers.\n\t\tnatsort( $this->site_icon_sizes );\n\t\t$this->site_icon_sizes = array_reverse( $this->site_icon_sizes );\n\n\t\t// ensure that we only resize the image into\n\t\tforeach ( $sizes as $name => $size_array ) {\n\t\t\tif ( isset( $size_array['crop'] ) ) {\n\t\t\t\t$only_crop_sizes[ $name ] = $size_array;\n\t\t\t}\n\t\t}\n\n\t\tforeach ( $this->site_icon_sizes as $size ) {\n\t\t\tif ( $size < $this->min_size ) {\n\t\t\t\t$only_crop_sizes[ 'site_icon-' . $size ] = array(\n\t\t\t\t\t'width ' => $size,\n\t\t\t\t\t'height' => $size,\n\t\t\t\t\t'crop'   => true,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn $only_crop_sizes;\n\t}\n\n\t/**\n\t * Adds Site Icon sizes to the array of image sizes on demand.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $sizes List of image sizes.\n\t * @return array List of intermediate image sizes.\n\t */\n\tpublic function intermediate_image_sizes( $sizes = array() ) {\n\t\t/** This filter is documented in wp-admin/includes/class-wp-site-icon.php */\n\t\t$this->site_icon_sizes = apply_filters( 'site_icon_image_sizes', $this->site_icon_sizes );\n\t\tforeach ( $this->site_icon_sizes as $size ) {\n\t\t\t$sizes[] = 'site_icon-' . $size;\n\t\t}\n\n\t\treturn $sizes;\n\t}\n\n\t/**\n\t * Deletes the Site Icon when the image file is deleted.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param int $post_id Attachment ID.\n\t */\n\tpublic function delete_attachment_data( $post_id ) {\n\t\t$site_icon_id = get_option( 'site_icon' );\n\n\t\tif ( $site_icon_id && $post_id == $site_icon_id ) {\n\t\t\tdelete_option( 'site_icon' );\n\t\t}\n\t}\n\n\t/**\n\t * Adds custom image sizes when meta data for an image is requested, that happens to be used as Site Icon.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param null|array|string $value    The value get_metadata() should return a single metadata value, or an\n\t *                                    array of values.\n\t * @param int               $post_id  Post ID.\n\t * @param string            $meta_key Meta key.\n\t * @param string|array      $single   Meta value, or an array of values.\n\t * @return array|null|string The attachment metadata value, array of values, or null.\n\t */\n\tpublic function get_post_metadata( $value, $post_id, $meta_key, $single ) {\n\t\tif ( $single && '_wp_attachment_backup_sizes' === $meta_key ) {\n\t\t\t$site_icon_id = get_option( 'site_icon' );\n\n\t\t\tif ( $post_id == $site_icon_id ) {\n\t\t\t\tadd_filter( 'intermediate_image_sizes', array( $this, 'intermediate_image_sizes' ) );\n\t\t\t}\n\t\t}\n\n\t\treturn $value;\n\t}\n}\n\n/**\n * @global WP_Site_Icon $wp_site_icon\n */\n$GLOBALS['wp_site_icon'] = new WP_Site_Icon;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-terms-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Terms_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying terms in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_Terms_List_Table extends WP_List_Table {\n\n\tpublic $callback_args;\n\n\tprivate $level;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @global string $post_type\n\t * @global string $taxonomy\n\t * @global string $action\n\t * @global object $tax\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\tglobal $post_type, $taxonomy, $action, $tax;\n\n\t\tparent::__construct( array(\n\t\t\t'plural' => 'tags',\n\t\t\t'singular' => 'tag',\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\n\t\t$action    = $this->screen->action;\n\t\t$post_type = $this->screen->post_type;\n\t\t$taxonomy  = $this->screen->taxonomy;\n\n\t\tif ( empty( $taxonomy ) )\n\t\t\t$taxonomy = 'post_tag';\n\n\t\tif ( ! taxonomy_exists( $taxonomy ) )\n\t\t\twp_die( __( 'Invalid taxonomy' ) );\n\n\t\t$tax = get_taxonomy( $taxonomy );\n\n\t\t// @todo Still needed? Maybe just the show_ui part.\n\t\tif ( empty( $post_type ) || !in_array( $post_type, get_post_types( array( 'show_ui' => true ) ) ) )\n\t\t\t$post_type = 'post';\n\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can( get_taxonomy( $this->screen->taxonomy )->cap->manage_terms );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function prepare_items() {\n\t\t$tags_per_page = $this->get_items_per_page( 'edit_' . $this->screen->taxonomy . '_per_page' );\n\n\t\tif ( 'post_tag' === $this->screen->taxonomy ) {\n\t\t\t/**\n\t\t\t * Filter the number of terms displayed per page for the Tags list table.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param int $tags_per_page Number of tags to be displayed. Default 20.\n\t\t\t */\n\t\t\t$tags_per_page = apply_filters( 'edit_tags_per_page', $tags_per_page );\n\n\t\t\t/**\n\t\t\t * Filter the number of terms displayed per page for the Tags list table.\n\t\t\t *\n\t\t\t * @since 2.7.0\n\t\t\t * @deprecated 2.8.0 Use edit_tags_per_page instead.\n\t\t\t *\n\t\t\t * @param int $tags_per_page Number of tags to be displayed. Default 20.\n\t\t\t */\n\t\t\t$tags_per_page = apply_filters( 'tagsperpage', $tags_per_page );\n\t\t} elseif ( 'category' === $this->screen->taxonomy ) {\n\t\t\t/**\n\t\t\t * Filter the number of terms displayed per page for the Categories list table.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param int $tags_per_page Number of categories to be displayed. Default 20.\n\t\t\t */\n\t\t\t$tags_per_page = apply_filters( 'edit_categories_per_page', $tags_per_page );\n\t\t}\n\n\t\t$search = !empty( $_REQUEST['s'] ) ? trim( wp_unslash( $_REQUEST['s'] ) ) : '';\n\n\t\t$args = array(\n\t\t\t'search' => $search,\n\t\t\t'page' => $this->get_pagenum(),\n\t\t\t'number' => $tags_per_page,\n\t\t);\n\n\t\tif ( !empty( $_REQUEST['orderby'] ) )\n\t\t\t$args['orderby'] = trim( wp_unslash( $_REQUEST['orderby'] ) );\n\n\t\tif ( !empty( $_REQUEST['order'] ) )\n\t\t\t$args['order'] = trim( wp_unslash( $_REQUEST['order'] ) );\n\n\t\t$this->callback_args = $args;\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => wp_count_terms( $this->screen->taxonomy, compact( 'search' ) ),\n\t\t\t'per_page' => $tags_per_page,\n\t\t) );\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function has_items() {\n\t\t// todo: populate $this->items in prepare_items()\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\techo get_taxonomy( $this->screen->taxonomy )->labels->not_found;\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_bulk_actions() {\n\t\t$actions = array();\n\t\t$actions['delete'] = __( 'Delete' );\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t *\n\t * @return string\n\t */\n\tpublic function current_action() {\n\t\tif ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['delete_tags'] ) && ( 'delete' === $_REQUEST['action'] || 'delete' === $_REQUEST['action2'] ) )\n\t\t\treturn 'bulk-delete';\n\n\t\treturn parent::current_action();\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\t$columns = array(\n\t\t\t'cb'          => '<input type=\"checkbox\" />',\n\t\t\t'name'        => _x( 'Name', 'term name' ),\n\t\t\t'description' => __( 'Description' ),\n\t\t\t'slug'        => __( 'Slug' ),\n\t\t);\n\n\t\tif ( 'link_category' === $this->screen->taxonomy ) {\n\t\t\t$columns['links'] = __( 'Links' );\n\t\t} else {\n\t\t\t$columns['posts'] = _x( 'Count', 'Number/count of items' );\n\t\t}\n\n\t\treturn $columns;\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tprotected function get_sortable_columns() {\n\t\treturn array(\n\t\t\t'name'        => 'name',\n\t\t\t'description' => 'description',\n\t\t\t'slug'        => 'slug',\n\t\t\t'posts'       => 'count',\n\t\t\t'links'       => 'count'\n\t\t);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function display_rows_or_placeholder() {\n\t\t$taxonomy = $this->screen->taxonomy;\n\n\t\t$args = wp_parse_args( $this->callback_args, array(\n\t\t\t'page' => 1,\n\t\t\t'number' => 20,\n\t\t\t'search' => '',\n\t\t\t'hide_empty' => 0\n\t\t) );\n\n\t\t$page = $args['page'];\n\n\t\t// Set variable because $args['number'] can be subsequently overridden.\n\t\t$number = $args['number'];\n\n\t\t$args['offset'] = $offset = ( $page - 1 ) * $number;\n\n\t\t// Convert it to table rows.\n\t\t$count = 0;\n\n\t\tif ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $args['orderby'] ) ) {\n\t\t\t// We'll need the full set of terms then.\n\t\t\t$args['number'] = $args['offset'] = 0;\n\t\t}\n\t\t$terms = get_terms( $taxonomy, $args );\n\n\t\tif ( empty( $terms ) || ! is_array( $terms ) ) {\n\t\t\techo '<tr class=\"no-items\"><td class=\"colspanchange\" colspan=\"' . $this->get_column_count() . '\">';\n\t\t\t$this->no_items();\n\t\t\techo '</td></tr>';\n\t\t\treturn;\n\t\t}\n\n\t\tif ( is_taxonomy_hierarchical( $taxonomy ) && ! isset( $args['orderby'] ) ) {\n\t\t\tif ( ! empty( $args['search'] ) ) {// Ignore children on searches.\n\t\t\t\t$children = array();\n\t\t\t} else {\n\t\t\t\t$children = _get_term_hierarchy( $taxonomy );\n\t\t\t}\n\t\t\t// Some funky recursion to get the job done( Paging & parents mainly ) is contained within, Skip it for non-hierarchical taxonomies for performance sake\n\t\t\t$this->_rows( $taxonomy, $terms, $children, $offset, $number, $count );\n\t\t} else {\n\t\t\tforeach ( $terms as $term ) {\n\t\t\t\t$this->single_row( $term );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param string $taxonomy\n\t * @param array $terms\n\t * @param array $children\n\t * @param int   $start\n\t * @param int   $per_page\n\t * @param int   $count\n\t * @param int   $parent\n\t * @param int   $level\n\t */\n\tprivate function _rows( $taxonomy, $terms, &$children, $start, $per_page, &$count, $parent = 0, $level = 0 ) {\n\n\t\t$end = $start + $per_page;\n\n\t\tforeach ( $terms as $key => $term ) {\n\n\t\t\tif ( $count >= $end )\n\t\t\t\tbreak;\n\n\t\t\tif ( $term->parent != $parent && empty( $_REQUEST['s'] ) )\n\t\t\t\tcontinue;\n\n\t\t\t// If the page starts in a subtree, print the parents.\n\t\t\tif ( $count == $start && $term->parent > 0 && empty( $_REQUEST['s'] ) ) {\n\t\t\t\t$my_parents = $parent_ids = array();\n\t\t\t\t$p = $term->parent;\n\t\t\t\twhile ( $p ) {\n\t\t\t\t\t$my_parent = get_term( $p, $taxonomy );\n\t\t\t\t\t$my_parents[] = $my_parent;\n\t\t\t\t\t$p = $my_parent->parent;\n\t\t\t\t\tif ( in_array( $p, $parent_ids ) ) // Prevent parent loops.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t$parent_ids[] = $p;\n\t\t\t\t}\n\t\t\t\tunset( $parent_ids );\n\n\t\t\t\t$num_parents = count( $my_parents );\n\t\t\t\twhile ( $my_parent = array_pop( $my_parents ) ) {\n\t\t\t\t\techo \"\\t\";\n\t\t\t\t\t$this->single_row( $my_parent, $level - $num_parents );\n\t\t\t\t\t$num_parents--;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $count >= $start ) {\n\t\t\t\techo \"\\t\";\n\t\t\t\t$this->single_row( $term, $level );\n\t\t\t}\n\n\t\t\t++$count;\n\n\t\t\tunset( $terms[$key] );\n\n\t\t\tif ( isset( $children[$term->term_id] ) && empty( $_REQUEST['s'] ) )\n\t\t\t\t$this->_rows( $taxonomy, $terms, $children, $start, $per_page, $count, $term->term_id, $level + 1 );\n\t\t}\n\t}\n\n\t/**\n\t * @global string $taxonomy\n\t * @param object $tag\n\t * @param int $level\n\t */\n\tpublic function single_row( $tag, $level = 0 ) {\n\t\tglobal $taxonomy;\n \t\t$tag = sanitize_term( $tag, $taxonomy );\n\n\t\t$this->level = $level;\n\n\t\techo '<tr id=\"tag-' . $tag->term_id . '\">';\n\t\t$this->single_row_columns( $tag );\n\t\techo '</tr>';\n\t}\n\n\t/**\n\t * @param object $tag\n\t * @return string\n\t */\n\tpublic function column_cb( $tag ) {\n\t\t$default_term = get_option( 'default_' . $this->screen->taxonomy );\n\n\t\tif ( current_user_can( get_taxonomy( $this->screen->taxonomy )->cap->delete_terms ) && $tag->term_id != $default_term )\n\t\t\treturn '<label class=\"screen-reader-text\" for=\"cb-select-' . $tag->term_id . '\">' . sprintf( __( 'Select %s' ), $tag->name ) . '</label>'\n\t\t\t\t. '<input type=\"checkbox\" name=\"delete_tags[]\" value=\"' . $tag->term_id . '\" id=\"cb-select-' . $tag->term_id . '\" />';\n\n\t\treturn '&nbsp;';\n\t}\n\n\t/**\n\t * @param object $tag\n\t * @return string\n\t */\n\tpublic function column_name( $tag ) {\n\t\t$taxonomy = $this->screen->taxonomy;\n\n\t\t$pad = str_repeat( '&#8212; ', max( 0, $this->level ) );\n\n\t\t/**\n\t\t * Filter display of the term name in the terms list table.\n\t\t *\n\t\t * The default output may include padding due to the term's\n\t\t * current level in the term hierarchy.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @see WP_Terms_List_Table::column_name()\n\t\t *\n\t\t * @param string $pad_tag_name The term name, padded if not top-level.\n\t\t * @param object $tag          Term object.\n\t\t */\n\t\t$name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );\n\n\t\t$qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );\n\n\t\t$uri = ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ? wp_get_referer() : $_SERVER['REQUEST_URI'];\n\n\t\t$edit_link = add_query_arg(\n\t\t\t'wp_http_referer',\n\t\t\turlencode( wp_unslash( $uri ) ),\n\t\t\tget_edit_term_link( $tag->term_id, $taxonomy, $this->screen->post_type )\n\t\t);\n\n\t\t$out = '<strong><a class=\"row-title\" href=\"' . esc_url( $edit_link ) . '\" title=\"' . esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $name ) ) . '\">' . $name . '</a></strong><br />';\n\n\t\t$out .= '<div class=\"hidden\" id=\"inline_' . $qe_data->term_id . '\">';\n\t\t$out .= '<div class=\"name\">' . $qe_data->name . '</div>';\n\n\t\t/** This filter is documented in wp-admin/edit-tag-form.php */\n\t\t$out .= '<div class=\"slug\">' . apply_filters( 'editable_slug', $qe_data->slug, $qe_data ) . '</div>';\n\t\t$out .= '<div class=\"parent\">' . $qe_data->parent . '</div></div>';\n\n\t\treturn $out;\n\t}\n\n\t/**\n\t * Gets the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, 'name'.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\treturn 'name';\n\t}\n\n\t/**\n\t * Generates and displays row action links.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @param object $tag         Tag being acted upon.\n\t * @param string $column_name Current column name.\n\t * @param string $primary     Primary column name.\n\t * @return string Row actions output for terms.\n\t */\n\tprotected function handle_row_actions( $tag, $column_name, $primary ) {\n\t\tif ( $primary !== $column_name ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t$taxonomy = $this->screen->taxonomy;\n\t\t$tax = get_taxonomy( $taxonomy );\n\t\t$default_term = get_option( 'default_' . $taxonomy );\n\n\t\t$uri = ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ? wp_get_referer() : $_SERVER['REQUEST_URI'];\n\n\t\t$edit_link = add_query_arg(\n\t\t\t'wp_http_referer',\n\t\t\turlencode( wp_unslash( $uri ) ),\n\t\t\tget_edit_term_link( $tag->term_id, $taxonomy, $this->screen->post_type )\n\t\t);\n\n\t\t$actions = array();\n\t\tif ( current_user_can( $tax->cap->edit_terms ) ) {\n\t\t\t$actions['edit'] = '<a href=\"' . esc_url( $edit_link ) . '\">' . __( 'Edit' ) . '</a>';\n\t\t\t$actions['inline hide-if-no-js'] = '<a href=\"#\" class=\"editinline\">' . __( 'Quick&nbsp;Edit' ) . '</a>';\n\t\t}\n\t\tif ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )\n\t\t\t$actions['delete'] = \"<a class='delete-tag' href='\" . wp_nonce_url( \"edit-tags.php?action=delete&amp;taxonomy=$taxonomy&amp;tag_ID=$tag->term_id\", 'delete-tag_' . $tag->term_id ) . \"'>\" . __( 'Delete' ) . \"</a>\";\n\t\tif ( $tax->public )\n\t\t\t$actions['view'] = '<a href=\"' . get_term_link( $tag ) . '\">' . __( 'View' ) . '</a>';\n\n\t\t/**\n\t\t * Filter the action links displayed for each term in the Tags list table.\n\t\t *\n\t\t * @since 2.8.0\n\t\t * @deprecated 3.0.0 Use {$taxonomy}_row_actions instead.\n\t\t *\n\t\t * @param array  $actions An array of action links to be displayed. Default\n\t\t *                        'Edit', 'Quick Edit', 'Delete', and 'View'.\n\t\t * @param object $tag     Term object.\n\t\t */\n\t\t$actions = apply_filters( 'tag_row_actions', $actions, $tag );\n\n\t\t/**\n\t\t * Filter the action links displayed for each term in the terms list table.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array  $actions An array of action links to be displayed. Default\n\t\t *                        'Edit', 'Quick Edit', 'Delete', and 'View'.\n\t\t * @param object $tag     Term object.\n\t\t */\n\t\t$actions = apply_filters( \"{$taxonomy}_row_actions\", $actions, $tag );\n\n\t\treturn $this->row_actions( $actions );\n\t}\n\n\t/**\n\t * @param object $tag\n\t * @return string\n\t */\n\tpublic function column_description( $tag ) {\n\t\treturn $tag->description;\n\t}\n\n\t/**\n\t * @param object $tag\n\t * @return string\n\t */\n\tpublic function column_slug( $tag ) {\n\t\t/** This filter is documented in wp-admin/edit-tag-form.php */\n\t\treturn apply_filters( 'editable_slug', $tag->slug, $tag );\n\t}\n\n\t/**\n\t * @param object $tag\n\t * @return string\n\t */\n\tpublic function column_posts( $tag ) {\n\t\t$count = number_format_i18n( $tag->count );\n\n\t\t$tax = get_taxonomy( $this->screen->taxonomy );\n\n\t\t$ptype_object = get_post_type_object( $this->screen->post_type );\n\t\tif ( ! $ptype_object->show_ui )\n\t\t\treturn $count;\n\n\t\tif ( $tax->query_var ) {\n\t\t\t$args = array( $tax->query_var => $tag->slug );\n\t\t} else {\n\t\t\t$args = array( 'taxonomy' => $tax->name, 'term' => $tag->slug );\n\t\t}\n\n\t\tif ( 'post' != $this->screen->post_type )\n\t\t\t$args['post_type'] = $this->screen->post_type;\n\n\t\tif ( 'attachment' === $this->screen->post_type )\n\t\t\treturn \"<a href='\" . esc_url ( add_query_arg( $args, 'upload.php' ) ) . \"'>$count</a>\";\n\n\t\treturn \"<a href='\" . esc_url ( add_query_arg( $args, 'edit.php' ) ) . \"'>$count</a>\";\n\t}\n\n\t/**\n\t * @param object $tag\n\t * @return string\n\t */\n\tpublic function column_links( $tag ) {\n\t\t$count = number_format_i18n( $tag->count );\n\t\tif ( $count )\n\t\t\t$count = \"<a href='link-manager.php?cat_id=$tag->term_id'>$count</a>\";\n\t\treturn $count;\n\t}\n\n\t/**\n\t * @param object $tag\n\t * @param string $column_name\n\t * @return string\n\t */\n\tpublic function column_default( $tag, $column_name ) {\n\t\t/**\n\t\t * Filter the displayed columns in the terms list table.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$this->screen->taxonomy`,\n\t\t * refers to the slug of the current taxonomy.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param string $string      Blank string.\n\t\t * @param string $column_name Name of the column.\n\t\t * @param int    $term_id     Term ID.\n\t\t */\n\t\treturn apply_filters( \"manage_{$this->screen->taxonomy}_custom_column\", '', $column_name, $tag->term_id );\n\t}\n\n\t/**\n\t * Outputs the hidden row displayed when inline editing\n\t *\n\t * @since 3.1.0\n\t */\n\tpublic function inline_edit() {\n\t\t$tax = get_taxonomy( $this->screen->taxonomy );\n\n\t\tif ( ! current_user_can( $tax->cap->edit_terms ) )\n\t\t\treturn;\n?>\n\n\t<form method=\"get\"><table style=\"display: none\"><tbody id=\"inlineedit\">\n\t\t<tr id=\"inline-edit\" class=\"inline-edit-row\" style=\"display: none\"><td colspan=\"<?php echo $this->get_column_count(); ?>\" class=\"colspanchange\">\n\n\t\t\t<fieldset>\n\t\t\t\t<legend class=\"inline-edit-legend\"><?php _e( 'Quick Edit' ); ?></legend>\n\t\t\t\t<div class=\"inline-edit-col\">\n\t\t\t\t<label>\n\t\t\t\t\t<span class=\"title\"><?php _ex( 'Name', 'term name' ); ?></span>\n\t\t\t\t\t<span class=\"input-text-wrap\"><input type=\"text\" name=\"name\" class=\"ptitle\" value=\"\" /></span>\n\t\t\t\t</label>\n\t<?php if ( !global_terms_enabled() ) { ?>\n\t\t\t\t<label>\n\t\t\t\t\t<span class=\"title\"><?php _e( 'Slug' ); ?></span>\n\t\t\t\t\t<span class=\"input-text-wrap\"><input type=\"text\" name=\"slug\" class=\"ptitle\" value=\"\" /></span>\n\t\t\t\t</label>\n\t<?php } ?>\n\t\t\t</div></fieldset>\n\t<?php\n\n\t\t$core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );\n\n\t\tlist( $columns ) = $this->get_column_info();\n\n\t\tforeach ( $columns as $column_name => $column_display_name ) {\n\t\t\tif ( isset( $core_columns[$column_name] ) )\n\t\t\t\tcontinue;\n\n\t\t\t/** This action is documented in wp-admin/includes/class-wp-posts-list-table.php */\n\t\t\tdo_action( 'quick_edit_custom_box', $column_name, 'edit-tags', $this->screen->taxonomy );\n\t\t}\n\n\t?>\n\n\t\t<p class=\"inline-edit-save submit\">\n\t\t\t<button type=\"button\" class=\"cancel button-secondary alignleft\"><?php _e( 'Cancel' ); ?></button>\n\t\t\t<button type=\"button\" class=\"save button-primary alignright\"><?php echo $tax->labels->update_item; ?></button>\n\t\t\t<span class=\"spinner\"></span>\n\t\t\t<span class=\"error\" style=\"display:none;\"></span>\n\t\t\t<?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>\n\t\t\t<input type=\"hidden\" name=\"taxonomy\" value=\"<?php echo esc_attr( $this->screen->taxonomy ); ?>\" />\n\t\t\t<input type=\"hidden\" name=\"post_type\" value=\"<?php echo esc_attr( $this->screen->post_type ); ?>\" />\n\t\t\t<br class=\"clear\" />\n\t\t</p>\n\t\t</td></tr>\n\t\t</tbody></table></form>\n\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-theme-install-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Theme_Install_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying themes to install in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_Thenes_List_Table\n */\nclass WP_Theme_Install_List_Table extends WP_Themes_List_Table {\n\n\tpublic $features = array();\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\treturn current_user_can( 'install_themes' );\n\t}\n\n\t/**\n\t *\n\t * @global array  $tabs\n\t * @global string $tab\n\t * @global int    $paged\n\t * @global string $type\n\t * @global array  $theme_field_defaults\n\t */\n\tpublic function prepare_items() {\n\t\tinclude( ABSPATH . 'wp-admin/includes/theme-install.php' );\n\n\t\tglobal $tabs, $tab, $paged, $type, $theme_field_defaults;\n\t\twp_reset_vars( array( 'tab' ) );\n\n\t\t$search_terms = array();\n\t\t$search_string = '';\n\t\tif ( ! empty( $_REQUEST['s'] ) ){\n\t\t\t$search_string = strtolower( wp_unslash( $_REQUEST['s'] ) );\n\t\t\t$search_terms = array_unique( array_filter( array_map( 'trim', explode( ',', $search_string ) ) ) );\n\t\t}\n\n\t\tif ( ! empty( $_REQUEST['features'] ) )\n\t\t\t$this->features = $_REQUEST['features'];\n\n\t\t$paged = $this->get_pagenum();\n\n\t\t$per_page = 36;\n\n\t\t// These are the tabs which are shown on the page,\n\t\t$tabs = array();\n\t\t$tabs['dashboard'] = __( 'Search' );\n\t\tif ( 'search' === $tab )\n\t\t\t$tabs['search']\t= __( 'Search Results' );\n\t\t$tabs['upload'] = __( 'Upload' );\n\t\t$tabs['featured'] = _x( 'Featured', 'themes' );\n\t\t//$tabs['popular']  = _x( 'Popular', 'themes' );\n\t\t$tabs['new']      = _x( 'Latest', 'themes' );\n\t\t$tabs['updated']  = _x( 'Recently Updated', 'themes' );\n\n\t\t$nonmenu_tabs = array( 'theme-information' ); // Valid actions to perform which do not have a Menu item.\n\n\t\t/** This filter is documented in wp-admin/theme-install.php */\n\t\t$tabs = apply_filters( 'install_themes_tabs', $tabs );\n\n\t\t/**\n\t\t * Filter tabs not associated with a menu item on the Install Themes screen.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array $nonmenu_tabs The tabs that don't have a menu item on\n\t\t *                            the Install Themes screen.\n\t\t */\n\t\t$nonmenu_tabs = apply_filters( 'install_themes_nonmenu_tabs', $nonmenu_tabs );\n\n\t\t// If a non-valid menu tab has been selected, And it's not a non-menu action.\n\t\tif ( empty( $tab ) || ( ! isset( $tabs[ $tab ] ) && ! in_array( $tab, (array) $nonmenu_tabs ) ) )\n\t\t\t$tab = key( $tabs );\n\n\t\t$args = array( 'page' => $paged, 'per_page' => $per_page, 'fields' => $theme_field_defaults );\n\n\t\tswitch ( $tab ) {\n\t\t\tcase 'search':\n\t\t\t\t$type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';\n\t\t\t\tswitch ( $type ) {\n\t\t\t\t\tcase 'tag':\n\t\t\t\t\t\t$args['tag'] = array_map( 'sanitize_key', $search_terms );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'term':\n\t\t\t\t\t\t$args['search'] = $search_string;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'author':\n\t\t\t\t\t\t$args['author'] = $search_string;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( ! empty( $this->features ) ) {\n\t\t\t\t\t$args['tag'] = $this->features;\n\t\t\t\t\t$_REQUEST['s'] = implode( ',', $this->features );\n\t\t\t\t\t$_REQUEST['type'] = 'tag';\n\t\t\t\t}\n\n\t\t\t\tadd_action( 'install_themes_table_header', 'install_theme_search_form', 10, 0 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'featured':\n\t\t\t// case 'popular':\n\t\t\tcase 'new':\n\t\t\tcase 'updated':\n\t\t\t\t$args['browse'] = $tab;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$args = false;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t/**\n\t\t * Filter API request arguments for each Install Themes screen tab.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$tab`, refers to the theme install\n\t\t * tabs. Default tabs are 'dashboard', 'search', 'upload', 'featured',\n\t\t * 'new', and 'updated'.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array $args An array of themes API arguments.\n\t\t */\n\t\t$args = apply_filters( 'install_themes_table_api_args_' . $tab, $args );\n\n\t\tif ( ! $args )\n\t\t\treturn;\n\n\t\t$api = themes_api( 'query_themes', $args );\n\n\t\tif ( is_wp_error( $api ) )\n\t\t\twp_die( $api->get_error_message() . '</p> <p><a href=\"#\" onclick=\"document.location.reload(); return false;\">' . __( 'Try again' ) . '</a>' );\n\n\t\t$this->items = $api->themes;\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $api->info['results'],\n\t\t\t'per_page' => $args['per_page'],\n\t\t\t'infinite_scroll' => true,\n\t\t) );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\t_e( 'No themes match your request.' );\n\t}\n\n\t/**\n\t *\n\t * @global array $tabs\n\t * @global string $tab\n\t * @return array\n\t */\n\tprotected function get_views() {\n\t\tglobal $tabs, $tab;\n\n\t\t$display_tabs = array();\n\t\tforeach ( (array) $tabs as $action => $text ) {\n\t\t\t$class = ( $action === $tab ) ? ' class=\"current\"' : '';\n\t\t\t$href = self_admin_url('theme-install.php?tab=' . $action);\n\t\t\t$display_tabs['theme-install-'.$action] = \"<a href='$href'$class>$text</a>\";\n\t\t}\n\n\t\treturn $display_tabs;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function display() {\n\t\twp_nonce_field( \"fetch-list-\" . get_class( $this ), '_ajax_fetch_list_nonce' );\n?>\n\t\t<div class=\"tablenav top themes\">\n\t\t\t<div class=\"alignleft actions\">\n\t\t\t\t<?php\n\t\t\t\t/**\n\t\t\t\t * Fires in the Install Themes list table header.\n\t\t\t\t *\n\t\t\t\t * @since 2.8.0\n\t\t\t\t */\n\t\t\t\tdo_action( 'install_themes_table_header' );\n\t\t\t\t?>\n\t\t\t</div>\n\t\t\t<?php $this->pagination( 'top' ); ?>\n\t\t\t<br class=\"clear\" />\n\t\t</div>\n\n\t\t<div id=\"availablethemes\">\n\t\t\t<?php $this->display_rows_or_placeholder(); ?>\n\t\t</div>\n\n\t\t<?php\n\t\t$this->tablenav( 'bottom' );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function display_rows() {\n\t\t$themes = $this->items;\n\t\tforeach ( $themes as $theme ) {\n\t\t\t\t?>\n\t\t\t\t<div class=\"available-theme installable-theme\"><?php\n\t\t\t\t\t$this->single_row( $theme );\n\t\t\t\t?></div>\n\t\t<?php } // end foreach $theme_names\n\n\t\t$this->theme_installer();\n\t}\n\n\t/**\n\t * Prints a theme from the WordPress.org API.\n\t *\n\t * @global array $themes_allowedtags\n\t *\n\t * @param object $theme An object that contains theme data returned by the WordPress.org API.\n\t *\n\t * Example theme data:\n\t *   object(stdClass)[59]\n\t *     public 'name' => string 'Magazine Basic'\n\t *     public 'slug' => string 'magazine-basic'\n\t *     public 'version' => string '1.1'\n\t *     public 'author' => string 'tinkerpriest'\n\t *     public 'preview_url' => string 'http://wp-themes.com/?magazine-basic'\n\t *     public 'screenshot_url' => string 'http://wp-themes.com/wp-content/themes/magazine-basic/screenshot.png'\n\t *     public 'rating' => float 80\n\t *     public 'num_ratings' => int 1\n\t *     public 'homepage' => string 'http://wordpress.org/themes/magazine-basic'\n\t *     public 'description' => string 'A basic magazine style layout with a fully customizable layout through a backend interface. Designed by <a href=\"http://bavotasan.com\">c.bavota</a> of <a href=\"http://tinkerpriestmedia.com\">Tinker Priest Media</a>.'\n\t *     public 'download_link' => string 'http://wordpress.org/themes/download/magazine-basic.1.1.zip'\n\t */\n\tpublic function single_row( $theme ) {\n\t\tglobal $themes_allowedtags;\n\n\t\tif ( empty( $theme ) )\n\t\t\treturn;\n\n\t\t$name   = wp_kses( $theme->name,   $themes_allowedtags );\n\t\t$author = wp_kses( $theme->author, $themes_allowedtags );\n\n\t\t$preview_title = sprintf( __('Preview &#8220;%s&#8221;'), $name );\n\t\t$preview_url   = add_query_arg( array(\n\t\t\t'tab'   => 'theme-information',\n\t\t\t'theme' => $theme->slug,\n\t\t), self_admin_url( 'theme-install.php' ) );\n\n\t\t$actions = array();\n\n\t\t$install_url = add_query_arg( array(\n\t\t\t'action' => 'install-theme',\n\t\t\t'theme'  => $theme->slug,\n\t\t), self_admin_url( 'update.php' ) );\n\n\t\t$update_url = add_query_arg( array(\n\t\t\t'action' => 'upgrade-theme',\n\t\t\t'theme'  => $theme->slug,\n\t\t), self_admin_url( 'update.php' ) );\n\n\t\t$status = $this->_get_theme_status( $theme );\n\n\t\tswitch ( $status ) {\n\t\t\tcase 'update_available':\n\t\t\t\t$actions[] = '<a class=\"install-now\" href=\"' . esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ) . '\" title=\"' . esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ) . '\">' . __( 'Update' ) . '</a>';\n\t\t\t\tbreak;\n\t\t\tcase 'newer_installed':\n\t\t\tcase 'latest_installed':\n\t\t\t\t$actions[] = '<span class=\"install-now\" title=\"' . esc_attr__( 'This theme is already installed and is up to date' ) . '\">' . _x( 'Installed', 'theme' ) . '</span>';\n\t\t\t\tbreak;\n\t\t\tcase 'install':\n\t\t\tdefault:\n\t\t\t\t$actions[] = '<a class=\"install-now\" href=\"' . esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ) . '\" title=\"' . esc_attr( sprintf( __( 'Install %s' ), $name ) ) . '\">' . __( 'Install Now' ) . '</a>';\n\t\t\t\tbreak;\n\t\t}\n\n\t\t$actions[] = '<a class=\"install-theme-preview\" href=\"' . esc_url( $preview_url ) . '\" title=\"' . esc_attr( sprintf( __( 'Preview %s' ), $name ) ) . '\">' . __( 'Preview' ) . '</a>';\n\n\t\t/**\n\t\t * Filter the install action links for a theme in the Install Themes list table.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array    $actions An array of theme action hyperlinks. Defaults are\n\t\t *                          links to Install Now, Preview, and Details.\n\t\t * @param WP_Theme $theme   Theme object.\n\t\t */\n\t\t$actions = apply_filters( 'theme_install_actions', $actions, $theme );\n\n\t\t?>\n\t\t<a class=\"screenshot install-theme-preview\" href=\"<?php echo esc_url( $preview_url ); ?>\" title=\"<?php echo esc_attr( $preview_title ); ?>\">\n\t\t\t<img src=\"<?php echo esc_url( $theme->screenshot_url ); ?>\" width=\"150\" alt=\"\" />\n\t\t</a>\n\n\t\t<h3><?php echo $name; ?></h3>\n\t\t<div class=\"theme-author\"><?php printf( __( 'By %s' ), $author ); ?></div>\n\n\t\t<div class=\"action-links\">\n\t\t\t<ul>\n\t\t\t\t<?php foreach ( $actions as $action ): ?>\n\t\t\t\t\t<li><?php echo $action; ?></li>\n\t\t\t\t<?php endforeach; ?>\n\t\t\t\t<li class=\"hide-if-no-js\"><a href=\"#\" class=\"theme-detail\"><?php _e('Details') ?></a></li>\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<?php\n\t\t$this->install_theme_info( $theme );\n\t}\n\n\t/**\n\t * Prints the wrapper for the theme installer.\n\t */\n\tpublic function theme_installer() {\n\t\t?>\n\t\t<div id=\"theme-installer\" class=\"wp-full-overlay expanded\">\n\t\t\t<div class=\"wp-full-overlay-sidebar\">\n\t\t\t\t<div class=\"wp-full-overlay-header\">\n\t\t\t\t\t<a href=\"#\" class=\"close-full-overlay button-secondary\"><?php _e( 'Close' ); ?></a>\n\t\t\t\t\t<span class=\"theme-install\"></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"wp-full-overlay-sidebar-content\">\n\t\t\t\t\t<div class=\"install-theme-info\"></div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"wp-full-overlay-footer\">\n\t\t\t\t\t<button type=\"button\" class=\"collapse-sidebar button-secondary\" aria-expanded=\"true\" aria-label=\"<?php esc_attr_e( 'Collapse Sidebar' ); ?>\">\n\t\t\t\t\t\t<span class=\"collapse-sidebar-arrow\"></span>\n\t\t\t\t\t\t<span class=\"collapse-sidebar-label\"><?php _e( 'Collapse' ); ?></span>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"wp-full-overlay-main\"></div>\n\t\t</div>\n\t\t<?php\n\t}\n\n\t/**\n\t * Prints the wrapper for the theme installer with a provided theme's data.\n\t * Used to make the theme installer work for no-js.\n\t *\n\t * @param object $theme - A WordPress.org Theme API object.\n\t */\n\tpublic function theme_installer_single( $theme ) {\n\t\t?>\n\t\t<div id=\"theme-installer\" class=\"wp-full-overlay single-theme\">\n\t\t\t<div class=\"wp-full-overlay-sidebar\">\n\t\t\t\t<?php $this->install_theme_info( $theme ); ?>\n\t\t\t</div>\n\t\t\t<div class=\"wp-full-overlay-main\">\n\t\t\t\t<iframe src=\"<?php echo esc_url( $theme->preview_url ); ?>\"></iframe>\n\t\t\t</div>\n\t\t</div>\n\t\t<?php\n\t}\n\n\t/**\n\t * Prints the info for a theme (to be used in the theme installer modal).\n\t *\n\t * @global array $themes_allowedtags\n\t *\n\t * @param object $theme - A WordPress.org Theme API object.\n\t */\n\tpublic function install_theme_info( $theme ) {\n\t\tglobal $themes_allowedtags;\n\n\t\tif ( empty( $theme ) )\n\t\t\treturn;\n\n\t\t$name   = wp_kses( $theme->name,   $themes_allowedtags );\n\t\t$author = wp_kses( $theme->author, $themes_allowedtags );\n\n\t\t$install_url = add_query_arg( array(\n\t\t\t'action' => 'install-theme',\n\t\t\t'theme'  => $theme->slug,\n\t\t), self_admin_url( 'update.php' ) );\n\n\t\t$update_url = add_query_arg( array(\n\t\t\t'action' => 'upgrade-theme',\n\t\t\t'theme'  => $theme->slug,\n\t\t), self_admin_url( 'update.php' ) );\n\n\t\t$status = $this->_get_theme_status( $theme );\n\n\t\t?>\n\t\t<div class=\"install-theme-info\"><?php\n\t\t\tswitch ( $status ) {\n\t\t\t\tcase 'update_available':\n\t\t\t\t\techo '<a class=\"theme-install button-primary\" href=\"' . esc_url( wp_nonce_url( $update_url, 'upgrade-theme_' . $theme->slug ) ) . '\" title=\"' . esc_attr( sprintf( __( 'Update to version %s' ), $theme->version ) ) . '\">' . __( 'Update' ) . '</a>';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'newer_installed':\n\t\t\t\tcase 'latest_installed':\n\t\t\t\t\techo '<span class=\"theme-install\" title=\"' . esc_attr__( 'This theme is already installed and is up to date' ) . '\">' . _x( 'Installed', 'theme' ) . '</span>';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'install':\n\t\t\t\tdefault:\n\t\t\t\t\techo '<a class=\"theme-install button-primary\" href=\"' . esc_url( wp_nonce_url( $install_url, 'install-theme_' . $theme->slug ) ) . '\">' . __( 'Install' ) . '</a>';\n\t\t\t\t\tbreak;\n\t\t\t} ?>\n\t\t\t<h3 class=\"theme-name\"><?php echo $name; ?></h3>\n\t\t\t<span class=\"theme-by\"><?php printf( __( 'By %s' ), $author ); ?></span>\n\t\t\t<?php if ( isset( $theme->screenshot_url ) ): ?>\n\t\t\t\t<img class=\"theme-screenshot\" src=\"<?php echo esc_url( $theme->screenshot_url ); ?>\" alt=\"\" />\n\t\t\t<?php endif; ?>\n\t\t\t<div class=\"theme-details\">\n\t\t\t\t<?php wp_star_rating( array( 'rating' => $theme->rating, 'type' => 'percent', 'number' => $theme->num_ratings ) ); ?>\n\t\t\t\t<div class=\"theme-version\">\n\t\t\t\t\t<strong><?php _e('Version:') ?> </strong>\n\t\t\t\t\t<?php echo wp_kses( $theme->version, $themes_allowedtags ); ?>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"theme-description\">\n\t\t\t\t\t<?php echo wp_kses( $theme->description, $themes_allowedtags ); ?>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<input class=\"theme-preview-url\" type=\"hidden\" value=\"<?php echo esc_url( $theme->preview_url ); ?>\" />\n\t\t</div>\n\t\t<?php\n\t}\n\n\t/**\n\t * Send required variables to JavaScript land\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @global string $tab  Current tab within Themes->Install screen\n\t * @global string $type Type of search.\n\t *\n\t * @param array $extra_args Unused.\n\t */\n\tpublic function _js_vars( $extra_args = array() ) {\n\t\tglobal $tab, $type;\n\t\tparent::_js_vars( compact( 'tab', 'type' ) );\n\t}\n\n\t/**\n\t * Check to see if the theme is already installed.\n\t *\n\t * @since 3.4.0\n\t * @access private\n\t *\n\t * @param object $theme - A WordPress.org Theme API object.\n\t * @return string Theme status.\n\t */\n\tprivate function _get_theme_status( $theme ) {\n\t\t$status = 'install';\n\n\t\t$installed_theme = wp_get_theme( $theme->slug );\n\t\tif ( $installed_theme->exists() ) {\n\t\t\tif ( version_compare( $installed_theme->get('Version'), $theme->version, '=' ) )\n\t\t\t\t$status = 'latest_installed';\n\t\t\telseif ( version_compare( $installed_theme->get('Version'), $theme->version, '>' ) )\n\t\t\t\t$status = 'newer_installed';\n\t\t\telse\n\t\t\t\t$status = 'update_available';\n\t\t}\n\n\t\treturn $status;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-themes-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Themes_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying installed themes in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_Themes_List_Table extends WP_List_Table {\n\n\tprotected $search_terms = array();\n\tpublic $features = array();\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\tparent::__construct( array(\n\t\t\t'ajax' => true,\n\t\t\t'screen' => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\t}\n\n\t/**\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\t// Do not check edit_theme_options here. AJAX calls for available themes require switch_themes.\n\t\treturn current_user_can( 'switch_themes' );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function prepare_items() {\n\t\t$themes = wp_get_themes( array( 'allowed' => true ) );\n\n\t\tif ( ! empty( $_REQUEST['s'] ) )\n\t\t\t$this->search_terms = array_unique( array_filter( array_map( 'trim', explode( ',', strtolower( wp_unslash( $_REQUEST['s'] ) ) ) ) ) );\n\n\t\tif ( ! empty( $_REQUEST['features'] ) )\n\t\t\t$this->features = $_REQUEST['features'];\n\n\t\tif ( $this->search_terms || $this->features ) {\n\t\t\tforeach ( $themes as $key => $theme ) {\n\t\t\t\tif ( ! $this->search_theme( $theme ) )\n\t\t\t\t\tunset( $themes[ $key ] );\n\t\t\t}\n\t\t}\n\n\t\tunset( $themes[ get_option( 'stylesheet' ) ] );\n\t\tWP_Theme::sort_by_name( $themes );\n\n\t\t$per_page = 36;\n\t\t$page = $this->get_pagenum();\n\n\t\t$start = ( $page - 1 ) * $per_page;\n\n\t\t$this->items = array_slice( $themes, $start, $per_page, true );\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => count( $themes ),\n\t\t\t'per_page' => $per_page,\n\t\t\t'infinite_scroll' => true,\n\t\t) );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\tif ( $this->search_terms || $this->features ) {\n\t\t\t_e( 'No items found.' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( is_multisite() ) {\n\t\t\tif ( current_user_can( 'install_themes' ) && current_user_can( 'manage_network_themes' ) ) {\n\t\t\t\tprintf( __( 'You only have one theme enabled for this site right now. Visit the Network Admin to <a href=\"%1$s\">enable</a> or <a href=\"%2$s\">install</a> more themes.' ), network_admin_url( 'site-themes.php?id=' . $GLOBALS['blog_id'] ), network_admin_url( 'theme-install.php' ) );\n\n\t\t\t\treturn;\n\t\t\t} elseif ( current_user_can( 'manage_network_themes' ) ) {\n\t\t\t\tprintf( __( 'You only have one theme enabled for this site right now. Visit the Network Admin to <a href=\"%1$s\">enable</a> more themes.' ), network_admin_url( 'site-themes.php?id=' . $GLOBALS['blog_id'] ) );\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Else, fallthrough. install_themes doesn't help if you can't enable it.\n\t\t} else {\n\t\t\tif ( current_user_can( 'install_themes' ) ) {\n\t\t\t\tprintf( __( 'You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <a href=\"%s\">Install Themes</a> tab above.' ), admin_url( 'theme-install.php' ) );\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// Fallthrough.\n\t\tprintf( __( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option( 'site_name' ) );\n\t}\n\n\t/**\n\t * @param string $which\n\t */\n\tpublic function tablenav( $which = 'top' ) {\n\t\tif ( $this->get_pagination_arg( 'total_pages' ) <= 1 )\n\t\t\treturn;\n\t\t?>\n\t\t<div class=\"tablenav themes <?php echo $which; ?>\">\n\t\t\t<?php $this->pagination( $which ); ?>\n\t\t\t<span class=\"spinner\"></span>\n\t\t\t<br class=\"clear\" />\n\t\t</div>\n\t\t<?php\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function display() {\n\t\twp_nonce_field( \"fetch-list-\" . get_class( $this ), '_ajax_fetch_list_nonce' );\n?>\n\t\t<?php $this->tablenav( 'top' ); ?>\n\n\t\t<div id=\"availablethemes\">\n\t\t\t<?php $this->display_rows_or_placeholder(); ?>\n\t\t</div>\n\n\t\t<?php $this->tablenav( 'bottom' ); ?>\n<?php\n\t}\n\n\t/**\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\treturn array();\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function display_rows_or_placeholder() {\n\t\tif ( $this->has_items() ) {\n\t\t\t$this->display_rows();\n\t\t} else {\n\t\t\techo '<div class=\"no-items\">';\n\t\t\t$this->no_items();\n\t\t\techo '</div>';\n\t\t}\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function display_rows() {\n\t\t$themes = $this->items;\n\n\t\tforeach ( $themes as $theme ):\n\t\t\t?><div class=\"available-theme\"><?php\n\n\t\t\t$template   = $theme->get_template();\n\t\t\t$stylesheet = $theme->get_stylesheet();\n\t\t\t$title      = $theme->display('Name');\n\t\t\t$version    = $theme->display('Version');\n\t\t\t$author     = $theme->display('Author');\n\n\t\t\t$activate_link = wp_nonce_url( \"themes.php?action=activate&amp;template=\" . urlencode( $template ) . \"&amp;stylesheet=\" . urlencode( $stylesheet ), 'switch-theme_' . $stylesheet );\n\n\t\t\t$actions = array();\n\t\t\t$actions['activate'] = '<a href=\"' . $activate_link . '\" class=\"activatelink\" title=\"'\n\t\t\t\t. esc_attr( sprintf( __( 'Activate &#8220;%s&#8221;' ), $title ) ) . '\">' . __( 'Activate' ) . '</a>';\n\n\t\t\tif ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {\n\t\t\t\t$actions['preview'] .= '<a href=\"' . wp_customize_url( $stylesheet ) . '\" class=\"load-customize hide-if-no-customize\">'\n\t\t\t\t\t. __( 'Live Preview' ) . '</a>';\n\t\t\t}\n\n\t\t\tif ( ! is_multisite() && current_user_can( 'delete_themes' ) )\n\t\t\t\t$actions['delete'] = '<a class=\"submitdelete deletion\" href=\"' . wp_nonce_url( 'themes.php?action=delete&amp;stylesheet=' . urlencode( $stylesheet ), 'delete-theme_' . $stylesheet )\n\t\t\t\t\t. '\" onclick=\"' . \"return confirm( '\" . esc_js( sprintf( __( \"You are about to delete this theme '%s'\\n  'Cancel' to stop, 'OK' to delete.\" ), $title ) )\n\t\t\t\t\t. \"' );\" . '\">' . __( 'Delete' ) . '</a>';\n\n\t\t\t/** This filter is documented in wp-admin/includes/class-wp-ms-themes-list-table.php */\n\t\t\t$actions       = apply_filters( 'theme_action_links', $actions, $theme );\n\n\t\t\t/** This filter is documented in wp-admin/includes/class-wp-ms-themes-list-table.php */\n\t\t\t$actions       = apply_filters( \"theme_action_links_$stylesheet\", $actions, $theme );\n\t\t\t$delete_action = isset( $actions['delete'] ) ? '<div class=\"delete-theme\">' . $actions['delete'] . '</div>' : '';\n\t\t\tunset( $actions['delete'] );\n\n\t\t\t?>\n\n\t\t\t<span class=\"screenshot hide-if-customize\">\n\t\t\t\t<?php if ( $screenshot = $theme->get_screenshot() ) : ?>\n\t\t\t\t\t<img src=\"<?php echo esc_url( $screenshot ); ?>\" alt=\"\" />\n\t\t\t\t<?php endif; ?>\n\t\t\t</span>\n\t\t\t<a href=\"<?php echo wp_customize_url( $stylesheet ); ?>\" class=\"screenshot load-customize hide-if-no-customize\">\n\t\t\t\t<?php if ( $screenshot = $theme->get_screenshot() ) : ?>\n\t\t\t\t\t<img src=\"<?php echo esc_url( $screenshot ); ?>\" alt=\"\" />\n\t\t\t\t<?php endif; ?>\n\t\t\t</a>\n\n\t\t\t<h3><?php echo $title; ?></h3>\n\t\t\t<div class=\"theme-author\"><?php printf( __( 'By %s' ), $author ); ?></div>\n\t\t\t<div class=\"action-links\">\n\t\t\t\t<ul>\n\t\t\t\t\t<?php foreach ( $actions as $action ): ?>\n\t\t\t\t\t\t<li><?php echo $action; ?></li>\n\t\t\t\t\t<?php endforeach; ?>\n\t\t\t\t\t<li class=\"hide-if-no-js\"><a href=\"#\" class=\"theme-detail\"><?php _e('Details') ?></a></li>\n\t\t\t\t</ul>\n\t\t\t\t<?php echo $delete_action; ?>\n\n\t\t\t\t<?php theme_update_available( $theme ); ?>\n\t\t\t</div>\n\n\t\t\t<div class=\"themedetaildiv hide-if-js\">\n\t\t\t\t<p><strong><?php _e('Version:'); ?></strong> <?php echo $version; ?></p>\n\t\t\t\t<p><?php echo $theme->display('Description'); ?></p>\n\t\t\t\t<?php if ( $theme->parent() ) {\n\t\t\t\t\tprintf( ' <p class=\"howto\">' . __( 'This <a href=\"%1$s\">child theme</a> requires its parent theme, %2$s.' ) . '</p>',\n\t\t\t\t\t\t__( 'https://codex.wordpress.org/Child_Themes' ),\n\t\t\t\t\t\t$theme->parent()->display( 'Name' ) );\n\t\t\t\t} ?>\n\t\t\t</div>\n\n\t\t\t</div>\n\t\t<?php\n\t\tendforeach;\n\t}\n\n\t/**\n\t * @param WP_Theme $theme\n\t * @return bool\n\t */\n\tpublic function search_theme( $theme ) {\n\t\t// Search the features\n\t\tforeach ( $this->features as $word ) {\n\t\t\tif ( ! in_array( $word, $theme->get('Tags') ) )\n\t\t\t\treturn false;\n\t\t}\n\n\t\t// Match all phrases\n\t\tforeach ( $this->search_terms as $word ) {\n\t\t\tif ( in_array( $word, $theme->get('Tags') ) )\n\t\t\t\tcontinue;\n\n\t\t\tforeach ( array( 'Name', 'Description', 'Author', 'AuthorURI' ) as $header ) {\n\t\t\t\t// Don't mark up; Do translate.\n\t\t\t\tif ( false !== stripos( strip_tags( $theme->display( $header, false, true ) ), $word ) ) {\n\t\t\t\t\tcontinue 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( false !== stripos( $theme->get_stylesheet(), $word ) )\n\t\t\t\tcontinue;\n\n\t\t\tif ( false !== stripos( $theme->get_template(), $word ) )\n\t\t\t\tcontinue;\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Send required variables to JavaScript land\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param array $extra_args\n\t */\n\tpublic function _js_vars( $extra_args = array() ) {\n\t\t$search_string = isset( $_REQUEST['s'] ) ? esc_attr( wp_unslash( $_REQUEST['s'] ) ) : '';\n\n\t\t$args = array(\n\t\t\t'search' => $search_string,\n\t\t\t'features' => $this->features,\n\t\t\t'paged' => $this->get_pagenum(),\n\t\t\t'total_pages' => ! empty( $this->_pagination_args['total_pages'] ) ? $this->_pagination_args['total_pages'] : 1,\n\t\t);\n\n\t\tif ( is_array( $extra_args ) )\n\t\t\t$args = array_merge( $args, $extra_args );\n\n\t\tprintf( \"<script type='text/javascript'>var theme_list_args = %s;</script>\\n\", wp_json_encode( $args ) );\n\t\tparent::_js_vars();\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-upgrader-skins.php",
    "content": "<?php\n/**\n * The User Interface \"Skins\" for the WordPress File Upgrader\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 2.8.0\n */\n\n/**\n * Generic Skin for the WordPress Upgrader classes. This skin is designed to be extended for specific purposes.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 2.8.0\n */\nclass WP_Upgrader_Skin {\n\n\tpublic $upgrader;\n\tpublic $done_header = false;\n\tpublic $done_footer = false;\n\tpublic $result = false;\n\tpublic $options = array();\n\n\t/**\n\t *\n\t * @param array $args\n\t */\n\tpublic function __construct($args = array()) {\n\t\t$defaults = array( 'url' => '', 'nonce' => '', 'title' => '', 'context' => false );\n\t\t$this->options = wp_parse_args($args, $defaults);\n\t}\n\n\t/**\n\t * @param WP_Upgrader $upgrader\n\t */\n\tpublic function set_upgrader(&$upgrader) {\n\t\tif ( is_object($upgrader) )\n\t\t\t$this->upgrader =& $upgrader;\n\t\t$this->add_strings();\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function add_strings() {\n\t}\n\n\t/**\n\t *\n\t * @param string|false|WP_Error $result\n\t */\n\tpublic function set_result($result) {\n\t\t$this->result = $result;\n\t}\n\n\t/**\n\t *\n\t * @param bool   $error\n\t * @param string $context\n\t * @param bool   $allow_relaxed_file_ownership\n\t * @return type\n\t */\n\tpublic function request_filesystem_credentials( $error = false, $context = false, $allow_relaxed_file_ownership = false ) {\n\t\t$url = $this->options['url'];\n\t\tif ( ! $context ) {\n\t\t\t$context = $this->options['context'];\n\t\t}\n\t\tif ( !empty($this->options['nonce']) ) {\n\t\t\t$url = wp_nonce_url($url, $this->options['nonce']);\n\t\t}\n\n\t\t$extra_fields = array();\n\n\t\treturn request_filesystem_credentials( $url, '', $error, $context, $extra_fields, $allow_relaxed_file_ownership );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function header() {\n\t\tif ( $this->done_header ) {\n\t\t\treturn;\n\t\t}\n\t\t$this->done_header = true;\n\t\techo '<div class=\"wrap\">';\n\t\techo '<h1>' . $this->options['title'] . '</h1>';\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function footer() {\n\t\tif ( $this->done_footer ) {\n\t\t\treturn;\n\t\t}\n\t\t$this->done_footer = true;\n\t\techo '</div>';\n\t}\n\n\t/**\n\t *\n\t * @param string|WP_Error $errors\n\t */\n\tpublic function error($errors) {\n\t\tif ( ! $this->done_header )\n\t\t\t$this->header();\n\t\tif ( is_string($errors) ) {\n\t\t\t$this->feedback($errors);\n\t\t} elseif ( is_wp_error($errors) && $errors->get_error_code() ) {\n\t\t\tforeach ( $errors->get_error_messages() as $message ) {\n\t\t\t\tif ( $errors->get_error_data() && is_string( $errors->get_error_data() ) )\n\t\t\t\t\t$this->feedback($message . ' ' . esc_html( strip_tags( $errors->get_error_data() ) ) );\n\t\t\t\telse\n\t\t\t\t\t$this->feedback($message);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param string $string\n\t */\n\tpublic function feedback($string) {\n\t\tif ( isset( $this->upgrader->strings[$string] ) )\n\t\t\t$string = $this->upgrader->strings[$string];\n\n\t\tif ( strpos($string, '%') !== false ) {\n\t\t\t$args = func_get_args();\n\t\t\t$args = array_splice($args, 1);\n\t\t\tif ( $args ) {\n\t\t\t\t$args = array_map( 'strip_tags', $args );\n\t\t\t\t$args = array_map( 'esc_html', $args );\n\t\t\t\t$string = vsprintf($string, $args);\n\t\t\t}\n\t\t}\n\t\tif ( empty($string) )\n\t\t\treturn;\n\t\tshow_message($string);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function before() {}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function after() {}\n\n\t/**\n\t * Output JavaScript that calls function to decrement the update counts.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param string $type Type of update count to decrement. Likely values include 'plugin',\n\t *                     'theme', 'translation', etc.\n\t */\n\tprotected function decrement_update_count( $type ) {\n\t\tif ( ! $this->result || is_wp_error( $this->result ) || 'up_to_date' === $this->result ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( defined( 'IFRAME_REQUEST' ) ) {\n\t\t\techo '<script type=\"text/javascript\">\n\t\t\t\t\tif ( window.postMessage && JSON ) {\n\t\t\t\t\t\twindow.parent.postMessage( JSON.stringify( { action: \"decrementUpdateCount\", upgradeType: \"' . $type . '\" } ), window.location.protocol + \"//\" + window.location.hostname );\n\t\t\t\t\t}\n\t\t\t\t</script>';\n\t\t} else {\n\t\t\techo '<script type=\"text/javascript\">\n\t\t\t\t\t(function( wp ) {\n\t\t\t\t\t\tif ( wp && wp.updates.decrementCount ) {\n\t\t\t\t\t\t\twp.updates.decrementCount( \"' . $type . '\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t})( window.wp );\n\t\t\t\t</script>';\n\t\t}\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function bulk_header() {}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function bulk_footer() {}\n}\n\n/**\n * Plugin Upgrader Skin for WordPress Plugin Upgrades.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 2.8.0\n */\nclass Plugin_Upgrader_Skin extends WP_Upgrader_Skin {\n\tpublic $plugin = '';\n\tpublic $plugin_active = false;\n\tpublic $plugin_network_active = false;\n\n\t/**\n\t *\n\t * @param array $args\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\t$defaults = array( 'url' => '', 'plugin' => '', 'nonce' => '', 'title' => __('Update Plugin') );\n\t\t$args = wp_parse_args($args, $defaults);\n\n\t\t$this->plugin = $args['plugin'];\n\n\t\t$this->plugin_active = is_plugin_active( $this->plugin );\n\t\t$this->plugin_network_active = is_plugin_active_for_network( $this->plugin );\n\n\t\tparent::__construct($args);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function after() {\n\t\t$this->plugin = $this->upgrader->plugin_info();\n\t\tif ( !empty($this->plugin) && !is_wp_error($this->result) && $this->plugin_active ){\n\t\t\techo '<iframe style=\"border:0;overflow:hidden\" width=\"100%\" height=\"170px\" src=\"' . wp_nonce_url('update.php?action=activate-plugin&networkwide=' . $this->plugin_network_active . '&plugin=' . urlencode( $this->plugin ), 'activate-plugin_' . $this->plugin) .'\"></iframe>';\n\t\t}\n\n\t\t$this->decrement_update_count( 'plugin' );\n\n\t\t$update_actions =  array(\n\t\t\t'activate_plugin' => '<a href=\"' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $this->plugin ), 'activate-plugin_' . $this->plugin) . '\" target=\"_parent\">' . __( 'Activate Plugin' ) . '</a>',\n\t\t\t'plugins_page' => '<a href=\"' . self_admin_url( 'plugins.php' ) . '\" target=\"_parent\">' . __( 'Return to Plugins page' ) . '</a>'\n\t\t);\n\t\tif ( $this->plugin_active || ! $this->result || is_wp_error( $this->result ) || ! current_user_can( 'activate_plugins' ) )\n\t\t\tunset( $update_actions['activate_plugin'] );\n\n\t\t/**\n\t\t * Filter the list of action links available following a single plugin update.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array  $update_actions Array of plugin action links.\n\t\t * @param string $plugin         Path to the plugin file.\n\t\t */\n\t\t$update_actions = apply_filters( 'update_plugin_complete_actions', $update_actions, $this->plugin );\n\n\t\tif ( ! empty($update_actions) )\n\t\t\t$this->feedback(implode(' | ', (array)$update_actions));\n\t}\n}\n\n/**\n * Plugin Upgrader Skin for WordPress Plugin Upgrades.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 3.0.0\n */\nclass Bulk_Upgrader_Skin extends WP_Upgrader_Skin {\n\tpublic $in_loop = false;\n\t/**\n\t * @var string|false\n\t */\n\tpublic $error = false;\n\n\t/**\n\t *\n\t * @param array $args\n\t */\n\tpublic function __construct($args = array()) {\n\t\t$defaults = array( 'url' => '', 'nonce' => '' );\n\t\t$args = wp_parse_args($args, $defaults);\n\n\t\tparent::__construct($args);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function add_strings() {\n\t\t$this->upgrader->strings['skin_upgrade_start'] = __('The update process is starting. This process may take a while on some hosts, so please be patient.');\n\t\t/* translators: 1: Title of an update, 2: Error message */\n\t\t$this->upgrader->strings['skin_update_failed_error'] = __('An error occurred while updating %1$s: %2$s');\n\t\t/* translators: 1: Title of an update */\n\t\t$this->upgrader->strings['skin_update_failed'] = __('The update of %1$s failed.');\n\t\t/* translators: 1: Title of an update */\n\t\t$this->upgrader->strings['skin_update_successful'] = __( '%1$s updated successfully.' ) . ' <a onclick=\"%2$s\" href=\"#\" class=\"hide-if-no-js\"><span>' . __( 'Show Details' ) . '</span><span class=\"hidden\">' . __( 'Hide Details' ) . '</span></a>';\n\t\t$this->upgrader->strings['skin_upgrade_end'] = __('All updates have been completed.');\n\t}\n\n\t/**\n\t * @param string $string\n\t */\n\tpublic function feedback($string) {\n\t\tif ( isset( $this->upgrader->strings[$string] ) )\n\t\t\t$string = $this->upgrader->strings[$string];\n\n\t\tif ( strpos($string, '%') !== false ) {\n\t\t\t$args = func_get_args();\n\t\t\t$args = array_splice($args, 1);\n\t\t\tif ( $args ) {\n\t\t\t\t$args = array_map( 'strip_tags', $args );\n\t\t\t\t$args = array_map( 'esc_html', $args );\n\t\t\t\t$string = vsprintf($string, $args);\n\t\t\t}\n\t\t}\n\t\tif ( empty($string) )\n\t\t\treturn;\n\t\tif ( $this->in_loop )\n\t\t\techo \"$string<br />\\n\";\n\t\telse\n\t\t\techo \"<p>$string</p>\\n\";\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function header() {\n\t\t// Nothing, This will be displayed within a iframe.\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function footer() {\n\t\t// Nothing, This will be displayed within a iframe.\n\t}\n\n\t/**\n\t *\n\t * @param string|WP_Error $error\n\t */\n\tpublic function error($error) {\n\t\tif ( is_string($error) && isset( $this->upgrader->strings[$error] ) )\n\t\t\t$this->error = $this->upgrader->strings[$error];\n\n\t\tif ( is_wp_error($error) ) {\n\t\t\t$messages = array();\n\t\t\tforeach ( $error->get_error_messages() as $emessage ) {\n\t\t\t\tif ( $error->get_error_data() && is_string( $error->get_error_data() ) )\n\t\t\t\t\t$messages[] = $emessage . ' ' . esc_html( strip_tags( $error->get_error_data() ) );\n\t\t\t\telse\n\t\t\t\t\t$messages[] = $emessage;\n\t\t\t}\n\t\t\t$this->error = implode(', ', $messages);\n\t\t}\n\t\techo '<script type=\"text/javascript\">jQuery(\\'.waiting-' . esc_js($this->upgrader->update_current) . '\\').hide();</script>';\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function bulk_header() {\n\t\t$this->feedback('skin_upgrade_start');\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function bulk_footer() {\n\t\t$this->feedback('skin_upgrade_end');\n\t}\n\n\t/**\n\t *\n\t * @param string $title\n\t */\n\tpublic function before($title = '') {\n\t\t$this->in_loop = true;\n\t\tprintf( '<h2>' . $this->upgrader->strings['skin_before_update_header'] . ' <span class=\"spinner waiting-' . $this->upgrader->update_current . '\"></span></h2>', $title, $this->upgrader->update_current, $this->upgrader->update_count );\n\t\techo '<script type=\"text/javascript\">jQuery(\\'.waiting-' . esc_js($this->upgrader->update_current) . '\\').css(\"display\", \"inline-block\");</script>';\n\t\techo '<div class=\"update-messages hide-if-js\" id=\"progress-' . esc_attr($this->upgrader->update_current) . '\"><p>';\n\t\t$this->flush_output();\n\t}\n\n\t/**\n\t *\n\t * @param string $title\n\t */\n\tpublic function after($title = '') {\n\t\techo '</p></div>';\n\t\tif ( $this->error || ! $this->result ) {\n\t\t\tif ( $this->error ) {\n\t\t\t\techo '<div class=\"error\"><p>' . sprintf($this->upgrader->strings['skin_update_failed_error'], $title, '<strong>' . $this->error . '</strong>' ) . '</p></div>';\n\t\t\t} else {\n\t\t\t\techo '<div class=\"error\"><p>' . sprintf($this->upgrader->strings['skin_update_failed'], $title) . '</p></div>';\n\t\t\t}\n\n\t\t\techo '<script type=\"text/javascript\">jQuery(\\'#progress-' . esc_js($this->upgrader->update_current) . '\\').show();</script>';\n\t\t}\n\t\tif ( $this->result && ! is_wp_error( $this->result ) ) {\n\t\t\tif ( ! $this->error )\n\t\t\t\techo '<div class=\"updated\"><p>' . sprintf($this->upgrader->strings['skin_update_successful'], $title, 'jQuery(\\'#progress-' . esc_js($this->upgrader->update_current) . '\\').toggle();jQuery(\\'span\\', this).toggle(); return false;') . '</p></div>';\n\t\t\techo '<script type=\"text/javascript\">jQuery(\\'.waiting-' . esc_js($this->upgrader->update_current) . '\\').hide();</script>';\n\t\t}\n\n\t\t$this->reset();\n\t\t$this->flush_output();\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function reset() {\n\t\t$this->in_loop = false;\n\t\t$this->error = false;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function flush_output() {\n\t\twp_ob_end_flush_all();\n\t\tflush();\n\t}\n}\n\nclass Bulk_Plugin_Upgrader_Skin extends Bulk_Upgrader_Skin {\n\tpublic $plugin_info = array(); // Plugin_Upgrader::bulk() will fill this in.\n\n\tpublic function add_strings() {\n\t\tparent::add_strings();\n\t\t$this->upgrader->strings['skin_before_update_header'] = __('Updating Plugin %1$s (%2$d/%3$d)');\n\t}\n\n\t/**\n\t *\n\t * @param string $title\n\t */\n\tpublic function before($title = '') {\n\t\tparent::before($this->plugin_info['Title']);\n\t}\n\n\t/**\n\t *\n\t * @param string $title\n\t */\n\tpublic function after($title = '') {\n\t\tparent::after($this->plugin_info['Title']);\n\t\t$this->decrement_update_count( 'plugin' );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function bulk_footer() {\n\t\tparent::bulk_footer();\n\t\t$update_actions =  array(\n\t\t\t'plugins_page' => '<a href=\"' . self_admin_url( 'plugins.php' ) . '\" target=\"_parent\">' . __( 'Return to Plugins page' ) . '</a>',\n\t\t\t'updates_page' => '<a href=\"' . self_admin_url( 'update-core.php' ) . '\" target=\"_parent\">' . __( 'Return to WordPress Updates page' ) . '</a>'\n\t\t);\n\t\tif ( ! current_user_can( 'activate_plugins' ) )\n\t\t\tunset( $update_actions['plugins_page'] );\n\n\t\t/**\n\t\t * Filter the list of action links available following bulk plugin updates.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $update_actions Array of plugin action links.\n\t\t * @param array $plugin_info    Array of information for the last-updated plugin.\n\t\t */\n\t\t$update_actions = apply_filters( 'update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info );\n\n\t\tif ( ! empty($update_actions) )\n\t\t\t$this->feedback(implode(' | ', (array)$update_actions));\n\t}\n}\n\nclass Bulk_Theme_Upgrader_Skin extends Bulk_Upgrader_Skin {\n\tpublic $theme_info = array(); // Theme_Upgrader::bulk() will fill this in.\n\n\tpublic function add_strings() {\n\t\tparent::add_strings();\n\t\t$this->upgrader->strings['skin_before_update_header'] = __('Updating Theme %1$s (%2$d/%3$d)');\n\t}\n\n\t/**\n\t *\n\t * @param string $title\n\t */\n\tpublic function before($title = '') {\n\t\tparent::before( $this->theme_info->display('Name') );\n\t}\n\n\t/**\n\t *\n\t * @param string $title\n\t */\n\tpublic function after($title = '') {\n\t\tparent::after( $this->theme_info->display('Name') );\n\t\t$this->decrement_update_count( 'theme' );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function bulk_footer() {\n\t\tparent::bulk_footer();\n\t\t$update_actions =  array(\n\t\t\t'themes_page' => '<a href=\"' . self_admin_url( 'themes.php' ) . '\" target=\"_parent\">' . __( 'Return to Themes page' ) . '</a>',\n\t\t\t'updates_page' => '<a href=\"' . self_admin_url( 'update-core.php' ) . '\" target=\"_parent\">' . __( 'Return to WordPress Updates page' ) . '</a>'\n\t\t);\n\t\tif ( ! current_user_can( 'switch_themes' ) && ! current_user_can( 'edit_theme_options' ) )\n\t\t\tunset( $update_actions['themes_page'] );\n\n\t\t/**\n\t\t * Filter the list of action links available following bulk theme updates.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $update_actions Array of theme action links.\n\t\t * @param array $theme_info     Array of information for the last-updated theme.\n\t\t */\n\t\t$update_actions = apply_filters( 'update_bulk_theme_complete_actions', $update_actions, $this->theme_info );\n\n\t\tif ( ! empty($update_actions) )\n\t\t\t$this->feedback(implode(' | ', (array)$update_actions));\n\t}\n}\n\n/**\n * Plugin Installer Skin for WordPress Plugin Installer.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 2.8.0\n */\nclass Plugin_Installer_Skin extends WP_Upgrader_Skin {\n\tpublic $api;\n\tpublic $type;\n\n\t/**\n\t *\n\t * @param array $args\n\t */\n\tpublic function __construct($args = array()) {\n\t\t$defaults = array( 'type' => 'web', 'url' => '', 'plugin' => '', 'nonce' => '', 'title' => '' );\n\t\t$args = wp_parse_args($args, $defaults);\n\n\t\t$this->type = $args['type'];\n\t\t$this->api = isset($args['api']) ? $args['api'] : array();\n\n\t\tparent::__construct($args);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function before() {\n\t\tif ( !empty($this->api) )\n\t\t\t$this->upgrader->strings['process_success'] = sprintf( __('Successfully installed the plugin <strong>%s %s</strong>.'), $this->api->name, $this->api->version);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function after() {\n\t\t$plugin_file = $this->upgrader->plugin_info();\n\n\t\t$install_actions = array();\n\n\t\t$from = isset($_GET['from']) ? wp_unslash( $_GET['from'] ) : 'plugins';\n\n\t\tif ( 'import' == $from )\n\t\t\t$install_actions['activate_plugin'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=activate&amp;from=import&amp;plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ) . '\" target=\"_parent\">' . __( 'Activate Plugin &amp; Run Importer' ) . '</a>';\n\t\telse\n\t\t\t$install_actions['activate_plugin'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=activate&amp;plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ) . '\" target=\"_parent\">' . __( 'Activate Plugin' ) . '</a>';\n\n\t\tif ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) {\n\t\t\t$install_actions['network_activate'] = '<a href=\"' . wp_nonce_url( 'plugins.php?action=activate&amp;networkwide=1&amp;plugin=' . urlencode( $plugin_file ), 'activate-plugin_' . $plugin_file ) . '\" target=\"_parent\">' . __( 'Network Activate' ) . '</a>';\n\t\t\tunset( $install_actions['activate_plugin'] );\n\t\t}\n\n\t\tif ( 'import' == $from ) {\n\t\t\t$install_actions['importers_page'] = '<a href=\"' . admin_url( 'import.php' ) . '\" target=\"_parent\">' . __( 'Return to Importers' ) . '</a>';\n\t\t} elseif ( $this->type == 'web' ) {\n\t\t\t$install_actions['plugins_page'] = '<a href=\"' . self_admin_url( 'plugin-install.php' ) . '\" target=\"_parent\">' . __( 'Return to Plugin Installer' ) . '</a>';\n\t\t} else {\n\t\t\t$install_actions['plugins_page'] = '<a href=\"' . self_admin_url( 'plugins.php' ) . '\" target=\"_parent\">' . __( 'Return to Plugins page' ) . '</a>';\n\t\t}\n\n\t\tif ( ! $this->result || is_wp_error($this->result) ) {\n\t\t\tunset( $install_actions['activate_plugin'], $install_actions['network_activate'] );\n\t\t} elseif ( ! current_user_can( 'activate_plugins' ) ) {\n\t\t\tunset( $install_actions['activate_plugin'] );\n\t\t}\n\n\t\t/**\n\t\t * Filter the list of action links available following a single plugin installation.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array  $install_actions Array of plugin action links.\n\t\t * @param object $api             Object containing WordPress.org API plugin data. Empty\n\t\t *                                for non-API installs, such as when a plugin is installed\n\t\t *                                via upload.\n\t\t * @param string $plugin_file     Path to the plugin file.\n\t\t */\n\t\t$install_actions = apply_filters( 'install_plugin_complete_actions', $install_actions, $this->api, $plugin_file );\n\n\t\tif ( ! empty($install_actions) )\n\t\t\t$this->feedback(implode(' | ', (array)$install_actions));\n\t}\n}\n\n/**\n * Theme Installer Skin for the WordPress Theme Installer.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 2.8.0\n */\nclass Theme_Installer_Skin extends WP_Upgrader_Skin {\n\tpublic $api;\n\tpublic $type;\n\n\t/**\n\t *\n\t * @param array $args\n\t */\n\tpublic function __construct($args = array()) {\n\t\t$defaults = array( 'type' => 'web', 'url' => '', 'theme' => '', 'nonce' => '', 'title' => '' );\n\t\t$args = wp_parse_args($args, $defaults);\n\n\t\t$this->type = $args['type'];\n\t\t$this->api = isset($args['api']) ? $args['api'] : array();\n\n\t\tparent::__construct($args);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function before() {\n\t\tif ( !empty($this->api) )\n\t\t\t$this->upgrader->strings['process_success'] = sprintf( $this->upgrader->strings['process_success_specific'], $this->api->name, $this->api->version);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function after() {\n\t\tif ( empty($this->upgrader->result['destination_name']) )\n\t\t\treturn;\n\n\t\t$theme_info = $this->upgrader->theme_info();\n\t\tif ( empty( $theme_info ) )\n\t\t\treturn;\n\n\t\t$name       = $theme_info->display('Name');\n\t\t$stylesheet = $this->upgrader->result['destination_name'];\n\t\t$template   = $theme_info->get_template();\n\n\t\t$activate_link = add_query_arg( array(\n\t\t\t'action'     => 'activate',\n\t\t\t'template'   => urlencode( $template ),\n\t\t\t'stylesheet' => urlencode( $stylesheet ),\n\t\t), admin_url('themes.php') );\n\t\t$activate_link = wp_nonce_url( $activate_link, 'switch-theme_' . $stylesheet );\n\n\t\t$install_actions = array();\n\n\t\tif ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {\n\t\t\t$install_actions['preview'] = '<a href=\"' . wp_customize_url( $stylesheet ) . '\" class=\"hide-if-no-customize load-customize\"><span aria-hidden=\"true\">' . __( 'Live Preview' ) . '</span><span class=\"screen-reader-text\">' . sprintf( __( 'Live Preview &#8220;%s&#8221;' ), $name ) . '</span></a>';\n\t\t}\n\t\t$install_actions['activate'] = '<a href=\"' . esc_url( $activate_link ) . '\" class=\"activatelink\"><span aria-hidden=\"true\">' . __( 'Activate' ) . '</span><span class=\"screen-reader-text\">' . sprintf( __( 'Activate &#8220;%s&#8221;' ), $name ) . '</span></a>';\n\n\t\tif ( is_network_admin() && current_user_can( 'manage_network_themes' ) )\n\t\t\t$install_actions['network_enable'] = '<a href=\"' . esc_url( wp_nonce_url( 'themes.php?action=enable&amp;theme=' . urlencode( $stylesheet ), 'enable-theme_' . $stylesheet ) ) . '\" target=\"_parent\">' . __( 'Network Enable' ) . '</a>';\n\n\t\tif ( $this->type == 'web' )\n\t\t\t$install_actions['themes_page'] = '<a href=\"' . self_admin_url( 'theme-install.php' ) . '\" target=\"_parent\">' . __( 'Return to Theme Installer' ) . '</a>';\n\t\telseif ( current_user_can( 'switch_themes' ) || current_user_can( 'edit_theme_options' ) )\n\t\t\t$install_actions['themes_page'] = '<a href=\"' . self_admin_url( 'themes.php' ) . '\" target=\"_parent\">' . __( 'Return to Themes page' ) . '</a>';\n\n\t\tif ( ! $this->result || is_wp_error($this->result) || is_network_admin() || ! current_user_can( 'switch_themes' ) )\n\t\t\tunset( $install_actions['activate'], $install_actions['preview'] );\n\n\t\t/**\n\t\t * Filter the list of action links available following a single theme installation.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array    $install_actions Array of theme action links.\n\t\t * @param object   $api             Object containing WordPress.org API theme data.\n\t\t * @param string   $stylesheet      Theme directory name.\n\t\t * @param WP_Theme $theme_info      Theme object.\n\t\t */\n\t\t$install_actions = apply_filters( 'install_theme_complete_actions', $install_actions, $this->api, $stylesheet, $theme_info );\n\t\tif ( ! empty($install_actions) )\n\t\t\t$this->feedback(implode(' | ', (array)$install_actions));\n\t}\n}\n\n/**\n * Theme Upgrader Skin for WordPress Theme Upgrades.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 2.8.0\n */\nclass Theme_Upgrader_Skin extends WP_Upgrader_Skin {\n\tpublic $theme = '';\n\n\t/**\n\t *\n\t * @param array $args\n\t */\n\tpublic function __construct($args = array()) {\n\t\t$defaults = array( 'url' => '', 'theme' => '', 'nonce' => '', 'title' => __('Update Theme') );\n\t\t$args = wp_parse_args($args, $defaults);\n\n\t\t$this->theme = $args['theme'];\n\n\t\tparent::__construct($args);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function after() {\n\t\t$this->decrement_update_count( 'theme' );\n\n\t\t$update_actions = array();\n\t\tif ( ! empty( $this->upgrader->result['destination_name'] ) && $theme_info = $this->upgrader->theme_info() ) {\n\t\t\t$name       = $theme_info->display('Name');\n\t\t\t$stylesheet = $this->upgrader->result['destination_name'];\n\t\t\t$template   = $theme_info->get_template();\n\n\t\t\t$activate_link = add_query_arg( array(\n\t\t\t\t'action'     => 'activate',\n\t\t\t\t'template'   => urlencode( $template ),\n\t\t\t\t'stylesheet' => urlencode( $stylesheet ),\n\t\t\t), admin_url('themes.php') );\n\t\t\t$activate_link = wp_nonce_url( $activate_link, 'switch-theme_' . $stylesheet );\n\n\t\t\tif ( get_stylesheet() == $stylesheet ) {\n\t\t\t\tif ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {\n\t\t\t\t\t$update_actions['preview']  = '<a href=\"' . wp_customize_url( $stylesheet ) . '\" class=\"hide-if-no-customize load-customize\"><span aria-hidden=\"true\">' . __( 'Customize' ) . '</span><span class=\"screen-reader-text\">' . sprintf( __( 'Customize &#8220;%s&#8221;' ), $name ) . '</span></a>';\n\t\t\t\t}\n\t\t\t} elseif ( current_user_can( 'switch_themes' ) ) {\n\t\t\t\tif ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {\n\t\t\t\t\t$update_actions['preview'] = '<a href=\"' . wp_customize_url( $stylesheet ) . '\" class=\"hide-if-no-customize load-customize\"><span aria-hidden=\"true\">' . __( 'Live Preview' ) . '</span><span class=\"screen-reader-text\">' . sprintf( __( 'Live Preview &#8220;%s&#8221;' ), $name ) . '</span></a>';\n\t\t\t\t}\n\t\t\t\t$update_actions['activate'] = '<a href=\"' . esc_url( $activate_link ) . '\" class=\"activatelink\"><span aria-hidden=\"true\">' . __( 'Activate' ) . '</span><span class=\"screen-reader-text\">' . sprintf( __( 'Activate &#8220;%s&#8221;' ), $name ) . '</span></a>';\n\t\t\t}\n\n\t\t\tif ( ! $this->result || is_wp_error( $this->result ) || is_network_admin() )\n\t\t\t\tunset( $update_actions['preview'], $update_actions['activate'] );\n\t\t}\n\n\t\t$update_actions['themes_page'] = '<a href=\"' . self_admin_url( 'themes.php' ) . '\" target=\"_parent\">' . __( 'Return to Themes page' ) . '</a>';\n\n\t\t/**\n\t\t * Filter the list of action links available following a single theme update.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array  $update_actions Array of theme action links.\n\t\t * @param string $theme          Theme directory name.\n\t\t */\n\t\t$update_actions = apply_filters( 'update_theme_complete_actions', $update_actions, $this->theme );\n\n\t\tif ( ! empty($update_actions) )\n\t\t\t$this->feedback(implode(' | ', (array)$update_actions));\n\t}\n}\n\n/**\n * Translation Upgrader Skin for WordPress Translation Upgrades.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 3.7.0\n */\nclass Language_Pack_Upgrader_Skin extends WP_Upgrader_Skin {\n\tpublic $language_update = null;\n\tpublic $done_header = false;\n\tpublic $done_footer = false;\n\tpublic $display_footer_actions = true;\n\n\t/**\n\t *\n\t * @param array $args\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\t$defaults = array( 'url' => '', 'nonce' => '', 'title' => __( 'Update Translations' ), 'skip_header_footer' => false );\n\t\t$args = wp_parse_args( $args, $defaults );\n\t\tif ( $args['skip_header_footer'] ) {\n\t\t\t$this->done_header = true;\n\t\t\t$this->done_footer = true;\n\t\t\t$this->display_footer_actions = false;\n\t\t}\n\t\tparent::__construct( $args );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function before() {\n\t\t$name = $this->upgrader->get_name_for_update( $this->language_update );\n\n\t\techo '<div class=\"update-messages lp-show-latest\">';\n\n\t\tprintf( '<h2>' . __( 'Updating translations for %1$s (%2$s)&#8230;' ) . '</h2>', $name, $this->language_update->language );\n\t}\n\n\t/**\n\t *\n\t * @param string|WP_Error $error\n\t */\n\tpublic function error( $error ) {\n\t\techo '<div class=\"lp-error\">';\n\t\tparent::error( $error );\n\t\techo '</div>';\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function after() {\n\t\techo '</div>';\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function bulk_footer() {\n\t\t$this->decrement_update_count( 'translation' );\n\t\t$update_actions = array();\n\t\t$update_actions['updates_page'] = '<a href=\"' . self_admin_url( 'update-core.php' ) . '\" target=\"_parent\">' . __( 'Return to WordPress Updates page' ) . '</a>';\n\n\t\t/**\n\t\t * Filter the list of action links available following a translations update.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array $update_actions Array of translations update links.\n\t\t */\n\t\t$update_actions = apply_filters( 'update_translations_complete_actions', $update_actions );\n\n\t\tif ( $update_actions && $this->display_footer_actions )\n\t\t\t$this->feedback( implode( ' | ', $update_actions ) );\n\t}\n}\n\n/**\n * Upgrader Skin for Automatic WordPress Upgrades\n *\n * This skin is designed to be used when no output is intended, all output\n * is captured and stored for the caller to process and log/email/discard.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 3.7.0\n */\nclass Automatic_Upgrader_Skin extends WP_Upgrader_Skin {\n\tprotected $messages = array();\n\n\t/**\n\t *\n\t * @param bool   $error\n\t * @param string $context\n\t * @param bool   $allow_relaxed_file_ownership\n\t * @return bool\n\t */\n\tpublic function request_filesystem_credentials( $error = false, $context = '', $allow_relaxed_file_ownership = false ) {\n\t\tif ( $context ) {\n\t\t\t$this->options['context'] = $context;\n\t\t}\n\t\t// TODO: fix up request_filesystem_credentials(), or split it, to allow us to request a no-output version\n\t\t// This will output a credentials form in event of failure, We don't want that, so just hide with a buffer\n\t\tob_start();\n\t\t$result = parent::request_filesystem_credentials( $error, $context, $allow_relaxed_file_ownership );\n\t\tob_end_clean();\n\t\treturn $result;\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @return array\n\t */\n\tpublic function get_upgrade_messages() {\n\t\treturn $this->messages;\n\t}\n\n\t/**\n\t * @param string|array|WP_Error $data\n\t */\n\tpublic function feedback( $data ) {\n\t\tif ( is_wp_error( $data ) ) {\n\t\t\t$string = $data->get_error_message();\n\t\t} elseif ( is_array( $data ) ) {\n\t\t\treturn;\n\t\t} else {\n\t\t\t$string = $data;\n\t\t}\n\t\tif ( ! empty( $this->upgrader->strings[ $string ] ) )\n\t\t\t$string = $this->upgrader->strings[ $string ];\n\n\t\tif ( strpos( $string, '%' ) !== false ) {\n\t\t\t$args = func_get_args();\n\t\t\t$args = array_splice( $args, 1 );\n\t\t\tif ( ! empty( $args ) )\n\t\t\t\t$string = vsprintf( $string, $args );\n\t\t}\n\n\t\t$string = trim( $string );\n\n\t\t// Only allow basic HTML in the messages, as it'll be used in emails/logs rather than direct browser output.\n\t\t$string = wp_kses( $string, array(\n\t\t\t'a' => array(\n\t\t\t\t'href' => true\n\t\t\t),\n\t\t\t'br' => true,\n\t\t\t'em' => true,\n\t\t\t'strong' => true,\n\t\t) );\n\n\t\tif ( empty( $string ) )\n\t\t\treturn;\n\n\t\t$this->messages[] = $string;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function header() {\n\t\tob_start();\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function footer() {\n\t\t$output = ob_get_clean();\n\t\tif ( ! empty( $output ) )\n\t\t\t$this->feedback( $output );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-upgrader.php",
    "content": "<?php\n/**\n * Upgrade API: WP_Upgrader, Plugin_Upgrader, Theme_Upgrader, Language_Pack_Upgrader,\n * Core_Upgrader, File_Upload_Upgrader, and WP_Automatic_Updater classes\n *\n * This set of classes are designed to be used to upgrade/install a local set of files\n * on the filesystem via the Filesystem Abstraction classes.\n *\n * @package WordPress\n * @subpackage Upgrader\n * @since 2.8.0\n */\n\nrequire ABSPATH . 'wp-admin/includes/class-wp-upgrader-skins.php';\n\n/**\n * Core class used for upgrading/installing a local set of files via\n * the Filesystem Abstraction classes from a Zip file.\n *\n * @since 2.8.0\n */\nclass WP_Upgrader {\n\n\t/**\n\t * The error/notification strings used to update the user on the progress.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var string $strings\n\t */\n\tpublic $strings = array();\n\n\t/**\n\t * The upgrader skin being used.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var WP_Upgrader_Skin $skin\n\t */\n\tpublic $skin = null;\n\n\t/**\n\t * The result of the installation.\n\t *\n\t * This is set by {@see WP_Upgrader::install_package()}, only when the package is installed\n\t * successfully. It will then be an array, unless a {@see WP_Error} is returned by the\n\t * {@see 'upgrader_post_install'} filter. In that case, the `WP_Error` will be assigned to\n\t * it.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @var WP_Error|array $result {\n\t *      @type string $source             The full path to the source the files were installed from.\n\t *      @type string $source_files       List of all the files in the source directory.\n\t *      @type string $destination        The full path to the install destination folder.\n\t *      @type string $destination_name   The name of the destination folder, or empty if `$destination`\n\t *                                       and `$local_destination` are the same.\n\t *      @type string $local_destination  The full local path to the destination folder. This is usually\n\t *                                       the same as `$destination`.\n\t *      @type string $remote_destination The full remote path to the destination folder\n\t *                                       (i.e., from `$wp_filesystem`).\n\t *      @type bool   $clear_destination  Whether the destination folder was cleared.\n\t * }\n\t */\n\tpublic $result = array();\n\n\t/**\n\t * The total number of updates being performed.\n\t *\n\t * Set by the bulk update methods.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var int $update_count\n\t */\n\tpublic $update_count = 0;\n\n\t/**\n\t * The current update if multiple updates are being performed.\n\t *\n\t * Used by the bulk update methods, and incremented for each update.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $update_current = 0;\n\n\t/**\n\t * Construct the upgrader with a skin.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param WP_Upgrader_Skin $skin The upgrader skin to use. Default is a {@see WP_Upgrader_Skin}\n\t *                               instance.\n\t */\n\tpublic function __construct( $skin = null ) {\n\t\tif ( null == $skin )\n\t\t\t$this->skin = new WP_Upgrader_Skin();\n\t\telse\n\t\t\t$this->skin = $skin;\n\t}\n\n\t/**\n\t * Initialize the upgrader.\n\t *\n\t * This will set the relationship between the skin being used and this upgrader,\n\t * and also add the generic strings to `WP_Upgrader::$strings`.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function init() {\n\t\t$this->skin->set_upgrader($this);\n\t\t$this->generic_strings();\n\t}\n\n\t/**\n\t * Add the generic strings to WP_Upgrader::$strings.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function generic_strings() {\n\t\t$this->strings['bad_request'] = __('Invalid Data provided.');\n\t\t$this->strings['fs_unavailable'] = __('Could not access filesystem.');\n\t\t$this->strings['fs_error'] = __('Filesystem error.');\n\t\t$this->strings['fs_no_root_dir'] = __('Unable to locate WordPress Root directory.');\n\t\t$this->strings['fs_no_content_dir'] = __('Unable to locate WordPress Content directory (wp-content).');\n\t\t$this->strings['fs_no_plugins_dir'] = __('Unable to locate WordPress Plugin directory.');\n\t\t$this->strings['fs_no_themes_dir'] = __('Unable to locate WordPress Theme directory.');\n\t\t/* translators: %s: directory name */\n\t\t$this->strings['fs_no_folder'] = __('Unable to locate needed folder (%s).');\n\n\t\t$this->strings['download_failed'] = __('Download failed.');\n\t\t$this->strings['installing_package'] = __('Installing the latest version&#8230;');\n\t\t$this->strings['no_files'] = __('The package contains no files.');\n\t\t$this->strings['folder_exists'] = __('Destination folder already exists.');\n\t\t$this->strings['mkdir_failed'] = __('Could not create directory.');\n\t\t$this->strings['incompatible_archive'] = __('The package could not be installed.');\n\t\t$this->strings['files_not_writable'] = __( 'The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions.' );\n\n\t\t$this->strings['maintenance_start'] = __('Enabling Maintenance mode&#8230;');\n\t\t$this->strings['maintenance_end'] = __('Disabling Maintenance mode&#8230;');\n\t}\n\n\t/**\n\t * Connect to the filesystem.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param array $directories                  Optional. A list of directories. If any of these do\n\t *                                            not exist, a {@see WP_Error} object will be returned.\n\t *                                            Default empty array.\n\t * @param bool  $allow_relaxed_file_ownership Whether to allow relaxed file ownership.\n\t *                                            Default false.\n\t * @return bool|WP_Error True if able to connect, false or a {@see WP_Error} otherwise.\n\t */\n\tpublic function fs_connect( $directories = array(), $allow_relaxed_file_ownership = false ) {\n\t\tglobal $wp_filesystem;\n\n\t\tif ( false === ( $credentials = $this->skin->request_filesystem_credentials( false, $directories[0], $allow_relaxed_file_ownership ) ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! WP_Filesystem( $credentials, $directories[0], $allow_relaxed_file_ownership ) ) {\n\t\t\t$error = true;\n\t\t\tif ( is_object($wp_filesystem) && $wp_filesystem->errors->get_error_code() )\n\t\t\t\t$error = $wp_filesystem->errors;\n\t\t\t// Failed to connect, Error and request again\n\t\t\t$this->skin->request_filesystem_credentials( $error, $directories[0], $allow_relaxed_file_ownership );\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! is_object($wp_filesystem) )\n\t\t\treturn new WP_Error('fs_unavailable', $this->strings['fs_unavailable'] );\n\n\t\tif ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() )\n\t\t\treturn new WP_Error('fs_error', $this->strings['fs_error'], $wp_filesystem->errors);\n\n\t\tforeach ( (array)$directories as $dir ) {\n\t\t\tswitch ( $dir ) {\n\t\t\t\tcase ABSPATH:\n\t\t\t\t\tif ( ! $wp_filesystem->abspath() )\n\t\t\t\t\t\treturn new WP_Error('fs_no_root_dir', $this->strings['fs_no_root_dir']);\n\t\t\t\t\tbreak;\n\t\t\t\tcase WP_CONTENT_DIR:\n\t\t\t\t\tif ( ! $wp_filesystem->wp_content_dir() )\n\t\t\t\t\t\treturn new WP_Error('fs_no_content_dir', $this->strings['fs_no_content_dir']);\n\t\t\t\t\tbreak;\n\t\t\t\tcase WP_PLUGIN_DIR:\n\t\t\t\t\tif ( ! $wp_filesystem->wp_plugins_dir() )\n\t\t\t\t\t\treturn new WP_Error('fs_no_plugins_dir', $this->strings['fs_no_plugins_dir']);\n\t\t\t\t\tbreak;\n\t\t\t\tcase get_theme_root():\n\t\t\t\t\tif ( ! $wp_filesystem->wp_themes_dir() )\n\t\t\t\t\t\treturn new WP_Error('fs_no_themes_dir', $this->strings['fs_no_themes_dir']);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif ( ! $wp_filesystem->find_folder($dir) )\n\t\t\t\t\t\treturn new WP_Error( 'fs_no_folder', sprintf( $this->strings['fs_no_folder'], esc_html( basename( $dir ) ) ) );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t} //end fs_connect();\n\n\t/**\n\t * Download a package.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param string $package The URI of the package. If this is the full path to an\n\t *                        existing local file, it will be returned untouched.\n\t * @return string|WP_Error The full path to the downloaded package file, or a {@see WP_Error} object.\n\t */\n\tpublic function download_package( $package ) {\n\n\t\t/**\n\t\t * Filter whether to return the package.\n\t\t *\n\t\t * @since 3.7.0\n\t\t * @access public\n\t\t *\n\t\t * @param bool        $reply   Whether to bail without returning the package.\n\t\t *                             Default false.\n\t\t * @param string      $package The package file name.\n\t\t * @param WP_Upgrader $this    The WP_Upgrader instance.\n\t\t */\n\t\t$reply = apply_filters( 'upgrader_pre_download', false, $package, $this );\n\t\tif ( false !== $reply )\n\t\t\treturn $reply;\n\n\t\tif ( ! preg_match('!^(http|https|ftp)://!i', $package) && file_exists($package) ) //Local file or remote?\n\t\t\treturn $package; //must be a local file..\n\n\t\tif ( empty($package) )\n\t\t\treturn new WP_Error('no_package', $this->strings['no_package']);\n\n\t\t$this->skin->feedback('downloading_package', $package);\n\n\t\t$download_file = download_url($package);\n\n\t\tif ( is_wp_error($download_file) )\n\t\t\treturn new WP_Error('download_failed', $this->strings['download_failed'], $download_file->get_error_message());\n\n\t\treturn $download_file;\n\t}\n\n\t/**\n\t * Unpack a compressed package file.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param string $package        Full path to the package file.\n\t * @param bool   $delete_package Optional. Whether to delete the package file after attempting\n\t *                               to unpack it. Default true.\n\t * @return string|WP_Error The path to the unpacked contents, or a {@see WP_Error} on failure.\n\t */\n\tpublic function unpack_package( $package, $delete_package = true ) {\n\t\tglobal $wp_filesystem;\n\n\t\t$this->skin->feedback('unpack_package');\n\n\t\t$upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/';\n\n\t\t//Clean up contents of upgrade directory beforehand.\n\t\t$upgrade_files = $wp_filesystem->dirlist($upgrade_folder);\n\t\tif ( !empty($upgrade_files) ) {\n\t\t\tforeach ( $upgrade_files as $file )\n\t\t\t\t$wp_filesystem->delete($upgrade_folder . $file['name'], true);\n\t\t}\n\n\t\t// We need a working directory - Strip off any .tmp or .zip suffixes\n\t\t$working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.zip' );\n\n\t\t// Clean up working directory\n\t\tif ( $wp_filesystem->is_dir($working_dir) )\n\t\t\t$wp_filesystem->delete($working_dir, true);\n\n\t\t// Unzip package to working directory\n\t\t$result = unzip_file( $package, $working_dir );\n\n\t\t// Once extracted, delete the package if required.\n\t\tif ( $delete_package )\n\t\t\tunlink($package);\n\n\t\tif ( is_wp_error($result) ) {\n\t\t\t$wp_filesystem->delete($working_dir, true);\n\t\t\tif ( 'incompatible_archive' == $result->get_error_code() ) {\n\t\t\t\treturn new WP_Error( 'incompatible_archive', $this->strings['incompatible_archive'], $result->get_error_data() );\n\t\t\t}\n\t\t\treturn $result;\n\t\t}\n\n\t\treturn $working_dir;\n\t}\n\n\t/**\n\t * Clears the directory where this item is going to be installed into.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param string $remote_destination The location on the remote filesystem to be cleared\n\t * @return bool|WP_Error True upon success, WP_Error on failure.\n\t */\n\tpublic function clear_destination( $remote_destination ) {\n\t\tglobal $wp_filesystem;\n\n\t\tif ( ! $wp_filesystem->exists( $remote_destination ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Check all files are writable before attempting to clear the destination.\n\t\t$unwritable_files = array();\n\n\t\t$_files = $wp_filesystem->dirlist( $remote_destination, true, true );\n\n\t\t// Flatten the resulting array, iterate using each as we append to the array during iteration.\n\t\twhile ( $f = each( $_files ) ) {\n\t\t\t$file = $f['value'];\n\t\t\t$name = $f['key'];\n\n\t\t\tif ( ! isset( $file['files'] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tforeach ( $file['files'] as $filename => $details ) {\n\t\t\t\t$_files[ $name . '/' . $filename ] = $details;\n\t\t\t}\n\t\t}\n\n\t\t// Check writability.\n\t\tforeach ( $_files as $filename => $file_details ) {\n\t\t\tif ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {\n\n\t\t\t\t// Attempt to alter permissions to allow writes and try again.\n\t\t\t\t$wp_filesystem->chmod( $remote_destination . $filename, ( 'd' == $file_details['type'] ? FS_CHMOD_DIR : FS_CHMOD_FILE ) );\n\t\t\t\tif ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {\n\t\t\t\t\t$unwritable_files[] = $filename;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $unwritable_files ) ) {\n\t\t\treturn new WP_Error( 'files_not_writable', $this->strings['files_not_writable'], implode( ', ', $unwritable_files ) );\n\t\t}\n\n\t\tif ( ! $wp_filesystem->delete( $remote_destination, true ) ) {\n\t\t\treturn new WP_Error( 'remove_old_failed', $this->strings['remove_old_failed'] );\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Install a package.\n\t *\n\t * Copies the contents of a package form a source directory, and installs them in\n\t * a destination directory. Optionally removes the source. It can also optionally\n\t * clear out the destination folder if it already exists.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t * @global array              $wp_theme_directories\n\t *\n\t * @param array|string $args {\n\t *     Optional. Array or string of arguments for installing a package. Default empty array.\n\t *\n\t *     @type string $source                      Required path to the package source. Default empty.\n\t *     @type string $destination                 Required path to a folder to install the package in.\n\t *                                               Default empty.\n\t *     @type bool   $clear_destination           Whether to delete any files already in the destination\n\t *                                               folder. Default false.\n\t *     @type bool   $clear_working               Whether to delete the files form the working directory\n\t *                                               after copying to the destination. Default false.\n\t *     @type bool   $abort_if_destination_exists Whether to abort the installation if\n\t *                                               the destination folder already exists. Default true.\n\t *     @type array  $hook_extra                  Extra arguments to pass to the filter hooks called by\n\t *                                               {@see WP_Upgrader::install_package()}. Default empty array.\n\t * }\n\t *\n\t * @return array|WP_Error The result (also stored in `WP_Upgrader:$result`), or a {@see WP_Error} on failure.\n\t */\n\tpublic function install_package( $args = array() ) {\n\t\tglobal $wp_filesystem, $wp_theme_directories;\n\n\t\t$defaults = array(\n\t\t\t'source' => '', // Please always pass this\n\t\t\t'destination' => '', // and this\n\t\t\t'clear_destination' => false,\n\t\t\t'clear_working' => false,\n\t\t\t'abort_if_destination_exists' => true,\n\t\t\t'hook_extra' => array()\n\t\t);\n\n\t\t$args = wp_parse_args($args, $defaults);\n\n\t\t// These were previously extract()'d.\n\t\t$source = $args['source'];\n\t\t$destination = $args['destination'];\n\t\t$clear_destination = $args['clear_destination'];\n\n\t\t@set_time_limit( 300 );\n\n\t\tif ( empty( $source ) || empty( $destination ) ) {\n\t\t\treturn new WP_Error( 'bad_request', $this->strings['bad_request'] );\n\t\t}\n\t\t$this->skin->feedback( 'installing_package' );\n\n\t\t/**\n\t\t * Filter the install response before the installation has started.\n\t\t *\n\t\t * Returning a truthy value, or one that could be evaluated as a WP_Error\n\t\t * will effectively short-circuit the installation, returning that value\n\t\t * instead.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param bool|WP_Error $response   Response.\n\t\t * @param array         $hook_extra Extra arguments passed to hooked filters.\n\t\t */\n\t\t$res = apply_filters( 'upgrader_pre_install', true, $args['hook_extra'] );\n\n\t\tif ( is_wp_error( $res ) ) {\n\t\t\treturn $res;\n\t\t}\n\n\t\t//Retain the Original source and destinations\n\t\t$remote_source = $args['source'];\n\t\t$local_destination = $destination;\n\n\t\t$source_files = array_keys( $wp_filesystem->dirlist( $remote_source ) );\n\t\t$remote_destination = $wp_filesystem->find_folder( $local_destination );\n\n\t\t//Locate which directory to copy to the new folder, This is based on the actual folder holding the files.\n\t\tif ( 1 == count( $source_files ) && $wp_filesystem->is_dir( trailingslashit( $args['source'] ) . $source_files[0] . '/' ) ) { //Only one folder? Then we want its contents.\n\t\t\t$source = trailingslashit( $args['source'] ) . trailingslashit( $source_files[0] );\n\t\t} elseif ( count( $source_files ) == 0 ) {\n\t\t\treturn new WP_Error( 'incompatible_archive_empty', $this->strings['incompatible_archive'], $this->strings['no_files'] ); // There are no files?\n\t\t} else { // It's only a single file, the upgrader will use the folder name of this file as the destination folder. Folder name is based on zip filename.\n\t\t\t$source = trailingslashit( $args['source'] );\n\t\t}\n\n\t\t/**\n\t\t * Filter the source file location for the upgrade package.\n\t\t *\n\t\t * @since 2.8.0\n\t\t * @since 4.4.0 The $hook_extra parameter became available.\n\t\t *\n\t\t * @param string      $source        File source location.\n\t\t * @param string      $remote_source Remote file source location.\n\t\t * @param WP_Upgrader $this          WP_Upgrader instance.\n\t\t * @param array       $hook_extra    Extra arguments passed to hooked filters.\n\t\t */\n\t\t$source = apply_filters( 'upgrader_source_selection', $source, $remote_source, $this, $args['hook_extra'] );\n\n\t\tif ( is_wp_error( $source ) ) {\n\t\t\treturn $source;\n\t\t}\n\n\t\t// Has the source location changed? If so, we need a new source_files list.\n\t\tif ( $source !== $remote_source ) {\n\t\t\t$source_files = array_keys( $wp_filesystem->dirlist( $source ) );\n\t\t}\n\n\t\t/*\n\t\t * Protection against deleting files in any important base directories.\n\t\t * Theme_Upgrader & Plugin_Upgrader also trigger this, as they pass the\n\t\t * destination directory (WP_PLUGIN_DIR / wp-content/themes) intending\n\t\t * to copy the directory into the directory, whilst they pass the source\n\t\t * as the actual files to copy.\n\t\t */\n\t\t$protected_directories = array( ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes' );\n\n\t\tif ( is_array( $wp_theme_directories ) ) {\n\t\t\t$protected_directories = array_merge( $protected_directories, $wp_theme_directories );\n\t\t}\n\n\t\tif ( in_array( $destination, $protected_directories ) ) {\n\t\t\t$remote_destination = trailingslashit( $remote_destination ) . trailingslashit( basename( $source ) );\n\t\t\t$destination = trailingslashit( $destination ) . trailingslashit( basename( $source ) );\n\t\t}\n\n\t\tif ( $clear_destination ) {\n\t\t\t// We're going to clear the destination if there's something there.\n\t\t\t$this->skin->feedback('remove_old');\n\n\t\t\t$removed = $this->clear_destination( $remote_destination );\n\n\t\t\t/**\n\t\t\t * Filter whether the upgrader cleared the destination.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param mixed  $removed            Whether the destination was cleared. true on success, WP_Error on failure\n\t\t\t * @param string $local_destination  The local package destination.\n\t\t\t * @param string $remote_destination The remote package destination.\n\t\t\t * @param array  $hook_extra         Extra arguments passed to hooked filters.\n\t\t\t */\n\t\t\t$removed = apply_filters( 'upgrader_clear_destination', $removed, $local_destination, $remote_destination, $args['hook_extra'] );\n\n\t\t\tif ( is_wp_error( $removed ) ) {\n\t\t\t\treturn $removed;\n\t\t\t}\n\t\t} elseif ( $args['abort_if_destination_exists'] && $wp_filesystem->exists($remote_destination) ) {\n\t\t\t//If we're not clearing the destination folder and something exists there already, Bail.\n\t\t\t//But first check to see if there are actually any files in the folder.\n\t\t\t$_files = $wp_filesystem->dirlist($remote_destination);\n\t\t\tif ( ! empty($_files) ) {\n\t\t\t\t$wp_filesystem->delete($remote_source, true); //Clear out the source files.\n\t\t\t\treturn new WP_Error('folder_exists', $this->strings['folder_exists'], $remote_destination );\n\t\t\t}\n\t\t}\n\n\t\t//Create destination if needed\n\t\tif ( ! $wp_filesystem->exists( $remote_destination ) ) {\n\t\t\tif ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) ) {\n\t\t\t\treturn new WP_Error( 'mkdir_failed_destination', $this->strings['mkdir_failed'], $remote_destination );\n\t\t\t}\n\t\t}\n\t\t// Copy new version of item into place.\n\t\t$result = copy_dir($source, $remote_destination);\n\t\tif ( is_wp_error($result) ) {\n\t\t\tif ( $args['clear_working'] ) {\n\t\t\t\t$wp_filesystem->delete( $remote_source, true );\n\t\t\t}\n\t\t\treturn $result;\n\t\t}\n\n\t\t//Clear the Working folder?\n\t\tif ( $args['clear_working'] ) {\n\t\t\t$wp_filesystem->delete( $remote_source, true );\n\t\t}\n\n\t\t$destination_name = basename( str_replace($local_destination, '', $destination) );\n\t\tif ( '.' == $destination_name ) {\n\t\t\t$destination_name = '';\n\t\t}\n\n\t\t$this->result = compact( 'source', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination' );\n\n\t\t/**\n\t\t * Filter the install response after the installation has finished.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param bool  $response   Install response.\n\t\t * @param array $hook_extra Extra arguments passed to hooked filters.\n\t\t * @param array $result     Installation result data.\n\t\t */\n\t\t$res = apply_filters( 'upgrader_post_install', true, $args['hook_extra'], $this->result );\n\n\t\tif ( is_wp_error($res) ) {\n\t\t\t$this->result = $res;\n\t\t\treturn $res;\n\t\t}\n\n\t\t//Bombard the calling function will all the info which we've just used.\n\t\treturn $this->result;\n\t}\n\n\t/**\n\t * Run an upgrade/install.\n\t *\n\t * Attempts to download the package (if it is not a local file), unpack it, and\n\t * install it in the destination folder.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $options {\n\t *     Array or string of arguments for upgrading/installing a package.\n\t *\n\t *     @type string $package                     The full path or URI of the package to install.\n\t *                                               Default empty.\n\t *     @type string $destination                 The full path to the destination folder.\n\t *                                               Default empty.\n\t *     @type bool   $clear_destination           Whether to delete any files already in the\n\t *                                               destination folder. Default false.\n\t *     @type bool   $clear_working               Whether to delete the files form the working\n\t *                                               directory after copying to the destination.\n\t *                                               Default false.\n\t *     @type bool   $abort_if_destination_exists Whether to abort the installation if the destination\n\t *                                               folder already exists. When true, `$clear_destination`\n\t *                                               should be false. Default true.\n\t *     @type bool   $is_multi                    Whether this run is one of multiple upgrade/install\n\t *                                               actions being performed in bulk. When true, the skin\n\t *                                               {@see WP_Upgrader::header()} and {@see WP_Upgrader::footer()}\n\t *                                               aren't called. Default false.\n\t *     @type array  $hook_extra                  Extra arguments to pass to the filter hooks called by\n\t *                                               {@see WP_Upgrader::run()}.\n\t * }\n\t * @return array|false|WP_error The result from self::install_package() on success, otherwise a WP_Error,\n\t *                              or false if unable to connect to the filesystem.\n\t */\n\tpublic function run( $options ) {\n\n\t\t$defaults = array(\n\t\t\t'package' => '', // Please always pass this.\n\t\t\t'destination' => '', // And this\n\t\t\t'clear_destination' => false,\n\t\t\t'abort_if_destination_exists' => true, // Abort if the Destination directory exists, Pass clear_destination as false please\n\t\t\t'clear_working' => true,\n\t\t\t'is_multi' => false,\n\t\t\t'hook_extra' => array() // Pass any extra $hook_extra args here, this will be passed to any hooked filters.\n\t\t);\n\n\t\t$options = wp_parse_args( $options, $defaults );\n\n\t\t/**\n\t\t * Filter the package options before running an update.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @param array $options {\n\t\t *     Options used by the upgrader.\n\t\t *\n\t\t *     @type string $package                     Package for update.\n\t\t *     @type string $destination                 Update location.\n\t\t *     @type bool   $clear_destination           Clear the destination resource.\n\t\t *     @type bool   $clear_working               Clear the working resource.\n\t\t *     @type bool   $abort_if_destination_exists Abort if the Destination directory exists.\n\t\t *     @type bool   $is_multi                    Whether the upgrader is running multiple times.\n\t\t *     @type array  $hook_extra                  Extra hook arguments.\n\t\t * }\n\t\t */\n\t\t$options = apply_filters( 'upgrader_package_options', $options );\n\n\t\tif ( ! $options['is_multi'] ) { // call $this->header separately if running multiple times\n\t\t\t$this->skin->header();\n\t\t}\n\n\t\t// Connect to the Filesystem first.\n\t\t$res = $this->fs_connect( array( WP_CONTENT_DIR, $options['destination'] ) );\n\t\t// Mainly for non-connected filesystem.\n\t\tif ( ! $res ) {\n\t\t\tif ( ! $options['is_multi'] ) {\n\t\t\t\t$this->skin->footer();\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->skin->before();\n\n\t\tif ( is_wp_error($res) ) {\n\t\t\t$this->skin->error($res);\n\t\t\t$this->skin->after();\n\t\t\tif ( ! $options['is_multi'] ) {\n\t\t\t\t$this->skin->footer();\n\t\t\t}\n\t\t\treturn $res;\n\t\t}\n\n\t\t/*\n\t\t * Download the package (Note, This just returns the filename\n\t\t * of the file if the package is a local file)\n\t\t */\n\t\t$download = $this->download_package( $options['package'] );\n\t\tif ( is_wp_error($download) ) {\n\t\t\t$this->skin->error($download);\n\t\t\t$this->skin->after();\n\t\t\tif ( ! $options['is_multi'] ) {\n\t\t\t\t$this->skin->footer();\n\t\t\t}\n\t\t\treturn $download;\n\t\t}\n\n\t\t$delete_package = ( $download != $options['package'] ); // Do not delete a \"local\" file\n\n\t\t// Unzips the file into a temporary directory.\n\t\t$working_dir = $this->unpack_package( $download, $delete_package );\n\t\tif ( is_wp_error($working_dir) ) {\n\t\t\t$this->skin->error($working_dir);\n\t\t\t$this->skin->after();\n\t\t\tif ( ! $options['is_multi'] ) {\n\t\t\t\t$this->skin->footer();\n\t\t\t}\n\t\t\treturn $working_dir;\n\t\t}\n\n\t\t// With the given options, this installs it to the destination directory.\n\t\t$result = $this->install_package( array(\n\t\t\t'source' => $working_dir,\n\t\t\t'destination' => $options['destination'],\n\t\t\t'clear_destination' => $options['clear_destination'],\n\t\t\t'abort_if_destination_exists' => $options['abort_if_destination_exists'],\n\t\t\t'clear_working' => $options['clear_working'],\n\t\t\t'hook_extra' => $options['hook_extra']\n\t\t) );\n\n\t\t$this->skin->set_result($result);\n\t\tif ( is_wp_error($result) ) {\n\t\t\t$this->skin->error($result);\n\t\t\t$this->skin->feedback('process_failed');\n\t\t} else {\n\t\t\t// Install succeeded.\n\t\t\t$this->skin->feedback('process_success');\n\t\t}\n\n\t\t$this->skin->after();\n\n\t\tif ( ! $options['is_multi'] ) {\n\n\t\t\t/** This action is documented in wp-admin/includes/class-wp-upgrader.php */\n\t\t\tdo_action( 'upgrader_process_complete', $this, $options['hook_extra'] );\n\t\t\t$this->skin->footer();\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t/**\n\t * Toggle maintenance mode for the site.\n\t *\n\t * Creates/deletes the maintenance file to enable/disable maintenance mode.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param bool $enable True to enable maintenance mode, false to disable.\n\t */\n\tpublic function maintenance_mode( $enable = false ) {\n\t\tglobal $wp_filesystem;\n\t\t$file = $wp_filesystem->abspath() . '.maintenance';\n\t\tif ( $enable ) {\n\t\t\t$this->skin->feedback('maintenance_start');\n\t\t\t// Create maintenance file to signal that we are upgrading\n\t\t\t$maintenance_string = '<?php $upgrading = ' . time() . '; ?>';\n\t\t\t$wp_filesystem->delete($file);\n\t\t\t$wp_filesystem->put_contents($file, $maintenance_string, FS_CHMOD_FILE);\n\t\t} elseif ( ! $enable && $wp_filesystem->exists( $file ) ) {\n\t\t\t$this->skin->feedback('maintenance_end');\n\t\t\t$wp_filesystem->delete($file);\n\t\t}\n\t}\n\n}\n\n/**\n * Core class used for upgrading/installing plugins.\n *\n * It is designed to upgrade/install plugins from a local zip, remote zip URL,\n * or uploaded zip file.\n *\n * @since 2.8.0\n *\n * @see WP_Upgrader\n */\nclass Plugin_Upgrader extends WP_Upgrader {\n\n\t/**\n\t * Plugin upgrade result.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var array|WP_Error $result\n\t *\n\t * @see WP_Upgrader::$result\n\t */\n\tpublic $result;\n\n\t/**\n\t * Whether a bulk upgrade/install is being performed.\n\t *\n\t * @since 2.9.0\n\t * @access public\n\t * @var bool $bulk\n\t */\n\tpublic $bulk = false;\n\n\t/**\n\t * Initialize the upgrade strings.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function upgrade_strings() {\n\t\t$this->strings['up_to_date'] = __('The plugin is at the latest version.');\n\t\t$this->strings['no_package'] = __('Update package not available.');\n\t\t$this->strings['downloading_package'] = __('Downloading update from <span class=\"code\">%s</span>&#8230;');\n\t\t$this->strings['unpack_package'] = __('Unpacking the update&#8230;');\n\t\t$this->strings['remove_old'] = __('Removing the old version of the plugin&#8230;');\n\t\t$this->strings['remove_old_failed'] = __('Could not remove the old plugin.');\n\t\t$this->strings['process_failed'] = __('Plugin update failed.');\n\t\t$this->strings['process_success'] = __('Plugin updated successfully.');\n\t\t$this->strings['process_bulk_success'] = __('Plugins updated successfully.');\n\t}\n\n\t/**\n\t * Initialize the install strings.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function install_strings() {\n\t\t$this->strings['no_package'] = __('Install package not available.');\n\t\t$this->strings['downloading_package'] = __('Downloading install package from <span class=\"code\">%s</span>&#8230;');\n\t\t$this->strings['unpack_package'] = __('Unpacking the package&#8230;');\n\t\t$this->strings['installing_package'] = __('Installing the plugin&#8230;');\n\t\t$this->strings['no_files'] = __('The plugin contains no files.');\n\t\t$this->strings['process_failed'] = __('Plugin install failed.');\n\t\t$this->strings['process_success'] = __('Plugin installed successfully.');\n\t}\n\n\t/**\n\t * Install a plugin package.\n\t *\n\t * @since 2.8.0\n\t * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.\n\t * @access public\n\t *\n\t * @param string $package The full local path or URI of the package.\n\t * @param array  $args {\n\t *     Optional. Other arguments for installing a plugin package. Default empty array.\n\t *\n\t *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful.\n\t *                                    Default true.\n\t * }\n\t * @return bool|WP_Error True if the install was successful, false or a WP_Error otherwise.\n\t */\n\tpublic function install( $package, $args = array() ) {\n\n\t\t$defaults = array(\n\t\t\t'clear_update_cache' => true,\n\t\t);\n\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t$this->init();\n\t\t$this->install_strings();\n\n\t\tadd_filter('upgrader_source_selection', array($this, 'check_package') );\n\t\t// Clear cache so wp_update_plugins() knows about the new plugin.\n\t\tadd_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9, 0 );\n\n\t\t$this->run( array(\n\t\t\t'package' => $package,\n\t\t\t'destination' => WP_PLUGIN_DIR,\n\t\t\t'clear_destination' => false, // Do not overwrite files.\n\t\t\t'clear_working' => true,\n\t\t\t'hook_extra' => array(\n\t\t\t\t'type' => 'plugin',\n\t\t\t\t'action' => 'install',\n\t\t\t)\n\t\t) );\n\n\t\tremove_action( 'upgrader_process_complete', 'wp_clean_plugins_cache', 9 );\n\t\tremove_filter('upgrader_source_selection', array($this, 'check_package') );\n\n\t\tif ( ! $this->result || is_wp_error($this->result) )\n\t\t\treturn $this->result;\n\n\t\t// Force refresh of plugin update information\n\t\twp_clean_plugins_cache( $parsed_args['clear_update_cache'] );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Upgrade a plugin.\n\t *\n\t * @since 2.8.0\n\t * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.\n\t * @access public\n\t *\n\t * @param string $plugin The basename path to the main plugin file.\n\t * @param array  $args {\n\t *     Optional. Other arguments for upgrading a plugin package. Default empty array.\n\t *\n\t *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful.\n\t *                                    Default true.\n\t * }\n\t * @return bool|WP_Error True if the upgrade was successful, false or a {@see WP_Error} object otherwise.\n\t */\n\tpublic function upgrade( $plugin, $args = array() ) {\n\n\t\t$defaults = array(\n\t\t\t'clear_update_cache' => true,\n\t\t);\n\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t$this->init();\n\t\t$this->upgrade_strings();\n\n\t\t$current = get_site_transient( 'update_plugins' );\n\t\tif ( !isset( $current->response[ $plugin ] ) ) {\n\t\t\t$this->skin->before();\n\t\t\t$this->skin->set_result(false);\n\t\t\t$this->skin->error('up_to_date');\n\t\t\t$this->skin->after();\n\t\t\treturn false;\n\t\t}\n\n\t\t// Get the URL to the zip file\n\t\t$r = $current->response[ $plugin ];\n\n\t\tadd_filter('upgrader_pre_install', array($this, 'deactivate_plugin_before_upgrade'), 10, 2);\n\t\tadd_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'), 10, 4);\n\t\t//'source_selection' => array($this, 'source_selection'), //there's a trac ticket to move up the directory for zip's which are made a bit differently, useful for non-.org plugins.\n\n\t\t$this->run( array(\n\t\t\t'package' => $r->package,\n\t\t\t'destination' => WP_PLUGIN_DIR,\n\t\t\t'clear_destination' => true,\n\t\t\t'clear_working' => true,\n\t\t\t'hook_extra' => array(\n\t\t\t\t'plugin' => $plugin,\n\t\t\t\t'type' => 'plugin',\n\t\t\t\t'action' => 'update',\n\t\t\t),\n\t\t) );\n\n\t\t// Cleanup our hooks, in case something else does a upgrade on this connection.\n\t\tremove_filter('upgrader_pre_install', array($this, 'deactivate_plugin_before_upgrade'));\n\t\tremove_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'));\n\n\t\tif ( ! $this->result || is_wp_error($this->result) )\n\t\t\treturn $this->result;\n\n\t\t// Force refresh of plugin update information\n\t\twp_clean_plugins_cache( $parsed_args['clear_update_cache'] );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Bulk upgrade several plugins at once.\n\t *\n\t * @since 2.8.0\n\t * @since 3.7.0 The `$args` parameter was added, making clearing the plugin update cache optional.\n\t * @access public\n\t *\n\t * @param array $plugins Array of the basename paths of the plugins' main files.\n\t * @param array $args {\n\t *     Optional. Other arguments for upgrading several plugins at once. Default empty array.\n\t *\n\t *     @type bool $clear_update_cache Whether to clear the plugin updates cache if successful.\n\t *                                    Default true.\n\t * }\n\t * @return array|false An array of results indexed by plugin file, or false if unable to connect to the filesystem.\n\t */\n\tpublic function bulk_upgrade( $plugins, $args = array() ) {\n\n\t\t$defaults = array(\n\t\t\t'clear_update_cache' => true,\n\t\t);\n\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t$this->init();\n\t\t$this->bulk = true;\n\t\t$this->upgrade_strings();\n\n\t\t$current = get_site_transient( 'update_plugins' );\n\n\t\tadd_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'), 10, 4);\n\n\t\t$this->skin->header();\n\n\t\t// Connect to the Filesystem first.\n\t\t$res = $this->fs_connect( array(WP_CONTENT_DIR, WP_PLUGIN_DIR) );\n\t\tif ( ! $res ) {\n\t\t\t$this->skin->footer();\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->skin->bulk_header();\n\n\t\t/*\n\t\t * Only start maintenance mode if:\n\t\t * - running Multisite and there are one or more plugins specified, OR\n\t\t * - a plugin with an update available is currently active.\n\t\t * @TODO: For multisite, maintenance mode should only kick in for individual sites if at all possible.\n\t\t */\n\t\t$maintenance = ( is_multisite() && ! empty( $plugins ) );\n\t\tforeach ( $plugins as $plugin )\n\t\t\t$maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin] ) );\n\t\tif ( $maintenance )\n\t\t\t$this->maintenance_mode(true);\n\n\t\t$results = array();\n\n\t\t$this->update_count = count($plugins);\n\t\t$this->update_current = 0;\n\t\tforeach ( $plugins as $plugin ) {\n\t\t\t$this->update_current++;\n\t\t\t$this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true);\n\n\t\t\tif ( !isset( $current->response[ $plugin ] ) ) {\n\t\t\t\t$this->skin->set_result('up_to_date');\n\t\t\t\t$this->skin->before();\n\t\t\t\t$this->skin->feedback('up_to_date');\n\t\t\t\t$this->skin->after();\n\t\t\t\t$results[$plugin] = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the URL to the zip file.\n\t\t\t$r = $current->response[ $plugin ];\n\n\t\t\t$this->skin->plugin_active = is_plugin_active($plugin);\n\n\t\t\t$result = $this->run( array(\n\t\t\t\t'package' => $r->package,\n\t\t\t\t'destination' => WP_PLUGIN_DIR,\n\t\t\t\t'clear_destination' => true,\n\t\t\t\t'clear_working' => true,\n\t\t\t\t'is_multi' => true,\n\t\t\t\t'hook_extra' => array(\n\t\t\t\t\t'plugin' => $plugin\n\t\t\t\t)\n\t\t\t) );\n\n\t\t\t$results[$plugin] = $this->result;\n\n\t\t\t// Prevent credentials auth screen from displaying multiple times\n\t\t\tif ( false === $result )\n\t\t\t\tbreak;\n\t\t} //end foreach $plugins\n\n\t\t$this->maintenance_mode(false);\n\n\t\t/**\n\t\t * Fires when the bulk upgrader process is complete.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param Plugin_Upgrader $this Plugin_Upgrader instance. In other contexts, $this, might\n\t\t *                              be a Theme_Upgrader or Core_Upgrade instance.\n\t\t * @param array           $data {\n\t\t *     Array of bulk item update data.\n\t\t *\n\t\t *     @type string $action   Type of action. Default 'update'.\n\t\t *     @type string $type     Type of update process. Accepts 'plugin', 'theme', or 'core'.\n\t\t *     @type bool   $bulk     Whether the update process is a bulk update. Default true.\n\t\t *     @type array  $packages Array of plugin, theme, or core packages to update.\n\t\t * }\n\t\t */\n\t\tdo_action( 'upgrader_process_complete', $this, array(\n\t\t\t'action' => 'update',\n\t\t\t'type' => 'plugin',\n\t\t\t'bulk' => true,\n\t\t\t'plugins' => $plugins,\n\t\t) );\n\n\t\t$this->skin->bulk_footer();\n\n\t\t$this->skin->footer();\n\n\t\t// Cleanup our hooks, in case something else does a upgrade on this connection.\n\t\tremove_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'));\n\n\t\t// Force refresh of plugin update information.\n\t\twp_clean_plugins_cache( $parsed_args['clear_update_cache'] );\n\n\t\treturn $results;\n\t}\n\n\t/**\n\t * Check a source package to be sure it contains a plugin.\n\t *\n\t * This function is added to the {@see 'upgrader_source_selection'} filter by\n\t * {@see Plugin_Upgrader::install()}.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param string $source The path to the downloaded package source.\n\t * @return string|WP_Error The source as passed, or a {@see WP_Error} object\n\t *                         if no plugins were found.\n\t */\n\tpublic function check_package($source) {\n\t\tglobal $wp_filesystem;\n\n\t\tif ( is_wp_error($source) )\n\t\t\treturn $source;\n\n\t\t$working_directory = str_replace( $wp_filesystem->wp_content_dir(), trailingslashit(WP_CONTENT_DIR), $source);\n\t\tif ( ! is_dir($working_directory) ) // Sanity check, if the above fails, let's not prevent installation.\n\t\t\treturn $source;\n\n\t\t// Check the folder contains at least 1 valid plugin.\n\t\t$plugins_found = false;\n\t\t$files = glob( $working_directory . '*.php' );\n\t\tif ( $files ) {\n\t\t\tforeach ( $files as $file ) {\n\t\t\t\t$info = get_plugin_data( $file, false, false );\n\t\t\t\tif ( ! empty( $info['Name'] ) ) {\n\t\t\t\t\t$plugins_found = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $plugins_found )\n\t\t\treturn new WP_Error( 'incompatible_archive_no_plugins', $this->strings['incompatible_archive'], __( 'No valid plugins were found.' ) );\n\n\t\treturn $source;\n\t}\n\n\t/**\n\t * Retrieve the path to the file that contains the plugin info.\n\t *\n\t * This isn't used internally in the class, but is called by the skins.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @return string|false The full path to the main plugin file, or false.\n\t */\n\tpublic function plugin_info() {\n\t\tif ( ! is_array($this->result) )\n\t\t\treturn false;\n\t\tif ( empty($this->result['destination_name']) )\n\t\t\treturn false;\n\n\t\t$plugin = get_plugins('/' . $this->result['destination_name']); //Ensure to pass with leading slash\n\t\tif ( empty($plugin) )\n\t\t\treturn false;\n\n\t\t$pluginfiles = array_keys($plugin); //Assume the requested plugin is the first in the list\n\n\t\treturn $this->result['destination_name'] . '/' . $pluginfiles[0];\n\t}\n\n\t/**\n\t * Deactivates a plugin before it is upgraded.\n\t *\n\t * Hooked to the {@see 'upgrader_pre_install'} filter by {@see Plugin_Upgrader::upgrade()}.\n\t *\n\t * @since 2.8.0\n\t * @since 4.1.0 Added a return value.\n\t * @access public\n\t *\n\t * @param bool|WP_Error  $return Upgrade offer return.\n\t * @param array          $plugin Plugin package arguments.\n\t * @return bool|WP_Error The passed in $return param or {@see WP_Error}.\n\t */\n\tpublic function deactivate_plugin_before_upgrade($return, $plugin) {\n\n\t\tif ( is_wp_error($return) ) //Bypass.\n\t\t\treturn $return;\n\n\t\t// When in cron (background updates) don't deactivate the plugin, as we require a browser to reactivate it\n\t\tif ( defined( 'DOING_CRON' ) && DOING_CRON )\n\t\t\treturn $return;\n\n\t\t$plugin = isset($plugin['plugin']) ? $plugin['plugin'] : '';\n\t\tif ( empty($plugin) )\n\t\t\treturn new WP_Error('bad_request', $this->strings['bad_request']);\n\n\t\tif ( is_plugin_active($plugin) ) {\n\t\t\t//Deactivate the plugin silently, Prevent deactivation hooks from running.\n\t\t\tdeactivate_plugins($plugin, true);\n\t\t}\n\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Delete the old plugin during an upgrade.\n\t *\n\t * Hooked to the {@see 'upgrader_clear_destination'} filter by\n\t * {@see Plugin_Upgrader::upgrade()} and {@see Plugin_Upgrader::bulk_upgrade()}.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n     *\n\t * @param bool|WP_Error $removed\n\t * @param string        $local_destination\n\t * @param string        $remote_destination\n\t * @param array         $plugin\n\t * @return WP_Error|bool\n\t */\n\tpublic function delete_old_plugin($removed, $local_destination, $remote_destination, $plugin) {\n\t\tglobal $wp_filesystem;\n\n\t\tif ( is_wp_error($removed) )\n\t\t\treturn $removed; //Pass errors through.\n\n\t\t$plugin = isset($plugin['plugin']) ? $plugin['plugin'] : '';\n\t\tif ( empty($plugin) )\n\t\t\treturn new WP_Error('bad_request', $this->strings['bad_request']);\n\n\t\t$plugins_dir = $wp_filesystem->wp_plugins_dir();\n\t\t$this_plugin_dir = trailingslashit( dirname($plugins_dir . $plugin) );\n\n\t\tif ( ! $wp_filesystem->exists($this_plugin_dir) ) //If it's already vanished.\n\t\t\treturn $removed;\n\n\t\t// If plugin is in its own directory, recursively delete the directory.\n\t\tif ( strpos($plugin, '/') && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory separator AND that it's not the root plugin folder\n\t\t\t$deleted = $wp_filesystem->delete($this_plugin_dir, true);\n\t\telse\n\t\t\t$deleted = $wp_filesystem->delete($plugins_dir . $plugin);\n\n\t\tif ( ! $deleted )\n\t\t\treturn new WP_Error('remove_old_failed', $this->strings['remove_old_failed']);\n\n\t\treturn true;\n\t}\n}\n\n/**\n * Core class used for upgrading/installing themes.\n *\n * It is designed to upgrade/install themes from a local zip, remote zip URL,\n * or uploaded zip file.\n *\n * @since 2.8.0\n *\n * @see WP_Upgrader\n */\nclass Theme_Upgrader extends WP_Upgrader {\n\n\t/**\n\t * Result of the theme upgrade offer.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var array|WP_Error $result\n\t * @see WP_Upgrader::$result\n\t */\n\tpublic $result;\n\n\t/**\n\t * Whether multiple themes are being upgraded/installed in bulk.\n\t *\n\t * @since 2.9.0\n\t * @access public\n\t * @var bool $bulk\n\t */\n\tpublic $bulk = false;\n\n\t/**\n\t * Initialize the upgrade strings.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function upgrade_strings() {\n\t\t$this->strings['up_to_date'] = __('The theme is at the latest version.');\n\t\t$this->strings['no_package'] = __('Update package not available.');\n\t\t$this->strings['downloading_package'] = __('Downloading update from <span class=\"code\">%s</span>&#8230;');\n\t\t$this->strings['unpack_package'] = __('Unpacking the update&#8230;');\n\t\t$this->strings['remove_old'] = __('Removing the old version of the theme&#8230;');\n\t\t$this->strings['remove_old_failed'] = __('Could not remove the old theme.');\n\t\t$this->strings['process_failed'] = __('Theme update failed.');\n\t\t$this->strings['process_success'] = __('Theme updated successfully.');\n\t}\n\n\t/**\n\t * Initialize the install strings.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function install_strings() {\n\t\t$this->strings['no_package'] = __('Install package not available.');\n\t\t$this->strings['downloading_package'] = __('Downloading install package from <span class=\"code\">%s</span>&#8230;');\n\t\t$this->strings['unpack_package'] = __('Unpacking the package&#8230;');\n\t\t$this->strings['installing_package'] = __('Installing the theme&#8230;');\n\t\t$this->strings['no_files'] = __('The theme contains no files.');\n\t\t$this->strings['process_failed'] = __('Theme install failed.');\n\t\t$this->strings['process_success'] = __('Theme installed successfully.');\n\t\t/* translators: 1: theme name, 2: version */\n\t\t$this->strings['process_success_specific'] = __('Successfully installed the theme <strong>%1$s %2$s</strong>.');\n\t\t$this->strings['parent_theme_search'] = __('This theme requires a parent theme. Checking if it is installed&#8230;');\n\t\t/* translators: 1: theme name, 2: version */\n\t\t$this->strings['parent_theme_prepare_install'] = __('Preparing to install <strong>%1$s %2$s</strong>&#8230;');\n\t\t/* translators: 1: theme name, 2: version */\n\t\t$this->strings['parent_theme_currently_installed'] = __('The parent theme, <strong>%1$s %2$s</strong>, is currently installed.');\n\t\t/* translators: 1: theme name, 2: version */\n\t\t$this->strings['parent_theme_install_success'] = __('Successfully installed the parent theme, <strong>%1$s %2$s</strong>.');\n\t\t$this->strings['parent_theme_not_found'] = __('<strong>The parent theme could not be found.</strong> You will need to install the parent theme, <strong>%s</strong>, before you can use this child theme.');\n\t}\n\n\t/**\n\t * Check if a child theme is being installed and we need to install its parent.\n\t *\n\t * Hooked to the {@see 'upgrader_post_install'} filter by {@see Theme_Upgrader::install()}.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param bool  $install_result\n\t * @param array $hook_extra\n\t * @param array $child_result\n\t * @return type\n\t */\n\tpublic function check_parent_theme_filter( $install_result, $hook_extra, $child_result ) {\n\t\t// Check to see if we need to install a parent theme\n\t\t$theme_info = $this->theme_info();\n\n\t\tif ( ! $theme_info->parent() )\n\t\t\treturn $install_result;\n\n\t\t$this->skin->feedback( 'parent_theme_search' );\n\n\t\tif ( ! $theme_info->parent()->errors() ) {\n\t\t\t$this->skin->feedback( 'parent_theme_currently_installed', $theme_info->parent()->display('Name'), $theme_info->parent()->display('Version') );\n\t\t\t// We already have the theme, fall through.\n\t\t\treturn $install_result;\n\t\t}\n\n\t\t// We don't have the parent theme, let's install it.\n\t\t$api = themes_api('theme_information', array('slug' => $theme_info->get('Template'), 'fields' => array('sections' => false, 'tags' => false) ) ); //Save on a bit of bandwidth.\n\n\t\tif ( ! $api || is_wp_error($api) ) {\n\t\t\t$this->skin->feedback( 'parent_theme_not_found', $theme_info->get('Template') );\n\t\t\t// Don't show activate or preview actions after install\n\t\t\tadd_filter('install_theme_complete_actions', array($this, 'hide_activate_preview_actions') );\n\t\t\treturn $install_result;\n\t\t}\n\n\t\t// Backup required data we're going to override:\n\t\t$child_api = $this->skin->api;\n\t\t$child_success_message = $this->strings['process_success'];\n\n\t\t// Override them\n\t\t$this->skin->api = $api;\n\t\t$this->strings['process_success_specific'] = $this->strings['parent_theme_install_success'];//, $api->name, $api->version);\n\n\t\t$this->skin->feedback('parent_theme_prepare_install', $api->name, $api->version);\n\n\t\tadd_filter('install_theme_complete_actions', '__return_false', 999); // Don't show any actions after installing the theme.\n\n\t\t// Install the parent theme\n\t\t$parent_result = $this->run( array(\n\t\t\t'package' => $api->download_link,\n\t\t\t'destination' => get_theme_root(),\n\t\t\t'clear_destination' => false, //Do not overwrite files.\n\t\t\t'clear_working' => true\n\t\t) );\n\n\t\tif ( is_wp_error($parent_result) )\n\t\t\tadd_filter('install_theme_complete_actions', array($this, 'hide_activate_preview_actions') );\n\n\t\t// Start cleaning up after the parents installation\n\t\tremove_filter('install_theme_complete_actions', '__return_false', 999);\n\n\t\t// Reset child's result and data\n\t\t$this->result = $child_result;\n\t\t$this->skin->api = $child_api;\n\t\t$this->strings['process_success'] = $child_success_message;\n\n\t\treturn $install_result;\n\t}\n\n\t/**\n\t * Don't display the activate and preview actions to the user.\n\t *\n\t * Hooked to the {@see 'install_theme_complete_actions'} filter by\n\t * {@see Theme_Upgrader::check_parent_theme_filter()} when installing\n\t * a child theme and installing the parent theme fails.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param array $actions Preview actions.\n\t * @return array\n\t */\n\tpublic function hide_activate_preview_actions( $actions ) {\n\t\tunset($actions['activate'], $actions['preview']);\n\t\treturn $actions;\n\t}\n\n\t/**\n\t * Install a theme package.\n\t *\n\t * @since 2.8.0\n\t * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.\n\t * @access public\n\t *\n\t * @param string $package The full local path or URI of the package.\n\t * @param array  $args {\n\t *     Optional. Other arguments for installing a theme package. Default empty array.\n\t *\n\t *     @type bool $clear_update_cache Whether to clear the updates cache if successful.\n\t *                                    Default true.\n\t * }\n\t *\n\t * @return bool|WP_Error True if the install was successful, false or a {@see WP_Error} object otherwise.\n\t */\n\tpublic function install( $package, $args = array() ) {\n\n\t\t$defaults = array(\n\t\t\t'clear_update_cache' => true,\n\t\t);\n\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t$this->init();\n\t\t$this->install_strings();\n\n\t\tadd_filter('upgrader_source_selection', array($this, 'check_package') );\n\t\tadd_filter('upgrader_post_install', array($this, 'check_parent_theme_filter'), 10, 3);\n\t\t// Clear cache so wp_update_themes() knows about the new theme.\n\t\tadd_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9, 0 );\n\n\t\t$this->run( array(\n\t\t\t'package' => $package,\n\t\t\t'destination' => get_theme_root(),\n\t\t\t'clear_destination' => false, //Do not overwrite files.\n\t\t\t'clear_working' => true,\n\t\t\t'hook_extra' => array(\n\t\t\t\t'type' => 'theme',\n\t\t\t\t'action' => 'install',\n\t\t\t),\n\t\t) );\n\n\t\tremove_action( 'upgrader_process_complete', 'wp_clean_themes_cache', 9 );\n\t\tremove_filter('upgrader_source_selection', array($this, 'check_package') );\n\t\tremove_filter('upgrader_post_install', array($this, 'check_parent_theme_filter'));\n\n\t\tif ( ! $this->result || is_wp_error($this->result) )\n\t\t\treturn $this->result;\n\n\t\t// Refresh the Theme Update information\n\t\twp_clean_themes_cache( $parsed_args['clear_update_cache'] );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Upgrade a theme.\n\t *\n\t * @since 2.8.0\n\t * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.\n\t * @access public\n\t *\n\t * @param string $theme The theme slug.\n\t * @param array  $args {\n\t *     Optional. Other arguments for upgrading a theme. Default empty array.\n\t *\n\t *     @type bool $clear_update_cache Whether to clear the update cache if successful.\n\t *                                    Default true.\n\t * }\n\t * @return bool|WP_Error True if the upgrade was successful, false or a {@see WP_Error} object otherwise.\n\t */\n\tpublic function upgrade( $theme, $args = array() ) {\n\n\t\t$defaults = array(\n\t\t\t'clear_update_cache' => true,\n\t\t);\n\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t$this->init();\n\t\t$this->upgrade_strings();\n\n\t\t// Is an update available?\n\t\t$current = get_site_transient( 'update_themes' );\n\t\tif ( !isset( $current->response[ $theme ] ) ) {\n\t\t\t$this->skin->before();\n\t\t\t$this->skin->set_result(false);\n\t\t\t$this->skin->error( 'up_to_date' );\n\t\t\t$this->skin->after();\n\t\t\treturn false;\n\t\t}\n\n\t\t$r = $current->response[ $theme ];\n\n\t\tadd_filter('upgrader_pre_install', array($this, 'current_before'), 10, 2);\n\t\tadd_filter('upgrader_post_install', array($this, 'current_after'), 10, 2);\n\t\tadd_filter('upgrader_clear_destination', array($this, 'delete_old_theme'), 10, 4);\n\n\t\t$this->run( array(\n\t\t\t'package' => $r['package'],\n\t\t\t'destination' => get_theme_root( $theme ),\n\t\t\t'clear_destination' => true,\n\t\t\t'clear_working' => true,\n\t\t\t'hook_extra' => array(\n\t\t\t\t'theme' => $theme,\n\t\t\t\t'type' => 'theme',\n\t\t\t\t'action' => 'update',\n\t\t\t),\n\t\t) );\n\n\t\tremove_filter('upgrader_pre_install', array($this, 'current_before'));\n\t\tremove_filter('upgrader_post_install', array($this, 'current_after'));\n\t\tremove_filter('upgrader_clear_destination', array($this, 'delete_old_theme'));\n\n\t\tif ( ! $this->result || is_wp_error($this->result) )\n\t\t\treturn $this->result;\n\n\t\twp_clean_themes_cache( $parsed_args['clear_update_cache'] );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Upgrade several themes at once.\n\t *\n\t * @since 3.0.0\n\t * @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.\n\t * @access public\n\t *\n\t * @param array $themes The theme slugs.\n\t * @param array $args {\n\t *     Optional. Other arguments for upgrading several themes at once. Default empty array.\n\t *\n\t *     @type bool $clear_update_cache Whether to clear the update cache if successful.\n\t *                                    Default true.\n\t * }\n\t * @return array[]|false An array of results, or false if unable to connect to the filesystem.\n\t */\n\tpublic function bulk_upgrade( $themes, $args = array() ) {\n\n\t\t$defaults = array(\n\t\t\t'clear_update_cache' => true,\n\t\t);\n\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t$this->init();\n\t\t$this->bulk = true;\n\t\t$this->upgrade_strings();\n\n\t\t$current = get_site_transient( 'update_themes' );\n\n\t\tadd_filter('upgrader_pre_install', array($this, 'current_before'), 10, 2);\n\t\tadd_filter('upgrader_post_install', array($this, 'current_after'), 10, 2);\n\t\tadd_filter('upgrader_clear_destination', array($this, 'delete_old_theme'), 10, 4);\n\n\t\t$this->skin->header();\n\n\t\t// Connect to the Filesystem first.\n\t\t$res = $this->fs_connect( array(WP_CONTENT_DIR) );\n\t\tif ( ! $res ) {\n\t\t\t$this->skin->footer();\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->skin->bulk_header();\n\n\t\t// Only start maintenance mode if:\n\t\t// - running Multisite and there are one or more themes specified, OR\n\t\t// - a theme with an update available is currently in use.\n\t\t// @TODO: For multisite, maintenance mode should only kick in for individual sites if at all possible.\n\t\t$maintenance = ( is_multisite() && ! empty( $themes ) );\n\t\tforeach ( $themes as $theme )\n\t\t\t$maintenance = $maintenance || $theme == get_stylesheet() || $theme == get_template();\n\t\tif ( $maintenance )\n\t\t\t$this->maintenance_mode(true);\n\n\t\t$results = array();\n\n\t\t$this->update_count = count($themes);\n\t\t$this->update_current = 0;\n\t\tforeach ( $themes as $theme ) {\n\t\t\t$this->update_current++;\n\n\t\t\t$this->skin->theme_info = $this->theme_info($theme);\n\n\t\t\tif ( !isset( $current->response[ $theme ] ) ) {\n\t\t\t\t$this->skin->set_result(true);\n\t\t\t\t$this->skin->before();\n\t\t\t\t$this->skin->feedback( 'up_to_date' );\n\t\t\t\t$this->skin->after();\n\t\t\t\t$results[$theme] = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the URL to the zip file\n\t\t\t$r = $current->response[ $theme ];\n\n\t\t\t$result = $this->run( array(\n\t\t\t\t'package' => $r['package'],\n\t\t\t\t'destination' => get_theme_root( $theme ),\n\t\t\t\t'clear_destination' => true,\n\t\t\t\t'clear_working' => true,\n\t\t\t\t'is_multi' => true,\n\t\t\t\t'hook_extra' => array(\n\t\t\t\t\t'theme' => $theme\n\t\t\t\t),\n\t\t\t) );\n\n\t\t\t$results[$theme] = $this->result;\n\n\t\t\t// Prevent credentials auth screen from displaying multiple times\n\t\t\tif ( false === $result )\n\t\t\t\tbreak;\n\t\t} //end foreach $plugins\n\n\t\t$this->maintenance_mode(false);\n\n\t\t/** This action is documented in wp-admin/includes/class-wp-upgrader.php */\n\t\tdo_action( 'upgrader_process_complete', $this, array(\n\t\t\t'action' => 'update',\n\t\t\t'type' => 'theme',\n\t\t\t'bulk' => true,\n\t\t\t'themes' => $themes,\n\t\t) );\n\n\t\t$this->skin->bulk_footer();\n\n\t\t$this->skin->footer();\n\n\t\t// Cleanup our hooks, in case something else does a upgrade on this connection.\n\t\tremove_filter('upgrader_pre_install', array($this, 'current_before'));\n\t\tremove_filter('upgrader_post_install', array($this, 'current_after'));\n\t\tremove_filter('upgrader_clear_destination', array($this, 'delete_old_theme'));\n\n\t\t// Refresh the Theme Update information\n\t\twp_clean_themes_cache( $parsed_args['clear_update_cache'] );\n\n\t\treturn $results;\n\t}\n\n\t/**\n\t * Check that the package source contains a valid theme.\n\t *\n\t * Hooked to the {@see 'upgrader_source_selection'} filter by {@see Theme_Upgrader::install()}.\n\t * It will return an error if the theme doesn't have style.css or index.php\n\t * files.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param string $source The full path to the package source.\n\t * @return string|WP_Error The source or a WP_Error.\n\t */\n\tpublic function check_package( $source ) {\n\t\tglobal $wp_filesystem;\n\n\t\tif ( is_wp_error($source) )\n\t\t\treturn $source;\n\n\t\t// Check the folder contains a valid theme\n\t\t$working_directory = str_replace( $wp_filesystem->wp_content_dir(), trailingslashit(WP_CONTENT_DIR), $source);\n\t\tif ( ! is_dir($working_directory) ) // Sanity check, if the above fails, let's not prevent installation.\n\t\t\treturn $source;\n\n\t\t// A proper archive should have a style.css file in the single subdirectory\n\t\tif ( ! file_exists( $working_directory . 'style.css' ) ) {\n\t\t\treturn new WP_Error( 'incompatible_archive_theme_no_style', $this->strings['incompatible_archive'],\n\t\t\t\t/* translators: %s: style.css */\n\t\t\t\tsprintf( __( 'The theme is missing the %s stylesheet.' ),\n\t\t\t\t\t'<code>style.css</code>'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t$info = get_file_data( $working_directory . 'style.css', array( 'Name' => 'Theme Name', 'Template' => 'Template' ) );\n\n\t\tif ( empty( $info['Name'] ) ) {\n\t\t\treturn new WP_Error( 'incompatible_archive_theme_no_name', $this->strings['incompatible_archive'],\n\t\t\t\t/* translators: %s: style.css */\n\t\t\t\tsprintf( __( 'The %s stylesheet doesn&#8217;t contain a valid theme header.' ),\n\t\t\t\t\t'<code>style.css</code>'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t// If it's not a child theme, it must have at least an index.php to be legit.\n\t\tif ( empty( $info['Template'] ) && ! file_exists( $working_directory . 'index.php' ) ) {\n\t\t\treturn new WP_Error( 'incompatible_archive_theme_no_index', $this->strings['incompatible_archive'],\n\t\t\t\t/* translators: %s: index.php */\n\t\t\t\tsprintf( __( 'The theme is missing the %s file.' ),\n\t\t\t\t\t'<code>index.php</code>'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn $source;\n\t}\n\n\t/**\n\t * Turn on maintenance mode before attempting to upgrade the current theme.\n\t *\n\t * Hooked to the {@see 'upgrader_pre_install'} filter by {@see Theme_Upgrader::upgrade()} and\n\t * {@see Theme_Upgrader::bulk_upgrade()}.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param bool|WP_Error  $return\n\t * @param array          $theme\n\t * @return bool|WP_Error\n\t */\n\tpublic function current_before($return, $theme) {\n\t\tif ( is_wp_error($return) )\n\t\t\treturn $return;\n\n\t\t$theme = isset($theme['theme']) ? $theme['theme'] : '';\n\n\t\tif ( $theme != get_stylesheet() ) //If not current\n\t\t\treturn $return;\n\t\t//Change to maintenance mode now.\n\t\tif ( ! $this->bulk )\n\t\t\t$this->maintenance_mode(true);\n\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Turn off maintenance mode after upgrading the current theme.\n\t *\n\t * Hooked to the {@see 'upgrader_post_install'} filter by {@see Theme_Upgrader::upgrade()}\n\t * and {@see Theme_Upgrader::bulk_upgrade()}.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param bool|WP_Error  $return\n\t * @param array          $theme\n\t * @return bool|WP_Error\n\t */\n\tpublic function current_after($return, $theme) {\n\t\tif ( is_wp_error($return) )\n\t\t\treturn $return;\n\n\t\t$theme = isset($theme['theme']) ? $theme['theme'] : '';\n\n\t\tif ( $theme != get_stylesheet() ) // If not current\n\t\t\treturn $return;\n\n\t\t// Ensure stylesheet name hasn't changed after the upgrade:\n\t\tif ( $theme == get_stylesheet() && $theme != $this->result['destination_name'] ) {\n\t\t\twp_clean_themes_cache();\n\t\t\t$stylesheet = $this->result['destination_name'];\n\t\t\tswitch_theme( $stylesheet );\n\t\t}\n\n\t\t//Time to remove maintenance mode\n\t\tif ( ! $this->bulk )\n\t\t\t$this->maintenance_mode(false);\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Delete the old theme during an upgrade.\n\t *\n\t * Hooked to the {@see 'upgrader_clear_destination'} filter by {@see Theme_Upgrader::upgrade()}\n\t * and {@see Theme_Upgrader::bulk_upgrade()}.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param bool   $removed\n\t * @param string $local_destination\n\t * @param string $remote_destination\n\t * @param array  $theme\n\t * @return bool\n\t */\n\tpublic function delete_old_theme( $removed, $local_destination, $remote_destination, $theme ) {\n\t\tglobal $wp_filesystem;\n\n\t\tif ( is_wp_error( $removed ) )\n\t\t\treturn $removed; // Pass errors through.\n\n\t\tif ( ! isset( $theme['theme'] ) )\n\t\t\treturn $removed;\n\n\t\t$theme = $theme['theme'];\n\t\t$themes_dir = trailingslashit( $wp_filesystem->wp_themes_dir( $theme ) );\n\t\tif ( $wp_filesystem->exists( $themes_dir . $theme ) ) {\n\t\t\tif ( ! $wp_filesystem->delete( $themes_dir . $theme, true ) )\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get the WP_Theme object for a theme.\n\t *\n\t * @since 2.8.0\n\t * @since 3.0.0 The `$theme` argument was added.\n\t * @access public\n\t *\n\t * @param string $theme The directory name of the theme. This is optional, and if not supplied,\n\t *                      the directory name from the last result will be used.\n\t * @return WP_Theme|false The theme's info object, or false `$theme` is not supplied\n\t *                        and the last result isn't set.\n\t */\n\tpublic function theme_info($theme = null) {\n\n\t\tif ( empty($theme) ) {\n\t\t\tif ( !empty($this->result['destination_name']) )\n\t\t\t\t$theme = $this->result['destination_name'];\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t\treturn wp_get_theme( $theme );\n\t}\n\n}\n\n/**\n * Core class used for updating/installing language packs (translations)\n * for plugins, themes, and core.\n *\n * @since 3.7.0\n *\n * @see WP_Upgrader\n */\nclass Language_Pack_Upgrader extends WP_Upgrader {\n\n\t/**\n\t * Result of the language pack upgrade.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @var array|WP_Error $result\n\t * @see WP_Upgrader::$result\n\t */\n\tpublic $result;\n\n\t/**\n\t * Whether a bulk upgrade/install is being performed.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @var bool $bulk\n\t */\n\tpublic $bulk = true;\n\n\t/**\n\t * Asynchronously upgrades language packs after other upgrades have been made.\n\t *\n\t * Hooked to the {@see 'upgrader_process_complete'} action by default.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @static\n\t *\n\t * @param false|WP_Upgrader $upgrader Optional. WP_Upgrader instance or false. If `$upgrader` is\n\t *                                    a Language_Pack_Upgrader instance, the method will bail to\n\t *                                    avoid recursion. Otherwise unused. Default false.\n\t */\n\tpublic static function async_upgrade( $upgrader = false ) {\n\t\t// Avoid recursion.\n\t\tif ( $upgrader && $upgrader instanceof Language_Pack_Upgrader ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Nothing to do?\n\t\t$language_updates = wp_get_translation_updates();\n\t\tif ( ! $language_updates ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/*\n\t\t * Avoid messing with VCS installs, at least for now.\n\t\t * Noted: this is not the ideal way to accomplish this.\n\t\t */\n\t\t$check_vcs = new WP_Automatic_Updater;\n\t\tif ( $check_vcs->is_vcs_checkout( WP_CONTENT_DIR ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tforeach ( $language_updates as $key => $language_update ) {\n\t\t\t$update = ! empty( $language_update->autoupdate );\n\n\t\t\t/**\n\t\t\t * Filter whether to asynchronously update translation for core, a plugin, or a theme.\n\t\t\t *\n\t\t\t * @since 4.0.0\n\t\t\t *\n\t\t\t * @param bool   $update          Whether to update.\n\t\t\t * @param object $language_update The update offer.\n\t\t\t */\n\t\t\t$update = apply_filters( 'async_update_translation', $update, $language_update );\n\n\t\t\tif ( ! $update ) {\n\t\t\t\tunset( $language_updates[ $key ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $language_updates ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Re-use the automatic upgrader skin if the parent upgrader is using it.\n\t\tif ( $upgrader && $upgrader->skin instanceof Automatic_Upgrader_Skin ) {\n\t\t\t$skin = $upgrader->skin;\n\t\t} else {\n\t\t\t$skin = new Language_Pack_Upgrader_Skin( array(\n\t\t\t\t'skip_header_footer' => true,\n\t\t\t) );\n\t\t}\n\n\t\t$lp_upgrader = new Language_Pack_Upgrader( $skin );\n\t\t$lp_upgrader->bulk_upgrade( $language_updates );\n\t}\n\n\t/**\n\t * Initialize the upgrade strings.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t */\n\tpublic function upgrade_strings() {\n\t\t$this->strings['starting_upgrade'] = __( 'Some of your translations need updating. Sit tight for a few more seconds while we update them as well.' );\n\t\t$this->strings['up_to_date'] = __( 'The translation is up to date.' ); // We need to silently skip this case\n\t\t$this->strings['no_package'] = __( 'Update package not available.' );\n\t\t$this->strings['downloading_package'] = __( 'Downloading translation from <span class=\"code\">%s</span>&#8230;' );\n\t\t$this->strings['unpack_package'] = __( 'Unpacking the update&#8230;' );\n\t\t$this->strings['process_failed'] = __( 'Translation update failed.' );\n\t\t$this->strings['process_success'] = __( 'Translation updated successfully.' );\n\t}\n\n\t/**\n\t * Upgrade a language pack.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param string|false $update Optional. Whether an update offer is available. Default false.\n\t * @param array        $args   Optional. Other optional arguments, see\n\t *                             {@see Language_Pack_Upgrader::bulk_upgrade()}. Default empty array.\n\t * @return array|bool|WP_Error The result of the upgrade, or a {@see wP_Error} object instead.\n\t */\n\tpublic function upgrade( $update = false, $args = array() ) {\n\t\tif ( $update ) {\n\t\t\t$update = array( $update );\n\t\t}\n\n\t\t$results = $this->bulk_upgrade( $update, $args );\n\n\t\tif ( ! is_array( $results ) ) {\n\t\t\treturn $results;\n\t\t}\n\n\t\treturn $results[0];\n\t}\n\n\t/**\n\t * Bulk upgrade language packs.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param array $language_updates Optional. Language pack updates. Default empty array.\n\t * @param array $args {\n\t *     Optional. Other arguments for upgrading multiple language packs. Default empty array\n\t *\n\t *     @type bool $clear_update_cache Whether to clear the update cache when done.\n\t *                                    Default true.\n\t * }\n\t * @return array|bool|WP_Error Will return an array of results, or true if there are no updates,\n\t *                                   false or WP_Error for initial errors.\n\t */\n\tpublic function bulk_upgrade( $language_updates = array(), $args = array() ) {\n\t\tglobal $wp_filesystem;\n\n\t\t$defaults = array(\n\t\t\t'clear_update_cache' => true,\n\t\t);\n\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t$this->init();\n\t\t$this->upgrade_strings();\n\n\t\tif ( ! $language_updates )\n\t\t\t$language_updates = wp_get_translation_updates();\n\n\t\tif ( empty( $language_updates ) ) {\n\t\t\t$this->skin->header();\n\t\t\t$this->skin->before();\n\t\t\t$this->skin->set_result( true );\n\t\t\t$this->skin->feedback( 'up_to_date' );\n\t\t\t$this->skin->after();\n\t\t\t$this->skin->bulk_footer();\n\t\t\t$this->skin->footer();\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( 'upgrader_process_complete' == current_filter() )\n\t\t\t$this->skin->feedback( 'starting_upgrade' );\n\n\t\t// Remove any existing upgrade filters from the plugin/theme upgraders #WP29425 & #WP29230\n\t\tremove_all_filters( 'upgrader_pre_install' );\n\t\tremove_all_filters( 'upgrader_clear_destination' );\n\t\tremove_all_filters( 'upgrader_post_install' );\n\t\tremove_all_filters( 'upgrader_source_selection' );\n\n\t\tadd_filter( 'upgrader_source_selection', array( $this, 'check_package' ), 10, 2 );\n\n\t\t$this->skin->header();\n\n\t\t// Connect to the Filesystem first.\n\t\t$res = $this->fs_connect( array( WP_CONTENT_DIR, WP_LANG_DIR ) );\n\t\tif ( ! $res ) {\n\t\t\t$this->skin->footer();\n\t\t\treturn false;\n\t\t}\n\n\t\t$results = array();\n\n\t\t$this->update_count = count( $language_updates );\n\t\t$this->update_current = 0;\n\n\t\t/*\n\t\t * The filesystem's mkdir() is not recursive. Make sure WP_LANG_DIR exists,\n\t\t * as we then may need to create a /plugins or /themes directory inside of it.\n\t\t */\n\t\t$remote_destination = $wp_filesystem->find_folder( WP_LANG_DIR );\n\t\tif ( ! $wp_filesystem->exists( $remote_destination ) )\n\t\t\tif ( ! $wp_filesystem->mkdir( $remote_destination, FS_CHMOD_DIR ) )\n\t\t\t\treturn new WP_Error( 'mkdir_failed_lang_dir', $this->strings['mkdir_failed'], $remote_destination );\n\n\t\tforeach ( $language_updates as $language_update ) {\n\n\t\t\t$this->skin->language_update = $language_update;\n\n\t\t\t$destination = WP_LANG_DIR;\n\t\t\tif ( 'plugin' == $language_update->type )\n\t\t\t\t$destination .= '/plugins';\n\t\t\telseif ( 'theme' == $language_update->type )\n\t\t\t\t$destination .= '/themes';\n\n\t\t\t$this->update_current++;\n\n\t\t\t$options = array(\n\t\t\t\t'package' => $language_update->package,\n\t\t\t\t'destination' => $destination,\n\t\t\t\t'clear_destination' => false,\n\t\t\t\t'abort_if_destination_exists' => false, // We expect the destination to exist.\n\t\t\t\t'clear_working' => true,\n\t\t\t\t'is_multi' => true,\n\t\t\t\t'hook_extra' => array(\n\t\t\t\t\t'language_update_type' => $language_update->type,\n\t\t\t\t\t'language_update' => $language_update,\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t$result = $this->run( $options );\n\n\t\t\t$results[] = $this->result;\n\n\t\t\t// Prevent credentials auth screen from displaying multiple times.\n\t\t\tif ( false === $result )\n\t\t\t\tbreak;\n\t\t}\n\n\t\t$this->skin->bulk_footer();\n\n\t\t$this->skin->footer();\n\n\t\t// Clean up our hooks, in case something else does an upgrade on this connection.\n\t\tremove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );\n\n\t\tif ( $parsed_args['clear_update_cache'] ) {\n\t\t\twp_clean_update_cache();\n\t\t}\n\n\t\treturn $results;\n\t}\n\n\t/**\n\t * Check the package source to make sure there are .mo and .po files.\n\t *\n\t * Hooked to the {@see 'upgrader_source_selection'} filter by\n\t * {@see Language_Pack_Upgrader::bulk_upgrade()}.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t *\n\t * @param string|WP_Error $source\n\t * @param string          $remote_source\n\t */\n\tpublic function check_package( $source, $remote_source ) {\n\t\tglobal $wp_filesystem;\n\n\t\tif ( is_wp_error( $source ) )\n\t\t\treturn $source;\n\n\t\t// Check that the folder contains a valid language.\n\t\t$files = $wp_filesystem->dirlist( $remote_source );\n\n\t\t// Check to see if a .po and .mo exist in the folder.\n\t\t$po = $mo = false;\n\t\tforeach ( (array) $files as $file => $filedata ) {\n\t\t\tif ( '.po' == substr( $file, -3 ) )\n\t\t\t\t$po = true;\n\t\t\telseif ( '.mo' == substr( $file, -3 ) )\n\t\t\t\t$mo = true;\n\t\t}\n\n\t\tif ( ! $mo || ! $po ) {\n\t\t\treturn new WP_Error( 'incompatible_archive_pomo', $this->strings['incompatible_archive'],\n\t\t\t\t/* translators: 1: .po 2: .mo */\n\t\t\t\tsprintf( __( 'The language pack is missing either the %1$s or %2$s files.' ),\n\t\t\t\t\t'<code>.po</code>',\n\t\t\t\t\t'<code>.mo</code>'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn $source;\n\t}\n\n\t/**\n\t * Get the name of an item being updated.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param object $update The data for an update.\n\t * @return string The name of the item being updated.\n\t */\n\tpublic function get_name_for_update( $update ) {\n\t\tswitch ( $update->type ) {\n\t\t\tcase 'core':\n\t\t\t\treturn 'WordPress'; // Not translated\n\n\t\t\tcase 'theme':\n\t\t\t\t$theme = wp_get_theme( $update->slug );\n\t\t\t\tif ( $theme->exists() )\n\t\t\t\t\treturn $theme->Get( 'Name' );\n\t\t\t\tbreak;\n\t\t\tcase 'plugin':\n\t\t\t\t$plugin_data = get_plugins( '/' . $update->slug );\n\t\t\t\t$plugin_data = reset( $plugin_data );\n\t\t\t\tif ( $plugin_data )\n\t\t\t\t\treturn $plugin_data['Name'];\n\t\t\t\tbreak;\n\t\t}\n\t\treturn '';\n\t}\n\n}\n\n/**\n * Core class used for updating core.\n *\n * It allows for WordPress to upgrade itself in combination with\n * the wp-admin/includes/update-core.php file.\n *\n * @since 2.8.0\n *\n * @see WP_Upgrader\n */\nclass Core_Upgrader extends WP_Upgrader {\n\n\t/**\n\t * Initialize the upgrade strings.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function upgrade_strings() {\n\t\t$this->strings['up_to_date'] = __('WordPress is at the latest version.');\n\t\t$this->strings['no_package'] = __('Update package not available.');\n\t\t$this->strings['downloading_package'] = __('Downloading update from <span class=\"code\">%s</span>&#8230;');\n\t\t$this->strings['unpack_package'] = __('Unpacking the update&#8230;');\n\t\t$this->strings['copy_failed'] = __('Could not copy files.');\n\t\t$this->strings['copy_failed_space'] = __('Could not copy files. You may have run out of disk space.' );\n\t\t$this->strings['start_rollback'] = __( 'Attempting to roll back to previous version.' );\n\t\t$this->strings['rollback_was_required'] = __( 'Due to an error during updating, WordPress has rolled back to your previous version.' );\n\t}\n\n\t/**\n\t * Upgrade WordPress core.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global WP_Filesystem_Base $wp_filesystem Subclass\n\t * @global callable           $_wp_filesystem_direct_method\n\t *\n\t * @param object $current Response object for whether WordPress is current.\n\t * @param array  $args {\n\t *        Optional. Arguments for upgrading WordPress core. Default empty array.\n\t *\n\t *        @type bool $pre_check_md5    Whether to check the file checksums before\n\t *                                     attempting the upgrade. Default true.\n\t *        @type bool $attempt_rollback Whether to attempt to rollback the chances if\n\t *                                     there is a problem. Default false.\n\t *        @type bool $do_rollback      Whether to perform this \"upgrade\" as a rollback.\n\t *                                     Default false.\n\t * }\n\t * @return null|false|WP_Error False or WP_Error on failure, null on success.\n\t */\n\tpublic function upgrade( $current, $args = array() ) {\n\t\tglobal $wp_filesystem;\n\n\t\tinclude( ABSPATH . WPINC . '/version.php' ); // $wp_version;\n\n\t\t$start_time = time();\n\n\t\t$defaults = array(\n\t\t\t'pre_check_md5'    => true,\n\t\t\t'attempt_rollback' => false,\n\t\t\t'do_rollback'      => false,\n\t\t\t'allow_relaxed_file_ownership' => false,\n\t\t);\n\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t$this->init();\n\t\t$this->upgrade_strings();\n\n\t\t// Is an update available?\n\t\tif ( !isset( $current->response ) || $current->response == 'latest' )\n\t\t\treturn new WP_Error('up_to_date', $this->strings['up_to_date']);\n\n\t\t$res = $this->fs_connect( array( ABSPATH, WP_CONTENT_DIR ), $parsed_args['allow_relaxed_file_ownership'] );\n\t\tif ( ! $res || is_wp_error( $res ) ) {\n\t\t\treturn $res;\n\t\t}\n\n\t\t$wp_dir = trailingslashit($wp_filesystem->abspath());\n\n\t\t$partial = true;\n\t\tif ( $parsed_args['do_rollback'] )\n\t\t\t$partial = false;\n\t\telseif ( $parsed_args['pre_check_md5'] && ! $this->check_files() )\n\t\t\t$partial = false;\n\n\t\t/*\n\t\t * If partial update is returned from the API, use that, unless we're doing\n\t\t * a reinstall. If we cross the new_bundled version number, then use\n\t\t * the new_bundled zip. Don't though if the constant is set to skip bundled items.\n\t\t * If the API returns a no_content zip, go with it. Finally, default to the full zip.\n\t\t */\n\t\tif ( $parsed_args['do_rollback'] && $current->packages->rollback )\n\t\t\t$to_download = 'rollback';\n\t\telseif ( $current->packages->partial && 'reinstall' != $current->response && $wp_version == $current->partial_version && $partial )\n\t\t\t$to_download = 'partial';\n\t\telseif ( $current->packages->new_bundled && version_compare( $wp_version, $current->new_bundled, '<' )\n\t\t\t&& ( ! defined( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) )\n\t\t\t$to_download = 'new_bundled';\n\t\telseif ( $current->packages->no_content )\n\t\t\t$to_download = 'no_content';\n\t\telse\n\t\t\t$to_download = 'full';\n\n\t\t$download = $this->download_package( $current->packages->$to_download );\n\t\tif ( is_wp_error($download) )\n\t\t\treturn $download;\n\n\t\t$working_dir = $this->unpack_package( $download );\n\t\tif ( is_wp_error($working_dir) )\n\t\t\treturn $working_dir;\n\n\t\t// Copy update-core.php from the new version into place.\n\t\tif ( !$wp_filesystem->copy($working_dir . '/wordpress/wp-admin/includes/update-core.php', $wp_dir . 'wp-admin/includes/update-core.php', true) ) {\n\t\t\t$wp_filesystem->delete($working_dir, true);\n\t\t\treturn new WP_Error( 'copy_failed_for_update_core_file', __( 'The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions.' ), 'wp-admin/includes/update-core.php' );\n\t\t}\n\t\t$wp_filesystem->chmod($wp_dir . 'wp-admin/includes/update-core.php', FS_CHMOD_FILE);\n\n\t\trequire_once( ABSPATH . 'wp-admin/includes/update-core.php' );\n\n\t\tif ( ! function_exists( 'update_core' ) )\n\t\t\treturn new WP_Error( 'copy_failed_space', $this->strings['copy_failed_space'] );\n\n\t\t$result = update_core( $working_dir, $wp_dir );\n\n\t\t// In the event of an issue, we may be able to roll back.\n\t\tif ( $parsed_args['attempt_rollback'] && $current->packages->rollback && ! $parsed_args['do_rollback'] ) {\n\t\t\t$try_rollback = false;\n\t\t\tif ( is_wp_error( $result ) ) {\n\t\t\t\t$error_code = $result->get_error_code();\n\t\t\t\t/*\n\t\t\t\t * Not all errors are equal. These codes are critical: copy_failed__copy_dir,\n\t\t\t\t * mkdir_failed__copy_dir, copy_failed__copy_dir_retry, and disk_full.\n\t\t\t\t * do_rollback allows for update_core() to trigger a rollback if needed.\n\t\t\t\t */\n\t\t\t\tif ( false !== strpos( $error_code, 'do_rollback' ) )\n\t\t\t\t\t$try_rollback = true;\n\t\t\t\telseif ( false !== strpos( $error_code, '__copy_dir' ) )\n\t\t\t\t\t$try_rollback = true;\n\t\t\t\telseif ( 'disk_full' === $error_code )\n\t\t\t\t\t$try_rollback = true;\n\t\t\t}\n\n\t\t\tif ( $try_rollback ) {\n\t\t\t\t/** This filter is documented in wp-admin/includes/update-core.php */\n\t\t\t\tapply_filters( 'update_feedback', $result );\n\n\t\t\t\t/** This filter is documented in wp-admin/includes/update-core.php */\n\t\t\t\tapply_filters( 'update_feedback', $this->strings['start_rollback'] );\n\n\t\t\t\t$rollback_result = $this->upgrade( $current, array_merge( $parsed_args, array( 'do_rollback' => true ) ) );\n\n\t\t\t\t$original_result = $result;\n\t\t\t\t$result = new WP_Error( 'rollback_was_required', $this->strings['rollback_was_required'], (object) array( 'update' => $original_result, 'rollback' => $rollback_result ) );\n\t\t\t}\n\t\t}\n\n\t\t/** This action is documented in wp-admin/includes/class-wp-upgrader.php */\n\t\tdo_action( 'upgrader_process_complete', $this, array( 'action' => 'update', 'type' => 'core' ) );\n\n\t\t// Clear the current updates\n\t\tdelete_site_transient( 'update_core' );\n\n\t\tif ( ! $parsed_args['do_rollback'] ) {\n\t\t\t$stats = array(\n\t\t\t\t'update_type'      => $current->response,\n\t\t\t\t'success'          => true,\n\t\t\t\t'fs_method'        => $wp_filesystem->method,\n\t\t\t\t'fs_method_forced' => defined( 'FS_METHOD' ) || has_filter( 'filesystem_method' ),\n\t\t\t\t'fs_method_direct' => !empty( $GLOBALS['_wp_filesystem_direct_method'] ) ? $GLOBALS['_wp_filesystem_direct_method'] : '',\n\t\t\t\t'time_taken'       => time() - $start_time,\n\t\t\t\t'reported'         => $wp_version,\n\t\t\t\t'attempted'        => $current->version,\n\t\t\t);\n\n\t\t\tif ( is_wp_error( $result ) ) {\n\t\t\t\t$stats['success'] = false;\n\t\t\t\t// Did a rollback occur?\n\t\t\t\tif ( ! empty( $try_rollback ) ) {\n\t\t\t\t\t$stats['error_code'] = $original_result->get_error_code();\n\t\t\t\t\t$stats['error_data'] = $original_result->get_error_data();\n\t\t\t\t\t// Was the rollback successful? If not, collect its error too.\n\t\t\t\t\t$stats['rollback'] = ! is_wp_error( $rollback_result );\n\t\t\t\t\tif ( is_wp_error( $rollback_result ) ) {\n\t\t\t\t\t\t$stats['rollback_code'] = $rollback_result->get_error_code();\n\t\t\t\t\t\t$stats['rollback_data'] = $rollback_result->get_error_data();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$stats['error_code'] = $result->get_error_code();\n\t\t\t\t\t$stats['error_data'] = $result->get_error_data();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twp_version_check( $stats );\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t/**\n\t * Determines if this WordPress Core version should update to an offered version or not.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @static\n\t *\n\t * @param string $offered_ver The offered version, of the format x.y.z.\n\t * @return bool True if we should update to the offered version, otherwise false.\n\t */\n\tpublic static function should_update_to_version( $offered_ver ) {\n\t\tinclude( ABSPATH . WPINC . '/version.php' ); // $wp_version; // x.y.z\n\n\t\t$current_branch = implode( '.', array_slice( preg_split( '/[.-]/', $wp_version  ), 0, 2 ) ); // x.y\n\t\t$new_branch     = implode( '.', array_slice( preg_split( '/[.-]/', $offered_ver ), 0, 2 ) ); // x.y\n\t\t$current_is_development_version = (bool) strpos( $wp_version, '-' );\n\n\t\t// Defaults:\n\t\t$upgrade_dev   = true;\n\t\t$upgrade_minor = true;\n\t\t$upgrade_major = false;\n\n\t\t// WP_AUTO_UPDATE_CORE = true (all), 'minor', false.\n\t\tif ( defined( 'WP_AUTO_UPDATE_CORE' ) ) {\n\t\t\tif ( false === WP_AUTO_UPDATE_CORE ) {\n\t\t\t\t// Defaults to turned off, unless a filter allows it\n\t\t\t\t$upgrade_dev = $upgrade_minor = $upgrade_major = false;\n\t\t\t} elseif ( true === WP_AUTO_UPDATE_CORE ) {\n\t\t\t\t// ALL updates for core\n\t\t\t\t$upgrade_dev = $upgrade_minor = $upgrade_major = true;\n\t\t\t} elseif ( 'minor' === WP_AUTO_UPDATE_CORE ) {\n\t\t\t\t// Only minor updates for core\n\t\t\t\t$upgrade_dev = $upgrade_major = false;\n\t\t\t\t$upgrade_minor = true;\n\t\t\t}\n\t\t}\n\n\t\t// 1: If we're already on that version, not much point in updating?\n\t\tif ( $offered_ver == $wp_version )\n\t\t\treturn false;\n\n\t\t// 2: If we're running a newer version, that's a nope\n\t\tif ( version_compare( $wp_version, $offered_ver, '>' ) )\n\t\t\treturn false;\n\n\t\t$failure_data = get_site_option( 'auto_core_update_failed' );\n\t\tif ( $failure_data ) {\n\t\t\t// If this was a critical update failure, cannot update.\n\t\t\tif ( ! empty( $failure_data['critical'] ) )\n\t\t\t\treturn false;\n\n\t\t\t// Don't claim we can update on update-core.php if we have a non-critical failure logged.\n\t\t\tif ( $wp_version == $failure_data['current'] && false !== strpos( $offered_ver, '.1.next.minor' ) )\n\t\t\t\treturn false;\n\n\t\t\t// Cannot update if we're retrying the same A to B update that caused a non-critical failure.\n\t\t\t// Some non-critical failures do allow retries, like download_failed.\n\t\t\t// 3.7.1 => 3.7.2 resulted in files_not_writable, if we are still on 3.7.1 and still trying to update to 3.7.2.\n\t\t\tif ( empty( $failure_data['retry'] ) && $wp_version == $failure_data['current'] && $offered_ver == $failure_data['attempted'] )\n\t\t\t\treturn false;\n\t\t}\n\n\t\t// 3: 3.7-alpha-25000 -> 3.7-alpha-25678 -> 3.7-beta1 -> 3.7-beta2\n\t\tif ( $current_is_development_version ) {\n\n\t\t\t/**\n\t\t\t * Filter whether to enable automatic core updates for development versions.\n\t\t\t *\n\t\t\t * @since 3.7.0\n\t\t\t *\n\t\t\t * @param bool $upgrade_dev Whether to enable automatic updates for\n\t\t\t *                          development versions.\n\t\t\t */\n\t\t\tif ( ! apply_filters( 'allow_dev_auto_core_updates', $upgrade_dev ) )\n\t\t\t\treturn false;\n\t\t\t// Else fall through to minor + major branches below.\n\t\t}\n\n\t\t// 4: Minor In-branch updates (3.7.0 -> 3.7.1 -> 3.7.2 -> 3.7.4)\n\t\tif ( $current_branch == $new_branch ) {\n\n\t\t\t/**\n\t\t\t * Filter whether to enable minor automatic core updates.\n\t\t\t *\n\t\t\t * @since 3.7.0\n\t\t\t *\n\t\t\t * @param bool $upgrade_minor Whether to enable minor automatic core updates.\n\t\t\t */\n\t\t\treturn apply_filters( 'allow_minor_auto_core_updates', $upgrade_minor );\n\t\t}\n\n\t\t// 5: Major version updates (3.7.0 -> 3.8.0 -> 3.9.1)\n\t\tif ( version_compare( $new_branch, $current_branch, '>' ) ) {\n\n\t\t\t/**\n\t\t\t * Filter whether to enable major automatic core updates.\n\t\t\t *\n\t\t\t * @since 3.7.0\n\t\t\t *\n\t\t\t * @param bool $upgrade_major Whether to enable major automatic core updates.\n\t\t\t */\n\t\t\treturn apply_filters( 'allow_major_auto_core_updates', $upgrade_major );\n\t\t}\n\n\t\t// If we're not sure, we don't want it\n\t\treturn false;\n\t}\n\n\t/**\n\t * Compare the disk file checksums against the expected checksums.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @global string $wp_version\n\t * @global string $wp_local_package\n\t *\n\t * @return bool True if the checksums match, otherwise false.\n\t */\n\tpublic function check_files() {\n\t\tglobal $wp_version, $wp_local_package;\n\n\t\t$checksums = get_core_checksums( $wp_version, isset( $wp_local_package ) ? $wp_local_package : 'en_US' );\n\n\t\tif ( ! is_array( $checksums ) )\n\t\t\treturn false;\n\n\t\tforeach ( $checksums as $file => $checksum ) {\n\t\t\t// Skip files which get updated\n\t\t\tif ( 'wp-content' == substr( $file, 0, 10 ) )\n\t\t\t\tcontinue;\n\t\t\tif ( ! file_exists( ABSPATH . $file ) || md5_file( ABSPATH . $file ) !== $checksum )\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n}\n\n/**\n * Core class used for handling file uploads.\n *\n * This class handles the upload process and passes it as if it's a local file\n * to the Upgrade/Installer functions.\n *\n * @since 2.8.0\n */\nclass File_Upload_Upgrader {\n\n\t/**\n\t * The full path to the file package.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var string $package\n\t */\n\tpublic $package;\n\n\t/**\n\t * The name of the file.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var string $filename\n\t */\n\tpublic $filename;\n\n\t/**\n\t * The ID of the attachment post for this file.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t * @var int $id\n\t */\n\tpublic $id = 0;\n\n\t/**\n\t * Construct the upgrader for a form.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param string $form      The name of the form the file was uploaded from.\n\t * @param string $urlholder The name of the `GET` parameter that holds the filename.\n\t */\n\tpublic function __construct( $form, $urlholder ) {\n\n\t\tif ( empty($_FILES[$form]['name']) && empty($_GET[$urlholder]) )\n\t\t\twp_die(__('Please select a file'));\n\n\t\t//Handle a newly uploaded file, Else assume it's already been uploaded\n\t\tif ( ! empty($_FILES) ) {\n\t\t\t$overrides = array( 'test_form' => false, 'test_type' => false );\n\t\t\t$file = wp_handle_upload( $_FILES[$form], $overrides );\n\n\t\t\tif ( isset( $file['error'] ) )\n\t\t\t\twp_die( $file['error'] );\n\n\t\t\t$this->filename = $_FILES[$form]['name'];\n\t\t\t$this->package = $file['file'];\n\n\t\t\t// Construct the object array\n\t\t\t$object = array(\n\t\t\t\t'post_title' => $this->filename,\n\t\t\t\t'post_content' => $file['url'],\n\t\t\t\t'post_mime_type' => $file['type'],\n\t\t\t\t'guid' => $file['url'],\n\t\t\t\t'context' => 'upgrader',\n\t\t\t\t'post_status' => 'private'\n\t\t\t);\n\n\t\t\t// Save the data.\n\t\t\t$this->id = wp_insert_attachment( $object, $file['file'] );\n\n\t\t\t// Schedule a cleanup for 2 hours from now in case of failed install.\n\t\t\twp_schedule_single_event( time() + 2 * HOUR_IN_SECONDS, 'upgrader_scheduled_cleanup', array( $this->id ) );\n\n\t\t} elseif ( is_numeric( $_GET[$urlholder] ) ) {\n\t\t\t// Numeric Package = previously uploaded file, see above.\n\t\t\t$this->id = (int) $_GET[$urlholder];\n\t\t\t$attachment = get_post( $this->id );\n\t\t\tif ( empty($attachment) )\n\t\t\t\twp_die(__('Please select a file'));\n\n\t\t\t$this->filename = $attachment->post_title;\n\t\t\t$this->package = get_attached_file( $attachment->ID );\n\t\t} else {\n\t\t\t// Else, It's set to something, Back compat for plugins using the old (pre-3.3) File_Uploader handler.\n\t\t\tif ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) )\n\t\t\t\twp_die( $uploads['error'] );\n\n\t\t\t$this->filename = $_GET[$urlholder];\n\t\t\t$this->package = $uploads['basedir'] . '/' . $this->filename;\n\t\t}\n\t}\n\n\t/**\n\t * Delete the attachment/uploaded file.\n\t *\n\t * @since 3.2.2\n\t * @access public\n\t *\n\t * @return bool Whether the cleanup was successful.\n\t */\n\tpublic function cleanup() {\n\t\tif ( $this->id )\n\t\t\twp_delete_attachment( $this->id );\n\n\t\telseif ( file_exists( $this->package ) )\n\t\t\treturn @unlink( $this->package );\n\n\t\treturn true;\n\t}\n}\n\n/**\n * Core class used for handling automatic background updates.\n *\n * @since 3.7.0\n */\nclass WP_Automatic_Updater {\n\n\t/**\n\t * Tracks update results during processing.\n\t *\n\t * @var array\n\t * @access protected\n\t */\n\tprotected $update_results = array();\n\n\t/**\n\t * Whether the entire automatic updater is disabled.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t */\n\tpublic function is_disabled() {\n\t\t// Background updates are disabled if you don't want file changes.\n\t\tif ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS )\n\t\t\treturn true;\n\n\t\tif ( wp_installing() )\n\t\t\treturn true;\n\n\t\t// More fine grained control can be done through the WP_AUTO_UPDATE_CORE constant and filters.\n\t\t$disabled = defined( 'AUTOMATIC_UPDATER_DISABLED' ) && AUTOMATIC_UPDATER_DISABLED;\n\n\t\t/**\n\t\t * Filter whether to entirely disable background updates.\n\t\t *\n\t\t * There are more fine-grained filters and controls for selective disabling.\n\t\t * This filter parallels the AUTOMATIC_UPDATER_DISABLED constant in name.\n\t\t *\n\t\t * This also disables update notification emails. That may change in the future.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param bool $disabled Whether the updater should be disabled.\n\t\t */\n\t\treturn apply_filters( 'automatic_updater_disabled', $disabled );\n\t}\n\n\t/**\n\t * Check for version control checkouts.\n\t *\n\t * Checks for Subversion, Git, Mercurial, and Bazaar. It recursively looks up the\n\t * filesystem to the top of the drive, erring on the side of detecting a VCS\n\t * checkout somewhere.\n\t *\n\t * ABSPATH is always checked in addition to whatever $context is (which may be the\n\t * wp-content directory, for example). The underlying assumption is that if you are\n\t * using version control *anywhere*, then you should be making decisions for\n\t * how things get updated.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param string $context The filesystem path to check, in addition to ABSPATH.\n\t */\n\tpublic function is_vcs_checkout( $context ) {\n\t\t$context_dirs = array( untrailingslashit( $context ) );\n\t\tif ( $context !== ABSPATH )\n\t\t\t$context_dirs[] = untrailingslashit( ABSPATH );\n\n\t\t$vcs_dirs = array( '.svn', '.git', '.hg', '.bzr' );\n\t\t$check_dirs = array();\n\n\t\tforeach ( $context_dirs as $context_dir ) {\n\t\t\t// Walk up from $context_dir to the root.\n\t\t\tdo {\n\t\t\t\t$check_dirs[] = $context_dir;\n\n\t\t\t\t// Once we've hit '/' or 'C:\\', we need to stop. dirname will keep returning the input here.\n\t\t\t\tif ( $context_dir == dirname( $context_dir ) )\n\t\t\t\t\tbreak;\n\n\t\t\t// Continue one level at a time.\n\t\t\t} while ( $context_dir = dirname( $context_dir ) );\n\t\t}\n\n\t\t$check_dirs = array_unique( $check_dirs );\n\n\t\t// Search all directories we've found for evidence of version control.\n\t\tforeach ( $vcs_dirs as $vcs_dir ) {\n\t\t\tforeach ( $check_dirs as $check_dir ) {\n\t\t\t\tif ( $checkout = @is_dir( rtrim( $check_dir, '\\\\/' ) . \"/$vcs_dir\" ) )\n\t\t\t\t\tbreak 2;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter whether the automatic updater should consider a filesystem\n\t\t * location to be potentially managed by a version control system.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param bool $checkout  Whether a VCS checkout was discovered at $context\n\t\t *                        or ABSPATH, or anywhere higher.\n\t\t * @param string $context The filesystem context (a path) against which\n\t\t *                        filesystem status should be checked.\n\t\t */\n\t\treturn apply_filters( 'automatic_updates_is_vcs_checkout', $checkout, $context );\n\t}\n\n\t/**\n\t * Tests to see if we can and should update a specific item.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $type    The type of update being checked: 'core', 'theme',\n\t *                        'plugin', 'translation'.\n\t * @param object $item    The update offer.\n\t * @param string $context The filesystem context (a path) against which filesystem\n\t *                        access and status should be checked.\n\t */\n\tpublic function should_update( $type, $item, $context ) {\n\t\t// Used to see if WP_Filesystem is set up to allow unattended updates.\n\t\t$skin = new Automatic_Upgrader_Skin;\n\n\t\tif ( $this->is_disabled() )\n\t\t\treturn false;\n\n\t\t// Only relax the filesystem checks when the update doesn't include new files\n\t\t$allow_relaxed_file_ownership = false;\n\t\tif ( 'core' == $type && isset( $item->new_files ) && ! $item->new_files ) {\n\t\t\t$allow_relaxed_file_ownership = true;\n\t\t}\n\n\t\t// If we can't do an auto core update, we may still be able to email the user.\n\t\tif ( ! $skin->request_filesystem_credentials( false, $context, $allow_relaxed_file_ownership ) || $this->is_vcs_checkout( $context ) ) {\n\t\t\tif ( 'core' == $type )\n\t\t\t\t$this->send_core_update_notification_email( $item );\n\t\t\treturn false;\n\t\t}\n\n\t\t// Next up, is this an item we can update?\n\t\tif ( 'core' == $type )\n\t\t\t$update = Core_Upgrader::should_update_to_version( $item->current );\n\t\telse\n\t\t\t$update = ! empty( $item->autoupdate );\n\n\t\t/**\n\t\t * Filter whether to automatically update core, a plugin, a theme, or a language.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$type`, refers to the type of update\n\t\t * being checked. Can be 'core', 'theme', 'plugin', or 'translation'.\n\t\t *\n\t\t * Generally speaking, plugins, themes, and major core versions are not updated\n\t\t * by default, while translations and minor and development versions for core\n\t\t * are updated by default.\n\t\t *\n\t\t * See the {@see 'allow_dev_auto_core_updates', {@see 'allow_minor_auto_core_updates'},\n\t\t * and {@see 'allow_major_auto_core_updates'} filters for a more straightforward way to\n\t\t * adjust core updates.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param bool   $update Whether to update.\n\t\t * @param object $item   The update offer.\n\t\t */\n\t\t$update = apply_filters( 'auto_update_' . $type, $update, $item );\n\n\t\tif ( ! $update ) {\n\t\t\tif ( 'core' == $type )\n\t\t\t\t$this->send_core_update_notification_email( $item );\n\t\t\treturn false;\n\t\t}\n\n\t\t// If it's a core update, are we actually compatible with its requirements?\n\t\tif ( 'core' == $type ) {\n\t\t\tglobal $wpdb;\n\n\t\t\t$php_compat = version_compare( phpversion(), $item->php_version, '>=' );\n\t\t\tif ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) )\n\t\t\t\t$mysql_compat = true;\n\t\t\telse\n\t\t\t\t$mysql_compat = version_compare( $wpdb->db_version(), $item->mysql_version, '>=' );\n\n\t\t\tif ( ! $php_compat || ! $mysql_compat )\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Notifies an administrator of a core update.\n\t *\n\t * @since 3.7.0\n\t * @access protected\n\t *\n\t * @param object $item The update offer.\n\t */\n\tprotected function send_core_update_notification_email( $item ) {\n\t\t$notified = get_site_option( 'auto_core_update_notified' );\n\n\t\t// Don't notify if we've already notified the same email address of the same version.\n\t\tif ( $notified && $notified['email'] == get_site_option( 'admin_email' ) && $notified['version'] == $item->current )\n\t\t\treturn false;\n\n\t\t// See if we need to notify users of a core update.\n\t\t$notify = ! empty( $item->notify_email );\n\n\t\t/**\n\t\t * Filter whether to notify the site administrator of a new core update.\n\t\t *\n\t\t * By default, administrators are notified when the update offer received\n\t\t * from WordPress.org sets a particular flag. This allows some discretion\n\t\t * in if and when to notify.\n\t\t *\n\t\t * This filter is only evaluated once per release. If the same email address\n\t\t * was already notified of the same new version, WordPress won't repeatedly\n\t\t * email the administrator.\n\t\t *\n\t\t * This filter is also used on about.php to check if a plugin has disabled\n\t\t * these notifications.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param bool   $notify Whether the site administrator is notified.\n\t\t * @param object $item   The update offer.\n\t\t */\n\t\tif ( ! apply_filters( 'send_core_update_notification_email', $notify, $item ) )\n\t\t\treturn false;\n\n\t\t$this->send_email( 'manual', $item );\n\t\treturn true;\n\t}\n\n\t/**\n\t * Update an item, if appropriate.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param string $type The type of update being checked: 'core', 'theme', 'plugin', 'translation'.\n\t * @param object $item The update offer.\n\t *\n\t * @return null|WP_Error\n\t */\n\tpublic function update( $type, $item ) {\n\t\t$skin = new Automatic_Upgrader_Skin;\n\n\t\tswitch ( $type ) {\n\t\t\tcase 'core':\n\t\t\t\t// The Core upgrader doesn't use the Upgrader's skin during the actual main part of the upgrade, instead, firing a filter.\n\t\t\t\tadd_filter( 'update_feedback', array( $skin, 'feedback' ) );\n\t\t\t\t$upgrader = new Core_Upgrader( $skin );\n\t\t\t\t$context  = ABSPATH;\n\t\t\t\tbreak;\n\t\t\tcase 'plugin':\n\t\t\t\t$upgrader = new Plugin_Upgrader( $skin );\n\t\t\t\t$context  = WP_PLUGIN_DIR; // We don't support custom Plugin directories, or updates for WPMU_PLUGIN_DIR\n\t\t\t\tbreak;\n\t\t\tcase 'theme':\n\t\t\t\t$upgrader = new Theme_Upgrader( $skin );\n\t\t\t\t$context  = get_theme_root( $item->theme );\n\t\t\t\tbreak;\n\t\t\tcase 'translation':\n\t\t\t\t$upgrader = new Language_Pack_Upgrader( $skin );\n\t\t\t\t$context  = WP_CONTENT_DIR; // WP_LANG_DIR;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Determine whether we can and should perform this update.\n\t\tif ( ! $this->should_update( $type, $item, $context ) )\n\t\t\treturn false;\n\n\t\t/**\n\t\t * Fires immediately prior to an auto-update.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string $type    The type of update being checked: 'core', 'theme', 'plugin', or 'translation'.\n\t\t * @param object $item    The update offer.\n\t\t * @param string $context The filesystem context (a path) against which filesystem access and status\n\t\t *                        should be checked.\n\t\t */\n\t\tdo_action( 'pre_auto_update', $type, $item, $context );\n\n\t\t$upgrader_item = $item;\n\t\tswitch ( $type ) {\n\t\t\tcase 'core':\n\t\t\t\t$skin->feedback( __( 'Updating to WordPress %s' ), $item->version );\n\t\t\t\t$item_name = sprintf( __( 'WordPress %s' ), $item->version );\n\t\t\t\tbreak;\n\t\t\tcase 'theme':\n\t\t\t\t$upgrader_item = $item->theme;\n\t\t\t\t$theme = wp_get_theme( $upgrader_item );\n\t\t\t\t$item_name = $theme->Get( 'Name' );\n\t\t\t\t$skin->feedback( __( 'Updating theme: %s' ), $item_name );\n\t\t\t\tbreak;\n\t\t\tcase 'plugin':\n\t\t\t\t$upgrader_item = $item->plugin;\n\t\t\t\t$plugin_data = get_plugin_data( $context . '/' . $upgrader_item );\n\t\t\t\t$item_name = $plugin_data['Name'];\n\t\t\t\t$skin->feedback( __( 'Updating plugin: %s' ), $item_name );\n\t\t\t\tbreak;\n\t\t\tcase 'translation':\n\t\t\t\t$language_item_name = $upgrader->get_name_for_update( $item );\n\t\t\t\t$item_name = sprintf( __( 'Translations for %s' ), $language_item_name );\n\t\t\t\t$skin->feedback( sprintf( __( 'Updating translations for %1$s (%2$s)&#8230;' ), $language_item_name, $item->language ) );\n\t\t\t\tbreak;\n\t\t}\n\n\t\t$allow_relaxed_file_ownership = false;\n\t\tif ( 'core' == $type && isset( $item->new_files ) && ! $item->new_files ) {\n\t\t\t$allow_relaxed_file_ownership = true;\n\t\t}\n\n\t\t// Boom, This sites about to get a whole new splash of paint!\n\t\t$upgrade_result = $upgrader->upgrade( $upgrader_item, array(\n\t\t\t'clear_update_cache' => false,\n\t\t\t// Always use partial builds if possible for core updates.\n\t\t\t'pre_check_md5'      => false,\n\t\t\t// Only available for core updates.\n\t\t\t'attempt_rollback'   => true,\n\t\t\t// Allow relaxed file ownership in some scenarios\n\t\t\t'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership,\n\t\t) );\n\n\t\t// If the filesystem is unavailable, false is returned.\n\t\tif ( false === $upgrade_result ) {\n\t\t\t$upgrade_result = new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );\n\t\t}\n\n\t\t// Core doesn't output this, so let's append it so we don't get confused.\n\t\tif ( 'core' == $type ) {\n\t\t\tif ( is_wp_error( $upgrade_result ) ) {\n\t\t\t\t$skin->error( __( 'Installation Failed' ), $upgrade_result );\n\t\t\t} else {\n\t\t\t\t$skin->feedback( __( 'WordPress updated successfully' ) );\n\t\t\t}\n\t\t}\n\n\t\t$this->update_results[ $type ][] = (object) array(\n\t\t\t'item'     => $item,\n\t\t\t'result'   => $upgrade_result,\n\t\t\t'name'     => $item_name,\n\t\t\t'messages' => $skin->get_upgrade_messages()\n\t\t);\n\n\t\treturn $upgrade_result;\n\t}\n\n\t/**\n\t * Kicks off the background update process, looping through all pending updates.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @global wpdb   $wpdb\n\t * @global string $wp_version\n\t */\n\tpublic function run() {\n\t\tglobal $wpdb, $wp_version;\n\n\t\tif ( $this->is_disabled() )\n\t\t\treturn;\n\n\t\tif ( ! is_main_network() || ! is_main_site() )\n\t\t\treturn;\n\n\t\t$lock_name = 'auto_updater.lock';\n\n\t\t// Try to lock\n\t\t$lock_result = $wpdb->query( $wpdb->prepare( \"INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */\", $lock_name, time() ) );\n\n\t\tif ( ! $lock_result ) {\n\t\t\t$lock_result = get_option( $lock_name );\n\n\t\t\t// If we couldn't create a lock, and there isn't a lock, bail\n\t\t\tif ( ! $lock_result )\n\t\t\t\treturn;\n\n\t\t\t// Check to see if the lock is still valid\n\t\t\tif ( $lock_result > ( time() - HOUR_IN_SECONDS ) )\n\t\t\t\treturn;\n\t\t}\n\n\t\t// Update the lock, as by this point we've definitely got a lock, just need to fire the actions\n\t\tupdate_option( $lock_name, time() );\n\n\t\t// Don't automatically run these thins, as we'll handle it ourselves\n\t\tremove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );\n\t\tremove_action( 'upgrader_process_complete', 'wp_version_check' );\n\t\tremove_action( 'upgrader_process_complete', 'wp_update_plugins' );\n\t\tremove_action( 'upgrader_process_complete', 'wp_update_themes' );\n\n\t\t// Next, Plugins\n\t\twp_update_plugins(); // Check for Plugin updates\n\t\t$plugin_updates = get_site_transient( 'update_plugins' );\n\t\tif ( $plugin_updates && !empty( $plugin_updates->response ) ) {\n\t\t\tforeach ( $plugin_updates->response as $plugin ) {\n\t\t\t\t$this->update( 'plugin', $plugin );\n\t\t\t}\n\t\t\t// Force refresh of plugin update information\n\t\t\twp_clean_plugins_cache();\n\t\t}\n\n\t\t// Next, those themes we all love\n\t\twp_update_themes();  // Check for Theme updates\n\t\t$theme_updates = get_site_transient( 'update_themes' );\n\t\tif ( $theme_updates && !empty( $theme_updates->response ) ) {\n\t\t\tforeach ( $theme_updates->response as $theme ) {\n\t\t\t\t$this->update( 'theme', (object) $theme );\n\t\t\t}\n\t\t\t// Force refresh of theme update information\n\t\t\twp_clean_themes_cache();\n\t\t}\n\n\t\t// Next, Process any core update\n\t\twp_version_check(); // Check for Core updates\n\t\t$core_update = find_core_auto_update();\n\n\t\tif ( $core_update )\n\t\t\t$this->update( 'core', $core_update );\n\n\t\t// Clean up, and check for any pending translations\n\t\t// (Core_Upgrader checks for core updates)\n\t\t$theme_stats = array();\n\t\tif ( isset( $this->update_results['theme'] ) ) {\n\t\t\tforeach ( $this->update_results['theme'] as $upgrade ) {\n\t\t\t\t$theme_stats[ $upgrade->item->theme ] = ( true === $upgrade->result );\n\t\t\t}\n\t\t}\n\t\twp_update_themes( $theme_stats );  // Check for Theme updates\n\n\t\t$plugin_stats = array();\n\t\tif ( isset( $this->update_results['plugin'] ) ) {\n\t\t\tforeach ( $this->update_results['plugin'] as $upgrade ) {\n\t\t\t\t$plugin_stats[ $upgrade->item->plugin ] = ( true === $upgrade->result );\n\t\t\t}\n\t\t}\n\t\twp_update_plugins( $plugin_stats ); // Check for Plugin updates\n\n\t\t// Finally, Process any new translations\n\t\t$language_updates = wp_get_translation_updates();\n\t\tif ( $language_updates ) {\n\t\t\tforeach ( $language_updates as $update ) {\n\t\t\t\t$this->update( 'translation', $update );\n\t\t\t}\n\n\t\t\t// Clear existing caches\n\t\t\twp_clean_update_cache();\n\n\t\t\twp_version_check();  // check for Core updates\n\t\t\twp_update_themes();  // Check for Theme updates\n\t\t\twp_update_plugins(); // Check for Plugin updates\n\t\t}\n\n\t\t// Send debugging email to all development installs.\n\t\tif ( ! empty( $this->update_results ) ) {\n\t\t\t$development_version = false !== strpos( $wp_version, '-' );\n\n\t\t\t/**\n\t\t\t * Filter whether to send a debugging email for each automatic background update.\n\t\t\t *\n\t\t\t * @since 3.7.0\n\t\t\t *\n\t\t\t * @param bool $development_version By default, emails are sent if the\n\t\t\t *                                  install is a development version.\n\t\t\t *                                  Return false to avoid the email.\n\t\t\t */\n\t\t\tif ( apply_filters( 'automatic_updates_send_debug_email', $development_version ) )\n\t\t\t\t$this->send_debug_email();\n\n\t\t\tif ( ! empty( $this->update_results['core'] ) )\n\t\t\t\t$this->after_core_update( $this->update_results['core'][0] );\n\n\t\t\t/**\n\t\t\t * Fires after all automatic updates have run.\n\t\t\t *\n\t\t\t * @since 3.8.0\n\t\t\t *\n\t\t\t * @param array $update_results The results of all attempted updates.\n\t\t\t */\n\t\t\tdo_action( 'automatic_updates_complete', $this->update_results );\n\t\t}\n\n\t\t// Clear the lock\n\t\tdelete_option( $lock_name );\n\t}\n\n\t/**\n\t * If we tried to perform a core update, check if we should send an email,\n\t * and if we need to avoid processing future updates.\n\t *\n\t * @since Unknown\n\t * @access protected\n\t *\n\t * @global string $wp_version\n\t *\n\t * @param object|WP_Error $update_result The result of the core update. Includes the update offer and result.\n\t */\n\tprotected function after_core_update( $update_result ) {\n\t\tglobal $wp_version;\n\n\t\t$core_update = $update_result->item;\n\t\t$result      = $update_result->result;\n\n\t\tif ( ! is_wp_error( $result ) ) {\n\t\t\t$this->send_email( 'success', $core_update );\n\t\t\treturn;\n\t\t}\n\n\t\t$error_code = $result->get_error_code();\n\n\t\t// Any of these WP_Error codes are critical failures, as in they occurred after we started to copy core files.\n\t\t// We should not try to perform a background update again until there is a successful one-click update performed by the user.\n\t\t$critical = false;\n\t\tif ( $error_code === 'disk_full' || false !== strpos( $error_code, '__copy_dir' ) ) {\n\t\t\t$critical = true;\n\t\t} elseif ( $error_code === 'rollback_was_required' && is_wp_error( $result->get_error_data()->rollback ) ) {\n\t\t\t// A rollback is only critical if it failed too.\n\t\t\t$critical = true;\n\t\t\t$rollback_result = $result->get_error_data()->rollback;\n\t\t} elseif ( false !== strpos( $error_code, 'do_rollback' ) ) {\n\t\t\t$critical = true;\n\t\t}\n\n\t\tif ( $critical ) {\n\t\t\t$critical_data = array(\n\t\t\t\t'attempted'  => $core_update->current,\n\t\t\t\t'current'    => $wp_version,\n\t\t\t\t'error_code' => $error_code,\n\t\t\t\t'error_data' => $result->get_error_data(),\n\t\t\t\t'timestamp'  => time(),\n\t\t\t\t'critical'   => true,\n\t\t\t);\n\t\t\tif ( isset( $rollback_result ) ) {\n\t\t\t\t$critical_data['rollback_code'] = $rollback_result->get_error_code();\n\t\t\t\t$critical_data['rollback_data'] = $rollback_result->get_error_data();\n\t\t\t}\n\t\t\tupdate_site_option( 'auto_core_update_failed', $critical_data );\n\t\t\t$this->send_email( 'critical', $core_update, $result );\n\t\t\treturn;\n\t\t}\n\n\t\t/*\n\t\t * Any other WP_Error code (like download_failed or files_not_writable) occurs before\n\t\t * we tried to copy over core files. Thus, the failures are early and graceful.\n\t\t *\n\t\t * We should avoid trying to perform a background update again for the same version.\n\t\t * But we can try again if another version is released.\n\t\t *\n\t\t * For certain 'transient' failures, like download_failed, we should allow retries.\n\t\t * In fact, let's schedule a special update for an hour from now. (It's possible\n\t\t * the issue could actually be on WordPress.org's side.) If that one fails, then email.\n\t\t */\n\t\t$send = true;\n  \t\t$transient_failures = array( 'incompatible_archive', 'download_failed', 'insane_distro' );\n  \t\tif ( in_array( $error_code, $transient_failures ) && ! get_site_option( 'auto_core_update_failed' ) ) {\n  \t\t\twp_schedule_single_event( time() + HOUR_IN_SECONDS, 'wp_maybe_auto_update' );\n  \t\t\t$send = false;\n  \t\t}\n\n  \t\t$n = get_site_option( 'auto_core_update_notified' );\n\t\t// Don't notify if we've already notified the same email address of the same version of the same notification type.\n\t\tif ( $n && 'fail' == $n['type'] && $n['email'] == get_site_option( 'admin_email' ) && $n['version'] == $core_update->current )\n\t\t\t$send = false;\n\n\t\tupdate_site_option( 'auto_core_update_failed', array(\n\t\t\t'attempted'  => $core_update->current,\n\t\t\t'current'    => $wp_version,\n\t\t\t'error_code' => $error_code,\n\t\t\t'error_data' => $result->get_error_data(),\n\t\t\t'timestamp'  => time(),\n\t\t\t'retry'      => in_array( $error_code, $transient_failures ),\n\t\t) );\n\n\t\tif ( $send )\n\t\t\t$this->send_email( 'fail', $core_update, $result );\n\t}\n\n\t/**\n\t * Sends an email upon the completion or failure of a background core update.\n\t *\n\t * @since 3.7.0\n\t * @access protected\n\t *\n\t * @global string $wp_version\n\t *\n\t * @param string $type        The type of email to send. Can be one of 'success', 'fail', 'manual', 'critical'.\n\t * @param object $core_update The update offer that was attempted.\n\t * @param mixed  $result      Optional. The result for the core update. Can be WP_Error.\n\t */\n\tprotected function send_email( $type, $core_update, $result = null ) {\n\t\tupdate_site_option( 'auto_core_update_notified', array(\n\t\t\t'type'      => $type,\n\t\t\t'email'     => get_site_option( 'admin_email' ),\n\t\t\t'version'   => $core_update->current,\n\t\t\t'timestamp' => time(),\n\t\t) );\n\n\t\t$next_user_core_update = get_preferred_from_update_core();\n\t\t// If the update transient is empty, use the update we just performed\n\t\tif ( ! $next_user_core_update )\n\t\t\t$next_user_core_update = $core_update;\n\t\t$newer_version_available = ( 'upgrade' == $next_user_core_update->response && version_compare( $next_user_core_update->version, $core_update->version, '>' ) );\n\n\t\t/**\n\t\t * Filter whether to send an email following an automatic background core update.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param bool   $send        Whether to send the email. Default true.\n\t\t * @param string $type        The type of email to send. Can be one of\n\t\t *                            'success', 'fail', 'critical'.\n\t\t * @param object $core_update The update offer that was attempted.\n\t\t * @param mixed  $result      The result for the core update. Can be WP_Error.\n\t\t */\n\t\tif ( 'manual' !== $type && ! apply_filters( 'auto_core_update_send_email', true, $type, $core_update, $result ) )\n\t\t\treturn;\n\n\t\tswitch ( $type ) {\n\t\t\tcase 'success' : // We updated.\n\t\t\t\t/* translators: 1: Site name, 2: WordPress version number. */\n\t\t\t\t$subject = __( '[%1$s] Your site has updated to WordPress %2$s' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'fail' :   // We tried to update but couldn't.\n\t\t\tcase 'manual' : // We can't update (and made no attempt).\n\t\t\t\t/* translators: 1: Site name, 2: WordPress version number. */\n\t\t\t\t$subject = __( '[%1$s] WordPress %2$s is available. Please update!' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'critical' : // We tried to update, started to copy files, then things went wrong.\n\t\t\t\t/* translators: 1: Site name. */\n\t\t\t\t$subject = __( '[%1$s] URGENT: Your site may be down due to a failed update' );\n\t\t\t\tbreak;\n\n\t\t\tdefault :\n\t\t\t\treturn;\n\t\t}\n\n\t\t// If the auto update is not to the latest version, say that the current version of WP is available instead.\n\t\t$version = 'success' === $type ? $core_update->current : $next_user_core_update->current;\n\t\t$subject = sprintf( $subject, wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ), $version );\n\n\t\t$body = '';\n\n\t\tswitch ( $type ) {\n\t\t\tcase 'success' :\n\t\t\t\t$body .= sprintf( __( 'Howdy! Your site at %1$s has been updated automatically to WordPress %2$s.' ), home_url(), $core_update->current );\n\t\t\t\t$body .= \"\\n\\n\";\n\t\t\t\tif ( ! $newer_version_available )\n\t\t\t\t\t$body .= __( 'No further action is needed on your part.' ) . ' ';\n\n\t\t\t\t// Can only reference the About screen if their update was successful.\n\t\t\t\tlist( $about_version ) = explode( '-', $core_update->current, 2 );\n\t\t\t\t$body .= sprintf( __( \"For more on version %s, see the About WordPress screen:\" ), $about_version );\n\t\t\t\t$body .= \"\\n\" . admin_url( 'about.php' );\n\n\t\t\t\tif ( $newer_version_available ) {\n\t\t\t\t\t$body .= \"\\n\\n\" . sprintf( __( 'WordPress %s is also now available.' ), $next_user_core_update->current ) . ' ';\n\t\t\t\t\t$body .= __( 'Updating is easy and only takes a few moments:' );\n\t\t\t\t\t$body .= \"\\n\" . network_admin_url( 'update-core.php' );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'fail' :\n\t\t\tcase 'manual' :\n\t\t\t\t$body .= sprintf( __( 'Please update your site at %1$s to WordPress %2$s.' ), home_url(), $next_user_core_update->current );\n\n\t\t\t\t$body .= \"\\n\\n\";\n\n\t\t\t\t// Don't show this message if there is a newer version available.\n\t\t\t\t// Potential for confusion, and also not useful for them to know at this point.\n\t\t\t\tif ( 'fail' == $type && ! $newer_version_available )\n\t\t\t\t\t$body .= __( 'We tried but were unable to update your site automatically.' ) . ' ';\n\n\t\t\t\t$body .= __( 'Updating is easy and only takes a few moments:' );\n\t\t\t\t$body .= \"\\n\" . network_admin_url( 'update-core.php' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'critical' :\n\t\t\t\tif ( $newer_version_available )\n\t\t\t\t\t$body .= sprintf( __( 'Your site at %1$s experienced a critical failure while trying to update WordPress to version %2$s.' ), home_url(), $core_update->current );\n\t\t\t\telse\n\t\t\t\t\t$body .= sprintf( __( 'Your site at %1$s experienced a critical failure while trying to update to the latest version of WordPress, %2$s.' ), home_url(), $core_update->current );\n\n\t\t\t\t$body .= \"\\n\\n\" . __( \"This means your site may be offline or broken. Don't panic; this can be fixed.\" );\n\n\t\t\t\t$body .= \"\\n\\n\" . __( \"Please check out your site now. It's possible that everything is working. If it says you need to update, you should do so:\" );\n\t\t\t\t$body .= \"\\n\" . network_admin_url( 'update-core.php' );\n\t\t\t\tbreak;\n\t\t}\n\n\t\t$critical_support = 'critical' === $type && ! empty( $core_update->support_email );\n\t\tif ( $critical_support ) {\n\t\t\t// Support offer if available.\n\t\t\t$body .= \"\\n\\n\" . sprintf( __( \"The WordPress team is willing to help you. Forward this email to %s and the team will work with you to make sure your site is working.\" ), $core_update->support_email );\n\t\t} else {\n\t\t\t// Add a note about the support forums.\n\t\t\t$body .= \"\\n\\n\" . __( 'If you experience any issues or need support, the volunteers in the WordPress.org support forums may be able to help.' );\n\t\t\t$body .= \"\\n\" . __( 'https://wordpress.org/support/' );\n\t\t}\n\n\t\t// Updates are important!\n\t\tif ( $type != 'success' || $newer_version_available ) {\n\t\t\t$body .= \"\\n\\n\" . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' );\n\t\t}\n\n\t\tif ( $critical_support ) {\n\t\t\t$body .= \" \" . __( \"If you reach out to us, we'll also ensure you'll never have this problem again.\" );\n\t\t}\n\n\t\t// If things are successful and we're now on the latest, mention plugins and themes if any are out of date.\n\t\tif ( $type == 'success' && ! $newer_version_available && ( get_plugin_updates() || get_theme_updates() ) ) {\n\t\t\t$body .= \"\\n\\n\" . __( 'You also have some plugins or themes with updates available. Update them now:' );\n\t\t\t$body .= \"\\n\" . network_admin_url();\n\t\t}\n\n\t\t$body .= \"\\n\\n\" . __( 'The WordPress Team' ) . \"\\n\";\n\n\t\tif ( 'critical' == $type && is_wp_error( $result ) ) {\n\t\t\t$body .= \"\\n***\\n\\n\";\n\t\t\t$body .= sprintf( __( 'Your site was running version %s.' ), $GLOBALS['wp_version'] );\n\t\t\t$body .= ' ' . __( 'We have some data that describes the error your site encountered.' );\n\t\t\t$body .= ' ' . __( 'Your hosting company, support forum volunteers, or a friendly developer may be able to use this information to help you:' );\n\n\t\t\t// If we had a rollback and we're still critical, then the rollback failed too.\n\t\t\t// Loop through all errors (the main WP_Error, the update result, the rollback result) for code, data, etc.\n\t\t\tif ( 'rollback_was_required' == $result->get_error_code() )\n\t\t\t\t$errors = array( $result, $result->get_error_data()->update, $result->get_error_data()->rollback );\n\t\t\telse\n\t\t\t\t$errors = array( $result );\n\n\t\t\tforeach ( $errors as $error ) {\n\t\t\t\tif ( ! is_wp_error( $error ) )\n\t\t\t\t\tcontinue;\n\t\t\t\t$error_code = $error->get_error_code();\n\t\t\t\t$body .= \"\\n\\n\" . sprintf( __( \"Error code: %s\" ), $error_code );\n\t\t\t\tif ( 'rollback_was_required' == $error_code )\n\t\t\t\t\tcontinue;\n\t\t\t\tif ( $error->get_error_message() )\n\t\t\t\t\t$body .= \"\\n\" . $error->get_error_message();\n\t\t\t\t$error_data = $error->get_error_data();\n\t\t\t\tif ( $error_data )\n\t\t\t\t\t$body .= \"\\n\" . implode( ', ', (array) $error_data );\n\t\t\t}\n\t\t\t$body .= \"\\n\";\n\t\t}\n\n\t\t$to  = get_site_option( 'admin_email' );\n\t\t$headers = '';\n\n\t\t$email = compact( 'to', 'subject', 'body', 'headers' );\n\n\t\t/**\n\t\t * Filter the email sent following an automatic background core update.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array $email {\n\t\t *     Array of email arguments that will be passed to wp_mail().\n\t\t *\n\t\t *     @type string $to      The email recipient. An array of emails\n\t\t *                            can be returned, as handled by wp_mail().\n\t\t *     @type string $subject The email's subject.\n\t\t *     @type string $body    The email message body.\n\t\t *     @type string $headers Any email headers, defaults to no headers.\n\t\t * }\n\t\t * @param string $type        The type of email being sent. Can be one of\n\t\t *                            'success', 'fail', 'manual', 'critical'.\n\t\t * @param object $core_update The update offer that was attempted.\n\t\t * @param mixed  $result      The result for the core update. Can be WP_Error.\n\t\t */\n\t\t$email = apply_filters( 'auto_core_update_email', $email, $type, $core_update, $result );\n\n\t\twp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );\n\t}\n\n\t/**\n\t * Prepares and sends an email of a full log of background update results, useful for debugging and geekery.\n\t *\n\t * @since 3.7.0\n\t * @access protected\n\t */\n\tprotected function send_debug_email() {\n\t\t$update_count = 0;\n\t\tforeach ( $this->update_results as $type => $updates )\n\t\t\t$update_count += count( $updates );\n\n\t\t$body = array();\n\t\t$failures = 0;\n\n\t\t$body[] = sprintf( __( 'WordPress site: %s' ), network_home_url( '/' ) );\n\n\t\t// Core\n\t\tif ( isset( $this->update_results['core'] ) ) {\n\t\t\t$result = $this->update_results['core'][0];\n\t\t\tif ( $result->result && ! is_wp_error( $result->result ) ) {\n\t\t\t\t$body[] = sprintf( __( 'SUCCESS: WordPress was successfully updated to %s' ), $result->name );\n\t\t\t} else {\n\t\t\t\t$body[] = sprintf( __( 'FAILED: WordPress failed to update to %s' ), $result->name );\n\t\t\t\t$failures++;\n\t\t\t}\n\t\t\t$body[] = '';\n\t\t}\n\n\t\t// Plugins, Themes, Translations\n\t\tforeach ( array( 'plugin', 'theme', 'translation' ) as $type ) {\n\t\t\tif ( ! isset( $this->update_results[ $type ] ) )\n\t\t\t\tcontinue;\n\t\t\t$success_items = wp_list_filter( $this->update_results[ $type ], array( 'result' => true ) );\n\t\t\tif ( $success_items ) {\n\t\t\t\t$messages = array(\n\t\t\t\t\t'plugin'      => __( 'The following plugins were successfully updated:' ),\n\t\t\t\t\t'theme'       => __( 'The following themes were successfully updated:' ),\n\t\t\t\t\t'translation' => __( 'The following translations were successfully updated:' ),\n\t\t\t\t);\n\n\t\t\t\t$body[] = $messages[ $type ];\n\t\t\t\tforeach ( wp_list_pluck( $success_items, 'name' ) as $name ) {\n\t\t\t\t\t$body[] = ' * ' . sprintf( __( 'SUCCESS: %s' ), $name );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( $success_items != $this->update_results[ $type ] ) {\n\t\t\t\t// Failed updates\n\t\t\t\t$messages = array(\n\t\t\t\t\t'plugin'      => __( 'The following plugins failed to update:' ),\n\t\t\t\t\t'theme'       => __( 'The following themes failed to update:' ),\n\t\t\t\t\t'translation' => __( 'The following translations failed to update:' ),\n\t\t\t\t);\n\n\t\t\t\t$body[] = $messages[ $type ];\n\t\t\t\tforeach ( $this->update_results[ $type ] as $item ) {\n\t\t\t\t\tif ( ! $item->result || is_wp_error( $item->result ) ) {\n\t\t\t\t\t\t$body[] = ' * ' . sprintf( __( 'FAILED: %s' ), $item->name );\n\t\t\t\t\t\t$failures++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t$body[] = '';\n\t\t}\n\n\t\t$site_title = wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );\n\t\tif ( $failures ) {\n\t\t\t$body[] = trim( __(\n\"BETA TESTING?\n=============\n\nThis debugging email is sent when you are using a development version of WordPress.\n\nIf you think these failures might be due to a bug in WordPress, could you report it?\n * Open a thread in the support forums: https://wordpress.org/support/forum/alphabeta\n * Or, if you're comfortable writing a bug report: https://core.trac.wordpress.org/\n\nThanks! -- The WordPress Team\" ) );\n\t\t\t$body[] = '';\n\n\t\t\t$subject = sprintf( __( '[%s] There were failures during background updates' ), $site_title );\n\t\t} else {\n\t\t\t$subject = sprintf( __( '[%s] Background updates have finished' ), $site_title );\n\t\t}\n\n\t\t$body[] = trim( __(\n'UPDATE LOG\n==========' ) );\n\t\t$body[] = '';\n\n\t\tforeach ( array( 'core', 'plugin', 'theme', 'translation' ) as $type ) {\n\t\t\tif ( ! isset( $this->update_results[ $type ] ) )\n\t\t\t\tcontinue;\n\t\t\tforeach ( $this->update_results[ $type ] as $update ) {\n\t\t\t\t$body[] = $update->name;\n\t\t\t\t$body[] = str_repeat( '-', strlen( $update->name ) );\n\t\t\t\tforeach ( $update->messages as $message )\n\t\t\t\t\t$body[] = \"  \" . html_entity_decode( str_replace( '&#8230;', '...', $message ) );\n\t\t\t\tif ( is_wp_error( $update->result ) ) {\n\t\t\t\t\t$results = array( 'update' => $update->result );\n\t\t\t\t\t// If we rolled back, we want to know an error that occurred then too.\n\t\t\t\t\tif ( 'rollback_was_required' === $update->result->get_error_code() )\n\t\t\t\t\t\t$results = (array) $update->result->get_error_data();\n\t\t\t\t\tforeach ( $results as $result_type => $result ) {\n\t\t\t\t\t\tif ( ! is_wp_error( $result ) )\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif ( 'rollback' === $result_type ) {\n\t\t\t\t\t\t\t/* translators: 1: Error code, 2: Error message. */\n\t\t\t\t\t\t\t$body[] = '  ' . sprintf( __( 'Rollback Error: [%1$s] %2$s' ), $result->get_error_code(), $result->get_error_message() );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t/* translators: 1: Error code, 2: Error message. */\n\t\t\t\t\t\t\t$body[] = '  ' . sprintf( __( 'Error: [%1$s] %2$s' ), $result->get_error_code(), $result->get_error_message() );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( $result->get_error_data() )\n\t\t\t\t\t\t\t$body[] = '         ' . implode( ', ', (array) $result->get_error_data() );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$body[] = '';\n\t\t\t}\n\t\t}\n\n\t\t$email = array(\n\t\t\t'to'      => get_site_option( 'admin_email' ),\n\t\t\t'subject' => $subject,\n\t\t\t'body'    => implode( \"\\n\", $body ),\n\t\t\t'headers' => ''\n\t\t);\n\n\t\t/**\n\t\t * Filter the debug email that can be sent following an automatic\n\t\t * background core update.\n\t\t *\n\t\t * @since 3.8.0\n\t\t *\n\t\t * @param array $email {\n\t\t *     Array of email arguments that will be passed to wp_mail().\n\t\t *\n\t\t *     @type string $to      The email recipient. An array of emails\n\t\t *                           can be returned, as handled by wp_mail().\n\t\t *     @type string $subject Email subject.\n\t\t *     @type string $body    Email message body.\n\t\t *     @type string $headers Any email headers. Default empty.\n\t\t * }\n\t\t * @param int   $failures The number of failures encountered while upgrading.\n\t\t * @param mixed $results  The results of all attempted updates.\n\t\t */\n\t\t$email = apply_filters( 'automatic_updates_debug_email', $email, $failures, $this->update_results );\n\n\t\twp_mail( $email['to'], wp_specialchars_decode( $email['subject'] ), $email['body'], $email['headers'] );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/class-wp-users-list-table.php",
    "content": "<?php\n/**\n * List Table API: WP_Users_List_Table class\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement displaying users in a list table.\n *\n * @since 3.1.0\n * @access private\n *\n * @see WP_List_Table\n */\nclass WP_Users_List_Table extends WP_List_Table {\n\n\t/**\n\t * Site ID to generate the Users list table for.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $site_id;\n\n\t/**\n\t * Whether or not the current Users list table is for Multisite.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_site_users;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @see WP_List_Table::__construct() for more information on default arguments.\n\t *\n\t * @param array $args An associative array of arguments.\n\t */\n\tpublic function __construct( $args = array() ) {\n\t\tparent::__construct( array(\n\t\t\t'singular' => 'user',\n\t\t\t'plural'   => 'users',\n\t\t\t'screen'   => isset( $args['screen'] ) ? $args['screen'] : null,\n\t\t) );\n\n\t\t$this->is_site_users = 'site-users-network' === $this->screen->id;\n\n\t\tif ( $this->is_site_users )\n\t\t\t$this->site_id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0;\n\t}\n\n\t/**\n\t * Check the current user's permissions.\n\t *\n \t * @since 3.1.0\n\t * @access public\n\t *\n\t * @return bool\n\t */\n\tpublic function ajax_user_can() {\n\t\tif ( $this->is_site_users )\n\t\t\treturn current_user_can( 'manage_sites' );\n\t\telse\n\t\t\treturn current_user_can( 'list_users' );\n\t}\n\n\t/**\n\t * Prepare the users list for display.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @global string $role\n\t * @global string $usersearch\n\t */\n\tpublic function prepare_items() {\n\t\tglobal $role, $usersearch;\n\n\t\t$usersearch = isset( $_REQUEST['s'] ) ? wp_unslash( trim( $_REQUEST['s'] ) ) : '';\n\n\t\t$role = isset( $_REQUEST['role'] ) ? $_REQUEST['role'] : '';\n\n\t\t$per_page = ( $this->is_site_users ) ? 'site_users_network_per_page' : 'users_per_page';\n\t\t$users_per_page = $this->get_items_per_page( $per_page );\n\n\t\t$paged = $this->get_pagenum();\n\n\t\tif ( 'none' === $role ) {\n\t\t\t$args = array(\n\t\t\t\t'number' => $users_per_page,\n\t\t\t\t'offset' => ( $paged-1 ) * $users_per_page,\n\t\t\t\t'include' => wp_get_users_with_no_role(),\n\t\t\t\t'search' => $usersearch,\n\t\t\t\t'fields' => 'all_with_meta'\n\t\t\t);\n\t\t} else {\n\t\t\t$args = array(\n\t\t\t\t'number' => $users_per_page,\n\t\t\t\t'offset' => ( $paged-1 ) * $users_per_page,\n\t\t\t\t'role' => $role,\n\t\t\t\t'search' => $usersearch,\n\t\t\t\t'fields' => 'all_with_meta'\n\t\t\t);\n\t\t}\n\n\t\tif ( '' !== $args['search'] )\n\t\t\t$args['search'] = '*' . $args['search'] . '*';\n\n\t\tif ( $this->is_site_users )\n\t\t\t$args['blog_id'] = $this->site_id;\n\n\t\tif ( isset( $_REQUEST['orderby'] ) )\n\t\t\t$args['orderby'] = $_REQUEST['orderby'];\n\n\t\tif ( isset( $_REQUEST['order'] ) )\n\t\t\t$args['order'] = $_REQUEST['order'];\n\n\t\t/**\n\t\t * Filter the query arguments used to retrieve users for the current users list table.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array $args Arguments passed to WP_User_Query to retrieve items for the current\n\t\t *                    users list table.\n\t\t */\n\t\t$args = apply_filters( 'users_list_table_query_args', $args );\n\n\t\t// Query the user IDs for this page\n\t\t$wp_user_search = new WP_User_Query( $args );\n\n\t\t$this->items = $wp_user_search->get_results();\n\n\t\t$this->set_pagination_args( array(\n\t\t\t'total_items' => $wp_user_search->get_total(),\n\t\t\t'per_page' => $users_per_page,\n\t\t) );\n\t}\n\n\t/**\n\t * Output 'no users' message.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t */\n\tpublic function no_items() {\n\t\t_e( 'No users found.' );\n\t}\n\n\t/**\n\t * Return an associative array listing all the views that can be used\n\t * with this table.\n\t *\n\t * Provides a list of roles and user count for that role for easy\n\t * filtering of the user table.\n\t *\n\t * @since  3.1.0\n\t * @access protected\n\t *\n\t * @global string $role\n\t *\n\t * @return array An array of HTML links, one for each view.\n\t */\n\tprotected function get_views() {\n\t\tglobal $role;\n\n\t\t$wp_roles = wp_roles();\n\n\t\tif ( $this->is_site_users ) {\n\t\t\t$url = 'site-users.php?id=' . $this->site_id;\n\t\t\tswitch_to_blog( $this->site_id );\n\t\t\t$users_of_blog = count_users();\n\t\t\trestore_current_blog();\n\t\t} else {\n\t\t\t$url = 'users.php';\n\t\t\t$users_of_blog = count_users();\n\t\t}\n\n\t\t$total_users = $users_of_blog['total_users'];\n\t\t$avail_roles =& $users_of_blog['avail_roles'];\n\t\tunset($users_of_blog);\n\n\t\t$class = empty($role) ? ' class=\"current\"' : '';\n\t\t$role_links = array();\n\t\t$role_links['all'] = \"<a href='$url'$class>\" . sprintf( _nx( 'All <span class=\"count\">(%s)</span>', 'All <span class=\"count\">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';\n\t\tforeach ( $wp_roles->get_names() as $this_role => $name ) {\n\t\t\tif ( !isset($avail_roles[$this_role]) )\n\t\t\t\tcontinue;\n\n\t\t\t$class = '';\n\n\t\t\tif ( $this_role === $role ) {\n\t\t\t\t$class = ' class=\"current\"';\n\t\t\t}\n\n\t\t\t$name = translate_user_role( $name );\n\t\t\t/* translators: User role name with count */\n\t\t\t$name = sprintf( __('%1$s <span class=\"count\">(%2$s)</span>'), $name, number_format_i18n( $avail_roles[$this_role] ) );\n\t\t\t$role_links[$this_role] = \"<a href='\" . esc_url( add_query_arg( 'role', $this_role, $url ) ) . \"'$class>$name</a>\";\n\t\t}\n\n\t\tif ( ! empty( $avail_roles['none' ] ) ) {\n\n\t\t\t$class = '';\n\n\t\t\tif ( 'none' === $role ) {\n\t\t\t\t$class = ' class=\"current\"';\n\t\t\t}\n\n\t\t\t$name = __( 'No role' );\n\t\t\t/* translators: User role name with count */\n\t\t\t$name = sprintf( __('%1$s <span class=\"count\">(%2$s)</span>'), $name, number_format_i18n( $avail_roles['none' ] ) );\n\t\t\t$role_links['none'] = \"<a href='\" . esc_url( add_query_arg( 'role', 'none', $url ) ) . \"'$class>$name</a>\";\n\n\t\t}\n\n\t\treturn $role_links;\n\t}\n\n\t/**\n\t * Retrieve an associative array of bulk actions available on this table.\n\t *\n\t * @since  3.1.0\n\t * @access protected\n\t *\n\t * @return array Array of bulk actions.\n\t */\n\tprotected function get_bulk_actions() {\n\t\t$actions = array();\n\n\t\tif ( is_multisite() ) {\n\t\t\tif ( current_user_can( 'remove_users' ) )\n\t\t\t\t$actions['remove'] = __( 'Remove' );\n\t\t} else {\n\t\t\tif ( current_user_can( 'delete_users' ) )\n\t\t\t\t$actions['delete'] = __( 'Delete' );\n\t\t}\n\n\t\treturn $actions;\n\t}\n\n\t/**\n\t * Output the controls to allow user roles to be changed in bulk.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @param string $which Whether this is being invoked above (\"top\")\n\t *                      or below the table (\"bottom\").\n\t */\n\tprotected function extra_tablenav( $which ) {\n\t\t$id = 'bottom' === $which ? 'new_role2' : 'new_role';\n\t?>\n\t<div class=\"alignleft actions\">\n\t\t<?php if ( current_user_can( 'promote_users' ) && $this->has_items() ) : ?>\n\t\t<label class=\"screen-reader-text\" for=\"<?php echo $id ?>\"><?php _e( 'Change role to&hellip;' ) ?></label>\n\t\t<select name=\"<?php echo $id ?>\" id=\"<?php echo $id ?>\">\n\t\t\t<option value=\"\"><?php _e( 'Change role to&hellip;' ) ?></option>\n\t\t\t<?php wp_dropdown_roles(); ?>\n\t\t</select>\n\t<?php\n\t\t\tsubmit_button( __( 'Change' ), 'button', 'changeit', false );\n\t\tendif;\n\n\t\t/**\n\t\t * Fires just before the closing div containing the bulk role-change controls\n\t\t * in the Users list table.\n\t\t *\n\t\t * @since 3.5.0\n\t\t */\n\t\tdo_action( 'restrict_manage_users' );\n\t\techo '</div>';\n\t}\n\n\t/**\n\t * Capture the bulk action required, and return it.\n\t *\n\t * Overridden from the base class implementation to capture\n\t * the role change drop-down.\n\t *\n\t * @since  3.1.0\n\t * @access public\n\t *\n\t * @return string The bulk action required.\n\t */\n\tpublic function current_action() {\n\t\tif ( isset( $_REQUEST['changeit'] ) &&\n\t\t\t( ! empty( $_REQUEST['new_role'] ) || ! empty( $_REQUEST['new_role2'] ) ) ) {\n\t\t\treturn 'promote';\n\t\t}\n\n\t\treturn parent::current_action();\n\t}\n\n\t/**\n\t * Get a list of columns for the list table.\n\t *\n\t * @since  3.1.0\n\t * @access public\n\t *\n\t * @return array Array in which the key is the ID of the column,\n\t *               and the value is the description.\n\t */\n\tpublic function get_columns() {\n\t\t$c = array(\n\t\t\t'cb'       => '<input type=\"checkbox\" />',\n\t\t\t'username' => __( 'Username' ),\n\t\t\t'name'     => __( 'Name' ),\n\t\t\t'email'    => __( 'Email' ),\n\t\t\t'role'     => __( 'Role' ),\n\t\t\t'posts'    => __( 'Posts' )\n\t\t);\n\n\t\tif ( $this->is_site_users )\n\t\t\tunset( $c['posts'] );\n\n\t\treturn $c;\n\t}\n\n\t/**\n\t * Get a list of sortable columns for the list table.\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @return array Array of sortable columns.\n\t */\n\tprotected function get_sortable_columns() {\n\t\t$c = array(\n\t\t\t'username' => 'login',\n\t\t\t'name'     => 'name',\n\t\t\t'email'    => 'email',\n\t\t);\n\n\t\treturn $c;\n\t}\n\n\t/**\n\t * Generate the list table rows.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t */\n\tpublic function display_rows() {\n\t\t// Query the post counts for this page\n\t\tif ( ! $this->is_site_users )\n\t\t\t$post_counts = count_many_users_posts( array_keys( $this->items ) );\n\n\t\tforeach ( $this->items as $userid => $user_object ) {\n\t\t\tif ( is_multisite() && empty( $user_object->allcaps ) )\n\t\t\t\tcontinue;\n\n\t\t\techo \"\\n\\t\" . $this->single_row( $user_object, '', '', isset( $post_counts ) ? $post_counts[ $userid ] : 0 );\n\t\t}\n\t}\n\n\t/**\n\t * Generate HTML for a single row on the users.php admin panel.\n\t *\n\t * @since 3.1.0\n\t * @since 4.2.0 The `$style` parameter was deprecated.\n\t * @since 4.4.0 The `$role` parameter was deprecated.\n\t * @access public\n\t *\n\t * @param object $user_object The current user object.\n\t * @param string $style       Deprecated. Not used.\n\t * @param string $role        Deprecated. Not used.\n\t * @param int    $numposts    Optional. Post count to display for this user. Defaults\n\t *                            to zero, as in, a new user has made zero posts.\n\t * @return string Output for a single row.\n\t */\n\tpublic function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {\n\t\tif ( ! ( $user_object instanceof WP_User ) ) {\n\t\t\t$user_object = get_userdata( (int) $user_object );\n\t\t}\n\t\t$user_object->filter = 'display';\n\t\t$email = $user_object->user_email;\n\n\t\tif ( $this->is_site_users )\n\t\t\t$url = \"site-users.php?id={$this->site_id}&amp;\";\n\t\telse\n\t\t\t$url = 'users.php?';\n\n\t\t$user_roles = $this->get_role_list( $user_object );\n\n\t\t// Set up the hover actions for this user\n\t\t$actions = array();\n\t\t$checkbox = '';\n\t\t// Check if the user for this row is editable\n\t\tif ( current_user_can( 'list_users' ) ) {\n\t\t\t// Set up the user editing link\n\t\t\t$edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_object->ID ) ) );\n\n\t\t\tif ( current_user_can( 'edit_user',  $user_object->ID ) ) {\n\t\t\t\t$edit = \"<strong><a href=\\\"$edit_link\\\">$user_object->user_login</a></strong><br />\";\n\t\t\t\t$actions['edit'] = '<a href=\"' . $edit_link . '\">' . __( 'Edit' ) . '</a>';\n\t\t\t} else {\n\t\t\t\t$edit = \"<strong>$user_object->user_login</strong><br />\";\n\t\t\t}\n\n\t\t\tif ( !is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) )\n\t\t\t\t$actions['delete'] = \"<a class='submitdelete' href='\" . wp_nonce_url( \"users.php?action=delete&amp;user=$user_object->ID\", 'bulk-users' ) . \"'>\" . __( 'Delete' ) . \"</a>\";\n\t\t\tif ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )\n\t\t\t\t$actions['remove'] = \"<a class='submitdelete' href='\" . wp_nonce_url( $url.\"action=remove&amp;user=$user_object->ID\", 'bulk-users' ) . \"'>\" . __( 'Remove' ) . \"</a>\";\n\n\t\t\t/**\n\t\t\t * Filter the action links displayed under each user in the Users list table.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param array   $actions     An array of action links to be displayed.\n\t\t\t *                             Default 'Edit', 'Delete' for single site, and\n\t\t\t *                             'Edit', 'Remove' for Multisite.\n\t\t\t * @param WP_User $user_object WP_User object for the currently-listed user.\n\t\t\t */\n\t\t\t$actions = apply_filters( 'user_row_actions', $actions, $user_object );\n\n\t\t\t// Role classes.\n\t\t\t$role_classes = esc_attr( implode( ' ', array_keys( $user_roles ) ) );\n\n\t\t\t// Set up the checkbox ( because the user is editable, otherwise it's empty )\n\t\t\t$checkbox = '<label class=\"screen-reader-text\" for=\"user_' . $user_object->ID . '\">' . sprintf( __( 'Select %s' ), $user_object->user_login ) . '</label>'\n\t\t\t\t\t\t. \"<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='{$role_classes}' value='{$user_object->ID}' />\";\n\n\t\t} else {\n\t\t\t$edit = '<strong>' . $user_object->user_login . '</strong>';\n\t\t}\n\t\t$avatar = get_avatar( $user_object->ID, 32 );\n\n\t\t// Comma-separated list of user roles.\n\t\t$roles_list = implode( ', ', $user_roles );\n\n\t\t$r = \"<tr id='user-$user_object->ID'>\";\n\n\t\tlist( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();\n\n\t\tforeach ( $columns as $column_name => $column_display_name ) {\n\t\t\t$classes = \"$column_name column-$column_name\";\n\t\t\tif ( $primary === $column_name ) {\n\t\t\t\t$classes .= ' has-row-actions column-primary';\n\t\t\t}\n\t\t\tif ( 'posts' === $column_name ) {\n\t\t\t\t$classes .= ' num'; // Special case for that column\n\t\t\t}\n\n\t\t\tif ( in_array( $column_name, $hidden ) ) {\n\t\t\t\t$classes .= ' hidden';\n\t\t\t}\n\n\t\t\t$data = 'data-colname=\"' . wp_strip_all_tags( $column_display_name ) . '\"';\n\n\t\t\t$attributes = \"class='$classes' $data\";\n\n\t\t\tif ( 'cb' === $column_name ) {\n\t\t\t\t$r .= \"<th scope='row' class='check-column'>$checkbox</th>\";\n\t\t\t} else {\n\t\t\t\t$r .= \"<td $attributes>\";\n\t\t\t\tswitch ( $column_name ) {\n\t\t\t\t\tcase 'username':\n\t\t\t\t\t\t$r .= \"$avatar $edit\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'name':\n\t\t\t\t\t\t$r .= \"$user_object->first_name $user_object->last_name\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'email':\n\t\t\t\t\t\t$r .= \"<a href='\" . esc_url( \"mailto:$email\" ) . \"'>$email</a>\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'role':\n\t\t\t\t\t\t$r .= esc_html( $roles_list );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'posts':\n\t\t\t\t\t\tif ( $numposts > 0 ) {\n\t\t\t\t\t\t\t$r .= \"<a href='edit.php?author=$user_object->ID' class='edit'>\";\n\t\t\t\t\t\t\t$r .= '<span aria-hidden=\"true\">' . $numposts . '</span>';\n\t\t\t\t\t\t\t$r .= '<span class=\"screen-reader-text\">' . sprintf( _n( '%s post by this author', '%s posts by this author', $numposts ), number_format_i18n( $numposts ) ) . '</span>';\n\t\t\t\t\t\t\t$r .= '</a>';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$r .= 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Filter the display output of custom columns in the Users list table.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @since 2.8.0\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @param string $output      Custom column output. Default empty.\n\t\t\t\t\t\t * @param string $column_name Column name.\n\t\t\t\t\t\t * @param int    $user_id     ID of the currently-listed user.\n\t\t\t\t\t\t */\n\t\t\t\t\t\t$r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );\n\t\t\t\t}\n\n\t\t\t\tif ( $primary === $column_name ) {\n\t\t\t\t\t$r .= $this->row_actions( $actions );\n\t\t\t\t}\n\t\t\t\t$r .= \"</td>\";\n\t\t\t}\n\t\t}\n\t\t$r .= '</tr>';\n\n\t\treturn $r;\n\t}\n\n\t/**\n\t * Gets the name of the default primary column.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @return string Name of the default primary column, in this case, 'username'.\n\t */\n\tprotected function get_default_primary_column_name() {\n\t\treturn 'username';\n\t}\n\n\t/**\n\t * Returns an array of user roles for a given user object.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @param WP_User $user_object The WP_User object.\n\t * @return array An array of user roles.\n\t */\n\tprotected function get_role_list( $user_object ) {\n\t\t$wp_roles = wp_roles();\n\n\t\t$role_list = array();\n\n\t\tforeach ( $user_object->roles as $role ) {\n\t\t\tif ( isset( $wp_roles->role_names[ $role ] ) ) {\n\t\t\t\t$role_list[ $role ] = translate_user_role( $wp_roles->role_names[ $role ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $role_list ) ) {\n\t\t\t$role_list['none'] = _x( 'None', 'no user roles' );\n\t\t}\n\n\t\t/**\n\t\t * Filter the returned array of roles for a user.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array   $role_list   An array of user roles.\n\t\t * @param WP_User $user_object A WP_User object.\n\t\t */\n\t\treturn apply_filters( 'get_role_list', $role_list, $user_object );\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/comment.php",
    "content": "<?php\n/**\n * WordPress Comment Administration API.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 2.3.0\n */\n\n/**\n * Determine if a comment exists based on author and date.\n *\n * For best performance, use `$timezone = 'gmt'`, which queries a field that is properly indexed. The default value\n * for `$timezone` is 'blog' for legacy reasons.\n *\n * @since 2.0.0\n * @since 4.4.0 Added the `$timezone` parameter.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $comment_author Author of the comment.\n * @param string $comment_date   Date of the comment.\n * @param string $timezone       Timezone. Accepts 'blog' or 'gmt'. Default 'blog'.\n *\n * @return mixed Comment post ID on success.\n */\nfunction comment_exists( $comment_author, $comment_date, $timezone = 'blog' ) {\n\tglobal $wpdb;\n\n\t$date_field = 'comment_date';\n\tif ( 'gmt' === $timezone ) {\n\t\t$date_field = 'comment_date_gmt';\n\t}\n\n\treturn $wpdb->get_var( $wpdb->prepare(\"SELECT comment_post_ID FROM $wpdb->comments\n\t\t\tWHERE comment_author = %s AND $date_field = %s\",\n\t\t\tstripslashes( $comment_author ),\n\t\t\tstripslashes( $comment_date )\n\t) );\n}\n\n/**\n * Update a comment with values provided in $_POST.\n *\n * @since 2.0.0\n */\nfunction edit_comment() {\n\tif ( ! current_user_can( 'edit_comment', (int) $_POST['comment_ID'] ) )\n\t\twp_die ( __( 'You are not allowed to edit comments on this post.' ) );\n\n\tif ( isset( $_POST['newcomment_author'] ) )\n\t\t$_POST['comment_author'] = $_POST['newcomment_author'];\n\tif ( isset( $_POST['newcomment_author_email'] ) )\n\t\t$_POST['comment_author_email'] = $_POST['newcomment_author_email'];\n\tif ( isset( $_POST['newcomment_author_url'] ) )\n\t\t$_POST['comment_author_url'] = $_POST['newcomment_author_url'];\n\tif ( isset( $_POST['comment_status'] ) )\n\t\t$_POST['comment_approved'] = $_POST['comment_status'];\n\tif ( isset( $_POST['content'] ) )\n\t\t$_POST['comment_content'] = $_POST['content'];\n\tif ( isset( $_POST['comment_ID'] ) )\n\t\t$_POST['comment_ID'] = (int) $_POST['comment_ID'];\n\n\tforeach ( array ('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {\n\t\tif ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) {\n\t\t\t$_POST['edit_date'] = '1';\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( !empty ( $_POST['edit_date'] ) ) {\n\t\t$aa = $_POST['aa'];\n\t\t$mm = $_POST['mm'];\n\t\t$jj = $_POST['jj'];\n\t\t$hh = $_POST['hh'];\n\t\t$mn = $_POST['mn'];\n\t\t$ss = $_POST['ss'];\n\t\t$jj = ($jj > 31 ) ? 31 : $jj;\n\t\t$hh = ($hh > 23 ) ? $hh -24 : $hh;\n\t\t$mn = ($mn > 59 ) ? $mn -60 : $mn;\n\t\t$ss = ($ss > 59 ) ? $ss -60 : $ss;\n\t\t$_POST['comment_date'] = \"$aa-$mm-$jj $hh:$mn:$ss\";\n\t}\n\n\twp_update_comment( $_POST );\n}\n\n/**\n * Returns a WP_Comment object based on comment ID.\n *\n * @since 2.0.0\n *\n * @param int $id ID of comment to retrieve.\n * @return WP_Comment|false Comment if found. False on failure.\n */\nfunction get_comment_to_edit( $id ) {\n\tif ( !$comment = get_comment($id) )\n\t\treturn false;\n\n\t$comment->comment_ID = (int) $comment->comment_ID;\n\t$comment->comment_post_ID = (int) $comment->comment_post_ID;\n\n\t$comment->comment_content = format_to_edit( $comment->comment_content );\n\t/**\n\t * Filter the comment content before editing.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param string $comment->comment_content Comment content.\n\t */\n\t$comment->comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content );\n\n\t$comment->comment_author = format_to_edit( $comment->comment_author );\n\t$comment->comment_author_email = format_to_edit( $comment->comment_author_email );\n\t$comment->comment_author_url = format_to_edit( $comment->comment_author_url );\n\t$comment->comment_author_url = esc_url($comment->comment_author_url);\n\n\treturn $comment;\n}\n\n/**\n * Get the number of pending comments on a post or posts\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|array $post_id Either a single Post ID or an array of Post IDs\n * @return int|array Either a single Posts pending comments as an int or an array of ints keyed on the Post IDs\n */\nfunction get_pending_comments_num( $post_id ) {\n\tglobal $wpdb;\n\n\t$single = false;\n\tif ( !is_array($post_id) ) {\n\t\t$post_id_array = (array) $post_id;\n\t\t$single = true;\n\t} else {\n\t\t$post_id_array = $post_id;\n\t}\n\t$post_id_array = array_map('intval', $post_id_array);\n\t$post_id_in = \"'\" . implode(\"', '\", $post_id_array) . \"'\";\n\n\t$pending = $wpdb->get_results( \"SELECT comment_post_ID, COUNT(comment_ID) as num_comments FROM $wpdb->comments WHERE comment_post_ID IN ( $post_id_in ) AND comment_approved = '0' GROUP BY comment_post_ID\", ARRAY_A );\n\n\tif ( $single ) {\n\t\tif ( empty($pending) )\n\t\t\treturn 0;\n\t\telse\n\t\t\treturn absint($pending[0]['num_comments']);\n\t}\n\n\t$pending_keyed = array();\n\n\t// Default to zero pending for all posts in request\n\tforeach ( $post_id_array as $id )\n\t\t$pending_keyed[$id] = 0;\n\n\tif ( !empty($pending) )\n\t\tforeach ( $pending as $pend )\n\t\t\t$pending_keyed[$pend['comment_post_ID']] = absint($pend['num_comments']);\n\n\treturn $pending_keyed;\n}\n\n/**\n * Add avatars to relevant places in admin, or try to.\n *\n * @since 2.5.0\n *\n * @param string $name User name.\n * @return string Avatar with Admin name.\n */\nfunction floated_admin_avatar( $name ) {\n\t$avatar = get_avatar( get_comment(), 32, 'mystery' );\n\treturn \"$avatar $name\";\n}\n\n/**\n * @since 2.7.0\n */\nfunction enqueue_comment_hotkeys_js() {\n\tif ( 'true' == get_user_option( 'comment_shortcuts' ) )\n\t\twp_enqueue_script( 'jquery-table-hotkeys' );\n}\n\n/**\n * Display error message at bottom of comments.\n *\n * @param string $msg Error Message. Assumed to contain HTML and be sanitized.\n */\nfunction comment_footer_die( $msg ) {\n\techo \"<div class='wrap'><p>$msg</p></div>\";\n\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\tdie;\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/continents-cities.php",
    "content": "<?php\n/**\n * Translation API: Continent and city translations for timezone selection\n *\n * This file is not included anywhere. It exists solely for use by xgettext.\n *\n * @package WordPress\n * @subpackage i18n\n * @since 2.8.0\n */\n\n__('Africa', 'continents-cities');\n__('Abidjan', 'continents-cities');\n__('Accra', 'continents-cities');\n__('Addis Ababa', 'continents-cities');\n__('Algiers', 'continents-cities');\n__('Asmara', 'continents-cities');\n__('Asmera', 'continents-cities');\n__('Bamako', 'continents-cities');\n__('Bangui', 'continents-cities');\n__('Banjul', 'continents-cities');\n__('Bissau', 'continents-cities');\n__('Blantyre', 'continents-cities');\n__('Brazzaville', 'continents-cities');\n__('Bujumbura', 'continents-cities');\n__('Cairo', 'continents-cities');\n__('Casablanca', 'continents-cities');\n__('Ceuta', 'continents-cities');\n__('Conakry', 'continents-cities');\n__('Dakar', 'continents-cities');\n__('Dar es Salaam', 'continents-cities');\n__('Djibouti', 'continents-cities');\n__('Douala', 'continents-cities');\n__('El Aaiun', 'continents-cities');\n__('Freetown', 'continents-cities');\n__('Gaborone', 'continents-cities');\n__('Harare', 'continents-cities');\n__('Johannesburg', 'continents-cities');\n__('Kampala', 'continents-cities');\n__('Khartoum', 'continents-cities');\n__('Kigali', 'continents-cities');\n__('Kinshasa', 'continents-cities');\n__('Lagos', 'continents-cities');\n__('Libreville', 'continents-cities');\n__('Lome', 'continents-cities');\n__('Luanda', 'continents-cities');\n__('Lubumbashi', 'continents-cities');\n__('Lusaka', 'continents-cities');\n__('Malabo', 'continents-cities');\n__('Maputo', 'continents-cities');\n__('Maseru', 'continents-cities');\n__('Mbabane', 'continents-cities');\n__('Mogadishu', 'continents-cities');\n__('Monrovia', 'continents-cities');\n__('Nairobi', 'continents-cities');\n__('Ndjamena', 'continents-cities');\n__('Niamey', 'continents-cities');\n__('Nouakchott', 'continents-cities');\n__('Ouagadougou', 'continents-cities');\n__('Porto-Novo', 'continents-cities');\n__('Sao Tome', 'continents-cities');\n__('Timbuktu', 'continents-cities');\n__('Tripoli', 'continents-cities');\n__('Tunis', 'continents-cities');\n__('Windhoek', 'continents-cities');\n__('America', 'continents-cities');\n__('Adak', 'continents-cities');\n__('Anchorage', 'continents-cities');\n__('Anguilla', 'continents-cities');\n__('Antigua', 'continents-cities');\n__('Araguaina', 'continents-cities');\n__('Argentina', 'continents-cities');\n__('Buenos Aires', 'continents-cities');\n__('Catamarca', 'continents-cities');\n__('ComodRivadavia', 'continents-cities');\n__('Cordoba', 'continents-cities');\n__('Jujuy', 'continents-cities');\n__('La Rioja', 'continents-cities');\n__('Mendoza', 'continents-cities');\n__('Rio Gallegos', 'continents-cities');\n__('San Juan', 'continents-cities');\n__('San Luis', 'continents-cities');\n__('Tucuman', 'continents-cities');\n__('Ushuaia', 'continents-cities');\n__('Aruba', 'continents-cities');\n__('Asuncion', 'continents-cities');\n__('Atikokan', 'continents-cities');\n__('Atka', 'continents-cities');\n__('Bahia', 'continents-cities');\n__('Barbados', 'continents-cities');\n__('Belem', 'continents-cities');\n__('Belize', 'continents-cities');\n__('Blanc-Sablon', 'continents-cities');\n__('Boa Vista', 'continents-cities');\n__('Bogota', 'continents-cities');\n__('Boise', 'continents-cities');\n__('Cambridge Bay', 'continents-cities');\n__('Campo Grande', 'continents-cities');\n__('Cancun', 'continents-cities');\n__('Caracas', 'continents-cities');\n__('Cayenne', 'continents-cities');\n__('Cayman', 'continents-cities');\n__('Chicago', 'continents-cities');\n__('Chihuahua', 'continents-cities');\n__('Coral Harbour', 'continents-cities');\n__('Costa Rica', 'continents-cities');\n__('Cuiaba', 'continents-cities');\n__('Curacao', 'continents-cities');\n__('Danmarkshavn', 'continents-cities');\n__('Dawson', 'continents-cities');\n__('Dawson Creek', 'continents-cities');\n__('Denver', 'continents-cities');\n__('Detroit', 'continents-cities');\n__('Dominica', 'continents-cities');\n__('Edmonton', 'continents-cities');\n__('Eirunepe', 'continents-cities');\n__('El Salvador', 'continents-cities');\n__('Ensenada', 'continents-cities');\n__('Fort Wayne', 'continents-cities');\n__('Fortaleza', 'continents-cities');\n__('Glace Bay', 'continents-cities');\n__('Godthab', 'continents-cities');\n__('Goose Bay', 'continents-cities');\n__('Grand Turk', 'continents-cities');\n__('Grenada', 'continents-cities');\n__('Guadeloupe', 'continents-cities');\n__('Guatemala', 'continents-cities');\n__('Guayaquil', 'continents-cities');\n__('Guyana', 'continents-cities');\n__('Halifax', 'continents-cities');\n__('Havana', 'continents-cities');\n__('Hermosillo', 'continents-cities');\n__('Indiana', 'continents-cities');\n__('Indianapolis', 'continents-cities');\n__('Knox', 'continents-cities');\n__('Marengo', 'continents-cities');\n__('Petersburg', 'continents-cities');\n__('Tell City', 'continents-cities');\n__('Vevay', 'continents-cities');\n__('Vincennes', 'continents-cities');\n__('Winamac', 'continents-cities');\n__('Inuvik', 'continents-cities');\n__('Iqaluit', 'continents-cities');\n__('Jamaica', 'continents-cities');\n__('Juneau', 'continents-cities');\n__('Kentucky', 'continents-cities');\n__('Louisville', 'continents-cities');\n__('Monticello', 'continents-cities');\n__('Knox IN', 'continents-cities');\n__('La Paz', 'continents-cities');\n__('Lima', 'continents-cities');\n__('Los Angeles', 'continents-cities');\n__('Maceio', 'continents-cities');\n__('Managua', 'continents-cities');\n__('Manaus', 'continents-cities');\n__('Marigot', 'continents-cities');\n__('Martinique', 'continents-cities');\n__('Mazatlan', 'continents-cities');\n__('Menominee', 'continents-cities');\n__('Merida', 'continents-cities');\n__('Mexico City', 'continents-cities');\n__('Miquelon', 'continents-cities');\n__('Moncton', 'continents-cities');\n__('Monterrey', 'continents-cities');\n__('Montevideo', 'continents-cities');\n__('Montreal', 'continents-cities');\n__('Montserrat', 'continents-cities');\n__('Nassau', 'continents-cities');\n__('New York', 'continents-cities');\n__('Nipigon', 'continents-cities');\n__('Nome', 'continents-cities');\n__('Noronha', 'continents-cities');\n__('North Dakota', 'continents-cities');\n__('Center', 'continents-cities');\n__('New Salem', 'continents-cities');\n__('Panama', 'continents-cities');\n__('Pangnirtung', 'continents-cities');\n__('Paramaribo', 'continents-cities');\n__('Phoenix', 'continents-cities');\n__('Port-au-Prince', 'continents-cities');\n__('Port of Spain', 'continents-cities');\n__('Porto Acre', 'continents-cities');\n__('Porto Velho', 'continents-cities');\n__('Puerto Rico', 'continents-cities');\n__('Rainy River', 'continents-cities');\n__('Rankin Inlet', 'continents-cities');\n__('Recife', 'continents-cities');\n__('Regina', 'continents-cities');\n__('Resolute', 'continents-cities');\n__('Rio Branco', 'continents-cities');\n__('Rosario', 'continents-cities');\n__('Santiago', 'continents-cities');\n__('Santo Domingo', 'continents-cities');\n__('Sao Paulo', 'continents-cities');\n__('Scoresbysund', 'continents-cities');\n__('Shiprock', 'continents-cities');\n__('St Barthelemy', 'continents-cities');\n__('St Johns', 'continents-cities');\n__('St Kitts', 'continents-cities');\n__('St Lucia', 'continents-cities');\n__('St Thomas', 'continents-cities');\n__('St Vincent', 'continents-cities');\n__('Swift Current', 'continents-cities');\n__('Tegucigalpa', 'continents-cities');\n__('Thule', 'continents-cities');\n__('Thunder Bay', 'continents-cities');\n__('Tijuana', 'continents-cities');\n__('Toronto', 'continents-cities');\n__('Tortola', 'continents-cities');\n__('Vancouver', 'continents-cities');\n__('Virgin', 'continents-cities');\n__('Whitehorse', 'continents-cities');\n__('Winnipeg', 'continents-cities');\n__('Yakutat', 'continents-cities');\n__('Yellowknife', 'continents-cities');\n__('Antarctica', 'continents-cities');\n__('Casey', 'continents-cities');\n__('Davis', 'continents-cities');\n__('DumontDUrville', 'continents-cities');\n__('Mawson', 'continents-cities');\n__('McMurdo', 'continents-cities');\n__('Palmer', 'continents-cities');\n__('Rothera', 'continents-cities');\n__('South Pole', 'continents-cities');\n__('Syowa', 'continents-cities');\n__('Vostok', 'continents-cities');\n__('Arctic', 'continents-cities');\n__('Longyearbyen', 'continents-cities');\n__('Asia', 'continents-cities');\n__('Aden', 'continents-cities');\n__('Almaty', 'continents-cities');\n__('Amman', 'continents-cities');\n__('Anadyr', 'continents-cities');\n__('Aqtau', 'continents-cities');\n__('Aqtobe', 'continents-cities');\n__('Ashgabat', 'continents-cities');\n__('Ashkhabad', 'continents-cities');\n__('Baghdad', 'continents-cities');\n__('Bahrain', 'continents-cities');\n__('Baku', 'continents-cities');\n__('Bangkok', 'continents-cities');\n__('Beirut', 'continents-cities');\n__('Bishkek', 'continents-cities');\n__('Brunei', 'continents-cities');\n__('Calcutta', 'continents-cities');\n__('Choibalsan', 'continents-cities');\n__('Chongqing', 'continents-cities');\n__('Chungking', 'continents-cities');\n__('Colombo', 'continents-cities');\n__('Dacca', 'continents-cities');\n__('Damascus', 'continents-cities');\n__('Dhaka', 'continents-cities');\n__('Dili', 'continents-cities');\n__('Dubai', 'continents-cities');\n__('Dushanbe', 'continents-cities');\n__('Gaza', 'continents-cities');\n__('Harbin', 'continents-cities');\n__('Ho Chi Minh', 'continents-cities');\n__('Hong Kong', 'continents-cities');\n__('Hovd', 'continents-cities');\n__('Irkutsk', 'continents-cities');\n__('Istanbul', 'continents-cities');\n__('Jakarta', 'continents-cities');\n__('Jayapura', 'continents-cities');\n__('Jerusalem', 'continents-cities');\n__('Kabul', 'continents-cities');\n__('Kamchatka', 'continents-cities');\n__('Karachi', 'continents-cities');\n__('Kashgar', 'continents-cities');\n__('Katmandu', 'continents-cities');\n__('Kolkata', 'continents-cities');\n__('Krasnoyarsk', 'continents-cities');\n__('Kuala Lumpur', 'continents-cities');\n__('Kuching', 'continents-cities');\n__('Kuwait', 'continents-cities');\n__('Macao', 'continents-cities');\n__('Macau', 'continents-cities');\n__('Magadan', 'continents-cities');\n__('Makassar', 'continents-cities');\n__('Manila', 'continents-cities');\n__('Muscat', 'continents-cities');\n__('Nicosia', 'continents-cities');\n__('Novosibirsk', 'continents-cities');\n__('Omsk', 'continents-cities');\n__('Oral', 'continents-cities');\n__('Phnom Penh', 'continents-cities');\n__('Pontianak', 'continents-cities');\n__('Pyongyang', 'continents-cities');\n__('Qatar', 'continents-cities');\n__('Qyzylorda', 'continents-cities');\n__('Rangoon', 'continents-cities');\n__('Riyadh', 'continents-cities');\n__('Saigon', 'continents-cities');\n__('Sakhalin', 'continents-cities');\n__('Samarkand', 'continents-cities');\n__('Seoul', 'continents-cities');\n__('Shanghai', 'continents-cities');\n__('Singapore', 'continents-cities');\n__('Taipei', 'continents-cities');\n__('Tashkent', 'continents-cities');\n__('Tbilisi', 'continents-cities');\n__('Tehran', 'continents-cities');\n__('Tel Aviv', 'continents-cities');\n__('Thimbu', 'continents-cities');\n__('Thimphu', 'continents-cities');\n__('Tokyo', 'continents-cities');\n__('Ujung Pandang', 'continents-cities');\n__('Ulaanbaatar', 'continents-cities');\n__('Ulan Bator', 'continents-cities');\n__('Urumqi', 'continents-cities');\n__('Vientiane', 'continents-cities');\n__('Vladivostok', 'continents-cities');\n__('Yakutsk', 'continents-cities');\n__('Yekaterinburg', 'continents-cities');\n__('Yerevan', 'continents-cities');\n__('Atlantic', 'continents-cities');\n__('Azores', 'continents-cities');\n__('Bermuda', 'continents-cities');\n__('Canary', 'continents-cities');\n__('Cape Verde', 'continents-cities');\n__('Faeroe', 'continents-cities');\n__('Faroe', 'continents-cities');\n__('Jan Mayen', 'continents-cities');\n__('Madeira', 'continents-cities');\n__('Reykjavik', 'continents-cities');\n__('South Georgia', 'continents-cities');\n__('St Helena', 'continents-cities');\n__('Stanley', 'continents-cities');\n__('Australia', 'continents-cities');\n__('ACT', 'continents-cities');\n__('Adelaide', 'continents-cities');\n__('Brisbane', 'continents-cities');\n__('Broken Hill', 'continents-cities');\n__('Canberra', 'continents-cities');\n__('Currie', 'continents-cities');\n__('Darwin', 'continents-cities');\n__('Eucla', 'continents-cities');\n__('Hobart', 'continents-cities');\n__('LHI', 'continents-cities');\n__('Lindeman', 'continents-cities');\n__('Lord Howe', 'continents-cities');\n__('Melbourne', 'continents-cities');\n__('North', 'continents-cities');\n__('NSW', 'continents-cities');\n__('Perth', 'continents-cities');\n__('Queensland', 'continents-cities');\n__('South', 'continents-cities');\n__('Sydney', 'continents-cities');\n__('Tasmania', 'continents-cities');\n__('Victoria', 'continents-cities');\n__('West', 'continents-cities');\n__('Yancowinna', 'continents-cities');\n__('Etc', 'continents-cities');\n__('GMT', 'continents-cities');\n__('GMT+0', 'continents-cities');\n__('GMT+1', 'continents-cities');\n__('GMT+10', 'continents-cities');\n__('GMT+11', 'continents-cities');\n__('GMT+12', 'continents-cities');\n__('GMT+2', 'continents-cities');\n__('GMT+3', 'continents-cities');\n__('GMT+4', 'continents-cities');\n__('GMT+5', 'continents-cities');\n__('GMT+6', 'continents-cities');\n__('GMT+7', 'continents-cities');\n__('GMT+8', 'continents-cities');\n__('GMT+9', 'continents-cities');\n__('GMT-0', 'continents-cities');\n__('GMT-1', 'continents-cities');\n__('GMT-10', 'continents-cities');\n__('GMT-11', 'continents-cities');\n__('GMT-12', 'continents-cities');\n__('GMT-13', 'continents-cities');\n__('GMT-14', 'continents-cities');\n__('GMT-2', 'continents-cities');\n__('GMT-3', 'continents-cities');\n__('GMT-4', 'continents-cities');\n__('GMT-5', 'continents-cities');\n__('GMT-6', 'continents-cities');\n__('GMT-7', 'continents-cities');\n__('GMT-8', 'continents-cities');\n__('GMT-9', 'continents-cities');\n__('GMT0', 'continents-cities');\n__('Greenwich', 'continents-cities');\n__('UCT', 'continents-cities');\n__('Universal', 'continents-cities');\n__('UTC', 'continents-cities');\n__('Zulu', 'continents-cities');\n__('Europe', 'continents-cities');\n__('Amsterdam', 'continents-cities');\n__('Andorra', 'continents-cities');\n__('Athens', 'continents-cities');\n__('Belfast', 'continents-cities');\n__('Belgrade', 'continents-cities');\n__('Berlin', 'continents-cities');\n__('Bratislava', 'continents-cities');\n__('Brussels', 'continents-cities');\n__('Bucharest', 'continents-cities');\n__('Budapest', 'continents-cities');\n__('Chisinau', 'continents-cities');\n__('Copenhagen', 'continents-cities');\n__('Dublin', 'continents-cities');\n__('Gibraltar', 'continents-cities');\n__('Guernsey', 'continents-cities');\n__('Helsinki', 'continents-cities');\n__('Isle of Man', 'continents-cities');\n__('Jersey', 'continents-cities');\n__('Kaliningrad', 'continents-cities');\n__('Kiev', 'continents-cities');\n__('Lisbon', 'continents-cities');\n__('Ljubljana', 'continents-cities');\n__('London', 'continents-cities');\n__('Luxembourg', 'continents-cities');\n__('Madrid', 'continents-cities');\n__('Malta', 'continents-cities');\n__('Mariehamn', 'continents-cities');\n__('Minsk', 'continents-cities');\n__('Monaco', 'continents-cities');\n__('Moscow', 'continents-cities');\n__('Oslo', 'continents-cities');\n__('Paris', 'continents-cities');\n__('Podgorica', 'continents-cities');\n__('Prague', 'continents-cities');\n__('Riga', 'continents-cities');\n__('Rome', 'continents-cities');\n__('Samara', 'continents-cities');\n__('San Marino', 'continents-cities');\n__('Sarajevo', 'continents-cities');\n__('Simferopol', 'continents-cities');\n__('Skopje', 'continents-cities');\n__('Sofia', 'continents-cities');\n__('Stockholm', 'continents-cities');\n__('Tallinn', 'continents-cities');\n__('Tirane', 'continents-cities');\n__('Tiraspol', 'continents-cities');\n__('Uzhgorod', 'continents-cities');\n__('Vaduz', 'continents-cities');\n__('Vatican', 'continents-cities');\n__('Vienna', 'continents-cities');\n__('Vilnius', 'continents-cities');\n__('Volgograd', 'continents-cities');\n__('Warsaw', 'continents-cities');\n__('Zagreb', 'continents-cities');\n__('Zaporozhye', 'continents-cities');\n__('Zurich', 'continents-cities');\n__('Indian', 'continents-cities');\n__('Antananarivo', 'continents-cities');\n__('Chagos', 'continents-cities');\n__('Christmas', 'continents-cities');\n__('Cocos', 'continents-cities');\n__('Comoro', 'continents-cities');\n__('Kerguelen', 'continents-cities');\n__('Mahe', 'continents-cities');\n__('Maldives', 'continents-cities');\n__('Mauritius', 'continents-cities');\n__('Mayotte', 'continents-cities');\n__('Reunion', 'continents-cities');\n__('Pacific', 'continents-cities');\n__('Apia', 'continents-cities');\n__('Auckland', 'continents-cities');\n__('Chatham', 'continents-cities');\n__('Easter', 'continents-cities');\n__('Efate', 'continents-cities');\n__('Enderbury', 'continents-cities');\n__('Fakaofo', 'continents-cities');\n__('Fiji', 'continents-cities');\n__('Funafuti', 'continents-cities');\n__('Galapagos', 'continents-cities');\n__('Gambier', 'continents-cities');\n__('Guadalcanal', 'continents-cities');\n__('Guam', 'continents-cities');\n__('Honolulu', 'continents-cities');\n__('Johnston', 'continents-cities');\n__('Kiritimati', 'continents-cities');\n__('Kosrae', 'continents-cities');\n__('Kwajalein', 'continents-cities');\n__('Majuro', 'continents-cities');\n__('Marquesas', 'continents-cities');\n__('Midway', 'continents-cities');\n__('Nauru', 'continents-cities');\n__('Niue', 'continents-cities');\n__('Norfolk', 'continents-cities');\n__('Noumea', 'continents-cities');\n__('Pago Pago', 'continents-cities');\n__('Palau', 'continents-cities');\n__('Pitcairn', 'continents-cities');\n__('Ponape', 'continents-cities');\n__('Port Moresby', 'continents-cities');\n__('Rarotonga', 'continents-cities');\n__('Saipan', 'continents-cities');\n__('Samoa', 'continents-cities');\n__('Tahiti', 'continents-cities');\n__('Tarawa', 'continents-cities');\n__('Tongatapu', 'continents-cities');\n__('Truk', 'continents-cities');\n__('Wake', 'continents-cities');\n__('Wallis', 'continents-cities');\n__('Yap', 'continents-cities');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/credits.php",
    "content": "<?php\n/**\n * WordPress Credits Administration API.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Retrieve the contributor credits.\n *\n * @global string $wp_version The current WordPress version.\n *\n * @since 3.2.0\n *\n * @return array|false A list of all of the contributors, or false on error.\n*/\nfunction wp_credits() {\n\tglobal $wp_version;\n\t$locale = get_locale();\n\n\t$results = get_site_transient( 'wordpress_credits_' . $locale );\n\n\tif ( ! is_array( $results )\n\t\t|| false !== strpos( $wp_version, '-' )\n\t\t|| ( isset( $results['data']['version'] ) && strpos( $wp_version, $results['data']['version'] ) !== 0 )\n\t) {\n\t\t$response = wp_remote_get( \"http://api.wordpress.org/core/credits/1.1/?version=$wp_version&locale=$locale\" );\n\n\t\tif ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) )\n\t\t\treturn false;\n\n\t\t$results = json_decode( wp_remote_retrieve_body( $response ), true );\n\n\t\tif ( ! is_array( $results ) )\n\t\t\treturn false;\n\n\t\tset_site_transient( 'wordpress_credits_' . $locale, $results, DAY_IN_SECONDS );\n\t}\n\n\treturn $results;\n}\n\n/**\n * Retrieve the link to a contributor's WordPress.org profile page.\n *\n * @access private\n * @since 3.2.0\n *\n * @param string &$display_name The contributor's display name, passed by reference.\n * @param string $username      The contributor's username.\n * @param string $profiles      URL to the contributor's WordPress.org profile page.\n */\nfunction _wp_credits_add_profile_link( &$display_name, $username, $profiles ) {\n\t$display_name = '<a href=\"' . esc_url( sprintf( $profiles, $username ) ) . '\">' . esc_html( $display_name ) . '</a>';\n}\n\n/**\n * Retrieve the link to an external library used in WordPress.\n *\n * @access private\n * @since 3.2.0\n *\n * @param string &$data External library data, passed by reference.\n */\nfunction _wp_credits_build_object_link( &$data ) {\n\t$data = '<a href=\"' . esc_url( $data[1] ) . '\">' . esc_html( $data[0] ) . '</a>';\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/dashboard.php",
    "content": "<?php\n/**\n * WordPress Dashboard Widget Administration Screen API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Registers dashboard widgets.\n *\n * Handles POST data, sets up filters.\n *\n * @since 2.5.0\n *\n * @global array $wp_registered_widgets\n * @global array $wp_registered_widget_controls\n * @global array $wp_dashboard_control_callbacks\n */\nfunction wp_dashboard_setup() {\n\tglobal $wp_registered_widgets, $wp_registered_widget_controls, $wp_dashboard_control_callbacks;\n\t$wp_dashboard_control_callbacks = array();\n\t$screen = get_current_screen();\n\n\t/* Register Widgets and Controls */\n\n\t$response = wp_check_browser_version();\n\n\tif ( $response && $response['upgrade'] ) {\n\t\tadd_filter( 'postbox_classes_dashboard_dashboard_browser_nag', 'dashboard_browser_nag_class' );\n\t\tif ( $response['insecure'] )\n\t\t\twp_add_dashboard_widget( 'dashboard_browser_nag', __( 'You are using an insecure browser!' ), 'wp_dashboard_browser_nag' );\n\t\telse\n\t\t\twp_add_dashboard_widget( 'dashboard_browser_nag', __( 'Your browser is out of date!' ), 'wp_dashboard_browser_nag' );\n\t}\n\n\t// Right Now\n\tif ( is_blog_admin() && current_user_can('edit_posts') )\n\t\twp_add_dashboard_widget( 'dashboard_right_now', __( 'At a Glance' ), 'wp_dashboard_right_now' );\n\n\tif ( is_network_admin() )\n\t\twp_add_dashboard_widget( 'network_dashboard_right_now', __( 'Right Now' ), 'wp_network_dashboard_right_now' );\n\n\t// Activity Widget\n\tif ( is_blog_admin() ) {\n\t\twp_add_dashboard_widget( 'dashboard_activity', __( 'Activity' ), 'wp_dashboard_site_activity' );\n\t}\n\n\t// QuickPress Widget\n\tif ( is_blog_admin() && current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {\n\t\t$quick_draft_title = sprintf( '<span class=\"hide-if-no-js\">%1$s</span> <span class=\"hide-if-js\">%2$s</span>', __( 'Quick Draft' ), __( 'Drafts' ) );\n\t\twp_add_dashboard_widget( 'dashboard_quick_press', $quick_draft_title, 'wp_dashboard_quick_press' );\n\t}\n\n\t// WordPress News\n\twp_add_dashboard_widget( 'dashboard_primary', __( 'WordPress News' ), 'wp_dashboard_primary' );\n\n\tif ( is_network_admin() ) {\n\n\t\t/**\n\t\t * Fires after core widgets for the Network Admin dashboard have been registered.\n\t\t *\n\t\t * @since 3.1.0\n\t\t */\n\t\tdo_action( 'wp_network_dashboard_setup' );\n\n\t\t/**\n\t\t * Filter the list of widgets to load for the Network Admin dashboard.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array $dashboard_widgets An array of dashboard widgets.\n\t\t */\n\t\t$dashboard_widgets = apply_filters( 'wp_network_dashboard_widgets', array() );\n\t} elseif ( is_user_admin() ) {\n\n\t\t/**\n\t\t * Fires after core widgets for the User Admin dashboard have been registered.\n\t\t *\n\t\t * @since 3.1.0\n\t\t */\n\t\tdo_action( 'wp_user_dashboard_setup' );\n\n\t\t/**\n\t\t * Filter the list of widgets to load for the User Admin dashboard.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array $dashboard_widgets An array of dashboard widgets.\n\t\t */\n\t\t$dashboard_widgets = apply_filters( 'wp_user_dashboard_widgets', array() );\n\t} else {\n\n\t\t/**\n\t\t * Fires after core widgets for the admin dashboard have been registered.\n\t\t *\n\t\t * @since 2.5.0\n\t\t */\n\t\tdo_action( 'wp_dashboard_setup' );\n\n\t\t/**\n\t\t * Filter the list of widgets to load for the admin dashboard.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $dashboard_widgets An array of dashboard widgets.\n\t\t */\n\t\t$dashboard_widgets = apply_filters( 'wp_dashboard_widgets', array() );\n\t}\n\n\tforeach ( $dashboard_widgets as $widget_id ) {\n\t\t$name = empty( $wp_registered_widgets[$widget_id]['all_link'] ) ? $wp_registered_widgets[$widget_id]['name'] : $wp_registered_widgets[$widget_id]['name'] . \" <a href='{$wp_registered_widgets[$widget_id]['all_link']}' class='edit-box open-box'>\" . __('View all') . '</a>';\n\t\twp_add_dashboard_widget( $widget_id, $name, $wp_registered_widgets[$widget_id]['callback'], $wp_registered_widget_controls[$widget_id]['callback'] );\n\t}\n\n\tif ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget_id']) ) {\n\t\tcheck_admin_referer( 'edit-dashboard-widget_' . $_POST['widget_id'], 'dashboard-widget-nonce' );\n\t\tob_start(); // hack - but the same hack wp-admin/widgets.php uses\n\t\twp_dashboard_trigger_widget_control( $_POST['widget_id'] );\n\t\tob_end_clean();\n\t\twp_redirect( remove_query_arg( 'edit' ) );\n\t\texit;\n\t}\n\n\t/** This action is documented in wp-admin/edit-form-advanced.php */\n\tdo_action( 'do_meta_boxes', $screen->id, 'normal', '' );\n\n\t/** This action is documented in wp-admin/edit-form-advanced.php */\n\tdo_action( 'do_meta_boxes', $screen->id, 'side', '' );\n}\n\n/**\n *\n * @global array   $wp_dashboard_control_callbacks\n *\n * @param string   $widget_id\n * @param string   $widget_name\n * @param callable $callback\n * @param callable $control_callback\n * @param array    $callback_args\n */\nfunction wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null, $callback_args = null ) {\n\t$screen = get_current_screen();\n\tglobal $wp_dashboard_control_callbacks;\n\n\tif ( $control_callback && current_user_can( 'edit_dashboard' ) && is_callable( $control_callback ) ) {\n\t\t$wp_dashboard_control_callbacks[$widget_id] = $control_callback;\n\t\tif ( isset( $_GET['edit'] ) && $widget_id == $_GET['edit'] ) {\n\t\t\tlist($url) = explode( '#', add_query_arg( 'edit', false ), 2 );\n\t\t\t$widget_name .= ' <span class=\"postbox-title-action\"><a href=\"' . esc_url( $url ) . '\">' . __( 'Cancel' ) . '</a></span>';\n\t\t\t$callback = '_wp_dashboard_control_callback';\n\t\t} else {\n\t\t\tlist($url) = explode( '#', add_query_arg( 'edit', $widget_id ), 2 );\n\t\t\t$widget_name .= ' <span class=\"postbox-title-action\"><a href=\"' . esc_url( \"$url#$widget_id\" ) . '\" class=\"edit-box open-box\">' . __( 'Configure' ) . '</a></span>';\n\t\t}\n\t}\n\n\t$side_widgets = array( 'dashboard_quick_press', 'dashboard_primary' );\n\n\t$location = 'normal';\n\tif ( in_array($widget_id, $side_widgets) )\n\t\t$location = 'side';\n\n\t$priority = 'core';\n\tif ( 'dashboard_browser_nag' === $widget_id )\n\t\t$priority = 'high';\n\n\tadd_meta_box( $widget_id, $widget_name, $callback, $screen, $location, $priority, $callback_args );\n}\n\n/**\n *\n * @param type $dashboard\n * @param type $meta_box\n */\nfunction _wp_dashboard_control_callback( $dashboard, $meta_box ) {\n\techo '<form method=\"post\" class=\"dashboard-widget-control-form\">';\n\twp_dashboard_trigger_widget_control( $meta_box['id'] );\n\twp_nonce_field( 'edit-dashboard-widget_' . $meta_box['id'], 'dashboard-widget-nonce' );\n\techo '<input type=\"hidden\" name=\"widget_id\" value=\"' . esc_attr($meta_box['id']) . '\" />';\n\tsubmit_button( __('Submit') );\n\techo '</form>';\n}\n\n/**\n * Displays the dashboard.\n *\n * @since 2.5.0\n */\nfunction wp_dashboard() {\n\t$screen = get_current_screen();\n\t$columns = absint( $screen->get_columns() );\n\t$columns_css = '';\n\tif ( $columns ) {\n\t\t$columns_css = \" columns-$columns\";\n\t}\n\n?>\n<div id=\"dashboard-widgets\" class=\"metabox-holder<?php echo $columns_css; ?>\">\n\t<div id=\"postbox-container-1\" class=\"postbox-container\">\n\t<?php do_meta_boxes( $screen->id, 'normal', '' ); ?>\n\t</div>\n\t<div id=\"postbox-container-2\" class=\"postbox-container\">\n\t<?php do_meta_boxes( $screen->id, 'side', '' ); ?>\n\t</div>\n\t<div id=\"postbox-container-3\" class=\"postbox-container\">\n\t<?php do_meta_boxes( $screen->id, 'column3', '' ); ?>\n\t</div>\n\t<div id=\"postbox-container-4\" class=\"postbox-container\">\n\t<?php do_meta_boxes( $screen->id, 'column4', '' ); ?>\n\t</div>\n</div>\n\n<?php\n\twp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );\n\twp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );\n\n}\n\n//\n// Dashboard Widgets\n//\n\n/**\n * Dashboard widget that displays some basic stats about the site.\n *\n * Formerly 'Right Now'. A streamlined 'At a Glance' as of 3.8.\n *\n * @since 2.7.0\n */\nfunction wp_dashboard_right_now() {\n?>\n\t<div class=\"main\">\n\t<ul>\n\t<?php\n\t// Posts and Pages\n\tforeach ( array( 'post', 'page' ) as $post_type ) {\n\t\t$num_posts = wp_count_posts( $post_type );\n\t\tif ( $num_posts && $num_posts->publish ) {\n\t\t\tif ( 'post' == $post_type ) {\n\t\t\t\t$text = _n( '%s Post', '%s Posts', $num_posts->publish );\n\t\t\t} else {\n\t\t\t\t$text = _n( '%s Page', '%s Pages', $num_posts->publish );\n\t\t\t}\n\t\t\t$text = sprintf( $text, number_format_i18n( $num_posts->publish ) );\n\t\t\t$post_type_object = get_post_type_object( $post_type );\n\t\t\tif ( $post_type_object && current_user_can( $post_type_object->cap->edit_posts ) ) {\n\t\t\t\tprintf( '<li class=\"%1$s-count\"><a href=\"edit.php?post_type=%1$s\">%2$s</a></li>', $post_type, $text );\n\t\t\t} else {\n\t\t\t\tprintf( '<li class=\"%1$s-count\"><span>%2$s</span></li>', $post_type, $text );\n\t\t\t}\n\n\t\t}\n\t}\n\t// Comments\n\t$num_comm = wp_count_comments();\n\tif ( $num_comm && $num_comm->approved ) {\n\t\t$text = sprintf( _n( '%s Comment', '%s Comments', $num_comm->approved ), number_format_i18n( $num_comm->approved ) );\n\t\t?>\n\t\t<li class=\"comment-count\"><a href=\"edit-comments.php\"><?php echo $text; ?></a></li>\n\t\t<?php\n\t\t/* translators: Number of comments in moderation */\n\t\t$text = sprintf( _nx( '%s in moderation', '%s in moderation', $num_comm->moderated, 'comments' ), number_format_i18n( $num_comm->moderated ) );\n\t\t?>\n\t\t<li class=\"comment-mod-count<?php\n\t\t\tif ( ! $num_comm->moderated ) {\n\t\t\t\techo ' hidden';\n\t\t\t}\n\t\t?>\"><a href=\"edit-comments.php?comment_status=moderated\"><?php echo $text; ?></a></li>\n\t\t<?php\n\t}\n\n\t/**\n\t * Filter the array of extra elements to list in the 'At a Glance'\n\t * dashboard widget.\n\t *\n\t * Prior to 3.8.0, the widget was named 'Right Now'. Each element\n\t * is wrapped in list-item tags on output.\n\t *\n\t * @since 3.8.0\n\t *\n\t * @param array $items Array of extra 'At a Glance' widget items.\n\t */\n\t$elements = apply_filters( 'dashboard_glance_items', array() );\n\n\tif ( $elements ) {\n\t\techo '<li>' . implode( \"</li>\\n<li>\", $elements ) . \"</li>\\n\";\n\t}\n\n\t?>\n\t</ul>\n\t<?php\n\tupdate_right_now_message();\n\n\t// Check if search engines are asked not to index this site.\n\tif ( ! is_network_admin() && ! is_user_admin() && current_user_can( 'manage_options' ) && '1' != get_option( 'blog_public' ) ) {\n\n\t\t/**\n\t\t * Filter the link title attribute for the 'Search Engines Discouraged'\n\t\t * message displayed in the 'At a Glance' dashboard widget.\n\t\t *\n\t\t * Prior to 3.8.0, the widget was named 'Right Now'.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $title Default attribute text.\n\t\t */\n\t\t$title = apply_filters( 'privacy_on_link_title', __( 'Your site is asking search engines not to index its content' ) );\n\n\t\t/**\n\t\t * Filter the link label for the 'Search Engines Discouraged' message\n\t\t * displayed in the 'At a Glance' dashboard widget.\n\t\t *\n\t\t * Prior to 3.8.0, the widget was named 'Right Now'.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $content Default text.\n\t\t */\n\t\t$content = apply_filters( 'privacy_on_link_text' , __( 'Search Engines Discouraged' ) );\n\n\t\techo \"<p><a href='options-reading.php' title='$title'>$content</a></p>\";\n\t}\n\t?>\n\t</div>\n\t<?php\n\t/*\n\t * activity_box_end has a core action, but only prints content when multisite.\n\t * Using an output buffer is the only way to really check if anything's displayed here.\n\t */\n\tob_start();\n\n\t/**\n\t * Fires at the end of the 'At a Glance' dashboard widget.\n\t *\n\t * Prior to 3.8.0, the widget was named 'Right Now'.\n\t *\n\t * @since 2.5.0\n\t */\n\tdo_action( 'rightnow_end' );\n\n\t/**\n\t * Fires at the end of the 'At a Glance' dashboard widget.\n\t *\n\t * Prior to 3.8.0, the widget was named 'Right Now'.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'activity_box_end' );\n\n\t$actions = ob_get_clean();\n\n\tif ( !empty( $actions ) ) : ?>\n\t<div class=\"sub\">\n\t\t<?php echo $actions; ?>\n\t</div>\n\t<?php endif;\n}\n\n/**\n * @since 3.1.0\n */\nfunction wp_network_dashboard_right_now() {\n\t$actions = array();\n\tif ( current_user_can('create_sites') )\n\t\t$actions['create-site'] = '<a href=\"' . network_admin_url('site-new.php') . '\">' . __( 'Create a New Site' ) . '</a>';\n\tif ( current_user_can('create_users') )\n\t\t$actions['create-user'] = '<a href=\"' . network_admin_url('user-new.php') . '\">' . __( 'Create a New User' ) . '</a>';\n\n\t$c_users = get_user_count();\n\t$c_blogs = get_blog_count();\n\n\t$user_text = sprintf( _n( '%s user', '%s users', $c_users ), number_format_i18n( $c_users ) );\n\t$blog_text = sprintf( _n( '%s site', '%s sites', $c_blogs ), number_format_i18n( $c_blogs ) );\n\n\t$sentence = sprintf( __( 'You have %1$s and %2$s.' ), $blog_text, $user_text );\n\n\tif ( $actions ) {\n\t\techo '<ul class=\"subsubsub\">';\n\t\tforeach ( $actions as $class => $action ) {\n\t\t\t $actions[ $class ] = \"\\t<li class='$class'>$action\";\n\t\t}\n\t\techo implode( \" |</li>\\n\", $actions ) . \"</li>\\n\";\n\t\techo '</ul>';\n\t}\n?>\n\t<br class=\"clear\" />\n\n\t<p class=\"youhave\"><?php echo $sentence; ?></p>\n\n\n\t<?php\n\t\t/**\n\t\t * Fires in the Network Admin 'Right Now' dashboard widget\n\t\t * just before the user and site search form fields.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param null $unused\n\t\t */\n\t\tdo_action( 'wpmuadminresult', '' );\n\t?>\n\n\t<form action=\"<?php echo network_admin_url('users.php'); ?>\" method=\"get\">\n\t\t<p>\n\t\t\t<label class=\"screen-reader-text\" for=\"search-users\"><?php _e( 'Search Users' ); ?></label>\n\t\t\t<input type=\"search\" name=\"s\" value=\"\" size=\"30\" autocomplete=\"off\" id=\"search-users\"/>\n\t\t\t<?php submit_button( __( 'Search Users' ), 'button', false, false, array( 'id' => 'submit_users' ) ); ?>\n\t\t</p>\n\t</form>\n\n\t<form action=\"<?php echo network_admin_url('sites.php'); ?>\" method=\"get\">\n\t\t<p>\n\t\t\t<label class=\"screen-reader-text\" for=\"search-sites\"><?php _e( 'Search Sites' ); ?></label>\n\t\t\t<input type=\"search\" name=\"s\" value=\"\" size=\"30\" autocomplete=\"off\" id=\"search-sites\"/>\n\t\t\t<?php submit_button( __( 'Search Sites' ), 'button', false, false, array( 'id' => 'submit_sites' ) ); ?>\n\t\t</p>\n\t</form>\n<?php\n\t/**\n\t * Fires at the end of the 'Right Now' widget in the Network Admin dashboard.\n\t *\n\t * @since MU\n\t */\n\tdo_action( 'mu_rightnow_end' );\n\n\t/**\n\t * Fires at the end of the 'Right Now' widget in the Network Admin dashboard.\n\t *\n\t * @since MU\n\t */\n\tdo_action( 'mu_activity_box_end' );\n}\n\n/**\n * The Quick Draft widget display and creation of drafts.\n *\n * @since 3.8.0\n *\n * @global int $post_ID\n *\n * @param string $error_msg Optional. Error message. Default false.\n */\nfunction wp_dashboard_quick_press( $error_msg = false ) {\n\tglobal $post_ID;\n\n\tif ( ! current_user_can( 'edit_posts' ) ) {\n\t\treturn;\n\t}\n\n\t/* Check if a new auto-draft (= no new post_ID) is needed or if the old can be used */\n\t$last_post_id = (int) get_user_option( 'dashboard_quick_press_last_post_id' ); // Get the last post_ID\n\tif ( $last_post_id ) {\n\t\t$post = get_post( $last_post_id );\n\t\tif ( empty( $post ) || $post->post_status != 'auto-draft' ) { // auto-draft doesn't exists anymore\n\t\t\t$post = get_default_post_to_edit( 'post', true );\n\t\t\tupdate_user_option( get_current_user_id(), 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID\n\t\t} else {\n\t\t\t$post->post_title = ''; // Remove the auto draft title\n\t\t}\n\t} else {\n\t\t$post = get_default_post_to_edit( 'post' , true);\n\t\t$user_id = get_current_user_id();\n\t\t// Don't create an option if this is a super admin who does not belong to this site.\n\t\tif ( ! ( is_super_admin( $user_id ) && ! in_array( get_current_blog_id(), array_keys( get_blogs_of_user( $user_id ) ) ) ) )\n\t\t\tupdate_user_option( $user_id, 'dashboard_quick_press_last_post_id', (int) $post->ID ); // Save post_ID\n\t}\n\n\t$post_ID = (int) $post->ID;\n?>\n\n\t<form name=\"post\" action=\"<?php echo esc_url( admin_url( 'post.php' ) ); ?>\" method=\"post\" id=\"quick-press\" class=\"initial-form hide-if-no-js\">\n\n\t\t<?php if ( $error_msg ) : ?>\n\t\t<div class=\"error\"><?php echo $error_msg; ?></div>\n\t\t<?php endif; ?>\n\n\t\t<div class=\"input-text-wrap\" id=\"title-wrap\">\n\t\t\t<label class=\"screen-reader-text prompt\" for=\"title\" id=\"title-prompt-text\">\n\n\t\t\t\t<?php\n\t\t\t\t/** This filter is documented in wp-admin/edit-form-advanced.php */\n\t\t\t\techo apply_filters( 'enter_title_here', __( 'Title' ), $post );\n\t\t\t\t?>\n\t\t\t</label>\n\t\t\t<input type=\"text\" name=\"post_title\" id=\"title\" autocomplete=\"off\" />\n\t\t</div>\n\n\t\t<div class=\"textarea-wrap\" id=\"description-wrap\">\n\t\t\t<label class=\"screen-reader-text prompt\" for=\"content\" id=\"content-prompt-text\"><?php _e( 'What&#8217;s on your mind?' ); ?></label>\n\t\t\t<textarea name=\"content\" id=\"content\" class=\"mceEditor\" rows=\"3\" cols=\"15\" autocomplete=\"off\"></textarea>\n\t\t</div>\n\n\t\t<p class=\"submit\">\n\t\t\t<input type=\"hidden\" name=\"action\" id=\"quickpost-action\" value=\"post-quickdraft-save\" />\n\t\t\t<input type=\"hidden\" name=\"post_ID\" value=\"<?php echo $post_ID; ?>\" />\n\t\t\t<input type=\"hidden\" name=\"post_type\" value=\"post\" />\n\t\t\t<?php wp_nonce_field( 'add-post' ); ?>\n\t\t\t<?php submit_button( __( 'Save Draft' ), 'primary', 'save', false, array( 'id' => 'save-post' ) ); ?>\n\t\t\t<br class=\"clear\" />\n\t\t</p>\n\n\t</form>\n\t<?php\n\twp_dashboard_recent_drafts();\n}\n\n/**\n * Show recent drafts of the user on the dashboard.\n *\n * @since 2.7.0\n *\n * @param array $drafts\n */\nfunction wp_dashboard_recent_drafts( $drafts = false ) {\n\tif ( ! $drafts ) {\n\t\t$query_args = array(\n\t\t\t'post_type'      => 'post',\n\t\t\t'post_status'    => 'draft',\n\t\t\t'author'         => get_current_user_id(),\n\t\t\t'posts_per_page' => 4,\n\t\t\t'orderby'        => 'modified',\n\t\t\t'order'          => 'DESC'\n\t\t);\n\n\t\t/**\n\t\t * Filter the post query arguments for the 'Recent Drafts' dashboard widget.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array $query_args The query arguments for the 'Recent Drafts' dashboard widget.\n\t\t */\n\t\t$query_args = apply_filters( 'dashboard_recent_drafts_query_args', $query_args );\n\n\t\t$drafts = get_posts( $query_args );\n\t\tif ( ! $drafts ) {\n\t\t\treturn;\n \t\t}\n \t}\n\n\techo '<div class=\"drafts\">';\n\tif ( count( $drafts ) > 3 ) {\n\t\techo '<p class=\"view-all\"><a href=\"' . esc_url( admin_url( 'edit.php?post_status=draft' ) ) . '\" aria-label=\"' . __( 'View all drafts' ) . '\">' . _x( 'View all', 'drafts' ) . \"</a></p>\\n\";\n \t}\n\techo '<h2 class=\"hide-if-no-js\">' . __( 'Drafts' ) . \"</h2>\\n<ul>\";\n\n\t$drafts = array_slice( $drafts, 0, 3 );\n\tforeach ( $drafts as $draft ) {\n\t\t$url = get_edit_post_link( $draft->ID );\n\t\t$title = _draft_or_post_title( $draft->ID );\n\t\techo \"<li>\\n\";\n\t\techo '<div class=\"draft-title\"><a href=\"' . esc_url( $url ) . '\" title=\"' . esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $title ) ) . '\">' . esc_html( $title ) . '</a>';\n\t\techo '<time datetime=\"' . get_the_time( 'c', $draft ) . '\">' . get_the_time( get_option( 'date_format' ), $draft ) . '</time></div>';\n\t\tif ( $the_content = wp_trim_words( $draft->post_content, 10 ) ) {\n\t\t\techo '<p>' . $the_content . '</p>';\n \t\t}\n\t\techo \"</li>\\n\";\n \t}\n\techo \"</ul>\\n</div>\";\n}\n\n/**\n * @global WP_Comment $comment\n *\n * @param WP_Comment $comment\n * @param bool       $show_date\n */\nfunction _wp_dashboard_recent_comments_row( &$comment, $show_date = true ) {\n\t$GLOBALS['comment'] = clone $comment;\n\n\tif ( $comment->comment_post_ID > 0 && current_user_can( 'edit_post', $comment->comment_post_ID ) ) {\n\t\t$comment_post_title = _draft_or_post_title( $comment->comment_post_ID );\n\t\t$comment_post_url = get_edit_post_link( $comment->comment_post_ID );\n\t\t$comment_post_link = \"<a href='$comment_post_url'>$comment_post_title</a>\";\n\t} else {\n\t\t$comment_post_link = '';\n\t}\n\n\t$actions_string = '';\n\tif ( current_user_can( 'edit_comment', $comment->comment_ID ) ) {\n\t\t// Pre-order it: Approve | Reply | Edit | Spam | Trash.\n\t\t$actions = array(\n\t\t\t'approve' => '', 'unapprove' => '',\n\t\t\t'reply' => '',\n\t\t\t'edit' => '',\n\t\t\t'spam' => '',\n\t\t\t'trash' => '', 'delete' => '',\n\t\t\t'view' => '',\n\t\t);\n\n\t\t$del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( \"delete-comment_$comment->comment_ID\" ) );\n\t\t$approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( \"approve-comment_$comment->comment_ID\" ) );\n\n\t\t$approve_url = esc_url( \"comment.php?action=approvecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce\" );\n\t\t$unapprove_url = esc_url( \"comment.php?action=unapprovecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$approve_nonce\" );\n\t\t$spam_url = esc_url( \"comment.php?action=spamcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce\" );\n\t\t$trash_url = esc_url( \"comment.php?action=trashcomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce\" );\n\t\t$delete_url = esc_url( \"comment.php?action=deletecomment&p=$comment->comment_post_ID&c=$comment->comment_ID&$del_nonce\" );\n\n\t\t$actions['approve'] = \"<a href='$approve_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved' class='vim-a' title='\" . esc_attr__( 'Approve this comment' ) . \"'>\" . __( 'Approve' ) . '</a>';\n\t\t$actions['unapprove'] = \"<a href='$unapprove_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved' class='vim-u' title='\" . esc_attr__( 'Unapprove this comment' ) . \"'>\" . __( 'Unapprove' ) . '</a>';\n\t\t$actions['edit'] = \"<a href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='\" . esc_attr__('Edit comment') . \"'>\". __('Edit') . '</a>';\n\t\t$actions['reply'] = '<a onclick=\"window.commentReply && commentReply.open(\\''.$comment->comment_ID.'\\',\\''.$comment->comment_post_ID.'\\');return false;\" class=\"vim-r hide-if-no-js\" title=\"'.esc_attr__('Reply to this comment').'\" href=\"#\">' . __('Reply') . '</a>';\n\t\t$actions['spam'] = \"<a href='$spam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::spam=1' class='vim-s vim-destructive' title='\" . esc_attr__( 'Mark this comment as spam' ) . \"'>\" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';\n\n\t\tif ( ! EMPTY_TRASH_DAYS ) {\n\t\t\t$actions['delete'] = \"<a href='$delete_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive'>\" . __('Delete Permanently') . '</a>';\n\t\t} else {\n\t\t\t$actions['trash'] = \"<a href='$trash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive' title='\" . esc_attr__( 'Move this comment to the trash' ) . \"'>\" . _x('Trash', 'verb') . '</a>';\n\t\t}\n\n\t\tif ( '1' === $comment->comment_approved ) {\n\t\t\t$actions['view'] = '<a class=\"comment-link\" href=\"' . esc_url( get_comment_link( $comment ) ) . '\">' . _x( 'View', 'verb' ) . '</a>';\n\t\t}\n\n\t\t/**\n\t\t * Filter the action links displayed for each comment in the 'Recent Comments'\n\t\t * dashboard widget.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param array      $actions An array of comment actions. Default actions include:\n\t\t *                            'Approve', 'Unapprove', 'Edit', 'Reply', 'Spam',\n\t\t *                            'Delete', and 'Trash'.\n\t\t * @param WP_Comment $comment The comment object.\n\t\t */\n\t\t$actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment );\n\n\t\t$i = 0;\n\t\tforeach ( $actions as $action => $link ) {\n\t\t\t++$i;\n\t\t\t( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';\n\n\t\t\t// Reply and quickedit need a hide-if-no-js span\n\t\t\tif ( 'reply' == $action || 'quickedit' == $action )\n\t\t\t\t$action .= ' hide-if-no-js';\n\n\t\t\t$actions_string .= \"<span class='$action'>$sep$link</span>\";\n\t\t}\n\t}\n\n?>\n\n\t\t<div id=\"comment-<?php echo $comment->comment_ID; ?>\" <?php comment_class( array( 'comment-item', wp_get_comment_status( $comment ) ), $comment ); ?>>\n\n\t\t\t<?php echo get_avatar( $comment, 50, 'mystery' ); ?>\n\n\t\t\t<?php if ( !$comment->comment_type || 'comment' == $comment->comment_type ) : ?>\n\n\t\t\t<div class=\"dashboard-comment-wrap has-row-actions\">\n\t\t\t<p class=\"comment-meta\">\n\t\t\t\t<?php\n\t\t\t\tif ( $comment_post_link ) {\n\t\t\t\t\tprintf(\n\t\t\t\t\t\t/* translators: 1: comment author, 2: post link, 3: notification if the comment is pending */\n\t\t\t\t\t\t__( 'From %1$s on %2$s%3$s' ),\n\t\t\t\t\t\t'<cite class=\"comment-author\">' . get_comment_author_link( $comment ) . '</cite>',\n\t\t\t\t\t\t$comment_post_link,\n\t\t\t\t\t\t' <span class=\"approve\">' . __( '[Pending]' ) . '</span>'\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tprintf(\n\t\t\t\t\t\t/* translators: 1: comment author, 2: notification if the comment is pending */\n\t\t\t\t\t\t__( 'From %1$s %2$s' ),\n\t\t\t\t\t\t'<cite class=\"comment-author\">' . get_comment_author_link( $comment ) . '</cite>',\n\t\t\t\t\t\t' <span class=\"approve\">' . __( '[Pending]' ) . '</span>'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t?>\n\t\t\t</p>\n\n\t\t\t<?php\n\t\t\telse :\n\t\t\t\tswitch ( $comment->comment_type ) {\n\t\t\t\t\tcase 'pingback' :\n\t\t\t\t\t\t$type = __( 'Pingback' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'trackback' :\n\t\t\t\t\t\t$type = __( 'Trackback' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault :\n\t\t\t\t\t\t$type = ucwords( $comment->comment_type );\n\t\t\t\t}\n\t\t\t\t$type = esc_html( $type );\n\t\t\t?>\n\t\t\t<div class=\"dashboard-comment-wrap has-row-actions\">\n\t\t\t<?php /* translators: %1$s is type of comment, %2$s is link to the post */ ?>\n\t\t\t<p class=\"comment-meta\"><?php printf( _x( '%1$s on %2$s', 'dashboard' ), \"<strong>$type</strong>\", $comment_post_link ); ?></p>\n\t\t\t<p class=\"comment-author\"><?php comment_author_link( $comment ); ?></p>\n\n\t\t\t<?php endif; // comment_type ?>\n\t\t\t<blockquote><p><?php comment_excerpt( $comment ); ?></p></blockquote>\n\t\t\t<p class=\"row-actions\"><?php echo $actions_string; ?></p>\n\t\t\t</div>\n\t\t</div>\n<?php\n\t$GLOBALS['comment'] = null;\n}\n\n/**\n * Callback function for Activity widget.\n *\n * @since 3.8.0\n */\nfunction wp_dashboard_site_activity() {\n\n\techo '<div id=\"activity-widget\">';\n\n\t$future_posts = wp_dashboard_recent_posts( array(\n\t\t'max'     => 5,\n\t\t'status'  => 'future',\n\t\t'order'   => 'ASC',\n\t\t'title'   => __( 'Publishing Soon' ),\n\t\t'id'      => 'future-posts',\n\t) );\n\t$recent_posts = wp_dashboard_recent_posts( array(\n\t\t'max'     => 5,\n\t\t'status'  => 'publish',\n\t\t'order'   => 'DESC',\n\t\t'title'   => __( 'Recently Published' ),\n\t\t'id'      => 'published-posts',\n\t) );\n\n\t$recent_comments = wp_dashboard_recent_comments();\n\n\tif ( !$future_posts && !$recent_posts && !$recent_comments ) {\n\t\techo '<div class=\"no-activity\">';\n\t\techo '<p class=\"smiley\"></p>';\n\t\techo '<p>' . __( 'No activity yet!' ) . '</p>';\n\t\techo '</div>';\n\t}\n\n\techo '</div>';\n}\n\n/**\n * Generates Publishing Soon and Recently Published sections.\n *\n * @since 3.8.0\n *\n * @param array $args {\n *     An array of query and display arguments.\n *\n *     @type int    $max     Number of posts to display.\n *     @type string $status  Post status.\n *     @type string $order   Designates ascending ('ASC') or descending ('DESC') order.\n *     @type string $title   Section title.\n *     @type string $id      The container id.\n * }\n * @return bool False if no posts were found. True otherwise.\n */\nfunction wp_dashboard_recent_posts( $args ) {\n\t$query_args = array(\n\t\t'post_type'      => 'post',\n\t\t'post_status'    => $args['status'],\n\t\t'orderby'        => 'date',\n\t\t'order'          => $args['order'],\n\t\t'posts_per_page' => intval( $args['max'] ),\n\t\t'no_found_rows'  => true,\n\t\t'cache_results'  => false,\n\t\t'perm'           => ( 'future' === $args['status'] ) ? 'editable' : 'readable',\n\t);\n\n\t/**\n\t * Filter the query arguments used for the Recent Posts widget.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param array $query_args The arguments passed to WP_Query to produce the list of posts.\n\t */\n\t$query_args = apply_filters( 'dashboard_recent_posts_query_args', $query_args );\n\t$posts = new WP_Query( $query_args );\n\n\tif ( $posts->have_posts() ) {\n\n\t\techo '<div id=\"' . $args['id'] . '\" class=\"activity-block\">';\n\n\t\techo '<h3>' . $args['title'] . '</h3>';\n\n\t\techo '<ul>';\n\n\t\t$today    = date( 'Y-m-d', current_time( 'timestamp' ) );\n\t\t$tomorrow = date( 'Y-m-d', strtotime( '+1 day', current_time( 'timestamp' ) ) );\n\n\t\twhile ( $posts->have_posts() ) {\n\t\t\t$posts->the_post();\n\n\t\t\t$time = get_the_time( 'U' );\n\t\t\tif ( date( 'Y-m-d', $time ) == $today ) {\n\t\t\t\t$relative = __( 'Today' );\n\t\t\t} elseif ( date( 'Y-m-d', $time ) == $tomorrow ) {\n\t\t\t\t$relative = __( 'Tomorrow' );\n\t\t\t} elseif ( date( 'Y', $time ) !== date( 'Y', current_time( 'timestamp' ) ) ) {\n\t\t\t\t/* translators: date and time format for recent posts on the dashboard, from a different calendar year, see http://php.net/date */\n\t\t\t\t$relative = date_i18n( __( 'M jS Y' ), $time );\n\t\t\t} else {\n\t\t\t\t/* translators: date and time format for recent posts on the dashboard, see http://php.net/date */\n\t\t\t\t$relative = date_i18n( __( 'M jS' ), $time );\n\t\t\t}\n\n\t\t\t// Use the post edit link for those who can edit, the permalink otherwise.\n\t\t\t$recent_post_link = current_user_can( 'edit_post', get_the_ID() ) ? get_edit_post_link() : get_permalink();\n\n\t\t\t/* translators: 1: relative date, 2: time, 3: post edit link or permalink, 4: post title */\n\t\t\t$format = __( '<span>%1$s, %2$s</span> <a href=\"%3$s\">%4$s</a>' );\n\t\t\tprintf( \"<li>$format</li>\", $relative, get_the_time(), $recent_post_link, _draft_or_post_title() );\n\t\t}\n\n\t\techo '</ul>';\n\t\techo '</div>';\n\n\t} else {\n\t\treturn false;\n\t}\n\n\twp_reset_postdata();\n\n\treturn true;\n}\n\n/**\n * Show Comments section.\n *\n * @since 3.8.0\n *\n * @param int $total_items Optional. Number of comments to query. Default 5.\n * @return bool False if no comments were found. True otherwise.\n */\nfunction wp_dashboard_recent_comments( $total_items = 5 ) {\n\t// Select all comment types and filter out spam later for better query performance.\n\t$comments = array();\n\n\t$comments_query = array(\n\t\t'number' => $total_items * 5,\n\t\t'offset' => 0\n\t);\n\tif ( ! current_user_can( 'edit_posts' ) )\n\t\t$comments_query['status'] = 'approve';\n\n\twhile ( count( $comments ) < $total_items && $possible = get_comments( $comments_query ) ) {\n\t\tif ( ! is_array( $possible ) ) {\n\t\t\tbreak;\n\t\t}\n\t\tforeach ( $possible as $comment ) {\n\t\t\tif ( ! current_user_can( 'read_post', $comment->comment_post_ID ) )\n\t\t\t\tcontinue;\n\t\t\t$comments[] = $comment;\n\t\t\tif ( count( $comments ) == $total_items )\n\t\t\t\tbreak 2;\n\t\t}\n\t\t$comments_query['offset'] += $comments_query['number'];\n\t\t$comments_query['number'] = $total_items * 10;\n\t}\n\n\tif ( $comments ) {\n\t\techo '<div id=\"latest-comments\" class=\"activity-block\">';\n\t\techo '<h3>' . __( 'Comments' ) . '</h3>';\n\n\t\techo '<div id=\"the-comment-list\" data-wp-lists=\"list:comment\">';\n\t\tforeach ( $comments as $comment )\n\t\t\t_wp_dashboard_recent_comments_row( $comment );\n\t\techo '</div>';\n\n\t\tif ( current_user_can('edit_posts') )\n\t\t\t_get_list_table('WP_Comments_List_Table')->views();\n\n\t\twp_comment_reply( -1, false, 'dashboard', false );\n\t\twp_comment_trashnotice();\n\n\t\techo '</div>';\n\t} else {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/**\n * Display generic dashboard RSS widget feed.\n *\n * @since 2.5.0\n *\n * @param string $widget_id\n */\nfunction wp_dashboard_rss_output( $widget_id ) {\n\t$widgets = get_option( 'dashboard_widget_options' );\n\techo '<div class=\"rss-widget\">';\n\twp_widget_rss_output( $widgets[ $widget_id ] );\n\techo \"</div>\";\n}\n\n/**\n * Checks to see if all of the feed url in $check_urls are cached.\n *\n * If $check_urls is empty, look for the rss feed url found in the dashboard\n * widget options of $widget_id. If cached, call $callback, a function that\n * echoes out output for this widget. If not cache, echo a \"Loading...\" stub\n * which is later replaced by AJAX call (see top of /wp-admin/index.php)\n *\n * @since 2.5.0\n *\n * @param string $widget_id\n * @param callable $callback\n * @param array $check_urls RSS feeds\n * @return bool False on failure. True on success.\n */\nfunction wp_dashboard_cached_rss_widget( $widget_id, $callback, $check_urls = array() ) {\n\t$loading = '<p class=\"widget-loading hide-if-no-js\">' . __( 'Loading&#8230;' ) . '</p><p class=\"hide-if-js\">' . __( 'This widget requires JavaScript.' ) . '</p>';\n\t$doing_ajax = ( defined('DOING_AJAX') && DOING_AJAX );\n\n\tif ( empty($check_urls) ) {\n\t\t$widgets = get_option( 'dashboard_widget_options' );\n\t\tif ( empty($widgets[$widget_id]['url']) && ! $doing_ajax ) {\n\t\t\techo $loading;\n\t\t\treturn false;\n\t\t}\n\t\t$check_urls = array( $widgets[$widget_id]['url'] );\n\t}\n\n\t$locale = get_locale();\n\t$cache_key = 'dash_' . md5( $widget_id . '_' . $locale );\n\tif ( false !== ( $output = get_transient( $cache_key ) ) ) {\n\t\techo $output;\n\t\treturn true;\n\t}\n\n\tif ( ! $doing_ajax ) {\n\t\techo $loading;\n\t\treturn false;\n\t}\n\n\tif ( $callback && is_callable( $callback ) ) {\n\t\t$args = array_slice( func_get_args(), 3 );\n\t\tarray_unshift( $args, $widget_id, $check_urls );\n\t\tob_start();\n\t\tcall_user_func_array( $callback, $args );\n\t\tset_transient( $cache_key, ob_get_flush(), 12 * HOUR_IN_SECONDS ); // Default lifetime in cache of 12 hours (same as the feeds)\n\t}\n\n\treturn true;\n}\n\n//\n// Dashboard Widgets Controls\n//\n\n/**\n * Calls widget control callback.\n *\n * @since 2.5.0\n *\n * @global array $wp_dashboard_control_callbacks\n *\n * @param int $widget_control_id Registered Widget ID.\n */\nfunction wp_dashboard_trigger_widget_control( $widget_control_id = false ) {\n\tglobal $wp_dashboard_control_callbacks;\n\n\tif ( is_scalar($widget_control_id) && $widget_control_id && isset($wp_dashboard_control_callbacks[$widget_control_id]) && is_callable($wp_dashboard_control_callbacks[$widget_control_id]) ) {\n\t\tcall_user_func( $wp_dashboard_control_callbacks[$widget_control_id], '', array( 'id' => $widget_control_id, 'callback' => $wp_dashboard_control_callbacks[$widget_control_id] ) );\n\t}\n}\n\n/**\n * The RSS dashboard widget control.\n *\n * Sets up $args to be used as input to wp_widget_rss_form(). Handles POST data\n * from RSS-type widgets.\n *\n * @since 2.5.0\n *\n * @param string $widget_id\n * @param array $form_inputs\n */\nfunction wp_dashboard_rss_control( $widget_id, $form_inputs = array() ) {\n\tif ( !$widget_options = get_option( 'dashboard_widget_options' ) )\n\t\t$widget_options = array();\n\n\tif ( !isset($widget_options[$widget_id]) )\n\t\t$widget_options[$widget_id] = array();\n\n\t$number = 1; // Hack to use wp_widget_rss_form()\n\t$widget_options[$widget_id]['number'] = $number;\n\n\tif ( 'POST' == $_SERVER['REQUEST_METHOD'] && isset($_POST['widget-rss'][$number]) ) {\n\t\t$_POST['widget-rss'][$number] = wp_unslash( $_POST['widget-rss'][$number] );\n\t\t$widget_options[$widget_id] = wp_widget_rss_process( $_POST['widget-rss'][$number] );\n\t\t$widget_options[$widget_id]['number'] = $number;\n\n\t\t// Title is optional. If black, fill it if possible.\n\t\tif ( !$widget_options[$widget_id]['title'] && isset($_POST['widget-rss'][$number]['title']) ) {\n\t\t\t$rss = fetch_feed($widget_options[$widget_id]['url']);\n\t\t\tif ( is_wp_error($rss) ) {\n\t\t\t\t$widget_options[$widget_id]['title'] = htmlentities(__('Unknown Feed'));\n\t\t\t} else {\n\t\t\t\t$widget_options[$widget_id]['title'] = htmlentities(strip_tags($rss->get_title()));\n\t\t\t\t$rss->__destruct();\n\t\t\t\tunset($rss);\n\t\t\t}\n\t\t}\n\t\tupdate_option( 'dashboard_widget_options', $widget_options );\n\t\t$cache_key = 'dash_' . md5( $widget_id );\n\t\tdelete_transient( $cache_key );\n\t}\n\n\twp_widget_rss_form( $widget_options[$widget_id], $form_inputs );\n}\n\n/**\n * WordPress News dashboard widget.\n *\n * @since 2.7.0\n */\nfunction wp_dashboard_primary() {\n\t$feeds = array(\n\t\t'news' => array(\n\n\t\t\t/**\n\t\t\t * Filter the primary link URL for the 'WordPress News' dashboard widget.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string $link The widget's primary link URL.\n\t\t\t */\n\t\t\t'link' => apply_filters( 'dashboard_primary_link', __( 'https://wordpress.org/news/' ) ),\n\n\t\t\t/**\n\t\t\t * Filter the primary feed URL for the 'WordPress News' dashboard widget.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param string $url The widget's primary feed URL.\n\t\t\t */\n\t\t\t'url' => apply_filters( 'dashboard_primary_feed', __( 'http://wordpress.org/news/feed/' ) ),\n\n\t\t\t/**\n\t\t\t * Filter the primary link title for the 'WordPress News' dashboard widget.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param string $title Title attribute for the widget's primary link.\n\t\t\t */\n\t\t\t'title'        => apply_filters( 'dashboard_primary_title', __( 'WordPress Blog' ) ),\n\t\t\t'items'        => 1,\n\t\t\t'show_summary' => 1,\n\t\t\t'show_author'  => 0,\n\t\t\t'show_date'    => 1,\n\t\t),\n\t\t'planet' => array(\n\n\t\t\t/**\n\t\t\t * Filter the secondary link URL for the 'WordPress News' dashboard widget.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param string $link The widget's secondary link URL.\n\t\t\t */\n\t\t\t'link' => apply_filters( 'dashboard_secondary_link', __( 'https://planet.wordpress.org/' ) ),\n\n\t\t\t/**\n\t\t\t * Filter the secondary feed URL for the 'WordPress News' dashboard widget.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param string $url The widget's secondary feed URL.\n\t\t\t */\n\t\t\t'url' => apply_filters( 'dashboard_secondary_feed', __( 'https://planet.wordpress.org/feed/' ) ),\n\n\t\t\t/**\n\t\t\t * Filter the secondary link title for the 'WordPress News' dashboard widget.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param string $title Title attribute for the widget's secondary link.\n\t\t\t */\n\t\t\t'title'        => apply_filters( 'dashboard_secondary_title', __( 'Other WordPress News' ) ),\n\n\t\t\t/**\n\t\t\t * Filter the number of secondary link items for the 'WordPress News' dashboard widget.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param string $items How many items to show in the secondary feed.\n\t\t\t */\n\t\t\t'items'        => apply_filters( 'dashboard_secondary_items', 3 ),\n\t\t\t'show_summary' => 0,\n\t\t\t'show_author'  => 0,\n\t\t\t'show_date'    => 0,\n\t\t)\n\t);\n\n\tif ( ( ! is_multisite() && is_blog_admin() && current_user_can( 'install_plugins' ) ) || ( is_network_admin() && current_user_can( 'manage_network_plugins' ) && current_user_can( 'install_plugins' ) ) ) {\n\t\t$feeds['plugins'] = array(\n\t\t\t'link'         => '',\n\t\t\t'url'          => array(\n\t\t\t\t'popular' => 'http://wordpress.org/plugins/rss/browse/popular/',\n\t\t\t),\n\t\t\t'title'        => '',\n\t\t\t'items'        => 1,\n\t\t\t'show_summary' => 0,\n\t\t\t'show_author'  => 0,\n\t\t\t'show_date'    => 0,\n\t\t);\n\t}\n\n\twp_dashboard_cached_rss_widget( 'dashboard_primary', 'wp_dashboard_primary_output', $feeds );\n}\n\n/**\n * Display the WordPress news feeds.\n *\n * @since 3.8.0\n *\n * @param string $widget_id Widget ID.\n * @param array  $feeds     Array of RSS feeds.\n */\nfunction wp_dashboard_primary_output( $widget_id, $feeds ) {\n\tforeach ( $feeds as $type => $args ) {\n\t\t$args['type'] = $type;\n\t\techo '<div class=\"rss-widget\">';\n\t\tif ( $type === 'plugins' ) {\n\t\t\twp_dashboard_plugins_output( $args['url'], $args );\n\t\t} else {\n\t\t\twp_widget_rss_output( $args['url'], $args );\n\t\t}\n\t\techo \"</div>\";\n\t}\n}\n\n/**\n * Display plugins text for the WordPress news widget.\n *\n * @since 2.5.0\n */\nfunction wp_dashboard_plugins_output( $rss, $args = array() ) {\n\t// Plugin feeds plus link to install them\n\t$popular = fetch_feed( $args['url']['popular'] );\n\n\tif ( false === $plugin_slugs = get_transient( 'plugin_slugs' ) ) {\n\t\t$plugin_slugs = array_keys( get_plugins() );\n\t\tset_transient( 'plugin_slugs', $plugin_slugs, DAY_IN_SECONDS );\n\t}\n\n\techo '<ul>';\n\n\tforeach ( array( $popular ) as $feed ) {\n\t\tif ( is_wp_error( $feed ) || ! $feed->get_item_quantity() )\n\t\t\tcontinue;\n\n\t\t$items = $feed->get_items(0, 5);\n\n\t\t// Pick a random, non-installed plugin\n\t\twhile ( true ) {\n\t\t\t// Abort this foreach loop iteration if there's no plugins left of this type\n\t\t\tif ( 0 == count($items) )\n\t\t\t\tcontinue 2;\n\n\t\t\t$item_key = array_rand($items);\n\t\t\t$item = $items[$item_key];\n\n\t\t\tlist($link, $frag) = explode( '#', $item->get_link() );\n\n\t\t\t$link = esc_url($link);\n\t\t\tif ( preg_match( '|/([^/]+?)/?$|', $link, $matches ) )\n\t\t\t\t$slug = $matches[1];\n\t\t\telse {\n\t\t\t\tunset( $items[$item_key] );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Is this random plugin's slug already installed? If so, try again.\n\t\t\treset( $plugin_slugs );\n\t\t\tforeach ( $plugin_slugs as $plugin_slug ) {\n\t\t\t\tif ( $slug == substr( $plugin_slug, 0, strlen( $slug ) ) ) {\n\t\t\t\t\tunset( $items[$item_key] );\n\t\t\t\t\tcontinue 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we get to this point, then the random plugin isn't installed and we can stop the while().\n\t\t\tbreak;\n\t\t}\n\n\t\t// Eliminate some common badly formed plugin descriptions\n\t\twhile ( ( null !== $item_key = array_rand($items) ) && false !== strpos( $items[$item_key]->get_description(), 'Plugin Name:' ) )\n\t\t\tunset($items[$item_key]);\n\n\t\tif ( !isset($items[$item_key]) )\n\t\t\tcontinue;\n\n\t\t$title = esc_html( $item->get_title() );\n\n\t\t$ilink = wp_nonce_url('plugin-install.php?tab=plugin-information&plugin=' . $slug, 'install-plugin_' . $slug) . '&amp;TB_iframe=true&amp;width=600&amp;height=800';\n\t\techo \"<li class='dashboard-news-plugin'><span>\" . __( 'Popular Plugin' ) . \":</span> <a href='$link' class='dashboard-news-plugin-link'>$title</a>&nbsp;<span>(<a href='$ilink' class='thickbox' title='$title'>\" . __( 'Install' ) . \"</a>)</span></li>\";\n\n\t\t$feed->__destruct();\n\t\tunset( $feed );\n\t}\n\n\techo '</ul>';\n}\n\n/**\n * Display file upload quota on dashboard.\n *\n * Runs on the activity_box_end hook in wp_dashboard_right_now().\n *\n * @since 3.0.0\n *\n * @return bool|null True if not multisite, user can't upload files, or the space check option is disabled.\n*/\nfunction wp_dashboard_quota() {\n\tif ( !is_multisite() || !current_user_can( 'upload_files' ) || get_site_option( 'upload_space_check_disabled' ) )\n\t\treturn true;\n\n\t$quota = get_space_allowed();\n\t$used = get_space_used();\n\n\tif ( $used > $quota )\n\t\t$percentused = '100';\n\telse\n\t\t$percentused = ( $used / $quota ) * 100;\n\t$used_class = ( $percentused >= 70 ) ? ' warning' : '';\n\t$used = round( $used, 2 );\n\t$percentused = number_format( $percentused );\n\n\t?>\n\t<h3 class=\"mu-storage\"><?php _e( 'Storage Space' ); ?></h3>\n\t<div class=\"mu-storage\">\n\t<ul>\n\t\t<li class=\"storage-count\">\n\t\t\t<?php $text = sprintf(\n\t\t\t\t/* translators: number of megabytes */\n\t\t\t\t__( '%s MB Space Allowed' ),\n\t\t\t\tnumber_format_i18n( $quota )\n\t\t\t);\n\t\t\tprintf(\n\t\t\t\t'<a href=\"%1$s\" title=\"%2$s\">%3$s</a>',\n\t\t\t\tesc_url( admin_url( 'upload.php' ) ),\n\t\t\t\t__( 'Manage Uploads' ),\n\t\t\t\t$text\n\t\t\t); ?>\n\t\t</li><li class=\"storage-count <?php echo $used_class; ?>\">\n\t\t\t<?php $text = sprintf(\n\t\t\t\t/* translators: 1: number of megabytes, 2: percentage */\n\t\t\t\t__( '%1$s MB (%2$s%%) Space Used' ),\n\t\t\t\tnumber_format_i18n( $used, 2 ),\n\t\t\t\t$percentused\n\t\t\t);\n\t\t\tprintf(\n\t\t\t\t'<a href=\"%1$s\" title=\"%2$s\" class=\"musublink\">%3$s</a>',\n\t\t\t\tesc_url( admin_url( 'upload.php' ) ),\n\t\t\t\t__( 'Manage Uploads' ),\n\t\t\t\t$text\n\t\t\t); ?>\n\t\t</li>\n\t</ul>\n\t</div>\n\t<?php\n}\n\n// Display Browser Nag Meta Box\nfunction wp_dashboard_browser_nag() {\n\t$notice = '';\n\t$response = wp_check_browser_version();\n\n\tif ( $response ) {\n\t\tif ( $response['insecure'] ) {\n\t\t\t/* translators: %s: browser name and link */\n\t\t\t$msg = sprintf( __( \"It looks like you're using an insecure version of %s. Using an outdated browser makes your computer unsafe. For the best WordPress experience, please update your browser.\" ),\n\t\t\t\tsprintf( '<a href=\"%s\">%s</a>', esc_url( $response['update_url'] ), esc_html( $response['name'] ) )\n\t\t\t);\n\t\t} else {\n\t\t\t/* translators: %s: browser name and link */\n\t\t\t$msg = sprintf( __( \"It looks like you're using an old version of %s. For the best WordPress experience, please update your browser.\" ),\n\t\t\t\tsprintf( '<a href=\"%s\">%s</a>', esc_url( $response['update_url'] ), esc_html( $response['name'] ) )\n\t\t\t);\n\t\t}\n\n\t\t$browser_nag_class = '';\n\t\tif ( !empty( $response['img_src'] ) ) {\n\t\t\t$img_src = ( is_ssl() && ! empty( $response['img_src_ssl'] ) )? $response['img_src_ssl'] : $response['img_src'];\n\n\t\t\t$notice .= '<div class=\"alignright browser-icon\"><a href=\"' . esc_attr($response['update_url']) . '\"><img src=\"' . esc_attr( $img_src ) . '\" alt=\"\" /></a></div>';\n\t\t\t$browser_nag_class = ' has-browser-icon';\n\t\t}\n\t\t$notice .= \"<p class='browser-update-nag{$browser_nag_class}'>{$msg}</p>\";\n\n\t\t$browsehappy = 'http://browsehappy.com/';\n\t\t$locale = get_locale();\n\t\tif ( 'en_US' !== $locale )\n\t\t\t$browsehappy = add_query_arg( 'locale', $locale, $browsehappy );\n\n\t\t$notice .= '<p>' . sprintf( __( '<a href=\"%1$s\" class=\"update-browser-link\">Update %2$s</a> or learn how to <a href=\"%3$s\" class=\"browse-happy-link\">browse happy</a>' ), esc_attr( $response['update_url'] ), esc_html( $response['name'] ), esc_url( $browsehappy ) ) . '</p>';\n\t\t$notice .= '<p class=\"hide-if-no-js\"><a href=\"\" class=\"dismiss\">' . __( 'Dismiss' ) . '</a></p>';\n\t\t$notice .= '<div class=\"clear\"></div>';\n\t}\n\n\t/**\n\t* Filter the notice output for the 'Browse Happy' nag meta box.\n\t*\n\t* @since 3.2.0\n\t*\n\t* @param string $notice   The notice content.\n\t* @param array  $response An array containing web browser information.\n\t*/\n\techo apply_filters( 'browse-happy-notice', $notice, $response );\n}\n\n/**\n * @since 3.2.0\n *\n * @param array $classes\n * @return array\n */\nfunction dashboard_browser_nag_class( $classes ) {\n\t$response = wp_check_browser_version();\n\n\tif ( $response && $response['insecure'] )\n\t\t$classes[] = 'browser-insecure';\n\n\treturn $classes;\n}\n\n/**\n * Check if the user needs a browser update\n *\n * @since 3.2.0\n *\n * @global string $wp_version\n *\n * @return array|bool False on failure, array of browser data on success.\n */\nfunction wp_check_browser_version() {\n\tif ( empty( $_SERVER['HTTP_USER_AGENT'] ) )\n\t\treturn false;\n\n\t$key = md5( $_SERVER['HTTP_USER_AGENT'] );\n\n\tif ( false === ($response = get_site_transient('browser_' . $key) ) ) {\n\t\tglobal $wp_version;\n\n\t\t$options = array(\n\t\t\t'body'\t\t\t=> array( 'useragent' => $_SERVER['HTTP_USER_AGENT'] ),\n\t\t\t'user-agent'\t=> 'WordPress/' . $wp_version . '; ' . home_url()\n\t\t);\n\n\t\t$response = wp_remote_post( 'http://api.wordpress.org/core/browse-happy/1.1/', $options );\n\n\t\tif ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) )\n\t\t\treturn false;\n\n\t\t/**\n\t\t * Response should be an array with:\n\t\t *  'name' - string - A user friendly browser name\n\t\t *  'version' - string - The version of the browser the user is using\n\t\t *  'current_version' - string - The most recent version of the browser\n\t\t *  'upgrade' - boolean - Whether the browser needs an upgrade\n\t\t *  'insecure' - boolean - Whether the browser is deemed insecure\n\t\t *  'upgrade_url' - string - The url to visit to upgrade\n\t\t *  'img_src' - string - An image representing the browser\n\t\t *  'img_src_ssl' - string - An image (over SSL) representing the browser\n\t\t */\n\t\t$response = json_decode( wp_remote_retrieve_body( $response ), true );\n\n\t\tif ( ! is_array( $response ) )\n\t\t\treturn false;\n\n\t\tset_site_transient( 'browser_' . $key, $response, WEEK_IN_SECONDS );\n\t}\n\n\treturn $response;\n}\n\n/**\n * Empty function usable by plugins to output empty dashboard widget (to be populated later by JS).\n */\nfunction wp_dashboard_empty() {}\n\n/**\n * Displays a welcome panel to introduce users to WordPress.\n *\n * @since 3.3.0\n */\nfunction wp_welcome_panel() {\n\t?>\n\t<div class=\"welcome-panel-content\">\n\t<h2><?php _e( 'Welcome to WordPress!' ); ?></h2>\n\t<p class=\"about-description\"><?php _e( 'We&#8217;ve assembled some links to get you started:' ); ?></p>\n\t<div class=\"welcome-panel-column-container\">\n\t<div class=\"welcome-panel-column\">\n\t\t<?php if ( current_user_can( 'customize' ) ): ?>\n\t\t\t<h3><?php _e( 'Get Started' ); ?></h3>\n\t\t\t<a class=\"button button-primary button-hero load-customize hide-if-no-customize\" href=\"<?php echo wp_customize_url(); ?>\"><?php _e( 'Customize Your Site' ); ?></a>\n\t\t<?php endif; ?>\n\t\t<a class=\"button button-primary button-hero hide-if-customize\" href=\"<?php echo admin_url( 'themes.php' ); ?>\"><?php _e( 'Customize Your Site' ); ?></a>\n\t\t<?php if ( current_user_can( 'install_themes' ) || ( current_user_can( 'switch_themes' ) && count( wp_get_themes( array( 'allowed' => true ) ) ) > 1 ) ) : ?>\n\t\t\t<p class=\"hide-if-no-customize\"><?php printf( __( 'or, <a href=\"%s\">change your theme completely</a>' ), admin_url( 'themes.php' ) ); ?></p>\n\t\t<?php endif; ?>\n\t</div>\n\t<div class=\"welcome-panel-column\">\n\t\t<h3><?php _e( 'Next Steps' ); ?></h3>\n\t\t<ul>\n\t\t<?php if ( 'page' == get_option( 'show_on_front' ) && ! get_option( 'page_for_posts' ) ) : ?>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-edit-page\">' . __( 'Edit your front page' ) . '</a>', get_edit_post_link( get_option( 'page_on_front' ) ) ); ?></li>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-add-page\">' . __( 'Add additional pages' ) . '</a>', admin_url( 'post-new.php?post_type=page' ) ); ?></li>\n\t\t<?php elseif ( 'page' == get_option( 'show_on_front' ) ) : ?>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-edit-page\">' . __( 'Edit your front page' ) . '</a>', get_edit_post_link( get_option( 'page_on_front' ) ) ); ?></li>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-add-page\">' . __( 'Add additional pages' ) . '</a>', admin_url( 'post-new.php?post_type=page' ) ); ?></li>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-write-blog\">' . __( 'Add a blog post' ) . '</a>', admin_url( 'post-new.php' ) ); ?></li>\n\t\t<?php else : ?>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-write-blog\">' . __( 'Write your first blog post' ) . '</a>', admin_url( 'post-new.php' ) ); ?></li>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-add-page\">' . __( 'Add an About page' ) . '</a>', admin_url( 'post-new.php?post_type=page' ) ); ?></li>\n\t\t<?php endif; ?>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-view-site\">' . __( 'View your site' ) . '</a>', home_url( '/' ) ); ?></li>\n\t\t</ul>\n\t</div>\n\t<div class=\"welcome-panel-column welcome-panel-last\">\n\t\t<h3><?php _e( 'More Actions' ); ?></h3>\n\t\t<ul>\n\t\t<?php if ( current_theme_supports( 'widgets' ) || current_theme_supports( 'menus' ) ) : ?>\n\t\t\t<li><div class=\"welcome-icon welcome-widgets-menus\"><?php\n\t\t\t\tif ( current_theme_supports( 'widgets' ) && current_theme_supports( 'menus' ) ) {\n\t\t\t\t\tprintf( __( 'Manage <a href=\"%1$s\">widgets</a> or <a href=\"%2$s\">menus</a>' ),\n\t\t\t\t\t\tadmin_url( 'widgets.php' ), admin_url( 'nav-menus.php' ) );\n\t\t\t\t} elseif ( current_theme_supports( 'widgets' ) ) {\n\t\t\t\t\techo '<a href=\"' . admin_url( 'widgets.php' ) . '\">' . __( 'Manage widgets' ) . '</a>';\n\t\t\t\t} else {\n\t\t\t\t\techo '<a href=\"' . admin_url( 'nav-menus.php' ) . '\">' . __( 'Manage menus' ) . '</a>';\n\t\t\t\t}\n\t\t\t?></div></li>\n\t\t<?php endif; ?>\n\t\t<?php if ( current_user_can( 'manage_options' ) ) : ?>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-comments\">' . __( 'Turn comments on or off' ) . '</a>', admin_url( 'options-discussion.php' ) ); ?></li>\n\t\t<?php endif; ?>\n\t\t\t<li><?php printf( '<a href=\"%s\" class=\"welcome-icon welcome-learn-more\">' . __( 'Learn more about getting started' ) . '</a>', __( 'https://codex.wordpress.org/First_Steps_With_WordPress' ) ); ?></li>\n\t\t</ul>\n\t</div>\n\t</div>\n\t</div>\n\t<?php\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/deprecated.php",
    "content": "<?php\n/**\n * Deprecated admin functions from past WordPress versions. You shouldn't use these\n * functions and look for the alternatives instead. The functions will be removed\n * in a later version.\n *\n * @package WordPress\n * @subpackage Deprecated\n */\n\n/*\n * Deprecated functions come here to die.\n */\n\n/**\n * @since 2.1.0\n * @deprecated 2.1.0 Use wp_editor()\n * @see wp_editor()\n */\nfunction tinymce_include() {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_editor()' );\n\n\twp_tiny_mce();\n}\n\n/**\n * Unused Admin function.\n *\n * @since 2.0.0\n * @deprecated 2.5.0\n *\n */\nfunction documentation_link() {\n\t_deprecated_function( __FUNCTION__, '2.5' );\n}\n\n/**\n * Calculates the new dimensions for a downsampled image.\n *\n * @since 2.0.0\n * @deprecated 3.0.0 Use wp_constrain_dimensions()\n * @see wp_constrain_dimensions()\n *\n * @param int $width Current width of the image\n * @param int $height Current height of the image\n * @param int $wmax Maximum wanted width\n * @param int $hmax Maximum wanted height\n * @return array Shrunk dimensions (width, height).\n */\nfunction wp_shrink_dimensions( $width, $height, $wmax = 128, $hmax = 96 ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'wp_constrain_dimensions()' );\n\treturn wp_constrain_dimensions( $width, $height, $wmax, $hmax );\n}\n\n/**\n * Calculated the new dimensions for a downsampled image.\n *\n * @since 2.0.0\n * @deprecated 3.5.0 Use wp_constrain_dimensions()\n * @see wp_constrain_dimensions()\n *\n * @param int $width Current width of the image\n * @param int $height Current height of the image\n * @return array Shrunk dimensions (width, height).\n */\nfunction get_udims( $width, $height ) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'wp_constrain_dimensions()' );\n\treturn wp_constrain_dimensions( $width, $height, 128, 96 );\n}\n\n/**\n * Legacy function used to generate the categories checklist control.\n *\n * @since 0.71\n * @deprecated 2.6.0 Use wp_category_checklist()\n * @see wp_category_checklist()\n *\n * @param int $default       Unused.\n * @param int $parent        Unused.\n * @param array $popular_ids Unused.\n */\nfunction dropdown_categories( $default = 0, $parent = 0, $popular_ids = array() ) {\n\t_deprecated_function( __FUNCTION__, '2.6', 'wp_category_checklist()' );\n\tglobal $post_ID;\n\twp_category_checklist( $post_ID );\n}\n\n/**\n * Legacy function used to generate a link categories checklist control.\n *\n * @since 2.1.0\n * @deprecated 2.6.0 Use wp_link_category_checklist()\n * @see wp_link_category_checklist()\n *\n * @param int $default Unused.\n */\nfunction dropdown_link_categories( $default = 0 ) {\n\t_deprecated_function( __FUNCTION__, '2.6', 'wp_link_category_checklist()' );\n\tglobal $link_id;\n\twp_link_category_checklist( $link_id );\n}\n\n/**\n * Get the real filesystem path to a file to edit within the admin.\n *\n * @since 1.5.0\n * @deprecated 2.9.0\n * @uses WP_CONTENT_DIR Full filesystem path to the wp-content directory.\n *\n * @param string $file Filesystem path relative to the wp-content directory.\n * @return string Full filesystem path to edit.\n */\nfunction get_real_file_to_edit( $file ) {\n\t_deprecated_function( __FUNCTION__, '2.9' );\n\n\treturn WP_CONTENT_DIR . $file;\n}\n\n/**\n * Legacy function used for generating a categories drop-down control.\n *\n * @since 1.2.0\n * @deprecated 3.0.0 Use wp_dropdown_categories()\n * @see wp_dropdown_categories()\n *\n * @param int $currentcat    Optional. ID of the current category. Default 0.\n * @param int $currentparent Optional. Current parent category ID. Default 0.\n * @param int $parent        Optional. Parent ID to retrieve categories for. Default 0.\n * @param int $level         Optional. Number of levels deep to display. Default 0.\n * @param array $categories  Optional. Categories to include in the control. Default 0.\n * @return bool|null False if no categories were found.\n */\nfunction wp_dropdown_cats( $currentcat = 0, $currentparent = 0, $parent = 0, $level = 0, $categories = 0 ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'wp_dropdown_categories()' );\n\tif (!$categories )\n\t\t$categories = get_categories( array('hide_empty' => 0) );\n\n\tif ( $categories ) {\n\t\tforeach ( $categories as $category ) {\n\t\t\tif ( $currentcat != $category->term_id && $parent == $category->parent) {\n\t\t\t\t$pad = str_repeat( '&#8211; ', $level );\n\t\t\t\t$category->name = esc_html( $category->name );\n\t\t\t\techo \"\\n\\t<option value='$category->term_id'\";\n\t\t\t\tif ( $currentparent == $category->term_id )\n\t\t\t\t\techo \" selected='selected'\";\n\t\t\t\techo \">$pad$category->name</option>\";\n\t\t\t\twp_dropdown_cats( $currentcat, $currentparent, $category->term_id, $level +1, $categories );\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * Register a setting and its sanitization callback\n *\n * @since 2.7.0\n * @deprecated 3.0.0 Use register_setting()\n * @see register_setting()\n *\n * @param string $option_group A settings group name. Should correspond to a whitelisted option key name.\n * \tDefault whitelisted option key names include \"general,\" \"discussion,\" and \"reading,\" among others.\n * @param string $option_name The name of an option to sanitize and save.\n * @param callable $sanitize_callback A callback function that sanitizes the option's value.\n */\nfunction add_option_update_handler( $option_group, $option_name, $sanitize_callback = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'register_setting()' );\n\tregister_setting( $option_group, $option_name, $sanitize_callback );\n}\n\n/**\n * Unregister a setting\n *\n * @since 2.7.0\n * @deprecated 3.0.0 Use unregister_setting()\n * @see unregister_setting()\n *\n * @param string $option_group\n * @param string $option_name\n * @param callable $sanitize_callback\n */\nfunction remove_option_update_handler( $option_group, $option_name, $sanitize_callback = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'unregister_setting()' );\n\tunregister_setting( $option_group, $option_name, $sanitize_callback );\n}\n\n/**\n * Determines the language to use for CodePress syntax highlighting.\n *\n * @since 2.8.0\n * @deprecated 3.0.0\n *\n * @param string $filename\n**/\nfunction codepress_get_lang( $filename ) {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\n\n/**\n * Adds JavaScript required to make CodePress work on the theme/plugin editors.\n *\n * @since 2.8.0\n * @deprecated 3.0.0\n**/\nfunction codepress_footer_js() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\n\n/**\n * Determine whether to use CodePress.\n *\n * @since 2.8.0\n * @deprecated 3.0.0\n**/\nfunction use_codepress() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\n\n/**\n * Get all user IDs.\n *\n * @deprecated 3.1.0 Use get_users()\n *\n * @return array List of user IDs.\n */\nfunction get_author_user_ids() {\n\t_deprecated_function( __FUNCTION__, '3.1', 'get_users()' );\n\n\tglobal $wpdb;\n\tif ( !is_multisite() )\n\t\t$level_key = $wpdb->get_blog_prefix() . 'user_level';\n\telse\n\t\t$level_key = $wpdb->get_blog_prefix() . 'capabilities'; // wpmu site admins don't have user_levels\n\n\treturn $wpdb->get_col( $wpdb->prepare(\"SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value != '0'\", $level_key) );\n}\n\n/**\n * Gets author users who can edit posts.\n *\n * @deprecated 3.1.0 Use get_users()\n *\n * @param int $user_id User ID.\n * @return array|bool List of editable authors. False if no editable users.\n */\nfunction get_editable_authors( $user_id ) {\n\t_deprecated_function( __FUNCTION__, '3.1', 'get_users()' );\n\n\tglobal $wpdb;\n\n\t$editable = get_editable_user_ids( $user_id );\n\n\tif ( !$editable ) {\n\t\treturn false;\n\t} else {\n\t\t$editable = join(',', $editable);\n\t\t$authors = $wpdb->get_results( \"SELECT * FROM $wpdb->users WHERE ID IN ($editable) ORDER BY display_name\" );\n\t}\n\n\treturn apply_filters('get_editable_authors', $authors);\n}\n\n/**\n * Gets the IDs of any users who can edit posts.\n *\n * @deprecated 3.1.0 Use get_users()\n *\n * @param int $user_id User ID.\n * @param bool $exclude_zeros Optional, default is true. Whether to exclude zeros.\n * @return mixed\n */\nfunction get_editable_user_ids( $user_id, $exclude_zeros = true, $post_type = 'post' ) {\n\t_deprecated_function( __FUNCTION__, '3.1', 'get_users()' );\n\n\tglobal $wpdb;\n\n\tif ( ! $user = get_userdata( $user_id ) )\n\t\treturn array();\n\t$post_type_obj = get_post_type_object($post_type);\n\n\tif ( ! $user->has_cap($post_type_obj->cap->edit_others_posts) ) {\n\t\tif ( $user->has_cap($post_type_obj->cap->edit_posts) || ! $exclude_zeros )\n\t\t\treturn array($user->ID);\n\t\telse\n\t\t\treturn array();\n\t}\n\n\tif ( !is_multisite() )\n\t\t$level_key = $wpdb->get_blog_prefix() . 'user_level';\n\telse\n\t\t$level_key = $wpdb->get_blog_prefix() . 'capabilities'; // wpmu site admins don't have user_levels\n\n\t$query = $wpdb->prepare(\"SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s\", $level_key);\n\tif ( $exclude_zeros )\n\t\t$query .= \" AND meta_value != '0'\";\n\n\treturn $wpdb->get_col( $query );\n}\n\n/**\n * Gets all users who are not authors.\n *\n * @deprecated 3.1.0 Use get_users()\n */\nfunction get_nonauthor_user_ids() {\n\t_deprecated_function( __FUNCTION__, '3.1', 'get_users()' );\n\n\tglobal $wpdb;\n\n\tif ( !is_multisite() )\n\t\t$level_key = $wpdb->get_blog_prefix() . 'user_level';\n\telse\n\t\t$level_key = $wpdb->get_blog_prefix() . 'capabilities'; // wpmu site admins don't have user_levels\n\n\treturn $wpdb->get_col( $wpdb->prepare(\"SELECT user_id FROM $wpdb->usermeta WHERE meta_key = %s AND meta_value = '0'\", $level_key) );\n}\n\nif ( ! class_exists( 'WP_User_Search', false ) ) :\n/**\n * WordPress User Search class.\n *\n * @since 2.1.0\n * @deprecated 3.1.0 Use WP_User_Query\n */\nclass WP_User_Search {\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var mixed\n\t */\n\tvar $results;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $search_term;\n\n\t/**\n\t * Page number.\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var int\n\t */\n\tvar $page;\n\n\t/**\n\t * Role name that users have.\n\t *\n\t * @since 2.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $role;\n\n\t/**\n\t * Raw page number.\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var int|bool\n\t */\n\tvar $raw_page;\n\n\t/**\n\t * Amount of users to display per page.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var int\n\t */\n\tvar $users_per_page = 50;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var int\n\t */\n\tvar $first_user;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var int\n\t */\n\tvar $last_user;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $query_limit;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $query_orderby;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $query_from;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $query_where;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var int\n\t */\n\tvar $total_users_for_query = 0;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var bool\n\t */\n\tvar $too_many_total_users = false;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var WP_Error\n\t */\n\tvar $search_errors;\n\n\t/**\n\t * {@internal Missing Description}}\n\t *\n\t * @since 2.7.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $paging_text;\n\n\t/**\n\t * PHP5 Constructor - Sets up the object properties.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $search_term Search terms string.\n\t * @param int $page Optional. Page ID.\n\t * @param string $role Role name.\n\t * @return WP_User_Search\n\t */\n\tfunction __construct( $search_term = '', $page = '', $role = '' ) {\n\t\t_deprecated_function( __FUNCTION__, '3.1', 'WP_User_Query' );\n\n\t\t$this->search_term = wp_unslash( $search_term );\n\t\t$this->raw_page = ( '' == $page ) ? false : (int) $page;\n\t\t$this->page = (int) ( '' == $page ) ? 1 : $page;\n\t\t$this->role = $role;\n\n\t\t$this->prepare_query();\n\t\t$this->query();\n\t\t$this->do_paging();\n\t}\n\n\t/**\n\t * PHP4 Constructor - Sets up the object properties.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $search_term Search terms string.\n\t * @param int $page Optional. Page ID.\n\t * @param string $role Role name.\n\t * @return WP_User_Search\n\t */\n\tpublic function WP_User_Search( $search_term = '', $page = '', $role = '' ) {\n\t\tself::__construct( $search_term, $page, $role );\n\t}\n\n\t/**\n\t * Prepares the user search query (legacy).\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t */\n\tpublic function prepare_query() {\n\t\tglobal $wpdb;\n\t\t$this->first_user = ($this->page - 1) * $this->users_per_page;\n\n\t\t$this->query_limit = $wpdb->prepare(\" LIMIT %d, %d\", $this->first_user, $this->users_per_page);\n\t\t$this->query_orderby = ' ORDER BY user_login';\n\n\t\t$search_sql = '';\n\t\tif ( $this->search_term ) {\n\t\t\t$searches = array();\n\t\t\t$search_sql = 'AND (';\n\t\t\tforeach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col )\n\t\t\t\t$searches[] = $wpdb->prepare( $col . ' LIKE %s', '%' . like_escape($this->search_term) . '%' );\n\t\t\t$search_sql .= implode(' OR ', $searches);\n\t\t\t$search_sql .= ')';\n\t\t}\n\n\t\t$this->query_from = \" FROM $wpdb->users\";\n\t\t$this->query_where = \" WHERE 1=1 $search_sql\";\n\n\t\tif ( $this->role ) {\n\t\t\t$this->query_from .= \" INNER JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id\";\n\t\t\t$this->query_where .= $wpdb->prepare(\" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s\", '%' . $this->role . '%');\n\t\t} elseif ( is_multisite() ) {\n\t\t\t$level_key = $wpdb->prefix . 'capabilities'; // wpmu site admins don't have user_levels\n\t\t\t$this->query_from .= \", $wpdb->usermeta\";\n\t\t\t$this->query_where .= \" AND $wpdb->users.ID = $wpdb->usermeta.user_id AND meta_key = '{$level_key}'\";\n\t\t}\n\n\t\tdo_action_ref_array( 'pre_user_search', array( &$this ) );\n\t}\n\n\t/**\n\t * Executes the user search query.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t */\n\tpublic function query() {\n\t\tglobal $wpdb;\n\n\t\t$this->results = $wpdb->get_col(\"SELECT DISTINCT($wpdb->users.ID)\" . $this->query_from . $this->query_where . $this->query_orderby . $this->query_limit);\n\n\t\tif ( $this->results )\n\t\t\t$this->total_users_for_query = $wpdb->get_var(\"SELECT COUNT(DISTINCT($wpdb->users.ID))\" . $this->query_from . $this->query_where); // no limit\n\t\telse\n\t\t\t$this->search_errors = new WP_Error('no_matching_users_found', __('No users found.'));\n\t}\n\n\t/**\n\t * Prepares variables for use in templates.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t */\n\tfunction prepare_vars_for_template_usage() {}\n\n\t/**\n\t * Handles paging for the user search query.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t */\n\tpublic function do_paging() {\n\t\tif ( $this->total_users_for_query > $this->users_per_page ) { // have to page the results\n\t\t\t$args = array();\n\t\t\tif ( ! empty($this->search_term) )\n\t\t\t\t$args['usersearch'] = urlencode($this->search_term);\n\t\t\tif ( ! empty($this->role) )\n\t\t\t\t$args['role'] = urlencode($this->role);\n\n\t\t\t$this->paging_text = paginate_links( array(\n\t\t\t\t'total' => ceil($this->total_users_for_query / $this->users_per_page),\n\t\t\t\t'current' => $this->page,\n\t\t\t\t'base' => 'users.php?%_%',\n\t\t\t\t'format' => 'userspage=%#%',\n\t\t\t\t'add_args' => $args\n\t\t\t) );\n\t\t\tif ( $this->paging_text ) {\n\t\t\t\t$this->paging_text = sprintf( '<span class=\"displaying-num\">' . __( 'Displaying %s&#8211;%s of %s' ) . '</span>%s',\n\t\t\t\t\tnumber_format_i18n( ( $this->page - 1 ) * $this->users_per_page + 1 ),\n\t\t\t\t\tnumber_format_i18n( min( $this->page * $this->users_per_page, $this->total_users_for_query ) ),\n\t\t\t\t\tnumber_format_i18n( $this->total_users_for_query ),\n\t\t\t\t\t$this->paging_text\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the user search query results.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @return array\n\t */\n\tpublic function get_results() {\n\t\treturn (array) $this->results;\n\t}\n\n\t/**\n\t * Displaying paging text.\n\t *\n\t * @see do_paging() Builds paging text.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t */\n\tfunction page_links() {\n\t\techo $this->paging_text;\n\t}\n\n\t/**\n\t * Whether paging is enabled.\n\t *\n\t * @see do_paging() Builds paging text.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @return bool\n\t */\n\tfunction results_are_paged() {\n\t\tif ( $this->paging_text )\n\t\t\treturn true;\n\t\treturn false;\n\t}\n\n\t/**\n\t * Whether there are search terms.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @return bool\n\t */\n\tfunction is_search() {\n\t\tif ( $this->search_term )\n\t\t\treturn true;\n\t\treturn false;\n\t}\n}\nendif;\n\n/**\n * Retrieve editable posts from other users.\n *\n * @deprecated 3.1.0 Use get_posts()\n * @see get_posts()\n *\n * @param int $user_id User ID to not retrieve posts from.\n * @param string $type Optional, defaults to 'any'. Post type to retrieve, can be 'draft' or 'pending'.\n * @return array List of posts from others.\n */\nfunction get_others_unpublished_posts($user_id, $type='any') {\n\t_deprecated_function( __FUNCTION__, '3.1' );\n\n\tglobal $wpdb;\n\n\t$editable = get_editable_user_ids( $user_id );\n\n\tif ( in_array($type, array('draft', 'pending')) )\n\t\t$type_sql = \" post_status = '$type' \";\n\telse\n\t\t$type_sql = \" ( post_status = 'draft' OR post_status = 'pending' ) \";\n\n\t$dir = ( 'pending' == $type ) ? 'ASC' : 'DESC';\n\n\tif ( !$editable ) {\n\t\t$other_unpubs = '';\n\t} else {\n\t\t$editable = join(',', $editable);\n\t\t$other_unpubs = $wpdb->get_results( $wpdb->prepare(\"SELECT ID, post_title, post_author FROM $wpdb->posts WHERE post_type = 'post' AND $type_sql AND post_author IN ($editable) AND post_author != %d ORDER BY post_modified $dir\", $user_id) );\n\t}\n\n\treturn apply_filters('get_others_drafts', $other_unpubs);\n}\n\n/**\n * Retrieve drafts from other users.\n *\n * @deprecated 3.1.0 Use get_posts()\n * @see get_posts()\n *\n * @param int $user_id User ID.\n * @return array List of drafts from other users.\n */\nfunction get_others_drafts($user_id) {\n\t_deprecated_function( __FUNCTION__, '3.1' );\n\n\treturn get_others_unpublished_posts($user_id, 'draft');\n}\n\n/**\n * Retrieve pending review posts from other users.\n *\n * @deprecated 3.1.0 Use get_posts()\n * @see get_posts()\n *\n * @param int $user_id User ID.\n * @return array List of posts with pending review post type from other users.\n */\nfunction get_others_pending($user_id) {\n\t_deprecated_function( __FUNCTION__, '3.1' );\n\n\treturn get_others_unpublished_posts($user_id, 'pending');\n}\n\n/**\n * Output the QuickPress dashboard widget.\n *\n * @since 3.0.0\n * @deprecated 3.2.0 Use wp_dashboard_quick_press()\n * @see wp_dashboard_quick_press()\n */\nfunction wp_dashboard_quick_press_output() {\n\t_deprecated_function( __FUNCTION__, '3.2', 'wp_dashboard_quick_press()' );\n\twp_dashboard_quick_press();\n}\n\n/**\n * Outputs the TinyMCE editor.\n *\n * @since 2.7.0\n * @deprecated 3.3.0 Use wp_editor()\n * @see wp_editor()\n *\n * @staticvar int $num\n */\nfunction wp_tiny_mce( $teeny = false, $settings = false ) {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_editor()' );\n\n\tstatic $num = 1;\n\n\tif ( ! class_exists( '_WP_Editors', false ) )\n\t\trequire_once( ABSPATH . WPINC . '/class-wp-editor.php' );\n\n\t$editor_id = 'content' . $num++;\n\n\t$set = array(\n\t\t'teeny' => $teeny,\n\t\t'tinymce' => $settings ? $settings : true,\n\t\t'quicktags' => false\n\t);\n\n\t$set = _WP_Editors::parse_settings($editor_id, $set);\n\t_WP_Editors::editor_settings($editor_id, $set);\n}\n\n/**\n * Preloads TinyMCE dialogs.\n *\n * @deprecated 3.3.0 Use wp_editor()\n * @see wp_editor()\n */\nfunction wp_preload_dialogs() {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_editor()' );\n}\n\n/**\n * Prints TinyMCE editor JS.\n *\n * @deprecated 3.3.0 Use wp_editor()\n * @see wp_editor()\n */\nfunction wp_print_editor_js() {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_editor()' );\n}\n\n/**\n * Handles quicktags.\n *\n * @deprecated 3.3.0 Use wp_editor()\n * @see wp_editor()\n */\nfunction wp_quicktags() {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_editor()' );\n}\n\n/**\n * Returns the screen layout options.\n *\n * @since 2.8.0\n * @deprecated 3.3.0 WP_Screen::render_screen_layout()\n * @see WP_Screen::render_screen_layout()\n */\nfunction screen_layout( $screen ) {\n\t_deprecated_function( __FUNCTION__, '3.3', '$current_screen->render_screen_layout()' );\n\n\t$current_screen = get_current_screen();\n\n\tif ( ! $current_screen )\n\t\treturn '';\n\n\tob_start();\n\t$current_screen->render_screen_layout();\n\treturn ob_get_clean();\n}\n\n/**\n * Returns the screen's per-page options.\n *\n * @since 2.8.0\n * @deprecated 3.3.0 Use WP_Screen::render_per_page_options()\n * @see WP_Screen::render_per_page_options()\n */\nfunction screen_options( $screen ) {\n\t_deprecated_function( __FUNCTION__, '3.3', '$current_screen->render_per_page_options()' );\n\n\t$current_screen = get_current_screen();\n\n\tif ( ! $current_screen )\n\t\treturn '';\n\n\tob_start();\n\t$current_screen->render_per_page_options();\n\treturn ob_get_clean();\n}\n\n/**\n * Renders the screen's help.\n *\n * @since 2.7.0\n * @deprecated 3.3.0 Use WP_Screen::render_screen_meta()\n * @see WP_Screen::render_screen_meta()\n */\nfunction screen_meta( $screen ) {\n\t$current_screen = get_current_screen();\n\t$current_screen->render_screen_meta();\n}\n\n/**\n * Favorite actions were deprecated in version 3.2. Use the admin bar instead.\n *\n * @since 2.7.0\n * @deprecated 3.2.0 Use WP_Admin_Bar\n * @see WP_Admin_Bar\n */\nfunction favorite_actions() {\n\t_deprecated_function( __FUNCTION__, '3.2', 'WP_Admin_Bar' );\n}\n\n/**\n * Handles uploading an image.\n *\n * @deprecated 3.3.0 Use wp_media_upload_handler()\n * @see wp_media_upload_handler()\n *\n * @return null|string\n */\nfunction media_upload_image() {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_media_upload_handler()' );\n\treturn wp_media_upload_handler();\n}\n\n/**\n * Handles uploading an audio file.\n *\n * @deprecated 3.3.0 Use wp_media_upload_handler()\n * @see wp_media_upload_handler()\n *\n * @return null|string\n */\nfunction media_upload_audio() {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_media_upload_handler()' );\n\treturn wp_media_upload_handler();\n}\n\n/**\n * Handles uploading a video file.\n *\n * @deprecated 3.3.0 Use wp_media_upload_handler()\n * @see wp_media_upload_handler()\n *\n * @return null|string\n */\nfunction media_upload_video() {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_media_upload_handler()' );\n\treturn wp_media_upload_handler();\n}\n\n/**\n * Handles uploading a generic file.\n *\n * @deprecated 3.3.0 Use wp_media_upload_handler()\n * @see wp_media_upload_handler()\n *\n * @return null|string\n */\nfunction media_upload_file() {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_media_upload_handler()' );\n\treturn wp_media_upload_handler();\n}\n\n/**\n * Handles retrieving the insert-from-URL form for an image.\n *\n * @deprecated 3.3.0 Use wp_media_insert_url_form()\n * @see wp_media_insert_url_form()\n *\n * @return string\n */\nfunction type_url_form_image() {\n\t_deprecated_function( __FUNCTION__, '3.3', \"wp_media_insert_url_form('image')\" );\n\treturn wp_media_insert_url_form( 'image' );\n}\n\n/**\n * Handles retrieving the insert-from-URL form for an audio file.\n *\n * @deprecated 3.3.0 Use wp_media_insert_url_form()\n * @see wp_media_insert_url_form()\n *\n * @return string\n */\nfunction type_url_form_audio() {\n\t_deprecated_function( __FUNCTION__, '3.3', \"wp_media_insert_url_form('audio')\" );\n\treturn wp_media_insert_url_form( 'audio' );\n}\n\n/**\n * Handles retrieving the insert-from-URL form for a video file.\n *\n * @deprecated 3.3.0 Use wp_media_insert_url_form()\n * @see wp_media_insert_url_form()\n *\n * @return string\n */\nfunction type_url_form_video() {\n\t_deprecated_function( __FUNCTION__, '3.3', \"wp_media_insert_url_form('video')\" );\n\treturn wp_media_insert_url_form( 'video' );\n}\n\n/**\n * Handles retrieving the insert-from-URL form for a generic file.\n *\n * @deprecated 3.3.0 Use wp_media_insert_url_form()\n * @see wp_media_insert_url_form()\n *\n * @return string\n */\nfunction type_url_form_file() {\n\t_deprecated_function( __FUNCTION__, '3.3', \"wp_media_insert_url_form('file')\" );\n\treturn wp_media_insert_url_form( 'file' );\n}\n\n/**\n * Add contextual help text for a page.\n *\n * Creates an 'Overview' help tab.\n *\n * @since 2.7.0\n * @deprecated 3.3.0 Use WP_Screen::add_help_tab()\n * @see WP_Screen::add_help_tab()\n *\n * @param string    $screen The handle for the screen to add help to. This is usually the hook name returned by the add_*_page() functions.\n * @param string    $help   The content of an 'Overview' help tab.\n */\nfunction add_contextual_help( $screen, $help ) {\n\t_deprecated_function( __FUNCTION__, '3.3', 'get_current_screen()->add_help_tab()' );\n\n\tif ( is_string( $screen ) )\n\t\t$screen = convert_to_screen( $screen );\n\n\tWP_Screen::add_old_compat_help( $screen, $help );\n}\n\n/**\n * Get the allowed themes for the current blog.\n *\n * @since 3.0.0\n * @deprecated 3.4.0 Use wp_get_themes()\n * @see wp_get_themes()\n *\n * @return array $themes Array of allowed themes.\n */\nfunction get_allowed_themes() {\n\t_deprecated_function( __FUNCTION__, '3.4', \"wp_get_themes( array( 'allowed' => true ) )\" );\n\n\t$themes = wp_get_themes( array( 'allowed' => true ) );\n\n\t$wp_themes = array();\n\tforeach ( $themes as $theme ) {\n\t\t$wp_themes[ $theme->get('Name') ] = $theme;\n\t}\n\n\treturn $wp_themes;\n}\n\n/**\n * Retrieves a list of broken themes.\n *\n * @since 1.5.0\n * @deprecated 3.4.0 Use wp_get_themes()\n * @see wp_get_themes()\n *\n * @return array\n */\nfunction get_broken_themes() {\n\t_deprecated_function( __FUNCTION__, '3.4', \"wp_get_themes( array( 'errors' => true )\" );\n\n\t$themes = wp_get_themes( array( 'errors' => true ) );\n\t$broken = array();\n\tforeach ( $themes as $theme ) {\n\t\t$name = $theme->get('Name');\n\t\t$broken[ $name ] = array(\n\t\t\t'Name' => $name,\n\t\t\t'Title' => $name,\n\t\t\t'Description' => $theme->errors()->get_error_message(),\n\t\t);\n\t}\n\treturn $broken;\n}\n\n/**\n * Retrieves information on the current active theme.\n *\n * @since 2.0.0\n * @deprecated 3.4.0 Use wp_get_theme()\n * @see wp_get_theme()\n *\n * @return WP_Theme\n */\nfunction current_theme_info() {\n\t_deprecated_function( __FUNCTION__, '3.4', 'wp_get_theme()' );\n\n\treturn wp_get_theme();\n}\n\n/**\n * This was once used to display an 'Insert into Post' button.\n *\n * Now it is deprecated and stubbed.\n *\n * @deprecated 3.5.0\n */\nfunction _insert_into_post_button( $type ) {\n\t_deprecated_function( __FUNCTION__, '3.5' );\n}\n\n/**\n * This was once used to display a media button.\n *\n * Now it is deprecated and stubbed.\n *\n * @deprecated 3.5.0\n */\nfunction _media_button($title, $icon, $type, $id) {\n\t_deprecated_function( __FUNCTION__, '3.5' );\n}\n\n/**\n * Gets an existing post and format it for editing.\n *\n * @since 2.0.0\n * @deprecated 3.5.0 Use get_post()\n * @see get_post()\n *\n * @param int $id\n * @return object\n */\nfunction get_post_to_edit( $id ) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'get_post()' );\n\n\treturn get_post( $id, OBJECT, 'edit' );\n}\n\n/**\n * Gets the default page information to use.\n *\n * @since 2.5.0\n * @deprecated 3.5.0 Use get_default_post_to_edit()\n * @see get_default_post_to_edit()\n *\n * @return WP_Post Post object containing all the default post data as attributes\n */\nfunction get_default_page_to_edit() {\n\t_deprecated_function( __FUNCTION__, '3.5', \"get_default_post_to_edit( 'page' )\" );\n\n\t$page = get_default_post_to_edit();\n\t$page->post_type = 'page';\n\treturn $page;\n}\n\n/**\n * This was once used to create a thumbnail from an Image given a maximum side size.\n *\n * @since 1.2.0\n * @deprecated 3.5.0 Use image_resize()\n * @see image_resize()\n *\n * @param mixed $file Filename of the original image, Or attachment id.\n * @param int $max_side Maximum length of a single side for the thumbnail.\n * @param mixed $deprecated Never used.\n * @return string Thumbnail path on success, Error string on failure.\n */\nfunction wp_create_thumbnail( $file, $max_side, $deprecated = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'image_resize()' );\n\treturn apply_filters( 'wp_create_thumbnail', image_resize( $file, $max_side, $max_side ) );\n}\n\n/**\n * This was once used to display a metabox for the nav menu theme locations.\n *\n * Deprecated in favor of a 'Manage Locations' tab added to nav menus management screen.\n *\n * @since 3.0.0\n * @deprecated 3.6.0\n */\nfunction wp_nav_menu_locations_meta_box() {\n\t_deprecated_function( __FUNCTION__, '3.6' );\n}\n\n/**\n * This was once used to kick-off the Core Updater.\n *\n * Deprecated in favor of instantating a Core_Upgrader instance directly,\n * and calling the 'upgrade' method.\n *\n * @since 2.7.0\n * @deprecated 3.7.0 Use Core_Upgrader\n * @see Core_Upgrader\n */\nfunction wp_update_core($current, $feedback = '') {\n\t_deprecated_function( __FUNCTION__, '3.7', 'new Core_Upgrader();' );\n\n\tif ( !empty($feedback) )\n\t\tadd_filter('update_feedback', $feedback);\n\n\tinclude( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );\n\t$upgrader = new Core_Upgrader();\n\treturn $upgrader->upgrade($current);\n\n}\n\n/**\n * This was once used to kick-off the Plugin Updater.\n *\n * Deprecated in favor of instantating a Plugin_Upgrader instance directly,\n * and calling the 'upgrade' method.\n * Unused since 2.8.0.\n *\n * @since 2.5.0\n * @deprecated 3.7.0 Use Plugin_Upgrader\n * @see Plugin_Upgrader\n */\nfunction wp_update_plugin($plugin, $feedback = '') {\n\t_deprecated_function( __FUNCTION__, '3.7', 'new Plugin_Upgrader();' );\n\n\tif ( !empty($feedback) )\n\t\tadd_filter('update_feedback', $feedback);\n\n\tinclude( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );\n\t$upgrader = new Plugin_Upgrader();\n\treturn $upgrader->upgrade($plugin);\n}\n\n/**\n * This was once used to kick-off the Theme Updater.\n *\n * Deprecated in favor of instantating a Theme_Upgrader instance directly,\n * and calling the 'upgrade' method.\n * Unused since 2.8.0.\n *\n * @since 2.7.0\n * @deprecated 3.7.0 Use Theme_Upgrader\n * @see Theme_Upgrader\n */\nfunction wp_update_theme($theme, $feedback = '') {\n\t_deprecated_function( __FUNCTION__, '3.7', 'new Theme_Upgrader();' );\n\n\tif ( !empty($feedback) )\n\t\tadd_filter('update_feedback', $feedback);\n\n\tinclude( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );\n\t$upgrader = new Theme_Upgrader();\n\treturn $upgrader->upgrade($theme);\n}\n\n/**\n * This was once used to display attachment links. Now it is deprecated and stubbed.\n *\n * @since 2.0.0\n * @deprecated 3.7.0\n *\n * @param int|bool $id\n */\nfunction the_attachment_links( $id = false ) {\n\t_deprecated_function( __FUNCTION__, '3.7' );\n}\n\n/**\n * Displays a screen icon.\n *\n * @since 2.7.0\n * @since 3.8.0 Screen icons are no longer used in WordPress. This function no longer produces output.\n * @deprecated 3.8.0 Use get_screen_icon()\n * @see get_screen_icon()\n */\nfunction screen_icon() {\n\techo get_screen_icon();\n}\n\n/**\n * Retrieves the screen icon (no longer used in 3.8+).\n *\n * @deprecated 3.8.0\n *\n * @return string\n */\nfunction get_screen_icon() {\n\treturn '<!-- Screen icons are no longer used as of WordPress 3.8. -->';\n}\n\n/**\n * Deprecated dashboard widget controls.\n *\n * @since 2.5.0\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_incoming_links_output() {}\n\n/**\n * Deprecated dashboard secondary output.\n *\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_secondary_output() {}\n\n/**\n * Deprecated dashboard widget controls.\n *\n * @since 2.7.0\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_incoming_links() {}\n\n/**\n * Deprecated dashboard incoming links control.\n *\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_incoming_links_control() {}\n\n/**\n * Deprecated dashboard plugins control.\n *\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_plugins() {}\n\n/**\n * Deprecated dashboard primary control.\n *\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_primary_control() {}\n\n/**\n * Deprecated dashboard recent comments control.\n *\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_recent_comments_control() {}\n\n/**\n * Deprecated dashboard secondary section.\n *\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_secondary() {}\n\n/**\n * Deprecated dashboard secondary control.\n *\n * @deprecated 3.8.0\n */\nfunction wp_dashboard_secondary_control() {}\n\n/**\n * This was once used to move child posts to a new parent.\n *\n * @since 2.3.0\n * @deprecated 3.9.0\n * @access private\n *\n * @param int $old_ID\n * @param int $new_ID\n */\nfunction _relocate_children( $old_ID, $new_ID ) {\n\t_deprecated_function( __FUNCTION__, '3.9' );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/edit-tag-messages.php",
    "content": "<?php\n/**\n * Edit Tags Administration: Messages\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n$messages = array();\n// 0 = unused. Messages start at index 1.\n$messages['_item'] = array(\n\t0 => '',\n\t1 => __( 'Item added.' ),\n\t2 => __( 'Item deleted.' ),\n\t3 => __( 'Item updated.' ),\n\t4 => __( 'Item not added.' ),\n\t5 => __( 'Item not updated.' ),\n\t6 => __( 'Items deleted.' ),\n);\n\n$messages['category'] = array(\n\t0 => '',\n\t1 => __( 'Category added.' ),\n\t2 => __( 'Category deleted.' ),\n\t3 => __( 'Category updated.' ),\n\t4 => __( 'Category not added.' ),\n\t5 => __( 'Category not updated.' ),\n\t6 => __( 'Categories deleted.' ),\n);\n\n$messages['post_tag'] = array(\n\t0 => '',\n\t1 => __( 'Tag added.' ),\n\t2 => __( 'Tag deleted.' ),\n\t3 => __( 'Tag updated.' ),\n\t4 => __( 'Tag not added.' ),\n\t5 => __( 'Tag not updated.' ),\n\t6 => __( 'Tags deleted.' ),\n);\n\n/**\n * Filter the messages displayed when a tag is updated.\n *\n * @since 3.7.0\n *\n * @param array $messages The messages to be displayed.\n */\n$messages = apply_filters( 'term_updated_messages', $messages );\n\n$message = false;\nif ( isset( $_REQUEST['message'] ) && ( $msg = (int) $_REQUEST['message'] ) ) {\n\tif ( isset( $messages[ $taxonomy ][ $msg ] ) ) {\n\t\t$message = $messages[ $taxonomy ][ $msg ];\n\t} elseif ( ! isset( $messages[ $taxonomy ] ) && isset( $messages['_item'][ $msg ] ) ) {\n\t\t$message = $messages['_item'][ $msg ];\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/export.php",
    "content": "<?php\n/**\n * WordPress Export Administration API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Version number for the export format.\n *\n * Bump this when something changes that might affect compatibility.\n *\n * @since 2.5.0\n */\ndefine( 'WXR_VERSION', '1.2' );\n\n/**\n * Generates the WXR export file for download.\n *\n * @since 2.1.0\n *\n * @global wpdb    $wpdb\n * @global WP_Post $post\n *\n * @param array $args Filters defining what should be included in the export.\n */\nfunction export_wp( $args = array() ) {\n\tglobal $wpdb, $post;\n\n\t$defaults = array( 'content' => 'all', 'author' => false, 'category' => false,\n\t\t'start_date' => false, 'end_date' => false, 'status' => false,\n\t);\n\t$args = wp_parse_args( $args, $defaults );\n\n\t/**\n\t * Fires at the beginning of an export, before any headers are sent.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param array $args An array of export arguments.\n\t */\n\tdo_action( 'export_wp', $args );\n\n\t$sitename = sanitize_key( get_bloginfo( 'name' ) );\n\tif ( ! empty( $sitename ) ) {\n\t\t$sitename .= '.';\n\t}\n\t$date = date( 'Y-m-d' );\n\t$wp_filename = $sitename . 'wordpress.' . $date . '.xml';\n\t/**\n\t * Filter the export filename.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $wp_filename The name of the file for download.\n\t * @param string $sitename    The site name.\n\t * @param string $date        Today's date, formatted.\n\t */\n\t$filename = apply_filters( 'export_wp_filename', $wp_filename, $sitename, $date );\n\n\theader( 'Content-Description: File Transfer' );\n\theader( 'Content-Disposition: attachment; filename=' . $filename );\n\theader( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );\n\n\tif ( 'all' != $args['content'] && post_type_exists( $args['content'] ) ) {\n\t\t$ptype = get_post_type_object( $args['content'] );\n\t\tif ( ! $ptype->can_export )\n\t\t\t$args['content'] = 'post';\n\n\t\t$where = $wpdb->prepare( \"{$wpdb->posts}.post_type = %s\", $args['content'] );\n\t} else {\n\t\t$post_types = get_post_types( array( 'can_export' => true ) );\n\t\t$esses = array_fill( 0, count($post_types), '%s' );\n\t\t$where = $wpdb->prepare( \"{$wpdb->posts}.post_type IN (\" . implode( ',', $esses ) . ')', $post_types );\n\t}\n\n\tif ( $args['status'] && ( 'post' == $args['content'] || 'page' == $args['content'] ) )\n\t\t$where .= $wpdb->prepare( \" AND {$wpdb->posts}.post_status = %s\", $args['status'] );\n\telse\n\t\t$where .= \" AND {$wpdb->posts}.post_status != 'auto-draft'\";\n\n\t$join = '';\n\tif ( $args['category'] && 'post' == $args['content'] ) {\n\t\tif ( $term = term_exists( $args['category'], 'category' ) ) {\n\t\t\t$join = \"INNER JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)\";\n\t\t\t$where .= $wpdb->prepare( \" AND {$wpdb->term_relationships}.term_taxonomy_id = %d\", $term['term_taxonomy_id'] );\n\t\t}\n\t}\n\n\tif ( 'post' == $args['content'] || 'page' == $args['content'] || 'attachment' == $args['content'] ) {\n\t\tif ( $args['author'] )\n\t\t\t$where .= $wpdb->prepare( \" AND {$wpdb->posts}.post_author = %d\", $args['author'] );\n\n\t\tif ( $args['start_date'] )\n\t\t\t$where .= $wpdb->prepare( \" AND {$wpdb->posts}.post_date >= %s\", date( 'Y-m-d', strtotime($args['start_date']) ) );\n\n\t\tif ( $args['end_date'] )\n\t\t\t$where .= $wpdb->prepare( \" AND {$wpdb->posts}.post_date < %s\", date( 'Y-m-d', strtotime('+1 month', strtotime($args['end_date'])) ) );\n\t}\n\n\t// Grab a snapshot of post IDs, just in case it changes during the export.\n\t$post_ids = $wpdb->get_col( \"SELECT ID FROM {$wpdb->posts} $join WHERE $where\" );\n\n\t/*\n\t * Get the requested terms ready, empty unless posts filtered by category\n\t * or all content.\n\t */\n\t$cats = $tags = $terms = array();\n\tif ( isset( $term ) && $term ) {\n\t\t$cat = get_term( $term['term_id'], 'category' );\n\t\t$cats = array( $cat->term_id => $cat );\n\t\tunset( $term, $cat );\n\t} elseif ( 'all' == $args['content'] ) {\n\t\t$categories = (array) get_categories( array( 'get' => 'all' ) );\n\t\t$tags = (array) get_tags( array( 'get' => 'all' ) );\n\n\t\t$custom_taxonomies = get_taxonomies( array( '_builtin' => false ) );\n\t\t$custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) );\n\n\t\t// Put categories in order with no child going before its parent.\n\t\twhile ( $cat = array_shift( $categories ) ) {\n\t\t\tif ( $cat->parent == 0 || isset( $cats[$cat->parent] ) )\n\t\t\t\t$cats[$cat->term_id] = $cat;\n\t\t\telse\n\t\t\t\t$categories[] = $cat;\n\t\t}\n\n\t\t// Put terms in order with no child going before its parent.\n\t\twhile ( $t = array_shift( $custom_terms ) ) {\n\t\t\tif ( $t->parent == 0 || isset( $terms[$t->parent] ) )\n\t\t\t\t$terms[$t->term_id] = $t;\n\t\t\telse\n\t\t\t\t$custom_terms[] = $t;\n\t\t}\n\n\t\tunset( $categories, $custom_taxonomies, $custom_terms );\n\t}\n\n\t/**\n\t * Wrap given string in XML CDATA tag.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $str String to wrap in XML CDATA tag.\n\t * @return string\n\t */\n\tfunction wxr_cdata( $str ) {\n\t\tif ( ! seems_utf8( $str ) ) {\n\t\t\t$str = utf8_encode( $str );\n\t\t}\n\t\t// $str = ent2ncr(esc_html($str));\n\t\t$str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';\n\n\t\treturn $str;\n\t}\n\n\t/**\n\t * Return the URL of the site\n\t *\n\t * @since 2.5.0\n\t *\n\t * @return string Site URL.\n\t */\n\tfunction wxr_site_url() {\n\t\t// Multisite: the base URL.\n\t\tif ( is_multisite() )\n\t\t\treturn network_home_url();\n\t\t// WordPress (single site): the blog URL.\n\t\telse\n\t\t\treturn get_bloginfo_rss( 'url' );\n\t}\n\n\t/**\n\t * Output a cat_name XML tag from a given category object\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param object $category Category Object\n\t */\n\tfunction wxr_cat_name( $category ) {\n\t\tif ( empty( $category->name ) )\n\t\t\treturn;\n\n\t\techo '<wp:cat_name>' . wxr_cdata( $category->name ) . '</wp:cat_name>';\n\t}\n\n\t/**\n\t * Output a category_description XML tag from a given category object\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param object $category Category Object\n\t */\n\tfunction wxr_category_description( $category ) {\n\t\tif ( empty( $category->description ) )\n\t\t\treturn;\n\n\t\techo '<wp:category_description>' . wxr_cdata( $category->description ) . '</wp:category_description>';\n\t}\n\n\t/**\n\t * Output a tag_name XML tag from a given tag object\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param object $tag Tag Object\n\t */\n\tfunction wxr_tag_name( $tag ) {\n\t\tif ( empty( $tag->name ) )\n\t\t\treturn;\n\n\t\techo '<wp:tag_name>' . wxr_cdata( $tag->name ) . '</wp:tag_name>';\n\t}\n\n\t/**\n\t * Output a tag_description XML tag from a given tag object\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param object $tag Tag Object\n\t */\n\tfunction wxr_tag_description( $tag ) {\n\t\tif ( empty( $tag->description ) )\n\t\t\treturn;\n\n\t\techo '<wp:tag_description>' . wxr_cdata( $tag->description ) . '</wp:tag_description>';\n\t}\n\n\t/**\n\t * Output a term_name XML tag from a given term object\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param object $term Term Object\n\t */\n\tfunction wxr_term_name( $term ) {\n\t\tif ( empty( $term->name ) )\n\t\t\treturn;\n\n\t\techo '<wp:term_name>' . wxr_cdata( $term->name ) . '</wp:term_name>';\n\t}\n\n\t/**\n\t * Output a term_description XML tag from a given term object\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param object $term Term Object\n\t */\n\tfunction wxr_term_description( $term ) {\n\t\tif ( empty( $term->description ) )\n\t\t\treturn;\n\n\t\techo '<wp:term_description>' . wxr_cdata( $term->description ) . '</wp:term_description>';\n\t}\n\n\t/**\n\t * Output list of authors with posts\n\t *\n\t * @since 3.1.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param array $post_ids Array of post IDs to filter the query by. Optional.\n\t */\n\tfunction wxr_authors_list( array $post_ids = null ) {\n\t\tglobal $wpdb;\n\n\t\tif ( !empty( $post_ids ) ) {\n\t\t\t$post_ids = array_map( 'absint', $post_ids );\n\t\t\t$and = 'AND ID IN ( ' . implode( ', ', $post_ids ) . ')';\n\t\t} else {\n\t\t\t$and = '';\n\t\t}\n\n\t\t$authors = array();\n\t\t$results = $wpdb->get_results( \"SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft' $and\" );\n\t\tforeach ( (array) $results as $result )\n\t\t\t$authors[] = get_userdata( $result->post_author );\n\n\t\t$authors = array_filter( $authors );\n\n\t\tforeach ( $authors as $author ) {\n\t\t\techo \"\\t<wp:author>\";\n\t\t\techo '<wp:author_id>' . intval( $author->ID ) . '</wp:author_id>';\n\t\t\techo '<wp:author_login>' . wxr_cdata( $author->user_login ) . '</wp:author_login>';\n\t\t\techo '<wp:author_email>' . wxr_cdata( $author->user_email ) . '</wp:author_email>';\n\t\t\techo '<wp:author_display_name>' . wxr_cdata( $author->display_name ) . '</wp:author_display_name>';\n\t\t\techo '<wp:author_first_name>' . wxr_cdata( $author->first_name ) . '</wp:author_first_name>';\n\t\t\techo '<wp:author_last_name>' . wxr_cdata( $author->last_name ) . '</wp:author_last_name>';\n\t\t\techo \"</wp:author>\\n\";\n\t\t}\n\t}\n\n\t/**\n\t * Ouput all navigation menu terms\n\t *\n\t * @since 3.1.0\n\t */\n\tfunction wxr_nav_menu_terms() {\n\t\t$nav_menus = wp_get_nav_menus();\n\t\tif ( empty( $nav_menus ) || ! is_array( $nav_menus ) )\n\t\t\treturn;\n\n\t\tforeach ( $nav_menus as $menu ) {\n\t\t\techo \"\\t<wp:term>\";\n\t\t\techo '<wp:term_id>' . intval( $menu->term_id ) . '</wp:term_id>';\n\t\t\techo '<wp:term_taxonomy>nav_menu</wp:term_taxonomy>';\n\t\t\techo '<wp:term_slug>' . wxr_cdata( $menu->slug ) . '</wp:term_slug>';\n\t\t\twxr_term_name( $menu );\n\t\t\techo \"</wp:term>\\n\";\n\t\t}\n\t}\n\n\t/**\n\t * Output list of taxonomy terms, in XML tag format, associated with a post\n\t *\n\t * @since 2.3.0\n\t */\n\tfunction wxr_post_taxonomy() {\n\t\t$post = get_post();\n\n\t\t$taxonomies = get_object_taxonomies( $post->post_type );\n\t\tif ( empty( $taxonomies ) )\n\t\t\treturn;\n\t\t$terms = wp_get_object_terms( $post->ID, $taxonomies );\n\n\t\tforeach ( (array) $terms as $term ) {\n\t\t\techo \"\\t\\t<category domain=\\\"{$term->taxonomy}\\\" nicename=\\\"{$term->slug}\\\">\" . wxr_cdata( $term->name ) . \"</category>\\n\";\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param bool   $return_me\n\t * @param string $meta_key\n\t * @return bool\n\t */\n\tfunction wxr_filter_postmeta( $return_me, $meta_key ) {\n\t\tif ( '_edit_lock' == $meta_key )\n\t\t\t$return_me = true;\n\t\treturn $return_me;\n\t}\n\tadd_filter( 'wxr_export_skip_postmeta', 'wxr_filter_postmeta', 10, 2 );\n\n\techo '<?xml version=\"1.0\" encoding=\"' . get_bloginfo('charset') . \"\\\" ?>\\n\";\n\n\t?>\n<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. -->\n<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->\n<!-- You may use this file to transfer that content from one site to another. -->\n<!-- This file is not intended to serve as a complete backup of your site. -->\n\n<!-- To import this information into a WordPress site follow these steps: -->\n<!-- 1. Log in to that site as an administrator. -->\n<!-- 2. Go to Tools: Import in the WordPress admin panel. -->\n<!-- 3. Install the \"WordPress\" importer from the list. -->\n<!-- 4. Activate & Run Importer. -->\n<!-- 5. Upload this file using the form provided on that page. -->\n<!-- 6. You will first be asked to map the authors in this export file to users -->\n<!--    on the site. For each author, you may choose to map to an -->\n<!--    existing user on the site or to create a new user. -->\n<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->\n<!--    contained in this file into your site. -->\n\n<?php the_generator( 'export' ); ?>\n<rss version=\"2.0\"\n\txmlns:excerpt=\"http://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/\"\n\txmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n\txmlns:wfw=\"http://wellformedweb.org/CommentAPI/\"\n\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\txmlns:wp=\"http://wordpress.org/export/<?php echo WXR_VERSION; ?>/\"\n>\n\n<channel>\n\t<title><?php bloginfo_rss( 'name' ); ?></title>\n\t<link><?php bloginfo_rss( 'url' ); ?></link>\n\t<description><?php bloginfo_rss( 'description' ); ?></description>\n\t<pubDate><?php echo date( 'D, d M Y H:i:s +0000' ); ?></pubDate>\n\t<language><?php bloginfo_rss( 'language' ); ?></language>\n\t<wp:wxr_version><?php echo WXR_VERSION; ?></wp:wxr_version>\n\t<wp:base_site_url><?php echo wxr_site_url(); ?></wp:base_site_url>\n\t<wp:base_blog_url><?php bloginfo_rss( 'url' ); ?></wp:base_blog_url>\n\n<?php wxr_authors_list( $post_ids ); ?>\n\n<?php foreach ( $cats as $c ) : ?>\n\t<wp:category><wp:term_id><?php echo intval( $c->term_id ); ?></wp:term_id><wp:category_nicename><?php echo wxr_cdata( $c->slug ); ?></wp:category_nicename><wp:category_parent><?php echo wxr_cdata( $c->parent ? $cats[$c->parent]->slug : '' ); ?></wp:category_parent><?php wxr_cat_name( $c ); ?><?php wxr_category_description( $c ); ?></wp:category>\n<?php endforeach; ?>\n<?php foreach ( $tags as $t ) : ?>\n\t<wp:tag><wp:term_id><?php echo intval( $t->term_id ); ?></wp:term_id><wp:tag_slug><?php echo wxr_cdata( $t->slug ); ?></wp:tag_slug><?php wxr_tag_name( $t ); ?><?php wxr_tag_description( $t ); ?></wp:tag>\n<?php endforeach; ?>\n<?php foreach ( $terms as $t ) : ?>\n\t<wp:term><wp:term_id><?php echo wxr_cdata( $t->term_id ); ?></wp:term_id><wp:term_taxonomy><?php echo wxr_cdata( $t->taxonomy ); ?></wp:term_taxonomy><wp:term_slug><?php echo wxr_cdata( $t->slug ); ?></wp:term_slug><wp:term_parent><?php echo wxr_cdata( $t->parent ? $terms[$t->parent]->slug : '' ); ?></wp:term_parent><?php wxr_term_name( $t ); ?><?php wxr_term_description( $t ); ?></wp:term>\n<?php endforeach; ?>\n<?php if ( 'all' == $args['content'] ) wxr_nav_menu_terms(); ?>\n\n\t<?php\n\t/** This action is documented in wp-includes/feed-rss2.php */\n\tdo_action( 'rss2_head' );\n\t?>\n\n<?php if ( $post_ids ) {\n\t/**\n\t * @global WP_Query $wp_query\n\t */\n\tglobal $wp_query;\n\n\t// Fake being in the loop.\n\t$wp_query->in_the_loop = true;\n\n\t// Fetch 20 posts at a time rather than loading the entire table into memory.\n\twhile ( $next_posts = array_splice( $post_ids, 0, 20 ) ) {\n\t$where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')';\n\t$posts = $wpdb->get_results( \"SELECT * FROM {$wpdb->posts} $where\" );\n\n\t// Begin Loop.\n\tforeach ( $posts as $post ) {\n\t\tsetup_postdata( $post );\n\t\t$is_sticky = is_sticky( $post->ID ) ? 1 : 0;\n?>\n\t<item>\n\t\t<title><?php\n\t\t\t/** This filter is documented in wp-includes/feed.php */\n\t\t\techo apply_filters( 'the_title_rss', $post->post_title );\n\t\t?></title>\n\t\t<link><?php the_permalink_rss() ?></link>\n\t\t<pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?></pubDate>\n\t\t<dc:creator><?php echo wxr_cdata( get_the_author_meta( 'login' ) ); ?></dc:creator>\n\t\t<guid isPermaLink=\"false\"><?php the_guid(); ?></guid>\n\t\t<description></description>\n\t\t<content:encoded><?php\n\t\t\t/**\n\t\t\t * Filter the post content used for WXR exports.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string $post_content Content of the current post.\n\t\t\t */\n\t\t\techo wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) );\n\t\t?></content:encoded>\n\t\t<excerpt:encoded><?php\n\t\t\t/**\n\t\t\t * Filter the post excerpt used for WXR exports.\n\t\t\t *\n\t\t\t * @since 2.6.0\n\t\t\t *\n\t\t\t * @param string $post_excerpt Excerpt for the current post.\n\t\t\t */\n\t\t\techo wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) );\n\t\t?></excerpt:encoded>\n\t\t<wp:post_id><?php echo intval( $post->ID ); ?></wp:post_id>\n\t\t<wp:post_date><?php echo wxr_cdata( $post->post_date ); ?></wp:post_date>\n\t\t<wp:post_date_gmt><?php echo wxr_cdata( $post->post_date_gmt ); ?></wp:post_date_gmt>\n\t\t<wp:comment_status><?php echo wxr_cdata( $post->comment_status ); ?></wp:comment_status>\n\t\t<wp:ping_status><?php echo wxr_cdata( $post->ping_status ); ?></wp:ping_status>\n\t\t<wp:post_name><?php echo wxr_cdata( $post->post_name ); ?></wp:post_name>\n\t\t<wp:status><?php echo wxr_cdata( $post->post_status ); ?></wp:status>\n\t\t<wp:post_parent><?php echo intval( $post->post_parent ); ?></wp:post_parent>\n\t\t<wp:menu_order><?php echo intval( $post->menu_order ); ?></wp:menu_order>\n\t\t<wp:post_type><?php echo wxr_cdata( $post->post_type ); ?></wp:post_type>\n\t\t<wp:post_password><?php echo wxr_cdata( $post->post_password ); ?></wp:post_password>\n\t\t<wp:is_sticky><?php echo intval( $is_sticky ); ?></wp:is_sticky>\n<?php\tif ( $post->post_type == 'attachment' ) : ?>\n\t\t<wp:attachment_url><?php echo wxr_cdata( wp_get_attachment_url( $post->ID ) ); ?></wp:attachment_url>\n<?php \tendif; ?>\n<?php \twxr_post_taxonomy(); ?>\n<?php\t$postmeta = $wpdb->get_results( $wpdb->prepare( \"SELECT * FROM $wpdb->postmeta WHERE post_id = %d\", $post->ID ) );\n\t\tforeach ( $postmeta as $meta ) :\n\t\t\t/**\n\t\t\t * Filter whether to selectively skip post meta used for WXR exports.\n\t\t\t *\n\t\t\t * Returning a truthy value to the filter will skip the current meta\n\t\t\t * object from being exported.\n\t\t\t *\n\t\t\t * @since 3.3.0\n\t\t\t *\n\t\t\t * @param bool   $skip     Whether to skip the current post meta. Default false.\n\t\t\t * @param string $meta_key Current meta key.\n\t\t\t * @param object $meta     Current meta object.\n\t\t\t */\n\t\t\tif ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) )\n\t\t\t\tcontinue;\n\t\t?>\n\t\t<wp:postmeta>\n\t\t\t<wp:meta_key><?php echo wxr_cdata( $meta->meta_key ); ?></wp:meta_key>\n\t\t\t<wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value>\n\t\t</wp:postmeta>\n<?php\tendforeach;\n\n\t\t$_comments = $wpdb->get_results( $wpdb->prepare( \"SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'\", $post->ID ) );\n\t\t$comments = array_map( 'get_comment', $_comments );\n\t\tforeach ( $comments as $c ) : ?>\n\t\t<wp:comment>\n\t\t\t<wp:comment_id><?php echo intval( $c->comment_ID ); ?></wp:comment_id>\n\t\t\t<wp:comment_author><?php echo wxr_cdata( $c->comment_author ); ?></wp:comment_author>\n\t\t\t<wp:comment_author_email><?php echo wxr_cdata( $c->comment_author_email ); ?></wp:comment_author_email>\n\t\t\t<wp:comment_author_url><?php echo esc_url_raw( $c->comment_author_url ); ?></wp:comment_author_url>\n\t\t\t<wp:comment_author_IP><?php echo wxr_cdata( $c->comment_author_IP ); ?></wp:comment_author_IP>\n\t\t\t<wp:comment_date><?php echo wxr_cdata( $c->comment_date ); ?></wp:comment_date>\n\t\t\t<wp:comment_date_gmt><?php echo wxr_cdata( $c->comment_date_gmt ); ?></wp:comment_date_gmt>\n\t\t\t<wp:comment_content><?php echo wxr_cdata( $c->comment_content ) ?></wp:comment_content>\n\t\t\t<wp:comment_approved><?php echo wxr_cdata( $c->comment_approved ); ?></wp:comment_approved>\n\t\t\t<wp:comment_type><?php echo wxr_cdata( $c->comment_type ); ?></wp:comment_type>\n\t\t\t<wp:comment_parent><?php echo intval( $c->comment_parent ); ?></wp:comment_parent>\n\t\t\t<wp:comment_user_id><?php echo intval( $c->user_id ); ?></wp:comment_user_id>\n<?php\t\t$c_meta = $wpdb->get_results( $wpdb->prepare( \"SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d\", $c->comment_ID ) );\n\t\t\tforeach ( $c_meta as $meta ) :\n\t\t\t\t/**\n\t\t\t\t * Filter whether to selectively skip comment meta used for WXR exports.\n\t\t\t\t *\n\t\t\t\t * Returning a truthy value to the filter will skip the current meta\n\t\t\t\t * object from being exported.\n\t\t\t\t *\n\t\t\t\t * @since 4.0.0\n\t\t\t\t *\n\t\t\t\t * @param bool   $skip     Whether to skip the current comment meta. Default false.\n\t\t\t\t * @param string $meta_key Current meta key.\n\t\t\t\t * @param object $meta     Current meta object.\n\t\t\t\t */\n\t\t\t\tif ( apply_filters( 'wxr_export_skip_commentmeta', false, $meta->meta_key, $meta ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t?>\n\t\t\t<wp:commentmeta>\n\t\t\t\t<wp:meta_key><?php echo wxr_cdata( $meta->meta_key ); ?></wp:meta_key>\n\t\t\t\t<wp:meta_value><?php echo wxr_cdata( $meta->meta_value ); ?></wp:meta_value>\n\t\t\t</wp:commentmeta>\n<?php\t\tendforeach; ?>\n\t\t</wp:comment>\n<?php\tendforeach; ?>\n\t</item>\n<?php\n\t}\n\t}\n} ?>\n</channel>\n</rss>\n<?php\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/file.php",
    "content": "<?php\n/**\n * Filesystem API: Top-level functionality\n *\n * Functions for reading, writing, modifying, and deleting files on the file system.\n * Includes functionality for theme-specific files as well as operations for uploading,\n * archiving, and rendering output when necessary.\n *\n * @package WordPress\n * @subpackage Filesystem\n * @since 2.3.0\n */\n\n/** The descriptions for theme files. */\n$wp_file_descriptions = array(\n\t'index.php' => __( 'Main Index Template' ),\n\t'style.css' => __( 'Stylesheet' ),\n\t'editor-style.css' => __( 'Visual Editor Stylesheet' ),\n\t'editor-style-rtl.css' => __( 'Visual Editor RTL Stylesheet' ),\n\t'rtl.css' => __( 'RTL Stylesheet' ),\n\t'comments.php' => __( 'Comments' ),\n\t'comments-popup.php' => __( 'Popup Comments' ),\n\t'footer.php' => __( 'Theme Footer' ),\n\t'header.php' => __( 'Theme Header' ),\n\t'sidebar.php' => __( 'Sidebar' ),\n\t'archive.php' => __( 'Archives' ),\n\t'author.php' => __( 'Author Template' ),\n\t'tag.php' => __( 'Tag Template' ),\n\t'category.php' => __( 'Category Template' ),\n\t'page.php' => __( 'Page Template' ),\n\t'search.php' => __( 'Search Results' ),\n\t'searchform.php' => __( 'Search Form' ),\n\t'single.php' => __( 'Single Post' ),\n\t'404.php' => __( '404 Template' ),\n\t'link.php' => __( 'Links Template' ),\n\t'functions.php' => __( 'Theme Functions' ),\n\t'attachment.php' => __( 'Attachment Template' ),\n\t'image.php' => __('Image Attachment Template'),\n\t'video.php' => __('Video Attachment Template'),\n\t'audio.php' => __('Audio Attachment Template'),\n\t'application.php' => __('Application Attachment Template'),\n\t'my-hacks.php' => __( 'my-hacks.php (legacy hacks support)' ),\n\t'.htaccess' => __( '.htaccess (for rewrite rules )' ),\n\t// Deprecated files\n\t'wp-layout.css' => __( 'Stylesheet' ),\n\t'wp-comments.php' => __( 'Comments Template' ),\n\t'wp-comments-popup.php' => __( 'Popup Comments Template' ),\n);\n\n/**\n * Get the description for standard WordPress theme files and other various standard\n * WordPress files\n *\n * @since 1.5.0\n *\n * @global array $wp_file_descriptions\n * @param string $file Filesystem path or filename\n * @return string Description of file from $wp_file_descriptions or basename of $file if description doesn't exist.\n *                Appends 'Page Template' to basename of $file if the file is a page template\n */\nfunction get_file_description( $file ) {\n\tglobal $wp_file_descriptions, $allowed_files;\n\n\t$relative_pathinfo = pathinfo( $file );\n\t$file_path = $allowed_files[ $file ];\n\tif ( isset( $wp_file_descriptions[ basename( $file ) ] ) && '.' === $relative_pathinfo['dirname'] ) {\n\t\treturn $wp_file_descriptions[ basename( $file ) ];\n\t} elseif ( file_exists( $file_path ) && is_file( $file_path ) ) {\n\t\t$template_data = implode( '', file( $file_path ) );\n\t\tif ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name ) ) {\n\t\t\treturn sprintf( __( '%s Page Template' ), _cleanup_header_comment( $name[1] ) );\n\t\t}\n\t}\n\n\treturn trim( basename( $file ) );\n}\n\n/**\n * Get the absolute filesystem path to the root of the WordPress installation\n *\n * @since 1.5.0\n *\n * @return string Full filesystem path to the root of the WordPress installation\n */\nfunction get_home_path() {\n\t$home    = set_url_scheme( get_option( 'home' ), 'http' );\n\t$siteurl = set_url_scheme( get_option( 'siteurl' ), 'http' );\n\tif ( ! empty( $home ) && 0 !== strcasecmp( $home, $siteurl ) ) {\n\t\t$wp_path_rel_to_home = str_ireplace( $home, '', $siteurl ); /* $siteurl - $home */\n\t\t$pos = strripos( str_replace( '\\\\', '/', $_SERVER['SCRIPT_FILENAME'] ), trailingslashit( $wp_path_rel_to_home ) );\n\t\t$home_path = substr( $_SERVER['SCRIPT_FILENAME'], 0, $pos );\n\t\t$home_path = trailingslashit( $home_path );\n\t} else {\n\t\t$home_path = ABSPATH;\n\t}\n\n\treturn str_replace( '\\\\', '/', $home_path );\n}\n\n/**\n * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep.\n * The depth of the recursiveness can be controlled by the $levels param.\n *\n * @since 2.6.0\n *\n * @param string $folder Optional. Full path to folder. Default empty.\n * @param int    $levels Optional. Levels of folders to follow, Default 100 (PHP Loop limit).\n * @return bool|array False on failure, Else array of files\n */\nfunction list_files( $folder = '', $levels = 100 ) {\n\tif ( empty($folder) )\n\t\treturn false;\n\n\tif ( ! $levels )\n\t\treturn false;\n\n\t$files = array();\n\tif ( $dir = @opendir( $folder ) ) {\n\t\twhile (($file = readdir( $dir ) ) !== false ) {\n\t\t\tif ( in_array($file, array('.', '..') ) )\n\t\t\t\tcontinue;\n\t\t\tif ( is_dir( $folder . '/' . $file ) ) {\n\t\t\t\t$files2 = list_files( $folder . '/' . $file, $levels - 1);\n\t\t\t\tif ( $files2 )\n\t\t\t\t\t$files = array_merge($files, $files2 );\n\t\t\t\telse\n\t\t\t\t\t$files[] = $folder . '/' . $file . '/';\n\t\t\t} else {\n\t\t\t\t$files[] = $folder . '/' . $file;\n\t\t\t}\n\t\t}\n\t}\n\t@closedir( $dir );\n\treturn $files;\n}\n\n/**\n * Returns a filename of a Temporary unique file.\n * Please note that the calling function must unlink() this itself.\n *\n * The filename is based off the passed parameter or defaults to the current unix timestamp,\n * while the directory can either be passed as well, or by leaving it blank, default to a writable temporary directory.\n *\n * @since 2.6.0\n *\n * @param string $filename Optional. Filename to base the Unique file off. Default empty.\n * @param string $dir      Optional. Directory to store the file in. Default empty.\n * @return string a writable filename\n */\nfunction wp_tempnam( $filename = '', $dir = '' ) {\n\tif ( empty( $dir ) ) {\n\t\t$dir = get_temp_dir();\n\t}\n\n\tif ( empty( $filename ) || '.' == $filename || '/' == $filename ) {\n\t\t$filename = time();\n\t}\n\n\t// Use the basename of the given file without the extension as the name for the temporary directory\n\t$temp_filename = basename( $filename );\n\t$temp_filename = preg_replace( '|\\.[^.]*$|', '', $temp_filename );\n\n\t// If the folder is falsey, use its parent directory name instead.\n\tif ( ! $temp_filename ) {\n\t\treturn wp_tempnam( dirname( $filename ), $dir );\n\t}\n\n\t// Suffix some random data to avoid filename conflicts\n\t$temp_filename .= '-' . wp_generate_password( 6, false );\n\t$temp_filename .= '.tmp';\n\t$temp_filename = $dir . wp_unique_filename( $dir, $temp_filename );\n\n\t$fp = @fopen( $temp_filename, 'x' );\n\tif ( ! $fp && is_writable( $dir ) && file_exists( $temp_filename ) ) {\n\t\treturn wp_tempnam( $filename, $dir );\n\t}\n\tif ( $fp ) {\n\t\tfclose( $fp );\n\t}\n\n\treturn $temp_filename;\n}\n\n/**\n * Make sure that the file that was requested to edit, is allowed to be edited\n *\n * Function will die if if you are not allowed to edit the file\n *\n * @since 1.5.0\n *\n * @param string $file file the users is attempting to edit\n * @param array $allowed_files Array of allowed files to edit, $file must match an entry exactly\n * @return string|null\n */\nfunction validate_file_to_edit( $file, $allowed_files = '' ) {\n\t$code = validate_file( $file, $allowed_files );\n\n\tif (!$code )\n\t\treturn $file;\n\n\tswitch ( $code ) {\n\t\tcase 1 :\n\t\t\twp_die( __( 'Sorry, that file cannot be edited.' ) );\n\n\t\t// case 2 :\n\t\t// wp_die( __('Sorry, can&#8217;t call files with their real path.' ));\n\n\t\tcase 3 :\n\t\t\twp_die( __( 'Sorry, that file cannot be edited.' ) );\n\t}\n}\n\n/**\n * Handle PHP uploads in WordPress, sanitizing file names, checking extensions for mime type,\n * and moving the file to the appropriate directory within the uploads directory.\n *\n * @since 4.0.0\n *\n * @see wp_handle_upload_error\n *\n * @param array       $file      Reference to a single element of $_FILES. Call the function once for each uploaded file.\n * @param array|false $overrides An associative array of names => values to override default variables. Default false.\n * @param string      $time      Time formatted in 'yyyy/mm'.\n * @param string      $action    Expected value for $_POST['action'].\n * @return array On success, returns an associative array of file attributes. On failure, returns\n *               $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ).\n*/\nfunction _wp_handle_upload( &$file, $overrides, $time, $action ) {\n\t// The default error handler.\n\tif ( ! function_exists( 'wp_handle_upload_error' ) ) {\n\t\tfunction wp_handle_upload_error( &$file, $message ) {\n\t\t\treturn array( 'error' => $message );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the data for a file before it is uploaded to WordPress.\n\t *\n\t * The dynamic portion of the hook name, `$action`, refers to the post action.\n\t *\n\t * @since 2.9.0 as 'wp_handle_upload_prefilter'.\n\t * @since 4.0.0 Converted to a dynamic hook with `$action`.\n\t *\n\t * @param array $file An array of data for a single file.\n\t */\n\t$file = apply_filters( \"{$action}_prefilter\", $file );\n\n\t// You may define your own function and pass the name in $overrides['upload_error_handler']\n\t$upload_error_handler = 'wp_handle_upload_error';\n\tif ( isset( $overrides['upload_error_handler'] ) ) {\n\t\t$upload_error_handler = $overrides['upload_error_handler'];\n\t}\n\n\t// You may have had one or more 'wp_handle_upload_prefilter' functions error out the file. Handle that gracefully.\n\tif ( isset( $file['error'] ) && ! is_numeric( $file['error'] ) && $file['error'] ) {\n\t\treturn $upload_error_handler( $file, $file['error'] );\n\t}\n\n\t// Install user overrides. Did we mention that this voids your warranty?\n\n\t// You may define your own function and pass the name in $overrides['unique_filename_callback']\n\t$unique_filename_callback = null;\n\tif ( isset( $overrides['unique_filename_callback'] ) ) {\n\t\t$unique_filename_callback = $overrides['unique_filename_callback'];\n\t}\n\n\t/*\n\t * This may not have orignially been intended to be overrideable,\n\t * but historically has been.\n\t */\n\tif ( isset( $overrides['upload_error_strings'] ) ) {\n\t\t$upload_error_strings = $overrides['upload_error_strings'];\n\t} else {\n\t\t// Courtesy of php.net, the strings that describe the error indicated in $_FILES[{form field}]['error'].\n\t\t$upload_error_strings = array(\n\t\t\tfalse,\n\t\t\t__( 'The uploaded file exceeds the upload_max_filesize directive in php.ini.' ),\n\t\t\t__( 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.' ),\n\t\t\t__( 'The uploaded file was only partially uploaded.' ),\n\t\t\t__( 'No file was uploaded.' ),\n\t\t\t'',\n\t\t\t__( 'Missing a temporary folder.' ),\n\t\t\t__( 'Failed to write file to disk.' ),\n\t\t\t__( 'File upload stopped by extension.' )\n\t\t);\n\t}\n\n\t// All tests are on by default. Most can be turned off by $overrides[{test_name}] = false;\n\t$test_form = isset( $overrides['test_form'] ) ? $overrides['test_form'] : true;\n\t$test_size = isset( $overrides['test_size'] ) ? $overrides['test_size'] : true;\n\n\t// If you override this, you must provide $ext and $type!!\n\t$test_type = isset( $overrides['test_type'] ) ? $overrides['test_type'] : true;\n\t$mimes = isset( $overrides['mimes'] ) ? $overrides['mimes'] : false;\n\n\t// A correct form post will pass this test.\n\tif ( $test_form && ( ! isset( $_POST['action'] ) || ( $_POST['action'] != $action ) ) ) {\n\t\treturn call_user_func( $upload_error_handler, $file, __( 'Invalid form submission.' ) );\n\t}\n\t// A successful upload will pass this test. It makes no sense to override this one.\n\tif ( isset( $file['error'] ) && $file['error'] > 0 ) {\n\t\treturn call_user_func( $upload_error_handler, $file, $upload_error_strings[ $file['error'] ] );\n\t}\n\n\t$test_file_size = 'wp_handle_upload' === $action ? $file['size'] : filesize( $file['tmp_name'] );\n\t// A non-empty file will pass this test.\n\tif ( $test_size && ! ( $test_file_size > 0 ) ) {\n\t\tif ( is_multisite() ) {\n\t\t\t$error_msg = __( 'File is empty. Please upload something more substantial.' );\n\t\t} else {\n\t\t\t$error_msg = __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.' );\n\t\t}\n\t\treturn call_user_func( $upload_error_handler, $file, $error_msg );\n\t}\n\n\t// A properly uploaded file will pass this test. There should be no reason to override this one.\n\t$test_uploaded_file = 'wp_handle_upload' === $action ? @ is_uploaded_file( $file['tmp_name'] ) : @ is_file( $file['tmp_name'] );\n\tif ( ! $test_uploaded_file ) {\n\t\treturn call_user_func( $upload_error_handler, $file, __( 'Specified file failed upload test.' ) );\n\t}\n\n\t// A correct MIME type will pass this test. Override $mimes or use the upload_mimes filter.\n\tif ( $test_type ) {\n\t\t$wp_filetype = wp_check_filetype_and_ext( $file['tmp_name'], $file['name'], $mimes );\n\t\t$ext = empty( $wp_filetype['ext'] ) ? '' : $wp_filetype['ext'];\n\t\t$type = empty( $wp_filetype['type'] ) ? '' : $wp_filetype['type'];\n\t\t$proper_filename = empty( $wp_filetype['proper_filename'] ) ? '' : $wp_filetype['proper_filename'];\n\n\t\t// Check to see if wp_check_filetype_and_ext() determined the filename was incorrect\n\t\tif ( $proper_filename ) {\n\t\t\t$file['name'] = $proper_filename;\n\t\t}\n\t\tif ( ( ! $type || !$ext ) && ! current_user_can( 'unfiltered_upload' ) ) {\n\t\t\treturn call_user_func( $upload_error_handler, $file, __( 'Sorry, this file type is not permitted for security reasons.' ) );\n\t\t}\n\t\tif ( ! $type ) {\n\t\t\t$type = $file['type'];\n\t\t}\n\t} else {\n\t\t$type = '';\n\t}\n\n\t/*\n\t * A writable uploads dir will pass this test. Again, there's no point\n\t * overriding this one.\n\t */\n\tif ( ! ( ( $uploads = wp_upload_dir( $time ) ) && false === $uploads['error'] ) ) {\n\t\treturn call_user_func( $upload_error_handler, $file, $uploads['error'] );\n\t}\n\n\t$filename = wp_unique_filename( $uploads['path'], $file['name'], $unique_filename_callback );\n\n\t// Move the file to the uploads dir.\n\t$new_file = $uploads['path'] . \"/$filename\";\n\tif ( 'wp_handle_upload' === $action ) {\n\t\t$move_new_file = @ move_uploaded_file( $file['tmp_name'], $new_file );\n\t} else {\n\t\t// use copy and unlink because rename breaks streams.\n\t\t$move_new_file = @ copy( $file['tmp_name'], $new_file );\n\t\tunlink( $file['tmp_name'] );\n\t}\n\n\tif ( false === $move_new_file ) {\n\t\tif ( 0 === strpos( $uploads['basedir'], ABSPATH ) ) {\n\t\t\t$error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir'];\n\t\t} else {\n\t\t\t$error_path = basename( $uploads['basedir'] ) . $uploads['subdir'];\n\t\t}\n\t\treturn $upload_error_handler( $file, sprintf( __('The uploaded file could not be moved to %s.' ), $error_path ) );\n\t}\n\n\t// Set correct file permissions.\n\t$stat = stat( dirname( $new_file ));\n\t$perms = $stat['mode'] & 0000666;\n\t@ chmod( $new_file, $perms );\n\n\t// Compute the URL.\n\t$url = $uploads['url'] . \"/$filename\";\n\n\tif ( is_multisite() ) {\n\t\tdelete_transient( 'dirsize_cache' );\n\t}\n\n\t/**\n\t * Filter the data array for the uploaded file.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array  $upload {\n\t *     Array of upload data.\n\t *\n\t *     @type string $file Filename of the newly-uploaded file.\n\t *     @type string $url  URL of the uploaded file.\n\t *     @type string $type File type.\n\t * }\n\t * @param string $context The type of upload action. Values include 'upload' or 'sideload'.\n\t */\n\treturn apply_filters( 'wp_handle_upload', array(\n\t\t'file' => $new_file,\n\t\t'url'  => $url,\n\t\t'type' => $type\n\t), 'wp_handle_sideload' === $action ? 'sideload' : 'upload' ); }\n\n/**\n * Wrapper for _wp_handle_upload(), passes 'wp_handle_upload' action.\n *\n * @since 2.0.0\n *\n * @see _wp_handle_upload()\n *\n * @param array      $file      Reference to a single element of $_FILES. Call the function once for\n *                              each uploaded file.\n * @param array|bool $overrides Optional. An associative array of names=>values to override default\n *                              variables. Default false.\n * @param string     $time      Optional. Time formatted in 'yyyy/mm'. Default null.\n * @return array On success, returns an associative array of file attributes. On failure, returns\n *               $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ).\n */\nfunction wp_handle_upload( &$file, $overrides = false, $time = null ) {\n\t/*\n\t *  $_POST['action'] must be set and its value must equal $overrides['action']\n\t *  or this:\n\t */\n\t$action = 'wp_handle_upload';\n\tif ( isset( $overrides['action'] ) ) {\n\t\t$action = $overrides['action'];\n\t}\n\n\treturn _wp_handle_upload( $file, $overrides, $time, $action );\n}\n\n/**\n * Wrapper for _wp_handle_upload(), passes 'wp_handle_sideload' action\n *\n * @since 2.6.0\n *\n * @see _wp_handle_upload()\n *\n * @param array      $file      An array similar to that of a PHP $_FILES POST array\n * @param array|bool $overrides Optional. An associative array of names=>values to override default\n *                              variables. Default false.\n * @param string     $time      Optional. Time formatted in 'yyyy/mm'. Default null.\n * @return array On success, returns an associative array of file attributes. On failure, returns\n *               $overrides['upload_error_handler'](&$file, $message ) or array( 'error'=>$message ).\n */\nfunction wp_handle_sideload( &$file, $overrides = false, $time = null ) {\n\t/*\n\t *  $_POST['action'] must be set and its value must equal $overrides['action']\n\t *  or this:\n\t */\n\t$action = 'wp_handle_sideload';\n\tif ( isset( $overrides['action'] ) ) {\n\t\t$action = $overrides['action'];\n\t}\n\treturn _wp_handle_upload( $file, $overrides, $time, $action );\n}\n\n\n/**\n * Downloads a url to a local temporary file using the WordPress HTTP Class.\n * Please note, That the calling function must unlink() the file.\n *\n * @since 2.5.0\n *\n * @param string $url the URL of the file to download\n * @param int $timeout The timeout for the request to download the file default 300 seconds\n * @return mixed WP_Error on failure, string Filename on success.\n */\nfunction download_url( $url, $timeout = 300 ) {\n\t//WARNING: The file is not automatically deleted, The script must unlink() the file.\n\tif ( ! $url )\n\t\treturn new WP_Error('http_no_url', __('Invalid URL Provided.'));\n\n\t$tmpfname = wp_tempnam($url);\n\tif ( ! $tmpfname )\n\t\treturn new WP_Error('http_no_file', __('Could not create Temporary file.'));\n\n\t$response = wp_safe_remote_get( $url, array( 'timeout' => $timeout, 'stream' => true, 'filename' => $tmpfname ) );\n\n\tif ( is_wp_error( $response ) ) {\n\t\tunlink( $tmpfname );\n\t\treturn $response;\n\t}\n\n\tif ( 200 != wp_remote_retrieve_response_code( $response ) ){\n\t\tunlink( $tmpfname );\n\t\treturn new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ) );\n\t}\n\n\t$content_md5 = wp_remote_retrieve_header( $response, 'content-md5' );\n\tif ( $content_md5 ) {\n\t\t$md5_check = verify_file_md5( $tmpfname, $content_md5 );\n\t\tif ( is_wp_error( $md5_check ) ) {\n\t\t\tunlink( $tmpfname );\n\t\t\treturn $md5_check;\n\t\t}\n\t}\n\n\treturn $tmpfname;\n}\n\n/**\n * Calculates and compares the MD5 of a file to its expected value.\n *\n * @since 3.7.0\n *\n * @param string $filename The filename to check the MD5 of.\n * @param string $expected_md5 The expected MD5 of the file, either a base64 encoded raw md5, or a hex-encoded md5\n * @return bool|object WP_Error on failure, true on success, false when the MD5 format is unknown/unexpected\n */\nfunction verify_file_md5( $filename, $expected_md5 ) {\n\tif ( 32 == strlen( $expected_md5 ) )\n\t\t$expected_raw_md5 = pack( 'H*', $expected_md5 );\n\telseif ( 24 == strlen( $expected_md5 ) )\n\t\t$expected_raw_md5 = base64_decode( $expected_md5 );\n\telse\n\t\treturn false; // unknown format\n\n\t$file_md5 = md5_file( $filename, true );\n\n\tif ( $file_md5 === $expected_raw_md5 )\n\t\treturn true;\n\n\treturn new WP_Error( 'md5_mismatch', sprintf( __( 'The checksum of the file (%1$s) does not match the expected checksum value (%2$s).' ), bin2hex( $file_md5 ), bin2hex( $expected_raw_md5 ) ) );\n}\n\n/**\n * Unzips a specified ZIP file to a location on the Filesystem via the WordPress Filesystem Abstraction.\n * Assumes that WP_Filesystem() has already been called and set up. Does not extract a root-level __MACOSX directory, if present.\n *\n * Attempts to increase the PHP Memory limit to 256M before uncompressing,\n * However, The most memory required shouldn't be much larger than the Archive itself.\n *\n * @since 2.5.0\n *\n * @global WP_Filesystem_Base $wp_filesystem Subclass\n *\n * @param string $file Full path and filename of zip archive\n * @param string $to Full path on the filesystem to extract archive to\n * @return mixed WP_Error on failure, True on success\n */\nfunction unzip_file($file, $to) {\n\tglobal $wp_filesystem;\n\n\tif ( ! $wp_filesystem || !is_object($wp_filesystem) )\n\t\treturn new WP_Error('fs_unavailable', __('Could not access filesystem.'));\n\n\t// Unzip can use a lot of memory, but not this much hopefully\n\t/** This filter is documented in wp-admin/admin.php */\n\t@ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );\n\n\t$needed_dirs = array();\n\t$to = trailingslashit($to);\n\n\t// Determine any parent dir's needed (of the upgrade directory)\n\tif ( ! $wp_filesystem->is_dir($to) ) { //Only do parents if no children exist\n\t\t$path = preg_split('![/\\\\\\]!', untrailingslashit($to));\n\t\tfor ( $i = count($path); $i >= 0; $i-- ) {\n\t\t\tif ( empty($path[$i]) )\n\t\t\t\tcontinue;\n\n\t\t\t$dir = implode('/', array_slice($path, 0, $i+1) );\n\t\t\tif ( preg_match('!^[a-z]:$!i', $dir) ) // Skip it if it looks like a Windows Drive letter.\n\t\t\t\tcontinue;\n\n\t\t\tif ( ! $wp_filesystem->is_dir($dir) )\n\t\t\t\t$needed_dirs[] = $dir;\n\t\t\telse\n\t\t\t\tbreak; // A folder exists, therefor, we dont need the check the levels below this\n\t\t}\n\t}\n\n\t/**\n\t * Filter whether to use ZipArchive to unzip archives.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param bool $ziparchive Whether to use ZipArchive. Default true.\n\t */\n\tif ( class_exists( 'ZipArchive', false ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) {\n\t\t$result = _unzip_file_ziparchive($file, $to, $needed_dirs);\n\t\tif ( true === $result ) {\n\t\t\treturn $result;\n\t\t} elseif ( is_wp_error($result) ) {\n\t\t\tif ( 'incompatible_archive' != $result->get_error_code() )\n\t\t\t\treturn $result;\n\t\t}\n\t}\n\t// Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file.\n\treturn _unzip_file_pclzip($file, $to, $needed_dirs);\n}\n\n/**\n * This function should not be called directly, use unzip_file instead. Attempts to unzip an archive using the ZipArchive class.\n * Assumes that WP_Filesystem() has already been called and set up.\n *\n * @since 3.0.0\n * @see unzip_file\n * @access private\n *\n * @global WP_Filesystem_Base $wp_filesystem Subclass\n *\n * @param string $file Full path and filename of zip archive\n * @param string $to Full path on the filesystem to extract archive to\n * @param array $needed_dirs A partial list of required folders needed to be created.\n * @return mixed WP_Error on failure, True on success\n */\nfunction _unzip_file_ziparchive($file, $to, $needed_dirs = array() ) {\n\tglobal $wp_filesystem;\n\n\t$z = new ZipArchive();\n\n\t$zopen = $z->open( $file, ZIPARCHIVE::CHECKCONS );\n\tif ( true !== $zopen )\n\t\treturn new WP_Error( 'incompatible_archive', __( 'Incompatible Archive.' ), array( 'ziparchive_error' => $zopen ) );\n\n\t$uncompressed_size = 0;\n\n\tfor ( $i = 0; $i < $z->numFiles; $i++ ) {\n\t\tif ( ! $info = $z->statIndex($i) )\n\t\t\treturn new WP_Error( 'stat_failed_ziparchive', __( 'Could not retrieve file from archive.' ) );\n\n\t\tif ( '__MACOSX/' === substr($info['name'], 0, 9) ) // Skip the OS X-created __MACOSX directory\n\t\t\tcontinue;\n\n\t\t$uncompressed_size += $info['size'];\n\n\t\tif ( '/' == substr($info['name'], -1) ) // directory\n\t\t\t$needed_dirs[] = $to . untrailingslashit($info['name']);\n\t\telse\n\t\t\t$needed_dirs[] = $to . untrailingslashit(dirname($info['name']));\n\t}\n\n\t/*\n\t * disk_free_space() could return false. Assume that any falsey value is an error.\n\t * A disk that has zero free bytes has bigger problems.\n\t * Require we have enough space to unzip the file and copy its contents, with a 10% buffer.\n\t */\n\tif ( defined( 'DOING_CRON' ) && DOING_CRON ) {\n\t\t$available_space = @disk_free_space( WP_CONTENT_DIR );\n\t\tif ( $available_space && ( $uncompressed_size * 2.1 ) > $available_space )\n\t\t\treturn new WP_Error( 'disk_full_unzip_file', __( 'Could not copy files. You may have run out of disk space.' ), compact( 'uncompressed_size', 'available_space' ) );\n\t}\n\n\t$needed_dirs = array_unique($needed_dirs);\n\tforeach ( $needed_dirs as $dir ) {\n\t\t// Check the parent folders of the folders all exist within the creation array.\n\t\tif ( untrailingslashit($to) == $dir ) // Skip over the working directory, We know this exists (or will exist)\n\t\t\tcontinue;\n\t\tif ( strpos($dir, $to) === false ) // If the directory is not within the working directory, Skip it\n\t\t\tcontinue;\n\n\t\t$parent_folder = dirname($dir);\n\t\twhile ( !empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs) ) {\n\t\t\t$needed_dirs[] = $parent_folder;\n\t\t\t$parent_folder = dirname($parent_folder);\n\t\t}\n\t}\n\tasort($needed_dirs);\n\n\t// Create those directories if need be:\n\tforeach ( $needed_dirs as $_dir ) {\n\t\t// Only check to see if the Dir exists upon creation failure. Less I/O this way.\n\t\tif ( ! $wp_filesystem->mkdir( $_dir, FS_CHMOD_DIR ) && ! $wp_filesystem->is_dir( $_dir ) ) {\n\t\t\treturn new WP_Error( 'mkdir_failed_ziparchive', __( 'Could not create directory.' ), substr( $_dir, strlen( $to ) ) );\n\t\t}\n\t}\n\tunset($needed_dirs);\n\n\tfor ( $i = 0; $i < $z->numFiles; $i++ ) {\n\t\tif ( ! $info = $z->statIndex($i) )\n\t\t\treturn new WP_Error( 'stat_failed_ziparchive', __( 'Could not retrieve file from archive.' ) );\n\n\t\tif ( '/' == substr($info['name'], -1) ) // directory\n\t\t\tcontinue;\n\n\t\tif ( '__MACOSX/' === substr($info['name'], 0, 9) ) // Don't extract the OS X-created __MACOSX directory files\n\t\t\tcontinue;\n\n\t\t$contents = $z->getFromIndex($i);\n\t\tif ( false === $contents )\n\t\t\treturn new WP_Error( 'extract_failed_ziparchive', __( 'Could not extract file from archive.' ), $info['name'] );\n\n\t\tif ( ! $wp_filesystem->put_contents( $to . $info['name'], $contents, FS_CHMOD_FILE) )\n\t\t\treturn new WP_Error( 'copy_failed_ziparchive', __( 'Could not copy file.' ), $info['name'] );\n\t}\n\n\t$z->close();\n\n\treturn true;\n}\n\n/**\n * This function should not be called directly, use unzip_file instead. Attempts to unzip an archive using the PclZip library.\n * Assumes that WP_Filesystem() has already been called and set up.\n *\n * @since 3.0.0\n * @see unzip_file\n * @access private\n *\n * @global WP_Filesystem_Base $wp_filesystem Subclass\n *\n * @param string $file Full path and filename of zip archive\n * @param string $to Full path on the filesystem to extract archive to\n * @param array $needed_dirs A partial list of required folders needed to be created.\n * @return mixed WP_Error on failure, True on success\n */\nfunction _unzip_file_pclzip($file, $to, $needed_dirs = array()) {\n\tglobal $wp_filesystem;\n\n\tmbstring_binary_safe_encoding();\n\n\trequire_once(ABSPATH . 'wp-admin/includes/class-pclzip.php');\n\n\t$archive = new PclZip($file);\n\n\t$archive_files = $archive->extract(PCLZIP_OPT_EXTRACT_AS_STRING);\n\n\treset_mbstring_encoding();\n\n\t// Is the archive valid?\n\tif ( !is_array($archive_files) )\n\t\treturn new WP_Error('incompatible_archive', __('Incompatible Archive.'), $archive->errorInfo(true));\n\n\tif ( 0 == count($archive_files) )\n\t\treturn new WP_Error( 'empty_archive_pclzip', __( 'Empty archive.' ) );\n\n\t$uncompressed_size = 0;\n\n\t// Determine any children directories needed (From within the archive)\n\tforeach ( $archive_files as $file ) {\n\t\tif ( '__MACOSX/' === substr($file['filename'], 0, 9) ) // Skip the OS X-created __MACOSX directory\n\t\t\tcontinue;\n\n\t\t$uncompressed_size += $file['size'];\n\n\t\t$needed_dirs[] = $to . untrailingslashit( $file['folder'] ? $file['filename'] : dirname($file['filename']) );\n\t}\n\n\t/*\n\t * disk_free_space() could return false. Assume that any falsey value is an error.\n\t * A disk that has zero free bytes has bigger problems.\n\t * Require we have enough space to unzip the file and copy its contents, with a 10% buffer.\n\t */\n\tif ( defined( 'DOING_CRON' ) && DOING_CRON ) {\n\t\t$available_space = @disk_free_space( WP_CONTENT_DIR );\n\t\tif ( $available_space && ( $uncompressed_size * 2.1 ) > $available_space )\n\t\t\treturn new WP_Error( 'disk_full_unzip_file', __( 'Could not copy files. You may have run out of disk space.' ), compact( 'uncompressed_size', 'available_space' ) );\n\t}\n\n\t$needed_dirs = array_unique($needed_dirs);\n\tforeach ( $needed_dirs as $dir ) {\n\t\t// Check the parent folders of the folders all exist within the creation array.\n\t\tif ( untrailingslashit($to) == $dir ) // Skip over the working directory, We know this exists (or will exist)\n\t\t\tcontinue;\n\t\tif ( strpos($dir, $to) === false ) // If the directory is not within the working directory, Skip it\n\t\t\tcontinue;\n\n\t\t$parent_folder = dirname($dir);\n\t\twhile ( !empty($parent_folder) && untrailingslashit($to) != $parent_folder && !in_array($parent_folder, $needed_dirs) ) {\n\t\t\t$needed_dirs[] = $parent_folder;\n\t\t\t$parent_folder = dirname($parent_folder);\n\t\t}\n\t}\n\tasort($needed_dirs);\n\n\t// Create those directories if need be:\n\tforeach ( $needed_dirs as $_dir ) {\n\t\t// Only check to see if the dir exists upon creation failure. Less I/O this way.\n\t\tif ( ! $wp_filesystem->mkdir( $_dir, FS_CHMOD_DIR ) && ! $wp_filesystem->is_dir( $_dir ) )\n\t\t\treturn new WP_Error( 'mkdir_failed_pclzip', __( 'Could not create directory.' ), substr( $_dir, strlen( $to ) ) );\n\t}\n\tunset($needed_dirs);\n\n\t// Extract the files from the zip\n\tforeach ( $archive_files as $file ) {\n\t\tif ( $file['folder'] )\n\t\t\tcontinue;\n\n\t\tif ( '__MACOSX/' === substr($file['filename'], 0, 9) ) // Don't extract the OS X-created __MACOSX directory files\n\t\t\tcontinue;\n\n\t\tif ( ! $wp_filesystem->put_contents( $to . $file['filename'], $file['content'], FS_CHMOD_FILE) )\n\t\t\treturn new WP_Error( 'copy_failed_pclzip', __( 'Could not copy file.' ), $file['filename'] );\n\t}\n\treturn true;\n}\n\n/**\n * Copies a directory from one location to another via the WordPress Filesystem Abstraction.\n * Assumes that WP_Filesystem() has already been called and setup.\n *\n * @since 2.5.0\n *\n * @global WP_Filesystem_Base $wp_filesystem Subclass\n *\n * @param string $from source directory\n * @param string $to destination directory\n * @param array $skip_list a list of files/folders to skip copying\n * @return mixed WP_Error on failure, True on success.\n */\nfunction copy_dir($from, $to, $skip_list = array() ) {\n\tglobal $wp_filesystem;\n\n\t$dirlist = $wp_filesystem->dirlist($from);\n\n\t$from = trailingslashit($from);\n\t$to = trailingslashit($to);\n\n\tforeach ( (array) $dirlist as $filename => $fileinfo ) {\n\t\tif ( in_array( $filename, $skip_list ) )\n\t\t\tcontinue;\n\n\t\tif ( 'f' == $fileinfo['type'] ) {\n\t\t\tif ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) {\n\t\t\t\t// If copy failed, chmod file to 0644 and try again.\n\t\t\t\t$wp_filesystem->chmod( $to . $filename, FS_CHMOD_FILE );\n\t\t\t\tif ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) )\n\t\t\t\t\treturn new WP_Error( 'copy_failed_copy_dir', __( 'Could not copy file.' ), $to . $filename );\n\t\t\t}\n\t\t} elseif ( 'd' == $fileinfo['type'] ) {\n\t\t\tif ( !$wp_filesystem->is_dir($to . $filename) ) {\n\t\t\t\tif ( !$wp_filesystem->mkdir($to . $filename, FS_CHMOD_DIR) )\n\t\t\t\t\treturn new WP_Error( 'mkdir_failed_copy_dir', __( 'Could not create directory.' ), $to . $filename );\n\t\t\t}\n\n\t\t\t// generate the $sub_skip_list for the subdirectory as a sub-set of the existing $skip_list\n\t\t\t$sub_skip_list = array();\n\t\t\tforeach ( $skip_list as $skip_item ) {\n\t\t\t\tif ( 0 === strpos( $skip_item, $filename . '/' ) )\n\t\t\t\t\t$sub_skip_list[] = preg_replace( '!^' . preg_quote( $filename, '!' ) . '/!i', '', $skip_item );\n\t\t\t}\n\n\t\t\t$result = copy_dir($from . $filename, $to . $filename, $sub_skip_list);\n\t\t\tif ( is_wp_error($result) )\n\t\t\t\treturn $result;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Initialises and connects the WordPress Filesystem Abstraction classes.\n * This function will include the chosen transport and attempt connecting.\n *\n * Plugins may add extra transports, And force WordPress to use them by returning\n * the filename via the {@see 'filesystem_method_file'} filter.\n *\n * @since 2.5.0\n *\n * @global WP_Filesystem_Base $wp_filesystem Subclass\n *\n * @param array|false  $args                         Optional. Connection args, These are passed directly to\n *                                                   the `WP_Filesystem_*()` classes. Default false.\n * @param string|false $context                      Optional. Context for get_filesystem_method(). Default false.\n * @param bool         $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable. Default false.\n * @return null|bool false on failure, true on success.\n */\nfunction WP_Filesystem( $args = false, $context = false, $allow_relaxed_file_ownership = false ) {\n\tglobal $wp_filesystem;\n\n\trequire_once(ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php');\n\n\t$method = get_filesystem_method( $args, $context, $allow_relaxed_file_ownership );\n\n\tif ( ! $method )\n\t\treturn false;\n\n\tif ( ! class_exists( \"WP_Filesystem_$method\" ) ) {\n\n\t\t/**\n\t\t * Filter the path for a specific filesystem method class file.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @see get_filesystem_method()\n\t\t *\n\t\t * @param string $path   Path to the specific filesystem method class file.\n\t\t * @param string $method The filesystem method to use.\n\t\t */\n\t\t$abstraction_file = apply_filters( 'filesystem_method_file', ABSPATH . 'wp-admin/includes/class-wp-filesystem-' . $method . '.php', $method );\n\n\t\tif ( ! file_exists($abstraction_file) )\n\t\t\treturn;\n\n\t\trequire_once($abstraction_file);\n\t}\n\t$method = \"WP_Filesystem_$method\";\n\n\t$wp_filesystem = new $method($args);\n\n\t//Define the timeouts for the connections. Only available after the construct is called to allow for per-transport overriding of the default.\n\tif ( ! defined('FS_CONNECT_TIMEOUT') )\n\t\tdefine('FS_CONNECT_TIMEOUT', 30);\n\tif ( ! defined('FS_TIMEOUT') )\n\t\tdefine('FS_TIMEOUT', 30);\n\n\tif ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() )\n\t\treturn false;\n\n\tif ( !$wp_filesystem->connect() )\n\t\treturn false; //There was an error connecting to the server.\n\n\t// Set the permission constants if not already set.\n\tif ( ! defined('FS_CHMOD_DIR') )\n\t\tdefine('FS_CHMOD_DIR', ( fileperms( ABSPATH ) & 0777 | 0755 ) );\n\tif ( ! defined('FS_CHMOD_FILE') )\n\t\tdefine('FS_CHMOD_FILE', ( fileperms( ABSPATH . 'index.php' ) & 0777 | 0644 ) );\n\n\treturn true;\n}\n\n/**\n * Determines which method to use for reading, writing, modifying, or deleting\n * files on the filesystem.\n *\n * The priority of the transports are: Direct, SSH2, FTP PHP Extension, FTP Sockets\n * (Via Sockets class, or `fsockopen()`). Valid values for these are: 'direct', 'ssh2',\n * 'ftpext' or 'ftpsockets'.\n *\n * The return value can be overridden by defining the `FS_METHOD` constant in `wp-config.php`,\n * or filtering via {@see 'filesystem_method'}.\n *\n * @link https://codex.wordpress.org/Editing_wp-config.php#WordPress_Upgrade_Constants\n *\n * Plugins may define a custom transport handler, See WP_Filesystem().\n *\n * @since 2.5.0\n *\n * @global callable $_wp_filesystem_direct_method\n *\n * @param array  $args                         Optional. Connection details. Default empty array.\n * @param string $context                      Optional. Full path to the directory that is tested\n *                                             for being writable. Default false.\n * @param bool   $allow_relaxed_file_ownership Optional. Whether to allow Group/World writable.\n *                                             Default false.\n * @return string The transport to use, see description for valid return values.\n */\nfunction get_filesystem_method( $args = array(), $context = false, $allow_relaxed_file_ownership = false ) {\n\t$method = defined('FS_METHOD') ? FS_METHOD : false; // Please ensure that this is either 'direct', 'ssh2', 'ftpext' or 'ftpsockets'\n\n\tif ( ! $context ) {\n\t\t$context = WP_CONTENT_DIR;\n\t}\n\n\t// If the directory doesn't exist (wp-content/languages) then use the parent directory as we'll create it.\n\tif ( WP_LANG_DIR == $context && ! is_dir( $context ) ) {\n\t\t$context = dirname( $context );\n\t}\n\n\t$context = trailingslashit( $context );\n\n\tif ( ! $method ) {\n\n\t\t$temp_file_name = $context . 'temp-write-test-' . time();\n\t\t$temp_handle = @fopen($temp_file_name, 'w');\n\t\tif ( $temp_handle ) {\n\n\t\t\t// Attempt to determine the file owner of the WordPress files, and that of newly created files\n\t\t\t$wp_file_owner = $temp_file_owner = false;\n\t\t\tif ( function_exists('fileowner') ) {\n\t\t\t\t$wp_file_owner = @fileowner( __FILE__ );\n\t\t\t\t$temp_file_owner = @fileowner( $temp_file_name );\n\t\t\t}\n\n\t\t\tif ( $wp_file_owner !== false && $wp_file_owner === $temp_file_owner ) {\n\t\t\t\t// WordPress is creating files as the same owner as the WordPress files,\n\t\t\t\t// this means it's safe to modify & create new files via PHP.\n\t\t\t\t$method = 'direct';\n\t\t\t\t$GLOBALS['_wp_filesystem_direct_method'] = 'file_owner';\n\t\t\t} elseif ( $allow_relaxed_file_ownership ) {\n\t\t\t\t// The $context directory is writable, and $allow_relaxed_file_ownership is set, this means we can modify files\n\t\t\t\t// safely in this directory. This mode doesn't create new files, only alter existing ones.\n\t\t\t\t$method = 'direct';\n\t\t\t\t$GLOBALS['_wp_filesystem_direct_method'] = 'relaxed_ownership';\n\t\t\t}\n\n\t\t\t@fclose($temp_handle);\n\t\t\t@unlink($temp_file_name);\n\t\t}\n \t}\n\n\tif ( ! $method && isset($args['connection_type']) && 'ssh' == $args['connection_type'] && extension_loaded('ssh2') && function_exists('stream_get_contents') ) $method = 'ssh2';\n\tif ( ! $method && extension_loaded('ftp') ) $method = 'ftpext';\n\tif ( ! $method && ( extension_loaded('sockets') || function_exists('fsockopen') ) ) $method = 'ftpsockets'; //Sockets: Socket extension; PHP Mode: FSockopen / fwrite / fread\n\n\t/**\n\t * Filter the filesystem method to use.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string $method  Filesystem method to return.\n\t * @param array  $args    An array of connection details for the method.\n\t * @param string $context Full path to the directory that is tested for being writable.\n\t * @param bool   $allow_relaxed_file_ownership Whether to allow Group/World writable.\n\t */\n\treturn apply_filters( 'filesystem_method', $method, $args, $context, $allow_relaxed_file_ownership );\n}\n\n/**\n * Displays a form to the user to request for their FTP/SSH details in order\n * to connect to the filesystem.\n *\n * All chosen/entered details are saved, Excluding the Password.\n *\n * Hostnames may be in the form of hostname:portnumber (eg: wordpress.org:2467)\n * to specify an alternate FTP/SSH port.\n *\n * Plugins may override this form by returning true|false via the\n * {@see 'request_filesystem_credentials'} filter.\n *\n * @since 2.5.\n *\n * @todo Properly mark optional arguments as such\n *\n * @global string $pagenow\n *\n * @param string $form_post    the URL to post the form to\n * @param string $type         the chosen Filesystem method in use\n * @param bool   $error        if the current request has failed to connect\n * @param string $context      The directory which is needed access to, The write-test will be performed on this directory by get_filesystem_method()\n * @param array  $extra_fields Extra POST fields which should be checked for to be included in the post.\n * @param bool   $allow_relaxed_file_ownership Whether to allow Group/World writable.\n * @return bool False on failure. True on success.\n */\nfunction request_filesystem_credentials($form_post, $type = '', $error = false, $context = false, $extra_fields = null, $allow_relaxed_file_ownership = false ) {\n\tglobal $pagenow;\n\n\t/**\n\t * Filter the filesystem credentials form output.\n\t *\n\t * Returning anything other than an empty string will effectively short-circuit\n\t * output of the filesystem credentials form, returning that value instead.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param mixed  $output       Form output to return instead. Default empty.\n\t * @param string $form_post    URL to POST the form to.\n\t * @param string $type         Chosen type of filesystem.\n\t * @param bool   $error        Whether the current request has failed to connect.\n\t *                             Default false.\n\t * @param string $context      Full path to the directory that is tested for\n\t *                             being writable.\n\t * @param bool $allow_relaxed_file_ownership Whether to allow Group/World writable.\n\t * @param array  $extra_fields Extra POST fields.\n\t */\n\t$req_cred = apply_filters( 'request_filesystem_credentials', '', $form_post, $type, $error, $context, $extra_fields, $allow_relaxed_file_ownership );\n\tif ( '' !== $req_cred )\n\t\treturn $req_cred;\n\n\tif ( empty($type) ) {\n\t\t$type = get_filesystem_method( array(), $context, $allow_relaxed_file_ownership );\n\t}\n\n\tif ( 'direct' == $type )\n\t\treturn true;\n\n\tif ( is_null( $extra_fields ) )\n\t\t$extra_fields = array( 'version', 'locale' );\n\n\t$credentials = get_option('ftp_credentials', array( 'hostname' => '', 'username' => ''));\n\n\t// If defined, set it to that, Else, If POST'd, set it to that, If not, Set it to whatever it previously was(saved details in option)\n\t$credentials['hostname'] = defined('FTP_HOST') ? FTP_HOST : (!empty($_POST['hostname']) ? wp_unslash( $_POST['hostname'] ) : $credentials['hostname']);\n\t$credentials['username'] = defined('FTP_USER') ? FTP_USER : (!empty($_POST['username']) ? wp_unslash( $_POST['username'] ) : $credentials['username']);\n\t$credentials['password'] = defined('FTP_PASS') ? FTP_PASS : (!empty($_POST['password']) ? wp_unslash( $_POST['password'] ) : '');\n\n\t// Check to see if we are setting the public/private keys for ssh\n\t$credentials['public_key'] = defined('FTP_PUBKEY') ? FTP_PUBKEY : (!empty($_POST['public_key']) ? wp_unslash( $_POST['public_key'] ) : '');\n\t$credentials['private_key'] = defined('FTP_PRIKEY') ? FTP_PRIKEY : (!empty($_POST['private_key']) ? wp_unslash( $_POST['private_key'] ) : '');\n\n\t// Sanitize the hostname, Some people might pass in odd-data:\n\t$credentials['hostname'] = preg_replace('|\\w+://|', '', $credentials['hostname']); //Strip any schemes off\n\n\tif ( strpos($credentials['hostname'], ':') ) {\n\t\tlist( $credentials['hostname'], $credentials['port'] ) = explode(':', $credentials['hostname'], 2);\n\t\tif ( ! is_numeric($credentials['port']) )\n\t\t\tunset($credentials['port']);\n\t} else {\n\t\tunset($credentials['port']);\n\t}\n\n\tif ( ( defined( 'FTP_SSH' ) && FTP_SSH ) || ( defined( 'FS_METHOD' ) && 'ssh2' == FS_METHOD ) ) {\n\t\t$credentials['connection_type'] = 'ssh';\n\t} elseif ( ( defined( 'FTP_SSL' ) && FTP_SSL ) && 'ftpext' == $type ) { //Only the FTP Extension understands SSL\n\t\t$credentials['connection_type'] = 'ftps';\n\t} elseif ( ! empty( $_POST['connection_type'] ) ) {\n\t\t$credentials['connection_type'] = wp_unslash( $_POST['connection_type'] );\n\t} elseif ( ! isset( $credentials['connection_type'] ) ) { //All else fails (And it's not defaulted to something else saved), Default to FTP\n\t\t$credentials['connection_type'] = 'ftp';\n\t}\n\tif ( ! $error &&\n\t\t\t(\n\t\t\t\t( !empty($credentials['password']) && !empty($credentials['username']) && !empty($credentials['hostname']) ) ||\n\t\t\t\t( 'ssh' == $credentials['connection_type'] && !empty($credentials['public_key']) && !empty($credentials['private_key']) )\n\t\t\t) ) {\n\t\t$stored_credentials = $credentials;\n\t\tif ( !empty($stored_credentials['port']) ) //save port as part of hostname to simplify above code.\n\t\t\t$stored_credentials['hostname'] .= ':' . $stored_credentials['port'];\n\n\t\tunset($stored_credentials['password'], $stored_credentials['port'], $stored_credentials['private_key'], $stored_credentials['public_key']);\n\t\tif ( ! wp_installing() ) {\n\t\t\tupdate_option( 'ftp_credentials', $stored_credentials );\n\t\t}\n\t\treturn $credentials;\n\t}\n\t$hostname = isset( $credentials['hostname'] ) ? $credentials['hostname'] : '';\n\t$username = isset( $credentials['username'] ) ? $credentials['username'] : '';\n\t$public_key = isset( $credentials['public_key'] ) ? $credentials['public_key'] : '';\n\t$private_key = isset( $credentials['private_key'] ) ? $credentials['private_key'] : '';\n\t$port = isset( $credentials['port'] ) ? $credentials['port'] : '';\n\t$connection_type = isset( $credentials['connection_type'] ) ? $credentials['connection_type'] : '';\n\n\tif ( $error ) {\n\t\t$error_string = __('<strong>ERROR:</strong> There was an error connecting to the server, Please verify the settings are correct.');\n\t\tif ( is_wp_error($error) )\n\t\t\t$error_string = esc_html( $error->get_error_message() );\n\t\techo '<div id=\"message\" class=\"error\"><p>' . $error_string . '</p></div>';\n\t}\n\n\t$types = array();\n\tif ( extension_loaded('ftp') || extension_loaded('sockets') || function_exists('fsockopen') )\n\t\t$types[ 'ftp' ] = __('FTP');\n\tif ( extension_loaded('ftp') ) //Only this supports FTPS\n\t\t$types[ 'ftps' ] = __('FTPS (SSL)');\n\tif ( extension_loaded('ssh2') && function_exists('stream_get_contents') )\n\t\t$types[ 'ssh' ] = __('SSH2');\n\n\t/**\n\t * Filter the connection types to output to the filesystem credentials form.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param array  $types       Types of connections.\n\t * @param array  $credentials Credentials to connect with.\n\t * @param string $type        Chosen filesystem method.\n\t * @param object $error       Error object.\n\t * @param string $context     Full path to the directory that is tested\n\t *                            for being writable.\n\t */\n\t$types = apply_filters( 'fs_ftp_connection_types', $types, $credentials, $type, $error, $context );\n\n?>\n<script type=\"text/javascript\">\n<!--\njQuery(function($){\n\tjQuery(\"#ssh\").click(function () {\n\t\tjQuery(\"#ssh_keys\").show();\n\t});\n\tjQuery(\"#ftp, #ftps\").click(function () {\n\t\tjQuery(\"#ssh_keys\").hide();\n\t});\n\tjQuery('#request-filesystem-credentials-form input[value=\"\"]:first').focus();\n});\n-->\n</script>\n<form action=\"<?php echo esc_url( $form_post ) ?>\" method=\"post\">\n<div id=\"request-filesystem-credentials-form\" class=\"request-filesystem-credentials-form\">\n<?php\n// Print a H1 heading in the FTP credentials modal dialog, default is a H2.\n$heading_tag = 'h2';\nif ( 'plugins.php' === $pagenow || 'plugin-install.php' === $pagenow ) {\n\t$heading_tag = 'h1';\n}\necho \"<$heading_tag id='request-filesystem-credentials-title'>\" . __( 'Connection Information' ) . \"</$heading_tag>\";\n?>\n<p id=\"request-filesystem-credentials-desc\"><?php\n\t$label_user = __('Username');\n\t$label_pass = __('Password');\n\t_e('To perform the requested action, WordPress needs to access your web server.');\n\techo ' ';\n\tif ( ( isset( $types['ftp'] ) || isset( $types['ftps'] ) ) ) {\n\t\tif ( isset( $types['ssh'] ) ) {\n\t\t\t_e('Please enter your FTP or SSH credentials to proceed.');\n\t\t\t$label_user = __('FTP/SSH Username');\n\t\t\t$label_pass = __('FTP/SSH Password');\n\t\t} else {\n\t\t\t_e('Please enter your FTP credentials to proceed.');\n\t\t\t$label_user = __('FTP Username');\n\t\t\t$label_pass = __('FTP Password');\n\t\t}\n\t\techo ' ';\n\t}\n\t_e('If you do not remember your credentials, you should contact your web host.');\n?></p>\n<label for=\"hostname\">\n\t<span class=\"field-title\"><?php _e( 'Hostname' ) ?></span>\n\t<input name=\"hostname\" type=\"text\" id=\"hostname\" aria-describedby=\"request-filesystem-credentials-desc\" class=\"code\" placeholder=\"<?php esc_attr_e( 'example: www.wordpress.org' ) ?>\" value=\"<?php echo esc_attr($hostname); if ( !empty($port) ) echo \":$port\"; ?>\"<?php disabled( defined('FTP_HOST') ); ?> />\n</label>\n<div class=\"ftp-username\">\n\t<label for=\"username\">\n\t\t<span class=\"field-title\"><?php echo $label_user; ?></span>\n\t\t<input name=\"username\" type=\"text\" id=\"username\" value=\"<?php echo esc_attr($username) ?>\"<?php disabled( defined('FTP_USER') ); ?> />\n\t</label>\n</div>\n<div class=\"ftp-password\">\n\t<label for=\"password\">\n\t\t<span class=\"field-title\"><?php echo $label_pass; ?></span>\n\t\t<input name=\"password\" type=\"password\" id=\"password\" value=\"<?php if ( defined('FTP_PASS') ) echo '*****'; ?>\"<?php disabled( defined('FTP_PASS') ); ?> />\n\t\t<em><?php if ( ! defined('FTP_PASS') ) _e( 'This password will not be stored on the server.' ); ?></em>\n\t</label>\n</div>\n<?php if ( isset($types['ssh']) ) : ?>\n<fieldset>\n<legend><?php _e( 'Authentication Keys' ); ?></legend>\n<label for=\"public_key\">\n\t<span class=\"field-title\"><?php _e('Public Key:') ?></span>\n\t<input name=\"public_key\" type=\"text\" id=\"public_key\" aria-describedby=\"auth-keys-desc\" value=\"<?php echo esc_attr($public_key) ?>\"<?php disabled( defined('FTP_PUBKEY') ); ?> />\n</label>\n<label for=\"private_key\">\n\t<span class=\"field-title\"><?php _e('Private Key:') ?></span>\n\t<input name=\"private_key\" type=\"text\" id=\"private_key\" value=\"<?php echo esc_attr($private_key) ?>\"<?php disabled( defined('FTP_PRIKEY') ); ?> />\n</label>\n</fieldset>\n<span id=\"auth-keys-desc\"><?php _e('Enter the location on the server where the public and private keys are located. If a passphrase is needed, enter that in the password field above.') ?></span>\n<?php endif; ?>\n<fieldset>\n<legend><?php _e( 'Connection Type' ); ?></legend>\n<?php\n\t$disabled = disabled( (defined('FTP_SSL') && FTP_SSL) || (defined('FTP_SSH') && FTP_SSH), true, false );\n\tforeach ( $types as $name => $text ) : ?>\n\t<label for=\"<?php echo esc_attr($name) ?>\">\n\t\t<input type=\"radio\" name=\"connection_type\" id=\"<?php echo esc_attr($name) ?>\" value=\"<?php echo esc_attr($name) ?>\"<?php checked($name, $connection_type); echo $disabled; ?> />\n\t\t<?php echo $text ?>\n\t</label>\n\t<?php endforeach; ?>\n</fieldset>\n<?php\nforeach ( (array) $extra_fields as $field ) {\n\tif ( isset( $_POST[ $field ] ) )\n\t\techo '<input type=\"hidden\" name=\"' . esc_attr( $field ) . '\" value=\"' . esc_attr( wp_unslash( $_POST[ $field ] ) ) . '\" />';\n}\n?>\n\t<p class=\"request-filesystem-credentials-action-buttons\">\n\t\t<button class=\"button cancel-button\" data-js-action=\"close\" type=\"button\"><?php _e( 'Cancel' ); ?></button>\n\t\t<?php submit_button( __( 'Proceed' ), 'button', 'upgrade', false ); ?>\n\t</p>\n</div>\n</form>\n<?php\n\treturn false;\n}\n\n/**\n * Print the filesystem credentials modal when needed.\n *\n * @since 4.2.0\n */\nfunction wp_print_request_filesystem_credentials_modal() {\n\t$filesystem_method = get_filesystem_method();\n\tob_start();\n\t$filesystem_credentials_are_stored = request_filesystem_credentials( self_admin_url() );\n\tob_end_clean();\n\t$request_filesystem_credentials = ( $filesystem_method != 'direct' && ! $filesystem_credentials_are_stored );\n\tif ( ! $request_filesystem_credentials ) {\n\t\treturn;\n\t}\n\t?>\n\t<div id=\"request-filesystem-credentials-dialog\" class=\"notification-dialog-wrap request-filesystem-credentials-dialog\">\n\t\t<div class=\"notification-dialog-background\"></div>\n\t\t<div class=\"notification-dialog\" role=\"dialog\" aria-labelledby=\"request-filesystem-credentials-title\" tabindex=\"0\">\n\t\t\t<div class=\"request-filesystem-credentials-dialog-content\">\n\t\t\t\t<?php request_filesystem_credentials( site_url() ); ?>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<?php\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/image-edit.php",
    "content": "<?php\n/**\n * WordPress Image Editor\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Loads the WP image-editing interface.\n *\n * @param int         $post_id Post ID.\n * @param bool|object $msg     Optional. Message to display for image editor updates or errors.\n *                             Default false.\n */\nfunction wp_image_editor($post_id, $msg = false) {\n\t$nonce = wp_create_nonce(\"image_editor-$post_id\");\n\t$meta = wp_get_attachment_metadata($post_id);\n\t$thumb = image_get_intermediate_size($post_id, 'thumbnail');\n\t$sub_sizes = isset($meta['sizes']) && is_array($meta['sizes']);\n\t$note = '';\n\n\tif ( isset( $meta['width'], $meta['height'] ) )\n\t\t$big = max( $meta['width'], $meta['height'] );\n\telse\n\t\tdie( __('Image data does not exist. Please re-upload the image.') );\n\n\t$sizer = $big > 400 ? 400 / $big : 1;\n\n\t$backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );\n\t$can_restore = false;\n\tif ( ! empty( $backup_sizes ) && isset( $backup_sizes['full-orig'], $meta['file'] ) )\n\t\t$can_restore = $backup_sizes['full-orig']['file'] != basename( $meta['file'] );\n\n\tif ( $msg ) {\n\t\tif ( isset($msg->error) )\n\t\t\t$note = \"<div class='error'><p>$msg->error</p></div>\";\n\t\telseif ( isset($msg->msg) )\n\t\t\t$note = \"<div class='updated'><p>$msg->msg</p></div>\";\n\t}\n\n\t?>\n\t<div class=\"imgedit-wrap\">\n\t<div id=\"imgedit-panel-<?php echo $post_id; ?>\">\n\n\t<div class=\"imgedit-settings\">\n\t<div class=\"imgedit-group\">\n\t<div class=\"imgedit-group-top\">\n\t\t<h2><?php _e( 'Scale Image' ); ?> <a href=\"#\" class=\"dashicons dashicons-editor-help imgedit-help-toggle\" onclick=\"imageEdit.toggleHelp(this);return false;\"></a></h2>\n\t\t<div class=\"imgedit-help\">\n\t\t<p><?php _e('You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.'); ?></p>\n\t\t</div>\n\t\t<?php if ( isset( $meta['width'], $meta['height'] ) ): ?>\n\t\t<p><?php printf( __('Original dimensions %s'), $meta['width'] . ' &times; ' . $meta['height'] ); ?></p>\n\t\t<?php endif ?>\n\t\t<div class=\"imgedit-submit\">\n\t\t<span class=\"nowrap\"><input type=\"text\" id=\"imgedit-scale-width-<?php echo $post_id; ?>\" onkeyup=\"imageEdit.scaleChanged(<?php echo $post_id; ?>, 1)\" onblur=\"imageEdit.scaleChanged(<?php echo $post_id; ?>, 1)\" style=\"width:4em;\" value=\"<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>\" /> &times; <input type=\"text\" id=\"imgedit-scale-height-<?php echo $post_id; ?>\" onkeyup=\"imageEdit.scaleChanged(<?php echo $post_id; ?>, 0)\" onblur=\"imageEdit.scaleChanged(<?php echo $post_id; ?>, 0)\" style=\"width:4em;\" value=\"<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>\" />\n\t\t<span class=\"imgedit-scale-warn\" id=\"imgedit-scale-warn-<?php echo $post_id; ?>\">!</span></span>\n\t\t<input type=\"button\" onclick=\"imageEdit.action(<?php echo \"$post_id, '$nonce'\"; ?>, 'scale')\" class=\"button button-primary\" value=\"<?php esc_attr_e( 'Scale' ); ?>\" />\n\t\t</div>\n\t</div>\n\t</div>\n\n<?php if ( $can_restore ) { ?>\n\n\t<div class=\"imgedit-group\">\n\t<div class=\"imgedit-group-top\">\n\t\t<h2><a onclick=\"imageEdit.toggleHelp(this);return false;\" href=\"#\"><?php _e('Restore Original Image'); ?> <span class=\"dashicons dashicons-arrow-down imgedit-help-toggle\"></span></a></h2>\n\t\t<div class=\"imgedit-help\">\n\t\t<p><?php _e('Discard any changes and restore the original image.');\n\n\t\tif ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE )\n\t\t\techo ' '.__('Previously edited copies of the image will not be deleted.');\n\n\t\t?></p>\n\t\t<div class=\"imgedit-submit\">\n\t\t<input type=\"button\" onclick=\"imageEdit.action(<?php echo \"$post_id, '$nonce'\"; ?>, 'restore')\" class=\"button button-primary\" value=\"<?php esc_attr_e( 'Restore image' ); ?>\" <?php echo $can_restore; ?> />\n\t\t</div>\n\t\t</div>\n\t</div>\n\t</div>\n\n<?php } ?>\n\n\t<div class=\"imgedit-group\">\n\t<div class=\"imgedit-group-top\">\n\t\t<h2><?php _e( 'Image Crop' ); ?> <a href=\"#\" class=\"dashicons dashicons-editor-help imgedit-help-toggle\" onclick=\"imageEdit.toggleHelp(this);return false;\"></a></h2>\n\n\t\t<div class=\"imgedit-help\">\n\t\t<p><?php _e('To crop the image, click on it and drag to make your selection.'); ?></p>\n\n\t\t<p><strong><?php _e('Crop Aspect Ratio'); ?></strong><br />\n\t\t<?php _e('The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.'); ?></p>\n\n\t\t<p><strong><?php _e('Crop Selection'); ?></strong><br />\n\t\t<?php _e('Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.'); ?></p>\n\t\t</div>\n\t</div>\n\n\t<p>\n\t\t<?php _e('Aspect ratio:'); ?>\n\t\t<span  class=\"nowrap\">\n\t\t<input type=\"text\" id=\"imgedit-crop-width-<?php echo $post_id; ?>\" onkeyup=\"imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)\" style=\"width:3em;\" />\n\t\t:\n\t\t<input type=\"text\" id=\"imgedit-crop-height-<?php echo $post_id; ?>\" onkeyup=\"imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)\" style=\"width:3em;\" />\n\t\t</span>\n\t</p>\n\n\t<p id=\"imgedit-crop-sel-<?php echo $post_id; ?>\">\n\t\t<?php _e('Selection:'); ?>\n\t\t<span  class=\"nowrap\">\n\t\t<input type=\"text\" id=\"imgedit-sel-width-<?php echo $post_id; ?>\" onkeyup=\"imageEdit.setNumSelection(<?php echo $post_id; ?>)\" style=\"width:4em;\" />\n\t\t&times;\n\t\t<input type=\"text\" id=\"imgedit-sel-height-<?php echo $post_id; ?>\" onkeyup=\"imageEdit.setNumSelection(<?php echo $post_id; ?>)\" style=\"width:4em;\" />\n\t\t</span>\n\t</p>\n\t</div>\n\n\t<?php if ( $thumb && $sub_sizes ) {\n\t\t$thumb_img = wp_constrain_dimensions( $thumb['width'], $thumb['height'], 160, 120 );\n\t?>\n\n\t<div class=\"imgedit-group imgedit-applyto\">\n\t<div class=\"imgedit-group-top\">\n\t\t<h2><?php _e( 'Thumbnail Settings' ); ?> <a href=\"#\" class=\"dashicons dashicons-editor-help imgedit-help-toggle\" onclick=\"imageEdit.toggleHelp(this);return false;\"></a></h2>\n\t\t<p class=\"imgedit-help\"><?php _e('You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.'); ?></p>\n\t</div>\n\n\t<p>\n\t\t<img src=\"<?php echo $thumb['url']; ?>\" width=\"<?php echo $thumb_img[0]; ?>\" height=\"<?php echo $thumb_img[1]; ?>\" class=\"imgedit-size-preview\" alt=\"\" draggable=\"false\" />\n\t\t<br /><?php _e('Current thumbnail'); ?>\n\t</p>\n\n\t<p id=\"imgedit-save-target-<?php echo $post_id; ?>\">\n\t\t<strong><?php _e('Apply changes to:'); ?></strong><br />\n\n\t\t<label class=\"imgedit-label\">\n\t\t<input type=\"radio\" name=\"imgedit-target-<?php echo $post_id; ?>\" value=\"all\" checked=\"checked\" />\n\t\t<?php _e('All image sizes'); ?></label>\n\n\t\t<label class=\"imgedit-label\">\n\t\t<input type=\"radio\" name=\"imgedit-target-<?php echo $post_id; ?>\" value=\"thumbnail\" />\n\t\t<?php _e('Thumbnail'); ?></label>\n\n\t\t<label class=\"imgedit-label\">\n\t\t<input type=\"radio\" name=\"imgedit-target-<?php echo $post_id; ?>\" value=\"nothumb\" />\n\t\t<?php _e('All sizes except thumbnail'); ?></label>\n\t</p>\n\t</div>\n\n\t<?php } ?>\n\n\t</div>\n\n\t<div class=\"imgedit-panel-content\">\n\t\t<?php echo $note; ?>\n\t\t<div class=\"imgedit-menu\">\n\t\t\t<div onclick=\"imageEdit.crop(<?php echo \"$post_id, '$nonce'\"; ?>, this)\" class=\"imgedit-crop disabled\" title=\"<?php esc_attr_e( 'Crop' ); ?>\"></div><?php\n\n\t\t// On some setups GD library does not provide imagerotate() - Ticket #11536\n\t\tif ( wp_image_editor_supports( array( 'mime_type' => get_post_mime_type( $post_id ), 'methods' => array( 'rotate' ) ) ) ) { ?>\n\t\t\t<div class=\"imgedit-rleft\"  onclick=\"imageEdit.rotate( 90, <?php echo \"$post_id, '$nonce'\"; ?>, this)\" title=\"<?php esc_attr_e( 'Rotate counter-clockwise' ); ?>\"></div>\n\t\t\t<div class=\"imgedit-rright\" onclick=\"imageEdit.rotate(-90, <?php echo \"$post_id, '$nonce'\"; ?>, this)\" title=\"<?php esc_attr_e( 'Rotate clockwise' ); ?>\"></div>\n\t<?php } else {\n\t\t\t$note_no_rotate = esc_attr__('Image rotation is not supported by your web host.');\n\t?>\n\t\t    <div class=\"imgedit-rleft disabled\"  title=\"<?php echo $note_no_rotate; ?>\"></div>\n\t\t    <div class=\"imgedit-rright disabled\" title=\"<?php echo $note_no_rotate; ?>\"></div>\n\t<?php } ?>\n\n\t\t\t<div onclick=\"imageEdit.flip(1, <?php echo \"$post_id, '$nonce'\"; ?>, this)\" class=\"imgedit-flipv\" title=\"<?php esc_attr_e( 'Flip vertically' ); ?>\"></div>\n\t\t\t<div onclick=\"imageEdit.flip(2, <?php echo \"$post_id, '$nonce'\"; ?>, this)\" class=\"imgedit-fliph\" title=\"<?php esc_attr_e( 'Flip horizontally' ); ?>\"></div>\n\n\t\t\t<div id=\"image-undo-<?php echo $post_id; ?>\" onclick=\"imageEdit.undo(<?php echo \"$post_id, '$nonce'\"; ?>, this)\" class=\"imgedit-undo disabled\" title=\"<?php esc_attr_e( 'Undo' ); ?>\"></div>\n\t\t\t<div id=\"image-redo-<?php echo $post_id; ?>\" onclick=\"imageEdit.redo(<?php echo \"$post_id, '$nonce'\"; ?>, this)\" class=\"imgedit-redo disabled\" title=\"<?php esc_attr_e( 'Redo' ); ?>\"></div>\n\t\t\t<br class=\"clear\" />\n\t\t</div>\n\n\t\t<input type=\"hidden\" id=\"imgedit-sizer-<?php echo $post_id; ?>\" value=\"<?php echo $sizer; ?>\" />\n\t\t<input type=\"hidden\" id=\"imgedit-history-<?php echo $post_id; ?>\" value=\"\" />\n\t\t<input type=\"hidden\" id=\"imgedit-undone-<?php echo $post_id; ?>\" value=\"0\" />\n\t\t<input type=\"hidden\" id=\"imgedit-selection-<?php echo $post_id; ?>\" value=\"\" />\n\t\t<input type=\"hidden\" id=\"imgedit-x-<?php echo $post_id; ?>\" value=\"<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>\" />\n\t\t<input type=\"hidden\" id=\"imgedit-y-<?php echo $post_id; ?>\" value=\"<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>\" />\n\n\t\t<div id=\"imgedit-crop-<?php echo $post_id; ?>\" class=\"imgedit-crop-wrap\">\n\t\t<img id=\"image-preview-<?php echo $post_id; ?>\" onload=\"imageEdit.imgLoaded('<?php echo $post_id; ?>')\" src=\"<?php echo admin_url( 'admin-ajax.php', 'relative' ); ?>?action=imgedit-preview&amp;_ajax_nonce=<?php echo $nonce; ?>&amp;postid=<?php echo $post_id; ?>&amp;rand=<?php echo rand(1, 99999); ?>\" alt=\"<?php esc_attr_e( 'Image preview' ); ?>\" />\n\t\t</div>\n\n\t\t<div class=\"imgedit-submit\">\n\t\t\t<input type=\"button\" onclick=\"imageEdit.close(<?php echo $post_id; ?>, 1)\" class=\"button\" value=\"<?php esc_attr_e( 'Cancel' ); ?>\" />\n\t\t\t<input type=\"button\" onclick=\"imageEdit.save(<?php echo \"$post_id, '$nonce'\"; ?>)\" disabled=\"disabled\" class=\"button button-primary imgedit-submit-btn\" value=\"<?php esc_attr_e( 'Save' ); ?>\" />\n\t\t</div>\n\t</div>\n\n\t</div>\n\t<div class=\"imgedit-wait\" id=\"imgedit-wait-<?php echo $post_id; ?>\"></div>\n\t<script type=\"text/javascript\">jQuery( function() { imageEdit.init(<?php echo $post_id; ?>); });</script>\n\t<div class=\"hidden\" id=\"imgedit-leaving-<?php echo $post_id; ?>\"><?php _e(\"There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor.\"); ?></div>\n\t</div>\n<?php\n}\n\n/**\n * Streams image in WP_Image_Editor to browser.\n * Provided for backcompat reasons\n *\n * @param WP_Image_Editor $image\n * @param string $mime_type\n * @param int $post_id\n * @return bool\n */\nfunction wp_stream_image( $image, $mime_type, $post_id ) {\n\tif ( $image instanceof WP_Image_Editor ) {\n\n\t\t/**\n\t\t * Filter the WP_Image_Editor instance for the image to be streamed to the browser.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param WP_Image_Editor $image   WP_Image_Editor instance.\n\t\t * @param int             $post_id Post ID.\n\t\t */\n\t\t$image = apply_filters( 'image_editor_save_pre', $image, $post_id );\n\n\t\tif ( is_wp_error( $image->stream( $mime_type ) ) )\n\t\t\treturn false;\n\n\t\treturn true;\n\t} else {\n\t\t_deprecated_argument( __FUNCTION__, '3.5', __( '$image needs to be an WP_Image_Editor object' ) );\n\n\t\t/**\n\t\t * Filter the GD image resource to be streamed to the browser.\n\t\t *\n\t\t * @since 2.9.0\n\t\t * @deprecated 3.5.0 Use image_editor_save_pre instead.\n\t\t *\n\t\t * @param resource $image   Image resource to be streamed.\n\t\t * @param int      $post_id Post ID.\n\t\t */\n\t\t$image = apply_filters( 'image_save_pre', $image, $post_id );\n\n\t\tswitch ( $mime_type ) {\n\t\t\tcase 'image/jpeg':\n\t\t\t\theader( 'Content-Type: image/jpeg' );\n\t\t\t\treturn imagejpeg( $image, null, 90 );\n\t\t\tcase 'image/png':\n\t\t\t\theader( 'Content-Type: image/png' );\n\t\t\t\treturn imagepng( $image );\n\t\t\tcase 'image/gif':\n\t\t\t\theader( 'Content-Type: image/gif' );\n\t\t\t\treturn imagegif( $image );\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n}\n\n/**\n * Saves Image to File\n *\n * @param string $filename\n * @param WP_Image_Editor $image\n * @param string $mime_type\n * @param int $post_id\n * @return bool\n */\nfunction wp_save_image_file( $filename, $image, $mime_type, $post_id ) {\n\tif ( $image instanceof WP_Image_Editor ) {\n\n\t\t/** This filter is documented in wp-admin/includes/image-edit.php */\n\t\t$image = apply_filters( 'image_editor_save_pre', $image, $post_id );\n\n\t\t/**\n\t\t * Filter whether to skip saving the image file.\n\t\t *\n\t\t * Returning a non-null value will short-circuit the save method,\n\t\t * returning that value instead.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param mixed           $override  Value to return instead of saving. Default null.\n\t\t * @param string          $filename  Name of the file to be saved.\n\t\t * @param WP_Image_Editor $image     WP_Image_Editor instance.\n\t\t * @param string          $mime_type Image mime type.\n\t\t * @param int             $post_id   Post ID.\n\t\t */\n\t\t$saved = apply_filters( 'wp_save_image_editor_file', null, $filename, $image, $mime_type, $post_id );\n\n\t\tif ( null !== $saved )\n\t\t\treturn $saved;\n\n\t\treturn $image->save( $filename, $mime_type );\n\t} else {\n\t\t_deprecated_argument( __FUNCTION__, '3.5', __( '$image needs to be an WP_Image_Editor object' ) );\n\n\t\t/** This filter is documented in wp-admin/includes/image-edit.php */\n\t\t$image = apply_filters( 'image_save_pre', $image, $post_id );\n\n\t\t/**\n\t\t * Filter whether to skip saving the image file.\n\t\t *\n\t\t * Returning a non-null value will short-circuit the save method,\n\t\t * returning that value instead.\n\t\t *\n\t\t * @since 2.9.0\n\t\t * @deprecated 3.5.0 Use wp_save_image_editor_file instead.\n\t\t *\n\t\t * @param mixed           $override  Value to return instead of saving. Default null.\n\t\t * @param string          $filename  Name of the file to be saved.\n\t\t * @param WP_Image_Editor $image     WP_Image_Editor instance.\n\t\t * @param string          $mime_type Image mime type.\n\t\t * @param int             $post_id   Post ID.\n\t\t */\n\t\t$saved = apply_filters( 'wp_save_image_file', null, $filename, $image, $mime_type, $post_id );\n\n\t\tif ( null !== $saved )\n\t\t\treturn $saved;\n\n\t\tswitch ( $mime_type ) {\n\t\t\tcase 'image/jpeg':\n\n\t\t\t\t/** This filter is documented in wp-includes/class-wp-image-editor.php */\n\t\t\t\treturn imagejpeg( $image, $filename, apply_filters( 'jpeg_quality', 90, 'edit_image' ) );\n\t\t\tcase 'image/png':\n\t\t\t\treturn imagepng( $image, $filename );\n\t\t\tcase 'image/gif':\n\t\t\t\treturn imagegif( $image, $filename );\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n}\n\n/**\n * Image preview ratio. Internal use only.\n *\n * @since 2.9.0\n *\n * @ignore\n * @param int $w Image width in pixels.\n * @param int $h Image height in pixels.\n * @return float|int Image preview ratio.\n */\nfunction _image_get_preview_ratio($w, $h) {\n\t$max = max($w, $h);\n\treturn $max > 400 ? (400 / $max) : 1;\n}\n\n/**\n * Returns an image resource. Internal use only.\n *\n * @since 2.9.0\n *\n * @ignore\n * @param resource  $img   Image resource.\n * @param float|int $angle Image rotation angle, in degrees.\n * @return resource|false GD image resource, false otherwise.\n */\nfunction _rotate_image_resource($img, $angle) {\n\t_deprecated_function( __FUNCTION__, '3.5', __( 'Use WP_Image_Editor::rotate' ) );\n\tif ( function_exists('imagerotate') ) {\n\t\t$rotated = imagerotate($img, $angle, 0);\n\t\tif ( is_resource($rotated) ) {\n\t\t\timagedestroy($img);\n\t\t\t$img = $rotated;\n\t\t}\n\t}\n\treturn $img;\n}\n\n/**\n * Flips an image resource. Internal use only.\n *\n * @since 2.9.0\n *\n * @ignore\n * @param resource $img  Image resource.\n * @param bool     $horz Whether to flip horizontally.\n * @param bool     $vert Whether to flip vertically.\n * @return resource (maybe) flipped image resource.\n */\nfunction _flip_image_resource($img, $horz, $vert) {\n\t_deprecated_function( __FUNCTION__, '3.5', __( 'Use WP_Image_Editor::flip' ) );\n\t$w = imagesx($img);\n\t$h = imagesy($img);\n\t$dst = wp_imagecreatetruecolor($w, $h);\n\tif ( is_resource($dst) ) {\n\t\t$sx = $vert ? ($w - 1) : 0;\n\t\t$sy = $horz ? ($h - 1) : 0;\n\t\t$sw = $vert ? -$w : $w;\n\t\t$sh = $horz ? -$h : $h;\n\n\t\tif ( imagecopyresampled($dst, $img, 0, 0, $sx, $sy, $w, $h, $sw, $sh) ) {\n\t\t\timagedestroy($img);\n\t\t\t$img = $dst;\n\t\t}\n\t}\n\treturn $img;\n}\n\n/**\n * Crops an image resource. Internal use only.\n *\n * @since 2.9.0\n *\n * @ignore\n * @param resource $img Image resource.\n * @param float    $x   Source point x-coordinate.\n * @param float    $y   Source point y-cooredinate.\n * @param float    $w   Source width.\n * @param float    $h   Source height.\n * @return resource (maybe) cropped image resource.\n */\nfunction _crop_image_resource($img, $x, $y, $w, $h) {\n\t$dst = wp_imagecreatetruecolor($w, $h);\n\tif ( is_resource($dst) ) {\n\t\tif ( imagecopy($dst, $img, 0, 0, $x, $y, $w, $h) ) {\n\t\t\timagedestroy($img);\n\t\t\t$img = $dst;\n\t\t}\n\t}\n\treturn $img;\n}\n\n/**\n * Performs group of changes on Editor specified.\n *\n * @since 2.9.0\n *\n * @param WP_Image_Editor $image   {@see WP_Image_Editor} instance.\n * @param array           $changes Array of change operations.\n * @return WP_Image_Editor {@see WP_Image_Editor} instance with changes applied.\n */\nfunction image_edit_apply_changes( $image, $changes ) {\n\tif ( is_resource( $image ) )\n\t\t_deprecated_argument( __FUNCTION__, '3.5', __( '$image needs to be an WP_Image_Editor object' ) );\n\n\tif ( !is_array($changes) )\n\t\treturn $image;\n\n\t// Expand change operations.\n\tforeach ( $changes as $key => $obj ) {\n\t\tif ( isset($obj->r) ) {\n\t\t\t$obj->type = 'rotate';\n\t\t\t$obj->angle = $obj->r;\n\t\t\tunset($obj->r);\n\t\t} elseif ( isset($obj->f) ) {\n\t\t\t$obj->type = 'flip';\n\t\t\t$obj->axis = $obj->f;\n\t\t\tunset($obj->f);\n\t\t} elseif ( isset($obj->c) ) {\n\t\t\t$obj->type = 'crop';\n\t\t\t$obj->sel = $obj->c;\n\t\t\tunset($obj->c);\n\t\t}\n\t\t$changes[$key] = $obj;\n\t}\n\n\t// Combine operations.\n\tif ( count($changes) > 1 ) {\n\t\t$filtered = array($changes[0]);\n\t\tfor ( $i = 0, $j = 1, $c = count( $changes ); $j < $c; $j++ ) {\n\t\t\t$combined = false;\n\t\t\tif ( $filtered[$i]->type == $changes[$j]->type ) {\n\t\t\t\tswitch ( $filtered[$i]->type ) {\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\t$filtered[$i]->angle += $changes[$j]->angle;\n\t\t\t\t\t\t$combined = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'flip':\n\t\t\t\t\t\t$filtered[$i]->axis ^= $changes[$j]->axis;\n\t\t\t\t\t\t$combined = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !$combined )\n\t\t\t\t$filtered[++$i] = $changes[$j];\n\t\t}\n\t\t$changes = $filtered;\n\t\tunset($filtered);\n\t}\n\n\t// Image resource before applying the changes.\n\tif ( $image instanceof WP_Image_Editor ) {\n\n\t\t/**\n\t\t * Filter the WP_Image_Editor instance before applying changes to the image.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param WP_Image_Editor $image   WP_Image_Editor instance.\n \t\t * @param array           $changes Array of change operations.\n\t\t */\n\t\t$image = apply_filters( 'wp_image_editor_before_change', $image, $changes );\n\t} elseif ( is_resource( $image ) ) {\n\n\t\t/**\n\t\t * Filter the GD image resource before applying changes to the image.\n\t\t *\n\t\t * @since 2.9.0\n\t\t * @deprecated 3.5.0 Use wp_image_editor_before_change instead.\n\t\t *\n\t\t * @param resource $image   GD image resource.\n \t\t * @param array    $changes Array of change operations.\n\t\t */\n\t\t$image = apply_filters( 'image_edit_before_change', $image, $changes );\n\t}\n\n\tforeach ( $changes as $operation ) {\n\t\tswitch ( $operation->type ) {\n\t\t\tcase 'rotate':\n\t\t\t\tif ( $operation->angle != 0 ) {\n\t\t\t\t\tif ( $image instanceof WP_Image_Editor )\n\t\t\t\t\t\t$image->rotate( $operation->angle );\n\t\t\t\t\telse\n\t\t\t\t\t\t$image = _rotate_image_resource( $image, $operation->angle );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'flip':\n\t\t\t\tif ( $operation->axis != 0 )\n\t\t\t\t\tif ( $image instanceof WP_Image_Editor )\n\t\t\t\t\t\t$image->flip( ($operation->axis & 1) != 0, ($operation->axis & 2) != 0 );\n\t\t\t\t\telse\n\t\t\t\t\t\t$image = _flip_image_resource( $image, ( $operation->axis & 1 ) != 0, ( $operation->axis & 2 ) != 0 );\n\t\t\t\tbreak;\n\t\t\tcase 'crop':\n\t\t\t\t$sel = $operation->sel;\n\n\t\t\t\tif ( $image instanceof WP_Image_Editor ) {\n\t\t\t\t\t$size = $image->get_size();\n\t\t\t\t\t$w = $size['width'];\n\t\t\t\t\t$h = $size['height'];\n\n\t\t\t\t\t$scale = 1 / _image_get_preview_ratio( $w, $h ); // discard preview scaling\n\t\t\t\t\t$image->crop( $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale );\n\t\t\t\t} else {\n\t\t\t\t\t$scale = 1 / _image_get_preview_ratio( imagesx( $image ), imagesy( $image ) ); // discard preview scaling\n\t\t\t\t\t$image = _crop_image_resource( $image, $sel->x * $scale, $sel->y * $scale, $sel->w * $scale, $sel->h * $scale );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn $image;\n}\n\n\n/**\n * Streams image in post to browser, along with enqueued changes\n * in $_REQUEST['history']\n *\n * @param int $post_id\n * @return bool\n */\nfunction stream_preview_image( $post_id ) {\n\t$post = get_post( $post_id );\n\n\t/** This filter is documented in wp-admin/admin.php */\n\t@ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );\n\n\t$img = wp_get_image_editor( _load_image_to_edit_path( $post_id ) );\n\n    if ( is_wp_error( $img ) )\n        return false;\n\n\t$changes = !empty($_REQUEST['history']) ? json_decode( wp_unslash($_REQUEST['history']) ) : null;\n\tif ( $changes )\n\t\t$img = image_edit_apply_changes( $img, $changes );\n\n\t// Scale the image.\n\t$size = $img->get_size();\n\t$w = $size['width'];\n\t$h = $size['height'];\n\n\t$ratio = _image_get_preview_ratio( $w, $h );\n\t$w2 = max ( 1, $w * $ratio );\n\t$h2 = max ( 1, $h * $ratio );\n\n\tif ( is_wp_error( $img->resize( $w2, $h2 ) ) )\n\t\treturn false;\n\n\treturn wp_stream_image( $img, $post->post_mime_type, $post_id );\n}\n\n/**\n * Restores the metadata for a given attachment.\n *\n * @since 2.9.0\n *\n * @param int $post_id Attachment post ID.\n * @return stdClass Image restoration message object.\n */\nfunction wp_restore_image($post_id) {\n\t$meta = wp_get_attachment_metadata($post_id);\n\t$file = get_attached_file($post_id);\n\t$backup_sizes = $old_backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );\n\t$restored = false;\n\t$msg = new stdClass;\n\n\tif ( !is_array($backup_sizes) ) {\n\t\t$msg->error = __('Cannot load image metadata.');\n\t\treturn $msg;\n\t}\n\n\t$parts = pathinfo($file);\n\t$suffix = time() . rand(100, 999);\n\t$default_sizes = get_intermediate_image_sizes();\n\n\tif ( isset($backup_sizes['full-orig']) && is_array($backup_sizes['full-orig']) ) {\n\t\t$data = $backup_sizes['full-orig'];\n\n\t\tif ( $parts['basename'] != $data['file'] ) {\n\t\t\tif ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) {\n\n\t\t\t\t// Delete only if it's an edited image.\n\t\t\t\tif ( preg_match('/-e[0-9]{13}\\./', $parts['basename']) ) {\n\t\t\t\t\twp_delete_file( $file );\n\t\t\t\t}\n\t\t\t} elseif ( isset( $meta['width'], $meta['height'] ) ) {\n\t\t\t\t$backup_sizes[\"full-$suffix\"] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $parts['basename']);\n\t\t\t}\n\t\t}\n\n\t\t$restored_file = path_join($parts['dirname'], $data['file']);\n\t\t$restored = update_attached_file($post_id, $restored_file);\n\n\t\t$meta['file'] = _wp_relative_upload_path( $restored_file );\n\t\t$meta['width'] = $data['width'];\n\t\t$meta['height'] = $data['height'];\n\t}\n\n\tforeach ( $default_sizes as $default_size ) {\n\t\tif ( isset($backup_sizes[\"$default_size-orig\"]) ) {\n\t\t\t$data = $backup_sizes[\"$default_size-orig\"];\n\t\t\tif ( isset($meta['sizes'][$default_size]) && $meta['sizes'][$default_size]['file'] != $data['file'] ) {\n\t\t\t\tif ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ) {\n\n\t\t\t\t\t// Delete only if it's an edited image.\n\t\t\t\t\tif ( preg_match('/-e[0-9]{13}-/', $meta['sizes'][$default_size]['file']) ) {\n\t\t\t\t\t\t$delete_file = path_join( $parts['dirname'], $meta['sizes'][$default_size]['file'] );\n\t\t\t\t\t\twp_delete_file( $delete_file );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$backup_sizes[\"$default_size-{$suffix}\"] = $meta['sizes'][$default_size];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$meta['sizes'][$default_size] = $data;\n\t\t} else {\n\t\t\tunset($meta['sizes'][$default_size]);\n\t\t}\n\t}\n\n\tif ( ! wp_update_attachment_metadata( $post_id, $meta ) ||\n\t\t( $old_backup_sizes !== $backup_sizes && ! update_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes ) ) ) {\n\n\t\t$msg->error = __('Cannot save image metadata.');\n\t\treturn $msg;\n\t}\n\n\tif ( !$restored )\n\t\t$msg->error = __('Image metadata is inconsistent.');\n\telse\n\t\t$msg->msg = __('Image restored successfully.');\n\n\treturn $msg;\n}\n\n/**\n * Saves image to post along with enqueued changes\n * in $_REQUEST['history']\n *\n * @global array $_wp_additional_image_sizes\n *\n * @param int $post_id\n * @return \\stdClass\n */\nfunction wp_save_image( $post_id ) {\n\tglobal $_wp_additional_image_sizes;\n\n\t$return = new stdClass;\n\t$success = $delete = $scaled = $nocrop = false;\n\t$post = get_post( $post_id );\n\n\t$img = wp_get_image_editor( _load_image_to_edit_path( $post_id, 'full' ) );\n\tif ( is_wp_error( $img ) ) {\n\t\t$return->error = esc_js( __('Unable to create new image.') );\n\t\treturn $return;\n\t}\n\n\t$fwidth = !empty($_REQUEST['fwidth']) ? intval($_REQUEST['fwidth']) : 0;\n\t$fheight = !empty($_REQUEST['fheight']) ? intval($_REQUEST['fheight']) : 0;\n\t$target = !empty($_REQUEST['target']) ? preg_replace('/[^a-z0-9_-]+/i', '', $_REQUEST['target']) : '';\n\t$scale = !empty($_REQUEST['do']) && 'scale' == $_REQUEST['do'];\n\n\tif ( $scale && $fwidth > 0 && $fheight > 0 ) {\n\t\t$size = $img->get_size();\n\t\t$sX = $size['width'];\n\t\t$sY = $size['height'];\n\n\t\t// Check if it has roughly the same w / h ratio.\n\t\t$diff = round($sX / $sY, 2) - round($fwidth / $fheight, 2);\n\t\tif ( -0.1 < $diff && $diff < 0.1 ) {\n\t\t\t// Scale the full size image.\n\t\t\tif ( $img->resize( $fwidth, $fheight ) )\n\t\t\t\t$scaled = true;\n\t\t}\n\n\t\tif ( !$scaled ) {\n\t\t\t$return->error = esc_js( __('Error while saving the scaled image. Please reload the page and try again.') );\n\t\t\treturn $return;\n\t\t}\n\t} elseif ( !empty($_REQUEST['history']) ) {\n\t\t$changes = json_decode( wp_unslash($_REQUEST['history']) );\n\t\tif ( $changes )\n\t\t\t$img = image_edit_apply_changes($img, $changes);\n\t} else {\n\t\t$return->error = esc_js( __('Nothing to save, the image has not changed.') );\n\t\treturn $return;\n\t}\n\n\t$meta = wp_get_attachment_metadata($post_id);\n\t$backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true );\n\n\tif ( !is_array($meta) ) {\n\t\t$return->error = esc_js( __('Image data does not exist. Please re-upload the image.') );\n\t\treturn $return;\n\t}\n\n\tif ( !is_array($backup_sizes) )\n\t\t$backup_sizes = array();\n\n\t// Generate new filename.\n\t$path = get_attached_file($post_id);\n\t$path_parts = pathinfo( $path );\n\t$filename = $path_parts['filename'];\n\t$suffix = time() . rand(100, 999);\n\n\tif ( defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE &&\n\t\tisset($backup_sizes['full-orig']) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] ) {\n\n\t\tif ( 'thumbnail' == $target )\n\t\t\t$new_path = \"{$path_parts['dirname']}/{$filename}-temp.{$path_parts['extension']}\";\n\t\telse\n\t\t\t$new_path = $path;\n\t} else {\n\t\twhile( true ) {\n\t\t\t$filename = preg_replace( '/-e([0-9]+)$/', '', $filename );\n\t\t\t$filename .= \"-e{$suffix}\";\n\t\t\t$new_filename = \"{$filename}.{$path_parts['extension']}\";\n\t\t\t$new_path = \"{$path_parts['dirname']}/$new_filename\";\n\t\t\tif ( file_exists($new_path) )\n\t\t\t\t$suffix++;\n\t\t\telse\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Save the full-size file, also needed to create sub-sizes.\n\tif ( !wp_save_image_file($new_path, $img, $post->post_mime_type, $post_id) ) {\n\t\t$return->error = esc_js( __('Unable to save the image.') );\n\t\treturn $return;\n\t}\n\n\tif ( 'nothumb' == $target || 'all' == $target || 'full' == $target || $scaled ) {\n\t\t$tag = false;\n\t\tif ( isset($backup_sizes['full-orig']) ) {\n\t\t\tif ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes['full-orig']['file'] != $path_parts['basename'] )\n\t\t\t\t$tag = \"full-$suffix\";\n\t\t} else {\n\t\t\t$tag = 'full-orig';\n\t\t}\n\n\t\tif ( $tag )\n\t\t\t$backup_sizes[$tag] = array('width' => $meta['width'], 'height' => $meta['height'], 'file' => $path_parts['basename']);\n\n\t\t$success = ( $path === $new_path ) || update_attached_file( $post_id, $new_path );\n\n\t\t$meta['file'] = _wp_relative_upload_path( $new_path );\n\n\t\t$size = $img->get_size();\n\t\t$meta['width'] = $size['width'];\n\t\t$meta['height'] = $size['height'];\n\n\t\tif ( $success && ('nothumb' == $target || 'all' == $target) ) {\n\t\t\t$sizes = get_intermediate_image_sizes();\n\t\t\tif ( 'nothumb' == $target )\n\t\t\t\t$sizes = array_diff( $sizes, array('thumbnail') );\n\t\t}\n\n\t\t$return->fw = $meta['width'];\n\t\t$return->fh = $meta['height'];\n\t} elseif ( 'thumbnail' == $target ) {\n\t\t$sizes = array( 'thumbnail' );\n\t\t$success = $delete = $nocrop = true;\n\t}\n\n\tif ( isset( $sizes ) ) {\n\t\t$_sizes = array();\n\n\t\tforeach ( $sizes as $size ) {\n\t\t\t$tag = false;\n\t\t\tif ( isset( $meta['sizes'][$size] ) ) {\n\t\t\t\tif ( isset($backup_sizes[\"$size-orig\"]) ) {\n\t\t\t\t\tif ( ( !defined('IMAGE_EDIT_OVERWRITE') || !IMAGE_EDIT_OVERWRITE ) && $backup_sizes[\"$size-orig\"]['file'] != $meta['sizes'][$size]['file'] )\n\t\t\t\t\t\t$tag = \"$size-$suffix\";\n\t\t\t\t} else {\n\t\t\t\t\t$tag = \"$size-orig\";\n\t\t\t\t}\n\n\t\t\t\tif ( $tag )\n\t\t\t\t\t$backup_sizes[$tag] = $meta['sizes'][$size];\n\t\t\t}\n\n\t\t\tif ( isset( $_wp_additional_image_sizes[ $size ] ) ) {\n\t\t\t\t$width  = intval( $_wp_additional_image_sizes[ $size ]['width'] );\n\t\t\t\t$height = intval( $_wp_additional_image_sizes[ $size ]['height'] );\n\t\t\t\t$crop   = ( $nocrop ) ? false : $_wp_additional_image_sizes[ $size ]['crop'];\n\t\t\t} else {\n\t\t\t\t$height = get_option( \"{$size}_size_h\" );\n\t\t\t\t$width  = get_option( \"{$size}_size_w\" );\n\t\t\t\t$crop   = ( $nocrop ) ? false : get_option( \"{$size}_crop\" );\n\t\t\t}\n\n\t\t\t$_sizes[ $size ] = array( 'width' => $width, 'height' => $height, 'crop' => $crop );\n\t\t}\n\n\t\t$meta['sizes'] = array_merge( $meta['sizes'], $img->multi_resize( $_sizes ) );\n\t}\n\n\tunset( $img );\n\n\tif ( $success ) {\n\t\twp_update_attachment_metadata( $post_id, $meta );\n\t\tupdate_post_meta( $post_id, '_wp_attachment_backup_sizes', $backup_sizes);\n\n\t\tif ( $target == 'thumbnail' || $target == 'all' || $target == 'full' ) {\n\t\t\t// Check if it's an image edit from attachment edit screen\n\t\t\tif ( ! empty( $_REQUEST['context'] ) && 'edit-attachment' == $_REQUEST['context'] ) {\n\t\t\t\t$thumb_url = wp_get_attachment_image_src( $post_id, array( 900, 600 ), true );\n\t\t\t\t$return->thumbnail = $thumb_url[0];\n\t\t\t} else {\n\t\t\t\t$file_url = wp_get_attachment_url($post_id);\n\t\t\t\tif ( ! empty( $meta['sizes']['thumbnail'] ) && $thumb = $meta['sizes']['thumbnail'] ) {\n\t\t\t\t\t$return->thumbnail = path_join( dirname($file_url), $thumb['file'] );\n\t\t\t\t} else {\n\t\t\t\t\t$return->thumbnail = \"$file_url?w=128&h=128\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t$delete = true;\n\t}\n\n\tif ( $delete ) {\n\t\twp_delete_file( $new_path );\n\t}\n\n\t$return->msg = esc_js( __('Image saved') );\n\treturn $return;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/image.php",
    "content": "<?php\n/**\n * File contains all the administration image manipulation functions.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Crop an Image to a given size.\n *\n * @since 2.1.0\n *\n * @param string|int $src The source file or Attachment ID.\n * @param int $src_x The start x position to crop from.\n * @param int $src_y The start y position to crop from.\n * @param int $src_w The width to crop.\n * @param int $src_h The height to crop.\n * @param int $dst_w The destination width.\n * @param int $dst_h The destination height.\n * @param int $src_abs Optional. If the source crop points are absolute.\n * @param string $dst_file Optional. The destination file to write to.\n * @return string|WP_Error New filepath on success, WP_Error on failure.\n */\nfunction wp_crop_image( $src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false ) {\n\t$src_file = $src;\n\tif ( is_numeric( $src ) ) { // Handle int as attachment ID\n\t\t$src_file = get_attached_file( $src );\n\n\t\tif ( ! file_exists( $src_file ) ) {\n\t\t\t// If the file doesn't exist, attempt a url fopen on the src link.\n\t\t\t// This can occur with certain file replication plugins.\n\t\t\t$src = _load_image_to_edit_path( $src, 'full' );\n\t\t} else {\n\t\t\t$src = $src_file;\n\t\t}\n\t}\n\n\t$editor = wp_get_image_editor( $src );\n\tif ( is_wp_error( $editor ) )\n\t\treturn $editor;\n\n\t$src = $editor->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs );\n\tif ( is_wp_error( $src ) )\n\t\treturn $src;\n\n\tif ( ! $dst_file )\n\t\t$dst_file = str_replace( basename( $src_file ), 'cropped-' . basename( $src_file ), $src_file );\n\n\t/*\n\t * The directory containing the original file may no longer exist when\n\t * using a replication plugin.\n\t */\n\twp_mkdir_p( dirname( $dst_file ) );\n\n\t$dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), basename( $dst_file ) );\n\n\t$result = $editor->save( $dst_file );\n\tif ( is_wp_error( $result ) )\n\t\treturn $result;\n\n\treturn $dst_file;\n}\n\n/**\n * Generate post thumbnail attachment meta data.\n *\n * @since 2.1.0\n *\n * @global array $_wp_additional_image_sizes\n *\n * @param int $attachment_id Attachment Id to process.\n * @param string $file Filepath of the Attached image.\n * @return mixed Metadata for attachment.\n */\nfunction wp_generate_attachment_metadata( $attachment_id, $file ) {\n\t$attachment = get_post( $attachment_id );\n\n\t$metadata = array();\n\t$support = false;\n\tif ( preg_match('!^image/!', get_post_mime_type( $attachment )) && file_is_displayable_image($file) ) {\n\t\t$imagesize = getimagesize( $file );\n\t\t$metadata['width'] = $imagesize[0];\n\t\t$metadata['height'] = $imagesize[1];\n\n\t\t// Make the file path relative to the upload dir.\n\t\t$metadata['file'] = _wp_relative_upload_path($file);\n\n\t\t// Make thumbnails and other intermediate sizes.\n\t\tglobal $_wp_additional_image_sizes;\n\n\t\t$sizes = array();\n\t\tforeach ( get_intermediate_image_sizes() as $s ) {\n\t\t\t$sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => false );\n\t\t\tif ( isset( $_wp_additional_image_sizes[$s]['width'] ) )\n\t\t\t\t$sizes[$s]['width'] = intval( $_wp_additional_image_sizes[$s]['width'] ); // For theme-added sizes\n\t\t\telse\n\t\t\t\t$sizes[$s]['width'] = get_option( \"{$s}_size_w\" ); // For default sizes set in options\n\t\t\tif ( isset( $_wp_additional_image_sizes[$s]['height'] ) )\n\t\t\t\t$sizes[$s]['height'] = intval( $_wp_additional_image_sizes[$s]['height'] ); // For theme-added sizes\n\t\t\telse\n\t\t\t\t$sizes[$s]['height'] = get_option( \"{$s}_size_h\" ); // For default sizes set in options\n\t\t\tif ( isset( $_wp_additional_image_sizes[$s]['crop'] ) )\n\t\t\t\t$sizes[$s]['crop'] = $_wp_additional_image_sizes[$s]['crop']; // For theme-added sizes\n\t\t\telse\n\t\t\t\t$sizes[$s]['crop'] = get_option( \"{$s}_crop\" ); // For default sizes set in options\n\t\t}\n\n\t\t/**\n\t\t * Filter the image sizes automatically generated when uploading an image.\n\t\t *\n\t\t * @since 2.9.0\n\t\t * @since 4.4.0 The `$metadata` argument was addeed\n\t\t *\n\t\t * @param array $sizes    An associative array of image sizes.\n\t\t * @param array $metadata An associative array of image metadata: width, height, file.\n\t\t */\n\t\t$sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes, $metadata );\n\n\t\tif ( $sizes ) {\n\t\t\t$editor = wp_get_image_editor( $file );\n\n\t\t\tif ( ! is_wp_error( $editor ) )\n\t\t\t\t$metadata['sizes'] = $editor->multi_resize( $sizes );\n\t\t} else {\n\t\t\t$metadata['sizes'] = array();\n\t\t}\n\n\t\t// Fetch additional metadata from EXIF/IPTC.\n\t\t$image_meta = wp_read_image_metadata( $file );\n\t\tif ( $image_meta )\n\t\t\t$metadata['image_meta'] = $image_meta;\n\n\t} elseif ( wp_attachment_is( 'video', $attachment ) ) {\n\t\t$metadata = wp_read_video_metadata( $file );\n\t\t$support = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' );\n\t} elseif ( wp_attachment_is( 'audio', $attachment ) ) {\n\t\t$metadata = wp_read_audio_metadata( $file );\n\t\t$support = current_theme_supports( 'post-thumbnails', 'attachment:audio' ) || post_type_supports( 'attachment:audio', 'thumbnail' );\n\t}\n\n\tif ( $support && ! empty( $metadata['image']['data'] ) ) {\n\t\t// Check for existing cover.\n\t\t$hash = md5( $metadata['image']['data'] );\n\t\t$posts = get_posts( array(\n\t\t\t'fields' => 'ids',\n\t\t\t'post_type' => 'attachment',\n\t\t\t'post_mime_type' => $metadata['image']['mime'],\n\t\t\t'post_status' => 'inherit',\n\t\t\t'posts_per_page' => 1,\n\t\t\t'meta_key' => '_cover_hash',\n\t\t\t'meta_value' => $hash\n\t\t) );\n\t\t$exists = reset( $posts );\n\n\t\tif ( ! empty( $exists ) ) {\n\t\t\tupdate_post_meta( $attachment_id, '_thumbnail_id', $exists );\n\t\t} else {\n\t\t\t$ext = '.jpg';\n\t\t\tswitch ( $metadata['image']['mime'] ) {\n\t\t\tcase 'image/gif':\n\t\t\t\t$ext = '.gif';\n\t\t\t\tbreak;\n\t\t\tcase 'image/png':\n\t\t\t\t$ext = '.png';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$basename = str_replace( '.', '-', basename( $file ) ) . '-image' . $ext;\n\t\t\t$uploaded = wp_upload_bits( $basename, '', $metadata['image']['data'] );\n\t\t\tif ( false === $uploaded['error'] ) {\n\t\t\t\t$image_attachment = array(\n\t\t\t\t\t'post_mime_type' => $metadata['image']['mime'],\n\t\t\t\t\t'post_type' => 'attachment',\n\t\t\t\t\t'post_content' => '',\n\t\t\t\t);\n\t\t\t\t/**\n\t\t\t\t * Filter the parameters for the attachment thumbnail creation.\n\t\t\t\t *\n\t\t\t\t * @since 3.9.0\n\t\t\t\t *\n\t\t\t\t * @param array $image_attachment An array of parameters to create the thumbnail.\n\t\t\t\t * @param array $metadata         Current attachment metadata.\n\t\t\t\t * @param array $uploaded         An array containing the thumbnail path and url.\n\t\t\t\t */\n\t\t\t\t$image_attachment = apply_filters( 'attachment_thumbnail_args', $image_attachment, $metadata, $uploaded );\n\n\t\t\t\t$sub_attachment_id = wp_insert_attachment( $image_attachment, $uploaded['file'] );\n\t\t\t\tadd_post_meta( $sub_attachment_id, '_cover_hash', $hash );\n\t\t\t\t$attach_data = wp_generate_attachment_metadata( $sub_attachment_id, $uploaded['file'] );\n\t\t\t\twp_update_attachment_metadata( $sub_attachment_id, $attach_data );\n\t\t\t\tupdate_post_meta( $attachment_id, '_thumbnail_id', $sub_attachment_id );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove the blob of binary data from the array.\n\tif ( $metadata ) {\n\t\tunset( $metadata['image']['data'] );\n\t}\n\n\t/**\n\t * Filter the generated attachment meta data.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array $metadata      An array of attachment meta data.\n\t * @param int   $attachment_id Current attachment ID.\n\t */\n\treturn apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id );\n}\n\n/**\n * Convert a fraction string to a decimal.\n *\n * @since 2.5.0\n *\n * @param string $str\n * @return int|float\n */\nfunction wp_exif_frac2dec($str) {\n\t@list( $n, $d ) = explode( '/', $str );\n\tif ( !empty($d) )\n\t\treturn $n / $d;\n\treturn $str;\n}\n\n/**\n * Convert the exif date format to a unix timestamp.\n *\n * @since 2.5.0\n *\n * @param string $str\n * @return int\n */\nfunction wp_exif_date2ts($str) {\n\t@list( $date, $time ) = explode( ' ', trim($str) );\n\t@list( $y, $m, $d ) = explode( ':', $date );\n\n\treturn strtotime( \"{$y}-{$m}-{$d} {$time}\" );\n}\n\n/**\n * Get extended image metadata, exif or iptc as available.\n *\n * Retrieves the EXIF metadata aperture, credit, camera, caption, copyright, iso\n * created_timestamp, focal_length, shutter_speed, and title.\n *\n * The IPTC metadata that is retrieved is APP13, credit, byline, created date\n * and time, caption, copyright, and title. Also includes FNumber, Model,\n * DateTimeDigitized, FocalLength, ISOSpeedRatings, and ExposureTime.\n *\n * @todo Try other exif libraries if available.\n * @since 2.5.0\n *\n * @param string $file\n * @return bool|array False on failure. Image metadata array on success.\n */\nfunction wp_read_image_metadata( $file ) {\n\tif ( ! file_exists( $file ) )\n\t\treturn false;\n\n\tlist( , , $sourceImageType ) = getimagesize( $file );\n\n\t/*\n\t * EXIF contains a bunch of data we'll probably never need formatted in ways\n\t * that are difficult to use. We'll normalize it and just extract the fields\n\t * that are likely to be useful. Fractions and numbers are converted to\n\t * floats, dates to unix timestamps, and everything else to strings.\n\t */\n\t$meta = array(\n\t\t'aperture' => 0,\n\t\t'credit' => '',\n\t\t'camera' => '',\n\t\t'caption' => '',\n\t\t'created_timestamp' => 0,\n\t\t'copyright' => '',\n\t\t'focal_length' => 0,\n\t\t'iso' => 0,\n\t\t'shutter_speed' => 0,\n\t\t'title' => '',\n\t\t'orientation' => 0,\n\t\t'keywords' => array(),\n\t);\n\n\t$iptc = array();\n\t/*\n\t * Read IPTC first, since it might contain data not available in exif such\n\t * as caption, description etc.\n\t */\n\tif ( is_callable( 'iptcparse' ) ) {\n\t\tgetimagesize( $file, $info );\n\n\t\tif ( ! empty( $info['APP13'] ) ) {\n\t\t\t$iptc = iptcparse( $info['APP13'] );\n\n\t\t\t// Headline, \"A brief synopsis of the caption.\"\n\t\t\tif ( ! empty( $iptc['2#105'][0] ) ) {\n\t\t\t\t$meta['title'] = trim( $iptc['2#105'][0] );\n\t\t\t/*\n\t\t\t * Title, \"Many use the Title field to store the filename of the image,\n\t\t\t * though the field may be used in many ways.\"\n\t\t\t */\n\t\t\t} elseif ( ! empty( $iptc['2#005'][0] ) ) {\n\t\t\t\t$meta['title'] = trim( $iptc['2#005'][0] );\n\t\t\t}\n\n\t\t\tif ( ! empty( $iptc['2#120'][0] ) ) { // description / legacy caption\n\t\t\t\t$caption = trim( $iptc['2#120'][0] );\n\n\t\t\t\tmbstring_binary_safe_encoding();\n\t\t\t\t$caption_length = strlen( $caption );\n\t\t\t\treset_mbstring_encoding();\n\n\t\t\t\tif ( empty( $meta['title'] ) && $caption_length < 80 ) {\n\t\t\t\t\t// Assume the title is stored in 2:120 if it's short.\n\t\t\t\t\t$meta['title'] = $caption;\n\t\t\t\t}\n\n\t\t\t\t$meta['caption'] = $caption;\n\t\t\t}\n\n\t\t\tif ( ! empty( $iptc['2#110'][0] ) ) // credit\n\t\t\t\t$meta['credit'] = trim( $iptc['2#110'][0] );\n\t\t\telseif ( ! empty( $iptc['2#080'][0] ) ) // creator / legacy byline\n\t\t\t\t$meta['credit'] = trim( $iptc['2#080'][0] );\n\n\t\t\tif ( ! empty( $iptc['2#055'][0] ) && ! empty( $iptc['2#060'][0] ) ) // created date and time\n\t\t\t\t$meta['created_timestamp'] = strtotime( $iptc['2#055'][0] . ' ' . $iptc['2#060'][0] );\n\n\t\t\tif ( ! empty( $iptc['2#116'][0] ) ) // copyright\n\t\t\t\t$meta['copyright'] = trim( $iptc['2#116'][0] );\n\n\t\t\tif ( ! empty( $iptc['2#025'][0] ) ) { // keywords array\n\t\t\t\t$meta['keywords'] = array_values( $iptc['2#025'] );\n\t\t\t}\n\t\t }\n\t}\n\n\t/**\n\t * Filter the image types to check for exif data.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array $image_types Image types to check for exif data.\n\t */\n\tif ( is_callable( 'exif_read_data' ) && in_array( $sourceImageType, apply_filters( 'wp_read_image_metadata_types', array( IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM ) ) ) ) {\n\t\t$exif = @exif_read_data( $file );\n\n\t\tif ( ! empty( $exif['ImageDescription'] ) ) {\n\t\t\tmbstring_binary_safe_encoding();\n\t\t\t$description_length = strlen( $exif['ImageDescription'] );\n\t\t\treset_mbstring_encoding();\n\n\t\t\tif ( empty( $meta['title'] ) && $description_length < 80 ) {\n\t\t\t\t// Assume the title is stored in ImageDescription\n\t\t\t\t$meta['title'] = trim( $exif['ImageDescription'] );\n\t\t\t}\n\n\t\t\tif ( empty( $meta['caption'] ) && ! empty( $exif['COMPUTED']['UserComment'] ) ) {\n\t\t\t\t$meta['caption'] = trim( $exif['COMPUTED']['UserComment'] );\n\t\t\t}\n\n\t\t\tif ( empty( $meta['caption'] ) ) {\n\t\t\t\t$meta['caption'] = trim( $exif['ImageDescription'] );\n\t\t\t}\n\t\t} elseif ( empty( $meta['caption'] ) && ! empty( $exif['Comments'] ) ) {\n\t\t\t$meta['caption'] = trim( $exif['Comments'] );\n\t\t}\n\n\t\tif ( empty( $meta['credit'] ) ) {\n\t\t\tif ( ! empty( $exif['Artist'] ) ) {\n\t\t\t\t$meta['credit'] = trim( $exif['Artist'] );\n\t\t\t} elseif ( ! empty($exif['Author'] ) ) {\n\t\t\t\t$meta['credit'] = trim( $exif['Author'] );\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $meta['copyright'] ) && ! empty( $exif['Copyright'] ) ) {\n\t\t\t$meta['copyright'] = trim( $exif['Copyright'] );\n\t\t}\n\t\tif ( ! empty( $exif['FNumber'] ) ) {\n\t\t\t$meta['aperture'] = round( wp_exif_frac2dec( $exif['FNumber'] ), 2 );\n\t\t}\n\t\tif ( ! empty( $exif['Model'] ) ) {\n\t\t\t$meta['camera'] = trim( $exif['Model'] );\n\t\t}\n\t\tif ( empty( $meta['created_timestamp'] ) && ! empty( $exif['DateTimeDigitized'] ) ) {\n\t\t\t$meta['created_timestamp'] = wp_exif_date2ts( $exif['DateTimeDigitized'] );\n\t\t}\n\t\tif ( ! empty( $exif['FocalLength'] ) ) {\n\t\t\t$meta['focal_length'] = (string) wp_exif_frac2dec( $exif['FocalLength'] );\n\t\t}\n\t\tif ( ! empty( $exif['ISOSpeedRatings'] ) ) {\n\t\t\t$meta['iso'] = is_array( $exif['ISOSpeedRatings'] ) ? reset( $exif['ISOSpeedRatings'] ) : $exif['ISOSpeedRatings'];\n\t\t\t$meta['iso'] = trim( $meta['iso'] );\n\t\t}\n\t\tif ( ! empty( $exif['ExposureTime'] ) ) {\n\t\t\t$meta['shutter_speed'] = (string) wp_exif_frac2dec( $exif['ExposureTime'] );\n\t\t}\n\t\tif ( ! empty( $exif['Orientation'] ) ) {\n\t\t\t$meta['orientation'] = $exif['Orientation'];\n\t\t}\n\t}\n\n\tforeach ( array( 'title', 'caption', 'credit', 'copyright', 'camera', 'iso' ) as $key ) {\n\t\tif ( $meta[ $key ] && ! seems_utf8( $meta[ $key ] ) ) {\n\t\t\t$meta[ $key ] = utf8_encode( $meta[ $key ] );\n\t\t}\n\t}\n\n\tforeach ( $meta['keywords'] as $key => $keyword ) {\n\t\tif ( ! seems_utf8( $keyword ) ) {\n\t\t\t$meta['keywords'][ $key ] = utf8_encode( $keyword );\n\t\t}\n\t}\n\n\t$meta = wp_kses_post_deep( $meta );\n\n\t/**\n\t * Filter the array of meta data read from an image's exif data.\n\t *\n\t * @since 2.5.0\n\t * @since 4.4.0 The `$iptc` parameter was added.\n\t *\n\t * @param array  $meta            Image meta data.\n\t * @param string $file            Path to image file.\n\t * @param int    $sourceImageType Type of image.\n\t * @param array  $iptc            IPTC data.\n\t */\n\treturn apply_filters( 'wp_read_image_metadata', $meta, $file, $sourceImageType, $iptc );\n\n}\n\n/**\n * Validate that file is an image.\n *\n * @since 2.5.0\n *\n * @param string $path File path to test if valid image.\n * @return bool True if valid image, false if not valid image.\n */\nfunction file_is_valid_image($path) {\n\t$size = @getimagesize($path);\n\treturn !empty($size);\n}\n\n/**\n * Validate that file is suitable for displaying within a web page.\n *\n * @since 2.5.0\n *\n * @param string $path File path to test.\n * @return bool True if suitable, false if not suitable.\n */\nfunction file_is_displayable_image($path) {\n\t$displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP );\n\n\t$info = @getimagesize( $path );\n\tif ( empty( $info ) ) {\n\t\t$result = false;\n\t} elseif ( ! in_array( $info[2], $displayable_image_types ) ) {\n\t\t$result = false;\n\t} else {\n\t\t$result = true;\n\t}\n\n\t/**\n\t * Filter whether the current image is displayable in the browser.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param bool   $result Whether the image can be displayed. Default true.\n\t * @param string $path   Path to the image.\n\t */\n\treturn apply_filters( 'file_is_displayable_image', $result, $path );\n}\n\n/**\n * Load an image resource for editing.\n *\n * @since 2.9.0\n *\n * @param string $attachment_id Attachment ID.\n * @param string $mime_type Image mime type.\n * @param string $size Optional. Image size, defaults to 'full'.\n * @return resource|false The resulting image resource on success, false on failure.\n */\nfunction load_image_to_edit( $attachment_id, $mime_type, $size = 'full' ) {\n\t$filepath = _load_image_to_edit_path( $attachment_id, $size );\n\tif ( empty( $filepath ) )\n\t\treturn false;\n\n\tswitch ( $mime_type ) {\n\t\tcase 'image/jpeg':\n\t\t\t$image = imagecreatefromjpeg($filepath);\n\t\t\tbreak;\n\t\tcase 'image/png':\n\t\t\t$image = imagecreatefrompng($filepath);\n\t\t\tbreak;\n\t\tcase 'image/gif':\n\t\t\t$image = imagecreatefromgif($filepath);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t$image = false;\n\t\t\tbreak;\n\t}\n\tif ( is_resource($image) ) {\n\t\t/**\n\t\t * Filter the current image being loaded for editing.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param resource $image         Current image.\n\t\t * @param string   $attachment_id Attachment ID.\n\t\t * @param string   $size          Image size.\n\t\t */\n\t\t$image = apply_filters( 'load_image_to_edit', $image, $attachment_id, $size );\n\t\tif ( function_exists('imagealphablending') && function_exists('imagesavealpha') ) {\n\t\t\timagealphablending($image, false);\n\t\t\timagesavealpha($image, true);\n\t\t}\n\t}\n\treturn $image;\n}\n\n/**\n * Retrieve the path or url of an attachment's attached file.\n *\n * If the attached file is not present on the local filesystem (usually due to replication plugins),\n * then the url of the file is returned if url fopen is supported.\n *\n * @since 3.4.0\n * @access private\n *\n * @param string $attachment_id Attachment ID.\n * @param string $size Optional. Image size, defaults to 'full'.\n * @return string|false File path or url on success, false on failure.\n */\nfunction _load_image_to_edit_path( $attachment_id, $size = 'full' ) {\n\t$filepath = get_attached_file( $attachment_id );\n\n\tif ( $filepath && file_exists( $filepath ) ) {\n\t\tif ( 'full' != $size && ( $data = image_get_intermediate_size( $attachment_id, $size ) ) ) {\n\t\t\t/**\n\t\t\t * Filter the path to the current image.\n\t\t\t *\n\t\t\t * The filter is evaluated for all image sizes except 'full'.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param string $path          Path to the current image.\n\t\t\t * @param string $attachment_id Attachment ID.\n\t\t\t * @param string $size          Size of the image.\n\t\t\t */\n\t\t\t$filepath = apply_filters( 'load_image_to_edit_filesystempath', path_join( dirname( $filepath ), $data['file'] ), $attachment_id, $size );\n\t\t}\n\t} elseif ( function_exists( 'fopen' ) && function_exists( 'ini_get' ) && true == ini_get( 'allow_url_fopen' ) ) {\n\t\t/**\n\t\t * Filter the image URL if not in the local filesystem.\n\t\t *\n\t\t * The filter is only evaluated if fopen is enabled on the server.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param string $image_url     Current image URL.\n\t\t * @param string $attachment_id Attachment ID.\n\t\t * @param string $size          Size of the image.\n\t\t */\n\t\t$filepath = apply_filters( 'load_image_to_edit_attachmenturl', wp_get_attachment_url( $attachment_id ), $attachment_id, $size );\n\t}\n\n\t/**\n\t * Filter the returned path or URL of the current image.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string|bool $filepath      File path or URL to current image, or false.\n\t * @param string      $attachment_id Attachment ID.\n\t * @param string      $size          Size of the image.\n\t */\n\treturn apply_filters( 'load_image_to_edit_path', $filepath, $attachment_id, $size );\n}\n\n/**\n * Copy an existing image file.\n *\n * @since 3.4.0\n * @access private\n *\n * @param string $attachment_id Attachment ID.\n * @return string|false New file path on success, false on failure.\n */\nfunction _copy_image_file( $attachment_id ) {\n\t$dst_file = $src_file = get_attached_file( $attachment_id );\n\tif ( ! file_exists( $src_file ) )\n\t\t$src_file = _load_image_to_edit_path( $attachment_id );\n\n\tif ( $src_file ) {\n\t\t$dst_file = str_replace( basename( $dst_file ), 'copy-' . basename( $dst_file ), $dst_file );\n\t\t$dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), basename( $dst_file ) );\n\n\t\t/*\n\t\t * The directory containing the original file may no longer\n\t\t * exist when using a replication plugin.\n\t\t */\n\t\twp_mkdir_p( dirname( $dst_file ) );\n\n\t\tif ( ! @copy( $src_file, $dst_file ) )\n\t\t\t$dst_file = false;\n\t} else {\n\t\t$dst_file = false;\n\t}\n\n\treturn $dst_file;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/import.php",
    "content": "<?php\n/**\n * WordPress Administration Importer API.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Retrieve list of importers.\n *\n * @since 2.0.0\n *\n * @global array $wp_importers\n * @return array\n */\nfunction get_importers() {\n\tglobal $wp_importers;\n\tif ( is_array( $wp_importers ) ) {\n\t\tuasort( $wp_importers, '_usort_by_first_member' );\n\t}\n\treturn $wp_importers;\n}\n\n/**\n * Sorts a multidimensional array by first member of each top level member\n *\n * Used by uasort() as a callback, should not be used directly.\n *\n * @since 2.9.0\n * @access private\n *\n * @param array $a\n * @param array $b\n * @return int\n */\nfunction _usort_by_first_member( $a, $b ) {\n\treturn strnatcasecmp( $a[0], $b[0] );\n}\n\n/**\n * Register importer for WordPress.\n *\n * @since 2.0.0\n *\n * @global array $wp_importers\n *\n * @param string   $id          Importer tag. Used to uniquely identify importer.\n * @param string   $name        Importer name and title.\n * @param string   $description Importer description.\n * @param callable $callback    Callback to run.\n * @return WP_Error Returns WP_Error when $callback is WP_Error.\n */\nfunction register_importer( $id, $name, $description, $callback ) {\n\tglobal $wp_importers;\n\tif ( is_wp_error( $callback ) )\n\t\treturn $callback;\n\t$wp_importers[$id] = array ( $name, $description, $callback );\n}\n\n/**\n * Cleanup importer.\n *\n * Removes attachment based on ID.\n *\n * @since 2.0.0\n *\n * @param string $id Importer ID.\n */\nfunction wp_import_cleanup( $id ) {\n\twp_delete_attachment( $id );\n}\n\n/**\n * Handle importer uploading and add attachment.\n *\n * @since 2.0.0\n *\n * @return array Uploaded file's details on success, error message on failure\n */\nfunction wp_import_handle_upload() {\n\tif ( ! isset( $_FILES['import'] ) ) {\n\t\treturn array(\n\t\t\t'error' => __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.' )\n\t\t);\n\t}\n\n\t$overrides = array( 'test_form' => false, 'test_type' => false );\n\t$_FILES['import']['name'] .= '.txt';\n\t$upload = wp_handle_upload( $_FILES['import'], $overrides );\n\n\tif ( isset( $upload['error'] ) ) {\n\t\treturn $upload;\n\t}\n\n\t// Construct the object array\n\t$object = array(\n\t\t'post_title' => basename( $upload['file'] ),\n\t\t'post_content' => $upload['url'],\n\t\t'post_mime_type' => $upload['type'],\n\t\t'guid' => $upload['url'],\n\t\t'context' => 'import',\n\t\t'post_status' => 'private'\n\t);\n\n\t// Save the data\n\t$id = wp_insert_attachment( $object, $upload['file'] );\n\n\t/*\n\t * Schedule a cleanup for one day from now in case of failed\n\t * import or missing wp_import_cleanup() call.\n\t */\n\twp_schedule_single_event( time() + DAY_IN_SECONDS, 'importer_scheduled_cleanup', array( $id ) );\n\n\treturn array( 'file' => $upload['file'], 'id' => $id );\n}\n\n/**\n * Returns a list from WordPress.org of popular importer plugins.\n *\n * @since 3.5.0\n *\n * @return array Importers with metadata for each.\n */\nfunction wp_get_popular_importers() {\n\tinclude( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version\n\n\t$locale = get_locale();\n\t$popular_importers = get_site_transient( 'popular_importers_' . $locale );\n\n\tif ( ! $popular_importers ) {\n\t\t$url = add_query_arg( 'locale', get_locale(), 'http://api.wordpress.org/core/importers/1.1/' );\n\t\t$options = array( 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url() );\n\t\t$response = wp_remote_get( $url, $options );\n\t\t$popular_importers = json_decode( wp_remote_retrieve_body( $response ), true );\n\n\t\tif ( is_array( $popular_importers ) )\n\t\t\tset_site_transient( 'popular_importers_' . $locale, $popular_importers, 2 * DAY_IN_SECONDS );\n\t\telse\n\t\t\t$popular_importers = false;\n\t}\n\n\tif ( is_array( $popular_importers ) ) {\n\t\t// If the data was received as translated, return it as-is.\n\t\tif ( $popular_importers['translated'] )\n\t\t\treturn $popular_importers['importers'];\n\n\t\tforeach ( $popular_importers['importers'] as &$importer ) {\n\t\t\t$importer['description'] = translate( $importer['description'] );\n\t\t\tif ( $importer['name'] != 'WordPress' )\n\t\t\t\t$importer['name'] = translate( $importer['name'] );\n\t\t}\n\t\treturn $popular_importers['importers'];\n\t}\n\n\treturn array(\n\t\t// slug => name, description, plugin slug, and register_importer() slug\n\t\t'blogger' => array(\n\t\t\t'name' => __( 'Blogger' ),\n\t\t\t'description' => __( 'Install the Blogger importer to import posts, comments, and users from a Blogger blog.' ),\n\t\t\t'plugin-slug' => 'blogger-importer',\n\t\t\t'importer-id' => 'blogger',\n\t\t),\n\t\t'wpcat2tag' => array(\n\t\t\t'name' => __( 'Categories and Tags Converter' ),\n\t\t\t'description' => __( 'Install the category/tag converter to convert existing categories to tags or tags to categories, selectively.' ),\n\t\t\t'plugin-slug' => 'wpcat2tag-importer',\n\t\t\t'importer-id' => 'wp-cat2tag',\n\t\t),\n\t\t'livejournal' => array(\n\t\t\t'name' => __( 'LiveJournal' ),\n\t\t\t'description' => __( 'Install the LiveJournal importer to import posts from LiveJournal using their API.' ),\n\t\t\t'plugin-slug' => 'livejournal-importer',\n\t\t\t'importer-id' => 'livejournal',\n\t\t),\n\t\t'movabletype' => array(\n\t\t\t'name' => __( 'Movable Type and TypePad' ),\n\t\t\t'description' => __( 'Install the Movable Type importer to import posts and comments from a Movable Type or TypePad blog.' ),\n\t\t\t'plugin-slug' => 'movabletype-importer',\n\t\t\t'importer-id' => 'mt',\n\t\t),\n\t\t'opml' => array(\n\t\t\t'name' => __( 'Blogroll' ),\n\t\t\t'description' => __( 'Install the blogroll importer to import links in OPML format.' ),\n\t\t\t'plugin-slug' => 'opml-importer',\n\t\t\t'importer-id' => 'opml',\n\t\t),\n\t\t'rss' => array(\n\t\t\t'name' => __( 'RSS' ),\n\t\t\t'description' => __( 'Install the RSS importer to import posts from an RSS feed.' ),\n\t\t\t'plugin-slug' => 'rss-importer',\n\t\t\t'importer-id' => 'rss',\n\t\t),\n\t\t'tumblr' => array(\n\t\t\t'name' => __( 'Tumblr' ),\n\t\t\t'description' => __( 'Install the Tumblr importer to import posts &amp; media from Tumblr using their API.' ),\n\t\t\t'plugin-slug' => 'tumblr-importer',\n\t\t\t'importer-id' => 'tumblr',\n\t\t),\n\t\t'wordpress' => array(\n\t\t\t'name' => 'WordPress',\n\t\t\t'description' => __( 'Install the WordPress importer to import posts, pages, comments, custom fields, categories, and tags from a WordPress export file.' ),\n\t\t\t'plugin-slug' => 'wordpress-importer',\n\t\t\t'importer-id' => 'wordpress',\n\t\t),\n\t);\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/list-table.php",
    "content": "<?php\n/**\n * Helper functions for displaying a list of items in an ajaxified HTML table.\n *\n * @package WordPress\n * @subpackage List_Table\n * @since 3.1.0\n */\n\n/**\n * Fetch an instance of a WP_List_Table class.\n *\n * @access private\n * @since 3.1.0\n *\n * @global string $hook_suffix\n *\n * @param string $class The type of the list table, which is the class name.\n * @param array $args Optional. Arguments to pass to the class. Accepts 'screen'.\n * @return object|bool Object on success, false if the class does not exist.\n */\nfunction _get_list_table( $class, $args = array() ) {\n\t$core_classes = array(\n\t\t//Site Admin\n\t\t'WP_Posts_List_Table' => 'posts',\n\t\t'WP_Media_List_Table' => 'media',\n\t\t'WP_Terms_List_Table' => 'terms',\n\t\t'WP_Users_List_Table' => 'users',\n\t\t'WP_Comments_List_Table' => 'comments',\n\t\t'WP_Post_Comments_List_Table' => array( 'comments', 'post-comments' ),\n\t\t'WP_Links_List_Table' => 'links',\n\t\t'WP_Plugin_Install_List_Table' => 'plugin-install',\n\t\t'WP_Themes_List_Table' => 'themes',\n\t\t'WP_Theme_Install_List_Table' => array( 'themes', 'theme-install' ),\n\t\t'WP_Plugins_List_Table' => 'plugins',\n\t\t// Network Admin\n\t\t'WP_MS_Sites_List_Table' => 'ms-sites',\n\t\t'WP_MS_Users_List_Table' => 'ms-users',\n\t\t'WP_MS_Themes_List_Table' => 'ms-themes',\n\t);\n\n\tif ( isset( $core_classes[ $class ] ) ) {\n\t\tforeach ( (array) $core_classes[ $class ] as $required )\n\t\t\trequire_once( ABSPATH . 'wp-admin/includes/class-wp-' . $required . '-list-table.php' );\n\n\t\tif ( isset( $args['screen'] ) )\n\t\t\t$args['screen'] = convert_to_screen( $args['screen'] );\n\t\telseif ( isset( $GLOBALS['hook_suffix'] ) )\n\t\t\t$args['screen'] = get_current_screen();\n\t\telse\n\t\t\t$args['screen'] = null;\n\n\t\treturn new $class( $args );\n\t}\n\n\treturn false;\n}\n\n/**\n * Register column headers for a particular screen.\n *\n * @since 2.7.0\n *\n * @param string $screen The handle for the screen to add help to. This is usually the hook name returned by the add_*_page() functions.\n * @param array $columns An array of columns with column IDs as the keys and translated column names as the values\n * @see get_column_headers(), print_column_headers(), get_hidden_columns()\n */\nfunction register_column_headers($screen, $columns) {\n\t$wp_list_table = new _WP_List_Table_Compat($screen, $columns);\n}\n\n/**\n * Prints column headers for a particular screen.\n *\n * @since 2.7.0\n */\nfunction print_column_headers($screen, $id = true) {\n\t$wp_list_table = new _WP_List_Table_Compat($screen);\n\n\t$wp_list_table->print_column_headers($id);\n}\n\n/**\n * Helper class to be used only by back compat functions\n *\n * @since 3.1.0\n */\nclass _WP_List_Table_Compat extends WP_List_Table {\n\tpublic $_screen;\n\tpublic $_columns;\n\n\tpublic function __construct( $screen, $columns = array() ) {\n\t\tif ( is_string( $screen ) )\n\t\t\t$screen = convert_to_screen( $screen );\n\n\t\t$this->_screen = $screen;\n\n\t\tif ( !empty( $columns ) ) {\n\t\t\t$this->_columns = $columns;\n\t\t\tadd_filter( 'manage_' . $screen->id . '_columns', array( $this, 'get_columns' ), 0 );\n\t\t}\n\t}\n\n\t/**\n\t * @access protected\n\t *\n\t * @return array\n\t */\n\tprotected function get_column_info() {\n\t\t$columns = get_column_headers( $this->_screen );\n\t\t$hidden = get_hidden_columns( $this->_screen );\n\t\t$sortable = array();\n\t\t$primary = $this->get_default_primary_column_name();\n\n\t\treturn array( $columns, $hidden, $sortable, $primary );\n\t}\n\n\t/**\n\t * @access public\n\t *\n\t * @return array\n\t */\n\tpublic function get_columns() {\n\t\treturn $this->_columns;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/media.php",
    "content": "<?php\n/**\n * WordPress Administration Media API.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Defines the default media upload tabs\n *\n * @since 2.5.0\n *\n * @return array default tabs\n */\nfunction media_upload_tabs() {\n\t$_default_tabs = array(\n\t\t'type' => __('From Computer'), // handler action suffix => tab text\n\t\t'type_url' => __('From URL'),\n\t\t'gallery' => __('Gallery'),\n\t\t'library' => __('Media Library')\n\t);\n\n\t/**\n\t * Filter the available tabs in the legacy (pre-3.5.0) media popup.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array $_default_tabs An array of media tabs.\n\t */\n\treturn apply_filters( 'media_upload_tabs', $_default_tabs );\n}\n\n/**\n * Adds the gallery tab back to the tabs array if post has image attachments\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $tabs\n * @return array $tabs with gallery if post has image attachment\n */\nfunction update_gallery_tab($tabs) {\n\tglobal $wpdb;\n\n\tif ( !isset($_REQUEST['post_id']) ) {\n\t\tunset($tabs['gallery']);\n\t\treturn $tabs;\n\t}\n\n\t$post_id = intval($_REQUEST['post_id']);\n\n\tif ( $post_id )\n\t\t$attachments = intval( $wpdb->get_var( $wpdb->prepare( \"SELECT count(*) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' AND post_parent = %d\", $post_id ) ) );\n\n\tif ( empty($attachments) ) {\n\t\tunset($tabs['gallery']);\n\t\treturn $tabs;\n\t}\n\n\t$tabs['gallery'] = sprintf(__('Gallery (%s)'), \"<span id='attachments-count'>$attachments</span>\");\n\n\treturn $tabs;\n}\n\n/**\n * Outputs the legacy media upload tabs UI.\n *\n * @since 2.5.0\n *\n * @global string $redir_tab\n */\nfunction the_media_upload_tabs() {\n\tglobal $redir_tab;\n\t$tabs = media_upload_tabs();\n\t$default = 'type';\n\n\tif ( !empty($tabs) ) {\n\t\techo \"<ul id='sidemenu'>\\n\";\n\t\tif ( isset($redir_tab) && array_key_exists($redir_tab, $tabs) ) {\n\t\t\t$current = $redir_tab;\n\t\t} elseif ( isset($_GET['tab']) && array_key_exists($_GET['tab'], $tabs) ) {\n\t\t\t$current = $_GET['tab'];\n\t\t} else {\n\t\t\t/** This filter is documented in wp-admin/media-upload.php */\n\t\t\t$current = apply_filters( 'media_upload_default_tab', $default );\n\t\t}\n\n\t\tforeach ( $tabs as $callback => $text ) {\n\t\t\t$class = '';\n\n\t\t\tif ( $current == $callback )\n\t\t\t\t$class = \" class='current'\";\n\n\t\t\t$href = add_query_arg(array('tab' => $callback, 's' => false, 'paged' => false, 'post_mime_type' => false, 'm' => false));\n\t\t\t$link = \"<a href='\" . esc_url($href) . \"'$class>$text</a>\";\n\t\t\techo \"\\t<li id='\" . esc_attr(\"tab-$callback\") . \"'>$link</li>\\n\";\n\t\t}\n\t\techo \"</ul>\\n\";\n\t}\n}\n\n/**\n * Retrieves the image HTML to send to the editor.\n *\n * @since 2.5.0\n *\n * @param int          $id      Image attachment id.\n * @param string       $caption Image caption.\n * @param string       $title   Image title attribute.\n * @param string       $align   Image CSS alignment property.\n * @param string       $url     Optional. Image src URL. Default empty.\n * @param string       $rel     Optional. Image rel attribute. Default empty.\n * @param string|array $size    Optional. Image size. Accepts any valid image size, or an array of width\n *                              and height values in pixels (in that order). Default 'medium'.\n * @param string       $alt     Optional. Image alt attribute. Default empty.\n * @return string The HTML output to insert into the editor.\n */\nfunction get_image_send_to_editor( $id, $caption, $title, $align, $url = '', $rel = '', $size = 'medium', $alt = '' ) {\n\n\t$html = get_image_tag($id, $alt, '', $align, $size);\n\n\tif ( ! $rel ) {\n\t\t$rel = ' rel=\"attachment wp-att-' . esc_attr( $id ) . '\"';\n\t} else {\n\t\t$rel = ' rel=\"' . esc_attr( $rel ) . '\"';\n\t}\n\n\tif ( $url )\n\t\t$html = '<a href=\"' . esc_attr($url) . \"\\\"$rel>$html</a>\";\n\n\t/**\n\t * Filter the image HTML markup to send to the editor.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string       $html    The image HTML markup to send.\n\t * @param int          $id      The attachment id.\n\t * @param string       $caption The image caption.\n\t * @param string       $title   The image title.\n\t * @param string       $align   The image alignment.\n\t * @param string       $url     The image source URL.\n\t * @param string|array $size    Size of image. Image size or array of width and height values\n\t *                              (in that order). Default 'medium'.\n\t * @param string       $alt     The image alternative, or alt, text.\n\t */\n\t$html = apply_filters( 'image_send_to_editor', $html, $id, $caption, $title, $align, $url, $size, $alt );\n\n\treturn $html;\n}\n\n/**\n * Adds image shortcode with caption to editor\n *\n * @since 2.6.0\n *\n * @param string $html\n * @param integer $id\n * @param string $caption image caption\n * @param string $alt image alt attribute\n * @param string $title image title attribute\n * @param string $align image css alignment property\n * @param string $url image src url\n * @param string $size image size (thumbnail, medium, large, full or added with add_image_size() )\n * @return string\n */\nfunction image_add_caption( $html, $id, $caption, $title, $align, $url, $size, $alt = '' ) {\n\n\t/**\n\t * Filter the caption text.\n\t *\n\t * Note: If the caption text is empty, the caption shortcode will not be appended\n\t * to the image HTML when inserted into the editor.\n\t *\n\t * Passing an empty value also prevents the {@see 'image_add_caption_shortcode'}\n\t * filter from being evaluated at the end of {@see image_add_caption()}.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param string $caption The original caption text.\n\t * @param int    $id      The attachment ID.\n\t */\n\t$caption = apply_filters( 'image_add_caption_text', $caption, $id );\n\n\t/**\n\t * Filter whether to disable captions.\n\t *\n\t * Prevents image captions from being appended to image HTML when inserted into the editor.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param bool $bool Whether to disable appending captions. Returning true to the filter\n\t *                   will disable captions. Default empty string.\n\t */\n\tif ( empty($caption) || apply_filters( 'disable_captions', '' ) )\n\t\treturn $html;\n\n\t$id = ( 0 < (int) $id ) ? 'attachment_' . $id : '';\n\n\tif ( ! preg_match( '/width=[\"\\']([0-9]+)/', $html, $matches ) )\n\t\treturn $html;\n\n\t$width = $matches[1];\n\n\t$caption = str_replace( array(\"\\r\\n\", \"\\r\"), \"\\n\", $caption);\n\t$caption = preg_replace_callback( '/<[a-zA-Z0-9]+(?: [^<>]+>)*/', '_cleanup_image_add_caption', $caption );\n\n\t// Convert any remaining line breaks to <br>.\n\t$caption = preg_replace( '/[ \\n\\t]*\\n[ \\t]*/', '<br />', $caption );\n\n\t$html = preg_replace( '/(class=[\"\\'][^\\'\"]*)align(none|left|right|center)\\s?/', '$1', $html );\n\tif ( empty($align) )\n\t\t$align = 'none';\n\n\t$shcode = '[caption id=\"' . $id . '\" align=\"align' . $align\t. '\" width=\"' . $width . '\"]' . $html . ' ' . $caption . '[/caption]';\n\n\t/**\n\t * Filter the image HTML markup including the caption shortcode.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string $shcode The image HTML markup with caption shortcode.\n\t * @param string $html   The image HTML markup.\n\t */\n\treturn apply_filters( 'image_add_caption_shortcode', $shcode, $html );\n}\n\n/**\n * Private preg_replace callback used in image_add_caption()\n *\n * @access private\n * @since 3.4.0\n */\nfunction _cleanup_image_add_caption( $matches ) {\n\t// Remove any line breaks from inside the tags.\n\treturn preg_replace( '/[\\r\\n\\t]+/', ' ', $matches[0] );\n}\n\n/**\n * Adds image html to editor\n *\n * @since 2.5.0\n *\n * @param string $html\n */\nfunction media_send_to_editor($html) {\n?>\n<script type=\"text/javascript\">\nvar win = window.dialogArguments || opener || parent || top;\nwin.send_to_editor( <?php echo wp_json_encode( $html ); ?> );\n</script>\n<?php\n\texit;\n}\n\n/**\n * Save a file submitted from a POST request and create an attachment post for it.\n *\n * @since 2.5.0\n *\n * @param string $file_id   Index of the {@link $_FILES} array that the file was sent. Required.\n * @param int    $post_id   The post ID of a post to attach the media item to. Required, but can\n *                          be set to 0, creating a media item that has no relationship to a post.\n * @param array  $post_data Overwrite some of the attachment. Optional.\n * @param array  $overrides Override the {@link wp_handle_upload()} behavior. Optional.\n * @return int|WP_Error ID of the attachment or a WP_Error object on failure.\n */\nfunction media_handle_upload($file_id, $post_id, $post_data = array(), $overrides = array( 'test_form' => false )) {\n\n\t$time = current_time('mysql');\n\tif ( $post = get_post($post_id) ) {\n\t\tif ( substr( $post->post_date, 0, 4 ) > 0 )\n\t\t\t$time = $post->post_date;\n\t}\n\n\t$name = $_FILES[$file_id]['name'];\n\t$file = wp_handle_upload($_FILES[$file_id], $overrides, $time);\n\n\tif ( isset($file['error']) )\n\t\treturn new WP_Error( 'upload_error', $file['error'] );\n\n\t$name_parts = pathinfo($name);\n\t$name = trim( substr( $name, 0, -(1 + strlen($name_parts['extension'])) ) );\n\n\t$url = $file['url'];\n\t$type = $file['type'];\n\t$file = $file['file'];\n\t$title = $name;\n\t$content = '';\n\t$excerpt = '';\n\n\tif ( preg_match( '#^audio#', $type ) ) {\n\t\t$meta = wp_read_audio_metadata( $file );\n\n\t\tif ( ! empty( $meta['title'] ) ) {\n\t\t\t$title = $meta['title'];\n\t\t}\n\n\t\tif ( ! empty( $title ) ) {\n\n\t\t\tif ( ! empty( $meta['album'] ) && ! empty( $meta['artist'] ) ) {\n\t\t\t\t/* translators: 1: audio track title, 2: album title, 3: artist name */\n\t\t\t\t$content .= sprintf( __( '\"%1$s\" from %2$s by %3$s.' ), $title, $meta['album'], $meta['artist'] );\n\t\t\t} elseif ( ! empty( $meta['album'] ) ) {\n\t\t\t\t/* translators: 1: audio track title, 2: album title */\n\t\t\t\t$content .= sprintf( __( '\"%1$s\" from %2$s.' ), $title, $meta['album'] );\n\t\t\t} elseif ( ! empty( $meta['artist'] ) ) {\n\t\t\t\t/* translators: 1: audio track title, 2: artist name */\n\t\t\t\t$content .= sprintf( __( '\"%1$s\" by %2$s.' ), $title, $meta['artist'] );\n\t\t\t} else {\n\t\t\t\t$content .= sprintf( __( '\"%s\".' ), $title );\n\t\t\t}\n\n\t\t} elseif ( ! empty( $meta['album'] ) ) {\n\n\t\t\tif ( ! empty( $meta['artist'] ) ) {\n\t\t\t\t/* translators: 1: audio album title, 2: artist name */\n\t\t\t\t$content .= sprintf( __( '%1$s by %2$s.' ), $meta['album'], $meta['artist'] );\n\t\t\t} else {\n\t\t\t\t$content .= $meta['album'] . '.';\n\t\t\t}\n\n\t\t} elseif ( ! empty( $meta['artist'] ) ) {\n\n\t\t\t$content .= $meta['artist'] . '.';\n\n\t\t}\n\n\t\tif ( ! empty( $meta['year'] ) )\n\t\t\t$content .= ' ' . sprintf( __( 'Released: %d.' ), $meta['year'] );\n\n\t\tif ( ! empty( $meta['track_number'] ) ) {\n\t\t\t$track_number = explode( '/', $meta['track_number'] );\n\t\t\tif ( isset( $track_number[1] ) )\n\t\t\t\t$content .= ' ' . sprintf( __( 'Track %1$s of %2$s.' ), number_format_i18n( $track_number[0] ), number_format_i18n( $track_number[1] ) );\n\t\t\telse\n\t\t\t\t$content .= ' ' . sprintf( __( 'Track %1$s.' ), number_format_i18n( $track_number[0] ) );\n\t\t}\n\n\t\tif ( ! empty( $meta['genre'] ) )\n\t\t\t$content .= ' ' . sprintf( __( 'Genre: %s.' ), $meta['genre'] );\n\n\t// Use image exif/iptc data for title and caption defaults if possible.\n\t} elseif ( 0 === strpos( $type, 'image/' ) && $image_meta = @wp_read_image_metadata( $file ) ) {\n\t\tif ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) {\n\t\t\t$title = $image_meta['title'];\n\t\t}\n\n\t\tif ( trim( $image_meta['caption'] ) ) {\n\t\t\t$excerpt = $image_meta['caption'];\n\t\t}\n\t}\n\n\t// Construct the attachment array\n\t$attachment = array_merge( array(\n\t\t'post_mime_type' => $type,\n\t\t'guid' => $url,\n\t\t'post_parent' => $post_id,\n\t\t'post_title' => $title,\n\t\t'post_content' => $content,\n\t\t'post_excerpt' => $excerpt,\n\t), $post_data );\n\n\t// This should never be set as it would then overwrite an existing attachment.\n\tunset( $attachment['ID'] );\n\n\t// Save the data\n\t$id = wp_insert_attachment($attachment, $file, $post_id);\n\tif ( !is_wp_error($id) ) {\n\t\twp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );\n\t}\n\n\treturn $id;\n\n}\n\n/**\n * This handles a sideloaded file in the same way as an uploaded file is handled by {@link media_handle_upload()}\n *\n * @since 2.6.0\n *\n * @param array $file_array Array similar to a {@link $_FILES} upload array\n * @param int $post_id The post ID the media is associated with\n * @param string $desc Description of the sideloaded file\n * @param array $post_data allows you to overwrite some of the attachment\n * @return int|object The ID of the attachment or a WP_Error on failure\n */\nfunction media_handle_sideload($file_array, $post_id, $desc = null, $post_data = array()) {\n\t$overrides = array('test_form'=>false);\n\n\t$time = current_time( 'mysql' );\n\tif ( $post = get_post( $post_id ) ) {\n\t\tif ( substr( $post->post_date, 0, 4 ) > 0 )\n\t\t\t$time = $post->post_date;\n\t}\n\n\t$file = wp_handle_sideload( $file_array, $overrides, $time );\n\tif ( isset($file['error']) )\n\t\treturn new WP_Error( 'upload_error', $file['error'] );\n\n\t$url = $file['url'];\n\t$type = $file['type'];\n\t$file = $file['file'];\n\t$title = preg_replace('/\\.[^.]+$/', '', basename($file));\n\t$content = '';\n\n\t// Use image exif/iptc data for title and caption defaults if possible.\n\tif ( $image_meta = @wp_read_image_metadata($file) ) {\n\t\tif ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) )\n\t\t\t$title = $image_meta['title'];\n\t\tif ( trim( $image_meta['caption'] ) )\n\t\t\t$content = $image_meta['caption'];\n\t}\n\n\tif ( isset( $desc ) )\n\t\t$title = $desc;\n\n\t// Construct the attachment array.\n\t$attachment = array_merge( array(\n\t\t'post_mime_type' => $type,\n\t\t'guid' => $url,\n\t\t'post_parent' => $post_id,\n\t\t'post_title' => $title,\n\t\t'post_content' => $content,\n\t), $post_data );\n\n\t// This should never be set as it would then overwrite an existing attachment.\n\tunset( $attachment['ID'] );\n\n\t// Save the attachment metadata\n\t$id = wp_insert_attachment($attachment, $file, $post_id);\n\tif ( !is_wp_error($id) )\n\t\twp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );\n\n\treturn $id;\n}\n\n/**\n * Adds the iframe to display content for the media upload page\n *\n * @since 2.5.0\n *\n * @global int $body_id\n *\n * @param string|callable $content_func\n */\nfunction wp_iframe($content_func /* ... */) {\n\t_wp_admin_html_begin();\n?>\n<title><?php bloginfo('name') ?> &rsaquo; <?php _e('Uploads'); ?> &#8212; <?php _e('WordPress'); ?></title>\n<?php\n\nwp_enqueue_style( 'colors' );\n// Check callback name for 'media'\nif ( ( is_array( $content_func ) && ! empty( $content_func[1] ) && 0 === strpos( (string) $content_func[1], 'media' ) )\n\t|| ( ! is_array( $content_func ) && 0 === strpos( $content_func, 'media' ) ) )\n\twp_enqueue_style( 'media' );\nwp_enqueue_style( 'ie' );\n?>\n<script type=\"text/javascript\">\naddLoadEvent = function(func){if(typeof jQuery!=\"undefined\")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};\nvar ajaxurl = '<?php echo admin_url( 'admin-ajax.php', 'relative' ); ?>', pagenow = 'media-upload-popup', adminpage = 'media-upload-popup',\nisRtl = <?php echo (int) is_rtl(); ?>;\n</script>\n<?php\n\t/** This action is documented in wp-admin/admin-header.php */\n\tdo_action( 'admin_enqueue_scripts', 'media-upload-popup' );\n\n\t/**\n\t * Fires when admin styles enqueued for the legacy (pre-3.5.0) media upload popup are printed.\n\t *\n\t * @since 2.9.0\n\t */\n\tdo_action( 'admin_print_styles-media-upload-popup' );\n\n\t/** This action is documented in wp-admin/admin-header.php */\n\tdo_action( 'admin_print_styles' );\n\n\t/**\n\t * Fires when admin scripts enqueued for the legacy (pre-3.5.0) media upload popup are printed.\n\t *\n\t * @since 2.9.0\n\t */\n\tdo_action( 'admin_print_scripts-media-upload-popup' );\n\n\t/** This action is documented in wp-admin/admin-header.php */\n\tdo_action( 'admin_print_scripts' );\n\n\t/**\n\t * Fires when scripts enqueued for the admin header for the legacy (pre-3.5.0)\n\t * media upload popup are printed.\n\t *\n\t * @since 2.9.0\n\t */\n\tdo_action( 'admin_head-media-upload-popup' );\n\n\t/** This action is documented in wp-admin/admin-header.php */\n\tdo_action( 'admin_head' );\n\nif ( is_string( $content_func ) ) {\n\t/**\n\t * Fires in the admin header for each specific form tab in the legacy\n\t * (pre-3.5.0) media upload popup.\n\t *\n\t * The dynamic portion of the hook, `$content_func`, refers to the form\n\t * callback for the media upload type. Possible values include\n\t * 'media_upload_type_form', 'media_upload_type_url_form', and\n\t * 'media_upload_library_form'.\n\t *\n\t * @since 2.5.0\n\t */\n\tdo_action( \"admin_head_{$content_func}\" );\n}\n?>\n</head>\n<body<?php if ( isset($GLOBALS['body_id']) ) echo ' id=\"' . $GLOBALS['body_id'] . '\"'; ?> class=\"wp-core-ui no-js\">\n<script type=\"text/javascript\">\ndocument.body.className = document.body.className.replace('no-js', 'js');\n</script>\n<?php\n\t$args = func_get_args();\n\t$args = array_slice($args, 1);\n\tcall_user_func_array($content_func, $args);\n\n\t/** This action is documented in wp-admin/admin-footer.php */\n\tdo_action( 'admin_print_footer_scripts' );\n?>\n<script type=\"text/javascript\">if(typeof wpOnload=='function')wpOnload();</script>\n</body>\n</html>\n<?php\n}\n\n/**\n * Adds the media button to the editor\n *\n * @since 2.5.0\n *\n * @global int $post_ID\n *\n * @staticvar int $instance\n *\n * @param string $editor_id\n */\nfunction media_buttons($editor_id = 'content') {\n\tstatic $instance = 0;\n\t$instance++;\n\n\t$post = get_post();\n\tif ( ! $post && ! empty( $GLOBALS['post_ID'] ) )\n\t\t$post = $GLOBALS['post_ID'];\n\n\twp_enqueue_media( array(\n\t\t'post' => $post\n\t) );\n\n\t$img = '<span class=\"wp-media-buttons-icon\"></span> ';\n\n\t$id_attribute = $instance === 1 ? ' id=\"insert-media-button\"' : '';\n\tprintf( '<button type=\"button\"%s class=\"button insert-media add_media\" data-editor=\"%s\">%s</button>',\n\t\t$id_attribute,\n\t\tesc_attr( $editor_id ),\n\t\t$img . __( 'Add Media' )\n\t);\n\t/**\n\t * Filter the legacy (pre-3.5.0) media buttons.\n\t *\n\t * @since 2.5.0\n\t * @deprecated 3.5.0 Use 'media_buttons' action instead.\n\t *\n\t * @param string $string Media buttons context. Default empty.\n\t */\n\t$legacy_filter = apply_filters( 'media_buttons_context', '' );\n\n\tif ( $legacy_filter ) {\n\t\t// #WP22559. Close <a> if a plugin started by closing <a> to open their own <a> tag.\n\t\tif ( 0 === stripos( trim( $legacy_filter ), '</a>' ) )\n\t\t\t$legacy_filter .= '</a>';\n\t\techo $legacy_filter;\n\t}\n}\n\n/**\n *\n * @global int $post_ID\n * @param string $type\n * @param int $post_id\n * @param string $tab\n * @return string\n */\nfunction get_upload_iframe_src( $type = null, $post_id = null, $tab = null ) {\n\tglobal $post_ID;\n\n\tif ( empty( $post_id ) )\n\t\t$post_id = $post_ID;\n\n\t$upload_iframe_src = add_query_arg( 'post_id', (int) $post_id, admin_url('media-upload.php') );\n\n\tif ( $type && 'media' != $type )\n\t\t$upload_iframe_src = add_query_arg('type', $type, $upload_iframe_src);\n\n\tif ( ! empty( $tab ) )\n\t\t$upload_iframe_src = add_query_arg('tab', $tab, $upload_iframe_src);\n\n\t/**\n\t * Filter the upload iframe source URL for a specific media type.\n\t *\n\t * The dynamic portion of the hook name, `$type`, refers to the type\n\t * of media uploaded.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $upload_iframe_src The upload iframe source URL by type.\n\t */\n\t$upload_iframe_src = apply_filters( $type . '_upload_iframe_src', $upload_iframe_src );\n\n\treturn add_query_arg('TB_iframe', true, $upload_iframe_src);\n}\n\n/**\n * Handles form submissions for the legacy media uploader.\n *\n * @since 2.5.0\n *\n * @return mixed void|object WP_Error on failure\n */\nfunction media_upload_form_handler() {\n\tcheck_admin_referer('media-form');\n\n\t$errors = null;\n\n\tif ( isset($_POST['send']) ) {\n\t\t$keys = array_keys( $_POST['send'] );\n\t\t$send_id = (int) reset( $keys );\n\t}\n\n\tif ( !empty($_POST['attachments']) ) foreach ( $_POST['attachments'] as $attachment_id => $attachment ) {\n\t\t$post = $_post = get_post($attachment_id, ARRAY_A);\n\n\t\tif ( !current_user_can( 'edit_post', $attachment_id ) )\n\t\t\tcontinue;\n\n\t\tif ( isset($attachment['post_content']) )\n\t\t\t$post['post_content'] = $attachment['post_content'];\n\t\tif ( isset($attachment['post_title']) )\n\t\t\t$post['post_title'] = $attachment['post_title'];\n\t\tif ( isset($attachment['post_excerpt']) )\n\t\t\t$post['post_excerpt'] = $attachment['post_excerpt'];\n\t\tif ( isset($attachment['menu_order']) )\n\t\t\t$post['menu_order'] = $attachment['menu_order'];\n\n\t\tif ( isset($send_id) && $attachment_id == $send_id ) {\n\t\t\tif ( isset($attachment['post_parent']) )\n\t\t\t\t$post['post_parent'] = $attachment['post_parent'];\n\t\t}\n\n\t\t/**\n\t\t * Filter the attachment fields to be saved.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @see wp_get_attachment_metadata()\n\t\t *\n\t\t * @param array $post       An array of post data.\n\t\t * @param array $attachment An array of attachment metadata.\n\t\t */\n\t\t$post = apply_filters( 'attachment_fields_to_save', $post, $attachment );\n\n\t\tif ( isset($attachment['image_alt']) ) {\n\t\t\t$image_alt = wp_unslash( $attachment['image_alt'] );\n\t\t\tif ( $image_alt != get_post_meta($attachment_id, '_wp_attachment_image_alt', true) ) {\n\t\t\t\t$image_alt = wp_strip_all_tags( $image_alt, true );\n\n\t\t\t\t// Update_meta expects slashed.\n\t\t\t\tupdate_post_meta( $attachment_id, '_wp_attachment_image_alt', wp_slash( $image_alt ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( isset($post['errors']) ) {\n\t\t\t$errors[$attachment_id] = $post['errors'];\n\t\t\tunset($post['errors']);\n\t\t}\n\n\t\tif ( $post != $_post )\n\t\t\twp_update_post($post);\n\n\t\tforeach ( get_attachment_taxonomies($post) as $t ) {\n\t\t\tif ( isset($attachment[$t]) )\n\t\t\t\twp_set_object_terms($attachment_id, array_map('trim', preg_split('/,+/', $attachment[$t])), $t, false);\n\t\t}\n\t}\n\n\tif ( isset($_POST['insert-gallery']) || isset($_POST['update-gallery']) ) { ?>\n\t\t<script type=\"text/javascript\">\n\t\tvar win = window.dialogArguments || opener || parent || top;\n\t\twin.tb_remove();\n\t\t</script>\n\t\t<?php\n\t\texit;\n\t}\n\n\tif ( isset($send_id) ) {\n\t\t$attachment = wp_unslash( $_POST['attachments'][$send_id] );\n\n\t\t$html = isset( $attachment['post_title'] ) ? $attachment['post_title'] : '';\n\t\tif ( !empty($attachment['url']) ) {\n\t\t\t$rel = '';\n\t\t\tif ( strpos($attachment['url'], 'attachment_id') || get_attachment_link($send_id) == $attachment['url'] )\n\t\t\t\t$rel = \" rel='attachment wp-att-\" . esc_attr($send_id) . \"'\";\n\t\t\t$html = \"<a href='{$attachment['url']}'$rel>$html</a>\";\n\t\t}\n\n\t\t/**\n\t\t * Filter the HTML markup for a media item sent to the editor.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @see wp_get_attachment_metadata()\n\t\t *\n\t\t * @param string $html       HTML markup for a media item sent to the editor.\n\t\t * @param int    $send_id    The first key from the $_POST['send'] data.\n\t\t * @param array  $attachment Array of attachment metadata.\n\t\t */\n\t\t$html = apply_filters( 'media_send_to_editor', $html, $send_id, $attachment );\n\t\treturn media_send_to_editor($html);\n\t}\n\n\treturn $errors;\n}\n\n/**\n * Handles the process of uploading media.\n *\n * @since 2.5.0\n *\n * @return null|string\n */\nfunction wp_media_upload_handler() {\n\t$errors = array();\n\t$id = 0;\n\n\tif ( isset($_POST['html-upload']) && !empty($_FILES) ) {\n\t\tcheck_admin_referer('media-form');\n\t\t// Upload File button was clicked\n\t\t$id = media_handle_upload('async-upload', $_REQUEST['post_id']);\n\t\tunset($_FILES);\n\t\tif ( is_wp_error($id) ) {\n\t\t\t$errors['upload_error'] = $id;\n\t\t\t$id = false;\n\t\t}\n\t}\n\n\tif ( !empty($_POST['insertonlybutton']) ) {\n\t\t$src = $_POST['src'];\n\t\tif ( !empty($src) && !strpos($src, '://') )\n\t\t\t$src = \"http://$src\";\n\n\t\tif ( isset( $_POST['media_type'] ) && 'image' != $_POST['media_type'] ) {\n\t\t\t$title = esc_html( wp_unslash( $_POST['title'] ) );\n\t\t\tif ( empty( $title ) )\n\t\t\t\t$title = esc_html( basename( $src ) );\n\n\t\t\tif ( $title && $src )\n\t\t\t\t$html = \"<a href='\" . esc_url($src) . \"'>$title</a>\";\n\n\t\t\t$type = 'file';\n\t\t\tif ( ( $ext = preg_replace( '/^.+?\\.([^.]+)$/', '$1', $src ) ) && ( $ext_type = wp_ext2type( $ext ) )\n\t\t\t\t&& ( 'audio' == $ext_type || 'video' == $ext_type ) )\n\t\t\t\t\t$type = $ext_type;\n\n\t\t\t/**\n\t\t\t * Filter the URL sent to the editor for a specific media type.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$type`, refers to the type\n\t\t\t * of media being sent.\n\t\t\t *\n\t\t\t * @since 3.3.0\n\t\t\t *\n\t\t\t * @param string $html  HTML markup sent to the editor.\n\t\t\t * @param string $src   Media source URL.\n\t\t\t * @param string $title Media title.\n\t\t\t */\n\t\t\t$html = apply_filters( $type . '_send_to_editor_url', $html, esc_url_raw( $src ), $title );\n\t\t} else {\n\t\t\t$align = '';\n\t\t\t$alt = esc_attr( wp_unslash( $_POST['alt'] ) );\n\t\t\tif ( isset($_POST['align']) ) {\n\t\t\t\t$align = esc_attr( wp_unslash( $_POST['align'] ) );\n\t\t\t\t$class = \" class='align$align'\";\n\t\t\t}\n\t\t\tif ( !empty($src) )\n\t\t\t\t$html = \"<img src='\" . esc_url($src) . \"' alt='$alt'$class />\";\n\n\t\t\t/**\n\t\t\t * Filter the image URL sent to the editor.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param string $html  HTML markup sent to the editor for an image.\n\t\t\t * @param string $src   Image source URL.\n\t\t\t * @param string $alt   Image alternate, or alt, text.\n\t\t\t * @param string $align The image alignment. Default 'alignnone'. Possible values include\n\t\t\t *                      'alignleft', 'aligncenter', 'alignright', 'alignnone'.\n\t\t\t */\n\t\t\t$html = apply_filters( 'image_send_to_editor_url', $html, esc_url_raw( $src ), $alt, $align );\n\t\t}\n\n\t\treturn media_send_to_editor($html);\n\t}\n\n\tif ( isset( $_POST['save'] ) ) {\n\t\t$errors['upload_notice'] = __('Saved.');\n\t\twp_enqueue_script( 'admin-gallery' );\n \t\treturn wp_iframe( 'media_upload_gallery_form', $errors );\n\n\t} elseif ( ! empty( $_POST ) ) {\n\t\t$return = media_upload_form_handler();\n\n\t\tif ( is_string($return) )\n\t\t\treturn $return;\n\t\tif ( is_array($return) )\n\t\t\t$errors = $return;\n\t}\n\n\tif ( isset($_GET['tab']) && $_GET['tab'] == 'type_url' ) {\n\t\t$type = 'image';\n\t\tif ( isset( $_GET['type'] ) && in_array( $_GET['type'], array( 'video', 'audio', 'file' ) ) )\n\t\t\t$type = $_GET['type'];\n\t\treturn wp_iframe( 'media_upload_type_url_form', $type, $errors, $id );\n\t}\n\n\treturn wp_iframe( 'media_upload_type_form', 'image', $errors, $id );\n}\n\n/**\n * Downloads an image from the specified URL and attaches it to a post.\n *\n * @since 2.6.0\n * @since 4.2.0 Introduced the `$return` parameter.\n *\n * @param string $file    The URL of the image to download.\n * @param int    $post_id The post ID the media is to be associated with.\n * @param string $desc    Optional. Description of the image.\n * @param string $return  Optional. Accepts 'html' (image tag html) or 'src' (URL). Default 'html'.\n * @return string|WP_Error Populated HTML img tag on success, WP_Error object otherwise.\n */\nfunction media_sideload_image( $file, $post_id, $desc = null, $return = 'html' ) {\n\tif ( ! empty( $file ) ) {\n\n\t\t// Set variables for storage, fix file filename for query strings.\n\t\tpreg_match( '/[^\\?]+\\.(jpe?g|jpe|gif|png)\\b/i', $file, $matches );\n\t\tif ( ! $matches ) {\n\t\t\treturn new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );\n\t\t}\n\n\t\t$file_array = array();\n\t\t$file_array['name'] = basename( $matches[0] );\n\n\t\t// Download file to temp location.\n\t\t$file_array['tmp_name'] = download_url( $file );\n\n\t\t// If error storing temporarily, return the error.\n\t\tif ( is_wp_error( $file_array['tmp_name'] ) ) {\n\t\t\treturn $file_array['tmp_name'];\n\t\t}\n\n\t\t// Do the validation and storage stuff.\n\t\t$id = media_handle_sideload( $file_array, $post_id, $desc );\n\n\t\t// If error storing permanently, unlink.\n\t\tif ( is_wp_error( $id ) ) {\n\t\t\t@unlink( $file_array['tmp_name'] );\n\t\t\treturn $id;\n\t\t}\n\n\t\t$src = wp_get_attachment_url( $id );\n\t}\n\n\t// Finally, check to make sure the file has been saved, then return the HTML.\n\tif ( ! empty( $src ) ) {\n\t\tif ( $return === 'src' ) {\n\t\t\treturn $src;\n\t\t}\n\n\t\t$alt = isset( $desc ) ? esc_attr( $desc ) : '';\n\t\t$html = \"<img src='$src' alt='$alt' />\";\n\t\treturn $html;\n\t} else {\n\t\treturn new WP_Error( 'image_sideload_failed' );\n\t}\n}\n\n/**\n * Retrieves the legacy media uploader form in an iframe.\n *\n * @since 2.5.0\n *\n * @return string|null\n */\nfunction media_upload_gallery() {\n\t$errors = array();\n\n\tif ( !empty($_POST) ) {\n\t\t$return = media_upload_form_handler();\n\n\t\tif ( is_string($return) )\n\t\t\treturn $return;\n\t\tif ( is_array($return) )\n\t\t\t$errors = $return;\n\t}\n\n\twp_enqueue_script('admin-gallery');\n\treturn wp_iframe( 'media_upload_gallery_form', $errors );\n}\n\n/**\n * Retrieves the legacy media library form in an iframe.\n *\n * @since 2.5.0\n *\n * @return string|null\n */\nfunction media_upload_library() {\n\t$errors = array();\n\tif ( !empty($_POST) ) {\n\t\t$return = media_upload_form_handler();\n\n\t\tif ( is_string($return) )\n\t\t\treturn $return;\n\t\tif ( is_array($return) )\n\t\t\t$errors = $return;\n\t}\n\n\treturn wp_iframe( 'media_upload_library_form', $errors );\n}\n\n/**\n * Retrieve HTML for the image alignment radio buttons with the specified one checked.\n *\n * @since 2.7.0\n *\n * @param WP_Post $post\n * @param string $checked\n * @return string\n */\nfunction image_align_input_fields( $post, $checked = '' ) {\n\n\tif ( empty($checked) )\n\t\t$checked = get_user_setting('align', 'none');\n\n\t$alignments = array('none' => __('None'), 'left' => __('Left'), 'center' => __('Center'), 'right' => __('Right'));\n\tif ( !array_key_exists( (string) $checked, $alignments ) )\n\t\t$checked = 'none';\n\n\t$out = array();\n\tforeach ( $alignments as $name => $label ) {\n\t\t$name = esc_attr($name);\n\t\t$out[] = \"<input type='radio' name='attachments[{$post->ID}][align]' id='image-align-{$name}-{$post->ID}' value='$name'\".\n\t\t\t( $checked == $name ? \" checked='checked'\" : \"\" ) .\n\t\t\t\" /><label for='image-align-{$name}-{$post->ID}' class='align image-align-{$name}-label'>$label</label>\";\n\t}\n\treturn join(\"\\n\", $out);\n}\n\n/**\n * Retrieve HTML for the size radio buttons with the specified one checked.\n *\n * @since 2.7.0\n *\n * @param WP_Post $post\n * @param bool|string $check\n * @return array\n */\nfunction image_size_input_fields( $post, $check = '' ) {\n\t/**\n\t * Filter the names and labels of the default image sizes.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param array $size_names Array of image sizes and their names. Default values\n\t *                          include 'Thumbnail', 'Medium', 'Large', 'Full Size'.\n\t */\n\t$size_names = apply_filters( 'image_size_names_choose', array(\n\t\t'thumbnail' => __( 'Thumbnail' ),\n\t\t'medium'    => __( 'Medium' ),\n\t\t'large'     => __( 'Large' ),\n\t\t'full'      => __( 'Full Size' )\n\t) );\n\n\tif ( empty( $check ) ) {\n\t\t$check = get_user_setting('imgsize', 'medium');\n\t}\n\t$out = array();\n\n\tforeach ( $size_names as $size => $label ) {\n\t\t$downsize = image_downsize( $post->ID, $size );\n\t\t$checked = '';\n\n\t\t// Is this size selectable?\n\t\t$enabled = ( $downsize[3] || 'full' == $size );\n\t\t$css_id = \"image-size-{$size}-{$post->ID}\";\n\n\t\t// If this size is the default but that's not available, don't select it.\n\t\tif ( $size == $check ) {\n\t\t\tif ( $enabled ) {\n\t\t\t\t$checked = \" checked='checked'\";\n\t\t\t} else {\n\t\t\t\t$check = '';\n\t\t\t}\n\t\t} elseif ( ! $check && $enabled && 'thumbnail' != $size ) {\n\t\t\t/*\n\t\t\t * If $check is not enabled, default to the first available size\n\t\t\t * that's bigger than a thumbnail.\n\t\t\t */\n\t\t\t$check = $size;\n\t\t\t$checked = \" checked='checked'\";\n\t\t}\n\n\t\t$html = \"<div class='image-size-item'><input type='radio' \" . disabled( $enabled, false, false ) . \"name='attachments[$post->ID][image-size]' id='{$css_id}' value='{$size}'$checked />\";\n\n\t\t$html .= \"<label for='{$css_id}'>$label</label>\";\n\n\t\t// Only show the dimensions if that choice is available.\n\t\tif ( $enabled ) {\n\t\t\t$html .= \" <label for='{$css_id}' class='help'>\" . sprintf( \"(%d&nbsp;&times;&nbsp;%d)\", $downsize[1], $downsize[2] ). \"</label>\";\n\t\t}\n\t\t$html .= '</div>';\n\n\t\t$out[] = $html;\n\t}\n\n\treturn array(\n\t\t'label' => __( 'Size' ),\n\t\t'input' => 'html',\n\t\t'html'  => join( \"\\n\", $out ),\n\t);\n}\n\n/**\n * Retrieve HTML for the Link URL buttons with the default link type as specified.\n *\n * @since 2.7.0\n *\n * @param WP_Post $post\n * @param string $url_type\n * @return string\n */\nfunction image_link_input_fields($post, $url_type = '') {\n\n\t$file = wp_get_attachment_url($post->ID);\n\t$link = get_attachment_link($post->ID);\n\n\tif ( empty($url_type) )\n\t\t$url_type = get_user_setting('urlbutton', 'post');\n\n\t$url = '';\n\tif ( $url_type == 'file' )\n\t\t$url = $file;\n\telseif ( $url_type == 'post' )\n\t\t$url = $link;\n\n\treturn \"\n\t<input type='text' class='text urlfield' name='attachments[$post->ID][url]' value='\" . esc_attr($url) . \"' /><br />\n\t<button type='button' class='button urlnone' data-link-url=''>\" . __('None') . \"</button>\n\t<button type='button' class='button urlfile' data-link-url='\" . esc_attr($file) . \"'>\" . __('File URL') . \"</button>\n\t<button type='button' class='button urlpost' data-link-url='\" . esc_attr($link) . \"'>\" . __('Attachment Post URL') . \"</button>\n\";\n}\n\n/**\n * Output a textarea element for inputting an attachment caption.\n *\n * @since 3.4.0\n *\n * @param WP_Post $edit_post Attachment WP_Post object.\n * @return string HTML markup for the textarea element.\n */\nfunction wp_caption_input_textarea($edit_post) {\n\t// Post data is already escaped.\n\t$name = \"attachments[{$edit_post->ID}][post_excerpt]\";\n\n\treturn '<textarea name=\"' . $name . '\" id=\"' . $name . '\">' . $edit_post->post_excerpt . '</textarea>';\n}\n\n/**\n * Retrieves the image attachment fields to edit form fields.\n *\n * @since 2.5.0\n *\n * @param array $form_fields\n * @param object $post\n * @return array\n */\nfunction image_attachment_fields_to_edit($form_fields, $post) {\n\treturn $form_fields;\n}\n\n/**\n * Retrieves the single non-image attachment fields to edit form fields.\n *\n * @since 2.5.0\n *\n * @param array   $form_fields An array of attachment form fields.\n * @param WP_Post $post        The WP_Post attachment object.\n * @return array Filtered attachment form fields.\n */\nfunction media_single_attachment_fields_to_edit( $form_fields, $post ) {\n\tunset($form_fields['url'], $form_fields['align'], $form_fields['image-size']);\n\treturn $form_fields;\n}\n\n/**\n * Retrieves the post non-image attachment fields to edito form fields.\n *\n * @since 2.8.0\n *\n * @param array   $form_fields An array of attachment form fields.\n * @param WP_Post $post        The WP_Post attachment object.\n * @return array Filtered attachment form fields.\n */\nfunction media_post_single_attachment_fields_to_edit( $form_fields, $post ) {\n\tunset($form_fields['image_url']);\n\treturn $form_fields;\n}\n\n/**\n * Filters input from media_upload_form_handler() and assigns a default\n * post_title from the file name if none supplied.\n *\n * Illustrates the use of the attachment_fields_to_save filter\n * which can be used to add default values to any field before saving to DB.\n *\n * @since 2.5.0\n *\n * @param array $post       The WP_Post attachment object converted to an array.\n * @param array $attachment An array of attachment metadata.\n * @return array Filtered attachment post object.\n */\nfunction image_attachment_fields_to_save( $post, $attachment ) {\n\tif ( substr( $post['post_mime_type'], 0, 5 ) == 'image' ) {\n\t\tif ( strlen( trim( $post['post_title'] ) ) == 0 ) {\n\t\t\t$attachment_url = ( isset( $post['attachment_url'] ) ) ? $post['attachment_url'] : $post['guid'];\n\t\t\t$post['post_title'] = preg_replace( '/\\.\\w+$/', '', wp_basename( $attachment_url ) );\n\t\t\t$post['errors']['post_title']['errors'][] = __( 'Empty Title filled from filename.' );\n\t\t}\n\t}\n\n\treturn $post;\n}\n\n/**\n * Retrieves the media element HTML to send to the editor.\n *\n * @since 2.5.0\n *\n * @param string $html\n * @param integer $attachment_id\n * @param array $attachment\n * @return string\n */\nfunction image_media_send_to_editor($html, $attachment_id, $attachment) {\n\t$post = get_post($attachment_id);\n\tif ( substr($post->post_mime_type, 0, 5) == 'image' ) {\n\t\t$url = $attachment['url'];\n\t\t$align = !empty($attachment['align']) ? $attachment['align'] : 'none';\n\t\t$size = !empty($attachment['image-size']) ? $attachment['image-size'] : 'medium';\n\t\t$alt = !empty($attachment['image_alt']) ? $attachment['image_alt'] : '';\n\t\t$rel = ( $url == get_attachment_link($attachment_id) );\n\n\t\treturn get_image_send_to_editor($attachment_id, $attachment['post_excerpt'], $attachment['post_title'], $align, $url, $rel, $size, $alt);\n\t}\n\n\treturn $html;\n}\n\n/**\n * Retrieves the attachment fields to edit form fields.\n *\n * @since 2.5.0\n *\n * @param WP_Post $post\n * @param array $errors\n * @return array\n */\nfunction get_attachment_fields_to_edit($post, $errors = null) {\n\tif ( is_int($post) )\n\t\t$post = get_post($post);\n\tif ( is_array($post) )\n\t\t$post = new WP_Post( (object) $post );\n\n\t$image_url = wp_get_attachment_url($post->ID);\n\n\t$edit_post = sanitize_post($post, 'edit');\n\n\t$form_fields = array(\n\t\t'post_title'   => array(\n\t\t\t'label'      => __('Title'),\n\t\t\t'value'      => $edit_post->post_title\n\t\t),\n\t\t'image_alt'   => array(),\n\t\t'post_excerpt' => array(\n\t\t\t'label'      => __('Caption'),\n\t\t\t'input'      => 'html',\n\t\t\t'html'       => wp_caption_input_textarea($edit_post)\n\t\t),\n\t\t'post_content' => array(\n\t\t\t'label'      => __('Description'),\n\t\t\t'value'      => $edit_post->post_content,\n\t\t\t'input'      => 'textarea'\n\t\t),\n\t\t'url'          => array(\n\t\t\t'label'      => __('Link URL'),\n\t\t\t'input'      => 'html',\n\t\t\t'html'       => image_link_input_fields($post, get_option('image_default_link_type')),\n\t\t\t'helps'      => __('Enter a link URL or click above for presets.')\n\t\t),\n\t\t'menu_order'   => array(\n\t\t\t'label'      => __('Order'),\n\t\t\t'value'      => $edit_post->menu_order\n\t\t),\n\t\t'image_url'\t=> array(\n\t\t\t'label'      => __('File URL'),\n\t\t\t'input'      => 'html',\n\t\t\t'html'       => \"<input type='text' class='text urlfield' readonly='readonly' name='attachments[$post->ID][url]' value='\" . esc_attr($image_url) . \"' /><br />\",\n\t\t\t'value'      => wp_get_attachment_url($post->ID),\n\t\t\t'helps'      => __('Location of the uploaded file.')\n\t\t)\n\t);\n\n\tforeach ( get_attachment_taxonomies($post) as $taxonomy ) {\n\t\t$t = (array) get_taxonomy($taxonomy);\n\t\tif ( ! $t['public'] || ! $t['show_ui'] )\n\t\t\tcontinue;\n\t\tif ( empty($t['label']) )\n\t\t\t$t['label'] = $taxonomy;\n\t\tif ( empty($t['args']) )\n\t\t\t$t['args'] = array();\n\n\t\t$terms = get_object_term_cache($post->ID, $taxonomy);\n\t\tif ( false === $terms )\n\t\t\t$terms = wp_get_object_terms($post->ID, $taxonomy, $t['args']);\n\n\t\t$values = array();\n\n\t\tforeach ( $terms as $term )\n\t\t\t$values[] = $term->slug;\n\t\t$t['value'] = join(', ', $values);\n\n\t\t$form_fields[$taxonomy] = $t;\n\t}\n\n\t// Merge default fields with their errors, so any key passed with the error (e.g. 'error', 'helps', 'value') will replace the default\n\t// The recursive merge is easily traversed with array casting: foreach ( (array) $things as $thing )\n\t$form_fields = array_merge_recursive($form_fields, (array) $errors);\n\n\t// This was formerly in image_attachment_fields_to_edit().\n\tif ( substr($post->post_mime_type, 0, 5) == 'image' ) {\n\t\t$alt = get_post_meta($post->ID, '_wp_attachment_image_alt', true);\n\t\tif ( empty($alt) )\n\t\t\t$alt = '';\n\n\t\t$form_fields['post_title']['required'] = true;\n\n\t\t$form_fields['image_alt'] = array(\n\t\t\t'value' => $alt,\n\t\t\t'label' => __('Alternative Text'),\n\t\t\t'helps' => __('Alt text for the image, e.g. &#8220;The Mona Lisa&#8221;')\n\t\t);\n\n\t\t$form_fields['align'] = array(\n\t\t\t'label' => __('Alignment'),\n\t\t\t'input' => 'html',\n\t\t\t'html'  => image_align_input_fields($post, get_option('image_default_align')),\n\t\t);\n\n\t\t$form_fields['image-size'] = image_size_input_fields( $post, get_option('image_default_size', 'medium') );\n\n\t} else {\n\t\tunset( $form_fields['image_alt'] );\n\t}\n\n\t/**\n\t * Filter the attachment fields to edit.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array   $form_fields An array of attachment form fields.\n\t * @param WP_Post $post        The WP_Post attachment object.\n\t */\n\t$form_fields = apply_filters( 'attachment_fields_to_edit', $form_fields, $post );\n\n\treturn $form_fields;\n}\n\n/**\n * Retrieve HTML for media items of post gallery.\n *\n * The HTML markup retrieved will be created for the progress of SWF Upload\n * component. Will also create link for showing and hiding the form to modify\n * the image attachment.\n *\n * @since 2.5.0\n *\n * @global WP_Query $wp_the_query\n *\n * @param int $post_id Optional. Post ID.\n * @param array $errors Errors for attachment, if any.\n * @return string\n */\nfunction get_media_items( $post_id, $errors ) {\n\t$attachments = array();\n\tif ( $post_id ) {\n\t\t$post = get_post($post_id);\n\t\tif ( $post && $post->post_type == 'attachment' )\n\t\t\t$attachments = array($post->ID => $post);\n\t\telse\n\t\t\t$attachments = get_children( array( 'post_parent' => $post_id, 'post_type' => 'attachment', 'orderby' => 'menu_order ASC, ID', 'order' => 'DESC') );\n\t} else {\n\t\tif ( is_array($GLOBALS['wp_the_query']->posts) )\n\t\t\tforeach ( $GLOBALS['wp_the_query']->posts as $attachment )\n\t\t\t\t$attachments[$attachment->ID] = $attachment;\n\t}\n\n\t$output = '';\n\tforeach ( (array) $attachments as $id => $attachment ) {\n\t\tif ( $attachment->post_status == 'trash' )\n\t\t\tcontinue;\n\t\tif ( $item = get_media_item( $id, array( 'errors' => isset($errors[$id]) ? $errors[$id] : null) ) )\n\t\t\t$output .= \"\\n<div id='media-item-$id' class='media-item child-of-$attachment->post_parent preloaded'><div class='progress hidden'><div class='bar'></div></div><div id='media-upload-error-$id' class='hidden'></div><div class='filename hidden'></div>$item\\n</div>\";\n\t}\n\n\treturn $output;\n}\n\n/**\n * Retrieve HTML form for modifying the image attachment.\n *\n * @since 2.5.0\n *\n * @global string $redir_tab\n *\n * @param int $attachment_id Attachment ID for modification.\n * @param string|array $args Optional. Override defaults.\n * @return string HTML form for attachment.\n */\nfunction get_media_item( $attachment_id, $args = null ) {\n\tglobal $redir_tab;\n\n\tif ( ( $attachment_id = intval( $attachment_id ) ) && $thumb_url = wp_get_attachment_image_src( $attachment_id, 'thumbnail', true ) )\n\t\t$thumb_url = $thumb_url[0];\n\telse\n\t\t$thumb_url = false;\n\n\t$post = get_post( $attachment_id );\n\t$current_post_id = !empty( $_GET['post_id'] ) ? (int) $_GET['post_id'] : 0;\n\n\t$default_args = array(\n\t\t'errors' => null,\n\t\t'send' => $current_post_id ? post_type_supports( get_post_type( $current_post_id ), 'editor' ) : true,\n\t\t'delete' => true,\n\t\t'toggle' => true,\n\t\t'show_title' => true\n\t);\n\t$args = wp_parse_args( $args, $default_args );\n\n\t/**\n\t * Filter the arguments used to retrieve an image for the edit image form.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @see get_media_item\n\t *\n\t * @param array $args An array of arguments.\n\t */\n\t$r = apply_filters( 'get_media_item_args', $args );\n\n\t$toggle_on  = __( 'Show' );\n\t$toggle_off = __( 'Hide' );\n\n\t$file = get_attached_file( $post->ID );\n\t$filename = esc_html( wp_basename( $file ) );\n\t$title = esc_attr( $post->post_title );\n\n\t$post_mime_types = get_post_mime_types();\n\t$keys = array_keys( wp_match_mime_types( array_keys( $post_mime_types ), $post->post_mime_type ) );\n\t$type = reset( $keys );\n\t$type_html = \"<input type='hidden' id='type-of-$attachment_id' value='\" . esc_attr( $type ) . \"' />\";\n\n\t$form_fields = get_attachment_fields_to_edit( $post, $r['errors'] );\n\n\tif ( $r['toggle'] ) {\n\t\t$class = empty( $r['errors'] ) ? 'startclosed' : 'startopen';\n\t\t$toggle_links = \"\n\t<a class='toggle describe-toggle-on' href='#'>$toggle_on</a>\n\t<a class='toggle describe-toggle-off' href='#'>$toggle_off</a>\";\n\t} else {\n\t\t$class = '';\n\t\t$toggle_links = '';\n\t}\n\n\t$display_title = ( !empty( $title ) ) ? $title : $filename; // $title shouldn't ever be empty, but just in case\n\t$display_title = $r['show_title'] ? \"<div class='filename new'><span class='title'>\" . wp_html_excerpt( $display_title, 60, '&hellip;' ) . \"</span></div>\" : '';\n\n\t$gallery = ( ( isset( $_REQUEST['tab'] ) && 'gallery' == $_REQUEST['tab'] ) || ( isset( $redir_tab ) && 'gallery' == $redir_tab ) );\n\t$order = '';\n\n\tforeach ( $form_fields as $key => $val ) {\n\t\tif ( 'menu_order' == $key ) {\n\t\t\tif ( $gallery )\n\t\t\t\t$order = \"<div class='menu_order'> <input class='menu_order_input' type='text' id='attachments[$attachment_id][menu_order]' name='attachments[$attachment_id][menu_order]' value='\" . esc_attr( $val['value'] ). \"' /></div>\";\n\t\t\telse\n\t\t\t\t$order = \"<input type='hidden' name='attachments[$attachment_id][menu_order]' value='\" . esc_attr( $val['value'] ) . \"' />\";\n\n\t\t\tunset( $form_fields['menu_order'] );\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t$media_dims = '';\n\t$meta = wp_get_attachment_metadata( $post->ID );\n\tif ( isset( $meta['width'], $meta['height'] ) )\n\t\t$media_dims .= \"<span id='media-dims-$post->ID'>{$meta['width']}&nbsp;&times;&nbsp;{$meta['height']}</span> \";\n\n\t/**\n\t * Filter the media metadata.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string  $media_dims The HTML markup containing the media dimensions.\n\t * @param WP_Post $post       The WP_Post attachment object.\n\t */\n\t$media_dims = apply_filters( 'media_meta', $media_dims, $post );\n\n\t$image_edit_button = '';\n\tif ( wp_attachment_is_image( $post->ID ) && wp_image_editor_supports( array( 'mime_type' => $post->post_mime_type ) ) ) {\n\t\t$nonce = wp_create_nonce( \"image_editor-$post->ID\" );\n\t\t$image_edit_button = \"<input type='button' id='imgedit-open-btn-$post->ID' onclick='imageEdit.open( $post->ID, \\\"$nonce\\\" )' class='button' value='\" . esc_attr__( 'Edit Image' ) . \"' /> <span class='spinner'></span>\";\n\t}\n\n\t$attachment_url = get_permalink( $attachment_id );\n\n\t$item = \"\n\t$type_html\n\t$toggle_links\n\t$order\n\t$display_title\n\t<table class='slidetoggle describe $class'>\n\t\t<thead class='media-item-info' id='media-head-$post->ID'>\n\t\t<tr>\n\t\t\t<td class='A1B1' id='thumbnail-head-$post->ID'>\n\t\t\t<p><a href='$attachment_url' target='_blank'><img class='thumbnail' src='$thumb_url' alt='' /></a></p>\n\t\t\t<p>$image_edit_button</p>\n\t\t\t</td>\n\t\t\t<td>\n\t\t\t<p><strong>\" . __('File name:') . \"</strong> $filename</p>\n\t\t\t<p><strong>\" . __('File type:') . \"</strong> $post->post_mime_type</p>\n\t\t\t<p><strong>\" . __('Upload date:') . \"</strong> \" . mysql2date( get_option('date_format'), $post->post_date ). '</p>';\n\t\t\tif ( !empty( $media_dims ) )\n\t\t\t\t$item .= \"<p><strong>\" . __('Dimensions:') . \"</strong> $media_dims</p>\\n\";\n\n\t\t\t$item .= \"</td></tr>\\n\";\n\n\t$item .= \"\n\t\t</thead>\n\t\t<tbody>\n\t\t<tr><td colspan='2' class='imgedit-response' id='imgedit-response-$post->ID'></td></tr>\n\t\t<tr><td style='display:none' colspan='2' class='image-editor' id='image-editor-$post->ID'></td></tr>\\n\";\n\n\t$defaults = array(\n\t\t'input'      => 'text',\n\t\t'required'   => false,\n\t\t'value'      => '',\n\t\t'extra_rows' => array(),\n\t);\n\n\tif ( $r['send'] ) {\n\t\t$r['send'] = get_submit_button( __( 'Insert into Post' ), 'button', \"send[$attachment_id]\", false );\n\t}\n\n\t$delete = empty( $r['delete'] ) ? '' : $r['delete'];\n\tif ( $delete && current_user_can( 'delete_post', $attachment_id ) ) {\n\t\tif ( !EMPTY_TRASH_DAYS ) {\n\t\t\t$delete = \"<a href='\" . wp_nonce_url( \"post.php?action=delete&amp;post=$attachment_id\", 'delete-post_' . $attachment_id ) . \"' id='del[$attachment_id]' class='delete-permanently'>\" . __( 'Delete Permanently' ) . '</a>';\n\t\t} elseif ( !MEDIA_TRASH ) {\n\t\t\t$delete = \"<a href='#' class='del-link' onclick=\\\"document.getElementById('del_attachment_$attachment_id').style.display='block';return false;\\\">\" . __( 'Delete' ) . \"</a>\n\t\t\t <div id='del_attachment_$attachment_id' class='del-attachment' style='display:none;'>\" .\n\t\t\t /* translators: %s: file name */\n\t\t\t'<p>' . sprintf( __( 'You are about to delete %s.' ), '<strong>' . $filename . '</strong>' ) . \"</p>\n\t\t\t <a href='\" . wp_nonce_url( \"post.php?action=delete&amp;post=$attachment_id\", 'delete-post_' . $attachment_id ) . \"' id='del[$attachment_id]' class='button'>\" . __( 'Continue' ) . \"</a>\n\t\t\t <a href='#' class='button' onclick=\\\"this.parentNode.style.display='none';return false;\\\">\" . __( 'Cancel' ) . \"</a>\n\t\t\t </div>\";\n\t\t} else {\n\t\t\t$delete = \"<a href='\" . wp_nonce_url( \"post.php?action=trash&amp;post=$attachment_id\", 'trash-post_' . $attachment_id ) . \"' id='del[$attachment_id]' class='delete'>\" . __( 'Move to Trash' ) . \"</a>\n\t\t\t<a href='\" . wp_nonce_url( \"post.php?action=untrash&amp;post=$attachment_id\", 'untrash-post_' . $attachment_id ) . \"' id='undo[$attachment_id]' class='undo hidden'>\" . __( 'Undo' ) . \"</a>\";\n\t\t}\n\t} else {\n\t\t$delete = '';\n\t}\n\n\t$thumbnail = '';\n\t$calling_post_id = 0;\n\tif ( isset( $_GET['post_id'] ) ) {\n\t\t$calling_post_id = absint( $_GET['post_id'] );\n\t} elseif ( isset( $_POST ) && count( $_POST ) ) {// Like for async-upload where $_GET['post_id'] isn't set\n\t\t$calling_post_id = $post->post_parent;\n\t}\n\tif ( 'image' == $type && $calling_post_id && current_theme_supports( 'post-thumbnails', get_post_type( $calling_post_id ) )\n\t\t&& post_type_supports( get_post_type( $calling_post_id ), 'thumbnail' ) && get_post_thumbnail_id( $calling_post_id ) != $attachment_id ) {\n\n\t\t$calling_post = get_post( $calling_post_id );\n\t\t$calling_post_type_object = get_post_type_object( $calling_post->post_type );\n\n\t\t$ajax_nonce = wp_create_nonce( \"set_post_thumbnail-$calling_post_id\" );\n\t\t$thumbnail = \"<a class='wp-post-thumbnail' id='wp-post-thumbnail-\" . $attachment_id . \"' href='#' onclick='WPSetAsThumbnail(\\\"$attachment_id\\\", \\\"$ajax_nonce\\\");return false;'>\" . esc_html( $calling_post_type_object->labels->use_featured_image ) . \"</a>\";\n\t}\n\n\tif ( ( $r['send'] || $thumbnail || $delete ) && !isset( $form_fields['buttons'] ) ) {\n\t\t$form_fields['buttons'] = array( 'tr' => \"\\t\\t<tr class='submit'><td></td><td class='savesend'>\" . $r['send'] . \" $thumbnail $delete</td></tr>\\n\" );\n\t}\n\t$hidden_fields = array();\n\n\tforeach ( $form_fields as $id => $field ) {\n\t\tif ( $id[0] == '_' )\n\t\t\tcontinue;\n\n\t\tif ( !empty( $field['tr'] ) ) {\n\t\t\t$item .= $field['tr'];\n\t\t\tcontinue;\n\t\t}\n\n\t\t$field = array_merge( $defaults, $field );\n\t\t$name = \"attachments[$attachment_id][$id]\";\n\n\t\tif ( $field['input'] == 'hidden' ) {\n\t\t\t$hidden_fields[$name] = $field['value'];\n\t\t\tcontinue;\n\t\t}\n\n\t\t$required      = $field['required'] ? '<span class=\"alignright\"><abbr title=\"required\" class=\"required\">*</abbr></span>' : '';\n\t\t$aria_required = $field['required'] ? \" aria-required='true' \" : '';\n\t\t$class  = $id;\n\t\t$class .= $field['required'] ? ' form-required' : '';\n\n\t\t$item .= \"\\t\\t<tr class='$class'>\\n\\t\\t\\t<th scope='row' class='label'><label for='$name'><span class='alignleft'>{$field['label']}</span>$required<br class='clear' /></label></th>\\n\\t\\t\\t<td class='field'>\";\n\t\tif ( !empty( $field[ $field['input'] ] ) )\n\t\t\t$item .= $field[ $field['input'] ];\n\t\telseif ( $field['input'] == 'textarea' ) {\n\t\t\tif ( 'post_content' == $id && user_can_richedit() ) {\n\t\t\t\t// Sanitize_post() skips the post_content when user_can_richedit.\n\t\t\t\t$field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES );\n\t\t\t}\n\t\t\t// Post_excerpt is already escaped by sanitize_post() in get_attachment_fields_to_edit().\n\t\t\t$item .= \"<textarea id='$name' name='$name' $aria_required>\" . $field['value'] . '</textarea>';\n\t\t} else {\n\t\t\t$item .= \"<input type='text' class='text' id='$name' name='$name' value='\" . esc_attr( $field['value'] ) . \"' $aria_required />\";\n\t\t}\n\t\tif ( !empty( $field['helps'] ) )\n\t\t\t$item .= \"<p class='help'>\" . join( \"</p>\\n<p class='help'>\", array_unique( (array) $field['helps'] ) ) . '</p>';\n\t\t$item .= \"</td>\\n\\t\\t</tr>\\n\";\n\n\t\t$extra_rows = array();\n\n\t\tif ( !empty( $field['errors'] ) )\n\t\t\tforeach ( array_unique( (array) $field['errors'] ) as $error )\n\t\t\t\t$extra_rows['error'][] = $error;\n\n\t\tif ( !empty( $field['extra_rows'] ) )\n\t\t\tforeach ( $field['extra_rows'] as $class => $rows )\n\t\t\t\tforeach ( (array) $rows as $html )\n\t\t\t\t\t$extra_rows[$class][] = $html;\n\n\t\tforeach ( $extra_rows as $class => $rows )\n\t\t\tforeach ( $rows as $html )\n\t\t\t\t$item .= \"\\t\\t<tr><td></td><td class='$class'>$html</td></tr>\\n\";\n\t}\n\n\tif ( !empty( $form_fields['_final'] ) )\n\t\t$item .= \"\\t\\t<tr class='final'><td colspan='2'>{$form_fields['_final']}</td></tr>\\n\";\n\t$item .= \"\\t</tbody>\\n\";\n\t$item .= \"\\t</table>\\n\";\n\n\tforeach ( $hidden_fields as $name => $value )\n\t\t$item .= \"\\t<input type='hidden' name='$name' id='$name' value='\" . esc_attr( $value ) . \"' />\\n\";\n\n\tif ( $post->post_parent < 1 && isset( $_REQUEST['post_id'] ) ) {\n\t\t$parent = (int) $_REQUEST['post_id'];\n\t\t$parent_name = \"attachments[$attachment_id][post_parent]\";\n\t\t$item .= \"\\t<input type='hidden' name='$parent_name' id='$parent_name' value='$parent' />\\n\";\n\t}\n\n\treturn $item;\n}\n\n/**\n * @since 3.5.0\n *\n * @param int   $attachment_id\n * @param array $args\n * @return array\n */\nfunction get_compat_media_markup( $attachment_id, $args = null ) {\n\t$post = get_post( $attachment_id );\n\n\t$default_args = array(\n\t\t'errors' => null,\n\t\t'in_modal' => false,\n\t);\n\n\t$user_can_edit = current_user_can( 'edit_post', $attachment_id );\n\n\t$args = wp_parse_args( $args, $default_args );\n\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$args = apply_filters( 'get_media_item_args', $args );\n\n\t$form_fields = array();\n\n\tif ( $args['in_modal'] ) {\n\t\tforeach ( get_attachment_taxonomies($post) as $taxonomy ) {\n\t\t\t$t = (array) get_taxonomy($taxonomy);\n\t\t\tif ( ! $t['public'] || ! $t['show_ui'] )\n\t\t\t\tcontinue;\n\t\t\tif ( empty($t['label']) )\n\t\t\t\t$t['label'] = $taxonomy;\n\t\t\tif ( empty($t['args']) )\n\t\t\t\t$t['args'] = array();\n\n\t\t\t$terms = get_object_term_cache($post->ID, $taxonomy);\n\t\t\tif ( false === $terms )\n\t\t\t\t$terms = wp_get_object_terms($post->ID, $taxonomy, $t['args']);\n\n\t\t\t$values = array();\n\n\t\t\tforeach ( $terms as $term )\n\t\t\t\t$values[] = $term->slug;\n\t\t\t$t['value'] = join(', ', $values);\n\t\t\t$t['taxonomy'] = true;\n\n\t\t\t$form_fields[$taxonomy] = $t;\n\t\t}\n\t}\n\n\t// Merge default fields with their errors, so any key passed with the error (e.g. 'error', 'helps', 'value') will replace the default\n\t// The recursive merge is easily traversed with array casting: foreach ( (array) $things as $thing )\n\t$form_fields = array_merge_recursive($form_fields, (array) $args['errors'] );\n\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$form_fields = apply_filters( 'attachment_fields_to_edit', $form_fields, $post );\n\n\tunset( $form_fields['image-size'], $form_fields['align'], $form_fields['image_alt'],\n\t\t$form_fields['post_title'], $form_fields['post_excerpt'], $form_fields['post_content'],\n\t\t$form_fields['url'], $form_fields['menu_order'], $form_fields['image_url'] );\n\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$media_meta = apply_filters( 'media_meta', '', $post );\n\n\t$defaults = array(\n\t\t'input'         => 'text',\n\t\t'required'      => false,\n\t\t'value'         => '',\n\t\t'extra_rows'    => array(),\n\t\t'show_in_edit'  => true,\n\t\t'show_in_modal' => true,\n\t);\n\n\t$hidden_fields = array();\n\n\t$item = '';\n\tforeach ( $form_fields as $id => $field ) {\n\t\tif ( $id[0] == '_' )\n\t\t\tcontinue;\n\n\t\t$name = \"attachments[$attachment_id][$id]\";\n\t\t$id_attr = \"attachments-$attachment_id-$id\";\n\n\t\tif ( !empty( $field['tr'] ) ) {\n\t\t\t$item .= $field['tr'];\n\t\t\tcontinue;\n\t\t}\n\n\t\t$field = array_merge( $defaults, $field );\n\n\t\tif ( ( ! $field['show_in_edit'] && ! $args['in_modal'] ) || ( ! $field['show_in_modal'] && $args['in_modal'] ) )\n\t\t\tcontinue;\n\n\t\tif ( $field['input'] == 'hidden' ) {\n\t\t\t$hidden_fields[$name] = $field['value'];\n\t\t\tcontinue;\n\t\t}\n\n\t\t$readonly      = ! $user_can_edit && ! empty( $field['taxonomy'] ) ? \" readonly='readonly' \" : '';\n\t\t$required      = $field['required'] ? '<span class=\"alignright\"><abbr title=\"required\" class=\"required\">*</abbr></span>' : '';\n\t\t$aria_required = $field['required'] ? \" aria-required='true' \" : '';\n\t\t$class  = 'compat-field-' . $id;\n\t\t$class .= $field['required'] ? ' form-required' : '';\n\n\t\t$item .= \"\\t\\t<tr class='$class'>\";\n\t\t$item .= \"\\t\\t\\t<th scope='row' class='label'><label for='$id_attr'><span class='alignleft'>{$field['label']}</span>$required<br class='clear' /></label>\";\n\t\t$item .= \"</th>\\n\\t\\t\\t<td class='field'>\";\n\n\t\tif ( !empty( $field[ $field['input'] ] ) )\n\t\t\t$item .= $field[ $field['input'] ];\n\t\telseif ( $field['input'] == 'textarea' ) {\n\t\t\tif ( 'post_content' == $id && user_can_richedit() ) {\n\t\t\t\t// sanitize_post() skips the post_content when user_can_richedit.\n\t\t\t\t$field['value'] = htmlspecialchars( $field['value'], ENT_QUOTES );\n\t\t\t}\n\t\t\t$item .= \"<textarea id='$id_attr' name='$name' $aria_required>\" . $field['value'] . '</textarea>';\n\t\t} else {\n\t\t\t$item .= \"<input type='text' class='text' id='$id_attr' name='$name' value='\" . esc_attr( $field['value'] ) . \"' $readonly $aria_required />\";\n\t\t}\n\t\tif ( !empty( $field['helps'] ) )\n\t\t\t$item .= \"<p class='help'>\" . join( \"</p>\\n<p class='help'>\", array_unique( (array) $field['helps'] ) ) . '</p>';\n\t\t$item .= \"</td>\\n\\t\\t</tr>\\n\";\n\n\t\t$extra_rows = array();\n\n\t\tif ( !empty( $field['errors'] ) )\n\t\t\tforeach ( array_unique( (array) $field['errors'] ) as $error )\n\t\t\t\t$extra_rows['error'][] = $error;\n\n\t\tif ( !empty( $field['extra_rows'] ) )\n\t\t\tforeach ( $field['extra_rows'] as $class => $rows )\n\t\t\t\tforeach ( (array) $rows as $html )\n\t\t\t\t\t$extra_rows[$class][] = $html;\n\n\t\tforeach ( $extra_rows as $class => $rows )\n\t\t\tforeach ( $rows as $html )\n\t\t\t\t$item .= \"\\t\\t<tr><td></td><td class='$class'>$html</td></tr>\\n\";\n\t}\n\n\tif ( !empty( $form_fields['_final'] ) )\n\t\t$item .= \"\\t\\t<tr class='final'><td colspan='2'>{$form_fields['_final']}</td></tr>\\n\";\n\tif ( $item )\n\t\t$item = '<table class=\"compat-attachment-fields\">' . $item . '</table>';\n\n\tforeach ( $hidden_fields as $hidden_field => $value ) {\n\t\t$item .= '<input type=\"hidden\" name=\"' . esc_attr( $hidden_field ) . '\" value=\"' . esc_attr( $value ) . '\" />' . \"\\n\";\n\t}\n\n\tif ( $item )\n\t\t$item = '<input type=\"hidden\" name=\"attachments[' . $attachment_id . '][menu_order]\" value=\"' . esc_attr( $post->menu_order ) . '\" />' . $item;\n\n\treturn array(\n\t\t'item'   => $item,\n\t\t'meta'   => $media_meta,\n\t);\n}\n\n/**\n * Outputs the legacy media upload header.\n *\n * @since 2.5.0\n */\nfunction media_upload_header() {\n\t$post_id = isset( $_REQUEST['post_id'] ) ? intval( $_REQUEST['post_id'] ) : 0;\n\n\techo '<script type=\"text/javascript\">post_id = ' . $post_id . ';</script>';\n\tif ( empty( $_GET['chromeless'] ) ) {\n\t\techo '<div id=\"media-upload-header\">';\n\t\tthe_media_upload_tabs();\n\t\techo '</div>';\n\t}\n}\n\n/**\n * Outputs the legacy media upload form.\n *\n * @since 2.5.0\n *\n * @global string $type\n * @global string $tab\n * @global bool   $is_IE\n * @global bool   $is_opera\n *\n * @param array $errors\n */\nfunction media_upload_form( $errors = null ) {\n\tglobal $type, $tab, $is_IE, $is_opera;\n\n\tif ( ! _device_can_upload() ) {\n\t\techo '<p>' . sprintf( __('The web browser on your device cannot be used to upload files. You may be able to use the <a href=\"%s\">native app for your device</a> instead.'), 'https://apps.wordpress.org/' ) . '</p>';\n\t\treturn;\n\t}\n\n\t$upload_action_url = admin_url('async-upload.php');\n\t$post_id = isset($_REQUEST['post_id']) ? intval($_REQUEST['post_id']) : 0;\n\t$_type = isset($type) ? $type : '';\n\t$_tab = isset($tab) ? $tab : '';\n\n\t$max_upload_size = wp_max_upload_size();\n\tif ( ! $max_upload_size ) {\n\t\t$max_upload_size = 0;\n\t}\n?>\n\n<div id=\"media-upload-notice\"><?php\n\n\tif (isset($errors['upload_notice']) )\n\t\techo $errors['upload_notice'];\n\n?></div>\n<div id=\"media-upload-error\"><?php\n\n\tif (isset($errors['upload_error']) && is_wp_error($errors['upload_error']))\n\t\techo $errors['upload_error']->get_error_message();\n\n?></div>\n<?php\nif ( is_multisite() && !is_upload_space_available() ) {\n\t/**\n\t * Fires when an upload will exceed the defined upload space quota for a network site.\n\t *\n\t * @since 3.5.0\n\t */\n\tdo_action( 'upload_ui_over_quota' );\n\treturn;\n}\n\n/**\n * Fires just before the legacy (pre-3.5.0) upload interface is loaded.\n *\n * @since 2.6.0\n */\ndo_action( 'pre-upload-ui' );\n\n$post_params = array(\n\t\"post_id\" => $post_id,\n\t\"_wpnonce\" => wp_create_nonce('media-form'),\n\t\"type\" => $_type,\n\t\"tab\" => $_tab,\n\t\"short\" => \"1\",\n);\n\n/**\n * Filter the media upload post parameters.\n *\n * @since 3.1.0 As 'swfupload_post_params'\n * @since 3.3.0\n *\n * @param array $post_params An array of media upload parameters used by Plupload.\n */\n$post_params = apply_filters( 'upload_post_params', $post_params );\n\n$plupload_init = array(\n\t'runtimes'            => 'html5,flash,silverlight,html4',\n\t'browse_button'       => 'plupload-browse-button',\n\t'container'           => 'plupload-upload-ui',\n\t'drop_element'        => 'drag-drop-area',\n\t'file_data_name'      => 'async-upload',\n\t'url'                 => $upload_action_url,\n\t'flash_swf_url'       => includes_url( 'js/plupload/plupload.flash.swf' ),\n\t'silverlight_xap_url' => includes_url( 'js/plupload/plupload.silverlight.xap' ),\n\t'filters' => array(\n\t\t'max_file_size'   => $max_upload_size . 'b',\n\t),\n\t'multipart_params'    => $post_params,\n);\n\n// Currently only iOS Safari supports multiple files uploading but iOS 7.x has a bug that prevents uploading of videos\n// when enabled. See #29602.\nif ( wp_is_mobile() && strpos( $_SERVER['HTTP_USER_AGENT'], 'OS 7_' ) !== false &&\n\tstrpos( $_SERVER['HTTP_USER_AGENT'], 'like Mac OS X' ) !== false ) {\n\n\t$plupload_init['multi_selection'] = false;\n}\n\n/**\n * Filter the default Plupload settings.\n *\n * @since 3.3.0\n *\n * @param array $plupload_init An array of default settings used by Plupload.\n */\n$plupload_init = apply_filters( 'plupload_init', $plupload_init );\n\n?>\n\n<script type=\"text/javascript\">\n<?php\n// Verify size is an int. If not return default value.\n$large_size_h = absint( get_option('large_size_h') );\nif( !$large_size_h )\n\t$large_size_h = 1024;\n$large_size_w = absint( get_option('large_size_w') );\nif( !$large_size_w )\n\t$large_size_w = 1024;\n?>\nvar resize_height = <?php echo $large_size_h; ?>, resize_width = <?php echo $large_size_w; ?>,\nwpUploaderInit = <?php echo wp_json_encode( $plupload_init ); ?>;\n</script>\n\n<div id=\"plupload-upload-ui\" class=\"hide-if-no-js\">\n<?php\n/**\n * Fires before the upload interface loads.\n *\n * @since 2.6.0 As 'pre-flash-upload-ui'\n * @since 3.3.0\n */\ndo_action( 'pre-plupload-upload-ui' ); ?>\n<div id=\"drag-drop-area\">\n\t<div class=\"drag-drop-inside\">\n\t<p class=\"drag-drop-info\"><?php _e('Drop files here'); ?></p>\n\t<p><?php _ex('or', 'Uploader: Drop files here - or - Select Files'); ?></p>\n\t<p class=\"drag-drop-buttons\"><input id=\"plupload-browse-button\" type=\"button\" value=\"<?php esc_attr_e('Select Files'); ?>\" class=\"button\" /></p>\n\t</div>\n</div>\n<?php\n/**\n * Fires after the upload interface loads.\n *\n * @since 2.6.0 As 'post-flash-upload-ui'\n * @since 3.3.0\n */\ndo_action( 'post-plupload-upload-ui' ); ?>\n</div>\n\n<div id=\"html-upload-ui\" class=\"hide-if-js\">\n\t<?php\n\t/**\n\t * Fires before the upload button in the media upload interface.\n\t *\n\t * @since 2.6.0\n\t */\n\tdo_action( 'pre-html-upload-ui' );\n\t?>\n\t<p id=\"async-upload-wrap\">\n\t\t<label class=\"screen-reader-text\" for=\"async-upload\"><?php _e('Upload'); ?></label>\n\t\t<input type=\"file\" name=\"async-upload\" id=\"async-upload\" />\n\t\t<?php submit_button( __( 'Upload' ), 'primary', 'html-upload', false ); ?>\n\t\t<a href=\"#\" onclick=\"try{top.tb_remove();}catch(e){}; return false;\"><?php _e('Cancel'); ?></a>\n\t</p>\n\t<div class=\"clear\"></div>\n<?php\n/**\n * Fires after the upload button in the media upload interface.\n *\n * @since 2.6.0\n */\ndo_action( 'post-html-upload-ui' );\n?>\n</div>\n\n<p class=\"max-upload-size\"><?php printf( __( 'Maximum upload file size: %s.' ), esc_html( size_format( $max_upload_size ) ) ); ?></p>\n<?php\n\n\t/**\n\t * Fires on the post upload UI screen.\n\t *\n\t * Legacy (pre-3.5.0) media workflow hook.\n\t *\n\t * @since 2.6.0\n\t */\n\tdo_action( 'post-upload-ui' );\n}\n\n/**\n * Outputs the legacy media upload form for a given media type.\n *\n * @since 2.5.0\n *\n * @param string $type\n * @param object $errors\n * @param integer $id\n */\nfunction media_upload_type_form($type = 'file', $errors = null, $id = null) {\n\n\tmedia_upload_header();\n\n\t$post_id = isset( $_REQUEST['post_id'] )? intval( $_REQUEST['post_id'] ) : 0;\n\n\t$form_action_url = admin_url(\"media-upload.php?type=$type&tab=type&post_id=$post_id\");\n\n\t/**\n\t * Filter the media upload form action URL.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string $form_action_url The media upload form action URL.\n\t * @param string $type            The type of media. Default 'file'.\n\t */\n\t$form_action_url = apply_filters( 'media_upload_form_url', $form_action_url, $type );\n\t$form_class = 'media-upload-form type-form validate';\n\n\tif ( get_user_setting('uploader') )\n\t\t$form_class .= ' html-uploader';\n?>\n\n<form enctype=\"multipart/form-data\" method=\"post\" action=\"<?php echo esc_url( $form_action_url ); ?>\" class=\"<?php echo $form_class; ?>\" id=\"<?php echo $type; ?>-form\">\n<?php submit_button( '', 'hidden', 'save', false ); ?>\n<input type=\"hidden\" name=\"post_id\" id=\"post_id\" value=\"<?php echo (int) $post_id; ?>\" />\n<?php wp_nonce_field('media-form'); ?>\n\n<h3 class=\"media-title\"><?php _e('Add media files from your computer'); ?></h3>\n\n<?php media_upload_form( $errors ); ?>\n\n<script type=\"text/javascript\">\njQuery(function($){\n\tvar preloaded = $(\".media-item.preloaded\");\n\tif ( preloaded.length > 0 ) {\n\t\tpreloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});\n\t}\n\tupdateMediaForm();\n});\n</script>\n<div id=\"media-items\"><?php\n\nif ( $id ) {\n\tif ( !is_wp_error($id) ) {\n\t\tadd_filter('attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2);\n\t\techo get_media_items( $id, $errors );\n\t} else {\n\t\techo '<div id=\"media-upload-error\">'.esc_html($id->get_error_message()).'</div></div>';\n\t\texit;\n\t}\n}\n?></div>\n\n<p class=\"savebutton ml-submit\">\n<?php submit_button( __( 'Save all changes' ), 'button', 'save', false ); ?>\n</p>\n</form>\n<?php\n}\n\n/**\n * Outputs the legacy media upload form for external media.\n *\n * @since 2.7.0\n *\n * @param string $type\n * @param object $errors\n * @param integer $id\n */\nfunction media_upload_type_url_form($type = null, $errors = null, $id = null) {\n\tif ( null === $type )\n\t\t$type = 'image';\n\n\tmedia_upload_header();\n\n\t$post_id = isset( $_REQUEST['post_id'] ) ? intval( $_REQUEST['post_id'] ) : 0;\n\n\t$form_action_url = admin_url(\"media-upload.php?type=$type&tab=type&post_id=$post_id\");\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$form_action_url = apply_filters( 'media_upload_form_url', $form_action_url, $type );\n\t$form_class = 'media-upload-form type-form validate';\n\n\tif ( get_user_setting('uploader') )\n\t\t$form_class .= ' html-uploader';\n?>\n\n<form enctype=\"multipart/form-data\" method=\"post\" action=\"<?php echo esc_url( $form_action_url ); ?>\" class=\"<?php echo $form_class; ?>\" id=\"<?php echo $type; ?>-form\">\n<input type=\"hidden\" name=\"post_id\" id=\"post_id\" value=\"<?php echo (int) $post_id; ?>\" />\n<?php wp_nonce_field('media-form'); ?>\n\n<h3 class=\"media-title\"><?php _e('Insert media from another website'); ?></h3>\n\n<script type=\"text/javascript\">\nvar addExtImage = {\n\n\twidth : '',\n\theight : '',\n\talign : 'alignnone',\n\n\tinsert : function() {\n\t\tvar t = this, html, f = document.forms[0], cls, title = '', alt = '', caption = '';\n\n\t\tif ( '' == f.src.value || '' == t.width )\n\t\t\treturn false;\n\n\t\tif ( f.alt.value )\n\t\t\talt = f.alt.value.replace(/'/g, '&#039;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n<?php\n\t/** This filter is documented in wp-admin/includes/media.php */\n\tif ( ! apply_filters( 'disable_captions', '' ) ) {\n\t\t?>\n\t\tif ( f.caption.value ) {\n\t\t\tcaption = f.caption.value.replace(/\\r\\n|\\r/g, '\\n');\n\t\t\tcaption = caption.replace(/<[a-zA-Z0-9]+( [^<>]+)?>/g, function(a){\n\t\t\t\treturn a.replace(/[\\r\\n\\t]+/, ' ');\n\t\t\t});\n\n\t\t\tcaption = caption.replace(/\\s*\\n\\s*/g, '<br />');\n\t\t}\n<?php } ?>\n\n\t\tcls = caption ? '' : ' class=\"'+t.align+'\"';\n\n\t\thtml = '<img alt=\"'+alt+'\" src=\"'+f.src.value+'\"'+cls+' width=\"'+t.width+'\" height=\"'+t.height+'\" />';\n\n\t\tif ( f.url.value ) {\n\t\t\turl = f.url.value.replace(/'/g, '&#039;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\t\t\thtml = '<a href=\"'+url+'\">'+html+'</a>';\n\t\t}\n\n\t\tif ( caption )\n\t\t\thtml = '[caption id=\"\" align=\"'+t.align+'\" width=\"'+t.width+'\"]'+html+caption+'[/caption]';\n\n\t\tvar win = window.dialogArguments || opener || parent || top;\n\t\twin.send_to_editor(html);\n\t\treturn false;\n\t},\n\n\tresetImageData : function() {\n\t\tvar t = addExtImage;\n\n\t\tt.width = t.height = '';\n\t\tdocument.getElementById('go_button').style.color = '#bbb';\n\t\tif ( ! document.forms[0].src.value )\n\t\t\tdocument.getElementById('status_img').innerHTML = '*';\n\t\telse document.getElementById('status_img').innerHTML = '<img src=\"<?php echo esc_url( admin_url( 'images/no.png' ) ); ?>\" alt=\"\" />';\n\t},\n\n\tupdateImageData : function() {\n\t\tvar t = addExtImage;\n\n\t\tt.width = t.preloadImg.width;\n\t\tt.height = t.preloadImg.height;\n\t\tdocument.getElementById('go_button').style.color = '#333';\n\t\tdocument.getElementById('status_img').innerHTML = '<img src=\"<?php echo esc_url( admin_url( 'images/yes.png' ) ); ?>\" alt=\"\" />';\n\t},\n\n\tgetImageData : function() {\n\t\tif ( jQuery('table.describe').hasClass('not-image') )\n\t\t\treturn;\n\n\t\tvar t = addExtImage, src = document.forms[0].src.value;\n\n\t\tif ( ! src ) {\n\t\t\tt.resetImageData();\n\t\t\treturn false;\n\t\t}\n\n\t\tdocument.getElementById('status_img').innerHTML = '<img src=\"<?php echo esc_url( admin_url( 'images/spinner-2x.gif' ) ); ?>\" alt=\"\" width=\"16\" height=\"16\" />';\n\t\tt.preloadImg = new Image();\n\t\tt.preloadImg.onload = t.updateImageData;\n\t\tt.preloadImg.onerror = t.resetImageData;\n\t\tt.preloadImg.src = src;\n\t}\n};\n\njQuery(document).ready( function($) {\n\t$('.media-types input').click( function() {\n\t\t$('table.describe').toggleClass('not-image', $('#not-image').prop('checked') );\n\t});\n});\n</script>\n\n<div id=\"media-items\">\n<div class=\"media-item media-blank\">\n<?php\n/**\n * Filter the insert media from URL form HTML.\n *\n * @since 3.3.0\n *\n * @param string $form_html The insert from URL form HTML.\n */\necho apply_filters( 'type_url_form_media', wp_media_insert_url_form( $type ) );\n?>\n</div>\n</div>\n</form>\n<?php\n}\n\n/**\n * Adds gallery form to upload iframe\n *\n * @since 2.5.0\n *\n * @global string $redir_tab\n * @global string $type\n * @global string $tab\n *\n * @param array $errors\n */\nfunction media_upload_gallery_form($errors) {\n\tglobal $redir_tab, $type;\n\n\t$redir_tab = 'gallery';\n\tmedia_upload_header();\n\n\t$post_id = intval($_REQUEST['post_id']);\n\t$form_action_url = admin_url(\"media-upload.php?type=$type&tab=gallery&post_id=$post_id\");\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$form_action_url = apply_filters( 'media_upload_form_url', $form_action_url, $type );\n\t$form_class = 'media-upload-form validate';\n\n\tif ( get_user_setting('uploader') )\n\t\t$form_class .= ' html-uploader';\n?>\n\n<script type=\"text/javascript\">\njQuery(function($){\n\tvar preloaded = $(\".media-item.preloaded\");\n\tif ( preloaded.length > 0 ) {\n\t\tpreloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});\n\t\tupdateMediaForm();\n\t}\n});\n</script>\n<div id=\"sort-buttons\" class=\"hide-if-no-js\">\n<span>\n<?php _e('All Tabs:'); ?>\n<a href=\"#\" id=\"showall\"><?php _e('Show'); ?></a>\n<a href=\"#\" id=\"hideall\" style=\"display:none;\"><?php _e('Hide'); ?></a>\n</span>\n<?php _e('Sort Order:'); ?>\n<a href=\"#\" id=\"asc\"><?php _e('Ascending'); ?></a> |\n<a href=\"#\" id=\"desc\"><?php _e('Descending'); ?></a> |\n<a href=\"#\" id=\"clear\"><?php _ex('Clear', 'verb'); ?></a>\n</div>\n<form enctype=\"multipart/form-data\" method=\"post\" action=\"<?php echo esc_url( $form_action_url ); ?>\" class=\"<?php echo $form_class; ?>\" id=\"gallery-form\">\n<?php wp_nonce_field('media-form'); ?>\n<?php //media_upload_form( $errors ); ?>\n<table class=\"widefat\">\n<thead><tr>\n<th><?php _e('Media'); ?></th>\n<th class=\"order-head\"><?php _e('Order'); ?></th>\n<th class=\"actions-head\"><?php _e('Actions'); ?></th>\n</tr></thead>\n</table>\n<div id=\"media-items\">\n<?php add_filter('attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2); ?>\n<?php echo get_media_items($post_id, $errors); ?>\n</div>\n\n<p class=\"ml-submit\">\n<?php submit_button( __( 'Save all changes' ), 'button savebutton', 'save', false, array( 'id' => 'save-all', 'style' => 'display: none;' ) ); ?>\n<input type=\"hidden\" name=\"post_id\" id=\"post_id\" value=\"<?php echo (int) $post_id; ?>\" />\n<input type=\"hidden\" name=\"type\" value=\"<?php echo esc_attr( $GLOBALS['type'] ); ?>\" />\n<input type=\"hidden\" name=\"tab\" value=\"<?php echo esc_attr( $GLOBALS['tab'] ); ?>\" />\n</p>\n\n<div id=\"gallery-settings\" style=\"display:none;\">\n<div class=\"title\"><?php _e('Gallery Settings'); ?></div>\n<table id=\"basic\" class=\"describe\"><tbody>\n\t<tr>\n\t<th scope=\"row\" class=\"label\">\n\t\t<label>\n\t\t<span class=\"alignleft\"><?php _e('Link thumbnails to:'); ?></span>\n\t\t</label>\n\t</th>\n\t<td class=\"field\">\n\t\t<input type=\"radio\" name=\"linkto\" id=\"linkto-file\" value=\"file\" />\n\t\t<label for=\"linkto-file\" class=\"radio\"><?php _e('Image File'); ?></label>\n\n\t\t<input type=\"radio\" checked=\"checked\" name=\"linkto\" id=\"linkto-post\" value=\"post\" />\n\t\t<label for=\"linkto-post\" class=\"radio\"><?php _e('Attachment Page'); ?></label>\n\t</td>\n\t</tr>\n\n\t<tr>\n\t<th scope=\"row\" class=\"label\">\n\t\t<label>\n\t\t<span class=\"alignleft\"><?php _e('Order images by:'); ?></span>\n\t\t</label>\n\t</th>\n\t<td class=\"field\">\n\t\t<select id=\"orderby\" name=\"orderby\">\n\t\t\t<option value=\"menu_order\" selected=\"selected\"><?php _e('Menu order'); ?></option>\n\t\t\t<option value=\"title\"><?php _e('Title'); ?></option>\n\t\t\t<option value=\"post_date\"><?php _e('Date/Time'); ?></option>\n\t\t\t<option value=\"rand\"><?php _e('Random'); ?></option>\n\t\t</select>\n\t</td>\n\t</tr>\n\n\t<tr>\n\t<th scope=\"row\" class=\"label\">\n\t\t<label>\n\t\t<span class=\"alignleft\"><?php _e('Order:'); ?></span>\n\t\t</label>\n\t</th>\n\t<td class=\"field\">\n\t\t<input type=\"radio\" checked=\"checked\" name=\"order\" id=\"order-asc\" value=\"asc\" />\n\t\t<label for=\"order-asc\" class=\"radio\"><?php _e('Ascending'); ?></label>\n\n\t\t<input type=\"radio\" name=\"order\" id=\"order-desc\" value=\"desc\" />\n\t\t<label for=\"order-desc\" class=\"radio\"><?php _e('Descending'); ?></label>\n\t</td>\n\t</tr>\n\n\t<tr>\n\t<th scope=\"row\" class=\"label\">\n\t\t<label>\n\t\t<span class=\"alignleft\"><?php _e('Gallery columns:'); ?></span>\n\t\t</label>\n\t</th>\n\t<td class=\"field\">\n\t\t<select id=\"columns\" name=\"columns\">\n\t\t\t<option value=\"1\">1</option>\n\t\t\t<option value=\"2\">2</option>\n\t\t\t<option value=\"3\" selected=\"selected\">3</option>\n\t\t\t<option value=\"4\">4</option>\n\t\t\t<option value=\"5\">5</option>\n\t\t\t<option value=\"6\">6</option>\n\t\t\t<option value=\"7\">7</option>\n\t\t\t<option value=\"8\">8</option>\n\t\t\t<option value=\"9\">9</option>\n\t\t</select>\n\t</td>\n\t</tr>\n</tbody></table>\n\n<p class=\"ml-submit\">\n<input type=\"button\" class=\"button\" style=\"display:none;\" onMouseDown=\"wpgallery.update();\" name=\"insert-gallery\" id=\"insert-gallery\" value=\"<?php esc_attr_e( 'Insert gallery' ); ?>\" />\n<input type=\"button\" class=\"button\" style=\"display:none;\" onMouseDown=\"wpgallery.update();\" name=\"update-gallery\" id=\"update-gallery\" value=\"<?php esc_attr_e( 'Update gallery settings' ); ?>\" />\n</p>\n</div>\n</form>\n<?php\n}\n\n/**\n * Outputs the legacy media upload form for the media library.\n *\n * @since 2.5.0\n *\n * @global wpdb      $wpdb\n * @global WP_Query  $wp_query\n * @global WP_Locale $wp_locale\n * @global string    $type\n * @global string    $tab\n * @global array     $post_mime_types\n *\n * @param array $errors\n */\nfunction media_upload_library_form($errors) {\n\tglobal $wpdb, $wp_query, $wp_locale, $type, $tab, $post_mime_types;\n\n\tmedia_upload_header();\n\n\t$post_id = isset( $_REQUEST['post_id'] ) ? intval( $_REQUEST['post_id'] ) : 0;\n\n\t$form_action_url = admin_url(\"media-upload.php?type=$type&tab=library&post_id=$post_id\");\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$form_action_url = apply_filters( 'media_upload_form_url', $form_action_url, $type );\n\t$form_class = 'media-upload-form validate';\n\n\tif ( get_user_setting('uploader') )\n\t\t$form_class .= ' html-uploader';\n\n\t$q = $_GET;\n\t$q['posts_per_page'] = 10;\n\t$q['paged'] = isset( $q['paged'] ) ? intval( $q['paged'] ) : 0;\n\tif ( $q['paged'] < 1 ) {\n\t\t$q['paged'] = 1;\n\t}\n\t$q['offset'] = ( $q['paged'] - 1 ) * 10;\n\tif ( $q['offset'] < 1 ) {\n\t\t$q['offset'] = 0;\n\t}\n\n\tlist($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query( $q );\n\n?>\n\n<form id=\"filter\" method=\"get\">\n<input type=\"hidden\" name=\"type\" value=\"<?php echo esc_attr( $type ); ?>\" />\n<input type=\"hidden\" name=\"tab\" value=\"<?php echo esc_attr( $tab ); ?>\" />\n<input type=\"hidden\" name=\"post_id\" value=\"<?php echo (int) $post_id; ?>\" />\n<input type=\"hidden\" name=\"post_mime_type\" value=\"<?php echo isset( $_GET['post_mime_type'] ) ? esc_attr( $_GET['post_mime_type'] ) : ''; ?>\" />\n<input type=\"hidden\" name=\"context\" value=\"<?php echo isset( $_GET['context'] ) ? esc_attr( $_GET['context'] ) : ''; ?>\" />\n\n<p id=\"media-search\" class=\"search-box\">\n\t<label class=\"screen-reader-text\" for=\"media-search-input\"><?php _e('Search Media');?>:</label>\n\t<input type=\"search\" id=\"media-search-input\" name=\"s\" value=\"<?php the_search_query(); ?>\" />\n\t<?php submit_button( __( 'Search Media' ), 'button', '', false ); ?>\n</p>\n\n<ul class=\"subsubsub\">\n<?php\n$type_links = array();\n$_num_posts = (array) wp_count_attachments();\n$matches = wp_match_mime_types(array_keys($post_mime_types), array_keys($_num_posts));\nforeach ( $matches as $_type => $reals )\n\tforeach ( $reals as $real )\n\t\tif ( isset($num_posts[$_type]) )\n\t\t\t$num_posts[$_type] += $_num_posts[$real];\n\t\telse\n\t\t\t$num_posts[$_type] = $_num_posts[$real];\n// If available type specified by media button clicked, filter by that type\nif ( empty($_GET['post_mime_type']) && !empty($num_posts[$type]) ) {\n\t$_GET['post_mime_type'] = $type;\n\tlist($post_mime_types, $avail_post_mime_types) = wp_edit_attachments_query();\n}\nif ( empty($_GET['post_mime_type']) || $_GET['post_mime_type'] == 'all' )\n\t$class = ' class=\"current\"';\nelse\n\t$class = '';\n$type_links[] = '<li><a href=\"' . esc_url(add_query_arg(array('post_mime_type'=>'all', 'paged'=>false, 'm'=>false))) . '\"' . $class . '>' . __('All Types') . '</a>';\nforeach ( $post_mime_types as $mime_type => $label ) {\n\t$class = '';\n\n\tif ( !wp_match_mime_types($mime_type, $avail_post_mime_types) )\n\t\tcontinue;\n\n\tif ( isset($_GET['post_mime_type']) && wp_match_mime_types($mime_type, $_GET['post_mime_type']) )\n\t\t$class = ' class=\"current\"';\n\n\t$type_links[] = '<li><a href=\"' . esc_url(add_query_arg(array('post_mime_type'=>$mime_type, 'paged'=>false))) . '\"' . $class . '>' . sprintf( translate_nooped_plural( $label[2], $num_posts[$mime_type] ), '<span id=\"' . $mime_type . '-counter\">' . number_format_i18n( $num_posts[$mime_type] ) . '</span>') . '</a>';\n}\n/**\n * Filter the media upload mime type list items.\n *\n * Returned values should begin with an `<li>` tag.\n *\n * @since 3.1.0\n *\n * @param array $type_links An array of list items containing mime type link HTML.\n */\necho implode(' | </li>', apply_filters( 'media_upload_mime_type_links', $type_links ) ) . '</li>';\nunset($type_links);\n?>\n</ul>\n\n<div class=\"tablenav\">\n\n<?php\n$page_links = paginate_links( array(\n\t'base' => add_query_arg( 'paged', '%#%' ),\n\t'format' => '',\n\t'prev_text' => __('&laquo;'),\n\t'next_text' => __('&raquo;'),\n\t'total' => ceil($wp_query->found_posts / 10),\n\t'current' => $q['paged'],\n));\n\nif ( $page_links )\n\techo \"<div class='tablenav-pages'>$page_links</div>\";\n?>\n\n<div class=\"alignleft actions\">\n<?php\n\n$arc_query = \"SELECT DISTINCT YEAR(post_date) AS yyear, MONTH(post_date) AS mmonth FROM $wpdb->posts WHERE post_type = 'attachment' ORDER BY post_date DESC\";\n\n$arc_result = $wpdb->get_results( $arc_query );\n\n$month_count = count($arc_result);\n$selected_month = isset( $_GET['m'] ) ? $_GET['m'] : 0;\n\nif ( $month_count && !( 1 == $month_count && 0 == $arc_result[0]->mmonth ) ) { ?>\n<select name='m'>\n<option<?php selected( $selected_month, 0 ); ?> value='0'><?php _e( 'All dates' ); ?></option>\n<?php\nforeach ($arc_result as $arc_row) {\n\tif ( $arc_row->yyear == 0 )\n\t\tcontinue;\n\t$arc_row->mmonth = zeroise( $arc_row->mmonth, 2 );\n\n\tif ( $arc_row->yyear . $arc_row->mmonth == $selected_month )\n\t\t$default = ' selected=\"selected\"';\n\telse\n\t\t$default = '';\n\n\techo \"<option$default value='\" . esc_attr( $arc_row->yyear . $arc_row->mmonth ) . \"'>\";\n\techo esc_html( $wp_locale->get_month($arc_row->mmonth) . \" $arc_row->yyear\" );\n\techo \"</option>\\n\";\n}\n?>\n</select>\n<?php } ?>\n\n<?php submit_button( __( 'Filter &#187;' ), 'button', 'post-query-submit', false ); ?>\n\n</div>\n\n<br class=\"clear\" />\n</div>\n</form>\n\n<form enctype=\"multipart/form-data\" method=\"post\" action=\"<?php echo esc_url( $form_action_url ); ?>\" class=\"<?php echo $form_class; ?>\" id=\"library-form\">\n\n<?php wp_nonce_field('media-form'); ?>\n<?php //media_upload_form( $errors ); ?>\n\n<script type=\"text/javascript\">\n<!--\njQuery(function($){\n\tvar preloaded = $(\".media-item.preloaded\");\n\tif ( preloaded.length > 0 ) {\n\t\tpreloaded.each(function(){prepareMediaItem({id:this.id.replace(/[^0-9]/g, '')},'');});\n\t\tupdateMediaForm();\n\t}\n});\n-->\n</script>\n\n<div id=\"media-items\">\n<?php add_filter('attachment_fields_to_edit', 'media_post_single_attachment_fields_to_edit', 10, 2); ?>\n<?php echo get_media_items(null, $errors); ?>\n</div>\n<p class=\"ml-submit\">\n<?php submit_button( __( 'Save all changes' ), 'button savebutton', 'save', false ); ?>\n<input type=\"hidden\" name=\"post_id\" id=\"post_id\" value=\"<?php echo (int) $post_id; ?>\" />\n</p>\n</form>\n<?php\n}\n\n/**\n * Creates the form for external url\n *\n * @since 2.7.0\n *\n * @param string $default_view\n * @return string the form html\n */\nfunction wp_media_insert_url_form( $default_view = 'image' ) {\n\t/** This filter is documented in wp-admin/includes/media.php */\n\tif ( ! apply_filters( 'disable_captions', '' ) ) {\n\t\t$caption = '\n\t\t<tr class=\"image-only\">\n\t\t\t<th scope=\"row\" class=\"label\">\n\t\t\t\t<label for=\"caption\"><span class=\"alignleft\">' . __('Image Caption') . '</span></label>\n\t\t\t</th>\n\t\t\t<td class=\"field\"><textarea id=\"caption\" name=\"caption\"></textarea></td>\n\t\t</tr>\n';\n\t} else {\n\t\t$caption = '';\n\t}\n\n\t$default_align = get_option('image_default_align');\n\tif ( empty($default_align) )\n\t\t$default_align = 'none';\n\n\tif ( 'image' == $default_view ) {\n\t\t$view = 'image-only';\n\t\t$table_class = '';\n\t} else {\n\t\t$view = $table_class = 'not-image';\n\t}\n\n\treturn '\n\t<p class=\"media-types\"><label><input type=\"radio\" name=\"media_type\" value=\"image\" id=\"image-only\"' . checked( 'image-only', $view, false ) . ' /> ' . __( 'Image' ) . '</label> &nbsp; &nbsp; <label><input type=\"radio\" name=\"media_type\" value=\"generic\" id=\"not-image\"' . checked( 'not-image', $view, false ) . ' /> ' . __( 'Audio, Video, or Other File' ) . '</label></p>\n\t<table class=\"describe ' . $table_class . '\"><tbody>\n\t\t<tr>\n\t\t\t<th scope=\"row\" class=\"label\" style=\"width:130px;\">\n\t\t\t\t<label for=\"src\"><span class=\"alignleft\">' . __('URL') . '</span></label>\n\t\t\t\t<span class=\"alignright\"><abbr id=\"status_img\" title=\"required\" class=\"required\">*</abbr></span>\n\t\t\t</th>\n\t\t\t<td class=\"field\"><input id=\"src\" name=\"src\" value=\"\" type=\"text\" aria-required=\"true\" onblur=\"addExtImage.getImageData()\" /></td>\n\t\t</tr>\n\n\t\t<tr>\n\t\t\t<th scope=\"row\" class=\"label\">\n\t\t\t\t<label for=\"title\"><span class=\"alignleft\">' . __('Title') . '</span></label>\n\t\t\t\t<span class=\"alignright\"><abbr title=\"required\" class=\"required\">*</abbr></span>\n\t\t\t</th>\n\t\t\t<td class=\"field\"><input id=\"title\" name=\"title\" value=\"\" type=\"text\" aria-required=\"true\" /></td>\n\t\t</tr>\n\n\t\t<tr class=\"not-image\"><td></td><td><p class=\"help\">' . __('Link text, e.g. &#8220;Ransom Demands (PDF)&#8221;') . '</p></td></tr>\n\n\t\t<tr class=\"image-only\">\n\t\t\t<th scope=\"row\" class=\"label\">\n\t\t\t\t<label for=\"alt\"><span class=\"alignleft\">' . __('Alternative Text') . '</span></label>\n\t\t\t</th>\n\t\t\t<td class=\"field\"><input id=\"alt\" name=\"alt\" value=\"\" type=\"text\" aria-required=\"true\" />\n\t\t\t<p class=\"help\">' . __('Alt text for the image, e.g. &#8220;The Mona Lisa&#8221;') . '</p></td>\n\t\t</tr>\n\t\t' . $caption . '\n\t\t<tr class=\"align image-only\">\n\t\t\t<th scope=\"row\" class=\"label\"><p><label for=\"align\">' . __('Alignment') . '</label></p></th>\n\t\t\t<td class=\"field\">\n\t\t\t\t<input name=\"align\" id=\"align-none\" value=\"none\" onclick=\"addExtImage.align=\\'align\\'+this.value\" type=\"radio\"' . ($default_align == 'none' ? ' checked=\"checked\"' : '').' />\n\t\t\t\t<label for=\"align-none\" class=\"align image-align-none-label\">' . __('None') . '</label>\n\t\t\t\t<input name=\"align\" id=\"align-left\" value=\"left\" onclick=\"addExtImage.align=\\'align\\'+this.value\" type=\"radio\"' . ($default_align == 'left' ? ' checked=\"checked\"' : '').' />\n\t\t\t\t<label for=\"align-left\" class=\"align image-align-left-label\">' . __('Left') . '</label>\n\t\t\t\t<input name=\"align\" id=\"align-center\" value=\"center\" onclick=\"addExtImage.align=\\'align\\'+this.value\" type=\"radio\"' . ($default_align == 'center' ? ' checked=\"checked\"' : '').' />\n\t\t\t\t<label for=\"align-center\" class=\"align image-align-center-label\">' . __('Center') . '</label>\n\t\t\t\t<input name=\"align\" id=\"align-right\" value=\"right\" onclick=\"addExtImage.align=\\'align\\'+this.value\" type=\"radio\"' . ($default_align == 'right' ? ' checked=\"checked\"' : '').' />\n\t\t\t\t<label for=\"align-right\" class=\"align image-align-right-label\">' . __('Right') . '</label>\n\t\t\t</td>\n\t\t</tr>\n\n\t\t<tr class=\"image-only\">\n\t\t\t<th scope=\"row\" class=\"label\">\n\t\t\t\t<label for=\"url\"><span class=\"alignleft\">' . __('Link Image To:') . '</span></label>\n\t\t\t</th>\n\t\t\t<td class=\"field\"><input id=\"url\" name=\"url\" value=\"\" type=\"text\" /><br />\n\n\t\t\t<button type=\"button\" class=\"button\" value=\"\" onclick=\"document.forms[0].url.value=null\">' . __('None') . '</button>\n\t\t\t<button type=\"button\" class=\"button\" value=\"\" onclick=\"document.forms[0].url.value=document.forms[0].src.value\">' . __('Link to image') . '</button>\n\t\t\t<p class=\"help\">' . __('Enter a link URL or click above for presets.') . '</p></td>\n\t\t</tr>\n\t\t<tr class=\"image-only\">\n\t\t\t<td></td>\n\t\t\t<td>\n\t\t\t\t<input type=\"button\" class=\"button\" id=\"go_button\" style=\"color:#bbb;\" onclick=\"addExtImage.insert()\" value=\"' . esc_attr__('Insert into Post') . '\" />\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr class=\"not-image\">\n\t\t\t<td></td>\n\t\t\t<td>\n\t\t\t\t' . get_submit_button( __( 'Insert into Post' ), 'button', 'insertonlybutton', false ) . '\n\t\t\t</td>\n\t\t</tr>\n\t</tbody></table>\n';\n\n}\n\n/**\n * Displays the multi-file uploader message.\n *\n * @since 2.6.0\n *\n * @global int $post_ID\n */\nfunction media_upload_flash_bypass() {\n\t$browser_uploader = admin_url( 'media-new.php?browser-uploader' );\n\n\tif ( $post = get_post() )\n\t\t$browser_uploader .= '&amp;post_id=' . intval( $post->ID );\n\telseif ( ! empty( $GLOBALS['post_ID'] ) )\n\t\t$browser_uploader .= '&amp;post_id=' . intval( $GLOBALS['post_ID'] );\n\n\t?>\n\t<p class=\"upload-flash-bypass\">\n\t<?php printf( __( 'You are using the multi-file uploader. Problems? Try the <a href=\"%1$s\" target=\"%2$s\">browser uploader</a> instead.' ), $browser_uploader, '_blank' ); ?>\n\t</p>\n\t<?php\n}\n\n/**\n * Displays the browser's built-in uploader message.\n *\n * @since 2.6.0\n */\nfunction media_upload_html_bypass() {\n\t?>\n\t<p class=\"upload-html-bypass hide-if-no-js\">\n\t   <?php _e('You are using the browser&#8217;s built-in file uploader. The WordPress uploader includes multiple file selection and drag and drop capability. <a href=\"#\">Switch to the multi-file uploader</a>.'); ?>\n\t</p>\n\t<?php\n}\n\n/**\n * Used to display a \"After a file has been uploaded...\" help message.\n *\n * @since 3.3.0\n */\nfunction media_upload_text_after() {}\n\n/**\n * Displays the checkbox to scale images.\n *\n * @since 3.3.0\n */\nfunction media_upload_max_image_resize() {\n\t$checked = get_user_setting('upload_resize') ? ' checked=\"true\"' : '';\n\t$a = $end = '';\n\n\tif ( current_user_can( 'manage_options' ) ) {\n\t\t$a = '<a href=\"' . esc_url( admin_url( 'options-media.php' ) ) . '\" target=\"_blank\">';\n\t\t$end = '</a>';\n\t}\n?>\n<p class=\"hide-if-no-js\"><label>\n<input name=\"image_resize\" type=\"checkbox\" id=\"image_resize\" value=\"true\"<?php echo $checked; ?> />\n<?php\n\t/* translators: %1$s is link start tag, %2$s is link end tag, %3$d is width, %4$d is height*/\n\tprintf( __( 'Scale images to match the large size selected in %1$simage options%2$s (%3$d &times; %4$d).' ), $a, $end, (int) get_option( 'large_size_w', '1024' ), (int) get_option( 'large_size_h', '1024' ) );\n?>\n</label></p>\n<?php\n}\n\n/**\n * Displays the out of storage quota message in Multisite.\n *\n * @since 3.5.0\n */\nfunction multisite_over_quota_message() {\n\techo '<p>' . sprintf( __( 'Sorry, you have used all of your storage quota of %s MB.' ), get_space_allowed() ) . '</p>';\n}\n\n/**\n * Displays the image and editor in the post editor\n *\n * @since 3.5.0\n */\nfunction edit_form_image_editor( $post ) {\n\t$open = isset( $_GET['image-editor'] );\n\tif ( $open )\n\t\trequire_once ABSPATH . 'wp-admin/includes/image-edit.php';\n\n\t$thumb_url = false;\n\tif ( $attachment_id = intval( $post->ID ) )\n\t\t$thumb_url = wp_get_attachment_image_src( $attachment_id, array( 900, 450 ), true );\n\n\t$alt_text = get_post_meta( $post->ID, '_wp_attachment_image_alt', true );\n\n\t$att_url = wp_get_attachment_url( $post->ID ); ?>\n\t<div class=\"wp_attachment_holder\">\n\t<?php\n\tif ( wp_attachment_is_image( $post->ID ) ) :\n\t\t$image_edit_button = '';\n\t\tif ( wp_image_editor_supports( array( 'mime_type' => $post->post_mime_type ) ) ) {\n\t\t\t$nonce = wp_create_nonce( \"image_editor-$post->ID\" );\n\t\t\t$image_edit_button = \"<input type='button' id='imgedit-open-btn-$post->ID' onclick='imageEdit.open( $post->ID, \\\"$nonce\\\" )' class='button' value='\" . esc_attr__( 'Edit Image' ) . \"' /> <span class='spinner'></span>\";\n\t\t}\n\t?>\n\n\t\t<div class=\"imgedit-response\" id=\"imgedit-response-<?php echo $attachment_id; ?>\"></div>\n\n\t\t<div<?php if ( $open ) echo ' style=\"display:none\"'; ?> class=\"wp_attachment_image\" id=\"media-head-<?php echo $attachment_id; ?>\">\n\t\t\t<p id=\"thumbnail-head-<?php echo $attachment_id; ?>\"><img class=\"thumbnail\" src=\"<?php echo set_url_scheme( $thumb_url[0] ); ?>\" style=\"max-width:100%\" alt=\"\" /></p>\n\t\t\t<p><?php echo $image_edit_button; ?></p>\n\t\t</div>\n\t\t<div<?php if ( ! $open ) echo ' style=\"display:none\"'; ?> class=\"image-editor\" id=\"image-editor-<?php echo $attachment_id; ?>\">\n\t\t\t<?php if ( $open ) wp_image_editor( $attachment_id ); ?>\n\t\t</div>\n\t<?php\n\telseif ( $attachment_id && wp_attachment_is( 'audio', $post ) ):\n\n\t\twp_maybe_generate_attachment_metadata( $post );\n\n\t\techo wp_audio_shortcode( array( 'src' => $att_url ) );\n\n\telseif ( $attachment_id && wp_attachment_is( 'video', $post ) ):\n\n\t\twp_maybe_generate_attachment_metadata( $post );\n\n\t\t$meta = wp_get_attachment_metadata( $attachment_id );\n\t\t$w = ! empty( $meta['width'] ) ? min( $meta['width'], 640 ) : 0;\n\t\t$h = ! empty( $meta['height'] ) ? $meta['height'] : 0;\n\t\tif ( $h && $w < $meta['width'] ) {\n\t\t\t$h = round( ( $meta['height'] * $w ) / $meta['width'] );\n\t\t}\n\n\t\t$attr = array( 'src' => $att_url );\n\t\tif ( ! empty( $w ) && ! empty( $h ) ) {\n\t\t\t$attr['width'] = $w;\n\t\t\t$attr['height'] = $h;\n\t\t}\n\n\t\t$thumb_id = get_post_thumbnail_id( $attachment_id );\n\t\tif ( ! empty( $thumb_id ) ) {\n\t\t\t$attr['poster'] = wp_get_attachment_url( $thumb_id );\n\t\t}\n\n\t\techo wp_video_shortcode( $attr );\n\n\tendif; ?>\n\t</div>\n\t<div class=\"wp_attachment_details edit-form-section\">\n\t\t<p>\n\t\t\t<label for=\"attachment_caption\"><strong><?php _e( 'Caption' ); ?></strong></label><br />\n\t\t\t<textarea class=\"widefat\" name=\"excerpt\" id=\"attachment_caption\"><?php echo $post->post_excerpt; ?></textarea>\n\t\t</p>\n\n\n\t<?php if ( 'image' === substr( $post->post_mime_type, 0, 5 ) ) : ?>\n\t\t<p>\n\t\t\t<label for=\"attachment_alt\"><strong><?php _e( 'Alternative Text' ); ?></strong></label><br />\n\t\t\t<input type=\"text\" class=\"widefat\" name=\"_wp_attachment_image_alt\" id=\"attachment_alt\" value=\"<?php echo esc_attr( $alt_text ); ?>\" />\n\t\t</p>\n\t<?php endif; ?>\n\n\t<?php\n\t\t$quicktags_settings = array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' );\n\t\t$editor_args = array(\n\t\t\t'textarea_name' => 'content',\n\t\t\t'textarea_rows' => 5,\n\t\t\t'media_buttons' => false,\n\t\t\t'tinymce' => false,\n\t\t\t'quicktags' => $quicktags_settings,\n\t\t);\n\t?>\n\n\t<label for=\"attachment_content\"><strong><?php _e( 'Description' ); ?></strong><?php\n\tif ( preg_match( '#^(audio|video)/#', $post->post_mime_type ) ) {\n\t\techo ': ' . __( 'Displayed on attachment pages.' );\n\t} ?></label>\n\t<?php wp_editor( $post->post_content, 'attachment_content', $editor_args ); ?>\n\n\t</div>\n\t<?php\n\t$extras = get_compat_media_markup( $post->ID );\n\techo $extras['item'];\n\techo '<input type=\"hidden\" id=\"image-edit-context\" value=\"edit-attachment\" />' . \"\\n\";\n}\n\n/**\n * Displays non-editable attachment metadata in the publish metabox\n *\n * @since 3.5.0\n */\nfunction attachment_submitbox_metadata() {\n\t$post = get_post();\n\n\t$file = get_attached_file( $post->ID );\n\t$filename = esc_html( wp_basename( $file ) );\n\n\t$media_dims = '';\n\t$meta = wp_get_attachment_metadata( $post->ID );\n\tif ( isset( $meta['width'], $meta['height'] ) )\n\t\t$media_dims .= \"<span id='media-dims-$post->ID'>{$meta['width']}&nbsp;&times;&nbsp;{$meta['height']}</span> \";\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$media_dims = apply_filters( 'media_meta', $media_dims, $post );\n\n\t$att_url = wp_get_attachment_url( $post->ID );\n?>\n\t<div class=\"misc-pub-section misc-pub-attachment\">\n\t\t<label for=\"attachment_url\"><?php _e( 'File URL:' ); ?></label>\n\t\t<input type=\"text\" class=\"widefat urlfield\" readonly=\"readonly\" name=\"attachment_url\" id=\"attachment_url\" value=\"<?php echo esc_attr( $att_url ); ?>\" />\n\t</div>\n\t<div class=\"misc-pub-section misc-pub-filename\">\n\t\t<?php _e( 'File name:' ); ?> <strong><?php echo $filename; ?></strong>\n\t</div>\n\t<div class=\"misc-pub-section misc-pub-filetype\">\n\t\t<?php _e( 'File type:' ); ?> <strong><?php\n\t\t\tif ( preg_match( '/^.*?\\.(\\w+)$/', get_attached_file( $post->ID ), $matches ) ) {\n\t\t\t\techo esc_html( strtoupper( $matches[1] ) );\n\t\t\t\tlist( $mime_type ) = explode( '/', $post->post_mime_type );\n\t\t\t\tif ( $mime_type !== 'image' && ! empty( $meta['mime_type'] ) ) {\n\t\t\t\t\tif ( $meta['mime_type'] !== \"$mime_type/\" . strtolower( $matches[1] ) ) {\n\t\t\t\t\t\techo ' (' . $meta['mime_type'] . ')';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\techo strtoupper( str_replace( 'image/', '', $post->post_mime_type ) );\n\t\t\t}\n\t\t?></strong>\n\t</div>\n\n\t<?php\n\t\t$file_size = false;\n\n\t\tif ( isset( $meta['filesize'] ) )\n\t\t\t$file_size = $meta['filesize'];\n\t\telseif ( file_exists( $file ) )\n\t\t\t$file_size = filesize( $file );\n\n\t\tif ( ! empty( $file_size ) ) : ?>\n\t\t\t<div class=\"misc-pub-section misc-pub-filesize\">\n\t\t\t\t<?php _e( 'File size:' ); ?> <strong><?php echo size_format( $file_size ); ?></strong>\n\t\t\t</div>\n\t\t\t<?php\n\t\tendif;\n\n\tif ( preg_match( '#^(audio|video)/#', $post->post_mime_type ) ) {\n\n\t\t/**\n\t\t * Filter the audio and video metadata fields to be shown in the publish meta box.\n\t\t *\n\t\t * The key for each item in the array should correspond to an attachment\n\t\t * metadata key, and the value should be the desired label.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array $fields An array of the attachment metadata keys and labels.\n\t\t */\n\t\t$fields = apply_filters( 'media_submitbox_misc_sections', array(\n\t\t\t'length_formatted' => __( 'Length:' ),\n\t\t\t'bitrate'          => __( 'Bitrate:' ),\n\t\t) );\n\n\t\tforeach ( $fields as $key => $label ) {\n\t\t\tif ( empty( $meta[ $key ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t?>\n\t\t<div class=\"misc-pub-section misc-pub-mime-meta misc-pub-<?php echo sanitize_html_class( $key ); ?>\">\n\t\t\t<?php echo $label ?> <strong><?php\n\t\t\t\tswitch ( $key ) {\n\t\t\t\t\tcase 'bitrate' :\n\t\t\t\t\t\techo round( $meta['bitrate'] / 1000 ) . 'kb/s';\n\t\t\t\t\t\tif ( ! empty( $meta['bitrate_mode'] ) ) {\n\t\t\t\t\t\t\techo ' ' . strtoupper( esc_html( $meta['bitrate_mode'] ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\techo esc_html( $meta[ $key ] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t?></strong>\n\t\t</div>\n\t<?php\n\t\t}\n\n\t\t/**\n\t\t * Filter the audio attachment metadata fields to be shown in the publish meta box.\n\t\t *\n\t\t * The key for each item in the array should correspond to an attachment\n\t\t * metadata key, and the value should be the desired label.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array $fields An array of the attachment metadata keys and labels.\n\t\t */\n\t\t$audio_fields = apply_filters( 'audio_submitbox_misc_sections', array(\n\t\t\t'dataformat' => __( 'Audio Format:' ),\n\t\t\t'codec'      => __( 'Audio Codec:' )\n\t\t) );\n\n\t\tforeach ( $audio_fields as $key => $label ) {\n\t\t\tif ( empty( $meta['audio'][ $key ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t?>\n\t\t<div class=\"misc-pub-section misc-pub-audio misc-pub-<?php echo sanitize_html_class( $key ); ?>\">\n\t\t\t<?php echo $label; ?> <strong><?php echo esc_html( $meta['audio'][$key] ); ?></strong>\n\t\t</div>\n\t<?php\n\t\t}\n\n\t}\n\n\tif ( $media_dims ) : ?>\n\t<div class=\"misc-pub-section misc-pub-dimensions\">\n\t\t<?php _e( 'Dimensions:' ); ?> <strong><?php echo $media_dims; ?></strong>\n\t</div>\n<?php\n\tendif;\n}\n\n/**\n * Parse ID3v2, ID3v1, and getID3 comments to extract usable data\n *\n * @since 3.6.0\n *\n * @param array $metadata An existing array with data\n * @param array $data Data supplied by ID3 tags\n */\nfunction wp_add_id3_tag_data( &$metadata, $data ) {\n\tforeach ( array( 'id3v2', 'id3v1' ) as $version ) {\n\t\tif ( ! empty( $data[$version]['comments'] ) ) {\n\t\t\tforeach ( $data[$version]['comments'] as $key => $list ) {\n\t\t\t\tif ( 'length' !== $key && ! empty( $list ) ) {\n\t\t\t\t\t$metadata[$key] = reset( $list );\n\t\t\t\t\t// Fix bug in byte stream analysis.\n\t\t\t\t\tif ( 'terms_of_use' === $key && 0 === strpos( $metadata[$key], 'yright notice.' ) )\n\t\t\t\t\t\t$metadata[$key] = 'Cop' . $metadata[$key];\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( ! empty( $data['id3v2']['APIC'] ) ) {\n\t\t$image = reset( $data['id3v2']['APIC']);\n\t\tif ( ! empty( $image['data'] ) ) {\n\t\t\t$metadata['image'] = array(\n\t\t\t\t'data' => $image['data'],\n\t\t\t\t'mime' => $image['image_mime'],\n\t\t\t\t'width' => $image['image_width'],\n\t\t\t\t'height' => $image['image_height']\n\t\t\t);\n\t\t}\n\t} elseif ( ! empty( $data['comments']['picture'] ) ) {\n\t\t$image = reset( $data['comments']['picture'] );\n\t\tif ( ! empty( $image['data'] ) ) {\n\t\t\t$metadata['image'] = array(\n\t\t\t\t'data' => $image['data'],\n\t\t\t\t'mime' => $image['image_mime']\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Retrieve metadata from a video file's ID3 tags\n *\n * @since 3.6.0\n *\n * @param string $file Path to file.\n * @return array|bool Returns array of metadata, if found.\n */\nfunction wp_read_video_metadata( $file ) {\n\tif ( ! file_exists( $file ) ) {\n\t\treturn false;\n\t}\n\n\t$metadata = array();\n\n\tif ( ! defined( 'GETID3_TEMP_DIR' ) ) {\n\t\tdefine( 'GETID3_TEMP_DIR', get_temp_dir() );\n\t}\n\n\tif ( ! class_exists( 'getID3', false ) ) {\n\t\trequire( ABSPATH . WPINC . '/ID3/getid3.php' );\n\t}\n\t$id3 = new getID3();\n\t$data = $id3->analyze( $file );\n\n\tif ( isset( $data['video']['lossless'] ) )\n\t\t$metadata['lossless'] = $data['video']['lossless'];\n\tif ( ! empty( $data['video']['bitrate'] ) )\n\t\t$metadata['bitrate'] = (int) $data['video']['bitrate'];\n\tif ( ! empty( $data['video']['bitrate_mode'] ) )\n\t\t$metadata['bitrate_mode'] = $data['video']['bitrate_mode'];\n\tif ( ! empty( $data['filesize'] ) )\n\t\t$metadata['filesize'] = (int) $data['filesize'];\n\tif ( ! empty( $data['mime_type'] ) )\n\t\t$metadata['mime_type'] = $data['mime_type'];\n\tif ( ! empty( $data['playtime_seconds'] ) )\n\t\t$metadata['length'] = (int) round( $data['playtime_seconds'] );\n\tif ( ! empty( $data['playtime_string'] ) )\n\t\t$metadata['length_formatted'] = $data['playtime_string'];\n\tif ( ! empty( $data['video']['resolution_x'] ) )\n\t\t$metadata['width'] = (int) $data['video']['resolution_x'];\n\tif ( ! empty( $data['video']['resolution_y'] ) )\n\t\t$metadata['height'] = (int) $data['video']['resolution_y'];\n\tif ( ! empty( $data['fileformat'] ) )\n\t\t$metadata['fileformat'] = $data['fileformat'];\n\tif ( ! empty( $data['video']['dataformat'] ) )\n\t\t$metadata['dataformat'] = $data['video']['dataformat'];\n\tif ( ! empty( $data['video']['encoder'] ) )\n\t\t$metadata['encoder'] = $data['video']['encoder'];\n\tif ( ! empty( $data['video']['codec'] ) )\n\t\t$metadata['codec'] = $data['video']['codec'];\n\n\tif ( ! empty( $data['audio'] ) ) {\n\t\tunset( $data['audio']['streams'] );\n\t\t$metadata['audio'] = $data['audio'];\n\t}\n\n\twp_add_id3_tag_data( $metadata, $data );\n\n\treturn $metadata;\n}\n\n/**\n * Retrieve metadata from a audio file's ID3 tags\n *\n * @since 3.6.0\n *\n * @param string $file Path to file.\n * @return array|bool Returns array of metadata, if found.\n */\nfunction wp_read_audio_metadata( $file ) {\n\tif ( ! file_exists( $file ) ) {\n\t\treturn false;\n\t}\n\t$metadata = array();\n\n\tif ( ! defined( 'GETID3_TEMP_DIR' ) ) {\n\t\tdefine( 'GETID3_TEMP_DIR', get_temp_dir() );\n\t}\n\n\tif ( ! class_exists( 'getID3', false ) ) {\n\t\trequire( ABSPATH . WPINC . '/ID3/getid3.php' );\n\t}\n\t$id3 = new getID3();\n\t$data = $id3->analyze( $file );\n\n\tif ( ! empty( $data['audio'] ) ) {\n\t\tunset( $data['audio']['streams'] );\n\t\t$metadata = $data['audio'];\n\t}\n\n\tif ( ! empty( $data['fileformat'] ) )\n\t\t$metadata['fileformat'] = $data['fileformat'];\n\tif ( ! empty( $data['filesize'] ) )\n\t\t$metadata['filesize'] = (int) $data['filesize'];\n\tif ( ! empty( $data['mime_type'] ) )\n\t\t$metadata['mime_type'] = $data['mime_type'];\n\tif ( ! empty( $data['playtime_seconds'] ) )\n\t\t$metadata['length'] = (int) round( $data['playtime_seconds'] );\n\tif ( ! empty( $data['playtime_string'] ) )\n\t\t$metadata['length_formatted'] = $data['playtime_string'];\n\n\twp_add_id3_tag_data( $metadata, $data );\n\n\treturn $metadata;\n}\n\n/**\n * Encapsulate logic for Attach/Detach actions\n *\n * @since 4.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $parent_id Attachment parent ID.\n * @param string $action    Optional. Attach/detach action. Accepts 'attach' or 'detach'.\n *                          Default 'attach'.\n */\nfunction wp_media_attach_action( $parent_id, $action = 'attach' ) {\n\tglobal $wpdb;\n\n\tif ( ! $parent_id ) {\n\t\treturn;\n\t}\n\n\tif ( ! current_user_can( 'edit_post', $parent_id ) ) {\n\t\twp_die( __( 'You are not allowed to edit this post.' ) );\n\t}\n\t$ids = array();\n\tforeach ( (array) $_REQUEST['media'] as $att_id ) {\n\t\t$att_id = (int) $att_id;\n\n\t\tif ( ! current_user_can( 'edit_post', $att_id ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$ids[] = $att_id;\n\t}\n\n\tif ( ! empty( $ids ) ) {\n\t\t$ids_string = implode( ',', $ids );\n\t\tif ( 'attach' === $action ) {\n\t\t\t$result = $wpdb->query( $wpdb->prepare( \"UPDATE $wpdb->posts SET post_parent = %d WHERE post_type = 'attachment' AND ID IN ( $ids_string )\", $parent_id ) );\n\t\t} else {\n\t\t\t$result = $wpdb->query( \"UPDATE $wpdb->posts SET post_parent = 0 WHERE post_type = 'attachment' AND ID IN ( $ids_string )\" );\n\t\t}\n\n\t\tforeach ( $ids as $att_id ) {\n\t\t\tclean_attachment_cache( $att_id );\n\t\t}\n\t}\n\n\tif ( isset( $result ) ) {\n\t\t$location = 'upload.php';\n\t\tif ( $referer = wp_get_referer() ) {\n\t\t\tif ( false !== strpos( $referer, 'upload.php' ) ) {\n\t\t\t\t$location = remove_query_arg( array( 'attached', 'detach' ), $referer );\n\t\t\t}\n\t\t}\n\n\t\t$key = 'attach' === $action ? 'attached' : 'detach';\n\t\t$location = add_query_arg( array( $key => $result ), $location );\n\t\twp_redirect( $location );\n\t\texit;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/menu.php",
    "content": "<?php\n/**\n * Build Administration Menu.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\nif ( is_network_admin() ) {\n\n\t/**\n\t * Fires before the administration menu loads in the Network Admin.\n\t *\n\t * The hook fires before menus and sub-menus are removed based on user privileges.\n\t *\n\t * @private\n\t * @since 3.1.0\n\t */\n\tdo_action( '_network_admin_menu' );\n} elseif ( is_user_admin() ) {\n\n\t/**\n\t * Fires before the administration menu loads in the User Admin.\n\t *\n\t * The hook fires before menus and sub-menus are removed based on user privileges.\n\t *\n\t * @private\n\t * @since 3.1.0\n\t */\n\tdo_action( '_user_admin_menu' );\n} else {\n\n\t/**\n\t * Fires before the administration menu loads in the admin.\n\t *\n\t * The hook fires before menus and sub-menus are removed based on user privileges.\n\t *\n\t * @private\n\t * @since 2.2.0\n\t */\n\tdo_action( '_admin_menu' );\n}\n\n// Create list of page plugin hook names.\nforeach ($menu as $menu_page) {\n\tif ( false !== $pos = strpos($menu_page[2], '?') ) {\n\t\t// Handle post_type=post|page|foo pages.\n\t\t$hook_name = substr($menu_page[2], 0, $pos);\n\t\t$hook_args = substr($menu_page[2], $pos + 1);\n\t\twp_parse_str($hook_args, $hook_args);\n\t\t// Set the hook name to be the post type.\n\t\tif ( isset($hook_args['post_type']) )\n\t\t\t$hook_name = $hook_args['post_type'];\n\t\telse\n\t\t\t$hook_name = basename($hook_name, '.php');\n\t\tunset($hook_args);\n\t} else {\n\t\t$hook_name = basename($menu_page[2], '.php');\n\t}\n\t$hook_name = sanitize_title($hook_name);\n\n\tif ( isset($compat[$hook_name]) )\n\t\t$hook_name = $compat[$hook_name];\n\telseif ( !$hook_name )\n\t\tcontinue;\n\n\t$admin_page_hooks[$menu_page[2]] = $hook_name;\n}\nunset($menu_page, $compat);\n\n$_wp_submenu_nopriv = array();\n$_wp_menu_nopriv = array();\n// Loop over submenus and remove pages for which the user does not have privs.\nforeach ($submenu as $parent => $sub) {\n\tforeach ($sub as $index => $data) {\n\t\tif ( ! current_user_can($data[1]) ) {\n\t\t\tunset($submenu[$parent][$index]);\n\t\t\t$_wp_submenu_nopriv[$parent][$data[2]] = true;\n\t\t}\n\t}\n\tunset($index, $data);\n\n\tif ( empty($submenu[$parent]) )\n\t\tunset($submenu[$parent]);\n}\nunset($sub, $parent);\n\n/*\n * Loop over the top-level menu.\n * Menus for which the original parent is not accessible due to lack of privileges\n * will have the next submenu in line be assigned as the new menu parent.\n */\nforeach ( $menu as $id => $data ) {\n\tif ( empty($submenu[$data[2]]) )\n\t\tcontinue;\n\t$subs = $submenu[$data[2]];\n\t$first_sub = reset( $subs );\n\t$old_parent = $data[2];\n\t$new_parent = $first_sub[2];\n\t/*\n\t * If the first submenu is not the same as the assigned parent,\n\t * make the first submenu the new parent.\n\t */\n\tif ( $new_parent != $old_parent ) {\n\t\t$_wp_real_parent_file[$old_parent] = $new_parent;\n\t\t$menu[$id][2] = $new_parent;\n\n\t\tforeach ($submenu[$old_parent] as $index => $data) {\n\t\t\t$submenu[$new_parent][$index] = $submenu[$old_parent][$index];\n\t\t\tunset($submenu[$old_parent][$index]);\n\t\t}\n\t\tunset($submenu[$old_parent], $index);\n\n\t\tif ( isset($_wp_submenu_nopriv[$old_parent]) )\n\t\t\t$_wp_submenu_nopriv[$new_parent] = $_wp_submenu_nopriv[$old_parent];\n\t}\n}\nunset($id, $data, $subs, $first_sub, $old_parent, $new_parent);\n\nif ( is_network_admin() ) {\n\n\t/**\n\t * Fires before the administration menu loads in the Network Admin.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $context Empty context.\n\t */\n\tdo_action( 'network_admin_menu', '' );\n} elseif ( is_user_admin() ) {\n\n\t/**\n\t * Fires before the administration menu loads in the User Admin.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $context Empty context.\n\t */\n\tdo_action( 'user_admin_menu', '' );\n} else {\n\n\t/**\n\t * Fires before the administration menu loads in the admin.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $context Empty context.\n\t */\n\tdo_action( 'admin_menu', '' );\n}\n\n/*\n * Remove menus that have no accessible submenus and require privileges\n * that the user does not have. Run re-parent loop again.\n */\nforeach ( $menu as $id => $data ) {\n\tif ( ! current_user_can($data[1]) )\n\t\t$_wp_menu_nopriv[$data[2]] = true;\n\n\t/*\n\t * If there is only one submenu and it is has same destination as the parent,\n\t * remove the submenu.\n\t */\n\tif ( ! empty( $submenu[$data[2]] ) && 1 == count ( $submenu[$data[2]] ) ) {\n\t\t$subs = $submenu[$data[2]];\n\t\t$first_sub = reset( $subs );\n\t\tif ( $data[2] == $first_sub[2] )\n\t\t\tunset( $submenu[$data[2]] );\n\t}\n\n\t// If submenu is empty...\n\tif ( empty($submenu[$data[2]]) ) {\n\t\t// And user doesn't have privs, remove menu.\n\t\tif ( isset( $_wp_menu_nopriv[$data[2]] ) ) {\n\t\t\tunset($menu[$id]);\n\t\t}\n\t}\n}\nunset($id, $data, $subs, $first_sub);\n\n/**\n *\n * @param string $add\n * @param string $class\n * @return string\n */\nfunction add_cssclass($add, $class) {\n\t$class = empty($class) ? $add : $class .= ' ' . $add;\n\treturn $class;\n}\n\n/**\n *\n * @param array $menu\n * @return array\n */\nfunction add_menu_classes($menu) {\n\t$first = $lastorder = false;\n\t$i = 0;\n\t$mc = count($menu);\n\tforeach ( $menu as $order => $top ) {\n\t\t$i++;\n\n\t\tif ( 0 == $order ) { // dashboard is always shown/single\n\t\t\t$menu[0][4] = add_cssclass('menu-top-first', $top[4]);\n\t\t\t$lastorder = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( 0 === strpos($top[2], 'separator') && false !== $lastorder ) { // if separator\n\t\t\t$first = true;\n\t\t\t$c = $menu[$lastorder][4];\n\t\t\t$menu[$lastorder][4] = add_cssclass('menu-top-last', $c);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( $first ) {\n\t\t\t$c = $menu[$order][4];\n\t\t\t$menu[$order][4] = add_cssclass('menu-top-first', $c);\n\t\t\t$first = false;\n\t\t}\n\n\t\tif ( $mc == $i ) { // last item\n\t\t\t$c = $menu[$order][4];\n\t\t\t$menu[$order][4] = add_cssclass('menu-top-last', $c);\n\t\t}\n\n\t\t$lastorder = $order;\n\t}\n\n\t/**\n\t * Filter administration menus array with classes added for top-level items.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array $menu Associative array of administration menu items.\n\t */\n\treturn apply_filters( 'add_menu_classes', $menu );\n}\n\nuksort($menu, \"strnatcasecmp\"); // make it all pretty\n\n/**\n * Filter whether to enable custom ordering of the administration menu.\n *\n * See the {@see 'menu_order'} filter for reordering menu items.\n *\n * @since 2.8.0\n *\n * @param bool $custom Whether custom ordering is enabled. Default false.\n */\nif ( apply_filters( 'custom_menu_order', false ) ) {\n\t$menu_order = array();\n\tforeach ( $menu as $menu_item ) {\n\t\t$menu_order[] = $menu_item[2];\n\t}\n\tunset($menu_item);\n\t$default_menu_order = $menu_order;\n\n\t/**\n\t * Filter the order of administration menu items.\n\t *\n\t * A truthy value must first be passed to the {@see 'custom_menu_order'} filter\n\t * for this filter to work. Use the following to enable custom menu ordering:\n\t *\n\t *     add_filter( 'custom_menu_order', '__return_true' );\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $menu_order An ordered array of menu items.\n\t */\n\t$menu_order = apply_filters( 'menu_order', $menu_order );\n\t$menu_order = array_flip($menu_order);\n\t$default_menu_order = array_flip($default_menu_order);\n\n\t/**\n\t *\n\t * @global array $menu_order\n\t * @global array $default_menu_order\n\t *\n\t * @param array $a\n\t * @param array $b\n\t * @return int\n\t */\n\tfunction sort_menu($a, $b) {\n\t\tglobal $menu_order, $default_menu_order;\n\t\t$a = $a[2];\n\t\t$b = $b[2];\n\t\tif ( isset($menu_order[$a]) && !isset($menu_order[$b]) ) {\n\t\t\treturn -1;\n\t\t} elseif ( !isset($menu_order[$a]) && isset($menu_order[$b]) ) {\n\t\t\treturn 1;\n\t\t} elseif ( isset($menu_order[$a]) && isset($menu_order[$b]) ) {\n\t\t\tif ( $menu_order[$a] == $menu_order[$b] )\n\t\t\t\treturn 0;\n\t\t\treturn ($menu_order[$a] < $menu_order[$b]) ? -1 : 1;\n\t\t} else {\n\t\t\treturn ($default_menu_order[$a] <= $default_menu_order[$b]) ? -1 : 1;\n\t\t}\n\t}\n\n\tusort($menu, 'sort_menu');\n\tunset($menu_order, $default_menu_order);\n}\n\n// Prevent adjacent separators\n$prev_menu_was_separator = false;\nforeach ( $menu as $id => $data ) {\n\tif ( false === stristr( $data[4], 'wp-menu-separator' ) ) {\n\n\t\t// This item is not a separator, so falsey the toggler and do nothing\n\t\t$prev_menu_was_separator = false;\n\t} else {\n\n\t\t// The previous item was a separator, so unset this one\n\t\tif ( true === $prev_menu_was_separator ) {\n\t\t\tunset( $menu[ $id ] );\n\t\t}\n\n\t\t// This item is a separator, so truthy the toggler and move on\n\t\t$prev_menu_was_separator = true;\n\t}\n}\nunset( $id, $data, $prev_menu_was_separator );\n\n// Remove the last menu item if it is a separator.\n$last_menu_key = array_keys( $menu );\n$last_menu_key = array_pop( $last_menu_key );\nif ( !empty( $menu ) && 'wp-menu-separator' == $menu[ $last_menu_key ][ 4 ] )\n\tunset( $menu[ $last_menu_key ] );\nunset( $last_menu_key );\n\nif ( !user_can_access_admin_page() ) {\n\n\t/**\n\t * Fires when access to an admin page is denied.\n\t *\n\t * @since 2.5.0\n\t */\n\tdo_action( 'admin_page_access_denied' );\n\n\twp_die( __( 'You do not have sufficient permissions to access this page.' ), 403 );\n}\n\n$menu = add_menu_classes($menu);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/meta-boxes.php",
    "content": "<?php\n\n// -- Post related Meta Boxes\n\n/**\n * Displays post submit form fields.\n *\n * @since 2.7.0\n *\n * @global string $action\n *\n * @param WP_Post  $post Current post object.\n * @param array    $args {\n *     Array of arguments for building the post submit meta box.\n *\n *     @type string   $id       Meta box ID.\n *     @type string   $title    Meta box title.\n *     @type callable $callback Meta box display callback.\n *     @type array    $args     Extra meta box arguments.\n * }\n */\nfunction post_submit_meta_box( $post, $args = array() ) {\n\tglobal $action;\n\n\t$post_type = $post->post_type;\n\t$post_type_object = get_post_type_object($post_type);\n\t$can_publish = current_user_can($post_type_object->cap->publish_posts);\n?>\n<div class=\"submitbox\" id=\"submitpost\">\n\n<div id=\"minor-publishing\">\n\n<?php // Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key ?>\n<div style=\"display:none;\">\n<?php submit_button( __( 'Save' ), 'button', 'save' ); ?>\n</div>\n\n<div id=\"minor-publishing-actions\">\n<div id=\"save-action\">\n<?php if ( 'publish' != $post->post_status && 'future' != $post->post_status && 'pending' != $post->post_status ) { ?>\n<input <?php if ( 'private' == $post->post_status ) { ?>style=\"display:none\"<?php } ?> type=\"submit\" name=\"save\" id=\"save-post\" value=\"<?php esc_attr_e('Save Draft'); ?>\" class=\"button\" />\n<span class=\"spinner\"></span>\n<?php } elseif ( 'pending' == $post->post_status && $can_publish ) { ?>\n<input type=\"submit\" name=\"save\" id=\"save-post\" value=\"<?php esc_attr_e('Save as Pending'); ?>\" class=\"button\" />\n<span class=\"spinner\"></span>\n<?php } ?>\n</div>\n<?php if ( is_post_type_viewable( $post_type_object ) ) : ?>\n<div id=\"preview-action\">\n<?php\n$preview_link = esc_url( get_preview_post_link( $post ) );\nif ( 'publish' == $post->post_status ) {\n\t$preview_button = __( 'Preview Changes' );\n} else {\n\t$preview_button = __( 'Preview' );\n}\n?>\n<a class=\"preview button\" href=\"<?php echo $preview_link; ?>\" target=\"wp-preview-<?php echo (int) $post->ID; ?>\" id=\"post-preview\"><?php echo $preview_button; ?></a>\n<input type=\"hidden\" name=\"wp-preview\" id=\"wp-preview\" value=\"\" />\n</div>\n<?php endif; // public post type ?>\n<?php\n/**\n * Fires before the post time/date setting in the Publish meta box.\n *\n * @since 4.4.0\n *\n * @param WP_Post $post WP_Post object for the current post.\n */\ndo_action( 'post_submitbox_minor_actions', $post );\n?>\n<div class=\"clear\"></div>\n</div><!-- #minor-publishing-actions -->\n\n<div id=\"misc-publishing-actions\">\n\n<div class=\"misc-pub-section misc-pub-post-status\"><label for=\"post_status\"><?php _e('Status:') ?></label>\n<span id=\"post-status-display\">\n<?php\nswitch ( $post->post_status ) {\n\tcase 'private':\n\t\t_e('Privately Published');\n\t\tbreak;\n\tcase 'publish':\n\t\t_e('Published');\n\t\tbreak;\n\tcase 'future':\n\t\t_e('Scheduled');\n\t\tbreak;\n\tcase 'pending':\n\t\t_e('Pending Review');\n\t\tbreak;\n\tcase 'draft':\n\tcase 'auto-draft':\n\t\t_e('Draft');\n\t\tbreak;\n}\n?>\n</span>\n<?php if ( 'publish' == $post->post_status || 'private' == $post->post_status || $can_publish ) { ?>\n<a href=\"#post_status\" <?php if ( 'private' == $post->post_status ) { ?>style=\"display:none;\" <?php } ?>class=\"edit-post-status hide-if-no-js\"><span aria-hidden=\"true\"><?php _e( 'Edit' ); ?></span> <span class=\"screen-reader-text\"><?php _e( 'Edit status' ); ?></span></a>\n\n<div id=\"post-status-select\" class=\"hide-if-js\">\n<input type=\"hidden\" name=\"hidden_post_status\" id=\"hidden_post_status\" value=\"<?php echo esc_attr( ('auto-draft' == $post->post_status ) ? 'draft' : $post->post_status); ?>\" />\n<select name='post_status' id='post_status'>\n<?php if ( 'publish' == $post->post_status ) : ?>\n<option<?php selected( $post->post_status, 'publish' ); ?> value='publish'><?php _e('Published') ?></option>\n<?php elseif ( 'private' == $post->post_status ) : ?>\n<option<?php selected( $post->post_status, 'private' ); ?> value='publish'><?php _e('Privately Published') ?></option>\n<?php elseif ( 'future' == $post->post_status ) : ?>\n<option<?php selected( $post->post_status, 'future' ); ?> value='future'><?php _e('Scheduled') ?></option>\n<?php endif; ?>\n<option<?php selected( $post->post_status, 'pending' ); ?> value='pending'><?php _e('Pending Review') ?></option>\n<?php if ( 'auto-draft' == $post->post_status ) : ?>\n<option<?php selected( $post->post_status, 'auto-draft' ); ?> value='draft'><?php _e('Draft') ?></option>\n<?php else : ?>\n<option<?php selected( $post->post_status, 'draft' ); ?> value='draft'><?php _e('Draft') ?></option>\n<?php endif; ?>\n</select>\n <a href=\"#post_status\" class=\"save-post-status hide-if-no-js button\"><?php _e('OK'); ?></a>\n <a href=\"#post_status\" class=\"cancel-post-status hide-if-no-js button-cancel\"><?php _e('Cancel'); ?></a>\n</div>\n\n<?php } ?>\n</div><!-- .misc-pub-section -->\n\n<div class=\"misc-pub-section misc-pub-visibility\" id=\"visibility\">\n<?php _e('Visibility:'); ?> <span id=\"post-visibility-display\"><?php\n\nif ( 'private' == $post->post_status ) {\n\t$post->post_password = '';\n\t$visibility = 'private';\n\t$visibility_trans = __('Private');\n} elseif ( !empty( $post->post_password ) ) {\n\t$visibility = 'password';\n\t$visibility_trans = __('Password protected');\n} elseif ( $post_type == 'post' && is_sticky( $post->ID ) ) {\n\t$visibility = 'public';\n\t$visibility_trans = __('Public, Sticky');\n} else {\n\t$visibility = 'public';\n\t$visibility_trans = __('Public');\n}\n\necho esc_html( $visibility_trans ); ?></span>\n<?php if ( $can_publish ) { ?>\n<a href=\"#visibility\" class=\"edit-visibility hide-if-no-js\"><span aria-hidden=\"true\"><?php _e( 'Edit' ); ?></span> <span class=\"screen-reader-text\"><?php _e( 'Edit visibility' ); ?></span></a>\n\n<div id=\"post-visibility-select\" class=\"hide-if-js\">\n<input type=\"hidden\" name=\"hidden_post_password\" id=\"hidden-post-password\" value=\"<?php echo esc_attr($post->post_password); ?>\" />\n<?php if ($post_type == 'post'): ?>\n<input type=\"checkbox\" style=\"display:none\" name=\"hidden_post_sticky\" id=\"hidden-post-sticky\" value=\"sticky\" <?php checked(is_sticky($post->ID)); ?> />\n<?php endif; ?>\n<input type=\"hidden\" name=\"hidden_post_visibility\" id=\"hidden-post-visibility\" value=\"<?php echo esc_attr( $visibility ); ?>\" />\n<input type=\"radio\" name=\"visibility\" id=\"visibility-radio-public\" value=\"public\" <?php checked( $visibility, 'public' ); ?> /> <label for=\"visibility-radio-public\" class=\"selectit\"><?php _e('Public'); ?></label><br />\n<?php if ( $post_type == 'post' && current_user_can( 'edit_others_posts' ) ) : ?>\n<span id=\"sticky-span\"><input id=\"sticky\" name=\"sticky\" type=\"checkbox\" value=\"sticky\" <?php checked( is_sticky( $post->ID ) ); ?> /> <label for=\"sticky\" class=\"selectit\"><?php _e( 'Stick this post to the front page' ); ?></label><br /></span>\n<?php endif; ?>\n<input type=\"radio\" name=\"visibility\" id=\"visibility-radio-password\" value=\"password\" <?php checked( $visibility, 'password' ); ?> /> <label for=\"visibility-radio-password\" class=\"selectit\"><?php _e('Password protected'); ?></label><br />\n<span id=\"password-span\"><label for=\"post_password\"><?php _e('Password:'); ?></label> <input type=\"text\" name=\"post_password\" id=\"post_password\" value=\"<?php echo esc_attr($post->post_password); ?>\"  maxlength=\"20\" /><br /></span>\n<input type=\"radio\" name=\"visibility\" id=\"visibility-radio-private\" value=\"private\" <?php checked( $visibility, 'private' ); ?> /> <label for=\"visibility-radio-private\" class=\"selectit\"><?php _e('Private'); ?></label><br />\n\n<p>\n <a href=\"#visibility\" class=\"save-post-visibility hide-if-no-js button\"><?php _e('OK'); ?></a>\n <a href=\"#visibility\" class=\"cancel-post-visibility hide-if-no-js button-cancel\"><?php _e('Cancel'); ?></a>\n</p>\n</div>\n<?php } ?>\n\n</div><!-- .misc-pub-section -->\n\n<?php\n/* translators: Publish box date format, see http://php.net/date */\n$datef = __( 'M j, Y @ H:i' );\nif ( 0 != $post->ID ) {\n\tif ( 'future' == $post->post_status ) { // scheduled for publishing at a future date\n\t\t$stamp = __('Scheduled for: <b>%1$s</b>');\n\t} elseif ( 'publish' == $post->post_status || 'private' == $post->post_status ) { // already published\n\t\t$stamp = __('Published on: <b>%1$s</b>');\n\t} elseif ( '0000-00-00 00:00:00' == $post->post_date_gmt ) { // draft, 1 or more saves, no date specified\n\t\t$stamp = __('Publish <b>immediately</b>');\n\t} elseif ( time() < strtotime( $post->post_date_gmt . ' +0000' ) ) { // draft, 1 or more saves, future date specified\n\t\t$stamp = __('Schedule for: <b>%1$s</b>');\n\t} else { // draft, 1 or more saves, date specified\n\t\t$stamp = __('Publish on: <b>%1$s</b>');\n\t}\n\t$date = date_i18n( $datef, strtotime( $post->post_date ) );\n} else { // draft (no saves, and thus no date specified)\n\t$stamp = __('Publish <b>immediately</b>');\n\t$date = date_i18n( $datef, strtotime( current_time('mysql') ) );\n}\n\nif ( ! empty( $args['args']['revisions_count'] ) ) :\n\t$revisions_to_keep = wp_revisions_to_keep( $post );\n?>\n<div class=\"misc-pub-section misc-pub-revisions\">\n<?php\n\tif ( $revisions_to_keep > 0 && $revisions_to_keep <= $args['args']['revisions_count'] ) {\n\t\techo '<span title=\"' . esc_attr( sprintf( __( 'Your site is configured to keep only the last %s revisions.' ),\n\t\t\tnumber_format_i18n( $revisions_to_keep ) ) ) . '\">';\n\t\tprintf( __( 'Revisions: %s' ), '<b>' . number_format_i18n( $args['args']['revisions_count'] ) . '+</b>' );\n\t\techo '</span>';\n\t} else {\n\t\tprintf( __( 'Revisions: %s' ), '<b>' . number_format_i18n( $args['args']['revisions_count'] ) . '</b>' );\n\t}\n?>\n\t<a class=\"hide-if-no-js\" href=\"<?php echo esc_url( get_edit_post_link( $args['args']['revision_id'] ) ); ?>\"><span aria-hidden=\"true\"><?php _ex( 'Browse', 'revisions' ); ?></span> <span class=\"screen-reader-text\"><?php _e( 'Browse revisions' ); ?></span></a>\n</div>\n<?php endif;\n\nif ( $can_publish ) : // Contributors don't get to choose the date of publish ?>\n<div class=\"misc-pub-section curtime misc-pub-curtime\">\n\t<span id=\"timestamp\">\n\t<?php printf($stamp, $date); ?></span>\n\t<a href=\"#edit_timestamp\" class=\"edit-timestamp hide-if-no-js\"><span aria-hidden=\"true\"><?php _e( 'Edit' ); ?></span> <span class=\"screen-reader-text\"><?php _e( 'Edit date and time' ); ?></span></a>\n\t<fieldset id=\"timestampdiv\" class=\"hide-if-js\">\n\t<legend class=\"screen-reader-text\"><?php _e( 'Date and time' ); ?></legend>\n\t<?php touch_time( ( $action === 'edit' ), 1 ); ?>\n\t</fieldset>\n</div><?php // /misc-pub-section ?>\n<?php endif; ?>\n\n<?php\n/**\n * Fires after the post time/date setting in the Publish meta box.\n *\n * @since 2.9.0\n * @since 4.4.0 Added the `$post` parameter.\n *\n * @param WP_Post $post WP_Post object for the current post.\n */\ndo_action( 'post_submitbox_misc_actions', $post );\n?>\n</div>\n<div class=\"clear\"></div>\n</div>\n\n<div id=\"major-publishing-actions\">\n<?php\n/**\n * Fires at the beginning of the publishing actions section of the Publish meta box.\n *\n * @since 2.7.0\n */\ndo_action( 'post_submitbox_start' );\n?>\n<div id=\"delete-action\">\n<?php\nif ( current_user_can( \"delete_post\", $post->ID ) ) {\n\tif ( !EMPTY_TRASH_DAYS )\n\t\t$delete_text = __('Delete Permanently');\n\telse\n\t\t$delete_text = __('Move to Trash');\n\t?>\n<a class=\"submitdelete deletion\" href=\"<?php echo get_delete_post_link($post->ID); ?>\"><?php echo $delete_text; ?></a><?php\n} ?>\n</div>\n\n<div id=\"publishing-action\">\n<span class=\"spinner\"></span>\n<?php\nif ( !in_array( $post->post_status, array('publish', 'future', 'private') ) || 0 == $post->ID ) {\n\tif ( $can_publish ) :\n\t\tif ( !empty($post->post_date_gmt) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) : ?>\n\t\t<input name=\"original_publish\" type=\"hidden\" id=\"original_publish\" value=\"<?php esc_attr_e('Schedule') ?>\" />\n\t\t<?php submit_button( __( 'Schedule' ), 'primary button-large', 'publish', false ); ?>\n<?php\telse : ?>\n\t\t<input name=\"original_publish\" type=\"hidden\" id=\"original_publish\" value=\"<?php esc_attr_e('Publish') ?>\" />\n\t\t<?php submit_button( __( 'Publish' ), 'primary button-large', 'publish', false ); ?>\n<?php\tendif;\n\telse : ?>\n\t\t<input name=\"original_publish\" type=\"hidden\" id=\"original_publish\" value=\"<?php esc_attr_e('Submit for Review') ?>\" />\n\t\t<?php submit_button( __( 'Submit for Review' ), 'primary button-large', 'publish', false ); ?>\n<?php\n\tendif;\n} else { ?>\n\t\t<input name=\"original_publish\" type=\"hidden\" id=\"original_publish\" value=\"<?php esc_attr_e('Update') ?>\" />\n\t\t<input name=\"save\" type=\"submit\" class=\"button button-primary button-large\" id=\"publish\" value=\"<?php esc_attr_e( 'Update' ) ?>\" />\n<?php\n} ?>\n</div>\n<div class=\"clear\"></div>\n</div>\n</div>\n\n<?php\n}\n\n/**\n * Display attachment submit form fields.\n *\n * @since 3.5.0\n *\n * @param object $post\n */\nfunction attachment_submit_meta_box( $post ) {\n?>\n<div class=\"submitbox\" id=\"submitpost\">\n\n<div id=\"minor-publishing\">\n\n<?php // Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key ?>\n<div style=\"display:none;\">\n<?php submit_button( __( 'Save' ), 'button', 'save' ); ?>\n</div>\n\n\n<div id=\"misc-publishing-actions\">\n\t<?php\n\t/* translators: Publish box date format, see http://php.net/date */\n\t$datef = __( 'M j, Y @ H:i' );\n\t$stamp = __('Uploaded on: <b>%1$s</b>');\n\t$date = date_i18n( $datef, strtotime( $post->post_date ) );\n\t?>\n\t<div class=\"misc-pub-section curtime misc-pub-curtime\">\n\t\t<span id=\"timestamp\"><?php printf($stamp, $date); ?></span>\n\t</div><!-- .misc-pub-section -->\n\n\t<?php\n\t/**\n\t * Fires after the 'Uploaded on' section of the Save meta box\n\t * in the attachment editing screen.\n\t *\n\t * @since 3.5.0\n\t */\n\tdo_action( 'attachment_submitbox_misc_actions' );\n\t?>\n</div><!-- #misc-publishing-actions -->\n<div class=\"clear\"></div>\n</div><!-- #minor-publishing -->\n\n<div id=\"major-publishing-actions\">\n\t<div id=\"delete-action\">\n\t<?php\n\tif ( current_user_can( 'delete_post', $post->ID ) )\n\t\tif ( EMPTY_TRASH_DAYS && MEDIA_TRASH ) {\n\t\t\techo \"<a class='submitdelete deletion' href='\" . get_delete_post_link( $post->ID ) . \"'>\" . __( 'Trash' ) . \"</a>\";\n\t\t} else {\n\t\t\t$delete_ays = ! MEDIA_TRASH ? \" onclick='return showNotice.warn();'\" : '';\n\t\t\techo  \"<a class='submitdelete deletion'$delete_ays href='\" . get_delete_post_link( $post->ID, null, true ) . \"'>\" . __( 'Delete Permanently' ) . \"</a>\";\n\t\t}\n\t?>\n\t</div>\n\n\t<div id=\"publishing-action\">\n\t\t<span class=\"spinner\"></span>\n\t\t<input name=\"original_publish\" type=\"hidden\" id=\"original_publish\" value=\"<?php esc_attr_e('Update') ?>\" />\n\t\t<input name=\"save\" type=\"submit\" class=\"button-primary button-large\" id=\"publish\" value=\"<?php esc_attr_e( 'Update' ) ?>\" />\n\t</div>\n\t<div class=\"clear\"></div>\n</div><!-- #major-publishing-actions -->\n\n</div>\n\n<?php\n}\n\n/**\n * Display post format form elements.\n *\n * @since 3.1.0\n *\n * @param WP_Post $post Post object.\n * @param array   $box {\n *     Post formats meta box arguments.\n *\n *     @type string   $id       Meta box ID.\n *     @type string   $title    Meta box title.\n *     @type callable $callback Meta box display callback.\n *     @type array    $args     Extra meta box arguments.\n * }\n */\nfunction post_format_meta_box( $post, $box ) {\n\tif ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) ) :\n\t$post_formats = get_theme_support( 'post-formats' );\n\n\tif ( is_array( $post_formats[0] ) ) :\n\t\t$post_format = get_post_format( $post->ID );\n\t\tif ( !$post_format )\n\t\t\t$post_format = '0';\n\t\t// Add in the current one if it isn't there yet, in case the current theme doesn't support it\n\t\tif ( $post_format && !in_array( $post_format, $post_formats[0] ) )\n\t\t\t$post_formats[0][] = $post_format;\n\t?>\n\t<div id=\"post-formats-select\">\n\t\t<fieldset>\n\t\t\t<legend class=\"screen-reader-text\"><?php _e( 'Post Formats' ); ?></legend>\n\t\t\t<input type=\"radio\" name=\"post_format\" class=\"post-format\" id=\"post-format-0\" value=\"0\" <?php checked( $post_format, '0' ); ?> /> <label for=\"post-format-0\" class=\"post-format-icon post-format-standard\"><?php echo get_post_format_string( 'standard' ); ?></label>\n\t\t\t<?php foreach ( $post_formats[0] as $format ) : ?>\n\t\t\t<br /><input type=\"radio\" name=\"post_format\" class=\"post-format\" id=\"post-format-<?php echo esc_attr( $format ); ?>\" value=\"<?php echo esc_attr( $format ); ?>\" <?php checked( $post_format, $format ); ?> /> <label for=\"post-format-<?php echo esc_attr( $format ); ?>\" class=\"post-format-icon post-format-<?php echo esc_attr( $format ); ?>\"><?php echo esc_html( get_post_format_string( $format ) ); ?></label>\n\t\t\t<?php endforeach; ?>\n\t\t</fieldset>\n\t</div>\n\t<?php endif; endif;\n}\n\n/**\n * Display post tags form fields.\n *\n * @since 2.6.0\n *\n * @todo Create taxonomy-agnostic wrapper for this.\n *\n * @param WP_Post $post Post object.\n * @param array   $box {\n *     Tags meta box arguments.\n *\n *     @type string   $id       Meta box ID.\n *     @type string   $title    Meta box title.\n *     @type callable $callback Meta box display callback.\n *     @type array    $args {\n *         Extra meta box arguments.\n *\n *         @type string $taxonomy Taxonomy. Default 'post_tag'.\n *     }\n * }\n */\nfunction post_tags_meta_box( $post, $box ) {\n\t$defaults = array( 'taxonomy' => 'post_tag' );\n\tif ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {\n\t\t$args = array();\n\t} else {\n\t\t$args = $box['args'];\n\t}\n\t$r = wp_parse_args( $args, $defaults );\n\t$tax_name = esc_attr( $r['taxonomy'] );\n\t$taxonomy = get_taxonomy( $r['taxonomy'] );\n\t$user_can_assign_terms = current_user_can( $taxonomy->cap->assign_terms );\n\t$comma = _x( ',', 'tag delimiter' );\n\t$terms_to_edit = get_terms_to_edit( $post->ID, $tax_name );\n\tif ( ! is_string( $terms_to_edit ) ) {\n\t\t$terms_to_edit = '';\n\t}\n?>\n<div class=\"tagsdiv\" id=\"<?php echo $tax_name; ?>\">\n\t<div class=\"jaxtag\">\n\t<div class=\"nojs-tags hide-if-js\">\n\t\t<label for=\"tax-input-<?php echo $tax_name; ?>\"><?php echo $taxonomy->labels->add_or_remove_items; ?></label>\n\t\t<p><textarea name=\"<?php echo \"tax_input[$tax_name]\"; ?>\" rows=\"3\" cols=\"20\" class=\"the-tags\" id=\"tax-input-<?php echo $tax_name; ?>\" <?php disabled( ! $user_can_assign_terms ); ?> aria-describedby=\"new-tag-<?php echo $tax_name; ?>-desc\"><?php echo str_replace( ',', $comma . ' ', $terms_to_edit ); // textarea_escaped by esc_attr() ?></textarea></p>\n\t</div>\n \t<?php if ( $user_can_assign_terms ) : ?>\n\t<div class=\"ajaxtag hide-if-no-js\">\n\t\t<label class=\"screen-reader-text\" for=\"new-tag-<?php echo $tax_name; ?>\"><?php echo $taxonomy->labels->add_new_item; ?></label>\n\t\t<p><input type=\"text\" id=\"new-tag-<?php echo $tax_name; ?>\" name=\"newtag[<?php echo $tax_name; ?>]\" class=\"newtag form-input-tip\" size=\"16\" autocomplete=\"off\" aria-describedby=\"new-tag-<?php echo $tax_name; ?>-desc\" value=\"\" />\n\t\t<input type=\"button\" class=\"button tagadd\" value=\"<?php esc_attr_e('Add'); ?>\" /></p>\n\t</div>\n\t<p class=\"howto\" id=\"new-tag-<?php echo $tax_name; ?>-desc\"><?php echo $taxonomy->labels->separate_items_with_commas; ?></p>\n\t<?php endif; ?>\n\t</div>\n\t<div class=\"tagchecklist\"></div>\n</div>\n<?php if ( $user_can_assign_terms ) : ?>\n<p class=\"hide-if-no-js\"><a href=\"#titlediv\" class=\"tagcloud-link\" id=\"link-<?php echo $tax_name; ?>\"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p>\n<?php endif; ?>\n<?php\n}\n\n/**\n * Display post categories form fields.\n *\n * @since 2.6.0\n *\n * @todo Create taxonomy-agnostic wrapper for this.\n *\n * @param WP_Post $post Post object.\n * @param array   $box {\n *     Categories meta box arguments.\n *\n *     @type string   $id       Meta box ID.\n *     @type string   $title    Meta box title.\n *     @type callable $callback Meta box display callback.\n *     @type array    $args {\n *         Extra meta box arguments.\n *\n *         @type string $taxonomy Taxonomy. Default 'category'.\n *     }\n * }\n */\nfunction post_categories_meta_box( $post, $box ) {\n\t$defaults = array( 'taxonomy' => 'category' );\n\tif ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {\n\t\t$args = array();\n\t} else {\n\t\t$args = $box['args'];\n\t}\n\t$r = wp_parse_args( $args, $defaults );\n\t$tax_name = esc_attr( $r['taxonomy'] );\n\t$taxonomy = get_taxonomy( $r['taxonomy'] );\n\t?>\n\t<div id=\"taxonomy-<?php echo $tax_name; ?>\" class=\"categorydiv\">\n\t\t<ul id=\"<?php echo $tax_name; ?>-tabs\" class=\"category-tabs\">\n\t\t\t<li class=\"tabs\"><a href=\"#<?php echo $tax_name; ?>-all\"><?php echo $taxonomy->labels->all_items; ?></a></li>\n\t\t\t<li class=\"hide-if-no-js\"><a href=\"#<?php echo $tax_name; ?>-pop\"><?php _e( 'Most Used' ); ?></a></li>\n\t\t</ul>\n\n\t\t<div id=\"<?php echo $tax_name; ?>-pop\" class=\"tabs-panel\" style=\"display: none;\">\n\t\t\t<ul id=\"<?php echo $tax_name; ?>checklist-pop\" class=\"categorychecklist form-no-clear\" >\n\t\t\t\t<?php $popular_ids = wp_popular_terms_checklist( $tax_name ); ?>\n\t\t\t</ul>\n\t\t</div>\n\n\t\t<div id=\"<?php echo $tax_name; ?>-all\" class=\"tabs-panel\">\n\t\t\t<?php\n\t\t\t$name = ( $tax_name == 'category' ) ? 'post_category' : 'tax_input[' . $tax_name . ']';\n\t\t\techo \"<input type='hidden' name='{$name}[]' value='0' />\"; // Allows for an empty term set to be sent. 0 is an invalid Term ID and will be ignored by empty() checks.\n\t\t\t?>\n\t\t\t<ul id=\"<?php echo $tax_name; ?>checklist\" data-wp-lists=\"list:<?php echo $tax_name; ?>\" class=\"categorychecklist form-no-clear\">\n\t\t\t\t<?php wp_terms_checklist( $post->ID, array( 'taxonomy' => $tax_name, 'popular_cats' => $popular_ids ) ); ?>\n\t\t\t</ul>\n\t\t</div>\n\t<?php if ( current_user_can( $taxonomy->cap->edit_terms ) ) : ?>\n\t\t\t<div id=\"<?php echo $tax_name; ?>-adder\" class=\"wp-hidden-children\">\n\t\t\t\t<a id=\"<?php echo $tax_name; ?>-add-toggle\" href=\"#<?php echo $tax_name; ?>-add\" class=\"hide-if-no-js taxonomy-add-new\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\t/* translators: %s: add new taxonomy label */\n\t\t\t\t\t\tprintf( __( '+ %s' ), $taxonomy->labels->add_new_item );\n\t\t\t\t\t?>\n\t\t\t\t</a>\n\t\t\t\t<p id=\"<?php echo $tax_name; ?>-add\" class=\"category-add wp-hidden-child\">\n\t\t\t\t\t<label class=\"screen-reader-text\" for=\"new<?php echo $tax_name; ?>\"><?php echo $taxonomy->labels->add_new_item; ?></label>\n\t\t\t\t\t<input type=\"text\" name=\"new<?php echo $tax_name; ?>\" id=\"new<?php echo $tax_name; ?>\" class=\"form-required form-input-tip\" value=\"<?php echo esc_attr( $taxonomy->labels->new_item_name ); ?>\" aria-required=\"true\"/>\n\t\t\t\t\t<label class=\"screen-reader-text\" for=\"new<?php echo $tax_name; ?>_parent\">\n\t\t\t\t\t\t<?php echo $taxonomy->labels->parent_item_colon; ?>\n\t\t\t\t\t</label>\n\t\t\t\t\t<?php\n\t\t\t\t\t$parent_dropdown_args = array(\n\t\t\t\t\t\t'taxonomy'         => $tax_name,\n\t\t\t\t\t\t'hide_empty'       => 0,\n\t\t\t\t\t\t'name'             => 'new' . $tax_name . '_parent',\n\t\t\t\t\t\t'orderby'          => 'name',\n\t\t\t\t\t\t'hierarchical'     => 1,\n\t\t\t\t\t\t'show_option_none' => '&mdash; ' . $taxonomy->labels->parent_item . ' &mdash;',\n\t\t\t\t\t);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the arguments for the taxonomy parent dropdown on the Post Edit page.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 4.4.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param array $parent_dropdown_args {\n\t\t\t\t\t *     Optional. Array of arguments to generate parent dropdown.\n\t\t\t\t\t *\n\t\t\t\t\t *     @type string   $taxonomy         Name of the taxonomy to retrieve.\n\t\t\t\t\t *     @type bool     $hide_if_empty    True to skip generating markup if no\n\t\t\t\t\t *                                      categories are found. Default 0.\n\t\t\t\t\t *     @type string   $name             Value for the 'name' attribute\n\t\t\t\t\t *                                      of the select element.\n\t\t\t\t\t *                                      Default \"new{$tax_name}_parent\".\n\t\t\t\t\t *     @type string   $orderby          Which column to use for ordering\n\t\t\t\t\t *                                      terms. Default 'name'.\n\t\t\t\t\t *     @type bool|int $hierarchical     Whether to traverse the taxonomy\n\t\t\t\t\t *                                      hierarchy. Default 1.\n\t\t\t\t\t *     @type string   $show_option_none Text to display for the \"none\" option.\n\t\t\t\t\t *                                      Default \"&mdash; {$parent} &mdash;\",\n\t\t\t\t\t *                                      where `$parent` is 'parent_item'\n\t\t\t\t\t *                                      taxonomy label.\n\t\t\t\t\t * }\n\t\t\t\t\t */\n\t\t\t\t\t$parent_dropdown_args = apply_filters( 'post_edit_category_parent_dropdown_args', $parent_dropdown_args );\n\n\t\t\t\t\twp_dropdown_categories( $parent_dropdown_args );\n\t\t\t\t\t?>\n\t\t\t\t\t<input type=\"button\" id=\"<?php echo $tax_name; ?>-add-submit\" data-wp-lists=\"add:<?php echo $tax_name; ?>checklist:<?php echo $tax_name; ?>-add\" class=\"button category-add-submit\" value=\"<?php echo esc_attr( $taxonomy->labels->add_new_item ); ?>\" />\n\t\t\t\t\t<?php wp_nonce_field( 'add-' . $tax_name, '_ajax_nonce-add-' . $tax_name, false ); ?>\n\t\t\t\t\t<span id=\"<?php echo $tax_name; ?>-ajax-response\"></span>\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t<?php endif; ?>\n\t</div>\n\t<?php\n}\n\n/**\n * Display post excerpt form fields.\n *\n * @since 2.6.0\n *\n * @param object $post\n */\nfunction post_excerpt_meta_box($post) {\n?>\n<label class=\"screen-reader-text\" for=\"excerpt\"><?php _e('Excerpt') ?></label><textarea rows=\"1\" cols=\"40\" name=\"excerpt\" id=\"excerpt\"><?php echo $post->post_excerpt; // textarea_escaped ?></textarea>\n<p><?php _e('Excerpts are optional hand-crafted summaries of your content that can be used in your theme. <a href=\"https://codex.wordpress.org/Excerpt\" target=\"_blank\">Learn more about manual excerpts.</a>'); ?></p>\n<?php\n}\n\n/**\n * Display trackback links form fields.\n *\n * @since 2.6.0\n *\n * @param object $post\n */\nfunction post_trackback_meta_box($post) {\n\t$form_trackback = '<input type=\"text\" name=\"trackback_url\" id=\"trackback_url\" class=\"code\" value=\"'. esc_attr( str_replace(\"\\n\", ' ', $post->to_ping) ) .'\" />';\n\tif ('' != $post->pinged) {\n\t\t$pings = '<p>'. __('Already pinged:') . '</p><ul>';\n\t\t$already_pinged = explode(\"\\n\", trim($post->pinged));\n\t\tforeach ($already_pinged as $pinged_url) {\n\t\t\t$pings .= \"\\n\\t<li>\" . esc_html($pinged_url) . \"</li>\";\n\t\t}\n\t\t$pings .= '</ul>';\n\t}\n\n?>\n<p><label for=\"trackback_url\"><?php _e('Send trackbacks to:'); ?></label> <?php echo $form_trackback; ?><br /> (<?php _e('Separate multiple URLs with spaces'); ?>)</p>\n<p><?php _e('Trackbacks are a way to notify legacy blog systems that you&#8217;ve linked to them. If you link other WordPress sites, they&#8217;ll be notified automatically using <a href=\"https://codex.wordpress.org/Introduction_to_Blogging#Managing_Comments\" target=\"_blank\">pingbacks</a>, no other action necessary.'); ?></p>\n<?php\nif ( ! empty($pings) )\n\techo $pings;\n}\n\n/**\n * Display custom fields form fields.\n *\n * @since 2.6.0\n *\n * @param object $post\n */\nfunction post_custom_meta_box($post) {\n?>\n<div id=\"postcustomstuff\">\n<div id=\"ajax-response\"></div>\n<?php\n$metadata = has_meta($post->ID);\nforeach ( $metadata as $key => $value ) {\n\tif ( is_protected_meta( $metadata[ $key ][ 'meta_key' ], 'post' ) || ! current_user_can( 'edit_post_meta', $post->ID, $metadata[ $key ][ 'meta_key' ] ) )\n\t\tunset( $metadata[ $key ] );\n}\nlist_meta( $metadata );\nmeta_form( $post ); ?>\n</div>\n<p><?php _e('Custom fields can be used to add extra metadata to a post that you can <a href=\"https://codex.wordpress.org/Using_Custom_Fields\" target=\"_blank\">use in your theme</a>.'); ?></p>\n<?php\n}\n\n/**\n * Display comments status form fields.\n *\n * @since 2.6.0\n *\n * @param object $post\n */\nfunction post_comment_status_meta_box($post) {\n?>\n<input name=\"advanced_view\" type=\"hidden\" value=\"1\" />\n<p class=\"meta-options\">\n\t<label for=\"comment_status\" class=\"selectit\"><input name=\"comment_status\" type=\"checkbox\" id=\"comment_status\" value=\"open\" <?php checked($post->comment_status, 'open'); ?> /> <?php _e( 'Allow comments.' ) ?></label><br />\n\t<label for=\"ping_status\" class=\"selectit\"><input name=\"ping_status\" type=\"checkbox\" id=\"ping_status\" value=\"open\" <?php checked($post->ping_status, 'open'); ?> /> <?php printf( __( 'Allow <a href=\"%s\" target=\"_blank\">trackbacks and pingbacks</a> on this page.' ), __( 'https://codex.wordpress.org/Introduction_to_Blogging#Managing_Comments' ) ); ?></label>\n\t<?php\n\t/**\n\t * Fires at the end of the Discussion meta box on the post editing screen.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param WP_Post $post WP_Post object of the current post.\n\t */\n\tdo_action( 'post_comment_status_meta_box-options', $post );\n\t?>\n</p>\n<?php\n}\n\n/**\n * Display comments for post table header\n *\n * @since 3.0.0\n *\n * @param array $result table header rows\n * @return array\n */\nfunction post_comment_meta_box_thead($result) {\n\tunset($result['cb'], $result['response']);\n\treturn $result;\n}\n\n/**\n * Display comments for post.\n *\n * @since 2.8.0\n *\n * @param object $post\n */\nfunction post_comment_meta_box( $post ) {\n\twp_nonce_field( 'get-comments', 'add_comment_nonce', false );\n\t?>\n\t<p class=\"hide-if-no-js\" id=\"add-new-comment\"><a class=\"button\" href=\"#commentstatusdiv\" onclick=\"window.commentReply && commentReply.addcomment(<?php echo $post->ID; ?>);return false;\"><?php _e('Add comment'); ?></a></p>\n\t<?php\n\n\t$total = get_comments( array( 'post_id' => $post->ID, 'number' => 1, 'count' => true ) );\n\t$wp_list_table = _get_list_table('WP_Post_Comments_List_Table');\n\t$wp_list_table->display( true );\n\n\tif ( 1 > $total ) {\n\t\techo '<p id=\"no-comments\">' . __('No comments yet.') . '</p>';\n\t} else {\n\t\t$hidden = get_hidden_meta_boxes( get_current_screen() );\n\t\tif ( ! in_array('commentsdiv', $hidden) ) {\n\t\t\t?>\n\t\t\t<script type=\"text/javascript\">jQuery(document).ready(function(){commentsBox.get(<?php echo $total; ?>, 10);});</script>\n\t\t\t<?php\n\t\t}\n\n\t\t?>\n\t\t<p class=\"hide-if-no-js\" id=\"show-comments\"><a href=\"#commentstatusdiv\" onclick=\"commentsBox.load(<?php echo $total; ?>);return false;\"><?php _e('Show comments'); ?></a> <span class=\"spinner\"></span></p>\n\t\t<?php\n\t}\n\n\twp_comment_trashnotice();\n}\n\n/**\n * Display slug form fields.\n *\n * @since 2.6.0\n *\n * @param object $post\n */\nfunction post_slug_meta_box($post) {\n/** This filter is documented in wp-admin/edit-tag-form.php */\n$editable_slug = apply_filters( 'editable_slug', $post->post_name, $post );\n?>\n<label class=\"screen-reader-text\" for=\"post_name\"><?php _e('Slug') ?></label><input name=\"post_name\" type=\"text\" size=\"13\" id=\"post_name\" value=\"<?php echo esc_attr( $editable_slug ); ?>\" />\n<?php\n}\n\n/**\n * Display form field with list of authors.\n *\n * @since 2.6.0\n *\n * @global int $user_ID\n *\n * @param object $post\n */\nfunction post_author_meta_box($post) {\n\tglobal $user_ID;\n?>\n<label class=\"screen-reader-text\" for=\"post_author_override\"><?php _e('Author'); ?></label>\n<?php\n\twp_dropdown_users( array(\n\t\t'who' => 'authors',\n\t\t'name' => 'post_author_override',\n\t\t'selected' => empty($post->ID) ? $user_ID : $post->post_author,\n\t\t'include_selected' => true\n\t) );\n}\n\n/**\n * Display list of revisions.\n *\n * @since 2.6.0\n *\n * @param object $post\n */\nfunction post_revisions_meta_box( $post ) {\n\twp_list_post_revisions( $post );\n}\n\n// -- Page related Meta Boxes\n\n/**\n * Display page attributes form fields.\n *\n * @since 2.7.0\n *\n * @param object $post\n */\nfunction page_attributes_meta_box($post) {\n\t$post_type_object = get_post_type_object($post->post_type);\n\tif ( $post_type_object->hierarchical ) {\n\t\t$dropdown_args = array(\n\t\t\t'post_type'        => $post->post_type,\n\t\t\t'exclude_tree'     => $post->ID,\n\t\t\t'selected'         => $post->post_parent,\n\t\t\t'name'             => 'parent_id',\n\t\t\t'show_option_none' => __('(no parent)'),\n\t\t\t'sort_column'      => 'menu_order, post_title',\n\t\t\t'echo'             => 0,\n\t\t);\n\n\t\t/**\n\t\t * Filter the arguments used to generate a Pages drop-down element.\n\t\t *\n\t\t * @since 3.3.0\n\t\t *\n\t\t * @see wp_dropdown_pages()\n\t\t *\n\t\t * @param array   $dropdown_args Array of arguments used to generate the pages drop-down.\n\t\t * @param WP_Post $post          The current WP_Post object.\n\t\t */\n\t\t$dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post );\n\t\t$pages = wp_dropdown_pages( $dropdown_args );\n\t\tif ( ! empty($pages) ) {\n?>\n<p><strong><?php _e('Parent') ?></strong></p>\n<label class=\"screen-reader-text\" for=\"parent_id\"><?php _e('Parent') ?></label>\n<?php echo $pages; ?>\n<?php\n\t\t} // end empty pages check\n\t} // end hierarchical check.\n\tif ( 'page' == $post->post_type && 0 != count( get_page_templates( $post ) ) && get_option( 'page_for_posts' ) != $post->ID ) {\n\t\t$template = !empty($post->page_template) ? $post->page_template : false;\n\t\t?>\n<p><strong><?php _e('Template') ?></strong><?php\n\t/**\n\t * Fires immediately after the heading inside the 'Template' section\n\t * of the 'Page Attributes' meta box.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string  $template The template used for the current post.\n\t * @param WP_Post $post     The current post.\n\t */\n\tdo_action( 'page_attributes_meta_box_template', $template, $post );\n?></p>\n<label class=\"screen-reader-text\" for=\"page_template\"><?php _e('Page Template') ?></label><select name=\"page_template\" id=\"page_template\">\n<?php\n/**\n * Filter the title of the default page template displayed in the drop-down.\n *\n * @since 4.1.0\n *\n * @param string $label   The display value for the default page template title.\n * @param string $context Where the option label is displayed. Possible values\n *                        include 'meta-box' or 'quick-edit'.\n */\n$default_title = apply_filters( 'default_page_template_title',  __( 'Default Template' ), 'meta-box' );\n?>\n<option value=\"default\"><?php echo esc_html( $default_title ); ?></option>\n<?php page_template_dropdown($template); ?>\n</select>\n<?php\n\t} ?>\n<p><strong><?php _e('Order') ?></strong></p>\n<p><label class=\"screen-reader-text\" for=\"menu_order\"><?php _e('Order') ?></label><input name=\"menu_order\" type=\"text\" size=\"4\" id=\"menu_order\" value=\"<?php echo esc_attr($post->menu_order) ?>\" /></p>\n<?php if ( 'page' == $post->post_type && get_current_screen()->get_help_tabs() ) { ?>\n<p><?php _e( 'Need help? Use the Help tab in the upper right of your screen.' ); ?></p>\n<?php\n\t}\n}\n\n// -- Link related Meta Boxes\n\n/**\n * Display link create form fields.\n *\n * @since 2.7.0\n *\n * @param object $link\n */\nfunction link_submit_meta_box($link) {\n?>\n<div class=\"submitbox\" id=\"submitlink\">\n\n<div id=\"minor-publishing\">\n\n<?php // Hidden submit button early on so that the browser chooses the right button when form is submitted with Return key ?>\n<div style=\"display:none;\">\n<?php submit_button( __( 'Save' ), 'button', 'save', false ); ?>\n</div>\n\n<div id=\"minor-publishing-actions\">\n<div id=\"preview-action\">\n<?php if ( !empty($link->link_id) ) { ?>\n\t<a class=\"preview button\" href=\"<?php echo $link->link_url; ?>\" target=\"_blank\"><?php _e('Visit Link'); ?></a>\n<?php } ?>\n</div>\n<div class=\"clear\"></div>\n</div>\n\n<div id=\"misc-publishing-actions\">\n<div class=\"misc-pub-section misc-pub-private\">\n\t<label for=\"link_private\" class=\"selectit\"><input id=\"link_private\" name=\"link_visible\" type=\"checkbox\" value=\"N\" <?php checked($link->link_visible, 'N'); ?> /> <?php _e('Keep this link private') ?></label>\n</div>\n</div>\n\n</div>\n\n<div id=\"major-publishing-actions\">\n<?php\n/** This action is documented in wp-admin/includes/meta-boxes.php */\ndo_action( 'post_submitbox_start' );\n?>\n<div id=\"delete-action\">\n<?php\nif ( !empty($_GET['action']) && 'edit' == $_GET['action'] && current_user_can('manage_links') ) { ?>\n\t<a class=\"submitdelete deletion\" href=\"<?php echo wp_nonce_url(\"link.php?action=delete&amp;link_id=$link->link_id\", 'delete-bookmark_' . $link->link_id); ?>\" onclick=\"if ( confirm('<?php echo esc_js(sprintf(__(\"You are about to delete this link '%s'\\n  'Cancel' to stop, 'OK' to delete.\"), $link->link_name )); ?>') ) {return true;}return false;\"><?php _e('Delete'); ?></a>\n<?php } ?>\n</div>\n\n<div id=\"publishing-action\">\n<?php if ( !empty($link->link_id) ) { ?>\n\t<input name=\"save\" type=\"submit\" class=\"button-large button-primary\" id=\"publish\" value=\"<?php esc_attr_e( 'Update Link' ) ?>\" />\n<?php } else { ?>\n\t<input name=\"save\" type=\"submit\" class=\"button-large button-primary\" id=\"publish\" value=\"<?php esc_attr_e( 'Add Link' ) ?>\" />\n<?php } ?>\n</div>\n<div class=\"clear\"></div>\n</div>\n<?php\n/**\n * Fires at the end of the Publish box in the Link editing screen.\n *\n * @since 2.5.0\n */\ndo_action( 'submitlink_box' );\n?>\n<div class=\"clear\"></div>\n</div>\n<?php\n}\n\n/**\n * Display link categories form fields.\n *\n * @since 2.6.0\n *\n * @param object $link\n */\nfunction link_categories_meta_box($link) {\n?>\n<div id=\"taxonomy-linkcategory\" class=\"categorydiv\">\n\t<ul id=\"category-tabs\" class=\"category-tabs\">\n\t\t<li class=\"tabs\"><a href=\"#categories-all\"><?php _e( 'All Categories' ); ?></a></li>\n\t\t<li class=\"hide-if-no-js\"><a href=\"#categories-pop\"><?php _e( 'Most Used' ); ?></a></li>\n\t</ul>\n\n\t<div id=\"categories-all\" class=\"tabs-panel\">\n\t\t<ul id=\"categorychecklist\" data-wp-lists=\"list:category\" class=\"categorychecklist form-no-clear\">\n\t\t\t<?php\n\t\t\tif ( isset($link->link_id) )\n\t\t\t\twp_link_category_checklist($link->link_id);\n\t\t\telse\n\t\t\t\twp_link_category_checklist();\n\t\t\t?>\n\t\t</ul>\n\t</div>\n\n\t<div id=\"categories-pop\" class=\"tabs-panel\" style=\"display: none;\">\n\t\t<ul id=\"categorychecklist-pop\" class=\"categorychecklist form-no-clear\">\n\t\t\t<?php wp_popular_terms_checklist('link_category'); ?>\n\t\t</ul>\n\t</div>\n\n\t<div id=\"category-adder\" class=\"wp-hidden-children\">\n\t\t<a id=\"category-add-toggle\" href=\"#category-add\" class=\"taxonomy-add-new\"><?php _e( '+ Add New Category' ); ?></a>\n\t\t<p id=\"link-category-add\" class=\"wp-hidden-child\">\n\t\t\t<label class=\"screen-reader-text\" for=\"newcat\"><?php _e( '+ Add New Category' ); ?></label>\n\t\t\t<input type=\"text\" name=\"newcat\" id=\"newcat\" class=\"form-required form-input-tip\" value=\"<?php esc_attr_e( 'New category name' ); ?>\" aria-required=\"true\" />\n\t\t\t<input type=\"button\" id=\"link-category-add-submit\" data-wp-lists=\"add:categorychecklist:link-category-add\" class=\"button\" value=\"<?php esc_attr_e( 'Add' ); ?>\" />\n\t\t\t<?php wp_nonce_field( 'add-link-category', '_ajax_nonce', false ); ?>\n\t\t\t<span id=\"category-ajax-response\"></span>\n\t\t</p>\n\t</div>\n</div>\n<?php\n}\n\n/**\n * Display form fields for changing link target.\n *\n * @since 2.6.0\n *\n * @param object $link\n */\nfunction link_target_meta_box($link) { ?>\n<fieldset><legend class=\"screen-reader-text\"><span><?php _e('Target') ?></span></legend>\n<p><label for=\"link_target_blank\" class=\"selectit\">\n<input id=\"link_target_blank\" type=\"radio\" name=\"link_target\" value=\"_blank\" <?php echo ( isset( $link->link_target ) && ($link->link_target == '_blank') ? 'checked=\"checked\"' : ''); ?> />\n<?php _e('<code>_blank</code> &mdash; new window or tab.'); ?></label></p>\n<p><label for=\"link_target_top\" class=\"selectit\">\n<input id=\"link_target_top\" type=\"radio\" name=\"link_target\" value=\"_top\" <?php echo ( isset( $link->link_target ) && ($link->link_target == '_top') ? 'checked=\"checked\"' : ''); ?> />\n<?php _e('<code>_top</code> &mdash; current window or tab, with no frames.'); ?></label></p>\n<p><label for=\"link_target_none\" class=\"selectit\">\n<input id=\"link_target_none\" type=\"radio\" name=\"link_target\" value=\"\" <?php echo ( isset( $link->link_target ) && ($link->link_target == '') ? 'checked=\"checked\"' : ''); ?> />\n<?php _e('<code>_none</code> &mdash; same window or tab.'); ?></label></p>\n</fieldset>\n<p><?php _e('Choose the target frame for your link.'); ?></p>\n<?php\n}\n\n/**\n * Display checked checkboxes attribute for xfn microformat options.\n *\n * @since 1.0.1\n *\n * @global object $link\n *\n * @param string $class\n * @param string $value\n * @param mixed $deprecated Never used.\n */\nfunction xfn_check( $class, $value = '', $deprecated = '' ) {\n\tglobal $link;\n\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '0.0' ); // Never implemented\n\n\t$link_rel = isset( $link->link_rel ) ? $link->link_rel : ''; // In PHP 5.3: $link_rel = $link->link_rel ?: '';\n\t$rels = preg_split('/\\s+/', $link_rel);\n\n\tif ('' != $value && in_array($value, $rels) ) {\n\t\techo ' checked=\"checked\"';\n\t}\n\n\tif ('' == $value) {\n\t\tif ('family' == $class && strpos($link_rel, 'child') === false && strpos($link_rel, 'parent') === false && strpos($link_rel, 'sibling') === false && strpos($link_rel, 'spouse') === false && strpos($link_rel, 'kin') === false) echo ' checked=\"checked\"';\n\t\tif ('friendship' == $class && strpos($link_rel, 'friend') === false && strpos($link_rel, 'acquaintance') === false && strpos($link_rel, 'contact') === false) echo ' checked=\"checked\"';\n\t\tif ('geographical' == $class && strpos($link_rel, 'co-resident') === false && strpos($link_rel, 'neighbor') === false) echo ' checked=\"checked\"';\n\t\tif ('identity' == $class && in_array('me', $rels) ) echo ' checked=\"checked\"';\n\t}\n}\n\n/**\n * Display xfn form fields.\n *\n * @since 2.6.0\n *\n * @param object $link\n */\nfunction link_xfn_meta_box($link) {\n?>\n<table class=\"links-table\">\n\t<tr>\n\t\t<th scope=\"row\"><label for=\"link_rel\"><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('rel:') ?></label></th>\n\t\t<td><input type=\"text\" name=\"link_rel\" id=\"link_rel\" value=\"<?php echo ( isset( $link->link_rel ) ? esc_attr($link->link_rel) : ''); ?>\" /></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('identity') ?></th>\n\t\t<td><fieldset><legend class=\"screen-reader-text\"><span><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('identity') ?></span></legend>\n\t\t\t<label for=\"me\">\n\t\t\t<input type=\"checkbox\" name=\"identity\" value=\"me\" id=\"me\" <?php xfn_check('identity', 'me'); ?> />\n\t\t\t<?php _e('another web address of mine') ?></label>\n\t\t</fieldset></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('friendship') ?></th>\n\t\t<td><fieldset><legend class=\"screen-reader-text\"><span><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('friendship') ?></span></legend>\n\t\t\t<label for=\"contact\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"friendship\" value=\"contact\" id=\"contact\" <?php xfn_check('friendship', 'contact'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('contact') ?>\n\t\t\t</label>\n\t\t\t<label for=\"acquaintance\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"friendship\" value=\"acquaintance\" id=\"acquaintance\" <?php xfn_check('friendship', 'acquaintance'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('acquaintance') ?>\n\t\t\t</label>\n\t\t\t<label for=\"friend\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"friendship\" value=\"friend\" id=\"friend\" <?php xfn_check('friendship', 'friend'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('friend') ?>\n\t\t\t</label>\n\t\t\t<label for=\"friendship\">\n\t\t\t<input name=\"friendship\" type=\"radio\" class=\"valinp\" value=\"\" id=\"friendship\" <?php xfn_check('friendship'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('none') ?>\n\t\t\t</label>\n\t\t</fieldset></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('physical') ?> </th>\n\t\t<td><fieldset><legend class=\"screen-reader-text\"><span><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('physical') ?></span></legend>\n\t\t\t<label for=\"met\">\n\t\t\t<input class=\"valinp\" type=\"checkbox\" name=\"physical\" value=\"met\" id=\"met\" <?php xfn_check('physical', 'met'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('met') ?>\n\t\t\t</label>\n\t\t</fieldset></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('professional') ?> </th>\n\t\t<td><fieldset><legend class=\"screen-reader-text\"><span><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('professional') ?></span></legend>\n\t\t\t<label for=\"co-worker\">\n\t\t\t<input class=\"valinp\" type=\"checkbox\" name=\"professional\" value=\"co-worker\" id=\"co-worker\" <?php xfn_check('professional', 'co-worker'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('co-worker') ?>\n\t\t\t</label>\n\t\t\t<label for=\"colleague\">\n\t\t\t<input class=\"valinp\" type=\"checkbox\" name=\"professional\" value=\"colleague\" id=\"colleague\" <?php xfn_check('professional', 'colleague'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('colleague') ?>\n\t\t\t</label>\n\t\t</fieldset></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('geographical') ?></th>\n\t\t<td><fieldset><legend class=\"screen-reader-text\"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('geographical') ?> </span></legend>\n\t\t\t<label for=\"co-resident\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"geographical\" value=\"co-resident\" id=\"co-resident\" <?php xfn_check('geographical', 'co-resident'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('co-resident') ?>\n\t\t\t</label>\n\t\t\t<label for=\"neighbor\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"geographical\" value=\"neighbor\" id=\"neighbor\" <?php xfn_check('geographical', 'neighbor'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('neighbor') ?>\n\t\t\t</label>\n\t\t\t<label for=\"geographical\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"geographical\" value=\"\" id=\"geographical\" <?php xfn_check('geographical'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('none') ?>\n\t\t\t</label>\n\t\t</fieldset></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('family') ?></th>\n\t\t<td><fieldset><legend class=\"screen-reader-text\"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('family') ?> </span></legend>\n\t\t\t<label for=\"child\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"family\" value=\"child\" id=\"child\" <?php xfn_check('family', 'child'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('child') ?>\n\t\t\t</label>\n\t\t\t<label for=\"kin\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"family\" value=\"kin\" id=\"kin\" <?php xfn_check('family', 'kin'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('kin') ?>\n\t\t\t</label>\n\t\t\t<label for=\"parent\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"family\" value=\"parent\" id=\"parent\" <?php xfn_check('family', 'parent'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('parent') ?>\n\t\t\t</label>\n\t\t\t<label for=\"sibling\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"family\" value=\"sibling\" id=\"sibling\" <?php xfn_check('family', 'sibling'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('sibling') ?>\n\t\t\t</label>\n\t\t\t<label for=\"spouse\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"family\" value=\"spouse\" id=\"spouse\" <?php xfn_check('family', 'spouse'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('spouse') ?>\n\t\t\t</label>\n\t\t\t<label for=\"family\">\n\t\t\t<input class=\"valinp\" type=\"radio\" name=\"family\" value=\"\" id=\"family\" <?php xfn_check('family'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('none') ?>\n\t\t\t</label>\n\t\t</fieldset></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('romantic') ?></th>\n\t\t<td><fieldset><legend class=\"screen-reader-text\"><span> <?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('romantic') ?> </span></legend>\n\t\t\t<label for=\"muse\">\n\t\t\t<input class=\"valinp\" type=\"checkbox\" name=\"romantic\" value=\"muse\" id=\"muse\" <?php xfn_check('romantic', 'muse'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('muse') ?>\n\t\t\t</label>\n\t\t\t<label for=\"crush\">\n\t\t\t<input class=\"valinp\" type=\"checkbox\" name=\"romantic\" value=\"crush\" id=\"crush\" <?php xfn_check('romantic', 'crush'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('crush') ?>\n\t\t\t</label>\n\t\t\t<label for=\"date\">\n\t\t\t<input class=\"valinp\" type=\"checkbox\" name=\"romantic\" value=\"date\" id=\"date\" <?php xfn_check('romantic', 'date'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('date') ?>\n\t\t\t</label>\n\t\t\t<label for=\"romantic\">\n\t\t\t<input class=\"valinp\" type=\"checkbox\" name=\"romantic\" value=\"sweetheart\" id=\"romantic\" <?php xfn_check('romantic', 'sweetheart'); ?> />&nbsp;<?php /* translators: xfn: http://gmpg.org/xfn/ */ _e('sweetheart') ?>\n\t\t\t</label>\n\t\t</fieldset></td>\n\t</tr>\n\n</table>\n<p><?php _e('If the link is to a person, you can specify your relationship with them using the above form. If you would like to learn more about the idea check out <a href=\"http://gmpg.org/xfn/\">XFN</a>.'); ?></p>\n<?php\n}\n\n/**\n * Display advanced link options form fields.\n *\n * @since 2.6.0\n *\n * @param object $link\n */\nfunction link_advanced_meta_box($link) {\n?>\n<table class=\"links-table\" cellpadding=\"0\">\n\t<tr>\n\t\t<th scope=\"row\"><label for=\"link_image\"><?php _e('Image Address') ?></label></th>\n\t\t<td><input type=\"text\" name=\"link_image\" class=\"code\" id=\"link_image\" maxlength=\"255\" value=\"<?php echo ( isset( $link->link_image ) ? esc_attr($link->link_image) : ''); ?>\" /></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><label for=\"rss_uri\"><?php _e('RSS Address') ?></label></th>\n\t\t<td><input name=\"link_rss\" class=\"code\" type=\"text\" id=\"rss_uri\" maxlength=\"255\" value=\"<?php echo ( isset( $link->link_rss ) ? esc_attr($link->link_rss) : ''); ?>\" /></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><label for=\"link_notes\"><?php _e('Notes') ?></label></th>\n\t\t<td><textarea name=\"link_notes\" id=\"link_notes\" rows=\"10\"><?php echo ( isset( $link->link_notes ) ? $link->link_notes : ''); // textarea_escaped ?></textarea></td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><label for=\"link_rating\"><?php _e('Rating') ?></label></th>\n\t\t<td><select name=\"link_rating\" id=\"link_rating\" size=\"1\">\n\t\t<?php\n\t\t\tfor ( $r = 0; $r <= 10; $r++ ) {\n\t\t\t\techo '<option value=\"' . $r . '\"';\n\t\t\t\tif ( isset($link->link_rating) && $link->link_rating == $r )\n\t\t\t\t\techo ' selected=\"selected\"';\n\t\t\t\techo('>' . $r . '</option>');\n\t\t\t}\n\t\t?></select>&nbsp;<?php _e('(Leave at 0 for no rating.)') ?>\n\t\t</td>\n\t</tr>\n</table>\n<?php\n}\n\n/**\n * Display post thumbnail meta box.\n *\n * @since 2.9.0\n */\nfunction post_thumbnail_meta_box( $post ) {\n\t$thumbnail_id = get_post_meta( $post->ID, '_thumbnail_id', true );\n\techo _wp_post_thumbnail_html( $thumbnail_id, $post->ID );\n}\n\n/**\n * Display fields for ID3 data\n *\n * @since 3.9.0\n *\n * @param WP_Post $post\n */\nfunction attachment_id3_data_meta_box( $post ) {\n\t$meta = array();\n\tif ( ! empty( $post->ID ) ) {\n\t\t$meta = wp_get_attachment_metadata( $post->ID );\n\t}\n\n\tforeach ( wp_get_attachment_id3_keys( $post, 'edit' ) as $key => $label ) : ?>\n\t<p>\n\t\t<label for=\"title\"><?php echo $label ?></label><br />\n\t\t<input type=\"text\" name=\"id3_<?php echo esc_attr( $key ) ?>\" id=\"id3_<?php echo esc_attr( $key ) ?>\" class=\"large-text\" value=\"<?php\n\t\t\tif ( ! empty( $meta[ $key ] ) ) {\n\t\t\t\techo esc_attr( $meta[ $key ] );\n\t\t\t}\n\t\t?>\" />\n\t</p>\n\t<?php\n\tendforeach;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/misc.php",
    "content": "<?php\n/**\n * Misc WordPress Administration API.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Returns whether the server is running Apache with the mod_rewrite module loaded.\n *\n * @since 2.0.0\n *\n * @return bool\n */\nfunction got_mod_rewrite() {\n\t$got_rewrite = apache_mod_loaded('mod_rewrite', true);\n\n\t/**\n\t * Filter whether Apache and mod_rewrite are present.\n\t *\n\t * This filter was previously used to force URL rewriting for other servers,\n\t * like nginx. Use the got_url_rewrite filter in got_url_rewrite() instead.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @see got_url_rewrite()\n\t *\n\t * @param bool $got_rewrite Whether Apache and mod_rewrite are present.\n\t */\n\treturn apply_filters( 'got_rewrite', $got_rewrite );\n}\n\n/**\n * Returns whether the server supports URL rewriting.\n *\n * Detects Apache's mod_rewrite, IIS 7.0+ permalink support, and nginx.\n *\n * @since 3.7.0\n *\n * @global bool $is_nginx\n *\n * @return bool Whether the server supports URL rewriting.\n */\nfunction got_url_rewrite() {\n\t$got_url_rewrite = ( got_mod_rewrite() || $GLOBALS['is_nginx'] || iis7_supports_permalinks() );\n\n\t/**\n\t * Filter whether URL rewriting is available.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param bool $got_url_rewrite Whether URL rewriting is available.\n\t */\n\treturn apply_filters( 'got_url_rewrite', $got_url_rewrite );\n}\n\n/**\n * Extracts strings from between the BEGIN and END markers in the .htaccess file.\n *\n * @since 1.5.0\n *\n * @param string $filename\n * @param string $marker\n * @return array An array of strings from a file (.htaccess ) from between BEGIN and END markers.\n */\nfunction extract_from_markers( $filename, $marker ) {\n\t$result = array ();\n\n\tif (!file_exists( $filename ) ) {\n\t\treturn $result;\n\t}\n\n\tif ( $markerdata = explode( \"\\n\", implode( '', file( $filename ) ) ));\n\t{\n\t\t$state = false;\n\t\tforeach ( $markerdata as $markerline ) {\n\t\t\tif (strpos($markerline, '# END ' . $marker) !== false)\n\t\t\t\t$state = false;\n\t\t\tif ( $state )\n\t\t\t\t$result[] = $markerline;\n\t\t\tif (strpos($markerline, '# BEGIN ' . $marker) !== false)\n\t\t\t\t$state = true;\n\t\t}\n\t}\n\n\treturn $result;\n}\n\n/**\n * Inserts an array of strings into a file (.htaccess ), placing it between\n * BEGIN and END markers.\n *\n * Replaces existing marked info. Retains surrounding\n * data. Creates file if none exists.\n *\n * @since 1.5.0\n *\n * @param string       $filename  Filename to alter.\n * @param string       $marker    The marker to alter.\n * @param array|string $insertion The new content to insert.\n * @return bool True on write success, false on failure.\n */\nfunction insert_with_markers( $filename, $marker, $insertion ) {\n\tif ( ! file_exists( $filename ) ) {\n\t\tif ( ! is_writable( dirname( $filename ) ) ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( ! touch( $filename ) ) {\n\t\t\treturn false;\n\t\t}\n\t} elseif ( ! is_writeable( $filename ) ) {\n\t\treturn false;\n\t}\n\n\tif ( ! is_array( $insertion ) ) {\n\t\t$insertion = explode( \"\\n\", $insertion );\n\t}\n\n\t$start_marker = \"# BEGIN {$marker}\";\n\t$end_marker   = \"# END {$marker}\";\n\n\t$fp = fopen( $filename, 'r+' );\n\tif ( ! $fp ) {\n\t\treturn false;\n\t}\n\n\t// Attempt to get a lock. If the filesystem supports locking, this will block until the lock is acquired.\n\tflock( $fp, LOCK_EX );\n\n\t$lines = array();\n\twhile ( ! feof( $fp ) ) {\n\t\t$lines[] = rtrim( fgets( $fp ), \"\\r\\n\" );\n\t}\n\n\t// Split out the existing file into the preceeding lines, and those that appear after the marker\n\t$pre_lines = $post_lines = $existing_lines = array();\n\t$found_marker = $found_end_marker = false;\n\tforeach ( $lines as $line ) {\n\t\tif ( ! $found_marker && false !== strpos( $line, $start_marker ) ) {\n\t\t\t$found_marker = true;\n\t\t\tcontinue;\n\t\t} elseif ( ! $found_end_marker && false !== strpos( $line, $end_marker ) ) {\n\t\t\t$found_end_marker = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif ( ! $found_marker ) {\n\t\t\t$pre_lines[] = $line;\n\t\t} elseif ( $found_marker && $found_end_marker ) {\n\t\t\t$post_lines[] = $line;\n\t\t} else {\n\t\t\t$existing_lines[] = $line;\n\t\t}\n\t}\n\n\t// Check to see if there was a change\n\tif ( $existing_lines === $insertion ) {\n\t\tflock( $fp, LOCK_UN );\n\t\tfclose( $fp );\n\n\t\treturn true;\n\t}\n\n\t// Generate the new file data\n\t$new_file_data = implode( \"\\n\", array_merge(\n\t\t$pre_lines,\n\t\tarray( $start_marker ),\n\t\t$insertion,\n\t\tarray( $end_marker ),\n\t\t$post_lines\n\t) );\n\n\t// Write to the start of the file, and truncate it to that length\n\tfseek( $fp, 0 );\n\t$bytes = fwrite( $fp, $new_file_data );\n\tif ( $bytes ) {\n\t\tftruncate( $fp, ftell( $fp ) );\n\t}\n\tfflush( $fp );\n\tflock( $fp, LOCK_UN );\n\tfclose( $fp );\n\n\treturn (bool) $bytes;\n}\n\n/**\n * Updates the htaccess file with the current rules if it is writable.\n *\n * Always writes to the file if it exists and is writable to ensure that we\n * blank out old rules.\n *\n * @since 1.5.0\n *\n * @global WP_Rewrite $wp_rewrite\n */\nfunction save_mod_rewrite_rules() {\n\tif ( is_multisite() )\n\t\treturn;\n\n\tglobal $wp_rewrite;\n\n\t$home_path = get_home_path();\n\t$htaccess_file = $home_path.'.htaccess';\n\n\t/*\n\t * If the file doesn't already exist check for write access to the directory\n\t * and whether we have some rules. Else check for write access to the file.\n\t */\n\tif ((!file_exists($htaccess_file) && is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks()) || is_writable($htaccess_file)) {\n\t\tif ( got_mod_rewrite() ) {\n\t\t\t$rules = explode( \"\\n\", $wp_rewrite->mod_rewrite_rules() );\n\t\t\treturn insert_with_markers( $htaccess_file, 'WordPress', $rules );\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Updates the IIS web.config file with the current rules if it is writable.\n * If the permalinks do not require rewrite rules then the rules are deleted from the web.config file.\n *\n * @since 2.8.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @return bool True if web.config was updated successfully\n */\nfunction iis7_save_url_rewrite_rules(){\n\tif ( is_multisite() )\n\t\treturn;\n\n\tglobal $wp_rewrite;\n\n\t$home_path = get_home_path();\n\t$web_config_file = $home_path . 'web.config';\n\n\t// Using win_is_writable() instead of is_writable() because of a bug in Windows PHP\n\tif ( iis7_supports_permalinks() && ( ( ! file_exists($web_config_file) && win_is_writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks() ) || win_is_writable($web_config_file) ) ) {\n\t\t$rule = $wp_rewrite->iis7_url_rewrite_rules(false, '', '');\n\t\tif ( ! empty($rule) ) {\n\t\t\treturn iis7_add_rewrite_rule($web_config_file, $rule);\n\t\t} else {\n\t\t\treturn iis7_delete_rewrite_rule($web_config_file);\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Update the \"recently-edited\" file for the plugin or theme editor.\n *\n * @since 1.5.0\n *\n * @param string $file\n */\nfunction update_recently_edited( $file ) {\n\t$oldfiles = (array ) get_option( 'recently_edited' );\n\tif ( $oldfiles ) {\n\t\t$oldfiles = array_reverse( $oldfiles );\n\t\t$oldfiles[] = $file;\n\t\t$oldfiles = array_reverse( $oldfiles );\n\t\t$oldfiles = array_unique( $oldfiles );\n\t\tif ( 5 < count( $oldfiles ))\n\t\t\tarray_pop( $oldfiles );\n\t} else {\n\t\t$oldfiles[] = $file;\n\t}\n\tupdate_option( 'recently_edited', $oldfiles );\n}\n\n/**\n * Flushes rewrite rules if siteurl, home or page_on_front changed.\n *\n * @since 2.1.0\n *\n * @param string $old_value\n * @param string $value\n */\nfunction update_home_siteurl( $old_value, $value ) {\n\tif ( wp_installing() )\n\t\treturn;\n\n\tif ( is_multisite() && ms_is_switched() ) {\n\t\tdelete_option( 'rewrite_rules' );\n\t} else {\n\t\tflush_rewrite_rules();\n\t}\n}\n\n\n/**\n * Resets global variables based on $_GET and $_POST\n *\n * This function resets global variables based on the names passed\n * in the $vars array to the value of $_POST[$var] or $_GET[$var] or ''\n * if neither is defined.\n *\n * @since 2.0.0\n *\n * @param array $vars An array of globals to reset.\n */\nfunction wp_reset_vars( $vars ) {\n\tforeach ( $vars as $var ) {\n\t\tif ( empty( $_POST[ $var ] ) ) {\n\t\t\tif ( empty( $_GET[ $var ] ) ) {\n\t\t\t\t$GLOBALS[ $var ] = '';\n\t\t\t} else {\n\t\t\t\t$GLOBALS[ $var ] = $_GET[ $var ];\n\t\t\t}\n\t\t} else {\n\t\t\t$GLOBALS[ $var ] = $_POST[ $var ];\n\t\t}\n\t}\n}\n\n/**\n * Displays the given administration message.\n *\n * @since 2.1.0\n *\n * @param string|WP_Error $message\n */\nfunction show_message($message) {\n\tif ( is_wp_error($message) ){\n\t\tif ( $message->get_error_data() && is_string( $message->get_error_data() ) )\n\t\t\t$message = $message->get_error_message() . ': ' . $message->get_error_data();\n\t\telse\n\t\t\t$message = $message->get_error_message();\n\t}\n\techo \"<p>$message</p>\\n\";\n\twp_ob_end_flush_all();\n\tflush();\n}\n\n/**\n * @since 2.8.0\n *\n * @param string $content\n * @return array\n */\nfunction wp_doc_link_parse( $content ) {\n\tif ( !is_string( $content ) || empty( $content ) )\n\t\treturn array();\n\n\tif ( !function_exists('token_get_all') )\n\t\treturn array();\n\n\t$tokens = token_get_all( $content );\n\t$count = count( $tokens );\n\t$functions = array();\n\t$ignore_functions = array();\n\tfor ( $t = 0; $t < $count - 2; $t++ ) {\n\t\tif ( ! is_array( $tokens[ $t ] ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( T_STRING == $tokens[ $t ][0] && ( '(' == $tokens[ $t + 1 ] || '(' == $tokens[ $t + 2 ] ) ) {\n\t\t\t// If it's a function or class defined locally, there's not going to be any docs available\n\t\t\tif ( ( isset( $tokens[ $t - 2 ][1] ) && in_array( $tokens[ $t - 2 ][1], array( 'function', 'class' ) ) ) || ( isset( $tokens[ $t - 2 ][0] ) && T_OBJECT_OPERATOR == $tokens[ $t - 1 ][0] ) ) {\n\t\t\t\t$ignore_functions[] = $tokens[$t][1];\n\t\t\t}\n\t\t\t// Add this to our stack of unique references\n\t\t\t$functions[] = $tokens[$t][1];\n\t\t}\n\t}\n\n\t$functions = array_unique( $functions );\n\tsort( $functions );\n\n\t/**\n\t * Filter the list of functions and classes to be ignored from the documentation lookup.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $ignore_functions Functions and classes to be ignored.\n\t */\n\t$ignore_functions = apply_filters( 'documentation_ignore_functions', $ignore_functions );\n\n\t$ignore_functions = array_unique( $ignore_functions );\n\n\t$out = array();\n\tforeach ( $functions as $function ) {\n\t\tif ( in_array( $function, $ignore_functions ) )\n\t\t\tcontinue;\n\t\t$out[] = $function;\n\t}\n\n\treturn $out;\n}\n\n/**\n * Saves option for number of rows when listing posts, pages, comments, etc.\n *\n * @since 2.8.0\n */\nfunction set_screen_options() {\n\n\tif ( isset($_POST['wp_screen_options']) && is_array($_POST['wp_screen_options']) ) {\n\t\tcheck_admin_referer( 'screen-options-nonce', 'screenoptionnonce' );\n\n\t\tif ( !$user = wp_get_current_user() )\n\t\t\treturn;\n\t\t$option = $_POST['wp_screen_options']['option'];\n\t\t$value = $_POST['wp_screen_options']['value'];\n\n\t\tif ( $option != sanitize_key( $option ) )\n\t\t\treturn;\n\n\t\t$map_option = $option;\n\t\t$type = str_replace('edit_', '', $map_option);\n\t\t$type = str_replace('_per_page', '', $type);\n\t\tif ( in_array( $type, get_taxonomies() ) )\n\t\t\t$map_option = 'edit_tags_per_page';\n\t\telseif ( in_array( $type, get_post_types() ) )\n\t\t\t$map_option = 'edit_per_page';\n\t\telse\n\t\t\t$option = str_replace('-', '_', $option);\n\n\t\tswitch ( $map_option ) {\n\t\t\tcase 'edit_per_page':\n\t\t\tcase 'users_per_page':\n\t\t\tcase 'edit_comments_per_page':\n\t\t\tcase 'upload_per_page':\n\t\t\tcase 'edit_tags_per_page':\n\t\t\tcase 'plugins_per_page':\n\t\t\t// Network admin\n\t\t\tcase 'sites_network_per_page':\n\t\t\tcase 'users_network_per_page':\n\t\t\tcase 'site_users_network_per_page':\n\t\t\tcase 'plugins_network_per_page':\n\t\t\tcase 'themes_network_per_page':\n\t\t\tcase 'site_themes_network_per_page':\n\t\t\t\t$value = (int) $value;\n\t\t\t\tif ( $value < 1 || $value > 999 )\n\t\t\t\t\treturn;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\n\t\t\t\t/**\n\t\t\t\t * Filter a screen option value before it is set.\n\t\t\t\t *\n\t\t\t\t * The filter can also be used to modify non-standard [items]_per_page\n\t\t\t\t * settings. See the parent function for a full list of standard options.\n\t\t\t\t *\n\t\t\t\t * Returning false to the filter will skip saving the current option.\n\t\t\t\t *\n\t\t\t\t * @since 2.8.0\n\t\t\t\t *\n\t\t\t\t * @see set_screen_options()\n\t\t\t\t *\n\t\t\t\t * @param bool|int $value  Screen option value. Default false to skip.\n\t\t\t\t * @param string   $option The option name.\n\t\t\t\t * @param int      $value  The number of rows to use.\n\t\t\t\t */\n\t\t\t\t$value = apply_filters( 'set-screen-option', false, $option, $value );\n\n\t\t\t\tif ( false === $value )\n\t\t\t\t\treturn;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tupdate_user_meta($user->ID, $option, $value);\n\n\t\t$url = remove_query_arg( array( 'pagenum', 'apage', 'paged' ), wp_get_referer() );\n\t\tif ( isset( $_POST['mode'] ) ) {\n\t\t\t$url = add_query_arg( array( 'mode' => $_POST['mode'] ), $url );\n\t\t}\n\n\t\twp_safe_redirect( $url );\n\t\texit;\n\t}\n}\n\n/**\n * Check if rewrite rule for WordPress already exists in the IIS 7+ configuration file\n *\n * @since 2.8.0\n *\n * @return bool\n * @param string $filename The file path to the configuration file\n */\nfunction iis7_rewrite_rule_exists($filename) {\n\tif ( ! file_exists($filename) )\n\t\treturn false;\n\tif ( ! class_exists( 'DOMDocument', false ) ) {\n\t\treturn false;\n\t}\n\n\t$doc = new DOMDocument();\n\tif ( $doc->load($filename) === false )\n\t\treturn false;\n\t$xpath = new DOMXPath($doc);\n\t$rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\\'wordpress\\')]');\n\tif ( $rules->length == 0 )\n\t\treturn false;\n\telse\n\t\treturn true;\n}\n\n/**\n * Delete WordPress rewrite rule from web.config file if it exists there\n *\n * @since 2.8.0\n *\n * @param string $filename Name of the configuration file\n * @return bool\n */\nfunction iis7_delete_rewrite_rule($filename) {\n\t// If configuration file does not exist then rules also do not exist so there is nothing to delete\n\tif ( ! file_exists($filename) )\n\t\treturn true;\n\n\tif ( ! class_exists( 'DOMDocument', false ) ) {\n\t\treturn false;\n\t}\n\n\t$doc = new DOMDocument();\n\t$doc->preserveWhiteSpace = false;\n\n\tif ( $doc -> load($filename) === false )\n\t\treturn false;\n\t$xpath = new DOMXPath($doc);\n\t$rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\\'wordpress\\')]');\n\tif ( $rules->length > 0 ) {\n\t\t$child = $rules->item(0);\n\t\t$parent = $child->parentNode;\n\t\t$parent->removeChild($child);\n\t\t$doc->formatOutput = true;\n\t\tsaveDomDocument($doc, $filename);\n\t}\n\treturn true;\n}\n\n/**\n * Add WordPress rewrite rule to the IIS 7+ configuration file.\n *\n * @since 2.8.0\n *\n * @param string $filename The file path to the configuration file\n * @param string $rewrite_rule The XML fragment with URL Rewrite rule\n * @return bool\n */\nfunction iis7_add_rewrite_rule($filename, $rewrite_rule) {\n\tif ( ! class_exists( 'DOMDocument', false ) ) {\n\t\treturn false;\n\t}\n\n\t// If configuration file does not exist then we create one.\n\tif ( ! file_exists($filename) ) {\n\t\t$fp = fopen( $filename, 'w');\n\t\tfwrite($fp, '<configuration/>');\n\t\tfclose($fp);\n\t}\n\n\t$doc = new DOMDocument();\n\t$doc->preserveWhiteSpace = false;\n\n\tif ( $doc->load($filename) === false )\n\t\treturn false;\n\n\t$xpath = new DOMXPath($doc);\n\n\t// First check if the rule already exists as in that case there is no need to re-add it\n\t$wordpress_rules = $xpath->query('/configuration/system.webServer/rewrite/rules/rule[starts-with(@name,\\'wordpress\\')]');\n\tif ( $wordpress_rules->length > 0 )\n\t\treturn true;\n\n\t// Check the XPath to the rewrite rule and create XML nodes if they do not exist\n\t$xmlnodes = $xpath->query('/configuration/system.webServer/rewrite/rules');\n\tif ( $xmlnodes->length > 0 ) {\n\t\t$rules_node = $xmlnodes->item(0);\n\t} else {\n\t\t$rules_node = $doc->createElement('rules');\n\n\t\t$xmlnodes = $xpath->query('/configuration/system.webServer/rewrite');\n\t\tif ( $xmlnodes->length > 0 ) {\n\t\t\t$rewrite_node = $xmlnodes->item(0);\n\t\t\t$rewrite_node->appendChild($rules_node);\n\t\t} else {\n\t\t\t$rewrite_node = $doc->createElement('rewrite');\n\t\t\t$rewrite_node->appendChild($rules_node);\n\n\t\t\t$xmlnodes = $xpath->query('/configuration/system.webServer');\n\t\t\tif ( $xmlnodes->length > 0 ) {\n\t\t\t\t$system_webServer_node = $xmlnodes->item(0);\n\t\t\t\t$system_webServer_node->appendChild($rewrite_node);\n\t\t\t} else {\n\t\t\t\t$system_webServer_node = $doc->createElement('system.webServer');\n\t\t\t\t$system_webServer_node->appendChild($rewrite_node);\n\n\t\t\t\t$xmlnodes = $xpath->query('/configuration');\n\t\t\t\tif ( $xmlnodes->length > 0 ) {\n\t\t\t\t\t$config_node = $xmlnodes->item(0);\n\t\t\t\t\t$config_node->appendChild($system_webServer_node);\n\t\t\t\t} else {\n\t\t\t\t\t$config_node = $doc->createElement('configuration');\n\t\t\t\t\t$doc->appendChild($config_node);\n\t\t\t\t\t$config_node->appendChild($system_webServer_node);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t$rule_fragment = $doc->createDocumentFragment();\n\t$rule_fragment->appendXML($rewrite_rule);\n\t$rules_node->appendChild($rule_fragment);\n\n\t$doc->encoding = \"UTF-8\";\n\t$doc->formatOutput = true;\n\tsaveDomDocument($doc, $filename);\n\n\treturn true;\n}\n\n/**\n * Saves the XML document into a file\n *\n * @since 2.8.0\n *\n * @param DOMDocument $doc\n * @param string $filename\n */\nfunction saveDomDocument($doc, $filename) {\n\t$config = $doc->saveXML();\n\t$config = preg_replace(\"/([^\\r])\\n/\", \"$1\\r\\n\", $config);\n\t$fp = fopen($filename, 'w');\n\tfwrite($fp, $config);\n\tfclose($fp);\n}\n\n/**\n * Display the default admin color scheme picker (Used in user-edit.php)\n *\n * @since 3.0.0\n *\n * @global array $_wp_admin_css_colors\n */\nfunction admin_color_scheme_picker( $user_id ) {\n\tglobal $_wp_admin_css_colors;\n\n\tksort( $_wp_admin_css_colors );\n\n\tif ( isset( $_wp_admin_css_colors['fresh'] ) ) {\n\t\t// Set Default ('fresh') and Light should go first.\n\t\t$_wp_admin_css_colors = array_filter( array_merge( array( 'fresh' => '', 'light' => '' ), $_wp_admin_css_colors ) );\n\t}\n\n\t$current_color = get_user_option( 'admin_color', $user_id );\n\n\tif ( empty( $current_color ) || ! isset( $_wp_admin_css_colors[ $current_color ] ) ) {\n\t\t$current_color = 'fresh';\n\t}\n\n\t?>\n\t<fieldset id=\"color-picker\" class=\"scheme-list\">\n\t\t<legend class=\"screen-reader-text\"><span><?php _e( 'Admin Color Scheme' ); ?></span></legend>\n\t\t<?php\n\t\twp_nonce_field( 'save-color-scheme', 'color-nonce', false );\n\t\tforeach ( $_wp_admin_css_colors as $color => $color_info ) :\n\n\t\t\t?>\n\t\t\t<div class=\"color-option <?php echo ( $color == $current_color ) ? 'selected' : ''; ?>\">\n\t\t\t\t<input name=\"admin_color\" id=\"admin_color_<?php echo esc_attr( $color ); ?>\" type=\"radio\" value=\"<?php echo esc_attr( $color ); ?>\" class=\"tog\" <?php checked( $color, $current_color ); ?> />\n\t\t\t\t<input type=\"hidden\" class=\"css_url\" value=\"<?php echo esc_url( $color_info->url ); ?>\" />\n\t\t\t\t<input type=\"hidden\" class=\"icon_colors\" value=\"<?php echo esc_attr( wp_json_encode( array( 'icons' => $color_info->icon_colors ) ) ); ?>\" />\n\t\t\t\t<label for=\"admin_color_<?php echo esc_attr( $color ); ?>\"><?php echo esc_html( $color_info->name ); ?></label>\n\t\t\t\t<table class=\"color-palette\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t<?php\n\n\t\t\t\t\tforeach ( $color_info->colors as $html_color ) {\n\t\t\t\t\t\t?>\n\t\t\t\t\t\t<td style=\"background-color: <?php echo esc_attr( $html_color ); ?>\">&nbsp;</td>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t}\n\n\t\t\t\t\t?>\n\t\t\t\t\t</tr>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t\t<?php\n\n\t\tendforeach;\n\n\t?>\n\t</fieldset>\n\t<?php\n}\n\n/**\n *\n * @global array $_wp_admin_css_colors\n */\nfunction wp_color_scheme_settings() {\n\tglobal $_wp_admin_css_colors;\n\n\t$color_scheme = get_user_option( 'admin_color' );\n\n\t// It's possible to have a color scheme set that is no longer registered.\n\tif ( empty( $_wp_admin_css_colors[ $color_scheme ] ) ) {\n\t\t$color_scheme = 'fresh';\n\t}\n\n\tif ( ! empty( $_wp_admin_css_colors[ $color_scheme ]->icon_colors ) ) {\n\t\t$icon_colors = $_wp_admin_css_colors[ $color_scheme ]->icon_colors;\n\t} elseif ( ! empty( $_wp_admin_css_colors['fresh']->icon_colors ) ) {\n\t\t$icon_colors = $_wp_admin_css_colors['fresh']->icon_colors;\n\t} else {\n\t\t// Fall back to the default set of icon colors if the default scheme is missing.\n\t\t$icon_colors = array( 'base' => '#999', 'focus' => '#00a0d2', 'current' => '#fff' );\n\t}\n\n\techo '<script type=\"text/javascript\">var _wpColorScheme = ' . wp_json_encode( array( 'icons' => $icon_colors ) ) . \";</script>\\n\";\n}\n\n/**\n * @since 3.3.0\n */\nfunction _ipad_meta() {\n\tif ( wp_is_mobile() ) {\n\t\t?>\n\t\t<meta name=\"viewport\" id=\"viewport-meta\" content=\"width=device-width, initial-scale=1\">\n\t\t<?php\n\t}\n}\n\n/**\n * Check lock status for posts displayed on the Posts screen\n *\n * @since 3.6.0\n */\nfunction wp_check_locked_posts( $response, $data, $screen_id ) {\n\t$checked = array();\n\n\tif ( array_key_exists( 'wp-check-locked-posts', $data ) && is_array( $data['wp-check-locked-posts'] ) ) {\n\t\tforeach ( $data['wp-check-locked-posts'] as $key ) {\n\t\t\tif ( ! $post_id = absint( substr( $key, 5 ) ) )\n\t\t\t\tcontinue;\n\n\t\t\tif ( ( $user_id = wp_check_post_lock( $post_id ) ) && ( $user = get_userdata( $user_id ) ) && current_user_can( 'edit_post', $post_id ) ) {\n\t\t\t\t$send = array( 'text' => sprintf( __( '%s is currently editing' ), $user->display_name ) );\n\n\t\t\t\tif ( ( $avatar = get_avatar( $user->ID, 18 ) ) && preg_match( \"|src='([^']+)'|\", $avatar, $matches ) )\n\t\t\t\t\t$send['avatar_src'] = $matches[1];\n\n\t\t\t\t$checked[$key] = $send;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( ! empty( $checked ) )\n\t\t$response['wp-check-locked-posts'] = $checked;\n\n\treturn $response;\n}\n\n/**\n * Check lock status on the New/Edit Post screen and refresh the lock\n *\n * @since 3.6.0\n */\nfunction wp_refresh_post_lock( $response, $data, $screen_id ) {\n\tif ( array_key_exists( 'wp-refresh-post-lock', $data ) ) {\n\t\t$received = $data['wp-refresh-post-lock'];\n\t\t$send = array();\n\n\t\tif ( ! $post_id = absint( $received['post_id'] ) )\n\t\t\treturn $response;\n\n\t\tif ( ! current_user_can('edit_post', $post_id) )\n\t\t\treturn $response;\n\n\t\tif ( ( $user_id = wp_check_post_lock( $post_id ) ) && ( $user = get_userdata( $user_id ) ) ) {\n\t\t\t$error = array(\n\t\t\t\t'text' => sprintf( __( '%s has taken over and is currently editing.' ), $user->display_name )\n\t\t\t);\n\n\t\t\tif ( $avatar = get_avatar( $user->ID, 64 ) ) {\n\t\t\t\tif ( preg_match( \"|src='([^']+)'|\", $avatar, $matches ) )\n\t\t\t\t\t$error['avatar_src'] = $matches[1];\n\t\t\t}\n\n\t\t\t$send['lock_error'] = $error;\n\t\t} else {\n\t\t\tif ( $new_lock = wp_set_post_lock( $post_id ) )\n\t\t\t\t$send['new_lock'] = implode( ':', $new_lock );\n\t\t}\n\n\t\t$response['wp-refresh-post-lock'] = $send;\n\t}\n\n\treturn $response;\n}\n\n/**\n * Check nonce expiration on the New/Edit Post screen and refresh if needed\n *\n * @since 3.6.0\n */\nfunction wp_refresh_post_nonces( $response, $data, $screen_id ) {\n\tif ( array_key_exists( 'wp-refresh-post-nonces', $data ) ) {\n\t\t$received = $data['wp-refresh-post-nonces'];\n\t\t$response['wp-refresh-post-nonces'] = array( 'check' => 1 );\n\n\t\tif ( ! $post_id = absint( $received['post_id'] ) ) {\n\t\t\treturn $response;\n\t\t}\n\n\t\tif ( ! current_user_can( 'edit_post', $post_id ) ) {\n\t\t\treturn $response;\n\t\t}\n\n\t\t$response['wp-refresh-post-nonces'] = array(\n\t\t\t'replace' => array(\n\t\t\t\t'getpermalinknonce' => wp_create_nonce('getpermalink'),\n\t\t\t\t'samplepermalinknonce' => wp_create_nonce('samplepermalink'),\n\t\t\t\t'closedpostboxesnonce' => wp_create_nonce('closedpostboxes'),\n\t\t\t\t'_ajax_linking_nonce' => wp_create_nonce( 'internal-linking' ),\n\t\t\t\t'_wpnonce' => wp_create_nonce( 'update-post_' . $post_id ),\n\t\t\t),\n\t\t\t'heartbeatNonce' => wp_create_nonce( 'heartbeat-nonce' ),\n\t\t);\n\t}\n\n\treturn $response;\n}\n\n/**\n * Disable suspension of Heartbeat on the Add/Edit Post screens.\n *\n * @since 3.8.0\n *\n * @global string $pagenow\n *\n * @param array $settings An array of Heartbeat settings.\n * @return array Filtered Heartbeat settings.\n */\nfunction wp_heartbeat_set_suspension( $settings ) {\n\tglobal $pagenow;\n\n\tif ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) {\n\t\t$settings['suspension'] = 'disable';\n\t}\n\n\treturn $settings;\n}\n\n/**\n * Autosave with heartbeat\n *\n * @since 3.9.0\n */\nfunction heartbeat_autosave( $response, $data ) {\n\tif ( ! empty( $data['wp_autosave'] ) ) {\n\t\t$saved = wp_autosave( $data['wp_autosave'] );\n\n\t\tif ( is_wp_error( $saved ) ) {\n\t\t\t$response['wp_autosave'] = array( 'success' => false, 'message' => $saved->get_error_message() );\n\t\t} elseif ( empty( $saved ) ) {\n\t\t\t$response['wp_autosave'] = array( 'success' => false, 'message' => __( 'Error while saving.' ) );\n\t\t} else {\n\t\t\t/* translators: draft saved date format, see http://php.net/date */\n\t\t\t$draft_saved_date_format = __( 'g:i:s a' );\n\t\t\t/* translators: %s: date and time */\n\t\t\t$response['wp_autosave'] = array( 'success' => true, 'message' => sprintf( __( 'Draft saved at %s.' ), date_i18n( $draft_saved_date_format ) ) );\n\t\t}\n\t}\n\n\treturn $response;\n}\n\n/**\n * Disables autocomplete on the 'post' form (Add/Edit Post screens) for WebKit browsers,\n * as they disregard the autocomplete setting on the editor textarea. That can break the editor\n * when the user navigates to it with the browser's Back button. See #28037\n *\n * @since 4.0.0\n *\n * @global bool $is_safari\n * @global bool $is_chrome\n */\nfunction post_form_autocomplete_off() {\n\tglobal $is_safari, $is_chrome;\n\n\tif ( $is_safari || $is_chrome ) {\n\t\techo ' autocomplete=\"off\"';\n\t}\n}\n\n/**\n * Remove single-use URL parameters and create canonical link based on new URL.\n *\n * Remove specific query string parameters from a URL, create the canonical link,\n * put it in the admin header, and change the current URL to match.\n *\n * @since 4.2.0\n */\nfunction wp_admin_canonical_url() {\n\t$removable_query_args = wp_removable_query_args();\n\n\tif ( empty( $removable_query_args ) ) {\n\t\treturn;\n\t}\n\n\t// Ensure we're using an absolute URL.\n\t$current_url  = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );\n\t$filtered_url = remove_query_arg( $removable_query_args, $current_url );\n\t?>\n\t<link id=\"wp-admin-canonical\" rel=\"canonical\" href=\"<?php echo esc_url( $filtered_url ); ?>\" />\n\t<script>\n\t\tif ( window.history.replaceState ) {\n\t\t\twindow.history.replaceState( null, null, document.getElementById( 'wp-admin-canonical' ).href + window.location.hash );\n\t\t}\n\t</script>\n<?php\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/ms-admin-filters.php",
    "content": "<?php\n/**\n * Multisite Administration hooks\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.3.0\n */\n\n// Media Hooks.\nadd_filter( 'wp_handle_upload_prefilter', 'check_upload_size' );\n\n// User Hooks\nadd_action( 'admin_notices', 'new_user_email_admin_notice' );\n\nadd_action( 'admin_page_access_denied', '_access_denied_splash', 99 );\n\nadd_action( 'add_option_new_admin_email', 'update_option_new_admin_email', 10, 2 );\n\nadd_action( 'personal_options_update', 'send_confirmation_on_profile_email' );\n\nadd_action( 'update_option_new_admin_email', 'update_option_new_admin_email', 10, 2 );\n\n// Site Hooks.\nadd_action( 'wpmueditblogaction', 'upload_space_setting' );\n\n// Taxonomy Hooks\nadd_filter( 'get_term', 'sync_category_tag_slugs', 10, 2 );\n\n// Post Hooks.\nadd_filter( 'wp_insert_post_data', 'avoid_blog_page_permalink_collision', 10, 2 );\n\n// Tools Hooks.\nadd_filter( 'import_allow_create_users', 'check_import_new_users' );\n\n// Notices Hooks\nadd_action( 'admin_notices',         'site_admin_notice' );\nadd_action( 'network_admin_notices', 'site_admin_notice' );\n\n// Update Hooks\nadd_action( 'network_admin_notices', 'update_nag',      3  );\nadd_action( 'network_admin_notices', 'maintenance_nag', 10 );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/ms-deprecated.php",
    "content": "<?php\n/**\n * Multisite: Deprecated admin functions from past versions and WordPress MU\n *\n * These functions should not be used and will be removed in a later version.\n * It is suggested to use for the alternatives instead when available.\n *\n * @package WordPress\n * @subpackage Deprecated\n * @since 3.0.0\n */\n\n/**\n * Outputs the WPMU menu.\n *\n * @deprecated 3.0.0\n */\nfunction wpmu_menu() {\n\t_deprecated_function(__FUNCTION__, '3.0' );\n\t// Deprecated. See #11763.\n}\n\n/**\n * Determines if the available space defined by the admin has been exceeded by the user.\n *\n * @deprecated 3.0.0 Use is_upload_space_available()\n * @see is_upload_space_available()\n */\nfunction wpmu_checkAvailableSpace() {\n\t_deprecated_function(__FUNCTION__, '3.0', 'is_upload_space_available()' );\n\n\tif ( !is_upload_space_available() )\n\t\twp_die( __('Sorry, you must delete files before you can upload any more.') );\n}\n\n/**\n * WPMU options.\n *\n * @deprecated 3.0.0\n */\nfunction mu_options( $options ) {\n\t_deprecated_function(__FUNCTION__, '3.0' );\n\treturn $options;\n}\n\n/**\n * Deprecated functionality for activating a network-only plugin.\n *\n * @deprecated 3.0.0 Use activate_plugin()\n * @see activate_plugin()\n */\nfunction activate_sitewide_plugin() {\n\t_deprecated_function(__FUNCTION__, '3.0', 'activate_plugin()' );\n\treturn false;\n}\n\n/**\n * Deprecated functionality for deactivating a network-only plugin.\n *\n * @deprecated 3.0.0 Use deactivate_sitewide_plugin()\n * @see deactivate_sitewide_plugin()\n */\nfunction deactivate_sitewide_plugin( $plugin = false ) {\n\t_deprecated_function(__FUNCTION__, '3.0', 'deactivate_plugin()' );\n}\n\n/**\n * Deprecated functionality for determining if the current plugin is network-only.\n *\n * @deprecated 3.0.0 Use is_network_only_plugin()\n * @see is_network_only_plugin()\n */\nfunction is_wpmu_sitewide_plugin( $file ) {\n\t_deprecated_function(__FUNCTION__, '3.0', 'is_network_only_plugin()' );\n\treturn is_network_only_plugin( $file );\n}\n\n/**\n * Deprecated functionality for getting themes network-enabled themes.\n *\n * @deprecated 3.4.0 Use WP_Theme::get_allowed_on_network()\n * @see WP_Theme::get_allowed_on_network()\n */\nfunction get_site_allowed_themes() {\n\t_deprecated_function( __FUNCTION__, '3.4', 'WP_Theme::get_allowed_on_network()' );\n\treturn array_map( 'intval', WP_Theme::get_allowed_on_network() );\n}\n\n/**\n * Deprecated functionality for getting themes allowed on a specific site.\n *\n * @deprecated 3.4.0 Use WP_Theme::get_allowed_on_site()\n * @see WP_Theme::get_allowed_on_site()\n */\nfunction wpmu_get_blog_allowedthemes( $blog_id = 0 ) {\n\t_deprecated_function( __FUNCTION__, '3.4', 'WP_Theme::get_allowed_on_site()' );\n\treturn array_map( 'intval', WP_Theme::get_allowed_on_site( $blog_id ) );\n}\n\n/**\n * Deprecated functionality for determining whether a file is deprecated.\n *\n * @deprecated 3.5.0\n */\nfunction ms_deprecated_blogs_file() {}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/ms.php",
    "content": "<?php\n/**\n * Multisite administration functions.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/**\n * Determine if uploaded file exceeds space quota.\n *\n * @since 3.0.0\n *\n * @param array $file $_FILES array for a given file.\n * @return array $_FILES array with 'error' key set if file exceeds quota. 'error' is empty otherwise.\n */\nfunction check_upload_size( $file ) {\n\tif ( get_site_option( 'upload_space_check_disabled' ) )\n\t\treturn $file;\n\n\tif ( $file['error'] != '0' ) // there's already an error\n\t\treturn $file;\n\n\tif ( defined( 'WP_IMPORTING' ) )\n\t\treturn $file;\n\n\t$space_left = get_upload_space_available();\n\n\t$file_size = filesize( $file['tmp_name'] );\n\tif ( $space_left < $file_size ) {\n\t\t$file['error'] = sprintf( __( 'Not enough space to upload. %1$s KB needed.' ), number_format( ( $file_size - $space_left ) / KB_IN_BYTES ) );\n\t}\n\n\tif ( $file_size > ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) {\n\t\t$file['error'] = sprintf( __( 'This file is too big. Files must be less than %1$s KB in size.' ), get_site_option( 'fileupload_maxk', 1500 ) );\n\t}\n\n\tif ( upload_is_user_over_quota( false ) ) {\n\t\t$file['error'] = __( 'You have used your space quota. Please delete files before uploading.' );\n\t}\n\n\tif ( $file['error'] != '0' && ! isset( $_POST['html-upload'] ) && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {\n\t\twp_die( $file['error'] . ' <a href=\"javascript:history.go(-1)\">' . __( 'Back' ) . '</a>' );\n\t}\n\n\treturn $file;\n}\n\n/**\n * Delete a blog.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int  $blog_id Blog ID.\n * @param bool $drop    True if blog's table should be dropped. Default is false.\n */\nfunction wpmu_delete_blog( $blog_id, $drop = false ) {\n\tglobal $wpdb;\n\n\t$switch = false;\n\tif ( get_current_blog_id() != $blog_id ) {\n\t\t$switch = true;\n\t\tswitch_to_blog( $blog_id );\n\t}\n\n\t$blog = get_blog_details( $blog_id );\n\t/**\n\t * Fires before a blog is deleted.\n\t *\n\t * @since MU\n\t *\n\t * @param int  $blog_id The blog ID.\n\t * @param bool $drop    True if blog's table should be dropped. Default is false.\n\t */\n\tdo_action( 'delete_blog', $blog_id, $drop );\n\n\t$users = get_users( array( 'blog_id' => $blog_id, 'fields' => 'ids' ) );\n\n\t// Remove users from this blog.\n\tif ( ! empty( $users ) ) {\n\t\tforeach ( $users as $user_id ) {\n\t\t\tremove_user_from_blog( $user_id, $blog_id );\n\t\t}\n\t}\n\n\tupdate_blog_status( $blog_id, 'deleted', 1 );\n\n\t$current_site = get_current_site();\n\n\t// If a full blog object is not available, do not destroy anything.\n\tif ( $drop && ! $blog ) {\n\t\t$drop = false;\n\t}\n\n\t// Don't destroy the initial, main, or root blog.\n\tif ( $drop && ( 1 == $blog_id || is_main_site( $blog_id ) || ( $blog->path == $current_site->path && $blog->domain == $current_site->domain ) ) ) {\n\t\t$drop = false;\n\t}\n\n\t$upload_path = trim( get_option( 'upload_path' ) );\n\n\t// If ms_files_rewriting is enabled and upload_path is empty, wp_upload_dir is not reliable.\n\tif ( $drop && get_site_option( 'ms_files_rewriting' ) && empty( $upload_path ) ) {\n\t\t$drop = false;\n\t}\n\n\tif ( $drop ) {\n\t\t$uploads = wp_upload_dir();\n\n\t\t$tables = $wpdb->tables( 'blog' );\n\t\t/**\n\t\t * Filter the tables to drop when the blog is deleted.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param array $tables  The blog tables to be dropped.\n\t\t * @param int   $blog_id The ID of the blog to drop tables for.\n\t\t */\n\t\t$drop_tables = apply_filters( 'wpmu_drop_tables', $tables, $blog_id );\n\n\t\tforeach ( (array) $drop_tables as $table ) {\n\t\t\t$wpdb->query( \"DROP TABLE IF EXISTS `$table`\" );\n\t\t}\n\n\t\t$wpdb->delete( $wpdb->blogs, array( 'blog_id' => $blog_id ) );\n\n\t\t/**\n\t\t * Filter the upload base directory to delete when the blog is deleted.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param string $uploads['basedir'] Uploads path without subdirectory. @see wp_upload_dir()\n\t\t * @param int    $blog_id            The blog ID.\n\t\t */\n\t\t$dir = apply_filters( 'wpmu_delete_blog_upload_dir', $uploads['basedir'], $blog_id );\n\t\t$dir = rtrim( $dir, DIRECTORY_SEPARATOR );\n\t\t$top_dir = $dir;\n\t\t$stack = array($dir);\n\t\t$index = 0;\n\n\t\twhile ( $index < count( $stack ) ) {\n\t\t\t// Get indexed directory from stack\n\t\t\t$dir = $stack[$index];\n\n\t\t\t$dh = @opendir( $dir );\n\t\t\tif ( $dh ) {\n\t\t\t\twhile ( ( $file = @readdir( $dh ) ) !== false ) {\n\t\t\t\t\tif ( $file == '.' || $file == '..' )\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tif ( @is_dir( $dir . DIRECTORY_SEPARATOR . $file ) ) {\n\t\t\t\t\t\t$stack[] = $dir . DIRECTORY_SEPARATOR . $file;\n\t\t\t\t\t} elseif ( @is_file( $dir . DIRECTORY_SEPARATOR . $file ) ) {\n\t\t\t\t\t\t@unlink( $dir . DIRECTORY_SEPARATOR . $file );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t@closedir( $dh );\n\t\t\t}\n\t\t\t$index++;\n\t\t}\n\n\t\t$stack = array_reverse( $stack ); // Last added dirs are deepest\n\t\tforeach ( (array) $stack as $dir ) {\n\t\t\tif ( $dir != $top_dir)\n\t\t\t@rmdir( $dir );\n\t\t}\n\n\t\tclean_blog_cache( $blog );\n\t}\n\n\tif ( $switch )\n\t\trestore_current_blog();\n}\n\n/**\n * Delete a user from the network and remove from all sites.\n *\n * @since 3.0.0\n *\n * @todo Merge with wp_delete_user() ?\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $id The user ID.\n * @return bool True if the user was deleted, otherwise false.\n */\nfunction wpmu_delete_user( $id ) {\n\tglobal $wpdb;\n\n\tif ( ! is_numeric( $id ) ) {\n\t\treturn false;\n\t}\n\n\t$id = (int) $id;\n\t$user = new WP_User( $id );\n\n\tif ( !$user->exists() )\n\t\treturn false;\n\n\t// Global super-administrators are protected, and cannot be deleted.\n\t$_super_admins = get_super_admins();\n\tif ( in_array( $user->user_login, $_super_admins, true ) ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fires before a user is deleted from the network.\n\t *\n\t * @since MU\n\t *\n\t * @param int $id ID of the user about to be deleted from the network.\n\t */\n\tdo_action( 'wpmu_delete_user', $id );\n\n\t$blogs = get_blogs_of_user( $id );\n\n\tif ( ! empty( $blogs ) ) {\n\t\tforeach ( $blogs as $blog ) {\n\t\t\tswitch_to_blog( $blog->userblog_id );\n\t\t\tremove_user_from_blog( $id, $blog->userblog_id );\n\n\t\t\t$post_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT ID FROM $wpdb->posts WHERE post_author = %d\", $id ) );\n\t\t\tforeach ( (array) $post_ids as $post_id ) {\n\t\t\t\twp_delete_post( $post_id );\n\t\t\t}\n\n\t\t\t// Clean links\n\t\t\t$link_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT link_id FROM $wpdb->links WHERE link_owner = %d\", $id ) );\n\n\t\t\tif ( $link_ids ) {\n\t\t\t\tforeach ( $link_ids as $link_id )\n\t\t\t\t\twp_delete_link( $link_id );\n\t\t\t}\n\n\t\t\trestore_current_blog();\n\t\t}\n\t}\n\n\t$meta = $wpdb->get_col( $wpdb->prepare( \"SELECT umeta_id FROM $wpdb->usermeta WHERE user_id = %d\", $id ) );\n\tforeach ( $meta as $mid )\n\t\tdelete_metadata_by_mid( 'user', $mid );\n\n\t$wpdb->delete( $wpdb->users, array( 'ID' => $id ) );\n\n\tclean_user_cache( $user );\n\n\t/** This action is documented in wp-admin/includes/user.php */\n\tdo_action( 'deleted_user', $id );\n\n\treturn true;\n}\n\n/**\n * Sends an email when a site administrator email address is changed.\n *\n * @since 3.0.0\n *\n * @param string $old_value The old email address. Not currently used.\n * @param string $value     The new email address.\n */\nfunction update_option_new_admin_email( $old_value, $value ) {\n\tif ( $value == get_option( 'admin_email' ) || !is_email( $value ) )\n\t\treturn;\n\n\t$hash = md5( $value. time() .mt_rand() );\n\t$new_admin_email = array(\n\t\t'hash' => $hash,\n\t\t'newemail' => $value\n\t);\n\tupdate_option( 'adminhash', $new_admin_email );\n\n\t/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */\n\t$email_text = __( 'Howdy ###USERNAME###,\n\nYou recently requested to have the administration email address on\nyour site changed.\n\nIf this is correct, please click on the following link to change it:\n###ADMIN_URL###\n\nYou can safely ignore and delete this email if you do not want to\ntake this action.\n\nThis email has been sent to ###EMAIL###\n\nRegards,\nAll at ###SITENAME###\n###SITEURL###' );\n\n\t/**\n\t * Filter the email text sent when the site admin email is changed.\n\t *\n\t * The following strings have a special meaning and will get replaced dynamically:\n\t * ###USERNAME###  The current user's username.\n\t * ###ADMIN_URL### The link to click on to confirm the email change.\n\t * ###EMAIL###     The new email.\n\t * ###SITENAME###  The name of the site.\n\t * ###SITEURL###   The URL to the site.\n\t *\n\t * @since MU\n\t *\n\t * @param string $email_text      Text in the email.\n\t * @param string $new_admin_email New admin email that the current administration email was changed to.\n\t */\n\t$content = apply_filters( 'new_admin_email_content', $email_text, $new_admin_email );\n\n\t$current_user = wp_get_current_user();\n\t$content = str_replace( '###USERNAME###', $current_user->user_login, $content );\n\t$content = str_replace( '###ADMIN_URL###', esc_url( admin_url( 'options.php?adminhash='.$hash ) ), $content );\n\t$content = str_replace( '###EMAIL###', $value, $content );\n\t$content = str_replace( '###SITENAME###', get_site_option( 'site_name' ), $content );\n\t$content = str_replace( '###SITEURL###', network_home_url(), $content );\n\n\twp_mail( $value, sprintf( __( '[%s] New Admin Email Address' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), $content );\n}\n\n/**\n * Sends an email when an email address change is requested.\n *\n * @since 3.0.0\n *\n * @global WP_Error $errors WP_Error object.\n * @global wpdb     $wpdb   WordPress database object.\n */\nfunction send_confirmation_on_profile_email() {\n\tglobal $errors, $wpdb;\n\t$current_user = wp_get_current_user();\n\tif ( ! is_object($errors) )\n\t\t$errors = new WP_Error();\n\n\tif ( $current_user->ID != $_POST['user_id'] )\n\t\treturn false;\n\n\tif ( $current_user->user_email != $_POST['email'] ) {\n\t\tif ( !is_email( $_POST['email'] ) ) {\n\t\t\t$errors->add( 'user_email', __( \"<strong>ERROR</strong>: The email address isn&#8217;t correct.\" ), array( 'form-field' => 'email' ) );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( $wpdb->get_var( $wpdb->prepare( \"SELECT user_email FROM {$wpdb->users} WHERE user_email=%s\", $_POST['email'] ) ) ) {\n\t\t\t$errors->add( 'user_email', __( \"<strong>ERROR</strong>: The email address is already used.\" ), array( 'form-field' => 'email' ) );\n\t\t\tdelete_option( $current_user->ID . '_new_email' );\n\t\t\treturn;\n\t\t}\n\n\t\t$hash = md5( $_POST['email'] . time() . mt_rand() );\n\t\t$new_user_email = array(\n\t\t\t\t'hash' => $hash,\n\t\t\t\t'newemail' => $_POST['email']\n\t\t\t\t);\n\t\tupdate_option( $current_user->ID . '_new_email', $new_user_email );\n\n\t\t/* translators: Do not translate USERNAME, ADMIN_URL, EMAIL, SITENAME, SITEURL: those are placeholders. */\n\t\t$email_text = __( 'Howdy ###USERNAME###,\n\nYou recently requested to have the email address on your account changed.\n\nIf this is correct, please click on the following link to change it:\n###ADMIN_URL###\n\nYou can safely ignore and delete this email if you do not want to\ntake this action.\n\nThis email has been sent to ###EMAIL###\n\nRegards,\nAll at ###SITENAME###\n###SITEURL###' );\n\n\t\t/**\n\t\t * Filter the email text sent when a user changes emails.\n\t\t *\n\t\t * The following strings have a special meaning and will get replaced dynamically:\n\t\t * ###USERNAME###  The current user's username.\n\t\t * ###ADMIN_URL### The link to click on to confirm the email change.\n\t\t * ###EMAIL###     The new email.\n\t\t * ###SITENAME###  The name of the site.\n\t\t * ###SITEURL###   The URL to the site.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param string $email_text     Text in the email.\n\t\t * @param string $new_user_email New user email that the current user has changed to.\n\t\t */\n\t\t$content = apply_filters( 'new_user_email_content', $email_text, $new_user_email );\n\n\t\t$content = str_replace( '###USERNAME###', $current_user->user_login, $content );\n\t\t$content = str_replace( '###ADMIN_URL###', esc_url( admin_url( 'profile.php?newuseremail='.$hash ) ), $content );\n\t\t$content = str_replace( '###EMAIL###', $_POST['email'], $content);\n\t\t$content = str_replace( '###SITENAME###', get_site_option( 'site_name' ), $content );\n\t\t$content = str_replace( '###SITEURL###', network_home_url(), $content );\n\n\t\twp_mail( $_POST['email'], sprintf( __( '[%s] New Email Address' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), $content );\n\t\t$_POST['email'] = $current_user->user_email;\n\t}\n}\n\n/**\n * Adds an admin notice alerting the user to check for confirmation email\n * after email address change.\n *\n * @since 3.0.0\n */\nfunction new_user_email_admin_notice() {\n\tif ( strpos( $_SERVER['PHP_SELF'], 'profile.php' ) && isset( $_GET['updated'] ) && $email = get_option( get_current_user_id() . '_new_email' ) )\n\t\techo \"<div class='update-nag'>\" . sprintf( __( \"Your email address has not been updated yet. Please check your inbox at %s for a confirmation email.\" ), $email['newemail'] ) . \"</div>\";\n}\n\n/**\n * Check whether a blog has used its allotted upload space.\n *\n * @since MU\n *\n * @param bool $echo Optional. If $echo is set and the quota is exceeded, a warning message is echoed. Default is true.\n * @return bool True if user is over upload space quota, otherwise false.\n */\nfunction upload_is_user_over_quota( $echo = true ) {\n\tif ( get_site_option( 'upload_space_check_disabled' ) )\n\t\treturn false;\n\n\t$space_allowed = get_space_allowed();\n\tif ( ! is_numeric( $space_allowed ) ) {\n\t\t$space_allowed = 10; // Default space allowed is 10 MB\n\t}\n\t$space_used = get_space_used();\n\n\tif ( ( $space_allowed - $space_used ) < 0 ) {\n\t\tif ( $echo )\n\t\t\t_e( 'Sorry, you have used your space allocation. Please delete some files to upload more files.' );\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * Displays the amount of disk space used by the current blog. Not used in core.\n *\n * @since MU\n */\nfunction display_space_usage() {\n\t$space_allowed = get_space_allowed();\n\t$space_used = get_space_used();\n\n\t$percent_used = ( $space_used / $space_allowed ) * 100;\n\n\tif ( $space_allowed > 1000 ) {\n\t\t$space = number_format( $space_allowed / KB_IN_BYTES );\n\t\t/* translators: Gigabytes */\n\t\t$space .= __( 'GB' );\n\t} else {\n\t\t$space = number_format( $space_allowed );\n\t\t/* translators: Megabytes */\n\t\t$space .= __( 'MB' );\n\t}\n\t?>\n\t<strong><?php printf( __( 'Used: %1$s%% of %2$s' ), number_format( $percent_used ), $space ); ?></strong>\n\t<?php\n}\n\n/**\n * Get the remaining upload space for this blog.\n *\n * @since MU\n *\n * @param int $size Current max size in bytes\n * @return int Max size in bytes\n */\nfunction fix_import_form_size( $size ) {\n\tif ( upload_is_user_over_quota( false ) ) {\n\t\treturn 0;\n\t}\n\t$available = get_upload_space_available();\n\treturn min( $size, $available );\n}\n\n/**\n * Displays the edit blog upload space setting form on the Edit Blog screen.\n *\n * @since 3.0.0\n *\n * @param int $id The ID of the blog to display the setting for.\n */\nfunction upload_space_setting( $id ) {\n\tswitch_to_blog( $id );\n\t$quota = get_option( 'blog_upload_space' );\n\trestore_current_blog();\n\n\tif ( !$quota )\n\t\t$quota = '';\n\n\t?>\n\t<tr>\n\t\t<th><label for=\"blog-upload-space-number\"><?php _e( 'Site Upload Space Quota' ); ?></label></th>\n\t\t<td>\n\t\t\t<input type=\"number\" step=\"1\" min=\"0\" style=\"width: 100px\" name=\"option[blog_upload_space]\" id=\"blog-upload-space-number\" aria-describedby=\"blog-upload-space-desc\" value=\"<?php echo $quota; ?>\" />\n\t\t\t<span id=\"blog-upload-space-desc\"><span class=\"screen-reader-text\"><?php _e( 'Size in megabytes' ); ?></span> <?php _e( 'MB (Leave blank for network default)' ); ?></span>\n\t\t</td>\n\t</tr>\n\t<?php\n}\n\n/**\n * Update the status of a user in the database.\n *\n * Used in core to mark a user as spam or \"ham\" (not spam) in Multisite.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $id         The user ID.\n * @param string $pref       The column in the wp_users table to update the user's status\n *                           in (presumably user_status, spam, or deleted).\n * @param int    $value      The new status for the user.\n * @param null   $deprecated Deprecated as of 3.0.2 and should not be used.\n * @return int   The initially passed $value.\n */\nfunction update_user_status( $id, $pref, $value, $deprecated = null ) {\n\tglobal $wpdb;\n\n\tif ( null !== $deprecated )\n\t\t_deprecated_argument( __FUNCTION__, '3.1' );\n\n\t$wpdb->update( $wpdb->users, array( sanitize_key( $pref ) => $value ), array( 'ID' => $id ) );\n\n\t$user = new WP_User( $id );\n\tclean_user_cache( $user );\n\n\tif ( $pref == 'spam' ) {\n\t\tif ( $value == 1 ) {\n\t\t\t/**\n\t\t\t * Fires after the user is marked as a SPAM user.\n\t\t\t *\n\t\t\t * @since 3.0.0\n\t\t\t *\n\t\t\t * @param int $id ID of the user marked as SPAM.\n\t\t\t */\n\t\t\tdo_action( 'make_spam_user', $id );\n\t\t} else {\n\t\t\t/**\n\t\t\t * Fires after the user is marked as a HAM user. Opposite of SPAM.\n\t\t\t *\n\t\t\t * @since 3.0.0\n\t\t\t *\n\t\t\t * @param int $id ID of the user marked as HAM.\n\t\t\t */\n\t\t\tdo_action( 'make_ham_user', $id );\n\t\t}\n\t}\n\n\treturn $value;\n}\n\n/**\n * Cleans the user cache for a specific user.\n *\n * @since 3.0.0\n *\n * @param int $id The user ID.\n * @return bool|int The ID of the refreshed user or false if the user does not exist.\n */\nfunction refresh_user_details( $id ) {\n\t$id = (int) $id;\n\n\tif ( !$user = get_userdata( $id ) )\n\t\treturn false;\n\n\tclean_user_cache( $user );\n\n\treturn $id;\n}\n\n/**\n * Returns the language for a language code.\n *\n * @since 3.0.0\n *\n * @param string $code Optional. The two-letter language code. Default empty.\n * @return string The language corresponding to $code if it exists. If it does not exist,\n *                then the first two letters of $code is returned.\n */\nfunction format_code_lang( $code = '' ) {\n\t$code = strtolower( substr( $code, 0, 2 ) );\n\t$lang_codes = array(\n\t\t'aa' => 'Afar', 'ab' => 'Abkhazian', 'af' => 'Afrikaans', 'ak' => 'Akan', 'sq' => 'Albanian', 'am' => 'Amharic', 'ar' => 'Arabic', 'an' => 'Aragonese', 'hy' => 'Armenian', 'as' => 'Assamese', 'av' => 'Avaric', 'ae' => 'Avestan', 'ay' => 'Aymara', 'az' => 'Azerbaijani', 'ba' => 'Bashkir', 'bm' => 'Bambara', 'eu' => 'Basque', 'be' => 'Belarusian', 'bn' => 'Bengali',\n\t\t'bh' => 'Bihari', 'bi' => 'Bislama', 'bs' => 'Bosnian', 'br' => 'Breton', 'bg' => 'Bulgarian', 'my' => 'Burmese', 'ca' => 'Catalan; Valencian', 'ch' => 'Chamorro', 'ce' => 'Chechen', 'zh' => 'Chinese', 'cu' => 'Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic', 'cv' => 'Chuvash', 'kw' => 'Cornish', 'co' => 'Corsican', 'cr' => 'Cree',\n\t\t'cs' => 'Czech', 'da' => 'Danish', 'dv' => 'Divehi; Dhivehi; Maldivian', 'nl' => 'Dutch; Flemish', 'dz' => 'Dzongkha', 'en' => 'English', 'eo' => 'Esperanto', 'et' => 'Estonian', 'ee' => 'Ewe', 'fo' => 'Faroese', 'fj' => 'Fijjian', 'fi' => 'Finnish', 'fr' => 'French', 'fy' => 'Western Frisian', 'ff' => 'Fulah', 'ka' => 'Georgian', 'de' => 'German', 'gd' => 'Gaelic; Scottish Gaelic',\n\t\t'ga' => 'Irish', 'gl' => 'Galician', 'gv' => 'Manx', 'el' => 'Greek, Modern', 'gn' => 'Guarani', 'gu' => 'Gujarati', 'ht' => 'Haitian; Haitian Creole', 'ha' => 'Hausa', 'he' => 'Hebrew', 'hz' => 'Herero', 'hi' => 'Hindi', 'ho' => 'Hiri Motu', 'hu' => 'Hungarian', 'ig' => 'Igbo', 'is' => 'Icelandic', 'io' => 'Ido', 'ii' => 'Sichuan Yi', 'iu' => 'Inuktitut', 'ie' => 'Interlingue',\n\t\t'ia' => 'Interlingua (International Auxiliary Language Association)', 'id' => 'Indonesian', 'ik' => 'Inupiaq', 'it' => 'Italian', 'jv' => 'Javanese', 'ja' => 'Japanese', 'kl' => 'Kalaallisut; Greenlandic', 'kn' => 'Kannada', 'ks' => 'Kashmiri', 'kr' => 'Kanuri', 'kk' => 'Kazakh', 'km' => 'Central Khmer', 'ki' => 'Kikuyu; Gikuyu', 'rw' => 'Kinyarwanda', 'ky' => 'Kirghiz; Kyrgyz',\n\t\t'kv' => 'Komi', 'kg' => 'Kongo', 'ko' => 'Korean', 'kj' => 'Kuanyama; Kwanyama', 'ku' => 'Kurdish', 'lo' => 'Lao', 'la' => 'Latin', 'lv' => 'Latvian', 'li' => 'Limburgan; Limburger; Limburgish', 'ln' => 'Lingala', 'lt' => 'Lithuanian', 'lb' => 'Luxembourgish; Letzeburgesch', 'lu' => 'Luba-Katanga', 'lg' => 'Ganda', 'mk' => 'Macedonian', 'mh' => 'Marshallese', 'ml' => 'Malayalam',\n\t\t'mi' => 'Maori', 'mr' => 'Marathi', 'ms' => 'Malay', 'mg' => 'Malagasy', 'mt' => 'Maltese', 'mo' => 'Moldavian', 'mn' => 'Mongolian', 'na' => 'Nauru', 'nv' => 'Navajo; Navaho', 'nr' => 'Ndebele, South; South Ndebele', 'nd' => 'Ndebele, North; North Ndebele', 'ng' => 'Ndonga', 'ne' => 'Nepali', 'nn' => 'Norwegian Nynorsk; Nynorsk, Norwegian', 'nb' => 'Bokmål, Norwegian, Norwegian Bokmål',\n\t\t'no' => 'Norwegian', 'ny' => 'Chichewa; Chewa; Nyanja', 'oc' => 'Occitan, Provençal', 'oj' => 'Ojibwa', 'or' => 'Oriya', 'om' => 'Oromo', 'os' => 'Ossetian; Ossetic', 'pa' => 'Panjabi; Punjabi', 'fa' => 'Persian', 'pi' => 'Pali', 'pl' => 'Polish', 'pt' => 'Portuguese', 'ps' => 'Pushto', 'qu' => 'Quechua', 'rm' => 'Romansh', 'ro' => 'Romanian', 'rn' => 'Rundi', 'ru' => 'Russian',\n\t\t'sg' => 'Sango', 'sa' => 'Sanskrit', 'sr' => 'Serbian', 'hr' => 'Croatian', 'si' => 'Sinhala; Sinhalese', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'se' => 'Northern Sami', 'sm' => 'Samoan', 'sn' => 'Shona', 'sd' => 'Sindhi', 'so' => 'Somali', 'st' => 'Sotho, Southern', 'es' => 'Spanish; Castilian', 'sc' => 'Sardinian', 'ss' => 'Swati', 'su' => 'Sundanese', 'sw' => 'Swahili',\n\t\t'sv' => 'Swedish', 'ty' => 'Tahitian', 'ta' => 'Tamil', 'tt' => 'Tatar', 'te' => 'Telugu', 'tg' => 'Tajik', 'tl' => 'Tagalog', 'th' => 'Thai', 'bo' => 'Tibetan', 'ti' => 'Tigrinya', 'to' => 'Tonga (Tonga Islands)', 'tn' => 'Tswana', 'ts' => 'Tsonga', 'tk' => 'Turkmen', 'tr' => 'Turkish', 'tw' => 'Twi', 'ug' => 'Uighur; Uyghur', 'uk' => 'Ukrainian', 'ur' => 'Urdu', 'uz' => 'Uzbek',\n\t\t've' => 'Venda', 'vi' => 'Vietnamese', 'vo' => 'Volapük', 'cy' => 'Welsh','wa' => 'Walloon','wo' => 'Wolof', 'xh' => 'Xhosa', 'yi' => 'Yiddish', 'yo' => 'Yoruba', 'za' => 'Zhuang; Chuang', 'zu' => 'Zulu' );\n\n\t/**\n\t * Filter the language codes.\n\t *\n\t * @since MU\n\t *\n\t * @param array  $lang_codes Key/value pair of language codes where key is the short version.\n\t * @param string $code       A two-letter designation of the language.\n\t */\n\t$lang_codes = apply_filters( 'lang_codes', $lang_codes, $code );\n\treturn strtr( $code, $lang_codes );\n}\n\n/**\n * Synchronize category and post tag slugs when global terms are enabled.\n *\n * @since 3.0.0\n *\n * @param object $term     The term.\n * @param string $taxonomy The taxonomy for $term. Should be 'category' or 'post_tag', as these are\n *                         the only taxonomies which are processed by this function; anything else\n *                         will be returned untouched.\n * @return object|array Returns `$term`, after filtering the 'slug' field with {@see sanitize_title()}\n *                      if $taxonomy is 'category' or 'post_tag'.\n */\nfunction sync_category_tag_slugs( $term, $taxonomy ) {\n\tif ( global_terms_enabled() && ( $taxonomy == 'category' || $taxonomy == 'post_tag' ) ) {\n\t\tif ( is_object( $term ) ) {\n\t\t\t$term->slug = sanitize_title( $term->name );\n\t\t} else {\n\t\t\t$term['slug'] = sanitize_title( $term['name'] );\n\t\t}\n\t}\n\treturn $term;\n}\n\n/**\n * Displays an access denied message when a user tries to view a site's dashboard they\n * do not have access to.\n *\n * @since 3.2.0\n * @access private\n */\nfunction _access_denied_splash() {\n\tif ( ! is_user_logged_in() || is_network_admin() )\n\t\treturn;\n\n\t$blogs = get_blogs_of_user( get_current_user_id() );\n\n\tif ( wp_list_filter( $blogs, array( 'userblog_id' => get_current_blog_id() ) ) )\n\t\treturn;\n\n\t$blog_name = get_bloginfo( 'name' );\n\n\tif ( empty( $blogs ) )\n\t\twp_die( sprintf( __( 'You attempted to access the \"%1$s\" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the \"%1$s\" dashboard, please contact your network administrator.' ), $blog_name ), 403 );\n\n\t$output = '<p>' . sprintf( __( 'You attempted to access the \"%1$s\" dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the \"%1$s\" dashboard, please contact your network administrator.' ), $blog_name ) . '</p>';\n\t$output .= '<p>' . __( 'If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way.' ) . '</p>';\n\n\t$output .= '<h3>' . __('Your Sites') . '</h3>';\n\t$output .= '<table>';\n\n\tforeach ( $blogs as $blog ) {\n\t\t$output .= '<tr>';\n\t\t$output .= \"<td>{$blog->blogname}</td>\";\n\t\t$output .= '<td><a href=\"' . esc_url( get_admin_url( $blog->userblog_id ) ) . '\">' . __( 'Visit Dashboard' ) . '</a> | ' .\n\t\t\t'<a href=\"' . esc_url( get_home_url( $blog->userblog_id ) ). '\">' . __( 'View Site' ) . '</a></td>';\n\t\t$output .= '</tr>';\n\t}\n\n\t$output .= '</table>';\n\n\twp_die( $output, 403 );\n}\n\n/**\n * Checks if the current user has permissions to import new users.\n *\n * @since 3.0.0\n *\n * @param string $permission A permission to be checked. Currently not used.\n * @return bool True if the user has proper permissions, false if they do not.\n */\nfunction check_import_new_users( $permission ) {\n\tif ( !is_super_admin() )\n\t\treturn false;\n\treturn true;\n}\n// See \"import_allow_fetch_attachments\" and \"import_attachment_size_limit\" filters too.\n\n/**\n * Generates and displays a drop-down of available languages.\n *\n * @since 3.0.0\n *\n * @param array  $lang_files Optional. An array of the language files. Default empty array.\n * @param string $current    Optional. The current language code. Default empty.\n */\nfunction mu_dropdown_languages( $lang_files = array(), $current = '' ) {\n\t$flag = false;\n\t$output = array();\n\n\tforeach ( (array) $lang_files as $val ) {\n\t\t$code_lang = basename( $val, '.mo' );\n\n\t\tif ( $code_lang == 'en_US' ) { // American English\n\t\t\t$flag = true;\n\t\t\t$ae = __( 'American English' );\n\t\t\t$output[$ae] = '<option value=\"' . esc_attr( $code_lang ) . '\"' . selected( $current, $code_lang, false ) . '> ' . $ae . '</option>';\n\t\t} elseif ( $code_lang == 'en_GB' ) { // British English\n\t\t\t$flag = true;\n\t\t\t$be = __( 'British English' );\n\t\t\t$output[$be] = '<option value=\"' . esc_attr( $code_lang ) . '\"' . selected( $current, $code_lang, false ) . '> ' . $be . '</option>';\n\t\t} else {\n\t\t\t$translated = format_code_lang( $code_lang );\n\t\t\t$output[$translated] = '<option value=\"' . esc_attr( $code_lang ) . '\"' . selected( $current, $code_lang, false ) . '> ' . esc_html ( $translated ) . '</option>';\n\t\t}\n\n\t}\n\n\tif ( $flag === false ) // WordPress english\n\t\t$output[] = '<option value=\"\"' . selected( $current, '', false ) . '>' . __( 'English' ) . \"</option>\";\n\n\t// Order by name\n\tuksort( $output, 'strnatcasecmp' );\n\n\t/**\n\t * Filter the languages available in the dropdown.\n\t *\n\t * @since MU\n\t *\n\t * @param array $output     HTML output of the dropdown.\n\t * @param array $lang_files Available language files.\n\t * @param string $current   The current language code.\n\t */\n\t$output = apply_filters( 'mu_dropdown_languages', $output, $lang_files, $current );\n\n\techo implode( \"\\n\\t\", $output );\n}\n\n/**\n * Displays an admin notice to upgrade all sites after a core upgrade.\n *\n * @since 3.0.0\n *\n * @global int $wp_db_version The version number of the database.\n *\n * @return false False if the current user is not a super admin.\n */\nfunction site_admin_notice() {\n\tglobal $wp_db_version;\n\tif ( !is_super_admin() )\n\t\treturn false;\n\tif ( get_site_option( 'wpmu_upgrade_site' ) != $wp_db_version )\n\t\techo \"<div class='update-nag'>\" . sprintf( __( 'Thank you for Updating! Please visit the <a href=\"%s\">Upgrade Network</a> page to update all your sites.' ), esc_url( network_admin_url( 'upgrade.php' ) ) ) . \"</div>\";\n}\n\n/**\n * Avoids a collision between a site slug and a permalink slug.\n *\n * In a subdirectory install this will make sure that a site and a post do not use the\n * same subdirectory by checking for a site with the same name as a new post.\n *\n * @since 3.0.0\n *\n * @param array $data    An array of post data.\n * @param array $postarr An array of posts. Not currently used.\n * @return array The new array of post data after checking for collisions.\n */\nfunction avoid_blog_page_permalink_collision( $data, $postarr ) {\n\tif ( is_subdomain_install() )\n\t\treturn $data;\n\tif ( $data['post_type'] != 'page' )\n\t\treturn $data;\n\tif ( !isset( $data['post_name'] ) || $data['post_name'] == '' )\n\t\treturn $data;\n\tif ( !is_main_site() )\n\t\treturn $data;\n\n\t$post_name = $data['post_name'];\n\t$c = 0;\n\twhile( $c < 10 && get_id_from_blogname( $post_name ) ) {\n\t\t$post_name .= mt_rand( 1, 10 );\n\t\t$c ++;\n\t}\n\tif ( $post_name != $data['post_name'] ) {\n\t\t$data['post_name'] = $post_name;\n\t}\n\treturn $data;\n}\n\n/**\n * Handles the display of choosing a user's primary site.\n *\n * This displays the user's primary site and allows the user to choose\n * which site is primary.\n *\n * @since 3.0.0\n */\nfunction choose_primary_blog() {\n\t?>\n\t<table class=\"form-table\">\n\t<tr>\n\t<?php /* translators: My sites label */ ?>\n\t\t<th scope=\"row\"><label for=\"primary_blog\"><?php _e( 'Primary Site' ); ?></label></th>\n\t\t<td>\n\t\t<?php\n\t\t$all_blogs = get_blogs_of_user( get_current_user_id() );\n\t\t$primary_blog = get_user_meta( get_current_user_id(), 'primary_blog', true );\n\t\tif ( count( $all_blogs ) > 1 ) {\n\t\t\t$found = false;\n\t\t\t?>\n\t\t\t<select name=\"primary_blog\" id=\"primary_blog\">\n\t\t\t\t<?php foreach ( (array) $all_blogs as $blog ) {\n\t\t\t\t\tif ( $primary_blog == $blog->userblog_id )\n\t\t\t\t\t\t$found = true;\n\t\t\t\t\t?><option value=\"<?php echo $blog->userblog_id ?>\"<?php selected( $primary_blog, $blog->userblog_id ); ?>><?php echo esc_url( get_home_url( $blog->userblog_id ) ) ?></option><?php\n\t\t\t\t} ?>\n\t\t\t</select>\n\t\t\t<?php\n\t\t\tif ( !$found ) {\n\t\t\t\t$blog = reset( $all_blogs );\n\t\t\t\tupdate_user_meta( get_current_user_id(), 'primary_blog', $blog->userblog_id );\n\t\t\t}\n\t\t} elseif ( count( $all_blogs ) == 1 ) {\n\t\t\t$blog = reset( $all_blogs );\n\t\t\techo esc_url( get_home_url( $blog->userblog_id ) );\n\t\t\tif ( $primary_blog != $blog->userblog_id ) // Set the primary blog again if it's out of sync with blog list.\n\t\t\t\tupdate_user_meta( get_current_user_id(), 'primary_blog', $blog->userblog_id );\n\t\t} else {\n\t\t\techo \"N/A\";\n\t\t}\n\t\t?>\n\t\t</td>\n\t</tr>\n\t</table>\n\t<?php\n}\n\n/**\n * Grants Super Admin privileges.\n *\n * @since 3.0.0\n *\n * @global array $super_admins\n *\n * @param int $user_id ID of the user to be granted Super Admin privileges.\n * @return bool True on success, false on failure. This can fail when the user is\n *              already a super admin or when the `$super_admins` global is defined.\n */\nfunction grant_super_admin( $user_id ) {\n\t// If global super_admins override is defined, there is nothing to do here.\n\tif ( isset( $GLOBALS['super_admins'] ) ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fires before the user is granted Super Admin privileges.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param int $user_id ID of the user that is about to be granted Super Admin privileges.\n\t */\n\tdo_action( 'grant_super_admin', $user_id );\n\n\t// Directly fetch site_admins instead of using get_super_admins()\n\t$super_admins = get_site_option( 'site_admins', array( 'admin' ) );\n\n\t$user = get_userdata( $user_id );\n\tif ( $user && ! in_array( $user->user_login, $super_admins ) ) {\n\t\t$super_admins[] = $user->user_login;\n\t\tupdate_site_option( 'site_admins' , $super_admins );\n\n\t\t/**\n\t\t * Fires after the user is granted Super Admin privileges.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param int $user_id ID of the user that was granted Super Admin privileges.\n\t\t */\n\t\tdo_action( 'granted_super_admin', $user_id );\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Revokes Super Admin privileges.\n *\n * @since 3.0.0\n *\n * @global array $super_admins\n *\n * @param int $user_id ID of the user Super Admin privileges to be revoked from.\n * @return bool True on success, false on failure. This can fail when the user's email\n *              is the network admin email or when the `$super_admins` global is defined.\n */\nfunction revoke_super_admin( $user_id ) {\n\t// If global super_admins override is defined, there is nothing to do here.\n\tif ( isset( $GLOBALS['super_admins'] ) ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fires before the user's Super Admin privileges are revoked.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param int $user_id ID of the user Super Admin privileges are being revoked from.\n\t */\n\tdo_action( 'revoke_super_admin', $user_id );\n\n\t// Directly fetch site_admins instead of using get_super_admins()\n\t$super_admins = get_site_option( 'site_admins', array( 'admin' ) );\n\n\t$user = get_userdata( $user_id );\n\tif ( $user && 0 !== strcasecmp( $user->user_email, get_site_option( 'admin_email' ) ) ) {\n\t\tif ( false !== ( $key = array_search( $user->user_login, $super_admins ) ) ) {\n\t\t\tunset( $super_admins[$key] );\n\t\t\tupdate_site_option( 'site_admins', $super_admins );\n\n\t\t\t/**\n\t\t\t * Fires after the user's Super Admin privileges are revoked.\n\t\t\t *\n\t\t\t * @since 3.0.0\n\t\t\t *\n\t\t\t * @param int $user_id ID of the user Super Admin privileges were revoked from.\n\t\t\t */\n\t\t\tdo_action( 'revoked_super_admin', $user_id );\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Whether or not we can edit this network from this page.\n *\n * By default editing of network is restricted to the Network Admin for that `$site_id`\n * this allows for this to be overridden.\n *\n * @since 3.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $site_id The network/site ID to check.\n * @return bool True if network can be edited, otherwise false.\n */\nfunction can_edit_network( $site_id ) {\n\tglobal $wpdb;\n\n\tif ( $site_id == $wpdb->siteid )\n\t\t$result = true;\n\telse\n\t\t$result = false;\n\n\t/**\n\t * Filter whether this network can be edited from this page.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool $result  Whether the network can be edited from this page.\n\t * @param int  $site_id The network/site ID to check.\n\t */\n\treturn apply_filters( 'can_edit_network', $result, $site_id );\n}\n\n/**\n * Thickbox image paths for Network Admin.\n *\n * @since 3.1.0\n *\n * @access private\n */\nfunction _thickbox_path_admin_subfolder() {\n?>\n<script type=\"text/javascript\">\nvar tb_pathToImage = \"<?php echo includes_url( 'js/thickbox/loadingAnimation.gif', 'relative' ); ?>\";\n</script>\n<?php\n}\n\n/**\n *\n * @param array $users\n */\nfunction confirm_delete_users( $users ) {\n\t$current_user = wp_get_current_user();\n\tif ( ! is_array( $users ) || empty( $users ) ) {\n\t\treturn false;\n\t}\n\t?>\n\t<h1><?php esc_html_e( 'Users' ); ?></h1>\n\n\t<?php if ( 1 == count( $users ) ) : ?>\n\t\t<p><?php _e( 'You have chosen to delete the user from all networks and sites.' ); ?></p>\n\t<?php else : ?>\n\t\t<p><?php _e( 'You have chosen to delete the following users from all networks and sites.' ); ?></p>\n\t<?php endif; ?>\n\n\t<form action=\"users.php?action=dodelete\" method=\"post\">\n\t<input type=\"hidden\" name=\"dodelete\" />\n\t<?php\n\twp_nonce_field( 'ms-users-delete' );\n\t$site_admins = get_super_admins();\n\t$admin_out = '<option value=\"' . esc_attr( $current_user->ID ) . '\">' . $current_user->user_login . '</option>'; ?>\n\t<table class=\"form-table\">\n\t<?php foreach ( ( $allusers = (array) $_POST['allusers'] ) as $user_id ) {\n\t\tif ( $user_id != '' && $user_id != '0' ) {\n\t\t\t$delete_user = get_userdata( $user_id );\n\n\t\t\tif ( ! current_user_can( 'delete_user', $delete_user->ID ) ) {\n\t\t\t\twp_die( sprintf( __( 'Warning! User %s cannot be deleted.' ), $delete_user->user_login ) );\n\t\t\t}\n\n\t\t\tif ( in_array( $delete_user->user_login, $site_admins ) ) {\n\t\t\t\twp_die( sprintf( __( 'Warning! User cannot be deleted. The user %s is a network administrator.' ), '<em>' . $delete_user->user_login . '</em>' ) );\n\t\t\t}\n\t\t\t?>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><?php echo $delete_user->user_login; ?>\n\t\t\t\t\t<?php echo '<input type=\"hidden\" name=\"user[]\" value=\"' . esc_attr( $user_id ) . '\" />' . \"\\n\"; ?>\n\t\t\t\t</th>\n\t\t\t<?php $blogs = get_blogs_of_user( $user_id, true );\n\n\t\t\tif ( ! empty( $blogs ) ) {\n\t\t\t\t?>\n\t\t\t\t<td><fieldset><p><legend><?php printf(\n\t\t\t\t\t/* translators: user login */\n\t\t\t\t\t__( 'What should be done with content owned by %s?' ),\n\t\t\t\t\t'<em>' . $delete_user->user_login . '</em>'\n\t\t\t\t); ?></legend></p>\n\t\t\t\t<?php\n\t\t\t\tforeach ( (array) $blogs as $key => $details ) {\n\t\t\t\t\t$blog_users = get_users( array( 'blog_id' => $details->userblog_id, 'fields' => array( 'ID', 'user_login' ) ) );\n\t\t\t\t\tif ( is_array( $blog_users ) && !empty( $blog_users ) ) {\n\t\t\t\t\t\t$user_site = \"<a href='\" . esc_url( get_home_url( $details->userblog_id ) ) . \"'>{$details->blogname}</a>\";\n\t\t\t\t\t\t$user_dropdown = '<label for=\"reassign_user\" class=\"screen-reader-text\">' . __( 'Select a user' ) . '</label>';\n\t\t\t\t\t\t$user_dropdown .= \"<select name='blog[$user_id][$key]' id='reassign_user'>\";\n\t\t\t\t\t\t$user_list = '';\n\t\t\t\t\t\tforeach ( $blog_users as $user ) {\n\t\t\t\t\t\t\tif ( ! in_array( $user->ID, $allusers ) ) {\n\t\t\t\t\t\t\t\t$user_list .= \"<option value='{$user->ID}'>{$user->user_login}</option>\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( '' == $user_list ) {\n\t\t\t\t\t\t\t$user_list = $admin_out;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$user_dropdown .= $user_list;\n\t\t\t\t\t\t$user_dropdown .= \"</select>\\n\";\n\t\t\t\t\t\t?>\n\t\t\t\t\t\t<ul style=\"list-style:none;\">\n\t\t\t\t\t\t\t<li><?php printf( __( 'Site: %s' ), $user_site ); ?></li>\n\t\t\t\t\t\t\t<li><label><input type=\"radio\" id=\"delete_option0\" name=\"delete[<?php echo $details->userblog_id . '][' . $delete_user->ID ?>]\" value=\"delete\" checked=\"checked\" />\n\t\t\t\t\t\t\t<?php _e( 'Delete all content.' ); ?></label></li>\n\t\t\t\t\t\t\t<li><label><input type=\"radio\" id=\"delete_option1\" name=\"delete[<?php echo $details->userblog_id . '][' . $delete_user->ID ?>]\" value=\"reassign\" />\n\t\t\t\t\t\t\t<?php _e( 'Attribute all content to:' ); ?></label>\n\t\t\t\t\t\t\t<?php echo $user_dropdown; ?></li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\techo \"</fieldset></td></tr>\";\n\t\t\t} else {\n\t\t\t\t?>\n\t\t\t\t<td><fieldset><p><legend><?php _e( 'User has no sites or content and will be deleted.' ); ?></legend></p>\n\t\t\t<?php } ?>\n\t\t\t</tr>\n\t\t<?php\n\t\t}\n\t}\n\n\t?>\n\t</table>\n\t<?php\n\t/** This action is documented in wp-admin/users.php */\n\tdo_action( 'delete_user_form', $current_user );\n\n\tif ( 1 == count( $users ) ) : ?>\n\t\t<p><?php _e( 'Once you hit &#8220;Confirm Deletion&#8221;, the user will be permanently removed.' ); ?></p>\n\t<?php else : ?>\n\t\t<p><?php _e( 'Once you hit &#8220;Confirm Deletion&#8221;, these users will be permanently removed.' ); ?></p>\n\t<?php endif;\n\n\tsubmit_button( __('Confirm Deletion'), 'primary' );\n\t?>\n\t</form>\n\t<?php\n\treturn true;\n}\n\n/**\n * Print JavaScript in the header on the Network Settings screen.\n *\n * @since 4.1.0\n*/\nfunction network_settings_add_js() {\n?>\n<script type=\"text/javascript\">\njQuery(document).ready( function($) {\n\tvar languageSelect = $( '#WPLANG' );\n\t$( 'form' ).submit( function() {\n\t\t// Don't show a spinner for English and installed languages,\n\t\t// as there is nothing to download.\n\t\tif ( ! languageSelect.find( 'option:selected' ).data( 'installed' ) ) {\n\t\t\t$( '#submit', this ).after( '<span class=\"spinner language-install-spinner\" />' );\n\t\t}\n\t});\n});\n</script>\n<?php\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/nav-menu.php",
    "content": "<?php\n/**\n * Core Navigation Menu API\n *\n * @package WordPress\n * @subpackage Nav_Menus\n * @since 3.0.0\n */\n\n/** Walker_Nav_Menu_Edit class */\nrequire_once( ABSPATH . 'wp-admin/includes/class-walker-nav-menu-edit.php' );\n\n/** Walker_Nav_Menu_Checklist class */\nrequire_once( ABSPATH . 'wp-admin/includes/class-walker-nav-menu-checklist.php' );\n\n/**\n * Prints the appropriate response to a menu quick search.\n *\n * @since 3.0.0\n *\n * @param array $request The unsanitized request values.\n */\nfunction _wp_ajax_menu_quick_search( $request = array() ) {\n\t$args = array();\n\t$type = isset( $request['type'] ) ? $request['type'] : '';\n\t$object_type = isset( $request['object_type'] ) ? $request['object_type'] : '';\n\t$query = isset( $request['q'] ) ? $request['q'] : '';\n\t$response_format = isset( $request['response-format'] ) && in_array( $request['response-format'], array( 'json', 'markup' ) ) ? $request['response-format'] : 'json';\n\n\tif ( 'markup' == $response_format ) {\n\t\t$args['walker'] = new Walker_Nav_Menu_Checklist;\n\t}\n\n\tif ( 'get-post-item' == $type ) {\n\t\tif ( post_type_exists( $object_type ) ) {\n\t\t\tif ( isset( $request['ID'] ) ) {\n\t\t\t\t$object_id = (int) $request['ID'];\n\t\t\t\tif ( 'markup' == $response_format ) {\n\t\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_post( $object_id ) ) ), 0, (object) $args );\n\t\t\t\t} elseif ( 'json' == $response_format ) {\n\t\t\t\t\techo wp_json_encode(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t'ID' => $object_id,\n\t\t\t\t\t\t\t'post_title' => get_the_title( $object_id ),\n\t\t\t\t\t\t\t'post_type' => get_post_type( $object_id ),\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\techo \"\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t} elseif ( taxonomy_exists( $object_type ) ) {\n\t\t\tif ( isset( $request['ID'] ) ) {\n\t\t\t\t$object_id = (int) $request['ID'];\n\t\t\t\tif ( 'markup' == $response_format ) {\n\t\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_term( $object_id, $object_type ) ) ), 0, (object) $args );\n\t\t\t\t} elseif ( 'json' == $response_format ) {\n\t\t\t\t\t$post_obj = get_term( $object_id, $object_type );\n\t\t\t\t\techo wp_json_encode(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t'ID' => $object_id,\n\t\t\t\t\t\t\t'post_title' => $post_obj->name,\n\t\t\t\t\t\t\t'post_type' => $object_type,\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\techo \"\\n\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t} elseif ( preg_match('/quick-search-(posttype|taxonomy)-([a-zA-Z_-]*\\b)/', $type, $matches) ) {\n\t\tif ( 'posttype' == $matches[1] && get_post_type_object( $matches[2] ) ) {\n\t\t\tquery_posts(array(\n\t\t\t\t'posts_per_page' => 10,\n\t\t\t\t'post_type' => $matches[2],\n\t\t\t\t's' => $query,\n\t\t\t));\n\t\t\tif ( ! have_posts() )\n\t\t\t\treturn;\n\t\t\twhile ( have_posts() ) {\n\t\t\t\tthe_post();\n\t\t\t\tif ( 'markup' == $response_format ) {\n\t\t\t\t\t$var_by_ref = get_the_ID();\n\t\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( get_post( $var_by_ref ) ) ), 0, (object) $args );\n\t\t\t\t} elseif ( 'json' == $response_format ) {\n\t\t\t\t\techo wp_json_encode(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t'ID' => get_the_ID(),\n\t\t\t\t\t\t\t'post_title' => get_the_title(),\n\t\t\t\t\t\t\t'post_type' => get_post_type(),\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\techo \"\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t} elseif ( 'taxonomy' == $matches[1] ) {\n\t\t\t$terms = get_terms( $matches[2], array(\n\t\t\t\t'name__like' => $query,\n\t\t\t\t'number' => 10,\n\t\t\t));\n\t\t\tif ( empty( $terms ) || is_wp_error( $terms ) )\n\t\t\t\treturn;\n\t\t\tforeach ( (array) $terms as $term ) {\n\t\t\t\tif ( 'markup' == $response_format ) {\n\t\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', array( $term ) ), 0, (object) $args );\n\t\t\t\t} elseif ( 'json' == $response_format ) {\n\t\t\t\t\techo wp_json_encode(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t'ID' => $term->term_id,\n\t\t\t\t\t\t\t'post_title' => $term->name,\n\t\t\t\t\t\t\t'post_type' => $matches[2],\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\techo \"\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Register nav menu metaboxes and advanced menu items\n *\n * @since 3.0.0\n **/\nfunction wp_nav_menu_setup() {\n\t// Register meta boxes\n\twp_nav_menu_post_type_meta_boxes();\n\tadd_meta_box( 'add-custom-links', __( 'Custom Links' ), 'wp_nav_menu_item_link_meta_box', 'nav-menus', 'side', 'default' );\n\twp_nav_menu_taxonomy_meta_boxes();\n\n\t// Register advanced menu items (columns)\n\tadd_filter( 'manage_nav-menus_columns', 'wp_nav_menu_manage_columns' );\n\n\t// If first time editing, disable advanced items by default.\n\tif ( false === get_user_option( 'managenav-menuscolumnshidden' ) ) {\n\t\t$user = wp_get_current_user();\n\t\tupdate_user_option($user->ID, 'managenav-menuscolumnshidden',\n\t\t\tarray( 0 => 'link-target', 1 => 'css-classes', 2 => 'xfn', 3 => 'description', 4 => 'title-attribute', ),\n\t\t\ttrue);\n\t}\n}\n\n/**\n * Limit the amount of meta boxes to pages, posts, links, and categories for first time users.\n *\n * @since 3.0.0\n *\n * @global array $wp_meta_boxes\n **/\nfunction wp_initial_nav_menu_meta_boxes() {\n\tglobal $wp_meta_boxes;\n\n\tif ( get_user_option( 'metaboxhidden_nav-menus' ) !== false || ! is_array($wp_meta_boxes) )\n\t\treturn;\n\n\t$initial_meta_boxes = array( 'add-post-type-page', 'add-post-type-post', 'add-custom-links', 'add-category' );\n\t$hidden_meta_boxes = array();\n\n\tforeach ( array_keys($wp_meta_boxes['nav-menus']) as $context ) {\n\t\tforeach ( array_keys($wp_meta_boxes['nav-menus'][$context]) as $priority ) {\n\t\t\tforeach ( $wp_meta_boxes['nav-menus'][$context][$priority] as $box ) {\n\t\t\t\tif ( in_array( $box['id'], $initial_meta_boxes ) ) {\n\t\t\t\t\tunset( $box['id'] );\n\t\t\t\t} else {\n\t\t\t\t\t$hidden_meta_boxes[] = $box['id'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t$user = wp_get_current_user();\n\tupdate_user_option( $user->ID, 'metaboxhidden_nav-menus', $hidden_meta_boxes, true );\n}\n\n/**\n * Creates metaboxes for any post type menu item.\n *\n * @since 3.0.0\n */\nfunction wp_nav_menu_post_type_meta_boxes() {\n\t$post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'object' );\n\n\tif ( ! $post_types )\n\t\treturn;\n\n\tforeach ( $post_types as $post_type ) {\n\t\t/**\n\t\t * Filter whether a menu items meta box will be added for the current\n\t\t * object type.\n\t\t *\n\t\t * If a falsey value is returned instead of an object, the menu items\n\t\t * meta box for the current meta box object will not be added.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param object $meta_box_object The current object to add a menu items\n\t\t *                                meta box for.\n\t\t */\n\t\t$post_type = apply_filters( 'nav_menu_meta_box_object', $post_type );\n\t\tif ( $post_type ) {\n\t\t\t$id = $post_type->name;\n\t\t\t// Give pages a higher priority.\n\t\t\t$priority = ( 'page' == $post_type->name ? 'core' : 'default' );\n\t\t\tadd_meta_box( \"add-post-type-{$id}\", $post_type->labels->name, 'wp_nav_menu_item_post_type_meta_box', 'nav-menus', 'side', $priority, $post_type );\n\t\t}\n\t}\n}\n\n/**\n * Creates metaboxes for any taxonomy menu item.\n *\n * @since 3.0.0\n */\nfunction wp_nav_menu_taxonomy_meta_boxes() {\n\t$taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'object' );\n\n\tif ( !$taxonomies )\n\t\treturn;\n\n\tforeach ( $taxonomies as $tax ) {\n\t\t/** This filter is documented in wp-admin/includes/nav-menu.php */\n\t\t$tax = apply_filters( 'nav_menu_meta_box_object', $tax );\n\t\tif ( $tax ) {\n\t\t\t$id = $tax->name;\n\t\t\tadd_meta_box( \"add-{$id}\", $tax->labels->name, 'wp_nav_menu_item_taxonomy_meta_box', 'nav-menus', 'side', 'default', $tax );\n\t\t}\n\t}\n}\n\n/**\n * Check whether to disable the Menu Locations meta box submit button\n *\n * @since 3.6.0\n *\n * @global bool $one_theme_location_no_menus to determine if no menus exist\n *\n * @param int|string $nav_menu_selected_id (id, name or slug) of the currently-selected menu\n * @return string Disabled attribute if at least one menu exists, false if not\n*/\nfunction wp_nav_menu_disabled_check( $nav_menu_selected_id ) {\n\tglobal $one_theme_location_no_menus;\n\n\tif ( $one_theme_location_no_menus )\n\t\treturn false;\n\n\treturn disabled( $nav_menu_selected_id, 0 );\n}\n\n/**\n * Displays a metabox for the custom links menu item.\n *\n * @since 3.0.0\n *\n * @global int        $_nav_menu_placeholder\n * @global int|string $nav_menu_selected_id\n */\nfunction wp_nav_menu_item_link_meta_box() {\n\tglobal $_nav_menu_placeholder, $nav_menu_selected_id;\n\n\t$_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1;\n\n\t?>\n\t<div class=\"customlinkdiv\" id=\"customlinkdiv\">\n\t\t<input type=\"hidden\" value=\"custom\" name=\"menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-type]\" />\n\t\t<p id=\"menu-item-url-wrap\">\n\t\t\t<label class=\"howto\" for=\"custom-menu-item-url\">\n\t\t\t\t<span><?php _e('URL'); ?></span>\n\t\t\t\t<input id=\"custom-menu-item-url\" name=\"menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-url]\" type=\"text\" class=\"code menu-item-textbox\" value=\"http://\" />\n\t\t\t</label>\n\t\t</p>\n\n\t\t<p id=\"menu-item-name-wrap\">\n\t\t\t<label class=\"howto\" for=\"custom-menu-item-name\">\n\t\t\t\t<span><?php _e( 'Link Text' ); ?></span>\n\t\t\t\t<input id=\"custom-menu-item-name\" name=\"menu-item[<?php echo $_nav_menu_placeholder; ?>][menu-item-title]\" type=\"text\" class=\"regular-text menu-item-textbox input-with-default-title\" title=\"<?php esc_attr_e('Menu Item'); ?>\" />\n\t\t\t</label>\n\t\t</p>\n\n\t\t<p class=\"button-controls\">\n\t\t\t<span class=\"add-to-menu\">\n\t\t\t\t<input type=\"submit\"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class=\"button-secondary submit-add-to-menu right\" value=\"<?php esc_attr_e('Add to Menu'); ?>\" name=\"add-custom-menu-item\" id=\"submit-customlinkdiv\" />\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t</span>\n\t\t</p>\n\n\t</div><!-- /.customlinkdiv -->\n\t<?php\n}\n\n/**\n * Displays a metabox for a post type menu item.\n *\n * @since 3.0.0\n *\n * @global int        $_nav_menu_placeholder\n * @global int|string $nav_menu_selected_id\n *\n * @param string $object Not used.\n * @param string $post_type The post type object.\n */\nfunction wp_nav_menu_item_post_type_meta_box( $object, $post_type ) {\n\tglobal $_nav_menu_placeholder, $nav_menu_selected_id;\n\n\t$post_type_name = $post_type['args']->name;\n\n\t// Paginate browsing for large numbers of post objects.\n\t$per_page = 50;\n\t$pagenum = isset( $_REQUEST[$post_type_name . '-tab'] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1;\n\t$offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0;\n\n\t$args = array(\n\t\t'offset' => $offset,\n\t\t'order' => 'ASC',\n\t\t'orderby' => 'title',\n\t\t'posts_per_page' => $per_page,\n\t\t'post_type' => $post_type_name,\n\t\t'suppress_filters' => true,\n\t\t'update_post_term_cache' => false,\n\t\t'update_post_meta_cache' => false\n\t);\n\n\tif ( isset( $post_type['args']->_default_query ) )\n\t\t$args = array_merge($args, (array) $post_type['args']->_default_query );\n\n\t// @todo transient caching of these results with proper invalidation on updating of a post of this type\n\t$get_posts = new WP_Query;\n\t$posts = $get_posts->query( $args );\n\tif ( ! $get_posts->post_count ) {\n\t\techo '<p>' . __( 'No items.' ) . '</p>';\n\t\treturn;\n\t}\n\n\t$num_pages = $get_posts->max_num_pages;\n\n\t$page_links = paginate_links( array(\n\t\t'base' => add_query_arg(\n\t\t\tarray(\n\t\t\t\t$post_type_name . '-tab' => 'all',\n\t\t\t\t'paged' => '%#%',\n\t\t\t\t'item-type' => 'post_type',\n\t\t\t\t'item-object' => $post_type_name,\n\t\t\t)\n\t\t),\n\t\t'format' => '',\n\t\t'prev_text' => __('&laquo;'),\n\t\t'next_text' => __('&raquo;'),\n\t\t'total' => $num_pages,\n\t\t'current' => $pagenum\n\t));\n\n\t$db_fields = false;\n\tif ( is_post_type_hierarchical( $post_type_name ) ) {\n\t\t$db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' );\n\t}\n\n\t$walker = new Walker_Nav_Menu_Checklist( $db_fields );\n\n\t$current_tab = 'most-recent';\n\tif ( isset( $_REQUEST[$post_type_name . '-tab'] ) && in_array( $_REQUEST[$post_type_name . '-tab'], array('all', 'search') ) ) {\n\t\t$current_tab = $_REQUEST[$post_type_name . '-tab'];\n\t}\n\n\tif ( ! empty( $_REQUEST['quick-search-posttype-' . $post_type_name] ) ) {\n\t\t$current_tab = 'search';\n\t}\n\n\t$removed_args = array(\n\t\t'action',\n\t\t'customlink-tab',\n\t\t'edit-menu-item',\n\t\t'menu-item',\n\t\t'page-tab',\n\t\t'_wpnonce',\n\t);\n\n\t?>\n\t<div id=\"posttype-<?php echo $post_type_name; ?>\" class=\"posttypediv\">\n\t\t<ul id=\"posttype-<?php echo $post_type_name; ?>-tabs\" class=\"posttype-tabs add-menu-item-tabs\">\n\t\t\t<li <?php echo ( 'most-recent' == $current_tab ? ' class=\"tabs\"' : '' ); ?>>\n\t\t\t\t<a class=\"nav-tab-link\" data-type=\"tabs-panel-posttype-<?php echo esc_attr( $post_type_name ); ?>-most-recent\" href=\"<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'most-recent', remove_query_arg($removed_args))); ?>#tabs-panel-posttype-<?php echo $post_type_name; ?>-most-recent\">\n\t\t\t\t\t<?php _e( 'Most Recent' ); ?>\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t\t<li <?php echo ( 'all' == $current_tab ? ' class=\"tabs\"' : '' ); ?>>\n\t\t\t\t<a class=\"nav-tab-link\" data-type=\"<?php echo esc_attr( $post_type_name ); ?>-all\" href=\"<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'all', remove_query_arg($removed_args))); ?>#<?php echo $post_type_name; ?>-all\">\n\t\t\t\t\t<?php _e( 'View All' ); ?>\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t\t<li <?php echo ( 'search' == $current_tab ? ' class=\"tabs\"' : '' ); ?>>\n\t\t\t\t<a class=\"nav-tab-link\" data-type=\"tabs-panel-posttype-<?php echo esc_attr( $post_type_name ); ?>-search\" href=\"<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($post_type_name . '-tab', 'search', remove_query_arg($removed_args))); ?>#tabs-panel-posttype-<?php echo $post_type_name; ?>-search\">\n\t\t\t\t\t<?php _e( 'Search'); ?>\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul><!-- .posttype-tabs -->\n\n\t\t<div id=\"tabs-panel-posttype-<?php echo $post_type_name; ?>-most-recent\" class=\"tabs-panel <?php\n\t\t\techo ( 'most-recent' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );\n\t\t?>\">\n\t\t\t<ul id=\"<?php echo $post_type_name; ?>checklist-most-recent\" class=\"categorychecklist form-no-clear\">\n\t\t\t\t<?php\n\t\t\t\t$recent_args = array_merge( $args, array( 'orderby' => 'post_date', 'order' => 'DESC', 'posts_per_page' => 15 ) );\n\t\t\t\t$most_recent = $get_posts->query( $recent_args );\n\t\t\t\t$args['walker'] = $walker;\n\n\t\t\t\t/**\n\t\t\t\t * Filter the posts displayed in the 'Most Recent' tab of the current\n\t\t\t\t * post type's menu items meta box.\n\t\t\t\t *\n\t\t\t\t * The dynamic portion of the hook name, `$post_type_name`, refers to the post type name.\n\t\t\t\t *\n\t\t\t\t * @since 4.3.0\n\t\t\t\t *\n\t\t\t\t * @param array  $most_recent An array of post objects being listed.\n\t\t\t\t * @param array  $args        An array of WP_Query arguments.\n\t\t\t\t * @param object $post_type   The current post type object for this menu item meta box.\n\t\t\t\t */\n\t\t\t\t$most_recent = apply_filters( \"nav_menu_items_{$post_type_name}_recent\", $most_recent, $args, $post_type );\n\n\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $most_recent), 0, (object) $args );\n\t\t\t\t?>\n\t\t\t</ul>\n\t\t</div><!-- /.tabs-panel -->\n\n\t\t<div class=\"tabs-panel <?php\n\t\t\techo ( 'search' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );\n\t\t?>\" id=\"tabs-panel-posttype-<?php echo $post_type_name; ?>-search\">\n\t\t\t<?php\n\t\t\tif ( isset( $_REQUEST['quick-search-posttype-' . $post_type_name] ) ) {\n\t\t\t\t$searched = esc_attr( $_REQUEST['quick-search-posttype-' . $post_type_name] );\n\t\t\t\t$search_results = get_posts( array( 's' => $searched, 'post_type' => $post_type_name, 'fields' => 'all', 'order' => 'DESC', ) );\n\t\t\t} else {\n\t\t\t\t$searched = '';\n\t\t\t\t$search_results = array();\n\t\t\t}\n\t\t\t?>\n\t\t\t<p class=\"quick-search-wrap\">\n\t\t\t\t<input type=\"search\" class=\"quick-search input-with-default-title\" title=\"<?php esc_attr_e('Search'); ?>\" value=\"<?php echo $searched; ?>\" name=\"quick-search-posttype-<?php echo $post_type_name; ?>\" />\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t<?php submit_button( __( 'Search' ), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array( 'id' => 'submit-quick-search-posttype-' . $post_type_name ) ); ?>\n\t\t\t</p>\n\n\t\t\t<ul id=\"<?php echo $post_type_name; ?>-search-checklist\" data-wp-lists=\"list:<?php echo $post_type_name?>\" class=\"categorychecklist form-no-clear\">\n\t\t\t<?php if ( ! empty( $search_results ) && ! is_wp_error( $search_results ) ) : ?>\n\t\t\t\t<?php\n\t\t\t\t$args['walker'] = $walker;\n\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args );\n\t\t\t\t?>\n\t\t\t<?php elseif ( is_wp_error( $search_results ) ) : ?>\n\t\t\t\t<li><?php echo $search_results->get_error_message(); ?></li>\n\t\t\t<?php elseif ( ! empty( $searched ) ) : ?>\n\t\t\t\t<li><?php _e('No results found.'); ?></li>\n\t\t\t<?php endif; ?>\n\t\t\t</ul>\n\t\t</div><!-- /.tabs-panel -->\n\n\t\t<div id=\"<?php echo $post_type_name; ?>-all\" class=\"tabs-panel tabs-panel-view-all <?php\n\t\t\techo ( 'all' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );\n\t\t?>\">\n\t\t\t<?php if ( ! empty( $page_links ) ) : ?>\n\t\t\t\t<div class=\"add-menu-item-pagelinks\">\n\t\t\t\t\t<?php echo $page_links; ?>\n\t\t\t\t</div>\n\t\t\t<?php endif; ?>\n\t\t\t<ul id=\"<?php echo $post_type_name; ?>checklist\" data-wp-lists=\"list:<?php echo $post_type_name?>\" class=\"categorychecklist form-no-clear\">\n\t\t\t\t<?php\n\t\t\t\t$args['walker'] = $walker;\n\n\t\t\t\t/*\n\t\t\t\t * If we're dealing with pages, let's put a checkbox for the front\n\t\t\t\t * page at the top of the list.\n\t\t\t\t */\n\t\t\t\tif ( 'page' == $post_type_name ) {\n\t\t\t\t\t$front_page = 'page' == get_option('show_on_front') ? (int) get_option( 'page_on_front' ) : 0;\n\t\t\t\t\tif ( ! empty( $front_page ) ) {\n\t\t\t\t\t\t$front_page_obj = get_post( $front_page );\n\t\t\t\t\t\t$front_page_obj->front_or_home = true;\n\t\t\t\t\t\tarray_unshift( $posts, $front_page_obj );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;\n\t\t\t\t\t\tarray_unshift( $posts, (object) array(\n\t\t\t\t\t\t\t'front_or_home' => true,\n\t\t\t\t\t\t\t'ID' => 0,\n\t\t\t\t\t\t\t'object_id' => $_nav_menu_placeholder,\n\t\t\t\t\t\t\t'post_content' => '',\n\t\t\t\t\t\t\t'post_excerpt' => '',\n\t\t\t\t\t\t\t'post_parent' => '',\n\t\t\t\t\t\t\t'post_title' => _x('Home', 'nav menu home label'),\n\t\t\t\t\t\t\t'post_type' => 'nav_menu_item',\n\t\t\t\t\t\t\t'type' => 'custom',\n\t\t\t\t\t\t\t'url' => home_url('/'),\n\t\t\t\t\t\t) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$post_type = get_post_type_object( $post_type_name );\n\t\t\t\t$archive_link = get_post_type_archive_link( $post_type_name );\n\t\t\t\tif ( $post_type->has_archive ) {\n\t\t\t\t\t$_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1;\n\t\t\t\t\tarray_unshift( $posts, (object) array(\n\t\t\t\t\t\t'ID' => 0,\n\t\t\t\t\t\t'object_id' => $_nav_menu_placeholder,\n\t\t\t\t\t\t'object'     => $post_type_name,\n\t\t\t\t\t\t'post_content' => '',\n\t\t\t\t\t\t'post_excerpt' => '',\n\t\t\t\t\t\t'post_title' => $post_type->labels->archives,\n\t\t\t\t\t\t'post_type' => 'nav_menu_item',\n\t\t\t\t\t\t'type' => 'post_type_archive',\n\t\t\t\t\t\t'url' => get_post_type_archive_link( $post_type_name ),\n\t\t\t\t\t) );\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Filter the posts displayed in the 'View All' tab of the current\n\t\t\t\t * post type's menu items meta box.\n\t\t\t\t *\n\t\t\t\t * The dynamic portion of the hook name, `$post_type_name`, refers\n\t\t\t\t * to the slug of the current post type.\n\t\t\t\t *\n\t\t\t\t * @since 3.2.0\n\t\t\t\t *\n\t\t\t\t * @see WP_Query::query()\n\t\t\t\t *\n\t\t\t\t * @param array  $posts     The posts for the current post type.\n\t\t\t\t * @param array  $args      An array of WP_Query arguments.\n\t\t\t\t * @param object $post_type The current post type object for this menu item meta box.\n\t\t\t\t */\n\t\t\t\t$posts = apply_filters( \"nav_menu_items_{$post_type_name}\", $posts, $args, $post_type );\n\t\t\t\t$checkbox_items = walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $posts), 0, (object) $args );\n\n\t\t\t\tif ( 'all' == $current_tab && ! empty( $_REQUEST['selectall'] ) ) {\n\t\t\t\t\t$checkbox_items = preg_replace('/(type=(.)checkbox(\\2))/', '$1 checked=$2checked$2', $checkbox_items);\n\n\t\t\t\t}\n\n\t\t\t\techo $checkbox_items;\n\t\t\t\t?>\n\t\t\t</ul>\n\t\t\t<?php if ( ! empty( $page_links ) ) : ?>\n\t\t\t\t<div class=\"add-menu-item-pagelinks\">\n\t\t\t\t\t<?php echo $page_links; ?>\n\t\t\t\t</div>\n\t\t\t<?php endif; ?>\n\t\t</div><!-- /.tabs-panel -->\n\n\t\t<p class=\"button-controls\">\n\t\t\t<span class=\"list-controls\">\n\t\t\t\t<a href=\"<?php\n\t\t\t\t\techo esc_url( add_query_arg(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t$post_type_name . '-tab' => 'all',\n\t\t\t\t\t\t\t'selectall' => 1,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tremove_query_arg( $removed_args )\n\t\t\t\t\t));\n\t\t\t\t?>#posttype-<?php echo $post_type_name; ?>\" class=\"select-all\"><?php _e('Select All'); ?></a>\n\t\t\t</span>\n\n\t\t\t<span class=\"add-to-menu\">\n\t\t\t\t<input type=\"submit\"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class=\"button-secondary submit-add-to-menu right\" value=\"<?php esc_attr_e( 'Add to Menu' ); ?>\" name=\"add-post-type-menu-item\" id=\"<?php echo esc_attr( 'submit-posttype-' . $post_type_name ); ?>\" />\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t</span>\n\t\t</p>\n\n\t</div><!-- /.posttypediv -->\n\t<?php\n}\n\n/**\n * Displays a metabox for a taxonomy menu item.\n *\n * @since 3.0.0\n *\n * @global int|string $nav_menu_selected_id\n *\n * @param string $object Not used.\n * @param string $taxonomy The taxonomy object.\n */\nfunction wp_nav_menu_item_taxonomy_meta_box( $object, $taxonomy ) {\n\tglobal $nav_menu_selected_id;\n\t$taxonomy_name = $taxonomy['args']->name;\n\n\t// Paginate browsing for large numbers of objects.\n\t$per_page = 50;\n\t$pagenum = isset( $_REQUEST[$taxonomy_name . '-tab'] ) && isset( $_REQUEST['paged'] ) ? absint( $_REQUEST['paged'] ) : 1;\n\t$offset = 0 < $pagenum ? $per_page * ( $pagenum - 1 ) : 0;\n\n\t$args = array(\n\t\t'child_of' => 0,\n\t\t'exclude' => '',\n\t\t'hide_empty' => false,\n\t\t'hierarchical' => 1,\n\t\t'include' => '',\n\t\t'number' => $per_page,\n\t\t'offset' => $offset,\n\t\t'order' => 'ASC',\n\t\t'orderby' => 'name',\n\t\t'pad_counts' => false,\n\t);\n\n\t$terms = get_terms( $taxonomy_name, $args );\n\n\tif ( ! $terms || is_wp_error($terms) ) {\n\t\techo '<p>' . __( 'No items.' ) . '</p>';\n\t\treturn;\n\t}\n\n\t$num_pages = ceil( wp_count_terms( $taxonomy_name , array_merge( $args, array('number' => '', 'offset' => '') ) ) / $per_page );\n\n\t$page_links = paginate_links( array(\n\t\t'base' => add_query_arg(\n\t\t\tarray(\n\t\t\t\t$taxonomy_name . '-tab' => 'all',\n\t\t\t\t'paged' => '%#%',\n\t\t\t\t'item-type' => 'taxonomy',\n\t\t\t\t'item-object' => $taxonomy_name,\n\t\t\t)\n\t\t),\n\t\t'format' => '',\n\t\t'prev_text' => __('&laquo;'),\n\t\t'next_text' => __('&raquo;'),\n\t\t'total' => $num_pages,\n\t\t'current' => $pagenum\n\t));\n\n\t$db_fields = false;\n\tif ( is_taxonomy_hierarchical( $taxonomy_name ) ) {\n\t\t$db_fields = array( 'parent' => 'parent', 'id' => 'term_id' );\n\t}\n\n\t$walker = new Walker_Nav_Menu_Checklist( $db_fields );\n\n\t$current_tab = 'most-used';\n\tif ( isset( $_REQUEST[$taxonomy_name . '-tab'] ) && in_array( $_REQUEST[$taxonomy_name . '-tab'], array('all', 'most-used', 'search') ) ) {\n\t\t$current_tab = $_REQUEST[$taxonomy_name . '-tab'];\n\t}\n\n\tif ( ! empty( $_REQUEST['quick-search-taxonomy-' . $taxonomy_name] ) ) {\n\t\t$current_tab = 'search';\n\t}\n\n\t$removed_args = array(\n\t\t'action',\n\t\t'customlink-tab',\n\t\t'edit-menu-item',\n\t\t'menu-item',\n\t\t'page-tab',\n\t\t'_wpnonce',\n\t);\n\n\t?>\n\t<div id=\"taxonomy-<?php echo $taxonomy_name; ?>\" class=\"taxonomydiv\">\n\t\t<ul id=\"taxonomy-<?php echo $taxonomy_name; ?>-tabs\" class=\"taxonomy-tabs add-menu-item-tabs\">\n\t\t\t<li <?php echo ( 'most-used' == $current_tab ? ' class=\"tabs\"' : '' ); ?>>\n\t\t\t\t<a class=\"nav-tab-link\" data-type=\"tabs-panel-<?php echo esc_attr( $taxonomy_name ); ?>-pop\" href=\"<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($taxonomy_name . '-tab', 'most-used', remove_query_arg($removed_args))); ?>#tabs-panel-<?php echo $taxonomy_name; ?>-pop\">\n\t\t\t\t\t<?php _e( 'Most Used' ); ?>\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t\t<li <?php echo ( 'all' == $current_tab ? ' class=\"tabs\"' : '' ); ?>>\n\t\t\t\t<a class=\"nav-tab-link\" data-type=\"tabs-panel-<?php echo esc_attr( $taxonomy_name ); ?>-all\" href=\"<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($taxonomy_name . '-tab', 'all', remove_query_arg($removed_args))); ?>#tabs-panel-<?php echo $taxonomy_name; ?>-all\">\n\t\t\t\t\t<?php _e( 'View All' ); ?>\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t\t<li <?php echo ( 'search' == $current_tab ? ' class=\"tabs\"' : '' ); ?>>\n\t\t\t\t<a class=\"nav-tab-link\" data-type=\"tabs-panel-search-taxonomy-<?php echo esc_attr( $taxonomy_name ); ?>\" href=\"<?php if ( $nav_menu_selected_id ) echo esc_url(add_query_arg($taxonomy_name . '-tab', 'search', remove_query_arg($removed_args))); ?>#tabs-panel-search-taxonomy-<?php echo $taxonomy_name; ?>\">\n\t\t\t\t\t<?php _e( 'Search' ); ?>\n\t\t\t\t</a>\n\t\t\t</li>\n\t\t</ul><!-- .taxonomy-tabs -->\n\n\t\t<div id=\"tabs-panel-<?php echo $taxonomy_name; ?>-pop\" class=\"tabs-panel <?php\n\t\t\techo ( 'most-used' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );\n\t\t?>\">\n\t\t\t<ul id=\"<?php echo $taxonomy_name; ?>checklist-pop\" class=\"categorychecklist form-no-clear\" >\n\t\t\t\t<?php\n\t\t\t\t$popular_terms = get_terms( $taxonomy_name, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );\n\t\t\t\t$args['walker'] = $walker;\n\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $popular_terms), 0, (object) $args );\n\t\t\t\t?>\n\t\t\t</ul>\n\t\t</div><!-- /.tabs-panel -->\n\n\t\t<div id=\"tabs-panel-<?php echo $taxonomy_name; ?>-all\" class=\"tabs-panel tabs-panel-view-all <?php\n\t\t\techo ( 'all' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );\n\t\t?>\">\n\t\t\t<?php if ( ! empty( $page_links ) ) : ?>\n\t\t\t\t<div class=\"add-menu-item-pagelinks\">\n\t\t\t\t\t<?php echo $page_links; ?>\n\t\t\t\t</div>\n\t\t\t<?php endif; ?>\n\t\t\t<ul id=\"<?php echo $taxonomy_name; ?>checklist\" data-wp-lists=\"list:<?php echo $taxonomy_name?>\" class=\"categorychecklist form-no-clear\">\n\t\t\t\t<?php\n\t\t\t\t$args['walker'] = $walker;\n\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $terms), 0, (object) $args );\n\t\t\t\t?>\n\t\t\t</ul>\n\t\t\t<?php if ( ! empty( $page_links ) ) : ?>\n\t\t\t\t<div class=\"add-menu-item-pagelinks\">\n\t\t\t\t\t<?php echo $page_links; ?>\n\t\t\t\t</div>\n\t\t\t<?php endif; ?>\n\t\t</div><!-- /.tabs-panel -->\n\n\t\t<div class=\"tabs-panel <?php\n\t\t\techo ( 'search' == $current_tab ? 'tabs-panel-active' : 'tabs-panel-inactive' );\n\t\t?>\" id=\"tabs-panel-search-taxonomy-<?php echo $taxonomy_name; ?>\">\n\t\t\t<?php\n\t\t\tif ( isset( $_REQUEST['quick-search-taxonomy-' . $taxonomy_name] ) ) {\n\t\t\t\t$searched = esc_attr( $_REQUEST['quick-search-taxonomy-' . $taxonomy_name] );\n\t\t\t\t$search_results = get_terms( $taxonomy_name, array( 'name__like' => $searched, 'fields' => 'all', 'orderby' => 'count', 'order' => 'DESC', 'hierarchical' => false ) );\n\t\t\t} else {\n\t\t\t\t$searched = '';\n\t\t\t\t$search_results = array();\n\t\t\t}\n\t\t\t?>\n\t\t\t<p class=\"quick-search-wrap\">\n\t\t\t\t<input type=\"search\" class=\"quick-search input-with-default-title\" title=\"<?php esc_attr_e('Search'); ?>\" value=\"<?php echo $searched; ?>\" name=\"quick-search-taxonomy-<?php echo $taxonomy_name; ?>\" />\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t<?php submit_button( __( 'Search' ), 'button-small quick-search-submit button-secondary hide-if-js', 'submit', false, array( 'id' => 'submit-quick-search-taxonomy-' . $taxonomy_name ) ); ?>\n\t\t\t</p>\n\n\t\t\t<ul id=\"<?php echo $taxonomy_name; ?>-search-checklist\" data-wp-lists=\"list:<?php echo $taxonomy_name?>\" class=\"categorychecklist form-no-clear\">\n\t\t\t<?php if ( ! empty( $search_results ) && ! is_wp_error( $search_results ) ) : ?>\n\t\t\t\t<?php\n\t\t\t\t$args['walker'] = $walker;\n\t\t\t\techo walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $search_results), 0, (object) $args );\n\t\t\t\t?>\n\t\t\t<?php elseif ( is_wp_error( $search_results ) ) : ?>\n\t\t\t\t<li><?php echo $search_results->get_error_message(); ?></li>\n\t\t\t<?php elseif ( ! empty( $searched ) ) : ?>\n\t\t\t\t<li><?php _e('No results found.'); ?></li>\n\t\t\t<?php endif; ?>\n\t\t\t</ul>\n\t\t</div><!-- /.tabs-panel -->\n\n\t\t<p class=\"button-controls\">\n\t\t\t<span class=\"list-controls\">\n\t\t\t\t<a href=\"<?php\n\t\t\t\t\techo esc_url(add_query_arg(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t$taxonomy_name . '-tab' => 'all',\n\t\t\t\t\t\t\t'selectall' => 1,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tremove_query_arg($removed_args)\n\t\t\t\t\t));\n\t\t\t\t?>#taxonomy-<?php echo $taxonomy_name; ?>\" class=\"select-all\"><?php _e('Select All'); ?></a>\n\t\t\t</span>\n\n\t\t\t<span class=\"add-to-menu\">\n\t\t\t\t<input type=\"submit\"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?> class=\"button-secondary submit-add-to-menu right\" value=\"<?php esc_attr_e( 'Add to Menu' ); ?>\" name=\"add-taxonomy-menu-item\" id=\"<?php echo esc_attr( 'submit-taxonomy-' . $taxonomy_name ); ?>\" />\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t</span>\n\t\t</p>\n\n\t</div><!-- /.taxonomydiv -->\n\t<?php\n}\n\n/**\n * Save posted nav menu item data.\n *\n * @since 3.0.0\n *\n * @param int $menu_id The menu ID for which to save this item. $menu_id of 0 makes a draft, orphaned menu item.\n * @param array $menu_data The unsanitized posted menu item data.\n * @return array The database IDs of the items saved\n */\nfunction wp_save_nav_menu_items( $menu_id = 0, $menu_data = array() ) {\n\t$menu_id = (int) $menu_id;\n\t$items_saved = array();\n\n\tif ( 0 == $menu_id || is_nav_menu( $menu_id ) ) {\n\n\t\t// Loop through all the menu items' POST values.\n\t\tforeach ( (array) $menu_data as $_possible_db_id => $_item_object_data ) {\n\t\t\tif (\n\t\t\t\t// Checkbox is not checked.\n\t\t\t\tempty( $_item_object_data['menu-item-object-id'] ) &&\n\t\t\t\t(\n\t\t\t\t\t// And item type either isn't set.\n\t\t\t\t\t! isset( $_item_object_data['menu-item-type'] ) ||\n\t\t\t\t\t// Or URL is the default.\n\t\t\t\t\tin_array( $_item_object_data['menu-item-url'], array( 'http://', '' ) ) ||\n\t\t\t\t\t! ( 'custom' == $_item_object_data['menu-item-type'] && ! isset( $_item_object_data['menu-item-db-id'] ) ) || // or it's not a custom menu item (but not the custom home page)\n\t\t\t\t\t// Or it *is* a custom menu item that already exists.\n\t\t\t\t\t! empty( $_item_object_data['menu-item-db-id'] )\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// Then this potential menu item is not getting added to this menu.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If this possible menu item doesn't actually have a menu database ID yet.\n\t\t\tif (\n\t\t\t\tempty( $_item_object_data['menu-item-db-id'] ) ||\n\t\t\t\t( 0 > $_possible_db_id ) ||\n\t\t\t\t$_possible_db_id != $_item_object_data['menu-item-db-id']\n\t\t\t) {\n\t\t\t\t$_actual_db_id = 0;\n\t\t\t} else {\n\t\t\t\t$_actual_db_id = (int) $_item_object_data['menu-item-db-id'];\n\t\t\t}\n\n\t\t\t$args = array(\n\t\t\t\t'menu-item-db-id' => ( isset( $_item_object_data['menu-item-db-id'] ) ? $_item_object_data['menu-item-db-id'] : '' ),\n\t\t\t\t'menu-item-object-id' => ( isset( $_item_object_data['menu-item-object-id'] ) ? $_item_object_data['menu-item-object-id'] : '' ),\n\t\t\t\t'menu-item-object' => ( isset( $_item_object_data['menu-item-object'] ) ? $_item_object_data['menu-item-object'] : '' ),\n\t\t\t\t'menu-item-parent-id' => ( isset( $_item_object_data['menu-item-parent-id'] ) ? $_item_object_data['menu-item-parent-id'] : '' ),\n\t\t\t\t'menu-item-position' => ( isset( $_item_object_data['menu-item-position'] ) ? $_item_object_data['menu-item-position'] : '' ),\n\t\t\t\t'menu-item-type' => ( isset( $_item_object_data['menu-item-type'] ) ? $_item_object_data['menu-item-type'] : '' ),\n\t\t\t\t'menu-item-title' => ( isset( $_item_object_data['menu-item-title'] ) ? $_item_object_data['menu-item-title'] : '' ),\n\t\t\t\t'menu-item-url' => ( isset( $_item_object_data['menu-item-url'] ) ? $_item_object_data['menu-item-url'] : '' ),\n\t\t\t\t'menu-item-description' => ( isset( $_item_object_data['menu-item-description'] ) ? $_item_object_data['menu-item-description'] : '' ),\n\t\t\t\t'menu-item-attr-title' => ( isset( $_item_object_data['menu-item-attr-title'] ) ? $_item_object_data['menu-item-attr-title'] : '' ),\n\t\t\t\t'menu-item-target' => ( isset( $_item_object_data['menu-item-target'] ) ? $_item_object_data['menu-item-target'] : '' ),\n\t\t\t\t'menu-item-classes' => ( isset( $_item_object_data['menu-item-classes'] ) ? $_item_object_data['menu-item-classes'] : '' ),\n\t\t\t\t'menu-item-xfn' => ( isset( $_item_object_data['menu-item-xfn'] ) ? $_item_object_data['menu-item-xfn'] : '' ),\n\t\t\t);\n\n\t\t\t$items_saved[] = wp_update_nav_menu_item( $menu_id, $_actual_db_id, $args );\n\n\t\t}\n\t}\n\treturn $items_saved;\n}\n\n/**\n * Adds custom arguments to some of the meta box object types.\n *\n * @since 3.0.0\n *\n * @access private\n *\n * @param object $object The post type or taxonomy meta-object.\n * @return object The post type of taxonomy object.\n */\nfunction _wp_nav_menu_meta_box_object( $object = null ) {\n\tif ( isset( $object->name ) ) {\n\n\t\tif ( 'page' == $object->name ) {\n\t\t\t$object->_default_query = array(\n\t\t\t\t'orderby' => 'menu_order title',\n\t\t\t\t'post_status' => 'publish',\n\t\t\t);\n\n\t\t// Posts should show only published items.\n\t\t} elseif ( 'post' == $object->name ) {\n\t\t\t$object->_default_query = array(\n\t\t\t\t'post_status' => 'publish',\n\t\t\t);\n\n\t\t// Categories should be in reverse chronological order.\n\t\t} elseif ( 'category' == $object->name ) {\n\t\t\t$object->_default_query = array(\n\t\t\t\t'orderby' => 'id',\n\t\t\t\t'order' => 'DESC',\n\t\t\t);\n\n\t\t// Custom post types should show only published items.\n\t\t} else {\n\t\t\t$object->_default_query = array(\n\t\t\t\t'post_status' => 'publish',\n\t\t\t);\n\t\t}\n\t}\n\n\treturn $object;\n}\n\n/**\n * Returns the menu formatted to edit.\n *\n * @since 3.0.0\n *\n * @param int $menu_id Optional. The ID of the menu to format. Default 0.\n * @return string|WP_Error $output The menu formatted to edit or error object on failure.\n */\nfunction wp_get_nav_menu_to_edit( $menu_id = 0 ) {\n\t$menu = wp_get_nav_menu_object( $menu_id );\n\n\t// If the menu exists, get its items.\n\tif ( is_nav_menu( $menu ) ) {\n\t\t$menu_items = wp_get_nav_menu_items( $menu->term_id, array('post_status' => 'any') );\n\t\t$result = '<div id=\"menu-instructions\" class=\"post-body-plain';\n\t\t$result .= ( ! empty($menu_items) ) ? ' menu-instructions-inactive\">' : '\">';\n\t\t$result .= '<p>' . __( 'Add menu items from the column on the left.' ) . '</p>';\n\t\t$result .= '</div>';\n\n\t\tif ( empty($menu_items) )\n\t\t\treturn $result . ' <ul class=\"menu\" id=\"menu-to-edit\"> </ul>';\n\n\t\t/**\n\t\t * Filter the Walker class used when adding nav menu items.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $class   The walker class to use. Default 'Walker_Nav_Menu_Edit'.\n\t\t * @param int    $menu_id ID of the menu being rendered.\n\t\t */\n\t\t$walker_class_name = apply_filters( 'wp_edit_nav_menu_walker', 'Walker_Nav_Menu_Edit', $menu_id );\n\n\t\tif ( class_exists( $walker_class_name ) ) {\n\t\t\t$walker = new $walker_class_name;\n\t\t} else {\n\t\t\treturn new WP_Error( 'menu_walker_not_exist',\n\t\t\t\t/* translators: %s: walker class name */\n\t\t\t\tsprintf( __( 'The Walker class named %s does not exist.' ),\n\t\t\t\t\t'<strong>' . $walker_class_name . '</strong>'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t$some_pending_menu_items = $some_invalid_menu_items = false;\n\t\tforeach ( (array) $menu_items as $menu_item ) {\n\t\t\tif ( isset( $menu_item->post_status ) && 'draft' == $menu_item->post_status )\n\t\t\t\t$some_pending_menu_items = true;\n\t\t\tif ( ! empty( $menu_item->_invalid ) )\n\t\t\t\t$some_invalid_menu_items = true;\n\t\t}\n\n\t\tif ( $some_pending_menu_items )\n\t\t\t$result .= '<div class=\"updated inline\"><p>' . __('Click Save Menu to make pending menu items public.') . '</p></div>';\n\n\t\tif ( $some_invalid_menu_items )\n\t\t\t$result .= '<div class=\"error inline\"><p>' . __('There are some invalid menu items. Please check or delete them.') . '</p></div>';\n\n\t\t$result .= '<ul class=\"menu\" id=\"menu-to-edit\"> ';\n\t\t$result .= walk_nav_menu_tree( array_map('wp_setup_nav_menu_item', $menu_items), 0, (object) array('walker' => $walker ) );\n\t\t$result .= ' </ul> ';\n\t\treturn $result;\n\t} elseif ( is_wp_error( $menu ) ) {\n\t\treturn $menu;\n\t}\n\n}\n\n/**\n * Returns the columns for the nav menus page.\n *\n * @since 3.0.0\n *\n * @return string|WP_Error $output The menu formatted to edit or error object on failure.\n */\nfunction wp_nav_menu_manage_columns() {\n\treturn array(\n\t\t'_title' => __('Show advanced menu properties'),\n\t\t'cb' => '<input type=\"checkbox\" />',\n\t\t'title-attribute' => __('Title Attribute'),\n\t\t'link-target' => __('Link Target'),\n\t\t'css-classes' => __('CSS Classes'),\n\t\t'xfn' => __('Link Relationship (XFN)'),\n\t\t'description' => __('Description'),\n\t);\n}\n\n/**\n * Deletes orphaned draft menu items\n *\n * @access private\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction _wp_delete_orphaned_draft_menu_items() {\n\tglobal $wpdb;\n\t$delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS );\n\n\t// Delete orphaned draft menu items.\n\t$menu_items_to_delete = $wpdb->get_col($wpdb->prepare(\"SELECT ID FROM $wpdb->posts AS p LEFT JOIN $wpdb->postmeta AS m ON p.ID = m.post_id WHERE post_type = 'nav_menu_item' AND post_status = 'draft' AND meta_key = '_menu_item_orphaned' AND meta_value < '%d'\", $delete_timestamp ) );\n\n\tforeach ( (array) $menu_items_to_delete as $menu_item_id )\n\t\twp_delete_post( $menu_item_id, true );\n}\n\n/**\n * Saves nav menu items\n *\n * @since 3.6.0\n *\n * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu\n * @param string $nav_menu_selected_title Title of the currently-selected menu\n * @return array $messages The menu updated message\n */\nfunction wp_nav_menu_update_menu_items ( $nav_menu_selected_id, $nav_menu_selected_title ) {\n\t$unsorted_menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array( 'orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish' ) );\n\t$messages = array();\n\t$menu_items = array();\n\t// Index menu items by db ID\n\tforeach ( $unsorted_menu_items as $_item )\n\t\t$menu_items[$_item->db_id] = $_item;\n\n\t$post_fields = array(\n\t\t'menu-item-db-id', 'menu-item-object-id', 'menu-item-object',\n\t\t'menu-item-parent-id', 'menu-item-position', 'menu-item-type',\n\t\t'menu-item-title', 'menu-item-url', 'menu-item-description',\n\t\t'menu-item-attr-title', 'menu-item-target', 'menu-item-classes', 'menu-item-xfn'\n\t);\n\n\twp_defer_term_counting( true );\n\t// Loop through all the menu items' POST variables\n\tif ( ! empty( $_POST['menu-item-db-id'] ) ) {\n\t\tforeach ( (array) $_POST['menu-item-db-id'] as $_key => $k ) {\n\n\t\t\t// Menu item title can't be blank\n\t\t\tif ( ! isset( $_POST['menu-item-title'][ $_key ] ) || '' == $_POST['menu-item-title'][ $_key ] )\n\t\t\t\tcontinue;\n\n\t\t\t$args = array();\n\t\t\tforeach ( $post_fields as $field )\n\t\t\t\t$args[$field] = isset( $_POST[$field][$_key] ) ? $_POST[$field][$_key] : '';\n\n\t\t\t$menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, ( $_POST['menu-item-db-id'][$_key] != $_key ? 0 : $_key ), $args );\n\n\t\t\tif ( is_wp_error( $menu_item_db_id ) ) {\n\t\t\t\t$messages[] = '<div id=\"message\" class=\"error\"><p>' . $menu_item_db_id->get_error_message() . '</p></div>';\n\t\t\t} else {\n\t\t\t\tunset( $menu_items[ $menu_item_db_id ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove menu items from the menu that weren't in $_POST\n\tif ( ! empty( $menu_items ) ) {\n\t\tforeach ( array_keys( $menu_items ) as $menu_item_id ) {\n\t\t\tif ( is_nav_menu_item( $menu_item_id ) ) {\n\t\t\t\twp_delete_post( $menu_item_id );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Store 'auto-add' pages.\n\t$auto_add = ! empty( $_POST['auto-add-pages'] );\n\t$nav_menu_option = (array) get_option( 'nav_menu_options' );\n\tif ( ! isset( $nav_menu_option['auto_add'] ) )\n\t\t$nav_menu_option['auto_add'] = array();\n\tif ( $auto_add ) {\n\t\tif ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) )\n\t\t\t$nav_menu_option['auto_add'][] = $nav_menu_selected_id;\n\t} else {\n\t\tif ( false !== ( $key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) ) )\n\t\t\tunset( $nav_menu_option['auto_add'][$key] );\n\t}\n\t// Remove nonexistent/deleted menus\n\t$nav_menu_option['auto_add'] = array_intersect( $nav_menu_option['auto_add'], wp_get_nav_menus( array( 'fields' => 'ids' ) ) );\n\tupdate_option( 'nav_menu_options', $nav_menu_option );\n\n\twp_defer_term_counting( false );\n\n\t/** This action is documented in wp-includes/nav-menu.php */\n\tdo_action( 'wp_update_nav_menu', $nav_menu_selected_id );\n\n\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' .\n\t\t/* translators: %s: nav menu title */\n\t\tsprintf( __( '%s has been updated.' ),\n\t\t\t'<strong>' . $nav_menu_selected_title . '</strong>'\n\t\t) . '</p></div>';\n\n\tunset( $menu_items, $unsorted_menu_items );\n\n\treturn $messages;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/network.php",
    "content": "<?php\n/**\n * WordPress Network Administration API.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Check for an existing network.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return Whether a network exists.\n */\nfunction network_domain_check() {\n\tglobal $wpdb;\n\n\t$sql = $wpdb->prepare( \"SHOW TABLES LIKE %s\", $wpdb->esc_like( $wpdb->site ) );\n\tif ( $wpdb->get_var( $sql ) ) {\n\t\treturn $wpdb->get_var( \"SELECT domain FROM $wpdb->site ORDER BY id ASC LIMIT 1\" );\n\t}\n\treturn false;\n}\n\n/**\n * Allow subdomain install\n *\n * @since 3.0.0\n * @return bool Whether subdomain install is allowed\n */\nfunction allow_subdomain_install() {\n\t$domain = preg_replace( '|https?://([^/]+)|', '$1', get_option( 'home' ) );\n\tif ( parse_url( get_option( 'home' ), PHP_URL_PATH ) || 'localhost' == $domain || preg_match( '|^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$|', $domain ) )\n\t\treturn false;\n\n\treturn true;\n}\n\n/**\n * Allow subdirectory install.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return bool Whether subdirectory install is allowed\n */\nfunction allow_subdirectory_install() {\n\tglobal $wpdb;\n        /**\n         * Filter whether to enable the subdirectory install feature in Multisite.\n         *\n         * @since 3.0.0\n         *\n         * @param bool true Whether to enable the subdirectory install feature in Multisite. Default is false.\n         */\n\tif ( apply_filters( 'allow_subdirectory_install', false ) )\n\t\treturn true;\n\n\tif ( defined( 'ALLOW_SUBDIRECTORY_INSTALL' ) && ALLOW_SUBDIRECTORY_INSTALL )\n\t\treturn true;\n\n\t$post = $wpdb->get_row( \"SELECT ID FROM $wpdb->posts WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish'\" );\n\tif ( empty( $post ) )\n\t\treturn true;\n\n\treturn false;\n}\n\n/**\n * Get base domain of network.\n *\n * @since 3.0.0\n * @return string Base domain.\n */\nfunction get_clean_basedomain() {\n\tif ( $existing_domain = network_domain_check() )\n\t\treturn $existing_domain;\n\t$domain = preg_replace( '|https?://|', '', get_option( 'siteurl' ) );\n\tif ( $slash = strpos( $domain, '/' ) )\n\t\t$domain = substr( $domain, 0, $slash );\n\treturn $domain;\n}\n\n/**\n * Prints step 1 for Network installation process.\n *\n * @todo Realistically, step 1 should be a welcome screen explaining what a Network is and such. Navigating to Tools > Network\n * \tshould not be a sudden \"Welcome to a new install process! Fill this out and click here.\" See also contextual help todo.\n *\n * @since 3.0.0\n *\n * @global bool $is_apache\n *\n * @param WP_Error $errors\n */\nfunction network_step1( $errors = false ) {\n\tglobal $is_apache;\n\n\tif ( defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) {\n\t\techo '<div class=\"error\"><p><strong>' . __('ERROR:') . '</strong> ' . __( 'The constant DO_NOT_UPGRADE_GLOBAL_TABLES cannot be defined when creating a network.' ) . '</p></div>';\n\t\techo '</div>';\n\t\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\t\tdie();\n\t}\n\n\t$active_plugins = get_option( 'active_plugins' );\n\tif ( ! empty( $active_plugins ) ) {\n\t\techo '<div class=\"updated\"><p><strong>' . __('Warning:') . '</strong> ' . sprintf( __( 'Please <a href=\"%s\">deactivate your plugins</a> before enabling the Network feature.' ), admin_url( 'plugins.php?plugin_status=active' ) ) . '</p></div><p>' . __( 'Once the network is created, you may reactivate your plugins.' ) . '</p>';\n\t\techo '</div>';\n\t\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\t\tdie();\n\t}\n\n\t$hostname = get_clean_basedomain();\n\t$has_ports = strstr( $hostname, ':' );\n\tif ( ( false !== $has_ports && ! in_array( $has_ports, array( ':80', ':443' ) ) ) ) {\n\t\techo '<div class=\"error\"><p><strong>' . __( 'ERROR:') . '</strong> ' . __( 'You cannot install a network of sites with your server address.' ) . '</p></div>';\n\t\techo '<p>' . sprintf(\n\t\t\t/* translators: %s: port number */\n\t\t\t__( 'You cannot use port numbers such as %s.' ),\n\t\t\t'<code>' . $has_ports . '</code>'\n\t\t) . '</p>';\n\t\techo '<a href=\"' . esc_url( admin_url() ) . '\">' . __( 'Return to Dashboard' ) . '</a>';\n\t\techo '</div>';\n\t\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\t\tdie();\n\t}\n\n\techo '<form method=\"post\">';\n\n\twp_nonce_field( 'install-network-1' );\n\n\t$error_codes = array();\n\tif ( is_wp_error( $errors ) ) {\n\t\techo '<div class=\"error\"><p><strong>' . __( 'ERROR: The network could not be created.' ) . '</strong></p>';\n\t\tforeach ( $errors->get_error_messages() as $error )\n\t\t\techo \"<p>$error</p>\";\n\t\techo '</div>';\n\t\t$error_codes = $errors->get_error_codes();\n\t}\n\n\t$site_name = ( ! empty( $_POST['sitename'] ) && ! in_array( 'empty_sitename', $error_codes ) ) ? $_POST['sitename'] : sprintf( _x('%s Sites', 'Default network name' ), get_option( 'blogname' ) );\n\t$admin_email = ( ! empty( $_POST['email'] ) && ! in_array( 'invalid_email', $error_codes ) ) ? $_POST['email'] : get_option( 'admin_email' );\n\t?>\n\t<p><?php _e( 'Welcome to the Network installation process!' ); ?></p>\n\t<p><?php _e( 'Fill in the information below and you&#8217;ll be on your way to creating a network of WordPress sites. We will create configuration files in the next step.' ); ?></p>\n\t<?php\n\n\tif ( isset( $_POST['subdomain_install'] ) ) {\n\t\t$subdomain_install = (bool) $_POST['subdomain_install'];\n\t} elseif ( apache_mod_loaded('mod_rewrite') ) { // assume nothing\n\t\t$subdomain_install = true;\n\t} elseif ( !allow_subdirectory_install() ) {\n\t\t$subdomain_install = true;\n\t} else {\n\t\t$subdomain_install = false;\n\t\tif ( $got_mod_rewrite = got_mod_rewrite() ) { // dangerous assumptions \n\t\t\techo '<div class=\"updated inline\"><p><strong>' . __( 'Note:' ) . '</strong> ';\n\t\t\t/* translators: %s: mod_rewrite */\n\t\t\tprintf( __( 'Please make sure the Apache %s module is installed as it will be used at the end of this installation.' ),\n\t\t\t\t'<code>mod_rewrite</code>'\n\t\t\t);\n\t\t\techo '</p>';\n\t\t} elseif ( $is_apache ) {\n\t\t\techo '<div class=\"error inline\"><p><strong>' . __( 'Warning!' ) . '</strong> ';\n\t\t\t/* translators: %s: mod_rewrite */\n\t\t\tprintf( __( 'It looks like the Apache %s module is not installed.' ),\n\t\t\t\t'<code>mod_rewrite</code>'\n\t\t\t);\n\t\t\techo '</p>';\n\t\t}\n\n\t\tif ( $got_mod_rewrite || $is_apache ) { // Protect against mod_rewrite mimicry (but ! Apache)\n\t\t\techo '<p>';\n\t\t\t/* translators: 1: mod_rewrite, 2: mod_rewrite documentation URL, 3: Google search for mod_rewrite */\n\t\t\tprintf( __( 'If %1$s is disabled, ask your administrator to enable that module, or look at the <a href=\"%2$s\">Apache documentation</a> or <a href=\"%3$s\">elsewhere</a> for help setting it up.' ),\n\t\t\t\t'<code>mod_rewrite</code>',\n\t\t\t\t'http://httpd.apache.org/docs/mod/mod_rewrite.html',\n\t\t\t\t'http://www.google.com/search?q=apache+mod_rewrite'\n\t\t\t);\n\t\t\techo '</p></div>';\n\t\t}\n\t}\n\n\tif ( allow_subdomain_install() && allow_subdirectory_install() ) : ?>\n\t\t<h3><?php esc_html_e( 'Addresses of Sites in your Network' ); ?></h3>\n\t\t<p><?php _e( 'Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories.' ); ?>\n\t\t\t<strong><?php _e( 'You cannot change this later.' ); ?></strong></p>\n\t\t<p><?php _e( 'You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality.' ); ?></p>\n\t\t<?php // @todo: Link to an MS readme? ?>\n\t\t<table class=\"form-table\">\n\t\t\t<tr>\n\t\t\t\t<th><label><input type=\"radio\" name=\"subdomain_install\" value=\"1\"<?php checked( $subdomain_install ); ?> /> <?php _e( 'Sub-domains' ); ?></label></th>\n\t\t\t\t<td><?php printf(\n\t\t\t\t\t/* translators: 1: hostname */\n\t\t\t\t\t_x( 'like <code>site1.%1$s</code> and <code>site2.%1$s</code>', 'subdomain examples' ),\n\t\t\t\t\t$hostname\n\t\t\t\t); ?></td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<th><label><input type=\"radio\" name=\"subdomain_install\" value=\"0\"<?php checked( ! $subdomain_install ); ?> /> <?php _e( 'Sub-directories' ); ?></label></th>\n\t\t\t\t<td><?php printf(\n\t\t\t\t\t/* translators: 1: hostname */\n\t\t\t\t\t_x( 'like <code>%1$s/site1</code> and <code>%1$s/site2</code>', 'subdirectory examples' ),\n\t\t\t\t\t$hostname\n\t\t\t\t); ?></td>\n\t\t\t</tr>\n\t\t</table>\n\n<?php\n\tendif;\n\n\t\tif ( WP_CONTENT_DIR != ABSPATH . 'wp-content' && ( allow_subdirectory_install() || ! allow_subdomain_install() ) )\n\t\t\techo '<div class=\"error inline\"><p><strong>' . __('Warning!') . '</strong> ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '</p></div>';\n\n\t\t$is_www = ( 0 === strpos( $hostname, 'www.' ) );\n\t\tif ( $is_www ) :\n\t\t?>\n\t\t<h3><?php esc_html_e( 'Server Address' ); ?></h3>\n\t\t<p><?php printf(\n\t\t\t/* translators: 1: site url 2: host name 3. www */\n\t\t\t__( 'We recommend you change your siteurl to %1$s before enabling the network feature. It will still be possible to visit your site using the %3$s prefix with an address like %2$s but any links will not have the %3$s prefix.' ),\n\t\t\t'<code>' . substr( $hostname, 4 ) . '</code>',\n\t\t\t'<code>' . $hostname . '</code>',\n\t\t\t'<code>www</code>'\n\t\t); ?></p>\n\t\t<table class=\"form-table\">\n\t\t\t<tr>\n\t\t\t\t<th scope='row'><?php esc_html_e( 'Server Address' ); ?></th>\n\t\t\t\t<td>\n\t\t\t\t\t<?php printf(\n\t\t\t\t\t\t/* translators: %s: host name */\n\t\t\t\t\t\t__( 'The internet address of your network will be %s.' ),\n\t\t\t\t\t\t'<code>' . $hostname . '</code>'\n\t\t\t\t\t); ?>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</table>\n\t\t<?php endif; ?>\n\n\t\t<h3><?php esc_html_e( 'Network Details' ); ?></h3>\n\t\t<table class=\"form-table\">\n\t\t<?php if ( 'localhost' == $hostname ) : ?>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><?php esc_html_e( 'Sub-directory Install' ); ?></th>\n\t\t\t\t<td><?php\n\t\t\t\t\tprintf(\n\t\t\t\t\t\t/* translators: 1: localhost 2: localhost.localdomain */\n\t\t\t\t\t\t__( 'Because you are using %1$s, the sites in your WordPress network must use sub-directories. Consider using %2$s if you wish to use sub-domains.' ),\n\t\t\t\t\t\t'<code>localhost</code>',\n\t\t\t\t\t\t'<code>localhost.localdomain</code>'\n\t\t\t\t\t);\n\t\t\t\t\t// Uh oh:\n\t\t\t\t\tif ( !allow_subdirectory_install() )\n\t\t\t\t\t\techo ' <strong>' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';\n\t\t\t\t?></td>\n\t\t\t</tr>\n\t\t<?php elseif ( !allow_subdomain_install() ) : ?>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><?php esc_html_e( 'Sub-directory Install' ); ?></th>\n\t\t\t\t<td><?php\n\t\t\t\t\t_e( 'Because your install is in a directory, the sites in your WordPress network must use sub-directories.' );\n\t\t\t\t\t// Uh oh:\n\t\t\t\t\tif ( !allow_subdirectory_install() )\n\t\t\t\t\t\techo ' <strong>' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';\n\t\t\t\t?></td>\n\t\t\t</tr>\n\t\t<?php elseif ( !allow_subdirectory_install() ) : ?>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><?php esc_html_e( 'Sub-domain Install' ); ?></th>\n\t\t\t\t<td><?php _e( 'Because your install is not new, the sites in your WordPress network must use sub-domains.' );\n\t\t\t\t\techo ' <strong>' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';\n\t\t\t\t?></td>\n\t\t\t</tr>\n\t\t<?php endif; ?>\n\t\t<?php if ( ! $is_www ) : ?>\n\t\t\t<tr>\n\t\t\t\t<th scope='row'><?php esc_html_e( 'Server Address' ); ?></th>\n\t\t\t\t<td>\n\t\t\t\t\t<?php printf(\n\t\t\t\t\t\t/* translators: %s: host name */\n\t\t\t\t\t\t__( 'The internet address of your network will be %s.' ),\n\t\t\t\t\t\t'<code>' . $hostname . '</code>'\n\t\t\t\t\t); ?>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t<?php endif; ?>\n\t\t\t<tr>\n\t\t\t\t<th scope='row'><?php esc_html_e( 'Network Title' ); ?></th>\n\t\t\t\t<td>\n\t\t\t\t\t<input name='sitename' type='text' size='45' value='<?php echo esc_attr( $site_name ); ?>' />\n\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t<?php _e( 'What would you like to call your network?' ); ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<th scope='row'><?php esc_html_e( 'Network Admin Email' ); ?></th>\n\t\t\t\t<td>\n\t\t\t\t\t<input name='email' type='text' size='45' value='<?php echo esc_attr( $admin_email ); ?>' />\n\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t<?php _e( 'Your email address.' ); ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</table>\n\t\t<?php submit_button( __( 'Install' ), 'primary', 'submit' ); ?>\n\t</form>\n\t<?php\n}\n\n/**\n * Prints step 2 for Network installation process.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param WP_Error $errors\n */\nfunction network_step2( $errors = false ) {\n\tglobal $wpdb;\n\n\t$hostname          = get_clean_basedomain();\n\t$slashed_home      = trailingslashit( get_option( 'home' ) );\n\t$base              = parse_url( $slashed_home, PHP_URL_PATH );\n\t$document_root_fix = str_replace( '\\\\', '/', realpath( $_SERVER['DOCUMENT_ROOT'] ) );\n\t$abspath_fix       = str_replace( '\\\\', '/', ABSPATH );\n\t$home_path         = 0 === strpos( $abspath_fix, $document_root_fix ) ? $document_root_fix . $base : get_home_path();\n\t$wp_siteurl_subdir = preg_replace( '#^' . preg_quote( $home_path, '#' ) . '#', '', $abspath_fix );\n\t$rewrite_base      = ! empty( $wp_siteurl_subdir ) ? ltrim( trailingslashit( $wp_siteurl_subdir ), '/' ) : '';\n\n\n\t$location_of_wp_config = $abspath_fix;\n\tif ( ! file_exists( ABSPATH . 'wp-config.php' ) && file_exists( dirname( ABSPATH ) . '/wp-config.php' ) ) {\n\t\t$location_of_wp_config = dirname( $abspath_fix );\n\t}\n\t$location_of_wp_config = trailingslashit( $location_of_wp_config );\n\n\t// Wildcard DNS message.\n\tif ( is_wp_error( $errors ) )\n\t\techo '<div class=\"error\">' . $errors->get_error_message() . '</div>';\n\n\tif ( $_POST ) {\n\t\tif ( allow_subdomain_install() )\n\t\t\t$subdomain_install = allow_subdirectory_install() ? ! empty( $_POST['subdomain_install'] ) : true;\n\t\telse\n\t\t\t$subdomain_install = false;\n\t} else {\n\t\tif ( is_multisite() ) {\n\t\t\t$subdomain_install = is_subdomain_install();\n?>\n\t<p><?php _e( 'The original configuration steps are shown here for reference.' ); ?></p>\n<?php\n\t\t} else {\n\t\t\t$subdomain_install = (bool) $wpdb->get_var( \"SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = 1 AND meta_key = 'subdomain_install'\" );\n?>\n\t<div class=\"error\"><p><strong><?php _e('Warning:'); ?></strong> <?php _e( 'An existing WordPress network was detected.' ); ?></p></div>\n\t<p><?php _e( 'Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables.' ); ?></p>\n<?php\n\t\t}\n\t}\n\n\t$subdir_match          = $subdomain_install ? '' : '([_0-9a-zA-Z-]+/)?';\n\t$subdir_replacement_01 = $subdomain_install ? '' : '$1';\n\t$subdir_replacement_12 = $subdomain_install ? '$1' : '$2';\n\n\tif ( $_POST || ! is_multisite() ) {\n?>\n\t\t<h3><?php esc_html_e( 'Enabling the Network' ); ?></h3>\n\t\t<p><?php _e( 'Complete the following steps to enable the features for creating a network of sites.' ); ?></p>\n\t\t<div class=\"updated inline\"><p><?php\n\t\t\tif ( file_exists( $home_path . '.htaccess' ) ) {\n\t\t\t\tprintf(\n\t\t\t\t\t/* translators: 1: wp-config.php 2: .htaccess */\n\t\t\t\t\t__( '<strong>Caution:</strong> We recommend you back up your existing %1$s and %2$s files.' ),\n\t\t\t\t\t'<code>wp-config.php</code>',\n\t\t\t\t\t'<code>.htaccess</code>'\n\t\t\t\t);\n\t\t\t} elseif ( file_exists( $home_path . 'web.config' ) ) {\n\t\t\t\tprintf(\n\t\t\t\t\t/* translators: 1: wp-config.php 2: web.config */\n\t\t\t\t\t__( '<strong>Caution:</strong> We recommend you back up your existing %1$s and %2$s files.' ),\n\t\t\t\t\t'<code>wp-config.php</code>',\n\t\t\t\t\t'<code>web.config</code>'\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tprintf(\n\t\t\t\t\t/* translators: 1: wp-config.php */\n\t\t\t\t\t__( '<strong>Caution:</strong> We recommend you back up your existing %s file.' ),\n\t\t\t\t\t'<code>wp-config.php</code>'\n\t\t\t\t);\n\t\t\t}\n\t\t?></p></div>\n<?php\n\t}\n?>\n\t\t<ol>\n\t\t\t<li><p><?php printf(\n\t\t\t\t/* translators: 1: wp-config.php 2: location of wp-config file */\n\t\t\t\t__( 'Add the following to your %1$s file in %2$s <strong>above</strong> the line reading <code>/* That&#8217;s all, stop editing! Happy blogging. */</code>:' ),\n\t\t\t\t'<code>wp-config.php</code>',\n\t\t\t\t'<code>' . $location_of_wp_config . '</code>'\n\t\t\t); ?></p>\n\t\t\t\t<textarea class=\"code\" readonly=\"readonly\" cols=\"100\" rows=\"7\">\ndefine('MULTISITE', true);\ndefine('SUBDOMAIN_INSTALL', <?php echo $subdomain_install ? 'true' : 'false'; ?>);\ndefine('DOMAIN_CURRENT_SITE', '<?php echo $hostname; ?>');\ndefine('PATH_CURRENT_SITE', '<?php echo $base; ?>');\ndefine('SITE_ID_CURRENT_SITE', 1);\ndefine('BLOG_ID_CURRENT_SITE', 1);\n</textarea>\n<?php\n\t$keys_salts = array( 'AUTH_KEY' => '', 'SECURE_AUTH_KEY' => '', 'LOGGED_IN_KEY' => '', 'NONCE_KEY' => '', 'AUTH_SALT' => '', 'SECURE_AUTH_SALT' => '', 'LOGGED_IN_SALT' => '', 'NONCE_SALT' => '' );\n\tforeach ( $keys_salts as $c => $v ) {\n\t\tif ( defined( $c ) )\n\t\t\tunset( $keys_salts[ $c ] );\n\t}\n\n\tif ( ! empty( $keys_salts ) ) {\n\t\t$keys_salts_str = '';\n\t\t$from_api = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );\n\t\tif ( is_wp_error( $from_api ) ) {\n\t\t\tforeach ( $keys_salts as $c => $v ) {\n\t\t\t\t$keys_salts_str .= \"\\ndefine( '$c', '\" . wp_generate_password( 64, true, true ) . \"' );\";\n\t\t\t}\n\t\t} else {\n\t\t\t$from_api = explode( \"\\n\", wp_remote_retrieve_body( $from_api ) );\n\t\t\tforeach ( $keys_salts as $c => $v ) {\n\t\t\t\t$keys_salts_str .= \"\\ndefine( '$c', '\" . substr( array_shift( $from_api ), 28, 64 ) . \"' );\";\n\t\t\t}\n\t\t}\n\t\t$num_keys_salts = count( $keys_salts );\n?>\n\t<p>\n\t\t<?php\n\t\t\tif ( 1 == $num_keys_salts ) {\n\t\t\t\tprintf(\n\t\t\t\t\t/* translators: 1: wp-config.php */\n\t\t\t\t\t__( 'This unique authentication key is also missing from your %s file.' ),\n\t\t\t\t\t'<code>wp-config.php</code>'\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tprintf(\n\t\t\t\t\t/* translators: 1: wp-config.php */\n\t\t\t\t\t__( 'These unique authentication keys are also missing from your %s file.' ),\n\t\t\t\t\t'<code>wp-config.php</code>'\n\t\t\t\t);\n\t\t\t}\n\t\t?>\n\t\t<?php _e( 'To make your installation more secure, you should also add:' ); ?>\n\t</p>\n\t<textarea class=\"code\" readonly=\"readonly\" cols=\"100\" rows=\"<?php echo $num_keys_salts; ?>\"><?php echo esc_textarea( $keys_salts_str ); ?></textarea>\n<?php\n\t}\n?>\n</li>\n<?php\n\tif ( iis7_supports_permalinks() ) :\n\t\t// IIS doesn't support RewriteBase, all your RewriteBase are belong to us\n\t\t$iis_subdir_match = ltrim( $base, '/' ) . $subdir_match;\n\t\t$iis_rewrite_base = ltrim( $base, '/' ) . $rewrite_base;\n\t\t$iis_subdir_replacement = $subdomain_install ? '' : '{R:1}';\n\n\t\t$web_config_file = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n    <system.webServer>\n        <rewrite>\n            <rules>\n                <rule name=\"WordPress Rule 1\" stopProcessing=\"true\">\n                    <match url=\"^index\\.php$\" ignoreCase=\"false\" />\n                    <action type=\"None\" />\n                </rule>';\n\t\t\t\tif ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) {\n\t\t\t\t\t$web_config_file .= '\n                <rule name=\"WordPress Rule for Files\" stopProcessing=\"true\">\n                    <match url=\"^' . $iis_subdir_match . 'files/(.+)\" ignoreCase=\"false\" />\n                    <action type=\"Rewrite\" url=\"' . $iis_rewrite_base . WPINC . '/ms-files.php?file={R:1}\" appendQueryString=\"false\" />\n                </rule>';\n                }\n                $web_config_file .= '\n                <rule name=\"WordPress Rule 2\" stopProcessing=\"true\">\n                    <match url=\"^' . $iis_subdir_match . 'wp-admin$\" ignoreCase=\"false\" />\n                    <action type=\"Redirect\" url=\"' . $iis_subdir_replacement . 'wp-admin/\" redirectType=\"Permanent\" />\n                </rule>\n                <rule name=\"WordPress Rule 3\" stopProcessing=\"true\">\n                    <match url=\"^\" ignoreCase=\"false\" />\n                    <conditions logicalGrouping=\"MatchAny\">\n                        <add input=\"{REQUEST_FILENAME}\" matchType=\"IsFile\" ignoreCase=\"false\" />\n                        <add input=\"{REQUEST_FILENAME}\" matchType=\"IsDirectory\" ignoreCase=\"false\" />\n                    </conditions>\n                    <action type=\"None\" />\n                </rule>\n                <rule name=\"WordPress Rule 4\" stopProcessing=\"true\">\n                    <match url=\"^' . $iis_subdir_match . '(wp-(content|admin|includes).*)\" ignoreCase=\"false\" />\n                    <action type=\"Rewrite\" url=\"' . $iis_rewrite_base . '{R:1}\" />\n                </rule>\n                <rule name=\"WordPress Rule 5\" stopProcessing=\"true\">\n                    <match url=\"^' . $iis_subdir_match . '([_0-9a-zA-Z-]+/)?(.*\\.php)$\" ignoreCase=\"false\" />\n                    <action type=\"Rewrite\" url=\"' . $iis_rewrite_base . '{R:2}\" />\n                </rule>\n                <rule name=\"WordPress Rule 6\" stopProcessing=\"true\">\n                    <match url=\".\" ignoreCase=\"false\" />\n                    <action type=\"Rewrite\" url=\"index.php\" />\n                </rule>\n            </rules>\n        </rewrite>\n    </system.webServer>\n</configuration>\n';\n\n\t\techo '<li><p>';\n\t\tprintf(\n\t\t\t/* translators: 1: a filename like .htaccess. 2: a file path. */\n\t\t\t__( 'Add the following to your %1$s file in %2$s, <strong>replacing</strong> other WordPress rules:' ),\n\t\t\t'<code>web.config</code>',\n\t\t\t'<code>' . $home_path . '</code>'\n\t\t);\n\t\techo '</p>';\n\t\tif ( ! $subdomain_install && WP_CONTENT_DIR != ABSPATH . 'wp-content' )\n\t\t\techo '<p><strong>' . __('Warning:') . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '</strong></p>';\n\t\t?>\n\t\t<textarea class=\"code\" readonly=\"readonly\" cols=\"100\" rows=\"20\"><?php echo esc_textarea( $web_config_file ); ?>\n\t\t</textarea></li>\n\t\t</ol>\n\n\t<?php else : // end iis7_supports_permalinks(). construct an htaccess file instead:\n\n\t\t$ms_files_rewriting = '';\n\t\tif ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) {\n\t\t\t$ms_files_rewriting = \"\\n# uploaded files\\nRewriteRule ^\";\n\t\t\t$ms_files_rewriting .= $subdir_match . \"files/(.+) {$rewrite_base}\" . WPINC . \"/ms-files.php?file={$subdir_replacement_12} [L]\" . \"\\n\";\n\t\t}\n\n\t\t$htaccess_file = <<<EOF\nRewriteEngine On\nRewriteBase {$base}\nRewriteRule ^index\\.php$ - [L]\n{$ms_files_rewriting}\n# add a trailing slash to /wp-admin\nRewriteRule ^{$subdir_match}wp-admin$ {$subdir_replacement_01}wp-admin/ [R=301,L]\n\nRewriteCond %{REQUEST_FILENAME} -f [OR]\nRewriteCond %{REQUEST_FILENAME} -d\nRewriteRule ^ - [L]\nRewriteRule ^{$subdir_match}(wp-(content|admin|includes).*) {$rewrite_base}{$subdir_replacement_12} [L]\nRewriteRule ^{$subdir_match}(.*\\.php)$ {$rewrite_base}$subdir_replacement_12 [L]\nRewriteRule . index.php [L]\n\nEOF;\n\n\t\techo '<li><p>';\n\t\tprintf(\n\t\t\t/* translators: 1: a filename like .htaccess. 2: a file path. */\n\t\t\t__( 'Add the following to your %1$s file in %2$s, <strong>replacing</strong> other WordPress rules:' ),\n\t\t\t'<code>.htaccess</code>',\n\t\t\t'<code>' . $home_path . '</code>'\n\t\t);\n\t\techo '</p>';\n\t\tif ( ! $subdomain_install && WP_CONTENT_DIR != ABSPATH . 'wp-content' )\n\t\t\techo '<p><strong>' . __('Warning:') . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '</strong></p>';\n\t\t?>\n\t\t<textarea class=\"code\" readonly=\"readonly\" cols=\"100\" rows=\"<?php echo substr_count( $htaccess_file, \"\\n\" ) + 1; ?>\">\n<?php echo esc_textarea( $htaccess_file ); ?></textarea></li>\n\t\t</ol>\n\n\t<?php endif; // end IIS/Apache code branches.\n\n\tif ( !is_multisite() ) { ?>\n\t\t<p><?php _e( 'Once you complete these steps, your network is enabled and configured. You will have to log in again.' ); ?> <a href=\"<?php echo esc_url( wp_login_url() ); ?>\"><?php _e( 'Log In' ); ?></a></p>\n<?php\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/noop.php",
    "content": "<?php\n\n/**\n * @ignore\n */\nfunction __() {}\n\n/**\n * @ignore\n */\nfunction _x() {}\n\n/**\n * @ignore\n */\nfunction add_filter() {}\n\n/**\n * @ignore\n */\nfunction esc_attr() {}\n\n/**\n * @ignore\n */\nfunction apply_filters() {}\n\n/**\n * @ignore\n */\nfunction get_option() {}\n\n/**\n * @ignore\n */\nfunction is_lighttpd_before_150() {}\n\n/**\n * @ignore\n */\nfunction add_action() {}\n\n/**\n * @ignore\n */\nfunction did_action() {}\n\n/**\n * @ignore\n */\nfunction do_action_ref_array() {}\n\n/**\n * @ignore\n */\nfunction get_bloginfo() {}\n\n/**\n * @ignore\n */\nfunction is_admin() {return true;}\n\n/**\n * @ignore\n */\nfunction site_url() {}\n\n/**\n * @ignore\n */\nfunction admin_url() {}\n\n/**\n * @ignore\n */\nfunction home_url() {}\n\n/**\n * @ignore\n */\nfunction includes_url() {}\n\n/**\n * @ignore\n */\nfunction wp_guess_url() {}\n\nif ( ! function_exists( 'json_encode' ) ) :\n/**\n * @ignore\n */\nfunction json_encode() {}\nendif;\n\nfunction get_file( $path ) {\n\n\tif ( function_exists('realpath') ) {\n\t\t$path = realpath( $path );\n\t}\n\n\tif ( ! $path || ! @is_file( $path ) ) {\n\t\treturn '';\n\t}\n\n\treturn @file_get_contents( $path );\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/options.php",
    "content": "<?php\n/**\n * WordPress Options Administration API.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 4.4.0\n */\n\n/**\n * Output JavaScript to toggle display of additional settings if avatars are disabled.\n *\n * @since 4.2.0\n */\nfunction options_discussion_add_js() {\n?>\n\t<script>\n\t(function($){\n\t\tvar parent = $( '#show_avatars' ),\n\t\t\tchildren = $( '.avatar-settings' );\n\t\tparent.change(function(){\n\t\t\tchildren.toggleClass( 'hide-if-js', ! this.checked );\n\t\t});\n\t})(jQuery);\n\t</script>\n<?php\n}\n\n/**\n * Display JavaScript on the page.\n *\n * @since 3.5.0\n */\nfunction options_general_add_js() {\n?>\n<script type=\"text/javascript\">\n\tjQuery(document).ready(function($){\n\t\tvar $siteName = $( '#wp-admin-bar-site-name' ).children( 'a' ).first(),\n\t\t\thomeURL = ( <?php echo wp_json_encode( get_home_url() ); ?> || '' ).replace( /^(https?:\\/\\/)?(www\\.)?/, '' );\n\n\t\t$( '#blogname' ).on( 'input', function() {\n\t\t\tvar title = $.trim( $( this ).val() ) || homeURL;\n\n\t\t\t// Truncate to 40 characters.\n\t\t\tif ( 40 < title.length ) {\n\t\t\t\ttitle = title.substring( 0, 40 ) + '\\u2026';\n\t\t\t}\n\n\t\t\t$siteName.text( title );\n\t\t});\n\n\t\t$(\"input[name='date_format']\").click(function(){\n\t\t\tif ( \"date_format_custom_radio\" != $(this).attr(\"id\") )\n\t\t\t\t$( \"input[name='date_format_custom']\" ).val( $( this ).val() ).siblings( '.example' ).text( $( this ).parent( 'label' ).text() );\n\t\t});\n\t\t$(\"input[name='date_format_custom']\").focus(function(){\n\t\t\t$( '#date_format_custom_radio' ).prop( 'checked', true );\n\t\t});\n\n\t\t$(\"input[name='time_format']\").click(function(){\n\t\t\tif ( \"time_format_custom_radio\" != $(this).attr(\"id\") )\n\t\t\t\t$( \"input[name='time_format_custom']\" ).val( $( this ).val() ).siblings( '.example' ).text( $( this ).parent( 'label' ).text() );\n\t\t});\n\t\t$(\"input[name='time_format_custom']\").focus(function(){\n\t\t\t$( '#time_format_custom_radio' ).prop( 'checked', true );\n\t\t});\n\t\t$(\"input[name='date_format_custom'], input[name='time_format_custom']\").change( function() {\n\t\t\tvar format = $(this);\n\t\t\tformat.siblings( '.spinner' ).addClass( 'is-active' );\n\t\t\t$.post(ajaxurl, {\n\t\t\t\t\taction: 'date_format_custom' == format.attr('name') ? 'date_format' : 'time_format',\n\t\t\t\t\tdate : format.val()\n\t\t\t\t}, function(d) { format.siblings( '.spinner' ).removeClass( 'is-active' ); format.siblings('.example').text(d); } );\n\t\t});\n\n\t\tvar languageSelect = $( '#WPLANG' );\n\t\t$( 'form' ).submit( function() {\n\t\t\t// Don't show a spinner for English and installed languages,\n\t\t\t// as there is nothing to download.\n\t\t\tif ( ! languageSelect.find( 'option:selected' ).data( 'installed' ) ) {\n\t\t\t\t$( '#submit', this ).after( '<span class=\"spinner language-install-spinner\" />' );\n\t\t\t}\n\t\t});\n\t});\n</script>\n<?php\n}\n\n/**\n * Display JavaScript on the page.\n *\n * @since 3.5.0\n */\nfunction options_permalink_add_js() {\n\t?>\n<script type=\"text/javascript\">\njQuery(document).ready(function() {\n\tjQuery('.permalink-structure input:radio').change(function() {\n\t\tif ( 'custom' == this.value )\n\t\t\treturn;\n\t\tjQuery('#permalink_structure').val( this.value );\n\t});\n\tjQuery('#permalink_structure').focus(function() {\n\t\tjQuery(\"#custom_selection\").attr('checked', 'checked');\n\t});\n});\n</script>\n<?php\n}\n\n/**\n * Display JavaScript on the page.\n *\n * @since 3.5.0\n */\nfunction options_reading_add_js() {\n?>\n<script type=\"text/javascript\">\n\tjQuery(document).ready(function($){\n\t\tvar section = $('#front-static-pages'),\n\t\t\tstaticPage = section.find('input:radio[value=\"page\"]'),\n\t\t\tselects = section.find('select'),\n\t\t\tcheck_disabled = function(){\n\t\t\t\tselects.prop( 'disabled', ! staticPage.prop('checked') );\n\t\t\t};\n\t\tcheck_disabled();\n \t\tsection.find('input:radio').change(check_disabled);\n\t});\n</script>\n<?php\n}\n\n/**\n * Render the blog charset setting.\n *\n * @since 3.5.0\n */\nfunction options_reading_blog_charset() {\n\techo '<input name=\"blog_charset\" type=\"text\" id=\"blog_charset\" value=\"' . esc_attr( get_option( 'blog_charset' ) ) . '\" class=\"regular-text\" />';\n\techo '<p class=\"description\">' . __( 'The <a href=\"https://codex.wordpress.org/Glossary#Character_set\">character encoding</a> of your site (UTF-8 is recommended)' ) . '</p>';\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/plugin-install.php",
    "content": "<?php\n/**\n * WordPress Plugin Install Administration API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Retrieves plugin installer pages from the WordPress.org Plugins API.\n *\n * It is possible for a plugin to override the Plugin API result with three\n * filters. Assume this is for plugins, which can extend on the Plugin Info to\n * offer more choices. This is very powerful and must be used with care when\n * overriding the filters.\n *\n * The first filter, {@see 'plugins_api_args'}, is for the args and gives the action\n * as the second parameter. The hook for {@see 'plugins_api_args'} must ensure that\n * an object is returned.\n *\n * The second filter, {@see 'plugins_api'}, allows a plugin to override the WordPress.org\n * Plugin Install API entirely. If `$action` is 'query_plugins' or 'plugin_information',\n * an object MUST be passed. If `$action` is 'hot_tags` or 'hot_categories', an array MUST\n * be passed.\n *\n * Finally, the third filter, {@see 'plugins_api_result'}, makes it possible to filter the\n * response object or array, depending on the `$action` type.\n *\n * Supported arguments per action:\n *\n * | Argument Name        | query_plugins | plugin_information | hot_tags | hot_categories |\n * | -------------------- | :-----------: | :----------------: | :------: | :------------: |\n * | `$slug`              | No            |  Yes               | No       | No             |\n * | `$per_page`          | Yes           |  No                | No       | No             |\n * | `$page`              | Yes           |  No                | No       | No             |\n * | `$number`            | No            |  No                | Yes      | Yes            |\n * | `$search`            | Yes           |  No                | No       | No             |\n * | `$tag`               | Yes           |  No                | No       | No             |\n * | `$author`            | Yes           |  No                | No       | No             |\n * | `$user`              | Yes           |  No                | No       | No             |\n * | `$browse`            | Yes           |  No                | No       | No             |\n * | `$locale`            | Yes           |  Yes               | No       | No             |\n * | `$installed_plugins` | Yes           |  No                | No       | No             |\n * | `$is_ssl`            | Yes           |  Yes               | No       | No             |\n * | `$fields`            | Yes           |  Yes               | No       | No             |\n *\n * @since 2.7.0\n *\n * @param string       $action API action to perform: 'query_plugins', 'plugin_information',\n *                             'hot_tags' or 'hot_categories'.\n * @param array|object $args   {\n *     Optional. Array or object of arguments to serialize for the Plugin Info API.\n *\n *     @type string  $slug              The plugin slug. Default empty.\n *     @type int     $per_page          Number of plugins per page. Default 24.\n *     @type int     $page              Number of current page. Default 1.\n *     @type int     $number            Number of tags or categories to be queried.\n *     @type string  $search            A search term. Default empty.\n *     @type string  $tag               Tag to filter plugins. Default empty.\n *     @type string  $author            Username of an plugin author to filter plugins. Default empty.\n *     @type string  $user              Username to query for their favorites. Default empty.\n *     @type string  $browse            Browse view: 'popular', 'new', 'beta', 'recommended'.\n *     @type string  $locale            Locale to provide context-sensitive results. Default is the value\n *                                      of get_locale().\n *     @type string  $installed_plugins Installed plugins to provide context-sensitive results.\n *     @type bool    $is_ssl            Whether links should be returned with https or not. Default false.\n *     @type array   $fields            {\n *         Array of fields which should or should not be returned.\n *\n *         @type bool $short_description Whether to return the plugin short description. Default true.\n *         @type bool $description       Whether to return the plugin full description. Default false.\n *         @type bool $sections          Whether to return the plugin readme sections: description, installation,\n *                                       FAQ, screenshots, other notes, and changelog. Default false.\n *         @type bool $tested            Whether to return the 'Compatible up to' value. Default true.\n *         @type bool $requires          Whether to return the required WordPress version. Default true.\n *         @type bool $rating            Whether to return the rating in percent and total number of ratings.\n *                                       Default true.\n *         @type bool $ratings           Whether to return the number of rating for each star (1-5). Default true.\n *         @type bool $downloaded        Whether to return the download count. Default true.\n *         @type bool $downloadlink      Whether to return the download link for the package. Default true.\n *         @type bool $last_updated      Whether to return the date of the last update. Default true.\n *         @type bool $added             Whether to return the date when the plugin was added to the wordpress.org\n *                                       repository. Default true.\n *         @type bool $tags              Whether to return the assigned tags. Default true.\n *         @type bool $compatibility     Whether to return the WordPress compatibility list. Default true.\n *         @type bool $homepage          Whether to return the plugin homepage link. Default true.\n *         @type bool $versions          Whether to return the list of all available versions. Default false.\n *         @type bool $donate_link       Whether to return the donation link. Default true.\n *         @type bool $reviews           Whether to return the plugin reviews. Default false.\n *         @type bool $banners           Whether to return the banner images links. Default false.\n *         @type bool $icons             Whether to return the icon links. Default false.\n *         @type bool $active_installs   Whether to return the number of active installs. Default false.\n *         @type bool $group             Whether to return the assigned group. Default false.\n *         @type bool $contributors      Whether to return the list of contributors. Default false.\n *     }\n * }\n * @return object|array|WP_Error Response object or array on success, WP_Error on failure. See the\n *         {@link https://developer.wordpress.org/reference/functions/plugins_api/ function reference article}\n *         for more information on the make-up of possible return values depending on the value of `$action`.\n */\nfunction plugins_api( $action, $args = array() ) {\n\n\tif ( is_array( $args ) ) {\n\t\t$args = (object) $args;\n\t}\n\n\tif ( ! isset( $args->per_page ) ) {\n\t\t$args->per_page = 24;\n\t}\n\n\tif ( ! isset( $args->locale ) ) {\n\t\t$args->locale = get_locale();\n\t}\n\n\t/**\n\t * Filter the WordPress.org Plugin Install API arguments.\n\t *\n\t * Important: An object MUST be returned to this filter.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param object $args   Plugin API arguments.\n\t * @param string $action The type of information being requested from the Plugin Install API.\n\t */\n\t$args = apply_filters( 'plugins_api_args', $args, $action );\n\n\t/**\n\t * Filter the response for the current WordPress.org Plugin Install API request.\n\t *\n\t * Passing a non-false value will effectively short-circuit the WordPress.org API request.\n\t *\n\t * If `$action` is 'query_plugins' or 'plugin_information', an object MUST be passed.\n\t * If `$action` is 'hot_tags` or 'hot_categories', an array should be passed.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param false|object|array $result The result object or array. Default false.\n\t * @param string             $action The type of information being requested from the Plugin Install API.\n\t * @param object             $args   Plugin API arguments.\n\t */\n\t$res = apply_filters( 'plugins_api', false, $action, $args );\n\n\tif ( false === $res ) {\n\t\t$url = $http_url = 'http://api.wordpress.org/plugins/info/1.0/';\n\t\tif ( $ssl = wp_http_supports( array( 'ssl' ) ) )\n\t\t\t$url = set_url_scheme( $url, 'https' );\n\n\t\t$http_args = array(\n\t\t\t'timeout' => 15,\n\t\t\t'body' => array(\n\t\t\t\t'action' => $action,\n\t\t\t\t'request' => serialize( $args )\n\t\t\t)\n\t\t);\n\t\t$request = wp_remote_post( $url, $http_args );\n\n\t\tif ( $ssl && is_wp_error( $request ) ) {\n\t\t\ttrigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );\n\t\t\t$request = wp_remote_post( $http_url, $http_args );\n\t\t}\n\n\t\tif ( is_wp_error($request) ) {\n\t\t\t$res = new WP_Error('plugins_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ), $request->get_error_message() );\n\t\t} else {\n\t\t\t$res = maybe_unserialize( wp_remote_retrieve_body( $request ) );\n\t\t\tif ( ! is_object( $res ) && ! is_array( $res ) )\n\t\t\t\t$res = new WP_Error('plugins_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ), wp_remote_retrieve_body( $request ) );\n\t\t}\n\t} elseif ( !is_wp_error($res) ) {\n\t\t$res->external = true;\n\t}\n\n\t/**\n\t * Filter the Plugin Install API response results.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param object|WP_Error $res    Response object or WP_Error.\n\t * @param string          $action The type of information being requested from the Plugin Install API.\n\t * @param object          $args   Plugin API arguments.\n\t */\n\treturn apply_filters( 'plugins_api_result', $res, $action, $args );\n}\n\n/**\n * Retrieve popular WordPress plugin tags.\n *\n * @since 2.7.0\n *\n * @param array $args\n * @return array\n */\nfunction install_popular_tags( $args = array() ) {\n\t$key = md5(serialize($args));\n\tif ( false !== ($tags = get_site_transient('poptags_' . $key) ) )\n\t\treturn $tags;\n\n\t$tags = plugins_api('hot_tags', $args);\n\n\tif ( is_wp_error($tags) )\n\t\treturn $tags;\n\n\tset_site_transient( 'poptags_' . $key, $tags, 3 * HOUR_IN_SECONDS );\n\n\treturn $tags;\n}\n\n/**\n * @since 2.7.0\n */\nfunction install_dashboard() {\n\t?>\n\t<p><?php printf( __( 'Plugins extend and expand the functionality of WordPress. You may automatically install plugins from the <a href=\"%1$s\">WordPress Plugin Directory</a> or upload a plugin in .zip format via <a href=\"%2$s\">this page</a>.' ), 'https://wordpress.org/plugins/', self_admin_url( 'plugin-install.php?tab=upload' ) ); ?></p>\n\n\t<?php display_plugins_table(); ?>\n\n\t<h2><?php _e( 'Popular tags' ) ?></h2>\n\t<p><?php _e( 'You may also browse based on the most popular tags in the Plugin Directory:' ) ?></p>\n\t<?php\n\n\t$api_tags = install_popular_tags();\n\n\techo '<p class=\"popular-tags\">';\n\tif ( is_wp_error($api_tags) ) {\n\t\techo $api_tags->get_error_message();\n\t} else {\n\t\t//Set up the tags in a way which can be interpreted by wp_generate_tag_cloud()\n\t\t$tags = array();\n\t\tforeach ( (array) $api_tags as $tag ) {\n\t\t\t$url = self_admin_url( 'plugin-install.php?tab=search&type=tag&s=' . urlencode( $tag['name'] ) );\n\t\t\t$data = array(\n\t\t\t\t'link' => esc_url( $url ),\n\t\t\t\t'name' => $tag['name'],\n\t\t\t\t'slug' => $tag['slug'],\n\t\t\t\t'id' => sanitize_title_with_dashes( $tag['name'] ),\n\t\t\t\t'count' => $tag['count']\n\t\t\t);\n\t\t\t$tags[ $tag['name'] ] = (object) $data;\n\t\t}\n\t\techo wp_generate_tag_cloud($tags, array( 'single_text' => __('%s plugin'), 'multiple_text' => __('%s plugins') ) );\n\t}\n\techo '</p><br class=\"clear\" />';\n}\n\n/**\n * Display search form for searching plugins.\n *\n * @since 2.7.0\n *\n * @param bool $type_selector\n */\nfunction install_search_form( $type_selector = true ) {\n\t$type = isset($_REQUEST['type']) ? wp_unslash( $_REQUEST['type'] ) : 'term';\n\t$term = isset($_REQUEST['s']) ? wp_unslash( $_REQUEST['s'] ) : '';\n\t$input_attrs = '';\n\t$button_type = 'button screen-reader-text';\n\n\t// assume no $type_selector means it's a simplified search form\n\tif ( ! $type_selector ) {\n\t\t$input_attrs = 'class=\"wp-filter-search\" placeholder=\"' . esc_attr__( 'Search Plugins' ) . '\" ';\n\t}\n\n\t?><form class=\"search-form search-plugins\" method=\"get\">\n\t\t<input type=\"hidden\" name=\"tab\" value=\"search\" />\n\t\t<?php if ( $type_selector ) : ?>\n\t\t<select name=\"type\" id=\"typeselector\">\n\t\t\t<option value=\"term\"<?php selected('term', $type) ?>><?php _e('Keyword'); ?></option>\n\t\t\t<option value=\"author\"<?php selected('author', $type) ?>><?php _e('Author'); ?></option>\n\t\t\t<option value=\"tag\"<?php selected('tag', $type) ?>><?php _ex('Tag', 'Plugin Installer'); ?></option>\n\t\t</select>\n\t\t<?php endif; ?>\n\t\t<label><span class=\"screen-reader-text\"><?php _e('Search Plugins'); ?></span>\n\t\t\t<input type=\"search\" name=\"s\" value=\"<?php echo esc_attr($term) ?>\" <?php echo $input_attrs; ?>/>\n\t\t</label>\n\t\t<?php submit_button( __( 'Search Plugins' ), $button_type, false, false, array( 'id' => 'search-submit' ) ); ?>\n\t</form><?php\n}\n\n/**\n * Upload from zip\n * @since 2.8.0\n */\nfunction install_plugins_upload() {\n?>\n<div class=\"upload-plugin\">\n\t<p class=\"install-help\"><?php _e('If you have a plugin in a .zip format, you may install it by uploading it here.'); ?></p>\n\t<form method=\"post\" enctype=\"multipart/form-data\" class=\"wp-upload-form\" action=\"<?php echo self_admin_url('update.php?action=upload-plugin'); ?>\">\n\t\t<?php wp_nonce_field( 'plugin-upload'); ?>\n\t\t<label class=\"screen-reader-text\" for=\"pluginzip\"><?php _e('Plugin zip file'); ?></label>\n\t\t<input type=\"file\" id=\"pluginzip\" name=\"pluginzip\" />\n\t\t<?php submit_button( __( 'Install Now' ), 'button', 'install-plugin-submit', false ); ?>\n\t</form>\n</div>\n<?php\n}\n\n/**\n * Show a username form for the favorites page\n * @since 3.5.0\n *\n */\nfunction install_plugins_favorites_form() {\n\t$user = ! empty( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' );\n\t?>\n\t<p class=\"install-help\"><?php _e( 'If you have marked plugins as favorites on WordPress.org, you can browse them here.' ); ?></p>\n\t<form method=\"get\">\n\t\t<input type=\"hidden\" name=\"tab\" value=\"favorites\" />\n\t\t<p>\n\t\t\t<label for=\"user\"><?php _e( 'Your WordPress.org username:' ); ?></label>\n\t\t\t<input type=\"search\" id=\"user\" name=\"user\" value=\"<?php echo esc_attr( $user ); ?>\" />\n\t\t\t<input type=\"submit\" class=\"button\" value=\"<?php esc_attr_e( 'Get Favorites' ); ?>\" />\n\t\t</p>\n\t</form>\n\t<?php\n}\n\n/**\n * Display plugin content based on plugin list.\n *\n * @since 2.7.0\n *\n * @global WP_List_Table $wp_list_table\n */\nfunction display_plugins_table() {\n\tglobal $wp_list_table;\n\n\tswitch ( current_filter() ) {\n\t\tcase 'install_plugins_favorites' :\n\t\t\tif ( empty( $_GET['user'] ) && ! get_user_option( 'wporg_favorites' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'install_plugins_recommended' :\n\t\t\techo '<p>' . __( 'These suggestions are based on the plugins you and other users have installed.' ) . '</p>';\n\t\t\tbreak;\n\t}\n\n\t?>\n\t<form id=\"plugin-filter\" method=\"post\">\n\t\t<?php $wp_list_table->display(); ?>\n\t</form>\n\t<?php\n}\n\n/**\n * Determine the status we can perform on a plugin.\n *\n * @since 3.0.0\n *\n * @param array|object $api\n * @param bool        $loop\n * @return type\n */\nfunction install_plugin_install_status($api, $loop = false) {\n\t// This function is called recursively, $loop prevents further loops.\n\tif ( is_array($api) )\n\t\t$api = (object) $api;\n\n\t// Default to a \"new\" plugin\n\t$status = 'install';\n\t$url = false;\n\t$update_file = false;\n\n\t/*\n\t * Check to see if this plugin is known to be installed,\n\t * and has an update awaiting it.\n\t */\n\t$update_plugins = get_site_transient('update_plugins');\n\tif ( isset( $update_plugins->response ) ) {\n\t\tforeach ( (array)$update_plugins->response as $file => $plugin ) {\n\t\t\tif ( $plugin->slug === $api->slug ) {\n\t\t\t\t$status = 'update_available';\n\t\t\t\t$update_file = $file;\n\t\t\t\t$version = $plugin->new_version;\n\t\t\t\tif ( current_user_can('update_plugins') )\n\t\t\t\t\t$url = wp_nonce_url(self_admin_url('update.php?action=upgrade-plugin&plugin=' . $update_file), 'upgrade-plugin_' . $update_file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( 'install' == $status ) {\n\t\tif ( is_dir( WP_PLUGIN_DIR . '/' . $api->slug ) ) {\n\t\t\t$installed_plugin = get_plugins('/' . $api->slug);\n\t\t\tif ( empty($installed_plugin) ) {\n\t\t\t\tif ( current_user_can('install_plugins') )\n\t\t\t\t\t$url = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug);\n\t\t\t} else {\n\t\t\t\t$key = array_keys( $installed_plugin );\n\t\t\t\t$key = reset( $key ); //Use the first plugin regardless of the name, Could have issues for multiple-plugins in one directory if they share different version numbers\n\t\t\t\t$update_file = $api->slug . '/' . $key;\n\t\t\t\tif ( version_compare($api->version, $installed_plugin[ $key ]['Version'], '=') ){\n\t\t\t\t\t$status = 'latest_installed';\n\t\t\t\t} elseif ( version_compare($api->version, $installed_plugin[ $key ]['Version'], '<') ) {\n\t\t\t\t\t$status = 'newer_installed';\n\t\t\t\t\t$version = $installed_plugin[ $key ]['Version'];\n\t\t\t\t} else {\n\t\t\t\t\t//If the above update check failed, Then that probably means that the update checker has out-of-date information, force a refresh\n\t\t\t\t\tif ( ! $loop ) {\n\t\t\t\t\t\tdelete_site_transient('update_plugins');\n\t\t\t\t\t\twp_update_plugins();\n\t\t\t\t\t\treturn install_plugin_install_status($api, true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// \"install\" & no directory with that slug\n\t\t\tif ( current_user_can('install_plugins') )\n\t\t\t\t$url = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=' . $api->slug), 'install-plugin_' . $api->slug);\n\t\t}\n\t}\n\tif ( isset($_GET['from']) )\n\t\t$url .= '&amp;from=' . urlencode( wp_unslash( $_GET['from'] ) );\n\n\t$file = $update_file;\n\treturn compact( 'status', 'url', 'version', 'file' );\n}\n\n/**\n * Display plugin information in dialog box form.\n *\n * @since 2.7.0\n *\n * @global string $tab\n * @global string $wp_version\n */\nfunction install_plugin_information() {\n\tglobal $tab;\n\n\tif ( empty( $_REQUEST['plugin'] ) ) {\n\t\treturn;\n\t}\n\n\t$api = plugins_api( 'plugin_information', array(\n\t\t'slug' => wp_unslash( $_REQUEST['plugin'] ),\n\t\t'is_ssl' => is_ssl(),\n\t\t'fields' => array(\n\t\t\t'banners' => true,\n\t\t\t'reviews' => true,\n\t\t\t'downloaded' => false,\n\t\t\t'active_installs' => true\n\t\t)\n\t) );\n\n\tif ( is_wp_error( $api ) ) {\n\t\twp_die( $api );\n\t}\n\n\t$plugins_allowedtags = array(\n\t\t'a' => array( 'href' => array(), 'title' => array(), 'target' => array() ),\n\t\t'abbr' => array( 'title' => array() ), 'acronym' => array( 'title' => array() ),\n\t\t'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(),\n\t\t'div' => array( 'class' => array() ), 'span' => array( 'class' => array() ),\n\t\t'p' => array(), 'ul' => array(), 'ol' => array(), 'li' => array(),\n\t\t'h1' => array(), 'h2' => array(), 'h3' => array(), 'h4' => array(), 'h5' => array(), 'h6' => array(),\n\t\t'img' => array( 'src' => array(), 'class' => array(), 'alt' => array() )\n\t);\n\n\t$plugins_section_titles = array(\n\t\t'description'  => _x( 'Description',  'Plugin installer section title' ),\n\t\t'installation' => _x( 'Installation', 'Plugin installer section title' ),\n\t\t'faq'          => _x( 'FAQ',          'Plugin installer section title' ),\n\t\t'screenshots'  => _x( 'Screenshots',  'Plugin installer section title' ),\n\t\t'changelog'    => _x( 'Changelog',    'Plugin installer section title' ),\n\t\t'reviews'      => _x( 'Reviews',      'Plugin installer section title' ),\n\t\t'other_notes'  => _x( 'Other Notes',  'Plugin installer section title' )\n\t);\n\n\t// Sanitize HTML\n\tforeach ( (array) $api->sections as $section_name => $content ) {\n\t\t$api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags );\n\t}\n\n\tforeach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) {\n\t\tif ( isset( $api->$key ) ) {\n\t\t\t$api->$key = wp_kses( $api->$key, $plugins_allowedtags );\n\t\t}\n\t}\n\n\t$_tab = esc_attr( $tab );\n\n\t$section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description'; // Default to the Description tab, Do not translate, API returns English.\n\tif ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) {\n\t\t$section_titles = array_keys( (array) $api->sections );\n\t\t$section = reset( $section_titles );\n\t}\n\n\tiframe_header( __( 'Plugin Install' ) );\n\n\t$_with_banner = '';\n\n\tif ( ! empty( $api->banners ) && ( ! empty( $api->banners['low'] ) || ! empty( $api->banners['high'] ) ) ) {\n\t\t$_with_banner = 'with-banner';\n\t\t$low  = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low'];\n\t\t$high = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high'];\n\t\t?>\n\t\t<style type=\"text/css\">\n\t\t\t#plugin-information-title.with-banner {\n\t\t\t\tbackground-image: url( <?php echo esc_url( $low ); ?> );\n\t\t\t}\n\t\t\t@media only screen and ( -webkit-min-device-pixel-ratio: 1.5 ) {\n\t\t\t\t#plugin-information-title.with-banner {\n\t\t\t\t\tbackground-image: url( <?php echo esc_url( $high ); ?> );\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t\t<?php\n\t}\n\n\techo '<div id=\"plugin-information-scrollable\">';\n\techo \"<div id='{$_tab}-title' class='{$_with_banner}'><div class='vignette'></div><h2>{$api->name}</h2></div>\";\n\techo \"<div id='{$_tab}-tabs' class='{$_with_banner}'>\\n\";\n\n\tforeach ( (array) $api->sections as $section_name => $content ) {\n\t\tif ( 'reviews' === $section_name && ( empty( $api->ratings ) || 0 === array_sum( (array) $api->ratings ) ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( isset( $plugins_section_titles[ $section_name ] ) ) {\n\t\t\t$title = $plugins_section_titles[ $section_name ];\n\t\t} else {\n\t\t\t$title = ucwords( str_replace( '_', ' ', $section_name ) );\n\t\t}\n\n\t\t$class = ( $section_name === $section ) ? ' class=\"current\"' : '';\n\t\t$href = add_query_arg( array('tab' => $tab, 'section' => $section_name) );\n\t\t$href = esc_url( $href );\n\t\t$san_section = esc_attr( $section_name );\n\t\techo \"\\t<a name='$san_section' href='$href' $class>$title</a>\\n\";\n\t}\n\n\techo \"</div>\\n\";\n\n\t$date_format = __( 'M j, Y @ H:i' );\n\n\tif ( ! empty( $api->last_updated ) ) {\n\t\t$last_updated_timestamp = strtotime( $api->last_updated );\n\t}\n\n\t?>\n\t<div id=\"<?php echo $_tab; ?>-content\" class='<?php echo $_with_banner; ?>'>\n\t<div class=\"fyi\">\n\t\t<ul>\n\t\t<?php if ( ! empty( $api->version ) ) { ?>\n\t\t\t<li><strong><?php _e( 'Version:' ); ?></strong> <?php echo $api->version; ?></li>\n\t\t<?php } if ( ! empty( $api->author ) ) { ?>\n\t\t\t<li><strong><?php _e( 'Author:' ); ?></strong> <?php echo links_add_target( $api->author, '_blank' ); ?></li>\n\t\t<?php } if ( ! empty( $api->last_updated ) ) { ?>\n\t\t\t<li><strong><?php _e( 'Last Updated:' ); ?></strong> <span title=\"<?php echo esc_attr( date_i18n( $date_format, $last_updated_timestamp ) ); ?>\">\n\t\t\t\t<?php printf( __( '%s ago' ), human_time_diff( $last_updated_timestamp ) ); ?>\n\t\t\t</span></li>\n\t\t<?php } if ( ! empty( $api->requires ) ) { ?>\n\t\t\t<li><strong><?php _e( 'Requires WordPress Version:' ); ?></strong> <?php printf( __( '%s or higher' ), $api->requires ); ?></li>\n\t\t<?php } if ( ! empty( $api->tested ) ) { ?>\n\t\t\t<li><strong><?php _e( 'Compatible up to:' ); ?></strong> <?php echo $api->tested; ?></li>\n\t\t<?php } if ( ! empty( $api->active_installs ) ) { ?>\n\t\t\t<li><strong><?php _e( 'Active Installs:' ); ?></strong> <?php\n\t\t\t\tif ( $api->active_installs >= 1000000 ) {\n\t\t\t\t\t_ex( '1+ Million', 'Active plugin installs' );\n\t\t\t\t} else {\n\t\t\t\t\techo number_format_i18n( $api->active_installs ) . '+';\n\t\t\t\t}\n\t\t\t?></li>\n\t\t<?php } if ( ! empty( $api->slug ) && empty( $api->external ) ) { ?>\n\t\t\t<li><a target=\"_blank\" href=\"https://wordpress.org/plugins/<?php echo $api->slug; ?>/\"><?php _e( 'WordPress.org Plugin Page &#187;' ); ?></a></li>\n\t\t<?php } if ( ! empty( $api->homepage ) ) { ?>\n\t\t\t<li><a target=\"_blank\" href=\"<?php echo esc_url( $api->homepage ); ?>\"><?php _e( 'Plugin Homepage &#187;' ); ?></a></li>\n\t\t<?php } if ( ! empty( $api->donate_link ) && empty( $api->contributors ) ) { ?>\n\t\t\t<li><a target=\"_blank\" href=\"<?php echo esc_url( $api->donate_link ); ?>\"><?php _e( 'Donate to this plugin &#187;' ); ?></a></li>\n\t\t<?php } ?>\n\t\t</ul>\n\t\t<?php if ( ! empty( $api->rating ) ) { ?>\n\t\t<h3><?php _e( 'Average Rating' ); ?></h3>\n\t\t<?php wp_star_rating( array( 'rating' => $api->rating, 'type' => 'percent', 'number' => $api->num_ratings ) ); ?>\n\t\t<small><?php printf( _n( '(based on %s rating)', '(based on %s ratings)', $api->num_ratings ), number_format_i18n( $api->num_ratings ) ); ?></small>\n\t\t<?php }\n\n\t\tif ( ! empty( $api->ratings ) && array_sum( (array) $api->ratings ) > 0 ) {\n\t\t\tforeach ( $api->ratings as $key => $ratecount ) {\n\t\t\t\t// Avoid div-by-zero.\n\t\t\t\t$_rating = $api->num_ratings ? ( $ratecount / $api->num_ratings ) : 0;\n\t\t\t\t?>\n\t\t\t\t<div class=\"counter-container\">\n\t\t\t\t\t<span class=\"counter-label\"><a href=\"https://wordpress.org/support/view/plugin-reviews/<?php echo $api->slug; ?>?filter=<?php echo $key; ?>\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\ttitle=\"<?php echo esc_attr( sprintf( _n( 'Click to see reviews that provided a rating of %d star', 'Click to see reviews that provided a rating of %d stars', $key ), $key ) ); ?>\"><?php printf( _n( '%d star', '%d stars', $key ), $key ); ?></a></span>\n\t\t\t\t\t<span class=\"counter-back\">\n\t\t\t\t\t\t<span class=\"counter-bar\" style=\"width: <?php echo 92 * $_rating; ?>px;\"></span>\n\t\t\t\t\t</span>\n\t\t\t\t\t<span class=\"counter-count\"><?php echo number_format_i18n( $ratecount ); ?></span>\n\t\t\t\t</div>\n\t\t\t\t<?php\n\t\t\t}\n\t\t}\n\t\tif ( ! empty( $api->contributors ) ) { ?>\n\t\t\t<h3><?php _e( 'Contributors' ); ?></h3>\n\t\t\t<ul class=\"contributors\">\n\t\t\t\t<?php\n\t\t\t\tforeach ( (array) $api->contributors as $contrib_username => $contrib_profile ) {\n\t\t\t\t\tif ( empty( $contrib_username ) && empty( $contrib_profile ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif ( empty( $contrib_username ) ) {\n\t\t\t\t\t\t$contrib_username = preg_replace( '/^.+\\/(.+)\\/?$/', '\\1', $contrib_profile );\n\t\t\t\t\t}\n\t\t\t\t\t$contrib_username = sanitize_user( $contrib_username );\n\t\t\t\t\tif ( empty( $contrib_profile ) ) {\n\t\t\t\t\t\techo \"<li><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&amp;s=36' width='18' height='18' alt='' />{$contrib_username}</li>\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\techo \"<li><a href='{$contrib_profile}' target='_blank'><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&amp;s=36' width='18' height='18' alt='' />{$contrib_username}</a></li>\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t?>\n\t\t\t</ul>\n\t\t\t<?php if ( ! empty( $api->donate_link ) ) { ?>\n\t\t\t\t<a target=\"_blank\" href=\"<?php echo esc_url( $api->donate_link ); ?>\"><?php _e( 'Donate to this plugin &#187;' ); ?></a>\n\t\t\t<?php } ?>\n\t\t<?php } ?>\n\t</div>\n\t<div id=\"section-holder\" class=\"wrap\">\n\t<?php\n\t\tif ( ! empty( $api->tested ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->tested ) ), $api->tested, '>' ) ) {\n\t\t\techo '<div class=\"notice notice-warning notice-alt\"><p>' . __( '<strong>Warning:</strong> This plugin has <strong>not been tested</strong> with your current version of WordPress.' ) . '</p></div>';\n\t\t} elseif ( ! empty( $api->requires ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->requires ) ), $api->requires, '<' ) ) {\n\t\t\techo '<div class=\"notice notice-warning notice-alt\"><p>' . __( '<strong>Warning:</strong> This plugin has <strong>not been marked as compatible</strong> with your version of WordPress.' ) . '</p></div>';\n\t\t}\n\n\t\tforeach ( (array) $api->sections as $section_name => $content ) {\n\t\t\t$content = links_add_base_url( $content, 'https://wordpress.org/plugins/' . $api->slug . '/' );\n\t\t\t$content = links_add_target( $content, '_blank' );\n\n\t\t\t$san_section = esc_attr( $section_name );\n\n\t\t\t$display = ( $section_name === $section ) ? 'block' : 'none';\n\n\t\t\techo \"\\t<div id='section-{$san_section}' class='section' style='display: {$display};'>\\n\";\n\t\t\techo $content;\n\t\t\techo \"\\t</div>\\n\";\n\t\t}\n\techo \"</div>\\n\";\n\techo \"</div>\\n\";\n\techo \"</div>\\n\"; // #plugin-information-scrollable\n\techo \"<div id='$tab-footer'>\\n\";\n\tif ( ! empty( $api->download_link ) && ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) ) {\n\t\t$status = install_plugin_install_status( $api );\n\t\tswitch ( $status['status'] ) {\n\t\t\tcase 'install':\n\t\t\t\tif ( $status['url'] ) {\n\t\t\t\t\techo '<a class=\"button button-primary right\" href=\"' . $status['url'] . '\" target=\"_parent\">' . __( 'Install Now' ) . '</a>';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'update_available':\n\t\t\t\tif ( $status['url'] ) {\n\t\t\t\t\techo '<a data-slug=\"' . esc_attr( $api->slug ) . '\" id=\"plugin_update_from_iframe\" class=\"button button-primary right\" href=\"' . $status['url'] . '\" target=\"_parent\">' . __( 'Install Update Now' ) .'</a>';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'newer_installed':\n\t\t\t\techo '<a class=\"button button-primary right disabled\">' . sprintf( __( 'Newer Version (%s) Installed'), $status['version'] ) . '</a>';\n\t\t\t\tbreak;\n\t\t\tcase 'latest_installed':\n\t\t\t\techo '<a class=\"button button-primary right disabled\">' . __( 'Latest Version Installed' ) . '</a>';\n\t\t\t\tbreak;\n\t\t}\n\t}\n\techo \"</div>\\n\";\n\n\tiframe_footer();\n\texit;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/plugin.php",
    "content": "<?php\n/**\n * WordPress Plugin Administration API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Parses the plugin contents to retrieve plugin's metadata.\n *\n * The metadata of the plugin's data searches for the following in the plugin's\n * header. All plugin data must be on its own line. For plugin description, it\n * must not have any newlines or only parts of the description will be displayed\n * and the same goes for the plugin data. The below is formatted for printing.\n *\n *     /*\n *     Plugin Name: Name of Plugin\n *     Plugin URI: Link to plugin information\n *     Description: Plugin Description\n *     Author: Plugin author's name\n *     Author URI: Link to the author's web site\n *     Version: Must be set in the plugin for WordPress 2.3+\n *     Text Domain: Optional. Unique identifier, should be same as the one used in\n *    \t\tload_plugin_textdomain()\n *     Domain Path: Optional. Only useful if the translations are located in a\n *    \t\tfolder above the plugin's base path. For example, if .mo files are\n *    \t\tlocated in the locale folder then Domain Path will be \"/locale/\" and\n *    \t\tmust have the first slash. Defaults to the base folder the plugin is\n *    \t\tlocated in.\n *     Network: Optional. Specify \"Network: true\" to require that a plugin is activated\n *    \t\tacross all sites in an installation. This will prevent a plugin from being\n *    \t\tactivated on a single site when Multisite is enabled.\n *      * / # Remove the space to close comment\n *\n * Some users have issues with opening large files and manipulating the contents\n * for want is usually the first 1kiB or 2kiB. This function stops pulling in\n * the plugin contents when it has all of the required plugin data.\n *\n * The first 8kiB of the file will be pulled in and if the plugin data is not\n * within that first 8kiB, then the plugin author should correct their plugin\n * and move the plugin data headers to the top.\n *\n * The plugin file is assumed to have permissions to allow for scripts to read\n * the file. This is not checked however and the file is only opened for\n * reading.\n *\n * @since 1.5.0\n *\n * @param string $plugin_file Path to the plugin file\n * @param bool   $markup      Optional. If the returned data should have HTML markup applied.\n *                            Default true.\n * @param bool   $translate   Optional. If the returned data should be translated. Default true.\n * @return array {\n *     Plugin data. Values will be empty if not supplied by the plugin.\n *\n *     @type string $Name        Name of the plugin. Should be unique.\n *     @type string $Title       Title of the plugin and link to the plugin's site (if set).\n *     @type string $Description Plugin description.\n *     @type string $Author      Author's name.\n *     @type string $AuthorURI   Author's website address (if set).\n *     @type string $Version     Plugin version.\n *     @type string $TextDomain  Plugin textdomain.\n *     @type string $DomainPath  Plugins relative directory path to .mo files.\n *     @type bool   $Network     Whether the plugin can only be activated network-wide.\n * }\n */\nfunction get_plugin_data( $plugin_file, $markup = true, $translate = true ) {\n\n\t$default_headers = array(\n\t\t'Name' => 'Plugin Name',\n\t\t'PluginURI' => 'Plugin URI',\n\t\t'Version' => 'Version',\n\t\t'Description' => 'Description',\n\t\t'Author' => 'Author',\n\t\t'AuthorURI' => 'Author URI',\n\t\t'TextDomain' => 'Text Domain',\n\t\t'DomainPath' => 'Domain Path',\n\t\t'Network' => 'Network',\n\t\t// Site Wide Only is deprecated in favor of Network.\n\t\t'_sitewide' => 'Site Wide Only',\n\t);\n\n\t$plugin_data = get_file_data( $plugin_file, $default_headers, 'plugin' );\n\n\t// Site Wide Only is the old header for Network\n\tif ( ! $plugin_data['Network'] && $plugin_data['_sitewide'] ) {\n\t\t/* translators: 1: Site Wide Only: true, 2: Network: true */\n\t\t_deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The %1$s plugin header is deprecated. Use %2$s instead.' ), '<code>Site Wide Only: true</code>', '<code>Network: true</code>' ) );\n\t\t$plugin_data['Network'] = $plugin_data['_sitewide'];\n\t}\n\t$plugin_data['Network'] = ( 'true' == strtolower( $plugin_data['Network'] ) );\n\tunset( $plugin_data['_sitewide'] );\n\n\tif ( $markup || $translate ) {\n\t\t$plugin_data = _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup, $translate );\n\t} else {\n\t\t$plugin_data['Title']      = $plugin_data['Name'];\n\t\t$plugin_data['AuthorName'] = $plugin_data['Author'];\n\t}\n\n\treturn $plugin_data;\n}\n\n/**\n * Sanitizes plugin data, optionally adds markup, optionally translates.\n *\n * @since 2.7.0\n * @access private\n * @see get_plugin_data()\n */\nfunction _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) {\n\n\t// Sanitize the plugin filename to a WP_PLUGIN_DIR relative path\n\t$plugin_file = plugin_basename( $plugin_file );\n\n\t// Translate fields\n\tif ( $translate ) {\n\t\tif ( $textdomain = $plugin_data['TextDomain'] ) {\n\t\t\tif ( $plugin_data['DomainPath'] )\n\t\t\t\tload_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) . $plugin_data['DomainPath'] );\n\t\t\telse\n\t\t\t\tload_plugin_textdomain( $textdomain, false, dirname( $plugin_file ) );\n\t\t} elseif ( in_array( basename( $plugin_file ), array( 'hello.php', 'akismet.php' ) ) ) {\n\t\t\t$textdomain = 'default';\n\t\t}\n\t\tif ( $textdomain ) {\n\t\t\tforeach ( array( 'Name', 'PluginURI', 'Description', 'Author', 'AuthorURI', 'Version' ) as $field )\n\t\t\t\t$plugin_data[ $field ] = translate( $plugin_data[ $field ], $textdomain );\n\t\t}\n\t}\n\n\t// Sanitize fields\n\t$allowed_tags = $allowed_tags_in_links = array(\n\t\t'abbr'    => array( 'title' => true ),\n\t\t'acronym' => array( 'title' => true ),\n\t\t'code'    => true,\n\t\t'em'      => true,\n\t\t'strong'  => true,\n\t);\n\t$allowed_tags['a'] = array( 'href' => true, 'title' => true );\n\n\t// Name is marked up inside <a> tags. Don't allow these.\n\t// Author is too, but some plugins have used <a> here (omitting Author URI).\n\t$plugin_data['Name']        = wp_kses( $plugin_data['Name'],        $allowed_tags_in_links );\n\t$plugin_data['Author']      = wp_kses( $plugin_data['Author'],      $allowed_tags );\n\n\t$plugin_data['Description'] = wp_kses( $plugin_data['Description'], $allowed_tags );\n\t$plugin_data['Version']     = wp_kses( $plugin_data['Version'],     $allowed_tags );\n\n\t$plugin_data['PluginURI']   = esc_url( $plugin_data['PluginURI'] );\n\t$plugin_data['AuthorURI']   = esc_url( $plugin_data['AuthorURI'] );\n\n\t$plugin_data['Title']      = $plugin_data['Name'];\n\t$plugin_data['AuthorName'] = $plugin_data['Author'];\n\n\t// Apply markup\n\tif ( $markup ) {\n\t\tif ( $plugin_data['PluginURI'] && $plugin_data['Name'] )\n\t\t\t$plugin_data['Title'] = '<a href=\"' . $plugin_data['PluginURI'] . '\">' . $plugin_data['Name'] . '</a>';\n\n\t\tif ( $plugin_data['AuthorURI'] && $plugin_data['Author'] )\n\t\t\t$plugin_data['Author'] = '<a href=\"' . $plugin_data['AuthorURI'] . '\">' . $plugin_data['Author'] . '</a>';\n\n\t\t$plugin_data['Description'] = wptexturize( $plugin_data['Description'] );\n\n\t\tif ( $plugin_data['Author'] )\n\t\t\t$plugin_data['Description'] .= ' <cite>' . sprintf( __('By %s.'), $plugin_data['Author'] ) . '</cite>';\n\t}\n\n\treturn $plugin_data;\n}\n\n/**\n * Get a list of a plugin's files.\n *\n * @since 2.8.0\n *\n * @param string $plugin Plugin ID\n * @return array List of files relative to the plugin root.\n */\nfunction get_plugin_files($plugin) {\n\t$plugin_file = WP_PLUGIN_DIR . '/' . $plugin;\n\t$dir = dirname($plugin_file);\n\t$plugin_files = array($plugin);\n\tif ( is_dir($dir) && $dir != WP_PLUGIN_DIR ) {\n\t\t$plugins_dir = @ opendir( $dir );\n\t\tif ( $plugins_dir ) {\n\t\t\twhile (($file = readdir( $plugins_dir ) ) !== false ) {\n\t\t\t\tif ( substr($file, 0, 1) == '.' )\n\t\t\t\t\tcontinue;\n\t\t\t\tif ( is_dir( $dir . '/' . $file ) ) {\n\t\t\t\t\t$plugins_subdir = @ opendir( $dir . '/' . $file );\n\t\t\t\t\tif ( $plugins_subdir ) {\n\t\t\t\t\t\twhile (($subfile = readdir( $plugins_subdir ) ) !== false ) {\n\t\t\t\t\t\t\tif ( substr($subfile, 0, 1) == '.' )\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t$plugin_files[] = plugin_basename(\"$dir/$file/$subfile\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@closedir( $plugins_subdir );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( plugin_basename(\"$dir/$file\") != $plugin )\n\t\t\t\t\t\t$plugin_files[] = plugin_basename(\"$dir/$file\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t@closedir( $plugins_dir );\n\t\t}\n\t}\n\n\treturn $plugin_files;\n}\n\n/**\n * Check the plugins directory and retrieve all plugin files with plugin data.\n *\n * WordPress only supports plugin files in the base plugins directory\n * (wp-content/plugins) and in one directory above the plugins directory\n * (wp-content/plugins/my-plugin). The file it looks for has the plugin data\n * and must be found in those two locations. It is recommended to keep your\n * plugin files in their own directories.\n *\n * The file with the plugin data is the file that will be included and therefore\n * needs to have the main execution for the plugin. This does not mean\n * everything must be contained in the file and it is recommended that the file\n * be split for maintainability. Keep everything in one file for extreme\n * optimization purposes.\n *\n * @since 1.5.0\n *\n * @param string $plugin_folder Optional. Relative path to single plugin folder.\n * @return array Key is the plugin file path and the value is an array of the plugin data.\n */\nfunction get_plugins($plugin_folder = '') {\n\n\tif ( ! $cache_plugins = wp_cache_get('plugins', 'plugins') )\n\t\t$cache_plugins = array();\n\n\tif ( isset($cache_plugins[ $plugin_folder ]) )\n\t\treturn $cache_plugins[ $plugin_folder ];\n\n\t$wp_plugins = array ();\n\t$plugin_root = WP_PLUGIN_DIR;\n\tif ( !empty($plugin_folder) )\n\t\t$plugin_root .= $plugin_folder;\n\n\t// Files in wp-content/plugins directory\n\t$plugins_dir = @ opendir( $plugin_root);\n\t$plugin_files = array();\n\tif ( $plugins_dir ) {\n\t\twhile (($file = readdir( $plugins_dir ) ) !== false ) {\n\t\t\tif ( substr($file, 0, 1) == '.' )\n\t\t\t\tcontinue;\n\t\t\tif ( is_dir( $plugin_root.'/'.$file ) ) {\n\t\t\t\t$plugins_subdir = @ opendir( $plugin_root.'/'.$file );\n\t\t\t\tif ( $plugins_subdir ) {\n\t\t\t\t\twhile (($subfile = readdir( $plugins_subdir ) ) !== false ) {\n\t\t\t\t\t\tif ( substr($subfile, 0, 1) == '.' )\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\tif ( substr($subfile, -4) == '.php' )\n\t\t\t\t\t\t\t$plugin_files[] = \"$file/$subfile\";\n\t\t\t\t\t}\n\t\t\t\t\tclosedir( $plugins_subdir );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( substr($file, -4) == '.php' )\n\t\t\t\t\t$plugin_files[] = $file;\n\t\t\t}\n\t\t}\n\t\tclosedir( $plugins_dir );\n\t}\n\n\tif ( empty($plugin_files) )\n\t\treturn $wp_plugins;\n\n\tforeach ( $plugin_files as $plugin_file ) {\n\t\tif ( !is_readable( \"$plugin_root/$plugin_file\" ) )\n\t\t\tcontinue;\n\n\t\t$plugin_data = get_plugin_data( \"$plugin_root/$plugin_file\", false, false ); //Do not apply markup/translate as it'll be cached.\n\n\t\tif ( empty ( $plugin_data['Name'] ) )\n\t\t\tcontinue;\n\n\t\t$wp_plugins[plugin_basename( $plugin_file )] = $plugin_data;\n\t}\n\n\tuasort( $wp_plugins, '_sort_uname_callback' );\n\n\t$cache_plugins[ $plugin_folder ] = $wp_plugins;\n\twp_cache_set('plugins', $cache_plugins, 'plugins');\n\n\treturn $wp_plugins;\n}\n\n/**\n * Check the mu-plugins directory and retrieve all mu-plugin files with any plugin data.\n *\n * WordPress only includes mu-plugin files in the base mu-plugins directory (wp-content/mu-plugins).\n *\n * @since 3.0.0\n * @return array Key is the mu-plugin file path and the value is an array of the mu-plugin data.\n */\nfunction get_mu_plugins() {\n\t$wp_plugins = array();\n\t// Files in wp-content/mu-plugins directory\n\t$plugin_files = array();\n\n\tif ( ! is_dir( WPMU_PLUGIN_DIR ) )\n\t\treturn $wp_plugins;\n\tif ( $plugins_dir = @ opendir( WPMU_PLUGIN_DIR ) ) {\n\t\twhile ( ( $file = readdir( $plugins_dir ) ) !== false ) {\n\t\t\tif ( substr( $file, -4 ) == '.php' )\n\t\t\t\t$plugin_files[] = $file;\n\t\t}\n\t} else {\n\t\treturn $wp_plugins;\n\t}\n\n\t@closedir( $plugins_dir );\n\n\tif ( empty($plugin_files) )\n\t\treturn $wp_plugins;\n\n\tforeach ( $plugin_files as $plugin_file ) {\n\t\tif ( !is_readable( WPMU_PLUGIN_DIR . \"/$plugin_file\" ) )\n\t\t\tcontinue;\n\n\t\t$plugin_data = get_plugin_data( WPMU_PLUGIN_DIR . \"/$plugin_file\", false, false ); //Do not apply markup/translate as it'll be cached.\n\n\t\tif ( empty ( $plugin_data['Name'] ) )\n\t\t\t$plugin_data['Name'] = $plugin_file;\n\n\t\t$wp_plugins[ $plugin_file ] = $plugin_data;\n\t}\n\n\tif ( isset( $wp_plugins['index.php'] ) && filesize( WPMU_PLUGIN_DIR . '/index.php') <= 30 ) // silence is golden\n\t\tunset( $wp_plugins['index.php'] );\n\n\tuasort( $wp_plugins, '_sort_uname_callback' );\n\n\treturn $wp_plugins;\n}\n\n/**\n * Callback to sort array by a 'Name' key.\n *\n * @since 3.1.0\n * @access private\n */\nfunction _sort_uname_callback( $a, $b ) {\n\treturn strnatcasecmp( $a['Name'], $b['Name'] );\n}\n\n/**\n * Check the wp-content directory and retrieve all drop-ins with any plugin data.\n *\n * @since 3.0.0\n * @return array Key is the file path and the value is an array of the plugin data.\n */\nfunction get_dropins() {\n\t$dropins = array();\n\t$plugin_files = array();\n\n\t$_dropins = _get_dropins();\n\n\t// These exist in the wp-content directory\n\tif ( $plugins_dir = @ opendir( WP_CONTENT_DIR ) ) {\n\t\twhile ( ( $file = readdir( $plugins_dir ) ) !== false ) {\n\t\t\tif ( isset( $_dropins[ $file ] ) )\n\t\t\t\t$plugin_files[] = $file;\n\t\t}\n\t} else {\n\t\treturn $dropins;\n\t}\n\n\t@closedir( $plugins_dir );\n\n\tif ( empty($plugin_files) )\n\t\treturn $dropins;\n\n\tforeach ( $plugin_files as $plugin_file ) {\n\t\tif ( !is_readable( WP_CONTENT_DIR . \"/$plugin_file\" ) )\n\t\t\tcontinue;\n\t\t$plugin_data = get_plugin_data( WP_CONTENT_DIR . \"/$plugin_file\", false, false ); //Do not apply markup/translate as it'll be cached.\n\t\tif ( empty( $plugin_data['Name'] ) )\n\t\t\t$plugin_data['Name'] = $plugin_file;\n\t\t$dropins[ $plugin_file ] = $plugin_data;\n\t}\n\n\tuksort( $dropins, 'strnatcasecmp' );\n\n\treturn $dropins;\n}\n\n/**\n * Returns drop-ins that WordPress uses.\n *\n * Includes Multisite drop-ins only when is_multisite()\n *\n * @since 3.0.0\n * @return array Key is file name. The value is an array, with the first value the\n *\tpurpose of the drop-in and the second value the name of the constant that must be\n *\ttrue for the drop-in to be used, or true if no constant is required.\n */\nfunction _get_dropins() {\n\t$dropins = array(\n\t\t'advanced-cache.php' => array( __( 'Advanced caching plugin.'       ), 'WP_CACHE' ), // WP_CACHE\n\t\t'db.php'             => array( __( 'Custom database class.'         ), true ), // auto on load\n\t\t'db-error.php'       => array( __( 'Custom database error message.' ), true ), // auto on error\n\t\t'install.php'        => array( __( 'Custom install script.'         ), true ), // auto on install\n\t\t'maintenance.php'    => array( __( 'Custom maintenance message.'    ), true ), // auto on maintenance\n\t\t'object-cache.php'   => array( __( 'External object cache.'         ), true ), // auto on load\n\t);\n\n\tif ( is_multisite() ) {\n\t\t$dropins['sunrise.php'       ] = array( __( 'Executed before Multisite is loaded.' ), 'SUNRISE' ); // SUNRISE\n\t\t$dropins['blog-deleted.php'  ] = array( __( 'Custom site deleted message.'   ), true ); // auto on deleted blog\n\t\t$dropins['blog-inactive.php' ] = array( __( 'Custom site inactive message.'  ), true ); // auto on inactive blog\n\t\t$dropins['blog-suspended.php'] = array( __( 'Custom site suspended message.' ), true ); // auto on archived or spammed blog\n\t}\n\n\treturn $dropins;\n}\n\n/**\n * Check whether the plugin is active by checking the active_plugins list.\n *\n * @since 2.5.0\n *\n * @param string $plugin Base plugin path from plugins directory.\n * @return bool True, if in the active plugins list. False, not in the list.\n */\nfunction is_plugin_active( $plugin ) {\n\treturn in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );\n}\n\n/**\n * Check whether the plugin is inactive.\n *\n * Reverse of is_plugin_active(). Used as a callback.\n *\n * @since 3.1.0\n * @see is_plugin_active()\n *\n * @param string $plugin Base plugin path from plugins directory.\n * @return bool True if inactive. False if active.\n */\nfunction is_plugin_inactive( $plugin ) {\n\treturn ! is_plugin_active( $plugin );\n}\n\n/**\n * Check whether the plugin is active for the entire network.\n *\n * @since 3.0.0\n *\n * @param string $plugin Base plugin path from plugins directory.\n * @return bool True, if active for the network, otherwise false.\n */\nfunction is_plugin_active_for_network( $plugin ) {\n\tif ( !is_multisite() )\n\t\treturn false;\n\n\t$plugins = get_site_option( 'active_sitewide_plugins');\n\tif ( isset($plugins[$plugin]) )\n\t\treturn true;\n\n\treturn false;\n}\n\n/**\n * Checks for \"Network: true\" in the plugin header to see if this should\n * be activated only as a network wide plugin. The plugin would also work\n * when Multisite is not enabled.\n *\n * Checks for \"Site Wide Only: true\" for backwards compatibility.\n *\n * @since 3.0.0\n *\n * @param string $plugin Plugin to check\n * @return bool True if plugin is network only, false otherwise.\n */\nfunction is_network_only_plugin( $plugin ) {\n\t$plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );\n\tif ( $plugin_data )\n\t\treturn $plugin_data['Network'];\n\treturn false;\n}\n\n/**\n * Attempts activation of plugin in a \"sandbox\" and redirects on success.\n *\n * A plugin that is already activated will not attempt to be activated again.\n *\n * The way it works is by setting the redirection to the error before trying to\n * include the plugin file. If the plugin fails, then the redirection will not\n * be overwritten with the success message. Also, the options will not be\n * updated and the activation hook will not be called on plugin error.\n *\n * It should be noted that in no way the below code will actually prevent errors\n * within the file. The code should not be used elsewhere to replicate the\n * \"sandbox\", which uses redirection to work.\n * {@source 13 1}\n *\n * If any errors are found or text is outputted, then it will be captured to\n * ensure that the success redirection will update the error redirection.\n *\n * @since 2.5.0\n *\n * @param string $plugin Plugin path to main plugin file with plugin data.\n * @param string $redirect Optional. URL to redirect to.\n * @param bool $network_wide Whether to enable the plugin for all sites in the\n *   network or just the current site. Multisite only. Default is false.\n * @param bool $silent Prevent calling activation hooks. Optional, default is false.\n * @return WP_Error|null WP_Error on invalid file or null on success.\n */\nfunction activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {\n\t$plugin = plugin_basename( trim( $plugin ) );\n\n\tif ( is_multisite() && ( $network_wide || is_network_only_plugin($plugin) ) ) {\n\t\t$network_wide = true;\n\t\t$current = get_site_option( 'active_sitewide_plugins', array() );\n\t\t$_GET['networkwide'] = 1; // Back compat for plugins looking for this value.\n\t} else {\n\t\t$current = get_option( 'active_plugins', array() );\n\t}\n\n\t$valid = validate_plugin($plugin);\n\tif ( is_wp_error($valid) )\n\t\treturn $valid;\n\n\tif ( ( $network_wide && ! isset( $current[ $plugin ] ) ) || ( ! $network_wide && ! in_array( $plugin, $current ) ) ) {\n\t\tif ( !empty($redirect) )\n\t\t\twp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect)); // we'll override this later if the plugin can be included without fatal error\n\t\tob_start();\n\t\twp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin );\n\t\t$_wp_plugin_file = $plugin;\n\t\tinclude_once( WP_PLUGIN_DIR . '/' . $plugin );\n\t\t$plugin = $_wp_plugin_file; // Avoid stomping of the $plugin variable in a plugin.\n\n\t\tif ( ! $silent ) {\n\t\t\t/**\n\t\t\t * Fires before a plugin is activated.\n\t\t\t *\n\t\t\t * If a plugin is silently activated (such as during an update),\n\t\t\t * this hook does not fire.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param string $plugin       Plugin path to main plugin file with plugin data.\n\t\t\t * @param bool   $network_wide Whether to enable the plugin for all sites in the network\n\t\t\t *                             or just the current site. Multisite only. Default is false.\n\t\t\t */\n\t\t\tdo_action( 'activate_plugin', $plugin, $network_wide );\n\n\t\t\t/**\n\t\t\t * Fires as a specific plugin is being activated.\n\t\t\t *\n\t\t\t * This hook is the \"activation\" hook used internally by\n\t\t\t * {@see register_activation_hook()}. The dynamic portion of the\n\t\t\t * hook name, `$plugin`, refers to the plugin basename.\n\t\t\t *\n\t\t\t * If a plugin is silently activated (such as during an update),\n\t\t\t * this hook does not fire.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param bool $network_wide Whether to enable the plugin for all sites in the network\n\t\t\t *                           or just the current site. Multisite only. Default is false.\n\t\t\t */\n\t\t\tdo_action( 'activate_' . $plugin, $network_wide );\n\t\t}\n\n\t\tif ( $network_wide ) {\n\t\t\t$current = get_site_option( 'active_sitewide_plugins', array() );\n\t\t\t$current[$plugin] = time();\n\t\t\tupdate_site_option( 'active_sitewide_plugins', $current );\n\t\t} else {\n\t\t\t$current = get_option( 'active_plugins', array() );\n\t\t\t$current[] = $plugin;\n\t\t\tsort($current);\n\t\t\tupdate_option('active_plugins', $current);\n\t\t}\n\n\t\tif ( ! $silent ) {\n\t\t\t/**\n\t\t\t * Fires after a plugin has been activated.\n\t\t\t *\n\t\t\t * If a plugin is silently activated (such as during an update),\n\t\t\t * this hook does not fire.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param string $plugin       Plugin path to main plugin file with plugin data.\n\t\t\t * @param bool   $network_wide Whether to enable the plugin for all sites in the network\n\t\t\t *                             or just the current site. Multisite only. Default is false.\n\t\t\t */\n\t\t\tdo_action( 'activated_plugin', $plugin, $network_wide );\n\t\t}\n\n\t\tif ( ob_get_length() > 0 ) {\n\t\t\t$output = ob_get_clean();\n\t\t\treturn new WP_Error('unexpected_output', __('The plugin generated unexpected output.'), $output);\n\t\t}\n\t\tob_end_clean();\n\t}\n\n\treturn null;\n}\n\n/**\n * Deactivate a single plugin or multiple plugins.\n *\n * The deactivation hook is disabled by the plugin upgrader by using the $silent\n * parameter.\n *\n * @since 2.5.0\n *\n * @param string|array $plugins Single plugin or list of plugins to deactivate.\n * @param bool $silent Prevent calling deactivation hooks. Default is false.\n * @param mixed $network_wide Whether to deactivate the plugin for all sites in the network.\n * \tA value of null (the default) will deactivate plugins for both the site and the network.\n */\nfunction deactivate_plugins( $plugins, $silent = false, $network_wide = null ) {\n\tif ( is_multisite() )\n\t\t$network_current = get_site_option( 'active_sitewide_plugins', array() );\n\t$current = get_option( 'active_plugins', array() );\n\t$do_blog = $do_network = false;\n\n\tforeach ( (array) $plugins as $plugin ) {\n\t\t$plugin = plugin_basename( trim( $plugin ) );\n\t\tif ( ! is_plugin_active($plugin) )\n\t\t\tcontinue;\n\n\t\t$network_deactivating = false !== $network_wide && is_plugin_active_for_network( $plugin );\n\n\t\tif ( ! $silent ) {\n\t\t\t/**\n\t\t\t * Fires before a plugin is deactivated.\n\t\t\t *\n\t\t\t * If a plugin is silently deactivated (such as during an update),\n\t\t\t * this hook does not fire.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param string $plugin               Plugin path to main plugin file with plugin data.\n\t\t\t * @param bool   $network_deactivating Whether the plugin is deactivated for all sites in the network\n\t\t\t *                                     or just the current site. Multisite only. Default is false.\n\t\t\t */\n\t\t\tdo_action( 'deactivate_plugin', $plugin, $network_deactivating );\n\t\t}\n\n\t\tif ( false !== $network_wide ) {\n\t\t\tif ( is_plugin_active_for_network( $plugin ) ) {\n\t\t\t\t$do_network = true;\n\t\t\t\tunset( $network_current[ $plugin ] );\n\t\t\t} elseif ( $network_wide ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif ( true !== $network_wide ) {\n\t\t\t$key = array_search( $plugin, $current );\n\t\t\tif ( false !== $key ) {\n\t\t\t\t$do_blog = true;\n\t\t\t\tunset( $current[ $key ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $silent ) {\n\t\t\t/**\n\t\t\t * Fires as a specific plugin is being deactivated.\n\t\t\t *\n\t\t\t * This hook is the \"deactivation\" hook used internally by\n\t\t\t * {@see register_deactivation_hook()}. The dynamic portion of the\n\t\t\t * hook name, `$plugin`, refers to the plugin basename.\n\t\t\t *\n\t\t\t * If a plugin is silently deactivated (such as during an update),\n\t\t\t * this hook does not fire.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param bool $network_deactivating Whether the plugin is deactivated for all sites in the network\n\t\t\t *                                   or just the current site. Multisite only. Default is false.\n\t\t\t */\n\t\t\tdo_action( 'deactivate_' . $plugin, $network_deactivating );\n\n\t\t\t/**\n\t\t\t * Fires after a plugin is deactivated.\n\t\t\t *\n\t\t\t * If a plugin is silently deactivated (such as during an update),\n\t\t\t * this hook does not fire.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param string $plugin               Plugin basename.\n\t\t\t * @param bool   $network_deactivating Whether the plugin is deactivated for all sites in the network\n\t\t\t *                                     or just the current site. Multisite only. Default false.\n\t\t\t */\n\t\t\tdo_action( 'deactivated_plugin', $plugin, $network_deactivating );\n\t\t}\n\t}\n\n\tif ( $do_blog )\n\t\tupdate_option('active_plugins', $current);\n\tif ( $do_network )\n\t\tupdate_site_option( 'active_sitewide_plugins', $network_current );\n}\n\n/**\n * Activate multiple plugins.\n *\n * When WP_Error is returned, it does not mean that one of the plugins had\n * errors. It means that one or more of the plugins file path was invalid.\n *\n * The execution will be halted as soon as one of the plugins has an error.\n *\n * @since 2.6.0\n *\n * @param string|array $plugins Single plugin or list of plugins to activate.\n * @param string $redirect Redirect to page after successful activation.\n * @param bool $network_wide Whether to enable the plugin for all sites in the network.\n * @param bool $silent Prevent calling activation hooks. Default is false.\n * @return bool|WP_Error True when finished or WP_Error if there were errors during a plugin activation.\n */\nfunction activate_plugins( $plugins, $redirect = '', $network_wide = false, $silent = false ) {\n\tif ( !is_array($plugins) )\n\t\t$plugins = array($plugins);\n\n\t$errors = array();\n\tforeach ( $plugins as $plugin ) {\n\t\tif ( !empty($redirect) )\n\t\t\t$redirect = add_query_arg('plugin', $plugin, $redirect);\n\t\t$result = activate_plugin($plugin, $redirect, $network_wide, $silent);\n\t\tif ( is_wp_error($result) )\n\t\t\t$errors[$plugin] = $result;\n\t}\n\n\tif ( !empty($errors) )\n\t\treturn new WP_Error('plugins_invalid', __('One of the plugins is invalid.'), $errors);\n\n\treturn true;\n}\n\n/**\n * Remove directory and files of a plugin for a list of plugins.\n *\n * @since 2.6.0\n *\n * @global WP_Filesystem_Base $wp_filesystem\n *\n * @param array  $plugins    List of plugins to delete.\n * @param string $deprecated Deprecated.\n * @return bool|null|WP_Error True on success, false is $plugins is empty, WP_Error on failure.\n *                            Null if filesystem credentials are required to proceed.\n */\nfunction delete_plugins( $plugins, $deprecated = '' ) {\n\tglobal $wp_filesystem;\n\n\tif ( empty($plugins) )\n\t\treturn false;\n\n\t$checked = array();\n\tforeach ( $plugins as $plugin )\n\t\t$checked[] = 'checked[]=' . $plugin;\n\n\tob_start();\n\t$url = wp_nonce_url('plugins.php?action=delete-selected&verify-delete=1&' . implode('&', $checked), 'bulk-plugins');\n\tif ( false === ($credentials = request_filesystem_credentials($url)) ) {\n\t\t$data = ob_get_clean();\n\n\t\tif ( ! empty($data) ){\n\t\t\tinclude_once( ABSPATH . 'wp-admin/admin-header.php');\n\t\t\techo $data;\n\t\t\tinclude( ABSPATH . 'wp-admin/admin-footer.php');\n\t\t\texit;\n\t\t}\n\t\treturn;\n\t}\n\n\tif ( ! WP_Filesystem($credentials) ) {\n\t\trequest_filesystem_credentials($url, '', true); //Failed to connect, Error and request again\n\t\t$data = ob_get_clean();\n\n\t\tif ( ! empty($data) ){\n\t\t\tinclude_once( ABSPATH . 'wp-admin/admin-header.php');\n\t\t\techo $data;\n\t\t\tinclude( ABSPATH . 'wp-admin/admin-footer.php');\n\t\t\texit;\n\t\t}\n\t\treturn;\n\t}\n\n\tif ( ! is_object($wp_filesystem) )\n\t\treturn new WP_Error('fs_unavailable', __('Could not access filesystem.'));\n\n\tif ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() )\n\t\treturn new WP_Error('fs_error', __('Filesystem error.'), $wp_filesystem->errors);\n\n\t// Get the base plugin folder.\n\t$plugins_dir = $wp_filesystem->wp_plugins_dir();\n\tif ( empty( $plugins_dir ) ) {\n\t\treturn new WP_Error( 'fs_no_plugins_dir', __( 'Unable to locate WordPress Plugin directory.' ) );\n\t}\n\n\t$plugins_dir = trailingslashit( $plugins_dir );\n\n\t$plugin_translations = wp_get_installed_translations( 'plugins' );\n\n\t$errors = array();\n\n\tforeach ( $plugins as $plugin_file ) {\n\t\t// Run Uninstall hook.\n\t\tif ( is_uninstallable_plugin( $plugin_file ) ) {\n\t\t\tuninstall_plugin($plugin_file);\n\t\t}\n\n\t\t/**\n\t\t * Fires immediately before a plugin deletion attempt.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string $plugin_file Plugin file name.\n\t\t */\n\t\tdo_action( 'delete_plugin', $plugin_file );\n\n\t\t$this_plugin_dir = trailingslashit( dirname( $plugins_dir . $plugin_file ) );\n\n\t\t// If plugin is in its own directory, recursively delete the directory.\n\t\tif ( strpos( $plugin_file, '/' ) && $this_plugin_dir != $plugins_dir ) { //base check on if plugin includes directory separator AND that it's not the root plugin folder\n\t\t\t$deleted = $wp_filesystem->delete( $this_plugin_dir, true );\n\t\t} else {\n\t\t\t$deleted = $wp_filesystem->delete( $plugins_dir . $plugin_file );\n\t\t}\n\n\t\t/**\n\t\t * Fires immediately after a plugin deletion attempt.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string $plugin_file Plugin file name.\n\t\t * @param bool   $deleted     Whether the plugin deletion was successful.\n\t\t */\n\t\tdo_action( 'deleted_plugin', $plugin_file, $deleted );\n\n\t\tif ( ! $deleted ) {\n\t\t\t$errors[] = $plugin_file;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Remove language files, silently.\n\t\t$plugin_slug = dirname( $plugin_file );\n\t\tif ( '.' !== $plugin_slug && ! empty( $plugin_translations[ $plugin_slug ] ) ) {\n\t\t\t$translations = $plugin_translations[ $plugin_slug ];\n\n\t\t\tforeach ( $translations as $translation => $data ) {\n\t\t\t\t$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.po' );\n\t\t\t\t$wp_filesystem->delete( WP_LANG_DIR . '/plugins/' . $plugin_slug . '-' . $translation . '.mo' );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove deleted plugins from the plugin updates list.\n\tif ( $current = get_site_transient('update_plugins') ) {\n\t\t// Don't remove the plugins that weren't deleted.\n\t\t$deleted = array_diff( $plugins, $errors );\n\n\t\tforeach ( $deleted as $plugin_file ) {\n\t\t\tunset( $current->response[ $plugin_file ] );\n\t\t}\n\n\t\tset_site_transient( 'update_plugins', $current );\n\t}\n\n\tif ( ! empty($errors) )\n\t\treturn new WP_Error('could_not_remove_plugin', sprintf(__('Could not fully remove the plugin(s) %s.'), implode(', ', $errors)) );\n\n\treturn true;\n}\n\n/**\n * Validate active plugins\n *\n * Validate all active plugins, deactivates invalid and\n * returns an array of deactivated ones.\n *\n * @since 2.5.0\n * @return array invalid plugins, plugin as key, error as value\n */\nfunction validate_active_plugins() {\n\t$plugins = get_option( 'active_plugins', array() );\n\t// Validate vartype: array.\n\tif ( ! is_array( $plugins ) ) {\n\t\tupdate_option( 'active_plugins', array() );\n\t\t$plugins = array();\n\t}\n\n\tif ( is_multisite() && current_user_can( 'manage_network_plugins' ) ) {\n\t\t$network_plugins = (array) get_site_option( 'active_sitewide_plugins', array() );\n\t\t$plugins = array_merge( $plugins, array_keys( $network_plugins ) );\n\t}\n\n\tif ( empty( $plugins ) )\n\t\treturn array();\n\n\t$invalid = array();\n\n\t// Invalid plugins get deactivated.\n\tforeach ( $plugins as $plugin ) {\n\t\t$result = validate_plugin( $plugin );\n\t\tif ( is_wp_error( $result ) ) {\n\t\t\t$invalid[$plugin] = $result;\n\t\t\tdeactivate_plugins( $plugin, true );\n\t\t}\n\t}\n\treturn $invalid;\n}\n\n/**\n * Validate the plugin path.\n *\n * Checks that the file exists and {@link validate_file() is valid file}.\n *\n * @since 2.5.0\n *\n * @param string $plugin Plugin Path\n * @return WP_Error|int 0 on success, WP_Error on failure.\n */\nfunction validate_plugin($plugin) {\n\tif ( validate_file($plugin) )\n\t\treturn new WP_Error('plugin_invalid', __('Invalid plugin path.'));\n\tif ( ! file_exists(WP_PLUGIN_DIR . '/' . $plugin) )\n\t\treturn new WP_Error('plugin_not_found', __('Plugin file does not exist.'));\n\n\t$installed_plugins = get_plugins();\n\tif ( ! isset($installed_plugins[$plugin]) )\n\t\treturn new WP_Error('no_plugin_header', __('The plugin does not have a valid header.'));\n\treturn 0;\n}\n\n/**\n * Whether the plugin can be uninstalled.\n *\n * @since 2.7.0\n *\n * @param string $plugin Plugin path to check.\n * @return bool Whether plugin can be uninstalled.\n */\nfunction is_uninstallable_plugin($plugin) {\n\t$file = plugin_basename($plugin);\n\n\t$uninstallable_plugins = (array) get_option('uninstall_plugins');\n\tif ( isset( $uninstallable_plugins[$file] ) || file_exists( WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php' ) )\n\t\treturn true;\n\n\treturn false;\n}\n\n/**\n * Uninstall a single plugin.\n *\n * Calls the uninstall hook, if it is available.\n *\n * @since 2.7.0\n *\n * @param string $plugin Relative plugin path from Plugin Directory.\n * @return true True if a plugin's uninstall.php file has been found and included.\n */\nfunction uninstall_plugin($plugin) {\n\t$file = plugin_basename($plugin);\n\n\t$uninstallable_plugins = (array) get_option('uninstall_plugins');\n\tif ( file_exists( WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php' ) ) {\n\t\tif ( isset( $uninstallable_plugins[$file] ) ) {\n\t\t\tunset($uninstallable_plugins[$file]);\n\t\t\tupdate_option('uninstall_plugins', $uninstallable_plugins);\n\t\t}\n\t\tunset($uninstallable_plugins);\n\n\t\tdefine('WP_UNINSTALL_PLUGIN', $file);\n\t\twp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . dirname( $file ) );\n\t\tinclude( WP_PLUGIN_DIR . '/' . dirname($file) . '/uninstall.php' );\n\n\t\treturn true;\n\t}\n\n\tif ( isset( $uninstallable_plugins[$file] ) ) {\n\t\t$callable = $uninstallable_plugins[$file];\n\t\tunset($uninstallable_plugins[$file]);\n\t\tupdate_option('uninstall_plugins', $uninstallable_plugins);\n\t\tunset($uninstallable_plugins);\n\n\t\twp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $file );\n\t\tinclude( WP_PLUGIN_DIR . '/' . $file );\n\n\t\tadd_action( 'uninstall_' . $file, $callable );\n\n\t\t/**\n\t\t * Fires in uninstall_plugin() once the plugin has been uninstalled.\n\t\t *\n\t\t * The action concatenates the 'uninstall_' prefix with the basename of the\n\t\t * plugin passed to {@see uninstall_plugin()} to create a dynamically-named action.\n\t\t *\n\t\t * @since 2.7.0\n\t\t */\n\t\tdo_action( 'uninstall_' . $file );\n\t}\n}\n\n//\n// Menu\n//\n\n/**\n * Add a top-level menu page.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @global array $menu\n * @global array $admin_page_hooks\n * @global array $_registered_pages\n * @global array $_parent_pages\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @param string   $icon_url   The URL to the icon to be used for this menu.\n *                             * Pass a base64-encoded SVG using a data URI, which will be colored to match\n *                               the color scheme. This should begin with 'data:image/svg+xml;base64,'.\n *                             * Pass the name of a Dashicons helper class to use a font icon,\n *                               e.g. 'dashicons-chart-pie'.\n *                             * Pass 'none' to leave div.wp-menu-image empty so an icon can be added via CSS.\n * @param int      $position   The position in the menu order this one should appear.\n * @return string The resulting page's hook_suffix.\n */\nfunction add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '', $position = null ) {\n\tglobal $menu, $admin_page_hooks, $_registered_pages, $_parent_pages;\n\n\t$menu_slug = plugin_basename( $menu_slug );\n\n\t$admin_page_hooks[$menu_slug] = sanitize_title( $menu_title );\n\n\t$hookname = get_plugin_page_hookname( $menu_slug, '' );\n\n\tif ( !empty( $function ) && !empty( $hookname ) && current_user_can( $capability ) )\n\t\tadd_action( $hookname, $function );\n\n\tif ( empty($icon_url) ) {\n\t\t$icon_url = 'dashicons-admin-generic';\n\t\t$icon_class = 'menu-icon-generic ';\n\t} else {\n\t\t$icon_url = set_url_scheme( $icon_url );\n\t\t$icon_class = '';\n\t}\n\n\t$new_menu = array( $menu_title, $capability, $menu_slug, $page_title, 'menu-top ' . $icon_class . $hookname, $hookname, $icon_url );\n\n\tif ( null === $position ) {\n\t\t$menu[] = $new_menu;\n\t} elseif ( isset( $menu[ \"$position\" ] ) ) {\n\t \t$position = $position + substr( base_convert( md5( $menu_slug . $menu_title ), 16, 10 ) , -5 ) * 0.00001;\n\t\t$menu[ \"$position\" ] = $new_menu;\n\t} else {\n\t\t$menu[ $position ] = $new_menu;\n\t}\n\n\t$_registered_pages[$hookname] = true;\n\n\t// No parent as top level\n\t$_parent_pages[$menu_slug] = false;\n\n\treturn $hookname;\n}\n\n/**\n * Add a top-level menu page in the 'objects' section.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @global int $_wp_last_object_menu\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @param string   $icon_url   The url to the icon to be used for this menu.\n * @return string The resulting page's hook_suffix.\n */\nfunction add_object_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '') {\n\tglobal $_wp_last_object_menu;\n\n\t$_wp_last_object_menu++;\n\n\treturn add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $_wp_last_object_menu);\n}\n\n/**\n * Add a top-level menu page in the 'utility' section.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @global int $_wp_last_utility_menu\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @param string   $icon_url   The url to the icon to be used for this menu.\n * @return string The resulting page's hook_suffix.\n */\nfunction add_utility_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $icon_url = '') {\n\tglobal $_wp_last_utility_menu;\n\n\t$_wp_last_utility_menu++;\n\n\treturn add_menu_page($page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $_wp_last_utility_menu);\n}\n\n/**\n * Add a submenu page.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @global array $submenu\n * @global array $menu\n * @global array $_wp_real_parent_file\n * @global bool  $_wp_submenu_nopriv\n * @global array $_registered_pages\n * @global array $_parent_pages\n *\n * @param string   $parent_slug The slug name for the parent menu (or the file name of a standard WordPress admin page).\n * @param string   $page_title  The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title  The text to be used for the menu.\n * @param string   $capability  The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug   The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function    The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\tglobal $submenu, $menu, $_wp_real_parent_file, $_wp_submenu_nopriv,\n\t\t$_registered_pages, $_parent_pages;\n\n\t$menu_slug = plugin_basename( $menu_slug );\n\t$parent_slug = plugin_basename( $parent_slug);\n\n\tif ( isset( $_wp_real_parent_file[$parent_slug] ) )\n\t\t$parent_slug = $_wp_real_parent_file[$parent_slug];\n\n\tif ( !current_user_can( $capability ) ) {\n\t\t$_wp_submenu_nopriv[$parent_slug][$menu_slug] = true;\n\t\treturn false;\n\t}\n\n\t/*\n\t * If the parent doesn't already have a submenu, add a link to the parent\n\t * as the first item in the submenu. If the submenu file is the same as the\n\t * parent file someone is trying to link back to the parent manually. In\n\t * this case, don't automatically add a link back to avoid duplication.\n\t */\n\tif (!isset( $submenu[$parent_slug] ) && $menu_slug != $parent_slug ) {\n\t\tforeach ( (array)$menu as $parent_menu ) {\n\t\t\tif ( $parent_menu[2] == $parent_slug && current_user_can( $parent_menu[1] ) )\n\t\t\t\t$submenu[$parent_slug][] = array_slice( $parent_menu, 0, 4 );\n\t\t}\n\t}\n\n\t$submenu[$parent_slug][] = array ( $menu_title, $capability, $menu_slug, $page_title );\n\n\t$hookname = get_plugin_page_hookname( $menu_slug, $parent_slug);\n\tif (!empty ( $function ) && !empty ( $hookname ))\n\t\tadd_action( $hookname, $function );\n\n\t$_registered_pages[$hookname] = true;\n\n\t/*\n\t * Backward-compatibility for plugins using add_management page.\n\t * See wp-admin/admin.php for redirect from edit.php to tools.php\n\t */\n\tif ( 'tools.php' == $parent_slug )\n\t\t$_registered_pages[get_plugin_page_hookname( $menu_slug, 'edit.php')] = true;\n\n\t// No parent as top level.\n\t$_parent_pages[$menu_slug] = $parent_slug;\n\n\treturn $hookname;\n}\n\n/**\n * Add submenu page to the Tools main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'tools.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Settings main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'options-general.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Appearance main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'themes.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Plugins main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'plugins.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Users/Profile main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\tif ( current_user_can('edit_users') )\n\t\t$parent = 'users.php';\n\telse\n\t\t$parent = 'profile.php';\n\treturn add_submenu_page( $parent, $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n/**\n * Add submenu page to the Dashboard main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'index.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Posts main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'edit.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Media main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'upload.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Links main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n */\nfunction add_links_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Pages main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n*/\nfunction add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Add submenu page to the Comments main menu.\n *\n * This function takes a capability which will be used to determine whether\n * or not a page is included in the menu.\n *\n * The function which is hooked in to handle the output of the page must check\n * that the user has the required capability as well.\n *\n * @param string   $page_title The text to be displayed in the title tags of the page when the menu is selected.\n * @param string   $menu_title The text to be used for the menu.\n * @param string   $capability The capability required for this menu to be displayed to the user.\n * @param string   $menu_slug  The slug name to refer to this menu by (should be unique for this menu).\n * @param callable $function   The function to be called to output the content for this page.\n * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required.\n*/\nfunction add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {\n\treturn add_submenu_page( 'edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $function );\n}\n\n/**\n * Remove a top-level admin menu.\n *\n * @since 3.1.0\n *\n * @global array $menu\n *\n * @param string $menu_slug The slug of the menu.\n * @return array|bool The removed menu on success, false if not found.\n */\nfunction remove_menu_page( $menu_slug ) {\n\tglobal $menu;\n\n\tforeach ( $menu as $i => $item ) {\n\t\tif ( $menu_slug == $item[2] ) {\n\t\t\tunset( $menu[$i] );\n\t\t\treturn $item;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Remove an admin submenu.\n *\n * @since 3.1.0\n *\n * @global array $submenu\n *\n * @param string $menu_slug    The slug for the parent menu.\n * @param string $submenu_slug The slug of the submenu.\n * @return array|bool The removed submenu on success, false if not found.\n */\nfunction remove_submenu_page( $menu_slug, $submenu_slug ) {\n\tglobal $submenu;\n\n\tif ( !isset( $submenu[$menu_slug] ) )\n\t\treturn false;\n\n\tforeach ( $submenu[$menu_slug] as $i => $item ) {\n\t\tif ( $submenu_slug == $item[2] ) {\n\t\t\tunset( $submenu[$menu_slug][$i] );\n\t\t\treturn $item;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Get the url to access a particular menu page based on the slug it was registered with.\n *\n * If the slug hasn't been registered properly no url will be returned\n *\n * @since 3.0.0\n *\n * @global array $_parent_pages\n *\n * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu)\n * @param bool $echo Whether or not to echo the url - default is true\n * @return string the url\n */\nfunction menu_page_url($menu_slug, $echo = true) {\n\tglobal $_parent_pages;\n\n\tif ( isset( $_parent_pages[$menu_slug] ) ) {\n\t\t$parent_slug = $_parent_pages[$menu_slug];\n\t\tif ( $parent_slug && ! isset( $_parent_pages[$parent_slug] ) ) {\n\t\t\t$url = admin_url( add_query_arg( 'page', $menu_slug, $parent_slug ) );\n\t\t} else {\n\t\t\t$url = admin_url( 'admin.php?page=' . $menu_slug );\n\t\t}\n\t} else {\n\t\t$url = '';\n\t}\n\n\t$url = esc_url($url);\n\n\tif ( $echo )\n\t\techo $url;\n\n\treturn $url;\n}\n\n//\n// Pluggable Menu Support -- Private\n//\n/**\n *\n * @global string $parent_file\n * @global array $menu\n * @global array $submenu\n * @global string $pagenow\n * @global string $typenow\n * @global string $plugin_page\n * @global array $_wp_real_parent_file\n * @global array $_wp_menu_nopriv\n * @global array $_wp_submenu_nopriv\n */\nfunction get_admin_page_parent( $parent = '' ) {\n\tglobal $parent_file, $menu, $submenu, $pagenow, $typenow,\n\t\t$plugin_page, $_wp_real_parent_file, $_wp_menu_nopriv, $_wp_submenu_nopriv;\n\n\tif ( !empty ( $parent ) && 'admin.php' != $parent ) {\n\t\tif ( isset( $_wp_real_parent_file[$parent] ) )\n\t\t\t$parent = $_wp_real_parent_file[$parent];\n\t\treturn $parent;\n\t}\n\n\tif ( $pagenow == 'admin.php' && isset( $plugin_page ) ) {\n\t\tforeach ( (array)$menu as $parent_menu ) {\n\t\t\tif ( $parent_menu[2] == $plugin_page ) {\n\t\t\t\t$parent_file = $plugin_page;\n\t\t\t\tif ( isset( $_wp_real_parent_file[$parent_file] ) )\n\t\t\t\t\t$parent_file = $_wp_real_parent_file[$parent_file];\n\t\t\t\treturn $parent_file;\n\t\t\t}\n\t\t}\n\t\tif ( isset( $_wp_menu_nopriv[$plugin_page] ) ) {\n\t\t\t$parent_file = $plugin_page;\n\t\t\tif ( isset( $_wp_real_parent_file[$parent_file] ) )\n\t\t\t\t\t$parent_file = $_wp_real_parent_file[$parent_file];\n\t\t\treturn $parent_file;\n\t\t}\n\t}\n\n\tif ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) ) {\n\t\t$parent_file = $pagenow;\n\t\tif ( isset( $_wp_real_parent_file[$parent_file] ) )\n\t\t\t$parent_file = $_wp_real_parent_file[$parent_file];\n\t\treturn $parent_file;\n\t}\n\n\tforeach (array_keys( (array)$submenu ) as $parent) {\n\t\tforeach ( $submenu[$parent] as $submenu_array ) {\n\t\t\tif ( isset( $_wp_real_parent_file[$parent] ) )\n\t\t\t\t$parent = $_wp_real_parent_file[$parent];\n\t\t\tif ( !empty($typenow) && ($submenu_array[2] == \"$pagenow?post_type=$typenow\") ) {\n\t\t\t\t$parent_file = $parent;\n\t\t\t\treturn $parent;\n\t\t\t} elseif ( $submenu_array[2] == $pagenow && empty($typenow) && ( empty($parent_file) || false === strpos($parent_file, '?') ) ) {\n\t\t\t\t$parent_file = $parent;\n\t\t\t\treturn $parent;\n\t\t\t} elseif ( isset( $plugin_page ) && ($plugin_page == $submenu_array[2] ) ) {\n\t\t\t\t$parent_file = $parent;\n\t\t\t\treturn $parent;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( empty($parent_file) )\n\t\t$parent_file = '';\n\treturn '';\n}\n\n/**\n *\n * @global string $title\n * @global array $menu\n * @global array $submenu\n * @global string $pagenow\n * @global string $plugin_page\n * @global string $typenow\n */\nfunction get_admin_page_title() {\n\tglobal $title, $menu, $submenu, $pagenow, $plugin_page, $typenow;\n\n\tif ( ! empty ( $title ) )\n\t\treturn $title;\n\n\t$hook = get_plugin_page_hook( $plugin_page, $pagenow );\n\n\t$parent = $parent1 = get_admin_page_parent();\n\n\tif ( empty ( $parent) ) {\n\t\tforeach ( (array)$menu as $menu_array ) {\n\t\t\tif ( isset( $menu_array[3] ) ) {\n\t\t\t\tif ( $menu_array[2] == $pagenow ) {\n\t\t\t\t\t$title = $menu_array[3];\n\t\t\t\t\treturn $menu_array[3];\n\t\t\t\t} elseif ( isset( $plugin_page ) && ($plugin_page == $menu_array[2] ) && ($hook == $menu_array[3] ) ) {\n\t\t\t\t\t$title = $menu_array[3];\n\t\t\t\t\treturn $menu_array[3];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$title = $menu_array[0];\n\t\t\t\treturn $title;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tforeach ( array_keys( $submenu ) as $parent ) {\n\t\t\tforeach ( $submenu[$parent] as $submenu_array ) {\n\t\t\t\tif ( isset( $plugin_page ) &&\n\t\t\t\t\t( $plugin_page == $submenu_array[2] ) &&\n\t\t\t\t\t(\n\t\t\t\t\t\t( $parent == $pagenow ) ||\n\t\t\t\t\t\t( $parent == $plugin_page ) ||\n\t\t\t\t\t\t( $plugin_page == $hook ) ||\n\t\t\t\t\t\t( $pagenow == 'admin.php' && $parent1 != $submenu_array[2] ) ||\n\t\t\t\t\t\t( !empty($typenow) && $parent == $pagenow . '?post_type=' . $typenow)\n\t\t\t\t\t)\n\t\t\t\t\t) {\n\t\t\t\t\t\t$title = $submenu_array[3];\n\t\t\t\t\t\treturn $submenu_array[3];\n\t\t\t\t\t}\n\n\t\t\t\tif ( $submenu_array[2] != $pagenow || isset( $_GET['page'] ) ) // not the current page\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif ( isset( $submenu_array[3] ) ) {\n\t\t\t\t\t$title = $submenu_array[3];\n\t\t\t\t\treturn $submenu_array[3];\n\t\t\t\t} else {\n\t\t\t\t\t$title = $submenu_array[0];\n\t\t\t\t\treturn $title;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ( empty ( $title ) ) {\n\t\t\tforeach ( $menu as $menu_array ) {\n\t\t\t\tif ( isset( $plugin_page ) &&\n\t\t\t\t\t( $plugin_page == $menu_array[2] ) &&\n\t\t\t\t\t( $pagenow == 'admin.php' ) &&\n\t\t\t\t\t( $parent1 == $menu_array[2] ) )\n\t\t\t\t\t{\n\t\t\t\t\t\t$title = $menu_array[3];\n\t\t\t\t\t\treturn $menu_array[3];\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $title;\n}\n\n/**\n * @since 2.3.0\n *\n * @param string $plugin_page\n * @param string $parent_page\n * @return string|null\n */\nfunction get_plugin_page_hook( $plugin_page, $parent_page ) {\n\t$hook = get_plugin_page_hookname( $plugin_page, $parent_page );\n\tif ( has_action($hook) )\n\t\treturn $hook;\n\telse\n\t\treturn null;\n}\n\n/**\n *\n * @global array $admin_page_hooks\n * @param string $plugin_page\n * @param string $parent_page\n */\nfunction get_plugin_page_hookname( $plugin_page, $parent_page ) {\n\tglobal $admin_page_hooks;\n\n\t$parent = get_admin_page_parent( $parent_page );\n\n\t$page_type = 'admin';\n\tif ( empty ( $parent_page ) || 'admin.php' == $parent_page || isset( $admin_page_hooks[$plugin_page] ) ) {\n\t\tif ( isset( $admin_page_hooks[$plugin_page] ) ) {\n\t\t\t$page_type = 'toplevel';\n\t\t} elseif ( isset( $admin_page_hooks[$parent] )) {\n\t\t\t$page_type = $admin_page_hooks[$parent];\n\t\t}\n\t} elseif ( isset( $admin_page_hooks[$parent] ) ) {\n\t\t$page_type = $admin_page_hooks[$parent];\n\t}\n\n\t$plugin_name = preg_replace( '!\\.php!', '', $plugin_page );\n\n\treturn $page_type . '_page_' . $plugin_name;\n}\n\n/**\n *\n * @global string $pagenow\n * @global array $menu\n * @global array $submenu\n * @global array $_wp_menu_nopriv\n * @global array $_wp_submenu_nopriv\n * @global string $plugin_page\n * @global array $_registered_pages\n */\nfunction user_can_access_admin_page() {\n\tglobal $pagenow, $menu, $submenu, $_wp_menu_nopriv, $_wp_submenu_nopriv,\n\t\t$plugin_page, $_registered_pages;\n\n\t$parent = get_admin_page_parent();\n\n\tif ( !isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$parent][$pagenow] ) )\n\t\treturn false;\n\n\tif ( isset( $plugin_page ) ) {\n\t\tif ( isset( $_wp_submenu_nopriv[$parent][$plugin_page] ) )\n\t\t\treturn false;\n\n\t\t$hookname = get_plugin_page_hookname($plugin_page, $parent);\n\n\t\tif ( !isset($_registered_pages[$hookname]) )\n\t\t\treturn false;\n\t}\n\n\tif ( empty( $parent) ) {\n\t\tif ( isset( $_wp_menu_nopriv[$pagenow] ) )\n\t\t\treturn false;\n\t\tif ( isset( $_wp_submenu_nopriv[$pagenow][$pagenow] ) )\n\t\t\treturn false;\n\t\tif ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$pagenow][$plugin_page] ) )\n\t\t\treturn false;\n\t\tif ( isset( $plugin_page ) && isset( $_wp_menu_nopriv[$plugin_page] ) )\n\t\t\treturn false;\n\t\tforeach (array_keys( $_wp_submenu_nopriv ) as $key ) {\n\t\t\tif ( isset( $_wp_submenu_nopriv[$key][$pagenow] ) )\n\t\t\t\treturn false;\n\t\t\tif ( isset( $plugin_page ) && isset( $_wp_submenu_nopriv[$key][$plugin_page] ) )\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tif ( isset( $plugin_page ) && ( $plugin_page == $parent ) && isset( $_wp_menu_nopriv[$plugin_page] ) )\n\t\treturn false;\n\n\tif ( isset( $submenu[$parent] ) ) {\n\t\tforeach ( $submenu[$parent] as $submenu_array ) {\n\t\t\tif ( isset( $plugin_page ) && ( $submenu_array[2] == $plugin_page ) ) {\n\t\t\t\tif ( current_user_can( $submenu_array[1] ))\n\t\t\t\t\treturn true;\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t} elseif ( $submenu_array[2] == $pagenow ) {\n\t\t\t\tif ( current_user_can( $submenu_array[1] ))\n\t\t\t\t\treturn true;\n\t\t\t\telse\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tforeach ( $menu as $menu_array ) {\n\t\tif ( $menu_array[2] == $parent) {\n\t\t\tif ( current_user_can( $menu_array[1] ))\n\t\t\t\treturn true;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/* Whitelist functions */\n\n/**\n * Register a setting and its sanitization callback\n *\n * @since 2.7.0\n *\n * @global array $new_whitelist_options\n *\n * @param string $option_group A settings group name. Should correspond to a whitelisted option key name.\n * \tDefault whitelisted option key names include \"general,\" \"discussion,\" and \"reading,\" among others.\n * @param string $option_name The name of an option to sanitize and save.\n * @param callable $sanitize_callback A callback function that sanitizes the option's value.\n */\nfunction register_setting( $option_group, $option_name, $sanitize_callback = '' ) {\n\tglobal $new_whitelist_options;\n\n\tif ( 'misc' == $option_group ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The \"%s\" options group has been removed. Use another settings group.' ), 'misc' ) );\n\t\t$option_group = 'general';\n\t}\n\n\tif ( 'privacy' == $option_group ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.5', sprintf( __( 'The \"%s\" options group has been removed. Use another settings group.' ), 'privacy' ) );\n\t\t$option_group = 'reading';\n\t}\n\n\t$new_whitelist_options[ $option_group ][] = $option_name;\n\tif ( $sanitize_callback != '' )\n\t\tadd_filter( \"sanitize_option_{$option_name}\", $sanitize_callback );\n}\n\n/**\n * Unregister a setting\n *\n * @since 2.7.0\n *\n * @global array $new_whitelist_options\n *\n * @param string   $option_group\n * @param string   $option_name\n * @param callable $sanitize_callback\n */\nfunction unregister_setting( $option_group, $option_name, $sanitize_callback = '' ) {\n\tglobal $new_whitelist_options;\n\n\tif ( 'misc' == $option_group ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The \"%s\" options group has been removed. Use another settings group.' ), 'misc' ) );\n\t\t$option_group = 'general';\n\t}\n\n\tif ( 'privacy' == $option_group ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.5', sprintf( __( 'The \"%s\" options group has been removed. Use another settings group.' ), 'privacy' ) );\n\t\t$option_group = 'reading';\n\t}\n\n\t$pos = array_search( $option_name, (array) $new_whitelist_options[ $option_group ] );\n\tif ( $pos !== false )\n\t\tunset( $new_whitelist_options[ $option_group ][ $pos ] );\n\tif ( $sanitize_callback != '' )\n\t\tremove_filter( \"sanitize_option_{$option_name}\", $sanitize_callback );\n}\n\n/**\n * Refreshes the value of the options whitelist available via the 'whitelist_options' filter.\n *\n * @since 2.7.0\n *\n * @global array $new_whitelist_options\n *\n * @param array $options\n * @return array\n */\nfunction option_update_filter( $options ) {\n\tglobal $new_whitelist_options;\n\n\tif ( is_array( $new_whitelist_options ) )\n\t\t$options = add_option_whitelist( $new_whitelist_options, $options );\n\n\treturn $options;\n}\n\n/**\n * Adds an array of options to the options whitelist.\n *\n * @since 2.7.0\n *\n * @global array $whitelist_options\n *\n * @param array        $new_options\n * @param string|array $options\n * @return array\n */\nfunction add_option_whitelist( $new_options, $options = '' ) {\n\tif ( $options == '' )\n\t\tglobal $whitelist_options;\n\telse\n\t\t$whitelist_options = $options;\n\n\tforeach ( $new_options as $page => $keys ) {\n\t\tforeach ( $keys as $key ) {\n\t\t\tif ( !isset($whitelist_options[ $page ]) || !is_array($whitelist_options[ $page ]) ) {\n\t\t\t\t$whitelist_options[ $page ] = array();\n\t\t\t\t$whitelist_options[ $page ][] = $key;\n\t\t\t} else {\n\t\t\t\t$pos = array_search( $key, $whitelist_options[ $page ] );\n\t\t\t\tif ( $pos === false )\n\t\t\t\t\t$whitelist_options[ $page ][] = $key;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $whitelist_options;\n}\n\n/**\n * Removes a list of options from the options whitelist.\n *\n * @since 2.7.0\n *\n * @global array $whitelist_options\n *\n * @param array        $del_options\n * @param string|array $options\n * @return array\n */\nfunction remove_option_whitelist( $del_options, $options = '' ) {\n\tif ( $options == '' )\n\t\tglobal $whitelist_options;\n\telse\n\t\t$whitelist_options = $options;\n\n\tforeach ( $del_options as $page => $keys ) {\n\t\tforeach ( $keys as $key ) {\n\t\t\tif ( isset($whitelist_options[ $page ]) && is_array($whitelist_options[ $page ]) ) {\n\t\t\t\t$pos = array_search( $key, $whitelist_options[ $page ] );\n\t\t\t\tif ( $pos !== false )\n\t\t\t\t\tunset( $whitelist_options[ $page ][ $pos ] );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $whitelist_options;\n}\n\n/**\n * Output nonce, action, and option_page fields for a settings page.\n *\n * @since 2.7.0\n *\n * @param string $option_group A settings group name. This should match the group name used in register_setting().\n */\nfunction settings_fields($option_group) {\n\techo \"<input type='hidden' name='option_page' value='\" . esc_attr($option_group) . \"' />\";\n\techo '<input type=\"hidden\" name=\"action\" value=\"update\" />';\n\twp_nonce_field(\"$option_group-options\");\n}\n\n/**\n * Clears the Plugins cache used by get_plugins() and by default, the Plugin Update cache.\n *\n * @since 3.7.0\n *\n * @param bool $clear_update_cache Whether to clear the Plugin updates cache\n */\nfunction wp_clean_plugins_cache( $clear_update_cache = true ) {\n\tif ( $clear_update_cache )\n\t\tdelete_site_transient( 'update_plugins' );\n\twp_cache_delete( 'plugins', 'plugins' );\n}\n\n/**\n * @param string $plugin\n */\nfunction plugin_sandbox_scrape( $plugin ) {\n\twp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin );\n\tinclude( WP_PLUGIN_DIR . '/' . $plugin );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/post.php",
    "content": "<?php\n/**\n * WordPress Post Administration API.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Rename $_POST data from form names to DB post columns.\n *\n * Manipulates $_POST directly.\n *\n * @package WordPress\n * @since 2.6.0\n *\n * @param bool $update Are we updating a pre-existing post?\n * @param array $post_data Array of post data. Defaults to the contents of $_POST.\n * @return object|bool WP_Error on failure, true on success.\n */\nfunction _wp_translate_postdata( $update = false, $post_data = null ) {\n\n\tif ( empty($post_data) )\n\t\t$post_data = &$_POST;\n\n\tif ( $update )\n\t\t$post_data['ID'] = (int) $post_data['post_ID'];\n\n\t$ptype = get_post_type_object( $post_data['post_type'] );\n\n\tif ( $update && ! current_user_can( 'edit_post', $post_data['ID'] ) ) {\n\t\tif ( 'page' == $post_data['post_type'] )\n\t\t\treturn new WP_Error( 'edit_others_pages', __( 'You are not allowed to edit pages as this user.' ) );\n\t\telse\n\t\t\treturn new WP_Error( 'edit_others_posts', __( 'You are not allowed to edit posts as this user.' ) );\n\t} elseif ( ! $update && ! current_user_can( $ptype->cap->create_posts ) ) {\n\t\tif ( 'page' == $post_data['post_type'] )\n\t\t\treturn new WP_Error( 'edit_others_pages', __( 'You are not allowed to create pages as this user.' ) );\n\t\telse\n\t\t\treturn new WP_Error( 'edit_others_posts', __( 'You are not allowed to create posts as this user.' ) );\n\t}\n\n\tif ( isset( $post_data['content'] ) )\n\t\t$post_data['post_content'] = $post_data['content'];\n\n\tif ( isset( $post_data['excerpt'] ) )\n\t\t$post_data['post_excerpt'] = $post_data['excerpt'];\n\n\tif ( isset( $post_data['parent_id'] ) )\n\t\t$post_data['post_parent'] = (int) $post_data['parent_id'];\n\n\tif ( isset($post_data['trackback_url']) )\n\t\t$post_data['to_ping'] = $post_data['trackback_url'];\n\n\t$post_data['user_ID'] = get_current_user_id();\n\n\tif (!empty ( $post_data['post_author_override'] ) ) {\n\t\t$post_data['post_author'] = (int) $post_data['post_author_override'];\n\t} else {\n\t\tif (!empty ( $post_data['post_author'] ) ) {\n\t\t\t$post_data['post_author'] = (int) $post_data['post_author'];\n\t\t} else {\n\t\t\t$post_data['post_author'] = (int) $post_data['user_ID'];\n\t\t}\n\t}\n\n\tif ( isset( $post_data['user_ID'] ) && ( $post_data['post_author'] != $post_data['user_ID'] )\n\t\t && ! current_user_can( $ptype->cap->edit_others_posts ) ) {\n\t\tif ( $update ) {\n\t\t\tif ( 'page' == $post_data['post_type'] )\n\t\t\t\treturn new WP_Error( 'edit_others_pages', __( 'You are not allowed to edit pages as this user.' ) );\n\t\t\telse\n\t\t\t\treturn new WP_Error( 'edit_others_posts', __( 'You are not allowed to edit posts as this user.' ) );\n\t\t} else {\n\t\t\tif ( 'page' == $post_data['post_type'] )\n\t\t\t\treturn new WP_Error( 'edit_others_pages', __( 'You are not allowed to create pages as this user.' ) );\n\t\t\telse\n\t\t\t\treturn new WP_Error( 'edit_others_posts', __( 'You are not allowed to create posts as this user.' ) );\n\t\t}\n\t}\n\n\tif ( ! empty( $post_data['post_status'] ) ) {\n\t\t$post_data['post_status'] = sanitize_key( $post_data['post_status'] );\n\n\t\t// No longer an auto-draft\n\t\tif ( 'auto-draft' === $post_data['post_status'] ) {\n\t\t\t$post_data['post_status'] = 'draft';\n\t\t}\n\n\t\tif ( ! get_post_status_object( $post_data['post_status'] ) ) {\n\t\t\tunset( $post_data['post_status'] );\n\t\t}\n\t}\n\n\t// What to do based on which button they pressed\n\tif ( isset($post_data['saveasdraft']) && '' != $post_data['saveasdraft'] )\n\t\t$post_data['post_status'] = 'draft';\n\tif ( isset($post_data['saveasprivate']) && '' != $post_data['saveasprivate'] )\n\t\t$post_data['post_status'] = 'private';\n\tif ( isset($post_data['publish']) && ( '' != $post_data['publish'] ) && ( !isset($post_data['post_status']) || $post_data['post_status'] != 'private' ) )\n\t\t$post_data['post_status'] = 'publish';\n\tif ( isset($post_data['advanced']) && '' != $post_data['advanced'] )\n\t\t$post_data['post_status'] = 'draft';\n\tif ( isset($post_data['pending']) && '' != $post_data['pending'] )\n\t\t$post_data['post_status'] = 'pending';\n\n\tif ( isset( $post_data['ID'] ) )\n\t\t$post_id = $post_data['ID'];\n\telse\n\t\t$post_id = false;\n\t$previous_status = $post_id ? get_post_field( 'post_status', $post_id ) : false;\n\n\tif ( isset( $post_data['post_status'] ) && 'private' == $post_data['post_status'] && ! current_user_can( $ptype->cap->publish_posts ) ) {\n\t\t$post_data['post_status'] = $previous_status ? $previous_status : 'pending';\n\t}\n\n\t$published_statuses = array( 'publish', 'future' );\n\n\t// Posts 'submitted for approval' present are submitted to $_POST the same as if they were being published.\n\t// Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts.\n\tif ( isset($post_data['post_status']) && (in_array( $post_data['post_status'], $published_statuses ) && !current_user_can( $ptype->cap->publish_posts )) )\n\t\tif ( ! in_array( $previous_status, $published_statuses ) || !current_user_can( 'edit_post', $post_id ) )\n\t\t\t$post_data['post_status'] = 'pending';\n\n\tif ( ! isset( $post_data['post_status'] ) ) {\n\t\t$post_data['post_status'] = 'auto-draft' === $previous_status ? 'draft' : $previous_status;\n\t}\n\n\tif ( isset( $post_data['post_password'] ) && ! current_user_can( $ptype->cap->publish_posts ) ) {\n\t\tunset( $post_data['post_password'] );\n\t}\n\n\tif (!isset( $post_data['comment_status'] ))\n\t\t$post_data['comment_status'] = 'closed';\n\n\tif (!isset( $post_data['ping_status'] ))\n\t\t$post_data['ping_status'] = 'closed';\n\n\tforeach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {\n\t\tif ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) {\n\t\t\t$post_data['edit_date'] = '1';\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( !empty( $post_data['edit_date'] ) ) {\n\t\t$aa = $post_data['aa'];\n\t\t$mm = $post_data['mm'];\n\t\t$jj = $post_data['jj'];\n\t\t$hh = $post_data['hh'];\n\t\t$mn = $post_data['mn'];\n\t\t$ss = $post_data['ss'];\n\t\t$aa = ($aa <= 0 ) ? date('Y') : $aa;\n\t\t$mm = ($mm <= 0 ) ? date('n') : $mm;\n\t\t$jj = ($jj > 31 ) ? 31 : $jj;\n\t\t$jj = ($jj <= 0 ) ? date('j') : $jj;\n\t\t$hh = ($hh > 23 ) ? $hh -24 : $hh;\n\t\t$mn = ($mn > 59 ) ? $mn -60 : $mn;\n\t\t$ss = ($ss > 59 ) ? $ss -60 : $ss;\n\t\t$post_data['post_date'] = sprintf( \"%04d-%02d-%02d %02d:%02d:%02d\", $aa, $mm, $jj, $hh, $mn, $ss );\n\t\t$valid_date = wp_checkdate( $mm, $jj, $aa, $post_data['post_date'] );\n\t\tif ( !$valid_date ) {\n\t\t\treturn new WP_Error( 'invalid_date', __( 'Whoops, the provided date is invalid.' ) );\n\t\t}\n\t\t$post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );\n\t}\n\n\treturn $post_data;\n}\n\n/**\n * Update an existing post with values provided in $_POST.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $post_data Optional.\n * @return int Post ID.\n */\nfunction edit_post( $post_data = null ) {\n\tglobal $wpdb;\n\n\tif ( empty($post_data) )\n\t\t$post_data = &$_POST;\n\n\t// Clear out any data in internal vars.\n\tunset( $post_data['filter'] );\n\n\t$post_ID = (int) $post_data['post_ID'];\n\t$post = get_post( $post_ID );\n\t$post_data['post_type'] = $post->post_type;\n\t$post_data['post_mime_type'] = $post->post_mime_type;\n\n\tif ( ! empty( $post_data['post_status'] ) ) {\n\t\t$post_data['post_status'] = sanitize_key( $post_data['post_status'] );\n\n\t\tif ( 'inherit' == $post_data['post_status'] ) {\n\t\t\tunset( $post_data['post_status'] );\n\t\t}\n\t}\n\n\t$ptype = get_post_type_object($post_data['post_type']);\n\tif ( !current_user_can( 'edit_post', $post_ID ) ) {\n\t\tif ( 'page' == $post_data['post_type'] )\n\t\t\twp_die( __('You are not allowed to edit this page.' ));\n\t\telse\n\t\t\twp_die( __('You are not allowed to edit this post.' ));\n\t}\n\n\tif ( post_type_supports( $ptype->name, 'revisions' ) ) {\n\t\t$revisions = wp_get_post_revisions( $post_ID, array( 'order' => 'ASC', 'posts_per_page' => 1 ) );\n\t\t$revision = current( $revisions );\n\n\t\t// Check if the revisions have been upgraded\n\t\tif ( $revisions && _wp_get_post_revision_version( $revision ) < 1 )\n\t\t\t_wp_upgrade_revisions_of_post( $post, wp_get_post_revisions( $post_ID ) );\n\t}\n\n\tif ( isset($post_data['visibility']) ) {\n\t\tswitch ( $post_data['visibility'] ) {\n\t\t\tcase 'public' :\n\t\t\t\t$post_data['post_password'] = '';\n\t\t\t\tbreak;\n\t\t\tcase 'password' :\n\t\t\t\tunset( $post_data['sticky'] );\n\t\t\t\tbreak;\n\t\t\tcase 'private' :\n\t\t\t\t$post_data['post_status'] = 'private';\n\t\t\t\t$post_data['post_password'] = '';\n\t\t\t\tunset( $post_data['sticky'] );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t$post_data = _wp_translate_postdata( true, $post_data );\n\tif ( is_wp_error($post_data) )\n\t\twp_die( $post_data->get_error_message() );\n\n\t// Post Formats\n\tif ( isset( $post_data['post_format'] ) )\n\t\tset_post_format( $post_ID, $post_data['post_format'] );\n\n\t$format_meta_urls = array( 'url', 'link_url', 'quote_source_url' );\n\tforeach ( $format_meta_urls as $format_meta_url ) {\n\t\t$keyed = '_format_' . $format_meta_url;\n\t\tif ( isset( $post_data[ $keyed ] ) )\n\t\t\tupdate_post_meta( $post_ID, $keyed, wp_slash( esc_url_raw( wp_unslash( $post_data[ $keyed ] ) ) ) );\n\t}\n\n\t$format_keys = array( 'quote', 'quote_source_name', 'image', 'gallery', 'audio_embed', 'video_embed' );\n\n\tforeach ( $format_keys as $key ) {\n\t\t$keyed = '_format_' . $key;\n\t\tif ( isset( $post_data[ $keyed ] ) ) {\n\t\t\tif ( current_user_can( 'unfiltered_html' ) )\n\t\t\t\tupdate_post_meta( $post_ID, $keyed, $post_data[ $keyed ] );\n\t\t\telse\n\t\t\t\tupdate_post_meta( $post_ID, $keyed, wp_filter_post_kses( $post_data[ $keyed ] ) );\n\t\t}\n\t}\n\n\tif ( 'attachment' === $post_data['post_type'] && preg_match( '#^(audio|video)/#', $post_data['post_mime_type'] ) ) {\n\t\t$id3data = wp_get_attachment_metadata( $post_ID );\n\t\tif ( ! is_array( $id3data ) ) {\n\t\t\t$id3data = array();\n\t\t}\n\n\t\tforeach ( wp_get_attachment_id3_keys( $post, 'edit' ) as $key => $label ) {\n\t\t\tif ( isset( $post_data[ 'id3_' . $key ] ) ) {\n\t\t\t\t$id3data[ $key ] = sanitize_text_field( wp_unslash( $post_data[ 'id3_' . $key ] ) );\n\t\t\t}\n\t\t}\n\t\twp_update_attachment_metadata( $post_ID, $id3data );\n\t}\n\n\t// Meta Stuff\n\tif ( isset($post_data['meta']) && $post_data['meta'] ) {\n\t\tforeach ( $post_data['meta'] as $key => $value ) {\n\t\t\tif ( !$meta = get_post_meta_by_id( $key ) )\n\t\t\t\tcontinue;\n\t\t\tif ( $meta->post_id != $post_ID )\n\t\t\t\tcontinue;\n\t\t\tif ( is_protected_meta( $value['key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) )\n\t\t\t\tcontinue;\n\t\t\tupdate_meta( $key, $value['key'], $value['value'] );\n\t\t}\n\t}\n\n\tif ( isset($post_data['deletemeta']) && $post_data['deletemeta'] ) {\n\t\tforeach ( $post_data['deletemeta'] as $key => $value ) {\n\t\t\tif ( !$meta = get_post_meta_by_id( $key ) )\n\t\t\t\tcontinue;\n\t\t\tif ( $meta->post_id != $post_ID )\n\t\t\t\tcontinue;\n\t\t\tif ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $post_ID, $meta->meta_key ) )\n\t\t\t\tcontinue;\n\t\t\tdelete_meta( $key );\n\t\t}\n\t}\n\n\t// Attachment stuff\n\tif ( 'attachment' == $post_data['post_type'] ) {\n\t\tif ( isset( $post_data[ '_wp_attachment_image_alt' ] ) ) {\n\t\t\t$image_alt = wp_unslash( $post_data['_wp_attachment_image_alt'] );\n\t\t\tif ( $image_alt != get_post_meta( $post_ID, '_wp_attachment_image_alt', true ) ) {\n\t\t\t\t$image_alt = wp_strip_all_tags( $image_alt, true );\n\t\t\t\t// update_meta expects slashed.\n\t\t\t\tupdate_post_meta( $post_ID, '_wp_attachment_image_alt', wp_slash( $image_alt ) );\n\t\t\t}\n\t\t}\n\n\t\t$attachment_data = isset( $post_data['attachments'][ $post_ID ] ) ? $post_data['attachments'][ $post_ID ] : array();\n\n\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\t$post_data = apply_filters( 'attachment_fields_to_save', $post_data, $attachment_data );\n\t}\n\n\t// Convert taxonomy input to term IDs, to avoid ambiguity.\n\tif ( isset( $post_data['tax_input'] ) ) {\n\t\tforeach ( (array) $post_data['tax_input'] as $taxonomy => $terms ) {\n\t\t\t// Hierarchical taxonomy data is already sent as term IDs, so no conversion is necessary.\n\t\t\tif ( is_taxonomy_hierarchical( $taxonomy ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Assume that a 'tax_input' string is a comma-separated list of term names.\n\t\t\t * Some languages may use a character other than a comma as a delimiter, so we standardize on\n\t\t\t * commas before parsing the list.\n\t\t\t */\n\t\t\tif ( ! is_array( $terms ) ) {\n\t\t\t\t$comma = _x( ',', 'tag delimiter' );\n\t\t\t\tif ( ',' !== $comma ) {\n\t\t\t\t\t$terms = str_replace( $comma, ',', $terms );\n\t\t\t\t}\n\t\t\t\t$terms = explode( ',', trim( $terms, \" \\n\\t\\r\\0\\x0B,\" ) );\n\t\t\t}\n\n\t\t\t$clean_terms = array();\n\t\t\tforeach ( $terms as $term ) {\n\t\t\t\t// Empty terms are invalid input.\n\t\t\t\tif ( empty( $term ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$_term = get_terms( $taxonomy, array(\n\t\t\t\t\t'name' => $term,\n\t\t\t\t\t'fields' => 'ids',\n\t\t\t\t\t'hide_empty' => false,\n\t\t\t\t) );\n\n\t\t\t\tif ( ! empty( $_term ) ) {\n\t\t\t\t\t$clean_terms[] = intval( $_term[0] );\n\t\t\t\t} else {\n\t\t\t\t\t// No existing term was found, so pass the string. A new term will be created.\n\t\t\t\t\t$clean_terms[] = $term;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$post_data['tax_input'][ $taxonomy ] = $clean_terms;\n\t\t}\n\t}\n\n\tadd_meta( $post_ID );\n\n\tupdate_post_meta( $post_ID, '_edit_last', get_current_user_id() );\n\n\t$success = wp_update_post( $post_data );\n\t// If the save failed, see if we can sanity check the main fields and try again\n\tif ( ! $success && is_callable( array( $wpdb, 'strip_invalid_text_for_column' ) ) ) {\n\t\t$fields = array( 'post_title', 'post_content', 'post_excerpt' );\n\n\t\tforeach ( $fields as $field ) {\n\t\t\tif ( isset( $post_data[ $field ] ) ) {\n\t\t\t\t$post_data[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->posts, $field, $post_data[ $field ] );\n\t\t\t}\n\t\t}\n\n\t\twp_update_post( $post_data );\n\t}\n\n\t// Now that we have an ID we can fix any attachment anchor hrefs\n\t_fix_attachment_links( $post_ID );\n\n\twp_set_post_lock( $post_ID );\n\n\tif ( current_user_can( $ptype->cap->edit_others_posts ) && current_user_can( $ptype->cap->publish_posts ) ) {\n\t\tif ( ! empty( $post_data['sticky'] ) )\n\t\t\tstick_post( $post_ID );\n\t\telse\n\t\t\tunstick_post( $post_ID );\n\t}\n\n\treturn $post_ID;\n}\n\n/**\n * Process the post data for the bulk editing of posts.\n *\n * Updates all bulk edited posts/pages, adding (but not removing) tags and\n * categories. Skips pages when they would be their own parent or child.\n *\n * @since 2.7.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $post_data Optional, the array of post data to process if not provided will use $_POST superglobal.\n * @return array\n */\nfunction bulk_edit_posts( $post_data = null ) {\n\tglobal $wpdb;\n\n\tif ( empty($post_data) )\n\t\t$post_data = &$_POST;\n\n\tif ( isset($post_data['post_type']) )\n\t\t$ptype = get_post_type_object($post_data['post_type']);\n\telse\n\t\t$ptype = get_post_type_object('post');\n\n\tif ( !current_user_can( $ptype->cap->edit_posts ) ) {\n\t\tif ( 'page' == $ptype->name )\n\t\t\twp_die( __('You are not allowed to edit pages.'));\n\t\telse\n\t\t\twp_die( __('You are not allowed to edit posts.'));\n\t}\n\n\tif ( -1 == $post_data['_status'] ) {\n\t\t$post_data['post_status'] = null;\n\t\tunset($post_data['post_status']);\n\t} else {\n\t\t$post_data['post_status'] = $post_data['_status'];\n\t}\n\tunset($post_data['_status']);\n\n\tif ( ! empty( $post_data['post_status'] ) ) {\n\t\t$post_data['post_status'] = sanitize_key( $post_data['post_status'] );\n\n\t\tif ( 'inherit' == $post_data['post_status'] ) {\n\t\t\tunset( $post_data['post_status'] );\n\t\t}\n\t}\n\n\t$post_IDs = array_map( 'intval', (array) $post_data['post'] );\n\n\t$reset = array(\n\t\t'post_author', 'post_status', 'post_password',\n\t\t'post_parent', 'page_template', 'comment_status',\n\t\t'ping_status', 'keep_private', 'tax_input',\n\t\t'post_category', 'sticky', 'post_format',\n\t);\n\n\tforeach ( $reset as $field ) {\n\t\tif ( isset($post_data[$field]) && ( '' == $post_data[$field] || -1 == $post_data[$field] ) )\n\t\t\tunset($post_data[$field]);\n\t}\n\n\tif ( isset($post_data['post_category']) ) {\n\t\tif ( is_array($post_data['post_category']) && ! empty($post_data['post_category']) )\n\t\t\t$new_cats = array_map( 'absint', $post_data['post_category'] );\n\t\telse\n\t\t\tunset($post_data['post_category']);\n\t}\n\n\t$tax_input = array();\n\tif ( isset($post_data['tax_input'])) {\n\t\tforeach ( $post_data['tax_input'] as $tax_name => $terms ) {\n\t\t\tif ( empty($terms) )\n\t\t\t\tcontinue;\n\t\t\tif ( is_taxonomy_hierarchical( $tax_name ) ) {\n\t\t\t\t$tax_input[ $tax_name ] = array_map( 'absint', $terms );\n\t\t\t} else {\n\t\t\t\t$comma = _x( ',', 'tag delimiter' );\n\t\t\t\tif ( ',' !== $comma )\n\t\t\t\t\t$terms = str_replace( $comma, ',', $terms );\n\t\t\t\t$tax_input[ $tax_name ] = explode( ',', trim( $terms, \" \\n\\t\\r\\0\\x0B,\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( isset($post_data['post_parent']) && ($parent = (int) $post_data['post_parent']) ) {\n\t\t$pages = $wpdb->get_results(\"SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'page'\");\n\t\t$children = array();\n\n\t\tfor ( $i = 0; $i < 50 && $parent > 0; $i++ ) {\n\t\t\t$children[] = $parent;\n\n\t\t\tforeach ( $pages as $page ) {\n\t\t\t\tif ( $page->ID == $parent ) {\n\t\t\t\t\t$parent = $page->post_parent;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t$updated = $skipped = $locked = array();\n\t$shared_post_data = $post_data;\n\n\tforeach ( $post_IDs as $post_ID ) {\n\t\t// Start with fresh post data with each iteration.\n\t\t$post_data = $shared_post_data;\n\n\t\t$post_type_object = get_post_type_object( get_post_type( $post_ID ) );\n\n\t\tif ( !isset( $post_type_object ) || ( isset($children) && in_array($post_ID, $children) ) || !current_user_can( 'edit_post', $post_ID ) ) {\n\t\t\t$skipped[] = $post_ID;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( wp_check_post_lock( $post_ID ) ) {\n\t\t\t$locked[] = $post_ID;\n\t\t\tcontinue;\n\t\t}\n\n\t\t$post = get_post( $post_ID );\n\t\t$tax_names = get_object_taxonomies( $post );\n\t\tforeach ( $tax_names as $tax_name ) {\n\t\t\t$taxonomy_obj = get_taxonomy($tax_name);\n\t\t\tif ( isset( $tax_input[$tax_name]) && current_user_can( $taxonomy_obj->cap->assign_terms ) )\n\t\t\t\t$new_terms = $tax_input[$tax_name];\n\t\t\telse\n\t\t\t\t$new_terms = array();\n\n\t\t\tif ( $taxonomy_obj->hierarchical )\n\t\t\t\t$current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array('fields' => 'ids') );\n\t\t\telse\n\t\t\t\t$current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array('fields' => 'names') );\n\n\t\t\t$post_data['tax_input'][$tax_name] = array_merge( $current_terms, $new_terms );\n\t\t}\n\n\t\tif ( isset($new_cats) && in_array( 'category', $tax_names ) ) {\n\t\t\t$cats = (array) wp_get_post_categories($post_ID);\n\t\t\t$post_data['post_category'] = array_unique( array_merge($cats, $new_cats) );\n\t\t\tunset( $post_data['tax_input']['category'] );\n\t\t}\n\n\t\t$post_data['post_type'] = $post->post_type;\n\t\t$post_data['post_mime_type'] = $post->post_mime_type;\n\t\t$post_data['guid'] = $post->guid;\n\n\t\tforeach ( array( 'comment_status', 'ping_status', 'post_author' ) as $field ) {\n\t\t\tif ( ! isset( $post_data[ $field ] ) ) {\n\t\t\t\t$post_data[ $field ] = $post->$field;\n\t\t\t}\n\t\t}\n\n\t\t$post_data['ID'] = $post_ID;\n\t\t$post_data['post_ID'] = $post_ID;\n\n\t\t$post_data = _wp_translate_postdata( true, $post_data );\n\t\tif ( is_wp_error( $post_data ) ) {\n\t\t\t$skipped[] = $post_ID;\n\t\t\tcontinue;\n\t\t}\n\n\t\t$updated[] = wp_update_post( $post_data );\n\n\t\tif ( isset( $post_data['sticky'] ) && current_user_can( $ptype->cap->edit_others_posts ) ) {\n\t\t\tif ( 'sticky' == $post_data['sticky'] )\n\t\t\t\tstick_post( $post_ID );\n\t\t\telse\n\t\t\t\tunstick_post( $post_ID );\n\t\t}\n\n\t\tif ( isset( $post_data['post_format'] ) )\n\t\t\tset_post_format( $post_ID, $post_data['post_format'] );\n\t}\n\n\treturn array( 'updated' => $updated, 'skipped' => $skipped, 'locked' => $locked );\n}\n\n/**\n * Default post information to use when populating the \"Write Post\" form.\n *\n * @since 2.0.0\n *\n * @param string $post_type    Optional. A post type string. Default 'post'.\n * @param bool   $create_in_db Optional. Whether to insert the post into database. Default false.\n * @return WP_Post Post object containing all the default post data as attributes\n */\nfunction get_default_post_to_edit( $post_type = 'post', $create_in_db = false ) {\n\t$post_title = '';\n\tif ( !empty( $_REQUEST['post_title'] ) )\n\t\t$post_title = esc_html( wp_unslash( $_REQUEST['post_title'] ));\n\n\t$post_content = '';\n\tif ( !empty( $_REQUEST['content'] ) )\n\t\t$post_content = esc_html( wp_unslash( $_REQUEST['content'] ));\n\n\t$post_excerpt = '';\n\tif ( !empty( $_REQUEST['excerpt'] ) )\n\t\t$post_excerpt = esc_html( wp_unslash( $_REQUEST['excerpt'] ));\n\n\tif ( $create_in_db ) {\n\t\t$post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) );\n\t\t$post = get_post( $post_id );\n\t\tif ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) )\n\t\t\tset_post_format( $post, get_option( 'default_post_format' ) );\n\t} else {\n\t\t$post = new stdClass;\n\t\t$post->ID = 0;\n\t\t$post->post_author = '';\n\t\t$post->post_date = '';\n\t\t$post->post_date_gmt = '';\n\t\t$post->post_password = '';\n\t\t$post->post_name = '';\n\t\t$post->post_type = $post_type;\n\t\t$post->post_status = 'draft';\n\t\t$post->to_ping = '';\n\t\t$post->pinged = '';\n\t\t$post->comment_status = get_default_comment_status( $post_type );\n\t\t$post->ping_status = get_default_comment_status( $post_type, 'pingback' );\n\t\t$post->post_pingback = get_option( 'default_pingback_flag' );\n\t\t$post->post_category = get_option( 'default_category' );\n\t\t$post->page_template = 'default';\n\t\t$post->post_parent = 0;\n\t\t$post->menu_order = 0;\n\t\t$post = new WP_Post( $post );\n\t}\n\n\t/**\n\t * Filter the default post content initially used in the \"Write Post\" form.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string  $post_content Default post content.\n\t * @param WP_Post $post         Post object.\n\t */\n\t$post->post_content = apply_filters( 'default_content', $post_content, $post );\n\n\t/**\n\t * Filter the default post title initially used in the \"Write Post\" form.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string  $post_title Default post title.\n\t * @param WP_Post $post       Post object.\n\t */\n\t$post->post_title = apply_filters( 'default_title', $post_title, $post );\n\n\t/**\n\t * Filter the default post excerpt initially used in the \"Write Post\" form.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string  $post_excerpt Default post excerpt.\n\t * @param WP_Post $post         Post object.\n\t */\n\t$post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt, $post );\n\n\treturn $post;\n}\n\n/**\n * Determine if a post exists based on title, content, and date\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $title Post title\n * @param string $content Optional post content\n * @param string $date Optional post date\n * @return int Post ID if post exists, 0 otherwise.\n */\nfunction post_exists($title, $content = '', $date = '') {\n\tglobal $wpdb;\n\n\t$post_title = wp_unslash( sanitize_post_field( 'post_title', $title, 0, 'db' ) );\n\t$post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) );\n\t$post_date = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) );\n\n\t$query = \"SELECT ID FROM $wpdb->posts WHERE 1=1\";\n\t$args = array();\n\n\tif ( !empty ( $date ) ) {\n\t\t$query .= ' AND post_date = %s';\n\t\t$args[] = $post_date;\n\t}\n\n\tif ( !empty ( $title ) ) {\n\t\t$query .= ' AND post_title = %s';\n\t\t$args[] = $post_title;\n\t}\n\n\tif ( !empty ( $content ) ) {\n\t\t$query .= 'AND post_content = %s';\n\t\t$args[] = $post_content;\n\t}\n\n\tif ( !empty ( $args ) )\n\t\treturn (int) $wpdb->get_var( $wpdb->prepare($query, $args) );\n\n\treturn 0;\n}\n\n/**\n * Creates a new post from the \"Write Post\" form using $_POST information.\n *\n * @since 2.1.0\n *\n * @global WP_User $current_user\n *\n * @return int|WP_Error\n */\nfunction wp_write_post() {\n\tif ( isset($_POST['post_type']) )\n\t\t$ptype = get_post_type_object($_POST['post_type']);\n\telse\n\t\t$ptype = get_post_type_object('post');\n\n\tif ( !current_user_can( $ptype->cap->edit_posts ) ) {\n\t\tif ( 'page' == $ptype->name )\n\t\t\treturn new WP_Error( 'edit_pages', __( 'You are not allowed to create pages on this site.' ) );\n\t\telse\n\t\t\treturn new WP_Error( 'edit_posts', __( 'You are not allowed to create posts or drafts on this site.' ) );\n\t}\n\n\t$_POST['post_mime_type'] = '';\n\n\t// Clear out any data in internal vars.\n\tunset( $_POST['filter'] );\n\n\t// Edit don't write if we have a post id.\n\tif ( isset( $_POST['post_ID'] ) )\n\t\treturn edit_post();\n\n\tif ( isset($_POST['visibility']) ) {\n\t\tswitch ( $_POST['visibility'] ) {\n\t\t\tcase 'public' :\n\t\t\t\t$_POST['post_password'] = '';\n\t\t\t\tbreak;\n\t\t\tcase 'password' :\n\t\t\t\tunset( $_POST['sticky'] );\n\t\t\t\tbreak;\n\t\t\tcase 'private' :\n\t\t\t\t$_POST['post_status'] = 'private';\n\t\t\t\t$_POST['post_password'] = '';\n\t\t\t\tunset( $_POST['sticky'] );\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t$translated = _wp_translate_postdata( false );\n\tif ( is_wp_error($translated) )\n\t\treturn $translated;\n\n\t// Create the post.\n\t$post_ID = wp_insert_post( $_POST );\n\tif ( is_wp_error( $post_ID ) )\n\t\treturn $post_ID;\n\n\tif ( empty($post_ID) )\n\t\treturn 0;\n\n\tadd_meta( $post_ID );\n\n\tadd_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID );\n\n\t// Now that we have an ID we can fix any attachment anchor hrefs\n\t_fix_attachment_links( $post_ID );\n\n\twp_set_post_lock( $post_ID );\n\n\treturn $post_ID;\n}\n\n/**\n * Calls wp_write_post() and handles the errors.\n *\n * @since 2.0.0\n *\n * @return int|null\n */\nfunction write_post() {\n\t$result = wp_write_post();\n\tif ( is_wp_error( $result ) )\n\t\twp_die( $result->get_error_message() );\n\telse\n\t\treturn $result;\n}\n\n//\n// Post Meta\n//\n\n/**\n * Add post meta data defined in $_POST superglobal for post with given ID.\n *\n * @since 1.2.0\n *\n * @param int $post_ID\n * @return int|bool\n */\nfunction add_meta( $post_ID ) {\n\t$post_ID = (int) $post_ID;\n\n\t$metakeyselect = isset($_POST['metakeyselect']) ? wp_unslash( trim( $_POST['metakeyselect'] ) ) : '';\n\t$metakeyinput = isset($_POST['metakeyinput']) ? wp_unslash( trim( $_POST['metakeyinput'] ) ) : '';\n\t$metavalue = isset($_POST['metavalue']) ? $_POST['metavalue'] : '';\n\tif ( is_string( $metavalue ) )\n\t\t$metavalue = trim( $metavalue );\n\n\tif ( ('0' === $metavalue || ! empty ( $metavalue ) ) && ( ( ( '#NONE#' != $metakeyselect ) && !empty ( $metakeyselect) ) || !empty ( $metakeyinput ) ) ) {\n\t\t/*\n\t\t * We have a key/value pair. If both the select and the input\n\t\t * for the key have data, the input takes precedence.\n\t\t */\n \t\tif ( '#NONE#' != $metakeyselect )\n\t\t\t$metakey = $metakeyselect;\n\n\t\tif ( $metakeyinput )\n\t\t\t$metakey = $metakeyinput; // default\n\n\t\tif ( is_protected_meta( $metakey, 'post' ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) )\n\t\t\treturn false;\n\n\t\t$metakey = wp_slash( $metakey );\n\n\t\treturn add_post_meta( $post_ID, $metakey, $metavalue );\n\t}\n\n\treturn false;\n} // add_meta\n\n/**\n * Delete post meta data by meta ID.\n *\n * @since 1.2.0\n *\n * @param int $mid\n * @return bool\n */\nfunction delete_meta( $mid ) {\n\treturn delete_metadata_by_mid( 'post' , $mid );\n}\n\n/**\n * Get a list of previously defined keys.\n *\n * @since 1.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return mixed\n */\nfunction get_meta_keys() {\n\tglobal $wpdb;\n\n\t$keys = $wpdb->get_col( \"\n\t\t\tSELECT meta_key\n\t\t\tFROM $wpdb->postmeta\n\t\t\tGROUP BY meta_key\n\t\t\tORDER BY meta_key\" );\n\n\treturn $keys;\n}\n\n/**\n * Get post meta data by meta ID.\n *\n * @since 2.1.0\n *\n * @param int $mid\n * @return object|bool\n */\nfunction get_post_meta_by_id( $mid ) {\n\treturn get_metadata_by_mid( 'post', $mid );\n}\n\n/**\n * Get meta data for the given post ID.\n *\n * @since 1.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $postid\n * @return mixed\n */\nfunction has_meta( $postid ) {\n\tglobal $wpdb;\n\n\treturn $wpdb->get_results( $wpdb->prepare(\"SELECT meta_key, meta_value, meta_id, post_id\n\t\t\tFROM $wpdb->postmeta WHERE post_id = %d\n\t\t\tORDER BY meta_key,meta_id\", $postid), ARRAY_A );\n}\n\n/**\n * Update post meta data by meta ID.\n *\n * @since 1.2.0\n *\n * @param int    $meta_id\n * @param string $meta_key Expect Slashed\n * @param string $meta_value Expect Slashed\n * @return bool\n */\nfunction update_meta( $meta_id, $meta_key, $meta_value ) {\n\t$meta_key = wp_unslash( $meta_key );\n\t$meta_value = wp_unslash( $meta_value );\n\n\treturn update_metadata_by_mid( 'post', $meta_id, $meta_value, $meta_key );\n}\n\n//\n// Private\n//\n\n/**\n * Replace hrefs of attachment anchors with up-to-date permalinks.\n *\n * @since 2.3.0\n * @access private\n *\n * @param int|object $post Post ID or post object.\n * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.\n */\nfunction _fix_attachment_links( $post ) {\n\t$post = get_post( $post, ARRAY_A );\n\t$content = $post['post_content'];\n\n\t// Don't run if no pretty permalinks or post is not published, scheduled, or privately published.\n\tif ( ! get_option( 'permalink_structure' ) || ! in_array( $post['post_status'], array( 'publish', 'future', 'private' ) ) )\n\t\treturn;\n\n\t// Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero)\n\tif ( !strpos($content, '?attachment_id=') || !preg_match_all( '/<a ([^>]+)>[\\s\\S]+?<\\/a>/', $content, $link_matches ) )\n\t\treturn;\n\n\t$site_url = get_bloginfo('url');\n\t$site_url = substr( $site_url, (int) strpos($site_url, '://') ); // remove the http(s)\n\t$replace = '';\n\n\tforeach ( $link_matches[1] as $key => $value ) {\n\t\tif ( !strpos($value, '?attachment_id=') || !strpos($value, 'wp-att-')\n\t\t\t|| !preg_match( '/href=([\"\\'])[^\"\\']*\\?attachment_id=(\\d+)[^\"\\']*\\\\1/', $value, $url_match )\n\t\t\t|| !preg_match( '/rel=[\"\\'][^\"\\']*wp-att-(\\d+)/', $value, $rel_match ) )\n\t\t\t\tcontinue;\n\n\t\t$quote = $url_match[1]; // the quote (single or double)\n\t\t$url_id = (int) $url_match[2];\n\t\t$rel_id = (int) $rel_match[1];\n\n\t\tif ( !$url_id || !$rel_id || $url_id != $rel_id || strpos($url_match[0], $site_url) === false )\n\t\t\tcontinue;\n\n\t\t$link = $link_matches[0][$key];\n\t\t$replace = str_replace( $url_match[0], 'href=' . $quote . get_attachment_link( $url_id ) . $quote, $link );\n\n\t\t$content = str_replace( $link, $replace, $content );\n\t}\n\n\tif ( $replace ) {\n\t\t$post['post_content'] = $content;\n\t\t// Escape data pulled from DB.\n\t\t$post = add_magic_quotes($post);\n\n\t\treturn wp_update_post($post);\n\t}\n}\n\n/**\n * Get all the possible statuses for a post_type\n *\n * @since 2.5.0\n *\n * @param string $type The post_type you want the statuses for\n * @return array As array of all the statuses for the supplied post type\n */\nfunction get_available_post_statuses($type = 'post') {\n\t$stati = wp_count_posts($type);\n\n\treturn array_keys(get_object_vars($stati));\n}\n\n/**\n * Run the wp query to fetch the posts for listing on the edit posts page\n *\n * @since 2.5.0\n *\n * @param array|bool $q Array of query variables to use to build the query or false to use $_GET superglobal.\n * @return array\n */\nfunction wp_edit_posts_query( $q = false ) {\n\tif ( false === $q )\n\t\t$q = $_GET;\n\t$q['m'] = isset($q['m']) ? (int) $q['m'] : 0;\n\t$q['cat'] = isset($q['cat']) ? (int) $q['cat'] : 0;\n\t$post_stati  = get_post_stati();\n\n\tif ( isset($q['post_type']) && in_array( $q['post_type'], get_post_types() ) )\n\t\t$post_type = $q['post_type'];\n\telse\n\t\t$post_type = 'post';\n\n\t$avail_post_stati = get_available_post_statuses($post_type);\n\n\tif ( isset($q['post_status']) && in_array( $q['post_status'], $post_stati ) ) {\n\t\t$post_status = $q['post_status'];\n\t\t$perm = 'readable';\n\t}\n\n\tif ( isset( $q['orderby'] ) ) {\n\t\t$orderby = $q['orderby'];\n\t} elseif ( isset( $q['post_status'] ) && in_array( $q['post_status'], array( 'pending', 'draft' ) ) ) {\n\t\t$orderby = 'modified';\n\t}\n\n\tif ( isset( $q['order'] ) ) {\n\t\t$order = $q['order'];\n\t} elseif ( isset( $q['post_status'] ) && 'pending' == $q['post_status'] ) {\n\t\t$order = 'ASC';\n\t}\n\n\t$per_page = \"edit_{$post_type}_per_page\";\n\t$posts_per_page = (int) get_user_option( $per_page );\n\tif ( empty( $posts_per_page ) || $posts_per_page < 1 )\n\t\t$posts_per_page = 20;\n\n\t/**\n\t * Filter the number of items per page to show for a specific 'per_page' type.\n\t *\n\t * The dynamic portion of the hook name, `$post_type`, refers to the post type.\n\t *\n\t * Some examples of filter hooks generated here include: 'edit_attachment_per_page',\n\t * 'edit_post_per_page', 'edit_page_per_page', etc.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param int $posts_per_page Number of posts to display per page for the given post\n\t *                            type. Default 20.\n\t */\n\t$posts_per_page = apply_filters( \"edit_{$post_type}_per_page\", $posts_per_page );\n\n\t/**\n\t * Filter the number of posts displayed per page when specifically listing \"posts\".\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param int    $posts_per_page Number of posts to be displayed. Default 20.\n\t * @param string $post_type      The post type.\n\t */\n\t$posts_per_page = apply_filters( 'edit_posts_per_page', $posts_per_page, $post_type );\n\n\t$query = compact('post_type', 'post_status', 'perm', 'order', 'orderby', 'posts_per_page');\n\n\t// Hierarchical types require special args.\n\tif ( is_post_type_hierarchical( $post_type ) && !isset($orderby) ) {\n\t\t$query['orderby'] = 'menu_order title';\n\t\t$query['order'] = 'asc';\n\t\t$query['posts_per_page'] = -1;\n\t\t$query['posts_per_archive_page'] = -1;\n\t\t$query['fields'] = 'id=>parent';\n\t}\n\n\tif ( ! empty( $q['show_sticky'] ) )\n\t\t$query['post__in'] = (array) get_option( 'sticky_posts' );\n\n\twp( $query );\n\n\treturn $avail_post_stati;\n}\n\n/**\n * Get all available post MIME types for a given post type.\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $type\n * @return mixed\n */\nfunction get_available_post_mime_types($type = 'attachment') {\n\tglobal $wpdb;\n\n\t$types = $wpdb->get_col($wpdb->prepare(\"SELECT DISTINCT post_mime_type FROM $wpdb->posts WHERE post_type = %s\", $type));\n\treturn $types;\n}\n\n/**\n * Get the query variables for the current attachments request.\n *\n * @since 4.2.0\n *\n * @param array|false $q Optional. Array of query variables to use to build the query or false\n *                       to use $_GET superglobal. Default false.\n * @return array The parsed query vars.\n */\nfunction wp_edit_attachments_query_vars( $q = false ) {\n\tif ( false === $q ) {\n\t\t$q = $_GET;\n\t}\n\t$q['m']   = isset( $q['m'] ) ? (int) $q['m'] : 0;\n\t$q['cat'] = isset( $q['cat'] ) ? (int) $q['cat'] : 0;\n\t$q['post_type'] = 'attachment';\n\t$post_type = get_post_type_object( 'attachment' );\n\t$states = 'inherit';\n\tif ( current_user_can( $post_type->cap->read_private_posts ) ) {\n\t\t$states .= ',private';\n\t}\n\n\t$q['post_status'] = isset( $q['status'] ) && 'trash' == $q['status'] ? 'trash' : $states;\n\t$q['post_status'] = isset( $q['attachment-filter'] ) && 'trash' == $q['attachment-filter'] ? 'trash' : $states;\n\n\t$media_per_page = (int) get_user_option( 'upload_per_page' );\n\tif ( empty( $media_per_page ) || $media_per_page < 1 ) {\n\t\t$media_per_page = 20;\n\t}\n\n\t/**\n\t * Filter the number of items to list per page when listing media items.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $media_per_page Number of media to list. Default 20.\n\t */\n\t$q['posts_per_page'] = apply_filters( 'upload_per_page', $media_per_page );\n\n\t$post_mime_types = get_post_mime_types();\n\tif ( isset($q['post_mime_type']) && !array_intersect( (array) $q['post_mime_type'], array_keys($post_mime_types) ) ) {\n\t\tunset($q['post_mime_type']);\n\t}\n\n\tforeach ( array_keys( $post_mime_types ) as $type ) {\n\t\tif ( isset( $q['attachment-filter'] ) && \"post_mime_type:$type\" == $q['attachment-filter'] ) {\n\t\t\t$q['post_mime_type'] = $type;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( isset( $q['detached'] ) || ( isset( $q['attachment-filter'] ) && 'detached' == $q['attachment-filter'] ) ) {\n\t\t$q['post_parent'] = 0;\n\t}\n\n\treturn $q;\n}\n\n/**\n * Executes a query for attachments. An array of WP_Query arguments\n * can be passed in, which will override the arguments set by this function.\n *\n * @since 2.5.0\n *\n * @param array|false $q Array of query variables to use to build the query or false to use $_GET superglobal.\n * @return array\n */\nfunction wp_edit_attachments_query( $q = false ) {\n\twp( wp_edit_attachments_query_vars( $q ) );\n\n\t$post_mime_types = get_post_mime_types();\n\t$avail_post_mime_types = get_available_post_mime_types( 'attachment' );\n\n\treturn array( $post_mime_types, $avail_post_mime_types );\n}\n\n/**\n * Returns the list of classes to be used by a metabox\n *\n * @since 2.5.0\n *\n * @param string $id\n * @param string $page\n * @return string\n */\nfunction postbox_classes( $id, $page ) {\n\tif ( isset( $_GET['edit'] ) && $_GET['edit'] == $id ) {\n\t\t$classes = array( '' );\n\t} elseif ( $closed = get_user_option('closedpostboxes_'.$page ) ) {\n\t\tif ( !is_array( $closed ) ) {\n\t\t\t$classes = array( '' );\n\t\t} else {\n\t\t\t$classes = in_array( $id, $closed ) ? array( 'closed' ) : array( '' );\n\t\t}\n\t} else {\n\t\t$classes = array( '' );\n\t}\n\n\t/**\n\t * Filter the postbox classes for a specific screen and screen ID combo.\n\t *\n\t * The dynamic portions of the hook name, `$page` and `$id`, refer to\n\t * the screen and screen ID, respectively.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @param array $classes An array of postbox classes.\n\t */\n\t$classes = apply_filters( \"postbox_classes_{$page}_{$id}\", $classes );\n\treturn implode( ' ', $classes );\n}\n\n/**\n * Get a sample permalink based off of the post name.\n *\n * @since 2.5.0\n *\n * @param int    $id    Post ID or post object.\n * @param string $title Optional. Title. Default null.\n * @param string $name  Optional. Name. Default null.\n * @return array Array with two entries of type string.\n */\nfunction get_sample_permalink($id, $title = null, $name = null) {\n\t$post = get_post( $id );\n\tif ( ! $post )\n\t\treturn array( '', '' );\n\n\t$ptype = get_post_type_object($post->post_type);\n\n\t$original_status = $post->post_status;\n\t$original_date = $post->post_date;\n\t$original_name = $post->post_name;\n\n\t// Hack: get_permalink() would return ugly permalink for drafts, so we will fake that our post is published.\n\tif ( in_array( $post->post_status, array( 'draft', 'pending', 'future' ) ) ) {\n\t\t$post->post_status = 'publish';\n\t\t$post->post_name = sanitize_title($post->post_name ? $post->post_name : $post->post_title, $post->ID);\n\t}\n\n\t// If the user wants to set a new name -- override the current one\n\t// Note: if empty name is supplied -- use the title instead, see #6072\n\tif ( !is_null($name) )\n\t\t$post->post_name = sanitize_title($name ? $name : $title, $post->ID);\n\n\t$post->post_name = wp_unique_post_slug($post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent);\n\n\t$post->filter = 'sample';\n\n\t$permalink = get_permalink($post, true);\n\n\t// Replace custom post_type Token with generic pagename token for ease of use.\n\t$permalink = str_replace(\"%$post->post_type%\", '%pagename%', $permalink);\n\n\t// Handle page hierarchy\n\tif ( $ptype->hierarchical ) {\n\t\t$uri = get_page_uri($post);\n\t\tif ( $uri ) {\n\t\t\t$uri = untrailingslashit($uri);\n\t\t\t$uri = strrev( stristr( strrev( $uri ), '/' ) );\n\t\t\t$uri = untrailingslashit($uri);\n\t\t}\n\n\t\t/** This filter is documented in wp-admin/edit-tag-form.php */\n\t\t$uri = apply_filters( 'editable_slug', $uri, $post );\n\t\tif ( !empty($uri) )\n\t\t\t$uri .= '/';\n\t\t$permalink = str_replace('%pagename%', \"{$uri}%pagename%\", $permalink);\n\t}\n\n\t/** This filter is documented in wp-admin/edit-tag-form.php */\n\t$permalink = array( $permalink, apply_filters( 'editable_slug', $post->post_name, $post ) );\n\t$post->post_status = $original_status;\n\t$post->post_date = $original_date;\n\t$post->post_name = $original_name;\n\tunset($post->filter);\n\n\t/**\n\t * Filter the sample permalink.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string  $permalink Sample permalink.\n\t * @param int     $post_id   Post ID.\n\t * @param string  $title     Post title.\n\t * @param string  $name      Post name (slug).\n\t * @param WP_Post $post      Post object.\n\t */\n\treturn apply_filters( 'get_sample_permalink', $permalink, $post->ID, $title, $name, $post );\n}\n\n/**\n * Returns the HTML of the sample permalink slug editor.\n *\n * @since 2.5.0\n *\n * @param int    $id        Post ID or post object.\n * @param string $new_title Optional. New title. Default null.\n * @param string $new_slug  Optional. New slug. Default null.\n * @return string The HTML of the sample permalink slug editor.\n */\nfunction get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {\n\t$post = get_post( $id );\n\tif ( ! $post )\n\t\treturn '';\n\n\tlist($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);\n\n\t$view_link = false;\n\t$preview_target = '';\n\n\tif ( current_user_can( 'read_post', $post->ID ) ) {\n\t\tif ( 'draft' === $post->post_status ) {\n\t\t\t$draft_link = set_url_scheme( get_permalink( $post->ID ) );\n\t\t\t$view_link = get_preview_post_link( $post, array(), $draft_link );\n\t\t\t$preview_target = \" target='wp-preview-{$post->ID}'\";\n\t\t} else {\n\t\t\tif ( 'publish' === $post->post_status || 'attachment' === $post->post_type ) {\n\t\t\t\t$view_link = get_permalink( $post );\n\t\t\t} else {\n\t\t\t\t// Allow non-published (private, future) to be viewed at a pretty permalink.\n\t\t\t\t$view_link = str_replace( array( '%pagename%', '%postname%' ), $post->post_name, urldecode( $permalink ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Permalinks without a post/page name placeholder don't have anything to edit\n\tif ( false === strpos( $permalink, '%postname%' ) && false === strpos( $permalink, '%pagename%' ) ) {\n\t\t$return = '<strong>' . __( 'Permalink:' ) . \"</strong>\\n\";\n\n\t\tif ( false !== $view_link ) {\n\t\t\t$return .= '<a id=\"sample-permalink\" href=\"' . esc_url( $view_link ) . '\"' . $preview_target . '>' . $view_link . \"</a>\\n\";\n\t\t} else {\n\t\t\t$return .= '<span id=\"sample-permalink\">' . $permalink . \"</span>\\n\";\n\t\t}\n\n\t\t// Encourage a pretty permalink setting\n\t\tif ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) ) {\n\t\t\t$return .= '<span id=\"change-permalinks\"><a href=\"options-permalink.php\" class=\"button button-small\" target=\"_blank\">' . __('Change Permalinks') . \"</a></span>\\n\";\n\t\t}\n\t} else {\n\t\tif ( function_exists( 'mb_strlen' ) ) {\n\t\t\tif ( mb_strlen( $post_name ) > 34 ) {\n\t\t\t\t$post_name_abridged = mb_substr( $post_name, 0, 16 ) . '&hellip;' . mb_substr( $post_name, -16 );\n\t\t\t} else {\n\t\t\t\t$post_name_abridged = $post_name;\n\t\t\t}\n\t\t} else {\n\t\t\tif ( strlen( $post_name ) > 34 ) {\n\t\t\t\t$post_name_abridged = substr( $post_name, 0, 16 ) . '&hellip;' . substr( $post_name, -16 );\n\t\t\t} else {\n\t\t\t\t$post_name_abridged = $post_name;\n\t\t\t}\n\t\t}\n\n\t\t$post_name_html = '<span id=\"editable-post-name\">' . $post_name_abridged . '</span>';\n\t\t$display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, urldecode( $permalink ) );\n\n\t\t$return = '<strong>' . __( 'Permalink:' ) . \"</strong>\\n\";\n\t\t$return .= '<span id=\"sample-permalink\"><a href=\"' . esc_url( $view_link ) . '\"' . $preview_target . '>' . $display_link . \"</a></span>\\n\";\n\t\t$return .= '&lrm;'; // Fix bi-directional text display defect in RTL languages.\n\t\t$return .= '<span id=\"edit-slug-buttons\"><button type=\"button\" class=\"edit-slug button button-small hide-if-no-js\" aria-label=\"' . __( 'Edit permalink' ) . '\">' . __( 'Edit' ) . \"</button></span>\\n\";\n\t\t$return .= '<span id=\"editable-post-name-full\">' . $post_name . \"</span>\\n\";\n\t}\n\n\t/**\n\t * Filter the sample permalink HTML markup.\n\t *\n\t * @since 2.9.0\n\t * @since 4.4.0 Added `$post` parameter.\n\t *\n\t * @param string  $return    Sample permalink HTML markup.\n\t * @param int     $post_id   Post ID.\n\t * @param string  $new_title New sample permalink title.\n\t * @param string  $new_slug  New sample permalink slug.\n\t * @param WP_Post $post      Post object.\n\t */\n\t$return = apply_filters( 'get_sample_permalink_html', $return, $post->ID, $new_title, $new_slug, $post );\n\n\treturn $return;\n}\n\n/**\n * Output HTML for the post thumbnail meta-box.\n *\n * @since 2.9.0\n *\n * @global int   $content_width\n * @global array $_wp_additional_image_sizes\n *\n * @param int $thumbnail_id ID of the attachment used for thumbnail\n * @param mixed $post The post ID or object associated with the thumbnail, defaults to global $post.\n * @return string html\n */\nfunction _wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) {\n\tglobal $content_width, $_wp_additional_image_sizes;\n\n\t$post               = get_post( $post );\n\t$post_type_object   = get_post_type_object( $post->post_type );\n\t$set_thumbnail_link = '<p class=\"hide-if-no-js\"><a title=\"%s\" href=\"%s\" id=\"set-post-thumbnail\" class=\"thickbox\">%s</a></p>';\n\t$upload_iframe_src  = get_upload_iframe_src( 'image', $post->ID );\n\n\t$content = sprintf( $set_thumbnail_link,\n\t\tesc_attr( $post_type_object->labels->set_featured_image ),\n\t\tesc_url( $upload_iframe_src ),\n\t\tesc_html( $post_type_object->labels->set_featured_image )\n\t);\n\n\tif ( $thumbnail_id && get_post( $thumbnail_id ) ) {\n\t\t$size = isset( $_wp_additional_image_sizes['post-thumbnail'] ) ? 'post-thumbnail' : array( 266, 266 );\n\n\t\t/**\n\t\t * Filter the size used to display the post thumbnail image in the 'Featured Image' meta box.\n\t\t *\n\t\t * Note: When a theme adds 'post-thumbnail' support, a special 'post-thumbnail'\n\t\t * image size is registered, which differs from the 'thumbnail' image size\n\t\t * managed via the Settings > Media screen. See the `$size` parameter description\n\t\t * for more information on default values.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string|array $size         Post thumbnail image size to display in the meta box. Accepts any valid\n\t\t *                                   image size, or an array of width and height values in pixels (in that order).\n\t\t *                                   If the 'post-thumbnail' size is set, default is 'post-thumbnail'. Otherwise,\n\t\t *                                   default is an array with 266 as both the height and width values.\n\t\t * @param int          $thumbnail_id Post thumbnail attachment ID.\n\t\t * @param WP_Post      $post         The post object associated with the thumbnail.\n\t\t */\n\t\t$size = apply_filters( 'admin_post_thumbnail_size', $size, $thumbnail_id, $post );\n\n\t\t$thumbnail_html = wp_get_attachment_image( $thumbnail_id, $size );\n\n\t\tif ( !empty( $thumbnail_html ) ) {\n\t\t\t$ajax_nonce = wp_create_nonce( 'set_post_thumbnail-' . $post->ID );\n\t\t\t$content = sprintf( $set_thumbnail_link,\n\t\t\t\tesc_attr( $post_type_object->labels->set_featured_image ),\n\t\t\t\tesc_url( $upload_iframe_src ),\n\t\t\t\t$thumbnail_html\n\t\t\t);\n\t\t\t$content .= '<p class=\"hide-if-no-js\"><a href=\"#\" id=\"remove-post-thumbnail\" onclick=\"WPRemoveThumbnail(\\'' . $ajax_nonce . '\\');return false;\">' . esc_html( $post_type_object->labels->remove_featured_image ) . '</a></p>';\n\t\t}\n\t}\n\n\t/**\n\t * Filter the admin post thumbnail HTML markup to return.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $content Admin post thumbnail HTML markup.\n\t * @param int    $post_id Post ID.\n\t */\n\treturn apply_filters( 'admin_post_thumbnail_html', $content, $post->ID );\n}\n\n/**\n * Check to see if the post is currently being edited by another user.\n *\n * @since 2.5.0\n *\n * @param int $post_id ID of the post to check for editing\n * @return integer False: not locked or locked by current user. Int: user ID of user with lock.\n */\nfunction wp_check_post_lock( $post_id ) {\n\tif ( !$post = get_post( $post_id ) )\n\t\treturn false;\n\n\tif ( !$lock = get_post_meta( $post->ID, '_edit_lock', true ) )\n\t\treturn false;\n\n\t$lock = explode( ':', $lock );\n\t$time = $lock[0];\n\t$user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true );\n\n\t/** This filter is documented in wp-admin/includes/ajax-actions.php */\n\t$time_window = apply_filters( 'wp_check_post_lock_window', 150 );\n\n\tif ( $time && $time > time() - $time_window && $user != get_current_user_id() )\n\t\treturn $user;\n\treturn false;\n}\n\n/**\n * Mark the post as currently being edited by the current user\n *\n * @since 2.5.0\n *\n * @param int $post_id ID of the post to being edited\n * @return bool|array Returns false if the post doesn't exist of there is no current user, or\n * \tan array of the lock time and the user ID.\n */\nfunction wp_set_post_lock( $post_id ) {\n\tif ( !$post = get_post( $post_id ) )\n\t\treturn false;\n\tif ( 0 == ($user_id = get_current_user_id()) )\n\t\treturn false;\n\n\t$now = time();\n\t$lock = \"$now:$user_id\";\n\n\tupdate_post_meta( $post->ID, '_edit_lock', $lock );\n\treturn array( $now, $user_id );\n}\n\n/**\n * Outputs the HTML for the notice to say that someone else is editing or has taken over editing of this post.\n *\n * @since 2.8.5\n * @return none\n */\nfunction _admin_notice_post_locked() {\n\tif ( ! $post = get_post() )\n\t\treturn;\n\n\t$user = null;\n\tif (  $user_id = wp_check_post_lock( $post->ID ) )\n\t\t$user = get_userdata( $user_id );\n\n\tif ( $user ) {\n\n\t\t/**\n\t\t * Filter whether to show the post locked dialog.\n\t\t *\n\t\t * Returning a falsey value to the filter will short-circuit displaying the dialog.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param bool         $display Whether to display the dialog. Default true.\n\t\t * @param WP_User|bool $user    WP_User object on success, false otherwise.\n\t\t */\n\t\tif ( ! apply_filters( 'show_post_locked_dialog', true, $post, $user ) )\n\t\t\treturn;\n\n\t\t$locked = true;\n\t} else {\n\t\t$locked = false;\n\t}\n\n\tif ( $locked && ( $sendback = wp_get_referer() ) &&\n\t\tfalse === strpos( $sendback, 'post.php' ) && false === strpos( $sendback, 'post-new.php' ) ) {\n\n\t\t$sendback_text = __('Go back');\n\t} else {\n\t\t$sendback = admin_url( 'edit.php' );\n\n\t\tif ( 'post' != $post->post_type )\n\t\t\t$sendback = add_query_arg( 'post_type', $post->post_type, $sendback );\n\n\t\t$sendback_text = get_post_type_object( $post->post_type )->labels->all_items;\n\t}\n\n\t$hidden = $locked ? '' : ' hidden';\n\n\t?>\n\t<div id=\"post-lock-dialog\" class=\"notification-dialog-wrap<?php echo $hidden; ?>\">\n\t<div class=\"notification-dialog-background\"></div>\n\t<div class=\"notification-dialog\">\n\t<?php\n\n\tif ( $locked ) {\n\t\t$query_args = array();\n\t\tif ( get_post_type_object( $post->post_type )->public ) {\n\t\t\tif ( 'publish' == $post->post_status || $user->ID != $post->post_author ) {\n\t\t\t\t// Latest content is in autosave\n\t\t\t\t$nonce = wp_create_nonce( 'post_preview_' . $post->ID );\n\t\t\t\t$query_args['preview_id'] = $post->ID;\n\t\t\t\t$query_args['preview_nonce'] = $nonce;\n\t\t\t}\n\t\t}\n\n\t\t$preview_link = get_preview_post_link( $post->ID, $query_args );\n\n\t\t/**\n\t\t * Filter whether to allow the post lock to be overridden.\n\t\t *\n\t\t * Returning a falsey value to the filter will disable the ability\n\t\t * to override the post lock.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param bool    $override Whether to allow overriding post locks. Default true.\n\t\t * @param WP_Post $post     Post object.\n\t\t * @param WP_User $user     User object.\n\t\t */\n\t\t$override = apply_filters( 'override_post_lock', true, $post, $user );\n\t\t$tab_last = $override ? '' : ' wp-tab-last';\n\n\t\t?>\n\t\t<div class=\"post-locked-message\">\n\t\t<div class=\"post-locked-avatar\"><?php echo get_avatar( $user->ID, 64 ); ?></div>\n\t\t<p class=\"currently-editing wp-tab-first\" tabindex=\"0\">\n\t\t<?php\n\t\t\t_e( 'This content is currently locked.' );\n\t\t\tif ( $override )\n\t\t\t\tprintf( ' ' . __( 'If you take over, %s will be blocked from continuing to edit.' ), esc_html( $user->display_name ) );\n\t\t?>\n\t\t</p>\n\t\t<?php\n\t\t/**\n\t\t * Fires inside the post locked dialog before the buttons are displayed.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param WP_Post $post Post object.\n\t\t */\n\t\tdo_action( 'post_locked_dialog', $post );\n\t\t?>\n\t\t<p>\n\t\t<a class=\"button\" href=\"<?php echo esc_url( $sendback ); ?>\"><?php echo $sendback_text; ?></a>\n\t\t<?php if ( $preview_link ) { ?>\n\t\t<a class=\"button<?php echo $tab_last; ?>\" href=\"<?php echo esc_url( $preview_link ); ?>\"><?php _e('Preview'); ?></a>\n\t\t<?php\n\t\t}\n\n\t\t// Allow plugins to prevent some users overriding the post lock\n\t\tif ( $override ) {\n\t\t\t?>\n\t\t\t<a class=\"button button-primary wp-tab-last\" href=\"<?php echo esc_url( add_query_arg( 'get-post-lock', '1', wp_nonce_url( get_edit_post_link( $post->ID, 'url' ), 'lock-post_' . $post->ID ) ) ); ?>\"><?php _e('Take over'); ?></a>\n\t\t\t<?php\n\t\t}\n\n\t\t?>\n\t\t</p>\n\t\t</div>\n\t\t<?php\n\t} else {\n\t\t?>\n\t\t<div class=\"post-taken-over\">\n\t\t\t<div class=\"post-locked-avatar\"></div>\n\t\t\t<p class=\"wp-tab-first\" tabindex=\"0\">\n\t\t\t<span class=\"currently-editing\"></span><br />\n\t\t\t<span class=\"locked-saving hidden\"><img src=\"<?php echo esc_url( admin_url( 'images/spinner-2x.gif' ) ); ?>\" width=\"16\" height=\"16\" alt=\"\" /> <?php _e( 'Saving revision&hellip;' ); ?></span>\n\t\t\t<span class=\"locked-saved hidden\"><?php _e('Your latest changes were saved as a revision.'); ?></span>\n\t\t\t</p>\n\t\t\t<?php\n\t\t\t/**\n\t\t\t * Fires inside the dialog displayed when a user has lost the post lock.\n\t\t\t *\n\t\t\t * @since 3.6.0\n\t\t\t *\n\t\t\t * @param WP_Post $post Post object.\n\t\t\t */\n\t\t\tdo_action( 'post_lock_lost_dialog', $post );\n\t\t\t?>\n\t\t\t<p><a class=\"button button-primary wp-tab-last\" href=\"<?php echo esc_url( $sendback ); ?>\"><?php echo $sendback_text; ?></a></p>\n\t\t</div>\n\t\t<?php\n\t}\n\n\t?>\n\t</div>\n\t</div>\n\t<?php\n}\n\n/**\n * Creates autosave data for the specified post from $_POST data.\n *\n * @package WordPress\n * @subpackage Post_Revisions\n * @since 2.6.0\n *\n * @param mixed $post_data Associative array containing the post data or int post ID.\n * @return mixed The autosave revision ID. WP_Error or 0 on error.\n */\nfunction wp_create_post_autosave( $post_data ) {\n\tif ( is_numeric( $post_data ) ) {\n\t\t$post_id = $post_data;\n\t\t$post_data = &$_POST;\n\t} else {\n\t\t$post_id = (int) $post_data['post_ID'];\n\t}\n\n\t$post_data = _wp_translate_postdata( true, $post_data );\n\tif ( is_wp_error( $post_data ) )\n\t\treturn $post_data;\n\n\t$post_author = get_current_user_id();\n\n\t// Store one autosave per author. If there is already an autosave, overwrite it.\n\tif ( $old_autosave = wp_get_post_autosave( $post_id, $post_author ) ) {\n\t\t$new_autosave = _wp_post_revision_fields( $post_data, true );\n\t\t$new_autosave['ID'] = $old_autosave->ID;\n\t\t$new_autosave['post_author'] = $post_author;\n\n\t\t// If the new autosave has the same content as the post, delete the autosave.\n\t\t$post = get_post( $post_id );\n\t\t$autosave_is_different = false;\n\t\tforeach ( array_intersect( array_keys( $new_autosave ), array_keys( _wp_post_revision_fields() ) ) as $field ) {\n\t\t\tif ( normalize_whitespace( $new_autosave[ $field ] ) != normalize_whitespace( $post->$field ) ) {\n\t\t\t\t$autosave_is_different = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $autosave_is_different ) {\n\t\t\twp_delete_post_revision( $old_autosave->ID );\n\t\t\treturn 0;\n\t\t}\n\n\t\t/**\n\t\t * Fires before an autosave is stored.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param array $new_autosave Post array - the autosave that is about to be saved.\n\t\t */\n\t\tdo_action( 'wp_creating_autosave', $new_autosave );\n\n\t\treturn wp_update_post( $new_autosave );\n\t}\n\n\t// _wp_put_post_revision() expects unescaped.\n\t$post_data = wp_unslash( $post_data );\n\n\t// Otherwise create the new autosave as a special post revision\n\treturn _wp_put_post_revision( $post_data, true );\n}\n\n/**\n * Save draft or manually autosave for showing preview.\n *\n * @package WordPress\n * @since 2.7.0\n *\n * @return str URL to redirect to show the preview\n */\nfunction post_preview() {\n\n\t$post_ID = (int) $_POST['post_ID'];\n\t$_POST['ID'] = $post_ID;\n\n\tif ( ! $post = get_post( $post_ID ) ) {\n\t\twp_die( __( 'You are not allowed to edit this post.' ) );\n\t}\n\n\tif ( ! current_user_can( 'edit_post', $post->ID ) ) {\n\t\twp_die( __( 'You are not allowed to edit this post.' ) );\n\t}\n\n\t$is_autosave = false;\n\n\tif ( ! wp_check_post_lock( $post->ID ) && get_current_user_id() == $post->post_author && ( 'draft' == $post->post_status || 'auto-draft' == $post->post_status ) ) {\n\t\t$saved_post_id = edit_post();\n\t} else {\n\t\t$is_autosave = true;\n\n\t\tif ( isset( $_POST['post_status'] ) && 'auto-draft' == $_POST['post_status'] )\n\t\t\t$_POST['post_status'] = 'draft';\n\n\t\t$saved_post_id = wp_create_post_autosave( $post->ID );\n\t}\n\n\tif ( is_wp_error( $saved_post_id ) )\n\t\twp_die( $saved_post_id->get_error_message() );\n\n\t$query_args = array();\n\n\tif ( $is_autosave && $saved_post_id ) {\n\t\t$query_args['preview_id'] = $post->ID;\n\t\t$query_args['preview_nonce'] = wp_create_nonce( 'post_preview_' . $post->ID );\n\n\t\tif ( isset( $_POST['post_format'] ) )\n\t\t\t$query_args['post_format'] = empty( $_POST['post_format'] ) ? 'standard' : sanitize_key( $_POST['post_format'] );\n\t}\n\n\treturn get_preview_post_link( $post, $query_args );\n}\n\n/**\n * Save a post submitted with XHR\n *\n * Intended for use with heartbeat and autosave.js\n *\n * @since 3.9.0\n *\n * @param array $post_data Associative array of the submitted post data.\n * @return mixed The value 0 or WP_Error on failure. The saved post ID on success.\n *               Te ID can be the draft post_id or the autosave revision post_id.\n */\nfunction wp_autosave( $post_data ) {\n\t// Back-compat\n\tif ( ! defined( 'DOING_AUTOSAVE' ) )\n\t\tdefine( 'DOING_AUTOSAVE', true );\n\n\t$post_id = (int) $post_data['post_id'];\n\t$post_data['ID'] = $post_data['post_ID'] = $post_id;\n\n\tif ( false === wp_verify_nonce( $post_data['_wpnonce'], 'update-post_' . $post_id ) ) {\n\t\treturn new WP_Error( 'invalid_nonce', __( 'Error while saving.' ) );\n\t}\n\n\t$post = get_post( $post_id );\n\n\tif ( ! current_user_can( 'edit_post', $post->ID ) ) {\n\t\treturn new WP_Error( 'edit_posts', __( 'You are not allowed to edit this item.' ) );\n\t}\n\n\tif ( 'auto-draft' == $post->post_status )\n\t\t$post_data['post_status'] = 'draft';\n\n\tif ( $post_data['post_type'] != 'page' && ! empty( $post_data['catslist'] ) )\n\t\t$post_data['post_category'] = explode( ',', $post_data['catslist'] );\n\n\tif ( ! wp_check_post_lock( $post->ID ) && get_current_user_id() == $post->post_author && ( 'auto-draft' == $post->post_status || 'draft' == $post->post_status ) ) {\n\t\t// Drafts and auto-drafts are just overwritten by autosave for the same user if the post is not locked\n\t\treturn edit_post( wp_slash( $post_data ) );\n\t} else {\n\t\t// Non drafts or other users drafts are not overwritten. The autosave is stored in a special post revision for each user.\n\t\treturn wp_create_post_autosave( wp_slash( $post_data ) );\n\t}\n}\n\n/**\n * Redirect to previous page.\n *\n * @param int $post_id Optional. Post ID.\n */\nfunction redirect_post($post_id = '') {\n\tif ( isset($_POST['save']) || isset($_POST['publish']) ) {\n\t\t$status = get_post_status( $post_id );\n\n\t\tif ( isset( $_POST['publish'] ) ) {\n\t\t\tswitch ( $status ) {\n\t\t\t\tcase 'pending':\n\t\t\t\t\t$message = 8;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'future':\n\t\t\t\t\t$message = 9;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$message = 6;\n\t\t\t}\n\t\t} else {\n\t\t\t$message = 'draft' == $status ? 10 : 1;\n\t\t}\n\n\t\t$location = add_query_arg( 'message', $message, get_edit_post_link( $post_id, 'url' ) );\n\t} elseif ( isset($_POST['addmeta']) && $_POST['addmeta'] ) {\n\t\t$location = add_query_arg( 'message', 2, wp_get_referer() );\n\t\t$location = explode('#', $location);\n\t\t$location = $location[0] . '#postcustom';\n\t} elseif ( isset($_POST['deletemeta']) && $_POST['deletemeta'] ) {\n\t\t$location = add_query_arg( 'message', 3, wp_get_referer() );\n\t\t$location = explode('#', $location);\n\t\t$location = $location[0] . '#postcustom';\n\t} else {\n\t\t$location = add_query_arg( 'message', 4, get_edit_post_link( $post_id, 'url' ) );\n\t}\n\n\t/**\n\t * Filter the post redirect destination URL.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $location The destination URL.\n\t * @param int    $post_id  The post ID.\n\t */\n\twp_redirect( apply_filters( 'redirect_post_location', $location, $post_id ) );\n\texit;\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/revision.php",
    "content": "<?php\n/**\n * WordPress Administration Revisions API\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.6.0\n */\n\n/**\n * Get the revision UI diff.\n *\n * @since 3.6.0\n *\n * @param object|int $post         The post object. Also accepts a post ID.\n * @param int        $compare_from The revision ID to compare from.\n * @param int        $compare_to   The revision ID to come to.\n *\n * @return array|bool Associative array of a post's revisioned fields and their diffs.\n *                    Or, false on failure.\n */\nfunction wp_get_revision_ui_diff( $post, $compare_from, $compare_to ) {\n\tif ( ! $post = get_post( $post ) )\n\t\treturn false;\n\n\tif ( $compare_from ) {\n\t\tif ( ! $compare_from = get_post( $compare_from ) )\n\t\t\treturn false;\n\t} else {\n\t\t// If we're dealing with the first revision...\n\t\t$compare_from = false;\n\t}\n\n\tif ( ! $compare_to = get_post( $compare_to ) )\n\t\treturn false;\n\n\t// If comparing revisions, make sure we're dealing with the right post parent.\n\t// The parent post may be a 'revision' when revisions are disabled and we're looking at autosaves.\n\tif ( $compare_from && $compare_from->post_parent !== $post->ID && $compare_from->ID !== $post->ID )\n\t\treturn false;\n\tif ( $compare_to->post_parent !== $post->ID && $compare_to->ID !== $post->ID )\n\t\treturn false;\n\n\tif ( $compare_from && strtotime( $compare_from->post_date_gmt ) > strtotime( $compare_to->post_date_gmt ) ) {\n\t\t$temp = $compare_from;\n\t\t$compare_from = $compare_to;\n\t\t$compare_to = $temp;\n\t}\n\n\t// Add default title if title field is empty\n\tif ( $compare_from && empty( $compare_from->post_title ) )\n\t\t$compare_from->post_title = __( '(no title)' );\n\tif ( empty( $compare_to->post_title ) )\n\t\t$compare_to->post_title = __( '(no title)' );\n\n\t$return = array();\n\n\tforeach ( _wp_post_revision_fields() as $field => $name ) {\n\t\t/**\n\t\t * Contextually filter a post revision field.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$field`, corresponds to each of the post\n\t\t * fields of the revision object being iterated over in a foreach statement.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param string  $compare_from->$field The current revision field to compare to or from.\n\t\t * @param string  $field                The current revision field.\n\t\t * @param WP_Post $compare_from         The revision post object to compare to or from.\n\t\t * @param string  null                  The context of whether the current revision is the old\n\t\t *                                      or the new one. Values are 'to' or 'from'.\n\t\t */\n\t\t$content_from = $compare_from ? apply_filters( \"_wp_post_revision_field_$field\", $compare_from->$field, $field, $compare_from, 'from' ) : '';\n\n\t\t/** This filter is documented in wp-admin/includes/revision.php */\n\t\t$content_to = apply_filters( \"_wp_post_revision_field_$field\", $compare_to->$field, $field, $compare_to, 'to' );\n\n\t\t$args = array(\n\t\t\t'show_split_view' => true\n\t\t);\n\n\t\t/**\n\t\t * Filter revisions text diff options.\n\t\t *\n\t\t * Filter the options passed to {@see wp_text_diff()} when viewing a post revision.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param array   $args {\n\t\t *     Associative array of options to pass to {@see wp_text_diff()}.\n\t\t *\n\t\t *     @type bool $show_split_view True for split view (two columns), false for\n\t\t *                                 un-split view (single column). Default true.\n\t\t * }\n\t\t * @param string  $field        The current revision field.\n\t\t * @param WP_Post $compare_from The revision post to compare from.\n\t\t * @param WP_Post $compare_to   The revision post to compare to.\n\t\t */\n\t\t$args = apply_filters( 'revision_text_diff_options', $args, $field, $compare_from, $compare_to );\n\n\t\t$diff = wp_text_diff( $content_from, $content_to, $args );\n\n\t\tif ( ! $diff && 'post_title' === $field ) {\n\t\t\t// It's a better user experience to still show the Title, even if it didn't change.\n\t\t\t// No, you didn't see this.\n\t\t\t$diff = '<table class=\"diff\"><colgroup><col class=\"content diffsplit left\"><col class=\"content diffsplit middle\"><col class=\"content diffsplit right\"></colgroup><tbody><tr>';\n\t\t\t$diff .= '<td>' . esc_html( $compare_from->post_title ) . '</td><td></td><td>' . esc_html( $compare_to->post_title ) . '</td>';\n\t\t\t$diff .= '</tr></tbody>';\n\t\t\t$diff .= '</table>';\n\t\t}\n\n\t\tif ( $diff ) {\n\t\t\t$return[] = array(\n\t\t\t\t'id' => $field,\n\t\t\t\t'name' => $name,\n\t\t\t\t'diff' => $diff,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Filter the fields displayed in the post revision diff UI.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param array   $return       Revision UI fields. Each item is an array of id, name and diff.\n\t * @param WP_Post $compare_from The revision post to compare from.\n\t * @param WP_Post $compare_to   The revision post to compare to.\n\t */\n\treturn apply_filters( 'wp_get_revision_ui_diff', $return, $compare_from, $compare_to );\n\n}\n\n/**\n * Prepare revisions for JavaScript.\n *\n * @since 3.6.0\n *\n * @param object|int $post                 The post object. Also accepts a post ID.\n * @param int        $selected_revision_id The selected revision ID.\n * @param int        $from                 Optional. The revision ID to compare from.\n *\n * @return array An associative array of revision data and related settings.\n */\nfunction wp_prepare_revisions_for_js( $post, $selected_revision_id, $from = null ) {\n\t$post = get_post( $post );\n\t$authors = array();\n\t$now_gmt = time();\n\n\t$revisions = wp_get_post_revisions( $post->ID, array( 'order' => 'ASC', 'check_enabled' => false ) );\n\t// If revisions are disabled, we only want autosaves and the current post.\n\tif ( ! wp_revisions_enabled( $post ) ) {\n\t\tforeach ( $revisions as $revision_id => $revision ) {\n\t\t\tif ( ! wp_is_post_autosave( $revision ) )\n\t\t\t\tunset( $revisions[ $revision_id ] );\n\t\t}\n\t\t$revisions = array( $post->ID => $post ) + $revisions;\n\t}\n\n\t$show_avatars = get_option( 'show_avatars' );\n\n\tcache_users( wp_list_pluck( $revisions, 'post_author' ) );\n\n\t$can_restore = current_user_can( 'edit_post', $post->ID );\n\t$current_id = false;\n\n\tforeach ( $revisions as $revision ) {\n\t\t$modified = strtotime( $revision->post_modified );\n\t\t$modified_gmt = strtotime( $revision->post_modified_gmt );\n\t\tif ( $can_restore ) {\n\t\t\t$restore_link = str_replace( '&amp;', '&', wp_nonce_url(\n\t\t\t\tadd_query_arg(\n\t\t\t\t\tarray( 'revision' => $revision->ID,\n\t\t\t\t\t\t'action' => 'restore' ),\n\t\t\t\t\t\tadmin_url( 'revision.php' )\n\t\t\t\t),\n\t\t\t\t\"restore-post_{$revision->ID}\"\n\t\t\t) );\n\t\t}\n\n\t\tif ( ! isset( $authors[ $revision->post_author ] ) ) {\n\t\t\t$authors[ $revision->post_author ] = array(\n\t\t\t\t'id' => (int) $revision->post_author,\n\t\t\t\t'avatar' => $show_avatars ? get_avatar( $revision->post_author, 32 ) : '',\n\t\t\t\t'name' => get_the_author_meta( 'display_name', $revision->post_author ),\n\t\t\t);\n\t\t}\n\n\t\t$autosave = (bool) wp_is_post_autosave( $revision );\n\t\t$current = ! $autosave && $revision->post_modified_gmt === $post->post_modified_gmt;\n\t\tif ( $current && ! empty( $current_id ) ) {\n\t\t\t// If multiple revisions have the same post_modified_gmt, highest ID is current.\n\t\t\tif ( $current_id < $revision->ID ) {\n\t\t\t\t$revisions[ $current_id ]['current'] = false;\n\t\t\t\t$current_id = $revision->ID;\n\t\t\t} else {\n\t\t\t\t$current = false;\n\t\t\t}\n\t\t} elseif ( $current ) {\n\t\t\t$current_id = $revision->ID;\n\t\t}\n\n\t\t$revisions_data = array(\n\t\t\t'id'         => $revision->ID,\n\t\t\t'title'      => get_the_title( $post->ID ),\n\t\t\t'author'     => $authors[ $revision->post_author ],\n\t\t\t'date'       => date_i18n( __( 'M j, Y @ H:i' ), $modified ),\n\t\t\t'dateShort'  => date_i18n( _x( 'j M @ H:i', 'revision date short format' ), $modified ),\n\t\t\t'timeAgo'    => sprintf( __( '%s ago' ), human_time_diff( $modified_gmt, $now_gmt ) ),\n\t\t\t'autosave'   => $autosave,\n\t\t\t'current'    => $current,\n\t\t\t'restoreUrl' => $can_restore ? $restore_link : false,\n\t\t);\n\n\t\t/**\n\t\t * Filter the array of revisions used on the revisions screen.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array   $revisions_data {\n\t\t *     The bootstrapped data for the revisions screen.\n\t\t *\n\t\t *     @type int        $id         Revision ID.\n\t\t *     @type string     $title      Title for the revision's parent WP_Post object.\n\t\t *     @type int        $author     Revision post author ID.\n\t\t *     @type string     $date       Date the revision was modified.\n\t\t *     @type string     $dateShort  Short-form version of the date the revision was modified.\n\t\t *     @type string     $timeAgo    GMT-aware amount of time ago the revision was modified.\n\t\t *     @type bool       $autosave   Whether the revision is an autosave.\n\t\t *     @type bool       $current    Whether the revision is both not an autosave and the post\n\t\t *                                  modified date matches the revision modified date (GMT-aware).\n\t\t *     @type bool|false $restoreUrl URL if the revision can be restored, false otherwise.\n\t\t * }\n\t\t * @param WP_Post $revision       The revision's WP_Post object.\n\t\t * @param WP_Post $post           The revision's parent WP_Post object.\n\t\t */\n\t\t$revisions[ $revision->ID ] = apply_filters( 'wp_prepare_revision_for_js', $revisions_data, $revision, $post );\n\t}\n\n\t/**\n\t * If we only have one revision, the initial revision is missing; This happens\n\t * when we have an autsosave and the user has clicked 'View the Autosave'\n\t */\n\tif ( 1 === sizeof( $revisions ) ) {\n\t\t$revisions[ $post->ID ] = array(\n\t\t\t'id'         => $post->ID,\n\t\t\t'title'      => get_the_title( $post->ID ),\n\t\t\t'author'     => $authors[ $post->post_author ],\n\t\t\t'date'       => date_i18n( __( 'M j, Y @ H:i' ), strtotime( $post->post_modified ) ),\n\t\t\t'dateShort'  => date_i18n( _x( 'j M @ H:i', 'revision date short format' ), strtotime( $post->post_modified ) ),\n\t\t\t'timeAgo'    => sprintf( __( '%s ago' ), human_time_diff( strtotime( $post->post_modified_gmt ), $now_gmt ) ),\n\t\t\t'autosave'   => false,\n\t\t\t'current'    => true,\n\t\t\t'restoreUrl' => false,\n\t\t);\n\t\t$current_id = $post->ID;\n\t}\n\n\t/*\n\t * If a post has been saved since the last revision (no revisioned fields\n\t * were changed), we may not have a \"current\" revision. Mark the latest\n\t * revision as \"current\".\n\t */\n\tif ( empty( $current_id ) ) {\n\t\tif ( $revisions[ $revision->ID ]['autosave'] ) {\n\t\t\t$revision = end( $revisions );\n\t\t\twhile ( $revision['autosave'] ) {\n\t\t\t\t$revision = prev( $revisions );\n\t\t\t}\n\t\t\t$current_id = $revision['id'];\n\t\t} else {\n\t\t\t$current_id = $revision->ID;\n\t\t}\n\t\t$revisions[ $current_id ]['current'] = true;\n\t}\n\n\t// Now, grab the initial diff.\n\t$compare_two_mode = is_numeric( $from );\n\tif ( ! $compare_two_mode ) {\n\t\t$found = array_search( $selected_revision_id, array_keys( $revisions ) );\n\t\tif ( $found ) {\n\t\t\t$from = array_keys( array_slice( $revisions, $found - 1, 1, true ) );\n\t\t\t$from = reset( $from );\n\t\t} else {\n\t\t\t$from = 0;\n\t\t}\n\t}\n\n\t$from = absint( $from );\n\n\t$diffs = array( array(\n\t\t'id' => $from . ':' . $selected_revision_id,\n\t\t'fields' => wp_get_revision_ui_diff( $post->ID, $from, $selected_revision_id ),\n\t));\n\n\treturn array(\n\t\t'postId'           => $post->ID,\n\t\t'nonce'            => wp_create_nonce( 'revisions-ajax-nonce' ),\n\t\t'revisionData'     => array_values( $revisions ),\n\t\t'to'               => $selected_revision_id,\n\t\t'from'             => $from,\n\t\t'diffData'         => $diffs,\n\t\t'baseUrl'          => parse_url( admin_url( 'revision.php' ), PHP_URL_PATH ),\n\t\t'compareTwoMode'   => absint( $compare_two_mode ), // Apparently booleans are not allowed\n\t\t'revisionIds'      => array_keys( $revisions ),\n\t);\n}\n\n/**\n * Print JavaScript templates required for the revisions experience.\n *\n * @since 4.1.0\n *\n * @global WP_Post $post The global `$post` object.\n */\nfunction wp_print_revision_templates() {\n\tglobal $post;\n\t?><script id=\"tmpl-revisions-frame\" type=\"text/html\">\n\t\t<div class=\"revisions-control-frame\"></div>\n\t\t<div class=\"revisions-diff-frame\"></div>\n\t</script>\n\n\t<script id=\"tmpl-revisions-buttons\" type=\"text/html\">\n\t\t<div class=\"revisions-previous\">\n\t\t\t<input class=\"button\" type=\"button\" value=\"<?php echo esc_attr_x( 'Previous', 'Button label for a previous revision' ); ?>\" />\n\t\t</div>\n\n\t\t<div class=\"revisions-next\">\n\t\t\t<input class=\"button\" type=\"button\" value=\"<?php echo esc_attr_x( 'Next', 'Button label for a next revision' ); ?>\" />\n\t\t</div>\n\t</script>\n\n\t<script id=\"tmpl-revisions-checkbox\" type=\"text/html\">\n\t\t<div class=\"revision-toggle-compare-mode\">\n\t\t\t<label>\n\t\t\t\t<input type=\"checkbox\" class=\"compare-two-revisions\"\n\t\t\t\t<#\n\t\t\t\tif ( 'undefined' !== typeof data && data.model.attributes.compareTwoMode ) {\n\t\t\t\t\t#> checked=\"checked\"<#\n\t\t\t\t}\n\t\t\t\t#>\n\t\t\t\t/>\n\t\t\t\t<?php esc_attr_e( 'Compare any two revisions' ); ?>\n\t\t\t</label>\n\t\t</div>\n\t</script>\n\n\t<script id=\"tmpl-revisions-meta\" type=\"text/html\">\n\t\t<# if ( ! _.isUndefined( data.attributes ) ) { #>\n\t\t\t<div class=\"diff-title\">\n\t\t\t\t<# if ( 'from' === data.type ) { #>\n\t\t\t\t\t<strong><?php _ex( 'From:', 'Followed by post revision info' ); ?></strong>\n\t\t\t\t<# } else if ( 'to' === data.type ) { #>\n\t\t\t\t\t<strong><?php _ex( 'To:', 'Followed by post revision info' ); ?></strong>\n\t\t\t\t<# } #>\n\t\t\t\t<div class=\"author-card<# if ( data.attributes.autosave ) { #> autosave<# } #>\">\n\t\t\t\t\t{{{ data.attributes.author.avatar }}}\n\t\t\t\t\t<div class=\"author-info\">\n\t\t\t\t\t<# if ( data.attributes.autosave ) { #>\n\t\t\t\t\t\t<span class=\"byline\"><?php printf( __( 'Autosave by %s' ),\n\t\t\t\t\t\t\t'<span class=\"author-name\">{{ data.attributes.author.name }}</span>' ); ?></span>\n\t\t\t\t\t<# } else if ( data.attributes.current ) { #>\n\t\t\t\t\t\t<span class=\"byline\"><?php printf( __( 'Current Revision by %s' ),\n\t\t\t\t\t\t\t'<span class=\"author-name\">{{ data.attributes.author.name }}</span>' ); ?></span>\n\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t<span class=\"byline\"><?php printf( __( 'Revision by %s' ),\n\t\t\t\t\t\t\t'<span class=\"author-name\">{{ data.attributes.author.name }}</span>' ); ?></span>\n\t\t\t\t\t<# } #>\n\t\t\t\t\t\t<span class=\"time-ago\">{{ data.attributes.timeAgo }}</span>\n\t\t\t\t\t\t<span class=\"date\">({{ data.attributes.dateShort }})</span>\n\t\t\t\t\t</div>\n\t\t\t\t<# if ( 'to' === data.type && data.attributes.restoreUrl ) { #>\n\t\t\t\t\t<input  <?php if ( wp_check_post_lock( $post->ID ) ) { ?>\n\t\t\t\t\t\tdisabled=\"disabled\"\n\t\t\t\t\t<?php } else { ?>\n\t\t\t\t\t\t<# if ( data.attributes.current ) { #>\n\t\t\t\t\t\t\tdisabled=\"disabled\"\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t<?php } ?>\n\t\t\t\t\t<# if ( data.attributes.autosave ) { #>\n\t\t\t\t\t\ttype=\"button\" class=\"restore-revision button button-primary\" value=\"<?php esc_attr_e( 'Restore This Autosave' ); ?>\" />\n\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\ttype=\"button\" class=\"restore-revision button button-primary\" value=\"<?php esc_attr_e( 'Restore This Revision' ); ?>\" />\n\t\t\t\t\t<# } #>\n\t\t\t\t<# } #>\n\t\t\t</div>\n\t\t<# if ( 'tooltip' === data.type ) { #>\n\t\t\t<div class=\"revisions-tooltip-arrow\"><span></span></div>\n\t\t<# } #>\n\t<# } #>\n\t</script>\n\n\t<script id=\"tmpl-revisions-diff\" type=\"text/html\">\n\t\t<div class=\"loading-indicator\"><span class=\"spinner\"></span></div>\n\t\t<div class=\"diff-error\"><?php _e( 'Sorry, something went wrong. The requested comparison could not be loaded.' ); ?></div>\n\t\t<div class=\"diff\">\n\t\t<# _.each( data.fields, function( field ) { #>\n\t\t\t<h3>{{ field.name }}</h3>\n\t\t\t{{{ field.diff }}}\n\t\t<# }); #>\n\t\t</div>\n\t</script><?php\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/schema.php",
    "content": "<?php\n/**\n * WordPress Administration Scheme API\n *\n * Here we keep the DB structure and option values.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Declare these as global in case schema.php is included from a function.\n *\n * @global wpdb   $wpdb\n * @global array  $wp_queries\n * @global string $charset_collate\n */\nglobal $wpdb, $wp_queries, $charset_collate;\n\n/**\n * The database character collate.\n */\n$charset_collate = $wpdb->get_charset_collate();\n\n/**\n * Retrieve the SQL for creating database tables.\n *\n * @since 3.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $scope Optional. The tables for which to retrieve SQL. Can be all, global, ms_global, or blog tables. Defaults to all.\n * @param int $blog_id Optional. The blog ID for which to retrieve SQL. Default is the current blog ID.\n * @return string The SQL needed to create the requested tables.\n */\nfunction wp_get_db_schema( $scope = 'all', $blog_id = null ) {\n\tglobal $wpdb;\n\n\t$charset_collate = '';\n\n\tif ( ! empty($wpdb->charset) )\n\t\t$charset_collate = \"DEFAULT CHARACTER SET $wpdb->charset\";\n\tif ( ! empty($wpdb->collate) )\n\t\t$charset_collate .= \" COLLATE $wpdb->collate\";\n\n\tif ( $blog_id && $blog_id != $wpdb->blogid )\n\t\t$old_blog_id = $wpdb->set_blog_id( $blog_id );\n\n\t// Engage multisite if in the middle of turning it on from network.php.\n\t$is_multisite = is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK );\n\n\t/*\n\t * Indexes have a maximum size of 767 bytes. Historically, we haven't need to be concerned about that.\n\t * As of 4.2, however, we moved to utf8mb4, which uses 4 bytes per character. This means that an index which\n\t * used to have room for floor(767/3) = 255 characters, now only has room for floor(767/4) = 191 characters.\n\t */\n\t$max_index_length = 191;\n\n\t// Blog specific tables.\n\t$blog_tables = \"CREATE TABLE $wpdb->termmeta (\n  meta_id bigint(20) unsigned NOT NULL auto_increment,\n  term_id bigint(20) unsigned NOT NULL default '0',\n  meta_key varchar(255) default NULL,\n  meta_value longtext,\n  PRIMARY KEY  (meta_id),\n  KEY term_id (term_id),\n  KEY meta_key (meta_key($max_index_length))\n) $charset_collate;\nCREATE TABLE $wpdb->terms (\n term_id bigint(20) unsigned NOT NULL auto_increment,\n name varchar(200) NOT NULL default '',\n slug varchar(200) NOT NULL default '',\n term_group bigint(10) NOT NULL default 0,\n PRIMARY KEY  (term_id),\n KEY slug (slug($max_index_length)),\n KEY name (name($max_index_length))\n) $charset_collate;\nCREATE TABLE $wpdb->term_taxonomy (\n term_taxonomy_id bigint(20) unsigned NOT NULL auto_increment,\n term_id bigint(20) unsigned NOT NULL default 0,\n taxonomy varchar(32) NOT NULL default '',\n description longtext NOT NULL,\n parent bigint(20) unsigned NOT NULL default 0,\n count bigint(20) NOT NULL default 0,\n PRIMARY KEY  (term_taxonomy_id),\n UNIQUE KEY term_id_taxonomy (term_id,taxonomy),\n KEY taxonomy (taxonomy)\n) $charset_collate;\nCREATE TABLE $wpdb->term_relationships (\n object_id bigint(20) unsigned NOT NULL default 0,\n term_taxonomy_id bigint(20) unsigned NOT NULL default 0,\n term_order int(11) NOT NULL default 0,\n PRIMARY KEY  (object_id,term_taxonomy_id),\n KEY term_taxonomy_id (term_taxonomy_id)\n) $charset_collate;\nCREATE TABLE $wpdb->commentmeta (\n  meta_id bigint(20) unsigned NOT NULL auto_increment,\n  comment_id bigint(20) unsigned NOT NULL default '0',\n  meta_key varchar(255) default NULL,\n  meta_value longtext,\n  PRIMARY KEY  (meta_id),\n  KEY comment_id (comment_id),\n  KEY meta_key (meta_key($max_index_length))\n) $charset_collate;\nCREATE TABLE $wpdb->comments (\n  comment_ID bigint(20) unsigned NOT NULL auto_increment,\n  comment_post_ID bigint(20) unsigned NOT NULL default '0',\n  comment_author tinytext NOT NULL,\n  comment_author_email varchar(100) NOT NULL default '',\n  comment_author_url varchar(200) NOT NULL default '',\n  comment_author_IP varchar(100) NOT NULL default '',\n  comment_date datetime NOT NULL default '0000-00-00 00:00:00',\n  comment_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',\n  comment_content text NOT NULL,\n  comment_karma int(11) NOT NULL default '0',\n  comment_approved varchar(20) NOT NULL default '1',\n  comment_agent varchar(255) NOT NULL default '',\n  comment_type varchar(20) NOT NULL default '',\n  comment_parent bigint(20) unsigned NOT NULL default '0',\n  user_id bigint(20) unsigned NOT NULL default '0',\n  PRIMARY KEY  (comment_ID),\n  KEY comment_post_ID (comment_post_ID),\n  KEY comment_approved_date_gmt (comment_approved,comment_date_gmt),\n  KEY comment_date_gmt (comment_date_gmt),\n  KEY comment_parent (comment_parent),\n  KEY comment_author_email (comment_author_email(10))\n) $charset_collate;\nCREATE TABLE $wpdb->links (\n  link_id bigint(20) unsigned NOT NULL auto_increment,\n  link_url varchar(255) NOT NULL default '',\n  link_name varchar(255) NOT NULL default '',\n  link_image varchar(255) NOT NULL default '',\n  link_target varchar(25) NOT NULL default '',\n  link_description varchar(255) NOT NULL default '',\n  link_visible varchar(20) NOT NULL default 'Y',\n  link_owner bigint(20) unsigned NOT NULL default '1',\n  link_rating int(11) NOT NULL default '0',\n  link_updated datetime NOT NULL default '0000-00-00 00:00:00',\n  link_rel varchar(255) NOT NULL default '',\n  link_notes mediumtext NOT NULL,\n  link_rss varchar(255) NOT NULL default '',\n  PRIMARY KEY  (link_id),\n  KEY link_visible (link_visible)\n) $charset_collate;\nCREATE TABLE $wpdb->options (\n  option_id bigint(20) unsigned NOT NULL auto_increment,\n  option_name varchar(191) NOT NULL default '',\n  option_value longtext NOT NULL,\n  autoload varchar(20) NOT NULL default 'yes',\n  PRIMARY KEY  (option_id),\n  UNIQUE KEY option_name (option_name)\n) $charset_collate;\nCREATE TABLE $wpdb->postmeta (\n  meta_id bigint(20) unsigned NOT NULL auto_increment,\n  post_id bigint(20) unsigned NOT NULL default '0',\n  meta_key varchar(255) default NULL,\n  meta_value longtext,\n  PRIMARY KEY  (meta_id),\n  KEY post_id (post_id),\n  KEY meta_key (meta_key($max_index_length))\n) $charset_collate;\nCREATE TABLE $wpdb->posts (\n  ID bigint(20) unsigned NOT NULL auto_increment,\n  post_author bigint(20) unsigned NOT NULL default '0',\n  post_date datetime NOT NULL default '0000-00-00 00:00:00',\n  post_date_gmt datetime NOT NULL default '0000-00-00 00:00:00',\n  post_content longtext NOT NULL,\n  post_title text NOT NULL,\n  post_excerpt text NOT NULL,\n  post_status varchar(20) NOT NULL default 'publish',\n  comment_status varchar(20) NOT NULL default 'open',\n  ping_status varchar(20) NOT NULL default 'open',\n  post_password varchar(20) NOT NULL default '',\n  post_name varchar(200) NOT NULL default '',\n  to_ping text NOT NULL,\n  pinged text NOT NULL,\n  post_modified datetime NOT NULL default '0000-00-00 00:00:00',\n  post_modified_gmt datetime NOT NULL default '0000-00-00 00:00:00',\n  post_content_filtered longtext NOT NULL,\n  post_parent bigint(20) unsigned NOT NULL default '0',\n  guid varchar(255) NOT NULL default '',\n  menu_order int(11) NOT NULL default '0',\n  post_type varchar(20) NOT NULL default 'post',\n  post_mime_type varchar(100) NOT NULL default '',\n  comment_count bigint(20) NOT NULL default '0',\n  PRIMARY KEY  (ID),\n  KEY post_name (post_name($max_index_length)),\n  KEY type_status_date (post_type,post_status,post_date,ID),\n  KEY post_parent (post_parent),\n  KEY post_author (post_author)\n) $charset_collate;\\n\";\n\n\t// Single site users table. The multisite flavor of the users table is handled below.\n\t$users_single_table = \"CREATE TABLE $wpdb->users (\n  ID bigint(20) unsigned NOT NULL auto_increment,\n  user_login varchar(60) NOT NULL default '',\n  user_pass varchar(255) NOT NULL default '',\n  user_nicename varchar(50) NOT NULL default '',\n  user_email varchar(100) NOT NULL default '',\n  user_url varchar(100) NOT NULL default '',\n  user_registered datetime NOT NULL default '0000-00-00 00:00:00',\n  user_activation_key varchar(255) NOT NULL default '',\n  user_status int(11) NOT NULL default '0',\n  display_name varchar(250) NOT NULL default '',\n  PRIMARY KEY  (ID),\n  KEY user_login_key (user_login),\n  KEY user_nicename (user_nicename)\n) $charset_collate;\\n\";\n\n\t// Multisite users table\n\t$users_multi_table = \"CREATE TABLE $wpdb->users (\n  ID bigint(20) unsigned NOT NULL auto_increment,\n  user_login varchar(60) NOT NULL default '',\n  user_pass varchar(255) NOT NULL default '',\n  user_nicename varchar(50) NOT NULL default '',\n  user_email varchar(100) NOT NULL default '',\n  user_url varchar(100) NOT NULL default '',\n  user_registered datetime NOT NULL default '0000-00-00 00:00:00',\n  user_activation_key varchar(255) NOT NULL default '',\n  user_status int(11) NOT NULL default '0',\n  display_name varchar(250) NOT NULL default '',\n  spam tinyint(2) NOT NULL default '0',\n  deleted tinyint(2) NOT NULL default '0',\n  PRIMARY KEY  (ID),\n  KEY user_login_key (user_login),\n  KEY user_nicename (user_nicename)\n) $charset_collate;\\n\";\n\n\t// Usermeta.\n\t$usermeta_table = \"CREATE TABLE $wpdb->usermeta (\n  umeta_id bigint(20) unsigned NOT NULL auto_increment,\n  user_id bigint(20) unsigned NOT NULL default '0',\n  meta_key varchar(255) default NULL,\n  meta_value longtext,\n  PRIMARY KEY  (umeta_id),\n  KEY user_id (user_id),\n  KEY meta_key (meta_key($max_index_length))\n) $charset_collate;\\n\";\n\n\t// Global tables\n\tif ( $is_multisite )\n\t\t$global_tables = $users_multi_table . $usermeta_table;\n\telse\n\t\t$global_tables = $users_single_table . $usermeta_table;\n\n\t// Multisite global tables.\n\t$ms_global_tables = \"CREATE TABLE $wpdb->blogs (\n  blog_id bigint(20) NOT NULL auto_increment,\n  site_id bigint(20) NOT NULL default '0',\n  domain varchar(200) NOT NULL default '',\n  path varchar(100) NOT NULL default '',\n  registered datetime NOT NULL default '0000-00-00 00:00:00',\n  last_updated datetime NOT NULL default '0000-00-00 00:00:00',\n  public tinyint(2) NOT NULL default '1',\n  archived tinyint(2) NOT NULL default '0',\n  mature tinyint(2) NOT NULL default '0',\n  spam tinyint(2) NOT NULL default '0',\n  deleted tinyint(2) NOT NULL default '0',\n  lang_id int(11) NOT NULL default '0',\n  PRIMARY KEY  (blog_id),\n  KEY domain (domain(50),path(5)),\n  KEY lang_id (lang_id)\n) $charset_collate;\nCREATE TABLE $wpdb->blog_versions (\n  blog_id bigint(20) NOT NULL default '0',\n  db_version varchar(20) NOT NULL default '',\n  last_updated datetime NOT NULL default '0000-00-00 00:00:00',\n  PRIMARY KEY  (blog_id),\n  KEY db_version (db_version)\n) $charset_collate;\nCREATE TABLE $wpdb->registration_log (\n  ID bigint(20) NOT NULL auto_increment,\n  email varchar(255) NOT NULL default '',\n  IP varchar(30) NOT NULL default '',\n  blog_id bigint(20) NOT NULL default '0',\n  date_registered datetime NOT NULL default '0000-00-00 00:00:00',\n  PRIMARY KEY  (ID),\n  KEY IP (IP)\n) $charset_collate;\nCREATE TABLE $wpdb->site (\n  id bigint(20) NOT NULL auto_increment,\n  domain varchar(200) NOT NULL default '',\n  path varchar(100) NOT NULL default '',\n  PRIMARY KEY  (id),\n  KEY domain (domain(140),path(51))\n) $charset_collate;\nCREATE TABLE $wpdb->sitemeta (\n  meta_id bigint(20) NOT NULL auto_increment,\n  site_id bigint(20) NOT NULL default '0',\n  meta_key varchar(255) default NULL,\n  meta_value longtext,\n  PRIMARY KEY  (meta_id),\n  KEY meta_key (meta_key($max_index_length)),\n  KEY site_id (site_id)\n) $charset_collate;\nCREATE TABLE $wpdb->signups (\n  signup_id bigint(20) NOT NULL auto_increment,\n  domain varchar(200) NOT NULL default '',\n  path varchar(100) NOT NULL default '',\n  title longtext NOT NULL,\n  user_login varchar(60) NOT NULL default '',\n  user_email varchar(100) NOT NULL default '',\n  registered datetime NOT NULL default '0000-00-00 00:00:00',\n  activated datetime NOT NULL default '0000-00-00 00:00:00',\n  active tinyint(1) NOT NULL default '0',\n  activation_key varchar(50) NOT NULL default '',\n  meta longtext,\n  PRIMARY KEY  (signup_id),\n  KEY activation_key (activation_key),\n  KEY user_email (user_email),\n  KEY user_login_email (user_login,user_email),\n  KEY domain_path (domain(140),path(51))\n) $charset_collate;\";\n\n\tswitch ( $scope ) {\n\t\tcase 'blog' :\n\t\t\t$queries = $blog_tables;\n\t\t\tbreak;\n\t\tcase 'global' :\n\t\t\t$queries = $global_tables;\n\t\t\tif ( $is_multisite )\n\t\t\t\t$queries .= $ms_global_tables;\n\t\t\tbreak;\n\t\tcase 'ms_global' :\n\t\t\t$queries = $ms_global_tables;\n\t\t\tbreak;\n\t\tcase 'all' :\n\t\tdefault:\n\t\t\t$queries = $global_tables . $blog_tables;\n\t\t\tif ( $is_multisite )\n\t\t\t\t$queries .= $ms_global_tables;\n\t\t\tbreak;\n\t}\n\n\tif ( isset( $old_blog_id ) )\n\t\t$wpdb->set_blog_id( $old_blog_id );\n\n\treturn $queries;\n}\n\n// Populate for back compat.\n$wp_queries = wp_get_db_schema( 'all' );\n\n/**\n * Create WordPress options and set the default values.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @global int  $wp_db_version\n * @global int  $wp_current_db_version\n */\nfunction populate_options() {\n\tglobal $wpdb, $wp_db_version, $wp_current_db_version;\n\n\t$guessurl = wp_guess_url();\n\t/**\n\t * Fires before creating WordPress options and populating their default values.\n\t *\n\t * @since 2.6.0\n\t */\n\tdo_action( 'populate_options' );\n\n\tif ( ini_get('safe_mode') ) {\n\t\t// Safe mode can break mkdir() so use a flat structure by default.\n\t\t$uploads_use_yearmonth_folders = 0;\n\t} else {\n\t\t$uploads_use_yearmonth_folders = 1;\n\t}\n\n\t// If WP_DEFAULT_THEME doesn't exist, fall back to the latest core default theme.\n\t$stylesheet = $template = WP_DEFAULT_THEME;\n\t$theme = wp_get_theme( WP_DEFAULT_THEME );\n\tif ( ! $theme->exists() ) {\n\t\t$theme = WP_Theme::get_core_default_theme();\n\t}\n\n\t// If we can't find a core default theme, WP_DEFAULT_THEME is the best we can do.\n\tif ( $theme ) {\n\t\t$stylesheet = $theme->get_stylesheet();\n\t\t$template   = $theme->get_template();\n\t}\n\n\t$timezone_string = '';\n\t$gmt_offset = 0;\n\t/* translators: default GMT offset or timezone string. Must be either a valid offset (-12 to 14)\n\t   or a valid timezone string (America/New_York). See http://us3.php.net/manual/en/timezones.php\n\t   for all timezone strings supported by PHP.\n\t*/\n\t$offset_or_tz = _x( '0', 'default GMT offset or timezone string' );\n\tif ( is_numeric( $offset_or_tz ) )\n\t\t$gmt_offset = $offset_or_tz;\n\telseif ( $offset_or_tz && in_array( $offset_or_tz, timezone_identifiers_list() ) )\n\t\t\t$timezone_string = $offset_or_tz;\n\n\t$options = array(\n\t'siteurl' => $guessurl,\n\t'home' => $guessurl,\n\t'blogname' => __('My Site'),\n\t/* translators: blog tagline */\n\t'blogdescription' => __('Just another WordPress site'),\n\t'users_can_register' => 0,\n\t'admin_email' => 'you@example.com',\n\t/* translators: default start of the week. 0 = Sunday, 1 = Monday */\n\t'start_of_week' => _x( '1', 'start of week' ),\n\t'use_balanceTags' => 0,\n\t'use_smilies' => 1,\n\t'require_name_email' => 1,\n\t'comments_notify' => 1,\n\t'posts_per_rss' => 10,\n\t'rss_use_excerpt' => 0,\n\t'mailserver_url' => 'mail.example.com',\n\t'mailserver_login' => 'login@example.com',\n\t'mailserver_pass' => 'password',\n\t'mailserver_port' => 110,\n\t'default_category' => 1,\n\t'default_comment_status' => 'open',\n\t'default_ping_status' => 'open',\n\t'default_pingback_flag' => 1,\n\t'posts_per_page' => 10,\n\t/* translators: default date format, see http://php.net/date */\n\t'date_format' => __('F j, Y'),\n\t/* translators: default time format, see http://php.net/date */\n\t'time_format' => __('g:i a'),\n\t/* translators: links last updated date format, see http://php.net/date */\n\t'links_updated_date_format' => __('F j, Y g:i a'),\n\t'comment_moderation' => 0,\n\t'moderation_notify' => 1,\n\t'permalink_structure' => '',\n\t'hack_file' => 0,\n\t'blog_charset' => 'UTF-8',\n\t'moderation_keys' => '',\n\t'active_plugins' => array(),\n\t'category_base' => '',\n\t'ping_sites' => 'http://rpc.pingomatic.com/',\n\t'comment_max_links' => 2,\n\t'gmt_offset' => $gmt_offset,\n\n\t// 1.5\n\t'default_email_category' => 1,\n\t'recently_edited' => '',\n\t'template' => $template,\n\t'stylesheet' => $stylesheet,\n\t'comment_whitelist' => 1,\n\t'blacklist_keys' => '',\n\t'comment_registration' => 0,\n\t'html_type' => 'text/html',\n\n\t// 1.5.1\n\t'use_trackback' => 0,\n\n\t// 2.0\n\t'default_role' => 'subscriber',\n\t'db_version' => $wp_db_version,\n\n\t// 2.0.1\n\t'uploads_use_yearmonth_folders' => $uploads_use_yearmonth_folders,\n\t'upload_path' => '',\n\n\t// 2.1\n\t'blog_public' => '1',\n\t'default_link_category' => 2,\n\t'show_on_front' => 'posts',\n\n\t// 2.2\n\t'tag_base' => '',\n\n\t// 2.5\n\t'show_avatars' => '1',\n\t'avatar_rating' => 'G',\n\t'upload_url_path' => '',\n\t'thumbnail_size_w' => 150,\n\t'thumbnail_size_h' => 150,\n\t'thumbnail_crop' => 1,\n\t'medium_size_w' => 300,\n\t'medium_size_h' => 300,\n\n\t// 2.6\n\t'avatar_default' => 'mystery',\n\n\t// 2.7\n\t'large_size_w' => 1024,\n\t'large_size_h' => 1024,\n\t'image_default_link_type' => 'none',\n\t'image_default_size' => '',\n\t'image_default_align' => '',\n\t'close_comments_for_old_posts' => 0,\n\t'close_comments_days_old' => 14,\n\t'thread_comments' => 1,\n\t'thread_comments_depth' => 5,\n\t'page_comments' => 0,\n\t'comments_per_page' => 50,\n\t'default_comments_page' => 'newest',\n\t'comment_order' => 'asc',\n\t'sticky_posts' => array(),\n\t'widget_categories' => array(),\n\t'widget_text' => array(),\n\t'widget_rss' => array(),\n\t'uninstall_plugins' => array(),\n\n\t// 2.8\n\t'timezone_string' => $timezone_string,\n\n\t// 3.0\n\t'page_for_posts' => 0,\n\t'page_on_front' => 0,\n\n\t// 3.1\n\t'default_post_format' => 0,\n\n\t// 3.5\n\t'link_manager_enabled' => 0,\n\n\t// 4.3.0\n\t'finished_splitting_shared_terms' => 1,\n\t'site_icon' => 0,\n\n\t// 4.4.0\n\t'medium_large_size_w' => 768,\n\t'medium_large_size_h' => 0,\n\t);\n\n\t// 3.3\n\tif ( ! is_multisite() ) {\n\t\t$options['initial_db_version'] = ! empty( $wp_current_db_version ) && $wp_current_db_version < $wp_db_version\n\t\t\t? $wp_current_db_version : $wp_db_version;\n\t}\n\n\t// 3.0 multisite\n\tif ( is_multisite() ) {\n\t\t/* translators: blog tagline */\n\t\t$options[ 'blogdescription' ] = sprintf(__('Just another %s site'), get_current_site()->site_name );\n\t\t$options[ 'permalink_structure' ] = '/%year%/%monthnum%/%day%/%postname%/';\n\t}\n\n\t// Set autoload to no for these options\n\t$fat_options = array( 'moderation_keys', 'recently_edited', 'blacklist_keys', 'uninstall_plugins' );\n\n\t$keys = \"'\" . implode( \"', '\", array_keys( $options ) ) . \"'\";\n\t$existing_options = $wpdb->get_col( \"SELECT option_name FROM $wpdb->options WHERE option_name in ( $keys )\" );\n\n\t$insert = '';\n\tforeach ( $options as $option => $value ) {\n\t\tif ( in_array($option, $existing_options) )\n\t\t\tcontinue;\n\t\tif ( in_array($option, $fat_options) )\n\t\t\t$autoload = 'no';\n\t\telse\n\t\t\t$autoload = 'yes';\n\n\t\tif ( is_array($value) )\n\t\t\t$value = serialize($value);\n\t\tif ( !empty($insert) )\n\t\t\t$insert .= ', ';\n\t\t$insert .= $wpdb->prepare( \"(%s, %s, %s)\", $option, $value, $autoload );\n\t}\n\n\tif ( !empty($insert) )\n\t\t$wpdb->query(\"INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES \" . $insert);\n\n\t// In case it is set, but blank, update \"home\".\n\tif ( !__get_option('home') ) update_option('home', $guessurl);\n\n\t// Delete unused options.\n\t$unusedoptions = array(\n\t\t'blodotgsping_url', 'bodyterminator', 'emailtestonly', 'phoneemail_separator', 'smilies_directory',\n\t\t'subjectprefix', 'use_bbcode', 'use_blodotgsping', 'use_phoneemail', 'use_quicktags', 'use_weblogsping',\n\t\t'weblogs_cache_file', 'use_preview', 'use_htmltrans', 'smilies_directory', 'fileupload_allowedusers',\n\t\t'use_phoneemail', 'default_post_status', 'default_post_category', 'archive_mode', 'time_difference',\n\t\t'links_minadminlevel', 'links_use_adminlevels', 'links_rating_type', 'links_rating_char',\n\t\t'links_rating_ignore_zero', 'links_rating_single_image', 'links_rating_image0', 'links_rating_image1',\n\t\t'links_rating_image2', 'links_rating_image3', 'links_rating_image4', 'links_rating_image5',\n\t\t'links_rating_image6', 'links_rating_image7', 'links_rating_image8', 'links_rating_image9',\n\t\t'links_recently_updated_time', 'links_recently_updated_prepend', 'links_recently_updated_append',\n\t\t'weblogs_cacheminutes', 'comment_allowed_tags', 'search_engine_friendly_urls', 'default_geourl_lat',\n\t\t'default_geourl_lon', 'use_default_geourl', 'weblogs_xml_url', 'new_users_can_blog', '_wpnonce',\n\t\t'_wp_http_referer', 'Update', 'action', 'rich_editing', 'autosave_interval', 'deactivated_plugins',\n\t\t'can_compress_scripts', 'page_uris', 'update_core', 'update_plugins', 'update_themes', 'doing_cron',\n\t\t'random_seed', 'rss_excerpt_length', 'secret', 'use_linksupdate', 'default_comment_status_page',\n\t\t'wporg_popular_tags', 'what_to_show', 'rss_language', 'language', 'enable_xmlrpc', 'enable_app',\n\t\t'embed_autourls', 'default_post_edit_rows', 'gzipcompression', 'advanced_edit'\n\t);\n\tforeach ( $unusedoptions as $option )\n\t\tdelete_option($option);\n\n\t// Delete obsolete magpie stuff.\n\t$wpdb->query(\"DELETE FROM $wpdb->options WHERE option_name REGEXP '^rss_[0-9a-f]{32}(_ts)?$'\");\n\n\t/*\n\t * Deletes all expired transients. The multi-table delete syntax is used\n\t * to delete the transient record from table a, and the corresponding\n\t * transient_timeout record from table b.\n\t */\n\t$time = time();\n\t$sql = \"DELETE a, b FROM $wpdb->options a, $wpdb->options b\n\t\tWHERE a.option_name LIKE %s\n\t\tAND a.option_name NOT LIKE %s\n\t\tAND b.option_name = CONCAT( '_transient_timeout_', SUBSTRING( a.option_name, 12 ) )\n\t\tAND b.option_value < %d\";\n\t$wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_transient_' ) . '%', $wpdb->esc_like( '_transient_timeout_' ) . '%', $time ) );\n\n\tif ( is_main_site() && is_main_network() ) {\n\t\t$sql = \"DELETE a, b FROM $wpdb->options a, $wpdb->options b\n\t\t\tWHERE a.option_name LIKE %s\n\t\t\tAND a.option_name NOT LIKE %s\n\t\t\tAND b.option_name = CONCAT( '_site_transient_timeout_', SUBSTRING( a.option_name, 17 ) )\n\t\t\tAND b.option_value < %d\";\n\t\t$wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_site_transient_' ) . '%', $wpdb->esc_like( '_site_transient_timeout_' ) . '%', $time ) );\n\t}\n}\n\n/**\n * Execute WordPress role creation for the various WordPress versions.\n *\n * @since 2.0.0\n */\nfunction populate_roles() {\n\tpopulate_roles_160();\n\tpopulate_roles_210();\n\tpopulate_roles_230();\n\tpopulate_roles_250();\n\tpopulate_roles_260();\n\tpopulate_roles_270();\n\tpopulate_roles_280();\n\tpopulate_roles_300();\n}\n\n/**\n * Create the roles for WordPress 2.0\n *\n * @since 2.0.0\n */\nfunction populate_roles_160() {\n\t// Add roles\n\n\t// Dummy gettext calls to get strings in the catalog.\n\t/* translators: user role */\n\t_x('Administrator', 'User role');\n\t/* translators: user role */\n\t_x('Editor', 'User role');\n\t/* translators: user role */\n\t_x('Author', 'User role');\n\t/* translators: user role */\n\t_x('Contributor', 'User role');\n\t/* translators: user role */\n\t_x('Subscriber', 'User role');\n\n\tadd_role('administrator', 'Administrator');\n\tadd_role('editor', 'Editor');\n\tadd_role('author', 'Author');\n\tadd_role('contributor', 'Contributor');\n\tadd_role('subscriber', 'Subscriber');\n\n\t// Add caps for Administrator role\n\t$role = get_role('administrator');\n\t$role->add_cap('switch_themes');\n\t$role->add_cap('edit_themes');\n\t$role->add_cap('activate_plugins');\n\t$role->add_cap('edit_plugins');\n\t$role->add_cap('edit_users');\n\t$role->add_cap('edit_files');\n\t$role->add_cap('manage_options');\n\t$role->add_cap('moderate_comments');\n\t$role->add_cap('manage_categories');\n\t$role->add_cap('manage_links');\n\t$role->add_cap('upload_files');\n\t$role->add_cap('import');\n\t$role->add_cap('unfiltered_html');\n\t$role->add_cap('edit_posts');\n\t$role->add_cap('edit_others_posts');\n\t$role->add_cap('edit_published_posts');\n\t$role->add_cap('publish_posts');\n\t$role->add_cap('edit_pages');\n\t$role->add_cap('read');\n\t$role->add_cap('level_10');\n\t$role->add_cap('level_9');\n\t$role->add_cap('level_8');\n\t$role->add_cap('level_7');\n\t$role->add_cap('level_6');\n\t$role->add_cap('level_5');\n\t$role->add_cap('level_4');\n\t$role->add_cap('level_3');\n\t$role->add_cap('level_2');\n\t$role->add_cap('level_1');\n\t$role->add_cap('level_0');\n\n\t// Add caps for Editor role\n\t$role = get_role('editor');\n\t$role->add_cap('moderate_comments');\n\t$role->add_cap('manage_categories');\n\t$role->add_cap('manage_links');\n\t$role->add_cap('upload_files');\n\t$role->add_cap('unfiltered_html');\n\t$role->add_cap('edit_posts');\n\t$role->add_cap('edit_others_posts');\n\t$role->add_cap('edit_published_posts');\n\t$role->add_cap('publish_posts');\n\t$role->add_cap('edit_pages');\n\t$role->add_cap('read');\n\t$role->add_cap('level_7');\n\t$role->add_cap('level_6');\n\t$role->add_cap('level_5');\n\t$role->add_cap('level_4');\n\t$role->add_cap('level_3');\n\t$role->add_cap('level_2');\n\t$role->add_cap('level_1');\n\t$role->add_cap('level_0');\n\n\t// Add caps for Author role\n\t$role = get_role('author');\n\t$role->add_cap('upload_files');\n\t$role->add_cap('edit_posts');\n\t$role->add_cap('edit_published_posts');\n\t$role->add_cap('publish_posts');\n\t$role->add_cap('read');\n\t$role->add_cap('level_2');\n\t$role->add_cap('level_1');\n\t$role->add_cap('level_0');\n\n\t// Add caps for Contributor role\n\t$role = get_role('contributor');\n\t$role->add_cap('edit_posts');\n\t$role->add_cap('read');\n\t$role->add_cap('level_1');\n\t$role->add_cap('level_0');\n\n\t// Add caps for Subscriber role\n\t$role = get_role('subscriber');\n\t$role->add_cap('read');\n\t$role->add_cap('level_0');\n}\n\n/**\n * Create and modify WordPress roles for WordPress 2.1.\n *\n * @since 2.1.0\n */\nfunction populate_roles_210() {\n\t$roles = array('administrator', 'editor');\n\tforeach ($roles as $role) {\n\t\t$role = get_role($role);\n\t\tif ( empty($role) )\n\t\t\tcontinue;\n\n\t\t$role->add_cap('edit_others_pages');\n\t\t$role->add_cap('edit_published_pages');\n\t\t$role->add_cap('publish_pages');\n\t\t$role->add_cap('delete_pages');\n\t\t$role->add_cap('delete_others_pages');\n\t\t$role->add_cap('delete_published_pages');\n\t\t$role->add_cap('delete_posts');\n\t\t$role->add_cap('delete_others_posts');\n\t\t$role->add_cap('delete_published_posts');\n\t\t$role->add_cap('delete_private_posts');\n\t\t$role->add_cap('edit_private_posts');\n\t\t$role->add_cap('read_private_posts');\n\t\t$role->add_cap('delete_private_pages');\n\t\t$role->add_cap('edit_private_pages');\n\t\t$role->add_cap('read_private_pages');\n\t}\n\n\t$role = get_role('administrator');\n\tif ( ! empty($role) ) {\n\t\t$role->add_cap('delete_users');\n\t\t$role->add_cap('create_users');\n\t}\n\n\t$role = get_role('author');\n\tif ( ! empty($role) ) {\n\t\t$role->add_cap('delete_posts');\n\t\t$role->add_cap('delete_published_posts');\n\t}\n\n\t$role = get_role('contributor');\n\tif ( ! empty($role) ) {\n\t\t$role->add_cap('delete_posts');\n\t}\n}\n\n/**\n * Create and modify WordPress roles for WordPress 2.3.\n *\n * @since 2.3.0\n */\nfunction populate_roles_230() {\n\t$role = get_role( 'administrator' );\n\n\tif ( !empty( $role ) ) {\n\t\t$role->add_cap( 'unfiltered_upload' );\n\t}\n}\n\n/**\n * Create and modify WordPress roles for WordPress 2.5.\n *\n * @since 2.5.0\n */\nfunction populate_roles_250() {\n\t$role = get_role( 'administrator' );\n\n\tif ( !empty( $role ) ) {\n\t\t$role->add_cap( 'edit_dashboard' );\n\t}\n}\n\n/**\n * Create and modify WordPress roles for WordPress 2.6.\n *\n * @since 2.6.0\n */\nfunction populate_roles_260() {\n\t$role = get_role( 'administrator' );\n\n\tif ( !empty( $role ) ) {\n\t\t$role->add_cap( 'update_plugins' );\n\t\t$role->add_cap( 'delete_plugins' );\n\t}\n}\n\n/**\n * Create and modify WordPress roles for WordPress 2.7.\n *\n * @since 2.7.0\n */\nfunction populate_roles_270() {\n\t$role = get_role( 'administrator' );\n\n\tif ( !empty( $role ) ) {\n\t\t$role->add_cap( 'install_plugins' );\n\t\t$role->add_cap( 'update_themes' );\n\t}\n}\n\n/**\n * Create and modify WordPress roles for WordPress 2.8.\n *\n * @since 2.8.0\n */\nfunction populate_roles_280() {\n\t$role = get_role( 'administrator' );\n\n\tif ( !empty( $role ) ) {\n\t\t$role->add_cap( 'install_themes' );\n\t}\n}\n\n/**\n * Create and modify WordPress roles for WordPress 3.0.\n *\n * @since 3.0.0\n */\nfunction populate_roles_300() {\n\t$role = get_role( 'administrator' );\n\n\tif ( !empty( $role ) ) {\n\t\t$role->add_cap( 'update_core' );\n\t\t$role->add_cap( 'list_users' );\n\t\t$role->add_cap( 'remove_users' );\n\t\t$role->add_cap( 'promote_users' );\n\t\t$role->add_cap( 'edit_theme_options' );\n\t\t$role->add_cap( 'delete_themes' );\n\t\t$role->add_cap( 'export' );\n\t}\n}\n\n/**\n * Install Network.\n *\n * @since 3.0.0\n *\n */\nif ( !function_exists( 'install_network' ) ) :\nfunction install_network() {\n\tif ( ! defined( 'WP_INSTALLING_NETWORK' ) )\n\t\tdefine( 'WP_INSTALLING_NETWORK', true );\n\n\tdbDelta( wp_get_db_schema( 'global' ) );\n}\nendif;\n\n/**\n * Populate network settings.\n *\n * @since 3.0.0\n *\n * @global wpdb       $wpdb\n * @global object     $current_site\n * @global int        $wp_db_version\n * @global WP_Rewrite $wp_rewrite\n *\n * @param int $network_id ID of network to populate.\n * @return bool|WP_Error True on success, or WP_Error on warning (with the install otherwise successful,\n *                       so the error code must be checked) or failure.\n */\nfunction populate_network( $network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false ) {\n\tglobal $wpdb, $current_site, $wp_db_version, $wp_rewrite;\n\n\t$errors = new WP_Error();\n\tif ( '' == $domain )\n\t\t$errors->add( 'empty_domain', __( 'You must provide a domain name.' ) );\n\tif ( '' == $site_name )\n\t\t$errors->add( 'empty_sitename', __( 'You must provide a name for your network of sites.' ) );\n\n\t// Check for network collision.\n\tif ( $network_id == $wpdb->get_var( $wpdb->prepare( \"SELECT id FROM $wpdb->site WHERE id = %d\", $network_id ) ) )\n\t\t$errors->add( 'siteid_exists', __( 'The network already exists.' ) );\n\n\tif ( ! is_email( $email ) )\n\t\t$errors->add( 'invalid_email', __( 'You must provide a valid email address.' ) );\n\n\tif ( $errors->get_error_code() )\n\t\treturn $errors;\n\n\t// If a user with the provided email does not exist, default to the current user as the new network admin.\n\t$site_user = get_user_by( 'email', $email );\n\tif ( false === $site_user ) {\n\t\t$site_user = wp_get_current_user();\n\t}\n\n\t// Set up site tables.\n\t$template = get_option( 'template' );\n\t$stylesheet = get_option( 'stylesheet' );\n\t$allowed_themes = array( $stylesheet => true );\n\n\tif ( $template != $stylesheet ) {\n\t\t$allowed_themes[ $template ] = true;\n\t}\n\n\tif ( WP_DEFAULT_THEME != $stylesheet && WP_DEFAULT_THEME != $template ) {\n\t\t$allowed_themes[ WP_DEFAULT_THEME ] = true;\n\t}\n\n\t// If WP_DEFAULT_THEME doesn't exist, also whitelist the latest core default theme.\n\tif ( ! wp_get_theme( WP_DEFAULT_THEME )->exists() ) {\n\t\tif ( $core_default = WP_Theme::get_core_default_theme() ) {\n\t\t\t$allowed_themes[ $core_default->get_stylesheet() ] = true;\n\t\t}\n\t}\n\n\tif ( 1 == $network_id ) {\n\t\t$wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path ) );\n\t\t$network_id = $wpdb->insert_id;\n\t} else {\n\t\t$wpdb->insert( $wpdb->site, array( 'domain' => $domain, 'path' => $path, 'id' => $network_id ) );\n\t}\n\n\twp_cache_delete( 'networks_have_paths', 'site-options' );\n\n\tif ( !is_multisite() ) {\n\t\t$site_admins = array( $site_user->user_login );\n\t\t$users = get_users( array( 'fields' => array( 'ID', 'user_login' ) ) );\n\t\tif ( $users ) {\n\t\t\tforeach ( $users as $user ) {\n\t\t\t\tif ( is_super_admin( $user->ID ) && !in_array( $user->user_login, $site_admins ) )\n\t\t\t\t\t$site_admins[] = $user->user_login;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t$site_admins = get_site_option( 'site_admins' );\n\t}\n\n\t/* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */\n\t$welcome_email = __( 'Howdy USERNAME,\n\nYour new SITE_NAME site has been successfully set up at:\nBLOG_URL\n\nYou can log in to the administrator account with the following information:\n\nUsername: USERNAME\nPassword: PASSWORD\nLog in here: BLOG_URLwp-login.php\n\nWe hope you enjoy your new site. Thanks!\n\n--The Team @ SITE_NAME' );\n\n\t$misc_exts = array(\n\t\t// Images.\n\t\t'jpg', 'jpeg', 'png', 'gif',\n\t\t// Video.\n\t\t'mov', 'avi', 'mpg', '3gp', '3g2',\n\t\t// \"audio\".\n\t\t'midi', 'mid',\n\t\t// Miscellaneous.\n\t\t'pdf', 'doc', 'ppt', 'odt', 'pptx', 'docx', 'pps', 'ppsx', 'xls', 'xlsx', 'key',\n\t);\n\t$audio_exts = wp_get_audio_extensions();\n\t$video_exts = wp_get_video_extensions();\n\t$upload_filetypes = array_unique( array_merge( $misc_exts, $audio_exts, $video_exts ) );\n\n\t$sitemeta = array(\n\t\t'site_name' => $site_name,\n\t\t'admin_email' => $email,\n\t\t'admin_user_id' => $site_user->ID,\n\t\t'registration' => 'none',\n\t\t'upload_filetypes' => implode( ' ', $upload_filetypes ),\n\t\t'blog_upload_space' => 100,\n\t\t'fileupload_maxk' => 1500,\n\t\t'site_admins' => $site_admins,\n\t\t'allowedthemes' => $allowed_themes,\n\t\t'illegal_names' => array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator', 'files' ),\n\t\t'wpmu_upgrade_site' => $wp_db_version,\n\t\t'welcome_email' => $welcome_email,\n\t\t/* translators: %s: site link */\n\t\t'first_post' => __( 'Welcome to %s. This is your first post. Edit or delete it, then start blogging!' ),\n\t\t// @todo - network admins should have a method of editing the network siteurl (used for cookie hash)\n\t\t'siteurl' => get_option( 'siteurl' ) . '/',\n\t\t'add_new_users' => '0',\n\t\t'upload_space_check_disabled' => is_multisite() ? get_site_option( 'upload_space_check_disabled' ) : '1',\n\t\t'subdomain_install' => intval( $subdomain_install ),\n\t\t'global_terms_enabled' => global_terms_enabled() ? '1' : '0',\n\t\t'ms_files_rewriting' => is_multisite() ? get_site_option( 'ms_files_rewriting' ) : '0',\n\t\t'initial_db_version' => get_option( 'initial_db_version' ),\n\t\t'active_sitewide_plugins' => array(),\n\t\t'WPLANG' => get_locale(),\n\t);\n\tif ( ! $subdomain_install )\n\t\t$sitemeta['illegal_names'][] = 'blog';\n\n\t/**\n\t * Filter meta for a network on creation.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param array $sitemeta   Associative array of network meta keys and values to be inserted.\n\t * @param int   $network_id ID of network to populate.\n\t */\n\t$sitemeta = apply_filters( 'populate_network_meta', $sitemeta, $network_id );\n\n\t$insert = '';\n\tforeach ( $sitemeta as $meta_key => $meta_value ) {\n\t\tif ( is_array( $meta_value ) )\n\t\t\t$meta_value = serialize( $meta_value );\n\t\tif ( !empty( $insert ) )\n\t\t\t$insert .= ', ';\n\t\t$insert .= $wpdb->prepare( \"( %d, %s, %s)\", $network_id, $meta_key, $meta_value );\n\t}\n\t$wpdb->query( \"INSERT INTO $wpdb->sitemeta ( site_id, meta_key, meta_value ) VALUES \" . $insert );\n\n\t/*\n\t * When upgrading from single to multisite, assume the current site will\n\t * become the main site of the network. When using populate_network()\n\t * to create another network in an existing multisite environment, skip\n\t * these steps since the main site of the new network has not yet been\n\t * created.\n\t */\n\tif ( ! is_multisite() ) {\n\t\t$current_site = new stdClass;\n\t\t$current_site->domain = $domain;\n\t\t$current_site->path = $path;\n\t\t$current_site->site_name = ucfirst( $domain );\n\t\t$wpdb->insert( $wpdb->blogs, array( 'site_id' => $network_id, 'blog_id' => 1, 'domain' => $domain, 'path' => $path, 'registered' => current_time( 'mysql' ) ) );\n\t\t$current_site->blog_id = $blog_id = $wpdb->insert_id;\n\t\tupdate_user_meta( $site_user->ID, 'source_domain', $domain );\n\t\tupdate_user_meta( $site_user->ID, 'primary_blog', $blog_id );\n\n\t\tif ( $subdomain_install )\n\t\t\t$wp_rewrite->set_permalink_structure( '/%year%/%monthnum%/%day%/%postname%/' );\n\t\telse\n\t\t\t$wp_rewrite->set_permalink_structure( '/blog/%year%/%monthnum%/%day%/%postname%/' );\n\n\t\tflush_rewrite_rules();\n\n\t\tif ( ! $subdomain_install )\n\t\t\treturn true;\n\n\t\t$vhost_ok = false;\n\t\t$errstr = '';\n\t\t$hostname = substr( md5( time() ), 0, 6 ) . '.' . $domain; // Very random hostname!\n\t\t$page = wp_remote_get( 'http://' . $hostname, array( 'timeout' => 5, 'httpversion' => '1.1' ) );\n\t\tif ( is_wp_error( $page ) )\n\t\t\t$errstr = $page->get_error_message();\n\t\telseif ( 200 == wp_remote_retrieve_response_code( $page ) )\n\t\t\t\t$vhost_ok = true;\n\n\t\tif ( ! $vhost_ok ) {\n\t\t\t$msg = '<p><strong>' . __( 'Warning! Wildcard DNS may not be configured correctly!' ) . '</strong></p>';\n\n\t\t\t$msg .= '<p>' . sprintf(\n\t\t\t\t/* translators: %s: host name */\n\t\t\t\t__( 'The installer attempted to contact a random hostname (%s) on your domain.' ),\n\t\t\t\t'<code>' . $hostname . '</code>'\n\t\t\t);\n\t\t\tif ( ! empty ( $errstr ) ) {\n\t\t\t\t/* translators: %s: error message */\n\t\t\t\t$msg .= ' ' . sprintf( __( 'This resulted in an error message: %s' ), '<code>' . $errstr . '</code>' );\n\t\t\t}\n\t\t\t$msg .= '</p>';\n\n\t\t\t$msg .= '<p>' . sprintf(\n\t\t\t\t/* translators: %s: asterisk symbol (*) */\n\t\t\t\t__( 'To use a subdomain configuration, you must have a wildcard entry in your DNS. This usually means adding a %s hostname record pointing at your web server in your DNS configuration tool.' ),\n\t\t\t\t'<code>*</code>'\n\t\t\t) . '</p>';\n\n\t\t\t$msg .= '<p>' . __( 'You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message.' ) . '</p>';\n\n\t\t\treturn new WP_Error( 'no_wildcard_dns', $msg );\n\t\t}\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/screen.php",
    "content": "<?php\n/**\n * WordPress Administration Screen API.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Get the column headers for a screen\n *\n * @since 2.7.0\n *\n * @staticvar array $column_headers\n *\n * @param string|WP_Screen $screen The screen you want the headers for\n * @return array Containing the headers in the format id => UI String\n */\nfunction get_column_headers( $screen ) {\n\tif ( is_string( $screen ) )\n\t\t$screen = convert_to_screen( $screen );\n\n\tstatic $column_headers = array();\n\n\tif ( ! isset( $column_headers[ $screen->id ] ) ) {\n\n\t\t/**\n\t\t * Filter the column headers for a list table on a specific screen.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$screen->id`, refers to the\n\t\t * ID of a specific screen. For example, the screen ID for the Posts\n\t\t * list table is edit-post, so the filter for that screen would be\n\t\t * manage_edit-post_columns.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $columns An array of column headers. Default empty.\n\t\t */\n\t\t$column_headers[ $screen->id ] = apply_filters( \"manage_{$screen->id}_columns\", array() );\n\t}\n\n\treturn $column_headers[ $screen->id ];\n}\n\n/**\n * Get a list of hidden columns.\n *\n * @since 2.7.0\n *\n * @param string|WP_Screen $screen The screen you want the hidden columns for\n * @return array\n */\nfunction get_hidden_columns( $screen ) {\n\tif ( is_string( $screen ) ) {\n\t\t$screen = convert_to_screen( $screen );\n\t}\n\n\t$hidden = get_user_option( 'manage' . $screen->id . 'columnshidden' );\n\n\t$use_defaults = ! is_array( $hidden );\n\n\tif ( $use_defaults ) {\n\t\t$hidden = array();\n\n\t\t/**\n\t\t * Filter the default list of hidden columns.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array     $hidden An array of columns hidden by default.\n\t\t * @param WP_Screen $screen WP_Screen object of the current screen.\n\t\t */\n\t\t$hidden = apply_filters( 'default_hidden_columns', $hidden, $screen );\n\t}\n\n\t/**\n\t * Filter the list of hidden columns.\n\t *\n\t * @since 4.4.0\n\t * @since 4.4.1\t\tAdded the `use_defaults` parameter.\n\t *\n\t * @param array     $hidden An array of hidden columns.\n\t * @param WP_Screen $screen WP_Screen object of the current screen.\n\t * @param bool      $use_defaults Whether to show the default columns.\n\t */\n\treturn apply_filters( 'hidden_columns', $hidden, $screen, $use_defaults );\n}\n\n/**\n * Prints the meta box preferences for screen meta.\n *\n * @since 2.7.0\n *\n * @global array $wp_meta_boxes\n *\n * @param WP_Screen $screen\n */\nfunction meta_box_prefs( $screen ) {\n\tglobal $wp_meta_boxes;\n\n\tif ( is_string( $screen ) )\n\t\t$screen = convert_to_screen( $screen );\n\n\tif ( empty($wp_meta_boxes[$screen->id]) )\n\t\treturn;\n\n\t$hidden = get_hidden_meta_boxes($screen);\n\n\tforeach ( array_keys( $wp_meta_boxes[ $screen->id ] ) as $context ) {\n\t\tforeach ( array( 'high', 'core', 'default', 'low' ) as $priority ) {\n\t\t\tif ( ! isset( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tforeach ( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] as $box ) {\n\t\t\t\tif ( false == $box || ! $box['title'] )\n\t\t\t\t\tcontinue;\n\t\t\t\t// Submit box cannot be hidden\n\t\t\t\tif ( 'submitdiv' == $box['id'] || 'linksubmitdiv' == $box['id'] )\n\t\t\t\t\tcontinue;\n\t\t\t\t$box_id = $box['id'];\n\t\t\t\techo '<label for=\"' . $box_id . '-hide\">';\n\t\t\t\techo '<input class=\"hide-postbox-tog\" name=\"' . $box_id . '-hide\" type=\"checkbox\" id=\"' . $box_id . '-hide\" value=\"' . $box_id . '\"' . (! in_array($box_id, $hidden) ? ' checked=\"checked\"' : '') . ' />';\n\t\t\t\techo \"{$box['title']}</label>\\n\";\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Get Hidden Meta Boxes\n *\n * @since 2.7.0\n *\n * @param string|WP_Screen $screen Screen identifier\n * @return array Hidden Meta Boxes\n */\nfunction get_hidden_meta_boxes( $screen ) {\n\tif ( is_string( $screen ) )\n\t\t$screen = convert_to_screen( $screen );\n\n\t$hidden = get_user_option( \"metaboxhidden_{$screen->id}\" );\n\n\t$use_defaults = ! is_array( $hidden );\n\n\t// Hide slug boxes by default\n\tif ( $use_defaults ) {\n\t\t$hidden = array();\n\t\tif ( 'post' == $screen->base ) {\n\t\t\tif ( 'post' == $screen->post_type || 'page' == $screen->post_type || 'attachment' == $screen->post_type )\n\t\t\t\t$hidden = array('slugdiv', 'trackbacksdiv', 'postcustom', 'postexcerpt', 'commentstatusdiv', 'commentsdiv', 'authordiv', 'revisionsdiv');\n\t\t\telse\n\t\t\t\t$hidden = array( 'slugdiv' );\n\t\t}\n\n\t\t/**\n\t\t * Filter the default list of hidden meta boxes.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array     $hidden An array of meta boxes hidden by default.\n\t\t * @param WP_Screen $screen WP_Screen object of the current screen.\n\t\t */\n\t\t$hidden = apply_filters( 'default_hidden_meta_boxes', $hidden, $screen );\n\t}\n\n\t/**\n\t * Filter the list of hidden meta boxes.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param array     $hidden       An array of hidden meta boxes.\n\t * @param WP_Screen $screen       WP_Screen object of the current screen.\n\t * @param bool      $use_defaults Whether to show the default meta boxes.\n\t *                                Default true.\n\t */\n\treturn apply_filters( 'hidden_meta_boxes', $hidden, $screen, $use_defaults );\n}\n\n/**\n * Register and configure an admin screen option\n *\n * @since 3.1.0\n *\n * @param string $option An option name.\n * @param mixed $args Option-dependent arguments.\n */\nfunction add_screen_option( $option, $args = array() ) {\n\t$current_screen = get_current_screen();\n\n\tif ( ! $current_screen )\n\t\treturn;\n\n\t$current_screen->add_option( $option, $args );\n}\n\n/**\n * Get the current screen object\n *\n * @since 3.1.0\n *\n * @global WP_Screen $current_screen\n *\n * @return WP_Screen Current screen object\n */\nfunction get_current_screen() {\n\tglobal $current_screen;\n\n\tif ( ! isset( $current_screen ) )\n\t\treturn null;\n\n\treturn $current_screen;\n}\n\n/**\n * Set the current screen object\n *\n * @since 3.0.0\n *\n * @param mixed $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen,\n *\t                       or an existing screen object.\n */\nfunction set_current_screen( $hook_name = '' ) {\n\tWP_Screen::get( $hook_name )->set_current_screen();\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/taxonomy.php",
    "content": "<?php\n/**\n * WordPress Taxonomy Administration API.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n//\n// Category\n//\n\n/**\n * Check whether a category exists.\n *\n * @since 2.0.0\n *\n * @see term_exists()\n *\n * @param int|string $cat_name Category name.\n * @param int        $parent   Optional. ID of parent term.\n * @return mixed\n */\nfunction category_exists( $cat_name, $parent = null ) {\n\t$id = term_exists($cat_name, 'category', $parent);\n\tif ( is_array($id) )\n\t\t$id = $id['term_id'];\n\treturn $id;\n}\n\n/**\n * Get category object for given ID and 'edit' filter context.\n *\n * @since 2.0.0\n *\n * @param int $id\n * @return object\n */\nfunction get_category_to_edit( $id ) {\n\t$category = get_term( $id, 'category', OBJECT, 'edit' );\n\t_make_cat_compat( $category );\n\treturn $category;\n}\n\n/**\n * Add a new category to the database if it does not already exist.\n *\n * @since 2.0.0\n *\n * @param int|string $cat_name\n * @param int        $parent\n * @return int|WP_Error\n */\nfunction wp_create_category( $cat_name, $parent = 0 ) {\n\tif ( $id = category_exists($cat_name, $parent) )\n\t\treturn $id;\n\n\treturn wp_insert_category( array('cat_name' => $cat_name, 'category_parent' => $parent) );\n}\n\n/**\n * Create categories for the given post.\n *\n * @since 2.0.0\n *\n * @param array $categories List of categories to create.\n * @param int   $post_id    Optional. The post ID. Default empty.\n * @return List of categories to create for the given post.\n */\nfunction wp_create_categories( $categories, $post_id = '' ) {\n\t$cat_ids = array ();\n\tforeach ( $categories as $category ) {\n\t\tif ( $id = category_exists( $category ) ) {\n\t\t\t$cat_ids[] = $id;\n\t\t} elseif ( $id = wp_create_category( $category ) ) {\n\t\t\t$cat_ids[] = $id;\n\t\t}\n\t}\n\n\tif ( $post_id )\n\t\twp_set_post_categories($post_id, $cat_ids);\n\n\treturn $cat_ids;\n}\n\n/**\n * Updates an existing Category or creates a new Category.\n *\n * @since 2.0.0\n * @since 2.5.0 $wp_error parameter was added.\n * @since 3.0.0 The 'taxonomy' argument was added.\n *\n * @param array $catarr {\n *     Array of arguments for inserting a new category.\n *\n *     @type int        $cat_ID               Category ID. A non-zero value updates an existing category.\n *                                            Default 0.\n *     @type string     $taxonomy             Taxonomy slug. Default 'category'.\n *     @type string     $cat_name             Category name. Default empty.\n *     @type string     $category_description Category description. Default empty.\n *     @type string     $category_nicename    Category nice (display) name. Default empty.\n *     @type int|string $category_parent      Category parent ID. Default empty.\n * }\n * @param bool  $wp_error Optional. Default false.\n * @return int|object The ID number of the new or updated Category on success. Zero or a WP_Error on failure,\n *                    depending on param $wp_error.\n */\nfunction wp_insert_category( $catarr, $wp_error = false ) {\n\t$cat_defaults = array( 'cat_ID' => 0, 'taxonomy' => 'category', 'cat_name' => '', 'category_description' => '', 'category_nicename' => '', 'category_parent' => '' );\n\t$catarr = wp_parse_args( $catarr, $cat_defaults );\n\n\tif ( trim( $catarr['cat_name'] ) == '' ) {\n\t\tif ( ! $wp_error ) {\n\t\t\treturn 0;\n\t\t} else {\n\t\t\treturn new WP_Error( 'cat_name', __( 'You did not enter a category name.' ) );\n\t\t}\n\t}\n\n\t$catarr['cat_ID'] = (int) $catarr['cat_ID'];\n\n\t// Are we updating or creating?\n\t$update = ! empty ( $catarr['cat_ID'] );\n\n\t$name = $catarr['cat_name'];\n\t$description = $catarr['category_description'];\n\t$slug = $catarr['category_nicename'];\n\t$parent = (int) $catarr['category_parent'];\n\tif ( $parent < 0 ) {\n\t\t$parent = 0;\n\t}\n\n\tif ( empty( $parent )\n\t\t|| ! term_exists( $parent, $catarr['taxonomy'] )\n\t\t|| ( $catarr['cat_ID'] && term_is_ancestor_of( $catarr['cat_ID'], $parent, $catarr['taxonomy'] ) ) ) {\n\t\t$parent = 0;\n\t}\n\n\t$args = compact('name', 'slug', 'parent', 'description');\n\n\tif ( $update ) {\n\t\t$catarr['cat_ID'] = wp_update_term( $catarr['cat_ID'], $catarr['taxonomy'], $args );\n\t} else {\n\t\t$catarr['cat_ID'] = wp_insert_term( $catarr['cat_name'], $catarr['taxonomy'], $args );\n\t}\n\n\tif ( is_wp_error( $catarr['cat_ID'] ) ) {\n\t\tif ( $wp_error ) {\n\t\t\treturn $catarr['cat_ID'];\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\treturn $catarr['cat_ID']['term_id'];\n}\n\n/**\n * Aliases wp_insert_category() with minimal args.\n *\n * If you want to update only some fields of an existing category, call this\n * function with only the new values set inside $catarr.\n *\n * @since 2.0.0\n *\n * @param array $catarr The 'cat_ID' value is required. All other keys are optional.\n * @return int|bool The ID number of the new or updated Category on success. Zero or FALSE on failure.\n */\nfunction wp_update_category($catarr) {\n\t$cat_ID = (int) $catarr['cat_ID'];\n\n\tif ( isset($catarr['category_parent']) && ($cat_ID == $catarr['category_parent']) )\n\t\treturn false;\n\n\t// First, get all of the original fields\n\t$category = get_term( $cat_ID, 'category', ARRAY_A );\n\t_make_cat_compat( $category );\n\n\t// Escape data pulled from DB.\n\t$category = wp_slash($category);\n\n\t// Merge old and new fields with new fields overwriting old ones.\n\t$catarr = array_merge($category, $catarr);\n\n\treturn wp_insert_category($catarr);\n}\n\n//\n// Tags\n//\n\n/**\n * Check whether a post tag with a given name exists.\n *\n * @since 2.3.0\n *\n * @param int|string $tag_name\n * @return mixed\n */\nfunction tag_exists($tag_name) {\n\treturn term_exists($tag_name, 'post_tag');\n}\n\n/**\n * Add a new tag to the database if it does not already exist.\n *\n * @since 2.3.0\n *\n * @param int|string $tag_name\n * @return array|WP_Error\n */\nfunction wp_create_tag($tag_name) {\n\treturn wp_create_term( $tag_name, 'post_tag');\n}\n\n/**\n * Get comma-separated list of tags available to edit.\n *\n * @since 2.3.0\n *\n * @param int    $post_id\n * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'.\n * @return string|bool|WP_Error\n */\nfunction get_tags_to_edit( $post_id, $taxonomy = 'post_tag' ) {\n\treturn get_terms_to_edit( $post_id, $taxonomy);\n}\n\n/**\n * Get comma-separated list of terms available to edit for the given post ID.\n *\n * @since 2.8.0\n *\n * @param int    $post_id\n * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'.\n * @return string|bool|WP_Error\n */\nfunction get_terms_to_edit( $post_id, $taxonomy = 'post_tag' ) {\n\t$post_id = (int) $post_id;\n\tif ( !$post_id )\n\t\treturn false;\n\n\t$terms = get_object_term_cache( $post_id, $taxonomy );\n\tif ( false === $terms ) {\n\t\t$terms = wp_get_object_terms( $post_id, $taxonomy );\n\t\twp_cache_add( $post_id, $terms, $taxonomy . '_relationships' );\n\t}\n\n\tif ( ! $terms ) {\n\t\treturn false;\n\t}\n\tif ( is_wp_error( $terms ) ) {\n\t\treturn $terms;\n\t}\n\t$term_names = array();\n\tforeach ( $terms as $term ) {\n\t\t$term_names[] = $term->name;\n\t}\n\n\t$terms_to_edit = esc_attr( join( ',', $term_names ) );\n\n\t/**\n\t * Filter the comma-separated list of terms available to edit.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @see get_terms_to_edit()\n\t *\n\t * @param array  $terms_to_edit An array of terms.\n\t * @param string $taxonomy     The taxonomy for which to retrieve terms. Default 'post_tag'.\n\t */\n\t$terms_to_edit = apply_filters( 'terms_to_edit', $terms_to_edit, $taxonomy );\n\n\treturn $terms_to_edit;\n}\n\n/**\n * Add a new term to the database if it does not already exist.\n *\n * @since 2.8.0\n *\n * @param int|string $tag_name\n * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'.\n * @return array|WP_Error\n */\nfunction wp_create_term($tag_name, $taxonomy = 'post_tag') {\n\tif ( $id = term_exists($tag_name, $taxonomy) )\n\t\treturn $id;\n\n\treturn wp_insert_term($tag_name, $taxonomy);\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/template.php",
    "content": "<?php\n/**\n * Template WordPress Administration API.\n *\n * A Big Mess. Also some neat functions that are nicely written.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Walker_Category_Checklist class */ \nrequire_once( ABSPATH . 'wp-admin/includes/class-walker-category-checklist.php' );\n\n/** WP_Internal_Pointers class */ \nrequire_once( ABSPATH . 'wp-admin/includes/class-wp-internal-pointers.php' );\n\n//\n// Category Checklists\n//\n\n/**\n * Output an unordered list of checkbox input elements labeled with category names.\n *\n * @since 2.5.1\n *\n * @see wp_terms_checklist()\n *\n * @param int    $post_id              Optional. Post to generate a categories checklist for. Default 0.\n *                                     $selected_cats must not be an array. Default 0.\n * @param int    $descendants_and_self Optional. ID of the category to output along with its descendants.\n *                                     Default 0.\n * @param array  $selected_cats        Optional. List of categories to mark as checked. Default false.\n * @param array  $popular_cats         Optional. List of categories to receive the \"popular-category\" class.\n *                                     Default false.\n * @param object $walker               Optional. Walker object to use to build the output.\n *                                     Default is a Walker_Category_Checklist instance.\n * @param bool   $checked_ontop        Optional. Whether to move checked items out of the hierarchy and to\n *                                     the top of the list. Default true.\n */\nfunction wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true ) {\n\twp_terms_checklist( $post_id, array(\n\t\t'taxonomy' => 'category',\n\t\t'descendants_and_self' => $descendants_and_self,\n\t\t'selected_cats' => $selected_cats,\n\t\t'popular_cats' => $popular_cats,\n\t\t'walker' => $walker,\n\t\t'checked_ontop' => $checked_ontop\n\t) );\n}\n\n/**\n * Output an unordered list of checkbox input elements labelled with term names.\n *\n * Taxonomy-independent version of wp_category_checklist().\n *\n * @since 3.0.0\n * @since 4.4.0 Introduced the `$echo` argument.\n *\n * @param int          $post_id Optional. Post ID. Default 0.\n * @param array|string $args {\n *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.\n *\n *     @type int    $descendants_and_self ID of the category to output along with its descendants.\n *                                        Default 0.\n *     @type array  $selected_cats        List of categories to mark as checked. Default false.\n *     @type array  $popular_cats         List of categories to receive the \"popular-category\" class.\n *                                        Default false.\n *     @type object $walker               Walker object to use to build the output.\n *                                        Default is a Walker_Category_Checklist instance.\n *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.\n *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to\n *                                        the top of the list. Default true.\n *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead\n *                                        of echoing it. Default true.\n * }\n */\nfunction wp_terms_checklist( $post_id = 0, $args = array() ) {\n \t$defaults = array(\n\t\t'descendants_and_self' => 0,\n\t\t'selected_cats' => false,\n\t\t'popular_cats' => false,\n\t\t'walker' => null,\n\t\t'taxonomy' => 'category',\n\t\t'checked_ontop' => true,\n\t\t'echo' => true,\n\t);\n\n\t/**\n\t * Filter the taxonomy terms checklist arguments.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see wp_terms_checklist()\n\t *\n\t * @param array $args    An array of arguments.\n\t * @param int   $post_id The post ID.\n\t */\n\t$params = apply_filters( 'wp_terms_checklist_args', $args, $post_id );\n\n\t$r = wp_parse_args( $params, $defaults );\n\n\tif ( empty( $r['walker'] ) || ! ( $r['walker'] instanceof Walker ) ) {\n\t\t$walker = new Walker_Category_Checklist;\n\t} else {\n\t\t$walker = $r['walker'];\n\t}\n\n\t$taxonomy = $r['taxonomy'];\n\t$descendants_and_self = (int) $r['descendants_and_self'];\n\n\t$args = array( 'taxonomy' => $taxonomy );\n\n\t$tax = get_taxonomy( $taxonomy );\n\t$args['disabled'] = ! current_user_can( $tax->cap->assign_terms );\n\n\t$args['list_only'] = ! empty( $r['list_only'] );\n\n\tif ( is_array( $r['selected_cats'] ) ) {\n\t\t$args['selected_cats'] = $r['selected_cats'];\n\t} elseif ( $post_id ) {\n\t\t$args['selected_cats'] = wp_get_object_terms( $post_id, $taxonomy, array_merge( $args, array( 'fields' => 'ids' ) ) );\n\t} else {\n\t\t$args['selected_cats'] = array();\n\t}\n\tif ( is_array( $r['popular_cats'] ) ) {\n\t\t$args['popular_cats'] = $r['popular_cats'];\n\t} else {\n\t\t$args['popular_cats'] = get_terms( $taxonomy, array(\n\t\t\t'fields' => 'ids',\n\t\t\t'orderby' => 'count',\n\t\t\t'order' => 'DESC',\n\t\t\t'number' => 10,\n\t\t\t'hierarchical' => false\n\t\t) );\n\t}\n\tif ( $descendants_and_self ) {\n\t\t$categories = (array) get_terms( $taxonomy, array(\n\t\t\t'child_of' => $descendants_and_self,\n\t\t\t'hierarchical' => 0,\n\t\t\t'hide_empty' => 0\n\t\t) );\n\t\t$self = get_term( $descendants_and_self, $taxonomy );\n\t\tarray_unshift( $categories, $self );\n\t} else {\n\t\t$categories = (array) get_terms( $taxonomy, array( 'get' => 'all' ) );\n\t}\n\n\t$output = '';\n\n\tif ( $r['checked_ontop'] ) {\n\t\t// Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache)\n\t\t$checked_categories = array();\n\t\t$keys = array_keys( $categories );\n\n\t\tforeach ( $keys as $k ) {\n\t\t\tif ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) {\n\t\t\t\t$checked_categories[] = $categories[$k];\n\t\t\t\tunset( $categories[$k] );\n\t\t\t}\n\t\t}\n\n\t\t// Put checked cats on top\n\t\t$output .= call_user_func_array( array( $walker, 'walk' ), array( $checked_categories, 0, $args ) );\n\t}\n\t// Then the rest of them\n\t$output .= call_user_func_array( array( $walker, 'walk' ), array( $categories, 0, $args ) );\n\n\tif ( $r['echo'] ) {\n\t\techo $output;\n\t}\n\n\treturn $output;\n}\n\n/**\n * Retrieve a list of the most popular terms from the specified taxonomy.\n *\n * If the $echo argument is true then the elements for a list of checkbox\n * `<input>` elements labelled with the names of the selected terms is output.\n * If the $post_ID global isn't empty then the terms associated with that\n * post will be marked as checked.\n *\n * @since 2.5.0\n *\n * @param string $taxonomy Taxonomy to retrieve terms from.\n * @param int $default Not used.\n * @param int $number Number of terms to retrieve. Defaults to 10.\n * @param bool $echo Optionally output the list as well. Defaults to true.\n * @return array List of popular term IDs.\n */\nfunction wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) {\n\t$post = get_post();\n\n\tif ( $post && $post->ID )\n\t\t$checked_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields'=>'ids'));\n\telse\n\t\t$checked_terms = array();\n\n\t$terms = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number, 'hierarchical' => false ) );\n\n\t$tax = get_taxonomy($taxonomy);\n\n\t$popular_ids = array();\n\tforeach ( (array) $terms as $term ) {\n\t\t$popular_ids[] = $term->term_id;\n\t\tif ( !$echo ) // hack for AJAX use\n\t\t\tcontinue;\n\t\t$id = \"popular-$taxonomy-$term->term_id\";\n\t\t$checked = in_array( $term->term_id, $checked_terms ) ? 'checked=\"checked\"' : '';\n\t\t?>\n\n\t\t<li id=\"<?php echo $id; ?>\" class=\"popular-category\">\n\t\t\t<label class=\"selectit\">\n\t\t\t\t<input id=\"in-<?php echo $id; ?>\" type=\"checkbox\" <?php echo $checked; ?> value=\"<?php echo (int) $term->term_id; ?>\" <?php disabled( ! current_user_can( $tax->cap->assign_terms ) ); ?> />\n\t\t\t\t<?php\n\t\t\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t\t\techo esc_html( apply_filters( 'the_category', $term->name ) );\n\t\t\t\t?>\n\t\t\t</label>\n\t\t</li>\n\n\t\t<?php\n\t}\n\treturn $popular_ids;\n}\n\n/**\n * Outputs a link category checklist element.\n *\n * @since 2.5.1\n *\n * @param int $link_id\n */\nfunction wp_link_category_checklist( $link_id = 0 ) {\n\t$default = 1;\n\n\t$checked_categories = array();\n\n\tif ( $link_id ) {\n\t\t$checked_categories = wp_get_link_cats( $link_id );\n\t\t// No selected categories, strange\n\t\tif ( ! count( $checked_categories ) ) {\n\t\t\t$checked_categories[] = $default;\n\t\t}\n\t} else {\n\t\t$checked_categories[] = $default;\n\t}\n\n\t$categories = get_terms( 'link_category', array( 'orderby' => 'name', 'hide_empty' => 0 ) );\n\n\tif ( empty( $categories ) )\n\t\treturn;\n\n\tforeach ( $categories as $category ) {\n\t\t$cat_id = $category->term_id;\n\n\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t$name = esc_html( apply_filters( 'the_category', $category->name ) );\n\t\t$checked = in_array( $cat_id, $checked_categories ) ? ' checked=\"checked\"' : '';\n\t\techo '<li id=\"link-category-', $cat_id, '\"><label for=\"in-link-category-', $cat_id, '\" class=\"selectit\"><input value=\"', $cat_id, '\" type=\"checkbox\" name=\"link_category[]\" id=\"in-link-category-', $cat_id, '\"', $checked, '/> ', $name, \"</label></li>\";\n\t}\n}\n\n/**\n * Adds hidden fields with the data for use in the inline editor for posts and pages.\n *\n * @since 2.7.0\n *\n * @param WP_Post $post Post object.\n */\nfunction get_inline_data($post) {\n\t$post_type_object = get_post_type_object($post->post_type);\n\tif ( ! current_user_can( 'edit_post', $post->ID ) )\n\t\treturn;\n\n\t$title = esc_textarea( trim( $post->post_title ) );\n\n\t/** This filter is documented in wp-admin/edit-tag-form.php */\n\techo '\n<div class=\"hidden\" id=\"inline_' . $post->ID . '\">\n\t<div class=\"post_title\">' . $title . '</div>' .\n\t/** This filter is documented in wp-admin/edit-tag-form.php */\n\t'<div class=\"post_name\">' . apply_filters( 'editable_slug', $post->post_name, $post ) . '</div>\n\t<div class=\"post_author\">' . $post->post_author . '</div>\n\t<div class=\"comment_status\">' . esc_html( $post->comment_status ) . '</div>\n\t<div class=\"ping_status\">' . esc_html( $post->ping_status ) . '</div>\n\t<div class=\"_status\">' . esc_html( $post->post_status ) . '</div>\n\t<div class=\"jj\">' . mysql2date( 'd', $post->post_date, false ) . '</div>\n\t<div class=\"mm\">' . mysql2date( 'm', $post->post_date, false ) . '</div>\n\t<div class=\"aa\">' . mysql2date( 'Y', $post->post_date, false ) . '</div>\n\t<div class=\"hh\">' . mysql2date( 'H', $post->post_date, false ) . '</div>\n\t<div class=\"mn\">' . mysql2date( 'i', $post->post_date, false ) . '</div>\n\t<div class=\"ss\">' . mysql2date( 's', $post->post_date, false ) . '</div>\n\t<div class=\"post_password\">' . esc_html( $post->post_password ) . '</div>';\n\n\tif ( $post_type_object->hierarchical )\n\t\techo '<div class=\"post_parent\">' . $post->post_parent . '</div>';\n\n\tif ( $post->post_type == 'page' )\n\t\techo '<div class=\"page_template\">' . esc_html( get_post_meta( $post->ID, '_wp_page_template', true ) ) . '</div>';\n\n\tif ( post_type_supports( $post->post_type, 'page-attributes' ) )\n\t\techo '<div class=\"menu_order\">' . $post->menu_order . '</div>';\n\n\t$taxonomy_names = get_object_taxonomies( $post->post_type );\n\tforeach ( $taxonomy_names as $taxonomy_name) {\n\t\t$taxonomy = get_taxonomy( $taxonomy_name );\n\n\t\tif ( $taxonomy->hierarchical && $taxonomy->show_ui ) {\n\n\t\t\t$terms = get_object_term_cache( $post->ID, $taxonomy_name );\n\t\t\tif ( false === $terms ) {\n\t\t\t\t$terms = wp_get_object_terms( $post->ID, $taxonomy_name );\n\t\t\t\twp_cache_add( $post->ID, $terms, $taxonomy_name . '_relationships' );\n\t\t\t}\n\t\t\t$term_ids = empty( $terms ) ? array() : wp_list_pluck( $terms, 'term_id' );\n\n\t\t\techo '<div class=\"post_category\" id=\"' . $taxonomy_name . '_' . $post->ID . '\">' . implode( ',', $term_ids ) . '</div>';\n\n\t\t} elseif ( $taxonomy->show_ui ) {\n\n\t\t\t$terms_to_edit = get_terms_to_edit( $post->ID, $taxonomy_name );\n\t\t\tif ( ! is_string( $terms_to_edit ) ) {\n\t\t\t\t$terms_to_edit = '';\n\t\t\t}\n\n\t\t\techo '<div class=\"tags_input\" id=\"'.$taxonomy_name.'_'.$post->ID.'\">'\n\t\t\t\t. esc_html( str_replace( ',', ', ', $terms_to_edit ) ) . '</div>';\n\n\t\t}\n\t}\n\n\tif ( !$post_type_object->hierarchical )\n\t\techo '<div class=\"sticky\">' . (is_sticky($post->ID) ? 'sticky' : '') . '</div>';\n\n\tif ( post_type_supports( $post->post_type, 'post-formats' ) )\n\t\techo '<div class=\"post_format\">' . esc_html( get_post_format( $post->ID ) ) . '</div>';\n\n\techo '</div>';\n}\n\n/**\n * Outputs the in-line comment reply-to form in the Comments list table.\n *\n * @since 2.7.0\n *\n * @global WP_List_Table $wp_list_table\n *\n * @param int    $position\n * @param bool   $checkbox\n * @param string $mode\n * @param bool   $table_row\n */\nfunction wp_comment_reply( $position = 1, $checkbox = false, $mode = 'single', $table_row = true ) {\n\tglobal $wp_list_table;\n\t/**\n\t * Filter the in-line comment reply-to form output in the Comments\n\t * list table.\n\t *\n\t * Returning a non-empty value here will short-circuit display\n\t * of the in-line comment-reply form in the Comments list table,\n\t * echoing the returned value instead.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @see wp_comment_reply()\n\t *\n\t * @param string $content The reply-to form content.\n\t * @param array  $args    An array of default args.\n\t */\n\t$content = apply_filters( 'wp_comment_reply', '', array( 'position' => $position, 'checkbox' => $checkbox, 'mode' => $mode ) );\n\n\tif ( ! empty($content) ) {\n\t\techo $content;\n\t\treturn;\n\t}\n\n\tif ( ! $wp_list_table ) {\n\t\tif ( $mode == 'single' ) {\n\t\t\t$wp_list_table = _get_list_table('WP_Post_Comments_List_Table');\n\t\t} else {\n\t\t\t$wp_list_table = _get_list_table('WP_Comments_List_Table');\n\t\t}\n\t}\n\n?>\n<form method=\"get\">\n<?php if ( $table_row ) : ?>\n<table style=\"display:none;\"><tbody id=\"com-reply\"><tr id=\"replyrow\" class=\"inline-edit-row\" style=\"display:none;\"><td colspan=\"<?php echo $wp_list_table->get_column_count(); ?>\" class=\"colspanchange\">\n<?php else : ?>\n<div id=\"com-reply\" style=\"display:none;\"><div id=\"replyrow\" style=\"display:none;\">\n<?php endif; ?>\n\t<fieldset class=\"comment-reply\">\n\t<legend>\n\t\t<span class=\"hidden\" id=\"editlegend\"><?php _e( 'Edit Comment' ); ?></span>\n\t\t<span class=\"hidden\" id=\"replyhead\"><?php _e( 'Reply to Comment' ); ?></span>\n\t\t<span class=\"hidden\" id=\"addhead\"><?php _e( 'Add new Comment' ); ?></span>\n\t</legend>\n\n\t<div id=\"replycontainer\">\n\t<label for=\"replycontent\" class=\"screen-reader-text\"><?php _e( 'Comment' ); ?></label>\n\t<?php\n\t$quicktags_settings = array( 'buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close' );\n\twp_editor( '', 'replycontent', array( 'media_buttons' => false, 'tinymce' => false, 'quicktags' => $quicktags_settings ) );\n\t?>\n\t</div>\n\n\t<div id=\"edithead\" style=\"display:none;\">\n\t\t<div class=\"inside\">\n\t\t<label for=\"author-name\"><?php _e( 'Name' ) ?></label>\n\t\t<input type=\"text\" name=\"newcomment_author\" size=\"50\" value=\"\" id=\"author-name\" />\n\t\t</div>\n\n\t\t<div class=\"inside\">\n\t\t<label for=\"author-email\"><?php _e('Email') ?></label>\n\t\t<input type=\"text\" name=\"newcomment_author_email\" size=\"50\" value=\"\" id=\"author-email\" />\n\t\t</div>\n\n\t\t<div class=\"inside\">\n\t\t<label for=\"author-url\"><?php _e('URL') ?></label>\n\t\t<input type=\"text\" id=\"author-url\" name=\"newcomment_author_url\" class=\"code\" size=\"103\" value=\"\" />\n\t\t</div>\n\t</div>\n\n\t<p id=\"replysubmit\" class=\"submit\">\n\t<a href=\"#comments-form\" class=\"save button-primary alignright\">\n\t<span id=\"addbtn\" style=\"display:none;\"><?php _e('Add Comment'); ?></span>\n\t<span id=\"savebtn\" style=\"display:none;\"><?php _e('Update Comment'); ?></span>\n\t<span id=\"replybtn\" style=\"display:none;\"><?php _e('Submit Reply'); ?></span></a>\n\t<a href=\"#comments-form\" class=\"cancel button-secondary alignleft\"><?php _e('Cancel'); ?></a>\n\t<span class=\"waiting spinner\"></span>\n\t<span class=\"error\" style=\"display:none;\"></span>\n\t</p>\n\n\t<input type=\"hidden\" name=\"action\" id=\"action\" value=\"\" />\n\t<input type=\"hidden\" name=\"comment_ID\" id=\"comment_ID\" value=\"\" />\n\t<input type=\"hidden\" name=\"comment_post_ID\" id=\"comment_post_ID\" value=\"\" />\n\t<input type=\"hidden\" name=\"status\" id=\"status\" value=\"\" />\n\t<input type=\"hidden\" name=\"position\" id=\"position\" value=\"<?php echo $position; ?>\" />\n\t<input type=\"hidden\" name=\"checkbox\" id=\"checkbox\" value=\"<?php echo $checkbox ? 1 : 0; ?>\" />\n\t<input type=\"hidden\" name=\"mode\" id=\"mode\" value=\"<?php echo esc_attr($mode); ?>\" />\n\t<?php\n\t\twp_nonce_field( 'replyto-comment', '_ajax_nonce-replyto-comment', false );\n\t\tif ( current_user_can( 'unfiltered_html' ) )\n\t\t\twp_nonce_field( 'unfiltered-html-comment', '_wp_unfiltered_html_comment', false );\n\t?>\n\t</fieldset>\n<?php if ( $table_row ) : ?>\n</td></tr></tbody></table>\n<?php else : ?>\n</div></div>\n<?php endif; ?>\n</form>\n<?php\n}\n\n/**\n * Output 'undo move to trash' text for comments\n *\n * @since 2.9.0\n */\nfunction wp_comment_trashnotice() {\n?>\n<div class=\"hidden\" id=\"trash-undo-holder\">\n\t<div class=\"trash-undo-inside\"><?php printf(__('Comment by %s moved to the trash.'), '<strong></strong>'); ?> <span class=\"undo untrash\"><a href=\"#\"><?php _e('Undo'); ?></a></span></div>\n</div>\n<div class=\"hidden\" id=\"spam-undo-holder\">\n\t<div class=\"spam-undo-inside\"><?php printf(__('Comment by %s marked as spam.'), '<strong></strong>'); ?> <span class=\"undo unspam\"><a href=\"#\"><?php _e('Undo'); ?></a></span></div>\n</div>\n<?php\n}\n\n/**\n * Outputs a post's public meta data in the Custom Fields meta box.\n *\n * @since 1.2.0\n *\n * @param array $meta\n */\nfunction list_meta( $meta ) {\n\t// Exit if no meta\n\tif ( ! $meta ) {\n\t\techo '\n<table id=\"list-table\" style=\"display: none;\">\n\t<thead>\n\t<tr>\n\t\t<th class=\"left\">' . _x( 'Name', 'meta name' ) . '</th>\n\t\t<th>' . __( 'Value' ) . '</th>\n\t</tr>\n\t</thead>\n\t<tbody id=\"the-list\" data-wp-lists=\"list:meta\">\n\t<tr><td></td></tr>\n\t</tbody>\n</table>'; //TBODY needed for list-manipulation JS\n\t\treturn;\n\t}\n\t$count = 0;\n?>\n<table id=\"list-table\">\n\t<thead>\n\t<tr>\n\t\t<th class=\"left\"><?php _ex( 'Name', 'meta name' ) ?></th>\n\t\t<th><?php _e( 'Value' ) ?></th>\n\t</tr>\n\t</thead>\n\t<tbody id='the-list' data-wp-lists='list:meta'>\n<?php\n\tforeach ( $meta as $entry )\n\t\techo _list_meta_row( $entry, $count );\n?>\n\t</tbody>\n</table>\n<?php\n}\n\n/**\n * Outputs a single row of public meta data in the Custom Fields meta box.\n *\n * @since 2.5.0\n *\n * @staticvar string $update_nonce\n *\n * @param array $entry\n * @param int   $count\n * @return string\n */\nfunction _list_meta_row( $entry, &$count ) {\n\tstatic $update_nonce = '';\n\n\tif ( is_protected_meta( $entry['meta_key'], 'post' ) )\n\t\treturn '';\n\n\tif ( ! $update_nonce )\n\t\t$update_nonce = wp_create_nonce( 'add-meta' );\n\n\t$r = '';\n\t++ $count;\n\n\tif ( is_serialized( $entry['meta_value'] ) ) {\n\t\tif ( is_serialized_string( $entry['meta_value'] ) ) {\n\t\t\t// This is a serialized string, so we should display it.\n\t\t\t$entry['meta_value'] = maybe_unserialize( $entry['meta_value'] );\n\t\t} else {\n\t\t\t// This is a serialized array/object so we should NOT display it.\n\t\t\t--$count;\n\t\t\treturn '';\n\t\t}\n\t}\n\n\t$entry['meta_key'] = esc_attr($entry['meta_key']);\n\t$entry['meta_value'] = esc_textarea( $entry['meta_value'] ); // using a <textarea />\n\t$entry['meta_id'] = (int) $entry['meta_id'];\n\n\t$delete_nonce = wp_create_nonce( 'delete-meta_' . $entry['meta_id'] );\n\n\t$r .= \"\\n\\t<tr id='meta-{$entry['meta_id']}'>\";\n\t$r .= \"\\n\\t\\t<td class='left'><label class='screen-reader-text' for='meta-{$entry['meta_id']}-key'>\" . __( 'Key' ) . \"</label><input name='meta[{$entry['meta_id']}][key]' id='meta-{$entry['meta_id']}-key' type='text' size='20' value='{$entry['meta_key']}' />\";\n\n\t$r .= \"\\n\\t\\t<div class='submit'>\";\n\t$r .= get_submit_button( __( 'Delete' ), 'deletemeta small', \"deletemeta[{$entry['meta_id']}]\", false, array( 'data-wp-lists' => \"delete:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$delete_nonce\" ) );\n\t$r .= \"\\n\\t\\t\";\n\t$r .= get_submit_button( __( 'Update' ), 'updatemeta small', \"meta-{$entry['meta_id']}-submit\", false, array( 'data-wp-lists' => \"add:the-list:meta-{$entry['meta_id']}::_ajax_nonce-add-meta=$update_nonce\" ) );\n\t$r .= \"</div>\";\n\t$r .= wp_nonce_field( 'change-meta', '_ajax_nonce', false, false );\n\t$r .= \"</td>\";\n\n\t$r .= \"\\n\\t\\t<td><label class='screen-reader-text' for='meta-{$entry['meta_id']}-value'>\" . __( 'Value' ) . \"</label><textarea name='meta[{$entry['meta_id']}][value]' id='meta-{$entry['meta_id']}-value' rows='2' cols='30'>{$entry['meta_value']}</textarea></td>\\n\\t</tr>\";\n\treturn $r;\n}\n\n/**\n * Prints the form in the Custom Fields meta box.\n *\n * @since 1.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param WP_Post $post Optional. The post being edited.\n */\nfunction meta_form( $post = null ) {\n\tglobal $wpdb;\n\t$post = get_post( $post );\n\n\t/**\n\t * Filter values for the meta key dropdown in the Custom Fields meta box.\n\t *\n\t * Returning a non-null value will effectively short-circuit and avoid a\n\t * potentially expensive query against postmeta.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array|null $keys Pre-defined meta keys to be used in place of a postmeta query. Default null.\n\t * @param WP_Post    $post The current post object.\n\t */\n\t$keys = apply_filters( 'postmeta_form_keys', null, $post );\n\n\tif ( null === $keys ) {\n\t\t/**\n\t\t * Filter the number of custom fields to retrieve for the drop-down\n\t\t * in the Custom Fields meta box.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param int $limit Number of custom fields to retrieve. Default 30.\n\t\t */\n\t\t$limit = apply_filters( 'postmeta_form_limit', 30 );\n\t\t$sql = \"SELECT DISTINCT meta_key\n\t\t\tFROM $wpdb->postmeta\n\t\t\tWHERE meta_key NOT BETWEEN '_' AND '_z'\n\t\t\tHAVING meta_key NOT LIKE %s\n\t\t\tORDER BY meta_key\n\t\t\tLIMIT %d\";\n\t\t$keys = $wpdb->get_col( $wpdb->prepare( $sql, $wpdb->esc_like( '_' ) . '%', $limit ) );\n\t}\n\n\tif ( $keys ) {\n\t\tnatcasesort( $keys );\n\t\t$meta_key_input_id = 'metakeyselect';\n\t} else {\n\t\t$meta_key_input_id = 'metakeyinput';\n\t}\n?>\n<p><strong><?php _e( 'Add New Custom Field:' ) ?></strong></p>\n<table id=\"newmeta\">\n<thead>\n<tr>\n<th class=\"left\"><label for=\"<?php echo $meta_key_input_id; ?>\"><?php _ex( 'Name', 'meta name' ) ?></label></th>\n<th><label for=\"metavalue\"><?php _e( 'Value' ) ?></label></th>\n</tr>\n</thead>\n\n<tbody>\n<tr>\n<td id=\"newmetaleft\" class=\"left\">\n<?php if ( $keys ) { ?>\n<select id=\"metakeyselect\" name=\"metakeyselect\">\n<option value=\"#NONE#\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n<?php\n\n\tforeach ( $keys as $key ) {\n\t\tif ( is_protected_meta( $key, 'post' ) || ! current_user_can( 'add_post_meta', $post->ID, $key ) )\n\t\t\tcontinue;\n\t\techo \"\\n<option value='\" . esc_attr($key) . \"'>\" . esc_html($key) . \"</option>\";\n\t}\n?>\n</select>\n<input class=\"hide-if-js\" type=\"text\" id=\"metakeyinput\" name=\"metakeyinput\" value=\"\" />\n<a href=\"#postcustomstuff\" class=\"hide-if-no-js\" onclick=\"jQuery('#metakeyinput, #metakeyselect, #enternew, #cancelnew').toggle();return false;\">\n<span id=\"enternew\"><?php _e('Enter new'); ?></span>\n<span id=\"cancelnew\" class=\"hidden\"><?php _e('Cancel'); ?></span></a>\n<?php } else { ?>\n<input type=\"text\" id=\"metakeyinput\" name=\"metakeyinput\" value=\"\" />\n<?php } ?>\n</td>\n<td><textarea id=\"metavalue\" name=\"metavalue\" rows=\"2\" cols=\"25\"></textarea></td>\n</tr>\n\n<tr><td colspan=\"2\">\n<div class=\"submit\">\n<?php submit_button( __( 'Add Custom Field' ), 'secondary', 'addmeta', false, array( 'id' => 'newmeta-submit', 'data-wp-lists' => 'add:the-list:newmeta' ) ); ?>\n</div>\n<?php wp_nonce_field( 'add-meta', '_ajax_nonce-add-meta', false ); ?>\n</td></tr>\n</tbody>\n</table>\n<?php\n\n}\n\n/**\n * Print out HTML form date elements for editing post or comment publish date.\n *\n * @since 0.71\n * @since 4.4.0 Converted to use get_comment() instead of the global `$comment`.\n *\n * @global WP_Locale  $wp_locale\n *\n * @param int|bool $edit      Accepts 1|true for editing the date, 0|false for adding the date.\n * @param int|bool $for_post  Accepts 1|true for applying the date to a post, 0|false for a comment.\n * @param int      $tab_index The tabindex attribute to add. Default 0.\n * @param int|bool $multi     Optional. Whether the additional fields and buttons should be added.\n *                            Default 0|false.\n */\nfunction touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) {\n\tglobal $wp_locale;\n\t$post = get_post();\n\n\tif ( $for_post )\n\t\t$edit = ! ( in_array($post->post_status, array('draft', 'pending') ) && (!$post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) );\n\n\t$tab_index_attribute = '';\n\tif ( (int) $tab_index > 0 )\n\t\t$tab_index_attribute = \" tabindex=\\\"$tab_index\\\"\";\n\n\t// todo: Remove this?\n\t// echo '<label for=\"timestamp\" style=\"display: block;\"><input type=\"checkbox\" class=\"checkbox\" name=\"edit_date\" value=\"1\" id=\"timestamp\"'.$tab_index_attribute.' /> '.__( 'Edit timestamp' ).'</label><br />';\n\n\t$time_adj = current_time('timestamp');\n\t$post_date = ($for_post) ? $post->post_date : get_comment()->comment_date;\n\t$jj = ($edit) ? mysql2date( 'd', $post_date, false ) : gmdate( 'd', $time_adj );\n\t$mm = ($edit) ? mysql2date( 'm', $post_date, false ) : gmdate( 'm', $time_adj );\n\t$aa = ($edit) ? mysql2date( 'Y', $post_date, false ) : gmdate( 'Y', $time_adj );\n\t$hh = ($edit) ? mysql2date( 'H', $post_date, false ) : gmdate( 'H', $time_adj );\n\t$mn = ($edit) ? mysql2date( 'i', $post_date, false ) : gmdate( 'i', $time_adj );\n\t$ss = ($edit) ? mysql2date( 's', $post_date, false ) : gmdate( 's', $time_adj );\n\n\t$cur_jj = gmdate( 'd', $time_adj );\n\t$cur_mm = gmdate( 'm', $time_adj );\n\t$cur_aa = gmdate( 'Y', $time_adj );\n\t$cur_hh = gmdate( 'H', $time_adj );\n\t$cur_mn = gmdate( 'i', $time_adj );\n\n\t$month = '<label><span class=\"screen-reader-text\">' . __( 'Month' ) . '</span><select ' . ( $multi ? '' : 'id=\"mm\" ' ) . 'name=\"mm\"' . $tab_index_attribute . \">\\n\";\n\tfor ( $i = 1; $i < 13; $i = $i +1 ) {\n\t\t$monthnum = zeroise($i, 2);\n\t\t$monthtext = $wp_locale->get_month_abbrev( $wp_locale->get_month( $i ) );\n\t\t$month .= \"\\t\\t\\t\" . '<option value=\"' . $monthnum . '\" data-text=\"' . $monthtext . '\" ' . selected( $monthnum, $mm, false ) . '>';\n\t\t/* translators: 1: month number (01, 02, etc.), 2: month abbreviation */\n\t\t$month .= sprintf( __( '%1$s-%2$s' ), $monthnum, $monthtext ) . \"</option>\\n\";\n\t}\n\t$month .= '</select></label>';\n\n\t$day = '<label><span class=\"screen-reader-text\">' . __( 'Day' ) . '</span><input type=\"text\" ' . ( $multi ? '' : 'id=\"jj\" ' ) . 'name=\"jj\" value=\"' . $jj . '\" size=\"2\" maxlength=\"2\"' . $tab_index_attribute . ' autocomplete=\"off\" /></label>';\n\t$year = '<label><span class=\"screen-reader-text\">' . __( 'Year' ) . '</span><input type=\"text\" ' . ( $multi ? '' : 'id=\"aa\" ' ) . 'name=\"aa\" value=\"' . $aa . '\" size=\"4\" maxlength=\"4\"' . $tab_index_attribute . ' autocomplete=\"off\" /></label>';\n\t$hour = '<label><span class=\"screen-reader-text\">' . __( 'Hour' ) . '</span><input type=\"text\" ' . ( $multi ? '' : 'id=\"hh\" ' ) . 'name=\"hh\" value=\"' . $hh . '\" size=\"2\" maxlength=\"2\"' . $tab_index_attribute . ' autocomplete=\"off\" /></label>';\n\t$minute = '<label><span class=\"screen-reader-text\">' . __( 'Minute' ) . '</span><input type=\"text\" ' . ( $multi ? '' : 'id=\"mn\" ' ) . 'name=\"mn\" value=\"' . $mn . '\" size=\"2\" maxlength=\"2\"' . $tab_index_attribute . ' autocomplete=\"off\" /></label>';\n\n\techo '<div class=\"timestamp-wrap\">';\n\t/* translators: 1: month, 2: day, 3: year, 4: hour, 5: minute */\n\tprintf( __( '%1$s %2$s, %3$s @ %4$s:%5$s' ), $month, $day, $year, $hour, $minute );\n\n\techo '</div><input type=\"hidden\" id=\"ss\" name=\"ss\" value=\"' . $ss . '\" />';\n\n\tif ( $multi ) return;\n\n\techo \"\\n\\n\";\n\t$map = array(\n\t\t'mm' => array( $mm, $cur_mm ),\n\t\t'jj' => array( $jj, $cur_jj ),\n\t\t'aa' => array( $aa, $cur_aa ),\n\t\t'hh' => array( $hh, $cur_hh ),\n\t\t'mn' => array( $mn, $cur_mn ),\n\t);\n\tforeach ( $map as $timeunit => $value ) {\n\t\tlist( $unit, $curr ) = $value;\n\n\t\techo '<input type=\"hidden\" id=\"hidden_' . $timeunit . '\" name=\"hidden_' . $timeunit . '\" value=\"' . $unit . '\" />' . \"\\n\";\n\t\t$cur_timeunit = 'cur_' . $timeunit;\n\t\techo '<input type=\"hidden\" id=\"' . $cur_timeunit . '\" name=\"' . $cur_timeunit . '\" value=\"' . $curr . '\" />' . \"\\n\";\n\t}\n?>\n\n<p>\n<a href=\"#edit_timestamp\" class=\"save-timestamp hide-if-no-js button\"><?php _e('OK'); ?></a>\n<a href=\"#edit_timestamp\" class=\"cancel-timestamp hide-if-no-js button-cancel\"><?php _e('Cancel'); ?></a>\n</p>\n<?php\n}\n\n/**\n * Print out option HTML elements for the page templates drop-down.\n *\n * @since 1.5.0\n *\n * @param string $default Optional. The template file name. Default empty.\n */\nfunction page_template_dropdown( $default = '' ) {\n\t$templates = get_page_templates( get_post() );\n\tksort( $templates );\n\tforeach ( array_keys( $templates ) as $template ) {\n\t\t$selected = selected( $default, $templates[ $template ], false );\n\t\techo \"\\n\\t<option value='\" . $templates[ $template ] . \"' $selected>$template</option>\";\n\t}\n}\n\n/**\n * Print out option HTML elements for the page parents drop-down.\n *\n * @since 1.5.0\n * @since 4.4.0 `$post` argument was added.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int         $default Optional. The default page ID to be pre-selected. Default 0.\n * @param int         $parent  Optional. The parent page ID. Default 0.\n * @param int         $level   Optional. Page depth level. Default 0.\n * @param int|WP_Post $post    Post ID or WP_Post object.\n *\n * @return null|false Boolean False if page has no children, otherwise print out html elements\n */\nfunction parent_dropdown( $default = 0, $parent = 0, $level = 0, $post = null ) {\n\tglobal $wpdb;\n\t$post = get_post( $post );\n\t$items = $wpdb->get_results( $wpdb->prepare(\"SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'page' ORDER BY menu_order\", $parent) );\n\n\tif ( $items ) {\n\t\tforeach ( $items as $item ) {\n\t\t\t// A page cannot be its own parent.\n\t\t\tif ( $post && $post->ID && $item->ID == $post->ID )\n\t\t\t\tcontinue;\n\n\t\t\t$pad = str_repeat( '&nbsp;', $level * 3 );\n\t\t\t$selected = selected( $default, $item->ID, false );\n\n\t\t\techo \"\\n\\t<option class='level-$level' value='$item->ID' $selected>$pad \" . esc_html($item->post_title) . \"</option>\";\n\t\t\tparent_dropdown( $default, $item->ID, $level +1 );\n\t\t}\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * Print out option html elements for role selectors.\n *\n * @since 2.1.0\n *\n * @param string $selected Slug for the role that should be already selected.\n */\nfunction wp_dropdown_roles( $selected = '' ) {\n\t$p = '';\n\t$r = '';\n\n\t$editable_roles = array_reverse( get_editable_roles() );\n\n\tforeach ( $editable_roles as $role => $details ) {\n\t\t$name = translate_user_role($details['name'] );\n\t\tif ( $selected == $role ) // preselect specified role\n\t\t\t$p = \"\\n\\t<option selected='selected' value='\" . esc_attr($role) . \"'>$name</option>\";\n\t\telse\n\t\t\t$r .= \"\\n\\t<option value='\" . esc_attr($role) . \"'>$name</option>\";\n\t}\n\techo $p . $r;\n}\n\n/**\n * Outputs the form used by the importers to accept the data to be imported\n *\n * @since 2.0.0\n *\n * @param string $action The action attribute for the form.\n */\nfunction wp_import_upload_form( $action ) {\n\n\t/**\n\t * Filter the maximum allowed upload size for import files.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @see wp_max_upload_size()\n\t *\n\t * @param int $max_upload_size Allowed upload size. Default 1 MB.\n\t */\n\t$bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() );\n\t$size = size_format( $bytes );\n\t$upload_dir = wp_upload_dir();\n\tif ( ! empty( $upload_dir['error'] ) ) :\n\t\t?><div class=\"error\"><p><?php _e('Before you can upload your import file, you will need to fix the following error:'); ?></p>\n\t\t<p><strong><?php echo $upload_dir['error']; ?></strong></p></div><?php\n\telse :\n?>\n<form enctype=\"multipart/form-data\" id=\"import-upload-form\" method=\"post\" class=\"wp-upload-form\" action=\"<?php echo esc_url( wp_nonce_url( $action, 'import-upload' ) ); ?>\">\n<p>\n<label for=\"upload\"><?php _e( 'Choose a file from your computer:' ); ?></label> (<?php printf( __('Maximum size: %s' ), $size ); ?>)\n<input type=\"file\" id=\"upload\" name=\"import\" size=\"25\" />\n<input type=\"hidden\" name=\"action\" value=\"save\" />\n<input type=\"hidden\" name=\"max_file_size\" value=\"<?php echo $bytes; ?>\" />\n</p>\n<?php submit_button( __('Upload file and import'), 'primary' ); ?>\n</form>\n<?php\n\tendif;\n}\n\n/**\n * Adds a meta box to one or more screens.\n *\n * @since 2.5.0\n * @since 4.4.0 The `$screen` parameter now accepts an array of screen IDs.\n *\n * @global array $wp_meta_boxes\n *\n * @param string                 $id            Meta box ID (used in the 'id' attribute for the meta box).\n * @param string                 $title         Title of the meta box.\n * @param callable               $callback      Function that fills the box with the desired content.\n *                                              The function should echo its output.\n * @param string|array|WP_Screen $screen        Optional. The screen or screens on which to show the box\n *                                              (such as a post type, 'link', or 'comment'). Accepts a single\n *                                              screen ID, WP_Screen object, or array of screen IDs. Default\n *                                              is the current screen.\n * @param string                 $context       Optional. The context within the screen where the boxes\n *                                              should display. Available contexts vary from screen to\n *                                              screen. Post edit screen contexts include 'normal', 'side',\n *                                              and 'advanced'. Comments screen contexts include 'normal'\n *                                              and 'side'. Menus meta boxes (accordion sections) all use\n *                                              the 'side' context. Global default is 'advanced'.\n * @param string                 $priority      Optional. The priority within the context where the boxes\n *                                              should show ('high', 'low'). Default 'default'.\n * @param array                  $callback_args Optional. Data that should be set as the $args property\n *                                              of the box array (which is the second parameter passed\n *                                              to your callback). Default null.\n */\nfunction add_meta_box( $id, $title, $callback, $screen = null, $context = 'advanced', $priority = 'default', $callback_args = null ) {\n\tglobal $wp_meta_boxes;\n\n\tif ( empty( $screen ) ) {\n\t\t$screen = get_current_screen();\n\t} elseif ( is_string( $screen ) ) {\n\t\t$screen = convert_to_screen( $screen );\n\t} elseif ( is_array( $screen ) ) {\n\t\tforeach ( $screen as $single_screen ) {\n\t\t\tadd_meta_box( $id, $title, $callback, $single_screen, $context, $priority, $callback_args );\n\t\t}\n\t}\n\n\tif ( ! isset( $screen->id ) ) {\n\t\treturn;\n\t}\n\n\t$page = $screen->id;\n\n\tif ( !isset($wp_meta_boxes) )\n\t\t$wp_meta_boxes = array();\n\tif ( !isset($wp_meta_boxes[$page]) )\n\t\t$wp_meta_boxes[$page] = array();\n\tif ( !isset($wp_meta_boxes[$page][$context]) )\n\t\t$wp_meta_boxes[$page][$context] = array();\n\n\tforeach ( array_keys($wp_meta_boxes[$page]) as $a_context ) {\n\t\tforeach ( array('high', 'core', 'default', 'low') as $a_priority ) {\n\t\t\tif ( !isset($wp_meta_boxes[$page][$a_context][$a_priority][$id]) )\n\t\t\t\tcontinue;\n\n\t\t\t// If a core box was previously added or removed by a plugin, don't add.\n\t\t\tif ( 'core' == $priority ) {\n\t\t\t\t// If core box previously deleted, don't add\n\t\t\t\tif ( false === $wp_meta_boxes[$page][$a_context][$a_priority][$id] )\n\t\t\t\t\treturn;\n\n\t\t\t\t/*\n\t\t\t\t * If box was added with default priority, give it core priority to\n\t\t\t\t * maintain sort order.\n\t\t\t\t */\n\t\t\t\tif ( 'default' == $a_priority ) {\n\t\t\t\t\t$wp_meta_boxes[$page][$a_context]['core'][$id] = $wp_meta_boxes[$page][$a_context]['default'][$id];\n\t\t\t\t\tunset($wp_meta_boxes[$page][$a_context]['default'][$id]);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// If no priority given and id already present, use existing priority.\n\t\t\tif ( empty($priority) ) {\n\t\t\t\t$priority = $a_priority;\n\t\t\t/*\n\t\t\t * Else, if we're adding to the sorted priority, we don't know the title\n\t\t\t * or callback. Grab them from the previously added context/priority.\n\t\t\t */\n\t\t\t} elseif ( 'sorted' == $priority ) {\n\t\t\t\t$title = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['title'];\n\t\t\t\t$callback = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['callback'];\n\t\t\t\t$callback_args = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['args'];\n\t\t\t}\n\t\t\t// An id can be in only one priority and one context.\n\t\t\tif ( $priority != $a_priority || $context != $a_context )\n\t\t\t\tunset($wp_meta_boxes[$page][$a_context][$a_priority][$id]);\n\t\t}\n\t}\n\n\tif ( empty($priority) )\n\t\t$priority = 'low';\n\n\tif ( !isset($wp_meta_boxes[$page][$context][$priority]) )\n\t\t$wp_meta_boxes[$page][$context][$priority] = array();\n\n\t$wp_meta_boxes[$page][$context][$priority][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $callback_args);\n}\n\n/**\n * Meta-Box template function\n *\n * @since 2.5.0\n *\n * @global array $wp_meta_boxes\n *\n * @staticvar bool $already_sorted\n * @param string|WP_Screen $screen  Screen identifier\n * @param string           $context box context\n * @param mixed            $object  gets passed to the box callback function as first parameter\n * @return int number of meta_boxes\n */\nfunction do_meta_boxes( $screen, $context, $object ) {\n\tglobal $wp_meta_boxes;\n\tstatic $already_sorted = false;\n\n\tif ( empty( $screen ) )\n\t\t$screen = get_current_screen();\n\telseif ( is_string( $screen ) )\n\t\t$screen = convert_to_screen( $screen );\n\n\t$page = $screen->id;\n\n\t$hidden = get_hidden_meta_boxes( $screen );\n\n\tprintf('<div id=\"%s-sortables\" class=\"meta-box-sortables\">', htmlspecialchars($context));\n\n\t// Grab the ones the user has manually sorted. Pull them out of their previous context/priority and into the one the user chose\n\tif ( ! $already_sorted && $sorted = get_user_option( \"meta-box-order_$page\" ) ) {\n\t\tforeach ( $sorted as $box_context => $ids ) {\n\t\t\tforeach ( explode( ',', $ids ) as $id ) {\n\t\t\t\tif ( $id && 'dashboard_browser_nag' !== $id ) {\n\t\t\t\t\tadd_meta_box( $id, null, null, $screen, $box_context, 'sorted' );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t$already_sorted = true;\n\n\t$i = 0;\n\n\tif ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) {\n\t\tforeach ( array( 'high', 'sorted', 'core', 'default', 'low' ) as $priority ) {\n\t\t\tif ( isset( $wp_meta_boxes[ $page ][ $context ][ $priority ]) ) {\n\t\t\t\tforeach ( (array) $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) {\n\t\t\t\t\tif ( false == $box || ! $box['title'] )\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t$i++;\n\t\t\t\t\t$hidden_class = in_array($box['id'], $hidden) ? ' hide-if-js' : '';\n\t\t\t\t\techo '<div id=\"' . $box['id'] . '\" class=\"postbox ' . postbox_classes($box['id'], $page) . $hidden_class . '\" ' . '>' . \"\\n\";\n\t\t\t\t\tif ( 'dashboard_browser_nag' != $box['id'] ) {\n\t\t\t\t\t\techo '<button type=\"button\" class=\"handlediv button-link\" aria-expanded=\"true\">';\n\t\t\t\t\t\techo '<span class=\"screen-reader-text\">' . sprintf( __( 'Toggle panel: %s' ), $box['title'] ) . '</span>';\n\t\t\t\t\t\techo '<span class=\"toggle-indicator\" aria-hidden=\"true\"></span>';\n\t\t\t\t\t\techo '</button>';\n\t\t\t\t\t}\n\t\t\t\t\techo \"<h2 class='hndle'><span>{$box['title']}</span></h2>\\n\";\n\t\t\t\t\techo '<div class=\"inside\">' . \"\\n\";\n\t\t\t\t\tcall_user_func($box['callback'], $object, $box);\n\t\t\t\t\techo \"</div>\\n\";\n\t\t\t\t\techo \"</div>\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\techo \"</div>\";\n\n\treturn $i;\n\n}\n\n/**\n * Removes a meta box from one or more screens.\n *\n * @since 2.6.0\n * @since 4.4.0 The `$screen` parameter now accepts an array of screen IDs.\n *\n * @global array $wp_meta_boxes\n *\n * @param string                 $id      Meta box ID (used in the 'id' attribute for the meta box).\n * @param string|array|WP_Screen $screen  The screen or screens on which the meta box is shown (such as a\n *                                        post type, 'link', or 'comment'). Accepts a single screen ID,\n *                                        WP_Screen object, or array of screen IDs.\n * @param string                 $context Optional. The context within the screen where the boxes\n *                                        should display. Available contexts vary from screen to\n *                                        screen. Post edit screen contexts include 'normal', 'side',\n *                                        and 'advanced'. Comments screen contexts include 'normal'\n *                                        and 'side'. Menus meta boxes (accordion sections) all use\n *                                        the 'side' context. Global default is 'advanced'.\n */\nfunction remove_meta_box( $id, $screen, $context ) {\n\tglobal $wp_meta_boxes;\n\n\tif ( empty( $screen ) ) {\n\t\t$screen = get_current_screen();\n\t} elseif ( is_string( $screen ) ) {\n\t\t$screen = convert_to_screen( $screen );\n\t} elseif ( is_array( $screen ) ) {\n\t\tforeach ( $screen as $single_screen ) {\n\t\t\tremove_meta_box( $id, $single_screen, $context );\n\t\t}\n\t}\n\n\tif ( ! isset( $screen->id ) ) {\n\t\treturn;\n\t}\n\n\t$page = $screen->id;\n\n\tif ( !isset($wp_meta_boxes) )\n\t\t$wp_meta_boxes = array();\n\tif ( !isset($wp_meta_boxes[$page]) )\n\t\t$wp_meta_boxes[$page] = array();\n\tif ( !isset($wp_meta_boxes[$page][$context]) )\n\t\t$wp_meta_boxes[$page][$context] = array();\n\n\tforeach ( array('high', 'core', 'default', 'low') as $priority )\n\t\t$wp_meta_boxes[$page][$context][$priority][$id] = false;\n}\n\n/**\n * Meta Box Accordion Template Function\n *\n * Largely made up of abstracted code from {@link do_meta_boxes()}, this\n * function serves to build meta boxes as list items for display as\n * a collapsible accordion.\n *\n * @since 3.6.0\n *\n * @uses global $wp_meta_boxes Used to retrieve registered meta boxes.\n *\n * @param string|object $screen  The screen identifier.\n * @param string        $context The meta box context.\n * @param mixed         $object  gets passed to the section callback function as first parameter.\n * @return int number of meta boxes as accordion sections.\n */\nfunction do_accordion_sections( $screen, $context, $object ) {\n\tglobal $wp_meta_boxes;\n\n\twp_enqueue_script( 'accordion' );\n\n\tif ( empty( $screen ) )\n\t\t$screen = get_current_screen();\n\telseif ( is_string( $screen ) )\n\t\t$screen = convert_to_screen( $screen );\n\n\t$page = $screen->id;\n\n\t$hidden = get_hidden_meta_boxes( $screen );\n\t?>\n\t<div id=\"side-sortables\" class=\"accordion-container\">\n\t\t<ul class=\"outer-border\">\n\t<?php\n\t$i = 0;\n\t$first_open = false;\n\n\tif ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) {\n\t\tforeach ( array( 'high', 'core', 'default', 'low' ) as $priority ) {\n\t\t\tif ( isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) {\n\t\t\t\tforeach ( $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) {\n\t\t\t\t\tif ( false == $box || ! $box['title'] )\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t$i++;\n\t\t\t\t\t$hidden_class = in_array( $box['id'], $hidden ) ? 'hide-if-js' : '';\n\n\t\t\t\t\t$open_class = '';\n\t\t\t\t\tif ( ! $first_open && empty( $hidden_class ) ) {\n\t\t\t\t\t\t$first_open = true;\n\t\t\t\t\t\t$open_class = 'open';\n\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t\t<li class=\"control-section accordion-section <?php echo $hidden_class; ?> <?php echo $open_class; ?> <?php echo esc_attr( $box['id'] ); ?>\" id=\"<?php echo esc_attr( $box['id'] ); ?>\">\n\t\t\t\t\t\t<h3 class=\"accordion-section-title hndle\" tabindex=\"0\">\n\t\t\t\t\t\t\t<?php echo esc_html( $box['title'] ); ?>\n\t\t\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Press return or enter to open this section' ); ?></span>\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<div class=\"accordion-section-content <?php postbox_classes( $box['id'], $page ); ?>\">\n\t\t\t\t\t\t\t<div class=\"inside\">\n\t\t\t\t\t\t\t\t<?php call_user_func( $box['callback'], $object, $box ); ?>\n\t\t\t\t\t\t\t</div><!-- .inside -->\n\t\t\t\t\t\t</div><!-- .accordion-section-content -->\n\t\t\t\t\t</li><!-- .accordion-section -->\n\t\t\t\t\t<?php\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t?>\n\t\t</ul><!-- .outer-border -->\n\t</div><!-- .accordion-container -->\n\t<?php\n\treturn $i;\n}\n\n/**\n * Add a new section to a settings page.\n *\n * Part of the Settings API. Use this to define new settings sections for an admin page.\n * Show settings sections in your admin page callback function with do_settings_sections().\n * Add settings fields to your section with add_settings_field()\n *\n * The $callback argument should be the name of a function that echoes out any\n * content you want to show at the top of the settings section before the actual\n * fields. It can output nothing if you want.\n *\n * @since 2.7.0\n *\n * @global $wp_settings_sections Storage array of all settings sections added to admin pages\n *\n * @param string $id       Slug-name to identify the section. Used in the 'id' attribute of tags.\n * @param string $title    Formatted title of the section. Shown as the heading for the section.\n * @param string $callback Function that echos out any content at the top of the section (between heading and fields).\n * @param string $page     The slug-name of the settings page on which to show the section. Built-in pages include 'general', 'reading', 'writing', 'discussion', 'media', etc. Create your own using add_options_page();\n */\nfunction add_settings_section($id, $title, $callback, $page) {\n\tglobal $wp_settings_sections;\n\n\tif ( 'misc' == $page ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.0', sprintf( __( 'The \"%s\" options group has been removed. Use another settings group.' ), 'misc' ) );\n\t\t$page = 'general';\n\t}\n\n\tif ( 'privacy' == $page ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.5', sprintf( __( 'The \"%s\" options group has been removed. Use another settings group.' ), 'privacy' ) );\n\t\t$page = 'reading';\n\t}\n\n\t$wp_settings_sections[$page][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback);\n}\n\n/**\n * Add a new field to a section of a settings page\n *\n * Part of the Settings API. Use this to define a settings field that will show\n * as part of a settings section inside a settings page. The fields are shown using\n * do_settings_fields() in do_settings-sections()\n *\n * The $callback argument should be the name of a function that echoes out the\n * html input tags for this setting field. Use get_option() to retrieve existing\n * values to show.\n *\n * @since 2.7.0\n * @since 4.2.0 The `$class` argument was added.\n *\n * @global $wp_settings_fields Storage array of settings fields and info about their pages/sections\n *\n * @param string $id       Slug-name to identify the field. Used in the 'id' attribute of tags.\n * @param string $title    Formatted title of the field. Shown as the label for the field\n *                         during output.\n * @param string $callback Function that fills the field with the desired form inputs. The\n *                         function should echo its output.\n * @param string $page     The slug-name of the settings page on which to show the section\n *                         (general, reading, writing, ...).\n * @param string $section  Optional. The slug-name of the section of the settings page\n *                         in which to show the box. Default 'default'.\n * @param array  $args {\n *     Optional. Extra arguments used when outputting the field.\n *\n *     @type string $label_for When supplied, the setting title will be wrapped\n *                             in a `<label>` element, its `for` attribute populated\n *                             with this value.\n *     @type string $class     CSS Class to be added to the `<tr>` element when the\n *                             field is output.\n * }\n */\nfunction add_settings_field($id, $title, $callback, $page, $section = 'default', $args = array()) {\n\tglobal $wp_settings_fields;\n\n\tif ( 'misc' == $page ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.0', __( 'The miscellaneous options group has been removed. Use another settings group.' ) );\n\t\t$page = 'general';\n\t}\n\n\tif ( 'privacy' == $page ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.5', __( 'The privacy options group has been removed. Use another settings group.' ) );\n\t\t$page = 'reading';\n\t}\n\n\t$wp_settings_fields[$page][$section][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $args);\n}\n\n/**\n * Prints out all settings sections added to a particular settings page\n *\n * Part of the Settings API. Use this in a settings page callback function\n * to output all the sections and fields that were added to that $page with\n * add_settings_section() and add_settings_field()\n *\n * @global $wp_settings_sections Storage array of all settings sections added to admin pages\n * @global $wp_settings_fields Storage array of settings fields and info about their pages/sections\n * @since 2.7.0\n *\n * @param string $page The slug name of the page whose settings sections you want to output\n */\nfunction do_settings_sections( $page ) {\n\tglobal $wp_settings_sections, $wp_settings_fields;\n\n\tif ( ! isset( $wp_settings_sections[$page] ) )\n\t\treturn;\n\n\tforeach ( (array) $wp_settings_sections[$page] as $section ) {\n\t\tif ( $section['title'] )\n\t\t\techo \"<h2>{$section['title']}</h2>\\n\";\n\n\t\tif ( $section['callback'] )\n\t\t\tcall_user_func( $section['callback'], $section );\n\n\t\tif ( ! isset( $wp_settings_fields ) || !isset( $wp_settings_fields[$page] ) || !isset( $wp_settings_fields[$page][$section['id']] ) )\n\t\t\tcontinue;\n\t\techo '<table class=\"form-table\">';\n\t\tdo_settings_fields( $page, $section['id'] );\n\t\techo '</table>';\n\t}\n}\n\n/**\n * Print out the settings fields for a particular settings section\n *\n * Part of the Settings API. Use this in a settings page to output\n * a specific section. Should normally be called by do_settings_sections()\n * rather than directly.\n *\n * @global $wp_settings_fields Storage array of settings fields and their pages/sections\n *\n * @since 2.7.0\n *\n * @param string $page Slug title of the admin page who's settings fields you want to show.\n * @param string $section Slug title of the settings section who's fields you want to show.\n */\nfunction do_settings_fields($page, $section) {\n\tglobal $wp_settings_fields;\n\n\tif ( ! isset( $wp_settings_fields[$page][$section] ) )\n\t\treturn;\n\n\tforeach ( (array) $wp_settings_fields[$page][$section] as $field ) {\n\t\t$class = '';\n\n\t\tif ( ! empty( $field['args']['class'] ) ) {\n\t\t\t$class = ' class=\"' . esc_attr( $field['args']['class'] ) . '\"';\n\t\t}\n\n\t\techo \"<tr{$class}>\";\n\n\t\tif ( ! empty( $field['args']['label_for'] ) ) {\n\t\t\techo '<th scope=\"row\"><label for=\"' . esc_attr( $field['args']['label_for'] ) . '\">' . $field['title'] . '</label></th>';\n\t\t} else {\n\t\t\techo '<th scope=\"row\">' . $field['title'] . '</th>';\n\t\t}\n\n\t\techo '<td>';\n\t\tcall_user_func($field['callback'], $field['args']);\n\t\techo '</td>';\n\t\techo '</tr>';\n\t}\n}\n\n/**\n * Register a settings error to be displayed to the user\n *\n * Part of the Settings API. Use this to show messages to users about settings validation\n * problems, missing settings or anything else.\n *\n * Settings errors should be added inside the $sanitize_callback function defined in\n * register_setting() for a given setting to give feedback about the submission.\n *\n * By default messages will show immediately after the submission that generated the error.\n * Additional calls to settings_errors() can be used to show errors even when the settings\n * page is first accessed.\n *\n * @since 3.0.0\n *\n * @global array $wp_settings_errors Storage array of errors registered during this pageload\n *\n * @param string $setting Slug title of the setting to which this error applies\n * @param string $code    Slug-name to identify the error. Used as part of 'id' attribute in HTML output.\n * @param string $message The formatted message text to display to the user (will be shown inside styled\n *                        `<div>` and `<p>` tags).\n * @param string $type    Optional. Message type, controls HTML class. Accepts 'error' or 'updated'.\n *                        Default 'error'.\n */\nfunction add_settings_error( $setting, $code, $message, $type = 'error' ) {\n\tglobal $wp_settings_errors;\n\n\t$wp_settings_errors[] = array(\n\t\t'setting' => $setting,\n\t\t'code'    => $code,\n\t\t'message' => $message,\n\t\t'type'    => $type\n\t);\n}\n\n/**\n * Fetch settings errors registered by add_settings_error()\n *\n * Checks the $wp_settings_errors array for any errors declared during the current\n * pageload and returns them.\n *\n * If changes were just submitted ($_GET['settings-updated']) and settings errors were saved\n * to the 'settings_errors' transient then those errors will be returned instead. This\n * is used to pass errors back across pageloads.\n *\n * Use the $sanitize argument to manually re-sanitize the option before returning errors.\n * This is useful if you have errors or notices you want to show even when the user\n * hasn't submitted data (i.e. when they first load an options page, or in admin_notices action hook)\n *\n * @since 3.0.0\n *\n * @global array $wp_settings_errors Storage array of errors registered during this pageload\n *\n * @param string $setting Optional slug title of a specific setting who's errors you want.\n * @param boolean $sanitize Whether to re-sanitize the setting value before returning errors.\n * @return array Array of settings errors\n */\nfunction get_settings_errors( $setting = '', $sanitize = false ) {\n\tglobal $wp_settings_errors;\n\n\t/*\n\t * If $sanitize is true, manually re-run the sanitization for this option\n\t * This allows the $sanitize_callback from register_setting() to run, adding\n\t * any settings errors you want to show by default.\n\t */\n\tif ( $sanitize )\n\t\tsanitize_option( $setting, get_option( $setting ) );\n\n\t// If settings were passed back from options.php then use them.\n\tif ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] && get_transient( 'settings_errors' ) ) {\n\t\t$wp_settings_errors = array_merge( (array) $wp_settings_errors, get_transient( 'settings_errors' ) );\n\t\tdelete_transient( 'settings_errors' );\n\t}\n\n\t// Check global in case errors have been added on this pageload.\n\tif ( ! count( $wp_settings_errors ) )\n\t\treturn array();\n\n\t// Filter the results to those of a specific setting if one was set.\n\tif ( $setting ) {\n\t\t$setting_errors = array();\n\t\tforeach ( (array) $wp_settings_errors as $key => $details ) {\n\t\t\tif ( $setting == $details['setting'] )\n\t\t\t\t$setting_errors[] = $wp_settings_errors[$key];\n\t\t}\n\t\treturn $setting_errors;\n\t}\n\n\treturn $wp_settings_errors;\n}\n\n/**\n * Display settings errors registered by {@see add_settings_error()}.\n *\n * Part of the Settings API. Outputs a div for each error retrieved by\n * {@see get_settings_errors()}.\n *\n * This is called automatically after a settings page based on the\n * Settings API is submitted. Errors should be added during the validation\n * callback function for a setting defined in {@see register_setting()}\n *\n * The $sanitize option is passed into {@see get_settings_errors()} and will\n * re-run the setting sanitization\n * on its current value.\n *\n * The $hide_on_update option will cause errors to only show when the settings\n * page is first loaded. if the user has already saved new values it will be\n * hidden to avoid repeating messages already shown in the default error\n * reporting after submission. This is useful to show general errors like\n * missing settings when the user arrives at the settings page.\n *\n * @since 3.0.0\n *\n * @param string $setting        Optional slug title of a specific setting who's errors you want.\n * @param bool   $sanitize       Whether to re-sanitize the setting value before returning errors.\n * @param bool   $hide_on_update If set to true errors will not be shown if the settings page has already been submitted.\n */\nfunction settings_errors( $setting = '', $sanitize = false, $hide_on_update = false ) {\n\n\tif ( $hide_on_update && ! empty( $_GET['settings-updated'] ) )\n\t\treturn;\n\n\t$settings_errors = get_settings_errors( $setting, $sanitize );\n\n\tif ( empty( $settings_errors ) )\n\t\treturn;\n\n\t$output = '';\n\tforeach ( $settings_errors as $key => $details ) {\n\t\t$css_id = 'setting-error-' . $details['code'];\n\t\t$css_class = $details['type'] . ' settings-error notice is-dismissible';\n\t\t$output .= \"<div id='$css_id' class='$css_class'> \\n\";\n\t\t$output .= \"<p><strong>{$details['message']}</strong></p>\";\n\t\t$output .= \"</div> \\n\";\n\t}\n\techo $output;\n}\n\n/**\n * Outputs the modal window used for attaching media to posts or pages in the media-listing screen.\n *\n * @since 2.7.0\n *\n * @param string $found_action\n */\nfunction find_posts_div($found_action = '') {\n?>\n\t<div id=\"find-posts\" class=\"find-box\" style=\"display: none;\">\n\t\t<div id=\"find-posts-head\" class=\"find-box-head\">\n\t\t\t<?php _e( 'Find Posts or Pages' ); ?>\n\t\t\t<div id=\"find-posts-close\"></div>\n\t\t</div>\n\t\t<div class=\"find-box-inside\">\n\t\t\t<div class=\"find-box-search\">\n\t\t\t\t<?php if ( $found_action ) { ?>\n\t\t\t\t\t<input type=\"hidden\" name=\"found_action\" value=\"<?php echo esc_attr($found_action); ?>\" />\n\t\t\t\t<?php } ?>\n\t\t\t\t<input type=\"hidden\" name=\"affected\" id=\"affected\" value=\"\" />\n\t\t\t\t<?php wp_nonce_field( 'find-posts', '_ajax_nonce', false ); ?>\n\t\t\t\t<label class=\"screen-reader-text\" for=\"find-posts-input\"><?php _e( 'Search' ); ?></label>\n\t\t\t\t<input type=\"text\" id=\"find-posts-input\" name=\"ps\" value=\"\" />\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t<input type=\"button\" id=\"find-posts-search\" value=\"<?php esc_attr_e( 'Search' ); ?>\" class=\"button\" />\n\t\t\t\t<div class=\"clear\"></div>\n\t\t\t</div>\n\t\t\t<div id=\"find-posts-response\"></div>\n\t\t</div>\n\t\t<div class=\"find-box-buttons\">\n\t\t\t<?php submit_button( __( 'Select' ), 'button-primary alignright', 'find-posts-submit', false ); ?>\n\t\t\t<div class=\"clear\"></div>\n\t\t</div>\n\t</div>\n<?php\n}\n\n/**\n * Display the post password.\n *\n * The password is passed through {@link esc_attr()} to ensure that it\n * is safe for placing in an html attribute.\n *\n * @since 2.7.0\n */\nfunction the_post_password() {\n\t$post = get_post();\n\tif ( isset( $post->post_password ) )\n\t\techo esc_attr( $post->post_password );\n}\n\n/**\n * Get the post title.\n *\n * The post title is fetched and if it is blank then a default string is\n * returned.\n *\n * @since 2.7.0\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.\n * @return string The post title if set.\n */\nfunction _draft_or_post_title( $post = 0 ) {\n\t$title = get_the_title( $post );\n\tif ( empty( $title ) )\n\t\t$title = __( '(no title)' );\n\treturn esc_html( $title );\n}\n\n/**\n * Display the search query.\n *\n * A simple wrapper to display the \"s\" parameter in a GET URI. This function\n * should only be used when {@link the_search_query()} cannot.\n *\n * @since 2.7.0\n */\nfunction _admin_search_query() {\n\techo isset($_REQUEST['s']) ? esc_attr( wp_unslash( $_REQUEST['s'] ) ) : '';\n}\n\n/**\n * Generic Iframe header for use with Thickbox\n *\n * @since 2.7.0\n *\n * @global string    $hook_suffix\n * @global string    $admin_body_class\n * @global WP_Locale $wp_locale\n *\n * @param string $title      Optional. Title of the Iframe page. Default empty.\n * @param bool   $deprecated Not used.\n */\nfunction iframe_header( $title = '', $deprecated = false ) {\n\tshow_admin_bar( false );\n\tglobal $hook_suffix, $admin_body_class, $wp_locale;\n\t$admin_body_class = preg_replace('/[^a-z0-9_-]+/i', '-', $hook_suffix);\n\n\t$current_screen = get_current_screen();\n\n\t@header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );\n\t_wp_admin_html_begin();\n?>\n<title><?php bloginfo('name') ?> &rsaquo; <?php echo $title ?> &#8212; <?php _e('WordPress'); ?></title>\n<?php\nwp_enqueue_style( 'colors' );\n?>\n<script type=\"text/javascript\">\naddLoadEvent = function(func){if(typeof jQuery!=\"undefined\")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};\nfunction tb_close(){var win=window.dialogArguments||opener||parent||top;win.tb_remove();}\nvar ajaxurl = '<?php echo admin_url( 'admin-ajax.php', 'relative' ); ?>',\n\tpagenow = '<?php echo $current_screen->id; ?>',\n\ttypenow = '<?php echo $current_screen->post_type; ?>',\n\tadminpage = '<?php echo $admin_body_class; ?>',\n\tthousandsSeparator = '<?php echo addslashes( $wp_locale->number_format['thousands_sep'] ); ?>',\n\tdecimalPoint = '<?php echo addslashes( $wp_locale->number_format['decimal_point'] ); ?>',\n\tisRtl = <?php echo (int) is_rtl(); ?>;\n</script>\n<?php\n/** This action is documented in wp-admin/admin-header.php */\ndo_action( 'admin_enqueue_scripts', $hook_suffix );\n\n/** This action is documented in wp-admin/admin-header.php */\ndo_action( \"admin_print_styles-$hook_suffix\" );\n\n/** This action is documented in wp-admin/admin-header.php */\ndo_action( 'admin_print_styles' );\n\n/** This action is documented in wp-admin/admin-header.php */\ndo_action( \"admin_print_scripts-$hook_suffix\" );\n\n/** This action is documented in wp-admin/admin-header.php */\ndo_action( 'admin_print_scripts' );\n\n/** This action is documented in wp-admin/admin-header.php */\ndo_action( \"admin_head-$hook_suffix\" );\n\n/** This action is documented in wp-admin/admin-header.php */\ndo_action( 'admin_head' );\n\n$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );\n\nif ( is_rtl() )\n\t$admin_body_class .= ' rtl';\n\n?>\n</head>\n<?php\n/** This filter is documented in wp-admin/admin-header.php */\n$admin_body_classes = apply_filters( 'admin_body_class', '' );\n?>\n<body<?php\n/**\n * @global string $body_id\n */\nif ( isset($GLOBALS['body_id']) ) echo ' id=\"' . $GLOBALS['body_id'] . '\"'; ?> class=\"wp-admin wp-core-ui no-js iframe <?php echo $admin_body_classes . ' ' . $admin_body_class; ?>\">\n<script type=\"text/javascript\">\n(function(){\nvar c = document.body.className;\nc = c.replace(/no-js/, 'js');\ndocument.body.className = c;\n})();\n</script>\n<?php\n}\n\n/**\n * Generic Iframe footer for use with Thickbox\n *\n * @since 2.7.0\n */\nfunction iframe_footer() {\n\t/*\n\t * We're going to hide any footer output on iFrame pages,\n\t * but run the hooks anyway since they output JavaScript\n\t * or other needed content.\n\t */\n\t ?>\n\t<div class=\"hidden\">\n<?php\n\t/** This action is documented in wp-admin/admin-footer.php */\n\tdo_action( 'admin_footer', '' );\n\n\t/** This action is documented in wp-admin/admin-footer.php */\n\tdo_action( 'admin_print_footer_scripts' );\n?>\n\t</div>\n<script type=\"text/javascript\">if(typeof wpOnload==\"function\")wpOnload();</script>\n</body>\n</html>\n<?php\n}\n\n/**\n *\n * @param WP_Post $post\n */\nfunction _post_states($post) {\n\t$post_states = array();\n\tif ( isset( $_REQUEST['post_status'] ) )\n\t\t$post_status = $_REQUEST['post_status'];\n\telse\n\t\t$post_status = '';\n\n\tif ( !empty($post->post_password) )\n\t\t$post_states['protected'] = __('Password protected');\n\tif ( 'private' == $post->post_status && 'private' != $post_status )\n\t\t$post_states['private'] = __('Private');\n\tif ( 'draft' == $post->post_status && 'draft' != $post_status )\n\t\t$post_states['draft'] = __('Draft');\n\tif ( 'pending' == $post->post_status && 'pending' != $post_status )\n\t\t/* translators: post state */\n\t\t$post_states['pending'] = _x('Pending', 'post state');\n\tif ( is_sticky($post->ID) )\n\t\t$post_states['sticky'] = __('Sticky');\n\n\tif ( 'future' === $post->post_status ) {\n\t\t$post_states['scheduled'] = __( 'Scheduled' );\n\t}\n\n\tif ( 'page' === get_option( 'show_on_front' ) ) {\n\t\tif ( intval( get_option( 'page_on_front' ) ) === $post->ID ) {\n\t\t\t$post_states['page_on_front'] = __( 'Front Page' );\n\t\t}\n\n\t\tif ( intval( get_option( 'page_for_posts' ) ) === $post->ID ) {\n\t\t\t$post_states['page_for_posts'] = __( 'Posts Page' );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the default post display states used in the posts list table.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array   $post_states An array of post display states.\n\t * @param WP_Post $post        The current post object.\n\t */\n\t$post_states = apply_filters( 'display_post_states', $post_states, $post );\n\n\tif ( ! empty($post_states) ) {\n\t\t$state_count = count($post_states);\n\t\t$i = 0;\n\t\techo ' &mdash; ';\n\t\tforeach ( $post_states as $state ) {\n\t\t\t++$i;\n\t\t\t( $i == $state_count ) ? $sep = '' : $sep = ', ';\n\t\t\techo \"<span class='post-state'>$state$sep</span>\";\n\t\t}\n\t}\n\n}\n\n/**\n *\n * @param WP_Post $post\n */\nfunction _media_states( $post ) {\n\t$media_states = array();\n\t$stylesheet = get_option('stylesheet');\n\n\tif ( current_theme_supports( 'custom-header') ) {\n\t\t$meta_header = get_post_meta($post->ID, '_wp_attachment_is_custom_header', true );\n\t\tif ( ! empty( $meta_header ) && $meta_header == $stylesheet )\n\t\t\t$media_states[] = __( 'Header Image' );\n\t}\n\n\tif ( current_theme_supports( 'custom-background') ) {\n\t\t$meta_background = get_post_meta($post->ID, '_wp_attachment_is_custom_background', true );\n\t\tif ( ! empty( $meta_background ) && $meta_background == $stylesheet )\n\t\t\t$media_states[] = __( 'Background Image' );\n\t}\n\n\tif ( $post->ID == get_option( 'site_icon' ) ) {\n\t\t$media_states[] = __( 'Site Icon' );\n\t}\n\n\t/**\n\t * Filter the default media display states for items in the Media list table.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @param array $media_states An array of media states. Default 'Header Image',\n\t *                            'Background Image', 'Site Icon'.\n\t */\n\t$media_states = apply_filters( 'display_media_states', $media_states );\n\n\tif ( ! empty( $media_states ) ) {\n\t\t$state_count = count( $media_states );\n\t\t$i = 0;\n\t\techo ' &mdash; ';\n\t\tforeach ( $media_states as $state ) {\n\t\t\t++$i;\n\t\t\t( $i == $state_count ) ? $sep = '' : $sep = ', ';\n\t\t\techo \"<span class='post-state'>$state$sep</span>\";\n\t\t}\n\t}\n}\n\n/**\n * Test support for compressing JavaScript from PHP\n *\n * Outputs JavaScript that tests if compression from PHP works as expected\n * and sets an option with the result. Has no effect when the current user\n * is not an administrator. To run the test again the option 'can_compress_scripts'\n * has to be deleted.\n *\n * @since 2.8.0\n */\nfunction compression_test() {\n?>\n\t<script type=\"text/javascript\">\n\tvar testCompression = {\n\t\tget : function(test) {\n\t\t\tvar x;\n\t\t\tif ( window.XMLHttpRequest ) {\n\t\t\t\tx = new XMLHttpRequest();\n\t\t\t} else {\n\t\t\t\ttry{x=new ActiveXObject('Msxml2.XMLHTTP');}catch(e){try{x=new ActiveXObject('Microsoft.XMLHTTP');}catch(e){};}\n\t\t\t}\n\n\t\t\tif (x) {\n\t\t\t\tx.onreadystatechange = function() {\n\t\t\t\t\tvar r, h;\n\t\t\t\t\tif ( x.readyState == 4 ) {\n\t\t\t\t\t\tr = x.responseText.substr(0, 18);\n\t\t\t\t\t\th = x.getResponseHeader('Content-Encoding');\n\t\t\t\t\t\ttestCompression.check(r, h, test);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tx.open('GET', ajaxurl + '?action=wp-compression-test&test='+test+'&'+(new Date()).getTime(), true);\n\t\t\t\tx.send('');\n\t\t\t}\n\t\t},\n\n\t\tcheck : function(r, h, test) {\n\t\t\tif ( ! r && ! test )\n\t\t\t\tthis.get(1);\n\n\t\t\tif ( 1 == test ) {\n\t\t\t\tif ( h && ( h.match(/deflate/i) || h.match(/gzip/i) ) )\n\t\t\t\t\tthis.get('no');\n\t\t\t\telse\n\t\t\t\t\tthis.get(2);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( 2 == test ) {\n\t\t\t\tif ( '\"wpCompressionTest' == r )\n\t\t\t\t\tthis.get('yes');\n\t\t\t\telse\n\t\t\t\t\tthis.get('no');\n\t\t\t}\n\t\t}\n\t};\n\ttestCompression.check();\n\t</script>\n<?php\n}\n\n/**\n * Echoes a submit button, with provided text and appropriate class(es).\n *\n * @since 3.1.0\n *\n * @see get_submit_button()\n *\n * @param string       $text             The text of the button (defaults to 'Save Changes')\n * @param string       $type             Optional. The type and CSS class(es) of the button. Core values\n *                                       include 'primary', 'secondary', 'delete'. Default 'primary'\n * @param string       $name             The HTML name of the submit button. Defaults to \"submit\". If no\n *                                       id attribute is given in $other_attributes below, $name will be\n *                                       used as the button's id.\n * @param bool         $wrap             True if the output button should be wrapped in a paragraph tag,\n *                                       false otherwise. Defaults to true\n * @param array|string $other_attributes Other attributes that should be output with the button, mapping\n *                                       attributes to their values, such as setting tabindex to 1, etc.\n *                                       These key/value attribute pairs will be output as attribute=\"value\",\n *                                       where attribute is the key. Other attributes can also be provided\n *                                       as a string such as 'tabindex=\"1\"', though the array format is\n *                                       preferred. Default null.\n */\nfunction submit_button( $text = null, $type = 'primary', $name = 'submit', $wrap = true, $other_attributes = null ) {\n\techo get_submit_button( $text, $type, $name, $wrap, $other_attributes );\n}\n\n/**\n * Returns a submit button, with provided text and appropriate class\n *\n * @since 3.1.0\n *\n * @param string       $text             Optional. The text of the button. Default 'Save Changes'.\n * @param string       $type             Optional. The type of button. Accepts 'primary', 'secondary',\n *                                       or 'delete'. Default 'primary large'.\n * @param string       $name             Optional. The HTML name of the submit button. Defaults to \"submit\".\n *                                       If no id attribute is given in $other_attributes below, `$name` will\n *                                       be used as the button's id. Default 'submit'.\n * @param bool         $wrap             Optional. True if the output button should be wrapped in a paragraph\n *                                       tag, false otherwise. Default true.\n * @param array|string $other_attributes Optional. Other attributes that should be output with the button,\n *                                       mapping attributes to their values, such as `array( 'tabindex' => '1' )`.\n *                                       These attributes will be output as `attribute=\"value\"`, such as\n *                                       `tabindex=\"1\"`. Other attributes can also be provided as a string such\n *                                       as `tabindex=\"1\"`, though the array format is typically cleaner.\n *                                       Default empty.\n * @return string Submit button HTML.\n */\nfunction get_submit_button( $text = '', $type = 'primary large', $name = 'submit', $wrap = true, $other_attributes = '' ) {\n\tif ( ! is_array( $type ) )\n\t\t$type = explode( ' ', $type );\n\n\t$button_shorthand = array( 'primary', 'small', 'large' );\n\t$classes = array( 'button' );\n\tforeach ( $type as $t ) {\n\t\tif ( 'secondary' === $t || 'button-secondary' === $t )\n\t\t\tcontinue;\n\t\t$classes[] = in_array( $t, $button_shorthand ) ? 'button-' . $t : $t;\n\t}\n\t$class = implode( ' ', array_unique( $classes ) );\n\n\tif ( 'delete' === $type )\n\t\t$class = 'button-secondary delete';\n\n\t$text = $text ? $text : __( 'Save Changes' );\n\n\t// Default the id attribute to $name unless an id was specifically provided in $other_attributes\n\t$id = $name;\n\tif ( is_array( $other_attributes ) && isset( $other_attributes['id'] ) ) {\n\t\t$id = $other_attributes['id'];\n\t\tunset( $other_attributes['id'] );\n\t}\n\n\t$attributes = '';\n\tif ( is_array( $other_attributes ) ) {\n\t\tforeach ( $other_attributes as $attribute => $value ) {\n\t\t\t$attributes .= $attribute . '=\"' . esc_attr( $value ) . '\" '; // Trailing space is important\n\t\t}\n\t} elseif ( ! empty( $other_attributes ) ) { // Attributes provided as a string\n\t\t$attributes = $other_attributes;\n\t}\n\n\t// Don't output empty name and id attributes.\n\t$name_attr = $name ? ' name=\"' . esc_attr( $name ) . '\"' : '';\n\t$id_attr = $id ? ' id=\"' . esc_attr( $id ) . '\"' : '';\n\n\t$button = '<input type=\"submit\"' . $name_attr . $id_attr . ' class=\"' . esc_attr( $class );\n\t$button\t.= '\" value=\"' . esc_attr( $text ) . '\" ' . $attributes . ' />';\n\n\tif ( $wrap ) {\n\t\t$button = '<p class=\"submit\">' . $button . '</p>';\n\t}\n\n\treturn $button;\n}\n\n/**\n *\n * @global bool $is_IE\n */\nfunction _wp_admin_html_begin() {\n\tglobal $is_IE;\n\n\t$admin_html_class = ( is_admin_bar_showing() ) ? 'wp-toolbar' : '';\n\n\tif ( $is_IE )\n\t\t@header('X-UA-Compatible: IE=edge');\n\n?>\n<!DOCTYPE html>\n<!--[if IE 8]>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" class=\"ie8 <?php echo $admin_html_class; ?>\" <?php\n\t/**\n\t * Fires inside the HTML tag in the admin header.\n\t *\n\t * @since 2.2.0\n\t */\n\tdo_action( 'admin_xml_ns' );\n?> <?php language_attributes(); ?>>\n<![endif]-->\n<!--[if !(IE 8) ]><!-->\n<html xmlns=\"http://www.w3.org/1999/xhtml\" class=\"<?php echo $admin_html_class; ?>\" <?php\n\t/** This action is documented in wp-admin/includes/template.php */\n\tdo_action( 'admin_xml_ns' );\n?> <?php language_attributes(); ?>>\n<!--<![endif]-->\n<head>\n<meta http-equiv=\"Content-Type\" content=\"<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>\" />\n<?php\n}\n\n/**\n * Convert a screen string to a screen object\n *\n * @since 3.0.0\n *\n * @param string $hook_name The hook name (also known as the hook suffix) used to determine the screen.\n * @return WP_Screen Screen object.\n */\nfunction convert_to_screen( $hook_name ) {\n\tif ( ! class_exists( 'WP_Screen', false ) ) {\n\t\t_doing_it_wrong( 'convert_to_screen(), add_meta_box()', __( \"Likely direct inclusion of wp-admin/includes/template.php in order to use add_meta_box(). This is very wrong. Hook the add_meta_box() call into the add_meta_boxes action instead.\" ), '3.3' );\n\t\treturn (object) array( 'id' => '_invalid', 'base' => '_are_belong_to_us' );\n\t}\n\n\treturn WP_Screen::get( $hook_name );\n}\n\n/**\n * Output the HTML for restoring the post data from DOM storage\n *\n * @since 3.6.0\n * @access private\n */\nfunction _local_storage_notice() {\n\t?>\n\t<div id=\"local-storage-notice\" class=\"hidden notice\">\n\t<p class=\"local-restore\">\n\t\t<?php _e('The backup of this post in your browser is different from the version below.'); ?>\n\t\t<a class=\"restore-backup\" href=\"#\"><?php _e('Restore the backup.'); ?></a>\n\t</p>\n\t<p class=\"undo-restore hidden\">\n\t\t<?php _e('Post restored successfully.'); ?>\n\t\t<a class=\"undo-restore-backup\" href=\"#\"><?php _e('Undo.'); ?></a>\n\t</p>\n\t</div>\n\t<?php\n}\n\n/**\n * Output a HTML element with a star rating for a given rating.\n *\n * Outputs a HTML element with the star rating exposed on a 0..5 scale in\n * half star increments (ie. 1, 1.5, 2 stars). Optionally, if specified, the\n * number of ratings may also be displayed by passing the $number parameter.\n *\n * @since 3.8.0\n * @since 4.4.0 Introduced the `echo` parameter.\n *\n * @param array $args {\n *     Optional. Array of star ratings arguments.\n *\n *     @type int    $rating The rating to display, expressed in either a 0.5 rating increment,\n *                          or percentage. Default 0.\n *     @type string $type   Format that the $rating is in. Valid values are 'rating' (default),\n *                          or, 'percent'. Default 'rating'.\n *     @type int    $number The number of ratings that makes up this rating. Default 0.\n *     @type bool   $echo   Whether to echo the generated markup. False to return the markup instead\n *                          of echoing it. Default true.\n * }\n */\nfunction wp_star_rating( $args = array() ) {\n\t$defaults = array(\n\t\t'rating' => 0,\n\t\t'type'   => 'rating',\n\t\t'number' => 0,\n\t\t'echo'   => true,\n\t);\n\t$r = wp_parse_args( $args, $defaults );\n\n\t// Non-english decimal places when the $rating is coming from a string\n\t$rating = str_replace( ',', '.', $r['rating'] );\n\n\t// Convert Percentage to star rating, 0..5 in .5 increments\n\tif ( 'percent' == $r['type'] ) {\n\t\t$rating = round( $rating / 10, 0 ) / 2;\n\t}\n\n\t// Calculate the number of each type of star needed\n\t$full_stars = floor( $rating );\n\t$half_stars = ceil( $rating - $full_stars );\n\t$empty_stars = 5 - $full_stars - $half_stars;\n\n\tif ( $r['number'] ) {\n\t\t/* translators: 1: The rating, 2: The number of ratings */\n\t\t$format = _n( '%1$s rating based on %2$s rating', '%1$s rating based on %2$s ratings', $r['number'] );\n\t\t$title = sprintf( $format, number_format_i18n( $rating, 1 ), number_format_i18n( $r['number'] ) );\n\t} else {\n\t\t/* translators: 1: The rating */\n\t\t$title = sprintf( __( '%s rating' ), number_format_i18n( $rating, 1 ) );\n\t}\n\n\t$output = '<div class=\"star-rating\" title=\"' . esc_attr( $title ) . '\">';\n\t$output .= '<span class=\"screen-reader-text\">' . $title . '</span>';\n\t$output .= str_repeat( '<div class=\"star star-full\"></div>', $full_stars );\n\t$output .= str_repeat( '<div class=\"star star-half\"></div>', $half_stars );\n\t$output .= str_repeat( '<div class=\"star star-empty\"></div>', $empty_stars );\n\t$output .= '</div>';\n\n\tif ( $r['echo'] ) {\n\t\techo $output;\n\t}\n\n\treturn $output;\n}\n\n/**\n * Output a notice when editing the page for posts (internal use only).\n *\n * @ignore\n * @since 4.2.0\n */\nfunction _wp_posts_page_notice() {\n\techo '<div class=\"notice notice-warning inline\"><p>' . __( 'You are currently editing the page that shows your latest posts.' ) . '</p></div>';\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/theme-install.php",
    "content": "<?php\n/**\n * WordPress Theme Install Administration API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n$themes_allowedtags = array('a' => array('href' => array(), 'title' => array(), 'target' => array()),\n\t'abbr' => array('title' => array()), 'acronym' => array('title' => array()),\n\t'code' => array(), 'pre' => array(), 'em' => array(), 'strong' => array(),\n\t'div' => array(), 'p' => array(), 'ul' => array(), 'ol' => array(), 'li' => array(),\n\t'h1' => array(), 'h2' => array(), 'h3' => array(), 'h4' => array(), 'h5' => array(), 'h6' => array(),\n\t'img' => array('src' => array(), 'class' => array(), 'alt' => array())\n);\n\n$theme_field_defaults = array( 'description' => true, 'sections' => false, 'tested' => true, 'requires' => true,\n\t'rating' => true, 'downloaded' => true, 'downloadlink' => true, 'last_updated' => true, 'homepage' => true,\n\t'tags' => true, 'num_ratings' => true\n);\n\n/**\n * Retrieve list of WordPress theme features (aka theme tags)\n *\n * @since 2.8.0\n *\n * @deprecated since 3.1.0 Use get_theme_feature_list() instead.\n *\n * @return array\n */\nfunction install_themes_feature_list() {\n\t_deprecated_function( __FUNCTION__, '3.1', 'get_theme_feature_list()' );\n\n\tif ( !$cache = get_transient( 'wporg_theme_feature_list' ) )\n\t\tset_transient( 'wporg_theme_feature_list', array(), 3 * HOUR_IN_SECONDS );\n\n\tif ( $cache )\n\t\treturn $cache;\n\n\t$feature_list = themes_api( 'feature_list', array() );\n\tif ( is_wp_error( $feature_list ) )\n\t\treturn array();\n\n\tset_transient( 'wporg_theme_feature_list', $feature_list, 3 * HOUR_IN_SECONDS );\n\n\treturn $feature_list;\n}\n\n/**\n * Display search form for searching themes.\n *\n * @since 2.8.0\n *\n * @param bool $type_selector\n */\nfunction install_theme_search_form( $type_selector = true ) {\n\t$type = isset( $_REQUEST['type'] ) ? wp_unslash( $_REQUEST['type'] ) : 'term';\n\t$term = isset( $_REQUEST['s'] ) ? wp_unslash( $_REQUEST['s'] ) : '';\n\tif ( ! $type_selector )\n\t\techo '<p class=\"install-help\">' . __( 'Search for themes by keyword.' ) . '</p>';\n\t?>\n<form id=\"search-themes\" method=\"get\">\n\t<input type=\"hidden\" name=\"tab\" value=\"search\" />\n\t<?php if ( $type_selector ) : ?>\n\t<label class=\"screen-reader-text\" for=\"typeselector\"><?php _e('Type of search'); ?></label>\n\t<select\tname=\"type\" id=\"typeselector\">\n\t<option value=\"term\" <?php selected('term', $type) ?>><?php _e('Keyword'); ?></option>\n\t<option value=\"author\" <?php selected('author', $type) ?>><?php _e('Author'); ?></option>\n\t<option value=\"tag\" <?php selected('tag', $type) ?>><?php _ex('Tag', 'Theme Installer'); ?></option>\n\t</select>\n\t<label class=\"screen-reader-text\" for=\"s\"><?php\n\tswitch ( $type ) {\n\t\tcase 'term':\n\t\t\t_e( 'Search by keyword' );\n\t\t\tbreak;\n\t\tcase 'author':\n\t\t\t_e( 'Search by author' );\n\t\t\tbreak;\n\t\tcase 'tag':\n\t\t\t_e( 'Search by tag' );\n\t\t\tbreak;\n\t}\n\t?></label>\n\t<?php else : ?>\n\t<label class=\"screen-reader-text\" for=\"s\"><?php _e('Search by keyword'); ?></label>\n\t<?php endif; ?>\n\t<input type=\"search\" name=\"s\" id=\"s\" size=\"30\" value=\"<?php echo esc_attr($term) ?>\" autofocus=\"autofocus\" />\n\t<?php submit_button( __( 'Search' ), 'button', 'search', false ); ?>\n</form>\n<?php\n}\n\n/**\n * Display tags filter for themes.\n *\n * @since 2.8.0\n */\nfunction install_themes_dashboard() {\n\tinstall_theme_search_form( false );\n?>\n<h4><?php _e('Feature Filter') ?></h4>\n<p class=\"install-help\"><?php _e( 'Find a theme based on specific features.' ); ?></p>\n\n<form method=\"get\">\n\t<input type=\"hidden\" name=\"tab\" value=\"search\" />\n\t<?php\n\t$feature_list = get_theme_feature_list();\n\techo '<div class=\"feature-filter\">';\n\n\tforeach ( (array) $feature_list as $feature_name => $features ) {\n\t\t$feature_name = esc_html( $feature_name );\n\t\techo '<div class=\"feature-name\">' . $feature_name . '</div>';\n\n\t\techo '<ol class=\"feature-group\">';\n\t\tforeach ( $features as $feature => $feature_name ) {\n\t\t\t$feature_name = esc_html( $feature_name );\n\t\t\t$feature = esc_attr($feature);\n?>\n\n<li>\n\t<input type=\"checkbox\" name=\"features[]\" id=\"feature-id-<?php echo $feature; ?>\" value=\"<?php echo $feature; ?>\" />\n\t<label for=\"feature-id-<?php echo $feature; ?>\"><?php echo $feature_name; ?></label>\n</li>\n\n<?php\t} ?>\n</ol>\n<br class=\"clear\" />\n<?php\n\t} ?>\n\n</div>\n<br class=\"clear\" />\n<?php submit_button( __( 'Find Themes' ), 'button', 'search' ); ?>\n</form>\n<?php\n}\n\n/**\n * @since 2.8.0\n */\nfunction install_themes_upload() {\n?>\n<p class=\"install-help\"><?php _e('If you have a theme in a .zip format, you may install it by uploading it here.'); ?></p>\n<form method=\"post\" enctype=\"multipart/form-data\" class=\"wp-upload-form\" action=\"<?php echo self_admin_url('update.php?action=upload-theme'); ?>\">\n\t<?php wp_nonce_field( 'theme-upload'); ?>\n\t<input type=\"file\" name=\"themezip\" />\n\t<?php submit_button( __( 'Install Now' ), 'button', 'install-theme-submit', false ); ?>\n</form>\n\t<?php\n}\n\n/**\n * Prints a theme on the Install Themes pages.\n *\n * @deprecated 3.4.0\n *\n * @global WP_Theme_Install_List_Table $wp_list_table\n *\n * @param object $theme\n */\nfunction display_theme( $theme ) {\n\t_deprecated_function( __FUNCTION__, '3.4' );\n\tglobal $wp_list_table;\n\tif ( ! isset( $wp_list_table ) ) {\n\t\t$wp_list_table = _get_list_table('WP_Theme_Install_List_Table');\n\t}\n\t$wp_list_table->prepare_items();\n\t$wp_list_table->single_row( $theme );\n}\n\n/**\n * Display theme content based on theme list.\n *\n * @since 2.8.0\n *\n * @global WP_Theme_Install_List_Table $wp_list_table\n */\nfunction display_themes() {\n\tglobal $wp_list_table;\n\n\tif ( ! isset( $wp_list_table ) ) {\n\t\t$wp_list_table = _get_list_table('WP_Theme_Install_List_Table');\n\t}\n\t$wp_list_table->prepare_items();\n\t$wp_list_table->display();\n\n}\n\n/**\n * Display theme information in dialog box form.\n *\n * @since 2.8.0\n *\n * @global WP_Theme_Install_List_Table $wp_list_table\n */\nfunction install_theme_information() {\n\tglobal $wp_list_table;\n\n\t$theme = themes_api( 'theme_information', array( 'slug' => wp_unslash( $_REQUEST['theme'] ) ) );\n\n\tif ( is_wp_error( $theme ) )\n\t\twp_die( $theme );\n\n\tiframe_header( __('Theme Install') );\n\tif ( ! isset( $wp_list_table ) ) {\n\t\t$wp_list_table = _get_list_table('WP_Theme_Install_List_Table');\n\t}\n\t$wp_list_table->theme_installer_single( $theme );\n\tiframe_footer();\n\texit;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/theme.php",
    "content": "<?php\n/**\n * WordPress Theme Administration API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Remove a theme\n *\n * @since 2.8.0\n *\n * @global WP_Filesystem_Base $wp_filesystem Subclass\n *\n * @param string $stylesheet Stylesheet of the theme to delete\n * @param string $redirect Redirect to page when complete.\n * @return void|bool|WP_Error When void, echoes content.\n */\nfunction delete_theme($stylesheet, $redirect = '') {\n\tglobal $wp_filesystem;\n\n\tif ( empty($stylesheet) )\n\t\treturn false;\n\n\tob_start();\n\tif ( empty( $redirect ) )\n\t\t$redirect = wp_nonce_url('themes.php?action=delete&stylesheet=' . urlencode( $stylesheet ), 'delete-theme_' . $stylesheet);\n\tif ( false === ($credentials = request_filesystem_credentials($redirect)) ) {\n\t\t$data = ob_get_clean();\n\n\t\tif ( ! empty($data) ){\n\t\t\tinclude_once( ABSPATH . 'wp-admin/admin-header.php');\n\t\t\techo $data;\n\t\t\tinclude( ABSPATH . 'wp-admin/admin-footer.php');\n\t\t\texit;\n\t\t}\n\t\treturn;\n\t}\n\n\tif ( ! WP_Filesystem($credentials) ) {\n\t\trequest_filesystem_credentials($redirect, '', true); // Failed to connect, Error and request again\n\t\t$data = ob_get_clean();\n\n\t\tif ( ! empty($data) ) {\n\t\t\tinclude_once( ABSPATH . 'wp-admin/admin-header.php');\n\t\t\techo $data;\n\t\t\tinclude( ABSPATH . 'wp-admin/admin-footer.php');\n\t\t\texit;\n\t\t}\n\t\treturn;\n\t}\n\n\tif ( ! is_object($wp_filesystem) )\n\t\treturn new WP_Error('fs_unavailable', __('Could not access filesystem.'));\n\n\tif ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() )\n\t\treturn new WP_Error('fs_error', __('Filesystem error.'), $wp_filesystem->errors);\n\n\t// Get the base plugin folder.\n\t$themes_dir = $wp_filesystem->wp_themes_dir();\n\tif ( empty( $themes_dir ) ) {\n\t\treturn new WP_Error( 'fs_no_themes_dir', __( 'Unable to locate WordPress theme directory.' ) );\n\t}\n\n\t$themes_dir = trailingslashit( $themes_dir );\n\t$theme_dir = trailingslashit( $themes_dir . $stylesheet );\n\t$deleted = $wp_filesystem->delete( $theme_dir, true );\n\n\tif ( ! $deleted ) {\n\t\treturn new WP_Error( 'could_not_remove_theme', sprintf( __( 'Could not fully remove the theme %s.' ), $stylesheet ) );\n\t}\n\n\t$theme_translations = wp_get_installed_translations( 'themes' );\n\n\t// Remove language files, silently.\n\tif ( ! empty( $theme_translations[ $stylesheet ] ) ) {\n\t\t$translations = $theme_translations[ $stylesheet ];\n\n\t\tforeach ( $translations as $translation => $data ) {\n\t\t\t$wp_filesystem->delete( WP_LANG_DIR . '/themes/' . $stylesheet . '-' . $translation . '.po' );\n\t\t\t$wp_filesystem->delete( WP_LANG_DIR . '/themes/' . $stylesheet . '-' . $translation . '.mo' );\n\t\t}\n\t}\n\n\t// Force refresh of theme update information.\n\tdelete_site_transient( 'update_themes' );\n\n\treturn true;\n}\n\n/**\n * Get the Page Templates available in this theme\n *\n * @since 1.5.0\n *\n * @param WP_Post|null $post Optional. The post being edited, provided for context.\n * @return array Key is the template name, value is the filename of the template\n */\nfunction get_page_templates( $post = null ) {\n\treturn array_flip( wp_get_theme()->get_page_templates( $post ) );\n}\n\n/**\n * Tidies a filename for url display by the theme editor.\n *\n * @since 2.9.0\n * @access private\n *\n * @param string $fullpath Full path to the theme file\n * @param string $containingfolder Path of the theme parent folder\n * @return string\n */\nfunction _get_template_edit_filename($fullpath, $containingfolder) {\n\treturn str_replace(dirname(dirname( $containingfolder )) , '', $fullpath);\n}\n\n/**\n * Check if there is an update for a theme available.\n *\n * Will display link, if there is an update available.\n *\n * @since 2.7.0\n * @see get_theme_update_available()\n *\n * @param WP_Theme $theme Theme data object.\n */\nfunction theme_update_available( $theme ) {\n\techo get_theme_update_available( $theme );\n}\n\n/**\n * Retrieve the update link if there is a theme update available.\n *\n * Will return a link if there is an update available.\n *\n * @since 3.8.0\n *\n * @staticvar object $themes_update\n *\n * @param WP_Theme $theme WP_Theme object.\n * @return false|string HTML for the update link, or false if invalid info was passed.\n */\nfunction get_theme_update_available( $theme ) {\n\tstatic $themes_update = null;\n\n\tif ( !current_user_can('update_themes' ) )\n\t\treturn false;\n\n\tif ( !isset($themes_update) )\n\t\t$themes_update = get_site_transient('update_themes');\n\n\tif ( ! ( $theme instanceof WP_Theme ) ) {\n\t\treturn false;\n\t}\n\n\t$stylesheet = $theme->get_stylesheet();\n\n\t$html = '';\n\n\tif ( isset($themes_update->response[ $stylesheet ]) ) {\n\t\t$update = $themes_update->response[ $stylesheet ];\n\t\t$theme_name = $theme->display('Name');\n\t\t$details_url = add_query_arg(array('TB_iframe' => 'true', 'width' => 1024, 'height' => 800), $update['url']); //Theme browser inside WP? replace this, Also, theme preview JS will override this on the available list.\n\t\t$update_url = wp_nonce_url( admin_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $stylesheet ) ), 'upgrade-theme_' . $stylesheet );\n\t\t$update_onclick = 'onclick=\"if ( confirm(\\'' . esc_js( __(\"Updating this theme will lose any customizations you have made. 'Cancel' to stop, 'OK' to update.\") ) . '\\') ) {return true;}return false;\"';\n\n\t\tif ( !is_multisite() ) {\n\t\t\tif ( ! current_user_can('update_themes') ) {\n\t\t\t\t$html = sprintf( '<p><strong>' . __( 'There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a>.' ) . '</strong></p>',\n\t\t\t\t\t$theme_name, esc_url( $details_url ), esc_attr( $theme['Name'] ), $update['new_version'] );\n\t\t\t} elseif ( empty( $update['package'] ) ) {\n\t\t\t\t$html = sprintf( '<p><strong>' . __( 'There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a>. <em>Automatic update is unavailable for this theme.</em>' ) . '</strong></p>',\n\t\t\t\t\t$theme_name, esc_url( $details_url ), esc_attr( $theme['Name'] ), $update['new_version'] );\n\t\t\t} else {\n\t\t\t\t$html = sprintf( '<p><strong>' . __( 'There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a> or <a href=\"%5$s\">update now</a>.' ) . '</strong></p>',\n\t\t\t\t\t$theme_name, esc_url( $details_url ), esc_attr( $theme['Name'] ), $update['new_version'], $update_url, $update_onclick );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $html;\n}\n\n/**\n * Retrieve list of WordPress theme features (aka theme tags)\n *\n * @since 3.1.0\n *\n * @param bool $api Optional. Whether try to fetch tags from the WordPress.org API. Defaults to true.\n * @return array Array of features keyed by category with translations keyed by slug.\n */\nfunction get_theme_feature_list( $api = true ) {\n\t// Hard-coded list is used if api not accessible.\n\t$features = array(\n\t\t\t__( 'Colors' ) => array(\n\t\t\t\t'black'   => __( 'Black' ),\n\t\t\t\t'blue'    => __( 'Blue' ),\n\t\t\t\t'brown'   => __( 'Brown' ),\n\t\t\t\t'gray'    => __( 'Gray' ),\n\t\t\t\t'green'   => __( 'Green' ),\n\t\t\t\t'orange'  => __( 'Orange' ),\n\t\t\t\t'pink'    => __( 'Pink' ),\n\t\t\t\t'purple'  => __( 'Purple' ),\n\t\t\t\t'red'     => __( 'Red' ),\n\t\t\t\t'silver'  => __( 'Silver' ),\n\t\t\t\t'tan'     => __( 'Tan' ),\n\t\t\t\t'white'   => __( 'White' ),\n\t\t\t\t'yellow'  => __( 'Yellow' ),\n\t\t\t\t'dark'    => __( 'Dark' ),\n\t\t\t\t'light'   => __( 'Light' ),\n\t\t\t),\n\n\t\t__( 'Layout' ) => array(\n\t\t\t'fixed-layout'      => __( 'Fixed Layout' ),\n\t\t\t'fluid-layout'      => __( 'Fluid Layout' ),\n\t\t\t'responsive-layout' => __( 'Responsive Layout' ),\n\t\t\t'one-column'    => __( 'One Column' ),\n\t\t\t'two-columns'   => __( 'Two Columns' ),\n\t\t\t'three-columns' => __( 'Three Columns' ),\n\t\t\t'four-columns'  => __( 'Four Columns' ),\n\t\t\t'left-sidebar'  => __( 'Left Sidebar' ),\n\t\t\t'right-sidebar' => __( 'Right Sidebar' ),\n\t\t),\n\n\t\t__( 'Features' ) => array(\n\t\t\t'accessibility-ready'   => __( 'Accessibility Ready' ),\n\t\t\t'blavatar'              => __( 'Blavatar' ),\n\t\t\t'buddypress'            => __( 'BuddyPress' ),\n\t\t\t'custom-background'     => __( 'Custom Background' ),\n\t\t\t'custom-colors'         => __( 'Custom Colors' ),\n\t\t\t'custom-header'         => __( 'Custom Header' ),\n\t\t\t'custom-menu'           => __( 'Custom Menu' ),\n\t\t\t'editor-style'          => __( 'Editor Style' ),\n\t\t\t'featured-image-header' => __( 'Featured Image Header' ),\n\t\t\t'featured-images'       => __( 'Featured Images' ),\n\t\t\t'flexible-header'       => __( 'Flexible Header' ),\n\t\t\t'front-page-post-form'  => __( 'Front Page Posting' ),\n\t\t\t'full-width-template'   => __( 'Full Width Template' ),\n\t\t\t'microformats'          => __( 'Microformats' ),\n\t\t\t'post-formats'          => __( 'Post Formats' ),\n\t\t\t'rtl-language-support'  => __( 'RTL Language Support' ),\n\t\t\t'sticky-post'           => __( 'Sticky Post' ),\n\t\t\t'theme-options'         => __( 'Theme Options' ),\n\t\t\t'threaded-comments'     => __( 'Threaded Comments' ),\n\t\t\t'translation-ready'     => __( 'Translation Ready' ),\n\t\t),\n\n\t\t__( 'Subject' )  => array(\n\t\t\t'holiday'       => __( 'Holiday' ),\n\t\t\t'photoblogging' => __( 'Photoblogging' ),\n\t\t\t'seasonal'      => __( 'Seasonal' ),\n\t\t)\n\t);\n\n\tif ( ! $api || ! current_user_can( 'install_themes' ) )\n\t\treturn $features;\n\n\tif ( !$feature_list = get_site_transient( 'wporg_theme_feature_list' ) )\n\t\tset_site_transient( 'wporg_theme_feature_list', array(), 3 * HOUR_IN_SECONDS );\n\n\tif ( !$feature_list ) {\n\t\t$feature_list = themes_api( 'feature_list', array() );\n\t\tif ( is_wp_error( $feature_list ) )\n\t\t\treturn $features;\n\t}\n\n\tif ( !$feature_list )\n\t\treturn $features;\n\n\tset_site_transient( 'wporg_theme_feature_list', $feature_list, 3 * HOUR_IN_SECONDS );\n\n\t$category_translations = array(\n\t\t'Colors'   => __( 'Colors' ),\n\t\t'Layout'   => __( 'Layout' ),\n\t\t'Features' => __( 'Features' ),\n\t\t'Subject'  => __( 'Subject' )\n\t);\n\n\t// Loop over the wporg canonical list and apply translations\n\t$wporg_features = array();\n\tforeach ( (array) $feature_list as $feature_category => $feature_items ) {\n\t\tif ( isset($category_translations[$feature_category]) )\n\t\t\t$feature_category = $category_translations[$feature_category];\n\t\t$wporg_features[$feature_category] = array();\n\n\t\tforeach ( $feature_items as $feature ) {\n\t\t\tif ( isset($features[$feature_category][$feature]) )\n\t\t\t\t$wporg_features[$feature_category][$feature] = $features[$feature_category][$feature];\n\t\t\telse\n\t\t\t\t$wporg_features[$feature_category][$feature] = $feature;\n\t\t}\n\t}\n\n\treturn $wporg_features;\n}\n\n/**\n * Retrieves theme installer pages from the WordPress.org Themes API.\n *\n * It is possible for a theme to override the Themes API result with three\n * filters. Assume this is for themes, which can extend on the Theme Info to\n * offer more choices. This is very powerful and must be used with care, when\n * overriding the filters.\n *\n * The first filter, {@see 'themes_api_args'}, is for the args and gives the action\n * as the second parameter. The hook for {@see 'themes_api_args'} must ensure that\n * an object is returned.\n *\n * The second filter, {@see 'themes_api'}, allows a plugin to override the WordPress.org\n * Theme API entirely. If `$action` is 'query_themes', 'theme_information', or 'feature_list',\n * an object MUST be passed. If `$action` is 'hot_tags`, an array should be passed.\n *\n * Finally, the third filter, {@see 'themes_api_result'}, makes it possible to filter the\n * response object or array, depending on the `$action` type.\n *\n * Supported arguments per action:\n *\n * | Argument Name      | 'query_themes' | 'theme_information' | 'hot_tags' | 'feature_list'   |\n * | -------------------| :------------: | :-----------------: | :--------: | :--------------: |\n * | `$slug`            | No             |  Yes                | No         | No               |\n * | `$per_page`        | Yes            |  No                 | No         | No               |\n * | `$page`            | Yes            |  No                 | No         | No               |\n * | `$number`          | No             |  No                 | Yes        | No               |\n * | `$search`          | Yes            |  No                 | No         | No               |\n * | `$tag`             | Yes            |  No                 | No         | No               |\n * | `$author`          | Yes            |  No                 | No         | No               |\n * | `$user`            | Yes            |  No                 | No         | No               |\n * | `$browse`          | Yes            |  No                 | No         | No               |\n * | `$locale`          | Yes            |  Yes                | No         | No               |\n * | `$fields`          | Yes            |  Yes                | No         | No               |\n *\n * @since 2.8.0\n *\n * @param string       $action API action to perform: 'query_themes', 'theme_information',\n *                             'hot_tags' or 'feature_list'.\n * @param array|object $args   {\n *     Optional. Array or object of arguments to serialize for the Plugin Info API.\n *\n *     @type string  $slug     The plugin slug. Default empty.\n *     @type int     $per_page Number of themes per page. Default 24.\n *     @type int     $page     Number of current page. Default 1.\n *     @type int     $number   Number of tags to be queried.\n *     @type string  $search   A search term. Default empty.\n *     @type string  $tag      Tag to filter themes. Default empty.\n *     @type string  $author   Username of an author to filter themes. Default empty.\n *     @type string  $user     Username to query for their favorites. Default empty.\n *     @type string  $browse   Browse view: 'featured', 'popular', 'updated', 'favorites'.\n *     @type string  $locale   Locale to provide context-sensitive results. Default is the value of get_locale().\n *     @type array   $fields   {\n *         Array of fields which should or should not be returned.\n *\n *         @type bool $description        Whether to return the theme full description. Default false.\n *         @type bool $sections           Whether to return the theme readme sections: description, installation,\n *                                        FAQ, screenshots, other notes, and changelog. Default false.\n *         @type bool $rating             Whether to return the rating in percent and total number of ratings.\n *                                        Default false.\n *         @type bool $ratings            Whether to return the number of rating for each star (1-5). Default false.\n *         @type bool $downloaded         Whether to return the download count. Default false.\n *         @type bool $downloadlink       Whether to return the download link for the package. Default false.\n *         @type bool $last_updated       Whether to return the date of the last update. Default false.\n *         @type bool $tags               Whether to return the assigned tags. Default false.\n *         @type bool $homepage           Whether to return the theme homepage link. Default false.\n *         @type bool $screenshots        Whether to return the screenshots. Default false.\n *         @type int  $screenshot_count   Number of screenshots to return. Default 1.\n *         @type bool $screenshot_url     Whether to return the URL of the first screenshot. Default false.\n *         @type bool $photon_screenshots Whether to return the screenshots via Photon. Default false.\n *         @type bool $template           Whether to return the slug of the parent theme. Default false.\n *         @type bool $parent             Whether to return the slug, name and homepage of the parent theme. Default false.\n *         @type bool $versions           Whether to return the list of all available versions. Default false.\n *         @type bool $theme_url          Whether to return theme's URL. Default false.\n *         @type bool $extended_author    Whether to return nicename or nicename and display name. Default false.\n *     }\n * }\n * @return object|array|WP_Error Response object or array on success, WP_Error on failure. See the\n *         {@link https://developer.wordpress.org/reference/functions/themes_api/ function reference article}\n *         for more information on the make-up of possible return objects depending on the value of `$action`.\n */\nfunction themes_api( $action, $args = array() ) {\n\n\tif ( is_array( $args ) ) {\n\t\t$args = (object) $args;\n\t}\n\n\tif ( ! isset( $args->per_page ) ) {\n\t\t$args->per_page = 24;\n\t}\n\n\tif ( ! isset( $args->locale ) ) {\n\t\t$args->locale = get_locale();\n\t}\n\n\t/**\n\t * Filter arguments used to query for installer pages from the WordPress.org Themes API.\n\t *\n\t * Important: An object MUST be returned to this filter.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param object $args   Arguments used to query for installer pages from the WordPress.org Themes API.\n\t * @param string $action Requested action. Likely values are 'theme_information',\n\t *                       'feature_list', or 'query_themes'.\n\t */\n\t$args = apply_filters( 'themes_api_args', $args, $action );\n\n\t/**\n\t * Filter whether to override the WordPress.org Themes API.\n\t *\n\t * Passing a non-false value will effectively short-circuit the WordPress.org API request.\n\t *\n\t * If `$action` is 'query_themes', 'theme_information', or 'feature_list', an object MUST\n\t * be passed. If `$action` is 'hot_tags`, an array should be passed.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param false|object|array $override Whether to override the WordPress.org Themes API. Default false.\n\t * @param string             $action   Requested action. Likely values are 'theme_information',\n\t *                                    'feature_list', or 'query_themes'.\n\t * @param object             $args     Arguments used to query for installer pages from the Themes API.\n\t */\n\t$res = apply_filters( 'themes_api', false, $action, $args );\n\n\tif ( ! $res ) {\n\t\t$url = $http_url = 'http://api.wordpress.org/themes/info/1.0/';\n\t\tif ( $ssl = wp_http_supports( array( 'ssl' ) ) )\n\t\t\t$url = set_url_scheme( $url, 'https' );\n\n\t\t$http_args = array(\n\t\t\t'body' => array(\n\t\t\t\t'action' => $action,\n\t\t\t\t'request' => serialize( $args )\n\t\t\t)\n\t\t);\n\t\t$request = wp_remote_post( $url, $http_args );\n\n\t\tif ( $ssl && is_wp_error( $request ) ) {\n\t\t\tif ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) {\n\t\t\t\ttrigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );\n\t\t\t}\n\t\t\t$request = wp_remote_post( $http_url, $http_args );\n\t\t}\n\n\t\tif ( is_wp_error($request) ) {\n\t\t\t$res = new WP_Error('themes_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ), $request->get_error_message() );\n\t\t} else {\n\t\t\t$res = maybe_unserialize( wp_remote_retrieve_body( $request ) );\n\t\t\tif ( ! is_object( $res ) && ! is_array( $res ) )\n\t\t\t\t$res = new WP_Error('themes_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ), wp_remote_retrieve_body( $request ) );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the returned WordPress.org Themes API response.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array|object $res    WordPress.org Themes API response.\n\t * @param string       $action Requested action. Likely values are 'theme_information',\n\t *                             'feature_list', or 'query_themes'.\n\t * @param object       $args   Arguments used to query for installer pages from the WordPress.org Themes API.\n\t */\n\treturn apply_filters( 'themes_api_result', $res, $action, $args );\n}\n\n/**\n * Prepare themes for JavaScript.\n *\n * @since 3.8.0\n *\n * @param array $themes Optional. Array of WP_Theme objects to prepare.\n *                      Defaults to all allowed themes.\n *\n * @return array An associative array of theme data, sorted by name.\n */\nfunction wp_prepare_themes_for_js( $themes = null ) {\n\t$current_theme = get_stylesheet();\n\n\t/**\n\t * Filter theme data before it is prepared for JavaScript.\n\t *\n\t * Passing a non-empty array will result in wp_prepare_themes_for_js() returning\n\t * early with that value instead.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param array      $prepared_themes An associative array of theme data. Default empty array.\n\t * @param null|array $themes          An array of WP_Theme objects to prepare, if any.\n\t * @param string     $current_theme   The current theme slug.\n\t */\n\t$prepared_themes = (array) apply_filters( 'pre_prepare_themes_for_js', array(), $themes, $current_theme );\n\n\tif ( ! empty( $prepared_themes ) ) {\n\t\treturn $prepared_themes;\n\t}\n\n\t// Make sure the current theme is listed first.\n\t$prepared_themes[ $current_theme ] = array();\n\n\tif ( null === $themes ) {\n\t\t$themes = wp_get_themes( array( 'allowed' => true ) );\n\t\tif ( ! isset( $themes[ $current_theme ] ) ) {\n\t\t\t$themes[ $current_theme ] = wp_get_theme();\n\t\t}\n\t}\n\n\t$updates = array();\n\tif ( current_user_can( 'update_themes' ) ) {\n\t\t$updates_transient = get_site_transient( 'update_themes' );\n\t\tif ( isset( $updates_transient->response ) ) {\n\t\t\t$updates = $updates_transient->response;\n\t\t}\n\t}\n\n\tWP_Theme::sort_by_name( $themes );\n\n\t$parents = array();\n\n\tforeach ( $themes as $theme ) {\n\t\t$slug = $theme->get_stylesheet();\n\t\t$encoded_slug = urlencode( $slug );\n\n\t\t$parent = false;\n\t\tif ( $theme->parent() ) {\n\t\t\t$parent = $theme->parent()->display( 'Name' );\n\t\t\t$parents[ $slug ] = $theme->parent()->get_stylesheet();\n\t\t}\n\n\t\t$customize_action = null;\n\t\tif ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {\n\t\t\t$customize_action = esc_url( add_query_arg(\n\t\t\t\tarray(\n\t\t\t\t\t'return' => urlencode( esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ),\n\t\t\t\t),\n\t\t\t\twp_customize_url( $slug )\n\t\t\t) );\n\t\t}\n\n\t\t$prepared_themes[ $slug ] = array(\n\t\t\t'id'           => $slug,\n\t\t\t'name'         => $theme->display( 'Name' ),\n\t\t\t'screenshot'   => array( $theme->get_screenshot() ), // @todo multiple\n\t\t\t'description'  => $theme->display( 'Description' ),\n\t\t\t'author'       => $theme->display( 'Author', false, true ),\n\t\t\t'authorAndUri' => $theme->display( 'Author' ),\n\t\t\t'version'      => $theme->display( 'Version' ),\n\t\t\t'tags'         => $theme->display( 'Tags' ),\n\t\t\t'parent'       => $parent,\n\t\t\t'active'       => $slug === $current_theme,\n\t\t\t'hasUpdate'    => isset( $updates[ $slug ] ),\n\t\t\t'update'       => get_theme_update_available( $theme ),\n\t\t\t'actions'      => array(\n\t\t\t\t'activate' => current_user_can( 'switch_themes' ) ? wp_nonce_url( admin_url( 'themes.php?action=activate&amp;stylesheet=' . $encoded_slug ), 'switch-theme_' . $slug ) : null,\n\t\t\t\t'customize' => $customize_action,\n\t\t\t\t'delete'   => current_user_can( 'delete_themes' ) ? wp_nonce_url( admin_url( 'themes.php?action=delete&amp;stylesheet=' . $encoded_slug ), 'delete-theme_' . $slug ) : null,\n\t\t\t),\n\t\t);\n\t}\n\n\t// Remove 'delete' action if theme has an active child\n\tif ( ! empty( $parents ) && array_key_exists( $current_theme, $parents ) ) {\n\t\tunset( $prepared_themes[ $parents[ $current_theme ] ]['actions']['delete'] );\n\t}\n\n\t/**\n\t * Filter the themes prepared for JavaScript, for themes.php.\n\t *\n\t * Could be useful for changing the order, which is by name by default.\n\t *\n\t * @since 3.8.0\n\t *\n\t * @param array $prepared_themes Array of themes.\n\t */\n\t$prepared_themes = apply_filters( 'wp_prepare_themes_for_js', $prepared_themes );\n\t$prepared_themes = array_values( $prepared_themes );\n\treturn array_filter( $prepared_themes );\n}\n\n/**\n * Print JS templates for the theme-browsing UI in the Customizer.\n *\n * @since 4.2.0\n */\nfunction customize_themes_print_templates() {\n\t$preview_url = esc_url( add_query_arg( 'theme', '__THEME__' ) ); // Token because esc_url() strips curly braces.\n\t$preview_url = str_replace( '__THEME__', '{{ data.id }}', $preview_url );\n\t?>\n\t<script type=\"text/html\" id=\"tmpl-customize-themes-details-view\">\n\t\t<div class=\"theme-backdrop\"></div>\n\t\t<div class=\"theme-wrap\">\n\t\t\t<div class=\"theme-header\">\n\t\t\t\t<button type=\"button\" class=\"left dashicons dashicons-no\"><span class=\"screen-reader-text\"><?php _e( 'Show previous theme' ); ?></span></button>\n\t\t\t\t<button type=\"button\" class=\"right dashicons dashicons-no\"><span class=\"screen-reader-text\"><?php _e( 'Show next theme' ); ?></span></button>\n\t\t\t\t<button type=\"button\" class=\"close dashicons dashicons-no\"><span class=\"screen-reader-text\"><?php _e( 'Close details dialog' ); ?></span></button>\n\t\t\t</div>\n\t\t\t<div class=\"theme-about\">\n\t\t\t\t<div class=\"theme-screenshots\">\n\t\t\t\t<# if ( data.screenshot[0] ) { #>\n\t\t\t\t\t<div class=\"screenshot\"><img src=\"{{ data.screenshot[0] }}\" alt=\"\" /></div>\n\t\t\t\t<# } else { #>\n\t\t\t\t\t<div class=\"screenshot blank\"></div>\n\t\t\t\t<# } #>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"theme-info\">\n\t\t\t\t\t<# if ( data.active ) { #>\n\t\t\t\t\t\t<span class=\"current-label\"><?php _e( 'Current Theme' ); ?></span>\n\t\t\t\t\t<# } #>\n\t\t\t\t\t<h2 class=\"theme-name\">{{{ data.name }}}<span class=\"theme-version\"><?php printf( __( 'Version: %s' ), '{{ data.version }}' ); ?></span></h2>\n\t\t\t\t\t<h3 class=\"theme-author\"><?php printf( __( 'By %s' ), '{{{ data.authorAndUri }}}' ); ?></h3>\n\t\t\t\t\t<p class=\"theme-description\">{{{ data.description }}}</p>\n\n\t\t\t\t\t<# if ( data.parent ) { #>\n\t\t\t\t\t\t<p class=\"parent-theme\"><?php printf( __( 'This is a child theme of %s.' ), '<strong>{{{ data.parent }}}</strong>' ); ?></p>\n\t\t\t\t\t<# } #>\n\n\t\t\t\t\t<# if ( data.tags ) { #>\n\t\t\t\t\t\t<p class=\"theme-tags\"><span><?php _e( 'Tags:' ); ?></span> {{ data.tags }}</p>\n\t\t\t\t\t<# } #>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<# if ( ! data.active ) { #>\n\t\t\t\t<div class=\"theme-actions\">\n\t\t\t\t\t<div class=\"inactive-theme\">\n\t\t\t\t\t\t<a href=\"<?php echo $preview_url; ?>\" target=\"_top\" class=\"button button-primary\"><?php _e( 'Live Preview' ); ?></a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t<# } #>\n\t\t</div>\n\t</script>\n\t<?php\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/translation-install.php",
    "content": "<?php\n/**\n * WordPress Translation Install Administration API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n\n/**\n * Retrieve translations from WordPress Translation API.\n *\n * @since 4.0.0\n *\n * @param string       $type Type of translations. Accepts 'plugins', 'themes', 'core'.\n * @param array|object $args Translation API arguments. Optional.\n * @return object|WP_Error On success an object of translations, WP_Error on failure.\n */\nfunction translations_api( $type, $args = null ) {\n\tinclude( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version\n\n\tif ( ! in_array( $type, array( 'plugins', 'themes', 'core' ) ) ) {\n\t\treturn\tnew WP_Error( 'invalid_type', __( 'Invalid translation type.' ) );\n\t}\n\n\t/**\n\t * Allows a plugin to override the WordPress.org Translation Install API entirely.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param bool|array  $result The result object. Default false.\n\t * @param string      $type   The type of translations being requested.\n\t * @param object      $args   Translation API arguments.\n\t */\n\t$res = apply_filters( 'translations_api', false, $type, $args );\n\n\tif ( false === $res ) {\n\t\t$url = $http_url = 'http://api.wordpress.org/translations/' . $type . '/1.0/';\n\t\tif ( $ssl = wp_http_supports( array( 'ssl' ) ) ) {\n\t\t\t$url = set_url_scheme( $url, 'https' );\n\t\t}\n\n\t\t$options = array(\n\t\t\t'timeout' => 3,\n\t\t\t'body' => array(\n\t\t\t\t'wp_version' => $wp_version,\n\t\t\t\t'locale'     => get_locale(),\n\t\t\t\t'version'    => $args['version'], // Version of plugin, theme or core\n\t\t\t),\n\t\t);\n\n\t\tif ( 'core' !== $type ) {\n\t\t\t$options['body']['slug'] = $args['slug']; // Plugin or theme slug\n\t\t}\n\n\t\t$request = wp_remote_post( $url, $options );\n\n\t\tif ( $ssl && is_wp_error( $request ) ) {\n\t\t\ttrigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );\n\n\t\t\t$request = wp_remote_post( $http_url, $options );\n\t\t}\n\n\t\tif ( is_wp_error( $request ) ) {\n\t\t\t$res = new WP_Error( 'translations_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ), $request->get_error_message() );\n\t\t} else {\n\t\t\t$res = json_decode( wp_remote_retrieve_body( $request ), true );\n\t\t\tif ( ! is_object( $res ) && ! is_array( $res ) ) {\n\t\t\t\t$res = new WP_Error( 'translations_api_failed', __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ), wp_remote_retrieve_body( $request ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter the Translation Install API response results.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param object|WP_Error $res  Response object or WP_Error.\n\t * @param string          $type The type of translations being requested.\n\t * @param object          $args Translation API arguments.\n\t */\n\treturn apply_filters( 'translations_api_result', $res, $type, $args );\n}\n\n/**\n * Get available translations from the WordPress.org API.\n *\n * @since 4.0.0\n *\n * @see translations_api()\n *\n * @return array Array of translations, each an array of data. If the API response results\n *               in an error, an empty array will be returned.\n */\nfunction wp_get_available_translations() {\n\tif ( ! wp_installing() && false !== ( $translations = get_site_transient( 'available_translations' ) ) ) {\n\t\treturn $translations;\n\t}\n\n\tinclude( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version\n\n\t$api = translations_api( 'core', array( 'version' => $wp_version ) );\n\n\tif ( is_wp_error( $api ) || empty( $api['translations'] ) ) {\n\t\treturn array();\n\t}\n\n\t$translations = array();\n\t// Key the array with the language code for now.\n\tforeach ( $api['translations'] as $translation ) {\n\t\t$translations[ $translation['language'] ] = $translation;\n\t}\n\n\tif ( ! defined( 'WP_INSTALLING' ) ) {\n\t\tset_site_transient( 'available_translations', $translations, 3 * HOUR_IN_SECONDS );\n\t}\n\n\treturn $translations;\n}\n\n/**\n * Output the select form for the language selection on the installation screen.\n *\n * @since 4.0.0\n *\n * @global string $wp_local_package\n *\n * @param array $languages Array of available languages (populated via the Translation API).\n */\nfunction wp_install_language_form( $languages ) {\n\tglobal $wp_local_package;\n\n\t$installed_languages = get_available_languages();\n\n\techo \"<label class='screen-reader-text' for='language'>Select a default language</label>\\n\";\n\techo \"<select size='14' name='language' id='language'>\\n\";\n\techo '<option value=\"\" lang=\"en\" selected=\"selected\" data-continue=\"Continue\" data-installed=\"1\">English (United States)</option>';\n\techo \"\\n\";\n\n\tif ( ! empty( $wp_local_package ) && isset( $languages[ $wp_local_package ] ) ) {\n\t\tif ( isset( $languages[ $wp_local_package ] ) ) {\n\t\t\t$language = $languages[ $wp_local_package ];\n\t\t\tprintf( '<option value=\"%s\" lang=\"%s\" data-continue=\"%s\"%s>%s</option>' . \"\\n\",\n\t\t\t\tesc_attr( $language['language'] ),\n\t\t\t\tesc_attr( current( $language['iso'] ) ),\n\t\t\t\tesc_attr( $language['strings']['continue'] ),\n\t\t\t\tin_array( $language['language'], $installed_languages ) ? ' data-installed=\"1\"' : '',\n\t\t\t\tesc_html( $language['native_name'] ) );\n\n\t\t\tunset( $languages[ $wp_local_package ] );\n\t\t}\n\t}\n\n\tforeach ( $languages as $language ) {\n\t\tprintf( '<option value=\"%s\" lang=\"%s\" data-continue=\"%s\"%s>%s</option>' . \"\\n\",\n\t\t\tesc_attr( $language['language'] ),\n\t\t\tesc_attr( current( $language['iso'] ) ),\n\t\t\tesc_attr( $language['strings']['continue'] ),\n\t\t\tin_array( $language['language'], $installed_languages ) ? ' data-installed=\"1\"' : '',\n\t\t\tesc_html( $language['native_name'] ) );\n\t}\n\techo \"</select>\\n\";\n\techo '<p class=\"step\"><span class=\"spinner\"></span><input id=\"language-continue\" type=\"submit\" class=\"button button-primary button-large\" value=\"Continue\" /></p>';\n}\n\n/**\n * Download a language pack.\n *\n * @since 4.0.0\n *\n * @see wp_get_available_translations()\n *\n * @param string $download Language code to download.\n * @return string|bool Returns the language code if successfully downloaded\n *                     (or already installed), or false on failure.\n */\nfunction wp_download_language_pack( $download ) {\n\t// Check if the translation is already installed.\n\tif ( in_array( $download, get_available_languages() ) ) {\n\t\treturn $download;\n\t}\n\n\tif ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS ) {\n\t\treturn false;\n\t}\n\n\t// Confirm the translation is one we can download.\n\t$translations = wp_get_available_translations();\n\tif ( ! $translations ) {\n\t\treturn false;\n\t}\n\tforeach ( $translations as $translation ) {\n\t\tif ( $translation['language'] === $download ) {\n\t\t\t$translation_to_load = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( empty( $translation_to_load ) ) {\n\t\treturn false;\n\t}\n\t$translation = (object) $translation;\n\n\trequire_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';\n\t$skin = new Automatic_Upgrader_Skin;\n\t$upgrader = new Language_Pack_Upgrader( $skin );\n\t$translation->type = 'core';\n\t$result = $upgrader->upgrade( $translation, array( 'clear_update_cache' => false ) );\n\n\tif ( ! $result || is_wp_error( $result ) ) {\n\t\treturn false;\n\t}\n\n\treturn $translation->language;\n}\n\n/**\n * Check if WordPress has access to the filesystem without asking for\n * credentials.\n *\n * @since 4.0.0\n *\n * @return bool Returns true on success, false on failure.\n */\nfunction wp_can_install_language_pack() {\n\tif ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS ) {\n\t\treturn false;\n\t}\n\n\trequire_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';\n\t$skin = new Automatic_Upgrader_Skin;\n\t$upgrader = new Language_Pack_Upgrader( $skin );\n\t$upgrader->init();\n\n\t$check = $upgrader->fs_connect( array( WP_CONTENT_DIR, WP_LANG_DIR ) );\n\n\tif ( ! $check || is_wp_error( $check ) ) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/update-core.php",
    "content": "<?php\n/**\n * WordPress core upgrade functionality.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 2.7.0\n */\n\n/**\n * Stores files to be deleted.\n *\n * @since 2.7.0\n * @global array $_old_files\n * @var array\n * @name $_old_files\n */\nglobal $_old_files;\n\n$_old_files = array(\n// 2.0\n'wp-admin/import-b2.php',\n'wp-admin/import-blogger.php',\n'wp-admin/import-greymatter.php',\n'wp-admin/import-livejournal.php',\n'wp-admin/import-mt.php',\n'wp-admin/import-rss.php',\n'wp-admin/import-textpattern.php',\n'wp-admin/quicktags.js',\n'wp-images/fade-butt.png',\n'wp-images/get-firefox.png',\n'wp-images/header-shadow.png',\n'wp-images/smilies',\n'wp-images/wp-small.png',\n'wp-images/wpminilogo.png',\n'wp.php',\n// 2.0.8\n'wp-includes/js/tinymce/plugins/inlinepopups/readme.txt',\n// 2.1\n'wp-admin/edit-form-ajax-cat.php',\n'wp-admin/execute-pings.php',\n'wp-admin/inline-uploading.php',\n'wp-admin/link-categories.php',\n'wp-admin/list-manipulation.js',\n'wp-admin/list-manipulation.php',\n'wp-includes/comment-functions.php',\n'wp-includes/feed-functions.php',\n'wp-includes/functions-compat.php',\n'wp-includes/functions-formatting.php',\n'wp-includes/functions-post.php',\n'wp-includes/js/dbx-key.js',\n'wp-includes/js/tinymce/plugins/autosave/langs/cs.js',\n'wp-includes/js/tinymce/plugins/autosave/langs/sv.js',\n'wp-includes/links.php',\n'wp-includes/pluggable-functions.php',\n'wp-includes/template-functions-author.php',\n'wp-includes/template-functions-category.php',\n'wp-includes/template-functions-general.php',\n'wp-includes/template-functions-links.php',\n'wp-includes/template-functions-post.php',\n'wp-includes/wp-l10n.php',\n// 2.2\n'wp-admin/cat-js.php',\n'wp-admin/import/b2.php',\n'wp-includes/js/autosave-js.php',\n'wp-includes/js/list-manipulation-js.php',\n'wp-includes/js/wp-ajax-js.php',\n// 2.3\n'wp-admin/admin-db.php',\n'wp-admin/cat.js',\n'wp-admin/categories.js',\n'wp-admin/custom-fields.js',\n'wp-admin/dbx-admin-key.js',\n'wp-admin/edit-comments.js',\n'wp-admin/install-rtl.css',\n'wp-admin/install.css',\n'wp-admin/upgrade-schema.php',\n'wp-admin/upload-functions.php',\n'wp-admin/upload-rtl.css',\n'wp-admin/upload.css',\n'wp-admin/upload.js',\n'wp-admin/users.js',\n'wp-admin/widgets-rtl.css',\n'wp-admin/widgets.css',\n'wp-admin/xfn.js',\n'wp-includes/js/tinymce/license.html',\n// 2.5\n'wp-admin/css/upload.css',\n'wp-admin/images/box-bg-left.gif',\n'wp-admin/images/box-bg-right.gif',\n'wp-admin/images/box-bg.gif',\n'wp-admin/images/box-butt-left.gif',\n'wp-admin/images/box-butt-right.gif',\n'wp-admin/images/box-butt.gif',\n'wp-admin/images/box-head-left.gif',\n'wp-admin/images/box-head-right.gif',\n'wp-admin/images/box-head.gif',\n'wp-admin/images/heading-bg.gif',\n'wp-admin/images/login-bkg-bottom.gif',\n'wp-admin/images/login-bkg-tile.gif',\n'wp-admin/images/notice.gif',\n'wp-admin/images/toggle.gif',\n'wp-admin/includes/upload.php',\n'wp-admin/js/dbx-admin-key.js',\n'wp-admin/js/link-cat.js',\n'wp-admin/profile-update.php',\n'wp-admin/templates.php',\n'wp-includes/images/wlw/WpComments.png',\n'wp-includes/images/wlw/WpIcon.png',\n'wp-includes/images/wlw/WpWatermark.png',\n'wp-includes/js/dbx.js',\n'wp-includes/js/fat.js',\n'wp-includes/js/list-manipulation.js',\n'wp-includes/js/tinymce/langs/en.js',\n'wp-includes/js/tinymce/plugins/autosave/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/autosave/langs',\n'wp-includes/js/tinymce/plugins/directionality/images',\n'wp-includes/js/tinymce/plugins/directionality/langs',\n'wp-includes/js/tinymce/plugins/inlinepopups/css',\n'wp-includes/js/tinymce/plugins/inlinepopups/images',\n'wp-includes/js/tinymce/plugins/inlinepopups/jscripts',\n'wp-includes/js/tinymce/plugins/paste/images',\n'wp-includes/js/tinymce/plugins/paste/jscripts',\n'wp-includes/js/tinymce/plugins/paste/langs',\n'wp-includes/js/tinymce/plugins/spellchecker/classes/HttpClient.class.php',\n'wp-includes/js/tinymce/plugins/spellchecker/classes/TinyGoogleSpell.class.php',\n'wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspell.class.php',\n'wp-includes/js/tinymce/plugins/spellchecker/classes/TinyPspellShell.class.php',\n'wp-includes/js/tinymce/plugins/spellchecker/css/spellchecker.css',\n'wp-includes/js/tinymce/plugins/spellchecker/images',\n'wp-includes/js/tinymce/plugins/spellchecker/langs',\n'wp-includes/js/tinymce/plugins/spellchecker/tinyspell.php',\n'wp-includes/js/tinymce/plugins/wordpress/images',\n'wp-includes/js/tinymce/plugins/wordpress/langs',\n'wp-includes/js/tinymce/plugins/wordpress/wordpress.css',\n'wp-includes/js/tinymce/plugins/wphelp',\n'wp-includes/js/tinymce/themes/advanced/css',\n'wp-includes/js/tinymce/themes/advanced/images',\n'wp-includes/js/tinymce/themes/advanced/jscripts',\n'wp-includes/js/tinymce/themes/advanced/langs',\n// 2.5.1\n'wp-includes/js/tinymce/tiny_mce_gzip.php',\n// 2.6\n'wp-admin/bookmarklet.php',\n'wp-includes/js/jquery/jquery.dimensions.min.js',\n'wp-includes/js/tinymce/plugins/wordpress/popups.css',\n'wp-includes/js/wp-ajax.js',\n// 2.7\n'wp-admin/css/press-this-ie-rtl.css',\n'wp-admin/css/press-this-ie.css',\n'wp-admin/css/upload-rtl.css',\n'wp-admin/edit-form.php',\n'wp-admin/images/comment-pill.gif',\n'wp-admin/images/comment-stalk-classic.gif',\n'wp-admin/images/comment-stalk-fresh.gif',\n'wp-admin/images/comment-stalk-rtl.gif',\n'wp-admin/images/del.png',\n'wp-admin/images/gear.png',\n'wp-admin/images/media-button-gallery.gif',\n'wp-admin/images/media-buttons.gif',\n'wp-admin/images/postbox-bg.gif',\n'wp-admin/images/tab.png',\n'wp-admin/images/tail.gif',\n'wp-admin/js/forms.js',\n'wp-admin/js/upload.js',\n'wp-admin/link-import.php',\n'wp-includes/images/audio.png',\n'wp-includes/images/css.png',\n'wp-includes/images/default.png',\n'wp-includes/images/doc.png',\n'wp-includes/images/exe.png',\n'wp-includes/images/html.png',\n'wp-includes/images/js.png',\n'wp-includes/images/pdf.png',\n'wp-includes/images/swf.png',\n'wp-includes/images/tar.png',\n'wp-includes/images/text.png',\n'wp-includes/images/video.png',\n'wp-includes/images/zip.png',\n'wp-includes/js/tinymce/tiny_mce_config.php',\n'wp-includes/js/tinymce/tiny_mce_ext.js',\n// 2.8\n'wp-admin/js/users.js',\n'wp-includes/js/swfupload/plugins/swfupload.documentready.js',\n'wp-includes/js/swfupload/plugins/swfupload.graceful_degradation.js',\n'wp-includes/js/swfupload/swfupload_f9.swf',\n'wp-includes/js/tinymce/plugins/autosave',\n'wp-includes/js/tinymce/plugins/paste/css',\n'wp-includes/js/tinymce/utils/mclayer.js',\n'wp-includes/js/tinymce/wordpress.css',\n// 2.8.5\n'wp-admin/import/btt.php',\n'wp-admin/import/jkw.php',\n// 2.9\n'wp-admin/js/page.dev.js',\n'wp-admin/js/page.js',\n'wp-admin/js/set-post-thumbnail-handler.dev.js',\n'wp-admin/js/set-post-thumbnail-handler.js',\n'wp-admin/js/slug.dev.js',\n'wp-admin/js/slug.js',\n'wp-includes/gettext.php',\n'wp-includes/js/tinymce/plugins/wordpress/js',\n'wp-includes/streams.php',\n// MU\n'README.txt',\n'htaccess.dist',\n'index-install.php',\n'wp-admin/css/mu-rtl.css',\n'wp-admin/css/mu.css',\n'wp-admin/images/site-admin.png',\n'wp-admin/includes/mu.php',\n'wp-admin/wpmu-admin.php',\n'wp-admin/wpmu-blogs.php',\n'wp-admin/wpmu-edit.php',\n'wp-admin/wpmu-options.php',\n'wp-admin/wpmu-themes.php',\n'wp-admin/wpmu-upgrade-site.php',\n'wp-admin/wpmu-users.php',\n'wp-includes/images/wordpress-mu.png',\n'wp-includes/wpmu-default-filters.php',\n'wp-includes/wpmu-functions.php',\n'wpmu-settings.php',\n// 3.0\n'wp-admin/categories.php',\n'wp-admin/edit-category-form.php',\n'wp-admin/edit-page-form.php',\n'wp-admin/edit-pages.php',\n'wp-admin/images/admin-header-footer.png',\n'wp-admin/images/browse-happy.gif',\n'wp-admin/images/ico-add.png',\n'wp-admin/images/ico-close.png',\n'wp-admin/images/ico-edit.png',\n'wp-admin/images/ico-viewpage.png',\n'wp-admin/images/fav-top.png',\n'wp-admin/images/screen-options-left.gif',\n'wp-admin/images/wp-logo-vs.gif',\n'wp-admin/images/wp-logo.gif',\n'wp-admin/import',\n'wp-admin/js/wp-gears.dev.js',\n'wp-admin/js/wp-gears.js',\n'wp-admin/options-misc.php',\n'wp-admin/page-new.php',\n'wp-admin/page.php',\n'wp-admin/rtl.css',\n'wp-admin/rtl.dev.css',\n'wp-admin/update-links.php',\n'wp-admin/wp-admin.css',\n'wp-admin/wp-admin.dev.css',\n'wp-includes/js/codepress',\n'wp-includes/js/codepress/engines/khtml.js',\n'wp-includes/js/codepress/engines/older.js',\n'wp-includes/js/jquery/autocomplete.dev.js',\n'wp-includes/js/jquery/autocomplete.js',\n'wp-includes/js/jquery/interface.js',\n'wp-includes/js/scriptaculous/prototype.js',\n'wp-includes/js/tinymce/wp-tinymce.js',\n// 3.1\n'wp-admin/edit-attachment-rows.php',\n'wp-admin/edit-link-categories.php',\n'wp-admin/edit-link-category-form.php',\n'wp-admin/edit-post-rows.php',\n'wp-admin/images/button-grad-active-vs.png',\n'wp-admin/images/button-grad-vs.png',\n'wp-admin/images/fav-arrow-vs-rtl.gif',\n'wp-admin/images/fav-arrow-vs.gif',\n'wp-admin/images/fav-top-vs.gif',\n'wp-admin/images/list-vs.png',\n'wp-admin/images/screen-options-right-up.gif',\n'wp-admin/images/screen-options-right.gif',\n'wp-admin/images/visit-site-button-grad-vs.gif',\n'wp-admin/images/visit-site-button-grad.gif',\n'wp-admin/link-category.php',\n'wp-admin/sidebar.php',\n'wp-includes/classes.php',\n'wp-includes/js/tinymce/blank.htm',\n'wp-includes/js/tinymce/plugins/media/css/content.css',\n'wp-includes/js/tinymce/plugins/media/img',\n'wp-includes/js/tinymce/plugins/safari',\n// 3.2\n'wp-admin/images/logo-login.gif',\n'wp-admin/images/star.gif',\n'wp-admin/js/list-table.dev.js',\n'wp-admin/js/list-table.js',\n'wp-includes/default-embeds.php',\n'wp-includes/js/tinymce/plugins/wordpress/img/help.gif',\n'wp-includes/js/tinymce/plugins/wordpress/img/more.gif',\n'wp-includes/js/tinymce/plugins/wordpress/img/toolbars.gif',\n'wp-includes/js/tinymce/themes/advanced/img/fm.gif',\n'wp-includes/js/tinymce/themes/advanced/img/sflogo.png',\n// 3.3\n'wp-admin/css/colors-classic-rtl.css',\n'wp-admin/css/colors-classic-rtl.dev.css',\n'wp-admin/css/colors-fresh-rtl.css',\n'wp-admin/css/colors-fresh-rtl.dev.css',\n'wp-admin/css/dashboard-rtl.dev.css',\n'wp-admin/css/dashboard.dev.css',\n'wp-admin/css/global-rtl.css',\n'wp-admin/css/global-rtl.dev.css',\n'wp-admin/css/global.css',\n'wp-admin/css/global.dev.css',\n'wp-admin/css/install-rtl.dev.css',\n'wp-admin/css/login-rtl.dev.css',\n'wp-admin/css/login.dev.css',\n'wp-admin/css/ms.css',\n'wp-admin/css/ms.dev.css',\n'wp-admin/css/nav-menu-rtl.css',\n'wp-admin/css/nav-menu-rtl.dev.css',\n'wp-admin/css/nav-menu.css',\n'wp-admin/css/nav-menu.dev.css',\n'wp-admin/css/plugin-install-rtl.css',\n'wp-admin/css/plugin-install-rtl.dev.css',\n'wp-admin/css/plugin-install.css',\n'wp-admin/css/plugin-install.dev.css',\n'wp-admin/css/press-this-rtl.dev.css',\n'wp-admin/css/press-this.dev.css',\n'wp-admin/css/theme-editor-rtl.css',\n'wp-admin/css/theme-editor-rtl.dev.css',\n'wp-admin/css/theme-editor.css',\n'wp-admin/css/theme-editor.dev.css',\n'wp-admin/css/theme-install-rtl.css',\n'wp-admin/css/theme-install-rtl.dev.css',\n'wp-admin/css/theme-install.css',\n'wp-admin/css/theme-install.dev.css',\n'wp-admin/css/widgets-rtl.dev.css',\n'wp-admin/css/widgets.dev.css',\n'wp-admin/includes/internal-linking.php',\n'wp-includes/images/admin-bar-sprite-rtl.png',\n'wp-includes/js/jquery/ui.button.js',\n'wp-includes/js/jquery/ui.core.js',\n'wp-includes/js/jquery/ui.dialog.js',\n'wp-includes/js/jquery/ui.draggable.js',\n'wp-includes/js/jquery/ui.droppable.js',\n'wp-includes/js/jquery/ui.mouse.js',\n'wp-includes/js/jquery/ui.position.js',\n'wp-includes/js/jquery/ui.resizable.js',\n'wp-includes/js/jquery/ui.selectable.js',\n'wp-includes/js/jquery/ui.sortable.js',\n'wp-includes/js/jquery/ui.tabs.js',\n'wp-includes/js/jquery/ui.widget.js',\n'wp-includes/js/l10n.dev.js',\n'wp-includes/js/l10n.js',\n'wp-includes/js/tinymce/plugins/wplink/css',\n'wp-includes/js/tinymce/plugins/wplink/img',\n'wp-includes/js/tinymce/plugins/wplink/js',\n'wp-includes/js/tinymce/themes/advanced/img/wpicons.png',\n'wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/butt2.png',\n'wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/button_bg.png',\n'wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/down_arrow.gif',\n'wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/fade-butt.png',\n'wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/separator.gif',\n// Don't delete, yet: 'wp-rss.php',\n// Don't delete, yet: 'wp-rdf.php',\n// Don't delete, yet: 'wp-rss2.php',\n// Don't delete, yet: 'wp-commentsrss2.php',\n// Don't delete, yet: 'wp-atom.php',\n// Don't delete, yet: 'wp-feed.php',\n// 3.4\n'wp-admin/images/gray-star.png',\n'wp-admin/images/logo-login.png',\n'wp-admin/images/star.png',\n'wp-admin/index-extra.php',\n'wp-admin/network/index-extra.php',\n'wp-admin/user/index-extra.php',\n'wp-admin/images/screenshots/admin-flyouts.png',\n'wp-admin/images/screenshots/coediting.png',\n'wp-admin/images/screenshots/drag-and-drop.png',\n'wp-admin/images/screenshots/help-screen.png',\n'wp-admin/images/screenshots/media-icon.png',\n'wp-admin/images/screenshots/new-feature-pointer.png',\n'wp-admin/images/screenshots/welcome-screen.png',\n'wp-includes/css/editor-buttons.css',\n'wp-includes/css/editor-buttons.dev.css',\n'wp-includes/js/tinymce/plugins/paste/blank.htm',\n'wp-includes/js/tinymce/plugins/wordpress/css',\n'wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js',\n'wp-includes/js/tinymce/plugins/wordpress/img/embedded.png',\n'wp-includes/js/tinymce/plugins/wordpress/img/more_bug.gif',\n'wp-includes/js/tinymce/plugins/wordpress/img/page_bug.gif',\n'wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.dev.js',\n'wp-includes/js/tinymce/plugins/wpeditimage/css/editimage-rtl.css',\n'wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.dev.js',\n'wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.dev.js',\n'wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.dev.js',\n'wp-includes/js/tinymce/plugins/wpgallery/img/gallery.png',\n'wp-includes/js/tinymce/plugins/wplink/editor_plugin.dev.js',\n// Don't delete, yet: 'wp-pass.php',\n// Don't delete, yet: 'wp-register.php',\n// 3.5\n'wp-admin/gears-manifest.php',\n'wp-admin/includes/manifest.php',\n'wp-admin/images/archive-link.png',\n'wp-admin/images/blue-grad.png',\n'wp-admin/images/button-grad-active.png',\n'wp-admin/images/button-grad.png',\n'wp-admin/images/ed-bg-vs.gif',\n'wp-admin/images/ed-bg.gif',\n'wp-admin/images/fade-butt.png',\n'wp-admin/images/fav-arrow-rtl.gif',\n'wp-admin/images/fav-arrow.gif',\n'wp-admin/images/fav-vs.png',\n'wp-admin/images/fav.png',\n'wp-admin/images/gray-grad.png',\n'wp-admin/images/loading-publish.gif',\n'wp-admin/images/logo-ghost.png',\n'wp-admin/images/logo.gif',\n'wp-admin/images/menu-arrow-frame-rtl.png',\n'wp-admin/images/menu-arrow-frame.png',\n'wp-admin/images/menu-arrows.gif',\n'wp-admin/images/menu-bits-rtl-vs.gif',\n'wp-admin/images/menu-bits-rtl.gif',\n'wp-admin/images/menu-bits-vs.gif',\n'wp-admin/images/menu-bits.gif',\n'wp-admin/images/menu-dark-rtl-vs.gif',\n'wp-admin/images/menu-dark-rtl.gif',\n'wp-admin/images/menu-dark-vs.gif',\n'wp-admin/images/menu-dark.gif',\n'wp-admin/images/required.gif',\n'wp-admin/images/screen-options-toggle-vs.gif',\n'wp-admin/images/screen-options-toggle.gif',\n'wp-admin/images/toggle-arrow-rtl.gif',\n'wp-admin/images/toggle-arrow.gif',\n'wp-admin/images/upload-classic.png',\n'wp-admin/images/upload-fresh.png',\n'wp-admin/images/white-grad-active.png',\n'wp-admin/images/white-grad.png',\n'wp-admin/images/widgets-arrow-vs.gif',\n'wp-admin/images/widgets-arrow.gif',\n'wp-admin/images/wpspin_dark.gif',\n'wp-includes/images/upload.png',\n'wp-includes/js/prototype.js',\n'wp-includes/js/scriptaculous',\n'wp-admin/css/wp-admin-rtl.dev.css',\n'wp-admin/css/wp-admin.dev.css',\n'wp-admin/css/media-rtl.dev.css',\n'wp-admin/css/media.dev.css',\n'wp-admin/css/colors-classic.dev.css',\n'wp-admin/css/customize-controls-rtl.dev.css',\n'wp-admin/css/customize-controls.dev.css',\n'wp-admin/css/ie-rtl.dev.css',\n'wp-admin/css/ie.dev.css',\n'wp-admin/css/install.dev.css',\n'wp-admin/css/colors-fresh.dev.css',\n'wp-includes/js/customize-base.dev.js',\n'wp-includes/js/json2.dev.js',\n'wp-includes/js/comment-reply.dev.js',\n'wp-includes/js/customize-preview.dev.js',\n'wp-includes/js/wplink.dev.js',\n'wp-includes/js/tw-sack.dev.js',\n'wp-includes/js/wp-list-revisions.dev.js',\n'wp-includes/js/autosave.dev.js',\n'wp-includes/js/admin-bar.dev.js',\n'wp-includes/js/quicktags.dev.js',\n'wp-includes/js/wp-ajax-response.dev.js',\n'wp-includes/js/wp-pointer.dev.js',\n'wp-includes/js/hoverIntent.dev.js',\n'wp-includes/js/colorpicker.dev.js',\n'wp-includes/js/wp-lists.dev.js',\n'wp-includes/js/customize-loader.dev.js',\n'wp-includes/js/jquery/jquery.table-hotkeys.dev.js',\n'wp-includes/js/jquery/jquery.color.dev.js',\n'wp-includes/js/jquery/jquery.color.js',\n'wp-includes/js/jquery/jquery.hotkeys.dev.js',\n'wp-includes/js/jquery/jquery.form.dev.js',\n'wp-includes/js/jquery/suggest.dev.js',\n'wp-admin/js/xfn.dev.js',\n'wp-admin/js/set-post-thumbnail.dev.js',\n'wp-admin/js/comment.dev.js',\n'wp-admin/js/theme.dev.js',\n'wp-admin/js/cat.dev.js',\n'wp-admin/js/password-strength-meter.dev.js',\n'wp-admin/js/user-profile.dev.js',\n'wp-admin/js/theme-preview.dev.js',\n'wp-admin/js/post.dev.js',\n'wp-admin/js/media-upload.dev.js',\n'wp-admin/js/word-count.dev.js',\n'wp-admin/js/plugin-install.dev.js',\n'wp-admin/js/edit-comments.dev.js',\n'wp-admin/js/media-gallery.dev.js',\n'wp-admin/js/custom-fields.dev.js',\n'wp-admin/js/custom-background.dev.js',\n'wp-admin/js/common.dev.js',\n'wp-admin/js/inline-edit-tax.dev.js',\n'wp-admin/js/gallery.dev.js',\n'wp-admin/js/utils.dev.js',\n'wp-admin/js/widgets.dev.js',\n'wp-admin/js/wp-fullscreen.dev.js',\n'wp-admin/js/nav-menu.dev.js',\n'wp-admin/js/dashboard.dev.js',\n'wp-admin/js/link.dev.js',\n'wp-admin/js/user-suggest.dev.js',\n'wp-admin/js/postbox.dev.js',\n'wp-admin/js/tags.dev.js',\n'wp-admin/js/image-edit.dev.js',\n'wp-admin/js/media.dev.js',\n'wp-admin/js/customize-controls.dev.js',\n'wp-admin/js/inline-edit-post.dev.js',\n'wp-admin/js/categories.dev.js',\n'wp-admin/js/editor.dev.js',\n'wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.dev.js',\n'wp-includes/js/tinymce/plugins/wpdialogs/js/popup.dev.js',\n'wp-includes/js/tinymce/plugins/wpdialogs/js/wpdialog.dev.js',\n'wp-includes/js/plupload/handlers.dev.js',\n'wp-includes/js/plupload/wp-plupload.dev.js',\n'wp-includes/js/swfupload/handlers.dev.js',\n'wp-includes/js/jcrop/jquery.Jcrop.dev.js',\n'wp-includes/js/jcrop/jquery.Jcrop.js',\n'wp-includes/js/jcrop/jquery.Jcrop.css',\n'wp-includes/js/imgareaselect/jquery.imgareaselect.dev.js',\n'wp-includes/css/wp-pointer.dev.css',\n'wp-includes/css/editor.dev.css',\n'wp-includes/css/jquery-ui-dialog.dev.css',\n'wp-includes/css/admin-bar-rtl.dev.css',\n'wp-includes/css/admin-bar.dev.css',\n'wp-includes/js/jquery/ui/jquery.effects.clip.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.scale.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.blind.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.core.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.shake.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.fade.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.explode.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.slide.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.drop.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.highlight.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.bounce.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.pulsate.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.transfer.min.js',\n'wp-includes/js/jquery/ui/jquery.effects.fold.min.js',\n'wp-admin/images/screenshots/captions-1.png',\n'wp-admin/images/screenshots/captions-2.png',\n'wp-admin/images/screenshots/flex-header-1.png',\n'wp-admin/images/screenshots/flex-header-2.png',\n'wp-admin/images/screenshots/flex-header-3.png',\n'wp-admin/images/screenshots/flex-header-media-library.png',\n'wp-admin/images/screenshots/theme-customizer.png',\n'wp-admin/images/screenshots/twitter-embed-1.png',\n'wp-admin/images/screenshots/twitter-embed-2.png',\n'wp-admin/js/utils.js',\n'wp-admin/options-privacy.php',\n'wp-app.php',\n'wp-includes/class-wp-atom-server.php',\n'wp-includes/js/tinymce/themes/advanced/skins/wp_theme/ui.css',\n// 3.5.2\n'wp-includes/js/swfupload/swfupload-all.js',\n// 3.6\n'wp-admin/js/revisions-js.php',\n'wp-admin/images/screenshots',\n'wp-admin/js/categories.js',\n'wp-admin/js/categories.min.js',\n'wp-admin/js/custom-fields.js',\n'wp-admin/js/custom-fields.min.js',\n// 3.7\n'wp-admin/js/cat.js',\n'wp-admin/js/cat.min.js',\n'wp-includes/js/tinymce/plugins/wpeditimage/js/editimage.min.js',\n// 3.8\n'wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/page_bug.gif',\n'wp-includes/js/tinymce/themes/advanced/skins/wp_theme/img/more_bug.gif',\n'wp-includes/js/thickbox/tb-close-2x.png',\n'wp-includes/js/thickbox/tb-close.png',\n'wp-includes/images/wpmini-blue-2x.png',\n'wp-includes/images/wpmini-blue.png',\n'wp-admin/css/colors-fresh.css',\n'wp-admin/css/colors-classic.css',\n'wp-admin/css/colors-fresh.min.css',\n'wp-admin/css/colors-classic.min.css',\n'wp-admin/js/about.min.js',\n'wp-admin/js/about.js',\n'wp-admin/images/arrows-dark-vs-2x.png',\n'wp-admin/images/wp-logo-vs.png',\n'wp-admin/images/arrows-dark-vs.png',\n'wp-admin/images/wp-logo.png',\n'wp-admin/images/arrows-pr.png',\n'wp-admin/images/arrows-dark.png',\n'wp-admin/images/press-this.png',\n'wp-admin/images/press-this-2x.png',\n'wp-admin/images/arrows-vs-2x.png',\n'wp-admin/images/welcome-icons.png',\n'wp-admin/images/wp-logo-2x.png',\n'wp-admin/images/stars-rtl-2x.png',\n'wp-admin/images/arrows-dark-2x.png',\n'wp-admin/images/arrows-pr-2x.png',\n'wp-admin/images/menu-shadow-rtl.png',\n'wp-admin/images/arrows-vs.png',\n'wp-admin/images/about-search-2x.png',\n'wp-admin/images/bubble_bg-rtl-2x.gif',\n'wp-admin/images/wp-badge-2x.png',\n'wp-admin/images/wordpress-logo-2x.png',\n'wp-admin/images/bubble_bg-rtl.gif',\n'wp-admin/images/wp-badge.png',\n'wp-admin/images/menu-shadow.png',\n'wp-admin/images/about-globe-2x.png',\n'wp-admin/images/welcome-icons-2x.png',\n'wp-admin/images/stars-rtl.png',\n'wp-admin/images/wp-logo-vs-2x.png',\n'wp-admin/images/about-updates-2x.png',\n// 3.9\n'wp-admin/css/colors.css',\n'wp-admin/css/colors.min.css',\n'wp-admin/css/colors-rtl.css',\n'wp-admin/css/colors-rtl.min.css',\n'wp-admin/css/media-rtl.min.css',\n'wp-admin/css/media.min.css',\n'wp-admin/css/farbtastic-rtl.min.css',\n'wp-admin/images/lock-2x.png',\n'wp-admin/images/lock.png',\n'wp-admin/js/theme-preview.js',\n'wp-admin/js/theme-install.min.js',\n'wp-admin/js/theme-install.js',\n'wp-admin/js/theme-preview.min.js',\n'wp-includes/js/plupload/plupload.html4.js',\n'wp-includes/js/plupload/plupload.html5.js',\n'wp-includes/js/plupload/changelog.txt',\n'wp-includes/js/plupload/plupload.silverlight.js',\n'wp-includes/js/plupload/plupload.flash.js',\n'wp-includes/js/plupload/plupload.js',\n'wp-includes/js/tinymce/plugins/spellchecker',\n'wp-includes/js/tinymce/plugins/inlinepopups',\n'wp-includes/js/tinymce/plugins/media/js',\n'wp-includes/js/tinymce/plugins/media/css',\n'wp-includes/js/tinymce/plugins/wordpress/img',\n'wp-includes/js/tinymce/plugins/wpdialogs/js',\n'wp-includes/js/tinymce/plugins/wpeditimage/img',\n'wp-includes/js/tinymce/plugins/wpeditimage/js',\n'wp-includes/js/tinymce/plugins/wpeditimage/css',\n'wp-includes/js/tinymce/plugins/wpgallery/img',\n'wp-includes/js/tinymce/plugins/wpfullscreen/css',\n'wp-includes/js/tinymce/plugins/paste/js',\n'wp-includes/js/tinymce/themes/advanced',\n'wp-includes/js/tinymce/tiny_mce.js',\n'wp-includes/js/tinymce/mark_loaded_src.js',\n'wp-includes/js/tinymce/wp-tinymce-schema.js',\n'wp-includes/js/tinymce/plugins/media/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/media/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/media/media.htm',\n'wp-includes/js/tinymce/plugins/wpview/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/wpview/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/directionality/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/directionality/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/wordpress/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/wpdialogs/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/wpeditimage/editimage.html',\n'wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/wpeditimage/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/fullscreen/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/fullscreen/fullscreen.htm',\n'wp-includes/js/tinymce/plugins/fullscreen/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/wplink/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/wplink/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/wpgallery/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/wpgallery/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/tabfocus/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/tabfocus/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/wpfullscreen/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/paste/editor_plugin.js',\n'wp-includes/js/tinymce/plugins/paste/pasteword.htm',\n'wp-includes/js/tinymce/plugins/paste/editor_plugin_src.js',\n'wp-includes/js/tinymce/plugins/paste/pastetext.htm',\n'wp-includes/js/tinymce/langs/wp-langs.php',\n// 4.1\n'wp-includes/js/jquery/ui/jquery.ui.accordion.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.autocomplete.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.button.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.core.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.datepicker.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.dialog.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.draggable.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.droppable.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-blind.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-bounce.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-clip.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-drop.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-explode.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-fade.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-fold.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-highlight.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-pulsate.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-scale.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-shake.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-slide.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect-transfer.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.effect.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.menu.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.mouse.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.position.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.progressbar.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.resizable.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.selectable.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.slider.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.sortable.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.spinner.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.tabs.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.tooltip.min.js',\n'wp-includes/js/jquery/ui/jquery.ui.widget.min.js',\n'wp-includes/js/tinymce/skins/wordpress/images/dashicon-no-alt.png',\n// 4.3\n'wp-admin/js/wp-fullscreen.js',\n'wp-admin/js/wp-fullscreen.min.js',\n'wp-includes/js/tinymce/wp-mce-help.php',\n'wp-includes/js/tinymce/plugins/wpfullscreen',\n);\n\n/**\n * Stores new files in wp-content to copy\n *\n * The contents of this array indicate any new bundled plugins/themes which\n * should be installed with the WordPress Upgrade. These items will not be\n * re-installed in future upgrades, this behaviour is controlled by the\n * introduced version present here being older than the current installed version.\n *\n * The content of this array should follow the following format:\n * Filename (relative to wp-content) => Introduced version\n * Directories should be noted by suffixing it with a trailing slash (/)\n *\n * @since 3.2.0\n * @since 4.4.0 New themes are not automatically installed on upgrade.\n *              This can still be explicitly asked for by defining\n *              CORE_UPGRADE_SKIP_NEW_BUNDLED as false.\n * @global array $_new_bundled_files\n * @var array\n * @name $_new_bundled_files\n */\nglobal $_new_bundled_files;\n\n$_new_bundled_files = array(\n\t'plugins/akismet/'       => '2.0',\n\t'themes/twentyten/'      => '3.0',\n\t'themes/twentyeleven/'   => '3.2',\n\t'themes/twentytwelve/'   => '3.5',\n\t'themes/twentythirteen/' => '3.6',\n\t'themes/twentyfourteen/' => '3.8',\n\t'themes/twentyfifteen/'  => '4.1',\n\t'themes/twentysixteen/'  => '4.4',\n);\n\n// If not explicitly defined as false, don't install new default themes.\nif ( ! defined( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || CORE_UPGRADE_SKIP_NEW_BUNDLED ) {\n\t$_new_bundled_files = array( 'plugins/akismet/' => '2.0' );\n}\n\n/**\n * Upgrade the core of WordPress.\n *\n * This will create a .maintenance file at the base of the WordPress directory\n * to ensure that people can not access the web site, when the files are being\n * copied to their locations.\n *\n * The files in the {@link $_old_files} list will be removed and the new files\n * copied from the zip file after the database is upgraded.\n *\n * The files in the {@link $_new_bundled_files} list will be added to the installation\n * if the version is greater than or equal to the old version being upgraded.\n *\n * The steps for the upgrader for after the new release is downloaded and\n * unzipped is:\n *   1. Test unzipped location for select files to ensure that unzipped worked.\n *   2. Create the .maintenance file in current WordPress base.\n *   3. Copy new WordPress directory over old WordPress files.\n *   4. Upgrade WordPress to new version.\n *     4.1. Copy all files/folders other than wp-content\n *     4.2. Copy any language files to WP_LANG_DIR (which may differ from WP_CONTENT_DIR\n *     4.3. Copy any new bundled themes/plugins to their respective locations\n *   5. Delete new WordPress directory path.\n *   6. Delete .maintenance file.\n *   7. Remove old files.\n *   8. Delete 'update_core' option.\n *\n * There are several areas of failure. For instance if PHP times out before step\n * 6, then you will not be able to access any portion of your site. Also, since\n * the upgrade will not continue where it left off, you will not be able to\n * automatically remove old files and remove the 'update_core' option. This\n * isn't that bad.\n *\n * If the copy of the new WordPress over the old fails, then the worse is that\n * the new WordPress directory will remain.\n *\n * If it is assumed that every file will be copied over, including plugins and\n * themes, then if you edit the default theme, you should rename it, so that\n * your changes remain.\n *\n * @since 2.7.0\n *\n * @global WP_Filesystem_Base $wp_filesystem\n * @global array              $_old_files\n * @global array              $_new_bundled_files\n * @global wpdb               $wpdb\n * @global string             $wp_version\n * @global string             $required_php_version\n * @global string             $required_mysql_version\n *\n * @param string $from New release unzipped path.\n * @param string $to   Path to old WordPress installation.\n * @return WP_Error|null WP_Error on failure, null on success.\n */\nfunction update_core($from, $to) {\n\tglobal $wp_filesystem, $_old_files, $_new_bundled_files, $wpdb;\n\n\t@set_time_limit( 300 );\n\n\t/**\n\t * Filter feedback messages displayed during the core update process.\n\t *\n\t * The filter is first evaluated after the zip file for the latest version\n\t * has been downloaded and unzipped. It is evaluated five more times during\n\t * the process:\n\t *\n\t * 1. Before WordPress begins the core upgrade process.\n\t * 2. Before Maintenance Mode is enabled.\n\t * 3. Before WordPress begins copying over the necessary files.\n\t * 4. Before Maintenance Mode is disabled.\n\t * 5. Before the database is upgraded.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $feedback The core update feedback messages.\n\t */\n\tapply_filters( 'update_feedback', __( 'Verifying the unpacked files&#8230;' ) );\n\n\t// Sanity check the unzipped distribution.\n\t$distro = '';\n\t$roots = array( '/wordpress/', '/wordpress-mu/' );\n\tforeach ( $roots as $root ) {\n\t\tif ( $wp_filesystem->exists( $from . $root . 'readme.html' ) && $wp_filesystem->exists( $from . $root . 'wp-includes/version.php' ) ) {\n\t\t\t$distro = $root;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif ( ! $distro ) {\n\t\t$wp_filesystem->delete( $from, true );\n\t\treturn new WP_Error( 'insane_distro', __('The update could not be unpacked') );\n\t}\n\n\n\t/**\n\t * Import $wp_version, $required_php_version, and $required_mysql_version from the new version\n\t * $wp_filesystem->wp_content_dir() returned unslashed pre-2.8\n\t *\n\t * @global string $wp_version\n\t * @global string $required_php_version\n\t * @global string $required_mysql_version\n\t */\n\tglobal $wp_version, $required_php_version, $required_mysql_version;\n\n\t$versions_file = trailingslashit( $wp_filesystem->wp_content_dir() ) . 'upgrade/version-current.php';\n\tif ( ! $wp_filesystem->copy( $from . $distro . 'wp-includes/version.php', $versions_file ) ) {\n\t\t$wp_filesystem->delete( $from, true );\n\t\treturn new WP_Error( 'copy_failed_for_version_file', __( 'The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions.' ), 'wp-includes/version.php' );\n\t}\n\n\t$wp_filesystem->chmod( $versions_file, FS_CHMOD_FILE );\n\trequire( WP_CONTENT_DIR . '/upgrade/version-current.php' );\n\t$wp_filesystem->delete( $versions_file );\n\n\t$php_version    = phpversion();\n\t$mysql_version  = $wpdb->db_version();\n\t$old_wp_version = $wp_version; // The version of WordPress we're updating from\n\t$development_build = ( false !== strpos( $old_wp_version . $wp_version, '-' )  ); // a dash in the version indicates a Development release\n\t$php_compat     = version_compare( $php_version, $required_php_version, '>=' );\n\tif ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) )\n\t\t$mysql_compat = true;\n\telse\n\t\t$mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' );\n\n\tif ( !$mysql_compat || !$php_compat )\n\t\t$wp_filesystem->delete($from, true);\n\n\tif ( !$mysql_compat && !$php_compat )\n\t\treturn new WP_Error( 'php_mysql_not_compatible', sprintf( __('The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.'), $wp_version, $required_php_version, $required_mysql_version, $php_version, $mysql_version ) );\n\telseif ( !$php_compat )\n\t\treturn new WP_Error( 'php_not_compatible', sprintf( __('The update cannot be installed because WordPress %1$s requires PHP version %2$s or higher. You are running version %3$s.'), $wp_version, $required_php_version, $php_version ) );\n\telseif ( !$mysql_compat )\n\t\treturn new WP_Error( 'mysql_not_compatible', sprintf( __('The update cannot be installed because WordPress %1$s requires MySQL version %2$s or higher. You are running version %3$s.'), $wp_version, $required_mysql_version, $mysql_version ) );\n\n\t/** This filter is documented in wp-admin/includes/update-core.php */\n\tapply_filters( 'update_feedback', __( 'Preparing to install the latest version&#8230;' ) );\n\n\t// Don't copy wp-content, we'll deal with that below\n\t// We also copy version.php last so failed updates report their old version\n\t$skip = array( 'wp-content', 'wp-includes/version.php' );\n\t$check_is_writable = array();\n\n\t// Check to see which files don't really need updating - only available for 3.7 and higher\n\tif ( function_exists( 'get_core_checksums' ) ) {\n\t\t// Find the local version of the working directory\n\t\t$working_dir_local = WP_CONTENT_DIR . '/upgrade/' . basename( $from ) . $distro;\n\n\t\t$checksums = get_core_checksums( $wp_version, isset( $wp_local_package ) ? $wp_local_package : 'en_US' );\n\t\tif ( is_array( $checksums ) && isset( $checksums[ $wp_version ] ) )\n\t\t\t$checksums = $checksums[ $wp_version ]; // Compat code for 3.7-beta2\n\t\tif ( is_array( $checksums ) ) {\n\t\t\tforeach ( $checksums as $file => $checksum ) {\n\t\t\t\tif ( 'wp-content' == substr( $file, 0, 10 ) )\n\t\t\t\t\tcontinue;\n\t\t\t\tif ( ! file_exists( ABSPATH . $file ) )\n\t\t\t\t\tcontinue;\n\t\t\t\tif ( ! file_exists( $working_dir_local . $file ) )\n\t\t\t\t\tcontinue;\n\t\t\t\tif ( md5_file( ABSPATH . $file ) === $checksum )\n\t\t\t\t\t$skip[] = $file;\n\t\t\t\telse\n\t\t\t\t\t$check_is_writable[ $file ] = ABSPATH . $file;\n\t\t\t}\n\t\t}\n\t}\n\n\t// If we're using the direct method, we can predict write failures that are due to permissions.\n\tif ( $check_is_writable && 'direct' === $wp_filesystem->method ) {\n\t\t$files_writable = array_filter( $check_is_writable, array( $wp_filesystem, 'is_writable' ) );\n\t\tif ( $files_writable !== $check_is_writable ) {\n\t\t\t$files_not_writable = array_diff_key( $check_is_writable, $files_writable );\n\t\t\tforeach ( $files_not_writable as $relative_file_not_writable => $file_not_writable ) {\n\t\t\t\t// If the writable check failed, chmod file to 0644 and try again, same as copy_dir().\n\t\t\t\t$wp_filesystem->chmod( $file_not_writable, FS_CHMOD_FILE );\n\t\t\t\tif ( $wp_filesystem->is_writable( $file_not_writable ) )\n\t\t\t\t\tunset( $files_not_writable[ $relative_file_not_writable ] );\n\t\t\t}\n\n\t\t\t// Store package-relative paths (the key) of non-writable files in the WP_Error object.\n\t\t\t$error_data = version_compare( $old_wp_version, '3.7-beta2', '>' ) ? array_keys( $files_not_writable ) : '';\n\n\t\t\tif ( $files_not_writable )\n\t\t\t\treturn new WP_Error( 'files_not_writable', __( 'The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions.' ), implode( ', ', $error_data ) );\n\t\t}\n\t}\n\n\t/** This filter is documented in wp-admin/includes/update-core.php */\n\tapply_filters( 'update_feedback', __( 'Enabling Maintenance mode&#8230;' ) );\n\t// Create maintenance file to signal that we are upgrading\n\t$maintenance_string = '<?php $upgrading = ' . time() . '; ?>';\n\t$maintenance_file = $to . '.maintenance';\n\t$wp_filesystem->delete($maintenance_file);\n\t$wp_filesystem->put_contents($maintenance_file, $maintenance_string, FS_CHMOD_FILE);\n\n\t/** This filter is documented in wp-admin/includes/update-core.php */\n\tapply_filters( 'update_feedback', __( 'Copying the required files&#8230;' ) );\n\t// Copy new versions of WP files into place.\n\t$result = _copy_dir( $from . $distro, $to, $skip );\n\tif ( is_wp_error( $result ) )\n\t\t$result = new WP_Error( $result->get_error_code(), $result->get_error_message(), substr( $result->get_error_data(), strlen( $to ) ) );\n\n\t// Since we know the core files have copied over, we can now copy the version file\n\tif ( ! is_wp_error( $result ) ) {\n\t\tif ( ! $wp_filesystem->copy( $from . $distro . 'wp-includes/version.php', $to . 'wp-includes/version.php', true /* overwrite */ ) ) {\n\t\t\t$wp_filesystem->delete( $from, true );\n\t\t\t$result = new WP_Error( 'copy_failed_for_version_file', __( 'The update cannot be installed because we will be unable to copy some files. This is usually due to inconsistent file permissions.' ), 'wp-includes/version.php' );\n\t\t}\n\t\t$wp_filesystem->chmod( $to . 'wp-includes/version.php', FS_CHMOD_FILE );\n\t}\n\n\t// Check to make sure everything copied correctly, ignoring the contents of wp-content\n\t$skip = array( 'wp-content' );\n\t$failed = array();\n\tif ( isset( $checksums ) && is_array( $checksums ) ) {\n\t\tforeach ( $checksums as $file => $checksum ) {\n\t\t\tif ( 'wp-content' == substr( $file, 0, 10 ) )\n\t\t\t\tcontinue;\n\t\t\tif ( ! file_exists( $working_dir_local . $file ) )\n\t\t\t\tcontinue;\n\t\t\tif ( file_exists( ABSPATH . $file ) && md5_file( ABSPATH . $file ) == $checksum )\n\t\t\t\t$skip[] = $file;\n\t\t\telse\n\t\t\t\t$failed[] = $file;\n\t\t}\n\t}\n\n\t// Some files didn't copy properly\n\tif ( ! empty( $failed ) ) {\n\t\t$total_size = 0;\n\t\tforeach ( $failed as $file ) {\n\t\t\tif ( file_exists( $working_dir_local . $file ) )\n\t\t\t\t$total_size += filesize( $working_dir_local . $file );\n\t\t}\n\n\t\t// If we don't have enough free space, it isn't worth trying again.\n\t\t// Unlikely to be hit due to the check in unzip_file().\n\t\t$available_space = @disk_free_space( ABSPATH );\n\t\tif ( $available_space && $total_size >= $available_space ) {\n\t\t\t$result = new WP_Error( 'disk_full', __( 'There is not enough free disk space to complete the update.' ) );\n\t\t} else {\n\t\t\t$result = _copy_dir( $from . $distro, $to, $skip );\n\t\t\tif ( is_wp_error( $result ) )\n\t\t\t\t$result = new WP_Error( $result->get_error_code() . '_retry', $result->get_error_message(), substr( $result->get_error_data(), strlen( $to ) ) );\n\t\t}\n\t}\n\n\t// Custom Content Directory needs updating now.\n\t// Copy Languages\n\tif ( !is_wp_error($result) && $wp_filesystem->is_dir($from . $distro . 'wp-content/languages') ) {\n\t\tif ( WP_LANG_DIR != ABSPATH . WPINC . '/languages' || @is_dir(WP_LANG_DIR) )\n\t\t\t$lang_dir = WP_LANG_DIR;\n\t\telse\n\t\t\t$lang_dir = WP_CONTENT_DIR . '/languages';\n\n\t\tif ( !@is_dir($lang_dir) && 0 === strpos($lang_dir, ABSPATH) ) { // Check the language directory exists first\n\t\t\t$wp_filesystem->mkdir($to . str_replace(ABSPATH, '', $lang_dir), FS_CHMOD_DIR); // If it's within the ABSPATH we can handle it here, otherwise they're out of luck.\n\t\t\tclearstatcache(); // for FTP, Need to clear the stat cache\n\t\t}\n\n\t\tif ( @is_dir($lang_dir) ) {\n\t\t\t$wp_lang_dir = $wp_filesystem->find_folder($lang_dir);\n\t\t\tif ( $wp_lang_dir ) {\n\t\t\t\t$result = copy_dir($from . $distro . 'wp-content/languages/', $wp_lang_dir);\n\t\t\t\tif ( is_wp_error( $result ) )\n\t\t\t\t\t$result = new WP_Error( $result->get_error_code() . '_languages', $result->get_error_message(), substr( $result->get_error_data(), strlen( $wp_lang_dir ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t/** This filter is documented in wp-admin/includes/update-core.php */\n\tapply_filters( 'update_feedback', __( 'Disabling Maintenance mode&#8230;' ) );\n\t// Remove maintenance file, we're done with potential site-breaking changes\n\t$wp_filesystem->delete( $maintenance_file );\n\n\t// 3.5 -> 3.5+ - an empty twentytwelve directory was created upon upgrade to 3.5 for some users, preventing installation of Twenty Twelve.\n\tif ( '3.5' == $old_wp_version ) {\n\t\tif ( is_dir( WP_CONTENT_DIR . '/themes/twentytwelve' ) && ! file_exists( WP_CONTENT_DIR . '/themes/twentytwelve/style.css' )  ) {\n\t\t\t$wp_filesystem->delete( $wp_filesystem->wp_themes_dir() . 'twentytwelve/' );\n\t\t}\n\t}\n\n\t// Copy New bundled plugins & themes\n\t// This gives us the ability to install new plugins & themes bundled with future versions of WordPress whilst avoiding the re-install upon upgrade issue.\n\t// $development_build controls us overwriting bundled themes and plugins when a non-stable release is being updated\n\tif ( !is_wp_error($result) && ( ! defined('CORE_UPGRADE_SKIP_NEW_BUNDLED') || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) ) {\n\t\tforeach ( (array) $_new_bundled_files as $file => $introduced_version ) {\n\t\t\t// If a $development_build or if $introduced version is greater than what the site was previously running\n\t\t\tif ( $development_build || version_compare( $introduced_version, $old_wp_version, '>' ) ) {\n\t\t\t\t$directory = ('/' == $file[ strlen($file)-1 ]);\n\t\t\t\tlist($type, $filename) = explode('/', $file, 2);\n\n\t\t\t\t// Check to see if the bundled items exist before attempting to copy them\n\t\t\t\tif ( ! $wp_filesystem->exists( $from . $distro . 'wp-content/' . $file ) )\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif ( 'plugins' == $type )\n\t\t\t\t\t$dest = $wp_filesystem->wp_plugins_dir();\n\t\t\t\telseif ( 'themes' == $type )\n\t\t\t\t\t$dest = trailingslashit($wp_filesystem->wp_themes_dir()); // Back-compat, ::wp_themes_dir() did not return trailingslash'd pre-3.2\n\t\t\t\telse\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif ( ! $directory ) {\n\t\t\t\t\tif ( ! $development_build && $wp_filesystem->exists( $dest . $filename ) )\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tif ( ! $wp_filesystem->copy($from . $distro . 'wp-content/' . $file, $dest . $filename, FS_CHMOD_FILE) )\n\t\t\t\t\t\t$result = new WP_Error( \"copy_failed_for_new_bundled_$type\", __( 'Could not copy file.' ), $dest . $filename );\n\t\t\t\t} else {\n\t\t\t\t\tif ( ! $development_build && $wp_filesystem->is_dir( $dest . $filename ) )\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t$wp_filesystem->mkdir($dest . $filename, FS_CHMOD_DIR);\n\t\t\t\t\t$_result = copy_dir( $from . $distro . 'wp-content/' . $file, $dest . $filename);\n\n\t\t\t\t\t// If a error occurs partway through this final step, keep the error flowing through, but keep process going.\n\t\t\t\t\tif ( is_wp_error( $_result ) ) {\n\t\t\t\t\t\tif ( ! is_wp_error( $result ) )\n\t\t\t\t\t\t\t$result = new WP_Error;\n\t\t\t\t\t\t$result->add( $_result->get_error_code() . \"_$type\", $_result->get_error_message(), substr( $_result->get_error_data(), strlen( $dest ) ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} //end foreach\n\t}\n\n\t// Handle $result error from the above blocks\n\tif ( is_wp_error($result) ) {\n\t\t$wp_filesystem->delete($from, true);\n\t\treturn $result;\n\t}\n\n\t// Remove old files\n\tforeach ( $_old_files as $old_file ) {\n\t\t$old_file = $to . $old_file;\n\t\tif ( !$wp_filesystem->exists($old_file) )\n\t\t\tcontinue;\n\t\t$wp_filesystem->delete($old_file, true);\n\t}\n\n\t// Remove any Genericons example.html's from the filesystem\n\t_upgrade_422_remove_genericons();\n\n\t// Remove the REST API plugin if its version is Beta 4 or lower\n\t_upgrade_440_force_deactivate_incompatible_plugins();\n\n\t// Upgrade DB with separate request\n\t/** This filter is documented in wp-admin/includes/update-core.php */\n\tapply_filters( 'update_feedback', __( 'Upgrading database&#8230;' ) );\n\t$db_upgrade_url = admin_url('upgrade.php?step=upgrade_db');\n\twp_remote_post($db_upgrade_url, array('timeout' => 60));\n\n\t// Clear the cache to prevent an update_option() from saving a stale db_version to the cache\n\twp_cache_flush();\n\t// (Not all cache backends listen to 'flush')\n\twp_cache_delete( 'alloptions', 'options' );\n\n\t// Remove working directory\n\t$wp_filesystem->delete($from, true);\n\n\t// Force refresh of update information\n\tif ( function_exists('delete_site_transient') )\n\t\tdelete_site_transient('update_core');\n\telse\n\t\tdelete_option('update_core');\n\n\t/**\n\t * Fires after WordPress core has been successfully updated.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $wp_version The current WordPress version.\n\t */\n\tdo_action( '_core_updated_successfully', $wp_version );\n\n\t// Clear the option that blocks auto updates after failures, now that we've been successful.\n\tif ( function_exists( 'delete_site_option' ) )\n\t\tdelete_site_option( 'auto_core_update_failed' );\n\n\treturn $wp_version;\n}\n\n/**\n * Copies a directory from one location to another via the WordPress Filesystem Abstraction.\n * Assumes that WP_Filesystem() has already been called and setup.\n *\n * This is a temporary function for the 3.1 -> 3.2 upgrade, as well as for those upgrading to\n * 3.7+\n *\n * @ignore\n * @since 3.2.0\n * @since 3.7.0 Updated not to use a regular expression for the skip list\n * @see copy_dir()\n *\n * @global WP_Filesystem_Base $wp_filesystem\n *\n * @param string $from     source directory\n * @param string $to       destination directory\n * @param array $skip_list a list of files/folders to skip copying\n * @return mixed WP_Error on failure, True on success.\n */\nfunction _copy_dir($from, $to, $skip_list = array() ) {\n\tglobal $wp_filesystem;\n\n\t$dirlist = $wp_filesystem->dirlist($from);\n\n\t$from = trailingslashit($from);\n\t$to = trailingslashit($to);\n\n\tforeach ( (array) $dirlist as $filename => $fileinfo ) {\n\t\tif ( in_array( $filename, $skip_list ) )\n\t\t\tcontinue;\n\n\t\tif ( 'f' == $fileinfo['type'] ) {\n\t\t\tif ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) ) {\n\t\t\t\t// If copy failed, chmod file to 0644 and try again.\n\t\t\t\t$wp_filesystem->chmod( $to . $filename, FS_CHMOD_FILE );\n\t\t\t\tif ( ! $wp_filesystem->copy($from . $filename, $to . $filename, true, FS_CHMOD_FILE) )\n\t\t\t\t\treturn new WP_Error( 'copy_failed__copy_dir', __( 'Could not copy file.' ), $to . $filename );\n\t\t\t}\n\t\t} elseif ( 'd' == $fileinfo['type'] ) {\n\t\t\tif ( !$wp_filesystem->is_dir($to . $filename) ) {\n\t\t\t\tif ( !$wp_filesystem->mkdir($to . $filename, FS_CHMOD_DIR) )\n\t\t\t\t\treturn new WP_Error( 'mkdir_failed__copy_dir', __( 'Could not create directory.' ), $to . $filename );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Generate the $sub_skip_list for the subdirectory as a sub-set\n\t\t\t * of the existing $skip_list.\n\t\t\t */\n\t\t\t$sub_skip_list = array();\n\t\t\tforeach ( $skip_list as $skip_item ) {\n\t\t\t\tif ( 0 === strpos( $skip_item, $filename . '/' ) )\n\t\t\t\t\t$sub_skip_list[] = preg_replace( '!^' . preg_quote( $filename, '!' ) . '/!i', '', $skip_item );\n\t\t\t}\n\n\t\t\t$result = _copy_dir($from . $filename, $to . $filename, $sub_skip_list);\n\t\t\tif ( is_wp_error($result) )\n\t\t\t\treturn $result;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Redirect to the About WordPress page after a successful upgrade.\n *\n * This function is only needed when the existing install is older than 3.4.0.\n *\n * @since 3.3.0\n *\n * @global string $wp_version\n * @global string $pagenow\n * @global string $action\n *\n * @param string $new_version\n */\nfunction _redirect_to_about_wordpress( $new_version ) {\n\tglobal $wp_version, $pagenow, $action;\n\n\tif ( version_compare( $wp_version, '3.4-RC1', '>=' ) )\n\t\treturn;\n\n\t// Ensure we only run this on the update-core.php page. The Core_Upgrader may be used in other contexts.\n\tif ( 'update-core.php' != $pagenow )\n\t\treturn;\n\n \tif ( 'do-core-upgrade' != $action && 'do-core-reinstall' != $action )\n \t\treturn;\n\n\t// Load the updated default text localization domain for new strings.\n\tload_default_textdomain();\n\n\t// See do_core_upgrade()\n\tshow_message( __('WordPress updated successfully') );\n\n\t// self_admin_url() won't exist when upgrading from <= 3.0, so relative URLs are intentional.\n\tshow_message( '<span class=\"hide-if-no-js\">' . sprintf( __( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click <a href=\"%2$s\">here</a>.' ), $new_version, 'about.php?updated' ) . '</span>' );\n\tshow_message( '<span class=\"hide-if-js\">' . sprintf( __( 'Welcome to WordPress %1$s. <a href=\"%2$s\">Learn more</a>.' ), $new_version, 'about.php?updated' ) . '</span>' );\n\techo '</div>';\n\t?>\n<script type=\"text/javascript\">\nwindow.location = 'about.php?updated';\n</script>\n\t<?php\n\n\t// Include admin-footer.php and exit.\n\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\texit();\n}\n\n/**\n * Cleans up Genericons example files.\n *\n * @since 4.2.2\n *\n * @global array              $wp_theme_directories\n * @global WP_Filesystem_Base $wp_filesystem\n */\nfunction _upgrade_422_remove_genericons() {\n\tglobal $wp_theme_directories, $wp_filesystem;\n\n\t// A list of the affected files using the filesystem absolute paths.\n\t$affected_files = array();\n\n\t// Themes\n\tforeach ( $wp_theme_directories as $directory ) {\n\t\t$affected_theme_files = _upgrade_422_find_genericons_files_in_folder( $directory );\n\t\t$affected_files       = array_merge( $affected_files, $affected_theme_files );\n\t}\n\n\t// Plugins\n\t$affected_plugin_files = _upgrade_422_find_genericons_files_in_folder( WP_PLUGIN_DIR );\n\t$affected_files        = array_merge( $affected_files, $affected_plugin_files );\n\n\tforeach ( $affected_files as $file ) {\n\t\t$gen_dir = $wp_filesystem->find_folder( trailingslashit( dirname( $file ) ) );\n\t\tif ( empty( $gen_dir ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// The path when the file is accessed via WP_Filesystem may differ in the case of FTP\n\t\t$remote_file = $gen_dir . basename( $file );\n\n\t\tif ( ! $wp_filesystem->exists( $remote_file ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( ! $wp_filesystem->delete( $remote_file, false, 'f' ) ) {\n\t\t\t$wp_filesystem->put_contents( $remote_file, '' );\n\t\t}\n\t}\n}\n\n/**\n * Recursively find Genericons example files in a given folder.\n *\n * @ignore\n * @since 4.2.2\n *\n * @param string $directory Directory path. Expects trailingslashed.\n * @return array\n */\nfunction _upgrade_422_find_genericons_files_in_folder( $directory ) {\n\t$directory = trailingslashit( $directory );\n\t$files     = array();\n\n\tif ( file_exists( \"{$directory}example.html\" ) && false !== strpos( file_get_contents( \"{$directory}example.html\" ), '<title>Genericons</title>' ) ) {\n\t\t$files[] = \"{$directory}example.html\";\n\t}\n\n\t$dirs = glob( $directory . '*', GLOB_ONLYDIR );\n\tif ( $dirs ) {\n\t\tforeach ( $dirs as $dir ) {\n\t\t\t$files = array_merge( $files, _upgrade_422_find_genericons_files_in_folder( $dir ) );\n\t\t}\n\t}\n\n\treturn $files;\n}\n\n/**\n * @ignore\n * @since 4.4.0\n */\nfunction _upgrade_440_force_deactivate_incompatible_plugins() {\n\tif ( defined( 'REST_API_VERSION' ) && version_compare( REST_API_VERSION, '2.0-beta4', '<=' ) ) {\n\t\tdeactivate_plugins( array( 'rest-api/plugin.php' ), true );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/update.php",
    "content": "<?php\n/**\n * WordPress Administration Update API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Selects the first update version from the update_core option.\n *\n * @return object|array|false The response from the API on success, false on failure.\n */\nfunction get_preferred_from_update_core() {\n\t$updates = get_core_updates();\n\tif ( ! is_array( $updates ) )\n\t\treturn false;\n\tif ( empty( $updates ) )\n\t\treturn (object) array( 'response' => 'latest' );\n\treturn $updates[0];\n}\n\n/**\n * Get available core updates.\n *\n * @param array $options Set $options['dismissed'] to true to show dismissed upgrades too,\n * \t                     set $options['available'] to false to skip not-dismissed updates.\n * @return array|false Array of the update objects on success, false on failure.\n */\nfunction get_core_updates( $options = array() ) {\n\t$options = array_merge( array( 'available' => true, 'dismissed' => false ), $options );\n\t$dismissed = get_site_option( 'dismissed_update_core' );\n\n\tif ( ! is_array( $dismissed ) )\n\t\t$dismissed = array();\n\n\t$from_api = get_site_transient( 'update_core' );\n\n\tif ( ! isset( $from_api->updates ) || ! is_array( $from_api->updates ) )\n\t\treturn false;\n\n\t$updates = $from_api->updates;\n\t$result = array();\n\tforeach ( $updates as $update ) {\n\t\tif ( $update->response == 'autoupdate' )\n\t\t\tcontinue;\n\n\t\tif ( array_key_exists( $update->current . '|' . $update->locale, $dismissed ) ) {\n\t\t\tif ( $options['dismissed'] ) {\n\t\t\t\t$update->dismissed = true;\n\t\t\t\t$result[] = $update;\n\t\t\t}\n\t\t} else {\n\t\t\tif ( $options['available'] ) {\n\t\t\t\t$update->dismissed = false;\n\t\t\t\t$result[] = $update;\n\t\t\t}\n\t\t}\n\t}\n\treturn $result;\n}\n\n/**\n * Gets the best available (and enabled) Auto-Update for WordPress Core.\n *\n * If there's 1.2.3 and 1.3 on offer, it'll choose 1.3 if the install allows it, else, 1.2.3\n *\n * @since 3.7.0\n *\n * @return array|false False on failure, otherwise the core update offering.\n */\nfunction find_core_auto_update() {\n\t$updates = get_site_transient( 'update_core' );\n\tif ( ! $updates || empty( $updates->updates ) )\n\t\treturn false;\n\n\tinclude_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );\n\n\t$auto_update = false;\n\t$upgrader = new WP_Automatic_Updater;\n\tforeach ( $updates->updates as $update ) {\n\t\tif ( 'autoupdate' != $update->response )\n\t\t\tcontinue;\n\n\t\tif ( ! $upgrader->should_update( 'core', $update, ABSPATH ) )\n\t\t\tcontinue;\n\n\t\tif ( ! $auto_update || version_compare( $update->current, $auto_update->current, '>' ) )\n\t\t\t$auto_update = $update;\n\t}\n\treturn $auto_update;\n}\n\n/**\n * Gets and caches the checksums for the given version of WordPress.\n *\n * @since 3.7.0\n *\n * @param string $version Version string to query.\n * @param string $locale  Locale to query.\n * @return bool|array False on failure. An array of checksums on success.\n */\nfunction get_core_checksums( $version, $locale ) {\n\t$url = $http_url = 'http://api.wordpress.org/core/checksums/1.0/?' . http_build_query( compact( 'version', 'locale' ), null, '&' );\n\n\tif ( $ssl = wp_http_supports( array( 'ssl' ) ) )\n\t\t$url = set_url_scheme( $url, 'https' );\n\n\t$options = array(\n\t\t'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ),\n\t);\n\n\t$response = wp_remote_get( $url, $options );\n\tif ( $ssl && is_wp_error( $response ) ) {\n\t\ttrigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );\n\t\t$response = wp_remote_get( $http_url, $options );\n\t}\n\n\tif ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) )\n\t\treturn false;\n\n\t$body = trim( wp_remote_retrieve_body( $response ) );\n\t$body = json_decode( $body, true );\n\n\tif ( ! is_array( $body ) || ! isset( $body['checksums'] ) || ! is_array( $body['checksums'] ) )\n\t\treturn false;\n\n\treturn $body['checksums'];\n}\n\n/**\n *\n * @param object $update\n * @return bool\n */\nfunction dismiss_core_update( $update ) {\n\t$dismissed = get_site_option( 'dismissed_update_core' );\n\t$dismissed[ $update->current . '|' . $update->locale ] = true;\n\treturn update_site_option( 'dismissed_update_core', $dismissed );\n}\n\n/**\n *\n * @param string $version\n * @param string $locale\n * @return bool\n */\nfunction undismiss_core_update( $version, $locale ) {\n\t$dismissed = get_site_option( 'dismissed_update_core' );\n\t$key = $version . '|' . $locale;\n\n\tif ( ! isset( $dismissed[$key] ) )\n\t\treturn false;\n\n\tunset( $dismissed[$key] );\n\treturn update_site_option( 'dismissed_update_core', $dismissed );\n}\n\n/**\n *\n * @param string $version\n * @param string $locale\n * @return object|false\n */\nfunction find_core_update( $version, $locale ) {\n\t$from_api = get_site_transient( 'update_core' );\n\n\tif ( ! isset( $from_api->updates ) || ! is_array( $from_api->updates ) )\n\t\treturn false;\n\n\t$updates = $from_api->updates;\n\tforeach ( $updates as $update ) {\n\t\tif ( $update->current == $version && $update->locale == $locale )\n\t\t\treturn $update;\n\t}\n\treturn false;\n}\n\n/**\n *\n * @param string $msg\n * @return string\n */\nfunction core_update_footer( $msg = '' ) {\n\tif ( !current_user_can('update_core') )\n\t\treturn sprintf( __( 'Version %s' ), get_bloginfo( 'version', 'display' ) );\n\n\t$cur = get_preferred_from_update_core();\n\tif ( ! is_object( $cur ) )\n\t\t$cur = new stdClass;\n\n\tif ( ! isset( $cur->current ) )\n\t\t$cur->current = '';\n\n\tif ( ! isset( $cur->url ) )\n\t\t$cur->url = '';\n\n\tif ( ! isset( $cur->response ) )\n\t\t$cur->response = '';\n\n\tswitch ( $cur->response ) {\n\tcase 'development' :\n\t\treturn sprintf( __( 'You are using a development version (%1$s). Cool! Please <a href=\"%2$s\">stay updated</a>.' ), get_bloginfo( 'version', 'display' ), network_admin_url( 'update-core.php' ) );\n\n\tcase 'upgrade' :\n\t\treturn '<strong><a href=\"' . network_admin_url( 'update-core.php' ) . '\">' . sprintf( __( 'Get Version %s' ), $cur->current ) . '</a></strong>';\n\n\tcase 'latest' :\n\tdefault :\n\t\treturn sprintf( __( 'Version %s' ), get_bloginfo( 'version', 'display' ) );\n\t}\n}\n\n/**\n *\n * @global string $pagenow\n * @return false|void\n */\nfunction update_nag() {\n\tif ( is_multisite() && !current_user_can('update_core') )\n\t\treturn false;\n\n\tglobal $pagenow;\n\n\tif ( 'update-core.php' == $pagenow )\n\t\treturn;\n\n\t$cur = get_preferred_from_update_core();\n\n\tif ( ! isset( $cur->response ) || $cur->response != 'upgrade' )\n\t\treturn false;\n\n\tif ( current_user_can('update_core') ) {\n\t\t$msg = sprintf( __('<a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> is available! <a href=\"%2$s\">Please update now</a>.'), $cur->current, network_admin_url( 'update-core.php' ) );\n\t} else {\n\t\t$msg = sprintf( __('<a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> is available! Please notify the site administrator.'), $cur->current );\n\t}\n\techo \"<div class='update-nag'>$msg</div>\";\n}\n\n// Called directly from dashboard\nfunction update_right_now_message() {\n\t$theme_name = wp_get_theme();\n\tif ( current_user_can( 'switch_themes' ) ) {\n\t\t$theme_name = sprintf( '<a href=\"themes.php\">%1$s</a>', $theme_name );\n\t}\n\n\t$msg = '';\n\n\tif ( current_user_can('update_core') ) {\n\t\t$cur = get_preferred_from_update_core();\n\n\t\tif ( isset( $cur->response ) && $cur->response == 'upgrade' )\n\t\t\t$msg .= '<a href=\"' . network_admin_url( 'update-core.php' ) . '\" class=\"button\" aria-describedby=\"wp-version\">' . sprintf( __( 'Update to %s' ), $cur->current ? $cur->current : __( 'Latest' ) ) . '</a> ';\n\t}\n\n\t/* translators: 1: version number, 2: theme name */\n\t$content = __( 'WordPress %1$s running %2$s theme.' );\n\n\t/**\n\t * Filter the text displayed in the 'At a Glance' dashboard widget.\n\t *\n\t * Prior to 3.8.0, the widget was named 'Right Now'.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $content Default text.\n\t */\n\t$content = apply_filters( 'update_right_now_text', $content );\n\n\t$msg .= sprintf( '<span id=\"wp-version\">' . $content . '</span>', get_bloginfo( 'version', 'display' ), $theme_name );\n\n\techo \"<p id='wp-version-message'>$msg</p>\";\n}\n\n/**\n * @since 2.9.0\n *\n * @return array\n */\nfunction get_plugin_updates() {\n\t$all_plugins = get_plugins();\n\t$upgrade_plugins = array();\n\t$current = get_site_transient( 'update_plugins' );\n\tforeach ( (array)$all_plugins as $plugin_file => $plugin_data) {\n\t\tif ( isset( $current->response[ $plugin_file ] ) ) {\n\t\t\t$upgrade_plugins[ $plugin_file ] = (object) $plugin_data;\n\t\t\t$upgrade_plugins[ $plugin_file ]->update = $current->response[ $plugin_file ];\n\t\t}\n\t}\n\n\treturn $upgrade_plugins;\n}\n\n/**\n * @since 2.9.0\n */\nfunction wp_plugin_update_rows() {\n\tif ( !current_user_can('update_plugins' ) )\n\t\treturn;\n\n\t$plugins = get_site_transient( 'update_plugins' );\n\tif ( isset($plugins->response) && is_array($plugins->response) ) {\n\t\t$plugins = array_keys( $plugins->response );\n\t\tforeach ( $plugins as $plugin_file ) {\n\t\t\tadd_action( \"after_plugin_row_$plugin_file\", 'wp_plugin_update_row', 10, 2 );\n\t\t}\n\t}\n}\n\n/**\n *\n * @param string $file\n * @param array  $plugin_data\n * @return false|void\n */\nfunction wp_plugin_update_row( $file, $plugin_data ) {\n\t$current = get_site_transient( 'update_plugins' );\n\tif ( !isset( $current->response[ $file ] ) )\n\t\treturn false;\n\n\t$r = $current->response[ $file ];\n\n\t$plugins_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());\n\t$plugin_name = wp_kses( $plugin_data['Name'], $plugins_allowedtags );\n\n\t$details_url = self_admin_url('plugin-install.php?tab=plugin-information&plugin=' . $r->slug . '&section=changelog&TB_iframe=true&width=600&height=800');\n\n\t$wp_list_table = _get_list_table('WP_Plugins_List_Table');\n\n\tif ( is_network_admin() || !is_multisite() ) {\n\t\tif ( is_network_admin() ) {\n\t\t\t$active_class = is_plugin_active_for_network( $file ) ? ' active': '';\n\t\t} else {\n\t\t\t$active_class = is_plugin_active( $file ) ? ' active' : '';\n\t\t}\n\n\t\techo '<tr class=\"plugin-update-tr' . $active_class . '\" id=\"' . esc_attr( $r->slug . '-update' ) . '\" data-slug=\"' . esc_attr( $r->slug ) . '\" data-plugin=\"' . esc_attr( $file ) . '\"><td colspan=\"' . esc_attr( $wp_list_table->get_column_count() ) . '\" class=\"plugin-update colspanchange\"><div class=\"update-message\">';\n\n\t\tif ( ! current_user_can( 'update_plugins' ) ) {\n\t\t\tprintf( __('There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a>.'), $plugin_name, esc_url($details_url), esc_attr($plugin_name), $r->new_version );\n\t\t} elseif ( empty($r->package) ) {\n\t\t\tprintf( __('There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a>. <em>Automatic update is unavailable for this plugin.</em>'), $plugin_name, esc_url($details_url), esc_attr($plugin_name), $r->new_version );\n\t\t} else {\n\t\t\tprintf( __( 'There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a> or <a href=\"%5$s\" class=\"update-link\">update now</a>.' ), $plugin_name, esc_url( $details_url ), esc_attr( $plugin_name ), $r->new_version, wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $file, 'upgrade-plugin_' . $file ) );\n\t\t}\n\t\t/**\n\t\t * Fires at the end of the update message container in each\n\t\t * row of the plugins list table.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$file`, refers to the path\n\t\t * of the plugin's primary file relative to the plugins directory.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array $plugin_data {\n\t\t *     An array of plugin metadata.\n\t\t *\n\t\t *     @type string $name         The human-readable name of the plugin.\n\t\t *     @type string $plugin_uri   Plugin URI.\n\t\t *     @type string $version      Plugin version.\n\t\t *     @type string $description  Plugin description.\n\t\t *     @type string $author       Plugin author.\n\t\t *     @type string $author_uri   Plugin author URI.\n\t\t *     @type string $text_domain  Plugin text domain.\n\t\t *     @type string $domain_path  Relative path to the plugin's .mo file(s).\n\t\t *     @type bool   $network      Whether the plugin can only be activated network wide.\n\t\t *     @type string $title        The human-readable title of the plugin.\n\t\t *     @type string $author_name  Plugin author's name.\n\t\t *     @type bool   $update       Whether there's an available update. Default null.\n\t \t * }\n\t \t * @param array $r {\n\t \t *     An array of metadata about the available plugin update.\n\t \t *\n\t \t *     @type int    $id           Plugin ID.\n\t \t *     @type string $slug         Plugin slug.\n\t \t *     @type string $new_version  New plugin version.\n\t \t *     @type string $url          Plugin URL.\n\t \t *     @type string $package      Plugin update package URL.\n\t \t * }\n\t\t */\n\t\tdo_action( \"in_plugin_update_message-{$file}\", $plugin_data, $r );\n\n\t\techo '</div></td></tr>';\n\t}\n}\n\n/**\n *\n * @return array\n */\nfunction get_theme_updates() {\n\t$current = get_site_transient('update_themes');\n\n\tif ( ! isset( $current->response ) )\n\t\treturn array();\n\n\t$update_themes = array();\n\tforeach ( $current->response as $stylesheet => $data ) {\n\t\t$update_themes[ $stylesheet ] = wp_get_theme( $stylesheet );\n\t\t$update_themes[ $stylesheet ]->update = $data;\n\t}\n\n\treturn $update_themes;\n}\n\n/**\n * @since 3.1.0\n */\nfunction wp_theme_update_rows() {\n\tif ( !current_user_can('update_themes' ) )\n\t\treturn;\n\n\t$themes = get_site_transient( 'update_themes' );\n\tif ( isset($themes->response) && is_array($themes->response) ) {\n\t\t$themes = array_keys( $themes->response );\n\n\t\tforeach ( $themes as $theme ) {\n\t\t\tadd_action( \"after_theme_row_$theme\", 'wp_theme_update_row', 10, 2 );\n\t\t}\n\t}\n}\n\n/**\n *\n * @param string   $theme_key\n * @param WP_Theme $theme\n * @return false|void\n */\nfunction wp_theme_update_row( $theme_key, $theme ) {\n\t$current = get_site_transient( 'update_themes' );\n\tif ( !isset( $current->response[ $theme_key ] ) )\n\t\treturn false;\n\t$r = $current->response[ $theme_key ];\n\n\t$details_url = add_query_arg( array( 'TB_iframe' => 'true', 'width' => 1024, 'height' => 800 ), $current->response[ $theme_key ]['url'] );\n\n\t$wp_list_table = _get_list_table('WP_MS_Themes_List_Table');\n\n\techo '<tr class=\"plugin-update-tr\"><td colspan=\"' . $wp_list_table->get_column_count() . '\" class=\"plugin-update colspanchange\"><div class=\"update-message\">';\n\tif ( ! current_user_can('update_themes') ) {\n\t\tprintf( __('There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a>.'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r->new_version );\n\t} elseif ( empty( $r['package'] ) ) {\n\t\tprintf( __('There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a>. <em>Automatic update is unavailable for this theme.</em>'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r['new_version'] );\n\t} else {\n\t\tprintf( __('There is a new version of %1$s available. <a href=\"%2$s\" class=\"thickbox\" title=\"%3$s\">View version %4$s details</a> or <a href=\"%5$s\">update now</a>.'), $theme['Name'], esc_url($details_url), esc_attr($theme['Name']), $r['new_version'], wp_nonce_url( self_admin_url('update.php?action=upgrade-theme&theme=') . $theme_key, 'upgrade-theme_' . $theme_key) );\n\t}\n\t/**\n\t * Fires at the end of the update message container in each\n\t * row of the themes list table.\n\t *\n\t * The dynamic portion of the hook name, `$theme_key`, refers to\n\t * the theme slug as found in the WordPress.org themes repository.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param WP_Theme $theme The WP_Theme object.\n\t * @param array    $r {\n\t *     An array of metadata about the available theme update.\n\t *\n\t *     @type string $new_version New theme version.\n\t *     @type string $url         Theme URL.\n\t *     @type string $package     Theme update package URL.\n\t * }\n\t */\n\tdo_action( \"in_theme_update_message-{$theme_key}\", $theme, $r );\n\n\techo '</div></td></tr>';\n}\n\n/**\n *\n * @global int $upgrading\n * @return false|void\n */\nfunction maintenance_nag() {\n\tinclude( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version\n\tglobal $upgrading;\n\t$nag = isset( $upgrading );\n\tif ( ! $nag ) {\n\t\t$failed = get_site_option( 'auto_core_update_failed' );\n\t\t/*\n\t\t * If an update failed critically, we may have copied over version.php but not other files.\n\t\t * In that case, if the install claims we're running the version we attempted, nag.\n\t\t * This is serious enough to err on the side of nagging.\n\t\t *\n\t\t * If we simply failed to update before we tried to copy any files, then assume things are\n\t\t * OK if they are now running the latest.\n\t\t *\n\t\t * This flag is cleared whenever a successful update occurs using Core_Upgrader.\n\t\t */\n\t\t$comparison = ! empty( $failed['critical'] ) ? '>=' : '>';\n\t\tif ( version_compare( $failed['attempted'], $wp_version, $comparison ) )\n\t\t\t$nag = true;\n\t}\n\n\tif ( ! $nag )\n\t\treturn false;\n\n\tif ( current_user_can('update_core') )\n\t\t$msg = sprintf( __('An automated WordPress update has failed to complete - <a href=\"%s\">please attempt the update again now</a>.'), 'update-core.php' );\n\telse\n\t\t$msg = __('An automated WordPress update has failed to complete! Please notify the site administrator.');\n\n\techo \"<div class='update-nag'>$msg</div>\";\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/upgrade.php",
    "content": "<?php\n/**\n * WordPress Upgrade API\n *\n * Most of the functions are pluggable and can be overwritten.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Include user install customize script. */\nif ( file_exists(WP_CONTENT_DIR . '/install.php') )\n\trequire (WP_CONTENT_DIR . '/install.php');\n\n/** WordPress Administration API */\nrequire_once(ABSPATH . 'wp-admin/includes/admin.php');\n\n/** WordPress Schema API */\nrequire_once(ABSPATH . 'wp-admin/includes/schema.php');\n\nif ( !function_exists('wp_install') ) :\n/**\n * Installs the site.\n *\n * Runs the required functions to set up and populate the database,\n * including primary admin user and initial options.\n *\n * @since 2.1.0\n *\n * @param string $blog_title    Blog title.\n * @param string $user_name     User's username.\n * @param string $user_email    User's email.\n * @param bool   $public        Whether blog is public.\n * @param string $deprecated    Optional. Not used.\n * @param string $user_password Optional. User's chosen password. Default empty (random password).\n * @param string $language      Optional. Language chosen. Default empty.\n * @return array Array keys 'url', 'user_id', 'password', and 'password_message'.\n */\nfunction wp_install( $blog_title, $user_name, $user_email, $public, $deprecated = '', $user_password = '', $language = '' ) {\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.6' );\n\n\twp_check_mysql_version();\n\twp_cache_flush();\n\tmake_db_current_silent();\n\tpopulate_options();\n\tpopulate_roles();\n\n\tupdate_option('blogname', $blog_title);\n\tupdate_option('admin_email', $user_email);\n\tupdate_option('blog_public', $public);\n\n\tif ( $language ) {\n\t\tupdate_option( 'WPLANG', $language );\n\t}\n\n\t$guessurl = wp_guess_url();\n\n\tupdate_option('siteurl', $guessurl);\n\n\t// If not a public blog, don't ping.\n\tif ( ! $public )\n\t\tupdate_option('default_pingback_flag', 0);\n\n\t/*\n\t * Create default user. If the user already exists, the user tables are\n\t * being shared among blogs. Just set the role in that case.\n\t */\n\t$user_id = username_exists($user_name);\n\t$user_password = trim($user_password);\n\t$email_password = false;\n\tif ( !$user_id && empty($user_password) ) {\n\t\t$user_password = wp_generate_password( 12, false );\n\t\t$message = __('<strong><em>Note that password</em></strong> carefully! It is a <em>random</em> password that was generated just for you.');\n\t\t$user_id = wp_create_user($user_name, $user_password, $user_email);\n\t\tupdate_user_option($user_id, 'default_password_nag', true, true);\n\t\t$email_password = true;\n\t} elseif ( ! $user_id ) {\n\t\t// Password has been provided\n\t\t$message = '<em>'.__('Your chosen password.').'</em>';\n\t\t$user_id = wp_create_user($user_name, $user_password, $user_email);\n\t} else {\n\t\t$message = __('User already exists. Password inherited.');\n\t}\n\n\t$user = new WP_User($user_id);\n\t$user->set_role('administrator');\n\n\twp_install_defaults($user_id);\n\n\twp_install_maybe_enable_pretty_permalinks();\n\n\tflush_rewrite_rules();\n\n\twp_new_blog_notification($blog_title, $guessurl, $user_id, ($email_password ? $user_password : __('The password you chose during the install.') ) );\n\n\twp_cache_flush();\n\n\t/**\n\t * Fires after a site is fully installed.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param WP_User $user The site owner.\n\t */\n\tdo_action( 'wp_install', $user );\n\n\treturn array('url' => $guessurl, 'user_id' => $user_id, 'password' => $user_password, 'password_message' => $message);\n}\nendif;\n\nif ( !function_exists('wp_install_defaults') ) :\n/**\n * Creates the initial content for a newly-installed site.\n *\n * Adds the default \"Uncategorized\" category, the first post (with comment),\n * first page, and default widgets for default theme for the current version.\n *\n * @since 2.1.0\n *\n * @global wpdb       $wpdb\n * @global WP_Rewrite $wp_rewrite\n * @global string     $table_prefix\n *\n * @param int $user_id User ID.\n */\nfunction wp_install_defaults( $user_id ) {\n\tglobal $wpdb, $wp_rewrite, $table_prefix;\n\n\t// Default category\n\t$cat_name = __('Uncategorized');\n\t/* translators: Default category slug */\n\t$cat_slug = sanitize_title(_x('Uncategorized', 'Default category slug'));\n\n\tif ( global_terms_enabled() ) {\n\t\t$cat_id = $wpdb->get_var( $wpdb->prepare( \"SELECT cat_ID FROM {$wpdb->sitecategories} WHERE category_nicename = %s\", $cat_slug ) );\n\t\tif ( $cat_id == null ) {\n\t\t\t$wpdb->insert( $wpdb->sitecategories, array('cat_ID' => 0, 'cat_name' => $cat_name, 'category_nicename' => $cat_slug, 'last_updated' => current_time('mysql', true)) );\n\t\t\t$cat_id = $wpdb->insert_id;\n\t\t}\n\t\tupdate_option('default_category', $cat_id);\n\t} else {\n\t\t$cat_id = 1;\n\t}\n\n\t$wpdb->insert( $wpdb->terms, array('term_id' => $cat_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) );\n\t$wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $cat_id, 'taxonomy' => 'category', 'description' => '', 'parent' => 0, 'count' => 1));\n\t$cat_tt_id = $wpdb->insert_id;\n\n\t// First post\n\t$now = current_time( 'mysql' );\n\t$now_gmt = current_time( 'mysql', 1 );\n\t$first_post_guid = get_option( 'home' ) . '/?p=1';\n\n\tif ( is_multisite() ) {\n\t\t$first_post = get_site_option( 'first_post' );\n\n\t\tif ( ! $first_post ) {\n\t\t\t/* translators: %s: site link */\n\t\t\t$first_post = __( 'Welcome to %s. This is your first post. Edit or delete it, then start blogging!' );\n\t\t}\n\n\t\t$first_post = sprintf( $first_post,\n\t\t\tsprintf( '<a href=\"%s\">%s</a>', esc_url( network_home_url() ), get_current_site()->site_name )\n\t\t);\n\n\t\t// Back-compat for pre-4.4\n\t\t$first_post = str_replace( 'SITE_URL', esc_url( network_home_url() ), $first_post );\n\t\t$first_post = str_replace( 'SITE_NAME', get_current_site()->site_name, $first_post );\n\t} else {\n\t\t$first_post = __( 'Welcome to WordPress. This is your first post. Edit or delete it, then start writing!' );\n\t}\n\n\t$wpdb->insert( $wpdb->posts, array(\n\t\t'post_author' => $user_id,\n\t\t'post_date' => $now,\n\t\t'post_date_gmt' => $now_gmt,\n\t\t'post_content' => $first_post,\n\t\t'post_excerpt' => '',\n\t\t'post_title' => __('Hello world!'),\n\t\t/* translators: Default post slug */\n\t\t'post_name' => sanitize_title( _x('hello-world', 'Default post slug') ),\n\t\t'post_modified' => $now,\n\t\t'post_modified_gmt' => $now_gmt,\n\t\t'guid' => $first_post_guid,\n\t\t'comment_count' => 1,\n\t\t'to_ping' => '',\n\t\t'pinged' => '',\n\t\t'post_content_filtered' => ''\n\t));\n\t$wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => $cat_tt_id, 'object_id' => 1) );\n\n\t// Default comment\n\t$first_comment_author = __('Mr WordPress');\n\t$first_comment_url = 'https://wordpress.org/';\n\t$first_comment = __('Hi, this is a comment.\nTo delete a comment, just log in and view the post&#039;s comments. There you will have the option to edit or delete them.');\n\tif ( is_multisite() ) {\n\t\t$first_comment_author = get_site_option( 'first_comment_author', $first_comment_author );\n\t\t$first_comment_url = get_site_option( 'first_comment_url', network_home_url() );\n\t\t$first_comment = get_site_option( 'first_comment', $first_comment );\n\t}\n\t$wpdb->insert( $wpdb->comments, array(\n\t\t'comment_post_ID' => 1,\n\t\t'comment_author' => $first_comment_author,\n\t\t'comment_author_email' => '',\n\t\t'comment_author_url' => $first_comment_url,\n\t\t'comment_date' => $now,\n\t\t'comment_date_gmt' => $now_gmt,\n\t\t'comment_content' => $first_comment\n\t));\n\n\t// First Page\n\t$first_page = sprintf( __( \"This is an example page. It's different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:\n\n<blockquote>Hi there! I'm a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like pi&#241;a coladas. (And gettin' caught in the rain.)</blockquote>\n\n...or something like this:\n\n<blockquote>The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.</blockquote>\n\nAs a new WordPress user, you should go to <a href=\\\"%s\\\">your dashboard</a> to delete this page and create new pages for your content. Have fun!\" ), admin_url() );\n\tif ( is_multisite() )\n\t\t$first_page = get_site_option( 'first_page', $first_page );\n\t$first_post_guid = get_option('home') . '/?page_id=2';\n\t$wpdb->insert( $wpdb->posts, array(\n\t\t'post_author' => $user_id,\n\t\t'post_date' => $now,\n\t\t'post_date_gmt' => $now_gmt,\n\t\t'post_content' => $first_page,\n\t\t'post_excerpt' => '',\n\t\t'comment_status' => 'closed',\n\t\t'post_title' => __( 'Sample Page' ),\n\t\t/* translators: Default page slug */\n\t\t'post_name' => __( 'sample-page' ),\n\t\t'post_modified' => $now,\n\t\t'post_modified_gmt' => $now_gmt,\n\t\t'guid' => $first_post_guid,\n\t\t'post_type' => 'page',\n\t\t'to_ping' => '',\n\t\t'pinged' => '',\n\t\t'post_content_filtered' => ''\n\t));\n\t$wpdb->insert( $wpdb->postmeta, array( 'post_id' => 2, 'meta_key' => '_wp_page_template', 'meta_value' => 'default' ) );\n\n\t// Set up default widgets for default theme.\n\tupdate_option( 'widget_search', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) );\n\tupdate_option( 'widget_recent-posts', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) );\n\tupdate_option( 'widget_recent-comments', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) );\n\tupdate_option( 'widget_archives', array ( 2 => array ( 'title' => '', 'count' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) );\n\tupdate_option( 'widget_categories', array ( 2 => array ( 'title' => '', 'count' => 0, 'hierarchical' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) );\n\tupdate_option( 'widget_meta', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) );\n\tupdate_option( 'sidebars_widgets', array ( 'wp_inactive_widgets' => array (), 'sidebar-1' => array ( 0 => 'search-2', 1 => 'recent-posts-2', 2 => 'recent-comments-2', 3 => 'archives-2', 4 => 'categories-2', 5 => 'meta-2', ), 'array_version' => 3 ) );\n\n\tif ( ! is_multisite() )\n\t\tupdate_user_meta( $user_id, 'show_welcome_panel', 1 );\n\telseif ( ! is_super_admin( $user_id ) && ! metadata_exists( 'user', $user_id, 'show_welcome_panel' ) )\n\t\tupdate_user_meta( $user_id, 'show_welcome_panel', 2 );\n\n\tif ( is_multisite() ) {\n\t\t// Flush rules to pick up the new page.\n\t\t$wp_rewrite->init();\n\t\t$wp_rewrite->flush_rules();\n\n\t\t$user = new WP_User($user_id);\n\t\t$wpdb->update( $wpdb->options, array('option_value' => $user->user_email), array('option_name' => 'admin_email') );\n\n\t\t// Remove all perms except for the login user.\n\t\t$wpdb->query( $wpdb->prepare(\"DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s\", $user_id, $table_prefix.'user_level') );\n\t\t$wpdb->query( $wpdb->prepare(\"DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s\", $user_id, $table_prefix.'capabilities') );\n\n\t\t// Delete any caps that snuck into the previously active blog. (Hardcoded to blog 1 for now.) TODO: Get previous_blog_id.\n\t\tif ( !is_super_admin( $user_id ) && $user_id != 1 )\n\t\t\t$wpdb->delete( $wpdb->usermeta, array( 'user_id' => $user_id , 'meta_key' => $wpdb->base_prefix.'1_capabilities' ) );\n\t}\n}\nendif;\n\n/**\n * Maybe enable pretty permalinks on install.\n *\n * If after enabling pretty permalinks don't work, fallback to query-string permalinks.\n *\n * @since 4.2.0\n *\n * @global WP_Rewrite $wp_rewrite WordPress rewrite component.\n *\n * @return bool Whether pretty permalinks are enabled. False otherwise.\n */\nfunction wp_install_maybe_enable_pretty_permalinks() {\n\tglobal $wp_rewrite;\n\n\t// Bail if a permalink structure is already enabled.\n\tif ( get_option( 'permalink_structure' ) ) {\n\t\treturn true;\n\t}\n\n\t/*\n\t * The Permalink structures to attempt.\n\t *\n\t * The first is designed for mod_rewrite or nginx rewriting.\n\t *\n\t * The second is PATHINFO-based permalinks for web server configurations\n\t * without a true rewrite module enabled.\n\t */\n\t$permalink_structures = array(\n\t\t'/%year%/%monthnum%/%day%/%postname%/',\n\t\t'/index.php/%year%/%monthnum%/%day%/%postname%/'\n\t);\n\n\tforeach ( (array) $permalink_structures as $permalink_structure ) {\n\t\t$wp_rewrite->set_permalink_structure( $permalink_structure );\n\n\t\t/*\n\t \t * Flush rules with the hard option to force refresh of the web-server's\n\t \t * rewrite config file (e.g. .htaccess or web.config).\n\t \t */\n\t\t$wp_rewrite->flush_rules( true );\n\n\t\t// Test against a real WordPress Post, or if none were created, a random 404 page.\n\t\t$test_url = get_permalink( 1 );\n\n\t\tif ( ! $test_url ) {\n\t\t\t$test_url = home_url( '/wordpress-check-for-rewrites/' );\n\t\t}\n\n\t\t/*\n\t \t * Send a request to the site, and check whether\n\t \t * the 'x-pingback' header is returned as expected.\n\t \t *\n\t \t * Uses wp_remote_get() instead of wp_remote_head() because web servers\n\t \t * can block head requests.\n\t \t */\n\t\t$response          = wp_remote_get( $test_url, array( 'timeout' => 5 ) );\n\t\t$x_pingback_header = wp_remote_retrieve_header( $response, 'x-pingback' );\n\t\t$pretty_permalinks = $x_pingback_header && $x_pingback_header === get_bloginfo( 'pingback_url' );\n\n\t\tif ( $pretty_permalinks ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t/*\n\t * If it makes it this far, pretty permalinks failed.\n\t * Fallback to query-string permalinks.\n\t */\n\t$wp_rewrite->set_permalink_structure( '' );\n\t$wp_rewrite->flush_rules( true );\n\n\treturn false;\n}\n\nif ( !function_exists('wp_new_blog_notification') ) :\n/**\n * Notifies the site admin that the setup is complete.\n *\n * Sends an email with wp_mail to the new administrator that the site setup is complete,\n * and provides them with a record of their login credentials.\n *\n * @since 2.1.0\n *\n * @param string $blog_title Blog title.\n * @param string $blog_url   Blog url.\n * @param int    $user_id    User ID.\n * @param string $password   User's Password.\n */\nfunction wp_new_blog_notification($blog_title, $blog_url, $user_id, $password) {\n\t$user = new WP_User( $user_id );\n\t$email = $user->user_email;\n\t$name = $user->user_login;\n\t$login_url = wp_login_url();\n\t$message = sprintf( __( \"Your new WordPress site has been successfully set up at:\n\n%1\\$s\n\nYou can log in to the administrator account with the following information:\n\nUsername: %2\\$s\nPassword: %3\\$s\nLog in here: %4\\$s\n\nWe hope you enjoy your new site. Thanks!\n\n--The WordPress Team\nhttps://wordpress.org/\n\"), $blog_url, $name, $password, $login_url );\n\n\t@wp_mail($email, __('New WordPress Site'), $message);\n}\nendif;\n\nif ( !function_exists('wp_upgrade') ) :\n/**\n * Runs WordPress Upgrade functions.\n *\n * Upgrades the database if needed during a site update.\n *\n * @since 2.1.0\n *\n * @global int  $wp_current_db_version\n * @global int  $wp_db_version\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction wp_upgrade() {\n\tglobal $wp_current_db_version, $wp_db_version, $wpdb;\n\n\t$wp_current_db_version = __get_option('db_version');\n\n\t// We are up-to-date. Nothing to do.\n\tif ( $wp_db_version == $wp_current_db_version )\n\t\treturn;\n\n\tif ( ! is_blog_installed() )\n\t\treturn;\n\n\twp_check_mysql_version();\n\twp_cache_flush();\n\tpre_schema_upgrade();\n\tmake_db_current_silent();\n\tupgrade_all();\n\tif ( is_multisite() && is_main_site() )\n\t\tupgrade_network();\n\twp_cache_flush();\n\n\tif ( is_multisite() ) {\n\t\tif ( $wpdb->get_row( \"SELECT blog_id FROM {$wpdb->blog_versions} WHERE blog_id = '{$wpdb->blogid}'\" ) )\n\t\t\t$wpdb->query( \"UPDATE {$wpdb->blog_versions} SET db_version = '{$wp_db_version}' WHERE blog_id = '{$wpdb->blogid}'\" );\n\t\telse\n\t\t\t$wpdb->query( \"INSERT INTO {$wpdb->blog_versions} ( `blog_id` , `db_version` , `last_updated` ) VALUES ( '{$wpdb->blogid}', '{$wp_db_version}', NOW());\" );\n\t}\n\n\t/**\n\t * Fires after a site is fully upgraded.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param int $wp_db_version         The new $wp_db_version.\n\t * @param int $wp_current_db_version The old (current) $wp_db_version.\n\t */\n\tdo_action( 'wp_upgrade', $wp_db_version, $wp_current_db_version );\n}\nendif;\n\n/**\n * Functions to be called in install and upgrade scripts.\n *\n * Contains conditional checks to determine which upgrade scripts to run,\n * based on database version and WP version being updated-to.\n *\n * @since 1.0.1\n *\n * @global int $wp_current_db_version\n * @global int $wp_db_version\n */\nfunction upgrade_all() {\n\tglobal $wp_current_db_version, $wp_db_version;\n\t$wp_current_db_version = __get_option('db_version');\n\n\t// We are up-to-date. Nothing to do.\n\tif ( $wp_db_version == $wp_current_db_version )\n\t\treturn;\n\n\t// If the version is not set in the DB, try to guess the version.\n\tif ( empty($wp_current_db_version) ) {\n\t\t$wp_current_db_version = 0;\n\n\t\t// If the template option exists, we have 1.5.\n\t\t$template = __get_option('template');\n\t\tif ( !empty($template) )\n\t\t\t$wp_current_db_version = 2541;\n\t}\n\n\tif ( $wp_current_db_version < 6039 )\n\t\tupgrade_230_options_table();\n\n\tpopulate_options();\n\n\tif ( $wp_current_db_version < 2541 ) {\n\t\tupgrade_100();\n\t\tupgrade_101();\n\t\tupgrade_110();\n\t\tupgrade_130();\n\t}\n\n\tif ( $wp_current_db_version < 3308 )\n\t\tupgrade_160();\n\n\tif ( $wp_current_db_version < 4772 )\n\t\tupgrade_210();\n\n\tif ( $wp_current_db_version < 4351 )\n\t\tupgrade_old_slugs();\n\n\tif ( $wp_current_db_version < 5539 )\n\t\tupgrade_230();\n\n\tif ( $wp_current_db_version < 6124 )\n\t\tupgrade_230_old_tables();\n\n\tif ( $wp_current_db_version < 7499 )\n\t\tupgrade_250();\n\n\tif ( $wp_current_db_version < 7935 )\n\t\tupgrade_252();\n\n\tif ( $wp_current_db_version < 8201 )\n\t\tupgrade_260();\n\n\tif ( $wp_current_db_version < 8989 )\n\t\tupgrade_270();\n\n\tif ( $wp_current_db_version < 10360 )\n\t\tupgrade_280();\n\n\tif ( $wp_current_db_version < 11958 )\n\t\tupgrade_290();\n\n\tif ( $wp_current_db_version < 15260 )\n\t\tupgrade_300();\n\n\tif ( $wp_current_db_version < 19389 )\n\t\tupgrade_330();\n\n\tif ( $wp_current_db_version < 20080 )\n\t\tupgrade_340();\n\n\tif ( $wp_current_db_version < 22422 )\n\t\tupgrade_350();\n\n\tif ( $wp_current_db_version < 25824 )\n\t\tupgrade_370();\n\n\tif ( $wp_current_db_version < 26148 )\n\t\tupgrade_372();\n\n\tif ( $wp_current_db_version < 26691 )\n\t\tupgrade_380();\n\n\tif ( $wp_current_db_version < 29630 )\n\t\tupgrade_400();\n\n\tif ( $wp_current_db_version < 33055 )\n\t\tupgrade_430();\n\n\tif ( $wp_current_db_version < 33056 )\n\t\tupgrade_431();\n\n\tif ( $wp_current_db_version < 35700 )\n\t\tupgrade_440();\n\n\tmaybe_disable_link_manager();\n\n\tmaybe_disable_automattic_widgets();\n\n\tupdate_option( 'db_version', $wp_db_version );\n\tupdate_option( 'db_upgraded', true );\n}\n\n/**\n * Execute changes made in WordPress 1.0.\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_100() {\n\tglobal $wpdb;\n\n\t// Get the title and ID of every post, post_name to check if it already has a value\n\t$posts = $wpdb->get_results(\"SELECT ID, post_title, post_name FROM $wpdb->posts WHERE post_name = ''\");\n\tif ($posts) {\n\t\tforeach ($posts as $post) {\n\t\t\tif ('' == $post->post_name) {\n\t\t\t\t$newtitle = sanitize_title($post->post_title);\n\t\t\t\t$wpdb->query( $wpdb->prepare(\"UPDATE $wpdb->posts SET post_name = %s WHERE ID = %d\", $newtitle, $post->ID) );\n\t\t\t}\n\t\t}\n\t}\n\n\t$categories = $wpdb->get_results(\"SELECT cat_ID, cat_name, category_nicename FROM $wpdb->categories\");\n\tforeach ($categories as $category) {\n\t\tif ('' == $category->category_nicename) {\n\t\t\t$newtitle = sanitize_title($category->cat_name);\n\t\t\t$wpdb->update( $wpdb->categories, array('category_nicename' => $newtitle), array('cat_ID' => $category->cat_ID) );\n\t\t}\n\t}\n\n\t$sql = \"UPDATE $wpdb->options\n\t\tSET option_value = REPLACE(option_value, 'wp-links/links-images/', 'wp-images/links/')\n\t\tWHERE option_name LIKE %s\n\t\tAND option_value LIKE %s\";\n\t$wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( 'links_rating_image' ) . '%', $wpdb->esc_like( 'wp-links/links-images/' ) . '%' ) );\n\n\t$done_ids = $wpdb->get_results(\"SELECT DISTINCT post_id FROM $wpdb->post2cat\");\n\tif ($done_ids) :\n\t\t$done_posts = array();\n\t\tforeach ($done_ids as $done_id) :\n\t\t\t$done_posts[] = $done_id->post_id;\n\t\tendforeach;\n\t\t$catwhere = ' AND ID NOT IN (' . implode(',', $done_posts) . ')';\n\telse:\n\t\t$catwhere = '';\n\tendif;\n\n\t$allposts = $wpdb->get_results(\"SELECT ID, post_category FROM $wpdb->posts WHERE post_category != '0' $catwhere\");\n\tif ($allposts) :\n\t\tforeach ($allposts as $post) {\n\t\t\t// Check to see if it's already been imported\n\t\t\t$cat = $wpdb->get_row( $wpdb->prepare(\"SELECT * FROM $wpdb->post2cat WHERE post_id = %d AND category_id = %d\", $post->ID, $post->post_category) );\n\t\t\tif (!$cat && 0 != $post->post_category) { // If there's no result\n\t\t\t\t$wpdb->insert( $wpdb->post2cat, array('post_id' => $post->ID, 'category_id' => $post->post_category) );\n\t\t\t}\n\t\t}\n\tendif;\n}\n\n/**\n * Execute changes made in WordPress 1.0.1.\n *\n * @since 1.0.1\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_101() {\n\tglobal $wpdb;\n\n\t// Clean up indices, add a few\n\tadd_clean_index($wpdb->posts, 'post_name');\n\tadd_clean_index($wpdb->posts, 'post_status');\n\tadd_clean_index($wpdb->categories, 'category_nicename');\n\tadd_clean_index($wpdb->comments, 'comment_approved');\n\tadd_clean_index($wpdb->comments, 'comment_post_ID');\n\tadd_clean_index($wpdb->links , 'link_category');\n\tadd_clean_index($wpdb->links , 'link_visible');\n}\n\n/**\n * Execute changes made in WordPress 1.2.\n *\n * @since 1.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_110() {\n\tglobal $wpdb;\n\n\t// Set user_nicename.\n\t$users = $wpdb->get_results(\"SELECT ID, user_nickname, user_nicename FROM $wpdb->users\");\n\tforeach ($users as $user) {\n\t\tif ('' == $user->user_nicename) {\n\t\t\t$newname = sanitize_title($user->user_nickname);\n\t\t\t$wpdb->update( $wpdb->users, array('user_nicename' => $newname), array('ID' => $user->ID) );\n\t\t}\n\t}\n\n\t$users = $wpdb->get_results(\"SELECT ID, user_pass from $wpdb->users\");\n\tforeach ($users as $row) {\n\t\tif (!preg_match('/^[A-Fa-f0-9]{32}$/', $row->user_pass)) {\n\t\t\t$wpdb->update( $wpdb->users, array('user_pass' => md5($row->user_pass)), array('ID' => $row->ID) );\n\t\t}\n\t}\n\n\t// Get the GMT offset, we'll use that later on\n\t$all_options = get_alloptions_110();\n\n\t$time_difference = $all_options->time_difference;\n\n\t\t$server_time = time()+date('Z');\n\t$weblogger_time = $server_time + $time_difference * HOUR_IN_SECONDS;\n\t$gmt_time = time();\n\n\t$diff_gmt_server = ($gmt_time - $server_time) / HOUR_IN_SECONDS;\n\t$diff_weblogger_server = ($weblogger_time - $server_time) / HOUR_IN_SECONDS;\n\t$diff_gmt_weblogger = $diff_gmt_server - $diff_weblogger_server;\n\t$gmt_offset = -$diff_gmt_weblogger;\n\n\t// Add a gmt_offset option, with value $gmt_offset\n\tadd_option('gmt_offset', $gmt_offset);\n\n\t// Check if we already set the GMT fields (if we did, then\n\t// MAX(post_date_gmt) can't be '0000-00-00 00:00:00'\n\t// <michel_v> I just slapped myself silly for not thinking about it earlier\n\t$got_gmt_fields = ! ($wpdb->get_var(\"SELECT MAX(post_date_gmt) FROM $wpdb->posts\") == '0000-00-00 00:00:00');\n\n\tif (!$got_gmt_fields) {\n\n\t\t// Add or subtract time to all dates, to get GMT dates\n\t\t$add_hours = intval($diff_gmt_weblogger);\n\t\t$add_minutes = intval(60 * ($diff_gmt_weblogger - $add_hours));\n\t\t$wpdb->query(\"UPDATE $wpdb->posts SET post_date_gmt = DATE_ADD(post_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)\");\n\t\t$wpdb->query(\"UPDATE $wpdb->posts SET post_modified = post_date\");\n\t\t$wpdb->query(\"UPDATE $wpdb->posts SET post_modified_gmt = DATE_ADD(post_modified, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE) WHERE post_modified != '0000-00-00 00:00:00'\");\n\t\t$wpdb->query(\"UPDATE $wpdb->comments SET comment_date_gmt = DATE_ADD(comment_date, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)\");\n\t\t$wpdb->query(\"UPDATE $wpdb->users SET user_registered = DATE_ADD(user_registered, INTERVAL '$add_hours:$add_minutes' HOUR_MINUTE)\");\n\t}\n\n}\n\n/**\n * Execute changes made in WordPress 1.5.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_130() {\n\tglobal $wpdb;\n\n\t// Remove extraneous backslashes.\n\t$posts = $wpdb->get_results(\"SELECT ID, post_title, post_content, post_excerpt, guid, post_date, post_name, post_status, post_author FROM $wpdb->posts\");\n\tif ($posts) {\n\t\tforeach ($posts as $post) {\n\t\t\t$post_content = addslashes(deslash($post->post_content));\n\t\t\t$post_title = addslashes(deslash($post->post_title));\n\t\t\t$post_excerpt = addslashes(deslash($post->post_excerpt));\n\t\t\tif ( empty($post->guid) )\n\t\t\t\t$guid = get_permalink($post->ID);\n\t\t\telse\n\t\t\t\t$guid = $post->guid;\n\n\t\t\t$wpdb->update( $wpdb->posts, compact('post_title', 'post_content', 'post_excerpt', 'guid'), array('ID' => $post->ID) );\n\n\t\t}\n\t}\n\n\t// Remove extraneous backslashes.\n\t$comments = $wpdb->get_results(\"SELECT comment_ID, comment_author, comment_content FROM $wpdb->comments\");\n\tif ($comments) {\n\t\tforeach ($comments as $comment) {\n\t\t\t$comment_content = deslash($comment->comment_content);\n\t\t\t$comment_author = deslash($comment->comment_author);\n\n\t\t\t$wpdb->update($wpdb->comments, compact('comment_content', 'comment_author'), array('comment_ID' => $comment->comment_ID) );\n\t\t}\n\t}\n\n\t// Remove extraneous backslashes.\n\t$links = $wpdb->get_results(\"SELECT link_id, link_name, link_description FROM $wpdb->links\");\n\tif ($links) {\n\t\tforeach ($links as $link) {\n\t\t\t$link_name = deslash($link->link_name);\n\t\t\t$link_description = deslash($link->link_description);\n\n\t\t\t$wpdb->update( $wpdb->links, compact('link_name', 'link_description'), array('link_id' => $link->link_id) );\n\t\t}\n\t}\n\n\t$active_plugins = __get_option('active_plugins');\n\n\t/*\n\t * If plugins are not stored in an array, they're stored in the old\n\t * newline separated format. Convert to new format.\n\t */\n\tif ( !is_array( $active_plugins ) ) {\n\t\t$active_plugins = explode(\"\\n\", trim($active_plugins));\n\t\tupdate_option('active_plugins', $active_plugins);\n\t}\n\n\t// Obsolete tables\n\t$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optionvalues');\n\t$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiontypes');\n\t$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroups');\n\t$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'optiongroup_options');\n\n\t// Update comments table to use comment_type\n\t$wpdb->query(\"UPDATE $wpdb->comments SET comment_type='trackback', comment_content = REPLACE(comment_content, '<trackback />', '') WHERE comment_content LIKE '<trackback />%'\");\n\t$wpdb->query(\"UPDATE $wpdb->comments SET comment_type='pingback', comment_content = REPLACE(comment_content, '<pingback />', '') WHERE comment_content LIKE '<pingback />%'\");\n\n\t// Some versions have multiple duplicate option_name rows with the same values\n\t$options = $wpdb->get_results(\"SELECT option_name, COUNT(option_name) AS dupes FROM `$wpdb->options` GROUP BY option_name\");\n\tforeach ( $options as $option ) {\n\t\tif ( 1 != $option->dupes ) { // Could this be done in the query?\n\t\t\t$limit = $option->dupes - 1;\n\t\t\t$dupe_ids = $wpdb->get_col( $wpdb->prepare(\"SELECT option_id FROM $wpdb->options WHERE option_name = %s LIMIT %d\", $option->option_name, $limit) );\n\t\t\tif ( $dupe_ids ) {\n\t\t\t\t$dupe_ids = join($dupe_ids, ',');\n\t\t\t\t$wpdb->query(\"DELETE FROM $wpdb->options WHERE option_id IN ($dupe_ids)\");\n\t\t\t}\n\t\t}\n\t}\n\n\tmake_site_theme();\n}\n\n/**\n * Execute changes made in WordPress 2.0.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @global int  $wp_current_db_version\n */\nfunction upgrade_160() {\n\tglobal $wpdb, $wp_current_db_version;\n\n\tpopulate_roles_160();\n\n\t$users = $wpdb->get_results(\"SELECT * FROM $wpdb->users\");\n\tforeach ( $users as $user ) :\n\t\tif ( !empty( $user->user_firstname ) )\n\t\t\tupdate_user_meta( $user->ID, 'first_name', wp_slash($user->user_firstname) );\n\t\tif ( !empty( $user->user_lastname ) )\n\t\t\tupdate_user_meta( $user->ID, 'last_name', wp_slash($user->user_lastname) );\n\t\tif ( !empty( $user->user_nickname ) )\n\t\t\tupdate_user_meta( $user->ID, 'nickname', wp_slash($user->user_nickname) );\n\t\tif ( !empty( $user->user_level ) )\n\t\t\tupdate_user_meta( $user->ID, $wpdb->prefix . 'user_level', $user->user_level );\n\t\tif ( !empty( $user->user_icq ) )\n\t\t\tupdate_user_meta( $user->ID, 'icq', wp_slash($user->user_icq) );\n\t\tif ( !empty( $user->user_aim ) )\n\t\t\tupdate_user_meta( $user->ID, 'aim', wp_slash($user->user_aim) );\n\t\tif ( !empty( $user->user_msn ) )\n\t\t\tupdate_user_meta( $user->ID, 'msn', wp_slash($user->user_msn) );\n\t\tif ( !empty( $user->user_yim ) )\n\t\t\tupdate_user_meta( $user->ID, 'yim', wp_slash($user->user_icq) );\n\t\tif ( !empty( $user->user_description ) )\n\t\t\tupdate_user_meta( $user->ID, 'description', wp_slash($user->user_description) );\n\n\t\tif ( isset( $user->user_idmode ) ):\n\t\t\t$idmode = $user->user_idmode;\n\t\t\tif ($idmode == 'nickname') $id = $user->user_nickname;\n\t\t\tif ($idmode == 'login') $id = $user->user_login;\n\t\t\tif ($idmode == 'firstname') $id = $user->user_firstname;\n\t\t\tif ($idmode == 'lastname') $id = $user->user_lastname;\n\t\t\tif ($idmode == 'namefl') $id = $user->user_firstname.' '.$user->user_lastname;\n\t\t\tif ($idmode == 'namelf') $id = $user->user_lastname.' '.$user->user_firstname;\n\t\t\tif (!$idmode) $id = $user->user_nickname;\n\t\t\t$wpdb->update( $wpdb->users, array('display_name' => $id), array('ID' => $user->ID) );\n\t\tendif;\n\n\t\t// FIXME: RESET_CAPS is temporary code to reset roles and caps if flag is set.\n\t\t$caps = get_user_meta( $user->ID, $wpdb->prefix . 'capabilities');\n\t\tif ( empty($caps) || defined('RESET_CAPS') ) {\n\t\t\t$level = get_user_meta($user->ID, $wpdb->prefix . 'user_level', true);\n\t\t\t$role = translate_level_to_role($level);\n\t\t\tupdate_user_meta( $user->ID, $wpdb->prefix . 'capabilities', array($role => true) );\n\t\t}\n\n\tendforeach;\n\t$old_user_fields = array( 'user_firstname', 'user_lastname', 'user_icq', 'user_aim', 'user_msn', 'user_yim', 'user_idmode', 'user_ip', 'user_domain', 'user_browser', 'user_description', 'user_nickname', 'user_level' );\n\t$wpdb->hide_errors();\n\tforeach ( $old_user_fields as $old )\n\t\t$wpdb->query(\"ALTER TABLE $wpdb->users DROP $old\");\n\t$wpdb->show_errors();\n\n\t// Populate comment_count field of posts table.\n\t$comments = $wpdb->get_results( \"SELECT comment_post_ID, COUNT(*) as c FROM $wpdb->comments WHERE comment_approved = '1' GROUP BY comment_post_ID\" );\n\tif ( is_array( $comments ) )\n\t\tforeach ($comments as $comment)\n\t\t\t$wpdb->update( $wpdb->posts, array('comment_count' => $comment->c), array('ID' => $comment->comment_post_ID) );\n\n\t/*\n\t * Some alpha versions used a post status of object instead of attachment\n\t * and put the mime type in post_type instead of post_mime_type.\n\t */\n\tif ( $wp_current_db_version > 2541 && $wp_current_db_version <= 3091 ) {\n\t\t$objects = $wpdb->get_results(\"SELECT ID, post_type FROM $wpdb->posts WHERE post_status = 'object'\");\n\t\tforeach ($objects as $object) {\n\t\t\t$wpdb->update( $wpdb->posts, array(\t'post_status' => 'attachment',\n\t\t\t\t\t\t\t\t\t\t\t\t'post_mime_type' => $object->post_type,\n\t\t\t\t\t\t\t\t\t\t\t\t'post_type' => ''),\n\t\t\t\t\t\t\t\t\t\t array( 'ID' => $object->ID ) );\n\n\t\t\t$meta = get_post_meta($object->ID, 'imagedata', true);\n\t\t\tif ( ! empty($meta['file']) )\n\t\t\t\tupdate_attached_file( $object->ID, $meta['file'] );\n\t\t}\n\t}\n}\n\n/**\n * Execute changes made in WordPress 2.1.\n *\n * @since 2.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @global int  $wp_current_db_version\n */\nfunction upgrade_210() {\n\tglobal $wpdb, $wp_current_db_version;\n\n\tif ( $wp_current_db_version < 3506 ) {\n\t\t// Update status and type.\n\t\t$posts = $wpdb->get_results(\"SELECT ID, post_status FROM $wpdb->posts\");\n\n\t\tif ( ! empty($posts) ) foreach ($posts as $post) {\n\t\t\t$status = $post->post_status;\n\t\t\t$type = 'post';\n\n\t\t\tif ( 'static' == $status ) {\n\t\t\t\t$status = 'publish';\n\t\t\t\t$type = 'page';\n\t\t\t} elseif ( 'attachment' == $status ) {\n\t\t\t\t$status = 'inherit';\n\t\t\t\t$type = 'attachment';\n\t\t\t}\n\n\t\t\t$wpdb->query( $wpdb->prepare(\"UPDATE $wpdb->posts SET post_status = %s, post_type = %s WHERE ID = %d\", $status, $type, $post->ID) );\n\t\t}\n\t}\n\n\tif ( $wp_current_db_version < 3845 ) {\n\t\tpopulate_roles_210();\n\t}\n\n\tif ( $wp_current_db_version < 3531 ) {\n\t\t// Give future posts a post_status of future.\n\t\t$now = gmdate('Y-m-d H:i:59');\n\t\t$wpdb->query (\"UPDATE $wpdb->posts SET post_status = 'future' WHERE post_status = 'publish' AND post_date_gmt > '$now'\");\n\n\t\t$posts = $wpdb->get_results(\"SELECT ID, post_date FROM $wpdb->posts WHERE post_status ='future'\");\n\t\tif ( !empty($posts) )\n\t\t\tforeach ( $posts as $post )\n\t\t\t\twp_schedule_single_event(mysql2date('U', $post->post_date, false), 'publish_future_post', array($post->ID));\n\t}\n}\n\n/**\n * Execute changes made in WordPress 2.3.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @global int  $wp_current_db_version\n */\nfunction upgrade_230() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\tif ( $wp_current_db_version < 5200 ) {\n\t\tpopulate_roles_230();\n\t}\n\n\t// Convert categories to terms.\n\t$tt_ids = array();\n\t$have_tags = false;\n\t$categories = $wpdb->get_results(\"SELECT * FROM $wpdb->categories ORDER BY cat_ID\");\n\tforeach ($categories as $category) {\n\t\t$term_id = (int) $category->cat_ID;\n\t\t$name = $category->cat_name;\n\t\t$description = $category->category_description;\n\t\t$slug = $category->category_nicename;\n\t\t$parent = $category->category_parent;\n\t\t$term_group = 0;\n\n\t\t// Associate terms with the same slug in a term group and make slugs unique.\n\t\tif ( $exists = $wpdb->get_results( $wpdb->prepare(\"SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s\", $slug) ) ) {\n\t\t\t$term_group = $exists[0]->term_group;\n\t\t\t$id = $exists[0]->term_id;\n\t\t\t$num = 2;\n\t\t\tdo {\n\t\t\t\t$alt_slug = $slug . \"-$num\";\n\t\t\t\t$num++;\n\t\t\t\t$slug_check = $wpdb->get_var( $wpdb->prepare(\"SELECT slug FROM $wpdb->terms WHERE slug = %s\", $alt_slug) );\n\t\t\t} while ( $slug_check );\n\n\t\t\t$slug = $alt_slug;\n\n\t\t\tif ( empty( $term_group ) ) {\n\t\t\t\t$term_group = $wpdb->get_var(\"SELECT MAX(term_group) FROM $wpdb->terms GROUP BY term_group\") + 1;\n\t\t\t\t$wpdb->query( $wpdb->prepare(\"UPDATE $wpdb->terms SET term_group = %d WHERE term_id = %d\", $term_group, $id) );\n\t\t\t}\n\t\t}\n\n\t\t$wpdb->query( $wpdb->prepare(\"INSERT INTO $wpdb->terms (term_id, name, slug, term_group) VALUES\n\t\t(%d, %s, %s, %d)\", $term_id, $name, $slug, $term_group) );\n\n\t\t$count = 0;\n\t\tif ( !empty($category->category_count) ) {\n\t\t\t$count = (int) $category->category_count;\n\t\t\t$taxonomy = 'category';\n\t\t\t$wpdb->query( $wpdb->prepare(\"INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)\", $term_id, $taxonomy, $description, $parent, $count) );\n\t\t\t$tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;\n\t\t}\n\n\t\tif ( !empty($category->link_count) ) {\n\t\t\t$count = (int) $category->link_count;\n\t\t\t$taxonomy = 'link_category';\n\t\t\t$wpdb->query( $wpdb->prepare(\"INSERT INTO $wpdb->term_taxonomy (term_id, taxonomy, description, parent, count) VALUES ( %d, %s, %s, %d, %d)\", $term_id, $taxonomy, $description, $parent, $count) );\n\t\t\t$tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;\n\t\t}\n\n\t\tif ( !empty($category->tag_count) ) {\n\t\t\t$have_tags = true;\n\t\t\t$count = (int) $category->tag_count;\n\t\t\t$taxonomy = 'post_tag';\n\t\t\t$wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') );\n\t\t\t$tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;\n\t\t}\n\n\t\tif ( empty($count) ) {\n\t\t\t$count = 0;\n\t\t\t$taxonomy = 'category';\n\t\t\t$wpdb->insert( $wpdb->term_taxonomy, compact('term_id', 'taxonomy', 'description', 'parent', 'count') );\n\t\t\t$tt_ids[$term_id][$taxonomy] = (int) $wpdb->insert_id;\n\t\t}\n\t}\n\n\t$select = 'post_id, category_id';\n\tif ( $have_tags )\n\t\t$select .= ', rel_type';\n\n\t$posts = $wpdb->get_results(\"SELECT $select FROM $wpdb->post2cat GROUP BY post_id, category_id\");\n\tforeach ( $posts as $post ) {\n\t\t$post_id = (int) $post->post_id;\n\t\t$term_id = (int) $post->category_id;\n\t\t$taxonomy = 'category';\n\t\tif ( !empty($post->rel_type) && 'tag' == $post->rel_type)\n\t\t\t$taxonomy = 'tag';\n\t\t$tt_id = $tt_ids[$term_id][$taxonomy];\n\t\tif ( empty($tt_id) )\n\t\t\tcontinue;\n\n\t\t$wpdb->insert( $wpdb->term_relationships, array('object_id' => $post_id, 'term_taxonomy_id' => $tt_id) );\n\t}\n\n\t// < 3570 we used linkcategories. >= 3570 we used categories and link2cat.\n\tif ( $wp_current_db_version < 3570 ) {\n\t\t/*\n\t\t * Create link_category terms for link categories. Create a map of link\n\t\t * cat IDs to link_category terms.\n\t\t */\n\t\t$link_cat_id_map = array();\n\t\t$default_link_cat = 0;\n\t\t$tt_ids = array();\n\t\t$link_cats = $wpdb->get_results(\"SELECT cat_id, cat_name FROM \" . $wpdb->prefix . 'linkcategories');\n\t\tforeach ( $link_cats as $category) {\n\t\t\t$cat_id = (int) $category->cat_id;\n\t\t\t$term_id = 0;\n\t\t\t$name = wp_slash($category->cat_name);\n\t\t\t$slug = sanitize_title($name);\n\t\t\t$term_group = 0;\n\n\t\t\t// Associate terms with the same slug in a term group and make slugs unique.\n\t\t\tif ( $exists = $wpdb->get_results( $wpdb->prepare(\"SELECT term_id, term_group FROM $wpdb->terms WHERE slug = %s\", $slug) ) ) {\n\t\t\t\t$term_group = $exists[0]->term_group;\n\t\t\t\t$term_id = $exists[0]->term_id;\n\t\t\t}\n\n\t\t\tif ( empty($term_id) ) {\n\t\t\t\t$wpdb->insert( $wpdb->terms, compact('name', 'slug', 'term_group') );\n\t\t\t\t$term_id = (int) $wpdb->insert_id;\n\t\t\t}\n\n\t\t\t$link_cat_id_map[$cat_id] = $term_id;\n\t\t\t$default_link_cat = $term_id;\n\n\t\t\t$wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $term_id, 'taxonomy' => 'link_category', 'description' => '', 'parent' => 0, 'count' => 0) );\n\t\t\t$tt_ids[$term_id] = (int) $wpdb->insert_id;\n\t\t}\n\n\t\t// Associate links to cats.\n\t\t$links = $wpdb->get_results(\"SELECT link_id, link_category FROM $wpdb->links\");\n\t\tif ( !empty($links) ) foreach ( $links as $link ) {\n\t\t\tif ( 0 == $link->link_category )\n\t\t\t\tcontinue;\n\t\t\tif ( ! isset($link_cat_id_map[$link->link_category]) )\n\t\t\t\tcontinue;\n\t\t\t$term_id = $link_cat_id_map[$link->link_category];\n\t\t\t$tt_id = $tt_ids[$term_id];\n\t\t\tif ( empty($tt_id) )\n\t\t\t\tcontinue;\n\n\t\t\t$wpdb->insert( $wpdb->term_relationships, array('object_id' => $link->link_id, 'term_taxonomy_id' => $tt_id) );\n\t\t}\n\n\t\t// Set default to the last category we grabbed during the upgrade loop.\n\t\tupdate_option('default_link_category', $default_link_cat);\n\t} else {\n\t\t$links = $wpdb->get_results(\"SELECT link_id, category_id FROM $wpdb->link2cat GROUP BY link_id, category_id\");\n\t\tforeach ( $links as $link ) {\n\t\t\t$link_id = (int) $link->link_id;\n\t\t\t$term_id = (int) $link->category_id;\n\t\t\t$taxonomy = 'link_category';\n\t\t\t$tt_id = $tt_ids[$term_id][$taxonomy];\n\t\t\tif ( empty($tt_id) )\n\t\t\t\tcontinue;\n\t\t\t$wpdb->insert( $wpdb->term_relationships, array('object_id' => $link_id, 'term_taxonomy_id' => $tt_id) );\n\t\t}\n\t}\n\n\tif ( $wp_current_db_version < 4772 ) {\n\t\t// Obsolete linkcategories table\n\t\t$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'linkcategories');\n\t}\n\n\t// Recalculate all counts\n\t$terms = $wpdb->get_results(\"SELECT term_taxonomy_id, taxonomy FROM $wpdb->term_taxonomy\");\n\tforeach ( (array) $terms as $term ) {\n\t\tif ( ('post_tag' == $term->taxonomy) || ('category' == $term->taxonomy) )\n\t\t\t$count = $wpdb->get_var( $wpdb->prepare(\"SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d\", $term->term_taxonomy_id) );\n\t\telse\n\t\t\t$count = $wpdb->get_var( $wpdb->prepare(\"SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d\", $term->term_taxonomy_id) );\n\t\t$wpdb->update( $wpdb->term_taxonomy, array('count' => $count), array('term_taxonomy_id' => $term->term_taxonomy_id) );\n\t}\n}\n\n/**\n * Remove old options from the database.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_230_options_table() {\n\tglobal $wpdb;\n\t$old_options_fields = array( 'option_can_override', 'option_type', 'option_width', 'option_height', 'option_description', 'option_admin_level' );\n\t$wpdb->hide_errors();\n\tforeach ( $old_options_fields as $old )\n\t\t$wpdb->query(\"ALTER TABLE $wpdb->options DROP $old\");\n\t$wpdb->show_errors();\n}\n\n/**\n * Remove old categories, link2cat, and post2cat database tables.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_230_old_tables() {\n\tglobal $wpdb;\n\t$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'categories');\n\t$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'link2cat');\n\t$wpdb->query('DROP TABLE IF EXISTS ' . $wpdb->prefix . 'post2cat');\n}\n\n/**\n * Upgrade old slugs made in version 2.2.\n *\n * @since 2.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_old_slugs() {\n\t// Upgrade people who were using the Redirect Old Slugs plugin.\n\tglobal $wpdb;\n\t$wpdb->query(\"UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'\");\n}\n\n/**\n * Execute changes made in WordPress 2.5.0.\n *\n * @since 2.5.0\n *\n * @global int $wp_current_db_version\n */\nfunction upgrade_250() {\n\tglobal $wp_current_db_version;\n\n\tif ( $wp_current_db_version < 6689 ) {\n\t\tpopulate_roles_250();\n\t}\n\n}\n\n/**\n * Execute changes made in WordPress 2.5.2.\n *\n * @since 2.5.2\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_252() {\n\tglobal $wpdb;\n\n\t$wpdb->query(\"UPDATE $wpdb->users SET user_activation_key = ''\");\n}\n\n/**\n * Execute changes made in WordPress 2.6.\n *\n * @since 2.6.0\n *\n * @global int $wp_current_db_version\n */\nfunction upgrade_260() {\n\tglobal $wp_current_db_version;\n\n\tif ( $wp_current_db_version < 8000 )\n\t\tpopulate_roles_260();\n}\n\n/**\n * Execute changes made in WordPress 2.7.\n *\n * @since 2.7.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @global int  $wp_current_db_version\n */\nfunction upgrade_270() {\n\tglobal $wpdb, $wp_current_db_version;\n\n\tif ( $wp_current_db_version < 8980 )\n\t\tpopulate_roles_270();\n\n\t// Update post_date for unpublished posts with empty timestamp\n\tif ( $wp_current_db_version < 8921 )\n\t\t$wpdb->query( \"UPDATE $wpdb->posts SET post_date = post_modified WHERE post_date = '0000-00-00 00:00:00'\" );\n}\n\n/**\n * Execute changes made in WordPress 2.8.\n *\n * @since 2.8.0\n *\n * @global int  $wp_current_db_version\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_280() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\tif ( $wp_current_db_version < 10360 )\n\t\tpopulate_roles_280();\n\tif ( is_multisite() ) {\n\t\t$start = 0;\n\t\twhile( $rows = $wpdb->get_results( \"SELECT option_name, option_value FROM $wpdb->options ORDER BY option_id LIMIT $start, 20\" ) ) {\n\t\t\tforeach ( $rows as $row ) {\n\t\t\t\t$value = $row->option_value;\n\t\t\t\tif ( !@unserialize( $value ) )\n\t\t\t\t\t$value = stripslashes( $value );\n\t\t\t\tif ( $value !== $row->option_value ) {\n\t\t\t\t\tupdate_option( $row->option_name, $value );\n\t\t\t\t}\n\t\t\t}\n\t\t\t$start += 20;\n\t\t}\n\t\trefresh_blog_details( $wpdb->blogid );\n\t}\n}\n\n/**\n * Execute changes made in WordPress 2.9.\n *\n * @since 2.9.0\n *\n * @global int $wp_current_db_version\n */\nfunction upgrade_290() {\n\tglobal $wp_current_db_version;\n\n\tif ( $wp_current_db_version < 11958 ) {\n\t\t// Previously, setting depth to 1 would redundantly disable threading, but now 2 is the minimum depth to avoid confusion\n\t\tif ( get_option( 'thread_comments_depth' ) == '1' ) {\n\t\t\tupdate_option( 'thread_comments_depth', 2 );\n\t\t\tupdate_option( 'thread_comments', 0 );\n\t\t}\n\t}\n}\n\n/**\n * Execute changes made in WordPress 3.0.\n *\n * @since 3.0.0\n *\n * @global int  $wp_current_db_version\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction upgrade_300() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\tif ( $wp_current_db_version < 15093 )\n\t\tpopulate_roles_300();\n\n\tif ( $wp_current_db_version < 14139 && is_multisite() && is_main_site() && ! defined( 'MULTISITE' ) && get_site_option( 'siteurl' ) === false )\n\t\tadd_site_option( 'siteurl', '' );\n\n\t// 3.0 screen options key name changes.\n\tif ( wp_should_upgrade_global_tables() ) {\n\t\t$sql = \"DELETE FROM $wpdb->usermeta\n\t\t\tWHERE meta_key LIKE %s\n\t\t\tOR meta_key LIKE %s\n\t\t\tOR meta_key LIKE %s\n\t\t\tOR meta_key LIKE %s\n\t\t\tOR meta_key LIKE %s\n\t\t\tOR meta_key LIKE %s\n\t\t\tOR meta_key = 'manageedittagscolumnshidden'\n\t\t\tOR meta_key = 'managecategoriescolumnshidden'\n\t\t\tOR meta_key = 'manageedit-tagscolumnshidden'\n\t\t\tOR meta_key = 'manageeditcolumnshidden'\n\t\t\tOR meta_key = 'categories_per_page'\n\t\t\tOR meta_key = 'edit_tags_per_page'\";\n\t\t$prefix = $wpdb->esc_like( $wpdb->base_prefix );\n\t\t$wpdb->query( $wpdb->prepare( $sql,\n\t\t\t$prefix . '%' . $wpdb->esc_like( 'meta-box-hidden' ) . '%',\n\t\t\t$prefix . '%' . $wpdb->esc_like( 'closedpostboxes' ) . '%',\n\t\t\t$prefix . '%' . $wpdb->esc_like( 'manage-'\t   ) . '%' . $wpdb->esc_like( '-columns-hidden' ) . '%',\n\t\t\t$prefix . '%' . $wpdb->esc_like( 'meta-box-order'  ) . '%',\n\t\t\t$prefix . '%' . $wpdb->esc_like( 'metaboxorder'    ) . '%',\n\t\t\t$prefix . '%' . $wpdb->esc_like( 'screen_layout'   ) . '%'\n\t\t) );\n\t}\n\n}\n\n/**\n * Execute changes made in WordPress 3.3.\n *\n * @since 3.3.0\n *\n * @global int   $wp_current_db_version\n * @global wpdb  $wpdb\n * @global array $wp_registered_widgets\n * @global array $sidebars_widgets\n */\nfunction upgrade_330() {\n\tglobal $wp_current_db_version, $wpdb, $wp_registered_widgets, $sidebars_widgets;\n\n\tif ( $wp_current_db_version < 19061 && wp_should_upgrade_global_tables() ) {\n\t\t$wpdb->query( \"DELETE FROM $wpdb->usermeta WHERE meta_key IN ('show_admin_bar_admin', 'plugins_last_view')\" );\n\t}\n\n\tif ( $wp_current_db_version >= 11548 )\n\t\treturn;\n\n\t$sidebars_widgets = get_option( 'sidebars_widgets', array() );\n\t$_sidebars_widgets = array();\n\n\tif ( isset($sidebars_widgets['wp_inactive_widgets']) || empty($sidebars_widgets) )\n\t\t$sidebars_widgets['array_version'] = 3;\n\telseif ( !isset($sidebars_widgets['array_version']) )\n\t\t$sidebars_widgets['array_version'] = 1;\n\n\tswitch ( $sidebars_widgets['array_version'] ) {\n\t\tcase 1 :\n\t\t\tforeach ( (array) $sidebars_widgets as $index => $sidebar )\n\t\t\tif ( is_array($sidebar) )\n\t\t\tforeach ( (array) $sidebar as $i => $name ) {\n\t\t\t\t$id = strtolower($name);\n\t\t\t\tif ( isset($wp_registered_widgets[$id]) ) {\n\t\t\t\t\t$_sidebars_widgets[$index][$i] = $id;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$id = sanitize_title($name);\n\t\t\t\tif ( isset($wp_registered_widgets[$id]) ) {\n\t\t\t\t\t$_sidebars_widgets[$index][$i] = $id;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$found = false;\n\n\t\t\t\tforeach ( $wp_registered_widgets as $widget_id => $widget ) {\n\t\t\t\t\tif ( strtolower($widget['name']) == strtolower($name) ) {\n\t\t\t\t\t\t$_sidebars_widgets[$index][$i] = $widget['id'];\n\t\t\t\t\t\t$found = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} elseif ( sanitize_title($widget['name']) == sanitize_title($name) ) {\n\t\t\t\t\t\t$_sidebars_widgets[$index][$i] = $widget['id'];\n\t\t\t\t\t\t$found = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( $found )\n\t\t\t\t\tcontinue;\n\n\t\t\t\tunset($_sidebars_widgets[$index][$i]);\n\t\t\t}\n\t\t\t$_sidebars_widgets['array_version'] = 2;\n\t\t\t$sidebars_widgets = $_sidebars_widgets;\n\t\t\tunset($_sidebars_widgets);\n\n\t\tcase 2 :\n\t\t\t$sidebars_widgets = retrieve_widgets();\n\t\t\t$sidebars_widgets['array_version'] = 3;\n\t\t\tupdate_option( 'sidebars_widgets', $sidebars_widgets );\n\t}\n}\n\n/**\n * Execute changes made in WordPress 3.4.\n *\n * @since 3.4.0\n *\n * @global int   $wp_current_db_version\n * @global wpdb  $wpdb\n */\nfunction upgrade_340() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\tif ( $wp_current_db_version < 19798 ) {\n\t\t$wpdb->hide_errors();\n\t\t$wpdb->query( \"ALTER TABLE $wpdb->options DROP COLUMN blog_id\" );\n\t\t$wpdb->show_errors();\n\t}\n\n\tif ( $wp_current_db_version < 19799 ) {\n\t\t$wpdb->hide_errors();\n\t\t$wpdb->query(\"ALTER TABLE $wpdb->comments DROP INDEX comment_approved\");\n\t\t$wpdb->show_errors();\n\t}\n\n\tif ( $wp_current_db_version < 20022 && wp_should_upgrade_global_tables() ) {\n\t\t$wpdb->query( \"DELETE FROM $wpdb->usermeta WHERE meta_key = 'themes_last_view'\" );\n\t}\n\n\tif ( $wp_current_db_version < 20080 ) {\n\t\tif ( 'yes' == $wpdb->get_var( \"SELECT autoload FROM $wpdb->options WHERE option_name = 'uninstall_plugins'\" ) ) {\n\t\t\t$uninstall_plugins = get_option( 'uninstall_plugins' );\n\t\t\tdelete_option( 'uninstall_plugins' );\n\t\t\tadd_option( 'uninstall_plugins', $uninstall_plugins, null, 'no' );\n\t\t}\n\t}\n}\n\n/**\n * Execute changes made in WordPress 3.5.\n *\n * @since 3.5.0\n *\n * @global int   $wp_current_db_version\n * @global wpdb  $wpdb\n */\nfunction upgrade_350() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\tif ( $wp_current_db_version < 22006 && $wpdb->get_var( \"SELECT link_id FROM $wpdb->links LIMIT 1\" ) )\n\t\tupdate_option( 'link_manager_enabled', 1 ); // Previously set to 0 by populate_options()\n\n\tif ( $wp_current_db_version < 21811 && wp_should_upgrade_global_tables() ) {\n\t\t$meta_keys = array();\n\t\tforeach ( array_merge( get_post_types(), get_taxonomies() ) as $name ) {\n\t\t\tif ( false !== strpos( $name, '-' ) )\n\t\t\t$meta_keys[] = 'edit_' . str_replace( '-', '_', $name ) . '_per_page';\n\t\t}\n\t\tif ( $meta_keys ) {\n\t\t\t$meta_keys = implode( \"', '\", $meta_keys );\n\t\t\t$wpdb->query( \"DELETE FROM $wpdb->usermeta WHERE meta_key IN ('$meta_keys')\" );\n\t\t}\n\t}\n\n\tif ( $wp_current_db_version < 22422 && $term = get_term_by( 'slug', 'post-format-standard', 'post_format' ) )\n\t\twp_delete_term( $term->term_id, 'post_format' );\n}\n\n/**\n * Execute changes made in WordPress 3.7.\n *\n * @since 3.7.0\n *\n * @global int $wp_current_db_version\n */\nfunction upgrade_370() {\n\tglobal $wp_current_db_version;\n\tif ( $wp_current_db_version < 25824 )\n\t\twp_clear_scheduled_hook( 'wp_auto_updates_maybe_update' );\n}\n\n/**\n * Execute changes made in WordPress 3.7.2.\n *\n * @since 3.7.2\n * @since 3.8.0\n *\n * @global int $wp_current_db_version\n */\nfunction upgrade_372() {\n\tglobal $wp_current_db_version;\n\tif ( $wp_current_db_version < 26148 )\n\t\twp_clear_scheduled_hook( 'wp_maybe_auto_update' );\n}\n\n/**\n * Execute changes made in WordPress 3.8.0.\n *\n * @since 3.8.0\n *\n * @global int $wp_current_db_version\n */\nfunction upgrade_380() {\n\tglobal $wp_current_db_version;\n\tif ( $wp_current_db_version < 26691 ) {\n\t\tdeactivate_plugins( array( 'mp6/mp6.php' ), true );\n\t}\n}\n\n/**\n * Execute changes made in WordPress 4.0.0.\n *\n * @since 4.0.0\n *\n * @global int $wp_current_db_version\n */\nfunction upgrade_400() {\n\tglobal $wp_current_db_version;\n\tif ( $wp_current_db_version < 29630 ) {\n\t\tif ( ! is_multisite() && false === get_option( 'WPLANG' ) ) {\n\t\t\tif ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && in_array( WPLANG, get_available_languages() ) ) {\n\t\t\t\tupdate_option( 'WPLANG', WPLANG );\n\t\t\t} else {\n\t\t\t\tupdate_option( 'WPLANG', '' );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Execute changes made in WordPress 4.2.0.\n *\n * @since 4.2.0\n *\n * @global int   $wp_current_db_version\n * @global wpdb  $wpdb\n */\nfunction upgrade_420() {}\n\n/**\n * Executes changes made in WordPress 4.3.0.\n *\n * @since 4.3.0\n *\n * @global int  $wp_current_db_version Current version.\n * @global wpdb $wpdb                  WordPress database abstraction object.\n */\nfunction upgrade_430() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\tif ( $wp_current_db_version < 32364 ) {\n\t\tupgrade_430_fix_comments();\n\t}\n\n\t// Shared terms are split in a separate process.\n\tif ( $wp_current_db_version < 32814 ) {\n\t\tupdate_option( 'finished_splitting_shared_terms', 0 );\n\t\twp_schedule_single_event( time() + ( 1 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );\n\t}\n\n\tif ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) {\n\t\tif ( is_multisite() ) {\n\t\t\t$tables = $wpdb->tables( 'blog' );\n\t\t} else {\n\t\t\t$tables = $wpdb->tables( 'all' );\n\t\t\tif ( ! wp_should_upgrade_global_tables() ) {\n\t\t\t\t$global_tables = $wpdb->tables( 'global' );\n\t\t\t\t$tables = array_diff_assoc( $tables, $global_tables );\n\t\t\t}\n\t\t}\n\n\t\tforeach ( $tables as $table ) {\n\t\t\tmaybe_convert_table_to_utf8mb4( $table );\n\t\t}\n\t}\n}\n\n/**\n * Executes comments changes made in WordPress 4.3.0.\n *\n * @since 4.3.0\n *\n * @global int  $wp_current_db_version Current version.\n * @global wpdb $wpdb                  WordPress database abstraction object.\n */\nfunction upgrade_430_fix_comments() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\t$content_length = $wpdb->get_col_length( $wpdb->comments, 'comment_content' );\n\n\tif ( is_wp_error( $content_length ) ) {\n\t\treturn;\n\t}\n\n\tif ( false === $content_length ) {\n\t\t$content_length = array(\n\t\t\t'type'   => 'byte',\n\t\t\t'length' => 65535,\n\t\t);\n\t} elseif ( ! is_array( $content_length ) ) {\n\t\t$length = (int) $content_length > 0 ? (int) $content_length : 65535;\n\t\t$content_length = array(\n\t\t\t'type'\t => 'byte',\n\t\t\t'length' => $length\n\t\t);\n\t}\n\n\tif ( 'byte' !== $content_length['type'] || 0 === $content_length['length'] ) {\n\t\t// Sites with malformed DB schemas are on their own.\n\t\treturn;\n\t}\n\n\t$allowed_length = intval( $content_length['length'] ) - 10;\n\n\t$comments = $wpdb->get_results(\n\t\t\"SELECT `comment_ID` FROM `{$wpdb->comments}`\n\t\t\tWHERE `comment_date_gmt` > '2015-04-26'\n\t\t\tAND LENGTH( `comment_content` ) >= {$allowed_length}\n\t\t\tAND ( `comment_content` LIKE '%<%' OR `comment_content` LIKE '%>%' )\"\n\t);\n\n\tforeach ( $comments as $comment ) {\n\t\twp_delete_comment( $comment->comment_ID, true );\n\t}\n}\n\n/**\n * Executes changes made in WordPress 4.3.1.\n *\n * @since 4.3.1\n */\nfunction upgrade_431() {\n\t// Fix incorrect cron entries for term splitting\n\t$cron_array = _get_cron_array();\n\tif ( isset( $cron_array['wp_batch_split_terms'] ) ) {\n\t\tunset( $cron_array['wp_batch_split_terms'] );\n\t\t_set_cron_array( $cron_array );\n\t}\n}\n\n/**\n * Executes changes made in WordPress 4.4.0.\n *\n * @since 4.4.0\n *\n * @global int  $wp_current_db_version Current version.\n * @global wpdb $wpdb                  WordPress database abstraction object.\n */\nfunction upgrade_440() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\tif ( $wp_current_db_version < 34030 ) {\n\t\t$wpdb->query( \"ALTER TABLE {$wpdb->options} MODIFY option_name VARCHAR(191)\" );\n\t}\n\n\t// Remove the unused 'add_users' role.\n\t$roles = wp_roles();\n\tforeach ( $roles->role_objects as $role ) {\n\t\tif ( $role->has_cap( 'add_users' ) ) {\n\t\t\t$role->remove_cap( 'add_users' );\n\t\t}\n\t}\n}\n\n/**\n * Executes network-level upgrade routines.\n *\n * @since 3.0.0\n *\n * @global int   $wp_current_db_version\n * @global wpdb  $wpdb\n */\nfunction upgrade_network() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\t// Always.\n\tif ( is_main_network() ) {\n\t\t/*\n\t\t * Deletes all expired transients. The multi-table delete syntax is used\n\t\t * to delete the transient record from table a, and the corresponding\n\t\t * transient_timeout record from table b.\n\t\t */\n\t\t$time = time();\n\t\t$sql = \"DELETE a, b FROM $wpdb->sitemeta a, $wpdb->sitemeta b\n\t\t\tWHERE a.meta_key LIKE %s\n\t\t\tAND a.meta_key NOT LIKE %s\n\t\t\tAND b.meta_key = CONCAT( '_site_transient_timeout_', SUBSTRING( a.meta_key, 17 ) )\n\t\t\tAND b.meta_value < %d\";\n\t\t$wpdb->query( $wpdb->prepare( $sql, $wpdb->esc_like( '_site_transient_' ) . '%', $wpdb->esc_like ( '_site_transient_timeout_' ) . '%', $time ) );\n\t}\n\n\t// 2.8.\n\tif ( $wp_current_db_version < 11549 ) {\n\t\t$wpmu_sitewide_plugins = get_site_option( 'wpmu_sitewide_plugins' );\n\t\t$active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' );\n\t\tif ( $wpmu_sitewide_plugins ) {\n\t\t\tif ( !$active_sitewide_plugins )\n\t\t\t\t$sitewide_plugins = (array) $wpmu_sitewide_plugins;\n\t\t\telse\n\t\t\t\t$sitewide_plugins = array_merge( (array) $active_sitewide_plugins, (array) $wpmu_sitewide_plugins );\n\n\t\t\tupdate_site_option( 'active_sitewide_plugins', $sitewide_plugins );\n\t\t}\n\t\tdelete_site_option( 'wpmu_sitewide_plugins' );\n\t\tdelete_site_option( 'deactivated_sitewide_plugins' );\n\n\t\t$start = 0;\n\t\twhile( $rows = $wpdb->get_results( \"SELECT meta_key, meta_value FROM {$wpdb->sitemeta} ORDER BY meta_id LIMIT $start, 20\" ) ) {\n\t\t\tforeach ( $rows as $row ) {\n\t\t\t\t$value = $row->meta_value;\n\t\t\t\tif ( !@unserialize( $value ) )\n\t\t\t\t\t$value = stripslashes( $value );\n\t\t\t\tif ( $value !== $row->meta_value ) {\n\t\t\t\t\tupdate_site_option( $row->meta_key, $value );\n\t\t\t\t}\n\t\t\t}\n\t\t\t$start += 20;\n\t\t}\n\t}\n\n\t// 3.0\n\tif ( $wp_current_db_version < 13576 )\n\t\tupdate_site_option( 'global_terms_enabled', '1' );\n\n\t// 3.3\n\tif ( $wp_current_db_version < 19390 )\n\t\tupdate_site_option( 'initial_db_version', $wp_current_db_version );\n\n\tif ( $wp_current_db_version < 19470 ) {\n\t\tif ( false === get_site_option( 'active_sitewide_plugins' ) )\n\t\t\tupdate_site_option( 'active_sitewide_plugins', array() );\n\t}\n\n\t// 3.4\n\tif ( $wp_current_db_version < 20148 ) {\n\t\t// 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name.\n\t\t$allowedthemes  = get_site_option( 'allowedthemes'  );\n\t\t$allowed_themes = get_site_option( 'allowed_themes' );\n\t\tif ( false === $allowedthemes && is_array( $allowed_themes ) && $allowed_themes ) {\n\t\t\t$converted = array();\n\t\t\t$themes = wp_get_themes();\n\t\t\tforeach ( $themes as $stylesheet => $theme_data ) {\n\t\t\t\tif ( isset( $allowed_themes[ $theme_data->get('Name') ] ) )\n\t\t\t\t\t$converted[ $stylesheet ] = true;\n\t\t\t}\n\t\t\tupdate_site_option( 'allowedthemes', $converted );\n\t\t\tdelete_site_option( 'allowed_themes' );\n\t\t}\n\t}\n\n\t// 3.5\n\tif ( $wp_current_db_version < 21823 )\n\t\tupdate_site_option( 'ms_files_rewriting', '1' );\n\n\t// 3.5.2\n\tif ( $wp_current_db_version < 24448 ) {\n\t\t$illegal_names = get_site_option( 'illegal_names' );\n\t\tif ( is_array( $illegal_names ) && count( $illegal_names ) === 1 ) {\n\t\t\t$illegal_name = reset( $illegal_names );\n\t\t\t$illegal_names = explode( ' ', $illegal_name );\n\t\t\tupdate_site_option( 'illegal_names', $illegal_names );\n\t\t}\n\t}\n\n\t// 4.2\n\tif ( $wp_current_db_version < 31351 && $wpdb->charset === 'utf8mb4' ) {\n\t\tif ( wp_should_upgrade_global_tables() ) {\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->usermeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))\" );\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->site DROP INDEX domain, ADD INDEX domain(domain(140),path(51))\" );\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->sitemeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))\" );\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->signups DROP INDEX domain_path, ADD INDEX domain_path(domain(140),path(51))\" );\n\n\t\t\t$tables = $wpdb->tables( 'global' );\n\n\t\t\t// sitecategories may not exist.\n\t\t\tif ( ! $wpdb->get_var( \"SHOW TABLES LIKE '{$tables['sitecategories']}'\" ) ) {\n\t\t\t\tunset( $tables['sitecategories'] );\n\t\t\t}\n\n\t\t\tforeach ( $tables as $table ) {\n\t\t\t\tmaybe_convert_table_to_utf8mb4( $table );\n\t\t\t}\n\t\t}\n\t}\n\n\t// 4.3\n\tif ( $wp_current_db_version < 33055 && 'utf8mb4' === $wpdb->charset ) {\n\t\tif ( wp_should_upgrade_global_tables() ) {\n\t\t\t$upgrade = false;\n\t\t\t$indexes = $wpdb->get_results( \"SHOW INDEXES FROM $wpdb->signups\" );\n\t\t\tforeach ( $indexes as $index ) {\n\t\t\t\tif ( 'domain_path' == $index->Key_name && 'domain' == $index->Column_name && 140 != $index->Sub_part ) {\n\t\t\t\t\t$upgrade = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $upgrade ) {\n\t\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->signups DROP INDEX domain_path, ADD INDEX domain_path(domain(140),path(51))\" );\n\t\t\t}\n\n\t\t\t$tables = $wpdb->tables( 'global' );\n\n\t\t\t// sitecategories may not exist.\n\t\t\tif ( ! $wpdb->get_var( \"SHOW TABLES LIKE '{$tables['sitecategories']}'\" ) ) {\n\t\t\t\tunset( $tables['sitecategories'] );\n\t\t\t}\n\n\t\t\tforeach ( $tables as $table ) {\n\t\t\t\tmaybe_convert_table_to_utf8mb4( $table );\n\t\t\t}\n\t\t}\n\t}\n}\n\n//\n// General functions we use to actually do stuff\n//\n\n/**\n * Creates a table in the database if it doesn't already exist.\n *\n * This method checks for an existing database and creates a new one if it's not\n * already present. It doesn't rely on MySQL's \"IF NOT EXISTS\" statement, but chooses\n * to query all tables first and then run the SQL statement creating the table.\n *\n * @since 1.0.0\n *\n * @global wpdb  $wpdb\n *\n * @param string $table_name Database table name to create.\n * @param string $create_ddl SQL statement to create table.\n * @return bool If table already exists or was created by function.\n */\nfunction maybe_create_table($table_name, $create_ddl) {\n\tglobal $wpdb;\n\n\t$query = $wpdb->prepare( \"SHOW TABLES LIKE %s\", $wpdb->esc_like( $table_name ) );\n\n\tif ( $wpdb->get_var( $query ) == $table_name ) {\n\t\treturn true;\n\t}\n\n\t// Didn't find it try to create it..\n\t$wpdb->query($create_ddl);\n\n\t// We cannot directly tell that whether this succeeded!\n\tif ( $wpdb->get_var( $query ) == $table_name ) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Drops a specified index from a table.\n *\n * @since 1.0.1\n *\n * @global wpdb  $wpdb\n *\n * @param string $table Database table name.\n * @param string $index Index name to drop.\n * @return true True, when finished.\n */\nfunction drop_index($table, $index) {\n\tglobal $wpdb;\n\t$wpdb->hide_errors();\n\t$wpdb->query(\"ALTER TABLE `$table` DROP INDEX `$index`\");\n\t// Now we need to take out all the extra ones we may have created\n\tfor ($i = 0; $i < 25; $i++) {\n\t\t$wpdb->query(\"ALTER TABLE `$table` DROP INDEX `{$index}_$i`\");\n\t}\n\t$wpdb->show_errors();\n\treturn true;\n}\n\n/**\n * Adds an index to a specified table.\n *\n * @since 1.0.1\n *\n * @global wpdb  $wpdb\n *\n * @param string $table Database table name.\n * @param string $index Database table index column.\n * @return true True, when done with execution.\n */\nfunction add_clean_index($table, $index) {\n\tglobal $wpdb;\n\tdrop_index($table, $index);\n\t$wpdb->query(\"ALTER TABLE `$table` ADD INDEX ( `$index` )\");\n\treturn true;\n}\n\n/**\n * Adds column to a database table if it doesn't already exist.\n *\n * @since 1.3.0\n *\n * @global wpdb  $wpdb\n *\n * @param string $table_name  The table name to modify.\n * @param string $column_name The column name to add to the table.\n * @param string $create_ddl  The SQL statement used to add the column.\n * @return bool True if already exists or on successful completion, false on error.\n */\nfunction maybe_add_column($table_name, $column_name, $create_ddl) {\n\tglobal $wpdb;\n\tforeach ($wpdb->get_col(\"DESC $table_name\", 0) as $column ) {\n\t\tif ($column == $column_name) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Didn't find it try to create it.\n\t$wpdb->query($create_ddl);\n\n\t// We cannot directly tell that whether this succeeded!\n\tforeach ($wpdb->get_col(\"DESC $table_name\", 0) as $column ) {\n\t\tif ($column == $column_name) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * If a table only contains utf8 or utf8mb4 columns, convert it to utf8mb4.\n *\n * @since 4.2.0\n *\n * @global wpdb  $wpdb\n *\n * @param string $table The table to convert.\n * @return bool true if the table was converted, false if it wasn't.\n */\nfunction maybe_convert_table_to_utf8mb4( $table ) {\n\tglobal $wpdb;\n\n\t$results = $wpdb->get_results( \"SHOW FULL COLUMNS FROM `$table`\" );\n\tif ( ! $results ) {\n\t\treturn false;\n\t}\n\n\tforeach ( $results as $column ) {\n\t\tif ( $column->Collation ) {\n\t\t\tlist( $charset ) = explode( '_', $column->Collation );\n\t\t\t$charset = strtolower( $charset );\n\t\t\tif ( 'utf8' !== $charset && 'utf8mb4' !== $charset ) {\n\t\t\t\t// Don't upgrade tables that have non-utf8 columns.\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t$table_details = $wpdb->get_row( \"SHOW TABLE STATUS LIKE '$table'\" );\n\tif ( ! $table_details ) {\n\t\treturn false;\n\t}\n\n\tlist( $table_charset ) = explode( '_', $table_details->Collation );\n\t$table_charset = strtolower( $table_charset );\n\tif ( 'utf8mb4' === $table_charset ) {\n\t\treturn true;\n\t}\n\n\treturn $wpdb->query( \"ALTER TABLE $table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci\" );\n}\n\n/**\n * Retrieve all options as it was for 1.2.\n *\n * @since 1.2.0\n *\n * @global wpdb  $wpdb\n *\n * @return stdClass List of options.\n */\nfunction get_alloptions_110() {\n\tglobal $wpdb;\n\t$all_options = new stdClass;\n\tif ( $options = $wpdb->get_results( \"SELECT option_name, option_value FROM $wpdb->options\" ) ) {\n\t\tforeach ( $options as $option ) {\n\t\t\tif ( 'siteurl' == $option->option_name || 'home' == $option->option_name || 'category_base' == $option->option_name )\n\t\t\t\t$option->option_value = untrailingslashit( $option->option_value );\n\t\t\t$all_options->{$option->option_name} = stripslashes( $option->option_value );\n\t\t}\n\t}\n\treturn $all_options;\n}\n\n/**\n * Utility version of get_option that is private to install/upgrade.\n *\n * @ignore\n * @since 1.5.1\n * @access private\n *\n * @global wpdb  $wpdb\n *\n * @param string $setting Option name.\n * @return mixed\n */\nfunction __get_option($setting) {\n\tglobal $wpdb;\n\n\tif ( $setting == 'home' && defined( 'WP_HOME' ) )\n\t\treturn untrailingslashit( WP_HOME );\n\n\tif ( $setting == 'siteurl' && defined( 'WP_SITEURL' ) )\n\t\treturn untrailingslashit( WP_SITEURL );\n\n\t$option = $wpdb->get_var( $wpdb->prepare(\"SELECT option_value FROM $wpdb->options WHERE option_name = %s\", $setting ) );\n\n\tif ( 'home' == $setting && '' == $option )\n\t\treturn __get_option( 'siteurl' );\n\n\tif ( 'siteurl' == $setting || 'home' == $setting || 'category_base' == $setting || 'tag_base' == $setting )\n\t\t$option = untrailingslashit( $option );\n\n\treturn maybe_unserialize( $option );\n}\n\n/**\n * Filters for content to remove unnecessary slashes.\n *\n * @since 1.5.0\n *\n * @param string $content The content to modify.\n * @return string The de-slashed content.\n */\nfunction deslash($content) {\n\t// Note: \\\\\\ inside a regex denotes a single backslash.\n\n\t/*\n\t * Replace one or more backslashes followed by a single quote with\n\t * a single quote.\n\t */\n\t$content = preg_replace(\"/\\\\\\+'/\", \"'\", $content);\n\n\t/*\n\t * Replace one or more backslashes followed by a double quote with\n\t * a double quote.\n\t */\n\t$content = preg_replace('/\\\\\\+\"/', '\"', $content);\n\n\t// Replace one or more backslashes with one backslash.\n\t$content = preg_replace(\"/\\\\\\+/\", \"\\\\\", $content);\n\n\treturn $content;\n}\n\n/**\n * Modifies the database based on specified SQL statements.\n *\n * Useful for creating new tables and updating existing tables to a new structure.\n *\n * @since 1.5.0\n *\n * @global wpdb  $wpdb\n *\n * @param string|array $queries Optional. The query to run. Can be multiple queries\n *                              in an array, or a string of queries separated by\n *                              semicolons. Default empty.\n * @param bool         $execute Optional. Whether or not to execute the query right away.\n *                              Default true.\n * @return array Strings containing the results of the various update queries.\n */\nfunction dbDelta( $queries = '', $execute = true ) {\n\tglobal $wpdb;\n\n\tif ( in_array( $queries, array( '', 'all', 'blog', 'global', 'ms_global' ), true ) )\n\t    $queries = wp_get_db_schema( $queries );\n\n\t// Separate individual queries into an array\n\tif ( !is_array($queries) ) {\n\t\t$queries = explode( ';', $queries );\n\t\t$queries = array_filter( $queries );\n\t}\n\n\t/**\n\t * Filter the dbDelta SQL queries.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param array $queries An array of dbDelta SQL queries.\n\t */\n\t$queries = apply_filters( 'dbdelta_queries', $queries );\n\n\t$cqueries = array(); // Creation Queries\n\t$iqueries = array(); // Insertion Queries\n\t$for_update = array();\n\n\t// Create a tablename index for an array ($cqueries) of queries\n\tforeach ($queries as $qry) {\n\t\tif ( preg_match( \"|CREATE TABLE ([^ ]*)|\", $qry, $matches ) ) {\n\t\t\t$cqueries[ trim( $matches[1], '`' ) ] = $qry;\n\t\t\t$for_update[$matches[1]] = 'Created table '.$matches[1];\n\t\t} elseif ( preg_match( \"|CREATE DATABASE ([^ ]*)|\", $qry, $matches ) ) {\n\t\t\tarray_unshift( $cqueries, $qry );\n\t\t} elseif ( preg_match( \"|INSERT INTO ([^ ]*)|\", $qry, $matches ) ) {\n\t\t\t$iqueries[] = $qry;\n\t\t} elseif ( preg_match( \"|UPDATE ([^ ]*)|\", $qry, $matches ) ) {\n\t\t\t$iqueries[] = $qry;\n\t\t} else {\n\t\t\t// Unrecognized query type\n\t\t}\n\t}\n\n\t/**\n\t * Filter the dbDelta SQL queries for creating tables and/or databases.\n\t *\n\t * Queries filterable via this hook contain \"CREATE TABLE\" or \"CREATE DATABASE\".\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param array $cqueries An array of dbDelta create SQL queries.\n\t */\n\t$cqueries = apply_filters( 'dbdelta_create_queries', $cqueries );\n\n\t/**\n\t * Filter the dbDelta SQL queries for inserting or updating.\n\t *\n\t * Queries filterable via this hook contain \"INSERT INTO\" or \"UPDATE\".\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param array $iqueries An array of dbDelta insert or update SQL queries.\n\t */\n\t$iqueries = apply_filters( 'dbdelta_insert_queries', $iqueries );\n\n\t$global_tables = $wpdb->tables( 'global' );\n\tforeach ( $cqueries as $table => $qry ) {\n\t\t// Upgrade global tables only for the main site. Don't upgrade at all if conditions are not optimal.\n\t\tif ( in_array( $table, $global_tables ) && ! wp_should_upgrade_global_tables() ) {\n\t\t\tunset( $cqueries[ $table ], $for_update[ $table ] );\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Fetch the table column structure from the database\n\t\t$suppress = $wpdb->suppress_errors();\n\t\t$tablefields = $wpdb->get_results(\"DESCRIBE {$table};\");\n\t\t$wpdb->suppress_errors( $suppress );\n\n\t\tif ( ! $tablefields )\n\t\t\tcontinue;\n\n\t\t// Clear the field and index arrays.\n\t\t$cfields = $indices = array();\n\n\t\t// Get all of the field names in the query from between the parentheses.\n\t\tpreg_match(\"|\\((.*)\\)|ms\", $qry, $match2);\n\t\t$qryline = trim($match2[1]);\n\n\t\t// Separate field lines into an array.\n\t\t$flds = explode(\"\\n\", $qryline);\n\n\t\t// todo: Remove this?\n\t\t//echo \"<hr/><pre>\\n\".print_r(strtolower($table), true).\":\\n\".print_r($cqueries, true).\"</pre><hr/>\";\n\n\t\t// For every field line specified in the query.\n\t\tforeach ($flds as $fld) {\n\n\t\t\t// Extract the field name.\n\t\t\tpreg_match(\"|^([^ ]*)|\", trim($fld), $fvals);\n\t\t\t$fieldname = trim( $fvals[1], '`' );\n\n\t\t\t// Verify the found field name.\n\t\t\t$validfield = true;\n\t\t\tswitch (strtolower($fieldname)) {\n\t\t\tcase '':\n\t\t\tcase 'primary':\n\t\t\tcase 'index':\n\t\t\tcase 'fulltext':\n\t\t\tcase 'unique':\n\t\t\tcase 'key':\n\t\t\t\t$validfield = false;\n\t\t\t\t$indices[] = trim(trim($fld), \", \\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$fld = trim($fld);\n\n\t\t\t// If it's a valid field, add it to the field array.\n\t\t\tif ($validfield) {\n\t\t\t\t$cfields[strtolower($fieldname)] = trim($fld, \", \\n\");\n\t\t\t}\n\t\t}\n\n\t\t// For every field in the table.\n\t\tforeach ($tablefields as $tablefield) {\n\n\t\t\t// If the table field exists in the field array ...\n\t\t\tif (array_key_exists(strtolower($tablefield->Field), $cfields)) {\n\n\t\t\t\t// Get the field type from the query.\n\t\t\t\tpreg_match(\"|\".$tablefield->Field.\" ([^ ]*( unsigned)?)|i\", $cfields[strtolower($tablefield->Field)], $matches);\n\t\t\t\t$fieldtype = $matches[1];\n\n\t\t\t\t// Is actual field type different from the field type in query?\n\t\t\t\tif ($tablefield->Type != $fieldtype) {\n\t\t\t\t\t// Add a query to change the column type\n\t\t\t\t\t$cqueries[] = \"ALTER TABLE {$table} CHANGE COLUMN {$tablefield->Field} \" . $cfields[strtolower($tablefield->Field)];\n\t\t\t\t\t$for_update[$table.'.'.$tablefield->Field] = \"Changed type of {$table}.{$tablefield->Field} from {$tablefield->Type} to {$fieldtype}\";\n\t\t\t\t}\n\n\t\t\t\t// Get the default value from the array\n\t\t\t\t\t// todo: Remove this?\n\t\t\t\t\t//echo \"{$cfields[strtolower($tablefield->Field)]}<br>\";\n\t\t\t\tif (preg_match(\"| DEFAULT '(.*?)'|i\", $cfields[strtolower($tablefield->Field)], $matches)) {\n\t\t\t\t\t$default_value = $matches[1];\n\t\t\t\t\tif ($tablefield->Default != $default_value) {\n\t\t\t\t\t\t// Add a query to change the column's default value\n\t\t\t\t\t\t$cqueries[] = \"ALTER TABLE {$table} ALTER COLUMN {$tablefield->Field} SET DEFAULT '{$default_value}'\";\n\t\t\t\t\t\t$for_update[$table.'.'.$tablefield->Field] = \"Changed default value of {$table}.{$tablefield->Field} from {$tablefield->Default} to {$default_value}\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Remove the field from the array (so it's not added).\n\t\t\t\tunset($cfields[strtolower($tablefield->Field)]);\n\t\t\t} else {\n\t\t\t\t// This field exists in the table, but not in the creation queries?\n\t\t\t}\n\t\t}\n\n\t\t// For every remaining field specified for the table.\n\t\tforeach ($cfields as $fieldname => $fielddef) {\n\t\t\t// Push a query line into $cqueries that adds the field to that table.\n\t\t\t$cqueries[] = \"ALTER TABLE {$table} ADD COLUMN $fielddef\";\n\t\t\t$for_update[$table.'.'.$fieldname] = 'Added column '.$table.'.'.$fieldname;\n\t\t}\n\n\t\t// Index stuff goes here. Fetch the table index structure from the database.\n\t\t$tableindices = $wpdb->get_results(\"SHOW INDEX FROM {$table};\");\n\n\t\tif ($tableindices) {\n\t\t\t// Clear the index array.\n\t\t\t$index_ary = array();\n\n\t\t\t// For every index in the table.\n\t\t\tforeach ($tableindices as $tableindex) {\n\n\t\t\t\t// Add the index to the index data array.\n\t\t\t\t$keyname = $tableindex->Key_name;\n\t\t\t\t$index_ary[$keyname]['columns'][] = array('fieldname' => $tableindex->Column_name, 'subpart' => $tableindex->Sub_part);\n\t\t\t\t$index_ary[$keyname]['unique'] = ($tableindex->Non_unique == 0)?true:false;\n\t\t\t\t$index_ary[$keyname]['index_type'] = $tableindex->Index_type;\n\t\t\t}\n\n\t\t\t// For each actual index in the index array.\n\t\t\tforeach ($index_ary as $index_name => $index_data) {\n\n\t\t\t\t// Build a create string to compare to the query.\n\t\t\t\t$index_string = '';\n\t\t\t\tif ($index_name == 'PRIMARY') {\n\t\t\t\t\t$index_string .= 'PRIMARY ';\n\t\t\t\t} elseif ( $index_data['unique'] ) {\n\t\t\t\t\t$index_string .= 'UNIQUE ';\n\t\t\t\t}\n\t\t\t\tif ( 'FULLTEXT' === strtoupper( $index_data['index_type'] ) ) {\n\t\t\t\t\t$index_string .= 'FULLTEXT ';\n\t\t\t\t}\n\t\t\t\t$index_string .= 'KEY ';\n\t\t\t\tif ($index_name != 'PRIMARY') {\n\t\t\t\t\t$index_string .= $index_name;\n\t\t\t\t}\n\t\t\t\t$index_columns = '';\n\n\t\t\t\t// For each column in the index.\n\t\t\t\tforeach ($index_data['columns'] as $column_data) {\n\t\t\t\t\tif ($index_columns != '') $index_columns .= ',';\n\n\t\t\t\t\t// Add the field to the column list string.\n\t\t\t\t\t$index_columns .= $column_data['fieldname'];\n\t\t\t\t\tif ($column_data['subpart'] != '') {\n\t\t\t\t\t\t$index_columns .= '('.$column_data['subpart'].')';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// The alternative index string doesn't care about subparts\n\t\t\t\t$alt_index_columns = preg_replace( '/\\([^)]*\\)/', '', $index_columns );\n\n\t\t\t\t// Add the column list to the index create string.\n\t\t\t\t$index_strings = array(\n\t\t\t\t\t\"$index_string ($index_columns)\",\n\t\t\t\t\t\"$index_string ($alt_index_columns)\",\n\t\t\t\t);\n\n\t\t\t\tforeach ( $index_strings as $index_string ) {\n\t\t\t\t\tif ( ! ( ( $aindex = array_search( $index_string, $indices ) ) === false ) ) {\n\t\t\t\t\t\tunset( $indices[ $aindex ] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t// todo: Remove this?\n\t\t\t\t\t\t//echo \"<pre style=\\\"border:1px solid #ccc;margin-top:5px;\\\">{$table}:<br />Found index:\".$index_string.\"</pre>\\n\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// todo: Remove this?\n\t\t\t\t//else echo \"<pre style=\\\"border:1px solid #ccc;margin-top:5px;\\\">{$table}:<br /><b>Did not find index:</b>\".$index_string.\"<br />\".print_r($indices, true).\"</pre>\\n\";\n\t\t\t}\n\t\t}\n\n\t\t// For every remaining index specified for the table.\n\t\tforeach ( (array) $indices as $index ) {\n\t\t\t// Push a query line into $cqueries that adds the index to that table.\n\t\t\t$cqueries[] = \"ALTER TABLE {$table} ADD $index\";\n\t\t\t$for_update[] = 'Added index ' . $table . ' ' . $index;\n\t\t}\n\n\t\t// Remove the original table creation query from processing.\n\t\tunset( $cqueries[ $table ], $for_update[ $table ] );\n\t}\n\n\t$allqueries = array_merge($cqueries, $iqueries);\n\tif ($execute) {\n\t\tforeach ($allqueries as $query) {\n\t\t\t// todo: Remove this?\n\t\t\t//echo \"<pre style=\\\"border:1px solid #ccc;margin-top:5px;\\\">\".print_r($query, true).\"</pre>\\n\";\n\t\t\t$wpdb->query($query);\n\t\t}\n\t}\n\n\treturn $for_update;\n}\n\n/**\n * Updates the database tables to a new schema.\n *\n * By default, updates all the tables to use the latest defined schema, but can also\n * be used to update a specific set of tables in wp_get_db_schema().\n *\n * @since 1.5.0\n *\n * @uses dbDelta\n *\n * @param string $tables Optional. Which set of tables to update. Default is 'all'.\n */\nfunction make_db_current( $tables = 'all' ) {\n\t$alterations = dbDelta( $tables );\n\techo \"<ol>\\n\";\n\tforeach ($alterations as $alteration) echo \"<li>$alteration</li>\\n\";\n\techo \"</ol>\\n\";\n}\n\n/**\n * Updates the database tables to a new schema, but without displaying results.\n *\n * By default, updates all the tables to use the latest defined schema, but can\n * also be used to update a specific set of tables in wp_get_db_schema().\n *\n * @since 1.5.0\n *\n * @see make_db_current()\n *\n * @param string $tables Optional. Which set of tables to update. Default is 'all'.\n */\nfunction make_db_current_silent( $tables = 'all' ) {\n\tdbDelta( $tables );\n}\n\n/**\n * Creates a site theme from an existing theme.\n *\n * {@internal Missing Long Description}}\n *\n * @since 1.5.0\n *\n * @param string $theme_name The name of the theme.\n * @param string $template   The directory name of the theme.\n * @return bool\n */\nfunction make_site_theme_from_oldschool($theme_name, $template) {\n\t$home_path = get_home_path();\n\t$site_dir = WP_CONTENT_DIR . \"/themes/$template\";\n\n\tif (! file_exists(\"$home_path/index.php\"))\n\t\treturn false;\n\n\t/*\n\t * Copy files from the old locations to the site theme.\n\t * TODO: This does not copy arbitrary include dependencies. Only the standard WP files are copied.\n\t */\n\t$files = array('index.php' => 'index.php', 'wp-layout.css' => 'style.css', 'wp-comments.php' => 'comments.php', 'wp-comments-popup.php' => 'comments-popup.php');\n\n\tforeach ($files as $oldfile => $newfile) {\n\t\tif ($oldfile == 'index.php')\n\t\t\t$oldpath = $home_path;\n\t\telse\n\t\t\t$oldpath = ABSPATH;\n\n\t\t// Check to make sure it's not a new index.\n\t\tif ($oldfile == 'index.php') {\n\t\t\t$index = implode('', file(\"$oldpath/$oldfile\"));\n\t\t\tif (strpos($index, 'WP_USE_THEMES') !== false) {\n\t\t\t\tif (! @copy(WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME . '/index.php', \"$site_dir/$newfile\"))\n\t\t\t\t\treturn false;\n\n\t\t\t\t// Don't copy anything.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (! @copy(\"$oldpath/$oldfile\", \"$site_dir/$newfile\"))\n\t\t\treturn false;\n\n\t\tchmod(\"$site_dir/$newfile\", 0777);\n\n\t\t// Update the blog header include in each file.\n\t\t$lines = explode(\"\\n\", implode('', file(\"$site_dir/$newfile\")));\n\t\tif ($lines) {\n\t\t\t$f = fopen(\"$site_dir/$newfile\", 'w');\n\n\t\t\tforeach ($lines as $line) {\n\t\t\t\tif (preg_match('/require.*wp-blog-header/', $line))\n\t\t\t\t\t$line = '//' . $line;\n\n\t\t\t\t// Update stylesheet references.\n\t\t\t\t$line = str_replace(\"<?php echo __get_option('siteurl'); ?>/wp-layout.css\", \"<?php bloginfo('stylesheet_url'); ?>\", $line);\n\n\t\t\t\t// Update comments template inclusion.\n\t\t\t\t$line = str_replace(\"<?php include(ABSPATH . 'wp-comments.php'); ?>\", \"<?php comments_template(); ?>\", $line);\n\n\t\t\t\tfwrite($f, \"{$line}\\n\");\n\t\t\t}\n\t\t\tfclose($f);\n\t\t}\n\t}\n\n\t// Add a theme header.\n\t$header = \"/*\\nTheme Name: $theme_name\\nTheme URI: \" . __get_option('siteurl') . \"\\nDescription: A theme automatically created by the update.\\nVersion: 1.0\\nAuthor: Moi\\n*/\\n\";\n\n\t$stylelines = file_get_contents(\"$site_dir/style.css\");\n\tif ($stylelines) {\n\t\t$f = fopen(\"$site_dir/style.css\", 'w');\n\n\t\tfwrite($f, $header);\n\t\tfwrite($f, $stylelines);\n\t\tfclose($f);\n\t}\n\n\treturn true;\n}\n\n/**\n * Creates a site theme from the default theme.\n *\n * {@internal Missing Long Description}}\n *\n * @since 1.5.0\n *\n * @param string $theme_name The name of the theme.\n * @param string $template   The directory name of the theme.\n * @return false|void\n */\nfunction make_site_theme_from_default($theme_name, $template) {\n\t$site_dir = WP_CONTENT_DIR . \"/themes/$template\";\n\t$default_dir = WP_CONTENT_DIR . '/themes/' . WP_DEFAULT_THEME;\n\n\t// Copy files from the default theme to the site theme.\n\t//$files = array('index.php', 'comments.php', 'comments-popup.php', 'footer.php', 'header.php', 'sidebar.php', 'style.css');\n\n\t$theme_dir = @ opendir($default_dir);\n\tif ($theme_dir) {\n\t\twhile(($theme_file = readdir( $theme_dir )) !== false) {\n\t\t\tif (is_dir(\"$default_dir/$theme_file\"))\n\t\t\t\tcontinue;\n\t\t\tif (! @copy(\"$default_dir/$theme_file\", \"$site_dir/$theme_file\"))\n\t\t\t\treturn;\n\t\t\tchmod(\"$site_dir/$theme_file\", 0777);\n\t\t}\n\t}\n\t@closedir($theme_dir);\n\n\t// Rewrite the theme header.\n\t$stylelines = explode(\"\\n\", implode('', file(\"$site_dir/style.css\")));\n\tif ($stylelines) {\n\t\t$f = fopen(\"$site_dir/style.css\", 'w');\n\n\t\tforeach ($stylelines as $line) {\n\t\t\tif (strpos($line, 'Theme Name:') !== false) $line = 'Theme Name: ' . $theme_name;\n\t\t\telseif (strpos($line, 'Theme URI:') !== false) $line = 'Theme URI: ' . __get_option('url');\n\t\t\telseif (strpos($line, 'Description:') !== false) $line = 'Description: Your theme.';\n\t\t\telseif (strpos($line, 'Version:') !== false) $line = 'Version: 1';\n\t\t\telseif (strpos($line, 'Author:') !== false) $line = 'Author: You';\n\t\t\tfwrite($f, $line . \"\\n\");\n\t\t}\n\t\tfclose($f);\n\t}\n\n\t// Copy the images.\n\tumask(0);\n\tif (! mkdir(\"$site_dir/images\", 0777)) {\n\t\treturn false;\n\t}\n\n\t$images_dir = @ opendir(\"$default_dir/images\");\n\tif ($images_dir) {\n\t\twhile(($image = readdir($images_dir)) !== false) {\n\t\t\tif (is_dir(\"$default_dir/images/$image\"))\n\t\t\t\tcontinue;\n\t\t\tif (! @copy(\"$default_dir/images/$image\", \"$site_dir/images/$image\"))\n\t\t\t\treturn;\n\t\t\tchmod(\"$site_dir/images/$image\", 0777);\n\t\t}\n\t}\n\t@closedir($images_dir);\n}\n\n/**\n * Creates a site theme.\n *\n * {@internal Missing Long Description}}\n *\n * @since 1.5.0\n *\n * @return false|string\n */\nfunction make_site_theme() {\n\t// Name the theme after the blog.\n\t$theme_name = __get_option('blogname');\n\t$template = sanitize_title($theme_name);\n\t$site_dir = WP_CONTENT_DIR . \"/themes/$template\";\n\n\t// If the theme already exists, nothing to do.\n\tif ( is_dir($site_dir)) {\n\t\treturn false;\n\t}\n\n\t// We must be able to write to the themes dir.\n\tif (! is_writable(WP_CONTENT_DIR . \"/themes\")) {\n\t\treturn false;\n\t}\n\n\tumask(0);\n\tif (! mkdir($site_dir, 0777)) {\n\t\treturn false;\n\t}\n\n\tif (file_exists(ABSPATH . 'wp-layout.css')) {\n\t\tif (! make_site_theme_from_oldschool($theme_name, $template)) {\n\t\t\t// TODO: rm -rf the site theme directory.\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tif (! make_site_theme_from_default($theme_name, $template))\n\t\t\t// TODO: rm -rf the site theme directory.\n\t\t\treturn false;\n\t}\n\n\t// Make the new site theme active.\n\t$current_template = __get_option('template');\n\tif ($current_template == WP_DEFAULT_THEME) {\n\t\tupdate_option('template', $template);\n\t\tupdate_option('stylesheet', $template);\n\t}\n\treturn $template;\n}\n\n/**\n * Translate user level to user role name.\n *\n * @since 2.0.0\n *\n * @param int $level User level.\n * @return string User role name.\n */\nfunction translate_level_to_role($level) {\n\tswitch ($level) {\n\tcase 10:\n\tcase 9:\n\tcase 8:\n\t\treturn 'administrator';\n\tcase 7:\n\tcase 6:\n\tcase 5:\n\t\treturn 'editor';\n\tcase 4:\n\tcase 3:\n\tcase 2:\n\t\treturn 'author';\n\tcase 1:\n\t\treturn 'contributor';\n\tcase 0:\n\t\treturn 'subscriber';\n\t}\n}\n\n/**\n * Checks the version of the installed MySQL binary.\n *\n * @since 2.1.0\n *\n * @global wpdb  $wpdb\n */\nfunction wp_check_mysql_version() {\n\tglobal $wpdb;\n\t$result = $wpdb->check_database_version();\n\tif ( is_wp_error( $result ) )\n\t\tdie( $result->get_error_message() );\n}\n\n/**\n * Disables the Automattic widgets plugin, which was merged into core.\n *\n * @since 2.2.0\n */\nfunction maybe_disable_automattic_widgets() {\n\t$plugins = __get_option( 'active_plugins' );\n\n\tforeach ( (array) $plugins as $plugin ) {\n\t\tif ( basename( $plugin ) == 'widgets.php' ) {\n\t\t\tarray_splice( $plugins, array_search( $plugin, $plugins ), 1 );\n\t\t\tupdate_option( 'active_plugins', $plugins );\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Disables the Link Manager on upgrade if, at the time of upgrade, no links exist in the DB.\n *\n * @since 3.5.0\n *\n * @global int  $wp_current_db_version\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction maybe_disable_link_manager() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\tif ( $wp_current_db_version >= 22006 && get_option( 'link_manager_enabled' ) && ! $wpdb->get_var( \"SELECT link_id FROM $wpdb->links LIMIT 1\" ) )\n\t\tupdate_option( 'link_manager_enabled', 0 );\n}\n\n/**\n * Runs before the schema is upgraded.\n *\n * @since 2.9.0\n *\n * @global int  $wp_current_db_version\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction pre_schema_upgrade() {\n\tglobal $wp_current_db_version, $wpdb;\n\n\t// Upgrade versions prior to 2.9\n\tif ( $wp_current_db_version < 11557 ) {\n\t\t// Delete duplicate options. Keep the option with the highest option_id.\n\t\t$wpdb->query(\"DELETE o1 FROM $wpdb->options AS o1 JOIN $wpdb->options AS o2 USING (`option_name`) WHERE o2.option_id > o1.option_id\");\n\n\t\t// Drop the old primary key and add the new.\n\t\t$wpdb->query(\"ALTER TABLE $wpdb->options DROP PRIMARY KEY, ADD PRIMARY KEY(option_id)\");\n\n\t\t// Drop the old option_name index. dbDelta() doesn't do the drop.\n\t\t$wpdb->query(\"ALTER TABLE $wpdb->options DROP INDEX option_name\");\n\t}\n\n\t// Multisite schema upgrades.\n\tif ( $wp_current_db_version < 25448 && is_multisite() && wp_should_upgrade_global_tables() ) {\n\n\t\t// Upgrade verions prior to 3.7\n\t\tif ( $wp_current_db_version < 25179 ) {\n\t\t\t// New primary key for signups.\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->signups ADD signup_id BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST\" );\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->signups DROP INDEX domain\" );\n\t\t}\n\n\t\tif ( $wp_current_db_version < 25448 ) {\n\t\t\t// Convert archived from enum to tinyint.\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->blogs CHANGE COLUMN archived archived varchar(1) NOT NULL default '0'\" );\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->blogs CHANGE COLUMN archived archived tinyint(2) NOT NULL default 0\" );\n\t\t}\n\t}\n\n\t// Upgrade versions prior to 4.2.\n\tif ( $wp_current_db_version < 31351 ) {\n\t\tif ( ! is_multisite() && wp_should_upgrade_global_tables() ) {\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->usermeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))\" );\n\t\t}\n\t\t$wpdb->query( \"ALTER TABLE $wpdb->terms DROP INDEX slug, ADD INDEX slug(slug(191))\" );\n\t\t$wpdb->query( \"ALTER TABLE $wpdb->terms DROP INDEX name, ADD INDEX name(name(191))\" );\n\t\t$wpdb->query( \"ALTER TABLE $wpdb->commentmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))\" );\n\t\t$wpdb->query( \"ALTER TABLE $wpdb->postmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))\" );\n\t\t$wpdb->query( \"ALTER TABLE $wpdb->posts DROP INDEX post_name, ADD INDEX post_name(post_name(191))\" );\n\t}\n\n\t// Upgrade versions prior to 4.4.\n\tif ( $wp_current_db_version < 34978 ) {\n\t\t// If compatible termmeta table is found, use it, but enforce a proper index and update collation.\n\t\tif ( $wpdb->get_var( \"SHOW TABLES LIKE '{$wpdb->termmeta}'\" ) && $wpdb->get_results( \"SHOW INDEX FROM {$wpdb->termmeta} WHERE Column_name = 'meta_key'\" ) ) {\n\t\t\t$wpdb->query( \"ALTER TABLE $wpdb->termmeta DROP INDEX meta_key, ADD INDEX meta_key(meta_key(191))\" );\n\t\t\tmaybe_convert_table_to_utf8mb4( $wpdb->termmeta );\n\t\t}\n\t}\n}\n\n/**\n * Install global terms.\n *\n * @since 3.0.0\n *\n * @global wpdb   $wpdb\n * @global string $charset_collate\n */\nif ( !function_exists( 'install_global_terms' ) ) :\nfunction install_global_terms() {\n\tglobal $wpdb, $charset_collate;\n\t$ms_queries = \"\nCREATE TABLE $wpdb->sitecategories (\n  cat_ID bigint(20) NOT NULL auto_increment,\n  cat_name varchar(55) NOT NULL default '',\n  category_nicename varchar(200) NOT NULL default '',\n  last_updated timestamp NOT NULL,\n  PRIMARY KEY  (cat_ID),\n  KEY category_nicename (category_nicename),\n  KEY last_updated (last_updated)\n) $charset_collate;\n\";\n// now create tables\n\tdbDelta( $ms_queries );\n}\nendif;\n\n/**\n * Determine if global tables should be upgraded.\n *\n * This function performs a series of checks to ensure the environment allows\n * for the safe upgrading of global WordPress database tables. It is necessary\n * because global tables will commonly grow to millions of rows on large\n * installations, and the ability to control their upgrade routines can be\n * critical to the operation of large networks.\n *\n * In a future iteration, this function may use `wp_is_large_network()` to more-\n * intelligently prevent global table upgrades. Until then, we make sure\n * WordPress is on the main site of the main network, to avoid running queries\n * more than once in multi-site or multi-network environments.\n *\n * @since 4.3.0\n *\n * @return bool Whether to run the upgrade routines on global tables.\n */\nfunction wp_should_upgrade_global_tables() {\n\n\t// Return false early if explicitly not upgrading\n\tif ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {\n\t\treturn false;\n\t}\n\n\t// Assume global tables should be upgraded\n\t$should_upgrade = true;\n\n\t// Set to false if not on main network (does not matter if not multi-network)\n\tif ( ! is_main_network() ) {\n\t\t$should_upgrade = false;\n\t}\n\n\t// Set to false if not on main site of current network (does not matter if not multi-site)\n\tif ( ! is_main_site() ) {\n\t\t$should_upgrade = false;\n\t}\n\n\t/**\n\t * Filter if upgrade routines should be run on global tables.\n\t *\n\t * @param bool $should_upgrade Whether to run the upgrade routines on global tables.\n\t */\n\treturn apply_filters( 'wp_should_upgrade_global_tables', $should_upgrade );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/user.php",
    "content": "<?php\n/**\n * WordPress user administration API.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Creates a new user from the \"Users\" form using $_POST information.\n *\n * @since 2.0.0\n *\n * @return int|WP_Error WP_Error or User ID.\n */\nfunction add_user() {\n\treturn edit_user();\n}\n\n/**\n * Edit user settings based on contents of $_POST\n *\n * Used on user-edit.php and profile.php to manage and process user options, passwords etc.\n *\n * @since 2.0.0\n *\n * @param int $user_id Optional. User ID.\n * @return int|WP_Error user id of the updated user\n */\nfunction edit_user( $user_id = 0 ) {\n\t$wp_roles = wp_roles();\n\t$user = new stdClass;\n\tif ( $user_id ) {\n\t\t$update = true;\n\t\t$user->ID = (int) $user_id;\n\t\t$userdata = get_userdata( $user_id );\n\t\t$user->user_login = wp_slash( $userdata->user_login );\n\t} else {\n\t\t$update = false;\n\t}\n\n\tif ( !$update && isset( $_POST['user_login'] ) )\n\t\t$user->user_login = sanitize_user($_POST['user_login'], true);\n\n\t$pass1 = $pass2 = '';\n\tif ( isset( $_POST['pass1'] ) )\n\t\t$pass1 = $_POST['pass1'];\n\tif ( isset( $_POST['pass2'] ) )\n\t\t$pass2 = $_POST['pass2'];\n\n\tif ( isset( $_POST['role'] ) && current_user_can( 'edit_users' ) ) {\n\t\t$new_role = sanitize_text_field( $_POST['role'] );\n\t\t$potential_role = isset($wp_roles->role_objects[$new_role]) ? $wp_roles->role_objects[$new_role] : false;\n\t\t// Don't let anyone with 'edit_users' (admins) edit their own role to something without it.\n\t\t// Multisite super admins can freely edit their blog roles -- they possess all caps.\n\t\tif ( ( is_multisite() && current_user_can( 'manage_sites' ) ) || $user_id != get_current_user_id() || ($potential_role && $potential_role->has_cap( 'edit_users' ) ) )\n\t\t\t$user->role = $new_role;\n\n\t\t// If the new role isn't editable by the logged-in user die with error\n\t\t$editable_roles = get_editable_roles();\n\t\tif ( ! empty( $new_role ) && empty( $editable_roles[$new_role] ) )\n\t\t\twp_die(__('You can&#8217;t give users that role.'));\n\t}\n\n\tif ( isset( $_POST['email'] ))\n\t\t$user->user_email = sanitize_text_field( wp_unslash( $_POST['email'] ) );\n\tif ( isset( $_POST['url'] ) ) {\n\t\tif ( empty ( $_POST['url'] ) || $_POST['url'] == 'http://' ) {\n\t\t\t$user->user_url = '';\n\t\t} else {\n\t\t\t$user->user_url = esc_url_raw( $_POST['url'] );\n\t\t\t$protocols = implode( '|', array_map( 'preg_quote', wp_allowed_protocols() ) );\n\t\t\t$user->user_url = preg_match('/^(' . $protocols . '):/is', $user->user_url) ? $user->user_url : 'http://'.$user->user_url;\n\t\t}\n\t}\n\tif ( isset( $_POST['first_name'] ) )\n\t\t$user->first_name = sanitize_text_field( $_POST['first_name'] );\n\tif ( isset( $_POST['last_name'] ) )\n\t\t$user->last_name = sanitize_text_field( $_POST['last_name'] );\n\tif ( isset( $_POST['nickname'] ) )\n\t\t$user->nickname = sanitize_text_field( $_POST['nickname'] );\n\tif ( isset( $_POST['display_name'] ) )\n\t\t$user->display_name = sanitize_text_field( $_POST['display_name'] );\n\n\tif ( isset( $_POST['description'] ) )\n\t\t$user->description = trim( $_POST['description'] );\n\n\tforeach ( wp_get_user_contact_methods( $user ) as $method => $name ) {\n\t\tif ( isset( $_POST[$method] ))\n\t\t\t$user->$method = sanitize_text_field( $_POST[$method] );\n\t}\n\n\tif ( $update ) {\n\t\t$user->rich_editing = isset( $_POST['rich_editing'] ) && 'false' == $_POST['rich_editing'] ? 'false' : 'true';\n\t\t$user->admin_color = isset( $_POST['admin_color'] ) ? sanitize_text_field( $_POST['admin_color'] ) : 'fresh';\n\t\t$user->show_admin_bar_front = isset( $_POST['admin_bar_front'] ) ? 'true' : 'false';\n\t}\n\n\t$user->comment_shortcuts = isset( $_POST['comment_shortcuts'] ) && 'true' == $_POST['comment_shortcuts'] ? 'true' : '';\n\n\t$user->use_ssl = 0;\n\tif ( !empty($_POST['use_ssl']) )\n\t\t$user->use_ssl = 1;\n\n\t$errors = new WP_Error();\n\n\t/* checking that username has been typed */\n\tif ( $user->user_login == '' )\n\t\t$errors->add( 'user_login', __( '<strong>ERROR</strong>: Please enter a username.' ) );\n\n\t/* checking that nickname has been typed */\n\tif ( $update && empty( $user->nickname ) ) {\n\t\t$errors->add( 'nickname', __( '<strong>ERROR</strong>: Please enter a nickname.' ) );\n\t}\n\n\t/* checking the password has been typed twice */\n\t/**\n\t * Fires before the password and confirm password fields are checked for congruity.\n\t *\n\t * @since 1.5.1\n\t *\n\t * @param string $user_login The username.\n\t * @param string &$pass1     The password, passed by reference.\n\t * @param string &$pass2     The confirmed password, passed by reference.\n\t */\n\tdo_action_ref_array( 'check_passwords', array( $user->user_login, &$pass1, &$pass2 ) );\n\n\t/* Check for \"\\\" in password */\n\tif ( false !== strpos( wp_unslash( $pass1 ), \"\\\\\" ) )\n\t\t$errors->add( 'pass', __( '<strong>ERROR</strong>: Passwords may not contain the character \"\\\\\".' ), array( 'form-field' => 'pass1' ) );\n\n\t/* checking the password has been typed twice the same */\n\tif ( $pass1 != $pass2 )\n\t\t$errors->add( 'pass', __( '<strong>ERROR</strong>: Please enter the same password in both password fields.' ), array( 'form-field' => 'pass1' ) );\n\n\tif ( !empty( $pass1 ) )\n\t\t$user->user_pass = $pass1;\n\n\tif ( !$update && isset( $_POST['user_login'] ) && !validate_username( $_POST['user_login'] ) )\n\t\t$errors->add( 'user_login', __( '<strong>ERROR</strong>: This username is invalid because it uses illegal characters. Please enter a valid username.' ));\n\n\tif ( !$update && username_exists( $user->user_login ) )\n\t\t$errors->add( 'user_login', __( '<strong>ERROR</strong>: This username is already registered. Please choose another one.' ));\n\n\t/** This filter is documented in wp-includes/user.php */\n\t$illegal_logins = (array) apply_filters( 'illegal_user_logins', array() );\n\n\tif ( in_array( strtolower( $user->user_login ), array_map( 'strtolower', $illegal_logins ) ) ) {\n\t\t$errors->add( 'invalid_username', __( '<strong>ERROR</strong>: Sorry, that username is not allowed.' ) );\n\t}\n\n\t/* checking email address */\n\tif ( empty( $user->user_email ) ) {\n\t\t$errors->add( 'empty_email', __( '<strong>ERROR</strong>: Please enter an email address.' ), array( 'form-field' => 'email' ) );\n\t} elseif ( !is_email( $user->user_email ) ) {\n\t\t$errors->add( 'invalid_email', __( '<strong>ERROR</strong>: The email address isn&#8217;t correct.' ), array( 'form-field' => 'email' ) );\n\t} elseif ( ( $owner_id = email_exists($user->user_email) ) && ( !$update || ( $owner_id != $user->ID ) ) ) {\n\t\t$errors->add( 'email_exists', __('<strong>ERROR</strong>: This email is already registered, please choose another one.'), array( 'form-field' => 'email' ) );\n\t}\n\n\t/**\n\t * Fires before user profile update errors are returned.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param WP_Error &$errors WP_Error object, passed by reference.\n\t * @param bool     $update  Whether this is a user update.\n\t * @param WP_User  &$user   WP_User object, passed by reference.\n\t */\n\tdo_action_ref_array( 'user_profile_update_errors', array( &$errors, $update, &$user ) );\n\n\tif ( $errors->get_error_codes() )\n\t\treturn $errors;\n\n\tif ( $update ) {\n\t\t$user_id = wp_update_user( $user );\n\t} else {\n\t\t$user_id = wp_insert_user( $user );\n\t\t$notify  = isset( $_POST['send_user_notification'] ) ? 'both' : 'admin';\n\n\t\t/**\n\t\t  * Fires after a new user has been created.\n\t\t  *\n\t\t  * @since 4.4.0\n\t\t  *\n\t\t  * @param int    $user_id ID of the newly created user.\n\t\t  * @param string $notify  Type of notification that should happen. See {@see wp_send_new_user_notifications()}\n\t\t  *                        for more information on possible values.\n\t\t  */\n\t\tdo_action( 'edit_user_created_user', $user_id, $notify );\n\t}\n\treturn $user_id;\n}\n\n/**\n * Fetch a filtered list of user roles that the current user is\n * allowed to edit.\n *\n * Simple function who's main purpose is to allow filtering of the\n * list of roles in the $wp_roles object so that plugins can remove\n * inappropriate ones depending on the situation or user making edits.\n * Specifically because without filtering anyone with the edit_users\n * capability can edit others to be administrators, even if they are\n * only editors or authors. This filter allows admins to delegate\n * user management.\n *\n * @since 2.8.0\n *\n * @return array\n */\nfunction get_editable_roles() {\n\t$all_roles = wp_roles()->roles;\n\n\t/**\n\t * Filter the list of editable roles.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $all_roles List of roles.\n\t */\n\t$editable_roles = apply_filters( 'editable_roles', $all_roles );\n\n\treturn $editable_roles;\n}\n\n/**\n * Retrieve user data and filter it.\n *\n * @since 2.0.5\n *\n * @param int $user_id User ID.\n * @return WP_User|bool WP_User object on success, false on failure.\n */\nfunction get_user_to_edit( $user_id ) {\n\t$user = get_userdata( $user_id );\n\n\tif ( $user )\n\t\t$user->filter = 'edit';\n\n\treturn $user;\n}\n\n/**\n * Retrieve the user's drafts.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $user_id User ID.\n * @return array\n */\nfunction get_users_drafts( $user_id ) {\n\tglobal $wpdb;\n\t$query = $wpdb->prepare(\"SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'draft' AND post_author = %d ORDER BY post_modified DESC\", $user_id);\n\n\t/**\n\t * Filter the user's drafts query string.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param string $query The user's drafts query string.\n\t */\n\t$query = apply_filters( 'get_users_drafts', $query );\n\treturn $wpdb->get_results( $query );\n}\n\n/**\n * Remove user and optionally reassign posts and links to another user.\n *\n * If the $reassign parameter is not assigned to a User ID, then all posts will\n * be deleted of that user. The action 'delete_user' that is passed the User ID\n * being deleted will be run after the posts are either reassigned or deleted.\n * The user meta will also be deleted that are for that User ID.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $id User ID.\n * @param int $reassign Optional. Reassign posts and links to new User ID.\n * @return bool True when finished.\n */\nfunction wp_delete_user( $id, $reassign = null ) {\n\tglobal $wpdb;\n\n\tif ( ! is_numeric( $id ) ) {\n\t\treturn false;\n\t}\n\n\t$id = (int) $id;\n\t$user = new WP_User( $id );\n\n\tif ( !$user->exists() )\n\t\treturn false;\n\n\t// Normalize $reassign to null or a user ID. 'novalue' was an older default.\n\tif ( 'novalue' === $reassign ) {\n\t\t$reassign = null;\n\t} elseif ( null !== $reassign ) {\n\t\t$reassign = (int) $reassign;\n\t}\n\n\t/**\n\t * Fires immediately before a user is deleted from the database.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param int      $id       ID of the user to delete.\n\t * @param int|null $reassign ID of the user to reassign posts and links to.\n\t *                           Default null, for no reassignment.\n\t */\n\tdo_action( 'delete_user', $id, $reassign );\n\n\tif ( null === $reassign ) {\n\t\t$post_types_to_delete = array();\n\t\tforeach ( get_post_types( array(), 'objects' ) as $post_type ) {\n\t\t\tif ( $post_type->delete_with_user ) {\n\t\t\t\t$post_types_to_delete[] = $post_type->name;\n\t\t\t} elseif ( null === $post_type->delete_with_user && post_type_supports( $post_type->name, 'author' ) ) {\n\t\t\t\t$post_types_to_delete[] = $post_type->name;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the list of post types to delete with a user.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array $post_types_to_delete Post types to delete.\n\t\t * @param int   $id                   User ID.\n\t\t */\n\t\t$post_types_to_delete = apply_filters( 'post_types_to_delete_with_user', $post_types_to_delete, $id );\n\t\t$post_types_to_delete = implode( \"', '\", $post_types_to_delete );\n\t\t$post_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT ID FROM $wpdb->posts WHERE post_author = %d AND post_type IN ('$post_types_to_delete')\", $id ) );\n\t\tif ( $post_ids ) {\n\t\t\tforeach ( $post_ids as $post_id )\n\t\t\t\twp_delete_post( $post_id );\n\t\t}\n\n\t\t// Clean links\n\t\t$link_ids = $wpdb->get_col( $wpdb->prepare(\"SELECT link_id FROM $wpdb->links WHERE link_owner = %d\", $id) );\n\n\t\tif ( $link_ids ) {\n\t\t\tforeach ( $link_ids as $link_id )\n\t\t\t\twp_delete_link($link_id);\n\t\t}\n\t} else {\n\t\t$post_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT ID FROM $wpdb->posts WHERE post_author = %d\", $id ) );\n\t\t$wpdb->update( $wpdb->posts, array('post_author' => $reassign), array('post_author' => $id) );\n\t\tif ( ! empty( $post_ids ) ) {\n\t\t\tforeach ( $post_ids as $post_id )\n\t\t\t\tclean_post_cache( $post_id );\n\t\t}\n\t\t$link_ids = $wpdb->get_col( $wpdb->prepare(\"SELECT link_id FROM $wpdb->links WHERE link_owner = %d\", $id) );\n\t\t$wpdb->update( $wpdb->links, array('link_owner' => $reassign), array('link_owner' => $id) );\n\t\tif ( ! empty( $link_ids ) ) {\n\t\t\tforeach ( $link_ids as $link_id )\n\t\t\t\tclean_bookmark_cache( $link_id );\n\t\t}\n\t}\n\n\t// FINALLY, delete user\n\tif ( is_multisite() ) {\n\t\tremove_user_from_blog( $id, get_current_blog_id() );\n\t} else {\n\t\t$meta = $wpdb->get_col( $wpdb->prepare( \"SELECT umeta_id FROM $wpdb->usermeta WHERE user_id = %d\", $id ) );\n\t\tforeach ( $meta as $mid )\n\t\t\tdelete_metadata_by_mid( 'user', $mid );\n\n\t\t$wpdb->delete( $wpdb->users, array( 'ID' => $id ) );\n\t}\n\n\tclean_user_cache( $user );\n\n\t/**\n\t * Fires immediately after a user is deleted from the database.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int      $id       ID of the deleted user.\n\t * @param int|null $reassign ID of the user to reassign posts and links to.\n\t *                           Default null, for no reassignment.\n\t */\n\tdo_action( 'deleted_user', $id, $reassign );\n\n\treturn true;\n}\n\n/**\n * Remove all capabilities from user.\n *\n * @since 2.1.0\n *\n * @param int $id User ID.\n */\nfunction wp_revoke_user($id) {\n\t$id = (int) $id;\n\n\t$user = new WP_User($id);\n\t$user->remove_all_caps();\n}\n\n/**\n * @since 2.8.0\n *\n * @global int $user_ID\n *\n * @param false $errors Deprecated.\n */\nfunction default_password_nag_handler($errors = false) {\n\tglobal $user_ID;\n\t// Short-circuit it.\n\tif ( ! get_user_option('default_password_nag') )\n\t\treturn;\n\n\t// get_user_setting = JS saved UI setting. else no-js-fallback code.\n\tif ( 'hide' == get_user_setting('default_password_nag') || isset($_GET['default_password_nag']) && '0' == $_GET['default_password_nag'] ) {\n\t\tdelete_user_setting('default_password_nag');\n\t\tupdate_user_option($user_ID, 'default_password_nag', false, true);\n\t}\n}\n\n/**\n * @since 2.8.0\n *\n * @param int    $user_ID\n * @param object $old_data\n */\nfunction default_password_nag_edit_user($user_ID, $old_data) {\n\t// Short-circuit it.\n\tif ( ! get_user_option('default_password_nag', $user_ID) )\n\t\treturn;\n\n\t$new_data = get_userdata($user_ID);\n\n\t// Remove the nag if the password has been changed.\n\tif ( $new_data->user_pass != $old_data->user_pass ) {\n\t\tdelete_user_setting('default_password_nag');\n\t\tupdate_user_option($user_ID, 'default_password_nag', false, true);\n\t}\n}\n\n/**\n * @since 2.8.0\n *\n * @global string $pagenow\n */\nfunction default_password_nag() {\n\tglobal $pagenow;\n\t// Short-circuit it.\n\tif ( 'profile.php' == $pagenow || ! get_user_option('default_password_nag') )\n\t\treturn;\n\n\techo '<div class=\"error default-password-nag\">';\n\techo '<p>';\n\techo '<strong>' . __('Notice:') . '</strong> ';\n\t_e('You&rsquo;re using the auto-generated password for your account. Would you like to change it?');\n\techo '</p><p>';\n\tprintf( '<a href=\"%s\">' . __('Yes, take me to my profile page') . '</a> | ', get_edit_profile_url() . '#password' );\n\tprintf( '<a href=\"%s\" id=\"default-password-nag-no\">' . __('No thanks, do not remind me again') . '</a>', '?default_password_nag=0' );\n\techo '</p></div>';\n}\n\n/**\n * @since 3.5.0\n * @access private\n */\nfunction delete_users_add_js() { ?>\n<script>\njQuery(document).ready( function($) {\n\tvar submit = $('#submit').prop('disabled', true);\n\t$('input[name=\"delete_option\"]').one('change', function() {\n\t\tsubmit.prop('disabled', false);\n\t});\n\t$('#reassign_user').focus( function() {\n\t\t$('#delete_option1').prop('checked', true).trigger('change');\n\t});\n});\n</script>\n<?php\n}\n\n/**\n * Optional SSL preference that can be turned on by hooking to the 'personal_options' action.\n *\n * @since 2.7.0\n *\n * @param object $user User data object\n */\nfunction use_ssl_preference($user) {\n?>\n\t<tr class=\"user-use-ssl-wrap\">\n\t\t<th scope=\"row\"><?php _e('Use https')?></th>\n\t\t<td><label for=\"use_ssl\"><input name=\"use_ssl\" type=\"checkbox\" id=\"use_ssl\" value=\"1\" <?php checked('1', $user->use_ssl); ?> /> <?php _e('Always use https when visiting the admin'); ?></label></td>\n\t</tr>\n<?php\n}\n\n/**\n *\n * @param string $text\n * @return string\n */\nfunction admin_created_user_email( $text ) {\n\t$roles = get_editable_roles();\n\t$role = $roles[ $_REQUEST['role'] ];\n\t/* translators: 1: Site name, 2: site URL, 3: role */\n\treturn sprintf( __( 'Hi,\nYou\\'ve been invited to join \\'%1$s\\' at\n%2$s with the role of %3$s.\nIf you do not want to join this site please ignore\nthis email. This invitation will expire in a few days.\n\nPlease click the following link to activate your user account:\n%%s' ), get_bloginfo( 'name' ), home_url(), wp_specialchars_decode( translate_user_role( $role['name'] ) ) );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/includes/widgets.php",
    "content": "<?php\n/**\n * WordPress Widgets Administration API\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Display list of the available widgets.\n *\n * @since 2.5.0\n *\n * @global array $wp_registered_widgets\n * @global array $wp_registered_widget_controls\n */\nfunction wp_list_widgets() {\n\tglobal $wp_registered_widgets, $wp_registered_widget_controls;\n\n\t$sort = $wp_registered_widgets;\n\tusort( $sort, '_sort_name_callback' );\n\t$done = array();\n\n\tforeach ( $sort as $widget ) {\n\t\tif ( in_array( $widget['callback'], $done, true ) ) // We already showed this multi-widget\n\t\t\tcontinue;\n\n\t\t$sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false );\n\t\t$done[] = $widget['callback'];\n\n\t\tif ( ! isset( $widget['params'][0] ) )\n\t\t\t$widget['params'][0] = array();\n\n\t\t$args = array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' );\n\n\t\tif ( isset($wp_registered_widget_controls[$widget['id']]['id_base']) && isset($widget['params'][0]['number']) ) {\n\t\t\t$id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];\n\t\t\t$args['_temp_id'] = \"$id_base-__i__\";\n\t\t\t$args['_multi_num'] = next_widget_id_number($id_base);\n\t\t\t$args['_add'] = 'multi';\n\t\t} else {\n\t\t\t$args['_add'] = 'single';\n\t\t\tif ( $sidebar )\n\t\t\t\t$args['_hide'] = '1';\n\t\t}\n\n\t\t$args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) );\n\t\tcall_user_func_array( 'wp_widget_control', $args );\n\t}\n}\n\n/**\n * Callback to sort array by a 'name' key.\n *\n * @since 3.1.0\n * @access private\n *\n * @return int\n */\nfunction _sort_name_callback( $a, $b ) {\n\treturn strnatcasecmp( $a['name'], $b['name'] );\n}\n\n/**\n * Show the widgets and their settings for a sidebar.\n * Used in the admin widget config screen.\n *\n * @since 2.5.0\n *\n * @param string $sidebar      Sidebar ID.\n * @param string $sidebar_name Optional. Sidebar name. Default empty.\n */\nfunction wp_list_widget_controls( $sidebar, $sidebar_name = '' ) {\n\tadd_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' );\n\n\t$description = wp_sidebar_description( $sidebar );\n\n\techo '<div id=\"' . esc_attr( $sidebar ) . '\" class=\"widgets-sortables\">';\n\n\tif ( $sidebar_name ) {\n\t\t?>\n\t\t<div class=\"sidebar-name\">\n\t\t\t<div class=\"sidebar-name-arrow\"><br /></div>\n\t\t\t<h2><?php echo esc_html( $sidebar_name ); ?> <span class=\"spinner\"></span></h2>\n\t\t</div>\n\t\t<?php\n\t}\n\n\tif ( ! empty( $description ) ) {\n\t\t?>\n\t\t<div class=\"sidebar-description\">\n\t\t\t<p class=\"description\"><?php echo $description; ?></p>\n\t\t</div>\n\t\t<?php\n\t}\n\n\tdynamic_sidebar( $sidebar );\n\n\techo '</div>';\n}\n\n/**\n * Retrieves the widget control arguments.\n *\n * @since 2.5.0\n *\n * @global array $wp_registered_widgets\n *\n * @staticvar int $i\n *\n * @param array $params\n * @return array\n */\nfunction wp_list_widget_controls_dynamic_sidebar( $params ) {\n\tglobal $wp_registered_widgets;\n\tstatic $i = 0;\n\t$i++;\n\n\t$widget_id = $params[0]['widget_id'];\n\t$id = isset($params[0]['_temp_id']) ? $params[0]['_temp_id'] : $widget_id;\n\t$hidden = isset($params[0]['_hide']) ? ' style=\"display:none;\"' : '';\n\n\t$params[0]['before_widget'] = \"<div id='widget-{$i}_{$id}' class='widget'$hidden>\";\n\t$params[0]['after_widget'] = \"</div>\";\n\t$params[0]['before_title'] = \"%BEG_OF_TITLE%\"; // deprecated\n\t$params[0]['after_title'] = \"%END_OF_TITLE%\"; // deprecated\n\tif ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) {\n\t\t$wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];\n\t\t$wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control';\n\t}\n\n\treturn $params;\n}\n\n/**\n *\n * @global array $wp_registered_widgets\n *\n * @param string $id_base\n * @return int\n */\nfunction next_widget_id_number( $id_base ) {\n\tglobal $wp_registered_widgets;\n\t$number = 1;\n\n\tforeach ( $wp_registered_widgets as $widget_id => $widget ) {\n\t\tif ( preg_match( '/' . $id_base . '-([0-9]+)$/', $widget_id, $matches ) )\n\t\t\t$number = max($number, $matches[1]);\n\t}\n\t$number++;\n\n\treturn $number;\n}\n\n/**\n * Meta widget used to display the control form for a widget.\n *\n * Called from dynamic_sidebar().\n *\n * @since 2.5.0\n *\n * @global array $wp_registered_widgets\n * @global array $wp_registered_widget_controls\n * @global array $sidebars_widgets\n *\n * @param array $sidebar_args\n * @return array\n */\nfunction wp_widget_control( $sidebar_args ) {\n\tglobal $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets;\n\n\t$widget_id = $sidebar_args['widget_id'];\n\t$sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false;\n\t$key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : '-1'; // position of widget in sidebar\n\t$control = isset($wp_registered_widget_controls[$widget_id]) ? $wp_registered_widget_controls[$widget_id] : array();\n\t$widget = $wp_registered_widgets[$widget_id];\n\n\t$id_format = $widget['id'];\n\t$widget_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';\n\t$id_base = isset($control['id_base']) ? $control['id_base'] : $widget_id;\n\t$multi_number = isset($sidebar_args['_multi_num']) ? $sidebar_args['_multi_num'] : '';\n\t$add_new = isset($sidebar_args['_add']) ? $sidebar_args['_add'] : '';\n\n\t$before_form = isset( $sidebar_args['before_form'] ) ? $sidebar_args['before_form'] : '<form method=\"post\">';\n\t$after_form = isset( $sidebar_args['after_form'] ) ? $sidebar_args['after_form'] : '</form>';\n\t$before_widget_content = isset( $sidebar_args['before_widget_content'] ) ? $sidebar_args['before_widget_content'] : '<div class=\"widget-content\">';\n\t$after_widget_content = isset( $sidebar_args['after_widget_content'] ) ? $sidebar_args['after_widget_content'] : '</div>';\n\n\t$query_arg = array( 'editwidget' => $widget['id'] );\n\tif ( $add_new ) {\n\t\t$query_arg['addnew'] = 1;\n\t\tif ( $multi_number ) {\n\t\t\t$query_arg['num'] = $multi_number;\n\t\t\t$query_arg['base'] = $id_base;\n\t\t}\n\t} else {\n\t\t$query_arg['sidebar'] = $sidebar_id;\n\t\t$query_arg['key'] = $key;\n\t}\n\n\t/*\n\t * We aren't showing a widget control, we're outputting a template\n\t * for a multi-widget control.\n\t */\n\tif ( isset($sidebar_args['_display']) && 'template' == $sidebar_args['_display'] && $widget_number ) {\n\t\t// number == -1 implies a template where id numbers are replaced by a generic '__i__'\n\t\t$control['params'][0]['number'] = -1;\n\t\t// With id_base widget id's are constructed like {$id_base}-{$id_number}.\n\t\tif ( isset($control['id_base']) )\n\t\t\t$id_format = $control['id_base'] . '-__i__';\n\t}\n\n\t$wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback'];\n\tunset($wp_registered_widgets[$widget_id]['_callback']);\n\n\t$widget_title = esc_html( strip_tags( $sidebar_args['widget_name'] ) );\n\t$has_form = 'noform';\n\n\techo $sidebar_args['before_widget']; ?>\n\t<div class=\"widget-top\">\n\t<div class=\"widget-title-action\">\n\t\t<a class=\"widget-action hide-if-no-js\" href=\"#available-widgets\"></a>\n\t\t<a class=\"widget-control-edit hide-if-js\" href=\"<?php echo esc_url( add_query_arg( $query_arg ) ); ?>\">\n\t\t\t<span class=\"edit\"><?php _ex( 'Edit', 'widget' ); ?></span>\n\t\t\t<span class=\"add\"><?php _ex( 'Add', 'widget' ); ?></span>\n\t\t\t<span class=\"screen-reader-text\"><?php echo $widget_title; ?></span>\n\t\t</a>\n\t</div>\n\t<div class=\"widget-title\"><h3><?php echo $widget_title; ?><span class=\"in-widget-title\"></span></h3></div>\n\t</div>\n\n\t<div class=\"widget-inside\">\n\t<?php echo $before_form; ?>\n\t<?php echo $before_widget_content; ?>\n\t<?php\n\tif ( isset( $control['callback'] ) ) {\n\t\t$has_form = call_user_func_array( $control['callback'], $control['params'] );\n\t} else {\n\t\techo \"\\t\\t<p>\" . __('There are no options for this widget.') . \"</p>\\n\";\n\t}\n\t?>\n\t<?php echo $after_widget_content; ?>\n\t<input type=\"hidden\" name=\"widget-id\" class=\"widget-id\" value=\"<?php echo esc_attr($id_format); ?>\" />\n\t<input type=\"hidden\" name=\"id_base\" class=\"id_base\" value=\"<?php echo esc_attr($id_base); ?>\" />\n\t<input type=\"hidden\" name=\"widget-width\" class=\"widget-width\" value=\"<?php if (isset( $control['width'] )) echo esc_attr($control['width']); ?>\" />\n\t<input type=\"hidden\" name=\"widget-height\" class=\"widget-height\" value=\"<?php if (isset( $control['height'] )) echo esc_attr($control['height']); ?>\" />\n\t<input type=\"hidden\" name=\"widget_number\" class=\"widget_number\" value=\"<?php echo esc_attr($widget_number); ?>\" />\n\t<input type=\"hidden\" name=\"multi_number\" class=\"multi_number\" value=\"<?php echo esc_attr($multi_number); ?>\" />\n\t<input type=\"hidden\" name=\"add_new\" class=\"add_new\" value=\"<?php echo esc_attr($add_new); ?>\" />\n\n\t<div class=\"widget-control-actions\">\n\t\t<div class=\"alignleft\">\n\t\t<a class=\"widget-control-remove\" href=\"#remove\"><?php _e('Delete'); ?></a> |\n\t\t<a class=\"widget-control-close\" href=\"#close\"><?php _e('Close'); ?></a>\n\t\t</div>\n\t\t<div class=\"alignright<?php if ( 'noform' === $has_form ) echo ' widget-control-noform'; ?>\">\n\t\t\t<?php submit_button( __( 'Save' ), 'button-primary widget-control-save right', 'savewidget', false, array( 'id' => 'widget-' . esc_attr( $id_format ) . '-savewidget' ) ); ?>\n\t\t\t<span class=\"spinner\"></span>\n\t\t</div>\n\t\t<br class=\"clear\" />\n\t</div>\n\t<?php echo $after_form; ?>\n\t</div>\n\n\t<div class=\"widget-description\">\n<?php echo ( $widget_description = wp_widget_description($widget_id) ) ? \"$widget_description\\n\" : \"$widget_title\\n\"; ?>\n\t</div>\n<?php\n\techo $sidebar_args['after_widget'];\n\n\treturn $sidebar_args;\n}\n\n/**\n *\n * @param string $classes\n * @return string\n */\nfunction wp_widgets_access_body_class($classes) {\n\treturn \"$classes widgets_access \";\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/index.php",
    "content": "<?php\n/**\n * Dashboard Administration Screen\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n/** Load WordPress dashboard API */\nrequire_once(ABSPATH . 'wp-admin/includes/dashboard.php');\n\nwp_dashboard_setup();\n\nwp_enqueue_script( 'dashboard' );\nif ( current_user_can( 'edit_theme_options' ) )\n\twp_enqueue_script( 'customize-loader' );\nif ( current_user_can( 'install_plugins' ) )\n\twp_enqueue_script( 'plugin-install' );\nif ( current_user_can( 'upload_files' ) )\n\twp_enqueue_script( 'media-upload' );\nadd_thickbox();\n\nif ( wp_is_mobile() )\n\twp_enqueue_script( 'jquery-touch-punch' );\n\n$title = __('Dashboard');\n$parent_file = 'index.php';\n\n$help = '<p>' . __( 'Welcome to your WordPress Dashboard! This is the screen you will see when you log in to your site, and gives you access to all the site management features of WordPress. You can get help for any screen by clicking the Help tab in the upper corner.' ) . '</p>';\n\n// Not using chaining here, so as to be parseable by PHP4.\n$screen = get_current_screen();\n\n$screen->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __( 'Overview' ),\n\t'content' => $help,\n) );\n\n// Help tabs\n\n$help  = '<p>' . __( 'The left-hand navigation menu provides links to all of the WordPress administration screens, with submenu items displayed on hover. You can minimize this menu to a narrow icon strip by clicking on the Collapse Menu arrow at the bottom.' ) . '</p>';\n$help .= '<p>' . __( 'Links in the Toolbar at the top of the screen connect your dashboard and the front end of your site, and provide access to your profile and helpful WordPress information.' ) . '</p>';\n\n$screen->add_help_tab( array(\n\t'id'      => 'help-navigation',\n\t'title'   => __( 'Navigation' ),\n\t'content' => $help,\n) );\n\n$help  = '<p>' . __( 'You can use the following controls to arrange your Dashboard screen to suit your workflow. This is true on most other administration screens as well.' ) . '</p>';\n$help .= '<p>' . __( '<strong>Screen Options</strong> &mdash; Use the Screen Options tab to choose which Dashboard boxes to show.' ) . '</p>';\n$help .= '<p>' . __( '<strong>Drag and Drop</strong> &mdash; To rearrange the boxes, drag and drop by clicking on the title bar of the selected box and releasing when you see a gray dotted-line rectangle appear in the location you want to place the box.' ) . '</p>';\n$help .= '<p>' . __( '<strong>Box Controls</strong> &mdash; Click the title bar of the box to expand or collapse it. Some boxes added by plugins may have configurable content, and will show a &#8220;Configure&#8221; link in the title bar if you hover over it.' ) . '</p>';\n\n$screen->add_help_tab( array(\n\t'id'      => 'help-layout',\n\t'title'   => __( 'Layout' ),\n\t'content' => $help,\n) );\n\n$help  = '<p>' . __( 'The boxes on your Dashboard screen are:' ) . '</p>';\nif ( current_user_can( 'edit_posts' ) )\n\t$help .= '<p>' . __( '<strong>At A Glance</strong> &mdash; Displays a summary of the content on your site and identifies which theme and version of WordPress you are using.' ) . '</p>';\n\t$help .= '<p>' . __( '<strong>Activity</strong> &mdash; Shows the upcoming scheduled posts, recently published posts, and the most recent comments on your posts and allows you to moderate them.' ) . '</p>';\nif ( is_blog_admin() && current_user_can( 'edit_posts' ) )\n\t$help .= '<p>' . __( \"<strong>Quick Draft</strong> &mdash; Allows you to create a new post and save it as a draft. Also displays links to the 5 most recent draft posts you've started.\" ) . '</p>';\nif ( ! is_multisite() && current_user_can( 'install_plugins' ) )\n\t$help .= '<p>' . __( '<strong>WordPress News</strong> &mdash; Latest news from the official WordPress project, the <a href=\"https://planet.wordpress.org/\">WordPress Planet</a>, and popular and recent plugins.' ) . '</p>';\nelse\n\t$help .= '<p>' . __( '<strong>WordPress News</strong> &mdash; Latest news from the official WordPress project, the <a href=\"https://planet.wordpress.org/\">WordPress Planet</a>.' ) . '</p>';\nif ( current_user_can( 'edit_theme_options' ) )\n\t$help .= '<p>' . __( '<strong>Welcome</strong> &mdash; Shows links for some of the most common tasks when setting up a new site.' ) . '</p>';\n\n$screen->add_help_tab( array(\n\t'id'      => 'help-content',\n\t'title'   => __( 'Content' ),\n\t'content' => $help,\n) );\n\nunset( $help );\n\n$screen->set_help_sidebar(\n\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Dashboard_Screen\" target=\"_blank\">Documentation on Dashboard</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n);\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n\t<h1><?php echo esc_html( $title ); ?></h1>\n\n<?php if ( has_action( 'welcome_panel' ) && current_user_can( 'edit_theme_options' ) ) :\n\t$classes = 'welcome-panel';\n\n\t$option = get_user_meta( get_current_user_id(), 'show_welcome_panel', true );\n\t// 0 = hide, 1 = toggled to show or single site creator, 2 = multisite site owner\n\t$hide = 0 == $option || ( 2 == $option && wp_get_current_user()->user_email != get_option( 'admin_email' ) );\n\tif ( $hide )\n\t\t$classes .= ' hidden'; ?>\n\n\t<div id=\"welcome-panel\" class=\"<?php echo esc_attr( $classes ); ?>\">\n\t\t<?php wp_nonce_field( 'welcome-panel-nonce', 'welcomepanelnonce', false ); ?>\n\t\t<a class=\"welcome-panel-close\" href=\"<?php echo esc_url( admin_url( '?welcome=0' ) ); ?>\"><?php _e( 'Dismiss' ); ?></a>\n\t\t<?php\n\t\t/**\n\t\t * Add content to the welcome panel on the admin dashboard.\n\t\t *\n\t\t * To remove the default welcome panel, use {@see remove_action()}:\n\t\t *\n\t\t *     remove_action( 'welcome_panel', 'wp_welcome_panel' );\n\t\t *\n\t\t * @since 3.5.0\n\t\t */\n\t\tdo_action( 'welcome_panel' );\n\t\t?>\n\t</div>\n<?php endif; ?>\n\n\t<div id=\"dashboard-widgets-wrap\">\n\t<?php wp_dashboard(); ?>\n\t</div><!-- dashboard-widgets-wrap -->\n\n</div><!-- wrap -->\n\n<?php\nrequire( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/install-helper.php",
    "content": "<?php\n/**\n * Plugins may load this file to gain access to special helper functions for\n * plugin installation. This file is not included by WordPress and it is\n * recommended, to prevent fatal errors, that this file is included using\n * require_once().\n *\n * These functions are not optimized for speed, but they should only be used\n * once in a while, so speed shouldn't be a concern. If it is and you are\n * needing to use these functions a lot, you might experience time outs. If you\n * do, then it is advised to just write the SQL code yourself.\n *\n *     check_column( 'wp_links', 'link_description', 'mediumtext' );\n *     if ( check_column( $wpdb->comments, 'comment_author', 'tinytext' ) ) {\n *         echo \"ok\\n\";\n *     }\n *\n *     $error_count = 0;\n *     $tablename = $wpdb->links;\n *     // Check the column.\n *     if ( ! check_column($wpdb->links, 'link_description', 'varchar( 255 )' ) ) {\n *         $ddl = \"ALTER TABLE $wpdb->links MODIFY COLUMN link_description varchar(255) NOT NULL DEFAULT '' \";\n *         $q = $wpdb->query( $ddl );\n *     }\n *\n *     if ( check_column( $wpdb->links, 'link_description', 'varchar( 255 )' ) ) {\n *         $res .= $tablename . ' - ok <br />';\n *     } else {\n *         $res .= 'There was a problem with ' . $tablename . '<br />';\n *         ++$error_count;\n *     }\n *\n * @package WordPress\n * @subpackage Plugin\n */\n\n/** Load WordPress Bootstrap */\nrequire_once(dirname(dirname(__FILE__)).'/wp-load.php');\n\nif ( ! function_exists('maybe_create_table') ) :\n/**\n * Create database table, if it doesn't already exist.\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $table_name Database table name.\n * @param string $create_ddl Create database table SQL.\n * @return bool False on error, true if already exists or success.\n */\nfunction maybe_create_table($table_name, $create_ddl) {\n\tglobal $wpdb;\n\tforeach ($wpdb->get_col(\"SHOW TABLES\",0) as $table ) {\n\t\tif ($table == $table_name) {\n\t\t\treturn true;\n\t\t}\n\t}\n\t// Didn't find it, so try to create it.\n\t$wpdb->query($create_ddl);\n\n\t// We cannot directly tell that whether this succeeded!\n\tforeach ($wpdb->get_col(\"SHOW TABLES\",0) as $table ) {\n\t\tif ($table == $table_name) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nendif;\n\nif ( ! function_exists('maybe_add_column') ) :\n/**\n * Add column to database table, if column doesn't already exist in table.\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $table_name Database table name\n * @param string $column_name Table column name\n * @param string $create_ddl SQL to add column to table.\n * @return bool False on failure. True, if already exists or was successful.\n */\nfunction maybe_add_column($table_name, $column_name, $create_ddl) {\n\tglobal $wpdb;\n\tforeach ($wpdb->get_col(\"DESC $table_name\",0) as $column ) {\n\n\t\tif ($column == $column_name) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t// Didn't find it, so try to create it.\n\t$wpdb->query($create_ddl);\n\n\t// We cannot directly tell that whether this succeeded!\n\tforeach ($wpdb->get_col(\"DESC $table_name\",0) as $column ) {\n\t\tif ($column == $column_name) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\nendif;\n\n/**\n * Drop column from database table, if it exists.\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $table_name Table name\n * @param string $column_name Column name\n * @param string $drop_ddl SQL statement to drop column.\n * @return bool False on failure, true on success or doesn't exist.\n */\nfunction maybe_drop_column($table_name, $column_name, $drop_ddl) {\n\tglobal $wpdb;\n\tforeach ($wpdb->get_col(\"DESC $table_name\",0) as $column ) {\n\t\tif ($column == $column_name) {\n\n\t\t\t// Found it, so try to drop it.\n\t\t\t$wpdb->query($drop_ddl);\n\n\t\t\t// We cannot directly tell that whether this succeeded!\n\t\t\tforeach ($wpdb->get_col(\"DESC $table_name\",0) as $column ) {\n\t\t\t\tif ($column == $column_name) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Else didn't find it.\n\treturn true;\n}\n\n/**\n * Check column matches criteria.\n *\n * Uses the SQL DESC for retrieving the table info for the column. It will help\n * understand the parameters, if you do more research on what column information\n * is returned by the SQL statement. Pass in null to skip checking that\n * criteria.\n *\n * Column names returned from DESC table are case sensitive and are listed:\n *      Field\n *      Type\n *      Null\n *      Key\n *      Default\n *      Extra\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $table_name Table name\n * @param string $col_name   Column name\n * @param string $col_type   Column type\n * @param bool   $is_null    Optional. Check is null.\n * @param mixed  $key        Optional. Key info.\n * @param mixed  $default    Optional. Default value.\n * @param mixed  $extra      Optional. Extra value.\n * @return bool True, if matches. False, if not matching.\n */\nfunction check_column($table_name, $col_name, $col_type, $is_null = null, $key = null, $default = null, $extra = null) {\n\tglobal $wpdb;\n\t$diffs = 0;\n\t$results = $wpdb->get_results(\"DESC $table_name\");\n\n\tforeach ($results as $row ) {\n\n\t\tif ($row->Field == $col_name) {\n\n\t\t\t// Got our column, check the params.\n\t\t\tif (($col_type != null) && ($row->Type != $col_type)) {\n\t\t\t\t++$diffs;\n\t\t\t}\n\t\t\tif (($is_null != null) && ($row->Null != $is_null)) {\n\t\t\t\t++$diffs;\n\t\t\t}\n\t\t\tif (($key != null) && ($row->Key  != $key)) {\n\t\t\t\t++$diffs;\n\t\t\t}\n\t\t\tif (($default != null) && ($row->Default != $default)) {\n\t\t\t\t++$diffs;\n\t\t\t}\n\t\t\tif (($extra != null) && ($row->Extra != $extra)) {\n\t\t\t\t++$diffs;\n\t\t\t}\n\t\t\tif ($diffs > 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t} // end if found our column\n\t}\n\treturn false;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/install.php",
    "content": "<?php\n/**\n * WordPress Installer\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n// Sanity check.\nif ( false ) {\n?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title>Error: PHP is not running</title>\n</head>\n<body class=\"wp-core-ui\">\n\t<p id=\"logo\"><a href=\"https://wordpress.org/\">WordPress</a></p>\n\t<h1>Error: PHP is not running</h1>\n\t<p>WordPress requires that your web server is running PHP. Your server does not have PHP installed, or PHP is turned off.</p>\n</body>\n</html>\n<?php\n}\n\n/**\n * We are installing WordPress.\n *\n * @since 1.5.1\n * @var bool\n */\ndefine( 'WP_INSTALLING', true );\n\n/** Load WordPress Bootstrap */\nrequire_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );\n\n/** Load WordPress Administration Upgrade API */\nrequire_once( ABSPATH . 'wp-admin/includes/upgrade.php' );\n\n/** Load WordPress Translation Install API */\nrequire_once( ABSPATH . 'wp-admin/includes/translation-install.php' );\n\n/** Load wpdb */\nrequire_once( ABSPATH . WPINC . '/wp-db.php' );\n\nnocache_headers();\n\n$step = isset( $_GET['step'] ) ? (int) $_GET['step'] : 0;\n\n/**\n * Display install header.\n *\n * @since 2.5.0\n *\n * @param string $body_classes\n */\nfunction display_header( $body_classes = '' ) {\n\theader( 'Content-Type: text/html; charset=utf-8' );\n\tif ( is_rtl() ) {\n\t\t$body_classes .= 'rtl';\n\t}\n\tif ( $body_classes ) {\n\t\t$body_classes = ' ' . $body_classes;\n\t}\n?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" <?php language_attributes(); ?>>\n<head>\n\t<meta name=\"viewport\" content=\"width=device-width\" />\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<meta name=\"robots\" content=\"noindex,nofollow\" />\n\t<title><?php _e( 'WordPress &rsaquo; Installation' ); ?></title>\n\t<?php\n\t\twp_admin_css( 'install', true );\n\t\twp_admin_css( 'dashicons', true );\n\t?>\n</head>\n<body class=\"wp-core-ui<?php echo $body_classes ?>\">\n<p id=\"logo\"><a href=\"<?php echo esc_url( __( 'https://wordpress.org/' ) ); ?>\" tabindex=\"-1\"><?php _e( 'WordPress' ); ?></a></p>\n\n<?php\n} // end display_header()\n\n/**\n * Display installer setup form.\n *\n * @since 2.8.0\n *\n * @param string|null $error\n */\nfunction display_setup_form( $error = null ) {\n\tglobal $wpdb;\n\n\t$sql = $wpdb->prepare( \"SHOW TABLES LIKE %s\", $wpdb->esc_like( $wpdb->users ) );\n\t$user_table = ( $wpdb->get_var( $sql ) != null );\n\n\t// Ensure that Blogs appear in search engines by default.\n\t$blog_public = 1;\n\tif ( isset( $_POST['weblog_title'] ) ) {\n\t\t$blog_public = isset( $_POST['blog_public'] );\n\t}\n\n\t$weblog_title = isset( $_POST['weblog_title'] ) ? trim( wp_unslash( $_POST['weblog_title'] ) ) : '';\n\t$user_name = isset($_POST['user_name']) ? trim( wp_unslash( $_POST['user_name'] ) ) : '';\n\t$admin_email  = isset( $_POST['admin_email']  ) ? trim( wp_unslash( $_POST['admin_email'] ) ) : '';\n\n\tif ( ! is_null( $error ) ) {\n?>\n<h1><?php _ex( 'Welcome', 'Howdy' ); ?></h1>\n<p class=\"message\"><?php echo $error; ?></p>\n<?php } ?>\n<form id=\"setup\" method=\"post\" action=\"install.php?step=2\" novalidate=\"novalidate\">\n\t<table class=\"form-table\">\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"weblog_title\"><?php _e( 'Site Title' ); ?></label></th>\n\t\t\t<td><input name=\"weblog_title\" type=\"text\" id=\"weblog_title\" size=\"25\" value=\"<?php echo esc_attr( $weblog_title ); ?>\" /></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"user_login\"><?php _e('Username'); ?></label></th>\n\t\t\t<td>\n\t\t\t<?php\n\t\t\tif ( $user_table ) {\n\t\t\t\t_e('User(s) already exists.');\n\t\t\t\techo '<input name=\"user_name\" type=\"hidden\" value=\"admin\" />';\n\t\t\t} else {\n\t\t\t\t?><input name=\"user_name\" type=\"text\" id=\"user_login\" size=\"25\" value=\"<?php echo esc_attr( sanitize_user( $user_name, true ) ); ?>\" />\n\t\t\t\t<p><?php _e( 'Usernames can have only alphanumeric characters, spaces, underscores, hyphens, periods, and the @ symbol.' ); ?></p>\n\t\t\t<?php\n\t\t\t} ?>\n\t\t\t</td>\n\t\t</tr>\n\t\t<?php if ( ! $user_table ) : ?>\n\t\t<tr class=\"form-field form-required user-pass1-wrap\">\n\t\t\t<th scope=\"row\">\n\t\t\t\t<label for=\"pass1\">\n\t\t\t\t\t<?php _e( 'Password' ); ?>\n\t\t\t\t</label>\n\t\t\t</th>\n\t\t\t<td>\n\t\t\t\t<div class=\"\">\n\t\t\t\t\t<?php $initial_password = isset( $_POST['admin_password'] ) ? stripslashes( $_POST['admin_password'] ) : wp_generate_password( 18 ); ?>\n\t\t\t\t\t<input type=\"password\" name=\"admin_password\" id=\"pass1\" class=\"regular-text\" autocomplete=\"off\" data-reveal=\"1\" data-pw=\"<?php echo esc_attr( $initial_password ); ?>\" aria-describedby=\"pass-strength-result\" />\n\t\t\t\t\t<button type=\"button\" class=\"button button-secondary wp-hide-pw hide-if-no-js\" data-start-masked=\"<?php echo (int) isset( $_POST['admin_password'] ); ?>\" data-toggle=\"0\" aria-label=\"<?php esc_attr_e( 'Hide password' ); ?>\">\n\t\t\t\t\t\t<span class=\"dashicons dashicons-hidden\"></span>\n\t\t\t\t\t\t<span class=\"text\"><?php _e( 'Hide' ); ?></span>\n\t\t\t\t\t</button>\n\t\t\t\t\t<div id=\"pass-strength-result\" aria-live=\"polite\"></div>\n\t\t\t\t</div>\n\t\t\t\t<p><span class=\"description important hide-if-no-js\">\n\t\t\t\t<strong><?php _e( 'Important:' ); ?></strong>\n\t\t\t\t<?php /* translators: The non-breaking space prevents 1Password from thinking the text \"log in\" should trigger a password save prompt. */ ?>\n\t\t\t\t<?php _e( 'You will need this password to log&nbsp;in. Please store it in a secure location.' ); ?></span></p>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr class=\"form-field form-required user-pass2-wrap hide-if-js\">\n\t\t\t<th scope=\"row\">\n\t\t\t\t<label for=\"pass2\"><?php _e( 'Repeat Password' ); ?>\n\t\t\t\t\t<span class=\"description\"><?php _e( '(required)' ); ?></span>\n\t\t\t\t</label>\n\t\t\t</th>\n\t\t\t<td>\n\t\t\t\t<input name=\"admin_password2\" type=\"password\" id=\"pass2\" autocomplete=\"off\" />\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr class=\"pw-weak\">\n\t\t\t<th scope=\"row\"><?php _e( 'Confirm Password' ); ?></th>\n\t\t\t<td>\n\t\t\t\t<label>\n\t\t\t\t\t<input type=\"checkbox\" name=\"pw_weak\" class=\"pw-checkbox\" />\n\t\t\t\t\t<?php _e( 'Confirm use of weak password' ); ?>\n\t\t\t\t</label>\n\t\t\t</td>\n\t\t</tr>\n\t\t<?php endif; ?>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"admin_email\"><?php _e( 'Your Email' ); ?></label></th>\n\t\t\t<td><input name=\"admin_email\" type=\"email\" id=\"admin_email\" size=\"25\" value=\"<?php echo esc_attr( $admin_email ); ?>\" />\n\t\t\t<p><?php _e( 'Double-check your email address before continuing.' ); ?></p></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><?php has_action( 'blog_privacy_selector' ) ? _e( 'Site Visibility' ) : _e( 'Search Engine Visibility' ); ?></th>\n\t\t\t<td>\n\t\t\t\t<fieldset>\n\t\t\t\t\t<legend class=\"screen-reader-text\"><span><?php has_action( 'blog_privacy_selector' ) ? _e( 'Site Visibility' ) : _e( 'Search Engine Visibility' ); ?> </span></legend>\n\t\t\t\t\t<?php\n\t\t\t\t\tif ( has_action( 'blog_privacy_selector' ) ) { ?>\n\t\t\t\t\t\t<input id=\"blog-public\" type=\"radio\" name=\"blog_public\" value=\"1\" <?php checked( 1, $blog_public ); ?> />\n\t\t\t\t\t\t<label for=\"blog-public\"><?php _e( 'Allow search engines to index this site' );?></label><br/>\n\t\t\t\t\t\t<input id=\"blog-norobots\" type=\"radio\" name=\"blog_public\" value=\"0\" <?php checked( 0, $blog_public ); ?> />\n\t\t\t\t\t\t<label for=\"blog-norobots\"><?php _e( 'Discourage search engines from indexing this site' ); ?></label>\n\t\t\t\t\t\t<p class=\"description\"><?php _e( 'Note: Neither of these options blocks access to your site &mdash; it is up to search engines to honor your request.' ); ?></p>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t/** This action is documented in wp-admin/options-reading.php */\n\t\t\t\t\t\tdo_action( 'blog_privacy_selector' );\n\t\t\t\t\t } else { ?>\n\t\t\t\t\t\t<label for=\"blog_public\"><input name=\"blog_public\" type=\"checkbox\" id=\"blog_public\" value=\"0\" <?php checked( 0, $blog_public ); ?> />\n\t\t\t\t\t\t<?php _e( 'Discourage search engines from indexing this site' ); ?></label>\n\t\t\t\t\t\t<p class=\"description\"><?php _e( 'It is up to search engines to honor this request.' ); ?></p>\n\t\t\t\t\t<?php } ?>\n\t\t\t\t</fieldset>\n\t\t\t</td>\n\t\t</tr>\n\t</table>\n\t<p class=\"step\"><?php submit_button( __( 'Install WordPress' ), 'large', 'Submit', false, array( 'id' => 'submit' ) ); ?></p>\n\t<input type=\"hidden\" name=\"language\" value=\"<?php echo isset( $_REQUEST['language'] ) ? esc_attr( $_REQUEST['language'] ) : ''; ?>\" />\n</form>\n<?php\n} // end display_setup_form()\n\n// Let's check to make sure WP isn't already installed.\nif ( is_blog_installed() ) {\n\tdisplay_header();\n\tdie( '<h1>' . __( 'Already Installed' ) . '</h1><p>' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '</p><p class=\"step\"><a href=\"' . esc_url( wp_login_url() ) . '\" class=\"button button-large\">' . __( 'Log In' ) . '</a></p></body></html>' );\n}\n\n/**\n * @global string $wp_version\n * @global string $required_php_version\n * @global string $required_mysql_version\n * @global wpdb   $wpdb\n */\nglobal $wp_version, $required_php_version, $required_mysql_version;\n\n$php_version    = phpversion();\n$mysql_version  = $wpdb->db_version();\n$php_compat     = version_compare( $php_version, $required_php_version, '>=' );\n$mysql_compat   = version_compare( $mysql_version, $required_mysql_version, '>=' ) || file_exists( WP_CONTENT_DIR . '/db.php' );\n\nif ( !$mysql_compat && !$php_compat )\n\t$compat = sprintf( __( 'You cannot install because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.' ), $wp_version, $required_php_version, $required_mysql_version, $php_version, $mysql_version );\nelseif ( !$php_compat )\n\t$compat = sprintf( __( 'You cannot install because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires PHP version %2$s or higher. You are running version %3$s.' ), $wp_version, $required_php_version, $php_version );\nelseif ( !$mysql_compat )\n\t$compat = sprintf( __( 'You cannot install because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires MySQL version %2$s or higher. You are running version %3$s.' ), $wp_version, $required_mysql_version, $mysql_version );\n\nif ( !$mysql_compat || !$php_compat ) {\n\tdisplay_header();\n\tdie( '<h1>' . __( 'Insufficient Requirements' ) . '</h1><p>' . $compat . '</p></body></html>' );\n}\n\nif ( ! is_string( $wpdb->base_prefix ) || '' === $wpdb->base_prefix ) {\n\tdisplay_header();\n\tdie( '<h1>' . __( 'Configuration Error' ) . '</h1><p>' . __( 'Your <code>wp-config.php</code> file has an empty database table prefix, which is not supported.' ) . '</p></body></html>' );\n}\n\n// Set error message if DO_NOT_UPGRADE_GLOBAL_TABLES isn't set as it will break install.\nif ( defined( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {\n\tdisplay_header();\n\tdie( '<h1>' . __( 'Configuration Error' ) . '</h1><p>' . __( 'The constant DO_NOT_UPGRADE_GLOBAL_TABLES cannot be defined when installing WordPress.' ) . '</p></body></html>' );\n}\n\n/**\n * @global string    $wp_local_package\n * @global WP_Locale $wp_locale\n */\n$language = '';\nif ( ! empty( $_REQUEST['language'] ) ) {\n\t$language = preg_replace( '/[^a-zA-Z_]/', '', $_REQUEST['language'] );\n} elseif ( isset( $GLOBALS['wp_local_package'] ) ) {\n\t$language = $GLOBALS['wp_local_package'];\n}\n\nswitch($step) {\n\tcase 0: // Step 0\n\n\t\tif ( wp_can_install_language_pack() && empty( $language ) && ( $languages = wp_get_available_translations() ) ) {\n\t\t\tdisplay_header( 'language-chooser' );\n\t\t\techo '<form id=\"setup\" method=\"post\" action=\"?step=1\">';\n\t\t\twp_install_language_form( $languages );\n\t\t\techo '</form>';\n\t\t\tbreak;\n\t\t}\n\n\t\t// Deliberately fall through if we can't reach the translations API.\n\n\tcase 1: // Step 1, direct link or from language chooser.\n\t\tif ( ! empty( $language ) ) {\n\t\t\t$loaded_language = wp_download_language_pack( $language );\n\t\t\tif ( $loaded_language ) {\n\t\t\t\tload_default_textdomain( $loaded_language );\n\t\t\t\t$GLOBALS['wp_locale'] = new WP_Locale();\n\t\t\t}\n\t\t}\n\n\t\tdisplay_header();\n?>\n<h1><?php _ex( 'Welcome', 'Howdy' ); ?></h1>\n<p><?php _e( 'Welcome to the famous five-minute WordPress installation process! Just fill in the information below and you&#8217;ll be on your way to using the most extendable and powerful personal publishing platform in the world.' ); ?></p>\n\n<h2><?php _e( 'Information needed' ); ?></h2>\n<p><?php _e( 'Please provide the following information. Don&#8217;t worry, you can always change these settings later.' ); ?></p>\n\n<?php\n\t\tdisplay_setup_form();\n\t\tbreak;\n\tcase 2:\n\t\tif ( ! empty( $language ) && load_default_textdomain( $language ) ) {\n\t\t\t$loaded_language = $language;\n\t\t\t$GLOBALS['wp_locale'] = new WP_Locale();\n\t\t} else {\n\t\t\t$loaded_language = 'en_US';\n\t\t}\n\n\t\tif ( ! empty( $wpdb->error ) )\n\t\t\twp_die( $wpdb->error->get_error_message() );\n\n\t\tdisplay_header();\n\t\t// Fill in the data we gathered\n\t\t$weblog_title = isset( $_POST['weblog_title'] ) ? trim( wp_unslash( $_POST['weblog_title'] ) ) : '';\n\t\t$user_name = isset($_POST['user_name']) ? trim( wp_unslash( $_POST['user_name'] ) ) : '';\n\t\t$admin_password = isset($_POST['admin_password']) ? wp_unslash( $_POST['admin_password'] ) : '';\n\t\t$admin_password_check = isset($_POST['admin_password2']) ? wp_unslash( $_POST['admin_password2'] ) : '';\n\t\t$admin_email  = isset( $_POST['admin_email'] ) ?trim( wp_unslash( $_POST['admin_email'] ) ) : '';\n\t\t$public       = isset( $_POST['blog_public'] ) ? (int) $_POST['blog_public'] : 1;\n\n\t\t// Check email address.\n\t\t$error = false;\n\t\tif ( empty( $user_name ) ) {\n\t\t\t// TODO: poka-yoke\n\t\t\tdisplay_setup_form( __( 'Please provide a valid username.' ) );\n\t\t\t$error = true;\n\t\t} elseif ( $user_name != sanitize_user( $user_name, true ) ) {\n\t\t\tdisplay_setup_form( __( 'The username you provided has invalid characters.' ) );\n\t\t\t$error = true;\n\t\t} elseif ( $admin_password != $admin_password_check ) {\n\t\t\t// TODO: poka-yoke\n\t\t\tdisplay_setup_form( __( 'Your passwords do not match. Please try again.' ) );\n\t\t\t$error = true;\n\t\t} elseif ( empty( $admin_email ) ) {\n\t\t\t// TODO: poka-yoke\n\t\t\tdisplay_setup_form( __( 'You must provide an email address.' ) );\n\t\t\t$error = true;\n\t\t} elseif ( ! is_email( $admin_email ) ) {\n\t\t\t// TODO: poka-yoke\n\t\t\tdisplay_setup_form( __( 'Sorry, that isn&#8217;t a valid email address. Email addresses look like <code>username@example.com</code>.' ) );\n\t\t\t$error = true;\n\t\t}\n\n\t\tif ( $error === false ) {\n\t\t\t$wpdb->show_errors();\n\t\t\t$result = wp_install( $weblog_title, $user_name, $admin_email, $public, '', wp_slash( $admin_password ), $loaded_language );\n?>\n\n<h1><?php _e( 'Success!' ); ?></h1>\n\n<p><?php _e( 'WordPress has been installed. Were you expecting more steps? Sorry to disappoint.' ); ?></p>\n\n<table class=\"form-table install-success\">\n\t<tr>\n\t\t<th><?php _e( 'Username' ); ?></th>\n\t\t<td><?php echo esc_html( sanitize_user( $user_name, true ) ); ?></td>\n\t</tr>\n\t<tr>\n\t\t<th><?php _e( 'Password' ); ?></th>\n\t\t<td><?php\n\t\tif ( ! empty( $result['password'] ) && empty( $admin_password_check ) ): ?>\n\t\t\t<code><?php echo esc_html( $result['password'] ) ?></code><br />\n\t\t<?php endif ?>\n\t\t\t<p><?php echo $result['password_message'] ?></p>\n\t\t</td>\n\t</tr>\n</table>\n\n<p class=\"step\"><a href=\"<?php echo esc_url( wp_login_url() ); ?>\" class=\"button button-large\"><?php _e( 'Log In' ); ?></a></p>\n\n<?php\n\t\t}\n\t\tbreak;\n}\nif ( !wp_is_mobile() ) {\n?>\n<script type=\"text/javascript\">var t = document.getElementById('weblog_title'); if (t){ t.focus(); }</script>\n<?php } ?>\n<?php wp_print_scripts( 'user-profile' ); ?>\n<?php wp_print_scripts( 'language-chooser' ); ?>\n<script type=\"text/javascript\">\njQuery( function( $ ) {\n\t$( '.hide-if-no-js' ).removeClass( 'hide-if-no-js' );\n} );\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/accordion.js",
    "content": "/**\n * Accordion-folding functionality.\n *\n * Markup with the appropriate classes will be automatically hidden,\n * with one section opening at a time when its title is clicked.\n * Use the following markup structure for accordion behavior:\n *\n * <div class=\"accordion-container\">\n *\t<div class=\"accordion-section open\">\n *\t\t<h3 class=\"accordion-section-title\"></h3>\n *\t\t<div class=\"accordion-section-content\">\n *\t\t</div>\n *\t</div>\n *\t<div class=\"accordion-section\">\n *\t\t<h3 class=\"accordion-section-title\"></h3>\n *\t\t<div class=\"accordion-section-content\">\n *\t\t</div>\n *\t</div>\n *\t<div class=\"accordion-section\">\n *\t\t<h3 class=\"accordion-section-title\"></h3>\n *\t\t<div class=\"accordion-section-content\">\n *\t\t</div>\n *\t</div>\n * </div>\n *\n * Note that any appropriate tags may be used, as long as the above classes are present.\n *\n * @since 3.6.0.\n */\n\n( function( $ ){\n\n\t$( document ).ready( function () {\n\n\t\t// Expand/Collapse accordion sections on click.\n\t\t$( '.accordion-container' ).on( 'click keydown', '.accordion-section-title', function( e ) {\n\t\t\tif ( e.type === 'keydown' && 13 !== e.which ) { // \"return\" key\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\taccordionSwitch( $( this ) );\n\t\t});\n\n\t});\n\n\t/**\n\t * Close the current accordion section and open a new one.\n\t *\n\t * @param {Object} el Title element of the accordion section to toggle.\n\t * @since 3.6.0\n\t */\n\tfunction accordionSwitch ( el ) {\n\t\tvar section = el.closest( '.accordion-section' ),\n\t\t\tsectionToggleControl = section.find( '[aria-expanded]' ).first(),\n\t\t\tcontainer = section.closest( '.accordion-container' ),\n\t\t\tsiblings = container.find( '.open' ),\n\t\t\tsiblingsToggleControl = siblings.find( '[aria-expanded]' ).first(),\n\t\t\tcontent = section.find( '.accordion-section-content' );\n\n\t\t// This section has no content and cannot be expanded.\n\t\tif ( section.hasClass( 'cannot-expand' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add a class to the container to let us know something is happening inside.\n\t\t// This helps in cases such as hiding a scrollbar while animations are executing.\n\t\tcontainer.addClass( 'opening' );\n\n\t\tif ( section.hasClass( 'open' ) ) {\n\t\t\tsection.toggleClass( 'open' );\n\t\t\tcontent.toggle( true ).slideToggle( 150 );\n\t\t} else {\n\t\t\tsiblingsToggleControl.attr( 'aria-expanded', 'false' );\n\t\t\tsiblings.removeClass( 'open' );\n\t\t\tsiblings.find( '.accordion-section-content' ).show().slideUp( 150 );\n\t\t\tcontent.toggle( false ).slideToggle( 150 );\n\t\t\tsection.toggleClass( 'open' );\n\t\t}\n\n\t\t// We have to wait for the animations to finish\n\t\tsetTimeout(function(){\n\t\t    container.removeClass( 'opening' );\n\t\t}, 150);\n\n\t\t// If there's an element with an aria-expanded attribute, assume it's a toggle control and toggle the aria-expanded value.\n\t\tif ( sectionToggleControl ) {\n\t\t\tsectionToggleControl.attr( 'aria-expanded', String( sectionToggleControl.attr( 'aria-expanded' ) === 'false' ) );\n\t\t}\n\t}\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/bookmarklet.js",
    "content": "( function( window, document, href, pt_url ) {\n\tvar encURI = window.encodeURIComponent,\n\t\tform = document.createElement( 'form' ),\n\t\thead = document.getElementsByTagName( 'head' )[0],\n\t\ttarget = '_press_this_app',\n\t\tcanPost = true,\n\t\twindowWidth, windowHeight, selection,\n\t\tmetas, links, content, images, iframes, img;\n\n\tif ( ! pt_url ) {\n\t\treturn;\n\t}\n\n\tif ( href.match( /^https?:/ ) ) {\n\t\tpt_url += '&u=' + encURI( href );\n\t\tif ( href.match( /^https:/ ) && pt_url.match( /^http:/ ) ) {\n\t\t\tcanPost = false;\n\t\t}\n\t} else {\n\t\ttop.location.href = pt_url;\n\t\treturn;\n\t}\n\n\tif ( window.getSelection ) {\n\t\tselection = window.getSelection() + '';\n\t} else if ( document.getSelection ) {\n\t\tselection = document.getSelection() + '';\n\t} else if ( document.selection ) {\n\t\tselection = document.selection.createRange().text || '';\n\t}\n\n\tpt_url += '&buster=' + ( new Date().getTime() );\n\n\tif ( ! canPost ) {\n\t\tif ( document.title ) {\n\t\t\tpt_url += '&t=' + encURI( document.title.substr( 0, 256 ) );\n\t\t}\n\n\t\tif ( selection ) {\n\t\t\tpt_url += '&s=' + encURI( selection.substr( 0, 512 ) );\n\t\t}\n\t}\n\n\twindowWidth  = window.outerWidth || document.documentElement.clientWidth || 600;\n\twindowHeight = window.outerHeight || document.documentElement.clientHeight || 700;\n\n\twindowWidth = ( windowWidth < 800 || windowWidth > 5000 ) ? 600 : ( windowWidth * 0.7 );\n\twindowHeight = ( windowHeight < 800 || windowHeight > 3000 ) ? 700 : ( windowHeight * 0.9 );\n\n\tif ( ! canPost ) {\n\t\twindow.open( pt_url, target, 'location,resizable,scrollbars,width=' + windowWidth + ',height=' + windowHeight );\n\t\treturn;\n\t}\n\n\tfunction add( name, value ) {\n\t\tif ( typeof value === 'undefined' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar input = document.createElement( 'input' );\n\n\t\tinput.name = name;\n\t\tinput.value = value;\n\t\tinput.type = 'hidden';\n\n\t\tform.appendChild( input );\n\t}\n\n\tmetas = head.getElementsByTagName( 'meta' ) || [];\n\n\tfor ( var m = 0; m < metas.length; m++ ) {\n\t\tif ( m > 200 ) {\n\t\t\tbreak;\n\t\t}\n\n\t\tvar q = metas[ m ],\n\t\t\tq_name = q.getAttribute( 'name' ),\n\t\t\tq_prop = q.getAttribute( 'property' ),\n\t\t\tq_cont = q.getAttribute( 'content' );\n\n\t\tif ( q_cont ) {\n\t\t\tif ( q_name ) {\n\t\t\t\tadd( '_meta[' + q_name + ']', q_cont );\n\t\t\t} else if ( q_prop ) {\n\t\t\t\tadd( '_meta[' + q_prop + ']', q_cont );\n\t\t\t}\n\t\t}\n\t}\n\n\tlinks = head.getElementsByTagName( 'link' ) || [];\n\n\tfor ( var y = 0; y < links.length; y++ ) {\n\t\tif ( y >= 50 ) {\n\t\t\tbreak;\n\t\t}\n\n\t\tvar g = links[ y ],\n\t\t\tg_rel = g.getAttribute( 'rel' );\n\n\t\tif ( g_rel === 'canonical' || g_rel === 'icon' || g_rel === 'shortlink' ) {\n\t\t\tadd( '_links[' + g_rel + ']', g.getAttribute( 'href' ) );\n\t\t}\n\t}\n\n\tif ( document.body.getElementsByClassName ) {\n\t\tcontent = document.body.getElementsByClassName( 'hfeed' )[0];\n\t}\n\n\tcontent = document.getElementById( 'content' ) || content || document.body;\n\timages = content.getElementsByTagName( 'img' ) || [];\n\n\tfor ( var n = 0; n < images.length; n++ ) {\n\t\tif ( n >= 100 ) {\n\t\t\tbreak;\n\t\t}\n\n\t\timg = images[ n ];\n\n\t\t// If we know the image width and/or height, check them now and drop the \"uninteresting\" images.\n\t\tif ( img.src.indexOf( 'avatar' ) > -1 || img.className.indexOf( 'avatar' ) > -1 ||\n\t\t\t( img.width && img.width < 256 ) || ( img.height && img.height < 128 ) ) {\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tadd( '_images[]', img.src );\n\t}\n\n\tiframes = document.body.getElementsByTagName( 'iframe' ) || [];\n\n\tfor ( var p = 0; p < iframes.length; p++ ) {\n\t\tif ( p >= 50 ) {\n\t\t\tbreak;\n\t\t}\n\n\t\tadd( '_embeds[]', iframes[ p ].src );\n\t}\n\n\tif ( document.title ) {\n\t\tadd( 't', document.title );\n\t}\n\n\tif ( selection ) {\n\t\tadd( 's', selection );\n\t}\n\n\tform.setAttribute( 'method', 'POST' );\n\tform.setAttribute( 'action', pt_url );\n\tform.setAttribute( 'target', target );\n\tform.setAttribute( 'style', 'display: none;' );\n\n\twindow.open( 'about:blank', target, 'location,resizable,scrollbars,width=' + windowWidth + ',height=' + windowHeight );\n\n\tdocument.body.appendChild( form );\n\tform.submit();\n} )( window, document, top.location.href, window.pt_url );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/color-picker.js",
    "content": "/* global wpColorPickerL10n */\n( function( $, undef ){\n\n\tvar ColorPicker,\n\t\t// html stuff\n\t\t_before = '<a tabindex=\"0\" class=\"wp-color-result\" />',\n\t\t_after = '<div class=\"wp-picker-holder\" />',\n\t\t_wrap = '<div class=\"wp-picker-container\" />',\n\t\t_button = '<input type=\"button\" class=\"button button-small hidden\" />';\n\n\t// jQuery UI Widget constructor\n\tColorPicker = {\n\t\toptions: {\n\t\t\tdefaultColor: false,\n\t\t\tchange: false,\n\t\t\tclear: false,\n\t\t\thide: true,\n\t\t\tpalettes: true,\n\t\t\twidth: 255,\n\t\t\tmode: 'hsv'\n\t\t},\n\t\t_create: function() {\n\t\t\t// bail early for unsupported Iris.\n\t\t\tif ( ! $.support.iris ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar self = this,\n\t\t\t\tel = self.element;\n\n\t\t\t$.extend( self.options, el.data() );\n\n\t\t\t// keep close bound so it can be attached to a body listener\n\t\t\tself.close = $.proxy( self.close, self );\n\n\t\t\tself.initialValue = el.val();\n\n\t\t\t// Set up HTML structure, hide things\n\t\t\tel.addClass( 'wp-color-picker' ).hide().wrap( _wrap );\n\t\t\tself.wrap = el.parent();\n\t\t\tself.toggler = $( _before ).insertBefore( el ).css( { backgroundColor: self.initialValue } ).attr( 'title', wpColorPickerL10n.pick ).attr( 'data-current', wpColorPickerL10n.current );\n\t\t\tself.pickerContainer = $( _after ).insertAfter( el );\n\t\t\tself.button = $( _button );\n\n\t\t\tif ( self.options.defaultColor ) {\n\t\t\t\tself.button.addClass( 'wp-picker-default' ).val( wpColorPickerL10n.defaultString );\n\t\t\t} else {\n\t\t\t\tself.button.addClass( 'wp-picker-clear' ).val( wpColorPickerL10n.clear );\n\t\t\t}\n\n\t\t\tel.wrap( '<span class=\"wp-picker-input-wrap\" />' ).after(self.button);\n\n\t\t\tel.iris( {\n\t\t\t\ttarget: self.pickerContainer,\n\t\t\t\thide: self.options.hide,\n\t\t\t\twidth: self.options.width,\n\t\t\t\tmode: self.options.mode,\n\t\t\t\tpalettes: self.options.palettes,\n\t\t\t\tchange: function( event, ui ) {\n\t\t\t\t\tself.toggler.css( { backgroundColor: ui.color.toString() } );\n\t\t\t\t\t// check for a custom cb\n\t\t\t\t\tif ( $.isFunction( self.options.change ) ) {\n\t\t\t\t\t\tself.options.change.call( this, event, ui );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tel.val( self.initialValue );\n\t\t\tself._addListeners();\n\t\t\tif ( ! self.options.hide ) {\n\t\t\t\tself.toggler.click();\n\t\t\t}\n\t\t},\n\t\t_addListeners: function() {\n\t\t\tvar self = this;\n\n\t\t\t// prevent any clicks inside this widget from leaking to the top and closing it\n\t\t\tself.wrap.on( 'click.wpcolorpicker', function( event ) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t});\n\n\t\t\tself.toggler.click( function(){\n\t\t\t\tif ( self.toggler.hasClass( 'wp-picker-open' ) ) {\n\t\t\t\t\tself.close();\n\t\t\t\t} else {\n\t\t\t\t\tself.open();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tself.element.change( function( event ) {\n\t\t\t\tvar me = $( this ),\n\t\t\t\t\tval = me.val();\n\t\t\t\t// Empty = clear\n\t\t\t\tif ( val === '' || val === '#' ) {\n\t\t\t\t\tself.toggler.css( 'backgroundColor', '' );\n\t\t\t\t\t// fire clear callback if we have one\n\t\t\t\t\tif ( $.isFunction( self.options.clear ) ) {\n\t\t\t\t\t\tself.options.clear.call( this, event );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// open a keyboard-focused closed picker with space or enter\n\t\t\tself.toggler.on( 'keyup', function( event ) {\n\t\t\t\tif ( event.keyCode === 13 || event.keyCode === 32 ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tself.toggler.trigger( 'click' ).next().focus();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tself.button.click( function( event ) {\n\t\t\t\tvar me = $( this );\n\t\t\t\tif ( me.hasClass( 'wp-picker-clear' ) ) {\n\t\t\t\t\tself.element.val( '' );\n\t\t\t\t\tself.toggler.css( 'backgroundColor', '' );\n\t\t\t\t\tif ( $.isFunction( self.options.clear ) ) {\n\t\t\t\t\t\tself.options.clear.call( this, event );\n\t\t\t\t\t}\n\t\t\t\t} else if ( me.hasClass( 'wp-picker-default' ) ) {\n\t\t\t\t\tself.element.val( self.options.defaultColor ).change();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\topen: function() {\n\t\t\tthis.element.show().iris( 'toggle' ).focus();\n\t\t\tthis.button.removeClass( 'hidden' );\n\t\t\tthis.wrap.addClass( 'wp-picker-active' );\n\t\t\tthis.toggler.addClass( 'wp-picker-open' );\n\t\t\t$( 'body' ).trigger( 'click.wpcolorpicker' ).on( 'click.wpcolorpicker', this.close );\n\t\t},\n\t\tclose: function() {\n\t\t\tthis.element.hide().iris( 'toggle' );\n\t\t\tthis.button.addClass( 'hidden' );\n\t\t\tthis.wrap.removeClass( 'wp-picker-active' );\n\t\t\tthis.toggler.removeClass( 'wp-picker-open' );\n\t\t\t$( 'body' ).off( 'click.wpcolorpicker', this.close );\n\t\t},\n\t\t// $(\"#input\").wpColorPicker('color') returns the current color\n\t\t// $(\"#input\").wpColorPicker('color', '#bada55') to set\n\t\tcolor: function( newColor ) {\n\t\t\tif ( newColor === undef ) {\n\t\t\t\treturn this.element.iris( 'option', 'color' );\n\t\t\t}\n\n\t\t\tthis.element.iris( 'option', 'color', newColor );\n\t\t},\n\t\t//$(\"#input\").wpColorPicker('defaultColor') returns the current default color\n\t\t//$(\"#input\").wpColorPicker('defaultColor', newDefaultColor) to set\n\t\tdefaultColor: function( newDefaultColor ) {\n\t\t\tif ( newDefaultColor === undef ) {\n\t\t\t\treturn this.options.defaultColor;\n\t\t\t}\n\n\t\t\tthis.options.defaultColor = newDefaultColor;\n\t\t}\n\t};\n\n\t$.widget( 'wp.wpColorPicker', ColorPicker );\n}( jQuery ) );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/comment.js",
    "content": "/* global postboxes, commentL10n */\njQuery(document).ready( function($) {\n\n\tpostboxes.add_postbox_toggles('comment');\n\n\tvar $timestampdiv = $('#timestampdiv'),\n\t\t$timestamp = $( '#timestamp' ),\n\t\tstamp = $timestamp.html(),\n\t\t$timestampwrap = $timestampdiv.find( '.timestamp-wrap' ),\n\t\t$edittimestamp = $timestampdiv.siblings( 'a.edit-timestamp' );\n\n\t$edittimestamp.click( function( event ) {\n\t\tif ( $timestampdiv.is( ':hidden' ) ) {\n\t\t\t$timestampdiv.slideDown( 'fast', function() {\n\t\t\t\t$( 'input, select', $timestampwrap ).first().focus();\n\t\t\t} );\n\t\t\t$(this).hide();\n\t\t}\n\t\tevent.preventDefault();\n\t});\n\n\t$timestampdiv.find('.cancel-timestamp').click( function( event ) {\n\t\t// Move focus back to the Edit link.\n\t\t$edittimestamp.show().focus();\n\t\t$timestampdiv.slideUp( 'fast' );\n\t\t$('#mm').val($('#hidden_mm').val());\n\t\t$('#jj').val($('#hidden_jj').val());\n\t\t$('#aa').val($('#hidden_aa').val());\n\t\t$('#hh').val($('#hidden_hh').val());\n\t\t$('#mn').val($('#hidden_mn').val());\n\t\t$timestamp.html( stamp );\n\t\tevent.preventDefault();\n\t});\n\n\t$timestampdiv.find('.save-timestamp').click( function( event ) { // crazyhorse - multiple ok cancels\n\t\tvar aa = $('#aa').val(), mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val(),\n\t\t\tnewD = new Date( aa, mm - 1, jj, hh, mn );\n\n\t\tevent.preventDefault();\n\n\t\tif ( newD.getFullYear() != aa || (1 + newD.getMonth()) != mm || newD.getDate() != jj || newD.getMinutes() != mn ) {\n\t\t\t$timestampwrap.addClass( 'form-invalid' );\n\t\t\treturn;\n\t\t} else {\n\t\t\t$timestampwrap.removeClass( 'form-invalid' );\n\t\t}\n\n\t\t$timestamp.html(\n\t\t\tcommentL10n.submittedOn + ' <b>' +\n\t\t\tcommentL10n.dateFormat\n\t\t\t\t.replace( '%1$s', $( 'option[value=\"' + mm + '\"]', '#mm' ).attr( 'data-text' ) )\n\t\t\t\t.replace( '%2$s', parseInt( jj, 10 ) )\n\t\t\t\t.replace( '%3$s', aa )\n\t\t\t\t.replace( '%4$s', ( '00' + hh ).slice( -2 ) )\n\t\t\t\t.replace( '%5$s', ( '00' + mn ).slice( -2 ) ) +\n\t\t\t\t'</b> '\n\t\t);\n\n\t\t// Move focus back to the Edit link.\n\t\t$edittimestamp.show().focus();\n\t\t$timestampdiv.slideUp( 'fast' );\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/common.js",
    "content": "/* global setUserSetting, ajaxurl, commonL10n, alert, confirm, pagenow */\nvar showNotice, adminMenu, columns, validateForm, screenMeta;\n( function( $, window, undefined ) {\n\tvar $document = $( document ),\n\t\t$window = $( window ),\n\t\t$body = $( document.body );\n\n// Removed in 3.3.\n// (perhaps) needed for back-compat\nadminMenu = {\n\tinit : function() {},\n\tfold : function() {},\n\trestoreMenuState : function() {},\n\ttoggle : function() {},\n\tfavorites : function() {}\n};\n\n// show/hide/save table columns\ncolumns = {\n\tinit : function() {\n\t\tvar that = this;\n\t\t$('.hide-column-tog', '#adv-settings').click( function() {\n\t\t\tvar $t = $(this), column = $t.val();\n\t\t\tif ( $t.prop('checked') )\n\t\t\t\tthat.checked(column);\n\t\t\telse\n\t\t\t\tthat.unchecked(column);\n\n\t\t\tcolumns.saveManageColumnsState();\n\t\t});\n\t},\n\n\tsaveManageColumnsState : function() {\n\t\tvar hidden = this.hidden();\n\t\t$.post(ajaxurl, {\n\t\t\taction: 'hidden-columns',\n\t\t\thidden: hidden,\n\t\t\tscreenoptionnonce: $('#screenoptionnonce').val(),\n\t\t\tpage: pagenow\n\t\t});\n\t},\n\n\tchecked : function(column) {\n\t\t$('.column-' + column).removeClass( 'hidden' );\n\t\tthis.colSpanChange(+1);\n\t},\n\n\tunchecked : function(column) {\n\t\t$('.column-' + column).addClass( 'hidden' );\n\t\tthis.colSpanChange(-1);\n\t},\n\n\thidden : function() {\n\t\treturn $( '.manage-column[id]' ).filter( ':hidden' ).map(function() {\n\t\t\treturn this.id;\n\t\t}).get().join( ',' );\n\t},\n\n\tuseCheckboxesForHidden : function() {\n\t\tthis.hidden = function(){\n\t\t\treturn $('.hide-column-tog').not(':checked').map(function() {\n\t\t\t\tvar id = this.id;\n\t\t\t\treturn id.substring( id, id.length - 5 );\n\t\t\t}).get().join(',');\n\t\t};\n\t},\n\n\tcolSpanChange : function(diff) {\n\t\tvar $t = $('table').find('.colspanchange'), n;\n\t\tif ( !$t.length )\n\t\t\treturn;\n\t\tn = parseInt( $t.attr('colspan'), 10 ) + diff;\n\t\t$t.attr('colspan', n.toString());\n\t}\n};\n\n$document.ready(function(){columns.init();});\n\nvalidateForm = function( form ) {\n\treturn !$( form )\n\t\t.find( '.form-required' )\n\t\t.filter( function() { return $( 'input:visible', this ).val() === ''; } )\n\t\t.addClass( 'form-invalid' )\n\t\t.find( 'input:visible' )\n\t\t.change( function() { $( this ).closest( '.form-invalid' ).removeClass( 'form-invalid' ); } )\n\t\t.size();\n};\n\n// stub for doing better warnings\nshowNotice = {\n\twarn : function() {\n\t\tvar msg = commonL10n.warnDelete || '';\n\t\tif ( confirm(msg) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tnote : function(text) {\n\t\talert(text);\n\t}\n};\n\nscreenMeta = {\n\telement: null, // #screen-meta\n\ttoggles: null, // .screen-meta-toggle\n\tpage:    null, // #wpcontent\n\n\tinit: function() {\n\t\tthis.element = $('#screen-meta');\n\t\tthis.toggles = $( '#screen-meta-links' ).find( '.show-settings' );\n\t\tthis.page    = $('#wpcontent');\n\n\t\tthis.toggles.click( this.toggleEvent );\n\t},\n\n\ttoggleEvent: function() {\n\t\tvar panel = $( '#' + $( this ).attr( 'aria-controls' ) );\n\n\t\tif ( !panel.length )\n\t\t\treturn;\n\n\t\tif ( panel.is(':visible') )\n\t\t\tscreenMeta.close( panel, $(this) );\n\t\telse\n\t\t\tscreenMeta.open( panel, $(this) );\n\t},\n\n\topen: function( panel, button ) {\n\n\t\t$( '#screen-meta-links' ).find( '.screen-meta-toggle' ).not( button.parent() ).css( 'visibility', 'hidden' );\n\n\t\tpanel.parent().show();\n\t\tpanel.slideDown( 'fast', function() {\n\t\t\tpanel.focus();\n\t\t\tbutton.addClass( 'screen-meta-active' ).attr( 'aria-expanded', true );\n\t\t});\n\n\t\t$document.trigger( 'screen:options:open' );\n\t},\n\n\tclose: function( panel, button ) {\n\t\tpanel.slideUp( 'fast', function() {\n\t\t\tbutton.removeClass( 'screen-meta-active' ).attr( 'aria-expanded', false );\n\t\t\t$('.screen-meta-toggle').css('visibility', '');\n\t\t\tpanel.parent().hide();\n\t\t});\n\n\t\t$document.trigger( 'screen:options:close' );\n\t}\n};\n\n/**\n * Help tabs.\n */\n$('.contextual-help-tabs').delegate('a', 'click', function(e) {\n\tvar link = $(this),\n\t\tpanel;\n\n\te.preventDefault();\n\n\t// Don't do anything if the click is for the tab already showing.\n\tif ( link.is('.active a') )\n\t\treturn false;\n\n\t// Links\n\t$('.contextual-help-tabs .active').removeClass('active');\n\tlink.parent('li').addClass('active');\n\n\tpanel = $( link.attr('href') );\n\n\t// Panels\n\t$('.help-tab-content').not( panel ).removeClass('active').hide();\n\tpanel.addClass('active').show();\n});\n\n$document.ready( function() {\n\tvar checks, first, last, checked, sliced, mobileEvent, transitionTimeout, focusedRowActions,\n\t\tlastClicked = false,\n\t\tpageInput = $('input.current-page'),\n\t\tcurrentPage = pageInput.val(),\n\t\tisIOS = /iPhone|iPad|iPod/.test( navigator.userAgent ),\n\t\tisAndroid = navigator.userAgent.indexOf( 'Android' ) !== -1,\n\t\tisIE8 = $( document.documentElement ).hasClass( 'ie8' ),\n\t\t$adminMenuWrap = $( '#adminmenuwrap' ),\n\t\t$wpwrap = $( '#wpwrap' ),\n\t\t$adminmenu = $( '#adminmenu' ),\n\t\t$overlay = $( '#wp-responsive-overlay' ),\n\t\t$toolbar = $( '#wp-toolbar' ),\n\t\t$toolbarPopups = $toolbar.find( 'a[aria-haspopup=\"true\"]' ),\n\t\t$sortables = $('.meta-box-sortables'),\n\t\twpResponsiveActive = false,\n\t\t$adminbar = $( '#wpadminbar' ),\n\t\tlastScrollPosition = 0,\n\t\tpinnedMenuTop = false,\n\t\tpinnedMenuBottom = false,\n\t\tmenuTop = 0,\n\t\tmenuIsPinned = false,\n\t\theight = {\n\t\t\twindow: $window.height(),\n\t\t\twpwrap: $wpwrap.height(),\n\t\t\tadminbar: $adminbar.height(),\n\t\t\tmenu: $adminMenuWrap.height()\n\t\t};\n\n\n\t// when the menu is folded, make the fly-out submenu header clickable\n\t$adminmenu.on('click.wp-submenu-head', '.wp-submenu-head', function(e){\n\t\t$(e.target).parent().siblings('a').get(0).click();\n\t});\n\n\t$('#collapse-menu').on('click.collapse-menu', function() {\n\t\tvar respWidth, state;\n\n\t\t// reset any compensation for submenus near the bottom of the screen\n\t\t$('#adminmenu div.wp-submenu').css('margin-top', '');\n\n\t\tif ( window.innerWidth ) {\n\t\t\t// window.innerWidth is affected by zooming on phones\n\t\t\trespWidth = Math.max( window.innerWidth, document.documentElement.clientWidth );\n\t\t} else {\n\t\t\t// IE < 9 doesn't support @media CSS rules\n\t\t\trespWidth = 961;\n\t\t}\n\n\t\tif ( respWidth && respWidth < 960 ) {\n\t\t\tif ( $body.hasClass('auto-fold') ) {\n\t\t\t\t$body.removeClass('auto-fold').removeClass('folded');\n\t\t\t\tsetUserSetting('unfold', 1);\n\t\t\t\tsetUserSetting('mfold', 'o');\n\t\t\t\tstate = 'open';\n\t\t\t} else {\n\t\t\t\t$body.addClass('auto-fold');\n\t\t\t\tsetUserSetting('unfold', 0);\n\t\t\t\tstate = 'folded';\n\t\t\t}\n\t\t} else {\n\t\t\tif ( $body.hasClass('folded') ) {\n\t\t\t\t$body.removeClass('folded');\n\t\t\t\tsetUserSetting('mfold', 'o');\n\t\t\t\tstate = 'open';\n\t\t\t} else {\n\t\t\t\t$body.addClass('folded');\n\t\t\t\tsetUserSetting('mfold', 'f');\n\t\t\t\tstate = 'folded';\n\t\t\t}\n\t\t}\n\n\t\tcurrentMenuItemHasPopup();\n\t\t$document.trigger( 'wp-collapse-menu', { state: state } );\n\t});\n\n\t// Handle the `aria-haspopup` attribute on the current menu item when it has a sub-menu.\n\tfunction currentMenuItemHasPopup() {\n\t\tvar respWidth,\n\t\t\t$current = $( 'a.wp-has-current-submenu' );\n\n\t\tif ( window.innerWidth ) {\n\t\t\trespWidth = Math.max( window.innerWidth, document.documentElement.clientWidth );\n\t\t} else {\n\t\t\trespWidth = 961;\n\t\t}\n\n\t\tif ( $body.hasClass( 'folded' ) || ( $body.hasClass( 'auto-fold' ) && respWidth && respWidth <= 960 && respWidth > 782 ) ) {\n\t\t\t// When folded or auto-folded and not responsive view, the current menu item does have a fly-out sub-menu.\n\t\t\t$current.attr( 'aria-haspopup', 'true' );\n\t\t} else {\n\t\t\t// When expanded or in responsive view, reset aria-haspopup.\n\t\t\t$current.attr( 'aria-haspopup', 'false' );\n\t\t}\n\t}\n\n\t$document.on( 'wp-window-resized wp-responsive-activate wp-responsive-deactivate', currentMenuItemHasPopup );\n\n\t/**\n\t * Ensure an admin submenu is within the visual viewport.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param {jQuery} $menuItem The parent menu item containing the submenu.\n\t */\n\tfunction adjustSubmenu( $menuItem ) {\n\t\tvar bottomOffset, pageHeight, adjustment, theFold, menutop, wintop, maxtop,\n\t\t\t$submenu = $menuItem.find( '.wp-submenu' );\n\n\t\tmenutop = $menuItem.offset().top;\n\t\twintop = $window.scrollTop();\n\t\tmaxtop = menutop - wintop - 30; // max = make the top of the sub almost touch admin bar\n\n\t\tbottomOffset = menutop + $submenu.height() + 1; // Bottom offset of the menu\n\t\tpageHeight = $wpwrap.height(); // Height of the entire page\n\t\tadjustment = 60 + bottomOffset - pageHeight;\n\t\ttheFold = $window.height() + wintop - 50; // The fold\n\n\t\tif ( theFold < ( bottomOffset - adjustment ) ) {\n\t\t\tadjustment = bottomOffset - theFold;\n\t\t}\n\n\t\tif ( adjustment > maxtop ) {\n\t\t\tadjustment = maxtop;\n\t\t}\n\n\t\tif ( adjustment > 1 ) {\n\t\t\t$submenu.css( 'margin-top', '-' + adjustment + 'px' );\n\t\t} else {\n\t\t\t$submenu.css( 'margin-top', '' );\n\t\t}\n\t}\n\n\tif ( 'ontouchstart' in window || /IEMobile\\/[1-9]/.test(navigator.userAgent) ) { // touch screen device\n\t\t// iOS Safari works with touchstart, the rest work with click\n\t\tmobileEvent = isIOS ? 'touchstart' : 'click';\n\n\t\t// close any open submenus when touch/click is not on the menu\n\t\t$body.on( mobileEvent+'.wp-mobile-hover', function(e) {\n\t\t\tif ( $adminmenu.data('wp-responsive') ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! $( e.target ).closest( '#adminmenu' ).length ) {\n\t\t\t\t$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );\n\t\t\t}\n\t\t});\n\n\t\t$adminmenu.find( 'a.wp-has-submenu' ).on( mobileEvent + '.wp-mobile-hover', function( event ) {\n\t\t\tvar $menuItem = $(this).parent();\n\n\t\t\tif ( $adminmenu.data( 'wp-responsive' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Show the sub instead of following the link if:\n\t\t\t//\t- the submenu is not open\n\t\t\t//\t- the submenu is not shown inline or the menu is not folded\n\t\t\tif ( ! $menuItem.hasClass( 'opensub' ) && ( ! $menuItem.hasClass( 'wp-menu-open' ) || $menuItem.width() < 40 ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tadjustSubmenu( $menuItem );\n\t\t\t\t$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );\n\t\t\t\t$menuItem.addClass('opensub');\n\t\t\t}\n\t\t});\n\t}\n\n\tif ( ! isIOS && ! isAndroid ) {\n\t\t$adminmenu.find( 'li.wp-has-submenu' ).hoverIntent({\n\t\t\tover: function() {\n\t\t\t\tvar $menuItem = $( this ),\n\t\t\t\t\t$submenu = $menuItem.find( '.wp-submenu' ),\n\t\t\t\t\ttop = parseInt( $submenu.css( 'top' ), 10 );\n\n\t\t\t\tif ( isNaN( top ) || top > -5 ) { // the submenu is visible\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( $adminmenu.data( 'wp-responsive' ) ) {\n\t\t\t\t\t// The menu is in responsive mode, bail\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tadjustSubmenu( $menuItem );\n\t\t\t\t$adminmenu.find( 'li.opensub' ).removeClass( 'opensub' );\n\t\t\t\t$menuItem.addClass( 'opensub' );\n\t\t\t},\n\t\t\tout: function(){\n\t\t\t\tif ( $adminmenu.data( 'wp-responsive' ) ) {\n\t\t\t\t\t// The menu is in responsive mode, bail\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$( this ).removeClass( 'opensub' ).find( '.wp-submenu' ).css( 'margin-top', '' );\n\t\t\t},\n\t\t\ttimeout: 200,\n\t\t\tsensitivity: 7,\n\t\t\tinterval: 90\n\t\t});\n\n\t\t$adminmenu.on( 'focus.adminmenu', '.wp-submenu a', function( event ) {\n\t\t\tif ( $adminmenu.data( 'wp-responsive' ) ) {\n\t\t\t\t// The menu is in responsive mode, bail\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$( event.target ).closest( 'li.menu-top' ).addClass( 'opensub' );\n\t\t}).on( 'blur.adminmenu', '.wp-submenu a', function( event ) {\n\t\t\tif ( $adminmenu.data( 'wp-responsive' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$( event.target ).closest( 'li.menu-top' ).removeClass( 'opensub' );\n\t\t}).find( 'li.wp-has-submenu.wp-not-current-submenu' ).on( 'focusin.adminmenu', function() {\n\t\t\tadjustSubmenu( $( this ) );\n\t\t});\n\t}\n\n\t/*\n\t * The `.below-h2` class is here just for backwards compatibility with plugins\n\t * that are (incorrectly) using it. Do not use. Use `.inline` instead. See #34570.\n\t */\n\t$( 'div.updated, div.error, div.notice' ).not( '.inline, .below-h2' ).insertAfter( $( '.wrap h1, .wrap h2' ).first() );\n\n\t// Make notices dismissible\n\tfunction makeNoticesDismissible() {\n\t\t$( '.notice.is-dismissible' ).each( function() {\n\t\t\tvar $el = $( this ),\n\t\t\t\t$button = $( '<button type=\"button\" class=\"notice-dismiss\"><span class=\"screen-reader-text\"></span></button>' ),\n\t\t\t\tbtnText = commonL10n.dismiss || '';\n\n\t\t\t// Ensure plain text\n\t\t\t$button.find( '.screen-reader-text' ).text( btnText );\n\t\t\t$button.on( 'click.wp-dismiss-notice', function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t$el.fadeTo( 100, 0, function() {\n\t\t\t\t\t$el.slideUp( 100, function() {\n\t\t\t\t\t\t$el.remove();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t$el.append( $button );\n\t\t});\n\t}\n\n\t$document.on( 'wp-plugin-update-error', function() {\n\t\tmakeNoticesDismissible();\n\t});\n\n\t// Init screen meta\n\tscreenMeta.init();\n\n\t// check all checkboxes\n\t$('tbody').children().children('.check-column').find(':checkbox').click( function(e) {\n\t\tif ( 'undefined' == e.shiftKey ) { return true; }\n\t\tif ( e.shiftKey ) {\n\t\t\tif ( !lastClicked ) { return true; }\n\t\t\tchecks = $( lastClicked ).closest( 'form' ).find( ':checkbox' ).filter( ':visible:enabled' );\n\t\t\tfirst = checks.index( lastClicked );\n\t\t\tlast = checks.index( this );\n\t\t\tchecked = $(this).prop('checked');\n\t\t\tif ( 0 < first && 0 < last && first != last ) {\n\t\t\t\tsliced = ( last > first ) ? checks.slice( first, last ) : checks.slice( last, first );\n\t\t\t\tsliced.prop( 'checked', function() {\n\t\t\t\t\tif ( $(this).closest('tr').is(':visible') )\n\t\t\t\t\t\treturn checked;\n\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tlastClicked = this;\n\n\t\t// toggle \"check all\" checkboxes\n\t\tvar unchecked = $(this).closest('tbody').find(':checkbox').filter(':visible:enabled').not(':checked');\n\t\t$(this).closest('table').children('thead, tfoot').find(':checkbox').prop('checked', function() {\n\t\t\treturn ( 0 === unchecked.length );\n\t\t});\n\n\t\treturn true;\n\t});\n\n\t$('thead, tfoot').find('.check-column :checkbox').on( 'click.wp-toggle-checkboxes', function( event ) {\n\t\tvar $this = $(this),\n\t\t\t$table = $this.closest( 'table' ),\n\t\t\tcontrolChecked = $this.prop('checked'),\n\t\t\ttoggle = event.shiftKey || $this.data('wp-toggle');\n\n\t\t$table.children( 'tbody' ).filter(':visible')\n\t\t\t.children().children('.check-column').find(':checkbox')\n\t\t\t.prop('checked', function() {\n\t\t\t\tif ( $(this).is(':hidden,:disabled') ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( toggle ) {\n\t\t\t\t\treturn ! $(this).prop( 'checked' );\n\t\t\t\t} else if ( controlChecked ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t$table.children('thead,  tfoot').filter(':visible')\n\t\t\t.children().children('.check-column').find(':checkbox')\n\t\t\t.prop('checked', function() {\n\t\t\t\tif ( toggle ) {\n\t\t\t\t\treturn false;\n\t\t\t\t} else if ( controlChecked ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t});\n\t});\n\n\t// Show row actions on keyboard focus of its parent container element or any other elements contained within\n\t$( '#wpbody-content' ).on({\n\t\tfocusin: function() {\n\t\t\tclearTimeout( transitionTimeout );\n\t\t\tfocusedRowActions = $( this ).find( '.row-actions' );\n\t\t\t// transitionTimeout is necessary for Firefox, but Chrome won't remove the CSS class without a little help.\n\t\t\t$( '.row-actions' ).not( this ).removeClass( 'visible' );\n\t\t\tfocusedRowActions.addClass( 'visible' );\n\t\t},\n\t\tfocusout: function() {\n\t\t\t// Tabbing between post title and .row-actions links needs a brief pause, otherwise\n\t\t\t// the .row-actions div gets hidden in transit in some browsers (ahem, Firefox).\n\t\t\ttransitionTimeout = setTimeout( function() {\n\t\t\t\tfocusedRowActions.removeClass( 'visible' );\n\t\t\t}, 30 );\n\t\t}\n\t}, '.has-row-actions' );\n\n\t// Toggle list table rows on small screens\n\t$( 'tbody' ).on( 'click', '.toggle-row', function() {\n\t\t$( this ).closest( 'tr' ).toggleClass( 'is-expanded' );\n\t});\n\n\t$('#default-password-nag-no').click( function() {\n\t\tsetUserSetting('default_password_nag', 'hide');\n\t\t$('div.default-password-nag').hide();\n\t\treturn false;\n\t});\n\n\t// tab in textareas\n\t$('#newcontent').bind('keydown.wpevent_InsertTab', function(e) {\n\t\tvar el = e.target, selStart, selEnd, val, scroll, sel;\n\n\t\tif ( e.keyCode == 27 ) { // escape key\n\t\t\t// when pressing Escape: Opera 12 and 27 blur form fields, IE 8 clears them\n\t\t\te.preventDefault();\n\t\t\t$(el).data('tab-out', true);\n\t\t\treturn;\n\t\t}\n\n\t\tif ( e.keyCode != 9 || e.ctrlKey || e.altKey || e.shiftKey ) // tab key\n\t\t\treturn;\n\n\t\tif ( $(el).data('tab-out') ) {\n\t\t\t$(el).data('tab-out', false);\n\t\t\treturn;\n\t\t}\n\n\t\tselStart = el.selectionStart;\n\t\tselEnd = el.selectionEnd;\n\t\tval = el.value;\n\n\t\tif ( document.selection ) {\n\t\t\tel.focus();\n\t\t\tsel = document.selection.createRange();\n\t\t\tsel.text = '\\t';\n\t\t} else if ( selStart >= 0 ) {\n\t\t\tscroll = this.scrollTop;\n\t\t\tel.value = val.substring(0, selStart).concat('\\t', val.substring(selEnd) );\n\t\t\tel.selectionStart = el.selectionEnd = selStart + 1;\n\t\t\tthis.scrollTop = scroll;\n\t\t}\n\n\t\tif ( e.stopPropagation )\n\t\t\te.stopPropagation();\n\t\tif ( e.preventDefault )\n\t\t\te.preventDefault();\n\t});\n\n\tif ( pageInput.length ) {\n\t\tpageInput.closest('form').submit( function() {\n\n\t\t\t// Reset paging var for new filters/searches but not for bulk actions. See #17685.\n\t\t\tif ( $('select[name=\"action\"]').val() == -1 && $('select[name=\"action2\"]').val() == -1 && pageInput.val() == currentPage )\n\t\t\t\tpageInput.val('1');\n\t\t});\n\t}\n\n\t$('.search-box input[type=\"search\"], .search-box input[type=\"submit\"]').mousedown(function () {\n\t\t$('select[name^=\"action\"]').val('-1');\n\t});\n\n\t// Scroll into view when focused\n\t$('#contextual-help-link, #show-settings-link').on( 'focus.scroll-into-view', function(e){\n\t\tif ( e.target.scrollIntoView )\n\t\t\te.target.scrollIntoView(false);\n\t});\n\n\t// Disable upload buttons until files are selected\n\t(function(){\n\t\tvar button, input, form = $('form.wp-upload-form');\n\t\tif ( ! form.length )\n\t\t\treturn;\n\t\tbutton = form.find('input[type=\"submit\"]');\n\t\tinput = form.find('input[type=\"file\"]');\n\n\t\tfunction toggleUploadButton() {\n\t\t\tbutton.prop('disabled', '' === input.map( function() {\n\t\t\t\treturn $(this).val();\n\t\t\t}).get().join(''));\n\t\t}\n\t\ttoggleUploadButton();\n\t\tinput.on('change', toggleUploadButton);\n\t})();\n\n\tfunction pinMenu( event ) {\n\t\tvar windowPos = $window.scrollTop(),\n\t\t\tresizing = ! event || event.type !== 'scroll';\n\n\t\tif ( isIOS || isIE8 || $adminmenu.data( 'wp-responsive' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( height.menu + height.adminbar < height.window ||\n\t\t\theight.menu + height.adminbar + 20 > height.wpwrap ) {\n\t\t\tunpinMenu();\n\t\t\treturn;\n\t\t}\n\n\t\tmenuIsPinned = true;\n\n\t\tif ( height.menu + height.adminbar > height.window ) {\n\t\t\t// Check for overscrolling\n\t\t\tif ( windowPos < 0 ) {\n\t\t\t\tif ( ! pinnedMenuTop ) {\n\t\t\t\t\tpinnedMenuTop = true;\n\t\t\t\t\tpinnedMenuBottom = false;\n\n\t\t\t\t\t$adminMenuWrap.css({\n\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\ttop: '',\n\t\t\t\t\t\tbottom: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t} else if ( windowPos + height.window > $document.height() - 1 ) {\n\t\t\t\tif ( ! pinnedMenuBottom ) {\n\t\t\t\t\tpinnedMenuBottom = true;\n\t\t\t\t\tpinnedMenuTop = false;\n\n\t\t\t\t\t$adminMenuWrap.css({\n\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\ttop: '',\n\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( windowPos > lastScrollPosition ) {\n\t\t\t\t// Scrolling down\n\t\t\t\tif ( pinnedMenuTop ) {\n\t\t\t\t\t// let it scroll\n\t\t\t\t\tpinnedMenuTop = false;\n\t\t\t\t\tmenuTop = $adminMenuWrap.offset().top - height.adminbar - ( windowPos - lastScrollPosition );\n\n\t\t\t\t\tif ( menuTop + height.menu + height.adminbar < windowPos + height.window ) {\n\t\t\t\t\t\tmenuTop = windowPos + height.window - height.menu - height.adminbar;\n\t\t\t\t\t}\n\n\t\t\t\t\t$adminMenuWrap.css({\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: menuTop,\n\t\t\t\t\t\tbottom: ''\n\t\t\t\t\t});\n\t\t\t\t} else if ( ! pinnedMenuBottom && $adminMenuWrap.offset().top + height.menu < windowPos + height.window ) {\n\t\t\t\t\t// pin the bottom\n\t\t\t\t\tpinnedMenuBottom = true;\n\n\t\t\t\t\t$adminMenuWrap.css({\n\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\ttop: '',\n\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if ( windowPos < lastScrollPosition ) {\n\t\t\t\t// Scrolling up\n\t\t\t\tif ( pinnedMenuBottom ) {\n\t\t\t\t\t// let it scroll\n\t\t\t\t\tpinnedMenuBottom = false;\n\t\t\t\t\tmenuTop = $adminMenuWrap.offset().top - height.adminbar + ( lastScrollPosition - windowPos );\n\n\t\t\t\t\tif ( menuTop + height.menu > windowPos + height.window ) {\n\t\t\t\t\t\tmenuTop = windowPos;\n\t\t\t\t\t}\n\n\t\t\t\t\t$adminMenuWrap.css({\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: menuTop,\n\t\t\t\t\t\tbottom: ''\n\t\t\t\t\t});\n\t\t\t\t} else if ( ! pinnedMenuTop && $adminMenuWrap.offset().top >= windowPos + height.adminbar ) {\n\t\t\t\t\t// pin the top\n\t\t\t\t\tpinnedMenuTop = true;\n\n\t\t\t\t\t$adminMenuWrap.css({\n\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\ttop: '',\n\t\t\t\t\t\tbottom: ''\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if ( resizing ) {\n\t\t\t\t// Resizing\n\t\t\t\tpinnedMenuTop = pinnedMenuBottom = false;\n\t\t\t\tmenuTop = windowPos + height.window - height.menu - height.adminbar - 1;\n\n\t\t\t\tif ( menuTop > 0 ) {\n\t\t\t\t\t$adminMenuWrap.css({\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: menuTop,\n\t\t\t\t\t\tbottom: ''\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tunpinMenu();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlastScrollPosition = windowPos;\n\t}\n\n\tfunction resetHeights() {\n\t\theight = {\n\t\t\twindow: $window.height(),\n\t\t\twpwrap: $wpwrap.height(),\n\t\t\tadminbar: $adminbar.height(),\n\t\t\tmenu: $adminMenuWrap.height()\n\t\t};\n\t}\n\n\tfunction unpinMenu() {\n\t\tif ( isIOS || ! menuIsPinned ) {\n\t\t\treturn;\n\t\t}\n\n\t\tpinnedMenuTop = pinnedMenuBottom = menuIsPinned = false;\n\t\t$adminMenuWrap.css({\n\t\t\tposition: '',\n\t\t\ttop: '',\n\t\t\tbottom: ''\n\t\t});\n\t}\n\n\tfunction setPinMenu() {\n\t\tresetHeights();\n\n\t\tif ( $adminmenu.data('wp-responsive') ) {\n\t\t\t$body.removeClass( 'sticky-menu' );\n\t\t\tunpinMenu();\n\t\t} else if ( height.menu + height.adminbar > height.window ) {\n\t\t\tpinMenu();\n\t\t\t$body.removeClass( 'sticky-menu' );\n\t\t} else {\n\t\t\t$body.addClass( 'sticky-menu' );\n\t\t\tunpinMenu();\n\t\t}\n\t}\n\n\tif ( ! isIOS ) {\n\t\t$window.on( 'scroll.pin-menu', pinMenu );\n\t\t$document.on( 'tinymce-editor-init.pin-menu', function( event, editor ) {\n\t\t\teditor.on( 'wp-autoresize', resetHeights );\n\t\t});\n\t}\n\n\twindow.wpResponsive = {\n\t\tinit: function() {\n\t\t\tvar self = this;\n\n\t\t\t// Modify functionality based on custom activate/deactivate event\n\t\t\t$document.on( 'wp-responsive-activate.wp-responsive', function() {\n\t\t\t\tself.activate();\n\t\t\t}).on( 'wp-responsive-deactivate.wp-responsive', function() {\n\t\t\t\tself.deactivate();\n\t\t\t});\n\n\t\t\t$( '#wp-admin-bar-menu-toggle a' ).attr( 'aria-expanded', 'false' );\n\n\t\t\t// Toggle sidebar when toggle is clicked\n\t\t\t$( '#wp-admin-bar-menu-toggle' ).on( 'click.wp-responsive', function( event ) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// close any open toolbar submenus\n\t\t\t\t$adminbar.find( '.hover' ).removeClass( 'hover' );\n\n\t\t\t\t$wpwrap.toggleClass( 'wp-responsive-open' );\n\t\t\t\tif ( $wpwrap.hasClass( 'wp-responsive-open' ) ) {\n\t\t\t\t\t$(this).find('a').attr( 'aria-expanded', 'true' );\n\t\t\t\t\t$( '#adminmenu a:first' ).focus();\n\t\t\t\t} else {\n\t\t\t\t\t$(this).find('a').attr( 'aria-expanded', 'false' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Add menu events\n\t\t\t$adminmenu.on( 'click.wp-responsive', 'li.wp-has-submenu > a', function( event ) {\n\t\t\t\tif ( ! $adminmenu.data('wp-responsive') ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$( this ).parent( 'li' ).toggleClass( 'selected' );\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\n\t\t\tself.trigger();\n\t\t\t$document.on( 'wp-window-resized.wp-responsive', $.proxy( this.trigger, this ) );\n\n\t\t\t// This needs to run later as UI Sortable may be initialized later on $(document).ready()\n\t\t\t$window.on( 'load.wp-responsive', function() {\n\t\t\t\tvar width = navigator.userAgent.indexOf('AppleWebKit/') > -1 ? $window.width() : window.innerWidth;\n\n\t\t\t\tif ( width <= 782 ) {\n\t\t\t\t\tself.disableSortables();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tactivate: function() {\n\t\t\tsetPinMenu();\n\n\t\t\tif ( ! $body.hasClass( 'auto-fold' ) ) {\n\t\t\t\t$body.addClass( 'auto-fold' );\n\t\t\t}\n\n\t\t\t$adminmenu.data( 'wp-responsive', 1 );\n\t\t\tthis.disableSortables();\n\t\t},\n\n\t\tdeactivate: function() {\n\t\t\tsetPinMenu();\n\t\t\t$adminmenu.removeData('wp-responsive');\n\t\t\tthis.enableSortables();\n\t\t},\n\n\t\ttrigger: function() {\n\t\t\tvar width;\n\n\t\t\tif ( window.innerWidth ) {\n\t\t\t\t// window.innerWidth is affected by zooming on phones\n\t\t\t\twidth = Math.max( window.innerWidth, document.documentElement.clientWidth );\n\t\t\t} else {\n\t\t\t\t// Exclude IE < 9, it doesn't support @media CSS rules\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( width <= 782 ) {\n\t\t\t\tif ( ! wpResponsiveActive ) {\n\t\t\t\t\t$document.trigger( 'wp-responsive-activate' );\n\t\t\t\t\twpResponsiveActive = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( wpResponsiveActive ) {\n\t\t\t\t\t$document.trigger( 'wp-responsive-deactivate' );\n\t\t\t\t\twpResponsiveActive = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( width <= 480 ) {\n\t\t\t\tthis.enableOverlay();\n\t\t\t} else {\n\t\t\t\tthis.disableOverlay();\n\t\t\t}\n\t\t},\n\n\t\tenableOverlay: function() {\n\t\t\tif ( $overlay.length === 0 ) {\n\t\t\t\t$overlay = $( '<div id=\"wp-responsive-overlay\"></div>' )\n\t\t\t\t\t.insertAfter( '#wpcontent' )\n\t\t\t\t\t.hide()\n\t\t\t\t\t.on( 'click.wp-responsive', function() {\n\t\t\t\t\t\t$toolbar.find( '.menupop.hover' ).removeClass( 'hover' );\n\t\t\t\t\t\t$( this ).hide();\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\t$toolbarPopups.on( 'click.wp-responsive', function() {\n\t\t\t\t$overlay.show();\n\t\t\t});\n\t\t},\n\n\t\tdisableOverlay: function() {\n\t\t\t$toolbarPopups.off( 'click.wp-responsive' );\n\t\t\t$overlay.hide();\n\t\t},\n\n\t\tdisableSortables: function() {\n\t\t\tif ( $sortables.length ) {\n\t\t\t\ttry {\n\t\t\t\t\t$sortables.sortable('disable');\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\t\t},\n\n\t\tenableSortables: function() {\n\t\t\tif ( $sortables.length ) {\n\t\t\t\ttry {\n\t\t\t\t\t$sortables.sortable('enable');\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\t\t}\n\t};\n\n\twindow.wpResponsive.init();\n\tsetPinMenu();\n\tcurrentMenuItemHasPopup();\n\tmakeNoticesDismissible();\n\n\t$document.on( 'wp-pin-menu wp-window-resized.pin-menu postboxes-columnchange.pin-menu postbox-toggled.pin-menu wp-collapse-menu.pin-menu wp-scroll-start.pin-menu', setPinMenu );\n});\n\n// Fire a custom jQuery event at the end of window resize\n( function() {\n\tvar timeout;\n\n\tfunction triggerEvent() {\n\t\t$document.trigger( 'wp-window-resized' );\n\t}\n\n\tfunction fireOnce() {\n\t\twindow.clearTimeout( timeout );\n\t\ttimeout = window.setTimeout( triggerEvent, 200 );\n\t}\n\n\t$window.on( 'resize.wp-fire-once', fireOnce );\n}());\n\n// Make Windows 8 devices play along nicely.\n(function(){\n\tif ( '-ms-user-select' in document.documentElement.style && navigator.userAgent.match(/IEMobile\\/10\\.0/) ) {\n\t\tvar msViewportStyle = document.createElement( 'style' );\n\t\tmsViewportStyle.appendChild(\n\t\t\tdocument.createTextNode( '@-ms-viewport{width:auto!important}' )\n\t\t);\n\t\tdocument.getElementsByTagName( 'head' )[0].appendChild( msViewportStyle );\n\t}\n})();\n\n}( jQuery, window ));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/custom-background.js",
    "content": "/* global ajaxurl */\n(function($) {\n\t$(document).ready(function() {\n\t\tvar frame,\n\t\t\tbgImage = $( '#custom-background-image' );\n\n\t\t$('#background-color').wpColorPicker({\n\t\t\tchange: function( event, ui ) {\n\t\t\t\tbgImage.css('background-color', ui.color.toString());\n\t\t\t},\n\t\t\tclear: function() {\n\t\t\t\tbgImage.css('background-color', '');\n\t\t\t}\n\t\t});\n\n\t\t$('input[name=\"background-position-x\"]').change(function() {\n\t\t\tbgImage.css('background-position', $(this).val() + ' top');\n\t\t});\n\n\t\t$('input[name=\"background-repeat\"]').change(function() {\n\t\t\tbgImage.css('background-repeat', $(this).val());\n\t\t});\n\n\t\t$('#choose-from-library-link').click( function( event ) {\n\t\t\tvar $el = $(this);\n\n\t\t\tevent.preventDefault();\n\n\t\t\t// If the media frame already exists, reopen it.\n\t\t\tif ( frame ) {\n\t\t\t\tframe.open();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create the media frame.\n\t\t\tframe = wp.media.frames.customBackground = wp.media({\n\t\t\t\t// Set the title of the modal.\n\t\t\t\ttitle: $el.data('choose'),\n\n\t\t\t\t// Tell the modal to show only images.\n\t\t\t\tlibrary: {\n\t\t\t\t\ttype: 'image'\n\t\t\t\t},\n\n\t\t\t\t// Customize the submit button.\n\t\t\t\tbutton: {\n\t\t\t\t\t// Set the text of the button.\n\t\t\t\t\ttext: $el.data('update'),\n\t\t\t\t\t// Tell the button not to close the modal, since we're\n\t\t\t\t\t// going to refresh the page when the image is selected.\n\t\t\t\t\tclose: false\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// When an image is selected, run a callback.\n\t\t\tframe.on( 'select', function() {\n\t\t\t\t// Grab the selected attachment.\n\t\t\t\tvar attachment = frame.state().get('selection').first();\n\n\t\t\t\t// Run an AJAX request to set the background image.\n\t\t\t\t$.post( ajaxurl, {\n\t\t\t\t\taction: 'set-background-image',\n\t\t\t\t\tattachment_id: attachment.id,\n\t\t\t\t\tsize: 'full'\n\t\t\t\t}).done( function() {\n\t\t\t\t\t// When the request completes, reload the window.\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Finally, open the modal.\n\t\t\tframe.open();\n\t\t});\n\t});\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/custom-header.js",
    "content": "/* global isRtl */\n(function($) {\n\tvar frame;\n\n\t$( function() {\n\t\t// Fetch available headers and apply jQuery.masonry\n\t\t// once the images have loaded.\n\t\tvar $headers = $('.available-headers');\n\n\t\t$headers.imagesLoaded( function() {\n\t\t\t$headers.masonry({\n\t\t\t\titemSelector: '.default-header',\n\t\t\t\tisRTL: !! ( 'undefined' != typeof isRtl && isRtl )\n\t\t\t});\n\t\t});\n\n\t\t// Build the choose from library frame.\n\t\t$('#choose-from-library-link').click( function( event ) {\n\t\t\tvar $el = $(this);\n\t\t\tevent.preventDefault();\n\n\t\t\t// If the media frame already exists, reopen it.\n\t\t\tif ( frame ) {\n\t\t\t\tframe.open();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Create the media frame.\n\t\t\tframe = wp.media.frames.customHeader = wp.media({\n\t\t\t\t// Set the title of the modal.\n\t\t\t\ttitle: $el.data('choose'),\n\n\t\t\t\t// Tell the modal to show only images.\n\t\t\t\tlibrary: {\n\t\t\t\t\ttype: 'image'\n\t\t\t\t},\n\n\t\t\t\t// Customize the submit button.\n\t\t\t\tbutton: {\n\t\t\t\t\t// Set the text of the button.\n\t\t\t\t\ttext: $el.data('update'),\n\t\t\t\t\t// Tell the button not to close the modal, since we're\n\t\t\t\t\t// going to refresh the page when the image is selected.\n\t\t\t\t\tclose: false\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// When an image is selected, run a callback.\n\t\t\tframe.on( 'select', function() {\n\t\t\t\t// Grab the selected attachment.\n\t\t\t\tvar attachment = frame.state().get('selection').first(),\n\t\t\t\t\tlink = $el.data('updateLink');\n\n\t\t\t\t// Tell the browser to navigate to the crop step.\n\t\t\t\twindow.location = link + '&file=' + attachment.id;\n\t\t\t});\n\n\t\t\tframe.open();\n\t\t});\n\t});\n}(jQuery));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/customize-controls.js",
    "content": "/* global _wpCustomizeHeader, _wpCustomizeBackground, _wpMediaViewsL10n, MediaElementPlayer */\n(function( exports, $ ){\n\tvar Container, focus, api = wp.customize;\n\n\t/**\n\t * A Customizer Setting.\n\t *\n\t * A setting is WordPress data (theme mod, option, menu, etc.) that the user can\n\t * draft changes to in the Customizer.\n\t *\n\t * @see PHP class WP_Customize_Setting.\n\t *\n\t * @class\n\t * @augments wp.customize.Value\n\t * @augments wp.customize.Class\n\t *\n\t * @param {object} id                The Setting ID.\n\t * @param {object} value             The initial value of the setting.\n\t * @param {object} options.previewer The Previewer instance to sync with.\n\t * @param {object} options.transport The transport to use for previewing. Supports 'refresh' and 'postMessage'.\n\t * @param {object} options.dirty\n\t */\n\tapi.Setting = api.Value.extend({\n\t\tinitialize: function( id, value, options ) {\n\t\t\tapi.Value.prototype.initialize.call( this, value, options );\n\n\t\t\tthis.id = id;\n\t\t\tthis.transport = this.transport || 'refresh';\n\t\t\tthis._dirty = options.dirty || false;\n\n\t\t\t// Whenever the setting's value changes, refresh the preview.\n\t\t\tthis.bind( this.preview );\n\t\t},\n\n\t\t/**\n\t\t * Refresh the preview, respective of the setting's refresh policy.\n\t\t */\n\t\tpreview: function() {\n\t\t\tswitch ( this.transport ) {\n\t\t\t\tcase 'refresh':\n\t\t\t\t\treturn this.previewer.refresh();\n\t\t\t\tcase 'postMessage':\n\t\t\t\t\treturn this.previewer.send( 'setting', [ this.id, this() ] );\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * Utility function namespace\n\t */\n\tapi.utils = {};\n\n\t/**\n\t * Watch all changes to Value properties, and bubble changes to parent Values instance\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param {wp.customize.Class} instance\n\t * @param {Array}              properties  The names of the Value instances to watch.\n\t */\n\tapi.utils.bubbleChildValueChanges = function ( instance, properties ) {\n\t\t$.each( properties, function ( i, key ) {\n\t\t\tinstance[ key ].bind( function ( to, from ) {\n\t\t\t\tif ( instance.parent && to !== from ) {\n\t\t\t\t\tinstance.parent.trigger( 'change', instance );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t};\n\n\t/**\n\t * Expand a panel, section, or control and focus on the first focusable element.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param {Object}   [params]\n\t * @param {Callback} [params.completeCallback]\n\t */\n\tfocus = function ( params ) {\n\t\tvar construct, completeCallback, focus;\n\t\tconstruct = this;\n\t\tparams = params || {};\n\t\tfocus = function () {\n\t\t\tvar focusContainer;\n\t\t\tif ( construct.extended( api.Panel ) && construct.expanded && construct.expanded() ) {\n\t\t\t\tfocusContainer = construct.container.find( 'ul.control-panel-content' );\n\t\t\t} else if ( construct.extended( api.Section ) && construct.expanded && construct.expanded() ) {\n\t\t\t\tfocusContainer = construct.container.find( 'ul.accordion-section-content' );\n\t\t\t} else {\n\t\t\t\tfocusContainer = construct.container;\n\t\t\t}\n\n\t\t\t// Note that we can't use :focusable due to a jQuery UI issue. See: https://github.com/jquery/jquery-ui/pull/1583\n\t\t\tfocusContainer.find( 'input, select, textarea, button, object, a[href], [tabindex]' ).filter( ':visible' ).first().focus();\n\t\t};\n\t\tif ( params.completeCallback ) {\n\t\t\tcompleteCallback = params.completeCallback;\n\t\t\tparams.completeCallback = function () {\n\t\t\t\tfocus();\n\t\t\t\tcompleteCallback();\n\t\t\t};\n\t\t} else {\n\t\t\tparams.completeCallback = focus;\n\t\t}\n\t\tif ( construct.expand ) {\n\t\t\tconstruct.expand( params );\n\t\t} else {\n\t\t\tparams.completeCallback();\n\t\t}\n\t};\n\n\t/**\n\t * Stable sort for Panels, Sections, and Controls.\n\t *\n\t * If a.priority() === b.priority(), then sort by their respective params.instanceNumber.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param {(wp.customize.Panel|wp.customize.Section|wp.customize.Control)} a\n\t * @param {(wp.customize.Panel|wp.customize.Section|wp.customize.Control)} b\n\t * @returns {Number}\n\t */\n\tapi.utils.prioritySort = function ( a, b ) {\n\t\tif ( a.priority() === b.priority() && typeof a.params.instanceNumber === 'number' && typeof b.params.instanceNumber === 'number' ) {\n\t\t\treturn a.params.instanceNumber - b.params.instanceNumber;\n\t\t} else {\n\t\t\treturn a.priority() - b.priority();\n\t\t}\n\t};\n\n\t/**\n\t * Return whether the supplied Event object is for a keydown event but not the Enter key.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param {jQuery.Event} event\n\t * @returns {boolean}\n\t */\n\tapi.utils.isKeydownButNotEnterEvent = function ( event ) {\n\t\treturn ( 'keydown' === event.type && 13 !== event.which );\n\t};\n\n\t/**\n\t * Return whether the two lists of elements are the same and are in the same order.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param {Array|jQuery} listA\n\t * @param {Array|jQuery} listB\n\t * @returns {boolean}\n\t */\n\tapi.utils.areElementListsEqual = function ( listA, listB ) {\n\t\tvar equal = (\n\t\t\tlistA.length === listB.length && // if lists are different lengths, then naturally they are not equal\n\t\t\t-1 === _.indexOf( _.map( // are there any false values in the list returned by map?\n\t\t\t\t_.zip( listA, listB ), // pair up each element between the two lists\n\t\t\t\tfunction ( pair ) {\n\t\t\t\t\treturn $( pair[0] ).is( pair[1] ); // compare to see if each pair are equal\n\t\t\t\t}\n\t\t\t), false ) // check for presence of false in map's return value\n\t\t);\n\t\treturn equal;\n\t};\n\n\t/**\n\t * Base class for Panel and Section.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @class\n\t * @augments wp.customize.Class\n\t */\n\tContainer = api.Class.extend({\n\t\tdefaultActiveArguments: { duration: 'fast', completeCallback: $.noop },\n\t\tdefaultExpandedArguments: { duration: 'fast', completeCallback: $.noop },\n\t\tcontainerType: 'container',\n\t\tdefaults: {\n\t\t\ttitle: '',\n\t\t\tdescription: '',\n\t\t\tpriority: 100,\n\t\t\ttype: 'default',\n\t\t\tcontent: null,\n\t\t\tactive: true,\n\t\t\tinstanceNumber: null\n\t\t},\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {string}         id - The ID for the container.\n\t\t * @param {object}         options - Object containing one property: params.\n\t\t * @param {object}         options.params - Object containing the following properties.\n\t\t * @param {string}         options.params.title - Title shown when panel is collapsed and expanded.\n\t\t * @param {string=}        [options.params.description] - Description shown at the top of the panel.\n\t\t * @param {number=100}     [options.params.priority] - The sort priority for the panel.\n\t\t * @param {string=default} [options.params.type] - The type of the panel. See wp.customize.panelConstructor.\n\t\t * @param {string=}        [options.params.content] - The markup to be used for the panel container. If empty, a JS template is used.\n\t\t * @param {boolean=true}   [options.params.active] - Whether the panel is active or not.\n\t\t */\n\t\tinitialize: function ( id, options ) {\n\t\t\tvar container = this;\n\t\t\tcontainer.id = id;\n\t\t\toptions = options || {};\n\n\t\t\toptions.params = _.defaults(\n\t\t\t\toptions.params || {},\n\t\t\t\tcontainer.defaults\n\t\t\t);\n\n\t\t\t$.extend( container, options );\n\t\t\tcontainer.templateSelector = 'customize-' + container.containerType + '-' + container.params.type;\n\t\t\tcontainer.container = $( container.params.content );\n\t\t\tif ( 0 === container.container.length ) {\n\t\t\t\tcontainer.container = $( container.getContainer() );\n\t\t\t}\n\n\t\t\tcontainer.deferred = {\n\t\t\t\tembedded: new $.Deferred()\n\t\t\t};\n\t\t\tcontainer.priority = new api.Value();\n\t\t\tcontainer.active = new api.Value();\n\t\t\tcontainer.activeArgumentsQueue = [];\n\t\t\tcontainer.expanded = new api.Value();\n\t\t\tcontainer.expandedArgumentsQueue = [];\n\n\t\t\tcontainer.active.bind( function ( active ) {\n\t\t\t\tvar args = container.activeArgumentsQueue.shift();\n\t\t\t\targs = $.extend( {}, container.defaultActiveArguments, args );\n\t\t\t\tactive = ( active && container.isContextuallyActive() );\n\t\t\t\tcontainer.onChangeActive( active, args );\n\t\t\t});\n\t\t\tcontainer.expanded.bind( function ( expanded ) {\n\t\t\t\tvar args = container.expandedArgumentsQueue.shift();\n\t\t\t\targs = $.extend( {}, container.defaultExpandedArguments, args );\n\t\t\t\tcontainer.onChangeExpanded( expanded, args );\n\t\t\t});\n\n\t\t\tcontainer.deferred.embedded.done( function () {\n\t\t\t\tcontainer.attachEvents();\n\t\t\t});\n\n\t\t\tapi.utils.bubbleChildValueChanges( container, [ 'priority', 'active' ] );\n\n\t\t\tcontainer.priority.set( container.params.priority );\n\t\t\tcontainer.active.set( container.params.active );\n\t\t\tcontainer.expanded.set( false );\n\t\t},\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @abstract\n\t\t */\n\t\tready: function() {},\n\n\t\t/**\n\t\t * Get the child models associated with this parent, sorting them by their priority Value.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {String} parentType\n\t\t * @param {String} childType\n\t\t * @returns {Array}\n\t\t */\n\t\t_children: function ( parentType, childType ) {\n\t\t\tvar parent = this,\n\t\t\t\tchildren = [];\n\t\t\tapi[ childType ].each( function ( child ) {\n\t\t\t\tif ( child[ parentType ].get() === parent.id ) {\n\t\t\t\t\tchildren.push( child );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tchildren.sort( api.utils.prioritySort );\n\t\t\treturn children;\n\t\t},\n\n\t\t/**\n\t\t * To override by subclass, to return whether the container has active children.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @abstract\n\t\t */\n\t\tisContextuallyActive: function () {\n\t\t\tthrow new Error( 'Container.isContextuallyActive() must be overridden in a subclass.' );\n\t\t},\n\n\t\t/**\n\t\t * Active state change handler.\n\t\t *\n\t\t * Shows the container if it is active, hides it if not.\n\t\t *\n\t\t * To override by subclass, update the container's UI to reflect the provided active state.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Boolean} active\n\t\t * @param {Object}  args\n\t\t * @param {Object}  args.duration\n\t\t * @param {Object}  args.completeCallback\n\t\t */\n\t\tonChangeActive: function( active, args ) {\n\t\t\tvar duration, construct = this, expandedOtherPanel;\n\t\t\tif ( args.unchanged ) {\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\targs.completeCallback();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tduration = ( 'resolved' === api.previewer.deferred.active.state() ? args.duration : 0 );\n\n\t\t\tif ( construct.extended( api.Panel ) ) {\n\t\t\t\t// If this is a panel is not currently expanded but another panel is expanded, do not animate.\n\t\t\t\tapi.panel.each(function ( panel ) {\n\t\t\t\t\tif ( panel !== construct && panel.expanded() ) {\n\t\t\t\t\t\texpandedOtherPanel = panel;\n\t\t\t\t\t\tduration = 0;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Collapse any expanded sections inside of this panel first before deactivating.\n\t\t\t\tif ( ! active ) {\n\t\t\t\t\t_.each( construct.sections(), function( section ) {\n\t\t\t\t\t\tsection.collapse( { duration: 0 } );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! $.contains( document, construct.container[0] ) ) {\n\t\t\t\t// jQuery.fn.slideUp is not hiding an element if it is not in the DOM\n\t\t\t\tconstruct.container.toggle( active );\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\targs.completeCallback();\n\t\t\t\t}\n\t\t\t} else if ( active ) {\n\t\t\t\tconstruct.container.stop( true, true ).slideDown( duration, args.completeCallback );\n\t\t\t} else {\n\t\t\t\tif ( construct.expanded() ) {\n\t\t\t\t\tconstruct.collapse({\n\t\t\t\t\t\tduration: duration,\n\t\t\t\t\t\tcompleteCallback: function() {\n\t\t\t\t\t\t\tconstruct.container.stop( true, true ).slideUp( duration, args.completeCallback );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconstruct.container.stop( true, true ).slideUp( duration, args.completeCallback );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Recalculate the margin-top immediately, not waiting for debounced reflow, to prevent momentary (100ms) vertical jiggle.\n\t\t\tif ( expandedOtherPanel ) {\n\t\t\t\texpandedOtherPanel._recalculateTopMargin();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @params {Boolean} active\n\t\t * @param {Object}   [params]\n\t\t * @returns {Boolean} false if state already applied\n\t\t */\n\t\t_toggleActive: function ( active, params ) {\n\t\t\tvar self = this;\n\t\t\tparams = params || {};\n\t\t\tif ( ( active && this.active.get() ) || ( ! active && ! this.active.get() ) ) {\n\t\t\t\tparams.unchanged = true;\n\t\t\t\tself.onChangeActive( self.active.get(), params );\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\tparams.unchanged = false;\n\t\t\t\tthis.activeArgumentsQueue.push( params );\n\t\t\t\tthis.active.set( active );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if already active\n\t\t */\n\t\tactivate: function ( params ) {\n\t\t\treturn this._toggleActive( true, params );\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if already inactive\n\t\t */\n\t\tdeactivate: function ( params ) {\n\t\t\treturn this._toggleActive( false, params );\n\t\t},\n\n\t\t/**\n\t\t * To override by subclass, update the container's UI to reflect the provided active state.\n\t\t * @abstract\n\t\t */\n\t\tonChangeExpanded: function () {\n\t\t\tthrow new Error( 'Must override with subclass.' );\n\t\t},\n\n\t\t/**\n\t\t * Handle the toggle logic for expand/collapse.\n\t\t *\n\t\t * @param {Boolean}  expanded - The new state to apply.\n\t\t * @param {Object}   [params] - Object containing options for expand/collapse.\n\t\t * @param {Function} [params.completeCallback] - Function to call when expansion/collapse is complete.\n\t\t * @returns {Boolean} false if state already applied or active state is false\n\t\t */\n\t\t_toggleExpanded: function( expanded, params ) {\n\t\t\tvar instance = this, previousCompleteCallback;\n\t\t\tparams = params || {};\n\t\t\tpreviousCompleteCallback = params.completeCallback;\n\n\t\t\t// Short-circuit expand() if the instance is not active.\n\t\t\tif ( expanded && ! instance.active() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tparams.completeCallback = function() {\n\t\t\t\tif ( previousCompleteCallback ) {\n\t\t\t\t\tpreviousCompleteCallback.apply( instance, arguments );\n\t\t\t\t}\n\t\t\t\tif ( expanded ) {\n\t\t\t\t\tinstance.container.trigger( 'expanded' );\n\t\t\t\t} else {\n\t\t\t\t\tinstance.container.trigger( 'collapsed' );\n\t\t\t\t}\n\t\t\t};\n\t\t\tif ( ( expanded && instance.expanded.get() ) || ( ! expanded && ! instance.expanded.get() ) ) {\n\t\t\t\tparams.unchanged = true;\n\t\t\t\tinstance.onChangeExpanded( instance.expanded.get(), params );\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\tparams.unchanged = false;\n\t\t\t\tinstance.expandedArgumentsQueue.push( params );\n\t\t\t\tinstance.expanded.set( expanded );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if already expanded or if inactive.\n\t\t */\n\t\texpand: function ( params ) {\n\t\t\treturn this._toggleExpanded( true, params );\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if already collapsed.\n\t\t */\n\t\tcollapse: function ( params ) {\n\t\t\treturn this._toggleExpanded( false, params );\n\t\t},\n\n\t\t/**\n\t\t * Bring the container into view and then expand this and bring it into view\n\t\t * @param {Object} [params]\n\t\t */\n\t\tfocus: focus,\n\n\t\t/**\n\t\t * Return the container html, generated from its JS template, if it exists.\n\t\t *\n\t\t * @since 4.3.0\n\t\t */\n\t\tgetContainer: function () {\n\t\t\tvar template,\n\t\t\t\tcontainer = this;\n\n\t\t\tif ( 0 !== $( '#tmpl-' + container.templateSelector ).length ) {\n\t\t\t\ttemplate = wp.template( container.templateSelector );\n\t\t\t} else {\n\t\t\t\ttemplate = wp.template( 'customize-' + container.containerType + '-default' );\n\t\t\t}\n\t\t\tif ( template && container.container ) {\n\t\t\t\treturn $.trim( template( container.params ) );\n\t\t\t}\n\n\t\t\treturn '<li></li>';\n\t\t}\n\t});\n\n\t/**\n\t * @since 4.1.0\n\t *\n\t * @class\n\t * @augments wp.customize.Class\n\t */\n\tapi.Section = Container.extend({\n\t\tcontainerType: 'section',\n\t\tdefaults: {\n\t\t\ttitle: '',\n\t\t\tdescription: '',\n\t\t\tpriority: 100,\n\t\t\ttype: 'default',\n\t\t\tcontent: null,\n\t\t\tactive: true,\n\t\t\tinstanceNumber: null,\n\t\t\tpanel: null,\n\t\t\tcustomizeAction: ''\n\t\t},\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {string}         id - The ID for the section.\n\t\t * @param {object}         options - Object containing one property: params.\n\t\t * @param {object}         options.params - Object containing the following properties.\n\t\t * @param {string}         options.params.title - Title shown when section is collapsed and expanded.\n\t\t * @param {string=}        [options.params.description] - Description shown at the top of the section.\n\t\t * @param {number=100}     [options.params.priority] - The sort priority for the section.\n\t\t * @param {string=default} [options.params.type] - The type of the section. See wp.customize.sectionConstructor.\n\t\t * @param {string=}        [options.params.content] - The markup to be used for the section container. If empty, a JS template is used.\n\t\t * @param {boolean=true}   [options.params.active] - Whether the section is active or not.\n\t\t * @param {string}         options.params.panel - The ID for the panel this section is associated with.\n\t\t * @param {string=}        [options.params.customizeAction] - Additional context information shown before the section title when expanded.\n\t\t */\n\t\tinitialize: function ( id, options ) {\n\t\t\tvar section = this;\n\t\t\tContainer.prototype.initialize.call( section, id, options );\n\n\t\t\tsection.id = id;\n\t\t\tsection.panel = new api.Value();\n\t\t\tsection.panel.bind( function ( id ) {\n\t\t\t\t$( section.container ).toggleClass( 'control-subsection', !! id );\n\t\t\t});\n\t\t\tsection.panel.set( section.params.panel || '' );\n\t\t\tapi.utils.bubbleChildValueChanges( section, [ 'panel' ] );\n\n\t\t\tsection.embed();\n\t\t\tsection.deferred.embedded.done( function () {\n\t\t\t\tsection.ready();\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Embed the container in the DOM when any parent panel is ready.\n\t\t *\n\t\t * @since 4.1.0\n\t\t */\n\t\tembed: function () {\n\t\t\tvar section = this, inject;\n\n\t\t\t// Watch for changes to the panel state\n\t\t\tinject = function ( panelId ) {\n\t\t\t\tvar parentContainer;\n\t\t\t\tif ( panelId ) {\n\t\t\t\t\t// The panel has been supplied, so wait until the panel object is registered\n\t\t\t\t\tapi.panel( panelId, function ( panel ) {\n\t\t\t\t\t\t// The panel has been registered, wait for it to become ready/initialized\n\t\t\t\t\t\tpanel.deferred.embedded.done( function () {\n\t\t\t\t\t\t\tparentContainer = panel.container.find( 'ul:first' );\n\t\t\t\t\t\t\tif ( ! section.container.parent().is( parentContainer ) ) {\n\t\t\t\t\t\t\t\tparentContainer.append( section.container );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsection.deferred.embedded.resolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\t// There is no panel, so embed the section in the root of the customizer\n\t\t\t\t\tparentContainer = $( '#customize-theme-controls' ).children( 'ul' ); // @todo This should be defined elsewhere, and to be configurable\n\t\t\t\t\tif ( ! section.container.parent().is( parentContainer ) ) {\n\t\t\t\t\t\tparentContainer.append( section.container );\n\t\t\t\t\t}\n\t\t\t\t\tsection.deferred.embedded.resolve();\n\t\t\t\t}\n\t\t\t};\n\t\t\tsection.panel.bind( inject );\n\t\t\tinject( section.panel.get() ); // Since a section may never get a panel, assume that it won't ever get one\n\n\t\t\tsection.deferred.embedded.done(function() {\n\t\t\t\t// Fix the top margin after reflow.\n\t\t\t\tapi.bind( 'pane-contents-reflowed', _.debounce( function() {\n\t\t\t\t\tsection._recalculateTopMargin();\n\t\t\t\t}, 100 ) );\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Add behaviors for the accordion section.\n\t\t *\n\t\t * @since 4.1.0\n\t\t */\n\t\tattachEvents: function () {\n\t\t\tvar section = this;\n\n\t\t\t// Expand/Collapse accordion sections on click.\n\t\t\tsection.container.find( '.accordion-section-title, .customize-section-back' ).on( 'click keydown', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tif ( section.expanded() ) {\n\t\t\t\t\tsection.collapse();\n\t\t\t\t} else {\n\t\t\t\t\tsection.expand();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Return whether this section has any active controls.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @returns {Boolean}\n\t\t */\n\t\tisContextuallyActive: function () {\n\t\t\tvar section = this,\n\t\t\t\tcontrols = section.controls(),\n\t\t\t\tactiveCount = 0;\n\t\t\t_( controls ).each( function ( control ) {\n\t\t\t\tif ( control.active() ) {\n\t\t\t\t\tactiveCount += 1;\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn ( activeCount !== 0 );\n\t\t},\n\n\t\t/**\n\t\t * Get the controls that are associated with this section, sorted by their priority Value.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @returns {Array}\n\t\t */\n\t\tcontrols: function () {\n\t\t\treturn this._children( 'section', 'control' );\n\t\t},\n\n\t\t/**\n\t\t * Update UI to reflect expanded state.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Boolean} expanded\n\t\t * @param {Object}  args\n\t\t */\n\t\tonChangeExpanded: function ( expanded, args ) {\n\t\t\tvar section = this,\n\t\t\t\tcontainer = section.container.closest( '.wp-full-overlay-sidebar-content' ),\n\t\t\t\tcontent = section.container.find( '.accordion-section-content' ),\n\t\t\t\toverlay = section.container.closest( '.wp-full-overlay' ),\n\t\t\t\tbackBtn = section.container.find( '.customize-section-back' ),\n\t\t\t\tsectionTitle = section.container.find( '.accordion-section-title' ).first(),\n\t\t\t\theaderActionsHeight = $( '#customize-header-actions' ).height(),\n\t\t\t\tresizeContentHeight, expand, position, scroll;\n\n\t\t\tif ( expanded && ! section.container.hasClass( 'open' ) ) {\n\n\t\t\t\tif ( args.unchanged ) {\n\t\t\t\t\texpand = args.completeCallback;\n\t\t\t\t} else {\n\t\t\t\t\tcontainer.scrollTop( 0 );\n\t\t\t\t\tresizeContentHeight = function() {\n\t\t\t\t\t\tvar matchMedia, offset;\n\t\t\t\t\t\tmatchMedia = window.matchMedia || window.msMatchMedia;\n\t\t\t\t\t\toffset = 90; // 45px for customize header actions + 45px for footer actions.\n\n\t\t\t\t\t\t// No footer on small screens.\n\t\t\t\t\t\tif ( matchMedia && matchMedia( '(max-width: 640px)' ).matches ) {\n\t\t\t\t\t\t\toffset = 45;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontent.css( 'height', ( window.innerHeight - offset ) );\n\t\t\t\t\t};\n\t\t\t\t\texpand = function() {\n\t\t\t\t\t\tsection.container.addClass( 'open' );\n\t\t\t\t\t\toverlay.addClass( 'section-open' );\n\t\t\t\t\t\tposition = content.offset().top;\n\t\t\t\t\t\tscroll = container.scrollTop();\n\t\t\t\t\t\tcontent.css( 'margin-top', ( headerActionsHeight - position - scroll ) );\n\t\t\t\t\t\tresizeContentHeight();\n\t\t\t\t\t\tsectionTitle.attr( 'tabindex', '-1' );\n\t\t\t\t\t\tbackBtn.attr( 'tabindex', '0' );\n\t\t\t\t\t\tbackBtn.focus();\n\t\t\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\t\t\targs.completeCallback();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Fix the height after browser resize.\n\t\t\t\t\t\t$( window ).on( 'resize.customizer-section', _.debounce( resizeContentHeight, 100 ) );\n\n\t\t\t\t\t\tsection._recalculateTopMargin();\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif ( ! args.allowMultiple ) {\n\t\t\t\t\tapi.section.each( function ( otherSection ) {\n\t\t\t\t\t\tif ( otherSection !== section ) {\n\t\t\t\t\t\t\totherSection.collapse( { duration: args.duration } );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ( section.panel() ) {\n\t\t\t\t\tapi.panel( section.panel() ).expand({\n\t\t\t\t\t\tduration: args.duration,\n\t\t\t\t\t\tcompleteCallback: expand\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tapi.panel.each( function( panel ) {\n\t\t\t\t\t\tpanel.collapse();\n\t\t\t\t\t});\n\t\t\t\t\texpand();\n\t\t\t\t}\n\n\t\t\t} else if ( ! expanded && section.container.hasClass( 'open' ) ) {\n\t\t\t\tsection.container.removeClass( 'open' );\n\t\t\t\toverlay.removeClass( 'section-open' );\n\t\t\t\tcontent.css( 'margin-top', '' );\n\t\t\t\tcontainer.scrollTop( 0 );\n\t\t\t\tbackBtn.attr( 'tabindex', '-1' );\n\t\t\t\tsectionTitle.attr( 'tabindex', '0' );\n\t\t\t\tsectionTitle.focus();\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\targs.completeCallback();\n\t\t\t\t}\n\t\t\t\t$( window ).off( 'resize.customizer-section' );\n\t\t\t} else {\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\targs.completeCallback();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Recalculate the top margin.\n\t\t *\n\t\t * @since 4.4.0\n\t\t * @private\n\t\t */\n\t\t_recalculateTopMargin: function() {\n\t\t\tvar section = this, content, offset, headerActionsHeight;\n\t\t\tcontent = section.container.find( '.accordion-section-content' );\n\t\t\tif ( 0 === content.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\theaderActionsHeight = $( '#customize-header-actions' ).height();\n\t\t\toffset = ( content.offset().top - headerActionsHeight );\n\t\t\tif ( 0 < offset ) {\n\t\t\t\tcontent.css( 'margin-top', ( parseInt( content.css( 'margin-top' ), 10 ) - offset ) );\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * wp.customize.ThemesSection\n\t *\n\t * Custom section for themes that functions similarly to a backwards panel,\n\t * and also handles the theme-details view rendering and navigation.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Section\n\t * @augments wp.customize.Container\n\t */\n\tapi.ThemesSection = api.Section.extend({\n\t\tcurrentTheme: '',\n\t\toverlay: '',\n\t\ttemplate: '',\n\t\tscreenshotQueue: null,\n\t\t$window: $( window ),\n\n\t\t/**\n\t\t * @since 4.2.0\n\t\t */\n\t\tinitialize: function () {\n\t\t\tthis.$customizeSidebar = $( '.wp-full-overlay-sidebar-content:first' );\n\t\t\treturn api.Section.prototype.initialize.apply( this, arguments );\n\t\t},\n\n\t\t/**\n\t\t * @since 4.2.0\n\t\t */\n\t\tready: function () {\n\t\t\tvar section = this;\n\t\t\tsection.overlay = section.container.find( '.theme-overlay' );\n\t\t\tsection.template = wp.template( 'customize-themes-details-view' );\n\n\t\t\t// Bind global keyboard events.\n\t\t\t$( 'body' ).on( 'keyup', function( event ) {\n\t\t\t\tif ( ! section.overlay.find( '.theme-wrap' ).is( ':visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Pressing the right arrow key fires a theme:next event\n\t\t\t\tif ( 39 === event.keyCode ) {\n\t\t\t\t\tsection.nextTheme();\n\t\t\t\t}\n\n\t\t\t\t// Pressing the left arrow key fires a theme:previous event\n\t\t\t\tif ( 37 === event.keyCode ) {\n\t\t\t\t\tsection.previousTheme();\n\t\t\t\t}\n\n\t\t\t\t// Pressing the escape key fires a theme:collapse event\n\t\t\t\tif ( 27 === event.keyCode ) {\n\t\t\t\t\tsection.closeDetails();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_.bindAll( this, 'renderScreenshots' );\n\t\t},\n\n\t\t/**\n\t\t * Override Section.isContextuallyActive method.\n\t\t *\n\t\t * Ignore the active states' of the contained theme controls, and just\n\t\t * use the section's own active state instead. This ensures empty search\n\t\t * results for themes to cause the section to become inactive.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @returns {Boolean}\n\t\t */\n\t\tisContextuallyActive: function () {\n\t\t\treturn this.active();\n\t\t},\n\n\t\t/**\n\t\t * @since 4.2.0\n\t\t */\n\t\tattachEvents: function () {\n\t\t\tvar section = this;\n\n\t\t\t// Expand/Collapse section/panel.\n\t\t\tsection.container.find( '.change-theme, .customize-theme' ).on( 'click keydown', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tif ( section.expanded() ) {\n\t\t\t\t\tsection.collapse();\n\t\t\t\t} else {\n\t\t\t\t\tsection.expand();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Theme navigation in details view.\n\t\t\tsection.container.on( 'click keydown', '.left', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tsection.previousTheme();\n\t\t\t});\n\n\t\t\tsection.container.on( 'click keydown', '.right', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tsection.nextTheme();\n\t\t\t});\n\n\t\t\tsection.container.on( 'click keydown', '.theme-backdrop, .close', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tsection.closeDetails();\n\t\t\t});\n\n\t\t\tvar renderScreenshots = _.throttle( _.bind( section.renderScreenshots, this ), 100 );\n\t\t\tsection.container.on( 'input', '#themes-filter', function( event ) {\n\t\t\t\tvar count,\n\t\t\t\t\tterm = event.currentTarget.value.toLowerCase().trim().replace( '-', ' ' ),\n\t\t\t\t\tcontrols = section.controls();\n\n\t\t\t\t_.each( controls, function( control ) {\n\t\t\t\t\tcontrol.filter( term );\n\t\t\t\t});\n\n\t\t\t\trenderScreenshots();\n\n\t\t\t\t// Update theme count.\n\t\t\t\tcount = section.container.find( 'li.customize-control:visible' ).length;\n\t\t\t\tsection.container.find( '.theme-count' ).text( count );\n\t\t\t});\n\n\t\t\t// Pre-load the first 3 theme screenshots.\n\t\t\tapi.bind( 'ready', function () {\n\t\t\t\t_.each( section.controls().slice( 0, 3 ), function ( control ) {\n\t\t\t\t\tvar img, src = control.params.theme.screenshot[0];\n\t\t\t\t\tif ( src ) {\n\t\t\t\t\t\timg = new Image();\n\t\t\t\t\t\timg.src = src;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Update UI to reflect expanded state\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param {Boolean}  expanded\n\t\t * @param {Object}   args\n\t\t * @param {Boolean}  args.unchanged\n\t\t * @param {Callback} args.completeCallback\n\t\t */\n\t\tonChangeExpanded: function ( expanded, args ) {\n\n\t\t\t// Immediately call the complete callback if there were no changes\n\t\t\tif ( args.unchanged ) {\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\targs.completeCallback();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Note: there is a second argument 'args' passed\n\t\t\tvar position, scroll,\n\t\t\t\tpanel = this,\n\t\t\t\tsection = panel.container.closest( '.accordion-section' ),\n\t\t\t\toverlay = section.closest( '.wp-full-overlay' ),\n\t\t\t\tcontainer = section.closest( '.wp-full-overlay-sidebar-content' ),\n\t\t\t\tsiblings = container.find( '.open' ),\n\t\t\t\tcustomizeBtn = section.find( '.customize-theme' ),\n\t\t\t\tchangeBtn = section.find( '.change-theme' ),\n\t\t\t\tcontent = section.find( '.control-panel-content' );\n\n\t\t\tif ( expanded ) {\n\n\t\t\t\t// Collapse any sibling sections/panels\n\t\t\t\tapi.section.each( function ( otherSection ) {\n\t\t\t\t\tif ( otherSection !== panel ) {\n\t\t\t\t\t\totherSection.collapse( { duration: args.duration } );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tapi.panel.each( function ( otherPanel ) {\n\t\t\t\t\totherPanel.collapse( { duration: 0 } );\n\t\t\t\t});\n\n\t\t\t\tcontent.show( 0, function() {\n\t\t\t\t\tposition = content.offset().top;\n\t\t\t\t\tscroll = container.scrollTop();\n\t\t\t\t\tcontent.css( 'margin-top', ( $( '#customize-header-actions' ).height() - position - scroll ) );\n\t\t\t\t\tsection.addClass( 'current-panel' );\n\t\t\t\t\toverlay.addClass( 'in-themes-panel' );\n\t\t\t\t\tcontainer.scrollTop( 0 );\n\t\t\t\t\t_.delay( panel.renderScreenshots, 10 ); // Wait for the controls\n\t\t\t\t\tpanel.$customizeSidebar.on( 'scroll.customize-themes-section', _.throttle( panel.renderScreenshots, 300 ) );\n\t\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\t\targs.completeCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tcustomizeBtn.focus();\n\t\t\t} else {\n\t\t\t\tsiblings.removeClass( 'open' );\n\t\t\t\tsection.removeClass( 'current-panel' );\n\t\t\t\toverlay.removeClass( 'in-themes-panel' );\n\t\t\t\tpanel.$customizeSidebar.off( 'scroll.customize-themes-section' );\n\t\t\t\tcontent.delay( 180 ).hide( 0, function() {\n\t\t\t\t\tcontent.css( 'margin-top', 'inherit' ); // Reset\n\t\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\t\targs.completeCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tcustomizeBtn.attr( 'tabindex', '0' );\n\t\t\t\tchangeBtn.focus();\n\t\t\t\tcontainer.scrollTop( 0 );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Recalculate the top margin.\n\t\t *\n\t\t * @since 4.4.0\n\t\t * @private\n\t\t */\n\t\t_recalculateTopMargin: function() {\n\t\t\tapi.Panel.prototype._recalculateTopMargin.call( this );\n\t\t},\n\n\t\t/**\n\t\t * Render control's screenshot if the control comes into view.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\trenderScreenshots: function( ) {\n\t\t\tvar section = this;\n\n\t\t\t// Fill queue initially.\n\t\t\tif ( section.screenshotQueue === null ) {\n\t\t\t\tsection.screenshotQueue = section.controls();\n\t\t\t}\n\n\t\t\t// Are all screenshots rendered?\n\t\t\tif ( ! section.screenshotQueue.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsection.screenshotQueue = _.filter( section.screenshotQueue, function( control ) {\n\t\t\t\tvar $imageWrapper = control.container.find( '.theme-screenshot' ),\n\t\t\t\t\t$image = $imageWrapper.find( 'img' );\n\n\t\t\t\tif ( ! $image.length ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( $image.is( ':hidden' ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Based on unveil.js.\n\t\t\t\tvar wt = section.$window.scrollTop(),\n\t\t\t\t\twb = wt + section.$window.height(),\n\t\t\t\t\tet = $image.offset().top,\n\t\t\t\t\tih = $imageWrapper.height(),\n\t\t\t\t\teb = et + ih,\n\t\t\t\t\tthreshold = ih * 3,\n\t\t\t\t\tinView = eb >= wt - threshold && et <= wb + threshold;\n\n\t\t\t\tif ( inView ) {\n\t\t\t\t\tcontrol.container.trigger( 'render-screenshot' );\n\t\t\t\t}\n\n\t\t\t\t// If the image is in view return false so it's cleared from the queue.\n\t\t\t\treturn ! inView;\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Advance the modal to the next theme.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tnextTheme: function () {\n\t\t\tvar section = this;\n\t\t\tif ( section.getNextTheme() ) {\n\t\t\t\tsection.showDetails( section.getNextTheme(), function() {\n\t\t\t\t\tsection.overlay.find( '.right' ).focus();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get the next theme model.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tgetNextTheme: function () {\n\t\t\tvar control, next;\n\t\t\tcontrol = api.control( 'theme_' + this.currentTheme );\n\t\t\tnext = control.container.next( 'li.customize-control-theme' );\n\t\t\tif ( ! next.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tnext = next[0].id.replace( 'customize-control-', '' );\n\t\t\tcontrol = api.control( next );\n\n\t\t\treturn control.params.theme;\n\t\t},\n\n\t\t/**\n\t\t * Advance the modal to the previous theme.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tpreviousTheme: function () {\n\t\t\tvar section = this;\n\t\t\tif ( section.getPreviousTheme() ) {\n\t\t\t\tsection.showDetails( section.getPreviousTheme(), function() {\n\t\t\t\t\tsection.overlay.find( '.left' ).focus();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get the previous theme model.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tgetPreviousTheme: function () {\n\t\t\tvar control, previous;\n\t\t\tcontrol = api.control( 'theme_' + this.currentTheme );\n\t\t\tprevious = control.container.prev( 'li.customize-control-theme' );\n\t\t\tif ( ! previous.length ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tprevious = previous[0].id.replace( 'customize-control-', '' );\n\t\t\tcontrol = api.control( previous );\n\n\t\t\treturn control.params.theme;\n\t\t},\n\n\t\t/**\n\t\t * Disable buttons when we're viewing the first or last theme.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tupdateLimits: function () {\n\t\t\tif ( ! this.getNextTheme() ) {\n\t\t\t\tthis.overlay.find( '.right' ).addClass( 'disabled' );\n\t\t\t}\n\t\t\tif ( ! this.getPreviousTheme() ) {\n\t\t\t\tthis.overlay.find( '.left' ).addClass( 'disabled' );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Render & show the theme details for a given theme model.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param {Object}   theme\n\t\t */\n\t\tshowDetails: function ( theme, callback ) {\n\t\t\tvar section = this;\n\t\t\tcallback = callback || function(){};\n\t\t\tsection.currentTheme = theme.id;\n\t\t\tsection.overlay.html( section.template( theme ) )\n\t\t\t\t.fadeIn( 'fast' )\n\t\t\t\t.focus();\n\t\t\t$( 'body' ).addClass( 'modal-open' );\n\t\t\tsection.containFocus( section.overlay );\n\t\t\tsection.updateLimits();\n\t\t\tcallback();\n\t\t},\n\n\t\t/**\n\t\t * Close the theme details modal.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tcloseDetails: function () {\n\t\t\t$( 'body' ).removeClass( 'modal-open' );\n\t\t\tthis.overlay.fadeOut( 'fast' );\n\t\t\tapi.control( 'theme_' + this.currentTheme ).focus();\n\t\t},\n\n\t\t/**\n\t\t * Keep tab focus within the theme details modal.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tcontainFocus: function( el ) {\n\t\t\tvar tabbables;\n\n\t\t\tel.on( 'keydown', function( event ) {\n\n\t\t\t\t// Return if it's not the tab key\n\t\t\t\t// When navigating with prev/next focus is already handled\n\t\t\t\tif ( 9 !== event.keyCode ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// uses jQuery UI to get the tabbable elements\n\t\t\t\ttabbables = $( ':tabbable', el );\n\n\t\t\t\t// Keep focus within the overlay\n\t\t\t\tif ( tabbables.last()[0] === event.target && ! event.shiftKey ) {\n\t\t\t\t\ttabbables.first().focus();\n\t\t\t\t\treturn false;\n\t\t\t\t} else if ( tabbables.first()[0] === event.target && event.shiftKey ) {\n\t\t\t\t\ttabbables.last().focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * @since 4.1.0\n\t *\n\t * @class\n\t * @augments wp.customize.Class\n\t */\n\tapi.Panel = Container.extend({\n\t\tcontainerType: 'panel',\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {string}         id - The ID for the panel.\n\t\t * @param {object}         options - Object containing one property: params.\n\t\t * @param {object}         options.params - Object containing the following properties.\n\t\t * @param {string}         options.params.title - Title shown when panel is collapsed and expanded.\n\t\t * @param {string=}        [options.params.description] - Description shown at the top of the panel.\n\t\t * @param {number=100}     [options.params.priority] - The sort priority for the panel.\n\t\t * @param {string=default} [options.params.type] - The type of the panel. See wp.customize.panelConstructor.\n\t\t * @param {string=}        [options.params.content] - The markup to be used for the panel container. If empty, a JS template is used.\n\t\t * @param {boolean=true}   [options.params.active] - Whether the panel is active or not.\n\t\t */\n\t\tinitialize: function ( id, options ) {\n\t\t\tvar panel = this;\n\t\t\tContainer.prototype.initialize.call( panel, id, options );\n\t\t\tpanel.embed();\n\t\t\tpanel.deferred.embedded.done( function () {\n\t\t\t\tpanel.ready();\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Embed the container in the DOM when any parent panel is ready.\n\t\t *\n\t\t * @since 4.1.0\n\t\t */\n\t\tembed: function () {\n\t\t\tvar panel = this,\n\t\t\t\tparentContainer = $( '#customize-theme-controls > ul' ); // @todo This should be defined elsewhere, and to be configurable\n\n\t\t\tif ( ! panel.container.parent().is( parentContainer ) ) {\n\t\t\t\tparentContainer.append( panel.container );\n\t\t\t\tpanel.renderContent();\n\t\t\t}\n\n\t\t\tapi.bind( 'pane-contents-reflowed', _.debounce( function() {\n\t\t\t\tpanel._recalculateTopMargin();\n\t\t\t}, 100 ) );\n\n\t\t\tpanel.deferred.embedded.resolve();\n\t\t},\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t */\n\t\tattachEvents: function () {\n\t\t\tvar meta, panel = this;\n\n\t\t\t// Expand/Collapse accordion sections on click.\n\t\t\tpanel.container.find( '.accordion-section-title' ).on( 'click keydown', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tif ( ! panel.expanded() ) {\n\t\t\t\t\tpanel.expand();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Close panel.\n\t\t\tpanel.container.find( '.customize-panel-back' ).on( 'click keydown', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tif ( panel.expanded() ) {\n\t\t\t\t\tpanel.collapse();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmeta = panel.container.find( '.panel-meta:first' );\n\n\t\t\tmeta.find( '> .accordion-section-title .customize-help-toggle' ).on( 'click keydown', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tmeta = panel.container.find( '.panel-meta' );\n\t\t\t\tif ( meta.hasClass( 'cannot-expand' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar content = meta.find( '.customize-panel-description:first' );\n\t\t\t\tif ( meta.hasClass( 'open' ) ) {\n\t\t\t\t\tmeta.toggleClass( 'open' );\n\t\t\t\t\tcontent.slideUp( panel.defaultExpandedArguments.duration );\n\t\t\t\t\t$( this ).attr( 'aria-expanded', false );\n\t\t\t\t} else {\n\t\t\t\t\tcontent.slideDown( panel.defaultExpandedArguments.duration );\n\t\t\t\t\tmeta.toggleClass( 'open' );\n\t\t\t\t\t$( this ).attr( 'aria-expanded', true );\n\t\t\t\t}\n\t\t\t});\n\n\t\t},\n\n\t\t/**\n\t\t * Get the sections that are associated with this panel, sorted by their priority Value.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @returns {Array}\n\t\t */\n\t\tsections: function () {\n\t\t\treturn this._children( 'panel', 'section' );\n\t\t},\n\n\t\t/**\n\t\t * Return whether this panel has any active sections.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n\t\tisContextuallyActive: function () {\n\t\t\tvar panel = this,\n\t\t\t\tsections = panel.sections(),\n\t\t\t\tactiveCount = 0;\n\t\t\t_( sections ).each( function ( section ) {\n\t\t\t\tif ( section.active() && section.isContextuallyActive() ) {\n\t\t\t\t\tactiveCount += 1;\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn ( activeCount !== 0 );\n\t\t},\n\n\t\t/**\n\t\t * Update UI to reflect expanded state\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Boolean}  expanded\n\t\t * @param {Object}   args\n\t\t * @param {Boolean}  args.unchanged\n\t\t * @param {Function} args.completeCallback\n\t\t */\n\t\tonChangeExpanded: function ( expanded, args ) {\n\n\t\t\t// Immediately call the complete callback if there were no changes\n\t\t\tif ( args.unchanged ) {\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\targs.completeCallback();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Note: there is a second argument 'args' passed\n\t\t\tvar position, scroll,\n\t\t\t\tpanel = this,\n\t\t\t\taccordionSection = panel.container.closest( '.accordion-section' ),\n\t\t\t\toverlay = accordionSection.closest( '.wp-full-overlay' ),\n\t\t\t\tcontainer = accordionSection.closest( '.wp-full-overlay-sidebar-content' ),\n\t\t\t\tsiblings = container.find( '.open' ),\n\t\t\t\ttopPanel = overlay.find( '#customize-theme-controls > ul > .accordion-section > .accordion-section-title' ),\n\t\t\t\tbackBtn = accordionSection.find( '.customize-panel-back' ),\n\t\t\t\tpanelTitle = accordionSection.find( '.accordion-section-title' ).first(),\n\t\t\t\tcontent = accordionSection.find( '.control-panel-content' ),\n\t\t\t\theaderActionsHeight = $( '#customize-header-actions' ).height();\n\n\t\t\tif ( expanded ) {\n\n\t\t\t\t// Collapse any sibling sections/panels\n\t\t\t\tapi.section.each( function ( section ) {\n\t\t\t\t\tif ( panel.id !== section.panel() ) {\n\t\t\t\t\t\tsection.collapse( { duration: 0 } );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tapi.panel.each( function ( otherPanel ) {\n\t\t\t\t\tif ( panel !== otherPanel ) {\n\t\t\t\t\t\totherPanel.collapse( { duration: 0 } );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tcontent.show( 0, function() {\n\t\t\t\t\tcontent.parent().show();\n\t\t\t\t\tposition = content.offset().top;\n\t\t\t\t\tscroll = container.scrollTop();\n\t\t\t\t\tcontent.css( 'margin-top', ( headerActionsHeight - position - scroll ) );\n\t\t\t\t\taccordionSection.addClass( 'current-panel' );\n\t\t\t\t\toverlay.addClass( 'in-sub-panel' );\n\t\t\t\t\tcontainer.scrollTop( 0 );\n\t\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\t\targs.completeCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\ttopPanel.attr( 'tabindex', '-1' );\n\t\t\t\tbackBtn.attr( 'tabindex', '0' );\n\t\t\t\tbackBtn.focus();\n\t\t\t\tpanel._recalculateTopMargin();\n\t\t\t} else {\n\t\t\t\tsiblings.removeClass( 'open' );\n\t\t\t\taccordionSection.removeClass( 'current-panel' );\n\t\t\t\toverlay.removeClass( 'in-sub-panel' );\n\t\t\t\tcontent.delay( 180 ).hide( 0, function() {\n\t\t\t\t\tcontent.css( 'margin-top', 'inherit' ); // Reset\n\t\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\t\targs.completeCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\ttopPanel.attr( 'tabindex', '0' );\n\t\t\t\tbackBtn.attr( 'tabindex', '-1' );\n\t\t\t\tpanelTitle.focus();\n\t\t\t\tcontainer.scrollTop( 0 );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Recalculate the top margin.\n\t\t *\n\t\t * @since 4.4.0\n\t\t * @private\n\t\t */\n\t\t_recalculateTopMargin: function() {\n\t\t\tvar panel = this, headerActionsHeight, content, accordionSection;\n\t\t\theaderActionsHeight = $( '#customize-header-actions' ).height();\n\t\t\taccordionSection = panel.container.closest( '.accordion-section' );\n\t\t\tcontent = accordionSection.find( '.control-panel-content' );\n\t\t\tcontent.css( 'margin-top', ( parseInt( content.css( 'margin-top' ), 10 ) - ( content.offset().top - headerActionsHeight ) ) );\n\t\t},\n\n\t\t/**\n\t\t * Render the panel from its JS template, if it exists.\n\t\t *\n\t\t * The panel's container must already exist in the DOM.\n\t\t *\n\t\t * @since 4.3.0\n\t\t */\n\t\trenderContent: function () {\n\t\t\tvar template,\n\t\t\t\tpanel = this;\n\n\t\t\t// Add the content to the container.\n\t\t\tif ( 0 !== $( '#tmpl-' + panel.templateSelector + '-content' ).length ) {\n\t\t\t\ttemplate = wp.template( panel.templateSelector + '-content' );\n\t\t\t} else {\n\t\t\t\ttemplate = wp.template( 'customize-panel-default-content' );\n\t\t\t}\n\t\t\tif ( template && panel.container ) {\n\t\t\t\tpanel.container.find( '.accordion-sub-container' ).html( template( panel.params ) );\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * A Customizer Control.\n\t *\n\t * A control provides a UI element that allows a user to modify a Customizer Setting.\n\t *\n\t * @see PHP class WP_Customize_Control.\n\t *\n\t * @class\n\t * @augments wp.customize.Class\n\t *\n\t * @param {string} id                              Unique identifier for the control instance.\n\t * @param {object} options                         Options hash for the control instance.\n\t * @param {object} options.params\n\t * @param {object} options.params.type             Type of control (e.g. text, radio, dropdown-pages, etc.)\n\t * @param {string} options.params.content          The HTML content for the control.\n\t * @param {string} options.params.priority         Order of priority to show the control within the section.\n\t * @param {string} options.params.active\n\t * @param {string} options.params.section          The ID of the section the control belongs to.\n\t * @param {string} options.params.settings.default The ID of the setting the control relates to.\n\t * @param {string} options.params.settings.data\n\t * @param {string} options.params.label\n\t * @param {string} options.params.description\n\t * @param {string} options.params.instanceNumber Order in which this instance was created in relation to other instances.\n\t */\n\tapi.Control = api.Class.extend({\n\t\tdefaultActiveArguments: { duration: 'fast', completeCallback: $.noop },\n\n\t\tinitialize: function( id, options ) {\n\t\t\tvar control = this,\n\t\t\t\tnodes, radios, settings;\n\n\t\t\tcontrol.params = {};\n\t\t\t$.extend( control, options || {} );\n\t\t\tcontrol.id = id;\n\t\t\tcontrol.selector = '#customize-control-' + id.replace( /\\]/g, '' ).replace( /\\[/g, '-' );\n\t\t\tcontrol.templateSelector = 'customize-control-' + control.params.type + '-content';\n\t\t\tcontrol.container = control.params.content ? $( control.params.content ) : $( control.selector );\n\n\t\t\tcontrol.deferred = {\n\t\t\t\tembedded: new $.Deferred()\n\t\t\t};\n\t\t\tcontrol.section = new api.Value();\n\t\t\tcontrol.priority = new api.Value();\n\t\t\tcontrol.active = new api.Value();\n\t\t\tcontrol.activeArgumentsQueue = [];\n\n\t\t\tcontrol.elements = [];\n\n\t\t\tnodes  = control.container.find('[data-customize-setting-link]');\n\t\t\tradios = {};\n\n\t\t\tnodes.each( function() {\n\t\t\t\tvar node = $( this ),\n\t\t\t\t\tname;\n\n\t\t\t\tif ( node.is( ':radio' ) ) {\n\t\t\t\t\tname = node.prop( 'name' );\n\t\t\t\t\tif ( radios[ name ] ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tradios[ name ] = true;\n\t\t\t\t\tnode = nodes.filter( '[name=\"' + name + '\"]' );\n\t\t\t\t}\n\n\t\t\t\tapi( node.data( 'customizeSettingLink' ), function( setting ) {\n\t\t\t\t\tvar element = new api.Element( node );\n\t\t\t\t\tcontrol.elements.push( element );\n\t\t\t\t\telement.sync( setting );\n\t\t\t\t\telement.set( setting() );\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcontrol.active.bind( function ( active ) {\n\t\t\t\tvar args = control.activeArgumentsQueue.shift();\n\t\t\t\targs = $.extend( {}, control.defaultActiveArguments, args );\n\t\t\t\tcontrol.onChangeActive( active, args );\n\t\t\t} );\n\n\t\t\tcontrol.section.set( control.params.section );\n\t\t\tcontrol.priority.set( isNaN( control.params.priority ) ? 10 : control.params.priority );\n\t\t\tcontrol.active.set( control.params.active );\n\n\t\t\tapi.utils.bubbleChildValueChanges( control, [ 'section', 'priority', 'active' ] );\n\n\t\t\t/*\n\t\t\t * After all settings related to the control are available,\n\t\t\t * make them available on the control and embed the control into the page.\n\t\t\t */\n\t\t\tsettings = $.map( control.params.settings, function( value ) {\n\t\t\t\treturn value;\n\t\t\t});\n\t\t\tapi.apply( api, settings.concat( function () {\n\t\t\t\tvar key;\n\n\t\t\t\tcontrol.settings = {};\n\t\t\t\tfor ( key in control.params.settings ) {\n\t\t\t\t\tcontrol.settings[ key ] = api( control.params.settings[ key ] );\n\t\t\t\t}\n\n\t\t\t\tcontrol.setting = control.settings['default'] || null;\n\n\t\t\t\tcontrol.embed();\n\t\t\t}) );\n\n\t\t\t// After the control is embedded on the page, invoke the \"ready\" method.\n\t\t\tcontrol.deferred.embedded.done( function () {\n\t\t\t\tcontrol.ready();\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Embed the control into the page.\n\t\t */\n\t\tembed: function () {\n\t\t\tvar control = this,\n\t\t\t\tinject;\n\n\t\t\t// Watch for changes to the section state\n\t\t\tinject = function ( sectionId ) {\n\t\t\t\tvar parentContainer;\n\t\t\t\tif ( ! sectionId ) { // @todo allow a control to be embedded without a section, for instance a control embedded in the frontend\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Wait for the section to be registered\n\t\t\t\tapi.section( sectionId, function ( section ) {\n\t\t\t\t\t// Wait for the section to be ready/initialized\n\t\t\t\t\tsection.deferred.embedded.done( function () {\n\t\t\t\t\t\tparentContainer = section.container.find( 'ul:first' );\n\t\t\t\t\t\tif ( ! control.container.parent().is( parentContainer ) ) {\n\t\t\t\t\t\t\tparentContainer.append( control.container );\n\t\t\t\t\t\t\tcontrol.renderContent();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontrol.deferred.embedded.resolve();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t};\n\t\t\tcontrol.section.bind( inject );\n\t\t\tinject( control.section.get() );\n\t\t},\n\n\t\t/**\n\t\t * Triggered when the control's markup has been injected into the DOM.\n\t\t *\n\t\t * @abstract\n\t\t */\n\t\tready: function() {},\n\n\t\t/**\n\t\t * Normal controls do not expand, so just expand its parent\n\t\t *\n\t\t * @param {Object} [params]\n\t\t */\n\t\texpand: function ( params ) {\n\t\t\tapi.section( this.section() ).expand( params );\n\t\t},\n\n\t\t/**\n\t\t * Bring the containing section and panel into view and then\n\t\t * this control into view, focusing on the first input.\n\t\t */\n\t\tfocus: focus,\n\n\t\t/**\n\t\t * Update UI in response to a change in the control's active state.\n\t\t * This does not change the active state, it merely handles the behavior\n\t\t * for when it does change.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Boolean}  active\n\t\t * @param {Object}   args\n\t\t * @param {Number}   args.duration\n\t\t * @param {Callback} args.completeCallback\n\t\t */\n\t\tonChangeActive: function ( active, args ) {\n\t\t\tif ( args.unchanged ) {\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\targs.completeCallback();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! $.contains( document, this.container[0] ) ) {\n\t\t\t\t// jQuery.fn.slideUp is not hiding an element if it is not in the DOM\n\t\t\t\tthis.container.toggle( active );\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\targs.completeCallback();\n\t\t\t\t}\n\t\t\t} else if ( active ) {\n\t\t\t\tthis.container.slideDown( args.duration, args.completeCallback );\n\t\t\t} else {\n\t\t\t\tthis.container.slideUp( args.duration, args.completeCallback );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @deprecated 4.1.0 Use this.onChangeActive() instead.\n\t\t */\n\t\ttoggle: function ( active ) {\n\t\t\treturn this.onChangeActive( active, this.defaultActiveArguments );\n\t\t},\n\n\t\t/**\n\t\t * Shorthand way to enable the active state.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if already active\n\t\t */\n\t\tactivate: Container.prototype.activate,\n\n\t\t/**\n\t\t * Shorthand way to disable the active state.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if already inactive\n\t\t */\n\t\tdeactivate: Container.prototype.deactivate,\n\n\t\t/**\n\t\t * Re-use _toggleActive from Container class.\n\t\t *\n\t\t * @access private\n\t\t */\n\t\t_toggleActive: Container.prototype._toggleActive,\n\n\t\tdropdownInit: function() {\n\t\t\tvar control      = this,\n\t\t\t\tstatuses     = this.container.find('.dropdown-status'),\n\t\t\t\tparams       = this.params,\n\t\t\t\ttoggleFreeze = false,\n\t\t\t\tupdate       = function( to ) {\n\t\t\t\t\tif ( typeof to === 'string' && params.statuses && params.statuses[ to ] )\n\t\t\t\t\t\tstatuses.html( params.statuses[ to ] ).show();\n\t\t\t\t\telse\n\t\t\t\t\t\tstatuses.hide();\n\t\t\t\t};\n\n\t\t\t// Support the .dropdown class to open/close complex elements\n\t\t\tthis.container.on( 'click keydown', '.dropdown', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (!toggleFreeze)\n\t\t\t\t\tcontrol.container.toggleClass('open');\n\n\t\t\t\tif ( control.container.hasClass('open') )\n\t\t\t\t\tcontrol.container.parent().parent().find('li.library-selected').focus();\n\n\t\t\t\t// Don't want to fire focus and click at same time\n\t\t\t\ttoggleFreeze = true;\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\ttoggleFreeze = false;\n\t\t\t\t}, 400);\n\t\t\t});\n\n\t\t\tthis.setting.bind( update );\n\t\t\tupdate( this.setting() );\n\t\t},\n\n\t\t/**\n\t\t * Render the control from its JS template, if it exists.\n\t\t *\n\t\t * The control's container must already exist in the DOM.\n\t\t *\n\t\t * @since 4.1.0\n\t\t */\n\t\trenderContent: function () {\n\t\t\tvar template,\n\t\t\t\tcontrol = this;\n\n\t\t\t// Replace the container element's content with the control.\n\t\t\tif ( 0 !== $( '#tmpl-' + control.templateSelector ).length ) {\n\t\t\t\ttemplate = wp.template( control.templateSelector );\n\t\t\t\tif ( template && control.container ) {\n\t\t\t\t\tcontrol.container.html( template( control.params ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * A colorpicker control.\n\t *\n\t * @class\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.ColorControl = api.Control.extend({\n\t\tready: function() {\n\t\t\tvar control = this,\n\t\t\t\tpicker = this.container.find('.color-picker-hex');\n\n\t\t\tpicker.val( control.setting() ).wpColorPicker({\n\t\t\t\tchange: function() {\n\t\t\t\t\tcontrol.setting.set( picker.wpColorPicker('color') );\n\t\t\t\t},\n\t\t\t\tclear: function() {\n\t\t\t\t\tcontrol.setting.set( '' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.setting.bind( function ( value ) {\n\t\t\t\tpicker.val( value );\n\t\t\t\tpicker.wpColorPicker( 'color', value );\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * A control that implements the media modal.\n\t *\n\t * @class\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.MediaControl = api.Control.extend({\n\n\t\t/**\n\t\t * When the control's DOM structure is ready,\n\t\t * set up internal event bindings.\n\t\t */\n\t\tready: function() {\n\t\t\tvar control = this;\n\t\t\t// Shortcut so that we don't have to use _.bind every time we add a callback.\n\t\t\t_.bindAll( control, 'restoreDefault', 'removeFile', 'openFrame', 'select', 'pausePlayer' );\n\n\t\t\t// Bind events, with delegation to facilitate re-rendering.\n\t\t\tcontrol.container.on( 'click keydown', '.upload-button', control.openFrame );\n\t\t\tcontrol.container.on( 'click keydown', '.upload-button', control.pausePlayer );\n\t\t\tcontrol.container.on( 'click keydown', '.thumbnail-image img', control.openFrame );\n\t\t\tcontrol.container.on( 'click keydown', '.default-button', control.restoreDefault );\n\t\t\tcontrol.container.on( 'click keydown', '.remove-button', control.pausePlayer );\n\t\t\tcontrol.container.on( 'click keydown', '.remove-button', control.removeFile );\n\t\t\tcontrol.container.on( 'click keydown', '.remove-button', control.cleanupPlayer );\n\n\t\t\t// Resize the player controls when it becomes visible (ie when section is expanded)\n\t\t\tapi.section( control.section() ).container\n\t\t\t\t.on( 'expanded', function() {\n\t\t\t\t\tif ( control.player ) {\n\t\t\t\t\t\tcontrol.player.setControlsSize();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on( 'collapsed', function() {\n\t\t\t\t\tcontrol.pausePlayer();\n\t\t\t\t});\n\n\t\t\t// Re-render whenever the control's setting changes.\n\t\t\tcontrol.setting.bind( function () { control.renderContent(); } );\n\t\t},\n\n\t\tpausePlayer: function () {\n\t\t\tthis.player && this.player.pause();\n\t\t},\n\n\t\tcleanupPlayer: function () {\n\t\t\tthis.player && wp.media.mixin.removePlayer( this.player );\n\t\t},\n\n\t\t/**\n\t\t * Open the media modal.\n\t\t */\n\t\topenFrame: function( event ) {\n\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( ! this.frame ) {\n\t\t\t\tthis.initFrame();\n\t\t\t}\n\n\t\t\tthis.frame.open();\n\t\t},\n\n\t\t/**\n\t\t * Create a media modal select frame, and store it so the instance can be reused when needed.\n\t\t */\n\t\tinitFrame: function() {\n\t\t\tthis.frame = wp.media({\n\t\t\t\tbutton: {\n\t\t\t\t\ttext: this.params.button_labels.frame_button\n\t\t\t\t},\n\t\t\t\tstates: [\n\t\t\t\t\tnew wp.media.controller.Library({\n\t\t\t\t\t\ttitle:     this.params.button_labels.frame_title,\n\t\t\t\t\t\tlibrary:   wp.media.query({ type: this.params.mime_type }),\n\t\t\t\t\t\tmultiple:  false,\n\t\t\t\t\t\tdate:      false\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t});\n\n\t\t\t// When a file is selected, run a callback.\n\t\t\tthis.frame.on( 'select', this.select );\n\t\t},\n\n\t\t/**\n\t\t * Callback handler for when an attachment is selected in the media modal.\n\t\t * Gets the selected image information, and sets it within the control.\n\t\t */\n\t\tselect: function() {\n\t\t\t// Get the attachment from the modal frame.\n\t\t\tvar node,\n\t\t\t\tattachment = this.frame.state().get( 'selection' ).first().toJSON(),\n\t\t\t\tmejsSettings = window._wpmejsSettings || {};\n\n\t\t\tthis.params.attachment = attachment;\n\n\t\t\t// Set the Customizer setting; the callback takes care of rendering.\n\t\t\tthis.setting( attachment.id );\n\t\t\tnode = this.container.find( 'audio, video' ).get(0);\n\n\t\t\t// Initialize audio/video previews.\n\t\t\tif ( node ) {\n\t\t\t\tthis.player = new MediaElementPlayer( node, mejsSettings );\n\t\t\t} else {\n\t\t\t\tthis.cleanupPlayer();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Reset the setting to the default value.\n\t\t */\n\t\trestoreDefault: function( event ) {\n\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.params.attachment = this.params.defaultAttachment;\n\t\t\tthis.setting( this.params.defaultAttachment.url );\n\t\t},\n\n\t\t/**\n\t\t * Called when the \"Remove\" link is clicked. Empties the setting.\n\t\t *\n\t\t * @param {object} event jQuery Event object\n\t\t */\n\t\tremoveFile: function( event ) {\n\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.params.attachment = {};\n\t\t\tthis.setting( '' );\n\t\t\tthis.renderContent(); // Not bound to setting change when emptying.\n\t\t}\n\t});\n\n\t/**\n\t * An upload control, which utilizes the media modal.\n\t *\n\t * @class\n\t * @augments wp.customize.MediaControl\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.UploadControl = api.MediaControl.extend({\n\n\t\t/**\n\t\t * Callback handler for when an attachment is selected in the media modal.\n\t\t * Gets the selected image information, and sets it within the control.\n\t\t */\n\t\tselect: function() {\n\t\t\t// Get the attachment from the modal frame.\n\t\t\tvar node,\n\t\t\t\tattachment = this.frame.state().get( 'selection' ).first().toJSON(),\n\t\t\t\tmejsSettings = window._wpmejsSettings || {};\n\n\t\t\tthis.params.attachment = attachment;\n\n\t\t\t// Set the Customizer setting; the callback takes care of rendering.\n\t\t\tthis.setting( attachment.url );\n\t\t\tnode = this.container.find( 'audio, video' ).get(0);\n\n\t\t\t// Initialize audio/video previews.\n\t\t\tif ( node ) {\n\t\t\t\tthis.player = new MediaElementPlayer( node, mejsSettings );\n\t\t\t} else {\n\t\t\t\tthis.cleanupPlayer();\n\t\t\t}\n\t\t},\n\n\t\t// @deprecated\n\t\tsuccess: function() {},\n\n\t\t// @deprecated\n\t\tremoverVisibility: function() {}\n\t});\n\n\t/**\n\t * A control for uploading images.\n\t *\n\t * This control no longer needs to do anything more\n\t * than what the upload control does in JS.\n\t *\n\t * @class\n\t * @augments wp.customize.UploadControl\n\t * @augments wp.customize.MediaControl\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.ImageControl = api.UploadControl.extend({\n\t\t// @deprecated\n\t\tthumbnailSrc: function() {}\n\t});\n\n\t/**\n\t * A control for uploading background images.\n\t *\n\t * @class\n\t * @augments wp.customize.UploadControl\n\t * @augments wp.customize.MediaControl\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.BackgroundControl = api.UploadControl.extend({\n\n\t\t/**\n\t\t * When the control's DOM structure is ready,\n\t\t * set up internal event bindings.\n\t\t */\n\t\tready: function() {\n\t\t\tapi.UploadControl.prototype.ready.apply( this, arguments );\n\t\t},\n\n\t\t/**\n\t\t * Callback handler for when an attachment is selected in the media modal.\n\t\t * Does an additional AJAX request for setting the background context.\n\t\t */\n\t\tselect: function() {\n\t\t\tapi.UploadControl.prototype.select.apply( this, arguments );\n\n\t\t\twp.ajax.post( 'custom-background-add', {\n\t\t\t\tnonce: _wpCustomizeBackground.nonces.add,\n\t\t\t\twp_customize: 'on',\n\t\t\t\ttheme: api.settings.theme.stylesheet,\n\t\t\t\tattachment_id: this.params.attachment.id\n\t\t\t} );\n\t\t}\n\t});\n\n\t/**\n\t * A control for selecting and cropping an image.\n\t *\n\t * @class\n\t * @augments wp.customize.MediaControl\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.CroppedImageControl = api.MediaControl.extend({\n\n\t\t/**\n\t\t * Open the media modal to the library state.\n\t\t */\n\t\topenFrame: function( event ) {\n\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.initFrame();\n\t\t\tthis.frame.setState( 'library' ).open();\n\t\t},\n\n\t\t/**\n\t\t * Create a media modal select frame, and store it so the instance can be reused when needed.\n\t\t */\n\t\tinitFrame: function() {\n\t\t\tvar l10n = _wpMediaViewsL10n;\n\n\t\t\tthis.frame = wp.media({\n\t\t\t\tbutton: {\n\t\t\t\t\ttext: l10n.select,\n\t\t\t\t\tclose: false\n\t\t\t\t},\n\t\t\t\tstates: [\n\t\t\t\t\tnew wp.media.controller.Library({\n\t\t\t\t\t\ttitle: this.params.button_labels.frame_title,\n\t\t\t\t\t\tlibrary: wp.media.query({ type: 'image' }),\n\t\t\t\t\t\tmultiple: false,\n\t\t\t\t\t\tdate: false,\n\t\t\t\t\t\tpriority: 20,\n\t\t\t\t\t\tsuggestedWidth: this.params.width,\n\t\t\t\t\t\tsuggestedHeight: this.params.height\n\t\t\t\t\t}),\n\t\t\t\t\tnew wp.media.controller.CustomizeImageCropper({\n\t\t\t\t\t\timgSelectOptions: this.calculateImageSelectOptions,\n\t\t\t\t\t\tcontrol: this\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t});\n\n\t\t\tthis.frame.on( 'select', this.onSelect, this );\n\t\t\tthis.frame.on( 'cropped', this.onCropped, this );\n\t\t\tthis.frame.on( 'skippedcrop', this.onSkippedCrop, this );\n\t\t},\n\n\t\t/**\n\t\t * After an image is selected in the media modal, switch to the cropper\n\t\t * state if the image isn't the right size.\n\t\t */\n\t\tonSelect: function() {\n\t\t\tvar attachment = this.frame.state().get( 'selection' ).first().toJSON();\n\n\t\t\tif ( this.params.width === attachment.width && this.params.height === attachment.height && ! this.params.flex_width && ! this.params.flex_height ) {\n\t\t\t\tthis.setImageFromAttachment( attachment );\n\t\t\t\tthis.frame.close();\n\t\t\t} else {\n\t\t\t\tthis.frame.setState( 'cropper' );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * After the image has been cropped, apply the cropped image data to the setting.\n\t\t *\n\t\t * @param {object} croppedImage Cropped attachment data.\n\t\t */\n\t\tonCropped: function( croppedImage ) {\n\t\t\tthis.setImageFromAttachment( croppedImage );\n\t\t},\n\n\t\t/**\n\t\t * Returns a set of options, computed from the attached image data and\n\t\t * control-specific data, to be fed to the imgAreaSelect plugin in\n\t\t * wp.media.view.Cropper.\n\t\t *\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t * @param {wp.media.controller.Cropper} controller\n\t\t * @returns {Object} Options\n\t\t */\n\t\tcalculateImageSelectOptions: function( attachment, controller ) {\n\t\t\tvar control    = controller.get( 'control' ),\n\t\t\t\tflexWidth  = !! parseInt( control.params.flex_width, 10 ),\n\t\t\t\tflexHeight = !! parseInt( control.params.flex_height, 10 ),\n\t\t\t\trealWidth  = attachment.get( 'width' ),\n\t\t\t\trealHeight = attachment.get( 'height' ),\n\t\t\t\txInit = parseInt( control.params.width, 10 ),\n\t\t\t\tyInit = parseInt( control.params.height, 10 ),\n\t\t\t\tratio = xInit / yInit,\n\t\t\t\txImg  = realWidth,\n\t\t\t\tyImg  = realHeight,\n\t\t\t\tx1, y1, imgSelectOptions;\n\n\t\t\tcontroller.set( 'canSkipCrop', ! control.mustBeCropped( flexWidth, flexHeight, xInit, yInit, realWidth, realHeight ) );\n\n\t\t\tif ( xImg / yImg > ratio ) {\n\t\t\t\tyInit = yImg;\n\t\t\t\txInit = yInit * ratio;\n\t\t\t} else {\n\t\t\t\txInit = xImg;\n\t\t\t\tyInit = xInit / ratio;\n\t\t\t}\n\n\t\t\tx1 = ( xImg - xInit ) / 2;\n\t\t\ty1 = ( yImg - yInit ) / 2;\n\n\t\t\timgSelectOptions = {\n\t\t\t\thandles: true,\n\t\t\t\tkeys: true,\n\t\t\t\tinstance: true,\n\t\t\t\tpersistent: true,\n\t\t\t\timageWidth: realWidth,\n\t\t\t\timageHeight: realHeight,\n\t\t\t\tx1: x1,\n\t\t\t\ty1: y1,\n\t\t\t\tx2: xInit + x1,\n\t\t\t\ty2: yInit + y1\n\t\t\t};\n\n\t\t\tif ( flexHeight === false && flexWidth === false ) {\n\t\t\t\timgSelectOptions.aspectRatio = xInit + ':' + yInit;\n\t\t\t}\n\t\t\tif ( flexHeight === false ) {\n\t\t\t\timgSelectOptions.maxHeight = yInit;\n\t\t\t}\n\t\t\tif ( flexWidth === false ) {\n\t\t\t\timgSelectOptions.maxWidth = xInit;\n\t\t\t}\n\n\t\t\treturn imgSelectOptions;\n\t\t},\n\n\t\t/**\n\t\t * Return whether the image must be cropped, based on required dimensions.\n\t\t *\n\t\t * @param {bool} flexW\n\t\t * @param {bool} flexH\n\t\t * @param {int}  dstW\n\t\t * @param {int}  dstH\n\t\t * @param {int}  imgW\n\t\t * @param {int}  imgH\n\t\t * @return {bool}\n\t\t */\n\t\tmustBeCropped: function( flexW, flexH, dstW, dstH, imgW, imgH ) {\n\t\t\tif ( true === flexW && true === flexH ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( true === flexW && dstH === imgH ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( true === flexH && dstW === imgW ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( dstW === imgW && dstH === imgH ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( imgW <= dstW ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * If cropping was skipped, apply the image data directly to the setting.\n\t\t */\n\t\tonSkippedCrop: function() {\n\t\t\tvar attachment = this.frame.state().get( 'selection' ).first().toJSON();\n\t\t\tthis.setImageFromAttachment( attachment );\n\t\t},\n\n\t\t/**\n\t\t * Updates the setting and re-renders the control UI.\n\t\t *\n\t\t * @param {object} attachment\n\t\t */\n\t\tsetImageFromAttachment: function( attachment ) {\n\t\t\tthis.params.attachment = attachment;\n\n\t\t\t// Set the Customizer setting; the callback takes care of rendering.\n\t\t\tthis.setting( attachment.id );\n\t\t}\n\t});\n\n\t/**\n\t * A control for selecting and cropping Site Icons.\n\t *\n\t * @class\n\t * @augments wp.customize.CroppedImageControl\n\t * @augments wp.customize.MediaControl\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.SiteIconControl = api.CroppedImageControl.extend({\n\n\t\t/**\n\t\t * Create a media modal select frame, and store it so the instance can be reused when needed.\n\t\t */\n\t\tinitFrame: function() {\n\t\t\tvar l10n = _wpMediaViewsL10n;\n\n\t\t\tthis.frame = wp.media({\n\t\t\t\tbutton: {\n\t\t\t\t\ttext: l10n.select,\n\t\t\t\t\tclose: false\n\t\t\t\t},\n\t\t\t\tstates: [\n\t\t\t\t\tnew wp.media.controller.Library({\n\t\t\t\t\t\ttitle: this.params.button_labels.frame_title,\n\t\t\t\t\t\tlibrary: wp.media.query({ type: 'image' }),\n\t\t\t\t\t\tmultiple: false,\n\t\t\t\t\t\tdate: false,\n\t\t\t\t\t\tpriority: 20,\n\t\t\t\t\t\tsuggestedWidth: this.params.width,\n\t\t\t\t\t\tsuggestedHeight: this.params.height\n\t\t\t\t\t}),\n\t\t\t\t\tnew wp.media.controller.SiteIconCropper({\n\t\t\t\t\t\timgSelectOptions: this.calculateImageSelectOptions,\n\t\t\t\t\t\tcontrol: this\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t});\n\n\t\t\tthis.frame.on( 'select', this.onSelect, this );\n\t\t\tthis.frame.on( 'cropped', this.onCropped, this );\n\t\t\tthis.frame.on( 'skippedcrop', this.onSkippedCrop, this );\n\t\t},\n\n\t\t/**\n\t\t * After an image is selected in the media modal, switch to the cropper\n\t\t * state if the image isn't the right size.\n\t\t */\n\t\tonSelect: function() {\n\t\t\tvar attachment = this.frame.state().get( 'selection' ).first().toJSON(),\n\t\t\t\tcontroller = this;\n\n\t\t\tif ( this.params.width === attachment.width && this.params.height === attachment.height && ! this.params.flex_width && ! this.params.flex_height ) {\n\t\t\t\twp.ajax.post( 'crop-image', {\n\t\t\t\t\tnonce: attachment.nonces.edit,\n\t\t\t\t\tid: attachment.id,\n\t\t\t\t\tcontext: 'site-icon',\n\t\t\t\t\tcropDetails: {\n\t\t\t\t\t\tx1: 0,\n\t\t\t\t\t\ty1: 0,\n\t\t\t\t\t\twidth: this.params.width,\n\t\t\t\t\t\theight: this.params.height,\n\t\t\t\t\t\tdst_width: this.params.width,\n\t\t\t\t\t\tdst_height: this.params.height\n\t\t\t\t\t}\n\t\t\t\t} ).done( function( croppedImage ) {\n\t\t\t\t\tcontroller.setImageFromAttachment( croppedImage );\n\t\t\t\t\tcontroller.frame.close();\n\t\t\t\t} ).fail( function() {\n\t\t\t\t\tcontroller.trigger('content:error:crop');\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tthis.frame.setState( 'cropper' );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the setting and re-renders the control UI.\n\t\t *\n\t\t * @param {object} attachment\n\t\t */\n\t\tsetImageFromAttachment: function( attachment ) {\n\t\t\tvar sizes = [ 'site_icon-32', 'thumbnail', 'full' ],\n\t\t\t\ticon;\n\n\t\t\t_.each( sizes, function( size ) {\n\t\t\t\tif ( ! icon && ! _.isUndefined ( attachment.sizes[ size ] ) ) {\n\t\t\t\t\ticon = attachment.sizes[ size ];\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.params.attachment = attachment;\n\n\t\t\t// Set the Customizer setting; the callback takes care of rendering.\n\t\t\tthis.setting( attachment.id );\n\n\t\t\t// Update the icon in-browser.\n\t\t\t$( 'link[sizes=\"32x32\"]' ).attr( 'href', icon.url );\n\t\t},\n\n\t\t/**\n\t\t * Called when the \"Remove\" link is clicked. Empties the setting.\n\t\t *\n\t\t * @param {object} event jQuery Event object\n\t\t */\n\t\tremoveFile: function( event ) {\n\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.params.attachment = {};\n\t\t\tthis.setting( '' );\n\t\t\tthis.renderContent(); // Not bound to setting change when emptying.\n\t\t\t$( 'link[rel=\"icon\"]' ).attr( 'href', '' );\n\t\t}\n\t});\n\n\t/**\n\t * @class\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.HeaderControl = api.Control.extend({\n\t\tready: function() {\n\t\t\tthis.btnRemove = $('#customize-control-header_image .actions .remove');\n\t\t\tthis.btnNew    = $('#customize-control-header_image .actions .new');\n\n\t\t\t_.bindAll(this, 'openMedia', 'removeImage');\n\n\t\t\tthis.btnNew.on( 'click', this.openMedia );\n\t\t\tthis.btnRemove.on( 'click', this.removeImage );\n\n\t\t\tapi.HeaderTool.currentHeader = this.getInitialHeaderImage();\n\n\t\t\tnew api.HeaderTool.CurrentView({\n\t\t\t\tmodel: api.HeaderTool.currentHeader,\n\t\t\t\tel: '#customize-control-header_image .current .container'\n\t\t\t});\n\n\t\t\tnew api.HeaderTool.ChoiceListView({\n\t\t\t\tcollection: api.HeaderTool.UploadsList = new api.HeaderTool.ChoiceList(),\n\t\t\t\tel: '#customize-control-header_image .choices .uploaded .list'\n\t\t\t});\n\n\t\t\tnew api.HeaderTool.ChoiceListView({\n\t\t\t\tcollection: api.HeaderTool.DefaultsList = new api.HeaderTool.DefaultsList(),\n\t\t\t\tel: '#customize-control-header_image .choices .default .list'\n\t\t\t});\n\n\t\t\tapi.HeaderTool.combinedList = api.HeaderTool.CombinedList = new api.HeaderTool.CombinedList([\n\t\t\t\tapi.HeaderTool.UploadsList,\n\t\t\t\tapi.HeaderTool.DefaultsList\n\t\t\t]);\n\t\t},\n\n\t\t/**\n\t\t * Returns a new instance of api.HeaderTool.ImageModel based on the currently\n\t\t * saved header image (if any).\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @returns {Object} Options\n\t\t */\n\t\tgetInitialHeaderImage: function() {\n\t\t\tif ( ! api.get().header_image || ! api.get().header_image_data || _.contains( [ 'remove-header', 'random-default-image', 'random-uploaded-image' ], api.get().header_image ) ) {\n\t\t\t\treturn new api.HeaderTool.ImageModel();\n\t\t\t}\n\n\t\t\t// Get the matching uploaded image object.\n\t\t\tvar currentHeaderObject = _.find( _wpCustomizeHeader.uploads, function( imageObj ) {\n\t\t\t\treturn ( imageObj.attachment_id === api.get().header_image_data.attachment_id );\n\t\t\t} );\n\t\t\t// Fall back to raw current header image.\n\t\t\tif ( ! currentHeaderObject ) {\n\t\t\t\tcurrentHeaderObject = {\n\t\t\t\t\turl: api.get().header_image,\n\t\t\t\t\tthumbnail_url: api.get().header_image,\n\t\t\t\t\tattachment_id: api.get().header_image_data.attachment_id\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn new api.HeaderTool.ImageModel({\n\t\t\t\theader: currentHeaderObject,\n\t\t\t\tchoice: currentHeaderObject.url.split( '/' ).pop()\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Returns a set of options, computed from the attached image data and\n\t\t * theme-specific data, to be fed to the imgAreaSelect plugin in\n\t\t * wp.media.view.Cropper.\n\t\t *\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t * @param {wp.media.controller.Cropper} controller\n\t\t * @returns {Object} Options\n\t\t */\n\t\tcalculateImageSelectOptions: function(attachment, controller) {\n\t\t\tvar xInit = parseInt(_wpCustomizeHeader.data.width, 10),\n\t\t\t\tyInit = parseInt(_wpCustomizeHeader.data.height, 10),\n\t\t\t\tflexWidth = !! parseInt(_wpCustomizeHeader.data['flex-width'], 10),\n\t\t\t\tflexHeight = !! parseInt(_wpCustomizeHeader.data['flex-height'], 10),\n\t\t\t\tratio, xImg, yImg, realHeight, realWidth,\n\t\t\t\timgSelectOptions;\n\n\t\t\trealWidth = attachment.get('width');\n\t\t\trealHeight = attachment.get('height');\n\n\t\t\tthis.headerImage = new api.HeaderTool.ImageModel();\n\t\t\tthis.headerImage.set({\n\t\t\t\tthemeWidth: xInit,\n\t\t\t\tthemeHeight: yInit,\n\t\t\t\tthemeFlexWidth: flexWidth,\n\t\t\t\tthemeFlexHeight: flexHeight,\n\t\t\t\timageWidth: realWidth,\n\t\t\t\timageHeight: realHeight\n\t\t\t});\n\n\t\t\tcontroller.set( 'canSkipCrop', ! this.headerImage.shouldBeCropped() );\n\n\t\t\tratio = xInit / yInit;\n\t\t\txImg = realWidth;\n\t\t\tyImg = realHeight;\n\n\t\t\tif ( xImg / yImg > ratio ) {\n\t\t\t\tyInit = yImg;\n\t\t\t\txInit = yInit * ratio;\n\t\t\t} else {\n\t\t\t\txInit = xImg;\n\t\t\t\tyInit = xInit / ratio;\n\t\t\t}\n\n\t\t\timgSelectOptions = {\n\t\t\t\thandles: true,\n\t\t\t\tkeys: true,\n\t\t\t\tinstance: true,\n\t\t\t\tpersistent: true,\n\t\t\t\timageWidth: realWidth,\n\t\t\t\timageHeight: realHeight,\n\t\t\t\tx1: 0,\n\t\t\t\ty1: 0,\n\t\t\t\tx2: xInit,\n\t\t\t\ty2: yInit\n\t\t\t};\n\n\t\t\tif (flexHeight === false && flexWidth === false) {\n\t\t\t\timgSelectOptions.aspectRatio = xInit + ':' + yInit;\n\t\t\t}\n\t\t\tif (flexHeight === false ) {\n\t\t\t\timgSelectOptions.maxHeight = yInit;\n\t\t\t}\n\t\t\tif (flexWidth === false ) {\n\t\t\t\timgSelectOptions.maxWidth = xInit;\n\t\t\t}\n\n\t\t\treturn imgSelectOptions;\n\t\t},\n\n\t\t/**\n\t\t * Sets up and opens the Media Manager in order to select an image.\n\t\t * Depending on both the size of the image and the properties of the\n\t\t * current theme, a cropping step after selection may be required or\n\t\t * skippable.\n\t\t *\n\t\t * @param {event} event\n\t\t */\n\t\topenMedia: function(event) {\n\t\t\tvar l10n = _wpMediaViewsL10n;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.frame = wp.media({\n\t\t\t\tbutton: {\n\t\t\t\t\ttext: l10n.selectAndCrop,\n\t\t\t\t\tclose: false\n\t\t\t\t},\n\t\t\t\tstates: [\n\t\t\t\t\tnew wp.media.controller.Library({\n\t\t\t\t\t\ttitle:     l10n.chooseImage,\n\t\t\t\t\t\tlibrary:   wp.media.query({ type: 'image' }),\n\t\t\t\t\t\tmultiple:  false,\n\t\t\t\t\t\tdate:      false,\n\t\t\t\t\t\tpriority:  20,\n\t\t\t\t\t\tsuggestedWidth: _wpCustomizeHeader.data.width,\n\t\t\t\t\t\tsuggestedHeight: _wpCustomizeHeader.data.height\n\t\t\t\t\t}),\n\t\t\t\t\tnew wp.media.controller.Cropper({\n\t\t\t\t\t\timgSelectOptions: this.calculateImageSelectOptions\n\t\t\t\t\t})\n\t\t\t\t]\n\t\t\t});\n\n\t\t\tthis.frame.on('select', this.onSelect, this);\n\t\t\tthis.frame.on('cropped', this.onCropped, this);\n\t\t\tthis.frame.on('skippedcrop', this.onSkippedCrop, this);\n\n\t\t\tthis.frame.open();\n\t\t},\n\n\t\t/**\n\t\t * After an image is selected in the media modal,\n\t\t * switch to the cropper state.\n\t\t */\n\t\tonSelect: function() {\n\t\t\tthis.frame.setState('cropper');\n\t\t},\n\n\t\t/**\n\t\t * After the image has been cropped, apply the cropped image data to the setting.\n\t\t *\n\t\t * @param {object} croppedImage Cropped attachment data.\n\t\t */\n\t\tonCropped: function(croppedImage) {\n\t\t\tvar url = croppedImage.url,\n\t\t\t\tattachmentId = croppedImage.attachment_id,\n\t\t\t\tw = croppedImage.width,\n\t\t\t\th = croppedImage.height;\n\t\t\tthis.setImageFromURL(url, attachmentId, w, h);\n\t\t},\n\n\t\t/**\n\t\t * If cropping was skipped, apply the image data directly to the setting.\n\t\t *\n\t\t * @param {object} selection\n\t\t */\n\t\tonSkippedCrop: function(selection) {\n\t\t\tvar url = selection.get('url'),\n\t\t\t\tw = selection.get('width'),\n\t\t\t\th = selection.get('height');\n\t\t\tthis.setImageFromURL(url, selection.id, w, h);\n\t\t},\n\n\t\t/**\n\t\t * Creates a new wp.customize.HeaderTool.ImageModel from provided\n\t\t * header image data and inserts it into the user-uploaded headers\n\t\t * collection.\n\t\t *\n\t\t * @param {String} url\n\t\t * @param {Number} attachmentId\n\t\t * @param {Number} width\n\t\t * @param {Number} height\n\t\t */\n\t\tsetImageFromURL: function(url, attachmentId, width, height) {\n\t\t\tvar choice, data = {};\n\n\t\t\tdata.url = url;\n\t\t\tdata.thumbnail_url = url;\n\t\t\tdata.timestamp = _.now();\n\n\t\t\tif (attachmentId) {\n\t\t\t\tdata.attachment_id = attachmentId;\n\t\t\t}\n\n\t\t\tif (width) {\n\t\t\t\tdata.width = width;\n\t\t\t}\n\n\t\t\tif (height) {\n\t\t\t\tdata.height = height;\n\t\t\t}\n\n\t\t\tchoice = new api.HeaderTool.ImageModel({\n\t\t\t\theader: data,\n\t\t\t\tchoice: url.split('/').pop()\n\t\t\t});\n\t\t\tapi.HeaderTool.UploadsList.add(choice);\n\t\t\tapi.HeaderTool.currentHeader.set(choice.toJSON());\n\t\t\tchoice.save();\n\t\t\tchoice.importImage();\n\t\t},\n\n\t\t/**\n\t\t * Triggers the necessary events to deselect an image which was set as\n\t\t * the currently selected one.\n\t\t */\n\t\tremoveImage: function() {\n\t\t\tapi.HeaderTool.currentHeader.trigger('hide');\n\t\t\tapi.HeaderTool.CombinedList.trigger('control:removeImage');\n\t\t}\n\n\t});\n\n\t/**\n\t * wp.customize.ThemeControl\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t * @augments wp.customize.Class\n\t */\n\tapi.ThemeControl = api.Control.extend({\n\n\t\ttouchDrag: false,\n\t\tisRendered: false,\n\n\t\t/**\n\t\t * Defer rendering the theme control until the section is displayed.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\trenderContent: function () {\n\t\t\tvar control = this,\n\t\t\t\trenderContentArgs = arguments;\n\n\t\t\tapi.section( control.section(), function( section ) {\n\t\t\t\tif ( section.expanded() ) {\n\t\t\t\t\tapi.Control.prototype.renderContent.apply( control, renderContentArgs );\n\t\t\t\t\tcontrol.isRendered = true;\n\t\t\t\t} else {\n\t\t\t\t\tsection.expanded.bind( function( expanded ) {\n\t\t\t\t\t\tif ( expanded && ! control.isRendered ) {\n\t\t\t\t\t\t\tapi.Control.prototype.renderContent.apply( control, renderContentArgs );\n\t\t\t\t\t\t\tcontrol.isRendered = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * @since 4.2.0\n\t\t */\n\t\tready: function() {\n\t\t\tvar control = this;\n\n\t\t\tcontrol.container.on( 'touchmove', '.theme', function() {\n\t\t\t\tcontrol.touchDrag = true;\n\t\t\t});\n\n\t\t\t// Bind details view trigger.\n\t\t\tcontrol.container.on( 'click keydown touchend', '.theme', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Bail if the user scrolled on a touch device.\n\t\t\t\tif ( control.touchDrag === true ) {\n\t\t\t\t\treturn control.touchDrag = false;\n\t\t\t\t}\n\n\t\t\t\t// Prevent the modal from showing when the user clicks the action button.\n\t\t\t\tif ( $( event.target ).is( '.theme-actions .button' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar previewUrl = $( this ).data( 'previewUrl' );\n\n\t\t\t\t$( '.wp-full-overlay' ).addClass( 'customize-loading' );\n\n\t\t\t\twindow.parent.location = previewUrl;\n\t\t\t});\n\n\t\t\tcontrol.container.on( 'click keydown', '.theme-actions .theme-details', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\t\tapi.section( control.section() ).showDetails( control.params.theme );\n\t\t\t});\n\n\t\t\tcontrol.container.on( 'render-screenshot', function() {\n\t\t\t\tvar $screenshot = $( this ).find( 'img' ),\n\t\t\t\t\tsource = $screenshot.data( 'src' );\n\n\t\t\t\tif ( source ) {\n\t\t\t\t\t$screenshot.attr( 'src', source );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Show or hide the theme based on the presence of the term in the title, description, and author.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tfilter: function( term ) {\n\t\t\tvar control = this,\n\t\t\t\thaystack = control.params.theme.name + ' ' +\n\t\t\t\t\tcontrol.params.theme.description + ' ' +\n\t\t\t\t\tcontrol.params.theme.tags + ' ' +\n\t\t\t\t\tcontrol.params.theme.author;\n\t\t\thaystack = haystack.toLowerCase().replace( '-', ' ' );\n\t\t\tif ( -1 !== haystack.search( term ) ) {\n\t\t\t\tcontrol.activate();\n\t\t\t} else {\n\t\t\t\tcontrol.deactivate();\n\t\t\t}\n\t\t}\n\t});\n\n\t// Change objects contained within the main customize object to Settings.\n\tapi.defaultConstructor = api.Setting;\n\n\t// Create the collections for Controls, Sections and Panels.\n\tapi.control = new api.Values({ defaultConstructor: api.Control });\n\tapi.section = new api.Values({ defaultConstructor: api.Section });\n\tapi.panel = new api.Values({ defaultConstructor: api.Panel });\n\n\t/**\n\t * An object that fetches a preview in the background of the document, which\n\t * allows for seamless replacement of an existing preview.\n\t *\n\t * @class\n\t * @augments wp.customize.Messenger\n\t * @augments wp.customize.Class\n\t * @mixes wp.customize.Events\n\t */\n\tapi.PreviewFrame = api.Messenger.extend({\n\t\tsensitivity: 2000,\n\n\t\t/**\n\t\t * Initialize the PreviewFrame.\n\t\t *\n\t\t * @param {object} params.container\n\t\t * @param {object} params.signature\n\t\t * @param {object} params.previewUrl\n\t\t * @param {object} params.query\n\t\t * @param {object} options\n\t\t */\n\t\tinitialize: function( params, options ) {\n\t\t\tvar deferred = $.Deferred();\n\n\t\t\t/*\n\t\t\t * Make the instance of the PreviewFrame the promise object\n\t\t\t * so other objects can easily interact with it.\n\t\t\t */\n\t\t\tdeferred.promise( this );\n\n\t\t\tthis.container = params.container;\n\t\t\tthis.signature = params.signature;\n\n\t\t\t$.extend( params, { channel: api.PreviewFrame.uuid() });\n\n\t\t\tapi.Messenger.prototype.initialize.call( this, params, options );\n\n\t\t\tthis.add( 'previewUrl', params.previewUrl );\n\n\t\t\tthis.query = $.extend( params.query || {}, { customize_messenger_channel: this.channel() });\n\n\t\t\tthis.run( deferred );\n\t\t},\n\n\t\t/**\n\t\t * Run the preview request.\n\t\t *\n\t\t * @param {object} deferred jQuery Deferred object to be resolved with\n\t\t *                          the request.\n\t\t */\n\t\trun: function( deferred ) {\n\t\t\tvar self   = this,\n\t\t\t\tloaded = false,\n\t\t\t\tready  = false;\n\n\t\t\tif ( this._ready ) {\n\t\t\t\tthis.unbind( 'ready', this._ready );\n\t\t\t}\n\n\t\t\tthis._ready = function() {\n\t\t\t\tready = true;\n\n\t\t\t\tif ( loaded ) {\n\t\t\t\t\tdeferred.resolveWith( self );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.bind( 'ready', this._ready );\n\n\t\t\tthis.bind( 'ready', function ( data ) {\n\n\t\t\t\tthis.container.addClass( 'iframe-ready' );\n\n\t\t\t\tif ( ! data ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Walk over all panels, sections, and controls and set their\n\t\t\t\t * respective active states to true if the preview explicitly\n\t\t\t\t * indicates as such.\n\t\t\t\t */\n\t\t\t\tvar constructs = {\n\t\t\t\t\tpanel: data.activePanels,\n\t\t\t\t\tsection: data.activeSections,\n\t\t\t\t\tcontrol: data.activeControls\n\t\t\t\t};\n\t\t\t\t_( constructs ).each( function ( activeConstructs, type ) {\n\t\t\t\t\tapi[ type ].each( function ( construct, id ) {\n\t\t\t\t\t\tvar active = !! ( activeConstructs && activeConstructs[ id ] );\n\t\t\t\t\t\tif ( active ) {\n\t\t\t\t\t\t\tconstruct.activate();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconstruct.deactivate();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tthis.request = $.ajax( this.previewUrl(), {\n\t\t\t\ttype: 'POST',\n\t\t\t\tdata: this.query,\n\t\t\t\txhrFields: {\n\t\t\t\t\twithCredentials: true\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.request.fail( function() {\n\t\t\t\tdeferred.rejectWith( self, [ 'request failure' ] );\n\t\t\t});\n\n\t\t\tthis.request.done( function( response ) {\n\t\t\t\tvar location = self.request.getResponseHeader('Location'),\n\t\t\t\t\tsignature = self.signature,\n\t\t\t\t\tindex;\n\n\t\t\t\t// Check if the location response header differs from the current URL.\n\t\t\t\t// If so, the request was redirected; try loading the requested page.\n\t\t\t\tif ( location && location !== self.previewUrl() ) {\n\t\t\t\t\tdeferred.rejectWith( self, [ 'redirect', location ] );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check if the user is not logged in.\n\t\t\t\tif ( '0' === response ) {\n\t\t\t\t\tself.login( deferred );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check for cheaters.\n\t\t\t\tif ( '-1' === response ) {\n\t\t\t\t\tdeferred.rejectWith( self, [ 'cheatin' ] );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check for a signature in the request.\n\t\t\t\tindex = response.lastIndexOf( signature );\n\t\t\t\tif ( -1 === index || index < response.lastIndexOf('</html>') ) {\n\t\t\t\t\tdeferred.rejectWith( self, [ 'unsigned' ] );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Strip the signature from the request.\n\t\t\t\tresponse = response.slice( 0, index ) + response.slice( index + signature.length );\n\n\t\t\t\t// Create the iframe and inject the html content.\n\t\t\t\tself.iframe = $( '<iframe />', { 'title': api.l10n.previewIframeTitle } ).appendTo( self.container );\n\n\t\t\t\t// Bind load event after the iframe has been added to the page;\n\t\t\t\t// otherwise it will fire when injected into the DOM.\n\t\t\t\tself.iframe.one( 'load', function() {\n\t\t\t\t\tloaded = true;\n\n\t\t\t\t\tif ( ready ) {\n\t\t\t\t\t\tdeferred.resolveWith( self );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t\tdeferred.rejectWith( self, [ 'ready timeout' ] );\n\t\t\t\t\t\t}, self.sensitivity );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tself.targetWindow( self.iframe[0].contentWindow );\n\n\t\t\t\tself.targetWindow().document.open();\n\t\t\t\tself.targetWindow().document.write( response );\n\t\t\t\tself.targetWindow().document.close();\n\t\t\t});\n\t\t},\n\n\t\tlogin: function( deferred ) {\n\t\t\tvar self = this,\n\t\t\t\treject;\n\n\t\t\treject = function() {\n\t\t\t\tdeferred.rejectWith( self, [ 'logged out' ] );\n\t\t\t};\n\n\t\t\tif ( this.triedLogin ) {\n\t\t\t\treturn reject();\n\t\t\t}\n\n\t\t\t// Check if we have an admin cookie.\n\t\t\t$.get( api.settings.url.ajax, {\n\t\t\t\taction: 'logged-in'\n\t\t\t}).fail( reject ).done( function( response ) {\n\t\t\t\tvar iframe;\n\n\t\t\t\tif ( '1' !== response ) {\n\t\t\t\t\treject();\n\t\t\t\t}\n\n\t\t\t\tiframe = $( '<iframe />', { 'src': self.previewUrl(), 'title': api.l10n.previewIframeTitle } ).hide();\n\t\t\t\tiframe.appendTo( self.container );\n\t\t\t\tiframe.load( function() {\n\t\t\t\t\tself.triedLogin = true;\n\n\t\t\t\t\tiframe.remove();\n\t\t\t\t\tself.run( deferred );\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tapi.Messenger.prototype.destroy.call( this );\n\t\t\tthis.request.abort();\n\n\t\t\tif ( this.iframe )\n\t\t\t\tthis.iframe.remove();\n\n\t\t\tdelete this.request;\n\t\t\tdelete this.iframe;\n\t\t\tdelete this.targetWindow;\n\t\t}\n\t});\n\n\t(function(){\n\t\tvar uuid = 0;\n\t\t/**\n\t\t * Create a universally unique identifier.\n\t\t *\n\t\t * @return {int}\n\t\t */\n\t\tapi.PreviewFrame.uuid = function() {\n\t\t\treturn 'preview-' + uuid++;\n\t\t};\n\t}());\n\n\t/**\n\t * Set the document title of the customizer.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param {string} documentTitle\n\t */\n\tapi.setDocumentTitle = function ( documentTitle ) {\n\t\tvar tmpl, title;\n\t\ttmpl = api.settings.documentTitleTmpl;\n\t\ttitle = tmpl.replace( '%s', documentTitle );\n\t\tdocument.title = title;\n\t\tapi.trigger( 'title', title );\n\t};\n\n\t/**\n\t * @class\n\t * @augments wp.customize.Messenger\n\t * @augments wp.customize.Class\n\t * @mixes wp.customize.Events\n\t */\n\tapi.Previewer = api.Messenger.extend({\n\t\trefreshBuffer: 250,\n\n\t\t/**\n\t\t * @param {array}  params.allowedUrls\n\t\t * @param {string} params.container   A selector or jQuery element for the preview\n\t\t *                                    frame to be placed.\n\t\t * @param {string} params.form\n\t\t * @param {string} params.previewUrl  The URL to preview.\n\t\t * @param {string} params.signature\n\t\t * @param {object} options\n\t\t */\n\t\tinitialize: function( params, options ) {\n\t\t\tvar self = this,\n\t\t\t\trscheme = /^https?/;\n\n\t\t\t$.extend( this, options || {} );\n\t\t\tthis.deferred = {\n\t\t\t\tactive: $.Deferred()\n\t\t\t};\n\n\t\t\t/*\n\t\t\t * Wrap this.refresh to prevent it from hammering the servers:\n\t\t\t *\n\t\t\t * If refresh is called once and no other refresh requests are\n\t\t\t * loading, trigger the request immediately.\n\t\t\t *\n\t\t\t * If refresh is called while another refresh request is loading,\n\t\t\t * debounce the refresh requests:\n\t\t\t * 1. Stop the loading request (as it is instantly outdated).\n\t\t\t * 2. Trigger the new request once refresh hasn't been called for\n\t\t\t *    self.refreshBuffer milliseconds.\n\t\t\t */\n\t\t\tthis.refresh = (function( self ) {\n\t\t\t\tvar refresh  = self.refresh,\n\t\t\t\t\tcallback = function() {\n\t\t\t\t\t\ttimeout = null;\n\t\t\t\t\t\trefresh.call( self );\n\t\t\t\t\t},\n\t\t\t\t\ttimeout;\n\n\t\t\t\treturn function() {\n\t\t\t\t\tif ( typeof timeout !== 'number' ) {\n\t\t\t\t\t\tif ( self.loading ) {\n\t\t\t\t\t\t\tself.abort();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn callback();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tclearTimeout( timeout );\n\t\t\t\t\ttimeout = setTimeout( callback, self.refreshBuffer );\n\t\t\t\t};\n\t\t\t})( this );\n\n\t\t\tthis.container   = api.ensure( params.container );\n\t\t\tthis.allowedUrls = params.allowedUrls;\n\t\t\tthis.signature   = params.signature;\n\n\t\t\tparams.url = window.location.href;\n\n\t\t\tapi.Messenger.prototype.initialize.call( this, params );\n\n\t\t\tthis.add( 'scheme', this.origin() ).link( this.origin ).setter( function( to ) {\n\t\t\t\tvar match = to.match( rscheme );\n\t\t\t\treturn match ? match[0] : '';\n\t\t\t});\n\n\t\t\t// Limit the URL to internal, front-end links.\n\t\t\t//\n\t\t\t// If the frontend and the admin are served from the same domain, load the\n\t\t\t// preview over ssl if the Customizer is being loaded over ssl. This avoids\n\t\t\t// insecure content warnings. This is not attempted if the admin and frontend\n\t\t\t// are on different domains to avoid the case where the frontend doesn't have\n\t\t\t// ssl certs.\n\n\t\t\tthis.add( 'previewUrl', params.previewUrl ).setter( function( to ) {\n\t\t\t\tvar result;\n\n\t\t\t\t// Check for URLs that include \"/wp-admin/\" or end in \"/wp-admin\".\n\t\t\t\t// Strip hashes and query strings before testing.\n\t\t\t\tif ( /\\/wp-admin(\\/|$)/.test( to.replace( /[#?].*$/, '' ) ) )\n\t\t\t\t\treturn null;\n\n\t\t\t\t// Attempt to match the URL to the control frame's scheme\n\t\t\t\t// and check if it's allowed. If not, try the original URL.\n\t\t\t\t$.each([ to.replace( rscheme, self.scheme() ), to ], function( i, url ) {\n\t\t\t\t\t$.each( self.allowedUrls, function( i, allowed ) {\n\t\t\t\t\t\tvar path;\n\n\t\t\t\t\t\tallowed = allowed.replace( /\\/+$/, '' );\n\t\t\t\t\t\tpath = url.replace( allowed, '' );\n\n\t\t\t\t\t\tif ( 0 === url.indexOf( allowed ) && /^([/#?]|$)/.test( path ) ) {\n\t\t\t\t\t\t\tresult = url;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tif ( result )\n\t\t\t\t\t\treturn false;\n\t\t\t\t});\n\n\t\t\t\t// If we found a matching result, return it. If not, bail.\n\t\t\t\treturn result ? result : null;\n\t\t\t});\n\n\t\t\t// Refresh the preview when the URL is changed (but not yet).\n\t\t\tthis.previewUrl.bind( this.refresh );\n\n\t\t\tthis.scroll = 0;\n\t\t\tthis.bind( 'scroll', function( distance ) {\n\t\t\t\tthis.scroll = distance;\n\t\t\t});\n\n\t\t\t// Update the URL when the iframe sends a URL message.\n\t\t\tthis.bind( 'url', this.previewUrl );\n\n\t\t\t// Update the document title when the preview changes.\n\t\t\tthis.bind( 'documentTitle', function ( title ) {\n\t\t\t\tapi.setDocumentTitle( title );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Query string data sent with each preview request.\n\t\t *\n\t\t * @abstract\n\t\t */\n\t\tquery: function() {},\n\n\t\tabort: function() {\n\t\t\tif ( this.loading ) {\n\t\t\t\tthis.loading.destroy();\n\t\t\t\tdelete this.loading;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Refresh the preview.\n\t\t */\n\t\trefresh: function() {\n\t\t\tvar self = this;\n\n\t\t\t// Display loading indicator\n\t\t\tthis.send( 'loading-initiated' );\n\n\t\t\tthis.abort();\n\n\t\t\tthis.loading = new api.PreviewFrame({\n\t\t\t\turl:        this.url(),\n\t\t\t\tpreviewUrl: this.previewUrl(),\n\t\t\t\tquery:      this.query() || {},\n\t\t\t\tcontainer:  this.container,\n\t\t\t\tsignature:  this.signature\n\t\t\t});\n\n\t\t\tthis.loading.done( function() {\n\t\t\t\t// 'this' is the loading frame\n\t\t\t\tthis.bind( 'synced', function() {\n\t\t\t\t\tif ( self.preview )\n\t\t\t\t\t\tself.preview.destroy();\n\t\t\t\t\tself.preview = this;\n\t\t\t\t\tdelete self.loading;\n\n\t\t\t\t\tself.targetWindow( this.targetWindow() );\n\t\t\t\t\tself.channel( this.channel() );\n\n\t\t\t\t\tself.deferred.active.resolve();\n\t\t\t\t\tself.send( 'active' );\n\t\t\t\t});\n\n\t\t\t\tthis.send( 'sync', {\n\t\t\t\t\tscroll:   self.scroll,\n\t\t\t\t\tsettings: api.get()\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis.loading.fail( function( reason, location ) {\n\t\t\t\tself.send( 'loading-failed' );\n\t\t\t\tif ( 'redirect' === reason && location ) {\n\t\t\t\t\tself.previewUrl( location );\n\t\t\t\t}\n\n\t\t\t\tif ( 'logged out' === reason ) {\n\t\t\t\t\tif ( self.preview ) {\n\t\t\t\t\t\tself.preview.destroy();\n\t\t\t\t\t\tdelete self.preview;\n\t\t\t\t\t}\n\n\t\t\t\t\tself.login().done( self.refresh );\n\t\t\t\t}\n\n\t\t\t\tif ( 'cheatin' === reason ) {\n\t\t\t\t\tself.cheatin();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tlogin: function() {\n\t\t\tvar previewer = this,\n\t\t\t\tdeferred, messenger, iframe;\n\n\t\t\tif ( this._login )\n\t\t\t\treturn this._login;\n\n\t\t\tdeferred = $.Deferred();\n\t\t\tthis._login = deferred.promise();\n\n\t\t\tmessenger = new api.Messenger({\n\t\t\t\tchannel: 'login',\n\t\t\t\turl:     api.settings.url.login\n\t\t\t});\n\n\t\t\tiframe = $( '<iframe />', { 'src': api.settings.url.login, 'title': api.l10n.loginIframeTitle } ).appendTo( this.container );\n\n\t\t\tmessenger.targetWindow( iframe[0].contentWindow );\n\n\t\t\tmessenger.bind( 'login', function () {\n\t\t\t\tvar refreshNonces = previewer.refreshNonces();\n\n\t\t\t\trefreshNonces.always( function() {\n\t\t\t\t\tiframe.remove();\n\t\t\t\t\tmessenger.destroy();\n\t\t\t\t\tdelete previewer._login;\n\t\t\t\t});\n\n\t\t\t\trefreshNonces.done( function() {\n\t\t\t\t\tdeferred.resolve();\n\t\t\t\t});\n\n\t\t\t\trefreshNonces.fail( function() {\n\t\t\t\t\tpreviewer.cheatin();\n\t\t\t\t\tdeferred.reject();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn this._login;\n\t\t},\n\n\t\tcheatin: function() {\n\t\t\t$( document.body ).empty().addClass( 'cheatin' ).append(\n\t\t\t\t'<h1>' + api.l10n.cheatin + '</h1>' +\n\t\t\t\t'<p>' + api.l10n.notAllowed + '</p>'\n\t\t\t);\n\t\t},\n\n\t\trefreshNonces: function() {\n\t\t\tvar request, deferred = $.Deferred();\n\n\t\t\tdeferred.promise();\n\n\t\t\trequest = wp.ajax.post( 'customize_refresh_nonces', {\n\t\t\t\twp_customize: 'on',\n\t\t\t\ttheme: api.settings.theme.stylesheet\n\t\t\t});\n\n\t\t\trequest.done( function( response ) {\n\t\t\t\tapi.trigger( 'nonce-refresh', response );\n\t\t\t\tdeferred.resolve();\n\t\t\t});\n\n\t\t\trequest.fail( function() {\n\t\t\t\tdeferred.reject();\n\t\t\t});\n\n\t\t\treturn deferred;\n\t\t}\n\t});\n\n\tapi.controlConstructor = {\n\t\tcolor:         api.ColorControl,\n\t\tmedia:         api.MediaControl,\n\t\tupload:        api.UploadControl,\n\t\timage:         api.ImageControl,\n\t\tcropped_image: api.CroppedImageControl,\n\t\tsite_icon:     api.SiteIconControl,\n\t\theader:        api.HeaderControl,\n\t\tbackground:    api.BackgroundControl,\n\t\ttheme:         api.ThemeControl\n\t};\n\tapi.panelConstructor = {};\n\tapi.sectionConstructor = {\n\t\tthemes: api.ThemesSection\n\t};\n\n\t$( function() {\n\t\tapi.settings = window._wpCustomizeSettings;\n\t\tapi.l10n = window._wpCustomizeControlsL10n;\n\n\t\t// Check if we can run the Customizer.\n\t\tif ( ! api.settings ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Bail if any incompatibilities are found.\n\t\tif ( ! $.support.postMessage || ( ! $.support.cors && api.settings.isCrossDomain ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar parent, topFocus,\n\t\t\tbody = $( document.body ),\n\t\t\toverlay = body.children( '.wp-full-overlay' ),\n\t\t\ttitle = $( '#customize-info .panel-title.site-title' ),\n\t\t\tcloseBtn = $( '.customize-controls-close' ),\n\t\t\tsaveBtn = $( '#save' );\n\n\t\t// Prevent the form from saving when enter is pressed on an input or select element.\n\t\t$('#customize-controls').on( 'keydown', function( e ) {\n\t\t\tvar isEnter = ( 13 === e.which ),\n\t\t\t\t$el = $( e.target );\n\n\t\t\tif ( isEnter && ( $el.is( 'input:not([type=button])' ) || $el.is( 'select' ) ) ) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t});\n\n\t\t// Expand/Collapse the main customizer customize info.\n\t\t$( '.customize-info' ).find( '> .accordion-section-title .customize-help-toggle' ).on( 'click keydown', function( event ) {\n\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tevent.preventDefault(); // Keep this AFTER the key filter above\n\n\t\t\tvar section = $( this ).closest( '.accordion-section' ),\n\t\t\t\tcontent = section.find( '.customize-panel-description:first' );\n\n\t\t\tif ( section.hasClass( 'cannot-expand' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( section.hasClass( 'open' ) ) {\n\t\t\t\tsection.toggleClass( 'open' );\n\t\t\t\tcontent.slideUp( api.Panel.prototype.defaultExpandedArguments.duration );\n\t\t\t\t$( this ).attr( 'aria-expanded', false );\n\t\t\t} else {\n\t\t\t\tcontent.slideDown( api.Panel.prototype.defaultExpandedArguments.duration );\n\t\t\t\tsection.toggleClass( 'open' );\n\t\t\t\t$( this ).attr( 'aria-expanded', true );\n\t\t\t}\n\t\t});\n\n\t\t// Initialize Previewer\n\t\tapi.previewer = new api.Previewer({\n\t\t\tcontainer:   '#customize-preview',\n\t\t\tform:        '#customize-controls',\n\t\t\tpreviewUrl:  api.settings.url.preview,\n\t\t\tallowedUrls: api.settings.url.allowed,\n\t\t\tsignature:   'WP_CUSTOMIZER_SIGNATURE'\n\t\t}, {\n\n\t\t\tnonce: api.settings.nonce,\n\n\t\t\t/**\n\t\t\t * Build the query to send along with the Preview request.\n\t\t\t *\n\t\t\t * @return {object}\n\t\t\t */\n\t\t\tquery: function() {\n\t\t\t\tvar dirtyCustomized = {};\n\t\t\t\tapi.each( function ( value, key ) {\n\t\t\t\t\tif ( value._dirty ) {\n\t\t\t\t\t\tdirtyCustomized[ key ] = value();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\treturn {\n\t\t\t\t\twp_customize: 'on',\n\t\t\t\t\ttheme:      api.settings.theme.stylesheet,\n\t\t\t\t\tcustomized: JSON.stringify( dirtyCustomized ),\n\t\t\t\t\tnonce:      this.nonce.preview\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tsave: function() {\n\t\t\t\tvar self = this,\n\t\t\t\t\tprocessing = api.state( 'processing' ),\n\t\t\t\t\tsubmitWhenDoneProcessing,\n\t\t\t\t\tsubmit;\n\n\t\t\t\tbody.addClass( 'saving' );\n\n\t\t\t\tsubmit = function () {\n\t\t\t\t\tvar request, query;\n\t\t\t\t\tquery = $.extend( self.query(), {\n\t\t\t\t\t\tnonce:  self.nonce.save\n\t\t\t\t\t} );\n\t\t\t\t\trequest = wp.ajax.post( 'customize_save', query );\n\n\t\t\t\t\tapi.trigger( 'save', request );\n\n\t\t\t\t\trequest.always( function () {\n\t\t\t\t\t\tbody.removeClass( 'saving' );\n\t\t\t\t\t} );\n\n\t\t\t\t\trequest.fail( function ( response ) {\n\t\t\t\t\t\tif ( '0' === response ) {\n\t\t\t\t\t\t\tresponse = 'not_logged_in';\n\t\t\t\t\t\t} else if ( '-1' === response ) {\n\t\t\t\t\t\t\t// Back-compat in case any other check_ajax_referer() call is dying\n\t\t\t\t\t\t\tresponse = 'invalid_nonce';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( 'invalid_nonce' === response ) {\n\t\t\t\t\t\t\tself.cheatin();\n\t\t\t\t\t\t} else if ( 'not_logged_in' === response ) {\n\t\t\t\t\t\t\tself.preview.iframe.hide();\n\t\t\t\t\t\t\tself.login().done( function() {\n\t\t\t\t\t\t\t\tself.save();\n\t\t\t\t\t\t\t\tself.preview.iframe.show();\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tapi.trigger( 'error', response );\n\t\t\t\t\t} );\n\n\t\t\t\t\trequest.done( function( response ) {\n\t\t\t\t\t\t// Clear setting dirty states\n\t\t\t\t\t\tapi.each( function ( value ) {\n\t\t\t\t\t\t\tvalue._dirty = false;\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tapi.trigger( 'saved', response );\n\t\t\t\t\t} );\n\t\t\t\t};\n\n\t\t\t\tif ( 0 === processing() ) {\n\t\t\t\t\tsubmit();\n\t\t\t\t} else {\n\t\t\t\t\tsubmitWhenDoneProcessing = function () {\n\t\t\t\t\t\tif ( 0 === processing() ) {\n\t\t\t\t\t\t\tapi.state.unbind( 'change', submitWhenDoneProcessing );\n\t\t\t\t\t\t\tsubmit();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tapi.state.bind( 'change', submitWhenDoneProcessing );\n\t\t\t\t}\n\n\t\t\t}\n\t\t});\n\n\t\t// Refresh the nonces if the preview sends updated nonces over.\n\t\tapi.previewer.bind( 'nonce', function( nonce ) {\n\t\t\t$.extend( this.nonce, nonce );\n\t\t});\n\n\t\t// Refresh the nonces if login sends updated nonces over.\n\t\tapi.bind( 'nonce-refresh', function( nonce ) {\n\t\t\t$.extend( api.settings.nonce, nonce );\n\t\t\t$.extend( api.previewer.nonce, nonce );\n\t\t});\n\n\t\t// Create Settings\n\t\t$.each( api.settings.settings, function( id, data ) {\n\t\t\tapi.create( id, id, data.value, {\n\t\t\t\ttransport: data.transport,\n\t\t\t\tpreviewer: api.previewer,\n\t\t\t\tdirty: !! data.dirty\n\t\t\t} );\n\t\t});\n\n\t\t// Create Panels\n\t\t$.each( api.settings.panels, function ( id, data ) {\n\t\t\tvar constructor = api.panelConstructor[ data.type ] || api.Panel,\n\t\t\t\tpanel;\n\n\t\t\tpanel = new constructor( id, {\n\t\t\t\tparams: data\n\t\t\t} );\n\t\t\tapi.panel.add( id, panel );\n\t\t});\n\n\t\t// Create Sections\n\t\t$.each( api.settings.sections, function ( id, data ) {\n\t\t\tvar constructor = api.sectionConstructor[ data.type ] || api.Section,\n\t\t\t\tsection;\n\n\t\t\tsection = new constructor( id, {\n\t\t\t\tparams: data\n\t\t\t} );\n\t\t\tapi.section.add( id, section );\n\t\t});\n\n\t\t// Create Controls\n\t\t$.each( api.settings.controls, function( id, data ) {\n\t\t\tvar constructor = api.controlConstructor[ data.type ] || api.Control,\n\t\t\t\tcontrol;\n\n\t\t\tcontrol = new constructor( id, {\n\t\t\t\tparams: data,\n\t\t\t\tpreviewer: api.previewer\n\t\t\t} );\n\t\t\tapi.control.add( id, control );\n\t\t});\n\n\t\t// Focus the autofocused element\n\t\t_.each( [ 'panel', 'section', 'control' ], function ( type ) {\n\t\t\tvar instance, id = api.settings.autofocus[ type ];\n\t\t\tif ( id && api[ type ]( id ) ) {\n\t\t\t\tinstance = api[ type ]( id );\n\t\t\t\t// Wait until the element is embedded in the DOM\n\t\t\t\tinstance.deferred.embedded.done( function () {\n\t\t\t\t\t// Wait until the preview has activated and so active panels, sections, controls have been set\n\t\t\t\t\tapi.previewer.deferred.active.done( function () {\n\t\t\t\t\t\tinstance.focus();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Sort panels, sections, controls by priorities. Hide empty sections and panels.\n\t\t *\n\t\t * @since 4.1.0\n\t\t */\n\t\tapi.reflowPaneContents = _.bind( function () {\n\n\t\t\tvar appendContainer, activeElement, rootContainers, rootNodes = [], wasReflowed = false;\n\n\t\t\tif ( document.activeElement ) {\n\t\t\t\tactiveElement = $( document.activeElement );\n\t\t\t}\n\n\t\t\t// Sort the sections within each panel\n\t\t\tapi.panel.each( function ( panel ) {\n\t\t\t\tvar sections = panel.sections(),\n\t\t\t\t\tsectionContainers = _.pluck( sections, 'container' );\n\t\t\t\trootNodes.push( panel );\n\t\t\t\tappendContainer = panel.container.find( 'ul:first' );\n\t\t\t\tif ( ! api.utils.areElementListsEqual( sectionContainers, appendContainer.children( '[id]' ) ) ) {\n\t\t\t\t\t_( sections ).each( function ( section ) {\n\t\t\t\t\t\tappendContainer.append( section.container );\n\t\t\t\t\t} );\n\t\t\t\t\twasReflowed = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Sort the controls within each section\n\t\t\tapi.section.each( function ( section ) {\n\t\t\t\tvar controls = section.controls(),\n\t\t\t\t\tcontrolContainers = _.pluck( controls, 'container' );\n\t\t\t\tif ( ! section.panel() ) {\n\t\t\t\t\trootNodes.push( section );\n\t\t\t\t}\n\t\t\t\tappendContainer = section.container.find( 'ul:first' );\n\t\t\t\tif ( ! api.utils.areElementListsEqual( controlContainers, appendContainer.children( '[id]' ) ) ) {\n\t\t\t\t\t_( controls ).each( function ( control ) {\n\t\t\t\t\t\tappendContainer.append( control.container );\n\t\t\t\t\t} );\n\t\t\t\t\twasReflowed = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Sort the root panels and sections\n\t\t\trootNodes.sort( api.utils.prioritySort );\n\t\t\trootContainers = _.pluck( rootNodes, 'container' );\n\t\t\tappendContainer = $( '#customize-theme-controls' ).children( 'ul' ); // @todo This should be defined elsewhere, and to be configurable\n\t\t\tif ( ! api.utils.areElementListsEqual( rootContainers, appendContainer.children() ) ) {\n\t\t\t\t_( rootNodes ).each( function ( rootNode ) {\n\t\t\t\t\tappendContainer.append( rootNode.container );\n\t\t\t\t} );\n\t\t\t\twasReflowed = true;\n\t\t\t}\n\n\t\t\t// Now re-trigger the active Value callbacks to that the panels and sections can decide whether they can be rendered\n\t\t\tapi.panel.each( function ( panel ) {\n\t\t\t\tvar value = panel.active();\n\t\t\t\tpanel.active.callbacks.fireWith( panel.active, [ value, value ] );\n\t\t\t} );\n\t\t\tapi.section.each( function ( section ) {\n\t\t\t\tvar value = section.active();\n\t\t\t\tsection.active.callbacks.fireWith( section.active, [ value, value ] );\n\t\t\t} );\n\n\t\t\t// Restore focus if there was a reflow and there was an active (focused) element\n\t\t\tif ( wasReflowed && activeElement ) {\n\t\t\t\tactiveElement.focus();\n\t\t\t}\n\t\t\tapi.trigger( 'pane-contents-reflowed' );\n\t\t}, api );\n\t\tapi.bind( 'ready', api.reflowPaneContents );\n\t\tapi.reflowPaneContents = _.debounce( api.reflowPaneContents, 100 );\n\t\t$( [ api.panel, api.section, api.control ] ).each( function ( i, values ) {\n\t\t\tvalues.bind( 'add', api.reflowPaneContents );\n\t\t\tvalues.bind( 'change', api.reflowPaneContents );\n\t\t\tvalues.bind( 'remove', api.reflowPaneContents );\n\t\t} );\n\n\t\t// Check if preview url is valid and load the preview frame.\n\t\tif ( api.previewer.previewUrl() ) {\n\t\t\tapi.previewer.refresh();\n\t\t} else {\n\t\t\tapi.previewer.previewUrl( api.settings.url.home );\n\t\t}\n\n\t\t// Save and activated states\n\t\t(function() {\n\t\t\tvar state = new api.Values(),\n\t\t\t\tsaved = state.create( 'saved' ),\n\t\t\t\tactivated = state.create( 'activated' ),\n\t\t\t\tprocessing = state.create( 'processing' );\n\n\t\t\tstate.bind( 'change', function() {\n\t\t\t\tif ( ! activated() ) {\n\t\t\t\t\tsaveBtn.val( api.l10n.activate ).prop( 'disabled', false );\n\t\t\t\t\tcloseBtn.find( '.screen-reader-text' ).text( api.l10n.cancel );\n\n\t\t\t\t} else if ( saved() ) {\n\t\t\t\t\tsaveBtn.val( api.l10n.saved ).prop( 'disabled', true );\n\t\t\t\t\tcloseBtn.find( '.screen-reader-text' ).text( api.l10n.close );\n\n\t\t\t\t} else {\n\t\t\t\t\tsaveBtn.val( api.l10n.save ).prop( 'disabled', false );\n\t\t\t\t\tcloseBtn.find( '.screen-reader-text' ).text( api.l10n.cancel );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Set default states.\n\t\t\tsaved( true );\n\t\t\tactivated( api.settings.theme.active );\n\t\t\tprocessing( 0 );\n\n\t\t\tapi.bind( 'change', function() {\n\t\t\t\tstate('saved').set( false );\n\t\t\t});\n\n\t\t\tapi.bind( 'saved', function() {\n\t\t\t\tstate('saved').set( true );\n\t\t\t\tstate('activated').set( true );\n\t\t\t});\n\n\t\t\tactivated.bind( function( to ) {\n\t\t\t\tif ( to )\n\t\t\t\t\tapi.trigger( 'activated' );\n\t\t\t});\n\n\t\t\t// Expose states to the API.\n\t\t\tapi.state = state;\n\t\t}());\n\n\t\t// Button bindings.\n\t\tsaveBtn.click( function( event ) {\n\t\t\tapi.previewer.save();\n\t\t\tevent.preventDefault();\n\t\t}).keydown( function( event ) {\n\t\t\tif ( 9 === event.which ) // tab\n\t\t\t\treturn;\n\t\t\tif ( 13 === event.which ) // enter\n\t\t\t\tapi.previewer.save();\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\tcloseBtn.keydown( function( event ) {\n\t\t\tif ( 9 === event.which ) // tab\n\t\t\t\treturn;\n\t\t\tif ( 13 === event.which ) // enter\n\t\t\t\tthis.click();\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t$( '.collapse-sidebar' ).on( 'click', function() {\n\t\t\tif ( 'true' === $( this ).attr( 'aria-expanded' ) ) {\n\t\t\t\t$( this ).attr({ 'aria-expanded': 'false', 'aria-label': api.l10n.expandSidebar });\n\t\t\t} else {\n\t\t\t\t$( this ).attr({ 'aria-expanded': 'true', 'aria-label': api.l10n.collapseSidebar });\n\t\t\t}\n\n\t\t\toverlay.toggleClass( 'collapsed' ).toggleClass( 'expanded' );\n\t\t});\n\n\t\t$( '.customize-controls-preview-toggle' ).on( 'click keydown', function( event ) {\n\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\toverlay.toggleClass( 'preview-only' );\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t// Bind site title display to the corresponding field.\n\t\tif ( title.length ) {\n\t\t\t$( '#customize-control-blogname input' ).on( 'input', function() {\n\t\t\t\ttitle.text( this.value );\n\t\t\t} );\n\t\t}\n\n\t\t/*\n\t\t * Create a postMessage connection with a parent frame,\n\t\t * in case the Customizer frame was opened with the Customize loader.\n\t\t *\n\t\t * @see wp.customize.Loader\n\t\t */\n\t\tparent = new api.Messenger({\n\t\t\turl: api.settings.url.parent,\n\t\t\tchannel: 'loader'\n\t\t});\n\n\t\t/*\n\t\t * If we receive a 'back' event, we're inside an iframe.\n\t\t * Send any clicks to the 'Return' link to the parent page.\n\t\t */\n\t\tparent.bind( 'back', function() {\n\t\t\tcloseBtn.on( 'click.customize-controls-close', function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tparent.send( 'close' );\n\t\t\t});\n\t\t});\n\n\t\t// Prompt user with AYS dialog if leaving the Customizer with unsaved changes\n\t\t$( window ).on( 'beforeunload', function () {\n\t\t\tif ( ! api.state( 'saved' )() ) {\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\toverlay.removeClass( 'customize-loading' );\n\t\t\t\t}, 1 );\n\t\t\t\treturn api.l10n.saveAlert;\n\t\t\t}\n\t\t} );\n\n\t\t// Pass events through to the parent.\n\t\t$.each( [ 'saved', 'change' ], function ( i, event ) {\n\t\t\tapi.bind( event, function() {\n\t\t\t\tparent.send( event );\n\t\t\t});\n\t\t} );\n\n\t\t/*\n\t\t * When activated, let the loader handle redirecting the page.\n\t\t * If no loader exists, redirect the page ourselves (if a url exists).\n\t\t */\n\t\tapi.bind( 'activated', function() {\n\t\t\tif ( parent.targetWindow() )\n\t\t\t\tparent.send( 'activated', api.settings.url.activated );\n\t\t\telse if ( api.settings.url.activated )\n\t\t\t\twindow.location = api.settings.url.activated;\n\t\t});\n\n\t\t// Pass titles to the parent\n\t\tapi.bind( 'title', function( newTitle ) {\n\t\t\tparent.send( 'title', newTitle );\n\t\t});\n\n\t\t// Initialize the connection with the parent frame.\n\t\tparent.send( 'ready' );\n\n\t\t// Control visibility for default controls\n\t\t$.each({\n\t\t\t'background_image': {\n\t\t\t\tcontrols: [ 'background_repeat', 'background_position_x', 'background_attachment' ],\n\t\t\t\tcallback: function( to ) { return !! to; }\n\t\t\t},\n\t\t\t'show_on_front': {\n\t\t\t\tcontrols: [ 'page_on_front', 'page_for_posts' ],\n\t\t\t\tcallback: function( to ) { return 'page' === to; }\n\t\t\t},\n\t\t\t'header_textcolor': {\n\t\t\t\tcontrols: [ 'header_textcolor' ],\n\t\t\t\tcallback: function( to ) { return 'blank' !== to; }\n\t\t\t}\n\t\t}, function( settingId, o ) {\n\t\t\tapi( settingId, function( setting ) {\n\t\t\t\t$.each( o.controls, function( i, controlId ) {\n\t\t\t\t\tapi.control( controlId, function( control ) {\n\t\t\t\t\t\tvar visibility = function( to ) {\n\t\t\t\t\t\t\tcontrol.container.toggle( o.callback( to ) );\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvisibility( setting.get() );\n\t\t\t\t\t\tsetting.bind( visibility );\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// Juggle the two controls that use header_textcolor\n\t\tapi.control( 'display_header_text', function( control ) {\n\t\t\tvar last = '';\n\n\t\t\tcontrol.elements[0].unsync( api( 'header_textcolor' ) );\n\n\t\t\tcontrol.element = new api.Element( control.container.find('input') );\n\t\t\tcontrol.element.set( 'blank' !== control.setting() );\n\n\t\t\tcontrol.element.bind( function( to ) {\n\t\t\t\tif ( ! to )\n\t\t\t\t\tlast = api( 'header_textcolor' ).get();\n\n\t\t\t\tcontrol.setting.set( to ? last : 'blank' );\n\t\t\t});\n\n\t\t\tcontrol.setting.bind( function( to ) {\n\t\t\t\tcontrol.element.set( 'blank' !== to );\n\t\t\t});\n\t\t});\n\n\t\t// Change previewed URL to the homepage when changing the page_on_front.\n\t\tapi( 'show_on_front', 'page_on_front', function( showOnFront, pageOnFront ) {\n\t\t\tvar updatePreviewUrl = function() {\n\t\t\t\tif ( showOnFront() === 'page' && parseInt( pageOnFront(), 10 ) > 0 ) {\n\t\t\t\t\tapi.previewer.previewUrl.set( api.settings.url.home );\n\t\t\t\t}\n\t\t\t};\n\t\t\tshowOnFront.bind( updatePreviewUrl );\n\t\t\tpageOnFront.bind( updatePreviewUrl );\n\t\t});\n\n\t\t// Change the previewed URL to the selected page when changing the page_for_posts.\n\t\tapi( 'page_for_posts', function( setting ) {\n\t\t\tsetting.bind(function( pageId ) {\n\t\t\t\tpageId = parseInt( pageId, 10 );\n\t\t\t\tif ( pageId > 0 ) {\n\t\t\t\t\tapi.previewer.previewUrl.set( api.settings.url.home + '?page_id=' + pageId );\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tapi.trigger( 'ready' );\n\n\t\t// Make sure left column gets focus\n\t\ttopFocus = closeBtn;\n\t\ttopFocus.focus();\n\t\tsetTimeout(function () {\n\t\t\ttopFocus.focus();\n\t\t}, 200);\n\n\t});\n\n})( wp, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/customize-nav-menus.js",
    "content": "/* global _wpCustomizeNavMenusSettings, wpNavMenu, console */\n( function( api, wp, $ ) {\n\t'use strict';\n\n\t/**\n\t * Set up wpNavMenu for drag and drop.\n\t */\n\twpNavMenu.originalInit = wpNavMenu.init;\n\twpNavMenu.options.menuItemDepthPerLevel = 20;\n\twpNavMenu.options.sortableItems         = '> .customize-control-nav_menu_item';\n\twpNavMenu.options.targetTolerance       = 10;\n\twpNavMenu.init = function() {\n\t\tthis.jQueryExtensions();\n\t};\n\n\tapi.Menus = api.Menus || {};\n\n\t// Link settings.\n\tapi.Menus.data = {\n\t\tnonce: '',\n\t\titemTypes: [],\n\t\tl10n: {},\n\t\tmenuItemTransport: 'postMessage',\n\t\tphpIntMax: 0,\n\t\tdefaultSettingValues: {\n\t\t\tnav_menu: {},\n\t\t\tnav_menu_item: {}\n\t\t}\n\t};\n\tif ( 'undefined' !== typeof _wpCustomizeNavMenusSettings ) {\n\t\t$.extend( api.Menus.data, _wpCustomizeNavMenusSettings );\n\t}\n\n\t/**\n\t * Newly-created Nav Menus and Nav Menu Items have negative integer IDs which\n\t * serve as placeholders until Save & Publish happens.\n\t *\n\t * @return {number}\n\t */\n\tapi.Menus.generatePlaceholderAutoIncrementId = function() {\n\t\treturn -Math.ceil( api.Menus.data.phpIntMax * Math.random() );\n\t};\n\n\t/**\n\t * wp.customize.Menus.AvailableItemModel\n\t *\n\t * A single available menu item model. See PHP's WP_Customize_Nav_Menu_Item_Setting class.\n\t *\n\t * @constructor\n\t * @augments Backbone.Model\n\t */\n\tapi.Menus.AvailableItemModel = Backbone.Model.extend( $.extend(\n\t\t{\n\t\t\tid: null // This is only used by Backbone.\n\t\t},\n\t\tapi.Menus.data.defaultSettingValues.nav_menu_item\n\t) );\n\n\t/**\n\t * wp.customize.Menus.AvailableItemCollection\n\t *\n\t * Collection for available menu item models.\n\t *\n\t * @constructor\n\t * @augments Backbone.Model\n\t */\n\tapi.Menus.AvailableItemCollection = Backbone.Collection.extend({\n\t\tmodel: api.Menus.AvailableItemModel,\n\n\t\tsort_key: 'order',\n\n\t\tcomparator: function( item ) {\n\t\t\treturn -item.get( this.sort_key );\n\t\t},\n\n\t\tsortByField: function( fieldName ) {\n\t\t\tthis.sort_key = fieldName;\n\t\t\tthis.sort();\n\t\t}\n\t});\n\tapi.Menus.availableMenuItems = new api.Menus.AvailableItemCollection( api.Menus.data.availableMenuItems );\n\n\t/**\n\t * wp.customize.Menus.AvailableMenuItemsPanelView\n\t *\n\t * View class for the available menu items panel.\n\t *\n\t * @constructor\n\t * @augments wp.Backbone.View\n\t * @augments Backbone.View\n\t */\n\tapi.Menus.AvailableMenuItemsPanelView = wp.Backbone.View.extend({\n\n\t\tel: '#available-menu-items',\n\n\t\tevents: {\n\t\t\t'input #menu-items-search': 'debounceSearch',\n\t\t\t'keyup #menu-items-search': 'debounceSearch',\n\t\t\t'focus .menu-item-tpl': 'focus',\n\t\t\t'click .menu-item-tpl': '_submit',\n\t\t\t'click #custom-menu-item-submit': '_submitLink',\n\t\t\t'keypress #custom-menu-item-name': '_submitLink',\n\t\t\t'keydown': 'keyboardAccessible'\n\t\t},\n\n\t\t// Cache current selected menu item.\n\t\tselected: null,\n\n\t\t// Cache menu control that opened the panel.\n\t\tcurrentMenuControl: null,\n\t\tdebounceSearch: null,\n\t\t$search: null,\n\t\tsearchTerm: '',\n\t\trendered: false,\n\t\tpages: {},\n\t\tsectionContent: '',\n\t\tloading: false,\n\n\t\tinitialize: function() {\n\t\t\tvar self = this;\n\n\t\t\tif ( ! api.panel.has( 'nav_menus' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$search = $( '#menu-items-search' );\n\t\t\tthis.sectionContent = this.$el.find( '.accordion-section-content' );\n\n\t\t\tthis.debounceSearch = _.debounce( self.search, 500 );\n\n\t\t\t_.bindAll( this, 'close' );\n\n\t\t\t// If the available menu items panel is open and the customize controls are\n\t\t\t// interacted with (other than an item being deleted), then close the\n\t\t\t// available menu items panel. Also close on back button click.\n\t\t\t$( '#customize-controls, .customize-section-back' ).on( 'click keydown', function( e ) {\n\t\t\t\tvar isDeleteBtn = $( e.target ).is( '.item-delete, .item-delete *' ),\n\t\t\t\t\tisAddNewBtn = $( e.target ).is( '.add-new-menu-item, .add-new-menu-item *' );\n\t\t\t\tif ( $( 'body' ).hasClass( 'adding-menu-items' ) && ! isDeleteBtn && ! isAddNewBtn ) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Clear the search results.\n\t\t\t$( '.clear-results' ).on( 'click keydown', function( event ) {\n\t\t\t\tif ( event.type === 'keydown' && ( 13 !== event.which && 32 !== event.which ) ) { // \"return\" or \"space\" keys only\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t$( '#menu-items-search' ).val( '' ).focus();\n\t\t\t\tevent.target.value = '';\n\t\t\t\tself.search( event );\n\t\t\t} );\n\n\t\t\tthis.$el.on( 'input', '#custom-menu-item-name.invalid, #custom-menu-item-url.invalid', function() {\n\t\t\t\t$( this ).removeClass( 'invalid' );\n\t\t\t});\n\n\t\t\t// Load available items if it looks like we'll need them.\n\t\t\tapi.panel( 'nav_menus' ).container.bind( 'expanded', function() {\n\t\t\t\tif ( ! self.rendered ) {\n\t\t\t\t\tself.initList();\n\t\t\t\t\tself.rendered = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Load more items.\n\t\t\tthis.sectionContent.scroll( function() {\n\t\t\t\tvar totalHeight = self.$el.find( '.accordion-section.open .accordion-section-content' ).prop( 'scrollHeight' ),\n\t\t\t\t\tvisibleHeight = self.$el.find( '.accordion-section.open' ).height();\n\n\t\t\t\tif ( ! self.loading && $( this ).scrollTop() > 3 / 4 * totalHeight - visibleHeight ) {\n\t\t\t\t\tvar type = $( this ).data( 'type' ),\n\t\t\t\t\t\tobject = $( this ).data( 'object' );\n\n\t\t\t\t\tif ( 'search' === type ) {\n\t\t\t\t\t\tif ( self.searchTerm ) {\n\t\t\t\t\t\t\tself.doSearch( self.pages.search );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.loadItems( type, object );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Close the panel if the URL in the preview changes\n\t\t\tapi.previewer.bind( 'url', this.close );\n\t\t},\n\n\t\t// Search input change handler.\n\t\tsearch: function( event ) {\n\t\t\tvar $searchSection = $( '#available-menu-items-search' ),\n\t\t\t\t$otherSections = $( '#available-menu-items .accordion-section' ).not( $searchSection );\n\n\t\t\tif ( ! event ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.searchTerm === event.target.value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( '' !== event.target.value && ! $searchSection.hasClass( 'open' ) ) {\n\t\t\t\t$otherSections.fadeOut( 100 );\n\t\t\t\t$searchSection.find( '.accordion-section-content' ).slideDown( 'fast' );\n\t\t\t\t$searchSection.addClass( 'open' );\n\t\t\t\t$searchSection.find( '.clear-results' )\n\t\t\t\t\t.prop( 'tabIndex', 0 )\n\t\t\t\t\t.addClass( 'is-visible' );\n\t\t\t} else if ( '' === event.target.value ) {\n\t\t\t\t$searchSection.removeClass( 'open' );\n\t\t\t\t$otherSections.show();\n\t\t\t\t$searchSection.find( '.clear-results' )\n\t\t\t\t\t.prop( 'tabIndex', -1 )\n\t\t\t\t\t.removeClass( 'is-visible' );\n\t\t\t}\n\t\t\t\n\t\t\tthis.searchTerm = event.target.value;\n\t\t\tthis.pages.search = 1;\n\t\t\tthis.doSearch( 1 );\n\t\t},\n\n\t\t// Get search results.\n\t\tdoSearch: function( page ) {\n\t\t\tvar self = this, params,\n\t\t\t\t$section = $( '#available-menu-items-search' ),\n\t\t\t\t$content = $section.find( '.accordion-section-content' ),\n\t\t\t\titemTemplate = wp.template( 'available-menu-item' );\n\n\t\t\tif ( self.currentRequest ) {\n\t\t\t\tself.currentRequest.abort();\n\t\t\t}\n\n\t\t\tif ( page < 0 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( page > 1 ) {\n\t\t\t\t$section.addClass( 'loading-more' );\n\t\t\t\t$content.attr( 'aria-busy', 'true' );\n\t\t\t\twp.a11y.speak( api.Menus.data.l10n.itemsLoadingMore );\n\t\t\t} else if ( '' === self.searchTerm ) {\n\t\t\t\t$content.html( '' );\n\t\t\t\twp.a11y.speak( '' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$section.addClass( 'loading' );\n\t\t\tself.loading = true;\n\t\t\tparams = {\n\t\t\t\t'customize-menus-nonce': api.Menus.data.nonce,\n\t\t\t\t'wp_customize': 'on',\n\t\t\t\t'search': self.searchTerm,\n\t\t\t\t'page': page\n\t\t\t};\n\n\t\t\tself.currentRequest = wp.ajax.post( 'search-available-menu-items-customizer', params );\n\n\t\t\tself.currentRequest.done(function( data ) {\n\t\t\t\tvar items;\n\t\t\t\tif ( 1 === page ) {\n\t\t\t\t\t// Clear previous results as it's a new search.\n\t\t\t\t\t$content.empty();\n\t\t\t\t}\n\t\t\t\t$section.removeClass( 'loading loading-more' );\n\t\t\t\t$content.attr( 'aria-busy', 'false' );\n\t\t\t\t$section.addClass( 'open' );\n\t\t\t\tself.loading = false;\n\t\t\t\titems = new api.Menus.AvailableItemCollection( data.items );\n\t\t\t\tself.collection.add( items.models );\n\t\t\t\titems.each( function( menuItem ) {\n\t\t\t\t\t$content.append( itemTemplate( menuItem.attributes ) );\n\t\t\t\t} );\n\t\t\t\tif ( 20 > items.length ) {\n\t\t\t\t\tself.pages.search = -1; // Up to 20 posts and 20 terms in results, if <20, no more results for either.\n\t\t\t\t} else {\n\t\t\t\t\tself.pages.search = self.pages.search + 1;\n\t\t\t\t}\n\t\t\t\tif ( items && page > 1 ) {\n\t\t\t\t\twp.a11y.speak( api.Menus.data.l10n.itemsFoundMore.replace( '%d', items.length ) );\n\t\t\t\t} else if ( items && page === 1 ) {\n\t\t\t\t\twp.a11y.speak( api.Menus.data.l10n.itemsFound.replace( '%d', items.length ) );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tself.currentRequest.fail(function( data ) {\n\t\t\t\t// data.message may be undefined, for example when typing slow and the request is aborted.\n\t\t\t\tif ( data.message ) {\n\t\t\t\t\t$content.empty().append( $( '<p class=\"nothing-found\"></p>' ).text( data.message ) );\n\t\t\t\t\twp.a11y.speak( data.message );\n\t\t\t\t}\n\t\t\t\tself.pages.search = -1;\n\t\t\t});\n\n\t\t\tself.currentRequest.always(function() {\n\t\t\t\t$section.removeClass( 'loading loading-more' );\n\t\t\t\t$content.attr( 'aria-busy', 'false' );\n\t\t\t\tself.loading = false;\n\t\t\t\tself.currentRequest = null;\n\t\t\t});\n\t\t},\n\n\t\t// Render the individual items.\n\t\tinitList: function() {\n\t\t\tvar self = this;\n\n\t\t\t// Render the template for each item by type.\n\t\t\t_.each( api.Menus.data.itemTypes, function( itemType ) {\n\t\t\t\tself.pages[ itemType.type + ':' + itemType.object ] = 0;\n\t\t\t\tself.loadItems( itemType.type, itemType.object ); // @todo we need to combine these Ajax requests.\n\t\t\t} );\n\t\t},\n\n\t\t// Load available menu items.\n\t\tloadItems: function( type, object ) {\n\t\t\tvar self = this, params, request, itemTemplate, availableMenuItemContainer;\n\t\t\titemTemplate = wp.template( 'available-menu-item' );\n\n\t\t\tif ( -1 === self.pages[ type + ':' + object ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tavailableMenuItemContainer = $( '#available-menu-items-' + type + '-' + object );\n\t\t\tavailableMenuItemContainer.find( '.accordion-section-title' ).addClass( 'loading' );\n\t\t\tself.loading = true;\n\t\t\tparams = {\n\t\t\t\t'customize-menus-nonce': api.Menus.data.nonce,\n\t\t\t\t'wp_customize': 'on',\n\t\t\t\t'type': type,\n\t\t\t\t'object': object,\n\t\t\t\t'page': self.pages[ type + ':' + object ]\n\t\t\t};\n\t\t\trequest = wp.ajax.post( 'load-available-menu-items-customizer', params );\n\n\t\t\trequest.done(function( data ) {\n\t\t\t\tvar items, typeInner;\n\t\t\t\titems = data.items;\n\t\t\t\tif ( 0 === items.length ) {\n\t\t\t\t\tif ( 0 === self.pages[ type + ':' + object ] ) {\n\t\t\t\t\t\tavailableMenuItemContainer\n\t\t\t\t\t\t\t.addClass( 'cannot-expand' )\n\t\t\t\t\t\t\t.removeClass( 'loading' )\n\t\t\t\t\t\t\t.find( '.accordion-section-title > button' )\n\t\t\t\t\t\t\t.prop( 'tabIndex', -1 );\n\t\t\t\t\t}\n\t\t\t\t\tself.pages[ type + ':' + object ] = -1;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\titems = new api.Menus.AvailableItemCollection( items ); // @todo Why is this collection created and then thrown away?\n\t\t\t\tself.collection.add( items.models );\n\t\t\t\ttypeInner = availableMenuItemContainer.find( '.accordion-section-content' );\n\t\t\t\titems.each(function( menuItem ) {\n\t\t\t\t\ttypeInner.append( itemTemplate( menuItem.attributes ) );\n\t\t\t\t});\n\t\t\t\tself.pages[ type + ':' + object ] += 1;\n\t\t\t});\n\t\t\trequest.fail(function( data ) {\n\t\t\t\tif ( typeof console !== 'undefined' && console.error ) {\n\t\t\t\t\tconsole.error( data );\n\t\t\t\t}\n\t\t\t});\n\t\t\trequest.always(function() {\n\t\t\t\tavailableMenuItemContainer.find( '.accordion-section-title' ).removeClass( 'loading' );\n\t\t\t\tself.loading = false;\n\t\t\t});\n\t\t},\n\n\t\t// Adjust the height of each section of items to fit the screen.\n\t\titemSectionHeight: function() {\n\t\t\tvar sections, totalHeight, accordionHeight, diff;\n\t\t\ttotalHeight = window.innerHeight;\n\t\t\tsections = this.$el.find( '.accordion-section:not( #available-menu-items-search ) .accordion-section-content' );\n\t\t\taccordionHeight =  46 * ( 2 + sections.length ) - 13; // Magic numbers.\n\t\t\tdiff = totalHeight - accordionHeight;\n\t\t\tif ( 120 < diff && 290 > diff ) {\n\t\t\t\tsections.css( 'max-height', diff );\n\t\t\t}\n\t\t},\n\n\t\t// Highlights a menu item.\n\t\tselect: function( menuitemTpl ) {\n\t\t\tthis.selected = $( menuitemTpl );\n\t\t\tthis.selected.siblings( '.menu-item-tpl' ).removeClass( 'selected' );\n\t\t\tthis.selected.addClass( 'selected' );\n\t\t},\n\n\t\t// Highlights a menu item on focus.\n\t\tfocus: function( event ) {\n\t\t\tthis.select( $( event.currentTarget ) );\n\t\t},\n\n\t\t// Submit handler for keypress and click on menu item.\n\t\t_submit: function( event ) {\n\t\t\t// Only proceed with keypress if it is Enter or Spacebar\n\t\t\tif ( 'keypress' === event.type && ( 13 !== event.which && 32 !== event.which ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.submit( $( event.currentTarget ) );\n\t\t},\n\n\t\t// Adds a selected menu item to the menu.\n\t\tsubmit: function( menuitemTpl ) {\n\t\t\tvar menuitemId, menu_item;\n\n\t\t\tif ( ! menuitemTpl ) {\n\t\t\t\tmenuitemTpl = this.selected;\n\t\t\t}\n\n\t\t\tif ( ! menuitemTpl || ! this.currentMenuControl ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.select( menuitemTpl );\n\n\t\t\tmenuitemId = $( this.selected ).data( 'menu-item-id' );\n\t\t\tmenu_item = this.collection.findWhere( { id: menuitemId } );\n\t\t\tif ( ! menu_item ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.currentMenuControl.addItemToMenu( menu_item.attributes );\n\n\t\t\t$( menuitemTpl ).find( '.menu-item-handle' ).addClass( 'item-added' );\n\t\t},\n\n\t\t// Submit handler for keypress and click on custom menu item.\n\t\t_submitLink: function( event ) {\n\t\t\t// Only proceed with keypress if it is Enter.\n\t\t\tif ( 'keypress' === event.type && 13 !== event.which ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.submitLink();\n\t\t},\n\n\t\t// Adds the custom menu item to the menu.\n\t\tsubmitLink: function() {\n\t\t\tvar menuItem,\n\t\t\t\titemName = $( '#custom-menu-item-name' ),\n\t\t\t\titemUrl = $( '#custom-menu-item-url' );\n\n\t\t\tif ( ! this.currentMenuControl ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( '' === itemName.val() ) {\n\t\t\t\titemName.addClass( 'invalid' );\n\t\t\t\treturn;\n\t\t\t} else if ( '' === itemUrl.val() || 'http://' === itemUrl.val() ) {\n\t\t\t\titemUrl.addClass( 'invalid' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmenuItem = {\n\t\t\t\t'title': itemName.val(),\n\t\t\t\t'url': itemUrl.val(),\n\t\t\t\t'type': 'custom',\n\t\t\t\t'type_label': api.Menus.data.l10n.custom_label,\n\t\t\t\t'object': ''\n\t\t\t};\n\n\t\t\tthis.currentMenuControl.addItemToMenu( menuItem );\n\n\t\t\t// Reset the custom link form.\n\t\t\titemUrl.val( 'http://' );\n\t\t\titemName.val( '' );\n\t\t},\n\n\t\t// Opens the panel.\n\t\topen: function( menuControl ) {\n\t\t\tthis.currentMenuControl = menuControl;\n\n\t\t\tthis.itemSectionHeight();\n\n\t\t\t$( 'body' ).addClass( 'adding-menu-items' );\n\n\t\t\t// Collapse all controls.\n\t\t\t_( this.currentMenuControl.getMenuItemControls() ).each( function( control ) {\n\t\t\t\tcontrol.collapseForm();\n\t\t\t} );\n\n\t\t\tthis.$el.find( '.selected' ).removeClass( 'selected' );\n\n\t\t\tthis.$search.focus();\n\t\t},\n\n\t\t// Closes the panel\n\t\tclose: function( options ) {\n\t\t\toptions = options || {};\n\n\t\t\tif ( options.returnFocus && this.currentMenuControl ) {\n\t\t\t\tthis.currentMenuControl.container.find( '.add-new-menu-item' ).focus();\n\t\t\t}\n\n\t\t\tthis.currentMenuControl = null;\n\t\t\tthis.selected = null;\n\n\t\t\t$( 'body' ).removeClass( 'adding-menu-items' );\n\t\t\t$( '#available-menu-items .menu-item-handle.item-added' ).removeClass( 'item-added' );\n\n\t\t\tthis.$search.val( '' );\n\t\t},\n\n\t\t// Add a few keyboard enhancements to the panel.\n\t\tkeyboardAccessible: function( event ) {\n\t\t\tvar isEnter = ( 13 === event.which ),\n\t\t\t\tisEsc = ( 27 === event.which ),\n\t\t\t\tisBackTab = ( 9 === event.which && event.shiftKey ),\n\t\t\t\tisSearchFocused = $( event.target ).is( this.$search );\n\n\t\t\t// If enter pressed but nothing entered, don't do anything\n\t\t\tif ( isEnter && ! this.$search.val() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isSearchFocused && isBackTab ) {\n\t\t\t\tthis.currentMenuControl.container.find( '.add-new-menu-item' ).focus();\n\t\t\t\tevent.preventDefault(); // Avoid additional back-tab.\n\t\t\t} else if ( isEsc ) {\n\t\t\t\tthis.close( { returnFocus: true } );\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * wp.customize.Menus.MenusPanel\n\t *\n\t * Customizer panel for menus. This is used only for screen options management.\n\t * Note that 'menus' must match the WP_Customize_Menu_Panel::$type.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Panel\n\t */\n\tapi.Menus.MenusPanel = api.Panel.extend({\n\n\t\tattachEvents: function() {\n\t\t\tapi.Panel.prototype.attachEvents.call( this );\n\n\t\t\tvar panel = this,\n\t\t\t\tpanelMeta = panel.container.find( '.panel-meta' ),\n\t\t\t\thelp = panelMeta.find( '.customize-help-toggle' ),\n\t\t\t\tcontent = panelMeta.find( '.customize-panel-description' ),\n\t\t\t\toptions = $( '#screen-options-wrap' ),\n\t\t\t\tbutton = panelMeta.find( '.customize-screen-options-toggle' );\n\t\t\tbutton.on( 'click keydown', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// Hide description\n\t\t\t\tif ( content.not( ':hidden' ) ) {\n\t\t\t\t\tcontent.slideUp( 'fast' );\n\t\t\t\t\thelp.attr( 'aria-expanded', 'false' );\n\t\t\t\t}\n\n\t\t\t\tif ( 'true' === button.attr( 'aria-expanded' ) ) {\n\t\t\t\t\tbutton.attr( 'aria-expanded', 'false' );\n\t\t\t\t\tpanelMeta.removeClass( 'open' );\n\t\t\t\t\tpanelMeta.removeClass( 'active-menu-screen-options' );\n\t\t\t\t\toptions.slideUp( 'fast' );\n\t\t\t\t} else {\n\t\t\t\t\tbutton.attr( 'aria-expanded', 'true' );\n\t\t\t\t\tpanelMeta.addClass( 'open' );\n\t\t\t\t\tpanelMeta.addClass( 'active-menu-screen-options' );\n\t\t\t\t\toptions.slideDown( 'fast' );\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t} );\n\n\t\t\t// Help toggle\n\t\t\thelp.on( 'click keydown', function( event ) {\n\t\t\t\tif ( api.utils.isKeydownButNotEnterEvent( event ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif ( 'true' === button.attr( 'aria-expanded' ) ) {\n\t\t\t\t\tbutton.attr( 'aria-expanded', 'false' );\n\t\t\t\t\thelp.attr( 'aria-expanded', 'true' );\n\t\t\t\t\tpanelMeta.addClass( 'open' );\n\t\t\t\t\tpanelMeta.removeClass( 'active-menu-screen-options' );\n\t\t\t\t\toptions.slideUp( 'fast' );\n\t\t\t\t\tcontent.slideDown( 'fast' );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Show/hide/save screen options (columns). From common.js.\n\t\t */\n\t\tready: function() {\n\t\t\tvar panel = this;\n\t\t\tthis.container.find( '.hide-column-tog' ).click( function() {\n\t\t\t\tvar $t = $( this ), column = $t.val();\n\t\t\t\tif ( $t.prop( 'checked' ) ) {\n\t\t\t\t\tpanel.checked( column );\n\t\t\t\t} else {\n\t\t\t\t\tpanel.unchecked( column );\n\t\t\t\t}\n\n\t\t\t\tpanel.saveManageColumnsState();\n\t\t\t});\n\t\t\tthis.container.find( '.hide-column-tog' ).each( function() {\n\t\t\tvar $t = $( this ), column = $t.val();\n\t\t\t\tif ( $t.prop( 'checked' ) ) {\n\t\t\t\t\tpanel.checked( column );\n\t\t\t\t} else {\n\t\t\t\t\tpanel.unchecked( column );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tsaveManageColumnsState: function() {\n\t\t\tvar hidden = this.hidden();\n\t\t\t$.post( wp.ajax.settings.url, {\n\t\t\t\taction: 'hidden-columns',\n\t\t\t\thidden: hidden,\n\t\t\t\tscreenoptionnonce: $( '#screenoptionnonce' ).val(),\n\t\t\t\tpage: 'nav-menus'\n\t\t\t});\n\t\t},\n\n\t\tchecked: function( column ) {\n\t\t\tthis.container.addClass( 'field-' + column + '-active' );\n\t\t},\n\n\t\tunchecked: function( column ) {\n\t\t\tthis.container.removeClass( 'field-' + column + '-active' );\n\t\t},\n\n\t\thidden: function() {\n\t\t\tthis.hidden = function() {\n\t\t\t\treturn $( '.hide-column-tog' ).not( ':checked' ).map( function() {\n\t\t\t\t\tvar id = this.id;\n\t\t\t\t\treturn id.substring( id, id.length - 5 );\n\t\t\t\t}).get().join( ',' );\n\t\t\t};\n\t\t}\n\t} );\n\n\t/**\n\t * wp.customize.Menus.MenuSection\n\t *\n\t * Customizer section for menus. This is used only for lazy-loading child controls.\n\t * Note that 'nav_menu' must match the WP_Customize_Menu_Section::$type.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Section\n\t */\n\tapi.Menus.MenuSection = api.Section.extend({\n\n\t\t/**\n\t\t * @since Menu Customizer 0.3\n\t\t *\n\t\t * @param {String} id\n\t\t * @param {Object} options\n\t\t */\n\t\tinitialize: function( id, options ) {\n\t\t\tvar section = this;\n\t\t\tapi.Section.prototype.initialize.call( section, id, options );\n\t\t\tsection.deferred.initSortables = $.Deferred();\n\t\t},\n\n\t\t/**\n\t\t *\n\t\t */\n\t\tready: function() {\n\t\t\tvar section = this;\n\n\t\t\tif ( 'undefined' === typeof section.params.menu_id ) {\n\t\t\t\tthrow new Error( 'params.menu_id was not defined' );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Since newly created sections won't be registered in PHP, we need to prevent the\n\t\t\t * preview's sending of the activeSections to result in this control\n\t\t\t * being deactivated when the preview refreshes. So we can hook onto\n\t\t\t * the setting that has the same ID and its presence can dictate\n\t\t\t * whether the section is active.\n\t\t\t */\n\t\t\tsection.active.validate = function() {\n\t\t\t\tif ( ! api.has( section.id ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn !! api( section.id ).get();\n\t\t\t};\n\n\t\t\tsection.populateControls();\n\n\t\t\tsection.navMenuLocationSettings = {};\n\t\t\tsection.assignedLocations = new api.Value( [] );\n\n\t\t\tapi.each(function( setting, id ) {\n\t\t\t\tvar matches = id.match( /^nav_menu_locations\\[(.+?)]/ );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tsection.navMenuLocationSettings[ matches[1] ] = setting;\n\t\t\t\t\tsetting.bind( function() {\n\t\t\t\t\t\tsection.refreshAssignedLocations();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsection.assignedLocations.bind(function( to ) {\n\t\t\t\tsection.updateAssignedLocationsInSectionTitle( to );\n\t\t\t});\n\n\t\t\tsection.refreshAssignedLocations();\n\n\t\t\tapi.bind( 'pane-contents-reflowed', function() {\n\t\t\t\t// Skip menus that have been removed.\n\t\t\t\tif ( ! section.container.parent().length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsection.container.find( '.menu-item .menu-item-reorder-nav button' ).attr({ 'tabindex': '0', 'aria-hidden': 'false' });\n\t\t\t\tsection.container.find( '.menu-item.move-up-disabled .menus-move-up' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' });\n\t\t\t\tsection.container.find( '.menu-item.move-down-disabled .menus-move-down' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' });\n\t\t\t\tsection.container.find( '.menu-item.move-left-disabled .menus-move-left' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' });\n\t\t\t\tsection.container.find( '.menu-item.move-right-disabled .menus-move-right' ).attr({ 'tabindex': '-1', 'aria-hidden': 'true' });\n\t\t\t} );\n\t\t},\n\n\t\tpopulateControls: function() {\n\t\t\tvar section = this, menuNameControlId, menuAutoAddControlId, menuControl, menuNameControl, menuAutoAddControl;\n\n\t\t\t// Add the control for managing the menu name.\n\t\t\tmenuNameControlId = section.id + '[name]';\n\t\t\tmenuNameControl = api.control( menuNameControlId );\n\t\t\tif ( ! menuNameControl ) {\n\t\t\t\tmenuNameControl = new api.controlConstructor.nav_menu_name( menuNameControlId, {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\ttype: 'nav_menu_name',\n\t\t\t\t\t\tcontent: '<li id=\"customize-control-' + section.id.replace( '[', '-' ).replace( ']', '' ) + '-name\" class=\"customize-control customize-control-nav_menu_name\"></li>', // @todo core should do this for us; see #30741\n\t\t\t\t\t\tlabel: api.Menus.data.l10n.menuNameLabel,\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tsection: section.id,\n\t\t\t\t\t\tpriority: 0,\n\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\t'default': section.id\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tapi.control.add( menuNameControl.id, menuNameControl );\n\t\t\t\tmenuNameControl.active.set( true );\n\t\t\t}\n\n\t\t\t// Add the menu control.\n\t\t\tmenuControl = api.control( section.id );\n\t\t\tif ( ! menuControl ) {\n\t\t\t\tmenuControl = new api.controlConstructor.nav_menu( section.id, {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\ttype: 'nav_menu',\n\t\t\t\t\t\tcontent: '<li id=\"customize-control-' + section.id.replace( '[', '-' ).replace( ']', '' ) + '\" class=\"customize-control customize-control-nav_menu\"></li>', // @todo core should do this for us; see #30741\n\t\t\t\t\t\tsection: section.id,\n\t\t\t\t\t\tpriority: 998,\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\t'default': section.id\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmenu_id: section.params.menu_id\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tapi.control.add( menuControl.id, menuControl );\n\t\t\t\tmenuControl.active.set( true );\n\t\t\t}\n\n\t\t\t// Add the control for managing the menu auto_add.\n\t\t\tmenuAutoAddControlId = section.id + '[auto_add]';\n\t\t\tmenuAutoAddControl = api.control( menuAutoAddControlId );\n\t\t\tif ( ! menuAutoAddControl ) {\n\t\t\t\tmenuAutoAddControl = new api.controlConstructor.nav_menu_auto_add( menuAutoAddControlId, {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\ttype: 'nav_menu_auto_add',\n\t\t\t\t\t\tcontent: '<li id=\"customize-control-' + section.id.replace( '[', '-' ).replace( ']', '' ) + '-auto-add\" class=\"customize-control customize-control-nav_menu_auto_add\"></li>', // @todo core should do this for us\n\t\t\t\t\t\tlabel: '',\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tsection: section.id,\n\t\t\t\t\t\tpriority: 999,\n\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\t'default': section.id\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tapi.control.add( menuAutoAddControl.id, menuAutoAddControl );\n\t\t\t\tmenuAutoAddControl.active.set( true );\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t *\n\t\t */\n\t\trefreshAssignedLocations: function() {\n\t\t\tvar section = this,\n\t\t\t\tmenuTermId = section.params.menu_id,\n\t\t\t\tcurrentAssignedLocations = [];\n\t\t\t_.each( section.navMenuLocationSettings, function( setting, themeLocation ) {\n\t\t\t\tif ( setting() === menuTermId ) {\n\t\t\t\t\tcurrentAssignedLocations.push( themeLocation );\n\t\t\t\t}\n\t\t\t});\n\t\t\tsection.assignedLocations.set( currentAssignedLocations );\n\t\t},\n\n\t\t/**\n\t\t * @param {array} themeLocations\n\t\t */\n\t\tupdateAssignedLocationsInSectionTitle: function( themeLocations ) {\n\t\t\tvar section = this,\n\t\t\t\t$title;\n\n\t\t\t$title = section.container.find( '.accordion-section-title:first' );\n\t\t\t$title.find( '.menu-in-location' ).remove();\n\t\t\t_.each( themeLocations, function( themeLocation ) {\n\t\t\t\tvar $label = $( '<span class=\"menu-in-location\"></span>' );\n\t\t\t\t$label.text( api.Menus.data.l10n.menuLocation.replace( '%s', themeLocation ) );\n\t\t\t\t$title.append( $label );\n\t\t\t});\n\n\t\t\tsection.container.toggleClass( 'assigned-to-menu-location', 0 !== themeLocations.length );\n\n\t\t},\n\n\t\tonChangeExpanded: function( expanded, args ) {\n\t\t\tvar section = this;\n\n\t\t\tif ( expanded ) {\n\t\t\t\twpNavMenu.menuList = section.container.find( '.accordion-section-content:first' );\n\t\t\t\twpNavMenu.targetList = wpNavMenu.menuList;\n\n\t\t\t\t// Add attributes needed by wpNavMenu\n\t\t\t\t$( '#menu-to-edit' ).removeAttr( 'id' );\n\t\t\t\twpNavMenu.menuList.attr( 'id', 'menu-to-edit' ).addClass( 'menu' );\n\n\t\t\t\t_.each( api.section( section.id ).controls(), function( control ) {\n\t\t\t\t\tif ( 'nav_menu_item' === control.params.type ) {\n\t\t\t\t\t\tcontrol.actuallyEmbed();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( 'resolved' !== section.deferred.initSortables.state() ) {\n\t\t\t\t\twpNavMenu.initSortables(); // Depends on menu-to-edit ID being set above.\n\t\t\t\t\tsection.deferred.initSortables.resolve( wpNavMenu.menuList ); // Now MenuControl can extend the sortable.\n\n\t\t\t\t\t// @todo Note that wp.customize.reflowPaneContents() is debounced, so this immediate change will show a slight flicker while priorities get updated.\n\t\t\t\t\tapi.control( 'nav_menu[' + String( section.params.menu_id ) + ']' ).reflowMenuItems();\n\t\t\t\t}\n\t\t\t}\n\t\t\tapi.Section.prototype.onChangeExpanded.call( section, expanded, args );\n\t\t}\n\t});\n\n\t/**\n\t * wp.customize.Menus.NewMenuSection\n\t *\n\t * Customizer section for new menus.\n\t * Note that 'new_menu' must match the WP_Customize_New_Menu_Section::$type.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Section\n\t */\n\tapi.Menus.NewMenuSection = api.Section.extend({\n\n\t\t/**\n\t\t * Add behaviors for the accordion section.\n\t\t *\n\t\t * @since Menu Customizer 0.3\n\t\t */\n\t\tattachEvents: function() {\n\t\t\tvar section = this;\n\t\t\tthis.container.on( 'click', '.add-menu-toggle', function() {\n\t\t\t\tif ( section.expanded() ) {\n\t\t\t\t\tsection.collapse();\n\t\t\t\t} else {\n\t\t\t\t\tsection.expand();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Update UI to reflect expanded state.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Boolean} expanded\n\t\t */\n\t\tonChangeExpanded: function( expanded ) {\n\t\t\tvar section = this,\n\t\t\t\tbutton = section.container.find( '.add-menu-toggle' ),\n\t\t\t\tcontent = section.container.find( '.new-menu-section-content' ),\n\t\t\t\tcustomizer = section.container.closest( '.wp-full-overlay-sidebar-content' );\n\t\t\tif ( expanded ) {\n\t\t\t\tbutton.addClass( 'open' );\n\t\t\t\tbutton.attr( 'aria-expanded', 'true' );\n\t\t\t\tcontent.slideDown( 'fast', function() {\n\t\t\t\t\tcustomizer.scrollTop( customizer.height() );\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tbutton.removeClass( 'open' );\n\t\t\t\tbutton.attr( 'aria-expanded', 'false' );\n\t\t\t\tcontent.slideUp( 'fast' );\n\t\t\t\tcontent.find( '.menu-name-field' ).removeClass( 'invalid' );\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * wp.customize.Menus.MenuLocationControl\n\t *\n\t * Customizer control for menu locations (rendered as a <select>).\n\t * Note that 'nav_menu_location' must match the WP_Customize_Nav_Menu_Location_Control::$type.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t */\n\tapi.Menus.MenuLocationControl = api.Control.extend({\n\t\tinitialize: function( id, options ) {\n\t\t\tvar control = this,\n\t\t\t\tmatches = id.match( /^nav_menu_locations\\[(.+?)]/ );\n\t\t\tcontrol.themeLocation = matches[1];\n\t\t\tapi.Control.prototype.initialize.call( control, id, options );\n\t\t},\n\n\t\tready: function() {\n\t\t\tvar control = this, navMenuIdRegex = /^nav_menu\\[(-?\\d+)]/;\n\n\t\t\t// @todo It would be better if this was added directly on the setting itself, as opposed to the control.\n\t\t\tcontrol.setting.validate = function( value ) {\n\t\t\t\treturn parseInt( value, 10 );\n\t\t\t};\n\n\t\t\t// Add/remove menus from the available options when they are added and removed.\n\t\t\tapi.bind( 'add', function( setting ) {\n\t\t\t\tvar option, menuId, matches = setting.id.match( navMenuIdRegex );\n\t\t\t\tif ( ! matches || false === setting() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmenuId = matches[1];\n\t\t\t\toption = new Option( displayNavMenuName( setting().name ), menuId );\n\t\t\t\tcontrol.container.find( 'select' ).append( option );\n\t\t\t});\n\t\t\tapi.bind( 'remove', function( setting ) {\n\t\t\t\tvar menuId, matches = setting.id.match( navMenuIdRegex );\n\t\t\t\tif ( ! matches ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmenuId = parseInt( matches[1], 10 );\n\t\t\t\tif ( control.setting() === menuId ) {\n\t\t\t\t\tcontrol.setting.set( '' );\n\t\t\t\t}\n\t\t\t\tcontrol.container.find( 'option[value=' + menuId + ']' ).remove();\n\t\t\t});\n\t\t\tapi.bind( 'change', function( setting ) {\n\t\t\t\tvar menuId, matches = setting.id.match( navMenuIdRegex );\n\t\t\t\tif ( ! matches ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tmenuId = parseInt( matches[1], 10 );\n\t\t\t\tif ( false === setting() ) {\n\t\t\t\t\tif ( control.setting() === menuId ) {\n\t\t\t\t\t\tcontrol.setting.set( '' );\n\t\t\t\t\t}\n\t\t\t\t\tcontrol.container.find( 'option[value=' + menuId + ']' ).remove();\n\t\t\t\t} else {\n\t\t\t\t\tcontrol.container.find( 'option[value=' + menuId + ']' ).text( displayNavMenuName( setting().name ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * wp.customize.Menus.MenuItemControl\n\t *\n\t * Customizer control for menu items.\n\t * Note that 'menu_item' must match the WP_Customize_Menu_Item_Control::$type.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t */\n\tapi.Menus.MenuItemControl = api.Control.extend({\n\n\t\t/**\n\t\t * @inheritdoc\n\t\t */\n\t\tinitialize: function( id, options ) {\n\t\t\tvar control = this;\n\t\t\tapi.Control.prototype.initialize.call( control, id, options );\n\t\t\tcontrol.active.validate = function() {\n\t\t\t\tvar value, section = api.section( control.section() );\n\t\t\t\tif ( section ) {\n\t\t\t\t\tvalue = section.active();\n\t\t\t\t} else {\n\t\t\t\t\tvalue = false;\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * @since Menu Customizer 0.3\n\t\t *\n\t\t * Override the embed() method to do nothing,\n\t\t * so that the control isn't embedded on load,\n\t\t * unless the containing section is already expanded.\n\t\t */\n\t\tembed: function() {\n\t\t\tvar control = this,\n\t\t\t\tsectionId = control.section(),\n\t\t\t\tsection;\n\t\t\tif ( ! sectionId ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsection = api.section( sectionId );\n\t\t\tif ( ( section && section.expanded() ) || api.settings.autofocus.control === control.id ) {\n\t\t\t\tcontrol.actuallyEmbed();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * This function is called in Section.onChangeExpanded() so the control\n\t\t * will only get embedded when the Section is first expanded.\n\t\t *\n\t\t * @since Menu Customizer 0.3\n\t\t */\n\t\tactuallyEmbed: function() {\n\t\t\tvar control = this;\n\t\t\tif ( 'resolved' === control.deferred.embedded.state() ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontrol.renderContent();\n\t\t\tcontrol.deferred.embedded.resolve(); // This triggers control.ready().\n\t\t},\n\n\t\t/**\n\t\t * Set up the control.\n\t\t */\n\t\tready: function() {\n\t\t\tif ( 'undefined' === typeof this.params.menu_item_id ) {\n\t\t\t\tthrow new Error( 'params.menu_item_id was not defined' );\n\t\t\t}\n\n\t\t\tthis._setupControlToggle();\n\t\t\tthis._setupReorderUI();\n\t\t\tthis._setupUpdateUI();\n\t\t\tthis._setupRemoveUI();\n\t\t\tthis._setupLinksUI();\n\t\t\tthis._setupTitleUI();\n\t\t},\n\n\t\t/**\n\t\t * Show/hide the settings when clicking on the menu item handle.\n\t\t */\n\t\t_setupControlToggle: function() {\n\t\t\tvar control = this;\n\n\t\t\tthis.container.find( '.menu-item-handle' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tvar menuControl = control.getMenuControl();\n\t\t\t\tif ( menuControl.isReordering || menuControl.isSorting ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcontrol.toggleForm();\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Set up the menu-item-reorder-nav\n\t\t */\n\t\t_setupReorderUI: function() {\n\t\t\tvar control = this, template, $reorderNav;\n\n\t\t\ttemplate = wp.template( 'menu-item-reorder-nav' );\n\n\t\t\t// Add the menu item reordering elements to the menu item control.\n\t\t\tcontrol.container.find( '.item-controls' ).after( template );\n\n\t\t\t// Handle clicks for up/down/left-right on the reorder nav.\n\t\t\t$reorderNav = control.container.find( '.menu-item-reorder-nav' );\n\t\t\t$reorderNav.find( '.menus-move-up, .menus-move-down, .menus-move-left, .menus-move-right' ).on( 'click', function() {\n\t\t\t\tvar moveBtn = $( this );\n\t\t\t\tmoveBtn.focus();\n\n\t\t\t\tvar isMoveUp = moveBtn.is( '.menus-move-up' ),\n\t\t\t\t\tisMoveDown = moveBtn.is( '.menus-move-down' ),\n\t\t\t\t\tisMoveLeft = moveBtn.is( '.menus-move-left' ),\n\t\t\t\t\tisMoveRight = moveBtn.is( '.menus-move-right' );\n\n\t\t\t\tif ( isMoveUp ) {\n\t\t\t\t\tcontrol.moveUp();\n\t\t\t\t} else if ( isMoveDown ) {\n\t\t\t\t\tcontrol.moveDown();\n\t\t\t\t} else if ( isMoveLeft ) {\n\t\t\t\t\tcontrol.moveLeft();\n\t\t\t\t} else if ( isMoveRight ) {\n\t\t\t\t\tcontrol.moveRight();\n\t\t\t\t}\n\n\t\t\t\tmoveBtn.focus(); // Re-focus after the container was moved.\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Set up event handlers for menu item updating.\n\t\t */\n\t\t_setupUpdateUI: function() {\n\t\t\tvar control = this,\n\t\t\t\tsettingValue = control.setting();\n\n\t\t\tcontrol.elements = {};\n\t\t\tcontrol.elements.url = new api.Element( control.container.find( '.edit-menu-item-url' ) );\n\t\t\tcontrol.elements.title = new api.Element( control.container.find( '.edit-menu-item-title' ) );\n\t\t\tcontrol.elements.attr_title = new api.Element( control.container.find( '.edit-menu-item-attr-title' ) );\n\t\t\tcontrol.elements.target = new api.Element( control.container.find( '.edit-menu-item-target' ) );\n\t\t\tcontrol.elements.classes = new api.Element( control.container.find( '.edit-menu-item-classes' ) );\n\t\t\tcontrol.elements.xfn = new api.Element( control.container.find( '.edit-menu-item-xfn' ) );\n\t\t\tcontrol.elements.description = new api.Element( control.container.find( '.edit-menu-item-description' ) );\n\t\t\t// @todo allow other elements, added by plugins, to be automatically picked up here; allow additional values to be added to setting array.\n\n\t\t\t_.each( control.elements, function( element, property ) {\n\t\t\t\telement.bind(function( value ) {\n\t\t\t\t\tif ( element.element.is( 'input[type=checkbox]' ) ) {\n\t\t\t\t\t\tvalue = ( value ) ? element.element.val() : '';\n\t\t\t\t\t}\n\n\t\t\t\t\tvar settingValue = control.setting();\n\t\t\t\t\tif ( settingValue && settingValue[ property ] !== value ) {\n\t\t\t\t\t\tsettingValue = _.clone( settingValue );\n\t\t\t\t\t\tsettingValue[ property ] = value;\n\t\t\t\t\t\tcontrol.setting.set( settingValue );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif ( settingValue ) {\n\t\t\t\t\tif ( ( property === 'classes' || property === 'xfn' ) && _.isArray( settingValue[ property ] ) ) {\n\t\t\t\t\t\telement.set( settingValue[ property ].join( ' ' ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\telement.set( settingValue[ property ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontrol.setting.bind(function( to, from ) {\n\t\t\t\tvar itemId = control.params.menu_item_id,\n\t\t\t\t\tfollowingSiblingItemControls = [],\n\t\t\t\t\tchildrenItemControls = [],\n\t\t\t\t\tmenuControl;\n\n\t\t\t\tif ( false === to ) {\n\t\t\t\t\tmenuControl = api.control( 'nav_menu[' + String( from.nav_menu_term_id ) + ']' );\n\t\t\t\t\tcontrol.container.remove();\n\n\t\t\t\t\t_.each( menuControl.getMenuItemControls(), function( otherControl ) {\n\t\t\t\t\t\tif ( from.menu_item_parent === otherControl.setting().menu_item_parent && otherControl.setting().position > from.position ) {\n\t\t\t\t\t\t\tfollowingSiblingItemControls.push( otherControl );\n\t\t\t\t\t\t} else if ( otherControl.setting().menu_item_parent === itemId ) {\n\t\t\t\t\t\t\tchildrenItemControls.push( otherControl );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Shift all following siblings by the number of children this item has.\n\t\t\t\t\t_.each( followingSiblingItemControls, function( followingSiblingItemControl ) {\n\t\t\t\t\t\tvar value = _.clone( followingSiblingItemControl.setting() );\n\t\t\t\t\t\tvalue.position += childrenItemControls.length;\n\t\t\t\t\t\tfollowingSiblingItemControl.setting.set( value );\n\t\t\t\t\t});\n\n\t\t\t\t\t// Now move the children up to be the new subsequent siblings.\n\t\t\t\t\t_.each( childrenItemControls, function( childrenItemControl, i ) {\n\t\t\t\t\t\tvar value = _.clone( childrenItemControl.setting() );\n\t\t\t\t\t\tvalue.position = from.position + i;\n\t\t\t\t\t\tvalue.menu_item_parent = from.menu_item_parent;\n\t\t\t\t\t\tchildrenItemControl.setting.set( value );\n\t\t\t\t\t});\n\n\t\t\t\t\tmenuControl.debouncedReflowMenuItems();\n\t\t\t\t} else {\n\t\t\t\t\t// Update the elements' values to match the new setting properties.\n\t\t\t\t\t_.each( to, function( value, key ) {\n\t\t\t\t\t\tif ( control.elements[ key] ) {\n\t\t\t\t\t\t\tcontrol.elements[ key ].set( to[ key ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t\tcontrol.container.find( '.menu-item-data-parent-id' ).val( to.menu_item_parent );\n\n\t\t\t\t\t// Handle UI updates when the position or depth (parent) change.\n\t\t\t\t\tif ( to.position !== from.position || to.menu_item_parent !== from.menu_item_parent ) {\n\t\t\t\t\t\tcontrol.getMenuControl().debouncedReflowMenuItems();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Set up event handlers for menu item deletion.\n\t\t */\n\t\t_setupRemoveUI: function() {\n\t\t\tvar control = this, $removeBtn;\n\n\t\t\t// Configure delete button.\n\t\t\t$removeBtn = control.container.find( '.item-delete' );\n\n\t\t\t$removeBtn.on( 'click', function() {\n\t\t\t\t// Find an adjacent element to add focus to when this menu item goes away\n\t\t\t\tvar addingItems = true, $adjacentFocusTarget, $next, $prev;\n\n\t\t\t\tif ( ! $( 'body' ).hasClass( 'adding-menu-items' ) ) {\n\t\t\t\t\taddingItems = false;\n\t\t\t\t}\n\n\t\t\t\t$next = control.container.nextAll( '.customize-control-nav_menu_item:visible' ).first();\n\t\t\t\t$prev = control.container.prevAll( '.customize-control-nav_menu_item:visible' ).first();\n\n\t\t\t\tif ( $next.length ) {\n\t\t\t\t\t$adjacentFocusTarget = $next.find( false === addingItems ? '.item-edit' : '.item-delete' ).first();\n\t\t\t\t} else if ( $prev.length ) {\n\t\t\t\t\t$adjacentFocusTarget = $prev.find( false === addingItems ? '.item-edit' : '.item-delete' ).first();\n\t\t\t\t} else {\n\t\t\t\t\t$adjacentFocusTarget = control.container.nextAll( '.customize-control-nav_menu' ).find( '.add-new-menu-item' ).first();\n\t\t\t\t}\n\n\t\t\t\tcontrol.container.slideUp( function() {\n\t\t\t\t\tcontrol.setting.set( false );\n\t\t\t\t\twp.a11y.speak( api.Menus.data.l10n.itemDeleted );\n\t\t\t\t\t$adjacentFocusTarget.focus(); // keyboard accessibility\n\t\t\t\t} );\n\t\t\t} );\n\t\t},\n\n\t\t_setupLinksUI: function() {\n\t\t\tvar $origBtn;\n\n\t\t\t// Configure original link.\n\t\t\t$origBtn = this.container.find( 'a.original-link' );\n\n\t\t\t$origBtn.on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tapi.previewer.previewUrl( e.target.toString() );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Update item handle title when changed.\n\t\t */\n\t\t_setupTitleUI: function() {\n\t\t\tvar control = this;\n\n\t\t\tcontrol.setting.bind( function( item ) {\n\t\t\t\tif ( ! item ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar titleEl = control.container.find( '.menu-item-title' ),\n\t\t\t\t    titleText = item.title || api.Menus.data.l10n.untitled;\n\n\t\t\t\tif ( item._invalid ) {\n\t\t\t\t\ttitleText = api.Menus.data.l10n.invalidTitleTpl.replace( '%s', titleText );\n\t\t\t\t}\n\n\t\t\t\t// Don't update to an empty title.\n\t\t\t\tif ( item.title ) {\n\t\t\t\t\ttitleEl\n\t\t\t\t\t\t.text( titleText )\n\t\t\t\t\t\t.removeClass( 'no-title' );\n\t\t\t\t} else {\n\t\t\t\t\ttitleEl\n\t\t\t\t\t\t.text( titleText )\n\t\t\t\t\t\t.addClass( 'no-title' );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t *\n\t\t * @returns {number}\n\t\t */\n\t\tgetDepth: function() {\n\t\t\tvar control = this, setting = control.setting(), depth = 0;\n\t\t\tif ( ! setting ) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\twhile ( setting && setting.menu_item_parent ) {\n\t\t\t\tdepth += 1;\n\t\t\t\tcontrol = api.control( 'nav_menu_item[' + setting.menu_item_parent + ']' );\n\t\t\t\tif ( ! control ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tsetting = control.setting();\n\t\t\t}\n\t\t\treturn depth;\n\t\t},\n\n\t\t/**\n\t\t * Amend the control's params with the data necessary for the JS template just in time.\n\t\t */\n\t\trenderContent: function() {\n\t\t\tvar control = this,\n\t\t\t\tsettingValue = control.setting(),\n\t\t\t\tcontainerClasses;\n\n\t\t\tcontrol.params.title = settingValue.title || '';\n\t\t\tcontrol.params.depth = control.getDepth();\n\t\t\tcontrol.container.data( 'item-depth', control.params.depth );\n\t\t\tcontainerClasses = [\n\t\t\t\t'menu-item',\n\t\t\t\t'menu-item-depth-' + String( control.params.depth ),\n\t\t\t\t'menu-item-' + settingValue.object,\n\t\t\t\t'menu-item-edit-inactive'\n\t\t\t];\n\n\t\t\tif ( settingValue._invalid ) {\n\t\t\t\tcontainerClasses.push( 'menu-item-invalid' );\n\t\t\t\tcontrol.params.title = api.Menus.data.l10n.invalidTitleTpl.replace( '%s', control.params.title );\n\t\t\t} else if ( 'draft' === settingValue.status ) {\n\t\t\t\tcontainerClasses.push( 'pending' );\n\t\t\t\tcontrol.params.title = api.Menus.data.pendingTitleTpl.replace( '%s', control.params.title );\n\t\t\t}\n\n\t\t\tcontrol.params.el_classes = containerClasses.join( ' ' );\n\t\t\tcontrol.params.item_type_label = settingValue.type_label;\n\t\t\tcontrol.params.item_type = settingValue.type;\n\t\t\tcontrol.params.url = settingValue.url;\n\t\t\tcontrol.params.target = settingValue.target;\n\t\t\tcontrol.params.attr_title = settingValue.attr_title;\n\t\t\tcontrol.params.classes = _.isArray( settingValue.classes ) ? settingValue.classes.join( ' ' ) : settingValue.classes;\n\t\t\tcontrol.params.attr_title = settingValue.attr_title;\n\t\t\tcontrol.params.xfn = settingValue.xfn;\n\t\t\tcontrol.params.description = settingValue.description;\n\t\t\tcontrol.params.parent = settingValue.menu_item_parent;\n\t\t\tcontrol.params.original_title = settingValue.original_title || '';\n\n\t\t\tcontrol.container.addClass( control.params.el_classes );\n\n\t\t\tapi.Control.prototype.renderContent.call( control );\n\t\t},\n\n\t\t/***********************************************************************\n\t\t * Begin public API methods\n\t\t **********************************************************************/\n\n\t\t/**\n\t\t * @return {wp.customize.controlConstructor.nav_menu|null}\n\t\t */\n\t\tgetMenuControl: function() {\n\t\t\tvar control = this, settingValue = control.setting();\n\t\t\tif ( settingValue && settingValue.nav_menu_term_id ) {\n\t\t\t\treturn api.control( 'nav_menu[' + settingValue.nav_menu_term_id + ']' );\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Expand the accordion section containing a control\n\t\t */\n\t\texpandControlSection: function() {\n\t\t\tvar $section = this.container.closest( '.accordion-section' );\n\n\t\t\tif ( ! $section.hasClass( 'open' ) ) {\n\t\t\t\t$section.find( '.accordion-section-title:first' ).trigger( 'click' );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Expand the menu item form control.\n\t\t */\n\t\texpandForm: function() {\n\t\t\tthis.toggleForm( true );\n\t\t},\n\n\t\t/**\n\t\t * Collapse the menu item form control.\n\t\t */\n\t\tcollapseForm: function() {\n\t\t\tthis.toggleForm( false );\n\t\t},\n\n\t\t/**\n\t\t * Expand or collapse the menu item control.\n\t\t *\n\t\t * @param {boolean|undefined} [showOrHide] If not supplied, will be inverse of current visibility\n\t\t */\n\t\ttoggleForm: function( showOrHide ) {\n\t\t\tvar self = this, $menuitem, $inside, complete;\n\n\t\t\t$menuitem = this.container;\n\t\t\t$inside = $menuitem.find( '.menu-item-settings:first' );\n\t\t\tif ( 'undefined' === typeof showOrHide ) {\n\t\t\t\tshowOrHide = ! $inside.is( ':visible' );\n\t\t\t}\n\n\t\t\t// Already expanded or collapsed.\n\t\t\tif ( $inside.is( ':visible' ) === showOrHide ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( showOrHide ) {\n\t\t\t\t// Close all other menu item controls before expanding this one.\n\t\t\t\tapi.control.each( function( otherControl ) {\n\t\t\t\t\tif ( self.params.type === otherControl.params.type && self !== otherControl ) {\n\t\t\t\t\t\totherControl.collapseForm();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tcomplete = function() {\n\t\t\t\t\t$menuitem\n\t\t\t\t\t\t.removeClass( 'menu-item-edit-inactive' )\n\t\t\t\t\t\t.addClass( 'menu-item-edit-active' );\n\t\t\t\t\tself.container.trigger( 'expanded' );\n\t\t\t\t};\n\n\t\t\t\t$menuitem.find( '.item-edit' ).attr( 'aria-expanded', 'true' );\n\t\t\t\t$inside.slideDown( 'fast', complete );\n\n\t\t\t\tself.container.trigger( 'expand' );\n\t\t\t} else {\n\t\t\t\tcomplete = function() {\n\t\t\t\t\t$menuitem\n\t\t\t\t\t\t.addClass( 'menu-item-edit-inactive' )\n\t\t\t\t\t\t.removeClass( 'menu-item-edit-active' );\n\t\t\t\t\tself.container.trigger( 'collapsed' );\n\t\t\t\t};\n\n\t\t\t\tself.container.trigger( 'collapse' );\n\n\t\t\t\t$menuitem.find( '.item-edit' ).attr( 'aria-expanded', 'false' );\n\t\t\t\t$inside.slideUp( 'fast', complete );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Expand the containing menu section, expand the form, and focus on\n\t\t * the first input in the control.\n\t\t */\n\t\tfocus: function() {\n\t\t\tvar control = this, focusable;\n\t\t\tcontrol.expandControlSection();\n\t\t\tcontrol.expandForm();\n\t\t\t// Note that we can't use :focusable due to a jQuery UI issue. See: https://github.com/jquery/jquery-ui/pull/1583\n\t\t\tfocusable = control.container.find( '.menu-item-settings' ).find( 'input, select, textarea, button, object, a[href], [tabindex]' ).filter( ':visible' );\n\t\t\tfocusable.first().focus();\n\t\t},\n\n\t\t/**\n\t\t * Move menu item up one in the menu.\n\t\t */\n\t\tmoveUp: function() {\n\t\t\tthis._changePosition( -1 );\n\t\t\twp.a11y.speak( api.Menus.data.l10n.movedUp );\n\t\t},\n\n\t\t/**\n\t\t * Move menu item up one in the menu.\n\t\t */\n\t\tmoveDown: function() {\n\t\t\tthis._changePosition( 1 );\n\t\t\twp.a11y.speak( api.Menus.data.l10n.movedDown );\n\t\t},\n\t\t/**\n\t\t * Move menu item and all children up one level of depth.\n\t\t */\n\t\tmoveLeft: function() {\n\t\t\tthis._changeDepth( -1 );\n\t\t\twp.a11y.speak( api.Menus.data.l10n.movedLeft );\n\t\t},\n\n\t\t/**\n\t\t * Move menu item and children one level deeper, as a submenu of the previous item.\n\t\t */\n\t\tmoveRight: function() {\n\t\t\tthis._changeDepth( 1 );\n\t\t\twp.a11y.speak( api.Menus.data.l10n.movedRight );\n\t\t},\n\n\t\t/**\n\t\t * Note that this will trigger a UI update, causing child items to\n\t\t * move as well and cardinal order class names to be updated.\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {Number} offset 1|-1\n\t\t */\n\t\t_changePosition: function( offset ) {\n\t\t\tvar control = this,\n\t\t\t\tadjacentSetting,\n\t\t\t\tsettingValue = _.clone( control.setting() ),\n\t\t\t\tsiblingSettings = [],\n\t\t\t\trealPosition;\n\n\t\t\tif ( 1 !== offset && -1 !== offset ) {\n\t\t\t\tthrow new Error( 'Offset changes by 1 are only supported.' );\n\t\t\t}\n\n\t\t\t// Skip moving deleted items.\n\t\t\tif ( ! control.setting() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Locate the other items under the same parent (siblings).\n\t\t\t_( control.getMenuControl().getMenuItemControls() ).each(function( otherControl ) {\n\t\t\t\tif ( otherControl.setting().menu_item_parent === settingValue.menu_item_parent ) {\n\t\t\t\t\tsiblingSettings.push( otherControl.setting );\n\t\t\t\t}\n\t\t\t});\n\t\t\tsiblingSettings.sort(function( a, b ) {\n\t\t\t\treturn a().position - b().position;\n\t\t\t});\n\n\t\t\trealPosition = _.indexOf( siblingSettings, control.setting );\n\t\t\tif ( -1 === realPosition ) {\n\t\t\t\tthrow new Error( 'Expected setting to be among siblings.' );\n\t\t\t}\n\n\t\t\t// Skip doing anything if the item is already at the edge in the desired direction.\n\t\t\tif ( ( realPosition === 0 && offset < 0 ) || ( realPosition === siblingSettings.length - 1 && offset > 0 ) ) {\n\t\t\t\t// @todo Should we allow a menu item to be moved up to break it out of a parent? Adopt with previous or following parent?\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update any adjacent menu item setting to take on this item's position.\n\t\t\tadjacentSetting = siblingSettings[ realPosition + offset ];\n\t\t\tif ( adjacentSetting ) {\n\t\t\t\tadjacentSetting.set( $.extend(\n\t\t\t\t\t_.clone( adjacentSetting() ),\n\t\t\t\t\t{\n\t\t\t\t\t\tposition: settingValue.position\n\t\t\t\t\t}\n\t\t\t\t) );\n\t\t\t}\n\n\t\t\tsettingValue.position += offset;\n\t\t\tcontrol.setting.set( settingValue );\n\t\t},\n\n\t\t/**\n\t\t * Note that this will trigger a UI update, causing child items to\n\t\t * move as well and cardinal order class names to be updated.\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {Number} offset 1|-1\n\t\t */\n\t\t_changeDepth: function( offset ) {\n\t\t\tif ( 1 !== offset && -1 !== offset ) {\n\t\t\t\tthrow new Error( 'Offset changes by 1 are only supported.' );\n\t\t\t}\n\t\t\tvar control = this,\n\t\t\t\tsettingValue = _.clone( control.setting() ),\n\t\t\t\tsiblingControls = [],\n\t\t\t\trealPosition,\n\t\t\t\tsiblingControl,\n\t\t\t\tparentControl;\n\n\t\t\t// Locate the other items under the same parent (siblings).\n\t\t\t_( control.getMenuControl().getMenuItemControls() ).each(function( otherControl ) {\n\t\t\t\tif ( otherControl.setting().menu_item_parent === settingValue.menu_item_parent ) {\n\t\t\t\t\tsiblingControls.push( otherControl );\n\t\t\t\t}\n\t\t\t});\n\t\t\tsiblingControls.sort(function( a, b ) {\n\t\t\t\treturn a.setting().position - b.setting().position;\n\t\t\t});\n\n\t\t\trealPosition = _.indexOf( siblingControls, control );\n\t\t\tif ( -1 === realPosition ) {\n\t\t\t\tthrow new Error( 'Expected control to be among siblings.' );\n\t\t\t}\n\n\t\t\tif ( -1 === offset ) {\n\t\t\t\t// Skip moving left an item that is already at the top level.\n\t\t\t\tif ( ! settingValue.menu_item_parent ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tparentControl = api.control( 'nav_menu_item[' + settingValue.menu_item_parent + ']' );\n\n\t\t\t\t// Make this control the parent of all the following siblings.\n\t\t\t\t_( siblingControls ).chain().slice( realPosition ).each(function( siblingControl, i ) {\n\t\t\t\t\tsiblingControl.setting.set(\n\t\t\t\t\t\t$.extend(\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\tsiblingControl.setting(),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmenu_item_parent: control.params.menu_item_id,\n\t\t\t\t\t\t\t\tposition: i\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\t// Increase the positions of the parent item's subsequent children to make room for this one.\n\t\t\t\t_( control.getMenuControl().getMenuItemControls() ).each(function( otherControl ) {\n\t\t\t\t\tvar otherControlSettingValue, isControlToBeShifted;\n\t\t\t\t\tisControlToBeShifted = (\n\t\t\t\t\t\totherControl.setting().menu_item_parent === parentControl.setting().menu_item_parent &&\n\t\t\t\t\t\totherControl.setting().position > parentControl.setting().position\n\t\t\t\t\t);\n\t\t\t\t\tif ( isControlToBeShifted ) {\n\t\t\t\t\t\totherControlSettingValue = _.clone( otherControl.setting() );\n\t\t\t\t\t\totherControl.setting.set(\n\t\t\t\t\t\t\t$.extend(\n\t\t\t\t\t\t\t\totherControlSettingValue,\n\t\t\t\t\t\t\t\t{ position: otherControlSettingValue.position + 1 }\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Make this control the following sibling of its parent item.\n\t\t\t\tsettingValue.position = parentControl.setting().position + 1;\n\t\t\t\tsettingValue.menu_item_parent = parentControl.setting().menu_item_parent;\n\t\t\t\tcontrol.setting.set( settingValue );\n\n\t\t\t} else if ( 1 === offset ) {\n\t\t\t\t// Skip moving right an item that doesn't have a previous sibling.\n\t\t\t\tif ( realPosition === 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Make the control the last child of the previous sibling.\n\t\t\t\tsiblingControl = siblingControls[ realPosition - 1 ];\n\t\t\t\tsettingValue.menu_item_parent = siblingControl.params.menu_item_id;\n\t\t\t\tsettingValue.position = 0;\n\t\t\t\t_( control.getMenuControl().getMenuItemControls() ).each(function( otherControl ) {\n\t\t\t\t\tif ( otherControl.setting().menu_item_parent === settingValue.menu_item_parent ) {\n\t\t\t\t\t\tsettingValue.position = Math.max( settingValue.position, otherControl.setting().position );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsettingValue.position += 1;\n\t\t\t\tcontrol.setting.set( settingValue );\n\t\t\t}\n\t\t}\n\t} );\n\n\t/**\n\t * wp.customize.Menus.MenuNameControl\n\t *\n\t * Customizer control for a nav menu's name.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t */\n\tapi.Menus.MenuNameControl = api.Control.extend({\n\n\t\tready: function() {\n\t\t\tvar control = this,\n\t\t\t\tsettingValue = control.setting();\n\n\t\t\t/*\n\t\t\t * Since the control is not registered in PHP, we need to prevent the\n\t\t\t * preview's sending of the activeControls to result in this control\n\t\t\t * being deactivated.\n\t\t\t */\n\t\t\tcontrol.active.validate = function() {\n\t\t\t\tvar value, section = api.section( control.section() );\n\t\t\t\tif ( section ) {\n\t\t\t\t\tvalue = section.active();\n\t\t\t\t} else {\n\t\t\t\t\tvalue = false;\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t};\n\n\t\t\tcontrol.nameElement = new api.Element( control.container.find( '.menu-name-field' ) );\n\n\t\t\tcontrol.nameElement.bind(function( value ) {\n\t\t\t\tvar settingValue = control.setting();\n\t\t\t\tif ( settingValue && settingValue.name !== value ) {\n\t\t\t\t\tsettingValue = _.clone( settingValue );\n\t\t\t\t\tsettingValue.name = value;\n\t\t\t\t\tcontrol.setting.set( settingValue );\n\t\t\t\t}\n\t\t\t});\n\t\t\tif ( settingValue ) {\n\t\t\t\tcontrol.nameElement.set( settingValue.name );\n\t\t\t}\n\n\t\t\tcontrol.setting.bind(function( object ) {\n\t\t\t\tif ( object ) {\n\t\t\t\t\tcontrol.nameElement.set( object.name );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t});\n\n\t/**\n\t * wp.customize.Menus.MenuAutoAddControl\n\t *\n\t * Customizer control for a nav menu's auto add.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t */\n\tapi.Menus.MenuAutoAddControl = api.Control.extend({\n\n\t\tready: function() {\n\t\t\tvar control = this,\n\t\t\t\tsettingValue = control.setting();\n\n\t\t\t/*\n\t\t\t * Since the control is not registered in PHP, we need to prevent the\n\t\t\t * preview's sending of the activeControls to result in this control\n\t\t\t * being deactivated.\n\t\t\t */\n\t\t\tcontrol.active.validate = function() {\n\t\t\t\tvar value, section = api.section( control.section() );\n\t\t\t\tif ( section ) {\n\t\t\t\t\tvalue = section.active();\n\t\t\t\t} else {\n\t\t\t\t\tvalue = false;\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t};\n\n\t\t\tcontrol.autoAddElement = new api.Element( control.container.find( 'input[type=checkbox].auto_add' ) );\n\n\t\t\tcontrol.autoAddElement.bind(function( value ) {\n\t\t\t\tvar settingValue = control.setting();\n\t\t\t\tif ( settingValue && settingValue.name !== value ) {\n\t\t\t\t\tsettingValue = _.clone( settingValue );\n\t\t\t\t\tsettingValue.auto_add = value;\n\t\t\t\t\tcontrol.setting.set( settingValue );\n\t\t\t\t}\n\t\t\t});\n\t\t\tif ( settingValue ) {\n\t\t\t\tcontrol.autoAddElement.set( settingValue.auto_add );\n\t\t\t}\n\n\t\t\tcontrol.setting.bind(function( object ) {\n\t\t\t\tif ( object ) {\n\t\t\t\t\tcontrol.autoAddElement.set( object.auto_add );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t});\n\n\t/**\n\t * wp.customize.Menus.MenuControl\n\t *\n\t * Customizer control for menus.\n\t * Note that 'nav_menu' must match the WP_Menu_Customize_Control::$type\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t */\n\tapi.Menus.MenuControl = api.Control.extend({\n\t\t/**\n\t\t * Set up the control.\n\t\t */\n\t\tready: function() {\n\t\t\tvar control = this,\n\t\t\t\tmenuId = control.params.menu_id,\n\t\t\t\tmenu = control.setting(),\n\t\t\t\tname,\n\t\t\t\twidgetTemplate,\n\t\t\t\tselect;\n\n\t\t\tif ( 'undefined' === typeof this.params.menu_id ) {\n\t\t\t\tthrow new Error( 'params.menu_id was not defined' );\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Since the control is not registered in PHP, we need to prevent the\n\t\t\t * preview's sending of the activeControls to result in this control\n\t\t\t * being deactivated.\n\t\t\t */\n\t\t\tcontrol.active.validate = function() {\n\t\t\t\tvar value, section = api.section( control.section() );\n\t\t\t\tif ( section ) {\n\t\t\t\t\tvalue = section.active();\n\t\t\t\t} else {\n\t\t\t\t\tvalue = false;\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t};\n\n\t\t\tcontrol.$controlSection = control.container.closest( '.control-section' );\n\t\t\tcontrol.$sectionContent = control.container.closest( '.accordion-section-content' );\n\n\t\t\tthis._setupModel();\n\n\t\t\tapi.section( control.section(), function( section ) {\n\t\t\t\tsection.deferred.initSortables.done(function( menuList ) {\n\t\t\t\t\tcontrol._setupSortable( menuList );\n\t\t\t\t});\n\t\t\t} );\n\n\t\t\tthis._setupAddition();\n\t\t\tthis._setupLocations();\n\t\t\tthis._setupTitle();\n\n\t\t\t// Add menu to Custom Menu widgets.\n\t\t\tif ( menu ) {\n\t\t\t\tname = displayNavMenuName( menu.name );\n\n\t\t\t\t// Add the menu to the existing controls.\n\t\t\t\tapi.control.each( function( widgetControl ) {\n\t\t\t\t\tif ( ! widgetControl.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== widgetControl.params.widget_id_base ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twidgetControl.container.find( '.nav-menu-widget-form-controls:first' ).show();\n\t\t\t\t\twidgetControl.container.find( '.nav-menu-widget-no-menus-message:first' ).hide();\n\n\t\t\t\t\tselect = widgetControl.container.find( 'select' );\n\t\t\t\t\tif ( 0 === select.find( 'option[value=' + String( menuId ) + ']' ).length ) {\n\t\t\t\t\t\tselect.append( new Option( name, menuId ) );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t// Add the menu to the widget template.\n\t\t\t\twidgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );\n\t\t\t\twidgetTemplate.find( '.nav-menu-widget-form-controls:first' ).show();\n\t\t\t\twidgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).hide();\n\t\t\t\tselect = widgetTemplate.find( '.widget-inside select:first' );\n\t\t\t\tif ( 0 === select.find( 'option[value=' + String( menuId ) + ']' ).length ) {\n\t\t\t\t\tselect.append( new Option( name, menuId ) );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Update ordering of menu item controls when the setting is updated.\n\t\t */\n\t\t_setupModel: function() {\n\t\t\tvar control = this,\n\t\t\t\tmenuId = control.params.menu_id;\n\n\t\t\tcontrol.setting.bind( function( to ) {\n\t\t\t\tvar name;\n\t\t\t\tif ( false === to ) {\n\t\t\t\t\tcontrol._handleDeletion();\n\t\t\t\t} else {\n\t\t\t\t\t// Update names in the Custom Menu widgets.\n\t\t\t\t\tname = displayNavMenuName( to.name );\n\t\t\t\t\tapi.control.each( function( widgetControl ) {\n\t\t\t\t\t\tif ( ! widgetControl.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== widgetControl.params.widget_id_base ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar select = widgetControl.container.find( 'select' );\n\t\t\t\t\t\tselect.find( 'option[value=' + String( menuId ) + ']' ).text( name );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tcontrol.container.find( '.menu-delete' ).on( 'click', function( event ) {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tcontrol.setting.set( false );\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Allow items in each menu to be re-ordered, and for the order to be previewed.\n\t\t *\n\t\t * Notice that the UI aspects here are handled by wpNavMenu.initSortables()\n\t\t * which is called in MenuSection.onChangeExpanded()\n\t\t *\n\t\t * @param {object} menuList - The element that has sortable().\n\t\t */\n\t\t_setupSortable: function( menuList ) {\n\t\t\tvar control = this;\n\n\t\t\tif ( ! menuList.is( control.$sectionContent ) ) {\n\t\t\t\tthrow new Error( 'Unexpected menuList.' );\n\t\t\t}\n\n\t\t\tmenuList.on( 'sortstart', function() {\n\t\t\t\tcontrol.isSorting = true;\n\t\t\t});\n\n\t\t\tmenuList.on( 'sortstop', function() {\n\t\t\t\tsetTimeout( function() { // Next tick.\n\t\t\t\t\tvar menuItemContainerIds = control.$sectionContent.sortable( 'toArray' ),\n\t\t\t\t\t\tmenuItemControls = [],\n\t\t\t\t\t\tposition = 0,\n\t\t\t\t\t\tpriority = 10;\n\n\t\t\t\t\tcontrol.isSorting = false;\n\n\t\t\t\t\t// Reset horizontal scroll position when done dragging.\n\t\t\t\t\tcontrol.$sectionContent.scrollLeft( 0 );\n\n\t\t\t\t\t_.each( menuItemContainerIds, function( menuItemContainerId ) {\n\t\t\t\t\t\tvar menuItemId, menuItemControl, matches;\n\t\t\t\t\t\tmatches = menuItemContainerId.match( /^customize-control-nav_menu_item-(-?\\d+)$/, '' );\n\t\t\t\t\t\tif ( ! matches ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmenuItemId = parseInt( matches[1], 10 );\n\t\t\t\t\t\tmenuItemControl = api.control( 'nav_menu_item[' + String( menuItemId ) + ']' );\n\t\t\t\t\t\tif ( menuItemControl ) {\n\t\t\t\t\t\t\tmenuItemControls.push( menuItemControl );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\t_.each( menuItemControls, function( menuItemControl ) {\n\t\t\t\t\t\tif ( false === menuItemControl.setting() ) {\n\t\t\t\t\t\t\t// Skip deleted items.\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar setting = _.clone( menuItemControl.setting() );\n\t\t\t\t\t\tposition += 1;\n\t\t\t\t\t\tpriority += 1;\n\t\t\t\t\t\tsetting.position = position;\n\t\t\t\t\t\tmenuItemControl.priority( priority );\n\n\t\t\t\t\t\t// Note that wpNavMenu will be setting this .menu-item-data-parent-id input's value.\n\t\t\t\t\t\tsetting.menu_item_parent = parseInt( menuItemControl.container.find( '.menu-item-data-parent-id' ).val(), 10 );\n\t\t\t\t\t\tif ( ! setting.menu_item_parent ) {\n\t\t\t\t\t\t\tsetting.menu_item_parent = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmenuItemControl.setting.set( setting );\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t});\n\t\t\tcontrol.isReordering = false;\n\n\t\t\t/**\n\t\t\t * Keyboard-accessible reordering.\n\t\t\t */\n\t\t\tthis.container.find( '.reorder-toggle' ).on( 'click', function() {\n\t\t\t\tcontrol.toggleReordering( ! control.isReordering );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Set up UI for adding a new menu item.\n\t\t */\n\t\t_setupAddition: function() {\n\t\t\tvar self = this;\n\n\t\t\tthis.container.find( '.add-new-menu-item' ).on( 'click', function( event ) {\n\t\t\t\tif ( self.$sectionContent.hasClass( 'reordering' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( ! $( 'body' ).hasClass( 'adding-menu-items' ) ) {\n\t\t\t\t\t$( this ).attr( 'aria-expanded', 'true' );\n\t\t\t\t\tapi.Menus.availableMenuItemsPanel.open( self );\n\t\t\t\t} else {\n\t\t\t\t\t$( this ).attr( 'aria-expanded', 'false' );\n\t\t\t\t\tapi.Menus.availableMenuItemsPanel.close();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t_handleDeletion: function() {\n\t\t\tvar control = this,\n\t\t\t\tsection,\n\t\t\t\tmenuId = control.params.menu_id,\n\t\t\t\tremoveSection,\n\t\t\t\twidgetTemplate,\n\t\t\t\tnavMenuCount = 0;\n\t\t\tsection = api.section( control.section() );\n\t\t\tremoveSection = function() {\n\t\t\t\tsection.container.remove();\n\t\t\t\tapi.section.remove( section.id );\n\t\t\t};\n\n\t\t\tif ( section && section.expanded() ) {\n\t\t\t\tsection.collapse({\n\t\t\t\t\tcompleteCallback: function() {\n\t\t\t\t\t\tremoveSection();\n\t\t\t\t\t\twp.a11y.speak( api.Menus.data.l10n.menuDeleted );\n\t\t\t\t\t\tapi.panel( 'nav_menus' ).focus();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tremoveSection();\n\t\t\t}\n\n\t\t\tapi.each(function( setting ) {\n\t\t\t\tif ( /^nav_menu\\[/.test( setting.id ) && false !== setting() ) {\n\t\t\t\t\tnavMenuCount += 1;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Remove the menu from any Custom Menu widgets.\n\t\t\tapi.control.each(function( widgetControl ) {\n\t\t\t\tif ( ! widgetControl.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== widgetControl.params.widget_id_base ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar select = widgetControl.container.find( 'select' );\n\t\t\t\tif ( select.val() === String( menuId ) ) {\n\t\t\t\t\tselect.prop( 'selectedIndex', 0 ).trigger( 'change' );\n\t\t\t\t}\n\n\t\t\t\twidgetControl.container.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );\n\t\t\t\twidgetControl.container.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );\n\t\t\t\twidgetControl.container.find( 'option[value=' + String( menuId ) + ']' ).remove();\n\t\t\t});\n\n\t\t\t// Remove the menu to the nav menu widget template.\n\t\t\twidgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );\n\t\t\twidgetTemplate.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );\n\t\t\twidgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );\n\t\t\twidgetTemplate.find( 'option[value=' + String( menuId ) + ']' ).remove();\n\t\t},\n\n\t\t// Setup theme location checkboxes.\n\t\t_setupLocations: function() {\n\t\t\tvar control = this;\n\n\t\t\tcontrol.container.find( '.assigned-menu-location' ).each(function() {\n\t\t\t\tvar container = $( this ),\n\t\t\t\t\tcheckbox = container.find( 'input[type=checkbox]' ),\n\t\t\t\t\telement,\n\t\t\t\t\tupdateSelectedMenuLabel,\n\t\t\t\t\tnavMenuLocationSetting = api( 'nav_menu_locations[' + checkbox.data( 'location-id' ) + ']' );\n\n\t\t\t\tupdateSelectedMenuLabel = function( selectedMenuId ) {\n\t\t\t\t\tvar menuSetting = api( 'nav_menu[' + String( selectedMenuId ) + ']' );\n\t\t\t\t\tif ( ! selectedMenuId || ! menuSetting || ! menuSetting() ) {\n\t\t\t\t\t\tcontainer.find( '.theme-location-set' ).hide();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontainer.find( '.theme-location-set' ).show().find( 'span' ).text( displayNavMenuName( menuSetting().name ) );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\telement = new api.Element( checkbox );\n\t\t\t\telement.set( navMenuLocationSetting.get() === control.params.menu_id );\n\n\t\t\t\tcheckbox.on( 'change', function() {\n\t\t\t\t\t// Note: We can't use element.bind( function( checked ){ ... } ) here because it will trigger a change as well.\n\t\t\t\t\tnavMenuLocationSetting.set( this.checked ? control.params.menu_id : 0 );\n\t\t\t\t} );\n\n\t\t\t\tnavMenuLocationSetting.bind(function( selectedMenuId ) {\n\t\t\t\t\telement.set( selectedMenuId === control.params.menu_id );\n\t\t\t\t\tupdateSelectedMenuLabel( selectedMenuId );\n\t\t\t\t});\n\t\t\t\tupdateSelectedMenuLabel( navMenuLocationSetting.get() );\n\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Update Section Title as menu name is changed.\n\t\t */\n\t\t_setupTitle: function() {\n\t\t\tvar control = this;\n\n\t\t\tcontrol.setting.bind( function( menu ) {\n\t\t\t\tif ( ! menu ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar section = control.container.closest( '.accordion-section' ),\n\t\t\t\t\tmenuId = control.params.menu_id,\n\t\t\t\t\tcontrolTitle = section.find( '.accordion-section-title' ),\n\t\t\t\t\tsectionTitle = section.find( '.customize-section-title h3' ),\n\t\t\t\t\tlocation = section.find( '.menu-in-location' ),\n\t\t\t\t\taction = sectionTitle.find( '.customize-action' ),\n\t\t\t\t\tname = displayNavMenuName( menu.name );\n\n\t\t\t\t// Update the control title\n\t\t\t\tcontrolTitle.text( name );\n\t\t\t\tif ( location.length ) {\n\t\t\t\t\tlocation.appendTo( controlTitle );\n\t\t\t\t}\n\n\t\t\t\t// Update the section title\n\t\t\t\tsectionTitle.text( name );\n\t\t\t\tif ( action.length ) {\n\t\t\t\t\taction.prependTo( sectionTitle );\n\t\t\t\t}\n\n\t\t\t\t// Update the nav menu name in location selects.\n\t\t\t\tapi.control.each( function( control ) {\n\t\t\t\t\tif ( /^nav_menu_locations\\[/.test( control.id ) ) {\n\t\t\t\t\t\tcontrol.container.find( 'option[value=' + menuId + ']' ).text( name );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t// Update the nav menu name in all location checkboxes.\n\t\t\t\tsection.find( '.customize-control-checkbox input' ).each( function() {\n\t\t\t\t\tif ( $( this ).prop( 'checked' ) ) {\n\t\t\t\t\t\t$( '.current-menu-location-name-' + $( this ).data( 'location-id' ) ).text( name );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\t\t},\n\n\t\t/***********************************************************************\n\t\t * Begin public API methods\n\t\t **********************************************************************/\n\n\t\t/**\n\t\t * Enable/disable the reordering UI\n\t\t *\n\t\t * @param {Boolean} showOrHide to enable/disable reordering\n\t\t */\n\t\ttoggleReordering: function( showOrHide ) {\n\t\t\tvar addNewItemBtn = this.container.find( '.add-new-menu-item' ),\n\t\t\t\treorderBtn = this.container.find( '.reorder-toggle' ),\n\t\t\t\titemsTitle = this.$sectionContent.find( '.item-title' );\n\n\t\t\tshowOrHide = Boolean( showOrHide );\n\n\t\t\tif ( showOrHide === this.$sectionContent.hasClass( 'reordering' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.isReordering = showOrHide;\n\t\t\tthis.$sectionContent.toggleClass( 'reordering', showOrHide );\n\t\t\tthis.$sectionContent.sortable( this.isReordering ? 'disable' : 'enable' );\n\t\t\tif ( this.isReordering ) {\n\t\t\t\taddNewItemBtn.attr({ 'tabindex': '-1', 'aria-hidden': 'true' });\n\t\t\t\treorderBtn.attr( 'aria-label', api.Menus.data.l10n.reorderLabelOff );\n\t\t\t\twp.a11y.speak( api.Menus.data.l10n.reorderModeOn );\n\t\t\t\titemsTitle.attr( 'aria-hidden', 'false' );\n\t\t\t} else {\n\t\t\t\taddNewItemBtn.removeAttr( 'tabindex aria-hidden' );\n\t\t\t\treorderBtn.attr( 'aria-label', api.Menus.data.l10n.reorderLabelOn );\n\t\t\t\twp.a11y.speak( api.Menus.data.l10n.reorderModeOff );\n\t\t\t\titemsTitle.attr( 'aria-hidden', 'true' );\n\t\t\t}\n\n\t\t\tif ( showOrHide ) {\n\t\t\t\t_( this.getMenuItemControls() ).each( function( formControl ) {\n\t\t\t\t\tformControl.collapseForm();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @return {wp.customize.controlConstructor.nav_menu_item[]}\n\t\t */\n\t\tgetMenuItemControls: function() {\n\t\t\tvar menuControl = this,\n\t\t\t\tmenuItemControls = [],\n\t\t\t\tmenuTermId = menuControl.params.menu_id;\n\n\t\t\tapi.control.each(function( control ) {\n\t\t\t\tif ( 'nav_menu_item' === control.params.type && control.setting() && menuTermId === control.setting().nav_menu_term_id ) {\n\t\t\t\t\tmenuItemControls.push( control );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn menuItemControls;\n\t\t},\n\n\t\t/**\n\t\t * Make sure that each menu item control has the proper depth.\n\t\t */\n\t\treflowMenuItems: function() {\n\t\t\tvar menuControl = this,\n\t\t\t\tmenuItemControls = menuControl.getMenuItemControls(),\n\t\t\t\treflowRecursively;\n\n\t\t\treflowRecursively = function( context ) {\n\t\t\t\tvar currentMenuItemControls = [],\n\t\t\t\t\tthisParent = context.currentParent;\n\t\t\t\t_.each( context.menuItemControls, function( menuItemControl ) {\n\t\t\t\t\tif ( thisParent === menuItemControl.setting().menu_item_parent ) {\n\t\t\t\t\t\tcurrentMenuItemControls.push( menuItemControl );\n\t\t\t\t\t\t// @todo We could remove this item from menuItemControls now, for efficiency.\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tcurrentMenuItemControls.sort( function( a, b ) {\n\t\t\t\t\treturn a.setting().position - b.setting().position;\n\t\t\t\t});\n\n\t\t\t\t_.each( currentMenuItemControls, function( menuItemControl ) {\n\t\t\t\t\t// Update position.\n\t\t\t\t\tcontext.currentAbsolutePosition += 1;\n\t\t\t\t\tmenuItemControl.priority.set( context.currentAbsolutePosition ); // This will change the sort order.\n\n\t\t\t\t\t// Update depth.\n\t\t\t\t\tif ( ! menuItemControl.container.hasClass( 'menu-item-depth-' + String( context.currentDepth ) ) ) {\n\t\t\t\t\t\t_.each( menuItemControl.container.prop( 'className' ).match( /menu-item-depth-\\d+/g ), function( className ) {\n\t\t\t\t\t\t\tmenuItemControl.container.removeClass( className );\n\t\t\t\t\t\t});\n\t\t\t\t\t\tmenuItemControl.container.addClass( 'menu-item-depth-' + String( context.currentDepth ) );\n\t\t\t\t\t}\n\t\t\t\t\tmenuItemControl.container.data( 'item-depth', context.currentDepth );\n\n\t\t\t\t\t// Process any children items.\n\t\t\t\t\tcontext.currentDepth += 1;\n\t\t\t\t\tcontext.currentParent = menuItemControl.params.menu_item_id;\n\t\t\t\t\treflowRecursively( context );\n\t\t\t\t\tcontext.currentDepth -= 1;\n\t\t\t\t\tcontext.currentParent = thisParent;\n\t\t\t\t});\n\n\t\t\t\t// Update class names for reordering controls.\n\t\t\t\tif ( currentMenuItemControls.length ) {\n\t\t\t\t\t_( currentMenuItemControls ).each(function( menuItemControl ) {\n\t\t\t\t\t\tmenuItemControl.container.removeClass( 'move-up-disabled move-down-disabled move-left-disabled move-right-disabled' );\n\t\t\t\t\t\tif ( 0 === context.currentDepth ) {\n\t\t\t\t\t\t\tmenuItemControl.container.addClass( 'move-left-disabled' );\n\t\t\t\t\t\t} else if ( 10 === context.currentDepth ) {\n\t\t\t\t\t\t\tmenuItemControl.container.addClass( 'move-right-disabled' );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tcurrentMenuItemControls[0].container\n\t\t\t\t\t\t.addClass( 'move-up-disabled' )\n\t\t\t\t\t\t.addClass( 'move-right-disabled' )\n\t\t\t\t\t\t.toggleClass( 'move-down-disabled', 1 === currentMenuItemControls.length );\n\t\t\t\t\tcurrentMenuItemControls[ currentMenuItemControls.length - 1 ].container\n\t\t\t\t\t\t.addClass( 'move-down-disabled' )\n\t\t\t\t\t\t.toggleClass( 'move-up-disabled', 1 === currentMenuItemControls.length );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\treflowRecursively( {\n\t\t\t\tmenuItemControls: menuItemControls,\n\t\t\t\tcurrentParent: 0,\n\t\t\t\tcurrentDepth: 0,\n\t\t\t\tcurrentAbsolutePosition: 0\n\t\t\t} );\n\n\t\t\tmenuControl.container.find( '.reorder-toggle' ).toggle( menuItemControls.length > 1 );\n\t\t},\n\n\t\t/**\n\t\t * Note that this function gets debounced so that when a lot of setting\n\t\t * changes are made at once, for instance when moving a menu item that\n\t\t * has child items, this function will only be called once all of the\n\t\t * settings have been updated.\n\t\t */\n\t\tdebouncedReflowMenuItems: _.debounce( function() {\n\t\t\tthis.reflowMenuItems.apply( this, arguments );\n\t\t}, 0 ),\n\n\t\t/**\n\t\t * Add a new item to this menu.\n\t\t *\n\t\t * @param {object} item - Value for the nav_menu_item setting to be created.\n\t\t * @returns {wp.customize.Menus.controlConstructor.nav_menu_item} The newly-created nav_menu_item control instance.\n\t\t */\n\t\taddItemToMenu: function( item ) {\n\t\t\tvar menuControl = this, customizeId, settingArgs, setting, menuItemControl, placeholderId, position = 0, priority = 10;\n\n\t\t\t_.each( menuControl.getMenuItemControls(), function( control ) {\n\t\t\t\tif ( false === control.setting() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tpriority = Math.max( priority, control.priority() );\n\t\t\t\tif ( 0 === control.setting().menu_item_parent ) {\n\t\t\t\t\tposition = Math.max( position, control.setting().position );\n\t\t\t\t}\n\t\t\t});\n\t\t\tposition += 1;\n\t\t\tpriority += 1;\n\n\t\t\titem = $.extend(\n\t\t\t\t{},\n\t\t\t\tapi.Menus.data.defaultSettingValues.nav_menu_item,\n\t\t\t\titem,\n\t\t\t\t{\n\t\t\t\t\tnav_menu_term_id: menuControl.params.menu_id,\n\t\t\t\t\toriginal_title: item.title,\n\t\t\t\t\tposition: position\n\t\t\t\t}\n\t\t\t);\n\t\t\tdelete item.id; // only used by Backbone\n\n\t\t\tplaceholderId = api.Menus.generatePlaceholderAutoIncrementId();\n\t\t\tcustomizeId = 'nav_menu_item[' + String( placeholderId ) + ']';\n\t\t\tsettingArgs = {\n\t\t\t\ttype: 'nav_menu_item',\n\t\t\t\ttransport: 'postMessage',\n\t\t\t\tpreviewer: api.previewer\n\t\t\t};\n\t\t\tsetting = api.create( customizeId, customizeId, {}, settingArgs );\n\t\t\tsetting.set( item ); // Change from initial empty object to actual item to mark as dirty.\n\n\t\t\t// Add the menu item control.\n\t\t\tmenuItemControl = new api.controlConstructor.nav_menu_item( customizeId, {\n\t\t\t\tparams: {\n\t\t\t\t\ttype: 'nav_menu_item',\n\t\t\t\t\tcontent: '<li id=\"customize-control-nav_menu_item-' + String( placeholderId ) + '\" class=\"customize-control customize-control-nav_menu_item\"></li>',\n\t\t\t\t\tsection: menuControl.id,\n\t\t\t\t\tpriority: priority,\n\t\t\t\t\tactive: true,\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\t'default': customizeId\n\t\t\t\t\t},\n\t\t\t\t\tmenu_item_id: placeholderId\n\t\t\t\t},\n\t\t\t\tpreviewer: api.previewer\n\t\t\t} );\n\n\t\t\tapi.control.add( customizeId, menuItemControl );\n\t\t\tsetting.preview();\n\t\t\tmenuControl.debouncedReflowMenuItems();\n\n\t\t\twp.a11y.speak( api.Menus.data.l10n.itemAdded );\n\n\t\t\treturn menuItemControl;\n\t\t}\n\t} );\n\n\t/**\n\t * wp.customize.Menus.NewMenuControl\n\t *\n\t * Customizer control for creating new menus and handling deletion of existing menus.\n\t * Note that 'new_menu' must match the WP_Customize_New_Menu_Control::$type.\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t */\n\tapi.Menus.NewMenuControl = api.Control.extend({\n\t\t/**\n\t\t * Set up the control.\n\t\t */\n\t\tready: function() {\n\t\t\tthis._bindHandlers();\n\t\t},\n\n\t\t_bindHandlers: function() {\n\t\t\tvar self = this,\n\t\t\t\tname = $( '#customize-control-new_menu_name input' ),\n\t\t\t\tsubmit = $( '#create-new-menu-submit' );\n\t\t\tname.on( 'keydown', function( event ) {\n\t\t\t\tif ( 13 === event.which ) { // Enter.\n\t\t\t\t\tself.submit();\n\t\t\t\t}\n\t\t\t} );\n\t\t\tsubmit.on( 'click', function( event ) {\n\t\t\t\tself.submit();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Create the new menu with the name supplied.\n\t\t */\n\t\tsubmit: function() {\n\n\t\t\tvar control = this,\n\t\t\t\tcontainer = control.container.closest( '.accordion-section-new-menu' ),\n\t\t\t\tnameInput = container.find( '.menu-name-field' ).first(),\n\t\t\t\tname = nameInput.val(),\n\t\t\t\tmenuSection,\n\t\t\t\tcustomizeId,\n\t\t\t\tplaceholderId = api.Menus.generatePlaceholderAutoIncrementId();\n\n\t\t\tif ( ! name ) {\n\t\t\t\tnameInput.addClass( 'invalid' );\n\t\t\t\tnameInput.focus();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcustomizeId = 'nav_menu[' + String( placeholderId ) + ']';\n\n\t\t\t// Register the menu control setting.\n\t\t\tapi.create( customizeId, customizeId, {}, {\n\t\t\t\ttype: 'nav_menu',\n\t\t\t\ttransport: 'postMessage',\n\t\t\t\tpreviewer: api.previewer\n\t\t\t} );\n\t\t\tapi( customizeId ).set( $.extend(\n\t\t\t\t{},\n\t\t\t\tapi.Menus.data.defaultSettingValues.nav_menu,\n\t\t\t\t{\n\t\t\t\t\tname: name\n\t\t\t\t}\n\t\t\t) );\n\n\t\t\t/*\n\t\t\t * Add the menu section (and its controls).\n\t\t\t * Note that this will automatically create the required controls\n\t\t\t * inside via the Section's ready method.\n\t\t\t */\n\t\t\tmenuSection = new api.Menus.MenuSection( customizeId, {\n\t\t\t\tparams: {\n\t\t\t\t\tid: customizeId,\n\t\t\t\t\tpanel: 'nav_menus',\n\t\t\t\t\ttitle: displayNavMenuName( name ),\n\t\t\t\t\tcustomizeAction: api.Menus.data.l10n.customizingMenus,\n\t\t\t\t\ttype: 'nav_menu',\n\t\t\t\t\tpriority: 10,\n\t\t\t\t\tmenu_id: placeholderId\n\t\t\t\t}\n\t\t\t} );\n\t\t\tapi.section.add( customizeId, menuSection );\n\n\t\t\t// Clear name field.\n\t\t\tnameInput.val( '' );\n\t\t\tnameInput.removeClass( 'invalid' );\n\n\t\t\twp.a11y.speak( api.Menus.data.l10n.menuAdded );\n\n\t\t\t// Focus on the new menu section.\n\t\t\tapi.section( customizeId ).focus(); // @todo should we focus on the new menu's control and open the add-items panel? Thinking user flow...\n\n\t\t\t// Fix an issue with extra space at top immediately after creating new menu.\n\t\t\t$( '#menu-to-edit' ).css( 'margin-top', 0 );\n\t\t}\n\t});\n\n\t/**\n\t * Extends wp.customize.controlConstructor with control constructor for\n\t * menu_location, menu_item, nav_menu, and new_menu.\n\t */\n\t$.extend( api.controlConstructor, {\n\t\tnav_menu_location: api.Menus.MenuLocationControl,\n\t\tnav_menu_item: api.Menus.MenuItemControl,\n\t\tnav_menu: api.Menus.MenuControl,\n\t\tnav_menu_name: api.Menus.MenuNameControl,\n\t\tnav_menu_auto_add: api.Menus.MenuAutoAddControl,\n\t\tnew_menu: api.Menus.NewMenuControl\n\t});\n\n\t/**\n\t * Extends wp.customize.panelConstructor with section constructor for menus.\n\t */\n\t$.extend( api.panelConstructor, {\n\t\tnav_menus: api.Menus.MenusPanel\n\t});\n\n\t/**\n\t * Extends wp.customize.sectionConstructor with section constructor for menu.\n\t */\n\t$.extend( api.sectionConstructor, {\n\t\tnav_menu: api.Menus.MenuSection,\n\t\tnew_menu: api.Menus.NewMenuSection\n\t});\n\n\t/**\n\t * Init Customizer for menus.\n\t */\n\tapi.bind( 'ready', function() {\n\n\t\t// Set up the menu items panel.\n\t\tapi.Menus.availableMenuItemsPanel = new api.Menus.AvailableMenuItemsPanelView({\n\t\t\tcollection: api.Menus.availableMenuItems\n\t\t});\n\n\t\tapi.bind( 'saved', function( data ) {\n\t\t\tif ( data.nav_menu_updates || data.nav_menu_item_updates ) {\n\t\t\t\tapi.Menus.applySavedData( data );\n\t\t\t}\n\t\t} );\n\n\t\tapi.previewer.bind( 'refresh', function() {\n\t\t\tapi.previewer.refresh();\n\t\t});\n\t} );\n\n\t/**\n\t * When customize_save comes back with a success, make sure any inserted\n\t * nav menus and items are properly re-added with their newly-assigned IDs.\n\t *\n\t * @param {object} data\n\t * @param {array} data.nav_menu_updates\n\t * @param {array} data.nav_menu_item_updates\n\t */\n\tapi.Menus.applySavedData = function( data ) {\n\n\t\tvar insertedMenuIdMapping = {}, insertedMenuItemIdMapping = {};\n\n\t\t_( data.nav_menu_updates ).each(function( update ) {\n\t\t\tvar oldCustomizeId, newCustomizeId, customizeId, oldSetting, newSetting, setting, settingValue, oldSection, newSection, wasSaved, widgetTemplate, navMenuCount;\n\t\t\tif ( 'inserted' === update.status ) {\n\t\t\t\tif ( ! update.previous_term_id ) {\n\t\t\t\t\tthrow new Error( 'Expected previous_term_id' );\n\t\t\t\t}\n\t\t\t\tif ( ! update.term_id ) {\n\t\t\t\t\tthrow new Error( 'Expected term_id' );\n\t\t\t\t}\n\t\t\t\toldCustomizeId = 'nav_menu[' + String( update.previous_term_id ) + ']';\n\t\t\t\tif ( ! api.has( oldCustomizeId ) ) {\n\t\t\t\t\tthrow new Error( 'Expected setting to exist: ' + oldCustomizeId );\n\t\t\t\t}\n\t\t\t\toldSetting = api( oldCustomizeId );\n\t\t\t\tif ( ! api.section.has( oldCustomizeId ) ) {\n\t\t\t\t\tthrow new Error( 'Expected control to exist: ' + oldCustomizeId );\n\t\t\t\t}\n\t\t\t\toldSection = api.section( oldCustomizeId );\n\n\t\t\t\tsettingValue = oldSetting.get();\n\t\t\t\tif ( ! settingValue ) {\n\t\t\t\t\tthrow new Error( 'Did not expect setting to be empty (deleted).' );\n\t\t\t\t}\n\t\t\t\tsettingValue = $.extend( _.clone( settingValue ), update.saved_value );\n\n\t\t\t\tinsertedMenuIdMapping[ update.previous_term_id ] = update.term_id;\n\t\t\t\tnewCustomizeId = 'nav_menu[' + String( update.term_id ) + ']';\n\t\t\t\tnewSetting = api.create( newCustomizeId, newCustomizeId, settingValue, {\n\t\t\t\t\ttype: 'nav_menu',\n\t\t\t\t\ttransport: 'postMessage',\n\t\t\t\t\tpreviewer: api.previewer\n\t\t\t\t} );\n\n\t\t\t\tif ( oldSection.expanded() ) {\n\t\t\t\t\toldSection.collapse();\n\t\t\t\t}\n\n\t\t\t\t// Add the menu section.\n\t\t\t\tnewSection = new api.Menus.MenuSection( newCustomizeId, {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tid: newCustomizeId,\n\t\t\t\t\t\tpanel: 'nav_menus',\n\t\t\t\t\t\ttitle: settingValue.name,\n\t\t\t\t\t\tcustomizeAction: api.Menus.data.l10n.customizingMenus,\n\t\t\t\t\t\ttype: 'nav_menu',\n\t\t\t\t\t\tpriority: oldSection.priority.get(),\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tmenu_id: update.term_id\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\t// Add new control for the new menu.\n\t\t\t\tapi.section.add( newCustomizeId, newSection );\n\n\t\t\t\t// Update the values for nav menus in Custom Menu controls.\n\t\t\t\tapi.control.each( function( setting ) {\n\t\t\t\t\tif ( ! setting.extended( api.controlConstructor.widget_form ) || 'nav_menu' !== setting.params.widget_id_base ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvar select, oldMenuOption, newMenuOption;\n\t\t\t\t\tselect = setting.container.find( 'select' );\n\t\t\t\t\toldMenuOption = select.find( 'option[value=' + String( update.previous_term_id ) + ']' );\n\t\t\t\t\tnewMenuOption = select.find( 'option[value=' + String( update.term_id ) + ']' );\n\t\t\t\t\tnewMenuOption.prop( 'selected', oldMenuOption.prop( 'selected' ) );\n\t\t\t\t\toldMenuOption.remove();\n\t\t\t\t} );\n\n\t\t\t\t// Delete the old placeholder nav_menu.\n\t\t\t\toldSetting.callbacks.disable(); // Prevent setting triggering Customizer dirty state when set.\n\t\t\t\toldSetting.set( false );\n\t\t\t\toldSetting.preview();\n\t\t\t\tnewSetting.preview();\n\t\t\t\toldSetting._dirty = false;\n\n\t\t\t\t// Remove nav_menu section.\n\t\t\t\toldSection.container.remove();\n\t\t\t\tapi.section.remove( oldCustomizeId );\n\n\t\t\t\t// Update the nav_menu widget to reflect removed placeholder menu.\n\t\t\t\tnavMenuCount = 0;\n\t\t\t\tapi.each(function( setting ) {\n\t\t\t\t\tif ( /^nav_menu\\[/.test( setting.id ) && false !== setting() ) {\n\t\t\t\t\t\tnavMenuCount += 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\twidgetTemplate = $( '#available-widgets-list .widget-tpl:has( input.id_base[ value=nav_menu ] )' );\n\t\t\t\twidgetTemplate.find( '.nav-menu-widget-form-controls:first' ).toggle( 0 !== navMenuCount );\n\t\t\t\twidgetTemplate.find( '.nav-menu-widget-no-menus-message:first' ).toggle( 0 === navMenuCount );\n\t\t\t\twidgetTemplate.find( 'option[value=' + String( update.previous_term_id ) + ']' ).remove();\n\n\t\t\t\t// Update the nav_menu_locations[...] controls to remove the placeholder menus from the dropdown options.\n\t\t\t\twp.customize.control.each(function( control ){\n\t\t\t\t\tif ( /^nav_menu_locations\\[/.test( control.id ) ) {\n\t\t\t\t\t\tcontrol.container.find( 'option[value=' + String( update.previous_term_id ) + ']' ).remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Update nav_menu_locations to reference the new ID.\n\t\t\t\tapi.each( function( setting ) {\n\t\t\t\t\tvar wasSaved = api.state( 'saved' ).get();\n\t\t\t\t\tif ( /^nav_menu_locations\\[/.test( setting.id ) && setting.get() === update.previous_term_id ) {\n\t\t\t\t\t\tsetting.set( update.term_id );\n\t\t\t\t\t\tsetting._dirty = false; // Not dirty because this is has also just been done on server in WP_Customize_Nav_Menu_Setting::update().\n\t\t\t\t\t\tapi.state( 'saved' ).set( wasSaved );\n\t\t\t\t\t\tsetting.preview();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( oldSection.expanded.get() ) {\n\t\t\t\t\t// @todo This doesn't seem to be working.\n\t\t\t\t\tnewSection.expand();\n\t\t\t\t}\n\t\t\t} else if ( 'updated' === update.status ) {\n\t\t\t\tcustomizeId = 'nav_menu[' + String( update.term_id ) + ']';\n\t\t\t\tif ( ! api.has( customizeId ) ) {\n\t\t\t\t\tthrow new Error( 'Expected setting to exist: ' + customizeId );\n\t\t\t\t}\n\n\t\t\t\t// Make sure the setting gets updated with its sanitized server value (specifically the conflict-resolved name).\n\t\t\t\tsetting = api( customizeId );\n\t\t\t\tif ( ! _.isEqual( update.saved_value, setting.get() ) ) {\n\t\t\t\t\twasSaved = api.state( 'saved' ).get();\n\t\t\t\t\tsetting.set( update.saved_value );\n\t\t\t\t\tsetting._dirty = false;\n\t\t\t\t\tapi.state( 'saved' ).set( wasSaved );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Build up mapping of nav_menu_item placeholder IDs to inserted IDs.\n\t\t_( data.nav_menu_item_updates ).each(function( update ) {\n\t\t\tif ( update.previous_post_id ) {\n\t\t\t\tinsertedMenuItemIdMapping[ update.previous_post_id ] = update.post_id;\n\t\t\t}\n\t\t});\n\n\t\t_( data.nav_menu_item_updates ).each(function( update ) {\n\t\t\tvar oldCustomizeId, newCustomizeId, oldSetting, newSetting, settingValue, oldControl, newControl;\n\t\t\tif ( 'inserted' === update.status ) {\n\t\t\t\tif ( ! update.previous_post_id ) {\n\t\t\t\t\tthrow new Error( 'Expected previous_post_id' );\n\t\t\t\t}\n\t\t\t\tif ( ! update.post_id ) {\n\t\t\t\t\tthrow new Error( 'Expected post_id' );\n\t\t\t\t}\n\t\t\t\toldCustomizeId = 'nav_menu_item[' + String( update.previous_post_id ) + ']';\n\t\t\t\tif ( ! api.has( oldCustomizeId ) ) {\n\t\t\t\t\tthrow new Error( 'Expected setting to exist: ' + oldCustomizeId );\n\t\t\t\t}\n\t\t\t\toldSetting = api( oldCustomizeId );\n\t\t\t\tif ( ! api.control.has( oldCustomizeId ) ) {\n\t\t\t\t\tthrow new Error( 'Expected control to exist: ' + oldCustomizeId );\n\t\t\t\t}\n\t\t\t\toldControl = api.control( oldCustomizeId );\n\n\t\t\t\tsettingValue = oldSetting.get();\n\t\t\t\tif ( ! settingValue ) {\n\t\t\t\t\tthrow new Error( 'Did not expect setting to be empty (deleted).' );\n\t\t\t\t}\n\t\t\t\tsettingValue = _.clone( settingValue );\n\n\t\t\t\t// If the parent menu item was also inserted, update the menu_item_parent to the new ID.\n\t\t\t\tif ( settingValue.menu_item_parent < 0 ) {\n\t\t\t\t\tif ( ! insertedMenuItemIdMapping[ settingValue.menu_item_parent ] ) {\n\t\t\t\t\t\tthrow new Error( 'inserted ID for menu_item_parent not available' );\n\t\t\t\t\t}\n\t\t\t\t\tsettingValue.menu_item_parent = insertedMenuItemIdMapping[ settingValue.menu_item_parent ];\n\t\t\t\t}\n\n\t\t\t\t// If the menu was also inserted, then make sure it uses the new menu ID for nav_menu_term_id.\n\t\t\t\tif ( insertedMenuIdMapping[ settingValue.nav_menu_term_id ] ) {\n\t\t\t\t\tsettingValue.nav_menu_term_id = insertedMenuIdMapping[ settingValue.nav_menu_term_id ];\n\t\t\t\t}\n\n\t\t\t\tnewCustomizeId = 'nav_menu_item[' + String( update.post_id ) + ']';\n\t\t\t\tnewSetting = api.create( newCustomizeId, newCustomizeId, settingValue, {\n\t\t\t\t\ttype: 'nav_menu_item',\n\t\t\t\t\ttransport: 'postMessage',\n\t\t\t\t\tpreviewer: api.previewer\n\t\t\t\t} );\n\n\t\t\t\t// Add the menu control.\n\t\t\t\tnewControl = new api.controlConstructor.nav_menu_item( newCustomizeId, {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\ttype: 'nav_menu_item',\n\t\t\t\t\t\tcontent: '<li id=\"customize-control-nav_menu_item-' + String( update.post_id ) + '\" class=\"customize-control customize-control-nav_menu_item\"></li>',\n\t\t\t\t\t\tmenu_id: update.post_id,\n\t\t\t\t\t\tsection: 'nav_menu[' + String( settingValue.nav_menu_term_id ) + ']',\n\t\t\t\t\t\tpriority: oldControl.priority.get(),\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\t'default': newCustomizeId\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmenu_item_id: update.post_id\n\t\t\t\t\t},\n\t\t\t\t\tpreviewer: api.previewer\n\t\t\t\t} );\n\n\t\t\t\t// Remove old control.\n\t\t\t\toldControl.container.remove();\n\t\t\t\tapi.control.remove( oldCustomizeId );\n\n\t\t\t\t// Add new control to take its place.\n\t\t\t\tapi.control.add( newCustomizeId, newControl );\n\n\t\t\t\t// Delete the placeholder and preview the new setting.\n\t\t\t\toldSetting.callbacks.disable(); // Prevent setting triggering Customizer dirty state when set.\n\t\t\t\toldSetting.set( false );\n\t\t\t\toldSetting.preview();\n\t\t\t\tnewSetting.preview();\n\t\t\t\toldSetting._dirty = false;\n\n\t\t\t\tnewControl.container.toggleClass( 'menu-item-edit-inactive', oldControl.container.hasClass( 'menu-item-edit-inactive' ) );\n\t\t\t}\n\t\t});\n\n\t\t/*\n\t\t * Update the settings for any nav_menu widgets that had selected a placeholder ID.\n\t\t */\n\t\t_.each( data.widget_nav_menu_updates, function( widgetSettingValue, widgetSettingId ) {\n\t\t\tvar setting = api( widgetSettingId );\n\t\t\tif ( setting ) {\n\t\t\t\tsetting._value = widgetSettingValue;\n\t\t\t\tsetting.preview(); // Send to the preview now so that menu refresh will use the inserted menu.\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Focus a menu item control.\n\t *\n\t * @param {string} menuItemId\n\t */\n\tapi.Menus.focusMenuItemControl = function( menuItemId ) {\n\t\tvar control = api.Menus.getMenuItemControl( menuItemId );\n\n\t\tif ( control ) {\n\t\t\tcontrol.focus();\n\t\t}\n\t};\n\n\t/**\n\t * Get the control for a given menu.\n\t *\n\t * @param menuId\n\t * @return {wp.customize.controlConstructor.menus[]}\n\t */\n\tapi.Menus.getMenuControl = function( menuId ) {\n\t\treturn api.control( 'nav_menu[' + menuId + ']' );\n\t};\n\n\t/**\n\t * Given a menu item ID, get the control associated with it.\n\t *\n\t * @param {string} menuItemId\n\t * @return {object|null}\n\t */\n\tapi.Menus.getMenuItemControl = function( menuItemId ) {\n\t\treturn api.control( menuItemIdToSettingId( menuItemId ) );\n\t};\n\n\t/**\n\t * @param {String} menuItemId\n\t */\n\tfunction menuItemIdToSettingId( menuItemId ) {\n\t\treturn 'nav_menu_item[' + menuItemId + ']';\n\t}\n\n\t/**\n\t * Apply sanitize_text_field()-like logic to the supplied name, returning a\n\t * \"unnammed\" fallback string if the name is then empty.\n\t *\n\t * @param {string} name\n\t * @returns {string}\n\t */\n\tfunction displayNavMenuName( name ) {\n\t\tname = name || '';\n\t\tname = $( '<div>' ).text( name ).html(); // Emulate esc_html() which is used in wp-admin/nav-menus.php.\n\t\tname = $.trim( name );\n\t\treturn name || api.Menus.data.l10n.unnamed;\n\t}\n\n})( wp.customize, wp, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/customize-widgets.js",
    "content": "/* global _wpCustomizeWidgetsSettings */\n(function( wp, $ ){\n\n\tif ( ! wp || ! wp.customize ) { return; }\n\n\t// Set up our namespace...\n\tvar api = wp.customize,\n\t\tl10n;\n\n\tapi.Widgets = api.Widgets || {};\n\tapi.Widgets.savedWidgetIds = {};\n\n\t// Link settings\n\tapi.Widgets.data = _wpCustomizeWidgetsSettings || {};\n\tl10n = api.Widgets.data.l10n;\n\tdelete api.Widgets.data.l10n;\n\n\t/**\n\t * wp.customize.Widgets.WidgetModel\n\t *\n\t * A single widget model.\n\t *\n\t * @constructor\n\t * @augments Backbone.Model\n\t */\n\tapi.Widgets.WidgetModel = Backbone.Model.extend({\n\t\tid: null,\n\t\ttemp_id: null,\n\t\tclassname: null,\n\t\tcontrol_tpl: null,\n\t\tdescription: null,\n\t\tis_disabled: null,\n\t\tis_multi: null,\n\t\tmulti_number: null,\n\t\tname: null,\n\t\tid_base: null,\n\t\ttransport: 'refresh',\n\t\tparams: [],\n\t\twidth: null,\n\t\theight: null,\n\t\tsearch_matched: true\n\t});\n\n\t/**\n\t * wp.customize.Widgets.WidgetCollection\n\t *\n\t * Collection for widget models.\n\t *\n\t * @constructor\n\t * @augments Backbone.Model\n\t */\n\tapi.Widgets.WidgetCollection = Backbone.Collection.extend({\n\t\tmodel: api.Widgets.WidgetModel,\n\n\t\t// Controls searching on the current widget collection\n\t\t// and triggers an update event\n\t\tdoSearch: function( value ) {\n\n\t\t\t// Don't do anything if we've already done this search\n\t\t\t// Useful because the search handler fires multiple times per keystroke\n\t\t\tif ( this.terms === value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Updates terms with the value passed\n\t\t\tthis.terms = value;\n\n\t\t\t// If we have terms, run a search...\n\t\t\tif ( this.terms.length > 0 ) {\n\t\t\t\tthis.search( this.terms );\n\t\t\t}\n\n\t\t\t// If search is blank, show all themes\n\t\t\t// Useful for resetting the views when you clean the input\n\t\t\tif ( this.terms === '' ) {\n\t\t\t\tthis.each( function ( widget ) {\n\t\t\t\t\twidget.set( 'search_matched', true );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t// Performs a search within the collection\n\t\t// @uses RegExp\n\t\tsearch: function( term ) {\n\t\t\tvar match, haystack;\n\n\t\t\t// Escape the term string for RegExp meta characters\n\t\t\tterm = term.replace( /[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&' );\n\n\t\t\t// Consider spaces as word delimiters and match the whole string\n\t\t\t// so matching terms can be combined\n\t\t\tterm = term.replace( / /g, ')(?=.*' );\n\t\t\tmatch = new RegExp( '^(?=.*' + term + ').+', 'i' );\n\n\t\t\tthis.each( function ( data ) {\n\t\t\t\thaystack = [ data.get( 'name' ), data.get( 'id' ), data.get( 'description' ) ].join( ' ' );\n\t\t\t\tdata.set( 'search_matched', match.test( haystack ) );\n\t\t\t} );\n\t\t}\n\t});\n\tapi.Widgets.availableWidgets = new api.Widgets.WidgetCollection( api.Widgets.data.availableWidgets );\n\n\t/**\n\t * wp.customize.Widgets.SidebarModel\n\t *\n\t * A single sidebar model.\n\t *\n\t * @constructor\n\t * @augments Backbone.Model\n\t */\n\tapi.Widgets.SidebarModel = Backbone.Model.extend({\n\t\tafter_title: null,\n\t\tafter_widget: null,\n\t\tbefore_title: null,\n\t\tbefore_widget: null,\n\t\t'class': null,\n\t\tdescription: null,\n\t\tid: null,\n\t\tname: null,\n\t\tis_rendered: false\n\t});\n\n\t/**\n\t * wp.customize.Widgets.SidebarCollection\n\t *\n\t * Collection for sidebar models.\n\t *\n\t * @constructor\n\t * @augments Backbone.Collection\n\t */\n\tapi.Widgets.SidebarCollection = Backbone.Collection.extend({\n\t\tmodel: api.Widgets.SidebarModel\n\t});\n\tapi.Widgets.registeredSidebars = new api.Widgets.SidebarCollection( api.Widgets.data.registeredSidebars );\n\n\t/**\n\t * wp.customize.Widgets.AvailableWidgetsPanelView\n\t *\n\t * View class for the available widgets panel.\n\t *\n\t * @constructor\n\t * @augments wp.Backbone.View\n\t * @augments Backbone.View\n\t */\n\tapi.Widgets.AvailableWidgetsPanelView = wp.Backbone.View.extend({\n\n\t\tel: '#available-widgets',\n\n\t\tevents: {\n\t\t\t'input #widgets-search': 'search',\n\t\t\t'keyup #widgets-search': 'search',\n\t\t\t'change #widgets-search': 'search',\n\t\t\t'search #widgets-search': 'search',\n\t\t\t'focus .widget-tpl' : 'focus',\n\t\t\t'click .widget-tpl' : '_submit',\n\t\t\t'keypress .widget-tpl' : '_submit',\n\t\t\t'keydown' : 'keyboardAccessible'\n\t\t},\n\n\t\t// Cache current selected widget\n\t\tselected: null,\n\n\t\t// Cache sidebar control which has opened panel\n\t\tcurrentSidebarControl: null,\n\t\t$search: null,\n\n\t\tinitialize: function() {\n\t\t\tvar self = this;\n\n\t\t\tthis.$search = $( '#widgets-search' );\n\n\t\t\t_.bindAll( this, 'close' );\n\n\t\t\tthis.listenTo( this.collection, 'change', this.updateList );\n\n\t\t\tthis.updateList();\n\n\t\t\t// If the available widgets panel is open and the customize controls are\n\t\t\t// interacted with (i.e. available widgets panel is blurred) then close the\n\t\t\t// available widgets panel. Also close on back button click.\n\t\t\t$( '#customize-controls, #available-widgets .customize-section-title' ).on( 'click keydown', function( e ) {\n\t\t\t\tvar isAddNewBtn = $( e.target ).is( '.add-new-widget, .add-new-widget *' );\n\t\t\t\tif ( $( 'body' ).hasClass( 'adding-widget' ) && ! isAddNewBtn ) {\n\t\t\t\t\tself.close();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Close the panel if the URL in the preview changes\n\t\t\tapi.previewer.bind( 'url', this.close );\n\t\t},\n\n\t\t// Performs a search and handles selected widget\n\t\tsearch: function( event ) {\n\t\t\tvar firstVisible;\n\n\t\t\tthis.collection.doSearch( event.target.value );\n\n\t\t\t// Remove a widget from being selected if it is no longer visible\n\t\t\tif ( this.selected && ! this.selected.is( ':visible' ) ) {\n\t\t\t\tthis.selected.removeClass( 'selected' );\n\t\t\t\tthis.selected = null;\n\t\t\t}\n\n\t\t\t// If a widget was selected but the filter value has been cleared out, clear selection\n\t\t\tif ( this.selected && ! event.target.value ) {\n\t\t\t\tthis.selected.removeClass( 'selected' );\n\t\t\t\tthis.selected = null;\n\t\t\t}\n\n\t\t\t// If a filter has been entered and a widget hasn't been selected, select the first one shown\n\t\t\tif ( ! this.selected && event.target.value ) {\n\t\t\t\tfirstVisible = this.$el.find( '> .widget-tpl:visible:first' );\n\t\t\t\tif ( firstVisible.length ) {\n\t\t\t\t\tthis.select( firstVisible );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Changes visibility of available widgets\n\t\tupdateList: function() {\n\t\t\tthis.collection.each( function( widget ) {\n\t\t\t\tvar widgetTpl = $( '#widget-tpl-' + widget.id );\n\t\t\t\twidgetTpl.toggle( widget.get( 'search_matched' ) && ! widget.get( 'is_disabled' ) );\n\t\t\t\tif ( widget.get( 'is_disabled' ) && widgetTpl.is( this.selected ) ) {\n\t\t\t\t\tthis.selected = null;\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t// Highlights a widget\n\t\tselect: function( widgetTpl ) {\n\t\t\tthis.selected = $( widgetTpl );\n\t\t\tthis.selected.siblings( '.widget-tpl' ).removeClass( 'selected' );\n\t\t\tthis.selected.addClass( 'selected' );\n\t\t},\n\n\t\t// Highlights a widget on focus\n\t\tfocus: function( event ) {\n\t\t\tthis.select( $( event.currentTarget ) );\n\t\t},\n\n\t\t// Submit handler for keypress and click on widget\n\t\t_submit: function( event ) {\n\t\t\t// Only proceed with keypress if it is Enter or Spacebar\n\t\t\tif ( event.type === 'keypress' && ( event.which !== 13 && event.which !== 32 ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.submit( $( event.currentTarget ) );\n\t\t},\n\n\t\t// Adds a selected widget to the sidebar\n\t\tsubmit: function( widgetTpl ) {\n\t\t\tvar widgetId, widget, widgetFormControl;\n\n\t\t\tif ( ! widgetTpl ) {\n\t\t\t\twidgetTpl = this.selected;\n\t\t\t}\n\n\t\t\tif ( ! widgetTpl || ! this.currentSidebarControl ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.select( widgetTpl );\n\n\t\t\twidgetId = $( this.selected ).data( 'widget-id' );\n\t\t\twidget = this.collection.findWhere( { id: widgetId } );\n\t\t\tif ( ! widget ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twidgetFormControl = this.currentSidebarControl.addWidget( widget.get( 'id_base' ) );\n\t\t\tif ( widgetFormControl ) {\n\t\t\t\twidgetFormControl.focus();\n\t\t\t}\n\n\t\t\tthis.close();\n\t\t},\n\n\t\t// Opens the panel\n\t\topen: function( sidebarControl ) {\n\t\t\tthis.currentSidebarControl = sidebarControl;\n\n\t\t\t// Wide widget controls appear over the preview, and so they need to be collapsed when the panel opens\n\t\t\t_( this.currentSidebarControl.getWidgetFormControls() ).each( function( control ) {\n\t\t\t\tif ( control.params.is_wide ) {\n\t\t\t\t\tcontrol.collapseForm();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$( 'body' ).addClass( 'adding-widget' );\n\n\t\t\tthis.$el.find( '.selected' ).removeClass( 'selected' );\n\n\t\t\t// Reset search\n\t\t\tthis.collection.doSearch( '' );\n\n\t\t\tif ( ! api.settings.browser.mobile ) {\n\t\t\t\tthis.$search.focus();\n\t\t\t}\n\t\t},\n\n\t\t// Closes the panel\n\t\tclose: function( options ) {\n\t\t\toptions = options || {};\n\n\t\t\tif ( options.returnFocus && this.currentSidebarControl ) {\n\t\t\t\tthis.currentSidebarControl.container.find( '.add-new-widget' ).focus();\n\t\t\t}\n\n\t\t\tthis.currentSidebarControl = null;\n\t\t\tthis.selected = null;\n\n\t\t\t$( 'body' ).removeClass( 'adding-widget' );\n\n\t\t\tthis.$search.val( '' );\n\t\t},\n\n\t\t// Add keyboard accessiblity to the panel\n\t\tkeyboardAccessible: function( event ) {\n\t\t\tvar isEnter = ( event.which === 13 ),\n\t\t\t\tisEsc = ( event.which === 27 ),\n\t\t\t\tisDown = ( event.which === 40 ),\n\t\t\t\tisUp = ( event.which === 38 ),\n\t\t\t\tisTab = ( event.which === 9 ),\n\t\t\t\tisShift = ( event.shiftKey ),\n\t\t\t\tselected = null,\n\t\t\t\tfirstVisible = this.$el.find( '> .widget-tpl:visible:first' ),\n\t\t\t\tlastVisible = this.$el.find( '> .widget-tpl:visible:last' ),\n\t\t\t\tisSearchFocused = $( event.target ).is( this.$search ),\n\t\t\t\tisLastWidgetFocused = $( event.target ).is( '.widget-tpl:visible:last' );\n\n\t\t\tif ( isDown || isUp ) {\n\t\t\t\tif ( isDown ) {\n\t\t\t\t\tif ( isSearchFocused ) {\n\t\t\t\t\t\tselected = firstVisible;\n\t\t\t\t\t} else if ( this.selected && this.selected.nextAll( '.widget-tpl:visible' ).length !== 0 ) {\n\t\t\t\t\t\tselected = this.selected.nextAll( '.widget-tpl:visible:first' );\n\t\t\t\t\t}\n\t\t\t\t} else if ( isUp ) {\n\t\t\t\t\tif ( isSearchFocused ) {\n\t\t\t\t\t\tselected = lastVisible;\n\t\t\t\t\t} else if ( this.selected && this.selected.prevAll( '.widget-tpl:visible' ).length !== 0 ) {\n\t\t\t\t\t\tselected = this.selected.prevAll( '.widget-tpl:visible:first' );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.select( selected );\n\n\t\t\t\tif ( selected ) {\n\t\t\t\t\tselected.focus();\n\t\t\t\t} else {\n\t\t\t\t\tthis.$search.focus();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If enter pressed but nothing entered, don't do anything\n\t\t\tif ( isEnter && ! this.$search.val() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isEnter ) {\n\t\t\t\tthis.submit();\n\t\t\t} else if ( isEsc ) {\n\t\t\t\tthis.close( { returnFocus: true } );\n\t\t\t}\n\n\t\t\tif ( this.currentSidebarControl && isTab && ( isShift && isSearchFocused || ! isShift && isLastWidgetFocused ) ) {\n\t\t\t\tthis.currentSidebarControl.container.find( '.add-new-widget' ).focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * Handlers for the widget-synced event, organized by widget ID base.\n\t * Other widgets may provide their own update handlers by adding\n\t * listeners for the widget-synced event.\n\t */\n\tapi.Widgets.formSyncHandlers = {\n\n\t\t/**\n\t\t * @param {jQuery.Event} e\n\t\t * @param {jQuery} widget\n\t\t * @param {String} newForm\n\t\t */\n\t\trss: function( e, widget, newForm ) {\n\t\t\tvar oldWidgetError = widget.find( '.widget-error:first' ),\n\t\t\t\tnewWidgetError = $( '<div>' + newForm + '</div>' ).find( '.widget-error:first' );\n\n\t\t\tif ( oldWidgetError.length && newWidgetError.length ) {\n\t\t\t\toldWidgetError.replaceWith( newWidgetError );\n\t\t\t} else if ( oldWidgetError.length ) {\n\t\t\t\toldWidgetError.remove();\n\t\t\t} else if ( newWidgetError.length ) {\n\t\t\t\twidget.find( '.widget-content:first' ).prepend( newWidgetError );\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * wp.customize.Widgets.WidgetControl\n\t *\n\t * Customizer control for widgets.\n\t * Note that 'widget_form' must match the WP_Widget_Form_Customize_Control::$type\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t */\n\tapi.Widgets.WidgetControl = api.Control.extend({\n\t\tdefaultExpandedArguments: {\n\t\t\tduration: 'fast',\n\t\t\tcompleteCallback: $.noop\n\t\t},\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t */\n\t\tinitialize: function( id, options ) {\n\t\t\tvar control = this;\n\n\t\t\tcontrol.widgetControlEmbedded = false;\n\t\t\tcontrol.widgetContentEmbedded = false;\n\t\t\tcontrol.expanded = new api.Value( false );\n\t\t\tcontrol.expandedArgumentsQueue = [];\n\t\t\tcontrol.expanded.bind( function( expanded ) {\n\t\t\t\tvar args = control.expandedArgumentsQueue.shift();\n\t\t\t\targs = $.extend( {}, control.defaultExpandedArguments, args );\n\t\t\t\tcontrol.onChangeExpanded( expanded, args );\n\t\t\t});\n\n\t\t\tapi.Control.prototype.initialize.call( control, id, options );\n\t\t},\n\n\t\t/**\n\t\t * Set up the control.\n\t\t *\n\t\t * @since 3.9.0\n\t\t */\n\t\tready: function() {\n\t\t\tvar control = this;\n\n\t\t\t/*\n\t\t\t * Embed a placeholder once the section is expanded. The full widget\n\t\t\t * form content will be embedded once the control itself is expanded,\n\t\t\t * and at this point the widget-added event will be triggered.\n\t\t\t */\n\t\t\tif ( ! control.section() ) {\n\t\t\t\tcontrol.embedWidgetControl();\n\t\t\t} else {\n\t\t\t\tapi.section( control.section(), function( section ) {\n\t\t\t\t\tvar onExpanded = function( isExpanded ) {\n\t\t\t\t\t\tif ( isExpanded ) {\n\t\t\t\t\t\t\tcontrol.embedWidgetControl();\n\t\t\t\t\t\t\tsection.expanded.unbind( onExpanded );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tif ( section.expanded() ) {\n\t\t\t\t\t\tonExpanded( true );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsection.expanded.bind( onExpanded );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Embed the .widget element inside the li container.\n\t\t *\n\t\t * @since 4.4.0\n\t\t */\n\t\tembedWidgetControl: function() {\n\t\t\tvar control = this, widgetControl;\n\n\t\t\tif ( control.widgetControlEmbedded ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontrol.widgetControlEmbedded = true;\n\n\t\t\twidgetControl = $( control.params.widget_control );\n\t\t\tcontrol.container.append( widgetControl );\n\n\t\t\tcontrol._setupModel();\n\t\t\tcontrol._setupWideWidget();\n\t\t\tcontrol._setupControlToggle();\n\n\t\t\tcontrol._setupWidgetTitle();\n\t\t\tcontrol._setupReorderUI();\n\t\t\tcontrol._setupHighlightEffects();\n\t\t\tcontrol._setupUpdateUI();\n\t\t\tcontrol._setupRemoveUI();\n\t\t},\n\n\t\t/**\n\t\t * Embed the actual widget form inside of .widget-content and finally trigger the widget-added event.\n\t\t *\n\t\t * @since 4.4.0\n\t\t */\n\t\tembedWidgetContent: function() {\n\t\t\tvar control = this, widgetContent;\n\n\t\t\tcontrol.embedWidgetControl();\n\t\t\tif ( control.widgetContentEmbedded ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontrol.widgetContentEmbedded = true;\n\n\t\t\twidgetContent = $( control.params.widget_content );\n\t\t\tcontrol.container.find( '.widget-content:first' ).append( widgetContent );\n\n\t\t\t/*\n\t\t\t * Trigger widget-added event so that plugins can attach any event\n\t\t\t * listeners and dynamic UI elements.\n\t\t\t */\n\t\t\t$( document ).trigger( 'widget-added', [ control.container.find( '.widget:first' ) ] );\n\n\t\t},\n\n\t\t/**\n\t\t * Handle changes to the setting\n\t\t */\n\t\t_setupModel: function() {\n\t\t\tvar self = this, rememberSavedWidgetId;\n\n\t\t\t// Remember saved widgets so we know which to trash (move to inactive widgets sidebar)\n\t\t\trememberSavedWidgetId = function() {\n\t\t\t\tapi.Widgets.savedWidgetIds[self.params.widget_id] = true;\n\t\t\t};\n\t\t\tapi.bind( 'ready', rememberSavedWidgetId );\n\t\t\tapi.bind( 'saved', rememberSavedWidgetId );\n\n\t\t\tthis._updateCount = 0;\n\t\t\tthis.isWidgetUpdating = false;\n\t\t\tthis.liveUpdateMode = true;\n\n\t\t\t// Update widget whenever model changes\n\t\t\tthis.setting.bind( function( to, from ) {\n\t\t\t\tif ( ! _( from ).isEqual( to ) && ! self.isWidgetUpdating ) {\n\t\t\t\t\tself.updateWidget( { instance: to } );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Add special behaviors for wide widget controls\n\t\t */\n\t\t_setupWideWidget: function() {\n\t\t\tvar self = this, $widgetInside, $widgetForm, $customizeSidebar,\n\t\t\t\t$themeControlsContainer, positionWidget;\n\n\t\t\tif ( ! this.params.is_wide ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$widgetInside = this.container.find( '.widget-inside' );\n\t\t\t$widgetForm = $widgetInside.find( '> .form' );\n\t\t\t$customizeSidebar = $( '.wp-full-overlay-sidebar-content:first' );\n\t\t\tthis.container.addClass( 'wide-widget-control' );\n\n\t\t\tthis.container.find( '.widget-content:first' ).css( {\n\t\t\t\t'max-width': this.params.width,\n\t\t\t\t'min-height': this.params.height\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Keep the widget-inside positioned so the top of fixed-positioned\n\t\t\t * element is at the same top position as the widget-top. When the\n\t\t\t * widget-top is scrolled out of view, keep the widget-top in view;\n\t\t\t * likewise, don't allow the widget to drop off the bottom of the window.\n\t\t\t * If a widget is too tall to fit in the window, don't let the height\n\t\t\t * exceed the window height so that the contents of the widget control\n\t\t\t * will become scrollable (overflow:auto).\n\t\t\t */\n\t\t\tpositionWidget = function() {\n\t\t\t\tvar offsetTop = self.container.offset().top,\n\t\t\t\t\twindowHeight = $( window ).height(),\n\t\t\t\t\tformHeight = $widgetForm.outerHeight(),\n\t\t\t\t\ttop;\n\t\t\t\t$widgetInside.css( 'max-height', windowHeight );\n\t\t\t\ttop = Math.max(\n\t\t\t\t\t0, // prevent top from going off screen\n\t\t\t\t\tMath.min(\n\t\t\t\t\t\tMath.max( offsetTop, 0 ), // distance widget in panel is from top of screen\n\t\t\t\t\t\twindowHeight - formHeight // flush up against bottom of screen\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\t$widgetInside.css( 'top', top );\n\t\t\t};\n\n\t\t\t$themeControlsContainer = $( '#customize-theme-controls' );\n\t\t\tthis.container.on( 'expand', function() {\n\t\t\t\tpositionWidget();\n\t\t\t\t$customizeSidebar.on( 'scroll', positionWidget );\n\t\t\t\t$( window ).on( 'resize', positionWidget );\n\t\t\t\t$themeControlsContainer.on( 'expanded collapsed', positionWidget );\n\t\t\t} );\n\t\t\tthis.container.on( 'collapsed', function() {\n\t\t\t\t$customizeSidebar.off( 'scroll', positionWidget );\n\t\t\t\t$( window ).off( 'resize', positionWidget );\n\t\t\t\t$themeControlsContainer.off( 'expanded collapsed', positionWidget );\n\t\t\t} );\n\n\t\t\t// Reposition whenever a sidebar's widgets are changed\n\t\t\tapi.each( function( setting ) {\n\t\t\t\tif ( 0 === setting.id.indexOf( 'sidebars_widgets[' ) ) {\n\t\t\t\t\tsetting.bind( function() {\n\t\t\t\t\t\tif ( self.container.hasClass( 'expanded' ) ) {\n\t\t\t\t\t\t\tpositionWidget();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Show/hide the control when clicking on the form title, when clicking\n\t\t * the close button\n\t\t */\n\t\t_setupControlToggle: function() {\n\t\t\tvar self = this, $closeBtn;\n\n\t\t\tthis.container.find( '.widget-top' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tvar sidebarWidgetsControl = self.getSidebarWidgetsControl();\n\t\t\t\tif ( sidebarWidgetsControl.isReordering ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tself.expanded( ! self.expanded() );\n\t\t\t} );\n\n\t\t\t$closeBtn = this.container.find( '.widget-control-close' );\n\t\t\t$closeBtn.on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.collapse();\n\t\t\t\tself.container.find( '.widget-top .widget-action:first' ).focus(); // keyboard accessibility\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Update the title of the form if a title field is entered\n\t\t */\n\t\t_setupWidgetTitle: function() {\n\t\t\tvar self = this, updateTitle;\n\n\t\t\tupdateTitle = function() {\n\t\t\t\tvar title = self.setting().title,\n\t\t\t\t\tinWidgetTitle = self.container.find( '.in-widget-title' );\n\n\t\t\t\tif ( title ) {\n\t\t\t\t\tinWidgetTitle.text( ': ' + title );\n\t\t\t\t} else {\n\t\t\t\t\tinWidgetTitle.text( '' );\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.setting.bind( updateTitle );\n\t\t\tupdateTitle();\n\t\t},\n\n\t\t/**\n\t\t * Set up the widget-reorder-nav\n\t\t */\n\t\t_setupReorderUI: function() {\n\t\t\tvar self = this, selectSidebarItem, $moveWidgetArea,\n\t\t\t\t$reorderNav, updateAvailableSidebars;\n\n\t\t\t/**\n\t\t\t * select the provided sidebar list item in the move widget area\n\t\t\t *\n\t\t\t * @param {jQuery} li\n\t\t\t */\n\t\t\tselectSidebarItem = function( li ) {\n\t\t\t\tli.siblings( '.selected' ).removeClass( 'selected' );\n\t\t\t\tli.addClass( 'selected' );\n\t\t\t\tvar isSelfSidebar = ( li.data( 'id' ) === self.params.sidebar_id );\n\t\t\t\tself.container.find( '.move-widget-btn' ).prop( 'disabled', isSelfSidebar );\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Add the widget reordering elements to the widget control\n\t\t\t */\n\t\t\tthis.container.find( '.widget-title-action' ).after( $( api.Widgets.data.tpl.widgetReorderNav ) );\n\t\t\t$moveWidgetArea = $(\n\t\t\t\t_.template( api.Widgets.data.tpl.moveWidgetArea, {\n\t\t\t\t\tsidebars: _( api.Widgets.registeredSidebars.toArray() ).pluck( 'attributes' )\n\t\t\t\t} )\n\t\t\t);\n\t\t\tthis.container.find( '.widget-top' ).after( $moveWidgetArea );\n\n\t\t\t/**\n\t\t\t * Update available sidebars when their rendered state changes\n\t\t\t */\n\t\t\tupdateAvailableSidebars = function() {\n\t\t\t\tvar $sidebarItems = $moveWidgetArea.find( 'li' ), selfSidebarItem,\n\t\t\t\t\trenderedSidebarCount = 0;\n\n\t\t\t\tselfSidebarItem = $sidebarItems.filter( function(){\n\t\t\t\t\treturn $( this ).data( 'id' ) === self.params.sidebar_id;\n\t\t\t\t} );\n\n\t\t\t\t$sidebarItems.each( function() {\n\t\t\t\t\tvar li = $( this ),\n\t\t\t\t\t\tsidebarId, sidebar, sidebarIsRendered;\n\n\t\t\t\t\tsidebarId = li.data( 'id' );\n\t\t\t\t\tsidebar = api.Widgets.registeredSidebars.get( sidebarId );\n\t\t\t\t\tsidebarIsRendered = sidebar.get( 'is_rendered' );\n\n\t\t\t\t\tli.toggle( sidebarIsRendered );\n\n\t\t\t\t\tif ( sidebarIsRendered ) {\n\t\t\t\t\t\trenderedSidebarCount += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( li.hasClass( 'selected' ) && ! sidebarIsRendered ) {\n\t\t\t\t\t\tselectSidebarItem( selfSidebarItem );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( renderedSidebarCount > 1 ) {\n\t\t\t\t\tself.container.find( '.move-widget' ).show();\n\t\t\t\t} else {\n\t\t\t\t\tself.container.find( '.move-widget' ).hide();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tupdateAvailableSidebars();\n\t\t\tapi.Widgets.registeredSidebars.on( 'change:is_rendered', updateAvailableSidebars );\n\n\t\t\t/**\n\t\t\t * Handle clicks for up/down/move on the reorder nav\n\t\t\t */\n\t\t\t$reorderNav = this.container.find( '.widget-reorder-nav' );\n\t\t\t$reorderNav.find( '.move-widget, .move-widget-down, .move-widget-up' ).each( function() {\n\t\t\t\t$( this ).prepend( self.container.find( '.widget-title' ).text() + ': ' );\n\t\t\t} ).on( 'click keypress', function( event ) {\n\t\t\t\tif ( event.type === 'keypress' && ( event.which !== 13 && event.which !== 32 ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$( this ).focus();\n\n\t\t\t\tif ( $( this ).is( '.move-widget' ) ) {\n\t\t\t\t\tself.toggleWidgetMoveArea();\n\t\t\t\t} else {\n\t\t\t\t\tvar isMoveDown = $( this ).is( '.move-widget-down' ),\n\t\t\t\t\t\tisMoveUp = $( this ).is( '.move-widget-up' ),\n\t\t\t\t\t\ti = self.getWidgetSidebarPosition();\n\n\t\t\t\t\tif ( ( isMoveUp && i === 0 ) || ( isMoveDown && i === self.getSidebarWidgetsControl().setting().length - 1 ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMoveUp ) {\n\t\t\t\t\t\tself.moveUp();\n\t\t\t\t\t\twp.a11y.speak( l10n.widgetMovedUp );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.moveDown();\n\t\t\t\t\t\twp.a11y.speak( l10n.widgetMovedDown );\n\t\t\t\t\t}\n\n\t\t\t\t\t$( this ).focus(); // re-focus after the container was moved\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Handle selecting a sidebar to move to\n\t\t\t */\n\t\t\tthis.container.find( '.widget-area-select' ).on( 'click keypress', 'li', function( event ) {\n\t\t\t\tif ( event.type === 'keypress' && ( event.which !== 13 && event.which !== 32 ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tselectSidebarItem( $( this ) );\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Move widget to another sidebar\n\t\t\t */\n\t\t\tthis.container.find( '.move-widget-btn' ).click( function() {\n\t\t\t\tself.getSidebarWidgetsControl().toggleReordering( false );\n\n\t\t\t\tvar oldSidebarId = self.params.sidebar_id,\n\t\t\t\t\tnewSidebarId = self.container.find( '.widget-area-select li.selected' ).data( 'id' ),\n\t\t\t\t\toldSidebarWidgetsSetting, newSidebarWidgetsSetting,\n\t\t\t\t\toldSidebarWidgetIds, newSidebarWidgetIds, i;\n\n\t\t\t\toldSidebarWidgetsSetting = api( 'sidebars_widgets[' + oldSidebarId + ']' );\n\t\t\t\tnewSidebarWidgetsSetting = api( 'sidebars_widgets[' + newSidebarId + ']' );\n\t\t\t\toldSidebarWidgetIds = Array.prototype.slice.call( oldSidebarWidgetsSetting() );\n\t\t\t\tnewSidebarWidgetIds = Array.prototype.slice.call( newSidebarWidgetsSetting() );\n\n\t\t\t\ti = self.getWidgetSidebarPosition();\n\t\t\t\toldSidebarWidgetIds.splice( i, 1 );\n\t\t\t\tnewSidebarWidgetIds.push( self.params.widget_id );\n\n\t\t\t\toldSidebarWidgetsSetting( oldSidebarWidgetIds );\n\t\t\t\tnewSidebarWidgetsSetting( newSidebarWidgetIds );\n\n\t\t\t\tself.focus();\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Highlight widgets in preview when interacted with in the Customizer\n\t\t */\n\t\t_setupHighlightEffects: function() {\n\t\t\tvar self = this;\n\n\t\t\t// Highlight whenever hovering or clicking over the form\n\t\t\tthis.container.on( 'mouseenter click', function() {\n\t\t\t\tself.setting.previewer.send( 'highlight-widget', self.params.widget_id );\n\t\t\t} );\n\n\t\t\t// Highlight when the setting is updated\n\t\t\tthis.setting.bind( function() {\n\t\t\t\tself.setting.previewer.send( 'highlight-widget', self.params.widget_id );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Set up event handlers for widget updating\n\t\t */\n\t\t_setupUpdateUI: function() {\n\t\t\tvar self = this, $widgetRoot, $widgetContent,\n\t\t\t\t$saveBtn, updateWidgetDebounced, formSyncHandler;\n\n\t\t\t$widgetRoot = this.container.find( '.widget:first' );\n\t\t\t$widgetContent = $widgetRoot.find( '.widget-content:first' );\n\n\t\t\t// Configure update button\n\t\t\t$saveBtn = this.container.find( '.widget-control-save' );\n\t\t\t$saveBtn.val( l10n.saveBtnLabel );\n\t\t\t$saveBtn.attr( 'title', l10n.saveBtnTooltip );\n\t\t\t$saveBtn.removeClass( 'button-primary' ).addClass( 'button-secondary' );\n\t\t\t$saveBtn.on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.updateWidget( { disable_form: true } ); // @todo disable_form is unused?\n\t\t\t} );\n\n\t\t\tupdateWidgetDebounced = _.debounce( function() {\n\t\t\t\tself.updateWidget();\n\t\t\t}, 250 );\n\n\t\t\t// Trigger widget form update when hitting Enter within an input\n\t\t\t$widgetContent.on( 'keydown', 'input', function( e ) {\n\t\t\t\tif ( 13 === e.which ) { // Enter\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.updateWidget( { ignoreActiveElement: true } );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Handle widgets that support live previews\n\t\t\t$widgetContent.on( 'change input propertychange', ':input', function( e ) {\n\t\t\t\tif ( ! self.liveUpdateMode ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( e.type === 'change' || ( this.checkValidity && this.checkValidity() ) ) {\n\t\t\t\t\tupdateWidgetDebounced();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Remove loading indicators when the setting is saved and the preview updates\n\t\t\tthis.setting.previewer.channel.bind( 'synced', function() {\n\t\t\t\tself.container.removeClass( 'previewer-loading' );\n\t\t\t} );\n\n\t\t\tapi.previewer.bind( 'widget-updated', function( updatedWidgetId ) {\n\t\t\t\tif ( updatedWidgetId === self.params.widget_id ) {\n\t\t\t\t\tself.container.removeClass( 'previewer-loading' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tformSyncHandler = api.Widgets.formSyncHandlers[ this.params.widget_id_base ];\n\t\t\tif ( formSyncHandler ) {\n\t\t\t\t$( document ).on( 'widget-synced', function( e, widget ) {\n\t\t\t\t\tif ( $widgetRoot.is( widget ) ) {\n\t\t\t\t\t\tformSyncHandler.apply( document, arguments );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Update widget control to indicate whether it is currently rendered.\n\t\t *\n\t\t * Overrides api.Control.toggle()\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Boolean}   active\n\t\t * @param {Object}    args\n\t\t * @param {Callback}  args.completeCallback\n\t\t */\n\t\tonChangeActive: function ( active, args ) {\n\t\t\t// Note: there is a second 'args' parameter being passed, merged on top of this.defaultActiveArguments\n\t\t\tthis.container.toggleClass( 'widget-rendered', active );\n\t\t\tif ( args.completeCallback ) {\n\t\t\t\targs.completeCallback();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Set up event handlers for widget removal\n\t\t */\n\t\t_setupRemoveUI: function() {\n\t\t\tvar self = this, $removeBtn, replaceDeleteWithRemove;\n\n\t\t\t// Configure remove button\n\t\t\t$removeBtn = this.container.find( 'a.widget-control-remove' );\n\t\t\t$removeBtn.on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t// Find an adjacent element to add focus to when this widget goes away\n\t\t\t\tvar $adjacentFocusTarget;\n\t\t\t\tif ( self.container.next().is( '.customize-control-widget_form' ) ) {\n\t\t\t\t\t$adjacentFocusTarget = self.container.next().find( '.widget-action:first' );\n\t\t\t\t} else if ( self.container.prev().is( '.customize-control-widget_form' ) ) {\n\t\t\t\t\t$adjacentFocusTarget = self.container.prev().find( '.widget-action:first' );\n\t\t\t\t} else {\n\t\t\t\t\t$adjacentFocusTarget = self.container.next( '.customize-control-sidebar_widgets' ).find( '.add-new-widget:first' );\n\t\t\t\t}\n\n\t\t\t\tself.container.slideUp( function() {\n\t\t\t\t\tvar sidebarsWidgetsControl = api.Widgets.getSidebarWidgetControlContainingWidget( self.params.widget_id ),\n\t\t\t\t\t\tsidebarWidgetIds, i;\n\n\t\t\t\t\tif ( ! sidebarsWidgetsControl ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tsidebarWidgetIds = sidebarsWidgetsControl.setting().slice();\n\t\t\t\t\ti = _.indexOf( sidebarWidgetIds, self.params.widget_id );\n\t\t\t\t\tif ( -1 === i ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tsidebarWidgetIds.splice( i, 1 );\n\t\t\t\t\tsidebarsWidgetsControl.setting( sidebarWidgetIds );\n\n\t\t\t\t\t$adjacentFocusTarget.focus(); // keyboard accessibility\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\treplaceDeleteWithRemove = function() {\n\t\t\t\t$removeBtn.text( l10n.removeBtnLabel ); // wp_widget_control() outputs the link as \"Delete\"\n\t\t\t\t$removeBtn.attr( 'title', l10n.removeBtnTooltip );\n\t\t\t};\n\n\t\t\tif ( this.params.is_new ) {\n\t\t\t\tapi.bind( 'saved', replaceDeleteWithRemove );\n\t\t\t} else {\n\t\t\t\treplaceDeleteWithRemove();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Find all inputs in a widget container that should be considered when\n\t\t * comparing the loaded form with the sanitized form, whose fields will\n\t\t * be aligned to copy the sanitized over. The elements returned by this\n\t\t * are passed into this._getInputsSignature(), and they are iterated\n\t\t * over when copying sanitized values over to the the form loaded.\n\t\t *\n\t\t * @param {jQuery} container element in which to look for inputs\n\t\t * @returns {jQuery} inputs\n\t\t * @private\n\t\t */\n\t\t_getInputs: function( container ) {\n\t\t\treturn $( container ).find( ':input[name]' );\n\t\t},\n\n\t\t/**\n\t\t * Iterate over supplied inputs and create a signature string for all of them together.\n\t\t * This string can be used to compare whether or not the form has all of the same fields.\n\t\t *\n\t\t * @param {jQuery} inputs\n\t\t * @returns {string}\n\t\t * @private\n\t\t */\n\t\t_getInputsSignature: function( inputs ) {\n\t\t\tvar inputsSignatures = _( inputs ).map( function( input ) {\n\t\t\t\tvar $input = $( input ), signatureParts;\n\n\t\t\t\tif ( $input.is( ':checkbox, :radio' ) ) {\n\t\t\t\t\tsignatureParts = [ $input.attr( 'id' ), $input.attr( 'name' ), $input.prop( 'value' ) ];\n\t\t\t\t} else {\n\t\t\t\t\tsignatureParts = [ $input.attr( 'id' ), $input.attr( 'name' ) ];\n\t\t\t\t}\n\n\t\t\t\treturn signatureParts.join( ',' );\n\t\t\t} );\n\n\t\t\treturn inputsSignatures.join( ';' );\n\t\t},\n\n\t\t/**\n\t\t * Get the state for an input depending on its type.\n\t\t *\n\t\t * @param {jQuery|Element} input\n\t\t * @returns {string|boolean|array|*}\n\t\t * @private\n\t\t */\n\t\t_getInputState: function( input ) {\n\t\t\tinput = $( input );\n\t\t\tif ( input.is( ':radio, :checkbox' ) ) {\n\t\t\t\treturn input.prop( 'checked' );\n\t\t\t} else if ( input.is( 'select[multiple]' ) ) {\n\t\t\t\treturn input.find( 'option:selected' ).map( function () {\n\t\t\t\t\treturn $( this ).val();\n\t\t\t\t} ).get();\n\t\t\t} else {\n\t\t\t\treturn input.val();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Update an input's state based on its type.\n\t\t *\n\t\t * @param {jQuery|Element} input\n\t\t * @param {string|boolean|array|*} state\n\t\t * @private\n\t\t */\n\t\t_setInputState: function ( input, state ) {\n\t\t\tinput = $( input );\n\t\t\tif ( input.is( ':radio, :checkbox' ) ) {\n\t\t\t\tinput.prop( 'checked', state );\n\t\t\t} else if ( input.is( 'select[multiple]' ) ) {\n\t\t\t\tif ( ! $.isArray( state ) ) {\n\t\t\t\t\tstate = [];\n\t\t\t\t} else {\n\t\t\t\t\t// Make sure all state items are strings since the DOM value is a string\n\t\t\t\t\tstate = _.map( state, function ( value ) {\n\t\t\t\t\t\treturn String( value );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tinput.find( 'option' ).each( function () {\n\t\t\t\t\t$( this ).prop( 'selected', -1 !== _.indexOf( state, String( this.value ) ) );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tinput.val( state );\n\t\t\t}\n\t\t},\n\n\t\t/***********************************************************************\n\t\t * Begin public API methods\n\t\t **********************************************************************/\n\n\t\t/**\n\t\t * @return {wp.customize.controlConstructor.sidebar_widgets[]}\n\t\t */\n\t\tgetSidebarWidgetsControl: function() {\n\t\t\tvar settingId, sidebarWidgetsControl;\n\n\t\t\tsettingId = 'sidebars_widgets[' + this.params.sidebar_id + ']';\n\t\t\tsidebarWidgetsControl = api.control( settingId );\n\n\t\t\tif ( ! sidebarWidgetsControl ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn sidebarWidgetsControl;\n\t\t},\n\n\t\t/**\n\t\t * Submit the widget form via Ajax and get back the updated instance,\n\t\t * along with the new widget control form to render.\n\t\t *\n\t\t * @param {object} [args]\n\t\t * @param {Object|null} [args.instance=null]  When the model changes, the instance is sent here; otherwise, the inputs from the form are used\n\t\t * @param {Function|null} [args.complete=null]  Function which is called when the request finishes. Context is bound to the control. First argument is any error. Following arguments are for success.\n\t\t * @param {Boolean} [args.ignoreActiveElement=false] Whether or not updating a field will be deferred if focus is still on the element.\n\t\t */\n\t\tupdateWidget: function( args ) {\n\t\t\tvar self = this, instanceOverride, completeCallback, $widgetRoot, $widgetContent,\n\t\t\t\tupdateNumber, params, data, $inputs, processing, jqxhr, isChanged;\n\n\t\t\t// The updateWidget logic requires that the form fields to be fully present.\n\t\t\tself.embedWidgetContent();\n\n\t\t\targs = $.extend( {\n\t\t\t\tinstance: null,\n\t\t\t\tcomplete: null,\n\t\t\t\tignoreActiveElement: false\n\t\t\t}, args );\n\n\t\t\tinstanceOverride = args.instance;\n\t\t\tcompleteCallback = args.complete;\n\n\t\t\tthis._updateCount += 1;\n\t\t\tupdateNumber = this._updateCount;\n\n\t\t\t$widgetRoot = this.container.find( '.widget:first' );\n\t\t\t$widgetContent = $widgetRoot.find( '.widget-content:first' );\n\n\t\t\t// Remove a previous error message\n\t\t\t$widgetContent.find( '.widget-error' ).remove();\n\n\t\t\tthis.container.addClass( 'widget-form-loading' );\n\t\t\tthis.container.addClass( 'previewer-loading' );\n\t\t\tprocessing = api.state( 'processing' );\n\t\t\tprocessing( processing() + 1 );\n\n\t\t\tif ( ! this.liveUpdateMode ) {\n\t\t\t\tthis.container.addClass( 'widget-form-disabled' );\n\t\t\t}\n\n\t\t\tparams = {};\n\t\t\tparams.action = 'update-widget';\n\t\t\tparams.wp_customize = 'on';\n\t\t\tparams.nonce = api.Widgets.data.nonce;\n\t\t\tparams.theme = api.settings.theme.stylesheet;\n\t\t\tparams.customized = wp.customize.previewer.query().customized;\n\n\t\t\tdata = $.param( params );\n\t\t\t$inputs = this._getInputs( $widgetContent );\n\n\t\t\t// Store the value we're submitting in data so that when the response comes back,\n\t\t\t// we know if it got sanitized; if there is no difference in the sanitized value,\n\t\t\t// then we do not need to touch the UI and mess up the user's ongoing editing.\n\t\t\t$inputs.each( function() {\n\t\t\t\t$( this ).data( 'state' + updateNumber, self._getInputState( this ) );\n\t\t\t} );\n\n\t\t\tif ( instanceOverride ) {\n\t\t\t\tdata += '&' + $.param( { 'sanitized_widget_setting': JSON.stringify( instanceOverride ) } );\n\t\t\t} else {\n\t\t\t\tdata += '&' + $inputs.serialize();\n\t\t\t}\n\t\t\tdata += '&' + $widgetContent.find( '~ :input' ).serialize();\n\n\t\t\tif ( this._previousUpdateRequest ) {\n\t\t\t\tthis._previousUpdateRequest.abort();\n\t\t\t}\n\t\t\tjqxhr = $.post( wp.ajax.settings.url, data );\n\t\t\tthis._previousUpdateRequest = jqxhr;\n\n\t\t\tjqxhr.done( function( r ) {\n\t\t\t\tvar message, sanitizedForm,\t$sanitizedInputs, hasSameInputsInResponse,\n\t\t\t\t\tisLiveUpdateAborted = false;\n\n\t\t\t\t// Check if the user is logged out.\n\t\t\t\tif ( '0' === r ) {\n\t\t\t\t\tapi.previewer.preview.iframe.hide();\n\t\t\t\t\tapi.previewer.login().done( function() {\n\t\t\t\t\t\tself.updateWidget( args );\n\t\t\t\t\t\tapi.previewer.preview.iframe.show();\n\t\t\t\t\t} );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check for cheaters.\n\t\t\t\tif ( '-1' === r ) {\n\t\t\t\t\tapi.previewer.cheatin();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( r.success ) {\n\t\t\t\t\tsanitizedForm = $( '<div>' + r.data.form + '</div>' );\n\t\t\t\t\t$sanitizedInputs = self._getInputs( sanitizedForm );\n\t\t\t\t\thasSameInputsInResponse = self._getInputsSignature( $inputs ) === self._getInputsSignature( $sanitizedInputs );\n\n\t\t\t\t\t// Restore live update mode if sanitized fields are now aligned with the existing fields\n\t\t\t\t\tif ( hasSameInputsInResponse && ! self.liveUpdateMode ) {\n\t\t\t\t\t\tself.liveUpdateMode = true;\n\t\t\t\t\t\tself.container.removeClass( 'widget-form-disabled' );\n\t\t\t\t\t\tself.container.find( 'input[name=\"savewidget\"]' ).hide();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Sync sanitized field states to existing fields if they are aligned\n\t\t\t\t\tif ( hasSameInputsInResponse && self.liveUpdateMode ) {\n\t\t\t\t\t\t$inputs.each( function( i ) {\n\t\t\t\t\t\t\tvar $input = $( this ),\n\t\t\t\t\t\t\t\t$sanitizedInput = $( $sanitizedInputs[i] ),\n\t\t\t\t\t\t\t\tsubmittedState, sanitizedState,\tcanUpdateState;\n\n\t\t\t\t\t\t\tsubmittedState = $input.data( 'state' + updateNumber );\n\t\t\t\t\t\t\tsanitizedState = self._getInputState( $sanitizedInput );\n\t\t\t\t\t\t\t$input.data( 'sanitized', sanitizedState );\n\n\t\t\t\t\t\t\tcanUpdateState = ( ! _.isEqual( submittedState, sanitizedState ) && ( args.ignoreActiveElement || ! $input.is( document.activeElement ) ) );\n\t\t\t\t\t\t\tif ( canUpdateState ) {\n\t\t\t\t\t\t\t\tself._setInputState( $input, sanitizedState );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t$( document ).trigger( 'widget-synced', [ $widgetRoot, r.data.form ] );\n\n\t\t\t\t\t// Otherwise, if sanitized fields are not aligned with existing fields, disable live update mode if enabled\n\t\t\t\t\t} else if ( self.liveUpdateMode ) {\n\t\t\t\t\t\tself.liveUpdateMode = false;\n\t\t\t\t\t\tself.container.find( 'input[name=\"savewidget\"]' ).show();\n\t\t\t\t\t\tisLiveUpdateAborted = true;\n\n\t\t\t\t\t// Otherwise, replace existing form with the sanitized form\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$widgetContent.html( r.data.form );\n\n\t\t\t\t\t\tself.container.removeClass( 'widget-form-disabled' );\n\n\t\t\t\t\t\t$( document ).trigger( 'widget-updated', [ $widgetRoot ] );\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * If the old instance is identical to the new one, there is nothing new\n\t\t\t\t\t * needing to be rendered, and so we can preempt the event for the\n\t\t\t\t\t * preview finishing loading.\n\t\t\t\t\t */\n\t\t\t\t\tisChanged = ! isLiveUpdateAborted && ! _( self.setting() ).isEqual( r.data.instance );\n\t\t\t\t\tif ( isChanged ) {\n\t\t\t\t\t\tself.isWidgetUpdating = true; // suppress triggering another updateWidget\n\t\t\t\t\t\tself.setting( r.data.instance );\n\t\t\t\t\t\tself.isWidgetUpdating = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// no change was made, so stop the spinner now instead of when the preview would updates\n\t\t\t\t\t\tself.container.removeClass( 'previewer-loading' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( completeCallback ) {\n\t\t\t\t\t\tcompleteCallback.call( self, null, { noChange: ! isChanged, ajaxFinished: true } );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// General error message\n\t\t\t\t\tmessage = l10n.error;\n\n\t\t\t\t\tif ( r.data && r.data.message ) {\n\t\t\t\t\t\tmessage = r.data.message;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( completeCallback ) {\n\t\t\t\t\t\tcompleteCallback.call( self, message );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$widgetContent.prepend( '<p class=\"widget-error\"><strong>' + message + '</strong></p>' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tjqxhr.fail( function( jqXHR, textStatus ) {\n\t\t\t\tif ( completeCallback ) {\n\t\t\t\t\tcompleteCallback.call( self, textStatus );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tjqxhr.always( function() {\n\t\t\t\tself.container.removeClass( 'widget-form-loading' );\n\n\t\t\t\t$inputs.each( function() {\n\t\t\t\t\t$( this ).removeData( 'state' + updateNumber );\n\t\t\t\t} );\n\n\t\t\t\tprocessing( processing() - 1 );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Expand the accordion section containing a control\n\t\t */\n\t\texpandControlSection: function() {\n\t\t\tapi.Control.prototype.expand.call( this );\n\t\t},\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Boolean} expanded\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if state already applied\n\t\t */\n\t\t_toggleExpanded: api.Section.prototype._toggleExpanded,\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if already expanded\n\t\t */\n\t\texpand: api.Section.prototype.expand,\n\n\t\t/**\n\t\t * Expand the widget form control\n\t\t *\n\t\t * @deprecated 4.1.0 Use this.expand() instead.\n\t\t */\n\t\texpandForm: function() {\n\t\t\tthis.expand();\n\t\t},\n\n\t\t/**\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param {Object} [params]\n\t\t * @returns {Boolean} false if already collapsed\n\t\t */\n\t\tcollapse: api.Section.prototype.collapse,\n\n\t\t/**\n\t\t * Collapse the widget form control\n\t\t *\n\t\t * @deprecated 4.1.0 Use this.collapse() instead.\n\t\t */\n\t\tcollapseForm: function() {\n\t\t\tthis.collapse();\n\t\t},\n\n\t\t/**\n\t\t * Expand or collapse the widget control\n\t\t *\n\t\t * @deprecated this is poor naming, and it is better to directly set control.expanded( showOrHide )\n\t\t *\n\t\t * @param {boolean|undefined} [showOrHide] If not supplied, will be inverse of current visibility\n\t\t */\n\t\ttoggleForm: function( showOrHide ) {\n\t\t\tif ( typeof showOrHide === 'undefined' ) {\n\t\t\t\tshowOrHide = ! this.expanded();\n\t\t\t}\n\t\t\tthis.expanded( showOrHide );\n\t\t},\n\n\t\t/**\n\t\t * Respond to change in the expanded state.\n\t\t *\n\t\t * @param {Boolean} expanded\n\t\t * @param {Object} args  merged on top of this.defaultActiveArguments\n\t\t */\n\t\tonChangeExpanded: function ( expanded, args ) {\n\t\t\tvar self = this, $widget, $inside, complete, prevComplete;\n\n\t\t\tself.embedWidgetControl(); // Make sure the outer form is embedded so that the expanded state can be set in the UI.\n\t\t\tif ( expanded ) {\n\t\t\t\tself.embedWidgetContent();\n\t\t\t}\n\n\t\t\t// If the expanded state is unchanged only manipulate container expanded states\n\t\t\tif ( args.unchanged ) {\n\t\t\t\tif ( expanded ) {\n\t\t\t\t\tapi.Control.prototype.expand.call( self, {\n\t\t\t\t\t\tcompleteCallback:  args.completeCallback\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$widget = this.container.find( 'div.widget:first' );\n\t\t\t$inside = $widget.find( '.widget-inside:first' );\n\n\t\t\tif ( expanded ) {\n\n\t\t\t\tif ( self.section() && api.section( self.section() ) ) {\n\t\t\t\t\tself.expandControlSection();\n\t\t\t\t}\n\n\t\t\t\t// Close all other widget controls before expanding this one\n\t\t\t\tapi.control.each( function( otherControl ) {\n\t\t\t\t\tif ( self.params.type === otherControl.params.type && self !== otherControl ) {\n\t\t\t\t\t\totherControl.collapse();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tcomplete = function() {\n\t\t\t\t\tself.container.removeClass( 'expanding' );\n\t\t\t\t\tself.container.addClass( 'expanded' );\n\t\t\t\t\tself.container.trigger( 'expanded' );\n\t\t\t\t};\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\tprevComplete = complete;\n\t\t\t\t\tcomplete = function () {\n\t\t\t\t\t\tprevComplete();\n\t\t\t\t\t\targs.completeCallback();\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif ( self.params.is_wide ) {\n\t\t\t\t\t$inside.fadeIn( args.duration, complete );\n\t\t\t\t} else {\n\t\t\t\t\t$inside.slideDown( args.duration, complete );\n\t\t\t\t}\n\n\t\t\t\tself.container.trigger( 'expand' );\n\t\t\t\tself.container.addClass( 'expanding' );\n\t\t\t} else {\n\n\t\t\t\tcomplete = function() {\n\t\t\t\t\tself.container.removeClass( 'collapsing' );\n\t\t\t\t\tself.container.removeClass( 'expanded' );\n\t\t\t\t\tself.container.trigger( 'collapsed' );\n\t\t\t\t};\n\t\t\t\tif ( args.completeCallback ) {\n\t\t\t\t\tprevComplete = complete;\n\t\t\t\t\tcomplete = function () {\n\t\t\t\t\t\tprevComplete();\n\t\t\t\t\t\targs.completeCallback();\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tself.container.trigger( 'collapse' );\n\t\t\t\tself.container.addClass( 'collapsing' );\n\n\t\t\t\tif ( self.params.is_wide ) {\n\t\t\t\t\t$inside.fadeOut( args.duration, complete );\n\t\t\t\t} else {\n\t\t\t\t\t$inside.slideUp( args.duration, function() {\n\t\t\t\t\t\t$widget.css( { width:'', margin:'' } );\n\t\t\t\t\t\tcomplete();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get the position (index) of the widget in the containing sidebar\n\t\t *\n\t\t * @returns {Number}\n\t\t */\n\t\tgetWidgetSidebarPosition: function() {\n\t\t\tvar sidebarWidgetIds, position;\n\n\t\t\tsidebarWidgetIds = this.getSidebarWidgetsControl().setting();\n\t\t\tposition = _.indexOf( sidebarWidgetIds, this.params.widget_id );\n\n\t\t\tif ( position === -1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn position;\n\t\t},\n\n\t\t/**\n\t\t * Move widget up one in the sidebar\n\t\t */\n\t\tmoveUp: function() {\n\t\t\tthis._moveWidgetByOne( -1 );\n\t\t},\n\n\t\t/**\n\t\t * Move widget up one in the sidebar\n\t\t */\n\t\tmoveDown: function() {\n\t\t\tthis._moveWidgetByOne( 1 );\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t *\n\t\t * @param {Number} offset 1|-1\n\t\t */\n\t\t_moveWidgetByOne: function( offset ) {\n\t\t\tvar i, sidebarWidgetsSetting, sidebarWidgetIds,\tadjacentWidgetId;\n\n\t\t\ti = this.getWidgetSidebarPosition();\n\n\t\t\tsidebarWidgetsSetting = this.getSidebarWidgetsControl().setting;\n\t\t\tsidebarWidgetIds = Array.prototype.slice.call( sidebarWidgetsSetting() ); // clone\n\t\t\tadjacentWidgetId = sidebarWidgetIds[i + offset];\n\t\t\tsidebarWidgetIds[i + offset] = this.params.widget_id;\n\t\t\tsidebarWidgetIds[i] = adjacentWidgetId;\n\n\t\t\tsidebarWidgetsSetting( sidebarWidgetIds );\n\t\t},\n\n\t\t/**\n\t\t * Toggle visibility of the widget move area\n\t\t *\n\t\t * @param {Boolean} [showOrHide]\n\t\t */\n\t\ttoggleWidgetMoveArea: function( showOrHide ) {\n\t\t\tvar self = this, $moveWidgetArea;\n\n\t\t\t$moveWidgetArea = this.container.find( '.move-widget-area' );\n\n\t\t\tif ( typeof showOrHide === 'undefined' ) {\n\t\t\t\tshowOrHide = ! $moveWidgetArea.hasClass( 'active' );\n\t\t\t}\n\n\t\t\tif ( showOrHide ) {\n\t\t\t\t// reset the selected sidebar\n\t\t\t\t$moveWidgetArea.find( '.selected' ).removeClass( 'selected' );\n\n\t\t\t\t$moveWidgetArea.find( 'li' ).filter( function() {\n\t\t\t\t\treturn $( this ).data( 'id' ) === self.params.sidebar_id;\n\t\t\t\t} ).addClass( 'selected' );\n\n\t\t\t\tthis.container.find( '.move-widget-btn' ).prop( 'disabled', true );\n\t\t\t}\n\n\t\t\t$moveWidgetArea.toggleClass( 'active', showOrHide );\n\t\t},\n\n\t\t/**\n\t\t * Highlight the widget control and section\n\t\t */\n\t\thighlightSectionAndControl: function() {\n\t\t\tvar $target;\n\n\t\t\tif ( this.container.is( ':hidden' ) ) {\n\t\t\t\t$target = this.container.closest( '.control-section' );\n\t\t\t} else {\n\t\t\t\t$target = this.container;\n\t\t\t}\n\n\t\t\t$( '.highlighted' ).removeClass( 'highlighted' );\n\t\t\t$target.addClass( 'highlighted' );\n\n\t\t\tsetTimeout( function() {\n\t\t\t\t$target.removeClass( 'highlighted' );\n\t\t\t}, 500 );\n\t\t}\n\t} );\n\n\t/**\n\t * wp.customize.Widgets.WidgetsPanel\n\t *\n\t * Customizer panel containing the widget area sections.\n\t *\n\t * @since 4.4.0\n\t */\n\tapi.Widgets.WidgetsPanel = api.Panel.extend({\n\n\t\t/**\n\t\t * Add and manage the display of the no-rendered-areas notice.\n\t\t *\n\t\t * @since 4.4.0\n\t\t */\n\t\tready: function () {\n\t\t\tvar panel = this;\n\n\t\t\tapi.Panel.prototype.ready.call( panel );\n\n\t\t\tpanel.deferred.embedded.done(function() {\n\t\t\t\tvar panelMetaContainer, noRenderedAreasNotice, shouldShowNotice;\n\t\t\t\tpanelMetaContainer = panel.container.find( '.panel-meta' );\n\t\t\t\tnoRenderedAreasNotice = $( '<div></div>', {\n\t\t\t\t\t'class': 'no-widget-areas-rendered-notice'\n\t\t\t\t});\n\t\t\t\tnoRenderedAreasNotice.append( $( '<em></em>', {\n\t\t\t\t\ttext: l10n.noAreasRendered\n\t\t\t\t} ) );\n\t\t\t\tpanelMetaContainer.append( noRenderedAreasNotice );\n\n\t\t\t\tshouldShowNotice = function() {\n\t\t\t\t\treturn ( 0 === _.filter( panel.sections(), function( section ) {\n\t\t\t\t\t\treturn section.active();\n\t\t\t\t\t} ).length );\n\t\t\t\t};\n\n\t\t\t\t/*\n\t\t\t\t * Set the initial visibility state for rendered notice.\n\t\t\t\t * Update the visibility of the notice whenever a reflow happens.\n\t\t\t\t */\n\t\t\t\tnoRenderedAreasNotice.toggle( shouldShowNotice() );\n\t\t\t\tapi.previewer.deferred.active.done( function () {\n\t\t\t\t\tnoRenderedAreasNotice.toggle( shouldShowNotice() );\n\t\t\t\t});\n\t\t\t\tapi.bind( 'pane-contents-reflowed', function() {\n\t\t\t\t\tvar duration = ( 'resolved' === api.previewer.deferred.active.state() ) ? 'fast' : 0;\n\t\t\t\t\tif ( shouldShowNotice() ) {\n\t\t\t\t\t\tnoRenderedAreasNotice.slideDown( duration );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnoRenderedAreasNotice.slideUp( duration );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Allow an active widgets panel to be contextually active even when it has no active sections (widget areas).\n\t\t *\n\t\t * This ensures that the widgets panel appears even when there are no\n\t\t * sidebars displayed on the URL currently being previewed.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @returns {boolean}\n\t\t */\n\t\tisContextuallyActive: function() {\n\t\t\tvar panel = this;\n\t\t\treturn panel.active();\n\t\t}\n\t});\n\n\t/**\n\t * wp.customize.Widgets.SidebarSection\n\t *\n\t * Customizer section representing a widget area widget\n\t *\n\t * @since 4.1.0\n\t */\n\tapi.Widgets.SidebarSection = api.Section.extend({\n\n\t\t/**\n\t\t * Sync the section's active state back to the Backbone model's is_rendered attribute\n\t\t *\n\t\t * @since 4.1.0\n\t\t */\n\t\tready: function () {\n\t\t\tvar section = this, registeredSidebar;\n\t\t\tapi.Section.prototype.ready.call( this );\n\t\t\tregisteredSidebar = api.Widgets.registeredSidebars.get( section.params.sidebarId );\n\t\t\tsection.active.bind( function ( active ) {\n\t\t\t\tregisteredSidebar.set( 'is_rendered', active );\n\t\t\t});\n\t\t\tregisteredSidebar.set( 'is_rendered', section.active() );\n\t\t}\n\t});\n\n\t/**\n\t * wp.customize.Widgets.SidebarControl\n\t *\n\t * Customizer control for widgets.\n\t * Note that 'sidebar_widgets' must match the WP_Widget_Area_Customize_Control::$type\n\t *\n\t * @since 3.9.0\n\t *\n\t * @constructor\n\t * @augments wp.customize.Control\n\t */\n\tapi.Widgets.SidebarControl = api.Control.extend({\n\n\t\t/**\n\t\t * Set up the control\n\t\t */\n\t\tready: function() {\n\t\t\tthis.$controlSection = this.container.closest( '.control-section' );\n\t\t\tthis.$sectionContent = this.container.closest( '.accordion-section-content' );\n\n\t\t\tthis._setupModel();\n\t\t\tthis._setupSortable();\n\t\t\tthis._setupAddition();\n\t\t\tthis._applyCardinalOrderClassNames();\n\t\t},\n\n\t\t/**\n\t\t * Update ordering of widget control forms when the setting is updated\n\t\t */\n\t\t_setupModel: function() {\n\t\t\tvar self = this;\n\n\t\t\tthis.setting.bind( function( newWidgetIds, oldWidgetIds ) {\n\t\t\t\tvar widgetFormControls, removedWidgetIds, priority;\n\n\t\t\t\tremovedWidgetIds = _( oldWidgetIds ).difference( newWidgetIds );\n\n\t\t\t\t// Filter out any persistent widget IDs for widgets which have been deactivated\n\t\t\t\tnewWidgetIds = _( newWidgetIds ).filter( function( newWidgetId ) {\n\t\t\t\t\tvar parsedWidgetId = parseWidgetId( newWidgetId );\n\n\t\t\t\t\treturn !! api.Widgets.availableWidgets.findWhere( { id_base: parsedWidgetId.id_base } );\n\t\t\t\t} );\n\n\t\t\t\twidgetFormControls = _( newWidgetIds ).map( function( widgetId ) {\n\t\t\t\t\tvar widgetFormControl = api.Widgets.getWidgetFormControlForWidget( widgetId );\n\n\t\t\t\t\tif ( ! widgetFormControl ) {\n\t\t\t\t\t\twidgetFormControl = self.addWidget( widgetId );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn widgetFormControl;\n\t\t\t\t} );\n\n\t\t\t\t// Sort widget controls to their new positions\n\t\t\t\twidgetFormControls.sort( function( a, b ) {\n\t\t\t\t\tvar aIndex = _.indexOf( newWidgetIds, a.params.widget_id ),\n\t\t\t\t\t\tbIndex = _.indexOf( newWidgetIds, b.params.widget_id );\n\t\t\t\t\treturn aIndex - bIndex;\n\t\t\t\t});\n\n\t\t\t\tpriority = 0;\n\t\t\t\t_( widgetFormControls ).each( function ( control ) {\n\t\t\t\t\tcontrol.priority( priority );\n\t\t\t\t\tcontrol.section( self.section() );\n\t\t\t\t\tpriority += 1;\n\t\t\t\t});\n\t\t\t\tself.priority( priority ); // Make sure sidebar control remains at end\n\n\t\t\t\t// Re-sort widget form controls (including widgets form other sidebars newly moved here)\n\t\t\t\tself._applyCardinalOrderClassNames();\n\n\t\t\t\t// If the widget was dragged into the sidebar, make sure the sidebar_id param is updated\n\t\t\t\t_( widgetFormControls ).each( function( widgetFormControl ) {\n\t\t\t\t\twidgetFormControl.params.sidebar_id = self.params.sidebar_id;\n\t\t\t\t} );\n\n\t\t\t\t// Cleanup after widget removal\n\t\t\t\t_( removedWidgetIds ).each( function( removedWidgetId ) {\n\n\t\t\t\t\t// Using setTimeout so that when moving a widget to another sidebar, the other sidebars_widgets settings get a chance to update\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\tvar removedControl, wasDraggedToAnotherSidebar, inactiveWidgets, removedIdBase,\n\t\t\t\t\t\t\twidget, isPresentInAnotherSidebar = false;\n\n\t\t\t\t\t\t// Check if the widget is in another sidebar\n\t\t\t\t\t\tapi.each( function( otherSetting ) {\n\t\t\t\t\t\t\tif ( otherSetting.id === self.setting.id || 0 !== otherSetting.id.indexOf( 'sidebars_widgets[' ) || otherSetting.id === 'sidebars_widgets[wp_inactive_widgets]' ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar otherSidebarWidgets = otherSetting(), i;\n\n\t\t\t\t\t\t\ti = _.indexOf( otherSidebarWidgets, removedWidgetId );\n\t\t\t\t\t\t\tif ( -1 !== i ) {\n\t\t\t\t\t\t\t\tisPresentInAnotherSidebar = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t// If the widget is present in another sidebar, abort!\n\t\t\t\t\t\tif ( isPresentInAnotherSidebar ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tremovedControl = api.Widgets.getWidgetFormControlForWidget( removedWidgetId );\n\n\t\t\t\t\t\t// Detect if widget control was dragged to another sidebar\n\t\t\t\t\t\twasDraggedToAnotherSidebar = removedControl && $.contains( document, removedControl.container[0] ) && ! $.contains( self.$sectionContent[0], removedControl.container[0] );\n\n\t\t\t\t\t\t// Delete any widget form controls for removed widgets\n\t\t\t\t\t\tif ( removedControl && ! wasDraggedToAnotherSidebar ) {\n\t\t\t\t\t\t\tapi.control.remove( removedControl.id );\n\t\t\t\t\t\t\tremovedControl.container.remove();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Move widget to inactive widgets sidebar (move it to trash) if has been previously saved\n\t\t\t\t\t\t// This prevents the inactive widgets sidebar from overflowing with throwaway widgets\n\t\t\t\t\t\tif ( api.Widgets.savedWidgetIds[removedWidgetId] ) {\n\t\t\t\t\t\t\tinactiveWidgets = api.value( 'sidebars_widgets[wp_inactive_widgets]' )().slice();\n\t\t\t\t\t\t\tinactiveWidgets.push( removedWidgetId );\n\t\t\t\t\t\t\tapi.value( 'sidebars_widgets[wp_inactive_widgets]' )( _( inactiveWidgets ).unique() );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Make old single widget available for adding again\n\t\t\t\t\t\tremovedIdBase = parseWidgetId( removedWidgetId ).id_base;\n\t\t\t\t\t\twidget = api.Widgets.availableWidgets.findWhere( { id_base: removedIdBase } );\n\t\t\t\t\t\tif ( widget && ! widget.get( 'is_multi' ) ) {\n\t\t\t\t\t\t\twidget.set( 'is_disabled', false );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Allow widgets in sidebar to be re-ordered, and for the order to be previewed\n\t\t */\n\t\t_setupSortable: function() {\n\t\t\tvar self = this;\n\n\t\t\tthis.isReordering = false;\n\n\t\t\t/**\n\t\t\t * Update widget order setting when controls are re-ordered\n\t\t\t */\n\t\t\tthis.$sectionContent.sortable( {\n\t\t\t\titems: '> .customize-control-widget_form',\n\t\t\t\thandle: '.widget-top',\n\t\t\t\taxis: 'y',\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tconnectWith: '.accordion-section-content:has(.customize-control-sidebar_widgets)',\n\t\t\t\tupdate: function() {\n\t\t\t\t\tvar widgetContainerIds = self.$sectionContent.sortable( 'toArray' ), widgetIds;\n\n\t\t\t\t\twidgetIds = $.map( widgetContainerIds, function( widgetContainerId ) {\n\t\t\t\t\t\treturn $( '#' + widgetContainerId ).find( ':input[name=widget-id]' ).val();\n\t\t\t\t\t} );\n\n\t\t\t\t\tself.setting( widgetIds );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Expand other Customizer sidebar section when dragging a control widget over it,\n\t\t\t * allowing the control to be dropped into another section\n\t\t\t */\n\t\t\tthis.$controlSection.find( '.accordion-section-title' ).droppable({\n\t\t\t\taccept: '.customize-control-widget_form',\n\t\t\t\tover: function() {\n\t\t\t\t\tvar section = api.section( self.section.get() );\n\t\t\t\t\tsection.expand({\n\t\t\t\t\t\tallowMultiple: true, // Prevent the section being dragged from to be collapsed\n\t\t\t\t\t\tcompleteCallback: function () {\n\t\t\t\t\t\t\t// @todo It is not clear when refreshPositions should be called on which sections, or if it is even needed\n\t\t\t\t\t\t\tapi.section.each( function ( otherSection ) {\n\t\t\t\t\t\t\t\tif ( otherSection.container.find( '.customize-control-sidebar_widgets' ).length ) {\n\t\t\t\t\t\t\t\t\totherSection.container.find( '.accordion-section-content:first' ).sortable( 'refreshPositions' );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Keyboard-accessible reordering\n\t\t\t */\n\t\t\tthis.container.find( '.reorder-toggle' ).on( 'click', function() {\n\t\t\t\tself.toggleReordering( ! self.isReordering );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Set up UI for adding a new widget\n\t\t */\n\t\t_setupAddition: function() {\n\t\t\tvar self = this;\n\n\t\t\tthis.container.find( '.add-new-widget' ).on( 'click', function() {\n\t\t\t\tvar addNewWidgetBtn = $( this );\n\n\t\t\t\tif ( self.$sectionContent.hasClass( 'reordering' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( ! $( 'body' ).hasClass( 'adding-widget' ) ) {\n\t\t\t\t\taddNewWidgetBtn.attr( 'aria-expanded', 'true' );\n\t\t\t\t\tapi.Widgets.availableWidgetsPanel.open( self );\n\t\t\t\t} else {\n\t\t\t\t\taddNewWidgetBtn.attr( 'aria-expanded', 'false' );\n\t\t\t\t\tapi.Widgets.availableWidgetsPanel.close();\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Add classes to the widget_form controls to assist with styling\n\t\t */\n\t\t_applyCardinalOrderClassNames: function() {\n\t\t\tvar widgetControls = [];\n\t\t\t_.each( this.setting(), function ( widgetId ) {\n\t\t\t\tvar widgetControl = api.Widgets.getWidgetFormControlForWidget( widgetId );\n\t\t\t\tif ( widgetControl ) {\n\t\t\t\t\twidgetControls.push( widgetControl );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif ( ! widgetControls.length ) {\n\t\t\t\tthis.container.find( '.reorder-toggle' ).hide();\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tthis.container.find( '.reorder-toggle' ).show();\n\t\t\t}\n\n\t\t\t$( widgetControls ).each( function () {\n\t\t\t\t$( this.container )\n\t\t\t\t\t.removeClass( 'first-widget' )\n\t\t\t\t\t.removeClass( 'last-widget' )\n\t\t\t\t\t.find( '.move-widget-down, .move-widget-up' ).prop( 'tabIndex', 0 );\n\t\t\t});\n\n\t\t\t_.first( widgetControls ).container\n\t\t\t\t.addClass( 'first-widget' )\n\t\t\t\t.find( '.move-widget-up' ).prop( 'tabIndex', -1 );\n\n\t\t\t_.last( widgetControls ).container\n\t\t\t\t.addClass( 'last-widget' )\n\t\t\t\t.find( '.move-widget-down' ).prop( 'tabIndex', -1 );\n\t\t},\n\n\n\t\t/***********************************************************************\n\t\t * Begin public API methods\n\t\t **********************************************************************/\n\n\t\t/**\n\t\t * Enable/disable the reordering UI\n\t\t *\n\t\t * @param {Boolean} showOrHide to enable/disable reordering\n\t\t *\n\t\t * @todo We should have a reordering state instead and rename this to onChangeReordering\n\t\t */\n\t\ttoggleReordering: function( showOrHide ) {\n\t\t\tvar addNewWidgetBtn = this.$sectionContent.find( '.add-new-widget' ),\n\t\t\t\treorderBtn = this.container.find( '.reorder-toggle' ),\n\t\t\t\twidgetsTitle = this.$sectionContent.find( '.widget-title' );\n\n\t\t\tshowOrHide = Boolean( showOrHide );\n\n\t\t\tif ( showOrHide === this.$sectionContent.hasClass( 'reordering' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.isReordering = showOrHide;\n\t\t\tthis.$sectionContent.toggleClass( 'reordering', showOrHide );\n\n\t\t\tif ( showOrHide ) {\n\t\t\t\t_( this.getWidgetFormControls() ).each( function( formControl ) {\n\t\t\t\t\tformControl.collapse();\n\t\t\t\t} );\n\n\t\t\t\taddNewWidgetBtn.attr({ 'tabindex': '-1', 'aria-hidden': 'true' });\n\t\t\t\treorderBtn.attr( 'aria-label', l10n.reorderLabelOff );\n\t\t\t\twp.a11y.speak( l10n.reorderModeOn );\n\t\t\t\t// Hide widget titles while reordering: title is already in the reorder controls.\n\t\t\t\twidgetsTitle.attr( 'aria-hidden', 'true' );\n\t\t\t} else {\n\t\t\t\taddNewWidgetBtn.removeAttr( 'tabindex aria-hidden' );\n\t\t\t\treorderBtn.attr( 'aria-label', l10n.reorderLabelOn );\n\t\t\t\twp.a11y.speak( l10n.reorderModeOff );\n\t\t\t\twidgetsTitle.attr( 'aria-hidden', 'false' );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get the widget_form Customize controls associated with the current sidebar.\n\t\t *\n\t\t * @since 3.9\n\t\t * @return {wp.customize.controlConstructor.widget_form[]}\n\t\t */\n\t\tgetWidgetFormControls: function() {\n\t\t\tvar formControls = [];\n\n\t\t\t_( this.setting() ).each( function( widgetId ) {\n\t\t\t\tvar settingId = widgetIdToSettingId( widgetId ),\n\t\t\t\t\tformControl = api.control( settingId );\n\t\t\t\tif ( formControl ) {\n\t\t\t\t\tformControls.push( formControl );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn formControls;\n\t\t},\n\n\t\t/**\n\t\t * @param {string} widgetId or an id_base for adding a previously non-existing widget\n\t\t * @returns {object|false} widget_form control instance, or false on error\n\t\t */\n\t\taddWidget: function( widgetId ) {\n\t\t\tvar self = this, controlHtml, $widget, controlType = 'widget_form', controlContainer, controlConstructor,\n\t\t\t\tparsedWidgetId = parseWidgetId( widgetId ),\n\t\t\t\twidgetNumber = parsedWidgetId.number,\n\t\t\t\twidgetIdBase = parsedWidgetId.id_base,\n\t\t\t\twidget = api.Widgets.availableWidgets.findWhere( {id_base: widgetIdBase} ),\n\t\t\t\tsettingId, isExistingWidget, widgetFormControl, sidebarWidgets, settingArgs, setting;\n\n\t\t\tif ( ! widget ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( widgetNumber && ! widget.get( 'is_multi' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Set up new multi widget\n\t\t\tif ( widget.get( 'is_multi' ) && ! widgetNumber ) {\n\t\t\t\twidget.set( 'multi_number', widget.get( 'multi_number' ) + 1 );\n\t\t\t\twidgetNumber = widget.get( 'multi_number' );\n\t\t\t}\n\n\t\t\tcontrolHtml = $.trim( $( '#widget-tpl-' + widget.get( 'id' ) ).html() );\n\t\t\tif ( widget.get( 'is_multi' ) ) {\n\t\t\t\tcontrolHtml = controlHtml.replace( /<[^<>]+>/g, function( m ) {\n\t\t\t\t\treturn m.replace( /__i__|%i%/g, widgetNumber );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\twidget.set( 'is_disabled', true ); // Prevent single widget from being added again now\n\t\t\t}\n\n\t\t\t$widget = $( controlHtml );\n\n\t\t\tcontrolContainer = $( '<li/>' )\n\t\t\t\t.addClass( 'customize-control' )\n\t\t\t\t.addClass( 'customize-control-' + controlType )\n\t\t\t\t.append( $widget );\n\n\t\t\t// Remove icon which is visible inside the panel\n\t\t\tcontrolContainer.find( '> .widget-icon' ).remove();\n\n\t\t\tif ( widget.get( 'is_multi' ) ) {\n\t\t\t\tcontrolContainer.find( 'input[name=\"widget_number\"]' ).val( widgetNumber );\n\t\t\t\tcontrolContainer.find( 'input[name=\"multi_number\"]' ).val( widgetNumber );\n\t\t\t}\n\n\t\t\twidgetId = controlContainer.find( '[name=\"widget-id\"]' ).val();\n\n\t\t\tcontrolContainer.hide(); // to be slid-down below\n\n\t\t\tsettingId = 'widget_' + widget.get( 'id_base' );\n\t\t\tif ( widget.get( 'is_multi' ) ) {\n\t\t\t\tsettingId += '[' + widgetNumber + ']';\n\t\t\t}\n\t\t\tcontrolContainer.attr( 'id', 'customize-control-' + settingId.replace( /\\]/g, '' ).replace( /\\[/g, '-' ) );\n\n\t\t\t// Only create setting if it doesn't already exist (if we're adding a pre-existing inactive widget)\n\t\t\tisExistingWidget = api.has( settingId );\n\t\t\tif ( ! isExistingWidget ) {\n\t\t\t\tsettingArgs = {\n\t\t\t\t\ttransport: 'refresh',\n\t\t\t\t\tpreviewer: this.setting.previewer\n\t\t\t\t};\n\t\t\t\tsetting = api.create( settingId, settingId, '', settingArgs );\n\t\t\t\tsetting.set( {} ); // mark dirty, changing from '' to {}\n\t\t\t}\n\n\t\t\tcontrolConstructor = api.controlConstructor[controlType];\n\t\t\twidgetFormControl = new controlConstructor( settingId, {\n\t\t\t\tparams: {\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\t'default': settingId\n\t\t\t\t\t},\n\t\t\t\t\tcontent: controlContainer,\n\t\t\t\t\tsidebar_id: self.params.sidebar_id,\n\t\t\t\t\twidget_id: widgetId,\n\t\t\t\t\twidget_id_base: widget.get( 'id_base' ),\n\t\t\t\t\ttype: controlType,\n\t\t\t\t\tis_new: ! isExistingWidget,\n\t\t\t\t\twidth: widget.get( 'width' ),\n\t\t\t\t\theight: widget.get( 'height' ),\n\t\t\t\t\tis_wide: widget.get( 'is_wide' ),\n\t\t\t\t\tactive: true\n\t\t\t\t},\n\t\t\t\tpreviewer: self.setting.previewer\n\t\t\t} );\n\t\t\tapi.control.add( settingId, widgetFormControl );\n\n\t\t\t// Make sure widget is removed from the other sidebars\n\t\t\tapi.each( function( otherSetting ) {\n\t\t\t\tif ( otherSetting.id === self.setting.id ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( 0 !== otherSetting.id.indexOf( 'sidebars_widgets[' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar otherSidebarWidgets = otherSetting().slice(),\n\t\t\t\t\ti = _.indexOf( otherSidebarWidgets, widgetId );\n\n\t\t\t\tif ( -1 !== i ) {\n\t\t\t\t\totherSidebarWidgets.splice( i );\n\t\t\t\t\totherSetting( otherSidebarWidgets );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Add widget to this sidebar\n\t\t\tsidebarWidgets = this.setting().slice();\n\t\t\tif ( -1 === _.indexOf( sidebarWidgets, widgetId ) ) {\n\t\t\t\tsidebarWidgets.push( widgetId );\n\t\t\t\tthis.setting( sidebarWidgets );\n\t\t\t}\n\n\t\t\tcontrolContainer.slideDown( function() {\n\t\t\t\tif ( isExistingWidget ) {\n\t\t\t\t\twidgetFormControl.updateWidget( {\n\t\t\t\t\t\tinstance: widgetFormControl.setting()\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn widgetFormControl;\n\t\t}\n\t} );\n\n\t// Register models for custom panel, section, and control types\n\t$.extend( api.panelConstructor, {\n\t\twidgets: api.Widgets.WidgetsPanel\n\t});\n\t$.extend( api.sectionConstructor, {\n\t\tsidebar: api.Widgets.SidebarSection\n\t});\n\t$.extend( api.controlConstructor, {\n\t\twidget_form: api.Widgets.WidgetControl,\n\t\tsidebar_widgets: api.Widgets.SidebarControl\n\t});\n\n\t// Refresh the nonce if login sends updated nonces over.\n\tapi.bind( 'nonce-refresh', function( nonces ) {\n\t\tapi.Widgets.data.nonce = nonces['update-widget'];\n\t});\n\n\t/**\n\t * Init Customizer for widgets.\n\t */\n\tapi.bind( 'ready', function() {\n\t\t// Set up the widgets panel\n\t\tapi.Widgets.availableWidgetsPanel = new api.Widgets.AvailableWidgetsPanelView({\n\t\t\tcollection: api.Widgets.availableWidgets\n\t\t});\n\n\t\t// Highlight widget control\n\t\tapi.previewer.bind( 'highlight-widget-control', api.Widgets.highlightWidgetFormControl );\n\n\t\t// Open and focus widget control\n\t\tapi.previewer.bind( 'focus-widget-control', api.Widgets.focusWidgetFormControl );\n\t} );\n\n\t/**\n\t * Highlight a widget control.\n\t *\n\t * @param {string} widgetId\n\t */\n\tapi.Widgets.highlightWidgetFormControl = function( widgetId ) {\n\t\tvar control = api.Widgets.getWidgetFormControlForWidget( widgetId );\n\n\t\tif ( control ) {\n\t\t\tcontrol.highlightSectionAndControl();\n\t\t}\n\t},\n\n\t/**\n\t * Focus a widget control.\n\t *\n\t * @param {string} widgetId\n\t */\n\tapi.Widgets.focusWidgetFormControl = function( widgetId ) {\n\t\tvar control = api.Widgets.getWidgetFormControlForWidget( widgetId );\n\n\t\tif ( control ) {\n\t\t\tcontrol.focus();\n\t\t}\n\t},\n\n\t/**\n\t * Given a widget control, find the sidebar widgets control that contains it.\n\t * @param {string} widgetId\n\t * @return {object|null}\n\t */\n\tapi.Widgets.getSidebarWidgetControlContainingWidget = function( widgetId ) {\n\t\tvar foundControl = null;\n\n\t\t// @todo this can use widgetIdToSettingId(), then pass into wp.customize.control( x ).getSidebarWidgetsControl()\n\t\tapi.control.each( function( control ) {\n\t\t\tif ( control.params.type === 'sidebar_widgets' && -1 !== _.indexOf( control.setting(), widgetId ) ) {\n\t\t\t\tfoundControl = control;\n\t\t\t}\n\t\t} );\n\n\t\treturn foundControl;\n\t};\n\n\t/**\n\t * Given a widget ID for a widget appearing in the preview, get the widget form control associated with it.\n\t *\n\t * @param {string} widgetId\n\t * @return {object|null}\n\t */\n\tapi.Widgets.getWidgetFormControlForWidget = function( widgetId ) {\n\t\tvar foundControl = null;\n\n\t\t// @todo We can just use widgetIdToSettingId() here\n\t\tapi.control.each( function( control ) {\n\t\t\tif ( control.params.type === 'widget_form' && control.params.widget_id === widgetId ) {\n\t\t\t\tfoundControl = control;\n\t\t\t}\n\t\t} );\n\n\t\treturn foundControl;\n\t};\n\n\t/**\n\t * @param {String} widgetId\n\t * @returns {Object}\n\t */\n\tfunction parseWidgetId( widgetId ) {\n\t\tvar matches, parsed = {\n\t\t\tnumber: null,\n\t\t\tid_base: null\n\t\t};\n\n\t\tmatches = widgetId.match( /^(.+)-(\\d+)$/ );\n\t\tif ( matches ) {\n\t\t\tparsed.id_base = matches[1];\n\t\t\tparsed.number = parseInt( matches[2], 10 );\n\t\t} else {\n\t\t\t// likely an old single widget\n\t\t\tparsed.id_base = widgetId;\n\t\t}\n\n\t\treturn parsed;\n\t}\n\n\t/**\n\t * @param {String} widgetId\n\t * @returns {String} settingId\n\t */\n\tfunction widgetIdToSettingId( widgetId ) {\n\t\tvar parsed = parseWidgetId( widgetId ), settingId;\n\n\t\tsettingId = 'widget_' + parsed.id_base;\n\t\tif ( parsed.number ) {\n\t\t\tsettingId += '[' + parsed.number + ']';\n\t\t}\n\n\t\treturn settingId;\n\t}\n\n})( window.wp, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/dashboard.js",
    "content": "/* global pagenow, ajaxurl, postboxes, wpActiveEditor:true */\nvar ajaxWidgets, ajaxPopulateWidgets, quickPressLoad;\n\njQuery(document).ready( function($) {\n\tvar welcomePanel = $( '#welcome-panel' ),\n\t\twelcomePanelHide = $('#wp_welcome_panel-hide'),\n\t\tupdateWelcomePanel;\n\n\tupdateWelcomePanel = function( visible ) {\n\t\t$.post( ajaxurl, {\n\t\t\taction: 'update-welcome-panel',\n\t\t\tvisible: visible,\n\t\t\twelcomepanelnonce: $( '#welcomepanelnonce' ).val()\n\t\t});\n\t};\n\n\tif ( welcomePanel.hasClass('hidden') && welcomePanelHide.prop('checked') ) {\n\t\twelcomePanel.removeClass('hidden');\n\t}\n\n\t$('.welcome-panel-close, .welcome-panel-dismiss a', welcomePanel).click( function(e) {\n\t\te.preventDefault();\n\t\twelcomePanel.addClass('hidden');\n\t\tupdateWelcomePanel( 0 );\n\t\t$('#wp_welcome_panel-hide').prop('checked', false);\n\t});\n\n\twelcomePanelHide.click( function() {\n\t\twelcomePanel.toggleClass('hidden', ! this.checked );\n\t\tupdateWelcomePanel( this.checked ? 1 : 0 );\n\t});\n\n\t// These widgets are sometimes populated via ajax\n\tajaxWidgets = ['dashboard_primary'];\n\n\tajaxPopulateWidgets = function(el) {\n\t\tfunction show(i, id) {\n\t\t\tvar p, e = $('#' + id + ' div.inside:visible').find('.widget-loading');\n\t\t\tif ( e.length ) {\n\t\t\t\tp = e.parent();\n\t\t\t\tsetTimeout( function(){\n\t\t\t\t\tp.load( ajaxurl + '?action=dashboard-widgets&widget=' + id + '&pagenow=' + pagenow, '', function() {\n\t\t\t\t\t\tp.hide().slideDown('normal', function(){\n\t\t\t\t\t\t\t$(this).css('display', '');\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}, i * 500 );\n\t\t\t}\n\t\t}\n\n\t\tif ( el ) {\n\t\t\tel = el.toString();\n\t\t\tif ( $.inArray(el, ajaxWidgets) !== -1 ) {\n\t\t\t\tshow(0, el);\n\t\t\t}\n\t\t} else {\n\t\t\t$.each( ajaxWidgets, show );\n\t\t}\n\t};\n\tajaxPopulateWidgets();\n\n\tpostboxes.add_postbox_toggles(pagenow, { pbshow: ajaxPopulateWidgets } );\n\n\t/* QuickPress */\n\tquickPressLoad = function() {\n\t\tvar act = $('#quickpost-action'), t;\n\n\t\t$( '#quick-press .submit input[type=\"submit\"], #quick-press .submit input[type=\"reset\"]' ).prop( 'disabled' , false );\n\n\t\tt = $('#quick-press').submit( function( e ) {\n\t\t\te.preventDefault();\n\t\t\t$('#dashboard_quick_press #publishing-action .spinner').show();\n\t\t\t$('#quick-press .submit input[type=\"submit\"], #quick-press .submit input[type=\"reset\"]').prop('disabled', true);\n\n\t\t\t$.post( t.attr( 'action' ), t.serializeArray(), function( data ) {\n\t\t\t\t// Replace the form, and prepend the published post.\n\t\t\t\t$('#dashboard_quick_press .inside').html( data );\n\t\t\t\t$('#quick-press').removeClass('initial-form');\n\t\t\t\tquickPressLoad();\n\t\t\t\thighlightLatestPost();\n\t\t\t\t$('#title').focus();\n\t\t\t});\n\n\t\t\tfunction highlightLatestPost () {\n\t\t\t\tvar latestPost = $('.drafts ul li').first();\n\t\t\t\tlatestPost.css('background', '#fffbe5');\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tlatestPost.css('background', 'none');\n\t\t\t\t}, 1000);\n\t\t\t}\n\t\t} );\n\n\t\t$('#publish').click( function() { act.val( 'post-quickpress-publish' ); } );\n\n\t\t$('#title, #tags-input, #content').each( function() {\n\t\t\tvar input = $(this), prompt = $('#' + this.id + '-prompt-text');\n\n\t\t\tif ( '' === this.value ) {\n\t\t\t\tprompt.removeClass('screen-reader-text');\n\t\t\t}\n\n\t\t\tprompt.click( function() {\n\t\t\t\t$(this).addClass('screen-reader-text');\n\t\t\t\tinput.focus();\n\t\t\t});\n\n\t\t\tinput.blur( function() {\n\t\t\t\tif ( '' === this.value ) {\n\t\t\t\t\tprompt.removeClass('screen-reader-text');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.focus( function() {\n\t\t\t\tprompt.addClass('screen-reader-text');\n\t\t\t});\n\t\t});\n\n\t\t$('#quick-press').on( 'click focusin', function() {\n\t\t\twpActiveEditor = 'content';\n\t\t});\n\n\t\tautoResizeTextarea();\n\t};\n\tquickPressLoad();\n\n\t$( '.meta-box-sortables' ).sortable( 'option', 'containment', '#wpwrap' );\n\n\tfunction autoResizeTextarea() {\n\t\tif ( document.documentMode && document.documentMode < 9 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add a hidden div. We'll copy over the text from the textarea to measure its height.\n\t\t$('body').append( '<div class=\"quick-draft-textarea-clone\" style=\"display: none;\"></div>' );\n\n\t\tvar clone = $('.quick-draft-textarea-clone'),\n\t\t\teditor = $('#content'),\n\t\t\teditorHeight = editor.height(),\n\t\t\t// 100px roughly accounts for browser chrome and allows the\n\t\t\t// save draft button to show on-screen at the same time.\n\t\t\teditorMaxHeight = $(window).height() - 100;\n\n\t\t// Match up textarea and clone div as much as possible.\n\t\t// Padding cannot be reliably retrieved using shorthand in all browsers.\n\t\tclone.css({\n\t\t\t'font-family': editor.css('font-family'),\n\t\t\t'font-size':   editor.css('font-size'),\n\t\t\t'line-height': editor.css('line-height'),\n\t\t\t'padding-bottom': editor.css('paddingBottom'),\n\t\t\t'padding-left': editor.css('paddingLeft'),\n\t\t\t'padding-right': editor.css('paddingRight'),\n\t\t\t'padding-top': editor.css('paddingTop'),\n\t\t\t'white-space': 'pre-wrap',\n\t\t\t'word-wrap': 'break-word',\n\t\t\t'display': 'none'\n\t\t});\n\n\t\t// propertychange is for IE < 9\n\t\teditor.on('focus input propertychange', function() {\n\t\t\tvar $this = $(this),\n\t\t\t\t// &nbsp; is to ensure that the height of a final trailing newline is included.\n\t\t\t\ttextareaContent = $this.val() + '&nbsp;',\n\t\t\t\t// 2px is for border-top & border-bottom\n\t\t\t\tcloneHeight = clone.css('width', $this.css('width')).text(textareaContent).outerHeight() + 2;\n\n\t\t\t// Default to having scrollbars\n\t\t\teditor.css('overflow-y', 'auto');\n\n\t\t\t// Only change the height if it has indeed changed and both heights are below the max.\n\t\t\tif ( cloneHeight === editorHeight || ( cloneHeight >= editorMaxHeight && editorHeight >= editorMaxHeight ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Don't allow editor to exceed height of window.\n\t\t\t// This is also bound in CSS to a max-height of 1300px to be extra safe.\n\t\t\tif ( cloneHeight > editorMaxHeight ) {\n\t\t\t\teditorHeight = editorMaxHeight;\n\t\t\t} else {\n\t\t\t\teditorHeight = cloneHeight;\n\t\t\t}\n\n\t\t\t// No scrollbars as we change height, not for IE < 9\n\t\t\teditor.css('overflow', 'hidden');\n\n\t\t\t$this.css('height', editorHeight + 'px');\n\t\t});\n\t}\n\n} );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/edit-comments.js",
    "content": "/* global adminCommentsL10n, thousandsSeparator, list_args, QTags, ajaxurl, wpAjax */\nvar setCommentsList, theList, theExtraList, commentReply;\n\n(function($) {\nvar getCount, updateCount, updateCountText, updatePending, updateApproved,\n\tupdateHtmlTitle, updateDashboardText, adminTitle = document.title,\n\tisDashboard = $('#dashboard_right_now').length,\n\ttitleDiv, titleRegEx;\n\n\tgetCount = function(el) {\n\t\tvar n = parseInt( el.html().replace(/[^0-9]+/g, ''), 10 );\n\t\tif ( isNaN(n) ) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn n;\n\t};\n\n\tupdateCount = function(el, n) {\n\t\tvar n1 = '';\n\t\tif ( isNaN(n) ) {\n\t\t\treturn;\n\t\t}\n\t\tn = n < 1 ? '0' : n.toString();\n\t\tif ( n.length > 3 ) {\n\t\t\twhile ( n.length > 3 ) {\n\t\t\t\tn1 = thousandsSeparator + n.substr(n.length - 3) + n1;\n\t\t\t\tn = n.substr(0, n.length - 3);\n\t\t\t}\n\t\t\tn = n + n1;\n\t\t}\n\t\tel.html(n);\n\t};\n\n\tupdateApproved = function( diff, commentPostId ) {\n\t\tvar postSelector = '.post-com-count-' + commentPostId,\n\t\t\tnoClass = 'comment-count-no-comments',\n\t\t\tapprovedClass = 'comment-count-approved',\n\t\t\tapproved,\n\t\t\tnoComments;\n\n\t\tupdateCountText( 'span.approved-count', diff );\n\n\t\tif ( ! commentPostId ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// cache selectors to not get dupes\n\t\tapproved = $( 'span.' + approvedClass, postSelector );\n\t\tnoComments = $( 'span.' + noClass, postSelector );\n\n\t\tapproved.each(function() {\n\t\t\tvar a = $(this), n = getCount(a) + diff;\n\t\t\tif ( n < 1 )\n\t\t\t\tn = 0;\n\n\t\t\tif ( 0 === n ) {\n\t\t\t\ta.removeClass( approvedClass ).addClass( noClass );\n\t\t\t} else {\n\t\t\t\ta.addClass( approvedClass ).removeClass( noClass );\n\t\t\t}\n\t\t\tupdateCount( a, n );\n\t\t});\n\n\t\tnoComments.each(function() {\n\t\t\tvar a = $(this);\n\t\t\tif ( diff > 0 ) {\n\t\t\t\ta.removeClass( noClass ).addClass( approvedClass );\n\t\t\t} else {\n\t\t\t\ta.addClass( noClass ).removeClass( approvedClass );\n\t\t\t}\n\t\t\tupdateCount( a, diff );\n\t\t});\n\t};\n\n\tupdateCountText = function( selector, diff ) {\n\t\t$( selector ).each(function() {\n\t\t\tvar a = $(this), n = getCount(a) + diff;\n\t\t\tif ( n < 1 ) {\n\t\t\t\tn = 0;\n\t\t\t}\n\t\t\tupdateCount( a, n );\n\t\t});\n\t};\n\n\tupdateDashboardText = function ( response ) {\n\t\tif ( ! isDashboard || ! response || ! response.i18n_comments_text ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar rightNow = $( '#dashboard_right_now' );\n\n\t\t$( '.comment-count a', rightNow ).text( response.i18n_comments_text );\n\t\t$( '.comment-mod-count a', rightNow ).text( response.i18n_moderation_text )\n\t\t\t.parent()\n\t\t\t[ response.in_moderation > 0 ? 'removeClass' : 'addClass' ]( 'hidden' );\n\t};\n\n\tupdateHtmlTitle = function ( diff ) {\n\t\tvar newTitle, regExMatch, titleCount, commentFrag;\n\n\t\ttitleRegEx = titleRegEx || new RegExp( adminCommentsL10n.docTitleCommentsCount.replace( '%s', '\\\\([0-9' + thousandsSeparator + ']+\\\\)' ) + '?' );\n\t\t// count funcs operate on a $'d element\n\t\ttitleDiv = titleDiv || $( '<div />' );\n\t\tnewTitle = adminTitle;\n\n\t\tcommentFrag = titleRegEx.exec( document.title );\n\t\tif ( commentFrag ) {\n\t\t\tcommentFrag = commentFrag[0];\n\t\t\ttitleDiv.html( commentFrag );\n\t\t\ttitleCount = getCount( titleDiv ) + diff;\n\t\t} else {\n\t\t\ttitleDiv.html( 0 );\n\t\t\ttitleCount = diff;\n\t\t}\n\n\t\tif ( titleCount >= 1 ) {\n\t\t\tupdateCount( titleDiv, titleCount );\n\t\t\tregExMatch = titleRegEx.exec( document.title );\n\t\t\tif ( regExMatch ) {\n\t\t\t\tnewTitle = document.title.replace( regExMatch[0], adminCommentsL10n.docTitleCommentsCount.replace( '%s', titleDiv.text() ) + ' ' );\n\t\t\t}\n\t\t} else {\n\t\t\tregExMatch = titleRegEx.exec( newTitle );\n\t\t\tif ( regExMatch ) {\n\t\t\t\tnewTitle = newTitle.replace( regExMatch[0], adminCommentsL10n.docTitleComments );\n\t\t\t}\n\t\t}\n\t\tdocument.title = newTitle;\n\t};\n\n\tupdatePending = function( diff, commentPostId ) {\n\t\tvar postSelector = '.post-com-count-' + commentPostId,\n\t\t\tnoClass = 'comment-count-no-pending',\n\t\t\tnoParentClass = 'post-com-count-no-pending',\n\t\t\tpendingClass = 'comment-count-pending',\n\t\t\tpending,\n\t\t\tnoPending;\n\n\t\tif ( ! isDashboard ) {\n\t\t\tupdateHtmlTitle( diff );\n\t\t}\n\n\t\t$( 'span.pending-count' ).each(function() {\n\t\t\tvar a = $(this), n = getCount(a) + diff;\n\t\t\tif ( n < 1 )\n\t\t\t\tn = 0;\n\t\t\ta.closest('.awaiting-mod')[ 0 === n ? 'addClass' : 'removeClass' ]('count-0');\n\t\t\tupdateCount( a, n );\n\t\t});\n\n\t\tif ( ! commentPostId ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// cache selectors to not get dupes\n\t\tpending = $( 'span.' + pendingClass, postSelector );\n\t\tnoPending = $( 'span.' + noClass, postSelector );\n\n\t\tpending.each(function() {\n\t\t\tvar a = $(this), n = getCount(a) + diff;\n\t\t\tif ( n < 1 )\n\t\t\t\tn = 0;\n\n\t\t\tif ( 0 === n ) {\n\t\t\t\ta.parent().addClass( noParentClass );\n\t\t\t\ta.removeClass( pendingClass ).addClass( noClass );\n\t\t\t} else {\n\t\t\t\ta.parent().removeClass( noParentClass );\n\t\t\t\ta.addClass( pendingClass ).removeClass( noClass );\n\t\t\t}\n\t\t\tupdateCount( a, n );\n\t\t});\n\n\t\tnoPending.each(function() {\n\t\t\tvar a = $(this);\n\t\t\tif ( diff > 0 ) {\n\t\t\t\ta.parent().removeClass( noParentClass );\n\t\t\t\ta.removeClass( noClass ).addClass( pendingClass );\n\t\t\t} else {\n\t\t\t\ta.parent().addClass( noParentClass );\n\t\t\t\ta.addClass( noClass ).removeClass( pendingClass );\n\t\t\t}\n\t\t\tupdateCount( a, diff );\n\t\t});\n\t};\n\nsetCommentsList = function() {\n\tvar totalInput, perPageInput, pageInput, dimAfter, delBefore, updateTotalCount, delAfter, refillTheExtraList, diff,\n\t\tlastConfidentTime = 0;\n\n\ttotalInput = $('input[name=\"_total\"]', '#comments-form');\n\tperPageInput = $('input[name=\"_per_page\"]', '#comments-form');\n\tpageInput = $('input[name=\"_page\"]', '#comments-form');\n\n\t// Updates the current total (stored in the _total input)\n\tupdateTotalCount = function( total, time, setConfidentTime ) {\n\t\tif ( time < lastConfidentTime )\n\t\t\treturn;\n\n\t\tif ( setConfidentTime )\n\t\t\tlastConfidentTime = time;\n\n\t\ttotalInput.val( total.toString() );\n\t};\n\n\t// this fires when viewing \"All\"\n\tdimAfter = function( r, settings ) {\n\t\tvar editRow, replyID, replyButton, response,\n\t\t\tc = $( '#' + settings.element );\n\n\t\tif ( true !== settings.parsed ) {\n\t\t\tresponse = settings.parsed.responses[0];\n\t\t}\n\n\t\teditRow = $('#replyrow');\n\t\treplyID = $('#comment_ID', editRow).val();\n\t\treplyButton = $('#replybtn', editRow);\n\n\t\tif ( c.is('.unapproved') ) {\n\t\t\tif ( settings.data.id == replyID )\n\t\t\t\treplyButton.text(adminCommentsL10n.replyApprove);\n\n\t\t\tc.find('div.comment_status').html('0');\n\t\t} else {\n\t\t\tif ( settings.data.id == replyID )\n\t\t\t\treplyButton.text(adminCommentsL10n.reply);\n\n\t\t\tc.find('div.comment_status').html('1');\n\t\t}\n\n\t\tdiff = $('#' + settings.element).is('.' + settings.dimClass) ? 1 : -1;\n\t\tif ( response ) {\n\t\t\tupdateDashboardText( response.supplemental );\n\t\t\tupdatePending( diff, response.supplemental.postId );\n\t\t\tupdateApproved( -1 * diff, response.supplemental.postId );\n\t\t} else {\n\t\t\tupdatePending( diff );\n\t\t\tupdateApproved( -1 * diff  );\n\t\t}\n\t};\n\n\t// Send current total, page, per_page and url\n\tdelBefore = function( settings, list ) {\n\t\tvar note, id, el, n, h, a, author,\n\t\t\taction = false,\n\t\t\twpListsData = $( settings.target ).attr( 'data-wp-lists' );\n\n\t\tsettings.data._total = totalInput.val() || 0;\n\t\tsettings.data._per_page = perPageInput.val() || 0;\n\t\tsettings.data._page = pageInput.val() || 0;\n\t\tsettings.data._url = document.location.href;\n\t\tsettings.data.comment_status = $('input[name=\"comment_status\"]', '#comments-form').val();\n\n\t\tif ( wpListsData.indexOf(':trash=1') != -1 )\n\t\t\taction = 'trash';\n\t\telse if ( wpListsData.indexOf(':spam=1') != -1 )\n\t\t\taction = 'spam';\n\n\t\tif ( action ) {\n\t\t\tid = wpListsData.replace(/.*?comment-([0-9]+).*/, '$1');\n\t\t\tel = $('#comment-' + id);\n\t\t\tnote = $('#' + action + '-undo-holder').html();\n\n\t\t\tel.find('.check-column :checkbox').prop('checked', false); // Uncheck the row so as not to be affected by Bulk Edits.\n\n\t\t\tif ( el.siblings('#replyrow').length && commentReply.cid == id )\n\t\t\t\tcommentReply.close();\n\n\t\t\tif ( el.is('tr') ) {\n\t\t\t\tn = el.children(':visible').length;\n\t\t\t\tauthor = $('.author strong', el).text();\n\t\t\t\th = $('<tr id=\"undo-' + id + '\" class=\"undo un' + action + '\" style=\"display:none;\"><td colspan=\"' + n + '\">' + note + '</td></tr>');\n\t\t\t} else {\n\t\t\t\tauthor = $('.comment-author', el).text();\n\t\t\t\th = $('<div id=\"undo-' + id + '\" style=\"display:none;\" class=\"undo un' + action + '\">' + note + '</div>');\n\t\t\t}\n\n\t\t\tel.before(h);\n\n\t\t\t$('strong', '#undo-' + id).text(author);\n\t\t\ta = $('.undo a', '#undo-' + id);\n\t\t\ta.attr('href', 'comment.php?action=un' + action + 'comment&c=' + id + '&_wpnonce=' + settings.data._ajax_nonce);\n\t\t\ta.attr('data-wp-lists', 'delete:the-comment-list:comment-' + id + '::un' + action + '=1');\n\t\t\ta.attr('class', 'vim-z vim-destructive');\n\t\t\t$('.avatar', el).first().clone().prependTo('#undo-' + id + ' .' + action + '-undo-inside');\n\n\t\t\ta.click(function( e ){\n\t\t\t\te.preventDefault();\n\t\t\t\tlist.wpList.del(this);\n\t\t\t\t$('#undo-' + id).css( {backgroundColor:'#ceb'} ).fadeOut(350, function(){\n\t\t\t\t\t$(this).remove();\n\t\t\t\t\t$('#comment-' + id).css('backgroundColor', '').fadeIn(300, function(){ $(this).show(); });\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\treturn settings;\n\t};\n\n\t// In admin-ajax.php, we send back the unix time stamp instead of 1 on success\n\tdelAfter = function( r, settings ) {\n\t\tvar total_items_i18n, total, animated, animatedCallback,\n\t\t\tresponse = true === settings.parsed ? {} : settings.parsed.responses[0],\n\t\t\tcommentStatus = true === settings.parsed ? '' : response.supplemental.status,\n\t\t\tcommentPostId = true === settings.parsed ? '' : response.supplemental.postId,\n\t\t\tnewTotal = true === settings.parsed ? '' : response.supplemental,\n\n\t\t\ttargetParent = $( settings.target ).parent(),\n\t\t\tcommentRow = $('#' + settings.element),\n\n\t\t\tspamDiff, trashDiff, pendingDiff, approvedDiff,\n\n\t\t\tapproved = commentRow.hasClass( 'approved' ),\n\t\t\tunapproved = commentRow.hasClass( 'unapproved' ),\n\t\t\tspammed = commentRow.hasClass( 'spam' ),\n\t\t\ttrashed = commentRow.hasClass( 'trash' );\n\n\t\tupdateDashboardText( newTotal );\n\n\t\t// the order of these checks is important\n\t\t// .unspam can also have .approve or .unapprove\n\t\t// .untrash can also have .approve or .unapprove\n\n\t\tif ( targetParent.is( 'span.undo' ) ) {\n\t\t\t// the comment was spammed\n\t\t\tif ( targetParent.hasClass( 'unspam' ) ) {\n\t\t\t\tspamDiff = -1;\n\n\t\t\t\tif ( 'trash' === commentStatus ) {\n\t\t\t\t\ttrashDiff = 1;\n\t\t\t\t} else if ( '1' === commentStatus ) {\n\t\t\t\t\tapprovedDiff = 1;\n\t\t\t\t} else if ( '0' === commentStatus ) {\n\t\t\t\t\tpendingDiff = 1;\n\t\t\t\t}\n\n\t\t\t// the comment was trashed\n\t\t\t} else if ( targetParent.hasClass( 'untrash' ) ) {\n\t\t\t\ttrashDiff = -1;\n\n\t\t\t\tif ( 'spam' === commentStatus ) {\n\t\t\t\t\tspamDiff = 1;\n\t\t\t\t} else if ( '1' === commentStatus ) {\n\t\t\t\t\tapprovedDiff = 1;\n\t\t\t\t} else if ( '0' === commentStatus ) {\n\t\t\t\t\tpendingDiff = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// user clicked \"Spam\"\n\t\t} else if ( targetParent.is( 'span.spam' ) ) {\n\t\t\t// the comment is currently approved\n\t\t\tif ( approved ) {\n\t\t\t\tapprovedDiff = -1;\n\t\t\t// the comment is currently pending\n\t\t\t} else if ( unapproved ) {\n\t\t\t\tpendingDiff = -1;\n\t\t\t// the comment was in the trash\n\t\t\t} else if ( trashed ) {\n\t\t\t\ttrashDiff = -1;\n\t\t\t}\n\t\t\t// you can't spam an item on the spam screen\n\t\t\tspamDiff = 1;\n\n\t\t// user clicked \"Unspam\"\n\t\t} else if ( targetParent.is( 'span.unspam' ) ) {\n\t\t\tif ( approved ) {\n\t\t\t\tpendingDiff = 1;\n\t\t\t} else if ( unapproved ) {\n\t\t\t\tapprovedDiff = 1;\n\t\t\t} else if ( trashed ) {\n\t\t\t\t// the comment was previously approved\n\t\t\t\tif ( targetParent.hasClass( 'approve' ) ) {\n\t\t\t\t\tapprovedDiff = 1;\n\t\t\t\t// the comment was previously pending\n\t\t\t\t} else if ( targetParent.hasClass( 'unapprove' ) ) {\n\t\t\t\t\tpendingDiff = 1;\n\t\t\t\t}\n\t\t\t} else if ( spammed ) {\n\t\t\t\tif ( targetParent.hasClass( 'approve' ) ) {\n\t\t\t\t\tapprovedDiff = 1;\n\n\t\t\t\t} else if ( targetParent.hasClass( 'unapprove' ) ) {\n\t\t\t\t\tpendingDiff = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// you can Unspam an item on the spam screen\n\t\t\tspamDiff = -1;\n\n\t\t// user clicked \"Trash\"\n\t\t} else if ( targetParent.is( 'span.trash' ) ) {\n\t\t\tif ( approved ) {\n\t\t\t\tapprovedDiff = -1;\n\t\t\t} else if ( unapproved ) {\n\t\t\t\tpendingDiff = -1;\n\t\t\t// the comment was in the spam queue\n\t\t\t} else if ( spammed ) {\n\t\t\t\tspamDiff = -1;\n\t\t\t}\n\t\t\t// you can't trash an item on the trash screen\n\t\t\ttrashDiff = 1;\n\n\t\t// user clicked \"Restore\"\n\t\t} else if ( targetParent.is( 'span.untrash' ) ) {\n\t\t\tif ( approved ) {\n\t\t\t\tpendingDiff = 1;\n\t\t\t} else if ( unapproved ) {\n\t\t\t\tapprovedDiff = 1;\n\t\t\t} else if ( trashed ) {\n\t\t\t\tif ( targetParent.hasClass( 'approve' ) ) {\n\t\t\t\t\tapprovedDiff = 1;\n\t\t\t\t} else if ( targetParent.hasClass( 'unapprove' ) ) {\n\t\t\t\t\tpendingDiff = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// you can't go from trash to spam\n\t\t\t// you can untrash on the trash screen\n\t\t\ttrashDiff = -1;\n\n\t\t// User clicked \"Approve\"\n\t\t} else if ( targetParent.is( 'span.approve:not(.unspam):not(.untrash)' ) ) {\n\t\t\tapprovedDiff = 1;\n\t\t\tpendingDiff = -1;\n\n\t\t// User clicked \"Unapprove\"\n\t\t} else if ( targetParent.is( 'span.unapprove:not(.unspam):not(.untrash)' ) ) {\n\t\t\tapprovedDiff = -1;\n\t\t\tpendingDiff = 1;\n\n\t\t// User clicked \"Delete Permanently\"\n\t\t} else if ( targetParent.is( 'span.delete' ) ) {\n\t\t\tif ( spammed ) {\n\t\t\t\tspamDiff = -1;\n\t\t\t} else if ( trashed ) {\n\t\t\t\ttrashDiff = -1;\n\t\t\t}\n\t\t}\n\n\t\tif ( pendingDiff ) {\n\t\t\tupdatePending( pendingDiff, commentPostId );\n\t\t\tupdateCountText( 'span.all-count', pendingDiff );\n\t\t}\n\n\t\tif ( approvedDiff ) {\n\t\t\tupdateApproved( approvedDiff, commentPostId );\n\t\t\tupdateCountText( 'span.all-count', approvedDiff );\n\t\t}\n\n\t\tif ( spamDiff ) {\n\t\t\tupdateCountText( 'span.spam-count', spamDiff );\n\t\t}\n\n\t\tif ( trashDiff ) {\n\t\t\tupdateCountText( 'span.trash-count', trashDiff );\n\t\t}\n\n\t\tif ( ! isDashboard ) {\n\t\t\ttotal = totalInput.val() ? parseInt( totalInput.val(), 10 ) : 0;\n\t\t\tif ( $(settings.target).parent().is('span.undo') )\n\t\t\t\ttotal++;\n\t\t\telse\n\t\t\t\ttotal--;\n\n\t\t\tif ( total < 0 )\n\t\t\t\ttotal = 0;\n\n\t\t\tif ( 'object' === typeof r ) {\n\t\t\t\tif ( response.supplemental.total_items_i18n && lastConfidentTime < response.supplemental.time ) {\n\t\t\t\t\ttotal_items_i18n = response.supplemental.total_items_i18n || '';\n\t\t\t\t\tif ( total_items_i18n ) {\n\t\t\t\t\t\t$('.displaying-num').text( total_items_i18n );\n\t\t\t\t\t\t$('.total-pages').text( response.supplemental.total_pages_i18n );\n\t\t\t\t\t\t$('.tablenav-pages').find('.next-page, .last-page').toggleClass('disabled', response.supplemental.total_pages == $('.current-page').val());\n\t\t\t\t\t}\n\t\t\t\t\tupdateTotalCount( total, response.supplemental.time, true );\n\t\t\t\t} else if ( response.supplemental.time ) {\n\t\t\t\t\tupdateTotalCount( total, response.supplemental.time, false );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tupdateTotalCount( total, r, false );\n\t\t\t}\n\t\t}\n\n\t\tif ( ! theExtraList || theExtraList.size() === 0 || theExtraList.children().size() === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttheList.get(0).wpList.add( theExtraList.children( ':eq(0):not(.no-items)' ).remove().clone() );\n\n\t\trefillTheExtraList();\n\n\t\tanimated = $( ':animated', '#the-comment-list' );\n\t\tanimatedCallback = function () {\n\t\t\tif ( ! $( '#the-comment-list tr:visible' ).length ) {\n\t\t\t\ttheList.get(0).wpList.add( theExtraList.find( '.no-items' ).clone() );\n\t\t\t}\n\t\t};\n\n\t\tif ( animated.length ) {\n\t\t\tanimated.promise().done( animatedCallback );\n\t\t} else {\n\t\t\tanimatedCallback();\n\t\t}\n\t};\n\n\trefillTheExtraList = function(ev) {\n\t\tvar args = $.query.get(), total_pages = $('.total-pages').text(), per_page = $('input[name=\"_per_page\"]', '#comments-form').val();\n\n\t\tif (! args.paged)\n\t\t\targs.paged = 1;\n\n\t\tif (args.paged > total_pages) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (ev) {\n\t\t\ttheExtraList.empty();\n\t\t\targs.number = Math.min(8, per_page); // see WP_Comments_List_Table::prepare_items() @ class-wp-comments-list-table.php\n\t\t} else {\n\t\t\targs.number = 1;\n\t\t\targs.offset = Math.min(8, per_page) - 1; // fetch only the next item on the extra list\n\t\t}\n\n\t\targs.no_placeholder = true;\n\n\t\targs.paged ++;\n\n\t\t// $.query.get() needs some correction to be sent into an ajax request\n\t\tif ( true === args.comment_type )\n\t\t\targs.comment_type = '';\n\n\t\targs = $.extend(args, {\n\t\t\t'action': 'fetch-list',\n\t\t\t'list_args': list_args,\n\t\t\t'_ajax_fetch_list_nonce': $('#_ajax_fetch_list_nonce').val()\n\t\t});\n\n\t\t$.ajax({\n\t\t\turl: ajaxurl,\n\t\t\tglobal: false,\n\t\t\tdataType: 'json',\n\t\t\tdata: args,\n\t\t\tsuccess: function(response) {\n\t\t\t\ttheExtraList.get(0).wpList.add( response.rows );\n\t\t\t}\n\t\t});\n\t};\n\n\ttheExtraList = $('#the-extra-comment-list').wpList( { alt: '', delColor: 'none', addColor: 'none' } );\n\ttheList = $('#the-comment-list').wpList( { alt: '', delBefore: delBefore, dimAfter: dimAfter, delAfter: delAfter, addColor: 'none' } )\n\t\t.bind('wpListDelEnd', function(e, s){\n\t\t\tvar wpListsData = $(s.target).attr('data-wp-lists'), id = s.element.replace(/[^0-9]+/g, '');\n\n\t\t\tif ( wpListsData.indexOf(':trash=1') != -1 || wpListsData.indexOf(':spam=1') != -1 )\n\t\t\t\t$('#undo-' + id).fadeIn(300, function(){ $(this).show(); });\n\t\t});\n};\n\ncommentReply = {\n\tcid : '',\n\tact : '',\n\n\tinit : function() {\n\t\tvar row = $('#replyrow');\n\n\t\t$('a.cancel', row).click(function() { return commentReply.revert(); });\n\t\t$('a.save', row).click(function() { return commentReply.send(); });\n\t\t$( 'input#author-name, input#author-email, input#author-url', row ).keypress( function( e ) {\n\t\t\tif ( e.which == 13 ) {\n\t\t\t\tcommentReply.send();\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\t// add events\n\t\t$('#the-comment-list .column-comment > p').dblclick(function(){\n\t\t\tcommentReply.toggle($(this).parent());\n\t\t});\n\n\t\t$('#doaction, #doaction2, #post-query-submit').click(function(){\n\t\t\tif ( $('#the-comment-list #replyrow').length > 0 )\n\t\t\t\tcommentReply.close();\n\t\t});\n\n\t\tthis.comments_listing = $('#comments-form > input[name=\"comment_status\"]').val() || '';\n\n\t\t/* $(listTable).bind('beforeChangePage', function(){\n\t\t\tcommentReply.close();\n\t\t}); */\n\t},\n\n\taddEvents : function(r) {\n\t\tr.each(function() {\n\t\t\t$(this).find('.column-comment > p').dblclick(function(){\n\t\t\t\tcommentReply.toggle($(this).parent());\n\t\t\t});\n\t\t});\n\t},\n\n\ttoggle : function(el) {\n\t\tif ( 'none' !== $( el ).css( 'display' ) && ( $( '#replyrow' ).parent().is('#com-reply') || window.confirm( adminCommentsL10n.warnQuickEdit ) ) ) {\n\t\t\t$( el ).find( 'a.vim-q' ).click();\n\t\t}\n\t},\n\n\trevert : function() {\n\n\t\tif ( $('#the-comment-list #replyrow').length < 1 )\n\t\t\treturn false;\n\n\t\t$('#replyrow').fadeOut('fast', function(){\n\t\t\tcommentReply.close();\n\t\t});\n\n\t\treturn false;\n\t},\n\n\tclose : function() {\n\t\tvar c, replyrow = $('#replyrow');\n\n\t\t// replyrow is not showing?\n\t\tif ( replyrow.parent().is('#com-reply') )\n\t\t\treturn;\n\n\t\tif ( this.cid && this.act == 'edit-comment' ) {\n\t\t\tc = $('#comment-' + this.cid);\n\t\t\tc.fadeIn(300, function(){ c.show(); }).css('backgroundColor', '');\n\t\t}\n\n\t\t// reset the Quicktags buttons\n\t\tif ( typeof QTags != 'undefined' )\n\t\t\tQTags.closeAllTags('replycontent');\n\n\t\t$('#add-new-comment').css('display', '');\n\n\t\treplyrow.hide();\n\t\t$('#com-reply').append( replyrow );\n\t\t$('#replycontent').css('height', '').val('');\n\t\t$('#edithead input').val('');\n\t\t$('.error', replyrow).empty().hide();\n\t\t$( '.spinner', replyrow ).removeClass( 'is-active' );\n\n\t\tthis.cid = '';\n\t},\n\n\topen : function(comment_id, post_id, action) {\n\t\tvar editRow, rowData, act, replyButton, editHeight,\n\t\t\tt = this,\n\t\t\tc = $('#comment-' + comment_id),\n\t\t\th = c.height(),\n\t\t\tcolspanVal = 0;\n\n\t\tt.close();\n\t\tt.cid = comment_id;\n\n\t\teditRow = $('#replyrow');\n\t\trowData = $('#inline-'+comment_id);\n\t\taction = action || 'replyto';\n\t\tact = 'edit' == action ? 'edit' : 'replyto';\n\t\tact = t.act = act + '-comment';\n\t\tcolspanVal = $( '> th:visible, > td:visible', c ).length;\n\n\t\t// Make sure it's actually a table and there's a `colspan` value to apply.\n\t\tif ( editRow.hasClass( 'inline-edit-row' ) && 0 !== colspanVal ) {\n\t\t\t$( 'td', editRow ).attr( 'colspan', colspanVal );\n\t\t}\n\n\t\t$('#action', editRow).val(act);\n\t\t$('#comment_post_ID', editRow).val(post_id);\n\t\t$('#comment_ID', editRow).val(comment_id);\n\n\t\tif ( action == 'edit' ) {\n\t\t\t$( '#author-name', editRow ).val( $( 'div.author', rowData ).text() );\n\t\t\t$('#author-email', editRow).val( $('div.author-email', rowData).text() );\n\t\t\t$('#author-url', editRow).val( $('div.author-url', rowData).text() );\n\t\t\t$('#status', editRow).val( $('div.comment_status', rowData).text() );\n\t\t\t$('#replycontent', editRow).val( $('textarea.comment', rowData).val() );\n\t\t\t$( '#edithead, #editlegend, #savebtn', editRow ).show();\n\t\t\t$('#replyhead, #replybtn, #addhead, #addbtn', editRow).hide();\n\n\t\t\tif ( h > 120 ) {\n\t\t\t\t// Limit the maximum height when editing very long comments to make it more manageable.\n\t\t\t\t// The textarea is resizable in most browsers, so the user can adjust it if needed.\n\t\t\t\teditHeight = h > 500 ? 500 : h;\n\t\t\t\t$('#replycontent', editRow).css('height', editHeight + 'px');\n\t\t\t}\n\n\t\t\tc.after( editRow ).fadeOut('fast', function(){\n\t\t\t\t$('#replyrow').fadeIn(300, function(){ $(this).show(); });\n\t\t\t});\n\t\t} else if ( action == 'add' ) {\n\t\t\t$('#addhead, #addbtn', editRow).show();\n\t\t\t$( '#replyhead, #replybtn, #edithead, #editlegend, #savebtn', editRow ) .hide();\n\t\t\t$('#the-comment-list').prepend(editRow);\n\t\t\t$('#replyrow').fadeIn(300);\n\t\t} else {\n\t\t\treplyButton = $('#replybtn', editRow);\n\t\t\t$( '#edithead, #editlegend, #savebtn, #addhead, #addbtn', editRow ).hide();\n\t\t\t$('#replyhead, #replybtn', editRow).show();\n\t\t\tc.after(editRow);\n\n\t\t\tif ( c.hasClass('unapproved') ) {\n\t\t\t\treplyButton.text(adminCommentsL10n.replyApprove);\n\t\t\t} else {\n\t\t\t\treplyButton.text(adminCommentsL10n.reply);\n\t\t\t}\n\n\t\t\t$('#replyrow').fadeIn(300, function(){ $(this).show(); });\n\t\t}\n\n\t\tsetTimeout(function() {\n\t\t\tvar rtop, rbottom, scrollTop, vp, scrollBottom;\n\n\t\t\trtop = $('#replyrow').offset().top;\n\t\t\trbottom = rtop + $('#replyrow').height();\n\t\t\tscrollTop = window.pageYOffset || document.documentElement.scrollTop;\n\t\t\tvp = document.documentElement.clientHeight || window.innerHeight || 0;\n\t\t\tscrollBottom = scrollTop + vp;\n\n\t\t\tif ( scrollBottom - 20 < rbottom )\n\t\t\t\twindow.scroll(0, rbottom - vp + 35);\n\t\t\telse if ( rtop - 20 < scrollTop )\n\t\t\t\twindow.scroll(0, rtop - 35);\n\n\t\t\t$('#replycontent').focus().keyup(function(e){\n\t\t\t\tif ( e.which == 27 )\n\t\t\t\t\tcommentReply.revert(); // close on Escape\n\t\t\t});\n\t\t}, 600);\n\n\t\treturn false;\n\t},\n\n\tsend : function() {\n\t\tvar post = {};\n\n\t\t$('#replysubmit .error').hide();\n\t\t$( '#replysubmit .spinner' ).addClass( 'is-active' );\n\n\t\t$('#replyrow input').not(':button').each(function() {\n\t\t\tvar t = $(this);\n\t\t\tpost[ t.attr('name') ] = t.val();\n\t\t});\n\n\t\tpost.content = $('#replycontent').val();\n\t\tpost.id = post.comment_post_ID;\n\t\tpost.comments_listing = this.comments_listing;\n\t\tpost.p = $('[name=\"p\"]').val();\n\n\t\tif ( $('#comment-' + $('#comment_ID').val()).hasClass('unapproved') )\n\t\t\tpost.approve_parent = 1;\n\n\t\t$.ajax({\n\t\t\ttype : 'POST',\n\t\t\turl : ajaxurl,\n\t\t\tdata : post,\n\t\t\tsuccess : function(x) { commentReply.show(x); },\n\t\t\terror : function(r) { commentReply.error(r); }\n\t\t});\n\n\t\treturn false;\n\t},\n\n\tshow : function(xml) {\n\t\tvar t = this, r, c, id, bg, pid;\n\n\t\tif ( typeof(xml) == 'string' ) {\n\t\t\tt.error({'responseText': xml});\n\t\t\treturn false;\n\t\t}\n\n\t\tr = wpAjax.parseAjaxResponse(xml);\n\t\tif ( r.errors ) {\n\t\t\tt.error({'responseText': wpAjax.broken});\n\t\t\treturn false;\n\t\t}\n\n\t\tt.revert();\n\n\t\tr = r.responses[0];\n\t\tid = '#comment-' + r.id;\n\n\t\tif ( 'edit-comment' == t.act )\n\t\t\t$(id).remove();\n\n\t\tif ( r.supplemental.parent_approved ) {\n\t\t\tpid = $('#comment-' + r.supplemental.parent_approved);\n\t\t\tupdatePending( -1, r.supplemental.parent_post_id );\n\n\t\t\tif ( this.comments_listing == 'moderated' ) {\n\t\t\t\tpid.animate( { 'backgroundColor':'#CCEEBB' }, 400, function(){\n\t\t\t\t\tpid.fadeOut();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif ( r.supplemental.i18n_comments_text ) {\n\t\t\tif ( isDashboard ) {\n\t\t\t\tupdateDashboardText( r.supplemental );\n\t\t\t} else {\n\t\t\t\tupdateApproved( 1, r.supplemental.parent_post_id );\n\t\t\t\tupdateCountText( 'span.all-count', 1 );\n\t\t\t}\n\t\t}\n\n\t\tc = $.trim(r.data); // Trim leading whitespaces\n\t\t$(c).hide();\n\t\t$('#replyrow').after(c);\n\n\t\tid = $(id);\n\t\tt.addEvents(id);\n\t\tbg = id.hasClass('unapproved') ? '#FFFFE0' : id.closest('.widefat, .postbox').css('backgroundColor');\n\n\t\tid.animate( { 'backgroundColor':'#CCEEBB' }, 300 )\n\t\t\t.animate( { 'backgroundColor': bg }, 300, function() {\n\t\t\t\tif ( pid && pid.length ) {\n\t\t\t\t\tpid.animate( { 'backgroundColor':'#CCEEBB' }, 300 )\n\t\t\t\t\t\t.animate( { 'backgroundColor': bg }, 300 )\n\t\t\t\t\t\t.removeClass('unapproved').addClass('approved')\n\t\t\t\t\t\t.find('div.comment_status').html('1');\n\t\t\t\t}\n\t\t\t});\n\n\t},\n\n\terror : function(r) {\n\t\tvar er = r.statusText;\n\n\t\t$( '#replysubmit .spinner' ).removeClass( 'is-active' );\n\n\t\tif ( r.responseText )\n\t\t\ter = r.responseText.replace( /<.[^<>]*?>/g, '' );\n\n\t\tif ( er )\n\t\t\t$('#replysubmit .error').html(er).show();\n\n\t},\n\n\taddcomment: function(post_id) {\n\t\tvar t = this;\n\n\t\t$('#add-new-comment').fadeOut(200, function(){\n\t\t\tt.open(0, post_id, 'add');\n\t\t\t$('table.comments-box').css('display', '');\n\t\t\t$('#no-comments').remove();\n\t\t});\n\t}\n};\n\n$(document).ready(function(){\n\tvar make_hotkeys_redirect, edit_comment, toggle_all, make_bulk;\n\n\tsetCommentsList();\n\tcommentReply.init();\n\n\t$(document).on( 'click', 'span.delete a.delete', function( e ) {\n\t\te.preventDefault();\n\t});\n\n\tif ( typeof $.table_hotkeys != 'undefined' ) {\n\t\tmake_hotkeys_redirect = function(which) {\n\t\t\treturn function() {\n\t\t\t\tvar first_last, l;\n\n\t\t\t\tfirst_last = 'next' == which? 'first' : 'last';\n\t\t\t\tl = $('.tablenav-pages .'+which+'-page:not(.disabled)');\n\t\t\t\tif (l.length)\n\t\t\t\t\twindow.location = l[0].href.replace(/\\&hotkeys_highlight_(first|last)=1/g, '')+'&hotkeys_highlight_'+first_last+'=1';\n\t\t\t};\n\t\t};\n\n\t\tedit_comment = function(event, current_row) {\n\t\t\twindow.location = $('span.edit a', current_row).attr('href');\n\t\t};\n\n\t\ttoggle_all = function() {\n\t\t\t$('#cb-select-all-1').data( 'wp-toggle', 1 ).trigger( 'click' ).removeData( 'wp-toggle' );\n\t\t};\n\n\t\tmake_bulk = function(value) {\n\t\t\treturn function() {\n\t\t\t\tvar scope = $('select[name=\"action\"]');\n\t\t\t\t$('option[value=\"' + value + '\"]', scope).prop('selected', true);\n\t\t\t\t$('#doaction').click();\n\t\t\t};\n\t\t};\n\n\t\t$.table_hotkeys(\n\t\t\t$('table.widefat'),\n\t\t\t[\n\t\t\t\t'a', 'u', 's', 'd', 'r', 'q', 'z',\n\t\t\t\t['e', edit_comment],\n\t\t\t\t['shift+x', toggle_all],\n\t\t\t\t['shift+a', make_bulk('approve')],\n\t\t\t\t['shift+s', make_bulk('spam')],\n\t\t\t\t['shift+d', make_bulk('delete')],\n\t\t\t\t['shift+t', make_bulk('trash')],\n\t\t\t\t['shift+z', make_bulk('untrash')],\n\t\t\t\t['shift+u', make_bulk('unapprove')]\n\t\t\t],\n\t\t\t{\n\t\t\t\thighlight_first: adminCommentsL10n.hotkeys_highlight_first,\n\t\t\t\thighlight_last: adminCommentsL10n.hotkeys_highlight_last,\n\t\t\t\tprev_page_link_cb: make_hotkeys_redirect('prev'),\n\t\t\t\tnext_page_link_cb: make_hotkeys_redirect('next'),\n\t\t\t\thotkeys_opts: {\n\t\t\t\t\tdisableInInput: true,\n\t\t\t\t\ttype: 'keypress',\n\t\t\t\t\tnoDisable: '.check-column input[type=\"checkbox\"]'\n\t\t\t\t},\n\t\t\t\tcycle_expr: '#the-comment-list tr',\n\t\t\t\tstart_row_index: 0\n\t\t\t}\n\t\t);\n\t}\n\n\t// Quick Edit and Reply have an inline comment editor.\n\t$( '#the-comment-list' ).on( 'click', '.comment-inline', function (e) {\n\t\te.preventDefault();\n\t\tvar $el = $( this ),\n\t\t\taction = 'replyto';\n\n\t\tif ( 'undefined' !== typeof $el.data( 'action' ) ) {\n\t\t\taction = $el.data( 'action' );\n\t\t}\n\n\t\tcommentReply.open( $el.data( 'commentId' ), $el.data( 'postId' ), action );\n\t} );\n});\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/editor-expand.js",
    "content": "( function( window, $, undefined ) {\n\t'use strict';\n\n\tvar $window = $( window ),\n\t\t$document = $( document ),\n\t\t$adminBar = $( '#wpadminbar' ),\n\t\t$footer = $( '#wpfooter' );\n\n\t/* Autoresize editor. */\n\t$( function() {\n\t\tvar $wrap = $( '#postdivrich' ),\n\t\t\t$contentWrap = $( '#wp-content-wrap' ),\n\t\t\t$tools = $( '#wp-content-editor-tools' ),\n\t\t\t$visualTop = $(),\n\t\t\t$visualEditor = $(),\n\t\t\t$textTop = $( '#ed_toolbar' ),\n\t\t\t$textEditor = $( '#content' ),\n\t\t\t$textEditorClone = $( '<div id=\"content-textarea-clone\" class=\"wp-exclude-emoji\"></div>' ),\n\t\t\t$bottom = $( '#post-status-info' ),\n\t\t\t$menuBar = $(),\n\t\t\t$statusBar = $(),\n\t\t\t$sideSortables = $( '#side-sortables' ),\n\t\t\t$postboxContainer = $( '#postbox-container-1' ),\n\t\t\t$postBody = $('#post-body'),\n\t\t\tfullscreen = window.wp.editor && window.wp.editor.fullscreen,\n\t\t\tmceEditor,\n\t\t\tmceBind = function(){},\n\t\t\tmceUnbind = function(){},\n\t\t\tfixedTop = false,\n\t\t\tfixedBottom = false,\n\t\t\tfixedSideTop = false,\n\t\t\tfixedSideBottom = false,\n\t\t\tscrollTimer,\n\t\t\tlastScrollPosition = 0,\n\t\t\tpageYOffsetAtTop = 130,\n\t\t\tpinnedToolsTop = 56,\n\t\t\tsidebarBottom = 20,\n\t\t\tautoresizeMinHeight = 300,\n\t\t\tinitialMode = $contentWrap.hasClass( 'tmce-active' ) ? 'tinymce' : 'html',\n\t\t\tadvanced = !! parseInt( window.getUserSetting( 'hidetb' ), 10 ),\n\t\t\t// These are corrected when adjust() runs, except on scrolling if already set.\n\t\t\theights = {\n\t\t\t\twindowHeight: 0,\n\t\t\t\twindowWidth: 0,\n\t\t\t\tadminBarHeight: 0,\n\t\t\t\ttoolsHeight: 0,\n\t\t\t\tmenuBarHeight: 0,\n\t\t\t\tvisualTopHeight: 0,\n\t\t\t\ttextTopHeight: 0,\n\t\t\t\tbottomHeight: 0,\n\t\t\t\tstatusBarHeight: 0,\n\t\t\t\tsideSortablesHeight: 0\n\t\t\t};\n\n\t\t$textEditorClone.insertAfter( $textEditor );\n\n\t\t$textEditorClone.css( {\n\t\t\t'font-family': $textEditor.css( 'font-family' ),\n\t\t\t'font-size': $textEditor.css( 'font-size' ),\n\t\t\t'line-height': $textEditor.css( 'line-height' ),\n\t\t\t'white-space': 'pre-wrap',\n\t\t\t'word-wrap': 'break-word'\n\t\t} );\n\n\t\tfunction getHeights() {\n\t\t\tvar windowWidth = $window.width();\n\n\t\t\theights = {\n\t\t\t\twindowHeight: $window.height(),\n\t\t\t\twindowWidth: windowWidth,\n\t\t\t\tadminBarHeight: ( windowWidth > 600 ? $adminBar.outerHeight() : 0 ),\n\t\t\t\ttoolsHeight: $tools.outerHeight() || 0,\n\t\t\t\tmenuBarHeight: $menuBar.outerHeight() || 0,\n\t\t\t\tvisualTopHeight: $visualTop.outerHeight() || 0,\n\t\t\t\ttextTopHeight: $textTop.outerHeight() || 0,\n\t\t\t\tbottomHeight: $bottom.outerHeight() || 0,\n\t\t\t\tstatusBarHeight: $statusBar.outerHeight() || 0,\n\t\t\t\tsideSortablesHeight: $sideSortables.height() || 0\n\t\t\t};\n\n\t\t\t// Adjust for hidden\n\t\t\tif ( heights.menuBarHeight < 3 ) {\n\t\t\t\theights.menuBarHeight = 0;\n\t\t\t}\n\t\t}\n\n\t\tfunction textEditorKeyup( event ) {\n\t\t\tvar VK = jQuery.ui.keyCode,\n\t\t\t\tkey = event.keyCode,\n\t\t\t\trange = document.createRange(),\n\t\t\t\tselStart = $textEditor[0].selectionStart,\n\t\t\t\tselEnd = $textEditor[0].selectionEnd,\n\t\t\t\ttextNode = $textEditorClone[0].firstChild,\n\t\t\t\tbuffer = 10,\n\t\t\t\toffset, cursorTop, cursorBottom, editorTop, editorBottom;\n\n\t\t\tif ( selStart && selEnd && selStart !== selEnd ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// These are not TinyMCE ranges.\n\t\t\ttry {\n\t\t\t\trange.setStart( textNode, selStart );\n\t\t\t\trange.setEnd( textNode, selEnd + 1 );\n\t\t\t} catch ( ex ) {}\n\n\t\t\toffset = range.getBoundingClientRect();\n\n\t\t\tif ( ! offset.height ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcursorTop = offset.top - buffer;\n\t\t\tcursorBottom = cursorTop + offset.height + buffer;\n\t\t\teditorTop = heights.adminBarHeight + heights.toolsHeight + heights.textTopHeight;\n\t\t\teditorBottom = heights.windowHeight - heights.bottomHeight;\n\n\t\t\tif ( cursorTop < editorTop && ( key === VK.UP || key === VK.LEFT || key === VK.BACKSPACE ) ) {\n\t\t\t\twindow.scrollTo( window.pageXOffset, cursorTop + window.pageYOffset - editorTop );\n\t\t\t} else if ( cursorBottom > editorBottom ) {\n\t\t\t\twindow.scrollTo( window.pageXOffset, cursorBottom + window.pageYOffset - editorBottom );\n\t\t\t}\n\t\t}\n\n\t\tfunction textEditorResize() {\n\t\t\tif ( ( mceEditor && ! mceEditor.isHidden() ) || ( ! mceEditor && initialMode === 'tinymce' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar textEditorHeight = $textEditor.height(),\n\t\t\t\thiddenHeight;\n\n\t\t\t$textEditorClone.width( $textEditor.width() - 22 );\n\t\t\t$textEditorClone.text( $textEditor.val() + '&nbsp;' );\n\n\t\t\thiddenHeight = $textEditorClone.height();\n\n\t\t\tif ( hiddenHeight < autoresizeMinHeight ) {\n\t\t\t\thiddenHeight = autoresizeMinHeight;\n\t\t\t}\n\n\t\t\tif ( hiddenHeight === textEditorHeight ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$textEditor.height( hiddenHeight );\n\n\t\t\tadjust();\n\t\t}\n\n\t\t// We need to wait for TinyMCE to initialize.\n\t\t$document.on( 'tinymce-editor-init.editor-expand', function( event, editor ) {\n\t\t\tvar VK = window.tinymce.util.VK,\n\t\t\t\thideFloatPanels = _.debounce( function() {\n\t\t\t\t\t! $( '.mce-floatpanel:hover' ).length && window.tinymce.ui.FloatPanel.hideAll();\n\t\t\t\t\t$( '.mce-tooltip' ).hide();\n\t\t\t\t}, 1000, true );\n\n\t\t\t// Make sure it's the main editor.\n\t\t\tif ( editor.id !== 'content' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Copy the editor instance.\n\t\t\tmceEditor = editor;\n\n\t\t\t// Set the minimum height to the initial viewport height.\n\t\t\teditor.settings.autoresize_min_height = autoresizeMinHeight;\n\n\t\t\t// Get the necessary UI elements.\n\t\t\t$visualTop = $contentWrap.find( '.mce-toolbar-grp' );\n\t\t\t$visualEditor = $contentWrap.find( '.mce-edit-area' );\n\t\t\t$statusBar = $contentWrap.find( '.mce-statusbar' );\n\t\t\t$menuBar = $contentWrap.find( '.mce-menubar' );\n\n\t\t\tfunction mceGetCursorOffset() {\n\t\t\t\tvar node = editor.selection.getNode(),\n\t\t\t\t\trange, view, offset;\n\n\t\t\t\tif ( editor.wp && editor.wp.getView && ( view = editor.wp.getView( node ) ) ) {\n\t\t\t\t\toffset = view.getBoundingClientRect();\n\t\t\t\t} else {\n\t\t\t\t\trange = editor.selection.getRng();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\toffset = range.getClientRects()[0];\n\t\t\t\t\t} catch( er ) {}\n\n\t\t\t\t\tif ( ! offset ) {\n\t\t\t\t\t\toffset = node.getBoundingClientRect();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn offset.height ? offset : false;\n\t\t\t}\n\n\t\t\t// Make sure the cursor is always visible.\n\t\t\t// This is not only necessary to keep the cursor between the toolbars,\n\t\t\t// but also to scroll the window when the cursor moves out of the viewport to a wpview.\n\t\t\t// Setting a buffer > 0 will prevent the browser default.\n\t\t\t// Some browsers will scroll to the middle,\n\t\t\t// others to the top/bottom of the *window* when moving the cursor out of the viewport.\n\t\t\tfunction mceKeyup( event ) {\n\t\t\t\tvar key = event.keyCode;\n\n\t\t\t\t// Bail on special keys.\n\t\t\t\tif ( key <= 47 && ! ( key === VK.SPACEBAR || key === VK.ENTER || key === VK.DELETE || key === VK.BACKSPACE || key === VK.UP || key === VK.LEFT || key === VK.DOWN || key === VK.UP ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t// OS keys, function keys, num lock, scroll lock\n\t\t\t\t} else if ( ( key >= 91 && key <= 93 ) || ( key >= 112 && key <= 123 ) || key === 144 || key === 145 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tmceScroll( key );\n\t\t\t}\n\n\t\t\tfunction mceScroll( key ) {\n\t\t\t\tvar offset = mceGetCursorOffset(),\n\t\t\t\t\tbuffer = 50,\n\t\t\t\t\tcursorTop, cursorBottom, editorTop, editorBottom;\n\n\t\t\t\tif ( ! offset ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcursorTop = offset.top + editor.iframeElement.getBoundingClientRect().top;\n\t\t\t\tcursorBottom = cursorTop + offset.height;\n\t\t\t\tcursorTop = cursorTop - buffer;\n\t\t\t\tcursorBottom = cursorBottom + buffer;\n\t\t\t\teditorTop = heights.adminBarHeight + heights.toolsHeight + heights.menuBarHeight + heights.visualTopHeight;\n\t\t\t\teditorBottom = heights.windowHeight - ( advanced ? heights.bottomHeight + heights.statusBarHeight : 0 );\n\n\t\t\t\t// Don't scroll if the node is taller than the visible part of the editor\n\t\t\t\tif ( editorBottom - editorTop < offset.height ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( cursorTop < editorTop && ( key === VK.UP || key === VK.LEFT || key === VK.BACKSPACE ) ) {\n\t\t\t\t\twindow.scrollTo( window.pageXOffset, cursorTop + window.pageYOffset - editorTop );\n\t\t\t\t} else if ( cursorBottom > editorBottom ) {\n\t\t\t\t\twindow.scrollTo( window.pageXOffset, cursorBottom + window.pageYOffset - editorBottom );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction mceFullscreenToggled( event ) {\n\t\t\t\tif ( ! event.state ) {\n\t\t\t\t\tadjust();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Adjust when switching editor modes.\n\t\t\tfunction mceShow() {\n\t\t\t\t$window.on( 'scroll.mce-float-panels', hideFloatPanels );\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\teditor.execCommand( 'wpAutoResize' );\n\t\t\t\t\tadjust();\n\t\t\t\t}, 300 );\n\t\t\t}\n\n\t\t\tfunction mceHide() {\n\t\t\t\t$window.off( 'scroll.mce-float-panels' );\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tvar top = $contentWrap.offset().top;\n\n\t\t\t\t\tif ( window.pageYOffset > top ) {\n\t\t\t\t\t\twindow.scrollTo( window.pageXOffset, top - heights.adminBarHeight );\n\t\t\t\t\t}\n\n\t\t\t\t\ttextEditorResize();\n\t\t\t\t\tadjust();\n\t\t\t\t}, 100 );\n\n\t\t\t\tadjust();\n\t\t\t}\n\n\t\t\tfunction toggleAdvanced() {\n\t\t\t\tadvanced = ! advanced;\n\t\t\t}\n\n\t\t\tmceBind = function() {\n\t\t\t\teditor.on( 'keyup', mceKeyup );\n\t\t\t\teditor.on( 'show', mceShow );\n\t\t\t\teditor.on( 'hide', mceHide );\n\t\t\t\teditor.on( 'wp-toolbar-toggle', toggleAdvanced );\n\t\t\t\t// Adjust when the editor resizes.\n\t\t\t\teditor.on( 'setcontent wp-autoresize wp-toolbar-toggle', adjust );\n\t\t\t\t// Don't hide the caret after undo/redo.\n\t\t\t\teditor.on( 'undo redo', mceScroll );\n\t\t\t\t// Adjust when exiting TinyMCE's fullscreen mode.\n\t\t\t\teditor.on( 'FullscreenStateChanged', mceFullscreenToggled );\n\n\t\t\t\t$window.off( 'scroll.mce-float-panels' ).on( 'scroll.mce-float-panels', hideFloatPanels );\n\t\t\t};\n\n\t\t\tmceUnbind = function() {\n\t\t\t\teditor.off( 'keyup', mceKeyup );\n\t\t\t\teditor.off( 'show', mceShow );\n\t\t\t\teditor.off( 'hide', mceHide );\n\t\t\t\teditor.off( 'wp-toolbar-toggle', toggleAdvanced );\n\t\t\t\teditor.off( 'setcontent wp-autoresize wp-toolbar-toggle', adjust );\n\t\t\t\teditor.off( 'undo redo', mceScroll );\n\t\t\t\teditor.off( 'FullscreenStateChanged', mceFullscreenToggled );\n\n\t\t\t\t$window.off( 'scroll.mce-float-panels' );\n\t\t\t};\n\n\t\t\tif ( $wrap.hasClass( 'wp-editor-expand' ) ) {\n\t\t\t\t// Adjust \"immediately\"\n\t\t\t\tmceBind();\n\t\t\t\tinitialResize( adjust );\n\t\t\t}\n\t\t} );\n\n\t\t// Adjust the toolbars based on the active editor mode.\n\t\tfunction adjust( event ) {\n\t\t\t// Make sure we're not in fullscreen mode.\n\t\t\tif ( fullscreen && fullscreen.settings.visible ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar windowPos = $window.scrollTop(),\n\t\t\t\ttype = event && event.type,\n\t\t\t\tresize = type !== 'scroll',\n\t\t\t\tvisual = mceEditor && ! mceEditor.isHidden(),\n\t\t\t\tbuffer = autoresizeMinHeight,\n\t\t\t\tpostBodyTop = $postBody.offset().top,\n\t\t\t\tborderWidth = 1,\n\t\t\t\tcontentWrapWidth = $contentWrap.width(),\n\t\t\t\t$top, $editor, sidebarTop, footerTop, canPin,\n\t\t\t\ttopPos, topHeight, editorPos, editorHeight;\n\n\t\t\t// Refresh the heights\n\t\t\tif ( resize || ! heights.windowHeight ) {\n\t\t\t\tgetHeights();\n\t\t\t}\n\n\t\t\tif ( ! visual && type === 'resize' ) {\n\t\t\t\ttextEditorResize();\n\t\t\t}\n\n\t\t\tif ( visual ) {\n\t\t\t\t$top = $visualTop;\n\t\t\t\t$editor = $visualEditor;\n\t\t\t\ttopHeight = heights.visualTopHeight;\n\t\t\t} else {\n\t\t\t\t$top = $textTop;\n\t\t\t\t$editor = $textEditor;\n\t\t\t\ttopHeight = heights.textTopHeight;\n\t\t\t}\n\n\t\t\t// TinyMCE still intializing.\n\t\t\tif ( ! visual && ! $top.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttopPos = $top.parent().offset().top;\n\t\t\teditorPos = $editor.offset().top;\n\t\t\teditorHeight = $editor.outerHeight();\n\n\t\t\t// Should we pin?\n\t\t\tcanPin = visual ? autoresizeMinHeight + topHeight : autoresizeMinHeight + 20; // 20px from textarea padding\n\t\t\tcanPin = editorHeight > ( canPin + 5 );\n\n\t\t\tif ( ! canPin ) {\n\t\t\t\tif ( resize ) {\n\t\t\t\t\t$tools.css( {\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\twidth: contentWrapWidth\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( visual && $menuBar.length ) {\n\t\t\t\t\t\t$menuBar.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 )\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t\t$top.css( {\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: heights.menuBarHeight,\n\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )\n\t\t\t\t\t} );\n\n\t\t\t\t\t$statusBar.attr( 'style', advanced ? '' : 'visibility: hidden;' );\n\t\t\t\t\t$bottom.attr( 'style', '' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Maybe pin the top.\n\t\t\t\tif ( ( ! fixedTop || resize ) &&\n\t\t\t\t\t// Handle scrolling down.\n\t\t\t\t\t( windowPos >= ( topPos - heights.toolsHeight - heights.adminBarHeight ) &&\n\t\t\t\t\t// Handle scrolling up.\n\t\t\t\t\twindowPos <= ( topPos - heights.toolsHeight - heights.adminBarHeight + editorHeight - buffer ) ) ) {\n\t\t\t\t\tfixedTop = true;\n\n\t\t\t\t\t$tools.css( {\n\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\ttop: heights.adminBarHeight,\n\t\t\t\t\t\twidth: contentWrapWidth\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( visual && $menuBar.length ) {\n\t\t\t\t\t\t$menuBar.css( {\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\ttop: heights.adminBarHeight + heights.toolsHeight,\n\t\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t\t$top.css( {\n\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\ttop: heights.adminBarHeight + heights.toolsHeight + heights.menuBarHeight,\n\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )\n\t\t\t\t\t} );\n\t\t\t\t// Maybe unpin the top.\n\t\t\t\t} else if ( fixedTop || resize ) {\n\t\t\t\t\t// Handle scrolling up.\n\t\t\t\t\tif ( windowPos <= ( topPos - heights.toolsHeight - heights.adminBarHeight ) ) {\n\t\t\t\t\t\tfixedTop = false;\n\n\t\t\t\t\t\t$tools.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: contentWrapWidth\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tif ( visual && $menuBar.length ) {\n\t\t\t\t\t\t\t$menuBar.css( {\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 )\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$top.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: heights.menuBarHeight,\n\t\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )\n\t\t\t\t\t\t} );\n\t\t\t\t\t// Handle scrolling down.\n\t\t\t\t\t} else if ( windowPos >= ( topPos - heights.toolsHeight - heights.adminBarHeight + editorHeight - buffer ) ) {\n\t\t\t\t\t\tfixedTop = false;\n\n\t\t\t\t\t\t$tools.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: editorHeight - buffer,\n\t\t\t\t\t\t\twidth: contentWrapWidth\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tif ( visual && $menuBar.length ) {\n\t\t\t\t\t\t\t$menuBar.css( {\n\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\ttop: editorHeight - buffer,\n\t\t\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 )\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$top.css( {\n\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\ttop: editorHeight - buffer + heights.menuBarHeight,\n\t\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 ) - ( visual ? 0 : ( $top.outerWidth() - $top.width() ) )\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Maybe adjust the bottom bar.\n\t\t\t\tif ( ( ! fixedBottom || ( resize && advanced ) ) &&\n\t\t\t\t\t\t// +[n] for the border around the .wp-editor-container.\n\t\t\t\t\t\t( windowPos + heights.windowHeight ) <= ( editorPos + editorHeight + heights.bottomHeight + heights.statusBarHeight + borderWidth ) ) {\n\n\t\t\t\t\tif ( event && event.deltaHeight > 0 && event.deltaHeight < 100 ) {\n\t\t\t\t\t\twindow.scrollBy( 0, event.deltaHeight );\n\t\t\t\t\t} else if ( advanced ) {\n\t\t\t\t\t\tfixedBottom = true;\n\n\t\t\t\t\t\t$statusBar.css( {\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\tbottom: heights.bottomHeight,\n\t\t\t\t\t\t\tvisibility: '',\n\t\t\t\t\t\t\twidth: contentWrapWidth - ( borderWidth * 2 )\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t$bottom.css( {\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\t\twidth: contentWrapWidth\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t} else if ( ( ! advanced && fixedBottom ) ||\n\t\t\t\t\t\t( ( fixedBottom || resize ) &&\n\t\t\t\t\t\t( windowPos + heights.windowHeight ) > ( editorPos + editorHeight + heights.bottomHeight + heights.statusBarHeight - borderWidth ) ) ) {\n\t\t\t\t\tfixedBottom = false;\n\n\t\t\t\t\t$statusBar.attr( 'style', advanced ? '' : 'visibility: hidden;' );\n\t\t\t\t\t$bottom.attr( 'style', '' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Sidebar pinning\n\t\t\tif ( $postboxContainer.width() < 300 && heights.windowWidth > 600 && // sidebar position is changed with @media from CSS, make sure it is on the side\n\t\t\t\t$document.height() > ( $sideSortables.height() + postBodyTop + 120 ) && // the sidebar is not the tallest element\n\t\t\t\theights.windowHeight < editorHeight ) { // the editor is taller than the viewport\n\n\t\t\t\tif ( ( heights.sideSortablesHeight + pinnedToolsTop + sidebarBottom ) > heights.windowHeight || fixedSideTop || fixedSideBottom ) {\n\t\t\t\t\t// Reset when scrolling to the top\n\t\t\t\t\tif ( windowPos + pinnedToolsTop <= postBodyTop ) {\n\t\t\t\t\t\t$sideSortables.attr( 'style', '' );\n\t\t\t\t\t\tfixedSideTop = fixedSideBottom = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( windowPos > lastScrollPosition ) {\n\t\t\t\t\t\t\t// Scrolling down\n\t\t\t\t\t\t\tif ( fixedSideTop ) {\n\t\t\t\t\t\t\t\t// let it scroll\n\t\t\t\t\t\t\t\tfixedSideTop = false;\n\t\t\t\t\t\t\t\tsidebarTop = $sideSortables.offset().top - heights.adminBarHeight;\n\t\t\t\t\t\t\t\tfooterTop = $footer.offset().top;\n\n\t\t\t\t\t\t\t\t// don't get over the footer\n\t\t\t\t\t\t\t\tif ( footerTop < sidebarTop + heights.sideSortablesHeight + sidebarBottom ) {\n\t\t\t\t\t\t\t\t\tsidebarTop = footerTop - heights.sideSortablesHeight - 12;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t$sideSortables.css({\n\t\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\t\ttop: sidebarTop,\n\t\t\t\t\t\t\t\t\tbottom: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else if ( ! fixedSideBottom && heights.sideSortablesHeight + $sideSortables.offset().top + sidebarBottom < windowPos + heights.windowHeight ) {\n\t\t\t\t\t\t\t\t// pin the bottom\n\t\t\t\t\t\t\t\tfixedSideBottom = true;\n\n\t\t\t\t\t\t\t\t$sideSortables.css({\n\t\t\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\t\t\ttop: 'auto',\n\t\t\t\t\t\t\t\t\tbottom: sidebarBottom\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ( windowPos < lastScrollPosition ) {\n\t\t\t\t\t\t\t// Scrolling up\n\t\t\t\t\t\t\tif ( fixedSideBottom ) {\n\t\t\t\t\t\t\t\t// let it scroll\n\t\t\t\t\t\t\t\tfixedSideBottom = false;\n\t\t\t\t\t\t\t\tsidebarTop = $sideSortables.offset().top - sidebarBottom;\n\t\t\t\t\t\t\t\tfooterTop = $footer.offset().top;\n\n\t\t\t\t\t\t\t\t// don't get over the footer\n\t\t\t\t\t\t\t\tif ( footerTop < sidebarTop + heights.sideSortablesHeight + sidebarBottom ) {\n\t\t\t\t\t\t\t\t\tsidebarTop = footerTop - heights.sideSortablesHeight - 12;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t$sideSortables.css({\n\t\t\t\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\t\t\t\ttop: sidebarTop,\n\t\t\t\t\t\t\t\t\tbottom: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else if ( ! fixedSideTop && $sideSortables.offset().top >= windowPos + pinnedToolsTop ) {\n\t\t\t\t\t\t\t\t// pin the top\n\t\t\t\t\t\t\t\tfixedSideTop = true;\n\n\t\t\t\t\t\t\t\t$sideSortables.css({\n\t\t\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\t\t\ttop: pinnedToolsTop,\n\t\t\t\t\t\t\t\t\tbottom: ''\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// if the sidebar container is smaller than the viewport, then pin/unpin the top when scrolling\n\t\t\t\t\tif ( windowPos >= ( postBodyTop - pinnedToolsTop ) ) {\n\n\t\t\t\t\t\t$sideSortables.css( {\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\ttop: pinnedToolsTop\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$sideSortables.attr( 'style', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\tfixedSideTop = fixedSideBottom = false;\n\t\t\t\t}\n\n\t\t\t\tlastScrollPosition = windowPos;\n\t\t\t} else {\n\t\t\t\t$sideSortables.attr( 'style', '' );\n\t\t\t\tfixedSideTop = fixedSideBottom = false;\n\t\t\t}\n\n\t\t\tif ( resize ) {\n\t\t\t\t$contentWrap.css( {\n\t\t\t\t\tpaddingTop: heights.toolsHeight\n\t\t\t\t} );\n\n\t\t\t\tif ( visual ) {\n\t\t\t\t\t$visualEditor.css( {\n\t\t\t\t\t\tpaddingTop: heights.visualTopHeight + heights.menuBarHeight\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\t$textEditor.css( {\n\t\t\t\t\t\tmarginTop: heights.textTopHeight\n\t\t\t\t\t} );\n\n\t\t\t\t\t$textEditorClone.width( contentWrapWidth - 20 - ( borderWidth * 2 ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction fullscreenHide() {\n\t\t\ttextEditorResize();\n\t\t\tadjust();\n\t\t}\n\n\t\tfunction initialResize( callback ) {\n\t\t\tfor ( var i = 1; i < 6; i++ ) {\n\t\t\t\tsetTimeout( callback, 500 * i );\n\t\t\t}\n\t\t}\n\n\t\tfunction afterScroll() {\n\t\t\tclearTimeout( scrollTimer );\n\t\t\tscrollTimer = setTimeout( adjust, 100 );\n\t\t}\n\n\t\tfunction on() {\n\t\t\t// Scroll to the top when triggering this from JS.\n\t\t\t// Ensures toolbars are pinned properly.\n\t\t\tif ( window.pageYOffset && window.pageYOffset > pageYOffsetAtTop ) {\n\t\t\t\twindow.scrollTo( window.pageXOffset, 0 );\n\t\t\t}\n\n\t\t\t$wrap.addClass( 'wp-editor-expand' );\n\n\t\t\t// Adjust when the window is scrolled or resized.\n\t\t\t$window.on( 'scroll.editor-expand resize.editor-expand', function( event ) {\n\t\t\t\tadjust( event.type );\n\t\t\t\tafterScroll();\n\t\t\t} );\n\n\t\t\t// Adjust when collapsing the menu, changing the columns, changing the body class.\n\t\t\t$document.on( 'wp-collapse-menu.editor-expand postboxes-columnchange.editor-expand editor-classchange.editor-expand', adjust )\n\t\t\t\t.on( 'postbox-toggled.editor-expand', function() {\n\t\t\t\t\tif ( ! fixedSideTop && ! fixedSideBottom && window.pageYOffset > pinnedToolsTop ) {\n\t\t\t\t\t\tfixedSideBottom = true;\n\t\t\t\t\t\twindow.scrollBy( 0, -1 );\n\t\t\t\t\t\tadjust();\n\t\t\t\t\t\twindow.scrollBy( 0, 1 );\n\t\t\t\t\t}\n\n\t\t\t\t\tadjust();\n\t\t\t\t}).on( 'wp-window-resized.editor-expand', function() {\n\t\t\t\t\tif ( mceEditor && ! mceEditor.isHidden() ) {\n\t\t\t\t\t\tmceEditor.execCommand( 'wpAutoResize' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextEditorResize();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t$textEditor.on( 'focus.editor-expand input.editor-expand propertychange.editor-expand', textEditorResize );\n\t\t\t$textEditor.on( 'keyup.editor-expand', textEditorKeyup );\n\t\t\tmceBind();\n\n\t\t\t// Adjust when entering/exiting fullscreen mode.\n\t\t\tfullscreen && fullscreen.pubsub.subscribe( 'hidden', fullscreenHide );\n\n\t\t\tif ( mceEditor ) {\n\t\t\t\tmceEditor.settings.wp_autoresize_on = true;\n\t\t\t\tmceEditor.execCommand( 'wpAutoResizeOn' );\n\n\t\t\t\tif ( ! mceEditor.isHidden() ) {\n\t\t\t\t\tmceEditor.execCommand( 'wpAutoResize' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! mceEditor || mceEditor.isHidden() ) {\n\t\t\t\ttextEditorResize();\n\t\t\t}\n\n\t\t\tadjust();\n\n\t\t\t$document.trigger( 'editor-expand-on' );\n\t\t}\n\n\t\tfunction off() {\n\t\t\tvar height = parseInt( window.getUserSetting( 'ed_size', 300 ), 10 );\n\n\t\t\tif ( height < 50 ) {\n\t\t\t\theight = 50;\n\t\t\t} else if ( height > 5000 ) {\n\t\t\t\theight = 5000;\n\t\t\t}\n\n\t\t\t// Scroll to the top when triggering this from JS.\n\t\t\t// Ensures toolbars are reset properly.\n\t\t\tif ( window.pageYOffset && window.pageYOffset > pageYOffsetAtTop ) {\n\t\t\t\twindow.scrollTo( window.pageXOffset, 0 );\n\t\t\t}\n\n\t\t\t$wrap.removeClass( 'wp-editor-expand' );\n\n\t\t\t$window.off( '.editor-expand' );\n\t\t\t$document.off( '.editor-expand' );\n\t\t\t$textEditor.off( '.editor-expand' );\n\t\t\tmceUnbind();\n\n\t\t\t// Adjust when entering/exiting fullscreen mode.\n\t\t\tfullscreen && fullscreen.pubsub.unsubscribe( 'hidden', fullscreenHide );\n\n\t\t\t// Reset all css\n\t\t\t$.each( [ $visualTop, $textTop, $tools, $menuBar, $bottom, $statusBar, $contentWrap, $visualEditor, $textEditor, $sideSortables ], function( i, element ) {\n\t\t\t\telement && element.attr( 'style', '' );\n\t\t\t});\n\n\t\t\tfixedTop = fixedBottom = fixedSideTop = fixedSideBottom = false;\n\n\t\t\tif ( mceEditor ) {\n\t\t\t\tmceEditor.settings.wp_autoresize_on = false;\n\t\t\t\tmceEditor.execCommand( 'wpAutoResizeOff' );\n\n\t\t\t\tif ( ! mceEditor.isHidden() ) {\n\t\t\t\t\t$textEditor.hide();\n\n\t\t\t\t\tif ( height ) {\n\t\t\t\t\t\tmceEditor.theme.resizeTo( null, height );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( height ) {\n\t\t\t\t$textEditor.height( height );\n\t\t\t}\n\n\t\t\t$document.trigger( 'editor-expand-off' );\n\t\t}\n\n\t\t// Start on load\n\t\tif ( $wrap.hasClass( 'wp-editor-expand' ) ) {\n\t\t\ton();\n\n\t\t\t// Ideally we need to resize just after CSS has fully loaded and QuickTags is ready.\n\t\t\tif ( $contentWrap.hasClass( 'html-active' ) ) {\n\t\t\t\tinitialResize( function() {\n\t\t\t\t\tadjust();\n\t\t\t\t\ttextEditorResize();\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t// Show the on/off checkbox\n\t\t$( '#adv-settings .editor-expand' ).show();\n\t\t$( '#editor-expand-toggle' ).on( 'change.editor-expand', function() {\n\t\t\tif ( $(this).prop( 'checked' ) ) {\n\t\t\t\ton();\n\t\t\t\twindow.setUserSetting( 'editor_expand', 'on' );\n\t\t\t} else {\n\t\t\t\toff();\n\t\t\t\twindow.setUserSetting( 'editor_expand', 'off' );\n\t\t\t}\n\t\t});\n\n\t\t// Expose on() and off()\n\t\twindow.editorExpand = {\n\t\t\ton: on,\n\t\t\toff: off\n\t\t};\n\t} );\n\n\t/* DFW. */\n\t$( function() {\n\t\tvar $body = $( document.body ),\n\t\t\t$wrap = $( '#wpcontent' ),\n\t\t\t$editor = $( '#post-body-content' ),\n\t\t\t$title = $( '#title' ),\n\t\t\t$content = $( '#content' ),\n\t\t\t$overlay = $( document.createElement( 'DIV' ) ),\n\t\t\t$slug = $( '#edit-slug-box' ),\n\t\t\t$slugFocusEl = $slug.find( 'a' )\n\t\t\t\t.add( $slug.find( 'button' ) )\n\t\t\t\t.add( $slug.find( 'input' ) ),\n\t\t\t$menuWrap = $( '#adminmenuwrap' ),\n\t\t\t$editorWindow = $(),\n\t\t\t$editorIframe = $(),\n\t\t\t_isActive = window.getUserSetting( 'editor_expand', 'on' ) === 'on',\n\t\t\t_isOn = _isActive ? window.getUserSetting( 'post_dfw' ) === 'on' : false,\n\t\t\ttraveledX = 0,\n\t\t\ttraveledY = 0,\n\t\t\tbuffer = 20,\n\t\t\tfaded, fadedAdminBar, fadedSlug,\n\t\t\teditorRect, x, y, mouseY, scrollY,\n\t\t\tfocusLostTimer, overlayTimer, editorHasFocus;\n\n\t\t$body.append( $overlay );\n\n\t\t$overlay.css( {\n\t\t\tdisplay: 'none',\n\t\t\tposition: 'fixed',\n\t\t\ttop: $adminBar.height(),\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\tleft: 0,\n\t\t\t'z-index': 9997\n\t\t} );\n\n\t\t$editor.css( {\n\t\t\tposition: 'relative'\n\t\t} );\n\n\t\t$window.on( 'mousemove.focus', function( event ) {\n\t\t\tmouseY = event.pageY;\n\t\t} );\n\n\t\tfunction recalcEditorRect() {\n\t\t\teditorRect = $editor.offset();\n\t\t\teditorRect.right = editorRect.left + $editor.outerWidth();\n\t\t\teditorRect.bottom = editorRect.top + $editor.outerHeight();\n\t\t}\n\n\t\tfunction activate() {\n\t\t\tif ( ! _isActive ) {\n\t\t\t\t_isActive = true;\n\n\t\t\t\t$document.trigger( 'dfw-activate' );\n\t\t\t\t$content.on( 'keydown.focus-shortcut', toggleViaKeyboard );\n\t\t\t}\n\t\t}\n\n\t\tfunction deactivate() {\n\t\t\tif ( _isActive ) {\n\t\t\t\toff();\n\n\t\t\t\t_isActive = false;\n\n\t\t\t\t$document.trigger( 'dfw-deactivate' );\n\t\t\t\t$content.off( 'keydown.focus-shortcut' );\n\t\t\t}\n\t\t}\n\n\t\tfunction isActive() {\n\t\t\treturn _isActive;\n\t\t}\n\n\t\tfunction on() {\n\t\t\tif ( ! _isOn && _isActive ) {\n\t\t\t\t_isOn = true;\n\n\t\t\t\t$content.on( 'keydown.focus', fadeOut );\n\n\t\t\t\t$title.add( $content ).on( 'blur.focus', maybeFadeIn );\n\n\t\t\t\tfadeOut();\n\n\t\t\t\twindow.setUserSetting( 'post_dfw', 'on' );\n\n\t\t\t\t$document.trigger( 'dfw-on' );\n\t\t\t}\n\t\t}\n\n\t\tfunction off() {\n\t\t\tif ( _isOn ) {\n\t\t\t\t_isOn = false;\n\n\t\t\t\t$title.add( $content ).off( '.focus' );\n\n\t\t\t\tfadeIn();\n\n\t\t\t\t$editor.off( '.focus' );\n\n\t\t\t\twindow.setUserSetting( 'post_dfw', 'off' );\n\n\t\t\t\t$document.trigger( 'dfw-off' );\n\t\t\t}\n\t\t}\n\n\t\tfunction toggle() {\n\t\t\tif ( _isOn ) {\n\t\t\t\toff();\n\t\t\t} else {\n\t\t\t\ton();\n\t\t\t}\n\t\t}\n\n\t\tfunction isOn() {\n\t\t\treturn _isOn;\n\t\t}\n\n\t\tfunction fadeOut( event ) {\n\t\t\tvar key = event && event.keyCode;\n\n\t\t\t// fadeIn and return on Escape and keyboard shortcut Alt+Shift+W.\n\t\t\tif ( key === 27 || ( key === 87 && event.altKey && event.shiftKey ) ) {\n\t\t\t\tfadeIn( event );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( event && ( event.metaKey || ( event.ctrlKey && ! event.altKey ) || ( event.altKey && event.shiftKey ) || ( key && (\n\t\t\t\t// Special keys ( tab, ctrl, alt, esc, arrow keys... )\n\t\t\t\t( key <= 47 && key !== 8 && key !== 13 && key !== 32 && key !== 46 ) ||\n\t\t\t\t// Windows keys\n\t\t\t\t( key >= 91 && key <= 93 ) ||\n\t\t\t\t// F keys\n\t\t\t\t( key >= 112 && key <= 135 ) ||\n\t\t\t\t// Num Lock, Scroll Lock, OEM\n\t\t\t\t( key >= 144 && key <= 150 ) ||\n\t\t\t\t// OEM or non-printable\n\t\t\t\tkey >= 224\n\t\t\t) ) ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! faded ) {\n\t\t\t\tfaded = true;\n\n\t\t\t\tclearTimeout( overlayTimer );\n\n\t\t\t\toverlayTimer = setTimeout( function() {\n\t\t\t\t\t$overlay.show();\n\t\t\t\t}, 600 );\n\n\t\t\t\t$editor.css( 'z-index', 9998 );\n\n\t\t\t\t$overlay\n\t\t\t\t\t// Always recalculate the editor area entering the overlay with the mouse.\n\t\t\t\t\t.on( 'mouseenter.focus', function() {\n\t\t\t\t\t\trecalcEditorRect();\n\n\t\t\t\t\t\t$window.on( 'scroll.focus', function() {\n\t\t\t\t\t\t\tvar nScrollY = window.pageYOffset;\n\n\t\t\t\t\t\t\tif ( (\n\t\t\t\t\t\t\t\tscrollY && mouseY &&\n\t\t\t\t\t\t\t\tscrollY !== nScrollY\n\t\t\t\t\t\t\t) && (\n\t\t\t\t\t\t\t\tmouseY < editorRect.top - buffer ||\n\t\t\t\t\t\t\t\tmouseY > editorRect.bottom + buffer\n\t\t\t\t\t\t\t) ) {\n\t\t\t\t\t\t\t\tfadeIn();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tscrollY = nScrollY;\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )\n\t\t\t\t\t.on( 'mouseleave.focus', function() {\n\t\t\t\t\t\tx = y =  null;\n\t\t\t\t\t\ttraveledX = traveledY = 0;\n\n\t\t\t\t\t\t$window.off( 'scroll.focus' );\n\t\t\t\t\t} )\n\t\t\t\t\t// Fade in when the mouse moves away form the editor area.\n\t\t\t\t\t.on( 'mousemove.focus', function( event ) {\n\t\t\t\t\t\tvar nx = event.clientX,\n\t\t\t\t\t\t\tny = event.clientY,\n\t\t\t\t\t\t\tpageYOffset = window.pageYOffset,\n\t\t\t\t\t\t\tpageXOffset = window.pageXOffset;\n\n\t\t\t\t\t\tif ( x && y && ( nx !== x || ny !== y ) ) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t( ny <= y && ny < editorRect.top - pageYOffset ) ||\n\t\t\t\t\t\t\t\t( ny >= y && ny > editorRect.bottom - pageYOffset ) ||\n\t\t\t\t\t\t\t\t( nx <= x && nx < editorRect.left - pageXOffset ) ||\n\t\t\t\t\t\t\t\t( nx >= x && nx > editorRect.right - pageXOffset )\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttraveledX += Math.abs( x - nx );\n\t\t\t\t\t\t\t\ttraveledY += Math.abs( y - ny );\n\n\t\t\t\t\t\t\t\tif ( (\n\t\t\t\t\t\t\t\t\tny <= editorRect.top - buffer - pageYOffset ||\n\t\t\t\t\t\t\t\t\tny >= editorRect.bottom + buffer - pageYOffset ||\n\t\t\t\t\t\t\t\t\tnx <= editorRect.left - buffer - pageXOffset ||\n\t\t\t\t\t\t\t\t\tnx >= editorRect.right + buffer - pageXOffset\n\t\t\t\t\t\t\t\t) && (\n\t\t\t\t\t\t\t\t\ttraveledX > 10 ||\n\t\t\t\t\t\t\t\t\ttraveledY > 10\n\t\t\t\t\t\t\t\t) ) {\n\t\t\t\t\t\t\t\t\tfadeIn();\n\n\t\t\t\t\t\t\t\t\tx = y =  null;\n\t\t\t\t\t\t\t\t\ttraveledX = traveledY = 0;\n\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttraveledX = traveledY = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tx = nx;\n\t\t\t\t\t\ty = ny;\n\t\t\t\t\t} )\n\t\t\t\t\t// When the overlay is touched, always fade in and cancel the event.\n\t\t\t\t\t.on( 'touchstart.focus', function( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tfadeIn();\n\t\t\t\t\t} );\n\n\t\t\t\t$editor.off( 'mouseenter.focus' );\n\n\t\t\t\tif ( focusLostTimer ) {\n\t\t\t\t\tclearTimeout( focusLostTimer );\n\t\t\t\t\tfocusLostTimer = null;\n\t\t\t\t}\n\n\t\t\t\t$body.addClass( 'focus-on' ).removeClass( 'focus-off' );\n\t\t\t}\n\n\t\t\tfadeOutAdminBar();\n\t\t\tfadeOutSlug();\n\t\t}\n\n\t\tfunction fadeIn( event ) {\n\t\t\tif ( faded ) {\n\t\t\t\tfaded = false;\n\n\t\t\t\tclearTimeout( overlayTimer );\n\n\t\t\t\toverlayTimer = setTimeout( function() {\n\t\t\t\t\t$overlay.hide();\n\t\t\t\t}, 200 );\n\n\t\t\t\t$editor.css( 'z-index', '' );\n\n\t\t\t\t$overlay.off( 'mouseenter.focus mouseleave.focus mousemove.focus touchstart.focus' );\n\n\t\t\t\t/*\n\t\t\t\t * When fading in, temporarily watch for refocus and fade back out - helps\n\t\t\t\t * with 'accidental' editor exits with the mouse. When fading in and the event\n\t\t\t\t * is a key event (Escape or Alt+Shift+W) don't watch for refocus.\n\t\t\t\t */\n\t\t\t\tif ( 'undefined' === typeof event ) {\n\t\t\t\t\t$editor.on( 'mouseenter.focus', function() {\n\t\t\t\t\t\tif ( $.contains( $editor.get( 0 ), document.activeElement ) || editorHasFocus ) {\n\t\t\t\t\t\t\tfadeOut();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tfocusLostTimer = setTimeout( function() {\n\t\t\t\t\tfocusLostTimer = null;\n\t\t\t\t\t$editor.off( 'mouseenter.focus' );\n\t\t\t\t}, 1000 );\n\n\t\t\t\t$body.addClass( 'focus-off' ).removeClass( 'focus-on' );\n\t\t\t}\n\n\t\t\tfadeInAdminBar();\n\t\t\tfadeInSlug();\n\t\t}\n\n\t\tfunction maybeFadeIn() {\n\t\t\tsetTimeout( function() {\n\t\t\t\tvar position = document.activeElement.compareDocumentPosition( $editor.get( 0 ) );\n\n\t\t\t\tfunction hasFocus( $el ) {\n\t\t\t\t\treturn $.contains( $el.get( 0 ), document.activeElement );\n\t\t\t\t}\n\n\t\t\t\t// The focused node is before or behind the editor area, and not outside the wrap.\n\t\t\t\tif ( ( position === 2 || position === 4 ) && ( hasFocus( $menuWrap ) || hasFocus( $wrap ) || hasFocus( $footer ) ) ) {\n\t\t\t\t\tfadeIn();\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t}\n\n\t\tfunction fadeOutAdminBar() {\n\t\t\tif ( ! fadedAdminBar && faded ) {\n\t\t\t\tfadedAdminBar = true;\n\n\t\t\t\t$adminBar\n\t\t\t\t\t.on( 'mouseenter.focus', function() {\n\t\t\t\t\t\t$adminBar.addClass( 'focus-off' );\n\t\t\t\t\t} )\n\t\t\t\t\t.on( 'mouseleave.focus', function() {\n\t\t\t\t\t\t$adminBar.removeClass( 'focus-off' );\n\t\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\tfunction fadeInAdminBar() {\n\t\t\tif ( fadedAdminBar ) {\n\t\t\t\tfadedAdminBar = false;\n\n\t\t\t\t$adminBar.off( '.focus' );\n\t\t\t}\n\t\t}\n\n\t\tfunction fadeOutSlug() {\n\t\t\tif ( ! fadedSlug && faded && ! $slug.find( ':focus').length ) {\n\t\t\t\tfadedSlug = true;\n\n\t\t\t\t$slug.stop().fadeTo( 'fast', 0.3 ).on( 'mouseenter.focus', fadeInSlug ).off( 'mouseleave.focus' );\n\n\t\t\t\t$slugFocusEl.on( 'focus.focus', fadeInSlug ).off( 'blur.focus' );\n\t\t\t}\n\t\t}\n\n\t\tfunction fadeInSlug() {\n\t\t\tif ( fadedSlug ) {\n\t\t\t\tfadedSlug = false;\n\n\t\t\t\t$slug.stop().fadeTo( 'fast', 1 ).on( 'mouseleave.focus', fadeOutSlug ).off( 'mouseenter.focus' );\n\n\t\t\t\t$slugFocusEl.on( 'blur.focus', fadeOutSlug ).off( 'focus.focus' );\n\t\t\t}\n\t\t}\n\n\t\tfunction toggleViaKeyboard( event ) {\n\t\t\tif ( event.altKey && event.shiftKey && 87 === event.keyCode ) {\n\t\t\t\ttoggle();\n\t\t\t}\n\t\t}\n\n\t\tif ( $( '#postdivrich' ).hasClass( 'wp-editor-expand' ) ) {\n\t\t\t$content.on( 'keydown.focus-shortcut', toggleViaKeyboard );\n\t\t}\n\n\t\t$document.on( 'tinymce-editor-setup.focus', function( event, editor ) {\n\t\t\teditor.addButton( 'dfw', {\n\t\t\t\tactive: _isOn,\n\t\t\t\tclasses: 'wp-dfw btn widget',\n\t\t\t\tdisabled: ! _isActive,\n\t\t\t\tonclick: toggle,\n\t\t\t\tonPostRender: function() {\n\t\t\t\t\tvar button = this;\n\n\t\t\t\t\t$document\n\t\t\t\t\t.on( 'dfw-activate.focus', function() {\n\t\t\t\t\t\tbutton.disabled( false );\n\t\t\t\t\t} )\n\t\t\t\t\t.on( 'dfw-deactivate.focus', function() {\n\t\t\t\t\t\tbutton.disabled( true );\n\t\t\t\t\t} )\n\t\t\t\t\t.on( 'dfw-on.focus', function() {\n\t\t\t\t\t\tbutton.active( true );\n\t\t\t\t\t} )\n\t\t\t\t\t.on( 'dfw-off.focus', function() {\n\t\t\t\t\t\tbutton.active( false );\n\t\t\t\t\t} );\n\t\t\t\t},\n\t\t\t\ttooltip: 'Distraction-free writing mode',\n\t\t\t\tshortcut: 'Alt+Shift+W'\n\t\t\t} );\n\n\t\t\teditor.addCommand( 'wpToggleDFW', toggle );\n\t\t\teditor.addShortcut( 'alt+shift+w', '', 'wpToggleDFW' );\n\t\t} );\n\n\t\t$document.on( 'tinymce-editor-init.focus', function( event, editor ) {\n\t\t\tvar mceBind, mceUnbind;\n\n\t\t\tfunction focus() {\n\t\t\t\teditorHasFocus = true;\n\t\t\t}\n\n\t\t\tfunction blur() {\n\t\t\t\teditorHasFocus = false;\n\t\t\t}\n\n\t\t\tif ( editor.id === 'content' ) {\n\t\t\t\t$editorWindow = $( editor.getWin() );\n\t\t\t\t$editorIframe = $( editor.getContentAreaContainer() ).find( 'iframe' );\n\n\t\t\t\tmceBind = function() {\n\t\t\t\t\teditor.on( 'keydown', fadeOut );\n\t\t\t\t\teditor.on( 'blur', maybeFadeIn );\n\t\t\t\t\teditor.on( 'focus', focus );\n\t\t\t\t\teditor.on( 'blur', blur );\n\t\t\t\t\teditor.on( 'wp-autoresize', recalcEditorRect );\n\t\t\t\t};\n\n\t\t\t\tmceUnbind = function() {\n\t\t\t\t\teditor.off( 'keydown', fadeOut );\n\t\t\t\t\teditor.off( 'blur', maybeFadeIn );\n\t\t\t\t\teditor.off( 'focus', focus );\n\t\t\t\t\teditor.off( 'blur', blur );\n\t\t\t\t\teditor.off( 'wp-autoresize', recalcEditorRect );\n\t\t\t\t};\n\n\t\t\t\tif ( _isOn ) {\n\t\t\t\t\tmceBind();\n\t\t\t\t}\n\n\t\t\t\t$document.on( 'dfw-on.focus', mceBind ).on( 'dfw-off.focus', mceUnbind );\n\n\t\t\t\t// Make sure the body focuses when clicking outside it.\n\t\t\t\teditor.on( 'click', function( event ) {\n\t\t\t\t\tif ( event.target === editor.getDoc().documentElement ) {\n\t\t\t\t\t\teditor.focus();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t$document.on( 'quicktags-init', function( event, editor ) {\n\t\t\tvar $button;\n\n\t\t\tif ( editor.settings.buttons && ( ',' + editor.settings.buttons + ',' ).indexOf( ',dfw,' ) !== -1 ) {\n\t\t\t\t$button = $( '#' + editor.name + '_dfw' );\n\n\t\t\t\t$( document )\n\t\t\t\t.on( 'dfw-activate', function() {\n\t\t\t\t\t$button.prop( 'disabled', false );\n\t\t\t\t} )\n\t\t\t\t.on( 'dfw-deactivate', function() {\n\t\t\t\t\t$button.prop( 'disabled', true );\n\t\t\t\t} )\n\t\t\t\t.on( 'dfw-on', function() {\n\t\t\t\t\t$button.addClass( 'active' );\n\t\t\t\t} )\n\t\t\t\t.on( 'dfw-off', function() {\n\t\t\t\t\t$button.removeClass( 'active' );\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\t$document.on( 'editor-expand-on.focus', activate ).on( 'editor-expand-off.focus', deactivate );\n\n\t\tif ( _isOn ) {\n\t\t\t$content.on( 'keydown.focus', fadeOut );\n\n\t\t\t$title.add( $content ).on( 'blur.focus', maybeFadeIn );\n\t\t}\n\n\t\twindow.wp = window.wp || {};\n\t\twindow.wp.editor = window.wp.editor || {};\n\t\twindow.wp.editor.dfw = {\n\t\t\tactivate: activate,\n\t\t\tdeactivate: deactivate,\n\t\t\tisActive: isActive,\n\t\t\ton: on,\n\t\t\toff: off,\n\t\t\ttoggle: toggle,\n\t\t\tisOn: isOn\n\t\t};\n\t} );\n} )( window, window.jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/editor.js",
    "content": "\n( function( $ ) {\n\tfunction SwitchEditors() {\n\t\tvar tinymce, $$,\n\t\t\texports = {};\n\n\t\tfunction init() {\n\t\t\tif ( ! tinymce && window.tinymce ) {\n\t\t\t\ttinymce = window.tinymce;\n\t\t\t\t$$ = tinymce.$;\n\n\t\t\t\t$$( document ).on( 'click', function( event ) {\n\t\t\t\t\tvar id, mode,\n\t\t\t\t\t\ttarget = $$( event.target );\n\n\t\t\t\t\tif ( target.hasClass( 'wp-switch-editor' ) ) {\n\t\t\t\t\t\tid = target.attr( 'data-wp-editor-id' );\n\t\t\t\t\t\tmode = target.hasClass( 'switch-tmce' ) ? 'tmce' : 'html';\n\t\t\t\t\t\tswitchEditor( id, mode );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction getToolbarHeight( editor ) {\n\t\t\tvar node = $$( '.mce-toolbar-grp', editor.getContainer() )[0],\n\t\t\t\theight = node && node.clientHeight;\n\n\t\t\tif ( height && height > 10 && height < 200 ) {\n\t\t\t\treturn parseInt( height, 10 );\n\t\t\t}\n\n\t\t\treturn 30;\n\t\t}\n\n\t\tfunction switchEditor( id, mode ) {\n\t\t\tid = id || 'content';\n\t\t\tmode = mode || 'toggle';\n\n\t\t\tvar editorHeight, toolbarHeight, iframe,\n\t\t\t\teditor = tinymce.get( id ),\n\t\t\t\twrap = $$( '#wp-' + id + '-wrap' ),\n\t\t\t\t$textarea = $$( '#' + id ),\n\t\t\t\ttextarea = $textarea[0];\n\n\t\t\tif ( 'toggle' === mode ) {\n\t\t\t\tif ( editor && ! editor.isHidden() ) {\n\t\t\t\t\tmode = 'html';\n\t\t\t\t} else {\n\t\t\t\t\tmode = 'tmce';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( 'tmce' === mode || 'tinymce' === mode ) {\n\t\t\t\tif ( editor && ! editor.isHidden() ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( typeof( window.QTags ) !== 'undefined' ) {\n\t\t\t\t\twindow.QTags.closeAllTags( id );\n\t\t\t\t}\n\n\t\t\t\teditorHeight = parseInt( textarea.style.height, 10 ) || 0;\n\n\t\t\t\tif ( editor ) {\n\t\t\t\t\teditor.show();\n\n\t\t\t\t\t// No point resizing the iframe in iOS\n\t\t\t\t\tif ( ! tinymce.Env.iOS && editorHeight ) {\n\t\t\t\t\t\ttoolbarHeight = getToolbarHeight( editor );\n\t\t\t\t\t\teditorHeight = editorHeight - toolbarHeight + 14;\n\n\t\t\t\t\t\t// height cannot be under 50 or over 5000\n\t\t\t\t\t\tif ( editorHeight > 50 && editorHeight < 5000 ) {\n\t\t\t\t\t\t\teditor.theme.resizeTo( null, editorHeight );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttinymce.init( window.tinyMCEPreInit.mceInit[id] );\n\t\t\t\t}\n\n\t\t\t\twrap.removeClass( 'html-active' ).addClass( 'tmce-active' );\n\t\t\t\t$textarea.attr( 'aria-hidden', true );\n\t\t\t\twindow.setUserSetting( 'editor', 'tinymce' );\n\n\t\t\t} else if ( 'html' === mode ) {\n\t\t\t\tif ( editor && editor.isHidden() ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( editor ) {\n\t\t\t\t\tif ( ! tinymce.Env.iOS ) {\n\t\t\t\t\t\tiframe = editor.iframeElement;\n\t\t\t\t\t\teditorHeight = iframe ? parseInt( iframe.style.height, 10 ) : 0;\n\n\t\t\t\t\t\tif ( editorHeight ) {\n\t\t\t\t\t\t\ttoolbarHeight = getToolbarHeight( editor );\n\t\t\t\t\t\t\teditorHeight = editorHeight + toolbarHeight - 14;\n\n\t\t\t\t\t\t\t// height cannot be under 50 or over 5000\n\t\t\t\t\t\t\tif ( editorHeight > 50 && editorHeight < 5000 ) {\n\t\t\t\t\t\t\t\ttextarea.style.height = editorHeight + 'px';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.hide();\n\t\t\t\t} else {\n\t\t\t\t\t// The TinyMCE instance doesn't exist, show the textarea\n\t\t\t\t\t$textarea.css({ 'display': '', 'visibility': '' });\n\t\t\t\t}\n\n\t\t\t\twrap.removeClass( 'tmce-active' ).addClass( 'html-active' );\n\t\t\t\t$textarea.attr( 'aria-hidden', false );\n\t\t\t\twindow.setUserSetting( 'editor', 'html' );\n\t\t\t}\n\t\t}\n\n\t\t// Replace paragraphs with double line breaks\n\t\tfunction removep( html ) {\n\t\t\tvar blocklist = 'blockquote|ul|ol|li|table|thead|tbody|tfoot|tr|th|td|h[1-6]|fieldset',\n\t\t\t\tblocklist1 = blocklist + '|div|p',\n\t\t\t\tblocklist2 = blocklist + '|pre',\n\t\t\t\tpreserve_linebreaks = false,\n\t\t\t\tpreserve_br = false;\n\n\t\t\tif ( ! html ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t// Protect pre|script tags\n\t\t\tif ( html.indexOf( '<pre' ) !== -1 || html.indexOf( '<script' ) !== -1 ) {\n\t\t\t\tpreserve_linebreaks = true;\n\t\t\t\thtml = html.replace( /<(pre|script)[^>]*>[\\s\\S]+?<\\/\\1>/g, function( a ) {\n\t\t\t\t\ta = a.replace( /<br ?\\/?>(\\r\\n|\\n)?/g, '<wp-line-break>' );\n\t\t\t\t\ta = a.replace( /<\\/?p( [^>]*)?>(\\r\\n|\\n)?/g, '<wp-line-break>' );\n\t\t\t\t\treturn a.replace( /\\r?\\n/g, '<wp-line-break>' );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// keep <br> tags inside captions and remove line breaks\n\t\t\tif ( html.indexOf( '[caption' ) !== -1 ) {\n\t\t\t\tpreserve_br = true;\n\t\t\t\thtml = html.replace( /\\[caption[\\s\\S]+?\\[\\/caption\\]/g, function( a ) {\n\t\t\t\t\treturn a.replace( /<br([^>]*)>/g, '<wp-temp-br$1>' ).replace( /[\\r\\n\\t]+/, '' );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Pretty it up for the source editor\n\t\t\thtml = html.replace( new RegExp( '\\\\s*</(' + blocklist1 + ')>\\\\s*', 'g' ), '</$1>\\n' );\n\t\t\thtml = html.replace( new RegExp( '\\\\s*<((?:' + blocklist1 + ')(?: [^>]*)?)>', 'g' ), '\\n<$1>' );\n\n\t\t\t// Mark </p> if it has any attributes.\n\t\t\thtml = html.replace( /(<p [^>]+>.*?)<\\/p>/g, '$1</p#>' );\n\n\t\t\t// Separate <div> containing <p>\n\t\t\thtml = html.replace( /<div( [^>]*)?>\\s*<p>/gi, '<div$1>\\n\\n' );\n\n\t\t\t// Remove <p> and <br />\n\t\t\thtml = html.replace( /\\s*<p>/gi, '' );\n\t\t\thtml = html.replace( /\\s*<\\/p>\\s*/gi, '\\n\\n' );\n\t\t\thtml = html.replace( /\\n[\\s\\u00a0]+\\n/g, '\\n\\n' );\n\t\t\thtml = html.replace( /\\s*<br ?\\/?>\\s*/gi, '\\n' );\n\n\t\t\t// Fix some block element newline issues\n\t\t\thtml = html.replace( /\\s*<div/g, '\\n<div' );\n\t\t\thtml = html.replace( /<\\/div>\\s*/g, '</div>\\n' );\n\t\t\thtml = html.replace( /\\s*\\[caption([^\\[]+)\\[\\/caption\\]\\s*/gi, '\\n\\n[caption$1[/caption]\\n\\n' );\n\t\t\thtml = html.replace( /caption\\]\\n\\n+\\[caption/g, 'caption]\\n\\n[caption' );\n\n\t\t\thtml = html.replace( new RegExp('\\\\s*<((?:' + blocklist2 + ')(?: [^>]*)?)\\\\s*>', 'g' ), '\\n<$1>' );\n\t\t\thtml = html.replace( new RegExp('\\\\s*</(' + blocklist2 + ')>\\\\s*', 'g' ), '</$1>\\n' );\n\t\t\thtml = html.replace( /<li([^>]*)>/g, '\\t<li$1>' );\n\n\t\t\tif ( html.indexOf( '<option' ) !== -1 ) {\n\t\t\t\thtml = html.replace( /\\s*<option/g, '\\n<option' );\n\t\t\t\thtml = html.replace( /\\s*<\\/select>/g, '\\n</select>' );\n\t\t\t}\n\n\t\t\tif ( html.indexOf( '<hr' ) !== -1 ) {\n\t\t\t\thtml = html.replace( /\\s*<hr( [^>]*)?>\\s*/g, '\\n\\n<hr$1>\\n\\n' );\n\t\t\t}\n\n\t\t\tif ( html.indexOf( '<object' ) !== -1 ) {\n\t\t\t\thtml = html.replace( /<object[\\s\\S]+?<\\/object>/g, function( a ) {\n\t\t\t\t\treturn a.replace( /[\\r\\n]+/g, '' );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Unmark special paragraph closing tags\n\t\t\thtml = html.replace( /<\\/p#>/g, '</p>\\n' );\n\t\t\thtml = html.replace( /\\s*(<p [^>]+>[\\s\\S]*?<\\/p>)/g, '\\n$1' );\n\n\t\t\t// Trim whitespace\n\t\t\thtml = html.replace( /^\\s+/, '' );\n\t\t\thtml = html.replace( /[\\s\\u00a0]+$/, '' );\n\n\t\t\t// put back the line breaks in pre|script\n\t\t\tif ( preserve_linebreaks ) {\n\t\t\t\thtml = html.replace( /<wp-line-break>/g, '\\n' );\n\t\t\t}\n\n\t\t\t// and the <br> tags in captions\n\t\t\tif ( preserve_br ) {\n\t\t\t\thtml = html.replace( /<wp-temp-br([^>]*)>/g, '<br$1>' );\n\t\t\t}\n\n\t\t\treturn html;\n\t\t}\n\n\t\t// Similar to `wpautop()` in formatting.php\n\t\tfunction autop( text ) {\n\t\t\tvar preserve_linebreaks = false,\n\t\t\t\tpreserve_br = false,\n\t\t\t\tblocklist = 'table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre' +\n\t\t\t\t\t'|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section' +\n\t\t\t\t\t'|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary';\n\n\t\t\t// Normalize line breaks\n\t\t\ttext = text.replace( /\\r\\n|\\r/g, '\\n' );\n\n\t\t\tif ( text.indexOf( '\\n' ) === -1 ) {\n\t\t\t\treturn text;\n\t\t\t}\n\n\t\t\tif ( text.indexOf( '<object' ) !== -1 ) {\n\t\t\t\ttext = text.replace( /<object[\\s\\S]+?<\\/object>/g, function( a ) {\n\t\t\t\t\treturn a.replace( /\\n+/g, '' );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttext = text.replace( /<[^<>]+>/g, function( a ) {\n\t\t\t\treturn a.replace( /[\\n\\t ]+/g, ' ' );\n\t\t\t});\n\n\t\t\t// Protect pre|script tags\n\t\t\tif ( text.indexOf( '<pre' ) !== -1 || text.indexOf( '<script' ) !== -1 ) {\n\t\t\t\tpreserve_linebreaks = true;\n\t\t\t\ttext = text.replace( /<(pre|script)[^>]*>[\\s\\S]*?<\\/\\1>/g, function( a ) {\n\t\t\t\t\treturn a.replace( /\\n/g, '<wp-line-break>' );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// keep <br> tags inside captions and convert line breaks\n\t\t\tif ( text.indexOf( '[caption' ) !== -1 ) {\n\t\t\t\tpreserve_br = true;\n\t\t\t\ttext = text.replace( /\\[caption[\\s\\S]+?\\[\\/caption\\]/g, function( a ) {\n\t\t\t\t\t// keep existing <br>\n\t\t\t\t\ta = a.replace( /<br([^>]*)>/g, '<wp-temp-br$1>' );\n\t\t\t\t\t// no line breaks inside HTML tags\n\t\t\t\t\ta = a.replace( /<[^<>]+>/g, function( b ) {\n\t\t\t\t\t\treturn b.replace( /[\\n\\t ]+/, ' ' );\n\t\t\t\t\t});\n\t\t\t\t\t// convert remaining line breaks to <br>\n\t\t\t\t\treturn a.replace( /\\s*\\n\\s*/g, '<wp-temp-br />' );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\ttext = text + '\\n\\n';\n\t\t\ttext = text.replace( /<br \\/>\\s*<br \\/>/gi, '\\n\\n' );\n\t\t\ttext = text.replace( new RegExp( '(<(?:' + blocklist + ')(?: [^>]*)?>)', 'gi' ), '\\n$1' );\n\t\t\ttext = text.replace( new RegExp( '(</(?:' + blocklist + ')>)', 'gi' ), '$1\\n\\n' );\n\t\t\ttext = text.replace( /<hr( [^>]*)?>/gi, '<hr$1>\\n\\n' ); // hr is self closing block element\n\t\t\ttext = text.replace( /\\s*<option/gi, '<option' ); // No <p> or <br> around <option>\n\t\t\ttext = text.replace( /<\\/option>\\s*/gi, '</option>' );\n\t\t\ttext = text.replace( /\\n\\s*\\n+/g, '\\n\\n' );\n\t\t\ttext = text.replace( /([\\s\\S]+?)\\n\\n/g, '<p>$1</p>\\n' );\n\t\t\ttext = text.replace( /<p>\\s*?<\\/p>/gi, '');\n\t\t\ttext = text.replace( new RegExp( '<p>\\\\s*(</?(?:' + blocklist + ')(?: [^>]*)?>)\\\\s*</p>', 'gi' ), '$1' );\n\t\t\ttext = text.replace( /<p>(<li.+?)<\\/p>/gi, '$1');\n\t\t\ttext = text.replace( /<p>\\s*<blockquote([^>]*)>/gi, '<blockquote$1><p>');\n\t\t\ttext = text.replace( /<\\/blockquote>\\s*<\\/p>/gi, '</p></blockquote>');\n\t\t\ttext = text.replace( new RegExp( '<p>\\\\s*(</?(?:' + blocklist + ')(?: [^>]*)?>)', 'gi' ), '$1' );\n\t\t\ttext = text.replace( new RegExp( '(</?(?:' + blocklist + ')(?: [^>]*)?>)\\\\s*</p>', 'gi' ), '$1' );\n\n\t\t\t// Remove redundant spaces and line breaks after existing <br /> tags\n\t\t\ttext = text.replace( /(<br[^>]*>)\\s*\\n/gi, '$1' );\n\n\t\t\t// Create <br /> from the remaining line breaks\n\t\t\ttext = text.replace( /\\s*\\n/g, '<br />\\n');\n\n\t\t\ttext = text.replace( new RegExp( '(</?(?:' + blocklist + ')[^>]*>)\\\\s*<br />', 'gi' ), '$1' );\n\t\t\ttext = text.replace( /<br \\/>(\\s*<\\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)/gi, '$1' );\n\t\t\ttext = text.replace( /(?:<p>|<br ?\\/?>)*\\s*\\[caption([^\\[]+)\\[\\/caption\\]\\s*(?:<\\/p>|<br ?\\/?>)*/gi, '[caption$1[/caption]' );\n\n\t\t\ttext = text.replace( /(<(?:div|th|td|form|fieldset|dd)[^>]*>)(.*?)<\\/p>/g, function( a, b, c ) {\n\t\t\t\tif ( c.match( /<p( [^>]*)?>/ ) ) {\n\t\t\t\t\treturn a;\n\t\t\t\t}\n\n\t\t\t\treturn b + '<p>' + c + '</p>';\n\t\t\t});\n\n\t\t\t// put back the line breaks in pre|script\n\t\t\tif ( preserve_linebreaks ) {\n\t\t\t\ttext = text.replace( /<wp-line-break>/g, '\\n' );\n\t\t\t}\n\n\t\t\tif ( preserve_br ) {\n\t\t\t\ttext = text.replace( /<wp-temp-br([^>]*)>/g, '<br$1>' );\n\t\t\t}\n\n\t\t\treturn text;\n\t\t}\n\n\t\t// Add old events\n\t\tfunction pre_wpautop( html ) {\n\t\t\tvar obj = { o: exports, data: html, unfiltered: html };\n\n\t\t\tif ( $ ) {\n\t\t\t\t$( 'body' ).trigger( 'beforePreWpautop', [ obj ] );\n\t\t\t}\n\n\t\t\tobj.data = removep( obj.data );\n\n\t\t\tif ( $ ) {\n\t\t\t\t$( 'body' ).trigger( 'afterPreWpautop', [ obj ] );\n\t\t\t}\n\n\t\t\treturn obj.data;\n\t\t}\n\n\t\tfunction wpautop( text ) {\n\t\t\tvar obj = { o: exports, data: text, unfiltered: text };\n\n\t\t\tif ( $ ) {\n\t\t\t\t$( 'body' ).trigger( 'beforeWpautop', [ obj ] );\n\t\t\t}\n\n\t\t\tobj.data = autop( obj.data );\n\n\t\t\tif ( $ ) {\n\t\t\t\t$( 'body' ).trigger( 'afterWpautop', [ obj ] );\n\t\t\t}\n\n\t\t\treturn obj.data;\n\t\t}\n\n\t\tif ( $ ) {\n\t\t\t$( document ).ready( init );\n\t\t} else if ( document.addEventListener ) {\n\t\t\tdocument.addEventListener( 'DOMContentLoaded', init, false );\n\t\t\twindow.addEventListener( 'load', init, false );\n\t\t} else if ( window.attachEvent ) {\n\t\t\twindow.attachEvent( 'onload', init );\n\t\t\tdocument.attachEvent( 'onreadystatechange', function() {\n\t\t\t\tif ( 'complete' === document.readyState ) {\n\t\t\t\t\tinit();\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\twindow.wp = window.wp || {};\n\t\twindow.wp.editor = window.wp.editor || {};\n\t\twindow.wp.editor.autop = wpautop;\n\t\twindow.wp.editor.removep = pre_wpautop;\n\n\t\texports = {\n\t\t\tgo: switchEditor,\n\t\t\twpautop: wpautop,\n\t\t\tpre_wpautop: pre_wpautop,\n\t\t\t_wp_Autop: autop,\n\t\t\t_wp_Nop: removep\n\t\t};\n\n\t\treturn exports;\n\t}\n\n\twindow.switchEditors = new SwitchEditors();\n}( window.jQuery ));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/farbtastic.js",
    "content": "/*!\n * Farbtastic: jQuery color picker plug-in v1.3u\n *\n * Licensed under the GPL license:\n *   http://www.gnu.org/licenses/gpl.html\n */\n(function($) {\n\n$.fn.farbtastic = function (options) {\n  $.farbtastic(this, options);\n  return this;\n};\n\n$.farbtastic = function (container, callback) {\n  var container = $(container).get(0);\n  return container.farbtastic || (container.farbtastic = new $._farbtastic(container, callback));\n};\n\n$._farbtastic = function (container, callback) {\n  // Store farbtastic object\n  var fb = this;\n\n  // Insert markup\n  $(container).html('<div class=\"farbtastic\"><div class=\"color\"></div><div class=\"wheel\"></div><div class=\"overlay\"></div><div class=\"h-marker marker\"></div><div class=\"sl-marker marker\"></div></div>');\n  var e = $('.farbtastic', container);\n  fb.wheel = $('.wheel', container).get(0);\n  // Dimensions\n  fb.radius = 84;\n  fb.square = 100;\n  fb.width = 194;\n\n  // Fix background PNGs in IE6\n  if (navigator.appVersion.match(/MSIE [0-6]\\./)) {\n    $('*', e).each(function () {\n      if (this.currentStyle.backgroundImage != 'none') {\n        var image = this.currentStyle.backgroundImage;\n        image = this.currentStyle.backgroundImage.substring(5, image.length - 2);\n        $(this).css({\n          'backgroundImage': 'none',\n          'filter': \"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='\" + image + \"')\"\n        });\n      }\n    });\n  }\n\n  /**\n   * Link to the given element(s) or callback.\n   */\n  fb.linkTo = function (callback) {\n    // Unbind previous nodes\n    if (typeof fb.callback == 'object') {\n      $(fb.callback).unbind('keyup', fb.updateValue);\n    }\n\n    // Reset color\n    fb.color = null;\n\n    // Bind callback or elements\n    if (typeof callback == 'function') {\n      fb.callback = callback;\n    }\n    else if (typeof callback == 'object' || typeof callback == 'string') {\n      fb.callback = $(callback);\n      fb.callback.bind('keyup', fb.updateValue);\n      if (fb.callback.get(0).value) {\n        fb.setColor(fb.callback.get(0).value);\n      }\n    }\n    return this;\n  };\n  fb.updateValue = function (event) {\n    if (this.value && this.value != fb.color) {\n      fb.setColor(this.value);\n    }\n  };\n\n  /**\n   * Change color with HTML syntax #123456\n   */\n  fb.setColor = function (color) {\n    var unpack = fb.unpack(color);\n    if (fb.color != color && unpack) {\n      fb.color = color;\n      fb.rgb = unpack;\n      fb.hsl = fb.RGBToHSL(fb.rgb);\n      fb.updateDisplay();\n    }\n    return this;\n  };\n\n  /**\n   * Change color with HSL triplet [0..1, 0..1, 0..1]\n   */\n  fb.setHSL = function (hsl) {\n    fb.hsl = hsl;\n    fb.rgb = fb.HSLToRGB(hsl);\n    fb.color = fb.pack(fb.rgb);\n    fb.updateDisplay();\n    return this;\n  };\n\n  /////////////////////////////////////////////////////\n\n  /**\n   * Retrieve the coordinates of the given event relative to the center\n   * of the widget.\n   */\n  fb.widgetCoords = function (event) {\n    var offset = $(fb.wheel).offset();\n    return { x: (event.pageX - offset.left) - fb.width / 2, y: (event.pageY - offset.top) - fb.width / 2 };\n  };\n\n  /**\n   * Mousedown handler\n   */\n  fb.mousedown = function (event) {\n    // Capture mouse\n    if (!document.dragging) {\n      $(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup);\n      document.dragging = true;\n    }\n\n    // Check which area is being dragged\n    var pos = fb.widgetCoords(event);\n    fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;\n\n    // Process\n    fb.mousemove(event);\n    return false;\n  };\n\n  /**\n   * Mousemove handler\n   */\n  fb.mousemove = function (event) {\n    // Get coordinates relative to color picker center\n    var pos = fb.widgetCoords(event);\n\n    // Set new HSL parameters\n    if (fb.circleDrag) {\n      var hue = Math.atan2(pos.x, -pos.y) / 6.28;\n      if (hue < 0) hue += 1;\n      fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);\n    }\n    else {\n      var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));\n      var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));\n      fb.setHSL([fb.hsl[0], sat, lum]);\n    }\n    return false;\n  };\n\n  /**\n   * Mouseup handler\n   */\n  fb.mouseup = function () {\n    // Uncapture mouse\n    $(document).unbind('mousemove', fb.mousemove);\n    $(document).unbind('mouseup', fb.mouseup);\n    document.dragging = false;\n  };\n\n  /**\n   * Update the markers and styles\n   */\n  fb.updateDisplay = function () {\n    // Markers\n    var angle = fb.hsl[0] * 6.28;\n    $('.h-marker', e).css({\n      left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',\n      top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'\n    });\n\n    $('.sl-marker', e).css({\n      left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',\n      top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'\n    });\n\n    // Saturation/Luminance gradient\n    $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));\n\n    // Linked elements or callback\n    if (typeof fb.callback == 'object') {\n      // Set background/foreground color\n      $(fb.callback).css({\n        backgroundColor: fb.color,\n        color: fb.hsl[2] > 0.5 ? '#000' : '#fff'\n      });\n\n      // Change linked value\n      $(fb.callback).each(function() {\n        if (this.value && this.value != fb.color) {\n          this.value = fb.color;\n        }\n      });\n    }\n    else if (typeof fb.callback == 'function') {\n      fb.callback.call(fb, fb.color);\n    }\n  };\n\n  /* Various color utility functions */\n  fb.pack = function (rgb) {\n    var r = Math.round(rgb[0] * 255);\n    var g = Math.round(rgb[1] * 255);\n    var b = Math.round(rgb[2] * 255);\n    return '#' + (r < 16 ? '0' : '') + r.toString(16) +\n           (g < 16 ? '0' : '') + g.toString(16) +\n           (b < 16 ? '0' : '') + b.toString(16);\n  };\n\n  fb.unpack = function (color) {\n    if (color.length == 7) {\n      return [parseInt('0x' + color.substring(1, 3)) / 255,\n        parseInt('0x' + color.substring(3, 5)) / 255,\n        parseInt('0x' + color.substring(5, 7)) / 255];\n    }\n    else if (color.length == 4) {\n      return [parseInt('0x' + color.substring(1, 2)) / 15,\n        parseInt('0x' + color.substring(2, 3)) / 15,\n        parseInt('0x' + color.substring(3, 4)) / 15];\n    }\n  };\n\n  fb.HSLToRGB = function (hsl) {\n    var m1, m2, r, g, b;\n    var h = hsl[0], s = hsl[1], l = hsl[2];\n    m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;\n    m1 = l * 2 - m2;\n    return [this.hueToRGB(m1, m2, h+0.33333),\n        this.hueToRGB(m1, m2, h),\n        this.hueToRGB(m1, m2, h-0.33333)];\n  };\n\n  fb.hueToRGB = function (m1, m2, h) {\n    h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);\n    if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n    if (h * 2 < 1) return m2;\n    if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;\n    return m1;\n  };\n\n  fb.RGBToHSL = function (rgb) {\n    var min, max, delta, h, s, l;\n    var r = rgb[0], g = rgb[1], b = rgb[2];\n    min = Math.min(r, Math.min(g, b));\n    max = Math.max(r, Math.max(g, b));\n    delta = max - min;\n    l = (min + max) / 2;\n    s = 0;\n    if (l > 0 && l < 1) {\n      s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));\n    }\n    h = 0;\n    if (delta > 0) {\n      if (max == r && max != g) h += (g - b) / delta;\n      if (max == g && max != b) h += (2 + (b - r) / delta);\n      if (max == b && max != r) h += (4 + (r - g) / delta);\n      h /= 6;\n    }\n    return [h, s, l];\n  };\n\n  // Install mousedown handler (the others are set on the document on-demand)\n  $('*', e).mousedown(fb.mousedown);\n\n    // Init color\n  fb.setColor('#000000');\n\n  // Set linked elements/callback\n  if (callback) {\n    fb.linkTo(callback);\n  }\n};\n\n})(jQuery);"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/gallery.js",
    "content": "/* global unescape, getUserSetting, setUserSetting */\n\njQuery(document).ready(function($) {\n\tvar gallerySortable, gallerySortableInit, sortIt, clearAll, w, desc = false;\n\n\tgallerySortableInit = function() {\n\t\tgallerySortable = $('#media-items').sortable( {\n\t\t\titems: 'div.media-item',\n\t\t\tplaceholder: 'sorthelper',\n\t\t\taxis: 'y',\n\t\t\tdistance: 2,\n\t\t\thandle: 'div.filename',\n\t\t\tstop: function() {\n\t\t\t\t// When an update has occurred, adjust the order for each item\n\t\t\t\tvar all = $('#media-items').sortable('toArray'), len = all.length;\n\t\t\t\t$.each(all, function(i, id) {\n\t\t\t\t\tvar order = desc ? (len - i) : (1 + i);\n\t\t\t\t\t$('#' + id + ' .menu_order input').val(order);\n\t\t\t\t});\n\t\t\t}\n\t\t} );\n\t};\n\n\tsortIt = function() {\n\t\tvar all = $('.menu_order_input'), len = all.length;\n\t\tall.each(function(i){\n\t\t\tvar order = desc ? (len - i) : (1 + i);\n\t\t\t$(this).val(order);\n\t\t});\n\t};\n\n\tclearAll = function(c) {\n\t\tc = c || 0;\n\t\t$('.menu_order_input').each( function() {\n\t\t\tif ( this.value === '0' || c ) {\n\t\t\t\tthis.value = '';\n\t\t\t}\n\t\t});\n\t};\n\n\t$('#asc').click( function( e ) {\n\t\te.preventDefault();\n\t\tdesc = false;\n\t\tsortIt();\n\t});\n\t$('#desc').click( function( e ) {\n\t\te.preventDefault();\n\t\tdesc = true;\n\t\tsortIt();\n\t});\n\t$('#clear').click( function( e ) {\n\t\te.preventDefault();\n\t\tclearAll(1);\n\t});\n\t$('#showall').click( function( e ) {\n\t\te.preventDefault();\n\t\t$('#sort-buttons span a').toggle();\n\t\t$('a.describe-toggle-on').hide();\n\t\t$('a.describe-toggle-off, table.slidetoggle').show();\n\t\t$('img.pinkynail').toggle(false);\n\t});\n\t$('#hideall').click( function( e ) {\n\t\te.preventDefault();\n\t\t$('#sort-buttons span a').toggle();\n\t\t$('a.describe-toggle-on').show();\n\t\t$('a.describe-toggle-off, table.slidetoggle').hide();\n\t\t$('img.pinkynail').toggle(true);\n\t});\n\n\t// initialize sortable\n\tgallerySortableInit();\n\tclearAll();\n\n\tif ( $('#media-items>*').length > 1 ) {\n\t\tw = wpgallery.getWin();\n\n\t\t$('#save-all, #gallery-settings').show();\n\t\tif ( typeof w.tinyMCE !== 'undefined' && w.tinyMCE.activeEditor && ! w.tinyMCE.activeEditor.isHidden() ) {\n\t\t\twpgallery.mcemode = true;\n\t\t\twpgallery.init();\n\t\t} else {\n\t\t\t$('#insert-gallery').show();\n\t\t}\n\t}\n});\n\njQuery(window).unload( function () { tinymce = tinyMCE = wpgallery = null; } ); // Cleanup\n\n/* gallery settings */\nvar tinymce = null, tinyMCE, wpgallery;\n\nwpgallery = {\n\tmcemode : false,\n\teditor : {},\n\tdom : {},\n\tis_update : false,\n\tel : {},\n\n\tI : function(e) {\n\t\treturn document.getElementById(e);\n\t},\n\n\tinit: function() {\n\t\tvar t = this, li, q, i, it, w = t.getWin();\n\n\t\tif ( ! t.mcemode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tli = ('' + document.location.search).replace(/^\\?/, '').split('&');\n\t\tq = {};\n\t\tfor (i=0; i<li.length; i++) {\n\t\t\tit = li[i].split('=');\n\t\t\tq[unescape(it[0])] = unescape(it[1]);\n\t\t}\n\n\t\tif ( q.mce_rdomain ) {\n\t\t\tdocument.domain = q.mce_rdomain;\n\t\t}\n\n\t\t// Find window & API\n\t\ttinymce = w.tinymce;\n\t\ttinyMCE = w.tinyMCE;\n\t\tt.editor = tinymce.EditorManager.activeEditor;\n\n\t\tt.setup();\n\t},\n\n\tgetWin : function() {\n\t\treturn window.dialogArguments || opener || parent || top;\n\t},\n\n\tsetup : function() {\n\t\tvar t = this, a, ed = t.editor, g, columns, link, order, orderby;\n\t\tif ( ! t.mcemode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tt.el = ed.selection.getNode();\n\n\t\tif ( t.el.nodeName !== 'IMG' || ! ed.dom.hasClass(t.el, 'wpGallery') ) {\n\t\t\tif ( ( g = ed.dom.select('img.wpGallery') ) && g[0] ) {\n\t\t\t\tt.el = g[0];\n\t\t\t} else {\n\t\t\t\tif ( getUserSetting('galfile') === '1' ) {\n\t\t\t\t\tt.I('linkto-file').checked = 'checked';\n\t\t\t\t}\n\t\t\t\tif ( getUserSetting('galdesc') === '1' ) {\n\t\t\t\t\tt.I('order-desc').checked = 'checked';\n\t\t\t\t}\n\t\t\t\tif ( getUserSetting('galcols') ) {\n\t\t\t\t\tt.I('columns').value = getUserSetting('galcols');\n\t\t\t\t}\n\t\t\t\tif ( getUserSetting('galord') ) {\n\t\t\t\t\tt.I('orderby').value = getUserSetting('galord');\n\t\t\t\t}\n\t\t\t\tjQuery('#insert-gallery').show();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\ta = ed.dom.getAttrib(t.el, 'title');\n\t\ta = ed.dom.decode(a);\n\n\t\tif ( a ) {\n\t\t\tjQuery('#update-gallery').show();\n\t\t\tt.is_update = true;\n\n\t\t\tcolumns = a.match(/columns=['\"]([0-9]+)['\"]/);\n\t\t\tlink = a.match(/link=['\"]([^'\"]+)['\"]/i);\n\t\t\torder = a.match(/order=['\"]([^'\"]+)['\"]/i);\n\t\t\torderby = a.match(/orderby=['\"]([^'\"]+)['\"]/i);\n\n\t\t\tif ( link && link[1] ) {\n\t\t\t\tt.I('linkto-file').checked = 'checked';\n\t\t\t}\n\t\t\tif ( order && order[1] ) {\n\t\t\t\tt.I('order-desc').checked = 'checked';\n\t\t\t}\n\t\t\tif ( columns && columns[1] ) {\n\t\t\t\tt.I('columns').value = '' + columns[1];\n\t\t\t}\n\t\t\tif ( orderby && orderby[1] ) {\n\t\t\t\tt.I('orderby').value = orderby[1];\n\t\t\t}\n\t\t} else {\n\t\t\tjQuery('#insert-gallery').show();\n\t\t}\n\t},\n\n\tupdate : function() {\n\t\tvar t = this, ed = t.editor, all = '', s;\n\n\t\tif ( ! t.mcemode || ! t.is_update ) {\n\t\t\ts = '[gallery' + t.getSettings() + ']';\n\t\t\tt.getWin().send_to_editor(s);\n\t\t\treturn;\n\t\t}\n\n\t\tif ( t.el.nodeName !== 'IMG' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tall = ed.dom.decode( ed.dom.getAttrib( t.el, 'title' ) );\n\t\tall = all.replace(/\\s*(order|link|columns|orderby)=['\"]([^'\"]+)['\"]/gi, '');\n\t\tall += t.getSettings();\n\n\t\ted.dom.setAttrib(t.el, 'title', all);\n\t\tt.getWin().tb_remove();\n\t},\n\n\tgetSettings : function() {\n\t\tvar I = this.I, s = '';\n\n\t\tif ( I('linkto-file').checked ) {\n\t\t\ts += ' link=\"file\"';\n\t\t\tsetUserSetting('galfile', '1');\n\t\t}\n\n\t\tif ( I('order-desc').checked ) {\n\t\t\ts += ' order=\"DESC\"';\n\t\t\tsetUserSetting('galdesc', '1');\n\t\t}\n\n\t\tif ( I('columns').value !== 3 ) {\n\t\t\ts += ' columns=\"' + I('columns').value + '\"';\n\t\t\tsetUserSetting('galcols', I('columns').value);\n\t\t}\n\n\t\tif ( I('orderby').value !== 'menu_order' ) {\n\t\t\ts += ' orderby=\"' + I('orderby').value + '\"';\n\t\t\tsetUserSetting('galord', I('orderby').value);\n\t\t}\n\n\t\treturn s;\n\t}\n};\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/image-edit.js",
    "content": "/* global imageEditL10n, ajaxurl, confirm */\n\n(function($) {\nvar imageEdit = window.imageEdit = {\n\tiasapi : {},\n\thold : {},\n\tpostid : '',\n\t_view : false,\n\n\tintval : function(f) {\n\t\treturn f | 0;\n\t},\n\n\tsetDisabled : function(el, s) {\n\t\tif ( s ) {\n\t\t\tel.removeClass('disabled');\n\t\t\t$('input', el).removeAttr('disabled');\n\t\t} else {\n\t\t\tel.addClass('disabled');\n\t\t\t$('input', el).prop('disabled', true);\n\t\t}\n\t},\n\n\tinit : function(postid) {\n\t\tvar t = this, old = $('#image-editor-' + t.postid),\n\t\t\tx = t.intval( $('#imgedit-x-' + postid).val() ),\n\t\t\ty = t.intval( $('#imgedit-y-' + postid).val() );\n\n\t\tif ( t.postid !== postid && old.length ) {\n\t\t\tt.close(t.postid);\n\t\t}\n\n\t\tt.hold.w = t.hold.ow = x;\n\t\tt.hold.h = t.hold.oh = y;\n\t\tt.hold.xy_ratio = x / y;\n\t\tt.hold.sizer = parseFloat( $('#imgedit-sizer-' + postid).val() );\n\t\tt.postid = postid;\n\t\t$('#imgedit-response-' + postid).empty();\n\n\t\t$('input[type=\"text\"]', '#imgedit-panel-' + postid).keypress(function(e) {\n\t\t\tvar k = e.keyCode;\n\n\t\t\tif ( 36 < k && k < 41 ) {\n\t\t\t\t$(this).blur();\n\t\t\t}\n\n\t\t\tif ( 13 === k ) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t},\n\n\ttoggleEditor : function(postid, toggle) {\n\t\tvar wait = $('#imgedit-wait-' + postid);\n\n\t\tif ( toggle ) {\n\t\t\twait.height( $('#imgedit-panel-' + postid).height() ).fadeIn('fast');\n\t\t} else {\n\t\t\twait.fadeOut('fast');\n\t\t}\n\t},\n\n\ttoggleHelp : function(el) {\n\t\t$( el ).parents( '.imgedit-group-top' ).toggleClass( 'imgedit-help-toggled' ).find( '.imgedit-help' ).slideToggle( 'fast' );\n\t\treturn false;\n\t},\n\n\tgetTarget : function(postid) {\n\t\treturn $('input[name=\"imgedit-target-' + postid + '\"]:checked', '#imgedit-save-target-' + postid).val() || 'full';\n\t},\n\n\tscaleChanged : function(postid, x) {\n\t\tvar w = $('#imgedit-scale-width-' + postid), h = $('#imgedit-scale-height-' + postid),\n\t\twarn = $('#imgedit-scale-warn-' + postid), w1 = '', h1 = '';\n\n\t\tif ( x ) {\n\t\t\th1 = ( w.val() !== '' ) ? Math.round( w.val() / this.hold.xy_ratio ) : '';\n\t\t\th.val( h1 );\n\t\t} else {\n\t\t\tw1 = ( h.val() !== '' ) ? Math.round( h.val() * this.hold.xy_ratio ) : '';\n\t\t\tw.val( w1 );\n\t\t}\n\n\t\tif ( ( h1 && h1 > this.hold.oh ) || ( w1 && w1 > this.hold.ow ) ) {\n\t\t\twarn.css('visibility', 'visible');\n\t\t} else {\n\t\t\twarn.css('visibility', 'hidden');\n\t\t}\n\t},\n\n\tgetSelRatio : function(postid) {\n\t\tvar x = this.hold.w, y = this.hold.h,\n\t\t\tX = this.intval( $('#imgedit-crop-width-' + postid).val() ),\n\t\t\tY = this.intval( $('#imgedit-crop-height-' + postid).val() );\n\n\t\tif ( X && Y ) {\n\t\t\treturn X + ':' + Y;\n\t\t}\n\n\t\tif ( x && y ) {\n\t\t\treturn x + ':' + y;\n\t\t}\n\n\t\treturn '1:1';\n\t},\n\n\tfilterHistory : function(postid, setSize) {\n\t\t// apply undo state to history\n\t\tvar history = $('#imgedit-history-' + postid).val(), pop, n, o, i, op = [];\n\n\t\tif ( history !== '' ) {\n\t\t\thistory = JSON.parse(history);\n\t\t\tpop = this.intval( $('#imgedit-undone-' + postid).val() );\n\t\t\tif ( pop > 0 ) {\n\t\t\t\twhile ( pop > 0 ) {\n\t\t\t\t\thistory.pop();\n\t\t\t\t\tpop--;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( setSize ) {\n\t\t\t\tif ( !history.length ) {\n\t\t\t\t\tthis.hold.w = this.hold.ow;\n\t\t\t\t\tthis.hold.h = this.hold.oh;\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\n\t\t\t\t// restore\n\t\t\t\to = history[history.length - 1];\n\t\t\t\to = o.c || o.r || o.f || false;\n\n\t\t\t\tif ( o ) {\n\t\t\t\t\tthis.hold.w = o.fw;\n\t\t\t\t\tthis.hold.h = o.fh;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// filter the values\n\t\t\tfor ( n in history ) {\n\t\t\t\ti = history[n];\n\t\t\t\tif ( i.hasOwnProperty('c') ) {\n\t\t\t\t\top[n] = { 'c': { 'x': i.c.x, 'y': i.c.y, 'w': i.c.w, 'h': i.c.h } };\n\t\t\t\t} else if ( i.hasOwnProperty('r') ) {\n\t\t\t\t\top[n] = { 'r': i.r.r };\n\t\t\t\t} else if ( i.hasOwnProperty('f') ) {\n\t\t\t\t\top[n] = { 'f': i.f.f };\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn JSON.stringify(op);\n\t\t}\n\t\treturn '';\n\t},\n\n\trefreshEditor : function(postid, nonce, callback) {\n\t\tvar t = this, data, img;\n\n\t\tt.toggleEditor(postid, 1);\n\t\tdata = {\n\t\t\t'action': 'imgedit-preview',\n\t\t\t'_ajax_nonce': nonce,\n\t\t\t'postid': postid,\n\t\t\t'history': t.filterHistory(postid, 1),\n\t\t\t'rand': t.intval(Math.random() * 1000000)\n\t\t};\n\n\t\timg = $( '<img id=\"image-preview-' + postid + '\" alt=\"\" />' )\n\t\t\t.on('load', function() {\n\t\t\t\tvar max1, max2, parent = $('#imgedit-crop-' + postid), t = imageEdit;\n\n\t\t\t\tparent.empty().append(img);\n\n\t\t\t\t// w, h are the new full size dims\n\t\t\t\tmax1 = Math.max( t.hold.w, t.hold.h );\n\t\t\t\tmax2 = Math.max( $(img).width(), $(img).height() );\n\t\t\t\tt.hold.sizer = max1 > max2 ? max2 / max1 : 1;\n\n\t\t\t\tt.initCrop(postid, img, parent);\n\t\t\t\tt.setCropSelection(postid, 0);\n\n\t\t\t\tif ( (typeof callback !== 'undefined') && callback !== null ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\n\t\t\t\tif ( $('#imgedit-history-' + postid).val() && $('#imgedit-undone-' + postid).val() === '0' ) {\n\t\t\t\t\t$('input.imgedit-submit-btn', '#imgedit-panel-' + postid).removeAttr('disabled');\n\t\t\t\t} else {\n\t\t\t\t\t$('input.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', true);\n\t\t\t\t}\n\n\t\t\t\tt.toggleEditor(postid, 0);\n\t\t\t})\n\t\t\t.on('error', function() {\n\t\t\t\t$('#imgedit-crop-' + postid).empty().append('<div class=\"error\"><p>' + imageEditL10n.error + '</p></div>');\n\t\t\t\tt.toggleEditor(postid, 0);\n\t\t\t})\n\t\t\t.attr('src', ajaxurl + '?' + $.param(data));\n\t},\n\n\taction : function(postid, nonce, action) {\n\t\tvar t = this, data, w, h, fw, fh;\n\n\t\tif ( t.notsaved(postid) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tdata = {\n\t\t\t'action': 'image-editor',\n\t\t\t'_ajax_nonce': nonce,\n\t\t\t'postid': postid\n\t\t};\n\n\t\tif ( 'scale' === action ) {\n\t\t\tw = $('#imgedit-scale-width-' + postid),\n\t\t\th = $('#imgedit-scale-height-' + postid),\n\t\t\tfw = t.intval(w.val()),\n\t\t\tfh = t.intval(h.val());\n\n\t\t\tif ( fw < 1 ) {\n\t\t\t\tw.focus();\n\t\t\t\treturn false;\n\t\t\t} else if ( fh < 1 ) {\n\t\t\t\th.focus();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( fw === t.hold.ow || fh === t.hold.oh ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tdata['do'] = 'scale';\n\t\t\tdata.fwidth = fw;\n\t\t\tdata.fheight = fh;\n\t\t} else if ( 'restore' === action ) {\n\t\t\tdata['do'] = 'restore';\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\n\t\tt.toggleEditor(postid, 1);\n\t\t$.post(ajaxurl, data, function(r) {\n\t\t\t$('#image-editor-' + postid).empty().append(r);\n\t\t\tt.toggleEditor(postid, 0);\n\t\t\t// refresh the attachment model so that changes propagate\n\t\t\tif ( t._view ) {\n\t\t\t\tt._view.refresh();\n\t\t\t}\n\t\t});\n\t},\n\n\tsave : function(postid, nonce) {\n\t\tvar data,\n\t\t\ttarget = this.getTarget(postid),\n\t\t\thistory = this.filterHistory(postid, 0),\n\t\t\tself = this;\n\n\t\tif ( '' === history ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.toggleEditor(postid, 1);\n\t\tdata = {\n\t\t\t'action': 'image-editor',\n\t\t\t'_ajax_nonce': nonce,\n\t\t\t'postid': postid,\n\t\t\t'history': history,\n\t\t\t'target': target,\n\t\t\t'context': $('#image-edit-context').length ? $('#image-edit-context').val() : null,\n\t\t\t'do': 'save'\n\t\t};\n\n\t\t$.post(ajaxurl, data, function(r) {\n\t\t\tvar ret = JSON.parse(r);\n\n\t\t\tif ( ret.error ) {\n\t\t\t\t$('#imgedit-response-' + postid).html('<div class=\"error\"><p>' + ret.error + '</p></div>');\n\t\t\t\timageEdit.close(postid);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ret.fw && ret.fh ) {\n\t\t\t\t$('#media-dims-' + postid).html( ret.fw + ' &times; ' + ret.fh );\n\t\t\t}\n\n\t\t\tif ( ret.thumbnail ) {\n\t\t\t\t$('.thumbnail', '#thumbnail-head-' + postid).attr('src', ''+ret.thumbnail);\n\t\t\t}\n\n\t\t\tif ( ret.msg ) {\n\t\t\t\t$('#imgedit-response-' + postid).html('<div class=\"updated\"><p>' + ret.msg + '</p></div>');\n\t\t\t}\n\n\t\t\tif ( self._view ) {\n\t\t\t\tself._view.save();\n\t\t\t} else {\n\t\t\t\timageEdit.close(postid);\n\t\t\t}\n\t\t});\n\t},\n\n\topen : function( postid, nonce, view ) {\n\t\tthis._view = view;\n\n\t\tvar dfd, data, elem = $('#image-editor-' + postid), head = $('#media-head-' + postid),\n\t\t\tbtn = $('#imgedit-open-btn-' + postid), spin = btn.siblings('.spinner');\n\n\t\tbtn.prop('disabled', true);\n\t\tspin.addClass( 'is-active' );\n\n\t\tdata = {\n\t\t\t'action': 'image-editor',\n\t\t\t'_ajax_nonce': nonce,\n\t\t\t'postid': postid,\n\t\t\t'do': 'open'\n\t\t};\n\n\t\tdfd = $.ajax({\n\t\t\turl:  ajaxurl,\n\t\t\ttype: 'post',\n\t\t\tdata: data\n\t\t}).done(function( html ) {\n\t\t\telem.html( html );\n\t\t\thead.fadeOut('fast', function(){\n\t\t\t\telem.fadeIn('fast');\n\t\t\t\tbtn.removeAttr('disabled');\n\t\t\t\tspin.removeClass( 'is-active' );\n\t\t\t});\n\t\t});\n\n\t\treturn dfd;\n\t},\n\n\timgLoaded : function(postid) {\n\t\tvar img = $('#image-preview-' + postid), parent = $('#imgedit-crop-' + postid);\n\n\t\tthis.initCrop(postid, img, parent);\n\t\tthis.setCropSelection(postid, 0);\n\t\tthis.toggleEditor(postid, 0);\n\t},\n\n\tinitCrop : function(postid, image, parent) {\n\t\tvar t = this,\n\t\t\tselW = $('#imgedit-sel-width-' + postid),\n\t\t\tselH = $('#imgedit-sel-height-' + postid),\n\t\t\t$img;\n\n\t\tt.iasapi = $(image).imgAreaSelect({\n\t\t\tparent: parent,\n\t\t\tinstance: true,\n\t\t\thandles: true,\n\t\t\tkeys: true,\n\t\t\tminWidth: 3,\n\t\t\tminHeight: 3,\n\n\t\t\tonInit: function( img ) {\n\t\t\t\t// Ensure that the imgareaselect wrapper elements are position:absolute\n\t\t\t\t// (even if we're in a position:fixed modal)\n\t\t\t\t$img = $( img );\n\t\t\t\t$img.next().css( 'position', 'absolute' )\n\t\t\t\t\t.nextAll( '.imgareaselect-outer' ).css( 'position', 'absolute' );\n\n\t\t\t\tparent.children().mousedown(function(e){\n\t\t\t\t\tvar ratio = false, sel, defRatio;\n\n\t\t\t\t\tif ( e.shiftKey ) {\n\t\t\t\t\t\tsel = t.iasapi.getSelection();\n\t\t\t\t\t\tdefRatio = t.getSelRatio(postid);\n\t\t\t\t\t\tratio = ( sel && sel.width && sel.height ) ? sel.width + ':' + sel.height : defRatio;\n\t\t\t\t\t}\n\n\t\t\t\t\tt.iasapi.setOptions({\n\t\t\t\t\t\taspectRatio: ratio\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tonSelectStart: function() {\n\t\t\t\timageEdit.setDisabled($('#imgedit-crop-sel-' + postid), 1);\n\t\t\t},\n\n\t\t\tonSelectEnd: function(img, c) {\n\t\t\t\timageEdit.setCropSelection(postid, c);\n\t\t\t},\n\n\t\t\tonSelectChange: function(img, c) {\n\t\t\t\tvar sizer = imageEdit.hold.sizer;\n\t\t\t\tselW.val( imageEdit.round(c.width / sizer) );\n\t\t\t\tselH.val( imageEdit.round(c.height / sizer) );\n\t\t\t}\n\t\t});\n\t},\n\n\tsetCropSelection : function(postid, c) {\n\t\tvar sel;\n\n\t\tc = c || 0;\n\n\t\tif ( !c || ( c.width < 3 && c.height < 3 ) ) {\n\t\t\tthis.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 0);\n\t\t\tthis.setDisabled($('#imgedit-crop-sel-' + postid), 0);\n\t\t\t$('#imgedit-sel-width-' + postid).val('');\n\t\t\t$('#imgedit-sel-height-' + postid).val('');\n\t\t\t$('#imgedit-selection-' + postid).val('');\n\t\t\treturn false;\n\t\t}\n\n\t\tsel = { 'x': c.x1, 'y': c.y1, 'w': c.width, 'h': c.height };\n\t\tthis.setDisabled($('.imgedit-crop', '#imgedit-panel-' + postid), 1);\n\t\t$('#imgedit-selection-' + postid).val( JSON.stringify(sel) );\n\t},\n\n\tclose : function(postid, warn) {\n\t\twarn = warn || false;\n\n\t\tif ( warn && this.notsaved(postid) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.iasapi = {};\n\t\tthis.hold = {};\n\n\t\t// If we've loaded the editor in the context of a Media Modal, then switch to the previous view,\n\t\t// whatever that might have been.\n\t\tif ( this._view ){\n\t\t\tthis._view.back();\n\t\t}\n\n\t\t// In case we are not accessing the image editor in the context of a View, close the editor the old-skool way\n\t\telse {\n\t\t\t$('#image-editor-' + postid).fadeOut('fast', function() {\n\t\t\t\t$('#media-head-' + postid).fadeIn('fast');\n\t\t\t\t$(this).empty();\n\t\t\t});\n\t\t}\n\n\n\t},\n\n\tnotsaved : function(postid) {\n\t\tvar h = $('#imgedit-history-' + postid).val(),\n\t\t\thistory = ( h !== '' ) ? JSON.parse(h) : [],\n\t\t\tpop = this.intval( $('#imgedit-undone-' + postid).val() );\n\n\t\tif ( pop < history.length ) {\n\t\t\tif ( confirm( $('#imgedit-leaving-' + postid).html() ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\taddStep : function(op, postid, nonce) {\n\t\tvar t = this, elem = $('#imgedit-history-' + postid),\n\t\thistory = ( elem.val() !== '' ) ? JSON.parse( elem.val() ) : [],\n\t\tundone = $('#imgedit-undone-' + postid),\n\t\tpop = t.intval(undone.val());\n\n\t\twhile ( pop > 0 ) {\n\t\t\thistory.pop();\n\t\t\tpop--;\n\t\t}\n\t\tundone.val(0); // reset\n\n\t\thistory.push(op);\n\t\telem.val( JSON.stringify(history) );\n\n\t\tt.refreshEditor(postid, nonce, function() {\n\t\t\tt.setDisabled($('#image-undo-' + postid), true);\n\t\t\tt.setDisabled($('#image-redo-' + postid), false);\n\t\t});\n\t},\n\n\trotate : function(angle, postid, nonce, t) {\n\t\tif ( $(t).hasClass('disabled') ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.addStep({ 'r': { 'r': angle, 'fw': this.hold.h, 'fh': this.hold.w }}, postid, nonce);\n\t},\n\n\tflip : function (axis, postid, nonce, t) {\n\t\tif ( $(t).hasClass('disabled') ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.addStep({ 'f': { 'f': axis, 'fw': this.hold.w, 'fh': this.hold.h }}, postid, nonce);\n\t},\n\n\tcrop : function (postid, nonce, t) {\n\t\tvar sel = $('#imgedit-selection-' + postid).val(),\n\t\t\tw = this.intval( $('#imgedit-sel-width-' + postid).val() ),\n\t\t\th = this.intval( $('#imgedit-sel-height-' + postid).val() );\n\n\t\tif ( $(t).hasClass('disabled') || sel === '' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tsel = JSON.parse(sel);\n\t\tif ( sel.w > 0 && sel.h > 0 && w > 0 && h > 0 ) {\n\t\t\tsel.fw = w;\n\t\t\tsel.fh = h;\n\t\t\tthis.addStep({ 'c': sel }, postid, nonce);\n\t\t}\n\t},\n\n\tundo : function (postid, nonce) {\n\t\tvar t = this, button = $('#image-undo-' + postid), elem = $('#imgedit-undone-' + postid),\n\t\t\tpop = t.intval( elem.val() ) + 1;\n\n\t\tif ( button.hasClass('disabled') ) {\n\t\t\treturn;\n\t\t}\n\n\t\telem.val(pop);\n\t\tt.refreshEditor(postid, nonce, function() {\n\t\t\tvar elem = $('#imgedit-history-' + postid),\n\t\t\thistory = ( elem.val() !== '' ) ? JSON.parse( elem.val() ) : [];\n\n\t\t\tt.setDisabled($('#image-redo-' + postid), true);\n\t\t\tt.setDisabled(button, pop < history.length);\n\t\t});\n\t},\n\n\tredo : function(postid, nonce) {\n\t\tvar t = this, button = $('#image-redo-' + postid), elem = $('#imgedit-undone-' + postid),\n\t\t\tpop = t.intval( elem.val() ) - 1;\n\n\t\tif ( button.hasClass('disabled') ) {\n\t\t\treturn;\n\t\t}\n\n\t\telem.val(pop);\n\t\tt.refreshEditor(postid, nonce, function() {\n\t\t\tt.setDisabled($('#image-undo-' + postid), true);\n\t\t\tt.setDisabled(button, pop > 0);\n\t\t});\n\t},\n\n\tsetNumSelection : function(postid) {\n\t\tvar sel, elX = $('#imgedit-sel-width-' + postid), elY = $('#imgedit-sel-height-' + postid),\n\t\t\tx = this.intval( elX.val() ), y = this.intval( elY.val() ),\n\t\t\timg = $('#image-preview-' + postid), imgh = img.height(), imgw = img.width(),\n\t\t\tsizer = this.hold.sizer, x1, y1, x2, y2, ias = this.iasapi;\n\n\t\tif ( x < 1 ) {\n\t\t\telX.val('');\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( y < 1 ) {\n\t\t\telY.val('');\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( x && y && ( sel = ias.getSelection() ) ) {\n\t\t\tx2 = sel.x1 + Math.round( x * sizer );\n\t\t\ty2 = sel.y1 + Math.round( y * sizer );\n\t\t\tx1 = sel.x1;\n\t\t\ty1 = sel.y1;\n\n\t\t\tif ( x2 > imgw ) {\n\t\t\t\tx1 = 0;\n\t\t\t\tx2 = imgw;\n\t\t\t\telX.val( Math.round( x2 / sizer ) );\n\t\t\t}\n\n\t\t\tif ( y2 > imgh ) {\n\t\t\t\ty1 = 0;\n\t\t\t\ty2 = imgh;\n\t\t\t\telY.val( Math.round( y2 / sizer ) );\n\t\t\t}\n\n\t\t\tias.setSelection( x1, y1, x2, y2 );\n\t\t\tias.update();\n\t\t\tthis.setCropSelection(postid, ias.getSelection());\n\t\t}\n\t},\n\n\tround : function(num) {\n\t\tvar s;\n\t\tnum = Math.round(num);\n\n\t\tif ( this.hold.sizer > 0.6 ) {\n\t\t\treturn num;\n\t\t}\n\n\t\ts = num.toString().slice(-1);\n\n\t\tif ( '1' === s ) {\n\t\t\treturn num - 1;\n\t\t} else if ( '9' === s ) {\n\t\t\treturn num + 1;\n\t\t}\n\n\t\treturn num;\n\t},\n\n\tsetRatioSelection : function(postid, n, el) {\n\t\tvar sel, r, x = this.intval( $('#imgedit-crop-width-' + postid).val() ),\n\t\t\ty = this.intval( $('#imgedit-crop-height-' + postid).val() ),\n\t\t\th = $('#image-preview-' + postid).height();\n\n\t\tif ( !this.intval( $(el).val() ) ) {\n\t\t\t$(el).val('');\n\t\t\treturn;\n\t\t}\n\n\t\tif ( x && y ) {\n\t\t\tthis.iasapi.setOptions({\n\t\t\t\taspectRatio: x + ':' + y\n\t\t\t});\n\n\t\t\tif ( sel = this.iasapi.getSelection(true) ) {\n\t\t\t\tr = Math.ceil( sel.y1 + ( ( sel.x2 - sel.x1 ) / ( x / y ) ) );\n\n\t\t\t\tif ( r > h ) {\n\t\t\t\t\tr = h;\n\t\t\t\t\tif ( n ) {\n\t\t\t\t\t\t$('#imgedit-crop-height-' + postid).val('');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$('#imgedit-crop-width-' + postid).val('');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.iasapi.setSelection( sel.x1, sel.y1, sel.x2, r );\n\t\t\t\tthis.iasapi.update();\n\t\t\t}\n\t\t}\n\t}\n};\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/inline-edit-post.js",
    "content": "/* global inlineEditL10n, ajaxurl, typenow */\n\nvar inlineEditPost;\n(function($) {\ninlineEditPost = {\n\n\tinit : function(){\n\t\tvar t = this, qeRow = $('#inline-edit'), bulkRow = $('#bulk-edit');\n\n\t\tt.type = $('table.widefat').hasClass('pages') ? 'page' : 'post';\n\t\tt.what = '#post-';\n\n\t\t// prepare the edit rows\n\t\tqeRow.keyup(function(e){\n\t\t\tif ( e.which === 27 ) {\n\t\t\t\treturn inlineEditPost.revert();\n\t\t\t}\n\t\t});\n\t\tbulkRow.keyup(function(e){\n\t\t\tif ( e.which === 27 ) {\n\t\t\t\treturn inlineEditPost.revert();\n\t\t\t}\n\t\t});\n\n\t\t$( '.cancel', qeRow ).click( function() {\n\t\t\treturn inlineEditPost.revert();\n\t\t});\n\t\t$( '.save', qeRow ).click( function() {\n\t\t\treturn inlineEditPost.save(this);\n\t\t});\n\t\t$('td', qeRow).keydown(function(e){\n\t\t\tif ( e.which === 13 && ! $( e.target ).hasClass( 'cancel' ) ) {\n\t\t\t\treturn inlineEditPost.save(this);\n\t\t\t}\n\t\t});\n\n\t\t$( '.cancel', bulkRow ).click( function() {\n\t\t\treturn inlineEditPost.revert();\n\t\t});\n\n\t\t$('#inline-edit .inline-edit-private input[value=\"private\"]').click( function(){\n\t\t\tvar pw = $('input.inline-edit-password-input');\n\t\t\tif ( $(this).prop('checked') ) {\n\t\t\t\tpw.val('').prop('disabled', true);\n\t\t\t} else {\n\t\t\t\tpw.prop('disabled', false);\n\t\t\t}\n\t\t});\n\n\t\t// add events\n\t\t$('#the-list').on( 'click', 'a.editinline', function( e ) {\n\t\t\te.preventDefault();\n\t\t\tinlineEditPost.edit(this);\n\t\t});\n\n\t\t$('#bulk-edit').find('fieldset:first').after(\n\t\t\t$('#inline-edit fieldset.inline-edit-categories').clone()\n\t\t).siblings( 'fieldset:last' ).prepend(\n\t\t\t$('#inline-edit label.inline-edit-tags').clone()\n\t\t);\n\n\t\t$('select[name=\"_status\"] option[value=\"future\"]', bulkRow).remove();\n\n\t\t$('#doaction, #doaction2').click(function(e){\n\t\t\tvar n = $(this).attr('id').substr(2);\n\t\t\tif ( 'edit' === $( 'select[name=\"' + n + '\"]' ).val() ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tt.setBulk();\n\t\t\t} else if ( $('form#posts-filter tr.inline-editor').length > 0 ) {\n\t\t\t\tt.revert();\n\t\t\t}\n\t\t});\n\t},\n\n\ttoggle : function(el){\n\t\tvar t = this;\n\t\t$( t.what + t.getId( el ) ).css( 'display' ) === 'none' ? t.revert() : t.edit( el );\n\t},\n\n\tsetBulk : function(){\n\t\tvar te = '', type = this.type, tax, c = true;\n\t\tthis.revert();\n\n\t\t$( '#bulk-edit td' ).attr( 'colspan', $( 'th:visible, td:visible', '.widefat:first thead' ).length );\n\t\t// Insert the editor at the top of the table with an empty row above to maintain zebra striping.\n\t\t$('table.widefat tbody').prepend( $('#bulk-edit') ).prepend('<tr class=\"hidden\"></tr>');\n\t\t$('#bulk-edit').addClass('inline-editor').show();\n\n\t\t$( 'tbody th.check-column input[type=\"checkbox\"]' ).each( function() {\n\t\t\tif ( $(this).prop('checked') ) {\n\t\t\t\tc = false;\n\t\t\t\tvar id = $(this).val(), theTitle;\n\t\t\t\ttheTitle = $('#inline_'+id+' .post_title').html() || inlineEditL10n.notitle;\n\t\t\t\tte += '<div id=\"ttle'+id+'\"><a id=\"_'+id+'\" class=\"ntdelbutton\" title=\"'+inlineEditL10n.ntdeltitle+'\">X</a>'+theTitle+'</div>';\n\t\t\t}\n\t\t});\n\n\t\tif ( c ) {\n\t\t\treturn this.revert();\n\t\t}\n\n\t\t$('#bulk-titles').html(te);\n\t\t$('#bulk-titles a').click(function(){\n\t\t\tvar id = $(this).attr('id').substr(1);\n\n\t\t\t$('table.widefat input[value=\"' + id + '\"]').prop('checked', false);\n\t\t\t$('#ttle'+id).remove();\n\t\t});\n\n\t\t// enable autocomplete for tags\n\t\tif ( 'post' === type ) {\n\t\t\t// support multi taxonomies?\n\t\t\ttax = 'post_tag';\n\t\t\t$('tr.inline-editor textarea[name=\"tax_input['+tax+']\"]').suggest( ajaxurl + '?action=ajax-tag-search&tax=' + tax, { delay: 500, minchars: 2, multiple: true, multipleSep: inlineEditL10n.comma } );\n\t\t}\n\t\t$('html, body').animate( { scrollTop: 0 }, 'fast' );\n\t},\n\n\tedit : function(id) {\n\t\tvar t = this, fields, editRow, rowData, status, pageOpt, pageLevel, nextPage, pageLoop = true, nextLevel, cur_format, f, val, pw;\n\t\tt.revert();\n\n\t\tif ( typeof(id) === 'object' ) {\n\t\t\tid = t.getId(id);\n\t\t}\n\n\t\tfields = ['post_title', 'post_name', 'post_author', '_status', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_password', 'post_format', 'menu_order'];\n\t\tif ( t.type === 'page' ) {\n\t\t\tfields.push('post_parent', 'page_template');\n\t\t}\n\n\t\t// add the new edit row with an extra blank row underneath to maintain zebra striping.\n\t\teditRow = $('#inline-edit').clone(true);\n\t\t$( 'td', editRow ).attr( 'colspan', $( 'th:visible, td:visible', '.widefat:first thead' ).length );\n\n\t\t$(t.what+id).removeClass('is-expanded').hide().after(editRow).after('<tr class=\"hidden\"></tr>');\n\n\t\t// populate the data\n\t\trowData = $('#inline_'+id);\n\t\tif ( !$(':input[name=\"post_author\"] option[value=\"' + $('.post_author', rowData).text() + '\"]', editRow).val() ) {\n\t\t\t// author no longer has edit caps, so we need to add them to the list of authors\n\t\t\t$(':input[name=\"post_author\"]', editRow).prepend('<option value=\"' + $('.post_author', rowData).text() + '\">' + $('#' + t.type + '-' + id + ' .author').text() + '</option>');\n\t\t}\n\t\tif ( $( ':input[name=\"post_author\"] option', editRow ).length === 1 ) {\n\t\t\t$('label.inline-edit-author', editRow).hide();\n\t\t}\n\n\t\t// hide unsupported formats, but leave the current format alone\n\t\tcur_format = $('.post_format', rowData).text();\n\t\t$('option.unsupported', editRow).each(function() {\n\t\t\tvar $this = $(this);\n\t\t\tif ( $this.val() !== cur_format ) {\n\t\t\t\t$this.remove();\n\t\t\t}\n\t\t});\n\n\t\tfor ( f = 0; f < fields.length; f++ ) {\n\t\t\tval = $('.'+fields[f], rowData);\n\t\t\t// Deal with Twemoji\n\t\t\tval.find( 'img' ).replaceWith( function() { return this.alt; } );\n\t\t\tval = val.text();\n\t\t\t$(':input[name=\"' + fields[f] + '\"]', editRow).val( val );\n\t\t}\n\n\t\tif ( $( '.comment_status', rowData ).text() === 'open' ) {\n\t\t\t$( 'input[name=\"comment_status\"]', editRow ).prop( 'checked', true );\n\t\t}\n\t\tif ( $( '.ping_status', rowData ).text() === 'open' ) {\n\t\t\t$( 'input[name=\"ping_status\"]', editRow ).prop( 'checked', true );\n\t\t}\n\t\tif ( $( '.sticky', rowData ).text() === 'sticky' ) {\n\t\t\t$( 'input[name=\"sticky\"]', editRow ).prop( 'checked', true );\n\t\t}\n\n\t\t// hierarchical taxonomies\n\t\t$('.post_category', rowData).each(function(){\n\t\t\tvar taxname,\n\t\t\t\tterm_ids = $(this).text();\n\n\t\t\tif ( term_ids ) {\n\t\t\t\ttaxname = $(this).attr('id').replace('_'+id, '');\n\t\t\t\t$('ul.'+taxname+'-checklist :checkbox', editRow).val(term_ids.split(','));\n\t\t\t}\n\t\t});\n\n\t\t//flat taxonomies\n\t\t$('.tags_input', rowData).each(function(){\n\t\t\tvar terms = $(this),\n\t\t\t\ttaxname = $(this).attr('id').replace('_' + id, ''),\n\t\t\t\ttextarea = $('textarea.tax_input_' + taxname, editRow),\n\t\t\t\tcomma = inlineEditL10n.comma;\n\n\t\t\tterms.find( 'img' ).replaceWith( function() { return this.alt; } );\n\t\t\tterms = terms.text();\n\n\t\t\tif ( terms ) {\n\t\t\t\tif ( ',' !== comma ) {\n\t\t\t\t\tterms = terms.replace(/,/g, comma);\n\t\t\t\t}\n\t\t\t\ttextarea.val(terms);\n\t\t\t}\n\n\t\t\ttextarea.suggest( ajaxurl + '?action=ajax-tag-search&tax=' + taxname, { delay: 500, minchars: 2, multiple: true, multipleSep: inlineEditL10n.comma } );\n\t\t});\n\n\t\t// handle the post status\n\t\tstatus = $('._status', rowData).text();\n\t\tif ( 'future' !== status ) {\n\t\t\t$('select[name=\"_status\"] option[value=\"future\"]', editRow).remove();\n\t\t}\n\n\t\tpw = $( '.inline-edit-password-input' ).prop( 'disabled', false );\n\t\tif ( 'private' === status ) {\n\t\t\t$('input[name=\"keep_private\"]', editRow).prop('checked', true);\n\t\t\tpw.val( '' ).prop( 'disabled', true );\n\t\t}\n\n\t\t// remove the current page and children from the parent dropdown\n\t\tpageOpt = $('select[name=\"post_parent\"] option[value=\"' + id + '\"]', editRow);\n\t\tif ( pageOpt.length > 0 ) {\n\t\t\tpageLevel = pageOpt[0].className.split('-')[1];\n\t\t\tnextPage = pageOpt;\n\t\t\twhile ( pageLoop ) {\n\t\t\t\tnextPage = nextPage.next('option');\n\t\t\t\tif ( nextPage.length === 0 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tnextLevel = nextPage[0].className.split('-')[1];\n\n\t\t\t\tif ( nextLevel <= pageLevel ) {\n\t\t\t\t\tpageLoop = false;\n\t\t\t\t} else {\n\t\t\t\t\tnextPage.remove();\n\t\t\t\t\tnextPage = pageOpt;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpageOpt.remove();\n\t\t}\n\n\t\t$(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show();\n\t\t$('.ptitle', editRow).focus();\n\n\t\treturn false;\n\t},\n\n\tsave : function(id) {\n\t\tvar params, fields, page = $('.post_status_page').val() || '';\n\n\t\tif ( typeof(id) === 'object' ) {\n\t\t\tid = this.getId(id);\n\t\t}\n\n\t\t$( 'table.widefat .spinner' ).addClass( 'is-active' );\n\n\t\tparams = {\n\t\t\taction: 'inline-save',\n\t\t\tpost_type: typenow,\n\t\t\tpost_ID: id,\n\t\t\tedit_date: 'true',\n\t\t\tpost_status: page\n\t\t};\n\n\t\tfields = $('#edit-'+id).find(':input').serialize();\n\t\tparams = fields + '&' + $.param(params);\n\n\t\t// make ajax request\n\t\t$.post( ajaxurl, params,\n\t\t\tfunction(r) {\n\t\t\t\t$( 'table.widefat .spinner' ).removeClass( 'is-active' );\n\t\t\t\t$( '.ac_results' ).hide();\n\n\t\t\t\tif (r) {\n\t\t\t\t\tif ( -1 !== r.indexOf( '<tr' ) ) {\n\t\t\t\t\t\t$(inlineEditPost.what+id).siblings('tr.hidden').addBack().remove();\n\t\t\t\t\t\t$('#edit-'+id).before(r).remove();\n\t\t\t\t\t\t$(inlineEditPost.what+id).hide().fadeIn();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tr = r.replace( /<.[^<>]*?>/g, '' );\n\t\t\t\t\t\t$('#edit-'+id+' .inline-edit-save .error').html(r).show();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$('#edit-'+id+' .inline-edit-save .error').html(inlineEditL10n.error).show();\n\t\t\t\t}\n\t\t\t},\n\t\t'html');\n\t\treturn false;\n\t},\n\n\trevert : function(){\n\t\tvar $tableWideFat = $( '.widefat' ),\n\t\t\tid = $( '.inline-editor', $tableWideFat ).attr( 'id' );\n\n\t\tif ( id ) {\n\t\t\t$( '.spinner', $tableWideFat ).removeClass( 'is-active' );\n\t\t\t$( '.ac_results' ).hide();\n\n\t\t\tif ( 'bulk-edit' === id ) {\n\t\t\t\t$( '#bulk-edit', $tableWideFat ).removeClass( 'inline-editor' ).hide().siblings( '.hidden' ).remove();\n\t\t\t\t$('#bulk-titles').empty();\n\t\t\t\t$('#inlineedit').append( $('#bulk-edit') );\n\t\t\t} else {\n\t\t\t\t$('#'+id).siblings('tr.hidden').addBack().remove();\n\t\t\t\tid = id.substr( id.lastIndexOf('-') + 1 );\n\t\t\t\t$(this.what+id).show();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tgetId : function(o) {\n\t\tvar id = $(o).closest('tr').attr('id'),\n\t\t\tparts = id.split('-');\n\t\treturn parts[parts.length - 1];\n\t}\n};\n\n$( document ).ready( function(){ inlineEditPost.init(); } );\n\n// Show/hide locks on posts\n$( document ).on( 'heartbeat-tick.wp-check-locked-posts', function( e, data ) {\n\tvar locked = data['wp-check-locked-posts'] || {};\n\n\t$('#the-list tr').each( function(i, el) {\n\t\tvar key = el.id, row = $(el), lock_data, avatar;\n\n\t\tif ( locked.hasOwnProperty( key ) ) {\n\t\t\tif ( ! row.hasClass('wp-locked') ) {\n\t\t\t\tlock_data = locked[key];\n\t\t\t\trow.find('.column-title .locked-text').text( lock_data.text );\n\t\t\t\trow.find('.check-column checkbox').prop('checked', false);\n\n\t\t\t\tif ( lock_data.avatar_src ) {\n\t\t\t\t\tavatar = $( '<img class=\"avatar avatar-18 photo\" width=\"18\" height=\"18\" alt=\"\" />' ).attr( 'src', lock_data.avatar_src.replace( /&amp;/g, '&' ) );\n\t\t\t\t\trow.find('.column-title .locked-avatar').empty().append( avatar );\n\t\t\t\t}\n\t\t\t\trow.addClass('wp-locked');\n\t\t\t}\n\t\t} else if ( row.hasClass('wp-locked') ) {\n\t\t\t// Make room for the CSS animation\n\t\t\trow.removeClass('wp-locked').delay(1000).find('.locked-info span').empty();\n\t\t}\n\t});\n}).on( 'heartbeat-send.wp-check-locked-posts', function( e, data ) {\n\tvar check = [];\n\n\t$('#the-list tr').each( function(i, el) {\n\t\tif ( el.id ) {\n\t\t\tcheck.push( el.id );\n\t\t}\n\t});\n\n\tif ( check.length ) {\n\t\tdata['wp-check-locked-posts'] = check;\n\t}\n}).ready( function() {\n\t// Set the heartbeat interval to 15 sec.\n\tif ( typeof wp !== 'undefined' && wp.heartbeat ) {\n\t\twp.heartbeat.interval( 15 );\n\t}\n});\n\n}(jQuery));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/inline-edit-tax.js",
    "content": "/* global inlineEditL10n, ajaxurl */\nwindow.wp = window.wp || {};\n\nvar inlineEditTax;\n( function( $, wp ) {\ninlineEditTax = {\n\n\tinit : function() {\n\t\tvar t = this, row = $('#inline-edit');\n\n\t\tt.type = $('#the-list').attr('data-wp-lists').substr(5);\n\t\tt.what = '#'+t.type+'-';\n\n\t\t$('#the-list').on('click', 'a.editinline', function(){\n\t\t\tinlineEditTax.edit(this);\n\t\t\treturn false;\n\t\t});\n\n\t\t// prepare the edit row\n\t\trow.keyup( function( e ) {\n\t\t\tif ( e.which === 27 ) {\n\t\t\t\treturn inlineEditTax.revert();\n\t\t\t}\n\t\t});\n\n\t\t$( '.cancel', row ).click( function() {\n\t\t\treturn inlineEditTax.revert();\n\t\t});\n\t\t$( '.save', row ).click( function() {\n\t\t\treturn inlineEditTax.save(this);\n\t\t});\n\t\t$( 'input, select', row ).keydown( function( e ) {\n\t\t\tif ( e.which === 13 ) {\n\t\t\t\treturn inlineEditTax.save( this );\n\t\t\t}\n\t\t});\n\n\t\t$( '#posts-filter input[type=\"submit\"]' ).mousedown( function() {\n\t\t\tt.revert();\n\t\t});\n\t},\n\n\ttoggle : function(el) {\n\t\tvar t = this;\n\t\t$(t.what+t.getId(el)).css('display') === 'none' ? t.revert() : t.edit(el);\n\t},\n\n\tedit : function(id) {\n\t\tvar editRow, rowData, val,\n\t\t\tt = this;\n\t\tt.revert();\n\n\t\tif ( typeof(id) === 'object' ) {\n\t\t\tid = t.getId(id);\n\t\t}\n\n\t\teditRow = $('#inline-edit').clone(true), rowData = $('#inline_'+id);\n\t\t$( 'td', editRow ).attr( 'colspan', $( 'th:visible, td:visible', '.widefat:first thead' ).length );\n\n\t\t$(t.what+id).hide().after(editRow).after('<tr class=\"hidden\"></tr>');\n\n\t\tval = $('.name', rowData);\n\t\tval.find( 'img' ).replaceWith( function() { return this.alt; } );\n\t\tval = val.text();\n\t\t$(':input[name=\"name\"]', editRow).val( val );\n\n\t\tval = $('.slug', rowData);\n\t\tval.find( 'img' ).replaceWith( function() { return this.alt; } );\n\t\tval = val.text();\n\t\t$(':input[name=\"slug\"]', editRow).val( val );\n\n\t\t$(editRow).attr('id', 'edit-'+id).addClass('inline-editor').show();\n\t\t$('.ptitle', editRow).eq(0).focus();\n\n\t\treturn false;\n\t},\n\n\tsave : function(id) {\n\t\tvar params, fields, tax = $('input[name=\"taxonomy\"]').val() || '';\n\n\t\tif( typeof(id) === 'object' ) {\n\t\t\tid = this.getId(id);\n\t\t}\n\n\t\t$( 'table.widefat .spinner' ).addClass( 'is-active' );\n\n\t\tparams = {\n\t\t\taction: 'inline-save-tax',\n\t\t\ttax_type: this.type,\n\t\t\ttax_ID: id,\n\t\t\ttaxonomy: tax\n\t\t};\n\n\t\tfields = $('#edit-'+id).find(':input').serialize();\n\t\tparams = fields + '&' + $.param(params);\n\n\t\t// make ajax request\n\t\t$.post( ajaxurl, params,\n\t\t\tfunction(r) {\n\t\t\t\tvar row, new_id, option_value,\n\t\t\t\t\t$errorSpan = $( '#edit-' + id + ' .inline-edit-save .error' );\n\n\t\t\t\t$( 'table.widefat .spinner' ).removeClass( 'is-active' );\n\n\t\t\t\tif (r) {\n\t\t\t\t\tif ( -1 !== r.indexOf( '<tr' ) ) {\n\t\t\t\t\t\t$(inlineEditTax.what+id).siblings('tr.hidden').addBack().remove();\n\t\t\t\t\t\tnew_id = $(r).attr('id');\n\n\t\t\t\t\t\t$('#edit-'+id).before(r).remove();\n\n\t\t\t\t\t\tif ( new_id ) {\n\t\t\t\t\t\t\toption_value = new_id.replace( inlineEditTax.type + '-', '' );\n\t\t\t\t\t\t\trow = $( '#' + new_id );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toption_value = id;\n\t\t\t\t\t\t\trow = $( inlineEditTax.what + id );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update the value in the Parent dropdown.\n\t\t\t\t\t\t$( '#parent' ).find( 'option[value=' + option_value + ']' ).text( row.find( '.row-title' ).text() );\n\n\t\t\t\t\t\trow.hide().fadeIn( 400, function() {\n\t\t\t\t\t\t\t// Move focus back to the taxonomy title.\n\t\t\t\t\t\t\trow.find( '.row-title' ).focus();\n\t\t\t\t\t\t\twp.a11y.speak( inlineEditL10n.saved );\n\t\t\t\t\t\t});\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$errorSpan.html( r ).show();\n\t\t\t\t\t\t// Some error strings may contain HTML entities (e.g. `&#8220`), let's use the HTML element's text.\n\t\t\t\t\t\twp.a11y.speak( $errorSpan.text() );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$errorSpan.html( inlineEditL10n.error ).show();\n\t\t\t\t\twp.a11y.speak( inlineEditL10n.error );\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\t// Prevent submitting the form when pressing Enter on a focused field.\n\t\treturn false;\n\t},\n\n\trevert : function() {\n\t\tvar id = $('table.widefat tr.inline-editor').attr('id');\n\n\t\tif ( id ) {\n\t\t\t$( 'table.widefat .spinner' ).removeClass( 'is-active' );\n\t\t\t$('#'+id).siblings('tr.hidden').addBack().remove();\n\t\t\tid = id.substr( id.lastIndexOf('-') + 1 );\n\t\t\t// Show the taxonomy listing and move focus back to the taxonomy title.\n\t\t\t$( this.what + id ).show().find( '.row-title' ).focus();\n\t\t}\n\t},\n\n\tgetId : function(o) {\n\t\tvar id = o.tagName === 'TR' ? o.id : $(o).parents('tr').attr('id'), parts = id.split('-');\n\t\treturn parts[parts.length - 1];\n\t}\n};\n\n$(document).ready(function(){inlineEditTax.init();});\n})( jQuery, window.wp );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/language-chooser.js",
    "content": "jQuery( function($) {\n\nvar select = $( '#language' ),\n\tsubmit = $( '#language-continue' );\n\nif ( ! $( 'body' ).hasClass( 'language-chooser' ) ) {\n\treturn;\n}\n\nselect.focus().on( 'change', function() {\n\tvar option = select.children( 'option:selected' );\n\tsubmit.attr({\n\t\tvalue: option.data( 'continue' ),\n\t\tlang: option.attr( 'lang' )\n\t});\n});\n\n$( 'form' ).submit( function() {\n\t// Don't show a spinner for English and installed languages,\n\t// as there is nothing to download.\n\tif ( ! select.children( 'option:selected' ).data( 'installed' ) ) {\n\t\t$( this ).find( '.step .spinner' ).css( 'visibility', 'visible' );\n\t}\n});\n\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/link.js",
    "content": "/* global postboxes, deleteUserSetting, setUserSetting, getUserSetting */\n\njQuery(document).ready( function($) {\n\n\tvar newCat, noSyncChecks = false, syncChecks, catAddAfter;\n\n\t$('#link_name').focus();\n\t// postboxes\n\tpostboxes.add_postbox_toggles('link');\n\n\t// category tabs\n\t$('#category-tabs a').click(function(){\n\t\tvar t = $(this).attr('href');\n\t\t$(this).parent().addClass('tabs').siblings('li').removeClass('tabs');\n\t\t$('.tabs-panel').hide();\n\t\t$(t).show();\n\t\tif ( '#categories-all' == t )\n\t\t\tdeleteUserSetting('cats');\n\t\telse\n\t\t\tsetUserSetting('cats','pop');\n\t\treturn false;\n\t});\n\tif ( getUserSetting('cats') )\n\t\t$('#category-tabs a[href=\"#categories-pop\"]').click();\n\n\t// Ajax Cat\n\tnewCat = $('#newcat').one( 'focus', function() { $(this).val( '' ).removeClass( 'form-input-tip' ); } );\n\t$('#link-category-add-submit').click( function() { newCat.focus(); } );\n\tsyncChecks = function() {\n\t\tif ( noSyncChecks )\n\t\t\treturn;\n\t\tnoSyncChecks = true;\n\t\tvar th = $(this), c = th.is(':checked'), id = th.val().toString();\n\t\t$('#in-link-category-' + id + ', #in-popular-link_category-' + id).prop( 'checked', c );\n\t\tnoSyncChecks = false;\n\t};\n\n\tcatAddAfter = function( r, s ) {\n\t\t$(s.what + ' response_data', r).each( function() {\n\t\t\tvar t = $($(this).text());\n\t\t\tt.find( 'label' ).each( function() {\n\t\t\t\tvar th = $(this), val = th.find('input').val(), id = th.find('input')[0].id, name = $.trim( th.text() ), o;\n\t\t\t\t$('#' + id).change( syncChecks );\n\t\t\t\to = $( '<option value=\"' +  parseInt( val, 10 ) + '\"></option>' ).text( name );\n\t\t\t} );\n\t\t} );\n\t};\n\n\t$('#categorychecklist').wpList( {\n\t\talt: '',\n\t\twhat: 'link-category',\n\t\tresponse: 'category-ajax-response',\n\t\taddAfter: catAddAfter\n\t} );\n\n\t$('a[href=\"#categories-all\"]').click(function(){deleteUserSetting('cats');});\n\t$('a[href=\"#categories-pop\"]').click(function(){setUserSetting('cats','pop');});\n\tif ( 'pop' == getUserSetting('cats') )\n\t\t$('a[href=\"#categories-pop\"]').click();\n\n\t$('#category-add-toggle').click( function() {\n\t\t$(this).parents('div:first').toggleClass( 'wp-hidden-children' );\n\t\t$('#category-tabs a[href=\"#categories-all\"]').click();\n\t\t$('#newcategory').focus();\n\t\treturn false;\n\t} );\n\n\t$('.categorychecklist :checkbox').change( syncChecks ).filter( ':checked' ).change();\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/media-gallery.js",
    "content": "/* global ajaxurl */\njQuery(function($){\n\t$( 'body' ).bind( 'click.wp-gallery', function(e){\n\t\tvar target = $( e.target ), id, img_size;\n\n\t\tif ( target.hasClass( 'wp-set-header' ) ) {\n\t\t\t( window.dialogArguments || opener || parent || top ).location.href = target.data( 'location' );\n\t\t\te.preventDefault();\n\t\t} else if ( target.hasClass( 'wp-set-background' ) ) {\n\t\t\tid = target.data( 'attachment-id' );\n\t\t\timg_size = $( 'input[name=\"attachments[' + id + '][image-size]\"]:checked').val();\n\n\t\t\tjQuery.post(ajaxurl, {\n\t\t\t\taction: 'set-background-image',\n\t\t\t\tattachment_id: id,\n\t\t\t\tsize: img_size\n\t\t\t}, function(){\n\t\t\t\tvar win = window.dialogArguments || opener || parent || top;\n\t\t\t\twin.tb_remove();\n\t\t\t\twin.location.reload();\n\t\t\t});\n\n\t\t\te.preventDefault();\n\t\t}\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/media-upload.js",
    "content": "/* global tinymce, QTags */\n// send html to the post editor\n\nvar wpActiveEditor, send_to_editor;\n\nsend_to_editor = function( html ) {\n\tvar editor,\n\t\thasTinymce = typeof tinymce !== 'undefined',\n\t\thasQuicktags = typeof QTags !== 'undefined';\n\n\tif ( ! wpActiveEditor ) {\n\t\tif ( hasTinymce && tinymce.activeEditor ) {\n\t\t\teditor = tinymce.activeEditor;\n\t\t\twpActiveEditor = editor.id;\n\t\t} else if ( ! hasQuicktags ) {\n\t\t\treturn false;\n\t\t}\n\t} else if ( hasTinymce ) {\n\t\teditor = tinymce.get( wpActiveEditor );\n\t}\n\n\tif ( editor && ! editor.isHidden() ) {\n\t\teditor.execCommand( 'mceInsertContent', false, html );\n\t} else if ( hasQuicktags ) {\n\t\tQTags.insertContent( html );\n\t} else {\n\t\tdocument.getElementById( wpActiveEditor ).value += html;\n\t}\n\n\t// If the old thickbox remove function exists, call it\n\tif ( window.tb_remove ) {\n\t\ttry { window.tb_remove(); } catch( e ) {}\n\t}\n};\n\n// thickbox settings\nvar tb_position;\n(function($) {\n\ttb_position = function() {\n\t\tvar tbWindow = $('#TB_window'),\n\t\t\twidth = $(window).width(),\n\t\t\tH = $(window).height(),\n\t\t\tW = ( 833 < width ) ? 833 : width,\n\t\t\tadminbar_height = 0;\n\n\t\tif ( $('#wpadminbar').length ) {\n\t\t\tadminbar_height = parseInt( $('#wpadminbar').css('height'), 10 );\n\t\t}\n\n\t\tif ( tbWindow.size() ) {\n\t\t\ttbWindow.width( W - 50 ).height( H - 45 - adminbar_height );\n\t\t\t$('#TB_iframeContent').width( W - 50 ).height( H - 75 - adminbar_height );\n\t\t\ttbWindow.css({'margin-left': '-' + parseInt( ( ( W - 50 ) / 2 ), 10 ) + 'px'});\n\t\t\tif ( typeof document.body.style.maxWidth !== 'undefined' )\n\t\t\t\ttbWindow.css({'top': 20 + adminbar_height + 'px', 'margin-top': '0'});\n\t\t}\n\n\t\treturn $('a.thickbox').each( function() {\n\t\t\tvar href = $(this).attr('href');\n\t\t\tif ( ! href ) return;\n\t\t\thref = href.replace(/&width=[0-9]+/g, '');\n\t\t\thref = href.replace(/&height=[0-9]+/g, '');\n\t\t\t$(this).attr( 'href', href + '&width=' + ( W - 80 ) + '&height=' + ( H - 85 - adminbar_height ) );\n\t\t});\n\t};\n\n\t$(window).resize(function(){ tb_position(); });\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/media.js",
    "content": "/* global ajaxurl, attachMediaBoxL10n, _wpMediaGridSettings */\n\nvar findPosts;\n( function( $ ){\n\tfindPosts = {\n\t\topen: function( af_name, af_val ) {\n\t\t\tvar overlay = $( '.ui-find-overlay' );\n\n\t\t\tif ( overlay.length === 0 ) {\n\t\t\t\t$( 'body' ).append( '<div class=\"ui-find-overlay\"></div>' );\n\t\t\t\tfindPosts.overlay();\n\t\t\t}\n\n\t\t\toverlay.show();\n\n\t\t\tif ( af_name && af_val ) {\n\t\t\t\t$( '#affected' ).attr( 'name', af_name ).val( af_val );\n\t\t\t}\n\n\t\t\t$( '#find-posts' ).show();\n\n\t\t\t$('#find-posts-input').focus().keyup( function( event ){\n\t\t\t\tif ( event.which == 27 ) {\n\t\t\t\t\tfindPosts.close();\n\t\t\t\t} // close on Escape\n\t\t\t});\n\n\t\t\t// Pull some results up by default\n\t\t\tfindPosts.send();\n\n\t\t\treturn false;\n\t\t},\n\n\t\tclose: function() {\n\t\t\t$('#find-posts-response').empty();\n\t\t\t$('#find-posts').hide();\n\t\t\t$( '.ui-find-overlay' ).hide();\n\t\t},\n\n\t\toverlay: function() {\n\t\t\t$( '.ui-find-overlay' ).on( 'click', function () {\n\t\t\t\tfindPosts.close();\n\t\t\t});\n\t\t},\n\n\t\tsend: function() {\n\t\t\tvar post = {\n\t\t\t\t\tps: $( '#find-posts-input' ).val(),\n\t\t\t\t\taction: 'find_posts',\n\t\t\t\t\t_ajax_nonce: $('#_ajax_nonce').val()\n\t\t\t\t},\n\t\t\t\tspinner = $( '.find-box-search .spinner' );\n\n\t\t\tspinner.addClass( 'is-active' );\n\n\t\t\t$.ajax( ajaxurl, {\n\t\t\t\ttype: 'POST',\n\t\t\t\tdata: post,\n\t\t\t\tdataType: 'json'\n\t\t\t}).always( function() {\n\t\t\t\tspinner.removeClass( 'is-active' );\n\t\t\t}).done( function( x ) {\n\t\t\t\tif ( ! x.success ) {\n\t\t\t\t\t$( '#find-posts-response' ).text( attachMediaBoxL10n.error );\n\t\t\t\t}\n\n\t\t\t\t$( '#find-posts-response' ).html( x.data );\n\t\t\t}).fail( function() {\n\t\t\t\t$( '#find-posts-response' ).text( attachMediaBoxL10n.error );\n\t\t\t});\n\t\t}\n\t};\n\n\t$( document ).ready( function() {\n\t\tvar settings, $mediaGridWrap = $( '#wp-media-grid' );\n\n\t\t// Open up a manage media frame into the grid.\n\t\tif ( $mediaGridWrap.length && window.wp && window.wp.media ) {\n\t\t\tsettings = _wpMediaGridSettings;\n\n\t\t\twindow.wp.media({\n\t\t\t\tframe: 'manage',\n\t\t\t\tcontainer: $mediaGridWrap,\n\t\t\t\tlibrary: settings.queryVars\n\t\t\t}).open();\n\t\t}\n\n\t\t$( '#find-posts-submit' ).click( function( event ) {\n\t\t\tif ( ! $( '#find-posts-response input[type=\"radio\"]:checked' ).length )\n\t\t\t\tevent.preventDefault();\n\t\t});\n\t\t$( '#find-posts .find-box-search :input' ).keypress( function( event ) {\n\t\t\tif ( 13 == event.which ) {\n\t\t\t\tfindPosts.send();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\t$( '#find-posts-search' ).click( findPosts.send );\n\t\t$( '#find-posts-close' ).click( findPosts.close );\n\t\t$( '#doaction, #doaction2' ).click( function( event ) {\n\t\t\t$( 'select[name^=\"action\"]' ).each( function() {\n\t\t\t\tif ( $(this).val() === 'attach' ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tfindPosts.open();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// Enable whole row to be clicked\n\t\t$( '.find-box-inside' ).on( 'click', 'tr', function() {\n\t\t\t$( this ).find( '.found-radio input' ).prop( 'checked', true );\n\t\t});\n\t});\n})( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/nav-menu.js",
    "content": "/**\n * WordPress Administration Navigation Menu\n * Interface JS functions\n *\n * @version 2.0.0\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/* global menus, postboxes, columns, isRtl, navMenuL10n, ajaxurl */\n\nvar wpNavMenu;\n\n(function($) {\n\n\tvar api;\n\n\tapi = wpNavMenu = {\n\n\t\toptions : {\n\t\t\tmenuItemDepthPerLevel : 30, // Do not use directly. Use depthToPx and pxToDepth instead.\n\t\t\tglobalMaxDepth:  11,\n\t\t\tsortableItems:   '> *',\n\t\t\ttargetTolerance: 0\n\t\t},\n\n\t\tmenuList : undefined,\t// Set in init.\n\t\ttargetList : undefined, // Set in init.\n\t\tmenusChanged : false,\n\t\tisRTL: !! ( 'undefined' != typeof isRtl && isRtl ),\n\t\tnegateIfRTL: ( 'undefined' != typeof isRtl && isRtl ) ? -1 : 1,\n\n\t\t// Functions that run on init.\n\t\tinit : function() {\n\t\t\tapi.menuList = $('#menu-to-edit');\n\t\t\tapi.targetList = api.menuList;\n\n\t\t\tthis.jQueryExtensions();\n\n\t\t\tthis.attachMenuEditListeners();\n\n\t\t\tthis.setupInputWithDefaultTitle();\n\t\t\tthis.attachQuickSearchListeners();\n\t\t\tthis.attachThemeLocationsListeners();\n\n\t\t\tthis.attachTabsPanelListeners();\n\n\t\t\tthis.attachUnsavedChangesListener();\n\n\t\t\tif ( api.menuList.length )\n\t\t\t\tthis.initSortables();\n\n\t\t\tif ( menus.oneThemeLocationNoMenus )\n\t\t\t\t$( '#posttype-page' ).addSelectedToMenu( api.addMenuItemToBottom );\n\n\t\t\tthis.initManageLocations();\n\n\t\t\tthis.initAccessibility();\n\n\t\t\tthis.initToggles();\n\n\t\t\tthis.initPreviewing();\n\t\t},\n\n\t\tjQueryExtensions : function() {\n\t\t\t// jQuery extensions\n\t\t\t$.fn.extend({\n\t\t\t\tmenuItemDepth : function() {\n\t\t\t\t\tvar margin = api.isRTL ? this.eq(0).css('margin-right') : this.eq(0).css('margin-left');\n\t\t\t\t\treturn api.pxToDepth( margin && -1 != margin.indexOf('px') ? margin.slice(0, -2) : 0 );\n\t\t\t\t},\n\t\t\t\tupdateDepthClass : function(current, prev) {\n\t\t\t\t\treturn this.each(function(){\n\t\t\t\t\t\tvar t = $(this);\n\t\t\t\t\t\tprev = prev || t.menuItemDepth();\n\t\t\t\t\t\t$(this).removeClass('menu-item-depth-'+ prev )\n\t\t\t\t\t\t\t.addClass('menu-item-depth-'+ current );\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tshiftDepthClass : function(change) {\n\t\t\t\t\treturn this.each(function(){\n\t\t\t\t\t\tvar t = $(this),\n\t\t\t\t\t\t\tdepth = t.menuItemDepth();\n\t\t\t\t\t\t$(this).removeClass('menu-item-depth-'+ depth )\n\t\t\t\t\t\t\t.addClass('menu-item-depth-'+ (depth + change) );\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tchildMenuItems : function() {\n\t\t\t\t\tvar result = $();\n\t\t\t\t\tthis.each(function(){\n\t\t\t\t\t\tvar t = $(this), depth = t.menuItemDepth(), next = t.next( '.menu-item' );\n\t\t\t\t\t\twhile( next.length && next.menuItemDepth() > depth ) {\n\t\t\t\t\t\t\tresult = result.add( next );\n\t\t\t\t\t\t\tnext = next.next( '.menu-item' );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\tshiftHorizontally : function( dir ) {\n\t\t\t\t\treturn this.each(function(){\n\t\t\t\t\t\tvar t = $(this),\n\t\t\t\t\t\t\tdepth = t.menuItemDepth(),\n\t\t\t\t\t\t\tnewDepth = depth + dir;\n\n\t\t\t\t\t\t// Change .menu-item-depth-n class\n\t\t\t\t\t\tt.moveHorizontally( newDepth, depth );\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmoveHorizontally : function( newDepth, depth ) {\n\t\t\t\t\treturn this.each(function(){\n\t\t\t\t\t\tvar t = $(this),\n\t\t\t\t\t\t\tchildren = t.childMenuItems(),\n\t\t\t\t\t\t\tdiff = newDepth - depth,\n\t\t\t\t\t\t\tsubItemText = t.find('.is-submenu');\n\n\t\t\t\t\t\t// Change .menu-item-depth-n class\n\t\t\t\t\t\tt.updateDepthClass( newDepth, depth ).updateParentMenuItemDBId();\n\n\t\t\t\t\t\t// If it has children, move those too\n\t\t\t\t\t\tif ( children ) {\n\t\t\t\t\t\t\tchildren.each(function() {\n\t\t\t\t\t\t\t\tvar t = $(this),\n\t\t\t\t\t\t\t\t\tthisDepth = t.menuItemDepth(),\n\t\t\t\t\t\t\t\t\tnewDepth = thisDepth + diff;\n\t\t\t\t\t\t\t\tt.updateDepthClass(newDepth, thisDepth).updateParentMenuItemDBId();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Show \"Sub item\" helper text\n\t\t\t\t\t\tif (0 === newDepth)\n\t\t\t\t\t\t\tsubItemText.hide();\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tsubItemText.show();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tupdateParentMenuItemDBId : function() {\n\t\t\t\t\treturn this.each(function(){\n\t\t\t\t\t\tvar item = $(this),\n\t\t\t\t\t\t\tinput = item.find( '.menu-item-data-parent-id' ),\n\t\t\t\t\t\t\tdepth = parseInt( item.menuItemDepth(), 10 ),\n\t\t\t\t\t\t\tparentDepth = depth - 1,\n\t\t\t\t\t\t\tparent = item.prevAll( '.menu-item-depth-' + parentDepth ).first();\n\n\t\t\t\t\t\tif ( 0 === depth ) { // Item is on the top level, has no parent\n\t\t\t\t\t\t\tinput.val(0);\n\t\t\t\t\t\t} else { // Find the parent item, and retrieve its object id.\n\t\t\t\t\t\t\tinput.val( parent.find( '.menu-item-data-db-id' ).val() );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\thideAdvancedMenuItemFields : function() {\n\t\t\t\t\treturn this.each(function(){\n\t\t\t\t\t\tvar that = $(this);\n\t\t\t\t\t\t$('.hide-column-tog').not(':checked').each(function(){\n\t\t\t\t\t\t\tthat.find('.field-' + $(this).val() ).addClass('hidden-field');\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t/**\n\t\t\t\t * Adds selected menu items to the menu.\n\t\t\t\t *\n\t\t\t\t * @param jQuery metabox The metabox jQuery object.\n\t\t\t\t */\n\t\t\t\taddSelectedToMenu : function(processMethod) {\n\t\t\t\t\tif ( 0 === $('#menu-to-edit').length ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this.each(function() {\n\t\t\t\t\t\tvar t = $(this), menuItems = {},\n\t\t\t\t\t\t\tcheckboxes = ( menus.oneThemeLocationNoMenus && 0 === t.find( '.tabs-panel-active .categorychecklist li input:checked' ).length ) ? t.find( '#page-all li input[type=\"checkbox\"]' ) : t.find( '.tabs-panel-active .categorychecklist li input:checked' ),\n\t\t\t\t\t\t\tre = /menu-item\\[([^\\]]*)/;\n\n\t\t\t\t\t\tprocessMethod = processMethod || api.addMenuItemToBottom;\n\n\t\t\t\t\t\t// If no items are checked, bail.\n\t\t\t\t\t\tif ( !checkboxes.length )\n\t\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t\t// Show the ajax spinner\n\t\t\t\t\t\tt.find( '.spinner' ).addClass( 'is-active' );\n\n\t\t\t\t\t\t// Retrieve menu item data\n\t\t\t\t\t\t$(checkboxes).each(function(){\n\t\t\t\t\t\t\tvar t = $(this),\n\t\t\t\t\t\t\t\tlistItemDBIDMatch = re.exec( t.attr('name') ),\n\t\t\t\t\t\t\t\tlistItemDBID = 'undefined' == typeof listItemDBIDMatch[1] ? 0 : parseInt(listItemDBIDMatch[1], 10);\n\n\t\t\t\t\t\t\tif ( this.className && -1 != this.className.indexOf('add-to-top') )\n\t\t\t\t\t\t\t\tprocessMethod = api.addMenuItemToTop;\n\t\t\t\t\t\t\tmenuItems[listItemDBID] = t.closest('li').getItemData( 'add-menu-item', listItemDBID );\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Add the items\n\t\t\t\t\t\tapi.addItemToMenu(menuItems, processMethod, function(){\n\t\t\t\t\t\t\t// Deselect the items and hide the ajax spinner\n\t\t\t\t\t\t\tcheckboxes.removeAttr('checked');\n\t\t\t\t\t\t\tt.find( '.spinner' ).removeClass( 'is-active' );\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tgetItemData : function( itemType, id ) {\n\t\t\t\t\titemType = itemType || 'menu-item';\n\n\t\t\t\t\tvar itemData = {}, i,\n\t\t\t\t\tfields = [\n\t\t\t\t\t\t'menu-item-db-id',\n\t\t\t\t\t\t'menu-item-object-id',\n\t\t\t\t\t\t'menu-item-object',\n\t\t\t\t\t\t'menu-item-parent-id',\n\t\t\t\t\t\t'menu-item-position',\n\t\t\t\t\t\t'menu-item-type',\n\t\t\t\t\t\t'menu-item-title',\n\t\t\t\t\t\t'menu-item-url',\n\t\t\t\t\t\t'menu-item-description',\n\t\t\t\t\t\t'menu-item-attr-title',\n\t\t\t\t\t\t'menu-item-target',\n\t\t\t\t\t\t'menu-item-classes',\n\t\t\t\t\t\t'menu-item-xfn'\n\t\t\t\t\t];\n\n\t\t\t\t\tif( !id && itemType == 'menu-item' ) {\n\t\t\t\t\t\tid = this.find('.menu-item-data-db-id').val();\n\t\t\t\t\t}\n\n\t\t\t\t\tif( !id ) return itemData;\n\n\t\t\t\t\tthis.find('input').each(function() {\n\t\t\t\t\t\tvar field;\n\t\t\t\t\t\ti = fields.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif( itemType == 'menu-item' )\n\t\t\t\t\t\t\t\tfield = fields[i] + '[' + id + ']';\n\t\t\t\t\t\t\telse if( itemType == 'add-menu-item' )\n\t\t\t\t\t\t\t\tfield = 'menu-item[' + id + '][' + fields[i] + ']';\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tthis.name &&\n\t\t\t\t\t\t\t\tfield == this.name\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\titemData[fields[i]] = this.value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn itemData;\n\t\t\t\t},\n\t\t\t\tsetItemData : function( itemData, itemType, id ) { // Can take a type, such as 'menu-item', or an id.\n\t\t\t\t\titemType = itemType || 'menu-item';\n\n\t\t\t\t\tif( !id && itemType == 'menu-item' ) {\n\t\t\t\t\t\tid = $('.menu-item-data-db-id', this).val();\n\t\t\t\t\t}\n\n\t\t\t\t\tif( !id ) return this;\n\n\t\t\t\t\tthis.find('input').each(function() {\n\t\t\t\t\t\tvar t = $(this), field;\n\t\t\t\t\t\t$.each( itemData, function( attr, val ) {\n\t\t\t\t\t\t\tif( itemType == 'menu-item' )\n\t\t\t\t\t\t\t\tfield = attr + '[' + id + ']';\n\t\t\t\t\t\t\telse if( itemType == 'add-menu-item' )\n\t\t\t\t\t\t\t\tfield = 'menu-item[' + id + '][' + attr + ']';\n\n\t\t\t\t\t\t\tif ( field == t.attr('name') ) {\n\t\t\t\t\t\t\t\tt.val( val );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tcountMenuItems : function( depth ) {\n\t\t\treturn $( '.menu-item-depth-' + depth ).length;\n\t\t},\n\n\t\tmoveMenuItem : function( $this, dir ) {\n\n\t\t\tvar items, newItemPosition, newDepth,\n\t\t\t\tmenuItems = $( '#menu-to-edit li' ),\n\t\t\t\tmenuItemsCount = menuItems.length,\n\t\t\t\tthisItem = $this.parents( 'li.menu-item' ),\n\t\t\t\tthisItemChildren = thisItem.childMenuItems(),\n\t\t\t\tthisItemData = thisItem.getItemData(),\n\t\t\t\tthisItemDepth = parseInt( thisItem.menuItemDepth(), 10 ),\n\t\t\t\tthisItemPosition = parseInt( thisItem.index(), 10 ),\n\t\t\t\tnextItem = thisItem.next(),\n\t\t\t\tnextItemChildren = nextItem.childMenuItems(),\n\t\t\t\tnextItemDepth = parseInt( nextItem.menuItemDepth(), 10 ) + 1,\n\t\t\t\tprevItem = thisItem.prev(),\n\t\t\t\tprevItemDepth = parseInt( prevItem.menuItemDepth(), 10 ),\n\t\t\t\tprevItemId = prevItem.getItemData()['menu-item-db-id'];\n\n\t\t\tswitch ( dir ) {\n\t\t\tcase 'up':\n\t\t\t\tnewItemPosition = thisItemPosition - 1;\n\n\t\t\t\t// Already at top\n\t\t\t\tif ( 0 === thisItemPosition )\n\t\t\t\t\tbreak;\n\n\t\t\t\t// If a sub item is moved to top, shift it to 0 depth\n\t\t\t\tif ( 0 === newItemPosition && 0 !== thisItemDepth )\n\t\t\t\t\tthisItem.moveHorizontally( 0, thisItemDepth );\n\n\t\t\t\t// If prev item is sub item, shift to match depth\n\t\t\t\tif ( 0 !== prevItemDepth )\n\t\t\t\t\tthisItem.moveHorizontally( prevItemDepth, thisItemDepth );\n\n\t\t\t\t// Does this item have sub items?\n\t\t\t\tif ( thisItemChildren ) {\n\t\t\t\t\titems = thisItem.add( thisItemChildren );\n\t\t\t\t\t// Move the entire block\n\t\t\t\t\titems.detach().insertBefore( menuItems.eq( newItemPosition ) ).updateParentMenuItemDBId();\n\t\t\t\t} else {\n\t\t\t\t\tthisItem.detach().insertBefore( menuItems.eq( newItemPosition ) ).updateParentMenuItemDBId();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'down':\n\t\t\t\t// Does this item have sub items?\n\t\t\t\tif ( thisItemChildren ) {\n\t\t\t\t\titems = thisItem.add( thisItemChildren ),\n\t\t\t\t\t\tnextItem = menuItems.eq( items.length + thisItemPosition ),\n\t\t\t\t\t\tnextItemChildren = 0 !== nextItem.childMenuItems().length;\n\n\t\t\t\t\tif ( nextItemChildren ) {\n\t\t\t\t\t\tnewDepth = parseInt( nextItem.menuItemDepth(), 10 ) + 1;\n\t\t\t\t\t\tthisItem.moveHorizontally( newDepth, thisItemDepth );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Have we reached the bottom?\n\t\t\t\t\tif ( menuItemsCount === thisItemPosition + items.length )\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\titems.detach().insertAfter( menuItems.eq( thisItemPosition + items.length ) ).updateParentMenuItemDBId();\n\t\t\t\t} else {\n\t\t\t\t\t// If next item has sub items, shift depth\n\t\t\t\t\tif ( 0 !== nextItemChildren.length )\n\t\t\t\t\t\tthisItem.moveHorizontally( nextItemDepth, thisItemDepth );\n\n\t\t\t\t\t// Have we reached the bottom\n\t\t\t\t\tif ( menuItemsCount === thisItemPosition + 1 )\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tthisItem.detach().insertAfter( menuItems.eq( thisItemPosition + 1 ) ).updateParentMenuItemDBId();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'top':\n\t\t\t\t// Already at top\n\t\t\t\tif ( 0 === thisItemPosition )\n\t\t\t\t\tbreak;\n\t\t\t\t// Does this item have sub items?\n\t\t\t\tif ( thisItemChildren ) {\n\t\t\t\t\titems = thisItem.add( thisItemChildren );\n\t\t\t\t\t// Move the entire block\n\t\t\t\t\titems.detach().insertBefore( menuItems.eq( 0 ) ).updateParentMenuItemDBId();\n\t\t\t\t} else {\n\t\t\t\t\tthisItem.detach().insertBefore( menuItems.eq( 0 ) ).updateParentMenuItemDBId();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\t// As far left as possible\n\t\t\t\tif ( 0 === thisItemDepth )\n\t\t\t\t\tbreak;\n\t\t\t\tthisItem.shiftHorizontally( -1 );\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\t// Can't be sub item at top\n\t\t\t\tif ( 0 === thisItemPosition )\n\t\t\t\t\tbreak;\n\t\t\t\t// Already sub item of prevItem\n\t\t\t\tif ( thisItemData['menu-item-parent-id'] === prevItemId )\n\t\t\t\t\tbreak;\n\t\t\t\tthisItem.shiftHorizontally( 1 );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$this.focus();\n\t\t\tapi.registerChange();\n\t\t\tapi.refreshKeyboardAccessibility();\n\t\t\tapi.refreshAdvancedAccessibility();\n\t\t},\n\n\t\tinitAccessibility : function() {\n\t\t\tvar menu = $( '#menu-to-edit' );\n\n\t\t\tapi.refreshKeyboardAccessibility();\n\t\t\tapi.refreshAdvancedAccessibility();\n\n\t\t\t// Refresh the accessibility when the user comes close to the item in any way\n\t\t\tmenu.on( 'mouseenter.refreshAccessibility focus.refreshAccessibility touchstart.refreshAccessibility' , '.menu-item' , function(){\n\t\t\t\tapi.refreshAdvancedAccessibilityOfItem( $( this ).find( 'a.item-edit' ) );\n\t\t\t} );\n\n\t\t\t// We have to update on click as well because we might hover first, change the item, and then click.\n\t\t\tmenu.on( 'click', 'a.item-edit', function() {\n\t\t\t\tapi.refreshAdvancedAccessibilityOfItem( $( this ) );\n\t\t\t} );\n\n\t\t\t// Links for moving items\n\t\t\tmenu.on( 'click', '.menus-move', function ( e ) {\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\tdir = $this.data( 'dir' );\n\n\t\t\t\tif ( 'undefined' !== typeof dir ) {\n\t\t\t\t\tapi.moveMenuItem( $( this ).parents( 'li.menu-item' ).find( 'a.item-edit' ), dir );\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * refreshAdvancedAccessibilityOfItem( [itemToRefresh] )\n\t\t *\n\t\t * Refreshes advanced accessibility buttons for one menu item.\n\t\t * Shows or hides buttons based on the location of the menu item.\n\t\t *\n\t\t * @param  {object} itemToRefresh The menu item that might need its advanced accessibility buttons refreshed\n\t\t */\n\t\trefreshAdvancedAccessibilityOfItem : function( itemToRefresh ) {\n\n\t\t\t// Only refresh accessibility when necessary\n\t\t\tif ( true !== $( itemToRefresh ).data( 'needs_accessibility_refresh' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar thisLink, thisLinkText, primaryItems, itemPosition, title,\n\t\t\t\tparentItem, parentItemId, parentItemName, subItems,\n\t\t\t\t$this = $( itemToRefresh ),\n\t\t\t\tmenuItem = $this.closest( 'li.menu-item' ).first(),\n\t\t\t\tdepth = menuItem.menuItemDepth(),\n\t\t\t\tisPrimaryMenuItem = ( 0 === depth ),\n\t\t\t\titemName = $this.closest( '.menu-item-handle' ).find( '.menu-item-title' ).text(),\n\t\t\t\tposition = parseInt( menuItem.index(), 10 ),\n\t\t\t\tprevItemDepth = ( isPrimaryMenuItem ) ? depth : parseInt( depth - 1, 10 ),\n\t\t\t\tprevItemNameLeft = menuItem.prevAll('.menu-item-depth-' + prevItemDepth).first().find( '.menu-item-title' ).text(),\n\t\t\t\tprevItemNameRight = menuItem.prevAll('.menu-item-depth-' + depth).first().find( '.menu-item-title' ).text(),\n\t\t\t\ttotalMenuItems = $('#menu-to-edit li').length,\n\t\t\t\thasSameDepthSibling = menuItem.nextAll( '.menu-item-depth-' + depth ).length;\n\n\t\t\t\tmenuItem.find( '.field-move' ).toggle( totalMenuItems > 1 );\n\n\t\t\t// Where can they move this menu item?\n\t\t\tif ( 0 !== position ) {\n\t\t\t\tthisLink = menuItem.find( '.menus-move-up' );\n\t\t\t\tthisLink.prop( 'title', menus.moveUp ).css( 'display', 'inline' );\n\t\t\t}\n\n\t\t\tif ( 0 !== position && isPrimaryMenuItem ) {\n\t\t\t\tthisLink = menuItem.find( '.menus-move-top' );\n\t\t\t\tthisLink.prop( 'title', menus.moveToTop ).css( 'display', 'inline' );\n\t\t\t}\n\n\t\t\tif ( position + 1 !== totalMenuItems && 0 !== position ) {\n\t\t\t\tthisLink = menuItem.find( '.menus-move-down' );\n\t\t\t\tthisLink.prop( 'title', menus.moveDown ).css( 'display', 'inline' );\n\t\t\t}\n\n\t\t\tif ( 0 === position && 0 !== hasSameDepthSibling ) {\n\t\t\t\tthisLink = menuItem.find( '.menus-move-down' );\n\t\t\t\tthisLink.prop( 'title', menus.moveDown ).css( 'display', 'inline' );\n\t\t\t}\n\n\t\t\tif ( ! isPrimaryMenuItem ) {\n\t\t\t\tthisLink = menuItem.find( '.menus-move-left' ),\n\t\t\t\tthisLinkText = menus.outFrom.replace( '%s', prevItemNameLeft );\n\t\t\t\tthisLink.prop( 'title', menus.moveOutFrom.replace( '%s', prevItemNameLeft ) ).text( thisLinkText ).css( 'display', 'inline' );\n\t\t\t}\n\n\t\t\tif ( 0 !== position ) {\n\t\t\t\tif ( menuItem.find( '.menu-item-data-parent-id' ).val() !== menuItem.prev().find( '.menu-item-data-db-id' ).val() ) {\n\t\t\t\t\tthisLink = menuItem.find( '.menus-move-right' ),\n\t\t\t\t\tthisLinkText = menus.under.replace( '%s', prevItemNameRight );\n\t\t\t\t\tthisLink.prop( 'title', menus.moveUnder.replace( '%s', prevItemNameRight ) ).text( thisLinkText ).css( 'display', 'inline' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isPrimaryMenuItem ) {\n\t\t\t\tprimaryItems = $( '.menu-item-depth-0' ),\n\t\t\t\titemPosition = primaryItems.index( menuItem ) + 1,\n\t\t\t\ttotalMenuItems = primaryItems.length,\n\n\t\t\t\t// String together help text for primary menu items\n\t\t\t\ttitle = menus.menuFocus.replace( '%1$s', itemName ).replace( '%2$d', itemPosition ).replace( '%3$d', totalMenuItems );\n\t\t\t} else {\n\t\t\t\tparentItem = menuItem.prevAll( '.menu-item-depth-' + parseInt( depth - 1, 10 ) ).first(),\n\t\t\t\tparentItemId = parentItem.find( '.menu-item-data-db-id' ).val(),\n\t\t\t\tparentItemName = parentItem.find( '.menu-item-title' ).text(),\n\t\t\t\tsubItems = $( '.menu-item .menu-item-data-parent-id[value=\"' + parentItemId + '\"]' ),\n\t\t\t\titemPosition = $( subItems.parents('.menu-item').get().reverse() ).index( menuItem ) + 1;\n\n\t\t\t\t// String together help text for sub menu items\n\t\t\t\ttitle = menus.subMenuFocus.replace( '%1$s', itemName ).replace( '%2$d', itemPosition ).replace( '%3$s', parentItemName );\n\t\t\t}\n\n\t\t\t$this.prop('title', title).text( title );\n\n\t\t\t// Mark this item's accessibility as refreshed\n\t\t\t$this.data( 'needs_accessibility_refresh', false );\n\t\t},\n\n\t\t/**\n\t\t * refreshAdvancedAccessibility\n\t\t *\n\t\t * Hides all advanced accessibility buttons and marks them for refreshing.\n\t\t */\n\t\trefreshAdvancedAccessibility : function() {\n\n\t\t\t// Hide all links by default\n\t\t\t$( '.menu-item-settings .field-move a' ).hide();\n\n\t\t\t// Mark all menu items as unprocessed\n\t\t\t$( 'a.item-edit' ).data( 'needs_accessibility_refresh', true );\n\n\t\t\t// All open items have to be refreshed or they will show no links\n\t\t\t$( '.menu-item-edit-active a.item-edit' ).each( function() {\n\t\t\t\tapi.refreshAdvancedAccessibilityOfItem( this );\n\t\t\t} );\n\t\t},\n\n\t\trefreshKeyboardAccessibility : function() {\n\t\t\t$( 'a.item-edit' ).off( 'focus' ).on( 'focus', function(){\n\t\t\t\t$(this).off( 'keydown' ).on( 'keydown', function(e){\n\n\t\t\t\t\tvar arrows,\n\t\t\t\t\t\t$this = $( this ),\n\t\t\t\t\t\tthisItem = $this.parents( 'li.menu-item' ),\n\t\t\t\t\t\tthisItemData = thisItem.getItemData();\n\n\t\t\t\t\t// Bail if it's not an arrow key\n\t\t\t\t\tif ( 37 != e.which && 38 != e.which && 39 != e.which && 40 != e.which )\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t// Avoid multiple keydown events\n\t\t\t\t\t$this.off('keydown');\n\n\t\t\t\t\t// Bail if there is only one menu item\n\t\t\t\t\tif ( 1 === $('#menu-to-edit li').length )\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t// If RTL, swap left/right arrows\n\t\t\t\t\tarrows = { '38': 'up', '40': 'down', '37': 'left', '39': 'right' };\n\t\t\t\t\tif ( $('body').hasClass('rtl') )\n\t\t\t\t\t\tarrows = { '38' : 'up', '40' : 'down', '39' : 'left', '37' : 'right' };\n\n\t\t\t\t\tswitch ( arrows[e.which] ) {\n\t\t\t\t\tcase 'up':\n\t\t\t\t\t\tapi.moveMenuItem( $this, 'up' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'down':\n\t\t\t\t\t\tapi.moveMenuItem( $this, 'down' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'left':\n\t\t\t\t\t\tapi.moveMenuItem( $this, 'left' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'right':\n\t\t\t\t\t\tapi.moveMenuItem( $this, 'right' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// Put focus back on same menu item\n\t\t\t\t\t$( '#edit-' + thisItemData['menu-item-db-id'] ).focus();\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\tinitPreviewing : function() {\n\t\t\t// Update the item handle title when the navigation label is changed.\n\t\t\t$( '#menu-to-edit' ).on( 'change input', '.edit-menu-item-title', function(e) {\n\t\t\t\tvar input = $( e.currentTarget ), title, titleEl;\n\t\t\t\ttitle = input.val();\n\t\t\t\ttitleEl = input.closest( '.menu-item' ).find( '.menu-item-title' );\n\t\t\t\t// Don't update to empty title.\n\t\t\t\tif ( title ) {\n\t\t\t\t\ttitleEl.text( title ).removeClass( 'no-title' );\n\t\t\t\t} else {\n\t\t\t\t\ttitleEl.text( navMenuL10n.untitled ).addClass( 'no-title' );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tinitToggles : function() {\n\t\t\t// init postboxes\n\t\t\tpostboxes.add_postbox_toggles('nav-menus');\n\n\t\t\t// adjust columns functions for menus UI\n\t\t\tcolumns.useCheckboxesForHidden();\n\t\t\tcolumns.checked = function(field) {\n\t\t\t\t$('.field-' + field).removeClass('hidden-field');\n\t\t\t};\n\t\t\tcolumns.unchecked = function(field) {\n\t\t\t\t$('.field-' + field).addClass('hidden-field');\n\t\t\t};\n\t\t\t// hide fields\n\t\t\tapi.menuList.hideAdvancedMenuItemFields();\n\n\t\t\t$('.hide-postbox-tog').click(function () {\n\t\t\t\tvar hidden = $( '.accordion-container li.accordion-section' ).filter(':hidden').map(function() { return this.id; }).get().join(',');\n\t\t\t\t$.post(ajaxurl, {\n\t\t\t\t\taction: 'closed-postboxes',\n\t\t\t\t\thidden: hidden,\n\t\t\t\t\tclosedpostboxesnonce: jQuery('#closedpostboxesnonce').val(),\n\t\t\t\t\tpage: 'nav-menus'\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\tinitSortables : function() {\n\t\t\tvar currentDepth = 0, originalDepth, minDepth, maxDepth,\n\t\t\t\tprev, next, prevBottom, nextThreshold, helperHeight, transport,\n\t\t\t\tmenuEdge = api.menuList.offset().left,\n\t\t\t\tbody = $('body'), maxChildDepth,\n\t\t\t\tmenuMaxDepth = initialMenuMaxDepth();\n\n\t\t\tif( 0 !== $( '#menu-to-edit li' ).length )\n\t\t\t\t$( '.drag-instructions' ).show();\n\n\t\t\t// Use the right edge if RTL.\n\t\t\tmenuEdge += api.isRTL ? api.menuList.width() : 0;\n\n\t\t\tapi.menuList.sortable({\n\t\t\t\thandle: '.menu-item-handle',\n\t\t\t\tplaceholder: 'sortable-placeholder',\n\t\t\t\titems: api.options.sortableItems,\n\t\t\t\tstart: function(e, ui) {\n\t\t\t\t\tvar height, width, parent, children, tempHolder;\n\n\t\t\t\t\t// handle placement for rtl orientation\n\t\t\t\t\tif ( api.isRTL )\n\t\t\t\t\t\tui.item[0].style.right = 'auto';\n\n\t\t\t\t\ttransport = ui.item.children('.menu-item-transport');\n\n\t\t\t\t\t// Set depths. currentDepth must be set before children are located.\n\t\t\t\t\toriginalDepth = ui.item.menuItemDepth();\n\t\t\t\t\tupdateCurrentDepth(ui, originalDepth);\n\n\t\t\t\t\t// Attach child elements to parent\n\t\t\t\t\t// Skip the placeholder\n\t\t\t\t\tparent = ( ui.item.next()[0] == ui.placeholder[0] ) ? ui.item.next() : ui.item;\n\t\t\t\t\tchildren = parent.childMenuItems();\n\t\t\t\t\ttransport.append( children );\n\n\t\t\t\t\t// Update the height of the placeholder to match the moving item.\n\t\t\t\t\theight = transport.outerHeight();\n\t\t\t\t\t// If there are children, account for distance between top of children and parent\n\t\t\t\t\theight += ( height > 0 ) ? (ui.placeholder.css('margin-top').slice(0, -2) * 1) : 0;\n\t\t\t\t\theight += ui.helper.outerHeight();\n\t\t\t\t\thelperHeight = height;\n\t\t\t\t\theight -= 2; // Subtract 2 for borders\n\t\t\t\t\tui.placeholder.height(height);\n\n\t\t\t\t\t// Update the width of the placeholder to match the moving item.\n\t\t\t\t\tmaxChildDepth = originalDepth;\n\t\t\t\t\tchildren.each(function(){\n\t\t\t\t\t\tvar depth = $(this).menuItemDepth();\n\t\t\t\t\t\tmaxChildDepth = (depth > maxChildDepth) ? depth : maxChildDepth;\n\t\t\t\t\t});\n\t\t\t\t\twidth = ui.helper.find('.menu-item-handle').outerWidth(); // Get original width\n\t\t\t\t\twidth += api.depthToPx(maxChildDepth - originalDepth); // Account for children\n\t\t\t\t\twidth -= 2; // Subtract 2 for borders\n\t\t\t\t\tui.placeholder.width(width);\n\n\t\t\t\t\t// Update the list of menu items.\n\t\t\t\t\ttempHolder = ui.placeholder.next( '.menu-item' );\n\t\t\t\t\ttempHolder.css( 'margin-top', helperHeight + 'px' ); // Set the margin to absorb the placeholder\n\t\t\t\t\tui.placeholder.detach(); // detach or jQuery UI will think the placeholder is a menu item\n\t\t\t\t\t$(this).sortable( 'refresh' ); // The children aren't sortable. We should let jQ UI know.\n\t\t\t\t\tui.item.after( ui.placeholder ); // reattach the placeholder.\n\t\t\t\t\ttempHolder.css('margin-top', 0); // reset the margin\n\n\t\t\t\t\t// Now that the element is complete, we can update...\n\t\t\t\t\tupdateSharedVars(ui);\n\t\t\t\t},\n\t\t\t\tstop: function(e, ui) {\n\t\t\t\t\tvar children, subMenuTitle,\n\t\t\t\t\t\tdepthChange = currentDepth - originalDepth;\n\n\t\t\t\t\t// Return child elements to the list\n\t\t\t\t\tchildren = transport.children().insertAfter(ui.item);\n\n\t\t\t\t\t// Add \"sub menu\" description\n\t\t\t\t\tsubMenuTitle = ui.item.find( '.item-title .is-submenu' );\n\t\t\t\t\tif ( 0 < currentDepth )\n\t\t\t\t\t\tsubMenuTitle.show();\n\t\t\t\t\telse\n\t\t\t\t\t\tsubMenuTitle.hide();\n\n\t\t\t\t\t// Update depth classes\n\t\t\t\t\tif ( 0 !== depthChange ) {\n\t\t\t\t\t\tui.item.updateDepthClass( currentDepth );\n\t\t\t\t\t\tchildren.shiftDepthClass( depthChange );\n\t\t\t\t\t\tupdateMenuMaxDepth( depthChange );\n\t\t\t\t\t}\n\t\t\t\t\t// Register a change\n\t\t\t\t\tapi.registerChange();\n\t\t\t\t\t// Update the item data.\n\t\t\t\t\tui.item.updateParentMenuItemDBId();\n\n\t\t\t\t\t// address sortable's incorrectly-calculated top in opera\n\t\t\t\t\tui.item[0].style.top = 0;\n\n\t\t\t\t\t// handle drop placement for rtl orientation\n\t\t\t\t\tif ( api.isRTL ) {\n\t\t\t\t\t\tui.item[0].style.left = 'auto';\n\t\t\t\t\t\tui.item[0].style.right = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tapi.refreshKeyboardAccessibility();\n\t\t\t\t\tapi.refreshAdvancedAccessibility();\n\t\t\t\t},\n\t\t\t\tchange: function(e, ui) {\n\t\t\t\t\t// Make sure the placeholder is inside the menu.\n\t\t\t\t\t// Otherwise fix it, or we're in trouble.\n\t\t\t\t\tif( ! ui.placeholder.parent().hasClass('menu') )\n\t\t\t\t\t\t(prev.length) ? prev.after( ui.placeholder ) : api.menuList.prepend( ui.placeholder );\n\n\t\t\t\t\tupdateSharedVars(ui);\n\t\t\t\t},\n\t\t\t\tsort: function(e, ui) {\n\t\t\t\t\tvar offset = ui.helper.offset(),\n\t\t\t\t\t\tedge = api.isRTL ? offset.left + ui.helper.width() : offset.left,\n\t\t\t\t\t\tdepth = api.negateIfRTL * api.pxToDepth( edge - menuEdge );\n\n\t\t\t\t\t// Check and correct if depth is not within range.\n\t\t\t\t\t// Also, if the dragged element is dragged upwards over\n\t\t\t\t\t// an item, shift the placeholder to a child position.\n\t\t\t\t\tif ( depth > maxDepth || offset.top < ( prevBottom - api.options.targetTolerance ) ) {\n\t\t\t\t\t\tdepth = maxDepth;\n\t\t\t\t\t} else if ( depth < minDepth ) {\n\t\t\t\t\t\tdepth = minDepth;\n\t\t\t\t\t}\n\n\t\t\t\t\tif( depth != currentDepth )\n\t\t\t\t\t\tupdateCurrentDepth(ui, depth);\n\n\t\t\t\t\t// If we overlap the next element, manually shift downwards\n\t\t\t\t\tif( nextThreshold && offset.top + helperHeight > nextThreshold ) {\n\t\t\t\t\t\tnext.after( ui.placeholder );\n\t\t\t\t\t\tupdateSharedVars( ui );\n\t\t\t\t\t\t$( this ).sortable( 'refreshPositions' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction updateSharedVars(ui) {\n\t\t\t\tvar depth;\n\n\t\t\t\tprev = ui.placeholder.prev( '.menu-item' );\n\t\t\t\tnext = ui.placeholder.next( '.menu-item' );\n\n\t\t\t\t// Make sure we don't select the moving item.\n\t\t\t\tif( prev[0] == ui.item[0] ) prev = prev.prev( '.menu-item' );\n\t\t\t\tif( next[0] == ui.item[0] ) next = next.next( '.menu-item' );\n\n\t\t\t\tprevBottom = (prev.length) ? prev.offset().top + prev.height() : 0;\n\t\t\t\tnextThreshold = (next.length) ? next.offset().top + next.height() / 3 : 0;\n\t\t\t\tminDepth = (next.length) ? next.menuItemDepth() : 0;\n\n\t\t\t\tif( prev.length )\n\t\t\t\t\tmaxDepth = ( (depth = prev.menuItemDepth() + 1) > api.options.globalMaxDepth ) ? api.options.globalMaxDepth : depth;\n\t\t\t\telse\n\t\t\t\t\tmaxDepth = 0;\n\t\t\t}\n\n\t\t\tfunction updateCurrentDepth(ui, depth) {\n\t\t\t\tui.placeholder.updateDepthClass( depth, currentDepth );\n\t\t\t\tcurrentDepth = depth;\n\t\t\t}\n\n\t\t\tfunction initialMenuMaxDepth() {\n\t\t\t\tif( ! body[0].className ) return 0;\n\t\t\t\tvar match = body[0].className.match(/menu-max-depth-(\\d+)/);\n\t\t\t\treturn match && match[1] ? parseInt( match[1], 10 ) : 0;\n\t\t\t}\n\n\t\t\tfunction updateMenuMaxDepth( depthChange ) {\n\t\t\t\tvar depth, newDepth = menuMaxDepth;\n\t\t\t\tif ( depthChange === 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t} else if ( depthChange > 0 ) {\n\t\t\t\t\tdepth = maxChildDepth + depthChange;\n\t\t\t\t\tif( depth > menuMaxDepth )\n\t\t\t\t\t\tnewDepth = depth;\n\t\t\t\t} else if ( depthChange < 0 && maxChildDepth == menuMaxDepth ) {\n\t\t\t\t\twhile( ! $('.menu-item-depth-' + newDepth, api.menuList).length && newDepth > 0 )\n\t\t\t\t\t\tnewDepth--;\n\t\t\t\t}\n\t\t\t\t// Update the depth class.\n\t\t\t\tbody.removeClass( 'menu-max-depth-' + menuMaxDepth ).addClass( 'menu-max-depth-' + newDepth );\n\t\t\t\tmenuMaxDepth = newDepth;\n\t\t\t}\n\t\t},\n\n\t\tinitManageLocations : function () {\n\t\t\t$('#menu-locations-wrap form').submit(function(){\n\t\t\t\twindow.onbeforeunload = null;\n\t\t\t});\n\t\t\t$('.menu-location-menus select').on('change', function () {\n\t\t\t\tvar editLink = $(this).closest('tr').find('.locations-edit-menu-link');\n\t\t\t\tif ($(this).find('option:selected').data('orig'))\n\t\t\t\t\teditLink.show();\n\t\t\t\telse\n\t\t\t\t\teditLink.hide();\n\t\t\t});\n\t\t},\n\n\t\tattachMenuEditListeners : function() {\n\t\t\tvar that = this;\n\t\t\t$('#update-nav-menu').bind('click', function(e) {\n\t\t\t\tif ( e.target && e.target.className ) {\n\t\t\t\t\tif ( -1 != e.target.className.indexOf('item-edit') ) {\n\t\t\t\t\t\treturn that.eventOnClickEditLink(e.target);\n\t\t\t\t\t} else if ( -1 != e.target.className.indexOf('menu-save') ) {\n\t\t\t\t\t\treturn that.eventOnClickMenuSave(e.target);\n\t\t\t\t\t} else if ( -1 != e.target.className.indexOf('menu-delete') ) {\n\t\t\t\t\t\treturn that.eventOnClickMenuDelete(e.target);\n\t\t\t\t\t} else if ( -1 != e.target.className.indexOf('item-delete') ) {\n\t\t\t\t\t\treturn that.eventOnClickMenuItemDelete(e.target);\n\t\t\t\t\t} else if ( -1 != e.target.className.indexOf('item-cancel') ) {\n\t\t\t\t\t\treturn that.eventOnClickCancelLink(e.target);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t$('#add-custom-links input[type=\"text\"]').keypress(function(e){\n\t\t\t\t$('#customlinkdiv').removeClass('form-invalid');\n\n\t\t\t\tif ( e.keyCode === 13 ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t$( '#submit-customlinkdiv' ).click();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * An interface for managing default values for input elements\n\t\t * that is both JS and accessibility-friendly.\n\t\t *\n\t\t * Input elements that add the class 'input-with-default-title'\n\t\t * will have their values set to the provided HTML title when empty.\n\t\t */\n\t\tsetupInputWithDefaultTitle : function() {\n\t\t\tvar name = 'input-with-default-title';\n\n\t\t\t$('.' + name).each( function(){\n\t\t\t\tvar $t = $(this), title = $t.attr('title'), val = $t.val();\n\t\t\t\t$t.data( name, title );\n\n\t\t\t\tif( '' === val ) $t.val( title );\n\t\t\t\telse if ( title == val ) return;\n\t\t\t\telse $t.removeClass( name );\n\t\t\t}).focus( function(){\n\t\t\t\tvar $t = $(this);\n\t\t\t\tif( $t.val() == $t.data(name) )\n\t\t\t\t\t$t.val('').removeClass( name );\n\t\t\t}).blur( function(){\n\t\t\t\tvar $t = $(this);\n\t\t\t\tif( '' === $t.val() )\n\t\t\t\t\t$t.addClass( name ).val( $t.data(name) );\n\t\t\t});\n\n\t\t\t$( '.blank-slate .input-with-default-title' ).focus();\n\t\t},\n\n\t\tattachThemeLocationsListeners : function() {\n\t\t\tvar loc = $('#nav-menu-theme-locations'), params = {};\n\t\t\tparams.action = 'menu-locations-save';\n\t\t\tparams['menu-settings-column-nonce'] = $('#menu-settings-column-nonce').val();\n\t\t\tloc.find('input[type=\"submit\"]').click(function() {\n\t\t\t\tloc.find('select').each(function() {\n\t\t\t\t\tparams[this.name] = $(this).val();\n\t\t\t\t});\n\t\t\t\tloc.find( '.spinner' ).addClass( 'is-active' );\n\t\t\t\t$.post( ajaxurl, params, function() {\n\t\t\t\t\tloc.find( '.spinner' ).removeClass( 'is-active' );\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t});\n\t\t},\n\n\t\tattachQuickSearchListeners : function() {\n\t\t\tvar searchTimer;\n\n\t\t\t$('.quick-search').keypress(function(e){\n\t\t\t\tvar t = $(this);\n\n\t\t\t\tif( 13 == e.which ) {\n\t\t\t\t\tapi.updateQuickSearchResults( t );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif( searchTimer ) clearTimeout(searchTimer);\n\n\t\t\t\tsearchTimer = setTimeout(function(){\n\t\t\t\t\tapi.updateQuickSearchResults( t );\n\t\t\t\t}, 400);\n\t\t\t}).attr('autocomplete','off');\n\t\t},\n\n\t\tupdateQuickSearchResults : function(input) {\n\t\t\tvar panel, params,\n\t\t\tminSearchLength = 2,\n\t\t\tq = input.val();\n\n\t\t\tif( q.length < minSearchLength ) return;\n\n\t\t\tpanel = input.parents('.tabs-panel');\n\t\t\tparams = {\n\t\t\t\t'action': 'menu-quick-search',\n\t\t\t\t'response-format': 'markup',\n\t\t\t\t'menu': $('#menu').val(),\n\t\t\t\t'menu-settings-column-nonce': $('#menu-settings-column-nonce').val(),\n\t\t\t\t'q': q,\n\t\t\t\t'type': input.attr('name')\n\t\t\t};\n\n\t\t\t$( '.spinner', panel ).addClass( 'is-active' );\n\n\t\t\t$.post( ajaxurl, params, function(menuMarkup) {\n\t\t\t\tapi.processQuickSearchQueryResponse(menuMarkup, params, panel);\n\t\t\t});\n\t\t},\n\n\t\taddCustomLink : function( processMethod ) {\n\t\t\tvar url = $('#custom-menu-item-url').val(),\n\t\t\t\tlabel = $('#custom-menu-item-name').val();\n\n\t\t\tprocessMethod = processMethod || api.addMenuItemToBottom;\n\n\t\t\tif ( '' === url || 'http://' == url ) {\n\t\t\t\t$('#customlinkdiv').addClass('form-invalid');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Show the ajax spinner\n\t\t\t$( '.customlinkdiv .spinner' ).addClass( 'is-active' );\n\t\t\tthis.addLinkToMenu( url, label, processMethod, function() {\n\t\t\t\t// Remove the ajax spinner\n\t\t\t\t$( '.customlinkdiv .spinner' ).removeClass( 'is-active' );\n\t\t\t\t// Set custom link form back to defaults\n\t\t\t\t$('#custom-menu-item-name').val('').blur();\n\t\t\t\t$('#custom-menu-item-url').val('http://');\n\t\t\t});\n\t\t},\n\n\t\taddLinkToMenu : function(url, label, processMethod, callback) {\n\t\t\tprocessMethod = processMethod || api.addMenuItemToBottom;\n\t\t\tcallback = callback || function(){};\n\n\t\t\tapi.addItemToMenu({\n\t\t\t\t'-1': {\n\t\t\t\t\t'menu-item-type': 'custom',\n\t\t\t\t\t'menu-item-url': url,\n\t\t\t\t\t'menu-item-title': label\n\t\t\t\t}\n\t\t\t}, processMethod, callback);\n\t\t},\n\n\t\taddItemToMenu : function(menuItem, processMethod, callback) {\n\t\t\tvar menu = $('#menu').val(),\n\t\t\t\tnonce = $('#menu-settings-column-nonce').val(),\n\t\t\t\tparams;\n\n\t\t\tprocessMethod = processMethod || function(){};\n\t\t\tcallback = callback || function(){};\n\n\t\t\tparams = {\n\t\t\t\t'action': 'add-menu-item',\n\t\t\t\t'menu': menu,\n\t\t\t\t'menu-settings-column-nonce': nonce,\n\t\t\t\t'menu-item': menuItem\n\t\t\t};\n\n\t\t\t$.post( ajaxurl, params, function(menuMarkup) {\n\t\t\t\tvar ins = $('#menu-instructions');\n\n\t\t\t\tmenuMarkup = $.trim( menuMarkup ); // Trim leading whitespaces\n\t\t\t\tprocessMethod(menuMarkup, params);\n\n\t\t\t\t// Make it stand out a bit more visually, by adding a fadeIn\n\t\t\t\t$( 'li.pending' ).hide().fadeIn('slow');\n\t\t\t\t$( '.drag-instructions' ).show();\n\t\t\t\tif( ! ins.hasClass( 'menu-instructions-inactive' ) && ins.siblings().length )\n\t\t\t\t\tins.addClass( 'menu-instructions-inactive' );\n\n\t\t\t\tcallback();\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Process the add menu item request response into menu list item.\n\t\t *\n\t\t * @param string menuMarkup The text server response of menu item markup.\n\t\t * @param object req The request arguments.\n\t\t */\n\t\taddMenuItemToBottom : function( menuMarkup ) {\n\t\t\t$(menuMarkup).hideAdvancedMenuItemFields().appendTo( api.targetList );\n\t\t\tapi.refreshKeyboardAccessibility();\n\t\t\tapi.refreshAdvancedAccessibility();\n\t\t},\n\n\t\taddMenuItemToTop : function( menuMarkup ) {\n\t\t\t$(menuMarkup).hideAdvancedMenuItemFields().prependTo( api.targetList );\n\t\t\tapi.refreshKeyboardAccessibility();\n\t\t\tapi.refreshAdvancedAccessibility();\n\t\t},\n\n\t\tattachUnsavedChangesListener : function() {\n\t\t\t$('#menu-management input, #menu-management select, #menu-management, #menu-management textarea, .menu-location-menus select').change(function(){\n\t\t\t\tapi.registerChange();\n\t\t\t});\n\n\t\t\tif ( 0 !== $('#menu-to-edit').length || 0 !== $('.menu-location-menus select').length ) {\n\t\t\t\twindow.onbeforeunload = function(){\n\t\t\t\t\tif ( api.menusChanged )\n\t\t\t\t\t\treturn navMenuL10n.saveAlert;\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t// Make the post boxes read-only, as they can't be used yet\n\t\t\t\t$( '#menu-settings-column' ).find( 'input,select' ).end().find( 'a' ).attr( 'href', '#' ).unbind( 'click' );\n\t\t\t}\n\t\t},\n\n\t\tregisterChange : function() {\n\t\t\tapi.menusChanged = true;\n\t\t},\n\n\t\tattachTabsPanelListeners : function() {\n\t\t\t$('#menu-settings-column').bind('click', function(e) {\n\t\t\t\tvar selectAreaMatch, panelId, wrapper, items,\n\t\t\t\t\ttarget = $(e.target);\n\n\t\t\t\tif ( target.hasClass('nav-tab-link') ) {\n\n\t\t\t\t\tpanelId = target.data( 'type' );\n\n\t\t\t\t\twrapper = target.parents('.accordion-section-content').first();\n\n\t\t\t\t\t// upon changing tabs, we want to uncheck all checkboxes\n\t\t\t\t\t$('input', wrapper).removeAttr('checked');\n\n\t\t\t\t\t$('.tabs-panel-active', wrapper).removeClass('tabs-panel-active').addClass('tabs-panel-inactive');\n\t\t\t\t\t$('#' + panelId, wrapper).removeClass('tabs-panel-inactive').addClass('tabs-panel-active');\n\n\t\t\t\t\t$('.tabs', wrapper).removeClass('tabs');\n\t\t\t\t\ttarget.parent().addClass('tabs');\n\n\t\t\t\t\t// select the search bar\n\t\t\t\t\t$('.quick-search', wrapper).focus();\n\n\t\t\t\t\te.preventDefault();\n\t\t\t\t} else if ( target.hasClass('select-all') ) {\n\t\t\t\t\tselectAreaMatch = /#(.*)$/.exec(e.target.href);\n\t\t\t\t\tif ( selectAreaMatch && selectAreaMatch[1] ) {\n\t\t\t\t\t\titems = $('#' + selectAreaMatch[1] + ' .tabs-panel-active .menu-item-title input');\n\t\t\t\t\t\tif( items.length === items.filter(':checked').length )\n\t\t\t\t\t\t\titems.removeAttr('checked');\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\titems.prop('checked', true);\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if ( target.hasClass('submit-add-to-menu') ) {\n\t\t\t\t\tapi.registerChange();\n\n\t\t\t\t\tif ( e.target.id && 'submit-customlinkdiv' == e.target.id )\n\t\t\t\t\t\tapi.addCustomLink( api.addMenuItemToBottom );\n\t\t\t\t\telse if ( e.target.id && -1 != e.target.id.indexOf('submit-') )\n\t\t\t\t\t\t$('#' + e.target.id.replace(/submit-/, '')).addSelectedToMenu( api.addMenuItemToBottom );\n\t\t\t\t\treturn false;\n\t\t\t\t} else if ( target.hasClass('page-numbers') ) {\n\t\t\t\t\t$.post( ajaxurl, e.target.href.replace(/.*\\?/, '').replace(/action=([^&]*)/, '') + '&action=menu-get-metabox',\n\t\t\t\t\t\tfunction( resp ) {\n\t\t\t\t\t\t\tif ( -1 == resp.indexOf('replace-id') )\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\tvar metaBoxData = $.parseJSON(resp),\n\t\t\t\t\t\t\ttoReplace = document.getElementById(metaBoxData['replace-id']),\n\t\t\t\t\t\t\tplaceholder = document.createElement('div'),\n\t\t\t\t\t\t\twrap = document.createElement('div');\n\n\t\t\t\t\t\t\tif ( ! metaBoxData.markup || ! toReplace )\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\twrap.innerHTML = metaBoxData.markup ? metaBoxData.markup : '';\n\n\t\t\t\t\t\t\ttoReplace.parentNode.insertBefore( placeholder, toReplace );\n\t\t\t\t\t\t\tplaceholder.parentNode.removeChild( toReplace );\n\n\t\t\t\t\t\t\tplaceholder.parentNode.insertBefore( wrap, placeholder );\n\n\t\t\t\t\t\t\tplaceholder.parentNode.removeChild( placeholder );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\teventOnClickEditLink : function(clickedEl) {\n\t\t\tvar settings, item,\n\t\t\tmatchedSection = /#(.*)$/.exec(clickedEl.href);\n\t\t\tif ( matchedSection && matchedSection[1] ) {\n\t\t\t\tsettings = $('#'+matchedSection[1]);\n\t\t\t\titem = settings.parent();\n\t\t\t\tif( 0 !== item.length ) {\n\t\t\t\t\tif( item.hasClass('menu-item-edit-inactive') ) {\n\t\t\t\t\t\tif( ! settings.data('menu-item-data') ) {\n\t\t\t\t\t\t\tsettings.data( 'menu-item-data', settings.getItemData() );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsettings.slideDown('fast');\n\t\t\t\t\t\titem.removeClass('menu-item-edit-inactive')\n\t\t\t\t\t\t\t.addClass('menu-item-edit-active');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsettings.slideUp('fast');\n\t\t\t\t\t\titem.removeClass('menu-item-edit-active')\n\t\t\t\t\t\t\t.addClass('menu-item-edit-inactive');\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\teventOnClickCancelLink : function(clickedEl) {\n\t\t\tvar settings = $( clickedEl ).closest( '.menu-item-settings' ),\n\t\t\t\tthisMenuItem = $( clickedEl ).closest( '.menu-item' );\n\t\t\tthisMenuItem.removeClass('menu-item-edit-active').addClass('menu-item-edit-inactive');\n\t\t\tsettings.setItemData( settings.data('menu-item-data') ).hide();\n\t\t\treturn false;\n\t\t},\n\n\t\teventOnClickMenuSave : function() {\n\t\t\tvar locs = '',\n\t\t\tmenuName = $('#menu-name'),\n\t\t\tmenuNameVal = menuName.val();\n\t\t\t// Cancel and warn if invalid menu name\n\t\t\tif( !menuNameVal || menuNameVal == menuName.attr('title') || !menuNameVal.replace(/\\s+/, '') ) {\n\t\t\t\tmenuName.parent().addClass('form-invalid');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Copy menu theme locations\n\t\t\t$('#nav-menu-theme-locations select').each(function() {\n\t\t\t\tlocs += '<input type=\"hidden\" name=\"' + this.name + '\" value=\"' + $(this).val() + '\" />';\n\t\t\t});\n\t\t\t$('#update-nav-menu').append( locs );\n\t\t\t// Update menu item position data\n\t\t\tapi.menuList.find('.menu-item-data-position').val( function(index) { return index + 1; } );\n\t\t\twindow.onbeforeunload = null;\n\n\t\t\treturn true;\n\t\t},\n\n\t\teventOnClickMenuDelete : function() {\n\t\t\t// Delete warning AYS\n\t\t\tif ( window.confirm( navMenuL10n.warnDeleteMenu ) ) {\n\t\t\t\twindow.onbeforeunload = null;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\teventOnClickMenuItemDelete : function(clickedEl) {\n\t\t\tvar itemID = parseInt(clickedEl.id.replace('delete-', ''), 10);\n\t\t\tapi.removeMenuItem( $('#menu-item-' + itemID) );\n\t\t\tapi.registerChange();\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * Process the quick search response into a search result\n\t\t *\n\t\t * @param string resp The server response to the query.\n\t\t * @param object req The request arguments.\n\t\t * @param jQuery panel The tabs panel we're searching in.\n\t\t */\n\t\tprocessQuickSearchQueryResponse : function(resp, req, panel) {\n\t\t\tvar matched, newID,\n\t\t\ttakenIDs = {},\n\t\t\tform = document.getElementById('nav-menu-meta'),\n\t\t\tpattern = /menu-item[(\\[^]\\]*/,\n\t\t\t$items = $('<div>').html(resp).find('li'),\n\t\t\t$item;\n\n\t\t\tif( ! $items.length ) {\n\t\t\t\t$('.categorychecklist', panel).html( '<li><p>' + navMenuL10n.noResultsFound + '</p></li>' );\n\t\t\t\t$( '.spinner', panel ).removeClass( 'is-active' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$items.each(function(){\n\t\t\t\t$item = $(this);\n\n\t\t\t\t// make a unique DB ID number\n\t\t\t\tmatched = pattern.exec($item.html());\n\n\t\t\t\tif ( matched && matched[1] ) {\n\t\t\t\t\tnewID = matched[1];\n\t\t\t\t\twhile( form.elements['menu-item[' + newID + '][menu-item-type]'] || takenIDs[ newID ] ) {\n\t\t\t\t\t\tnewID--;\n\t\t\t\t\t}\n\n\t\t\t\t\ttakenIDs[newID] = true;\n\t\t\t\t\tif ( newID != matched[1] ) {\n\t\t\t\t\t\t$item.html( $item.html().replace(new RegExp(\n\t\t\t\t\t\t\t'menu-item\\\\[' + matched[1] + '\\\\]', 'g'),\n\t\t\t\t\t\t\t'menu-item[' + newID + ']'\n\t\t\t\t\t\t) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t$('.categorychecklist', panel).html( $items );\n\t\t\t$( '.spinner', panel ).removeClass( 'is-active' );\n\t\t},\n\n\t\tremoveMenuItem : function(el) {\n\t\t\tvar children = el.childMenuItems();\n\n\t\t\tel.addClass('deleting').animate({\n\t\t\t\t\topacity : 0,\n\t\t\t\t\theight: 0\n\t\t\t\t}, 350, function() {\n\t\t\t\t\tvar ins = $('#menu-instructions');\n\t\t\t\t\tel.remove();\n\t\t\t\t\tchildren.shiftDepthClass( -1 ).updateParentMenuItemDBId();\n\t\t\t\t\tif ( 0 === $( '#menu-to-edit li' ).length ) {\n\t\t\t\t\t\t$( '.drag-instructions' ).hide();\n\t\t\t\t\t\tins.removeClass( 'menu-instructions-inactive' );\n\t\t\t\t\t}\n\t\t\t\t\tapi.refreshAdvancedAccessibility();\n\t\t\t\t});\n\t\t},\n\n\t\tdepthToPx : function(depth) {\n\t\t\treturn depth * api.options.menuItemDepthPerLevel;\n\t\t},\n\n\t\tpxToDepth : function(px) {\n\t\t\treturn Math.floor(px / api.options.menuItemDepthPerLevel);\n\t\t}\n\n\t};\n\n\t$(document).ready(function(){ wpNavMenu.init(); });\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/password-strength-meter.js",
    "content": "/* global zxcvbn */\nwindow.wp = window.wp || {};\n\nvar passwordStrength;\n(function($){\n\twp.passwordStrength = {\n\t\t/**\n\t\t * Determine the strength of a given password\n\t\t *\n\t\t * @param string password1 The password\n\t\t * @param array blacklist An array of words that will lower the entropy of the password\n\t\t * @param string password2 The confirmed password\n\t\t */\n\t\tmeter : function( password1, blacklist, password2 ) {\n\t\t\tif ( ! $.isArray( blacklist ) )\n\t\t\t\tblacklist = [ blacklist.toString() ];\n\n\t\t\tif (password1 != password2 && password2 && password2.length > 0)\n\t\t\t\treturn 5;\n\n\t\t\tvar result = zxcvbn( password1, blacklist );\n\t\t\treturn result.score;\n\t\t},\n\n\t\t/**\n\t\t * Builds an array of data that should be penalized, because it would lower the entropy of a password if it were used\n\t\t *\n\t\t * @return array The array of data to be blacklisted\n\t\t */\n\t\tuserInputBlacklist : function() {\n\t\t\tvar i, userInputFieldsLength, rawValuesLength, currentField,\n\t\t\t\trawValues       = [],\n\t\t\t\tblacklist       = [],\n\t\t\t\tuserInputFields = [ 'user_login', 'first_name', 'last_name', 'nickname', 'display_name', 'email', 'url', 'description', 'weblog_title', 'admin_email' ];\n\n\t\t\t// Collect all the strings we want to blacklist\n\t\t\trawValues.push( document.title );\n\t\t\trawValues.push( document.URL );\n\n\t\t\tuserInputFieldsLength = userInputFields.length;\n\t\t\tfor ( i = 0; i < userInputFieldsLength; i++ ) {\n\t\t\t\tcurrentField = $( '#' + userInputFields[ i ] );\n\n\t\t\t\tif ( 0 === currentField.length ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trawValues.push( currentField[0].defaultValue );\n\t\t\t\trawValues.push( currentField.val() );\n\t\t\t}\n\n\t\t\t// Strip out non-alphanumeric characters and convert each word to an individual entry\n\t\t\trawValuesLength = rawValues.length;\n\t\t\tfor ( i = 0; i < rawValuesLength; i++ ) {\n\t\t\t\tif ( rawValues[ i ] ) {\n\t\t\t\t\tblacklist = blacklist.concat( rawValues[ i ].replace( /\\W/g, ' ' ).split( ' ' ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove empty values, short words, and duplicates. Short words are likely to cause many false positives.\n\t\t\tblacklist = $.grep( blacklist, function( value, key ) {\n\t\t\t\tif ( '' === value || 4 > value.length ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn $.inArray( value, blacklist ) === key;\n\t\t\t});\n\n\t\t\treturn blacklist;\n\t\t}\n\t};\n\n\t// Backwards compatibility.\n\tpasswordStrength = wp.passwordStrength.meter;\n})(jQuery);"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/plugin-install.js",
    "content": "/* global plugininstallL10n, tb_click */\n\n/* Plugin Browser Thickbox related JS*/\nvar tb_position;\njQuery( document ).ready( function( $ ) {\n\ttb_position = function() {\n\t\tvar tbWindow = $( '#TB_window' ),\n\t\t\twidth = $( window ).width(),\n\t\t\tH = $( window ).height() - ( ( 792 < width ) ? 60 : 20 ),\n\t\t\tW = ( 792 < width ) ? 772 : width - 20;\n\n\t\tif ( tbWindow.size() ) {\n\t\t\ttbWindow.width( W ).height( H );\n\t\t\t$( '#TB_iframeContent' ).width( W ).height( H );\n\t\t\ttbWindow.css({\n\t\t\t\t'margin-left': '-' + parseInt( ( W / 2 ), 10 ) + 'px'\n\t\t\t});\n\t\t\tif ( typeof document.body.style.maxWidth !== 'undefined' ) {\n\t\t\t\ttbWindow.css({\n\t\t\t\t\t'top': '30px',\n\t\t\t\t\t'margin-top': '0'\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn $( 'a.thickbox' ).each( function() {\n\t\t\tvar href = $( this ).attr( 'href' );\n\t\t\tif ( ! href ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thref = href.replace( /&width=[0-9]+/g, '' );\n\t\t\thref = href.replace( /&height=[0-9]+/g, '' );\n\t\t\t$(this).attr( 'href', href + '&width=' + W + '&height=' + ( H ) );\n\t\t});\n\t};\n\n\t$( window ).resize( function() {\n\t\ttb_position();\n\t});\n\n\t$( '.plugin-card, .plugins .plugin-version-author-uri' ).on( 'click', 'a.thickbox', function( e ) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\ttb_click.call(this);\n\n\t\t$('#TB_title').css({'background-color':'#23282d','color':'#cfcfcf'});\n\t\t$('#TB_ajaxWindowTitle').html( '<strong>' + plugininstallL10n.plugin_information + '</strong>&nbsp;' + $(this).data( 'title' ) );\n\t\t$('#TB_iframeContent').attr( 'title', plugininstallL10n.plugin_information + ' ' + $(this).data( 'title' ) );\n\t\t$('#TB_closeWindowButton').focus();\n\t});\n\n\t/* Plugin install related JS */\n\t$( '#plugin-information-tabs a' ).click( function( event ) {\n\t\tvar tab = $( this ).attr( 'name' );\n\t\tevent.preventDefault();\n\n\t\t// Flip the tab\n\t\t$( '#plugin-information-tabs a.current' ).removeClass( 'current' );\n\t\t$( this ).addClass( 'current' );\n\n\t\t// Only show the fyi box in the description section, on smaller screen, where it's otherwise always displayed at the top.\n\t\tif ( 'description' !== tab && $( window ).width() < 772 ) {\n\t\t\t$( '#plugin-information-content' ).find( '.fyi' ).hide();\n\t\t} else {\n\t\t\t$( '#plugin-information-content' ).find( '.fyi' ).show();\n\t\t}\n\n\t\t// Flip the content.\n\t\t$( '#section-holder div.section' ).hide(); // Hide 'em all.\n\t\t$( '#section-' + tab ).show();\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/post.js",
    "content": "/* global postL10n, ajaxurl, wpAjax, setPostThumbnailL10n, postboxes, pagenow, tinymce, alert, deleteUserSetting */\n/* global theList:true, theExtraList:true, getUserSetting, setUserSetting, commentReply */\n\nvar commentsBox, WPSetThumbnailHTML, WPSetThumbnailID, WPRemoveThumbnail, wptitlehint, makeSlugeditClickable, editPermalink;\n// Back-compat: prevent fatal errors\nmakeSlugeditClickable = editPermalink = function(){};\n\nwindow.wp = window.wp || {};\n\n( function( $ ) {\n\tvar titleHasFocus = false;\n\ncommentsBox = {\n\tst : 0,\n\n\tget : function(total, num) {\n\t\tvar st = this.st, data;\n\t\tif ( ! num )\n\t\t\tnum = 20;\n\n\t\tthis.st += num;\n\t\tthis.total = total;\n\t\t$( '#commentsdiv .spinner' ).addClass( 'is-active' );\n\n\t\tdata = {\n\t\t\t'action' : 'get-comments',\n\t\t\t'mode' : 'single',\n\t\t\t'_ajax_nonce' : $('#add_comment_nonce').val(),\n\t\t\t'p' : $('#post_ID').val(),\n\t\t\t'start' : st,\n\t\t\t'number' : num\n\t\t};\n\n\t\t$.post(ajaxurl, data,\n\t\t\tfunction(r) {\n\t\t\t\tr = wpAjax.parseAjaxResponse(r);\n\t\t\t\t$('#commentsdiv .widefat').show();\n\t\t\t\t$( '#commentsdiv .spinner' ).removeClass( 'is-active' );\n\n\t\t\t\tif ( 'object' == typeof r && r.responses[0] ) {\n\t\t\t\t\t$('#the-comment-list').append( r.responses[0].data );\n\n\t\t\t\t\ttheList = theExtraList = null;\n\t\t\t\t\t$( 'a[className*=\\':\\']' ).unbind();\n\n\t\t\t\t\tif ( commentsBox.st > commentsBox.total )\n\t\t\t\t\t\t$('#show-comments').hide();\n\t\t\t\t\telse\n\t\t\t\t\t\t$('#show-comments').show().children('a').html(postL10n.showcomm);\n\n\t\t\t\t\treturn;\n\t\t\t\t} else if ( 1 == r ) {\n\t\t\t\t\t$('#show-comments').html(postL10n.endcomm);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$('#the-comment-list').append('<tr><td colspan=\"2\">'+wpAjax.broken+'</td></tr>');\n\t\t\t}\n\t\t);\n\n\t\treturn false;\n\t},\n\n\tload: function(total){\n\t\tthis.st = jQuery('#the-comment-list tr.comment:visible').length;\n\t\tthis.get(total);\n\t}\n};\n\nWPSetThumbnailHTML = function(html){\n\t$('.inside', '#postimagediv').html(html);\n};\n\nWPSetThumbnailID = function(id){\n\tvar field = $('input[value=\"_thumbnail_id\"]', '#list-table');\n\tif ( field.size() > 0 ) {\n\t\t$('#meta\\\\[' + field.attr('id').match(/[0-9]+/) + '\\\\]\\\\[value\\\\]').text(id);\n\t}\n};\n\nWPRemoveThumbnail = function(nonce){\n\t$.post(ajaxurl, {\n\t\taction: 'set-post-thumbnail', post_id: $( '#post_ID' ).val(), thumbnail_id: -1, _ajax_nonce: nonce, cookie: encodeURIComponent( document.cookie )\n\t}, function(str){\n\t\tif ( str == '0' ) {\n\t\t\talert( setPostThumbnailL10n.error );\n\t\t} else {\n\t\t\tWPSetThumbnailHTML(str);\n\t\t}\n\t}\n\t);\n};\n\n$(document).on( 'heartbeat-send.refresh-lock', function( e, data ) {\n\tvar lock = $('#active_post_lock').val(),\n\t\tpost_id = $('#post_ID').val(),\n\t\tsend = {};\n\n\tif ( ! post_id || ! $('#post-lock-dialog').length )\n\t\treturn;\n\n\tsend.post_id = post_id;\n\n\tif ( lock )\n\t\tsend.lock = lock;\n\n\tdata['wp-refresh-post-lock'] = send;\n\n}).on( 'heartbeat-tick.refresh-lock', function( e, data ) {\n\t// Post locks: update the lock string or show the dialog if somebody has taken over editing\n\tvar received, wrap, avatar;\n\n\tif ( data['wp-refresh-post-lock'] ) {\n\t\treceived = data['wp-refresh-post-lock'];\n\n\t\tif ( received.lock_error ) {\n\t\t\t// show \"editing taken over\" message\n\t\t\twrap = $('#post-lock-dialog');\n\n\t\t\tif ( wrap.length && ! wrap.is(':visible') ) {\n\t\t\t\tif ( wp.autosave ) {\n\t\t\t\t\t// Save the latest changes and disable\n\t\t\t\t\t$(document).one( 'heartbeat-tick', function() {\n\t\t\t\t\t\twp.autosave.server.suspend();\n\t\t\t\t\t\twrap.removeClass('saving').addClass('saved');\n\t\t\t\t\t\t$(window).off( 'beforeunload.edit-post' );\n\t\t\t\t\t});\n\n\t\t\t\t\twrap.addClass('saving');\n\t\t\t\t\twp.autosave.server.triggerSave();\n\t\t\t\t}\n\n\t\t\t\tif ( received.lock_error.avatar_src ) {\n\t\t\t\t\tavatar = $( '<img class=\"avatar avatar-64 photo\" width=\"64\" height=\"64\" alt=\"\" />' ).attr( 'src', received.lock_error.avatar_src.replace( /&amp;/g, '&' ) );\n\t\t\t\t\twrap.find('div.post-locked-avatar').empty().append( avatar );\n\t\t\t\t}\n\n\t\t\t\twrap.show().find('.currently-editing').text( received.lock_error.text );\n\t\t\t\twrap.find('.wp-tab-first').focus();\n\t\t\t}\n\t\t} else if ( received.new_lock ) {\n\t\t\t$('#active_post_lock').val( received.new_lock );\n\t\t}\n\t}\n}).on( 'before-autosave.update-post-slug', function() {\n\ttitleHasFocus = document.activeElement && document.activeElement.id === 'title';\n}).on( 'after-autosave.update-post-slug', function() {\n\t// Create slug area only if not already there\n\t// and the title field was not focused (user was not typing a title) when autosave ran\n\tif ( ! $('#edit-slug-box > *').length && ! titleHasFocus ) {\n\t\t$.post( ajaxurl, {\n\t\t\t\taction: 'sample-permalink',\n\t\t\t\tpost_id: $('#post_ID').val(),\n\t\t\t\tnew_title: $('#title').val(),\n\t\t\t\tsamplepermalinknonce: $('#samplepermalinknonce').val()\n\t\t\t},\n\t\t\tfunction( data ) {\n\t\t\t\tif ( data != '-1' ) {\n\t\t\t\t\t$('#edit-slug-box').html(data);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n});\n\n}(jQuery));\n\n(function($) {\n\tvar check, timeout;\n\n\tfunction schedule() {\n\t\tcheck = false;\n\t\twindow.clearTimeout( timeout );\n\t\ttimeout = window.setTimeout( function(){ check = true; }, 300000 );\n\t}\n\n\t$(document).on( 'heartbeat-send.wp-refresh-nonces', function( e, data ) {\n\t\tvar post_id,\n\t\t\t$authCheck = $('#wp-auth-check-wrap');\n\n\t\tif ( check || ( $authCheck.length && ! $authCheck.hasClass( 'hidden' ) ) ) {\n\t\t\tif ( ( post_id = $('#post_ID').val() ) && $('#_wpnonce').val() ) {\n\t\t\t\tdata['wp-refresh-post-nonces'] = {\n\t\t\t\t\tpost_id: post_id\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}).on( 'heartbeat-tick.wp-refresh-nonces', function( e, data ) {\n\t\tvar nonces = data['wp-refresh-post-nonces'];\n\n\t\tif ( nonces ) {\n\t\t\tschedule();\n\n\t\t\tif ( nonces.replace ) {\n\t\t\t\t$.each( nonces.replace, function( selector, value ) {\n\t\t\t\t\t$( '#' + selector ).val( value );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( nonces.heartbeatNonce )\n\t\t\t\twindow.heartbeatSettings.nonce = nonces.heartbeatNonce;\n\t\t}\n\t}).ready( function() {\n\t\tschedule();\n\t});\n}(jQuery));\n\njQuery(document).ready( function($) {\n\tvar stamp, visibility, $submitButtons, updateVisibility, updateText,\n\t\tsticky = '',\n\t\t$textarea = $('#content'),\n\t\t$document = $(document),\n\t\tpostId = $('#post_ID').val() || 0,\n\t\t$submitpost = $('#submitpost'),\n\t\treleaseLock = true,\n\t\t$postVisibilitySelect = $('#post-visibility-select'),\n\t\t$timestampdiv = $('#timestampdiv'),\n\t\t$postStatusSelect = $('#post-status-select'),\n\t\tisMac = window.navigator.platform ? window.navigator.platform.indexOf( 'Mac' ) !== -1 : false;\n\n\tpostboxes.add_postbox_toggles(pagenow);\n\n\t// Clear the window name. Otherwise if this is a former preview window where the user navigated to edit another post,\n\t// and the first post is still being edited, clicking Preview there will use this window to show the preview.\n\twindow.name = '';\n\n\t// Post locks: contain focus inside the dialog. If the dialog is shown, focus the first item.\n\t$('#post-lock-dialog .notification-dialog').on( 'keydown', function(e) {\n\t\tif ( e.which != 9 )\n\t\t\treturn;\n\n\t\tvar target = $(e.target);\n\n\t\tif ( target.hasClass('wp-tab-first') && e.shiftKey ) {\n\t\t\t$(this).find('.wp-tab-last').focus();\n\t\t\te.preventDefault();\n\t\t} else if ( target.hasClass('wp-tab-last') && ! e.shiftKey ) {\n\t\t\t$(this).find('.wp-tab-first').focus();\n\t\t\te.preventDefault();\n\t\t}\n\t}).filter(':visible').find('.wp-tab-first').focus();\n\n\t// Set the heartbeat interval to 15 sec. if post lock dialogs are enabled\n\tif ( wp.heartbeat && $('#post-lock-dialog').length ) {\n\t\twp.heartbeat.interval( 15 );\n\t}\n\n\t// The form is being submitted by the user\n\t$submitButtons = $submitpost.find( ':submit, a.submitdelete, #post-preview' ).on( 'click.edit-post', function( event ) {\n\t\tvar $button = $(this);\n\n\t\tif ( $button.hasClass('disabled') ) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( $button.hasClass('submitdelete') || $button.is( '#post-preview' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// The form submission can be blocked from JS or by using HTML 5.0 validation on some fields.\n\t\t// Run this only on an actual 'submit'.\n\t\t$('form#post').off( 'submit.edit-post' ).on( 'submit.edit-post', function( event ) {\n\t\t\tif ( event.isDefaultPrevented() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Stop autosave\n\t\t\tif ( wp.autosave ) {\n\t\t\t\twp.autosave.server.suspend();\n\t\t\t}\n\n\t\t\tif ( typeof commentReply !== 'undefined' ) {\n\t\t\t\t/*\n\t\t\t\t * Close the comment edit/reply form if open to stop the form\n\t\t\t\t * action from interfering with the post's form action.\n\t\t\t\t */\n\t\t\t\tcommentReply.close();\n\t\t\t}\n\n\t\t\treleaseLock = false;\n\t\t\t$(window).off( 'beforeunload.edit-post' );\n\n\t\t\t$submitButtons.addClass( 'disabled' );\n\n\t\t\tif ( $button.attr('id') === 'publish' ) {\n\t\t\t\t$submitpost.find( '#major-publishing-actions .spinner' ).addClass( 'is-active' );\n\t\t\t} else {\n\t\t\t\t$submitpost.find( '#minor-publishing .spinner' ).addClass( 'is-active' );\n\t\t\t}\n\t\t});\n\t});\n\n\t// Submit the form saving a draft or an autosave, and show a preview in a new tab\n\t$('#post-preview').on( 'click.post-preview', function( event ) {\n\t\tvar $this = $(this),\n\t\t\t$form = $('form#post'),\n\t\t\t$previewField = $('input#wp-preview'),\n\t\t\ttarget = $this.attr('target') || 'wp-preview',\n\t\t\tua = navigator.userAgent.toLowerCase();\n\n\t\tevent.preventDefault();\n\n\t\tif ( $this.hasClass('disabled') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( wp.autosave ) {\n\t\t\twp.autosave.server.tempBlockSave();\n\t\t}\n\n\t\t$previewField.val('dopreview');\n\t\t$form.attr( 'target', target ).submit().attr( 'target', '' );\n\n\t\t// Workaround for WebKit bug preventing a form submitting twice to the same action.\n\t\t// https://bugs.webkit.org/show_bug.cgi?id=28633\n\t\tif ( ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1 ) {\n\t\t\t$form.attr( 'action', function( index, value ) {\n\t\t\t\treturn value + '?t=' + ( new Date() ).getTime();\n\t\t\t});\n\t\t}\n\n\t\t$previewField.val('');\n\t});\n\n\t// This code is meant to allow tabbing from Title to Post content.\n\t$('#title').on( 'keydown.editor-focus', function( event ) {\n\t\tvar editor;\n\n\t\tif ( event.keyCode === 9 && ! event.ctrlKey && ! event.altKey && ! event.shiftKey ) {\n\t\t\teditor = typeof tinymce != 'undefined' && tinymce.get('content');\n\n\t\t\tif ( editor && ! editor.isHidden() ) {\n\t\t\t\teditor.focus();\n\t\t\t} else if ( $textarea.length ) {\n\t\t\t\t$textarea.focus();\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tevent.preventDefault();\n\t\t}\n\t});\n\n\t// Autosave new posts after a title is typed\n\tif ( $( '#auto_draft' ).val() ) {\n\t\t$( '#title' ).blur( function() {\n\t\t\tvar cancel;\n\n\t\t\tif ( ! this.value || $('#edit-slug-box > *').length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Cancel the autosave when the blur was triggered by the user submitting the form\n\t\t\t$('form#post').one( 'submit', function() {\n\t\t\t\tcancel = true;\n\t\t\t});\n\n\t\t\twindow.setTimeout( function() {\n\t\t\t\tif ( ! cancel && wp.autosave ) {\n\t\t\t\t\twp.autosave.server.triggerSave();\n\t\t\t\t}\n\t\t\t}, 200 );\n\t\t});\n\t}\n\n\t$document.on( 'autosave-disable-buttons.edit-post', function() {\n\t\t$submitButtons.addClass( 'disabled' );\n\t}).on( 'autosave-enable-buttons.edit-post', function() {\n\t\tif ( ! wp.heartbeat || ! wp.heartbeat.hasConnectionError() ) {\n\t\t\t$submitButtons.removeClass( 'disabled' );\n\t\t}\n\t}).on( 'before-autosave.edit-post', function() {\n\t\t$( '.autosave-message' ).text( postL10n.savingText );\n\t}).on( 'after-autosave.edit-post', function( event, data ) {\n\t\t$( '.autosave-message' ).text( data.message );\n\t});\n\n\t$(window).on( 'beforeunload.edit-post', function() {\n\t\tvar editor = typeof tinymce !== 'undefined' && tinymce.get('content');\n\n\t\tif ( ( editor && ! editor.isHidden() && editor.isDirty() ) ||\n\t\t\t( wp.autosave && wp.autosave.server.postChanged() ) ) {\n\n\t\t\treturn postL10n.saveAlert;\n\t\t}\n\t}).on( 'unload.edit-post', function( event ) {\n\t\tif ( ! releaseLock ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Unload is triggered (by hand) on removing the Thickbox iframe.\n\t\t// Make sure we process only the main document unload.\n\t\tif ( event.target && event.target.nodeName != '#document' ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$.ajax({\n\t\t\ttype: 'POST',\n\t\t\turl: ajaxurl,\n\t\t\tasync: false,\n\t\t\tdata: {\n\t\t\t\taction: 'wp-remove-post-lock',\n\t\t\t\t_wpnonce: $('#_wpnonce').val(),\n\t\t\t\tpost_ID: $('#post_ID').val(),\n\t\t\t\tactive_post_lock: $('#active_post_lock').val()\n\t\t\t}\n\t\t});\n\t});\n\n\t// multi-taxonomies\n\tif ( $('#tagsdiv-post_tag').length ) {\n\t\twindow.tagBox && window.tagBox.init();\n\t} else {\n\t\t$('#side-sortables, #normal-sortables, #advanced-sortables').children('div.postbox').each(function(){\n\t\t\tif ( this.id.indexOf('tagsdiv-') === 0 ) {\n\t\t\t\twindow.tagBox && window.tagBox.init();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\t// categories\n\t$('.categorydiv').each( function(){\n\t\tvar this_id = $(this).attr('id'), catAddBefore, catAddAfter, taxonomyParts, taxonomy, settingName;\n\n\t\ttaxonomyParts = this_id.split('-');\n\t\ttaxonomyParts.shift();\n\t\ttaxonomy = taxonomyParts.join('-');\n\t\tsettingName = taxonomy + '_tab';\n\t\tif ( taxonomy == 'category' )\n\t\t\tsettingName = 'cats';\n\n\t\t// TODO: move to jQuery 1.3+, support for multiple hierarchical taxonomies, see wp-lists.js\n\t\t$('a', '#' + taxonomy + '-tabs').click( function( e ) {\n\t\t\te.preventDefault();\n\t\t\tvar t = $(this).attr('href');\n\t\t\t$(this).parent().addClass('tabs').siblings('li').removeClass('tabs');\n\t\t\t$('#' + taxonomy + '-tabs').siblings('.tabs-panel').hide();\n\t\t\t$(t).show();\n\t\t\tif ( '#' + taxonomy + '-all' == t )\n\t\t\t\tdeleteUserSetting( settingName );\n\t\t\telse\n\t\t\t\tsetUserSetting( settingName, 'pop' );\n\t\t});\n\n\t\tif ( getUserSetting( settingName ) )\n\t\t\t$('a[href=\"#' + taxonomy + '-pop\"]', '#' + taxonomy + '-tabs').click();\n\n\t\t// Ajax Cat\n\t\t$( '#new' + taxonomy ).one( 'focus', function() { $( this ).val( '' ).removeClass( 'form-input-tip' ); } );\n\n\t\t$('#new' + taxonomy).keypress( function(event){\n\t\t\tif( 13 === event.keyCode ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t$('#' + taxonomy + '-add-submit').click();\n\t\t\t}\n\t\t});\n\t\t$('#' + taxonomy + '-add-submit').click( function(){ $('#new' + taxonomy).focus(); });\n\n\t\tcatAddBefore = function( s ) {\n\t\t\tif ( !$('#new'+taxonomy).val() )\n\t\t\t\treturn false;\n\t\t\ts.data += '&' + $( ':checked', '#'+taxonomy+'checklist' ).serialize();\n\t\t\t$( '#' + taxonomy + '-add-submit' ).prop( 'disabled', true );\n\t\t\treturn s;\n\t\t};\n\n\t\tcatAddAfter = function( r, s ) {\n\t\t\tvar sup, drop = $('#new'+taxonomy+'_parent');\n\n\t\t\t$( '#' + taxonomy + '-add-submit' ).prop( 'disabled', false );\n\t\t\tif ( 'undefined' != s.parsed.responses[0] && (sup = s.parsed.responses[0].supplemental.newcat_parent) ) {\n\t\t\t\tdrop.before(sup);\n\t\t\t\tdrop.remove();\n\t\t\t}\n\t\t};\n\n\t\t$('#' + taxonomy + 'checklist').wpList({\n\t\t\talt: '',\n\t\t\tresponse: taxonomy + '-ajax-response',\n\t\t\taddBefore: catAddBefore,\n\t\t\taddAfter: catAddAfter\n\t\t});\n\n\t\t$('#' + taxonomy + '-add-toggle').click( function( e ) {\n\t\t\te.preventDefault();\n\t\t\t$('#' + taxonomy + '-adder').toggleClass( 'wp-hidden-children' );\n\t\t\t$('a[href=\"#' + taxonomy + '-all\"]', '#' + taxonomy + '-tabs').click();\n\t\t\t$('#new'+taxonomy).focus();\n\t\t});\n\n\t\t$('#' + taxonomy + 'checklist, #' + taxonomy + 'checklist-pop').on( 'click', 'li.popular-category > label input[type=\"checkbox\"]', function() {\n\t\t\tvar t = $(this), c = t.is(':checked'), id = t.val();\n\t\t\tif ( id && t.parents('#taxonomy-'+taxonomy).length )\n\t\t\t\t$('#in-' + taxonomy + '-' + id + ', #in-popular-' + taxonomy + '-' + id).prop( 'checked', c );\n\t\t});\n\n\t}); // end cats\n\n\t// Custom Fields\n\tif ( $('#postcustom').length ) {\n\t\t$( '#the-list' ).wpList( { addAfter: function() {\n\t\t\t$('table#list-table').show();\n\t\t}, addBefore: function( s ) {\n\t\t\ts.data += '&post_id=' + $('#post_ID').val();\n\t\t\treturn s;\n\t\t}\n\t\t});\n\t}\n\n\t// submitdiv\n\tif ( $('#submitdiv').length ) {\n\t\tstamp = $('#timestamp').html();\n\t\tvisibility = $('#post-visibility-display').html();\n\n\t\tupdateVisibility = function() {\n\t\t\tif ( $postVisibilitySelect.find('input:radio:checked').val() != 'public' ) {\n\t\t\t\t$('#sticky').prop('checked', false);\n\t\t\t\t$('#sticky-span').hide();\n\t\t\t} else {\n\t\t\t\t$('#sticky-span').show();\n\t\t\t}\n\t\t\tif ( $postVisibilitySelect.find('input:radio:checked').val() != 'password' ) {\n\t\t\t\t$('#password-span').hide();\n\t\t\t} else {\n\t\t\t\t$('#password-span').show();\n\t\t\t}\n\t\t};\n\n\t\tupdateText = function() {\n\n\t\t\tif ( ! $timestampdiv.length )\n\t\t\t\treturn true;\n\n\t\t\tvar attemptedDate, originalDate, currentDate, publishOn, postStatus = $('#post_status'),\n\t\t\t\toptPublish = $('option[value=\"publish\"]', postStatus), aa = $('#aa').val(),\n\t\t\t\tmm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val();\n\n\t\t\tattemptedDate = new Date( aa, mm - 1, jj, hh, mn );\n\t\t\toriginalDate = new Date( $('#hidden_aa').val(), $('#hidden_mm').val() -1, $('#hidden_jj').val(), $('#hidden_hh').val(), $('#hidden_mn').val() );\n\t\t\tcurrentDate = new Date( $('#cur_aa').val(), $('#cur_mm').val() -1, $('#cur_jj').val(), $('#cur_hh').val(), $('#cur_mn').val() );\n\n\t\t\tif ( attemptedDate.getFullYear() != aa || (1 + attemptedDate.getMonth()) != mm || attemptedDate.getDate() != jj || attemptedDate.getMinutes() != mn ) {\n\t\t\t\t$timestampdiv.find('.timestamp-wrap').addClass('form-invalid');\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\t$timestampdiv.find('.timestamp-wrap').removeClass('form-invalid');\n\t\t\t}\n\n\t\t\tif ( attemptedDate > currentDate && $('#original_post_status').val() != 'future' ) {\n\t\t\t\tpublishOn = postL10n.publishOnFuture;\n\t\t\t\t$('#publish').val( postL10n.schedule );\n\t\t\t} else if ( attemptedDate <= currentDate && $('#original_post_status').val() != 'publish' ) {\n\t\t\t\tpublishOn = postL10n.publishOn;\n\t\t\t\t$('#publish').val( postL10n.publish );\n\t\t\t} else {\n\t\t\t\tpublishOn = postL10n.publishOnPast;\n\t\t\t\t$('#publish').val( postL10n.update );\n\t\t\t}\n\t\t\tif ( originalDate.toUTCString() == attemptedDate.toUTCString() ) { //hack\n\t\t\t\t$('#timestamp').html(stamp);\n\t\t\t} else {\n\t\t\t\t$('#timestamp').html(\n\t\t\t\t\t'\\n' + publishOn + ' <b>' +\n\t\t\t\t\tpostL10n.dateFormat\n\t\t\t\t\t\t.replace( '%1$s', $( 'option[value=\"' + mm + '\"]', '#mm' ).attr( 'data-text' ) )\n\t\t\t\t\t\t.replace( '%2$s', parseInt( jj, 10 ) )\n\t\t\t\t\t\t.replace( '%3$s', aa )\n\t\t\t\t\t\t.replace( '%4$s', ( '00' + hh ).slice( -2 ) )\n\t\t\t\t\t\t.replace( '%5$s', ( '00' + mn ).slice( -2 ) ) +\n\t\t\t\t\t\t'</b> '\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif ( $postVisibilitySelect.find('input:radio:checked').val() == 'private' ) {\n\t\t\t\t$('#publish').val( postL10n.update );\n\t\t\t\tif ( 0 === optPublish.length ) {\n\t\t\t\t\tpostStatus.append('<option value=\"publish\">' + postL10n.privatelyPublished + '</option>');\n\t\t\t\t} else {\n\t\t\t\t\toptPublish.html( postL10n.privatelyPublished );\n\t\t\t\t}\n\t\t\t\t$('option[value=\"publish\"]', postStatus).prop('selected', true);\n\t\t\t\t$('#misc-publishing-actions .edit-post-status').hide();\n\t\t\t} else {\n\t\t\t\tif ( $('#original_post_status').val() == 'future' || $('#original_post_status').val() == 'draft' ) {\n\t\t\t\t\tif ( optPublish.length ) {\n\t\t\t\t\t\toptPublish.remove();\n\t\t\t\t\t\tpostStatus.val($('#hidden_post_status').val());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptPublish.html( postL10n.published );\n\t\t\t\t}\n\t\t\t\tif ( postStatus.is(':hidden') )\n\t\t\t\t\t$('#misc-publishing-actions .edit-post-status').show();\n\t\t\t}\n\t\t\t$('#post-status-display').html($('option:selected', postStatus).text());\n\t\t\tif ( $('option:selected', postStatus).val() == 'private' || $('option:selected', postStatus).val() == 'publish' ) {\n\t\t\t\t$('#save-post').hide();\n\t\t\t} else {\n\t\t\t\t$('#save-post').show();\n\t\t\t\tif ( $('option:selected', postStatus).val() == 'pending' ) {\n\t\t\t\t\t$('#save-post').show().val( postL10n.savePending );\n\t\t\t\t} else {\n\t\t\t\t\t$('#save-post').show().val( postL10n.saveDraft );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\t$( '#visibility .edit-visibility').click( function( e ) {\n\t\t\te.preventDefault();\n\t\t\tif ( $postVisibilitySelect.is(':hidden') ) {\n\t\t\t\tupdateVisibility();\n\t\t\t\t$postVisibilitySelect.slideDown( 'fast', function() {\n\t\t\t\t\t$postVisibilitySelect.find( 'input[type=\"radio\"]' ).first().focus();\n\t\t\t\t} );\n\t\t\t\t$(this).hide();\n\t\t\t}\n\t\t});\n\n\t\t$postVisibilitySelect.find('.cancel-post-visibility').click( function( event ) {\n\t\t\t$postVisibilitySelect.slideUp('fast');\n\t\t\t$('#visibility-radio-' + $('#hidden-post-visibility').val()).prop('checked', true);\n\t\t\t$('#post_password').val($('#hidden-post-password').val());\n\t\t\t$('#sticky').prop('checked', $('#hidden-post-sticky').prop('checked'));\n\t\t\t$('#post-visibility-display').html(visibility);\n\t\t\t$('#visibility .edit-visibility').show().focus();\n\t\t\tupdateText();\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t$postVisibilitySelect.find('.save-post-visibility').click( function( event ) { // crazyhorse - multiple ok cancels\n\t\t\t$postVisibilitySelect.slideUp('fast');\n\t\t\t$('#visibility .edit-visibility').show().focus();\n\t\t\tupdateText();\n\n\t\t\tif ( $postVisibilitySelect.find('input:radio:checked').val() != 'public' ) {\n\t\t\t\t$('#sticky').prop('checked', false);\n\t\t\t} // WEAPON LOCKED\n\n\t\t\tif ( $('#sticky').prop('checked') ) {\n\t\t\t\tsticky = 'Sticky';\n\t\t\t} else {\n\t\t\t\tsticky = '';\n\t\t\t}\n\n\t\t\t$('#post-visibility-display').html(\tpostL10n[ $postVisibilitySelect.find('input:radio:checked').val() + sticky ]\t);\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t$postVisibilitySelect.find('input:radio').change( function() {\n\t\t\tupdateVisibility();\n\t\t});\n\n\t\t$timestampdiv.siblings('a.edit-timestamp').click( function( event ) {\n\t\t\tif ( $timestampdiv.is( ':hidden' ) ) {\n\t\t\t\t$timestampdiv.slideDown( 'fast', function() {\n\t\t\t\t\t$( 'input, select', $timestampdiv.find( '.timestamp-wrap' ) ).first().focus();\n\t\t\t\t} );\n\t\t\t\t$(this).hide();\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t$timestampdiv.find('.cancel-timestamp').click( function( event ) {\n\t\t\t$timestampdiv.slideUp('fast').siblings('a.edit-timestamp').show().focus();\n\t\t\t$('#mm').val($('#hidden_mm').val());\n\t\t\t$('#jj').val($('#hidden_jj').val());\n\t\t\t$('#aa').val($('#hidden_aa').val());\n\t\t\t$('#hh').val($('#hidden_hh').val());\n\t\t\t$('#mn').val($('#hidden_mn').val());\n\t\t\tupdateText();\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t$timestampdiv.find('.save-timestamp').click( function( event ) { // crazyhorse - multiple ok cancels\n\t\t\tif ( updateText() ) {\n\t\t\t\t$timestampdiv.slideUp('fast');\n\t\t\t\t$timestampdiv.siblings('a.edit-timestamp').show().focus();\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t$('#post').on( 'submit', function( event ) {\n\t\t\tif ( ! updateText() ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t$timestampdiv.show();\n\n\t\t\t\tif ( wp.autosave ) {\n\t\t\t\t\twp.autosave.enableButtons();\n\t\t\t\t}\n\n\t\t\t\t$( '#publishing-action .spinner' ).removeClass( 'is-active' );\n\t\t\t}\n\t\t});\n\n\t\t$postStatusSelect.siblings('a.edit-post-status').click( function( event ) {\n\t\t\tif ( $postStatusSelect.is( ':hidden' ) ) {\n\t\t\t\t$postStatusSelect.slideDown( 'fast', function() {\n\t\t\t\t\t$postStatusSelect.find('select').focus();\n\t\t\t\t} );\n\t\t\t\t$(this).hide();\n\t\t\t}\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t$postStatusSelect.find('.save-post-status').click( function( event ) {\n\t\t\t$postStatusSelect.slideUp( 'fast' ).siblings( 'a.edit-post-status' ).show().focus();\n\t\t\tupdateText();\n\t\t\tevent.preventDefault();\n\t\t});\n\n\t\t$postStatusSelect.find('.cancel-post-status').click( function( event ) {\n\t\t\t$postStatusSelect.slideUp( 'fast' ).siblings( 'a.edit-post-status' ).show().focus();\n\t\t\t$('#post_status').val( $('#hidden_post_status').val() );\n\t\t\tupdateText();\n\t\t\tevent.preventDefault();\n\t\t});\n\t} // end submitdiv\n\n\t// permalink\n\tfunction editPermalink() {\n\t\tvar i, slug_value,\n\t\t\t$el, revert_e,\n\t\t\tc = 0,\n\t\t\treal_slug = $('#post_name'),\n\t\t\trevert_slug = real_slug.val(),\n\t\t\tpermalink = $( '#sample-permalink' ),\n\t\t\tpermalinkOrig = permalink.html(),\n\t\t\tpermalinkInner = $( '#sample-permalink a' ).html(),\n\t\t\tbuttons = $('#edit-slug-buttons'),\n\t\t\tbuttonsOrig = buttons.html(),\n\t\t\tfull = $('#editable-post-name-full');\n\n\t\t// Deal with Twemoji in the post-name\n\t\tfull.find( 'img' ).replaceWith( function() { return this.alt; } );\n\t\tfull = full.html();\n\n\t\tpermalink.html( permalinkInner );\n\t\t$el = $( '#editable-post-name' );\n\t\trevert_e = $el.html();\n\n\t\tbuttons.html( '<button type=\"button\" class=\"save button button-small\">' + postL10n.ok + '</button> <button type=\"button\" class=\"cancel button-link\">' + postL10n.cancel + '</button>' );\n\t\tbuttons.children( '.save' ).click( function() {\n\t\t\tvar new_slug = $el.children( 'input' ).val();\n\n\t\t\tif ( new_slug == $('#editable-post-name-full').text() ) {\n\t\t\t\tbuttons.children('.cancel').click();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t$.post(ajaxurl, {\n\t\t\t\taction: 'sample-permalink',\n\t\t\t\tpost_id: postId,\n\t\t\t\tnew_slug: new_slug,\n\t\t\t\tnew_title: $('#title').val(),\n\t\t\t\tsamplepermalinknonce: $('#samplepermalinknonce').val()\n\t\t\t}, function(data) {\n\t\t\t\tvar box = $('#edit-slug-box');\n\t\t\t\tbox.html(data);\n\t\t\t\tif (box.hasClass('hidden')) {\n\t\t\t\t\tbox.fadeIn('fast', function () {\n\t\t\t\t\t\tbox.removeClass('hidden');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tbuttons.html(buttonsOrig);\n\t\t\t\tpermalink.html(permalinkOrig);\n\t\t\t\treal_slug.val(new_slug);\n\t\t\t\t$( '.edit-slug' ).focus();\n\t\t\t\twp.a11y.speak( postL10n.permalinkSaved );\n\t\t\t});\n\t\t});\n\n\t\tbuttons.children( '.cancel' ).click( function() {\n\t\t\t$('#view-post-btn').show();\n\t\t\t$el.html(revert_e);\n\t\t\tbuttons.html(buttonsOrig);\n\t\t\tpermalink.html(permalinkOrig);\n\t\t\treal_slug.val(revert_slug);\n\t\t\t$( '.edit-slug' ).focus();\n\t\t});\n\n\t\tfor ( i = 0; i < full.length; ++i ) {\n\t\t\tif ( '%' == full.charAt(i) )\n\t\t\t\tc++;\n\t\t}\n\n\t\tslug_value = ( c > full.length / 4 ) ? '' : full;\n\t\t$el.html( '<input type=\"text\" id=\"new-post-slug\" value=\"' + slug_value + '\" autocomplete=\"off\" />' ).children( 'input' ).keydown( function( e ) {\n\t\t\tvar key = e.which;\n\t\t\t// On enter, just save the new slug, don't save the post.\n\t\t\tif ( 13 === key ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tbuttons.children( '.save' ).click();\n\t\t\t}\n\t\t\tif ( 27 === key ) {\n\t\t\t\tbuttons.children( '.cancel' ).click();\n\t\t\t}\n\t\t} ).keyup( function() {\n\t\t\treal_slug.val( this.value );\n\t\t}).focus();\n\t}\n\n\t$( '#titlediv' ).on( 'click', '.edit-slug', function() {\n\t\teditPermalink();\n\t});\n\n\twptitlehint = function(id) {\n\t\tid = id || 'title';\n\n\t\tvar title = $('#' + id), titleprompt = $('#' + id + '-prompt-text');\n\n\t\tif ( '' === title.val() )\n\t\t\ttitleprompt.removeClass('screen-reader-text');\n\n\t\ttitleprompt.click(function(){\n\t\t\t$(this).addClass('screen-reader-text');\n\t\t\ttitle.focus();\n\t\t});\n\n\t\ttitle.blur(function(){\n\t\t\tif ( '' === this.value )\n\t\t\t\ttitleprompt.removeClass('screen-reader-text');\n\t\t}).focus(function(){\n\t\t\ttitleprompt.addClass('screen-reader-text');\n\t\t}).keydown(function(e){\n\t\t\ttitleprompt.addClass('screen-reader-text');\n\t\t\t$(this).unbind(e);\n\t\t});\n\t};\n\n\twptitlehint();\n\n\t// Resize the visual and text editors\n\t( function() {\n\t\tvar editor, offset, mce,\n\t\t\t$handle = $('#post-status-info'),\n\t\t\t$postdivrich = $('#postdivrich');\n\n\t\t// No point for touch devices\n\t\tif ( ! $textarea.length || 'ontouchstart' in window ) {\n\t\t\t// Hide the resize handle\n\t\t\t$('#content-resize-handle').hide();\n\t\t\treturn;\n\t\t}\n\n\t\tfunction dragging( event ) {\n\t\t\tif ( $postdivrich.hasClass( 'wp-editor-expand' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( mce ) {\n\t\t\t\teditor.theme.resizeTo( null, offset + event.pageY );\n\t\t\t} else {\n\t\t\t\t$textarea.height( Math.max( 50, offset + event.pageY ) );\n\t\t\t}\n\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tfunction endDrag() {\n\t\t\tvar height, toolbarHeight;\n\n\t\t\tif ( $postdivrich.hasClass( 'wp-editor-expand' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( mce ) {\n\t\t\t\teditor.focus();\n\t\t\t\ttoolbarHeight = parseInt( $( '#wp-content-editor-container .mce-toolbar-grp' ).height(), 10 );\n\n\t\t\t\tif ( toolbarHeight < 10 || toolbarHeight > 200 ) {\n\t\t\t\t\ttoolbarHeight = 30;\n\t\t\t\t}\n\n\t\t\t\theight = parseInt( $('#content_ifr').css('height'), 10 ) + toolbarHeight - 28;\n\t\t\t} else {\n\t\t\t\t$textarea.focus();\n\t\t\t\theight = parseInt( $textarea.css('height'), 10 );\n\t\t\t}\n\n\t\t\t$document.off( '.wp-editor-resize' );\n\n\t\t\t// sanity check\n\t\t\tif ( height && height > 50 && height < 5000 ) {\n\t\t\t\tsetUserSetting( 'ed_size', height );\n\t\t\t}\n\t\t}\n\n\t\t$handle.on( 'mousedown.wp-editor-resize', function( event ) {\n\t\t\tif ( typeof tinymce !== 'undefined' ) {\n\t\t\t\teditor = tinymce.get('content');\n\t\t\t}\n\n\t\t\tif ( editor && ! editor.isHidden() ) {\n\t\t\t\tmce = true;\n\t\t\t\toffset = $('#content_ifr').height() - event.pageY;\n\t\t\t} else {\n\t\t\t\tmce = false;\n\t\t\t\toffset = $textarea.height() - event.pageY;\n\t\t\t\t$textarea.blur();\n\t\t\t}\n\n\t\t\t$document.on( 'mousemove.wp-editor-resize', dragging )\n\t\t\t\t.on( 'mouseup.wp-editor-resize mouseleave.wp-editor-resize', endDrag );\n\n\t\t\tevent.preventDefault();\n\t\t}).on( 'mouseup.wp-editor-resize', endDrag );\n\t})();\n\n\tif ( typeof tinymce !== 'undefined' ) {\n\t\t// When changing post formats, change the editor body class\n\t\t$( '#post-formats-select input.post-format' ).on( 'change.set-editor-class', function() {\n\t\t\tvar editor, body, format = this.id;\n\n\t\t\tif ( format && $( this ).prop( 'checked' ) && ( editor = tinymce.get( 'content' ) ) ) {\n\t\t\t\tbody = editor.getBody();\n\t\t\t\tbody.className = body.className.replace( /\\bpost-format-[^ ]+/, '' );\n\t\t\t\teditor.dom.addClass( body, format == 'post-format-0' ? 'post-format-standard' : format );\n\t\t\t\t$( document ).trigger( 'editor-classchange' );\n\t\t\t}\n\t\t});\n\t}\n\n\t// Save on pressing Ctrl/Command + S in the Text editor\n\t$textarea.on( 'keydown.wp-autosave', function( event ) {\n\t\tif ( event.which === 83 ) {\n\t\t\tif ( event.shiftKey || event.altKey || ( isMac && ( ! event.metaKey || event.ctrlKey ) ) || ( ! isMac && ! event.ctrlKey ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twp.autosave && wp.autosave.server.triggerSave();\n\t\t\tevent.preventDefault();\n\t\t}\n\t});\n\n\tif ( $( '#original_post_status' ).val() === 'auto-draft' && window.history.replaceState ) {\n\t\tvar location;\n\n\t\t$( '#publish' ).on( 'click', function() {\n\t\t\tlocation = window.location.href;\n\t\t\tlocation += ( location.indexOf( '?' ) !== -1 ) ? '&' : '?';\n\t\t\tlocation += 'wp-post-new-reload=true';\n\n\t\t\twindow.history.replaceState( null, null, location );\n\t\t});\n\t}\n});\n\n( function( $, counter ) {\n\t$( function() {\n\t\tvar $content = $( '#content' ),\n\t\t\t$count = $( '#wp-word-count' ).find( '.word-count' ),\n\t\t\tprevCount = 0,\n\t\t\tcontentEditor;\n\n\t\tfunction update() {\n\t\t\tvar text, count;\n\n\t\t\tif ( ! contentEditor || contentEditor.isHidden() ) {\n\t\t\t\ttext = $content.val();\n\t\t\t} else {\n\t\t\t\ttext = contentEditor.getContent( { format: 'raw' } );\n\t\t\t}\n\n\t\t\tcount = counter.count( text );\n\n\t\t\tif ( count !== prevCount ) {\n\t\t\t\t$count.text( count );\n\t\t\t}\n\n\t\t\tprevCount = count;\n\t\t}\n\n\t\t$( document ).on( 'tinymce-editor-init', function( event, editor ) {\n\t\t\tif ( editor.id !== 'content' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcontentEditor = editor;\n\n\t\t\teditor.on( 'nodechange keyup', _.debounce( update, 1000 ) );\n\t\t} );\n\n\t\t$content.on( 'input keyup', _.debounce( update, 1000 ) );\n\n\t\tupdate();\n\t} );\n} )( jQuery, new wp.utils.WordCounter() );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/postbox.js",
    "content": "/* global ajaxurl */\n\nvar postboxes;\n\n(function($) {\n\tvar $document = $( document );\n\n\tpostboxes = {\n\t\thandle_click : function () {\n\t\t\tvar $el = $( this ),\n\t\t\t\tp = $el.parent( '.postbox' ),\n\t\t\t\tid = p.attr( 'id' ),\n\t\t\t\tariaExpandedValue;\n\n\t\t\tif ( 'dashboard_browser_nag' === id ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tp.toggleClass( 'closed' );\n\n\t\t\tariaExpandedValue = ! p.hasClass( 'closed' );\n\n\t\t\tif ( $el.hasClass( 'handlediv' ) ) {\n\t\t\t\t// The handle button was clicked.\n\t\t\t\t$el.attr( 'aria-expanded', ariaExpandedValue );\n\t\t\t} else {\n\t\t\t\t// The handle heading was clicked.\n\t\t\t\t$el.closest( '.postbox' ).find( 'button.handlediv' )\n\t\t\t\t\t.attr( 'aria-expanded', ariaExpandedValue );\n\t\t\t}\n\n\t\t\tif ( postboxes.page !== 'press-this' ) {\n\t\t\t\tpostboxes.save_state( postboxes.page );\n\t\t\t}\n\n\t\t\tif ( id ) {\n\t\t\t\tif ( !p.hasClass('closed') && $.isFunction( postboxes.pbshow ) ) {\n\t\t\t\t\tpostboxes.pbshow( id );\n\t\t\t\t} else if ( p.hasClass('closed') && $.isFunction( postboxes.pbhide ) ) {\n\t\t\t\t\tpostboxes.pbhide( id );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$document.trigger( 'postbox-toggled', p );\n\t\t},\n\n\t\tadd_postbox_toggles : function (page, args) {\n\t\t\tvar $handles = $( '.postbox .hndle, .postbox .handlediv' );\n\n\t\t\tthis.page = page;\n\t\t\tthis.init( page, args );\n\n\t\t\t$handles.on( 'click.postboxes', this.handle_click );\n\n\t\t\t$('.postbox .hndle a').click( function(e) {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t\t$( '.postbox a.dismiss' ).on( 'click.postboxes', function( e ) {\n\t\t\t\tvar hide_id = $(this).parents('.postbox').attr('id') + '-hide';\n\t\t\t\te.preventDefault();\n\t\t\t\t$( '#' + hide_id ).prop('checked', false).triggerHandler('click');\n\t\t\t});\n\n\t\t\t$('.hide-postbox-tog').bind('click.postboxes', function() {\n\t\t\t\tvar $el = $(this),\n\t\t\t\t\tboxId = $el.val(),\n\t\t\t\t\t$postbox = $( '#' + boxId );\n\n\t\t\t\tif ( $el.prop( 'checked' ) ) {\n\t\t\t\t\t$postbox.show();\n\t\t\t\t\tif ( $.isFunction( postboxes.pbshow ) ) {\n\t\t\t\t\t\tpostboxes.pbshow( boxId );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$postbox.hide();\n\t\t\t\t\tif ( $.isFunction( postboxes.pbhide ) ) {\n\t\t\t\t\t\tpostboxes.pbhide( boxId );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpostboxes.save_state( page );\n\t\t\t\tpostboxes._mark_area();\n\t\t\t\t$document.trigger( 'postbox-toggled', $postbox );\n\t\t\t});\n\n\t\t\t$('.columns-prefs input[type=\"radio\"]').bind('click.postboxes', function(){\n\t\t\t\tvar n = parseInt($(this).val(), 10);\n\n\t\t\t\tif ( n ) {\n\t\t\t\t\tpostboxes._pb_edit(n);\n\t\t\t\t\tpostboxes.save_order( page );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tinit : function(page, args) {\n\t\t\tvar isMobile = $( document.body ).hasClass( 'mobile' ),\n\t\t\t\t$handleButtons = $( '.postbox .handlediv' );\n\n\t\t\t$.extend( this, args || {} );\n\t\t\t$('#wpbody-content').css('overflow','hidden');\n\t\t\t$('.meta-box-sortables').sortable({\n\t\t\t\tplaceholder: 'sortable-placeholder',\n\t\t\t\tconnectWith: '.meta-box-sortables',\n\t\t\t\titems: '.postbox',\n\t\t\t\thandle: '.hndle',\n\t\t\t\tcursor: 'move',\n\t\t\t\tdelay: ( isMobile ? 200 : 0 ),\n\t\t\t\tdistance: 2,\n\t\t\t\ttolerance: 'pointer',\n\t\t\t\tforcePlaceholderSize: true,\n\t\t\t\thelper: 'clone',\n\t\t\t\topacity: 0.65,\n\t\t\t\tstop: function() {\n\t\t\t\t\tvar $el = $( this );\n\n\t\t\t\t\tif ( $el.find( '#dashboard_browser_nag' ).is( ':visible' ) && 'dashboard_browser_nag' != this.firstChild.id ) {\n\t\t\t\t\t\t$el.sortable('cancel');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tpostboxes.save_order(page);\n\t\t\t\t},\n\t\t\t\treceive: function(e,ui) {\n\t\t\t\t\tif ( 'dashboard_browser_nag' == ui.item[0].id )\n\t\t\t\t\t\t$(ui.sender).sortable('cancel');\n\n\t\t\t\t\tpostboxes._mark_area();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif ( isMobile ) {\n\t\t\t\t$(document.body).bind('orientationchange.postboxes', function(){ postboxes._pb_change(); });\n\t\t\t\tthis._pb_change();\n\t\t\t}\n\n\t\t\tthis._mark_area();\n\n\t\t\t// Set the handle buttons `aria-expanded` attribute initial value on page load.\n\t\t\t$handleButtons.each( function () {\n\t\t\t\tvar $el = $( this );\n\t\t\t\t$el.attr( 'aria-expanded', ! $el.parent( '.postbox' ).hasClass( 'closed' ) );\n\t\t\t});\n\t\t},\n\n\t\tsave_state : function(page) {\n\t\t\tvar closed, hidden;\n\n\t\t\t// Return on the nav-menus.php screen, see #35112.\n\t\t\tif ( 'nav-menus' === page ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclosed = $( '.postbox' ).filter( '.closed' ).map( function() { return this.id; } ).get().join( ',' );\n\t\t\thidden = $( '.postbox' ).filter( ':hidden' ).map( function() { return this.id; } ).get().join( ',' );\n\n\t\t\t$.post(ajaxurl, {\n\t\t\t\taction: 'closed-postboxes',\n\t\t\t\tclosed: closed,\n\t\t\t\thidden: hidden,\n\t\t\t\tclosedpostboxesnonce: jQuery('#closedpostboxesnonce').val(),\n\t\t\t\tpage: page\n\t\t\t});\n\t\t},\n\n\t\tsave_order : function(page) {\n\t\t\tvar postVars, page_columns = $('.columns-prefs input:checked').val() || 0;\n\n\t\t\tpostVars = {\n\t\t\t\taction: 'meta-box-order',\n\t\t\t\t_ajax_nonce: $('#meta-box-order-nonce').val(),\n\t\t\t\tpage_columns: page_columns,\n\t\t\t\tpage: page\n\t\t\t};\n\t\t\t$('.meta-box-sortables').each( function() {\n\t\t\t\tpostVars[ 'order[' + this.id.split( '-' )[0] + ']' ] = $( this ).sortable( 'toArray' ).join( ',' );\n\t\t\t} );\n\t\t\t$.post( ajaxurl, postVars );\n\t\t},\n\n\t\t_mark_area : function() {\n\t\t\tvar visible = $('div.postbox:visible').length, side = $('#post-body #side-sortables');\n\n\t\t\t$( '#dashboard-widgets .meta-box-sortables:visible' ).each( function() {\n\t\t\t\tvar t = $(this);\n\n\t\t\t\tif ( visible == 1 || t.children('.postbox:visible').length )\n\t\t\t\t\tt.removeClass('empty-container');\n\t\t\t\telse\n\t\t\t\t\tt.addClass('empty-container');\n\t\t\t});\n\n\t\t\tif ( side.length ) {\n\t\t\t\tif ( side.children('.postbox:visible').length )\n\t\t\t\t\tside.removeClass('empty-container');\n\t\t\t\telse if ( $('#postbox-container-1').css('width') == '280px' )\n\t\t\t\t\tside.addClass('empty-container');\n\t\t\t}\n\t\t},\n\n\t\t_pb_edit : function(n) {\n\t\t\tvar el = $('.metabox-holder').get(0);\n\n\t\t\tif ( el ) {\n\t\t\t\tel.className = el.className.replace(/columns-\\d+/, 'columns-' + n);\n\t\t\t}\n\n\t\t\t$( document ).trigger( 'postboxes-columnchange' );\n\t\t},\n\n\t\t_pb_change : function() {\n\t\t\tvar check = $( 'label.columns-prefs-1 input[type=\"radio\"]' );\n\n\t\t\tswitch ( window.orientation ) {\n\t\t\t\tcase 90:\n\t\t\t\tcase -90:\n\t\t\t\t\tif ( !check.length || !check.is(':checked') )\n\t\t\t\t\t\tthis._pb_edit(2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\tcase 180:\n\t\t\t\t\tif ( $('#poststuff').length ) {\n\t\t\t\t\t\tthis._pb_edit(1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( !check.length || !check.is(':checked') )\n\t\t\t\t\t\t\tthis._pb_edit(2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\n\t\t/* Callbacks */\n\t\tpbshow : false,\n\n\t\tpbhide : false\n\t};\n\n}(jQuery));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/press-this.js",
    "content": "/**\n * PressThis App\n *\n */\n( function( $, window ) {\n\tvar PressThis = function() {\n\t\tvar editor, $mediaList, $mediaThumbWrap,\n\t\t\t$window               = $( window ),\n\t\t\t$document             = $( document ),\n\t\t\tsaveAlert             = false,\n\t\t\ttextarea              = document.createElement( 'textarea' ),\n\t\t\tsidebarIsOpen         = false,\n\t\t\tsettings              = window.wpPressThisConfig || {},\n\t\t\tdata                  = window.wpPressThisData || {},\n\t\t\tsmallestWidth         = 128,\n\t\t\thasSetFocus           = false,\n\t\t\tcatsCache             = [],\n\t\t\tisOffScreen           = 'is-off-screen',\n\t\t\tisHidden              = 'is-hidden',\n\t\t\toffscreenHidden       = isOffScreen + ' ' + isHidden,\n\t\t\tiOS                   = /iPad|iPod|iPhone/.test( window.navigator.userAgent ),\n\t\t\t$textEditor           = $( '#pressthis' ),\n\t\t\ttextEditor            = $textEditor[0],\n\t\t\ttextEditorMinHeight   = 600,\n\t\t\ttextLength            = 0,\n\t\t\ttransitionEndEvent    = ( function() {\n\t\t\t\tvar style = document.documentElement.style;\n\n\t\t\t\tif ( typeof style.transition !== 'undefined' ) {\n\t\t\t\t\treturn 'transitionend';\n\t\t\t\t}\n\n\t\t\t\tif ( typeof style.WebkitTransition !== 'undefined' ) {\n\t\t\t\t\treturn 'webkitTransitionEnd';\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}() );\n\n\t\t/* ***************************************************************\n\t\t * HELPER FUNCTIONS\n\t\t *************************************************************** */\n\n\t\t/**\n\t\t * Emulates our PHP __() gettext function, powered by the strings exported in pressThisL10n.\n\t\t *\n\t\t * @param key string Key of the string to be translated, as found in pressThisL10n.\n\t\t * @returns string Original or translated string, or empty string if no key.\n\t\t */\n\t\tfunction __( key ) {\n\t\t\tif ( key && window.pressThisL10n ) {\n\t\t\t\treturn window.pressThisL10n[key] || key;\n\t\t\t}\n\n\t\t\treturn key || '';\n\t\t}\n\n\t\t/**\n\t\t * Strips HTML tags\n\t\t *\n\t\t * @param string string Text to have the HTML tags striped out of.\n\t\t * @returns string Stripped text.\n\t\t */\n\t\tfunction stripTags( string ) {\n\t\t\tstring = string || '';\n\n\t\t\treturn string\n\t\t\t\t.replace( /<!--[\\s\\S]*?(-->|$)/g, '' )\n\t\t\t\t.replace( /<(script|style)[^>]*>[\\s\\S]*?(<\\/\\1>|$)/ig, '' )\n\t\t\t\t.replace( /<\\/?[a-z][\\s\\S]*?(>|$)/ig, '' );\n\t\t}\n\n\t\t/**\n\t\t * Strip HTML tags and convert HTML entities.\n\t\t *\n\t\t * @param text string Text.\n\t\t * @returns string Sanitized text.\n\t\t */\n\t\tfunction sanitizeText( text ) {\n\t\t\tvar _text = stripTags( text );\n\n\t\t\ttry {\n\t\t\t\ttextarea.innerHTML = _text;\n\t\t\t\t_text = stripTags( textarea.value );\n\t\t\t} catch ( er ) {}\n\n\t\t\treturn _text;\n\t\t}\n\n\t\t/**\n\t\t * Allow only HTTP or protocol relative URLs.\n\t\t *\n\t\t * @param url string The URL.\n\t\t * @returns string Processed URL.\n\t\t */\n\t\tfunction checkUrl( url ) {\n\t\t\turl = $.trim( url || '' );\n\n\t\t\tif ( /^(?:https?:)?\\/\\//.test( url ) ) {\n\t\t\t\turl = stripTags( url );\n\t\t\t\treturn url.replace( /[\"\\\\]+/g, '' );\n\t\t\t}\n\n\t\t\treturn '';\n\t\t}\n\n\t\t/**\n\t\t * Show UX spinner\n\t\t */\n\t\tfunction showSpinner() {\n\t\t\t$( '.spinner' ).addClass( 'is-active' );\n\t\t\t$( '.post-actions button' ).attr( 'disabled', 'disabled' );\n\t\t}\n\n\t\t/**\n\t\t * Hide UX spinner\n\t\t */\n\t\tfunction hideSpinner() {\n\t\t\t$( '.spinner' ).removeClass( 'is-active' );\n\t\t\t$( '.post-actions button' ).removeAttr( 'disabled' );\n\t\t}\n\n\t\tfunction textEditorResize( reset ) {\n\t\t\tvar pageYOffset, height;\n\n\t\t\tif ( editor && ! editor.isHidden() ) {\n \t\t\t\treturn;\n \t\t\t}\n\n\t\t\treset = ( reset === 'reset' ) || ( textLength && textLength > textEditor.value.length );\n\t\t\theight = textEditor.style.height;\n\n\t\t\tif ( reset ) {\n\t\t\t\tpageYOffset = window.pageYOffset;\n\n\t\t\t\ttextEditor.style.height = 'auto';\n\t\t\t\ttextEditor.style.height = Math.max( textEditor.scrollHeight, textEditorMinHeight ) + 'px';\n\t\t\t\twindow.scrollTo( window.pageXOffset, pageYOffset );\n\t\t\t} else if ( parseInt( textEditor.style.height, 10 ) < textEditor.scrollHeight ) {\n\t\t\t\ttextEditor.style.height = textEditor.scrollHeight + 'px';\n \t\t\t}\n\n \t\t\ttextLength = textEditor.value.length;\n \t\t}\n\n \t\tfunction mceGetCursorOffset() {\n\t\t\tif ( ! editor ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar node = editor.selection.getNode(),\n\t\t\t\trange, view, offset;\n\n\t\t\tif ( editor.wp && editor.wp.getView && ( view = editor.wp.getView( node ) ) ) {\n\t\t\t\toffset = view.getBoundingClientRect();\n\t\t\t} else {\n\t\t\t\trange = editor.selection.getRng();\n\n\t\t\t\ttry {\n\t\t\t\t\toffset = range.getClientRects()[0];\n\t\t\t\t} catch( er ) {}\n\n\t\t\t\tif ( ! offset ) {\n\t\t\t\t\toffset = node.getBoundingClientRect();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn offset.height ? offset : false;\n\t\t}\n\n\t\t// Make sure the caret is always visible.\n\t\tfunction mceKeyup( event ) {\n\t\t\tvar VK = window.tinymce.util.VK,\n\t\t\t\tkey = event.keyCode;\n\n\t\t\t// Bail on special keys.\n\t\t\tif ( key <= 47 && ! ( key === VK.SPACEBAR || key === VK.ENTER || key === VK.DELETE || key === VK.BACKSPACE || key === VK.UP || key === VK.LEFT || key === VK.DOWN || key === VK.UP ) ) {\n\t\t\t\treturn;\n\t\t\t// OS keys, function keys, num lock, scroll lock\n\t\t\t} else if ( ( key >= 91 && key <= 93 ) || ( key >= 112 && key <= 123 ) || key === 144 || key === 145 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmceScroll( key );\n\t\t}\n\n\t\tfunction mceScroll( key ) {\n\t\t\tvar cursorTop, cursorBottom, editorBottom,\n\t\t\t\toffset = mceGetCursorOffset(),\n\t\t\t\tbufferTop = 50,\n\t\t\t\tbufferBottom = 65,\n\t\t\t\tVK = window.tinymce.util.VK;\n\n\t\t\tif ( ! offset ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcursorTop = offset.top + editor.iframeElement.getBoundingClientRect().top;\n\t\t\tcursorBottom = cursorTop + offset.height;\n\t\t\tcursorTop = cursorTop - bufferTop;\n\t\t\tcursorBottom = cursorBottom + bufferBottom;\n\t\t\teditorBottom = $window.height();\n\n\t\t\t// Don't scroll if the node is taller than the visible part of the editor\n\t\t\tif ( editorBottom < offset.height ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( cursorTop < 0 && ( key === VK.UP || key === VK.LEFT || key === VK.BACKSPACE ) ) {\n\t\t\t\twindow.scrollTo( window.pageXOffset, cursorTop + window.pageYOffset );\n\t\t\t} else if ( cursorBottom > editorBottom ) {\n\t\t\t\twindow.scrollTo( window.pageXOffset, cursorBottom + window.pageYOffset - editorBottom );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Replace emoji images with chars and sanitize the text content.\n\t\t */\n\t\tfunction getTitleText() {\n\t\t\tvar $element = $( '#title-container' );\n\n\t\t\t$element.find( 'img.emoji' ).each( function() {\n\t\t\t\tvar $image = $( this );\n\t\t\t\t$image.replaceWith( $( '<span>' ).text( $image.attr( 'alt' ) ) );\n\t\t\t});\n\n\t\t\treturn sanitizeText( $element.text() );\n\t\t}\n\n\t\t/**\n\t\t * Prepare the form data for saving.\n\t\t */\n\t\tfunction prepareFormData() {\n\t\t\tvar $form = $( '#pressthis-form' ),\n\t\t\t\t$input = $( '<input type=\"hidden\" name=\"post_category[]\" value=\"\">' );\n\n\t\t\teditor && editor.save();\n\n\t\t\t$( '#post_title' ).val( getTitleText() );\n\n\t\t\t// Make sure to flush out the tags with tagBox before saving\n\t\t\tif ( window.tagBox ) {\n\t\t\t\t$( 'div.tagsdiv' ).each( function() {\n\t\t\t\t\twindow.tagBox.flushTags( this, false, 1 );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Get selected categories\n\t\t\t$( '.categories-select .category' ).each( function( i, element ) {\n\t\t\t\tvar $cat = $( element );\n\n\t\t\t\tif ( $cat.hasClass( 'selected' ) ) {\n\t\t\t\t\t// Have to append a node as we submit the actual form on preview\n\t\t\t\t\t$form.append( $input.clone().val( $cat.attr( 'data-term-id' ) || '' ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Submit the post form via AJAX, and redirect to the proper screen if published vs saved as a draft.\n\t\t *\n\t\t * @param action string publish|draft\n\t\t */\n\t\tfunction submitPost( action ) {\n\t\t\tvar data;\n\n\t\t\tsaveAlert = false;\n\t\t\tshowSpinner();\n\n\t\t\tif ( 'publish' === action ) {\n\t\t\t\t$( '#post_status' ).val( 'publish' );\n\t\t\t}\n\n\t\t\tprepareFormData();\n\t\t\tdata = $( '#pressthis-form' ).serialize();\n\n\t\t\t$.ajax( {\n\t\t\t\ttype: 'post',\n\t\t\t\turl: window.ajaxurl,\n\t\t\t\tdata: data\n\t\t\t}).always( function() {\n\t\t\t\thideSpinner();\n\t\t\t\tclearNotices();\n\t\t\t\t$( '.publish-button' ).removeClass( 'is-saving' );\n\t\t\t}).done( function( response ) {\n\t\t\t\tif ( ! response.success ) {\n\t\t\t\t\trenderError( response.data.errorMessage );\n\t\t\t\t} else if ( response.data.redirect ) {\n\t\t\t\t\tif ( window.opener && ( settings.redirInParent || response.data.force ) ) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\twindow.opener.location.href = response.data.redirect;\n\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\twindow.self.close();\n\t\t\t\t\t\t\t}, 200 );\n\t\t\t\t\t\t} catch( er ) {\n\t\t\t\t\t\t\twindow.location.href = response.data.redirect;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.location.href = response.data.redirect;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}).fail( function() {\n\t\t\t\trenderError( __( 'serverError' ) );\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Inserts the media a user has selected from the presented list inside the editor, as an image or embed, based on type\n\t\t *\n\t\t * @param type string img|embed\n\t\t * @param src string Source URL\n\t\t * @param link string Optional destination link, for images (defaults to src)\n\t\t */\n\t\tfunction insertSelectedMedia( $element ) {\n\t\t\tvar src, link, newContent = '';\n\n\t\t\tsrc = checkUrl( $element.attr( 'data-wp-src' ) || '' );\n\t\t\tlink = checkUrl( data.u );\n\n\t\t\tif ( $element.hasClass( 'is-image' ) ) {\n\t\t\t\tif ( ! link ) {\n\t\t\t\t\tlink = src;\n\t\t\t\t}\n\n\t\t\t\tnewContent = '<a href=\"' + link + '\"><img class=\"alignnone size-full\" src=\"' + src + '\" alt=\"\" /></a>';\n\t\t\t} else {\n\t\t\t\tnewContent = '[embed]' + src + '[/embed]';\n\t\t\t}\n\n\t\t\tif ( editor && ! editor.isHidden() ) {\n\t\t\t\tif ( ! hasSetFocus ) {\n\t\t\t\t\teditor.setContent( '<p>' + newContent + '</p>' + editor.getContent() );\n\t\t\t\t} else {\n\t\t\t\t\teditor.execCommand( 'mceInsertContent', false, newContent );\n\t\t\t\t}\n\t\t\t} else if ( window.QTags ) {\n\t\t\t\twindow.QTags.insertContent( newContent );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Save a new user-generated category via AJAX\n\t\t */\n\t\tfunction saveNewCategory() {\n\t\t\tvar data,\n\t\t\t\tname = $( '#new-category' ).val();\n\n\t\t\tif ( ! name ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdata = {\n\t\t\t\taction: 'press-this-add-category',\n\t\t\t\tpost_id: $( '#post_ID' ).val() || 0,\n\t\t\t\tname: name,\n\t\t\t\tnew_cat_nonce: $( '#_ajax_nonce-add-category' ).val() || '',\n\t\t\t\tparent: $( '#new-category-parent' ).val() || 0\n\t\t\t};\n\n\t\t\t$.post( window.ajaxurl, data, function( response ) {\n\t\t\t\tif ( ! response.success ) {\n\t\t\t\t\trenderError( response.data.errorMessage );\n\t\t\t\t} else {\n\t\t\t\t\tvar $parent, $ul,\n\t\t\t\t\t\t$wrap = $( 'ul.categories-select' );\n\n\t\t\t\t\t$.each( response.data, function( i, newCat ) {\n\t\t\t\t\t\tvar $node = $( '<li>' ).append( $( '<div class=\"category selected\" tabindex=\"0\" role=\"checkbox\" aria-checked=\"true\">' )\n\t\t\t\t\t\t\t.attr( 'data-term-id', newCat.term_id )\n\t\t\t\t\t\t\t.text( newCat.name ) );\n\n\t\t\t\t\t\tif ( newCat.parent ) {\n\t\t\t\t\t\t\tif ( ! $ul || ! $ul.length ) {\n\t\t\t\t\t\t\t\t$parent = $wrap.find( 'div[data-term-id=\"' + newCat.parent + '\"]' ).parent();\n\t\t\t\t\t\t\t\t$ul = $parent.find( 'ul.children:first' );\n\n\t\t\t\t\t\t\t\tif ( ! $ul.length ) {\n\t\t\t\t\t\t\t\t\t$ul = $( '<ul class=\"children\">' ).appendTo( $parent );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$ul.prepend( $node );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$wrap.prepend( $node );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$node.focus();\n\t\t\t\t\t} );\n\n\t\t\t\t\trefreshCatsCache();\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t/* ***************************************************************\n\t\t * RENDERING FUNCTIONS\n\t\t *************************************************************** */\n\n\t\t/**\n\t\t * Hide the form letting users enter a URL to be scanned, if a URL was already passed.\n\t\t */\n\t\tfunction renderToolsVisibility() {\n\t\t\tif ( data.hasData ) {\n\t\t\t\t$( '#scanbar' ).hide();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Render error notice\n\t\t *\n\t\t * @param msg string Notice/error message\n\t\t * @param error string error|notice CSS class for display\n\t\t */\n\t\tfunction renderNotice( msg, error ) {\n\t\t\tvar $alerts = $( '.editor-wrapper div.alerts' ),\n\t\t\t\tclassName = error ? 'is-error' : 'is-notice';\n\n\t\t\t$alerts.append( $( '<p class=\"alert ' + className + '\">' ).text( msg ) );\n\t\t}\n\n\t\t/**\n\t\t * Render error notice\n\t\t *\n\t\t * @param msg string Error message\n\t\t */\n\t\tfunction renderError( msg ) {\n\t\t\trenderNotice( msg, true );\n\t\t}\n\n\t\tfunction clearNotices() {\n\t\t\t$( 'div.alerts' ).empty();\n\t\t}\n\n\t\t/**\n\t\t * Render notices on page load, if any already\n\t\t */\n\t\tfunction renderStartupNotices() {\n\t\t\t// Render errors sent in the data, if any\n\t\t\tif ( data.errors ) {\n\t\t\t\t$.each( data.errors, function( i, msg ) {\n\t\t\t\t\trenderError( msg );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Add an image to the list of found images.\n\t\t */\n\t\tfunction addImg( src, displaySrc, i ) {\n\t\t\tvar $element = $mediaThumbWrap.clone().addClass( 'is-image' );\n\n\t\t\t$element.attr( 'data-wp-src', src ).css( 'background-image', 'url(' + displaySrc + ')' )\n\t\t\t\t.find( 'span' ).text( __( 'suggestedImgAlt' ).replace( '%d', i + 1 ) );\n\n\t\t\t$mediaList.append( $element );\n\t\t}\n\n\t\t/**\n\t\t * Render the detected images and embed for selection, if any\n\t\t */\n\t\tfunction renderDetectedMedia() {\n\t\t\tvar found = 0;\n\n\t\t\t$mediaList = $( 'ul.media-list' );\n\t\t\t$mediaThumbWrap = $( '<li class=\"suggested-media-thumbnail\" tabindex=\"0\"><span class=\"screen-reader-text\"></span></li>' );\n\n\t\t\tif ( data._embeds ) {\n\t\t\t\t$.each( data._embeds, function ( i, src ) {\n\t\t\t\t\tvar displaySrc = '',\n\t\t\t\t\t\tcssClass = '',\n\t\t\t\t\t\t$element = $mediaThumbWrap.clone().addClass( 'is-embed' );\n\n\t\t\t\t\tsrc = checkUrl( src );\n\n\t\t\t\t\tif ( src.indexOf( 'youtube.com/' ) > -1 ) {\n\t\t\t\t\t\tdisplaySrc = 'https://i.ytimg.com/vi/' + src.replace( /.+v=([^&]+).*/, '$1' ) + '/hqdefault.jpg';\n\t\t\t\t\t\tcssClass += ' is-video';\n\t\t\t\t\t} else if ( src.indexOf( 'youtu.be/' ) > -1 ) {\n\t\t\t\t\t\tdisplaySrc = 'https://i.ytimg.com/vi/' + src.replace( /\\/([^\\/])$/, '$1' ) + '/hqdefault.jpg';\n\t\t\t\t\t\tcssClass += ' is-video';\n\t\t\t\t\t} else if ( src.indexOf( 'dailymotion.com' ) > -1 ) {\n\t\t\t\t\t\tdisplaySrc = src.replace( '/video/', '/thumbnail/video/' );\n\t\t\t\t\t\tcssClass += ' is-video';\n\t\t\t\t\t} else if ( src.indexOf( 'soundcloud.com' ) > -1 ) {\n\t\t\t\t\t\tcssClass += ' is-audio';\n\t\t\t\t\t} else if ( src.indexOf( 'twitter.com' ) > -1 ) {\n\t\t\t\t\t\tcssClass += ' is-tweet';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcssClass += ' is-video';\n\t\t\t\t\t}\n\n\t\t\t\t\t$element.attr( 'data-wp-src', src ).find( 'span' ).text( __( 'suggestedEmbedAlt' ).replace( '%d', i + 1 ) );\n\n\t\t\t\t\tif ( displaySrc ) {\n\t\t\t\t\t\t$element.css( 'background-image', 'url(' + displaySrc + ')' );\n\t\t\t\t\t}\n\n\t\t\t\t\t$mediaList.append( $element );\n\t\t\t\t\tfound++;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( data._images ) {\n\t\t\t\t$.each( data._images, function( i, src ) {\n\t\t\t\t\tvar displaySrc, img = new Image();\n\n\t\t\t\t\tsrc = checkUrl( src );\n\t\t\t\t\tdisplaySrc = src.replace( /^(http[^\\?]+)(\\?.*)?$/, '$1' );\n\n\t\t\t\t\tif ( src.indexOf( 'files.wordpress.com/' ) > -1 ) {\n\t\t\t\t\t\tdisplaySrc = displaySrc.replace( /\\?.*$/, '' ) + '?w=' + smallestWidth;\n\t\t\t\t\t} else if ( src.indexOf( 'gravatar.com/' ) > -1 ) {\n\t\t\t\t\t\tdisplaySrc = displaySrc.replace( /\\?.*$/, '' ) + '?s=' + smallestWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdisplaySrc = src;\n\t\t\t\t\t}\n\n\t\t\t\t\timg.onload = function() {\n\t\t\t\t\t\tif ( ( img.width && img.width < 256 ) ||\n\t\t\t\t\t\t\t( img.height && img.height < 128 ) ) {\n\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\taddImg( src, displaySrc, i );\n\t\t\t\t\t};\n\n\t\t\t\t\timg.src = src;\n\t\t\t\t\tfound++;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( found ) {\n\t\t\t\t$( '.media-list-container' ).addClass( 'has-media' );\n\t\t\t}\n\t\t}\n\n\t\t/* ***************************************************************\n\t\t * MONITORING FUNCTIONS\n\t\t *************************************************************** */\n\n\t\t/**\n\t\t * Interactive navigation behavior for the options modal (post format, tags, categories)\n\t\t */\n\t\tfunction monitorOptionsModal() {\n\t\t\tvar $postOptions  = $( '.post-options' ),\n\t\t\t\t$postOption   = $( '.post-option' ),\n\t\t\t\t$settingModal = $( '.setting-modal' ),\n\t\t\t\t$modalClose   = $( '.modal-close' );\n\n\t\t\t$postOption.on( 'click', function() {\n\t\t\t\tvar index = $( this ).index(),\n\t\t\t\t\t$targetSettingModal = $settingModal.eq( index );\n\n\t\t\t\t$postOptions.addClass( isOffScreen )\n\t\t\t\t\t.one( transitionEndEvent, function() {\n\t\t\t\t\t\t$( this ).addClass( isHidden );\n\t\t\t\t\t} );\n\n\t\t\t\t$targetSettingModal.removeClass( offscreenHidden )\n\t\t\t\t\t.one( transitionEndEvent, function() {\n\t\t\t\t\t\t$( this ).find( '.modal-close' ).focus();\n\t\t\t\t\t} );\n\t\t\t} );\n\n\t\t\t$modalClose.on( 'click', function() {\n\t\t\t\tvar $targetSettingModal = $( this ).parent(),\n\t\t\t\t\tindex = $targetSettingModal.index();\n\n\t\t\t\t$postOptions.removeClass( offscreenHidden );\n\t\t\t\t$targetSettingModal.addClass( isOffScreen );\n\n\t\t\t\tif ( transitionEndEvent ) {\n\t\t\t\t\t$targetSettingModal.one( transitionEndEvent, function() {\n\t\t\t\t\t\t$( this ).addClass( isHidden );\n\t\t\t\t\t\t$postOption.eq( index - 1 ).focus();\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t$targetSettingModal.addClass( isHidden );\n\t\t\t\t\t\t$postOption.eq( index - 1 ).focus();\n\t\t\t\t\t}, 350 );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t/**\n\t\t * Interactive behavior for the sidebar toggle, to show the options modals\n\t\t */\n\t\tfunction openSidebar() {\n\t\t\tsidebarIsOpen = true;\n\n\t\t\t$( '.options' ).removeClass( 'closed' ).addClass( 'open' );\n\t\t\t$( '.press-this-actions, #scanbar' ).addClass( isHidden );\n\t\t\t$( '.options-panel-back' ).removeClass( isHidden );\n\n\t\t\t$( '.options-panel' ).removeClass( offscreenHidden )\n\t\t\t\t.one( transitionEndEvent, function() {\n\t\t\t\t\t$( '.post-option:first' ).focus();\n\t\t\t\t} );\n\t\t}\n\n\t\tfunction closeSidebar() {\n\t\t\tsidebarIsOpen = false;\n\n\t\t\t$( '.options' ).removeClass( 'open' ).addClass( 'closed' );\n\t\t\t$( '.options-panel-back' ).addClass( isHidden );\n\t\t\t$( '.press-this-actions, #scanbar' ).removeClass( isHidden );\n\n\t\t\t$( '.options-panel' ).addClass( isOffScreen )\n\t\t\t\t.one( transitionEndEvent, function() {\n\t\t\t\t\t$( this ).addClass( isHidden );\n\t\t\t\t\t// Reset to options list\n\t\t\t\t\t$( '.post-options' ).removeClass( offscreenHidden );\n\t\t\t\t\t$( '.setting-modal').addClass( offscreenHidden );\n\t\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Interactive behavior for the post title's field placeholder\n\t\t */\n\t\tfunction monitorPlaceholder() {\n\t\t\tvar $titleField = $( '#title-container' ),\n\t\t\t\t$placeholder = $( '.post-title-placeholder' );\n\n\t\t\t$titleField.on( 'focus', function() {\n\t\t\t\t$placeholder.addClass( 'is-hidden' );\n\t\t\t}).on( 'blur', function() {\n\t\t\t\tif ( ! $titleField.text() && ! $titleField.html() ) {\n\t\t\t\t\t$placeholder.removeClass( 'is-hidden' );\n\t\t\t\t}\n\t\t\t}).on( 'keyup', function() {\n\t\t\t\tsaveAlert = true;\n\t\t\t}).on( 'paste', function( event ) {\n\t\t\t\tvar text, range,\n\t\t\t\t\tclipboard = event.originalEvent.clipboardData || window.clipboardData;\n\n\t\t\t\tif ( clipboard ) {\n\t\t\t\t\ttry{\n\t\t\t\t\t\ttext = clipboard.getData( 'Text' ) || clipboard.getData( 'text/plain' );\n\n\t\t\t\t\t\tif ( text ) {\n\t\t\t\t\t\t\ttext = $.trim( text.replace( /\\s+/g, ' ' ) );\n\n\t\t\t\t\t\t\tif ( window.getSelection ) {\n\t\t\t\t\t\t\t\trange = window.getSelection().getRangeAt(0);\n\n\t\t\t\t\t\t\t\tif ( range ) {\n\t\t\t\t\t\t\t\t\tif ( ! range.collapsed ) {\n\t\t\t\t\t\t\t\t\t\trange.deleteContents();\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\trange.insertNode( document.createTextNode( text ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( document.selection ) {\n\t\t\t\t\t\t\t\trange = document.selection.createRange();\n\n\t\t\t\t\t\t\t\tif ( range ) {\n\t\t\t\t\t\t\t\t\trange.text = text;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch ( er ) {}\n\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tsaveAlert = true;\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t$titleField.text( getTitleText() );\n\t\t\t\t}, 50 );\n\t\t\t});\n\n\t\t\tif ( $titleField.text() || $titleField.html() ) {\n\t\t\t\t$placeholder.addClass('is-hidden');\n\t\t\t}\n\t\t}\n\n\t\tfunction toggleCatItem( $element ) {\n\t\t\tif ( $element.hasClass( 'selected' ) ) {\n\t\t\t\t$element.removeClass( 'selected' ).attr( 'aria-checked', 'false' );\n\t\t\t} else {\n\t\t\t\t$element.addClass( 'selected' ).attr( 'aria-checked', 'true' );\n\t\t\t}\n\t\t}\n\n\t\tfunction monitorCatList() {\n\t\t\t$( '.categories-select' ).on( 'click.press-this keydown.press-this', function( event ) {\n\t\t\t\tvar $element = $( event.target );\n\n\t\t\t\tif ( $element.is( 'div.category' ) ) {\n\t\t\t\t\tif ( event.type === 'keydown' && event.keyCode !== 32 ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\ttoggleCatItem( $element );\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction splitButtonClose() {\n\t\t\t$( '.split-button' ).removeClass( 'is-open' );\n\t\t\t$( '.split-button-toggle' ).attr( 'aria-expanded', 'false' );\n\t\t}\n\n\t\t/* ***************************************************************\n\t\t * PROCESSING FUNCTIONS\n\t\t *************************************************************** */\n\n\t\t/**\n\t\t * Calls all the rendring related functions to happen on page load\n\t\t */\n\t\tfunction render(){\n\t\t\t// We're on!\n\t\t\trenderToolsVisibility();\n\t\t\trenderDetectedMedia();\n\t\t\trenderStartupNotices();\n\n\t\t\tif ( window.tagBox ) {\n\t\t\t\twindow.tagBox.init();\n\t\t\t}\n\n\t\t\t// iOS doesn't fire click events on \"standard\" elements without this...\n\t\t\tif ( iOS ) {\n\t\t\t\t$( document.body ).css( 'cursor', 'pointer' );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Set app events and other state monitoring related code.\n\t\t */\n\t\tfunction monitor() {\n\t\t\tvar $splitButton = $( '.split-button' );\n\n\t\t\t$document.on( 'tinymce-editor-init', function( event, ed ) {\n\t\t\t\teditor = ed;\n\n\t\t\t\teditor.on( 'nodechange', function() {\n\t\t\t\t\thasSetFocus = true;\n\t\t\t\t});\n\n\t\t\t\teditor.on( 'focus', function() {\n\t\t\t\t\tsplitButtonClose();\n\t\t\t\t});\n\n\t\t\t\teditor.on( 'show', function() {\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\teditor.execCommand( 'wpAutoResize' );\n\t\t\t\t\t}, 300 );\n\t\t\t\t});\n\n\t\t\t\teditor.on( 'hide', function() {\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\ttextEditorResize( 'reset' );\n\t\t\t\t\t}, 100 );\n\t\t\t\t});\n\n\t\t\t\teditor.on( 'keyup', mceKeyup );\n\t\t\t\teditor.on( 'undo redo', mceScroll );\n\n\t\t\t}).on( 'click.press-this keypress.press-this', '.suggested-media-thumbnail', function( event ) {\n\t\t\t\tif ( event.type === 'click' || event.keyCode === 13 ) {\n\t\t\t\t\tinsertSelectedMedia( $( this ) );\n\t\t\t\t}\n\t\t\t}).on( 'click.press-this', function( event ) {\n\t\t\t\tif ( ! $( event.target ).closest( 'button' ).hasClass( 'split-button-toggle' ) ) {\n\t\t\t\t\tsplitButtonClose();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Publish, Draft and Preview buttons\n\t\t\t$( '.post-actions' ).on( 'click.press-this', function( event ) {\n\t\t\t\tvar location,\n\t\t\t\t\t$target = $( event.target ),\n\t\t\t\t\t$button = $target.closest( 'button' );\n\n\t\t\t\tif ( $button.length ) {\n\t\t\t\t\tif ( $button.hasClass( 'draft-button' ) ) {\n\t\t\t\t\t\t$( '.publish-button' ).addClass( 'is-saving' );\n\t\t\t\t\t\tsubmitPost( 'draft' );\n\t\t\t\t\t} else if ( $button.hasClass( 'publish-button' ) ) {\n\t\t\t\t\t\t$button.addClass( 'is-saving' );\n\n\t\t\t\t\t\tif ( window.history.replaceState ) {\n\t\t\t\t\t\t\tlocation = window.location.href;\n\t\t\t\t\t\t\tlocation += ( location.indexOf( '?' ) !== -1 ) ? '&' : '?';\n\t\t\t\t\t\t\tlocation += 'wp-press-this-reload=true';\n\n\t\t\t\t\t\t\twindow.history.replaceState( null, null, location );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsubmitPost( 'publish' );\n\t\t\t\t\t} else if ( $button.hasClass( 'preview-button' ) ) {\n\t\t\t\t\t\tprepareFormData();\n\t\t\t\t\t\twindow.opener && window.opener.focus();\n\n\t\t\t\t\t\t$( '#wp-preview' ).val( 'dopreview' );\n\t\t\t\t\t\t$( '#pressthis-form' ).attr( 'target', '_blank' ).submit().attr( 'target', '' );\n\t\t\t\t\t\t$( '#wp-preview' ).val( '' );\n\t\t\t\t\t} else if ( $button.hasClass( 'standard-editor-button' ) ) {\n\t\t\t\t\t\t$( '.publish-button' ).addClass( 'is-saving' );\n\t\t\t\t\t\t$( '#pt-force-redirect' ).val( 'true' );\n\t\t\t\t\t\tsubmitPost( 'draft' );\n\t\t\t\t\t} else if ( $button.hasClass( 'split-button-toggle' ) ) {\n\t\t\t\t\t\tif ( $splitButton.hasClass( 'is-open' ) ) {\n\t\t\t\t\t\t\t$splitButton.removeClass( 'is-open' );\n\t\t\t\t\t\t\t$button.attr( 'aria-expanded', 'false' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$splitButton.addClass( 'is-open' );\n\t\t\t\t\t\t\t$button.attr( 'aria-expanded', 'true' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmonitorOptionsModal();\n\t\t\tmonitorPlaceholder();\n\t\t\tmonitorCatList();\n\n\t\t\t$( '.options' ).on( 'click.press-this', function() {\n\t\t\t\tif ( $( this ).hasClass( 'open' ) ) {\n\t\t\t\t\tcloseSidebar();\n\t\t\t\t} else {\n\t\t\t\t\topenSidebar();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Close the sidebar when focus moves outside of it.\n\t\t\t$( '.options-panel, .options-panel-back' ).on( 'focusout.press-this', function() {\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tvar node = document.activeElement,\n\t\t\t\t\t\t$node = $( node );\n\n\t\t\t\t\tif ( sidebarIsOpen && node && ! $node.hasClass( 'options-panel-back' ) &&\n\t\t\t\t\t\t( node.nodeName === 'BODY' ||\n\t\t\t\t\t\t\t( ! $node.closest( '.options-panel' ).length &&\n\t\t\t\t\t\t\t! $node.closest( '.options' ).length ) ) ) {\n\n\t\t\t\t\t\tcloseSidebar();\n\t\t\t\t\t}\n\t\t\t\t}, 50 );\n\t\t\t});\n\n\t\t\t$( '#post-formats-select input' ).on( 'change', function() {\n\t\t\t\tvar $this = $( this );\n\n\t\t\t\tif ( $this.is( ':checked' ) ) {\n\t\t\t\t\t$( '#post-option-post-format' ).text( $( 'label[for=\"' + $this.attr( 'id' ) + '\"]' ).text() || '' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$window.on( 'beforeunload.press-this', function() {\n\t\t\t\tif ( saveAlert || ( editor && editor.isDirty() ) ) {\n\t\t\t\t\treturn __( 'saveAlert' );\n\t\t\t\t}\n\t\t\t} ).on( 'resize.press-this', function() {\n\t\t\t\tif ( ! editor || editor.isHidden() ) {\n\t\t\t\t\ttextEditorResize( 'reset' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t$( 'button.add-cat-toggle' ).on( 'click.press-this', function() {\n\t\t\t\tvar $this = $( this );\n\n\t\t\t\t$this.toggleClass( 'is-toggled' );\n\t\t\t\t$this.attr( 'aria-expanded', 'false' === $this.attr( 'aria-expanded' ) ? 'true' : 'false' );\n\t\t\t\t$( '.setting-modal .add-category, .categories-search-wrapper' ).toggleClass( 'is-hidden' );\n\t\t\t} );\n\n\t\t\t$( 'button.add-cat-submit' ).on( 'click.press-this', saveNewCategory );\n\n\t\t\t$( '.categories-search' ).on( 'keyup.press-this', function() {\n\t\t\t\tvar search = $( this ).val().toLowerCase() || '';\n\n\t\t\t\t// Don't search when less thasn 3 extended ASCII chars\n\t\t\t\tif ( /[\\x20-\\xFF]+/.test( search ) && search.length < 2 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$.each( catsCache, function( i, cat ) {\n\t\t\t\t\tcat.node.removeClass( 'is-hidden searched-parent' );\n\t\t\t\t} );\n\n\t\t\t\tif ( search ) {\n\t\t\t\t\t$.each( catsCache, function( i, cat ) {\n\t\t\t\t\t\tif ( cat.text.indexOf( search ) === -1 ) {\n\t\t\t\t\t\t\tcat.node.addClass( 'is-hidden' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcat.parents.addClass( 'searched-parent' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$textEditor.on( 'focus.press-this input.press-this propertychange.press-this', textEditorResize );\n\n\t\t\treturn true;\n\t\t}\n\n\t\tfunction refreshCatsCache() {\n\t\t\t$( '.categories-select' ).find( 'li' ).each( function() {\n\t\t\t\tvar $this = $( this );\n\n\t\t\t\tcatsCache.push( {\n\t\t\t\t\tnode: $this,\n\t\t\t\t\tparents: $this.parents( 'li' ),\n\t\t\t\t\ttext: $this.children( '.category' ).text().toLowerCase()\n\t\t\t\t} );\n\t\t\t} );\n\t\t}\n\n\t\t// Let's go!\n\t\t$document.ready( function() {\n\t\t\trender();\n\t\t\tmonitor();\n\t\t\trefreshCatsCache();\n\t\t});\n\n\t\t// Expose public methods?\n\t\treturn {\n\t\t\trenderNotice: renderNotice,\n\t\t\trenderError: renderError\n\t\t};\n\t};\n\n\twindow.wp = window.wp || {};\n\twindow.wp.pressThis = new PressThis();\n\n}( jQuery, window ));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/revisions.js",
    "content": "/* global isRtl */\n/**\n * @file Revisions interface functions, Backbone classes and\n * the revisions.php document.ready bootstrap.\n *\n */\n\nwindow.wp = window.wp || {};\n\n(function($) {\n\tvar revisions;\n\t/**\n\t * Expose the module in window.wp.revisions.\n\t */\n\trevisions = wp.revisions = { model: {}, view: {}, controller: {} };\n\n\t// Link post revisions data served from the back-end.\n\trevisions.settings = window._wpRevisionsSettings || {};\n\n\t// For debugging\n\trevisions.debug = false;\n\n\t/**\n\t * wp.revisions.log\n\t *\n\t * A debugging utility for revisions. Works only when a\n\t * debug flag is on and the browser supports it.\n\t */\n\trevisions.log = function() {\n\t\tif ( window.console && revisions.debug ) {\n\t\t\twindow.console.log.apply( window.console, arguments );\n\t\t}\n\t};\n\n\t// Handy functions to help with positioning\n\t$.fn.allOffsets = function() {\n\t\tvar offset = this.offset() || {top: 0, left: 0}, win = $(window);\n\t\treturn _.extend( offset, {\n\t\t\tright:  win.width()  - offset.left - this.outerWidth(),\n\t\t\tbottom: win.height() - offset.top  - this.outerHeight()\n\t\t});\n\t};\n\n\t$.fn.allPositions = function() {\n\t\tvar position = this.position() || {top: 0, left: 0}, parent = this.parent();\n\t\treturn _.extend( position, {\n\t\t\tright:  parent.outerWidth()  - position.left - this.outerWidth(),\n\t\t\tbottom: parent.outerHeight() - position.top  - this.outerHeight()\n\t\t});\n\t};\n\n\t/**\n\t * ========================================================================\n\t * MODELS\n\t * ========================================================================\n\t */\n\trevisions.model.Slider = Backbone.Model.extend({\n\t\tdefaults: {\n\t\t\tvalue: null,\n\t\t\tvalues: null,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tstep: 1,\n\t\t\trange: false,\n\t\t\tcompareTwoMode: false\n\t\t},\n\n\t\tinitialize: function( options ) {\n\t\t\tthis.frame = options.frame;\n\t\t\tthis.revisions = options.revisions;\n\n\t\t\t// Listen for changes to the revisions or mode from outside\n\t\t\tthis.listenTo( this.frame, 'update:revisions', this.receiveRevisions );\n\t\t\tthis.listenTo( this.frame, 'change:compareTwoMode', this.updateMode );\n\n\t\t\t// Listen for internal changes\n\t\t\tthis.on( 'change:from', this.handleLocalChanges );\n\t\t\tthis.on( 'change:to', this.handleLocalChanges );\n\t\t\tthis.on( 'change:compareTwoMode', this.updateSliderSettings );\n\t\t\tthis.on( 'update:revisions', this.updateSliderSettings );\n\n\t\t\t// Listen for changes to the hovered revision\n\t\t\tthis.on( 'change:hoveredRevision', this.hoverRevision );\n\n\t\t\tthis.set({\n\t\t\t\tmax:   this.revisions.length - 1,\n\t\t\t\tcompareTwoMode: this.frame.get('compareTwoMode'),\n\t\t\t\tfrom: this.frame.get('from'),\n\t\t\t\tto: this.frame.get('to')\n\t\t\t});\n\t\t\tthis.updateSliderSettings();\n\t\t},\n\n\t\tgetSliderValue: function( a, b ) {\n\t\t\treturn isRtl ? this.revisions.length - this.revisions.indexOf( this.get(a) ) - 1 : this.revisions.indexOf( this.get(b) );\n\t\t},\n\n\t\tupdateSliderSettings: function() {\n\t\t\tif ( this.get('compareTwoMode') ) {\n\t\t\t\tthis.set({\n\t\t\t\t\tvalues: [\n\t\t\t\t\t\tthis.getSliderValue( 'to', 'from' ),\n\t\t\t\t\t\tthis.getSliderValue( 'from', 'to' )\n\t\t\t\t\t],\n\t\t\t\t\tvalue: null,\n\t\t\t\t\trange: true // ensures handles cannot cross\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.set({\n\t\t\t\t\tvalue: this.getSliderValue( 'to', 'to' ),\n\t\t\t\t\tvalues: null,\n\t\t\t\t\trange: false\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.trigger( 'update:slider' );\n\t\t},\n\n\t\t// Called when a revision is hovered\n\t\thoverRevision: function( model, value ) {\n\t\t\tthis.trigger( 'hovered:revision', value );\n\t\t},\n\n\t\t// Called when `compareTwoMode` changes\n\t\tupdateMode: function( model, value ) {\n\t\t\tthis.set({ compareTwoMode: value });\n\t\t},\n\n\t\t// Called when `from` or `to` changes in the local model\n\t\thandleLocalChanges: function() {\n\t\t\tthis.frame.set({\n\t\t\t\tfrom: this.get('from'),\n\t\t\t\tto: this.get('to')\n\t\t\t});\n\t\t},\n\n\t\t// Receives revisions changes from outside the model\n\t\treceiveRevisions: function( from, to ) {\n\t\t\t// Bail if nothing changed\n\t\t\tif ( this.get('from') === from && this.get('to') === to ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.set({ from: from, to: to }, { silent: true });\n\t\t\tthis.trigger( 'update:revisions', from, to );\n\t\t}\n\n\t});\n\n\trevisions.model.Tooltip = Backbone.Model.extend({\n\t\tdefaults: {\n\t\t\trevision: null,\n\t\t\toffset: {},\n\t\t\thovering: false, // Whether the mouse is hovering\n\t\t\tscrubbing: false // Whether the mouse is scrubbing\n\t\t},\n\n\t\tinitialize: function( options ) {\n\t\t\tthis.frame = options.frame;\n\t\t\tthis.revisions = options.revisions;\n\t\t\tthis.slider = options.slider;\n\n\t\t\tthis.listenTo( this.slider, 'hovered:revision', this.updateRevision );\n\t\t\tthis.listenTo( this.slider, 'change:hovering', this.setHovering );\n\t\t\tthis.listenTo( this.slider, 'change:scrubbing', this.setScrubbing );\n\t\t},\n\n\n\t\tupdateRevision: function( revision ) {\n\t\t\tthis.set({ revision: revision });\n\t\t},\n\n\t\tsetHovering: function( model, value ) {\n\t\t\tthis.set({ hovering: value });\n\t\t},\n\n\t\tsetScrubbing: function( model, value ) {\n\t\t\tthis.set({ scrubbing: value });\n\t\t}\n\t});\n\n\trevisions.model.Revision = Backbone.Model.extend({});\n\n\t/**\n\t * wp.revisions.model.Revisions\n\t *\n\t * A collection of post revisions.\n\t */\n\trevisions.model.Revisions = Backbone.Collection.extend({\n\t\tmodel: revisions.model.Revision,\n\n\t\tinitialize: function() {\n\t\t\t_.bindAll( this, 'next', 'prev' );\n\t\t},\n\n\t\tnext: function( revision ) {\n\t\t\tvar index = this.indexOf( revision );\n\n\t\t\tif ( index !== -1 && index !== this.length - 1 ) {\n\t\t\t\treturn this.at( index + 1 );\n\t\t\t}\n\t\t},\n\n\t\tprev: function( revision ) {\n\t\t\tvar index = this.indexOf( revision );\n\n\t\t\tif ( index !== -1 && index !== 0 ) {\n\t\t\t\treturn this.at( index - 1 );\n\t\t\t}\n\t\t}\n\t});\n\n\trevisions.model.Field = Backbone.Model.extend({});\n\n\trevisions.model.Fields = Backbone.Collection.extend({\n\t\tmodel: revisions.model.Field\n\t});\n\n\trevisions.model.Diff = Backbone.Model.extend({\n\t\tinitialize: function() {\n\t\t\tvar fields = this.get('fields');\n\t\t\tthis.unset('fields');\n\n\t\t\tthis.fields = new revisions.model.Fields( fields );\n\t\t}\n\t});\n\n\trevisions.model.Diffs = Backbone.Collection.extend({\n\t\tinitialize: function( models, options ) {\n\t\t\t_.bindAll( this, 'getClosestUnloaded' );\n\t\t\tthis.loadAll = _.once( this._loadAll );\n\t\t\tthis.revisions = options.revisions;\n\t\t\tthis.postId = options.postId;\n\t\t\tthis.requests  = {};\n\t\t},\n\n\t\tmodel: revisions.model.Diff,\n\n\t\tensure: function( id, context ) {\n\t\t\tvar diff     = this.get( id ),\n\t\t\t\trequest  = this.requests[ id ],\n\t\t\t\tdeferred = $.Deferred(),\n\t\t\t\tids      = {},\n\t\t\t\tfrom     = id.split(':')[0],\n\t\t\t\tto       = id.split(':')[1];\n\t\t\tids[id] = true;\n\n\t\t\twp.revisions.log( 'ensure', id );\n\n\t\t\tthis.trigger( 'ensure', ids, from, to, deferred.promise() );\n\n\t\t\tif ( diff ) {\n\t\t\t\tdeferred.resolveWith( context, [ diff ] );\n\t\t\t} else {\n\t\t\t\tthis.trigger( 'ensure:load', ids, from, to, deferred.promise() );\n\t\t\t\t_.each( ids, _.bind( function( id ) {\n\t\t\t\t\t// Remove anything that has an ongoing request\n\t\t\t\t\tif ( this.requests[ id ] ) {\n\t\t\t\t\t\tdelete ids[ id ];\n\t\t\t\t\t}\n\t\t\t\t\t// Remove anything we already have\n\t\t\t\t\tif ( this.get( id ) ) {\n\t\t\t\t\t\tdelete ids[ id ];\n\t\t\t\t\t}\n\t\t\t\t}, this ) );\n\t\t\t\tif ( ! request ) {\n\t\t\t\t\t// Always include the ID that started this ensure\n\t\t\t\t\tids[ id ] = true;\n\t\t\t\t\trequest   = this.load( _.keys( ids ) );\n\t\t\t\t}\n\n\t\t\t\trequest.done( _.bind( function() {\n\t\t\t\t\tdeferred.resolveWith( context, [ this.get( id ) ] );\n\t\t\t\t}, this ) ).fail( _.bind( function() {\n\t\t\t\t\tdeferred.reject();\n\t\t\t\t}) );\n\t\t\t}\n\n\t\t\treturn deferred.promise();\n\t\t},\n\n\t\t// Returns an array of proximal diffs\n\t\tgetClosestUnloaded: function( ids, centerId ) {\n\t\t\tvar self = this;\n\t\t\treturn _.chain([0].concat( ids )).initial().zip( ids ).sortBy( function( pair ) {\n\t\t\t\treturn Math.abs( centerId - pair[1] );\n\t\t\t}).map( function( pair ) {\n\t\t\t\treturn pair.join(':');\n\t\t\t}).filter( function( diffId ) {\n\t\t\t\treturn _.isUndefined( self.get( diffId ) ) && ! self.requests[ diffId ];\n\t\t\t}).value();\n\t\t},\n\n\t\t_loadAll: function( allRevisionIds, centerId, num ) {\n\t\t\tvar self = this, deferred = $.Deferred(),\n\t\t\t\tdiffs = _.first( this.getClosestUnloaded( allRevisionIds, centerId ), num );\n\t\t\tif ( _.size( diffs ) > 0 ) {\n\t\t\t\tthis.load( diffs ).done( function() {\n\t\t\t\t\tself._loadAll( allRevisionIds, centerId, num ).done( function() {\n\t\t\t\t\t\tdeferred.resolve();\n\t\t\t\t\t});\n\t\t\t\t}).fail( function() {\n\t\t\t\t\tif ( 1 === num ) { // Already tried 1. This just isn't working. Give up.\n\t\t\t\t\t\tdeferred.reject();\n\t\t\t\t\t} else { // Request fewer diffs this time\n\t\t\t\t\t\tself._loadAll( allRevisionIds, centerId, Math.ceil( num / 2 ) ).done( function() {\n\t\t\t\t\t\t\tdeferred.resolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdeferred.resolve();\n\t\t\t}\n\t\t\treturn deferred;\n\t\t},\n\n\t\tload: function( comparisons ) {\n\t\t\twp.revisions.log( 'load', comparisons );\n\t\t\t// Our collection should only ever grow, never shrink, so remove: false\n\t\t\treturn this.fetch({ data: { compare: comparisons }, remove: false }).done( function() {\n\t\t\t\twp.revisions.log( 'load:complete', comparisons );\n\t\t\t});\n\t\t},\n\n\t\tsync: function( method, model, options ) {\n\t\t\tif ( 'read' === method ) {\n\t\t\t\toptions = options || {};\n\t\t\t\toptions.context = this;\n\t\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\t\taction: 'get-revision-diffs',\n\t\t\t\t\tpost_id: this.postId\n\t\t\t\t});\n\n\t\t\t\tvar deferred = wp.ajax.send( options ),\n\t\t\t\t\trequests = this.requests;\n\n\t\t\t\t// Record that we're requesting each diff.\n\t\t\t\tif ( options.data.compare ) {\n\t\t\t\t\t_.each( options.data.compare, function( id ) {\n\t\t\t\t\t\trequests[ id ] = deferred;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// When the request completes, clear the stored request.\n\t\t\t\tdeferred.always( function() {\n\t\t\t\t\tif ( options.data.compare ) {\n\t\t\t\t\t\t_.each( options.data.compare, function( id ) {\n\t\t\t\t\t\t\tdelete requests[ id ];\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn deferred;\n\n\t\t\t// Otherwise, fall back to `Backbone.sync()`.\n\t\t\t} else {\n\t\t\t\treturn Backbone.Model.prototype.sync.apply( this, arguments );\n\t\t\t}\n\t\t}\n\t});\n\n\n\t/**\n\t * wp.revisions.model.FrameState\n\t *\n\t * The frame state.\n\t *\n\t * @see wp.revisions.view.Frame\n\t *\n\t * @param {object}                    attributes        Model attributes - none are required.\n\t * @param {object}                    options           Options for the model.\n\t * @param {revisions.model.Revisions} options.revisions A collection of revisions.\n\t */\n\trevisions.model.FrameState = Backbone.Model.extend({\n\t\tdefaults: {\n\t\t\tloading: false,\n\t\t\terror: false,\n\t\t\tcompareTwoMode: false\n\t\t},\n\n\t\tinitialize: function( attributes, options ) {\n\t\t\tvar state = this.get( 'initialDiffState' );\n\t\t\t_.bindAll( this, 'receiveDiff' );\n\t\t\tthis._debouncedEnsureDiff = _.debounce( this._ensureDiff, 200 );\n\n\t\t\tthis.revisions = options.revisions;\n\n\t\t\tthis.diffs = new revisions.model.Diffs( [], {\n\t\t\t\trevisions: this.revisions,\n\t\t\t\tpostId: this.get( 'postId' )\n\t\t\t} );\n\n\t\t\t// Set the initial diffs collection.\n\t\t\tthis.diffs.set( this.get( 'diffData' ) );\n\n\t\t\t// Set up internal listeners\n\t\t\tthis.listenTo( this, 'change:from', this.changeRevisionHandler );\n\t\t\tthis.listenTo( this, 'change:to', this.changeRevisionHandler );\n\t\t\tthis.listenTo( this, 'change:compareTwoMode', this.changeMode );\n\t\t\tthis.listenTo( this, 'update:revisions', this.updatedRevisions );\n\t\t\tthis.listenTo( this.diffs, 'ensure:load', this.updateLoadingStatus );\n\t\t\tthis.listenTo( this, 'update:diff', this.updateLoadingStatus );\n\n\t\t\t// Set the initial revisions, baseUrl, and mode as provided through attributes.\n\n\t\t\tthis.set( {\n\t\t\t\tto : this.revisions.get( state.to ),\n\t\t\t\tfrom : this.revisions.get( state.from ),\n\t\t\t\tcompareTwoMode : state.compareTwoMode\n\t\t\t} );\n\n\t\t\t// Start the router if browser supports History API\n\t\t\tif ( window.history && window.history.pushState ) {\n\t\t\t\tthis.router = new revisions.Router({ model: this });\n\t\t\t\tBackbone.history.start({ pushState: true });\n\t\t\t}\n\t\t},\n\n\t\tupdateLoadingStatus: function() {\n\t\t\tthis.set( 'error', false );\n\t\t\tthis.set( 'loading', ! this.diff() );\n\t\t},\n\n\t\tchangeMode: function( model, value ) {\n\t\t\tvar toIndex = this.revisions.indexOf( this.get( 'to' ) );\n\n\t\t\t// If we were on the first revision before switching to two-handled mode,\n\t\t\t// bump the 'to' position over one\n\t\t\tif ( value && 0 === toIndex ) {\n\t\t\t\tthis.set({\n\t\t\t\t\tfrom: this.revisions.at( toIndex ),\n\t\t\t\t\tto:   this.revisions.at( toIndex + 1 )\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// When switching back to single-handled mode, reset 'from' model to\n\t\t\t// one position before the 'to' model\n\t\t\tif ( ! value && 0 !== toIndex ) { // '! value' means switching to single-handled mode\n\t\t\t\tthis.set({\n\t\t\t\t\tfrom: this.revisions.at( toIndex - 1 ),\n\t\t\t\t\tto:   this.revisions.at( toIndex )\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tupdatedRevisions: function( from, to ) {\n\t\t\tif ( this.get( 'compareTwoMode' ) ) {\n\t\t\t\t// TODO: compare-two loading strategy\n\t\t\t} else {\n\t\t\t\tthis.diffs.loadAll( this.revisions.pluck('id'), to.id, 40 );\n\t\t\t}\n\t\t},\n\n\t\t// Fetch the currently loaded diff.\n\t\tdiff: function() {\n\t\t\treturn this.diffs.get( this._diffId );\n\t\t},\n\n\t\t// So long as `from` and `to` are changed at the same time, the diff\n\t\t// will only be updated once. This is because Backbone updates all of\n\t\t// the changed attributes in `set`, and then fires the `change` events.\n\t\tupdateDiff: function( options ) {\n\t\t\tvar from, to, diffId, diff;\n\n\t\t\toptions = options || {};\n\t\t\tfrom = this.get('from');\n\t\t\tto = this.get('to');\n\t\t\tdiffId = ( from ? from.id : 0 ) + ':' + to.id;\n\n\t\t\t// Check if we're actually changing the diff id.\n\t\t\tif ( this._diffId === diffId ) {\n\t\t\t\treturn $.Deferred().reject().promise();\n\t\t\t}\n\n\t\t\tthis._diffId = diffId;\n\t\t\tthis.trigger( 'update:revisions', from, to );\n\n\t\t\tdiff = this.diffs.get( diffId );\n\n\t\t\t// If we already have the diff, then immediately trigger the update.\n\t\t\tif ( diff ) {\n\t\t\t\tthis.receiveDiff( diff );\n\t\t\t\treturn $.Deferred().resolve().promise();\n\t\t\t// Otherwise, fetch the diff.\n\t\t\t} else {\n\t\t\t\tif ( options.immediate ) {\n\t\t\t\t\treturn this._ensureDiff();\n\t\t\t\t} else {\n\t\t\t\t\tthis._debouncedEnsureDiff();\n\t\t\t\t\treturn $.Deferred().reject().promise();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// A simple wrapper around `updateDiff` to prevent the change event's\n\t\t// parameters from being passed through.\n\t\tchangeRevisionHandler: function() {\n\t\t\tthis.updateDiff();\n\t\t},\n\n\t\treceiveDiff: function( diff ) {\n\t\t\t// Did we actually get a diff?\n\t\t\tif ( _.isUndefined( diff ) || _.isUndefined( diff.id ) ) {\n\t\t\t\tthis.set({\n\t\t\t\t\tloading: false,\n\t\t\t\t\terror: true\n\t\t\t\t});\n\t\t\t} else if ( this._diffId === diff.id ) { // Make sure the current diff didn't change\n\t\t\t\tthis.trigger( 'update:diff', diff );\n\t\t\t}\n\t\t},\n\n\t\t_ensureDiff: function() {\n\t\t\treturn this.diffs.ensure( this._diffId, this ).always( this.receiveDiff );\n\t\t}\n\t});\n\n\n\t/**\n\t * ========================================================================\n\t * VIEWS\n\t * ========================================================================\n\t */\n\n\t/**\n\t * wp.revisions.view.Frame\n\t *\n\t * Top level frame that orchestrates the revisions experience.\n\t *\n\t * @param {object}                     options       The options hash for the view.\n\t * @param {revisions.model.FrameState} options.model The frame state model.\n\t */\n\trevisions.view.Frame = wp.Backbone.View.extend({\n\t\tclassName: 'revisions',\n\t\ttemplate: wp.template('revisions-frame'),\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( this.model, 'update:diff', this.renderDiff );\n\t\t\tthis.listenTo( this.model, 'change:compareTwoMode', this.updateCompareTwoMode );\n\t\t\tthis.listenTo( this.model, 'change:loading', this.updateLoadingStatus );\n\t\t\tthis.listenTo( this.model, 'change:error', this.updateErrorStatus );\n\n\t\t\tthis.views.set( '.revisions-control-frame', new revisions.view.Controls({\n\t\t\t\tmodel: this.model\n\t\t\t}) );\n\t\t},\n\n\t\trender: function() {\n\t\t\twp.Backbone.View.prototype.render.apply( this, arguments );\n\n\t\t\t$('html').css( 'overflow-y', 'scroll' );\n\t\t\t$('#wpbody-content .wrap').append( this.el );\n\t\t\tthis.updateCompareTwoMode();\n\t\t\tthis.renderDiff( this.model.diff() );\n\t\t\tthis.views.ready();\n\n\t\t\treturn this;\n\t\t},\n\n\t\trenderDiff: function( diff ) {\n\t\t\tthis.views.set( '.revisions-diff-frame', new revisions.view.Diff({\n\t\t\t\tmodel: diff\n\t\t\t}) );\n\t\t},\n\n\t\tupdateLoadingStatus: function() {\n\t\t\tthis.$el.toggleClass( 'loading', this.model.get('loading') );\n\t\t},\n\n\t\tupdateErrorStatus: function() {\n\t\t\tthis.$el.toggleClass( 'diff-error', this.model.get('error') );\n\t\t},\n\n\t\tupdateCompareTwoMode: function() {\n\t\t\tthis.$el.toggleClass( 'comparing-two-revisions', this.model.get('compareTwoMode') );\n\t\t}\n\t});\n\n\t/**\n\t * wp.revisions.view.Controls\n\t *\n\t * The controls view.\n\t *\n\t * Contains the revision slider, previous/next buttons, the meta info and the compare checkbox.\n\t */\n\trevisions.view.Controls = wp.Backbone.View.extend({\n\t\tclassName: 'revisions-controls',\n\n\t\tinitialize: function() {\n\t\t\t_.bindAll( this, 'setWidth' );\n\n\t\t\t// Add the button view\n\t\t\tthis.views.add( new revisions.view.Buttons({\n\t\t\t\tmodel: this.model\n\t\t\t}) );\n\n\t\t\t// Add the checkbox view\n\t\t\tthis.views.add( new revisions.view.Checkbox({\n\t\t\t\tmodel: this.model\n\t\t\t}) );\n\n\t\t\t// Prep the slider model\n\t\t\tvar slider = new revisions.model.Slider({\n\t\t\t\tframe: this.model,\n\t\t\t\trevisions: this.model.revisions\n\t\t\t}),\n\n\t\t\t// Prep the tooltip model\n\t\t\ttooltip = new revisions.model.Tooltip({\n\t\t\t\tframe: this.model,\n\t\t\t\trevisions: this.model.revisions,\n\t\t\t\tslider: slider\n\t\t\t});\n\n\t\t\t// Add the tooltip view\n\t\t\tthis.views.add( new revisions.view.Tooltip({\n\t\t\t\tmodel: tooltip\n\t\t\t}) );\n\n\t\t\t// Add the tickmarks view\n\t\t\tthis.views.add( new revisions.view.Tickmarks({\n\t\t\t\tmodel: tooltip\n\t\t\t}) );\n\n\t\t\t// Add the slider view\n\t\t\tthis.views.add( new revisions.view.Slider({\n\t\t\t\tmodel: slider\n\t\t\t}) );\n\n\t\t\t// Add the Metabox view\n\t\t\tthis.views.add( new revisions.view.Metabox({\n\t\t\t\tmodel: this.model\n\t\t\t}) );\n\t\t},\n\n\t\tready: function() {\n\t\t\tthis.top = this.$el.offset().top;\n\t\t\tthis.window = $(window);\n\t\t\tthis.window.on( 'scroll.wp.revisions', {controls: this}, function(e) {\n\t\t\t\tvar controls  = e.data.controls,\n\t\t\t\t\tcontainer = controls.$el.parent(),\n\t\t\t\t\tscrolled  = controls.window.scrollTop(),\n\t\t\t\t\tframe     = controls.views.parent;\n\n\t\t\t\tif ( scrolled >= controls.top ) {\n\t\t\t\t\tif ( ! frame.$el.hasClass('pinned') ) {\n\t\t\t\t\t\tcontrols.setWidth();\n\t\t\t\t\t\tcontainer.css('height', container.height() + 'px' );\n\t\t\t\t\t\tcontrols.window.on('resize.wp.revisions.pinning click.wp.revisions.pinning', {controls: controls}, function(e) {\n\t\t\t\t\t\t\te.data.controls.setWidth();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tframe.$el.addClass('pinned');\n\t\t\t\t} else if ( frame.$el.hasClass('pinned') ) {\n\t\t\t\t\tcontrols.window.off('.wp.revisions.pinning');\n\t\t\t\t\tcontrols.$el.css('width', 'auto');\n\t\t\t\t\tframe.$el.removeClass('pinned');\n\t\t\t\t\tcontainer.css('height', 'auto');\n\t\t\t\t\tcontrols.top = controls.$el.offset().top;\n\t\t\t\t} else {\n\t\t\t\t\tcontrols.top = controls.$el.offset().top;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tsetWidth: function() {\n\t\t\tthis.$el.css('width', this.$el.parent().width() + 'px');\n\t\t}\n\t});\n\n\t// The tickmarks view\n\trevisions.view.Tickmarks = wp.Backbone.View.extend({\n\t\tclassName: 'revisions-tickmarks',\n\t\tdirection: isRtl ? 'right' : 'left',\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( this.model, 'change:revision', this.reportTickPosition );\n\t\t},\n\n\t\treportTickPosition: function( model, revision ) {\n\t\t\tvar offset, thisOffset, parentOffset, tick, index = this.model.revisions.indexOf( revision );\n\t\t\tthisOffset = this.$el.allOffsets();\n\t\t\tparentOffset = this.$el.parent().allOffsets();\n\t\t\tif ( index === this.model.revisions.length - 1 ) {\n\t\t\t\t// Last one\n\t\t\t\toffset = {\n\t\t\t\t\trightPlusWidth: thisOffset.left - parentOffset.left + 1,\n\t\t\t\t\tleftPlusWidth: thisOffset.right - parentOffset.right + 1\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t// Normal tick\n\t\t\t\ttick = this.$('div:nth-of-type(' + (index + 1) + ')');\n\t\t\t\toffset = tick.allPositions();\n\t\t\t\t_.extend( offset, {\n\t\t\t\t\tleft: offset.left + thisOffset.left - parentOffset.left,\n\t\t\t\t\tright: offset.right + thisOffset.right - parentOffset.right\n\t\t\t\t});\n\t\t\t\t_.extend( offset, {\n\t\t\t\t\tleftPlusWidth: offset.left + tick.outerWidth(),\n\t\t\t\t\trightPlusWidth: offset.right + tick.outerWidth()\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.model.set({ offset: offset });\n\t\t},\n\n\t\tready: function() {\n\t\t\tvar tickCount, tickWidth;\n\t\t\ttickCount = this.model.revisions.length - 1;\n\t\t\ttickWidth = 1 / tickCount;\n\t\t\tthis.$el.css('width', ( this.model.revisions.length * 50 ) + 'px');\n\n\t\t\t_(tickCount).times( function( index ){\n\t\t\t\tthis.$el.append( '<div style=\"' + this.direction + ': ' + ( 100 * tickWidth * index ) + '%\"></div>' );\n\t\t\t}, this );\n\t\t}\n\t});\n\n\t// The metabox view\n\trevisions.view.Metabox = wp.Backbone.View.extend({\n\t\tclassName: 'revisions-meta',\n\n\t\tinitialize: function() {\n\t\t\t// Add the 'from' view\n\t\t\tthis.views.add( new revisions.view.MetaFrom({\n\t\t\t\tmodel: this.model,\n\t\t\t\tclassName: 'diff-meta diff-meta-from'\n\t\t\t}) );\n\n\t\t\t// Add the 'to' view\n\t\t\tthis.views.add( new revisions.view.MetaTo({\n\t\t\t\tmodel: this.model\n\t\t\t}) );\n\t\t}\n\t});\n\n\t// The revision meta view (to be extended)\n\trevisions.view.Meta = wp.Backbone.View.extend({\n\t\ttemplate: wp.template('revisions-meta'),\n\n\t\tevents: {\n\t\t\t'click .restore-revision': 'restoreRevision'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( this.model, 'update:revisions', this.render );\n\t\t},\n\n\t\tprepare: function() {\n\t\t\treturn _.extend( this.model.toJSON()[this.type] || {}, {\n\t\t\t\ttype: this.type\n\t\t\t});\n\t\t},\n\n\t\trestoreRevision: function() {\n\t\t\tdocument.location = this.model.get('to').attributes.restoreUrl;\n\t\t}\n\t});\n\n\t// The revision meta 'from' view\n\trevisions.view.MetaFrom = revisions.view.Meta.extend({\n\t\tclassName: 'diff-meta diff-meta-from',\n\t\ttype: 'from'\n\t});\n\n\t// The revision meta 'to' view\n\trevisions.view.MetaTo = revisions.view.Meta.extend({\n\t\tclassName: 'diff-meta diff-meta-to',\n\t\ttype: 'to'\n\t});\n\n\t// The checkbox view.\n\trevisions.view.Checkbox = wp.Backbone.View.extend({\n\t\tclassName: 'revisions-checkbox',\n\t\ttemplate: wp.template('revisions-checkbox'),\n\n\t\tevents: {\n\t\t\t'click .compare-two-revisions': 'compareTwoToggle'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( this.model, 'change:compareTwoMode', this.updateCompareTwoMode );\n\t\t},\n\n\t\tready: function() {\n\t\t\tif ( this.model.revisions.length < 3 ) {\n\t\t\t\t$('.revision-toggle-compare-mode').hide();\n\t\t\t}\n\t\t},\n\n\t\tupdateCompareTwoMode: function() {\n\t\t\tthis.$('.compare-two-revisions').prop( 'checked', this.model.get('compareTwoMode') );\n\t\t},\n\n\t\t// Toggle the compare two mode feature when the compare two checkbox is checked.\n\t\tcompareTwoToggle: function() {\n\t\t\t// Activate compare two mode?\n\t\t\tthis.model.set({ compareTwoMode: $('.compare-two-revisions').prop('checked') });\n\t\t}\n\t});\n\n\t// The tooltip view.\n\t// Encapsulates the tooltip.\n\trevisions.view.Tooltip = wp.Backbone.View.extend({\n\t\tclassName: 'revisions-tooltip',\n\t\ttemplate: wp.template('revisions-meta'),\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( this.model, 'change:offset', this.render );\n\t\t\tthis.listenTo( this.model, 'change:hovering', this.toggleVisibility );\n\t\t\tthis.listenTo( this.model, 'change:scrubbing', this.toggleVisibility );\n\t\t},\n\n\t\tprepare: function() {\n\t\t\tif ( _.isNull( this.model.get('revision') ) ) {\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\treturn _.extend( { type: 'tooltip' }, {\n\t\t\t\t\tattributes: this.model.get('revision').toJSON()\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\trender: function() {\n\t\t\tvar otherDirection,\n\t\t\t\tdirection,\n\t\t\t\tdirectionVal,\n\t\t\t\tflipped,\n\t\t\t\tcss      = {},\n\t\t\t\tposition = this.model.revisions.indexOf( this.model.get('revision') ) + 1;\n\n\t\t\tflipped = ( position / this.model.revisions.length ) > 0.5;\n\t\t\tif ( isRtl ) {\n\t\t\t\tdirection = flipped ? 'left' : 'right';\n\t\t\t\tdirectionVal = flipped ? 'leftPlusWidth' : direction;\n\t\t\t} else {\n\t\t\t\tdirection = flipped ? 'right' : 'left';\n\t\t\t\tdirectionVal = flipped ? 'rightPlusWidth' : direction;\n\t\t\t}\n\t\t\totherDirection = 'right' === direction ? 'left': 'right';\n\t\t\twp.Backbone.View.prototype.render.apply( this, arguments );\n\t\t\tcss[direction] = this.model.get('offset')[directionVal] + 'px';\n\t\t\tcss[otherDirection] = '';\n\t\t\tthis.$el.toggleClass( 'flipped', flipped ).css( css );\n\t\t},\n\n\t\tvisible: function() {\n\t\t\treturn this.model.get( 'scrubbing' ) || this.model.get( 'hovering' );\n\t\t},\n\n\t\ttoggleVisibility: function() {\n\t\t\tif ( this.visible() ) {\n\t\t\t\tthis.$el.stop().show().fadeTo( 100 - this.el.style.opacity * 100, 1 );\n\t\t\t} else {\n\t\t\t\tthis.$el.stop().fadeTo( this.el.style.opacity * 300, 0, function(){ $(this).hide(); } );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t});\n\n\t// The buttons view.\n\t// Encapsulates all of the configuration for the previous/next buttons.\n\trevisions.view.Buttons = wp.Backbone.View.extend({\n\t\tclassName: 'revisions-buttons',\n\t\ttemplate: wp.template('revisions-buttons'),\n\n\t\tevents: {\n\t\t\t'click .revisions-next .button': 'nextRevision',\n\t\t\t'click .revisions-previous .button': 'previousRevision'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo( this.model, 'update:revisions', this.disabledButtonCheck );\n\t\t},\n\n\t\tready: function() {\n\t\t\tthis.disabledButtonCheck();\n\t\t},\n\n\t\t// Go to a specific model index\n\t\tgotoModel: function( toIndex ) {\n\t\t\tvar attributes = {\n\t\t\t\tto: this.model.revisions.at( toIndex )\n\t\t\t};\n\t\t\t// If we're at the first revision, unset 'from'.\n\t\t\tif ( toIndex ) {\n\t\t\t\tattributes.from = this.model.revisions.at( toIndex - 1 );\n\t\t\t} else {\n\t\t\t\tthis.model.unset('from', { silent: true });\n\t\t\t}\n\n\t\t\tthis.model.set( attributes );\n\t\t},\n\n\t\t// Go to the 'next' revision\n\t\tnextRevision: function() {\n\t\t\tvar toIndex = this.model.revisions.indexOf( this.model.get('to') ) + 1;\n\t\t\tthis.gotoModel( toIndex );\n\t\t},\n\n\t\t// Go to the 'previous' revision\n\t\tpreviousRevision: function() {\n\t\t\tvar toIndex = this.model.revisions.indexOf( this.model.get('to') ) - 1;\n\t\t\tthis.gotoModel( toIndex );\n\t\t},\n\n\t\t// Check to see if the Previous or Next buttons need to be disabled or enabled.\n\t\tdisabledButtonCheck: function() {\n\t\t\tvar maxVal   = this.model.revisions.length - 1,\n\t\t\t\tminVal   = 0,\n\t\t\t\tnext     = $('.revisions-next .button'),\n\t\t\t\tprevious = $('.revisions-previous .button'),\n\t\t\t\tval      = this.model.revisions.indexOf( this.model.get('to') );\n\n\t\t\t// Disable \"Next\" button if you're on the last node.\n\t\t\tnext.prop( 'disabled', ( maxVal === val ) );\n\n\t\t\t// Disable \"Previous\" button if you're on the first node.\n\t\t\tprevious.prop( 'disabled', ( minVal === val ) );\n\t\t}\n\t});\n\n\n\t// The slider view.\n\trevisions.view.Slider = wp.Backbone.View.extend({\n\t\tclassName: 'wp-slider',\n\t\tdirection: isRtl ? 'right' : 'left',\n\n\t\tevents: {\n\t\t\t'mousemove' : 'mouseMove'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\t_.bindAll( this, 'start', 'slide', 'stop', 'mouseMove', 'mouseEnter', 'mouseLeave' );\n\t\t\tthis.listenTo( this.model, 'update:slider', this.applySliderSettings );\n\t\t},\n\n\t\tready: function() {\n\t\t\tthis.$el.css('width', ( this.model.revisions.length * 50 ) + 'px');\n\t\t\tthis.$el.slider( _.extend( this.model.toJSON(), {\n\t\t\t\tstart: this.start,\n\t\t\t\tslide: this.slide,\n\t\t\t\tstop:  this.stop\n\t\t\t}) );\n\n\t\t\tthis.$el.hoverIntent({\n\t\t\t\tover: this.mouseEnter,\n\t\t\t\tout: this.mouseLeave,\n\t\t\t\ttimeout: 800\n\t\t\t});\n\n\t\t\tthis.applySliderSettings();\n\t\t},\n\n\t\tmouseMove: function( e ) {\n\t\t\tvar zoneCount         = this.model.revisions.length - 1, // One fewer zone than models\n\t\t\t\tsliderFrom        = this.$el.allOffsets()[this.direction], // \"From\" edge of slider\n\t\t\t\tsliderWidth       = this.$el.width(), // Width of slider\n\t\t\t\ttickWidth         = sliderWidth / zoneCount, // Calculated width of zone\n\t\t\t\tactualX           = ( isRtl ? $(window).width() - e.pageX : e.pageX ) - sliderFrom, // Flipped for RTL - sliderFrom;\n\t\t\t\tcurrentModelIndex = Math.floor( ( actualX  + ( tickWidth / 2 )  ) / tickWidth ); // Calculate the model index\n\n\t\t\t// Ensure sane value for currentModelIndex.\n\t\t\tif ( currentModelIndex < 0 ) {\n\t\t\t\tcurrentModelIndex = 0;\n\t\t\t} else if ( currentModelIndex >= this.model.revisions.length ) {\n\t\t\t\tcurrentModelIndex = this.model.revisions.length - 1;\n\t\t\t}\n\n\t\t\t// Update the tooltip mode\n\t\t\tthis.model.set({ hoveredRevision: this.model.revisions.at( currentModelIndex ) });\n\t\t},\n\n\t\tmouseLeave: function() {\n\t\t\tthis.model.set({ hovering: false });\n\t\t},\n\n\t\tmouseEnter: function() {\n\t\t\tthis.model.set({ hovering: true });\n\t\t},\n\n\t\tapplySliderSettings: function() {\n\t\t\tthis.$el.slider( _.pick( this.model.toJSON(), 'value', 'values', 'range' ) );\n\t\t\tvar handles = this.$('a.ui-slider-handle');\n\n\t\t\tif ( this.model.get('compareTwoMode') ) {\n\t\t\t\t// in RTL mode the 'left handle' is the second in the slider, 'right' is first\n\t\t\t\thandles.first()\n\t\t\t\t\t.toggleClass( 'to-handle', !! isRtl )\n\t\t\t\t\t.toggleClass( 'from-handle', ! isRtl );\n\t\t\t\thandles.last()\n\t\t\t\t\t.toggleClass( 'from-handle', !! isRtl )\n\t\t\t\t\t.toggleClass( 'to-handle', ! isRtl );\n\t\t\t} else {\n\t\t\t\thandles.removeClass('from-handle to-handle');\n\t\t\t}\n\t\t},\n\n\t\tstart: function( event, ui ) {\n\t\t\tthis.model.set({ scrubbing: true });\n\n\t\t\t// Track the mouse position to enable smooth dragging,\n\t\t\t// overrides default jQuery UI step behavior.\n\t\t\t$( window ).on( 'mousemove.wp.revisions', { view: this }, function( e ) {\n\t\t\t\tvar handles,\n\t\t\t\t\tview              = e.data.view,\n\t\t\t\t\tleftDragBoundary  = view.$el.offset().left,\n\t\t\t\t\tsliderOffset      = leftDragBoundary,\n\t\t\t\t\tsliderRightEdge   = leftDragBoundary + view.$el.width(),\n\t\t\t\t\trightDragBoundary = sliderRightEdge,\n\t\t\t\t\tleftDragReset     = '0',\n\t\t\t\t\trightDragReset    = '100%',\n\t\t\t\t\thandle            = $( ui.handle );\n\n\t\t\t\t// In two handle mode, ensure handles can't be dragged past each other.\n\t\t\t\t// Adjust left/right boundaries and reset points.\n\t\t\t\tif ( view.model.get('compareTwoMode') ) {\n\t\t\t\t\thandles = handle.parent().find('.ui-slider-handle');\n\t\t\t\t\tif ( handle.is( handles.first() ) ) { // We're the left handle\n\t\t\t\t\t\trightDragBoundary = handles.last().offset().left;\n\t\t\t\t\t\trightDragReset    = rightDragBoundary - sliderOffset;\n\t\t\t\t\t} else { // We're the right handle\n\t\t\t\t\t\tleftDragBoundary = handles.first().offset().left + handles.first().width();\n\t\t\t\t\t\tleftDragReset    = leftDragBoundary - sliderOffset;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Follow mouse movements, as long as handle remains inside slider.\n\t\t\t\tif ( e.pageX < leftDragBoundary ) {\n\t\t\t\t\thandle.css( 'left', leftDragReset ); // Mouse to left of slider.\n\t\t\t\t} else if ( e.pageX > rightDragBoundary ) {\n\t\t\t\t\thandle.css( 'left', rightDragReset ); // Mouse to right of slider.\n\t\t\t\t} else {\n\t\t\t\t\thandle.css( 'left', e.pageX - sliderOffset ); // Mouse in slider.\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\tgetPosition: function( position ) {\n\t\t\treturn isRtl ? this.model.revisions.length - position - 1: position;\n\t\t},\n\n\t\t// Responds to slide events\n\t\tslide: function( event, ui ) {\n\t\t\tvar attributes, movedRevision;\n\t\t\t// Compare two revisions mode\n\t\t\tif ( this.model.get('compareTwoMode') ) {\n\t\t\t\t// Prevent sliders from occupying same spot\n\t\t\t\tif ( ui.values[1] === ui.values[0] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ( isRtl ) {\n\t\t\t\t\tui.values.reverse();\n\t\t\t\t}\n\t\t\t\tattributes = {\n\t\t\t\t\tfrom: this.model.revisions.at( this.getPosition( ui.values[0] ) ),\n\t\t\t\t\tto: this.model.revisions.at( this.getPosition( ui.values[1] ) )\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tattributes = {\n\t\t\t\t\tto: this.model.revisions.at( this.getPosition( ui.value ) )\n\t\t\t\t};\n\t\t\t\t// If we're at the first revision, unset 'from'.\n\t\t\t\tif ( this.getPosition( ui.value ) > 0 ) {\n\t\t\t\t\tattributes.from = this.model.revisions.at( this.getPosition( ui.value ) - 1 );\n\t\t\t\t} else {\n\t\t\t\t\tattributes.from = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmovedRevision = this.model.revisions.at( this.getPosition( ui.value ) );\n\n\t\t\t// If we are scrubbing, a scrub to a revision is considered a hover\n\t\t\tif ( this.model.get('scrubbing') ) {\n\t\t\t\tattributes.hoveredRevision = movedRevision;\n\t\t\t}\n\n\t\t\tthis.model.set( attributes );\n\t\t},\n\n\t\tstop: function() {\n\t\t\t$( window ).off('mousemove.wp.revisions');\n\t\t\tthis.model.updateSliderSettings(); // To snap us back to a tick mark\n\t\t\tthis.model.set({ scrubbing: false });\n\t\t}\n\t});\n\n\t// The diff view.\n\t// This is the view for the current active diff.\n\trevisions.view.Diff = wp.Backbone.View.extend({\n\t\tclassName: 'revisions-diff',\n\t\ttemplate:  wp.template('revisions-diff'),\n\n\t\t// Generate the options to be passed to the template.\n\t\tprepare: function() {\n\t\t\treturn _.extend({ fields: this.model.fields.toJSON() }, this.options );\n\t\t}\n\t});\n\n\t// The revisions router.\n\t// Maintains the URL routes so browser URL matches state.\n\trevisions.Router = Backbone.Router.extend({\n\t\tinitialize: function( options ) {\n\t\t\tthis.model = options.model;\n\n\t\t\t// Maintain state and history when navigating\n\t\t\tthis.listenTo( this.model, 'update:diff', _.debounce( this.updateUrl, 250 ) );\n\t\t\tthis.listenTo( this.model, 'change:compareTwoMode', this.updateUrl );\n\t\t},\n\n\t\tbaseUrl: function( url ) {\n\t\t\treturn this.model.get('baseUrl') + url;\n\t\t},\n\n\t\tupdateUrl: function() {\n\t\t\tvar from = this.model.has('from') ? this.model.get('from').id : 0,\n\t\t\t\tto   = this.model.get('to').id;\n\t\t\tif ( this.model.get('compareTwoMode' ) ) {\n\t\t\t\tthis.navigate( this.baseUrl( '?from=' + from + '&to=' + to ), { replace: true } );\n\t\t\t} else {\n\t\t\t\tthis.navigate( this.baseUrl( '?revision=' + to ), { replace: true } );\n\t\t\t}\n\t\t},\n\n\t\thandleRoute: function( a, b ) {\n\t\t\tvar compareTwo = _.isUndefined( b );\n\n\t\t\tif ( ! compareTwo ) {\n\t\t\t\tb = this.model.revisions.get( a );\n\t\t\t\ta = this.model.revisions.prev( b );\n\t\t\t\tb = b ? b.id : 0;\n\t\t\t\ta = a ? a.id : 0;\n\t\t\t}\n\t\t}\n\t});\n\n\t/**\n\t * Initialize the revisions UI for revision.php.\n\t */\n\trevisions.init = function() {\n\t\tvar state;\n\n\t\t// Bail if the current page is not revision.php.\n\t\tif ( ! window.adminpage || 'revision-php' !== window.adminpage ) {\n\t\t\treturn;\n\t\t}\n\n\t\tstate = new revisions.model.FrameState({\n\t\t\tinitialDiffState: {\n\t\t\t\t// wp_localize_script doesn't stringifies ints, so cast them.\n\t\t\t\tto: parseInt( revisions.settings.to, 10 ),\n\t\t\t\tfrom: parseInt( revisions.settings.from, 10 ),\n\t\t\t\t// wp_localize_script does not allow for top-level booleans so do a comparator here.\n\t\t\t\tcompareTwoMode: ( revisions.settings.compareTwoMode === '1' )\n\t\t\t},\n\t\t\tdiffData: revisions.settings.diffData,\n\t\t\tbaseUrl: revisions.settings.baseUrl,\n\t\t\tpostId: parseInt( revisions.settings.postId, 10 )\n\t\t}, {\n\t\t\trevisions: new revisions.model.Revisions( revisions.settings.revisionData )\n\t\t});\n\n\t\trevisions.view.frame = new revisions.view.Frame({\n\t\t\tmodel: state\n\t\t}).render();\n\t};\n\n\t$( revisions.init );\n}(jQuery));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/set-post-thumbnail.js",
    "content": "/* global setPostThumbnailL10n, ajaxurl, post_id, alert */\n/* exported WPSetAsThumbnail */\n\nfunction WPSetAsThumbnail( id, nonce ) {\n\tvar $link = jQuery('a#wp-post-thumbnail-' + id);\n\n\t$link.text( setPostThumbnailL10n.saving );\n\tjQuery.post(ajaxurl, {\n\t\taction: 'set-post-thumbnail', post_id: post_id, thumbnail_id: id, _ajax_nonce: nonce, cookie: encodeURIComponent( document.cookie )\n\t}, function(str){\n\t\tvar win = window.dialogArguments || opener || parent || top;\n\t\t$link.text( setPostThumbnailL10n.setThumbnail );\n\t\tif ( str == '0' ) {\n\t\t\talert( setPostThumbnailL10n.error );\n\t\t} else {\n\t\t\tjQuery('a.wp-post-thumbnail').show();\n\t\t\t$link.text( setPostThumbnailL10n.done );\n\t\t\t$link.fadeOut( 2000 );\n\t\t\twin.WPSetThumbnailID(id);\n\t\t\twin.WPSetThumbnailHTML(str);\n\t\t}\n\t}\n\t);\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/svg-painter.js",
    "content": "/**\n * Attempt to re-color SVG icons used in the admin menu or the toolbar\n *\n */\n\nwindow.wp = window.wp || {};\n\nwp.svgPainter = ( function( $, window, document, undefined ) {\n\t'use strict';\n\tvar selector, base64, painter,\n\t\tcolorscheme = {},\n\t\telements = [];\n\n\t$(document).ready( function() {\n\t\t// detection for browser SVG capability\n\t\tif ( document.implementation.hasFeature( 'http://www.w3.org/TR/SVG11/feature#Image', '1.1' ) ) {\n\t\t\t$( document.body ).removeClass( 'no-svg' ).addClass( 'svg' );\n\t\t\twp.svgPainter.init();\n\t\t}\n\t});\n\n\t/**\n\t * Needed only for IE9\n\t *\n\t * Based on jquery.base64.js 0.0.3 - https://github.com/yckart/jquery.base64.js\n\t *\n\t * Based on: https://gist.github.com/Yaffle/1284012\n\t *\n\t * Copyright (c) 2012 Yannick Albert (http://yckart.com)\n\t * Licensed under the MIT license\n\t * http://www.opensource.org/licenses/mit-license.php\n\t */\n\tbase64 = ( function() {\n\t\tvar c,\n\t\t\tb64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n\t\t\ta256 = '',\n\t\t\tr64 = [256],\n\t\t\tr256 = [256],\n\t\t\ti = 0;\n\n\t\tfunction init() {\n\t\t\twhile( i < 256 ) {\n\t\t\t\tc = String.fromCharCode(i);\n\t\t\t\ta256 += c;\n\t\t\t\tr256[i] = i;\n\t\t\t\tr64[i] = b64.indexOf(c);\n\t\t\t\t++i;\n\t\t\t}\n\t\t}\n\n\t\tfunction code( s, discard, alpha, beta, w1, w2 ) {\n\t\t\tvar tmp, length,\n\t\t\t\tbuffer = 0,\n\t\t\t\ti = 0,\n\t\t\t\tresult = '',\n\t\t\t\tbitsInBuffer = 0;\n\n\t\t\ts = String(s);\n\t\t\tlength = s.length;\n\n\t\t\twhile( i < length ) {\n\t\t\t\tc = s.charCodeAt(i);\n\t\t\t\tc = c < 256 ? alpha[c] : -1;\n\n\t\t\t\tbuffer = ( buffer << w1 ) + c;\n\t\t\t\tbitsInBuffer += w1;\n\n\t\t\t\twhile( bitsInBuffer >= w2 ) {\n\t\t\t\t\tbitsInBuffer -= w2;\n\t\t\t\t\ttmp = buffer >> bitsInBuffer;\n\t\t\t\t\tresult += beta.charAt(tmp);\n\t\t\t\t\tbuffer ^= tmp << bitsInBuffer;\n\t\t\t\t}\n\t\t\t\t++i;\n\t\t\t}\n\n\t\t\tif ( ! discard && bitsInBuffer > 0 ) {\n\t\t\t\tresult += beta.charAt( buffer << ( w2 - bitsInBuffer ) );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tfunction btoa( plain ) {\n\t\t\tif ( ! c ) {\n\t\t\t\tinit();\n\t\t\t}\n\n\t\t\tplain = code( plain, false, r256, b64, 8, 6 );\n\t\t\treturn plain + '===='.slice( ( plain.length % 4 ) || 4 );\n\t\t}\n\n\t\tfunction atob( coded ) {\n\t\t\tvar i;\n\n\t\t\tif ( ! c ) {\n\t\t\t\tinit();\n\t\t\t}\n\n\t\t\tcoded = coded.replace( /[^A-Za-z0-9\\+\\/\\=]/g, '' );\n\t\t\tcoded = String(coded).split('=');\n\t\t\ti = coded.length;\n\n\t\t\tdo {\n\t\t\t\t--i;\n\t\t\t\tcoded[i] = code( coded[i], true, r64, a256, 6, 8 );\n\t\t\t} while ( i > 0 );\n\n\t\t\tcoded = coded.join('');\n\t\t\treturn coded;\n\t\t}\n\n\t\treturn {\n\t\t\tatob: atob,\n\t\t\tbtoa: btoa\n\t\t};\n\t})();\n\n\treturn {\n\t\tinit: function() {\n\t\t\tpainter = this;\n\t\t\tselector = $( '#adminmenu .wp-menu-image, #wpadminbar .ab-item' );\n\n\t\t\tthis.setColors();\n\t\t\tthis.findElements();\n\t\t\tthis.paint();\n\t\t},\n\n\t\tsetColors: function( colors ) {\n\t\t\tif ( typeof colors === 'undefined' && typeof window._wpColorScheme !== 'undefined' ) {\n\t\t\t\tcolors = window._wpColorScheme;\n\t\t\t}\n\n\t\t\tif ( colors && colors.icons && colors.icons.base && colors.icons.current && colors.icons.focus ) {\n\t\t\t\tcolorscheme = colors.icons;\n\t\t\t}\n\t\t},\n\n\t\tfindElements: function() {\n\t\t\tselector.each( function() {\n\t\t\t\tvar $this = $(this), bgImage = $this.css( 'background-image' );\n\n\t\t\t\tif ( bgImage && bgImage.indexOf( 'data:image/svg+xml;base64' ) != -1 ) {\n\t\t\t\t\telements.push( $this );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tpaint: function() {\n\t\t\t// loop through all elements\n\t\t\t$.each( elements, function( index, $element ) {\n\t\t\t\tvar $menuitem = $element.parent().parent();\n\n\t\t\t\tif ( $menuitem.hasClass( 'current' ) || $menuitem.hasClass( 'wp-has-current-submenu' ) ) {\n\t\t\t\t\t// paint icon in 'current' color\n\t\t\t\t\tpainter.paintElement( $element, 'current' );\n\t\t\t\t} else {\n\t\t\t\t\t// paint icon in base color\n\t\t\t\t\tpainter.paintElement( $element, 'base' );\n\n\t\t\t\t\t// set hover callbacks\n\t\t\t\t\t$menuitem.hover(\n\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\tpainter.paintElement( $element, 'focus' );\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t// Match the delay from hoverIntent\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tpainter.paintElement( $element, 'base' );\n\t\t\t\t\t\t\t}, 100 );\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tpaintElement: function( $element, colorType ) {\n\t\t\tvar xml, encoded, color;\n\n\t\t\tif ( ! colorType || ! colorscheme.hasOwnProperty( colorType ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcolor = colorscheme[ colorType ];\n\n\t\t\t// only accept hex colors: #101 or #101010\n\t\t\tif ( ! color.match( /^(#[0-9a-f]{3}|#[0-9a-f]{6})$/i ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\txml = $element.data( 'wp-ui-svg-' + color );\n\n\t\t\tif ( xml === 'none' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! xml ) {\n\t\t\t\tencoded = $element.css( 'background-image' ).match( /.+data:image\\/svg\\+xml;base64,([A-Za-z0-9\\+\\/\\=]+)/ );\n\n\t\t\t\tif ( ! encoded || ! encoded[1] ) {\n\t\t\t\t\t$element.data( 'wp-ui-svg-' + color, 'none' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tif ( 'atob' in window ) {\n\t\t\t\t\t\txml = window.atob( encoded[1] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txml = base64.atob( encoded[1] );\n\t\t\t\t\t}\n\t\t\t\t} catch ( error ) {}\n\n\t\t\t\tif ( xml ) {\n\t\t\t\t\t// replace `fill` attributes\n\t\t\t\t\txml = xml.replace( /fill=\"(.+?)\"/g, 'fill=\"' + color + '\"');\n\n\t\t\t\t\t// replace `style` attributes\n\t\t\t\t\txml = xml.replace( /style=\"(.+?)\"/g, 'style=\"fill:' + color + '\"');\n\n\t\t\t\t\t// replace `fill` properties in `<style>` tags\n\t\t\t\t\txml = xml.replace( /fill:.*?;/g, 'fill: ' + color + ';');\n\n\t\t\t\t\tif ( 'btoa' in window ) {\n\t\t\t\t\t\txml = window.btoa( xml );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txml = base64.btoa( xml );\n\t\t\t\t\t}\n\n\t\t\t\t\t$element.data( 'wp-ui-svg-' + color, xml );\n\t\t\t\t} else {\n\t\t\t\t\t$element.data( 'wp-ui-svg-' + color, 'none' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$element.attr( 'style', 'background-image: url(\"data:image/svg+xml;base64,' + xml + '\") !important;' );\n\t\t}\n\t};\n\n})( jQuery, window, document );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/tags-box.js",
    "content": "/* jshint curly: false, eqeqeq: false */\n/* global ajaxurl */\n\nvar tagBox, array_unique_noempty;\n\n( function( $ ) {\n\t// Return an array with any duplicate, whitespace or empty values removed\n\tarray_unique_noempty = function( array ) {\n\t\tvar out = [];\n\n\t\t$.each( array, function( key, val ) {\n\t\t\tval = $.trim( val );\n\n\t\t\tif ( val && $.inArray( val, out ) === -1 ) {\n\t\t\t\tout.push( val );\n\t\t\t}\n\t\t} );\n\n\t\treturn out;\n\t};\n\n\ttagBox = {\n\t\tclean : function(tags) {\n\t\t\tvar comma = window.tagsBoxL10n.tagDelimiter;\n\t\t\tif ( ',' !== comma )\n\t\t\t\ttags = tags.replace(new RegExp(comma, 'g'), ',');\n\t\t\ttags = tags.replace(/\\s*,\\s*/g, ',').replace(/,+/g, ',').replace(/[,\\s]+$/, '').replace(/^[,\\s]+/, '');\n\t\t\tif ( ',' !== comma )\n\t\t\t\ttags = tags.replace(/,/g, comma);\n\t\t\treturn tags;\n\t\t},\n\n\t\tparseTags : function(el) {\n\t\t\tvar id = el.id,\n\t\t\t\tnum = id.split('-check-num-')[1],\n\t\t\t\ttaxbox = $(el).closest('.tagsdiv'),\n\t\t\t\tthetags = taxbox.find('.the-tags'),\n\t\t\t\tcomma = window.tagsBoxL10n.tagDelimiter,\n\t\t\t\tcurrent_tags = thetags.val().split( comma ),\n\t\t\t\tnew_tags = [];\n\n\t\t\tdelete current_tags[num];\n\n\t\t\t$.each( current_tags, function( key, val ) {\n\t\t\t\tval = $.trim( val );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tnew_tags.push( val );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthetags.val( this.clean( new_tags.join( comma ) ) );\n\n\t\t\tthis.quickClicks( taxbox );\n\t\t\treturn false;\n\t\t},\n\n\t\tquickClicks : function( el ) {\n\t\t\tvar thetags = $('.the-tags', el),\n\t\t\t\ttagchecklist = $('.tagchecklist', el),\n\t\t\t\tid = $(el).attr('id'),\n\t\t\t\tcurrent_tags, disabled;\n\n\t\t\tif ( ! thetags.length )\n\t\t\t\treturn;\n\n\t\t\tdisabled = thetags.prop('disabled');\n\n\t\t\tcurrent_tags = thetags.val().split( window.tagsBoxL10n.tagDelimiter );\n\t\t\ttagchecklist.empty();\n\n\t\t\t$.each( current_tags, function( key, val ) {\n\t\t\t\tvar span, xbutton;\n\n\t\t\t\tval = $.trim( val );\n\n\t\t\t\tif ( ! val )\n\t\t\t\t\treturn;\n\n\t\t\t\t// Create a new span, and ensure the text is properly escaped.\n\t\t\t\tspan = $('<span />').text( val );\n\n\t\t\t\t// If tags editing isn't disabled, create the X button.\n\t\t\t\tif ( ! disabled ) {\n\t\t\t\t\txbutton = $( '<a id=\"' + id + '-check-num-' + key + '\" class=\"ntdelbutton\" tabindex=\"0\">X</a>' );\n\n\t\t\t\t\txbutton.on( 'click keypress', function( e ) {\n\t\t\t\t\t\t// Trigger function if pressed Enter - keyboard navigation\n\t\t\t\t\t\tif ( e.type === 'click' || e.keyCode === 13 ) {\n\t\t\t\t\t\t\t// When using keyboard, move focus back to the new tag field.\n\t\t\t\t\t\t\tif ( e.keyCode === 13 ) {\n\t\t\t\t\t\t\t\t$( this ).closest( '.tagsdiv' ).find( 'input.newtag' ).focus();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttagBox.parseTags( this );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tspan.prepend( '&nbsp;' ).prepend( xbutton );\n\t\t\t\t}\n\n\t\t\t\t// Append the span to the tag list.\n\t\t\t\ttagchecklist.append( span );\n\t\t\t});\n\t\t},\n\n\t\tflushTags : function( el, a, f ) {\n\t\t\tvar tagsval, newtags, text,\n\t\t\t\ttags = $( '.the-tags', el ),\n\t\t\t\tnewtag = $( 'input.newtag', el ),\n\t\t\t\tcomma = window.tagsBoxL10n.tagDelimiter;\n\n\t\t\ta = a || false;\n\n\t\t\ttext = a ? $(a).text() : newtag.val();\n\n\t\t\tif ( 'undefined' == typeof( text ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\ttagsval = tags.val();\n\t\t\tnewtags = tagsval ? tagsval + comma + text : text;\n\n\t\t\tnewtags = this.clean( newtags );\n\t\t\tnewtags = array_unique_noempty( newtags.split( comma ) ).join( comma );\n\t\t\ttags.val( newtags );\n\t\t\tthis.quickClicks( el );\n\n\t\t\tif ( ! a )\n\t\t\t\tnewtag.val('');\n\t\t\tif ( 'undefined' == typeof( f ) )\n\t\t\t\tnewtag.focus();\n\n\t\t\treturn false;\n\t\t},\n\n\t\tget : function( id ) {\n\t\t\tvar tax = id.substr( id.indexOf('-') + 1 );\n\n\t\t\t$.post( ajaxurl, { 'action': 'get-tagcloud', 'tax': tax }, function( r, stat ) {\n\t\t\t\tif ( 0 === r || 'success' != stat ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tr = $( '<p id=\"tagcloud-' + tax + '\" class=\"the-tagcloud\">' + r + '</p>' );\n\n\t\t\t\t$( 'a', r ).click( function() {\n\t\t\t\t\ttagBox.flushTags( $( '#' + tax ), this );\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\n\t\t\t\t$( '#' + id ).after( r );\n\t\t\t});\n\t\t},\n\n\t\tinit : function() {\n\t\t\tvar t = this, ajaxtag = $('div.ajaxtag');\n\n\t\t\t$('.tagsdiv').each( function() {\n\t\t\t\ttagBox.quickClicks(this);\n\t\t\t});\n\n\t\t\t$('.tagadd', ajaxtag).click(function(){\n\t\t\t\tt.flushTags( $(this).closest('.tagsdiv') );\n\t\t\t});\n\n\t\t\t$('input.newtag', ajaxtag).keyup(function(e){\n\t\t\t\tif ( 13 == e.which ) {\n\t\t\t\t\ttagBox.flushTags( $(this).closest('.tagsdiv') );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}).keypress(function(e){\n\t\t\t\tif ( 13 == e.which ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}).each( function() {\n\t\t\t\tvar tax = $(this).closest('div.tagsdiv').attr('id');\n\t\t\t\t$(this).suggest(\n\t\t\t\t\tajaxurl + '?action=ajax-tag-search&tax=' + tax,\n\t\t\t\t\t{ delay: 500, minchars: 2, multiple: true, multipleSep: window.tagsBoxL10n.tagDelimiter }\n\t\t\t\t);\n\t\t\t});\n\n\t\t\t// save tags on post save/publish\n\t\t\t$('#post').submit(function(){\n\t\t\t\t$('div.tagsdiv').each( function() {\n\t\t\t\t\ttagBox.flushTags(this, false, 1);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// tag cloud\n\t\t\t$('.tagcloud-link').click(function(){\n\t\t\t\ttagBox.get( $(this).attr('id') );\n\t\t\t\t$(this).unbind().click(function(){\n\t\t\t\t\t$(this).siblings('.the-tagcloud').toggle();\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t};\n}( jQuery ));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/tags.js",
    "content": "/* global ajaxurl, wpAjax, tagsl10n, showNotice, validateForm */\n\njQuery(document).ready(function($) {\n\n\t$( '#the-list' ).on( 'click', '.delete-tag', function() {\n\t\tvar t = $(this), tr = t.parents('tr'), r = true, data;\n\t\tif ( 'undefined' != showNotice )\n\t\t\tr = showNotice.warn();\n\t\tif ( r ) {\n\t\t\tdata = t.attr('href').replace(/[^?]*\\?/, '').replace(/action=delete/, 'action=delete-tag');\n\t\t\t$.post(ajaxurl, data, function(r){\n\t\t\t\tif ( '1' == r ) {\n\t\t\t\t\t$('#ajax-response').empty();\n\t\t\t\t\ttr.fadeOut('normal', function(){ tr.remove(); });\n\t\t\t\t\t// Remove the term from the parent box and tag cloud\n\t\t\t\t\t$('select#parent option[value=\"' + data.match(/tag_ID=(\\d+)/)[1] + '\"]').remove();\n\t\t\t\t\t$('a.tag-link-' + data.match(/tag_ID=(\\d+)/)[1]).remove();\n\t\t\t\t} else if ( '-1' == r ) {\n\t\t\t\t\t$('#ajax-response').empty().append('<div class=\"error\"><p>' + tagsl10n.noPerm + '</p></div>');\n\t\t\t\t\ttr.children().css('backgroundColor', '');\n\t\t\t\t} else {\n\t\t\t\t\t$('#ajax-response').empty().append('<div class=\"error\"><p>' + tagsl10n.broken + '</p></div>');\n\t\t\t\t\ttr.children().css('backgroundColor', '');\n\t\t\t\t}\n\t\t\t});\n\t\t\ttr.children().css('backgroundColor', '#f33');\n\t\t}\n\t\treturn false;\n\t});\n\n\t$('#submit').click(function(){\n\t\tvar form = $(this).parents('form');\n\n\t\tif ( ! validateForm( form ) )\n\t\t\treturn false;\n\n\t\t$.post(ajaxurl, $('#addtag').serialize(), function(r){\n\t\t\tvar res, parent, term, indent, i;\n\n\t\t\t$('#ajax-response').empty();\n\t\t\tres = wpAjax.parseAjaxResponse( r, 'ajax-response' );\n\t\t\tif ( ! res || res.errors )\n\t\t\t\treturn;\n\n\t\t\tparent = form.find( 'select#parent' ).val();\n\n\t\t\tif ( parent > 0 && $('#tag-' + parent ).length > 0 ) // If the parent exists on this page, insert it below. Else insert it at the top of the list.\n\t\t\t\t$( '.tags #tag-' + parent ).after( res.responses[0].supplemental.noparents ); // As the parent exists, Insert the version with - - - prefixed\n\t\t\telse\n\t\t\t\t$( '.tags' ).prepend( res.responses[0].supplemental.parents ); // As the parent is not visible, Insert the version with Parent - Child - ThisTerm\n\n\t\t\t$('.tags .no-items').remove();\n\n\t\t\tif ( form.find('select#parent') ) {\n\t\t\t\t// Parents field exists, Add new term to the list.\n\t\t\t\tterm = res.responses[1].supplemental;\n\n\t\t\t\t// Create an indent for the Parent field\n\t\t\t\tindent = '';\n\t\t\t\tfor ( i = 0; i < res.responses[1].position; i++ )\n\t\t\t\t\tindent += '&nbsp;&nbsp;&nbsp;';\n\n\t\t\t\tform.find( 'select#parent option:selected' ).after( '<option value=\"' + term.term_id + '\">' + indent + term.name + '</option>' );\n\t\t\t}\n\n\t\t\t$('input[type=\"text\"]:visible, textarea:visible', form).val('');\n\t\t});\n\n\t\treturn false;\n\t});\n\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/theme.js",
    "content": "/* global _wpThemeSettings, confirm */\nwindow.wp = window.wp || {};\n\n( function($) {\n\n// Set up our namespace...\nvar themes, l10n;\nthemes = wp.themes = wp.themes || {};\n\n// Store the theme data and settings for organized and quick access\n// themes.data.settings, themes.data.themes, themes.data.l10n\nthemes.data = _wpThemeSettings;\nl10n = themes.data.l10n;\n\n// Shortcut for isInstall check\nthemes.isInstall = !! themes.data.settings.isInstall;\n\n// Setup app structure\n_.extend( themes, { model: {}, view: {}, routes: {}, router: {}, template: wp.template });\n\nthemes.Model = Backbone.Model.extend({\n\t// Adds attributes to the default data coming through the .org themes api\n\t// Map `id` to `slug` for shared code\n\tinitialize: function() {\n\t\tvar description;\n\n\t\t// If theme is already installed, set an attribute.\n\t\tif ( _.indexOf( themes.data.installedThemes, this.get( 'slug' ) ) !== -1 ) {\n\t\t\tthis.set({ installed: true });\n\t\t}\n\n\t\t// Set the attributes\n\t\tthis.set({\n\t\t\t// slug is for installation, id is for existing.\n\t\t\tid: this.get( 'slug' ) || this.get( 'id' )\n\t\t});\n\n\t\t// Map `section.description` to `description`\n\t\t// as the API sometimes returns it differently\n\t\tif ( this.has( 'sections' ) ) {\n\t\t\tdescription = this.get( 'sections' ).description;\n\t\t\tthis.set({ description: description });\n\t\t}\n\t}\n});\n\n// Main view controller for themes.php\n// Unifies and renders all available views\nthemes.view.Appearance = wp.Backbone.View.extend({\n\n\tel: '#wpbody-content .wrap .theme-browser',\n\n\twindow: $( window ),\n\t// Pagination instance\n\tpage: 0,\n\n\t// Sets up a throttler for binding to 'scroll'\n\tinitialize: function( options ) {\n\t\t// Scroller checks how far the scroll position is\n\t\t_.bindAll( this, 'scroller' );\n\n\t\tthis.SearchView = options.SearchView ? options.SearchView : themes.view.Search;\n\t\t// Bind to the scroll event and throttle\n\t\t// the results from this.scroller\n\t\tthis.window.bind( 'scroll', _.throttle( this.scroller, 300 ) );\n\t},\n\n\t// Main render control\n\trender: function() {\n\t\t// Setup the main theme view\n\t\t// with the current theme collection\n\t\tthis.view = new themes.view.Themes({\n\t\t\tcollection: this.collection,\n\t\t\tparent: this\n\t\t});\n\n\t\t// Render search form.\n\t\tthis.search();\n\n\t\t// Render and append\n\t\tthis.view.render();\n\t\tthis.$el.empty().append( this.view.el ).addClass( 'rendered' );\n\t\tthis.$el.append( '<br class=\"clear\"/>' );\n\t},\n\n\t// Defines search element container\n\tsearchContainer: $( '#wpbody h1:first' ),\n\n\t// Search input and view\n\t// for current theme collection\n\tsearch: function() {\n\t\tvar view,\n\t\t\tself = this;\n\n\t\t// Don't render the search if there is only one theme\n\t\tif ( themes.data.themes.length === 1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview = new this.SearchView({\n\t\t\tcollection: self.collection,\n\t\t\tparent: this\n\t\t});\n\n\t\t// Render and append after screen title\n\t\tview.render();\n\t\tthis.searchContainer\n\t\t\t.append( $.parseHTML( '<label class=\"screen-reader-text\" for=\"wp-filter-search-input\">' + l10n.search + '</label>' ) )\n\t\t\t.append( view.el );\n\t},\n\n\t// Checks when the user gets close to the bottom\n\t// of the mage and triggers a theme:scroll event\n\tscroller: function() {\n\t\tvar self = this,\n\t\t\tbottom, threshold;\n\n\t\tbottom = this.window.scrollTop() + self.window.height();\n\t\tthreshold = self.$el.offset().top + self.$el.outerHeight( false ) - self.window.height();\n\t\tthreshold = Math.round( threshold * 0.9 );\n\n\t\tif ( bottom > threshold ) {\n\t\t\tthis.trigger( 'theme:scroll' );\n\t\t}\n\t}\n});\n\n// Set up the Collection for our theme data\n// @has 'id' 'name' 'screenshot' 'author' 'authorURI' 'version' 'active' ...\nthemes.Collection = Backbone.Collection.extend({\n\n\tmodel: themes.Model,\n\n\t// Search terms\n\tterms: '',\n\n\t// Controls searching on the current theme collection\n\t// and triggers an update event\n\tdoSearch: function( value ) {\n\n\t\t// Don't do anything if we've already done this search\n\t\t// Useful because the Search handler fires multiple times per keystroke\n\t\tif ( this.terms === value ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Updates terms with the value passed\n\t\tthis.terms = value;\n\n\t\t// If we have terms, run a search...\n\t\tif ( this.terms.length > 0 ) {\n\t\t\tthis.search( this.terms );\n\t\t}\n\n\t\t// If search is blank, show all themes\n\t\t// Useful for resetting the views when you clean the input\n\t\tif ( this.terms === '' ) {\n\t\t\tthis.reset( themes.data.themes );\n\t\t\t$( 'body' ).removeClass( 'no-results' );\n\t\t}\n\n\t\t// Trigger an 'update' event\n\t\tthis.trigger( 'update' );\n\t},\n\n\t// Performs a search within the collection\n\t// @uses RegExp\n\tsearch: function( term ) {\n\t\tvar match, results, haystack, name, description, author;\n\n\t\t// Start with a full collection\n\t\tthis.reset( themes.data.themes, { silent: true } );\n\n\t\t// Escape the term string for RegExp meta characters\n\t\tterm = term.replace( /[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&' );\n\n\t\t// Consider spaces as word delimiters and match the whole string\n\t\t// so matching terms can be combined\n\t\tterm = term.replace( / /g, ')(?=.*' );\n\t\tmatch = new RegExp( '^(?=.*' + term + ').+', 'i' );\n\n\t\t// Find results\n\t\t// _.filter and .test\n\t\tresults = this.filter( function( data ) {\n\t\t\tname        = data.get( 'name' ).replace( /(<([^>]+)>)/ig, '' );\n\t\t\tdescription = data.get( 'description' ).replace( /(<([^>]+)>)/ig, '' );\n\t\t\tauthor      = data.get( 'author' ).replace( /(<([^>]+)>)/ig, '' );\n\n\t\t\thaystack = _.union( name, data.get( 'id' ), description, author, data.get( 'tags' ) );\n\n\t\t\tif ( match.test( data.get( 'author' ) ) && term.length > 2 ) {\n\t\t\t\tdata.set( 'displayAuthor', true );\n\t\t\t}\n\n\t\t\treturn match.test( haystack );\n\t\t});\n\n\t\tif ( results.length === 0 ) {\n\t\t\tthis.trigger( 'query:empty' );\n\t\t} else {\n\t\t\t$( 'body' ).removeClass( 'no-results' );\n\t\t}\n\n\t\tthis.reset( results );\n\t},\n\n\t// Paginates the collection with a helper method\n\t// that slices the collection\n\tpaginate: function( instance ) {\n\t\tvar collection = this;\n\t\tinstance = instance || 0;\n\n\t\t// Themes per instance are set at 20\n\t\tcollection = _( collection.rest( 20 * instance ) );\n\t\tcollection = _( collection.first( 20 ) );\n\n\t\treturn collection;\n\t},\n\n\tcount: false,\n\n\t// Handles requests for more themes\n\t// and caches results\n\t//\n\t// When we are missing a cache object we fire an apiCall()\n\t// which triggers events of `query:success` or `query:fail`\n\tquery: function( request ) {\n\t\t/**\n\t\t * @static\n\t\t * @type Array\n\t\t */\n\t\tvar queries = this.queries,\n\t\t\tself = this,\n\t\t\tquery, isPaginated, count;\n\n\t\t// Store current query request args\n\t\t// for later use with the event `theme:end`\n\t\tthis.currentQuery.request = request;\n\n\t\t// Search the query cache for matches.\n\t\tquery = _.find( queries, function( query ) {\n\t\t\treturn _.isEqual( query.request, request );\n\t\t});\n\n\t\t// If the request matches the stored currentQuery.request\n\t\t// it means we have a paginated request.\n\t\tisPaginated = _.has( request, 'page' );\n\n\t\t// Reset the internal api page counter for non paginated queries.\n\t\tif ( ! isPaginated ) {\n\t\t\tthis.currentQuery.page = 1;\n\t\t}\n\n\t\t// Otherwise, send a new API call and add it to the cache.\n\t\tif ( ! query && ! isPaginated ) {\n\t\t\tquery = this.apiCall( request ).done( function( data ) {\n\n\t\t\t\t// Update the collection with the queried data.\n\t\t\t\tif ( data.themes ) {\n\t\t\t\t\tself.reset( data.themes );\n\t\t\t\t\tcount = data.info.results;\n\t\t\t\t\t// Store the results and the query request\n\t\t\t\t\tqueries.push( { themes: data.themes, request: request, total: count } );\n\t\t\t\t}\n\n\t\t\t\t// Trigger a collection refresh event\n\t\t\t\t// and a `query:success` event with a `count` argument.\n\t\t\t\tself.trigger( 'update' );\n\t\t\t\tself.trigger( 'query:success', count );\n\n\t\t\t\tif ( data.themes && data.themes.length === 0 ) {\n\t\t\t\t\tself.trigger( 'query:empty' );\n\t\t\t\t}\n\n\t\t\t}).fail( function() {\n\t\t\t\tself.trigger( 'query:fail' );\n\t\t\t});\n\t\t} else {\n\t\t\t// If it's a paginated request we need to fetch more themes...\n\t\t\tif ( isPaginated ) {\n\t\t\t\treturn this.apiCall( request, isPaginated ).done( function( data ) {\n\t\t\t\t\t// Add the new themes to the current collection\n\t\t\t\t\t// @todo update counter\n\t\t\t\t\tself.add( data.themes );\n\t\t\t\t\tself.trigger( 'query:success' );\n\n\t\t\t\t\t// We are done loading themes for now.\n\t\t\t\t\tself.loadingThemes = false;\n\n\t\t\t\t}).fail( function() {\n\t\t\t\t\tself.trigger( 'query:fail' );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( query.themes.length === 0 ) {\n\t\t\t\tself.trigger( 'query:empty' );\n\t\t\t} else {\n\t\t\t\t$( 'body' ).removeClass( 'no-results' );\n\t\t\t}\n\n\t\t\t// Only trigger an update event since we already have the themes\n\t\t\t// on our cached object\n\t\t\tif ( _.isNumber( query.total ) ) {\n\t\t\t\tthis.count = query.total;\n\t\t\t}\n\n\t\t\tthis.reset( query.themes );\n\t\t\tif ( ! query.total ) {\n\t\t\t\tthis.count = this.length;\n\t\t\t}\n\n\t\t\tthis.trigger( 'update' );\n\t\t\tthis.trigger( 'query:success', this.count );\n\t\t}\n\t},\n\n\t// Local cache array for API queries\n\tqueries: [],\n\n\t// Keep track of current query so we can handle pagination\n\tcurrentQuery: {\n\t\tpage: 1,\n\t\trequest: {}\n\t},\n\n\t// Send request to api.wordpress.org/themes\n\tapiCall: function( request, paginated ) {\n\t\treturn wp.ajax.send( 'query-themes', {\n\t\t\tdata: {\n\t\t\t// Request data\n\t\t\t\trequest: _.extend({\n\t\t\t\t\tper_page: 100,\n\t\t\t\t\tfields: {\n\t\t\t\t\t\tdescription: true,\n\t\t\t\t\t\ttested: true,\n\t\t\t\t\t\trequires: true,\n\t\t\t\t\t\trating: true,\n\t\t\t\t\t\tdownloaded: true,\n\t\t\t\t\t\tdownloadLink: true,\n\t\t\t\t\t\tlast_updated: true,\n\t\t\t\t\t\thomepage: true,\n\t\t\t\t\t\tnum_ratings: true\n\t\t\t\t\t}\n\t\t\t\t}, request)\n\t\t\t},\n\n\t\t\tbeforeSend: function() {\n\t\t\t\tif ( ! paginated ) {\n\t\t\t\t\t// Spin it\n\t\t\t\t\t$( 'body' ).addClass( 'loading-content' ).removeClass( 'no-results' );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t// Static status controller for when we are loading themes.\n\tloadingThemes: false\n});\n\n// This is the view that controls each theme item\n// that will be displayed on the screen\nthemes.view.Theme = wp.Backbone.View.extend({\n\n\t// Wrap theme data on a div.theme element\n\tclassName: 'theme',\n\n\t// Reflects which theme view we have\n\t// 'grid' (default) or 'detail'\n\tstate: 'grid',\n\n\t// The HTML template for each element to be rendered\n\thtml: themes.template( 'theme' ),\n\n\tevents: {\n\t\t'click': themes.isInstall ? 'preview': 'expand',\n\t\t'keydown': themes.isInstall ? 'preview': 'expand',\n\t\t'touchend': themes.isInstall ? 'preview': 'expand',\n\t\t'keyup': 'addFocus',\n\t\t'touchmove': 'preventExpand'\n\t},\n\n\ttouchDrag: false,\n\n\trender: function() {\n\t\tvar data = this.model.toJSON();\n\t\t// Render themes using the html template\n\t\tthis.$el.html( this.html( data ) ).attr({\n\t\t\ttabindex: 0,\n\t\t\t'aria-describedby' : data.id + '-action ' + data.id + '-name'\n\t\t});\n\n\t\t// Renders active theme styles\n\t\tthis.activeTheme();\n\n\t\tif ( this.model.get( 'displayAuthor' ) ) {\n\t\t\tthis.$el.addClass( 'display-author' );\n\t\t}\n\n\t\tif ( this.model.get( 'installed' ) ) {\n\t\t\tthis.$el.addClass( 'is-installed' );\n\t\t}\n\t},\n\n\t// Adds a class to the currently active theme\n\t// and to the overlay in detailed view mode\n\tactiveTheme: function() {\n\t\tif ( this.model.get( 'active' ) ) {\n\t\t\tthis.$el.addClass( 'active' );\n\t\t}\n\t},\n\n\t// Add class of focus to the theme we are focused on.\n\taddFocus: function() {\n\t\tvar $themeToFocus = ( $( ':focus' ).hasClass( 'theme' ) ) ? $( ':focus' ) : $(':focus').parents('.theme');\n\n\t\t$('.theme.focus').removeClass('focus');\n\t\t$themeToFocus.addClass('focus');\n\t},\n\n\t// Single theme overlay screen\n\t// It's shown when clicking a theme\n\texpand: function( event ) {\n\t\tvar self = this;\n\n\t\tevent = event || window.event;\n\n\t\t// 'enter' and 'space' keys expand the details view when a theme is :focused\n\t\tif ( event.type === 'keydown' && ( event.which !== 13 && event.which !== 32 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Bail if the user scrolled on a touch device\n\t\tif ( this.touchDrag === true ) {\n\t\t\treturn this.touchDrag = false;\n\t\t}\n\n\t\t// Prevent the modal from showing when the user clicks\n\t\t// one of the direct action buttons\n\t\tif ( $( event.target ).is( '.theme-actions a' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Set focused theme to current element\n\t\tthemes.focusedTheme = this.$el;\n\n\t\tthis.trigger( 'theme:expand', self.model.cid );\n\t},\n\n\tpreventExpand: function() {\n\t\tthis.touchDrag = true;\n\t},\n\n\tpreview: function( event ) {\n\t\tvar self = this,\n\t\t\tcurrent, preview;\n\n\t\tevent = event || window.event;\n\n\t\t// Bail if the user scrolled on a touch device\n\t\tif ( this.touchDrag === true ) {\n\t\t\treturn this.touchDrag = false;\n\t\t}\n\n\t\t// Allow direct link path to installing a theme.\n\t\tif ( $( event.target ).hasClass( 'button-primary' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 'enter' and 'space' keys expand the details view when a theme is :focused\n\t\tif ( event.type === 'keydown' && ( event.which !== 13 && event.which !== 32 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// pressing enter while focused on the buttons shouldn't open the preview\n\t\tif ( event.type === 'keydown' && event.which !== 13 && $( ':focus' ).hasClass( 'button' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tevent = event || window.event;\n\n\t\t// Set focus to current theme.\n\t\tthemes.focusedTheme = this.$el;\n\n\t\t// Construct a new Preview view.\n\t\tpreview = new themes.view.Preview({\n\t\t\tmodel: this.model\n\t\t});\n\n\t\t// Render the view and append it.\n\t\tpreview.render();\n\t\tthis.setNavButtonsState();\n\n\t\t// Hide previous/next navigation if there is only one theme\n\t\tif ( this.model.collection.length === 1 ) {\n\t\t\tpreview.$el.addClass( 'no-navigation' );\n\t\t} else {\n\t\t\tpreview.$el.removeClass( 'no-navigation' );\n\t\t}\n\n\t\t// Append preview\n\t\t$( 'div.wrap' ).append( preview.el );\n\n\t\t// Listen to our preview object\n\t\t// for `theme:next` and `theme:previous` events.\n\t\tthis.listenTo( preview, 'theme:next', function() {\n\n\t\t\t// Keep local track of current theme model.\n\t\t\tcurrent = self.model;\n\n\t\t\t// If we have ventured away from current model update the current model position.\n\t\t\tif ( ! _.isUndefined( self.current ) ) {\n\t\t\t\tcurrent = self.current;\n\t\t\t}\n\n\t\t\t// Get next theme model.\n\t\t\tself.current = self.model.collection.at( self.model.collection.indexOf( current ) + 1 );\n\n\t\t\t// If we have no more themes, bail.\n\t\t\tif ( _.isUndefined( self.current ) ) {\n\t\t\t\tself.options.parent.parent.trigger( 'theme:end' );\n\t\t\t\treturn self.current = current;\n\t\t\t}\n\n\t\t\tpreview.model = self.current;\n\n\t\t\t// Render and append.\n\t\t\tpreview.render();\n\t\t\tthis.setNavButtonsState();\n\t\t\t$( '.next-theme' ).focus();\n\t\t})\n\t\t.listenTo( preview, 'theme:previous', function() {\n\n\t\t\t// Keep track of current theme model.\n\t\t\tcurrent = self.model;\n\n\t\t\t// Bail early if we are at the beginning of the collection\n\t\t\tif ( self.model.collection.indexOf( self.current ) === 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If we have ventured away from current model update the current model position.\n\t\t\tif ( ! _.isUndefined( self.current ) ) {\n\t\t\t\tcurrent = self.current;\n\t\t\t}\n\n\t\t\t// Get previous theme model.\n\t\t\tself.current = self.model.collection.at( self.model.collection.indexOf( current ) - 1 );\n\n\t\t\t// If we have no more themes, bail.\n\t\t\tif ( _.isUndefined( self.current ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tpreview.model = self.current;\n\n\t\t\t// Render and append.\n\t\t\tpreview.render();\n\t\t\tthis.setNavButtonsState();\n\t\t\t$( '.previous-theme' ).focus();\n\t\t});\n\n\t\tthis.listenTo( preview, 'preview:close', function() {\n\t\t\tself.current = self.model;\n\t\t});\n\t},\n\n\t// Handles .disabled classes for previous/next buttons in theme installer preview\n\tsetNavButtonsState: function() {\n\t\tvar $themeInstaller = $( '.theme-install-overlay' ),\n\t\t\tcurrent = _.isUndefined( this.current ) ? this.model : this.current;\n\n\t\t// Disable previous at the zero position\n\t\tif ( 0 === this.model.collection.indexOf( current ) ) {\n\t\t\t$themeInstaller.find( '.previous-theme' ).addClass( 'disabled' );\n\t\t}\n\n\t\t// Disable next if the next model is undefined\n\t\tif ( _.isUndefined( this.model.collection.at( this.model.collection.indexOf( current ) + 1 ) ) ) {\n\t\t\t$themeInstaller.find( '.next-theme' ).addClass( 'disabled' );\n\t\t}\n\t}\n});\n\n// Theme Details view\n// Set ups a modal overlay with the expanded theme data\nthemes.view.Details = wp.Backbone.View.extend({\n\n\t// Wrap theme data on a div.theme element\n\tclassName: 'theme-overlay',\n\n\tevents: {\n\t\t'click': 'collapse',\n\t\t'click .delete-theme': 'deleteTheme',\n\t\t'click .left': 'previousTheme',\n\t\t'click .right': 'nextTheme'\n\t},\n\n\t// The HTML template for the theme overlay\n\thtml: themes.template( 'theme-single' ),\n\n\trender: function() {\n\t\tvar data = this.model.toJSON();\n\t\tthis.$el.html( this.html( data ) );\n\t\t// Renders active theme styles\n\t\tthis.activeTheme();\n\t\t// Set up navigation events\n\t\tthis.navigation();\n\t\t// Checks screenshot size\n\t\tthis.screenshotCheck( this.$el );\n\t\t// Contain \"tabbing\" inside the overlay\n\t\tthis.containFocus( this.$el );\n\t},\n\n\t// Adds a class to the currently active theme\n\t// and to the overlay in detailed view mode\n\tactiveTheme: function() {\n\t\t// Check the model has the active property\n\t\tthis.$el.toggleClass( 'active', this.model.get( 'active' ) );\n\t},\n\n\t// Keeps :focus within the theme details elements\n\tcontainFocus: function( $el ) {\n\t\tvar $target;\n\n\t\t// Move focus to the primary action\n\t\t_.delay( function() {\n\t\t\t$( '.theme-wrap a.button-primary:visible' ).focus();\n\t\t}, 500 );\n\n\t\t$el.on( 'keydown.wp-themes', function( event ) {\n\n\t\t\t// Tab key\n\t\t\tif ( event.which === 9 ) {\n\t\t\t\t$target = $( event.target );\n\n\t\t\t\t// Keep focus within the overlay by making the last link on theme actions\n\t\t\t\t// switch focus to button.left on tabbing and vice versa\n\t\t\t\tif ( $target.is( 'button.left' ) && event.shiftKey ) {\n\t\t\t\t\t$el.find( '.theme-actions a:last-child' ).focus();\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( $target.is( '.theme-actions a:last-child' ) ) {\n\t\t\t\t\t$el.find( 'button.left' ).focus();\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t// Single theme overlay screen\n\t// It's shown when clicking a theme\n\tcollapse: function( event ) {\n\t\tvar self = this,\n\t\t\tscroll;\n\n\t\tevent = event || window.event;\n\n\t\t// Prevent collapsing detailed view when there is only one theme available\n\t\tif ( themes.data.themes.length === 1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Detect if the click is inside the overlay\n\t\t// and don't close it unless the target was\n\t\t// the div.back button\n\t\tif ( $( event.target ).is( '.theme-backdrop' ) || $( event.target ).is( '.close' ) || event.keyCode === 27 ) {\n\n\t\t\t// Add a temporary closing class while overlay fades out\n\t\t\t$( 'body' ).addClass( 'closing-overlay' );\n\n\t\t\t// With a quick fade out animation\n\t\t\tthis.$el.fadeOut( 130, function() {\n\t\t\t\t// Clicking outside the modal box closes the overlay\n\t\t\t\t$( 'body' ).removeClass( 'closing-overlay' );\n\t\t\t\t// Handle event cleanup\n\t\t\t\tself.closeOverlay();\n\n\t\t\t\t// Get scroll position to avoid jumping to the top\n\t\t\t\tscroll = document.body.scrollTop;\n\n\t\t\t\t// Clean the url structure\n\t\t\t\tthemes.router.navigate( themes.router.baseUrl( '' ) );\n\n\t\t\t\t// Restore scroll position\n\t\t\t\tdocument.body.scrollTop = scroll;\n\n\t\t\t\t// Return focus to the theme div\n\t\t\t\tif ( themes.focusedTheme ) {\n\t\t\t\t\tthemes.focusedTheme.focus();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\t// Handles .disabled classes for next/previous buttons\n\tnavigation: function() {\n\n\t\t// Disable Left/Right when at the start or end of the collection\n\t\tif ( this.model.cid === this.model.collection.at(0).cid ) {\n\t\t\tthis.$el.find( '.left' ).addClass( 'disabled' );\n\t\t}\n\t\tif ( this.model.cid === this.model.collection.at( this.model.collection.length - 1 ).cid ) {\n\t\t\tthis.$el.find( '.right' ).addClass( 'disabled' );\n\t\t}\n\t},\n\n\t// Performs the actions to effectively close\n\t// the theme details overlay\n\tcloseOverlay: function() {\n\t\t$( 'body' ).removeClass( 'modal-open' );\n\t\tthis.remove();\n\t\tthis.unbind();\n\t\tthis.trigger( 'theme:collapse' );\n\t},\n\n\t// Confirmation dialog for deleting a theme\n\tdeleteTheme: function() {\n\t\treturn confirm( themes.data.settings.confirmDelete );\n\t},\n\n\tnextTheme: function() {\n\t\tvar self = this;\n\t\tself.trigger( 'theme:next', self.model.cid );\n\t\treturn false;\n\t},\n\n\tpreviousTheme: function() {\n\t\tvar self = this;\n\t\tself.trigger( 'theme:previous', self.model.cid );\n\t\treturn false;\n\t},\n\n\t// Checks if the theme screenshot is the old 300px width version\n\t// and adds a corresponding class if it's true\n\tscreenshotCheck: function( el ) {\n\t\tvar screenshot, image;\n\n\t\tscreenshot = el.find( '.screenshot img' );\n\t\timage = new Image();\n\t\timage.src = screenshot.attr( 'src' );\n\n\t\t// Width check\n\t\tif ( image.width && image.width <= 300 ) {\n\t\t\tel.addClass( 'small-screenshot' );\n\t\t}\n\t}\n});\n\n// Theme Preview view\n// Set ups a modal overlay with the expanded theme data\nthemes.view.Preview = themes.view.Details.extend({\n\n\tclassName: 'wp-full-overlay expanded',\n\tel: '.theme-install-overlay',\n\n\tevents: {\n\t\t'click .close-full-overlay': 'close',\n\t\t'click .collapse-sidebar': 'collapse',\n\t\t'click .previous-theme': 'previousTheme',\n\t\t'click .next-theme': 'nextTheme',\n\t\t'keyup': 'keyEvent'\n\t},\n\n\t// The HTML template for the theme preview\n\thtml: themes.template( 'theme-preview' ),\n\n\trender: function() {\n\t\tvar self = this,\n\t\t\tdata = this.model.toJSON();\n\n\t\tthis.$el.removeClass( 'iframe-ready' ).html( this.html( data ) );\n\n\t\tthemes.router.navigate( themes.router.baseUrl( themes.router.themePath + this.model.get( 'id' ) ), { replace: true } );\n\n\t\tthis.$el.fadeIn( 200, function() {\n\t\t\t$( 'body' ).addClass( 'theme-installer-active full-overlay-active' );\n\t\t\t$( '.close-full-overlay' ).focus();\n\t\t});\n\n\t\tthis.$el.find( 'iframe' ).one( 'load', function() {\n\t\t\tself.iframeLoaded();\n\t\t});\n\t},\n\n\tiframeLoaded: function() {\n\t\tthis.$el.addClass( 'iframe-ready' );\n\t},\n\n\tclose: function() {\n\t\tthis.$el.fadeOut( 200, function() {\n\t\t\t$( 'body' ).removeClass( 'theme-installer-active full-overlay-active' );\n\n\t\t\t// Return focus to the theme div\n\t\t\tif ( themes.focusedTheme ) {\n\t\t\t\tthemes.focusedTheme.focus();\n\t\t\t}\n\t\t}).removeClass( 'iframe-ready' );\n\n\t\tthemes.router.navigate( themes.router.baseUrl( '' ) );\n\t\tthis.trigger( 'preview:close' );\n\t\tthis.undelegateEvents();\n\t\tthis.unbind();\n\t\treturn false;\n\t},\n\n\tcollapse: function( event ) {\n\t\tvar $button = $( event.currentTarget );\n\t\tif ( 'true' === $button.attr( 'aria-expanded' ) ) {\n\t\t\t$button.attr({ 'aria-expanded': 'false', 'aria-label': l10n.expandSidebar });\n\t\t} else {\n\t\t\t$button.attr({ 'aria-expanded': 'true', 'aria-label': l10n.collapseSidebar });\n\t\t}\n\n\t\tthis.$el.toggleClass( 'collapsed' ).toggleClass( 'expanded' );\n\t\treturn false;\n\t},\n\n\tkeyEvent: function( event ) {\n\t\t// The escape key closes the preview\n\t\tif ( event.keyCode === 27 ) {\n\t\t\tthis.undelegateEvents();\n\t\t\tthis.close();\n\t\t}\n\t\t// The right arrow key, next theme\n\t\tif ( event.keyCode === 39 ) {\n\t\t\t_.once( this.nextTheme() );\n\t\t}\n\n\t\t// The left arrow key, previous theme\n\t\tif ( event.keyCode === 37 ) {\n\t\t\tthis.previousTheme();\n\t\t}\n\t}\n});\n\n// Controls the rendering of div.themes,\n// a wrapper that will hold all the theme elements\nthemes.view.Themes = wp.Backbone.View.extend({\n\n\tclassName: 'themes',\n\t$overlay: $( 'div.theme-overlay' ),\n\n\t// Number to keep track of scroll position\n\t// while in theme-overlay mode\n\tindex: 0,\n\n\t// The theme count element\n\tcount: $( '.wp-core-ui .theme-count' ),\n\n\t// The live themes count\n\tliveThemeCount: 0,\n\n\tinitialize: function( options ) {\n\t\tvar self = this;\n\n\t\t// Set up parent\n\t\tthis.parent = options.parent;\n\n\t\t// Set current view to [grid]\n\t\tthis.setView( 'grid' );\n\n\t\t// Move the active theme to the beginning of the collection\n\t\tself.currentTheme();\n\n\t\t// When the collection is updated by user input...\n\t\tthis.listenTo( self.collection, 'update', function() {\n\t\t\tself.parent.page = 0;\n\t\t\tself.currentTheme();\n\t\t\tself.render( this );\n\t\t});\n\n\t\t// Update theme count to full result set when available.\n\t\tthis.listenTo( self.collection, 'query:success', function( count ) {\n\t\t\tif ( _.isNumber( count ) ) {\n\t\t\t\tself.count.text( count );\n\t\t\t\tself.announceSearchResults( count );\n\t\t\t} else {\n\t\t\t\tself.count.text( self.collection.length );\n\t\t\t\tself.announceSearchResults( self.collection.length );\n\t\t\t}\n\t\t});\n\n\t\tthis.listenTo( self.collection, 'query:empty', function() {\n\t\t\t$( 'body' ).addClass( 'no-results' );\n\t\t});\n\n\t\tthis.listenTo( this.parent, 'theme:scroll', function() {\n\t\t\tself.renderThemes( self.parent.page );\n\t\t});\n\n\t\tthis.listenTo( this.parent, 'theme:close', function() {\n\t\t\tif ( self.overlay ) {\n\t\t\t\tself.overlay.closeOverlay();\n\t\t\t}\n\t\t} );\n\n\t\t// Bind keyboard events.\n\t\t$( 'body' ).on( 'keyup', function( event ) {\n\t\t\tif ( ! self.overlay ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Pressing the right arrow key fires a theme:next event\n\t\t\tif ( event.keyCode === 39 ) {\n\t\t\t\tself.overlay.nextTheme();\n\t\t\t}\n\n\t\t\t// Pressing the left arrow key fires a theme:previous event\n\t\t\tif ( event.keyCode === 37 ) {\n\t\t\t\tself.overlay.previousTheme();\n\t\t\t}\n\n\t\t\t// Pressing the escape key fires a theme:collapse event\n\t\t\tif ( event.keyCode === 27 ) {\n\t\t\t\tself.overlay.collapse( event );\n\t\t\t}\n\t\t});\n\t},\n\n\t// Manages rendering of theme pages\n\t// and keeping theme count in sync\n\trender: function() {\n\t\t// Clear the DOM, please\n\t\tthis.$el.empty();\n\n\t\t// If the user doesn't have switch capabilities\n\t\t// or there is only one theme in the collection\n\t\t// render the detailed view of the active theme\n\t\tif ( themes.data.themes.length === 1 ) {\n\n\t\t\t// Constructs the view\n\t\t\tthis.singleTheme = new themes.view.Details({\n\t\t\t\tmodel: this.collection.models[0]\n\t\t\t});\n\n\t\t\t// Render and apply a 'single-theme' class to our container\n\t\t\tthis.singleTheme.render();\n\t\t\tthis.$el.addClass( 'single-theme' );\n\t\t\tthis.$el.append( this.singleTheme.el );\n\t\t}\n\n\t\t// Generate the themes\n\t\t// Using page instance\n\t\t// While checking the collection has items\n\t\tif ( this.options.collection.size() > 0 ) {\n\t\t\tthis.renderThemes( this.parent.page );\n\t\t}\n\n\t\t// Display a live theme count for the collection\n\t\tthis.liveThemeCount = this.collection.count ? this.collection.count : this.collection.length;\n\t\tthis.count.text( this.liveThemeCount );\n\n\t\tthis.announceSearchResults( this.liveThemeCount );\n\t},\n\n\t// Iterates through each instance of the collection\n\t// and renders each theme module\n\trenderThemes: function( page ) {\n\t\tvar self = this;\n\n\t\tself.instance = self.collection.paginate( page );\n\n\t\t// If we have no more themes bail\n\t\tif ( self.instance.size() === 0 ) {\n\t\t\t// Fire a no-more-themes event.\n\t\t\tthis.parent.trigger( 'theme:end' );\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure the add-new stays at the end\n\t\tif ( ! themes.isInstall && page >= 1 ) {\n\t\t\t$( '.add-new-theme' ).remove();\n\t\t}\n\n\t\t// Loop through the themes and setup each theme view\n\t\tself.instance.each( function( theme ) {\n\t\t\tself.theme = new themes.view.Theme({\n\t\t\t\tmodel: theme,\n\t\t\t\tparent: self\n\t\t\t});\n\n\t\t\t// Render the views...\n\t\t\tself.theme.render();\n\t\t\t// and append them to div.themes\n\t\t\tself.$el.append( self.theme.el );\n\n\t\t\t// Binds to theme:expand to show the modal box\n\t\t\t// with the theme details\n\t\t\tself.listenTo( self.theme, 'theme:expand', self.expand, self );\n\t\t});\n\n\t\t// 'Add new theme' element shown at the end of the grid\n\t\tif ( ! themes.isInstall && themes.data.settings.canInstall ) {\n\t\t\tthis.$el.append( '<div class=\"theme add-new-theme\"><a href=\"' + themes.data.settings.installURI + '\"><div class=\"theme-screenshot\"><span></span></div><h2 class=\"theme-name\">' + l10n.addNew + '</h2></a></div>' );\n\t\t}\n\n\t\tthis.parent.page++;\n\t},\n\n\t// Grabs current theme and puts it at the beginning of the collection\n\tcurrentTheme: function() {\n\t\tvar self = this,\n\t\t\tcurrent;\n\n\t\tcurrent = self.collection.findWhere({ active: true });\n\n\t\t// Move the active theme to the beginning of the collection\n\t\tif ( current ) {\n\t\t\tself.collection.remove( current );\n\t\t\tself.collection.add( current, { at:0 } );\n\t\t}\n\t},\n\n\t// Sets current view\n\tsetView: function( view ) {\n\t\treturn view;\n\t},\n\n\t// Renders the overlay with the ThemeDetails view\n\t// Uses the current model data\n\texpand: function( id ) {\n\t\tvar self = this;\n\n\t\t// Set the current theme model\n\t\tthis.model = self.collection.get( id );\n\n\t\t// Trigger a route update for the current model\n\t\tthemes.router.navigate( themes.router.baseUrl( themes.router.themePath + this.model.id ) );\n\n\t\t// Sets this.view to 'detail'\n\t\tthis.setView( 'detail' );\n\t\t$( 'body' ).addClass( 'modal-open' );\n\n\t\t// Set up the theme details view\n\t\tthis.overlay = new themes.view.Details({\n\t\t\tmodel: self.model\n\t\t});\n\n\t\tthis.overlay.render();\n\t\tthis.$overlay.html( this.overlay.el );\n\n\t\t// Bind to theme:next and theme:previous\n\t\t// triggered by the arrow keys\n\t\t//\n\t\t// Keep track of the current model so we\n\t\t// can infer an index position\n\t\tthis.listenTo( this.overlay, 'theme:next', function() {\n\t\t\t// Renders the next theme on the overlay\n\t\t\tself.next( [ self.model.cid ] );\n\n\t\t})\n\t\t.listenTo( this.overlay, 'theme:previous', function() {\n\t\t\t// Renders the previous theme on the overlay\n\t\t\tself.previous( [ self.model.cid ] );\n\t\t});\n\t},\n\n\t// This method renders the next theme on the overlay modal\n\t// based on the current position in the collection\n\t// @params [model cid]\n\tnext: function( args ) {\n\t\tvar self = this,\n\t\t\tmodel, nextModel;\n\n\t\t// Get the current theme\n\t\tmodel = self.collection.get( args[0] );\n\t\t// Find the next model within the collection\n\t\tnextModel = self.collection.at( self.collection.indexOf( model ) + 1 );\n\n\t\t// Sanity check which also serves as a boundary test\n\t\tif ( nextModel !== undefined ) {\n\n\t\t\t// We have a new theme...\n\t\t\t// Close the overlay\n\t\t\tthis.overlay.closeOverlay();\n\n\t\t\t// Trigger a route update for the current model\n\t\t\tself.theme.trigger( 'theme:expand', nextModel.cid );\n\n\t\t}\n\t},\n\n\t// This method renders the previous theme on the overlay modal\n\t// based on the current position in the collection\n\t// @params [model cid]\n\tprevious: function( args ) {\n\t\tvar self = this,\n\t\t\tmodel, previousModel;\n\n\t\t// Get the current theme\n\t\tmodel = self.collection.get( args[0] );\n\t\t// Find the previous model within the collection\n\t\tpreviousModel = self.collection.at( self.collection.indexOf( model ) - 1 );\n\n\t\tif ( previousModel !== undefined ) {\n\n\t\t\t// We have a new theme...\n\t\t\t// Close the overlay\n\t\t\tthis.overlay.closeOverlay();\n\n\t\t\t// Trigger a route update for the current model\n\t\t\tself.theme.trigger( 'theme:expand', previousModel.cid );\n\n\t\t}\n\t},\n\n\t// Dispatch audible search results feedback message\n\tannounceSearchResults: function( count ) {\n\t\tif ( 0 === count ) {\n\t\t\twp.a11y.speak( l10n.noThemesFound );\n\t\t} else {\n\t\t\twp.a11y.speak( l10n.themesFound.replace( '%d', count ) );\n\t\t}\n\t}\n});\n\n// Search input view controller.\nthemes.view.Search = wp.Backbone.View.extend({\n\n\ttagName: 'input',\n\tclassName: 'wp-filter-search',\n\tid: 'wp-filter-search-input',\n\tsearching: false,\n\n\tattributes: {\n\t\tplaceholder: l10n.searchPlaceholder,\n\t\ttype: 'search',\n\t\t'aria-describedby': 'live-search-desc'\n\t},\n\n\tevents: {\n\t\t'input': 'search',\n\t\t'keyup': 'search',\n\t\t'blur': 'pushState'\n\t},\n\n\tinitialize: function( options ) {\n\n\t\tthis.parent = options.parent;\n\n\t\tthis.listenTo( this.parent, 'theme:close', function() {\n\t\t\tthis.searching = false;\n\t\t} );\n\n\t},\n\n\tsearch: function( event ) {\n\t\t// Clear on escape.\n\t\tif ( event.type === 'keyup' && event.which === 27 ) {\n\t\t\tevent.target.value = '';\n\t\t}\n\n\t\t/**\n\t\t * Since doSearch is debounced, it will only run when user input comes to a rest\n\t\t */\n\t\tthis.doSearch( event );\n\t},\n\n\t// Runs a search on the theme collection.\n\tdoSearch: _.debounce( function( event ) {\n\t\tvar options = {};\n\n\t\tthis.collection.doSearch( event.target.value );\n\n\t\t// if search is initiated and key is not return\n\t\tif ( this.searching && event.which !== 13 ) {\n\t\t\toptions.replace = true;\n\t\t} else {\n\t\t\tthis.searching = true;\n\t\t}\n\n\t\t// Update the URL hash\n\t\tif ( event.target.value ) {\n\t\t\tthemes.router.navigate( themes.router.baseUrl( themes.router.searchPath + event.target.value ), options );\n\t\t} else {\n\t\t\tthemes.router.navigate( themes.router.baseUrl( '' ) );\n\t\t}\n\t}, 500 ),\n\n\tpushState: function( event ) {\n\t\tvar url = themes.router.baseUrl( '' );\n\n\t\tif ( event.target.value ) {\n\t\t\turl = themes.router.baseUrl( themes.router.searchPath + event.target.value );\n\t\t}\n\n\t\tthis.searching = false;\n\t\tthemes.router.navigate( url );\n\n\t}\n});\n\n// Sets up the routes events for relevant url queries\n// Listens to [theme] and [search] params\nthemes.Router = Backbone.Router.extend({\n\n\troutes: {\n\t\t'themes.php?theme=:slug': 'theme',\n\t\t'themes.php?search=:query': 'search',\n\t\t'themes.php?s=:query': 'search',\n\t\t'themes.php': 'themes',\n\t\t'': 'themes'\n\t},\n\n\tbaseUrl: function( url ) {\n\t\treturn 'themes.php' + url;\n\t},\n\n\tthemePath: '?theme=',\n\tsearchPath: '?search=',\n\n\tsearch: function( query ) {\n\t\t$( '.wp-filter-search' ).val( query );\n\t},\n\n\tthemes: function() {\n\t\t$( '.wp-filter-search' ).val( '' );\n\t},\n\n\tnavigate: function() {\n\t\tif ( Backbone.history._hasPushState ) {\n\t\t\tBackbone.Router.prototype.navigate.apply( this, arguments );\n\t\t}\n\t}\n\n});\n\n// Execute and setup the application\nthemes.Run = {\n\tinit: function() {\n\t\t// Initializes the blog's theme library view\n\t\t// Create a new collection with data\n\t\tthis.themes = new themes.Collection( themes.data.themes );\n\n\t\t// Set up the view\n\t\tthis.view = new themes.view.Appearance({\n\t\t\tcollection: this.themes\n\t\t});\n\n\t\tthis.render();\n\t},\n\n\trender: function() {\n\n\t\t// Render results\n\t\tthis.view.render();\n\t\tthis.routes();\n\n\t\tBackbone.history.start({\n\t\t\troot: themes.data.settings.adminUrl,\n\t\t\tpushState: true,\n\t\t\thashChange: false\n\t\t});\n\t},\n\n\troutes: function() {\n\t\tvar self = this;\n\t\t// Bind to our global thx object\n\t\t// so that the object is available to sub-views\n\t\tthemes.router = new themes.Router();\n\n\t\t// Handles theme details route event\n\t\tthemes.router.on( 'route:theme', function( slug ) {\n\t\t\tself.view.view.expand( slug );\n\t\t});\n\n\t\tthemes.router.on( 'route:themes', function() {\n\t\t\tself.themes.doSearch( '' );\n\t\t\tself.view.trigger( 'theme:close' );\n\t\t});\n\n\t\t// Handles search route event\n\t\tthemes.router.on( 'route:search', function() {\n\t\t\t$( '.wp-filter-search' ).trigger( 'keyup' );\n\t\t});\n\n\t\tthis.extraRoutes();\n\t},\n\n\textraRoutes: function() {\n\t\treturn false;\n\t}\n};\n\n// Extend the main Search view\nthemes.view.InstallerSearch =  themes.view.Search.extend({\n\n\tevents: {\n\t\t'input': 'search',\n\t\t'keyup': 'search'\n\t},\n\n\t// Handles Ajax request for searching through themes in public repo\n\tsearch: function( event ) {\n\n\t\t// Tabbing or reverse tabbing into the search input shouldn't trigger a search\n\t\tif ( event.type === 'keyup' && ( event.which === 9 || event.which === 16 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.collection = this.options.parent.view.collection;\n\n\t\t// Clear on escape.\n\t\tif ( event.type === 'keyup' && event.which === 27 ) {\n\t\t\tevent.target.value = '';\n\t\t}\n\n\t\tthis.doSearch( event.target.value );\n\t},\n\n\tdoSearch: _.debounce( function( value ) {\n\t\tvar request = {};\n\n\t\trequest.search = value;\n\n\t\t// Intercept an [author] search.\n\t\t//\n\t\t// If input value starts with `author:` send a request\n\t\t// for `author` instead of a regular `search`\n\t\tif ( value.substring( 0, 7 ) === 'author:' ) {\n\t\t\trequest.search = '';\n\t\t\trequest.author = value.slice( 7 );\n\t\t}\n\n\t\t// Intercept a [tag] search.\n\t\t//\n\t\t// If input value starts with `tag:` send a request\n\t\t// for `tag` instead of a regular `search`\n\t\tif ( value.substring( 0, 4 ) === 'tag:' ) {\n\t\t\trequest.search = '';\n\t\t\trequest.tag = [ value.slice( 4 ) ];\n\t\t}\n\n\t\t$( '.filter-links li > a.current' ).removeClass( 'current' );\n\t\t$( 'body' ).removeClass( 'show-filters filters-applied show-favorites-form' );\n\n\t\t// Get the themes by sending Ajax POST request to api.wordpress.org/themes\n\t\t// or searching the local cache\n\t\tthis.collection.query( request );\n\n\t\t// Set route\n\t\tthemes.router.navigate( themes.router.baseUrl( themes.router.searchPath + value ), { replace: true } );\n\t}, 500 )\n});\n\nthemes.view.Installer = themes.view.Appearance.extend({\n\n\tel: '#wpbody-content .wrap',\n\n\t// Register events for sorting and filters in theme-navigation\n\tevents: {\n\t\t'click .filter-links li > a': 'onSort',\n\t\t'click .theme-filter': 'onFilter',\n\t\t'click .drawer-toggle': 'moreFilters',\n\t\t'click .filter-drawer .apply-filters': 'applyFilters',\n\t\t'click .filter-group [type=\"checkbox\"]': 'addFilter',\n\t\t'click .filter-drawer .clear-filters': 'clearFilters',\n\t\t'click .filtered-by': 'backToFilters',\n\t\t'click .favorites-form-submit' : 'saveUsername',\n\t\t'keyup #wporg-username-input': 'saveUsername'\n\t},\n\n\t// Initial render method\n\trender: function() {\n\t\tvar self = this;\n\n\t\tthis.search();\n\t\tthis.uploader();\n\n\t\tthis.collection = new themes.Collection();\n\n\t\t// Bump `collection.currentQuery.page` and request more themes if we hit the end of the page.\n\t\tthis.listenTo( this, 'theme:end', function() {\n\n\t\t\t// Make sure we are not already loading\n\t\t\tif ( self.collection.loadingThemes ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set loadingThemes to true and bump page instance of currentQuery.\n\t\t\tself.collection.loadingThemes = true;\n\t\t\tself.collection.currentQuery.page++;\n\n\t\t\t// Use currentQuery.page to build the themes request.\n\t\t\t_.extend( self.collection.currentQuery.request, { page: self.collection.currentQuery.page } );\n\t\t\tself.collection.query( self.collection.currentQuery.request );\n\t\t});\n\n\t\tthis.listenTo( this.collection, 'query:success', function() {\n\t\t\t$( 'body' ).removeClass( 'loading-content' );\n\t\t\t$( '.theme-browser' ).find( 'div.error' ).remove();\n\t\t});\n\n\t\tthis.listenTo( this.collection, 'query:fail', function() {\n\t\t\t$( 'body' ).removeClass( 'loading-content' );\n\t\t\t$( '.theme-browser' ).find( 'div.error' ).remove();\n\t\t\t$( '.theme-browser' ).find( 'div.themes' ).before( '<div class=\"error\"><p>' + l10n.error + '</p></div>' );\n\t\t});\n\n\t\tif ( this.view ) {\n\t\t\tthis.view.remove();\n\t\t}\n\n\t\t// Set ups the view and passes the section argument\n\t\tthis.view = new themes.view.Themes({\n\t\t\tcollection: this.collection,\n\t\t\tparent: this\n\t\t});\n\n\t\t// Reset pagination every time the install view handler is run\n\t\tthis.page = 0;\n\n\t\t// Render and append\n\t\tthis.$el.find( '.themes' ).remove();\n\t\tthis.view.render();\n\t\tthis.$el.find( '.theme-browser' ).append( this.view.el ).addClass( 'rendered' );\n\t},\n\n\t// Handles all the rendering of the public theme directory\n\tbrowse: function( section ) {\n\t\t// Create a new collection with the proper theme data\n\t\t// for each section\n\t\tthis.collection.query( { browse: section } );\n\t},\n\n\t// Sorting navigation\n\tonSort: function( event ) {\n\t\tvar $el = $( event.target ),\n\t\t\tsort = $el.data( 'sort' );\n\n\t\tevent.preventDefault();\n\n\t\t$( 'body' ).removeClass( 'filters-applied show-filters' );\n\n\t\t// Bail if this is already active\n\t\tif ( $el.hasClass( this.activeClass ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.sort( sort );\n\n\t\t// Trigger a router.naviagte update\n\t\tthemes.router.navigate( themes.router.baseUrl( themes.router.browsePath + sort ) );\n\t},\n\n\tsort: function( sort ) {\n\t\tthis.clearSearch();\n\n\t\t$( '.filter-links li > a, .theme-filter' ).removeClass( this.activeClass );\n\t\t$( '[data-sort=\"' + sort + '\"]' ).addClass( this.activeClass );\n\n\t\tif ( 'favorites' === sort ) {\n\t\t\t$ ( 'body' ).addClass( 'show-favorites-form' );\n\t\t} else {\n\t\t\t$ ( 'body' ).removeClass( 'show-favorites-form' );\n\t\t}\n\n\t\tthis.browse( sort );\n\t},\n\n\t// Filters and Tags\n\tonFilter: function( event ) {\n\t\tvar request,\n\t\t\t$el = $( event.target ),\n\t\t\tfilter = $el.data( 'filter' );\n\n\t\t// Bail if this is already active\n\t\tif ( $el.hasClass( this.activeClass ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$( '.filter-links li > a, .theme-section' ).removeClass( this.activeClass );\n\t\t$el.addClass( this.activeClass );\n\n\t\tif ( ! filter ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Construct the filter request\n\t\t// using the default values\n\t\tfilter = _.union( filter, this.filtersChecked() );\n\t\trequest = { tag: [ filter ] };\n\n\t\t// Get the themes by sending Ajax POST request to api.wordpress.org/themes\n\t\t// or searching the local cache\n\t\tthis.collection.query( request );\n\t},\n\n\t// Clicking on a checkbox to add another filter to the request\n\taddFilter: function() {\n\t\tthis.filtersChecked();\n\t},\n\n\t// Applying filters triggers a tag request\n\tapplyFilters: function( event ) {\n\t\tvar name,\n\t\t\ttags = this.filtersChecked(),\n\t\t\trequest = { tag: tags },\n\t\t\tfilteringBy = $( '.filtered-by .tags' );\n\n\t\tif ( event ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\t$( 'body' ).addClass( 'filters-applied' );\n\t\t$( '.filter-links li > a.current' ).removeClass( 'current' );\n\t\tfilteringBy.empty();\n\n\t\t_.each( tags, function( tag ) {\n\t\t\tname = $( 'label[for=\"filter-id-' + tag + '\"]' ).text();\n\t\t\tfilteringBy.append( '<span class=\"tag\">' + name + '</span>' );\n\t\t});\n\n\t\t// Get the themes by sending Ajax POST request to api.wordpress.org/themes\n\t\t// or searching the local cache\n\t\tthis.collection.query( request );\n\t},\n\n\t// Save the user's WordPress.org username and get his favorite themes.\n\tsaveUsername: function ( event ) {\n\t\tvar username = $( '#wporg-username-input' ).val(),\n\t\t\trequest = { browse: 'favorites', user: username },\n\t\t\tthat = this;\n\n\t\tif ( event ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\t// save username on enter\n\t\tif ( event.type === 'keyup' && event.which !== 13 ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn wp.ajax.send( 'save-wporg-username', {\n\t\t\tdata: {\n\t\t\t\tusername: username\n\t\t\t},\n\t\t\tsuccess: function () {\n\t\t\t\t// Get the themes by sending Ajax POST request to api.wordpress.org/themes\n\t\t\t\t// or searching the local cache\n\t\t\t\tthat.collection.query( request );\n\t\t\t}\n\t\t} );\n\t},\n\n\t// Get the checked filters\n\t// @return {array} of tags or false\n\tfiltersChecked: function() {\n\t\tvar items = $( '.filter-group' ).find( ':checkbox' ),\n\t\t\ttags = [];\n\n\t\t_.each( items.filter( ':checked' ), function( item ) {\n\t\t\ttags.push( $( item ).prop( 'value' ) );\n\t\t});\n\n\t\t// When no filters are checked, restore initial state and return\n\t\tif ( tags.length === 0 ) {\n\t\t\t$( '.filter-drawer .apply-filters' ).find( 'span' ).text( '' );\n\t\t\t$( '.filter-drawer .clear-filters' ).hide();\n\t\t\t$( 'body' ).removeClass( 'filters-applied' );\n\t\t\treturn false;\n\t\t}\n\n\t\t$( '.filter-drawer .apply-filters' ).find( 'span' ).text( tags.length );\n\t\t$( '.filter-drawer .clear-filters' ).css( 'display', 'inline-block' );\n\n\t\treturn tags;\n\t},\n\n\tactiveClass: 'current',\n\n\t// Overwrite search container class to append search\n\t// in new location\n\tsearchContainer: $( '.wp-filter .search-form' ),\n\n\tuploader: function() {\n\t\t$( 'a.upload' ).on( 'click', function( event ) {\n\t\t\tevent.preventDefault();\n\t\t\t$( 'body' ).addClass( 'show-upload-theme' );\n\t\t\tthemes.router.navigate( themes.router.baseUrl( '?upload' ), { replace: true } );\n\t\t});\n\t\t$( 'a.browse-themes' ).on( 'click', function( event ) {\n\t\t\tevent.preventDefault();\n\t\t\t$( 'body' ).removeClass( 'show-upload-theme' );\n\t\t\tthemes.router.navigate( themes.router.baseUrl( '' ), { replace: true } );\n\t\t});\n\t},\n\n\t// Toggle the full filters navigation\n\tmoreFilters: function( event ) {\n\t\tevent.preventDefault();\n\n\t\tif ( $( 'body' ).hasClass( 'filters-applied' ) ) {\n\t\t\treturn this.backToFilters();\n\t\t}\n\n\t\t// If the filters section is opened and filters are checked\n\t\t// run the relevant query collapsing to filtered-by state\n\t\tif ( $( 'body' ).hasClass( 'show-filters' ) && this.filtersChecked() ) {\n\t\t\treturn this.addFilter();\n\t\t}\n\n\t\tthis.clearSearch();\n\n\t\tthemes.router.navigate( themes.router.baseUrl( '' ) );\n\t\t$( 'body' ).toggleClass( 'show-filters' );\n\t},\n\n\t// Clears all the checked filters\n\t// @uses filtersChecked()\n\tclearFilters: function( event ) {\n\t\tvar items = $( '.filter-group' ).find( ':checkbox' ),\n\t\t\tself = this;\n\n\t\tevent.preventDefault();\n\n\t\t_.each( items.filter( ':checked' ), function( item ) {\n\t\t\t$( item ).prop( 'checked', false );\n\t\t\treturn self.filtersChecked();\n\t\t});\n\t},\n\n\tbackToFilters: function( event ) {\n\t\tif ( event ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\t$( 'body' ).removeClass( 'filters-applied' );\n\t},\n\n\tclearSearch: function() {\n\t\t$( '#wp-filter-search-input').val( '' );\n\t}\n});\n\nthemes.InstallerRouter = Backbone.Router.extend({\n\troutes: {\n\t\t'theme-install.php?theme=:slug': 'preview',\n\t\t'theme-install.php?browse=:sort': 'sort',\n\t\t'theme-install.php?upload': 'upload',\n\t\t'theme-install.php?search=:query': 'search',\n\t\t'theme-install.php': 'sort'\n\t},\n\n\tbaseUrl: function( url ) {\n\t\treturn 'theme-install.php' + url;\n\t},\n\n\tthemePath: '?theme=',\n\tbrowsePath: '?browse=',\n\tsearchPath: '?search=',\n\n\tsearch: function( query ) {\n\t\t$( '.wp-filter-search' ).val( query );\n\t},\n\n\tnavigate: function() {\n\t\tif ( Backbone.history._hasPushState ) {\n\t\t\tBackbone.Router.prototype.navigate.apply( this, arguments );\n\t\t}\n\t}\n});\n\n\nthemes.RunInstaller = {\n\n\tinit: function() {\n\t\t// Set up the view\n\t\t// Passes the default 'section' as an option\n\t\tthis.view = new themes.view.Installer({\n\t\t\tsection: 'featured',\n\t\t\tSearchView: themes.view.InstallerSearch\n\t\t});\n\n\t\t// Render results\n\t\tthis.render();\n\n\t},\n\n\trender: function() {\n\n\t\t// Render results\n\t\tthis.view.render();\n\t\tthis.routes();\n\n\t\tBackbone.history.start({\n\t\t\troot: themes.data.settings.adminUrl,\n\t\t\tpushState: true,\n\t\t\thashChange: false\n\t\t});\n\t},\n\n\troutes: function() {\n\t\tvar self = this,\n\t\t\trequest = {};\n\n\t\t// Bind to our global `wp.themes` object\n\t\t// so that the router is available to sub-views\n\t\tthemes.router = new themes.InstallerRouter();\n\n\t\t// Handles `theme` route event\n\t\t// Queries the API for the passed theme slug\n\t\tthemes.router.on( 'route:preview', function( slug ) {\n\t\t\trequest.theme = slug;\n\t\t\tself.view.collection.query( request );\n\t\t\tself.view.collection.once( 'update', function() {\n\t\t\t\tself.view.view.theme.preview();\n\t\t\t});\n\t\t});\n\n\t\t// Handles sorting / browsing routes\n\t\t// Also handles the root URL triggering a sort request\n\t\t// for `featured`, the default view\n\t\tthemes.router.on( 'route:sort', function( sort ) {\n\t\t\tif ( ! sort ) {\n\t\t\t\tsort = 'featured';\n\t\t\t}\n\t\t\tself.view.sort( sort );\n\t\t\tself.view.trigger( 'theme:close' );\n\t\t});\n\n\t\t// Support the `upload` route by going straight to upload section\n\t\tthemes.router.on( 'route:upload', function() {\n\t\t\t$( 'a.upload' ).trigger( 'click' );\n\t\t});\n\n\t\t// The `search` route event. The router populates the input field.\n\t\tthemes.router.on( 'route:search', function() {\n\t\t\t$( '.wp-filter-search' ).focus().trigger( 'keyup' );\n\t\t});\n\n\t\tthis.extraRoutes();\n\t},\n\n\textraRoutes: function() {\n\t\treturn false;\n\t}\n};\n\n// Ready...\n$( document ).ready(function() {\n\tif ( themes.isInstall ) {\n\t\tthemes.RunInstaller.init();\n\t} else {\n\t\tthemes.Run.init();\n\t}\n\n\t$( '.broken-themes .delete-theme' ).on( 'click', function() {\n\t\treturn confirm( _wpThemeSettings.settings.confirmDelete );\n\t});\n});\n\n})( jQuery );\n\n// Align theme browser thickbox\nvar tb_position;\njQuery(document).ready( function($) {\n\ttb_position = function() {\n\t\tvar tbWindow = $('#TB_window'),\n\t\t\twidth = $(window).width(),\n\t\t\tH = $(window).height(),\n\t\t\tW = ( 1040 < width ) ? 1040 : width,\n\t\t\tadminbar_height = 0;\n\n\t\tif ( $('#wpadminbar').length ) {\n\t\t\tadminbar_height = parseInt( $('#wpadminbar').css('height'), 10 );\n\t\t}\n\n\t\tif ( tbWindow.size() ) {\n\t\t\ttbWindow.width( W - 50 ).height( H - 45 - adminbar_height );\n\t\t\t$('#TB_iframeContent').width( W - 50 ).height( H - 75 - adminbar_height );\n\t\t\ttbWindow.css({'margin-left': '-' + parseInt( ( ( W - 50 ) / 2 ), 10 ) + 'px'});\n\t\t\tif ( typeof document.body.style.maxWidth !== 'undefined' ) {\n\t\t\t\ttbWindow.css({'top': 20 + adminbar_height + 'px', 'margin-top': '0'});\n\t\t\t}\n\t\t}\n\t};\n\n\t$(window).resize(function(){ tb_position(); });\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/updates.js",
    "content": "/* global tb_remove */\nwindow.wp = window.wp || {};\n\n(function( $, wp, pagenow ) {\n\twp.updates = {};\n\n\t/**\n\t * User nonce for ajax calls.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @var string\n\t */\n\twp.updates.ajaxNonce = window._wpUpdatesSettings.ajax_nonce;\n\n\t/**\n\t * Localized strings.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @var object\n\t */\n\twp.updates.l10n = window._wpUpdatesSettings.l10n;\n\n\t/**\n\t * Whether filesystem credentials need to be requested from the user.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @var bool\n\t */\n\twp.updates.shouldRequestFilesystemCredentials = null;\n\n\t/**\n\t * Filesystem credentials to be packaged along with the request.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @var object\n\t */\n\twp.updates.filesystemCredentials = {\n\t\tftp: {\n\t\t\thost: null,\n\t\t\tusername: null,\n\t\t\tpassword: null,\n\t\t\tconnectionType: null\n\t\t},\n\t\tssh: {\n\t\t\tpublicKey: null,\n\t\t\tprivateKey: null\n\t\t}\n\t};\n\n\t/**\n\t * Flag if we're waiting for an update to complete.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @var bool\n\t */\n\twp.updates.updateLock = false;\n\n\t/**\n\t * * Flag if we've done an update successfully.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @var bool\n\t */\n\twp.updates.updateDoneSuccessfully = false;\n\n\t/**\n\t * If the user tries to update a plugin while an update is\n\t * already happening, it can be placed in this queue to perform later.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @var array\n\t */\n\twp.updates.updateQueue = [];\n\n\t/**\n\t * Store a jQuery reference to return focus to when exiting the request credentials modal.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @var jQuery object\n\t */\n\twp.updates.$elToReturnFocusToFromCredentialsModal = null;\n\n\t/**\n\t * Decrement update counts throughout the various menus.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param {string} upgradeType\n\t */\n\twp.updates.decrementCount = function( upgradeType ) {\n\t\tvar count,\n\t\t\tpluginCount,\n\t\t\t$adminBarUpdateCount = $( '#wp-admin-bar-updates .ab-label' ),\n\t\t\t$dashboardNavMenuUpdateCount = $( 'a[href=\"update-core.php\"] .update-plugins' ),\n\t\t\t$pluginsMenuItem = $( '#menu-plugins' );\n\n\n\t\tcount = $adminBarUpdateCount.text();\n\t\tcount = parseInt( count, 10 ) - 1;\n\t\tif ( count < 0 || isNaN( count ) ) {\n\t\t\treturn;\n\t\t}\n\t\t$( '#wp-admin-bar-updates .ab-item' ).removeAttr( 'title' );\n\t\t$adminBarUpdateCount.text( count );\n\n\n\t\t$dashboardNavMenuUpdateCount.each( function( index, elem ) {\n\t\t\telem.className = elem.className.replace( /count-\\d+/, 'count-' + count );\n\t\t} );\n\t\t$dashboardNavMenuUpdateCount.removeAttr( 'title' );\n\t\t$dashboardNavMenuUpdateCount.find( '.update-count' ).text( count );\n\n\t\tif ( 'plugin' === upgradeType ) {\n\t\t\tpluginCount = $pluginsMenuItem.find( '.plugin-count' ).eq(0).text();\n\t\t\tpluginCount = parseInt( pluginCount, 10 ) - 1;\n\t\t\tif ( pluginCount < 0 || isNaN( pluginCount ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t$pluginsMenuItem.find( '.plugin-count' ).text( pluginCount );\n\t\t\t$pluginsMenuItem.find( '.update-plugins' ).each( function( index, elem ) {\n\t\t\t\telem.className = elem.className.replace( /count-\\d+/, 'count-' + pluginCount );\n\t\t\t} );\n\n\t\t\tif (pluginCount > 0 ) {\n\t\t\t\t$( '.subsubsub .upgrade .count' ).text( '(' + pluginCount + ')' );\n\t\t\t} else {\n\t\t\t\t$( '.subsubsub .upgrade' ).remove();\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Send an Ajax request to the server to update a plugin.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param {string} plugin\n\t * @param {string} slug\n\t */\n\twp.updates.updatePlugin = function( plugin, slug ) {\n\t\tvar $message, name,\n\t\t\t$card = $( '.plugin-card-' + slug );\n\n\t\tif ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {\n\t\t\t$message = $( '[data-slug=\"' + slug + '\"]' ).next().find( '.update-message' );\n\t\t} else if ( 'plugin-install' === pagenow ) {\n\t\t\t$message = $card.find( '.update-now' );\n\t\t\tname = $message.data( 'name' );\n\t\t\t$message.attr( 'aria-label', wp.updates.l10n.updatingLabel.replace( '%s', name ) );\n\t\t\t// Remove previous error messages, if any.\n\t\t\t$card.removeClass( 'plugin-card-update-failed' ).find( '.notice.notice-error' ).remove();\n\t\t}\n\n\t\t$message.addClass( 'updating-message' );\n\t\tif ( $message.html() !== wp.updates.l10n.updating ){\n\t\t\t$message.data( 'originaltext', $message.html() );\n\t\t}\n\n\t\t$message.text( wp.updates.l10n.updating );\n\t\twp.a11y.speak( wp.updates.l10n.updatingMsg );\n\n\t\tif ( wp.updates.updateLock ) {\n\t\t\twp.updates.updateQueue.push( {\n\t\t\t\ttype: 'update-plugin',\n\t\t\t\tdata: {\n\t\t\t\t\tplugin: plugin,\n\t\t\t\t\tslug: slug\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn;\n\t\t}\n\n\t\twp.updates.updateLock = true;\n\n\t\tvar data = {\n\t\t\t_ajax_nonce:     wp.updates.ajaxNonce,\n\t\t\tplugin:          plugin,\n\t\t\tslug:            slug,\n\t\t\tusername:        wp.updates.filesystemCredentials.ftp.username,\n\t\t\tpassword:        wp.updates.filesystemCredentials.ftp.password,\n\t\t\thostname:        wp.updates.filesystemCredentials.ftp.hostname,\n\t\t\tconnection_type: wp.updates.filesystemCredentials.ftp.connectionType,\n\t\t\tpublic_key:      wp.updates.filesystemCredentials.ssh.publicKey,\n\t\t\tprivate_key:     wp.updates.filesystemCredentials.ssh.privateKey\n\t\t};\n\n\t\twp.ajax.post( 'update-plugin', data )\n\t\t\t.done( wp.updates.updateSuccess )\n\t\t\t.fail( wp.updates.updateError );\n\t};\n\n\t/**\n\t * On a successful plugin update, update the UI with the result.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param {object} response\n\t */\n\twp.updates.updateSuccess = function( response ) {\n\t\tvar $updateMessage, name, $pluginRow, newText;\n\t\tif ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {\n\t\t\t$pluginRow = $( '[data-slug=\"' + response.slug + '\"]' ).first();\n\t\t\t$updateMessage = $pluginRow.next().find( '.update-message' );\n\t\t\t$pluginRow.addClass( 'updated' ).removeClass( 'update' );\n\n\t\t\t// Update the version number in the row.\n\t\t\tnewText = $pluginRow.find('.plugin-version-author-uri').html().replace( response.oldVersion, response.newVersion );\n\t\t\t$pluginRow.find('.plugin-version-author-uri').html( newText );\n\n\t\t\t// Add updated class to update message parent tr\n\t\t\t$pluginRow.next().addClass( 'updated' );\n\t\t} else if ( 'plugin-install' === pagenow ) {\n\t\t\t$updateMessage = $( '.plugin-card-' + response.slug ).find( '.update-now' );\n\t\t\t$updateMessage.addClass( 'button-disabled' );\n\t\t\tname = $updateMessage.data( 'name' );\n\t\t\t$updateMessage.attr( 'aria-label', wp.updates.l10n.updatedLabel.replace( '%s', name ) );\n\t\t}\n\n\t\t$updateMessage.removeClass( 'updating-message' ).addClass( 'updated-message' );\n\t\t$updateMessage.text( wp.updates.l10n.updated );\n\t\twp.a11y.speak( wp.updates.l10n.updatedMsg );\n\n\t\twp.updates.decrementCount( 'plugin' );\n\n\t\twp.updates.updateDoneSuccessfully = true;\n\n\t\t/*\n\t\t * The lock can be released since the update was successful,\n\t\t * and any other updates can commence.\n\t\t */\n\t\twp.updates.updateLock = false;\n\n\t\t$(document).trigger( 'wp-plugin-update-success', response );\n\n\t\twp.updates.queueChecker();\n\t};\n\n\n\t/**\n\t * On a plugin update error, update the UI appropriately.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param {object} response\n\t */\n\twp.updates.updateError = function( response ) {\n\t\tvar $card = $( '.plugin-card-' + response.slug ),\n\t\t\t$message,\n\t\t\t$button,\n\t\t\tname,\n\t\t\terror_message;\n\n\t\twp.updates.updateDoneSuccessfully = false;\n\n\t\tif ( response.errorCode && response.errorCode == 'unable_to_connect_to_filesystem' && wp.updates.shouldRequestFilesystemCredentials ) {\n\t\t\twp.updates.credentialError( response, 'update-plugin' );\n\t\t\treturn;\n\t\t}\n\n\t\terror_message = wp.updates.l10n.updateFailed.replace( '%s', response.error );\n\n\t\tif ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {\n\t\t\t$message = $( '[data-slug=\"' + response.slug + '\"]' ).next().find( '.update-message' );\n\t\t\t$message.html( error_message ).removeClass( 'updating-message' );\n\t\t} else if ( 'plugin-install' === pagenow ) {\n\t\t\t$button = $card.find( '.update-now' );\n\t\t\tname = $button.data( 'name' );\n\n\t\t\t$card\n\t\t\t\t.addClass( 'plugin-card-update-failed' )\n\t\t\t\t.append( '<div class=\"notice notice-error is-dismissible\"><p>' + error_message + '</p></div>' );\n\n\t\t\t$button\n\t\t\t\t.attr( 'aria-label', wp.updates.l10n.updateFailedLabel.replace( '%s', name ) )\n\t\t\t\t.html( wp.updates.l10n.updateFailedShort ).removeClass( 'updating-message' );\n\n\t\t\t$card.on( 'click', '.notice.is-dismissible .notice-dismiss', function() {\n\t\t\t\t// Use same delay as the total duration of the notice fadeTo + slideUp animation.\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t$card\n\t\t\t\t\t\t.removeClass( 'plugin-card-update-failed' )\n\t\t\t\t\t\t.find( '.column-name a' ).focus();\n\t\t\t\t}, 200 );\n\t\t\t});\n\t\t}\n\n\t\twp.a11y.speak( error_message, 'assertive' );\n\n\t\t/*\n\t\t * The lock can be released since this failure was\n\t\t * after the credentials form.\n\t\t */\n\t\twp.updates.updateLock = false;\n\n\t\t$(document).trigger( 'wp-plugin-update-error', response );\n\n\t\twp.updates.queueChecker();\n\t};\n\n\t/**\n\t * Show an error message in the request for credentials form.\n\t *\n\t * @param {string} message\n\t * @since 4.2.0\n\t */\n\twp.updates.showErrorInCredentialsForm = function( message ) {\n\t\tvar $modal = $( '.notification-dialog' );\n\n\t\t// Remove any existing error.\n\t\t$modal.find( '.error' ).remove();\n\n\t\t$modal.find( 'h3' ).after( '<div class=\"error\">' + message + '</div>' );\n\t};\n\n\t/**\n\t * Events that need to happen when there is a credential error\n\t *\n\t * @since 4.2.0\n\t */\n\twp.updates.credentialError = function( response, type ) {\n\t\twp.updates.updateQueue.push( {\n\t\t\t'type': type,\n\t\t\t'data': {\n\t\t\t\t// Not cool that we're depending on response for this data.\n\t\t\t\t// This would feel more whole in a view all tied together.\n\t\t\t\tplugin: response.plugin,\n\t\t\t\tslug: response.slug\n\t\t\t}\n\t\t} );\n\t\twp.updates.showErrorInCredentialsForm( response.error );\n\t\twp.updates.requestFilesystemCredentials();\n\t};\n\n\t/**\n\t * If an update job has been placed in the queue, queueChecker pulls it out and runs it.\n\t *\n\t * @since 4.2.0\n\t */\n\twp.updates.queueChecker = function() {\n\t\tif ( wp.updates.updateLock || wp.updates.updateQueue.length <= 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar job = wp.updates.updateQueue.shift();\n\n\t\twp.updates.updatePlugin( job.data.plugin, job.data.slug );\n\t};\n\n\n\t/**\n\t * Request the users filesystem credentials if we don't have them already.\n\t *\n\t * @since 4.2.0\n\t */\n\twp.updates.requestFilesystemCredentials = function( event ) {\n\t\tif ( wp.updates.updateDoneSuccessfully === false ) {\n\t\t\t/*\n\t\t\t * For the plugin install screen, return the focus to the install button\n\t\t\t * after exiting the credentials request modal.\n\t\t\t */\n\t\t\tif ( 'plugin-install' === pagenow && event ) {\n\t\t\t\twp.updates.$elToReturnFocusToFromCredentialsModal = $( event.target );\n\t\t\t}\n\n\t\t\twp.updates.updateLock = true;\n\n\t\t\twp.updates.requestForCredentialsModalOpen();\n\t\t}\n\t};\n\n\t/**\n\t * Keydown handler for the request for credentials modal.\n\t *\n\t * Close the modal when the escape key is pressed.\n\t * Constrain keyboard navigation to inside the modal.\n\t *\n\t * @since 4.2.0\n\t */\n\twp.updates.keydown = function( event ) {\n\t\tif ( 27 === event.keyCode ) {\n\t\t\twp.updates.requestForCredentialsModalCancel();\n\t\t} else if ( 9 === event.keyCode ) {\n\t\t\t// #upgrade button must always be the last focusable element in the dialog.\n\t\t\tif ( event.target.id === 'upgrade' && ! event.shiftKey ) {\n\t\t\t\t$( '#hostname' ).focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( event.target.id === 'hostname' && event.shiftKey ) {\n\t\t\t\t$( '#upgrade' ).focus();\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Open the request for credentials modal.\n\t *\n\t * @since 4.2.0\n\t */\n\twp.updates.requestForCredentialsModalOpen = function() {\n\t\tvar $modal = $( '#request-filesystem-credentials-dialog' );\n\t\t$( 'body' ).addClass( 'modal-open' );\n\t\t$modal.show();\n\n\t\t$modal.find( 'input:enabled:first' ).focus();\n\t\t$modal.keydown( wp.updates.keydown );\n\t};\n\n\t/**\n\t * Close the request for credentials modal.\n\t *\n\t * @since 4.2.0\n\t */\n\twp.updates.requestForCredentialsModalClose = function() {\n\t\t$( '#request-filesystem-credentials-dialog' ).hide();\n\t\t$( 'body' ).removeClass( 'modal-open' );\n\t\twp.updates.$elToReturnFocusToFromCredentialsModal.focus();\n\t};\n\n\t/**\n\t * The steps that need to happen when the modal is canceled out\n\t *\n\t * @since 4.2.0\n\t */\n\twp.updates.requestForCredentialsModalCancel = function() {\n\t\t// no updateLock and no updateQueue means we already have cleared things up\n\t\tvar slug, $message;\n\n\t\tif( wp.updates.updateLock === false && wp.updates.updateQueue.length === 0 ){\n\t\t\treturn;\n\t\t}\n\n\t\tslug = wp.updates.updateQueue[0].data.slug,\n\n\t\t// remove the lock, and clear the queue\n\t\twp.updates.updateLock = false;\n\t\twp.updates.updateQueue = [];\n\n\t\twp.updates.requestForCredentialsModalClose();\n\t\tif ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {\n\t\t\t$message = $( '[data-slug=\"' + slug + '\"]' ).next().find( '.update-message' );\n\t\t} else if ( 'plugin-install' === pagenow ) {\n\t\t\t$message = $( '.plugin-card-' + slug ).find( '.update-now' );\n\t\t}\n\n\t\t$message.removeClass( 'updating-message' );\n\t\t$message.html( $message.data( 'originaltext' ) );\n\t\twp.a11y.speak( wp.updates.l10n.updateCancel );\n\t};\n\t/**\n\t * Potentially add an AYS to a user attempting to leave the page\n\t *\n\t * If an update is on-going and a user attempts to leave the page,\n\t * open an \"Are you sure?\" alert.\n\t *\n\t * @since 4.2.0\n\t */\n\n\twp.updates.beforeunload = function() {\n\t\tif ( wp.updates.updateLock ) {\n\t\t\treturn wp.updates.l10n.beforeunload;\n\t\t}\n\t};\n\n\n\t$( document ).ready( function() {\n\t\t/*\n\t\t * Check whether a user needs to submit filesystem credentials based on whether\n\t\t * the form was output on the page server-side.\n\t\t *\n\t\t * @see {wp_print_request_filesystem_credentials_modal() in PHP}\n\t\t */\n\t\twp.updates.shouldRequestFilesystemCredentials = ( $( '#request-filesystem-credentials-dialog' ).length <= 0 ) ? false : true;\n\n\t\t// File system credentials form submit noop-er / handler.\n\t\t$( '#request-filesystem-credentials-dialog form' ).on( 'submit', function() {\n\t\t\t// Persist the credentials input by the user for the duration of the page load.\n\t\t\twp.updates.filesystemCredentials.ftp.hostname = $('#hostname').val();\n\t\t\twp.updates.filesystemCredentials.ftp.username = $('#username').val();\n\t\t\twp.updates.filesystemCredentials.ftp.password = $('#password').val();\n\t\t\twp.updates.filesystemCredentials.ftp.connectionType = $('input[name=\"connection_type\"]:checked').val();\n\t\t\twp.updates.filesystemCredentials.ssh.publicKey = $('#public_key').val();\n\t\t\twp.updates.filesystemCredentials.ssh.privateKey = $('#private_key').val();\n\n\t\t\twp.updates.requestForCredentialsModalClose();\n\n\t\t\t// Unlock and invoke the queue.\n\t\t\twp.updates.updateLock = false;\n\t\t\twp.updates.queueChecker();\n\n\t\t\treturn false;\n\t\t});\n\n\t\t// Close the request credentials modal when\n\t\t$( '#request-filesystem-credentials-dialog [data-js-action=\"close\"], .notification-dialog-background' ).on( 'click', function() {\n\t\t\twp.updates.requestForCredentialsModalCancel();\n\t\t});\n\n\t\t// Hide SSH fields when not selected\n\t\t$( '#request-filesystem-credentials-dialog input[name=\"connection_type\"]' ).on( 'change', function() {\n\t\t\t$( this ).parents( 'form' ).find( '#private_key, #public_key' ).parents( 'label' ).toggle( ( 'ssh' == $( this ).val() ) );\n\t\t}).change();\n\n\t\t// Click handler for plugin updates in List Table view.\n\t\t$( '.plugin-update-tr' ).on( 'click', '.update-link', function( e ) {\n\t\t\te.preventDefault();\n\t\t\tif ( wp.updates.shouldRequestFilesystemCredentials && ! wp.updates.updateLock ) {\n\t\t\t\twp.updates.requestFilesystemCredentials( e );\n\t\t\t}\n\t\t\tvar updateRow = $( e.target ).parents( '.plugin-update-tr' );\n\t\t\t// Return the user to the input box of the plugin's table row after closing the modal.\n\t\t\twp.updates.$elToReturnFocusToFromCredentialsModal = $( '#' + updateRow.data( 'slug' ) ).find( '.check-column input' );\n\t\t\twp.updates.updatePlugin( updateRow.data( 'plugin' ), updateRow.data( 'slug' ) );\n\t\t} );\n\n\t\t$( '.plugin-card' ).on( 'click', '.update-now', function( e ) {\n\t\t\te.preventDefault();\n\t\t\tvar $button = $( e.target );\n\n\t\t\tif ( wp.updates.shouldRequestFilesystemCredentials && ! wp.updates.updateLock ) {\n\t\t\t\twp.updates.requestFilesystemCredentials( e );\n\t\t\t}\n\n\t\t\twp.updates.updatePlugin( $button.data( 'plugin' ), $button.data( 'slug' ) );\n\t\t} );\n\n\t\t$( '#plugin_update_from_iframe' ).on( 'click' , function( e ) {\n\t\t\tvar target,\tdata;\n\n\t\t\ttarget = window.parent == window ? null : window.parent,\n\t\t\t$.support.postMessage = !! window.postMessage;\n\n\t\t\tif ( $.support.postMessage === false || target === null || window.parent.location.pathname.indexOf( 'update-core.php' ) !== -1 )\n\t\t\t\treturn;\n\n\t\t\te.preventDefault();\n\n\t\t\tdata = {\n\t\t\t\t'action' : 'updatePlugin',\n\t\t\t\t'slug'\t : $(this).data('slug')\n\t\t\t};\n\n\t\t\ttarget.postMessage( JSON.stringify( data ), window.location.origin );\n\t\t});\n\n\t} );\n\n\t$( window ).on( 'message', function( e ) {\n\t\tvar event = e.originalEvent,\n\t\t\tmessage,\n\t\t\tloc = document.location,\n\t\t\texpectedOrigin = loc.protocol + '//' + loc.hostname;\n\n\t\tif ( event.origin !== expectedOrigin ) {\n\t\t\treturn;\n\t\t}\n\n\t\tmessage = $.parseJSON( event.data );\n\n\t\tif ( typeof message.action === 'undefined' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (message.action){\n\t\t\tcase 'decrementUpdateCount' :\n\t\t\t\twp.updates.decrementCount( message.upgradeType );\n\t\t\t\tbreak;\n\t\t\tcase 'updatePlugin' :\n\t\t\t\ttb_remove();\n\t\t\t\tif ( 'plugins' === pagenow || 'plugins-network' === pagenow ) {\n\t\t\t\t\t// Return the user to the input box of the plugin's table row after closing the modal.\n\t\t\t\t\t$( '#' + message.slug ).find( '.check-column input' ).focus();\n\t\t\t\t\t// trigger the update\n\t\t\t\t\t$( '.plugin-update-tr[data-slug=\"' + message.slug + '\"]' ).find( '.update-link' ).trigger( 'click' );\n\t\t\t\t} else if ( 'plugin-install' === pagenow ) {\n\t\t\t\t\t$( '.plugin-card-' + message.slug ).find( '.column-name a' ).focus();\n\t\t\t\t\t$( '.plugin-card-' + message.slug ).find( '[data-slug=\"' + message.slug + '\"]' ).trigger( 'click' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t} );\n\n\t$( window ).on( 'beforeunload', wp.updates.beforeunload );\n\n})( jQuery, window.wp, window.pagenow, window.ajaxurl );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/user-profile.js",
    "content": "/* global ajaxurl, pwsL10n, userProfileL10n */\n(function($) {\n\tvar updateLock = false,\n\n\t\t$pass1Row,\n\t\t$pass1Wrap,\n\t\t$pass1,\n\t\t$pass1Text,\n\t\t$pass1Label,\n\t\t$pass2,\n\t\t$weakRow,\n\t\t$weakCheckbox,\n\t\t$toggleButton,\n\t\t$submitButtons,\n\t\t$submitButton,\n\t\tcurrentPass,\n\t\tinputEvent;\n\n\t/*\n\t * Use feature detection to determine whether password inputs should use\n\t * the `keyup` or `input` event. Input is preferred but lacks support\n\t * in legacy browsers.\n\t */\n\tif ( 'oninput' in document.createElement( 'input' ) ) {\n\t\tinputEvent = 'input';\n\t} else {\n\t\tinputEvent = 'keyup';\n\t}\n\n\tfunction generatePassword() {\n\t\tif ( typeof zxcvbn !== 'function' ) {\n\t\t\tsetTimeout( generatePassword, 50 );\n\t\t} else {\n\t\t\t$pass1.val( $pass1.data( 'pw' ) );\n\t\t\t$pass1.trigger( 'pwupdate' ).trigger( 'wp-check-valid-field' );\n\t\t\tif ( 1 !== parseInt( $toggleButton.data( 'start-masked' ), 10 ) ) {\n\t\t\t\t$pass1Wrap.addClass( 'show-password' );\n\t\t\t} else {\n\t\t\t\t$toggleButton.trigger( 'click' );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction bindPass1() {\n\t\tvar passStrength = $('#pass-strength-result')[0];\n\n\t\tcurrentPass = $pass1.val();\n\n\t\t$pass1Wrap = $pass1.parent();\n\n\t\t$pass1Text = $( '<input type=\"text\"/>' )\n\t\t\t.attr( {\n\t\t\t\t'id':           'pass1-text',\n\t\t\t\t'name':         'pass1-text',\n\t\t\t\t'autocomplete': 'off'\n\t\t\t} )\n\t\t\t.addClass( $pass1[0].className )\n\t\t\t.data( 'pw', $pass1.data( 'pw' ) )\n\t\t\t.val( $pass1.val() )\n\t\t\t.on( inputEvent, function () {\n\t\t\t\tif ( $pass1Text.val() === currentPass ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$pass2.val( $pass1Text.val() );\n\t\t\t\t$pass1.val( $pass1Text.val() ).trigger( 'pwupdate' );\n\t\t\t\tcurrentPass = $pass1Text.val();\n\t\t\t} );\n\n\t\t$pass1.after( $pass1Text );\n\n\t\tif ( 1 === parseInt( $pass1.data( 'reveal' ), 10 ) ) {\n\t\t\tgeneratePassword();\n\t\t}\n\n\t\t$pass1.on( inputEvent + ' pwupdate', function () {\n\t\t\tif ( $pass1.val() === currentPass ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentPass = $pass1.val();\n\t\t\tif ( $pass1Text.val() !== currentPass ) {\n\t\t\t\t$pass1Text.val( currentPass );\n\t\t\t}\n\t\t\t$pass1.add( $pass1Text ).removeClass( 'short bad good strong' );\n\n\t\t\tif ( passStrength.className ) {\n\t\t\t\t$pass1.add( $pass1Text ).addClass( passStrength.className );\n\t\t\t\tif ( 'short' === passStrength.className || 'bad' === passStrength.className ) {\n\t\t\t\t\tif ( ! $weakCheckbox.prop( 'checked' ) ) {\n\t\t\t\t\t\t$submitButtons.prop( 'disabled', true );\n\t\t\t\t\t}\n\t\t\t\t\t$weakRow.show();\n\t\t\t\t} else {\n\t\t\t\t\t$submitButtons.prop( 'disabled', false );\n\t\t\t\t\t$weakRow.hide();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction resetToggle() {\n\t\t$toggleButton\n\t\t\t.data( 'toggle', 0 )\n\t\t\t.attr({\n\t\t\t\t'aria-label': userProfileL10n.ariaHide\n\t\t\t})\n\t\t\t.find( '.text' )\n\t\t\t\t.text( userProfileL10n.hide )\n\t\t\t.end()\n\t\t\t.find( '.dashicons' )\n\t\t\t\t.removeClass( 'dashicons-visibility' )\n\t\t\t\t.addClass( 'dashicons-hidden' );\n\n\t\t$pass1Text.focus();\n\n\t\t$pass1Label.attr( 'for', 'pass1-text' );\n\t}\n\n\tfunction bindToggleButton() {\n\t\t$toggleButton = $pass1Row.find('.wp-hide-pw');\n\t\t$toggleButton.show().on( 'click', function () {\n\t\t\tif ( 1 === parseInt( $toggleButton.data( 'toggle' ), 10 ) ) {\n\t\t\t\t$pass1Wrap.addClass( 'show-password' );\n\n\t\t\t\tresetToggle();\n\n\t\t\t\tif ( ! _.isUndefined( $pass1Text[0].setSelectionRange ) ) {\n\t\t\t\t\t$pass1Text[0].setSelectionRange( 0, 100 );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$pass1Wrap.removeClass( 'show-password' );\n\t\t\t\t$toggleButton\n\t\t\t\t\t.data( 'toggle', 1 )\n\t\t\t\t\t.attr({\n\t\t\t\t\t\t'aria-label': userProfileL10n.ariaShow\n\t\t\t\t\t})\n\t\t\t\t\t.find( '.text' )\n\t\t\t\t\t\t.text( userProfileL10n.show )\n\t\t\t\t\t.end()\n\t\t\t\t\t.find( '.dashicons' )\n\t\t\t\t\t\t.removeClass('dashicons-hidden')\n\t\t\t\t\t\t.addClass('dashicons-visibility');\n\n\t\t\t\t$pass1.focus();\n\n\t\t\t\t$pass1Label.attr( 'for', 'pass1' );\n\n\t\t\t\tif ( ! _.isUndefined( $pass1[0].setSelectionRange ) ) {\n\t\t\t\t\t$pass1[0].setSelectionRange( 0, 100 );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction bindPasswordForm() {\n\t\tvar $passwordWrapper,\n\t\t\t$generateButton,\n\t\t\t$cancelButton;\n\n\t\t$pass1Row = $('.user-pass1-wrap');\n\t\t$pass1Label = $pass1Row.find('th label').attr( 'for', 'pass1-text' );\n\n\t\t// hide this\n\t\t$('.user-pass2-wrap').hide();\n\n\t\t$submitButton = $( '#submit' ).on( 'click', function () {\n\t\t\tupdateLock = false;\n\t\t});\n\n\t\t$submitButtons = $submitButton.add( ' #createusersub' );\n\n\t\t$weakRow = $( '.pw-weak' );\n\t\t$weakCheckbox = $weakRow.find( '.pw-checkbox' );\n\t\t$weakCheckbox.change( function() {\n\t\t\t$submitButtons.prop( 'disabled', ! $weakCheckbox.prop( 'checked' ) );\n\t\t} );\n\n\t\t$pass1 = $('#pass1');\n\t\tif ( $pass1.length ) {\n\t\t\tbindPass1();\n\t\t}\n\n\t\t/**\n\t\t * Fix a LastPass mismatch issue, LastPass only changes pass2.\n\t\t *\n\t\t * This fixes the issue by copying any changes from the hidden\n\t\t * pass2 field to the pass1 field, then running check_pass_strength.\n\t\t */\n\t\t$pass2 = $('#pass2').on( inputEvent, function () {\n\t\t\tif ( $pass2.val().length > 0 ) {\n\t\t\t\t$pass1.val( $pass2.val() );\n\t\t\t\t$pass2.val('');\n\t\t\t\tcurrentPass = '';\n\t\t\t\t$pass1.trigger( 'pwupdate' );\n\t\t\t}\n\t\t} );\n\n\t\t// Disable hidden inputs to prevent autofill and submission.\n\t\tif ( $pass1.is( ':hidden' ) ) {\n\t\t\t$pass1.prop( 'disabled', true );\n\t\t\t$pass2.prop( 'disabled', true );\n\t\t\t$pass1Text.prop( 'disabled', true );\n\t\t}\n\n\t\t$passwordWrapper = $pass1Row.find( '.wp-pwd' );\n\t\t$generateButton  = $pass1Row.find( 'button.wp-generate-pw' );\n\n\t\tbindToggleButton();\n\n\t\tif ( $generateButton.length ) {\n\t\t\t$passwordWrapper.hide();\n\t\t}\n\n\t\t$generateButton.show();\n\t\t$generateButton.on( 'click', function () {\n\t\t\tupdateLock = true;\n\n\t\t\t$generateButton.hide();\n\t\t\t$passwordWrapper.show();\n\n\t\t\t// Enable the inputs when showing.\n\t\t\t$pass1.attr( 'disabled', false );\n\t\t\t$pass2.attr( 'disabled', false );\n\t\t\t$pass1Text.attr( 'disabled', false );\n\n\t\t\tif ( $pass1Text.val().length === 0 ) {\n\t\t\t\tgeneratePassword();\n\t\t\t}\n\n\t\t\t_.defer( function() {\n\t\t\t\t$pass1Text.focus();\n\t\t\t\tif ( ! _.isUndefined( $pass1Text[0].setSelectionRange ) ) {\n\t\t\t\t\t$pass1Text[0].setSelectionRange( 0, 100 );\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t} );\n\n\t\t$cancelButton = $pass1Row.find( 'button.wp-cancel-pw' );\n\t\t$cancelButton.on( 'click', function () {\n\t\t\tupdateLock = false;\n\n\t\t\t// Clear any entered password.\n\t\t\t$pass1Text.val( '' );\n\n\t\t\t// Generate a new password.\n\t\t\twp.ajax.post( 'generate-password' )\n\t\t\t\t.done( function( data ) {\n\t\t\t\t\t$pass1.data( 'pw', data );\n\t\t\t\t} );\n\n\t\t\t$generateButton.show();\n\t\t\t$passwordWrapper.hide();\n\n\t\t\t// Disable the inputs when hiding to prevent autofill and submission.\n\t\t\t$pass1.prop( 'disabled', true );\n\t\t\t$pass2.prop( 'disabled', true );\n\t\t\t$pass1Text.prop( 'disabled', true );\n\n\t\t\tresetToggle();\n\n\t\t\t// Clear password field to prevent update\n\t\t\t$pass1.val( '' ).trigger( 'pwupdate' );\n\t\t\t$submitButtons.prop( 'disabled', false );\n\t\t} );\n\n\t\t$pass1Row.closest('form').on( 'submit', function () {\n\t\t\tupdateLock = false;\n\n\t\t\t$pass1.prop( 'disabled', false );\n\t\t\t$pass2.prop( 'disabled', false );\n\t\t\t$pass2.val( $pass1.val() );\n\t\t\t$pass1Wrap.removeClass( 'show-password' );\n\t\t});\n\t}\n\n\tfunction check_pass_strength() {\n\t\tvar pass1 = $('#pass1').val(), strength;\n\n\t\t$('#pass-strength-result').removeClass('short bad good strong');\n\t\tif ( ! pass1 ) {\n\t\t\t$('#pass-strength-result').html( '&nbsp;' );\n\t\t\treturn;\n\t\t}\n\n\t\tstrength = wp.passwordStrength.meter( pass1, wp.passwordStrength.userInputBlacklist(), pass1 );\n\n\t\tswitch ( strength ) {\n\t\t\tcase 2:\n\t\t\t\t$('#pass-strength-result').addClass('bad').html( pwsL10n.bad );\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\t$('#pass-strength-result').addClass('good').html( pwsL10n.good );\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\t$('#pass-strength-result').addClass('strong').html( pwsL10n.strong );\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\t$('#pass-strength-result').addClass('short').html( pwsL10n.mismatch );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$('#pass-strength-result').addClass('short').html( pwsL10n['short'] );\n\t\t}\n\t}\n\n\t$(document).ready( function() {\n\t\tvar $colorpicker, $stylesheet, user_id, current_user_id,\n\t\t\tselect = $( '#display_name' );\n\n\t\t$('#pass1').val('').on( inputEvent + ' pwupdate', check_pass_strength );\n\t\t$('#pass-strength-result').show();\n\t\t$('.color-palette').click( function() {\n\t\t\t$(this).siblings('input[name=\"admin_color\"]').prop('checked', true);\n\t\t});\n\n\t\tif ( select.length ) {\n\t\t\t$('#first_name, #last_name, #nickname').bind( 'blur.user_profile', function() {\n\t\t\t\tvar dub = [],\n\t\t\t\t\tinputs = {\n\t\t\t\t\t\tdisplay_nickname  : $('#nickname').val() || '',\n\t\t\t\t\t\tdisplay_username  : $('#user_login').val() || '',\n\t\t\t\t\t\tdisplay_firstname : $('#first_name').val() || '',\n\t\t\t\t\t\tdisplay_lastname  : $('#last_name').val() || ''\n\t\t\t\t\t};\n\n\t\t\t\tif ( inputs.display_firstname && inputs.display_lastname ) {\n\t\t\t\t\tinputs.display_firstlast = inputs.display_firstname + ' ' + inputs.display_lastname;\n\t\t\t\t\tinputs.display_lastfirst = inputs.display_lastname + ' ' + inputs.display_firstname;\n\t\t\t\t}\n\n\t\t\t\t$.each( $('option', select), function( i, el ){\n\t\t\t\t\tdub.push( el.value );\n\t\t\t\t});\n\n\t\t\t\t$.each(inputs, function( id, value ) {\n\t\t\t\t\tif ( ! value ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar val = value.replace(/<\\/?[a-z][^>]*>/gi, '');\n\n\t\t\t\t\tif ( inputs[id].length && $.inArray( val, dub ) === -1 ) {\n\t\t\t\t\t\tdub.push(val);\n\t\t\t\t\t\t$('<option />', {\n\t\t\t\t\t\t\t'text': val\n\t\t\t\t\t\t}).appendTo( select );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t$colorpicker = $( '#color-picker' );\n\t\t$stylesheet = $( '#colors-css' );\n\t\tuser_id = $( 'input#user_id' ).val();\n\t\tcurrent_user_id = $( 'input[name=\"checkuser_id\"]' ).val();\n\n\t\t$colorpicker.on( 'click.colorpicker', '.color-option', function() {\n\t\t\tvar colors,\n\t\t\t\t$this = $(this);\n\n\t\t\tif ( $this.hasClass( 'selected' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$this.siblings( '.selected' ).removeClass( 'selected' );\n\t\t\t$this.addClass( 'selected' ).find( 'input[type=\"radio\"]' ).prop( 'checked', true );\n\n\t\t\t// Set color scheme\n\t\t\tif ( user_id === current_user_id ) {\n\t\t\t\t// Load the colors stylesheet.\n\t\t\t\t// The default color scheme won't have one, so we'll need to create an element.\n\t\t\t\tif ( 0 === $stylesheet.length ) {\n\t\t\t\t\t$stylesheet = $( '<link rel=\"stylesheet\" />' ).appendTo( 'head' );\n\t\t\t\t}\n\t\t\t\t$stylesheet.attr( 'href', $this.children( '.css_url' ).val() );\n\n\t\t\t\t// repaint icons\n\t\t\t\tif ( typeof wp !== 'undefined' && wp.svgPainter ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcolors = $.parseJSON( $this.children( '.icon_colors' ).val() );\n\t\t\t\t\t} catch ( error ) {}\n\n\t\t\t\t\tif ( colors ) {\n\t\t\t\t\t\twp.svgPainter.setColors( colors );\n\t\t\t\t\t\twp.svgPainter.paint();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// update user option\n\t\t\t\t$.post( ajaxurl, {\n\t\t\t\t\taction:       'save-user-color-scheme',\n\t\t\t\t\tcolor_scheme: $this.children( 'input[name=\"admin_color\"]' ).val(),\n\t\t\t\t\tnonce:        $('#color-nonce').val()\n\t\t\t\t}).done( function( response ) {\n\t\t\t\t\tif ( response.success ) {\n\t\t\t\t\t\t$( 'body' ).removeClass( response.data.previousScheme ).addClass( response.data.currentScheme );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tbindPasswordForm();\n\t});\n\n\t$( '#destroy-sessions' ).on( 'click', function( e ) {\n\t\tvar $this = $(this);\n\n\t\twp.ajax.post( 'destroy-sessions', {\n\t\t\tnonce: $( '#_wpnonce' ).val(),\n\t\t\tuser_id: $( '#user_id' ).val()\n\t\t}).done( function( response ) {\n\t\t\t$this.prop( 'disabled', true );\n\t\t\t$this.siblings( '.notice' ).remove();\n\t\t\t$this.before( '<div class=\"notice notice-success inline\"><p>' + response.message + '</p></div>' );\n\t\t}).fail( function( response ) {\n\t\t\t$this.siblings( '.notice' ).remove();\n\t\t\t$this.before( '<div class=\"notice notice-error inline\"><p>' + response.message + '</p></div>' );\n\t\t});\n\n\t\te.preventDefault();\n\t});\n\n\twindow.generatePassword = generatePassword;\n\n\t/* Warn the user if password was generated but not saved */\n\t$( window ).on( 'beforeunload', function () {\n\t\tif ( true === updateLock ) {\n\t\t\treturn userProfileL10n.warn;\n\t\t}\n\t} );\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/user-suggest.js",
    "content": "/* global ajaxurl, current_site_id, isRtl */\n\n(function( $ ) {\n\tvar id = ( typeof current_site_id !== 'undefined' ) ? '&site_id=' + current_site_id : '';\n\t$(document).ready( function() {\n\t\tvar position = { offset: '0, -1' };\n\t\tif ( typeof isRtl !== 'undefined' && isRtl ) {\n\t\t\tposition.my = 'right top';\n\t\t\tposition.at = 'right bottom';\n\t\t}\n\t\t$( '.wp-suggest-user' ).each( function(){\n\t\t\tvar $this = $( this ),\n\t\t\t\tautocompleteType = ( typeof $this.data( 'autocompleteType' ) !== 'undefined' ) ? $this.data( 'autocompleteType' ) : 'add',\n\t\t\t\tautocompleteField = ( typeof $this.data( 'autocompleteField' ) !== 'undefined' ) ? $this.data( 'autocompleteField' ) : 'user_login';\n\n\t\t\t$this.autocomplete({\n\t\t\t\tsource:    ajaxurl + '?action=autocomplete-user&autocomplete_type=' + autocompleteType + '&autocomplete_field=' + autocompleteField + id,\n\t\t\t\tdelay:     500,\n\t\t\t\tminLength: 2,\n\t\t\t\tposition:  position,\n\t\t\t\topen: function() {\n\t\t\t\t\t$( this ).addClass( 'open' );\n\t\t\t\t},\n\t\t\t\tclose: function() {\n\t\t\t\t\t$( this ).removeClass( 'open' );\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n})( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/widgets.js",
    "content": "/*global ajaxurl, isRtl */\nvar wpWidgets;\n(function($) {\n\tvar $document = $( document );\n\nwpWidgets = {\n\t/**\n\t * A closed Sidebar that gets a Widget dragged over it.\n\t *\n\t * @var element|null\n\t */\n\thoveredSidebar: null,\n\n\tinit : function() {\n\t\tvar rem, the_id,\n\t\t\tself = this,\n\t\t\tchooser = $('.widgets-chooser'),\n\t\t\tselectSidebar = chooser.find('.widgets-chooser-sidebars'),\n\t\t\tsidebars = $('div.widgets-sortables'),\n\t\t\tisRTL = !! ( 'undefined' !== typeof isRtl && isRtl );\n\n\t\t$('#widgets-right .sidebar-name').click( function() {\n\t\t\tvar $this = $(this),\n\t\t\t\t$wrap = $this.closest('.widgets-holder-wrap');\n\n\t\t\tif ( $wrap.hasClass('closed') ) {\n\t\t\t\t$wrap.removeClass('closed');\n\t\t\t\t$this.parent().sortable('refresh');\n\t\t\t} else {\n\t\t\t\t$wrap.addClass('closed');\n\t\t\t}\n\n\t\t\t$document.triggerHandler( 'wp-pin-menu' );\n\t\t});\n\n\t\t$('#widgets-left .sidebar-name').click( function() {\n\t\t\t$(this).closest('.widgets-holder-wrap').toggleClass('closed');\n\t\t\t$document.triggerHandler( 'wp-pin-menu' );\n\t\t});\n\n\t\t$(document.body).bind('click.widgets-toggle', function(e) {\n\t\t\tvar target = $(e.target),\n\t\t\t\tcss = { 'z-index': 100 },\n\t\t\t\twidget, inside, targetWidth, widgetWidth, margin;\n\n\t\t\tif ( target.parents('.widget-top').length && ! target.parents('#available-widgets').length ) {\n\t\t\t\twidget = target.closest('div.widget');\n\t\t\t\tinside = widget.children('.widget-inside');\n\t\t\t\ttargetWidth = parseInt( widget.find('input.widget-width').val(), 10 ),\n\t\t\t\twidgetWidth = widget.parent().width();\n\n\t\t\t\tif ( inside.is(':hidden') ) {\n\t\t\t\t\tif ( targetWidth > 250 && ( targetWidth + 30 > widgetWidth ) && widget.closest('div.widgets-sortables').length ) {\n\t\t\t\t\t\tif ( widget.closest('div.widget-liquid-right').length ) {\n\t\t\t\t\t\t\tmargin = isRTL ? 'margin-right' : 'margin-left';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmargin = isRTL ? 'margin-left' : 'margin-right';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcss[ margin ] = widgetWidth - ( targetWidth + 30 ) + 'px';\n\t\t\t\t\t\twidget.css( css );\n\t\t\t\t\t}\n\t\t\t\t\twidget.addClass( 'open' );\n\t\t\t\t\tinside.slideDown('fast');\n\t\t\t\t} else {\n\t\t\t\t\tinside.slideUp('fast', function() {\n\t\t\t\t\t\twidget.attr( 'style', '' );\n\t\t\t\t\t\twidget.removeClass( 'open' );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t} else if ( target.hasClass('widget-control-save') ) {\n\t\t\t\twpWidgets.save( target.closest('div.widget'), 0, 1, 0 );\n\t\t\t\te.preventDefault();\n\t\t\t} else if ( target.hasClass('widget-control-remove') ) {\n\t\t\t\twpWidgets.save( target.closest('div.widget'), 1, 1, 0 );\n\t\t\t\te.preventDefault();\n\t\t\t} else if ( target.hasClass('widget-control-close') ) {\n\t\t\t\twidget = target.closest('div.widget');\n\t\t\t\twidget.removeClass( 'open' );\n\t\t\t\twpWidgets.close( widget );\n\t\t\t\te.preventDefault();\n\t\t\t} else if ( target.attr( 'id' ) === 'inactive-widgets-control-remove' ) {\n\t\t\t\twpWidgets.removeInactiveWidgets();\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t});\n\n\t\tsidebars.children('.widget').each( function() {\n\t\t\tvar $this = $(this);\n\n\t\t\twpWidgets.appendTitle( this );\n\n\t\t\tif ( $this.find( 'p.widget-error' ).length ) {\n\t\t\t\t$this.find( 'a.widget-action' ).trigger('click');\n\t\t\t}\n\t\t});\n\n\t\t$('#widget-list').children('.widget').draggable({\n\t\t\tconnectToSortable: 'div.widgets-sortables',\n\t\t\thandle: '> .widget-top > .widget-title',\n\t\t\tdistance: 2,\n\t\t\thelper: 'clone',\n\t\t\tzIndex: 100,\n\t\t\tcontainment: '#wpwrap',\n\t\t\trefreshPositions: true,\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tvar chooser = $(this).find('.widgets-chooser');\n\n\t\t\t\tui.helper.find('div.widget-description').hide();\n\t\t\t\tthe_id = this.id;\n\n\t\t\t\tif ( chooser.length ) {\n\t\t\t\t\t// Hide the chooser and move it out of the widget\n\t\t\t\t\t$( '#wpbody-content' ).append( chooser.hide() );\n\t\t\t\t\t// Delete the cloned chooser from the drag helper\n\t\t\t\t\tui.helper.find('.widgets-chooser').remove();\n\t\t\t\t\tself.clearWidgetSelection();\n\t\t\t\t}\n\t\t\t},\n\t\t\tstop: function() {\n\t\t\t\tif ( rem ) {\n\t\t\t\t\t$(rem).hide();\n\t\t\t\t}\n\n\t\t\t\trem = '';\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Opens and closes previously closed Sidebars when Widgets are dragged over/out of them.\n\t\t */\n\t\tsidebars.droppable( {\n\t\t\ttolerance: 'intersect',\n\n\t\t\t/**\n\t\t\t * Open Sidebar when a Widget gets dragged over it.\n\t\t\t *\n\t\t\t * @param event\n\t\t\t */\n\t\t\tover: function( event ) {\n\t\t\t\tvar $wrap = $( event.target ).parent();\n\n\t\t\t\tif ( wpWidgets.hoveredSidebar && ! $wrap.is( wpWidgets.hoveredSidebar ) ) {\n\t\t\t\t\t// Close the previous Sidebar as the Widget has been dragged onto another Sidebar.\n\t\t\t\t\twpWidgets.closeSidebar( event );\n\t\t\t\t}\n\n\t\t\t\tif ( $wrap.hasClass( 'closed' ) ) {\n\t\t\t\t\twpWidgets.hoveredSidebar = $wrap;\n\t\t\t\t\t$wrap.removeClass( 'closed' );\n\t\t\t\t}\n\n\t\t\t\t$( this ).sortable( 'refresh' );\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Close Sidebar when the Widget gets dragged out of it.\n\t\t\t *\n\t\t\t * @param event\n\t\t\t */\n\t\t\tout: function( event ) {\n\t\t\t\tif ( wpWidgets.hoveredSidebar ) {\n\t\t\t\t\twpWidgets.closeSidebar( event );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tsidebars.sortable({\n\t\t\tplaceholder: 'widget-placeholder',\n\t\t\titems: '> .widget',\n\t\t\thandle: '> .widget-top > .widget-title',\n\t\t\tcursor: 'move',\n\t\t\tdistance: 2,\n\t\t\tcontainment: '#wpwrap',\n\t\t\ttolerance: 'pointer',\n\t\t\trefreshPositions: true,\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tvar height, $this = $(this),\n\t\t\t\t\t$wrap = $this.parent(),\n\t\t\t\t\tinside = ui.item.children('.widget-inside');\n\n\t\t\t\tif ( inside.css('display') === 'block' ) {\n\t\t\t\t\tui.item.removeClass('open');\n\t\t\t\t\tinside.hide();\n\t\t\t\t\t$(this).sortable('refreshPositions');\n\t\t\t\t}\n\n\t\t\t\tif ( ! $wrap.hasClass('closed') ) {\n\t\t\t\t\t// Lock all open sidebars min-height when starting to drag.\n\t\t\t\t\t// Prevents jumping when dragging a widget from an open sidebar to a closed sidebar below.\n\t\t\t\t\theight = ui.item.hasClass('ui-draggable') ? $this.height() : 1 + $this.height();\n\t\t\t\t\t$this.css( 'min-height', height + 'px' );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstop: function( event, ui ) {\n\t\t\t\tvar addNew, widgetNumber, $sidebar, $children, child, item,\n\t\t\t\t\t$widget = ui.item,\n\t\t\t\t\tid = the_id;\n\n\t\t\t\t// Reset the var to hold a previously closed sidebar.\n\t\t\t\twpWidgets.hoveredSidebar = null;\n\n\t\t\t\tif ( $widget.hasClass('deleting') ) {\n\t\t\t\t\twpWidgets.save( $widget, 1, 0, 1 ); // delete widget\n\t\t\t\t\t$widget.remove();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taddNew = $widget.find('input.add_new').val();\n\t\t\t\twidgetNumber = $widget.find('input.multi_number').val();\n\n\t\t\t\t$widget.attr( 'style', '' ).removeClass('ui-draggable');\n\t\t\t\tthe_id = '';\n\n\t\t\t\tif ( addNew ) {\n\t\t\t\t\tif ( 'multi' === addNew ) {\n\t\t\t\t\t\t$widget.html(\n\t\t\t\t\t\t\t$widget.html().replace( /<[^<>]+>/g, function( tag ) {\n\t\t\t\t\t\t\t\treturn tag.replace( /__i__|%i%/g, widgetNumber );\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t$widget.attr( 'id', id.replace( '__i__', widgetNumber ) );\n\t\t\t\t\t\twidgetNumber++;\n\n\t\t\t\t\t\t$( 'div#' + id ).find( 'input.multi_number' ).val( widgetNumber );\n\t\t\t\t\t} else if ( 'single' === addNew ) {\n\t\t\t\t\t\t$widget.attr( 'id', 'new-' + id );\n\t\t\t\t\t\trem = 'div#' + id;\n\t\t\t\t\t}\n\n\t\t\t\t\twpWidgets.save( $widget, 0, 0, 1 );\n\t\t\t\t\t$widget.find('input.add_new').val('');\n\t\t\t\t\t$document.trigger( 'widget-added', [ $widget ] );\n\t\t\t\t}\n\n\t\t\t\t$sidebar = $widget.parent();\n\n\t\t\t\tif ( $sidebar.parent().hasClass('closed') ) {\n\t\t\t\t\t$sidebar.parent().removeClass('closed');\n\t\t\t\t\t$children = $sidebar.children('.widget');\n\n\t\t\t\t\t// Make sure the dropped widget is at the top\n\t\t\t\t\tif ( $children.length > 1 ) {\n\t\t\t\t\t\tchild = $children.get(0);\n\t\t\t\t\t\titem = $widget.get(0);\n\n\t\t\t\t\t\tif ( child.id && item.id && child.id !== item.id ) {\n\t\t\t\t\t\t\t$( child ).before( $widget );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( addNew ) {\n\t\t\t\t\t$widget.find( 'a.widget-action' ).trigger('click');\n\t\t\t\t} else {\n\t\t\t\t\twpWidgets.saveOrder( $sidebar.attr('id') );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tactivate: function() {\n\t\t\t\t$(this).parent().addClass( 'widget-hover' );\n\t\t\t},\n\n\t\t\tdeactivate: function() {\n\t\t\t\t// Remove all min-height added on \"start\"\n\t\t\t\t$(this).css( 'min-height', '' ).parent().removeClass( 'widget-hover' );\n\t\t\t},\n\n\t\t\treceive: function( event, ui ) {\n\t\t\t\tvar $sender = $( ui.sender );\n\n\t\t\t\t// Don't add more widgets to orphaned sidebars\n\t\t\t\tif ( this.id.indexOf('orphaned_widgets') > -1 ) {\n\t\t\t\t\t$sender.sortable('cancel');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If the last widget was moved out of an orphaned sidebar, close and remove it.\n\t\t\t\tif ( $sender.attr('id').indexOf('orphaned_widgets') > -1 && ! $sender.children('.widget').length ) {\n\t\t\t\t\t$sender.parents('.orphan-sidebar').slideUp( 400, function(){ $(this).remove(); } );\n\t\t\t\t}\n\t\t\t}\n\t\t}).sortable( 'option', 'connectWith', 'div.widgets-sortables' );\n\n\t\t$('#available-widgets').droppable({\n\t\t\ttolerance: 'pointer',\n\t\t\taccept: function(o){\n\t\t\t\treturn $(o).parent().attr('id') !== 'widget-list';\n\t\t\t},\n\t\t\tdrop: function(e,ui) {\n\t\t\t\tui.draggable.addClass('deleting');\n\t\t\t\t$('#removing-widget').hide().children('span').empty();\n\t\t\t},\n\t\t\tover: function(e,ui) {\n\t\t\t\tui.draggable.addClass('deleting');\n\t\t\t\t$('div.widget-placeholder').hide();\n\n\t\t\t\tif ( ui.draggable.hasClass('ui-sortable-helper') ) {\n\t\t\t\t\t$('#removing-widget').show().children('span')\n\t\t\t\t\t.html( ui.draggable.find( 'div.widget-title' ).children( 'h3' ).html() );\n\t\t\t\t}\n\t\t\t},\n\t\t\tout: function(e,ui) {\n\t\t\t\tui.draggable.removeClass('deleting');\n\t\t\t\t$('div.widget-placeholder').show();\n\t\t\t\t$('#removing-widget').hide().children('span').empty();\n\t\t\t}\n\t\t});\n\n\t\t// Area Chooser\n\t\t$( '#widgets-right .widgets-holder-wrap' ).each( function( index, element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\tname = $element.find( '.sidebar-name h2' ).text(),\n\t\t\t\tid = $element.find( '.widgets-sortables' ).attr( 'id' ),\n\t\t\t\tli = $('<li tabindex=\"0\">').text( $.trim( name ) );\n\n\t\t\tif ( index === 0 ) {\n\t\t\t\tli.addClass( 'widgets-chooser-selected' );\n\t\t\t}\n\n\t\t\tselectSidebar.append( li );\n\t\t\tli.data( 'sidebarId', id );\n\t\t});\n\n\t\t$( '#available-widgets .widget .widget-title' ).on( 'click.widgets-chooser', function() {\n\t\t\tvar $widget = $(this).closest( '.widget' );\n\n\t\t\tif ( $widget.hasClass( 'widget-in-question' ) || $( '#widgets-left' ).hasClass( 'chooser' ) ) {\n\t\t\t\tself.closeChooser();\n\t\t\t} else {\n\t\t\t\t// Open the chooser\n\t\t\t\tself.clearWidgetSelection();\n\t\t\t\t$( '#widgets-left' ).addClass( 'chooser' );\n\t\t\t\t$widget.addClass( 'widget-in-question' ).children( '.widget-description' ).after( chooser );\n\n\t\t\t\tchooser.slideDown( 300, function() {\n\t\t\t\t\tselectSidebar.find('.widgets-chooser-selected').focus();\n\t\t\t\t});\n\n\t\t\t\tselectSidebar.find( 'li' ).on( 'focusin.widgets-chooser', function() {\n\t\t\t\t\tselectSidebar.find('.widgets-chooser-selected').removeClass( 'widgets-chooser-selected' );\n\t\t\t\t\t$(this).addClass( 'widgets-chooser-selected' );\n\t\t\t\t} );\n\t\t\t}\n\t\t});\n\n\t\t// Add event handlers\n\t\tchooser.on( 'click.widgets-chooser', function( event ) {\n\t\t\tvar $target = $( event.target );\n\n\t\t\tif ( $target.hasClass('button-primary') ) {\n\t\t\t\tself.addWidget( chooser );\n\t\t\t\tself.closeChooser();\n\t\t\t} else if ( $target.hasClass('button-secondary') ) {\n\t\t\t\tself.closeChooser();\n\t\t\t}\n\t\t}).on( 'keyup.widgets-chooser', function( event ) {\n\t\t\tif ( event.which === $.ui.keyCode.ENTER ) {\n\t\t\t\tif ( $( event.target ).hasClass('button-secondary') ) {\n\t\t\t\t\t// Close instead of adding when pressing Enter on the Cancel button\n\t\t\t\t\tself.closeChooser();\n\t\t\t\t} else {\n\t\t\t\t\tself.addWidget( chooser );\n\t\t\t\t\tself.closeChooser();\n\t\t\t\t}\n\t\t\t} else if ( event.which === $.ui.keyCode.ESCAPE ) {\n\t\t\t\tself.closeChooser();\n\t\t\t}\n\t\t});\n\t},\n\n\tsaveOrder : function( sidebarId ) {\n\t\tvar data = {\n\t\t\taction: 'widgets-order',\n\t\t\tsavewidgets: $('#_wpnonce_widgets').val(),\n\t\t\tsidebars: []\n\t\t};\n\n\t\tif ( sidebarId ) {\n\t\t\t$( '#' + sidebarId ).find( '.spinner:first' ).addClass( 'is-active' );\n\t\t}\n\n\t\t$('div.widgets-sortables').each( function() {\n\t\t\tif ( $(this).sortable ) {\n\t\t\t\tdata['sidebars[' + $(this).attr('id') + ']'] = $(this).sortable('toArray').join(',');\n\t\t\t}\n\t\t});\n\n\t\t$.post( ajaxurl, data, function() {\n\t\t\t$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );\n\t\t\t$( '.spinner' ).removeClass( 'is-active' );\n\t\t});\n\t},\n\n\tsave : function( widget, del, animate, order ) {\n\t\tvar sidebarId = widget.closest('div.widgets-sortables').attr('id'),\n\t\t\tdata = widget.find('form').serialize(), a;\n\n\t\twidget = $(widget);\n\t\t$( '.spinner', widget ).addClass( 'is-active' );\n\n\t\ta = {\n\t\t\taction: 'save-widget',\n\t\t\tsavewidgets: $('#_wpnonce_widgets').val(),\n\t\t\tsidebar: sidebarId\n\t\t};\n\n\t\tif ( del ) {\n\t\t\ta.delete_widget = 1;\n\t\t}\n\n\t\tdata += '&' + $.param(a);\n\n\t\t$.post( ajaxurl, data, function(r) {\n\t\t\tvar id;\n\n\t\t\tif ( del ) {\n\t\t\t\tif ( ! $('input.widget_number', widget).val() ) {\n\t\t\t\t\tid = $('input.widget-id', widget).val();\n\t\t\t\t\t$('#available-widgets').find('input.widget-id').each(function(){\n\t\t\t\t\t\tif ( $(this).val() === id ) {\n\t\t\t\t\t\t\t$(this).closest('div.widget').show();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ( animate ) {\n\t\t\t\t\torder = 0;\n\t\t\t\t\twidget.slideUp('fast', function(){\n\t\t\t\t\t\t$(this).remove();\n\t\t\t\t\t\twpWidgets.saveOrder();\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidget.remove();\n\n\t\t\t\t\tif ( sidebarId === 'wp_inactive_widgets' ) {\n\t\t\t\t\t\t$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$( '.spinner' ).removeClass( 'is-active' );\n\t\t\t\tif ( r && r.length > 2 ) {\n\t\t\t\t\t$( 'div.widget-content', widget ).html( r );\n\t\t\t\t\twpWidgets.appendTitle( widget );\n\t\t\t\t\t$document.trigger( 'widget-updated', [ widget ] );\n\n\t\t\t\t\tif ( sidebarId === 'wp_inactive_widgets' ) {\n\t\t\t\t\t\t$( '#inactive-widgets-control-remove' ).prop( 'disabled' , ! $( '#wp_inactive_widgets .widget' ).length );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( order ) {\n\t\t\t\twpWidgets.saveOrder();\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveInactiveWidgets : function() {\n\t\tvar $element = $( '.remove-inactive-widgets' ), a, data;\n\n\t\t$( '.spinner', $element ).addClass( 'is-active' );\n\n\t\ta = {\n\t\t\taction : 'delete-inactive-widgets',\n\t\t\tremoveinactivewidgets : $( '#_wpnonce_remove_inactive_widgets' ).val()\n\t\t};\n\n\t\tdata = $.param( a );\n\n\t\t$.post( ajaxurl, data, function() {\n\t\t\t$( '#wp_inactive_widgets .widget' ).remove();\n\t\t\t$( '#inactive-widgets-control-remove' ).prop( 'disabled' , true );\n\t\t\t$( '.spinner', $element ).removeClass( 'is-active' );\n\t\t} );\n\t},\n\n\tappendTitle : function(widget) {\n\t\tvar title = $('input[id*=\"-title\"]', widget).val() || '';\n\n\t\tif ( title ) {\n\t\t\ttitle = ': ' + title.replace(/<[^<>]+>/g, '').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\t\t}\n\n\t\t$(widget).children('.widget-top').children('.widget-title').children()\n\t\t\t\t.children('.in-widget-title').html(title);\n\n\t},\n\n\tclose : function(widget) {\n\t\twidget.children('.widget-inside').slideUp('fast', function() {\n\t\t\twidget.attr( 'style', '' );\n\t\t});\n\t},\n\n\taddWidget: function( chooser ) {\n\t\tvar widget, widgetId, add, n, viewportTop, viewportBottom, sidebarBounds,\n\t\t\tsidebarId = chooser.find( '.widgets-chooser-selected' ).data('sidebarId'),\n\t\t\tsidebar = $( '#' + sidebarId );\n\n\t\twidget = $('#available-widgets').find('.widget-in-question').clone();\n\t\twidgetId = widget.attr('id');\n\t\tadd = widget.find( 'input.add_new' ).val();\n\t\tn = widget.find( 'input.multi_number' ).val();\n\n\t\t// Remove the cloned chooser from the widget\n\t\twidget.find('.widgets-chooser').remove();\n\n\t\tif ( 'multi' === add ) {\n\t\t\twidget.html(\n\t\t\t\twidget.html().replace( /<[^<>]+>/g, function(m) {\n\t\t\t\t\treturn m.replace( /__i__|%i%/g, n );\n\t\t\t\t})\n\t\t\t);\n\n\t\t\twidget.attr( 'id', widgetId.replace( '__i__', n ) );\n\t\t\tn++;\n\t\t\t$( '#' + widgetId ).find('input.multi_number').val(n);\n\t\t} else if ( 'single' === add ) {\n\t\t\twidget.attr( 'id', 'new-' + widgetId );\n\t\t\t$( '#' + widgetId ).hide();\n\t\t}\n\n\t\t// Open the widgets container\n\t\tsidebar.closest( '.widgets-holder-wrap' ).removeClass('closed');\n\n\t\tsidebar.append( widget );\n\t\tsidebar.sortable('refresh');\n\n\t\twpWidgets.save( widget, 0, 0, 1 );\n\t\t// No longer \"new\" widget\n\t\twidget.find( 'input.add_new' ).val('');\n\n\t\t$document.trigger( 'widget-added', [ widget ] );\n\n\t\t/*\n\t\t * Check if any part of the sidebar is visible in the viewport. If it is, don't scroll.\n\t\t * Otherwise, scroll up to so the sidebar is in view.\n\t\t *\n\t\t * We do this by comparing the top and bottom, of the sidebar so see if they are within\n\t\t * the bounds of the viewport.\n\t\t */\n\t\tviewportTop = $(window).scrollTop();\n\t\tviewportBottom = viewportTop + $(window).height();\n\t\tsidebarBounds = sidebar.offset();\n\n\t\tsidebarBounds.bottom = sidebarBounds.top + sidebar.outerHeight();\n\n\t\tif ( viewportTop > sidebarBounds.bottom || viewportBottom < sidebarBounds.top ) {\n\t\t\t$( 'html, body' ).animate({\n\t\t\t\tscrollTop: sidebarBounds.top - 130\n\t\t\t}, 200 );\n\t\t}\n\n\t\twindow.setTimeout( function() {\n\t\t\t// Cannot use a callback in the animation above as it fires twice,\n\t\t\t// have to queue this \"by hand\".\n\t\t\twidget.find( '.widget-title' ).trigger('click');\n\t\t}, 250 );\n\t},\n\n\tcloseChooser: function() {\n\t\tvar self = this;\n\n\t\t$( '.widgets-chooser' ).slideUp( 200, function() {\n\t\t\t$( '#wpbody-content' ).append( this );\n\t\t\tself.clearWidgetSelection();\n\t\t});\n\t},\n\n\tclearWidgetSelection: function() {\n\t\t$( '#widgets-left' ).removeClass( 'chooser' );\n\t\t$( '.widget-in-question' ).removeClass( 'widget-in-question' );\n\t},\n\n\t/**\n\t * Closes a Sidebar that was previously closed, but opened by dragging a Widget over it.\n\t *\n\t * Used when a Widget gets dragged in/out of the Sidebar and never dropped.\n\t *\n\t * @param sidebar\n\t */\n\tcloseSidebar: function( sidebar ) {\n\t\tthis.hoveredSidebar.addClass( 'closed' );\n\t\t$( sidebar.target ).css( 'min-height', '' );\n\t\tthis.hoveredSidebar = null;\n\t}\n};\n\n$document.ready( function(){ wpWidgets.init(); } );\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/word-count.js",
    "content": "( function() {\n\tfunction WordCounter( settings ) {\n\t\tvar key,\n\t\t\tshortcodes;\n\n\t\tif ( settings ) {\n\t\t\tfor ( key in settings ) {\n\t\t\t\tif ( settings.hasOwnProperty( key ) ) {\n\t\t\t\t\tthis.settings[ key ] = settings[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tshortcodes = this.settings.l10n.shortcodes;\n\n\t\tif ( shortcodes && shortcodes.length ) {\n\t\t\tthis.settings.shortcodesRegExp = new RegExp( '\\\\[\\\\/?(?:' + shortcodes.join( '|' ) + ')[^\\\\]]*?\\\\]', 'g' );\n\t\t}\n\t}\n\n\tWordCounter.prototype.settings = {\n\t\tHTMLRegExp: /<\\/?[a-z][^>]*?>/gi,\n\t\tHTMLcommentRegExp: /<!--[\\s\\S]*?-->/g,\n\t\tspaceRegExp: /&nbsp;|&#160;/gi,\n\t\tHTMLEntityRegExp: /&\\S+?;/g,\n\t\tconnectorRegExp: /--|\\u2014/g,\n\t\tremoveRegExp: new RegExp( [\n\t\t\t'[',\n\t\t\t\t// Basic Latin (extract)\n\t\t\t\t'\\u0021-\\u0040\\u005B-\\u0060\\u007B-\\u007E',\n\t\t\t\t// Latin-1 Supplement (extract)\n\t\t\t\t'\\u0080-\\u00BF\\u00D7\\u00F7',\n\t\t\t\t// General Punctuation\n\t\t\t\t// Superscripts and Subscripts\n\t\t\t\t// Currency Symbols\n\t\t\t\t// Combining Diacritical Marks for Symbols\n\t\t\t\t// Letterlike Symbols\n\t\t\t\t// Number Forms\n\t\t\t\t// Arrows\n\t\t\t\t// Mathematical Operators\n\t\t\t\t// Miscellaneous Technical\n\t\t\t\t// Control Pictures\n\t\t\t\t// Optical Character Recognition\n\t\t\t\t// Enclosed Alphanumerics\n\t\t\t\t// Box Drawing\n\t\t\t\t// Block Elements\n\t\t\t\t// Geometric Shapes\n\t\t\t\t// Miscellaneous Symbols\n\t\t\t\t// Dingbats\n\t\t\t\t// Miscellaneous Mathematical Symbols-A\n\t\t\t\t// Supplemental Arrows-A\n\t\t\t\t// Braille Patterns\n\t\t\t\t// Supplemental Arrows-B\n\t\t\t\t// Miscellaneous Mathematical Symbols-B\n\t\t\t\t// Supplemental Mathematical Operators\n\t\t\t\t// Miscellaneous Symbols and Arrows\n\t\t\t\t'\\u2000-\\u2BFF',\n\t\t\t\t// Supplemental Punctuation\n\t\t\t\t'\\u2E00-\\u2E7F',\n\t\t\t']'\n\t\t].join( '' ), 'g' ),\n\t\tastralRegExp: /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g,\n\t\twordsRegExp: /\\S\\s+/g,\n\t\tcharacters_excluding_spacesRegExp: /\\S/g,\n\t\tcharacters_including_spacesRegExp: /[^\\f\\n\\r\\t\\v\\u00AD\\u2028\\u2029]/g,\n\t\tl10n: window.wordCountL10n || {}\n\t};\n\n\tWordCounter.prototype.count = function( text, type ) {\n\t\tvar count = 0;\n\n\t\ttype = type || this.settings.l10n.type;\n\n\t\tif ( type !== 'characters_excluding_spaces' && type !== 'characters_including_spaces' ) {\n\t\t\ttype = 'words';\n\t\t}\n\n\t\tif ( text ) {\n\t\t\ttext = text + '\\n';\n\n\t\t\ttext = text.replace( this.settings.HTMLRegExp, '\\n' );\n\t\t\ttext = text.replace( this.settings.HTMLcommentRegExp, '' );\n\n\t\t\tif ( this.settings.shortcodesRegExp ) {\n\t\t\t\ttext = text.replace( this.settings.shortcodesRegExp, '\\n' );\n\t\t\t}\n\n\t\t\ttext = text.replace( this.settings.spaceRegExp, ' ' );\n\n\t\t\tif ( type === 'words' ) {\n\t\t\t\ttext = text.replace( this.settings.HTMLEntityRegExp, '' );\n\t\t\t\ttext = text.replace( this.settings.connectorRegExp, ' ' );\n\t\t\t\ttext = text.replace( this.settings.removeRegExp, '' );\n\t\t\t} else {\n\t\t\t\ttext = text.replace( this.settings.HTMLEntityRegExp, 'a' );\n\t\t\t\ttext = text.replace( this.settings.astralRegExp, 'a' );\n\t\t\t}\n\n\t\t\ttext = text.match( this.settings[ type + 'RegExp' ] );\n\n\t\t\tif ( text ) {\n\t\t\t\tcount = text.length;\n\t\t\t}\n\t\t}\n\n\t\treturn count;\n\t};\n\n\twindow.wp = window.wp || {};\n\twindow.wp.utils = window.wp.utils || {};\n\twindow.wp.utils.WordCounter = WordCounter;\n} )();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/wp-fullscreen-stub.js",
    "content": "/**\n * Distraction-Free Writing (wp-fullscreen) backwards compatibility stub.\n * Todo: remove at the end of 2016.\n *\n * Original was deprecated in 4.1, removed in 4.3.\n */\n( function() {\n\tvar noop = function(){};\n\n\twindow.wp = window.wp || {};\n\twindow.wp.editor = window.wp.editor || {};\n\twindow.wp.editor.fullscreen = {\n\t\tbind_resize: noop,\n\t\tdfwWidth: noop,\n\t\toff: noop,\n\t\ton: noop,\n\t\trefreshButtons: noop,\n\t\tresizeTextarea: noop,\n\t\tsave: noop,\n\t\tswitchmode: noop,\n\t\ttoggleUI: noop,\n\n\t\tsettings: {},\n\t\tpubsub: {\n\t\t\tpublish: noop,\n\t\t\tsubscribe: noop,\n\t\t\tunsubscribe: noop,\n\t\t\ttopics: {}\n\t\t},\n\t\tfade: {\n\t\t\tIn: noop,\n\t\t\tOut: noop\n\t\t},\n\t\tui: {\n\t\t\tfade: noop,\n\t\t\tinit: noop\n\t\t}\n\t};\n}());\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/js/xfn.js",
    "content": "jQuery( document ).ready(function( $ ) {\n\t$( '#link_rel' ).prop( 'readonly', true );\n\t$( '#linkxfndiv input' ).bind( 'click keyup', function() {\n\t\tvar isMe = $( '#me' ).is( ':checked' ), inputs = '';\n\t\t$( 'input.valinp' ).each( function() {\n\t\t\tif ( isMe ) {\n\t\t\t\t$( this ).prop( 'disabled', true ).parent().addClass( 'disabled' );\n\t\t\t} else {\n\t\t\t\t$( this ).removeAttr( 'disabled' ).parent().removeClass( 'disabled' );\n\t\t\t\tif ( $( this ).is( ':checked' ) && $( this ).val() !== '') {\n\t\t\t\t\tinputs += $( this ).val() + ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t$( '#link_rel' ).val( ( isMe ) ? 'me' : inputs.substr( 0,inputs.length - 1 ) );\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/link-add.php",
    "content": "<?php\n/**\n * Add Link Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can('manage_links') )\n\twp_die(__('You do not have sufficient permissions to add links to this site.'));\n\n$title = __('Add New Link');\n$parent_file = 'link-manager.php';\n\nwp_reset_vars( array('action', 'cat_id', 'link_id' ) );\n\nwp_enqueue_script('link');\nwp_enqueue_script('xfn');\n\nif ( wp_is_mobile() )\n\twp_enqueue_script( 'jquery-touch-punch' );\n\n$link = get_default_link_to_edit();\ninclude( ABSPATH . 'wp-admin/edit-link-form.php' );\n\nrequire( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/link-manager.php",
    "content": "<?php\n/**\n * Link Management Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\nif ( ! current_user_can( 'manage_links' ) )\n\twp_die( __( 'You do not have sufficient permissions to edit the links for this site.' ) );\n\n$wp_list_table = _get_list_table('WP_Links_List_Table');\n\n// Handle bulk deletes\n$doaction = $wp_list_table->current_action();\n\nif ( $doaction && isset( $_REQUEST['linkcheck'] ) ) {\n\tcheck_admin_referer( 'bulk-bookmarks' );\n\n\tif ( 'delete' == $doaction ) {\n\t\t$bulklinks = (array) $_REQUEST['linkcheck'];\n\t\tforeach ( $bulklinks as $link_id ) {\n\t\t\t$link_id = (int) $link_id;\n\n\t\t\twp_delete_link( $link_id );\n\t\t}\n\n\t\twp_redirect( add_query_arg('deleted', count( $bulklinks ), admin_url( 'link-manager.php' ) ) );\n\t\texit;\n\t}\n} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {\n\t wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );\n\t exit;\n}\n\n$wp_list_table->prepare_items();\n\n$title = __('Links');\n$this_file = $parent_file = 'link-manager.php';\n\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'overview',\n'title'\t\t=> __('Overview'),\n'content'\t=>\n\t'<p>' . sprintf(__('You can add links here to be displayed on your site, usually using <a href=\"%s\">Widgets</a>. By default, links to several sites in the WordPress community are included as examples.'), 'widgets.php') . '</p>' .\n    '<p>' . __('Links may be separated into Link Categories; these are different than the categories used on your posts.') . '</p>' .\n    '<p>' . __('You can customize the display of this screen using the Screen Options tab and/or the dropdown filters above the links table.') . '</p>'\n) );\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'deleting-links',\n'title'\t\t=> __('Deleting Links'),\n'content'\t=>\n    '<p>' . __('If you delete a link, it will be removed permanently, as Links do not have a Trash function yet.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Links_Screen\" target=\"_blank\">Documentation on Managing Links</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_list' => __( 'Links list' ),\n) );\n\ninclude_once( ABSPATH . 'wp-admin/admin-header.php' );\n\nif ( ! current_user_can('manage_links') )\n\twp_die(__(\"You do not have sufficient permissions to edit the links for this site.\"));\n\n?>\n\n<div class=\"wrap nosubsub\">\n<h1><?php echo esc_html( $title ); ?> <a href=\"link-add.php\" class=\"page-title-action\"><?php echo esc_html_x('Add New', 'link'); ?></a> <?php\nif ( !empty($_REQUEST['s']) )\n\tprintf( '<span class=\"subtitle\">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( wp_unslash($_REQUEST['s']) ) ); ?>\n</h1>\n\n<?php\nif ( isset($_REQUEST['deleted']) ) {\n\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>';\n\t$deleted = (int) $_REQUEST['deleted'];\n\tprintf(_n('%s link deleted.', '%s links deleted', $deleted), $deleted);\n\techo '</p></div>';\n\t$_SERVER['REQUEST_URI'] = remove_query_arg(array('deleted'), $_SERVER['REQUEST_URI']);\n}\n?>\n\n<form id=\"posts-filter\" method=\"get\">\n\n<?php $wp_list_table->search_box( __( 'Search Links' ), 'link' ); ?>\n\n<?php $wp_list_table->display(); ?>\n\n<div id=\"ajax-response\"></div>\n</form>\n\n</div>\n\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/link-parse-opml.php",
    "content": "<?php\n/**\n * Parse OPML XML files and store in globals.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\nif ( ! defined('ABSPATH') )\n\tdie();\n\n/**\n * @global string $opml\n */\nglobal $opml;\n\n/**\n * XML callback function for the start of a new XML tag.\n *\n * @since 0.71\n * @access private\n *\n * @global array $names\n * @global array $urls\n * @global array $targets\n * @global array $descriptions\n * @global array $feeds\n *\n * @param mixed $parser XML Parser resource.\n * @param string $tagName XML element name.\n * @param array $attrs XML element attributes.\n */\nfunction startElement($parser, $tagName, $attrs) {\n\tglobal $names, $urls, $targets, $descriptions, $feeds;\n\n\tif ( 'OUTLINE' === $tagName ) {\n\t\t$name = '';\n\t\tif ( isset( $attrs['TEXT'] ) ) {\n\t\t\t$name = $attrs['TEXT'];\n\t\t}\n\t\tif ( isset( $attrs['TITLE'] ) ) {\n\t\t\t$name = $attrs['TITLE'];\n\t\t}\n\t\t$url = '';\n\t\tif ( isset( $attrs['URL'] ) ) {\n\t\t\t$url = $attrs['URL'];\n\t\t}\n\t\tif ( isset( $attrs['HTMLURL'] ) ) {\n\t\t\t$url = $attrs['HTMLURL'];\n\t\t}\n\n\t\t// Save the data away.\n\t\t$names[] = $name;\n\t\t$urls[] = $url;\n\t\t$targets[] = isset( $attrs['TARGET'] ) ? $attrs['TARGET'] :  '';\n\t\t$feeds[] = isset( $attrs['XMLURL'] ) ? $attrs['XMLURL'] :  '';\n\t\t$descriptions[] = isset( $attrs['DESCRIPTION'] ) ? $attrs['DESCRIPTION'] :  '';\n\t} // End if outline.\n}\n\n/**\n * XML callback function that is called at the end of a XML tag.\n *\n * @since 0.71\n * @access private\n *\n * @param mixed $parser XML Parser resource.\n * @param string $tagName XML tag name.\n */\nfunction endElement($parser, $tagName) {\n\t// Nothing to do.\n}\n\n// Create an XML parser\n$xml_parser = xml_parser_create();\n\n// Set the functions to handle opening and closing tags\nxml_set_element_handler($xml_parser, \"startElement\", \"endElement\");\n\nif ( ! xml_parse( $xml_parser, $opml, true ) ) {\n\tprintf(\n\t\t/* translators: 1: error message, 2: line number */\n\t\t__( 'XML Error: %1$s at line %2$s' ),\n\t\txml_error_string( xml_get_error_code( $xml_parser ) ),\n\t\txml_get_current_line_number( $xml_parser )\n\t);\n}\n\n// Free up memory used by the XML parser\nxml_parser_free($xml_parser);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/link.php",
    "content": "<?php\n/**\n * Manage link administration actions.\n *\n * This page is accessed by the link management pages and handles the forms and\n * AJAX processes for link actions.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_reset_vars( array( 'action', 'cat_id', 'link_id' ) );\n\nif ( ! current_user_can('manage_links') )\n\twp_link_manager_disabled_message();\n\nif ( !empty($_POST['deletebookmarks']) )\n\t$action = 'deletebookmarks';\nif ( !empty($_POST['move']) )\n\t$action = 'move';\nif ( !empty($_POST['linkcheck']) )\n\t$linkcheck = $_POST['linkcheck'];\n\n$this_file = admin_url('link-manager.php');\n\nswitch ($action) {\n\tcase 'deletebookmarks' :\n\t\tcheck_admin_referer('bulk-bookmarks');\n\n\t\t// For each link id (in $linkcheck[]) change category to selected value.\n\t\tif (count($linkcheck) == 0) {\n\t\t\twp_redirect($this_file);\n\t\t\texit;\n\t\t}\n\n\t\t$deleted = 0;\n\t\tforeach ($linkcheck as $link_id) {\n\t\t\t$link_id = (int) $link_id;\n\n\t\t\tif ( wp_delete_link($link_id) )\n\t\t\t\t$deleted++;\n\t\t}\n\n\t\twp_redirect(\"$this_file?deleted=$deleted\");\n\t\texit;\n\n\tcase 'move' :\n\t\tcheck_admin_referer('bulk-bookmarks');\n\n\t\t// For each link id (in $linkcheck[]) change category to selected value.\n\t\tif (count($linkcheck) == 0) {\n\t\t\twp_redirect($this_file);\n\t\t\texit;\n\t\t}\n\t\t$all_links = join(',', $linkcheck);\n\t\t/*\n\t\t * Should now have an array of links we can change:\n\t\t *     $q = $wpdb->query(\"update $wpdb->links SET link_category='$category' WHERE link_id IN ($all_links)\");\n\t\t */\n\n\t\twp_redirect($this_file);\n\t\texit;\n\n\tcase 'add' :\n\t\tcheck_admin_referer('add-bookmark');\n\n\t\t$redir = wp_get_referer();\n\t\tif ( add_link() )\n\t\t\t$redir = add_query_arg( 'added', 'true', $redir );\n\n\t\twp_redirect( $redir );\n\t\texit;\n\n\tcase 'save' :\n\t\t$link_id = (int) $_POST['link_id'];\n\t\tcheck_admin_referer('update-bookmark_' . $link_id);\n\n\t\tedit_link($link_id);\n\n\t\twp_redirect($this_file);\n\t\texit;\n\n\tcase 'delete' :\n\t\t$link_id = (int) $_GET['link_id'];\n\t\tcheck_admin_referer('delete-bookmark_' . $link_id);\n\n\t\twp_delete_link($link_id);\n\n\t\twp_redirect($this_file);\n\t\texit;\n\n\tcase 'edit' :\n\t\twp_enqueue_script('link');\n\t\twp_enqueue_script('xfn');\n\n\t\tif ( wp_is_mobile() )\n\t\t\twp_enqueue_script( 'jquery-touch-punch' );\n\n\t\t$parent_file = 'link-manager.php';\n\t\t$submenu_file = 'link-manager.php';\n\t\t$title = __('Edit Link');\n\n\t\t$link_id = (int) $_GET['link_id'];\n\n\t\tif (!$link = get_link_to_edit($link_id))\n\t\t\twp_die(__('Link not found.'));\n\n\t\tinclude( ABSPATH . 'wp-admin/edit-link-form.php' );\n\t\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\t\tbreak;\n\n\tdefault :\n\t\tbreak;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/load-scripts.php",
    "content": "<?php\n\n/**\n * Disable error reporting\n *\n * Set this to error_reporting( -1 ) for debugging.\n */\nerror_reporting(0);\n\n/** Set ABSPATH for execution */\ndefine( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );\ndefine( 'WPINC', 'wp-includes' );\n\n$load = $_GET['load'];\nif ( is_array( $load ) )\n\t$load = implode( '', $load );\n\n$load = preg_replace( '/[^a-z0-9,_-]+/i', '', $load );\n$load = array_unique( explode( ',', $load ) );\n\nif ( empty($load) )\n\texit;\n\nrequire( ABSPATH . 'wp-admin/includes/noop.php' );\nrequire( ABSPATH . WPINC . '/script-loader.php' );\nrequire( ABSPATH . WPINC . '/version.php' );\n\n$compress = ( isset($_GET['c']) && $_GET['c'] );\n$force_gzip = ( $compress && 'gzip' == $_GET['c'] );\n$expires_offset = 31536000; // 1 year\n$out = '';\n\n$wp_scripts = new WP_Scripts();\nwp_default_scripts($wp_scripts);\n\nforeach ( $load as $handle ) {\n\tif ( !array_key_exists($handle, $wp_scripts->registered) )\n\t\tcontinue;\n\n\t$path = ABSPATH . $wp_scripts->registered[$handle]->src;\n\t$out .= get_file($path) . \"\\n\";\n}\n\nheader('Content-Type: application/javascript; charset=UTF-8');\nheader('Expires: ' . gmdate( \"D, d M Y H:i:s\", time() + $expires_offset ) . ' GMT');\nheader(\"Cache-Control: public, max-age=$expires_offset\");\n\nif ( $compress && ! ini_get('zlib.output_compression') && 'ob_gzhandler' != ini_get('output_handler') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) {\n\theader('Vary: Accept-Encoding'); // Handle proxies\n\tif ( false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && function_exists('gzdeflate') && ! $force_gzip ) {\n\t\theader('Content-Encoding: deflate');\n\t\t$out = gzdeflate( $out, 3 );\n\t} elseif ( false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode') ) {\n\t\theader('Content-Encoding: gzip');\n\t\t$out = gzencode( $out, 3 );\n\t}\n}\n\necho $out;\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/load-styles.php",
    "content": "<?php\n\n/**\n * Disable error reporting\n *\n * Set this to error_reporting( -1 ) for debugging\n */\nerror_reporting(0);\n\n/** Set ABSPATH for execution */\ndefine( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );\ndefine( 'WPINC', 'wp-includes' );\n\nrequire( ABSPATH . 'wp-admin/includes/noop.php' );\nrequire( ABSPATH . WPINC . '/script-loader.php' );\nrequire( ABSPATH . WPINC . '/version.php' );\n\n$load = preg_replace( '/[^a-z0-9,_-]+/i', '', $_GET['load'] );\n$load = array_unique( explode( ',', $load ) );\n\nif ( empty($load) )\n\texit;\n\n$compress = ( isset($_GET['c']) && $_GET['c'] );\n$force_gzip = ( $compress && 'gzip' == $_GET['c'] );\n$rtl = ( isset($_GET['dir']) && 'rtl' == $_GET['dir'] );\n$expires_offset = 31536000; // 1 year\n$out = '';\n\n$wp_styles = new WP_Styles();\nwp_default_styles($wp_styles);\n\nforeach ( $load as $handle ) {\n\tif ( !array_key_exists($handle, $wp_styles->registered) )\n\t\tcontinue;\n\n\t$style = $wp_styles->registered[$handle];\n\t$path = ABSPATH . $style->src;\n\n\tif ( $rtl && ! empty( $style->extra['rtl'] ) ) {\n\t\t// All default styles have fully independent RTL files.\n\t\t$path = str_replace( '.min.css', '-rtl.min.css', $path );\n\t}\n\n\t$content = get_file( $path ) . \"\\n\";\n\n\tif ( strpos( $style->src, '/' . WPINC . '/css/' ) === 0 ) {\n\t\t$content = str_replace( '../images/', '../' . WPINC . '/images/', $content );\n\t\t$content = str_replace( '../js/tinymce/', '../' . WPINC . '/js/tinymce/', $content );\n\t\t$content = str_replace( '../fonts/', '../' . WPINC . '/fonts/', $content );\n\t\t$out .= $content;\n\t} else {\n\t\t$out .= str_replace( '../images/', 'images/', $content );\n\t}\n}\n\nheader('Content-Type: text/css; charset=UTF-8');\nheader('Expires: ' . gmdate( \"D, d M Y H:i:s\", time() + $expires_offset ) . ' GMT');\nheader(\"Cache-Control: public, max-age=$expires_offset\");\n\nif ( $compress && ! ini_get('zlib.output_compression') && 'ob_gzhandler' != ini_get('output_handler') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) {\n\theader('Vary: Accept-Encoding'); // Handle proxies\n\tif ( false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && function_exists('gzdeflate') && ! $force_gzip ) {\n\t\theader('Content-Encoding: deflate');\n\t\t$out = gzdeflate( $out, 3 );\n\t} elseif ( false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode') ) {\n\t\theader('Content-Encoding: gzip');\n\t\t$out = gzencode( $out, 3 );\n\t}\n}\n\necho $out;\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/maint/repair.php",
    "content": "<?php\n/**\n * Database Repair and Optimization Script.\n *\n * @package WordPress\n * @subpackage Database\n */\ndefine('WP_REPAIRING', true);\n\nrequire_once( dirname( dirname( dirname( __FILE__ ) ) ) . '/wp-load.php' );\n\nheader( 'Content-Type: text/html; charset=utf-8' );\n?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" <?php language_attributes(); ?>>\n<head>\n\t<meta name=\"viewport\" content=\"width=device-width\" />\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<meta name=\"robots\" content=\"noindex,nofollow\" />\n\t<title><?php _e( 'WordPress &rsaquo; Database Repair' ); ?></title>\n\t<?php\n\twp_admin_css( 'install', true );\n\t?>\n</head>\n<body class=\"wp-core-ui\">\n<p id=\"logo\"><a href=\"<?php echo esc_url( __( 'https://wordpress.org/' ) ); ?>\" tabindex=\"-1\"><?php _e( 'WordPress' ); ?></a></p>\n\n<?php\n\nif ( ! defined( 'WP_ALLOW_REPAIR' ) ) {\n\n\techo '<h1 class=\"screen-reader-text\">' . __( 'Allow automatic database repair' ) . '</h1>';\n\n\techo '<p>' . __( 'To allow use of this page to automatically repair database problems, please add the following line to your <code>wp-config.php</code> file. Once this line is added to your config, reload this page.' ) . \"</p><p><code>define('WP_ALLOW_REPAIR', true);</code></p>\";\n\n\t$default_key     = 'put your unique phrase here';\n\t$missing_key     = false;\n\t$duplicated_keys = array();\n\n\tforeach ( array( 'AUTH_KEY', 'SECURE_AUTH_KEY', 'LOGGED_IN_KEY', 'NONCE_KEY', 'AUTH_SALT', 'SECURE_AUTH_SALT', 'LOGGED_IN_SALT', 'NONCE_SALT' ) as $key ) {\n\t\tif ( defined( $key ) ) {\n\t\t\t// Check for unique values of each key.\n\t\t\t$duplicated_keys[ constant( $key ) ] = isset( $duplicated_keys[ constant( $key ) ] );\n\t\t} else {\n\t\t\t// If a constant is not defined, it's missing.\n\t\t\t$missing_key = true;\n\t\t}\n\t}\n\n\t// If at least one key uses the default value, consider it duplicated.\n\tif ( isset( $duplicated_keys[ $default_key ] ) ) {\n\t\t$duplicated_keys[ $default_key ] = true;\n\t}\n\n\t// Weed out all unique, non-default values.\n\t$duplicated_keys = array_filter( $duplicated_keys );\n\n\tif ( $duplicated_keys || $missing_key ) {\n\n\t\techo '<h2 class=\"screen-reader-text\">' . __( 'Check secret keys' ) . '</h2>';\n\n\t\t// Translators: 1: wp-config.php; 2: Secret key service URL.\n\t\techo '<p>' . sprintf( __( 'While you are editing your %1$s file, take a moment to make sure you have all 8 keys and that they are unique. You can generate these using the <a href=\"%2$s\">WordPress.org secret key service</a>.' ), '<code>wp-config.php</code>', 'https://api.wordpress.org/secret-key/1.1/salt/' ) . '</p>';\n\t}\n\n} elseif ( isset( $_GET['repair'] ) ) {\n\n\techo '<h1 class=\"screen-reader-text\">' . __( 'Database repair results' ) . '</h1>';\n\n\t$optimize = 2 == $_GET['repair'];\n\t$okay = true;\n\t$problems = array();\n\n\t$tables = $wpdb->tables();\n\n\t// Sitecategories may not exist if global terms are disabled.\n\t$query = $wpdb->prepare( \"SHOW TABLES LIKE %s\", $wpdb->esc_like( $wpdb->sitecategories ) );\n\tif ( is_multisite() && ! $wpdb->get_var( $query ) ) {\n\t\tunset( $tables['sitecategories'] );\n\t}\n\n\t/**\n\t * Filter additional database tables to repair.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $tables Array of prefixed table names to be repaired.\n\t */\n\t$tables = array_merge( $tables, (array) apply_filters( 'tables_to_repair', array() ) );\n\n\t// Loop over the tables, checking and repairing as needed.\n\tforeach ( $tables as $table ) {\n\t\t$check = $wpdb->get_row( \"CHECK TABLE $table\" );\n\n\t\techo '<p>';\n\t\tif ( 'OK' == $check->Msg_text ) {\n\t\t\t/* translators: %s: table name */\n\t\t\tprintf( __( 'The %s table is okay.' ), \"<code>$table</code>\" );\n\t\t} else {\n\t\t\t/* translators: 1: table name, 2: error message, */\n\t\t\tprintf( __( 'The %1$s table is not okay. It is reporting the following error: %2$s. WordPress will attempt to repair this table&hellip;' ) , \"<code>$table</code>\", \"<code>$check->Msg_text</code>\" );\n\n\t\t\t$repair = $wpdb->get_row( \"REPAIR TABLE $table\" );\n\n\t\t\techo '<br />&nbsp;&nbsp;&nbsp;&nbsp;';\n\t\t\tif ( 'OK' == $check->Msg_text ) {\n\t\t\t\t/* translators: %s: table name */\n\t\t\t\tprintf( __( 'Successfully repaired the %s table.' ), \"<code>$table</code>\" );\n\t\t\t} else {\n\t\t\t\t/* translators: 1: table name, 2: error message, */\n\t\t\t\techo sprintf( __( 'Failed to repair the %1$s table. Error: %2$s' ), \"<code>$table</code>\", \"<code>$check->Msg_text</code>\" ) . '<br />';\n\t\t\t\t$problems[$table] = $check->Msg_text;\n\t\t\t\t$okay = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( $okay && $optimize ) {\n\t\t\t$check = $wpdb->get_row( \"ANALYZE TABLE $table\" );\n\n\t\t\techo '<br />&nbsp;&nbsp;&nbsp;&nbsp;';\n\t\t\tif ( 'Table is already up to date' == $check->Msg_text )  {\n\t\t\t\t/* translators: %s: table name */\n\t\t\t\tprintf( __( 'The %s table is already optimized.' ), \"<code>$table</code>\" );\n\t\t\t} else {\n\t\t\t\t$check = $wpdb->get_row( \"OPTIMIZE TABLE $table\" );\n\n\t\t\t\techo '<br />&nbsp;&nbsp;&nbsp;&nbsp;';\n\t\t\t\tif ( 'OK' == $check->Msg_text || 'Table is already up to date' == $check->Msg_text ) {\n\t\t\t\t\t/* translators: %s: table name */\n\t\t\t\t\tprintf( __( 'Successfully optimized the %s table.' ), \"<code>$table</code>\" );\n\t\t\t\t} else {\n\t\t\t\t\t/* translators: 1: table name, 2: error message, */\n\t\t\t\t\tprintf( __( 'Failed to optimize the %1$s table. Error: %2$s' ), \"<code>$table</code>\", \"<code>$check->Msg_text</code>\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\techo '</p>';\n\t}\n\n\tif ( $problems ) {\n\t\tprintf( '<p>' . __('Some database problems could not be repaired. Please copy-and-paste the following list of errors to the <a href=\"%s\">WordPress support forums</a> to get additional assistance.') . '</p>', __( 'https://wordpress.org/support/forum/how-to-and-troubleshooting' ) );\n\t\t$problem_output = '';\n\t\tforeach ( $problems as $table => $problem )\n\t\t\t$problem_output .= \"$table: $problem\\n\";\n\t\techo '<p><textarea name=\"errors\" id=\"errors\" rows=\"20\" cols=\"60\">' . esc_textarea( $problem_output ) . '</textarea></p>';\n\t} else {\n\t\techo '<p>' . __( 'Repairs complete. Please remove the following line from wp-config.php to prevent this page from being used by unauthorized users.' ) . \"</p><p><code>define('WP_ALLOW_REPAIR', true);</code></p>\";\n\t}\n} else {\n\n\techo '<h1 class=\"screen-reader-text\">' . __( 'WordPress database repair' ) . '</h1>';\n\n\tif ( isset( $_GET['referrer'] ) && 'is_blog_installed' == $_GET['referrer'] )\n\t\techo '<p>' . __( 'One or more database tables are unavailable. To allow WordPress to attempt to repair these tables, press the &#8220;Repair Database&#8221; button. Repairing can take a while, so please be patient.' ) . '</p>';\n\telse\n\t\techo '<p>' . __( 'WordPress can automatically look for some common database problems and repair them. Repairing can take a while, so please be patient.' ) . '</p>';\n?>\n\t<p class=\"step\"><a class=\"button button-large\" href=\"repair.php?repair=1\"><?php _e( 'Repair Database' ); ?></a></p>\n\t<p><?php _e( 'WordPress can also attempt to optimize the database. This improves performance in some situations. Repairing and optimizing the database can take a long time and the database will be locked while optimizing.' ); ?></p>\n\t<p class=\"step\"><a class=\"button button-large\" href=\"repair.php?repair=2\"><?php _e( 'Repair and Optimize Database' ); ?></a></p>\n<?php\n}\n?>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/media-new.php",
    "content": "<?php\n/**\n * Manage media uploaded file.\n *\n * There are many filters in here for media. Plugins can extend functionality\n * by hooking into the filters.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif (!current_user_can('upload_files'))\n\twp_die(__('You do not have permission to upload files.'));\n\nwp_enqueue_script('plupload-handlers');\n\n$post_id = 0;\nif ( isset( $_REQUEST['post_id'] ) ) {\n\t$post_id = absint( $_REQUEST['post_id'] );\n\tif ( ! get_post( $post_id ) || ! current_user_can( 'edit_post', $post_id ) )\n\t\t$post_id = 0;\n}\n\nif ( $_POST ) {\n\tif ( isset($_POST['html-upload']) && !empty($_FILES) ) {\n\t\tcheck_admin_referer('media-form');\n\t\t// Upload File button was clicked\n\t\t$upload_id = media_handle_upload( 'async-upload', $post_id );\n\t\tif ( is_wp_error( $upload_id ) ) {\n\t\t\twp_die( $upload_id );\n\t\t}\n\t}\n\twp_redirect( admin_url( 'upload.php' ) );\n\texit;\n}\n\n$title = __('Upload New Media');\n$parent_file = 'upload.php';\n\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'overview',\n'title'\t\t=> __('Overview'),\n'content'\t=>\n\t'<p>' . __('You can upload media files here without creating a post first. This allows you to upload files to use with posts and pages later and/or to get a web link for a particular file that you can share. There are three options for uploading files:') . '</p>' .\n\t'<ul>' .\n\t\t'<li>' . __('<strong>Drag and drop</strong> your files into the area below. Multiple files are allowed.') . '</li>' .\n\t\t'<li>' . __('Clicking <strong>Select Files</strong> opens a navigation window showing you files in your operating system. Selecting <strong>Open</strong> after clicking on the file you want activates a progress bar on the uploader screen.') . '</li>' .\n\t\t'<li>' . __('Revert to the <strong>Browser Uploader</strong> by clicking the link below the drag and drop box.') . '</li>' .\n\t'</ul>'\n) );\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Media_Add_New_Screen\" target=\"_blank\">Documentation on Uploading Media Files</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\n$form_class = 'media-upload-form type-form validate';\n\nif ( get_user_setting('uploader') || isset( $_GET['browser-uploader'] ) )\n\t$form_class .= ' html-uploader';\n?>\n<div class=\"wrap\">\n\t<h1><?php echo esc_html( $title ); ?></h1>\n\n\t<form enctype=\"multipart/form-data\" method=\"post\" action=\"<?php echo admin_url('media-new.php'); ?>\" class=\"<?php echo esc_attr( $form_class ); ?>\" id=\"file-form\">\n\n\t<?php media_upload_form(); ?>\n\n\t<script type=\"text/javascript\">\n\tvar post_id = <?php echo $post_id; ?>, shortform = 3;\n\t</script>\n\t<input type=\"hidden\" name=\"post_id\" id=\"post_id\" value=\"<?php echo $post_id; ?>\" />\n\t<?php wp_nonce_field('media-form'); ?>\n\t<div id=\"media-items\" class=\"hide-if-no-js\"></div>\n\t</form>\n</div>\n\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/media-upload.php",
    "content": "<?php\n/**\n * Manage media uploaded file.\n *\n * There are many filters in here for media. Plugins can extend functionality\n * by hooking into the filters.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\nif ( ! isset( $_GET['inline'] ) )\n\tdefine( 'IFRAME_REQUEST' , true );\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'upload_files' ) ) {\n\twp_die( __( 'You do not have permission to upload files.' ), 403 );\n}\n\nwp_enqueue_script('plupload-handlers');\nwp_enqueue_script('image-edit');\nwp_enqueue_script('set-post-thumbnail' );\nwp_enqueue_style('imgareaselect');\nwp_enqueue_script( 'media-gallery' );\n\n@header('Content-Type: ' . get_option('html_type') . '; charset=' . get_option('blog_charset'));\n\n// IDs should be integers\n$ID = isset($ID) ? (int) $ID : 0;\n$post_id = isset($post_id)? (int) $post_id : 0;\n\n// Require an ID for the edit screen.\nif ( isset( $action ) && $action == 'edit' && !$ID ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'Invalid item ID.' ) . '</p>',\n\t\t403\n\t);\n}\n\nif ( ! empty( $_REQUEST['post_id'] ) && ! current_user_can( 'edit_post' , $_REQUEST['post_id'] ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to edit this item.' ) . '</p>',\n\t\t403\n\t);\n}\n\n// Upload type: image, video, file, ..?\nif ( isset($_GET['type']) ) {\n\t$type = strval($_GET['type']);\n} else {\n\t/**\n\t * Filter the default media upload type in the legacy (pre-3.5.0) media popup.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $type The default media upload type. Possible values include\n\t *                     'image', 'audio', 'video', 'file', etc. Default 'file'.\n\t */\n\t$type = apply_filters( 'media_upload_default_type', 'file' );\n}\n\n// Tab: gallery, library, or type-specific.\nif ( isset($_GET['tab']) ) {\n\t$tab = strval($_GET['tab']);\n} else {\n\t/**\n\t * Filter the default tab in the legacy (pre-3.5.0) media popup.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $type The default media popup tab. Default 'type' (From Computer).\n\t */\n\t$tab = apply_filters( 'media_upload_default_tab', 'type' );\n}\n\n$body_id = 'media-upload';\n\n// Let the action code decide how to handle the request.\nif ( $tab == 'type' || $tab == 'type_url' || ! array_key_exists( $tab , media_upload_tabs() ) ) {\n\t/**\n\t * Fires inside specific upload-type views in the legacy (pre-3.5.0)\n\t * media popup based on the current tab.\n\t *\n\t * The dynamic portion of the hook name, `$type`, refers to the specific\n\t * media upload type. Possible values include 'image', 'audio', 'video',\n\t * 'file', etc.\n\t *\n\t * The hook only fires if the current `$tab` is 'type' (From Computer),\n\t * 'type_url' (From URL), or, if the tab does not exist (i.e., has not\n\t * been registered via the {@see 'media_upload_tabs'} filter.\n\t *\n\t * @since 2.5.0\n\t */\n\tdo_action( \"media_upload_$type\" );\n} else {\n\t/**\n\t * Fires inside limited and specific upload-tab views in the legacy\n\t * (pre-3.5.0) media popup.\n\t *\n\t * The dynamic portion of the hook name, `$tab`, refers to the specific\n\t * media upload tab. Possible values include 'library' (Media Library),\n\t * or any custom tab registered via the {@see 'media_upload_tabs'} filter.\n\t *\n\t * @since 2.5.0\n\t */\n\tdo_action( \"media_upload_$tab\" );\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/media.php",
    "content": "<?php\n/**\n * Media management action handler.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n$parent_file = 'upload.php';\n$submenu_file = 'upload.php';\n\nwp_reset_vars(array('action'));\n\nswitch ( $action ) {\ncase 'editattachment' :\n\t$attachment_id = (int) $_POST['attachment_id'];\n\tcheck_admin_referer('media-form');\n\n\tif ( !current_user_can('edit_post', $attachment_id) )\n\t\twp_die ( __('You are not allowed to edit this attachment.') );\n\n\t$errors = media_upload_form_handler();\n\n\tif ( empty($errors) ) {\n\t\t$location = 'media.php';\n\t\tif ( $referer = wp_get_original_referer() ) {\n\t\t\tif ( false !== strpos($referer, 'upload.php') || ( url_to_postid($referer) == $attachment_id )  )\n\t\t\t\t$location = $referer;\n\t\t}\n\t\tif ( false !== strpos($location, 'upload.php') ) {\n\t\t\t$location = remove_query_arg('message', $location);\n\t\t\t$location = add_query_arg('posted',\t$attachment_id, $location);\n\t\t} elseif ( false !== strpos($location, 'media.php') ) {\n\t\t\t$location = add_query_arg('message', 'updated', $location);\n\t\t}\n\t\twp_redirect($location);\n\t\texit;\n\t}\n\n\t// No break.\ncase 'edit' :\n\t$title = __('Edit Media');\n\n\tif ( empty($errors) )\n\t\t$errors = null;\n\n\tif ( empty( $_GET['attachment_id'] ) ) {\n\t\twp_redirect( admin_url('upload.php') );\n\t\texit();\n\t}\n\t$att_id = (int) $_GET['attachment_id'];\n\n\tif ( !current_user_can('edit_post', $att_id) )\n\t\twp_die ( __('You are not allowed to edit this attachment.') );\n\n\t$att = get_post($att_id);\n\n\tif ( empty($att->ID) ) wp_die( __('You attempted to edit an attachment that doesn&#8217;t exist. Perhaps it was deleted?') );\n\tif ( 'attachment' !== $att->post_type ) wp_die( __('You attempted to edit an item that isn&#8217;t an attachment. Please go back and try again.') );\n\tif ( $att->post_status == 'trash' ) wp_die( __('You can&#8217;t edit this attachment because it is in the Trash. Please move it out of the Trash and try again.') );\n\n\tadd_filter('attachment_fields_to_edit', 'media_single_attachment_fields_to_edit', 10, 2);\n\n\twp_enqueue_script( 'wp-ajax-response' );\n\twp_enqueue_script('image-edit');\n\twp_enqueue_style('imgareaselect');\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'overview',\n\t\t'title'   => __('Overview'),\n\t\t'content' =>\n\t\t\t'<p>' . __('This screen allows you to edit five fields for metadata in a file within the media library.') . '</p>' .\n\t\t\t'<p>' . __('For images only, you can click on Edit Image under the thumbnail to expand out an inline image editor with icons for cropping, rotating, or flipping the image as well as for undoing and redoing. The boxes on the right give you more options for scaling the image, for cropping it, and for cropping the thumbnail in a different way than you crop the original image. You can click on Help in those boxes to get more information.') . '</p>' .\n\t\t\t'<p>' . __('Note that you crop the image by clicking on it (the Crop icon is already selected) and dragging the cropping frame to select the desired part. Then click Save to retain the cropping.') . '</p>' .\n\t\t\t'<p>' . __('Remember to click Update Media to save metadata entered or changed.') . '</p>'\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Media_Add_New_Screen#Edit_Media\" target=\"_blank\">Documentation on Edit Media</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n\t);\n\n\trequire( ABSPATH . 'wp-admin/admin-header.php' );\n\n\t$parent_file = 'upload.php';\n\t$message = '';\n\t$class = '';\n\tif ( isset($_GET['message']) ) {\n\t\tswitch ( $_GET['message'] ) {\n\t\t\tcase 'updated' :\n\t\t\t\t$message = __('Media attachment updated.');\n\t\t\t\t$class = 'updated';\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tif ( $message )\n\t\techo \"<div id='message' class='$class'><p>$message</p></div>\\n\";\n\n?>\n\n<div class=\"wrap\">\n<h1>\n<?php\necho esc_html( $title );\nif ( current_user_can( 'upload_files' ) ) { ?>\n\t<a href=\"media-new.php\" class=\"page-title-action\"><?php echo esc_html_x('Add New', 'file'); ?></a>\n<?php } ?>\n</h1>\n\n<form method=\"post\" class=\"media-upload-form\" id=\"media-single-form\">\n<p class=\"submit\" style=\"padding-bottom: 0;\">\n<?php submit_button( __( 'Update Media' ), 'primary', 'save', false ); ?>\n</p>\n\n<div class=\"media-single\">\n<div id=\"media-item-<?php echo $att_id; ?>\" class=\"media-item\">\n<?php echo get_media_item( $att_id, array( 'toggle' => false, 'send' => false, 'delete' => false, 'show_title' => false, 'errors' => !empty($errors[$att_id]) ? $errors[$att_id] : null ) ); ?>\n</div>\n</div>\n\n<?php submit_button( __( 'Update Media' ), 'primary', 'save' ); ?>\n<input type=\"hidden\" name=\"post_id\" id=\"post_id\" value=\"<?php echo isset($post_id) ? esc_attr($post_id) : ''; ?>\" />\n<input type=\"hidden\" name=\"attachment_id\" id=\"attachment_id\" value=\"<?php echo esc_attr($att_id); ?>\" />\n<input type=\"hidden\" name=\"action\" value=\"editattachment\" />\n<?php wp_original_referer_field(true, 'previous'); ?>\n<?php wp_nonce_field('media-form'); ?>\n\n</form>\n\n</div>\n\n<?php\n\n\trequire( ABSPATH . 'wp-admin/admin-footer.php' );\n\n\texit;\n\ndefault:\n\twp_redirect( admin_url('upload.php') );\n\texit;\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/menu-header.php",
    "content": "<?php\n/**\n * Displays Administration Menu.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * The current page.\n *\n * @global string $self\n */\n$self = preg_replace('|^.*/wp-admin/network/|i', '', $_SERVER['PHP_SELF']);\n$self = preg_replace('|^.*/wp-admin/|i', '', $self);\n$self = preg_replace('|^.*/plugins/|i', '', $self);\n$self = preg_replace('|^.*/mu-plugins/|i', '', $self);\n\n/**\n * For when admin-header is included from within a function.\n *\n * @global array  $menu\n * @global array  $submenu\n * @global string $parent_file\n * @global string $submenu_file\n */\nglobal $menu, $submenu, $parent_file, $submenu_file;\n\n/**\n * Filter the parent file of an admin menu sub-menu item.\n *\n * Allows plugins to move sub-menu items around.\n *\n * @since MU\n *\n * @param string $parent_file The parent file.\n */\n$parent_file = apply_filters( 'parent_file', $parent_file );\n\n/**\n * Filter the file of an admin menu sub-menu item.\n *\n * @since 4.4.0\n *\n * @param string $submenu_file The submenu file.\n * @param string $parent_file  The submenu item's parent file.\n */\n$submenu_file = apply_filters( 'submenu_file', $submenu_file, $parent_file );\n\nget_admin_page_parent();\n\n/**\n * Display menu.\n *\n * @access private\n * @since 2.7.0\n *\n * @global string $self\n * @global string $parent_file\n * @global string $submenu_file\n * @global string $plugin_page\n * @global string $typenow\n *\n * @param array $menu\n * @param array $submenu\n * @param bool  $submenu_as_parent\n */\nfunction _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) {\n\tglobal $self, $parent_file, $submenu_file, $plugin_page, $typenow;\n\n\t$first = true;\n\t// 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes, 5 = hookname, 6 = icon_url\n\tforeach ( $menu as $key => $item ) {\n\t\t$admin_is_parent = false;\n\t\t$class = array();\n\t\t$aria_attributes = '';\n\t\t$aria_hidden = '';\n\t\t$is_separator = false;\n\n\t\tif ( $first ) {\n\t\t\t$class[] = 'wp-first-item';\n\t\t\t$first = false;\n\t\t}\n\n\t\t$submenu_items = array();\n\t\tif ( ! empty( $submenu[$item[2]] ) ) {\n\t\t\t$class[] = 'wp-has-submenu';\n\t\t\t$submenu_items = $submenu[$item[2]];\n\t\t}\n\n\t\tif ( ( $parent_file && $item[2] == $parent_file ) || ( empty($typenow) && $self == $item[2] ) ) {\n\t\t\t$class[] = ! empty( $submenu_items ) ? 'wp-has-current-submenu wp-menu-open' : 'current';\n\t\t} else {\n\t\t\t$class[] = 'wp-not-current-submenu';\n\t\t\tif ( ! empty( $submenu_items ) )\n\t\t\t\t$aria_attributes .= 'aria-haspopup=\"true\"';\n\t\t}\n\n\t\tif ( ! empty( $item[4] ) )\n\t\t\t$class[] = esc_attr( $item[4] );\n\n\t\t$class = $class ? ' class=\"' . join( ' ', $class ) . '\"' : '';\n\t\t$id = ! empty( $item[5] ) ? ' id=\"' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '\"' : '';\n\t\t$img = $img_style = '';\n\t\t$img_class = ' dashicons-before';\n\n\t\tif ( false !== strpos( $class, 'wp-menu-separator' ) ) {\n\t\t\t$is_separator = true;\n\t\t}\n\n\t\t/*\n\t\t * If the string 'none' (previously 'div') is passed instead of an URL, don't output\n\t\t * the default menu image so an icon can be added to div.wp-menu-image as background\n\t\t * with CSS. Dashicons and base64-encoded data:image/svg_xml URIs are also handled\n\t\t * as special cases.\n\t\t */\n\t\tif ( ! empty( $item[6] ) ) {\n\t\t\t$img = '<img src=\"' . $item[6] . '\" alt=\"\" />';\n\n\t\t\tif ( 'none' === $item[6] || 'div' === $item[6] ) {\n\t\t\t\t$img = '<br />';\n\t\t\t} elseif ( 0 === strpos( $item[6], 'data:image/svg+xml;base64,' ) ) {\n\t\t\t\t$img = '<br />';\n\t\t\t\t$img_style = ' style=\"background-image:url(\\'' . esc_attr( $item[6] ) . '\\')\"';\n\t\t\t\t$img_class = ' svg';\n\t\t\t} elseif ( 0 === strpos( $item[6], 'dashicons-' ) ) {\n\t\t\t\t$img = '<br />';\n\t\t\t\t$img_class = ' dashicons-before ' . sanitize_html_class( $item[6] );\n\t\t\t}\n\t\t}\n\t\t$arrow = '<div class=\"wp-menu-arrow\"><div></div></div>';\n\n\t\t$title = wptexturize( $item[0] );\n\n\t\t// hide separators from screen readers\n\t\tif ( $is_separator ) {\n\t\t\t$aria_hidden = ' aria-hidden=\"true\"';\n\t\t}\n\n\t\techo \"\\n\\t<li$class$id$aria_hidden>\";\n\n\t\tif ( $is_separator ) {\n\t\t\techo '<div class=\"separator\"></div>';\n\t\t} elseif ( $submenu_as_parent && ! empty( $submenu_items ) ) {\n\t\t\t$submenu_items = array_values( $submenu_items );  // Re-index.\n\t\t\t$menu_hook = get_plugin_page_hook( $submenu_items[0][2], $item[2] );\n\t\t\t$menu_file = $submenu_items[0][2];\n\t\t\tif ( false !== ( $pos = strpos( $menu_file, '?' ) ) )\n\t\t\t\t$menu_file = substr( $menu_file, 0, $pos );\n\t\t\tif ( ! empty( $menu_hook ) || ( ( 'index.php' != $submenu_items[0][2] ) && file_exists( WP_PLUGIN_DIR . \"/$menu_file\" ) && ! file_exists( ABSPATH . \"/wp-admin/$menu_file\" ) ) ) {\n\t\t\t\t$admin_is_parent = true;\n\t\t\t\techo \"<a href='admin.php?page={$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>\";\n\t\t\t} else {\n\t\t\t\techo \"\\n\\t<a href='{$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>\";\n\t\t\t}\n\t\t} elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) {\n\t\t\t$menu_hook = get_plugin_page_hook( $item[2], 'admin.php' );\n\t\t\t$menu_file = $item[2];\n\t\t\tif ( false !== ( $pos = strpos( $menu_file, '?' ) ) )\n\t\t\t\t$menu_file = substr( $menu_file, 0, $pos );\n\t\t\tif ( ! empty( $menu_hook ) || ( ( 'index.php' != $item[2] ) && file_exists( WP_PLUGIN_DIR . \"/$menu_file\" ) && ! file_exists( ABSPATH . \"/wp-admin/$menu_file\" ) ) ) {\n\t\t\t\t$admin_is_parent = true;\n\t\t\t\techo \"\\n\\t<a href='admin.php?page={$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>\";\n\t\t\t} else {\n\t\t\t\techo \"\\n\\t<a href='{$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>\";\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $submenu_items ) ) {\n\t\t\techo \"\\n\\t<ul class='wp-submenu wp-submenu-wrap'>\";\n\t\t\techo \"<li class='wp-submenu-head' aria-hidden='true'>{$item[0]}</li>\";\n\n\t\t\t$first = true;\n\n\t\t\t// 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes\n\t\t\tforeach ( $submenu_items as $sub_key => $sub_item ) {\n\t\t\t\tif ( ! current_user_can( $sub_item[1] ) )\n\t\t\t\t\tcontinue;\n\n\t\t\t\t$class = array();\n\t\t\t\tif ( $first ) {\n\t\t\t\t\t$class[] = 'wp-first-item';\n\t\t\t\t\t$first = false;\n\t\t\t\t}\n\n\t\t\t\t$menu_file = $item[2];\n\n\t\t\t\tif ( false !== ( $pos = strpos( $menu_file, '?' ) ) )\n\t\t\t\t\t$menu_file = substr( $menu_file, 0, $pos );\n\n\t\t\t\t// Handle current for post_type=post|page|foo pages, which won't match $self.\n\t\t\t\t$self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing';\n\n\t\t\t\tif ( isset( $submenu_file ) ) {\n\t\t\t\t\tif ( $submenu_file == $sub_item[2] )\n\t\t\t\t\t\t$class[] = 'current';\n\t\t\t\t// If plugin_page is set the parent must either match the current page or not physically exist.\n\t\t\t\t// This allows plugin pages with the same hook to exist under different parents.\n\t\t\t\t} elseif (\n\t\t\t\t\t( ! isset( $plugin_page ) && $self == $sub_item[2] ) ||\n\t\t\t\t\t( isset( $plugin_page ) && $plugin_page == $sub_item[2] && ( $item[2] == $self_type || $item[2] == $self || file_exists($menu_file) === false ) )\n\t\t\t\t) {\n\t\t\t\t\t$class[] = 'current';\n\t\t\t\t}\n\n\t\t\t\tif ( ! empty( $sub_item[4] ) ) {\n\t\t\t\t\t$class[] = esc_attr( $sub_item[4] );\n\t\t\t\t}\n\n\t\t\t\t$class = $class ? ' class=\"' . join( ' ', $class ) . '\"' : '';\n\n\t\t\t\t$menu_hook = get_plugin_page_hook($sub_item[2], $item[2]);\n\t\t\t\t$sub_file = $sub_item[2];\n\t\t\t\tif ( false !== ( $pos = strpos( $sub_file, '?' ) ) )\n\t\t\t\t\t$sub_file = substr($sub_file, 0, $pos);\n\n\t\t\t\t$title = wptexturize($sub_item[0]);\n\n\t\t\t\tif ( ! empty( $menu_hook ) || ( ( 'index.php' != $sub_item[2] ) && file_exists( WP_PLUGIN_DIR . \"/$sub_file\" ) && ! file_exists( ABSPATH . \"/wp-admin/$sub_file\" ) ) ) {\n\t\t\t\t\t// If admin.php is the current page or if the parent exists as a file in the plugins or admin dir\n\t\t\t\t\tif ( ( ! $admin_is_parent && file_exists( WP_PLUGIN_DIR . \"/$menu_file\" ) && ! is_dir( WP_PLUGIN_DIR . \"/{$item[2]}\" ) ) || file_exists( $menu_file ) )\n\t\t\t\t\t\t$sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] );\n\t\t\t\t\telse\n\t\t\t\t\t\t$sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' );\n\n\t\t\t\t\t$sub_item_url = esc_url( $sub_item_url );\n\t\t\t\t\techo \"<li$class><a href='$sub_item_url'$class>$title</a></li>\";\n\t\t\t\t} else {\n\t\t\t\t\techo \"<li$class><a href='{$sub_item[2]}'$class>$title</a></li>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\techo \"</ul>\";\n\t\t}\n\t\techo \"</li>\";\n\t}\n\n\techo '<li id=\"collapse-menu\" class=\"hide-if-no-js\"><div id=\"collapse-button\"><div></div></div>';\n\techo '<span>' . esc_html__( 'Collapse menu' ) . '</span>';\n\techo '</li>';\n}\n\n?>\n\n<div id=\"adminmenumain\" role=\"navigation\" aria-label=\"<?php esc_attr_e( 'Main menu' ); ?>\">\n<a href=\"#wpbody-content\" class=\"screen-reader-shortcut\"><?php _e( 'Skip to main content' ); ?></a>\n<a href=\"#wp-toolbar\" class=\"screen-reader-shortcut\"><?php _e( 'Skip to toolbar' ); ?></a>\n<div id=\"adminmenuback\"></div>\n<div id=\"adminmenuwrap\">\n<ul id=\"adminmenu\">\n\n<?php\n\n_wp_menu_output( $menu, $submenu );\n/**\n * Fires after the admin menu has been output.\n *\n * @since 2.5.0\n */\ndo_action( 'adminmenu' );\n\n?>\n</ul>\n</div>\n</div>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/menu.php",
    "content": "<?php\n/**\n * Build Administration Menu.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * Constructs the admin menu.\n *\n * The elements in the array are :\n *     0: Menu item name\n *     1: Minimum level or capability required.\n *     2: The URL of the item's file\n *     3: Class\n *     4: ID\n *     5: Icon for top level menu\n *\n * @global array $menu\n */\n\n$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'dashicons-dashboard' );\n\n$submenu[ 'index.php' ][0] = array( __('Home'), 'read', 'index.php' );\n\nif ( is_multisite() ) {\n\t$submenu[ 'index.php' ][5] = array( __('My Sites'), 'read', 'my-sites.php' );\n}\n\nif ( ! is_multisite() || is_super_admin() )\n\t$update_data = wp_get_update_data();\n\nif ( ! is_multisite() ) {\n\tif ( current_user_can( 'update_core' ) )\n\t\t$cap = 'update_core';\n\telseif ( current_user_can( 'update_plugins' ) )\n\t\t$cap = 'update_plugins';\n\telse\n\t\t$cap = 'update_themes';\n\t$submenu[ 'index.php' ][10] = array( sprintf( __('Updates %s'), \"<span class='update-plugins count-{$update_data['counts']['total']}' title='{$update_data['title']}'><span class='update-count'>\" . number_format_i18n($update_data['counts']['total']) . \"</span></span>\" ), $cap, 'update-core.php');\n\tunset( $cap );\n}\n\n$menu[4] = array( '', 'read', 'separator1', '', 'wp-menu-separator' );\n\n// $menu[5] = Posts\n\n$menu[10] = array( __('Media'), 'upload_files', 'upload.php', '', 'menu-top menu-icon-media', 'menu-media', 'dashicons-admin-media' );\n\t$submenu['upload.php'][5] = array( __('Library'), 'upload_files', 'upload.php');\n\t/* translators: add new file */\n\t$submenu['upload.php'][10] = array( _x('Add New', 'file'), 'upload_files', 'media-new.php');\n\t$i = 15;\n\tforeach ( get_taxonomies_for_attachments( 'objects' ) as $tax ) {\n\t\tif ( ! $tax->show_ui || ! $tax->show_in_menu )\n\t\t\tcontinue;\n\n\t\t$submenu['upload.php'][$i++] = array( esc_attr( $tax->labels->menu_name ), $tax->cap->manage_terms, 'edit-tags.php?taxonomy=' . $tax->name . '&amp;post_type=attachment' );\n\t}\n\tunset( $tax, $i );\n\n$menu[15] = array( __('Links'), 'manage_links', 'link-manager.php', '', 'menu-top menu-icon-links', 'menu-links', 'dashicons-admin-links' );\n\t$submenu['link-manager.php'][5] = array( _x('All Links', 'admin menu'), 'manage_links', 'link-manager.php' );\n\t/* translators: add new links */\n\t$submenu['link-manager.php'][10] = array( _x('Add New', 'link'), 'manage_links', 'link-add.php' );\n\t$submenu['link-manager.php'][15] = array( __('Link Categories'), 'manage_categories', 'edit-tags.php?taxonomy=link_category' );\n\n// $menu[20] = Pages\n\n// Avoid the comment count query for users who cannot edit_posts.\nif ( current_user_can( 'edit_posts' ) ) {\n\t$awaiting_mod = wp_count_comments();\n\t$awaiting_mod = $awaiting_mod->moderated;\n\t$menu[25] = array(\n\t\tsprintf( __( 'Comments %s' ), '<span class=\"awaiting-mod count-' . absint( $awaiting_mod ) . '\"><span class=\"pending-count\">' . number_format_i18n( $awaiting_mod ) . '</span></span>' ),\n\t\t'edit_posts',\n\t\t'edit-comments.php',\n\t\t'',\n\t\t'menu-top menu-icon-comments',\n\t\t'menu-comments',\n\t\t'dashicons-admin-comments',\n\t);\n\tunset( $awaiting_mod );\n}\n\n$submenu[ 'edit-comments.php' ][0] = array( __('All Comments'), 'edit_posts', 'edit-comments.php' );\n\n$_wp_last_object_menu = 25; // The index of the last top-level menu in the object menu group\n\n$types = (array) get_post_types( array('show_ui' => true, '_builtin' => false, 'show_in_menu' => true ) );\n$builtin = array( 'post', 'page' );\nforeach ( array_merge( $builtin, $types ) as $ptype ) {\n\t$ptype_obj = get_post_type_object( $ptype );\n\t// Check if it should be a submenu.\n\tif ( $ptype_obj->show_in_menu !== true )\n\t\tcontinue;\n\t$ptype_menu_position = is_int( $ptype_obj->menu_position ) ? $ptype_obj->menu_position : ++$_wp_last_object_menu; // If we're to use $_wp_last_object_menu, increment it first.\n\t$ptype_for_id = sanitize_html_class( $ptype );\n\n\t$menu_icon = 'dashicons-admin-post';\n\tif ( is_string( $ptype_obj->menu_icon ) ) {\n\t\t// Special handling for data:image/svg+xml and Dashicons.\n\t\tif ( 0 === strpos( $ptype_obj->menu_icon, 'data:image/svg+xml;base64,' ) || 0 === strpos( $ptype_obj->menu_icon, 'dashicons-' ) ) {\n\t\t\t$menu_icon = $ptype_obj->menu_icon;\n\t\t} else {\n\t\t\t$menu_icon = esc_url( $ptype_obj->menu_icon );\n\t\t}\n\t} elseif ( in_array( $ptype, $builtin ) ) {\n\t\t$menu_icon = 'dashicons-admin-' . $ptype;\n\t}\n\n\t$menu_class = 'menu-top menu-icon-' . $ptype_for_id;\n\t// 'post' special case\n\tif ( 'post' === $ptype ) {\n\t\t$menu_class .= ' open-if-no-js';\n\t\t$ptype_file = \"edit.php\";\n\t\t$post_new_file = \"post-new.php\";\n\t\t$edit_tags_file = \"edit-tags.php?taxonomy=%s\";\n\t} else {\n\t\t$ptype_file = \"edit.php?post_type=$ptype\";\n\t\t$post_new_file = \"post-new.php?post_type=$ptype\";\n\t\t$edit_tags_file = \"edit-tags.php?taxonomy=%s&amp;post_type=$ptype\";\n\t}\n\n\tif ( in_array( $ptype, $builtin ) ) {\n\t\t$ptype_menu_id = 'menu-' . $ptype_for_id . 's';\n\t} else {\n\t\t$ptype_menu_id = 'menu-posts-' . $ptype_for_id;\n\t}\n\t/*\n\t * If $ptype_menu_position is already populated or will be populated\n\t * by a hard-coded value below, increment the position.\n\t */\n\t$core_menu_positions = array(59, 60, 65, 70, 75, 80, 85, 99);\n\twhile ( isset($menu[$ptype_menu_position]) || in_array($ptype_menu_position, $core_menu_positions) )\n\t\t$ptype_menu_position++;\n\n\t$menu[$ptype_menu_position] = array( esc_attr( $ptype_obj->labels->menu_name ), $ptype_obj->cap->edit_posts, $ptype_file, '', $menu_class, $ptype_menu_id, $menu_icon );\n\t$submenu[ $ptype_file ][5]  = array( $ptype_obj->labels->all_items, $ptype_obj->cap->edit_posts,  $ptype_file );\n\t$submenu[ $ptype_file ][10]  = array( $ptype_obj->labels->add_new, $ptype_obj->cap->create_posts, $post_new_file );\n\n\t$i = 15;\n\tforeach ( get_taxonomies( array(), 'objects' ) as $tax ) {\n\t\tif ( ! $tax->show_ui || ! $tax->show_in_menu || ! in_array($ptype, (array) $tax->object_type, true) )\n\t\t\tcontinue;\n\n\t\t$submenu[ $ptype_file ][$i++] = array( esc_attr( $tax->labels->menu_name ), $tax->cap->manage_terms, sprintf( $edit_tags_file, $tax->name ) );\n\t}\n}\nunset( $ptype, $ptype_obj, $ptype_for_id, $ptype_menu_position, $menu_icon, $i, $tax, $post_new_file );\n\n$menu[59] = array( '', 'read', 'separator2', '', 'wp-menu-separator' );\n\n$appearance_cap = current_user_can( 'switch_themes') ? 'switch_themes' : 'edit_theme_options';\n\n$menu[60] = array( __( 'Appearance' ), $appearance_cap, 'themes.php', '', 'menu-top menu-icon-appearance', 'menu-appearance', 'dashicons-admin-appearance' );\n\t$submenu['themes.php'][5] = array( __( 'Themes' ), $appearance_cap, 'themes.php' );\n\n\t$customize_url = add_query_arg( 'return', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), 'customize.php' );\n\t$submenu['themes.php'][6] = array( __( 'Customize' ), 'customize', esc_url( $customize_url ), '', 'hide-if-no-customize' );\n\n\tif ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) ) {\n\t\t$submenu['themes.php'][10] = array( __( 'Menus' ), 'edit_theme_options', 'nav-menus.php' );\n\t}\n\n\tif ( current_theme_supports( 'custom-header' ) && current_user_can( 'customize') ) {\n\t\t$customize_header_url = add_query_arg( array( 'autofocus' => array( 'control' => 'header_image' ) ), $customize_url );\n\t\t$submenu['themes.php'][15] = array( __( 'Header' ), $appearance_cap, esc_url( $customize_header_url ), '', 'hide-if-no-customize' );\n\t}\n\n\tif ( current_theme_supports( 'custom-background' ) && current_user_can( 'customize') ) {\n\t\t$customize_background_url = add_query_arg( array( 'autofocus' => array( 'control' => 'background_image' ) ), $customize_url );\n\t\t$submenu['themes.php'][20] = array( __( 'Background' ), $appearance_cap, esc_url( $customize_background_url ), '', 'hide-if-no-customize' );\n\t}\n\n\tunset( $customize_url );\n\nunset( $appearance_cap );\n\n// Add 'Editor' to the bottom of the Appearance menu.\nif ( ! is_multisite() ) {\n\tadd_action('admin_menu', '_add_themes_utility_last', 101);\n}\n/**\n *\n */\nfunction _add_themes_utility_last() {\n\t// Must use API on the admin_menu hook, direct modification is only possible on/before the _admin_menu hook\n\tadd_submenu_page('themes.php', _x('Editor', 'theme editor'), _x('Editor', 'theme editor'), 'edit_themes', 'theme-editor.php');\n}\n\n$count = '';\nif ( ! is_multisite() && current_user_can( 'update_plugins' ) ) {\n\tif ( ! isset( $update_data ) )\n\t\t$update_data = wp_get_update_data();\n\t$count = \"<span class='update-plugins count-{$update_data['counts']['plugins']}'><span class='plugin-count'>\" . number_format_i18n($update_data['counts']['plugins']) . \"</span></span>\";\n}\n\n$menu[65] = array( sprintf( __('Plugins %s'), $count ), 'activate_plugins', 'plugins.php', '', 'menu-top menu-icon-plugins', 'menu-plugins', 'dashicons-admin-plugins' );\n\n$submenu['plugins.php'][5]  = array( __('Installed Plugins'), 'activate_plugins', 'plugins.php' );\n\n\tif ( ! is_multisite() ) {\n\t\t/* translators: add new plugin */\n\t\t$submenu['plugins.php'][10] = array( _x('Add New', 'plugin'), 'install_plugins', 'plugin-install.php' );\n\t\t$submenu['plugins.php'][15] = array( _x('Editor', 'plugin editor'), 'edit_plugins', 'plugin-editor.php' );\n\t}\n\nunset( $update_data );\n\nif ( current_user_can('list_users') )\n\t$menu[70] = array( __('Users'), 'list_users', 'users.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users' );\nelse\n\t$menu[70] = array( __('Profile'), 'read', 'profile.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users' );\n\nif ( current_user_can('list_users') ) {\n\t$_wp_real_parent_file['profile.php'] = 'users.php'; // Back-compat for plugins adding submenus to profile.php.\n\t$submenu['users.php'][5] = array(__('All Users'), 'list_users', 'users.php');\n\tif ( current_user_can( 'create_users' ) ) {\n\t\t$submenu['users.php'][10] = array(_x('Add New', 'user'), 'create_users', 'user-new.php');\n\t} elseif ( is_multisite() ) {\n\t\t$submenu['users.php'][10] = array(_x('Add New', 'user'), 'promote_users', 'user-new.php');\n\t}\n\n\t$submenu['users.php'][15] = array(__('Your Profile'), 'read', 'profile.php');\n} else {\n\t$_wp_real_parent_file['users.php'] = 'profile.php';\n\t$submenu['profile.php'][5] = array(__('Your Profile'), 'read', 'profile.php');\n\tif ( current_user_can( 'create_users' ) ) {\n\t\t$submenu['profile.php'][10] = array(__('Add New User'), 'create_users', 'user-new.php');\n\t} elseif ( is_multisite() ) {\n\t\t$submenu['profile.php'][10] = array(__('Add New User'), 'promote_users', 'user-new.php');\n\t}\n}\n\n$menu[75] = array( __('Tools'), 'edit_posts', 'tools.php', '', 'menu-top menu-icon-tools', 'menu-tools', 'dashicons-admin-tools' );\n\t$submenu['tools.php'][5] = array( __('Available Tools'), 'edit_posts', 'tools.php' );\n\t$submenu['tools.php'][10] = array( __('Import'), 'import', 'import.php' );\n\t$submenu['tools.php'][15] = array( __('Export'), 'export', 'export.php' );\n\tif ( is_multisite() && !is_main_site() )\n\t\t$submenu['tools.php'][25] = array( __('Delete Site'), 'delete_site', 'ms-delete-site.php' );\n\tif ( ! is_multisite() && defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE )\n\t\t$submenu['tools.php'][50] = array(__('Network Setup'), 'manage_options', 'network.php');\n\n$menu[80] = array( __('Settings'), 'manage_options', 'options-general.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings' );\n\t$submenu['options-general.php'][10] = array(_x('General', 'settings screen'), 'manage_options', 'options-general.php');\n\t$submenu['options-general.php'][15] = array(__('Writing'), 'manage_options', 'options-writing.php');\n\t$submenu['options-general.php'][20] = array(__('Reading'), 'manage_options', 'options-reading.php');\n\t$submenu['options-general.php'][25] = array(__('Discussion'), 'manage_options', 'options-discussion.php');\n\t$submenu['options-general.php'][30] = array(__('Media'), 'manage_options', 'options-media.php');\n\t$submenu['options-general.php'][40] = array(__('Permalinks'), 'manage_options', 'options-permalink.php');\n\n$_wp_last_utility_menu = 80; // The index of the last top-level menu in the utility menu group\n\n$menu[99] = array( '', 'read', 'separator-last', '', 'wp-menu-separator' );\n\n// Back-compat for old top-levels\n$_wp_real_parent_file['post.php'] = 'edit.php';\n$_wp_real_parent_file['post-new.php'] = 'edit.php';\n$_wp_real_parent_file['edit-pages.php'] = 'edit.php?post_type=page';\n$_wp_real_parent_file['page-new.php'] = 'edit.php?post_type=page';\n$_wp_real_parent_file['wpmu-admin.php'] = 'tools.php';\n$_wp_real_parent_file['ms-admin.php'] = 'tools.php';\n\n// ensure we're backwards compatible\n$compat = array(\n\t'index' => 'dashboard',\n\t'edit' => 'posts',\n\t'post' => 'posts',\n\t'upload' => 'media',\n\t'link-manager' => 'links',\n\t'edit-pages' => 'pages',\n\t'page' => 'pages',\n\t'edit-comments' => 'comments',\n\t'options-general' => 'settings',\n\t'themes' => 'appearance',\n\t);\n\nrequire_once(ABSPATH . 'wp-admin/includes/menu.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/moderation.php",
    "content": "<?php\n/**\n * Comment Moderation Administration Screen.\n *\n * Redirects to edit-comments.php?comment_status=moderated.\n *\n * @package WordPress\n * @subpackage Administration\n */\nrequire_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );\nwp_redirect( admin_url('edit-comments.php?comment_status=moderated') );\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/ms-admin.php",
    "content": "<?php\n/**\n * Multisite administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_redirect( network_admin_url() );\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/ms-delete-site.php",
    "content": "<?php\n/**\n * Multisite delete site panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( !is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can( 'delete_site' ) )\n\twp_die(__( 'You do not have sufficient permissions to delete this site.'));\n\nif ( isset( $_GET['h'] ) && $_GET['h'] != '' && get_option( 'delete_blog_hash' ) != false ) {\n\tif ( get_option( 'delete_blog_hash' ) == $_GET['h'] ) {\n\t\twpmu_delete_blog( $wpdb->blogid );\n\t\twp_die( sprintf( __( 'Thank you for using %s, your site has been deleted. Happy trails to you until we meet again.' ), $current_site->site_name ) );\n\t} else {\n\t\twp_die( __( \"I'm sorry, the link you clicked is stale. Please select another option.\" ) );\n\t}\n}\n\n$blog = get_blog_details();\n$user = wp_get_current_user();\n\n$title = __( 'Delete Site' );\n$parent_file = 'tools.php';\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\necho '<div class=\"wrap\">';\necho '<h1>' . esc_html( $title ) . '</h1>';\n\nif ( isset( $_POST['action'] ) && $_POST['action'] == 'deleteblog' && isset( $_POST['confirmdelete'] ) && $_POST['confirmdelete'] == '1' ) {\n\tcheck_admin_referer( 'delete-blog' );\n\n\t$hash = wp_generate_password( 20, false );\n\tupdate_option( 'delete_blog_hash', $hash );\n\n\t$url_delete = esc_url( admin_url( 'ms-delete-site.php?h=' . $hash ) );\n\n\t/* translators: Do not translate USERNAME, URL_DELETE, SITE_NAME: those are placeholders. */\n\t$content = __( \"Howdy ###USERNAME###,\n\nYou recently clicked the 'Delete Site' link on your site and filled in a\nform on that page.\n\nIf you really want to delete your site, click the link below. You will not\nbe asked to confirm again so only click this link if you are absolutely certain:\n###URL_DELETE###\n\nIf you delete your site, please consider opening a new site here\nsome time in the future! (But remember your current site and username\nare gone forever.)\n\nThanks for using the site,\nWebmaster\n###SITE_NAME###\" );\n\t/**\n\t * Filter the email content sent when a site in a Multisite network is deleted.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $content The email content that will be sent to the user who deleted a site in a Multisite network.\n\t */\n\t$content = apply_filters( 'delete_site_email_content', $content );\n\n\t$content = str_replace( '###USERNAME###', $user->user_login, $content );\n\t$content = str_replace( '###URL_DELETE###', $url_delete, $content );\n\t$content = str_replace( '###SITE_NAME###', $current_site->site_name, $content );\n\n\twp_mail( get_option( 'admin_email' ), \"[ \" . wp_specialchars_decode( get_option( 'blogname' ) ) . \" ] \".__( 'Delete My Site' ), $content );\n\t?>\n\n\t<p><?php _e( 'Thank you. Please check your email for a link to confirm your action. Your site will not be deleted until this link is clicked.' ) ?></p>\n\n<?php } else {\n\t?>\n\t<p><?php printf( __( 'If you do not want to use your %s site any more, you can delete it using the form below. When you click <strong>Delete My Site Permanently</strong> you will be sent an email with a link in it. Click on this link to delete your site.'), $current_site->site_name); ?></p>\n\t<p><?php _e( 'Remember, once deleted your site cannot be restored.' ) ?></p>\n\n\t<form method=\"post\" name=\"deletedirect\">\n\t\t<?php wp_nonce_field( 'delete-blog' ) ?>\n\t\t<input type=\"hidden\" name=\"action\" value=\"deleteblog\" />\n\t\t<p><input id=\"confirmdelete\" type=\"checkbox\" name=\"confirmdelete\" value=\"1\" /> <label for=\"confirmdelete\"><strong><?php printf( __( \"I'm sure I want to permanently disable my site, and I am aware I can never get it back or use %s again.\" ), is_subdomain_install() ? $blog->domain : $blog->domain . $blog->path ); ?></strong></label></p>\n\t\t<?php submit_button( __( 'Delete My Site Permanently' ) ); ?>\n\t</form>\n \t<?php\n}\necho '</div>';\n\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/ms-edit.php",
    "content": "<?php\n/**\n * Action handler for Multisite administration panels.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_redirect( network_admin_url() );\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/ms-options.php",
    "content": "<?php\n/**\n * Multisite network settings administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_redirect( network_admin_url('settings.php') );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/ms-sites.php",
    "content": "<?php\n/**\n * Multisite sites administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_redirect( network_admin_url('sites.php') );\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/ms-themes.php",
    "content": "<?php\n/**\n * Multisite themes administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_redirect( network_admin_url('themes.php') );\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/ms-upgrade-network.php",
    "content": "<?php\n/**\n * Multisite upgrade administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_redirect( network_admin_url('upgrade.php') );\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/ms-users.php",
    "content": "<?php\n/**\n * Multisite users administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_redirect( network_admin_url('users.php') );\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/my-sites.php",
    "content": "<?php\n/**\n * My Sites dashboard.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( !is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can('read') )\n\twp_die( __( 'You do not have sufficient permissions to access this page.' ) );\n\n$action = isset( $_POST['action'] ) ? $_POST['action'] : 'splash';\n\n$blogs = get_blogs_of_user( $current_user->ID );\n\n$updated = false;\nif ( 'updateblogsettings' == $action && isset( $_POST['primary_blog'] ) ) {\n\tcheck_admin_referer( 'update-my-sites' );\n\n\t$blog = get_blog_details( (int) $_POST['primary_blog'] );\n\tif ( $blog && isset( $blog->domain ) ) {\n\t\tupdate_user_option( $current_user->ID, 'primary_blog', (int) $_POST['primary_blog'], true );\n\t\t$updated = true;\n\t} else {\n\t\twp_die( __( 'The primary site you chose does not exist.' ) );\n\t}\n}\n\n$title = __( 'My Sites' );\n$parent_file = 'index.php';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('This screen shows an individual user all of their sites in this network, and also allows that user to set a primary site. They can use the links under each site to visit either the frontend or the dashboard for that site.') . '</p>' .\n\t\t'<p>' . __('Up until WordPress version 3.0, what is now called a Multisite Network had to be installed separately as WordPress MU (multi-user).') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Dashboard_My_Sites_Screen\" target=\"_blank\">Documentation on My Sites</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\nif ( $updated ) { ?>\n\t<div id=\"message\" class=\"updated notice is-dismissible\"><p><strong><?php _e( 'Settings saved.' ); ?></strong></p></div>\n<?php } ?>\n\n<div class=\"wrap\">\n<h1><?php\necho esc_html( $title );\n\nif ( in_array( get_site_option( 'registration' ), array( 'all', 'blog' ) ) ) {\n\t/** This filter is documented in wp-login.php */\n\t$sign_up_url = apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) );\n\tprintf( ' <a href=\"%s\" class=\"page-title-action\">%s</a>', esc_url( $sign_up_url ), esc_html_x( 'Add New', 'site' ) );\n}\n?></h1>\n\n<?php\nif ( empty( $blogs ) ) :\n\techo '<p>';\n\t_e( 'You must be a member of at least one site to use this page.' );\n\techo '</p>';\nelse :\n?>\n<form id=\"myblogs\" method=\"post\">\n\t<?php\n\tchoose_primary_blog();\n\t/**\n\t * Fires before the sites list on the My Sites screen.\n\t *\n\t * @since 3.0.0\n\t */\n\tdo_action( 'myblogs_allblogs_options' );\n\t?>\n\t<br clear=\"all\" />\n\t<ul class=\"my-sites striped\">\n\t<?php\n\t/**\n\t * Enable the Global Settings section on the My Sites screen.\n\t *\n\t * By default, the Global Settings section is hidden. Passing a non-empty\n\t * string to this filter will enable the section, and allow new settings\n\t * to be added, either globally or for specific sites.\n\t *\n\t * @since MU\n\t *\n\t * @param string $settings_html The settings HTML markup. Default empty.\n\t * @param object $context       Context of the setting (global or site-specific). Default 'global'.\n\t */\n\t$settings_html = apply_filters( 'myblogs_options', '', 'global' );\n\tif ( $settings_html != '' ) {\n\t\techo '<h3>' . __( 'Global Settings' ) . '</h3>';\n\t\techo $settings_html;\n\t}\n\treset( $blogs );\n\n\tforeach ( $blogs as $user_blog ) {\n\t\techo \"<li>\";\n\t\techo \"<h3>{$user_blog->blogname}</h3>\";\n\t\t/**\n\t\t * Filter the row links displayed for each site on the My Sites screen.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param string $string    The HTML site link markup.\n\t\t * @param object $user_blog An object containing the site data.\n\t\t */\n\t\techo \"<p class='my-sites-actions'>\" . apply_filters( 'myblogs_blog_actions', \"<a href='\" . esc_url( get_home_url( $user_blog->userblog_id ) ). \"'>\" . __( 'Visit' ) . \"</a> | <a href='\" . esc_url( get_admin_url( $user_blog->userblog_id ) ) . \"'>\" . __( 'Dashboard' ) . \"</a>\", $user_blog ) . \"</p>\";\n\t\t/** This filter is documented in wp-admin/my-sites.php */\n\t\techo apply_filters( 'myblogs_options', '', $user_blog );\n\t\techo \"</li>\";\n\t}?>\n\t</ul>\n\t<?php\n\tif ( count( $blogs ) > 1 || has_action( 'myblogs_allblogs_options' ) || has_filter( 'myblogs_options' ) ) {\n\t\t?><input type=\"hidden\" name=\"action\" value=\"updateblogsettings\" /><?php\n\t\twp_nonce_field( 'update-my-sites' );\n\t\tsubmit_button();\n\t}\n\t?>\n\t</form>\n<?php endif; ?>\n\t</div>\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/nav-menus.php",
    "content": "<?php\n/**\n * WordPress Administration for Navigation Menus\n * Interface functions\n *\n * @version 2.0.0\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n// Load all the nav menu interface functions\nrequire_once( ABSPATH . 'wp-admin/includes/nav-menu.php' );\n\nif ( ! current_theme_supports( 'menus' ) && ! current_theme_supports( 'widgets' ) )\n\twp_die( __( 'Your theme does not support navigation menus or widgets.' ) );\n\n// Permissions Check\nif ( ! current_user_can( 'edit_theme_options' ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to edit theme options on this site.' ) . '</p>',\n\t\t403\n\t);\n}\n\nwp_enqueue_script( 'nav-menu' );\n\nif ( wp_is_mobile() )\n\twp_enqueue_script( 'jquery-touch-punch' );\n\n// Container for any messages displayed to the user\n$messages = array();\n\n// Container that stores the name of the active menu\n$nav_menu_selected_title = '';\n\n// The menu id of the current menu being edited\n$nav_menu_selected_id = isset( $_REQUEST['menu'] ) ? (int) $_REQUEST['menu'] : 0;\n\n// Get existing menu locations assignments\n$locations = get_registered_nav_menus();\n$menu_locations = get_nav_menu_locations();\n$num_locations = count( array_keys( $locations ) );\n\n// Allowed actions: add, update, delete\n$action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : 'edit';\n\nswitch ( $action ) {\n\tcase 'add-menu-item':\n\t\tcheck_admin_referer( 'add-menu_item', 'menu-settings-column-nonce' );\n\t\tif ( isset( $_REQUEST['nav-menu-locations'] ) )\n\t\t\tset_theme_mod( 'nav_menu_locations', array_map( 'absint', $_REQUEST['menu-locations'] ) );\n\t\telseif ( isset( $_REQUEST['menu-item'] ) )\n\t\t\twp_save_nav_menu_items( $nav_menu_selected_id, $_REQUEST['menu-item'] );\n\t\tbreak;\n\tcase 'move-down-menu-item' :\n\n\t\t// Moving down a menu item is the same as moving up the next in order.\n\t\tcheck_admin_referer( 'move-menu_item' );\n\t\t$menu_item_id = isset( $_REQUEST['menu-item'] ) ? (int) $_REQUEST['menu-item'] : 0;\n\t\tif ( is_nav_menu_item( $menu_item_id ) ) {\n\t\t\t$menus = isset( $_REQUEST['menu'] ) ? array( (int) $_REQUEST['menu'] ) : wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );\n\t\t\tif ( ! is_wp_error( $menus ) && ! empty( $menus[0] ) ) {\n\t\t\t\t$menu_id = (int) $menus[0];\n\t\t\t\t$ordered_menu_items = wp_get_nav_menu_items( $menu_id );\n\t\t\t\t$menu_item_data = (array) wp_setup_nav_menu_item( get_post( $menu_item_id ) );\n\n\t\t\t\t// Set up the data we need in one pass through the array of menu items.\n\t\t\t\t$dbids_to_orders = array();\n\t\t\t\t$orders_to_dbids = array();\n\t\t\t\tforeach ( (array) $ordered_menu_items as $ordered_menu_item_object ) {\n\t\t\t\t\tif ( isset( $ordered_menu_item_object->ID ) ) {\n\t\t\t\t\t\tif ( isset( $ordered_menu_item_object->menu_order ) ) {\n\t\t\t\t\t\t\t$dbids_to_orders[$ordered_menu_item_object->ID] = $ordered_menu_item_object->menu_order;\n\t\t\t\t\t\t\t$orders_to_dbids[$ordered_menu_item_object->menu_order] = $ordered_menu_item_object->ID;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Get next in order.\n\t\t\t\tif (\n\t\t\t\t\tisset( $orders_to_dbids[$dbids_to_orders[$menu_item_id] + 1] )\n\t\t\t\t) {\n\t\t\t\t\t$next_item_id = $orders_to_dbids[$dbids_to_orders[$menu_item_id] + 1];\n\t\t\t\t\t$next_item_data = (array) wp_setup_nav_menu_item( get_post( $next_item_id ) );\n\n\t\t\t\t\t// If not siblings of same parent, bubble menu item up but keep order.\n\t\t\t\t\tif (\n\t\t\t\t\t\t! empty( $menu_item_data['menu_item_parent'] ) &&\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tempty( $next_item_data['menu_item_parent'] ) ||\n\t\t\t\t\t\t\t$next_item_data['menu_item_parent'] != $menu_item_data['menu_item_parent']\n\t\t\t\t\t\t)\n\t\t\t\t\t) {\n\n\t\t\t\t\t\t$parent_db_id = in_array( $menu_item_data['menu_item_parent'], $orders_to_dbids ) ? (int) $menu_item_data['menu_item_parent'] : 0;\n\n\t\t\t\t\t\t$parent_object = wp_setup_nav_menu_item( get_post( $parent_db_id ) );\n\n\t\t\t\t\t\tif ( ! is_wp_error( $parent_object ) ) {\n\t\t\t\t\t\t\t$parent_data = (array) $parent_object;\n\t\t\t\t\t\t\t$menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent'];\n\t\t\t\t\t\t\tupdate_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Make menu item a child of its next sibling.\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$next_item_data['menu_order'] = $next_item_data['menu_order'] - 1;\n\t\t\t\t\t\t$menu_item_data['menu_order'] = $menu_item_data['menu_order'] + 1;\n\n\t\t\t\t\t\t$menu_item_data['menu_item_parent'] = $next_item_data['ID'];\n\t\t\t\t\t\tupdate_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );\n\n\t\t\t\t\t\twp_update_post($menu_item_data);\n\t\t\t\t\t\twp_update_post($next_item_data);\n\t\t\t\t\t}\n\n\t\t\t\t// The item is last but still has a parent, so bubble up.\n\t\t\t\t} elseif (\n\t\t\t\t\t! empty( $menu_item_data['menu_item_parent'] ) &&\n\t\t\t\t\tin_array( $menu_item_data['menu_item_parent'], $orders_to_dbids )\n\t\t\t\t) {\n\t\t\t\t\t$menu_item_data['menu_item_parent'] = (int) get_post_meta( $menu_item_data['menu_item_parent'], '_menu_item_menu_item_parent', true);\n\t\t\t\t\tupdate_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbreak;\n\tcase 'move-up-menu-item' :\n\t\tcheck_admin_referer( 'move-menu_item' );\n\t\t$menu_item_id = isset( $_REQUEST['menu-item'] ) ? (int) $_REQUEST['menu-item'] : 0;\n\t\tif ( is_nav_menu_item( $menu_item_id ) ) {\n\t\t\t$menus = isset( $_REQUEST['menu'] ) ? array( (int) $_REQUEST['menu'] ) : wp_get_object_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );\n\t\t\tif ( ! is_wp_error( $menus ) && ! empty( $menus[0] ) ) {\n\t\t\t\t$menu_id = (int) $menus[0];\n\t\t\t\t$ordered_menu_items = wp_get_nav_menu_items( $menu_id );\n\t\t\t\t$menu_item_data = (array) wp_setup_nav_menu_item( get_post( $menu_item_id ) );\n\n\t\t\t\t// Set up the data we need in one pass through the array of menu items.\n\t\t\t\t$dbids_to_orders = array();\n\t\t\t\t$orders_to_dbids = array();\n\t\t\t\tforeach ( (array) $ordered_menu_items as $ordered_menu_item_object ) {\n\t\t\t\t\tif ( isset( $ordered_menu_item_object->ID ) ) {\n\t\t\t\t\t\tif ( isset( $ordered_menu_item_object->menu_order ) ) {\n\t\t\t\t\t\t\t$dbids_to_orders[$ordered_menu_item_object->ID] = $ordered_menu_item_object->menu_order;\n\t\t\t\t\t\t\t$orders_to_dbids[$ordered_menu_item_object->menu_order] = $ordered_menu_item_object->ID;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If this menu item is not first.\n\t\t\t\tif ( ! empty( $dbids_to_orders[$menu_item_id] ) && ! empty( $orders_to_dbids[$dbids_to_orders[$menu_item_id] - 1] ) ) {\n\n\t\t\t\t\t// If this menu item is a child of the previous.\n\t\t\t\t\tif (\n\t\t\t\t\t\t! empty( $menu_item_data['menu_item_parent'] ) &&\n\t\t\t\t\t\tin_array( $menu_item_data['menu_item_parent'], array_keys( $dbids_to_orders ) ) &&\n\t\t\t\t\t\tisset( $orders_to_dbids[$dbids_to_orders[$menu_item_id] - 1] ) &&\n\t\t\t\t\t\t( $menu_item_data['menu_item_parent'] == $orders_to_dbids[$dbids_to_orders[$menu_item_id] - 1] )\n\t\t\t\t\t) {\n\t\t\t\t\t\t$parent_db_id = in_array( $menu_item_data['menu_item_parent'], $orders_to_dbids ) ? (int) $menu_item_data['menu_item_parent'] : 0;\n\t\t\t\t\t\t$parent_object = wp_setup_nav_menu_item( get_post( $parent_db_id ) );\n\n\t\t\t\t\t\tif ( ! is_wp_error( $parent_object ) ) {\n\t\t\t\t\t\t\t$parent_data = (array) $parent_object;\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * If there is something before the parent and parent a child of it,\n\t\t\t\t\t\t\t * make menu item a child also of it.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t! empty( $dbids_to_orders[$parent_db_id] ) &&\n\t\t\t\t\t\t\t\t! empty( $orders_to_dbids[$dbids_to_orders[$parent_db_id] - 1] ) &&\n\t\t\t\t\t\t\t\t! empty( $parent_data['menu_item_parent'] )\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t$menu_item_data['menu_item_parent'] = $parent_data['menu_item_parent'];\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t * Else if there is something before parent and parent not a child of it,\n\t\t\t\t\t\t\t * make menu item a child of that something's parent\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t} elseif (\n\t\t\t\t\t\t\t\t! empty( $dbids_to_orders[$parent_db_id] ) &&\n\t\t\t\t\t\t\t\t! empty( $orders_to_dbids[$dbids_to_orders[$parent_db_id] - 1] )\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t$_possible_parent_id = (int) get_post_meta( $orders_to_dbids[$dbids_to_orders[$parent_db_id] - 1], '_menu_item_menu_item_parent', true);\n\t\t\t\t\t\t\t\tif ( in_array( $_possible_parent_id, array_keys( $dbids_to_orders ) ) )\n\t\t\t\t\t\t\t\t\t$menu_item_data['menu_item_parent'] = $_possible_parent_id;\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t$menu_item_data['menu_item_parent'] = 0;\n\n\t\t\t\t\t\t\t// Else there isn't something before the parent.\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$menu_item_data['menu_item_parent'] = 0;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Set former parent's [menu_order] to that of menu-item's.\n\t\t\t\t\t\t\t$parent_data['menu_order'] = $parent_data['menu_order'] + 1;\n\n\t\t\t\t\t\t\t// Set menu-item's [menu_order] to that of former parent.\n\t\t\t\t\t\t\t$menu_item_data['menu_order'] = $menu_item_data['menu_order'] - 1;\n\n\t\t\t\t\t\t\t// Save changes.\n\t\t\t\t\t\t\tupdate_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );\n\t\t\t\t\t\t\twp_update_post($menu_item_data);\n\t\t\t\t\t\t\twp_update_post($parent_data);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Else this menu item is not a child of the previous.\n\t\t\t\t\t} elseif (\n\t\t\t\t\t\tempty( $menu_item_data['menu_order'] ) ||\n\t\t\t\t\t\tempty( $menu_item_data['menu_item_parent'] ) ||\n\t\t\t\t\t\t! in_array( $menu_item_data['menu_item_parent'], array_keys( $dbids_to_orders ) ) ||\n\t\t\t\t\t\tempty( $orders_to_dbids[$dbids_to_orders[$menu_item_id] - 1] ) ||\n\t\t\t\t\t\t$orders_to_dbids[$dbids_to_orders[$menu_item_id] - 1] != $menu_item_data['menu_item_parent']\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Just make it a child of the previous; keep the order.\n\t\t\t\t\t\t$menu_item_data['menu_item_parent'] = (int) $orders_to_dbids[$dbids_to_orders[$menu_item_id] - 1];\n\t\t\t\t\t\tupdate_post_meta( $menu_item_data['ID'], '_menu_item_menu_item_parent', (int) $menu_item_data['menu_item_parent'] );\n\t\t\t\t\t\twp_update_post($menu_item_data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\n\tcase 'delete-menu-item':\n\t\t$menu_item_id = (int) $_REQUEST['menu-item'];\n\n\t\tcheck_admin_referer( 'delete-menu_item_' . $menu_item_id );\n\n\t\tif ( is_nav_menu_item( $menu_item_id ) && wp_delete_post( $menu_item_id, true ) )\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __('The menu item has been successfully deleted.') . '</p></div>';\n\t\tbreak;\n\n\tcase 'delete':\n\t\tcheck_admin_referer( 'delete-nav_menu-' . $nav_menu_selected_id );\n\t\tif ( is_nav_menu( $nav_menu_selected_id ) ) {\n\t\t\t$deletion = wp_delete_nav_menu( $nav_menu_selected_id );\n\t\t} else {\n\t\t\t// Reset the selected menu.\n\t\t\t$nav_menu_selected_id = 0;\n\t\t\tunset( $_REQUEST['menu'] );\n\t\t}\n\n\t\tif ( ! isset( $deletion ) )\n\t\t\tbreak;\n\n\t\tif ( is_wp_error( $deletion ) )\n\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . $deletion->get_error_message() . '</p></div>';\n\t\telse\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __( 'The menu has been successfully deleted.' ) . '</p></div>';\n\t\tbreak;\n\n\tcase 'delete_menus':\n\t\tcheck_admin_referer( 'nav_menus_bulk_actions' );\n\t\tforeach ( $_REQUEST['delete_menus'] as $menu_id_to_delete ) {\n\t\t\tif ( ! is_nav_menu( $menu_id_to_delete ) )\n\t\t\t\tcontinue;\n\n\t\t\t$deletion = wp_delete_nav_menu( $menu_id_to_delete );\n\t\t\tif ( is_wp_error( $deletion ) ) {\n\t\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . $deletion->get_error_message() . '</p></div>';\n\t\t\t\t$deletion_error = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $deletion_error ) )\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __( 'Selected menus have been successfully deleted.' ) . '</p></div>';\n\t\tbreak;\n\n\tcase 'update':\n\t\tcheck_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' );\n\n\t\t// Remove menu locations that have been unchecked.\n\t\tforeach ( $locations as $location => $description ) {\n\t\t\tif ( ( empty( $_POST['menu-locations'] ) || empty( $_POST['menu-locations'][ $location ] ) ) && isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] == $nav_menu_selected_id )\n\t\t\t\tunset( $menu_locations[ $location ] );\n\t\t}\n\n\t\t// Merge new and existing menu locations if any new ones are set.\n\t\tif ( isset( $_POST['menu-locations'] ) ) {\n\t\t\t$new_menu_locations = array_map( 'absint', $_POST['menu-locations'] );\n\t\t\t$menu_locations = array_merge( $menu_locations, $new_menu_locations );\n\t\t}\n\n\t\t// Set menu locations.\n\t\tset_theme_mod( 'nav_menu_locations', $menu_locations );\n\n\t\t// Add Menu.\n\t\tif ( 0 == $nav_menu_selected_id ) {\n\t\t\t$new_menu_title = trim( esc_html( $_POST['menu-name'] ) );\n\n\t\t\tif ( $new_menu_title ) {\n\t\t\t\t$_nav_menu_selected_id = wp_update_nav_menu_object( 0, array('menu-name' => $new_menu_title) );\n\n\t\t\t\tif ( is_wp_error( $_nav_menu_selected_id ) ) {\n\t\t\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . $_nav_menu_selected_id->get_error_message() . '</p></div>';\n\t\t\t\t} else {\n\t\t\t\t\t$_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id );\n\t\t\t\t\t$nav_menu_selected_id = $_nav_menu_selected_id;\n\t\t\t\t\t$nav_menu_selected_title = $_menu_object->name;\n\t\t\t\t\tif ( isset( $_REQUEST['menu-item'] ) )\n\t\t\t\t\t\twp_save_nav_menu_items( $nav_menu_selected_id, absint( $_REQUEST['menu-item'] ) );\n\t\t\t\t\tif ( isset( $_REQUEST['zero-menu-state'] ) ) {\n\t\t\t\t\t\t// If there are menu items, add them\n\t\t\t\t\t\twp_nav_menu_update_menu_items( $nav_menu_selected_id, $nav_menu_selected_title );\n\t\t\t\t\t\t// Auto-save nav_menu_locations\n\t\t\t\t\t\t$locations = get_nav_menu_locations();\n\t\t\t\t\t\tforeach ( $locations as $location => $menu_id ) {\n\t\t\t\t\t\t\t\t$locations[ $location ] = $nav_menu_selected_id;\n\t\t\t\t\t\t\t\tbreak; // There should only be 1\n\t\t\t\t\t\t}\n\t\t\t\t\t\tset_theme_mod( 'nav_menu_locations', $locations );\n\t\t\t\t\t}\n\t\t\t\t\tif ( isset( $_REQUEST['use-location'] ) ) {\n\t\t\t\t\t\t$locations = get_registered_nav_menus();\n\t\t\t\t\t\t$menu_locations = get_nav_menu_locations();\n\t\t\t\t\t\tif ( isset( $locations[ $_REQUEST['use-location'] ] ) )\n\t\t\t\t\t\t\t$menu_locations[ $_REQUEST['use-location'] ] = $nav_menu_selected_id;\n\t\t\t\t\t\tset_theme_mod( 'nav_menu_locations', $menu_locations );\n\t\t\t\t\t}\n\n\t\t\t\t\t// $messages[] = '<div id=\"message\" class=\"updated\"><p>' . sprintf( __( '<strong>%s</strong> has been created.' ), $nav_menu_selected_title ) . '</p></div>';\n\t\t\t\t\twp_redirect( admin_url( 'nav-menus.php?menu=' . $_nav_menu_selected_id ) );\n\t\t\t\t\texit();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'Please enter a valid menu name.' ) . '</p></div>';\n\t\t\t}\n\n\t\t// Update existing menu.\n\t\t} else {\n\n\t\t\t$_menu_object = wp_get_nav_menu_object( $nav_menu_selected_id );\n\n\t\t\t$menu_title = trim( esc_html( $_POST['menu-name'] ) );\n\t\t\tif ( ! $menu_title ) {\n\t\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'Please enter a valid menu name.' ) . '</p></div>';\n\t\t\t\t$menu_title = $_menu_object->name;\n\t\t\t}\n\n\t\t\tif ( ! is_wp_error( $_menu_object ) ) {\n\t\t\t\t$_nav_menu_selected_id = wp_update_nav_menu_object( $nav_menu_selected_id, array( 'menu-name' => $menu_title ) );\n\t\t\t\tif ( is_wp_error( $_nav_menu_selected_id ) ) {\n\t\t\t\t\t$_menu_object = $_nav_menu_selected_id;\n\t\t\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . $_nav_menu_selected_id->get_error_message() . '</p></div>';\n\t\t\t\t} else {\n\t\t\t\t\t$_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id );\n\t\t\t\t\t$nav_menu_selected_title = $_menu_object->name;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update menu items.\n\t\t\tif ( ! is_wp_error( $_menu_object ) ) {\n\t\t\t\t$messages = array_merge( $messages, wp_nav_menu_update_menu_items( $_nav_menu_selected_id, $nav_menu_selected_title ) );\n\n\t\t\t\t// If the menu ID changed, redirect to the new URL.\n\t\t\t\tif ( $nav_menu_selected_id != $_nav_menu_selected_id ) {\n\t\t\t\t\twp_redirect( admin_url( 'nav-menus.php?menu=' . intval( $_nav_menu_selected_id ) ) );\n\t\t\t\t\texit();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase 'locations':\n\t\tif ( ! $num_locations ) {\n\t\t\twp_redirect( admin_url( 'nav-menus.php' ) );\n\t\t\texit();\n\t\t}\n\n\t\tadd_filter( 'screen_options_show_screen', '__return_false' );\n\n\t\tif ( isset( $_POST['menu-locations'] ) ) {\n\t\t\tcheck_admin_referer( 'save-menu-locations' );\n\n\t\t\t$new_menu_locations = array_map( 'absint', $_POST['menu-locations'] );\n\t\t\t$menu_locations = array_merge( $menu_locations, $new_menu_locations );\n\t\t\t// Set menu locations\n\t\t\tset_theme_mod( 'nav_menu_locations', $menu_locations );\n\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __( 'Menu locations updated.' ) . '</p></div>';\n\t\t}\n\t\tbreak;\n}\n\n// Get all nav menus.\n$nav_menus = wp_get_nav_menus();\n$menu_count = count( $nav_menus );\n\n// Are we on the add new screen?\n$add_new_screen = ( isset( $_GET['menu'] ) && 0 == $_GET['menu'] ) ? true : false;\n\n$locations_screen = ( isset( $_GET['action'] ) && 'locations' == $_GET['action'] ) ? true : false;\n\n/*\n * If we have one theme location, and zero menus, we take them right\n * into editing their first menu.\n */\n$page_count = wp_count_posts( 'page' );\n$one_theme_location_no_menus = ( 1 == count( get_registered_nav_menus() ) && ! $add_new_screen && empty( $nav_menus ) && ! empty( $page_count->publish ) ) ? true : false;\n\n$nav_menus_l10n = array(\n\t'oneThemeLocationNoMenus' => $one_theme_location_no_menus,\n\t'moveUp'       => __( 'Move up one' ),\n\t'moveDown'     => __( 'Move down one' ),\n\t'moveToTop'    => __( 'Move to the top' ),\n\t/* translators: %s: previous item name */\n\t'moveUnder'    => __( 'Move under %s' ),\n\t/* translators: %s: previous item name */\n\t'moveOutFrom'  => __( 'Move out from under %s' ),\n\t/* translators: %s: previous item name */\n\t'under'        => __( 'Under %s' ),\n\t/* translators: %s: previous item name */\n\t'outFrom'      => __( 'Out from under %s' ),\n\t/* translators: 1: item name, 2: item position, 3: total number of items */\n\t'menuFocus'    => __( '%1$s. Menu item %2$d of %3$d.' ),\n\t/* translators: 1: item name, 2: item position, 3: parent item name */\n\t'subMenuFocus' => __( '%1$s. Sub item number %2$d under %3$s.' ),\n);\nwp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n );\n\n/*\n * Redirect to add screen if there are no menus and this users has either zero,\n * or more than 1 theme locations.\n */\nif ( 0 == $menu_count && ! $add_new_screen && ! $one_theme_location_no_menus )\n\twp_redirect( admin_url( 'nav-menus.php?action=edit&menu=0' ) );\n\n// Get recently edited nav menu.\n$recently_edited = absint( get_user_option( 'nav_menu_recently_edited' ) );\nif ( empty( $recently_edited ) && is_nav_menu( $nav_menu_selected_id ) )\n\t$recently_edited = $nav_menu_selected_id;\n\n// Use $recently_edited if none are selected.\nif ( empty( $nav_menu_selected_id ) && ! isset( $_GET['menu'] ) && is_nav_menu( $recently_edited ) )\n\t$nav_menu_selected_id = $recently_edited;\n\n// On deletion of menu, if another menu exists, show it.\nif ( ! $add_new_screen && 0 < $menu_count && isset( $_GET['action'] ) && 'delete' == $_GET['action'] )\n\t$nav_menu_selected_id = $nav_menus[0]->term_id;\n\n// Set $nav_menu_selected_id to 0 if no menus.\nif ( $one_theme_location_no_menus ) {\n\t$nav_menu_selected_id = 0;\n} elseif ( empty( $nav_menu_selected_id ) && ! empty( $nav_menus ) && ! $add_new_screen ) {\n\t// if we have no selection yet, and we have menus, set to the first one in the list.\n\t$nav_menu_selected_id = $nav_menus[0]->term_id;\n}\n\n// Update the user's setting.\nif ( $nav_menu_selected_id != $recently_edited && is_nav_menu( $nav_menu_selected_id ) )\n\tupdate_user_meta( $current_user->ID, 'nav_menu_recently_edited', $nav_menu_selected_id );\n\n// If there's a menu, get its name.\nif ( ! $nav_menu_selected_title && is_nav_menu( $nav_menu_selected_id ) ) {\n\t$_menu_object = wp_get_nav_menu_object( $nav_menu_selected_id );\n\t$nav_menu_selected_title = ! is_wp_error( $_menu_object ) ? $_menu_object->name : '';\n}\n\n// Generate truncated menu names.\nforeach ( (array) $nav_menus as $key => $_nav_menu ) {\n\t$nav_menus[$key]->truncated_name = wp_html_excerpt( $_nav_menu->name, 40, '&hellip;' );\n}\n\n// Retrieve menu locations.\nif ( current_theme_supports( 'menus' ) ) {\n\t$locations = get_registered_nav_menus();\n\t$menu_locations = get_nav_menu_locations();\n}\n\n/*\n * Ensure the user will be able to scroll horizontally\n * by adding a class for the max menu depth.\n *\n * @global int $_wp_nav_menu_max_depth\n */\nglobal $_wp_nav_menu_max_depth;\n$_wp_nav_menu_max_depth = 0;\n\n// Calling wp_get_nav_menu_to_edit generates $_wp_nav_menu_max_depth.\nif ( is_nav_menu( $nav_menu_selected_id ) ) {\n\t$menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array( 'post_status' => 'any' ) );\n\t$edit_markup = wp_get_nav_menu_to_edit( $nav_menu_selected_id );\n}\n\n/**\n *\n * @global int $_wp_nav_menu_max_depth\n *\n * @param string $classes\n * @return string\n */\nfunction wp_nav_menu_max_depth( $classes ) {\n\tglobal $_wp_nav_menu_max_depth;\n\treturn \"$classes menu-max-depth-$_wp_nav_menu_max_depth\";\n}\n\nadd_filter('admin_body_class', 'wp_nav_menu_max_depth');\n\nwp_nav_menu_setup();\nwp_initial_nav_menu_meta_boxes();\n\nif ( ! current_theme_supports( 'menus' ) && ! $num_locations )\n\t$messages[] = '<div id=\"message\" class=\"updated\"><p>' . sprintf( __( 'Your theme does not natively support menus, but you can use them in sidebars by adding a &#8220;Custom Menu&#8221; widget on the <a href=\"%s\">Widgets</a> screen.' ), admin_url( 'widgets.php' ) ) . '</p></div>';\n\nif ( ! $locations_screen ) : // Main tab\n\t$overview  = '<p>' . __( 'This screen is used for managing your custom navigation menus.' ) . '</p>';\n\t$overview .= '<p>' . sprintf( __( 'Menus can be displayed in locations defined by your theme, even used in sidebars by adding a &#8220;Custom Menu&#8221; widget on the <a href=\"%1$s\">Widgets</a> screen. If your theme does not support the custom menus feature (the default themes, %2$s and %3$s, do), you can learn about adding this support by following the Documentation link to the side.' ), admin_url( 'widgets.php' ), 'Twenty Fifteen', 'Twenty Fourteen' ) . '</p>';\n\t$overview .= '<p>' . __( 'From this screen you can:' ) . '</p>';\n\t$overview .= '<ul><li>' . __( 'Create, edit, and delete menus' ) . '</li>';\n\t$overview .= '<li>' . __( 'Add, organize, and modify individual menu items' ) . '</li></ul>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'overview',\n\t\t'title'   => __( 'Overview' ),\n\t\t'content' => $overview\n\t) );\n\n\t$menu_management  = '<p>' . __( 'The menu management box at the top of the screen is used to control which menu is opened in the editor below.' ) . '</p>';\n\t$menu_management .= '<ul><li>' . __( 'To edit an existing menu, <strong>choose a menu from the drop down and click Select</strong>' ) . '</li>';\n\t$menu_management .= '<li>' . __( 'If you haven&#8217;t yet created any menus, <strong>click the &#8217;create a new menu&#8217; link</strong> to get started' ) . '</li></ul>';\n\t$menu_management .= '<p>' . __( 'You can assign theme locations to individual menus by <strong>selecting the desired settings</strong> at the bottom of the menu editor. To assign menus to all theme locations at once, <strong>visit the Manage Locations tab</strong> at the top of the screen.' ) . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'menu-management',\n\t\t'title'   => __( 'Menu Management' ),\n\t\t'content' => $menu_management\n\t) );\n\n\t$editing_menus  = '<p>' . __( 'Each custom menu may contain a mix of links to pages, categories, custom URLs or other content types. Menu links are added by selecting items from the expanding boxes in the left-hand column below.' ) . '</p>';\n\t$editing_menus .= '<p>' . __( '<strong>Clicking the arrow to the right of any menu item</strong> in the editor will reveal a standard group of settings. Additional settings such as link target, CSS classes, link relationships, and link descriptions can be enabled and disabled via the Screen Options tab.' ) . '</p>';\n\t$editing_menus .= '<ul><li>' . __( 'Add one or several items at once by <strong>selecting the checkbox next to each item and clicking Add to Menu</strong>' ) . '</li>';\n\t$editing_menus .= '<li>' . __( 'To add a custom link, <strong>expand the Custom Links section, enter a URL and link text, and click Add to Menu</strong>' ) .'</li>';\n\t$editing_menus .= '<li>' . __( 'To reorganize menu items, <strong>drag and drop items with your mouse or use your keyboard</strong>. Drag or move a menu item a little to the right to make it a submenu' ) . '</li>';\n\t$editing_menus .= '<li>' . __( 'Delete a menu item by <strong>expanding it and clicking the Remove link</strong>' ) . '</li></ul>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'editing-menus',\n\t\t'title'   => __( 'Editing Menus' ),\n\t\t'content' => $editing_menus\n\t) );\nelse : // Locations Tab.\n\t$locations_overview  = '<p>' . __( 'This screen is used for globally assigning menus to locations defined by your theme.' ) . '</p>';\n\t$locations_overview .= '<ul><li>' . __( 'To assign menus to one or more theme locations, <strong>select a menu from each location&#8217;s drop down.</strong> When you&#8217;re finished, <strong>click Save Changes</strong>' ) . '</li>';\n\t$locations_overview .= '<li>' . __( 'To edit a menu currently assigned to a theme location, <strong>click the adjacent &#8217;Edit&#8217; link</strong>' ) . '</li>';\n\t$locations_overview .= '<li>' . __( 'To add a new menu instead of assigning an existing one, <strong>click the &#8217;Use new menu&#8217; link</strong>. Your new menu will be automatically assigned to that theme location' ) . '</li></ul>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'locations-overview',\n\t\t'title'   => __( 'Overview' ),\n\t\t'content' => $locations_overview\n\t) );\nendif;\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Appearance_Menus_Screen\" target=\"_blank\">Documentation on Menus</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\n// Get the admin header.\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n<div class=\"wrap\">\n\t<h1><?php echo esc_html( __( 'Menus' ) ); ?>\n\t\t<?php\n\t\tif ( current_user_can( 'customize' ) ) :\n\t\t\t$focus = $locations_screen ? array( 'section' => 'menu_locations' ) : array( 'panel' => 'nav_menus' );\n\t\t\tprintf(\n\t\t\t\t' <a class=\"page-title-action hide-if-no-customize\" href=\"%1$s\">%2$s</a>',\n\t\t\t\tesc_url( add_query_arg( array(\n\t\t\t\t\tarray( 'autofocus' => $focus ),\n\t\t\t\t\t'return' => urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),\n\t\t\t\t), admin_url( 'customize.php' ) ) ),\n\t\t\t\t__( 'Manage in Customizer' )\n\t\t\t);\n\t\tendif;\n\t\t?>\n\t</h1>\n\t<h2 class=\"nav-tab-wrapper\">\n\t\t<a href=\"<?php echo admin_url( 'nav-menus.php' ); ?>\" class=\"nav-tab<?php if ( ! isset( $_GET['action'] ) || isset( $_GET['action'] ) && 'locations' != $_GET['action'] ) echo ' nav-tab-active'; ?>\"><?php esc_html_e( 'Edit Menus' ); ?></a>\n\t\t<?php if ( $num_locations && $menu_count ) : ?>\n\t\t\t<a href=\"<?php echo esc_url( add_query_arg( array( 'action' => 'locations' ), admin_url( 'nav-menus.php' ) ) ); ?>\" class=\"nav-tab<?php if ( $locations_screen ) echo ' nav-tab-active'; ?>\"><?php esc_html_e( 'Manage Locations' ); ?></a>\n\t\t<?php\n\t\t\tendif;\n\t\t?>\n\t</h2>\n\t<?php\n\tforeach ( $messages as $message ) :\n\t\techo $message . \"\\n\";\n\tendforeach;\n\t?>\n\t<?php\n\tif ( $locations_screen ) :\n\t\tif ( 1 == $num_locations ) {\n\t\t\techo '<p>' . __( 'Your theme supports one menu. Select which menu you would like to use.' ) . '</p>';\n\t\t} else {\n\t\t\techo '<p>' .  sprintf( _n( 'Your theme supports %s menu. Select which menu appears in each location.', 'Your theme supports %s menus. Select which menu appears in each location.', $num_locations ), number_format_i18n( $num_locations ) ) . '</p>';\n\t\t}\n\t?>\n\t<div id=\"menu-locations-wrap\">\n\t\t<form method=\"post\" action=\"<?php echo esc_url( add_query_arg( array( 'action' => 'locations' ), admin_url( 'nav-menus.php' ) ) ); ?>\">\n\t\t\t<table class=\"widefat fixed\" id=\"menu-locations-table\">\n\t\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th scope=\"col\" class=\"manage-column column-locations\"><?php _e( 'Theme Location' ); ?></th>\n\t\t\t\t\t<th scope=\"col\" class=\"manage-column column-menus\"><?php _e( 'Assigned Menu' ); ?></th>\n\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody class=\"menu-locations\">\n\t\t\t\t<?php foreach ( $locations as $_location => $_name ) { ?>\n\t\t\t\t\t<tr class=\"menu-locations-row\">\n\t\t\t\t\t\t<td class=\"menu-location-title\"><label for=\"locations-<?php echo $_location; ?>\"><?php echo $_name; ?></label></td>\n\t\t\t\t\t\t<td class=\"menu-location-menus\">\n\t\t\t\t\t\t\t<select name=\"menu-locations[<?php echo $_location; ?>]\" id=\"locations-<?php echo $_location; ?>\">\n\t\t\t\t\t\t\t\t<option value=\"0\"><?php printf( '&mdash; %s &mdash;', esc_html__( 'Select a Menu' ) ); ?></option>\n\t\t\t\t\t\t\t\t<?php foreach ( $nav_menus as $menu ) : ?>\n\t\t\t\t\t\t\t\t\t<?php $selected = isset( $menu_locations[$_location] ) && $menu_locations[$_location] == $menu->term_id; ?>\n\t\t\t\t\t\t\t\t\t<option <?php if ( $selected ) echo 'data-orig=\"true\"'; ?> <?php selected( $selected ); ?> value=\"<?php echo $menu->term_id; ?>\">\n\t\t\t\t\t\t\t\t\t\t<?php echo wp_html_excerpt( $menu->name, 40, '&hellip;' ); ?>\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<?php endforeach; ?>\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t<div class=\"locations-row-links\">\n\t\t\t\t\t\t\t\t<?php if ( isset( $menu_locations[ $_location ] ) && 0 != $menu_locations[ $_location ] ) : ?>\n\t\t\t\t\t\t\t\t<span class=\"locations-edit-menu-link\">\n\t\t\t\t\t\t\t\t\t<a href=\"<?php echo esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => $menu_locations[$_location] ), admin_url( 'nav-menus.php' ) ) ); ?>\">\n\t\t\t\t\t\t\t\t\t\t<span aria-hidden=\"true\"><?php _ex( 'Edit', 'menu' ); ?></span><span class=\"screen-reader-text\"><?php _e( 'Edit selected menu' ); ?></span>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t\t<span class=\"locations-add-menu-link\">\n\t\t\t\t\t\t\t\t\t<a href=\"<?php echo esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0, 'use-location' => $_location ), admin_url( 'nav-menus.php' ) ) ); ?>\">\n\t\t\t\t\t\t\t\t\t\t<?php _ex( 'Use new menu', 'menu' ); ?>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div><!-- .locations-row-links -->\n\t\t\t\t\t\t</td><!-- .menu-location-menus -->\n\t\t\t\t\t</tr><!-- .menu-locations-row -->\n\t\t\t\t<?php } // foreach ?>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t<p class=\"button-controls\"><?php submit_button( __( 'Save Changes' ), 'primary left', 'nav-menu-locations', false ); ?></p>\n\t\t\t<?php wp_nonce_field( 'save-menu-locations' ); ?>\n\t\t\t<input type=\"hidden\" name=\"menu\" id=\"nav-menu-meta-object-id\" value=\"<?php echo esc_attr( $nav_menu_selected_id ); ?>\" />\n\t\t</form>\n\t</div><!-- #menu-locations-wrap -->\n\t<?php\n\t/**\n\t * Fires after the menu locations table is displayed.\n\t *\n\t * @since 3.6.0\n\t */\n\tdo_action( 'after_menu_locations_table' ); ?>\n\t<?php else : ?>\n\t<div class=\"manage-menus\">\n \t\t<?php if ( $menu_count < 2 ) : ?>\n\t\t<span class=\"add-edit-menu-action\">\n\t\t\t<?php printf( __( 'Edit your menu below, or <a href=\"%s\">create a new menu</a>.' ), esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0 ), admin_url( 'nav-menus.php' ) ) ) ); ?>\n\t\t</span><!-- /add-edit-menu-action -->\n\t\t<?php else : ?>\n\t\t\t<form method=\"get\" action=\"<?php echo admin_url( 'nav-menus.php' ); ?>\">\n\t\t\t<input type=\"hidden\" name=\"action\" value=\"edit\" />\n\t\t\t<label for=\"select-menu-to-edit\" class=\"selected-menu\"><?php _e( 'Select a menu to edit:' ); ?></label>\n\t\t\t<select name=\"menu\" id=\"select-menu-to-edit\">\n\t\t\t\t<?php if ( $add_new_screen ) : ?>\n\t\t\t\t\t<option value=\"0\" selected=\"selected\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n\t\t\t\t<?php endif; ?>\n\t\t\t\t<?php foreach ( (array) $nav_menus as $_nav_menu ) : ?>\n\t\t\t\t\t<option value=\"<?php echo esc_attr( $_nav_menu->term_id ); ?>\" <?php selected( $_nav_menu->term_id, $nav_menu_selected_id ); ?>>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\techo esc_html( $_nav_menu->truncated_name ) ;\n\n\t\t\t\t\t\tif ( ! empty( $menu_locations ) && in_array( $_nav_menu->term_id, $menu_locations ) ) {\n\t\t\t\t\t\t\t$locations_assigned_to_this_menu = array();\n\t\t\t\t\t\t\tforeach ( array_keys( $menu_locations, $_nav_menu->term_id ) as $menu_location_key ) {\n\t\t\t\t\t\t\t\tif ( isset( $locations[ $menu_location_key ] ) ) {\n\t\t\t\t\t\t\t\t\t$locations_assigned_to_this_menu[] = $locations[ $menu_location_key ];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * Filter the number of locations listed per menu in the drop-down select.\n\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t * @since 3.6.0\n\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t * @param int $locations Number of menu locations to list. Default 3.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t$assigned_locations = array_slice( $locations_assigned_to_this_menu, 0, absint( apply_filters( 'wp_nav_locations_listed_per_menu', 3 ) ) );\n\n\t\t\t\t\t\t\t// Adds ellipses following the number of locations defined in $assigned_locations.\n\t\t\t\t\t\t\tif ( ! empty( $assigned_locations ) ) {\n\t\t\t\t\t\t\t\tprintf( ' (%1$s%2$s)',\n\t\t\t\t\t\t\t\t\timplode( ', ', $assigned_locations ),\n\t\t\t\t\t\t\t\t\tcount( $locations_assigned_to_this_menu ) > count( $assigned_locations ) ? ' &hellip;' : ''\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t?>\n\t\t\t\t\t</option>\n\t\t\t\t<?php endforeach; ?>\n\t\t\t</select>\n\t\t\t<span class=\"submit-btn\"><input type=\"submit\" class=\"button-secondary\" value=\"<?php esc_attr_e( 'Select' ); ?>\"></span>\n\t\t\t<span class=\"add-new-menu-action\">\n\t\t\t\t<?php printf( __( 'or <a href=\"%s\">create a new menu</a>.' ), esc_url( add_query_arg( array( 'action' => 'edit', 'menu' => 0 ), admin_url( 'nav-menus.php' ) ) ) ); ?>\n\t\t\t</span><!-- /add-new-menu-action -->\n\t\t</form>\n\t<?php endif; ?>\n\t</div><!-- /manage-menus -->\n\t<div id=\"nav-menus-frame\">\n\t<div id=\"menu-settings-column\" class=\"metabox-holder<?php if ( isset( $_GET['menu'] ) && '0' == $_GET['menu'] ) { echo ' metabox-holder-disabled'; } ?>\">\n\n\t\t<div class=\"clear\"></div>\n\n\t\t<form id=\"nav-menu-meta\" class=\"nav-menu-meta\" method=\"post\" enctype=\"multipart/form-data\">\n\t\t\t<input type=\"hidden\" name=\"menu\" id=\"nav-menu-meta-object-id\" value=\"<?php echo esc_attr( $nav_menu_selected_id ); ?>\" />\n\t\t\t<input type=\"hidden\" name=\"action\" value=\"add-menu-item\" />\n\t\t\t<?php wp_nonce_field( 'add-menu_item', 'menu-settings-column-nonce' ); ?>\n\t\t\t<?php do_accordion_sections( 'nav-menus', 'side', null ); ?>\n\t\t</form>\n\n\t</div><!-- /#menu-settings-column -->\n\t<div id=\"menu-management-liquid\">\n\t\t<div id=\"menu-management\">\n\t\t\t<form id=\"update-nav-menu\" method=\"post\" enctype=\"multipart/form-data\">\n\t\t\t\t<div class=\"menu-edit <?php if ( $add_new_screen ) echo 'blank-slate'; ?>\">\n\t\t\t\t\t<?php\n\t\t\t\t\twp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );\n\t\t\t\t\twp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );\n\t\t\t\t\twp_nonce_field( 'update-nav_menu', 'update-nav-menu-nonce' );\n\n\t\t\t\t\tif ( $one_theme_location_no_menus ) { ?>\n\t\t\t\t\t\t<input type=\"hidden\" name=\"zero-menu-state\" value=\"true\" />\n\t\t\t\t\t<?php } ?>\n \t\t\t\t\t<input type=\"hidden\" name=\"action\" value=\"update\" />\n\t\t\t\t\t<input type=\"hidden\" name=\"menu\" id=\"menu\" value=\"<?php echo esc_attr( $nav_menu_selected_id ); ?>\" />\n\t\t\t\t\t<div id=\"nav-menu-header\">\n\t\t\t\t\t\t<div class=\"major-publishing-actions\">\n\t\t\t\t\t\t\t<label class=\"menu-name-label howto open-label\" for=\"menu-name\">\n\t\t\t\t\t\t\t\t<span><?php _e( 'Menu Name' ); ?></span>\n\t\t\t\t\t\t\t\t<input name=\"menu-name\" id=\"menu-name\" type=\"text\" class=\"menu-name regular-text menu-item-textbox input-with-default-title\" title=\"<?php esc_attr_e( 'Enter menu name here' ); ?>\" value=\"<?php if ( $one_theme_location_no_menus ) _e( 'Menu 1' ); else echo esc_attr( $nav_menu_selected_title ); ?>\" />\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div class=\"publishing-action\">\n\t\t\t\t\t\t\t\t<?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_header' ) ); ?>\n\t\t\t\t\t\t\t</div><!-- END .publishing-action -->\n\t\t\t\t\t\t</div><!-- END .major-publishing-actions -->\n\t\t\t\t\t</div><!-- END .nav-menu-header -->\n\t\t\t\t\t<div id=\"post-body\">\n\t\t\t\t\t\t<div id=\"post-body-content\">\n\t\t\t\t\t\t\t<?php if ( ! $add_new_screen ) : ?>\n\t\t\t\t\t\t\t<h3><?php _e( 'Menu Structure' ); ?></h3>\n\t\t\t\t\t\t\t<?php $starter_copy = ( $one_theme_location_no_menus ) ? __( 'Edit your default menu by adding or removing items. Drag each item into the order you prefer. Click Create Menu to save your changes.' ) : __( 'Drag each item into the order you prefer. Click the arrow on the right of the item to reveal additional configuration options.' ); ?>\n\t\t\t\t\t\t\t<div class=\"drag-instructions post-body-plain\" <?php if ( isset( $menu_items ) && 0 == count( $menu_items ) ) { ?>style=\"display: none;\"<?php } ?>>\n\t\t\t\t\t\t\t\t<p><?php echo $starter_copy; ?></p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\tif ( isset( $edit_markup ) && ! is_wp_error( $edit_markup ) ) {\n\t\t\t\t\t\t\t\techo $edit_markup;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t<ul class=\"menu\" id=\"menu-to-edit\"></ul>\n\t\t\t\t\t\t\t<?php } ?>\n\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t<?php if ( $add_new_screen ) : ?>\n\t\t\t\t\t\t\t\t<p class=\"post-body-plain\"><?php _e( 'Give your menu a name above, then click Create Menu.' ); ?></p>\n\t\t\t\t\t\t\t\t<?php if ( isset( $_GET['use-location'] ) ) : ?>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"use-location\" value=\"<?php echo esc_attr( $_GET['use-location'] ); ?>\" />\n\t\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t<div class=\"menu-settings\" <?php if ( $one_theme_location_no_menus ) { ?>style=\"display: none;\"<?php } ?>>\n\t\t\t\t\t\t\t\t<h3><?php _e( 'Menu Settings' ); ?></h3>\n\t\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\tif ( ! isset( $auto_add ) ) {\n\t\t\t\t\t\t\t\t\t$auto_add = get_option( 'nav_menu_options' );\n\t\t\t\t\t\t\t\t\tif ( ! isset( $auto_add['auto_add'] ) )\n\t\t\t\t\t\t\t\t\t\t$auto_add = false;\n\t\t\t\t\t\t\t\t\telseif ( false !== array_search( $nav_menu_selected_id, $auto_add['auto_add'] ) )\n\t\t\t\t\t\t\t\t\t\t$auto_add = true;\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t$auto_add = false;\n\t\t\t\t\t\t\t\t} ?>\n\n\t\t\t\t\t\t\t\t<dl class=\"auto-add-pages\">\n\t\t\t\t\t\t\t\t\t<dt class=\"howto\"><?php _e( 'Auto add pages' ); ?></dt>\n\t\t\t\t\t\t\t\t\t<dd class=\"checkbox-input\"><input type=\"checkbox\"<?php checked( $auto_add ); ?> name=\"auto-add-pages\" id=\"auto-add-pages\" value=\"1\" /> <label for=\"auto-add-pages\"><?php printf( __('Automatically add new top-level pages to this menu' ), esc_url( admin_url( 'edit.php?post_type=page' ) ) ); ?></label></dd>\n\t\t\t\t\t\t\t\t</dl>\n\n\t\t\t\t\t\t\t\t<?php if ( current_theme_supports( 'menus' ) ) : ?>\n\n\t\t\t\t\t\t\t\t\t<dl class=\"menu-theme-locations\">\n\t\t\t\t\t\t\t\t\t\t<dt class=\"howto\"><?php _e( 'Theme locations' ); ?></dt>\n\t\t\t\t\t\t\t\t\t\t<?php foreach ( $locations as $location => $description ) : ?>\n\t\t\t\t\t\t\t\t\t\t<dd class=\"checkbox-input\">\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"checkbox\"<?php checked( isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] == $nav_menu_selected_id ); ?> name=\"menu-locations[<?php echo esc_attr( $location ); ?>]\" id=\"locations-<?php echo esc_attr( $location ); ?>\" value=\"<?php echo esc_attr( $nav_menu_selected_id ); ?>\" />\n\t\t\t\t\t\t\t\t\t\t\t<label for=\"locations-<?php echo esc_attr( $location ); ?>\"><?php echo $description; ?></label>\n\t\t\t\t\t\t\t\t\t\t\t<?php if ( ! empty( $menu_locations[ $location ] ) && $menu_locations[ $location ] != $nav_menu_selected_id ) : ?>\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"theme-location-set\"><?php \n\t\t\t\t\t\t\t\t\t\t\t\t\t/* translators: %s: menu name */\n\t\t\t\t\t\t\t\t\t\t\t\t\tprintf( _x( '(Currently set to: %s)', 'menu location' ),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twp_get_nav_menu_object( $menu_locations[ $location ] )->name\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t?></span>\n\t\t\t\t\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t\t\t\t\t<?php endforeach; ?>\n\t\t\t\t\t\t\t\t\t</dl>\n\n\t\t\t\t\t\t\t\t<?php endif; ?>\n\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div><!-- /#post-body-content -->\n\t\t\t\t\t</div><!-- /#post-body -->\n\t\t\t\t\t<div id=\"nav-menu-footer\">\n\t\t\t\t\t\t<div class=\"major-publishing-actions\">\n\t\t\t\t\t\t\t<?php if ( 0 != $menu_count && ! $add_new_screen ) : ?>\n\t\t\t\t\t\t\t<span class=\"delete-action\">\n\t\t\t\t\t\t\t\t<a class=\"submitdelete deletion menu-delete\" href=\"<?php echo esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'delete', 'menu' => $nav_menu_selected_id, admin_url() ) ), 'delete-nav_menu-' . $nav_menu_selected_id) ); ?>\"><?php _e('Delete Menu'); ?></a>\n\t\t\t\t\t\t\t</span><!-- END .delete-action -->\n\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t<div class=\"publishing-action\">\n\t\t\t\t\t\t\t\t<?php submit_button( empty( $nav_menu_selected_id ) ? __( 'Create Menu' ) : __( 'Save Menu' ), 'button-primary menu-save', 'save_menu', false, array( 'id' => 'save_menu_footer' ) ); ?>\n\t\t\t\t\t\t\t</div><!-- END .publishing-action -->\n\t\t\t\t\t\t</div><!-- END .major-publishing-actions -->\n\t\t\t\t\t</div><!-- /#nav-menu-footer -->\n\t\t\t\t</div><!-- /.menu-edit -->\n\t\t\t</form><!-- /#update-nav-menu -->\n\t\t</div><!-- /#menu-management -->\n\t</div><!-- /#menu-management-liquid -->\n\t</div><!-- /#nav-menus-frame -->\n\t<?php endif; ?>\n</div><!-- /.wrap-->\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/about.php",
    "content": "<?php\n/**\n * Network About administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.4.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/about.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/admin.php",
    "content": "<?php\n/**\n * WordPress Network Administration Bootstrap\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\ndefine( 'WP_NETWORK_ADMIN', true );\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( dirname( __FILE__ ) ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\n$redirect_network_admin_request = 0 !== strcasecmp( $current_blog->domain, $current_site->domain ) || 0 !== strcasecmp( $current_blog->path, $current_site->path );\n\n/**\n * Filter whether to redirect the request to the Network Admin.\n *\n * @since 3.2.0\n *\n * @param bool $redirect_network_admin_request Whether the request should be redirected.\n */\n$redirect_network_admin_request = apply_filters( 'redirect_network_admin_request', $redirect_network_admin_request );\nif ( $redirect_network_admin_request ) {\n\twp_redirect( network_admin_url() );\n\texit;\n}\nunset( $redirect_network_admin_request );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/credits.php",
    "content": "<?php\n/**\n * Network Credits administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.4.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/credits.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/edit.php",
    "content": "<?php\n/**\n * Action handler for Multisite administration panels.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( empty( $_GET['action'] ) ) {\n\twp_redirect( network_admin_url() );\n\texit;\n}\n\n/**\n * Fires just before the action handler in several Network Admin screens.\n *\n * This hook fires on multiple screens in the Multisite Network Admin,\n * including Users, Network Settings, and Site Settings.\n *\n * @since 3.0.0\n */\ndo_action( 'wpmuadminedit' );\n\n/**\n * Fires the requested handler action.\n *\n * The dynamic portion of the hook name, `$_GET['action']`, refers to the name\n * of the requested action.\n *\n * @since 3.1.0\n */\ndo_action( 'network_admin_edit_' . $_GET['action'] );\n\nwp_redirect( network_admin_url() );\nexit();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/freedoms.php",
    "content": "<?php\n/**\n * Network Freedoms administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.4.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/freedoms.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/index.php",
    "content": "<?php\n/**\n * Multisite administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n/** Load WordPress dashboard API */\nrequire_once( ABSPATH . 'wp-admin/includes/dashboard.php' );\n\nif ( !is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can( 'manage_network' ) )\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n$title = __( 'Dashboard' );\n$parent_file = 'index.php';\n\n$overview = '<p>' . __( 'Welcome to your Network Admin. This area of the Administration Screens is used for managing all aspects of your Multisite Network.' ) . '</p>';\n$overview .= '<p>' . __( 'From here you can:' ) . '</p>';\n$overview .= '<ul><li>' . __( 'Add and manage sites or users' ) . '</li>';\n$overview .= '<li>' . __( 'Install and activate themes or plugins' ) . '</li>';\n$overview .= '<li>' . __( 'Update your network' ) . '</li>';\n$overview .= '<li>' . __( 'Modify global network settings' ) . '</li></ul>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __( 'Overview' ),\n\t'content' => $overview\n) );\n\n$quick_tasks = '<p>' . __( 'The Right Now widget on this screen provides current user and site counts on your network.' ) . '</p>';\n$quick_tasks .= '<ul><li>' . __( 'To add a new user, <strong>click Create a New User</strong>.' ) . '</li>';\n$quick_tasks .= '<li>' . __( 'To add a new site, <strong>click Create a New Site</strong>.' ) . '</li></ul>';\n$quick_tasks .= '<p>' . __( 'To search for a user or site, use the search boxes.' ) . '</p>';\n$quick_tasks .= '<ul><li>' . __( 'To search for a user, <strong>enter an email address or username</strong>. Use a wildcard to search for a partial username, such as user&#42;.' ) . '</li>';\n$quick_tasks .= '<li>' . __( 'To search for a site, <strong>enter the path or domain</strong>.' ) . '</li></ul>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'quick-tasks',\n\t'title'   => __( 'Quick Tasks' ),\n\t'content' => $quick_tasks\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin\" target=\"_blank\">Documentation on the Network Admin</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nwp_dashboard_setup();\n\nwp_enqueue_script( 'dashboard' );\nwp_enqueue_script( 'plugin-install' );\nadd_thickbox();\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<div id=\"dashboard-widgets-wrap\">\n\n<?php wp_dashboard(); ?>\n\n<div class=\"clear\"></div>\n</div><!-- dashboard-widgets-wrap -->\n\n</div><!-- wrap -->\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/menu.php",
    "content": "<?php\n/**\n * Build Network Administration Menu.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/* translators: Network menu item */\n$menu[2] = array(__('Dashboard'), 'manage_network', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'dashicons-dashboard');\n\n$submenu['index.php'][0] = array( __( 'Home' ), 'read', 'index.php' );\n\n$update_data = wp_get_update_data();\nif ( $update_data['counts']['total'] ) {\n\t$submenu['index.php'][10] = array( sprintf( __( 'Updates %s' ), \"<span class='update-plugins count-{$update_data['counts']['total']}' title='{$update_data['title']}'><span class='update-count'>\" . number_format_i18n( $update_data['counts']['total'] ) . \"</span></span>\" ), 'update_core', 'update-core.php' );\n} else {\n\t$submenu['index.php'][10] = array( __( 'Updates' ), 'update_core', 'update-core.php' );\n}\n\n$submenu['index.php'][15] = array( __( 'Upgrade Network' ), 'manage_network', 'upgrade.php' );\n\n$menu[4] = array( '', 'read', 'separator1', '', 'wp-menu-separator' );\n\n/* translators: Sites menu item */\n$menu[5] = array(__('Sites'), 'manage_sites', 'sites.php', '', 'menu-top menu-icon-site', 'menu-site', 'dashicons-admin-network');\n$submenu['sites.php'][5]  = array( __('All Sites'), 'manage_sites', 'sites.php' );\n$submenu['sites.php'][10]  = array( _x('Add New', 'site'), 'create_sites', 'site-new.php' );\n\n$menu[10] = array(__('Users'), 'manage_network_users', 'users.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users');\n$submenu['users.php'][5]  = array( __('All Users'), 'manage_network_users', 'users.php' );\n$submenu['users.php'][10]  = array( _x('Add New', 'user'), 'create_users', 'user-new.php' );\n\nif ( current_user_can( 'update_themes' ) && $update_data['counts']['themes'] ) {\n\t$menu[15] = array(sprintf( __( 'Themes %s' ), \"<span class='update-plugins count-{$update_data['counts']['themes']}'><span class='theme-count'>\" . number_format_i18n( $update_data['counts']['themes'] ) . \"</span></span>\" ), 'manage_network_themes', 'themes.php', '', 'menu-top menu-icon-appearance', 'menu-appearance', 'dashicons-admin-appearance' );\n} else {\n\t$menu[15] = array( __( 'Themes' ), 'manage_network_themes', 'themes.php', '', 'menu-top menu-icon-appearance', 'menu-appearance', 'dashicons-admin-appearance' );\n}\n$submenu['themes.php'][5]  = array( __('Installed Themes'), 'manage_network_themes', 'themes.php' );\n$submenu['themes.php'][10] = array( _x('Add New', 'theme'), 'install_themes', 'theme-install.php' );\n$submenu['themes.php'][15] = array( _x('Editor', 'theme editor'), 'edit_themes', 'theme-editor.php' );\n\nif ( current_user_can( 'update_plugins' ) && $update_data['counts']['plugins'] ) {\n\t$menu[20] = array( sprintf( __( 'Plugins %s' ), \"<span class='update-plugins count-{$update_data['counts']['plugins']}'><span class='plugin-count'>\" . number_format_i18n( $update_data['counts']['plugins'] ) . \"</span></span>\" ), 'manage_network_plugins', 'plugins.php', '', 'menu-top menu-icon-plugins', 'menu-plugins', 'dashicons-admin-plugins');\n} else {\n\t$menu[20] = array( __('Plugins'), 'manage_network_plugins', 'plugins.php', '', 'menu-top menu-icon-plugins', 'menu-plugins', 'dashicons-admin-plugins' );\n}\n$submenu['plugins.php'][5]  = array( __('Installed Plugins'), 'manage_network_plugins', 'plugins.php' );\n$submenu['plugins.php'][10] = array( _x('Add New', 'plugin'), 'install_plugins', 'plugin-install.php' );\n$submenu['plugins.php'][15] = array( _x('Editor', 'plugin editor'), 'edit_plugins', 'plugin-editor.php' );\n\n$menu[25] = array(__('Settings'), 'manage_network_options', 'settings.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings');\nif ( defined( 'MULTISITE' ) && defined( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE ) {\n\t$submenu['settings.php'][5]  = array( __('Network Settings'), 'manage_network_options', 'settings.php' );\n\t$submenu['settings.php'][10] = array( __('Network Setup'), 'manage_network_options', 'setup.php' );\n}\nunset($update_data);\n\n$menu[99] = array( '', 'exist', 'separator-last', '', 'wp-menu-separator' );\n\nrequire_once(ABSPATH . 'wp-admin/includes/menu.php');"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/plugin-editor.php",
    "content": "<?php\n/**\n * Plugin editor network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/plugin-editor.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/plugin-install.php",
    "content": "<?php\n/**\n * Install plugin network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\nif ( isset( $_GET['tab'] ) && ( 'plugin-information' == $_GET['tab'] ) )\n\tdefine( 'IFRAME_REQUEST', true );\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/plugin-install.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/plugins.php",
    "content": "<?php\n/**\n * Network Plugins administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/plugins.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/profile.php",
    "content": "<?php\n/**\n * User profile network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/profile.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/settings.php",
    "content": "<?php\n/**\n * Multisite network settings administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n/** WordPress Translation Install API */\nrequire_once( ABSPATH . 'wp-admin/includes/translation-install.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can( 'manage_network_options' ) )\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n$title = __( 'Network Settings' );\n$parent_file = 'settings.php';\n\nadd_action( 'admin_head', 'network_settings_add_js' );\n\nget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'overview',\n\t\t'title'   => __('Overview'),\n\t\t'content' =>\n\t\t\t'<p>' . __('This screen sets and changes options for the network as a whole. The first site is the main site in the network and network options are pulled from that original site&#8217;s options.') . '</p>' .\n\t\t\t'<p>' . __('Operational settings has fields for the network&#8217;s name and admin email.') . '</p>' .\n\t\t\t'<p>' . __('Registration settings can disable/enable public signups. If you let others sign up for a site, install spam plugins. Spaces, not commas, should separate names banned as sites for this network.') . '</p>' .\n\t\t\t'<p>' . __('New site settings are defaults applied when a new site is created in the network. These include welcome email for when a new site or user account is registered, and what&#8127;s put in the first post, page, comment, comment author, and comment URL.') . '</p>' .\n\t\t\t'<p>' . __('Upload settings control the size of the uploaded files and the amount of available upload space for each site. You can change the default value for specific sites when you edit a particular site. Allowed file types are also listed (space separated only).') . '</p>' .\n\t\t\t'<p>' . __( 'You can set the language, and the translation files will be automatically downloaded and installed (available if your filesystem is writable).' ) . '</p>' .\n\t\t\t'<p>' . __('Menu setting enables/disables the plugin menus from appearing for non super admins, so that only super admins, not site admins, have access to activate plugins.') . '</p>' .\n\t\t\t'<p>' . __('Super admins can no longer be added on the Options screen. You must now go to the list of existing users on Network Admin > Users and click on Username or the Edit action link below that name. This goes to an Edit User page where you can check a box to grant super admin privileges.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Settings_Screen\" target=\"_blank\">Documentation on Network Settings</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nif ( $_POST ) {\n\t/** This action is documented in wp-admin/network/edit.php */\n\tdo_action( 'wpmuadminedit' );\n\n\tcheck_admin_referer( 'siteoptions' );\n\n\t$checked_options = array( 'menu_items' => array(), 'registrationnotification' => 'no', 'upload_space_check_disabled' => 1, 'add_new_users' => 0 );\n\tforeach ( $checked_options as $option_name => $option_unchecked_value ) {\n\t\tif ( ! isset( $_POST[$option_name] ) )\n\t\t\t$_POST[$option_name] = $option_unchecked_value;\n\t}\n\n\t$options = array(\n\t\t'registrationnotification', 'registration', 'add_new_users', 'menu_items',\n\t\t'upload_space_check_disabled', 'blog_upload_space', 'upload_filetypes', 'site_name',\n\t\t'first_post', 'first_page', 'first_comment', 'first_comment_url', 'first_comment_author',\n\t\t'welcome_email', 'welcome_user_email', 'fileupload_maxk', 'global_terms_enabled',\n\t\t'illegal_names', 'limited_email_domains', 'banned_email_domains', 'WPLANG', 'admin_email',\n\t);\n\n\t// Handle translation install.\n\tif ( ! empty( $_POST['WPLANG'] ) && wp_can_install_language_pack() ) {  // @todo: Skip if already installed\n\t\t$language = wp_download_language_pack( $_POST['WPLANG'] );\n\t\tif ( $language ) {\n\t\t\t$_POST['WPLANG'] = $language;\n\t\t}\n\t}\n\n\tforeach ( $options as $option_name ) {\n\t\tif ( ! isset($_POST[$option_name]) )\n\t\t\tcontinue;\n\t\t$value = wp_unslash( $_POST[$option_name] );\n\t\tupdate_site_option( $option_name, $value );\n\t}\n\n\t/**\n\t * Fires after the network options are updated.\n\t *\n\t * @since MU\n\t */\n\tdo_action( 'update_wpmu_options' );\n\n\twp_redirect( add_query_arg( 'updated', 'true', network_admin_url( 'settings.php' ) ) );\n\texit();\n}\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n\nif ( isset( $_GET['updated'] ) ) {\n\t?><div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e( 'Options saved.' ) ?></p></div><?php\n}\n?>\n\n<div class=\"wrap\">\n\t<h1><?php echo esc_html( $title ); ?></h1>\n\t<form method=\"post\" action=\"settings.php\" novalidate=\"novalidate\">\n\t\t<?php wp_nonce_field( 'siteoptions' ); ?>\n\t\t<h2><?php _e( 'Operational Settings' ); ?></h2>\n\t\t<table class=\"form-table\">\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"site_name\"><?php _e( 'Network Title' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<input name=\"site_name\" type=\"text\" id=\"site_name\" class=\"regular-text\" value=\"<?php echo esc_attr( $current_site->site_name ) ?>\" />\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"admin_email\"><?php _e( 'Network Admin Email' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<input name=\"admin_email\" type=\"email\" id=\"admin_email\" aria-describedby=\"admin-email-desc\" class=\"regular-text\" value=\"<?php echo esc_attr( get_site_option( 'admin_email' ) ) ?>\" />\n\t\t\t\t\t<p class=\"description\" id=\"admin-email-desc\">\n\t\t\t\t\t\t<?php _e( 'This email address will receive notifications. Registration and support emails will also come from this address.' ); ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</table>\n\t\t<h2><?php _e( 'Registration Settings' ); ?></h2>\n\t\t<table class=\"form-table\">\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><?php _e( 'Allow new registrations' ) ?></th>\n\t\t\t\t<?php\n\t\t\t\tif ( !get_site_option( 'registration' ) )\n\t\t\t\t\tupdate_site_option( 'registration', 'none' );\n\t\t\t\t$reg = get_site_option( 'registration' );\n\t\t\t\t?>\n\t\t\t\t<td>\n\t\t\t\t\t<fieldset>\n\t\t\t\t\t<legend class=\"screen-reader-text\"><?php _e( 'New registrations settings' ) ?></legend>\n\t\t\t\t\t<label><input name=\"registration\" type=\"radio\" id=\"registration1\" value=\"none\"<?php checked( $reg, 'none') ?> /> <?php _e( 'Registration is disabled.' ); ?></label><br />\n\t\t\t\t\t<label><input name=\"registration\" type=\"radio\" id=\"registration2\" value=\"user\"<?php checked( $reg, 'user') ?> /> <?php _e( 'User accounts may be registered.' ); ?></label><br />\n\t\t\t\t\t<label><input name=\"registration\" type=\"radio\" id=\"registration3\" value=\"blog\"<?php checked( $reg, 'blog') ?> /> <?php _e( 'Logged in users may register new sites.' ); ?></label><br />\n\t\t\t\t\t<label><input name=\"registration\" type=\"radio\" id=\"registration4\" value=\"all\"<?php checked( $reg, 'all') ?> /> <?php _e( 'Both sites and user accounts can be registered.' ); ?></label>\n\t\t\t\t\t<?php if ( is_subdomain_install() ) {\n\t\t\t\t\t\techo '<p class=\"description\">';\n\t\t\t\t\t\t/* translators: 1: NOBLOGREDIRECT 2: wp-config.php */\n\t\t\t\t\t\tprintf( __( 'If registration is disabled, please set %1$s in %2$s to a URL you will redirect visitors to if they visit a non-existent site.' ),\n\t\t\t\t\t\t\t'<code>NOBLOGREDIRECT</code>',\n\t\t\t\t\t\t\t'<code>wp-config.php</code>'\n\t\t\t\t\t\t);\n\t\t\t\t\t\techo '</p>';\n\t\t\t\t\t} ?>\n\t\t\t\t\t</fieldset>\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><?php _e( 'Registration notification' ) ?></th>\n\t\t\t\t<?php\n\t\t\t\tif ( !get_site_option( 'registrationnotification' ) )\n\t\t\t\t\tupdate_site_option( 'registrationnotification', 'yes' );\n\t\t\t\t?>\n\t\t\t\t<td>\n\t\t\t\t\t<label><input name=\"registrationnotification\" type=\"checkbox\" id=\"registrationnotification\" value=\"yes\"<?php checked( get_site_option( 'registrationnotification' ), 'yes' ) ?> /> <?php _e( 'Send the network admin an email notification every time someone registers a site or user account.' ) ?></label>\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t\t<tr id=\"addnewusers\">\n\t\t\t\t<th scope=\"row\"><?php _e( 'Add New Users' ) ?></th>\n\t\t\t\t<td>\n\t\t\t\t\t<label><input name=\"add_new_users\" type=\"checkbox\" id=\"add_new_users\" value=\"1\"<?php checked( get_site_option( 'add_new_users' ) ) ?> /> <?php _e( 'Allow site administrators to add new users to their site via the \"Users &rarr; Add New\" page.' ); ?></label>\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"illegal_names\"><?php _e( 'Banned Names' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<input name=\"illegal_names\" type=\"text\" id=\"illegal_names\" aria-describedby=\"illegal-names-desc\" class=\"large-text\" value=\"<?php echo esc_attr( implode( \" \", (array) get_site_option( 'illegal_names' ) ) ); ?>\" size=\"45\" />\n\t\t\t\t\t<p class=\"description\" id=\"illegal-names-desc\">\n\t\t\t\t\t\t<?php _e( 'Users are not allowed to register these sites. Separate names by spaces.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"limited_email_domains\"><?php _e( 'Limited Email Registrations' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<?php $limited_email_domains = get_site_option( 'limited_email_domains' );\n\t\t\t\t\t$limited_email_domains = str_replace( ' ', \"\\n\", $limited_email_domains ); ?>\n\t\t\t\t\t<textarea name=\"limited_email_domains\" id=\"limited_email_domains\" aria-describedby=\"limited-email-domains-desc\" cols=\"45\" rows=\"5\">\n<?php echo esc_textarea( $limited_email_domains == '' ? '' : implode( \"\\n\", (array) $limited_email_domains ) ); ?></textarea>\n\t\t\t\t\t<p class=\"description\" id=\"limited-email-domains-desc\">\n\t\t\t\t\t\t<?php _e( 'If you want to limit site registrations to certain domains. One domain per line.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"banned_email_domains\"><?php _e('Banned Email Domains') ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<textarea name=\"banned_email_domains\" id=\"banned_email_domains\" aria-describedby=\"banned-email-domains-desc\" cols=\"45\" rows=\"5\">\n<?php echo esc_textarea( get_site_option( 'banned_email_domains' ) == '' ? '' : implode( \"\\n\", (array) get_site_option( 'banned_email_domains' ) ) ); ?></textarea>\n\t\t\t\t\t<p class=\"description\" id=\"banned-email-domains-desc\">\n\t\t\t\t\t\t<?php _e( 'If you want to ban domains from site registrations. One domain per line.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t</table>\n\t\t<h2><?php _e( 'New Site Settings' ); ?></h2>\n\t\t<table class=\"form-table\">\n\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"welcome_email\"><?php _e( 'Welcome Email' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<textarea name=\"welcome_email\" id=\"welcome_email\" aria-describedby=\"welcome-email-desc\" rows=\"5\" cols=\"45\" class=\"large-text\">\n<?php echo esc_textarea( get_site_option( 'welcome_email' ) ) ?></textarea>\n\t\t\t\t\t<p class=\"description\" id=\"welcome-email-desc\">\n\t\t\t\t\t\t<?php _e( 'The welcome email sent to new site owners.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"welcome_user_email\"><?php _e( 'Welcome User Email' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<textarea name=\"welcome_user_email\" id=\"welcome_user_email\" aria-describedby=\"welcome-user-email-desc\" rows=\"5\" cols=\"45\" class=\"large-text\">\n<?php echo esc_textarea( get_site_option( 'welcome_user_email' ) ) ?></textarea>\n\t\t\t\t\t<p class=\"description\" id=\"welcome-user-email-desc\">\n\t\t\t\t\t\t<?php _e( 'The welcome email sent to new users.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"first_post\"><?php _e( 'First Post' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<textarea name=\"first_post\" id=\"first_post\" aria-describedby=\"first-post-desc\" rows=\"5\" cols=\"45\" class=\"large-text\">\n<?php echo esc_textarea( get_site_option( 'first_post' ) ) ?></textarea>\n\t\t\t\t\t<p class=\"description\" id=\"first-post-desc\">\n\t\t\t\t\t\t<?php _e( 'The first post on a new site.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"first_page\"><?php _e( 'First Page' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<textarea name=\"first_page\" id=\"first_page\" aria-describedby=\"first-page-desc\" rows=\"5\" cols=\"45\" class=\"large-text\">\n<?php echo esc_textarea( get_site_option( 'first_page' ) ) ?></textarea>\n\t\t\t\t\t<p class=\"description\" id=\"first-page-desc\">\n\t\t\t\t\t\t<?php _e( 'The first page on a new site.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"first_comment\"><?php _e( 'First Comment' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<textarea name=\"first_comment\" id=\"first_comment\" aria-describedby=\"first-comment-desc\" rows=\"5\" cols=\"45\" class=\"large-text\">\n<?php echo esc_textarea( get_site_option( 'first_comment' ) ) ?></textarea>\n\t\t\t\t\t<p class=\"description\" id=\"first-comment-desc\">\n\t\t\t\t\t\t<?php _e( 'The first comment on a new site.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"first_comment_author\"><?php _e( 'First Comment Author' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<input type=\"text\" size=\"40\" name=\"first_comment_author\" id=\"first_comment_author\" aria-describedby=\"first-comment-author-desc\" value=\"<?php echo get_site_option('first_comment_author') ?>\" />\n\t\t\t\t\t<p class=\"description\" id=\"first-comment-author-desc\">\n\t\t\t\t\t\t<?php _e( 'The author of the first comment on a new site.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"first_comment_url\"><?php _e( 'First Comment URL' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<input type=\"text\" size=\"40\" name=\"first_comment_url\" id=\"first_comment_url\" aria-describedby=\"first-comment-url-desc\" value=\"<?php echo esc_attr( get_site_option( 'first_comment_url' ) ) ?>\" />\n\t\t\t\t\t<p class=\"description\" id=\"first-comment-url-desc\">\n\t\t\t\t\t\t<?php _e( 'The URL for the first comment on a new site.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</table>\n\t\t<h2><?php _e( 'Upload Settings' ); ?></h2>\n\t\t<table class=\"form-table\">\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><?php _e( 'Site upload space' ) ?></th>\n\t\t\t\t<td>\n\t\t\t\t\t<label><input type=\"checkbox\" id=\"upload_space_check_disabled\" name=\"upload_space_check_disabled\" value=\"0\"<?php checked( (bool) get_site_option( 'upload_space_check_disabled' ), false ) ?>/> <?php printf( __( 'Limit total size of files uploaded to %s MB' ), '</label><label><input name=\"blog_upload_space\" type=\"number\" min=\"0\" style=\"width: 100px\" id=\"blog_upload_space\" aria-describedby=\"blog-upload-space-desc\" value=\"' . esc_attr( get_site_option('blog_upload_space', 100) ) . '\" />' ); ?></label><br />\n\t\t\t\t\t<p class=\"screen-reader-text\" id=\"blog-upload-space-desc\">\n\t\t\t\t\t\t<?php _e( 'Size in megabytes' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"upload_filetypes\"><?php _e( 'Upload file types' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<input name=\"upload_filetypes\" type=\"text\" id=\"upload_filetypes\" aria-describedby=\"upload-filetypes-desc\" class=\"large-text\" value=\"<?php echo esc_attr( get_site_option( 'upload_filetypes', 'jpg jpeg png gif' ) ) ?>\" size=\"45\" />\n\t\t\t\t\t<p class=\"description\" id=\"upload-filetypes-desc\">\n\t\t\t\t\t\t<?php _e( 'Allowed file types. Separate types by spaces.' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><label for=\"fileupload_maxk\"><?php _e( 'Max upload file size' ) ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<?php printf( _x( '%s KB', 'File size in kilobytes' ), '<input name=\"fileupload_maxk\" type=\"number\" min=\"0\" style=\"width: 100px\" id=\"fileupload_maxk\" aria-describedby=\"fileupload-maxk-desc\" value=\"' . esc_attr( get_site_option( 'fileupload_maxk', 300 ) ) . '\" />' ); ?>\n\t\t\t\t\t<p class=\"screen-reader-text\" id=\"fileupload-maxk-desc\">\n\t\t\t\t\t\t<?php _e( 'Size in kilobytes' ) ?>\n\t\t\t\t\t</p>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</table>\n\n\t\t<?php\n\t\t$languages = get_available_languages();\n\t\t$translations = wp_get_available_translations();\n\t\tif ( ! empty( $languages ) || ! empty( $translations ) ) {\n\t\t\t?>\n\t\t\t<h2><?php _e( 'Language Settings' ); ?></h2>\n\t\t\t<table class=\"form-table\">\n\t\t\t\t<tr>\n\t\t\t\t\t<th><label for=\"WPLANG\"><?php _e( 'Default Language' ); ?></label></th>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t$lang = get_site_option( 'WPLANG' );\n\t\t\t\t\t\tif ( ! in_array( $lang, $languages ) ) {\n\t\t\t\t\t\t\t$lang = '';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twp_dropdown_languages( array(\n\t\t\t\t\t\t\t'name'         => 'WPLANG',\n\t\t\t\t\t\t\t'id'           => 'WPLANG',\n\t\t\t\t\t\t\t'selected'     => $lang,\n\t\t\t\t\t\t\t'languages'    => $languages,\n\t\t\t\t\t\t\t'translations' => $translations,\n\t\t\t\t\t\t\t'show_available_translations' => wp_can_install_language_pack(),\n\t\t\t\t\t\t) );\n\t\t\t\t\t\t?>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<?php\n\t\t}\n\t\t?>\n\n\t\t<h2><?php _e( 'Menu Settings' ); ?></h2>\n\t\t<table id=\"menu\" class=\"form-table\">\n\t\t\t<tr>\n\t\t\t\t<th scope=\"row\"><?php _e( 'Enable administration menus' ); ?></th>\n\t\t\t\t<td>\n\t\t\t<?php\n\t\t\t$menu_perms = get_site_option( 'menu_items' );\n\t\t\t/**\n\t\t\t * Filter available network-wide administration menu options.\n\t\t\t *\n\t\t\t * Options returned to this filter are output as individual checkboxes that, when selected,\n\t\t\t * enable site administrator access to the specified administration menu in certain contexts.\n\t\t\t *\n\t\t\t * Adding options for specific menus here hinges on the appropriate checks and capabilities\n\t\t\t * being in place in the site dashboard on the other side. For instance, when the single\n\t\t\t * default option, 'plugins' is enabled, site administrators are granted access to the Plugins\n\t\t\t * screen in their individual sites' dashboards.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param array $admin_menus The menu items available.\n\t\t\t */\n\t\t\t$menu_items = apply_filters( 'mu_menu_items', array( 'plugins' => __( 'Plugins' ) ) );\n\t\t\t$fieldset_end = '';\n\t\t\tif ( count( (array) $menu_items ) > 1 ) {\n\t\t\t\techo '<fieldset><legend class=\"screen-reader-text\">' . __( 'Enable menus' ) . '</legend>';\n\t\t\t\t$fieldset_end = '</fieldset>';\n\t\t\t}\n\t\t\tforeach ( (array) $menu_items as $key => $val ) {\n\t\t\t\techo \"<label><input type='checkbox' name='menu_items[\" . $key . \"]' value='1'\" . ( isset( $menu_perms[$key] ) ? checked( $menu_perms[$key], '1', false ) : '' ) . \" /> \" . esc_html( $val ) . \"</label><br/>\";\n\t\t\t}\n\t\t\techo $fieldset_end;\n\t\t\t?>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</table>\n\n\t\t<?php\n\t\t/**\n\t\t * Fires at the end of the Network Settings form, before the submit button.\n\t\t *\n\t\t * @since MU\n\t\t */\n\t\tdo_action( 'wpmu_options' ); ?>\n\t\t<?php submit_button(); ?>\n\t</form>\n</div>\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/setup.php",
    "content": "<?php\n/**\n * Network Setup administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/network.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/site-info.php",
    "content": "<?php\n/**\n * Edit Site Info Administration Screen\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() ) {\n\twp_die( __( 'Multisite support is not enabled.' ) );\n}\n\nif ( ! current_user_can( 'manage_sites' ) ) {\n\twp_die( __( 'You do not have sufficient permissions to edit this site.' ) );\n}\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __( 'Overview' ),\n\t'content' =>\n\t\t'<p>' . __( 'The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.' ) . '</p>' .\n\t\t'<p>' . __( '<strong>Info</strong> &mdash; The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.' ) . '</p>' .\n\t\t'<p>' . __( '<strong>Users</strong> &mdash; This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.' ) . '</p>' .\n\t\t'<p>' . sprintf( __( '<strong>Themes</strong> &mdash; This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site&#8217;s Appearance menu. To enable a theme for the entire network, see the <a href=\"%s\">Network Themes</a> screen.' ), network_admin_url( 'themes.php' ) ) . '</p>' .\n\t\t'<p>' . __( '<strong>Settings</strong> &mdash; This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.' ) . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Network_Admin_Sites_Screen\" target=\"_blank\">Documentation on Site Management</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n);\n\n$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0;\n\nif ( ! $id ) {\n\twp_die( __('Invalid site ID.') );\n}\n\n$details = get_blog_details( $id );\nif ( ! $details ) {\n\twp_die( __( 'The requested site does not exist.' ) );\n}\n\nif ( ! can_edit_network( $details->site_id ) ) {\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n}\n\n$parsed_scheme = parse_url( $details->siteurl, PHP_URL_SCHEME );\n$is_main_site = is_main_site( $id );\n\nif ( isset( $_REQUEST['action'] ) && 'update-site' == $_REQUEST['action'] ) {\n\tcheck_admin_referer( 'edit-site' );\n\n\tswitch_to_blog( $id );\n\n\t// Rewrite rules can't be flushed during switch to blog.\n\tdelete_option( 'rewrite_rules' );\n\n\t$blog_data = wp_unslash( $_POST['blog'] );\n\t$blog_data['scheme'] = $parsed_scheme;\n\n\tif ( $is_main_site ) {\n\t\t// On the network's main site, don't allow the domain or path to change.\n\t\t$blog_data['domain'] = $details->domain;\n\t\t$blog_data['path'] = $details->path;\n\t} else {\n\t\t// For any other site, the scheme, domain, and path can all be changed. We first\n\t\t// need to ensure a scheme has been provided, otherwise fallback to the existing.\n\t\t$new_url_scheme = parse_url( $blog_data['url'], PHP_URL_SCHEME );\n\n\t\tif ( ! $new_url_scheme ) {\n\t\t\t$blog_data['url'] = esc_url( $parsed_scheme . '://' . $blog_data['url'] );\n\t\t}\n\t\t$update_parsed_url = parse_url( $blog_data['url'] );\n\n\t\t$blog_data['scheme'] = $update_parsed_url['scheme'];\n\t\t$blog_data['domain'] = $update_parsed_url['host'];\n\t\t$blog_data['path'] = $update_parsed_url['path'];\n\t}\n\n\t$existing_details = get_blog_details( $id, false );\n\t$blog_data_checkboxes = array( 'public', 'archived', 'spam', 'mature', 'deleted' );\n\tforeach ( $blog_data_checkboxes as $c ) {\n\t\tif ( ! in_array( $existing_details->$c, array( 0, 1 ) ) ) {\n\t\t\t$blog_data[ $c ] = $existing_details->$c;\n\t\t} else {\n\t\t\t$blog_data[ $c ] = isset( $_POST['blog'][ $c ] ) ? 1 : 0;\n\t\t}\n\t}\n\n\tupdate_blog_details( $id, $blog_data );\n\n\t// Maybe update home and siteurl options.\n\t$new_details = get_blog_details( $id, false );\n\n\t$old_home_url = trailingslashit( esc_url( get_option( 'home' ) ) );\n\t$old_home_parsed = parse_url( $old_home_url );\n\n\tif ( $old_home_parsed['host'] === $existing_details->domain && $old_home_parsed['path'] === $existing_details->path ) {\n\t\t$new_home_url = untrailingslashit( esc_url_raw( $blog_data['scheme'] . '://' . $new_details->domain . $new_details->path ) );\n\t\tupdate_option( 'home', $new_home_url );\n\t}\n\n\t$old_site_url = trailingslashit( esc_url( get_option( 'siteurl' ) ) );\n\t$old_site_parsed = parse_url( $old_site_url );\n\n\tif ( $old_site_parsed['host'] === $existing_details->domain && $old_site_parsed['path'] === $existing_details->path ) {\n\t\t$new_site_url = untrailingslashit( esc_url_raw( $blog_data['scheme'] . '://' . $new_details->domain . $new_details->path ) );\n\t\tupdate_option( 'siteurl', $new_site_url );\n\t}\n\n\trestore_current_blog();\n\twp_redirect( add_query_arg( array( 'update' => 'updated', 'id' => $id ), 'site-info.php' ) );\n\texit;\n}\n\nif ( isset( $_GET['update'] ) ) {\n\t$messages = array();\n\tif ( 'updated' == $_GET['update'] ) {\n\t\t$messages[] = __( 'Site info updated.' );\n\t}\n}\n\n$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );\n\n$parent_file = 'sites.php';\n$submenu_file = 'sites.php';\n\nrequire( ABSPATH . 'wp-admin/admin-header.php' );\n\n?>\n\n<div class=\"wrap\">\n<h1 id=\"edit-site\"><?php echo $title; ?></h1>\n<p class=\"edit-site-actions\"><a href=\"<?php echo esc_url( get_home_url( $id, '/' ) ); ?>\"><?php _e( 'Visit' ); ?></a> | <a href=\"<?php echo esc_url( get_admin_url( $id ) ); ?>\"><?php _e( 'Dashboard' ); ?></a></p>\n<h2 class=\"nav-tab-wrapper nav-tab-small\">\n<?php\n$tabs = array(\n\t'site-info'     => array( 'label' => __( 'Info' ),     'url' => 'site-info.php'     ),\n\t'site-users'    => array( 'label' => __( 'Users' ),    'url' => 'site-users.php'    ),\n\t'site-themes'   => array( 'label' => __( 'Themes' ),   'url' => 'site-themes.php'   ),\n\t'site-settings' => array( 'label' => __( 'Settings' ), 'url' => 'site-settings.php' ),\n);\nforeach ( $tabs as $tab_id => $tab ) {\n\t$class = ( $tab['url'] == $pagenow ) ? ' nav-tab-active' : '';\n\techo '<a href=\"' . $tab['url'] . '?id=' . $id .'\" class=\"nav-tab' . $class . '\">' . esc_html( $tab['label'] ) . '</a>';\n}\n?>\n</h2>\n<?php\nif ( ! empty( $messages ) ) {\n\tforeach ( $messages as $msg ) {\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . $msg . '</p></div>';\n\t}\n}\n?>\n<form method=\"post\" action=\"site-info.php?action=update-site\">\n\t<?php wp_nonce_field( 'edit-site' ); ?>\n\t<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ) ?>\" />\n\t<table class=\"form-table\">\n\t\t<?php\n\t\t// The main site of the network should not be updated on this page.\n\t\tif ( $is_main_site ) : ?>\n\t\t<tr class=\"form-field\">\n\t\t\t<th scope=\"row\"><?php _e( 'Site URL' ); ?></th>\n\t\t\t<td><?php echo esc_url( $details->siteurl ); ?></td>\n\t\t</tr>\n\t\t<?php\n\t\t// For any other site, the scheme, domain, and path can all be changed.\n\t\telse : ?>\n\t\t<tr class=\"form-field form-required\">\n\t\t\t<th scope=\"row\"><?php _e( 'Site URL' ); ?></th>\n\t\t\t<td><input name=\"blog[url]\" type=\"text\" id=\"url\" value=\"<?php echo $parsed_scheme . '://' . esc_attr( $details->domain ) . esc_attr( $details->path ); ?>\" /></td>\n\t\t</tr>\n\t\t<?php endif; ?>\n\n\t\t<tr class=\"form-field\">\n\t\t\t<th scope=\"row\"><label for=\"blog_registered\"><?php _ex( 'Registered', 'site' ) ?></label></th>\n\t\t\t<td><input name=\"blog[registered]\" type=\"text\" id=\"blog_registered\" value=\"<?php echo esc_attr( $details->registered ) ?>\" /></td>\n\t\t</tr>\n\t\t<tr class=\"form-field\">\n\t\t\t<th scope=\"row\"><label for=\"blog_last_updated\"><?php _e( 'Last Updated' ); ?></label></th>\n\t\t\t<td><input name=\"blog[last_updated]\" type=\"text\" id=\"blog_last_updated\" value=\"<?php echo esc_attr( $details->last_updated ) ?>\" /></td>\n\t\t</tr>\n\t\t<?php\n\t\t$attribute_fields = array( 'public' => __( 'Public' ) );\n\t\tif ( ! $is_main_site ) {\n\t\t\t$attribute_fields['archived'] = __( 'Archived' );\n\t\t\t$attribute_fields['spam']     = _x( 'Spam', 'site' );\n\t\t\t$attribute_fields['deleted']  = __( 'Deleted' );\n\t\t}\n\t\t$attribute_fields['mature'] = __( 'Mature' );\n\t\t?>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><?php _e( 'Attributes' ); ?></th>\n\t\t\t<td>\n\t\t\t<fieldset>\n\t\t\t<legend class=\"screen-reader-text\"><?php _e( 'Set site attributes' ) ?></legend>\n\t\t\t<?php foreach ( $attribute_fields as $field_key => $field_label ) : ?>\n\t\t\t\t<label><input type=\"checkbox\" name=\"blog[<?php echo $field_key; ?>]\" value=\"1\" <?php checked( (bool) $details->$field_key, true ); disabled( ! in_array( $details->$field_key, array( 0, 1 ) ) ); ?> />\n\t\t\t\t<?php echo $field_label; ?></label><br/>\n\t\t\t<?php endforeach; ?>\n\t\t\t<fieldset>\n\t\t\t</td>\n\t\t</tr>\n\t</table>\n\t<?php submit_button(); ?>\n</form>\n\n</div>\n<?php\nrequire( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/site-new.php",
    "content": "<?php\n/**\n * Add Site Administration Screen\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n/** WordPress Translation Install API */\nrequire_once( ABSPATH . 'wp-admin/includes/translation-install.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can( 'manage_sites' ) )\n\twp_die( __( 'You do not have sufficient permissions to add sites to this network.' ) );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('This screen is for Super Admins to add new sites to the network. This is not affected by the registration settings.') . '</p>' .\n\t\t'<p>' . __('If the admin email for the new site does not exist in the database, a new user will also be created.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Sites_Screen\" target=\"_blank\">Documentation on Site Management</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nif ( isset($_REQUEST['action']) && 'add-site' == $_REQUEST['action'] ) {\n\tcheck_admin_referer( 'add-blog', '_wpnonce_add-blog' );\n\n\tif ( ! is_array( $_POST['blog'] ) )\n\t\twp_die( __( 'Can&#8217;t create an empty site.' ) );\n\n\t$blog = $_POST['blog'];\n\t$domain = '';\n\tif ( preg_match( '|^([a-zA-Z0-9-])+$|', $blog['domain'] ) )\n\t\t$domain = strtolower( $blog['domain'] );\n\n\t// If not a subdomain install, make sure the domain isn't a reserved word\n\tif ( ! is_subdomain_install() ) {\n\t\t$subdirectory_reserved_names = get_subdirectory_reserved_names();\n\n\t\tif ( in_array( $domain, $subdirectory_reserved_names ) ) {\n\t\t\twp_die( sprintf( __( 'The following words are reserved for use by WordPress functions and cannot be used as blog names: <code>%s</code>' ), implode( '</code>, <code>', $subdirectory_reserved_names ) ) );\n\t\t}\n\t}\n\n\t$title = $blog['title'];\n\n\t$meta = array(\n\t\t'public' => 1\n\t);\n\n\t// Handle translation install for the new site.\n\tif ( ! empty( $_POST['WPLANG'] ) && wp_can_install_language_pack() ) {\n\t\t$language = wp_download_language_pack( wp_unslash( $_POST['WPLANG'] ) );\n\t\tif ( $language ) {\n\t\t\t$meta['WPLANG'] = $language;\n\t\t}\n\t}\n\n\tif ( empty( $domain ) )\n\t\twp_die( __( 'Missing or invalid site address.' ) );\n\n\tif ( isset( $blog['email'] ) && '' === trim( $blog['email'] ) ) {\n\t\twp_die( __( 'Missing email address.' ) );\n\t}\n\n\t$email = sanitize_email( $blog['email'] );\n\tif ( ! is_email( $email ) ) {\n\t\twp_die( __( 'Invalid email address.' ) );\n\t}\n\n\tif ( is_subdomain_install() ) {\n\t\t$newdomain = $domain . '.' . preg_replace( '|^www\\.|', '', $current_site->domain );\n\t\t$path      = $current_site->path;\n\t} else {\n\t\t$newdomain = $current_site->domain;\n\t\t$path      = $current_site->path . $domain . '/';\n\t}\n\n\t$password = 'N/A';\n\t$user_id = email_exists($email);\n\tif ( !$user_id ) { // Create a new user with a random password\n\t\t$user_id = username_exists( $domain );\n\t\tif ( $user_id ) {\n\t\t\twp_die( __( 'The domain or path entered conflicts with an existing username.' ) );\n\t\t}\n\t\t$password = wp_generate_password( 12, false );\n\t\t$user_id = wpmu_create_user( $domain, $password, $email );\n\t\tif ( false === $user_id ) {\n\t\t\twp_die( __( 'There was an error creating the user.' ) );\n\t\t}\n\n\t\t/**\n\t\t  * Fires after a new user has been created via the network site-new.php page.\n\t\t  *\n\t\t  * @since 4.4.0\n\t\t  *\n\t\t  * @param int $user_id ID of the newly created user.\n\t\t  */\n\t\tdo_action( 'network_site_new_created_user', $user_id );\n\t}\n\n\t$wpdb->hide_errors();\n\t$id = wpmu_create_blog( $newdomain, $path, $title, $user_id, $meta, $current_site->id );\n\t$wpdb->show_errors();\n\tif ( ! is_wp_error( $id ) ) {\n\t\tif ( ! is_super_admin( $user_id ) && !get_user_option( 'primary_blog', $user_id ) ) {\n\t\t\tupdate_user_option( $user_id, 'primary_blog', $id, true );\n\t\t}\n\n\t\t$content_mail = sprintf(\n\t\t\t/* translators: 1: user login, 2: site url, 3: site name/title */\n\t\t\t__( 'New site created by %1$s\n\nAddress: %2$s\nName: %3$s' ),\n\t\t\t$current_user->user_login,\n\t\t\tget_site_url( $id ),\n\t\t\twp_unslash( $title )\n\t\t);\n\t\twp_mail( get_site_option('admin_email'), sprintf( __( '[%s] New Site Created' ), $current_site->site_name ), $content_mail, 'From: \"Site Admin\" <' . get_site_option( 'admin_email' ) . '>' );\n\t\twpmu_welcome_notification( $id, $user_id, $password, $title, array( 'public' => 1 ) );\n\t\twp_redirect( add_query_arg( array( 'update' => 'added', 'id' => $id ), 'site-new.php' ) );\n\t\texit;\n\t} else {\n\t\twp_die( $id->get_error_message() );\n\t}\n}\n\nif ( isset($_GET['update']) ) {\n\t$messages = array();\n\tif ( 'added' == $_GET['update'] )\n\t\t$messages[] = sprintf(\n\t\t\t/* translators: 1: dashboard url, 2: network admin edit url */\n\t\t\t__( 'Site added. <a href=\"%1$s\">Visit Dashboard</a> or <a href=\"%2$s\">Edit Site</a>' ),\n\t\t\tesc_url( get_admin_url( absint( $_GET['id'] ) ) ),\n\t\t\tnetwork_admin_url( 'site-info.php?id=' . absint( $_GET['id'] ) )\n\t\t);\n}\n\n$title = __('Add New Site');\n$parent_file = 'sites.php';\n\nwp_enqueue_script( 'user-suggest' );\n\nrequire( ABSPATH . 'wp-admin/admin-header.php' );\n\n?>\n\n<div class=\"wrap\">\n<h1 id=\"add-new-site\"><?php _e( 'Add New Site' ); ?></h1>\n<?php\nif ( ! empty( $messages ) ) {\n\tforeach ( $messages as $msg )\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . $msg . '</p></div>';\n} ?>\n<form method=\"post\" action=\"<?php echo network_admin_url( 'site-new.php?action=add-site' ); ?>\" novalidate=\"novalidate\">\n<?php wp_nonce_field( 'add-blog', '_wpnonce_add-blog' ) ?>\n\t<table class=\"form-table\">\n\t\t<tr class=\"form-field form-required\">\n\t\t\t<th scope=\"row\"><label for=\"site-address\"><?php _e( 'Site Address' ) ?></label></th>\n\t\t\t<td>\n\t\t\t<?php if ( is_subdomain_install() ) { ?>\n\t\t\t\t<input name=\"blog[domain]\" type=\"text\" class=\"regular-text\" id=\"site-address\" aria-describedby=\"site-address-desc\" autocapitalize=\"none\" autocorrect=\"off\"/><span class=\"no-break\">.<?php echo preg_replace( '|^www\\.|', '', $current_site->domain ); ?></span>\n\t\t\t<?php } else {\n\t\t\t\techo $current_site->domain . $current_site->path ?><input name=\"blog[domain]\" type=\"text\" class=\"regular-text\" id=\"site-address\" aria-describedby=\"site-address-desc\"  autocapitalize=\"none\" autocorrect=\"off\" />\n\t\t\t<?php }\n\t\t\techo '<p id=\"site-address-desc\">' . __( 'Only lowercase letters (a-z) and numbers are allowed.' ) . '</p>';\n\t\t\t?>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr class=\"form-field form-required\">\n\t\t\t<th scope=\"row\"><label for=\"site-title\"><?php _e( 'Site Title' ) ?></label></th>\n\t\t\t<td><input name=\"blog[title]\" type=\"text\" class=\"regular-text\" id=\"site-title\" /></td>\n\t\t</tr>\n\t\t<?php\n\t\t$languages    = get_available_languages();\n\t\t$translations = wp_get_available_translations();\n\t\tif ( ! empty( $languages ) || ! empty( $translations ) ) :\n\t\t\t?>\n\t\t\t<tr class=\"form-field form-required\">\n\t\t\t\t<th scope=\"row\"><label for=\"site-language\"><?php _e( 'Site Language' ); ?></label></th>\n\t\t\t\t<td>\n\t\t\t\t\t<?php\n\t\t\t\t\t// Network default.\n\t\t\t\t\t$lang = get_site_option( 'WPLANG' );\n\n\t\t\t\t\t// Use English if the default isn't available.\n\t\t\t\t\tif ( ! in_array( $lang, $languages ) ) {\n\t\t\t\t\t\t$lang = '';\n\t\t\t\t\t}\n\n\t\t\t\t\twp_dropdown_languages( array(\n\t\t\t\t\t\t'name'                        => 'WPLANG',\n\t\t\t\t\t\t'id'                          => 'site-language',\n\t\t\t\t\t\t'selected'                    => $lang,\n\t\t\t\t\t\t'languages'                   => $languages,\n\t\t\t\t\t\t'translations'                => $translations,\n\t\t\t\t\t\t'show_available_translations' => wp_can_install_language_pack(),\n\t\t\t\t\t) );\n\t\t\t\t\t?>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t<?php endif; // Languages. ?>\n\t\t<tr class=\"form-field form-required\">\n\t\t\t<th scope=\"row\"><label for=\"admin-email\"><?php _e( 'Admin Email' ) ?></label></th>\n\t\t\t<td><input name=\"blog[email]\" type=\"email\" class=\"regular-text wp-suggest-user\" id=\"admin-email\" data-autocomplete-type=\"search\" data-autocomplete-field=\"user_email\" /></td>\n\t\t</tr>\n\t\t<tr class=\"form-field\">\n\t\t\t<td colspan=\"2\"><?php _e( 'A new user will be created if the above email address is not in the database.' ) ?><br /><?php _e( 'The username and password will be mailed to this email address.' ) ?></td>\n\t\t</tr>\n\t</table>\n\t<?php submit_button( __('Add Site'), 'primary', 'add-site' ); ?>\n\t</form>\n</div>\n<?php\nrequire( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/site-settings.php",
    "content": "<?php\n/**\n * Edit Site Settings Administration Screen\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can( 'manage_sites' ) )\n\twp_die( __( 'You do not have sufficient permissions to edit this site.' ) );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.') . '</p>' .\n\t\t'<p>' . __('<strong>Info</strong> &mdash; The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.') . '</p>' .\n\t\t'<p>' . __('<strong>Users</strong> &mdash; This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.') . '</p>' .\n\t\t'<p>' . sprintf( __('<strong>Themes</strong> &mdash; This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site&#8217;s Appearance menu. To enable a theme for the entire network, see the <a href=\"%s\">Network Themes</a> screen.' ), network_admin_url( 'themes.php' ) ) . '</p>' .\n\t\t'<p>' . __('<strong>Settings</strong> &mdash; This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Sites_Screen\" target=\"_blank\">Documentation on Site Management</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\n$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0;\n\nif ( ! $id )\n\twp_die( __('Invalid site ID.') );\n\n$details = get_blog_details( $id );\nif ( ! $details ) {\n\twp_die( __( 'The requested site does not exist.' ) );\n}\n\nif ( !can_edit_network( $details->site_id ) )\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n$is_main_site = is_main_site( $id );\n\nif ( isset($_REQUEST['action']) && 'update-site' == $_REQUEST['action'] && is_array( $_POST['option'] ) ) {\n\tcheck_admin_referer( 'edit-site' );\n\n\tswitch_to_blog( $id );\n\n\t$skip_options = array( 'allowedthemes' ); // Don't update these options since they are handled elsewhere in the form.\n\tforeach ( (array) $_POST['option'] as $key => $val ) {\n\t\t$key = wp_unslash( $key );\n\t\t$val = wp_unslash( $val );\n\t\tif ( $key === 0 || is_array( $val ) || in_array($key, $skip_options) )\n\t\t\tcontinue; // Avoids \"0 is a protected WP option and may not be modified\" error when edit blog options\n\t\tupdate_option( $key, $val );\n\t}\n\n\t/**\n\t * Fires after the site options are updated.\n\t *\n\t * @since 3.0.0\n\t * @since 4.4.0 Added `$id` parameter.\n\t *\n\t * @param int $id The ID of the site being updated.\n\t */\n\tdo_action( 'wpmu_update_blog_options', $id );\n\n\trestore_current_blog();\n\twp_redirect( add_query_arg( array( 'update' => 'updated', 'id' => $id ), 'site-settings.php') );\n\texit;\n}\n\nif ( isset($_GET['update']) ) {\n\t$messages = array();\n\tif ( 'updated' == $_GET['update'] )\n\t\t$messages[] = __('Site options updated.');\n}\n\n$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );\n\n$parent_file = 'sites.php';\n$submenu_file = 'sites.php';\n\nrequire( ABSPATH . 'wp-admin/admin-header.php' );\n\n?>\n\n<div class=\"wrap\">\n<h1 id=\"edit-site\"><?php echo $title; ?></h1>\n<p class=\"edit-site-actions\"><a href=\"<?php echo esc_url( get_home_url( $id, '/' ) ); ?>\"><?php _e( 'Visit' ); ?></a> | <a href=\"<?php echo esc_url( get_admin_url( $id ) ); ?>\"><?php _e( 'Dashboard' ); ?></a></p>\n<h2 class=\"nav-tab-wrapper nav-tab-small\">\n<?php\n$tabs = array(\n\t'site-info'     => array( 'label' => __( 'Info' ),     'url' => 'site-info.php'     ),\n\t'site-users'    => array( 'label' => __( 'Users' ),    'url' => 'site-users.php'    ),\n\t'site-themes'   => array( 'label' => __( 'Themes' ),   'url' => 'site-themes.php'   ),\n\t'site-settings' => array( 'label' => __( 'Settings' ), 'url' => 'site-settings.php' ),\n);\nforeach ( $tabs as $tab_id => $tab ) {\n\t$class = ( $tab['url'] == $pagenow ) ? ' nav-tab-active' : '';\n\techo '<a href=\"' . $tab['url'] . '?id=' . $id .'\" class=\"nav-tab' . $class . '\">' . esc_html( $tab['label'] ) . '</a>';\n}\n?>\n</h2>\n<?php\nif ( ! empty( $messages ) ) {\n\tforeach ( $messages as $msg )\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . $msg . '</p></div>';\n} ?>\n<form method=\"post\" action=\"site-settings.php?action=update-site\">\n\t<?php wp_nonce_field( 'edit-site' ); ?>\n\t<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ) ?>\" />\n\t<table class=\"form-table\">\n\t\t<?php\n\t\t$blog_prefix = $wpdb->get_blog_prefix( $id );\n\t\t$sql = \"SELECT * FROM {$blog_prefix}options\n\t\t\tWHERE option_name NOT LIKE %s\n\t\t\tAND option_name NOT LIKE %s\";\n\t\t$query = $wpdb->prepare( $sql,\n\t\t\t$wpdb->esc_like( '_' ) . '%',\n\t\t\t'%' . $wpdb->esc_like( 'user_roles' )\n\t\t);\n\t\t$options = $wpdb->get_results( $query );\n\t\tforeach ( $options as $option ) {\n\t\t\tif ( $option->option_name == 'default_role' )\n\t\t\t\t$editblog_default_role = $option->option_value;\n\t\t\t$disabled = false;\n\t\t\t$class = 'all-options';\n\t\t\tif ( is_serialized( $option->option_value ) ) {\n\t\t\t\tif ( is_serialized_string( $option->option_value ) ) {\n\t\t\t\t\t$option->option_value = esc_html( maybe_unserialize( $option->option_value ) );\n\t\t\t\t} else {\n\t\t\t\t\t$option->option_value = 'SERIALIZED DATA';\n\t\t\t\t\t$disabled = true;\n\t\t\t\t\t$class = 'all-options disabled';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( strpos( $option->option_value, \"\\n\" ) !== false ) {\n\t\t\t?>\n\t\t\t\t<tr class=\"form-field\">\n\t\t\t\t\t<th scope=\"row\"><label for=\"<?php echo esc_attr( $option->option_name ) ?>\"><?php echo ucwords( str_replace( \"_\", \" \", $option->option_name ) ) ?></label></th>\n\t\t\t\t\t<td><textarea class=\"<?php echo $class; ?>\" rows=\"5\" cols=\"40\" name=\"option[<?php echo esc_attr( $option->option_name ) ?>]\" id=\"<?php echo esc_attr( $option->option_name ) ?>\"<?php disabled( $disabled ) ?>><?php echo esc_textarea( $option->option_value ) ?></textarea></td>\n\t\t\t\t</tr>\n\t\t\t<?php\n\t\t\t} else {\n\t\t\t?>\n\t\t\t\t<tr class=\"form-field\">\n\t\t\t\t\t<th scope=\"row\"><label for=\"<?php echo esc_attr( $option->option_name ) ?>\"><?php echo esc_html( ucwords( str_replace( \"_\", \" \", $option->option_name ) ) ); ?></label></th>\n\t\t\t\t\t<?php if ( $is_main_site && in_array( $option->option_name, array( 'siteurl', 'home' ) ) ) { ?>\n\t\t\t\t\t<td><code><?php echo esc_html( $option->option_value ) ?></code></td>\n\t\t\t\t\t<?php } else { ?>\n\t\t\t\t\t<td><input class=\"<?php echo $class; ?>\" name=\"option[<?php echo esc_attr( $option->option_name ) ?>]\" type=\"text\" id=\"<?php echo esc_attr( $option->option_name ) ?>\" value=\"<?php echo esc_attr( $option->option_value ) ?>\" size=\"40\" <?php disabled( $disabled ) ?> /></td>\n\t\t\t\t\t<?php } ?>\n\t\t\t\t</tr>\n\t\t\t<?php\n\t\t\t}\n\t\t} // End foreach\n\t\t/**\n\t\t * Fires at the end of the Edit Site form, before the submit button.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param int $id Site ID.\n\t\t */\n\t\tdo_action( 'wpmueditblogaction', $id );\n\t\t?>\n\t</table>\n\t<?php submit_button(); ?>\n</form>\n\n</div>\n<?php\nrequire( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/site-themes.php",
    "content": "<?php\n/**\n * Edit Site Themes Administration Screen\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can( 'manage_sites' ) )\n\twp_die( __( 'You do not have sufficient permissions to manage themes for this site.' ) );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.') . '</p>' .\n\t\t'<p>' . __('<strong>Info</strong> &mdash; The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.') . '</p>' .\n\t\t'<p>' . __('<strong>Users</strong> &mdash; This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.') . '</p>' .\n\t\t'<p>' . sprintf( __('<strong>Themes</strong> &mdash; This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site&#8217;s Appearance menu. To enable a theme for the entire network, see the <a href=\"%s\">Network Themes</a> screen.' ), network_admin_url( 'themes.php' ) ) . '</p>' .\n\t\t'<p>' . __('<strong>Settings</strong> &mdash; This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Sites_Screen\" target=\"_blank\">Documentation on Site Management</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter site themes list' ),\n\t'heading_pagination' => __( 'Site themes list navigation' ),\n\t'heading_list'       => __( 'Site themes list' ),\n) );\n\n$wp_list_table = _get_list_table('WP_MS_Themes_List_Table');\n\n$action = $wp_list_table->current_action();\n\n$s = isset($_REQUEST['s']) ? $_REQUEST['s'] : '';\n\n// Clean up request URI from temporary args for screen options/paging uri's to work as expected.\n$temp_args = array( 'enabled', 'disabled', 'error' );\n$_SERVER['REQUEST_URI'] = remove_query_arg( $temp_args, $_SERVER['REQUEST_URI'] );\n$referer = remove_query_arg( $temp_args, wp_get_referer() );\n\nif ( ! empty( $_REQUEST['paged'] ) ) {\n\t$referer = add_query_arg( 'paged', (int) $_REQUEST['paged'], $referer );\n}\n\n$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0;\n\nif ( ! $id )\n\twp_die( __('Invalid site ID.') );\n\n$wp_list_table->prepare_items();\n\n$details = get_blog_details( $id );\nif ( ! $details ) {\n\twp_die( __( 'The requested site does not exist.' ) );\n}\n\nif ( !can_edit_network( $details->site_id ) )\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n$is_main_site = is_main_site( $id );\n\nif ( $action ) {\n\tswitch_to_blog( $id );\n\t$allowed_themes = get_option( 'allowedthemes' );\n\n\tswitch ( $action ) {\n\t\tcase 'enable':\n\t\t\tcheck_admin_referer( 'enable-theme_' . $_GET['theme'] );\n\t\t\t$theme = $_GET['theme'];\n\t\t\t$action = 'enabled';\n\t\t\t$n = 1;\n\t\t\tif ( !$allowed_themes )\n\t\t\t\t$allowed_themes = array( $theme => true );\n\t\t\telse\n\t\t\t\t$allowed_themes[$theme] = true;\n\t\t\tbreak;\n\t\tcase 'disable':\n\t\t\tcheck_admin_referer( 'disable-theme_' . $_GET['theme'] );\n\t\t\t$theme = $_GET['theme'];\n\t\t\t$action = 'disabled';\n\t\t\t$n = 1;\n\t\t\tif ( !$allowed_themes )\n\t\t\t\t$allowed_themes = array();\n\t\t\telse\n\t\t\t\tunset( $allowed_themes[$theme] );\n\t\t\tbreak;\n\t\tcase 'enable-selected':\n\t\t\tcheck_admin_referer( 'bulk-themes' );\n\t\t\tif ( isset( $_POST['checked'] ) ) {\n\t\t\t\t$themes = (array) $_POST['checked'];\n\t\t\t\t$action = 'enabled';\n\t\t\t\t$n = count( $themes );\n\t\t\t\tforeach ( (array) $themes as $theme )\n\t\t\t\t\t$allowed_themes[ $theme ] = true;\n\t\t\t} else {\n\t\t\t\t$action = 'error';\n\t\t\t\t$n = 'none';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'disable-selected':\n\t\t\tcheck_admin_referer( 'bulk-themes' );\n\t\t\tif ( isset( $_POST['checked'] ) ) {\n\t\t\t\t$themes = (array) $_POST['checked'];\n\t\t\t\t$action = 'disabled';\n\t\t\t\t$n = count( $themes );\n\t\t\t\tforeach ( (array) $themes as $theme )\n\t\t\t\t\tunset( $allowed_themes[ $theme ] );\n\t\t\t} else {\n\t\t\t\t$action = 'error';\n\t\t\t\t$n = 'none';\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tupdate_option( 'allowedthemes', $allowed_themes );\n\trestore_current_blog();\n\n\twp_safe_redirect( add_query_arg( array( 'id' => $id, $action => $n ), $referer ) );\n\texit;\n}\n\nif ( isset( $_GET['action'] ) && 'update-site' == $_GET['action'] ) {\n\twp_safe_redirect( $referer );\n\texit();\n}\n\nadd_thickbox();\nadd_screen_option( 'per_page' );\n\n$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );\n\n$parent_file = 'sites.php';\n$submenu_file = 'sites.php';\n\nrequire( ABSPATH . 'wp-admin/admin-header.php' ); ?>\n\n<div class=\"wrap\">\n<h1 id=\"edit-site\"><?php echo $title; ?></h1>\n<p class=\"edit-site-actions\"><a href=\"<?php echo esc_url( get_home_url( $id, '/' ) ); ?>\"><?php _e( 'Visit' ); ?></a> | <a href=\"<?php echo esc_url( get_admin_url( $id ) ); ?>\"><?php _e( 'Dashboard' ); ?></a></p>\n<h2 class=\"nav-tab-wrapper nav-tab-small\">\n<?php\n$tabs = array(\n\t'site-info'     => array( 'label' => __( 'Info' ),     'url' => 'site-info.php'     ),\n\t'site-users'    => array( 'label' => __( 'Users' ),    'url' => 'site-users.php'    ),\n\t'site-themes'   => array( 'label' => __( 'Themes' ),   'url' => 'site-themes.php'   ),\n\t'site-settings' => array( 'label' => __( 'Settings' ), 'url' => 'site-settings.php' ),\n);\nforeach ( $tabs as $tab_id => $tab ) {\n\t$class = ( $tab['url'] == $pagenow ) ? ' nav-tab-active' : '';\n\techo '<a href=\"' . $tab['url'] . '?id=' . $id .'\" class=\"nav-tab' . $class . '\">' . esc_html( $tab['label'] ) . '</a>';\n}\n?>\n</h2><?php\n\nif ( isset( $_GET['enabled'] ) ) {\n\t$enabled = absint( $_GET['enabled'] );\n\tif ( 1 == $enabled ) {\n\t\t$message = __( 'Theme enabled.' );\n\t} else {\n\t\t$message = _n( '%s theme enabled.', '%s themes enabled.', $enabled );\n\t}\n\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . sprintf( $message, number_format_i18n( $enabled ) ) . '</p></div>';\n} elseif ( isset( $_GET['disabled'] ) ) {\n\t$disabled = absint( $_GET['disabled'] );\n\tif ( 1 == $disabled ) {\n\t\t$message = __( 'Theme disabled.' );\n\t} else {\n\t\t$message = _n( '%s theme disabled.', '%s themes disabled.', $disabled );\n\t}\n\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . sprintf( $message, number_format_i18n( $disabled ) ) . '</p></div>';\n} elseif ( isset( $_GET['error'] ) && 'none' == $_GET['error'] ) {\n\techo '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'No theme selected.' ) . '</p></div>';\n} ?>\n\n<p><?php _e( 'Network enabled themes are not shown on this screen.' ) ?></p>\n\n<form method=\"get\">\n<?php $wp_list_table->search_box( __( 'Search Installed Themes' ), 'theme' ); ?>\n<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ) ?>\" />\n</form>\n\n<?php $wp_list_table->views(); ?>\n\n<form method=\"post\" action=\"site-themes.php?action=update-site\">\n\t<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ) ?>\" />\n\n<?php $wp_list_table->display(); ?>\n\n</form>\n\n</div>\n<?php include(ABSPATH . 'wp-admin/admin-footer.php'); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/site-users.php",
    "content": "<?php\n/**\n * Edit Site Users Administration Screen\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can('manage_sites') )\n\twp_die(__('You do not have sufficient permissions to edit this site.'));\n\n$wp_list_table = _get_list_table('WP_Users_List_Table');\n$wp_list_table->prepare_items();\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('The menu is for editing information specific to individual sites, particularly if the admin area of a site is unavailable.') . '</p>' .\n\t\t'<p>' . __('<strong>Info</strong> &mdash; The site URL is rarely edited as this can cause the site to not work properly. The Registered date and Last Updated date are displayed. Network admins can mark a site as archived, spam, deleted and mature, to remove from public listings or disable.') . '</p>' .\n\t\t'<p>' . __('<strong>Users</strong> &mdash; This displays the users associated with this site. You can also change their role, reset their password, or remove them from the site. Removing the user from the site does not remove the user from the network.') . '</p>' .\n\t\t'<p>' . sprintf( __('<strong>Themes</strong> &mdash; This area shows themes that are not already enabled across the network. Enabling a theme in this menu makes it accessible to this site. It does not activate the theme, but allows it to show in the site&#8217;s Appearance menu. To enable a theme for the entire network, see the <a href=\"%s\">Network Themes</a> screen.' ), network_admin_url( 'themes.php' ) ) . '</p>' .\n\t\t'<p>' . __('<strong>Settings</strong> &mdash; This page shows a list of all settings associated with this site. Some are created by WordPress and others are created by plugins you activate. Note that some fields are grayed out and say Serialized Data. You cannot modify these values due to the way the setting is stored in the database.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Sites_Screen\" target=\"_blank\">Documentation on Site Management</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter site users list' ),\n\t'heading_pagination' => __( 'Site users list navigation' ),\n\t'heading_list'       => __( 'Site users list' ),\n) );\n\n$_SERVER['REQUEST_URI'] = remove_query_arg( 'update', $_SERVER['REQUEST_URI'] );\n$referer = remove_query_arg( 'update', wp_get_referer() );\n\nif ( ! empty( $_REQUEST['paged'] ) ) {\n\t$referer = add_query_arg( 'paged', (int) $_REQUEST['paged'], $referer );\n}\n\n$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0;\n\nif ( ! $id )\n\twp_die( __('Invalid site ID.') );\n\n$details = get_blog_details( $id );\nif ( ! $details ) {\n\twp_die( __( 'The requested site does not exist.' ) );\n}\n\nif ( ! can_edit_network( $details->site_id ) )\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n$is_main_site = is_main_site( $id );\n\nswitch_to_blog( $id );\n\n$action = $wp_list_table->current_action();\n\nif ( $action ) {\n\n\tswitch ( $action ) {\n\t\tcase 'newuser':\n\t\t\tcheck_admin_referer( 'add-user', '_wpnonce_add-new-user' );\n\t\t\t$user = $_POST['user'];\n\t\t\tif ( ! is_array( $_POST['user'] ) || empty( $user['username'] ) || empty( $user['email'] ) ) {\n\t\t\t\t$update = 'err_new';\n\t\t\t} else {\n\t\t\t\t$password = wp_generate_password( 12, false);\n\t\t\t\t$user_id = wpmu_create_user( esc_html( strtolower( $user['username'] ) ), $password, esc_html( $user['email'] ) );\n\n\t\t\t\tif ( false === $user_id ) {\n\t\t \t\t\t$update = 'err_new_dup';\n\t\t\t\t} else {\n\t\t\t\t\tadd_user_to_blog( $id, $user_id, $_POST['new_role'] );\n\t\t\t\t\t$update = 'newuser';\n\t\t\t\t\t/**\n\t\t\t\t\t  * Fires after a user has been created via the network site-users.php page.\n\t\t\t\t\t  *\n\t\t\t\t\t  * @since 4.4.0\n\t\t\t\t\t  *\n\t\t\t\t\t  * @param int $user_id ID of the newly created user.\n\t\t\t\t\t  */\n\t\t\t\t\tdo_action( 'network_site_users_created_user', $user_id );\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'adduser':\n\t\t\tcheck_admin_referer( 'add-user', '_wpnonce_add-user' );\n\t\t\tif ( !empty( $_POST['newuser'] ) ) {\n\t\t\t\t$update = 'adduser';\n\t\t\t\t$newuser = $_POST['newuser'];\n\t\t\t\t$user = get_user_by( 'login', $newuser );\n\t\t\t\tif ( $user && $user->exists() ) {\n\t\t\t\t\tif ( ! is_user_member_of_blog( $user->ID, $id ) )\n\t\t\t\t\t\tadd_user_to_blog( $id, $user->ID, $_POST['new_role'] );\n\t\t\t\t\telse\n\t\t\t\t\t\t$update = 'err_add_member';\n\t\t\t\t} else {\n\t\t\t\t\t$update = 'err_add_notfound';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$update = 'err_add_notfound';\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'remove':\n\t\t\tif ( ! current_user_can( 'remove_users' )  )\n\t\t\t\tdie(__('You can&#8217;t remove users.'));\n\t\t\tcheck_admin_referer( 'bulk-users' );\n\n\t\t\t$update = 'remove';\n\t\t\tif ( isset( $_REQUEST['users'] ) ) {\n\t\t\t\t$userids = $_REQUEST['users'];\n\n\t\t\t\tforeach ( $userids as $user_id ) {\n\t\t\t\t\t$user_id = (int) $user_id;\n\t\t\t\t\tremove_user_from_blog( $user_id, $id );\n\t\t\t\t}\n\t\t\t} elseif ( isset( $_GET['user'] ) ) {\n\t\t\t\tremove_user_from_blog( $_GET['user'] );\n\t\t\t} else {\n\t\t\t\t$update = 'err_remove';\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'promote':\n\t\t\tcheck_admin_referer( 'bulk-users' );\n\t\t\t$editable_roles = get_editable_roles();\n\t\t\tif ( empty( $editable_roles[$_REQUEST['new_role']] ) )\n\t\t\t\twp_die(__('You can&#8217;t give users that role.'));\n\n\t\t\tif ( isset( $_REQUEST['users'] ) ) {\n\t\t\t\t$userids = $_REQUEST['users'];\n\t\t\t\t$update = 'promote';\n\t\t\t\tforeach ( $userids as $user_id ) {\n\t\t\t\t\t$user_id = (int) $user_id;\n\n\t\t\t\t\t// If the user doesn't already belong to the blog, bail.\n\t\t\t\t\tif ( ! is_user_member_of_blog( $user_id ) ) {\n\t\t\t\t\t\twp_die(\n\t\t\t\t\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t\t\t\t\t'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',\n\t\t\t\t\t\t\t403\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t$user = get_userdata( $user_id );\n\t\t\t\t\t$user->set_role( $_REQUEST['new_role'] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$update = 'err_promote';\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\twp_safe_redirect( add_query_arg( 'update', $update, $referer ) );\n\texit();\n}\n\nrestore_current_blog();\n\nif ( isset( $_GET['action'] ) && 'update-site' == $_GET['action'] ) {\n\twp_safe_redirect( $referer );\n\texit();\n}\n\nadd_screen_option( 'per_page' );\n\n$title = sprintf( __( 'Edit Site: %s' ), esc_html( $details->blogname ) );\n\n$parent_file = 'sites.php';\n$submenu_file = 'sites.php';\n\n/**\n * Filter whether to show the Add Existing User form on the Multisite Users screen.\n *\n * @since 3.1.0\n *\n * @param bool $bool Whether to show the Add Existing User form. Default true.\n */\nif ( ! wp_is_large_network( 'users' ) && apply_filters( 'show_network_site_users_add_existing_form', true ) )\n\twp_enqueue_script( 'user-suggest' );\n\nrequire( ABSPATH . 'wp-admin/admin-header.php' ); ?>\n\n<script type=\"text/javascript\">\nvar current_site_id = <?php echo $id; ?>;\n</script>\n\n\n<div class=\"wrap\">\n<h1 id=\"edit-site\"><?php echo $title; ?></h1>\n<p class=\"edit-site-actions\"><a href=\"<?php echo esc_url( get_home_url( $id, '/' ) ); ?>\"><?php _e( 'Visit' ); ?></a> | <a href=\"<?php echo esc_url( get_admin_url( $id ) ); ?>\"><?php _e( 'Dashboard' ); ?></a></p>\n<h2 class=\"nav-tab-wrapper nav-tab-small\">\n<?php\n$tabs = array(\n\t'site-info'     => array( 'label' => __( 'Info' ),     'url' => 'site-info.php'     ),\n\t'site-users'    => array( 'label' => __( 'Users' ),    'url' => 'site-users.php'    ),\n\t'site-themes'   => array( 'label' => __( 'Themes' ),   'url' => 'site-themes.php'   ),\n\t'site-settings' => array( 'label' => __( 'Settings' ), 'url' => 'site-settings.php' ),\n);\nforeach ( $tabs as $tab_id => $tab ) {\n\t$class = ( $tab['url'] == $pagenow ) ? ' nav-tab-active' : '';\n\techo '<a href=\"' . $tab['url'] . '?id=' . $id .'\" class=\"nav-tab' . $class . '\">' . esc_html( $tab['label'] ) . '</a>';\n}\n?>\n</h2><?php\n\nif ( isset($_GET['update']) ) :\n\tswitch($_GET['update']) {\n\tcase 'adduser':\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __( 'User added.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'err_add_member':\n\t\techo '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'User is already a member of this site.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'err_add_notfound':\n\t\techo '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'Enter the username of an existing user.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'promote':\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __( 'Changed roles.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'err_promote':\n\t\techo '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'Select a user to change role.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'remove':\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __( 'User removed from this site.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'err_remove':\n\t\techo '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'Select a user to remove.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'newuser':\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __( 'User created.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'err_new':\n\t\techo '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'Enter the username and email.' ) . '</p></div>';\n\t\tbreak;\n\tcase 'err_new_dup':\n\t\techo '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'Duplicated username or email address.' ) . '</p></div>';\n\t\tbreak;\n\t}\nendif; ?>\n\n<form class=\"search-form\" method=\"get\">\n<?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>\n<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ) ?>\" />\n</form>\n\n<?php $wp_list_table->views(); ?>\n\n<form method=\"post\" action=\"site-users.php?action=update-site\">\n\t<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ) ?>\" />\n\n<?php $wp_list_table->display(); ?>\n\n</form>\n\n<?php\n/**\n * Fires after the list table on the Users screen in the Multisite Network Admin.\n *\n * @since 3.1.0\n */\ndo_action( 'network_site_users_after_list_table' );\n\n/** This filter is documented in wp-admin/network/site-users.php */\nif ( current_user_can( 'promote_users' ) && apply_filters( 'show_network_site_users_add_existing_form', true ) ) : ?>\n<h2 id=\"add-existing-user\"><?php _e( 'Add Existing User' ); ?></h2>\n<form action=\"site-users.php?action=adduser\" id=\"adduser\" method=\"post\">\n\t<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ) ?>\" />\n\t<table class=\"form-table\">\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"newuser\"><?php _e( 'Username' ); ?></label></th>\n\t\t\t<td><input type=\"text\" class=\"regular-text wp-suggest-user\" name=\"newuser\" id=\"newuser\" /></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"new_role_adduser\"><?php _e( 'Role' ); ?></label></th>\n\t\t\t<td><select name=\"new_role\" id=\"new_role_adduser\">\n\t\t\t<?php wp_dropdown_roles( get_option( 'default_role' ) ); ?>\n\t\t\t</select></td>\n\t\t</tr>\n\t</table>\n\t<?php wp_nonce_field( 'add-user', '_wpnonce_add-user' ) ?>\n\t<?php submit_button( __( 'Add User' ), 'primary', 'add-user', true, array( 'id' => 'submit-add-existing-user' ) ); ?>\n</form>\n<?php endif; ?>\n\n<?php\n/**\n * Filter whether to show the Add New User form on the Multisite Users screen.\n *\n * @since 3.1.0\n *\n * @param bool $bool Whether to show the Add New User form. Default true.\n */\nif ( current_user_can( 'create_users' ) && apply_filters( 'show_network_site_users_add_new_form', true ) ) : ?>\n<h2 id=\"add-new-user\"><?php _e( 'Add New User' ); ?></h2>\n<form action=\"<?php echo network_admin_url('site-users.php?action=newuser'); ?>\" id=\"newuser\" method=\"post\">\n\t<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ) ?>\" />\n\t<table class=\"form-table\">\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"user_username\"><?php _e( 'Username' ) ?></label></th>\n\t\t\t<td><input type=\"text\" class=\"regular-text\" name=\"user[username]\" id=\"user_username\" /></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"user_email\"><?php _e( 'Email' ) ?></label></th>\n\t\t\t<td><input type=\"text\" class=\"regular-text\" name=\"user[email]\" id=\"user_email\" /></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"new_role_newuser\"><?php _e( 'Role' ); ?></label></th>\n\t\t\t<td><select name=\"new_role\" id=\"new_role_newuser\">\n\t\t\t<?php wp_dropdown_roles( get_option( 'default_role' ) ); ?>\n\t\t\t</select></td>\n\t\t</tr>\n\t\t<tr class=\"form-field\">\n\t\t\t<td colspan=\"2\"><?php _e( 'A password reset link will be sent to the user via email.' ) ?></td>\n\t\t</tr>\n\t</table>\n\t<?php wp_nonce_field( 'add-user', '_wpnonce_add-new-user' ) ?>\n\t<?php submit_button( __( 'Add New User' ), 'primary', 'add-user', true, array( 'id' => 'submit-add-user' ) ); ?>\n</form>\n<?php endif; ?>\n</div>\n<?php\nrequire( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/sites.php",
    "content": "<?php\n/**\n * Multisite sites administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can( 'manage_sites' ) )\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n$wp_list_table = _get_list_table( 'WP_MS_Sites_List_Table' );\n$pagenum = $wp_list_table->get_pagenum();\n\n$title = __( 'Sites' );\n$parent_file = 'sites.php';\n\nadd_screen_option( 'per_page' );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('Add New takes you to the Add New Site screen. You can search for a site by Name, ID number, or IP address. Screen Options allows you to choose how many sites to display on one page.') . '</p>' .\n\t\t'<p>' . __('This is the main table of all sites on this network. Switch between list and excerpt views by using the icons above the right side of the table.') . '</p>' .\n\t\t'<p>' . __('Hovering over each site reveals seven options (three for the primary site):') . '</p>' .\n\t\t'<ul><li>' . __('An Edit link to a separate Edit Site screen.') . '</li>' .\n\t\t'<li>' . __('Dashboard leads to the Dashboard for that site.') . '</li>' .\n\t\t'<li>' . __('Deactivate, Archive, and Spam which lead to confirmation screens. These actions can be reversed later.') . '</li>' .\n\t\t'<li>' . __('Delete which is a permanent action after the confirmation screens.') . '</li>' .\n\t\t'<li>' . __('Visit to go to the frontend site live.') . '</li></ul>' .\n\t\t'<p>' . __('The site ID is used internally, and is not shown on the front end of the site or to users/viewers.') . '</p>' .\n\t\t'<p>' . __('Clicking on bold headings can re-sort this table.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Sites_Screen\" target=\"_blank\">Documentation on Site Management</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_pagination' => __( 'Sites list navigation' ),\n\t'heading_list'       => __( 'Sites list' ),\n) );\n\n$id = isset( $_REQUEST['id'] ) ? intval( $_REQUEST['id'] ) : 0;\n\nif ( isset( $_GET['action'] ) ) {\n\t/** This action is documented in wp-admin/network/edit.php */\n\tdo_action( 'wpmuadminedit' );\n\n\t// A list of valid actions and their associated messaging for confirmation output.\n\t$manage_actions = array(\n\t\t'activateblog'   => __( 'You are about to activate the site %s' ),\n\t\t'deactivateblog' => __( 'You are about to deactivate the site %s' ),\n\t\t'unarchiveblog'  => __( 'You are about to unarchive the site %s.' ),\n\t\t'archiveblog'    => __( 'You are about to archive the site %s.' ),\n\t\t'unspamblog'     => __( 'You are about to unspam the site %s.' ),\n\t\t'spamblog'       => __( 'You are about to mark the site %s as spam.' ),\n\t\t'deleteblog'     => __( 'You are about to delete the site %s.' ),\n\t\t'unmatureblog'   => __( 'You are about to mark the site %s as mature.' ),\n\t\t'matureblog'     => __( 'You are about to mark the site %s as not mature.' ),\n\t);\n\n\tif ( 'confirm' === $_GET['action'] ) {\n\t\t// The action2 parameter contains the action being taken on the site.\n\t\t$site_action = $_GET['action2'];\n\n\t\tif ( ! array_key_exists( $site_action, $manage_actions ) ) {\n\t\t\twp_die( __( 'The requested action is not valid.' ) );\n\t\t}\n\n\t\t// The mature/unmature UI exists only as external code. Check the \"confirm\" nonce for backward compatibility.\n\t\tif ( 'matureblog' === $site_action || 'unmatureblog' === $site_action ) {\n\t\t\tcheck_admin_referer( 'confirm' );\n\t\t} else {\n\t\t\tcheck_admin_referer( $site_action . '_' . $id );\n\t\t}\n\n\t\tif ( ! headers_sent() ) {\n\t\t\tnocache_headers();\n\t\t\theader( 'Content-Type: text/html; charset=utf-8' );\n\t\t}\n\n\t\tif ( $current_site->blog_id == $id ) {\n\t\t\twp_die( __( 'You are not allowed to change the current site.' ) );\n\t\t}\n\n\t\t$site_details = get_blog_details( $id );\n\t\t$site_address = untrailingslashit( $site_details->domain . $site_details->path );\n\n\t\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\t\t?>\n\t\t\t<div class=\"wrap\">\n\t\t\t\t<h1><?php _e( 'Confirm your action' ); ?></h1>\n\t\t\t\t<form action=\"sites.php?action=<?php echo esc_attr( $site_action ); ?>\" method=\"post\">\n\t\t\t\t\t<input type=\"hidden\" name=\"action\" value=\"<?php echo esc_attr( $site_action ); ?>\" />\n\t\t\t\t\t<input type=\"hidden\" name=\"id\" value=\"<?php echo esc_attr( $id ); ?>\" />\n\t\t\t\t\t<input type=\"hidden\" name=\"_wp_http_referer\" value=\"<?php echo esc_attr( wp_get_referer() ); ?>\" />\n\t\t\t\t\t<?php wp_nonce_field( $site_action . '_' . $id, '_wpnonce', false ); ?>\n\t\t\t\t\t<p><?php echo sprintf( $manage_actions[ $site_action ], $site_address ); ?></p>\n\t\t\t\t\t<?php submit_button( __( 'Confirm' ), 'primary' ); ?>\n\t\t\t\t</form>\n\t\t\t</div>\n\t\t<?php\n\t\trequire_once( ABSPATH . 'wp-admin/admin-footer.php' );\n\t\texit();\n\t} elseif ( array_key_exists( $_GET['action'], $manage_actions ) ) {\n\t\t$action = $_GET['action'];\n\t\tcheck_admin_referer( $action . '_' . $id );\n\t} elseif ( 'allblogs' === $_GET['action'] ) {\n\t\tcheck_admin_referer( 'bulk-sites' );\n\t}\n\n\t$updated_action = '';\n\n\tswitch ( $_GET['action'] ) {\n\n\t\tcase 'deleteblog':\n\t\t\tif ( ! current_user_can( 'delete_sites' ) )\n\t\t\t\twp_die( __( 'You do not have permission to access this page.' ), '', array( 'response' => 403 ) );\n\n\t\t\t$updated_action = 'not_deleted';\n\t\t\tif ( $id != '0' && $id != $current_site->blog_id && current_user_can( 'delete_site', $id ) ) {\n\t\t\t\twpmu_delete_blog( $id, true );\n\t\t\t\t$updated_action = 'delete';\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 'allblogs':\n\t\t\tif ( ( isset( $_POST['action'] ) || isset( $_POST['action2'] ) ) && isset( $_POST['allblogs'] ) ) {\n\t\t\t\t$doaction = $_POST['action'] != -1 ? $_POST['action'] : $_POST['action2'];\n\n\t\t\t\tforeach ( (array) $_POST['allblogs'] as $key => $val ) {\n\t\t\t\t\tif ( $val != '0' && $val != $current_site->blog_id ) {\n\t\t\t\t\t\tswitch ( $doaction ) {\n\t\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\t\tif ( ! current_user_can( 'delete_site', $val ) )\n\t\t\t\t\t\t\t\t\twp_die( __( 'You are not allowed to delete the site.' ) );\n\n\t\t\t\t\t\t\t\t$updated_action = 'all_delete';\n\t\t\t\t\t\t\t\twpmu_delete_blog( $val, true );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'spam':\n\t\t\t\t\t\t\tcase 'notspam':\n\t\t\t\t\t\t\t\t$updated_action = ( 'spam' === $doaction ) ? 'all_spam' : 'all_notspam';\n\t\t\t\t\t\t\t\tupdate_blog_status( $val, 'spam', ( 'spam' === $doaction ) ? '1' : '0' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\twp_die( __( 'You are not allowed to change the current site.' ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twp_redirect( network_admin_url( 'sites.php' ) );\n\t\t\t\texit();\n\t\t\t}\n\t\tbreak;\n\n\t\tcase 'archiveblog':\n\t\tcase 'unarchiveblog':\n\t\t\tupdate_blog_status( $id, 'archived', ( 'archiveblog' === $_GET['action'] ) ? '1' : '0' );\n\t\tbreak;\n\n\t\tcase 'activateblog':\n\t\t\tupdate_blog_status( $id, 'deleted', '0' );\n\n\t\t\t/**\n\t\t\t * Fires after a network site is activated.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param string $id The ID of the activated site.\n\t\t\t */\n\t\t\tdo_action( 'activate_blog', $id );\n\t\tbreak;\n\n\t\tcase 'deactivateblog':\n\t\t\t/**\n\t\t\t * Fires before a network site is deactivated.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param string $id The ID of the site being deactivated.\n\t\t\t */\n\t\t\tdo_action( 'deactivate_blog', $id );\n\t\t\tupdate_blog_status( $id, 'deleted', '1' );\n\t\tbreak;\n\n\t\tcase 'unspamblog':\n\t\tcase 'spamblog':\n\t\t\tupdate_blog_status( $id, 'spam', ( 'spamblog' === $_GET['action'] ) ? '1' : '0' );\n\t\tbreak;\n\n\t\tcase 'unmatureblog':\n\t\tcase 'matureblog':\n\t\t\tupdate_blog_status( $id, 'mature', ( 'matureblog' === $_GET['action'] ) ? '1' : '0' );\n\t\tbreak;\n\t}\n\n\tif ( empty( $updated_action ) && array_key_exists( $_GET['action'], $manage_actions ) ) {\n\t\t$updated_action = $_GET['action'];\n\t}\n\n\tif ( ! empty( $updated_action ) ) {\n\t\twp_safe_redirect( add_query_arg( array( 'updated' => $updated_action ), wp_get_referer() ) );\n\t\texit();\n\t}\n}\n\n$msg = '';\nif ( isset( $_GET['updated'] ) ) {\n\tswitch ( $_GET['updated'] ) {\n\t\tcase 'all_notspam':\n\t\t\t$msg = __( 'Sites removed from spam.' );\n\t\tbreak;\n\t\tcase 'all_spam':\n\t\t\t$msg = __( 'Sites marked as spam.' );\n\t\tbreak;\n\t\tcase 'all_delete':\n\t\t\t$msg = __( 'Sites deleted.' );\n\t\tbreak;\n\t\tcase 'delete':\n\t\t\t$msg = __( 'Site deleted.' );\n\t\tbreak;\n\t\tcase 'not_deleted':\n\t\t\t$msg = __( 'You do not have permission to delete that site.' );\n\t\tbreak;\n\t\tcase 'archiveblog':\n\t\t\t$msg = __( 'Site archived.' );\n\t\tbreak;\n\t\tcase 'unarchiveblog':\n\t\t\t$msg = __( 'Site unarchived.' );\n\t\tbreak;\n\t\tcase 'activateblog':\n\t\t\t$msg = __( 'Site activated.' );\n\t\tbreak;\n\t\tcase 'deactivateblog':\n\t\t\t$msg = __( 'Site deactivated.' );\n\t\tbreak;\n\t\tcase 'unspamblog':\n\t\t\t$msg = __( 'Site removed from spam.' );\n\t\tbreak;\n\t\tcase 'spamblog':\n\t\t\t$msg = __( 'Site marked as spam.' );\n\t\tbreak;\n\t\tdefault:\n\t\t\t/**\n\t\t\t * Filter a specific, non-default site-updated message in the Network admin.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$_GET['updated']`, refers to the\n\t\t\t * non-default site update action.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param string $msg The update message. Default 'Settings saved'.\n\t\t\t */\n\t\t\t$msg = apply_filters( 'network_sites_updated_message_' . $_GET['updated'], __( 'Settings saved.' ) );\n\t\tbreak;\n\t}\n\n\tif ( ! empty( $msg ) )\n\t\t$msg = '<div class=\"updated\" id=\"message notice is-dismissible\"><p>' . $msg . '</p></div>';\n}\n\n$wp_list_table->prepare_items();\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1><?php _e( 'Sites' ); ?>\n\n<?php if ( current_user_can( 'create_sites') ) : ?>\n\t<a href=\"<?php echo network_admin_url('site-new.php'); ?>\" class=\"page-title-action\"><?php echo esc_html_x( 'Add New', 'site' ); ?></a>\n<?php endif; ?>\n\n<?php if ( isset( $_REQUEST['s'] ) && $_REQUEST['s'] ) {\n\tprintf( '<span class=\"subtitle\">' . __( 'Search results for &#8220;%s&#8221;' ) . '</span>', esc_html( $s ) );\n} ?>\n</h1>\n\n<?php echo $msg; ?>\n\n<form method=\"get\" id=\"ms-search\">\n<?php $wp_list_table->search_box( __( 'Search Sites' ), 'site' ); ?>\n<input type=\"hidden\" name=\"action\" value=\"blogs\" />\n</form>\n\n<form id=\"form-site-list\" action=\"sites.php?action=allblogs\" method=\"post\">\n\t<?php $wp_list_table->display(); ?>\n</form>\n</div>\n<?php\n\nrequire_once( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/theme-editor.php",
    "content": "<?php\n/**\n * Theme editor network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/theme-editor.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/theme-install.php",
    "content": "<?php\n/**\n * Install theme network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\nif ( isset( $_GET['tab'] ) && ( 'theme-information' == $_GET['tab'] ) )\n\tdefine( 'IFRAME_REQUEST', true );\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/theme-install.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/themes.php",
    "content": "<?php\n/**\n * Multisite themes administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( !current_user_can('manage_network_themes') )\n\twp_die( __( 'You do not have sufficient permissions to manage network themes.' ) );\n\n$wp_list_table = _get_list_table('WP_MS_Themes_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n\n$action = $wp_list_table->current_action();\n\n$s = isset($_REQUEST['s']) ? $_REQUEST['s'] : '';\n\n// Clean up request URI from temporary args for screen options/paging uri's to work as expected.\n$temp_args = array( 'enabled', 'disabled', 'deleted', 'error' );\n$_SERVER['REQUEST_URI'] = remove_query_arg( $temp_args, $_SERVER['REQUEST_URI'] );\n$referer = remove_query_arg( $temp_args, wp_get_referer() );\n\nif ( $action ) {\n\t$allowed_themes = get_site_option( 'allowedthemes' );\n\tswitch ( $action ) {\n\t\tcase 'enable':\n\t\t\tcheck_admin_referer('enable-theme_' . $_GET['theme']);\n\t\t\t$allowed_themes[ $_GET['theme'] ] = true;\n\t\t\tupdate_site_option( 'allowedthemes', $allowed_themes );\n\t\t\tif ( false === strpos( $referer, '/network/themes.php' ) )\n\t\t\t\twp_redirect( network_admin_url( 'themes.php?enabled=1' ) );\n\t\t\telse\n\t\t\t\twp_safe_redirect( add_query_arg( 'enabled', 1, $referer ) );\n\t\t\texit;\n\t\tcase 'disable':\n\t\t\tcheck_admin_referer('disable-theme_' . $_GET['theme']);\n\t\t\tunset( $allowed_themes[ $_GET['theme'] ] );\n\t\t\tupdate_site_option( 'allowedthemes', $allowed_themes );\n\t\t\twp_safe_redirect( add_query_arg( 'disabled', '1', $referer ) );\n\t\t\texit;\n\t\tcase 'enable-selected':\n\t\t\tcheck_admin_referer('bulk-themes');\n\t\t\t$themes = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();\n\t\t\tif ( empty($themes) ) {\n\t\t\t\twp_safe_redirect( add_query_arg( 'error', 'none', $referer ) );\n\t\t\t\texit;\n\t\t\t}\n\t\t\tforeach ( (array) $themes as $theme )\n\t\t\t\t$allowed_themes[ $theme ] = true;\n\t\t\tupdate_site_option( 'allowedthemes', $allowed_themes );\n\t\t\twp_safe_redirect( add_query_arg( 'enabled', count( $themes ), $referer ) );\n\t\t\texit;\n\t\tcase 'disable-selected':\n\t\t\tcheck_admin_referer('bulk-themes');\n\t\t\t$themes = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();\n\t\t\tif ( empty($themes) ) {\n\t\t\t\twp_safe_redirect( add_query_arg( 'error', 'none', $referer ) );\n\t\t\t\texit;\n\t\t\t}\n\t\t\tforeach ( (array) $themes as $theme )\n\t\t\t\tunset( $allowed_themes[ $theme ] );\n\t\t\tupdate_site_option( 'allowedthemes', $allowed_themes );\n\t\t\twp_safe_redirect( add_query_arg( 'disabled', count( $themes ), $referer ) );\n\t\t\texit;\n\t\tcase 'update-selected' :\n\t\t\tcheck_admin_referer( 'bulk-themes' );\n\n\t\t\tif ( isset( $_GET['themes'] ) )\n\t\t\t\t$themes = explode( ',', $_GET['themes'] );\n\t\t\telseif ( isset( $_POST['checked'] ) )\n\t\t\t\t$themes = (array) $_POST['checked'];\n\t\t\telse\n\t\t\t\t$themes = array();\n\n\t\t\t$title = __( 'Update Themes' );\n\t\t\t$parent_file = 'themes.php';\n\n\t\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t\techo '<div class=\"wrap\">';\n\t\t\techo '<h1>' . esc_html( $title ) . '</h1>';\n\n\t\t\t$url = self_admin_url('update.php?action=update-selected-themes&amp;themes=' . urlencode( join(',', $themes) ));\n\t\t\t$url = wp_nonce_url($url, 'bulk-update-themes');\n\n\t\t\techo \"<iframe src='$url' style='width: 100%; height:100%; min-height:850px;'></iframe>\";\n\t\t\techo '</div>';\n\t\t\trequire_once(ABSPATH . 'wp-admin/admin-footer.php');\n\t\t\texit;\n\t\tcase 'delete-selected':\n\t\t\tif ( ! current_user_can( 'delete_themes' ) ) {\n\t\t\t\twp_die( __('You do not have sufficient permissions to delete themes for this site.') );\n\t\t\t}\n\n\t\t\tcheck_admin_referer( 'bulk-themes' );\n\n\t\t\t$themes = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array();\n\n\t\t\tif ( empty( $themes ) ) {\n\t\t\t\twp_safe_redirect( add_query_arg( 'error', 'none', $referer ) );\n\t\t\t\texit;\n\t\t\t}\n\n\t\t\t$themes = array_diff( $themes, array( get_option( 'stylesheet' ), get_option( 'template' ) ) );\n\n\t\t\tif ( empty( $themes ) ) {\n\t\t\t\twp_safe_redirect( add_query_arg( 'error', 'main', $referer ) );\n\t\t\t\texit;\n\t\t\t}\n\n\t\t\t$files_to_delete = $theme_info = array();\n\t\t\t$theme_translations = wp_get_installed_translations( 'themes' );\n\t\t\tforeach ( $themes as $key => $theme ) {\n\t\t\t\t$theme_info[ $theme ] = wp_get_theme( $theme );\n\n\t\t\t\t// Locate all the files in that folder.\n\t\t\t\t$files = list_files( $theme_info[ $theme ]->get_stylesheet_directory() );\n\t\t\t\tif ( $files ) {\n\t\t\t\t\t$files_to_delete = array_merge( $files_to_delete, $files );\n\t\t\t\t}\n\n\t\t\t\t// Add translation files.\n\t\t\t\t$theme_slug = $theme_info[ $theme ]->get_stylesheet();\n\t\t\t\tif ( ! empty( $theme_translations[ $theme_slug ] ) ) {\n\t\t\t\t\t$translations = $theme_translations[ $theme_slug ];\n\n\t\t\t\t\tforeach ( $translations as $translation => $data ) {\n\t\t\t\t\t\t$files_to_delete[] = $theme_slug . '-' . $translation . '.po';\n\t\t\t\t\t\t$files_to_delete[] = $theme_slug . '-' . $translation . '.mo';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinclude(ABSPATH . 'wp-admin/update.php');\n\n\t\t\t$parent_file = 'themes.php';\n\n\t\t\tif ( ! isset( $_REQUEST['verify-delete'] ) ) {\n\t\t\t\twp_enqueue_script( 'jquery' );\n\t\t\t\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\t\t\t\t$themes_to_delete = count( $themes );\n\t\t\t\t?>\n\t\t\t<div class=\"wrap\">\n\t\t\t\t<?php if ( 1 == $themes_to_delete ) : ?>\n\t\t\t\t\t<h1><?php _e( 'Delete Theme' ); ?></h1>\n\t\t\t\t\t<div class=\"error\"><p><strong><?php _e( 'Caution:' ); ?></strong> <?php _e( 'This theme may be active on other sites in the network.' ); ?></p></div>\n\t\t\t\t\t<p><?php _e( 'You are about to remove the following theme:' ); ?></p>\n\t\t\t\t<?php else : ?>\n\t\t\t\t\t<h1><?php _e( 'Delete Themes' ); ?></h1>\n\t\t\t\t\t<div class=\"error\"><p><strong><?php _e( 'Caution:' ); ?></strong> <?php _e( 'These themes may be active on other sites in the network.' ); ?></p></div>\n\t\t\t\t\t<p><?php _e( 'You are about to remove the following themes:' ); ?></p>\n\t\t\t\t<?php endif; ?>\n\t\t\t\t\t<ul class=\"ul-disc\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\tforeach ( $theme_info as $theme ) {\n\t\t\t\t\t\t\t/* translators: 1: theme name, 2: theme author */\n\t\t\t\t\t\t\techo '<li>', sprintf( __('<strong>%1$s</strong> by <em>%2$s</em>' ), $theme->display('Name'), $theme->display('Author') ), '</li>';\n\t\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t\t</ul>\n\t\t\t\t<?php if ( 1 == $themes_to_delete ) : ?>\n\t\t\t\t\t<p><?php _e( 'Are you sure you wish to delete this theme?' ); ?></p>\n\t\t\t\t<?php else : ?>\n\t\t\t\t\t<p><?php _e( 'Are you sure you wish to delete these themes?' ); ?></p>\n\t\t\t\t<?php endif; ?>\n\t\t\t\t<form method=\"post\" action=\"<?php echo esc_url($_SERVER['REQUEST_URI']); ?>\" style=\"display:inline;\">\n\t\t\t\t\t<input type=\"hidden\" name=\"verify-delete\" value=\"1\" />\n\t\t\t\t\t<input type=\"hidden\" name=\"action\" value=\"delete-selected\" />\n\t\t\t\t\t<?php\n\t\t\t\t\t\tforeach ( (array) $themes as $theme ) {\n\t\t\t\t\t\t\techo '<input type=\"hidden\" name=\"checked[]\" value=\"' . esc_attr($theme) . '\" />';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twp_nonce_field( 'bulk-themes' );\n\n\t\t\t\t\t\tif ( 1 == $themes_to_delete ) {\n\t\t\t\t\t\t\tsubmit_button( __( 'Yes, delete this theme' ), 'button', 'submit', false );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsubmit_button( __( 'Yes, delete these themes' ), 'button', 'submit', false );\n\t\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t</form>\n\t\t\t\t<?php\n\t\t\t\t$referer = wp_get_referer();\n\t\t\t\t?>\n\t\t\t\t<form method=\"post\" action=\"<?php echo $referer ? esc_url( $referer ) : ''; ?>\" style=\"display:inline;\">\n\t\t\t\t\t<?php submit_button( __( 'No, return me to the theme list' ), 'button', 'submit', false ); ?>\n\t\t\t\t</form>\n\n\t\t\t\t<p><a href=\"#\" onclick=\"jQuery('#files-list').toggle(); return false;\"><?php _e('Click to view entire list of files which will be deleted'); ?></a></p>\n\t\t\t\t<div id=\"files-list\" style=\"display:none;\">\n\t\t\t\t\t<ul class=\"code\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\tforeach ( (array) $files_to_delete as $file ) {\n\t\t\t\t\t\t\techo '<li>' . esc_html( str_replace( WP_CONTENT_DIR . '/themes', '', $file ) ) . '</li>';\n\t\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\t<?php\n\t\t\t\trequire_once(ABSPATH . 'wp-admin/admin-footer.php');\n\t\t\t\texit;\n\t\t\t} // Endif verify-delete\n\n\t\t\tforeach ( $themes as $theme ) {\n\t\t\t\t$delete_result = delete_theme( $theme, esc_url( add_query_arg( array(\n\t\t\t\t\t'verify-delete' => 1,\n\t\t\t\t\t'action' => 'delete-selected',\n\t\t\t\t\t'checked' => $_REQUEST['checked'],\n\t\t\t\t\t'_wpnonce' => $_REQUEST['_wpnonce']\n\t\t\t\t), network_admin_url( 'themes.php' ) ) ) );\n\t\t\t}\n\n\t\t\t$paged = ( $_REQUEST['paged'] ) ? $_REQUEST['paged'] : 1;\n\t\t\twp_redirect( add_query_arg( array(\n\t\t\t\t'deleted' => count( $themes ),\n\t\t\t\t'paged' => $paged,\n\t\t\t\t's' => $s\n\t\t\t), network_admin_url( 'themes.php' ) ) );\n\t\t\texit;\n\t}\n}\n\n$wp_list_table->prepare_items();\n\nadd_thickbox();\n\nadd_screen_option( 'per_page' );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('This screen enables and disables the inclusion of themes available to choose in the Appearance menu for each site. It does not activate or deactivate which theme a site is currently using.') . '</p>' .\n\t\t'<p>' . __('If the network admin disables a theme that is in use, it can still remain selected on that site. If another theme is chosen, the disabled theme will not appear in the site&#8217;s Appearance > Themes screen.') . '</p>' .\n\t\t'<p>' . __('Themes can be enabled on a site by site basis by the network admin on the Edit Site screen (which has a Themes tab); get there via the Edit action link on the All Sites screen. Only network admins are able to install or edit themes.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Themes_Screen\" target=\"_blank\">Documentation on Network Themes</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter themes list' ),\n\t'heading_pagination' => __( 'Themes list navigation' ),\n\t'heading_list'       => __( 'Themes list' ),\n) );\n\n$title = __('Themes');\n$parent_file = 'themes.php';\n\nwp_enqueue_script( 'theme-preview' );\n\nrequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); if ( current_user_can('install_themes') ) { ?> <a href=\"theme-install.php\" class=\"page-title-action\"><?php echo esc_html_x('Add New', 'theme'); ?></a><?php }\nif ( $s )\n\tprintf( '<span class=\"subtitle\">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( $s ) ); ?>\n</h1>\n\n<?php\nif ( isset( $_GET['enabled'] ) ) {\n\t$enabled = absint( $_GET['enabled'] );\n\tif ( 1 == $enabled ) {\n\t\t$message = __( 'Theme enabled.' );\n\t} else {\n\t\t$message = _n( '%s theme enabled.', '%s themes enabled.', $enabled );\n\t}\n\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . sprintf( $message, number_format_i18n( $enabled ) ) . '</p></div>';\n} elseif ( isset( $_GET['disabled'] ) ) {\n\t$disabled = absint( $_GET['disabled'] );\n\tif ( 1 == $disabled ) {\n\t\t$message = __( 'Theme disabled.' );\n\t} else {\n\t\t$message = _n( '%s theme disabled.', '%s themes disabled.', $disabled );\n\t}\n\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . sprintf( $message, number_format_i18n( $disabled ) ) . '</p></div>';\n} elseif ( isset( $_GET['deleted'] ) ) {\n\t$deleted = absint( $_GET['deleted'] );\n\tif ( 1 == $deleted ) {\n\t\t$message = __( 'Theme deleted.' );\n\t} else {\n\t\t$message = _n( '%s theme deleted.', '%s themes deleted.', $deleted );\n\t}\n\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . sprintf( $message, number_format_i18n( $deleted ) ) . '</p></div>';\n} elseif ( isset( $_GET['error'] ) && 'none' == $_GET['error'] ) {\n\techo '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __( 'No theme selected.' ) . '</p></div>';\n} elseif ( isset( $_GET['error'] ) && 'main' == $_GET['error'] ) {\n\techo '<div class=\"error notice is-dismissible\"><p>' . __( 'You cannot delete a theme while it is active on the main site.' ) . '</p></div>';\n}\n\n?>\n\n<form method=\"get\">\n<?php $wp_list_table->search_box( __( 'Search Installed Themes' ), 'theme' ); ?>\n</form>\n\n<?php\n$wp_list_table->views();\n\nif ( 'broken' == $status )\n\techo '<p class=\"clear\">' . __('The following themes are installed but incomplete. Themes must have a stylesheet and a template.') . '</p>';\n?>\n\n<form method=\"post\">\n<input type=\"hidden\" name=\"theme_status\" value=\"<?php echo esc_attr($status) ?>\" />\n<input type=\"hidden\" name=\"paged\" value=\"<?php echo esc_attr($page) ?>\" />\n\n<?php $wp_list_table->display(); ?>\n</form>\n\n</div>\n\n<?php\ninclude(ABSPATH . 'wp-admin/admin-footer.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/update-core.php",
    "content": "<?php\n/**\n * Updates network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/update-core.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/update.php",
    "content": "<?php\n/**\n * Update/Install Plugin/Theme network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\nif ( isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'update-selected', 'activate-plugin', 'update-selected-themes' ) ) )\n\tdefine( 'IFRAME_REQUEST', true );\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/update.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/upgrade.php",
    "content": "<?php\n/**\n * Multisite upgrade administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire_once( ABSPATH . WPINC . '/http.php' );\n\n$title = __( 'Upgrade Network' );\n$parent_file = 'upgrade.php';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('Only use this screen once you have updated to a new version of WordPress through Updates/Available Updates (via the Network Administration navigation menu or the Toolbar). Clicking the Upgrade Network button will step through each site in the network, five at a time, and make sure any database updates are applied.') . '</p>' .\n\t\t'<p>' . __('If a version update to core has not happened, clicking this button won&#8217;t affect anything.') . '</p>' .\n\t\t'<p>' . __('If this process fails for any reason, users logging in to their sites will force the same update.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Updates_Screen\" target=\"_blank\">Documentation on Upgrade Network</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\nif ( ! current_user_can( 'manage_network' ) )\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\necho '<div class=\"wrap\">';\necho '<h1>' . __( 'Upgrade Network' ) . '</h1>';\n\n$action = isset($_GET['action']) ? $_GET['action'] : 'show';\n\nswitch ( $action ) {\n\tcase \"upgrade\":\n\t\t$n = ( isset($_GET['n']) ) ? intval($_GET['n']) : 0;\n\n\t\tif ( $n < 5 ) {\n\t\t\t/**\n\t\t\t * @global string $wp_db_version\n\t\t\t */\n\t\t\tglobal $wp_db_version;\n\t\t\tupdate_site_option( 'wpmu_upgrade_site', $wp_db_version );\n\t\t}\n\n\t\t$blogs = $wpdb->get_results( \"SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' AND spam = '0' AND deleted = '0' AND archived = '0' ORDER BY registered DESC LIMIT {$n}, 5\", ARRAY_A );\n\t\tif ( empty( $blogs ) ) {\n\t\t\techo '<p>' . __( 'All done!' ) . '</p>';\n\t\t\tbreak;\n\t\t}\n\t\techo \"<ul>\";\n\t\tforeach ( (array) $blogs as $details ) {\n\t\t\tswitch_to_blog( $details['blog_id'] );\n\t\t\t$siteurl = site_url();\n\t\t\t$upgrade_url = admin_url( 'upgrade.php?step=upgrade_db' );\n\t\t\trestore_current_blog();\n\n\t\t\techo \"<li>$siteurl</li>\";\n\n\t\t\t$response = wp_remote_get( $upgrade_url, array( 'timeout' => 120, 'httpversion' => '1.1' ) );\n\t\t\tif ( is_wp_error( $response ) ) {\n\t\t\t\twp_die( sprintf(\n\t\t\t\t\t/* translators: 1: site url, 2: server error message */\n\t\t\t\t\t__( 'Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: %2$s' ),\n\t\t\t\t\t$siteurl,\n\t\t\t\t\t'<em>' . $response->get_error_message() . '</em>'\n\t\t\t\t) );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Fires after the Multisite DB upgrade for each site is complete.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param array|WP_Error $response The upgrade response array or WP_Error on failure.\n\t\t\t */\n\t\t\tdo_action( 'after_mu_upgrade', $response );\n\t\t\t/**\n\t\t\t * Fires after each site has been upgraded.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param int $blog_id The id of the blog.\n\t\t\t */\n\t\t\tdo_action( 'wpmu_upgrade_site', $details[ 'blog_id' ] );\n\t\t}\n\t\techo \"</ul>\";\n\t\t?><p><?php _e( 'If your browser doesn&#8217;t start loading the next page automatically, click this link:' ); ?> <a class=\"button\" href=\"upgrade.php?action=upgrade&amp;n=<?php echo ($n + 5) ?>\"><?php _e(\"Next Sites\"); ?></a></p>\n\t\t<script type=\"text/javascript\">\n\t\t<!--\n\t\tfunction nextpage() {\n\t\t\tlocation.href = \"upgrade.php?action=upgrade&n=<?php echo ($n + 5) ?>\";\n\t\t}\n\t\tsetTimeout( \"nextpage()\", 250 );\n\t\t//-->\n\t\t</script><?php\n\tbreak;\n\tcase 'show':\n\tdefault:\n\t\tif ( get_site_option( 'wpmu_upgrade_site' ) != $GLOBALS['wp_db_version'] ) :\n\t\t?>\n\t\t<h2><?php _e( 'Database Update Required' ); ?></h2>\n\t\t<p><?php _e( 'WordPress has been updated! Before we send you on your way, we need to individually upgrade the sites in your network.' ); ?></p>\n\t\t<?php endif; ?>\n\n\t\t<p><?php _e( 'The database update process may take a little while, so please be patient.' ); ?></p>\n\t\t<p><a class=\"button button-primary\" href=\"upgrade.php?action=upgrade\"><?php _e( 'Upgrade Network' ); ?></a></p>\n\t\t<?php\n\t\t/**\n\t\t * Fires before the footer on the network upgrade screen.\n\t\t *\n\t\t * @since MU\n\t\t */\n\t\tdo_action( 'wpmu_upgrade_page' );\n\tbreak;\n}\n?>\n</div>\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/user-edit.php",
    "content": "<?php\n/**\n * Edit user network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nrequire( ABSPATH . 'wp-admin/user-edit.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/user-new.php",
    "content": "<?php\n/**\n * Add New User network administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can('create_users') )\n\twp_die(__('You do not have sufficient permissions to add users to this network.'));\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('Add User will set up a new user account on the network and send that person an email with username and password.') . '</p>' .\n\t\t'<p>' . __('Users who are signed up to the network without a site are added as subscribers to the main or primary dashboard site, giving them profile pages to manage their accounts. These users will only see Dashboard and My Sites in the main navigation until a site is created for them.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Users_Screen\" target=\"_blank\">Documentation on Network Users</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nif ( isset($_REQUEST['action']) && 'add-user' == $_REQUEST['action'] ) {\n\tcheck_admin_referer( 'add-user', '_wpnonce_add-user' );\n\n\tif ( ! current_user_can( 'manage_network_users' ) )\n\t\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n\tif ( ! is_array( $_POST['user'] ) )\n\t\twp_die( __( 'Cannot create an empty user.' ) );\n\n\t$user = wp_unslash( $_POST['user'] );\n\n\t$user_details = wpmu_validate_user_signup( $user['username'], $user['email'] );\n\tif ( is_wp_error( $user_details[ 'errors' ] ) && ! empty( $user_details[ 'errors' ]->errors ) ) {\n\t\t$add_user_errors = $user_details[ 'errors' ];\n\t} else {\n\t\t$password = wp_generate_password( 12, false);\n\t\t$user_id = wpmu_create_user( esc_html( strtolower( $user['username'] ) ), $password, sanitize_email( $user['email'] ) );\n\n\t\tif ( ! $user_id ) {\n\t \t\t$add_user_errors = new WP_Error( 'add_user_fail', __( 'Cannot add user.' ) );\n\t\t} else {\n\t\t\t/**\n\t\t\t  * Fires after a new user has been created via the network user-new.php page.\n\t\t\t  *\n\t\t\t  * @since 4.4.0\n\t\t\t  *\n\t\t\t  * @param int $user_id ID of the newly created user.\n\t\t\t  */\n\t\t\tdo_action( 'network_user_new_created_user', $user_id );\n\t\t\twp_redirect( add_query_arg( array('update' => 'added'), 'user-new.php' ) );\n\t\t\texit;\n\t\t}\n\t}\n}\n\nif ( isset($_GET['update']) ) {\n\t$messages = array();\n\tif ( 'added' == $_GET['update'] )\n\t\t$messages[] = __('User added.');\n}\n\n$title = __('Add New User');\n$parent_file = 'users.php';\n\nrequire( ABSPATH . 'wp-admin/admin-header.php' ); ?>\n\n<div class=\"wrap\">\n<h1 id=\"add-new-user\"><?php _e( 'Add New User' ); ?></h1>\n<?php\nif ( ! empty( $messages ) ) {\n\tforeach ( $messages as $msg )\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . $msg . '</p></div>';\n}\n\nif ( isset( $add_user_errors ) && is_wp_error( $add_user_errors ) ) { ?>\n\t<div class=\"error\">\n\t\t<?php\n\t\t\tforeach ( $add_user_errors->get_error_messages() as $message )\n\t\t\t\techo \"<p>$message</p>\";\n\t\t?>\n\t</div>\n<?php } ?>\n\t<form action=\"<?php echo network_admin_url('user-new.php?action=add-user'); ?>\" id=\"adduser\" method=\"post\" novalidate=\"novalidate\">\n\t<table class=\"form-table\">\n\t\t<tr class=\"form-field form-required\">\n\t\t\t<th scope=\"row\"><label for=\"username\"><?php _e( 'Username' ) ?></label></th>\n\t\t\t<td><input type=\"text\" class=\"regular-text\" name=\"user[username]\" id=\"username\" autocapitalize=\"none\" autocorrect=\"off\" maxlength=\"60\" /></td>\n\t\t</tr>\n\t\t<tr class=\"form-field form-required\">\n\t\t\t<th scope=\"row\"><label for=\"email\"><?php _e( 'Email' ) ?></label></th>\n\t\t\t<td><input type=\"email\" class=\"regular-text\" name=\"user[email]\" id=\"email\"/></td>\n\t\t</tr>\n\t\t<tr class=\"form-field\">\n\t\t\t<td colspan=\"2\"><?php _e( 'A password reset link will be sent to the user via email.' ) ?></td>\n\t\t</tr>\n\t</table>\n\t<?php wp_nonce_field( 'add-user', '_wpnonce_add-user' ); ?>\n\t<?php submit_button( __('Add User'), 'primary', 'add-user' ); ?>\n\t</form>\n</div>\n<?php\nrequire( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network/users.php",
    "content": "<?php\n/**\n * Multisite users administration panel.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_multisite() )\n\twp_die( __( 'Multisite support is not enabled.' ) );\n\nif ( ! current_user_can( 'manage_network_users' ) )\n\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\nif ( isset( $_GET['action'] ) ) {\n\t/** This action is documented in wp-admin/network/edit.php */\n\tdo_action( 'wpmuadminedit' );\n\n\tswitch ( $_GET['action'] ) {\n\t\tcase 'deleteuser':\n\t\t\tif ( ! current_user_can( 'manage_network_users' ) )\n\t\t\t\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n\t\t\tcheck_admin_referer( 'deleteuser' );\n\n\t\t\t$id = intval( $_GET['id'] );\n\t\t\tif ( $id != '0' && $id != '1' ) {\n\t\t\t\t$_POST['allusers'] = array( $id ); // confirm_delete_users() can only handle with arrays\n\t\t\t\t$title = __( 'Users' );\n\t\t\t\t$parent_file = 'users.php';\n\t\t\t\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\t\t\t\techo '<div class=\"wrap\">';\n\t\t\t\tconfirm_delete_users( $_POST['allusers'] );\n\t\t\t\techo '</div>';\n\t\t\t\trequire_once( ABSPATH . 'wp-admin/admin-footer.php' );\n\t\t\t} else {\n\t\t\t\twp_redirect( network_admin_url( 'users.php' ) );\n\t\t\t}\n\t\t\texit();\n\n\t\tcase 'allusers':\n\t\t\tif ( !current_user_can( 'manage_network_users' ) )\n\t\t\t\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n\t\t\tif ( ( isset( $_POST['action']) || isset($_POST['action2'] ) ) && isset( $_POST['allusers'] ) ) {\n\t\t\t\tcheck_admin_referer( 'bulk-users-network' );\n\n\t\t\t\t$doaction = $_POST['action'] != -1 ? $_POST['action'] : $_POST['action2'];\n\t\t\t\t$userfunction = '';\n\n\t\t\t\tforeach ( (array) $_POST['allusers'] as $user_id ) {\n\t\t\t\t\tif ( !empty( $user_id ) ) {\n\t\t\t\t\t\tswitch ( $doaction ) {\n\t\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\t\tif ( ! current_user_can( 'delete_users' ) )\n\t\t\t\t\t\t\t\t\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\t\t\t\t\t\t\t\t$title = __( 'Users' );\n\t\t\t\t\t\t\t\t$parent_file = 'users.php';\n\t\t\t\t\t\t\t\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\t\t\t\t\t\t\t\techo '<div class=\"wrap\">';\n\t\t\t\t\t\t\t\tconfirm_delete_users( $_POST['allusers'] );\n\t\t\t\t\t\t\t\techo '</div>';\n\t\t\t\t\t\t\t\trequire_once( ABSPATH . 'wp-admin/admin-footer.php' );\n\t\t\t\t\t\t\t\texit();\n\n\t\t\t\t\t\t\tcase 'spam':\n\t\t\t\t\t\t\t\t$user = get_userdata( $user_id );\n\t\t\t\t\t\t\t\tif ( is_super_admin( $user->ID ) )\n\t\t\t\t\t\t\t\t\twp_die( sprintf( __( 'Warning! User cannot be modified. The user %s is a network administrator.' ), esc_html( $user->user_login ) ) );\n\n\t\t\t\t\t\t\t\t$userfunction = 'all_spam';\n\t\t\t\t\t\t\t\t$blogs = get_blogs_of_user( $user_id, true );\n\t\t\t\t\t\t\t\tforeach ( (array) $blogs as $details ) {\n\t\t\t\t\t\t\t\t\tif ( $details->userblog_id != $current_site->blog_id ) // main blog not a spam !\n\t\t\t\t\t\t\t\t\t\tupdate_blog_status( $details->userblog_id, 'spam', '1' );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tupdate_user_status( $user_id, 'spam', '1' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'notspam':\n\t\t\t\t\t\t\t\t$userfunction = 'all_notspam';\n\t\t\t\t\t\t\t\t$blogs = get_blogs_of_user( $user_id, true );\n\t\t\t\t\t\t\t\tforeach ( (array) $blogs as $details )\n\t\t\t\t\t\t\t\t\tupdate_blog_status( $details->userblog_id, 'spam', '0' );\n\n\t\t\t\t\t\t\t\tupdate_user_status( $user_id, 'spam', '0' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twp_safe_redirect( add_query_arg( array( 'updated' => 'true', 'action' => $userfunction ), wp_get_referer() ) );\n\t\t\t} else {\n\t\t\t\t$location = network_admin_url( 'users.php' );\n\n\t\t\t\tif ( ! empty( $_REQUEST['paged'] ) )\n\t\t\t\t\t$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );\n\t\t\t\twp_redirect( $location );\n\t\t\t}\n\t\t\texit();\n\n\t\tcase 'dodelete':\n\t\t\tcheck_admin_referer( 'ms-users-delete' );\n\t\t\tif ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) )\n\t\t\t\twp_die( __( 'You do not have permission to access this page.' ), 403 );\n\n\t\t\tif ( ! empty( $_POST['blog'] ) && is_array( $_POST['blog'] ) ) {\n\t\t\t\tforeach ( $_POST['blog'] as $id => $users ) {\n\t\t\t\t\tforeach ( $users as $blogid => $user_id ) {\n\t\t\t\t\t\tif ( ! current_user_can( 'delete_user', $id ) )\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tif ( ! empty( $_POST['delete'] ) && 'reassign' == $_POST['delete'][$blogid][$id] )\n\t\t\t\t\t\t\tremove_user_from_blog( $id, $blogid, $user_id );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tremove_user_from_blog( $id, $blogid );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t$i = 0;\n\t\t\tif ( is_array( $_POST['user'] ) && ! empty( $_POST['user'] ) )\n\t\t\t\tforeach ( $_POST['user'] as $id ) {\n\t\t\t\t\tif ( ! current_user_can( 'delete_user', $id ) )\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\twpmu_delete_user( $id );\n\t\t\t\t\t$i++;\n\t\t\t\t}\n\n\t\t\tif ( $i == 1 )\n\t\t\t\t$deletefunction = 'delete';\n\t\t\telse\n\t\t\t\t$deletefunction = 'all_delete';\n\n\t\t\twp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => $deletefunction ), network_admin_url( 'users.php' ) ) );\n\t\t\texit();\n\t}\n}\n\n$wp_list_table = _get_list_table('WP_MS_Users_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n$wp_list_table->prepare_items();\n$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );\n\nif ( $pagenum > $total_pages && $total_pages > 0 ) {\n\twp_redirect( add_query_arg( 'paged', $total_pages ) );\n\texit;\n}\n$title = __( 'Users' );\n$parent_file = 'users.php';\n\nadd_screen_option( 'per_page' );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' =>\n\t\t'<p>' . __('This table shows all users across the network and the sites to which they are assigned.') . '</p>' .\n\t\t'<p>' . __('Hover over any user on the list to make the edit links appear. The Edit link on the left will take you to their Edit User profile page; the Edit link on the right by any site name goes to an Edit Site screen for that site.') . '</p>' .\n\t\t'<p>' . __('You can also go to the user&#8217;s profile page by clicking on the individual username.') . '</p>' .\n\t\t'<p>' . __('You can sort the table by clicking on any of the bold headings and switch between list and excerpt views by using the icons in the upper right.') . '</p>' .\n\t\t'<p>' . __('The bulk action will permanently delete selected users, or mark/unmark those selected as spam. Spam users will have posts removed and will be unable to sign up again with the same email addresses.') . '</p>' .\n\t\t'<p>' . __('You can make an existing user an additional super admin by going to the Edit User profile page and checking the box to grant that privilege.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Network_Admin_Users_Screen\" target=\"_blank\">Documentation on Network Users</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/forum/multisite/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter users list' ),\n\t'heading_pagination' => __( 'Users list navigation' ),\n\t'heading_list'       => __( 'Users list' ),\n) );\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\nif ( isset( $_REQUEST['updated'] ) && $_REQUEST['updated'] == 'true' && ! empty( $_REQUEST['action'] ) ) {\n\t?>\n\t<div id=\"message\" class=\"updated notice is-dismissible\"><p>\n\t\t<?php\n\t\tswitch ( $_REQUEST['action'] ) {\n\t\t\tcase 'delete':\n\t\t\t\t_e( 'User deleted.' );\n\t\t\tbreak;\n\t\t\tcase 'all_spam':\n\t\t\t\t_e( 'Users marked as spam.' );\n\t\t\tbreak;\n\t\t\tcase 'all_notspam':\n\t\t\t\t_e( 'Users removed from spam.' );\n\t\t\tbreak;\n\t\t\tcase 'all_delete':\n\t\t\t\t_e( 'Users deleted.' );\n\t\t\tbreak;\n\t\t\tcase 'add':\n\t\t\t\t_e( 'User added.' );\n\t\t\tbreak;\n\t\t}\n\t\t?>\n\t</p></div>\n\t<?php\n}\n\t?>\n<div class=\"wrap\">\n\t<h1><?php esc_html_e( 'Users' );\n\tif ( current_user_can( 'create_users') ) : ?>\n\t\t<a href=\"<?php echo network_admin_url('user-new.php'); ?>\" class=\"page-title-action\"><?php echo esc_html_x( 'Add New', 'user' ); ?></a><?php\n\tendif;\n\n\tif ( !empty( $usersearch ) )\n\tprintf( '<span class=\"subtitle\">' . __( 'Search results for &#8220;%s&#8221;' ) . '</span>', esc_html( $usersearch ) );\n\t?>\n\t</h1>\n\n\t<?php $wp_list_table->views(); ?>\n\n\t<form method=\"get\" class=\"search-form\">\n\t\t<?php $wp_list_table->search_box( __( 'Search Users' ), 'all-user' ); ?>\n\t</form>\n\n\t<form id=\"form-user-list\" action=\"users.php?action=allusers\" method=\"post\">\n\t\t<?php $wp_list_table->display(); ?>\n\t</form>\n</div>\n\n<?php require_once( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/network.php",
    "content": "<?php\n/**\n * Network installation administration panel.\n *\n * A multi-step process allowing the user to enable a network of WordPress sites.\n *\n * @since 3.0.0\n *\n * @package WordPress\n * @subpackage Administration\n */\n\ndefine( 'WP_INSTALLING_NETWORK', true );\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! is_super_admin() ) {\n\twp_die( __( 'You do not have sufficient permissions to manage options for this site.' ) );\n}\n\nif ( is_multisite() ) {\n\tif ( ! is_network_admin() ) {\n\t\twp_redirect( network_admin_url( 'setup.php' ) );\n\t\texit;\n\t}\n\n\tif ( ! defined( 'MULTISITE' ) ) {\n\t\twp_die( __( 'The Network creation panel is not for WordPress MU networks.' ) );\n\t}\n}\n\nrequire_once( dirname( __FILE__ ) . '/includes/network.php' );\n\n// We need to create references to ms global tables to enable Network.\nforeach ( $wpdb->tables( 'ms_global' ) as $table => $prefixed_table ) {\n\t$wpdb->$table = $prefixed_table;\n}\n\nif ( ! network_domain_check() && ( ! defined( 'WP_ALLOW_MULTISITE' ) || ! WP_ALLOW_MULTISITE ) ) {\n\twp_die(\n\t\tprintf(\n\t\t\t/* translators: 1: WP_ALLOW_MULTISITE 2: wp-config.php */\n\t\t\t__( 'You must define the %1$s constant as true in your %2$s file to allow creation of a Network.' ),\n\t\t\t'<code>WP_ALLOW_MULTISITE</code>',\n\t\t\t'<code>wp-config.php</code>'\n\t\t)\n\t);\n}\n\nif ( is_network_admin() ) {\n\t$title = __( 'Network Setup' );\n\t$parent_file = 'settings.php';\n} else {\n\t$title = __( 'Create a Network of WordPress Sites' );\n\t$parent_file = 'tools.php';\n}\n\n$network_help = '<p>' . __('This screen allows you to configure a network as having subdomains (<code>site1.example.com</code>) or subdirectories (<code>example.com/site1</code>). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it.') . '</p>' .\n\t'<p>' . __('Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your install. Fill out the network details, and click install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories).') . '</p>' .\n\t'<p>' . __('The next screen for Network Setup will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files.') . '</p>' .\n\t'<p>' . __('Add the designated lines of code to wp-config.php (just before <code>/*...stop editing...*/</code>) and <code>.htaccess</code> (replacing the existing WordPress rules).') . '</p>' .\n\t'<p>' . __('Once you add this code and refresh your browser, multisite should be enabled. This screen, now in the Network Admin navigation menu, will keep an archive of the added code. You can toggle between Network Admin and Site Admin by clicking on the Network Admin or an individual site name under the My Sites dropdown in the Toolbar.') . '</p>' .\n\t'<p>' . __('The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with &#8220;/blog/&#8221; from the main site. This disabling will be addressed in a future version.') . '</p>' .\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Create_A_Network\" target=\"_blank\">Documentation on Creating a Network</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Tools_Network_Screen\" target=\"_blank\">Documentation on the Network Screen</a>') . '</p>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'network',\n\t'title'   => __('Network'),\n\t'content' => $network_help,\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Create_A_Network\" target=\"_blank\">Documentation on Creating a Network</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Tools_Network_Screen\" target=\"_blank\">Documentation on the Network Screen</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<?php\nif ( $_POST ) {\n\n\tcheck_admin_referer( 'install-network-1' );\n\n\trequire_once( ABSPATH . 'wp-admin/includes/upgrade.php' );\n\t// Create network tables.\n\tinstall_network();\n\t$base              = parse_url( trailingslashit( get_option( 'home' ) ), PHP_URL_PATH );\n\t$subdomain_install = allow_subdomain_install() ? !empty( $_POST['subdomain_install'] ) : false;\n\tif ( ! network_domain_check() ) {\n\t\t$result = populate_network( 1, get_clean_basedomain(), sanitize_email( $_POST['email'] ), wp_unslash( $_POST['sitename'] ), $base, $subdomain_install );\n\t\tif ( is_wp_error( $result ) ) {\n\t\t\tif ( 1 == count( $result->get_error_codes() ) && 'no_wildcard_dns' == $result->get_error_code() )\n\t\t\t\tnetwork_step2( $result );\n\t\t\telse\n\t\t\t\tnetwork_step1( $result );\n\t\t} else {\n\t\t\tnetwork_step2();\n\t\t}\n\t} else {\n\t\tnetwork_step2();\n\t}\n} elseif ( is_multisite() || network_domain_check() ) {\n\tnetwork_step2();\n} else {\n\tnetwork_step1();\n}\n?>\n</div>\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/options-discussion.php",
    "content": "<?php\n/**\n * Discussion settings administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'manage_options' ) )\n\twp_die( __( 'You do not have sufficient permissions to manage options for this site.' ) );\n\n$title = __('Discussion Settings');\n$parent_file = 'options-general.php';\n\nadd_action( 'admin_print_footer_scripts', 'options_discussion_add_js' );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => '<p>' . __('This screen provides many options for controlling the management and display of comments and links to your posts/pages. So many, in fact, they won&#8217;t all fit here! :) Use the documentation links to get information on what each discussion setting does.') . '</p>' .\n\t\t'<p>' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '</p>',\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Settings_Discussion_Screen\" target=\"_blank\">Documentation on Discussion Settings</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<form method=\"post\" action=\"options.php\">\n<?php settings_fields('discussion'); ?>\n\n<table class=\"form-table\">\n<tr>\n<th scope=\"row\"><?php _e('Default article settings'); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Default article settings'); ?></span></legend>\n<label for=\"default_pingback_flag\">\n<input name=\"default_pingback_flag\" type=\"checkbox\" id=\"default_pingback_flag\" value=\"1\" <?php checked('1', get_option('default_pingback_flag')); ?> />\n<?php _e('Attempt to notify any blogs linked to from the article'); ?></label>\n<br />\n<label for=\"default_ping_status\">\n<input name=\"default_ping_status\" type=\"checkbox\" id=\"default_ping_status\" value=\"open\" <?php checked('open', get_option('default_ping_status')); ?> />\n<?php _e('Allow link notifications from other blogs (pingbacks and trackbacks) on new articles'); ?></label>\n<br />\n<label for=\"default_comment_status\">\n<input name=\"default_comment_status\" type=\"checkbox\" id=\"default_comment_status\" value=\"open\" <?php checked('open', get_option('default_comment_status')); ?> />\n<?php _e('Allow people to post comments on new articles'); ?></label>\n<br />\n<p class=\"description\"><?php echo '(' . __( 'These settings may be overridden for individual articles.' ) . ')'; ?></p>\n</fieldset></td>\n</tr>\n<tr>\n<th scope=\"row\"><?php _e('Other comment settings'); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Other comment settings'); ?></span></legend>\n<label for=\"require_name_email\"><input type=\"checkbox\" name=\"require_name_email\" id=\"require_name_email\" value=\"1\" <?php checked('1', get_option('require_name_email')); ?> /> <?php _e('Comment author must fill out name and email'); ?></label>\n<br />\n<label for=\"comment_registration\">\n<input name=\"comment_registration\" type=\"checkbox\" id=\"comment_registration\" value=\"1\" <?php checked('1', get_option('comment_registration')); ?> />\n<?php _e('Users must be registered and logged in to comment'); ?>\n<?php if ( !get_option( 'users_can_register' ) && is_multisite() ) echo ' ' . __( '(Signup has been disabled. Only members of this site can comment.)' ); ?>\n</label>\n<br />\n\n<label for=\"close_comments_for_old_posts\">\n<input name=\"close_comments_for_old_posts\" type=\"checkbox\" id=\"close_comments_for_old_posts\" value=\"1\" <?php checked('1', get_option('close_comments_for_old_posts')); ?> />\n<?php printf( __('Automatically close comments on articles older than %s days'), '</label><label for=\"close_comments_days_old\"><input name=\"close_comments_days_old\" type=\"number\" min=\"0\" step=\"1\" id=\"close_comments_days_old\" value=\"' . esc_attr(get_option('close_comments_days_old')) . '\" class=\"small-text\" />'); ?>\n</label>\n<br />\n<label for=\"thread_comments\">\n<input name=\"thread_comments\" type=\"checkbox\" id=\"thread_comments\" value=\"1\" <?php checked('1', get_option('thread_comments')); ?> />\n<?php\n/**\n * Filter the maximum depth of threaded/nested comments.\n *\n * @since 2.7.0.\n *\n * @param int $max_depth The maximum depth of threaded comments. Default 10.\n */\n$maxdeep = (int) apply_filters( 'thread_comments_depth_max', 10 );\n\n$thread_comments_depth = '</label><label for=\"thread_comments_depth\"><select name=\"thread_comments_depth\" id=\"thread_comments_depth\">';\nfor ( $i = 2; $i <= $maxdeep; $i++ ) {\n\t$thread_comments_depth .= \"<option value='\" . esc_attr($i) . \"'\";\n\tif ( get_option('thread_comments_depth') == $i ) $thread_comments_depth .= \" selected='selected'\";\n\t$thread_comments_depth .= \">$i</option>\";\n}\n$thread_comments_depth .= '</select>';\n\nprintf( __('Enable threaded (nested) comments %s levels deep'), $thread_comments_depth );\n\n?></label>\n<br />\n<label for=\"page_comments\">\n<input name=\"page_comments\" type=\"checkbox\" id=\"page_comments\" value=\"1\" <?php checked( '1', get_option( 'page_comments' ) ); ?> />\n<?php\n$default_comments_page = '</label><label for=\"default_comments_page\"><select name=\"default_comments_page\" id=\"default_comments_page\"><option value=\"newest\"';\nif ( 'newest' == get_option('default_comments_page') ) $default_comments_page .= ' selected=\"selected\"';\n$default_comments_page .= '>' . __('last') . '</option><option value=\"oldest\"';\nif ( 'oldest' == get_option('default_comments_page') ) $default_comments_page .= ' selected=\"selected\"';\n$default_comments_page .= '>' . __('first') . '</option></select>';\n\nprintf( __('Break comments into pages with %1$s top level comments per page and the %2$s page displayed by default'), '</label><label for=\"comments_per_page\"><input name=\"comments_per_page\" type=\"number\" step=\"1\" min=\"0\" id=\"comments_per_page\" value=\"' . esc_attr(get_option('comments_per_page')) . '\" class=\"small-text\" />', $default_comments_page );\n\n?></label>\n<br />\n<label for=\"comment_order\"><?php\n\n$comment_order = '<select name=\"comment_order\" id=\"comment_order\"><option value=\"asc\"';\nif ( 'asc' == get_option('comment_order') ) $comment_order .= ' selected=\"selected\"';\n$comment_order .= '>' . __('older') . '</option><option value=\"desc\"';\nif ( 'desc' == get_option('comment_order') ) $comment_order .= ' selected=\"selected\"';\n$comment_order .= '>' . __('newer') . '</option></select>';\n\nprintf( __('Comments should be displayed with the %s comments at the top of each page'), $comment_order );\n\n?></label>\n</fieldset></td>\n</tr>\n<tr>\n<th scope=\"row\"><?php _e('Email me whenever'); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Email me whenever'); ?></span></legend>\n<label for=\"comments_notify\">\n<input name=\"comments_notify\" type=\"checkbox\" id=\"comments_notify\" value=\"1\" <?php checked('1', get_option('comments_notify')); ?> />\n<?php _e('Anyone posts a comment'); ?> </label>\n<br />\n<label for=\"moderation_notify\">\n<input name=\"moderation_notify\" type=\"checkbox\" id=\"moderation_notify\" value=\"1\" <?php checked('1', get_option('moderation_notify')); ?> />\n<?php _e('A comment is held for moderation'); ?> </label>\n</fieldset></td>\n</tr>\n<tr>\n<th scope=\"row\"><?php _e('Before a comment appears'); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Before a comment appears'); ?></span></legend>\n<label for=\"comment_moderation\">\n<input name=\"comment_moderation\" type=\"checkbox\" id=\"comment_moderation\" value=\"1\" <?php checked('1', get_option('comment_moderation')); ?> />\n<?php _e('Comment must be manually approved'); ?> </label>\n<br />\n<label for=\"comment_whitelist\"><input type=\"checkbox\" name=\"comment_whitelist\" id=\"comment_whitelist\" value=\"1\" <?php checked('1', get_option('comment_whitelist')); ?> /> <?php _e('Comment author must have a previously approved comment'); ?></label>\n</fieldset></td>\n</tr>\n<tr>\n<th scope=\"row\"><?php _e('Comment Moderation'); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Comment Moderation'); ?></span></legend>\n<p><label for=\"comment_max_links\"><?php printf(__('Hold a comment in the queue if it contains %s or more links. (A common characteristic of comment spam is a large number of hyperlinks.)'), '<input name=\"comment_max_links\" type=\"number\" step=\"1\" min=\"0\" id=\"comment_max_links\" value=\"' . esc_attr(get_option('comment_max_links')) . '\" class=\"small-text\" />' ); ?></label></p>\n\n<p><label for=\"moderation_keys\"><?php _e('When a comment contains any of these words in its content, name, URL, email, or IP, it will be held in the <a href=\"edit-comments.php?comment_status=moderated\">moderation queue</a>. One word or IP per line. It will match inside words, so &#8220;press&#8221; will match &#8220;WordPress&#8221;.'); ?></label></p>\n<p>\n<textarea name=\"moderation_keys\" rows=\"10\" cols=\"50\" id=\"moderation_keys\" class=\"large-text code\"><?php echo esc_textarea( get_option( 'moderation_keys' ) ); ?></textarea>\n</p>\n</fieldset></td>\n</tr>\n<tr>\n<th scope=\"row\"><?php _e('Comment Blacklist'); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Comment Blacklist'); ?></span></legend>\n<p><label for=\"blacklist_keys\"><?php _e('When a comment contains any of these words in its content, name, URL, email, or IP, it will be put in the trash. One word or IP per line. It will match inside words, so &#8220;press&#8221; will match &#8220;WordPress&#8221;.'); ?></label></p>\n<p>\n<textarea name=\"blacklist_keys\" rows=\"10\" cols=\"50\" id=\"blacklist_keys\" class=\"large-text code\"><?php echo esc_textarea( get_option( 'blacklist_keys' ) ); ?></textarea>\n</p>\n</fieldset></td>\n</tr>\n<?php do_settings_fields('discussion', 'default'); ?>\n</table>\n\n<h2 class=\"title\"><?php _e('Avatars'); ?></h2>\n\n<p><?php _e('An avatar is an image that follows you from weblog to weblog appearing beside your name when you comment on avatar enabled sites. Here you can enable the display of avatars for people who comment on your site.'); ?></p>\n\n<?php\n// the above would be a good place to link to codex documentation on the gravatar functions, for putting it in themes. anything like that?\n\n$show_avatars = get_option( 'show_avatars' );\n?>\n\n<table class=\"form-table\">\n<tr>\n<th scope=\"row\"><?php _e('Avatar Display'); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Avatar Display'); ?></span></legend>\n\t<label for=\"show_avatars\">\n\t\t<input type=\"checkbox\" id=\"show_avatars\" name=\"show_avatars\" value=\"1\" <?php checked( $show_avatars, 1 ); ?> />\n\t\t<?php _e( 'Show Avatars' ); ?>\n\t</label>\n</fieldset></td>\n</tr>\n<tr class=\"avatar-settings<?php if ( ! $show_avatars ) echo ' hide-if-js'; ?>\">\n<th scope=\"row\"><?php _e('Maximum Rating'); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Maximum Rating'); ?></span></legend>\n\n<?php\n$ratings = array(\n\t/* translators: Content suitability rating: http://bit.ly/89QxZA */\n\t'G' => __('G &#8212; Suitable for all audiences'),\n\t/* translators: Content suitability rating: http://bit.ly/89QxZA */\n\t'PG' => __('PG &#8212; Possibly offensive, usually for audiences 13 and above'),\n\t/* translators: Content suitability rating: http://bit.ly/89QxZA */\n\t'R' => __('R &#8212; Intended for adult audiences above 17'),\n\t/* translators: Content suitability rating: http://bit.ly/89QxZA */\n\t'X' => __('X &#8212; Even more mature than above')\n);\nforeach ($ratings as $key => $rating) :\n\t$selected = (get_option('avatar_rating') == $key) ? 'checked=\"checked\"' : '';\n\techo \"\\n\\t<label><input type='radio' name='avatar_rating' value='\" . esc_attr($key) . \"' $selected/> $rating</label><br />\";\nendforeach;\n?>\n\n</fieldset></td>\n</tr>\n<tr class=\"avatar-settings<?php if ( ! $show_avatars ) echo ' hide-if-js'; ?>\">\n<th scope=\"row\"><?php _e('Default Avatar'); ?></th>\n<td class=\"defaultavatarpicker\"><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Default Avatar'); ?></span></legend>\n\n<?php _e('For users without a custom avatar of their own, you can either display a generic logo or a generated one based on their email address.'); ?><br />\n\n<?php\n$avatar_defaults = array(\n\t'mystery' => __('Mystery Person'),\n\t'blank' => __('Blank'),\n\t'gravatar_default' => __('Gravatar Logo'),\n\t'identicon' => __('Identicon (Generated)'),\n\t'wavatar' => __('Wavatar (Generated)'),\n\t'monsterid' => __('MonsterID (Generated)'),\n\t'retro' => __('Retro (Generated)')\n);\n/**\n * Filter the default avatars.\n *\n * Avatars are stored in key/value pairs, where the key is option value,\n * and the name is the displayed avatar name.\n *\n * @since 2.6.0\n *\n * @param array $avatar_defaults Array of default avatars.\n */\n$avatar_defaults = apply_filters( 'avatar_defaults', $avatar_defaults );\n$default = get_option( 'avatar_default', 'mystery' );\n$size = 32;\n$avatar_list = '';\n\n// Force avatars on to display these choices\nadd_filter( 'pre_option_show_avatars', '__return_true', 100 );\n\nforeach ( $avatar_defaults as $default_key => $default_name ) {\n\t$selected = ($default == $default_key) ? 'checked=\"checked\" ' : '';\n\t$avatar_list .= \"\\n\\t<label><input type='radio' name='avatar_default' id='avatar_{$default_key}' value='\" . esc_attr($default_key) . \"' {$selected}/> \";\n\n\t$avatar = get_avatar( $user_email, $size, $default_key );\n\t$avatar = preg_replace( \"/src='(.+?)'/\", \"src='\\$1&amp;forcedefault=1'\", $avatar );\n\t$avatar = preg_replace( \"/srcset='(.+?) 2x'/\", \"srcset='\\$1&amp;forcedefault=1 2x'\", $avatar );\n\t$avatar_list .= $avatar;\n\n\t$avatar_list .= ' ' . $default_name . '</label>';\n\t$avatar_list .= '<br />';\n}\n\nremove_filter( 'pre_option_show_avatars', '__return_true', 100 );\n\n/**\n * Filter the HTML output of the default avatar list.\n *\n * @since 2.6.0\n *\n * @param string $avatar_list HTML markup of the avatar list.\n */\necho apply_filters( 'default_avatar_select', $avatar_list );\n?>\n\n</fieldset></td>\n</tr>\n<?php do_settings_fields('discussion', 'avatars'); ?>\n</table>\n\n<?php do_settings_sections('discussion'); ?>\n\n<?php submit_button(); ?>\n</form>\n</div>\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/options-general.php",
    "content": "<?php\n/**\n * General settings administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n/** WordPress Translation Install API */\nrequire_once( ABSPATH . 'wp-admin/includes/translation-install.php' );\n\nif ( ! current_user_can( 'manage_options' ) )\n\twp_die( __( 'You do not have sufficient permissions to manage options for this site.' ) );\n\n$title = __('General Settings');\n$parent_file = 'options-general.php';\n/* translators: date and time format for exact current time, mainly about timezones, see http://php.net/date */\n$timezone_format = _x('Y-m-d H:i:s', 'timezone date format');\n\nadd_action('admin_head', 'options_general_add_js');\n\n$options_help = '<p>' . __('The fields on this screen determine some of the basics of your site setup.') . '</p>' .\n\t'<p>' . __('Most themes display the site title at the top of every page, in the title bar of the browser, and as the identifying name for syndicated feeds. The tagline is also displayed by many themes.') . '</p>';\n\nif ( ! is_multisite() ) {\n\t$options_help .= '<p>' . __('The WordPress URL and the Site URL can be the same (example.com) or different; for example, having the WordPress core files (example.com/wordpress) in a subdirectory instead of the root directory.') . '</p>' .\n\t\t'<p>' . __('If you want site visitors to be able to register themselves, as opposed to by the site administrator, check the membership box. A default user role can be set for all new users, whether self-registered or registered by the site admin.') . '</p>';\n}\n\n$options_help .= '<p>' . __( 'You can set the language, and the translation files will be automatically downloaded and installed (available if your filesystem is writable).' ) . '</p>' .\n\t'<p>' . __( 'UTC means Coordinated Universal Time.' ) . '</p>' .\n\t'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.' ) . '</p>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => $options_help,\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Settings_General_Screen\" target=\"_blank\">Documentation on General Settings</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<form method=\"post\" action=\"options.php\" novalidate=\"novalidate\">\n<?php settings_fields('general'); ?>\n\n<table class=\"form-table\">\n<tr>\n<th scope=\"row\"><label for=\"blogname\"><?php _e('Site Title') ?></label></th>\n<td><input name=\"blogname\" type=\"text\" id=\"blogname\" value=\"<?php form_option('blogname'); ?>\" class=\"regular-text\" /></td>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"blogdescription\"><?php _e('Tagline') ?></label></th>\n<td><input name=\"blogdescription\" type=\"text\" id=\"blogdescription\" aria-describedby=\"tagline-description\" value=\"<?php form_option('blogdescription'); ?>\" class=\"regular-text\" />\n<p class=\"description\" id=\"tagline-description\"><?php _e( 'In a few words, explain what this site is about.' ) ?></p></td>\n</tr>\n<?php if ( !is_multisite() ) { ?>\n<tr>\n<th scope=\"row\"><label for=\"siteurl\"><?php _e('WordPress Address (URL)') ?></label></th>\n<td><input name=\"siteurl\" type=\"url\" id=\"siteurl\" value=\"<?php form_option( 'siteurl' ); ?>\"<?php disabled( defined( 'WP_SITEURL' ) ); ?> class=\"regular-text code<?php if ( defined( 'WP_SITEURL' ) ) echo ' disabled' ?>\" /></td>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"home\"><?php _e('Site Address (URL)') ?></label></th>\n<td><input name=\"home\" type=\"url\" id=\"home\" aria-describedby=\"home-description\" value=\"<?php form_option( 'home' ); ?>\"<?php disabled( defined( 'WP_HOME' ) ); ?> class=\"regular-text code<?php if ( defined( 'WP_HOME' ) ) echo ' disabled' ?>\" />\n<?php if ( ! defined( 'WP_HOME' ) ) : ?> \n<p class=\"description\" id=\"home-description\"><?php _e( 'Enter the address here if you <a href=\"https://codex.wordpress.org/Giving_WordPress_Its_Own_Directory\">want your site home page to be different from your WordPress installation directory.</a>' ); ?></p></td>\n<?php endif; ?>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"admin_email\"><?php _e('Email Address') ?> </label></th>\n<td><input name=\"admin_email\" type=\"email\" id=\"admin_email\" aria-describedby=\"admin-email-description\" value=\"<?php form_option( 'admin_email' ); ?>\" class=\"regular-text ltr\" />\n<p class=\"description\" id=\"admin-email-description\"><?php _e( 'This address is used for admin purposes, like new user notification.' ) ?></p></td>\n</tr>\n<tr>\n<th scope=\"row\"><?php _e('Membership') ?></th>\n<td> <fieldset><legend class=\"screen-reader-text\"><span><?php _e('Membership') ?></span></legend><label for=\"users_can_register\">\n<input name=\"users_can_register\" type=\"checkbox\" id=\"users_can_register\" value=\"1\" <?php checked('1', get_option('users_can_register')); ?> />\n<?php _e('Anyone can register') ?></label>\n</fieldset></td>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"default_role\"><?php _e('New User Default Role') ?></label></th>\n<td>\n<select name=\"default_role\" id=\"default_role\"><?php wp_dropdown_roles( get_option('default_role') ); ?></select>\n</td>\n</tr>\n<?php } else { ?>\n<tr>\n<th scope=\"row\"><label for=\"new_admin_email\"><?php _e('Email Address') ?> </label></th>\n<td><input name=\"new_admin_email\" type=\"email\" id=\"new_admin_email\" aria-describedby=\"new-admin-email-description\" value=\"<?php form_option( 'admin_email' ); ?>\" class=\"regular-text ltr\" />\n<p class=\"description\" id=\"new-admin-email-description\"><?php _e( 'This address is used for admin purposes. If you change this we will send you an email at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ) ?></p>\n<?php\n$new_admin_email = get_option( 'new_admin_email' );\nif ( $new_admin_email && $new_admin_email != get_option('admin_email') ) : ?>\n<div class=\"updated inline\">\n<p><?php\n\t/* translators: 1: new admin email, 2: Cancel link URL */\n\tprintf( __( 'There is a pending change of the admin email to %1$s. <a href=\"%2$s\">Cancel</a>' ),\n\t\t'<code>' . esc_html( $new_admin_email ) . '</code>',\n\t\tesc_url( admin_url( 'options.php?dismiss=new_admin_email' ) )\n\t);\n?></p>\n</div>\n<?php endif; ?>\n</td>\n</tr>\n<?php } ?>\n<tr>\n<?php\n$current_offset = get_option('gmt_offset');\n$tzstring = get_option('timezone_string');\n\n$check_zone_info = true;\n\n// Remove old Etc mappings. Fallback to gmt_offset.\nif ( false !== strpos($tzstring,'Etc/GMT') )\n\t$tzstring = '';\n\nif ( empty($tzstring) ) { // Create a UTC+- zone if no timezone string exists\n\t$check_zone_info = false;\n\tif ( 0 == $current_offset )\n\t\t$tzstring = 'UTC+0';\n\telseif ($current_offset < 0)\n\t\t$tzstring = 'UTC' . $current_offset;\n\telse\n\t\t$tzstring = 'UTC+' . $current_offset;\n}\n\n?>\n<th scope=\"row\"><label for=\"timezone_string\"><?php _e('Timezone') ?></label></th>\n<td>\n\n<select id=\"timezone_string\" name=\"timezone_string\" aria-describedby=\"timezone-description\">\n<?php echo wp_timezone_choice($tzstring); ?>\n</select>\n\n\t<span id=\"utc-time\"><?php\n\t\t/* translators: %s: UTC time */\n\t\tprintf( __( '<abbr title=\"Coordinated Universal Time\">UTC</abbr> time is %s' ),\n\t\t\t'<code>' . date_i18n( $timezone_format, false, 'gmt' ) . '</code>'\n\t\t);\n\t?></span>\n<?php if ( get_option('timezone_string') || !empty($current_offset) ) : ?>\n\t<span id=\"local-time\"><?php\n\t\t/* translators: %s: local time */\n\t\tprintf( __( 'Local time is %s' ),\n\t\t\t'<code>' . date_i18n( $timezone_format ) . '</code>'\n\t\t);\n\t?></span>\n<?php endif; ?>\n<p class=\"description\" id=\"timezone-description\"><?php _e( 'Choose a city in the same timezone as you.' ); ?></p>\n<?php if ($check_zone_info && $tzstring) : ?>\n<br />\n<span>\n\t<?php\n\t// Set TZ so localtime works.\n\tdate_default_timezone_set($tzstring);\n\t$now = localtime(time(), true);\n\tif ( $now['tm_isdst'] )\n\t\t_e('This timezone is currently in daylight saving time.');\n\telse\n\t\t_e('This timezone is currently in standard time.');\n\t?>\n\t<br />\n\t<?php\n\t$allowed_zones = timezone_identifiers_list();\n\n\tif ( in_array( $tzstring, $allowed_zones) ) {\n\t\t$found = false;\n\t\t$date_time_zone_selected = new DateTimeZone($tzstring);\n\t\t$tz_offset = timezone_offset_get($date_time_zone_selected, date_create());\n\t\t$right_now = time();\n\t\tforeach ( timezone_transitions_get($date_time_zone_selected) as $tr) {\n\t\t\tif ( $tr['ts'] > $right_now ) {\n\t\t\t    $found = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( $found ) {\n\t\t\techo ' ';\n\t\t\t$message = $tr['isdst'] ?\n\t\t\t\t/* translators: %s: date and time  */\n\t\t\t\t__( 'Daylight saving time begins on: %s.')  :\n\t\t\t\t/* translators: %s: date and time  */\n\t\t\t\t__( 'Standard time begins on: %s.' );\n\t\t\t// Add the difference between the current offset and the new offset to ts to get the correct transition time from date_i18n().\n\t\t\tprintf( $message,\n\t\t\t\t'<code>' . date_i18n(\n\t\t\t\t\tget_option( 'date_format' ) . ' ' . get_option( 'time_format' ),\n\t\t\t\t\t$tr['ts'] + ( $tz_offset - $tr['offset'] )\n\t\t\t\t) . '</code>'\n\t\t\t);\n\t\t} else {\n\t\t\t_e( 'This timezone does not observe daylight saving time.' );\n\t\t}\n\t}\n\t// Set back to UTC.\n\tdate_default_timezone_set('UTC');\n\t?>\n\t</span>\n<?php endif; ?>\n</td>\n\n</tr>\n<tr>\n<th scope=\"row\"><?php _e('Date Format') ?></th>\n<td>\n\t<fieldset><legend class=\"screen-reader-text\"><span><?php _e('Date Format') ?></span></legend>\n<?php\n\t/**\n\t* Filter the default date formats.\n\t*\n\t* @since 2.7.0\n\t* @since 4.0.0 Added ISO date standard YYYY-MM-DD format.\n\t*\n\t* @param array $default_date_formats Array of default date formats.\n\t*/\n\t$date_formats = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y' ) ) );\n\n\t$custom = true;\n\n\tforeach ( $date_formats as $format ) {\n\t\techo \"\\t<label title='\" . esc_attr($format) . \"'><input type='radio' name='date_format' value='\" . esc_attr($format) . \"'\";\n\t\tif ( get_option('date_format') === $format ) { // checked() uses \"==\" rather than \"===\"\n\t\t\techo \" checked='checked'\";\n\t\t\t$custom = false;\n\t\t}\n\t\techo ' /> ' . date_i18n( $format ) . \"</label><br />\\n\";\n\t}\n\n\techo '\t<label><input type=\"radio\" name=\"date_format\" id=\"date_format_custom_radio\" value=\"\\c\\u\\s\\t\\o\\m\"';\n\tchecked( $custom );\n\techo '/> ' . __( 'Custom:' ) . '<span class=\"screen-reader-text\"> ' . __( 'enter a custom date format in the following field' ) . \"</span></label>\\n\";\n\techo '<label for=\"date_format_custom\" class=\"screen-reader-text\">' . __( 'Custom date format:' ) . '</label><input type=\"text\" name=\"date_format_custom\" id=\"date_format_custom\" value=\"' . esc_attr( get_option('date_format') ) . '\" class=\"small-text\" /> <span class=\"screen-reader-text\">' . __( 'example:' ) . ' </span><span class=\"example\"> ' . date_i18n( get_option('date_format') ) . \"</span> <span class='spinner'></span>\\n\";\n?>\n\t</fieldset>\n</td>\n</tr>\n<tr>\n<th scope=\"row\"><?php _e('Time Format') ?></th>\n<td>\n\t<fieldset><legend class=\"screen-reader-text\"><span><?php _e('Time Format') ?></span></legend>\n<?php\n\t/**\n\t* Filter the default time formats.\n\t*\n\t* @since 2.7.0\n\t*\n\t* @param array $default_time_formats Array of default time formats.\n\t*/\n\t$time_formats = array_unique( apply_filters( 'time_formats', array( __( 'g:i a' ), 'g:i A', 'H:i' ) ) );\n\n\t$custom = true;\n\n\tforeach ( $time_formats as $format ) {\n\t\techo \"\\t<label title='\" . esc_attr($format) . \"'><input type='radio' name='time_format' value='\" . esc_attr($format) . \"'\";\n\t\tif ( get_option('time_format') === $format ) { // checked() uses \"==\" rather than \"===\"\n\t\t\techo \" checked='checked'\";\n\t\t\t$custom = false;\n\t\t}\n\t\techo ' /> ' . date_i18n( $format ) . \"</label><br />\\n\";\n\t}\n\n\techo '\t<label><input type=\"radio\" name=\"time_format\" id=\"time_format_custom_radio\" value=\"\\c\\u\\s\\t\\o\\m\"';\n\tchecked( $custom );\n\techo '/> ' . __( 'Custom:' ) . '<span class=\"screen-reader-text\"> ' . __( 'enter a custom time format in the following field' ) . \"</span></label>\\n\";\n\techo '<label for=\"time_format_custom\" class=\"screen-reader-text\">' . __( 'Custom time format:' ) . '</label><input type=\"text\" name=\"time_format_custom\" id=\"time_format_custom\" value=\"' . esc_attr( get_option('time_format') ) . '\" class=\"small-text\" /> <span class=\"screen-reader-text\">' . __( 'example:' ) . ' </span><span class=\"example\"> ' . date_i18n( get_option('time_format') ) . \"</span> <span class='spinner'></span>\\n\";\n\n\techo \"\\t<p>\" . __('<a href=\"https://codex.wordpress.org/Formatting_Date_and_Time\">Documentation on date and time formatting</a>.') . \"</p>\\n\";\n?>\n\t</fieldset>\n</td>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"start_of_week\"><?php _e('Week Starts On') ?></label></th>\n<td><select name=\"start_of_week\" id=\"start_of_week\">\n<?php\n/**\n * @global WP_Locale $wp_locale\n */\nglobal $wp_locale;\n\nfor ($day_index = 0; $day_index <= 6; $day_index++) :\n\t$selected = (get_option('start_of_week') == $day_index) ? 'selected=\"selected\"' : '';\n\techo \"\\n\\t<option value='\" . esc_attr($day_index) . \"' $selected>\" . $wp_locale->get_weekday($day_index) . '</option>';\nendfor;\n?>\n</select></td>\n</tr>\n<?php do_settings_fields('general', 'default'); ?>\n\n<?php\n$languages = get_available_languages();\n$translations = wp_get_available_translations();\nif ( ! is_multisite() && defined( 'WPLANG' ) && '' !== WPLANG && 'en_US' !== WPLANG && ! in_array( WPLANG, $languages ) ) {\n\t$languages[] = WPLANG;\n}\nif ( ! empty( $languages ) || ! empty( $translations ) ) {\n\t?>\n\t<tr>\n\t\t<th width=\"33%\" scope=\"row\"><label for=\"WPLANG\"><?php _e( 'Site Language' ); ?></label></th>\n\t\t<td>\n\t\t\t<?php\n\t\t\t$locale = get_locale();\n\t\t\tif ( ! in_array( $locale, $languages ) ) {\n\t\t\t\t$locale = '';\n\t\t\t}\n\n\t\t\twp_dropdown_languages( array(\n\t\t\t\t'name'         => 'WPLANG',\n\t\t\t\t'id'           => 'WPLANG',\n\t\t\t\t'selected'     => $locale,\n\t\t\t\t'languages'    => $languages,\n\t\t\t\t'translations' => $translations,\n\t\t\t\t'show_available_translations' => ( ! is_multisite() || is_super_admin() ) && wp_can_install_language_pack(),\n\t\t\t) );\n\n\t\t\t// Add note about deprecated WPLANG constant.\n\t\t\tif ( defined( 'WPLANG' ) && ( '' !== WPLANG ) && $locale !== WPLANG ) {\n\t\t\t\tif ( is_super_admin() ) {\n\t\t\t\t\t?>\n\t\t\t\t\t<p class=\"description\">\n\t\t\t\t\t\t<strong><?php _e( 'Note:' ); ?></strong> <?php printf( __( 'The %s constant in your %s file is no longer needed.' ), '<code>WPLANG</code>', '<code>wp-config.php</code>' ); ?>\n\t\t\t\t\t</p>\n\t\t\t\t\t<?php\n\t\t\t\t}\n\t\t\t\t_deprecated_argument( 'define()', '4.0', sprintf( __( 'The %s constant in your %s file is no longer needed.' ), 'WPLANG', 'wp-config.php' ) );\n\t\t\t}\n\t\t\t?>\n\t\t</td>\n\t</tr>\n\t<?php\n}\n?>\n</table>\n\n<?php do_settings_sections('general'); ?>\n\n<?php submit_button(); ?>\n</form>\n\n</div>\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/options-head.php",
    "content": "<?php\n/**\n * WordPress Options Header.\n *\n * Displays updated message, if updated variable is part of the URL query.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\nwp_reset_vars( array( 'action' ) );\n\nif ( isset( $_GET['updated'] ) && isset( $_GET['page'] ) ) {\n\t// For backwards compat with plugins that don't use the Settings API and just set updated=1 in the redirect\n\tadd_settings_error('general', 'settings_updated', __('Settings saved.'), 'updated');\n}\n\nsettings_errors();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/options-media.php",
    "content": "<?php\n/**\n * Media settings administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'manage_options' ) )\n\twp_die( __( 'You do not have sufficient permissions to manage options for this site.' ) );\n\n$title = __('Media Settings');\n$parent_file = 'options-general.php';\n\n$media_options_help = '<p>' . __('You can set maximum sizes for images inserted into your written content; you can also insert an image as Full Size.') . '</p>';\n\nif ( ! is_multisite() && ( get_option('upload_url_path') || ( get_option('upload_path') != 'wp-content/uploads' && get_option('upload_path') ) ) ) {\n\t$media_options_help .= '<p>' . __('Uploading Files allows you to choose the folder and path for storing your uploaded files.') . '</p>';\n}\n\n$media_options_help .= '<p>' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '</p>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => $media_options_help,\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Settings_Media_Screen\" target=\"_blank\">Documentation on Media Settings</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<form action=\"options.php\" method=\"post\">\n<?php settings_fields('media'); ?>\n\n<h2 class=\"title\"><?php _e('Image sizes') ?></h2>\n<p><?php _e( 'The sizes listed below determine the maximum dimensions in pixels to use when adding an image to the Media Library.' ); ?></p>\n\n<table class=\"form-table\">\n<tr>\n<th scope=\"row\"><?php _e('Thumbnail size') ?></th>\n<td>\n<label for=\"thumbnail_size_w\"><?php _e('Width'); ?></label>\n<input name=\"thumbnail_size_w\" type=\"number\" step=\"1\" min=\"0\" id=\"thumbnail_size_w\" value=\"<?php form_option('thumbnail_size_w'); ?>\" class=\"small-text\" />\n<label for=\"thumbnail_size_h\"><?php _e('Height'); ?></label>\n<input name=\"thumbnail_size_h\" type=\"number\" step=\"1\" min=\"0\" id=\"thumbnail_size_h\" value=\"<?php form_option('thumbnail_size_h'); ?>\" class=\"small-text\" /><br />\n<input name=\"thumbnail_crop\" type=\"checkbox\" id=\"thumbnail_crop\" value=\"1\" <?php checked('1', get_option('thumbnail_crop')); ?>/>\n<label for=\"thumbnail_crop\"><?php _e('Crop thumbnail to exact dimensions (normally thumbnails are proportional)'); ?></label>\n</td>\n</tr>\n\n<tr>\n<th scope=\"row\"><?php _e('Medium size') ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Medium size'); ?></span></legend>\n<label for=\"medium_size_w\"><?php _e('Max Width'); ?></label>\n<input name=\"medium_size_w\" type=\"number\" step=\"1\" min=\"0\" id=\"medium_size_w\" value=\"<?php form_option('medium_size_w'); ?>\" class=\"small-text\" />\n<label for=\"medium_size_h\"><?php _e('Max Height'); ?></label>\n<input name=\"medium_size_h\" type=\"number\" step=\"1\" min=\"0\" id=\"medium_size_h\" value=\"<?php form_option('medium_size_h'); ?>\" class=\"small-text\" />\n</fieldset></td>\n</tr>\n\n<tr>\n<th scope=\"row\"><?php _e('Large size') ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Large size'); ?></span></legend>\n<label for=\"large_size_w\"><?php _e('Max Width'); ?></label>\n<input name=\"large_size_w\" type=\"number\" step=\"1\" min=\"0\" id=\"large_size_w\" value=\"<?php form_option('large_size_w'); ?>\" class=\"small-text\" />\n<label for=\"large_size_h\"><?php _e('Max Height'); ?></label>\n<input name=\"large_size_h\" type=\"number\" step=\"1\" min=\"0\" id=\"large_size_h\" value=\"<?php form_option('large_size_h'); ?>\" class=\"small-text\" />\n</fieldset></td>\n</tr>\n\n<?php do_settings_fields('media', 'default'); ?>\n</table>\n\n<?php\n/**\n * @global array $wp_settings\n */\nif ( isset( $GLOBALS['wp_settings']['media']['embeds'] ) ) : ?>\n<h2 class=\"title\"><?php _e('Embeds') ?></h2>\n<table class=\"form-table\">\n<?php do_settings_fields( 'media', 'embeds' ); ?>\n</table>\n<?php endif; ?>\n\n<?php if ( !is_multisite() ) : ?>\n<h2 class=\"title\"><?php _e('Uploading Files'); ?></h2>\n<table class=\"form-table\">\n<?php\n// If upload_url_path is not the default (empty), and upload_path is not the default ('wp-content/uploads' or empty)\nif ( get_option('upload_url_path') || ( get_option('upload_path') != 'wp-content/uploads' && get_option('upload_path') ) ) :\n?>\n<tr>\n<th scope=\"row\"><label for=\"upload_path\"><?php _e('Store uploads in this folder'); ?></label></th>\n<td><input name=\"upload_path\" type=\"text\" id=\"upload_path\" value=\"<?php echo esc_attr(get_option('upload_path')); ?>\" class=\"regular-text code\" />\n<p class=\"description\"><?php\n\t/* translators: %s: wp-content/uploads */\n\tprintf( __( 'Default is %s' ), '<code>wp-content/uploads</code>' );\n?></p>\n</td>\n</tr>\n\n<tr>\n<th scope=\"row\"><label for=\"upload_url_path\"><?php _e('Full URL path to files'); ?></label></th>\n<td><input name=\"upload_url_path\" type=\"text\" id=\"upload_url_path\" value=\"<?php echo esc_attr( get_option('upload_url_path')); ?>\" class=\"regular-text code\" />\n<p class=\"description\"><?php _e('Configuring this is optional. By default, it should be blank.'); ?></p>\n</td>\n</tr>\n<?php endif; ?>\n<tr>\n<th scope=\"row\" colspan=\"2\" class=\"th-full\">\n<label for=\"uploads_use_yearmonth_folders\">\n<input name=\"uploads_use_yearmonth_folders\" type=\"checkbox\" id=\"uploads_use_yearmonth_folders\" value=\"1\"<?php checked('1', get_option('uploads_use_yearmonth_folders')); ?> />\n<?php _e('Organize my uploads into month- and year-based folders'); ?>\n</label>\n</th>\n</tr>\n\n<?php do_settings_fields('media', 'uploads'); ?>\n</table>\n<?php endif; ?>\n\n<?php do_settings_sections('media'); ?>\n\n<?php submit_button(); ?>\n\n</form>\n\n</div>\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/options-permalink.php",
    "content": "<?php\n/**\n * Permalink Settings Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'manage_options' ) )\n\twp_die( __( 'You do not have sufficient permissions to manage options for this site.' ) );\n\n$title = __('Permalink Settings');\n$parent_file = 'options-general.php';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => '<p>' . __('Permalinks are the permanent URLs to your individual pages and blog posts, as well as your category and tag archives. A permalink is the web address used to link to your content. The URL to each post should be permanent, and never change &#8212; hence the name permalink.') . '</p>' .\n\t\t'<p>' . __( 'This screen allows you to choose your permalink structure. You can choose from common settings or create custom URL structures.' ) . '</p>' .\n\t\t'<p>' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '</p>',\n) );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'permalink-settings',\n\t'title'   => __('Permalink Settings'),\n\t'content' => '<p>' . __( 'Permalinks can contain useful information, such as the post date, title, or other elements. You can choose from any of the suggested permalink formats, or you can craft your own if you select Custom Structure.' ) . '</p>' .\n\t\t'<p>' . __( 'If you pick an option other than Plain, your general URL path with structure tags (terms surrounded by <code>%</code>) will also appear in the custom structure field and your path can be further modified there.' ) . '</p>' .\n\t\t'<p>' . __('When you assign multiple categories or tags to a post, only one can show up in the permalink: the lowest numbered category. This applies if your custom structure includes <code>%category%</code> or <code>%tag%</code>.') . '</p>' .\n\t\t'<p>' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '</p>',\n) );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'custom-structures',\n\t'title'   => __('Custom Structures'),\n\t'content' => '<p>' . __('The Optional fields let you customize the &#8220;category&#8221; and &#8220;tag&#8221; base names that will appear in archive URLs. For example, the page listing all posts in the &#8220;Uncategorized&#8221; category could be <code>/topics/uncategorized</code> instead of <code>/category/uncategorized</code>.') . '</p>' .\n\t\t'<p>' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '</p>',\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Settings_Permalinks_Screen\" target=\"_blank\">Documentation on Permalinks Settings</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Using_Permalinks\" target=\"_blank\">Documentation on Using Permalinks</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nadd_filter('admin_head', 'options_permalink_add_js');\n\n$home_path = get_home_path();\n$iis7_permalinks = iis7_supports_permalinks();\n$permalink_structure = get_option( 'permalink_structure' );\n\n$prefix = $blog_prefix = '';\nif ( ! got_url_rewrite() )\n\t$prefix = '/index.php';\n\n/**\n * In a subdirectory configuration of multisite, the `/blog` prefix is used by\n * default on the main site to avoid collisions with other sites created on that\n * network. If the `permalink_structure` option has been changed to remove this\n * base prefix, WordPress core can no longer account for the possible collision.\n */\nif ( is_multisite() && ! is_subdomain_install() && is_main_site() && 0 === strpos( $permalink_structure, '/blog/' ) ) {\n\t$blog_prefix = '/blog';\n}\n\nif ( isset($_POST['permalink_structure']) || isset($_POST['category_base']) ) {\n\tcheck_admin_referer('update-permalink');\n\n\tif ( isset( $_POST['permalink_structure'] ) ) {\n\t\tif ( isset( $_POST['selection'] ) && 'custom' != $_POST['selection'] )\n\t\t\t$permalink_structure = $_POST['selection'];\n\t\telse\n\t\t\t$permalink_structure = $_POST['permalink_structure'];\n\n\t\tif ( ! empty( $permalink_structure ) ) {\n\t\t\t$permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );\n\t\t\tif ( $prefix && $blog_prefix )\n\t\t\t\t$permalink_structure = $prefix . preg_replace( '#^/?index\\.php#', '', $permalink_structure );\n\t\t\telse\n\t\t\t\t$permalink_structure = $blog_prefix . $permalink_structure;\n\t\t}\n\t\t$wp_rewrite->set_permalink_structure( $permalink_structure );\n\t}\n\n\tif ( isset( $_POST['category_base'] ) ) {\n\t\t$category_base = $_POST['category_base'];\n\t\tif ( ! empty( $category_base ) )\n\t\t\t$category_base = $blog_prefix . preg_replace('#/+#', '/', '/' . str_replace( '#', '', $category_base ) );\n\t\t$wp_rewrite->set_category_base( $category_base );\n\t}\n\n\tif ( isset( $_POST['tag_base'] ) ) {\n\t\t$tag_base = $_POST['tag_base'];\n\t\tif ( ! empty( $tag_base ) )\n\t\t\t$tag_base = $blog_prefix . preg_replace('#/+#', '/', '/' . str_replace( '#', '', $tag_base ) );\n\t\t$wp_rewrite->set_tag_base( $tag_base );\n\t}\n\n\twp_redirect( admin_url( 'options-permalink.php?settings-updated=true' ) );\n\texit;\n}\n\n$category_base       = get_option( 'category_base' );\n$tag_base            = get_option( 'tag_base' );\n$update_required     = false;\n\nif ( $iis7_permalinks ) {\n\tif ( ( ! file_exists($home_path . 'web.config') && win_is_writable($home_path) ) || win_is_writable($home_path . 'web.config') )\n\t\t$writable = true;\n\telse\n\t\t$writable = false;\n} elseif ( $is_nginx ) {\n\t$writable = false;\n} else {\n\tif ( ( ! file_exists( $home_path . '.htaccess' ) && is_writable( $home_path ) ) || is_writable( $home_path . '.htaccess' ) ) {\n\t\t$writable = true;\n\t} else {\n\t\t$writable = false;\n\t\t$existing_rules  = array_filter( extract_from_markers( $home_path . '.htaccess', 'WordPress' ) );\n\t\t$new_rules       = array_filter( explode( \"\\n\", $wp_rewrite->mod_rewrite_rules() ) );\n\t\t$update_required = ( $new_rules !== $existing_rules );\n\t}\n}\n\nif ( $wp_rewrite->using_index_permalinks() )\n\t$usingpi = true;\nelse\n\t$usingpi = false;\n\nflush_rewrite_rules();\n\nrequire( ABSPATH . 'wp-admin/admin-header.php' );\n\nif ( ! empty( $_GET['settings-updated'] ) ) : ?>\n<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php\nif ( ! is_multisite() ) {\n\tif ( $iis7_permalinks ) {\n\t\tif ( $permalink_structure && ! $usingpi && ! $writable ) {\n\t\t\t_e('You should update your web.config now.');\n\t\t} elseif ( $permalink_structure && ! $usingpi && $writable ) {\n\t\t\t_e('Permalink structure updated. Remove write access on web.config file now!');\n\t\t} else {\n\t\t\t_e('Permalink structure updated.');\n\t\t}\n\t} elseif ( $is_nginx ) {\n\t\t_e('Permalink structure updated.');\n\t} else {\n\t\tif ( $permalink_structure && ! $usingpi && ! $writable && $update_required ) {\n\t\t\t_e('You should update your .htaccess now.');\n\t\t} else {\n\t\t\t_e('Permalink structure updated.');\n\t\t}\n\t}\n} else {\n\t_e('Permalink structure updated.');\n}\n?>\n</p></div>\n<?php endif; ?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<form name=\"form\" action=\"options-permalink.php\" method=\"post\">\n<?php wp_nonce_field('update-permalink') ?>\n\n  <p><?php _e( 'WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A <a href=\"https://codex.wordpress.org/Using_Permalinks\">number of tags are available</a>, and here are some examples to get you started.' ); ?></p>\n\n<?php\nif ( is_multisite() && ! is_subdomain_install() && is_main_site() && 0 === strpos( $permalink_structure, '/blog/' ) ) {\n\t$permalink_structure = preg_replace( '|^/?blog|', '', $permalink_structure );\n\t$category_base = preg_replace( '|^/?blog|', '', $category_base );\n\t$tag_base = preg_replace( '|^/?blog|', '', $tag_base );\n}\n\n$structures = array(\n\t0 => '',\n\t1 => $prefix . '/%year%/%monthnum%/%day%/%postname%/',\n\t2 => $prefix . '/%year%/%monthnum%/%postname%/',\n\t3 => $prefix . '/' . _x( 'archives', 'sample permalink base' ) . '/%post_id%',\n\t4 => $prefix . '/%postname%/',\n);\n?>\n<h2 class=\"title\"><?php _e('Common Settings'); ?></h2>\n<table class=\"form-table permalink-structure\">\n\t<tr>\n\t\t<th><label><input name=\"selection\" type=\"radio\" value=\"\" <?php checked('', $permalink_structure); ?> /> <?php _e( 'Plain' ); ?></label></th>\n\t\t<td><code><?php echo get_option('home'); ?>/?p=123</code></td>\n\t</tr>\n\t<tr>\n\t\t<th><label><input name=\"selection\" type=\"radio\" value=\"<?php echo esc_attr($structures[1]); ?>\" <?php checked($structures[1], $permalink_structure); ?> /> <?php _e('Day and name'); ?></label></th>\n\t\t<td><code><?php echo get_option('home') . $blog_prefix . $prefix . '/' . date('Y') . '/' . date('m') . '/' . date('d') . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/'; ?></code></td>\n\t</tr>\n\t<tr>\n\t\t<th><label><input name=\"selection\" type=\"radio\" value=\"<?php echo esc_attr($structures[2]); ?>\" <?php checked($structures[2], $permalink_structure); ?> /> <?php _e('Month and name'); ?></label></th>\n\t\t<td><code><?php echo get_option('home') . $blog_prefix . $prefix . '/' . date('Y') . '/' . date('m') . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/'; ?></code></td>\n\t</tr>\n\t<tr>\n\t\t<th><label><input name=\"selection\" type=\"radio\" value=\"<?php echo esc_attr($structures[3]); ?>\" <?php checked($structures[3], $permalink_structure); ?> /> <?php _e('Numeric'); ?></label></th>\n\t\t<td><code><?php echo get_option('home') . $blog_prefix . $prefix . '/' . _x( 'archives', 'sample permalink base' ) . '/123'; ?></code></td>\n\t</tr>\n\t<tr>\n\t\t<th><label><input name=\"selection\" type=\"radio\" value=\"<?php echo esc_attr($structures[4]); ?>\" <?php checked($structures[4], $permalink_structure); ?> /> <?php _e('Post name'); ?></label></th>\n\t\t<td><code><?php echo get_option('home') . $blog_prefix . $prefix . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/'; ?></code></td>\n\t</tr>\n\t<tr>\n\t\t<th>\n\t\t\t<label><input name=\"selection\" id=\"custom_selection\" type=\"radio\" value=\"custom\" <?php checked( !in_array($permalink_structure, $structures) ); ?> />\n\t\t\t<?php _e('Custom Structure'); ?>\n\t\t\t</label>\n\t\t</th>\n\t\t<td>\n\t\t\t<code><?php echo get_option('home') . $blog_prefix; ?></code>\n\t\t\t<input name=\"permalink_structure\" id=\"permalink_structure\" type=\"text\" value=\"<?php echo esc_attr($permalink_structure); ?>\" class=\"regular-text code\" />\n\t\t</td>\n\t</tr>\n</table>\n\n<h2 class=\"title\"><?php _e('Optional'); ?></h2>\n<p><?php\n/* translators: %s is a placeholder that must come at the start of the URL. */\nprintf( __('If you like, you may enter custom structures for your category and tag <abbr title=\"Universal Resource Locator\">URL</abbr>s here. For example, using <code>topics</code> as your category base would make your category links like <code>%s/topics/uncategorized/</code>. If you leave these blank the defaults will be used.'), get_option('home') . $blog_prefix . $prefix ); ?></p>\n\n<table class=\"form-table\">\n\t<tr>\n\t\t<th><label for=\"category_base\"><?php /* translators: prefix for category permalinks */ _e('Category base'); ?></label></th>\n\t\t<td><?php echo $blog_prefix; ?> <input name=\"category_base\" id=\"category_base\" type=\"text\" value=\"<?php echo esc_attr( $category_base ); ?>\" class=\"regular-text code\" /></td>\n\t</tr>\n\t<tr>\n\t\t<th><label for=\"tag_base\"><?php _e('Tag base'); ?></label></th>\n\t\t<td><?php echo $blog_prefix; ?> <input name=\"tag_base\" id=\"tag_base\" type=\"text\" value=\"<?php echo esc_attr($tag_base); ?>\" class=\"regular-text code\" /></td>\n\t</tr>\n\t<?php do_settings_fields('permalink', 'optional'); ?>\n</table>\n\n<?php do_settings_sections('permalink'); ?>\n\n<?php submit_button(); ?>\n  </form>\n<?php if ( !is_multisite() ) { ?>\n<?php if ( $iis7_permalinks ) :\n\tif ( isset($_POST['submit']) && $permalink_structure && ! $usingpi && ! $writable ) :\n\t\tif ( file_exists($home_path . 'web.config') ) : ?>\n<p><?php _e('If your <code>web.config</code> file were <a href=\"https://codex.wordpress.org/Changing_File_Permissions\">writable</a>, we could do this automatically, but it isn&#8217;t so this is the url rewrite rule you should have in your <code>web.config</code> file. Click in the field and press <kbd>CTRL + a</kbd> to select all. Then insert this rule inside of the <code>/&lt;configuration&gt;/&lt;system.webServer&gt;/&lt;rewrite&gt;/&lt;rules&gt;</code> element in <code>web.config</code> file.') ?></p>\n<form action=\"options-permalink.php\" method=\"post\">\n<?php wp_nonce_field('update-permalink') ?>\n\t<p><textarea rows=\"9\" class=\"large-text readonly\" name=\"rules\" id=\"rules\" readonly=\"readonly\"><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules() ); ?></textarea></p>\n</form>\n<p><?php _e('If you temporarily make your <code>web.config</code> file writable for us to generate rewrite rules automatically, do not forget to revert the permissions after rule has been saved.') ?></p>\n\t\t<?php else : ?>\n<p><?php _e('If the root directory of your site were <a href=\"https://codex.wordpress.org/Changing_File_Permissions\">writable</a>, we could do this automatically, but it isn&#8217;t so this is the url rewrite rule you should have in your <code>web.config</code> file. Create a new file, called <code>web.config</code> in the root directory of your site. Click in the field and press <kbd>CTRL + a</kbd> to select all. Then insert this code into the <code>web.config</code> file.') ?></p>\n<form action=\"options-permalink.php\" method=\"post\">\n<?php wp_nonce_field('update-permalink') ?>\n\t<p><textarea rows=\"18\" class=\"large-text readonly\" name=\"rules\" id=\"rules\" readonly=\"readonly\"><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules(true) ); ?></textarea></p>\n</form>\n<p><?php _e('If you temporarily make your site&#8217;s root directory writable for us to generate the <code>web.config</code> file automatically, do not forget to revert the permissions after the file has been created.') ?></p>\n\t\t<?php endif; ?>\n\t<?php endif; ?>\n<?php elseif ( $is_nginx ) : ?>\n\t<p><?php _e( '<a href=\"https://codex.wordpress.org/Nginx\">Documentation on Nginx configuration</a>.' ); ?></p>\n<?php else:\n\tif ( $permalink_structure && ! $usingpi && ! $writable && $update_required ) : ?>\n<p><?php _e('If your <code>.htaccess</code> file were <a href=\"https://codex.wordpress.org/Changing_File_Permissions\">writable</a>, we could do this automatically, but it isn&#8217;t so these are the mod_rewrite rules you should have in your <code>.htaccess</code> file. Click in the field and press <kbd>CTRL + a</kbd> to select all.') ?></p>\n<form action=\"options-permalink.php\" method=\"post\">\n<?php wp_nonce_field('update-permalink') ?>\n\t<p><textarea rows=\"6\" class=\"large-text readonly\" name=\"rules\" id=\"rules\" readonly=\"readonly\"><?php echo esc_textarea( $wp_rewrite->mod_rewrite_rules() ); ?></textarea></p>\n</form>\n\t<?php endif; ?>\n<?php endif; ?>\n<?php } // multisite ?>\n\n</div>\n\n<?php require( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/options-reading.php",
    "content": "<?php\n/**\n * Reading settings administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'manage_options' ) )\n\twp_die( __( 'You do not have sufficient permissions to manage options for this site.' ) );\n\n$title = __( 'Reading Settings' );\n$parent_file = 'options-general.php';\n\nadd_action('admin_head', 'options_reading_add_js');\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => '<p>' . __('This screen contains the settings that affect the display of your content.') . '</p>' .\n\t\t'<p>' . sprintf(__('You can choose what&#8217;s displayed on the front page of your site. It can be posts in reverse chronological order (classic blog), or a fixed/static page. To set a static home page, you first need to create two <a href=\"%s\">Pages</a>. One will become the front page, and the other will be where your posts are displayed.'), 'post-new.php?post_type=page') . '</p>' .\n\t\t'<p>' . __('You can also control the display of your content in RSS feeds, including the maximum numbers of posts to display and whether to show full text or a summary.') . '</p>' .\n\t\t'<p>' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '</p>',\n) );\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'site-visibility',\n\t'title'   => has_action( 'blog_privacy_selector' ) ? __( 'Site Visibility' ) : __( 'Search Engine Visibility' ),\n\t'content' => '<p>' . __( 'You can choose whether or not your site will be crawled by robots, ping services, and spiders. If you want those services to ignore your site, click the checkbox next to &#8220;Discourage search engines from indexing this site&#8221; and click the Save Changes button at the bottom of the screen. Note that your privacy is not complete; your site is still visible on the web.' ) . '</p>' .\n\t\t'<p>' . __( 'When this setting is in effect, a reminder is shown in the At a Glance box of the Dashboard that says, &#8220;Search Engines Discouraged,&#8221; to remind you that your site is not being crawled.' ) . '</p>',\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Settings_Reading_Screen\" target=\"_blank\">Documentation on Reading Settings</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<form method=\"post\" action=\"options.php\">\n<?php\nsettings_fields( 'reading' );\n\nif ( ! in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) )\n\tadd_settings_field( 'blog_charset', __( 'Encoding for pages and feeds' ), 'options_reading_blog_charset', 'reading', 'default', array( 'label_for' => 'blog_charset' ) );\n?>\n\n<?php if ( ! get_pages() ) : ?>\n<input name=\"show_on_front\" type=\"hidden\" value=\"posts\" />\n<table class=\"form-table\">\n<?php\n\tif ( 'posts' != get_option( 'show_on_front' ) ) :\n\t\tupdate_option( 'show_on_front', 'posts' );\n\tendif;\n\nelse :\n\tif ( 'page' == get_option( 'show_on_front' ) && ! get_option( 'page_on_front' ) && ! get_option( 'page_for_posts' ) )\n\t\tupdate_option( 'show_on_front', 'posts' );\n?>\n<table class=\"form-table\">\n<tr>\n<th scope=\"row\"><?php _e( 'Front page displays' ); ?></th>\n<td id=\"front-static-pages\"><fieldset><legend class=\"screen-reader-text\"><span><?php _e( 'Front page displays' ); ?></span></legend>\n\t<p><label>\n\t\t<input name=\"show_on_front\" type=\"radio\" value=\"posts\" class=\"tog\" <?php checked( 'posts', get_option( 'show_on_front' ) ); ?> />\n\t\t<?php _e( 'Your latest posts' ); ?>\n\t</label>\n\t</p>\n\t<p><label>\n\t\t<input name=\"show_on_front\" type=\"radio\" value=\"page\" class=\"tog\" <?php checked( 'page', get_option( 'show_on_front' ) ); ?> />\n\t\t<?php printf( __( 'A <a href=\"%s\">static page</a> (select below)' ), 'edit.php?post_type=page' ); ?>\n\t</label>\n\t</p>\n<ul>\n\t<li><label for=\"page_on_front\"><?php printf( __( 'Front page: %s' ), wp_dropdown_pages( array( 'name' => 'page_on_front', 'echo' => 0, 'show_option_none' => __( '&mdash; Select &mdash;' ), 'option_none_value' => '0', 'selected' => get_option( 'page_on_front' ) ) ) ); ?></label></li>\n\t<li><label for=\"page_for_posts\"><?php printf( __( 'Posts page: %s' ), wp_dropdown_pages( array( 'name' => 'page_for_posts', 'echo' => 0, 'show_option_none' => __( '&mdash; Select &mdash;' ), 'option_none_value' => '0', 'selected' => get_option( 'page_for_posts' ) ) ) ); ?></label></li>\n</ul>\n<?php if ( 'page' == get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) == get_option( 'page_on_front' ) ) : ?>\n<div id=\"front-page-warning\" class=\"error inline\"><p><?php _e( '<strong>Warning:</strong> these pages should not be the same!' ); ?></p></div>\n<?php endif; ?>\n</fieldset></td>\n</tr>\n<?php endif; ?>\n<tr>\n<th scope=\"row\"><label for=\"posts_per_page\"><?php _e( 'Blog pages show at most' ); ?></label></th>\n<td>\n<input name=\"posts_per_page\" type=\"number\" step=\"1\" min=\"1\" id=\"posts_per_page\" value=\"<?php form_option( 'posts_per_page' ); ?>\" class=\"small-text\" /> <?php _e( 'posts' ); ?>\n</td>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"posts_per_rss\"><?php _e( 'Syndication feeds show the most recent' ); ?></label></th>\n<td><input name=\"posts_per_rss\" type=\"number\" step=\"1\" min=\"1\" id=\"posts_per_rss\" value=\"<?php form_option( 'posts_per_rss' ); ?>\" class=\"small-text\" /> <?php _e( 'items' ); ?></td>\n</tr>\n<tr>\n<th scope=\"row\"><?php _e( 'For each article in a feed, show' ); ?> </th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e( 'For each article in a feed, show' ); ?> </span></legend>\n<p><label><input name=\"rss_use_excerpt\" type=\"radio\" value=\"0\" <?php checked( 0, get_option( 'rss_use_excerpt' ) ); ?>\t/> <?php _e( 'Full text' ); ?></label><br />\n<label><input name=\"rss_use_excerpt\" type=\"radio\" value=\"1\" <?php checked( 1, get_option( 'rss_use_excerpt' ) ); ?> /> <?php _e( 'Summary' ); ?></label></p>\n</fieldset></td>\n</tr>\n\n<tr class=\"option-site-visibility\">\n<th scope=\"row\"><?php has_action( 'blog_privacy_selector' ) ? _e( 'Site Visibility' ) : _e( 'Search Engine Visibility' ); ?> </th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php has_action( 'blog_privacy_selector' ) ? _e( 'Site Visibility' ) : _e( 'Search Engine Visibility' ); ?> </span></legend>\n<?php if ( has_action( 'blog_privacy_selector' ) ) : ?>\n\t<input id=\"blog-public\" type=\"radio\" name=\"blog_public\" value=\"1\" <?php checked('1', get_option('blog_public')); ?> />\n\t<label for=\"blog-public\"><?php _e( 'Allow search engines to index this site' );?></label><br/>\n\t<input id=\"blog-norobots\" type=\"radio\" name=\"blog_public\" value=\"0\" <?php checked('0', get_option('blog_public')); ?> />\n\t<label for=\"blog-norobots\"><?php _e( 'Discourage search engines from indexing this site' ); ?></label>\n\t<p class=\"description\"><?php _e( 'Note: Neither of these options blocks access to your site &mdash; it is up to search engines to honor your request.' ); ?></p>\n\t<?php\n\t/**\n\t * Enable the legacy 'Site Visibility' privacy options.\n\t *\n\t * By default the privacy options form displays a single checkbox to 'discourage' search\n\t * engines from indexing the site. Hooking to this action serves a dual purpose:\n\t * 1. Disable the single checkbox in favor of a multiple-choice list of radio buttons.\n\t * 2. Open the door to adding additional radio button choices to the list.\n\t *\n\t * Hooking to this action also converts the 'Search Engine Visibility' heading to the more\n\t * open-ended 'Site Visibility' heading.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'blog_privacy_selector' );\n\t?>\n<?php else : ?>\n\t<label for=\"blog_public\"><input name=\"blog_public\" type=\"checkbox\" id=\"blog_public\" value=\"0\" <?php checked( '0', get_option( 'blog_public' ) ); ?> />\n\t<?php _e( 'Discourage search engines from indexing this site' ); ?></label>\n\t<p class=\"description\"><?php _e( 'It is up to search engines to honor this request.' ); ?></p>\n<?php endif; ?>\n</fieldset></td>\n</tr>\n\n<?php do_settings_fields( 'reading', 'default' ); ?>\n</table>\n\n<?php do_settings_sections( 'reading' ); ?>\n\n<?php submit_button(); ?>\n</form>\n</div>\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/options-writing.php",
    "content": "<?php\n/**\n * Writing settings administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'manage_options' ) )\n\twp_die( __( 'You do not have sufficient permissions to manage options for this site.' ) );\n\n$title = __('Writing Settings');\n$parent_file = 'options-general.php';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => '<p>' . __('You can submit content in several different ways; this screen holds the settings for all of them. The top section controls the editor within the dashboard, while the rest control external publishing methods. For more information on any of these methods, use the documentation links.') . '</p>' .\n\t\t'<p>' . __('You must click the Save Changes button at the bottom of the screen for new settings to take effect.') . '</p>',\n) );\n\n/** This filter is documented in wp-admin/options.php */\nif ( apply_filters( 'enable_post_by_email_configuration', true ) ) {\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'options-postemail',\n\t\t'title'   => __( 'Post Via Email' ),\n\t\t'content' => '<p>' . __( 'Post via email settings allow you to send your WordPress install an email with the content of your post. You must set up a secret email account with POP3 access to use this, and any mail received at this address will be posted, so it&#8217;s a good idea to keep this address very secret.' ) . '</p>',\n\t) );\n}\n\n/** This filter is documented in wp-admin/options-writing.php */\nif ( apply_filters( 'enable_update_services_configuration', true ) ) {\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'options-services',\n\t\t'title'   => __( 'Update Services' ),\n\t\t'content' => '<p>' . __( 'If desired, WordPress will automatically alert various services of your new posts.' ) . '</p>',\n\t) );\n}\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Settings_Writing_Screen\" target=\"_blank\">Documentation on Writing Settings</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<form method=\"post\" action=\"options.php\">\n<?php settings_fields('writing'); ?>\n\n<table class=\"form-table\">\n<?php if ( get_site_option( 'initial_db_version' ) < 32453 ) : ?>\n<tr>\n<th scope=\"row\"><?php _e('Formatting') ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Formatting') ?></span></legend>\n<label for=\"use_smilies\">\n<input name=\"use_smilies\" type=\"checkbox\" id=\"use_smilies\" value=\"1\" <?php checked('1', get_option('use_smilies')); ?> />\n<?php _e('Convert emoticons like <code>:-)</code> and <code>:-P</code> to graphics on display') ?></label><br />\n<label for=\"use_balanceTags\"><input name=\"use_balanceTags\" type=\"checkbox\" id=\"use_balanceTags\" value=\"1\" <?php checked('1', get_option('use_balanceTags')); ?> /> <?php _e('WordPress should correct invalidly nested XHTML automatically') ?></label>\n</fieldset></td>\n</tr>\n<?php endif; ?>\n<tr>\n<th scope=\"row\"><label for=\"default_category\"><?php _e('Default Post Category') ?></label></th>\n<td>\n<?php\nwp_dropdown_categories(array('hide_empty' => 0, 'name' => 'default_category', 'orderby' => 'name', 'selected' => get_option('default_category'), 'hierarchical' => true));\n?>\n</td>\n</tr>\n<?php\n$post_formats = get_post_format_strings();\nunset( $post_formats['standard'] );\n?>\n<tr>\n<th scope=\"row\"><label for=\"default_post_format\"><?php _e('Default Post Format') ?></label></th>\n<td>\n\t<select name=\"default_post_format\" id=\"default_post_format\">\n\t\t<option value=\"0\"><?php echo get_post_format_string( 'standard' ); ?></option>\n<?php foreach ( $post_formats as $format_slug => $format_name ): ?>\n\t\t<option<?php selected( get_option( 'default_post_format' ), $format_slug ); ?> value=\"<?php echo esc_attr( $format_slug ); ?>\"><?php echo esc_html( $format_name ); ?></option>\n<?php endforeach; ?>\n\t</select>\n</td>\n</tr>\n<?php\nif ( get_option( 'link_manager_enabled' ) ) :\n?>\n<tr>\n<th scope=\"row\"><label for=\"default_link_category\"><?php _e('Default Link Category') ?></label></th>\n<td>\n<?php\nwp_dropdown_categories(array('hide_empty' => 0, 'name' => 'default_link_category', 'orderby' => 'name', 'selected' => get_option('default_link_category'), 'hierarchical' => true, 'taxonomy' => 'link_category'));\n?>\n</td>\n</tr>\n<?php endif; ?>\n\n<?php\ndo_settings_fields('writing', 'default');\ndo_settings_fields('writing', 'remote_publishing'); // A deprecated section.\n?>\n</table>\n\n<?php\n/** This filter is documented in wp-admin/options.php */\nif ( apply_filters( 'enable_post_by_email_configuration', true ) ) {\n?>\n<h2 class=\"title\"><?php _e( 'Post via email' ) ?></h2>\n<p><?php printf(__('To post to WordPress by email you must set up a secret email account with POP3 access. Any mail received at this address will be posted, so it&#8217;s a good idea to keep this address very secret. Here are three random strings you could use: <kbd>%s</kbd>, <kbd>%s</kbd>, <kbd>%s</kbd>.'), wp_generate_password(8, false), wp_generate_password(8, false), wp_generate_password(8, false)) ?></p>\n\n<table class=\"form-table\">\n<tr>\n<th scope=\"row\"><label for=\"mailserver_url\"><?php _e('Mail Server') ?></label></th>\n<td><input name=\"mailserver_url\" type=\"text\" id=\"mailserver_url\" value=\"<?php form_option('mailserver_url'); ?>\" class=\"regular-text code\" />\n<label for=\"mailserver_port\"><?php _e('Port') ?></label>\n<input name=\"mailserver_port\" type=\"text\" id=\"mailserver_port\" value=\"<?php form_option('mailserver_port'); ?>\" class=\"small-text\" />\n</td>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"mailserver_login\"><?php _e('Login Name') ?></label></th>\n<td><input name=\"mailserver_login\" type=\"text\" id=\"mailserver_login\" value=\"<?php form_option('mailserver_login'); ?>\" class=\"regular-text ltr\" /></td>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"mailserver_pass\"><?php _e('Password') ?></label></th>\n<td>\n<input name=\"mailserver_pass\" type=\"text\" id=\"mailserver_pass\" value=\"<?php form_option('mailserver_pass'); ?>\" class=\"regular-text ltr\" />\n</td>\n</tr>\n<tr>\n<th scope=\"row\"><label for=\"default_email_category\"><?php _e('Default Mail Category') ?></label></th>\n<td>\n<?php\nwp_dropdown_categories(array('hide_empty' => 0, 'name' => 'default_email_category', 'orderby' => 'name', 'selected' => get_option('default_email_category'), 'hierarchical' => true));\n?>\n</td>\n</tr>\n<?php do_settings_fields('writing', 'post_via_email'); ?>\n</table>\n<?php } ?>\n\n<?php\n/**\n * Filter whether to enable the Update Services section in the Writing settings screen.\n *\n * @since 3.0.0\n *\n * @param bool $enable Whether to enable the Update Services settings area. Default true.\n */\nif ( apply_filters( 'enable_update_services_configuration', true ) ) {\n?>\n<h2 class=\"title\"><?php _e( 'Update Services' ) ?></h2>\n\n<?php if ( 1 == get_option('blog_public') ) : ?>\n\n<p><label for=\"ping_sites\"><?php _e('When you publish a new post, WordPress automatically notifies the following site update services. For more about this, see <a href=\"https://codex.wordpress.org/Update_Services\">Update Services</a> on the Codex. Separate multiple service <abbr title=\"Universal Resource Locator\">URL</abbr>s with line breaks.') ?></label></p>\n\n<textarea name=\"ping_sites\" id=\"ping_sites\" class=\"large-text code\" rows=\"3\"><?php echo esc_textarea( get_option('ping_sites') ); ?></textarea>\n\n<?php else : ?>\n\n\t<p><?php printf(__('WordPress is not notifying any <a href=\"https://codex.wordpress.org/Update_Services\">Update Services</a> because of your site&#8217;s <a href=\"%s\">visibility settings</a>.'), 'options-reading.php'); ?></p>\n\n<?php endif; ?>\n<?php } // multisite ?>\n\n<?php do_settings_sections('writing'); ?>\n\n<?php submit_button(); ?>\n</form>\n</div>\n\n<?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/options.php",
    "content": "<?php\n/**\n * Options Management Administration Screen.\n *\n * If accessed directly in a browser this page shows a list of all saved options\n * along with editable fields for their values. Serialized data is not supported\n * and there is no way to remove options via this page. It is not linked to from\n * anywhere else in the admin.\n *\n * This file is also the target of the forms in core and custom options pages\n * that use the Settings API. In this case it saves the new option values\n * and returns the user to their page of origin.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n$title = __('Settings');\n$this_file = 'options.php';\n$parent_file = 'options-general.php';\n\nwp_reset_vars(array('action', 'option_page'));\n\n$capability = 'manage_options';\n\n// This is for back compat and will eventually be removed.\nif ( empty($option_page) ) {\n\t$option_page = 'options';\n} else {\n\n\t/**\n\t * Filter the capability required when using the Settings API.\n\t *\n\t * By default, the options groups for all registered settings require the manage_options capability.\n\t * This filter is required to change the capability required for a certain options page.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @param string $capability The capability used for the page, which is manage_options by default.\n\t */\n\t$capability = apply_filters( \"option_page_capability_{$option_page}\", $capability );\n}\n\nif ( ! current_user_can( $capability ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to manage these items.' ) . '</p>',\n\t\t403\n\t);\n}\n\n// Handle admin email change requests\nif ( is_multisite() ) {\n\tif ( ! empty($_GET[ 'adminhash' ] ) ) {\n\t\t$new_admin_details = get_option( 'adminhash' );\n\t\t$redirect = 'options-general.php?updated=false';\n\t\tif ( is_array( $new_admin_details ) && $new_admin_details[ 'hash' ] == $_GET[ 'adminhash' ] && !empty($new_admin_details[ 'newemail' ]) ) {\n\t\t\tupdate_option( 'admin_email', $new_admin_details[ 'newemail' ] );\n\t\t\tdelete_option( 'adminhash' );\n\t\t\tdelete_option( 'new_admin_email' );\n\t\t\t$redirect = 'options-general.php?updated=true';\n\t\t}\n\t\twp_redirect( admin_url( $redirect ) );\n\t\texit;\n\t} elseif ( ! empty( $_GET['dismiss'] ) && 'new_admin_email' == $_GET['dismiss'] ) {\n\t\tdelete_option( 'adminhash' );\n\t\tdelete_option( 'new_admin_email' );\n\t\twp_redirect( admin_url( 'options-general.php?updated=true' ) );\n\t\texit;\n\t}\n}\n\nif ( is_multisite() && ! is_super_admin() && 'update' != $action ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to delete these items.' ) . '</p>',\n\t\t403\n\t);\n}\n\n$whitelist_options = array(\n\t'general' => array( 'blogname', 'blogdescription', 'gmt_offset', 'date_format', 'time_format', 'start_of_week', 'timezone_string', 'WPLANG' ),\n\t'discussion' => array( 'default_pingback_flag', 'default_ping_status', 'default_comment_status', 'comments_notify', 'moderation_notify', 'comment_moderation', 'require_name_email', 'comment_whitelist', 'comment_max_links', 'moderation_keys', 'blacklist_keys', 'show_avatars', 'avatar_rating', 'avatar_default', 'close_comments_for_old_posts', 'close_comments_days_old', 'thread_comments', 'thread_comments_depth', 'page_comments', 'comments_per_page', 'default_comments_page', 'comment_order', 'comment_registration' ),\n\t'media' => array( 'thumbnail_size_w', 'thumbnail_size_h', 'thumbnail_crop', 'medium_size_w', 'medium_size_h', 'medium_large_size_w', 'medium_large_size_h', 'large_size_w', 'large_size_h', 'image_default_size', 'image_default_align', 'image_default_link_type' ),\n\t'reading' => array( 'posts_per_page', 'posts_per_rss', 'rss_use_excerpt', 'show_on_front', 'page_on_front', 'page_for_posts', 'blog_public' ),\n\t'writing' => array( 'default_category', 'default_email_category', 'default_link_category', 'default_post_format' )\n);\n$whitelist_options['misc'] = $whitelist_options['options'] = $whitelist_options['privacy'] = array();\n\n$mail_options = array('mailserver_url', 'mailserver_port', 'mailserver_login', 'mailserver_pass');\n\nif ( ! in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) )\n\t$whitelist_options['reading'][] = 'blog_charset';\n\nif ( get_site_option( 'initial_db_version' ) < 32453 ) {\n\t$whitelist_options['writing'][] = 'use_smilies';\n\t$whitelist_options['writing'][] = 'use_balanceTags';\n}\n\nif ( !is_multisite() ) {\n\tif ( !defined( 'WP_SITEURL' ) )\n\t\t$whitelist_options['general'][] = 'siteurl';\n\tif ( !defined( 'WP_HOME' ) )\n\t\t$whitelist_options['general'][] = 'home';\n\n\t$whitelist_options['general'][] = 'admin_email';\n\t$whitelist_options['general'][] = 'users_can_register';\n\t$whitelist_options['general'][] = 'default_role';\n\n\t$whitelist_options['writing'] = array_merge($whitelist_options['writing'], $mail_options);\n\t$whitelist_options['writing'][] = 'ping_sites';\n\n\t$whitelist_options['media'][] = 'uploads_use_yearmonth_folders';\n\n\t// If upload_url_path and upload_path are both default values, they're locked.\n\tif ( get_option( 'upload_url_path' ) || ( get_option('upload_path') != 'wp-content/uploads' && get_option('upload_path') ) ) {\n\t\t$whitelist_options['media'][] = 'upload_path';\n\t\t$whitelist_options['media'][] = 'upload_url_path';\n\t}\n} else {\n\t$whitelist_options['general'][] = 'new_admin_email';\n\n\t/**\n\t * Filter whether the post-by-email functionality is enabled.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param bool $enabled Whether post-by-email configuration is enabled. Default true.\n\t */\n\tif ( apply_filters( 'enable_post_by_email_configuration', true ) )\n\t\t$whitelist_options['writing'] = array_merge($whitelist_options['writing'], $mail_options);\n}\n\n/**\n * Filter the options white list.\n *\n * @since 2.7.0\n *\n * @param array White list options.\n */\n$whitelist_options = apply_filters( 'whitelist_options', $whitelist_options );\n\n/*\n * If $_GET['action'] == 'update' we are saving settings sent from a settings page\n */\nif ( 'update' == $action ) {\n\tif ( 'options' == $option_page && !isset( $_POST['option_page'] ) ) { // This is for back compat and will eventually be removed.\n\t\t$unregistered = true;\n\t\tcheck_admin_referer( 'update-options' );\n\t} else {\n\t\t$unregistered = false;\n\t\tcheck_admin_referer( $option_page . '-options' );\n\t}\n\n\tif ( !isset( $whitelist_options[ $option_page ] ) )\n\t\twp_die( __( '<strong>ERROR</strong>: options page not found.' ) );\n\n\tif ( 'options' == $option_page ) {\n\t\tif ( is_multisite() && ! is_super_admin() )\n\t\t\twp_die( __( 'You do not have sufficient permissions to modify unregistered settings for this site.' ) );\n\t\t$options = explode( ',', wp_unslash( $_POST[ 'page_options' ] ) );\n\t} else {\n\t\t$options = $whitelist_options[ $option_page ];\n\t}\n\n\tif ( 'general' == $option_page ) {\n\t\t// Handle custom date/time formats.\n\t\tif ( !empty($_POST['date_format']) && isset($_POST['date_format_custom']) && '\\c\\u\\s\\t\\o\\m' == wp_unslash( $_POST['date_format'] ) )\n\t\t\t$_POST['date_format'] = $_POST['date_format_custom'];\n\t\tif ( !empty($_POST['time_format']) && isset($_POST['time_format_custom']) && '\\c\\u\\s\\t\\o\\m' == wp_unslash( $_POST['time_format'] ) )\n\t\t\t$_POST['time_format'] = $_POST['time_format_custom'];\n\t\t// Map UTC+- timezones to gmt_offsets and set timezone_string to empty.\n\t\tif ( !empty($_POST['timezone_string']) && preg_match('/^UTC[+-]/', $_POST['timezone_string']) ) {\n\t\t\t$_POST['gmt_offset'] = $_POST['timezone_string'];\n\t\t\t$_POST['gmt_offset'] = preg_replace('/UTC\\+?/', '', $_POST['gmt_offset']);\n\t\t\t$_POST['timezone_string'] = '';\n\t\t}\n\n\t\t// Handle translation install.\n\t\tif ( ! empty( $_POST['WPLANG'] ) && ( ! is_multisite() || is_super_admin() ) ) { // @todo: Skip if already installed\n\t\t\trequire_once( ABSPATH . 'wp-admin/includes/translation-install.php' );\n\n\t\t\tif ( wp_can_install_language_pack() ) {\n\t\t\t\t$language = wp_download_language_pack( $_POST['WPLANG'] );\n\t\t\t\tif ( $language ) {\n\t\t\t\t\t$_POST['WPLANG'] = $language;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( $options ) {\n\t\tforeach ( $options as $option ) {\n\t\t\tif ( $unregistered ) {\n\t\t\t\t_deprecated_argument( 'options.php', '2.7',\n\t\t\t\t\tsprintf(\n\t\t\t\t\t\t/* translators: %s: the option/setting */\n\t\t\t\t\t\t__( 'The %s setting is unregistered. Unregistered settings are deprecated. See https://codex.wordpress.org/Settings_API' ),\n\t\t\t\t\t\t'<code>' . $option . '</code>'\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t$option = trim( $option );\n\t\t\t$value = null;\n\t\t\tif ( isset( $_POST[ $option ] ) ) {\n\t\t\t\t$value = $_POST[ $option ];\n\t\t\t\tif ( ! is_array( $value ) )\n\t\t\t\t\t$value = trim( $value );\n\t\t\t\t$value = wp_unslash( $value );\n\t\t\t}\n\t\t\tupdate_option( $option, $value );\n\t\t}\n\n\t\t// Switch translation in case WPLANG was changed.\n\t\t$language = get_option( 'WPLANG' );\n\t\tif ( $language ) {\n\t\t\tload_default_textdomain( $language );\n\t\t} else {\n\t\t\tunload_textdomain( 'default' );\n\t\t}\n\t}\n\n\t/**\n\t * Handle settings errors and return to options page\n\t */\n\t// If no settings errors were registered add a general 'updated' message.\n\tif ( !count( get_settings_errors() ) )\n\t\tadd_settings_error('general', 'settings_updated', __('Settings saved.'), 'updated');\n\tset_transient('settings_errors', get_settings_errors(), 30);\n\n\t/**\n\t * Redirect back to the settings page that was submitted\n\t */\n\t$goback = add_query_arg( 'settings-updated', 'true',  wp_get_referer() );\n\twp_redirect( $goback );\n\texit;\n}\n\ninclude( ABSPATH . 'wp-admin/admin-header.php' ); ?>\n\n<div class=\"wrap\">\n  <h1><?php esc_html_e( 'All Settings' ); ?></h1>\n  <form name=\"form\" action=\"options.php\" method=\"post\" id=\"all-options\">\n  <?php wp_nonce_field('options-options') ?>\n  <input type=\"hidden\" name=\"action\" value=\"update\" />\n  <input type=\"hidden\" name=\"option_page\" value=\"options\" />\n  <table class=\"form-table\">\n<?php\n$options = $wpdb->get_results( \"SELECT * FROM $wpdb->options ORDER BY option_name\" );\n\nforeach ( (array) $options as $option ) :\n\t$disabled = false;\n\tif ( $option->option_name == '' )\n\t\tcontinue;\n\tif ( is_serialized( $option->option_value ) ) {\n\t\tif ( is_serialized_string( $option->option_value ) ) {\n\t\t\t// This is a serialized string, so we should display it.\n\t\t\t$value = maybe_unserialize( $option->option_value );\n\t\t\t$options_to_update[] = $option->option_name;\n\t\t\t$class = 'all-options';\n\t\t} else {\n\t\t\t$value = 'SERIALIZED DATA';\n\t\t\t$disabled = true;\n\t\t\t$class = 'all-options disabled';\n\t\t}\n\t} else {\n\t\t$value = $option->option_value;\n\t\t$options_to_update[] = $option->option_name;\n\t\t$class = 'all-options';\n\t}\n\t$name = esc_attr( $option->option_name );\n\t?>\n<tr>\n\t<th scope=\"row\"><label for=\"<?php echo $name ?>\"><?php echo esc_html( $option->option_name ); ?></label></th>\n<td>\n<?php if ( strpos( $value, \"\\n\" ) !== false ) : ?>\n\t<textarea class=\"<?php echo $class ?>\" name=\"<?php echo $name ?>\" id=\"<?php echo $name ?>\" cols=\"30\" rows=\"5\"><?php\n\t\techo esc_textarea( $value );\n\t?></textarea>\n\t<?php else: ?>\n\t\t<input class=\"regular-text <?php echo $class ?>\" type=\"text\" name=\"<?php echo $name ?>\" id=\"<?php echo $name ?>\" value=\"<?php echo esc_attr( $value ) ?>\"<?php disabled( $disabled, true ) ?> />\n\t<?php endif ?></td>\n</tr>\n<?php endforeach; ?>\n  </table>\n\n<input type=\"hidden\" name=\"page_options\" value=\"<?php echo esc_attr( implode( ',', $options_to_update ) ); ?>\" />\n\n<?php submit_button( __( 'Save Changes' ), 'primary', 'Update' ); ?>\n\n  </form>\n</div>\n\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/plugin-editor.php",
    "content": "<?php\n/**\n * Edit plugin editor administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( is_multisite() && ! is_network_admin() ) {\n\twp_redirect( network_admin_url( 'plugin-editor.php' ) );\n\texit();\n}\n\nif ( !current_user_can('edit_plugins') )\n\twp_die( __('You do not have sufficient permissions to edit plugins for this site.') );\n\n$title = __(\"Edit Plugins\");\n$parent_file = 'plugins.php';\n\nwp_reset_vars( array( 'action', 'error', 'file', 'plugin' ) );\n\n$plugins = get_plugins();\n\nif ( empty( $plugins ) ) {\n\tinclude( ABSPATH . 'wp-admin/admin-header.php' );\n\t?>\n\t<div class=\"wrap\">\n\t\t<h1><?php echo esc_html( $title ); ?></h1>\n\t\t<div id=\"message\" class=\"error\"><p><?php _e( 'You do not appear to have any plugins available at this time.' ); ?></p></div>\n\t</div>\n\t<?php\n\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\texit;\n}\n\nif ( $file ) {\n\t$plugin = $file;\n} elseif ( empty( $plugin ) ) {\n\t$plugin = array_keys($plugins);\n\t$plugin = $plugin[0];\n}\n\n$plugin_files = get_plugin_files($plugin);\n\nif ( empty($file) )\n\t$file = $plugin_files[0];\n\n$file = validate_file_to_edit($file, $plugin_files);\n$real_file = WP_PLUGIN_DIR . '/' . $file;\n$scrollto = isset($_REQUEST['scrollto']) ? (int) $_REQUEST['scrollto'] : 0;\n\nswitch ( $action ) {\n\ncase 'update':\n\n\tcheck_admin_referer('edit-plugin_' . $file);\n\n\t$newcontent = wp_unslash( $_POST['newcontent'] );\n\tif ( is_writeable($real_file) ) {\n\t\t$f = fopen($real_file, 'w+');\n\t\tfwrite($f, $newcontent);\n\t\tfclose($f);\n\n\t\t$network_wide = is_plugin_active_for_network( $file );\n\n\t\t// Deactivate so we can test it.\n\t\tif ( is_plugin_active($file) || isset($_POST['phperror']) ) {\n\t\t\tif ( is_plugin_active($file) )\n\t\t\t\tdeactivate_plugins($file, true);\n\n\t\t\tif ( ! is_network_admin() ) {\n\t\t\t\tupdate_option( 'recently_activated', array( $file => time() ) + (array) get_option( 'recently_activated' ) );\n\t\t\t} else {\n\t\t\t\tupdate_site_option( 'recently_activated', array( $file => time() ) + (array) get_site_option( 'recently_activated' ) );\n\t\t\t}\n\n\t\t\twp_redirect(add_query_arg('_wpnonce', wp_create_nonce('edit-plugin-test_' . $file), \"plugin-editor.php?file=$file&liveupdate=1&scrollto=$scrollto&networkwide=\" . $network_wide));\n\t\t\texit;\n\t\t}\n\t\twp_redirect( self_admin_url(\"plugin-editor.php?file=$file&a=te&scrollto=$scrollto\") );\n\t} else {\n\t\twp_redirect( self_admin_url(\"plugin-editor.php?file=$file&scrollto=$scrollto\") );\n\t}\n\texit;\n\ndefault:\n\n\tif ( isset($_GET['liveupdate']) ) {\n\t\tcheck_admin_referer('edit-plugin-test_' . $file);\n\n\t\t$error = validate_plugin($file);\n\t\tif ( is_wp_error($error) )\n\t\t\twp_die( $error );\n\n\t\tif ( ( ! empty( $_GET['networkwide'] ) && ! is_plugin_active_for_network($file) ) || ! is_plugin_active($file) )\n\t\t\tactivate_plugin($file, \"plugin-editor.php?file=$file&phperror=1\", ! empty( $_GET['networkwide'] ) ); // we'll override this later if the plugin can be included without fatal error\n\n\t\twp_redirect( self_admin_url(\"plugin-editor.php?file=$file&a=te&scrollto=$scrollto\") );\n\t\texit;\n\t}\n\n\t// List of allowable extensions\n\t$editable_extensions = array('php', 'txt', 'text', 'js', 'css', 'html', 'htm', 'xml', 'inc', 'include');\n\n\t/**\n\t * Filter file type extensions editable in the plugin editor.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $editable_extensions An array of editable plugin file extensions.\n\t */\n\t$editable_extensions = (array) apply_filters( 'editable_extensions', $editable_extensions );\n\n\tif ( ! is_file($real_file) ) {\n\t\twp_die(sprintf('<p>%s</p>', __('No such file exists! Double check the name and try again.')));\n\t} else {\n\t\t// Get the extension of the file\n\t\tif ( preg_match('/\\.([^.]+)$/', $real_file, $matches) ) {\n\t\t\t$ext = strtolower($matches[1]);\n\t\t\t// If extension is not in the acceptable list, skip it\n\t\t\tif ( !in_array( $ext, $editable_extensions) )\n\t\t\t\twp_die(sprintf('<p>%s</p>', __('Files of this type are not editable.')));\n\t\t}\n\t}\n\n\tget_current_screen()->add_help_tab( array(\n\t'id'\t\t=> 'overview',\n\t'title'\t\t=> __('Overview'),\n\t'content'\t=>\n\t\t'<p>' . __('You can use the editor to make changes to any of your plugins&#8217; individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations.') . '</p>' .\n\t\t'<p>' . __('Choose a plugin to edit from the menu in the upper right and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don&#8217;t forget to save your changes (Update File) when you&#8217;re finished.') . '</p>' .\n\t\t'<p>' . __('The Documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Look Up takes you to a web page about that particular function.') . '</p>' .\n\t\t'<p id=\"newcontent-description\">' . __( 'In the editing area the Tab key enters a tab character. To move below this area by pressing Tab, press the Esc key followed by the Tab key. In some cases the Esc key will need to be pressed twice before the Tab key will allow you to continue.' ) . '</p>' .\n\t\t'<p>' . __('If you want to make changes but don&#8217;t want them to be overwritten when the plugin is updated, you may be ready to think about writing your own plugin. For information on how to edit plugins, write your own from scratch, or just better understand their anatomy, check out the links below.') . '</p>' .\n\t\t( is_network_admin() ? '<p>' . __('Any edits to files from this screen will be reflected on all sites in the network.') . '</p>' : '' )\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t\t'<p>' . __('<a href=\"https://codex.wordpress.org/Plugins_Editor_Screen\" target=\"_blank\">Documentation on Editing Plugins</a>') . '</p>' .\n\t\t'<p>' . __('<a href=\"https://codex.wordpress.org/Writing_a_Plugin\" target=\"_blank\">Documentation on Writing Plugins</a>') . '</p>' .\n\t\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n\t);\n\n\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\tupdate_recently_edited(WP_PLUGIN_DIR . '/' . $file);\n\n\t$content = file_get_contents( $real_file );\n\n\tif ( '.php' == substr( $real_file, strrpos( $real_file, '.' ) ) ) {\n\t\t$functions = wp_doc_link_parse( $content );\n\n\t\tif ( !empty($functions) ) {\n\t\t\t$docs_select = '<select name=\"docs-list\" id=\"docs-list\">';\n\t\t\t$docs_select .= '<option value=\"\">' . __( 'Function Name&hellip;' ) . '</option>';\n\t\t\tforeach ( $functions as $function) {\n\t\t\t\t$docs_select .= '<option value=\"' . esc_attr( $function ) . '\">' . esc_html( $function ) . '()</option>';\n\t\t\t}\n\t\t\t$docs_select .= '</select>';\n\t\t}\n\t}\n\n\t$content = esc_textarea( $content );\n\t?>\n<?php if (isset($_GET['a'])) : ?>\n <div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e('File edited successfully.') ?></p></div>\n<?php elseif (isset($_GET['phperror'])) : ?>\n <div id=\"message\" class=\"updated\"><p><?php _e('This plugin has been deactivated because your changes resulted in a <strong>fatal error</strong>.') ?></p>\n\t<?php\n\t\tif ( wp_verify_nonce( $_GET['_error_nonce'], 'plugin-activation-error_' . $file ) ) {\n\t\t\t$iframe_url = add_query_arg( array(\n\t\t\t\t'action'   => 'error_scrape',\n\t\t\t\t'plugin'   => urlencode( $file ),\n\t\t\t\t'_wpnonce' => urlencode( $_GET['_error_nonce'] ),\n\t\t\t), admin_url( 'plugins.php' ) );\n\t\t\t?>\n\t<iframe style=\"border:0\" width=\"100%\" height=\"70px\" src=\"<?php echo esc_url( $iframe_url ); ?>\"></iframe>\n\t<?php } ?>\n</div>\n<?php endif; ?>\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<div class=\"fileedit-sub\">\n<div class=\"alignleft\">\n<big><?php\n\tif ( is_plugin_active( $plugin ) ) {\n\t\tif ( is_writeable( $real_file ) ) {\n\t\t\t/* translators: %s: plugin file name */\n\t\t\techo sprintf( __( 'Editing %s (active)' ), '<strong>' . $file . '</strong>' );\n\t\t} else {\n\t\t\t/* translators: %s: plugin file name */\n\t\t\techo sprintf( __( 'Browsing %s (active)' ), '<strong>' . $file . '</strong>' );\n\t\t}\n\t} else {\n\t\tif ( is_writeable( $real_file ) ) {\n\t\t\t/* translators: %s: plugin file name */\n\t\t\techo sprintf( __( 'Editing %s (inactive)' ), '<strong>' . $file . '</strong>' );\n\t\t} else {\n\t\t\t/* translators: %s: plugin file name */\n\t\t\techo sprintf( __( 'Browsing %s (inactive)' ), '<strong>' . $file . '</strong>' );\n\t\t}\n\t}\n\t?></big>\n</div>\n<div class=\"alignright\">\n\t<form action=\"plugin-editor.php\" method=\"post\">\n\t\t<strong><label for=\"plugin\"><?php _e('Select plugin to edit:'); ?> </label></strong>\n\t\t<select name=\"plugin\" id=\"plugin\">\n<?php\n\tforeach ( $plugins as $plugin_key => $a_plugin ) {\n\t\t$plugin_name = $a_plugin['Name'];\n\t\tif ( $plugin_key == $plugin )\n\t\t\t$selected = \" selected='selected'\";\n\t\telse\n\t\t\t$selected = '';\n\t\t$plugin_name = esc_attr($plugin_name);\n\t\t$plugin_key = esc_attr($plugin_key);\n\t\techo \"\\n\\t<option value=\\\"$plugin_key\\\" $selected>$plugin_name</option>\";\n\t}\n?>\n\t\t</select>\n\t\t<?php submit_button( __( 'Select' ), 'button', 'Submit', false ); ?>\n\t</form>\n</div>\n<br class=\"clear\" />\n</div>\n\n<div id=\"templateside\">\n\t<h2><?php _e( 'Plugin Files' ); ?></h2>\n\n\t<ul>\n<?php\nforeach ( $plugin_files as $plugin_file ) :\n\t// Get the extension of the file\n\tif ( preg_match('/\\.([^.]+)$/', $plugin_file, $matches) ) {\n\t\t$ext = strtolower($matches[1]);\n\t\t// If extension is not in the acceptable list, skip it\n\t\tif ( !in_array( $ext, $editable_extensions ) )\n\t\t\tcontinue;\n\t} else {\n\t\t// No extension found\n\t\tcontinue;\n\t}\n?>\n\t\t<li<?php echo $file == $plugin_file ? ' class=\"highlight\"' : ''; ?>><a href=\"plugin-editor.php?file=<?php echo urlencode( $plugin_file ) ?>&amp;plugin=<?php echo urlencode( $plugin ) ?>\"><?php echo $plugin_file ?></a></li>\n<?php endforeach; ?>\n\t</ul>\n</div>\n<form name=\"template\" id=\"template\" action=\"plugin-editor.php\" method=\"post\">\n\t<?php wp_nonce_field('edit-plugin_' . $file) ?>\n\t\t<div><textarea cols=\"70\" rows=\"25\" name=\"newcontent\" id=\"newcontent\" aria-describedby=\"newcontent-description\"><?php echo $content; ?></textarea>\n\t\t<input type=\"hidden\" name=\"action\" value=\"update\" />\n\t\t<input type=\"hidden\" name=\"file\" value=\"<?php echo esc_attr($file) ?>\" />\n\t\t<input type=\"hidden\" name=\"plugin\" value=\"<?php echo esc_attr($plugin) ?>\" />\n\t\t<input type=\"hidden\" name=\"scrollto\" id=\"scrollto\" value=\"<?php echo $scrollto; ?>\" />\n\t\t</div>\n\t\t<?php if ( !empty( $docs_select ) ) : ?>\n\t\t<div id=\"documentation\" class=\"hide-if-no-js\"><label for=\"docs-list\"><?php _e('Documentation:') ?></label> <?php echo $docs_select ?> <input type=\"button\" class=\"button\" value=\"<?php esc_attr_e( 'Look Up' ) ?> \" onclick=\"if ( '' != jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_locale() ) ?>&amp;version=<?php echo urlencode( $wp_version ) ?>&amp;redirect=true'); }\" /></div>\n\t\t<?php endif; ?>\n<?php if ( is_writeable($real_file) ) : ?>\n\t<?php if ( in_array( $file, (array) get_option( 'active_plugins', array() ) ) ) { ?>\n\t\t<p><?php _e('<strong>Warning:</strong> Making changes to active plugins is not recommended. If your changes cause a fatal error, the plugin will be automatically deactivated.'); ?></p>\n\t<?php } ?>\n\t<p class=\"submit\">\n\t<?php\n\t\tif ( isset($_GET['phperror']) ) {\n\t\t\techo \"<input type='hidden' name='phperror' value='1' />\";\n\t\t\tsubmit_button( __( 'Update File and Attempt to Reactivate' ), 'primary', 'submit', false );\n\t\t} else {\n\t\t\tsubmit_button( __( 'Update File' ), 'primary', 'submit', false );\n\t\t}\n\t?>\n\t</p>\n<?php else : ?>\n\t<p><em><?php _e('You need to make this file writable before you can save your changes. See <a href=\"https://codex.wordpress.org/Changing_File_Permissions\">the Codex</a> for more information.'); ?></em></p>\n<?php endif; ?>\n</form>\n<br class=\"clear\" />\n</div>\n<script type=\"text/javascript\">\njQuery(document).ready(function($){\n\t$('#template').submit(function(){ $('#scrollto').val( $('#newcontent').scrollTop() ); });\n\t$('#newcontent').scrollTop( $('#scrollto').val() );\n});\n</script>\n<?php\n\tbreak;\n}\ninclude(ABSPATH . \"wp-admin/admin-footer.php\");\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/plugin-install.php",
    "content": "<?php\n/**\n * Install plugin administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n// TODO route this pages via a specific iframe handler instead of the do_action below\nif ( !defined( 'IFRAME_REQUEST' ) && isset( $_GET['tab'] ) && ( 'plugin-information' == $_GET['tab'] ) )\n\tdefine( 'IFRAME_REQUEST', true );\n\n/**\n * WordPress Administration Bootstrap.\n */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can('install_plugins') )\n\twp_die(__('You do not have sufficient permissions to install plugins on this site.'));\n\nif ( is_multisite() && ! is_network_admin() ) {\n\twp_redirect( network_admin_url( 'plugin-install.php' ) );\n\texit();\n}\n\n$wp_list_table = _get_list_table('WP_Plugin_Install_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n\nif ( ! empty( $_REQUEST['_wp_http_referer'] ) ) {\n\t$location = remove_query_arg( '_wp_http_referer', wp_unslash( $_SERVER['REQUEST_URI'] ) );\n\n\tif ( ! empty( $_REQUEST['paged'] ) ) {\n\t\t$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );\n\t}\n\n\twp_redirect( $location );\n\texit;\n}\n\n$wp_list_table->prepare_items();\n\n$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );\n\nif ( $pagenum > $total_pages && $total_pages > 0 ) {\n\twp_redirect( add_query_arg( 'paged', $total_pages ) );\n\texit;\n}\n\n$title = __( 'Add Plugins' );\n$parent_file = 'plugins.php';\n\nwp_enqueue_script( 'plugin-install' );\nif ( 'plugin-information' != $tab )\n\tadd_thickbox();\n\n$body_id = $tab;\n\nwp_enqueue_script( 'updates' );\n\n/**\n * Fires before each tab on the Install Plugins screen is loaded.\n *\n * The dynamic portion of the action hook, `$tab`, allows for targeting\n * individual tabs, for instance 'install_plugins_pre_plugin-information'.\n *\n * @since 2.7.0\n */\ndo_action( \"install_plugins_pre_$tab\" );\n\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'overview',\n'title'\t\t=> __('Overview'),\n'content'\t=>\n\t'<p>' . sprintf(__('Plugins hook into WordPress to extend its functionality with custom features. Plugins are developed independently from the core WordPress application by thousands of developers all over the world. All plugins in the official <a href=\"%s\" target=\"_blank\">WordPress.org Plugin Directory</a> are compatible with the license WordPress uses. You can find new plugins to install by searching or browsing the Directory right here in your own Plugins section.'), 'https://wordpress.org/plugins/') . '</p>'\n) );\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'adding-plugins',\n'title'\t\t=> __('Adding Plugins'),\n'content'\t=>\n\t'<p>' . __('If you know what you&#8217;re looking for, Search is your best bet. The Search screen has options to search the WordPress.org Plugin Directory for a particular Term, Author, or Tag. You can also search the directory by selecting popular tags. Tags in larger type mean more plugins have been labeled with that tag.') . '</p>' .\n\t'<p>' . __('If you just want to get an idea of what&#8217;s available, you can browse Featured and Popular plugins by using the links in the upper left of the screen. These sections rotate regularly.') . '</p>' .\n\t'<p>' . __('You can also browse a user&#8217;s favorite plugins, by using the Favorites link in the upper left of the screen and entering their WordPress.org username.') . '</p>' .\n\t'<p>' . __('If you want to install a plugin that you&#8217;ve downloaded elsewhere, click the Upload link in the upper left. You will be prompted to upload the .zip package, and once uploaded, you can activate the new plugin.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Plugins_Add_New_Screen\" target=\"_blank\">Documentation on Installing Plugins</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter plugins list' ),\n\t'heading_pagination' => __( 'Plugins list navigation' ),\n\t'heading_list'       => __( 'Plugins list' ),\n) );\n\n/**\n * WordPress Administration Template Header.\n */\ninclude(ABSPATH . 'wp-admin/admin-header.php');\n?>\n<div class=\"wrap\">\n<h1>\n\t<?php\n\techo esc_html( $title );\n\tif ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_plugins' ) ) {\n\t\tif ( $tab === 'upload' ) {\n\t\t\t$href = self_admin_url( 'plugin-install.php' );\n\t\t\t$text = _x( 'Browse', 'plugins' );\n\t\t} else {\n\t\t\t$href = self_admin_url( 'plugin-install.php?tab=upload' );\n\t\t\t$text = __( 'Upload Plugin' );\n\t\t}\n\t\techo ' <a href=\"' . $href . '\" class=\"upload page-title-action\">' . $text . '</a>';\n\t}\n\t?>\n</h1>\n\n<?php\nif ( $tab !== 'upload' ) {\n\t$wp_list_table->views();\n\techo '<br class=\"clear\" />';\n}\n\n/**\n * Fires after the plugins list table in each tab of the Install Plugins screen.\n *\n * The dynamic portion of the action hook, `$tab`, allows for targeting\n * individual tabs, for instance 'install_plugins_plugin-information'.\n *\n * @since 2.7.0\n *\n * @param int $paged The current page number of the plugins list table.\n */\ndo_action( \"install_plugins_$tab\", $paged ); ?>\n</div>\n\n<?php\nwp_print_request_filesystem_credentials_modal();\n\n/**\n * WordPress Administration Template Footer.\n */\ninclude(ABSPATH . 'wp-admin/admin-footer.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/plugins.php",
    "content": "<?php\n/**\n * Plugins administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can('activate_plugins') )\n\twp_die( __( 'You do not have sufficient permissions to manage plugins for this site.' ) );\n\n$wp_list_table = _get_list_table('WP_Plugins_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n\n$action = $wp_list_table->current_action();\n\n$plugin = isset($_REQUEST['plugin']) ? $_REQUEST['plugin'] : '';\n$s = isset($_REQUEST['s']) ? urlencode($_REQUEST['s']) : '';\n\n// Clean up request URI from temporary args for screen options/paging uri's to work as expected.\n$_SERVER['REQUEST_URI'] = remove_query_arg(array('error', 'deleted', 'activate', 'activate-multi', 'deactivate', 'deactivate-multi', '_error_nonce'), $_SERVER['REQUEST_URI']);\n\nwp_enqueue_script( 'updates' );\n\nif ( $action ) {\n\n\tswitch ( $action ) {\n\t\tcase 'activate':\n\t\t\tif ( ! current_user_can('activate_plugins') )\n\t\t\t\twp_die(__('You do not have sufficient permissions to activate plugins for this site.'));\n\n\t\t\tif ( is_multisite() && ! is_network_admin() && is_network_only_plugin( $plugin ) ) {\n\t\t\t\twp_redirect( self_admin_url(\"plugins.php?plugin_status=$status&paged=$page&s=$s\") );\n\t\t\t\texit;\n\t\t\t}\n\n\t\t\tcheck_admin_referer('activate-plugin_' . $plugin);\n\n\t\t\t$result = activate_plugin($plugin, self_admin_url('plugins.php?error=true&plugin=' . $plugin), is_network_admin() );\n\t\t\tif ( is_wp_error( $result ) ) {\n\t\t\t\tif ( 'unexpected_output' == $result->get_error_code() ) {\n\t\t\t\t\t$redirect = self_admin_url('plugins.php?error=true&charsout=' . strlen($result->get_error_data()) . '&plugin=' . $plugin . \"&plugin_status=$status&paged=$page&s=$s\");\n\t\t\t\t\twp_redirect(add_query_arg('_error_nonce', wp_create_nonce('plugin-activation-error_' . $plugin), $redirect));\n\t\t\t\t\texit;\n\t\t\t\t} else {\n\t\t\t\t\twp_die($result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! is_network_admin() ) {\n\t\t\t\t$recent = (array) get_option( 'recently_activated' );\n\t\t\t\tunset( $recent[ $plugin ] );\n\t\t\t\tupdate_option( 'recently_activated', $recent );\n\t\t\t} else {\n\t\t\t\t$recent = (array) get_site_option( 'recently_activated' );\n\t\t\t\tunset( $recent[ $plugin ] );\n\t\t\t\tupdate_site_option( 'recently_activated', $recent );\n\t\t\t}\n\n\t\t\tif ( isset($_GET['from']) && 'import' == $_GET['from'] ) {\n\t\t\t\twp_redirect( self_admin_url(\"import.php?import=\" . str_replace('-importer', '', dirname($plugin))) ); // overrides the ?error=true one above and redirects to the Imports page, stripping the -importer suffix\n\t\t\t} else {\n\t\t\t\twp_redirect( self_admin_url(\"plugins.php?activate=true&plugin_status=$status&paged=$page&s=$s\") ); // overrides the ?error=true one above\n\t\t\t}\n\t\t\texit;\n\n\t\tcase 'activate-selected':\n\t\t\tif ( ! current_user_can('activate_plugins') )\n\t\t\t\twp_die(__('You do not have sufficient permissions to activate plugins for this site.'));\n\n\t\t\tcheck_admin_referer('bulk-plugins');\n\n\t\t\t$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();\n\n\t\t\tif ( is_network_admin() ) {\n\t\t\t\tforeach ( $plugins as $i => $plugin ) {\n\t\t\t\t\t// Only activate plugins which are not already network activated.\n\t\t\t\t\tif ( is_plugin_active_for_network( $plugin ) ) {\n\t\t\t\t\t\tunset( $plugins[ $i ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tforeach ( $plugins as $i => $plugin ) {\n\t\t\t\t\t// Only activate plugins which are not already active and are not network-only when on Multisite.\n\t\t\t\t\tif ( is_plugin_active( $plugin ) || ( is_multisite() && is_network_only_plugin( $plugin ) ) ) {\n\t\t\t\t\t\tunset( $plugins[ $i ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( empty($plugins) ) {\n\t\t\t\twp_redirect( self_admin_url(\"plugins.php?plugin_status=$status&paged=$page&s=$s\") );\n\t\t\t\texit;\n\t\t\t}\n\n\t\t\tactivate_plugins($plugins, self_admin_url('plugins.php?error=true'), is_network_admin() );\n\n\t\t\tif ( ! is_network_admin() ) {\n\t\t\t\t$recent = (array) get_option('recently_activated' );\n\t\t\t} else {\n\t\t\t\t$recent = (array) get_site_option('recently_activated' );\n\t\t\t}\n\n\t\t\tforeach ( $plugins as $plugin ) {\n\t\t\t\tunset( $recent[ $plugin ] );\n\t\t\t}\n\n\t\t\tif ( ! is_network_admin() ) {\n\t\t\t\tupdate_option( 'recently_activated', $recent );\n\t\t\t} else {\n\t\t\t\tupdate_site_option( 'recently_activated', $recent );\n\t\t\t}\n\n\t\t\twp_redirect( self_admin_url(\"plugins.php?activate-multi=true&plugin_status=$status&paged=$page&s=$s\") );\n\t\t\texit;\n\n\t\tcase 'update-selected' :\n\n\t\t\tcheck_admin_referer( 'bulk-plugins' );\n\n\t\t\tif ( isset( $_GET['plugins'] ) )\n\t\t\t\t$plugins = explode( ',', $_GET['plugins'] );\n\t\t\telseif ( isset( $_POST['checked'] ) )\n\t\t\t\t$plugins = (array) $_POST['checked'];\n\t\t\telse\n\t\t\t\t$plugins = array();\n\n\t\t\t$title = __( 'Update Plugins' );\n\t\t\t$parent_file = 'plugins.php';\n\n\t\t\twp_enqueue_script( 'updates' );\n\t\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t\techo '<div class=\"wrap\">';\n\t\t\techo '<h1>' . esc_html( $title ) . '</h1>';\n\n\t\t\t$url = self_admin_url('update.php?action=update-selected&amp;plugins=' . urlencode( join(',', $plugins) ));\n\t\t\t$url = wp_nonce_url($url, 'bulk-update-plugins');\n\n\t\t\techo \"<iframe src='$url' style='width: 100%; height:100%; min-height:850px;'></iframe>\";\n\t\t\techo '</div>';\n\t\t\trequire_once(ABSPATH . 'wp-admin/admin-footer.php');\n\t\t\texit;\n\n\t\tcase 'error_scrape':\n\t\t\tif ( ! current_user_can('activate_plugins') )\n\t\t\t\twp_die(__('You do not have sufficient permissions to activate plugins for this site.'));\n\n\t\t\tcheck_admin_referer('plugin-activation-error_' . $plugin);\n\n\t\t\t$valid = validate_plugin($plugin);\n\t\t\tif ( is_wp_error($valid) )\n\t\t\t\twp_die($valid);\n\n\t\t\tif ( ! WP_DEBUG ) {\n\t\t\t\terror_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );\n\t\t\t}\n\n\t\t\t@ini_set('display_errors', true); //Ensure that Fatal errors are displayed.\n\t\t\t// Go back to \"sandbox\" scope so we get the same errors as before\n\t\t\tplugin_sandbox_scrape( $plugin );\n\t\t\t/** This action is documented in wp-admin/includes/plugin.php */\n\t\t\tdo_action( \"activate_{$plugin}\" );\n\t\t\texit;\n\n\t\tcase 'deactivate':\n\t\t\tif ( ! current_user_can('activate_plugins') )\n\t\t\t\twp_die(__('You do not have sufficient permissions to deactivate plugins for this site.'));\n\n\t\t\tcheck_admin_referer('deactivate-plugin_' . $plugin);\n\n\t\t\tif ( ! is_network_admin() && is_plugin_active_for_network( $plugin ) ) {\n\t\t\t\twp_redirect( self_admin_url(\"plugins.php?plugin_status=$status&paged=$page&s=$s\") );\n\t\t\t\texit;\n\t\t\t}\n\n\t\t\tdeactivate_plugins( $plugin, false, is_network_admin() );\n\n\t\t\tif ( ! is_network_admin() ) {\n\t\t\t\tupdate_option( 'recently_activated', array( $plugin => time() ) + (array) get_option( 'recently_activated' ) );\n\t\t\t} else {\n\t\t\t\tupdate_site_option( 'recently_activated', array( $plugin => time() ) + (array) get_site_option( 'recently_activated' ) );\n\t\t\t}\n\n\t\t\tif ( headers_sent() )\n\t\t\t\techo \"<meta http-equiv='refresh' content='\" . esc_attr( \"0;url=plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s\" ) . \"' />\";\n\t\t\telse\n\t\t\t\twp_redirect( self_admin_url(\"plugins.php?deactivate=true&plugin_status=$status&paged=$page&s=$s\") );\n\t\t\texit;\n\n\t\tcase 'deactivate-selected':\n\t\t\tif ( ! current_user_can('activate_plugins') )\n\t\t\t\twp_die(__('You do not have sufficient permissions to deactivate plugins for this site.'));\n\n\t\t\tcheck_admin_referer('bulk-plugins');\n\n\t\t\t$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();\n\t\t\t// Do not deactivate plugins which are already deactivated.\n\t\t\tif ( is_network_admin() ) {\n\t\t\t\t$plugins = array_filter( $plugins, 'is_plugin_active_for_network' );\n\t\t\t} else {\n\t\t\t\t$plugins = array_filter( $plugins, 'is_plugin_active' );\n\t\t\t\t$plugins = array_diff( $plugins, array_filter( $plugins, 'is_plugin_active_for_network' ) );\n\t\t\t}\n\t\t\tif ( empty($plugins) ) {\n\t\t\t\twp_redirect( self_admin_url(\"plugins.php?plugin_status=$status&paged=$page&s=$s\") );\n\t\t\t\texit;\n\t\t\t}\n\n\t\t\tdeactivate_plugins( $plugins, false, is_network_admin() );\n\n\t\t\t$deactivated = array();\n\t\t\tforeach ( $plugins as $plugin ) {\n\t\t\t\t$deactivated[ $plugin ] = time();\n\t\t\t}\n\n\t\t\tif ( ! is_network_admin() ) {\n\t\t\t\tupdate_option( 'recently_activated', $deactivated + (array) get_option( 'recently_activated' ) );\n\t\t\t} else {\n\t\t\t\tupdate_site_option( 'recently_activated', $deactivated + (array) get_site_option( 'recently_activated' ) );\n\t\t\t}\n\n\t\t\twp_redirect( self_admin_url(\"plugins.php?deactivate-multi=true&plugin_status=$status&paged=$page&s=$s\") );\n\t\t\texit;\n\n\t\tcase 'delete-selected':\n\t\t\tif ( ! current_user_can('delete_plugins') ) {\n\t\t\t\twp_die(__('You do not have sufficient permissions to delete plugins for this site.'));\n\t\t\t}\n\n\t\t\tcheck_admin_referer('bulk-plugins');\n\n\t\t\t//$_POST = from the plugin form; $_GET = from the FTP details screen.\n\t\t\t$plugins = isset( $_REQUEST['checked'] ) ? (array) $_REQUEST['checked'] : array();\n\t\t\tif ( empty( $plugins ) ) {\n\t\t\t\twp_redirect( self_admin_url(\"plugins.php?plugin_status=$status&paged=$page&s=$s\") );\n\t\t\t\texit;\n\t\t\t}\n\n\t\t\t$plugins = array_filter($plugins, 'is_plugin_inactive'); // Do not allow to delete Activated plugins.\n\t\t\tif ( empty( $plugins ) ) {\n\t\t\t\twp_redirect( self_admin_url( \"plugins.php?error=true&main=true&plugin_status=$status&paged=$page&s=$s\" ) );\n\t\t\t\texit;\n\t\t\t}\n\n\t\t\tinclude(ABSPATH . 'wp-admin/update.php');\n\n\t\t\t$parent_file = 'plugins.php';\n\n\t\t\tif ( ! isset($_REQUEST['verify-delete']) ) {\n\t\t\t\twp_enqueue_script('jquery');\n\t\t\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\t\t\t\t?>\n\t\t\t<div class=\"wrap\">\n\t\t\t\t<?php\n\t\t\t\t\t$files_to_delete = $plugin_info = array();\n\t\t\t\t\t$have_non_network_plugins = false;\n\t\t\t\t\t$plugin_translations = wp_get_installed_translations( 'plugins' );\n\t\t\t\t\tforeach ( (array) $plugins as $plugin ) {\n\t\t\t\t\t\t$plugin_slug = dirname( $plugin );\n\n\t\t\t\t\t\tif ( '.' == $plugin_slug ) {\n\t\t\t\t\t\t\t$files_to_delete[] = WP_PLUGIN_DIR . '/' . $plugin;\n\t\t\t\t\t\t\tif ( $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ) ) {\n\t\t\t\t\t\t\t\t$plugin_info[ $plugin ] = $data;\n\t\t\t\t\t\t\t\t$plugin_info[ $plugin ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );\n\t\t\t\t\t\t\t\tif ( ! $plugin_info[ $plugin ]['Network'] ) {\n\t\t\t\t\t\t\t\t\t$have_non_network_plugins = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Locate all the files in that folder.\n\t\t\t\t\t\t\t$files = list_files( WP_PLUGIN_DIR . '/' . $plugin_slug );\n\t\t\t\t\t\t\tif ( $files ) {\n\t\t\t\t\t\t\t\t$files_to_delete = array_merge( $files_to_delete, $files );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Get plugins list from that folder.\n\t\t\t\t\t\t\tif ( $folder_plugins = get_plugins( '/' . $plugin_slug ) ) {\n\t\t\t\t\t\t\t\tforeach ( $folder_plugins as $plugin_file => $data ) {\n\t\t\t\t\t\t\t\t\t$plugin_info[ $plugin_file ] = _get_plugin_data_markup_translate( $plugin_file, $data );\n\t\t\t\t\t\t\t\t\t$plugin_info[ $plugin_file ]['is_uninstallable'] = is_uninstallable_plugin( $plugin );\n\t\t\t\t\t\t\t\t\tif ( ! $plugin_info[ $plugin_file ]['Network'] ) {\n\t\t\t\t\t\t\t\t\t\t$have_non_network_plugins = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Add translation files.\n\t\t\t\t\t\t\tif ( ! empty( $plugin_translations[ $plugin_slug ] ) ) {\n\t\t\t\t\t\t\t\t$translations = $plugin_translations[ $plugin_slug ];\n\n\t\t\t\t\t\t\t\tforeach ( $translations as $translation => $data ) {\n\t\t\t\t\t\t\t\t\t$files_to_delete[] = $plugin_slug . '-' . $translation . '.po';\n\t\t\t\t\t\t\t\t\t$files_to_delete[] = $plugin_slug . '-' . $translation . '.mo';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$plugins_to_delete = count( $plugin_info );\n\t\t\t\t?>\n\t\t\t\t<?php if ( 1 == $plugins_to_delete ) : ?>\n\t\t\t\t\t<h1><?php _e( 'Delete Plugin' ); ?></h1>\n\t\t\t\t\t<?php if ( $have_non_network_plugins && is_network_admin() ) : ?>\n\t\t\t\t\t\t<div class=\"error\"><p><strong><?php _e( 'Caution:' ); ?></strong> <?php _e( 'This plugin may be active on other sites in the network.' ); ?></p></div>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t<p><?php _e( 'You are about to remove the following plugin:' ); ?></p>\n\t\t\t\t<?php else: ?>\n\t\t\t\t\t<h1><?php _e( 'Delete Plugins' ); ?></h1>\n\t\t\t\t\t<?php if ( $have_non_network_plugins && is_network_admin() ) : ?>\n\t\t\t\t\t\t<div class=\"error\"><p><strong><?php _e( 'Caution:' ); ?></strong> <?php _e( 'These plugins may be active on other sites in the network.' ); ?></p></div>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t<p><?php _e( 'You are about to remove the following plugins:' ); ?></p>\n\t\t\t\t<?php endif; ?>\n\t\t\t\t\t<ul class=\"ul-disc\">\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t$data_to_delete = false;\n\t\t\t\t\t\tforeach ( $plugin_info as $plugin ) {\n\t\t\t\t\t\t\tif ( $plugin['is_uninstallable'] ) {\n\t\t\t\t\t\t\t\t/* translators: 1: plugin name, 2: plugin author */\n\t\t\t\t\t\t\t\techo '<li>', sprintf( __( '<strong>%1$s</strong> by <em>%2$s</em> (will also <strong>delete its data</strong>)' ), $plugin['Name'], $plugin['AuthorName'] ), '</li>';\n\t\t\t\t\t\t\t\t$data_to_delete = true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t/* translators: 1: plugin name, 2: plugin author */\n\t\t\t\t\t\t\t\techo '<li>', sprintf( __('<strong>%1$s</strong> by <em>%2$s</em>' ), $plugin['Name'], $plugin['AuthorName'] ), '</li>';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t?>\n\t\t\t\t\t</ul>\n\t\t\t\t<p><?php\n\t\t\t\tif ( $data_to_delete )\n\t\t\t\t\t_e('Are you sure you wish to delete these files and data?');\n\t\t\t\telse\n\t\t\t\t\t_e('Are you sure you wish to delete these files?');\n\t\t\t\t?></p>\n\t\t\t\t<form method=\"post\" action=\"<?php echo esc_url($_SERVER['REQUEST_URI']); ?>\" style=\"display:inline;\">\n\t\t\t\t\t<input type=\"hidden\" name=\"verify-delete\" value=\"1\" />\n\t\t\t\t\t<input type=\"hidden\" name=\"action\" value=\"delete-selected\" />\n\t\t\t\t\t<?php\n\t\t\t\t\t\tforeach ( (array) $plugins as $plugin ) {\n\t\t\t\t\t\t\techo '<input type=\"hidden\" name=\"checked[]\" value=\"' . esc_attr( $plugin ) . '\" />';\n\t\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t\t<?php wp_nonce_field('bulk-plugins') ?>\n\t\t\t\t\t<?php submit_button( $data_to_delete ? __( 'Yes, delete these files and data' ) : __( 'Yes, delete these files' ), 'button', 'submit', false ); ?>\n\t\t\t\t</form>\n\t\t\t\t<?php\n\t\t\t\t$referer = wp_get_referer();\n\t\t\t\t?>\n\t\t\t\t<form method=\"post\" action=\"<?php echo $referer ? esc_url( $referer ) : ''; ?>\" style=\"display:inline;\">\n\t\t\t\t\t<?php submit_button( __( 'No, return me to the plugin list' ), 'button', 'submit', false ); ?>\n\t\t\t\t</form>\n\n\t\t\t\t<p><a href=\"#\" onclick=\"jQuery('#files-list').toggle(); return false;\"><?php _e('Click to view entire list of files which will be deleted'); ?></a></p>\n\t\t\t\t<div id=\"files-list\" style=\"display:none;\">\n\t\t\t\t\t<ul class=\"code\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\tforeach ( (array) $files_to_delete as $file ) {\n\t\t\t\t\t\t\techo '<li>' . esc_html( str_replace( WP_PLUGIN_DIR, '', $file ) ) . '</li>';\n\t\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\t<?php\n\t\t\t\trequire_once(ABSPATH . 'wp-admin/admin-footer.php');\n\t\t\t\texit;\n\t\t\t} else {\n\t\t\t\t$plugins_to_delete = count( $plugins );\n\t\t\t} // endif verify-delete\n\n\t\t\t$delete_result = delete_plugins( $plugins );\n\n\t\t\tset_transient('plugins_delete_result_' . $user_ID, $delete_result); //Store the result in a cache rather than a URL param due to object type & length\n\t\t\twp_redirect( self_admin_url(\"plugins.php?deleted=$plugins_to_delete&plugin_status=$status&paged=$page&s=$s\") );\n\t\t\texit;\n\n\t\tcase 'clear-recent-list':\n\t\t\tif ( ! is_network_admin() ) {\n\t\t\t\tupdate_option( 'recently_activated', array() );\n\t\t\t} else {\n\t\t\t\tupdate_site_option( 'recently_activated', array() );\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\n$wp_list_table->prepare_items();\n\nwp_enqueue_script('plugin-install');\nadd_thickbox();\n\nadd_screen_option( 'per_page', array( 'default' => 999 ) );\n\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'overview',\n'title'\t\t=> __('Overview'),\n'content'\t=>\n\t'<p>' . __('Plugins extend and expand the functionality of WordPress. Once a plugin is installed, you may activate it or deactivate it here.') . '</p>' .\n\t'<p>' . sprintf(\n\t\t/* translators: 1: Plugin Browser/Installer URL, 2: WordPress Plugin Directory URL 3: local plugin directory */\n\t\t__( 'You can find additional plugins for your site by using the <a href=\"%1$s\">Plugin Browser/Installer</a> functionality or by browsing the <a href=\"%2$s\" target=\"_blank\">WordPress Plugin Directory</a> directly and installing new plugins manually. To manually install a plugin you generally just need to upload the plugin file into your %3$s directory. Once a plugin has been installed, you can activate it here.' ),\n\t\t'plugin-install.php',\n\t\t'https://wordpress.org/plugins/',\n\t\t'<code>/wp-content/plugins</code>'\n\t) . '</p>'\n) );\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'compatibility-problems',\n'title'\t\t=> __('Troubleshooting'),\n'content'\t=>\n\t'<p>' . __('Most of the time, plugins play nicely with the core of WordPress and with other plugins. Sometimes, though, a plugin&#8217;s code will get in the way of another plugin, causing compatibility issues. If your site starts doing strange things, this may be the problem. Try deactivating all your plugins and re-activating them in various combinations until you isolate which one(s) caused the issue.') . '</p>' .\n\t'<p>' . sprintf(\n\t\t/* translators: WP_PLUGIN_DIR constant value */\n\t\t__( 'If something goes wrong with a plugin and you can&#8217;t use WordPress, delete or rename that file in the %s directory and it will be automatically deactivated.' ),\n\t\t'<code>' . WP_PLUGIN_DIR . '</code>'\n\t) . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Managing_Plugins#Plugin_Management\" target=\"_blank\">Documentation on Managing Plugins</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter plugins list' ),\n\t'heading_pagination' => __( 'Plugins list navigation' ),\n\t'heading_list'       => __( 'Plugins list' ),\n) );\n\n$title = __('Plugins');\n$parent_file = 'plugins.php';\n\nrequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n$invalid = validate_active_plugins();\nif ( ! empty( $invalid ) ) {\n\tforeach ( $invalid as $plugin_file => $error ) {\n\t\techo '<div id=\"message\" class=\"error\"><p>';\n\t\tprintf(\n\t\t\t/* translators: 1: plugin file 2: error message */\n\t\t\t__( 'The plugin %1$s has been <strong>deactivated</strong> due to an error: %2$s' ),\n\t\t\t'<code>' . esc_html( $plugin_file ) . '</code>',\n\t\t\t$error->get_error_message() );\n\t\techo '</p></div>';\n\t}\n}\n?>\n\n<?php if ( isset($_GET['error']) ) :\n\n\tif ( isset( $_GET['main'] ) )\n\t\t$errmsg = __( 'You cannot delete a plugin while it is active on the main site.' );\n\telseif ( isset($_GET['charsout']) )\n\t\t$errmsg = sprintf(__('The plugin generated %d characters of <strong>unexpected output</strong> during activation. If you notice &#8220;headers already sent&#8221; messages, problems with syndication feeds or other issues, try deactivating or removing this plugin.'), $_GET['charsout']);\n\telse\n\t\t$errmsg = __('Plugin could not be activated because it triggered a <strong>fatal error</strong>.');\n\t?>\n\t<div id=\"message\" class=\"error\"><p><?php echo $errmsg; ?></p>\n\t<?php\n\t\tif ( ! isset( $_GET['main'] ) && ! isset( $_GET['charsout'] ) && wp_verify_nonce( $_GET['_error_nonce'], 'plugin-activation-error_' . $plugin ) ) {\n\t\t\t$iframe_url = add_query_arg( array(\n\t\t\t\t'action'   => 'error_scrape',\n\t\t\t\t'plugin'   => urlencode( $plugin ),\n\t\t\t\t'_wpnonce' => urlencode( $_GET['_error_nonce'] ),\n\t\t\t), admin_url( 'plugins.php' ) );\n\t\t?>\n\t\t<iframe style=\"border:0\" width=\"100%\" height=\"70px\" src=\"<?php echo esc_url( $iframe_url ); ?>\"></iframe>\n\t<?php\n\t\t}\n\t?>\n\t</div>\n<?php elseif ( isset($_GET['deleted']) ) :\n\t\t$delete_result = get_transient( 'plugins_delete_result_' . $user_ID );\n\t\t// Delete it once we're done.\n\t\tdelete_transient( 'plugins_delete_result_' . $user_ID );\n\n\t\tif ( is_wp_error($delete_result) ) : ?>\n\t\t<div id=\"message\" class=\"error notice is-dismissible\"><p><?php printf( __('Plugin could not be deleted due to an error: %s'), $delete_result->get_error_message() ); ?></p></div>\n\t\t<?php else : ?>\n\t\t<div id=\"message\" class=\"updated notice is-dismissible\">\n\t\t\t<p>\n\t\t\t\t<?php\n\t\t\t\tif ( 1 == (int) $_GET['deleted'] ) {\n\t\t\t\t\t_e( 'The selected plugin has been <strong>deleted</strong>.' );\n\t\t\t\t} else {\n\t\t\t\t\t_e( 'The selected plugins have been <strong>deleted</strong>.' );\n\t\t\t\t}\n\t\t\t\t?>\n\t\t\t</p>\n\t\t</div>\n\t\t<?php endif; ?>\n<?php elseif ( isset($_GET['activate']) ) : ?>\n\t<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e('Plugin <strong>activated</strong>.') ?></p></div>\n<?php elseif (isset($_GET['activate-multi'])) : ?>\n\t<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e('Selected plugins <strong>activated</strong>.'); ?></p></div>\n<?php elseif ( isset($_GET['deactivate']) ) : ?>\n\t<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e('Plugin <strong>deactivated</strong>.') ?></p></div>\n<?php elseif (isset($_GET['deactivate-multi'])) : ?>\n\t<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e('Selected plugins <strong>deactivated</strong>.'); ?></p></div>\n<?php elseif ( 'update-selected' == $action ) : ?>\n\t<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e('All selected plugins are up to date.'); ?></p></div>\n<?php endif; ?>\n\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title );\nif ( ( ! is_multisite() || is_network_admin() ) && current_user_can('install_plugins') ) { ?>\n <a href=\"<?php echo self_admin_url( 'plugin-install.php' ); ?>\" class=\"page-title-action\"><?php echo esc_html_x('Add New', 'plugin'); ?></a>\n<?php }\nif ( $s )\n\tprintf( '<span class=\"subtitle\">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( $s ) ); ?>\n</h1>\n\n<?php\n/**\n * Fires before the plugins list table is rendered.\n *\n * This hook also fires before the plugins list table is rendered in the Network Admin.\n *\n * Please note: The 'active' portion of the hook name does not refer to whether the current\n * view is for active plugins, but rather all plugins actively-installed.\n *\n * @since 3.0.0\n *\n * @param array $plugins_all An array containing all installed plugins.\n */\ndo_action( 'pre_current_active_plugins', $plugins['all'] );\n?>\n\n<?php $wp_list_table->views(); ?>\n\n<form method=\"get\">\n<?php $wp_list_table->search_box( __( 'Search Installed Plugins' ), 'plugin' ); ?>\n</form>\n\n<form method=\"post\" id=\"bulk-action-form\">\n\n<input type=\"hidden\" name=\"plugin_status\" value=\"<?php echo esc_attr($status) ?>\" />\n<input type=\"hidden\" name=\"paged\" value=\"<?php echo esc_attr($page) ?>\" />\n\n<?php $wp_list_table->display(); ?>\n</form>\n\n</div>\n\n<?php\nwp_print_request_filesystem_credentials_modal();\n\ninclude(ABSPATH . 'wp-admin/admin-footer.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/post-new.php",
    "content": "<?php\n/**\n * New Post Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n/**\n * @global string  $post_type\n * @global object  $post_type_object\n * @global WP_Post $post\n */\nglobal $post_type, $post_type_object, $post;\n\nif ( ! isset( $_GET['post_type'] ) ) {\n\t$post_type = 'post';\n} elseif ( in_array( $_GET['post_type'], get_post_types( array('show_ui' => true ) ) ) ) {\n\t$post_type = $_GET['post_type'];\n} else {\n\twp_die( __('Invalid post type') );\n}\n$post_type_object = get_post_type_object( $post_type );\n\nif ( 'post' == $post_type ) {\n\t$parent_file = 'edit.php';\n\t$submenu_file = 'post-new.php';\n} elseif ( 'attachment' == $post_type ) {\n\tif ( wp_redirect( admin_url( 'media-new.php' ) ) )\n\t\texit;\n} else {\n\t$submenu_file = \"post-new.php?post_type=$post_type\";\n\tif ( isset( $post_type_object ) && $post_type_object->show_in_menu && $post_type_object->show_in_menu !== true ) {\n\t\t$parent_file = $post_type_object->show_in_menu;\n\t\t// What if there isn't a post-new.php item for this post type?\n\t\tif ( ! isset( $_registered_pages[ get_plugin_page_hookname( \"post-new.php?post_type=$post_type\", $post_type_object->show_in_menu ) ] ) ) {\n\t\t\tif (\tisset( $_registered_pages[ get_plugin_page_hookname( \"edit.php?post_type=$post_type\", $post_type_object->show_in_menu ) ] ) ) {\n\t\t\t\t// Fall back to edit.php for that post type, if it exists\n\t\t\t\t$submenu_file = \"edit.php?post_type=$post_type\";\n\t\t\t} else {\n\t\t\t\t// Otherwise, give up and highlight the parent\n\t\t\t\t$submenu_file = $parent_file;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t$parent_file = \"edit.php?post_type=$post_type\";\n\t}\n}\n\n$title = $post_type_object->labels->add_new_item;\n\n$editing = true;\n\nif ( ! current_user_can( $post_type_object->cap->edit_posts ) || ! current_user_can( $post_type_object->cap->create_posts ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to create posts as this user.' ) . '</p>',\n\t\t403\n\t);\n}\n\n// Schedule auto-draft cleanup\nif ( ! wp_next_scheduled( 'wp_scheduled_auto_draft_delete' ) )\n\twp_schedule_event( time(), 'daily', 'wp_scheduled_auto_draft_delete' );\n\nwp_enqueue_script( 'autosave' );\n\nif ( is_multisite() ) {\n\tadd_action( 'admin_footer', '_admin_notice_post_locked' );\n} else {\n\t$check_users = get_users( array( 'fields' => 'ID', 'number' => 2 ) );\n\n\tif ( count( $check_users ) > 1 )\n\t\tadd_action( 'admin_footer', '_admin_notice_post_locked' );\n\n\tunset( $check_users );\n}\n\n// Show post form.\n$post = get_default_post_to_edit( $post_type, true );\n$post_ID = $post->ID;\ninclude( ABSPATH . 'wp-admin/edit-form-advanced.php' );\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/post.php",
    "content": "<?php\n/**\n * Edit post administration panel.\n *\n * Manage Post actions: post, edit, delete, etc.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n$parent_file = 'edit.php';\n$submenu_file = 'edit.php';\n\nwp_reset_vars( array( 'action' ) );\n\nif ( isset( $_GET['post'] ) )\n \t$post_id = $post_ID = (int) $_GET['post'];\nelseif ( isset( $_POST['post_ID'] ) )\n \t$post_id = $post_ID = (int) $_POST['post_ID'];\nelse\n \t$post_id = $post_ID = 0;\n\n/**\n * @global string  $post_type\n * @global object  $post_type_object\n * @global WP_Post $post\n */\nglobal $post_type, $post_type_object, $post;\n\nif ( $post_id )\n\t$post = get_post( $post_id );\n\nif ( $post ) {\n\t$post_type = $post->post_type;\n\t$post_type_object = get_post_type_object( $post_type );\n}\n\nif ( isset( $_POST['deletepost'] ) )\n\t$action = 'delete';\nelseif ( isset($_POST['wp-preview']) && 'dopreview' == $_POST['wp-preview'] )\n\t$action = 'preview';\n\n$sendback = wp_get_referer();\nif ( ! $sendback ||\n     strpos( $sendback, 'post.php' ) !== false ||\n     strpos( $sendback, 'post-new.php' ) !== false ) {\n\tif ( 'attachment' == $post_type ) {\n\t\t$sendback = admin_url( 'upload.php' );\n\t} else {\n\t\t$sendback = admin_url( 'edit.php' );\n\t\tif ( ! empty( $post_type ) ) {\n\t\t\t$sendback = add_query_arg( 'post_type', $post_type, $sendback );\n\t\t}\n\t}\n} else {\n\t$sendback = remove_query_arg( array('trashed', 'untrashed', 'deleted', 'ids'), $sendback );\n}\n\nswitch($action) {\ncase 'post-quickdraft-save':\n\t// Check nonce and capabilities\n\t$nonce = $_REQUEST['_wpnonce'];\n\t$error_msg = false;\n\n\t// For output of the quickdraft dashboard widget\n\trequire_once ABSPATH . 'wp-admin/includes/dashboard.php';\n\n\tif ( ! wp_verify_nonce( $nonce, 'add-post' ) )\n\t\t$error_msg = __( 'Unable to submit this form, please refresh and try again.' );\n\n\tif ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {\n\t\texit;\n\t}\n\n\tif ( $error_msg )\n\t\treturn wp_dashboard_quick_press( $error_msg );\n\n\t$post = get_post( $_REQUEST['post_ID'] );\n\tcheck_admin_referer( 'add-' . $post->post_type );\n\n\t$_POST['comment_status'] = get_default_comment_status( $post->post_type );\n\t$_POST['ping_status']    = get_default_comment_status( $post->post_type, 'pingback' );\n\n\tedit_post();\n\twp_dashboard_quick_press();\n\texit;\n\ncase 'postajaxpost':\ncase 'post':\n\tcheck_admin_referer( 'add-' . $post_type );\n\t$post_id = 'postajaxpost' == $action ? edit_post() : write_post();\n\tredirect_post( $post_id );\n\texit();\n\ncase 'edit':\n\t$editing = true;\n\n\tif ( empty( $post_id ) ) {\n\t\twp_redirect( admin_url('post.php') );\n\t\texit();\n\t}\n\n\tif ( ! $post )\n\t\twp_die( __( 'You attempted to edit an item that doesn&#8217;t exist. Perhaps it was deleted?' ) );\n\n\tif ( ! $post_type_object )\n\t\twp_die( __( 'Unknown post type.' ) );\n\n\tif ( ! in_array( $typenow, get_post_types( array( 'show_ui' => true ) ) ) ) {\n\t\twp_die( __( 'You are not allowed to edit posts in this post type.' ) );\n\t}\n\n\tif ( ! current_user_can( 'edit_post', $post_id ) )\n\t\twp_die( __( 'You are not allowed to edit this item.' ) );\n\n\tif ( 'trash' == $post->post_status )\n\t\twp_die( __( 'You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.' ) );\n\n\tif ( ! empty( $_GET['get-post-lock'] ) ) {\n\t\tcheck_admin_referer( 'lock-post_' . $post_id );\n\t\twp_set_post_lock( $post_id );\n\t\twp_redirect( get_edit_post_link( $post_id, 'url' ) );\n\t\texit();\n\t}\n\n\t$post_type = $post->post_type;\n\tif ( 'post' == $post_type ) {\n\t\t$parent_file = \"edit.php\";\n\t\t$submenu_file = \"edit.php\";\n\t\t$post_new_file = \"post-new.php\";\n\t} elseif ( 'attachment' == $post_type ) {\n\t\t$parent_file = 'upload.php';\n\t\t$submenu_file = 'upload.php';\n\t\t$post_new_file = 'media-new.php';\n\t} else {\n\t\tif ( isset( $post_type_object ) && $post_type_object->show_in_menu && $post_type_object->show_in_menu !== true )\n\t\t\t$parent_file = $post_type_object->show_in_menu;\n\t\telse\n\t\t\t$parent_file = \"edit.php?post_type=$post_type\";\n\t\t$submenu_file = \"edit.php?post_type=$post_type\";\n\t\t$post_new_file = \"post-new.php?post_type=$post_type\";\n\t}\n\n\tif ( ! wp_check_post_lock( $post->ID ) ) {\n\t\t$active_post_lock = wp_set_post_lock( $post->ID );\n\n\t\tif ( 'attachment' !== $post_type )\n\t\t\twp_enqueue_script('autosave');\n\t}\n\n\tif ( is_multisite() ) {\n\t\tadd_action( 'admin_footer', '_admin_notice_post_locked' );\n\t} else {\n\t\t$check_users = get_users( array( 'fields' => 'ID', 'number' => 2 ) );\n\n\t\tif ( count( $check_users ) > 1 )\n\t\t\tadd_action( 'admin_footer', '_admin_notice_post_locked' );\n\n\t\tunset( $check_users );\n\t}\n\n\t$title = $post_type_object->labels->edit_item;\n\t$post = get_post($post_id, OBJECT, 'edit');\n\n\tif ( post_type_supports($post_type, 'comments') ) {\n\t\twp_enqueue_script('admin-comments');\n\t\tenqueue_comment_hotkeys_js();\n\t}\n\n\tinclude( ABSPATH . 'wp-admin/edit-form-advanced.php' );\n\n\tbreak;\n\ncase 'editattachment':\n\tcheck_admin_referer('update-post_' . $post_id);\n\n\t// Don't let these be changed\n\tunset($_POST['guid']);\n\t$_POST['post_type'] = 'attachment';\n\n\t// Update the thumbnail filename\n\t$newmeta = wp_get_attachment_metadata( $post_id, true );\n\t$newmeta['thumb'] = $_POST['thumb'];\n\n\twp_update_attachment_metadata( $post_id, $newmeta );\n\ncase 'editpost':\n\tcheck_admin_referer('update-post_' . $post_id);\n\n\t$post_id = edit_post();\n\n\t// Session cookie flag that the post was saved\n\tif ( isset( $_COOKIE['wp-saving-post'] ) && $_COOKIE['wp-saving-post'] === $post_id . '-check' ) {\n\t\tsetcookie( 'wp-saving-post', $post_id . '-saved', time() + DAY_IN_SECONDS, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, is_ssl() );\n\t}\n\n\tredirect_post($post_id); // Send user on their way while we keep working\n\n\texit();\n\ncase 'trash':\n\tcheck_admin_referer('trash-post_' . $post_id);\n\n\tif ( ! $post )\n\t\twp_die( __( 'The item you are trying to move to the Trash no longer exists.' ) );\n\n\tif ( ! $post_type_object )\n\t\twp_die( __( 'Unknown post type.' ) );\n\n\tif ( ! current_user_can( 'delete_post', $post_id ) )\n\t\twp_die( __( 'You are not allowed to move this item to the Trash.' ) );\n\n\tif ( $user_id = wp_check_post_lock( $post_id ) ) {\n\t\t$user = get_userdata( $user_id );\n\t\twp_die( sprintf( __( 'You cannot move this item to the Trash. %s is currently editing.' ), $user->display_name ) );\n\t}\n\n\tif ( ! wp_trash_post( $post_id ) )\n\t\twp_die( __( 'Error in moving to Trash.' ) );\n\n\twp_redirect( add_query_arg( array('trashed' => 1, 'ids' => $post_id), $sendback ) );\n\texit();\n\ncase 'untrash':\n\tcheck_admin_referer('untrash-post_' . $post_id);\n\n\tif ( ! $post )\n\t\twp_die( __( 'The item you are trying to restore from the Trash no longer exists.' ) );\n\n\tif ( ! $post_type_object )\n\t\twp_die( __( 'Unknown post type.' ) );\n\n\tif ( ! current_user_can( 'delete_post', $post_id ) )\n\t\twp_die( __( 'You are not allowed to restore this item from the Trash.' ) );\n\n\tif ( ! wp_untrash_post( $post_id ) )\n\t\twp_die( __( 'Error in restoring from Trash.' ) );\n\n\twp_redirect( add_query_arg('untrashed', 1, $sendback) );\n\texit();\n\ncase 'delete':\n\tcheck_admin_referer('delete-post_' . $post_id);\n\n\tif ( ! $post )\n\t\twp_die( __( 'This item has already been deleted.' ) );\n\n\tif ( ! $post_type_object )\n\t\twp_die( __( 'Unknown post type.' ) );\n\n\tif ( ! current_user_can( 'delete_post', $post_id ) )\n\t\twp_die( __( 'You are not allowed to delete this item.' ) );\n\n\tif ( $post->post_type == 'attachment' ) {\n\t\t$force = ( ! MEDIA_TRASH );\n\t\tif ( ! wp_delete_attachment( $post_id, $force ) )\n\t\t\twp_die( __( 'Error in deleting.' ) );\n\t} else {\n\t\tif ( ! wp_delete_post( $post_id, true ) )\n\t\t\twp_die( __( 'Error in deleting.' ) );\n\t}\n\n\twp_redirect( add_query_arg('deleted', 1, $sendback) );\n\texit();\n\ncase 'preview':\n\tcheck_admin_referer( 'update-post_' . $post_id );\n\n\t$url = post_preview();\n\n\twp_redirect($url);\n\texit();\n\ndefault:\n\twp_redirect( admin_url('edit.php') );\n\texit();\n} // end switch\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/press-this.php",
    "content": "<?php\n/**\n * Press This Display and Handler.\n *\n * @package WordPress\n * @subpackage Press_This\n */\n\ndefine('IFRAME_REQUEST' , true);\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'edit_posts' ) || ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to create posts as this user.' ) . '</p>',\n\t\t403\n\t);\n}\n\n/**\n * @global WP_Press_This $wp_press_this\n */\nif ( empty( $GLOBALS['wp_press_this'] ) ) {\n\tinclude( ABSPATH . 'wp-admin/includes/class-wp-press-this.php' );\n}\n\n$GLOBALS['wp_press_this']->html();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/profile.php",
    "content": "<?php\n/**\n * User Profile Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * This is a profile page.\n *\n * @since 2.5.0\n * @var bool\n */\ndefine('IS_PROFILE_PAGE', true);\n\n/** Load User Editing Page */\nrequire_once( dirname( __FILE__ ) . '/user-edit.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/revision.php",
    "content": "<?php\n/**\n * Revisions administration panel\n *\n * Requires wp-admin/includes/revision.php.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 2.6.0\n *\n * @param int    revision Optional. The revision ID.\n * @param string action   The action to take.\n *                        Accepts 'restore', 'view' or 'edit'.\n * @param int    from     The revision to compare from.\n * @param int    to       Optional, required if revision missing. The revision to compare to.\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nrequire ABSPATH . 'wp-admin/includes/revision.php';\n\nwp_reset_vars( array( 'revision', 'action', 'from', 'to' ) );\n\n$revision_id = absint( $revision );\n\n$from = is_numeric( $from ) ? absint( $from ) : null;\nif ( ! $revision_id )\n\t$revision_id = absint( $to );\n$redirect = 'edit.php';\n\nswitch ( $action ) {\ncase 'restore' :\n\tif ( ! $revision = wp_get_post_revision( $revision_id ) )\n\t\tbreak;\n\n\tif ( ! current_user_can( 'edit_post', $revision->post_parent ) )\n\t\tbreak;\n\n\tif ( ! $post = get_post( $revision->post_parent ) )\n\t\tbreak;\n\n\t// Revisions disabled (previously checked autosaves && ! wp_is_post_autosave( $revision ))\n\tif ( ! wp_revisions_enabled( $post ) ) {\n\t\t$redirect = 'edit.php?post_type=' . $post->post_type;\n\t\tbreak;\n\t}\n\n\t// Don't allow revision restore when post is locked\n\tif ( wp_check_post_lock( $post->ID ) )\n\t\tbreak;\n\n\tcheck_admin_referer( \"restore-post_{$revision->ID}\" );\n\n\twp_restore_post_revision( $revision->ID );\n\t$redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) );\n\tbreak;\ncase 'view' :\ncase 'edit' :\ndefault :\n\tif ( ! $revision = wp_get_post_revision( $revision_id ) )\n\t\tbreak;\n\tif ( ! $post = get_post( $revision->post_parent ) )\n\t\tbreak;\n\n\tif ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'read_post', $post->ID ) )\n\t\tbreak;\n\n\t// Revisions disabled and we're not looking at an autosave\n\tif ( ! wp_revisions_enabled( $post ) && ! wp_is_post_autosave( $revision ) ) {\n\t\t$redirect = 'edit.php?post_type=' . $post->post_type;\n\t\tbreak;\n\t}\n\n\t$post_edit_link = get_edit_post_link();\n\t$post_title     = '<a href=\"' . $post_edit_link . '\">' . _draft_or_post_title() . '</a>';\n\t$h1             = sprintf( __( 'Compare Revisions of &#8220;%1$s&#8221;' ), $post_title );\n\t$return_to_post = '<a href=\"' . $post_edit_link . '\">' . __( '&larr; Return to editor' ) . '</a>';\n\t$title          = __( 'Revisions' );\n\n\t$redirect = false;\n\tbreak;\n}\n\n// Empty post_type means either malformed object found, or no valid parent was found.\nif ( ! $redirect && empty( $post->post_type ) )\n\t$redirect = 'edit.php';\n\nif ( ! empty( $redirect ) ) {\n\twp_redirect( $redirect );\n\texit;\n}\n\n// This is so that the correct \"Edit\" menu item is selected.\nif ( ! empty( $post->post_type ) && 'post' != $post->post_type )\n\t$parent_file = $submenu_file = 'edit.php?post_type=' . $post->post_type;\nelse\n\t$parent_file = $submenu_file = 'edit.php';\n\nwp_enqueue_script( 'revisions' );\nwp_localize_script( 'revisions', '_wpRevisionsSettings', wp_prepare_revisions_for_js( $post, $revision_id, $from ) );\n\n/* Revisions Help Tab */\n\n$revisions_overview  = '<p>' . __( 'This screen is used for managing your content revisions.' ) . '</p>';\n$revisions_overview .= '<p>' . __( 'Revisions are saved copies of your post or page, which are periodically created as you update your content. The red text on the left shows the content that was removed. The green text on the right shows the content that was added.' ) . '</p>';\n$revisions_overview .= '<p>' . __( 'From this screen you can review, compare, and restore revisions:' ) . '</p>';\n$revisions_overview .= '<ul><li>' . __( 'To navigate between revisions, <strong>drag the slider handle left or right</strong> or <strong>use the Previous or Next buttons</strong>.' ) . '</li>';\n$revisions_overview .= '<li>' . __( 'Compare two different revisions by <strong>selecting the &#8220;Compare any two revisions&#8221; box</strong> to the side.' ) . '</li>';\n$revisions_overview .= '<li>' . __( 'To restore a revision, <strong>click Restore This Revision</strong>.' ) . '</li></ul>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'revisions-overview',\n\t'title'   => __( 'Overview' ),\n\t'content' => $revisions_overview\n) );\n\n$revisions_sidebar  = '<p><strong>' . __( 'For more information:' ) . '</strong></p>';\n$revisions_sidebar .= '<p>' . __( '<a href=\"https://codex.wordpress.org/Revision_Management\" target=\"_blank\">Revisions Management</a>' ) . '</p>';\n$revisions_sidebar .= '<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>';\n\nget_current_screen()->set_help_sidebar( $revisions_sidebar );\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\n?>\n\n<div class=\"wrap\">\n\t<h1 class=\"long-header\"><?php echo $h1; ?></h1>\n\t<?php echo $return_to_post; ?>\n</div>\n<?php\nwp_print_revision_templates();\n\nrequire_once( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/setup-config.php",
    "content": "<?php\n/**\n * Retrieves and creates the wp-config.php file.\n *\n * The permissions for the base directory must allow for writing files in order\n * for the wp-config.php to be created using this page.\n *\n * @internal This file must be parsable by PHP4.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * We are installing.\n */\ndefine('WP_INSTALLING', true);\n\n/**\n * We are blissfully unaware of anything.\n */\ndefine('WP_SETUP_CONFIG', true);\n\n/**\n * Disable error reporting\n *\n * Set this to error_reporting( -1 ) for debugging\n */\nerror_reporting(0);\n\ndefine( 'ABSPATH', dirname( dirname( __FILE__ ) ) . '/' );\n\nrequire( ABSPATH . 'wp-settings.php' );\n\n/** Load WordPress Administration Upgrade API */\nrequire_once( ABSPATH . 'wp-admin/includes/upgrade.php' );\n\n/** Load WordPress Translation Install API */\nrequire_once( ABSPATH . 'wp-admin/includes/translation-install.php' );\n\nnocache_headers();\n\n// Support wp-config-sample.php one level up, for the develop repo.\nif ( file_exists( ABSPATH . 'wp-config-sample.php' ) )\n\t$config_file = file( ABSPATH . 'wp-config-sample.php' );\nelseif ( file_exists( dirname( ABSPATH ) . '/wp-config-sample.php' ) )\n\t$config_file = file( dirname( ABSPATH ) . '/wp-config-sample.php' );\nelse\n\twp_die( __( 'Sorry, I need a wp-config-sample.php file to work from. Please re-upload this file to your WordPress installation.' ) );\n\n// Check if wp-config.php has been created\nif ( file_exists( ABSPATH . 'wp-config.php' ) )\n\twp_die( '<p>' . sprintf(\n\t\t\t/* translators: %s: install.php */\n\t\t\t__( \"The file 'wp-config.php' already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href='%s'>installing now</a>.\" ),\n\t\t\t'install.php'\n\t\t) . '</p>'\n\t);\n\n// Check if wp-config.php exists above the root directory but is not part of another install\nif ( @file_exists( ABSPATH . '../wp-config.php' ) && ! @file_exists( ABSPATH . '../wp-settings.php' ) ) {\n\twp_die( '<p>' . sprintf(\n\t\t\t/* translators: %s: install.php */\n\t\t\t__( \"The file 'wp-config.php' already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href='%s'>installing now</a>.\" ),\n\t\t\t'install.php'\n\t\t) . '</p>'\n\t);\n}\n\n$step = isset( $_GET['step'] ) ? (int) $_GET['step'] : -1;\n\n/**\n * Display setup wp-config.php file header.\n *\n * @ignore\n * @since 2.3.0\n *\n * @global string    $wp_local_package\n * @global WP_Locale $wp_locale\n *\n * @param string|array $body_classes\n */\nfunction setup_config_display_header( $body_classes = array() ) {\n\t$body_classes = (array) $body_classes;\n\t$body_classes[] = 'wp-core-ui';\n\tif ( is_rtl() ) {\n\t\t$body_classes[] = 'rtl';\n\t}\n\n\theader( 'Content-Type: text/html; charset=utf-8' );\n?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\"<?php if ( is_rtl() ) echo ' dir=\"rtl\"'; ?>>\n<head>\n\t<meta name=\"viewport\" content=\"width=device-width\" />\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<meta name=\"robots\" content=\"noindex,nofollow\" />\n\t<title><?php _e( 'WordPress &rsaquo; Setup Configuration File' ); ?></title>\n\t<?php wp_admin_css( 'install', true ); ?>\n</head>\n<body class=\"<?php echo implode( ' ', $body_classes ); ?>\">\n<p id=\"logo\"><a href=\"<?php esc_attr_e( 'https://wordpress.org/' ); ?>\" tabindex=\"-1\"><?php _e( 'WordPress' ); ?></a></p>\n<?php\n} // end function setup_config_display_header();\n\n$language = '';\nif ( ! empty( $_REQUEST['language'] ) ) {\n\t$language = preg_replace( '/[^a-zA-Z_]/', '', $_REQUEST['language'] );\n} elseif ( isset( $GLOBALS['wp_local_package'] ) ) {\n\t$language = $GLOBALS['wp_local_package'];\n}\n\nswitch($step) {\n\tcase -1:\n\t\tif ( wp_can_install_language_pack() && empty( $language ) && ( $languages = wp_get_available_translations() ) ) {\n\t\t\tsetup_config_display_header( 'language-chooser' );\n\t\t\techo '<h1 class=\"screen-reader-text\">Select a default language</h1>';\n\t\t\techo '<form id=\"setup\" method=\"post\" action=\"?step=0\">';\n\t\t\twp_install_language_form( $languages );\n\t\t\techo '</form>';\n\t\t\tbreak;\n\t\t}\n\n\t\t// Deliberately fall through if we can't reach the translations API.\n\n\tcase 0:\n\t\tif ( ! empty( $language ) ) {\n\t\t\t$loaded_language = wp_download_language_pack( $language );\n\t\t\tif ( $loaded_language ) {\n\t\t\t\tload_default_textdomain( $loaded_language );\n\t\t\t\t$GLOBALS['wp_locale'] = new WP_Locale();\n\t\t\t}\n\t\t}\n\n\t\tsetup_config_display_header();\n\t\t$step_1 = 'setup-config.php?step=1';\n\t\tif ( isset( $_REQUEST['noapi'] ) ) {\n\t\t\t$step_1 .= '&amp;noapi';\n\t\t}\n\t\tif ( ! empty( $loaded_language ) ) {\n\t\t\t$step_1 .= '&amp;language=' . $loaded_language;\n\t\t}\n?>\n<h1 class=\"screen-reader-text\"><?php _e( 'Before getting started' ) ?></h1>\n<p><?php _e( 'Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding.' ) ?></p>\n<ol>\n\t<li><?php _e( 'Database name' ); ?></li>\n\t<li><?php _e( 'Database username' ); ?></li>\n\t<li><?php _e( 'Database password' ); ?></li>\n\t<li><?php _e( 'Database host' ); ?></li>\n\t<li><?php _e( 'Table prefix (if you want to run more than one WordPress in a single database)' ); ?></li>\n</ol>\n<p><?php\n\t/* translators: %s: wp-config.php */\n\tprintf( __( 'We&#8217;re going to use this information to create a %s file.' ),\n\t\t'<code>wp-config.php</code>'\n\t);\n\t?>\n\t<strong><?php\n\t\t/* translators: 1: wp-config-sample.php, 2: wp-config.php */\n\t\tprintf( __( 'If for any reason this automatic file creation doesn&#8217;t work, don&#8217;t worry. All this does is fill in the database information to a configuration file. You may also simply open %1$s in a text editor, fill in your information, and save it as %2$s.' ),\n\t\t\t'<code>wp-config-sample.php</code>',\n\t\t\t'<code>wp-config.php</code>'\n\t\t);\n\t?></strong>\n\t<?php\n\t/* translators: %s: Codex URL */\n\tprintf( __( 'Need more help? <a href=\"%s\">We got it</a>.' ),\n\t\t__( 'https://codex.wordpress.org/Editing_wp-config.php' )\n\t);\n?></p>\n<p><?php _e( 'In all likelihood, these items were supplied to you by your Web Host. If you don&#8217;t have this information, then you will need to contact them before you can continue. If you&#8217;re all ready&hellip;' ); ?></p>\n\n<p class=\"step\"><a href=\"<?php echo $step_1; ?>\" class=\"button button-large\"><?php _e( 'Let&#8217;s go!' ); ?></a></p>\n<?php\n\tbreak;\n\n\tcase 1:\n\t\tload_default_textdomain( $language );\n\t\t$GLOBALS['wp_locale'] = new WP_Locale();\n\n\t\tsetup_config_display_header();\n\t?>\n<h1 class=\"screen-reader-text\"><?php _e( 'Setup your database connection' ) ?></h1>\n<form method=\"post\" action=\"setup-config.php?step=2\">\n\t<p><?php _e( 'Below you should enter your database connection details. If you&#8217;re not sure about these, contact your host.' ); ?></p>\n\t<table class=\"form-table\">\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"dbname\"><?php _e( 'Database Name' ); ?></label></th>\n\t\t\t<td><input name=\"dbname\" id=\"dbname\" type=\"text\" size=\"25\" value=\"wordpress\" /></td>\n\t\t\t<td><?php _e( 'The name of the database you want to run WP in.' ); ?></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"uname\"><?php _e( 'User Name' ); ?></label></th>\n\t\t\t<td><input name=\"uname\" id=\"uname\" type=\"text\" size=\"25\" value=\"<?php echo htmlspecialchars( _x( 'username', 'example username' ), ENT_QUOTES ); ?>\" /></td>\n\t\t\t<td><?php _e( 'Your MySQL username' ); ?></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"pwd\"><?php _e( 'Password' ); ?></label></th>\n\t\t\t<td><input name=\"pwd\" id=\"pwd\" type=\"text\" size=\"25\" value=\"<?php echo htmlspecialchars( _x( 'password', 'example password' ), ENT_QUOTES ); ?>\" autocomplete=\"off\" /></td>\n\t\t\t<td><?php _e( '&hellip;and your MySQL password.' ); ?></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"dbhost\"><?php _e( 'Database Host' ); ?></label></th>\n\t\t\t<td><input name=\"dbhost\" id=\"dbhost\" type=\"text\" size=\"25\" value=\"localhost\" /></td>\n\t\t\t<td><?php\n\t\t\t\t/* translators: %s: localhost */\n\t\t\t\tprintf( __( 'You should be able to get this info from your web host, if %s doesn&#8217;t work.' ),'<code>localhost</code>' );\n\t\t\t?></td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th scope=\"row\"><label for=\"prefix\"><?php _e( 'Table Prefix' ); ?></label></th>\n\t\t\t<td><input name=\"prefix\" id=\"prefix\" type=\"text\" value=\"wp_\" size=\"25\" /></td>\n\t\t\t<td><?php _e( 'If you want to run multiple WordPress installations in a single database, change this.' ); ?></td>\n\t\t</tr>\n\t</table>\n\t<?php if ( isset( $_GET['noapi'] ) ) { ?><input name=\"noapi\" type=\"hidden\" value=\"1\" /><?php } ?>\n\t<input type=\"hidden\" name=\"language\" value=\"<?php echo esc_attr( $language ); ?>\" />\n\t<p class=\"step\"><input name=\"submit\" type=\"submit\" value=\"<?php echo htmlspecialchars( __( 'Submit' ), ENT_QUOTES ); ?>\" class=\"button button-large\" /></p>\n</form>\n<?php\n\tbreak;\n\n\tcase 2:\n\tload_default_textdomain( $language );\n\t$GLOBALS['wp_locale'] = new WP_Locale();\n\n\t$dbname = trim( wp_unslash( $_POST[ 'dbname' ] ) );\n\t$uname = trim( wp_unslash( $_POST[ 'uname' ] ) );\n\t$pwd = trim( wp_unslash( $_POST[ 'pwd' ] ) );\n\t$dbhost = trim( wp_unslash( $_POST[ 'dbhost' ] ) );\n\t$prefix = trim( wp_unslash( $_POST[ 'prefix' ] ) );\n\n\t$step_1 = 'setup-config.php?step=1';\n\t$install = 'install.php';\n\tif ( isset( $_REQUEST['noapi'] ) ) {\n\t\t$step_1 .= '&amp;noapi';\n\t}\n\n\tif ( ! empty( $language ) ) {\n\t\t$step_1 .= '&amp;language=' . $language;\n\t\t$install .= '?language=' . $language;\n\t} else {\n\t\t$install .= '?language=en_US';\n\t}\n\n\t$tryagain_link = '</p><p class=\"step\"><a href=\"' . $step_1 . '\" onclick=\"javascript:history.go(-1);return false;\" class=\"button button-large\">' . __( 'Try again' ) . '</a>';\n\n\tif ( empty( $prefix ) )\n\t\twp_die( __( '<strong>ERROR</strong>: \"Table Prefix\" must not be empty.' . $tryagain_link ) );\n\n\t// Validate $prefix: it can only contain letters, numbers and underscores.\n\tif ( preg_match( '|[^a-z0-9_]|i', $prefix ) )\n\t\twp_die( __( '<strong>ERROR</strong>: \"Table Prefix\" can only contain numbers, letters, and underscores.' . $tryagain_link ) );\n\n\t// Test the db connection.\n\t/**#@+\n\t * @ignore\n\t */\n\tdefine('DB_NAME', $dbname);\n\tdefine('DB_USER', $uname);\n\tdefine('DB_PASSWORD', $pwd);\n\tdefine('DB_HOST', $dbhost);\n\t/**#@-*/\n\n\t// Re-construct $wpdb with these new values.\n\tunset( $wpdb );\n\trequire_wp_db();\n\n\t/*\n\t * The wpdb constructor bails when WP_SETUP_CONFIG is set, so we must\n\t * fire this manually. We'll fail here if the values are no good.\n\t */\n\t$wpdb->db_connect();\n\n\tif ( ! empty( $wpdb->error ) )\n\t\twp_die( $wpdb->error->get_error_message() . $tryagain_link );\n\n\t// Fetch or generate keys and salts.\n\t$no_api = isset( $_POST['noapi'] );\n\tif ( ! $no_api ) {\n\t\t$secret_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );\n\t}\n\n\tif ( $no_api || is_wp_error( $secret_keys ) ) {\n\t\t$secret_keys = array();\n\t\tfor ( $i = 0; $i < 8; $i++ ) {\n\t\t\t$secret_keys[] = wp_generate_password( 64, true, true );\n\t\t}\n\t} else {\n\t\t$secret_keys = explode( \"\\n\", wp_remote_retrieve_body( $secret_keys ) );\n\t\tforeach ( $secret_keys as $k => $v ) {\n\t\t\t$secret_keys[$k] = substr( $v, 28, 64 );\n\t\t}\n\t}\n\n\t$key = 0;\n\t// Not a PHP5-style by-reference foreach, as this file must be parseable by PHP4.\n\tforeach ( $config_file as $line_num => $line ) {\n\t\tif ( '$table_prefix  =' == substr( $line, 0, 16 ) ) {\n\t\t\t$config_file[ $line_num ] = '$table_prefix  = \\'' . addcslashes( $prefix, \"\\\\'\" ) . \"';\\r\\n\";\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( ! preg_match( '/^define\\(\\'([A-Z_]+)\\',([ ]+)/', $line, $match ) )\n\t\t\tcontinue;\n\n\t\t$constant = $match[1];\n\t\t$padding  = $match[2];\n\n\t\tswitch ( $constant ) {\n\t\t\tcase 'DB_NAME'     :\n\t\t\tcase 'DB_USER'     :\n\t\t\tcase 'DB_PASSWORD' :\n\t\t\tcase 'DB_HOST'     :\n\t\t\t\t$config_file[ $line_num ] = \"define('\" . $constant . \"',\" . $padding . \"'\" . addcslashes( constant( $constant ), \"\\\\'\" ) . \"');\\r\\n\";\n\t\t\t\tbreak;\n\t\t\tcase 'DB_CHARSET'  :\n\t\t\t\tif ( 'utf8mb4' === $wpdb->charset || ( ! $wpdb->charset && $wpdb->has_cap( 'utf8mb4' ) ) ) {\n\t\t\t\t\t$config_file[ $line_num ] = \"define('\" . $constant . \"',\" . $padding . \"'utf8mb4');\\r\\n\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'AUTH_KEY'         :\n\t\t\tcase 'SECURE_AUTH_KEY'  :\n\t\t\tcase 'LOGGED_IN_KEY'    :\n\t\t\tcase 'NONCE_KEY'        :\n\t\t\tcase 'AUTH_SALT'        :\n\t\t\tcase 'SECURE_AUTH_SALT' :\n\t\t\tcase 'LOGGED_IN_SALT'   :\n\t\t\tcase 'NONCE_SALT'       :\n\t\t\t\t$config_file[ $line_num ] = \"define('\" . $constant . \"',\" . $padding . \"'\" . $secret_keys[$key++] . \"');\\r\\n\";\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tunset( $line );\n\n\tif ( ! is_writable(ABSPATH) ) :\n\t\tsetup_config_display_header();\n?>\n<p><?php\n\t/* translators: %s: wp-config.php */\n\tprintf( __( 'Sorry, but I can&#8217;t write the %s file.' ), '<code>wp-config.php</code>' );\n?></p>\n<p><?php\n\t/* translators: %s: wp-config.php */\n\tprintf( __( 'You can create the %s manually and paste the following text into it.' ), '<code>wp-config.php</code>' );\n?></p>\n<textarea id=\"wp-config\" cols=\"98\" rows=\"15\" class=\"code\" readonly=\"readonly\"><?php\n\t\tforeach ( $config_file as $line ) {\n\t\t\techo htmlentities($line, ENT_COMPAT, 'UTF-8');\n\t\t}\n?></textarea>\n<p><?php _e( 'After you&#8217;ve done that, click &#8220;Run the install.&#8221;' ); ?></p>\n<p class=\"step\"><a href=\"<?php echo $install; ?>\" class=\"button button-large\"><?php _e( 'Run the install' ); ?></a></p>\n<script>\n(function(){\nif ( ! /iPad|iPod|iPhone/.test( navigator.userAgent ) ) {\n\tvar el = document.getElementById('wp-config');\n\tel.focus();\n\tel.select();\n}\n})();\n</script>\n<?php\n\telse :\n\t\t/*\n\t\t * If this file doesn't exist, then we are using the wp-config-sample.php\n\t\t * file one level up, which is for the develop repo.\n\t\t */\n\t\tif ( file_exists( ABSPATH . 'wp-config-sample.php' ) )\n\t\t\t$path_to_wp_config = ABSPATH . 'wp-config.php';\n\t\telse\n\t\t\t$path_to_wp_config = dirname( ABSPATH ) . '/wp-config.php';\n\n\t\t$handle = fopen( $path_to_wp_config, 'w' );\n\t\tforeach ( $config_file as $line ) {\n\t\t\tfwrite( $handle, $line );\n\t\t}\n\t\tfclose( $handle );\n\t\tchmod( $path_to_wp_config, 0666 );\n\t\tsetup_config_display_header();\n?>\n<h1 class=\"screen-reader-text\"><?php _e( 'Successful database connection' ) ?></h1>\n<p><?php _e( 'All right, sparky! You&#8217;ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to&hellip;' ); ?></p>\n\n<p class=\"step\"><a href=\"<?php echo $install; ?>\" class=\"button button-large\"><?php _e( 'Run the install' ); ?></a></p>\n<?php\n\tendif;\n\tbreak;\n}\n?>\n<?php wp_print_scripts( 'language-chooser' ); ?>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/theme-editor.php",
    "content": "<?php\n/**\n * Theme editor administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( is_multisite() && ! is_network_admin() ) {\n\twp_redirect( network_admin_url( 'theme-editor.php' ) );\n\texit();\n}\n\nif ( !current_user_can('edit_themes') )\n\twp_die('<p>'.__('You do not have sufficient permissions to edit templates for this site.').'</p>');\n\n$title = __(\"Edit Themes\");\n$parent_file = 'themes.php';\n\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'overview',\n'title'\t\t=> __('Overview'),\n'content'\t=>\n\t'<p>' . __('You can use the Theme Editor to edit the individual CSS and PHP files which make up your theme.') . '</p>\n\t<p>' . __(\"Begin by choosing a theme to edit from the dropdown menu and clicking Select. A list then appears of the theme's template files. Clicking once on any file name causes the file to appear in the large Editor box.\") . '</p>\n\t<p>' . __('For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Look Up takes you to a web page with reference material about that particular function.') . '</p>\n\t<p id=\"newcontent-description\">' . __( 'In the editing area the Tab key enters a tab character. To move below this area by pressing Tab, press the Esc key followed by the Tab key. In some cases the Esc key will need to be pressed twice before the Tab key will allow you to continue.' ) . '</p>\n\t<p>' . __('After typing in your edits, click Update File.') . '</p>\n\t<p>' . __('<strong>Advice:</strong> think very carefully about your site crashing if you are live-editing the theme currently in use.') . '</p>\n\t<p>' . sprintf( __('Upgrading to a newer version of the same theme will override changes made here. To avoid this, consider creating a <a href=\"%s\" target=\"_blank\">child theme</a> instead.'), __('https://codex.wordpress.org/Child_Themes') ) . '</p>' .\n\t( is_network_admin() ? '<p>' . __('Any edits to files from this screen will be reflected on all sites in the network.') . '</p>' : '' )\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Theme_Development\" target=\"_blank\">Documentation on Theme Development</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Using_Themes\" target=\"_blank\">Documentation on Using Themes</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Editing_Files\" target=\"_blank\">Documentation on Editing Files</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Template_Tags\" target=\"_blank\">Documentation on Template Tags</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nwp_reset_vars( array( 'action', 'error', 'file', 'theme' ) );\n\nif ( $theme ) {\n\t$stylesheet = $theme;\n} else {\n\t$stylesheet = get_stylesheet();\n}\n\n$theme = wp_get_theme( $stylesheet );\n\nif ( ! $theme->exists() ) {\n\twp_die( __( 'The requested theme does not exist.' ) );\n}\n\nif ( $theme->errors() && 'theme_no_stylesheet' == $theme->errors()->get_error_code() ) {\n\twp_die( __( 'The requested theme does not exist.' ) . ' ' . $theme->errors()->get_error_message() );\n}\n\n$allowed_files = $style_files = array();\n$has_templates = false;\n$default_types = array( 'php', 'css' );\n\n/**\n * Filter the list of file types allowed for editing in the Theme editor.\n *\n * @since 4.4.0\n *\n * @param array    $default_types List of file types. Default types include 'php' and 'css'.\n * @param WP_Theme $theme         The current Theme object.\n */\n$file_types = apply_filters( 'wp_theme_editor_filetypes', $default_types, $theme );\n\n// Ensure that default types are still there.\n$file_types = array_unique( array_merge( $file_types, $default_types ) );\n\nforeach ( $file_types as $type ) {\n\tswitch ( $type ) {\n\t\tcase 'php':\n\t\t\t$allowed_files += $theme->get_files( 'php', 1 );\n\t\t\t$has_templates = ! empty( $allowed_files );\n\t\t\tbreak;\n\t\tcase 'css':\n\t\t\t$style_files = $theme->get_files( 'css' );\n\t\t\t$allowed_files['style.css'] = $style_files['style.css'];\n\t\t\t$allowed_files += $style_files;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t$allowed_files += $theme->get_files( $type );\n\t\t\tbreak;\n\t}\n}\n\nif ( empty( $file ) ) {\n\t$relative_file = 'style.css';\n\t$file = $allowed_files['style.css'];\n} else {\n\t$relative_file = $file;\n\t$file = $theme->get_stylesheet_directory() . '/' . $relative_file;\n}\n\nvalidate_file_to_edit( $file, $allowed_files );\n$scrollto = isset( $_REQUEST['scrollto'] ) ? (int) $_REQUEST['scrollto'] : 0;\n\nswitch( $action ) {\ncase 'update':\n\tcheck_admin_referer( 'edit-theme_' . $file . $stylesheet );\n\t$newcontent = wp_unslash( $_POST['newcontent'] );\n\t$location = 'theme-editor.php?file=' . urlencode( $relative_file ) . '&theme=' . urlencode( $stylesheet ) . '&scrollto=' . $scrollto;\n\tif ( is_writeable( $file ) ) {\n\t\t// is_writable() not always reliable, check return value. see comments @ http://uk.php.net/is_writable\n\t\t$f = fopen( $file, 'w+' );\n\t\tif ( $f !== false ) {\n\t\t\tfwrite( $f, $newcontent );\n\t\t\tfclose( $f );\n\t\t\t$location .= '&updated=true';\n\t\t\t$theme->cache_delete();\n\t\t}\n\t}\n\twp_redirect( $location );\n\texit;\n\ndefault:\n\n\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\n\tupdate_recently_edited( $file );\n\n\tif ( ! is_file( $file ) )\n\t\t$error = true;\n\n\t$content = '';\n\tif ( ! $error && filesize( $file ) > 0 ) {\n\t\t$f = fopen($file, 'r');\n\t\t$content = fread($f, filesize($file));\n\n\t\tif ( '.php' == substr( $file, strrpos( $file, '.' ) ) ) {\n\t\t\t$functions = wp_doc_link_parse( $content );\n\n\t\t\t$docs_select = '<select name=\"docs-list\" id=\"docs-list\">';\n\t\t\t$docs_select .= '<option value=\"\">' . esc_attr__( 'Function Name&hellip;' ) . '</option>';\n\t\t\tforeach ( $functions as $function ) {\n\t\t\t\t$docs_select .= '<option value=\"' . esc_attr( urlencode( $function ) ) . '\">' . htmlspecialchars( $function ) . '()</option>';\n\t\t\t}\n\t\t\t$docs_select .= '</select>';\n\t\t}\n\n\t\t$content = esc_textarea( $content );\n\t}\n\n\tif ( isset( $_GET['updated'] ) ) : ?>\n <div id=\"message\" class=\"updated notice is-dismissible\"><p><?php _e( 'File edited successfully.' ) ?></p></div>\n<?php endif;\n\n$description = get_file_description( $relative_file );\n$file_show = array_search( $file, array_filter( $allowed_files ) );\nif ( $description != $file_show )\n\t$description .= ' <span>(' . $file_show . ')</span>';\n?>\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<div class=\"fileedit-sub\">\n<div class=\"alignleft\">\n<h2><?php echo $theme->display( 'Name' ); if ( $description ) echo ': ' . $description; ?></h2>\n</div>\n<div class=\"alignright\">\n\t<form action=\"theme-editor.php\" method=\"post\">\n\t\t<strong><label for=\"theme\"><?php _e('Select theme to edit:'); ?> </label></strong>\n\t\t<select name=\"theme\" id=\"theme\">\n<?php\nforeach ( wp_get_themes( array( 'errors' => null ) ) as $a_stylesheet => $a_theme ) {\n\tif ( $a_theme->errors() && 'theme_no_stylesheet' == $a_theme->errors()->get_error_code() )\n\t\tcontinue;\n\n\t$selected = $a_stylesheet == $stylesheet ? ' selected=\"selected\"' : '';\n\techo \"\\n\\t\" . '<option value=\"' . esc_attr( $a_stylesheet ) . '\"' . $selected . '>' . $a_theme->display('Name') . '</option>';\n}\n?>\n\t\t</select>\n\t\t<?php submit_button( __( 'Select' ), 'button', 'Submit', false ); ?>\n\t</form>\n</div>\n<br class=\"clear\" />\n</div>\n<?php\nif ( $theme->errors() )\n\techo '<div class=\"error\"><p><strong>' . __( 'This theme is broken.' ) . '</strong> ' . $theme->errors()->get_error_message() . '</p></div>';\n?>\n\t<div id=\"templateside\">\n<?php\nif ( $allowed_files ) :\n\t$previous_file_type = '';\n\n\tforeach ( $allowed_files as $filename => $absolute_filename ) :\n\t\t$file_type = substr( $filename, strrpos( $filename, '.' ) );\n\n\t\tif ( $file_type !== $previous_file_type ) {\n\t\t\tif ( '' !== $previous_file_type ) {\n\t\t\t\techo \"\\t</ul>\\n\";\n\t\t\t}\n\n\t\t\tswitch ( $file_type ) {\n\t\t\t\tcase '.php':\n\t\t\t\t\tif ( $has_templates || $theme->parent() ) :\n\t\t\t\t\t\techo \"\\t<h2>\" . __( 'Templates' ) . \"</h2>\\n\";\n\t\t\t\t\t\tif ( $theme->parent() ) {\n\t\t\t\t\t\t\techo '<p class=\"howto\">' . sprintf( __( 'This child theme inherits templates from a parent theme, %s.' ),\n\t\t\t\t\t\t\t\tsprintf( '<a href=\"%s\">%s</a>',\n\t\t\t\t\t\t\t\t\tself_admin_url( 'theme-editor.php?theme=' . urlencode( $theme->get_template() ) ),\n\t\t\t\t\t\t\t\t\t$theme->parent()->display( 'Name' )\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) . \"</p>\\n\";\n\t\t\t\t\t\t}\n\t\t\t\t\tendif;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '.css':\n\t\t\t\t\techo \"\\t<h2>\" . _x( 'Styles', 'Theme stylesheets in theme editor' ) . \"</h2>\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t/* translators: %s: file extension */\n\t\t\t\t\techo \"\\t<h2>\" . sprintf( __( '%s files' ), $file_type ) . \"</h2>\\n\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\techo \"\\t<ul>\\n\";\n\t\t}\n\t\t\n\t\t$file_description = get_file_description( $filename );\n\t\tif ( $filename !== basename( $absolute_filename ) || $file_description !== $filename ) {\n\t\t\t$file_description .= '<br /><span class=\"nonessential\">(' . $filename . ')</span>';\n\t\t}\n\n\t\tif ( $absolute_filename === $file ) {\n\t\t\t$file_description = '<span class=\"highlight\">' . $file_description . '</span>';\n\t\t}\n\n\t\t$previous_file_type = $file_type;\n?>\n\t\t<li><a href=\"theme-editor.php?file=<?php echo urlencode( $filename ) ?>&amp;theme=<?php echo urlencode( $stylesheet ) ?>\"><?php echo $file_description; ?></a></li>\n<?php\n\tendforeach;\n?>\n</ul>\n<?php endif; ?>\n</div>\n<?php if ( $error ) :\n\techo '<div class=\"error\"><p>' . __('Oops, no such file exists! Double check the name and try again, merci.') . '</p></div>';\nelse : ?>\n\t<form name=\"template\" id=\"template\" action=\"theme-editor.php\" method=\"post\">\n\t<?php wp_nonce_field( 'edit-theme_' . $file . $stylesheet ); ?>\n\t\t<div><textarea cols=\"70\" rows=\"30\" name=\"newcontent\" id=\"newcontent\" aria-describedby=\"newcontent-description\"><?php echo $content; ?></textarea>\n\t\t<input type=\"hidden\" name=\"action\" value=\"update\" />\n\t\t<input type=\"hidden\" name=\"file\" value=\"<?php echo esc_attr( $relative_file ); ?>\" />\n\t\t<input type=\"hidden\" name=\"theme\" value=\"<?php echo esc_attr( $theme->get_stylesheet() ); ?>\" />\n\t\t<input type=\"hidden\" name=\"scrollto\" id=\"scrollto\" value=\"<?php echo $scrollto; ?>\" />\n\t\t</div>\n\t<?php if ( ! empty( $functions ) ) : ?>\n\t\t<div id=\"documentation\" class=\"hide-if-no-js\">\n\t\t<label for=\"docs-list\"><?php _e('Documentation:') ?></label>\n\t\t<?php echo $docs_select; ?>\n\t\t<input type=\"button\" class=\"button\" value=\" <?php esc_attr_e( 'Look Up' ); ?> \" onclick=\"if ( '' != jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_locale() ) ?>&amp;version=<?php echo urlencode( $wp_version ) ?>&amp;redirect=true'); }\" />\n\t\t</div>\n\t<?php endif; ?>\n\n\t\t<div>\n\t\t<?php if ( is_child_theme() && $theme->get_stylesheet() == get_template() ) : ?>\n\t\t\t<p><?php if ( is_writeable( $file ) ) { ?><strong><?php _e( 'Caution:' ); ?></strong><?php } ?>\n\t\t\t<?php _e( 'This is a file in your current parent theme.' ); ?></p>\n\t\t<?php endif; ?>\n<?php\n\tif ( is_writeable( $file ) ) :\n\t\tsubmit_button( __( 'Update File' ), 'primary', 'submit', true );\n\telse : ?>\n<p><em><?php _e('You need to make this file writable before you can save your changes. See <a href=\"https://codex.wordpress.org/Changing_File_Permissions\">the Codex</a> for more information.'); ?></em></p>\n<?php endif; ?>\n\t\t</div>\n\t</form>\n<?php\nendif; // $error\n?>\n<br class=\"clear\" />\n</div>\n<script type=\"text/javascript\">\njQuery(document).ready(function($){\n\t$('#template').submit(function(){ $('#scrollto').val( $('#newcontent').scrollTop() ); });\n\t$('#newcontent').scrollTop( $('#scrollto').val() );\n});\n</script>\n<?php\nbreak;\n}\n\ninclude(ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/theme-install.php",
    "content": "<?php\n/**\n * Install theme administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\nrequire( ABSPATH . 'wp-admin/includes/theme-install.php' );\n\nwp_reset_vars( array( 'tab' ) );\n\nif ( ! current_user_can('install_themes') )\n\twp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );\n\nif ( is_multisite() && ! is_network_admin() ) {\n\twp_redirect( network_admin_url( 'theme-install.php' ) );\n\texit();\n}\n\n$title = __( 'Add Themes' );\n$parent_file = 'themes.php';\n\nif ( ! is_network_admin() ) {\n\t$submenu_file = 'themes.php';\n}\n\n$installed_themes = search_theme_directories();\nforeach ( $installed_themes as $k => $v ) {\n\tif ( false !== strpos( $k, '/' ) ) {\n\t\tunset( $installed_themes[ $k ] );\n\t}\n}\n\nwp_localize_script( 'theme', '_wpThemeSettings', array(\n\t'themes'   => false,\n\t'settings' => array(\n\t\t'isInstall'     => true,\n\t\t'canInstall'    => current_user_can( 'install_themes' ),\n\t\t'installURI'    => current_user_can( 'install_themes' ) ? self_admin_url( 'theme-install.php' ) : null,\n\t\t'adminUrl'      => parse_url( self_admin_url(), PHP_URL_PATH )\n\t),\n\t'l10n' => array(\n\t\t'addNew' => __( 'Add New Theme' ),\n\t\t'search' => __( 'Search Themes' ),\n\t\t'searchPlaceholder' => __( 'Search themes...' ), // placeholder (no ellipsis)\n\t\t'upload' => __( 'Upload Theme' ),\n\t\t'back'   => __( 'Back' ),\n\t\t'error'  => __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ),\n\t\t'themesFound'   => __( 'Number of Themes found: %d' ),\n\t\t'noThemesFound' => __( 'No themes found. Try a different search.' ),\n\t\t'collapseSidebar'    => __( 'Collapse Sidebar' ),\n\t\t'expandSidebar'      => __( 'Expand Sidebar' ),\n\t),\n\t'installedThemes' => array_keys( $installed_themes ),\n) );\n\nwp_enqueue_script( 'theme' );\n\nif ( $tab ) {\n\t/**\n\t * Fires before each of the tabs are rendered on the Install Themes page.\n\t *\n\t * The dynamic portion of the hook name, `$tab`, refers to the current\n\t * theme install tab. Possible values are 'dashboard', 'search', 'upload',\n\t * 'featured', 'new', or 'updated'.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( \"install_themes_pre_{$tab}\" );\n}\n\n$help_overview =\n\t'<p>' . sprintf(__('You can find additional themes for your site by using the Theme Browser/Installer on this screen, which will display themes from the <a href=\"%s\" target=\"_blank\">WordPress.org Theme Directory</a>. These themes are designed and developed by third parties, are available free of charge, and are compatible with the license WordPress uses.'), 'https://wordpress.org/themes/') . '</p>' .\n\t'<p>' . __( 'You can Search for themes by keyword, author, or tag, or can get more specific and search by criteria listed in the feature filter.' ) . ' <span id=\"live-search-desc\">' . __( 'The search results will be updated as you type.' ) . '</span></p>' .\n\t'<p>' . __( 'Alternately, you can browse the themes that are Featured, Popular, or Latest. When you find a theme you like, you can preview it or install it.' ) . '</p>' .\n\t'<p>' . __('You can Upload a theme manually if you have already downloaded its ZIP archive onto your computer (make sure it is from a trusted and original source). You can also do it the old-fashioned way and copy a downloaded theme&#8217;s folder via FTP into your <code>/wp-content/themes</code> directory.') . '</p>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => $help_overview\n) );\n\n$help_installing =\n\t'<p>' . __('Once you have generated a list of themes, you can preview and install any of them. Click on the thumbnail of the theme you&#8217;re interested in previewing. It will open up in a full-screen Preview page to give you a better idea of how that theme will look.') . '</p>' .\n\t'<p>' . __('To install the theme so you can preview it with your site&#8217;s content and customize its theme options, click the \"Install\" button at the top of the left-hand pane. The theme files will be downloaded to your website automatically. When this is complete, the theme is now available for activation, which you can do by clicking the \"Activate\" link, or by navigating to your Manage Themes screen and clicking the \"Live Preview\" link under any installed theme&#8217;s thumbnail image.') . '</p>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'installing',\n\t'title'   => __('Previewing and Installing'),\n\t'content' => $help_installing\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Using_Themes#Adding_New_Themes\" target=\"_blank\">Documentation on Adding New Themes</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\ninclude(ABSPATH . 'wp-admin/admin-header.php');\n\n?>\n<div class=\"wrap\">\n\t<h1><?php\n\techo esc_html( $title );\n\n\t/**\n\t * Filter the tabs shown on the Add Themes screen.\n\t *\n\t * This filter is for backwards compatibility only, for the suppression\n\t * of the upload tab.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $tabs The tabs shown on the Add Themes screen. Default is 'upload'.\n\t */\n\t$tabs = apply_filters( 'install_themes_tabs', array( 'upload' => __( 'Upload Theme' ) ) );\n\tif ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_themes' ) ) {\n\t\techo ' <a href=\"#\" class=\"upload page-title-action\">' . __( 'Upload Theme' ) . '</a>';\n\t\techo ' <a href=\"#\" class=\"browse-themes page-title-action\">' . _x( 'Browse', 'themes' ) . '</a>';\n\t}\n\t?></h1>\n\n\t<div class=\"upload-theme\">\n\t<?php install_themes_upload(); ?>\n\t</div>\n\n\t<h2 class=\"screen-reader-text\"><?php _e( 'Filter themes list' ); ?></h2>\n\n\t<div class=\"wp-filter\">\n\t\t<div class=\"filter-count\">\n\t\t\t<span class=\"count theme-count\"></span>\n\t\t</div>\n\n\t\t<ul class=\"filter-links\">\n\t\t\t<li><a href=\"#\" data-sort=\"featured\"><?php _ex( 'Featured', 'themes' ); ?></a></li>\n\t\t\t<li><a href=\"#\" data-sort=\"popular\"><?php _ex( 'Popular', 'themes' ); ?></a></li>\n\t\t\t<li><a href=\"#\" data-sort=\"new\"><?php _ex( 'Latest', 'themes' ); ?></a></li>\n\t\t\t<li><a href=\"#\" data-sort=\"favorites\"><?php _ex( 'Favorites', 'themes' ); ?></a></li>\n\t\t</ul>\n\n\t\t<a class=\"drawer-toggle\" href=\"#\"><?php _e( 'Feature Filter' ); ?></a>\n\n\t\t<div class=\"search-form\"></div>\n\n\t\t<div class=\"favorites-form\">\n\t\t\t<?php\n\t\t\t$user = isset( $_GET['user'] ) ? wp_unslash( $_GET['user'] ) : get_user_option( 'wporg_favorites' );\n\t\t\tupdate_user_meta( get_current_user_id(), 'wporg_favorites', $user );\n\t\t\t?>\n\t\t\t<p class=\"install-help\"><?php _e( 'If you have marked themes as favorites on WordPress.org, you can browse them here.' ); ?></p>\n\n\t\t\t<p>\n\t\t\t\t<label for=\"user\"><?php _e( 'Your WordPress.org username:' ); ?></label>\n\t\t\t\t<input type=\"search\" id=\"wporg-username-input\" value=\"<?php echo esc_attr( $user ); ?>\" />\n\t\t\t\t<input type=\"button\" class=\"button button-secondary favorites-form-submit\" value=\"<?php esc_attr_e( 'Get Favorites' ); ?>\" />\n\t\t\t</p>\n\t\t</div>\n\n\t\t<div class=\"filter-drawer\">\n\t\t\t<div class=\"buttons\">\n\t\t\t\t<a class=\"apply-filters button button-secondary\" href=\"#\"><?php _e( 'Apply Filters' ); ?><span></span></a>\n\t\t\t\t<a class=\"clear-filters button button-secondary\" href=\"#\"><?php _e( 'Clear' ); ?></a>\n\t\t\t</div>\n\t\t<?php\n\t\t$feature_list = get_theme_feature_list();\n\t\tforeach ( $feature_list as $feature_name => $features ) {\n\t\t\techo '<fieldset class=\"filter-group\">';\n\t\t\t$feature_name = esc_html( $feature_name );\n\t\t\techo '<legend>' . $feature_name . '</legend>';\n\t\t\techo '<div class=\"filter-group-feature\">';\n\t\t\tforeach ( $features as $feature => $feature_name ) {\n\t\t\t\t$feature = esc_attr( $feature );\n\t\t\t\techo '<input type=\"checkbox\" id=\"filter-id-' . $feature . '\" value=\"' . $feature . '\" /> ';\n\t\t\t\techo '<label for=\"filter-id-' . $feature . '\">' . $feature_name . '</label><br>';\n\t\t\t}\n\t\t\techo '</div>';\n\t\t\techo '</fieldset>';\n\t\t}\n\t\t?>\n\t\t\t<div class=\"filtered-by\">\n\t\t\t\t<span><?php _e( 'Filtering by:' ); ?></span>\n\t\t\t\t<div class=\"tags\"></div>\n\t\t\t\t<a href=\"#\"><?php _e( 'Edit' ); ?></a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<h2 class=\"screen-reader-text\"><?php _e( 'Themes list' ); ?></h2>\n\t<div class=\"theme-browser content-filterable\"></div>\n\t<div class=\"theme-install-overlay wp-full-overlay expanded\"></div>\n\n\t<p class=\"no-themes\"><?php _e( 'No themes found. Try a different search.' ); ?></p>\n\t<span class=\"spinner\"></span>\n\n\t<br class=\"clear\" />\n<?php\nif ( $tab ) {\n\t/**\n\t * Fires at the top of each of the tabs on the Install Themes page.\n\t *\n\t * The dynamic portion of the hook name, `$tab`, refers to the current\n\t * theme install tab. Possible values are 'dashboard', 'search', 'upload',\n\t * 'featured', 'new', or 'updated'.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param int $paged Number of the current page of results being viewed.\n\t */\n\tdo_action( \"install_themes_{$tab}\", $paged );\n}\n?>\n</div>\n\n<script id=\"tmpl-theme\" type=\"text/template\">\n\t<# if ( data.screenshot_url ) { #>\n\t\t<div class=\"theme-screenshot\">\n\t\t\t<img src=\"{{ data.screenshot_url }}\" alt=\"\" />\n\t\t</div>\n\t<# } else { #>\n\t\t<div class=\"theme-screenshot blank\"></div>\n\t<# } #>\n\t<span class=\"more-details\"><?php _ex( 'Details &amp; Preview', 'theme' ); ?></span>\n\t<div class=\"theme-author\"><?php printf( __( 'By %s' ), '{{ data.author }}' ); ?></div>\n\t<h3 class=\"theme-name\">{{ data.name }}</h3>\n\n\t<div class=\"theme-actions\">\n\t\t<a class=\"button button-primary\" href=\"{{ data.install_url }}\"><?php esc_html_e( 'Install' ); ?></a>\n\t\t<a class=\"button button-secondary preview install-theme-preview\" href=\"#\"><?php esc_html_e( 'Preview' ); ?></a>\n\t</div>\n\n\t<# if ( data.installed ) { #>\n\t\t<div class=\"theme-installed\"><?php _ex( 'Already Installed', 'theme' ); ?></div>\n\t<# } #>\n</script>\n\n<script id=\"tmpl-theme-preview\" type=\"text/template\">\n\t<div class=\"wp-full-overlay-sidebar\">\n\t\t<div class=\"wp-full-overlay-header\">\n\t\t\t<a href=\"#\" class=\"close-full-overlay\"><span class=\"screen-reader-text\"><?php _e( 'Close' ); ?></span></a>\n\t\t\t<a href=\"#\" class=\"previous-theme\"><span class=\"screen-reader-text\"><?php _ex( 'Previous', 'Button label for a theme' ); ?></span></a>\n\t\t\t<a href=\"#\" class=\"next-theme\"><span class=\"screen-reader-text\"><?php _ex( 'Next', 'Button label for a theme' ); ?></span></a>\n\t\t<# if ( data.installed ) { #>\n\t\t\t<a href=\"#\" class=\"button button-primary theme-install disabled\"><?php _ex( 'Installed', 'theme' ); ?></a>\n\t\t<# } else { #>\n\t\t\t<a href=\"{{ data.install_url }}\" class=\"button button-primary theme-install\"><?php _e( 'Install' ); ?></a>\n\t\t<# } #>\n\t\t</div>\n\t\t<div class=\"wp-full-overlay-sidebar-content\">\n\t\t\t<div class=\"install-theme-info\">\n\t\t\t\t<h3 class=\"theme-name\">{{ data.name }}</h3>\n\t\t\t\t<span class=\"theme-by\"><?php printf( __( 'By %s' ), '{{ data.author }}' ); ?></span>\n\n\t\t\t\t<img class=\"theme-screenshot\" src=\"{{ data.screenshot_url }}\" alt=\"\" />\n\n\t\t\t\t<div class=\"theme-details\">\n\t\t\t\t\t<# if ( data.rating ) { #>\n\t\t\t\t\t\t<div class=\"theme-rating\">\n\t\t\t\t\t\t\t{{{ data.stars }}}\n\t\t\t\t\t\t\t<span class=\"num-ratings\">({{ data.num_ratings }})</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t<span class=\"no-rating\"><?php _e( 'This theme has not been rated yet.' ); ?></span>\n\t\t\t\t\t<# } #>\n\t\t\t\t\t<div class=\"theme-version\"><?php printf( __( 'Version: %s' ), '{{ data.version }}' ); ?></div>\n\t\t\t\t\t<div class=\"theme-description\">{{{ data.description }}}</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"wp-full-overlay-footer\">\n\t\t\t<button type=\"button\" class=\"collapse-sidebar button-secondary\" aria-expanded=\"true\" aria-label=\"<?php esc_attr_e( 'Collapse Sidebar' ); ?>\">\n\t\t\t\t<span class=\"collapse-sidebar-arrow\"></span>\n\t\t\t\t<span class=\"collapse-sidebar-label\"><?php _e( 'Collapse' ); ?></span>\n\t\t\t</button>\n\t\t</div>\n\t</div>\n\t<div class=\"wp-full-overlay-main\">\n\t\t<iframe src=\"{{ data.preview_url }}\" title=\"<?php esc_attr_e( 'Preview' ); ?>\" />\n\t</div>\n</script>\n\n<?php\ninclude(ABSPATH . 'wp-admin/admin-footer.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/themes.php",
    "content": "<?php\n/**\n * Themes administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'switch_themes' ) && ! current_user_can( 'edit_theme_options' ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to edit theme options on this site.' ) . '</p>',\n\t\t403\n\t);\n}\n\nif ( current_user_can( 'switch_themes' ) && isset($_GET['action'] ) ) {\n\tif ( 'activate' == $_GET['action'] ) {\n\t\tcheck_admin_referer('switch-theme_' . $_GET['stylesheet']);\n\t\t$theme = wp_get_theme( $_GET['stylesheet'] );\n\n\t\tif ( ! $theme->exists() || ! $theme->is_allowed() ) {\n\t\t\twp_die(\n\t\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t\t'<p>' . __( 'The requested theme does not exist.' ) . '</p>',\n\t\t\t\t403\n\t\t\t);\n\t\t}\n\n\t\tswitch_theme( $theme->get_stylesheet() );\n\t\twp_redirect( admin_url('themes.php?activated=true') );\n\t\texit;\n\t} elseif ( 'delete' == $_GET['action'] ) {\n\t\tcheck_admin_referer('delete-theme_' . $_GET['stylesheet']);\n\t\t$theme = wp_get_theme( $_GET['stylesheet'] );\n\n\t\tif ( ! current_user_can( 'delete_themes' ) ) {\n\t\t\twp_die(\n\t\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t\t'<p>' . __( 'You are not allowed to delete this item.' ) . '</p>',\n\t\t\t\t403\n\t\t\t);\n\t\t}\n\n\t\tif ( ! $theme->exists() ) {\n\t\t\twp_die(\n\t\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t\t'<p>' . __( 'The requested theme does not exist.' ) . '</p>',\n\t\t\t\t403\n\t\t\t);\n\t\t}\n\n\t\t$active = wp_get_theme();\n\t\tif ( $active->get( 'Template' ) == $_GET['stylesheet'] ) {\n\t\t\twp_redirect( admin_url( 'themes.php?delete-active-child=true' ) );\n\t\t} else {\n\t\t\tdelete_theme( $_GET['stylesheet'] );\n\t\t\twp_redirect( admin_url( 'themes.php?deleted=true' ) );\n\t\t}\n\t\texit;\n\t}\n}\n\n$title = __('Manage Themes');\n$parent_file = 'themes.php';\n\n// Help tab: Overview\nif ( current_user_can( 'switch_themes' ) ) {\n\t$help_overview  = '<p>' . __( 'This screen is used for managing your installed themes. Aside from the default theme(s) included with your WordPress installation, themes are designed and developed by third parties.' ) . '</p>' .\n\t\t'<p>' . __( 'From this screen you can:' ) . '</p>' .\n\t\t'<ul><li>' . __( 'Hover or tap to see Activate and Live Preview buttons' ) . '</li>' .\n\t\t'<li>' . __( 'Click on the theme to see the theme name, version, author, description, tags, and the Delete link' ) . '</li>' .\n\t\t'<li>' . __( 'Click Customize for the current theme or Live Preview for any other theme to see a live preview' ) . '</li></ul>' .\n\t\t'<p>' . __( 'The current theme is displayed highlighted as the first theme.' ) . '</p>' .\n\t\t'<p>' . __( 'The search for installed themes will search for terms in their name, description, author, or tag.' ) . ' <span id=\"live-search-desc\">' . __( 'The search results will be updated as you type.' ) . '</span></p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'overview',\n\t\t'title'   => __( 'Overview' ),\n\t\t'content' => $help_overview\n\t) );\n} // switch_themes\n\n// Help tab: Adding Themes\nif ( current_user_can( 'install_themes' ) ) {\n\tif ( is_multisite() ) {\n\t\t$help_install = '<p>' . __('Installing themes on Multisite can only be done from the Network Admin section.') . '</p>';\n\t} else {\n\t\t$help_install = '<p>' . sprintf( __('If you would like to see more themes to choose from, click on the &#8220;Add New&#8221; button and you will be able to browse or search for additional themes from the <a href=\"%s\" target=\"_blank\">WordPress.org Theme Directory</a>. Themes in the WordPress.org Theme Directory are designed and developed by third parties, and are compatible with the license WordPress uses. Oh, and they&#8217;re free!'), 'https://wordpress.org/themes/' ) . '</p>';\n\t}\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'adding-themes',\n\t\t'title'   => __('Adding Themes'),\n\t\t'content' => $help_install\n\t) );\n} // install_themes\n\n// Help tab: Previewing and Customizing\nif ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {\n\t$help_customize =\n\t\t'<p>' . __( 'Tap or hover on any theme then click the Live Preview button to see a live preview of that theme and change theme options in a separate, full-screen view. You can also find a Live Preview button at the bottom of the theme details screen. Any installed theme can be previewed and customized in this way.' ) . '</p>'.\n\t\t'<p>' . __( 'The theme being previewed is fully interactive &mdash; navigate to different pages to see how the theme handles posts, archives, and other page templates. The settings may differ depending on what theme features the theme being previewed supports. To accept the new settings and activate the theme all in one step, click the Save &amp; Activate button above the menu.' ) . '</p>' .\n\t\t'<p>' . __( 'When previewing on smaller monitors, you can use the collapse icon at the bottom of the left-hand pane. This will hide the pane, giving you more room to preview your site in the new theme. To bring the pane back, click on the collapse icon again.' ) . '</p>';\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'\t\t=> 'customize-preview-themes',\n\t\t'title'\t\t=> __( 'Previewing and Customizing' ),\n\t\t'content'\t=> $help_customize\n\t) );\n} // edit_theme_options && customize\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Using_Themes\" target=\"_blank\">Documentation on Using Themes</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n);\n\nif ( current_user_can( 'switch_themes' ) ) {\n\t$themes = wp_prepare_themes_for_js();\n} else {\n\t$themes = wp_prepare_themes_for_js( array( wp_get_theme() ) );\n}\nwp_reset_vars( array( 'theme', 'search' ) );\n\nwp_localize_script( 'theme', '_wpThemeSettings', array(\n\t'themes'   => $themes,\n\t'settings' => array(\n\t\t'canInstall'    => ( ! is_multisite() && current_user_can( 'install_themes' ) ),\n\t\t'installURI'    => ( ! is_multisite() && current_user_can( 'install_themes' ) ) ? admin_url( 'theme-install.php' ) : null,\n\t\t'confirmDelete' => __( \"Are you sure you want to delete this theme?\\n\\nClick 'Cancel' to go back, 'OK' to confirm the delete.\" ),\n\t\t'adminUrl'      => parse_url( admin_url(), PHP_URL_PATH ),\n\t),\n \t'l10n' => array(\n \t\t'addNew'            => __( 'Add New Theme' ),\n \t\t'search'            => __( 'Search Installed Themes' ),\n \t\t'searchPlaceholder' => __( 'Search installed themes...' ), // placeholder (no ellipsis)\n\t\t'themesFound'       => __( 'Number of Themes found: %d' ),\n\t\t'noThemesFound'     => __( 'No themes found. Try a different search.' ),\n  \t),\n) );\n\nadd_thickbox();\nwp_enqueue_script( 'theme' );\nwp_enqueue_script( 'customize-loader' );\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n\t<h1><?php esc_html_e( 'Themes' ); ?>\n\t\t<span class=\"title-count theme-count\"><?php echo count( $themes ); ?></span>\n\t<?php if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?>\n\t\t<a href=\"<?php echo admin_url( 'theme-install.php' ); ?>\" class=\"hide-if-no-js page-title-action\"><?php echo esc_html_x( 'Add New', 'Add new theme' ); ?></a>\n\t<?php endif; ?>\n\t</h1>\n<?php\nif ( ! validate_current_theme() || isset( $_GET['broken'] ) ) : ?>\n<div id=\"message1\" class=\"updated notice is-dismissible\"><p><?php _e('The active theme is broken. Reverting to the default theme.'); ?></p></div>\n<?php elseif ( isset($_GET['activated']) ) :\n\t\tif ( isset( $_GET['previewed'] ) ) { ?>\n\t\t<div id=\"message2\" class=\"updated notice is-dismissible\"><p><?php printf( __( 'Settings saved and theme activated. <a href=\"%s\">Visit site</a>' ), home_url( '/' ) ); ?></p></div>\n\t\t<?php } else { ?>\n<div id=\"message2\" class=\"updated notice is-dismissible\"><p><?php printf( __( 'New theme activated. <a href=\"%s\">Visit site</a>' ), home_url( '/' ) ); ?></p></div><?php\n\t\t}\n\telseif ( isset($_GET['deleted']) ) : ?>\n<div id=\"message3\" class=\"updated notice is-dismissible\"><p><?php _e('Theme deleted.') ?></p></div>\n<?php elseif ( isset( $_GET['delete-active-child'] ) ) : ?>\n\t<div id=\"message4\" class=\"error\"><p><?php _e( 'You cannot delete a theme while it has an active child theme.' ); ?></p></div>\n<?php\nendif;\n\n$ct = wp_get_theme();\n\nif ( $ct->errors() && ( ! is_multisite() || current_user_can( 'manage_network_themes' ) ) ) {\n\techo '<div class=\"error\"><p>' . sprintf( __( 'ERROR: %s' ), $ct->errors()->get_error_message() ) . '</p></div>';\n}\n\n/*\n// Certain error codes are less fatal than others. We can still display theme information in most cases.\nif ( ! $ct->errors() || ( 1 == count( $ct->errors()->get_error_codes() )\n\t&& in_array( $ct->errors()->get_error_code(), array( 'theme_no_parent', 'theme_parent_invalid', 'theme_no_index' ) ) ) ) : ?>\n*/\n\n\t// Pretend you didn't see this.\n\t$current_theme_actions = array();\n\tif ( is_array( $submenu ) && isset( $submenu['themes.php'] ) ) {\n\t\tforeach ( (array) $submenu['themes.php'] as $item) {\n\t\t\t$class = '';\n\t\t\tif ( 'themes.php' == $item[2] || 'theme-editor.php' == $item[2] || 0 === strpos( $item[2], 'customize.php' ) )\n\t\t\t\tcontinue;\n\t\t\t// 0 = name, 1 = capability, 2 = file\n\t\t\tif ( ( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file)) )\n\t\t\t\t$class = ' current';\n\t\t\tif ( !empty($submenu[$item[2]]) ) {\n\t\t\t\t$submenu[$item[2]] = array_values($submenu[$item[2]]); // Re-index.\n\t\t\t\t$menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]);\n\t\t\t\tif ( file_exists(WP_PLUGIN_DIR . \"/{$submenu[$item[2]][0][2]}\") || !empty($menu_hook))\n\t\t\t\t\t$current_theme_actions[] = \"<a class='button button-secondary$class' href='admin.php?page={$submenu[$item[2]][0][2]}'>{$item[0]}</a>\";\n\t\t\t\telse\n\t\t\t\t\t$current_theme_actions[] = \"<a class='button button-secondary$class' href='{$submenu[$item[2]][0][2]}'>{$item[0]}</a>\";\n\t\t\t} elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) {\n\t\t\t\t$menu_file = $item[2];\n\n\t\t\t\tif ( current_user_can( 'customize' ) ) {\n\t\t\t\t\tif ( 'custom-header' === $menu_file ) {\n\t\t\t\t\t\t$current_theme_actions[] = \"<a class='button button-secondary hide-if-no-customize$class' href='customize.php?autofocus[control]=header_image'>{$item[0]}</a>\";\n\t\t\t\t\t} elseif ( 'custom-background' === $menu_file ) {\n\t\t\t\t\t\t$current_theme_actions[] = \"<a class='button button-secondary hide-if-no-customize$class' href='customize.php?autofocus[control]=background_image'>{$item[0]}</a>\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) {\n\t\t\t\t\t$menu_file = substr( $menu_file, 0, $pos );\n\t\t\t\t}\n\n\t\t\t\tif ( file_exists( ABSPATH . \"wp-admin/$menu_file\" ) ) {\n\t\t\t\t\t$current_theme_actions[] = \"<a class='button button-secondary$class' href='{$item[2]}'>{$item[0]}</a>\";\n\t\t\t\t} else {\n\t\t\t\t\t$current_theme_actions[] = \"<a class='button button-secondary$class' href='themes.php?page={$item[2]}'>{$item[0]}</a>\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n?>\n\n<div class=\"theme-browser\">\n\t<div class=\"themes\">\n\n<?php\n/*\n * This PHP is synchronized with the tmpl-theme template below!\n */\n\nforeach ( $themes as $theme ) :\n\t$aria_action = esc_attr( $theme['id'] . '-action' );\n\t$aria_name   = esc_attr( $theme['id'] . '-name' );\n\t?>\n<div class=\"theme<?php if ( $theme['active'] ) echo ' active'; ?>\" tabindex=\"0\" aria-describedby=\"<?php echo $aria_action . ' ' . $aria_name; ?>\">\n\t<?php if ( ! empty( $theme['screenshot'][0] ) ) { ?>\n\t\t<div class=\"theme-screenshot\">\n\t\t\t<img src=\"<?php echo $theme['screenshot'][0]; ?>\" alt=\"\" />\n\t\t</div>\n\t<?php } else { ?>\n\t\t<div class=\"theme-screenshot blank\"></div>\n\t<?php } ?>\n\t<span class=\"more-details\" id=\"<?php echo $aria_action; ?>\"><?php _e( 'Theme Details' ); ?></span>\n\t<div class=\"theme-author\"><?php printf( __( 'By %s' ), $theme['author'] ); ?></div>\n\n\t<?php if ( $theme['active'] ) { ?>\n\t\t<h2 class=\"theme-name\" id=\"<?php echo $aria_name; ?>\">\n\t\t\t<?php\n\t\t\t/* translators: %s: theme name */\n\t\t\tprintf( __( '<span>Active:</span> %s' ), $theme['name'] );\n\t\t\t?>\n\t\t</h2>\n\t<?php } else { ?>\n\t\t<h2 class=\"theme-name\" id=\"<?php echo $aria_name; ?>\"><?php echo $theme['name']; ?></h2>\n\t<?php } ?>\n\n\t<div class=\"theme-actions\">\n\n\t<?php if ( $theme['active'] ) { ?>\n\t\t<?php if ( $theme['actions']['customize'] && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { ?>\n\t\t\t<a class=\"button button-primary customize load-customize hide-if-no-customize\" href=\"<?php echo $theme['actions']['customize']; ?>\"><?php _e( 'Customize' ); ?></a>\n\t\t<?php } ?>\n\t<?php } else { ?>\n\t\t<a class=\"button button-secondary activate\" href=\"<?php echo $theme['actions']['activate']; ?>\"><?php _e( 'Activate' ); ?></a>\n\t\t<?php if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { ?>\n\t\t\t<a class=\"button button-primary load-customize hide-if-no-customize\" href=\"<?php echo $theme['actions']['customize']; ?>\"><?php _e( 'Live Preview' ); ?></a>\n\t\t<?php } ?>\n\t<?php } ?>\n\n\t</div>\n\n\t<?php if ( $theme['hasUpdate'] ) { ?>\n\t\t<div class=\"theme-update\"><?php _e( 'Update Available' ); ?></div>\n\t<?php } ?>\n</div>\n<?php endforeach; ?>\n\t<br class=\"clear\" />\n\t</div>\n</div>\n<div class=\"theme-overlay\"></div>\n\n<p class=\"no-themes\"><?php _e( 'No themes found. Try a different search.' ); ?></p>\n\n<?php\n// List broken themes, if any.\nif ( ! is_multisite() && current_user_can('edit_themes') && $broken_themes = wp_get_themes( array( 'errors' => true ) ) ) {\n?>\n\n<div class=\"broken-themes\">\n<h3><?php _e('Broken Themes'); ?></h3>\n<p><?php _e('The following themes are installed but incomplete. Themes must have a stylesheet and a template.'); ?></p>\n\n<?php\n$can_delete = current_user_can( 'delete_themes' );\n$can_install = current_user_can( 'install_themes' );\n?>\n<table>\n\t<tr>\n\t\t<th><?php _ex('Name', 'theme name'); ?></th>\n\t\t<th><?php _e('Description'); ?></th>\n\t\t<?php if ( $can_delete ) { ?>\n\t\t\t<td></td>\n\t\t<?php } ?>\n\t\t<?php if ( $can_install ) { ?>\n\t\t\t<td></td>\n\t\t<?php } ?>\n\t</tr>\n\t<?php foreach ( $broken_themes as $broken_theme ) : ?>\n\t\t<tr>\n\t\t\t<td><?php echo $broken_theme->get( 'Name' ) ? $broken_theme->display( 'Name' ) : $broken_theme->get_stylesheet(); ?></td>\n\t\t\t<td><?php echo $broken_theme->errors()->get_error_message(); ?></td>\n\t\t\t<?php\n\t\t\tif ( $can_delete ) {\n\t\t\t\t$stylesheet = $broken_theme->get_stylesheet();\n\t\t\t\t$delete_url = add_query_arg( array(\n\t\t\t\t\t'action'     => 'delete',\n\t\t\t\t\t'stylesheet' => urlencode( $stylesheet ),\n\t\t\t\t), admin_url( 'themes.php' ) );\n\t\t\t\t$delete_url = wp_nonce_url( $delete_url, 'delete-theme_' . $stylesheet );\n\t\t\t\t?>\n\t\t\t\t<td><a href=\"<?php echo esc_url( $delete_url ); ?>\" class=\"button button-secondary delete-theme\"><?php _e( 'Delete' ); ?></a></td>\n\t\t\t\t<?php\n\t\t\t}\n\n\t\t\tif ( $can_install && 'theme_no_parent' === $broken_theme->errors()->get_error_code() ) {\n\t\t\t\t$parent_theme_name = $broken_theme->get( 'Template' );\n\t\t\t\t$parent_theme = themes_api( 'theme_information', array( 'slug' => urlencode( $parent_theme_name ) ) );\n\n\t\t\t\tif ( ! is_wp_error( $parent_theme ) ) {\n\t\t\t\t\t$install_url = add_query_arg( array(\n\t\t\t\t\t\t'action' => 'install-theme',\n\t\t\t\t\t\t'theme'  => urlencode( $parent_theme_name ),\n\t\t\t\t\t), admin_url( 'update.php' ) );\n\t\t\t\t\t$install_url = wp_nonce_url( $install_url, 'install-theme_' . $parent_theme_name );\n\t\t\t\t\t?>\n\t\t\t\t\t<td><a href=\"<?php echo esc_url( $install_url ); ?>\" class=\"button button-secondary install-theme\"><?php _e( 'Install Parent Theme' ); ?></a></td>\n\t\t\t\t\t<?php\n\t\t\t\t}\n\t\t\t}\n\t\t\t?>\n\t\t</tr>\n\t<?php endforeach; ?>\n</table>\n</div>\n\n<?php\n}\n?>\n</div><!-- .wrap -->\n\n<?php\n/*\n * The tmpl-theme template is synchronized with PHP above!\n */\n?>\n<script id=\"tmpl-theme\" type=\"text/template\">\n\t<# if ( data.screenshot[0] ) { #>\n\t\t<div class=\"theme-screenshot\">\n\t\t\t<img src=\"{{ data.screenshot[0] }}\" alt=\"\" />\n\t\t</div>\n\t<# } else { #>\n\t\t<div class=\"theme-screenshot blank\"></div>\n\t<# } #>\n\t<span class=\"more-details\" id=\"{{ data.id }}-action\"><?php _e( 'Theme Details' ); ?></span>\n\t<div class=\"theme-author\"><?php printf( __( 'By %s' ), '{{{ data.author }}}' ); ?></div>\n\n\t<# if ( data.active ) { #>\n\t\t<h2 class=\"theme-name\" id=\"{{ data.id }}-name\">\n\t\t\t<?php\n\t\t\t/* translators: %s: theme name */\n\t\t\tprintf( __( '<span>Active:</span> %s' ), '{{{ data.name }}}' );\n\t\t\t?>\n\t\t</h2>\n\t<# } else { #>\n\t\t<h2 class=\"theme-name\" id=\"{{ data.id }}-name\">{{{ data.name }}}</h2>\n\t<# } #>\n\n\t<div class=\"theme-actions\">\n\n\t<# if ( data.active ) { #>\n\t\t<# if ( data.actions.customize ) { #>\n\t\t\t<a class=\"button button-primary customize load-customize hide-if-no-customize\" href=\"{{{ data.actions.customize }}}\"><?php _e( 'Customize' ); ?></a>\n\t\t<# } #>\n\t<# } else { #>\n\t\t<a class=\"button button-secondary activate\" href=\"{{{ data.actions.activate }}}\"><?php _e( 'Activate' ); ?></a>\n\t\t<a class=\"button button-primary load-customize hide-if-no-customize\" href=\"{{{ data.actions.customize }}}\"><?php _e( 'Live Preview' ); ?></a>\n\t<# } #>\n\n\t</div>\n\n\t<# if ( data.hasUpdate ) { #>\n\t\t<div class=\"theme-update\"><?php _e( 'Update Available' ); ?></div>\n\t<# } #>\n</script>\n\n<script id=\"tmpl-theme-single\" type=\"text/template\">\n\t<div class=\"theme-backdrop\"></div>\n\t<div class=\"theme-wrap\">\n\t\t<div class=\"theme-header\">\n\t\t\t<button class=\"left dashicons dashicons-no\"><span class=\"screen-reader-text\"><?php _e( 'Show previous theme' ); ?></span></button>\n\t\t\t<button class=\"right dashicons dashicons-no\"><span class=\"screen-reader-text\"><?php _e( 'Show next theme' ); ?></span></button>\n\t\t\t<button class=\"close dashicons dashicons-no\"><span class=\"screen-reader-text\"><?php _e( 'Close details dialog' ); ?></span></button>\n\t\t</div>\n\t\t<div class=\"theme-about\">\n\t\t\t<div class=\"theme-screenshots\">\n\t\t\t<# if ( data.screenshot[0] ) { #>\n\t\t\t\t<div class=\"screenshot\"><img src=\"{{ data.screenshot[0] }}\" alt=\"\" /></div>\n\t\t\t<# } else { #>\n\t\t\t\t<div class=\"screenshot blank\"></div>\n\t\t\t<# } #>\n\t\t\t</div>\n\n\t\t\t<div class=\"theme-info\">\n\t\t\t\t<# if ( data.active ) { #>\n\t\t\t\t\t<span class=\"current-label\"><?php _e( 'Current Theme' ); ?></span>\n\t\t\t\t<# } #>\n\t\t\t\t<h2 class=\"theme-name\">{{{ data.name }}}<span class=\"theme-version\"><?php printf( __( 'Version: %s' ), '{{ data.version }}' ); ?></span></h2>\n\t\t\t\t<p class=\"theme-author\"><?php printf( __( 'By %s' ), '{{{ data.authorAndUri }}}' ); ?></p>\n\n\t\t\t\t<# if ( data.hasUpdate ) { #>\n\t\t\t\t<div class=\"notice notice-warning notice-alt notice-large\">\n\t\t\t\t\t<h3 class=\"notice-title\"><?php _e( 'Update Available' ); ?></h3>\n\t\t\t\t\t{{{ data.update }}}\n\t\t\t\t</div>\n\t\t\t\t<# } #>\n\t\t\t\t<p class=\"theme-description\">{{{ data.description }}}</p>\n\n\t\t\t\t<# if ( data.parent ) { #>\n\t\t\t\t\t<p class=\"parent-theme\"><?php printf( __( 'This is a child theme of %s.' ), '<strong>{{{ data.parent }}}</strong>' ); ?></p>\n\t\t\t\t<# } #>\n\n\t\t\t\t<# if ( data.tags ) { #>\n\t\t\t\t\t<p class=\"theme-tags\"><span><?php _e( 'Tags:' ); ?></span> {{{ data.tags }}}</p>\n\t\t\t\t<# } #>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"theme-actions\">\n\t\t\t<div class=\"active-theme\">\n\t\t\t\t<a href=\"{{{ data.actions.customize }}}\" class=\"button button-primary customize load-customize hide-if-no-customize\"><?php _e( 'Customize' ); ?></a>\n\t\t\t\t<?php echo implode( ' ', $current_theme_actions ); ?>\n\t\t\t</div>\n\t\t\t<div class=\"inactive-theme\">\n\t\t\t\t<# if ( data.actions.activate ) { #>\n\t\t\t\t\t<a href=\"{{{ data.actions.activate }}}\" class=\"button button-secondary activate\"><?php _e( 'Activate' ); ?></a>\n\t\t\t\t<# } #>\n\t\t\t\t<a href=\"{{{ data.actions.customize }}}\" class=\"button button-primary load-customize hide-if-no-customize\"><?php _e( 'Live Preview' ); ?></a>\n\t\t\t</div>\n\n\t\t\t<# if ( ! data.active && data.actions['delete'] ) { #>\n\t\t\t\t<a href=\"{{{ data.actions['delete'] }}}\" class=\"button button-secondary delete-theme\"><?php _e( 'Delete' ); ?></a>\n\t\t\t<# } #>\n\t\t</div>\n\t</div>\n</script>\n\n<?php require( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/tools.php",
    "content": "<?php\n/**\n * Tools Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n$title = __('Tools');\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'press-this',\n\t'title'   => __('Press This'),\n\t'content' => '<p>' . __('Press This is a bookmarklet that makes it easy to blog about something you come across on the web. You can use it to just grab a link, or to post an excerpt. Press This will even allow you to choose from images included on the page and use them in your post. Just drag the Press This link on this screen to your bookmarks bar in your browser, and you&#8217;ll be on your way to easier content creation. Clicking on it while on another website opens a popup window with all these options.') . '</p>',\n) );\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'converter',\n\t'title'   => __('Categories and Tags Converter'),\n\t'content' => '<p>' . __('Categories have hierarchy, meaning that you can nest sub-categories. Tags do not have hierarchy and cannot be nested. Sometimes people start out using one on their posts, then later realize that the other would work better for their content.' ) . '</p>' .\n\t'<p>' . __( 'The Categories and Tags Converter link on this screen will take you to the Import screen, where that Converter is one of the plugins you can install. Once that plugin is installed, the Activate Plugin &amp; Run Importer link will take you to a screen where you can choose to convert tags into categories or vice versa.' ) . '</p>',\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Tools_Screen\" target=\"_blank\">Documentation on Tools</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\n?>\n<div class=\"wrap\">\n<h1><?php echo esc_html( $title ); ?></h1>\n\n<?php if ( current_user_can('edit_posts') ) : ?>\n<div class=\"card pressthis\">\n\t<h2><?php _e('Press This') ?></h2>\n\t<p><?php _e( 'Press This is a little tool that lets you grab bits of the web and create new posts with ease.' );?></p>\n\t<p><?php _e( 'Use Press This to clip text, images and videos from any web page. Then edit and add more straight from Press This before you save or publish it in a post on your site.' ); ?></p>\n\n\n\t<form>\n\t\t<h3><?php _e( 'Install Press This' ); ?></h3>\n\t\t<h4><?php _e( 'Bookmarklet' ); ?></h4>\n\t\t<p><?php _e( 'Drag the bookmarklet below to your bookmarks bar. Then, when you&#8217;re on a page you want to share, simply &#8220;press&#8221; it.' ); ?></p>\n\n\t\t<p class=\"pressthis-bookmarklet-wrapper\">\n\t\t\t<a class=\"pressthis-bookmarklet\" onclick=\"return false;\" href=\"<?php echo htmlspecialchars( get_shortcut_link() ); ?>\"><span><?php _e( 'Press This' ); ?></span></a>\n\t\t\t<button type=\"button\" class=\"button button-secondary pressthis-js-toggle js-show-pressthis-code-wrap\" aria-expanded=\"false\" aria-controls=\"pressthis-code-wrap\">\n\t\t\t\t<span class=\"dashicons dashicons-clipboard\"></span>\n\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Copy &#8220;Press This&#8221; bookmarklet code' ) ?></span>\n\t\t\t</button>\n\t\t</p>\n\n\t\t<div class=\"hidden js-pressthis-code-wrap clear\" id=\"pressthis-code-wrap\">\n\t\t\t<p id=\"pressthis-code-desc\">\n\t\t\t\t<?php _e( 'If you can&#8217;t drag the bookmarklet to your bookmarks, copy the following code and create a new bookmark. Paste the code into the new bookmark&#8217;s URL field.' ) ?>\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<textarea class=\"js-pressthis-code\" rows=\"5\" cols=\"120\" readonly=\"readonly\" aria-labelledby=\"pressthis-code-desc\"><?php echo htmlspecialchars( get_shortcut_link() ); ?></textarea>\n\t\t\t</p>\n\t\t</div>\n\n\t\t<h4><?php _e( 'Direct link (best for mobile)' ); ?></h4>\n\t\t<p><?php _e( 'Follow the link to open Press This. Then add it to your device&#8217;s bookmarks or home screen.' ); ?></p>\n\n\t\t<p>\n\t\t\t<a class=\"button button-secondary\" href=\"<?php echo htmlspecialchars( admin_url( 'press-this.php' ) ); ?>\"><?php _e( 'Open Press This' ) ?></a>\n\t\t</p>\n\t\t<script>\n\t\t\tjQuery( document ).ready( function( $ ) {\n\t\t\t\tvar $showPressThisWrap = $( '.js-show-pressthis-code-wrap' );\n\t\t\t\tvar $pressthisCode = $( '.js-pressthis-code' );\n\n\t\t\t\t$showPressThisWrap.on( 'click', function( event ) {\n\t\t\t\t\tvar $this = $( this );\n\n\t\t\t\t\t$this.parent().next( '.js-pressthis-code-wrap' ).slideToggle( 200 );\n\t\t\t\t\t$this.attr( 'aria-expanded', $this.attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' );\n\t\t\t\t});\n\n\t\t\t\t// Select Press This code when focusing (tabbing) or clicking the textarea.\n\t\t\t\t$pressthisCode.on( 'click focus', function() {\n\t\t\t\t\tvar self = this;\n\t\t\t\t\tsetTimeout( function() { self.select(); }, 50 );\n\t\t\t\t});\n\n\t\t\t});\n\t\t</script>\n\t</form>\n</div>\n<?php\nendif;\n\nif ( current_user_can( 'import' ) ) :\n$cats = get_taxonomy('category');\n$tags = get_taxonomy('post_tag');\nif ( current_user_can($cats->cap->manage_terms) || current_user_can($tags->cap->manage_terms) ) : ?>\n<div class=\"card\">\n\t<h2 class=\"title\"><?php _e( 'Categories and Tags Converter' ) ?></h2>\n\t<p><?php printf( __('If you want to convert your categories to tags (or vice versa), use the <a href=\"%s\">Categories and Tags Converter</a> available from the Import screen.'), 'import.php' ); ?></p>\n</div>\n<?php\nendif;\nendif;\n\n/**\n * Fires at the end of the Tools Administration screen.\n *\n * @since 2.8.0\n */\ndo_action( 'tool_box' );\n?>\n</div>\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/update-core.php",
    "content": "<?php\n/**\n * Update Core administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_enqueue_style( 'plugin-install' );\nwp_enqueue_script( 'plugin-install' );\nwp_enqueue_script( 'updates' );\nadd_thickbox();\n\nif ( is_multisite() && ! is_network_admin() ) {\n\twp_redirect( network_admin_url( 'update-core.php' ) );\n\texit();\n}\n\nif ( ! current_user_can( 'update_core' ) && ! current_user_can( 'update_themes' ) && ! current_user_can( 'update_plugins' ) )\n\twp_die( __( 'You do not have sufficient permissions to update this site.' ) );\n\n/**\n *\n * @global string $wp_local_package\n * @global wpdb   $wpdb\n * @global string $wp_version\n *\n * @staticvar bool $first_pass\n *\n * @param object $update\n */\nfunction list_core_update( $update ) {\n \tglobal $wp_local_package, $wpdb, $wp_version;\n  \tstatic $first_pass = true;\n\n \tif ( 'en_US' == $update->locale && 'en_US' == get_locale() )\n \t\t$version_string = $update->current;\n \t// If the only available update is a partial builds, it doesn't need a language-specific version string.\n \telseif ( 'en_US' == $update->locale && $update->packages->partial && $wp_version == $update->partial_version && ( $updates = get_core_updates() ) && 1 == count( $updates ) )\n \t\t$version_string = $update->current;\n \telse\n \t\t$version_string = sprintf( \"%s&ndash;<strong>%s</strong>\", $update->current, $update->locale );\n\n\t$current = false;\n\tif ( !isset($update->response) || 'latest' == $update->response )\n\t\t$current = true;\n\t$submit = __('Update Now');\n\t$form_action = 'update-core.php?action=do-core-upgrade';\n\t$php_version    = phpversion();\n\t$mysql_version  = $wpdb->db_version();\n\t$show_buttons = true;\n\tif ( 'development' == $update->response ) {\n\t\t$message = __('You are using a development version of WordPress. You can update to the latest nightly build automatically or download the nightly build and install it manually:');\n\t\t$download = __('Download nightly build');\n\t} else {\n\t\tif ( $current ) {\n\t\t\t$message = sprintf( __( 'If you need to re-install version %s, you can do so here or download the package and re-install manually:' ), $version_string );\n\t\t\t$submit = __('Re-install Now');\n\t\t\t$form_action = 'update-core.php?action=do-core-reinstall';\n\t\t} else {\n\t\t\t$php_compat     = version_compare( $php_version, $update->php_version, '>=' );\n\t\t\tif ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) )\n\t\t\t\t$mysql_compat = true;\n\t\t\telse\n\t\t\t\t$mysql_compat = version_compare( $mysql_version, $update->mysql_version, '>=' );\n\n\t\t\tif ( !$mysql_compat && !$php_compat )\n\t\t\t\t$message = sprintf( __('You cannot update because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.'), $update->current, $update->php_version, $update->mysql_version, $php_version, $mysql_version );\n\t\t\telseif ( !$php_compat )\n\t\t\t\t$message = sprintf( __('You cannot update because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires PHP version %2$s or higher. You are running version %3$s.'), $update->current, $update->php_version, $php_version );\n\t\t\telseif ( !$mysql_compat )\n\t\t\t\t$message = sprintf( __('You cannot update because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires MySQL version %2$s or higher. You are running version %3$s.'), $update->current, $update->mysql_version, $mysql_version );\n\t\t\telse\n\t\t\t\t$message = \tsprintf(__('You can update to <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %2$s</a> automatically or download the package and install it manually:'), $update->current, $version_string);\n\t\t\tif ( !$mysql_compat || !$php_compat )\n\t\t\t\t$show_buttons = false;\n\t\t}\n\t\t$download = sprintf(__('Download %s'), $version_string);\n\t}\n\n\techo '<p>';\n\techo $message;\n\techo '</p>';\n\techo '<form method=\"post\" action=\"' . $form_action . '\" name=\"upgrade\" class=\"upgrade\">';\n\twp_nonce_field('upgrade-core');\n\techo '<p>';\n\techo '<input name=\"version\" value=\"'. esc_attr($update->current) .'\" type=\"hidden\"/>';\n\techo '<input name=\"locale\" value=\"'. esc_attr($update->locale) .'\" type=\"hidden\"/>';\n\tif ( $show_buttons ) {\n\t\tif ( $first_pass ) {\n\t\t\tsubmit_button( $submit, $current ? 'button' : 'primary regular', 'upgrade', false );\n\t\t\t$first_pass = false;\n\t\t} else {\n\t\t\tsubmit_button( $submit, 'button', 'upgrade', false );\n\t\t}\n\t\techo '&nbsp;<a href=\"' . esc_url( $update->download ) . '\" class=\"button\">' . $download . '</a>&nbsp;';\n\t}\n\tif ( 'en_US' != $update->locale )\n\t\tif ( !isset( $update->dismissed ) || !$update->dismissed )\n\t\t\tsubmit_button( __('Hide this update'), 'button', 'dismiss', false );\n\t\telse\n\t\t\tsubmit_button( __('Bring back this update'), 'button', 'undismiss', false );\n\techo '</p>';\n\tif ( 'en_US' != $update->locale && ( !isset($wp_local_package) || $wp_local_package != $update->locale ) )\n\t    echo '<p class=\"hint\">'.__('This localized version contains both the translation and various other localization fixes. You can skip upgrading if you want to keep your current translation.').'</p>';\n\t// Partial builds don't need language-specific warnings.\n\telseif ( 'en_US' == $update->locale && get_locale() != 'en_US' && ( ! $update->packages->partial && $wp_version == $update->partial_version ) ) {\n\t    echo '<p class=\"hint\">'.sprintf( __('You are about to install WordPress %s <strong>in English (US).</strong> There is a chance this update will break your translation. You may prefer to wait for the localized version to be released.'), $update->response != 'development' ? $update->current : '' ).'</p>';\n\t}\n\techo '</form>';\n\n}\n\n/**\n * @since 2.7.0\n */\nfunction dismissed_updates() {\n\t$dismissed = get_core_updates( array( 'dismissed' => true, 'available' => false ) );\n\tif ( $dismissed ) {\n\n\t\t$show_text = esc_js(__('Show hidden updates'));\n\t\t$hide_text = esc_js(__('Hide hidden updates'));\n\t?>\n\t<script type=\"text/javascript\">\n\n\t\tjQuery(function($) {\n\t\t\t$('dismissed-updates').show();\n\t\t\t$('#show-dismissed').toggle(function(){$(this).text('<?php echo $hide_text; ?>');}, function() {$(this).text('<?php echo $show_text; ?>')});\n\t\t\t$('#show-dismissed').click(function() { $('#dismissed-updates').toggle('slow');});\n\t\t});\n\t</script>\n\t<?php\n\t\techo '<p class=\"hide-if-no-js\"><a id=\"show-dismissed\" href=\"#\">'.__('Show hidden updates').'</a></p>';\n\t\techo '<ul id=\"dismissed-updates\" class=\"core-updates dismissed\">';\n\t\tforeach ( (array) $dismissed as $update) {\n\t\t\techo '<li>';\n\t\t\tlist_core_update( $update );\n\t\t\techo '</li>';\n\t\t}\n\t\techo '</ul>';\n\t}\n}\n\n/**\n * Display upgrade WordPress for downloading latest or upgrading automatically form.\n *\n * @since 2.7.0\n *\n * @global string $wp_version\n * @global string $required_php_version\n * @global string $required_mysql_version\n */\nfunction core_upgrade_preamble() {\n\tglobal $wp_version, $required_php_version, $required_mysql_version;\n\n\t$updates = get_core_updates();\n\n\tif ( !isset($updates[0]->response) || 'latest' == $updates[0]->response ) {\n\t\techo '<h2>';\n\t\t_e('You have the latest version of WordPress.');\n\n\t\tif ( wp_http_supports( array( 'ssl' ) ) ) {\n\t\t\trequire_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';\n\t\t\t$upgrader = new WP_Automatic_Updater;\n\t\t\t$future_minor_update = (object) array(\n\t\t\t\t'current'       => $wp_version . '.1.next.minor',\n\t\t\t\t'version'       => $wp_version . '.1.next.minor',\n\t\t\t\t'php_version'   => $required_php_version,\n\t\t\t\t'mysql_version' => $required_mysql_version,\n\t\t\t);\n\t\t\t$should_auto_update = $upgrader->should_update( 'core', $future_minor_update, ABSPATH );\n\t\t\tif ( $should_auto_update )\n\t\t\t\techo ' ' . __( 'Future security updates will be applied automatically.' );\n\t\t}\n\t\techo '</h2>';\n\t} else {\n\t\techo '<div class=\"notice notice-warning\"><p>';\n\t\t_e('<strong>Important:</strong> before updating, please <a href=\"https://codex.wordpress.org/WordPress_Backups\">back up your database and files</a>. For help with updates, visit the <a href=\"https://codex.wordpress.org/Updating_WordPress\">Updating WordPress</a> Codex page.');\n\t\techo '</p></div>';\n\n\t\techo '<h2 class=\"response\">';\n\t\t_e( 'An updated version of WordPress is available.' );\n\t\techo '</h2>';\n\t}\n\n\tif ( isset( $updates[0] ) && $updates[0]->response == 'development' ) {\n\t\trequire_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';\n\t\t$upgrader = new WP_Automatic_Updater;\n\t\tif ( wp_http_supports( 'ssl' ) && $upgrader->should_update( 'core', $updates[0], ABSPATH ) ) {\n\t\t\techo '<div class=\"updated inline\"><p>';\n\t\t\techo '<strong>' . __( 'BETA TESTERS:' ) . '</strong> ' . __( 'This site is set up to install updates of future beta versions automatically.' );\n\t\t\techo '</p></div>';\n\t\t}\n\t}\n\n\techo '<ul class=\"core-updates\">';\n\tforeach ( (array) $updates as $update ) {\n\t\techo '<li>';\n\t\tlist_core_update( $update );\n\t\techo '</li>';\n\t}\n\techo '</ul>';\n\t// Don't show the maintenance mode notice when we are only showing a single re-install option.\n\tif ( $updates && ( count( $updates ) > 1 || $updates[0]->response != 'latest' ) ) {\n\t\techo '<p>' . __( 'While your site is being updated, it will be in maintenance mode. As soon as your updates are complete, your site will return to normal.' ) . '</p>';\n\t} elseif ( ! $updates ) {\n\t\tlist( $normalized_version ) = explode( '-', $wp_version );\n\t\techo '<p>' . sprintf( __( '<a href=\"%s\">Learn more about WordPress %s</a>.' ), esc_url( self_admin_url( 'about.php' ) ), $normalized_version ) . '</p>';\n\t}\n\tdismissed_updates();\n}\n\n/**\n *\n * @global string $wp_version\n */\nfunction list_plugin_updates() {\n\tglobal $wp_version;\n\n\t$cur_wp_version = preg_replace('/-.*$/', '', $wp_version);\n\n\trequire_once(ABSPATH . 'wp-admin/includes/plugin-install.php');\n\t$plugins = get_plugin_updates();\n\tif ( empty( $plugins ) ) {\n\t\techo '<h2>' . __( 'Plugins' ) . '</h2>';\n\t\techo '<p>' . __( 'Your plugins are all up to date.' ) . '</p>';\n\t\treturn;\n\t}\n\t$form_action = 'update-core.php?action=do-plugin-upgrade';\n\n\t$core_updates = get_core_updates();\n\tif ( !isset($core_updates[0]->response) || 'latest' == $core_updates[0]->response || 'development' == $core_updates[0]->response || version_compare( $core_updates[0]->current, $cur_wp_version, '=') )\n\t\t$core_update_version = false;\n\telse\n\t\t$core_update_version = $core_updates[0]->current;\n\t?>\n<h2><?php _e( 'Plugins' ); ?></h2>\n<p><?php _e( 'The following plugins have new versions available. Check the ones you want to update and then click &#8220;Update Plugins&#8221;.' ); ?></p>\n<form method=\"post\" action=\"<?php echo esc_url( $form_action ); ?>\" name=\"upgrade-plugins\" class=\"upgrade\">\n<?php wp_nonce_field('upgrade-core'); ?>\n<p><input id=\"upgrade-plugins\" class=\"button\" type=\"submit\" value=\"<?php esc_attr_e('Update Plugins'); ?>\" name=\"upgrade\" /></p>\n<table class=\"widefat\" id=\"update-plugins-table\">\n\t<thead>\n\t<tr>\n\t\t<td scope=\"col\" class=\"manage-column check-column\"><input type=\"checkbox\" id=\"plugins-select-all\" /></td>\n\t\t<th scope=\"col\" class=\"manage-column\"><label for=\"plugins-select-all\"><?php _e('Select All'); ?></label></th>\n\t</tr>\n\t</thead>\n\n\t<tbody class=\"plugins\">\n<?php\n\tforeach ( (array) $plugins as $plugin_file => $plugin_data ) {\n\t\t$info = plugins_api( 'plugin_information', array(\n\t\t\t'slug' => $plugin_data->update->slug,\n\t\t\t'fields' => array(\n\t\t\t\t'short_description' => false,\n\t\t\t\t'sections' => false,\n\t\t\t\t'requires' => false,\n\t\t\t\t'rating' => false,\n\t\t\t\t'ratings' => false,\n\t\t\t\t'downloaded' => false,\n\t\t\t\t'downloadlink' => false,\n\t\t\t\t'last_updated' => false,\n\t\t\t\t'added' => false,\n\t\t\t\t'tags' => false,\n\t\t\t\t'homepage' => false,\n\t\t\t\t'donate_link' => false,\n\t\t\t),\n\t\t) );\n\n\t\tif ( is_wp_error( $info ) ) {\n\t\t\t$info = false;\n\t\t}\n\n\t\t// Get plugin compat for running version of WordPress.\n\t\tif ( isset($info->tested) && version_compare($info->tested, $cur_wp_version, '>=') ) {\n\t\t\t$compat = '<br />' . sprintf(__('Compatibility with WordPress %1$s: 100%% (according to its author)'), $cur_wp_version);\n\t\t} elseif ( isset($info->compatibility[$cur_wp_version][$plugin_data->update->new_version]) ) {\n\t\t\t$compat = $info->compatibility[$cur_wp_version][$plugin_data->update->new_version];\n\t\t\t$compat = '<br />' . sprintf(__('Compatibility with WordPress %1$s: %2$d%% (%3$d \"works\" votes out of %4$d total)'), $cur_wp_version, $compat[0], $compat[2], $compat[1]);\n\t\t} else {\n\t\t\t$compat = '<br />' . sprintf(__('Compatibility with WordPress %1$s: Unknown'), $cur_wp_version);\n\t\t}\n\t\t// Get plugin compat for updated version of WordPress.\n\t\tif ( $core_update_version ) {\n\t\t\tif ( isset( $info->tested ) && version_compare( $info->tested, $core_update_version, '>=' ) ) {\n\t\t\t\t$compat .= '<br />' . sprintf( __( 'Compatibility with WordPress %1$s: 100%% (according to its author)' ), $core_update_version );\n\t\t\t} elseif ( isset( $info->compatibility[ $core_update_version ][ $plugin_data->update->new_version ] ) ) {\n\t\t\t\t$update_compat = $info->compatibility[$core_update_version][$plugin_data->update->new_version];\n\t\t\t\t$compat .= '<br />' . sprintf(__('Compatibility with WordPress %1$s: %2$d%% (%3$d \"works\" votes out of %4$d total)'), $core_update_version, $update_compat[0], $update_compat[2], $update_compat[1]);\n\t\t\t} else {\n\t\t\t\t$compat .= '<br />' . sprintf(__('Compatibility with WordPress %1$s: Unknown'), $core_update_version);\n\t\t\t}\n\t\t}\n\t\t// Get the upgrade notice for the new plugin version.\n\t\tif ( isset($plugin_data->update->upgrade_notice) ) {\n\t\t\t$upgrade_notice = '<br />' . strip_tags($plugin_data->update->upgrade_notice);\n\t\t} else {\n\t\t\t$upgrade_notice = '';\n\t\t}\n\n\t\t$details_url = self_admin_url('plugin-install.php?tab=plugin-information&plugin=' . $plugin_data->update->slug . '&section=changelog&TB_iframe=true&width=640&height=662');\n\t\t$details_text = sprintf(__('View version %1$s details.'), $plugin_data->update->new_version);\n\t\t$details = sprintf('<a href=\"%1$s\" class=\"thickbox\" title=\"%2$s\">%3$s</a>', esc_url($details_url), esc_attr($plugin_data->Name), $details_text);\n\n\t\techo \"\n\t<tr>\n\t\t<th scope='row' class='check-column'><input type='checkbox' name='checked[]' value='\" . esc_attr($plugin_file) . \"' /></th>\n\t\t<td><p><strong>{$plugin_data->Name}</strong><br />\" . sprintf(__('You have version %1$s installed. Update to %2$s.'), $plugin_data->Version, $plugin_data->update->new_version) . ' ' . $details . $compat . $upgrade_notice . \"</p></td>\n\t</tr>\";\n\t}\n?>\n\t</tbody>\n\n\t<tfoot>\n\t<tr>\n\t\t<td scope=\"col\" class=\"manage-column check-column\"><input type=\"checkbox\" id=\"plugins-select-all-2\" /></td>\n\t\t<th scope=\"col\" class=\"manage-column\"><label for=\"plugins-select-all-2\"><?php _e( 'Select All' ); ?></label></th>\n\t</tr>\n\t</tfoot>\n</table>\n<p><input id=\"upgrade-plugins-2\" class=\"button\" type=\"submit\" value=\"<?php esc_attr_e('Update Plugins'); ?>\" name=\"upgrade\" /></p>\n</form>\n<?php\n}\n\n/**\n * @since 2.9.0\n */\nfunction list_theme_updates() {\n\t$themes = get_theme_updates();\n\tif ( empty( $themes ) ) {\n\t\techo '<h2>' . __( 'Themes' ) . '</h2>';\n\t\techo '<p>' . __( 'Your themes are all up to date.' ) . '</p>';\n\t\treturn;\n\t}\n\n\t$form_action = 'update-core.php?action=do-theme-upgrade';\n?>\n<h2><?php _e( 'Themes' ); ?></h2>\n<p><?php _e( 'The following themes have new versions available. Check the ones you want to update and then click &#8220;Update Themes&#8221;.' ); ?></p>\n<p><?php printf( __( '<strong>Please Note:</strong> Any customizations you have made to theme files will be lost. Please consider using <a href=\"%s\">child themes</a> for modifications.' ), __( 'https://codex.wordpress.org/Child_Themes' ) ); ?></p>\n<form method=\"post\" action=\"<?php echo esc_url( $form_action ); ?>\" name=\"upgrade-themes\" class=\"upgrade\">\n<?php wp_nonce_field('upgrade-core'); ?>\n<p><input id=\"upgrade-themes\" class=\"button\" type=\"submit\" value=\"<?php esc_attr_e('Update Themes'); ?>\" name=\"upgrade\" /></p>\n<table class=\"widefat\" id=\"update-themes-table\">\n\t<thead>\n\t<tr>\n\t\t<td scope=\"col\" class=\"manage-column check-column\"><input type=\"checkbox\" id=\"themes-select-all\" /></td>\n\t\t<th scope=\"col\" class=\"manage-column\"><label for=\"themes-select-all\"><?php _e('Select All'); ?></label></th>\n\t</tr>\n\t</thead>\n\n\t<tbody class=\"plugins\">\n<?php\n\tforeach ( $themes as $stylesheet => $theme ) {\n\t\techo \"\n\t<tr>\n\t\t<th scope='row' class='check-column'><input type='checkbox' name='checked[]' value='\" . esc_attr( $stylesheet ) . \"' /></th>\n\t\t<td class='plugin-title'><img src='\" . esc_url( $theme->get_screenshot() ) . \"' width='85' height='64' style='float:left; padding: 0 5px 5px' alt='' /><strong>\" . $theme->display('Name') . '</strong> ' . sprintf( __( 'You have version %1$s installed. Update to %2$s.' ), $theme->display('Version'), $theme->update['new_version'] ) . \"</td>\n\t</tr>\";\n\t}\n?>\n\t</tbody>\n\n\t<tfoot>\n\t<tr>\n\t\t<td scope=\"col\" class=\"manage-column check-column\"><input type=\"checkbox\" id=\"themes-select-all-2\" /></td>\n\t\t<th scope=\"col\" class=\"manage-column\"><label for=\"themes-select-all-2\"><?php _e( 'Select All' ); ?></label></th>\n\t</tr>\n\t</tfoot>\n</table>\n<p><input id=\"upgrade-themes-2\" class=\"button\" type=\"submit\" value=\"<?php esc_attr_e('Update Themes'); ?>\" name=\"upgrade\" /></p>\n</form>\n<?php\n}\n\n/**\n * @since 3.7.0\n */\nfunction list_translation_updates() {\n\t$updates = wp_get_translation_updates();\n\tif ( ! $updates ) {\n\t\tif ( 'en_US' != get_locale() ) {\n\t\t\techo '<h2>' . __( 'Translations' ) . '</h2>';\n\t\t\techo '<p>' . __( 'Your translations are all up to date.' ) . '</p>';\n\t\t}\n\t\treturn;\n\t}\n\n\t$form_action = 'update-core.php?action=do-translation-upgrade';\n\t?>\n\t<h2><?php _e( 'Translations' ); ?></h2>\n\t<form method=\"post\" action=\"<?php echo esc_url( $form_action ); ?>\" name=\"upgrade-translations\" class=\"upgrade\">\n\t\t<p><?php _e( 'New translations are available.' ); ?></p>\n\t\t<?php wp_nonce_field( 'upgrade-translations' ); ?>\n\t\t<p><input class=\"button\" type=\"submit\" value=\"<?php esc_attr_e( 'Update Translations' ); ?>\" name=\"upgrade\" /></p>\n\t</form>\n\t<?php\n}\n\n/**\n * Upgrade WordPress core display.\n *\n * @since 2.7.0\n *\n * @global WP_Filesystem_Base $wp_filesystem Subclass\n *\n * @param bool $reinstall\n */\nfunction do_core_upgrade( $reinstall = false ) {\n\tglobal $wp_filesystem;\n\n\tinclude_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );\n\n\tif ( $reinstall )\n\t\t$url = 'update-core.php?action=do-core-reinstall';\n\telse\n\t\t$url = 'update-core.php?action=do-core-upgrade';\n\t$url = wp_nonce_url($url, 'upgrade-core');\n\n\t$version = isset( $_POST['version'] )? $_POST['version'] : false;\n\t$locale = isset( $_POST['locale'] )? $_POST['locale'] : 'en_US';\n\t$update = find_core_update( $version, $locale );\n\tif ( !$update )\n\t\treturn;\n\n\t// Allow relaxed file ownership writes for User-initiated upgrades when the API specifies\n\t// that it's safe to do so. This only happens when there are no new files to create.\n\t$allow_relaxed_file_ownership = ! $reinstall && isset( $update->new_files ) && ! $update->new_files;\n\n?>\n\t<div class=\"wrap\">\n\t<h1><?php _e( 'Update WordPress' ); ?></h1>\n<?php\n\n\tif ( false === ( $credentials = request_filesystem_credentials( $url, '', false, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership ) ) ) {\n\t\techo '</div>';\n\t\treturn;\n\t}\n\n\tif ( ! WP_Filesystem( $credentials, ABSPATH, $allow_relaxed_file_ownership ) ) {\n\t\t// Failed to connect, Error and request again\n\t\trequest_filesystem_credentials( $url, '', true, ABSPATH, array( 'version', 'locale' ), $allow_relaxed_file_ownership );\n\t\techo '</div>';\n\t\treturn;\n\t}\n\n\tif ( $wp_filesystem->errors->get_error_code() ) {\n\t\tforeach ( $wp_filesystem->errors->get_error_messages() as $message )\n\t\t\tshow_message($message);\n\t\techo '</div>';\n\t\treturn;\n\t}\n\n\tif ( $reinstall )\n\t\t$update->response = 'reinstall';\n\n\tadd_filter( 'update_feedback', 'show_message' );\n\n\t$upgrader = new Core_Upgrader();\n\t$result = $upgrader->upgrade( $update, array(\n\t\t'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership\n\t) );\n\n\tif ( is_wp_error($result) ) {\n\t\tshow_message($result);\n\t\tif ('up_to_date' != $result->get_error_code() )\n\t\t\tshow_message( __('Installation Failed') );\n\t\techo '</div>';\n\t\treturn;\n\t}\n\n\tshow_message( __('WordPress updated successfully') );\n\tshow_message( '<span class=\"hide-if-no-js\">' . sprintf( __( 'Welcome to WordPress %1$s. You will be redirected to the About WordPress screen. If not, click <a href=\"%2$s\">here</a>.' ), $result, esc_url( self_admin_url( 'about.php?updated' ) ) ) . '</span>' );\n\tshow_message( '<span class=\"hide-if-js\">' . sprintf( __( 'Welcome to WordPress %1$s. <a href=\"%2$s\">Learn more</a>.' ), $result, esc_url( self_admin_url( 'about.php?updated' ) ) ) . '</span>' );\n\t?>\n\t</div>\n\t<script type=\"text/javascript\">\n\twindow.location = '<?php echo self_admin_url( 'about.php?updated' ); ?>';\n\t</script>\n\t<?php\n}\n\n/**\n * @since 2.7.0\n */\nfunction do_dismiss_core_update() {\n\t$version = isset( $_POST['version'] )? $_POST['version'] : false;\n\t$locale = isset( $_POST['locale'] )? $_POST['locale'] : 'en_US';\n\t$update = find_core_update( $version, $locale );\n\tif ( !$update )\n\t\treturn;\n\tdismiss_core_update( $update );\n\twp_redirect( wp_nonce_url('update-core.php?action=upgrade-core', 'upgrade-core') );\n\texit;\n}\n\n/**\n * @since 2.7.0\n */\nfunction do_undismiss_core_update() {\n\t$version = isset( $_POST['version'] )? $_POST['version'] : false;\n\t$locale = isset( $_POST['locale'] )? $_POST['locale'] : 'en_US';\n\t$update = find_core_update( $version, $locale );\n\tif ( !$update )\n\t\treturn;\n\tundismiss_core_update( $version, $locale );\n\twp_redirect( wp_nonce_url('update-core.php?action=upgrade-core', 'upgrade-core') );\n\texit;\n}\n\n$action = isset($_GET['action']) ? $_GET['action'] : 'upgrade-core';\n\n$upgrade_error = false;\nif ( ( 'do-theme-upgrade' == $action || ( 'do-plugin-upgrade' == $action && ! isset( $_GET['plugins'] ) ) )\n\t&& ! isset( $_POST['checked'] ) ) {\n\t$upgrade_error = $action == 'do-theme-upgrade' ? 'themes' : 'plugins';\n\t$action = 'upgrade-core';\n}\n\n$title = __('WordPress Updates');\n$parent_file = 'index.php';\n\n$updates_overview  = '<p>' . __( 'On this screen, you can update to the latest version of WordPress, as well as update your themes, plugins, and translations from the WordPress.org repositories.' ) . '</p>';\n$updates_overview .= '<p>' . __( 'If an update is available, you&#8127;ll see a notification appear in the Toolbar and navigation menu.' ) . ' ' . __( 'Keeping your site updated is important for security. It also makes the internet a safer place for you and your readers.' ) . '</p>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __( 'Overview' ),\n\t'content' => $updates_overview\n) );\n\n$updates_howto  = '<p>' . __( '<strong>WordPress</strong> &mdash; Updating your WordPress installation is a simple one-click procedure: just <strong>click on the &#8220;Update Now&#8221; button</strong> when you are notified that a new version is available.' ) . ' ' . __( 'In most cases, WordPress will automatically apply maintenance and security updates in the background for you.' ) . '</p>';\n$updates_howto .= '<p>' . __( '<strong>Themes and Plugins</strong> &mdash; To update individual themes or plugins from this screen, use the checkboxes to make your selection, then <strong>click on the appropriate &#8220;Update&#8221; button</strong>. To update all of your themes or plugins at once, you can check the box at the top of the section to select all before clicking the update button.' ) . '</p>';\n\nif ( 'en_US' != get_locale() ) {\n\t$updates_howto .= '<p>' . __( '<strong>Translations</strong> &mdash; The files translating WordPress into your language are updated for you whenever any other updates occur. But if these files are out of date, you can <strong>click the &#8220;Update Translations&#8221;</strong> button.' ) . '</p>';\n}\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'how-to-update',\n\t'title'   => __( 'How to Update' ),\n\t'content' => $updates_howto\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Dashboard_Updates_Screen\" target=\"_blank\">Documentation on Updating WordPress</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n);\n\nif ( 'upgrade-core' == $action ) {\n\t// Force a update check when requested\n\t$force_check = ! empty( $_GET['force-check'] );\n\twp_version_check( array(), $force_check );\n\n\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\t?>\n\t<div class=\"wrap\">\n\t<h1><?php _e( 'WordPress Updates' ); ?></h1>\n\t<?php\n\tif ( $upgrade_error ) {\n\t\techo '<div class=\"error\"><p>';\n\t\tif ( $upgrade_error == 'themes' )\n\t\t\t_e('Please select one or more themes to update.');\n\t\telse\n\t\t\t_e('Please select one or more plugins to update.');\n\t\techo '</p></div>';\n\t}\n\n\techo '<p>';\n\t/* translators: %1 date, %2 time. */\n\tprintf( __('Last checked on %1$s at %2$s.'), date_i18n( get_option( 'date_format' ) ), date_i18n( get_option( 'time_format' ) ) );\n\techo ' &nbsp; <a class=\"button\" href=\"' . esc_url( self_admin_url('update-core.php?force-check=1') ) . '\">' . __( 'Check Again' ) . '</a>';\n\techo '</p>';\n\n\tif ( $core = current_user_can( 'update_core' ) )\n\t\tcore_upgrade_preamble();\n\tif ( $plugins = current_user_can( 'update_plugins' ) )\n\t\tlist_plugin_updates();\n\tif ( $themes = current_user_can( 'update_themes' ) )\n\t\tlist_theme_updates();\n\tif ( $core || $plugins || $themes )\n\t\tlist_translation_updates();\n\tunset( $core, $plugins, $themes );\n\t/**\n\t * Fires after the core, plugin, and theme update tables.\n\t *\n\t * @since 2.9.0\n\t */\n\tdo_action( 'core_upgrade_preamble' );\n\techo '</div>';\n\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n} elseif ( 'do-core-upgrade' == $action || 'do-core-reinstall' == $action ) {\n\n\tif ( ! current_user_can( 'update_core' ) )\n\t\twp_die( __( 'You do not have sufficient permissions to update this site.' ) );\n\n\tcheck_admin_referer('upgrade-core');\n\n\t// Do the (un)dismiss actions before headers, so that they can redirect.\n\tif ( isset( $_POST['dismiss'] ) )\n\t\tdo_dismiss_core_update();\n\telseif ( isset( $_POST['undismiss'] ) )\n\t\tdo_undismiss_core_update();\n\n\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\tif ( 'do-core-reinstall' == $action )\n\t\t$reinstall = true;\n\telse\n\t\t$reinstall = false;\n\n\tif ( isset( $_POST['upgrade'] ) )\n\t\tdo_core_upgrade($reinstall);\n\n\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n} elseif ( 'do-plugin-upgrade' == $action ) {\n\n\tif ( ! current_user_can( 'update_plugins' ) )\n\t\twp_die( __( 'You do not have sufficient permissions to update this site.' ) );\n\n\tcheck_admin_referer('upgrade-core');\n\n\tif ( isset( $_GET['plugins'] ) ) {\n\t\t$plugins = explode( ',', $_GET['plugins'] );\n\t} elseif ( isset( $_POST['checked'] ) ) {\n\t\t$plugins = (array) $_POST['checked'];\n\t} else {\n\t\twp_redirect( admin_url('update-core.php') );\n\t\texit;\n\t}\n\n\t$url = 'update.php?action=update-selected&plugins=' . urlencode(implode(',', $plugins));\n\t$url = wp_nonce_url($url, 'bulk-update-plugins');\n\n\t$title = __('Update Plugins');\n\n\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\techo '<div class=\"wrap\">';\n\techo '<h1>' . __( 'Update Plugins' ) . '</h1>';\n\techo '<iframe src=\"', $url, '\" style=\"width: 100%; height: 100%; min-height: 750px;\" frameborder=\"0\"></iframe>';\n\techo '</div>';\n\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n} elseif ( 'do-theme-upgrade' == $action ) {\n\n\tif ( ! current_user_can( 'update_themes' ) )\n\t\twp_die( __( 'You do not have sufficient permissions to update this site.' ) );\n\n\tcheck_admin_referer('upgrade-core');\n\n\tif ( isset( $_GET['themes'] ) ) {\n\t\t$themes = explode( ',', $_GET['themes'] );\n\t} elseif ( isset( $_POST['checked'] ) ) {\n\t\t$themes = (array) $_POST['checked'];\n\t} else {\n\t\twp_redirect( admin_url('update-core.php') );\n\t\texit;\n\t}\n\n\t$url = 'update.php?action=update-selected-themes&themes=' . urlencode(implode(',', $themes));\n\t$url = wp_nonce_url($url, 'bulk-update-themes');\n\n\t$title = __('Update Themes');\n\n\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\t?>\n\t<div class=\"wrap\">\n\t\t<h1><?php _e( 'Update Themes' ); ?></h1>\n\t\t<iframe src=\"<?php echo $url ?>\" style=\"width: 100%; height: 100%; min-height: 750px;\" frameborder=\"0\"></iframe>\n\t</div>\n\t<?php\n\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n} elseif ( 'do-translation-upgrade' == $action ) {\n\n\tif ( ! current_user_can( 'update_core' ) && ! current_user_can( 'update_plugins' ) && ! current_user_can( 'update_themes' ) )\n\t\twp_die( __( 'You do not have sufficient permissions to update this site.' ) );\n\n\tcheck_admin_referer( 'upgrade-translations' );\n\n\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\tinclude_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );\n\n\t$url = 'update-core.php?action=do-translation-upgrade';\n\t$nonce = 'upgrade-translations';\n\t$title = __( 'Update Translations' );\n\t$context = WP_LANG_DIR;\n\n\t$upgrader = new Language_Pack_Upgrader( new Language_Pack_Upgrader_Skin( compact( 'url', 'nonce', 'title', 'context' ) ) );\n\t$result = $upgrader->bulk_upgrade();\n\n\trequire_once( ABSPATH . 'wp-admin/admin-footer.php' );\n\n} else {\n\t/**\n\t * Fires for each custom update action on the WordPress Updates screen.\n\t *\n\t * The dynamic portion of the hook name, `$action`, refers to the\n\t * passed update action. The hook fires in lieu of all available\n\t * default update actions.\n\t *\n\t * @since 3.2.0\n\t */\n\tdo_action( \"update-core-custom_{$action}\" );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/update.php",
    "content": "<?php\n/**\n * Update/Install Plugin/Theme administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\nif ( ! defined( 'IFRAME_REQUEST' ) && isset( $_GET['action'] ) && in_array( $_GET['action'], array( 'update-selected', 'activate-plugin', 'update-selected-themes' ) ) )\n\tdefine( 'IFRAME_REQUEST', true );\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\ninclude_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );\n\nif ( isset($_GET['action']) ) {\n\t$plugin = isset($_REQUEST['plugin']) ? trim($_REQUEST['plugin']) : '';\n\t$theme = isset($_REQUEST['theme']) ? urldecode($_REQUEST['theme']) : '';\n\t$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';\n\n\tif ( 'update-selected' == $action ) {\n\t\tif ( ! current_user_can( 'update_plugins' ) )\n\t\t\twp_die( __( 'You do not have sufficient permissions to update plugins for this site.' ) );\n\n\t\tcheck_admin_referer( 'bulk-update-plugins' );\n\n\t\tif ( isset( $_GET['plugins'] ) )\n\t\t\t$plugins = explode( ',', stripslashes($_GET['plugins']) );\n\t\telseif ( isset( $_POST['checked'] ) )\n\t\t\t$plugins = (array) $_POST['checked'];\n\t\telse\n\t\t\t$plugins = array();\n\n\t\t$plugins = array_map('urldecode', $plugins);\n\n\t\t$url = 'update.php?action=update-selected&amp;plugins=' . urlencode(implode(',', $plugins));\n\t\t$nonce = 'bulk-update-plugins';\n\n\t\twp_enqueue_script( 'updates' );\n\t\tiframe_header();\n\n\t\t$upgrader = new Plugin_Upgrader( new Bulk_Plugin_Upgrader_Skin( compact( 'nonce', 'url' ) ) );\n\t\t$upgrader->bulk_upgrade( $plugins );\n\n\t\tiframe_footer();\n\n\t} elseif ( 'upgrade-plugin' == $action ) {\n\t\tif ( ! current_user_can('update_plugins') )\n\t\t\twp_die(__('You do not have sufficient permissions to update plugins for this site.'));\n\n\t\tcheck_admin_referer('upgrade-plugin_' . $plugin);\n\n\t\t$title = __('Update Plugin');\n\t\t$parent_file = 'plugins.php';\n\t\t$submenu_file = 'plugins.php';\n\n\t\twp_enqueue_script( 'updates' );\n\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t$nonce = 'upgrade-plugin_' . $plugin;\n\t\t$url = 'update.php?action=upgrade-plugin&plugin=' . urlencode( $plugin );\n\n\t\t$upgrader = new Plugin_Upgrader( new Plugin_Upgrader_Skin( compact('title', 'nonce', 'url', 'plugin') ) );\n\t\t$upgrader->upgrade($plugin);\n\n\t\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n\t} elseif ('activate-plugin' == $action ) {\n\t\tif ( ! current_user_can('update_plugins') )\n\t\t\twp_die(__('You do not have sufficient permissions to update plugins for this site.'));\n\n\t\tcheck_admin_referer('activate-plugin_' . $plugin);\n\t\tif ( ! isset($_GET['failure']) && ! isset($_GET['success']) ) {\n\t\t\twp_redirect( admin_url('update.php?action=activate-plugin&failure=true&plugin=' . urlencode( $plugin ) . '&_wpnonce=' . $_GET['_wpnonce']) );\n\t\t\tactivate_plugin( $plugin, '', ! empty( $_GET['networkwide'] ), true );\n\t\t\twp_redirect( admin_url('update.php?action=activate-plugin&success=true&plugin=' . urlencode( $plugin ) . '&_wpnonce=' . $_GET['_wpnonce']) );\n\t\t\tdie();\n\t\t}\n\t\tiframe_header( __('Plugin Reactivation'), true );\n\t\tif ( isset($_GET['success']) )\n\t\t\techo '<p>' . __('Plugin reactivated successfully.') . '</p>';\n\n\t\tif ( isset($_GET['failure']) ){\n\t\t\techo '<p>' . __('Plugin failed to reactivate due to a fatal error.') . '</p>';\n\n\t\t\terror_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );\n\t\t\t@ini_set('display_errors', true); //Ensure that Fatal errors are displayed.\n\t\t\twp_register_plugin_realpath( WP_PLUGIN_DIR . '/' . $plugin );\n\t\t\tinclude( WP_PLUGIN_DIR . '/' . $plugin );\n\t\t}\n\t\tiframe_footer();\n\t} elseif ( 'install-plugin' == $action ) {\n\n\t\tif ( ! current_user_can('install_plugins') )\n\t\t\twp_die( __( 'You do not have sufficient permissions to install plugins on this site.' ) );\n\n\t\tinclude_once( ABSPATH . 'wp-admin/includes/plugin-install.php' ); //for plugins_api..\n\n\t\tcheck_admin_referer( 'install-plugin_' . $plugin );\n\t\t$api = plugins_api( 'plugin_information', array(\n\t\t\t'slug' => $plugin,\n\t\t\t'fields' => array(\n\t\t\t\t'short_description' => false,\n\t\t\t\t'sections' => false,\n\t\t\t\t'requires' => false,\n\t\t\t\t'rating' => false,\n\t\t\t\t'ratings' => false,\n\t\t\t\t'downloaded' => false,\n\t\t\t\t'last_updated' => false,\n\t\t\t\t'added' => false,\n\t\t\t\t'tags' => false,\n\t\t\t\t'compatibility' => false,\n\t\t\t\t'homepage' => false,\n\t\t\t\t'donate_link' => false,\n\t\t\t),\n\t\t) );\n\n\t\tif ( is_wp_error( $api ) ) {\n\t \t\twp_die( $api );\n\t\t}\n\n\t\t$title = __('Plugin Install');\n\t\t$parent_file = 'plugins.php';\n\t\t$submenu_file = 'plugin-install.php';\n\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t$title = sprintf( __('Installing Plugin: %s'), $api->name . ' ' . $api->version );\n\t\t$nonce = 'install-plugin_' . $plugin;\n\t\t$url = 'update.php?action=install-plugin&plugin=' . urlencode( $plugin );\n\t\tif ( isset($_GET['from']) )\n\t\t\t$url .= '&from=' . urlencode(stripslashes($_GET['from']));\n\n\t\t$type = 'web'; //Install plugin type, From Web or an Upload.\n\n\t\t$upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact('title', 'url', 'nonce', 'plugin', 'api') ) );\n\t\t$upgrader->install($api->download_link);\n\n\t\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n\t} elseif ( 'upload-plugin' == $action ) {\n\n\t\tif ( ! current_user_can( 'upload_plugins' ) ) {\n\t\t\twp_die( __( 'You do not have sufficient permissions to install plugins on this site.' ) );\n\t\t}\n\n\t\tcheck_admin_referer('plugin-upload');\n\n\t\t$file_upload = new File_Upload_Upgrader('pluginzip', 'package');\n\n\t\t$title = __('Upload Plugin');\n\t\t$parent_file = 'plugins.php';\n\t\t$submenu_file = 'plugin-install.php';\n\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t$title = sprintf( __('Installing Plugin from uploaded file: %s'), esc_html( basename( $file_upload->filename ) ) );\n\t\t$nonce = 'plugin-upload';\n\t\t$url = add_query_arg(array('package' => $file_upload->id), 'update.php?action=upload-plugin');\n\t\t$type = 'upload'; //Install plugin type, From Web or an Upload.\n\n\t\t$upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact('type', 'title', 'nonce', 'url') ) );\n\t\t$result = $upgrader->install( $file_upload->package );\n\n\t\tif ( $result || is_wp_error($result) )\n\t\t\t$file_upload->cleanup();\n\n\t\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n\t} elseif ( 'upgrade-theme' == $action ) {\n\n\t\tif ( ! current_user_can('update_themes') )\n\t\t\twp_die(__('You do not have sufficient permissions to update themes for this site.'));\n\n\t\tcheck_admin_referer('upgrade-theme_' . $theme);\n\n\t\twp_enqueue_script( 'customize-loader' );\n\t\twp_enqueue_script( 'updates' );\n\n\t\t$title = __('Update Theme');\n\t\t$parent_file = 'themes.php';\n\t\t$submenu_file = 'themes.php';\n\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t$nonce = 'upgrade-theme_' . $theme;\n\t\t$url = 'update.php?action=upgrade-theme&theme=' . urlencode( $theme );\n\n\t\t$upgrader = new Theme_Upgrader( new Theme_Upgrader_Skin( compact('title', 'nonce', 'url', 'theme') ) );\n\t\t$upgrader->upgrade($theme);\n\n\t\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\t} elseif ( 'update-selected-themes' == $action ) {\n\t\tif ( ! current_user_can( 'update_themes' ) )\n\t\t\twp_die( __( 'You do not have sufficient permissions to update themes for this site.' ) );\n\n\t\tcheck_admin_referer( 'bulk-update-themes' );\n\n\t\tif ( isset( $_GET['themes'] ) )\n\t\t\t$themes = explode( ',', stripslashes($_GET['themes']) );\n\t\telseif ( isset( $_POST['checked'] ) )\n\t\t\t$themes = (array) $_POST['checked'];\n\t\telse\n\t\t\t$themes = array();\n\n\t\t$themes = array_map('urldecode', $themes);\n\n\t\t$url = 'update.php?action=update-selected-themes&amp;themes=' . urlencode(implode(',', $themes));\n\t\t$nonce = 'bulk-update-themes';\n\n\t\twp_enqueue_script( 'updates' );\n\t\tiframe_header();\n\n\t\t$upgrader = new Theme_Upgrader( new Bulk_Theme_Upgrader_Skin( compact( 'nonce', 'url' ) ) );\n\t\t$upgrader->bulk_upgrade( $themes );\n\n\t\tiframe_footer();\n\t} elseif ( 'install-theme' == $action ) {\n\n\t\tif ( ! current_user_can('install_themes') )\n\t\t\twp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );\n\n\t\tinclude_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' ); //for themes_api..\n\n\t\tcheck_admin_referer( 'install-theme_' . $theme );\n\t\t$api = themes_api('theme_information', array('slug' => $theme, 'fields' => array('sections' => false, 'tags' => false) ) ); //Save on a bit of bandwidth.\n\n\t\tif ( is_wp_error($api) )\n\t \t\twp_die($api);\n\n\t\twp_enqueue_script( 'customize-loader' );\n\n\t\t$title = __('Install Themes');\n\t\t$parent_file = 'themes.php';\n\t\t$submenu_file = 'themes.php';\n\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t$title = sprintf( __('Installing Theme: %s'), $api->name . ' ' . $api->version );\n\t\t$nonce = 'install-theme_' . $theme;\n\t\t$url = 'update.php?action=install-theme&theme=' . urlencode( $theme );\n\t\t$type = 'web'; //Install theme type, From Web or an Upload.\n\n\t\t$upgrader = new Theme_Upgrader( new Theme_Installer_Skin( compact('title', 'url', 'nonce', 'plugin', 'api') ) );\n\t\t$upgrader->install($api->download_link);\n\n\t\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n\t} elseif ( 'upload-theme' == $action ) {\n\n\t\tif ( ! current_user_can( 'upload_themes' ) ) {\n\t\t\twp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );\n\t\t}\n\n\t\tcheck_admin_referer('theme-upload');\n\n\t\t$file_upload = new File_Upload_Upgrader('themezip', 'package');\n\n\t\twp_enqueue_script( 'customize-loader' );\n\n\t\t$title = __('Upload Theme');\n\t\t$parent_file = 'themes.php';\n\t\t$submenu_file = 'theme-install.php';\n\n\t\trequire_once(ABSPATH . 'wp-admin/admin-header.php');\n\n\t\t$title = sprintf( __('Installing Theme from uploaded file: %s'), esc_html( basename( $file_upload->filename ) ) );\n\t\t$nonce = 'theme-upload';\n\t\t$url = add_query_arg(array('package' => $file_upload->id), 'update.php?action=upload-theme');\n\t\t$type = 'upload'; //Install plugin type, From Web or an Upload.\n\n\t\t$upgrader = new Theme_Upgrader( new Theme_Installer_Skin( compact('type', 'title', 'nonce', 'url') ) );\n\t\t$result = $upgrader->install( $file_upload->package );\n\n\t\tif ( $result || is_wp_error($result) )\n\t\t\t$file_upload->cleanup();\n\n\t\tinclude(ABSPATH . 'wp-admin/admin-footer.php');\n\n\t} else {\n\t\t/**\n\t\t * Fires when a custom plugin or theme update request is received.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$action`, refers to the action\n\t\t * provided in the request for wp-admin/update.php. Can be used to\n\t\t * provide custom update functionality for themes and plugins.\n\t\t *\n\t\t * @since 2.8.0\n\t\t */\n\t\tdo_action( \"update-custom_{$action}\" );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/upgrade-functions.php",
    "content": "<?php\n/**\n * WordPress Upgrade Functions. Old file, must not be used. Include\n * wp-admin/includes/upgrade.php instead.\n *\n * @deprecated 2.5.0\n * @package WordPress\n * @subpackage Administration\n */\n\n_deprecated_file( basename(__FILE__), '2.5', 'wp-admin/includes/upgrade.php' );\nrequire_once(ABSPATH . 'wp-admin/includes/upgrade.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/upgrade.php",
    "content": "<?php\n/**\n * Upgrade WordPress Page.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/**\n * We are upgrading WordPress.\n *\n * @since 1.5.1\n * @var bool\n */\ndefine( 'WP_INSTALLING', true );\n\n/** Load WordPress Bootstrap */\nrequire( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );\n\nnocache_headers();\n\ntimer_start();\nrequire_once( ABSPATH . 'wp-admin/includes/upgrade.php' );\n\ndelete_site_transient('update_core');\n\nif ( isset( $_GET['step'] ) )\n\t$step = $_GET['step'];\nelse\n\t$step = 0;\n\n// Do it. No output.\nif ( 'upgrade_db' === $step ) {\n\twp_upgrade();\n\tdie( '0' );\n}\n\n/**\n * @global string $wp_version\n * @global string $required_php_version\n * @global string $required_mysql_version\n * @global wpdb   $wpdb\n */\nglobal $wp_version, $required_php_version, $required_mysql_version;\n\n$step = (int) $step;\n\n$php_version    = phpversion();\n$mysql_version  = $wpdb->db_version();\n$php_compat     = version_compare( $php_version, $required_php_version, '>=' );\nif ( file_exists( WP_CONTENT_DIR . '/db.php' ) && empty( $wpdb->is_mysql ) )\n\t$mysql_compat = true;\nelse\n\t$mysql_compat = version_compare( $mysql_version, $required_mysql_version, '>=' );\n\n@header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );\n?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" <?php language_attributes(); ?>>\n<head>\n\t<meta name=\"viewport\" content=\"width=device-width\" />\n\t<meta http-equiv=\"Content-Type\" content=\"<?php bloginfo( 'html_type' ); ?>; charset=<?php echo get_option( 'blog_charset' ); ?>\" />\n\t<meta name=\"robots\" content=\"noindex,nofollow\" />\n\t<title><?php _e( 'WordPress &rsaquo; Update' ); ?></title>\n\t<?php\n\twp_admin_css( 'install', true );\n\twp_admin_css( 'ie', true );\n\t?>\n</head>\n<body class=\"wp-core-ui\">\n<p id=\"logo\"><a href=\"<?php echo esc_url( __( 'https://wordpress.org/' ) ); ?>\" tabindex=\"-1\"><?php _e( 'WordPress' ); ?></a></p>\n\n<?php if ( get_option( 'db_version' ) == $wp_db_version || !is_blog_installed() ) : ?>\n\n<h1><?php _e( 'No Update Required' ); ?></h1>\n<p><?php _e( 'Your WordPress database is already up-to-date!' ); ?></p>\n<p class=\"step\"><a class=\"button button-large\" href=\"<?php echo get_option( 'home' ); ?>/\"><?php _e( 'Continue' ); ?></a></p>\n\n<?php elseif ( !$php_compat || !$mysql_compat ) :\n\tif ( !$mysql_compat && !$php_compat )\n\t\tprintf( __('You cannot update because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires PHP version %2$s or higher and MySQL version %3$s or higher. You are running PHP version %4$s and MySQL version %5$s.'), $wp_version, $required_php_version, $required_mysql_version, $php_version, $mysql_version );\n\telseif ( !$php_compat )\n\t\tprintf( __('You cannot update because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires PHP version %2$s or higher. You are running version %3$s.'), $wp_version, $required_php_version, $php_version );\n\telseif ( !$mysql_compat )\n\t\tprintf( __('You cannot update because <a href=\"https://codex.wordpress.org/Version_%1$s\">WordPress %1$s</a> requires MySQL version %2$s or higher. You are running version %3$s.'), $wp_version, $required_mysql_version, $mysql_version );\n?>\n<?php else :\nswitch ( $step ) :\n\tcase 0:\n\t\t$goback = wp_get_referer();\n\t\tif ( $goback ) {\n\t\t\t$goback = esc_url_raw( $goback );\n\t\t\t$goback = urlencode( $goback );\n\t\t}\n?>\n<h1><?php _e( 'Database Update Required' ); ?></h1>\n<p><?php _e( 'WordPress has been updated! Before we send you on your way, we have to update your database to the newest version.' ); ?></p>\n<p><?php _e( 'The database update process may take a little while, so please be patient.' ); ?></p>\n<p class=\"step\"><a class=\"button button-large button-primary\" href=\"upgrade.php?step=1&amp;backto=<?php echo $goback; ?>\"><?php _e( 'Update WordPress Database' ); ?></a></p>\n<?php\n\t\tbreak;\n\tcase 1:\n\t\twp_upgrade();\n\n\t\t\t$backto = !empty($_GET['backto']) ? wp_unslash( urldecode( $_GET['backto'] ) ) : __get_option( 'home' ) . '/';\n\t\t\t$backto = esc_url( $backto );\n\t\t\t$backto = wp_validate_redirect($backto, __get_option( 'home' ) . '/');\n?>\n<h1><?php _e( 'Update Complete' ); ?></h1>\n\t<p><?php _e( 'Your WordPress database has been successfully updated!' ); ?></p>\n\t<p class=\"step\"><a class=\"button button-large\" href=\"<?php echo $backto; ?>\"><?php _e( 'Continue' ); ?></a></p>\n\n<!--\n<pre>\n<?php printf( __( '%s queries' ), $wpdb->num_queries ); ?>\n\n<?php printf( __( '%s seconds' ), timer_stop( 0 ) ); ?>\n</pre>\n-->\n\n<?php\n\t\tbreak;\nendswitch;\nendif;\n?>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/upload.php",
    "content": "<?php\n/**\n * Media Library administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( !current_user_can('upload_files') )\n\twp_die( __( 'You do not have permission to upload files.' ) );\n\n$mode = get_user_option( 'media_library_mode', get_current_user_id() ) ? get_user_option( 'media_library_mode', get_current_user_id() ) : 'grid';\n$modes = array( 'grid', 'list' );\n\nif ( isset( $_GET['mode'] ) && in_array( $_GET['mode'], $modes ) ) {\n\t$mode = $_GET['mode'];\n\tupdate_user_option( get_current_user_id(), 'media_library_mode', $mode );\n}\n\nif ( 'grid' === $mode ) {\n\twp_enqueue_media();\n\twp_enqueue_script( 'media-grid' );\n\twp_enqueue_script( 'media' );\n\n\tremove_action( 'admin_head', 'wp_admin_canonical_url' );\n\n\t$q = $_GET;\n\t// let JS handle this\n\tunset( $q['s'] );\n\t$vars = wp_edit_attachments_query_vars( $q );\n\t$ignore = array( 'mode', 'post_type', 'post_status', 'posts_per_page' );\n\tforeach ( $vars as $key => $value ) {\n\t\tif ( ! $value || in_array( $key, $ignore ) ) {\n\t\t\tunset( $vars[ $key ] );\n\t\t}\n\t}\n\n\twp_localize_script( 'media-grid', '_wpMediaGridSettings', array(\n\t\t'adminUrl' => parse_url( self_admin_url(), PHP_URL_PATH ),\n\t\t'queryVars' => (object) $vars\n\t) );\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'\t\t=> 'overview',\n\t\t'title'\t\t=> __( 'Overview' ),\n\t\t'content'\t=>\n\t\t\t'<p>' . __( 'All the files you&#8217;ve uploaded are listed in the Media Library, with the most recent uploads listed first.' ) . '</p>' .\n\t\t\t'<p>' . __( 'You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media.' ) . '</p>' .\n\t\t\t'<p>' . __( 'To delete media items, click the Bulk Select button at the top of the screen. Select any items you wish to delete, then click the Delete Selected button. Clicking the Cancel Selection button takes you back to viewing your media.' ) . '</p>'\n\t) );\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'\t\t=> 'attachment-details',\n\t\t'title'\t\t=> __( 'Attachment Details' ),\n\t\t'content'\t=>\n\t\t\t'<p>' . __( 'Clicking an item will display an Attachment Details dialog, which allows you to preview media and make quick edits. Any changes you make to the attachment details will be automatically saved.' ) . '</p>' .\n\t\t\t'<p>' . __( 'Use the arrow buttons at the top of the dialog, or the left and right arrow keys on your keyboard, to navigate between media items quickly.' ) . '</p>' .\n\t\t\t'<p>' . __( 'You can also delete individual items and access the extended edit screen from the details dialog.' ) . '</p>'\n\t) );\n\n\tget_current_screen()->set_help_sidebar(\n\t\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Media_Library_Screen\" target=\"_blank\">Documentation on Media Library</a>' ) . '</p>' .\n\t\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n\t);\n\n\t$title = __('Media Library');\n\t$parent_file = 'upload.php';\n\n\trequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\t?>\n\t<div class=\"wrap\" id=\"wp-media-grid\" data-search=\"<?php _admin_search_query() ?>\">\n\t\t<h1>\n\t\t<?php\n\t\techo esc_html( $title );\n\t\tif ( current_user_can( 'upload_files' ) ) { ?>\n\t\t\t<a href=\"media-new.php\" class=\"page-title-action\"><?php echo esc_html_x( 'Add New', 'file' ); ?></a><?php\n\t\t}\n\t\t?>\n\t\t</h1>\n\t\t<div class=\"error hide-if-js\">\n\t\t\t<p><?php _e( 'The grid view for the Media Library requires JavaScript. <a href=\"upload.php?mode=list\">Switch to the list view</a>.' ); ?></p>\n\t\t</div>\n\t</div>\n\t<?php\n\tinclude( ABSPATH . 'wp-admin/admin-footer.php' );\n\texit;\n}\n\n$wp_list_table = _get_list_table('WP_Media_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n\n// Handle bulk actions\n$doaction = $wp_list_table->current_action();\n\nif ( $doaction ) {\n\tcheck_admin_referer('bulk-media');\n\n\tif ( 'delete_all' == $doaction ) {\n\t\t$post_ids = $wpdb->get_col( \"SELECT ID FROM $wpdb->posts WHERE post_type='attachment' AND post_status = 'trash'\" );\n\t\t$doaction = 'delete';\n\t} elseif ( isset( $_REQUEST['media'] ) ) {\n\t\t$post_ids = $_REQUEST['media'];\n\t} elseif ( isset( $_REQUEST['ids'] ) ) {\n\t\t$post_ids = explode( ',', $_REQUEST['ids'] );\n\t}\n\n\t$location = 'upload.php';\n\tif ( $referer = wp_get_referer() ) {\n\t\tif ( false !== strpos( $referer, 'upload.php' ) )\n\t\t\t$location = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'message', 'ids', 'posted' ), $referer );\n\t}\n\n\tswitch ( $doaction ) {\n\t\tcase 'detach':\n\t\t\twp_media_attach_action( $_REQUEST['parent_post_id'], 'detach' );\n\t\t\tbreak;\n\n\t\tcase 'attach':\n\t\t\twp_media_attach_action( $_REQUEST['found_post_id'] );\n\t\t\tbreak;\n\n\t\tcase 'trash':\n\t\t\tif ( !isset( $post_ids ) )\n\t\t\t\tbreak;\n\t\t\tforeach ( (array) $post_ids as $post_id ) {\n\t\t\t\tif ( !current_user_can( 'delete_post', $post_id ) )\n\t\t\t\t\twp_die( __( 'You are not allowed to move this item to the Trash.' ) );\n\n\t\t\t\tif ( !wp_trash_post( $post_id ) )\n\t\t\t\t\twp_die( __( 'Error in moving to Trash.' ) );\n\t\t\t}\n\t\t\t$location = add_query_arg( array( 'trashed' => count( $post_ids ), 'ids' => join( ',', $post_ids ) ), $location );\n\t\t\tbreak;\n\t\tcase 'untrash':\n\t\t\tif ( !isset( $post_ids ) )\n\t\t\t\tbreak;\n\t\t\tforeach ( (array) $post_ids as $post_id ) {\n\t\t\t\tif ( !current_user_can( 'delete_post', $post_id ) )\n\t\t\t\t\twp_die( __( 'You are not allowed to move this item out of the Trash.' ) );\n\n\t\t\t\tif ( !wp_untrash_post( $post_id ) )\n\t\t\t\t\twp_die( __( 'Error in restoring from Trash.' ) );\n\t\t\t}\n\t\t\t$location = add_query_arg( 'untrashed', count( $post_ids ), $location );\n\t\t\tbreak;\n\t\tcase 'delete':\n\t\t\tif ( !isset( $post_ids ) )\n\t\t\t\tbreak;\n\t\t\tforeach ( (array) $post_ids as $post_id_del ) {\n\t\t\t\tif ( !current_user_can( 'delete_post', $post_id_del ) )\n\t\t\t\t\twp_die( __( 'You are not allowed to delete this item.' ) );\n\n\t\t\t\tif ( !wp_delete_attachment( $post_id_del ) )\n\t\t\t\t\twp_die( __( 'Error in deleting.' ) );\n\t\t\t}\n\t\t\t$location = add_query_arg( 'deleted', count( $post_ids ), $location );\n\t\t\tbreak;\n\t}\n\n\twp_redirect( $location );\n\texit;\n} elseif ( ! empty( $_GET['_wp_http_referer'] ) ) {\n\t wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );\n\t exit;\n}\n\n$wp_list_table->prepare_items();\n\n$title = __('Media Library');\n$parent_file = 'upload.php';\n\nwp_enqueue_script( 'media' );\n\nadd_screen_option( 'per_page' );\n\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'overview',\n'title'\t\t=> __('Overview'),\n'content'\t=>\n\t'<p>' . __( 'All the files you&#8217;ve uploaded are listed in the Media Library, with the most recent uploads listed first. You can use the Screen Options tab to customize the display of this screen.' ) . '</p>' .\n\t'<p>' . __( 'You can narrow the list by file type/status using the text link filters at the top of the screen. You also can refine the list by date using the dropdown menu above the media table.' ) . '</p>' .\n\t'<p>' . __( 'You can view your media in a simple visual grid or a list with columns. Switch between these views using the icons to the left above the media.' ) . '</p>'\n) );\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'actions-links',\n'title'\t\t=> __('Available Actions'),\n'content'\t=>\n\t'<p>' . __( 'Hovering over a row reveals action links: Edit, Delete Permanently, and View. Clicking Edit or on the media file&#8217;s name displays a simple screen to edit that individual file&#8217;s metadata. Clicking Delete Permanently will delete the file from the media library (as well as from any posts to which it is currently attached). View will take you to the display page for that file.' ) . '</p>'\n) );\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'attaching-files',\n'title'\t\t=> __('Attaching Files'),\n'content'\t=>\n\t'<p>' . __( 'If a media file has not been attached to any post, you will see that in the Attached To column, and can click on Attach File to launch a small popup that will allow you to search for a post and attach the file.' ) . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .\n\t'<p>' . __( '<a href=\"https://codex.wordpress.org/Media_Library_Screen\" target=\"_blank\">Documentation on Media Library</a>' ) . '</p>' .\n\t'<p>' . __( '<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>' ) . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter media items list' ),\n\t'heading_pagination' => __( 'Media items list navigation' ),\n\t'heading_list'       => __( 'Media items list' ),\n) );\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n\n<div class=\"wrap\">\n<h1>\n<?php\necho esc_html( $title );\nif ( current_user_can( 'upload_files' ) ) { ?>\n\t<a href=\"media-new.php\" class=\"page-title-action\"><?php echo esc_html_x('Add New', 'file'); ?></a><?php\n}\nif ( ! empty( $_REQUEST['s'] ) )\n\tprintf( '<span class=\"subtitle\">' . __('Search results for &#8220;%s&#8221;') . '</span>', get_search_query() ); ?>\n</h1>\n\n<?php\n$message = '';\nif ( ! empty( $_GET['posted'] ) ) {\n\t$message = __( 'Media attachment updated.' );\n\t$_SERVER['REQUEST_URI'] = remove_query_arg(array('posted'), $_SERVER['REQUEST_URI']);\n}\n\nif ( ! empty( $_GET['attached'] ) && $attached = absint( $_GET['attached'] ) ) {\n\t$message = sprintf( _n( 'Reattached %d attachment.', 'Reattached %d attachments.', $attached ), $attached );\n\t$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'detach', 'attached' ), $_SERVER['REQUEST_URI'] );\n}\n\nif ( ! empty( $_GET['detach'] ) && $detached = absint( $_GET['detach'] ) ) {\n\t$message = sprintf( _n( 'Detached %d attachment.', 'Detached %d attachments.', $detached ), $detached );\n\t$_SERVER['REQUEST_URI'] = remove_query_arg( array( 'detach', 'attached' ), $_SERVER['REQUEST_URI'] );\n}\n\nif ( ! empty( $_GET['deleted'] ) && $deleted = absint( $_GET['deleted'] ) ) {\n\tif ( 1 == $deleted ) {\n\t\t$message = __( 'Media attachment permanently deleted.' );\n\t} else {\n\t\t$message = _n( '%d media attachment permanently deleted.', '%d media attachments permanently deleted.', $deleted );\n\t}\n\t$message = sprintf( $message, number_format_i18n( $deleted ) );\n\t$_SERVER['REQUEST_URI'] = remove_query_arg(array('deleted'), $_SERVER['REQUEST_URI']);\n}\n\nif ( ! empty( $_GET['trashed'] ) && $trashed = absint( $_GET['trashed'] ) ) {\n\tif ( 1 == $trashed ) {\n\t\t$message = __( 'Media attachment moved to the trash.' );\n\t} else {\n\t\t$message = _n( '%d media attachment moved to the trash.', '%d media attachments moved to the trash.', $trashed );\n\t}\n\t$message = sprintf( $message, number_format_i18n( $trashed ) );\n\t$message .= ' <a href=\"' . esc_url( wp_nonce_url( 'upload.php?doaction=undo&action=untrash&ids='.(isset($_GET['ids']) ? $_GET['ids'] : ''), \"bulk-media\" ) ) . '\">' . __('Undo') . '</a>';\n\t$_SERVER['REQUEST_URI'] = remove_query_arg(array('trashed'), $_SERVER['REQUEST_URI']);\n}\n\nif ( ! empty( $_GET['untrashed'] ) && $untrashed = absint( $_GET['untrashed'] ) ) {\n\tif ( 1 == $untrashed ) {\n\t\t$message = __( 'Media attachment restored from the trash.' );\n\t} else {\n\t\t$message = _n( '%d media attachment restored from the trash.', '%d media attachments restored from the trash.', $untrashed );\n\t}\n\t$message = sprintf( $message, number_format_i18n( $untrashed ) );\n\t$_SERVER['REQUEST_URI'] = remove_query_arg(array('untrashed'), $_SERVER['REQUEST_URI']);\n}\n\n$messages[1] = __( 'Media attachment updated.' );\n$messages[2] = __( 'Media attachment permanently deleted.' );\n$messages[3] = __( 'Error saving media attachment.' );\n$messages[4] = __( 'Media attachment moved to the trash.' ) . ' <a href=\"' . esc_url( wp_nonce_url( 'upload.php?doaction=undo&action=untrash&ids='.(isset($_GET['ids']) ? $_GET['ids'] : ''), \"bulk-media\" ) ) . '\">' . __( 'Undo' ) . '</a>';\n$messages[5] = __( 'Media attachment restored from the trash.' );\n\nif ( ! empty( $_GET['message'] ) && isset( $messages[ $_GET['message'] ] ) ) {\n\t$message = $messages[ $_GET['message'] ];\n\t$_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);\n}\n\nif ( !empty($message) ) { ?>\n<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php echo $message; ?></p></div>\n<?php } ?>\n\n<form id=\"posts-filter\" method=\"get\">\n\n<?php $wp_list_table->views(); ?>\n\n<?php $wp_list_table->display(); ?>\n\n<div id=\"ajax-response\"></div>\n<?php find_posts_div(); ?>\n</form>\n</div>\n\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user/about.php",
    "content": "<?php\n/**\n * User Dashboard About administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.4.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nrequire( ABSPATH . 'wp-admin/about.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user/admin.php",
    "content": "<?php\n/**\n * WordPress User Administration Bootstrap\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\ndefine('WP_USER_ADMIN', true);\n\nrequire_once( dirname(dirname(__FILE__)) . '/admin.php');\n\nif ( ! is_multisite() ) {\n\twp_redirect( admin_url() );\n\texit;\n}\n\n$redirect_user_admin_request = ( ( $current_blog->domain != $current_site->domain ) || ( $current_blog->path != $current_site->path ) );\n/**\n * Filter whether to redirect the request to the User Admin in Multisite.\n *\n * @since 3.2.0\n *\n * @param bool $redirect_user_admin_request Whether the request should be redirected.\n */\n$redirect_user_admin_request = apply_filters( 'redirect_user_admin_request', $redirect_user_admin_request );\nif ( $redirect_user_admin_request ) {\n\twp_redirect( user_admin_url() );\n\texit;\n}\nunset( $redirect_user_admin_request );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user/credits.php",
    "content": "<?php\n/**\n * User Dashboard Credits administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.4.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nrequire( ABSPATH . 'wp-admin/credits.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user/freedoms.php",
    "content": "<?php\n/**\n * User Dashboard Freedoms administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.4.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nrequire( ABSPATH . 'wp-admin/freedoms.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user/index.php",
    "content": "<?php\n/**\n * User Dashboard Administration Screen\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nrequire( ABSPATH . 'wp-admin/index.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user/menu.php",
    "content": "<?php\n/**\n * Build User Administration Menu.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n$menu[2] = array(__('Dashboard'), 'exist', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'dashicons-dashboard');\n\n$menu[4] = array( '', 'exist', 'separator1', '', 'wp-menu-separator' );\n\n$menu[70] = array( __('Profile'), 'exist', 'profile.php', '', 'menu-top menu-icon-users', 'menu-users', 'dashicons-admin-users' );\n\n$menu[99] = array( '', 'exist', 'separator-last', '', 'wp-menu-separator' );\n\n$_wp_real_parent_file['users.php'] = 'profile.php';\n$compat = array();\n$submenu = array();\n\nrequire_once(ABSPATH . 'wp-admin/includes/menu.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user/profile.php",
    "content": "<?php\n/**\n * User Profile Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nrequire( ABSPATH . 'wp-admin/profile.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user/user-edit.php",
    "content": "<?php\n/**\n * Edit user administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n * @since 3.1.0\n */\n\n/** Load WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nrequire( ABSPATH . 'wp-admin/user-edit.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user-edit.php",
    "content": "<?php\n/**\n * Edit user administration panel.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nwp_reset_vars( array( 'action', 'user_id', 'wp_http_referer' ) );\n\n$user_id = (int) $user_id;\n$current_user = wp_get_current_user();\nif ( ! defined( 'IS_PROFILE_PAGE' ) )\n\tdefine( 'IS_PROFILE_PAGE', ( $user_id == $current_user->ID ) );\n\nif ( ! $user_id && IS_PROFILE_PAGE )\n\t$user_id = $current_user->ID;\nelseif ( ! $user_id && ! IS_PROFILE_PAGE )\n\twp_die(__( 'Invalid user ID.' ) );\nelseif ( ! get_userdata( $user_id ) )\n\twp_die( __('Invalid user ID.') );\n\nwp_enqueue_script('user-profile');\n\n$title = IS_PROFILE_PAGE ? __('Profile') : __('Edit User');\nif ( current_user_can('edit_users') && !IS_PROFILE_PAGE )\n\t$submenu_file = 'users.php';\nelse\n\t$submenu_file = 'profile.php';\n\nif ( current_user_can('edit_users') && !is_user_admin() )\n\t$parent_file = 'users.php';\nelse\n\t$parent_file = 'profile.php';\n\n$profile_help = '<p>' . __('Your profile contains information about you (your &#8220;account&#8221;) as well as some personal options related to using WordPress.') . '</p>' .\n\t'<p>' . __('You can change your password, turn on keyboard shortcuts, change the color scheme of your WordPress administration screens, and turn off the WYSIWYG (Visual) editor, among other things. You can hide the Toolbar (formerly called the Admin Bar) from the front end of your site, however it cannot be disabled on the admin screens.') . '</p>' .\n\t'<p>' . __('Your username cannot be changed, but you can use other fields to enter your real name or a nickname, and change which name to display on your posts.') . '</p>' .\n\t'<p>' . __( 'You can log out of other devices, such as your phone or a public computer, by clicking the Log Out Everywhere Else button.' ) . '</p>' .\n\t'<p>' . __('Required fields are indicated; the rest are optional. Profile information will only be displayed if your theme is set up to do so.') . '</p>' .\n\t'<p>' . __('Remember to click the Update Profile button when you are finished.') . '</p>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => $profile_help,\n) );\n\nget_current_screen()->set_help_sidebar(\n    '<p><strong>' . __('For more information:') . '</strong></p>' .\n    '<p>' . __('<a href=\"https://codex.wordpress.org/Users_Your_Profile_Screen\" target=\"_blank\">Documentation on User Profiles</a>') . '</p>' .\n    '<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\n$wp_http_referer = remove_query_arg(array('update', 'delete_count'), $wp_http_referer );\n\n$user_can_edit = current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' );\n\n/**\n * Filter whether to allow administrators on Multisite to edit every user.\n *\n * Enabling the user editing form via this filter also hinges on the user holding\n * the 'manage_network_users' cap, and the logged-in user not matching the user\n * profile open for editing.\n *\n * The filter was introduced to replace the EDIT_ANY_USER constant.\n *\n * @since 3.0.0\n *\n * @param bool $allow Whether to allow editing of any user. Default true.\n */\nif ( is_multisite()\n\t&& ! current_user_can( 'manage_network_users' )\n\t&& $user_id != $current_user->ID\n\t&& ! apply_filters( 'enable_edit_any_user_configuration', true )\n) {\n\twp_die( __( 'You do not have permission to edit this user.' ) );\n}\n\n// Execute confirmed email change. See send_confirmation_on_profile_email().\nif ( is_multisite() && IS_PROFILE_PAGE && isset( $_GET[ 'newuseremail' ] ) && $current_user->ID ) {\n\t$new_email = get_option( $current_user->ID . '_new_email' );\n\tif ( $new_email[ 'hash' ] == $_GET[ 'newuseremail' ] ) {\n\t\t$user = new stdClass;\n\t\t$user->ID = $current_user->ID;\n\t\t$user->user_email = esc_html( trim( $new_email[ 'newemail' ] ) );\n\t\tif ( $wpdb->get_var( $wpdb->prepare( \"SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s\", $current_user->user_login ) ) )\n\t\t\t$wpdb->query( $wpdb->prepare( \"UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s\", $user->user_email, $current_user->user_login ) );\n\t\twp_update_user( $user );\n\t\tdelete_option( $current_user->ID . '_new_email' );\n\t\twp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) );\n\t\tdie();\n\t}\n} elseif ( is_multisite() && IS_PROFILE_PAGE && !empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' == $_GET['dismiss'] ) {\n\tdelete_option( $current_user->ID . '_new_email' );\n\twp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) );\n\tdie();\n}\n\nswitch ($action) {\ncase 'update':\n\ncheck_admin_referer('update-user_' . $user_id);\n\nif ( !current_user_can('edit_user', $user_id) )\n\twp_die(__('You do not have permission to edit this user.'));\n\nif ( IS_PROFILE_PAGE ) {\n\t/**\n\t * Fires before the page loads on the 'Your Profile' editing screen.\n\t *\n\t * The action only fires if the current user is editing their own profile.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param int $user_id The user ID.\n\t */\n\tdo_action( 'personal_options_update', $user_id );\n} else {\n\t/**\n\t * Fires before the page loads on the 'Edit User' screen.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param int $user_id The user ID.\n\t */\n\tdo_action( 'edit_user_profile_update', $user_id );\n}\n\n// Update the email address in signups, if present.\nif ( is_multisite() ) {\n\t$user = get_userdata( $user_id );\n\n\tif ( $user->user_login && isset( $_POST[ 'email' ] ) && is_email( $_POST[ 'email' ] ) && $wpdb->get_var( $wpdb->prepare( \"SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s\", $user->user_login ) ) ) {\n\t\t$wpdb->query( $wpdb->prepare( \"UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s\", $_POST[ 'email' ], $user_login ) );\n\t}\n}\n\n// Update the user.\n$errors = edit_user( $user_id );\n\n// Grant or revoke super admin status if requested.\nif ( is_multisite() && is_network_admin() && !IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && !isset($super_admins) && empty( $_POST['super_admin'] ) == is_super_admin( $user_id ) ) {\n\tempty( $_POST['super_admin'] ) ? revoke_super_admin( $user_id ) : grant_super_admin( $user_id );\n}\n\nif ( !is_wp_error( $errors ) ) {\n\t$redirect = add_query_arg( 'updated', true, get_edit_user_link( $user_id ) );\n\tif ( $wp_http_referer )\n\t\t$redirect = add_query_arg('wp_http_referer', urlencode($wp_http_referer), $redirect);\n\twp_redirect($redirect);\n\texit;\n}\n\ndefault:\n$profileuser = get_user_to_edit($user_id);\n\nif ( !current_user_can('edit_user', $user_id) )\n\twp_die(__('You do not have permission to edit this user.'));\n\n$sessions = WP_Session_Tokens::get_instance( $profileuser->ID );\n\ninclude(ABSPATH . 'wp-admin/admin-header.php');\n?>\n\n<?php if ( !IS_PROFILE_PAGE && is_super_admin( $profileuser->ID ) && current_user_can( 'manage_network_options' ) ) { ?>\n\t<div class=\"updated\"><p><strong><?php _e('Important:'); ?></strong> <?php _e('This user has super admin privileges.'); ?></p></div>\n<?php } ?>\n<?php if ( isset($_GET['updated']) ) : ?>\n<div id=\"message\" class=\"updated notice is-dismissible\">\n\t<?php if ( IS_PROFILE_PAGE ) : ?>\n\t<p><strong><?php _e('Profile updated.') ?></strong></p>\n\t<?php else: ?>\n\t<p><strong><?php _e('User updated.') ?></strong></p>\n\t<?php endif; ?>\n\t<?php if ( $wp_http_referer && !IS_PROFILE_PAGE ) : ?>\n\t<p><a href=\"<?php echo esc_url( $wp_http_referer ); ?>\"><?php _e('&larr; Back to Users'); ?></a></p>\n\t<?php endif; ?>\n</div>\n<?php endif; ?>\n<?php if ( isset( $errors ) && is_wp_error( $errors ) ) : ?>\n<div class=\"error\"><p><?php echo implode( \"</p>\\n<p>\", $errors->get_error_messages() ); ?></p></div>\n<?php endif; ?>\n\n<div class=\"wrap\" id=\"profile-page\">\n<h1>\n<?php\necho esc_html( $title );\nif ( ! IS_PROFILE_PAGE ) {\n\tif ( current_user_can( 'create_users' ) ) { ?>\n\t\t<a href=\"user-new.php\" class=\"page-title-action\"><?php echo esc_html_x( 'Add New', 'user' ); ?></a>\n\t<?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>\n\t\t<a href=\"user-new.php\" class=\"page-title-action\"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a>\n\t<?php }\n} ?>\n</h1>\n<form id=\"your-profile\" action=\"<?php echo esc_url( self_admin_url( IS_PROFILE_PAGE ? 'profile.php' : 'user-edit.php' ) ); ?>\" method=\"post\" novalidate=\"novalidate\"<?php\n\t/**\n\t * Fires inside the your-profile form tag on the user editing screen.\n\t *\n\t * @since 3.0.0\n\t */\n\tdo_action( 'user_edit_form_tag' );\n?>>\n<?php wp_nonce_field('update-user_' . $user_id) ?>\n<?php if ( $wp_http_referer ) : ?>\n\t<input type=\"hidden\" name=\"wp_http_referer\" value=\"<?php echo esc_url($wp_http_referer); ?>\" />\n<?php endif; ?>\n<p>\n<input type=\"hidden\" name=\"from\" value=\"profile\" />\n<input type=\"hidden\" name=\"checkuser_id\" value=\"<?php echo get_current_user_id(); ?>\" />\n</p>\n\n<h2><?php _e( 'Personal Options' ); ?></h2>\n\n<table class=\"form-table\">\n<?php if ( ! ( IS_PROFILE_PAGE && ! $user_can_edit ) ) : ?>\n\t<tr class=\"user-rich-editing-wrap\">\n\t\t<th scope=\"row\"><?php _e( 'Visual Editor' ); ?></th>\n\t\t<td><label for=\"rich_editing\"><input name=\"rich_editing\" type=\"checkbox\" id=\"rich_editing\" value=\"false\" <?php if ( ! empty( $profileuser->rich_editing ) ) checked( 'false', $profileuser->rich_editing ); ?> /> <?php _e( 'Disable the visual editor when writing' ); ?></label></td>\n\t</tr>\n<?php endif; ?>\n<?php if ( count($_wp_admin_css_colors) > 1 && has_action('admin_color_scheme_picker') ) : ?>\n<tr class=\"user-admin-color-wrap\">\n<th scope=\"row\"><?php _e('Admin Color Scheme')?></th>\n<td><?php\n\t/**\n\t * Fires in the 'Admin Color Scheme' section of the user editing screen.\n\t *\n\t * The section is only enabled if a callback is hooked to the action,\n\t * and if there is more than one defined color scheme for the admin.\n\t *\n\t * @since 3.0.0\n\t * @since 3.8.1 Added `$user_id` parameter.\n\t *\n\t * @param int $user_id The user ID.\n\t */\n\tdo_action( 'admin_color_scheme_picker', $user_id );\n?></td>\n</tr>\n<?php\nendif; // $_wp_admin_css_colors\nif ( !( IS_PROFILE_PAGE && !$user_can_edit ) ) : ?>\n<tr class=\"user-comment-shortcuts-wrap\">\n<th scope=\"row\"><?php _e( 'Keyboard Shortcuts' ); ?></th>\n<td><label for=\"comment_shortcuts\"><input type=\"checkbox\" name=\"comment_shortcuts\" id=\"comment_shortcuts\" value=\"true\" <?php if ( ! empty( $profileuser->comment_shortcuts ) ) checked( 'true', $profileuser->comment_shortcuts ); ?> /> <?php _e('Enable keyboard shortcuts for comment moderation.'); ?></label> <?php _e('<a href=\"https://codex.wordpress.org/Keyboard_Shortcuts\" target=\"_blank\">More information</a>'); ?></td>\n</tr>\n<?php endif; ?>\n<tr class=\"show-admin-bar user-admin-bar-front-wrap\">\n<th scope=\"row\"><?php _e( 'Toolbar' ); ?></th>\n<td><fieldset><legend class=\"screen-reader-text\"><span><?php _e('Toolbar') ?></span></legend>\n<label for=\"admin_bar_front\">\n<input name=\"admin_bar_front\" type=\"checkbox\" id=\"admin_bar_front\" value=\"1\"<?php checked( _get_admin_bar_pref( 'front', $profileuser->ID ) ); ?> />\n<?php _e( 'Show Toolbar when viewing site' ); ?></label><br />\n</fieldset>\n</td>\n</tr>\n<?php\n/**\n * Fires at the end of the 'Personal Options' settings table on the user editing screen.\n *\n * @since 2.7.0\n *\n * @param WP_User $profileuser The current WP_User object.\n */\ndo_action( 'personal_options', $profileuser );\n?>\n\n</table>\n<?php\n\tif ( IS_PROFILE_PAGE ) {\n\t\t/**\n\t\t * Fires after the 'Personal Options' settings table on the 'Your Profile' editing screen.\n\t\t *\n\t\t * The action only fires if the current user is editing their own profile.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param WP_User $profileuser The current WP_User object.\n\t\t */\n\t\tdo_action( 'profile_personal_options', $profileuser );\n\t}\n?>\n\n<h2><?php _e( 'Name' ); ?></h2>\n\n<table class=\"form-table\">\n\t<tr class=\"user-user-login-wrap\">\n\t\t<th><label for=\"user_login\"><?php _e('Username'); ?></label></th>\n\t\t<td><input type=\"text\" name=\"user_login\" id=\"user_login\" value=\"<?php echo esc_attr($profileuser->user_login); ?>\" disabled=\"disabled\" class=\"regular-text\" /> <span class=\"description\"><?php _e('Usernames cannot be changed.'); ?></span></td>\n\t</tr>\n\n<?php if ( !IS_PROFILE_PAGE && !is_network_admin() ) : ?>\n<tr class=\"user-role-wrap\"><th><label for=\"role\"><?php _e('Role') ?></label></th>\n<td><select name=\"role\" id=\"role\">\n<?php\n// Compare user role against currently editable roles\n$user_roles = array_intersect( array_values( $profileuser->roles ), array_keys( get_editable_roles() ) );\n$user_role  = reset( $user_roles );\n\n// print the full list of roles with the primary one selected.\nwp_dropdown_roles($user_role);\n\n// print the 'no role' option. Make it selected if the user has no role yet.\nif ( $user_role )\n\techo '<option value=\"\">' . __('&mdash; No role for this site &mdash;') . '</option>';\nelse\n\techo '<option value=\"\" selected=\"selected\">' . __('&mdash; No role for this site &mdash;') . '</option>';\n?>\n</select></td></tr>\n<?php endif; //!IS_PROFILE_PAGE\n\nif ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && !isset($super_admins) ) { ?>\n<tr class=\"user-super-admin-wrap\"><th><?php _e('Super Admin'); ?></th>\n<td>\n<?php if ( $profileuser->user_email != get_site_option( 'admin_email' ) || ! is_super_admin( $profileuser->ID ) ) : ?>\n<p><label><input type=\"checkbox\" id=\"super_admin\" name=\"super_admin\"<?php checked( is_super_admin( $profileuser->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p>\n<?php else : ?>\n<p><?php _e( 'Super admin privileges cannot be removed because this user has the network admin email.' ); ?></p>\n<?php endif; ?>\n</td></tr>\n<?php } ?>\n\n<tr class=\"user-first-name-wrap\">\n\t<th><label for=\"first_name\"><?php _e('First Name') ?></label></th>\n\t<td><input type=\"text\" name=\"first_name\" id=\"first_name\" value=\"<?php echo esc_attr($profileuser->first_name) ?>\" class=\"regular-text\" /></td>\n</tr>\n\n<tr class=\"user-last-name-wrap\">\n\t<th><label for=\"last_name\"><?php _e('Last Name') ?></label></th>\n\t<td><input type=\"text\" name=\"last_name\" id=\"last_name\" value=\"<?php echo esc_attr($profileuser->last_name) ?>\" class=\"regular-text\" /></td>\n</tr>\n\n<tr class=\"user-nickname-wrap\">\n\t<th><label for=\"nickname\"><?php _e('Nickname'); ?> <span class=\"description\"><?php _e('(required)'); ?></span></label></th>\n\t<td><input type=\"text\" name=\"nickname\" id=\"nickname\" value=\"<?php echo esc_attr($profileuser->nickname) ?>\" class=\"regular-text\" /></td>\n</tr>\n\n<tr class=\"user-display-name-wrap\">\n\t<th><label for=\"display_name\"><?php _e('Display name publicly as') ?></label></th>\n\t<td>\n\t\t<select name=\"display_name\" id=\"display_name\">\n\t\t<?php\n\t\t\t$public_display = array();\n\t\t\t$public_display['display_nickname']  = $profileuser->nickname;\n\t\t\t$public_display['display_username']  = $profileuser->user_login;\n\n\t\t\tif ( !empty($profileuser->first_name) )\n\t\t\t\t$public_display['display_firstname'] = $profileuser->first_name;\n\n\t\t\tif ( !empty($profileuser->last_name) )\n\t\t\t\t$public_display['display_lastname'] = $profileuser->last_name;\n\n\t\t\tif ( !empty($profileuser->first_name) && !empty($profileuser->last_name) ) {\n\t\t\t\t$public_display['display_firstlast'] = $profileuser->first_name . ' ' . $profileuser->last_name;\n\t\t\t\t$public_display['display_lastfirst'] = $profileuser->last_name . ' ' . $profileuser->first_name;\n\t\t\t}\n\n\t\t\tif ( !in_array( $profileuser->display_name, $public_display ) ) // Only add this if it isn't duplicated elsewhere\n\t\t\t\t$public_display = array( 'display_displayname' => $profileuser->display_name ) + $public_display;\n\n\t\t\t$public_display = array_map( 'trim', $public_display );\n\t\t\t$public_display = array_unique( $public_display );\n\n\t\t\tforeach ( $public_display as $id => $item ) {\n\t\t?>\n\t\t\t<option <?php selected( $profileuser->display_name, $item ); ?>><?php echo $item; ?></option>\n\t\t<?php\n\t\t\t}\n\t\t?>\n\t\t</select>\n\t</td>\n</tr>\n</table>\n\n<h2><?php _e( 'Contact Info' ); ?></h2>\n\n<table class=\"form-table\">\n<tr class=\"user-email-wrap\">\n\t<th><label for=\"email\"><?php _e('Email'); ?> <span class=\"description\"><?php _e('(required)'); ?></span></label></th>\n\t<td><input type=\"email\" name=\"email\" id=\"email\" value=\"<?php echo esc_attr( $profileuser->user_email ) ?>\" class=\"regular-text ltr\" />\n\t<?php\n\t$new_email = get_option( $current_user->ID . '_new_email' );\n\tif ( $new_email && $new_email['newemail'] != $current_user->user_email && $profileuser->ID == $current_user->ID ) : ?>\n\t<div class=\"updated inline\">\n\t<p><?php\n\t\tprintf(\n\t\t\t__( 'There is a pending change of your email to %1$s. <a href=\"%2$s\">Cancel</a>' ),\n\t\t\t'<code>' . $new_email['newemail'] . '</code>',\n\t\t\tesc_url( self_admin_url( 'profile.php?dismiss=' . $current_user->ID . '_new_email' ) )\n\t); ?></p>\n\t</div>\n\t<?php endif; ?>\n\t</td>\n</tr>\n\n<tr class=\"user-url-wrap\">\n\t<th><label for=\"url\"><?php _e('Website') ?></label></th>\n\t<td><input type=\"url\" name=\"url\" id=\"url\" value=\"<?php echo esc_attr( $profileuser->user_url ) ?>\" class=\"regular-text code\" /></td>\n</tr>\n\n<?php\n\tforeach ( wp_get_user_contact_methods( $profileuser ) as $name => $desc ) {\n?>\n<tr class=\"user-<?php echo $name; ?>-wrap\">\n\t<th><label for=\"<?php echo $name; ?>\">\n\t\t<?php\n\t\t/**\n\t\t * Filter a user contactmethod label.\n\t\t *\n\t\t * The dynamic portion of the filter hook, `$name`, refers to\n\t\t * each of the keys in the contactmethods array.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param string $desc The translatable label for the contactmethod.\n\t\t */\n\t\techo apply_filters( \"user_{$name}_label\", $desc );\n\t\t?>\n\t</label></th>\n\t<td><input type=\"text\" name=\"<?php echo $name; ?>\" id=\"<?php echo $name; ?>\" value=\"<?php echo esc_attr($profileuser->$name) ?>\" class=\"regular-text\" /></td>\n</tr>\n<?php\n\t}\n?>\n</table>\n\n<h2><?php IS_PROFILE_PAGE ? _e( 'About Yourself' ) : _e( 'About the user' ); ?></h2>\n\n<table class=\"form-table\">\n<tr class=\"user-description-wrap\">\n\t<th><label for=\"description\"><?php _e('Biographical Info'); ?></label></th>\n\t<td><textarea name=\"description\" id=\"description\" rows=\"5\" cols=\"30\"><?php echo $profileuser->description; // textarea_escaped ?></textarea>\n\t<p class=\"description\"><?php _e('Share a little biographical information to fill out your profile. This may be shown publicly.'); ?></p></td>\n</tr>\n\n<?php if ( get_option( 'show_avatars' ) ) : ?>\n<tr class=\"user-profile-picture\">\n\t<th><?php _e( 'Profile Picture' ); ?></th>\n\t<td>\n\t\t<?php echo get_avatar( $user_id ); ?>\n\t\t<p class=\"description\"><?php\n\t\t\tif ( IS_PROFILE_PAGE ) {\n\t\t\t\t/* translators: %s: Gravatar URL */\n\t\t\t\t$description = sprintf( __( 'You can change your profile picture on <a href=\"%s\">Gravatar</a>.' ),\n\t\t\t\t\t__( 'https://en.gravatar.com/' )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t$description = '';\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter the user profile picture description displayed under the Gravatar.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param string $description The description that will be printed.\n\t\t\t */\n\t\t\techo apply_filters( 'user_profile_picture_description', $description );\n\t\t?></p>\n\t</td>\n</tr>\n<?php endif; ?>\n\n<?php\n/**\n * Filter the display of the password fields.\n *\n * @since 1.5.1\n * @since 2.8.0 Added the `$profileuser` parameter.\n * @since 4.4.0 Now evaluated only in user-edit.php.\n *\n * @param bool    $show        Whether to show the password fields. Default true.\n * @param WP_User $profileuser User object for the current user to edit.\n */\nif ( $show_password_fields = apply_filters( 'show_password_fields', true, $profileuser ) ) :\n?>\n</table>\n\n<h2><?php _e( 'Account Management' ); ?></h2>\n<table class=\"form-table\">\n<tr id=\"password\" class=\"user-pass1-wrap\">\n\t<th><label for=\"pass1\"><?php _e( 'New Password' ); ?></label></th>\n\t<td>\n\t\t<input class=\"hidden\" value=\" \" /><!-- #24364 workaround -->\n\t\t<button type=\"button\" class=\"button button-secondary wp-generate-pw hide-if-no-js\"><?php _e( 'Generate Password' ); ?></button>\n\t\t<div class=\"wp-pwd hide-if-js\">\n\t\t\t<span class=\"password-input-wrapper\">\n\t\t\t\t<input type=\"password\" name=\"pass1\" id=\"pass1\" class=\"regular-text\" value=\"\" autocomplete=\"off\" data-pw=\"<?php echo esc_attr( wp_generate_password( 24 ) ); ?>\" aria-describedby=\"pass-strength-result\" />\n\t\t\t</span>\n\t\t\t<button type=\"button\" class=\"button button-secondary wp-hide-pw hide-if-no-js\" data-toggle=\"0\" aria-label=\"<?php esc_attr_e( 'Hide password' ); ?>\">\n\t\t\t\t<span class=\"dashicons dashicons-hidden\"></span>\n\t\t\t\t<span class=\"text\"><?php _e( 'Hide' ); ?></span>\n\t\t\t</button>\n\t\t\t<button type=\"button\" class=\"button button-secondary wp-cancel-pw hide-if-no-js\" data-toggle=\"0\" aria-label=\"<?php esc_attr_e( 'Cancel password change' ); ?>\">\n\t\t\t\t<span class=\"text\"><?php _e( 'Cancel' ); ?></span>\n\t\t\t</button>\n\t\t\t<div style=\"display:none\" id=\"pass-strength-result\" aria-live=\"polite\"></div>\n\t\t</div>\n\t</td>\n</tr>\n<tr class=\"user-pass2-wrap hide-if-js\">\n\t<th scope=\"row\"><label for=\"pass2\"><?php _e( 'Repeat New Password' ); ?></label></th>\n\t<td>\n\t<input name=\"pass2\" type=\"password\" id=\"pass2\" class=\"regular-text\" value=\"\" autocomplete=\"off\" />\n\t<p class=\"description\"><?php _e( 'Type your new password again.' ); ?></p>\n\t</td>\n</tr>\n<tr class=\"pw-weak\">\n\t<th><?php _e( 'Confirm Password' ); ?></th>\n\t<td>\n\t\t<label>\n\t\t\t<input type=\"checkbox\" name=\"pw_weak\" class=\"pw-checkbox\" />\n\t\t\t<?php _e( 'Confirm use of weak password' ); ?>\n\t\t</label>\n\t</td>\n</tr>\n<?php endif; ?>\n\n<?php\nif ( IS_PROFILE_PAGE && count( $sessions->get_all() ) === 1 ) : ?>\n\t<tr class=\"user-sessions-wrap hide-if-no-js\">\n\t\t<th><?php _e( 'Sessions' ); ?></th>\n\t\t<td aria-live=\"assertive\">\n\t\t\t<div class=\"destroy-sessions\"><button type=\"button\" disabled class=\"button button-secondary\"><?php _e( 'Log Out Everywhere Else' ); ?></button></div>\n\t\t\t<p class=\"description\">\n\t\t\t\t<?php _e( 'You are only logged in at this location.' ); ?>\n\t\t\t</p>\n\t\t</td>\n\t</tr>\n<?php elseif ( IS_PROFILE_PAGE && count( $sessions->get_all() ) > 1 ) : ?>\n\t<tr class=\"user-sessions-wrap hide-if-no-js\">\n\t\t<th><?php _e( 'Sessions' ); ?></th>\n\t\t<td aria-live=\"assertive\">\n\t\t\t<div class=\"destroy-sessions\"><button type=\"button\" class=\"button button-secondary\" id=\"destroy-sessions\"><?php _e( 'Log Out Everywhere Else' ); ?></button></div>\n\t\t\t<p class=\"description\">\n\t\t\t\t<?php _e( 'Did you lose your phone or leave your account logged in at a public computer? You can log out everywhere else, and stay logged in here.' ); ?>\n\t\t\t</p>\n\t\t</td>\n\t</tr>\n<?php elseif ( ! IS_PROFILE_PAGE && $sessions->get_all() ) : ?>\n\t<tr class=\"user-sessions-wrap hide-if-no-js\">\n\t\t<th><?php _e( 'Sessions' ); ?></th>\n\t\t<td>\n\t\t\t<p><button type=\"button\" class=\"button button-secondary\" id=\"destroy-sessions\"><?php _e( 'Log Out Everywhere' ); ?></button></p>\n\t\t\t<p class=\"description\">\n\t\t\t\t<?php\n\t\t\t\t/* translators: 1: User's display name. */\n\t\t\t\tprintf( __( 'Log %s out of all locations.' ), $profileuser->display_name );\n\t\t\t\t?>\n\t\t\t</p>\n\t\t</td>\n\t</tr>\n<?php endif; ?>\n\n</table>\n\n<?php\n\tif ( IS_PROFILE_PAGE ) {\n\t\t/**\n\t\t * Fires after the 'About Yourself' settings table on the 'Your Profile' editing screen.\n\t\t *\n\t\t * The action only fires if the current user is editing their own profile.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param WP_User $profileuser The current WP_User object.\n\t\t */\n\t\tdo_action( 'show_user_profile', $profileuser );\n\t} else {\n\t\t/**\n\t\t * Fires after the 'About the User' settings table on the 'Edit User' screen.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param WP_User $profileuser The current WP_User object.\n\t\t */\n\t\tdo_action( 'edit_user_profile', $profileuser );\n\t}\n?>\n\n<?php\n/**\n * Filter whether to display additional capabilities for the user.\n *\n * The 'Additional Capabilities' section will only be enabled if\n * the number of the user's capabilities exceeds their number of\n * roles.\n *\n * @since 2.8.0\n *\n * @param bool    $enable      Whether to display the capabilities. Default true.\n * @param WP_User $profileuser The current WP_User object.\n */\nif ( count( $profileuser->caps ) > count( $profileuser->roles )\n\t&& apply_filters( 'additional_capabilities_display', true, $profileuser )\n) : ?>\n<h2><?php _e( 'Additional Capabilities' ); ?></h2>\n<table class=\"form-table\">\n<tr class=\"user-capabilities-wrap\">\n\t<th scope=\"row\"><?php _e( 'Capabilities' ); ?></th>\n\t<td>\n<?php\n\t$output = '';\n\tforeach ( $profileuser->caps as $cap => $value ) {\n\t\tif ( ! $wp_roles->is_role( $cap ) ) {\n\t\t\tif ( '' != $output )\n\t\t\t\t$output .= ', ';\n\t\t\t$output .= $value ? $cap : sprintf( __( 'Denied: %s' ), $cap );\n\t\t}\n\t}\n\techo $output;\n?>\n\t</td>\n</tr>\n</table>\n<?php endif; ?>\n\n<input type=\"hidden\" name=\"action\" value=\"update\" />\n<input type=\"hidden\" name=\"user_id\" id=\"user_id\" value=\"<?php echo esc_attr($user_id); ?>\" />\n\n<?php submit_button( IS_PROFILE_PAGE ? __('Update Profile') : __('Update User') ); ?>\n\n</form>\n</div>\n<?php\nbreak;\n}\n?>\n<script type=\"text/javascript\">\n\tif (window.location.hash == '#password') {\n\t\tdocument.getElementById('pass1').focus();\n\t}\n</script>\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/user-new.php",
    "content": "<?php\n/**\n * New User Administration Screen.\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( is_multisite() ) {\n\tif ( ! current_user_can( 'create_users' ) && ! current_user_can( 'promote_users' ) ) {\n\t\twp_die(\n\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t'<p>' . __( 'You do not have sufficient permissions to add users to this network.' ) . '</p>',\n\t\t\t403\n\t\t);\n\t}\n} elseif ( ! current_user_can( 'create_users' ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to create users.' ) . '</p>',\n\t\t403\n\t);\n}\n\nif ( is_multisite() ) {\n\tadd_filter( 'wpmu_signup_user_notification_email', 'admin_created_user_email' );\n}\n\nif ( isset($_REQUEST['action']) && 'adduser' == $_REQUEST['action'] ) {\n\tcheck_admin_referer( 'add-user', '_wpnonce_add-user' );\n\n\t$user_details = null;\n\t$user_email = wp_unslash( $_REQUEST['email'] );\n\tif ( false !== strpos( $user_email, '@' ) ) {\n\t\t$user_details = get_user_by( 'email', $user_email );\n\t} else {\n\t\tif ( is_super_admin() ) {\n\t\t\t$user_details = get_user_by( 'login', $user_email );\n\t\t} else {\n\t\t\twp_redirect( add_query_arg( array('update' => 'enter_email'), 'user-new.php' ) );\n\t\t\tdie();\n\t\t}\n\t}\n\n\tif ( !$user_details ) {\n\t\twp_redirect( add_query_arg( array('update' => 'does_not_exist'), 'user-new.php' ) );\n\t\tdie();\n\t}\n\n\tif ( ! current_user_can( 'promote_user', $user_details->ID ) ) {\n\t\twp_die(\n\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t'<p>' . __( 'You do not have sufficient permissions to add users to this network.' ) . '</p>',\n\t\t\t403\n\t\t);\n\t}\n\n\t// Adding an existing user to this blog\n\t$new_user_email = $user_details->user_email;\n\t$redirect = 'user-new.php';\n\t$username = $user_details->user_login;\n\t$user_id = $user_details->ID;\n\tif ( ( $username != null && !is_super_admin( $user_id ) ) && ( array_key_exists($blog_id, get_blogs_of_user($user_id)) ) ) {\n\t\t$redirect = add_query_arg( array('update' => 'addexisting'), 'user-new.php' );\n\t} else {\n\t\tif ( isset( $_POST[ 'noconfirmation' ] ) && current_user_can( 'manage_network_users' ) ) {\n\t\t\tadd_existing_user_to_blog( array( 'user_id' => $user_id, 'role' => $_REQUEST[ 'role' ] ) );\n\t\t\t$redirect = add_query_arg( array('update' => 'addnoconfirmation'), 'user-new.php' );\n\t\t} else {\n\t\t\t$newuser_key = substr( md5( $user_id ), 0, 5 );\n\t\t\tadd_option( 'new_user_' . $newuser_key, array( 'user_id' => $user_id, 'email' => $user_details->user_email, 'role' => $_REQUEST[ 'role' ] ) );\n\n\t\t\t$roles = get_editable_roles();\n\t\t\t$role = $roles[ $_REQUEST['role'] ];\n\n\t\t\t/**\n\t\t\t * Fires immediately after a user is invited to join a site, but before the notification is sent.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param int    $user_id     The invited user's ID.\n\t\t\t * @param array  $role        The role of invited user.\n\t\t\t * @param string $newuser_key The key of the invitation.\n\t\t\t */\n\t\t\tdo_action( 'invite_user', $user_id, $role, $newuser_key );\n\n\t\t\t/* translators: 1: Site name, 2: site URL, 3: role, 4: activation URL */\n\t\t\t$message = __( 'Hi,\n\nYou\\'ve been invited to join \\'%1$s\\' at\n%2$s with the role of %3$s.\n\nPlease click the following link to confirm the invite:\n%4$s' );\n\t\t\twp_mail( $new_user_email, sprintf( __( '[%s] Joining confirmation' ), wp_specialchars_decode( get_option( 'blogname' ) ) ), sprintf( $message, get_option( 'blogname' ), home_url(), wp_specialchars_decode( translate_user_role( $role['name'] ) ), home_url( \"/newbloguser/$newuser_key/\" ) ) );\n\t\t\t$redirect = add_query_arg( array('update' => 'add'), 'user-new.php' );\n\t\t}\n\t}\n\twp_redirect( $redirect );\n\tdie();\n} elseif ( isset($_REQUEST['action']) && 'createuser' == $_REQUEST['action'] ) {\n\tcheck_admin_referer( 'create-user', '_wpnonce_create-user' );\n\n\tif ( ! current_user_can( 'create_users' ) ) {\n\t\twp_die(\n\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t'<p>' . __( 'You are not allowed to create users.' ) . '</p>',\n\t\t\t403\n\t\t);\n\t}\n\n\tif ( ! is_multisite() ) {\n\t\t$user_id = edit_user();\n\n\t\tif ( is_wp_error( $user_id ) ) {\n\t\t\t$add_user_errors = $user_id;\n\t\t} else {\n\t\t\tif ( current_user_can( 'list_users' ) )\n\t\t\t\t$redirect = 'users.php?update=add&id=' . $user_id;\n\t\t\telse\n\t\t\t\t$redirect = add_query_arg( 'update', 'add', 'user-new.php' );\n\t\t\twp_redirect( $redirect );\n\t\t\tdie();\n\t\t}\n\t} else {\n\t\t// Adding a new user to this site\n\t\t$new_user_email = wp_unslash( $_REQUEST['email'] );\n\t\t$user_details = wpmu_validate_user_signup( $_REQUEST['user_login'], $new_user_email );\n\t\tif ( is_wp_error( $user_details[ 'errors' ] ) && !empty( $user_details[ 'errors' ]->errors ) ) {\n\t\t\t$add_user_errors = $user_details[ 'errors' ];\n\t\t} else {\n\t\t\t/**\n\t\t\t * Filter the user_login, also known as the username, before it is added to the site.\n\t\t\t *\n\t\t\t * @since 2.0.3\n\t\t\t *\n\t\t\t * @param string $user_login The sanitized username.\n\t\t\t */\n\t\t\t$new_user_login = apply_filters( 'pre_user_login', sanitize_user( wp_unslash( $_REQUEST['user_login'] ), true ) );\n\t\t\tif ( isset( $_POST[ 'noconfirmation' ] ) && current_user_can( 'manage_network_users' ) ) {\n\t\t\t\tadd_filter( 'wpmu_signup_user_notification', '__return_false' ); // Disable confirmation email\n\t\t\t\tadd_filter( 'wpmu_welcome_user_notification', '__return_false' ); // Disable welcome email\n\t\t\t}\n\t\t\twpmu_signup_user( $new_user_login, $new_user_email, array( 'add_to_blog' => $wpdb->blogid, 'new_role' => $_REQUEST['role'] ) );\n\t\t\tif ( isset( $_POST[ 'noconfirmation' ] ) && current_user_can( 'manage_network_users' ) ) {\n\t\t\t\t$key = $wpdb->get_var( $wpdb->prepare( \"SELECT activation_key FROM {$wpdb->signups} WHERE user_login = %s AND user_email = %s\", $new_user_login, $new_user_email ) );\n\t\t\t\twpmu_activate_signup( $key );\n\t\t\t\t$redirect = add_query_arg( array('update' => 'addnoconfirmation'), 'user-new.php' );\n\t\t\t} else {\n\t\t\t\t$redirect = add_query_arg( array('update' => 'newuserconfirmation'), 'user-new.php' );\n\t\t\t}\n\t\t\twp_redirect( $redirect );\n\t\t\tdie();\n\t\t}\n\t}\n}\n\n$title = __('Add New User');\n$parent_file = 'users.php';\n\n$do_both = false;\nif ( is_multisite() && current_user_can('promote_users') && current_user_can('create_users') )\n\t$do_both = true;\n\n$help = '<p>' . __('To add a new user to your site, fill in the form on this screen and click the Add New User button at the bottom.') . '</p>';\n\nif ( is_multisite() ) {\n\t$help .= '<p>' . __('Because this is a multisite installation, you may add accounts that already exist on the Network by specifying a username or email, and defining a role. For more options, such as specifying a password, you have to be a Network Administrator and use the hover link under an existing user&#8217;s name to Edit the user profile under Network Admin > All Users.') . '</p>' .\n\t'<p>' . __('New users will receive an email letting them know they&#8217;ve been added as a user for your site. This email will also contain their password. Check the box if you don&#8217;t want the user to receive a welcome email.') . '</p>';\n} else {\n\t$help .= '<p>' . __('You must assign a password to the new user, which they can change after logging in. The username, however, cannot be changed.') . '</p>' .\n\t'<p>' . __('New users will receive an email letting them know they&#8217;ve been added as a user for your site. By default, this email will also contain their password. Uncheck the box if you don&#8217;t want the password to be included in the welcome email.') . '</p>';\n}\n\n$help .= '<p>' . __('Remember to click the Add New User button at the bottom of this screen when you are finished.') . '</p>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => $help,\n) );\n\nget_current_screen()->add_help_tab( array(\n'id'      => 'user-roles',\n'title'   => __('User Roles'),\n'content' => '<p>' . __('Here is a basic overview of the different user roles and the permissions associated with each one:') . '</p>' .\n\t\t\t\t'<ul>' .\n\t\t\t\t'<li>' . __('Subscribers can read comments/comment/receive newsletters, etc. but cannot create regular site content.') . '</li>' .\n\t\t\t\t'<li>' . __('Contributors can write and manage their posts but not publish posts or upload media files.') . '</li>' .\n\t\t\t\t'<li>' . __('Authors can publish and manage their own posts, and are able to upload files.') . '</li>' .\n\t\t\t\t'<li>' . __('Editors can publish posts, manage posts as well as manage other people&#8217;s posts, etc.') . '</li>' .\n\t\t\t\t'<li>' . __('Administrators have access to all the administration features.') . '</li>' .\n\t\t\t\t'</ul>'\n) );\n\nget_current_screen()->set_help_sidebar(\n    '<p><strong>' . __('For more information:') . '</strong></p>' .\n    '<p>' . __('<a href=\"https://codex.wordpress.org/Users_Add_New_Screen\" target=\"_blank\">Documentation on Adding New Users</a>') . '</p>' .\n    '<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nwp_enqueue_script('wp-ajax-response');\nwp_enqueue_script( 'user-profile' );\n\n/**\n * Filter whether to enable user auto-complete for non-super admins in Multisite.\n *\n * @since 3.4.0\n *\n * @param bool $enable Whether to enable auto-complete for non-super admins. Default false.\n */\nif ( is_multisite() && current_user_can( 'promote_users' ) && ! wp_is_large_network( 'users' )\n\t&& ( is_super_admin() || apply_filters( 'autocomplete_users_for_site_admins', false ) )\n) {\n\twp_enqueue_script( 'user-suggest' );\n}\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' );\n\nif ( isset($_GET['update']) ) {\n\t$messages = array();\n\tif ( is_multisite() ) {\n\t\tswitch ( $_GET['update'] ) {\n\t\t\tcase \"newuserconfirmation\":\n\t\t\t\t$messages[] = __('Invitation email sent to new user. A confirmation link must be clicked before their account is created.');\n\t\t\t\tbreak;\n\t\t\tcase \"add\":\n\t\t\t\t$messages[] = __('Invitation email sent to user. A confirmation link must be clicked for them to be added to your site.');\n\t\t\t\tbreak;\n\t\t\tcase \"addnoconfirmation\":\n\t\t\t\t$messages[] = __('User has been added to your site.');\n\t\t\t\tbreak;\n\t\t\tcase \"addexisting\":\n\t\t\t\t$messages[] = __('That user is already a member of this site.');\n\t\t\t\tbreak;\n\t\t\tcase \"does_not_exist\":\n\t\t\t\t$messages[] = __('The requested user does not exist.');\n\t\t\t\tbreak;\n\t\t\tcase \"enter_email\":\n\t\t\t\t$messages[] = __('Please enter a valid email address.');\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\tif ( 'add' == $_GET['update'] )\n\t\t\t$messages[] = __('User added.');\n\t}\n}\n?>\n<div class=\"wrap\">\n<h1 id=\"add-new-user\"><?php\nif ( current_user_can( 'create_users' ) ) {\n\techo _x( 'Add New User', 'user' );\n} elseif ( current_user_can( 'promote_users' ) ) {\n\techo _x( 'Add Existing User', 'user' );\n} ?>\n</h1>\n\n<?php if ( isset($errors) && is_wp_error( $errors ) ) : ?>\n\t<div class=\"error\">\n\t\t<ul>\n\t\t<?php\n\t\t\tforeach ( $errors->get_error_messages() as $err )\n\t\t\t\techo \"<li>$err</li>\\n\";\n\t\t?>\n\t\t</ul>\n\t</div>\n<?php endif;\n\nif ( ! empty( $messages ) ) {\n\tforeach ( $messages as $msg )\n\t\techo '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . $msg . '</p></div>';\n} ?>\n\n<?php if ( isset($add_user_errors) && is_wp_error( $add_user_errors ) ) : ?>\n\t<div class=\"error\">\n\t\t<?php\n\t\t\tforeach ( $add_user_errors->get_error_messages() as $message )\n\t\t\t\techo \"<p>$message</p>\";\n\t\t?>\n\t</div>\n<?php endif; ?>\n<div id=\"ajax-response\"></div>\n\n<?php\nif ( is_multisite() ) {\n\tif ( $do_both )\n\t\techo '<h2 id=\"add-existing-user\">' . __( 'Add Existing User' ) . '</h2>';\n\tif ( !is_super_admin() ) {\n\t\techo '<p>' . __( 'Enter the email address of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '</p>';\n\t\t$label = __('Email');\n\t\t$type  = 'email';\n\t} else {\n\t\techo '<p>' . __( 'Enter the email address or username of an existing user on this network to invite them to this site. That person will be sent an email asking them to confirm the invite.' ) . '</p>';\n\t\t$label = __('Email or Username');\n\t\t$type  = 'text';\n\t}\n?>\n<form method=\"post\" name=\"adduser\" id=\"adduser\" class=\"validate\" novalidate=\"novalidate\"<?php\n\t/**\n\t * Fires inside the adduser form tag.\n\t *\n\t * @since 3.0.0\n\t */\n\tdo_action( 'user_new_form_tag' );\n?>>\n<input name=\"action\" type=\"hidden\" value=\"adduser\" />\n<?php wp_nonce_field( 'add-user', '_wpnonce_add-user' ) ?>\n\n<table class=\"form-table\">\n\t<tr class=\"form-field form-required\">\n\t\t<th scope=\"row\"><label for=\"adduser-email\"><?php echo $label; ?></label></th>\n\t\t<td><input name=\"email\" type=\"<?php echo $type; ?>\" id=\"adduser-email\" class=\"wp-suggest-user\" value=\"\" /></td>\n\t</tr>\n\t<tr class=\"form-field\">\n\t\t<th scope=\"row\"><label for=\"adduser-role\"><?php _e('Role'); ?></label></th>\n\t\t<td><select name=\"role\" id=\"adduser-role\">\n\t\t\t<?php wp_dropdown_roles( get_option('default_role') ); ?>\n\t\t\t</select>\n\t\t</td>\n\t</tr>\n<?php if ( current_user_can( 'manage_network_users' ) ) { ?>\n\t<tr>\n\t\t<th scope=\"row\"><label for=\"adduser-noconfirmation\"><?php _e('Skip Confirmation Email') ?></label></th>\n\t\t<td><label for=\"adduser-noconfirmation\"><input type=\"checkbox\" name=\"noconfirmation\" id=\"adduser-noconfirmation\" value=\"1\" /> <?php _e( 'Add the user without sending an email that requires their confirmation.' ); ?></label></td>\n\t</tr>\n<?php } ?>\n</table>\n<?php\n/**\n * Fires at the end of the new user form.\n *\n * Passes a contextual string to make both types of new user forms\n * uniquely targetable. Contexts are 'add-existing-user' (Multisite),\n * and 'add-new-user' (single site and network admin).\n *\n * @since 3.7.0\n *\n * @param string $type A contextual string specifying which type of new user form the hook follows.\n */\ndo_action( 'user_new_form', 'add-existing-user' );\n?>\n<?php submit_button( __( 'Add Existing User' ), 'primary', 'adduser', true, array( 'id' => 'addusersub' ) ); ?>\n</form>\n<?php\n} // is_multisite()\n\nif ( current_user_can( 'create_users') ) {\n\tif ( $do_both )\n\t\techo '<h2 id=\"create-new-user\">' . __( 'Add New User' ) . '</h2>';\n?>\n<p><?php _e('Create a brand new user and add them to this site.'); ?></p>\n<form method=\"post\" name=\"createuser\" id=\"createuser\" class=\"validate\" novalidate=\"novalidate\"<?php\n\t/** This action is documented in wp-admin/user-new.php */\n\tdo_action( 'user_new_form_tag' );\n?>>\n<input name=\"action\" type=\"hidden\" value=\"createuser\" />\n<?php wp_nonce_field( 'create-user', '_wpnonce_create-user' ); ?>\n<?php\n// Load up the passed data, else set to a default.\n$creating = isset( $_POST['createuser'] );\n\n$new_user_login = $creating && isset( $_POST['user_login'] ) ? wp_unslash( $_POST['user_login'] ) : '';\n$new_user_firstname = $creating && isset( $_POST['first_name'] ) ? wp_unslash( $_POST['first_name'] ) : '';\n$new_user_lastname = $creating && isset( $_POST['last_name'] ) ? wp_unslash( $_POST['last_name'] ) : '';\n$new_user_email = $creating && isset( $_POST['email'] ) ? wp_unslash( $_POST['email'] ) : '';\n$new_user_uri = $creating && isset( $_POST['url'] ) ? wp_unslash( $_POST['url'] ) : '';\n$new_user_role = $creating && isset( $_POST['role'] ) ? wp_unslash( $_POST['role'] ) : '';\n$new_user_send_notification = $creating && ! isset( $_POST['send_user_notification'] ) ? false : true;\n$new_user_ignore_pass = $creating && isset( $_POST['noconfirmation'] ) ? wp_unslash( $_POST['noconfirmation'] ) : '';\n\n?>\n<table class=\"form-table\">\n\t<tr class=\"form-field form-required\">\n\t\t<th scope=\"row\"><label for=\"user_login\"><?php _e('Username'); ?> <span class=\"description\"><?php _e('(required)'); ?></span></label></th>\n\t\t<td><input name=\"user_login\" type=\"text\" id=\"user_login\" value=\"<?php echo esc_attr( $new_user_login ); ?>\" aria-required=\"true\" autocapitalize=\"none\" autocorrect=\"off\" maxlength=\"60\" /></td>\n\t</tr>\n\t<tr class=\"form-field form-required\">\n\t\t<th scope=\"row\"><label for=\"email\"><?php _e('Email'); ?> <span class=\"description\"><?php _e('(required)'); ?></span></label></th>\n\t\t<td><input name=\"email\" type=\"email\" id=\"email\" value=\"<?php echo esc_attr( $new_user_email ); ?>\" /></td>\n\t</tr>\n<?php if ( !is_multisite() ) { ?>\n\t<tr class=\"form-field\">\n\t\t<th scope=\"row\"><label for=\"first_name\"><?php _e('First Name') ?> </label></th>\n\t\t<td><input name=\"first_name\" type=\"text\" id=\"first_name\" value=\"<?php echo esc_attr($new_user_firstname); ?>\" /></td>\n\t</tr>\n\t<tr class=\"form-field\">\n\t\t<th scope=\"row\"><label for=\"last_name\"><?php _e('Last Name') ?> </label></th>\n\t\t<td><input name=\"last_name\" type=\"text\" id=\"last_name\" value=\"<?php echo esc_attr($new_user_lastname); ?>\" /></td>\n\t</tr>\n\t<tr class=\"form-field\">\n\t\t<th scope=\"row\"><label for=\"url\"><?php _e('Website') ?></label></th>\n\t\t<td><input name=\"url\" type=\"url\" id=\"url\" class=\"code\" value=\"<?php echo esc_attr( $new_user_uri ); ?>\" /></td>\n\t</tr>\n\t<tr class=\"form-field form-required user-pass1-wrap\">\n\t\t<th scope=\"row\">\n\t\t\t<label for=\"pass1\">\n\t\t\t\t<?php _e( 'Password' ); ?>\n\t\t\t\t<span class=\"description hide-if-js\"><?php _e( '(required)' ); ?></span>\n\t\t\t</label>\n\t\t</th>\n\t\t<td>\n\t\t\t<input class=\"hidden\" value=\" \" /><!-- #24364 workaround -->\n\t\t\t<button type=\"button\" class=\"button button-secondary wp-generate-pw hide-if-no-js\"><?php _e( 'Show password' ); ?></button>\n\t\t\t<div class=\"wp-pwd hide-if-js\">\n\t\t\t\t<?php $initial_password = wp_generate_password( 24 ); ?>\n\t\t\t\t<span class=\"password-input-wrapper\">\n\t\t\t\t\t<input type=\"password\" name=\"pass1\" id=\"pass1\" class=\"regular-text\" autocomplete=\"off\" data-reveal=\"1\" data-pw=\"<?php echo esc_attr( $initial_password ); ?>\" aria-describedby=\"pass-strength-result\" />\n\t\t\t\t</span>\n\t\t\t\t<button type=\"button\" class=\"button button-secondary wp-hide-pw hide-if-no-js\" data-toggle=\"0\" aria-label=\"<?php esc_attr_e( 'Hide password' ); ?>\">\n\t\t\t\t\t<span class=\"dashicons dashicons-hidden\"></span>\n\t\t\t\t\t<span class=\"text\"><?php _e( 'Hide' ); ?></span>\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"button button-secondary wp-cancel-pw hide-if-no-js\" data-toggle=\"0\" aria-label=\"<?php esc_attr_e( 'Cancel password change' ); ?>\">\n\t\t\t\t\t<span class=\"text\"><?php _e( 'Cancel' ); ?></span>\n\t\t\t\t</button>\n\t\t\t\t<div style=\"display:none\" id=\"pass-strength-result\" aria-live=\"polite\"></div>\n\t\t\t</div>\n\t\t</td>\n\t</tr>\n\t<tr class=\"form-field form-required user-pass2-wrap hide-if-js\">\n\t\t<th scope=\"row\"><label for=\"pass2\"><?php _e( 'Repeat Password' ); ?> <span class=\"description\"><?php _e( '(required)' ); ?></span></label></th>\n\t\t<td>\n\t\t<input name=\"pass2\" type=\"password\" id=\"pass2\" autocomplete=\"off\" />\n\t\t</td>\n\t</tr>\n\t<tr class=\"pw-weak\">\n\t\t<th><?php _e( 'Confirm Password' ); ?></th>\n\t\t<td>\n\t\t\t<label>\n\t\t\t\t<input type=\"checkbox\" name=\"pw_weak\" class=\"pw-checkbox\" />\n\t\t\t\t<?php _e( 'Confirm use of weak password' ); ?>\n\t\t\t</label>\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<th scope=\"row\"><?php _e( 'Send User Notification' ) ?></th>\n\t\t<td><label for=\"send_user_notification\"><input type=\"checkbox\" name=\"send_user_notification\" id=\"send_user_notification\" value=\"1\" <?php checked( $new_user_send_notification ); ?> /> <?php _e( 'Send the new user an email about their account.' ); ?></label></td>\n\t</tr>\n<?php } // !is_multisite ?>\n\t<tr class=\"form-field\">\n\t\t<th scope=\"row\"><label for=\"role\"><?php _e('Role'); ?></label></th>\n\t\t<td><select name=\"role\" id=\"role\">\n\t\t\t<?php\n\t\t\tif ( !$new_user_role )\n\t\t\t\t$new_user_role = !empty($current_role) ? $current_role : get_option('default_role');\n\t\t\twp_dropdown_roles($new_user_role);\n\t\t\t?>\n\t\t\t</select>\n\t\t</td>\n\t</tr>\n\t<?php if ( is_multisite() && current_user_can( 'manage_network_users' ) ) { ?>\n\t<tr>\n\t\t<th scope=\"row\"><label for=\"noconfirmation\"><?php _e('Skip Confirmation Email') ?></label></th>\n\t\t<td><label for=\"noconfirmation\"><input type=\"checkbox\" name=\"noconfirmation\" id=\"noconfirmation\" value=\"1\" <?php checked( $new_user_ignore_pass ); ?> /> <?php _e( 'Add the user without sending an email that requires their confirmation.' ); ?></label></td>\n\t</tr>\n\t<?php } ?>\n</table>\n\n<?php\n/** This action is documented in wp-admin/user-new.php */\ndo_action( 'user_new_form', 'add-new-user' );\n?>\n\n<?php submit_button( __( 'Add New User' ), 'primary', 'createuser', true, array( 'id' => 'createusersub' ) ); ?>\n\n</form>\n<?php } // current_user_can('create_users') ?>\n</div>\n<?php\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/users.php",
    "content": "<?php\n/**\n * User administration panel\n *\n * @package WordPress\n * @subpackage Administration\n * @since 1.0.0\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\nif ( ! current_user_can( 'list_users' ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to browse users.' ) . '</p>',\n\t\t403\n\t);\n}\n\n$wp_list_table = _get_list_table('WP_Users_List_Table');\n$pagenum = $wp_list_table->get_pagenum();\n$title = __('Users');\n$parent_file = 'users.php';\n\nadd_screen_option( 'per_page' );\n\n// contextual help - choose Help on the top right of admin panel to preview this.\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'overview',\n\t'title'   => __('Overview'),\n\t'content' => '<p>' . __('This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role.') . '</p>' .\n\t\t\t\t '<p>' . __('To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section.') . '</p>'\n) ) ;\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'screen-display',\n\t'title'   => __('Screen Display'),\n\t'content' => '<p>' . __('You can customize the display of this screen in a number of ways:') . '</p>' .\n\t\t\t\t\t'<ul>' .\n\t\t\t\t\t'<li>' . __('You can hide/display columns based on your needs and decide how many users to list per screen using the Screen Options tab.') . '</li>' .\n\t\t\t\t\t'<li>' . __('You can filter the list of users by User Role using the text links in the upper left to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed.') . '</li>' .\n\t\t\t\t\t'<li>' . __('You can view all posts made by a user by clicking on the number under the Posts column.') . '</li>' .\n\t\t\t\t\t'</ul>'\n) );\n\n$help = '<p>' . __('Hovering over a row in the users list will display action links that allow you to manage users. You can perform the following actions:') . '</p>' .\n\t'<ul>' .\n\t'<li>' . __('Edit takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username.') . '</li>';\n\nif ( is_multisite() )\n\t$help .= '<li>' . __( 'Remove allows you to remove a user from your site. It does not delete their content. You can also remove multiple users at once by using Bulk Actions.' ) . '</li>';\nelse\n\t$help .= '<li>' . __( 'Delete brings you to the Delete Users screen for confirmation, where you can permanently remove a user from your site and delete their content. You can also delete multiple users at once by using Bulk Actions.' ) . '</li>';\n\n$help .= '</ul>';\n\nget_current_screen()->add_help_tab( array(\n\t'id'      => 'actions',\n\t'title'   => __('Actions'),\n\t'content' => $help,\n) );\nunset( $help );\n\nget_current_screen()->set_help_sidebar(\n    '<p><strong>' . __('For more information:') . '</strong></p>' .\n    '<p>' . __('<a href=\"https://codex.wordpress.org/Users_Screen\" target=\"_blank\">Documentation on Managing Users</a>') . '</p>' .\n    '<p>' . __('<a href=\"https://codex.wordpress.org/Roles_and_Capabilities\" target=\"_blank\">Descriptions of Roles and Capabilities</a>') . '</p>' .\n    '<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nget_current_screen()->set_screen_reader_content( array(\n\t'heading_views'      => __( 'Filter users list' ),\n\t'heading_pagination' => __( 'Users list navigation' ),\n\t'heading_list'       => __( 'Users list' ),\n) );\n\nif ( empty($_REQUEST) ) {\n\t$referer = '<input type=\"hidden\" name=\"wp_http_referer\" value=\"'. esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) ) . '\" />';\n} elseif ( isset($_REQUEST['wp_http_referer']) ) {\n\t$redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count'), wp_unslash( $_REQUEST['wp_http_referer'] ) );\n\t$referer = '<input type=\"hidden\" name=\"wp_http_referer\" value=\"' . esc_attr($redirect) . '\" />';\n} else {\n\t$redirect = 'users.php';\n\t$referer = '';\n}\n\n$update = '';\n\nswitch ( $wp_list_table->current_action() ) {\n\n/* Bulk Dropdown menu Role changes */\ncase 'promote':\n\tcheck_admin_referer('bulk-users');\n\n\tif ( ! current_user_can( 'promote_users' ) )\n\t\twp_die( __( 'You can&#8217;t edit that user.' ) );\n\n\tif ( empty($_REQUEST['users']) ) {\n\t\twp_redirect($redirect);\n\t\texit();\n\t}\n\n\t$editable_roles = get_editable_roles();\n\t$role = false;\n\tif ( ! empty( $_REQUEST['new_role2'] ) ) {\n\t\t$role = $_REQUEST['new_role2'];\n\t} elseif ( ! empty( $_REQUEST['new_role'] ) ) {\n\t\t$role = $_REQUEST['new_role'];\n\t}\n\n\tif ( ! $role || empty( $editable_roles[ $role ] ) ) {\n\t\twp_die( __( 'You can&#8217;t give users that role.' ) );\n\t}\n\n\t$userids = $_REQUEST['users'];\n\t$update = 'promote';\n\tforeach ( $userids as $id ) {\n\t\t$id = (int) $id;\n\n\t\tif ( ! current_user_can('promote_user', $id) )\n\t\t\twp_die(__('You can&#8217;t edit that user.'));\n\t\t// The new role of the current user must also have the promote_users cap or be a multisite super admin\n\t\tif ( $id == $current_user->ID && ! $wp_roles->role_objects[ $role ]->has_cap('promote_users')\n\t\t\t&& ! ( is_multisite() && is_super_admin() ) ) {\n\t\t\t\t$update = 'err_admin_role';\n\t\t\t\tcontinue;\n\t\t}\n\n\t\t// If the user doesn't already belong to the blog, bail.\n\t\tif ( is_multisite() && !is_user_member_of_blog( $id ) ) {\n\t\t\twp_die(\n\t\t\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t\t\t'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',\n\t\t\t\t403\n\t\t\t);\n\t\t}\n\n\t\t$user = get_userdata( $id );\n\t\t$user->set_role( $role );\n\t}\n\n\twp_redirect(add_query_arg('update', $update, $redirect));\n\texit();\n\ncase 'dodelete':\n\tif ( is_multisite() )\n\t\twp_die( __('User deletion is not allowed from this screen.') );\n\n\tcheck_admin_referer('delete-users');\n\n\tif ( empty($_REQUEST['users']) ) {\n\t\twp_redirect($redirect);\n\t\texit();\n\t}\n\n\t$userids = array_map( 'intval', (array) $_REQUEST['users'] );\n\n\tif ( empty( $_REQUEST['delete_option'] ) ) {\n\t\t$url = self_admin_url( 'users.php?action=delete&users[]=' . implode( '&users[]=', $userids ) . '&error=true' );\n\t\t$url = str_replace( '&amp;', '&', wp_nonce_url( $url, 'bulk-users' ) );\n\t\twp_redirect( $url );\n\t\texit;\n\t}\n\n\tif ( ! current_user_can( 'delete_users' ) )\n\t\twp_die(__('You can&#8217;t delete users.'));\n\n\t$update = 'del';\n\t$delete_count = 0;\n\n\tforeach ( $userids as $id ) {\n\t\tif ( ! current_user_can( 'delete_user', $id ) )\n\t\t\twp_die(__( 'You can&#8217;t delete that user.' ) );\n\n\t\tif ( $id == $current_user->ID ) {\n\t\t\t$update = 'err_admin_del';\n\t\t\tcontinue;\n\t\t}\n\t\tswitch ( $_REQUEST['delete_option'] ) {\n\t\tcase 'delete':\n\t\t\twp_delete_user( $id );\n\t\t\tbreak;\n\t\tcase 'reassign':\n\t\t\twp_delete_user( $id, $_REQUEST['reassign_user'] );\n\t\t\tbreak;\n\t\t}\n\t\t++$delete_count;\n\t}\n\n\t$redirect = add_query_arg( array('delete_count' => $delete_count, 'update' => $update), $redirect);\n\twp_redirect($redirect);\n\texit();\n\ncase 'delete':\n\tif ( is_multisite() )\n\t\twp_die( __('User deletion is not allowed from this screen.') );\n\n\tcheck_admin_referer('bulk-users');\n\n\tif ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {\n\t\twp_redirect($redirect);\n\t\texit();\n\t}\n\n\tif ( ! current_user_can( 'delete_users' ) )\n\t\t$errors = new WP_Error( 'edit_users', __( 'You can&#8217;t delete users.' ) );\n\n\tif ( empty($_REQUEST['users']) )\n\t\t$userids = array( intval( $_REQUEST['user'] ) );\n\telse\n\t\t$userids = array_map( 'intval', (array) $_REQUEST['users'] );\n\n\t$users_have_content = false;\n\tif ( $wpdb->get_var( \"SELECT ID FROM {$wpdb->posts} WHERE post_author IN( \" . implode( ',', $userids ) . \" ) LIMIT 1\" ) ) {\n\t\t$users_have_content = true;\n\t} elseif ( $wpdb->get_var( \"SELECT link_id FROM {$wpdb->links} WHERE link_owner IN( \" . implode( ',', $userids ) . \" ) LIMIT 1\" ) ) {\n\t\t$users_have_content = true;\n\t}\n\n\tif ( $users_have_content ) {\n\t\tadd_action( 'admin_head', 'delete_users_add_js' );\n\t}\n\n\tinclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n<form method=\"post\" name=\"updateusers\" id=\"updateusers\">\n<?php wp_nonce_field('delete-users') ?>\n<?php echo $referer; ?>\n\n<div class=\"wrap\">\n<h1><?php _e( 'Delete Users' ); ?></h1>\n<?php if ( isset( $_REQUEST['error'] ) ) : ?>\n\t<div class=\"error\">\n\t\t<p><strong><?php _e( 'ERROR:' ); ?></strong> <?php _e( 'Please select an option.' ); ?></p>\n\t</div>\n<?php endif; ?>\n\n<?php if ( 1 == count( $userids ) ) : ?>\n\t<p><?php _e( 'You have specified this user for deletion:' ); ?></p>\n<?php else : ?>\n\t<p><?php _e( 'You have specified these users for deletion:' ); ?></p>\n<?php endif; ?>\n\n<ul>\n<?php\n\t$go_delete = 0;\n\tforeach ( $userids as $id ) {\n\t\t$user = get_userdata( $id );\n\t\tif ( $id == $current_user->ID ) {\n\t\t\techo \"<li>\" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . \"</li>\\n\";\n\t\t} else {\n\t\t\techo \"<li><input type=\\\"hidden\\\" name=\\\"users[]\\\" value=\\\"\" . esc_attr($id) . \"\\\" />\" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . \"</li>\\n\";\n\t\t\t$go_delete++;\n\t\t}\n\t}\n\t?>\n\t</ul>\n<?php if ( $go_delete ) :\n\n\tif ( ! $users_have_content ) : ?>\n\t\t<input type=\"hidden\" name=\"delete_option\" value=\"delete\" />\n\t<?php else: ?>\n\t\t<?php if ( 1 == $go_delete ) : ?>\n\t\t\t<fieldset><p><legend><?php _e( 'What should be done with content owned by this user?' ); ?></legend></p>\n\t\t<?php else : ?>\n\t\t\t<fieldset><p><legend><?php _e( 'What should be done with content owned by these users?' ); ?></legend></p>\n\t\t<?php endif; ?>\n\t\t<ul style=\"list-style:none;\">\n\t\t\t<li><label><input type=\"radio\" id=\"delete_option0\" name=\"delete_option\" value=\"delete\" />\n\t\t\t<?php _e('Delete all content.'); ?></label></li>\n\t\t\t<li><input type=\"radio\" id=\"delete_option1\" name=\"delete_option\" value=\"reassign\" />\n\t\t\t<?php echo '<label for=\"delete_option1\">' . __( 'Attribute all content to:' ) . '</label> ';\n\t\t\twp_dropdown_users( array( 'name' => 'reassign_user', 'exclude' => array_diff( $userids, array($current_user->ID) ) ) ); ?></li>\n\t\t</ul></fieldset>\n\t<?php endif;\n\t/**\n\t * Fires at the end of the delete users form prior to the confirm button.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param WP_User $current_user WP_User object for the user being deleted.\n\t */\n\tdo_action( 'delete_user_form', $current_user );\n\t?>\n\t<input type=\"hidden\" name=\"action\" value=\"dodelete\" />\n\t<?php submit_button( __('Confirm Deletion'), 'primary' ); ?>\n<?php else : ?>\n\t<p><?php _e('There are no valid users selected for deletion.'); ?></p>\n<?php endif; ?>\n</div>\n</form>\n<?php\n\nbreak;\n\ncase 'doremove':\n\tcheck_admin_referer('remove-users');\n\n\tif ( ! is_multisite() )\n\t\twp_die( __( 'You can&#8217;t remove users.' ) );\n\n\tif ( empty($_REQUEST['users']) ) {\n\t\twp_redirect($redirect);\n\t\texit;\n\t}\n\n\tif ( ! current_user_can( 'remove_users' ) )\n\t\twp_die( __( 'You can&#8217;t remove users.' ) );\n\n\t$userids = $_REQUEST['users'];\n\n\t$update = 'remove';\n \tforeach ( $userids as $id ) {\n\t\t$id = (int) $id;\n\t\tif ( $id == $current_user->ID && !is_super_admin() ) {\n\t\t\t$update = 'err_admin_remove';\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !current_user_can('remove_user', $id) ) {\n\t\t\t$update = 'err_admin_remove';\n\t\t\tcontinue;\n\t\t}\n\t\tremove_user_from_blog($id, $blog_id);\n\t}\n\n\t$redirect = add_query_arg( array('update' => $update), $redirect);\n\twp_redirect($redirect);\n\texit;\n\ncase 'remove':\n\n\tcheck_admin_referer('bulk-users');\n\n\tif ( ! is_multisite() )\n\t\twp_die( __( 'You can&#8217;t remove users.' ) );\n\n\tif ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {\n\t\twp_redirect($redirect);\n\t\texit();\n\t}\n\n\tif ( !current_user_can('remove_users') )\n\t\t$error = new WP_Error('edit_users', __('You can&#8217;t remove users.'));\n\n\tif ( empty($_REQUEST['users']) )\n\t\t$userids = array(intval($_REQUEST['user']));\n\telse\n\t\t$userids = $_REQUEST['users'];\n\n\tinclude( ABSPATH . 'wp-admin/admin-header.php' );\n?>\n<form method=\"post\" name=\"updateusers\" id=\"updateusers\">\n<?php wp_nonce_field('remove-users') ?>\n<?php echo $referer; ?>\n\n<div class=\"wrap\">\n<h1><?php _e( 'Remove Users from Site' ); ?></h1>\n\n<?php if ( 1 == count( $userids ) ) : ?>\n\t<p><?php _e( 'You have specified this user for removal:' ); ?></p>\n<?php else : ?>\n\t<p><?php _e( 'You have specified these users for removal:' ); ?></p>\n<?php endif; ?>\n\n<ul>\n<?php\n\t$go_remove = false;\n \tforeach ( $userids as $id ) {\n\t\t$id = (int) $id;\n \t\t$user = get_userdata( $id );\n\t\tif ( $id == $current_user->ID && !is_super_admin() ) {\n\t\t\techo \"<li>\" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be removed.</strong>'), $id, $user->user_login) . \"</li>\\n\";\n\t\t} elseif ( !current_user_can('remove_user', $id) ) {\n\t\t\techo \"<li>\" . sprintf(__('ID #%1$s: %2$s <strong>You don\\'t have permission to remove this user.</strong>'), $id, $user->user_login) . \"</li>\\n\";\n\t\t} else {\n\t\t\techo \"<li><input type=\\\"hidden\\\" name=\\\"users[]\\\" value=\\\"{$id}\\\" />\" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . \"</li>\\n\";\n\t\t\t$go_remove = true;\n\t\t}\n \t}\n \t?>\n</ul>\n<?php if ( $go_remove ) : ?>\n\t\t<input type=\"hidden\" name=\"action\" value=\"doremove\" />\n\t\t<?php submit_button( __('Confirm Removal'), 'primary' ); ?>\n<?php else : ?>\n\t<p><?php _e('There are no valid users selected for removal.'); ?></p>\n<?php endif; ?>\n</div>\n</form>\n<?php\n\nbreak;\n\ndefault:\n\n\tif ( !empty($_GET['_wp_http_referer']) ) {\n\t\twp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce'), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );\n\t\texit;\n\t}\n\n\t$wp_list_table->prepare_items();\n\t$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );\n\tif ( $pagenum > $total_pages && $total_pages > 0 ) {\n\t\twp_redirect( add_query_arg( 'paged', $total_pages ) );\n\t\texit;\n\t}\n\n\tinclude( ABSPATH . 'wp-admin/admin-header.php' );\n\n\t$messages = array();\n\tif ( isset($_GET['update']) ) :\n\t\tswitch($_GET['update']) {\n\t\tcase 'del':\n\t\tcase 'del_many':\n\t\t\t$delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0;\n\t\t\tif ( 1 == $delete_count ) {\n\t\t\t\t$message = __( 'User deleted.' );\n\t\t\t} else {\n\t\t\t\t$message = _n( '%s user deleted.', '%s users deleted.', $delete_count );\n\t\t\t}\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . sprintf( $message, number_format_i18n( $delete_count ) ) . '</p></div>';\n\t\t\tbreak;\n\t\tcase 'add':\n\t\t\tif ( isset( $_GET['id'] ) && ( $user_id = $_GET['id'] ) && current_user_can( 'edit_user', $user_id ) ) {\n\t\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . sprintf( __( 'New user created. <a href=\"%s\">Edit user</a>' ),\n\t\t\t\t\tesc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),\n\t\t\t\t\t\tself_admin_url( 'user-edit.php?user_id=' . $user_id ) ) ) ) . '</p></div>';\n\t\t\t} else {\n\t\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __( 'New user created.' ) . '</p></div>';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'promote':\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __('Changed roles.') . '</p></div>';\n\t\t\tbreak;\n\t\tcase 'err_admin_role':\n\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __('The current user&#8217;s role must have user editing capabilities.') . '</p></div>';\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __('Other user roles have been changed.') . '</p></div>';\n\t\t\tbreak;\n\t\tcase 'err_admin_del':\n\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __('You can&#8217;t delete the current user.') . '</p></div>';\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible\"><p>' . __('Other users have been deleted.') . '</p></div>';\n\t\t\tbreak;\n\t\tcase 'remove':\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible fade\"><p>' . __('User removed from this site.') . '</p></div>';\n\t\t\tbreak;\n\t\tcase 'err_admin_remove':\n\t\t\t$messages[] = '<div id=\"message\" class=\"error notice is-dismissible\"><p>' . __(\"You can't remove the current user.\") . '</p></div>';\n\t\t\t$messages[] = '<div id=\"message\" class=\"updated notice is-dismissible fade\"><p>' . __('Other users have been removed.') . '</p></div>';\n\t\t\tbreak;\n\t\t}\n\tendif; ?>\n\n<?php if ( isset($errors) && is_wp_error( $errors ) ) : ?>\n\t<div class=\"error\">\n\t\t<ul>\n\t\t<?php\n\t\t\tforeach ( $errors->get_error_messages() as $err )\n\t\t\t\techo \"<li>$err</li>\\n\";\n\t\t?>\n\t\t</ul>\n\t</div>\n<?php endif;\n\nif ( ! empty($messages) ) {\n\tforeach ( $messages as $msg )\n\t\techo $msg;\n} ?>\n\n<div class=\"wrap\">\n<h1>\n<?php\necho esc_html( $title );\nif ( current_user_can( 'create_users' ) ) { ?>\n\t<a href=\"user-new.php\" class=\"page-title-action\"><?php echo esc_html_x( 'Add New', 'user' ); ?></a>\n<?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>\n\t<a href=\"user-new.php\" class=\"page-title-action\"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a>\n<?php }\n\nif ( $usersearch )\n\tprintf( '<span class=\"subtitle\">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( $usersearch ) ); ?>\n</h1>\n\n<?php $wp_list_table->views(); ?>\n\n<form method=\"get\">\n\n<?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>\n\n<?php $wp_list_table->display(); ?>\n</form>\n\n<br class=\"clear\" />\n</div>\n<?php\nbreak;\n\n} // end of the $doaction switch\n\ninclude( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-admin/widgets.php",
    "content": "<?php\n/**\n * Widget administration panel\n *\n * @package WordPress\n * @subpackage Administration\n */\n\n/** WordPress Administration Bootstrap */\nrequire_once( dirname( __FILE__ ) . '/admin.php' );\n\n/** WordPress Administration Widgets API */\nrequire_once(ABSPATH . 'wp-admin/includes/widgets.php');\n\nif ( ! current_user_can( 'edit_theme_options' ) ) {\n\twp_die(\n\t\t'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .\n\t\t'<p>' . __( 'You are not allowed to edit theme options on this site.' ) . '</p>',\n\t\t403\n\t);\n}\n\n$widgets_access = get_user_setting( 'widgets_access' );\nif ( isset($_GET['widgets-access']) ) {\n\t$widgets_access = 'on' == $_GET['widgets-access'] ? 'on' : 'off';\n\tset_user_setting( 'widgets_access', $widgets_access );\n}\n\nif ( 'on' == $widgets_access ) {\n\tadd_filter( 'admin_body_class', 'wp_widgets_access_body_class' );\n} else {\n\twp_enqueue_script('admin-widgets');\n\n\tif ( wp_is_mobile() )\n\t\twp_enqueue_script( 'jquery-touch-punch' );\n}\n\n/**\n * Fires early before the Widgets administration screen loads,\n * after scripts are enqueued.\n *\n * @since 2.2.0\n */\ndo_action( 'sidebar_admin_setup' );\n\n$title = __( 'Widgets' );\n$parent_file = 'themes.php';\n\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'overview',\n'title'\t\t=> __('Overview'),\n'content'\t=>\n\t'<p>' . __('Widgets are independent sections of content that can be placed into any widgetized area provided by your theme (commonly called sidebars). To populate your sidebars/widget areas with individual widgets, drag and drop the title bars into the desired area. By default, only the first widget area is expanded. To populate additional widget areas, click on their title bars to expand them.') . '</p>\n\t<p>' . __('The Available Widgets section contains all the widgets you can choose from. Once you drag a widget into a sidebar, it will open to allow you to configure its settings. When you are happy with the widget settings, click the Save button and the widget will go live on your site. If you click Delete, it will remove the widget.') . '</p>'\n) );\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'removing-reusing',\n'title'\t\t=> __('Removing and Reusing'),\n'content'\t=>\n\t'<p>' . __('If you want to remove the widget but save its setting for possible future use, just drag it into the Inactive Widgets area. You can add them back anytime from there. This is especially helpful when you switch to a theme with fewer or different widget areas.') . '</p>\n\t<p>' . __('Widgets may be used multiple times. You can give each widget a title, to display on your site, but it&#8217;s not required.') . '</p>\n\t<p>' . __('Enabling Accessibility Mode, via Screen Options, allows you to use Add and Edit buttons instead of using drag and drop.') . '</p>'\n) );\nget_current_screen()->add_help_tab( array(\n'id'\t\t=> 'missing-widgets',\n'title'\t\t=> __('Missing Widgets'),\n'content'\t=>\n\t'<p>' . __('Many themes show some sidebar widgets by default until you edit your sidebars, but they are not automatically displayed in your sidebar management tool. After you make your first widget change, you can re-add the default widgets by adding them from the Available Widgets area.') . '</p>' .\n\t\t'<p>' . __('When changing themes, there is often some variation in the number and setup of widget areas/sidebars and sometimes these conflicts make the transition a bit less smooth. If you changed themes and seem to be missing widgets, scroll down on this screen to the Inactive Widgets area, where all of your widgets and their settings will have been saved.') . '</p>'\n) );\n\nget_current_screen()->set_help_sidebar(\n\t'<p><strong>' . __('For more information:') . '</strong></p>' .\n\t'<p>' . __('<a href=\"https://codex.wordpress.org/Appearance_Widgets_Screen\" target=\"_blank\">Documentation on Widgets</a>') . '</p>' .\n\t'<p>' . __('<a href=\"https://wordpress.org/support/\" target=\"_blank\">Support Forums</a>') . '</p>'\n);\n\nif ( ! current_theme_supports( 'widgets' ) ) {\n\twp_die( __( 'The theme you are currently using isn&#8217;t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please <a href=\"https://codex.wordpress.org/Widgetizing_Themes\">follow these instructions</a>.' ) );\n}\n\n// These are the widgets grouped by sidebar\n$sidebars_widgets = wp_get_sidebars_widgets();\n\nif ( empty( $sidebars_widgets ) )\n\t$sidebars_widgets = wp_get_widget_defaults();\n\nforeach ( $sidebars_widgets as $sidebar_id => $widgets ) {\n\tif ( 'wp_inactive_widgets' == $sidebar_id )\n\t\tcontinue;\n\n\tif ( ! is_registered_sidebar( $sidebar_id ) ) {\n\t\tif ( ! empty( $widgets ) ) { // register the inactive_widgets area as sidebar\n\t\t\tregister_sidebar(array(\n\t\t\t\t'name' => __( 'Inactive Sidebar (not used)' ),\n\t\t\t\t'id' => $sidebar_id,\n\t\t\t\t'class' => 'inactive-sidebar orphan-sidebar',\n\t\t\t\t'description' => __( 'This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar.' ),\n\t\t\t\t'before_widget' => '',\n\t\t\t\t'after_widget' => '',\n\t\t\t\t'before_title' => '',\n\t\t\t\t'after_title' => '',\n\t\t\t));\n\t\t} else {\n\t\t\tunset( $sidebars_widgets[ $sidebar_id ] );\n\t\t}\n\t}\n}\n\n// register the inactive_widgets area as sidebar\nregister_sidebar(array(\n\t'name' => __('Inactive Widgets'),\n\t'id' => 'wp_inactive_widgets',\n\t'class' => 'inactive-sidebar',\n\t'description' => __( 'Drag widgets here to remove them from the sidebar but keep their settings.' ),\n\t'before_widget' => '',\n\t'after_widget' => '',\n\t'before_title' => '',\n\t'after_title' => '',\n));\n\nretrieve_widgets();\n\n// We're saving a widget without js\nif ( isset($_POST['savewidget']) || isset($_POST['removewidget']) ) {\n\t$widget_id = $_POST['widget-id'];\n\tcheck_admin_referer(\"save-delete-widget-$widget_id\");\n\n\t$number = isset($_POST['multi_number']) ? (int) $_POST['multi_number'] : '';\n\tif ( $number ) {\n\t\tforeach ( $_POST as $key => $val ) {\n\t\t\tif ( is_array($val) && preg_match('/__i__|%i%/', key($val)) ) {\n\t\t\t\t$_POST[$key] = array( $number => array_shift($val) );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t$sidebar_id = $_POST['sidebar'];\n\t$position = isset($_POST[$sidebar_id . '_position']) ? (int) $_POST[$sidebar_id . '_position'] - 1 : 0;\n\n\t$id_base = $_POST['id_base'];\n\t$sidebar = isset($sidebars_widgets[$sidebar_id]) ? $sidebars_widgets[$sidebar_id] : array();\n\n\t// Delete.\n\tif ( isset($_POST['removewidget']) && $_POST['removewidget'] ) {\n\n\t\tif ( !in_array($widget_id, $sidebar, true) ) {\n\t\t\twp_redirect( admin_url('widgets.php?error=0') );\n\t\t\texit;\n\t\t}\n\n\t\t$sidebar = array_diff( $sidebar, array($widget_id) );\n\t\t$_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');\n\n\t\t/**\n\t\t * Fires immediately after a widget has been marked for deletion.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string $widget_id  ID of the widget marked for deletion.\n\t\t * @param string $sidebar_id ID of the sidebar the widget was deleted from.\n\t\t * @param string $id_base    ID base for the widget.\n\t\t */\n\t\tdo_action( 'delete_widget', $widget_id, $sidebar_id, $id_base );\n\t}\n\n\t$_POST['widget-id'] = $sidebar;\n\n\tforeach ( (array) $wp_registered_widget_updates as $name => $control ) {\n\t\tif ( $name != $id_base || !is_callable($control['callback']) )\n\t\t\tcontinue;\n\n\t\tob_start();\n\t\t\tcall_user_func_array( $control['callback'], $control['params'] );\n\t\tob_end_clean();\n\n\t\tbreak;\n\t}\n\n\t$sidebars_widgets[$sidebar_id] = $sidebar;\n\n\t// Remove old position.\n\tif ( !isset($_POST['delete_widget']) ) {\n\t\tforeach ( $sidebars_widgets as $key => $sb ) {\n\t\t\tif ( is_array($sb) )\n\t\t\t\t$sidebars_widgets[$key] = array_diff( $sb, array($widget_id) );\n\t\t}\n\t\tarray_splice( $sidebars_widgets[$sidebar_id], $position, 0, $widget_id );\n\t}\n\n\twp_set_sidebars_widgets($sidebars_widgets);\n\twp_redirect( admin_url('widgets.php?message=0') );\n\texit;\n}\n\n// Remove inactive widgets without js\nif ( isset( $_POST['removeinactivewidgets'] ) ) {\n\tcheck_admin_referer( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' );\n\n\tif ( $_POST['removeinactivewidgets'] ) {\n\t\tforeach ( $sidebars_widgets['wp_inactive_widgets'] as $key => $widget_id ) {\n\t\t\t$pieces = explode( '-', $widget_id );\n\t\t\t$multi_number = array_pop( $pieces );\n\t\t\t$id_base = implode( '-', $pieces );\n\t\t\t$widget = get_option( 'widget_' . $id_base );\n\t\t\tunset( $widget[$multi_number] );\n\t\t\tupdate_option( 'widget_' . $id_base, $widget );\n\t\t\tunset( $sidebars_widgets['wp_inactive_widgets'][$key] );\n\t\t}\n\n\t\twp_set_sidebars_widgets( $sidebars_widgets );\n\t}\n\n\twp_redirect( admin_url( 'widgets.php?message=0' ) );\n\texit;\n}\n\n// Output the widget form without js\nif ( isset($_GET['editwidget']) && $_GET['editwidget'] ) {\n\t$widget_id = $_GET['editwidget'];\n\n\tif ( isset($_GET['addnew']) ) {\n\t\t// Default to the first sidebar\n\t\t$keys = array_keys( $wp_registered_sidebars );\n\t\t$sidebar = reset( $keys );\n\n\t\tif ( isset($_GET['base']) && isset($_GET['num']) ) { // multi-widget\n\t\t\t// Copy minimal info from an existing instance of this widget to a new instance\n\t\t\tforeach ( $wp_registered_widget_controls as $control ) {\n\t\t\t\tif ( $_GET['base'] === $control['id_base'] ) {\n\t\t\t\t\t$control_callback = $control['callback'];\n\t\t\t\t\t$multi_number = (int) $_GET['num'];\n\t\t\t\t\t$control['params'][0]['number'] = -1;\n\t\t\t\t\t$widget_id = $control['id'] = $control['id_base'] . '-' . $multi_number;\n\t\t\t\t\t$wp_registered_widget_controls[$control['id']] = $control;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( isset($wp_registered_widget_controls[$widget_id]) && !isset($control) ) {\n\t\t$control = $wp_registered_widget_controls[$widget_id];\n\t\t$control_callback = $control['callback'];\n\t} elseif ( !isset($wp_registered_widget_controls[$widget_id]) && isset($wp_registered_widgets[$widget_id]) ) {\n\t\t$name = esc_html( strip_tags($wp_registered_widgets[$widget_id]['name']) );\n\t}\n\n\tif ( !isset($name) )\n\t\t$name = esc_html( strip_tags($control['name']) );\n\n\tif ( !isset($sidebar) )\n\t\t$sidebar = isset($_GET['sidebar']) ? $_GET['sidebar'] : 'wp_inactive_widgets';\n\n\tif ( !isset($multi_number) )\n\t\t$multi_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';\n\n\t$id_base = isset($control['id_base']) ? $control['id_base'] : $control['id'];\n\n\t// Show the widget form.\n\t$width = ' style=\"width:' . max($control['width'], 350) . 'px\"';\n\t$key = isset($_GET['key']) ? (int) $_GET['key'] : 0;\n\n\trequire_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>\n\t<div class=\"wrap\">\n\t<h1><?php echo esc_html( $title ); ?></h1>\n\t<div class=\"editwidget\"<?php echo $width; ?>>\n\t<h2><?php printf( __( 'Widget %s' ), $name ); ?></h2>\n\n\t<form action=\"widgets.php\" method=\"post\">\n\t<div class=\"widget-inside\">\n<?php\n\tif ( is_callable( $control_callback ) )\n\t\tcall_user_func_array( $control_callback, $control['params'] );\n\telse\n\t\techo '<p>' . __('There are no options for this widget.') . \"</p>\\n\"; ?>\n\t</div>\n\n\t<p class=\"describe\"><?php _e('Select both the sidebar for this widget and the position of the widget in that sidebar.'); ?></p>\n\t<div class=\"widget-position\">\n\t<table class=\"widefat\"><thead><tr><th><?php _e('Sidebar'); ?></th><th><?php _e('Position'); ?></th></tr></thead><tbody>\n<?php\n\tforeach ( $wp_registered_sidebars as $sbname => $sbvalue ) {\n\t\techo \"\\t\\t<tr><td><label><input type='radio' name='sidebar' value='\" . esc_attr($sbname) . \"'\" . checked( $sbname, $sidebar, false ) . \" /> $sbvalue[name]</label></td><td>\";\n\t\tif ( 'wp_inactive_widgets' == $sbname || 'orphaned_widgets' == substr( $sbname, 0, 16 ) ) {\n\t\t\techo '&nbsp;';\n\t\t} else {\n\t\t\tif ( !isset($sidebars_widgets[$sbname]) || !is_array($sidebars_widgets[$sbname]) ) {\n\t\t\t\t$j = 1;\n\t\t\t\t$sidebars_widgets[$sbname] = array();\n\t\t\t} else {\n\t\t\t\t$j = count($sidebars_widgets[$sbname]);\n\t\t\t\tif ( isset($_GET['addnew']) || !in_array($widget_id, $sidebars_widgets[$sbname], true) )\n\t\t\t\t\t$j++;\n\t\t\t}\n\t\t\t$selected = '';\n\t\t\techo \"\\t\\t<select name='{$sbname}_position'>\\n\";\n\t\t\techo \"\\t\\t<option value=''>\" . __('&mdash; Select &mdash;') . \"</option>\\n\";\n\t\t\tfor ( $i = 1; $i <= $j; $i++ ) {\n\t\t\t\tif ( in_array($widget_id, $sidebars_widgets[$sbname], true) )\n\t\t\t\t\t$selected = selected( $i, $key + 1, false );\n\t\t\t\techo \"\\t\\t<option value='$i'$selected> $i </option>\\n\";\n\t\t\t}\n\t\t\techo \"\\t\\t</select>\\n\";\n\t\t}\n\t\techo \"</td></tr>\\n\";\n\t} ?>\n\t</tbody></table>\n\t</div>\n\n\t<div class=\"widget-control-actions\">\n<?php\n\tif ( isset($_GET['addnew']) ) { ?>\n\t<a href=\"widgets.php\" class=\"button alignleft\"><?php _e('Cancel'); ?></a>\n<?php\n\t} else {\n\t\tsubmit_button( __( 'Delete' ), 'button alignleft', 'removewidget', false );\n\t}\n\tsubmit_button( __( 'Save Widget' ), 'button-primary alignright', 'savewidget', false ); ?>\n\t<input type=\"hidden\" name=\"widget-id\" class=\"widget-id\" value=\"<?php echo esc_attr($widget_id); ?>\" />\n\t<input type=\"hidden\" name=\"id_base\" class=\"id_base\" value=\"<?php echo esc_attr($id_base); ?>\" />\n\t<input type=\"hidden\" name=\"multi_number\" class=\"multi_number\" value=\"<?php echo esc_attr($multi_number); ?>\" />\n<?php\twp_nonce_field(\"save-delete-widget-$widget_id\"); ?>\n\t<br class=\"clear\" />\n\t</div>\n\t</form>\n\t</div>\n\t</div>\n<?php\n\trequire_once( ABSPATH . 'wp-admin/admin-footer.php' );\n\texit;\n}\n\n$messages = array(\n\t__('Changes saved.')\n);\n\n$errors = array(\n\t__('Error while saving.'),\n\t__('Error in displaying the widget settings form.')\n);\n\nrequire_once( ABSPATH . 'wp-admin/admin-header.php' ); ?>\n\n<div class=\"wrap\">\n<h1>\n<?php\n\techo esc_html( $title );\n\tif ( current_user_can( 'customize' ) ) {\n\t\tprintf(\n\t\t\t' <a class=\"page-title-action hide-if-no-customize\" href=\"%1$s\">%2$s</a>',\n\t\t\tesc_url( add_query_arg(\n\t\t\t\tarray(\n\t\t\t\t\tarray( 'autofocus' => array( 'panel' => 'widgets' ) ),\n\t\t\t\t\t'return' => urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) )\n\t\t\t\t),\n\t\t\t\tadmin_url( 'customize.php' )\n\t\t\t) ),\n\t\t\t__( 'Manage in Customizer' )\n\t\t);\n\t}\n?>\n</h1>\n\n<?php if ( isset($_GET['message']) && isset($messages[$_GET['message']]) ) { ?>\n<div id=\"message\" class=\"updated notice is-dismissible\"><p><?php echo $messages[$_GET['message']]; ?></p></div>\n<?php } ?>\n<?php if ( isset($_GET['error']) && isset($errors[$_GET['error']]) ) { ?>\n<div id=\"message\" class=\"error\"><p><?php echo $errors[$_GET['error']]; ?></p></div>\n<?php } ?>\n\n<?php\n/**\n * Fires before the Widgets administration page content loads.\n *\n * @since 3.0.0\n */\ndo_action( 'widgets_admin_page' ); ?>\n\n<div class=\"widget-liquid-left\">\n<div id=\"widgets-left\">\n\t<div id=\"available-widgets\" class=\"widgets-holder-wrap\">\n\t\t<div class=\"sidebar-name\">\n\t\t\t<div class=\"sidebar-name-arrow\"><br /></div>\n\t\t\t<h2><?php _e( 'Available Widgets' ); ?> <span id=\"removing-widget\"><?php _ex( 'Deactivate', 'removing-widget' ); ?> <span></span></span></h2>\n\t\t</div>\n\t\t<div class=\"widget-holder\">\n\t\t\t<div class=\"sidebar-description\">\n\t\t\t\t<p class=\"description\"><?php _e('To activate a widget drag it to a sidebar or click on it. To deactivate a widget and delete its settings, drag it back.'); ?></p>\n\t\t\t</div>\n\t\t\t<div id=\"widget-list\">\n\t\t\t\t<?php wp_list_widgets(); ?>\n\t\t\t</div>\n\t\t\t<br class='clear' />\n\t\t</div>\n\t\t<br class=\"clear\" />\n\t</div>\n\n<?php\n\n$theme_sidebars = array();\nforeach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {\n\tif ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) {\n\t\t$wrap_class = 'widgets-holder-wrap';\n\t\tif ( !empty( $registered_sidebar['class'] ) )\n\t\t\t$wrap_class .= ' ' . $registered_sidebar['class'];\n\n\t\t$is_inactive_widgets = 'wp_inactive_widgets' == $registered_sidebar['id'];\n\t\t?>\n\t\t<div class=\"<?php echo esc_attr( $wrap_class ); ?>\">\n\t\t\t<div class=\"widget-holder inactive\">\n\t\t\t\t<?php wp_list_widget_controls( $registered_sidebar['id'], $registered_sidebar['name'] ); ?>\n\n\t\t\t\t<?php if ( $is_inactive_widgets ) { ?>\n\t\t\t\t<div class=\"remove-inactive-widgets\">\n\t\t\t\t\t<form action=\"\" method=\"post\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t$attributes = array( 'id' => 'inactive-widgets-control-remove' );\n\n\t\t\t\t\t\t\tif ( empty($sidebars_widgets['wp_inactive_widgets']) ) {\n\t\t\t\t\t\t\t\t$attributes['disabled'] = '';\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsubmit_button( __( 'Clear Inactive Widgets' ), 'delete', 'removeinactivewidgets', false, $attributes );\n\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t<span class=\"spinner\">\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<?php wp_nonce_field( 'remove-inactive-widgets', '_wpnonce_remove_inactive_widgets' ); ?>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t\t<?php } ?>\n\t\t\t</div>\n\t\t\t<?php if ( $is_inactive_widgets ) { ?>\n\t\t\t<p class=\"description\"><?php _e( 'This will clear all items from the inactive widgets list. You will not be able to restore any customizations.' ); ?></p>\n\t\t\t<?php } ?>\n\t\t</div>\n\t\t<?php\n\n\t} else {\n\t\t$theme_sidebars[$sidebar] = $registered_sidebar;\n\t}\n}\n\n?>\n</div>\n</div>\n<?php\n\n$i = $split = 0;\n$single_sidebar_class = '';\n$sidebars_count = count( $theme_sidebars );\n\nif ( $sidebars_count > 1 ) {\n\t$split = ceil( $sidebars_count / 2 );\n} else {\n\t$single_sidebar_class = ' class=\"single-sidebar\"';\n}\n\n?>\n<div class=\"widget-liquid-right\">\n<div id=\"widgets-right\"<?php echo $single_sidebar_class; ?>>\n<div class=\"sidebars-column-1\">\n<?php\n\nforeach ( $theme_sidebars as $sidebar => $registered_sidebar ) {\n\t$wrap_class = 'widgets-holder-wrap';\n\tif ( !empty( $registered_sidebar['class'] ) )\n\t\t$wrap_class .= ' sidebar-' . $registered_sidebar['class'];\n\n\tif ( $i > 0 )\n\t\t$wrap_class .= ' closed';\n\n\tif ( $split && $i == $split ) {\n\t\t?>\n\t\t</div><div class=\"sidebars-column-2\">\n\t\t<?php\n\t}\n\n\t?>\n\t<div class=\"<?php echo esc_attr( $wrap_class ); ?>\">\n\t\t<?php wp_list_widget_controls( $sidebar, $registered_sidebar['name'] ); // Show the control forms for each of the widgets in this sidebar ?>\n\t</div>\n\t<?php\n\n\t$i++;\n}\n\n?>\n</div>\n</div>\n</div>\n<form method=\"post\">\n<?php wp_nonce_field( 'save-sidebar-widgets', '_wpnonce_widgets', false ); ?>\n</form>\n<br class=\"clear\" />\n</div>\n\n<div class=\"widgets-chooser\">\n\t<ul class=\"widgets-chooser-sidebars\"></ul>\n\t<div class=\"widgets-chooser-actions\">\n\t\t<button class=\"button-secondary\"><?php _e( 'Cancel' ); ?></button>\n\t\t<button class=\"button-primary\"><?php _e( 'Add Widget' ); ?></button>\n\t</div>\n</div>\n\n<?php\n\n/**\n * Fires after the available widgets and sidebars have loaded, before the admin footer.\n *\n * @since 2.2.0\n */\ndo_action( 'sidebar_admin_page' );\nrequire_once( ABSPATH . 'wp-admin/admin-footer.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-blog-header.php",
    "content": "<?php\n/**\n * Loads the WordPress environment and template.\n *\n * @package WordPress\n */\n\nif ( !isset($wp_did_header) ) {\n\n\t$wp_did_header = true;\n\n\trequire_once( dirname(__FILE__) . '/wp-load.php' );\n\n\twp();\n\n\trequire_once( ABSPATH . WPINC . '/template-loader.php' );\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-comments-post.php",
    "content": "<?php\n/**\n * Handles Comment Post to WordPress and prevents duplicate comment posting.\n *\n * @package WordPress\n */\n\nif ( 'POST' != $_SERVER['REQUEST_METHOD'] ) {\n\theader('Allow: POST');\n\theader('HTTP/1.1 405 Method Not Allowed');\n\theader('Content-Type: text/plain');\n\texit;\n}\n\n/** Sets up the WordPress Environment. */\nrequire( dirname(__FILE__) . '/wp-load.php' );\n\nnocache_headers();\n\n$comment = wp_handle_comment_submission( wp_unslash( $_POST ) );\nif ( is_wp_error( $comment ) ) {\n\t$data = $comment->get_error_data();\n\tif ( ! empty( $data ) ) {\n\t\twp_die( $comment->get_error_message(), $data );\n\t} else {\n\t\texit;\n\t}\n}\n\n$user = wp_get_current_user();\n\n/**\n * Perform other actions when comment cookies are set.\n *\n * @since 3.4.0\n *\n * @param WP_Comment $comment Comment object.\n * @param WP_User    $user    User object. The user may not exist.\n */\ndo_action( 'set_comment_cookies', $comment, $user );\n\n$location = empty( $_POST['redirect_to'] ) ? get_comment_link( $comment ) : $_POST['redirect_to'] . '#comment-' . $comment->comment_ID;\n\n/**\n * Filter the location URI to send the commenter after posting.\n *\n * @since 2.0.5\n *\n * @param string     $location The 'redirect_to' URI sent via $_POST.\n * @param WP_Comment $comment  Comment object.\n */\n$location = apply_filters( 'comment_post_redirect', $location, $comment );\n\nwp_safe_redirect( $location );\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-config.php",
    "content": "<?php\r\n/**\r\n * The base configuration for WordPress\r\n *\r\n * The wp-config.php creation script uses this file during the\r\n * installation. You don't have to use the web site, you can\r\n * copy this file to \"wp-config.php\" and fill in the values.\r\n *\r\n * This file contains the following configurations:\r\n *\r\n * * MySQL settings\r\n * * Secret keys\r\n * * Database table prefix\r\n * * ABSPATH\r\n *\r\n * @link https://codex.wordpress.org/Editing_wp-config.php\r\n *\r\n * @package WordPress\r\n */\r\n\r\n// ** MySQL settings - You can get this info from your web host ** //\r\n/** The name of the database for WordPress */\r\ndefine('DB_NAME', 'wordpress');\r\n\r\n/** MySQL database username */\r\ndefine('DB_USER', 'root');\r\n\r\n/** MySQL database password */\r\ndefine('DB_PASSWORD', $_ENV['DB_PASSWORD']);\r\n\r\n/** MySQL hostname */\r\ndefine('DB_HOST', 'mysql');\r\n\r\n/** Database Charset to use in creating database tables. */\r\ndefine('DB_CHARSET', 'utf8');\r\n\r\n/** The Database Collate type. Don't change this if in doubt. */\r\ndefine('DB_COLLATE', '');\r\n\r\n/**#@+\r\n * Authentication Unique Keys and Salts.\r\n *\r\n * Change these to different unique phrases!\r\n * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}\r\n * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.\r\n *\r\n * @since 2.6.0\r\n */\r\ndefine('AUTH_KEY',         'put your unique phrase here');\r\ndefine('SECURE_AUTH_KEY',  'put your unique phrase here');\r\ndefine('LOGGED_IN_KEY',    'put your unique phrase here');\r\ndefine('NONCE_KEY',        'put your unique phrase here');\r\ndefine('AUTH_SALT',        'put your unique phrase here');\r\ndefine('SECURE_AUTH_SALT', 'put your unique phrase here');\r\ndefine('LOGGED_IN_SALT',   'put your unique phrase here');\r\ndefine('NONCE_SALT',       'put your unique phrase here');\r\n\r\n/**#@-*/\r\n\r\n/**\r\n * WordPress Database Table prefix.\r\n *\r\n * You can have multiple installations in one database if you give each\r\n * a unique prefix. Only numbers, letters, and underscores please!\r\n */\r\n$table_prefix  = 'wp_';\r\n\r\n/**\r\n * For developers: WordPress debugging mode.\r\n *\r\n * Change this to true to enable the display of notices during development.\r\n * It is strongly recommended that plugin and theme developers use WP_DEBUG\r\n * in their development environments.\r\n *\r\n * For information on other constants that can be used for debugging,\r\n * visit the Codex.\r\n *\r\n * @link https://codex.wordpress.org/Debugging_in_WordPress\r\n */\r\ndefine('WP_DEBUG', true);\r\n\r\n/* That's all, stop editing! Happy blogging. */\r\n\r\n/** Absolute path to the WordPress directory. */\r\nif ( !defined('ABSPATH') )\r\n\tdefine('ABSPATH', dirname(__FILE__) . '/');\r\n\r\n/** Sets up WordPress vars and included files. */\r\nrequire_once(ABSPATH . 'wp-settings.php');\r\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/index.php",
    "content": "<?php\n// Silence is golden.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/.htaccess",
    "content": "# Only allow direct access to specific Web-available files.\n\n# Apache 2.2\n<IfModule !mod_authz_core.c>\n\tOrder Deny,Allow\n\tDeny from all\n</IfModule>\n\n# Apache 2.4\n<IfModule mod_authz_core.c>\n\tRequire all denied\n</IfModule>\n\n# Akismet CSS and JS\n<FilesMatch \"^(form|akismet)\\.(css|js)$\">\n\t<IfModule !mod_authz_core.c>\n\t\tAllow from all\n\t</IfModule>\n\t\n\t<IfModule mod_authz_core.c>\n\t\tRequire all granted\n\t</IfModule>\n</FilesMatch>\n\n# Akismet images\n<FilesMatch \"^(.+)\\.(png|gif)$\">\n\t<IfModule !mod_authz_core.c>\n\t\tAllow from all\n\t</IfModule>\n\t\n\t<IfModule mod_authz_core.c>\n\t\tRequire all granted\n\t</IfModule>\n</FilesMatch>"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/LICENSE.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/_inc/akismet.css",
    "content": "\n#submitted-on {\n    position: relative;\n}\n#the-comment-list .author .akismet-user-comment-count {\n    display: inline;\n}\n#the-comment-list .author a span {\n    text-decoration: none;\n    color: #999;\n}\n#the-comment-list .author a span.akismet-span-link {\n\ttext-decoration: inherit;\n\tcolor: inherit;\n}\n#the-comment-list .remove_url {\n    margin-left: 3px;\n    color: #999;\n    padding: 2px 3px 2px 0;\n}\n#the-comment-list .remove_url:hover {\n    color: #A7301F;\n    font-weight: bold;\n    padding: 2px 2px 2px 0;\n}\n#dashboard_recent_comments .akismet-status {\n    display: none;\n}\n.akismet-status {\n    float: right;\n}\n.akismet-status a {\n    color: #AAA;\n    font-style: italic;\n}\ntable.comments td.comment p a {\n    text-decoration: underline;\n}\ntable.comments td.comment p a:after {\n    content: attr(href);\n    color: #aaa;\n    display: inline-block; /* Show the URL without the link's underline extending under it. */\n    padding: 0 1ex; /* Because it's inline block, we can't just use spaces in the content: attribute to separate it from the link text. */\n}\n.mshot-arrow {\n    width: 0;\n    height: 0;\n    border-top: 10px solid transparent;\n    border-bottom: 10px solid transparent;\n    border-right: 10px solid #5C5C5C;\n    position: absolute;\n    left: -6px;\n    top: 91px;\n}\n.mshot-container {\n    background: #5C5C5C;\n    position: absolute;\n    top: -94px;\n    padding: 7px;\n    width: 450px;\n    height: 338px;\n    z-index: 20000;\n    -moz-border-radius: 6px;\n    border-radius: 6px;\n    -webkit-border-radius: 6px;\n}\n.akismet-mshot {\n    position: absolute;\n    z-index: 100;\n}\n.akismet-mshot .mshot-image {\n    margin: 0;\n    height: 338px;\n    width: 450px;\n}\nh2.ak-header {\n    padding: 30px;\n    background: #649316 url('img/logo-full-2x.png') no-repeat 20px center;\n    background-size: 185px 33px;\n    height: 33px;\n    text-indent: -9999em;\n    margin-right: 10px;\n}\n.checkforspam {\n    display: inline-block !important;\n}\n.checkforspam-spinner {\n    display: inline-block;\n    margin-top: 7px;\n}\n\n.config-wrap {\n\tmargin-top: 2em;\n    max-width: 700px;\n}\n\n.activate-option {\n    background: #e3e3e3;\n    border-radius: 3px;\n    margin-bottom: 30px;\n    overflow: hidden;\n    padding: 20px;\n}\n.activate-option.clicked {\n\tbackground: #649316;\n\tcolor: #fff;\n}\n.activate-option.clicked:hover {\n\tbackground: #68802E;\n\tcolor: #fff;\n}\n\n.activate-option .button.button-secondary {\n\tmargin: 15px 0;\n}\n\n.activate-option p {\n\tmargin: 10px 0 10px;\n}\n\n.activate-highlight {\n\tbackground: #fff;\n\tpadding: 30px;\n\tmargin-right: 10px;\n}\n\n.activate-highlight.secondary {\n\tbackground: #ddd;\n\tpadding: 20px 30px;\n}\n\n.activate-highlight h3 {\n\tmargin: 0 0 0.3em;\n}\n.activate-highlight p {\n\tcolor: #777;\n}\n.activate-highlight .button-primary {\n\tmargin-top: 15px;\n}\n\n#akismet-enter-api-key .regular-text {\n\twidth: 18em;\n\tmargin-top: 15px;\n}\n\n.right {\n\tfloat: right;\n}\n\n.alert-text {\n\tcolor: #dd3d36;\n}\n.success {\n\tcolor: #649316;\n}\n.option-description {\n    float: left;\n    font-size: 16px;\n}\n.option-description span {\n    color: #666;\n    display: block;\n    font-size: 14px;\n    margin-top: 5px;\n}\n.option-action {\n    float: right;\n}\n.key-config-link {\n    font-size: 14px;\n    margin-left: 20px;\n}\n.jetpack-account {\n    float: left;\n    font-size: 18px;\n    margin-right: 40px;\n}\n.small-heading {\n    color: #777;\n    display: block;\n    font-size: 12px;\n    font-weight: bold;\n    margin-bottom: 5px;\n    text-transform: uppercase;\n}\n.inline-label {\n    background: #ddd;\n    border-radius: 3px;\n    font-size: 11px;\n    padding: 3px 8px;\n    text-transform: uppercase;\n}\n.inline-label.alert {\n    background: #e54747;\n    color: #fff;\n}\n.jetpack-account .inline-label {\n    margin-left: 5px;\n}\n.option-action .manual-key {\n    margin-top: 7px;\n}\n\n.alert {\n\tborder: 1px solid #e5e5e5;\n\tpadding: 0.4em 1em 1.4em 1em;\n    border-radius: 3px;\n    -webkit-border-radius: 3px;\n    border-width: 1px;\n    border-style: solid;\n}\n\n.alert h3.key-status {\n\tcolor: #fff;\n\tmargin: 1em 0 0.5em 0;\n}\n\n.alert.critical {\n\tbackground-color: #993300;\n}\n\n.alert.active {\n\tbackground-color: #649316;\n}\n\n.alert p.key-status {\n\tfont-size: 24px;\n}\n\n.alert p.description {\n\tcolor:#fff;\n\tfont-size: 14px;\n    margin: 0 0;\n\tfont-style: normal;\n}\n\n.alert p.description a,\n.alert p.description a,\n.alert p.description a,\n.alert p.description a {\n\tcolor: #fff;\n}\n\n.new-snapshot {\n\tmargin-top: 1em;\n\tpadding: 1em;\n\ttext-align: center;\n}\n\n.new-snapshot.stats {\n\tbackground: #fff;\n\tborder: 1px solid #e5e5e5;\n}\n\n.new-snapshot h3 {\n    background: #f5f5f5;\n\tcolor: #888;\n\tfont-size: 11px;\n    margin: 0;\n    padding: 3px;\n}\n\n.new-snapspot ul {\n\tfont-size: 12px;\n\twidth: 100%;\n}\n\n.new-snapshot ul li {\n    color: #999;\n\tfloat: left;\n    font-size: 11px;\n\tpadding: 0 20px;\n    text-transform: uppercase;\n\twidth: 33%;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n\t-ms-box-sizing: border-box;\n}\n\n.new-snapshot.stats ul li:first-child,\n.new-snapshot.stats ul li:nth-child(2) {\n\tborder-right:1px dotted #ccc;\n}\n\n.new-snapshot.account ul li:nth-child(2) {\n\tborder-right: none;\n}\n\n.new-snapshot ul li span {\n    color: #52accc;\n\tdisplay: block;\n\tfont-size: 32px;\n\tfont-weight: lighter;\n\tline-height: 1.5em;\n}\n\n.new-snapshot.stats {\n}\n\n.new-snapshot.account,\n.new-snapshot.settings {\n\tfloat: left;\n\tpadding: 0;\n\ttext-align: left;\n\twidth: 50%;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n\t-ms-box-sizing: border-box;\n}\n\n.account-container {\n\tbackground: #fff;\n\tborder: 1px solid #e5e5e5;\n\tmargin-right: 0.5em;\n}\n\n.settings-container {\n\tbackground: #fff;\n\tborder: 1px solid #e5e5e5;\n\tmargin-left: 0.5em;\n}\n\n.new-snapshot.account ul li {\n\twidth:100%\n}\n\n.new-snapshot.account ul li span {\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n\n.new-snapshot.settings ul li {\n\tborder: none;\n\tdisplay: block;\n\twidth:100%\n}\n\n.new-snapshot.settings ul li span {\n\tdisplay: block;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.new-snapshot.settings p.submit {\n\tmargin: 0;\n\ttext-align: center;\n}\n\n.akismet-settings th:first-child {\n\tvertical-align: top;\n\tpadding-top: 15px;\n}\n\n.akismet-settings th.akismet-api-key {\n\tvertical-align: middle;\n\tpadding-top: 0;\n}\n\n.akismet-settings input[type=text] {\n\twidth: 75%;\n}\n\n.akismet-settings span.note{\n\tfloat: left;\n\tpadding-left: 23px;\n\tfont-size: 75%;\n\tmargin-top: -10px;\n}\n\n.clearfix {\n\tclear:both;\n}\n\n/**\n * For the activation notice on the plugins page.\n */\n.akismet_activate {\n\tmin-width: 825px;\n\tborder: 1px solid #4F800D;\n\tpadding: 5px;\n\tmargin: 15px 0;\n\tbackground: #83AF24;\n\tbackground-image: -webkit-gradient(linear, 0% 0, 80% 100%, from(#83AF24), to(#4F800D));\n\tbackground-image: -moz-linear-gradient(80% 100% 120deg, #4F800D, #83AF24);\n\t-moz-border-radius: 3px;\n\tborder-radius: 3px;\n\t-webkit-border-radius: 3px;\n\tposition: relative;\n\toverflow: hidden;\n}\n\n.akismet_activate .aa_a {\n\tposition: absolute;\n\ttop: -5px;\n\tright: 10px;\n\tfont-size: 140px;\n\tcolor: #769F33;\n\tfont-family: Georgia, \"Times New Roman\", Times, serif;\n\tz-index: 1;\n}\n\n.akismet_activate .aa_button {\n\tfont-weight: bold;\n\tborder: 1px solid #029DD6;\n\tborder-top: 1px solid #06B9FD;\n\tfont-size: 15px;\n\ttext-align: center;\n\tpadding: 9px 0 8px 0;\n\tcolor: #FFF;\n\tbackground: #029DD6;\n\tbackground-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#029DD6), to(#0079B1));\n\tbackground-image: -moz-linear-gradient(0% 100% 90deg, #0079B1, #029DD6);\n\t-moz-border-radius: 2px;\n\tborder-radius: 2px;\n\t-webkit-border-radius: 2px;\n\twidth: 100%;\n\tcursor: pointer;\n\tmargin: 0;\n}\n\n.akismet_activate .aa_button:hover {\n\ttext-decoration: none !important;\n\tborder: 1px solid #029DD6;\n\tborder-bottom: 1px solid #00A8EF;\n\tfont-size: 15px;\n\ttext-align: center;\n\tpadding: 9px 0 8px 0;\n\tcolor: #F0F8FB;\n\tbackground: #0079B1;\n\tbackground-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#0079B1), to(#0092BF));\n\tbackground-image: -moz-linear-gradient(0% 100% 90deg, #0092BF, #0079B1);\n\t-moz-border-radius: 2px;\n\tborder-radius: 2px;\n\t-webkit-border-radius: 2px;\n}\n\n.akismet_activate .aa_button_border {\n\tborder: 1px solid #006699;\n\t-moz-border-radius: 2px;\n\tborder-radius: 2px;\n\t-webkit-border-radius: 2px;\n\tbackground: #029DD6;\n\tbackground-image: -webkit-gradient(linear, 0% 0, 0% 100%, from(#029DD6), to(#0079B1));\n\tbackground-image: -moz-linear-gradient(0% 100% 90deg, #0079B1, #029DD6);\n}\n\n.akismet_activate .aa_button_container {\n\tdisplay: inline-block;\n\tbackground: #DEF1B8;\n\tpadding: 5px;\n\t-moz-border-radius: 2px;\n\tborder-radius: 2px;\n\t-webkit-border-radius: 2px;\n\twidth: 266px;\n}\n\n.akismet_activate .aa_description {\n\tposition: absolute;\n\ttop: 22px;\n\tleft: 285px;\n\tmargin-left: 25px;\n\tcolor: #E5F2B1;\n\tfont-size: 15px;\n\tz-index: 1000;\n}\n\n.akismet_activate .aa_description strong {\n\tcolor: #FFF;\n\tfont-weight: normal;\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/_inc/akismet.js",
    "content": "jQuery( function ( $ ) {\n\tvar mshotRemovalTimer = null;\n\tvar mshotSecondTryTimer = null\n\tvar mshotThirdTryTimer = null\n\t\n\t$( 'a.activate-option' ).click( function(){\n\t\tvar link = $( this );\n\t\tif ( link.hasClass( 'clicked' ) ) {\n\t\t\tlink.removeClass( 'clicked' );\n\t\t}\n\t\telse {\n\t\t\tlink.addClass( 'clicked' );\n\t\t}\n\t\t$( '.toggle-have-key' ).slideToggle( 'slow', function() {});\n\t\treturn false;\n\t});\n\t$('.akismet-status').each(function () {\n\t\tvar thisId = $(this).attr('commentid');\n\t\t$(this).prependTo('#comment-' + thisId + ' .column-comment');\n\t});\n\t$('.akismet-user-comment-count').each(function () {\n\t\tvar thisId = $(this).attr('commentid');\n\t\t$(this).insertAfter('#comment-' + thisId + ' .author strong:first').show();\n\t});\n\t$('#the-comment-list')\n\t\t.find('tr.comment, tr[id ^= \"comment-\"]')\n\t\t.find('.column-author a[href^=\"http\"]:first') // Ignore mailto: links, which would be the comment author's email.\n\t\t.each(function () {\n\t\tvar linkHref = $(this).attr( 'href' );\n\t\t\n\t\t// Ignore any links to the current domain, which are diagnostic tools, like the IP address link\n\t\t// or any other links another plugin might add.\n\t\tvar currentHostParts = document.location.href.split( '/' );\n\t\tvar currentHost = currentHostParts[0] + '//' + currentHostParts[2] + '/';\n\t\t\n\t\tif ( linkHref.indexOf( currentHost ) != 0 ) {\n\t\t\tvar thisCommentId = $(this).parents('tr:first').attr('id').split(\"-\");\n\n\t\t\t$(this)\n\t\t\t\t.attr(\"id\", \"author_comment_url_\"+ thisCommentId[1])\n\t\t\t\t.after(\n\t\t\t\t\t$( '<a href=\"#\" class=\"remove_url\">x</a>' )\n\t\t\t\t\t\t.attr( 'commentid', thisCommentId[1] )\n\t\t\t\t\t\t.attr( 'title', WPAkismet.strings['Remove this URL'] )\n\t\t\t\t);\n\t\t}\n\t});\n\t$('.remove_url').live('click', function () {\n\t\tvar thisId = $(this).attr('commentid');\n\t\tvar data = {\n\t\t\taction: 'comment_author_deurl',\n\t\t\t_wpnonce: WPAkismet.comment_author_url_nonce,\n\t\t\tid: thisId\n\t\t};\n\t\t$.ajax({\n\t\t\turl: ajaxurl,\n\t\t\ttype: 'POST',\n\t\t\tdata: data,\n\t\t\tbeforeSend: function () {\n\t\t\t\t// Removes \"x\" link\n\t\t\t\t$(\"a[commentid='\"+ thisId +\"']\").hide();\n\t\t\t\t// Show temp status\n\t\t\t\t$(\"#author_comment_url_\"+ thisId).html( $( '<span/>' ).text( WPAkismet.strings['Removing...'] ) );\n\t\t\t},\n\t\t\tsuccess: function (response) {\n\t\t\t\tif (response) {\n\t\t\t\t\t// Show status/undo link\n\t\t\t\t\t$(\"#author_comment_url_\"+ thisId)\n\t\t\t\t\t\t.attr('cid', thisId)\n\t\t\t\t\t\t.addClass('akismet_undo_link_removal')\n\t\t\t\t\t\t.html(\n\t\t\t\t\t\t\t$( '<span/>' ).text( WPAkismet.strings['URL removed'] )\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.append( ' ' )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$( '<span/>' )\n\t\t\t\t\t\t\t\t.text( WPAkismet.strings['(undo)'] )\n\t\t\t\t\t\t\t\t.addClass( 'akismet-span-link' )\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn false;\n\t});\n\t$('.akismet_undo_link_removal').live('click', function () {\n\t\tvar thisId = $(this).attr('cid');\n\t\tvar thisUrl = $(this).attr('href');\n\t\tvar data = {\n\t\t\taction: 'comment_author_reurl',\n\t\t\t_wpnonce: WPAkismet.comment_author_url_nonce,\n\t\t\tid: thisId,\n\t\t\turl: thisUrl\n\t\t};\n\t\t$.ajax({\n\t\t\turl: ajaxurl,\n\t\t\ttype: 'POST',\n\t\t\tdata: data,\n\t\t\tbeforeSend: function () {\n\t\t\t\t// Show temp status\n\t\t\t\t$(\"#author_comment_url_\"+ thisId).html( $( '<span/>' ).text( WPAkismet.strings['Re-adding...'] ) );\n\t\t\t},\n\t\t\tsuccess: function (response) {\n\t\t\t\tif (response) {\n\t\t\t\t\t// Add \"x\" link\n\t\t\t\t\t$(\"a[commentid='\"+ thisId +\"']\").show();\n\t\t\t\t\t// Show link. Core strips leading http://, so let's do that too.\n\t\t\t\t\t$(\"#author_comment_url_\"+ thisId).removeClass('akismet_undo_link_removal').text( thisUrl.replace( /^http:\\/\\/(www\\.)?/ig, '' ) );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn false;\n\t});\n\n\t// Show a preview image of the hovered URL. Applies to author URLs and URLs inside the comments.\n\t$( 'a[id^=\"author_comment_url\"], tr.pingback td.column-author a:first-of-type, table.comments td.comment p a' ).mouseover( function () {\n\t\tclearTimeout( mshotRemovalTimer );\n\n\t\tif ( $( '.akismet-mshot' ).length > 0 ) {\n\t\t\tif ( $( '.akismet-mshot:first' ).data( 'link' ) == this ) {\n\t\t\t\t// The preview is already showing for this link.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// A new link is being hovered, so remove the old preview.\n\t\t\t\t$( '.akismet-mshot' ).remove();\n\t\t\t}\n\t\t}\n\n\t\tclearTimeout( mshotSecondTryTimer );\n\t\tclearTimeout( mshotThirdTryTimer );\n\n\t\tvar thisHref = $.URLEncode( $( this ).attr( 'href' ) );\n\n\t\tvar mShot = $( '<div class=\"akismet-mshot mshot-container\"><div class=\"mshot-arrow\"></div><img src=\"//s0.wordpress.com/mshots/v1/' + thisHref + '?w=450\" width=\"450\" height=\"338\" class=\"mshot-image\" /></div>' );\n\t\tmShot.data( 'link', this );\n\n\t\tvar offset = $( this ).offset();\n\n\t\tmShot.offset( {\n\t\t\tleft : Math.min( $( window ).width() - 475, offset.left + $( this ).width() + 10 ), // Keep it on the screen if the link is near the edge of the window.\n\t\t\ttop: offset.top + ( $( this ).height() / 2 ) - 101 // 101 = top offset of the arrow plus the top border thickness\n\t\t} );\n\n\t\tmshotSecondTryTimer = setTimeout( function () {\n\t\t\tmShot.find( '.mshot-image' ).attr( 'src', '//s0.wordpress.com/mshots/v1/'+thisHref+'?w=450&r=2' );\n\t\t}, 6000 );\n\n\t\tmshotThirdTryTimer = setTimeout( function () {\n\t\t\tmShot.find( '.mshot-image' ).attr( 'src', '//s0.wordpress.com/mshots/v1/'+thisHref+'?w=450&r=3' );\n\t\t}, 12000 );\n\n\t\t$( 'body' ).append( mShot );\n\t} ).mouseout( function () {\n\t\tmshotRemovalTimer = setTimeout( function () {\n\t\t\tclearTimeout( mshotSecondTryTimer );\n\t\t\tclearTimeout( mshotThirdTryTimer );\n\n\t\t\t$( '.akismet-mshot' ).remove();\n\t\t}, 200 );\n\t} );\n\n\t$('.checkforspam:not(.button-disabled)').click( function(e) {\n\t\t$('.checkforspam:not(.button-disabled)').addClass('button-disabled');\n\t\t$('.checkforspam-spinner').addClass( 'spinner' );\n\t\takismet_check_for_spam(0, 100);\n\t\te.preventDefault();\n\t});\n\n\tfunction akismet_check_for_spam(offset, limit) {\n\t\t$.post(\n\t\t\tajaxurl,\n\t\t\t{\n\t\t\t\t'action': 'akismet_recheck_queue',\n\t\t\t\t'offset': offset,\n\t\t\t\t'limit': limit\n\t\t\t},\n\t\t\tfunction(result) {\n\t\t\t\tif (result.processed < limit) {\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\takismet_check_for_spam(offset + limit, limit);\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n});\n// URL encode plugin\njQuery.extend({URLEncode:function(c){var o='';var x=0;c=c.toString();var r=/(^[a-zA-Z0-9_.]*)/;\n  while(x<c.length){var m=r.exec(c.substr(x));\n    if(m!=null && m.length>1 && m[1]!=''){o+=m[1];x+=m[1].length;\n    }else{if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16);\n    o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;}\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/_inc/form.js",
    "content": "var ak_js = document.getElementById( \"ak_js\" );\n\nif ( ! ak_js ) {\n\tak_js = document.createElement( 'input' );\n\tak_js.setAttribute( 'id', 'ak_js' );\n\tak_js.setAttribute( 'name', 'ak_js' );\n\tak_js.setAttribute( 'type', 'hidden' );\n}\nelse {\n\tak_js.parentNode.removeChild( ak_js );\n}\n\nak_js.setAttribute( 'value', ( new Date() ).getTime() );\n\nvar commentForm = document.getElementById( 'commentform' );\n\nif ( commentForm ) {\n\tcommentForm.appendChild( ak_js );\n}\nelse {\n\tvar replyRowContainer = document.getElementById( 'replyrow' );\n\n\tif ( replyRowContainer ) {\n\t\tvar children = replyRowContainer.getElementsByTagName( 'td' );\n\n\t\tif ( children.length > 0 ) {\n\t\t\tchildren[0].appendChild( ak_js );\n\t\t}\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/akismet.php",
    "content": "<?php\n/**\n * @package Akismet\n */\n/*\nPlugin Name: Akismet\nPlugin URI: http://akismet.com/\nDescription: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from spam</strong>. It keeps your site protected even while you sleep. To get started: 1) Click the \"Activate\" link to the left of this description, 2) <a href=\"http://akismet.com/get/\">Sign up for an Akismet plan</a> to get an API key, and 3) Go to your Akismet configuration page, and save your API key.\nVersion: 3.1.7\nAuthor: Automattic\nAuthor URI: http://automattic.com/wordpress-plugins/\nLicense: GPLv2 or later\nText Domain: akismet\n*/\n\n/*\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n\nCopyright 2005-2015 Automattic, Inc.\n*/\n\n// Make sure we don't expose any info if called directly\nif ( !function_exists( 'add_action' ) ) {\n\techo 'Hi there!  I\\'m just a plugin, not much I can do when called directly.';\n\texit;\n}\n\ndefine( 'AKISMET_VERSION', '3.1.7' );\ndefine( 'AKISMET__MINIMUM_WP_VERSION', '3.2' );\ndefine( 'AKISMET__PLUGIN_URL', plugin_dir_url( __FILE__ ) );\ndefine( 'AKISMET__PLUGIN_DIR', plugin_dir_path( __FILE__ ) );\ndefine( 'AKISMET_DELETE_LIMIT', 100000 );\n\nregister_activation_hook( __FILE__, array( 'Akismet', 'plugin_activation' ) );\nregister_deactivation_hook( __FILE__, array( 'Akismet', 'plugin_deactivation' ) );\n\nrequire_once( AKISMET__PLUGIN_DIR . 'class.akismet.php' );\nrequire_once( AKISMET__PLUGIN_DIR . 'class.akismet-widget.php' );\n\nadd_action( 'init', array( 'Akismet', 'init' ) );\n\nif ( is_admin() ) {\n\trequire_once( AKISMET__PLUGIN_DIR . 'class.akismet-admin.php' );\n\tadd_action( 'init', array( 'Akismet_Admin', 'init' ) );\n}\n\n//add wrapper class around deprecated akismet functions that are referenced elsewhere\nrequire_once( AKISMET__PLUGIN_DIR . 'wrapper.php' );\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/class.akismet-admin.php",
    "content": "<?php\n\nclass Akismet_Admin {\n\tconst NONCE = 'akismet-update-key';\n\n\tprivate static $initiated = false;\n\tprivate static $notices   = array();\n\tprivate static $allowed   = array(\n\t    'a' => array(\n\t        'href' => true,\n\t        'title' => true,\n\t    ),\n\t    'b' => array(),\n\t    'code' => array(),\n\t    'del' => array(\n\t        'datetime' => true,\n\t    ),\n\t    'em' => array(),\n\t    'i' => array(),\n\t    'q' => array(\n\t        'cite' => true,\n\t    ),\n\t    'strike' => array(),\n\t    'strong' => array(),\n\t);\n\n\tpublic static function init() {\n\t\tif ( ! self::$initiated ) {\n\t\t\tself::init_hooks();\n\t\t}\n\n\t\tif ( isset( $_POST['action'] ) && $_POST['action'] == 'enter-key' ) {\n\t\t\tself::enter_api_key();\n\t\t}\n\t}\n\n\tpublic static function init_hooks() {\n\t\t// The standalone stats page was removed in 3.0 for an all-in-one config and stats page.\n\t\t// Redirect any links that might have been bookmarked or in browser history.\n\t\tif ( isset( $_GET['page'] ) && 'akismet-stats-display' == $_GET['page'] ) {\n\t\t\twp_safe_redirect( esc_url_raw( self::get_page_url( 'stats' ) ), 301 );\n\t\t\tdie;\n\t\t}\n\n\t\tself::$initiated = true;\n\n\t\tadd_action( 'admin_init', array( 'Akismet_Admin', 'admin_init' ) );\n\t\tadd_action( 'admin_menu', array( 'Akismet_Admin', 'admin_menu' ), 5 ); # Priority 5, so it's called before Jetpack's admin_menu.\n\t\tadd_action( 'admin_notices', array( 'Akismet_Admin', 'display_notice' ) );\n\t\tadd_action( 'admin_enqueue_scripts', array( 'Akismet_Admin', 'load_resources' ) );\n\t\tadd_action( 'activity_box_end', array( 'Akismet_Admin', 'dashboard_stats' ) );\n\t\tadd_action( 'rightnow_end', array( 'Akismet_Admin', 'rightnow_stats' ) );\n\t\tadd_action( 'manage_comments_nav', array( 'Akismet_Admin', 'check_for_spam_button' ) );\n\t\tadd_action( 'admin_action_akismet_recheck_queue', array( 'Akismet_Admin', 'recheck_queue' ) );\n\t\tadd_action( 'wp_ajax_akismet_recheck_queue', array( 'Akismet_Admin', 'recheck_queue' ) );\n\t\tadd_action( 'wp_ajax_comment_author_deurl', array( 'Akismet_Admin', 'remove_comment_author_url' ) );\n\t\tadd_action( 'wp_ajax_comment_author_reurl', array( 'Akismet_Admin', 'add_comment_author_url' ) );\n\t\tadd_action( 'jetpack_auto_activate_akismet', array( 'Akismet_Admin', 'connect_jetpack_user' ) );\n\n\t\tadd_filter( 'plugin_action_links', array( 'Akismet_Admin', 'plugin_action_links' ), 10, 2 );\n\t\tadd_filter( 'comment_row_actions', array( 'Akismet_Admin', 'comment_row_action' ), 10, 2 );\n\t\t\n\t\tadd_filter( 'plugin_action_links_'.plugin_basename( plugin_dir_path( __FILE__ ) . 'akismet.php'), array( 'Akismet_Admin', 'admin_plugin_settings_link' ) );\n\t\t\n\t\tadd_filter( 'wxr_export_skip_commentmeta', array( 'Akismet_Admin', 'exclude_commentmeta_from_export' ), 10, 3 );\n\t}\n\n\tpublic static function admin_init() {\n\t\tload_plugin_textdomain( 'akismet' );\n\t\tadd_meta_box( 'akismet-status', __('Comment History', 'akismet'), array( 'Akismet_Admin', 'comment_status_meta_box' ), 'comment', 'normal' );\n\t}\n\n\tpublic static function admin_menu() {\n\t\tif ( class_exists( 'Jetpack' ) )\n\t\t\tadd_action( 'jetpack_admin_menu', array( 'Akismet_Admin', 'load_menu' ) );\n\t\telse\n\t\t\tself::load_menu();\n\t}\n\n\tpublic static function admin_head() {\n\t\tif ( !current_user_can( 'manage_options' ) )\n\t\t\treturn;\n\t}\n\t\n\tpublic static function admin_plugin_settings_link( $links ) { \n  \t\t$settings_link = '<a href=\"'.esc_url( self::get_page_url() ).'\">'.__('Settings', 'akismet').'</a>';\n  \t\tarray_unshift( $links, $settings_link ); \n  \t\treturn $links; \n\t}\n\n\tpublic static function load_menu() {\n\t\tif ( class_exists( 'Jetpack' ) )\n\t\t\t$hook = add_submenu_page( 'jetpack', __( 'Akismet' , 'akismet'), __( 'Akismet' , 'akismet'), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) );\n\t\telse\n\t\t\t$hook = add_options_page( __('Akismet', 'akismet'), __('Akismet', 'akismet'), 'manage_options', 'akismet-key-config', array( 'Akismet_Admin', 'display_page' ) );\n\n\t\tif ( version_compare( $GLOBALS['wp_version'], '3.3', '>=' ) ) {\n\t\t\tadd_action( \"load-$hook\", array( 'Akismet_Admin', 'admin_help' ) );\n\t\t}\n\t}\n\n\tpublic static function load_resources() {\n\t\tglobal $hook_suffix;\n\n\t\tif ( in_array( $hook_suffix, array(\n\t\t\t'index.php', # dashboard\n\t\t\t'edit-comments.php',\n\t\t\t'comment.php',\n\t\t\t'post.php',\n\t\t\t'settings_page_akismet-key-config',\n\t\t\t'jetpack_page_akismet-key-config',\n\t\t\t'plugins.php',\n\t\t) ) ) {\n\t\t\twp_register_style( 'akismet.css', AKISMET__PLUGIN_URL . '_inc/akismet.css', array(), AKISMET_VERSION );\n\t\t\twp_enqueue_style( 'akismet.css');\n\n\t\t\twp_register_script( 'akismet.js', AKISMET__PLUGIN_URL . '_inc/akismet.js', array('jquery','postbox'), AKISMET_VERSION );\n\t\t\twp_enqueue_script( 'akismet.js' );\n\t\t\twp_localize_script( 'akismet.js', 'WPAkismet', array(\n\t\t\t\t'comment_author_url_nonce' => wp_create_nonce( 'comment_author_url_nonce' ),\n\t\t\t\t'strings' => array(\n\t\t\t\t\t'Remove this URL' => __( 'Remove this URL' , 'akismet'),\n\t\t\t\t\t'Removing...'     => __( 'Removing...' , 'akismet'),\n\t\t\t\t\t'URL removed'     => __( 'URL removed' , 'akismet'),\n\t\t\t\t\t'(undo)'          => __( '(undo)' , 'akismet'),\n\t\t\t\t\t'Re-adding...'    => __( 'Re-adding...' , 'akismet'),\n\t\t\t\t)\n\t\t\t) );\n\t\t}\n\t}\n\n\t/**\n\t * Add help to the Akismet page\n\t *\n\t * @return false if not the Akismet page\n\t */\n\tpublic static function admin_help() {\n\t\t$current_screen = get_current_screen();\n\n\t\t// Screen Content\n\t\tif ( current_user_can( 'manage_options' ) ) {\n\t\t\tif ( !Akismet::get_api_key() || ( isset( $_GET['view'] ) && $_GET['view'] == 'start' ) ) {\n\t\t\t\t//setup page\n\t\t\t\t$current_screen->add_help_tab(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'id'\t\t=> 'overview',\n\t\t\t\t\t\t'title'\t\t=> __( 'Overview' , 'akismet'),\n\t\t\t\t\t\t'content'\t=>\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Akismet Setup' , 'akismet') . '</strong></p>' .\n\t\t\t\t\t\t\t'<p>' . esc_html__( 'Akismet filters out spam, so you can focus on more important things.' , 'akismet') . '</p>' .\n\t\t\t\t\t\t\t'<p>' . esc_html__( 'On this page, you are able to set up the Akismet plugin.' , 'akismet') . '</p>',\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t$current_screen->add_help_tab(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'id'\t\t=> 'setup-signup',\n\t\t\t\t\t\t'title'\t\t=> __( 'New to Akismet' , 'akismet'),\n\t\t\t\t\t\t'content'\t=>\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Akismet Setup' , 'akismet') . '</strong></p>' .\n\t\t\t\t\t\t\t'<p>' . esc_html__( 'You need to enter an API key to activate the Akismet service on your site.' , 'akismet') . '</p>' .\n\t\t\t\t\t\t\t'<p>' . sprintf( __( 'Sign up for an account on %s to get an API Key.' , 'akismet'), '<a href=\"https://akismet.com/plugin-signup/\" target=\"_blank\">Akismet.com</a>' ) . '</p>',\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t$current_screen->add_help_tab(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'id'\t\t=> 'setup-manual',\n\t\t\t\t\t\t'title'\t\t=> __( 'Enter an API Key' , 'akismet'),\n\t\t\t\t\t\t'content'\t=>\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Akismet Setup' , 'akismet') . '</strong></p>' .\n\t\t\t\t\t\t\t'<p>' . esc_html__( 'If you already have an API key' , 'akismet') . '</p>' .\n\t\t\t\t\t\t\t'<ol>' .\n\t\t\t\t\t\t\t\t'<li>' . esc_html__( 'Copy and paste the API key into the text field.' , 'akismet') . '</li>' .\n\t\t\t\t\t\t\t\t'<li>' . esc_html__( 'Click the Use this Key button.' , 'akismet') . '</li>' .\n\t\t\t\t\t\t\t'</ol>',\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\telseif ( isset( $_GET['view'] ) && $_GET['view'] == 'stats' ) {\n\t\t\t\t//stats page\n\t\t\t\t$current_screen->add_help_tab(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'id'\t\t=> 'overview',\n\t\t\t\t\t\t'title'\t\t=> __( 'Overview' , 'akismet'),\n\t\t\t\t\t\t'content'\t=>\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Akismet Stats' , 'akismet') . '</strong></p>' .\n\t\t\t\t\t\t\t'<p>' . esc_html__( 'Akismet filters out spam, so you can focus on more important things.' , 'akismet') . '</p>' .\n\t\t\t\t\t\t\t'<p>' . esc_html__( 'On this page, you are able to view stats on spam filtered on your site.' , 'akismet') . '</p>',\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t//configuration page\n\t\t\t\t$current_screen->add_help_tab(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'id'\t\t=> 'overview',\n\t\t\t\t\t\t'title'\t\t=> __( 'Overview' , 'akismet'),\n\t\t\t\t\t\t'content'\t=>\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Akismet Configuration' , 'akismet') . '</strong></p>' .\n\t\t\t\t\t\t\t'<p>' . esc_html__( 'Akismet filters out spam, so you can focus on more important things.' , 'akismet') . '</p>' .\n\t\t\t\t\t\t\t'<p>' . esc_html__( 'On this page, you are able to enter/remove an API key, view account information and view spam stats.' , 'akismet') . '</p>',\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t$current_screen->add_help_tab(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'id'\t\t=> 'settings',\n\t\t\t\t\t\t'title'\t\t=> __( 'Settings' , 'akismet'),\n\t\t\t\t\t\t'content'\t=>\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Akismet Configuration' , 'akismet') . '</strong></p>' .\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'API Key' , 'akismet') . '</strong> - ' . esc_html__( 'Enter/remove an API key.' , 'akismet') . '</p>' .\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Comments' , 'akismet') . '</strong> - ' . esc_html__( 'Show the number of approved comments beside each comment author in the comments list page.' , 'akismet') . '</p>' .\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Strictness' , 'akismet') . '</strong> - ' . esc_html__( 'Choose to either discard the worst spam automatically or to always put all spam in spam folder.' , 'akismet') . '</p>',\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t$current_screen->add_help_tab(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'id'\t\t=> 'account',\n\t\t\t\t\t\t'title'\t\t=> __( 'Account' , 'akismet'),\n\t\t\t\t\t\t'content'\t=>\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Akismet Configuration' , 'akismet') . '</strong></p>' .\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Subscription Type' , 'akismet') . '</strong> - ' . esc_html__( 'The Akismet subscription plan' , 'akismet') . '</p>' .\n\t\t\t\t\t\t\t'<p><strong>' . esc_html__( 'Status' , 'akismet') . '</strong> - ' . esc_html__( 'The subscription status - active, cancelled or suspended' , 'akismet') . '</p>',\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Help Sidebar\n\t\t$current_screen->set_help_sidebar(\n\t\t\t'<p><strong>' . esc_html__( 'For more information:' , 'akismet') . '</strong></p>' .\n\t\t\t'<p><a href=\"https://akismet.com/faq/\" target=\"_blank\">'     . esc_html__( 'Akismet FAQ' , 'akismet') . '</a></p>' .\n\t\t\t'<p><a href=\"https://akismet.com/support/\" target=\"_blank\">' . esc_html__( 'Akismet Support' , 'akismet') . '</a></p>'\n\t\t);\n\t}\n\n\tpublic static function enter_api_key() {\n\t\tif ( function_exists('current_user_can') && !current_user_can('manage_options') )\n\t\t\tdie(__('Cheatin&#8217; uh?', 'akismet'));\n\n\t\tif ( !wp_verify_nonce( $_POST['_wpnonce'], self::NONCE ) )\n\t\t\treturn false;\n\n\t\tforeach( array( 'akismet_strictness', 'akismet_show_user_comments_approved' ) as $option ) {\n\t\t\tupdate_option( $option, isset( $_POST[$option] ) && (int) $_POST[$option] == 1 ? '1' : '0' );\n\t\t}\n\n\t\tif ( defined( 'WPCOM_API_KEY' ) )\n\t\t\treturn false; //shouldn't have option to save key if already defined\n\n\t\t$new_key = preg_replace( '/[^a-f0-9]/i', '', $_POST['key'] );\n\t\t$old_key = Akismet::get_api_key();\n\n\t\tif ( empty( $new_key ) ) {\n\t\t\tif ( !empty( $old_key ) ) {\n\t\t\t\tdelete_option( 'wordpress_api_key' );\n\t\t\t\tself::$notices[] = 'new-key-empty';\n\t\t\t}\n\t\t}\n\t\telseif ( $new_key != $old_key ) {\n\t\t\tself::save_key( $new_key );\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic static function save_key( $api_key ) {\n\t\t$key_status = Akismet::verify_key( $api_key );\n\n\t\tif ( $key_status == 'valid' ) {\n\t\t\t$akismet_user = self::get_akismet_user( $api_key );\n\t\t\t\n\t\t\tif ( $akismet_user ) {\t\t\t\t\n\t\t\t\tif ( in_array( $akismet_user->status, array( 'active', 'active-dunning', 'no-sub' ) ) )\n\t\t\t\t\tupdate_option( 'wordpress_api_key', $api_key );\n\t\t\t\t\n\t\t\t\tif ( $akismet_user->status == 'active' )\n\t\t\t\t\tself::$notices['status'] = 'new-key-valid';\n\t\t\t\telseif ( $akismet_user->status == 'notice' )\n\t\t\t\t\tself::$notices['status'] = $akismet_user;\n\t\t\t\telse\n\t\t\t\t\tself::$notices['status'] = $akismet_user->status;\n\t\t\t}\n\t\t\telse\n\t\t\t\tself::$notices['status'] = 'new-key-invalid';\n\t\t}\n\t\telseif ( in_array( $key_status, array( 'invalid', 'failed' ) ) )\n\t\t\tself::$notices['status'] = 'new-key-'.$key_status;\n\t}\n\n\tpublic static function dashboard_stats() {\n\t\tif ( !function_exists('did_action') || did_action( 'rightnow_end' ) )\n\t\t\treturn; // We already displayed this info in the \"Right Now\" section\n\n\t\tif ( !$count = get_option('akismet_spam_count') )\n\t\t\treturn;\n\n\t\tglobal $submenu;\n\n\t\techo '<h3>' . esc_html( _x( 'Spam', 'comments' , 'akismet') ) . '</h3>';\n\n\t\techo '<p>'.sprintf( _n(\n\t\t\t\t'<a href=\"%1$s\">Akismet</a> has protected your site from <a href=\"%2$s\">%3$s spam comment</a>.',\n\t\t\t\t'<a href=\"%1$s\">Akismet</a> has protected your site from <a href=\"%2$s\">%3$s spam comments</a>.',\n\t\t\t\t$count\n\t\t\t, 'akismet'), 'https://akismet.com/wordpress/', esc_url( add_query_arg( array( 'page' => 'akismet-admin' ), admin_url( isset( $submenu['edit-comments.php'] ) ? 'edit-comments.php' : 'edit.php' ) ) ), number_format_i18n($count) ).'</p>';\n\t}\n\n\t// WP 2.5+\n\tpublic static function rightnow_stats() {\n\t\tif ( $count = get_option('akismet_spam_count') ) {\n\t\t\t$intro = sprintf( _n(\n\t\t\t\t'<a href=\"%1$s\">Akismet</a> has protected your site from %2$s spam comment already. ',\n\t\t\t\t'<a href=\"%1$s\">Akismet</a> has protected your site from %2$s spam comments already. ',\n\t\t\t\t$count\n\t\t\t, 'akismet'), 'https://akismet.com/wordpress/', number_format_i18n( $count ) );\n\t\t} else {\n\t\t\t$intro = sprintf( __('<a href=\"%s\">Akismet</a> blocks spam from getting to your blog. ', 'akismet'), 'https://akismet.com/wordpress/' );\n\t\t}\n\n\t\t$link = add_query_arg( array( 'comment_status' => 'spam' ), admin_url( 'edit-comments.php' ) );\n\n\t\tif ( $queue_count = self::get_spam_count() ) {\n\t\t\t$queue_text = sprintf( _n(\n\t\t\t\t'There&#8217;s <a href=\"%2$s\">%1$s comment</a> in your spam queue right now.',\n\t\t\t\t'There are <a href=\"%2$s\">%1$s comments</a> in your spam queue right now.',\n\t\t\t\t$queue_count\n\t\t\t, 'akismet'), number_format_i18n( $queue_count ), esc_url( $link ) );\n\t\t} else {\n\t\t\t$queue_text = sprintf( __( \"There&#8217;s nothing in your <a href='%s'>spam queue</a> at the moment.\" , 'akismet'), esc_url( $link ) );\n\t\t}\n\n\t\t$text = $intro . '<br />' . $queue_text;\n\t\techo \"<p class='akismet-right-now'>$text</p>\\n\";\n\t}\n\n\tpublic static function check_for_spam_button( $comment_status ) {\n\t\t// The \"Check for Spam\" button should only appear when the page might be showing\n\t\t// a comment with comment_approved=0, which means an un-trashed, un-spammed,\n\t\t// not-yet-moderated comment.\n\t\tif ( 'all' != $comment_status && 'moderated' != $comment_status ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( function_exists('plugins_url') )\n\t\t\t$link = add_query_arg( array( 'action' => 'akismet_recheck_queue' ), admin_url( 'admin.php' ) );\n\t\telse\n\t\t\t$link = add_query_arg( array( 'page' => 'akismet-admin', 'recheckqueue' => 'true', 'noheader' => 'true' ), admin_url( 'edit-comments.php' ) );\n\n\t\techo '</div><div class=\"alignleft\"><a class=\"button-secondary checkforspam\" href=\"' . esc_url( $link ) . '\">' . esc_html__('Check for Spam', 'akismet') . '</a><span class=\"checkforspam-spinner\"></span>';\n\t}\n\n\tpublic static function recheck_queue() {\n\t\tglobal $wpdb;\n\n\t\tAkismet::fix_scheduled_recheck();\n\n\t\tif ( ! ( isset( $_GET['recheckqueue'] ) || ( isset( $_REQUEST['action'] ) && 'akismet_recheck_queue' == $_REQUEST['action'] ) ) )\n\t\t\treturn;\n\n\t\t$paginate = '';\n\t\tif ( isset( $_POST['limit'] ) && isset( $_POST['offset'] ) ) {\n\t\t\t$paginate = $wpdb->prepare( \" LIMIT %d OFFSET %d\", array( $_POST['limit'], $_POST['offset'] ) );\n\t\t}\n\t\t$moderation = $wpdb->get_results( \"SELECT * FROM {$wpdb->comments} WHERE comment_approved = '0'{$paginate}\", ARRAY_A );\n\n\t\tforeach ( (array) $moderation as $c ) {\n\t\t\t$c['user_ip']      = $c['comment_author_IP'];\n\t\t\t$c['user_agent']   = $c['comment_agent'];\n\t\t\t$c['referrer']     = '';\n\t\t\t$c['blog']         = get_bloginfo('url');\n\t\t\t$c['blog_lang']    = get_locale();\n\t\t\t$c['blog_charset'] = get_option('blog_charset');\n\t\t\t$c['permalink']    = get_permalink($c['comment_post_ID']);\n\n\t\t\t$c['user_role'] = '';\n\t\t\tif ( isset( $c['user_ID'] ) )\n\t\t\t\t$c['user_role'] = Akismet::get_user_roles($c['user_ID']);\n\n\t\t\tif ( Akismet::is_test_mode() )\n\t\t\t\t$c['is_test'] = 'true';\n\n\t\t\tadd_comment_meta( $c['comment_ID'], 'akismet_rechecking', true );\n\n\t\t\t$response = Akismet::http_post( Akismet::build_query( $c ), 'comment-check' );\n\t\t\t\n\t\t\tif ( 'true' == $response[1] ) {\n\t\t\t\twp_set_comment_status( $c['comment_ID'], 'spam' );\n\t\t\t\tupdate_comment_meta( $c['comment_ID'], 'akismet_result', 'true' );\n\t\t\t\tdelete_comment_meta( $c['comment_ID'], 'akismet_error' );\n\t\t\t\tdelete_comment_meta( $c['comment_ID'], 'akismet_delayed_moderation_email' );\n\t\t\t\tAkismet::update_comment_history( $c['comment_ID'], '', 'recheck-spam' );\n\n\t\t\t} elseif ( 'false' == $response[1] ) {\n\t\t\t\tupdate_comment_meta( $c['comment_ID'], 'akismet_result', 'false' );\n\t\t\t\tdelete_comment_meta( $c['comment_ID'], 'akismet_error' );\n\t\t\t\tdelete_comment_meta( $c['comment_ID'], 'akismet_delayed_moderation_email' );\n\t\t\t\tAkismet::update_comment_history( $c['comment_ID'], '', 'recheck-ham' );\n\t\t\t// abnormal result: error\n\t\t\t} else {\n\t\t\t\tupdate_comment_meta( $c['comment_ID'], 'akismet_result', 'error' );\n\t\t\t\tAkismet::update_comment_history(\n\t\t\t\t\t$c['comment_ID'],\n\t\t\t\t\t'',\n\t\t\t\t\t'recheck-error',\n\t\t\t\t\tarray( 'response' => substr( $response[1], 0, 50 ) )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdelete_comment_meta( $c['comment_ID'], 'akismet_rechecking' );\n\t\t}\n\t\tif ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {\n\t\t\twp_send_json( array(\n\t\t\t\t'processed' => count((array) $moderation),\n\t\t\t));\n\t\t}\n\t\telse {\n\t\t\t$redirect_to = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : admin_url( 'edit-comments.php' );\n\t\t\twp_safe_redirect( $redirect_to );\n\t\t\texit;\n\t\t}\n\t}\n\n\t// Adds an 'x' link next to author URLs, clicking will remove the author URL and show an undo link\n\tpublic static function remove_comment_author_url() {\n\t\tif ( !empty( $_POST['id'] ) && check_admin_referer( 'comment_author_url_nonce' ) ) {\n\t\t\t$comment = get_comment( intval( $_POST['id'] ), ARRAY_A );\n\t\t\tif ( $comment && current_user_can( 'edit_comment', $comment['comment_ID'] ) ) {\n\t\t\t\t$comment['comment_author_url'] = '';\n\t\t\t\tdo_action( 'comment_remove_author_url' );\n\t\t\t\tprint( wp_update_comment( $comment ) );\n\t\t\t\tdie();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function add_comment_author_url() {\n\t\tif ( !empty( $_POST['id'] ) && !empty( $_POST['url'] ) && check_admin_referer( 'comment_author_url_nonce' ) ) {\n\t\t\t$comment = get_comment( intval( $_POST['id'] ), ARRAY_A );\n\t\t\tif ( $comment && current_user_can( 'edit_comment', $comment['comment_ID'] ) ) {\n\t\t\t\t$comment['comment_author_url'] = esc_url( $_POST['url'] );\n\t\t\t\tdo_action( 'comment_add_author_url' );\n\t\t\t\tprint( wp_update_comment( $comment ) );\n\t\t\t\tdie();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function comment_row_action( $a, $comment ) {\n\n\t\t// failsafe for old WP versions\n\t\tif ( !function_exists('add_comment_meta') )\n\t\t\treturn $a;\n\n\t\t$akismet_result = get_comment_meta( $comment->comment_ID, 'akismet_result', true );\n\t\t$akismet_error  = get_comment_meta( $comment->comment_ID, 'akismet_error', true );\n\t\t$user_result    = get_comment_meta( $comment->comment_ID, 'akismet_user_result', true);\n\t\t$comment_status = wp_get_comment_status( $comment->comment_ID );\n\t\t$desc = null;\n\t\tif ( $akismet_error ) {\n\t\t\t$desc = __( 'Awaiting spam check' , 'akismet');\n\t\t} elseif ( !$user_result || $user_result == $akismet_result ) {\n\t\t\t// Show the original Akismet result if the user hasn't overridden it, or if their decision was the same\n\t\t\tif ( $akismet_result == 'true' && $comment_status != 'spam' && $comment_status != 'trash' )\n\t\t\t\t$desc = __( 'Flagged as spam by Akismet' , 'akismet');\n\t\t\telseif ( $akismet_result == 'false' && $comment_status == 'spam' )\n\t\t\t\t$desc = __( 'Cleared by Akismet' , 'akismet');\n\t\t} else {\n\t\t\t$who = get_comment_meta( $comment->comment_ID, 'akismet_user', true );\n\t\t\tif ( $user_result == 'true' )\n\t\t\t\t$desc = sprintf( __('Flagged as spam by %s', 'akismet'), $who );\n\t\t\telse\n\t\t\t\t$desc = sprintf( __('Un-spammed by %s', 'akismet'), $who );\n\t\t}\n\n\t\t// add a History item to the hover links, just after Edit\n\t\tif ( $akismet_result ) {\n\t\t\t$b = array();\n\t\t\tforeach ( $a as $k => $item ) {\n\t\t\t\t$b[ $k ] = $item;\n\t\t\t\tif (\n\t\t\t\t\t$k == 'edit'\n\t\t\t\t\t|| ( $k == 'unspam' && $GLOBALS['wp_version'] >= 3.4 )\n\t\t\t\t) {\n\t\t\t\t\t$b['history'] = '<a href=\"comment.php?action=editcomment&amp;c='.$comment->comment_ID.'#akismet-status\" title=\"'. esc_attr__( 'View comment history' , 'akismet') . '\"> '. esc_html__('History', 'akismet') . '</a>';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$a = $b;\n\t\t}\n\n\t\tif ( $desc )\n\t\t\techo '<span class=\"akismet-status\" commentid=\"'.$comment->comment_ID.'\"><a href=\"comment.php?action=editcomment&amp;c='.$comment->comment_ID.'#akismet-status\" title=\"' . esc_attr__( 'View comment history' , 'akismet') . '\">'.esc_html( $desc ).'</a></span>';\n\n\t\t$show_user_comments = apply_filters( 'akismet_show_user_comments_approved', get_option('akismet_show_user_comments_approved') );\n\t\t$show_user_comments = $show_user_comments === 'false' ? false : $show_user_comments; //option used to be saved as 'false' / 'true'\n\t\t\n\t\tif ( $show_user_comments ) {\n\t\t\t$comment_count = Akismet::get_user_comments_approved( $comment->user_id, $comment->comment_author_email, $comment->comment_author, $comment->comment_author_url );\n\t\t\t$comment_count = intval( $comment_count );\n\t\t\techo '<span class=\"akismet-user-comment-count\" commentid=\"'.$comment->comment_ID.'\" style=\"display:none;\"><br><span class=\"akismet-user-comment-counts\">'. sprintf( esc_html( _n( '%s approved', '%s approved', $comment_count , 'akismet') ), number_format_i18n( $comment_count ) ) . '</span></span>';\n\t\t}\n\n\t\treturn $a;\n\t}\n\n\tpublic static function comment_status_meta_box( $comment ) {\n\t\t$history = Akismet::get_comment_history( $comment->comment_ID );\n\n\t\tif ( $history ) {\n\t\t\techo '<div class=\"akismet-history\" style=\"margin: 13px;\">';\n\n\t\t\tforeach ( $history as $row ) {\n\t\t\t\t$time = date( 'D d M Y @ h:i:m a', $row['time'] ) . ' GMT';\n\t\t\t\t\n\t\t\t\t$message = '';\n\t\t\t\t\n\t\t\t\tif ( ! empty( $row['message'] ) ) {\n\t\t\t\t\t// Old versions of Akismet stored the message as a literal string in the commentmeta.\n\t\t\t\t\t// New versions don't do that for two reasons:\n\t\t\t\t\t// 1) Save space.\n\t\t\t\t\t// 2) The message can be translated into the current language of the blog, not stuck \n\t\t\t\t\t//    in the language of the blog when the comment was made.\n\t\t\t\t\t$message = $row['message'];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// If possible, use a current translation.\n\t\t\t\tswitch ( $row['event'] ) {\n\t\t\t\t\tcase 'recheck-spam';\n\t\t\t\t\t\t$message = __( 'Akismet re-checked and caught this comment as spam.', 'akismet' );\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'check-spam':\n\t\t\t\t\t\t$message = __( 'Akismet caught this comment as spam.', 'akismet' );\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'recheck-ham':\n\t\t\t\t\t\t$message = __( 'Akismet re-checked and cleared this comment.', 'akismet' );\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'check-ham':\n\t\t\t\t\t\t$message = __( 'Akismet cleared this comment.', 'akismet' );\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'wp-blacklisted':\n\t\t\t\t\t\t$message = __( 'Comment was caught by wp_blacklist_check.', 'akismet' );\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'report-spam':\n\t\t\t\t\t\tif ( isset( $row['user'] ) ) {\n\t\t\t\t\t\t\t$message = sprintf( __( '%s reported this comment as spam.', 'akismet' ), $row['user'] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( ! $message ) {\n\t\t\t\t\t\t\t$message = __( 'This comment was reported as spam.', 'akismet' );\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'report-ham':\n\t\t\t\t\t\tif ( isset( $row['user'] ) ) {\n\t\t\t\t\t\t\t$message = sprintf( __( '%s reported this comment as not spam.', 'akismet' ), $row['user'] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( ! $message ) {\n\t\t\t\t\t\t\t$message = __( 'This comment was reported as not spam.', 'akismet' );\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cron-retry-spam':\n\t\t\t\t\t\t$message = __( 'Akismet caught this comment as spam during an automatic retry.' , 'akismet');\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cron-retry-ham':\n\t\t\t\t\t\t$message = __( 'Akismet cleared this comment during an automatic retry.', 'akismet');\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'check-error':\n\t\t\t\t\t\tif ( isset( $row['meta'], $row['meta']['response'] ) ) {\n\t\t\t\t\t\t\t$message = sprintf( __( 'Akismet was unable to check this comment (response: %s) but will automatically retry later.', 'akismet'), $row['meta']['response'] );\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'recheck-error':\n\t\t\t\t\t\tif ( isset( $row['meta'], $row['meta']['response'] ) ) {\n\t\t\t\t\t\t\t$message = sprintf( __( 'Akismet was unable to recheck this comment (response: %s).', 'akismet'), $row['meta']['response'] );\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif ( preg_match( '/^status-changed/', $row['event'] ) ) {\n\t\t\t\t\t\t\t// Half of these used to be saved without the dash after 'status-changed'.\n\t\t\t\t\t\t\t// See https://plugins.trac.wordpress.org/changeset/1150658/akismet/trunk\n\t\t\t\t\t\t\t$new_status = preg_replace( '/^status-changed-?/', '', $row['event'] );\n\t\t\t\t\t\t\t$message = sprintf( __( 'Comment status was changed to %s', 'akismet' ), $new_status );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( preg_match( '/^status-/', $row['event'] ) ) {\n\t\t\t\t\t\t\t$new_status = preg_replace( '/^status-/', '', $row['event'] );\n\n\t\t\t\t\t\t\tif ( isset( $row['user'] ) ) {\n\t\t\t\t\t\t\t\t$message = sprintf( __( '%1$s changed the comment status to %2$s.', 'akismet' ), $row['user'], $new_status );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t}\n\n\t\t\t\techo '<div style=\"margin-bottom: 13px;\">';\n\t\t\t\t\techo '<span style=\"color: #999;\" alt=\"' . $time . '\" title=\"' . $time . '\">' . sprintf( esc_html__('%s ago', 'akismet'), human_time_diff( $row['time'] ) ) . '</span>';\n\t\t\t\t\techo ' - ';\n\t\t\t\t\techo esc_html( $message );\n\t\t\t\techo '</div>';\n\t\t\t}\n\n\t\t\techo '</div>';\n\t\t}\n\t}\n\n\tpublic static function plugin_action_links( $links, $file ) {\n\t\tif ( $file == plugin_basename( AKISMET__PLUGIN_URL . '/akismet.php' ) ) {\n\t\t\t$links[] = '<a href=\"' . esc_url( self::get_page_url() ) . '\">'.esc_html__( 'Settings' , 'akismet').'</a>';\n\t\t}\n\n\t\treturn $links;\n\t}\n\n\t// Total spam in queue\n\t// get_option( 'akismet_spam_count' ) is the total caught ever\n\tpublic static function get_spam_count( $type = false ) {\n\t\tglobal $wpdb;\n\n\t\tif ( !$type ) { // total\n\t\t\t$count = wp_cache_get( 'akismet_spam_count', 'widget' );\n\t\t\tif ( false === $count ) {\n\t\t\t\tif ( function_exists('wp_count_comments') ) {\n\t\t\t\t\t$count = wp_count_comments();\n\t\t\t\t\t$count = $count->spam;\n\t\t\t\t} else {\n\t\t\t\t\t$count = (int) $wpdb->get_var(\"SELECT COUNT(comment_ID) FROM {$wpdb->comments} WHERE comment_approved = 'spam'\");\n\t\t\t\t}\n\t\t\t\twp_cache_set( 'akismet_spam_count', $count, 'widget', 3600 );\n\t\t\t}\n\t\t\treturn $count;\n\t\t} elseif ( 'comments' == $type || 'comment' == $type ) { // comments\n\t\t\t$type = '';\n\t\t}\n\n\t\treturn (int) $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(comment_ID) FROM {$wpdb->comments} WHERE comment_approved = 'spam' AND comment_type = %s\", $type ) );\n\t}\n\n\t// Check connectivity between the WordPress blog and Akismet's servers.\n\t// Returns an associative array of server IP addresses, where the key is the IP address, and value is true (available) or false (unable to connect).\n\tpublic static function check_server_ip_connectivity() {\n\t\t\n\t\t$servers = $ips = array();\n\n\t\t// Some web hosts may disable this function\n\t\tif ( function_exists('gethostbynamel') ) {\t\n\t\t\t\n\t\t\t$ips = gethostbynamel( 'rest.akismet.com' );\n\t\t\tif ( $ips && is_array($ips) && count($ips) ) {\n\t\t\t\t$api_key = Akismet::get_api_key();\n\t\t\t\t\n\t\t\t\tforeach ( $ips as $ip ) {\n\t\t\t\t\t$response = Akismet::verify_key( $api_key, $ip );\n\t\t\t\t\t// even if the key is invalid, at least we know we have connectivity\n\t\t\t\t\tif ( $response == 'valid' || $response == 'invalid' )\n\t\t\t\t\t\t$servers[$ip] = 'connected';\n\t\t\t\t\telse\n\t\t\t\t\t\t$servers[$ip] = $response ? $response : 'unable to connect';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn $servers;\n\t}\n\t\n\t// Simpler connectivity check\n\tpublic static function check_server_connectivity($cache_timeout = 86400) {\n\t\t\n\t\t$debug = array();\n\t\t$debug[ 'PHP_VERSION' ]         = PHP_VERSION;\n\t\t$debug[ 'WORDPRESS_VERSION' ]   = $GLOBALS['wp_version'];\n\t\t$debug[ 'AKISMET_VERSION' ]     = AKISMET_VERSION;\n\t\t$debug[ 'AKISMET__PLUGIN_DIR' ] = AKISMET__PLUGIN_DIR;\n\t\t$debug[ 'SITE_URL' ]            = site_url();\n\t\t$debug[ 'HOME_URL' ]            = home_url();\n\t\t\n\t\t$servers = get_option('akismet_available_servers');\n\t\tif ( (time() - get_option('akismet_connectivity_time') < $cache_timeout) && $servers !== false ) {\n\t\t\t$servers = self::check_server_ip_connectivity();\n\t\t\tupdate_option('akismet_available_servers', $servers);\n\t\t\tupdate_option('akismet_connectivity_time', time());\n\t\t}\n\t\t\t\n\t\t$response = wp_remote_get( 'http://rest.akismet.com/1.1/test' );\n\t\t\n\t\t$debug[ 'gethostbynamel' ]  = function_exists('gethostbynamel') ? 'exists' : 'not here';\n\t\t$debug[ 'Servers' ]         = $servers;\n\t\t$debug[ 'Test Connection' ] = $response;\n\t\t\n\t\tAkismet::log( $debug );\n\t\t\n\t\tif ( $response && 'connected' == wp_remote_retrieve_body( $response ) )\n\t\t\treturn true;\n\t\t\n\t\treturn false;\n\t}\n\n\t// Check the server connectivity and store the available servers in an option. \n\tpublic static function get_server_connectivity($cache_timeout = 86400) {\n\t\treturn self::check_server_connectivity( $cache_timeout );\n\t}\n\n\tpublic static function get_number_spam_waiting() {\n\t\tglobal $wpdb;\n\t\treturn (int) $wpdb->get_var( \"SELECT COUNT(*) FROM {$wpdb->commentmeta} WHERE meta_key = 'akismet_error'\" );\n\t}\n\n\tpublic static function get_page_url( $page = 'config' ) {\n\n\t\t$args = array( 'page' => 'akismet-key-config' );\n\n\t\tif ( $page == 'stats' )\n\t\t\t$args = array( 'page' => 'akismet-key-config', 'view' => 'stats' );\n\t\telseif ( $page == 'delete_key' )\n\t\t\t$args = array( 'page' => 'akismet-key-config', 'view' => 'start', 'action' => 'delete-key', '_wpnonce' => wp_create_nonce( self::NONCE ) );\n\n\t\t$url = add_query_arg( $args, class_exists( 'Jetpack' ) ? admin_url( 'admin.php' ) : admin_url( 'options-general.php' ) );\n\n\t\treturn $url;\n\t}\n\t\n\tpublic static function get_akismet_user( $api_key ) {\n\t\t$akismet_user = false;\n\n\t\t$subscription_verification = Akismet::http_post( Akismet::build_query( array( 'key' => $api_key, 'blog' => get_bloginfo( 'url' ) ) ), 'get-subscription' );\n\n\t\tif ( ! empty( $subscription_verification[1] ) ) {\n\t\t\tif ( 'invalid' !== $subscription_verification[1] ) {\n\t\t\t\t$akismet_user = json_decode( $subscription_verification[1] );\n\t\t\t}\n\t\t}\n\n\t\treturn $akismet_user;\n\t}\n\t\n\tpublic static function get_stats( $api_key ) {\n\t\t$stat_totals = array();\n\n\t\tforeach( array( '6-months', 'all' ) as $interval ) {\n\t\t\t$response = Akismet::http_post( Akismet::build_query( array( 'blog' => get_bloginfo( 'url' ), 'key' => $api_key, 'from' => $interval ) ), 'get-stats' );\n\n\t\t\tif ( ! empty( $response[1] ) ) {\n\t\t\t\t$stat_totals[$interval] = json_decode( $response[1] );\n\t\t\t}\n\t\t}\n\n\t\treturn $stat_totals;\n\t}\n\t\n\tpublic static function verify_wpcom_key( $api_key, $user_id, $extra = array() ) {\n\t\t$akismet_account = Akismet::http_post( Akismet::build_query( array_merge( array(\n\t\t\t'user_id'          => $user_id,\n\t\t\t'api_key'          => $api_key,\n\t\t\t'get_account_type' => 'true'\n\t\t), $extra ) ), 'verify-wpcom-key' );\n\n\t\tif ( ! empty( $akismet_account[1] ) )\n\t\t\t$akismet_account = json_decode( $akismet_account[1] );\n\n\t\tAkismet::log( compact( 'akismet_account' ) );\n\t\t\n\t\treturn $akismet_account;\n\t}\n\t\n\tpublic static function connect_jetpack_user() {\n\t\n\t\tif ( $jetpack_user = self::get_jetpack_user() ) {\n\t\t\tif ( isset( $jetpack_user['user_id'] ) && isset(  $jetpack_user['api_key'] ) ) {\n\t\t\t\t$akismet_user = self::verify_wpcom_key( $jetpack_user['api_key'], $jetpack_user['user_id'], array( 'action' => 'connect_jetpack_user' ) );\n\t\t\t\t\t\t\t\n\t\t\t\tif ( is_object( $akismet_user ) ) {\n\t\t\t\t\tself::save_key( $akismet_user->api_key );\n\t\t\t\t\treturn in_array( $akismet_user->status, array( 'active', 'active-dunning', 'no-sub' ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\n\tpublic static function display_alert() {\n\t\tAkismet::view( 'notice', array(\n\t\t\t'type' => 'alert',\n\t\t\t'code' => (int) get_option( 'akismet_alert_code' ),\n\t\t\t'msg'  => get_option( 'akismet_alert_msg' )\n\t\t) );\n\t}\n\n\tpublic static function display_spam_check_warning() {\n\t\tAkismet::fix_scheduled_recheck();\n\n\t\tif ( wp_next_scheduled('akismet_schedule_cron_recheck') > time() && self::get_number_spam_waiting() > 0 ) {\n\t\t\t$link_text = apply_filters( 'akismet_spam_check_warning_link_text', sprintf( __( 'Please check your <a href=\"%s\">Akismet configuration</a> and contact your web host if problems persist.', 'akismet'), esc_url( self::get_page_url() ) ) );\n\t\t\tAkismet::view( 'notice', array( 'type' => 'spam-check', 'link_text' => $link_text ) );\n\t\t}\n\t}\n\n\tpublic static function display_invalid_version() {\n\t\tAkismet::view( 'notice', array( 'type' => 'version' ) );\n\t}\n\n\tpublic static function display_api_key_warning() {\n\t\tAkismet::view( 'notice', array( 'type' => 'plugin' ) );\n\t}\n\n\tpublic static function display_page() {\n\t\tif ( !Akismet::get_api_key() || ( isset( $_GET['view'] ) && $_GET['view'] == 'start' ) )\n\t\t\tself::display_start_page();\n\t\telseif ( isset( $_GET['view'] ) && $_GET['view'] == 'stats' )\n\t\t\tself::display_stats_page();\n\t\telse\n\t\t\tself::display_configuration_page();\n\t}\n\n\tpublic static function display_start_page() {\n\t\tif ( isset( $_GET['action'] ) ) {\n\t\t\tif ( $_GET['action'] == 'delete-key' ) {\n\t\t\t\tif ( isset( $_GET['_wpnonce'] ) && wp_verify_nonce( $_GET['_wpnonce'], self::NONCE ) )\n\t\t\t\t\tdelete_option( 'wordpress_api_key' );\n\t\t\t}\n\t\t}\n\n\t\tif ( $api_key = Akismet::get_api_key() && ( empty( self::$notices['status'] ) || 'existing-key-invalid' != self::$notices['status'] ) ) {\n\t\t\tself::display_configuration_page();\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t//the user can choose to auto connect their API key by clicking a button on the akismet done page\n\t\t//if jetpack, get verified api key by using connected wpcom user id\n\t\t//if no jetpack, get verified api key by using an akismet token\t\n\t\t\n\t\t$akismet_user = false;\n\t\t\n\t\tif ( isset( $_GET['token'] ) && preg_match('/^(\\d+)-[0-9a-f]{20}$/', $_GET['token'] ) )\n\t\t\t$akismet_user = self::verify_wpcom_key( '', '', array( 'token' => $_GET['token'] ) );\n\t\telseif ( $jetpack_user = self::get_jetpack_user() )\n\t\t\t$akismet_user = self::verify_wpcom_key( $jetpack_user['api_key'], $jetpack_user['user_id'] );\n\t\t\t\n\t\tif ( isset( $_GET['action'] ) ) {\n\t\t\tif ( $_GET['action'] == 'save-key' ) {\n\t\t\t\tif ( is_object( $akismet_user ) ) {\n\t\t\t\t\tself::save_key( $akismet_user->api_key );\n\t\t\t\t\tself::display_notice();\n\t\t\t\t\tself::display_configuration_page();\n\t\t\t\t\treturn;\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\techo '<h2 class=\"ak-header\">'.esc_html__('Akismet', 'akismet').'</h2>';\n\n\t\tself::display_status();\n\n\t\tAkismet::view( 'start', compact( 'akismet_user' ) );\n\t}\n\n\tpublic static function display_stats_page() {\n\t\tAkismet::view( 'stats' );\n\t}\n\n\tpublic static function display_configuration_page() {\n\t\t$api_key      = Akismet::get_api_key();\n\t\t$akismet_user = self::get_akismet_user( $api_key );\n\t\t\n\t\tif ( ! $akismet_user ) {\n\t\t\t// This could happen if the user's key became invalid after it was previously valid and successfully set up.\n\t\t\tself::$notices['status'] = 'existing-key-invalid';\n\t\t\tself::display_start_page();\n\t\t\treturn;\n\t\t}\n\n\t\t$stat_totals  = self::get_stats( $api_key );\n\n\t\t// If unset, create the new strictness option using the old discard option to determine its default\n       \tif ( get_option( 'akismet_strictness' ) === false )\n        \tadd_option( 'akismet_strictness', (get_option('akismet_discard_month') === 'true' ? '1' : '0') );\n\n\t\tif ( empty( self::$notices ) ) {\n\t\t\t//show status\n\t\t\tif ( ! empty( $stat_totals['all'] ) && isset( $stat_totals['all']->time_saved ) && $akismet_user->status == 'active' && $akismet_user->account_type == 'free-api-key' ) {\n\n\t\t\t\t$time_saved = false;\n\n\t\t\t\tif ( $stat_totals['all']->time_saved > 1800 ) {\n\t\t\t\t\t$total_in_minutes = round( $stat_totals['all']->time_saved / 60 );\n\t\t\t\t\t$total_in_hours   = round( $total_in_minutes / 60 );\n\t\t\t\t\t$total_in_days    = round( $total_in_hours / 8 );\n\t\t\t\t\t$cleaning_up      = __( 'Cleaning up spam takes time.' , 'akismet');\n\n\t\t\t\t\tif ( $total_in_days > 1 )\n\t\t\t\t\t\t$time_saved = $cleaning_up . ' ' . sprintf( _n( 'Akismet has saved you %s day!', 'Akismet has saved you %s days!', $total_in_days, 'akismet' ), number_format_i18n( $total_in_days ) );\n\t\t\t\t\telseif ( $total_in_hours > 1 )\n\t\t\t\t\t\t$time_saved = $cleaning_up . ' ' . sprintf( _n( 'Akismet has saved you %d hour!', 'Akismet has saved you %d hours!', $total_in_hours, 'akismet' ), $total_in_hours );\n\t\t\t\t\telseif ( $total_in_minutes >= 30 )\n\t\t\t\t\t\t$time_saved = $cleaning_up . ' ' . sprintf( _n( 'Akismet has saved you %d minute!', 'Akismet has saved you %d minutes!', $total_in_minutes, 'akismet' ), $total_in_minutes );\n\t\t\t\t}\n\n\t\t\t\tAkismet::view( 'notice', array( 'type' => 'active-notice', 'time_saved' => $time_saved ) );\n\t\t\t}\n\t\t\t\n\t\t\tif ( !empty( $akismet_user->limit_reached ) && in_array( $akismet_user->limit_reached, array( 'yellow', 'red' ) ) ) {\n\t\t\t\tAkismet::view( 'notice', array( 'type' => 'limit-reached', 'level' => $akismet_user->limit_reached ) );\n\t\t\t}\n\t\t}\n\t\t\n\t\tif ( !isset( self::$notices['status'] ) && in_array( $akismet_user->status, array( 'cancelled', 'suspended', 'missing', 'no-sub' ) ) )\t\n\t\t\tAkismet::view( 'notice', array( 'type' => $akismet_user->status ) );\n\n\t\tAkismet::log( compact( 'stat_totals', 'akismet_user' ) );\n\t\tAkismet::view( 'config', compact( 'api_key', 'akismet_user', 'stat_totals' ) );\n\t}\n\n\tpublic static function display_notice() {\n\t\tglobal $hook_suffix;\n\n\t\tif ( in_array( $hook_suffix, array( 'jetpack_page_akismet-key-config', 'settings_page_akismet-key-config', 'edit-comments.php' ) ) && (int) get_option( 'akismet_alert_code' ) > 0 ) {\n\t\t\tAkismet::verify_key( Akismet::get_api_key() ); //verify that the key is still in alert state\n\t\t\t\n\t\t\tif ( get_option( 'akismet_alert_code' ) > 0 )\n\t\t\t\tself::display_alert();\n\t\t}\n\t\telseif ( $hook_suffix == 'plugins.php' && !Akismet::get_api_key() ) {\n\t\t\tself::display_api_key_warning();\n\t\t}\n\t\telseif ( $hook_suffix == 'edit-comments.php' && wp_next_scheduled( 'akismet_schedule_cron_recheck' ) ) {\n\t\t\tself::display_spam_check_warning();\n\t\t}\n\t\telseif ( in_array( $hook_suffix, array( 'jetpack_page_akismet-key-config', 'settings_page_akismet-key-config' ) ) && Akismet::get_api_key() ) {\n\t\t\tself::display_status();\n\t\t}\n\t}\n\n\tpublic static function display_status() {\n\t\t$type = '';\n\n\t\tif ( !self::get_server_connectivity() )\n\t\t\t$type = 'servers-be-down';\n\n\t\tif ( !empty( $type ) )\n\t\t\tAkismet::view( 'notice', compact( 'type' ) );\n\t\telseif ( !empty( self::$notices ) ) {\n\t\t\tforeach ( self::$notices as $type ) {\n\t\t\t\tif ( is_object( $type ) ) {\n\t\t\t\t\t$notice_header = $notice_text = '';\n\t\t\t\t\t\n\t\t\t\t\tif ( property_exists( $type, 'notice_header' ) )\n\t\t\t\t\t\t$notice_header = wp_kses( $type->notice_header, self::$allowed );\n\t\t\t\t\n\t\t\t\t\tif ( property_exists( $type, 'notice_text' ) )\n\t\t\t\t\t\t$notice_text = wp_kses( $type->notice_text, self::$allowed );\n\t\t\t\t\t\n\t\t\t\t\tif ( property_exists( $type, 'status' ) ) {\n\t\t\t\t\t\t$type = wp_kses( $type->status, self::$allowed );\n\t\t\t\t\t\tAkismet::view( 'notice', compact( 'type', 'notice_header', 'notice_text' ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tAkismet::view( 'notice', compact( 'type' ) );\n\t\t\t}\t\t\t\t\n\t\t}\n\t}\n\n\tprivate static function get_jetpack_user() {\n\t\tif ( !class_exists('Jetpack') )\n\t\t\treturn false;\n\n\t\tJetpack::load_xml_rpc_client();\n\t\t$xml = new Jetpack_IXR_ClientMulticall( array( 'user_id' => get_current_user_id() ) );\n\n\t\t$xml->addCall( 'wpcom.getUserID' );\n\t\t$xml->addCall( 'akismet.getAPIKey' );\n\t\t$xml->query();\n\n\t\tAkismet::log( compact( 'xml' ) );\n\n\t\tif ( !$xml->isError() ) {\n\t\t\t$responses = $xml->getResponse();\n\t\t\tif ( count( $responses ) > 1 ) {\n\t\t\t\t$api_key = array_shift( $responses[0] );\n\t\t\t\t$user_id = (int) array_shift( $responses[1] );\n\t\t\t\treturn compact( 'api_key', 'user_id' );\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t/**\n\t * Some commentmeta isn't useful in an export file. Suppress it (when supported).\n\t *\n\t * @param bool $exclude\n\t * @param string $key The meta key\n\t * @param object $meta The meta object\n\t * @return bool Whether to exclude this meta entry from the export.\n\t */\n\tpublic static function exclude_commentmeta_from_export( $exclude, $key, $meta ) {\n\t\tif ( in_array( $key, array( 'akismet_as_submitted', 'akismet_rechecking', 'akismet_delayed_moderation_email' ) ) ) {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn $exclude;\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/class.akismet-widget.php",
    "content": "<?php\n/**\n * @package Akismet\n */\nclass Akismet_Widget extends WP_Widget {\n\n\tfunction __construct() {\n\t\tload_plugin_textdomain( 'akismet' );\n\t\t\n\t\tparent::__construct(\n\t\t\t'akismet_widget',\n\t\t\t__( 'Akismet Widget' , 'akismet'),\n\t\t\tarray( 'description' => __( 'Display the number of spam comments Akismet has caught' , 'akismet') )\n\t\t);\n\n\t\tif ( is_active_widget( false, false, $this->id_base ) ) {\n\t\t\tadd_action( 'wp_head', array( $this, 'css' ) );\n\t\t}\n\t}\n\n\tfunction css() {\n?>\n\n<style type=\"text/css\">\n.a-stats {\n\twidth: auto;\n}\n.a-stats a {\n\tbackground: #7CA821;\n\tbackground-image:-moz-linear-gradient(0% 100% 90deg,#5F8E14,#7CA821);\n\tbackground-image:-webkit-gradient(linear,0% 0,0% 100%,from(#7CA821),to(#5F8E14));\n\tborder: 1px solid #5F8E14;\n\tborder-radius:3px;\n\tcolor: #CFEA93;\n\tcursor: pointer;\n\tdisplay: block;\n\tfont-weight: normal;\n\theight: 100%;\n\t-moz-border-radius:3px;\n\tpadding: 7px 0 8px;\n\ttext-align: center;\n\ttext-decoration: none;\n\t-webkit-border-radius:3px;\n\twidth: 100%;\n}\n.a-stats a:hover {\n\ttext-decoration: none;\n\tbackground-image:-moz-linear-gradient(0% 100% 90deg,#6F9C1B,#659417);\n\tbackground-image:-webkit-gradient(linear,0% 0,0% 100%,from(#659417),to(#6F9C1B));\n}\n.a-stats .count {\n\tcolor: #FFF;\n\tdisplay: block;\n\tfont-size: 15px;\n\tline-height: 16px;\n\tpadding: 0 13px;\n\twhite-space: nowrap;\n}\n</style>\n\n<?php\n\t}\n\n\tfunction form( $instance ) {\n\t\tif ( $instance ) {\n\t\t\t$title = $instance['title'];\n\t\t}\n\t\telse {\n\t\t\t$title = __( 'Spam Blocked' , 'akismet');\n\t\t}\n?>\n\n\t\t<p>\n\t\t<label for=\"<?php echo $this->get_field_id( 'title' ); ?>\"><?php esc_html_e( 'Title:' , 'akismet'); ?></label>\n\t\t<input class=\"widefat\" id=\"<?php echo $this->get_field_id( 'title' ); ?>\" name=\"<?php echo $this->get_field_name( 'title' ); ?>\" type=\"text\" value=\"<?php echo esc_attr( $title ); ?>\" />\n\t\t</p>\n\n<?php\n\t}\n\n\tfunction update( $new_instance, $old_instance ) {\n\t\t$instance['title'] = strip_tags( $new_instance['title'] );\n\t\treturn $instance;\n\t}\n\n\tfunction widget( $args, $instance ) {\n\t\t$count = get_option( 'akismet_spam_count' );\n\n\t\techo $args['before_widget'];\n\t\tif ( ! empty( $instance['title'] ) ) {\n\t\t\techo $args['before_title'];\n\t\t\techo esc_html( $instance['title'] );\n\t\t\techo $args['after_title'];\n\t\t}\n?>\n\n\t<div class=\"a-stats\">\n\t\t<a href=\"http://akismet.com\" target=\"_blank\" title=\"\"><?php printf( _n( '<strong class=\"count\">%1$s spam</strong> blocked by <strong>Akismet</strong>', '<strong class=\"count\">%1$s spam</strong> blocked by <strong>Akismet</strong>', $count , 'akismet'), number_format_i18n( $count ) ); ?></a>\n\t</div>\n\n<?php\n\t\techo $args['after_widget'];\n\t}\n}\n\nfunction akismet_register_widgets() {\n\tregister_widget( 'Akismet_Widget' );\n}\n\nadd_action( 'widgets_init', 'akismet_register_widgets' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/class.akismet.php",
    "content": "<?php\n\nclass Akismet {\n\tconst API_HOST = 'rest.akismet.com';\n\tconst API_PORT = 80;\n\tconst MAX_DELAY_BEFORE_MODERATION_EMAIL = 86400; // One day in seconds\n\n\tprivate static $last_comment = '';\n\tprivate static $initiated = false;\n\tprivate static $prevent_moderation_email_for_these_comments = array();\n\tprivate static $last_comment_result = null;\n\tprivate static $comment_as_submitted_allowed_keys = array( 'blog' => '', 'blog_charset' => '', 'blog_lang' => '', 'blog_ua' => '', 'comment_agent' => '', 'comment_author' => '', 'comment_author_IP' => '', 'comment_author_email' => '', 'comment_author_url' => '', 'comment_content' => '', 'comment_date_gmt' => '', 'comment_tags' => '', 'comment_type' => '', 'guid' => '', 'is_test' => '', 'permalink' => '', 'reporter' => '', 'site_domain' => '', 'submit_referer' => '', 'submit_uri' => '', 'user_ID' => '', 'user_agent' => '', 'user_id' => '', 'user_ip' => '' );\n\n\tpublic static function init() {\n\t\tif ( ! self::$initiated ) {\n\t\t\tself::init_hooks();\n\t\t}\n\t}\n\n\t/**\n\t * Initializes WordPress hooks\n\t */\n\tprivate static function init_hooks() {\n\t\tself::$initiated = true;\n\n\t\tadd_action( 'wp_insert_comment', array( 'Akismet', 'auto_check_update_meta' ), 10, 2 );\n\t\tadd_filter( 'preprocess_comment', array( 'Akismet', 'auto_check_comment' ), 1 );\n\t\tadd_action( 'akismet_scheduled_delete', array( 'Akismet', 'delete_old_comments' ) );\n\t\tadd_action( 'akismet_scheduled_delete', array( 'Akismet', 'delete_old_comments_meta' ) );\n\t\tadd_action( 'akismet_schedule_cron_recheck', array( 'Akismet', 'cron_recheck' ) );\n\n\t\t/**\n\t\t * To disable the Akismet comment nonce, add a filter for the 'akismet_comment_nonce' tag\n\t\t * and return any string value that is not 'true' or '' (empty string).\n\t\t *\n\t\t * Don't return boolean false, because that implies that the 'akismet_comment_nonce' option\n\t\t * has not been set and that Akismet should just choose the default behavior for that\n\t\t * situation.\n\t\t */\n\t\t$akismet_comment_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) );\n\n\t\tif ( $akismet_comment_nonce_option == 'true' || $akismet_comment_nonce_option == '' )\n\t\t\tadd_action( 'comment_form',  array( 'Akismet',  'add_comment_nonce' ), 1 );\n\n\t\tadd_action( 'admin_head-edit-comments.php', array( 'Akismet', 'load_form_js' ) );\n\t\tadd_action( 'comment_form', array( 'Akismet', 'load_form_js' ) );\n\t\tadd_action( 'comment_form', array( 'Akismet', 'inject_ak_js' ) );\n\n\t\tadd_filter( 'comment_moderation_recipients', array( 'Akismet', 'disable_moderation_emails_if_unreachable' ), 1000, 2 );\n\t\tadd_filter( 'pre_comment_approved', array( 'Akismet', 'last_comment_status' ), 10, 2 );\n\t\t\n\t\tadd_action( 'transition_comment_status', array( 'Akismet', 'transition_comment_status' ), 10, 3 );\n\n\t\t// Run this early in the pingback call, before doing a remote fetch of the source uri\n\t\tadd_action( 'xmlrpc_call', array( 'Akismet', 'pre_check_pingback' ) );\n\t}\n\n\tpublic static function get_api_key() {\n\t\treturn apply_filters( 'akismet_get_api_key', defined('WPCOM_API_KEY') ? constant('WPCOM_API_KEY') : get_option('wordpress_api_key') );\n\t}\n\n\tpublic static function check_key_status( $key, $ip = null ) {\n\t\treturn self::http_post( Akismet::build_query( array( 'key' => $key, 'blog' => get_option('home') ) ), 'verify-key', $ip );\n\t}\n\n\tpublic static function verify_key( $key, $ip = null ) {\n\t\t$response = self::check_key_status( $key, $ip );\n\n\t\tif ( $response[1] != 'valid' && $response[1] != 'invalid' )\n\t\t\treturn 'failed';\n\n\t\treturn $response[1];\n\t}\n\n\tpublic static function deactivate_key( $key ) {\n\t\t$response = self::http_post( Akismet::build_query( array( 'key' => $key, 'blog' => get_option('home') ) ), 'deactivate' );\n\n\t\tif ( $response[1] != 'deactivated' )\n\t\t\treturn 'failed';\n\n\t\treturn $response[1];\n\t}\n\n\tpublic static function auto_check_comment( $commentdata ) {\n\t\tself::$last_comment_result = null;\n\n\t\t$comment = $commentdata;\n\n\t\t$comment['user_ip']      = self::get_ip_address();\n\t\t$comment['user_agent']   = self::get_user_agent();\n\t\t$comment['referrer']     = self::get_referer();\n\t\t$comment['blog']         = get_option('home');\n\t\t$comment['blog_lang']    = get_locale();\n\t\t$comment['blog_charset'] = get_option('blog_charset');\n\t\t$comment['permalink']    = get_permalink( $comment['comment_post_ID'] );\n\n\t\tif ( !empty( $comment['user_ID'] ) )\n\t\t\t$comment['user_role'] = Akismet::get_user_roles( $comment['user_ID'] );\n\n\t\t/** See filter documentation in init_hooks(). */\n\t\t$akismet_nonce_option = apply_filters( 'akismet_comment_nonce', get_option( 'akismet_comment_nonce' ) );\n\t\t$comment['akismet_comment_nonce'] = 'inactive';\n\t\tif ( $akismet_nonce_option == 'true' || $akismet_nonce_option == '' ) {\n\t\t\t$comment['akismet_comment_nonce'] = 'failed';\n\t\t\tif ( isset( $_POST['akismet_comment_nonce'] ) && wp_verify_nonce( $_POST['akismet_comment_nonce'], 'akismet_comment_nonce_' . $comment['comment_post_ID'] ) )\n\t\t\t\t$comment['akismet_comment_nonce'] = 'passed';\n\n\t\t\t// comment reply in wp-admin\n\t\t\tif ( isset( $_POST['_ajax_nonce-replyto-comment'] ) && check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ) )\n\t\t\t\t$comment['akismet_comment_nonce'] = 'passed';\n\n\t\t}\n\n\t\tif ( self::is_test_mode() )\n\t\t\t$comment['is_test'] = 'true';\n\n\t\tforeach( $_POST as $key => $value ) {\n\t\t\tif ( is_string( $value ) )\n\t\t\t\t$comment[\"POST_{$key}\"] = $value;\n\t\t}\n\n\t\t$ignore = array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' );\n\n\t\tforeach ( $_SERVER as $key => $value ) {\n\t\t\tif ( !in_array( $key, $ignore ) && is_string($value) )\n\t\t\t\t$comment[\"$key\"] = $value;\n\t\t\telse\n\t\t\t\t$comment[\"$key\"] = '';\n\t\t}\n\n\t\t$post = get_post( $comment['comment_post_ID'] );\n\t\t$comment[ 'comment_post_modified_gmt' ] = $post->post_modified_gmt;\n\n\t\t$response = self::http_post( Akismet::build_query( $comment ), 'comment-check' );\n\n\t\tdo_action( 'akismet_comment_check_response', $response );\n\n\t\t$commentdata['comment_as_submitted'] = array_intersect_key( $comment, self::$comment_as_submitted_allowed_keys );\n\t\t$commentdata['akismet_result']       = $response[1];\n\n\t\tif ( isset( $response[0]['x-akismet-pro-tip'] ) )\n\t        $commentdata['akismet_pro_tip'] = $response[0]['x-akismet-pro-tip'];\n\n\t\tif ( isset( $response[0]['x-akismet-error'] ) ) {\n\t\t\t// An error occurred that we anticipated (like a suspended key) and want the user to act on.\n\t\t\t// Send to moderation.\n\t\t\tself::$last_comment_result = '0';\n\t\t}\n\t\telse if ( 'true' == $response[1] ) {\n\t\t\t// akismet_spam_count will be incremented later by comment_is_spam()\n\t\t\tself::$last_comment_result = 'spam';\n\n\t\t\t$discard = ( isset( $commentdata['akismet_pro_tip'] ) && $commentdata['akismet_pro_tip'] === 'discard' && self::allow_discard() );\n\n\t\t\tdo_action( 'akismet_spam_caught', $discard );\n\n\t\t\tif ( $discard ) {\n\t\t\t\t// akismet_result_spam() won't be called so bump the counter here\n\t\t\t\tif ( $incr = apply_filters('akismet_spam_count_incr', 1) )\n\t\t\t\t\tupdate_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr );\n\t\t\t\t$redirect_to = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : get_permalink( $post );\n\t\t\t\twp_safe_redirect( esc_url_raw( $redirect_to ) );\n\t\t\t\tdie();\n\t\t\t}\n\t\t}\n\t\t\n\t\t// if the response is neither true nor false, hold the comment for moderation and schedule a recheck\n\t\tif ( 'true' != $response[1] && 'false' != $response[1] ) {\n\t\t\tif ( !current_user_can('moderate_comments') ) {\n\t\t\t\t// Comment status should be moderated\n\t\t\t\tself::$last_comment_result = '0';\n\t\t\t}\n\t\t\tif ( function_exists('wp_next_scheduled') && function_exists('wp_schedule_single_event') ) {\n\t\t\t\tif ( !wp_next_scheduled( 'akismet_schedule_cron_recheck' ) ) {\n\t\t\t\t\twp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' );\n\t\t\t\t\tdo_action( 'akismet_scheduled_recheck', 'invalid-response-' . $response[1] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tself::$prevent_moderation_email_for_these_comments[] = $commentdata;\n\t\t}\n\n\t\tif ( function_exists('wp_next_scheduled') && function_exists('wp_schedule_event') ) {\n\t\t\t// WP 2.1+: delete old comments daily\n\t\t\tif ( !wp_next_scheduled( 'akismet_scheduled_delete' ) )\n\t\t\t\twp_schedule_event( time(), 'daily', 'akismet_scheduled_delete' );\n\t\t}\n\t\telseif ( (mt_rand(1, 10) == 3) ) {\n\t\t\t// WP 2.0: run this one time in ten\n\t\t\tself::delete_old_comments();\n\t\t}\n\t\t\n\t\tself::set_last_comment( $commentdata );\n\t\tself::fix_scheduled_recheck();\n\n\t\treturn $commentdata;\n\t}\n\t\n\tpublic static function get_last_comment() {\n\t\treturn self::$last_comment;\n\t}\n\t\n\tpublic static function set_last_comment( $comment ) {\n\t\tif ( is_null( $comment ) ) {\n\t\t\tself::$last_comment = null;\n\t\t}\n\t\telse {\n\t\t\t// We filter it here so that it matches the filtered comment data that we'll have to compare against later.\n\t\t\t// wp_filter_comment expects comment_author_IP\n\t\t\tself::$last_comment = wp_filter_comment(\n\t\t\t\tarray_merge(\n\t\t\t\t\tarray( 'comment_author_IP' => self::get_ip_address() ),\n\t\t\t\t\t$comment\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\t// this fires on wp_insert_comment.  we can't update comment_meta when auto_check_comment() runs\n\t// because we don't know the comment ID at that point.\n\tpublic static function auto_check_update_meta( $id, $comment ) {\n\n\t\t// failsafe for old WP versions\n\t\tif ( !function_exists('add_comment_meta') )\n\t\t\treturn false;\n\n\t\tif ( !isset( self::$last_comment['comment_author_email'] ) )\n\t\t\tself::$last_comment['comment_author_email'] = '';\n\n\t\t// wp_insert_comment() might be called in other contexts, so make sure this is the same comment\n\t\t// as was checked by auto_check_comment\n\t\tif ( is_object( $comment ) && !empty( self::$last_comment ) && is_array( self::$last_comment ) ) {\n\t\t\tif ( self::matches_last_comment( $comment ) ) {\n\t\t\t\t\t\n\t\t\t\t\tload_plugin_textdomain( 'akismet' );\n\t\t\t\t\t\n\t\t\t\t\t// normal result: true or false\n\t\t\t\t\tif ( self::$last_comment['akismet_result'] == 'true' ) {\n\t\t\t\t\t\tupdate_comment_meta( $comment->comment_ID, 'akismet_result', 'true' );\n\t\t\t\t\t\tself::update_comment_history( $comment->comment_ID, '', 'check-spam' );\n\t\t\t\t\t\tif ( $comment->comment_approved != 'spam' )\n\t\t\t\t\t\t\tself::update_comment_history(\n\t\t\t\t\t\t\t\t$comment->comment_ID,\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t'status-changed-'.$comment->comment_approved\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\telseif ( self::$last_comment['akismet_result'] == 'false' ) {\n\t\t\t\t\t\tupdate_comment_meta( $comment->comment_ID, 'akismet_result', 'false' );\n\t\t\t\t\t\tself::update_comment_history( $comment->comment_ID, '', 'check-ham' );\n\t\t\t\t\t\tif ( $comment->comment_approved == 'spam' ) {\n\t\t\t\t\t\t\tif ( wp_blacklist_check($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent) )\n\t\t\t\t\t\t\t\tself::update_comment_history( $comment->comment_ID, '', 'wp-blacklisted' );\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tself::update_comment_history( $comment->comment_ID, '', 'status-changed-'.$comment->comment_approved );\n\t\t\t\t\t\t}\n\t\t\t\t\t} // abnormal result: error\n\t\t\t\t\telse {\n\t\t\t\t\t\tupdate_comment_meta( $comment->comment_ID, 'akismet_error', time() );\n\t\t\t\t\t\tself::update_comment_history(\n\t\t\t\t\t\t\t$comment->comment_ID,\n\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t'check-error',\n\t\t\t\t\t\t\tarray( 'response' => substr( self::$last_comment['akismet_result'], 0, 50 ) )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// record the complete original data as submitted for checking\n\t\t\t\t\tif ( isset( self::$last_comment['comment_as_submitted'] ) )\n\t\t\t\t\t\tupdate_comment_meta( $comment->comment_ID, 'akismet_as_submitted', self::$last_comment['comment_as_submitted'] );\n\n\t\t\t\t\tif ( isset( self::$last_comment['akismet_pro_tip'] ) )\n\t\t\t\t\t\tupdate_comment_meta( $comment->comment_ID, 'akismet_pro_tip', self::$last_comment['akismet_pro_tip'] );\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function delete_old_comments() {\n\t\tglobal $wpdb;\n\n\t\t/**\n\t\t * Determines how many comments will be deleted in each batch.\n\t\t *\n\t\t * @param int The default, as defined by AKISMET_DELETE_LIMIT.\n\t\t */\n\t\t$delete_limit = apply_filters( 'akismet_delete_comment_limit', defined( 'AKISMET_DELETE_LIMIT' ) ? AKISMET_DELETE_LIMIT : 10000 );\n\t\t$delete_limit = max( 1, intval( $delete_limit ) );\n\n\t\t/**\n\t\t * Determines how many days a comment will be left in the Spam queue before being deleted.\n\t\t *\n\t\t * @param int The default number of days.\n\t\t */\n\t\t$delete_interval = apply_filters( 'akismet_delete_comment_interval', 15 );\n\t\t$delete_interval = max( 1, intval( $delete_interval ) );\n\n\t\twhile ( $comment_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT comment_id FROM {$wpdb->comments} WHERE DATE_SUB(NOW(), INTERVAL %d DAY) > comment_date_gmt AND comment_approved = 'spam' LIMIT %d\", $delete_interval, $delete_limit ) ) ) {\n\t\t\tif ( empty( $comment_ids ) )\n\t\t\t\treturn;\n\n\t\t\t$wpdb->queries = array();\n\n\t\t\tforeach ( $comment_ids as $comment_id ) {\n\t\t\t\tdo_action( 'delete_comment', $comment_id );\n\t\t\t}\n\n\t\t\t$comma_comment_ids = implode( ', ', array_map('intval', $comment_ids) );\n\n\t\t\t$wpdb->query(\"DELETE FROM {$wpdb->comments} WHERE comment_id IN ( $comma_comment_ids )\");\n\t\t\t$wpdb->query(\"DELETE FROM {$wpdb->commentmeta} WHERE comment_id IN ( $comma_comment_ids )\");\n\n\t\t\tclean_comment_cache( $comment_ids );\n\t\t}\n\n\t\tif ( apply_filters( 'akismet_optimize_table', ( mt_rand(1, 5000) == 11), $wpdb->comments ) ) // lucky number\n\t\t\t$wpdb->query(\"OPTIMIZE TABLE {$wpdb->comments}\");\n\t}\n\n\tpublic static function delete_old_comments_meta() {\n\t\tglobal $wpdb;\n\n\t\t$interval = apply_filters( 'akismet_delete_commentmeta_interval', 15 );\n\n\t\t# enfore a minimum of 1 day\n\t\t$interval = absint( $interval );\n\t\tif ( $interval < 1 )\n\t\t\t$interval = 1;\n\n\t\t// akismet_as_submitted meta values are large, so expire them\n\t\t// after $interval days regardless of the comment status\n\t\twhile ( $comment_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT m.comment_id FROM {$wpdb->commentmeta} as m INNER JOIN {$wpdb->comments} as c USING(comment_id) WHERE m.meta_key = 'akismet_as_submitted' AND DATE_SUB(NOW(), INTERVAL %d DAY) > c.comment_date_gmt LIMIT 10000\", $interval ) ) ) {\n\t\t\tif ( empty( $comment_ids ) )\n\t\t\t\treturn;\n\n\t\t\t$wpdb->queries = array();\n\n\t\t\tforeach ( $comment_ids as $comment_id ) {\n\t\t\t\tdelete_comment_meta( $comment_id, 'akismet_as_submitted' );\n\t\t\t}\n\t\t}\n\n\t\tif ( apply_filters( 'akismet_optimize_table', ( mt_rand(1, 5000) == 11), $wpdb->commentmeta ) ) // lucky number\n\t\t\t$wpdb->query(\"OPTIMIZE TABLE {$wpdb->commentmeta}\");\n\t}\n\n\t// how many approved comments does this author have?\n\tpublic static function get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) {\n\t\tglobal $wpdb;\n\n\t\tif ( !empty( $user_id ) )\n\t\t\treturn (int) $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(*) FROM {$wpdb->comments} WHERE user_id = %d AND comment_approved = 1\", $user_id ) );\n\n\t\tif ( !empty( $comment_author_email ) )\n\t\t\treturn (int) $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(*) FROM {$wpdb->comments} WHERE comment_author_email = %s AND comment_author = %s AND comment_author_url = %s AND comment_approved = 1\", $comment_author_email, $comment_author, $comment_author_url ) );\n\n\t\treturn 0;\n\t}\n\n\t// get the full comment history for a given comment, as an array in reverse chronological order\n\tpublic static function get_comment_history( $comment_id ) {\n\n\t\t// failsafe for old WP versions\n\t\tif ( !function_exists('add_comment_meta') )\n\t\t\treturn false;\n\n\t\t$history = get_comment_meta( $comment_id, 'akismet_history', false );\n\t\tusort( $history, array( 'Akismet', '_cmp_time' ) );\n\t\treturn $history;\n\t}\n\n\t/**\n\t * Log an event for a given comment, storing it in comment_meta.\n\t *\n\t * @param int $comment_id The ID of the relevant comment.\n\t * @param string $message The string description of the event. No longer used.\n\t * @param string $event The event code.\n\t * @param array $meta Metadata about the history entry. e.g., the user that reported or changed the status of a given comment.\n\t */\n\tpublic static function update_comment_history( $comment_id, $message, $event=null, $meta=null ) {\n\t\tglobal $current_user;\n\n\t\t// failsafe for old WP versions\n\t\tif ( !function_exists('add_comment_meta') )\n\t\t\treturn false;\n\n\t\t$user = '';\n\n\t\t$event = array(\n\t\t\t'time'    => self::_get_microtime(),\n\t\t\t'event'   => $event,\n\t\t);\n\t\t\n\t\tif ( is_object( $current_user ) && isset( $current_user->user_login ) ) {\n\t\t\t$event['user'] = $current_user->user_login;\n\t\t}\n\t\t\n\t\tif ( ! empty( $meta ) ) {\n\t\t\t$event['meta'] = $meta;\n\t\t}\n\n\t\t// $unique = false so as to allow multiple values per comment\n\t\t$r = add_comment_meta( $comment_id, 'akismet_history', $event, false );\n\t}\n\n\tpublic static function check_db_comment( $id, $recheck_reason = 'recheck_queue' ) {\n\t\tglobal $wpdb;\n\n\t\t$c = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM {$wpdb->comments} WHERE comment_ID = %d\", $id ), ARRAY_A );\n\t\tif ( !$c )\n\t\t\treturn;\n\n\t\t$c['user_ip']        = $c['comment_author_IP'];\n\t\t$c['user_agent']     = $c['comment_agent'];\n\t\t$c['referrer']       = '';\n\t\t$c['blog']           = get_option('home');\n\t\t$c['blog_lang']      = get_locale();\n\t\t$c['blog_charset']   = get_option('blog_charset');\n\t\t$c['permalink']      = get_permalink($c['comment_post_ID']);\n\t\t$c['recheck_reason'] = $recheck_reason;\n\n\t\tif ( self::is_test_mode() )\n\t\t\t$c['is_test'] = 'true';\n\n\t\t$response = self::http_post( Akismet::build_query( $c ), 'comment-check' );\n\n\t\treturn ( is_array( $response ) && ! empty( $response[1] ) ) ? $response[1] : false;\n\t}\n\t\n\t\n\n\tpublic static function transition_comment_status( $new_status, $old_status, $comment ) {\n\t\t\n\t\tif ( $new_status == $old_status )\n\t\t\treturn;\n\n\t\t# we don't need to record a history item for deleted comments\n\t\tif ( $new_status == 'delete' )\n\t\t\treturn;\n\t\t\n\t\tif ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) )\n\t\t\treturn;\n\n\t\tif ( defined('WP_IMPORTING') && WP_IMPORTING == true )\n\t\t\treturn;\n\t\t\t\n\t\t// if this is present, it means the status has been changed by a re-check, not an explicit user action\n\t\tif ( get_comment_meta( $comment->comment_ID, 'akismet_rechecking' ) )\n\t\t\treturn;\n\t\t\n\t\tglobal $current_user;\n\t\t$reporter = '';\n\t\tif ( is_object( $current_user ) )\n\t\t\t$reporter = $current_user->user_login;\n\n\t\t// Assumption alert:\n\t\t// We want to submit comments to Akismet only when a moderator explicitly spams or approves it - not if the status\n\t\t// is changed automatically by another plugin.  Unfortunately WordPress doesn't provide an unambiguous way to\n\t\t// determine why the transition_comment_status action was triggered.  And there are several different ways by which\n\t\t// to spam and unspam comments: bulk actions, ajax, links in moderation emails, the dashboard, and perhaps others.\n\t\t// We'll assume that this is an explicit user action if certain POST/GET variables exist.\n\t\tif ( ( isset( $_POST['status'] ) && in_array( $_POST['status'], array( 'spam', 'unspam' ) ) ) ||\n\t\t\t ( isset( $_POST['spam'] )   && (int) $_POST['spam'] == 1 ) ||\n\t\t\t ( isset( $_POST['unspam'] ) && (int) $_POST['unspam'] == 1 ) ||\n\t\t\t ( isset( $_POST['comment_status'] )  && in_array( $_POST['comment_status'], array( 'spam', 'unspam' ) ) ) ||\n\t\t\t ( isset( $_GET['action'] )  && in_array( $_GET['action'], array( 'spam', 'unspam' ) ) ) ||\n\t\t\t ( isset( $_POST['action'] ) && in_array( $_POST['action'], array( 'editedcomment' ) ) )\n\t\t ) {\n\t\t\tif ( $new_status == 'spam' && ( $old_status == 'approved' || $old_status == 'unapproved' || !$old_status ) ) {\n\t\t\t\treturn self::submit_spam_comment( $comment->comment_ID );\n\t\t\t} elseif ( $old_status == 'spam' && ( $new_status == 'approved' || $new_status == 'unapproved' ) ) {\n\t\t\t\treturn self::submit_nonspam_comment( $comment->comment_ID );\n\t\t\t}\n\t\t}\n\n\t\tself::update_comment_history( $comment->comment_ID, '', 'status-' . $new_status );\n\t}\n\t\n\tpublic static function submit_spam_comment( $comment_id ) {\n\t\tglobal $wpdb, $current_user, $current_site;\n\n\t\t$comment_id = (int) $comment_id;\n\n\t\t$comment = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM {$wpdb->comments} WHERE comment_ID = %d\", $comment_id ) );\n\n\t\tif ( !$comment ) // it was deleted\n\t\t\treturn;\n\n\t\tif ( 'spam' != $comment->comment_approved )\n\t\t\treturn;\n\n\t\t// use the original version stored in comment_meta if available\n\t\t$as_submitted = self::sanitize_comment_as_submitted( get_comment_meta( $comment_id, 'akismet_as_submitted', true ) );\n\n\t\tif ( $as_submitted && is_array( $as_submitted ) && isset( $as_submitted['comment_content'] ) )\n\t\t\t$comment = (object) array_merge( (array)$comment, $as_submitted );\n\n\t\t$comment->blog         = get_bloginfo('url');\n\t\t$comment->blog_lang    = get_locale();\n\t\t$comment->blog_charset = get_option('blog_charset');\n\t\t$comment->permalink    = get_permalink($comment->comment_post_ID);\n\n\t\tif ( is_object($current_user) )\n\t\t\t$comment->reporter = $current_user->user_login;\n\n\t\tif ( is_object($current_site) )\n\t\t\t$comment->site_domain = $current_site->domain;\n\n\t\t$comment->user_role = '';\n\t\tif ( isset( $comment->user_ID ) )\n\t\t\t$comment->user_role = Akismet::get_user_roles( $comment->user_ID );\n\n\t\tif ( self::is_test_mode() )\n\t\t\t$comment->is_test = 'true';\n\n\t\t$post = get_post( $comment->comment_post_ID );\n\t\t$comment->comment_post_modified_gmt = $post->post_modified_gmt;\n\n\t\t$response = Akismet::http_post( Akismet::build_query( $comment ), 'submit-spam' );\n\t\tif ( $comment->reporter ) {\n\t\t\tself::update_comment_history( $comment_id, '', 'report-spam' );\n\t\t\tupdate_comment_meta( $comment_id, 'akismet_user_result', 'true' );\n\t\t\tupdate_comment_meta( $comment_id, 'akismet_user', $comment->reporter );\n\t\t}\n\n\t\tdo_action('akismet_submit_spam_comment', $comment_id, $response[1]);\n\t}\n\n\tpublic static function submit_nonspam_comment( $comment_id ) {\n\t\tglobal $wpdb, $current_user, $current_site;\n\n\t\t$comment_id = (int) $comment_id;\n\n\t\t$comment = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM {$wpdb->comments} WHERE comment_ID = %d\", $comment_id ) );\n\t\tif ( !$comment ) // it was deleted\n\t\t\treturn;\n\n\t\t// use the original version stored in comment_meta if available\n\t\t$as_submitted = self::sanitize_comment_as_submitted( get_comment_meta( $comment_id, 'akismet_as_submitted', true ) );\n\n\t\tif ( $as_submitted && is_array($as_submitted) && isset($as_submitted['comment_content']) )\n\t\t\t$comment = (object) array_merge( (array)$comment, $as_submitted );\n\n\t\t$comment->blog         = get_bloginfo('url');\n\t\t$comment->blog_lang    = get_locale();\n\t\t$comment->blog_charset = get_option('blog_charset');\n\t\t$comment->permalink    = get_permalink( $comment->comment_post_ID );\n\t\t$comment->user_role    = '';\n\n\t\tif ( is_object($current_user) )\n\t\t\t$comment->reporter = $current_user->user_login;\n\n\t\tif ( is_object($current_site) )\n\t\t\t$comment->site_domain = $current_site->domain;\n\n\t\tif ( isset( $comment->user_ID ) )\n\t\t\t$comment->user_role = Akismet::get_user_roles($comment->user_ID);\n\n\t\tif ( Akismet::is_test_mode() )\n\t\t\t$comment->is_test = 'true';\n\n\t\t$post = get_post( $comment->comment_post_ID );\n\t\t$comment->comment_post_modified_gmt = $post->post_modified_gmt;\n\n\t\t$response = self::http_post( Akismet::build_query( $comment ), 'submit-ham' );\n\t\tif ( $comment->reporter ) {\n\t\t\tself::update_comment_history( $comment_id, '', 'report-ham' );\n\t\t\tupdate_comment_meta( $comment_id, 'akismet_user_result', 'false' );\n\t\t\tupdate_comment_meta( $comment_id, 'akismet_user', $comment->reporter );\n\t\t}\n\n\t\tdo_action('akismet_submit_nonspam_comment', $comment_id, $response[1]);\n\t}\n\n\tpublic static function cron_recheck() {\n\t\tglobal $wpdb;\n\n\t\t$api_key = self::get_api_key();\n\n\t\t$status = self::verify_key( $api_key );\n\t\tif ( get_option( 'akismet_alert_code' ) || $status == 'invalid' ) {\n\t\t\t// since there is currently a problem with the key, reschedule a check for 6 hours hence\n\t\t\twp_schedule_single_event( time() + 21600, 'akismet_schedule_cron_recheck' );\n\t\t\tdo_action( 'akismet_scheduled_recheck', 'key-problem-' . get_option( 'akismet_alert_code' ) . '-' . $status );\n\t\t\treturn false;\n\t\t}\n\n\t\tdelete_option('akismet_available_servers');\n\n\t\t$comment_errors = $wpdb->get_col( \"SELECT comment_id FROM {$wpdb->commentmeta} WHERE meta_key = 'akismet_error'\tLIMIT 100\" );\n\t\t\n\t\tload_plugin_textdomain( 'akismet' );\n\n\t\tforeach ( (array) $comment_errors as $comment_id ) {\n\t\t\t// if the comment no longer exists, or is too old, remove the meta entry from the queue to avoid getting stuck\n\t\t\t$comment = get_comment( $comment_id );\n\t\t\tif ( !$comment || strtotime( $comment->comment_date_gmt ) < strtotime( \"-15 days\" ) ) {\n\t\t\t\tdelete_comment_meta( $comment_id, 'akismet_error' );\n\t\t\t\tdelete_comment_meta( $comment_id, 'akismet_delayed_moderation_email' );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tadd_comment_meta( $comment_id, 'akismet_rechecking', true );\n\t\t\t$status = self::check_db_comment( $comment_id, 'retry' );\n\n\t\t\t$event = '';\n\t\t\tif ( $status == 'true' ) {\n\t\t\t\t$event = 'cron-retry-spam';\n\t\t\t} elseif ( $status == 'false' ) {\n\t\t\t\t$event = 'cron-retry-ham';\n\t\t\t}\n\n\t\t\t// If we got back a legit response then update the comment history\n\t\t\t// other wise just bail now and try again later.  No point in\n\t\t\t// re-trying all the comments once we hit one failure.\n\t\t\tif ( !empty( $event ) ) {\n\t\t\t\tdelete_comment_meta( $comment_id, 'akismet_error' );\n\t\t\t\tself::update_comment_history( $comment_id, '', $event );\n\t\t\t\tupdate_comment_meta( $comment_id, 'akismet_result', $status );\n\t\t\t\t// make sure the comment status is still pending.  if it isn't, that means the user has already moved it elsewhere.\n\t\t\t\t$comment = get_comment( $comment_id );\n\t\t\t\tif ( $comment && 'unapproved' == wp_get_comment_status( $comment_id ) ) {\n\t\t\t\t\tif ( $status == 'true' ) {\n\t\t\t\t\t\twp_spam_comment( $comment_id );\n\t\t\t\t\t} elseif ( $status == 'false' ) {\n\t\t\t\t\t\t// comment is good, but it's still in the pending queue.  depending on the moderation settings\n\t\t\t\t\t\t// we may need to change it to approved.\n\t\t\t\t\t\tif ( check_comment($comment->comment_author, $comment->comment_author_email, $comment->comment_author_url, $comment->comment_content, $comment->comment_author_IP, $comment->comment_agent, $comment->comment_type) )\n\t\t\t\t\t\t\twp_set_comment_status( $comment_id, 1 );\n\t\t\t\t\t\telse if ( get_comment_meta( $comment_id, 'akismet_delayed_moderation_email', true ) )\n\t\t\t\t\t\t\twp_notify_moderator( $comment_id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdelete_comment_meta( $comment_id, 'akismet_delayed_moderation_email' );\n\t\t\t} else {\n\t\t\t\t// If this comment has been pending moderation for longer than MAX_DELAY_BEFORE_MODERATION_EMAIL,\n\t\t\t\t// send a moderation email now.\n\t\t\t\tif ( ( intval( gmdate( 'U' ) ) - strtotime( $comment->comment_date_gmt ) ) < self::MAX_DELAY_BEFORE_MODERATION_EMAIL ) {\n\t\t\t\t\tdelete_comment_meta( $comment_id, 'akismet_delayed_moderation_email' );\n\t\t\t\t\twp_notify_moderator( $comment_id );\n\t\t\t\t}\n\n\t\t\t\tdelete_comment_meta( $comment_id, 'akismet_rechecking' );\n\t\t\t\twp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' );\n\t\t\t\tdo_action( 'akismet_scheduled_recheck', 'check-db-comment-' . $status );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdelete_comment_meta( $comment_id, 'akismet_rechecking' );\n\t\t}\n\n\t\t$remaining = $wpdb->get_var( \"SELECT COUNT(*) FROM {$wpdb->commentmeta} WHERE meta_key = 'akismet_error'\" );\n\t\tif ( $remaining && !wp_next_scheduled('akismet_schedule_cron_recheck') ) {\n\t\t\twp_schedule_single_event( time() + 1200, 'akismet_schedule_cron_recheck' );\n\t\t\tdo_action( 'akismet_scheduled_recheck', 'remaining' );\n\t\t}\n\t}\n\n\tpublic static function fix_scheduled_recheck() {\n\t\t$future_check = wp_next_scheduled( 'akismet_schedule_cron_recheck' );\n\t\tif ( !$future_check ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( get_option( 'akismet_alert_code' ) > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$check_range = time() + 1200;\n\t\tif ( $future_check > $check_range ) {\n\t\t\twp_clear_scheduled_hook( 'akismet_schedule_cron_recheck' );\n\t\t\twp_schedule_single_event( time() + 300, 'akismet_schedule_cron_recheck' );\n\t\t\tdo_action( 'akismet_scheduled_recheck', 'fix-scheduled-recheck' );\n\t\t}\n\t}\n\n\tpublic static function add_comment_nonce( $post_id ) {\n\t\techo '<p style=\"display: none;\">';\n\t\twp_nonce_field( 'akismet_comment_nonce_' . $post_id, 'akismet_comment_nonce', FALSE );\n\t\techo '</p>';\n\t}\n\n\tpublic static function is_test_mode() {\n\t\treturn defined('AKISMET_TEST_MODE') && AKISMET_TEST_MODE;\n\t}\n\t\n\tpublic static function allow_discard() {\n\t\tif ( defined( 'DOING_AJAX' ) && DOING_AJAX )\n\t\t\treturn false;\n\t\tif ( is_user_logged_in() )\n\t\t\treturn false;\n\t\n\t\treturn ( get_option( 'akismet_strictness' ) === '1'  );\n\t}\n\n\tpublic static function get_ip_address() {\n\t\treturn isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : null;\n\t}\n\t\n\t/**\n\t * Do these two comments, without checking the comment_ID, \"match\"?\n\t *\n\t * @param mixed $comment1 A comment object or array.\n\t * @param mixed $comment2 A comment object or array.\n\t * @return bool Whether the two comments should be treated as the same comment.\n\t */\n\tprivate static function comments_match( $comment1, $comment2 ) {\n\t\t$comment1 = (array) $comment1;\n\t\t$comment2 = (array) $comment2;\n\t\t\n\t\treturn (\n\t\t\t   isset( $comment1['comment_post_ID'], $comment2['comment_post_ID'] )\n\t\t\t&& intval( $comment1['comment_post_ID'] ) == intval( $comment2['comment_post_ID'] )\n\t\t\t&& (\n\t\t\t\t// The comment author length max is 255 characters, limited by the TINYTEXT column type.\n\t\t\t\tsubstr( $comment1['comment_author'], 0, 255 ) == substr( $comment2['comment_author'], 0, 255 )\n\t\t\t\t|| substr( stripslashes( $comment1['comment_author'] ), 0, 255 ) == substr( $comment2['comment_author'], 0, 255 )\n\t\t\t\t|| substr( $comment1['comment_author'], 0, 255 ) == substr( stripslashes( $comment2['comment_author'] ), 0, 255 )\n\t\t\t\t)\n\t\t\t&& (\n\t\t\t\t// The email max length is 100 characters, limited by the VARCHAR(100) column type.\n\t\t\t\tsubstr( $comment1['comment_author_email'], 0, 100 ) == substr( $comment2['comment_author_email'], 0, 100 )\n\t\t\t\t|| substr( stripslashes( $comment1['comment_author_email'] ), 0, 100 ) == substr( $comment2['comment_author_email'], 0, 100 )\n\t\t\t\t|| substr( $comment1['comment_author_email'], 0, 100 ) == substr( stripslashes( $comment2['comment_author_email'] ), 0, 100 )\n\t\t\t\t// Very long emails can be truncated and then stripped if the [0:100] substring isn't a valid address.\n\t\t\t\t|| ( ! $comment1['comment_author_email'] && strlen( $comment2['comment_author_email'] ) > 100 )\n\t\t\t\t|| ( ! $comment2['comment_author_email'] && strlen( $comment1['comment_author_email'] ) > 100 )\n\t\t\t)\n\t\t);\n\t}\n\t\n\t// Does the supplied comment match the details of the one most recently stored in self::$last_comment?\n\tpublic static function matches_last_comment( $comment ) {\n\t\tif ( is_object( $comment ) )\n\t\t\t$comment = (array) $comment;\n\n\t\treturn self::comments_match( self::$last_comment, $comment );\n\t}\n\n\tprivate static function get_user_agent() {\n\t\treturn isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : null;\n\t}\n\n\tprivate static function get_referer() {\n\t\treturn isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : null;\n\t}\n\n\t// return a comma-separated list of role names for the given user\n\tpublic static function get_user_roles( $user_id ) {\n\t\t$roles = false;\n\n\t\tif ( !class_exists('WP_User') )\n\t\t\treturn false;\n\n\t\tif ( $user_id > 0 ) {\n\t\t\t$comment_user = new WP_User( $user_id );\n\t\t\tif ( isset( $comment_user->roles ) )\n\t\t\t\t$roles = join( ',', $comment_user->roles );\n\t\t}\n\n\t\tif ( is_multisite() && is_super_admin( $user_id ) ) {\n\t\t\tif ( empty( $roles ) ) {\n\t\t\t\t$roles = 'super_admin';\n\t\t\t} else {\n\t\t\t\t$comment_user->roles[] = 'super_admin';\n\t\t\t\t$roles = join( ',', $comment_user->roles );\n\t\t\t}\n\t\t}\n\n\t\treturn $roles;\n\t}\n\n\t// filter handler used to return a spam result to pre_comment_approved\n\tpublic static function last_comment_status( $approved, $comment ) {\n\t\t// Only do this if it's the correct comment\n\t\tif ( is_null(self::$last_comment_result) || ! self::matches_last_comment( $comment ) ) {\n\t\t\tself::log( \"comment_is_spam mismatched comment, returning unaltered $approved\" );\n\t\t\treturn $approved;\n\t\t}\n\n\t\t// bump the counter here instead of when the filter is added to reduce the possibility of overcounting\n\t\tif ( $incr = apply_filters('akismet_spam_count_incr', 1) )\n\t\t\tupdate_option( 'akismet_spam_count', get_option('akismet_spam_count') + $incr );\n\n\t\treturn self::$last_comment_result;\n\t}\n\t\n\t/**\n\t * If Akismet is temporarily unreachable, we don't want to \"spam\" the blogger with\n\t * moderation emails for comments that will be automatically cleared or spammed on\n\t * the next retry.\n\t *\n\t * For comments that will be rechecked later, empty the list of email addresses that\n\t * the moderation email would be sent to.\n\t *\n\t * @param array $emails An array of email addresses that the moderation email will be sent to.\n\t * @param int $comment_id The ID of the relevant comment.\n\t * @return array An array of email addresses that the moderation email will be sent to.\n\t */\n\tpublic static function disable_moderation_emails_if_unreachable( $emails, $comment_id ) {\n\t\tif ( ! empty( self::$prevent_moderation_email_for_these_comments ) && ! empty( $emails ) ) {\n\t\t\t$comment = get_comment( $comment_id );\n\n\t\t\tforeach ( self::$prevent_moderation_email_for_these_comments as $possible_match ) {\n\t\t\t\tif ( self::comments_match( $possible_match, $comment ) ) {\n\t\t\t\t\tupdate_comment_meta( $comment_id, 'akismet_delayed_moderation_email', true );\n\t\t\t\t\treturn array();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $emails;\n\t}\n\n\tpublic static function _cmp_time( $a, $b ) {\n\t\treturn $a['time'] > $b['time'] ? -1 : 1;\n\t}\n\n\tpublic static function _get_microtime() {\n\t\t$mtime = explode( ' ', microtime() );\n\t\treturn $mtime[1] + $mtime[0];\n\t}\n\n\t/**\n\t * Make a POST request to the Akismet API.\n\t *\n\t * @param string $request The body of the request.\n\t * @param string $path The path for the request.\n\t * @param string $ip The specific IP address to hit.\n\t * @return array A two-member array consisting of the headers and the response body, both empty in the case of a failure.\n\t */\n\tpublic static function http_post( $request, $path, $ip=null ) {\n\n\t\t$akismet_ua = sprintf( 'WordPress/%s | Akismet/%s', $GLOBALS['wp_version'], constant( 'AKISMET_VERSION' ) );\n\t\t$akismet_ua = apply_filters( 'akismet_ua', $akismet_ua );\n\n\t\t$content_length = strlen( $request );\n\n\t\t$api_key   = self::get_api_key();\n\t\t$host      = self::API_HOST;\n\n\t\tif ( !empty( $api_key ) )\n\t\t\t$host = $api_key.'.'.$host;\n\n\t\t$http_host = $host;\n\t\t// use a specific IP if provided\n\t\t// needed by Akismet_Admin::check_server_connectivity()\n\t\tif ( $ip && long2ip( ip2long( $ip ) ) ) {\n\t\t\t$http_host = $ip;\n\t\t}\n\n\t\t$http_args = array(\n\t\t\t'body' => $request,\n\t\t\t'headers' => array(\n\t\t\t\t'Content-Type' => 'application/x-www-form-urlencoded; charset=' . get_option( 'blog_charset' ),\n\t\t\t\t'Host' => $host,\n\t\t\t\t'User-Agent' => $akismet_ua,\n\t\t\t),\n\t\t\t'httpversion' => '1.0',\n\t\t\t'timeout' => 15\n\t\t);\n\n\t\t$akismet_url = $http_akismet_url = \"http://{$http_host}/1.1/{$path}\";\n\n\t\t/**\n\t\t * Try SSL first; if that fails, try without it and don't try it again for a while.\n\t\t */\n\n\t\t$ssl = $ssl_failed = false;\n\n\t\t// Check if SSL requests were disabled fewer than X hours ago.\n\t\t$ssl_disabled = get_option( 'akismet_ssl_disabled' );\n\n\t\tif ( $ssl_disabled && $ssl_disabled < ( time() - 60 * 60 * 24 ) ) { // 24 hours\n\t\t\t$ssl_disabled = false;\n\t\t\tdelete_option( 'akismet_ssl_disabled' );\n\t\t}\n\t\telse if ( $ssl_disabled ) {\n\t\t\tdo_action( 'akismet_ssl_disabled' );\n\t\t}\n\n\t\tif ( ! $ssl_disabled && function_exists( 'wp_http_supports') && ( $ssl = wp_http_supports( array( 'ssl' ) ) ) ) {\n\t\t\t$akismet_url = set_url_scheme( $akismet_url, 'https' );\n\n\t\t\tdo_action( 'akismet_https_request_pre' );\n\t\t}\n\n\t\t$response = wp_remote_post( $akismet_url, $http_args );\n\n\t\tAkismet::log( compact( 'akismet_url', 'http_args', 'response' ) );\n\n\t\tif ( $ssl && is_wp_error( $response ) ) {\n\t\t\tdo_action( 'akismet_https_request_failure', $response );\n\n\t\t\t// Intermittent connection problems may cause the first HTTPS\n\t\t\t// request to fail and subsequent HTTP requests to succeed randomly.\n\t\t\t// Retry the HTTPS request once before disabling SSL for a time.\n\t\t\t$response = wp_remote_post( $akismet_url, $http_args );\n\t\t\t\n\t\t\tAkismet::log( compact( 'akismet_url', 'http_args', 'response' ) );\n\n\t\t\tif ( is_wp_error( $response ) ) {\n\t\t\t\t$ssl_failed = true;\n\n\t\t\t\tdo_action( 'akismet_https_request_failure', $response );\n\n\t\t\t\tdo_action( 'akismet_http_request_pre' );\n\n\t\t\t\t// Try the request again without SSL.\n\t\t\t\t$response = wp_remote_post( $http_akismet_url, $http_args );\n\n\t\t\t\tAkismet::log( compact( 'http_akismet_url', 'http_args', 'response' ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( is_wp_error( $response ) ) {\n\t\t\tdo_action( 'akismet_request_failure', $response );\n\n\t\t\treturn array( '', '' );\n\t\t}\n\n\t\tif ( $ssl_failed ) {\n\t\t\t// The request failed when using SSL but succeeded without it. Disable SSL for future requests.\n\t\t\tupdate_option( 'akismet_ssl_disabled', time() );\n\t\t\t\n\t\t\tdo_action( 'akismet_https_disabled' );\n\t\t}\n\t\t\n\t\t$simplified_response = array( $response['headers'], $response['body'] );\n\t\t\n\t\tself::update_alert( $simplified_response );\n\n\t\treturn $simplified_response;\n\t}\n\n\t// given a response from an API call like check_key_status(), update the alert code options if an alert is present.\n\tprivate static function update_alert( $response ) {\n\t\t$code = $msg = null;\n\t\tif ( isset( $response[0]['x-akismet-alert-code'] ) ) {\n\t\t\t$code = $response[0]['x-akismet-alert-code'];\n\t\t\t$msg  = $response[0]['x-akismet-alert-msg'];\n\t\t}\n\n\t\t// only call update_option() if the value has changed\n\t\tif ( $code != get_option( 'akismet_alert_code' ) ) {\n\t\t\tif ( ! $code ) {\n\t\t\t\tdelete_option( 'akismet_alert_code' );\n\t\t\t\tdelete_option( 'akismet_alert_msg' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tupdate_option( 'akismet_alert_code', $code );\n\t\t\t\tupdate_option( 'akismet_alert_msg', $msg );\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static function load_form_js() {\n\t\t// WP < 3.3 can't enqueue a script this late in the game and still have it appear in the footer.\n\t\t// Once we drop support for everything pre-3.3, this can change back to a single enqueue call.\n\t\twp_register_script( 'akismet-form', AKISMET__PLUGIN_URL . '_inc/form.js', array(), AKISMET_VERSION, true );\n\t\tadd_action( 'wp_footer', array( 'Akismet', 'print_form_js' ) );\n\t\tadd_action( 'admin_footer', array( 'Akismet', 'print_form_js' ) );\n\t}\n\t\n\tpublic static function print_form_js() {\n\t\twp_print_scripts( 'akismet-form' );\n\t}\n\n\tpublic static function inject_ak_js( $fields ) {\n\t\techo '<p style=\"display: none;\">';\n\t\techo '<input type=\"hidden\" id=\"ak_js\" name=\"ak_js\" value=\"' . mt_rand( 0, 250 ) . '\"/>';\n\t\techo '</p>';\n\t}\n\n\tprivate static function bail_on_activation( $message, $deactivate = true ) {\n?>\n<!doctype html>\n<html>\n<head>\n<meta charset=\"<?php bloginfo( 'charset' ); ?>\">\n<style>\n* {\n\ttext-align: center;\n\tmargin: 0;\n\tpadding: 0;\n\tfont-family: \"Lucida Grande\",Verdana,Arial,\"Bitstream Vera Sans\",sans-serif;\n}\np {\n\tmargin-top: 1em;\n\tfont-size: 18px;\n}\n</style>\n<body>\n<p><?php echo esc_html( $message ); ?></p>\n</body>\n</html>\n<?php\n\t\tif ( $deactivate ) {\n\t\t\t$plugins = get_option( 'active_plugins' );\n\t\t\t$akismet = plugin_basename( AKISMET__PLUGIN_DIR . 'akismet.php' );\n\t\t\t$update  = false;\n\t\t\tforeach ( $plugins as $i => $plugin ) {\n\t\t\t\tif ( $plugin === $akismet ) {\n\t\t\t\t\t$plugins[$i] = false;\n\t\t\t\t\t$update = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $update ) {\n\t\t\t\tupdate_option( 'active_plugins', array_filter( $plugins ) );\n\t\t\t}\n\t\t}\n\t\texit;\n\t}\n\n\tpublic static function view( $name, array $args = array() ) {\n\t\t$args = apply_filters( 'akismet_view_arguments', $args, $name );\n\t\t\n\t\tforeach ( $args AS $key => $val ) {\n\t\t\t$$key = $val;\n\t\t}\n\t\t\n\t\tload_plugin_textdomain( 'akismet' );\n\n\t\t$file = AKISMET__PLUGIN_DIR . 'views/'. $name . '.php';\n\n\t\tinclude( $file );\n\t}\n\n\t/**\n\t * Attached to activate_{ plugin_basename( __FILES__ ) } by register_activation_hook()\n\t * @static\n\t */\n\tpublic static function plugin_activation() {\n\t\tif ( version_compare( $GLOBALS['wp_version'], AKISMET__MINIMUM_WP_VERSION, '<' ) ) {\n\t\t\tload_plugin_textdomain( 'akismet' );\n\t\t\t\n\t\t\t$message = '<strong>'.sprintf(esc_html__( 'Akismet %s requires WordPress %s or higher.' , 'akismet'), AKISMET_VERSION, AKISMET__MINIMUM_WP_VERSION ).'</strong> '.sprintf(__('Please <a href=\"%1$s\">upgrade WordPress</a> to a current version, or <a href=\"%2$s\">downgrade to version 2.4 of the Akismet plugin</a>.', 'akismet'), 'https://codex.wordpress.org/Upgrading_WordPress', 'http://wordpress.org/extend/plugins/akismet/download/');\n\n\t\t\tAkismet::bail_on_activation( $message );\n\t\t}\n\t}\n\n\t/**\n\t * Removes all connection options\n\t * @static\n\t */\n\tpublic static function plugin_deactivation( ) {\n\t\treturn self::deactivate_key( self::get_api_key() );\n\t}\n\t\n\t/**\n\t * Essentially a copy of WP's build_query but one that doesn't expect pre-urlencoded values.\n\t *\n\t * @param array $args An array of key => value pairs\n\t * @return string A string ready for use as a URL query string.\n\t */\n\tpublic static function build_query( $args ) {\n\t\treturn _http_build_query( $args, '', '&' );\n\t}\n\n\t/**\n\t * Log debugging info to the error log.\n\t *\n\t * Enabled when WP_DEBUG_LOG is enabled, but can be disabled via the akismet_debug_log filter.\n\t *\n\t * @param mixed $akismet_debug The data to log.\n\t */\n\tpublic static function log( $akismet_debug ) {\n\t\tif ( apply_filters( 'akismet_debug_log', defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) ) {\n\t\t\terror_log( print_r( compact( 'akismet_debug' ), true ) );\n\t\t}\n\t}\n\n\tpublic static function pre_check_pingback( $method ) {\n\t\tif ( $method !== 'pingback.ping' )\n\t\t\treturn;\n\n\t\tglobal $wp_xmlrpc_server;\n\t\n\t\tif ( !is_object( $wp_xmlrpc_server ) )\n\t\t\treturn false;\n\t\n\t\t// Lame: tightly coupled with the IXR class.\n\t\t$args = $wp_xmlrpc_server->message->params;\n\t\n\t\tif ( !empty( $args[1] ) ) {\n\t\t\t$post_id = url_to_postid( $args[1] );\n\n\t\t\t// If this gets through the pre-check, make sure we properly identify the outbound request as a pingback verification\n\t\t\tAkismet::pingback_forwarded_for( null, $args[0] );\n\t\t\tadd_filter( 'http_request_args', array( 'Akismet', 'pingback_forwarded_for' ), 10, 2 );\n\n\t\t\t$comment = array(\n\t\t\t\t'comment_author_url' => $args[0],\n\t\t\t\t'comment_post_ID' => $post_id,\n\t\t\t\t'comment_author' => '',\n\t\t\t\t'comment_author_email' => '',\n\t\t\t\t'comment_content' => '',\n\t\t\t\t'comment_type' => 'pingback',\n\t\t\t\t'akismet_pre_check' => '1',\n\t\t\t\t'comment_pingback_target' => $args[1],\n\t\t\t);\n\n\t\t\t$comment = Akismet::auto_check_comment( $comment );\n\n\t\t\tif ( isset( $comment['akismet_result'] ) && 'true' == $comment['akismet_result'] ) {\n\t\t\t\t// Lame: tightly coupled with the IXR classes. Unfortunately the action provides no context and no way to return anything.\n\t\t\t\t$wp_xmlrpc_server->error( new IXR_Error( 0, 'Invalid discovery target' ) );\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic static function pingback_forwarded_for( $r, $url ) {\n\t\tstatic $urls = array();\n\t\n\t\t// Call this with $r == null to prime the callback to add headers on a specific URL\n\t\tif ( is_null( $r ) && !in_array( $url, $urls ) ) {\n\t\t\t$urls[] = $url;\n\t\t}\n\n\t\t// Add X-Pingback-Forwarded-For header, but only for requests to a specific URL (the apparent pingback source)\n\t\tif ( is_array( $r ) && is_array( $r['headers'] ) && !isset( $r['headers']['X-Pingback-Forwarded-For'] ) && in_array( $url, $urls ) ) {\n\t\t\t$remote_ip = preg_replace( '/[^a-fx0-9:.,]/i', '', $_SERVER['REMOTE_ADDR'] );\n\t\t\n\t\t\t// Note: this assumes REMOTE_ADDR is correct, and it may not be if a reverse proxy or CDN is in use\n\t\t\t$r['headers']['X-Pingback-Forwarded-For'] = $remote_ip;\n\n\t\t\t// Also identify the request as a pingback verification in the UA string so it appears in logs\n\t\t\t$r['user-agent'] .= '; verifying pingback from ' . $remote_ip;\n\t\t}\n\n\t\treturn $r;\n\t}\n\t\n\t/**\n\t * Ensure that we are loading expected scalar values from akismet_as_submitted commentmeta.\n\t *\n\t * @param mixed $meta_value\n\t * @return mixed\n\t */\n\tprivate static function sanitize_comment_as_submitted( $meta_value ) {\n\t\tif ( empty( $meta_value ) ) {\n\t\t\treturn $meta_value;\n\t\t}\n\n\t\t$meta_value = (array) $meta_value;\n\n\t\tforeach ( $meta_value as $key => $value ) {\n\t\t\tif ( ! isset( self::$comment_as_submitted_allowed_keys[$key] ) || ! is_scalar( $value ) ) {\n\t\t\t\tunset( $meta_value[$key] );\n\t\t\t}\n\t\t}\n\n\t\treturn $meta_value;\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/index.php",
    "content": "<?php\n# Silence is golden."
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/readme.txt",
    "content": "=== Akismet ===\nContributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, eoigal, cfinke, automattic, jgs\nTags: akismet, comments, spam, antispam, anti-spam, anti spam, comment moderation, comment spam, contact form spam, spam comments\nRequires at least: 3.2\nTested up to: 4.4.1\nStable tag: 3.1.7\nLicense: GPLv2 or later\n\nAkismet checks your comments against the Akismet Web service to see if they look like spam or not.\n\n== Description ==\n\nAkismet checks your comments against the Akismet Web service to see if they look like spam or not and lets you review the spam it catches under your blog's \"Comments\" admin screen.\n\nMajor features in Akismet include:\n\n* Automatically checks all comments and filters out the ones that look like spam.\n* Each comment has a status history, so you can easily see which comments were caught or cleared by Akismet and which were spammed or unspammed by a moderator.\n* URLs are shown in the comment body to reveal hidden or misleading links.\n* Moderators can see the number of approved comments for each user.\n* A discard feature that outright blocks the worst spam, saving you disk space and speeding up your site.\n\nPS: You'll need an [Akismet.com API key](http://akismet.com/get/) to use it.  Keys are free for personal blogs; paid subscriptions are available for businesses and commercial sites.\n\n== Installation ==\n\nUpload the Akismet plugin to your blog, Activate it, then enter your [Akismet.com API key](http://akismet.com/get/).\n\n1, 2, 3: You're done!\n\n== Changelog ==\n\n= 3.1.7 =\n*Release Date - 4 January 2016*\n\n* Added documentation for the 'akismet_comment_nonce' filter.\n* The post-install activation button is now accessible to screen readers and keyboard-only users.\n* Fixed a bug that was preventing the \"Remove author URL\" feature from working in WordPress 4.4\n\n= 3.1.6 =\n*Release Date - 14 December 2015*\n\n* Improve the notices shown after activating Akismet.\n* Update some strings to allow for the proper plural forms in all languages.\n\n= 3.1.5 =\n*Release Date - 13 October 2015*\n\n* Closes a potential XSS vulnerability.\n\n= 3.1.4 =\n*Release Date - 24 September 2015*\n\n* Fixed a bug that was preventing some users from automatically connecting using Jetpack if they didn't have a current Akismet subscription.\n* Fixed a bug that could cause comments caught as spam to be placed in the Pending queue.\n* Error messages and instructions have been simplified to be more understandable.\n* Link previews are enabled for all links inside comments, not just the author's website link.\n\n= 3.1.3 =\n*Release Date - 6 July 2015*\n\n* Notify users when their account status changes after previously being successfully set up. This should help any users who are seeing blank Akismet settings screens.\n\n= 3.1.2 =\n*Release Date - 7 June 2015*\n\n* Reduced the amount of space Akismet uses in the commentmeta table.\n* Fixed a bug where some comments with quotes in the author name weren't getting history entries\n* Pre-emptive security improvements to ensure that the Akismet plugin can't be used by attackers to compromise a WordPress installation.\n* Better UI for the key entry field: allow whitespace to be included at the beginning or end of the key and strip it out automatically when the form is submitted.\n* When deactivating the plugin, notify the Akismet API so the site can be marked as inactive.\n* Clearer error messages.\n\n= 3.1.1 =\n*Release Date - 17th March, 2015*\n\n* Improvements to the \"Remove comment author URL\" JavaScript\n* Include the pingback pre-check from the 2.6 branch.\n\n= 3.1 =\n*Release Date - 11th March, 2015*\n\n* Use HTTPS by default for all requests to Akismet.\n* Fix for a situation where Akismet might strip HTML from a comment.\n\n= 3.0.4 =\n*Release Date - 11th December, 2014*\n\n* Fix to make .htaccess compatible with Apache 2.4.\n* Fix to allow removal of https author URLs.\n* Fix to avoid stripping part of the author URL when removing and re-adding.\n* Removed the \"Check for Spam\" button from the \"Trash\" and \"Approved\" queues, where it would have no effect.\n* Allow automatic API key configuration when Jetpack is installed and connected to a WordPress.com account\n\n= 3.0.3 =\n*Release Date - 3rd November, 2014*\n\n* Fix for sending the wrong data to delete_comment action that could have prevented old spam comments from being deleted.\n* Added a filter to disable logging of Akismet debugging information.\n* Added a filter for the maximum comment age when deleting old spam comments.\n* Added a filter for the number per batch when deleting old spam comments.\n* Removed the \"Check for Spam\" button from the Spam folder.\n\n= 3.0.2 =\n*Release Date - 18th August, 2014*\n\n* Performance improvements.\n* Fixed a bug that could truncate the comment data being sent to Akismet for checking.\n\n= 3.0.1 =\n*Release Date - 9th July, 2014*\n\n* Removed dependency on PHP's fsockopen function\n* Fix spam/ham reports to work when reported outside of the WP dashboard, e.g., from Notifications or the WP app\n* Remove jQuery dependency for comment form JavaScript\n* Remove unnecessary data from some Akismet comment meta\n* Suspended keys will now result in all comments being put in moderation, not spam.\n\n= 3.0.0 =\n*Release Date - 15th April, 2014*\n\n* Move Akismet to Settings menu\n* Drop Akismet Stats menu\n* Add stats snapshot to Akismet settings\n* Add Akismet subscription details and status to Akismet settings\n* Add contextual help for each page\n* Improve Akismet setup to use Jetpack to automate plugin setup\n* Fix \"Check for Spam\" to use AJAX to avoid page timing out\n* Fix Akismet settings page to be responsive\n* Drop legacy code\n* Tidy up CSS and Javascript\n* Replace the old discard setting with a new \"discard pervasive spam\" feature.\n\n= 2.6.0 =\n*Release Date - 18th March, 2014*\n\n* Add ajax paging to the check for spam button to handle large volumes of comments\n* Optimize javascript and add localization support \n* Fix bug in link to spam comments from right now dashboard widget\n* Fix bug with deleting old comments to avoid timeouts dealing with large volumes of comments\n* Include X-Pingback-Forwarded-For header in outbound WordPress pingback verifications\n* Add pre-check for pingbacks, to stop spam before an outbound verification request is made\n\n= 2.5.9 =\n*Release Date - 1st August, 2013*\n\n* Update 'Already have a key' link to redirect page rather than depend on javascript\n* Fix some non-translatable strings to be translatable\n* Update Activation banner in plugins page to redirect user to Akismet config page\n\n= 2.5.8 =\n*Release Date - 20th January, 2013*\n\n* Simplify the activation process for new users\n* Remove the reporter_ip parameter\n* Minor preventative security improvements\n\n= 2.5.7 =\n*Release Date - 13th December, 2012*\n\n* FireFox Stats iframe preview bug\n* Fix mshots preview when using https\n* Add .htaccess to block direct access to files\n* Prevent some PHP notices\n* Fix Check For Spam return location when referrer is empty\n* Fix Settings links for network admins\n* Fix prepare() warnings in WP 3.5\n\n= 2.5.6 =\n*Release Date - 26th April, 2012*\n\n* Prevent retry scheduling problems on sites where wp_cron is misbehaving\n* Preload mshot previews\n* Modernize the widget code\n* Fix a bug where comments were not held for moderation during an error condition\n* Improve the UX and display when comments are temporarily held due to an error\n* Make the Check For Spam button force a retry when comments are held due to an error\n* Handle errors caused by an invalid key\n* Don't retry comments that are too old\n* Improve error messages when verifying an API key\n\n= 2.5.5 =\n*Release Date - 11th January, 2012*\n\n* Add nonce check for comment author URL remove action\n* Fix the settings link\n\n= 2.5.4 =\n*Release Date - 5th January, 2012*\n\n* Limit Akismet CSS and Javascript loading in wp-admin to just the pages that need it\n* Added author URL quick removal functionality\n* Added mShot preview on Author URL hover\n* Added empty index.php to prevent directory listing\n* Move wp-admin menu items under Jetpack, if it is installed\n* Purge old Akismet comment meta data, default of 15 days\n\n= 2.5.3 = \n*Release Date - 8th Febuary, 2011*\n\n* Specify the license is GPL v2 or later\n* Fix a bug that could result in orphaned commentmeta entries\n* Include hotfix for WordPress 3.0.5 filter issue\n\n= 2.5.2 =\n*Release Date - 14th January, 2011*\n\n* Properly format the comment count for author counts\n* Look for super admins on multisite installs when looking up user roles\n* Increase the HTTP request timeout\n* Removed padding for author approved count\n* Fix typo in function name\n* Set Akismet stats iframe height to fixed 2500px.  Better to have one tall scroll bar than two side by side.\n\n= 2.5.1 =\n*Release Date - 17th December, 2010*\n\n* Fix a bug that caused the \"Auto delete\" option to fail to discard comments correctly\n* Remove the comment nonce form field from the 'Akismet Configuration' page in favor of using a filter, akismet_comment_nonce\n* Fixed padding bug in \"author\" column of posts screen\n* Added margin-top to \"cleared by ...\" badges on dashboard\n* Fix possible error when calling akismet_cron_recheck()\n* Fix more PHP warnings\n* Clean up XHTML warnings for comment nonce\n* Fix for possible condition where scheduled comment re-checks could get stuck\n* Clean up the comment meta details after deleting a comment\n* Only show the status badge if the comment status has been changed by someone/something other than Akismet\n* Show a 'History' link in the row-actions\n* Translation fixes\n* Reduced font-size on author name\n* Moved \"flagged by...\" notification to top right corner of comment container and removed heavy styling\n* Hid \"flagged by...\" notification while on dashboard\n\n= 2.5.0 =\n*Release Date - 7th December, 2010*\n\n* Track comment actions under 'Akismet Status' on the edit comment screen\n* Fix a few remaining deprecated function calls ( props Mike Glendinning ) \n* Use HTTPS for the stats IFRAME when wp-admin is using HTTPS\n* Use the WordPress HTTP class if available\n* Move the admin UI code to a separate file, only loaded when needed\n* Add cron retry feature, to replace the old connectivity check\n* Display Akismet status badge beside each comment\n* Record history for each comment, and display it on the edit page\n* Record the complete comment as originally submitted in comment_meta, to use when reporting spam and ham\n* Highlight links in comment content\n* New option, \"Show the number of comments you've approved beside each comment author.\"\n* New option, \"Use a nonce on the comment form.\"\n\n= 2.4.0 =\n*Release Date - 23rd August, 2010*\n\n* Spell out that the license is GPLv2\n* Fix PHP warnings\n* Fix WordPress deprecated function calls\n* Fire the delete_comment action when deleting comments\n* Move code specific for older WP versions to legacy.php\n* General code clean up\n\n= 2.3.0 =\n*Release Date - 5th June, 2010*\n\n* Fix \"Are you sure\" nonce message on config screen in WPMU\n* Fix XHTML compliance issue in sidebar widget\n* Change author link; remove some old references to WordPress.com accounts\n* Localize the widget title (core ticket #13879)\n\n= 2.2.9 =\n*Release Date - 2nd June, 2010*\n\n* Eliminate a potential conflict with some plugins that may cause spurious reports\n\n= 2.2.8 =\n*Release Date - 27th May, 2010*\n\n* Fix bug in initial comment check for ipv6 addresses\n* Report comments as ham when they are moved from spam to moderation\n* Report comments as ham when clicking undo after spam\n* Use transition_comment_status action when available instead of older actions for spam/ham submissions\n* Better diagnostic messages when PHP network functions are unavailable\n* Better handling of comments by logged-in users\n\n= 2.2.7 =\n*Release Date - 17th December, 2009*\n\n* Add a new AKISMET_VERSION constant\n* Reduce the possibility of over-counting spam when another spam filter plugin is in use\n* Disable the connectivity check when the API key is hard-coded for WPMU\n\n= 2.2.6 =\n*Release Date - 20th July, 2009*\n\n* Fix a global warning introduced in 2.2.5\n* Add changelog and additional readme.txt tags\n* Fix an array conversion warning in some versions of PHP\n* Support a new WPCOM_API_KEY constant for easier use with WordPress MU\n\n= 2.2.5 =\n*Release Date - 13th July, 2009*\n\n* Include a new Server Connectivity diagnostic check, to detect problems caused by firewalls\n\n= 2.2.4 =\n*Release Date - 3rd June, 2009*\n\n* Fixed a key problem affecting the stats feature in WordPress MU\n* Provide additional blog information in Akismet API calls\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/views/config.php",
    "content": "<div class=\"wrap\">\n\n\t<h2><?php esc_html_e( 'Akismet' , 'akismet');?></h2>\n\n\t<div class=\"have-key\">\n\n\t\t<?php if ( $stat_totals && isset( $stat_totals['all'] ) && (int) $stat_totals['all']->spam > 0 ) : ?>\n\n\t\t\t<div class=\"new-snapshot stats\">\n\n\t\t\t\t<span style=\"float:right;margin:10px 15px -5px 0px\">\n\t\t\t\t\t<a href=\"<?php echo esc_url( Akismet_Admin::get_page_url( 'stats' ) ); ?>\" class=\"\"><?php esc_html_e( 'Summaries' , 'akismet');?></a>\n\t\t\t\t</span>\n\n\t\t\t\t<iframe allowtransparency=\"true\" scrolling=\"no\" frameborder=\"0\" style=\"width: 100%; height: 215px; overflow: hidden;\" src=\"<?php printf( '//akismet.com/web/1.0/snapshot.php?blog=%s&api_key=%s&height=180&locale=%s', urlencode( get_bloginfo('url') ), Akismet::get_api_key(), get_locale() );?>\"></iframe>\n\t\t\t\t<ul>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<h3><?php esc_html_e( 'Past six months' , 'akismet');?></h3>\n\t\t\t\t\t\t<span><?php echo number_format( $stat_totals['6-months']->spam );?></span>\n\t\t\t\t\t\t<?php echo esc_html( _n( 'Spam blocked', 'Spam blocked', $stat_totals['6-months']->spam, 'akismet' ) ); ?>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<h3><?php esc_html_e( 'All time' , 'akismet');?></h3>\n\t\t\t\t\t\t<span><?php echo number_format( $stat_totals['all']->spam );?></span>\n\t\t\t\t\t\t<?php echo esc_html( _n( 'Spam blocked', 'Spam blocked', $stat_totals['all']->spam, 'akismet' ) ); ?>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<h3><?php esc_html_e( 'Accuracy' , 'akismet');?></h3>\n\t\t\t\t\t\t<span><?php echo $stat_totals['all']->accuracy; ?>%</span>\n\t\t\t\t\t\t<?php printf( _n( '%s missed spam', '%s missed spam', $stat_totals['all']->missed_spam, 'akismet' ), number_format( $stat_totals['all']->missed_spam ) ); ?>\n\t\t\t\t\t\t|\n\t\t\t\t\t\t<?php printf( _n( '%s false positive', '%s false positives', $stat_totals['all']->false_positives, 'akismet' ), number_format( $stat_totals['all']->false_positives ) ); ?>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<div class=\"clearfix\"></div>\n\t\t\t</div>\n\t\t<?php endif;?>\n\n\t\t<?php if ( $akismet_user ):?>\n\n\t\t\t<div id=\"wpcom-stats-meta-box-container\" class=\"metabox-holder\"><?php\n\t\t\t\twp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );\n\t\t\t\twp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );\n\t\t\t\t?>\n\t\t\t\t<script type=\"text/javascript\">\n\t\t\t\tjQuery(document).ready( function($) {\n\t\t\t\t\tjQuery('.if-js-closed').removeClass('if-js-closed').addClass('closed');\n\t\t\t\t\tif(typeof postboxes !== 'undefined')\n\t\t\t\t\t\tpostboxes.add_postbox_toggles( 'plugins_page_akismet-key-config' );\n\t\t\t\t});\n\t\t\t\t</script>\n\t\t\t\t<div class=\"postbox-container\" style=\"width: 55%;margin-right: 10px;\">\n\t\t\t\t\t<div id=\"normal-sortables\" class=\"meta-box-sortables ui-sortable\">\n\t\t\t\t\t\t<div id=\"referrers\" class=\"postbox \">\n\t\t\t\t\t\t\t<div class=\"handlediv\" title=\"Click to toggle\"><br></div>\n\t\t\t\t\t\t\t<h3 class=\"hndle\"><span><?php esc_html_e( 'Settings' , 'akismet');?></span></h3>\n\t\t\t\t\t\t\t<form name=\"akismet_conf\" id=\"akismet-conf\" action=\"<?php echo esc_url( Akismet_Admin::get_page_url() ); ?>\" method=\"POST\">\n\t\t\t\t\t\t\t\t<div class=\"inside\">\n\t\t\t\t\t\t\t\t\t<table cellspacing=\"0\" class=\"akismet-settings\">\n\t\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t\t<?php if ( !defined( 'WPCOM_API_KEY' ) ):?>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<th class=\"akismet-api-key\" width=\"10%\" align=\"left\" scope=\"row\"><?php esc_html_e('API Key', 'akismet');?></th>\n\t\t\t\t\t\t\t\t\t\t\t\t<td width=\"5%\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<td align=\"left\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"api-key\"><input id=\"key\" name=\"key\" type=\"text\" size=\"15\" value=\"<?php echo esc_attr( get_option('wordpress_api_key') ); ?>\" class=\"regular-text code <?php echo $akismet_user->status;?>\"></span>\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t\t\t\t\t<?php if ( isset( $_GET['ssl_status'] ) ) { ?>\n\t\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<th align=\"left\" scope=\"row\"><?php esc_html_e( 'SSL Status', 'akismet' ); ?></th>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td></td>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td align=\"left\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<?php\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif ( ! function_exists( 'wp_http_supports' ) ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?><b><?php esc_html_e( 'Disabled.', 'akismet' ); ?></b> <?php printf( esc_html( 'Your WordPress installation does not include the function %s; upgrade to the latest version of WordPress.', 'akismet' ), '<code>wp_http_supports</code>' ); ?><?php\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse if ( ! wp_http_supports( array( 'ssl' ) ) ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?><b><?php esc_html_e( 'Disabled.', 'akismet' ); ?></b> <?php esc_html_e( 'Your Web server cannot make SSL requests; contact your Web host and ask them to add support for SSL requests.', 'akismet' ); ?><?php\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ssl_disabled = get_option( 'akismet_ssl_disabled' );\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif ( $ssl_disabled ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?><b><?php esc_html_e( 'Temporarily disabled.', 'akismet' ); ?></b> <?php esc_html_e( 'Akismet encountered a problem with a previous SSL request and disabled it temporarily. It will begin using SSL for requests again shortly.', 'akismet' ); ?><?php\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?><b><?php esc_html_e( 'Enabled.', 'akismet' ); ?></b> <?php esc_html_e( 'All systems functional.', 'akismet' ); ?><?php\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t<?php } ?>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<th align=\"left\" scope=\"row\"><?php esc_html_e('Comments', 'akismet');?></th>\n\t\t\t\t\t\t\t\t\t\t\t\t<td></td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td align=\"left\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"akismet_show_user_comments_approved\" title=\"<?php esc_attr_e( 'Show approved comments' , 'akismet'); ?>\"><input name=\"akismet_show_user_comments_approved\" id=\"akismet_show_user_comments_approved\" value=\"1\" type=\"checkbox\" <?php checked('1', get_option('akismet_show_user_comments_approved')); ?>> <?php esc_html_e('Show the number of approved comments beside each comment author', 'akismet'); ?></label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t\t<th class=\"strictness\" align=\"left\" scope=\"row\"><?php esc_html_e('Strictness', 'akismet'); ?></th>\n\t\t\t\t\t\t\t\t\t\t\t\t<td></td>\n\t\t\t\t\t\t\t\t\t\t\t\t<td align=\"left\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<fieldset><legend class=\"screen-reader-text\"><span><?php esc_html_e('Akismet anti-spam strictness', 'akismet'); ?></span></legend>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p><label for=\"akismet_strictness_1\"><input type=\"radio\" name=\"akismet_strictness\" id=\"akismet_strictness_1\" value=\"1\" <?php checked('1', get_option('akismet_strictness')); ?> /> <?php esc_html_e('Silently discard the worst and most pervasive spam so I never see it.', 'akismet'); ?></label></p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p><label for=\"akismet_strictness_0\"><input type=\"radio\" name=\"akismet_strictness\" id=\"akismet_strictness_0\" value=\"0\" <?php checked('0', get_option('akismet_strictness')); ?> /> <?php esc_html_e('Always put spam in the Spam folder for review.', 'akismet'); ?></label></p>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</fieldset>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"note\"><strong><?php esc_html_e('Note:', 'akismet');?></strong>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t$delete_interval = max( 1, intval( apply_filters( 'akismet_delete_comment_interval', 15 ) ) );\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tprintf(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_n(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Spam in the <a href=\"%1$s\">spam folder</a> older than 1 day is deleted automatically.',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Spam in the <a href=\"%1$s\">spam folder</a> older than %2$d days is deleted automatically.',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$delete_interval,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'akismet'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tadmin_url( 'edit-comments.php?comment_status=spam' ),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$delete_interval\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div id=\"major-publishing-actions\">\n\t\t\t\t\t\t\t\t\t<?php if ( !defined( 'WPCOM_API_KEY' ) ):?>\n\t\t\t\t\t\t\t\t\t<div id=\"delete-action\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"submitdelete deletion\" href=\"<?php echo esc_url( Akismet_Admin::get_page_url( 'delete_key' ) ); ?>\"><?php esc_html_e('Disconnect this account', 'akismet'); ?></a>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t\t\t<?php wp_nonce_field(Akismet_Admin::NONCE) ?>\n\t\t\t\t\t\t\t\t\t<div id=\"publishing-action\">\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"action\" value=\"enter-key\">\n\t\t\t\t\t\t\t\t\t\t\t<input type=\"submit\" name=\"submit\" id=\"submit\" class=\"button button-primary\" value=\"<?php esc_attr_e('Save Changes', 'akismet');?>\">\n\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class=\"clear\"></div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"postbox-container\" style=\"width:44%;\">\n\t\t\t\t\t<div id=\"normal-sortables\" class=\"meta-box-sortables ui-sortable\">\n\t\t\t\t\t\t<div id=\"referrers\" class=\"postbox \">\n\t\t\t\t\t\t\t<div class=\"handlediv\" title=\"Click to toggle\"><br></div>\n\t\t\t\t\t\t\t<h3 class=\"hndle\"><span><?php esc_html_e( 'Account' , 'akismet');?></span></h3>\n\t\t\t\t\t\t\t<div class=\"inside\">\n\t\t\t\t\t\t\t\t<table cellspacing=\"0\">\n\t\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th scope=\"row\" align=\"left\"><?php esc_html_e( 'Subscription Type' , 'akismet');?></th>\n\t\t\t\t\t\t\t\t\t\t\t<td width=\"5%\"/>\n\t\t\t\t\t\t\t\t\t\t\t<td align=\"left\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span><?php echo $akismet_user->account_name; ?></span>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th scope=\"row\" align=\"left\"><?php esc_html_e( 'Status' , 'akismet');?></th>\n\t\t\t\t\t\t\t\t\t\t\t<td width=\"5%\"/>\n\t\t\t\t\t\t\t\t\t\t\t<td align=\"left\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span><?php \n\t\t\t\t\t\t\t\t\t\t\t\t\tif ( 'cancelled' == $akismet_user->status ) :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tesc_html_e( 'Cancelled', 'akismet' ); \n\t\t\t\t\t\t\t\t\t\t\t\t\telseif ( 'suspended' == $akismet_user->status ) :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tesc_html_e( 'Suspended', 'akismet' );\n\t\t\t\t\t\t\t\t\t\t\t\t\telseif ( 'missing' == $akismet_user->status ) :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tesc_html_e( 'Missing', 'akismet' ); \n\t\t\t\t\t\t\t\t\t\t\t\t\telseif ( 'no-sub' == $akismet_user->status ) :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tesc_html_e( 'No Subscription Found', 'akismet' );\n\t\t\t\t\t\t\t\t\t\t\t\t\telse :\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tesc_html_e( 'Active', 'akismet' );  \n\t\t\t\t\t\t\t\t\t\t\t\t\tendif; ?></span>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<?php if ( $akismet_user->next_billing_date ) : ?>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th scope=\"row\" align=\"left\"><?php esc_html_e( 'Next Billing Date' , 'akismet');?></th>\n\t\t\t\t\t\t\t\t\t\t\t<td width=\"5%\"/>\n\t\t\t\t\t\t\t\t\t\t\t<td align=\"left\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span><?php echo date( 'F j, Y', $akismet_user->next_billing_date ); ?></span>\n\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div id=\"major-publishing-actions\">\n\t\t\t\t\t\t\t\t<div id=\"publishing-action\">\n\t\t\t\t\t\t\t\t\t<?php Akismet::view( 'get', array( 'text' => ( $akismet_user->account_type == 'free-api-key' && $akismet_user->status == 'active' ? __( 'Upgrade' , 'akismet') : __( 'Change' , 'akismet') ), 'redirect' => 'upgrade' ) ); ?>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"clear\"></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t<?php endif;?>\n\n\t</div>\n</div>"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/views/get.php",
    "content": "<form name=\"akismet_activate\" action=\"https://akismet.com/get/\" method=\"POST\" target=\"_blank\">\n\t<input type=\"hidden\" name=\"passback_url\" value=\"<?php echo esc_url( Akismet_Admin::get_page_url() ); ?>\"/>\n\t<input type=\"hidden\" name=\"blog\" value=\"<?php echo esc_url( get_bloginfo('url') ); ?>\"/>\n\t<input type=\"hidden\" name=\"redirect\" value=\"<?php echo isset( $redirect ) ? $redirect : 'plugin-signup'; ?>\"/>\n\t<input type=\"submit\" class=\"<?php echo isset( $classes ) && count( $classes ) > 0 ? implode( ' ', $classes ) : 'button button-primary';?>\" value=\"<?php echo esc_attr( $text ); ?>\"/>\n</form>"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/views/notice.php",
    "content": "<?php if ( $type == 'plugin' ) :?>\n<div class=\"updated\" style=\"padding: 0; margin: 0; border: none; background: none;\">\n\t<form name=\"akismet_activate\" action=\"<?php echo esc_url( Akismet_Admin::get_page_url() ); ?>\" method=\"POST\">\n\t\t<div class=\"akismet_activate\">\n\t\t\t<div class=\"aa_a\">A</div>\n\t\t\t<div class=\"aa_button_container\">\n\t\t\t\t<div class=\"aa_button_border\">\n\t\t\t\t\t<input type=\"submit\" class=\"aa_button\" value=\"<?php esc_attr_e( 'Activate your Akismet account', 'akismet' ); ?>\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"aa_description\"><?php _e('<strong>Almost done</strong> - activate Akismet and say goodbye to spam', 'akismet');?></div>\n\t\t</div>\n\t</form>\n</div>\n<?php elseif ( $type == 'spam-check' ) :?>\n<div id=\"akismet-warning\" class=\"updated fade\">\n\t<p><strong><?php esc_html_e( 'Akismet has detected a problem.', 'akismet' );?></strong></p>\n\t<p><?php printf( __( 'Some comments have not yet been checked for spam by Akismet. They have been temporarily held for moderation and will automatically be rechecked later.', 'akismet' ) ); ?></p>\n\t<?php if ( $link_text ) { ?>\n\t\t<p><?php echo $link_text; ?></p>\n\t<?php } ?>\n</div>\n<?php elseif ( $type == 'version' ) :?>\n<div id=\"akismet-warning\" class=\"updated fade\"><p><strong><?php printf( esc_html__('Akismet %s requires WordPress 3.0 or higher.', 'akismet'), AKISMET_VERSION);?></strong> <?php printf(__('Please <a href=\"%1$s\">upgrade WordPress</a> to a current version, or <a href=\"%2$s\">downgrade to version 2.4 of the Akismet plugin</a>.', 'akismet'), 'https://codex.wordpress.org/Upgrading_WordPress', 'https://wordpress.org/extend/plugins/akismet/download/');?></p></div>\n<?php elseif ( $type == 'alert' ) :?>\n<div class='error'>\n\t<p><strong><?php printf( esc_html__( 'Akismet Error Code: %s', 'akismet' ), $code ); ?></strong></p>\n\t<p><?php echo esc_html( $msg ); ?></p>\n\t<p><?php\n\n\t/* translators: the placeholder is a clickable URL that leads to more information regarding an error code. */\n\tprintf( esc_html__( 'For more information: %s' , 'akismet'), '<a href=\"https://akismet.com/errors/' . $code . '\">https://akismet.com/errors/' . $code . '</a>' );\n\n\t?>\n\t</p>\n</div>\n<?php elseif ( $type == 'notice' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status failed\"><?php echo $notice_header; ?></h3>\n\t<p class=\"description\">\n\t\t<?php echo $notice_text; ?>\n\t</p>\n</div>\n<?php elseif ( $type == 'missing-functions' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status failed\"><?php esc_html_e('Network functions are disabled.', 'akismet'); ?></h3>\n\t<p class=\"description\"><?php printf( __('Your web host or server administrator has disabled PHP&#8217;s <code>gethostbynamel</code> function.  <strong>Akismet cannot work correctly until this is fixed.</strong>  Please contact your web host or firewall administrator and give them <a href=\"%s\" target=\"_blank\">this information about Akismet&#8217;s system requirements</a>.', 'akismet'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>\n</div>\n<?php elseif ( $type == 'servers-be-down' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status failed\"><?php esc_html_e(\"Akismet can&#8217;t connect to your site.\", 'akismet'); ?></h3>\n\t<p class=\"description\"><?php printf( __('Your firewall may be blocking Akismet. Please contact your host and refer to <a href=\"%s\" target=\"_blank\">our guide about firewalls</a>.', 'akismet'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>\n</div>\n<?php elseif ( $type == 'active-dunning' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status\"><?php esc_html_e(\"Please update your payment information.\", 'akismet'); ?></h3>\n\t<p class=\"description\"><?php printf( __('We cannot process your payment. Please <a href=\"%s\" target=\"_blank\">update your payment details</a>.', 'akismet'), 'https://akismet.com/account/'); ?></p>\n</div>\n<?php elseif ( $type == 'cancelled' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status\"><?php esc_html_e(\"Your Akismet plan has been cancelled.\", 'akismet'); ?></h3>\n\t<p class=\"description\"><?php printf( __('Please visit your <a href=\"%s\" target=\"_blank\">Akismet account page</a> to reactivate your subscription.', 'akismet'), 'https://akismet.com/account/'); ?></p>\n</div>\n<?php elseif ( $type == 'suspended' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status failed\"><?php esc_html_e(\"Your Akismet subscription is suspended.\", 'akismet'); ?></h3>\n\t<p class=\"description\"><?php printf( __('Please contact <a href=\"%s\" target=\"_blank\">Akismet support</a> for assistance.', 'akismet'), 'https://akismet.com/contact/'); ?></p>\n</div>\n<?php elseif ( $type == 'active-notice' && $time_saved ) :?>\n<div class=\"wrap alert active\">\n\t<h3 class=\"key-status\"><?php echo esc_html( $time_saved ); ?></h3>\n\t<p class=\"description\"><?php printf( __('You can help us fight spam and upgrade your account by <a href=\"%s\" target=\"_blank\">contributing a token amount</a>.', 'akismet'), 'https://akismet.com/account/upgrade/'); ?></p>\n</div>\n<?php elseif ( $type == 'missing' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status failed\"><?php esc_html_e( 'There is a problem with your API key.', 'akismet'); ?></h3>\n\t<p class=\"description\"><?php printf( __('Please contact <a href=\"%s\" target=\"_blank\">Akismet support</a> for assistance.', 'akismet'), 'https://akismet.com/contact/'); ?></p>\n</div>\n<?php elseif ( $type == 'no-sub' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status failed\"><?php esc_html_e( 'You don&#8217;t have an Akismet plan.', 'akismet'); ?></h3>\n\t<p class=\"description\">\n\t\t<?php printf( __( 'In 2012, Akismet began using subscription plans for all accounts (even free ones). A plan has not been assigned to your account, and we&#8217;d appreciate it if you&#8217;d <a href=\"%s\" target=\"_blank\">sign into your account</a> and choose one.', 'akismet'), 'https://akismet.com/account/upgrade/' ); ?>\n\t\t<br /><br />\n\t\t<?php printf( __( 'Please <a href=\"%s\" target=\"_blank\">contact our support team</a> with any questions.', 'akismet' ), 'https://akismet.com/contact/' ); ?>\n\t</p>\n</div>\n<?php elseif ( $type == 'new-key-valid' ) :?>\n<div class=\"wrap alert active\">\n\t<h3 class=\"key-status\"><?php esc_html_e('Akismet is now activated. Happy blogging!', 'akismet'); ?></h3>\n</div>\n<?php elseif ( $type == 'new-key-invalid' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status\"><?php esc_html_e( 'The key you entered is invalid. Please double-check it.' , 'akismet'); ?></h3>\n</div>\n<?php elseif ( $type == 'existing-key-invalid' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status\"><?php esc_html_e( 'Your API key is no longer valid. Please enter a new key or contact support@akismet.com.' , 'akismet'); ?></h3>\n</div>\n<?php elseif ( $type == 'new-key-failed' ) :?>\n<div class=\"wrap alert critical\">\n\t<h3 class=\"key-status\"><?php esc_html_e( 'The API key you entered could not be verified.' , 'akismet'); ?></h3>\n\t<p class=\"description\"><?php printf( __('The connection to akismet.com could not be established. Please refer to <a href=\"%s\" target=\"_blank\">our guide about firewalls</a> and check your server configuration.', 'akismet'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>\n</div>\n<?php elseif ( $type == 'limit-reached' && in_array( $level, array( 'yellow', 'red' ) ) ) :?>\n<div class=\"wrap alert critical\">\n\t<?php if ( $level == 'yellow' ): ?>\n\t<h3 class=\"key-status failed\"><?php esc_html_e( 'You&#8217;re using your Akismet key on more sites than your Pro subscription allows.', 'akismet' ); ?></h3>\n\t<p class=\"description\">\n\t\t<?php printf( __( 'Your Pro subscription allows the use of Akismet on only one site. Please <a href=\"%s\" target=\"_blank\">purchase additional Pro subscriptions</a> or upgrade to an Enterprise subscription that allows the use of Akismet on unlimited sites.', 'akismet' ), 'http://docs.akismet.com/billing/add-more-sites/' ); ?>\n\t\t<br /><br />\n\t\t<?php printf( __( 'Please <a href=\"%s\" target=\"_blank\">contact our support team</a> with any questions.', 'akismet' ), 'https://akismet.com/contact/'); ?>\n\t</p>\n\t<?php elseif ( $level == 'red' ): ?>\n\t<h3 class=\"key-status failed\"><?php esc_html_e( 'You&#8217;re using Akismet on far too many sites for your Pro subscription.', 'akismet' ); ?></h3>\n\t<p class=\"description\">\n\t\t<?php printf( __( 'To continue your service, <a href=\"%s\" target=\"_blank\">upgrade to an Enterprise subscription</a>, which covers an unlimited number of sites.', 'akismet'), 'https://akismet.com/account/upgrade/' ); ?></p>\n\t\t<br /><br />\n\t\t<?php printf( __( 'Please <a href=\"%s\" target=\"_blank\">contact our support team</a> with any questions.', 'akismet' ), 'https://akismet.com/contact/'); ?></p>\n\t</p>\n\t<?php endif; ?>\n</div>\n<?php endif;?>"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/views/start.php",
    "content": "<div class=\"no-key config-wrap\"><?php\n\tif ( $akismet_user && in_array( $akismet_user->status, array( 'active', 'active-dunning', 'no-sub', 'missing', 'cancelled', 'suspended' ) ) ) :\n\t\tif ( in_array( $akismet_user->status, array( 'no-sub', 'missing' ) ) ) :?>\n<p><?php esc_html_e('Akismet eliminates spam from your site. Register below to get started.', 'akismet'); ?></p>\n<div class=\"activate-highlight activate-option\">\n\t<div class=\"option-description\">\n\t\t<strong class=\"small-heading\"><?php esc_html_e('Connected via Jetpack', 'akismet'); ?></strong>\n\t\t<?php echo esc_html( $akismet_user->user_email ); ?>\n\t</div>\n\t<form name=\"akismet_activate\" id=\"akismet_activate\" action=\"https://akismet.com/get/\" method=\"post\" class=\"right\" target=\"_blank\">\n\t\t<input type=\"hidden\" name=\"passback_url\" value=\"<?php echo esc_url( Akismet_Admin::get_page_url() ); ?>\"/>\n\t\t<input type=\"hidden\" name=\"blog\" value=\"<?php echo esc_url( get_bloginfo('url') ); ?>\"/>\n\t\t<input type=\"hidden\" name=\"auto-connect\" value=\"<?php echo $akismet_user->ID;?>\"/>\n\t\t<input type=\"hidden\" name=\"redirect\" value=\"plugin-signup\"/>\n\t\t<input type=\"submit\" class=\"button button-primary\" value=\"<?php esc_attr_e( 'Register for Akismet' , 'akismet'); ?>\"/>\n\t</form>\n</div>\n<?php elseif ( $akismet_user->status == 'cancelled' ) :?>\n<p><?php esc_html_e('Akismet eliminates spam from your site.', 'akismet'); ?></p>\n<div class=\"activate-highlight activate-option\">\n\t<div class=\"option-description\" style=\"width:75%;\">\n\t\t<strong class=\"small-heading\"><?php esc_html_e('Connected via Jetpack', 'akismet'); ?></strong>\n\t\t<?php printf( esc_html__( 'Your subscription for %s is cancelled' , 'akismet'), $akismet_user->user_email ); ?>\n\t</div>\n\t<form name=\"akismet_activate\" id=\"akismet_activate\" action=\"https://akismet.com/get/\" method=\"post\" class=\"right\" target=\"_blank\">\n\t\t<input type=\"hidden\" name=\"passback_url\" value=\"<?php echo esc_url( Akismet_Admin::get_page_url() ); ?>\"/>\n\t\t<input type=\"hidden\" name=\"blog\" value=\"<?php echo esc_url( get_bloginfo('url') ); ?>\"/>\n\t\t<input type=\"hidden\" name=\"user_id\" value=\"<?php echo $akismet_user->ID;?>\"/>\n\t\t<input type=\"hidden\" name=\"redirect\" value=\"upgrade\"/>\n\t\t<input type=\"submit\" class=\"button button-primary\" value=\"<?php esc_attr_e( 'Reactivate Akismet' , 'akismet'); ?>\"/>\n\t</form>\n</div>\n<?php elseif ( $akismet_user->status == 'suspended' ) : ?>\n<p><?php esc_html_e('Akismet eliminates spam from your site.', 'akismet'); ?></p>\n<div class=\"activate-highlight centered activate-option\">\n\t<strong class=\"small-heading\"><?php esc_html_e( 'Connected via Jetpack' , 'akismet'); ?></strong>\n\t<h3 class=\"alert-text\"><?php printf( esc_html__( 'Your subscription for %s is suspended' , 'akismet'), $akismet_user->user_email ); ?></h3>\n\t<p><?php esc_html_e('No worries! Get in touch and we&#8217;ll sort this out.', 'akismet'); ?></p>\n\t<a href=\"https://akismet.com/contact\" class=\"button button-primary\"><?php esc_html_e( 'Contact Akismet support' , 'akismet'); ?></a>\n</div>\n<?php else : // ask do they want to use akismet account found using jetpack wpcom connection ?>\n<p style=\"margin-right:10px\"><?php esc_html_e('Akismet eliminates spam from your site. To set up Akismet, select one of the options below.', 'akismet'); ?></p>\n<div class=\"activate-highlight activate-option\">\n\t<div class=\"option-description\">\n\t\t<strong class=\"small-heading\"><?php esc_html_e('Connected via Jetpack', 'akismet'); ?></strong>\n\t\t<?php echo esc_html( $akismet_user->user_email ); ?>\n\t</div>\n\t<form name=\"akismet_use_wpcom_key\" action=\"<?php echo esc_url( Akismet_Admin::get_page_url() ); ?>\" method=\"post\" id=\"akismet-activate\" class=\"right\">\n\t\t<input type=\"hidden\" name=\"key\" value=\"<?php echo esc_attr( $akismet_user->api_key );?>\"/>\n\t\t<input type=\"hidden\" name=\"action\" value=\"enter-key\">\n\t\t<?php wp_nonce_field( Akismet_Admin::NONCE ) ?>\n\t\t<input type=\"submit\" class=\"button button-primary\" value=\"<?php esc_attr_e( 'Use this account' , 'akismet'); ?>\"/>\n\t</form>\n</div>\n<?php endif;?>\n<div class=\"activate-highlight secondary activate-option\">\n\t<div class=\"option-description\">\n\t\t<strong><?php esc_html_e('Sign up for a plan with a different email address', 'akismet'); ?></strong>\n\t\t<p><?php esc_html_e('Use this option to use Akismet independently of your Jetpack connection.', 'akismet'); ?></p>\n\t</div>\n\t<?php Akismet::view( 'get', array( 'text' => __( 'Sign up with a different email address' , 'akismet'), 'classes' => array( 'right', 'button', 'button-secondary' ) ) ); ?>\n</div>\n<div class=\"activate-highlight secondary activate-option\">\n\t<div class=\"option-description\">\n\t\t<strong><?php esc_html_e('Enter an API key', 'akismet'); ?></strong>\n\t\t<p><?php esc_html_e('Already have your key? Enter it here.', 'akismet'); ?></p>\n\t</div>\n\t<form action=\"<?php echo esc_url( Akismet_Admin::get_page_url() ); ?>\" method=\"post\" id=\"akismet-enter-api-key\" class=\"right\">\n\t\t<input id=\"key\" name=\"key\" type=\"text\" size=\"15\" value=\"\" class=\"regular-text code\">\n\t\t<input type=\"hidden\" name=\"action\" value=\"enter-key\">\n\t\t<?php wp_nonce_field( Akismet_Admin::NONCE ) ?>\n\t\t<input type=\"submit\" name=\"submit\" id=\"submit\" class=\"button button-secondary\" value=\"<?php esc_attr_e('Use this key', 'akismet');?>\">\n\t</form>\n</div>\n<?php else :?>\n<p><?php esc_html_e('Akismet eliminates spam from your site. To set up Akismet, select one of the options below.', 'akismet'); ?></p>\n<div class=\"activate-highlight activate-option\">\n\t<div class=\"option-description\">\n\t\t<strong><?php esc_html_e( 'Activate Akismet' , 'akismet');?></strong>\n\t\t<p><?php esc_html_e('Log in or sign up now.', 'akismet'); ?></p>\n\t</div>\n\t<?php Akismet::view( 'get', array( 'text' => __( 'Get your API key' , 'akismet'), 'classes' => array( 'right', 'button', 'button-primary' ) ) ); ?>\n</div>\n<div class=\"activate-highlight secondary activate-option\">\n\t<div class=\"option-description\">\n\t\t<strong><?php esc_html_e('Manually enter an API key', 'akismet'); ?></strong>\n\t\t<p><?php esc_html_e('If you already know your API key.', 'akismet'); ?></p>\n\t</div>\n\t<form action=\"<?php echo esc_url( Akismet_Admin::get_page_url() ); ?>\" method=\"post\" id=\"akismet-enter-api-key\" class=\"right\">\n\t\t<input id=\"key\" name=\"key\" type=\"text\" size=\"15\" value=\"<?php echo esc_attr( Akismet::get_api_key() ); ?>\" class=\"regular-text code\">\n\t\t<input type=\"hidden\" name=\"action\" value=\"enter-key\">\n\t\t<?php wp_nonce_field( Akismet_Admin::NONCE ); ?>\n\t\t<input type=\"submit\" name=\"submit\" id=\"submit\" class=\"button button-secondary\" value=\"<?php esc_attr_e('Use this key', 'akismet');?>\">\n\t</form>\n</div><?php\n\tendif;?>\n</div>"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/views/stats.php",
    "content": "<div class=\"wrap\">\n\t<h2><?php esc_html_e( 'Akismet Stats' , 'akismet');?><?php if ( !isset( $hide_settings_link ) ): ?> <a href=\"<?php echo esc_url( Akismet_Admin::get_page_url() );?>\" class=\"add-new-h2\"><?php esc_html_e( 'Settings' , 'akismet');?></a><?php endif;?></h2> \n\t<iframe src=\"<?php echo esc_url( sprintf( '//akismet.com/web/1.0/user-stats.php?blog=%s&api_key=%s&locale=%s', urlencode( get_bloginfo('url') ), Akismet::get_api_key(), get_locale() ) ); ?>\" width=\"100%\" height=\"2500px\" frameborder=\"0\" id=\"akismet-stats-frame\"></iframe>\n</div>"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/views/strict.php",
    "content": "<fieldset>\n\t<legend class=\"screen-reader-text\">\n\t\t<span><?php esc_html_e( 'Akismet anti-spam strictness', 'akismet' ); ?></span>\n\t</legend>\n\t<p>\n\t\t<label for=\"akismet_strictness_1\">\n\t\t\t<input type=\"radio\" name=\"akismet_strictness\" id=\"akismet_strictness_1\" value=\"1\" <?php checked( '1', get_option( 'akismet_strictness' ) ); ?> />\n\t\t\t<?php esc_html_e( 'Strict: silently discard the worst and most pervasive spam.', 'akismet' ); ?>\n\t\t</label>\n\t</p>\n\t<p>\n\t\t<label for=\"akismet_strictness_0\">\n\t\t\t<input type=\"radio\" name=\"akismet_strictness\" id=\"akismet_strictness_0\" value=\"0\" <?php checked( '0', get_option( 'akismet_strictness' ) ); ?> />\n\t\t\t<?php esc_html_e( 'Safe: always put spam in the Spam folder for review.', 'akismet' ); ?>\n\t\t</label>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/akismet/wrapper.php",
    "content": "<?php\n\nglobal $wpcom_api_key, $akismet_api_host, $akismet_api_port;\n\n$wpcom_api_key    = defined( 'WPCOM_API_KEY' ) ? constant( 'WPCOM_API_KEY' ) : '';\n$akismet_api_host = Akismet::get_api_key() . '.rest.akismet.com';\n$akismet_api_port = 80;\n\nfunction akismet_test_mode() {\n\treturn Akismet::is_test_mode();\n}\n\nfunction akismet_http_post( $request, $host, $path, $port = 80, $ip = null ) {\n\t$path = str_replace( '/1.1/', '', $path );\n\n\treturn Akismet::http_post( $request, $path, $ip ); \n}\n\nfunction akismet_microtime() {\n\treturn Akismet::_get_microtime();\n}\n\nfunction akismet_delete_old() {\n\treturn Akismet::delete_old_comments();\n}\n\nfunction akismet_delete_old_metadata() { \n\treturn Akismet::delete_old_comments_meta();\n}\n\nfunction akismet_check_db_comment( $id, $recheck_reason = 'recheck_queue' ) {\n   \treturn Akismet::check_db_comment( $id, $recheck_reason );\n}\n\nfunction akismet_rightnow() {\n\tif ( !class_exists( 'Akismet_Admin' ) )\n\t\treturn false;\n   \n   \treturn Akismet_Admin::rightnow_stats();\n}\n\nfunction akismet_admin_init() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_version_warning() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_load_js_and_css() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_nonce_field( $action = -1 ) {\n\treturn wp_nonce_field( $action );\n}\nfunction akismet_plugin_action_links( $links, $file ) {\n\treturn Akismet_Admin::plugin_action_links( $links, $file );\n}\nfunction akismet_conf() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_stats_display() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_stats() {\n\treturn Akismet_Admin::dashboard_stats();\n}\nfunction akismet_admin_warnings() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_comment_row_action( $a, $comment ) {\n\treturn Akismet_Admin::comment_row_actions( $a, $comment );\n}\nfunction akismet_comment_status_meta_box( $comment ) {\n\treturn Akismet_Admin::comment_status_meta_box( $comment );\n}\nfunction akismet_comments_columns( $columns ) {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n\n\treturn $columns;\n}\nfunction akismet_comment_column_row( $column, $comment_id ) {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_text_add_link_callback( $m ) {\n\treturn Akismet_Admin::text_add_link_callback( $m );\n}\nfunction akismet_text_add_link_class( $comment_text ) {\n\treturn Akismet_Admin::text_add_link_class( $comment_text );\n}\nfunction akismet_check_for_spam_button( $comment_status ) {\n\treturn Akismet_Admin::check_for_spam_button( $comment_status );\n}\nfunction akismet_submit_nonspam_comment( $comment_id ) {\n\treturn Akismet::submit_nonspam_comment( $comment_id );\n}\nfunction akismet_submit_spam_comment( $comment_id ) {\n\treturn Akismet::submit_spam_comment( $comment_id );\n}\nfunction akismet_transition_comment_status( $new_status, $old_status, $comment ) {\n\treturn Akismet::transition_comment_status( $new_status, $old_status, $comment );\n}\nfunction akismet_spam_count( $type = false ) {\n\treturn Akismet_Admin::get_spam_count( $type );\n}\nfunction akismet_recheck_queue() {\n\treturn Akismet_Admin::recheck_queue();\n}\nfunction akismet_remove_comment_author_url() {\n\treturn Akismet_Admin::remove_comment_author_url();\n}\nfunction akismet_add_comment_author_url() {\n\treturn Akismet_Admin::add_comment_author_url();\n}\nfunction akismet_check_server_connectivity() {\n\treturn Akismet_Admin::check_server_connectivity();\n}\nfunction akismet_get_server_connectivity( $cache_timeout = 86400 ) {\n\treturn Akismet_Admin::get_server_connectivity( $cache_timeout );\n}\nfunction akismet_server_connectivity_ok() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n\n\treturn true;\n}\nfunction akismet_admin_menu() {\n\treturn Akismet_Admin::admin_menu();\n}\nfunction akismet_load_menu() {\n\treturn Akismet_Admin::load_menu();\n}\nfunction akismet_init() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_get_key() {\n\treturn Akismet::get_api_key();\n}\nfunction akismet_check_key_status( $key, $ip = null ) {\n\treturn Akismet::check_key_status( $key, $ip );\n}\nfunction akismet_update_alert( $response ) {\n\treturn Akismet::update_alert( $response );\n}\nfunction akismet_verify_key( $key, $ip = null ) {\n\treturn Akismet::verify_key( $key, $ip );\n}\nfunction akismet_get_user_roles( $user_id ) {\n\treturn Akismet::get_user_roles( $user_id );\n}\nfunction akismet_result_spam( $approved ) {\n\treturn Akismet::comment_is_spam( $approved );\n}\nfunction akismet_result_hold( $approved ) {\n\treturn Akismet::comment_needs_moderation( $approved );\n}\nfunction akismet_get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url ) {\n\treturn Akismet::get_user_comments_approved( $user_id, $comment_author_email, $comment_author, $comment_author_url );\n}\nfunction akismet_update_comment_history( $comment_id, $message, $event = null ) {\n\treturn Akismet::update_comment_history( $comment_id, $message, $event );\n}\nfunction akismet_get_comment_history( $comment_id ) {\n\treturn Akismet::get_comment_history( $comment_id );\n}\nfunction akismet_cmp_time( $a, $b ) {\n\treturn Akismet::_cmp_time( $a, $b );\n}\nfunction akismet_auto_check_update_meta( $id, $comment ) {\n\treturn Akismet::auto_check_update_meta( $id, $comment );\n}\nfunction akismet_auto_check_comment( $commentdata ) {\n\treturn Akismet::auto_check_comment( $commentdata );\n}\nfunction akismet_get_ip_address() {\n\treturn Akismet::get_ip_address();\n}\nfunction akismet_cron_recheck() {\n\treturn Akismet::cron_recheck();\n}\nfunction akismet_add_comment_nonce() {\n\treturn Akismet::add_comment_nonce( $post_id );\n}\nfunction akismet_fix_scheduled_recheck() {\n\treturn Akismet::fix_scheduled_recheck();\n}\nfunction akismet_spam_comments() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n\n\treturn array();\n}\nfunction akismet_spam_totals() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n\n\treturn array();\n}\nfunction akismet_manage_page() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_caught() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction redirect_old_akismet_urls() {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n}\nfunction akismet_kill_proxy_check( $option ) {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n\n\treturn 0;\n}\nfunction akismet_pingback_forwarded_for( $r, $url ) {\n\treturn Akismet::pingback_forwarded_for( $r, $url );\n}\nfunction akismet_pre_check_pingback( $method ) {\n\treturn Akismet::pre_check_pingback( $method );\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/hello.php",
    "content": "<?php\n/**\n * @package Hello_Dolly\n * @version 1.6\n */\n/*\nPlugin Name: Hello Dolly\nPlugin URI: http://wordpress.org/plugins/hello-dolly/\nDescription: This is not just a plugin, it symbolizes the hope and enthusiasm of an entire generation summed up in two words sung most famously by Louis Armstrong: Hello, Dolly. When activated you will randomly see a lyric from <cite>Hello, Dolly</cite> in the upper right of your admin screen on every page.\nAuthor: Matt Mullenweg\nVersion: 1.6\nAuthor URI: http://ma.tt/\n*/\n\nfunction hello_dolly_get_lyric() {\n\t/** These are the lyrics to Hello Dolly */\n\t$lyrics = \"Hello, Dolly\nWell, hello, Dolly\nIt's so nice to have you back where you belong\nYou're lookin' swell, Dolly\nI can tell, Dolly\nYou're still glowin', you're still crowin'\nYou're still goin' strong\nWe feel the room swayin'\nWhile the band's playin'\nOne of your old favourite songs from way back when\nSo, take her wrap, fellas\nFind her an empty lap, fellas\nDolly'll never go away again\nHello, Dolly\nWell, hello, Dolly\nIt's so nice to have you back where you belong\nYou're lookin' swell, Dolly\nI can tell, Dolly\nYou're still glowin', you're still crowin'\nYou're still goin' strong\nWe feel the room swayin'\nWhile the band's playin'\nOne of your old favourite songs from way back when\nGolly, gee, fellas\nFind her a vacant knee, fellas\nDolly'll never go away\nDolly'll never go away\nDolly'll never go away again\";\n\n\t// Here we split it into lines\n\t$lyrics = explode( \"\\n\", $lyrics );\n\n\t// And then randomly choose a line\n\treturn wptexturize( $lyrics[ mt_rand( 0, count( $lyrics ) - 1 ) ] );\n}\n\n// This just echoes the chosen line, we'll position it later\nfunction hello_dolly() {\n\t$chosen = hello_dolly_get_lyric();\n\techo \"<p id='dolly'>$chosen</p>\";\n}\n\n// Now we set that function up to execute when the admin_notices action is called\nadd_action( 'admin_notices', 'hello_dolly' );\n\n// We need some CSS to position the paragraph\nfunction dolly_css() {\n\t// This makes sure that the positioning is also good for right-to-left languages\n\t$x = is_rtl() ? 'left' : 'right';\n\n\techo \"\n\t<style type='text/css'>\n\t#dolly {\n\t\tfloat: $x;\n\t\tpadding-$x: 15px;\n\t\tpadding-top: 5px;\t\t\n\t\tmargin: 0;\n\t\tfont-size: 11px;\n\t}\n\t</style>\n\t\";\n}\n\nadd_action( 'admin_head', 'dolly_css' );\n\n?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/plugins/index.php",
    "content": "<?php\n// Silence is golden.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/index.php",
    "content": "<?php\n// Silence is golden.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/404.php",
    "content": "<?php\n/**\n * The template for displaying 404 pages (not found)\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t\t<section class=\"error-404 not-found\">\n\t\t\t\t<header class=\"page-header\">\n\t\t\t\t\t<h1 class=\"page-title\"><?php _e( 'Oops! That page can&rsquo;t be found.', 'twentyfifteen' ); ?></h1>\n\t\t\t\t</header><!-- .page-header -->\n\n\t\t\t\t<div class=\"page-content\">\n\t\t\t\t\t<p><?php _e( 'It looks like nothing was found at this location. Maybe try a search?', 'twentyfifteen' ); ?></p>\n\n\t\t\t\t\t<?php get_search_form(); ?>\n\t\t\t\t</div><!-- .page-content -->\n\t\t\t</section><!-- .error-404 -->\n\n\t\t</main><!-- .site-main -->\n\t</div><!-- .content-area -->\n\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/archive.php",
    "content": "<?php\n/**\n * The template for displaying archive pages\n *\n * Used to display archive-type pages if nothing more specific matches a query.\n * For example, puts together date-based pages if no date.php file exists.\n *\n * If you'd like to further customize these archive views, you may create a\n * new template file for each one. For example, tag.php (Tag archives),\n * category.php (Category archives), author.php (Author archives), etc.\n *\n * @link https://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"page-header\">\n\t\t\t\t<?php\n\t\t\t\t\tthe_archive_title( '<h1 class=\"page-title\">', '</h1>' );\n\t\t\t\t\tthe_archive_description( '<div class=\"taxonomy-description\">', '</div>' );\n\t\t\t\t?>\n\t\t\t</header><!-- .page-header -->\n\n\t\t\t<?php\n\t\t\t// Start the Loop.\n\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t/*\n\t\t\t\t * Include the Post-Format-specific template for the content.\n\t\t\t\t * If you want to override this in a child theme, then include a file\n\t\t\t\t * called content-___.php (where ___ is the Post Format name) and that will be used instead.\n\t\t\t\t */\n\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t// End the loop.\n\t\t\tendwhile;\n\n\t\t\t// Previous/next page navigation.\n\t\t\tthe_posts_pagination( array(\n\t\t\t\t'prev_text'          => __( 'Previous page', 'twentyfifteen' ),\n\t\t\t\t'next_text'          => __( 'Next page', 'twentyfifteen' ),\n\t\t\t\t'before_page_number' => '<span class=\"meta-nav screen-reader-text\">' . __( 'Page', 'twentyfifteen' ) . ' </span>',\n\t\t\t) );\n\n\t\t// If no content, include the \"No posts found\" template.\n\t\telse :\n\t\t\tget_template_part( 'content', 'none' );\n\n\t\tendif;\n\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</section><!-- .content-area -->\n\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/author-bio.php",
    "content": "<?php\n/**\n * The template for displaying Author bios\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n?>\n\n<div class=\"author-info\">\n\t<h2 class=\"author-heading\"><?php _e( 'Published by', 'twentyfifteen' ); ?></h2>\n\t<div class=\"author-avatar\">\n\t\t<?php\n\t\t/**\n\t\t * Filter the author bio avatar size.\n\t\t *\n\t\t * @since Twenty Fifteen 1.0\n\t\t *\n\t\t * @param int $size The avatar height and width size in pixels.\n\t\t */\n\t\t$author_bio_avatar_size = apply_filters( 'twentyfifteen_author_bio_avatar_size', 56 );\n\n\t\techo get_avatar( get_the_author_meta( 'user_email' ), $author_bio_avatar_size );\n\t\t?>\n\t</div><!-- .author-avatar -->\n\n\t<div class=\"author-description\">\n\t\t<h3 class=\"author-title\"><?php echo get_the_author(); ?></h3>\n\n\t\t<p class=\"author-bio\">\n\t\t\t<?php the_author_meta( 'description' ); ?>\n\t\t\t<a class=\"author-link\" href=\"<?php echo esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ); ?>\" rel=\"author\">\n\t\t\t\t<?php printf( __( 'View all posts by %s', 'twentyfifteen' ), get_the_author() ); ?>\n\t\t\t</a>\n\t\t</p><!-- .author-bio -->\n\n\t</div><!-- .author-description -->\n</div><!-- .author-info -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/comments.php",
    "content": "<?php\n/**\n * The template for displaying comments\n *\n * The area of the page that contains both current comments\n * and the comment form.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\n/*\n * If the current post is protected by a password and\n * the visitor has not yet entered the password we will\n * return early without loading the comments.\n */\nif ( post_password_required() ) {\n\treturn;\n}\n?>\n\n<div id=\"comments\" class=\"comments-area\">\n\n\t<?php if ( have_comments() ) : ?>\n\t\t<h2 class=\"comments-title\">\n\t\t\t<?php\n\t\t\t\tprintf( _nx( 'One thought on &ldquo;%2$s&rdquo;', '%1$s thoughts on &ldquo;%2$s&rdquo;', get_comments_number(), 'comments title', 'twentyfifteen' ),\n\t\t\t\t\tnumber_format_i18n( get_comments_number() ), get_the_title() );\n\t\t\t?>\n\t\t</h2>\n\n\t\t<?php twentyfifteen_comment_nav(); ?>\n\n\t\t<ol class=\"comment-list\">\n\t\t\t<?php\n\t\t\t\twp_list_comments( array(\n\t\t\t\t\t'style'       => 'ol',\n\t\t\t\t\t'short_ping'  => true,\n\t\t\t\t\t'avatar_size' => 56,\n\t\t\t\t) );\n\t\t\t?>\n\t\t</ol><!-- .comment-list -->\n\n\t\t<?php twentyfifteen_comment_nav(); ?>\n\n\t<?php endif; // have_comments() ?>\n\n\t<?php\n\t\t// If comments are closed and there are comments, let's leave a little note, shall we?\n\t\tif ( ! comments_open() && get_comments_number() && post_type_supports( get_post_type(), 'comments' ) ) :\n\t?>\n\t\t<p class=\"no-comments\"><?php _e( 'Comments are closed.', 'twentyfifteen' ); ?></p>\n\t<?php endif; ?>\n\n\t<?php comment_form(); ?>\n\n</div><!-- .comments-area -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/content-link.php",
    "content": "<?php\n/**\n * The template for displaying link post formats\n *\n * Used for both single and index/archive/search.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfifteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( sprintf( '<h1 class=\"entry-title\"><a href=\"%s\">', esc_url( twentyfifteen_get_link_url() ) ), '</a></h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( sprintf( '<h2 class=\"entry-title\"><a href=\"%s\">', esc_url( twentyfifteen_get_link_url() ) ), '</a></h2>' );\n\t\t\tendif;\n\t\t?>\n\t</header>\n\t<!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s', 'twentyfifteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfifteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t\t'pagelink'    => '<span class=\"screen-reader-text\">' . __( 'Page', 'twentyfifteen' ) . ' </span>%',\n\t\t\t\t'separator'   => '<span class=\"screen-reader-text\">, </span>',\n\t\t\t) );\n\t\t?>\n\t</div>\n\t<!-- .entry-content -->\n\n\t<?php\n\t\t// Author bio.\n\t\tif ( is_single() && get_the_author_meta( 'description' ) ) :\n\t\t\tget_template_part( 'author-bio' );\n\t\tendif;\n\t?>\n\n\t<footer class=\"entry-footer\">\n\t\t<?php twentyfifteen_entry_meta(); ?>\n\t\t<?php edit_post_link( __( 'Edit', 'twentyfifteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t</footer>\n\t<!-- .entry-footer -->\n\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/content-none.php",
    "content": "<?php\n/**\n * The template part for displaying a message that posts cannot be found\n *\n * Learn more: {@link https://codex.wordpress.org/Template_Hierarchy}\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n?>\n\n<section class=\"no-results not-found\">\n\t<header class=\"page-header\">\n\t\t<h1 class=\"page-title\"><?php _e( 'Nothing Found', 'twentyfifteen' ); ?></h1>\n\t</header><!-- .page-header -->\n\n\t<div class=\"page-content\">\n\n\t\t<?php if ( is_home() && current_user_can( 'publish_posts' ) ) : ?>\n\n\t\t\t<p><?php printf( __( 'Ready to publish your first post? <a href=\"%1$s\">Get started here</a>.', 'twentyfifteen' ), esc_url( admin_url( 'post-new.php' ) ) ); ?></p>\n\n\t\t<?php elseif ( is_search() ) : ?>\n\n\t\t\t<p><?php _e( 'Sorry, but nothing matched your search terms. Please try again with some different keywords.', 'twentyfifteen' ); ?></p>\n\t\t\t<?php get_search_form(); ?>\n\n\t\t<?php else : ?>\n\n\t\t\t<p><?php _e( 'It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps searching can help.', 'twentyfifteen' ); ?></p>\n\t\t\t<?php get_search_form(); ?>\n\n\t\t<?php endif; ?>\n\n\t</div><!-- .page-content -->\n</section><!-- .no-results -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/content-page.php",
    "content": "<?php\n/**\n * The template used for displaying page content\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php\n\t\t// Post thumbnail.\n\t\ttwentyfifteen_post_thumbnail();\n\t?>\n\n\t<header class=\"entry-header\">\n\t\t<?php the_title( '<h1 class=\"entry-title\">', '</h1>' ); ?>\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php the_content(); ?>\n\t\t<?php\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfifteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t\t'pagelink'    => '<span class=\"screen-reader-text\">' . __( 'Page', 'twentyfifteen' ) . ' </span>%',\n\t\t\t\t'separator'   => '<span class=\"screen-reader-text\">, </span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php edit_post_link( __( 'Edit', 'twentyfifteen' ), '<footer class=\"entry-footer\"><span class=\"edit-link\">', '</span></footer><!-- .entry-footer -->' ); ?>\n\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/content-search.php",
    "content": "<?php\n/**\n * The template part for displaying results in search pages\n *\n * Learn more: {@link https://codex.wordpress.org/Template_Hierarchy}\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfifteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php the_title( sprintf( '<h2 class=\"entry-title\"><a href=\"%s\" rel=\"bookmark\">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-summary\">\n\t\t<?php the_excerpt(); ?>\n\t</div><!-- .entry-summary -->\n\n\t<?php if ( 'post' == get_post_type() ) : ?>\n\n\t\t<footer class=\"entry-footer\">\n\t\t\t<?php twentyfifteen_entry_meta(); ?>\n\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfifteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t</footer><!-- .entry-footer -->\n\n\t<?php else : ?>\n\n\t\t<?php edit_post_link( __( 'Edit', 'twentyfifteen' ), '<footer class=\"entry-footer\"><span class=\"edit-link\">', '</span></footer><!-- .entry-footer -->' ); ?>\n\n\t<?php endif; ?>\n\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/content.php",
    "content": "<?php\n/**\n * The default template for displaying content\n *\n * Used for both single and index/archive/search.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php\n\t\t// Post thumbnail.\n\t\ttwentyfifteen_post_thumbnail();\n\t?>\n\n\t<header class=\"entry-header\">\n\t\t<?php\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( sprintf( '<h2 class=\"entry-title\"><a href=\"%s\" rel=\"bookmark\">', esc_url( get_permalink() ) ), '</a></h2>' );\n\t\t\tendif;\n\t\t?>\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s', 'twentyfifteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfifteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t\t'pagelink'    => '<span class=\"screen-reader-text\">' . __( 'Page', 'twentyfifteen' ) . ' </span>%',\n\t\t\t\t'separator'   => '<span class=\"screen-reader-text\">, </span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php\n\t\t// Author bio.\n\t\tif ( is_single() && get_the_author_meta( 'description' ) ) :\n\t\t\tget_template_part( 'author-bio' );\n\t\tendif;\n\t?>\n\n\t<footer class=\"entry-footer\">\n\t\t<?php twentyfifteen_entry_meta(); ?>\n\t\t<?php edit_post_link( __( 'Edit', 'twentyfifteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t</footer><!-- .entry-footer -->\n\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/css/editor-style.css",
    "content": "/*\nTheme Name: Twenty Fifteen\nDescription: Used to style the TinyMCE editor.\n*/\n\n\n/**\n * Table of Contents:\n *\n * 1.0 - Body\n * 2.0 - Typography\n * 3.0 - Elements\n * 4.0 - Alignment\n * 5.0 - Caption\n * 6.0 - Galleries\n * 7.0 - Audio / Video\n * 8.0 - RTL\n */\n\n\n/**\n * 1.0 Body\n */\n\nbody {\n\tcolor: #333;\n\tfont-family: \"Noto Serif\", serif;\n\tfont-weight: 400;\n\tfont-size: 17px;\n\tline-height: 1.6471;\n\tmargin: 20px 40px;\n\tmax-width: 660px;\n\tvertical-align: baseline;\n}\n\n\n/**\n * 2.0 Typography\n */\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tclear: both;\n\tfont-weight: 700;\n\tmargin: 56px 0 28px;\n}\n\nh1 {\n\tfont-size: 35px;\n\tline-height: 1.2308;\n}\n\nh2 {\n\tfont-size: 29px;\n\tline-height: 1.2069;\n}\n\nh3 {\n\tfont-size: 24px;\n\tline-height: 1.1667;\n}\n\nh4 {\n\tfont-size: 20px;\n\tline-height: 1.4;\n}\n\nh5,\nh6 {\n\tfont-size: 17px;\n\tletter-spacing: 0.1em;\n\tline-height: 1.2353;\n\ttext-transform: uppercase;\n}\n\nh1:first-child,\nh2:first-child,\nh3:first-child,\nh4:first-child,\nh5:first-child,\nh6:first-child {\n\tmargin-top: 0;\n}\n\np {\n\tmargin: 0 0 28px;\n}\n\nb,\nstrong {\n\tfont-weight: 700;\n}\n\ndfn,\ncite,\nem,\ni {\n\tfont-style: italic;\n}\n\nblockquote {\n\tborder-left: 4px solid #707070;\n\tcolor: #707070;\n\tfont-size: 20px;\n\tfont-style: italic;\n\tline-height: 1.8182;\n\tmargin: 0 0 35px -21px;\n\tpadding-left: 17px;\n}\n\nblockquote > blockquote {\n\tmargin-left: 0;\n}\n\nblockquote p {\n\tmargin-bottom: 35px;\n}\n\nblockquote > p:last-child {\n\tmargin-bottom: 0;\n}\n\nblockquote cite,\nblockquote small {\n\tcolor: #333;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 17px;\n\tline-height: 1.6471;\n}\n\nblockquote em,\nblockquote i,\nblockquote cite {\n\tfont-style: normal;\n}\n\nblockquote strong,\nblockquote b {\n\tfont-weight: 400;\n}\n\naddress {\n\tfont-style: italic;\n\tmargin: 0 0 28px;\n}\n\ncode,\nkbd,\ntt,\nvar,\nsamp,\npre {\n\tfont-family: Inconsolata, monospace;\n}\n\npre {\n\tbackground-color: #fcfcfc;\n\tborder: 1px solid #eaeaea;\n\tfont-size: 17px;\n\tline-height: 1.2353;\n\tmargin-bottom: 28px;\n\tmax-width: 100%;\n\toverflow: auto;\n\tpadding: 14px;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\nabbr[title] {\n\tborder-bottom: 1px dotted #eaeaea;\n\tcursor: help;\n}\n\nmark,\nins {\n\tbackground-color: #fff9c0;\n\ttext-decoration: none;\n}\n\nsup,\nsub {\n\tfont-size: 75%;\n\theight: 0;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsup {\n\tbottom: 1ex;\n}\n\nsub {\n\ttop: .5ex;\n}\n\nsmall {\n\tfont-size: 75%;\n}\n\nbig {\n\tfont-size: 125%;\n}\n\n\n/**\n * 3.0 Elements\n */\n\nhr {\n\tbackground-color: #eaeaea;\n\tborder: 0;\n\theight: 1px;\n\tmargin-bottom: 28px;\n}\n\nul,\nol {\n\tmargin: 0 0 28px 0;\n\tpadding: 0;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin: 0 0 0 23px;\n}\n\ndl {\n\tmargin: 0 0 28px;\n}\n\ndt {\n\tfont-weight: bold;\n}\n\ndd {\n\tmargin: 0 0 28px;\n}\n\ntable,\nth,\ntd,\n.mce-item-table,\n.mce-item-table th,\n.mce-item-table td {\n\tborder: 1px solid #eaeaea;\n}\n\ntable a {\n\tcolor: #333;\n}\n\ntable,\n.mce-item-table {\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n\tborder-width: 1px 0 0 1px;\n\tmargin: 0 0 28px;\n\twidth: 100%;\n}\n\ntable th,\n.mce-item-table th,\ntable caption {\n\tborder-width: 0 1px 1px 0;\n\tfont-family: \"Noto Serif\", serif;\n\tfont-size: 17px;\n\tfont-weight: 700;\n\tpadding: 7px;\n\ttext-align: left;\n\tvertical-align: baseline;\n}\n\ntable td,\n.mce-item-table td {\n\tborder-width: 0 1px 1px 0;\n\tfont-family: \"Noto Serif\", serif;\n\tfont-size: 17px;\n\tpadding: 7px;\n\tvertical-align: baseline;\n}\n\nimg {\n\tborder: 0;\n\theight: auto;\n\tmax-width: 100%;\n\tvertical-align: middle;\n}\n\nfigure {\n\tmargin: 0;\n}\n\ndel {\n\topacity: 0.8;\n}\n\na {\n\tborder-bottom: 1px solid #333;\n\tcolor: #333;\n\ttext-decoration: none;\n}\n\n\n/**\n * 4.0 Alignment\n */\n\n.alignleft {\n\tfloat: left;\n\tmargin: 7px 28px 28px 0;\n}\n\n.alignright {\n\tfloat: right;\n\tmargin: 7px 0 28px 28px;\n}\n\n.aligncenter {\n\tclear: both;\n\tdisplay: block;\n\tmargin: 7px auto;\n}\n\n\n/**\n * 5.0 Caption\n */\n\n.wp-caption {\n\tbackground: transparent;\n\tborder: none;\n\tcolor: #707070;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tmargin: 0 0 28px 0;\n\tmax-width: 100%;\n\tpadding: 0;\n\ttext-align: inherit;\n}\n\n.wp-caption.alignleft {\n\tmargin: 7px 28px 21px 0;\n}\n\n.wp-caption.alignright {\n\tmargin: 7px 0 21px 28px;\n}\n\n.wp-caption.aligncenter {\n\tmargin: 7px auto;\n}\n\n.wp-caption .wp-caption-text,\n.wp-caption-dd {\n\tfont-size: 14px;\n\tline-height: 1.5;\n\tpadding: 7px 0;\n}\n\n\n/**\n * 6.0 Galleries\n */\n\n.gallery-item {\n\tdisplay: inline-block;\n\tpadding: 1.79104477%;\n\ttext-align: center;\n\tvertical-align: top;\n\twidth: 100%;\n}\n\n.gallery-columns-2 .gallery-item {\n\tmax-width: 50%;\n}\n\n.gallery-columns-3 .gallery-item {\n\tmax-width: 33.33%;\n}\n\n.gallery-columns-4 .gallery-item {\n\tmax-width: 25%;\n}\n\n.gallery-columns-5 .gallery-item {\n\tmax-width: 20%;\n}\n\n.gallery-columns-6 .gallery-item {\n\tmax-width: 16.66%;\n}\n\n.gallery-columns-7 .gallery-item {\n\tmax-width: 14.28%;\n}\n\n.gallery-columns-8 .gallery-item {\n\tmax-width: 12.5%;\n}\n\n.gallery-columns-9 .gallery-item {\n\tmax-width: 11.11%;\n}\n\n.gallery .gallery-caption {\n\tcolor: #707070;\n\tdisplay: block;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 14px;\n\tline-height: 1.5;\n\tpadding: 7px 0;\n}\n\n.gallery-columns-6 .gallery-caption,\n.gallery-columns-7 .gallery-caption,\n.gallery-columns-8 .gallery-caption,\n.gallery-columns-9 .gallery-caption {\n\tdisplay: none;\n}\n\n\n/**\n * 7.0 Audio / Video\n */\n\n.mce-content-body .wpview-wrap {\n\tmargin-bottom: 32px;\n}\n\n.mce-content-body .wp-audio-playlist {\n\tmargin: 0;\n}\n\n\n/**\n * 8.0 RTL\n */\n\nbody.rtl {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n.rtl blockquote {\n\tborder-left: none;\n\tborder-right: 4px solid #707070;\n\tmargin: 0 -21px 35px 0;\n\tpadding-left: 0;\n\tpadding-right: 17px;\n}\n\n.rtl blockquote > blockquote {\n\tmargin-left: auto;\n\tmargin-right: 0;\n}\n\n.rtl li > ul,\n.rtl li > ol {\n\tmargin: 0 23px 0 0;\n}\n\n.rtl table th,\n.rtl table caption {\n\ttext-align: right;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/css/ie.css",
    "content": "/*\nTheme Name: Twenty Fifteen\nDescription: Global Styles for older IE versions (previous to IE9).\n*/\n\nbody,\nbutton,\ninput,\nselect,\ntextarea {\n\tfont-size: 19px;\n\tline-height: 1.6842;\n}\n\nbutton,\ninput {\n\tline-height: normal;\n}\n\np,\naddress,\npre,\nhr,\nul,\nol,\ndl,\ndd,\ntable {\n\tmargin-bottom: 1.6842em;\n}\n\nul,\nol {\n\tmargin-left: 0;\n}\n\nli > ul,\nli > ol,\nblockquote > ul,\nblockquote > ol {\n\tmargin-left: 1.3333em;\n}\n\nblockquote {\n\tborder-color: inherit;\n\tborder-style: solid;\n\tborder-width: 0 0 0 4px;\n\tfont-size: 22px;\n\tline-height: 1.8182;\n\tmargin-bottom: 1.8182em;\n\tmargin-left: -1.0909em;\n\tpadding-left: 0.9091em;\n}\n\nblockquote > blockquote {\n\tmargin-left: 0;\n}\n\nblockquote p {\n\tmargin-bottom: 1.8182em;\n}\n\nblockquote cite,\nblockquote small {\n\tfont-size: 19px;\n\tline-height: 1.6842;\n}\n\npre {\n\tline-height: 1.2632;\n}\n\n.entry-content img,\n.entry-summary img,\n.page-content img,\n.comment-content img,\n.widget img {\n\tmax-width: 660px;\n}\n\nimg.size-full,\nimg.size-large,\nimg.header-image,\nimg.wp-post-image,\nimg[class*=\"align\"],\nimg[class*=\"wp-image-\"],\nimg[class*=\"attachment-\"] {\n\theight: auto;\n\twidth: auto; /* Prevent stretching of full-size and large-size images with height and width attributes in IE8 */\n}\n\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\n.post-password-form input[type=\"submit\"],\n.widecolumn #submit,\n.widecolumn .mu_register input[type=\"submit\"] {\n\tfont-size: 16px;\n\tpadding: 0.8125em 1.625em;\n}\n\ninput[type=\"text\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ninput[type=\"search\"],\ntextarea {\n\tpadding: 0.5278em;\n}\n\n.main-navigation {\n\tfont-size: 16px;\n\tline-height: 1.5;\n\tmargin: 9.0909%;\n}\n\n.main-navigation ul ul {\n\tborder-bottom: 0;\n\tborder-top: 0;\n\tmargin-left: 1em;\n}\n\n.main-navigation a {\n\tpadding: 0.75em 0;\n}\n\n.main-navigation .menu-item-has-children > a {\n\tpadding-right: 48px;\n}\n\n.main-navigation .menu-item-description {\n\tfont-size: 13px;\n\tline-height: 1.8462;\n\tmargin-top: 0;\n}\n\n.social-navigation {\n\tmargin: 9.0909%;\n\tmax-width: 660px;\n\tpadding-top: 0;\n}\n\n.social-navigation ul {\n\tmargin-bottom: -1.2632em;\n}\n\n.social-navigation a {\n\twidth: 2.5263em;\n\theight: 2.5263em;\n}\n\n.secondary-toggle {\n\tmargin-top: -32px;\n\tright: 7.6897%;\n\twidth: 64px;\n\theight: 64px;\n}\n\n.secondary-toggle:before {\n\tline-height: 64px;\n}\n\n.post-password-form label,\n.post-navigation .meta-nav,\n.comment-navigation,\n.image-navigation,\n.author-heading,\n.author-bio,\n.entry-footer,\n.page-links a,\n.page-links span,\n.comment-metadata,\n.pingback .edit-link,\n.comment-list .reply,\n.comment-notes,\n.comment-awaiting-moderation,\n.logged-in-as,\n.comment-form label,\n.form-allowed-tags,\n.site-info,\n.wp-caption-text,\n.gallery-caption,\n.entry-caption,\n.widecolumn label,\n.widecolumn .mu_register label {\n\tfont-size: 16px;\n}\n\n.post-navigation .post-title {\n\tfont-size: 24px;\n\tline-height: 1.1667;\n}\n\n.pagination .nav-links {\n\tmin-height: 3.3684em;\n}\n\n.pagination .page-numbers {\n\tline-height: 3.3684em;\n\tpadding: 0 0.8421em;\n}\n\n.pagination .prev,\n.pagination .next {\n\tpadding: 0;\n\twidth: 64px;\n\theight: 64px;\n}\n\n.pagination .prev:before,\n.pagination .next:before {\n\tline-height: 64px;\n\twidth: 64px;\n\theight: 64px;\n}\n\n.image-navigation a {\n\tdisplay: block;\n\tmargin-bottom: 2em;\n}\n\n.image-navigation .nav-previous,\n.comment-navigation .nav-previous {\n\tfloat: left;\n\twidth: 50%;\n}\n.image-navigation .nav-next,\n.comment-navigation .nav-next {\n\tfloat: right;\n\ttext-align: right;\n\twidth: 50%;\n}\n\n.image-navigation .nav-previous a:before,\n.image-navigation .nav-next a:after,\n.comment-navigation .nav-previous a:before,\n.comment-navigation .nav-next a:after {\n\tfont-size: 24px;\n\ttop: -1px;\n}\n\nblockquote.alignleft,\n.wp-caption.alignleft,\nimg.alignleft {\n\tmargin: 0.4211em 1.6842em 1.6842em 0;\n}\n\nblockquote.alignright,\n.wp-caption.alignright,\nimg.alignright {\n\tmargin: 0.4211em 0 1.6842em 1.6842em;\n}\n\nblockquote.aligncenter,\n.wp-caption.aligncenter,\nimg.aligncenter {\n\tmargin-top: 0.4211em;\n\tmargin-bottom: 1.6842em;\n}\n\n.site-header {\n\tborder-top: 1px solid transparent;\n\tborder-bottom: 1px solid transparent;\n\tpadding: 0;\n}\n\n.secondary {\n\tbackground-color: #fff;\n\tmargin: 0 auto;\n\tmax-width: 807px;\n\tpadding: 0;\n}\n\n.site-main {\n\tpadding: 7.6923% 0;\n}\n\n.site-content {\n\tmargin: 0 auto;\n\tmax-width: 954px;\n}\n\n.site-branding {\n\tbackground-color: inherit;\n\tmargin: 0 auto;\n\tmax-width: 954px;\n\tpadding: 0;\n}\n\n.site-title {\n\tfont-size: 32px;\n\tline-height: 1.25;\n\tmargin: 7.6897% 7.6897% 0;\n}\n\n.site-description {\n\tbackground-color: inherit;\n\tdisplay: block;\n\tfilter: alpha(opacity=70);\n\tfont-size: 16px;\n\tmargin: 0.5em 7.6897% 7.6897%;\n}\n\n.sidebar {\n\tposition: static !important;\n}\n\n.widget-area {\n\tclear: both;\n\tmargin: 9.0909% 9.0909% 0;\n\tmax-width: 660px;\n}\n\n.widget {\n\tfont-size: 16px;\n\tmargin: 0 0 11.1111%;\n}\n\n.widget p,\n.widget address,\n.widget hr,\n.widget ul,\n.widget ol,\n.widget dl,\n.widget dd,\n.widget table,\n.widget pre {\n\tmargin-bottom: 1.5em;\n}\n\n.widget li > ul,\n.widget li > ol {\n\tmargin-bottom: 0;\n}\n\n.widget blockquote {\n\tfont-size: 19px;\n\tline-height: 1.6842;\n\tmargin-bottom: 1.6842em;\n\tmargin-left: -1.2632em;\n\tpadding-left: 1.0526em;\n}\n\n.widget blockquote > blockquote {\n\tmargin-left: 0;\n}\n\n.widget blockquote p {\n\tmargin-bottom: 1.6842em;\n}\n\n.widget blockquote cite,\n.widget blockquote small {\n\tfont-size: 16px;\n\tline-height: 1.5;\n}\n\n.widget pre {\n\tline-height: 1.5;\n\tpadding: 0.75em;\n}\n\n.widget button,\n.widget input,\n.widget select,\n.widget textarea {\n\tline-height: 1.5;\n}\n\n.widget button,\n.widget input {\n\tline-height: normal;\n}\n\n.widget button,\n.widget input[type=\"button\"],\n.widget input[type=\"reset\"],\n.widget input[type=\"submit\"] {\n\tfont-size: 16px;\n\tpadding: 0.8125em 1.625em;\n}\n\n.widget input[type=\"text\"],\n.widget input[type=\"email\"],\n.widget input[type=\"url\"],\n.widget input[type=\"password\"],\n.widget input[type=\"search\"],\n.widget textarea {\n\tpadding: 0.75em;\n}\n\n.widget-title {\n\tmargin: 0 0 1.5em;\n}\n\n.widget_calendar td,\n.widget_calendar th {\n\tline-height: 2.9375;\n}\n\n.widget_calendar caption {\n\tmargin: 0 0 1.5em;\n}\n\n.widget_archive li,\n.widget_categories li,\n.widget_links li,\n.widget_meta li,\n.widget_nav_menu li,\n.widget_pages li,\n.widget_recent_comments li,\n.widget_recent_entries li {\n\tpadding: 0.7188em 0;\n}\n\n.widget_categories .children,\n.widget_nav_menu .sub-menu,\n.widget_pages .children {\n\tmargin: 0.7188em 0 0 1em;\n\tpadding-top: 0.7188em;\n}\n\n.widget_rss li {\n\tmargin-bottom: 1.5em;\n}\n\n.widget_rss .rss-date,\n.widget_rss cite {\n\tfont-size: 13px;\n\tline-height: 1.8462;\n}\n\n.widget .wp-caption-text,\n.widget .gallery-caption {\n\tline-height: 1.5;\n\tpadding: 0.5em 0;\n}\n\n.hentry,\n.page-header,\n.page-content {\n\tmargin: 0 7.6923%;\n}\n\n.hentry + .hentry,\n.page-header + .hentry,\n.page-header + .page-content {\n\tmargin-top: 7.6923%;\n}\n\n.post-thumbnail {\n\tmargin-bottom: 2.9474em;\n}\n\n.entry-header {\n\tpadding: 0 9.0909%;\n}\n\n.entry-title,\n.widecolumn h2 {\n\tfont-size: 39px;\n\tline-height: 1.2308;\n\tmargin-bottom: 1.2308em;\n}\n\n.entry-content,\n.entry-summary {\n\tpadding: 0 9.0909% 9.0909%;\n}\n\n.entry-content h1,\n.entry-summary h1,\n.page-content h1,\n.comment-content h1 {\n\tfont-size: 39px;\n\tline-height: 1.2308;\n\tmargin-top: 1.641em;\n\tmargin-bottom: 0.8205em;\n}\n\n.entry-content h2,\n.entry-summary h2,\n.page-content h2,\n.comment-content h2 {\n\tfont-size: 32px;\n\tline-height: 1.25;\n\tmargin-top: 2em;\n\tmargin-bottom: 1em;\n}\n\n.entry-content h3,\n.entry-summary h3,\n.page-content h3,\n.comment-content h3 {\n\tfont-size: 27px;\n\tline-height: 1.1852;\n\tmargin-top: 2.3704em;\n\tmargin-bottom: 1.1852em;\n}\n\n.entry-content h4,\n.entry-summary h4,\n.page-content h4,\n.comment-content h4 {\n\tfont-size: 22px;\n\tline-height: 1.4545;\n\tmargin-top: 2.9091em;\n\tmargin-bottom: 1.4545em;\n}\n\n.entry-content h5,\n.entry-content h6,\n.entry-summary h5,\n.entry-summary h6,\n.page-content h5,\n.page-content h6,\n.comment-content h5,\n.comment-content h6 {\n\tfont-size: 19px;\n\tline-height: 1.2632;\n\tmargin-top: 3.3684em;\n\tmargin-bottom: 1.6842em;\n}\n\n.entry-content .more-link:after {\n\tfont-size: 24px;\n\ttop: 3px;\n}\n\n.author-info {\n\tmargin: 0 9.0909%;\n\tpadding: 9.0909% 0;\n}\n\n.author-info .avatar {\n\tmargin: 0 1.6842em 1.6842em 0;\n\twidth: 56px;\n\theight: 56px;\n}\n\n.author-link:after {\n\tfont-size: 24px;\n\ttop: 0;\n}\n\n.entry-footer {\n\tpadding: 4.5454% 9.0909%;\n}\n\n.posted-on:before,\n.byline:before,\n.cat-links:before,\n.tags-links:before,\n.comments-link:before,\n.entry-format:before,\n.edit-link:before,\n.full-size-link:before {\n\ttop: 4px;\n}\n\n.updated {\n\tdisplay: none;\n}\n\n.updated.published {\n\tdisplay: inline;\n}\n\n.page-header {\n\tborder-color: inherit;\n\tborder-style: solid;\n\tborder-width: 0 0 0 7px;\n\tpadding: 3.8461% 7.6923%;\n}\n\n.page-title,\n.taxonomy-description {\n\tmargin-left: -7px;\n}\n\n.taxonomy-description {\n\tpadding-top: 0.4211em;\n}\n\n.page-title,\n.comments-title,\n.comment-reply-title,\n.post-navigation .post-title {\n\tfont-size: 27px;\n\tline-height: 1.1852;\n}\n\n.page-content {\n\tpadding: 7.6923%;\n}\n\n.page-links {\n\tmargin-bottom: 1.4736em;\n}\n\n.page-links a,\n.page-links > span {\n\tmargin: 0 0.25em 0.25em 0;\n}\n\n.format-aside .entry-title,\n.format-image .entry-title,\n.format-video .entry-title,\n.format-quote .entry-title,\n.format-gallery .entry-title,\n.format-status .entry-title,\n.format-link .entry-title,\n.format-audio .entry-title,\n.format-chat .entry-title {\n\tfont-size: 22px;\n\tline-height: 1.4545;\n\tmargin-bottom: 32px;\n}\n\n.format-link .entry-title a:after {\n\ttop: 0.125em;\n}\n\n.comments-title {\n\tmargin-bottom: 1.4545em;\n}\n\n.comment-list article,\n.comment-list .pingback,\n.comment-list .trackback {\n\tpadding: 1.6842em 0;\n}\n\n.comment-list + .comment-respond,\n.comment-navigation + .comment-respond {\n\tpadding-top: 1.6842em;\n}\n\n.comment-list .children > li {\n\tpadding-left: 1.4737em;\n}\n\n.comment-meta {\n\tposition: relative;\n}\n\n.comment-author {\n\tmargin-bottom: 0;\n\tpadding-left: 4.6315em;\n}\n\n.comment-author .avatar {\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 3px;\n\tleft: 0;\n\twidth: 56px;\n\theight: 56px;\n}\n\n.comment-metadata {\n\tline-height: 2;\n\tpadding-left: 5.5em;\n}\n\n.comment-metadata .edit-link:before,\n.pingback .edit-link:before {\n\ttop: 8px;\n}\n\n.bypostauthor > article .fn:after {\n\ttop: 8px;\n\tleft: 6px;\n}\n\n.comment-content ul,\n.comment-content ol {\n\tmargin: 0 0 1.6842em 0;\n}\n\n.comment-content li > ul,\n.comment-content li > ol,\n.comment-content blockquote > ul,\n.comment-content blockquote > ol {\n\tmargin-left: 1.3333em;\n}\n\n.comment-list .reply a {\n\tpadding: 0.4375em 0.875em;\n}\n\n.comment-form,\n.no-comments {\n\tpadding-top: 1.6842em;\n}\n\n.comment-reply-title small a:before {\n\ttop: -1px;\n}\n\n.comment-list .reply {\n\tmargin-top: 0;\n}\n\n.site-footer {\n\tborder-top: 1px solid transparent;\n\tborder-bottom: 1px solid transparent;\n\tmargin: 0 auto;\n\tmax-width: 806px;\n\tpadding: 0;\n}\n\n.site-info {\n\tmargin: 4.5454% 9.0909%;\n}\n\n.post-navigation {\n\tborder-top: 0;\n\tmargin: 7.6923% 7.6923% 0;\n}\n\n.post-navigation a {\n\tpadding: 4.5454% 9.0909%;\n}\n\n.pagination {\n\tborder-top: 0;\n\tmargin: 7.6923% 7.6923% 0;\n\tpadding: 0;\n}\n\n.pagination .page-numbers {\n\tdisplay: inline-block;\n}\n\n.pagination .meta-nav {\n\tdisplay: none;\n}\n\n.image-navigation {\n\tpadding: 0 9.0909%;\n}\n\n.comments-area {\n\tborder-top: 0;\n\tmargin: 7.6923% 7.6923% 0;\n}\n\nembed,\niframe,\nobject,\nvideo {\n\tmargin-bottom: 1.6842em;\n}\n\n.wp-audio-shortcode,\n.wp-video,\n.wp-playlist.wp-audio-playlist {\n\tfont-size: 19px;\n\tmargin-bottom: 1.6842em;\n}\n\n.wp-caption,\n.gallery {\n\tmargin-bottom: 1.6842em;\n}\n\n.wp-caption-text,\n.gallery-caption {\n\tpadding: 0.5em 0;\n}\n\n.widecolumn {\n\tmargin: 7.6923%;\n}\n\n.widecolumn .mu_alert {\n\tmargin-bottom: 1.6842em;\n}\n\n.widecolumn p {\n\tmargin: 1.6842em 0;\n}\n\n.widecolumn p + h2 {\n\tmargin-top: 1.641em;\n}\n\n.widecolumn #key,\n.widecolumn .mu_register #blog_title,\n.widecolumn .mu_register #user_email,\n.widecolumn .mu_register #blogname,\n.widecolumn .mu_register #user_name {\n\tfont-size: 19px;\n}\n\n.widecolumn .mu_register #blog_title,\n.widecolumn .mu_register #user_email,\n.widecolumn .mu_register #user_name {\n\tmargin: 0 0 0.421em;\n}\n\n\n/**\n * RTL\n */\n\n.rtl ul,\n.rtl ol {\n\tmargin-right: 0;\n\tmargin-left: auto;\n}\n\n.rtl li > ul,\n.rtl li > ol,\n.rtl blockquote > ul,\n.rtl blockquote > ol {\n\tmargin-right: 1.3333em;\n\tmargin-left: auto;\n}\n\n.rtl blockquote {\n\tborder-width: 0 4px 0 0;\n\tmargin-right: -1.0909em;\n\tmargin-left: auto;\n\tpadding-right: 0.9091em;\n\tpadding-left: 0;\n}\n\n.rtl blockquote > blockquote {\n\tmargin-right: 0;\n\tmargin-left: auto;\n}\n\n.rtl .main-navigation ul ul {\n\tmargin-right: 1em;\n\tmargin-left: auto;\n}\n\n.rtl .main-navigation .menu-item-has-children > a {\n\tpadding-right: 0;\n\tpadding-left: 48px;\n}\n\n.rtl .secondary-toggle {\n\tright: auto;\n\tleft: 7.6897%;\n}\n\n.rtl .image-navigation .nav-previous,\n.rtl .comment-navigation .nav-previous {\n\tfloat: right;\n}\n\n.rtl .image-navigation .nav-next,\n.rtl .comment-navigation .nav-next {\n\tfloat: left;\n\ttext-align: left;\n}\n\n.rtl blockquote.alignright,\n.rtl .wp-caption.alignright\n.rtl img.alignright {\n\tmargin: 0.4211em 0 1.6842em 1.6842em;\n}\n\n.rtl blockquote.alignleft,\n.rtl .wp-caption.alignleft,\n.rtl img.alignleft {\n\tmargin: 0.4211em 1.6842em 1.6842em 0;\n}\n\n.rtl .widget blockquote {\n\tmargin-right: -1.2632em;\n\tmargin-left: auto;\n\tpadding-right: 1.0526em;\n\tpadding-left: 0;\n}\n\n.rtl .widget blockquote > blockquote {\n\tmargin-right: 0;\n\tmargin-left: auto;\n}\n\n.rtl .widget_categories .children,\n.rtl .widget_nav_menu .sub-menu,\n.rtl .widget_pages .children {\n\tmargin: 0.7188em 1em 0 0;\n}\n\n.rtl .page-links a,\n.rtl .page-links > span {\n\tmargin: 0 0 0.25em 0.25em;\n}\n\n.rtl .author-info .avatar {\n\tmargin: 0 0 1.6842em 1.6842em;\n}\n\n.rtl .page-header {\n\tborder-width: 0 7px 0 0;\n}\n\n.rtl .page-title,\n.rtl .taxonomy-description {\n\tmargin-right: -7px;\n\tmargin-left: auto;\n}\n\n.rtl .comment-list .children > li {\n\tpadding-right: 1.4737em;\n\tpadding-left: 0;\n}\n\n.rtl .comment-author {\n\tpadding-right: 4.6315em;\n\tpadding-left: 0;\n}\n\n.rtl .comment-author .avatar {\n\tright: 0;\n\tleft: auto;\n}\n\n.rtl .comment-content ul,\n.rtl .comment-content ol {\n\tmargin-right: 0;\n\tmargin-left: auto;\n}\n\n.rtl .comment-content li > ul,\n.rtl .comment-content li > ol,\n.rtl .comment-content blockquote > ul,\n.rtl .comment-content blockquote > ol {\n\tmargin-right: 1.3333em;\n\tmargin-left: auto;\n}\n\n.rtl .comment-metadata {\n\tpadding-right: 5.5em;\n\tpadding-left: 0;\n}\n\n.rtl .bypostauthor > article .fn:after {\n\tright: 6px;\n\tleft: auto;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/css/ie7.css",
    "content": "/*\nTheme Name: Twenty Fifteen\nDescription: IE7 specific style.\n*/\n\n.screen-reader-text {\n\tclip: rect(1px 1px 1px 1px);\n}\n\n.secondary-toggle {\n\tcolor: #333;\n\tfont-size: 16px;\n\tline-height: 60px;\n\twidth: auto;\n}\n\n.pagination .prev,\n.pagination .next {\n\tfont-size: 16px;\n\tfont-weight: 700;\n\tline-height: 64px;\n\tpadding: 0 19px;\n\twidth: auto;\n}\n\n.image-navigation,\n.comment-navigation {\n\twidth: 662px;\n}\n\n.post-navigation {\n\ttext-align: left;\n}\n\n.site-main {\n\ttext-align: center;\n}\n\n.hentry {\n\tmargin-bottom: 7.6923%;\n\ttext-align: left;\n\twidth: 808px;\n}\n\n.page-header {\n\tmargin-bottom: 7.6923%;\n\ttext-align: left;\n}\n\n.comments-area {\n\ttext-align: left;\n}\n\n.comment-list,\n.comment-navigation {\n\tmargin-bottom: 1.6471em;\n}\n\n.gallery-columns-2 .gallery-item {\n\tmax-width: 48%;\n}\n\n.gallery-columns-3 .gallery-item {\n\tmax-width: 31%;\n}\n\n.gallery-columns-4 .gallery-item {\n\tmax-width: 22%;\n}\n\n.gallery-columns-5 .gallery-item {\n\tmax-width: 17%;\n}\n\n.gallery-columns-6 .gallery-item {\n\tmax-width: 13.5%;\n}\n\n.gallery-columns-7 .gallery-item {\n\tmax-width: 11%;\n}\n\n.gallery-columns-8 .gallery-item {\n\tmax-width: 9.5%;\n}\n\n.gallery-columns-9 .gallery-item {\n\tmax-width: 8%;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/footer.php",
    "content": "<?php\n/**\n * The template for displaying the footer\n *\n * Contains the closing of the \"site-content\" div and all content after.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n?>\n\n\t</div><!-- .site-content -->\n\n\t<footer id=\"colophon\" class=\"site-footer\" role=\"contentinfo\">\n\t\t<div class=\"site-info\">\n\t\t\t<?php\n\t\t\t\t/**\n\t\t\t\t * Fires before the Twenty Fifteen footer text for footer customization.\n\t\t\t\t *\n\t\t\t\t * @since Twenty Fifteen 1.0\n\t\t\t\t */\n\t\t\t\tdo_action( 'twentyfifteen_credits' );\n\t\t\t?>\n\t\t\t<a href=\"<?php echo esc_url( __( 'https://wordpress.org/', 'twentyfifteen' ) ); ?>\"><?php printf( __( 'Proudly powered by %s', 'twentyfifteen' ), 'WordPress' ); ?></a>\n\t\t</div><!-- .site-info -->\n\t</footer><!-- .site-footer -->\n\n</div><!-- .site -->\n\n<?php wp_footer(); ?>\n\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/functions.php",
    "content": "<?php\n/**\n * Twenty Fifteen functions and definitions\n *\n * Set up the theme and provides some helper functions, which are used in the\n * theme as custom template tags. Others are attached to action and filter\n * hooks in WordPress to change core functionality.\n *\n * When using a child theme you can override certain functions (those wrapped\n * in a function_exists() call) by defining them first in your child theme's\n * functions.php file. The child theme's functions.php file is included before\n * the parent theme's file, so the child theme functions would be used.\n *\n * @link https://codex.wordpress.org/Theme_Development\n * @link https://codex.wordpress.org/Child_Themes\n *\n * Functions that are not pluggable (not wrapped in function_exists()) are\n * instead attached to a filter or action hook.\n *\n * For more information on hooks, actions, and filters,\n * {@link https://codex.wordpress.org/Plugin_API}\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\n/**\n * Set the content width based on the theme's design and stylesheet.\n *\n * @since Twenty Fifteen 1.0\n */\nif ( ! isset( $content_width ) ) {\n\t$content_width = 660;\n}\n\n/**\n * Twenty Fifteen only works in WordPress 4.1 or later.\n */\nif ( version_compare( $GLOBALS['wp_version'], '4.1-alpha', '<' ) ) {\n\trequire get_template_directory() . '/inc/back-compat.php';\n}\n\nif ( ! function_exists( 'twentyfifteen_setup' ) ) :\n/**\n * Sets up theme defaults and registers support for various WordPress features.\n *\n * Note that this function is hooked into the after_setup_theme hook, which\n * runs before the init hook. The init hook is too late for some features, such\n * as indicating support for post thumbnails.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_setup() {\n\n\t/*\n\t * Make theme available for translation.\n\t * Translations can be filed in the /languages/ directory.\n\t * If you're building a theme based on twentyfifteen, use a find and replace\n\t * to change 'twentyfifteen' to the name of your theme in all the template files\n\t */\n\tload_theme_textdomain( 'twentyfifteen', get_template_directory() . '/languages' );\n\n\t// Add default posts and comments RSS feed links to head.\n\tadd_theme_support( 'automatic-feed-links' );\n\n\t/*\n\t * Let WordPress manage the document title.\n\t * By adding theme support, we declare that this theme does not use a\n\t * hard-coded <title> tag in the document head, and expect WordPress to\n\t * provide it for us.\n\t */\n\tadd_theme_support( 'title-tag' );\n\n\t/*\n\t * Enable support for Post Thumbnails on posts and pages.\n\t *\n\t * See: https://codex.wordpress.org/Function_Reference/add_theme_support#Post_Thumbnails\n\t */\n\tadd_theme_support( 'post-thumbnails' );\n\tset_post_thumbnail_size( 825, 510, true );\n\n\t// This theme uses wp_nav_menu() in two locations.\n\tregister_nav_menus( array(\n\t\t'primary' => __( 'Primary Menu',      'twentyfifteen' ),\n\t\t'social'  => __( 'Social Links Menu', 'twentyfifteen' ),\n\t) );\n\n\t/*\n\t * Switch default core markup for search form, comment form, and comments\n\t * to output valid HTML5.\n\t */\n\tadd_theme_support( 'html5', array(\n\t\t'search-form', 'comment-form', 'comment-list', 'gallery', 'caption'\n\t) );\n\n\t/*\n\t * Enable support for Post Formats.\n\t *\n\t * See: https://codex.wordpress.org/Post_Formats\n\t */\n\tadd_theme_support( 'post-formats', array(\n\t\t'aside', 'image', 'video', 'quote', 'link', 'gallery', 'status', 'audio', 'chat'\n\t) );\n\n\t$color_scheme  = twentyfifteen_get_color_scheme();\n\t$default_color = trim( $color_scheme[0], '#' );\n\n\t// Setup the WordPress core custom background feature.\n\tadd_theme_support( 'custom-background', apply_filters( 'twentyfifteen_custom_background_args', array(\n\t\t'default-color'      => $default_color,\n\t\t'default-attachment' => 'fixed',\n\t) ) );\n\n\t/*\n\t * This theme styles the visual editor to resemble the theme style,\n\t * specifically font, colors, icons, and column width.\n\t */\n\tadd_editor_style( array( 'css/editor-style.css', 'genericons/genericons.css', twentyfifteen_fonts_url() ) );\n}\nendif; // twentyfifteen_setup\nadd_action( 'after_setup_theme', 'twentyfifteen_setup' );\n\n/**\n * Register widget area.\n *\n * @since Twenty Fifteen 1.0\n *\n * @link https://codex.wordpress.org/Function_Reference/register_sidebar\n */\nfunction twentyfifteen_widgets_init() {\n\tregister_sidebar( array(\n\t\t'name'          => __( 'Widget Area', 'twentyfifteen' ),\n\t\t'id'            => 'sidebar-1',\n\t\t'description'   => __( 'Add widgets here to appear in your sidebar.', 'twentyfifteen' ),\n\t\t'before_widget' => '<aside id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget'  => '</aside>',\n\t\t'before_title'  => '<h2 class=\"widget-title\">',\n\t\t'after_title'   => '</h2>',\n\t) );\n}\nadd_action( 'widgets_init', 'twentyfifteen_widgets_init' );\n\nif ( ! function_exists( 'twentyfifteen_fonts_url' ) ) :\n/**\n * Register Google fonts for Twenty Fifteen.\n *\n * @since Twenty Fifteen 1.0\n *\n * @return string Google fonts URL for the theme.\n */\nfunction twentyfifteen_fonts_url() {\n\t$fonts_url = '';\n\t$fonts     = array();\n\t$subsets   = 'latin,latin-ext';\n\n\t/*\n\t * Translators: If there are characters in your language that are not supported\n\t * by Noto Sans, translate this to 'off'. Do not translate into your own language.\n\t */\n\tif ( 'off' !== _x( 'on', 'Noto Sans font: on or off', 'twentyfifteen' ) ) {\n\t\t$fonts[] = 'Noto Sans:400italic,700italic,400,700';\n\t}\n\n\t/*\n\t * Translators: If there are characters in your language that are not supported\n\t * by Noto Serif, translate this to 'off'. Do not translate into your own language.\n\t */\n\tif ( 'off' !== _x( 'on', 'Noto Serif font: on or off', 'twentyfifteen' ) ) {\n\t\t$fonts[] = 'Noto Serif:400italic,700italic,400,700';\n\t}\n\n\t/*\n\t * Translators: If there are characters in your language that are not supported\n\t * by Inconsolata, translate this to 'off'. Do not translate into your own language.\n\t */\n\tif ( 'off' !== _x( 'on', 'Inconsolata font: on or off', 'twentyfifteen' ) ) {\n\t\t$fonts[] = 'Inconsolata:400,700';\n\t}\n\n\t/*\n\t * Translators: To add an additional character subset specific to your language,\n\t * translate this to 'greek', 'cyrillic', 'devanagari' or 'vietnamese'. Do not translate into your own language.\n\t */\n\t$subset = _x( 'no-subset', 'Add new subset (greek, cyrillic, devanagari, vietnamese)', 'twentyfifteen' );\n\n\tif ( 'cyrillic' == $subset ) {\n\t\t$subsets .= ',cyrillic,cyrillic-ext';\n\t} elseif ( 'greek' == $subset ) {\n\t\t$subsets .= ',greek,greek-ext';\n\t} elseif ( 'devanagari' == $subset ) {\n\t\t$subsets .= ',devanagari';\n\t} elseif ( 'vietnamese' == $subset ) {\n\t\t$subsets .= ',vietnamese';\n\t}\n\n\tif ( $fonts ) {\n\t\t$fonts_url = add_query_arg( array(\n\t\t\t'family' => urlencode( implode( '|', $fonts ) ),\n\t\t\t'subset' => urlencode( $subsets ),\n\t\t), 'https://fonts.googleapis.com/css' );\n\t}\n\n\treturn $fonts_url;\n}\nendif;\n\n/**\n * JavaScript Detection.\n *\n * Adds a `js` class to the root `<html>` element when JavaScript is detected.\n *\n * @since Twenty Fifteen 1.1\n */\nfunction twentyfifteen_javascript_detection() {\n\techo \"<script>(function(html){html.className = html.className.replace(/\\bno-js\\b/,'js')})(document.documentElement);</script>\\n\";\n}\nadd_action( 'wp_head', 'twentyfifteen_javascript_detection', 0 );\n\n/**\n * Enqueue scripts and styles.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_scripts() {\n\t// Add custom fonts, used in the main stylesheet.\n\twp_enqueue_style( 'twentyfifteen-fonts', twentyfifteen_fonts_url(), array(), null );\n\n\t// Add Genericons, used in the main stylesheet.\n\twp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.2' );\n\n\t// Load our main stylesheet.\n\twp_enqueue_style( 'twentyfifteen-style', get_stylesheet_uri() );\n\n\t// Load the Internet Explorer specific stylesheet.\n\twp_enqueue_style( 'twentyfifteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfifteen-style' ), '20141010' );\n\twp_style_add_data( 'twentyfifteen-ie', 'conditional', 'lt IE 9' );\n\n\t// Load the Internet Explorer 7 specific stylesheet.\n\twp_enqueue_style( 'twentyfifteen-ie7', get_template_directory_uri() . '/css/ie7.css', array( 'twentyfifteen-style' ), '20141010' );\n\twp_style_add_data( 'twentyfifteen-ie7', 'conditional', 'lt IE 8' );\n\n\twp_enqueue_script( 'twentyfifteen-skip-link-focus-fix', get_template_directory_uri() . '/js/skip-link-focus-fix.js', array(), '20141010', true );\n\n\tif ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {\n\t\twp_enqueue_script( 'comment-reply' );\n\t}\n\n\tif ( is_singular() && wp_attachment_is_image() ) {\n\t\twp_enqueue_script( 'twentyfifteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20141010' );\n\t}\n\n\twp_enqueue_script( 'twentyfifteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20150330', true );\n\twp_localize_script( 'twentyfifteen-script', 'screenReaderText', array(\n\t\t'expand'   => '<span class=\"screen-reader-text\">' . __( 'expand child menu', 'twentyfifteen' ) . '</span>',\n\t\t'collapse' => '<span class=\"screen-reader-text\">' . __( 'collapse child menu', 'twentyfifteen' ) . '</span>',\n\t) );\n}\nadd_action( 'wp_enqueue_scripts', 'twentyfifteen_scripts' );\n\n/**\n * Add featured image as background image to post navigation elements.\n *\n * @since Twenty Fifteen 1.0\n *\n * @see wp_add_inline_style()\n */\nfunction twentyfifteen_post_nav_background() {\n\tif ( ! is_single() ) {\n\t\treturn;\n\t}\n\n\t$previous = ( is_attachment() ) ? get_post( get_post()->post_parent ) : get_adjacent_post( false, '', true );\n\t$next     = get_adjacent_post( false, '', false );\n\t$css      = '';\n\n\tif ( is_attachment() && 'attachment' == $previous->post_type ) {\n\t\treturn;\n\t}\n\n\tif ( $previous &&  has_post_thumbnail( $previous->ID ) ) {\n\t\t$prevthumb = wp_get_attachment_image_src( get_post_thumbnail_id( $previous->ID ), 'post-thumbnail' );\n\t\t$css .= '\n\t\t\t.post-navigation .nav-previous { background-image: url(' . esc_url( $prevthumb[0] ) . '); }\n\t\t\t.post-navigation .nav-previous .post-title, .post-navigation .nav-previous a:hover .post-title, .post-navigation .nav-previous .meta-nav { color: #fff; }\n\t\t\t.post-navigation .nav-previous a:before { background-color: rgba(0, 0, 0, 0.4); }\n\t\t';\n\t}\n\n\tif ( $next && has_post_thumbnail( $next->ID ) ) {\n\t\t$nextthumb = wp_get_attachment_image_src( get_post_thumbnail_id( $next->ID ), 'post-thumbnail' );\n\t\t$css .= '\n\t\t\t.post-navigation .nav-next { background-image: url(' . esc_url( $nextthumb[0] ) . '); border-top: 0; }\n\t\t\t.post-navigation .nav-next .post-title, .post-navigation .nav-next a:hover .post-title, .post-navigation .nav-next .meta-nav { color: #fff; }\n\t\t\t.post-navigation .nav-next a:before { background-color: rgba(0, 0, 0, 0.4); }\n\t\t';\n\t}\n\n\twp_add_inline_style( 'twentyfifteen-style', $css );\n}\nadd_action( 'wp_enqueue_scripts', 'twentyfifteen_post_nav_background' );\n\n/**\n * Display descriptions in main navigation.\n *\n * @since Twenty Fifteen 1.0\n *\n * @param string  $item_output The menu item output.\n * @param WP_Post $item        Menu item object.\n * @param int     $depth       Depth of the menu.\n * @param array   $args        wp_nav_menu() arguments.\n * @return string Menu item with possible description.\n */\nfunction twentyfifteen_nav_description( $item_output, $item, $depth, $args ) {\n\tif ( 'primary' == $args->theme_location && $item->description ) {\n\t\t$item_output = str_replace( $args->link_after . '</a>', '<div class=\"menu-item-description\">' . $item->description . '</div>' . $args->link_after . '</a>', $item_output );\n\t}\n\n\treturn $item_output;\n}\nadd_filter( 'walker_nav_menu_start_el', 'twentyfifteen_nav_description', 10, 4 );\n\n/**\n * Add a `screen-reader-text` class to the search form's submit button.\n *\n * @since Twenty Fifteen 1.0\n *\n * @param string $html Search form HTML.\n * @return string Modified search form HTML.\n */\nfunction twentyfifteen_search_form_modify( $html ) {\n\treturn str_replace( 'class=\"search-submit\"', 'class=\"search-submit screen-reader-text\"', $html );\n}\nadd_filter( 'get_search_form', 'twentyfifteen_search_form_modify' );\n\n/**\n * Implement the Custom Header feature.\n *\n * @since Twenty Fifteen 1.0\n */\nrequire get_template_directory() . '/inc/custom-header.php';\n\n/**\n * Custom template tags for this theme.\n *\n * @since Twenty Fifteen 1.0\n */\nrequire get_template_directory() . '/inc/template-tags.php';\n\n/**\n * Customizer additions.\n *\n * @since Twenty Fifteen 1.0\n */\nrequire get_template_directory() . '/inc/customizer.php';\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/genericons/COPYING.txt",
    "content": "Genericons is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThe fonts are distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\nAs a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.\n\nThis license does not convey any intellectual property rights to third party trademarks that may be included in the icon font; such marks remain subject to all rights and guidelines of use of their owner."
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/genericons/LICENSE.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/genericons/README.md",
    "content": "## Genericons\n\nGenericons are vector icons embedded in a webfont designed to be clean and simple keeping with a generic aesthetic.\n\nUse genericons for instant HiDPI, to change icon colors on the fly, or even with CSS effects such as drop-shadows or gradients!\n\n\n### Usage\n\nTo use it, place the `font` folder in your stylesheet directory and enqueue the genericons.css file. Now you can create an icon like this:\n\n```\n.my-icon:before {\n\tcontent: '\\f101';\n\tfont: normal 16px/1 'Genericons';\n\tdisplay: inline-block;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n```\n\nThis will output a comment icon before every element with the class \"my-icon\". The `content: '\\f101';` part of this CSS is easily copied from the helper tool at http://genericons.com/, or `example.html` in the `font` directory.\n\nYou can also use the bundled example.css if you'd rather insert the icons using HTML tags.\n\n\n### Notes\n\n**Photoshop mockups**\n\nThe `Genericons.ttf` file found in the `font` directory can be placed in your system fonts folder and used Photoshop or other graphics apps if you like.\n\nIf you're using Genericons in your Photoshop mockups, please remember to delete the old version of the font from Font Book, and grab the new one from the zip file. This also affects using it in your webdesigns: if you have an old version of the font installed locally, that's the font that'll be used in your website as well, so if you're missing icons, check for old versions of the font on your system.\n\n**Pixel grid**\n\nGenericons has been designed for a 16x16px grid. That means it'll look sharp at font-size: 16px exactly. It'll also be crisp at multiples thereof, such as 32px or 64px. It'll look reasonably crisp at in-between font sizes such as 24px or 48px, but not quite as crisp as 16 or 32. Please don't set the font-size to 17px, though, that'll just look terrible blurry.\n\n**Antialiasing**\n\nIf you keep intact the `-webkit-font-smoothing: antialiased;` and `-moz-osx-font-smoothing: grayscale;` CSS properties. That'll make the icons look their best possible, in Firefox and WebKit based browsers.\n\n**optimizeLegibility**\n\nNote: On Android browsers with version 4.2, 4.3, and probably later, Genericons will simply not show up if you're using the CSS property \"text-rendering\" set to \"optimizeLegibility.\n\n**Updates**\n\nWe don't often update icons, but do very carefully when we get good feedback suggesting improvements. Please be mindful if you upgrade, and check that the updated icons behave as you intended.\n\n\n### Changelog\n\n**3.2**\n\nA number of new icons and a couple of quick updates. \n\n* New: Activity\n* New: HTML anchor\n* New: Bug\n* New: Download\n* New: Handset\n* New: Microphone\n* New: Minus\n* New: Plus\n* New: Move\n* New: Rating stars, empty, half, full\n* New: Shuffle\n* New: video camera\n* New: Spotify\n* New: Twitch\n* Update: Fixed geometry in Edit icon\n* Update: Updated Foursquare icon\n\nTwitch and Spotify mark the last social icons that will be added to Genericons.\nFuture social icons will have to happen in a separate font. \n\n**3.1**\n\nGenericons is now generated using a commandline tool called FontCustom. This makes it far easier to add new icons to the font, but the switch means the download zip now has a different layout, fonts have different filenames, there's now no .otf font included (but the .ttf should suffice), and the font now has slightly different metrics. I've taken great care to ensure this new version should work as a drop-in replacement, but please be mindful and test carefully if you choose to upgrade.\n\n* Per feedback, the baked-in 16px width and height has been removed from the helper CSS. It wasn't really necessary (the glyph itself has these dimensions naturally), and it caused some headaches.\n* Base64 encoding is now included by default in the helper CSS. This makes it drop-in easy to get Genericons working in Firefox even when using a CDN. \n* Title attribute on website tool.\n* New: Website.\n* New: Ellipsis.\n* New: Foursquare.\n* New: X-post.\n* New: Sitemap.\n* New: Hierarchy.\n* New: Paintbrush.\n* Updated: Show and Hide icons were updated for clarity.\n\n**3.0.3**\n\nBunch of updates mostly.\n\n* Two new icons, Dropbox and Fullscreen.\n* Updates to all icons containing an exclamation mark.\n* Updates to Image and Quote.\n* Nicer \"Share\" icon.\n* Bigger default Linkedin icon.\n\n**3.0.2**\n\nA slew of new stuff and updates.\n\n* Social icons: Skype, Digg, Reddit, Stumbleupon, Pocket.\n* New generic icons: heart, lock and print.\n* New editing icons: code, bold, italic, image\n* New interaction icons: subscribe, unsubscribe, subscribed, reply all, reply, flag.\n* The hyperlink icon has been updated to be clearer, chunkier.\n* The \"home\" icon has been updated for style, size and clarity.\n* The email icon has been updated for style and clarity, and to fit with the new subscribe icons.\n* The document icon has been updated for style.\n* The \"pin\" icon has been updated for style and clarity.\n* The Twitter icon has been scaled down to fit with the other social icons.\n\n**3.0.1**\n\nMostly maintenance. \n\n* Fixed an issue with the example page that showed an old \"top\" icon instead of the actual NEW \"refresh\" icon.\n* Added inverse Google+ and Path.\n* Replaced tabs with spaces in the helper CSS.\n* Changed the Genericons.com copy/paste tool to serve span's instead of div's for casual icon insertion. It's being converted to \"inline-block\" anyway.\n\n**3.0**\n\nMainly maintenance and a few new icons.\n\n* Fast forward, rewind, PollDaddy, Notice, Info, Help, Portfolio\n* Updated the feed icon. It's a bit smaller now for consistency, the previous one was rather big.\n* So, the previous version numbering, 2.09, wasn't very PHP version compare friendly. So from now on it'll be 3.0, 3.1 etc. Props Ipstenu.\n* Genericons.com now has a mini release blog.\n* The CSS has prettier formatting, props Konstantin Obenland.\n\n**2.09**\n\nUpdated Facebook icon to new version. Updated Instagram logo to use new one-color version. Updated Google+ icon to use same radius as Instagram and Facebook. Added a bunch of new icons, cog, unapprove, cart, media player buttons, tablet, send to tablet.                                            \n\n**2.06**\n\nIncluded Base64 encoded version. This is necessary for Genericons to work with CDNs in Firefox. Firefox blocks fonts linked from a different domain. A CDN (typically s.example.com) usually puts the font on a subdomain, and is hence blocked in Firefox.\n\n**2.05**\n\nAdded a bunch of new icons, including upload to cloud, download to cloud, many more.\n\n**2.0**\n\nInitial public release\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/genericons/genericons.css",
    "content": "/**\n\n\tGenericons\n\n*/\n\n\n/* IE8 and below use EOT and allow cross-site embedding.\n   IE9 uses WOFF which is base64 encoded to allow cross-site embedding.\n   So unfortunately, IE9 will throw a console error, but it'll still work.\n   When the font is base64 encoded, cross-site embedding works in Firefox */\n\n@font-face {\n    font-family: 'Genericons';\n    src: url('Genericons.eot');\n}\n\n@font-face {\n    font-family: 'Genericons';\n    src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAADgYAA0AAAAAWDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAA3/AAAABoAAAAcbOWpBk9TLzIAAAGUAAAARQAAAGBVb3cYY21hcAAAAngAAACUAAABqq7WqvhjdnQgAAADDAAAAAQAAAAEAEQFEWdhc3AAADf0AAAACAAAAAj//wADZ2x5ZgAABEAAADAqAABJ0A3bTddoZWFkAAABMAAAACkAAAA2B8ZTM2hoZWEAAAFcAAAAGAAAACQQuQgFaG10eAAAAdwAAACZAAABNGKqU2Vsb2NhAAADEAAAAS4AAAEuB9f1Nm1heHAAAAF0AAAAIAAAACAA6AEZbmFtZQAANGwAAAFRAAAChXCWuFJwb3N0AAA1wAAAAjEAAAXmlxz2knjaY2BkYGAA4rplZ/Tj+W2+MnBzMIDAhRBmaWSag4EDQjGBKADj7gZyAAAAeNpjYGRg4GAAgh1gEsRmZEAFLAAWNADXAAEAAACWAOgAEAAAAAAAAgAAAAEAAQAAAEAALgAAAAB42mNg4WBg/MLAysDAasw6k4GBUQ5CM19nSGMSYmBgYmDjZIADAQSTISDNNYXhwEeGr+IcIO4ODogwI5ISBQZGAOtvCU0AAAB42kVPuxXCQAyTL+GRmmVoKdgA6FNRMoObdAyRnj3o6NkGLOl4+N75I381AUeUTPoNASSyoWVUBMYUYkmt/KOQVdG79IceFtwj8QpN4JxI+vL4LrYUTlL294GNerLNcGfiRMu6gfhOGMbSzTOz30lv9SbvMoe+TRfHFld08b4wQ/Mhk6ocD8rtKzrHrV/49A34cy/9BURAKJ4AAAB42t2NPw8BQRTEZ+/E2Xi7NlHIJsI1hGgodVqdVqfVqZRqH8QXvL25eq0/USh8AL/kzWReJhkAOV43hMKDW0rqmVu4Jh/BpY+tdNDBh2ndoabnnGtuueeR52YQI1AhILhQ1iDoWHLJDXc88NQgxl5ujS2sMjNZyUImMhYvfTFSdC/v3R+oNj4llSXJvgv4e+6zoCcQAEQFEQAAACwALAAsAFoAhADMAPIBAAEcAUYBlAHOAggCsgNMA6QD4AQSBMIFXAWoBgQGdgcIByoHageOB8gIJgkeCn4LOgvIDH4Myg2YDeoOLA5oDtIO9A8QDy4PeA+aD+AQNhCgEN4RFBFSEZwR9hJgEoISpBLuEwwTKBNEE3ITihPOFAYUWBSYFMgU3BT4FT4VTBViFaAVzhY6FmYWlhaoFsIW2hbuFwQXEhcgFzYXlBfEGAIYNhh4GLIY2hj8GSoZhBnAGfAaBhoUGioaQBpOGn4awBr4GyobgBuWG6wb3hwCHCwccByqHOgdFh02HWodmh3MHgQeHh5GHowfpB/OH9wf6B/2IAQgWCCOIOYhdiGuIfAiciKOIrQi6CL2IyojRCN2I5QjviQIJJAkxCToAAB42oV8CWBU1dX/PW+dyT57Mkkms2RmAkkmyazZCEPYE3ZCWALKJkhYI7IorT4XFERwQdEiAtaK1l0roMUln3WtSktBPltrP7CLyx9b21o/hczlf+59MyGA+jF579333n3vbuf+zu+cex5EICMIERbK04hIVBJ6BkhN87OqRL4IP6PIf2x+VhQwSZ4R2WWZXX5WVaCv+Vlg1yMmj8nvMXlGCG5aDvfSy+Vppx8bIb1HCFEEIhCFyBp/bzbJJxbiIAQ8No9s88TkmMcGuPkxbcKjQCTSRwQtpYkESErDFDmLj8pa+t9Zwg8UNyIA5lHxh++1YFluyVwgSO5yocBMwvFowKtYxRr4Kcw7fJjuoZfQPYcPw1vHduw4tkMl567MYzn6Du9gNwgWr4GmaoqGr3WQYjIY6yqz5lk8JNwiREOCN0+wukC0yTESdoHNmif4vCGIxmVNIN9iY/FAHzqwb/3o0ev36YezZ4nw8ye3d0amrRs2fXtnJzamTxM1DcgZrT8TO4jfzk3upb2d26cPWzct0rn9ye2sPgIxDOw/7DuTB7BKbGM/Cd/Vp/UREXsFMAWajHuBAJ5Tvmcb9g+wawprm0CIUcC+1s7gWQp/eI8/h32ZixmtimqSTSGIReNuu6zd1nOW9Nx2ElpOytqG1ytSn2rCvRWvb9hz8iQfA3xKYWPAxhXrY80Dnykcj8G5pAdwTDef2tK9Q8gkKNaajfOWU5uB7OgekCQCqyevSxGJsnG120xYo1g8ZmKDiicOG9bNFHVg/+MddwDTLZCwsVv2MMsWFA9B1qHuzmTP7p5kZ3dvZ/ch+vWhus4GfkElhzZSbd7uwD2NHaBN7OmZSLWOxnsCu+eBtvEEHqi28dChjaAl10wvwjyU5wHMw3qO9KqsbgXEh+0N87pVggk8CQ9rtH7BhyPk87J6xSOK1r1jR7dGk3S/Blv2nKT8HE+TPKFgk9klmoRe7eQeQTt3uqMbMEVEyIybjKW6mASw8sDFxikYj0WDmCzAZIsQiwaCLDcfe03Kjzc1xWe1t0PBjAULZnTVtPonjpbx9hnchIL4rbtujc1q7+7G+zM/p32fz+yq6blx1OWHRmMR2M6oASWPrOMzyyWYbVZBkVQlgELBimlRsOAWIRAMQZ6gBoKKGhLzIQ9wcjgUm9UlOxQ1TwhBMCQFB+N1u8MlOVxKwmq32qxKMFAewNqaWwRxDdgh68RLN7YteYHSe30+CLpiMxeMH1tbskQxGvMtUl64eUHiqptvvioxf2goK6sg32CUlpTUjpkwf2YsmmsPjR46yikYS73xUimnyGhyisZSpzcXFIc7MWp+M/h899DUC0vabnzphIGwPf16y8P0rTOvhFV3ofSrKcPnOhVLeXjC/E1T916RXzHm0joQZXOd3wvg9deZFEGomNSQKMlevWfK5vkTwn6zEurKypMLYtVSrq+4UFCznWZQCl31Hil3kGtwXpapfGJdVqFbibx8Bhoe3sIbh53IgIoQ3qcGYiKliC1hkiSTCPGHE4KoENXuj5sT5bILzIgrZkecJALBHGDd6xIccckhAMtUnhAsXsVnt7RIiUAVuCWCsEcQ9wgDPonsP+R56k90U/cH4phd7xbSU/RYXmPX6fuvXPZjePyTgiT9G+2Rl4w+8L/N9tKg8iiMu9p5pvFV+s+aV+GrW7Y+4dbci36t7B2/Zcmga+hBehXsgg1g+dnP6Bd0I12I2xc/+xlYtElQBTe20SNv9u5dBh29oVDxvfTXwubkw/Q369+D+PharTMMHzRc2u0qjXTkeJRiKIV/T6OHjtvHhMAJ8YJ9dJ/Q6G5pLb/mTu2Cl2OBvFDWXYB4XIV4/BFpwBNFtSPgSpLP7bdHwjjlUbwwgYchKF8MrxJ2yYES2iJEwnZHPJEHalzV2pcL1bO0p39L6TZ6mJ6tqpr24B1D173k87vraq99ZMKM9hnhW+CWj7MaF2xqn7Al8uNl1o6GFUrtqgnFtiXH3jt0/+phD8mBUXXitpVqbtE7N8qVYvinlyzofPSd7EGVbZsWNA5JFCWTS7y5en0J6g9VI8F+dPAhSls8Q1BHRByJgA8VSCnCIirN8wCC/g3ycujfKlv3yeOXXHLnjCpKU1XshoqIcIYgdL4JUm9OcwL+lRW/dM2IU7Qv1bCjW8Y7HNuxXPkTLNfN8EFkioGVEW2RsCfKQPTyckVpN4zNp2/Q3j/9yVE95pJr2hLdTqc6Z2FF1GmUvqFH+g6KY6EGhOjc6WPipYoo0r+Z/NVeUTASRJ9M2yyIzB6ykKzg2GA3s0HxeXFGF5jjgJILCoRRdrPBbgFLPNEixqIMCAwIHZGwI1Du80qKGo6E40MhbldURQWLiDgSd9jPXfPjUKti3ByLim2wDMZ9uW3Y6n2vfXr1Afrcl9u2fUn/ePo9eu0oMXDL9ZLwzb9W/Rl8kwSpIM+iOgqt4JDNcp6kChMawbiCfnbfLfTs4THFRf5lPq/NkmetqgX/09d0WPOt1o0TA0t9PrxoqxR88pCvD/5B1fDtzx24+tPX9q0etu1LGMdLT+WdohsWSqX399WEZEV4ODXMI+3t2w05Sk5d3ahIYWhmzCv4De7skvxCW3ZDJyxc1fXgClkQocwrykLfPYIJZqiC1w1ZmYtqReXNO1MN3bD6w8NM1lHXk2t5/+YjykfIUhxJnOhe1cRknGEqWLAbAy3gcIkOuwKsh1CIgngB0VUBNuRIrJhocbFDnA4JQW9IxX5PcNCOJDxehZ1GPCibQrN5rOXgPde86/S4nWWeH79ty6u/enJzz/Qh2TYNclRIPTftpqLGD7Qp4yyjfPFSj1XsRQJ2ls9KprZk2RLtaoNgTqDAnW821LT/YubUvTenHrj2r5N0yRQaYSr89VqxpcHTXA5TpN/uXvLUPFFIdt8+aW9vKubxCPZFk6ZdLkBhbm1hRWkwKBcASRfRh8+X2Mcuumx2fWlWaUGJtdBmjI5uuvX5Vc/Xbps/dRibG1w3IrAqLyE/MpM6nR0FmeplooaqCCkIXoqyaQcqEgSPOeixtSh4T7AJc+gBaHtImHzZ4qmJjiqo6pQL6MHJnZWjB+dm04OSBGOzbW5PTaS1fMrmxQ1AxP+5ef7YtnnV4+tqx4fO7BTMS9b5I+7ieOq/xevnbDWV+IqLLdmJpU+s5GOppcfSgnOyeQAapKc940oWpAwh8CGpsdrxAq+moMY89gKbirVOcByzmXSEYCCAlMBBv71hxGSY1Dp8yuRhUtPDm8KT670F9BsAMBiyvA3ekcMykKEPwmkiFvV9Im6c2Ng8fkJT48S+DfDmUweKKoOFqzx09f4DcKjS5hxUemkHnYGd+RgqqsmooyaxGrskfWoHggLO0mAgYQkJvGcZDmN/svlqZlKG9casSMjUPPYXZNlaZKlu7e+f3DY3Wj31qh0HFi54yju2wDvnbrX0p1KefeuiqTMCzXmOqxeueWH+yBve+vGcx25eMTY41ayqolVQffZpaxPl45bd84s/G0hi/qa9++ds+PiVXcub5yTpR/UbtscfuVp42uhZEr310NIpke3/1bDg9ueh7sDlz1zXFpq86qZ7J9093+YszJmYVWgy+u56cdX43fdtXT89rOuUjB5ekOE2BUKegM0MxhMWFzDNwhol6o2yO+wIYZCIB4JpzYKiw5gt0v4Ep1xMtjBfGWAnOQLkQl6T5hx3bWsvGVOydfJVv7l9ctMVu95bvfbI7msmDupebC6RBZMgy3kjRmu9PZc92F0/acclsQ5/Tnada/Tw+KxYgcHYY3HI++mpXQNZDP2cfs3eP3j9AnDG2pceAvHurifuWplMXPKj2+9uu+XoYEOexZDMstpME6+a9+zNk5uX3DZt+zd3x7piNbvWDW6dPuLq9srJFgv1T52/eSI4YO3hfrIikL3CXHWuvBcnVz7n4AXIswvK00fZCjO++oo+8lXqynRC3sv2X6XP8KjrbsK5shdPJBFtBR9qkiAKC9LWBP4sZocZoQ1TeMmsbABrQQ4aZnem7l+2wjt5tvWqjo3XPT3zSF3U2jy2vmeVoWBTcuSNKjHQh2iKDqGDoAxuuwbKOpZdufpeg5X+lj4/kf7z6adn31sKT7A2ZGy5fMSGi+afUVAImjB7+vgeuNWpIAOn/FzAfR9n0gTgA6IpFTiXvbqFg+iKgMtA2YSKCsWGkeCYyRfjjUpIw+HndLqpoLp53KabV8+Zs2zDpZcMb42+0d3eHqo2qRptop/Q6K6qKmf5DPq3uN1eVtbQeN0GYU3Kl0zOmrklowsy+OEg1WTIxfUnbqXA7o4XYI34bHRz/oN1syO4x00ol5WoPkrBam+CcHwghIhl9NWTzJxDM+Hv5s2n6OenNpvp39tjMom1t8e09O58FKHkpP5U30mRjGpEYw3tuKaRKfaItD/zTDufWmcBVFDOkm3kTrKD/ITcTx4gD5FHmGWJTbDVKuzPqtSh/aLUKaqV7RQbAxTsTiUfQPEGobYGAsHaQCygd28gGA3yGRiI4cUodkGsNh6L10VZn8fCCX7Uf0OhNgHxsANq7XW19ojd0f+zsa2W/Vkd1jo7mOSEERx+2ZYAk1/1J4KqEYKyP6aqOOr8n4B/QnqPh1SrqcKUagURUJxFdlWA8/4J0J8Z1bzwMmYXXgYB+t+RfhHgq8D1SWpd6swn4Eq98RDcTT/+RBj92WefQaUgf0I/Fhofkv4lS7RaUAWQ2DOsUIEVmX4Dvh9odXYOHGWvT9dU5PfxAPgQPijBUUkWQAYBT9nGHuMvYPuj2dm0Ot1CUX8jK4NlwydgIn3vlZ0wgz6y85W9f1yRehmir9w3YdeuXZiasfOVB/644nxZtaCee5l8wmQVWWEB2otubua1IClH01FA/eCwSwmcMlw/IKYisA4FhqmYA21CC2eDCiP1iKy10TrGd8rZJf5onIFwCBT9gnAOmJHmBLji4dmYWYBvYzfZOVNKIhquQY7XyJ3wlD2RPhUgXJ7QqRJ7JWK4hGUGA+ZEHK8nFElBuDfbJYkcYCyUkUN6FyOhnI8e3U2PL1++0Gra96P14N4wtn3lu3dNL0+GsEeNIgz72WuLHwTXPLf/cvrh7eLgwZ1brlzbMWvuU9e0Z3d3LKJfLb9ySEuWYefyFf/T1OJoD23cFOu02CIFVbHSqlmBQNRgMBcVVIaLndFqc7FDVirLKmpCY3LRJjTa7CMDgVFWm2w2Fnsr7JVdHq9fFDo3tkam1eTYzJMWra0vHxYxFRvNjg2PdEy/fRrdcAo2LWqavuPt1eNvmOeMj1m9ih58+GH62ei23OkzoPpZk/k++tnba6/7EEI6B9abyShwmg3fY1izcin9/d13nR07Jq/BNmP7u6tGbVoTxrZmCdC+rOnWDZHqa+5OZQ2/qX71YF+Jt/2ap+YKS19pGW9talmy9Efrf+XyTJnT9XF7pNoaHDJ33rTiyjI1O8/hGD1ocIfH4bEIQo7TXNzm97eYkN7WVwpQNrbU5RGg0ufrCFo9TotkLCpzz6wdtjRkyhl5ycpYtKPaYM+rGVKe2NA88apYfs7yB/tu/ubdm25cc+S+pVb38q2T76FPrt+wqtT5P3t2wfKf3Pc7lyTk3PIB/dPuffR3H17fL78G1FQkm3SRK8mtun+SkekYkmlQfZwGodgwz18ZuGR2hjIsMslG6ybBU0osLdcopR6IhlCKOOnkHAJ5khhPcwrGQ60utMviiDIZtqtR+z13FroSbmehu7nK77AUOiyWaZ7yeKk7N7z4jnfWLHx47ZSgoaA0mPBGNtzaNsSSV5yFU1xQwNBomnXP3Nj4sfeDAew5ZeXDWiIWn2XY2urC8mGV3j8f+tmBl5oc4REL6l0tcUu0oCw8tLO2aoakZZi8QKZZSpJDLomEZ7a0Bkrt9praSkt+a4k7UT1kZHD4dT2dYf/QznkxeygSCddY3ZV2VSqyhKqcan52npovIXlJLrlhVMfDyetOz3NFwoMToXJRNucb8wfXTq65du9WcVFTT/TK1bMbLD5HcsWgWZdOG1Hhx7I3Im7E1evIIuxxF07qPDmExqcpz4AzmadcQjyB6tYlYj/HQ4ov6A3kYTZwiWWghiSc/C0i2kLybrVo7MgZI5qceWWVy1auW3X59KTZjGrEYLK6/dHS6IqOkWaLZ8Tw+gKoV6zJoTPGTxlalyWUt0zpmj11mMUiFUSi7aOmjh5TUlwkmpxFRuNJ1dE4qDR7zPCRjzz89E/v3TDbqQ4ScwaHp825YdvB+TM3T01Y5NxcVaH/T1DtDrfL5yrNNgtFrpxcKPRW5pVXi8+m/ibI2ZJsqR6+dOS467vaqrz5BoRYJb+wItJeXT138rjGqpzst43uJSseeuCN2ROuaHILeSVFWYTzr1uxb65EmRxErsPesavc0RxkIiahmmdMVERbmhk5KI7AvICBgT/Mw2xte5qo9N9HosV0rXWATrSmOUz/fVuG3sTVYREYf8P+hVctnzjuig+fR/ptGl7Xtf7uSVvXtY2a//JD21dPraKLmry+IU0dU5Z0utzlbktBNNE1v3Kwp8RRVBP1eYuc9fVTp63atmRZfUMi1jVj4+yWeq+npfXyCdWhQqfDVlJWFff64tHp6w78ZMUqsXXxFQv33zC+MW/Isl0v/GF1x7QrNk66e31XXXtO1dTV2x96ef4c+uuOy2cMaa4IFjsdFqPRnI/vCHnL3e6WkM1eXl4dCtcitXIGB41tm7toRGswUGI1mzyu8NDBVXabxxOrLSxCm659/LiaoaEQtweQ5RGF8dQoYyg4P3XrBvdKJbIuzrlCQiWYuFbiHc88/0hU0IpWNHuwyM629liSsSCaHHbl6FmDtd66FfOSoCKieWaOKjAYYG+sXSLFdeUGT1DfY+7u9oraCkG75IFvNsumak9Jx84p0/b6A+26ifIebFUj6mruLQySWjKUjEG7bDPWMo7V0octikQHxwqwlmmr117OzDOFnfnj3DxR7ajjWJJ7Xqx2CayOOHNFKcSrMJd51GLVfWuAGpvzyIydh/ksCGgOuQXtItYVaPUE/aLdwc5dIL2VP9iV3/nCoc581+D8+tvuoP9oDYWGDQuFWmHE7NbW2a2Cp7JhUHXZ1NSWx8D36KP0o8cepx89+ij4Uh9X1EwrrRrUKFfjQAyt3lcfyrvydfolPU6/fH1NQWll0dqpdVNLDv51tmw226ChcEpd25IlbTUT60R6evyfniqZFo7PjouGfFdlfmdnfqUrvx6UUCsW39qq70OhIWW1gxqCQ1KLu/cvXXagu/vA8QPdwn01JeOGlDcIHaGWUHUy9XSiqzhcd9kLGydO3Pj8ZWjPRob5pq6tDswzwtv27Bx5zKC6JXctqR4faqbX5MytCMVns/nJUFNFqSE+ksDxYA4uZsaLfDlIGIIKRF+K4N3msKmyJ2MzBmOOhH5Tmmz32701ALPvnzNSmx0HtWZEjfzmli1vSfcjLVJn754zZ/dsWHI/XpaOzLb7bSEvLZv1k5mxrh+POHLYU1PjgU82vfTKpqXV1x7p2jVr5s6u39WGjrHrRK8jW5tBuc4n5Rn7gS+Q6f4HtkSGfJetkzkg4UIjIeFQkOln1sbQUPhDoL3bT/9A/+Dvbg/AEtnUMKLBJKt8yeKIvnx2hK1RpPaxDPRD8PMHdkilPl+pRHSf4cvIDVv7168chBhFkzEnYTNCzCHcBj2pL+h2WC5YKKYFCyxP/VPIp9tTX0APvR2u2J36MvXlbrWVvksPQnnqBfDR5+m7EIUx9CP6sLiX/hHGQvTMt/S9xavpq9CyejFvu0DIWWUktt1FRvK2q6KAqpiZRCrkgW6xMWue8Uec32ztKGFGxsiMJZ1VMkuLe2094RaQ35jRaI3OlGXFWlTjOm2QVboub7A721qWX9ZcIZz0yk5LaoWtVP6301pa9pG1WBRcouSy0H8W+3zFMDTbXqCS+fMppS1Wq63CZhYMtKEgV5TVygrZ5qiqKqErf2Evc5v7DIqMclKY58wz7Mq1+rzFwWJPjoXjFFt7YmttA63ZAQtN5HsXltIrSRzrBJRavl7H1pHQmHUg1xEjQi/z7TGLF7OnNE2T0BxGZoQcISNLWLLC2FIO97IZIbPIKuFUSBFKxHe6GaApmEwRtobXzs5JZv2Ky2EZ8ad9xhnrgLmM9ZVVxCY8kywmNB5NYh24QH5x1aoX6Rn6MT3z0sqVL8Fda96/r6vrvvfX7KJf79wJWX+EwV30GZWsfEnPxLKj3YIPvnRmZdfO458f39m1k35N38LsEqGz6H93wST4gy4fWCfC13lNeO5lOGq3iqxXPawzpW6+UqwxL8DJPZLG14fp5yf3MM605yTrk3PtyibFpEr3PSJnjNhwszBnni5W3B5PjxcbKh8rLCKj0jmNmyZgZ7fH+rgFLeI+1etE5h9I4t6paGfYFNK0M5iNZUixvbA/4KSE3YdezHl+XVxkMGnEutSi5a+KjEclLHqJniaoDUfQICqBuh+qqoRlKaFIibrsSV4GYdahw81drd9ZY+lXIBhUrFFxTqgInsEqCW4H2qeHvqvyhOT013VgTEAxykYlaUIdN5zhacQmprdM2pNOR3Az/VBPZ549FyrAasyP39MASvQ87B7faPqY2Qvku5oCMT0ggc+PaTBNvVq9GtvjRoQDB6DB0CJAAtSAN5+vf6qQsIeHIuzCn4SyWamT5U2NQW+OtV745jmhbL+/O7C/0GwufC51Yn8A036hnufy15TmGUORKdKL+1MnnvP79xe1thbuF8owecDf3T83Oc4XkBLsOxVQS7MoiHK3ZEZ2R9BqQQRDDYXYh4aG6d4X0vMH6iFr58q+lesPf3V4PdsBNvgfKzN3cOrseuFeeCd9c/16kvG3p8viLb2gOJIuKg+sdkvMY5NN8I+LykyN6n+nQdDEldR0Ubn023O1MvA+FgfEe5SQCu6L6zfTfrAeotZvZwn/R3UUcm6FI/V/1IvrNwKVBqK8T3KxTqWIbtUstoJBW9AIcayKaATe8UZgnuU4mhpx7kQVOO9C/JThDJUX0q+Q93x1GVXg9GWQA4Mhxw9r6Nbxr3/w2jh6K1wx/vVly16fmCLMbXeSvjqPY6uMT1J50erVi+E0nF68enVfJVwJqydMnTKB3kq34hFe3aM/cFKIcXQ+r84sxsXHZx0Bb5CtJyms7kgrE8xiTUDQ4oBggjUEbYkM3vs5c8QGJXS+KZEiDzynnBQA5vKW3P3zXdsv6Vj2ejus+X3oujPkOo028mbd/b9vp7bwasB73bc9sow3raVn6Mk9yxBy4DlP0Z6Twgm6l7Vp4nbvlAlw5QfwMX8DvMEauDf1Lm/4191LeBNf7Zm7nIMxCAy09DgU7H/mxsP6GQGVUS8kNdpLezVI8h0k5QvONZYnvXbL1wXOf4eB9PWKSa2vt69XE5N8JybVC841lofJqJbWKxbEsxiLHrJVGmJ+fcVNZT3IsAqRSo70O3Mj534y0QFH07GnPQYINEwhOM+mAV/TwUfPofDMCEX7EXTxrzfFTRABj5mN8wYoRd6wgxjZfLXgH8jFoBJafpD6qf8gLRfGPfecdC09kPoMxtHnBAe0geBIfcawRecLGnZtFp/tCLxB5gRHra9pfUQTccIoDDApc7ineqGXJs/xY8YXjNyfYgT8M3kYi0jhT8TfaUzz8KRetmNVJRLvv16lF58zkDzGdIwCm90OHIoaQfWjPGIf9fZpNClqqSfmClNTe7W5ybkajMf0XAVL79OgF1vO7vXN5fdy2a00f8K3syE2ZkKoVOQ5jPYgDCVT/ElWFegdiDc5OLc5g+ZxMJ6oUO4zhVGNOQFPsiBQBT4zM45QzQLR11DazpLDdPdvj8A2mAwlb6w4S2Y/9AX9hO5/ctXeVfgnZ0JRfgvzD4tkxRv0L/QpesWRJ6Edir54aHafxvNx3U5krMdZ9RXsDSeP/3GhPuE2KU7RFmQW/VOzGDwW9d3KvOiVU7891bq42eHwCd9UrrpiVSX9Xz7vfh+lf4sIs0ZpcxK+5LTueun9UWPHjjp9hM8qiLE1ECwvs25iQ2yI6LyGoQLaLglub3IkQ1BD9PUwaLA7WOODakgQOI1SvCwajv66nf7q1ekPbW0EtAoCsS3jWfATbmi+tsOQV6//dCa7Dr6pC77ijZVQlB4/FupoArQm/PEhJ4UytjDz+LGFM9kFKA+X0lree3osG48Rq8xEiOWBl3F6nFZ2Nw8V83n7A8L4XOM0mQeGcQTXWKpn4qRVOG80dmRhYSntaobtVzNsYDFggjaxZ9WkNNl6jTazM4FsZPMC7lCYbOSRQj32EMFTZVgfi5rRhChgxRfYxXKuOWZOokvokkkzd8K+G1988UZ8s0qYNllzFG/APZOOrtkFWSnni2B4kQWqMTyby/BMPsGmEJIJHyQcMucl9IR2Qj4xN0Vgr9aLY4UyaiD9XIoU4WCx8WJHA/mG6BtwRyPTbSmuCgdwBgsZhO8I4qzOY35uhwkHkTWBeUAcHlMZChiP3jCh6MOf/yxon9aM8P/+4ZtPPTZ/vbyp/rJRf05plvfHTFr45Ap2TSnF809DqzaOfIb+o4qetm9+A8Rbd4GdTrj8jUdG4/OW90f98vI1h7eVgoI3aYrZJCK2VdJ4a9i01FhMY7qeDH9YJ7D2cUn0p3OcQfOkD5/rIzyQkCHNVCFpYH2mcjuzjM1yzg/SB3BI6fVLc3q+CPX0P7BdoxZYIz2UTqzqG46CwYbhn7t7enb3yA/QMsq8pHtSJ/Vjyzx2F8WHHuphWc7jJirnswxfeJjewJkp87g8NJXwCO3n5iMicfqqyIPzBk5Gwl7FdUr63RmmnNCZMknjjvmCoz8dWaszZV39yFzxeLgSQrMRybPPxPII+7jyGPgH6cBRFqOaUUM0qZsDfJ/EyrH7OAj8CdAfpPphn06MJU6bmUbS33qGW5QswJcROkbEicps0RJuz+rqMBpvgrQfi/uYuH9ywOKlqh7a2Lq2KvTiFXtOFkqE22U7yjwbD0WqL9twck9LK5+bmgqqnI41tlsZ/w6yiREMRIeylUERablyoL39s7Yj7bSBnoA3oa3ts/ZjbTP2niV75V3tR/EWjKEN4Ga3juFZW2rHXiAMkIHpLpnRKPVc/4t6RWS9Qtyn+Dv57/KTXNcIWHjMAxKBL6hlOkxn4b/05/IT1EItnTBdg+ncD4kT7HeKpj+Dcx7JLZJaiUynP2cRvjB9OrXIT3TSn+OznfAFt+WTCqsHY3RMQQJCRKo3haymV2a6WEBqk+T5GJYkWT6sixGzcS+BkMSfxhQ2JlO9/bERIlaPRbqiBIs8VLmPyyHgDMWq6fdQttkkzdxL8wRZ4+HexCiyymuMlDEJOEMEPaib8/gCdiJrysX2n48EUbJrUOckuCVIMvYe2xIRm2/geWSAPfh950I/mUplUn3ahYn+4PJMdPn3pHjXCNwPwn0ZrM4XrcpnkIXhmKw7ZPhe940wRwnznvXxaxILztHSs13EW2kc4e9n+BW44P0RpnBtvtiAcsQYM4ThXFEae5GWKZCzMuYFzJSJFh4zjM8VvJ+ZuGd1H0LGD85wpljHYqbP5fQRPFZBYQQwBIKIz/AG8UMfDvJNn91xltzx2U0KBw7uCdePqXfupf/5RSn9N+SW/gKyGU0k+rxX0lYcw+c0ADC0GggCLuhHAQmrx8KaAeWGtxYbpwdTK8qhjVUdo0t1UBCwajp2AXPbMD2CB7d74yFHpSuNEeewp7wfe/R6fF/p6ShNkqmDPqznl8zhSIfO7yhT4N9CMF5l5B48E1va8qhcXyMQI0bgpGWR+8z+ZO6I1B9mCQE6S2AjRHHecY8cKvB9/MZ5Pqx8piZKeXAK7nwx/l0AMKjFPGcZy2bDcpWaYrORvZvF1+nzNj3mJj7iTEM0IatNSzOrWyCa4BaLwk2LZEZ0+4gYDof7DjN/FBMlTZfnM1ha4s4EszQFRMs96lx1LqniKyuqX1EtapARxaAlEJSDzH5MBBNyPCEmHIjKCYdod/gdqh3Hmgu3PazObaS/qWm2b3l7qLPl7S22plr6m8ZPDYZPG6Gutsm25e1h1mFv32pvqoU6dplu4vArnLrV3lxzLqf+gtzsJL6huUbP+qn+4lvfwheXcewmF/gYrGjPn/dVCXAnvwpxv5Ux4AQoF35fIoU3n9qyaYNwaEwf4anUyDEXfWySOrzl1OYxqZEbNrGjcGjDRfyh+JxeKc/YFQiobPaz6S7r3CGlHxgLQhgmTGgklB79qj6532E6mM3uc7Ki8yiTzhLZ1Yyql4kO1Yxb93MunpN9laN/mdP/vUcG5/VwKBFvnmbFkwzeD1h/yORFMmRh4ql/Y6OXmOIKov/bFDLg2xQsLf1tigg8eN7wvZhLBmCu7gRPY10adLFzDAiAp/UZi/tvMqDLqypyPGLvV9C6YpjLMdV4XjGe9G9AcUIaXIX+IoFXG6d+pmj+lQ/2v6hliseHsN2s9f3VuFDuLBfKnZRZpIux+N4IMrcL5U5YrKP9Xtqr7b1I4MK8mL52Bi00rcfOK8/x3V9PMc560RdUqYG89YKCzhw+z448r4zId5ehr1zjrHLw5WoGtOxXCpEYj+j6nvLhFX9Hx13P/Wz2TQsripyFRdERxc53TeaRU76vTkJD4+RVyWGXPDe6oKDEV1LsHVxdNazBW2q1VUfT3xnoNq8u1eynotwwRwXH3BPUjcPmhhMX5GUZjSxvCkdeIsxhz/Iy5kPdzJ+R8YMwpmMmdnwigoZBxIJb0Oe3oGUXKWZJhVGNFHt5J3TQ/3e8Ukt93sl9kVrnUDyTeV24H5NnTKf5mo6Kc+db5Sq2ksEs0BbBXgaJFnChtsbKrx/bFLzxhZfHPvDA2Jef31jRPBZF9rKRv3rzvpbBI++9d+TglvveenUk9zMsghPqTsWNM1j/0oz5v0RQLaKDObSDwtLj9AjUHD8iHTl+5MhxqDnT/Q2Qb+SGbcihG7ZBA7y5jb5J39wGb9KyFom0MJuM26dpP1ARW/0xCjFUtGjFXRQQHTsXwK47iRREFZGHgqvnvO4xpt91F63MYYR583CHVPZcDu7T73f6XlyP0h+uh+2Hy0/9XyVr5DvKLPuBMi2o/oPqD5XaB6/Nojv2d/1QySg+r3WxTAxF0zIqox7Dck1GgQUtmIKowpg/zSRwrycDYJGgHtrR9uLCsxyP5STzjtJeLsLsYz16bEfbOKrp5+l4CR3X83iM+MC3yhe8i3zH8+d8DyLrk4wu8vLgKNFnCvMAC44eEhfyUSvb21eOGr2sJdLg8zVEWpaN5leA95SMM49ZpGwT+1MDMI7zo2zmpYE0iPMSWby2J8iX6oF7RhhwSxqbWA31q1JklT9SxMy8FFePUvqThPatiZ6e8lmXhrWB3In7Gi4cUhbg6MbOkT0x/tmiwg3hPr7ffArspzazVVLkHdJ5Y6jpkbWapn/fwHSxPB3bUECcPP7Yw1FSUW08BMXnYa44BqGVUKQnfaiTFn+1cuW8Scvn/eVXdDKQ6xfOrKu7fM32y+a+q2ijRv5k8Y15atFNK+9/Rnh+yOjW0lLaQo+Nn3QbSfvRiZxZH/aJEdWTiFh8CY88Q/tSq6DJCnZA85IbVFxzpn3eGucW2QyDWD9nAkvAFGSBpZxdwP60PkbB7T3LsVLS6UrfO0KyNzUX3ExAjP1x44w3GEkOj9+24Qii7reYPBb24QSTtkEAumdY9RsBTXpNN25A+5aPme5uAd3FrH2rcSKM53KaGFMsPeN4YSMMGmdRGjczmLNNO19Pmsl/na/DHEFFHcrDR4OJGiEfaoShqmMolEGgBvKl4FBwJIJDhUBQdeBfvsgy4SnqugTCM8+YyBfK8BomyiAfEmoZqIl8Q7ASTxwJfKHkUGtkhYWfOmrkoQIS56ECPi2pmFXENzryUeouVJF5opglm1wCeQ2SbUq+r6iwPloRBJBlR64l1x8oHu4szHXIeaUOZ6RQzK0xFNoq8setlqweyWZoHt+sFOSE7O6RrqXz338qUOv21biUkuza9vJEbrDYa/F4jKXZ1vb4YDkvO1TgLMvzObPcTkNhKFinlDbmDwpWocFoAIOcJYPT9aMPNklZ2cPdWWqewZBvzW0OCvmWEXVeo8FjqKktExwl4Ypyk+CRBl+kuP8jKRZk2H0Tfv90VqTIYLGJpXF3QjX78qxOH2Sp/qzmuKwKdl+2scIp2p1Ge/b6dsEkZwnGLF9ps8dmNRlM4L8ZcgwGRTWLDrnINjjfXOINOEzmrITVYs8xFagWi5xvslgLnc3O2opKt6vSaTRPrC1oNWWZchzloQVT76Bnny3PuWVoa31JQaxFzjaquebiItXutch1xoJsydI4bERZl+wwORWuQ/eKbnWulPFBXsTj+/m875c33PDLG0Rx4EE6cQM/DvhLf1PI/C69DNVR5g3kG03sFfv9NXhiYHOFxEwg9iLq9yXZM1KSr2XhdeQa/KqB9CW5HyeZXucSOH9hl/V3DvQBVJBaUq9/C65HLiEn8+jfhKe//jEhY4sPgfSl8vSEl9LEDpGmkX/pfZY0jmK2cGPg6pu6d/B0n74WKbSnA0ZGrfE+yPRGtyb5vGtHMuQLdbY6qH30ju4HvWtG4QU7z7s/Q5iVftvi/P9XIK1LMos7mW/kgejapI8wA15EBU75FZGBBLOccKMkkwLOw/Q0x7cExwCN5OrrIUYRbWIItkh8xdTnDUIsGFDyQWGxXA7d3VgG51w0BD7DAv/t94MfeJSf+Os4tiNODySdXf5x/m5/vqDl+zGV70xqT8cCgZhf1agDaWeuvzsA5aJsGz1l42kaG9feHYc2LenMx8z6U92Y6nImU//Bh/wxQgZ+pzmCjCMdZDZZyNeM0jGBLZBgQYEeU/8VFmPLhnfABf6J4LnRZl4fPGZAvT/y54Kj2j/U7bH0sI9qPIsaL51kqznpJAuiSeli0Jc2084/zNHHnQvCg0iqPkqfj1zrBV977MG0nODpg3tOQkZsUJLoRyf3pNXK6fYBxnB7RnYE7JOTalLp5etpRF+XjxgFEdmugy2PZuas/Kivp1XMFuiqszqTpMf+OppHBuBPX4iSV8dahL4TApceNAenr97GXGLsXPhpegVPgBU4p+7EOeXhay0OHh2QcIHD5ItFYgM62Rax+UwtkOlmmd61mD5IF9IHF9816vXVmpbuO01b/Tr9sd5Nh2c+9ut3Hp3ZtsgC/9EePNcLD2o023KZmEo3WkjLBCETUB50j1cl+57aXAqsrUMgGmRLfOVBpf+COREI+nRvWDQRMPFa4k2X4G4RWFwcOytQ7TY//wSVO8vyBJUvEryX6501PxANXD+Lfr3zJ/Q/M2/AkwUzPXnvsbu9pffj6WWPfwHSF49fhsldJSltZ2rIrH9t6nrijqaKLb/kiwrD2hbTs1v5+5LHH1t3y+Z1jx/Tz7YCLB7bilkmzT0Mgn7tenwVvvJ6/YyePdzVqf1887zlka7krFsmZHxd2oC1bMGTRgtZ0116bN4zniJxxsDGkDIEgH4OwLiNPWLyVgHJQivB6lDtxCG/df99R+gV9Cn6lzdWCKT7pUUQPiRGIpSseANKYDJsO/LF8Zeeof+YwuvwBspCI/9/Nkp53BnnipxEWxMRRWDu1YAQjLjAHZcm7enpmRidGXmh1/rVM2fJM19Zex3vQ/ExUeuZKJCJPZGZUUomFRykXw6iX0LBICg4uPngwXRMs4gtHbimJpP0mtq5b9QdGQ8Od3yaBqbVdJ8M2HMCldkz6vRd1yH9XMZO4P2dnfluTv+xcAGGt8yXzoi1nmL9zb/ZI7xuRraKBqJHFv345xFRifHIBY9E1tKtULUW7ejoOqiiW9ceFZ5Ivf9+6njq+Pup94Un5E/oT35H93z4Icz7nYhmCP1R6ka4ha4VfgQ3Zv5PgUwZmXgITzGgCT/gJUePork/4MH0YtzA+uUPfFrklbzwHUczVbz4ZbSC1Q8Wp2P3uK1mR4ZfyfxPRpQutprNcdrDo82Z3KmBIMIyuwvhhN3BfNYKH9Oz3OzqZoPBE7PGDJp+wx591beP6GeUcWMOZFwtA0n/hyxN18zv0q9TnoYLvz8MoCE/47uiNvkn5QEP/2KAfy4QcTvsCd0cKfcNuByWHHZLmC0k6zf457L9dzLf9w/85EhcYfeYzB/T3//0ydqyImHwjo1gfNN2RemgQRvp/qeferZ+UKnRt/Wen0Kgp0RzBApr7qRXH/77oeLyunJDYM+bv4S564ou/IiJl3JmsbuwsCj75gpj1OExlK3L+2JQaa1j0rS6/CbXoGz/+OEFaBkGChPO6Z0JQ6W3PJxVOXFM3oD+EHnEaBGTaB//Txb4grvoy7ANWwIldJdQsqvvUmUIraYPfP4XSpSFp8/ApZ/B4/LjtBqOsg2OnXmJDmckQ3orNVyceWbH0aMca9L+ovQa8kCLkqlg3ag5L/qSmzNs9vErfP//ATHKtuMAAHjajZA9TgMxEIWfyY9EhBBFDuAKhSKON0m10EUKUgRt+vx4ky3wRruOktByFlpKuAT0nICOO/DWsUBICFhrPd+8Gc+MDeAYDxDYfxe4DSzQwEvgA9TxFriCU3EeuIqG2Aau4UTcB65Tf2amqB7S2/pTJQs08RT4AEd4DVzBFd4DV9EU08A1SHEXuE79EQPkMJjAcZ9DYood9xEy+pa0QcrYkjSkZsmlzbFgXKILBU3bYobjWiFGhysJuclnrkJBT1E11M+AQW4mzszldCdHmbFyk7qlHGbWDbN8YWRXadlaOreKO52EalKqqkiUNY6nL/14hsVTzHyzgqKxJk9nmSVf+/ukWOOGjpmna9rfrhDz/6nqPtJDGxHz2szXpD6LfZs1ll/d6fTakW53ddT/x6hjHywYzvyTa99BeVtOhrHJizSzUutIaa3l3zU/ABw5cLgAAAB42l3SZ5MVVRSF4fuOBEmCiZyDiInb5+zTPYOkgWEIEpUgQUkShpyVoCA5Jy3/LlBz3/ED/WVVdVU/1XvVanW1Bp83rdbRd0Hr/ee/wbdddPEBwxjOCEbyIaMYzRjGMo6PGM8EPuYTPuUzPmcik5jMFKYyjenMYCazmM0c5jKP+SzgCxbyJYv4iq/5hm/5jsW0qUhkgkJNQzc9LOF7lrKM5axgJb2sYjV9rKGftaxjPRv4gY1sYjNb2Mo2fuQntrODneziZ3azh73s4xd+ZT8HOMghDvMbRzjKMY4zwAlOcorTnOEs5zjPBS5yictc4Xf+4CrXuM4N/uQvbnKLv7nNHe5yj/s84CGPeMwTnvKM57zgJa94zT/8O/LymYH+qt02KzOZ2QyzmLXZmN1mz2AmvaSX9JJe0kt6SS/pJb005FV6lV6lV+lVepVepVfpVXqVXtJLekkv6SW9pJc6Xvau7F3Zu7J3Ze/K3pXbQ981Zuc/Qid0Qid0Qid0Qid04n+nc0/YT9hP2E/YT9hP2E/YT9hP2E/YT9hP2E/YT9hP2E/YT9hPJL2kl/SyXtbLelkv62W9rJf1sl7WC73QC73QC73QC73QC73QK3pFr+gVvaJX9Ipe0St6Ra/Wq/VqvVqv1qv1ar1ar9ar9Rq9Rq/Ra/QavUav6XjFnRV3VtxZcWfFnRV3VtpD3zVmt9lj9pqrzNVmn7nG7O+kuyzusrjL4i6LuyzusrjLUjVvAQpVcTgAAAAAAAAB//8AAnjaY2BgYGQAgjO2i86D6AshzNIwGgBAmQUAAAA=) format('woff'),\n         url('Genericons.ttf') format('truetype'),\n         url('Genericons.svg#genericonsregular') format('svg');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n  @font-face {\n    font-family: \"Genericons\";\n    src: url(\"./Genericons.svg#Genericons\") format(\"svg\");\n  }\n}\n\n\n/**\n * All Genericons\n */\n\n.genericon {\n\tfont-size: 16px;\n\tvertical-align: top;\n\ttext-align: center;\n\t-moz-transition: color .1s ease-in 0;\n\t-webkit-transition: color .1s ease-in 0;\n\tdisplay: inline-block;\n\tfont-family: \"Genericons\";\n\tfont-style: normal;\n\tfont-weight: normal;\n\tfont-variant: normal;\n\tline-height: 1;\n\ttext-decoration: inherit;\n\ttext-transform: none;\n\t-moz-osx-font-smoothing: grayscale;\n\t-webkit-font-smoothing: antialiased;\n\tspeak: none;\n}\n\n\n/**\n * Individual icons\n */\n\n.genericon-404:before { content: \"\\f423\"; }\n.genericon-activity:before { content: \"\\f508\"; }\n.genericon-anchor:before { content: \"\\f509\"; }\n.genericon-aside:before { content: \"\\f101\"; }\n.genericon-attachment:before { content: \"\\f416\"; }\n.genericon-audio:before { content: \"\\f109\"; }\n.genericon-bold:before { content: \"\\f471\"; }\n.genericon-book:before { content: \"\\f444\"; }\n.genericon-bug:before { content: \"\\f50a\"; }\n.genericon-cart:before { content: \"\\f447\"; }\n.genericon-category:before { content: \"\\f301\"; }\n.genericon-chat:before { content: \"\\f108\"; }\n.genericon-checkmark:before { content: \"\\f418\"; }\n.genericon-close:before { content: \"\\f405\"; }\n.genericon-close-alt:before { content: \"\\f406\"; }\n.genericon-cloud:before { content: \"\\f426\"; }\n.genericon-cloud-download:before { content: \"\\f440\"; }\n.genericon-cloud-upload:before { content: \"\\f441\"; }\n.genericon-code:before { content: \"\\f462\"; }\n.genericon-codepen:before { content: \"\\f216\"; }\n.genericon-cog:before { content: \"\\f445\"; }\n.genericon-collapse:before { content: \"\\f432\"; }\n.genericon-comment:before { content: \"\\f300\"; }\n.genericon-day:before { content: \"\\f305\"; }\n.genericon-digg:before { content: \"\\f221\"; }\n.genericon-document:before { content: \"\\f443\"; }\n.genericon-dot:before { content: \"\\f428\"; }\n.genericon-downarrow:before { content: \"\\f502\"; }\n.genericon-download:before { content: \"\\f50b\"; }\n.genericon-draggable:before { content: \"\\f436\"; }\n.genericon-dribbble:before { content: \"\\f201\"; }\n.genericon-dropbox:before { content: \"\\f225\"; }\n.genericon-dropdown:before { content: \"\\f433\"; }\n.genericon-dropdown-left:before { content: \"\\f434\"; }\n.genericon-edit:before { content: \"\\f411\"; }\n.genericon-ellipsis:before { content: \"\\f476\"; }\n.genericon-expand:before { content: \"\\f431\"; }\n.genericon-external:before { content: \"\\f442\"; }\n.genericon-facebook:before { content: \"\\f203\"; }\n.genericon-facebook-alt:before { content: \"\\f204\"; }\n.genericon-fastforward:before { content: \"\\f458\"; }\n.genericon-feed:before { content: \"\\f413\"; }\n.genericon-flag:before { content: \"\\f468\"; }\n.genericon-flickr:before { content: \"\\f211\"; }\n.genericon-foursquare:before { content: \"\\f226\"; }\n.genericon-fullscreen:before { content: \"\\f474\"; }\n.genericon-gallery:before { content: \"\\f103\"; }\n.genericon-github:before { content: \"\\f200\"; }\n.genericon-googleplus:before { content: \"\\f206\"; }\n.genericon-googleplus-alt:before { content: \"\\f218\"; }\n.genericon-handset:before { content: \"\\f50c\"; }\n.genericon-heart:before { content: \"\\f461\"; }\n.genericon-help:before { content: \"\\f457\"; }\n.genericon-hide:before { content: \"\\f404\"; }\n.genericon-hierarchy:before { content: \"\\f505\"; }\n.genericon-home:before { content: \"\\f409\"; }\n.genericon-image:before { content: \"\\f102\"; }\n.genericon-info:before { content: \"\\f455\"; }\n.genericon-instagram:before { content: \"\\f215\"; }\n.genericon-italic:before { content: \"\\f472\"; }\n.genericon-key:before { content: \"\\f427\"; }\n.genericon-leftarrow:before { content: \"\\f503\"; }\n.genericon-link:before { content: \"\\f107\"; }\n.genericon-linkedin:before { content: \"\\f207\"; }\n.genericon-linkedin-alt:before { content: \"\\f208\"; }\n.genericon-location:before { content: \"\\f417\"; }\n.genericon-lock:before { content: \"\\f470\"; }\n.genericon-mail:before { content: \"\\f410\"; }\n.genericon-maximize:before { content: \"\\f422\"; }\n.genericon-menu:before { content: \"\\f419\"; }\n.genericon-microphone:before { content: \"\\f50d\"; }\n.genericon-minimize:before { content: \"\\f421\"; }\n.genericon-minus:before { content: \"\\f50e\"; }\n.genericon-month:before { content: \"\\f307\"; }\n.genericon-move:before { content: \"\\f50f\"; }\n.genericon-next:before { content: \"\\f429\"; }\n.genericon-notice:before { content: \"\\f456\"; }\n.genericon-paintbrush:before { content: \"\\f506\"; }\n.genericon-path:before { content: \"\\f219\"; }\n.genericon-pause:before { content: \"\\f448\"; }\n.genericon-phone:before { content: \"\\f437\"; }\n.genericon-picture:before { content: \"\\f473\"; }\n.genericon-pinned:before { content: \"\\f308\"; }\n.genericon-pinterest:before { content: \"\\f209\"; }\n.genericon-pinterest-alt:before { content: \"\\f210\"; }\n.genericon-play:before { content: \"\\f452\"; }\n.genericon-plugin:before { content: \"\\f439\"; }\n.genericon-plus:before { content: \"\\f510\"; }\n.genericon-pocket:before { content: \"\\f224\"; }\n.genericon-polldaddy:before { content: \"\\f217\"; }\n.genericon-portfolio:before { content: \"\\f460\"; }\n.genericon-previous:before { content: \"\\f430\"; }\n.genericon-print:before { content: \"\\f469\"; }\n.genericon-quote:before { content: \"\\f106\"; }\n.genericon-rating-empty:before { content: \"\\f511\"; }\n.genericon-rating-full:before { content: \"\\f512\"; }\n.genericon-rating-half:before { content: \"\\f513\"; }\n.genericon-reddit:before { content: \"\\f222\"; }\n.genericon-refresh:before { content: \"\\f420\"; }\n.genericon-reply:before { content: \"\\f412\"; }\n.genericon-reply-alt:before { content: \"\\f466\"; }\n.genericon-reply-single:before { content: \"\\f467\"; }\n.genericon-rewind:before { content: \"\\f459\"; }\n.genericon-rightarrow:before { content: \"\\f501\"; }\n.genericon-search:before { content: \"\\f400\"; }\n.genericon-send-to-phone:before { content: \"\\f438\"; }\n.genericon-send-to-tablet:before { content: \"\\f454\"; }\n.genericon-share:before { content: \"\\f415\"; }\n.genericon-show:before { content: \"\\f403\"; }\n.genericon-shuffle:before { content: \"\\f514\"; }\n.genericon-sitemap:before { content: \"\\f507\"; }\n.genericon-skip-ahead:before { content: \"\\f451\"; }\n.genericon-skip-back:before { content: \"\\f450\"; }\n.genericon-skype:before { content: \"\\f220\"; }\n.genericon-spam:before { content: \"\\f424\"; }\n.genericon-spotify:before { content: \"\\f515\"; }\n.genericon-standard:before { content: \"\\f100\"; }\n.genericon-star:before { content: \"\\f408\"; }\n.genericon-status:before { content: \"\\f105\"; }\n.genericon-stop:before { content: \"\\f449\"; }\n.genericon-stumbleupon:before { content: \"\\f223\"; }\n.genericon-subscribe:before { content: \"\\f463\"; }\n.genericon-subscribed:before { content: \"\\f465\"; }\n.genericon-summary:before { content: \"\\f425\"; }\n.genericon-tablet:before { content: \"\\f453\"; }\n.genericon-tag:before { content: \"\\f302\"; }\n.genericon-time:before { content: \"\\f303\"; }\n.genericon-top:before { content: \"\\f435\"; }\n.genericon-trash:before { content: \"\\f407\"; }\n.genericon-tumblr:before { content: \"\\f214\"; }\n.genericon-twitch:before { content: \"\\f516\"; }\n.genericon-twitter:before { content: \"\\f202\"; }\n.genericon-unapprove:before { content: \"\\f446\"; }\n.genericon-unsubscribe:before { content: \"\\f464\"; }\n.genericon-unzoom:before { content: \"\\f401\"; }\n.genericon-uparrow:before { content: \"\\f500\"; }\n.genericon-user:before { content: \"\\f304\"; }\n.genericon-video:before { content: \"\\f104\"; }\n.genericon-videocamera:before { content: \"\\f517\"; }\n.genericon-vimeo:before { content: \"\\f212\"; }\n.genericon-warning:before { content: \"\\f414\"; }\n.genericon-website:before { content: \"\\f475\"; }\n.genericon-week:before { content: \"\\f306\"; }\n.genericon-wordpress:before { content: \"\\f205\"; }\n.genericon-xpost:before { content: \"\\f504\"; }\n.genericon-youtube:before { content: \"\\f213\"; }\n.genericon-zoom:before { content: \"\\f402\"; }\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/header.php",
    "content": "<?php\n/**\n * The template for displaying the header\n *\n * Displays all of the head element and everything up until the \"site-content\" div.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n?><!DOCTYPE html>\n<html <?php language_attributes(); ?> class=\"no-js\">\n<head>\n\t<meta charset=\"<?php bloginfo( 'charset' ); ?>\">\n\t<meta name=\"viewport\" content=\"width=device-width\">\n\t<link rel=\"profile\" href=\"http://gmpg.org/xfn/11\">\n\t<link rel=\"pingback\" href=\"<?php bloginfo( 'pingback_url' ); ?>\">\n\t<!--[if lt IE 9]>\n\t<script src=\"<?php echo esc_url( get_template_directory_uri() ); ?>/js/html5.js\"></script>\n\t<![endif]-->\n\t<?php wp_head(); ?>\n</head>\n\n<body <?php body_class(); ?>>\n<div id=\"page\" class=\"hfeed site\">\n\t<a class=\"skip-link screen-reader-text\" href=\"#content\"><?php _e( 'Skip to content', 'twentyfifteen' ); ?></a>\n\n\t<div id=\"sidebar\" class=\"sidebar\">\n\t\t<header id=\"masthead\" class=\"site-header\" role=\"banner\">\n\t\t\t<div class=\"site-branding\">\n\t\t\t\t<?php\n\t\t\t\t\tif ( is_front_page() && is_home() ) : ?>\n\t\t\t\t\t\t<h1 class=\"site-title\"><a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" rel=\"home\"><?php bloginfo( 'name' ); ?></a></h1>\n\t\t\t\t\t<?php else : ?>\n\t\t\t\t\t\t<p class=\"site-title\"><a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" rel=\"home\"><?php bloginfo( 'name' ); ?></a></p>\n\t\t\t\t\t<?php endif;\n\n\t\t\t\t\t$description = get_bloginfo( 'description', 'display' );\n\t\t\t\t\tif ( $description || is_customize_preview() ) : ?>\n\t\t\t\t\t\t<p class=\"site-description\"><?php echo $description; ?></p>\n\t\t\t\t\t<?php endif;\n\t\t\t\t?>\n\t\t\t\t<button class=\"secondary-toggle\"><?php _e( 'Menu and widgets', 'twentyfifteen' ); ?></button>\n\t\t\t</div><!-- .site-branding -->\n\t\t</header><!-- .site-header -->\n\n\t\t<?php get_sidebar(); ?>\n\t</div><!-- .sidebar -->\n\n\t<div id=\"content\" class=\"site-content\">\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/image.php",
    "content": "<?php\n/**\n * The template for displaying image attachments\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t\t<?php\n\t\t\t\t// Start the loop.\n\t\t\t\twhile ( have_posts() ) : the_post();\n\t\t\t?>\n\n\t\t\t\t<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\n\t\t\t\t\t<nav id=\"image-navigation\" class=\"navigation image-navigation\">\n\t\t\t\t\t\t<div class=\"nav-links\">\n\t\t\t\t\t\t\t<div class=\"nav-previous\"><?php previous_image_link( false, __( 'Previous Image', 'twentyfifteen' ) ); ?></div><div class=\"nav-next\"><?php next_image_link( false, __( 'Next Image', 'twentyfifteen' ) ); ?></div>\n\t\t\t\t\t\t</div><!-- .nav-links -->\n\t\t\t\t\t</nav><!-- .image-navigation -->\n\n\t\t\t\t\t<header class=\"entry-header\">\n\t\t\t\t\t\t<?php the_title( '<h1 class=\"entry-title\">', '</h1>' ); ?>\n\t\t\t\t\t</header><!-- .entry-header -->\n\n\t\t\t\t\t<div class=\"entry-content\">\n\n\t\t\t\t\t\t<div class=\"entry-attachment\">\n\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Filter the default Twenty Fifteen image attachment size.\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t * @since Twenty Fifteen 1.0\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t * @param string $image_size Image size. Default 'large'.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\t$image_size = apply_filters( 'twentyfifteen_attachment_size', 'large' );\n\n\t\t\t\t\t\t\t\techo wp_get_attachment_image( get_the_ID(), $image_size );\n\t\t\t\t\t\t\t?>\n\n\t\t\t\t\t\t\t<?php if ( has_excerpt() ) : ?>\n\t\t\t\t\t\t\t\t<div class=\"entry-caption\">\n\t\t\t\t\t\t\t\t\t<?php the_excerpt(); ?>\n\t\t\t\t\t\t\t\t</div><!-- .entry-caption -->\n\t\t\t\t\t\t\t<?php endif; ?>\n\n\t\t\t\t\t\t</div><!-- .entry-attachment -->\n\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\tthe_content();\n\t\t\t\t\t\t\twp_link_pages( array(\n\t\t\t\t\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfifteen' ) . '</span>',\n\t\t\t\t\t\t\t\t'after'       => '</div>',\n\t\t\t\t\t\t\t\t'link_before' => '<span>',\n\t\t\t\t\t\t\t\t'link_after'  => '</span>',\n\t\t\t\t\t\t\t\t'pagelink'    => '<span class=\"screen-reader-text\">' . __( 'Page', 'twentyfifteen' ) . ' </span>%',\n\t\t\t\t\t\t\t\t'separator'   => '<span class=\"screen-reader-text\">, </span>',\n\t\t\t\t\t\t\t) );\n\t\t\t\t\t\t?>\n\t\t\t\t\t</div><!-- .entry-content -->\n\n\t\t\t\t\t<footer class=\"entry-footer\">\n\t\t\t\t\t\t<?php twentyfifteen_entry_meta(); ?>\n\t\t\t\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfifteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t\t\t\t</footer><!-- .entry-footer -->\n\n\t\t\t\t</article><!-- #post-## -->\n\n\t\t\t\t<?php\n\t\t\t\t\t// If comments are open or we have at least one comment, load up the comment template\n\t\t\t\t\tif ( comments_open() || get_comments_number() ) :\n\t\t\t\t\t\tcomments_template();\n\t\t\t\t\tendif;\n\n\t\t\t\t\t// Previous/next post navigation.\n\t\t\t\t\tthe_post_navigation( array(\n\t\t\t\t\t\t'prev_text' => _x( '<span class=\"meta-nav\">Published in</span><span class=\"post-title\">%title</span>', 'Parent post link', 'twentyfifteen' ),\n\t\t\t\t\t) );\n\n\t\t\t\t// End the loop.\n\t\t\t\tendwhile;\n\t\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</div><!-- .content-area -->\n\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/inc/back-compat.php",
    "content": "<?php\n/**\n * Twenty Fifteen back compat functionality\n *\n * Prevents Twenty Fifteen from running on WordPress versions prior to 4.1,\n * since this theme is not meant to be backward compatible beyond that and\n * relies on many newer functions and markup changes introduced in 4.1.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\n/**\n * Prevent switching to Twenty Fifteen on old versions of WordPress.\n *\n * Switches to the default theme.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_switch_theme() {\n\tswitch_theme( WP_DEFAULT_THEME, WP_DEFAULT_THEME );\n\tunset( $_GET['activated'] );\n\tadd_action( 'admin_notices', 'twentyfifteen_upgrade_notice' );\n}\nadd_action( 'after_switch_theme', 'twentyfifteen_switch_theme' );\n\n/**\n * Add message for unsuccessful theme switch.\n *\n * Prints an update nag after an unsuccessful attempt to switch to\n * Twenty Fifteen on WordPress versions prior to 4.1.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_upgrade_notice() {\n\t$message = sprintf( __( 'Twenty Fifteen requires at least WordPress version 4.1. You are running version %s. Please upgrade and try again.', 'twentyfifteen' ), $GLOBALS['wp_version'] );\n\tprintf( '<div class=\"error\"><p>%s</p></div>', $message );\n}\n\n/**\n * Prevent the Customizer from being loaded on WordPress versions prior to 4.1.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_customize() {\n\twp_die( sprintf( __( 'Twenty Fifteen requires at least WordPress version 4.1. You are running version %s. Please upgrade and try again.', 'twentyfifteen' ), $GLOBALS['wp_version'] ), '', array(\n\t\t'back_link' => true,\n\t) );\n}\nadd_action( 'load-customize.php', 'twentyfifteen_customize' );\n\n/**\n * Prevent the Theme Preview from being loaded on WordPress versions prior to 4.1.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_preview() {\n\tif ( isset( $_GET['preview'] ) ) {\n\t\twp_die( sprintf( __( 'Twenty Fifteen requires at least WordPress version 4.1. You are running version %s. Please upgrade and try again.', 'twentyfifteen' ), $GLOBALS['wp_version'] ) );\n\t}\n}\nadd_action( 'template_redirect', 'twentyfifteen_preview' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/inc/custom-header.php",
    "content": "<?php\n/**\n * Custom Header functionality for Twenty Fifteen\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\n/**\n * Set up the WordPress core custom header feature.\n *\n * @uses twentyfifteen_header_style()\n */\nfunction twentyfifteen_custom_header_setup() {\n\t$color_scheme        = twentyfifteen_get_color_scheme();\n\t$default_text_color  = trim( $color_scheme[4], '#' );\n\n\t/**\n\t * Filter Twenty Fifteen custom-header support arguments.\n\t *\n\t * @since Twenty Fifteen 1.0\n\t *\n\t * @param array $args {\n\t *     An array of custom-header support arguments.\n\t *\n\t *     @type string $default_text_color     Default color of the header text.\n\t *     @type int    $width                  Width in pixels of the custom header image. Default 954.\n\t *     @type int    $height                 Height in pixels of the custom header image. Default 1300.\n\t *     @type string $wp-head-callback       Callback function used to styles the header image and text\n\t *                                          displayed on the blog.\n\t * }\n\t */\n\tadd_theme_support( 'custom-header', apply_filters( 'twentyfifteen_custom_header_args', array(\n\t\t'default-text-color'     => $default_text_color,\n\t\t'width'                  => 954,\n\t\t'height'                 => 1300,\n\t\t'wp-head-callback'       => 'twentyfifteen_header_style',\n\t) ) );\n}\nadd_action( 'after_setup_theme', 'twentyfifteen_custom_header_setup' );\n\n/**\n * Convert HEX to RGB.\n *\n * @since Twenty Fifteen 1.0\n *\n * @param string $color The original color, in 3- or 6-digit hexadecimal form.\n * @return array Array containing RGB (red, green, and blue) values for the given\n *               HEX code, empty array otherwise.\n */\nfunction twentyfifteen_hex2rgb( $color ) {\n\t$color = trim( $color, '#' );\n\n\tif ( strlen( $color ) == 3 ) {\n\t\t$r = hexdec( substr( $color, 0, 1 ).substr( $color, 0, 1 ) );\n\t\t$g = hexdec( substr( $color, 1, 1 ).substr( $color, 1, 1 ) );\n\t\t$b = hexdec( substr( $color, 2, 1 ).substr( $color, 2, 1 ) );\n\t} else if ( strlen( $color ) == 6 ) {\n\t\t$r = hexdec( substr( $color, 0, 2 ) );\n\t\t$g = hexdec( substr( $color, 2, 2 ) );\n\t\t$b = hexdec( substr( $color, 4, 2 ) );\n\t} else {\n\t\treturn array();\n\t}\n\n\treturn array( 'red' => $r, 'green' => $g, 'blue' => $b );\n}\n\nif ( ! function_exists( 'twentyfifteen_header_style' ) ) :\n/**\n * Styles the header image and text displayed on the blog.\n *\n * @since Twenty Fifteen 1.0\n *\n * @see twentyfifteen_custom_header_setup()\n */\nfunction twentyfifteen_header_style() {\n\t$header_image = get_header_image();\n\n\t// If no custom options for text are set, let's bail.\n\tif ( empty( $header_image ) && display_header_text() ) {\n\t\treturn;\n\t}\n\n\t// If we get this far, we have custom styles. Let's do this.\n\t?>\n\t<style type=\"text/css\" id=\"twentyfifteen-header-css\">\n\t<?php\n\t\t// Short header for when there is no Custom Header and Header Text is hidden.\n\t\tif ( empty( $header_image ) && ! display_header_text() ) :\n\t?>\n\t\t.site-header {\n\t\t\tpadding-top: 14px;\n\t\t\tpadding-bottom: 14px;\n\t\t}\n\n\t\t.site-branding {\n\t\t\tmin-height: 42px;\n\t\t}\n\n\t\t@media screen and (min-width: 46.25em) {\n\t\t\t.site-header {\n\t\t\t\tpadding-top: 21px;\n\t\t\t\tpadding-bottom: 21px;\n\t\t\t}\n\t\t\t.site-branding {\n\t\t\t\tmin-height: 56px;\n\t\t\t}\n\t\t}\n\t\t@media screen and (min-width: 55em) {\n\t\t\t.site-header {\n\t\t\t\tpadding-top: 25px;\n\t\t\t\tpadding-bottom: 25px;\n\t\t\t}\n\t\t\t.site-branding {\n\t\t\t\tmin-height: 62px;\n\t\t\t}\n\t\t}\n\t\t@media screen and (min-width: 59.6875em) {\n\t\t\t.site-header {\n\t\t\t\tpadding-top: 0;\n\t\t\t\tpadding-bottom: 0;\n\t\t\t}\n\t\t\t.site-branding {\n\t\t\t\tmin-height: 0;\n\t\t\t}\n\t\t}\n\t<?php\n\t\tendif;\n\n\t\t// Has a Custom Header been added?\n\t\tif ( ! empty( $header_image ) ) :\n\t?>\n\t\t.site-header {\n\n\t\t\t/*\n\t\t\t * No shorthand so the Customizer can override individual properties.\n\t\t\t * @see https://core.trac.wordpress.org/ticket/31460\n\t\t\t */\n\t\t\tbackground-image: url(<?php header_image(); ?>);\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-position: 50% 50%;\n\t\t\t-webkit-background-size: cover;\n\t\t\t-moz-background-size:    cover;\n\t\t\t-o-background-size:      cover;\n\t\t\tbackground-size:         cover;\n\t\t}\n\n\t\t@media screen and (min-width: 59.6875em) {\n\t\t\tbody:before {\n\n\t\t\t\t/*\n\t\t\t\t * No shorthand so the Customizer can override individual properties.\n\t\t\t\t * @see https://core.trac.wordpress.org/ticket/31460\n\t\t\t\t */\n\t\t\t\tbackground-image: url(<?php header_image(); ?>);\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-position: 100% 50%;\n\t\t\t\t-webkit-background-size: cover;\n\t\t\t\t-moz-background-size:    cover;\n\t\t\t\t-o-background-size:      cover;\n\t\t\t\tbackground-size:         cover;\n\t\t\t\tborder-right: 0;\n\t\t\t}\n\n\t\t\t.site-header {\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\t\t}\n\t<?php\n\t\tendif;\n\n\t\t// Has the text been hidden?\n\t\tif ( ! display_header_text() ) :\n\t?>\n\t\t.site-title,\n\t\t.site-description {\n\t\t\tclip: rect(1px, 1px, 1px, 1px);\n\t\t\tposition: absolute;\n\t\t}\n\t<?php endif; ?>\n\t</style>\n\t<?php\n}\nendif; // twentyfifteen_header_style\n\n/**\n * Enqueues front-end CSS for the header background color.\n *\n * @since Twenty Fifteen 1.0\n *\n * @see wp_add_inline_style()\n */\nfunction twentyfifteen_header_background_color_css() {\n\t$color_scheme            = twentyfifteen_get_color_scheme();\n\t$default_color           = $color_scheme[1];\n\t$header_background_color = get_theme_mod( 'header_background_color', $default_color );\n\n\t// Don't do anything if the current color is the default.\n\tif ( $header_background_color === $default_color ) {\n\t\treturn;\n\t}\n\n\t$css = '\n\t\t/* Custom Header Background Color */\n\t\tbody:before,\n\t\t.site-header {\n\t\t\tbackground-color: %1$s;\n\t\t}\n\n\t\t@media screen and (min-width: 59.6875em) {\n\t\t\t.site-header,\n\t\t\t.secondary {\n\t\t\t\tbackground-color: transparent;\n\t\t\t}\n\n\t\t\t.widget button,\n\t\t\t.widget input[type=\"button\"],\n\t\t\t.widget input[type=\"reset\"],\n\t\t\t.widget input[type=\"submit\"],\n\t\t\t.widget_calendar tbody a,\n\t\t\t.widget_calendar tbody a:hover,\n\t\t\t.widget_calendar tbody a:focus {\n\t\t\t\tcolor: %1$s;\n\t\t\t}\n\t\t}\n\t';\n\n\twp_add_inline_style( 'twentyfifteen-style', sprintf( $css, $header_background_color ) );\n}\nadd_action( 'wp_enqueue_scripts', 'twentyfifteen_header_background_color_css', 11 );\n\n/**\n * Enqueues front-end CSS for the sidebar text color.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_sidebar_text_color_css() {\n\t$color_scheme       = twentyfifteen_get_color_scheme();\n\t$default_color      = $color_scheme[4];\n\t$sidebar_link_color = get_theme_mod( 'sidebar_textcolor', $default_color );\n\n\t// Don't do anything if the current color is the default.\n\tif ( $sidebar_link_color === $default_color ) {\n\t\treturn;\n\t}\n\n\t// If we get this far, we have custom styles. Let's do this.\n\t$sidebar_link_color_rgb     = twentyfifteen_hex2rgb( $sidebar_link_color );\n\t$sidebar_text_color         = vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.7)', $sidebar_link_color_rgb );\n\t$sidebar_border_color       = vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.1)', $sidebar_link_color_rgb );\n\t$sidebar_border_focus_color = vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.3)', $sidebar_link_color_rgb );\n\n\t$css = '\n\t\t/* Custom Sidebar Text Color */\n\t\t.site-title a,\n\t\t.site-description,\n\t\t.secondary-toggle:before {\n\t\t\tcolor: %1$s;\n\t\t}\n\n\t\t.site-title a:hover,\n\t\t.site-title a:focus {\n\t\t\tcolor: %1$s; /* Fallback for IE7 and IE8 */\n\t\t\tcolor: %2$s;\n\t\t}\n\n\t\t.secondary-toggle {\n\t\t\tborder-color: %1$s; /* Fallback for IE7 and IE8 */\n\t\t\tborder-color: %3$s;\n\t\t}\n\n\t\t.secondary-toggle:hover,\n\t\t.secondary-toggle:focus {\n\t\t\tborder-color: %1$s; /* Fallback for IE7 and IE8 */\n\t\t\tborder-color: %4$s;\n\t\t}\n\n\t\t.site-title a {\n\t\t\toutline-color: %1$s; /* Fallback for IE7 and IE8 */\n\t\t\toutline-color: %4$s;\n\t\t}\n\n\t\t@media screen and (min-width: 59.6875em) {\n\t\t\t.secondary a,\n\t\t\t.dropdown-toggle:after,\n\t\t\t.widget-title,\n\t\t\t.widget blockquote cite,\n\t\t\t.widget blockquote small {\n\t\t\t\tcolor: %1$s;\n\t\t\t}\n\n\t\t\t.widget button,\n\t\t\t.widget input[type=\"button\"],\n\t\t\t.widget input[type=\"reset\"],\n\t\t\t.widget input[type=\"submit\"],\n\t\t\t.widget_calendar tbody a {\n\t\t\t\tbackground-color: %1$s;\n\t\t\t}\n\n\t\t\t.textwidget a {\n\t\t\t\tborder-color: %1$s;\n\t\t\t}\n\n\t\t\t.secondary a:hover,\n\t\t\t.secondary a:focus,\n\t\t\t.main-navigation .menu-item-description,\n\t\t\t.widget,\n\t\t\t.widget blockquote,\n\t\t\t.widget .wp-caption-text,\n\t\t\t.widget .gallery-caption {\n\t\t\t\tcolor: %2$s;\n\t\t\t}\n\n\t\t\t.widget button:hover,\n\t\t\t.widget button:focus,\n\t\t\t.widget input[type=\"button\"]:hover,\n\t\t\t.widget input[type=\"button\"]:focus,\n\t\t\t.widget input[type=\"reset\"]:hover,\n\t\t\t.widget input[type=\"reset\"]:focus,\n\t\t\t.widget input[type=\"submit\"]:hover,\n\t\t\t.widget input[type=\"submit\"]:focus,\n\t\t\t.widget_calendar tbody a:hover,\n\t\t\t.widget_calendar tbody a:focus {\n\t\t\t\tbackground-color: %2$s;\n\t\t\t}\n\n\t\t\t.widget blockquote {\n\t\t\t\tborder-color: %2$s;\n\t\t\t}\n\n\t\t\t.main-navigation ul,\n\t\t\t.main-navigation li,\n\t\t\t.secondary-toggle,\n\t\t\t.widget input,\n\t\t\t.widget textarea,\n\t\t\t.widget table,\n\t\t\t.widget th,\n\t\t\t.widget td,\n\t\t\t.widget pre,\n\t\t\t.widget li,\n\t\t\t.widget_categories .children,\n\t\t\t.widget_nav_menu .sub-menu,\n\t\t\t.widget_pages .children,\n\t\t\t.widget abbr[title] {\n\t\t\t\tborder-color: %3$s;\n\t\t\t}\n\n\t\t\t.dropdown-toggle:hover,\n\t\t\t.dropdown-toggle:focus,\n\t\t\t.widget hr {\n\t\t\t\tbackground-color: %3$s;\n\t\t\t}\n\n\t\t\t.widget input:focus,\n\t\t\t.widget textarea:focus {\n\t\t\t\tborder-color: %4$s;\n\t\t\t}\n\n\t\t\t.sidebar a:focus,\n\t\t\t.dropdown-toggle:focus {\n\t\t\t\toutline-color: %4$s;\n\t\t\t}\n\t\t}\n\t';\n\n\twp_add_inline_style( 'twentyfifteen-style', sprintf( $css, $sidebar_link_color, $sidebar_text_color, $sidebar_border_color, $sidebar_border_focus_color ) );\n}\nadd_action( 'wp_enqueue_scripts', 'twentyfifteen_sidebar_text_color_css', 11 );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/inc/customizer.php",
    "content": "<?php\n/**\n * Twenty Fifteen Customizer functionality\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\n/**\n * Add postMessage support for site title and description for the Customizer.\n *\n * @since Twenty Fifteen 1.0\n *\n * @param WP_Customize_Manager $wp_customize Customizer object.\n */\nfunction twentyfifteen_customize_register( $wp_customize ) {\n\t$color_scheme = twentyfifteen_get_color_scheme();\n\n\t$wp_customize->get_setting( 'blogname' )->transport        = 'postMessage';\n\t$wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage';\n\n\t// Add color scheme setting and control.\n\t$wp_customize->add_setting( 'color_scheme', array(\n\t\t'default'           => 'default',\n\t\t'sanitize_callback' => 'twentyfifteen_sanitize_color_scheme',\n\t\t'transport'         => 'postMessage',\n\t) );\n\n\t$wp_customize->add_control( 'color_scheme', array(\n\t\t'label'    => __( 'Base Color Scheme', 'twentyfifteen' ),\n\t\t'section'  => 'colors',\n\t\t'type'     => 'select',\n\t\t'choices'  => twentyfifteen_get_color_scheme_choices(),\n\t\t'priority' => 1,\n\t) );\n\n\t// Add custom header and sidebar text color setting and control.\n\t$wp_customize->add_setting( 'sidebar_textcolor', array(\n\t\t'default'           => $color_scheme[4],\n\t\t'sanitize_callback' => 'sanitize_hex_color',\n\t\t'transport'         => 'postMessage',\n\t) );\n\n\t$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'sidebar_textcolor', array(\n\t\t'label'       => __( 'Header and Sidebar Text Color', 'twentyfifteen' ),\n\t\t'description' => __( 'Applied to the header on small screens and the sidebar on wide screens.', 'twentyfifteen' ),\n\t\t'section'     => 'colors',\n\t) ) );\n\n\t// Remove the core header textcolor control, as it shares the sidebar text color.\n\t$wp_customize->remove_control( 'header_textcolor' );\n\n\t// Add custom header and sidebar background color setting and control.\n\t$wp_customize->add_setting( 'header_background_color', array(\n\t\t'default'           => $color_scheme[1],\n\t\t'sanitize_callback' => 'sanitize_hex_color',\n\t\t'transport'         => 'postMessage',\n\t) );\n\n\t$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'header_background_color', array(\n\t\t'label'       => __( 'Header and Sidebar Background Color', 'twentyfifteen' ),\n\t\t'description' => __( 'Applied to the header on small screens and the sidebar on wide screens.', 'twentyfifteen' ),\n\t\t'section'     => 'colors',\n\t) ) );\n\n\t// Add an additional description to the header image section.\n\t$wp_customize->get_section( 'header_image' )->description = __( 'Applied to the header on small screens and the sidebar on wide screens.', 'twentyfifteen' );\n}\nadd_action( 'customize_register', 'twentyfifteen_customize_register', 11 );\n\n/**\n * Register color schemes for Twenty Fifteen.\n *\n * Can be filtered with {@see 'twentyfifteen_color_schemes'}.\n *\n * The order of colors in a colors array:\n * 1. Main Background Color.\n * 2. Sidebar Background Color.\n * 3. Box Background Color.\n * 4. Main Text and Link Color.\n * 5. Sidebar Text and Link Color.\n * 6. Meta Box Background Color.\n *\n * @since Twenty Fifteen 1.0\n *\n * @return array An associative array of color scheme options.\n */\nfunction twentyfifteen_get_color_schemes() {\n\t/**\n\t * Filter the color schemes registered for use with Twenty Fifteen.\n\t *\n\t * The default schemes include 'default', 'dark', 'yellow', 'pink', 'purple', and 'blue'.\n\t *\n\t * @since Twenty Fifteen 1.0\n\t *\n\t * @param array $schemes {\n\t *     Associative array of color schemes data.\n\t *\n\t *     @type array $slug {\n\t *         Associative array of information for setting up the color scheme.\n\t *\n\t *         @type string $label  Color scheme label.\n\t *         @type array  $colors HEX codes for default colors prepended with a hash symbol ('#').\n\t *                              Colors are defined in the following order: Main background, sidebar\n\t *                              background, box background, main text and link, sidebar text and link,\n\t *                              meta box background.\n\t *     }\n\t * }\n\t */\n\treturn apply_filters( 'twentyfifteen_color_schemes', array(\n\t\t'default' => array(\n\t\t\t'label'  => __( 'Default', 'twentyfifteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#f1f1f1',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#333333',\n\t\t\t\t'#333333',\n\t\t\t\t'#f7f7f7',\n\t\t\t),\n\t\t),\n\t\t'dark'    => array(\n\t\t\t'label'  => __( 'Dark', 'twentyfifteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#111111',\n\t\t\t\t'#202020',\n\t\t\t\t'#202020',\n\t\t\t\t'#bebebe',\n\t\t\t\t'#bebebe',\n\t\t\t\t'#1b1b1b',\n\t\t\t),\n\t\t),\n\t\t'yellow'  => array(\n\t\t\t'label'  => __( 'Yellow', 'twentyfifteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#f4ca16',\n\t\t\t\t'#ffdf00',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#111111',\n\t\t\t\t'#111111',\n\t\t\t\t'#f1f1f1',\n\t\t\t),\n\t\t),\n\t\t'pink'    => array(\n\t\t\t'label'  => __( 'Pink', 'twentyfifteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#ffe5d1',\n\t\t\t\t'#e53b51',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#352712',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#f1f1f1',\n\t\t\t),\n\t\t),\n\t\t'purple'  => array(\n\t\t\t'label'  => __( 'Purple', 'twentyfifteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#674970',\n\t\t\t\t'#2e2256',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#2e2256',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#f1f1f1',\n\t\t\t),\n\t\t),\n\t\t'blue'   => array(\n\t\t\t'label'  => __( 'Blue', 'twentyfifteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#e9f2f9',\n\t\t\t\t'#55c3dc',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#22313f',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#f1f1f1',\n\t\t\t),\n\t\t),\n\t) );\n}\n\nif ( ! function_exists( 'twentyfifteen_get_color_scheme' ) ) :\n/**\n * Get the current Twenty Fifteen color scheme.\n *\n * @since Twenty Fifteen 1.0\n *\n * @return array An associative array of either the current or default color scheme hex values.\n */\nfunction twentyfifteen_get_color_scheme() {\n\t$color_scheme_option = get_theme_mod( 'color_scheme', 'default' );\n\t$color_schemes       = twentyfifteen_get_color_schemes();\n\n\tif ( array_key_exists( $color_scheme_option, $color_schemes ) ) {\n\t\treturn $color_schemes[ $color_scheme_option ]['colors'];\n\t}\n\n\treturn $color_schemes['default']['colors'];\n}\nendif; // twentyfifteen_get_color_scheme\n\nif ( ! function_exists( 'twentyfifteen_get_color_scheme_choices' ) ) :\n/**\n * Returns an array of color scheme choices registered for Twenty Fifteen.\n *\n * @since Twenty Fifteen 1.0\n *\n * @return array Array of color schemes.\n */\nfunction twentyfifteen_get_color_scheme_choices() {\n\t$color_schemes                = twentyfifteen_get_color_schemes();\n\t$color_scheme_control_options = array();\n\n\tforeach ( $color_schemes as $color_scheme => $value ) {\n\t\t$color_scheme_control_options[ $color_scheme ] = $value['label'];\n\t}\n\n\treturn $color_scheme_control_options;\n}\nendif; // twentyfifteen_get_color_scheme_choices\n\nif ( ! function_exists( 'twentyfifteen_sanitize_color_scheme' ) ) :\n/**\n * Sanitization callback for color schemes.\n *\n * @since Twenty Fifteen 1.0\n *\n * @param string $value Color scheme name value.\n * @return string Color scheme name.\n */\nfunction twentyfifteen_sanitize_color_scheme( $value ) {\n\t$color_schemes = twentyfifteen_get_color_scheme_choices();\n\n\tif ( ! array_key_exists( $value, $color_schemes ) ) {\n\t\t$value = 'default';\n\t}\n\n\treturn $value;\n}\nendif; // twentyfifteen_sanitize_color_scheme\n\n/**\n * Enqueues front-end CSS for color scheme.\n *\n * @since Twenty Fifteen 1.0\n *\n * @see wp_add_inline_style()\n */\nfunction twentyfifteen_color_scheme_css() {\n\t$color_scheme_option = get_theme_mod( 'color_scheme', 'default' );\n\n\t// Don't do anything if the default color scheme is selected.\n\tif ( 'default' === $color_scheme_option ) {\n\t\treturn;\n\t}\n\n\t$color_scheme = twentyfifteen_get_color_scheme();\n\n\t// Convert main and sidebar text hex color to rgba.\n\t$color_textcolor_rgb         = twentyfifteen_hex2rgb( $color_scheme[3] );\n\t$color_sidebar_textcolor_rgb = twentyfifteen_hex2rgb( $color_scheme[4] );\n\t$colors = array(\n\t\t'background_color'            => $color_scheme[0],\n\t\t'header_background_color'     => $color_scheme[1],\n\t\t'box_background_color'        => $color_scheme[2],\n\t\t'textcolor'                   => $color_scheme[3],\n\t\t'secondary_textcolor'         => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.7)', $color_textcolor_rgb ),\n\t\t'border_color'                => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.1)', $color_textcolor_rgb ),\n\t\t'border_focus_color'          => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.3)', $color_textcolor_rgb ),\n\t\t'sidebar_textcolor'           => $color_scheme[4],\n\t\t'sidebar_border_color'        => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.1)', $color_sidebar_textcolor_rgb ),\n\t\t'sidebar_border_focus_color'  => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.3)', $color_sidebar_textcolor_rgb ),\n\t\t'secondary_sidebar_textcolor' => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.7)', $color_sidebar_textcolor_rgb ),\n\t\t'meta_box_background_color'   => $color_scheme[5],\n\t);\n\n\t$color_scheme_css = twentyfifteen_get_color_scheme_css( $colors );\n\n\twp_add_inline_style( 'twentyfifteen-style', $color_scheme_css );\n}\nadd_action( 'wp_enqueue_scripts', 'twentyfifteen_color_scheme_css' );\n\n/**\n * Binds JS listener to make Customizer color_scheme control.\n *\n * Passes color scheme data as colorScheme global.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_customize_control_js() {\n\twp_enqueue_script( 'color-scheme-control', get_template_directory_uri() . '/js/color-scheme-control.js', array( 'customize-controls', 'iris', 'underscore', 'wp-util' ), '20141216', true );\n\twp_localize_script( 'color-scheme-control', 'colorScheme', twentyfifteen_get_color_schemes() );\n}\nadd_action( 'customize_controls_enqueue_scripts', 'twentyfifteen_customize_control_js' );\n\n/**\n * Binds JS handlers to make the Customizer preview reload changes asynchronously.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_customize_preview_js() {\n\twp_enqueue_script( 'twentyfifteen-customize-preview', get_template_directory_uri() . '/js/customize-preview.js', array( 'customize-preview' ), '20141216', true );\n}\nadd_action( 'customize_preview_init', 'twentyfifteen_customize_preview_js' );\n\n/**\n * Returns CSS for the color schemes.\n *\n * @since Twenty Fifteen 1.0\n *\n * @param array $colors Color scheme colors.\n * @return string Color scheme CSS.\n */\nfunction twentyfifteen_get_color_scheme_css( $colors ) {\n\t$colors = wp_parse_args( $colors, array(\n\t\t'background_color'            => '',\n\t\t'header_background_color'     => '',\n\t\t'box_background_color'        => '',\n\t\t'textcolor'                   => '',\n\t\t'secondary_textcolor'         => '',\n\t\t'border_color'                => '',\n\t\t'border_focus_color'          => '',\n\t\t'sidebar_textcolor'           => '',\n\t\t'sidebar_border_color'        => '',\n\t\t'sidebar_border_focus_color'  => '',\n\t\t'secondary_sidebar_textcolor' => '',\n\t\t'meta_box_background_color'   => '',\n\t) );\n\n\t$css = <<<CSS\n\t/* Color Scheme */\n\n\t/* Background Color */\n\tbody {\n\t\tbackground-color: {$colors['background_color']};\n\t}\n\n\t/* Sidebar Background Color */\n\tbody:before,\n\t.site-header {\n\t\tbackground-color: {$colors['header_background_color']};\n\t}\n\n\t/* Box Background Color */\n\t.post-navigation,\n\t.pagination,\n\t.secondary,\n\t.site-footer,\n\t.hentry,\n\t.page-header,\n\t.page-content,\n\t.comments-area,\n\t.widecolumn {\n\t\tbackground-color: {$colors['box_background_color']};\n\t}\n\n\t/* Box Background Color */\n\tbutton,\n\tinput[type=\"button\"],\n\tinput[type=\"reset\"],\n\tinput[type=\"submit\"],\n\t.pagination .prev,\n\t.pagination .next,\n\t.widget_calendar tbody a,\n\t.widget_calendar tbody a:hover,\n\t.widget_calendar tbody a:focus,\n\t.page-links a,\n\t.page-links a:hover,\n\t.page-links a:focus,\n\t.sticky-post {\n\t\tcolor: {$colors['box_background_color']};\n\t}\n\n\t/* Main Text Color */\n\tbutton,\n\tinput[type=\"button\"],\n\tinput[type=\"reset\"],\n\tinput[type=\"submit\"],\n\t.pagination .prev,\n\t.pagination .next,\n\t.widget_calendar tbody a,\n\t.page-links a,\n\t.sticky-post {\n\t\tbackground-color: {$colors['textcolor']};\n\t}\n\n\t/* Main Text Color */\n\tbody,\n\tblockquote cite,\n\tblockquote small,\n\ta,\n\t.dropdown-toggle:after,\n\t.image-navigation a:hover,\n\t.image-navigation a:focus,\n\t.comment-navigation a:hover,\n\t.comment-navigation a:focus,\n\t.widget-title,\n\t.entry-footer a:hover,\n\t.entry-footer a:focus,\n\t.comment-metadata a:hover,\n\t.comment-metadata a:focus,\n\t.pingback .edit-link a:hover,\n\t.pingback .edit-link a:focus,\n\t.comment-list .reply a:hover,\n\t.comment-list .reply a:focus,\n\t.site-info a:hover,\n\t.site-info a:focus {\n\t\tcolor: {$colors['textcolor']};\n\t}\n\n\t/* Main Text Color */\n\t.entry-content a,\n\t.entry-summary a,\n\t.page-content a,\n\t.comment-content a,\n\t.pingback .comment-body > a,\n\t.author-description a,\n\t.taxonomy-description a,\n\t.textwidget a,\n\t.entry-footer a:hover,\n\t.comment-metadata a:hover,\n\t.pingback .edit-link a:hover,\n\t.comment-list .reply a:hover,\n\t.site-info a:hover {\n\t\tborder-color: {$colors['textcolor']};\n\t}\n\n\t/* Secondary Text Color */\n\tbutton:hover,\n\tbutton:focus,\n\tinput[type=\"button\"]:hover,\n\tinput[type=\"button\"]:focus,\n\tinput[type=\"reset\"]:hover,\n\tinput[type=\"reset\"]:focus,\n\tinput[type=\"submit\"]:hover,\n\tinput[type=\"submit\"]:focus,\n\t.pagination .prev:hover,\n\t.pagination .prev:focus,\n\t.pagination .next:hover,\n\t.pagination .next:focus,\n\t.widget_calendar tbody a:hover,\n\t.widget_calendar tbody a:focus,\n\t.page-links a:hover,\n\t.page-links a:focus {\n\t\tbackground-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */\n\t\tbackground-color: {$colors['secondary_textcolor']};\n\t}\n\n\t/* Secondary Text Color */\n\tblockquote,\n\ta:hover,\n\ta:focus,\n\t.main-navigation .menu-item-description,\n\t.post-navigation .meta-nav,\n\t.post-navigation a:hover .post-title,\n\t.post-navigation a:focus .post-title,\n\t.image-navigation,\n\t.image-navigation a,\n\t.comment-navigation,\n\t.comment-navigation a,\n\t.widget,\n\t.author-heading,\n\t.entry-footer,\n\t.entry-footer a,\n\t.taxonomy-description,\n\t.page-links > .page-links-title,\n\t.entry-caption,\n\t.comment-author,\n\t.comment-metadata,\n\t.comment-metadata a,\n\t.pingback .edit-link,\n\t.pingback .edit-link a,\n\t.post-password-form label,\n\t.comment-form label,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.logged-in-as,\n\t.form-allowed-tags,\n\t.no-comments,\n\t.site-info,\n\t.site-info a,\n\t.wp-caption-text,\n\t.gallery-caption,\n\t.comment-list .reply a,\n\t.widecolumn label,\n\t.widecolumn .mu_register label {\n\t\tcolor: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */\n\t\tcolor: {$colors['secondary_textcolor']};\n\t}\n\n\t/* Secondary Text Color */\n\tblockquote,\n\t.logged-in-as a:hover,\n\t.comment-author a:hover {\n\t\tborder-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */\n\t\tborder-color: {$colors['secondary_textcolor']};\n\t}\n\n\t/* Border Color */\n\thr,\n\t.dropdown-toggle:hover,\n\t.dropdown-toggle:focus {\n\t\tbackground-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */\n\t\tbackground-color: {$colors['border_color']};\n\t}\n\n\t/* Border Color */\n\tpre,\n\tabbr[title],\n\ttable,\n\tth,\n\ttd,\n\tinput,\n\ttextarea,\n\t.main-navigation ul,\n\t.main-navigation li,\n\t.post-navigation,\n\t.post-navigation div + div,\n\t.pagination,\n\t.comment-navigation,\n\t.widget li,\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children,\n\t.site-header,\n\t.site-footer,\n\t.hentry + .hentry,\n\t.author-info,\n\t.entry-content .page-links a,\n\t.page-links > span,\n\t.page-header,\n\t.comments-area,\n\t.comment-list + .comment-respond,\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback,\n\t.comment-list .reply a,\n\t.no-comments {\n\t\tborder-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */\n\t\tborder-color: {$colors['border_color']};\n\t}\n\n\t/* Border Focus Color */\n\ta:focus,\n\tbutton:focus,\n\tinput:focus {\n\t\toutline-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */\n\t\toutline-color: {$colors['border_focus_color']};\n\t}\n\n\tinput:focus,\n\ttextarea:focus {\n\t\tborder-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */\n\t\tborder-color: {$colors['border_focus_color']};\n\t}\n\n\t/* Sidebar Link Color */\n\t.secondary-toggle:before {\n\t\tcolor: {$colors['sidebar_textcolor']};\n\t}\n\n\t.site-title a,\n\t.site-description {\n\t\tcolor: {$colors['sidebar_textcolor']};\n\t}\n\n\t/* Sidebar Text Color */\n\t.site-title a:hover,\n\t.site-title a:focus {\n\t\tcolor: {$colors['secondary_sidebar_textcolor']};\n\t}\n\n\t/* Sidebar Border Color */\n\t.secondary-toggle {\n\t\tborder-color: {$colors['sidebar_textcolor']}; /* Fallback for IE7 and IE8 */\n\t\tborder-color: {$colors['sidebar_border_color']};\n\t}\n\n\t/* Sidebar Border Focus Color */\n\t.secondary-toggle:hover,\n\t.secondary-toggle:focus {\n\t\tborder-color: {$colors['sidebar_textcolor']}; /* Fallback for IE7 and IE8 */\n\t\tborder-color: {$colors['sidebar_border_focus_color']};\n\t}\n\n\t.site-title a {\n\t\toutline-color: {$colors['sidebar_textcolor']}; /* Fallback for IE7 and IE8 */\n\t\toutline-color: {$colors['sidebar_border_focus_color']};\n\t}\n\n\t/* Meta Background Color */\n\t.entry-footer {\n\t\tbackground-color: {$colors['meta_box_background_color']};\n\t}\n\n\t@media screen and (min-width: 38.75em) {\n\t\t/* Main Text Color */\n\t\t.page-header {\n\t\t\tborder-color: {$colors['textcolor']};\n\t\t}\n\t}\n\n\t@media screen and (min-width: 59.6875em) {\n\t\t/* Make sure its transparent on desktop */\n\t\t.site-header,\n\t\t.secondary {\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t/* Sidebar Background Color */\n\t\t.widget button,\n\t\t.widget input[type=\"button\"],\n\t\t.widget input[type=\"reset\"],\n\t\t.widget input[type=\"submit\"],\n\t\t.widget_calendar tbody a,\n\t\t.widget_calendar tbody a:hover,\n\t\t.widget_calendar tbody a:focus {\n\t\t\tcolor: {$colors['header_background_color']};\n\t\t}\n\n\t\t/* Sidebar Link Color */\n\t\t.secondary a,\n\t\t.dropdown-toggle:after,\n\t\t.widget-title,\n\t\t.widget blockquote cite,\n\t\t.widget blockquote small {\n\t\t\tcolor: {$colors['sidebar_textcolor']};\n\t\t}\n\n\t\t.widget button,\n\t\t.widget input[type=\"button\"],\n\t\t.widget input[type=\"reset\"],\n\t\t.widget input[type=\"submit\"],\n\t\t.widget_calendar tbody a {\n\t\t\tbackground-color: {$colors['sidebar_textcolor']};\n\t\t}\n\n\t\t.textwidget a {\n\t\t\tborder-color: {$colors['sidebar_textcolor']};\n\t\t}\n\n\t\t/* Sidebar Text Color */\n\t\t.secondary a:hover,\n\t\t.secondary a:focus,\n\t\t.main-navigation .menu-item-description,\n\t\t.widget,\n\t\t.widget blockquote,\n\t\t.widget .wp-caption-text,\n\t\t.widget .gallery-caption {\n\t\t\tcolor: {$colors['secondary_sidebar_textcolor']};\n\t\t}\n\n\t\t.widget button:hover,\n\t\t.widget button:focus,\n\t\t.widget input[type=\"button\"]:hover,\n\t\t.widget input[type=\"button\"]:focus,\n\t\t.widget input[type=\"reset\"]:hover,\n\t\t.widget input[type=\"reset\"]:focus,\n\t\t.widget input[type=\"submit\"]:hover,\n\t\t.widget input[type=\"submit\"]:focus,\n\t\t.widget_calendar tbody a:hover,\n\t\t.widget_calendar tbody a:focus {\n\t\t\tbackground-color: {$colors['secondary_sidebar_textcolor']};\n\t\t}\n\n\t\t.widget blockquote {\n\t\t\tborder-color: {$colors['secondary_sidebar_textcolor']};\n\t\t}\n\n\t\t/* Sidebar Border Color */\n\t\t.main-navigation ul,\n\t\t.main-navigation li,\n\t\t.widget input,\n\t\t.widget textarea,\n\t\t.widget table,\n\t\t.widget th,\n\t\t.widget td,\n\t\t.widget pre,\n\t\t.widget li,\n\t\t.widget_categories .children,\n\t\t.widget_nav_menu .sub-menu,\n\t\t.widget_pages .children,\n\t\t.widget abbr[title] {\n\t\t\tborder-color: {$colors['sidebar_border_color']};\n\t\t}\n\n\t\t.dropdown-toggle:hover,\n\t\t.dropdown-toggle:focus,\n\t\t.widget hr {\n\t\t\tbackground-color: {$colors['sidebar_border_color']};\n\t\t}\n\n\t\t.widget input:focus,\n\t\t.widget textarea:focus {\n\t\t\tborder-color: {$colors['sidebar_border_focus_color']};\n\t\t}\n\n\t\t.sidebar a:focus,\n\t\t.dropdown-toggle:focus {\n\t\t\toutline-color: {$colors['sidebar_border_focus_color']};\n\t\t}\n\t}\nCSS;\n\n\treturn $css;\n}\n\n/**\n * Output an Underscore template for generating CSS for the color scheme.\n *\n * The template generates the css dynamically for instant display in the Customizer\n * preview.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_color_scheme_css_template() {\n\t$colors = array(\n\t\t'background_color'            => '{{ data.background_color }}',\n\t\t'header_background_color'     => '{{ data.header_background_color }}',\n\t\t'box_background_color'        => '{{ data.box_background_color }}',\n\t\t'textcolor'                   => '{{ data.textcolor }}',\n\t\t'secondary_textcolor'         => '{{ data.secondary_textcolor }}',\n\t\t'border_color'                => '{{ data.border_color }}',\n\t\t'border_focus_color'          => '{{ data.border_focus_color }}',\n\t\t'sidebar_textcolor'           => '{{ data.sidebar_textcolor }}',\n\t\t'sidebar_border_color'        => '{{ data.sidebar_border_color }}',\n\t\t'sidebar_border_focus_color'  => '{{ data.sidebar_border_focus_color }}',\n\t\t'secondary_sidebar_textcolor' => '{{ data.secondary_sidebar_textcolor }}',\n\t\t'meta_box_background_color'   => '{{ data.meta_box_background_color }}',\n\t);\n\t?>\n\t<script type=\"text/html\" id=\"tmpl-twentyfifteen-color-scheme\">\n\t\t<?php echo twentyfifteen_get_color_scheme_css( $colors ); ?>\n\t</script>\n\t<?php\n}\nadd_action( 'customize_controls_print_footer_scripts', 'twentyfifteen_color_scheme_css_template' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/inc/template-tags.php",
    "content": "<?php\n/**\n * Custom template tags for Twenty Fifteen\n *\n * Eventually, some of the functionality here could be replaced by core features.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nif ( ! function_exists( 'twentyfifteen_comment_nav' ) ) :\n/**\n * Display navigation to next/previous comments when applicable.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_comment_nav() {\n\t// Are there comments to navigate through?\n\tif ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) :\n\t?>\n\t<nav class=\"navigation comment-navigation\" role=\"navigation\">\n\t\t<h2 class=\"screen-reader-text\"><?php _e( 'Comment navigation', 'twentyfifteen' ); ?></h2>\n\t\t<div class=\"nav-links\">\n\t\t\t<?php\n\t\t\t\tif ( $prev_link = get_previous_comments_link( __( 'Older Comments', 'twentyfifteen' ) ) ) :\n\t\t\t\t\tprintf( '<div class=\"nav-previous\">%s</div>', $prev_link );\n\t\t\t\tendif;\n\n\t\t\t\tif ( $next_link = get_next_comments_link( __( 'Newer Comments', 'twentyfifteen' ) ) ) :\n\t\t\t\t\tprintf( '<div class=\"nav-next\">%s</div>', $next_link );\n\t\t\t\tendif;\n\t\t\t?>\n\t\t</div><!-- .nav-links -->\n\t</nav><!-- .comment-navigation -->\n\t<?php\n\tendif;\n}\nendif;\n\nif ( ! function_exists( 'twentyfifteen_entry_meta' ) ) :\n/**\n * Prints HTML with meta information for the categories, tags.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_entry_meta() {\n\tif ( is_sticky() && is_home() && ! is_paged() ) {\n\t\tprintf( '<span class=\"sticky-post\">%s</span>', __( 'Featured', 'twentyfifteen' ) );\n\t}\n\n\t$format = get_post_format();\n\tif ( current_theme_supports( 'post-formats', $format ) ) {\n\t\tprintf( '<span class=\"entry-format\">%1$s<a href=\"%2$s\">%3$s</a></span>',\n\t\t\tsprintf( '<span class=\"screen-reader-text\">%s </span>', _x( 'Format', 'Used before post format.', 'twentyfifteen' ) ),\n\t\t\tesc_url( get_post_format_link( $format ) ),\n\t\t\tget_post_format_string( $format )\n\t\t);\n\t}\n\n\tif ( in_array( get_post_type(), array( 'post', 'attachment' ) ) ) {\n\t\t$time_string = '<time class=\"entry-date published updated\" datetime=\"%1$s\">%2$s</time>';\n\n\t\tif ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) {\n\t\t\t$time_string = '<time class=\"entry-date published\" datetime=\"%1$s\">%2$s</time><time class=\"updated\" datetime=\"%3$s\">%4$s</time>';\n\t\t}\n\n\t\t$time_string = sprintf( $time_string,\n\t\t\tesc_attr( get_the_date( 'c' ) ),\n\t\t\tget_the_date(),\n\t\t\tesc_attr( get_the_modified_date( 'c' ) ),\n\t\t\tget_the_modified_date()\n\t\t);\n\n\t\tprintf( '<span class=\"posted-on\"><span class=\"screen-reader-text\">%1$s </span><a href=\"%2$s\" rel=\"bookmark\">%3$s</a></span>',\n\t\t\t_x( 'Posted on', 'Used before publish date.', 'twentyfifteen' ),\n\t\t\tesc_url( get_permalink() ),\n\t\t\t$time_string\n\t\t);\n\t}\n\n\tif ( 'post' == get_post_type() ) {\n\t\tif ( is_singular() || is_multi_author() ) {\n\t\t\tprintf( '<span class=\"byline\"><span class=\"author vcard\"><span class=\"screen-reader-text\">%1$s </span><a class=\"url fn n\" href=\"%2$s\">%3$s</a></span></span>',\n\t\t\t\t_x( 'Author', 'Used before post author name.', 'twentyfifteen' ),\n\t\t\t\tesc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),\n\t\t\t\tget_the_author()\n\t\t\t);\n\t\t}\n\n\t\t$categories_list = get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfifteen' ) );\n\t\tif ( $categories_list && twentyfifteen_categorized_blog() ) {\n\t\t\tprintf( '<span class=\"cat-links\"><span class=\"screen-reader-text\">%1$s </span>%2$s</span>',\n\t\t\t\t_x( 'Categories', 'Used before category names.', 'twentyfifteen' ),\n\t\t\t\t$categories_list\n\t\t\t);\n\t\t}\n\n\t\t$tags_list = get_the_tag_list( '', _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfifteen' ) );\n\t\tif ( $tags_list ) {\n\t\t\tprintf( '<span class=\"tags-links\"><span class=\"screen-reader-text\">%1$s </span>%2$s</span>',\n\t\t\t\t_x( 'Tags', 'Used before tag names.', 'twentyfifteen' ),\n\t\t\t\t$tags_list\n\t\t\t);\n\t\t}\n\t}\n\n\tif ( is_attachment() && wp_attachment_is_image() ) {\n\t\t// Retrieve attachment metadata.\n\t\t$metadata = wp_get_attachment_metadata();\n\n\t\tprintf( '<span class=\"full-size-link\"><span class=\"screen-reader-text\">%1$s </span><a href=\"%2$s\">%3$s &times; %4$s</a></span>',\n\t\t\t_x( 'Full size', 'Used before full size attachment link.', 'twentyfifteen' ),\n\t\t\tesc_url( wp_get_attachment_url() ),\n\t\t\t$metadata['width'],\n\t\t\t$metadata['height']\n\t\t);\n\t}\n\n\tif ( ! is_single() && ! post_password_required() && ( comments_open() || get_comments_number() ) ) {\n\t\techo '<span class=\"comments-link\">';\n\t\t/* translators: %s: post title */\n\t\tcomments_popup_link( sprintf( __( 'Leave a comment<span class=\"screen-reader-text\"> on %s</span>', 'twentyfifteen' ), get_the_title() ) );\n\t\techo '</span>';\n\t}\n}\nendif;\n\n/**\n * Determine whether blog/site has more than one category.\n *\n * @since Twenty Fifteen 1.0\n *\n * @return bool True of there is more than one category, false otherwise.\n */\nfunction twentyfifteen_categorized_blog() {\n\tif ( false === ( $all_the_cool_cats = get_transient( 'twentyfifteen_categories' ) ) ) {\n\t\t// Create an array of all the categories that are attached to posts.\n\t\t$all_the_cool_cats = get_categories( array(\n\t\t\t'fields'     => 'ids',\n\t\t\t'hide_empty' => 1,\n\n\t\t\t// We only need to know if there is more than one category.\n\t\t\t'number'     => 2,\n\t\t) );\n\n\t\t// Count the number of categories that are attached to the posts.\n\t\t$all_the_cool_cats = count( $all_the_cool_cats );\n\n\t\tset_transient( 'twentyfifteen_categories', $all_the_cool_cats );\n\t}\n\n\tif ( $all_the_cool_cats > 1 ) {\n\t\t// This blog has more than 1 category so twentyfifteen_categorized_blog should return true.\n\t\treturn true;\n\t} else {\n\t\t// This blog has only 1 category so twentyfifteen_categorized_blog should return false.\n\t\treturn false;\n\t}\n}\n\n/**\n * Flush out the transients used in {@see twentyfifteen_categorized_blog()}.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_category_transient_flusher() {\n\t// Like, beat it. Dig?\n\tdelete_transient( 'twentyfifteen_categories' );\n}\nadd_action( 'edit_category', 'twentyfifteen_category_transient_flusher' );\nadd_action( 'save_post',     'twentyfifteen_category_transient_flusher' );\n\nif ( ! function_exists( 'twentyfifteen_post_thumbnail' ) ) :\n/**\n * Display an optional post thumbnail.\n *\n * Wraps the post thumbnail in an anchor element on index views, or a div\n * element when on single views.\n *\n * @since Twenty Fifteen 1.0\n */\nfunction twentyfifteen_post_thumbnail() {\n\tif ( post_password_required() || is_attachment() || ! has_post_thumbnail() ) {\n\t\treturn;\n\t}\n\n\tif ( is_singular() ) :\n\t?>\n\n\t<div class=\"post-thumbnail\">\n\t\t<?php the_post_thumbnail(); ?>\n\t</div><!-- .post-thumbnail -->\n\n\t<?php else : ?>\n\n\t<a class=\"post-thumbnail\" href=\"<?php the_permalink(); ?>\" aria-hidden=\"true\">\n\t\t<?php\n\t\t\tthe_post_thumbnail( 'post-thumbnail', array( 'alt' => get_the_title() ) );\n\t\t?>\n\t</a>\n\n\t<?php endif; // End is_singular()\n}\nendif;\n\nif ( ! function_exists( 'twentyfifteen_get_link_url' ) ) :\n/**\n * Return the post URL.\n *\n * Falls back to the post permalink if no URL is found in the post.\n *\n * @since Twenty Fifteen 1.0\n *\n * @see get_url_in_content()\n *\n * @return string The Link format URL.\n */\nfunction twentyfifteen_get_link_url() {\n\t$has_url = get_url_in_content( get_the_content() );\n\n\treturn $has_url ? $has_url : apply_filters( 'the_permalink', get_permalink() );\n}\nendif;\n\nif ( ! function_exists( 'twentyfifteen_excerpt_more' ) && ! is_admin() ) :\n/**\n * Replaces \"[...]\" (appended to automatically generated excerpts) with ... and a 'Continue reading' link.\n *\n * @since Twenty Fifteen 1.0\n *\n * @return string 'Continue reading' link prepended with an ellipsis.\n */\nfunction twentyfifteen_excerpt_more( $more ) {\n\t$link = sprintf( '<a href=\"%1$s\" class=\"more-link\">%2$s</a>',\n\t\tesc_url( get_permalink( get_the_ID() ) ),\n\t\t/* translators: %s: Name of current post */\n\t\tsprintf( __( 'Continue reading %s', 'twentyfifteen' ), '<span class=\"screen-reader-text\">' . get_the_title( get_the_ID() ) . '</span>' )\n\t\t);\n\treturn ' &hellip; ' . $link;\n}\nadd_filter( 'excerpt_more', 'twentyfifteen_excerpt_more' );\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/index.php",
    "content": "<?php\n/**\n * The main template file\n *\n * This is the most generic template file in a WordPress theme\n * and one of the two required files for a theme (the other being style.css).\n * It is used to display a page when nothing more specific matches a query.\n * e.g., it puts together the home page when no home.php file exists.\n *\n * Learn more: {@link https://codex.wordpress.org/Template_Hierarchy}\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<?php if ( is_home() && ! is_front_page() ) : ?>\n\t\t\t\t<header>\n\t\t\t\t\t<h1 class=\"page-title screen-reader-text\"><?php single_post_title(); ?></h1>\n\t\t\t\t</header>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php\n\t\t\t// Start the loop.\n\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t/*\n\t\t\t\t * Include the Post-Format-specific template for the content.\n\t\t\t\t * If you want to override this in a child theme, then include a file\n\t\t\t\t * called content-___.php (where ___ is the Post Format name) and that will be used instead.\n\t\t\t\t */\n\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t// End the loop.\n\t\t\tendwhile;\n\n\t\t\t// Previous/next page navigation.\n\t\t\tthe_posts_pagination( array(\n\t\t\t\t'prev_text'          => __( 'Previous page', 'twentyfifteen' ),\n\t\t\t\t'next_text'          => __( 'Next page', 'twentyfifteen' ),\n\t\t\t\t'before_page_number' => '<span class=\"meta-nav screen-reader-text\">' . __( 'Page', 'twentyfifteen' ) . ' </span>',\n\t\t\t) );\n\n\t\t// If no content, include the \"No posts found\" template.\n\t\telse :\n\t\t\tget_template_part( 'content', 'none' );\n\n\t\tendif;\n\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</div><!-- .content-area -->\n\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/js/color-scheme-control.js",
    "content": "/* global colorScheme, Color */\n/**\n * Add a listener to the Color Scheme control to update other color controls to new values/defaults.\n * Also trigger an update of the Color Scheme CSS when a color is changed.\n */\n\n( function( api ) {\n\tvar cssTemplate = wp.template( 'twentyfifteen-color-scheme' ),\n\t\tcolorSchemeKeys = [\n\t\t\t'background_color',\n\t\t\t'header_background_color',\n\t\t\t'box_background_color',\n\t\t\t'textcolor',\n\t\t\t'sidebar_textcolor',\n\t\t\t'meta_box_background_color'\n\t\t],\n\t\tcolorSettings = [\n\t\t\t'background_color',\n\t\t\t'header_background_color',\n\t\t\t'sidebar_textcolor'\n\t\t];\n\n\tapi.controlConstructor.select = api.Control.extend( {\n\t\tready: function() {\n\t\t\tif ( 'color_scheme' === this.id ) {\n\t\t\t\tthis.setting.bind( 'change', function( value ) {\n\t\t\t\t\t// Update Background Color.\n\t\t\t\t\tapi( 'background_color' ).set( colorScheme[value].colors[0] );\n\t\t\t\t\tapi.control( 'background_color' ).container.find( '.color-picker-hex' )\n\t\t\t\t\t\t.data( 'data-default-color', colorScheme[value].colors[0] )\n\t\t\t\t\t\t.wpColorPicker( 'defaultColor', colorScheme[value].colors[0] );\n\n\t\t\t\t\t// Update Header/Sidebar Background Color.\n\t\t\t\t\tapi( 'header_background_color' ).set( colorScheme[value].colors[1] );\n\t\t\t\t\tapi.control( 'header_background_color' ).container.find( '.color-picker-hex' )\n\t\t\t\t\t\t.data( 'data-default-color', colorScheme[value].colors[1] )\n\t\t\t\t\t\t.wpColorPicker( 'defaultColor', colorScheme[value].colors[1] );\n\n\t\t\t\t\t// Update Header/Sidebar Text Color.\n\t\t\t\t\tapi( 'sidebar_textcolor' ).set( colorScheme[value].colors[4] );\n\t\t\t\t\tapi.control( 'sidebar_textcolor' ).container.find( '.color-picker-hex' )\n\t\t\t\t\t\t.data( 'data-default-color', colorScheme[value].colors[4] )\n\t\t\t\t\t\t.wpColorPicker( 'defaultColor', colorScheme[value].colors[4] );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} );\n\n\t// Generate the CSS for the current Color Scheme.\n\tfunction updateCSS() {\n\t\tvar scheme = api( 'color_scheme' )(), css,\n\t\t\tcolors = _.object( colorSchemeKeys, colorScheme[ scheme ].colors );\n\n\t\t// Merge in color scheme overrides.\n\t\t_.each( colorSettings, function( setting ) {\n\t\t\tcolors[ setting ] = api( setting )();\n\t\t});\n\n\t\t// Add additional colors.\n\t\tcolors.secondary_textcolor = Color( colors.textcolor ).toCSS( 'rgba', 0.7 );\n\t\tcolors.border_color = Color( colors.textcolor ).toCSS( 'rgba', 0.1 );\n\t\tcolors.border_focus_color = Color( colors.textcolor ).toCSS( 'rgba', 0.3 );\n\t\tcolors.secondary_sidebar_textcolor = Color( colors.sidebar_textcolor ).toCSS( 'rgba', 0.7 );\n\t\tcolors.sidebar_border_color = Color( colors.sidebar_textcolor ).toCSS( 'rgba', 0.1 );\n\t\tcolors.sidebar_border_focus_color = Color( colors.sidebar_textcolor ).toCSS( 'rgba', 0.3 );\n\n\t\tcss = cssTemplate( colors );\n\n\t\tapi.previewer.send( 'update-color-scheme-css', css );\n\t}\n\n\t// Update the CSS whenever a color setting is changed.\n\t_.each( colorSettings, function( setting ) {\n\t\tapi( setting, function( setting ) {\n\t\t\tsetting.bind( updateCSS );\n\t\t} );\n\t} );\n} )( wp.customize );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/js/customize-preview.js",
    "content": "/**\n * Live-update changed settings in real time in the Customizer preview.\n */\n\n( function( $ ) {\n\tvar $style = $( '#twentyfifteen-color-scheme-css' ),\n\t\tapi = wp.customize;\n\n\tif ( ! $style.length ) {\n\t\t$style = $( 'head' ).append( '<style type=\"text/css\" id=\"twentyfifteen-color-scheme-css\" />' )\n\t\t                    .find( '#twentyfifteen-color-scheme-css' );\n\t}\n\n\t// Site title.\n\tapi( 'blogname', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( '.site-title a' ).text( to );\n\t\t} );\n\t} );\n\n\t// Site tagline.\n\tapi( 'blogdescription', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( '.site-description' ).text( to );\n\t\t} );\n\t} );\n\n\t// Color Scheme CSS.\n\tapi.bind( 'preview-ready', function() {\n\t\tapi.preview.bind( 'update-color-scheme-css', function( css ) {\n\t\t\t$style.html( css );\n\t\t} );\n\t} );\n\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/js/functions.js",
    "content": "/* global screenReaderText */\n/**\n * Theme functions file.\n *\n * Contains handlers for navigation and widget area.\n */\n\n( function( $ ) {\n\tvar $body, $window, $sidebar, adminbarOffset, top = false,\n\t    bottom = false, windowWidth, windowHeight, lastWindowPos = 0,\n\t    topOffset = 0, bodyHeight, sidebarHeight, resizeTimer,\n\t    secondary, button;\n\n\tfunction initMainNavigation( container ) {\n\t\t// Add dropdown toggle that display child menu items.\n\t\tcontainer.find( '.menu-item-has-children > a' ).after( '<button class=\"dropdown-toggle\" aria-expanded=\"false\">' + screenReaderText.expand + '</button>' );\n\n\t\t// Toggle buttons and submenu items with active children menu items.\n\t\tcontainer.find( '.current-menu-ancestor > button' ).addClass( 'toggle-on' );\n\t\tcontainer.find( '.current-menu-ancestor > .sub-menu' ).addClass( 'toggled-on' );\n\n\t\tcontainer.find( '.dropdown-toggle' ).click( function( e ) {\n\t\t\tvar _this = $( this );\n\t\t\te.preventDefault();\n\t\t\t_this.toggleClass( 'toggle-on' );\n\t\t\t_this.next( '.children, .sub-menu' ).toggleClass( 'toggled-on' );\n\t\t\t_this.attr( 'aria-expanded', _this.attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' );\n\t\t\t_this.html( _this.html() === screenReaderText.expand ? screenReaderText.collapse : screenReaderText.expand );\n\t\t} );\n\t}\n\tinitMainNavigation( $( '.main-navigation' ) );\n\n\t// Re-initialize the main navigation when it is updated, persisting any existing submenu expanded states.\n\t$( document ).on( 'customize-preview-menu-refreshed', function( e, params ) {\n\t\tif ( 'primary' === params.wpNavMenuArgs.theme_location ) {\n\t\t\tinitMainNavigation( params.newContainer );\n\n\t\t\t// Re-sync expanded states from oldContainer.\n\t\t\tparams.oldContainer.find( '.dropdown-toggle.toggle-on' ).each(function() {\n\t\t\t\tvar containerId = $( this ).parent().prop( 'id' );\n\t\t\t\t$( params.newContainer ).find( '#' + containerId + ' > .dropdown-toggle' ).triggerHandler( 'click' );\n\t\t\t});\n\t\t}\n\t});\n\n\tsecondary = $( '#secondary' );\n\tbutton = $( '.site-branding' ).find( '.secondary-toggle' );\n\n\t// Enable menu toggle for small screens.\n\t( function() {\n\t\tvar menu, widgets, social;\n\t\tif ( ! secondary || ! button ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Hide button if there are no widgets and the menus are missing or empty.\n\t\tmenu    = secondary.find( '.nav-menu' );\n\t\twidgets = secondary.find( '#widget-area' );\n\t\tsocial  = secondary.find( '#social-navigation' );\n\t\tif ( ! widgets.length && ! social.length && ( ! menu || ! menu.children().length ) ) {\n\t\t\tbutton.hide();\n\t\t\treturn;\n\t\t}\n\n\t\tbutton.on( 'click.twentyfifteen', function() {\n\t\t\tsecondary.toggleClass( 'toggled-on' );\n\t\t\tsecondary.trigger( 'resize' );\n\t\t\t$( this ).toggleClass( 'toggled-on' );\n\t\t\tif ( $( this, secondary ).hasClass( 'toggled-on' ) ) {\n\t\t\t\t$( this ).attr( 'aria-expanded', 'true' );\n\t\t\t\tsecondary.attr( 'aria-expanded', 'true' );\n\t\t\t} else {\n\t\t\t\t$( this ).attr( 'aria-expanded', 'false' );\n\t\t\t\tsecondary.attr( 'aria-expanded', 'false' );\n\t\t\t}\n\t\t} );\n\t} )();\n\n\t/**\n\t * @summary Add or remove ARIA attributes.\n\t * Uses jQuery's width() function to determine the size of the window and add\n\t * the default ARIA attributes for the menu toggle if it's visible.\n\t * @since Twenty Fifteen 1.1\n\t */\n\tfunction onResizeARIA() {\n\t\tif ( 955 > $window.width() ) {\n\t\t\tbutton.attr( 'aria-expanded', 'false' );\n\t\t\tsecondary.attr( 'aria-expanded', 'false' );\n\t\t\tbutton.attr( 'aria-controls', 'secondary' );\n\t\t} else {\n\t\t\tbutton.removeAttr( 'aria-expanded' );\n\t\t\tsecondary.removeAttr( 'aria-expanded' );\n\t\t\tbutton.removeAttr( 'aria-controls' );\n\t\t}\n\t}\n\n\t// Sidebar scrolling.\n\tfunction resize() {\n\t\twindowWidth = $window.width();\n\n\t\tif ( 955 > windowWidth ) {\n\t\t\ttop = bottom = false;\n\t\t\t$sidebar.removeAttr( 'style' );\n\t\t}\n\t}\n\n\tfunction scroll() {\n\t\tvar windowPos = $window.scrollTop();\n\n\t\tif ( 955 > windowWidth ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsidebarHeight = $sidebar.height();\n\t\twindowHeight  = $window.height();\n\t\tbodyHeight    = $body.height();\n\n\t\tif ( sidebarHeight + adminbarOffset > windowHeight ) {\n\t\t\tif ( windowPos > lastWindowPos ) {\n\t\t\t\tif ( top ) {\n\t\t\t\t\ttop = false;\n\t\t\t\t\ttopOffset = ( $sidebar.offset().top > 0 ) ? $sidebar.offset().top - adminbarOffset : 0;\n\t\t\t\t\t$sidebar.attr( 'style', 'top: ' + topOffset + 'px;' );\n\t\t\t\t} else if ( ! bottom && windowPos + windowHeight > sidebarHeight + $sidebar.offset().top && sidebarHeight + adminbarOffset < bodyHeight ) {\n\t\t\t\t\tbottom = true;\n\t\t\t\t\t$sidebar.attr( 'style', 'position: fixed; bottom: 0;' );\n\t\t\t\t}\n\t\t\t} else if ( windowPos < lastWindowPos ) {\n\t\t\t\tif ( bottom ) {\n\t\t\t\t\tbottom = false;\n\t\t\t\t\ttopOffset = ( $sidebar.offset().top > 0 ) ? $sidebar.offset().top - adminbarOffset : 0;\n\t\t\t\t\t$sidebar.attr( 'style', 'top: ' + topOffset + 'px;' );\n\t\t\t\t} else if ( ! top && windowPos + adminbarOffset < $sidebar.offset().top ) {\n\t\t\t\t\ttop = true;\n\t\t\t\t\t$sidebar.attr( 'style', 'position: fixed;' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttop = bottom = false;\n\t\t\t\ttopOffset = ( $sidebar.offset().top > 0 ) ? $sidebar.offset().top - adminbarOffset : 0;\n\t\t\t\t$sidebar.attr( 'style', 'top: ' + topOffset + 'px;' );\n\t\t\t}\n\t\t} else if ( ! top ) {\n\t\t\ttop = true;\n\t\t\t$sidebar.attr( 'style', 'position: fixed;' );\n\t\t}\n\n\t\tlastWindowPos = windowPos;\n\t}\n\n\tfunction resizeAndScroll() {\n\t\tresize();\n\t\tscroll();\n\t}\n\n\t$( document ).ready( function() {\n\t\t$body          = $( document.body );\n\t\t$window        = $( window );\n\t\t$sidebar       = $( '#sidebar' ).first();\n\t\tadminbarOffset = $body.is( '.admin-bar' ) ? $( '#wpadminbar' ).height() : 0;\n\n\t\t$window\n\t\t\t.on( 'scroll.twentyfifteen', scroll )\n\t\t\t.on( 'load.twentyfifteen', onResizeARIA )\n\t\t\t.on( 'resize.twentyfifteen', function() {\n\t\t\t\tclearTimeout( resizeTimer );\n\t\t\t\tresizeTimer = setTimeout( resizeAndScroll, 500 );\n\t\t\t\tonResizeARIA();\n\t\t\t} );\n\t\t$sidebar.on( 'click.twentyfifteen keydown.twentyfifteen', 'button', resizeAndScroll );\n\n\t\tresizeAndScroll();\n\n\t\tfor ( var i = 1; i < 6; i++ ) {\n\t\t\tsetTimeout( resizeAndScroll, 100 * i );\n\t\t}\n\t} );\n\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/js/html5.js",
    "content": "/*\n * HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n */\n\n(function(l,f){function m(){var a=e.elements;return\"string\"==typeof a?a.split(\" \"):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();\na.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function(\"h,f\",\"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\"+m().join().replace(/[\\w\\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c(\"'+a+'\")'})+\");return n}\")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement(\"p\");d=d.getElementsByTagName(\"head\")[0]||d.documentElement;c.innerHTML=\"x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>\";\nc=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o=\"_html5shiv\",h=0,n={},g;(function(){try{var a=f.createElement(\"a\");a.innerHTML=\"<xyz></xyz>\";j=\"hidden\"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement(\"a\");var c=f.createDocumentFragment();b=\"undefined\"==typeof c.cloneNode||\n\"undefined\"==typeof c.createDocumentFragment||\"undefined\"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||\"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video\",version:\"3.7.0\",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:\"default\",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);\nif(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/js/keyboard-image-navigation.js",
    "content": "/**\n * Twenty Fifteen keyboard support for image navigation.\n */\n\n( function( $ ) {\n\t$( document ).on( 'keydown.twentyfifteen', function( e ) {\n\t\tvar url = false;\n\n\t\t// Left arrow key code.\n\t\tif ( e.which === 37 ) {\n\t\t\turl = $( '.nav-previous a' ).attr( 'href' );\n\n\t\t// Right arrow key code.\n\t\t} else if ( e.which === 39 ) {\n\t\t\turl = $( '.nav-next a' ).attr( 'href' );\n\t\t}\n\n\t\tif ( url && ( ! $( 'textarea, input' ).is( ':focus' ) ) ) {\n\t\t\twindow.location = url;\n\t\t}\n\t} );\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/js/skip-link-focus-fix.js",
    "content": "/**\n * Makes \"skip to content\" link work correctly in IE9, Chrome, and Opera\n * for better accessibility.\n *\n * @link http://www.nczonline.net/blog/2013/01/15/fixing-skip-to-content-links/\n */\n\n( function() {\n\tvar ua = navigator.userAgent.toLowerCase();\n\n\tif ( ( ua.indexOf( 'webkit' ) > -1 || ua.indexOf( 'opera' ) > -1 || ua.indexOf( 'msie' ) > -1 ) &&\n\t\tdocument.getElementById && window.addEventListener ) {\n\n\t\twindow.addEventListener( 'hashchange', function() {\n\t\t\tvar element = document.getElementById( location.hash.substring( 1 ) );\n\n\t\t\tif ( element ) {\n\t\t\t\tif ( ! /^(?:a|select|input|button|textarea)$/i.test( element.nodeName ) ) {\n\t\t\t\t\telement.tabIndex = -1;\n\t\t\t\t}\n\n\t\t\t\telement.focus();\n\t\t\t}\n\t\t}, false );\n\t}\n} )();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/languages/twentyfifteen.pot",
    "content": "# Copyright (C) 2015 the WordPress team\n# This file is distributed under the GNU General Public License v2 or later.\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Twenty Fifteen 1.4\\n\"\n\"Report-Msgid-Bugs-To: https://wordpress.org/support/theme/twentyfifteen\\n\"\n\"POT-Creation-Date: 2015-12-08 15:14:51+00:00\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"PO-Revision-Date: 2015-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\n#: 404.php:17\nmsgid \"Oops! That page can&rsquo;t be found.\"\nmsgstr \"\"\n\n#: 404.php:21\nmsgid \"It looks like nothing was found at this location. Maybe try a search?\"\nmsgstr \"\"\n\n#: archive.php:49 index.php:46 search.php:38\nmsgid \"Previous page\"\nmsgstr \"\"\n\n#: archive.php:50 index.php:47 search.php:39\nmsgid \"Next page\"\nmsgstr \"\"\n\n#: archive.php:51 content-link.php:40 content-page.php:29 content.php:42\n#: image.php:63 index.php:48 search.php:40\nmsgid \"Page\"\nmsgstr \"\"\n\n#: author-bio.php:12\nmsgid \"Published by\"\nmsgstr \"\"\n\n#: author-bio.php:34\nmsgid \"View all posts by %s\"\nmsgstr \"\"\n\n#: comments.php:28\nmsgctxt \"comments title\"\nmsgid \"One thought on &ldquo;%2$s&rdquo;\"\nmsgid_plural \"%1$s thoughts on &ldquo;%2$s&rdquo;\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: comments.php:53\nmsgid \"Comments are closed.\"\nmsgstr \"\"\n\n#. translators: %s: Name of current post\n#: content-link.php:31 content.php:33 inc/template-tags.php:238\nmsgid \"Continue reading %s\"\nmsgstr \"\"\n\n#: content-link.php:36 content-page.php:25 content.php:38 image.php:59\nmsgid \"Pages:\"\nmsgstr \"\"\n\n#: content-link.php:56 content-page.php:35 content-search.php:28\n#: content-search.php:33 content.php:57 image.php:71\nmsgid \"Edit\"\nmsgstr \"\"\n\n#: content-none.php:15\nmsgid \"Nothing Found\"\nmsgstr \"\"\n\n#: content-none.php:22\nmsgid \"\"\n\"Ready to publish your first post? <a href=\\\"%1$s\\\">Get started here</a>.\"\nmsgstr \"\"\n\n#: content-none.php:26\nmsgid \"\"\n\"Sorry, but nothing matched your search terms. Please try again with some \"\n\"different keywords.\"\nmsgstr \"\"\n\n#: content-none.php:31\nmsgid \"\"\n\"It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps \"\n\"searching can help.\"\nmsgstr \"\"\n\n#. #-#-#-#-#  twentyfifteen.pot (Twenty Fifteen 1.4)  #-#-#-#-#\n#. Author URI of the plugin/theme\n#: footer.php:25\nmsgid \"https://wordpress.org/\"\nmsgstr \"\"\n\n#: footer.php:25\nmsgid \"Proudly powered by %s\"\nmsgstr \"\"\n\n#: functions.php:85\nmsgid \"Primary Menu\"\nmsgstr \"\"\n\n#: functions.php:86\nmsgid \"Social Links Menu\"\nmsgstr \"\"\n\n#: functions.php:133\nmsgid \"Widget Area\"\nmsgstr \"\"\n\n#: functions.php:135\nmsgid \"Add widgets here to appear in your sidebar.\"\nmsgstr \"\"\n\n#. Translators: If there are characters in your language that are not supported\n#. by Noto Sans, translate this to 'off'. Do not translate into your own\n#. language.\n#: functions.php:161\nmsgctxt \"Noto Sans font: on or off\"\nmsgid \"on\"\nmsgstr \"\"\n\n#. Translators: If there are characters in your language that are not supported\n#. by Noto Serif, translate this to 'off'. Do not translate into your own\n#. language.\n#: functions.php:169\nmsgctxt \"Noto Serif font: on or off\"\nmsgid \"on\"\nmsgstr \"\"\n\n#. Translators: If there are characters in your language that are not supported\n#. by Inconsolata, translate this to 'off'. Do not translate into your own\n#. language.\n#: functions.php:177\nmsgctxt \"Inconsolata font: on or off\"\nmsgid \"on\"\nmsgstr \"\"\n\n#. Translators: To add an additional character subset specific to your\n#. language, translate this to 'greek', 'cyrillic', 'devanagari' or\n#. 'vietnamese'. Do not translate into your own language.\n#: functions.php:185\nmsgctxt \"Add new subset (greek, cyrillic, devanagari, vietnamese)\"\nmsgid \"no-subset\"\nmsgstr \"\"\n\n#: functions.php:255\nmsgid \"expand child menu\"\nmsgstr \"\"\n\n#: functions.php:256\nmsgid \"collapse child menu\"\nmsgstr \"\"\n\n#: header.php:26\nmsgid \"Skip to content\"\nmsgstr \"\"\n\n#: header.php:43\nmsgid \"Menu and widgets\"\nmsgstr \"\"\n\n#: image.php:24\nmsgid \"Previous Image\"\nmsgstr \"\"\n\n#: image.php:24\nmsgid \"Next Image\"\nmsgstr \"\"\n\n#: image.php:84\nmsgctxt \"Parent post link\"\nmsgid \"\"\n\"<span class=\\\"meta-nav\\\">Published in</span><span class=\\\"post-title\\\">\"\n\"%title</span>\"\nmsgstr \"\"\n\n#: inc/back-compat.php:37 inc/back-compat.php:47 inc/back-compat.php:60\nmsgid \"\"\n\"Twenty Fifteen requires at least WordPress version 4.1. You are running \"\n\"version %s. Please upgrade and try again.\"\nmsgstr \"\"\n\n#: inc/customizer.php:31\nmsgid \"Base Color Scheme\"\nmsgstr \"\"\n\n#: inc/customizer.php:46\nmsgid \"Header and Sidebar Text Color\"\nmsgstr \"\"\n\n#: inc/customizer.php:47 inc/customizer.php:63 inc/customizer.php:68\nmsgid \"Applied to the header on small screens and the sidebar on wide screens.\"\nmsgstr \"\"\n\n#: inc/customizer.php:62\nmsgid \"Header and Sidebar Background Color\"\nmsgstr \"\"\n\n#: inc/customizer.php:113\nmsgid \"Default\"\nmsgstr \"\"\n\n#: inc/customizer.php:124\nmsgid \"Dark\"\nmsgstr \"\"\n\n#: inc/customizer.php:135\nmsgid \"Yellow\"\nmsgstr \"\"\n\n#: inc/customizer.php:146\nmsgid \"Pink\"\nmsgstr \"\"\n\n#: inc/customizer.php:157\nmsgid \"Purple\"\nmsgstr \"\"\n\n#: inc/customizer.php:168\nmsgid \"Blue\"\nmsgstr \"\"\n\n#: inc/template-tags.php:23\nmsgid \"Comment navigation\"\nmsgstr \"\"\n\n#: inc/template-tags.php:26\nmsgid \"Older Comments\"\nmsgstr \"\"\n\n#: inc/template-tags.php:30\nmsgid \"Newer Comments\"\nmsgstr \"\"\n\n#: inc/template-tags.php:49\nmsgid \"Featured\"\nmsgstr \"\"\n\n#: inc/template-tags.php:55\nmsgctxt \"Used before post format.\"\nmsgid \"Format\"\nmsgstr \"\"\n\n#: inc/template-tags.php:76\nmsgctxt \"Used before publish date.\"\nmsgid \"Posted on\"\nmsgstr \"\"\n\n#: inc/template-tags.php:85\nmsgctxt \"Used before post author name.\"\nmsgid \"Author\"\nmsgstr \"\"\n\n#: inc/template-tags.php:91 inc/template-tags.php:99\nmsgctxt \"Used between list items, there is a space after the comma.\"\nmsgid \", \"\nmsgstr \"\"\n\n#: inc/template-tags.php:94\nmsgctxt \"Used before category names.\"\nmsgid \"Categories\"\nmsgstr \"\"\n\n#: inc/template-tags.php:102\nmsgctxt \"Used before tag names.\"\nmsgid \"Tags\"\nmsgstr \"\"\n\n#: inc/template-tags.php:113\nmsgctxt \"Used before full size attachment link.\"\nmsgid \"Full size\"\nmsgstr \"\"\n\n#. translators: %s: post title\n#: inc/template-tags.php:123\nmsgid \"Leave a comment<span class=\\\"screen-reader-text\\\"> on %s</span>\"\nmsgstr \"\"\n\n#: search.php:18\nmsgid \"Search Results for: %s\"\nmsgstr \"\"\n\n#: single.php:33\nmsgid \"Next\"\nmsgstr \"\"\n\n#: single.php:34\nmsgid \"Next post:\"\nmsgstr \"\"\n\n#: single.php:36\nmsgid \"Previous\"\nmsgstr \"\"\n\n#: single.php:37\nmsgid \"Previous post:\"\nmsgstr \"\"\n\n#. Theme Name of the plugin/theme\nmsgid \"Twenty Fifteen\"\nmsgstr \"\"\n\n#. Theme URI of the plugin/theme\nmsgid \"https://wordpress.org/themes/twentyfifteen/\"\nmsgstr \"\"\n\n#. Description of the plugin/theme\nmsgid \"\"\n\"Our 2015 default theme is clean, blog-focused, and designed for clarity. \"\n\"Twenty Fifteen's simple, straightforward typography is readable on a wide \"\n\"variety of screen sizes, and suitable for multiple languages. We designed it \"\n\"using a mobile-first approach, meaning your content takes center-stage, \"\n\"regardless of whether your visitors arrive by smartphone, tablet, laptop, or \"\n\"desktop computer.\"\nmsgstr \"\"\n\n#. Author of the plugin/theme\nmsgid \"the WordPress team\"\nmsgstr \"\"\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/page.php",
    "content": "<?php\n/**\n * The template for displaying pages\n *\n * This is the template that displays all pages by default.\n * Please note that this is the WordPress construct of pages and that\n * other \"pages\" on your WordPress site will use a different template.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t<?php\n\t\t// Start the loop.\n\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t// Include the page content template.\n\t\t\tget_template_part( 'content', 'page' );\n\n\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\tif ( comments_open() || get_comments_number() ) :\n\t\t\t\tcomments_template();\n\t\t\tendif;\n\n\t\t// End the loop.\n\t\tendwhile;\n\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</div><!-- .content-area -->\n\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/readme.txt",
    "content": "=== Twenty Fifteen ===\nContributors: the WordPress team\nRequires at least: WordPress 4.1\nTested up to: WordPress 4.5-trunk\nVersion: 1.4\nLicense: GPLv2 or later\nLicense URI: http://www.gnu.org/licenses/gpl-2.0.html\nTags: black, blue, gray, pink, purple, white, yellow, dark, light, two-columns, left-sidebar, fixed-layout, responsive-layout, accessibility-ready, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready\n\n== Description ==\nOur 2015 default theme is clean, blog-focused, and designed for clarity. Twenty Fifteen's simple, straightforward typography is readable on a wide variety of screen sizes, and suitable for multiple languages. We designed it using a mobile-first approach, meaning your content takes center-stage, regardless of whether your visitors arrive by smartphone, tablet, laptop, or desktop computer.\n\n* Mobile-first, Responsive Layout\n* Custom Colors\n* Custom Header\n* Social Links\n* Menu Description\n* Post Formats\n* The GPL v2.0 or later license. :) Use it to make something cool.\n\nFor more information about Twenty Fifteen please go to https://codex.wordpress.org/Twenty_Fifteen.\n\n== Installation ==\n\n1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button.\n2. Type in Twenty Fifteen in the search form and press the 'Enter' key on your keyboard.\n3. Click on the 'Activate' button to use your new theme right away.\n4. Go to https://codex.wordpress.org/Twenty_Fifteen for a guide on how to customize this theme.\n5. Navigate to Appearance > Customize in your admin panel and customize to taste.\n\n== Copyright ==\n\nTwenty Fifteen WordPress Theme, Copyright 2014-2015 WordPress.org & Automattic.com\nTwenty Fifteen is distributed under the terms of the GNU GPL\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nTwenty Fifteen Theme bundles the following third-party resources:\n\nHTML5 Shiv v3.7.0, Copyright 2014 Alexander Farkas\nLicenses: MIT/GPL2\nSource: https://github.com/aFarkas/html5shiv\n\nGenericons icon font, Copyright 2013-2015 Automattic.com\nLicense: GNU GPL, Version 2 (or later)\nSource: http://www.genericons.com\n\n== Changelog ==\n\n= 1.4 =\n* Released: December 8, 2015\n\nhttps://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.4\n\n= 1.3 =\n* Released: August 18, 2015\n\nhttps://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.3\n\n= 1.2 =\n* Released: May 6, 2015\n\nhttps://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.2\n\n= 1.1 =\n* Released: April 23, 2015\n\nhttps://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.1\n\n= 1.0 =\n* Released: December 18, 2014\n\nInitial release\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/rtl.css",
    "content": "/*\nTheme Name: Twenty Fifteen\nDescription: Adds support for languages written in a Right To Left (RTL) direction.\nIt's easy, just a matter of overwriting all the horizontal positioning attributes\nof your CSS stylesheet in a separate stylesheet file named rtl.css.\n\nSee: https://codex.wordpress.org/Right_to_Left_Language_Support\n*/\n\n/**\n * Table of Contents:\n *\n * 1.0 - Reset\n * 2.0 - Typography\n * 3.0 - Elements\n * 4.0 - Forms\n * 5.0 - Navigations\n * 6.0 - Accessibility\n * 7.0 - Alignments\n * 8.0 - Header\n * 9.0 - Widgets\n * 10.0 - Content\n *   10.1 - Posts and pages\n *   10.2 - Comments\n * 11.0 - Media Queries\n *    11.1 - Mobile Large\n *    11.2 - Tablet Small\n *    11.3 - Tablet Large\n *    11.4 - Desktop Small\n *    11.5 - Desktop Medium\n *    11.6 - Desktop Large\n *    11.7 - Desktop X-Large\n */\n\n\n/**\n * 1.0 Reset\n */\n\nbody {\n\tdirection: rtl;\n\tunicode-bidi: embed;\n}\n\ncaption,\nth,\ntd {\n\ttext-align: right;\n}\n\n\n/**\n * 2.0 Typography\n */\n\nbody,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput,\nselect,\ntextarea,\nblockquote cite,\nblockquote small,\n.post-password-form label,\n.main-navigation .menu-item-description,\n.post-navigation .meta-nav,\n.post-navigation .post-title,\n.pagination,\n.image-navigation,\n.comment-navigation,\n.site-title,\n.site-description,\n.widget-title,\n.widget_calendar caption,\n.widget_rss .rss-date,\n.widget_rss cite,\n.author-heading,\n.entry-footer,\n.page-title,\n.page-links,\n.entry-caption,\n.comments-title,\n.comment-reply-title,\n.comment-metadata,\n.pingback .edit-link,\n.comment-list .reply a,\n.comment-form label,\n.comment-notes,\n.comment-awaiting-moderation,\n.logged-in-as,\n.form-allowed-tags,\n.no-comments,\n.wp-caption-text,\n.gallery-caption {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n::-webkit-input-placeholder {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n:-moz-placeholder {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n::-moz-placeholder {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n:-ms-input-placeholder {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\nblockquote {\n\tborder-right: 4px solid rgba(51, 51, 51, 0.7);\n\tborder-left: 0;\n\tpadding-right: 0.7778em;\n\tpadding-left: 0;\n}\n\n\n/**\n * 3.0 Elements\n */\n\nul,\nol {\n\tmargin: 0 1.3333em 1.6em 0;\n}\n\ncaption,\nth,\ntd {\n\ttext-align: right;\n}\n\n\n/**\n * 4.0 Forms\n */\n\n.post-password-form input[type=\"submit\"] {\n\tright: auto;\n\tleft: 0;\n}\n\n\n/**\n * 5.0 Navigations\n */\n\n.main-navigation ul ul {\n\tmargin-right: 0.8em;\n\tmargin-left: auto;\n}\n\n.main-navigation .menu-item-has-children > a {\n\tpadding-right: 0;\n\tpadding-left: 48px;\n}\n\n.dropdown-toggle {\n\tright: auto;\n\tleft: 0;\n}\n\n.dropdown-toggle:after {\n\tright: -1px;\n\tleft: auto;\n}\n\n.social-navigation li {\n\tfloat: right;\n}\n\n.social-navigation a:before {\n\tright: 0;\n\tleft: auto;\n}\n\n.secondary-toggle {\n\tright: auto;\n\tleft: 0;\n}\n\n.post-navigation .has-post-thumbnail a:before {\n\tright: 0;\n\tleft: auto;\n}\n\n.pagination .prev {\n\tright: 0;\n\tleft: auto;\n}\n\n.pagination .prev:before {\n\tcontent: \"\\f429\";\n\tright: -1px;\n\tleft: auto;\n}\n\n.pagination .next {\n\tright: auto;\n\tleft: 0;\n}\n\n.pagination .next:before {\n\tcontent: \"\\f430\";\n\tright: auto;\n\tleft: -1px;\n}\n\n.image-navigation .nav-previous a:before,\n.comment-navigation .nav-previous a:before {\n\tcontent: \"\\f429\";\n\tmargin-right: auto;\n\tmargin-left: 0.2em;\n}\n\n.image-navigation .nav-next a:after,\n.comment-navigation .nav-next a:after {\n\tcontent: \"\\f430\";\n\tmargin-right: 0.2em;\n\tmargin-left: auto;\n}\n\n\n/**\n * 6.0 Accessibility\n */\n\n.screen-reader-text:hover,\n.screen-reader-text:focus {\n\tright: 5px;\n\tleft: auto;\n}\n\n\n/**\n * 7.0 Alignments\n */\n\n.alignright {\n\tfloat: right;\n}\n\n.alignleft {\n\tfloat: left;\n}\n\n.aligncenter {\n\tmargin-right: auto;\n\tmargin-left: auto;\n}\n\nblockquote.alignright,\n.wp-caption.alignright,\nimg.alignright {\n\tmargin: 0.4em 0 1.6em 1.6em;\n}\n\nblockquote.alignleft,\n.wp-caption.alignleft,\nimg.alignleft {\n\tmargin: 0.4em 1.6em 1.6em 0;\n}\n\n\n/**\n * 8.0 Header\n */\n\n.site-branding {\n\tpadding-right: 0;\n\tpadding-left: 60px;\n}\n\n\n/**\n * 9.0 Widgets\n */\n\n.widget_categories .children,\n.widget_nav_menu .sub-menu,\n.widget_pages .children {\n\tmargin: 0.7667em 0.8em 0 0;\n}\n\n\n/**\n * 10.0 Content\n */\n\n/**\n * 10.1 Posts and pages\n */\n\n.entry-content .more-link:after {\n\tcontent: \"\\f430\";\n}\n\n.author-link:after {\n\tcontent: \"\\f430\";\n}\n\n.author-info .avatar {\n\tfloat: right;\n\tmargin: 0 0 1.6em 1.6em;\n}\n\n.posted-on:before,\n.byline:before,\n.cat-links:before,\n.tags-links:before,\n.comments-link:before,\n.entry-format:before,\n.edit-link:before,\n.full-size-link:before {\n\tmargin-right: auto;\n\tmargin-left: 2px;\n}\n\n.posted-on,\n.byline,\n.cat-links,\n.tags-links,\n.comments-link,\n.entry-format,\n.full-size-link {\n\tmargin-right: auto;\n\tmargin-left: 1em;\n}\n\n.page-links a,\n.page-links > span {\n\tmargin: 0 0 0.3333em 0.3333em;\n}\n\n.page-links > .page-links-title {\n\tpadding-right: 0;\n\tpadding-left: 0.5em;\n}\n\n.type-attachment .entry-header {\n\tclear: left;\n}\n\n.format-link .entry-title a:after {\n\t-webkit-transform: scaleX(-1);\n\t-moz-transform: scaleX(-1);\n\t-ms-transform: scaleX(-1);\n\t-o-transform: scaleX(-1);\n\ttransform: scaleX(-1);\n}\n\n\n/**\n * 10.2 Comments\n */\n\n.comment-list .children > li {\n\tpadding-right: 0.8em;\n\tpadding-left: 0;\n}\n\n.comment-author .avatar {\n\tfloat: right;\n\tmargin-right: 0;\n\tmargin-left: 0.4em;\n}\n\n.bypostauthor > article .fn:after {\n\tright: 3px;\n\tleft: auto;\n}\n\n.comment-metadata .edit-link {\n\tmargin-right: 1em;\n\tmargin-left: auto;\n}\n\n.pingback .edit-link {\n\tmargin-right: 1em;\n\tmargin-left: auto;\n}\n\n.comment-content ul,\n.comment-content ol {\n\tmargin: 0 1.3333em 1.6em 0;\n}\n\n.comment-reply-title small a {\n\tfloat: left;\n}\n\n\n/**\n * 11.0 Media Queries\n */\n\n\n/**\n * 11.1 Mobile Large 620px\n */\n\n@media screen and (min-width: 38.75em) {\n\tul,\n\tol {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\tli > ul,\n\tli > ol,\n\tblockquote > ul,\n\tblockquote > ol {\n\t\tmargin-right: 1.3333em;\n\t\tmargin-left: auto;\n\t}\n\n\tblockquote {\n\t\tmargin-right: -1em;\n\t\tmargin-left: auto;\n\t}\n\n\tblockquote > blockquote {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\t.page-header {\n\t\tborder-color: inherit;\n\t\tborder-left: none;\n\t\tborder-style: solid;\n\t\tborder-width: 0 7px 0 0;\n\t}\n\n\t.page-title,\n\t.taxonomy-description {\n\t\tmargin-right: -7px;\n\t\tmargin-left: auto;\n\t}\n\n\t.comment-content ul,\n\t.comment-content ol {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\t.comment-content li > ul,\n\t.comment-content li > ol,\n\t.comment-content blockquote > ul,\n\t.comment-content blockquote > ol {\n\t\tmargin-right: 1.3333em;\n\t\tmargin-left: auto;\n\t}\n}\n\n\n/**\n * 11.2 Tablet Small 740px\n */\n\n@media screen and (min-width: 46.25em) {\n\tblockquote {\n\t\tmargin-right: -1.05em;\n\t\tmargin-left: auto;\n\t\tpadding-right: 0.85em;\n\t\tpadding-left: 0;\n\t}\n\n\t.main-navigation ul ul {\n\t\tmargin-right: 1em;\n\t\tmargin-left: auto;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4118em 0 1.6471em 1.6471em;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4118em 1.6471em 1.6471em 0;\n\t}\n\n\t.site-branding {\n\t\tpadding-right: 0;\n\t\tpadding-left: 66px;\n\t}\n\n\t.widget blockquote {\n\t\tmargin-right: -1.2353em;\n\t\tmargin-left: auto;\n\t\tpadding-right: 1em;\n\t\tpadding-left: 0;\n\t}\n\n\t.widget blockquote > blockquote {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\t.widget blockquote.alignright,\n\t.widget .wp-caption.alignright,\n\t.widget img.alignright {\n\t\tmargin: 0.5em 0 1.5em 1.5em;\n\t}\n\n\t.widget blockquote.alignleft,\n\t.widget .wp-caption.alignleft,\n\t.widget img.alignleft {\n\t\tmargin: 0.5em 1.5em 1.5em 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.9643em 1em 0 0;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0 0.2857em 0.2857em;\n\t}\n\n\t.author-info .avatar {\n\t\tmargin: 0 0 1.6471em 1.6471em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-right: 1.2353em;\n\t\tpadding-left: 0;\n\t}\n\n\t.comment-author .avatar {\n\t\tmargin-left: 1.64705em;\n\t}\n\n\t.bypostauthor > article .fn:after {\n\t\tright: 6px;\n\t\tleft: auto;\n\t}\n}\n\n\n/**\n * 11.3 Tablet Large 880px\n */\n\n@media screen and (min-width: 55em) {\n\tblockquote {\n\t\tmargin-right: -1.0909em;\n\t\tmargin-left: auto;\n\t\tpadding-right: 0.9091em;\n\t\tpadding-left: 0;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4211em 0 1.6842em 1.6842em;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4211em 1.6842em 1.6842em 0;\n\t}\n\n\t.site-branding {\n\t\tpadding-right: 0;\n\t\tpadding-left: 74px;\n\t}\n\n\t.widget blockquote {\n\t\tmargin-right: -1.2632em;\n\t\tmargin-left: auto;\n\t\tpadding-right: 1.0526em;\n\t\tpadding-left: 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.7188em 1em 0 0;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0 0.25em 0.25em;\n\t}\n\n\t.author-info .avatar {\n\t\tmargin: 0 0 1.6842em 1.6842em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-right: 1.4737em;\n\t\tpadding-left: 0;\n\t}\n\n\t.comment-author .avatar {\n\t\tmargin-left: 1.6842em;\n\t}\n}\n\n\n/**\n * 11.4 Desktop Small 955px\n */\n\n@media screen and (min-width: 59.6875em) {\n\tbody:before {\n\t\tright: 0;\n\t\tleft: auto;\n\t}\n\n\t.sidebar {\n\t\tfloat: right;\n\t\tmargin-right: auto;\n\t\tmargin-left: -100%;\n\t}\n\n\t.site-content {\n\t\tfloat: right;\n\t\tmargin-right: 29.4118%;\n\t\tmargin-left: auto;\n\t}\n\n\tblockquote {\n\t\tmargin-right: -1.3333em;\n\t\tmargin-left: auto;\n\t\tpadding-right: 1.1111em;\n\t\tpadding-left: 0;\n\t}\n\n\t.main-navigation .menu-item-has-children > a {\n\t\tpadding-right: 0;\n\t\tpadding-left: 30px;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4em 0 1.6em 1.6em;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4em 1.6em 1.6em 0;\n\t}\n\n\t.widget blockquote {\n\t\tmargin-right: -1.5em;\n\t\tmargin-left: auto;\n\t\tpadding-right: 1.1667em;\n\t\tpadding-left: 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.4583em 1em 0 0;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0 0.3333em 0.3333em;\n\t}\n\n\t.author-info .avatar {\n\t\tmargin: 0 0 1.5em 1.5em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-right: 0.8em;\n\t\tpadding-left: 0;\n\t}\n\n\t.comment-author .avatar {\n\t\tmargin-left: 0.8em;\n\t}\n\n\t.bypostauthor > article .fn:after {\n\t\tright: 3px;\n\t\tleft: auto;\n\t}\n\n\t.site-branding {\n\t\tpadding: 0;\n\t}\n\n\t.site-footer {\n\t\tfloat: right;\n\t\tmargin: 0 35.2941% 0 0;\n\t}\n}\n\n\n/**\n * 11.5 Desktop Medium 1100px\n */\n\n@media screen and (min-width: 68.75em) {\n\tblockquote {\n\t\tmargin-right: -1.05em;\n\t\tmargin-left: auto;\n\t\tpadding-right: 0.85em;\n\t\tpadding-left: 0;\n\t}\n\n\t.main-navigation .menu-item-has-children > a {\n\t\tpadding-right: 0;\n\t\tpadding-left: 34px;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4118em 0 1.6471em 1.6471em;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4118em 1.6471em 1.6471em 0;\n\t}\n\n\t.widget blockquote {\n\t\tpadding-right: 1.2143em;\n\t\tpadding-left: 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.4643em 1em 0 0;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0 0.2857em 0.2857em;\n\t}\n\n\t.author-info .avatar {\n\t\tmargin: 0 0 1.6471em 1.6471em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-right: 1.1667em;\n\t\tpadding-left: 0;\n\t}\n\n\t.comment-author .avatar {\n\t\tmargin-left: 1.64705em;\n\t}\n\n\t.bypostauthor > article .fn:after {\n\t\tright: 6px;\n\t\tleft: auto;\n\t}\n}\n\n\n/**\n * 11.6 Desktop Large 1240px\n */\n\n@media screen and (min-width: 77.5em) {\n\tblockquote {\n\t\tmargin-right: -1.0909em;\n\t\tmargin-left: auto;\n\t\tpadding-right: 0.9091em;\n\t\tpadding-left: 0;\n\t}\n\n\t.main-navigation .menu-item-has-children > a {\n\t\tpadding-right: 0;\n\t\tpadding-left: 38px;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4211em 0 1.6842em 1.6842em;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4211em 1.6842em 1.6842em 0;\n\t}\n\n\t.widget blockquote {\n\t\tpadding-right: 1.25em;\n\t\tpadding-left: 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.4688em 1em 0 0;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0 0.25em 0.25em;\n\t}\n\n\t.author-info .avatar {\n\t\tmargin: 0 0 1.6842em 1.6842em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-right: 1.4737em;\n\t\tpadding-left: 0;\n\t}\n\n\t.comment-author .avatar {\n\t\tmargin-left: 1.64705em;\n\t}\n}\n\n\n/**\n * 11.7 Desktop X-Large 1403px\n */\n\n@media screen and (min-width: 87.6875em) {\n\tbody:before {\n\t\twidth: -webkit-calc(50% - 289px);\n\t\twidth: calc(50% - 289px);\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/search.php",
    "content": "<?php\n/**\n * The template for displaying search results pages.\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"page-header\">\n\t\t\t\t<h1 class=\"page-title\"><?php printf( __( 'Search Results for: %s', 'twentyfifteen' ), get_search_query() ); ?></h1>\n\t\t\t</header><!-- .page-header -->\n\n\t\t\t<?php\n\t\t\t// Start the loop.\n\t\t\twhile ( have_posts() ) : the_post(); ?>\n\n\t\t\t\t<?php\n\t\t\t\t/*\n\t\t\t\t * Run the loop for the search to output the results.\n\t\t\t\t * If you want to overload this in a child theme then include a file\n\t\t\t\t * called content-search.php and that will be used instead.\n\t\t\t\t */\n\t\t\t\tget_template_part( 'content', 'search' );\n\n\t\t\t// End the loop.\n\t\t\tendwhile;\n\n\t\t\t// Previous/next page navigation.\n\t\t\tthe_posts_pagination( array(\n\t\t\t\t'prev_text'          => __( 'Previous page', 'twentyfifteen' ),\n\t\t\t\t'next_text'          => __( 'Next page', 'twentyfifteen' ),\n\t\t\t\t'before_page_number' => '<span class=\"meta-nav screen-reader-text\">' . __( 'Page', 'twentyfifteen' ) . ' </span>',\n\t\t\t) );\n\n\t\t// If no content, include the \"No posts found\" template.\n\t\telse :\n\t\t\tget_template_part( 'content', 'none' );\n\n\t\tendif;\n\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</section><!-- .content-area -->\n\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/sidebar.php",
    "content": "<?php\n/**\n * The sidebar containing the main widget area\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nif ( has_nav_menu( 'primary' ) || has_nav_menu( 'social' ) || is_active_sidebar( 'sidebar-1' )  ) : ?>\n\t<div id=\"secondary\" class=\"secondary\">\n\n\t\t<?php if ( has_nav_menu( 'primary' ) ) : ?>\n\t\t\t<nav id=\"site-navigation\" class=\"main-navigation\" role=\"navigation\">\n\t\t\t\t<?php\n\t\t\t\t\t// Primary navigation menu.\n\t\t\t\t\twp_nav_menu( array(\n\t\t\t\t\t\t'menu_class'     => 'nav-menu',\n\t\t\t\t\t\t'theme_location' => 'primary',\n\t\t\t\t\t) );\n\t\t\t\t?>\n\t\t\t</nav><!-- .main-navigation -->\n\t\t<?php endif; ?>\n\n\t\t<?php if ( has_nav_menu( 'social' ) ) : ?>\n\t\t\t<nav id=\"social-navigation\" class=\"social-navigation\" role=\"navigation\">\n\t\t\t\t<?php\n\t\t\t\t\t// Social links navigation menu.\n\t\t\t\t\twp_nav_menu( array(\n\t\t\t\t\t\t'theme_location' => 'social',\n\t\t\t\t\t\t'depth'          => 1,\n\t\t\t\t\t\t'link_before'    => '<span class=\"screen-reader-text\">',\n\t\t\t\t\t\t'link_after'     => '</span>',\n\t\t\t\t\t) );\n\t\t\t\t?>\n\t\t\t</nav><!-- .social-navigation -->\n\t\t<?php endif; ?>\n\n\t\t<?php if ( is_active_sidebar( 'sidebar-1' ) ) : ?>\n\t\t\t<div id=\"widget-area\" class=\"widget-area\" role=\"complementary\">\n\t\t\t\t<?php dynamic_sidebar( 'sidebar-1' ); ?>\n\t\t\t</div><!-- .widget-area -->\n\t\t<?php endif; ?>\n\n\t</div><!-- .secondary -->\n\n<?php endif; ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/single.php",
    "content": "<?php\n/**\n * The template for displaying all single posts and attachments\n *\n * @package WordPress\n * @subpackage Twenty_Fifteen\n * @since Twenty Fifteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t<?php\n\t\t// Start the loop.\n\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t/*\n\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t */\n\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\tif ( comments_open() || get_comments_number() ) :\n\t\t\t\tcomments_template();\n\t\t\tendif;\n\n\t\t\t// Previous/next post navigation.\n\t\t\tthe_post_navigation( array(\n\t\t\t\t'next_text' => '<span class=\"meta-nav\" aria-hidden=\"true\">' . __( 'Next', 'twentyfifteen' ) . '</span> ' .\n\t\t\t\t\t'<span class=\"screen-reader-text\">' . __( 'Next post:', 'twentyfifteen' ) . '</span> ' .\n\t\t\t\t\t'<span class=\"post-title\">%title</span>',\n\t\t\t\t'prev_text' => '<span class=\"meta-nav\" aria-hidden=\"true\">' . __( 'Previous', 'twentyfifteen' ) . '</span> ' .\n\t\t\t\t\t'<span class=\"screen-reader-text\">' . __( 'Previous post:', 'twentyfifteen' ) . '</span> ' .\n\t\t\t\t\t'<span class=\"post-title\">%title</span>',\n\t\t\t) );\n\n\t\t// End the loop.\n\t\tendwhile;\n\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</div><!-- .content-area -->\n\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfifteen/style.css",
    "content": "/*\nTheme Name: Twenty Fifteen\nTheme URI: https://wordpress.org/themes/twentyfifteen/\nAuthor: the WordPress team\nAuthor URI: https://wordpress.org/\nDescription: Our 2015 default theme is clean, blog-focused, and designed for clarity. Twenty Fifteen's simple, straightforward typography is readable on a wide variety of screen sizes, and suitable for multiple languages. We designed it using a mobile-first approach, meaning your content takes center-stage, regardless of whether your visitors arrive by smartphone, tablet, laptop, or desktop computer.\nVersion: 1.4\nLicense: GNU General Public License v2 or later\nLicense URI: http://www.gnu.org/licenses/gpl-2.0.html\nTags: black, blue, gray, pink, purple, white, yellow, dark, light, two-columns, left-sidebar, fixed-layout, responsive-layout, accessibility-ready, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready\nText Domain: twentyfifteen\n\nThis theme, like WordPress, is licensed under the GPL.\nUse it to make something cool, have fun, and share what you've learned with others.\n*/\n\n\n/**\n * Table of Contents\n *\n * 1.0 - Reset\n * 2.0 - Genericons\n * 3.0 - Typography\n * 4.0 - Elements\n * 5.0 - Forms\n * 6.0 - Navigations\n *   6.1 - Links\n *   6.2 - Menus\n * 7.0 - Accessibility\n * 8.0 - Alignments\n * 9.0 - Clearings\n * 10.0 - Header\n * 11.0 - Widgets\n * 12.0 - Content\n *    12.1 - Posts and pages\n *    12.2 - Post Formats\n *    12.3 - Comments\n * 13.0 - Footer\n * 14.0 - Media\n *    14.1 - Captions\n *    14.2 - Galleries\n * 15.0 - Multisite\n * 16.0 - Media Queries\n *    16.1 - Mobile Large\n *    16.2 - Tablet Small\n *    16.3 - Tablet Large\n *    16.4 - Desktop Small\n *    16.5 - Desktop Medium\n *    16.6 - Desktop Large\n *    16.7 - Desktop X-Large\n * 17.0 - Print\n */\n\n\n/**\n * 1.0 - Reset\n *\n * Resetting and rebuilding styles have been helped along thanks to the fine\n * work of Eric Meyer, Nicolas Gallagher, Jonathan Neal, and Blueprint.\n */\n\nhtml, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {\n\tborder: 0;\n\tfont-family: inherit;\n\tfont-size: 100%;\n\tfont-style: inherit;\n\tfont-weight: inherit;\n\tmargin: 0;\n\toutline: 0;\n\tpadding: 0;\n\tvertical-align: baseline;\n}\n\nhtml {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tfont-size: 62.5%;\n\toverflow-y: scroll;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust: 100%;\n}\n\n*,\n*:before,\n*:after {\n\t-webkit-box-sizing: inherit;\n\t-moz-box-sizing: inherit;\n\tbox-sizing: inherit;\n}\n\nbody {\n\tbackground: #f1f1f1;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nmain,\nnav,\nsection {\n\tdisplay: block;\n}\n\nol,\nul {\n\tlist-style: none;\n}\n\ntable {\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n}\n\ncaption,\nth,\ntd {\n\tfont-weight: normal;\n\ttext-align: left;\n}\n\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n\tcontent: \"\";\n}\n\nblockquote,\nq {\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n\tquotes: none;\n}\n\na:focus {\n\toutline: 2px solid #c1c1c1;\n\toutline: 2px solid rgba(51, 51, 51, 0.3);\n}\n\na:hover,\na:active {\n\toutline: 0;\n}\n\na img {\n\tborder: 0;\n}\n\n\n/**\n * 2.0 - Genericons\n */\n\n.social-navigation a:before,\n.secondary-toggle:before,\n.dropdown-toggle:after,\n.bypostauthor > article .fn:after,\n.comment-reply-title small a:before,\n.comment-navigation .nav-next a:after,\n.comment-navigation .nav-previous a:before,\n.posted-on:before,\n.byline:before,\n.cat-links:before,\n.tags-links:before,\n.comments-link:before,\n.entry-format:before,\n.edit-link:before,\n.full-size-link:before,\n.pagination .prev:before,\n.pagination .next:before,\n.image-navigation a:before,\n.image-navigation a:after,\n.format-link .entry-title a:after,\n.entry-content .more-link:after,\n.entry-summary .more-link:after,\n.author-link:after {\n\t-moz-osx-font-smoothing: grayscale;\n\t-webkit-font-smoothing: antialiased;\n\tdisplay: inline-block;\n\tfont-family: \"Genericons\";\n\tfont-size: 16px;\n\tfont-style: normal;\n\tfont-weight: normal;\n\tfont-variant: normal;\n\tline-height: 1;\n\tspeak: none;\n\ttext-align: center;\n\ttext-decoration: inherit;\n\ttext-transform: none;\n\tvertical-align: top;\n}\n\n\n/**\n * 3.0 Typography\n */\n\nbody,\nbutton,\ninput,\nselect,\ntextarea {\n\tcolor: #333;\n\tfont-family: \"Noto Serif\", serif;\n\tfont-size: 15px;\n\tfont-size: 1.5rem;\n\tline-height: 1.6;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tclear: both;\n\tfont-weight: 700;\n}\n\np {\n\tmargin-bottom: 1.6em;\n}\n\nb,\nstrong {\n\tfont-weight: 700;\n}\n\ndfn,\ncite,\nem,\ni {\n\tfont-style: italic;\n}\n\nblockquote {\n\tborder-left: 4px solid #707070;\n\tborder-left: 4px solid rgba(51, 51, 51, 0.7);\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-size: 18px;\n\tfont-size: 1.8rem;\n\tfont-style: italic;\n\tline-height: 1.6667;\n\tmargin-bottom: 1.6667em;\n\tpadding-left: 0.7778em;\n}\n\nblockquote p {\n\tmargin-bottom: 1.6667em;\n}\n\nblockquote > p:last-child {\n\tmargin-bottom: 0;\n}\n\nblockquote cite,\nblockquote small {\n\tcolor: #333;\n\tfont-size: 15px;\n\tfont-size: 1.5rem;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tline-height: 1.6;\n}\n\nblockquote em,\nblockquote i,\nblockquote cite {\n\tfont-style: normal;\n}\n\nblockquote strong,\nblockquote b {\n\tfont-weight: 400;\n}\n\naddress {\n\tfont-style: italic;\n\tmargin: 0 0 1.6em;\n}\n\ncode,\nkbd,\ntt,\nvar,\nsamp,\npre {\n\tfont-family: Inconsolata, monospace;\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre {\n\tbackground-color: transparent;\n\tbackground-color: rgba(0, 0, 0, 0.01);\n\tborder: 1px solid #eaeaea;\n\tborder: 1px solid rgba(51, 51, 51, 0.1);\n\tline-height: 1.2;\n\tmargin-bottom: 1.6em;\n\tmax-width: 100%;\n\toverflow: auto;\n\tpadding: 0.8em;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\nabbr[title] {\n\tborder-bottom: 1px dotted #eaeaea;\n\tborder-bottom: 1px dotted rgba(51, 51, 51, 0.1);\n\tcursor: help;\n}\n\nmark,\nins {\n\tbackground-color: #fff9c0;\n\ttext-decoration: none;\n}\n\nsup,\nsub {\n\tfont-size: 75%;\n\theight: 0;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsup {\n\tbottom: 1ex;\n}\n\nsub {\n\ttop: .5ex;\n}\n\nsmall {\n\tfont-size: 75%;\n}\n\nbig {\n\tfont-size: 125%;\n}\n\n\n/**\n * 4.0 Elements\n */\n\nhr {\n\tbackground-color: #eaeaea;\n\tbackground-color: rgba(51, 51, 51, 0.1);\n\tborder: 0;\n\theight: 1px;\n\tmargin-bottom: 1.6em;\n}\n\nul,\nol {\n\tmargin: 0 0 1.6em 1.3333em;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin-bottom: 0;\n}\n\ndl {\n\tmargin-bottom: 1.6em;\n}\n\ndt {\n\tfont-weight: bold;\n}\n\ndd {\n\tmargin-bottom: 1.6em;\n}\n\ntable,\nth,\ntd {\n\tborder: 1px solid #eaeaea;\n\tborder: 1px solid rgba(51, 51, 51, 0.1);\n}\n\ntable {\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n\tborder-width: 1px 0 0 1px;\n\tmargin: 0 0 1.6em;\n\ttable-layout: fixed; /* Prevents HTML tables from becoming too wide */\n\twidth: 100%;\n}\n\ncaption,\nth,\ntd {\n\tfont-weight: normal;\n\ttext-align: left;\n}\n\nth {\n\tborder-width: 0 1px 1px 0;\n\tfont-weight: 700;\n}\n\ntd {\n\tborder-width: 0 1px 1px 0;\n}\n\nth, td {\n\tpadding: 0.4em;\n}\n\nimg {\n\t-ms-interpolation-mode: bicubic;\n\tborder: 0;\n\theight: auto;\n\tmax-width: 100%;\n\tvertical-align: middle;\n}\n\nfigure {\n\tmargin: 0;\n}\n\ndel {\n\topacity: 0.8;\n}\n\n/* Placeholder text color -- selectors need to be separate to work. */\n\n::-webkit-input-placeholder {\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n}\n\n:-moz-placeholder {\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n}\n\n::-moz-placeholder {\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\topacity: 1; /* Since FF19 lowers the opacity of the placeholder by default */\n}\n\n:-ms-input-placeholder {\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n}\n\n\n/**\n * 5.0 Forms\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n\tbackground-color: #f7f7f7;\n\tborder-radius: 0;\n\tfont-size: 16px;\n\tfont-size: 1.6rem;\n\tline-height: 1.5;\n\tmargin: 0;\n\tmax-width: 100%;\n\tvertical-align: baseline;\n}\n\nbutton,\ninput {\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n\tline-height: normal;\n}\n\ninput,\ntextarea {\n\tbackground-image: -webkit-linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0)); /* Removing the inner shadow on iOS inputs */\n\tborder: 1px solid #eaeaea;\n\tborder: 1px solid rgba(51, 51, 51, 0.1);\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n}\n\ninput:focus,\ntextarea:focus {\n\tbackground-color: #fff;\n\tborder: 1px solid #c1c1c1;\n\tborder: 1px solid rgba(51, 51, 51, 0.3);\n\tcolor: #333;\n}\n\ninput:focus,\nselect:focus {\n\toutline: 2px solid #c1c1c1;\n\toutline: 2px solid rgba(51, 51, 51, 0.3);\n}\n\nbutton[disabled],\ninput[disabled],\nselect[disabled],\ntextarea[disabled] {\n\tcursor: default;\n\topacity: .5;\n}\n\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n\t-webkit-appearance: button;\n\tbackground-color: #333;\n\tborder: 0;\n\tcolor: #fff;\n\tcursor: pointer;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tfont-weight: 700;\n\tpadding: 0.7917em 1.5em;\n\ttext-transform: uppercase;\n}\n\nbutton:hover,\ninput[type=\"button\"]:hover,\ninput[type=\"reset\"]:hover,\ninput[type=\"submit\"]:hover,\nbutton:focus,\ninput[type=\"button\"]:focus,\ninput[type=\"reset\"]:focus,\ninput[type=\"submit\"]:focus {\n\tbackground-color: #707070;\n\tbackground-color: rgba(51, 51, 51, 0.7);\n\toutline: 0;\n}\n\ninput[type=\"search\"] {\n\t-webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\ninput[type=\"text\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ninput[type=\"search\"],\ntextarea {\n\tpadding: 0.375em;\n\twidth: 100%;\n}\n\ntextarea {\n\toverflow: auto;\n\tvertical-align: top;\n}\n\ninput[type=\"text\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"search\"]:focus,\ntextarea:focus {\n\toutline: 0;\n}\n\n.post-password-form {\n\tposition: relative;\n}\n\n.post-password-form label {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tdisplay: block;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tfont-weight: 700;\n\tletter-spacing: 0.04em;\n\tline-height: 1.5;\n\ttext-transform: uppercase;\n}\n\n.post-password-form input[type=\"submit\"] {\n\tpadding: 0.7917em;\n\tposition: absolute;\n\tright: 0;\n\tbottom: 0;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\tpadding: 0;\n}\n\n.search-form input[type=\"submit\"],\n.widget .search-form input[type=\"submit\"] {\n\tpadding: 0;\n}\n\n\n/**\n * 6.0 Navigations\n */\n\n\n/**\n * 6.1 Links\n */\n\na {\n\tcolor: #333;\n\ttext-decoration: none;\n}\n\na:hover,\na:focus {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n}\n\n\n/**\n * 6.2 Menus\n */\n\n.main-navigation a {\n\tdisplay: block;\n\tpadding: 0.8em 0;\n\tposition: relative;\n\ttext-decoration: none;\n}\n\n.main-navigation ul {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.main-navigation ul ul {\n\tdisplay: none;\n\tmargin-left: 0.8em;\n}\n\n.main-navigation ul .toggled-on {\n\tdisplay: block;\n}\n\n.main-navigation li {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tposition: relative;\n}\n\n.main-navigation .current-menu-item > a,\n.main-navigation .current-menu-ancestor > a {\n\tfont-weight: 700;\n}\n\n.main-navigation .nav-menu > ul > li:first-child,\n.main-navigation .nav-menu > li:first-child {\n\tborder-top: 0;\n}\n\n.main-navigation .menu-item-has-children > a {\n\tpadding-right: 48px;\n}\n\n.main-navigation .menu-item-description {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tfont-weight: 400;\n\tline-height: 1.5;\n\tmargin-top: 0.5em;\n}\n\n.no-js .main-navigation ul ul {\n\tdisplay: block;\n}\n\n.dropdown-toggle {\n\tbackground-color: transparent;\n\tborder: 0;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\tcontent: \"\";\n\theight: 42px;\n\tpadding: 0;\n\tposition: absolute;\n\ttext-transform: lowercase; /* Stop screen readers to read the text as capital letters */\n\ttop: 3px;\n\tright: 0;\n\twidth: 42px;\n}\n\n.dropdown-toggle:after {\n\tcolor: #333;\n\tcontent: \"\\f431\";\n\tfont-size: 24px;\n\tline-height: 42px;\n\tposition: relative;\n\ttop: 0;\n\tleft: 1px;\n\twidth: 42px;\n}\n\n.dropdown-toggle:hover,\n.dropdown-toggle:focus {\n\tbackground-color: #eaeaea;\n\tbackground-color: rgba(51, 51, 51, 0.1);\n}\n\n.dropdown-toggle:focus {\n\toutline: 1px solid #c1c1c1;\n\toutline: 1px solid rgba(51, 51, 51, 0.3);\n}\n\n.dropdown-toggle.toggle-on:after {\n\tcontent: \"\\f432\";\n}\n\n.social-navigation {\n\tmargin: 9.0909% 0;\n}\n\n.social-navigation ul {\n\tlist-style: none;\n\tmargin: 0 0 -1.6em 0;\n}\n\n.social-navigation li {\n\tfloat: left;\n}\n\n.social-navigation a {\n\tdisplay: block;\n\theight: 3.2em;\n\tposition: relative;\n\twidth: 3.2em;\n}\n\n.social-navigation a:before {\n\tcontent: \"\\f415\";\n\tfont-size: 24px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.social-navigation a[href*=\"codepen.io\"]:before {\n\tcontent: \"\\f216\";\n}\n\n.social-navigation a[href*=\"digg.com\"]:before {\n\tcontent: \"\\f221\";\n}\n\n.social-navigation a[href*=\"dribbble.com\"]:before {\n\tcontent: \"\\f201\";\n}\n\n.social-navigation a[href*=\"dropbox.com\"]:before {\n\tcontent: \"\\f225\";\n}\n\n.social-navigation a[href*=\"facebook.com\"]:before {\n\tcontent: \"\\f203\";\n}\n\n.social-navigation a[href*=\"flickr.com\"]:before {\n\tcontent: \"\\f211\";\n}\n\n.social-navigation a[href*=\"foursquare.com\"]:before {\n\tcontent: \"\\f226\";\n}\n\n.social-navigation a[href*=\"plus.google.com\"]:before {\n\tcontent: \"\\f206\";\n}\n\n.social-navigation a[href*=\"github.com\"]:before {\n\tcontent: \"\\f200\";\n}\n\n.social-navigation a[href*=\"instagram.com\"]:before {\n\tcontent: \"\\f215\";\n}\n\n.social-navigation a[href*=\"linkedin.com\"]:before {\n\tcontent: \"\\f208\";\n}\n\n.social-navigation a[href*=\"pinterest.com\"]:before {\n\tcontent: \"\\f210\";\n}\n\n.social-navigation a[href*=\"getpocket.com\"]:before {\n\tcontent: \"\\f224\";\n}\n\n.social-navigation a[href*=\"polldaddy.com\"]:before {\n\tcontent: \"\\f217\";\n}\n\n.social-navigation a[href*=\"reddit.com\"]:before {\n\tcontent: \"\\f222\";\n}\n\n.social-navigation a[href*=\"stumbleupon.com\"]:before {\n\tcontent: \"\\f223\";\n}\n\n.social-navigation a[href*=\"tumblr.com\"]:before {\n\tcontent: \"\\f214\";\n}\n\n.social-navigation a[href*=\"twitter.com\"]:before {\n\tcontent: \"\\f202\";\n}\n\n.social-navigation a[href*=\"vimeo.com\"]:before {\n\tcontent: \"\\f212\";\n}\n\n.social-navigation a[href*=\"wordpress.com\"]:before,\n.social-navigation a[href*=\"wordpress.org\"]:before {\n\tcontent: \"\\f205\";\n}\n\n.social-navigation a[href*=\"youtube.com\"]:before {\n\tcontent: \"\\f213\";\n}\n\n.social-navigation a[href*=\"mailto:\"]:before {\n\tcontent: \"\\f410\";\n}\n\n.social-navigation a[href*=\"spotify.com\"]:before {\n\tcontent: \"\\f515\";\n}\n\n.social-navigation a[href*=\"twitch.tv\"]:before {\n\tcontent: \"\\f516\";\n}\n\n.social-navigation a[href$=\"/feed/\"]:before {\n\tcontent: \"\\f413\";\n}\n\n.social-navigation a[href*=\"path.com\"]:before {\n\tcontent: \"\\f219\";\n}\n\n.social-navigation a[href*=\"skype.com\"]:before {\n\tcontent: \"\\f220\";\n}\n\n.secondary-toggle {\n\tbackground-color: transparent;\n\tborder: 1px solid #eaeaea;\n\tborder: 1px solid rgba(51, 51, 51, 0.1);\n\theight: 42px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\ttop: 50%;\n\tright: 0;\n\ttext-align: center;\n\t-webkit-transform: translateY(-50%);\n\t-ms-transform: translateY(-50%);\n\ttransform: translateY(-50%);\n\twidth: 42px;\n}\n\n.secondary-toggle:before {\n\tcolor: #333;\n\tcontent: \"\\f419\";\n\tline-height: 40px;\n\twidth: 40px;\n}\n\n.secondary-toggle:hover,\n.secondary-toggle:focus {\n\tbackground-color: transparent;\n\tborder: 1px solid #c1c1c1;\n\tborder: 1px solid rgba(51, 51, 51, 0.3);\n\toutline: 0;\n}\n\n.secondary-toggle.toggled-on:before {\n\tcontent: \"\\f405\";\n\tfont-size: 32px;\n\tposition: relative;\n\ttop: 1px;\n\tleft: -1px;\n}\n\n.post-navigation {\n\tbackground-color: #fff;\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tfont-weight: 700;\n}\n\n.post-navigation a {\n\tdisplay: block;\n\tpadding: 3.8461% 7.6923%;\n}\n\n.post-navigation span {\n\tdisplay: block;\n}\n\n.post-navigation .meta-nav {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tletter-spacing: 0.04em;\n\tline-height: 1.5;\n\tposition: relative;\n\ttext-transform: uppercase;\n\tz-index: 2;\n}\n\n.post-navigation .post-title {\n\tfont-family: \"Noto Serif\", serif;\n\tfont-size: 18px;\n\tfont-size: 1.8rem;\n\tline-height: 1.3333;\n\tposition: relative;\n\tz-index: 2;\n}\n\n.post-navigation .nav-next,\n.post-navigation .nav-previous {\n\tbackground-position: center;\n\tbackground-size: cover;\n\tposition: relative;\n}\n\n.post-navigation a:before {\n\tcontent: \"\";\n\tdisplay: block;\n\theight: 100%;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tz-index: 1;\n}\n\n.post-navigation a:hover:before,\n.post-navigation a:focus:before {\n\topacity: 0.5;\n}\n\n.post-navigation .meta-nav {\n\topacity: 0.8;\n}\n\n.post-navigation div + div {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n}\n\n.pagination {\n\tbackground-color: #fff;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tfont-family: \"Noto Sans\", sans-serif;\n}\n\n.pagination .nav-links {\n\tmin-height: 3.2em;\n\tposition: relative;\n\ttext-align: center;\n}\n\n/* reset screen-reader-text */\n.pagination .current .screen-reader-text {\n\tposition: static !important;\n}\n\n.pagination .page-numbers {\n\tdisplay: none;\n\tline-height: 3.2em;\n\tpadding: 0 0.6667em;\n}\n\n.pagination .page-numbers.current {\n\ttext-transform: uppercase;\n}\n\n.pagination .current {\n\tdisplay: inline-block;\n\tfont-weight: 700;\n}\n\n.pagination .prev,\n.pagination .next {\n\t-webkit-tap-highlight-color: rgba(255, 255, 255, 0.3);\n\tbackground-color: #333;\n\tcolor: #fff;\n\tdisplay: inline-block;\n\theight: 48px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 48px;\n}\n\n.pagination .prev:before,\n.pagination .next:before {\n\tfont-size: 32px;\n\theight: 48px;\n\tline-height: 48px;\n\tposition: relative;\n\twidth: 48px;\n}\n\n.pagination .prev:hover,\n.pagination .prev:focus,\n.pagination .next:hover,\n.pagination .next:focus {\n\tbackground-color: #707070;\n\tbackground-color: rgba(51, 51, 51, 0.7);\n}\n\n.pagination .prev {\n\tleft: 0;\n}\n\n.pagination .prev:before {\n\tcontent: \"\\f430\";\n\tleft: -1px;\n}\n\n.pagination .next {\n\tright: 0;\n}\n\n.pagination .next:before {\n\tcontent: \"\\f429\";\n\tright: -1px;\n}\n\n.image-navigation,\n.comment-navigation {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-weight: 700;\n\tline-height: 1.5;\n\ttext-transform: uppercase;\n}\n\n.image-navigation a,\n.comment-navigation a {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n}\n\n.image-navigation a:hover,\n.image-navigation a:focus,\n.comment-navigation a:hover,\n.comment-navigation a:focus {\n\tcolor: #333;\n}\n\n.image-navigation .nav-previous:not(:empty),\n.image-navigation .nav-next:not(:empty),\n.comment-navigation .nav-previous:not(:empty),\n.comment-navigation .nav-next:not(:empty) {\n\tdisplay: inline-block;\n}\n\n.image-navigation .nav-previous:not(:empty) + .nav-next:not(:empty):before,\n.comment-navigation .nav-previous:not(:empty) + .nav-next:not(:empty):before {\n\tcontent: \"\\2215\";\n\tfont-weight: 400;\n\tmargin: 0 0.7em;\n}\n\n.image-navigation .nav-previous a:before,\n.comment-navigation .nav-previous a:before {\n\tcontent: \"\\f430\";\n\tmargin-right: 0.2em;\n\tposition: relative;\n}\n\n.image-navigation .nav-next a:after,\n.comment-navigation .nav-next a:after {\n\tcontent: \"\\f429\";\n\tmargin-left: 0.2em;\n\tposition: relative;\n}\n\n.comment-navigation {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tborder-bottom: 1px solid #eaeaea;\n\tborder-bottom: 1px solid rgba(51, 51, 51, 0.1);\n\tpadding: 2em 0;\n}\n\n.comments-title + .comment-navigation {\n\tborder-bottom: 0;\n}\n\n.image-navigation {\n\tpadding: 0 7.6923%;\n}\n\n.image-navigation .nav-previous:not(:empty),\n.image-navigation .nav-next:not(:empty) {\n\tmargin-bottom: 2em;\n}\n\n\n/**\n * 7.0 Accessibility\n */\n\n/* Text meant only for screen readers */\n.says,\n.screen-reader-text {\n\tclip: rect(1px, 1px, 1px, 1px);\n\theight: 1px;\n\toverflow: hidden;\n\tposition: absolute !important;\n\twidth: 1px;\n}\n\n/* must have higher specificity than alternative color schemes inline styles */\n.site .skip-link {\n\tbackground-color: #f1f1f1;\n\tbox-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.2);\n\tcolor: #21759b;\n\tdisplay: block;\n\tfont: bold 14px/normal \"Noto Sans\", sans-serif;\n\tleft: -9999em;\n\toutline: none;\n\tpadding: 15px 23px 14px;\n\ttext-decoration: none;\n\ttext-transform: none;\n\ttop: -9999em;\n}\n\n.logged-in .site .skip-link {\n\tbox-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);\n\tfont: bold 14px/normal \"Open Sans\", sans-serif;\n}\n\n.site .skip-link:focus {\n\tclip: auto;\n\theight: auto;\n\tleft: 6px;\n\ttop: 7px;\n\twidth: auto;\n\tz-index: 100000;\n}\n\n\n/**\n * 8.0 Alignments\n */\n\n.alignleft {\n\tdisplay: inline;\n\tfloat: left;\n}\n\n.alignright {\n\tdisplay: inline;\n\tfloat: right;\n}\n\n.aligncenter {\n\tdisplay: block;\n\tmargin-right: auto;\n\tmargin-left: auto;\n}\n\nblockquote.alignleft,\n.wp-caption.alignleft,\nimg.alignleft {\n\tmargin: 0.4em 1.6em 1.6em 0;\n}\n\nblockquote.alignright,\n.wp-caption.alignright,\nimg.alignright {\n\tmargin: 0.4em 0 1.6em 1.6em;\n}\n\nblockquote.aligncenter,\n.wp-caption.aligncenter,\nimg.aligncenter {\n\tclear: both;\n\tmargin-top: 0.4em;\n\tmargin-bottom: 1.6em;\n}\n\n.wp-caption.alignleft,\n.wp-caption.alignright,\n.wp-caption.aligncenter {\n\tmargin-bottom: 1.2em;\n}\n\n\n/**\n * 9.0 Clearings\n */\n\n.clear:before,\n.clear:after,\n.site:before,\n.site:after,\n.entry-content:before,\n.entry-content:after,\n.comment-content:before,\n.comment-content:after,\n.site-content:before,\n.site-content:after,\n.nav-links:before,\n.nav-links:after,\n.comment-navigation:before,\n.comment-navigation:after,\n.social-navigation ul:before,\n.social-navigation ul:after,\n.textwidget:before,\n.textwidget:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.clear:after,\n.site:after,\n.entry-content:after,\n.comment-content:after,\n.site-content:after,\n.nav-links:after,\n.comment-navigation:after,\n.social-navigation ul:after,\n.textwidget:after {\n\tclear: both;\n}\n\n\n/**\n * 10.0 Header\n */\n\n.site-header {\n\tbackground-color: #fff;\n\tborder-bottom: 1px solid rgba(51, 51, 51, 0.1);\n\tpadding: 7.6923%;\n}\n\n.site-branding {\n\tmin-height: 2em;\n\tpadding-right: 60px;\n\tposition: relative;\n}\n\n.site-title {\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 22px;\n\tfont-size: 2.2rem;\n\tfont-weight: 700;\n\tline-height: 1.3636;\n\tmargin-bottom: 0;\n}\n\n.site-description {\n\tdisplay: none;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tfont-weight: 400;\n\tline-height: 1.5;\n\tmargin: 0.5em 0 0;\n\topacity: 0.7;\n}\n\n\n/**\n * 11.0 Widgets\n */\n\n.widget {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\t-webkit-hyphens: auto;\n\t-moz-hyphens: auto;\n\t-ms-hyphens: auto;\n\thyphens: auto;\n\tmargin: 0 auto 9.09090%;\n\twidth: 100%;\n\tword-wrap: break-word;\n}\n\n.widget pre {\n\tline-height: 1.2;\n}\n\n.widget button,\n.widget input,\n.widget select,\n.widget textarea {\n\tfont-size: 16px;\n\tfont-size: 1.6rem;\n\tline-height: 1.5;\n}\n\n.widget button,\n.widget input {\n\tline-height: normal;\n}\n\n.widget button,\n.widget input[type=\"button\"],\n.widget input[type=\"reset\"],\n.widget input[type=\"submit\"] {\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tpadding: 0.7917em 1.5833em;\n}\n\n.widget input[type=\"text\"],\n.widget input[type=\"email\"],\n.widget input[type=\"url\"],\n.widget input[type=\"password\"],\n.widget input[type=\"search\"],\n.widget textarea {\n\tpadding: 0.375em;\n}\n\n.widget-title {\n\tcolor: #333;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tmargin: 0 0 1.6em;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n}\n\n.widget > :last-child {\n\tmargin-bottom: 0;\n}\n\n.widget_calendar table {\n\tmargin: 0;\n}\n\n.widget_calendar td,\n.widget_calendar th {\n\tline-height: 2.3333;\n\ttext-align: center;\n\tpadding: 0;\n}\n\n.widget_calendar caption {\n\tfont-family: \"Noto Serif\", serif;\n\tfont-weight: 700;\n\tmargin: 0 0 1.6em;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n}\n\n.widget_calendar tbody a {\n\t-webkit-tap-highlight-color: rgba(255, 255, 255, 0.3);\n\tbackground-color: #333;\n\tcolor: #fff;\n\tdisplay: block;\n\tfont-weight: 700;\n}\n\n.widget_calendar tbody a:hover,\n.widget_calendar tbody a:focus {\n\tbackground-color: #707070;\n\tbackground-color: rgba(51, 51, 51, 0.7);\n\tcolor: #fff;\n}\n\n.widget_archive a,\n.widget_categories a,\n.widget_links a,\n.widget_meta a,\n.widget_nav_menu a,\n.widget_pages a,\n.widget_recent_comments a,\n.widget_recent_entries a {\n\tborder: 0;\n}\n\n.widget_archive ul,\n.widget_categories ul,\n.widget_links ul,\n.widget_meta ul,\n.widget_nav_menu ul,\n.widget_pages ul,\n.widget_recent_comments ul,\n.widget_recent_entries ul {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.widget_archive li,\n.widget_categories li,\n.widget_links li,\n.widget_meta li,\n.widget_nav_menu li,\n.widget_pages li,\n.widget_recent_comments li,\n.widget_recent_entries li {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tpadding: 0.7667em 0;\n}\n\n.widget_archive li:first-child,\n.widget_categories li:first-child,\n.widget_links li:first-child,\n.widget_meta li:first-child,\n.widget_nav_menu li:first-child,\n.widget_pages li:first-child,\n.widget_recent_comments li:first-child,\n.widget_recent_entries li:first-child {\n\tborder-top: 0;\n\tpadding-top: 0;\n}\n\n.widget_archive li:last-child,\n.widget_categories li:last-child,\n.widget_links li:last-child,\n.widget_meta li:last-child,\n.widget_nav_menu li:last-child,\n.widget_pages li:last-child,\n.widget_recent_comments li:last-child,\n.widget_recent_entries li:last-child {\n\tpadding-bottom: 0;\n}\n\n.widget_categories .children,\n.widget_nav_menu .sub-menu,\n.widget_pages .children {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tmargin: 0.7667em 0 0 0.8em;\n\tpadding-top: 0.7667em;\n}\n\n.widget_recent_entries .post-date {\n\tdisplay: block;\n}\n\n.widget_rss ul {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.widget_rss li {\n\tmargin-bottom: 1.6em;\n}\n\n.widget_rss ul:last-child,\n.widget_rss li:last-child {\n\tmargin-bottom: 0;\n}\n\n.widget_rss .rsswidget {\n\tborder: 0;\n\tfont-weight: 700;\n}\n\n.widget_rss .rsswidget img {\n\tmargin-top: -4px;\n}\n\n.widget_rss .rss-date,\n.widget_rss cite {\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tfont-style: normal;\n\tdisplay: block;\n\tline-height: 2;\n\topacity: 0.8;\n}\n\n.textwidget > :last-child {\n\tmargin-bottom: 0;\n}\n\n.textwidget a {\n\tborder-bottom: 1px solid #333;\n}\n\n.textwidget a:hover,\n.textwidget a:focus {\n\tborder-bottom: 0;\n}\n\n\n/**\n * 12.0 Content\n */\n\n.secondary {\n\tbackground-color: #fff;\n\tdisplay: none;\n\tpadding: 0 7.6923%;\n}\n\n.secondary.toggled-on {\n\tborder-top: 1px solid transparent;\n\tborder-bottom: 1px solid transparent;\n\tdisplay: block;\n}\n\n.widget-area {\n\tmargin: 9.09090% auto 0;\n}\n\n.site-footer {\n\tbackground-color: #fff;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tpadding: 3.84615% 7.6923%;\n}\n\n\n/**\n * 12.1 Posts and pages\n */\n\n.hentry {\n\tbackground-color: #fff;\n\tpadding-top: 7.6923%;\n\tposition: relative;\n}\n\n.hentry.has-post-thumbnail {\n\tpadding-top: 0;\n}\n\n.hentry.sticky:not(.has-post-thumbnail) {\n\tpadding-top: -webkit-calc(7.6923% + 24px);\n\tpadding-top: calc(7.6923% + 24px);\n}\n\n.hentry + .hentry {\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n}\n\n.post-thumbnail {\n\tborder: 0;\n\tdisplay: block;\n\tmargin-bottom: 2.4em;\n}\n.post-thumbnail img {\n\tdisplay: block;\n\tmargin: 0 auto;\n}\n\na.post-thumbnail:hover,\na.post-thumbnail:focus {\n\topacity: 0.85;\n}\n\n.entry-header {\n\tpadding: 0 7.6923%;\n}\n\n.entry-title {\n\tfont-size: 26px;\n\tfont-size: 2.6rem;\n\tline-height: 1.1538;\n\tmargin-bottom: 0.9231em;\n}\n\n.entry-content,\n.entry-summary {\n\tpadding: 0 7.6923% 7.6923%;\n}\n\n.entry-content > :last-child,\n.entry-summary > :last-child {\n\tmargin-bottom: 0;\n}\n\n.entry-content,\n.entry-summary,\n.page-content,\n.comment-content {\n\t-webkit-hyphens: auto;\n\t-moz-hyphens: auto;\n\t-ms-hyphens: auto;\n\thyphens: auto;\n\tword-wrap: break-word;\n}\n\n.entry-content h1,\n.entry-summary h1,\n.page-content h1,\n.comment-content h1 {\n\tfont-size: 26px;\n\tfont-size: 2.6rem;\n\tline-height: 1.1538;\n\tmargin-top: 1.8462em;\n\tmargin-bottom: 0.9231em;\n}\n\n.entry-content h2,\n.entry-summary h2,\n.page-content h2,\n.comment-content h2 {\n\tfont-size: 22px;\n\tfont-size: 2.2rem;\n\tline-height: 1.3636;\n\tmargin-top: 2.1818em;\n\tmargin-bottom: 1.0909em;\n}\n\n.entry-content h3,\n.entry-summary h3,\n.page-content h3,\n.comment-content h3 {\n\tfont-size: 18px;\n\tfont-size: 1.8rem;\n\tline-height: 1.3333;\n\tmargin-top: 2.6667em;\n\tmargin-bottom: 1.3333em;\n}\n\n.entry-content h4,\n.entry-content h5,\n.entry-content h6,\n.entry-summary h4,\n.entry-summary h5,\n.entry-summary h6,\n.page-content h4,\n.page-content h5,\n.page-content h6,\n.comment-content h4,\n.comment-content h5,\n.comment-content h6 {\n\tfont-size: 15px;\n\tfont-size: 1.5rem;\n\tline-height: 1.2;\n\tmargin-top: 3.2em;\n\tmargin-bottom: 1.6em;\n}\n\n.entry-content h5,\n.entry-content h6,\n.entry-summary h5,\n.entry-summary h6,\n.page-content h5,\n.page-content h6,\n.comment-content h5,\n.comment-content h6 {\n\tletter-spacing: 0.1em;\n\ttext-transform: uppercase;\n}\n\n.entry-content > h1:first-child,\n.entry-content > h2:first-child,\n.entry-content > h3:first-child,\n.entry-content > h4:first-child,\n.entry-content > h5:first-child,\n.entry-content > h6:first-child,\n.entry-summary > h1:first-child,\n.entry-summary > h2:first-child,\n.entry-summary > h3:first-child,\n.entry-summary > h4:first-child,\n.entry-summary > h5:first-child,\n.entry-summary > h6:first-child,\n.page-content > h1:first-child,\n.page-content > h2:first-child,\n.page-content > h3:first-child,\n.page-content > h4:first-child,\n.page-content > h5:first-child,\n.page-content > h6:first-child,\n.comment-content > h1:first-child,\n.comment-content > h2:first-child,\n.comment-content > h3:first-child,\n.comment-content > h4:first-child,\n.comment-content > h5:first-child,\n.comment-content > h6:first-child {\n\tmargin-top: 0;\n}\n\n.entry-content a,\n.entry-summary a,\n.page-content a,\n.comment-content a,\n.pingback .comment-body > a {\n\tborder-bottom: 1px solid #333;\n}\n\n.entry-content a:hover,\n.entry-content a:focus,\n.entry-summary a:hover,\n.entry-summary a:focus,\n.page-content a:hover,\n.page-content a:focus,\n.comment-content a:hover,\n.comment-content a:focus,\n.pingback .comment-body > a:hover,\n.pingback .comment-body > a:focus {\n\tborder-bottom: 0;\n}\n\n.entry-content a img,\n.entry-summary a img,\n.page-content a img,\n.comment-content a img {\n\tdisplay: block;\n}\n\n.entry-content .more-link,\n.entry-summary .more-link:after {\n\twhite-space: nowrap;\n}\n\n.entry-content .more-link:after,\n.entry-summary .more-link:after {\n\tcontent: \"\\f429\";\n\tfont-size: 16px;\n\tposition: relative;\n\ttop: 5px;\n}\n\n.author-info {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tmargin: 0 7.6923%;\n\tpadding: 7.6923% 0;\n}\n\n.author-info .avatar {\n\tfloat: left;\n\theight: 36px;\n\tmargin: 0 1.6em 1.6em 0;\n\twidth: 36px;\n}\n\n.author-heading {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tletter-spacing: 0.04em;\n\tmargin-bottom: 1.5em;\n\ttext-transform: uppercase;\n}\n\n.author-title {\n\tclear: none;\n}\n\n.author-bio {\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tline-height: 1.5;\n\toverflow: hidden;\n\tpadding-bottom: 1px;\n}\n\n.author-description {\n\t-webkit-hyphens: auto;\n\t-moz-hyphens: auto;\n\t-ms-hyphens: auto;\n\thyphens: auto;\n\tword-wrap: break-word;\n}\n\n.author-description a {\n\tborder-bottom: 1px solid #333;\n}\n\n.author-description a:hover,\n.author-description a:focus {\n\tborder-bottom: 0;\n}\n\n.author-description > :last-child {\n\tmargin-bottom: 0;\n}\n\n.author-link {\n\twhite-space: nowrap;\n}\n\n.author-link:after {\n\tcontent: \"\\f429\";\n\tposition: relative;\n\ttop: 1px;\n}\n\n.entry-footer {\n\tbackground-color: #f7f7f7;\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tline-height: 1.5;\n\tpadding: 3.8461% 7.6923%;\n}\n\n.entry-footer a {\n\tborder-bottom: 1px solid transparent;\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n}\n\n.entry-footer a:hover {\n\tborder-bottom: 1px solid #333;\n}\n\n.entry-footer a:hover,\n.entry-footer a:focus {\n\tcolor: #333;\n}\n\n.sticky-post {\n\tbackground-color: #333;\n\tcolor: #fff;\n\tfont-weight: 700;\n\tletter-spacing: 0.04em;\n\tpadding: 0.25em 0.5em;\n\tposition: absolute;\n\ttop: 0;\n\ttext-transform: uppercase;\n}\n\n.updated:not(.published) {\n\tdisplay: none;\n}\n\n.sticky .posted-on {\n\tdisplay: none;\n}\n\n.posted-on:before,\n.byline:before,\n.cat-links:before,\n.tags-links:before,\n.comments-link:before,\n.entry-format:before,\n.edit-link:before,\n.full-size-link:before {\n\tmargin-right: 2px;\n\tposition: relative;\n}\n\n.posted-on,\n.byline,\n.cat-links,\n.tags-links,\n.comments-link,\n.entry-format,\n.full-size-link {\n\tmargin-right: 1em;\n}\n\n.format-aside .entry-format:before {\n\tcontent: \"\\f101\";\n}\n\n.format-image .entry-format:before {\n\tcontent: \"\\f473\";\n}\n\n.format-gallery .entry-format:before {\n\tcontent: \"\\f103\";\n}\n\n.format-video .entry-format:before {\n\tcontent: \"\\f104\";\n}\n\n.format-status .entry-format:before {\n\tcontent: \"\\f105\";\n}\n\n.format-quote .entry-format:before {\n\tcontent: \"\\f106\";\n}\n\n.format-link .entry-format:before {\n\tcontent: \"\\f107\";\n}\n\n.format-chat .entry-format:before {\n\tcontent: \"\\f108\";\n}\n\n.format-audio .entry-format:before {\n\tcontent: \"\\f109\";\n}\n\n.posted-on:before {\n\tcontent: \"\\f307\";\n}\n\n.byline:before {\n\tcontent: \"\\f304\";\n}\n\n.cat-links:before {\n\tcontent: \"\\f301\";\n}\n\n.tags-links:before {\n\tcontent: \"\\f302\";\n}\n\n.comments-link:before {\n\tcontent: \"\\f300\";\n}\n\n.full-size-link:before {\n\tcontent: \"\\f402\";\n}\n\n.edit-link:before {\n\tcontent: \"\\f411\";\n}\n\n.comments-link,\n.edit-link {\n\twhite-space: nowrap;\n}\n\n.page-header {\n\tbackground-color: #fff;\n\tborder-bottom: 1px solid rgba(51, 51, 51, 0.1);\n\tpadding: 7.6923%;\n}\n\n.page-title {\n\tfont-family: \"Noto Serif\", serif;\n\tfont-size: 18px;\n\tfont-size: 1.8rem;\n\tline-height: 1.3333;\n}\n\n.taxonomy-description {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tpadding-top: 0.4em;\n}\n\n.taxonomy-description a {\n\tborder-bottom: 1px solid #333;\n}\n\n.taxonomy-description a:hover,\n.taxonomy-description a:focus {\n\tborder-bottom: 0;\n}\n\n.taxonomy-description > :last-child {\n\tmargin-bottom: 0;\n}\n\n.page-content {\n\tbackground-color: #fff;\n\tpadding: 7.6923%;\n}\n\n.page-content > :last-child {\n\tmargin-bottom: 0;\n}\n\n.page-links {\n\tclear: both;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tmargin-bottom: 1.3333em;\n}\n\n.page-links a,\n.page-links > span {\n\tborder: 1px solid #eaeaea;\n\tborder: 1px solid rgba(51, 51, 51, 0.1);\n\tdisplay: inline-block;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\theight: 2em;\n\tline-height: 2;\n\tmargin: 0 0.3333em 0.3333em 0;\n\ttext-align: center;\n\twidth: 2em;\n}\n\n.page-links a {\n\t-webkit-tap-highlight-color: rgba(255, 255, 255, 0.3);\n\tbackground-color: #333;\n\tborder-color: #333;\n\tcolor: #fff;\n}\n\n.page-links a:hover,\n.page-links a:focus {\n\tbackground-color: #707070;\n\tbackground-color: rgba(51, 51, 51, 0.7);\n\tborder-color: transparent;\n\tcolor: #fff;\n}\n\n.page-links > .page-links-title {\n\tborder: 0;\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\theight: auto;\n\tmargin: 0;\n\tpadding-right: 0.5em;\n\twidth: auto;\n}\n\n.entry-attachment {\n\tmargin-bottom: 1.6em;\n}\n\n.type-attachment .entry-title {\n\t-webkit-hyphens: auto;\n\t-moz-hyphens: auto;\n\t-ms-hyphens: auto;\n\thyphens: auto;\n\tword-wrap: break-word;\n}\n\n.entry-caption {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\t-webkit-hyphens: auto;\n\t-moz-hyphens: auto;\n\t-ms-hyphens: auto;\n\thyphens: auto;\n\tline-height: 1.5;\n\tpadding-top: 0.5em;\n\tword-wrap: break-word;\n}\n\n.entry-caption > :last-child {\n\tmargin-bottom: 0;\n}\n\n\n/**\n * 12.2 Post Formats\n */\n\n.format-aside .entry-title,\n.format-image .entry-title,\n.format-video .entry-title,\n.format-quote .entry-title,\n.format-gallery .entry-title,\n.format-status .entry-title,\n.format-link .entry-title,\n.format-audio .entry-title,\n.format-chat .entry-title {\n\tfont-size: 18px;\n\tfont-size: 1.8rem;\n\tline-height: 1.3333;\n\tmargin-bottom: 1.3333em;\n}\n\n.format-link .entry-title a:after {\n\tcontent: \"\\f442\";\n\tfont-size: 24px;\n\theight: 24px;\n\tposition: relative;\n\ttop: 0;\n\twidth: 24px;\n}\n\n.blog .format-status .entry-title,\n.archive .format-status .entry-title {\n\tdisplay: none;\n}\n\n\n/**\n * 12.3 Comments\n */\n\n.comments-area {\n\tbackground-color: #fff;\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tpadding: 7.6923%;\n}\n\n.comments-area > :last-child {\n\tmargin-bottom: 0;\n}\n\n.comment-list + .comment-respond {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n}\n\n.comment-list + .comment-respond,\n.comment-navigation + .comment-respond {\n\tpadding-top: 1.6em;\n}\n\n.comments-title,\n.comment-reply-title {\n\tfont-family: \"Noto Serif\", serif;\n\tfont-size: 18px;\n\tfont-size: 1.8rem;\n\tline-height: 1.3333;\n}\n\n.comments-title {\n\tmargin-bottom: 1.3333em;\n}\n\n.comment-list {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.comment-list article,\n.comment-list .pingback,\n.comment-list .trackback {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tpadding: 1.6em 0;\n}\n\n.comment-list .children {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.comment-list .children > li {\n\tpadding-left: 0.8em;\n}\n\n.comment-author {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tmargin-bottom: 0.4em;\n}\n\n.comment-author a:hover {\n\tborder-bottom: 1px solid #707070;\n\tborder-bottom: 1px solid rgba(51, 51, 51, 0.7);\n}\n\n.comment-author .avatar {\n\tfloat: left;\n\theight: 24px;\n\tmargin-right: 0.8em;\n\twidth: 24px;\n}\n\n.bypostauthor > article .fn:after {\n\tcontent: \"\\f304\";\n\tposition: relative;\n\ttop: 5px;\n\tleft: 3px;\n}\n\n.comment-metadata,\n.pingback .edit-link {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tline-height: 1.5;\n}\n\n.comment-metadata a,\n.pingback .edit-link a {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n}\n\n.comment-metadata a:hover,\n.pingback .edit-link a:hover {\n\tborder-bottom: 1px solid #333;\n}\n\n.comment-metadata a:hover,\n.comment-metadata a:focus,\n.pingback .edit-link a:hover,\n.pingback .edit-link a:focus {\n\tcolor: #333;\n}\n\n.comment-metadata {\n\tmargin-bottom: 1.6em;\n}\n\n.comment-metadata .edit-link {\n\tmargin-left: 1em;\n}\n\n.pingback .edit-link {\n\tmargin-left: 1em;\n}\n\n.pingback .edit-link:before {\n\ttop: 5px;\n}\n\n.comment-content ul,\n.comment-content ol {\n\tmargin: 0 0 1.6em 1.3333em;\n}\n\n.comment-content li > ul,\n.comment-content li > ol {\n\tmargin-bottom: 0;\n}\n\n.comment-content > :last-child {\n\tmargin-bottom: 0;\n}\n\n.comment-list .reply {\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n}\n\n.comment-list .reply a {\n\tborder: 1px solid #eaeaea;\n\tborder: 1px solid rgba(51, 51, 51, 0.1);\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tdisplay: inline-block;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-weight: 700;\n\tline-height: 1;\n\tmargin-top: 2em;\n\tpadding: 0.4167em 0.8333em;\n\ttext-transform: uppercase;\n}\n\n.comment-list .reply a:hover,\n.comment-list .reply a:focus {\n\tborder-color: #333;\n\tcolor: #333;\n\toutline: 0;\n}\n\n.comment-form {\n\tpadding-top: 1.6em;\n}\n\n.comment-form label {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tfont-weight: 700;\n\tdisplay: block;\n\tletter-spacing: 0.04em;\n\tline-height: 1.5;\n\ttext-transform: uppercase;\n}\n\n.comment-form input[type=\"text\"],\n.comment-form input[type=\"email\"],\n.comment-form input[type=\"url\"],\n.comment-form input[type=\"submit\"] {\n\twidth: 100%;\n}\n\n.comment-notes,\n.comment-awaiting-moderation,\n.logged-in-as,\n.form-allowed-tags {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tline-height: 1.5;\n\tmargin-bottom: 2em;\n}\n\n.logged-in-as a:hover {\n\tborder-bottom: 1px solid #333;\n}\n\n.no-comments {\n\tborder-top: 1px solid #eaeaea;\n\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-weight: 700;\n\tpadding-top: 1.6em;\n}\n\n.comment-navigation + .no-comments {\n\tborder-top: 0;\n}\n\n.form-allowed-tags code {\n\tfont-family: Inconsolata, monospace;\n}\n\n.form-submit {\n\tmargin-bottom: 0;\n}\n\n.required {\n\tcolor: #c0392b;\n}\n\n.comment-reply-title small {\n\tfont-size: 100%;\n}\n\n.comment-reply-title small a {\n\tborder: 0;\n\tfloat: right;\n\theight: 32px;\n\toverflow: hidden;\n\twidth: 26px;\n}\n\n.comment-reply-title small a:before {\n\tcontent: \"\\f405\";\n\tfont-size: 32px;\n\tposition: relative;\n\ttop: -3px;\n}\n\n\n/**\n * 13.0 Footer\n */\n\n.site-info {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tline-height: 1.5;\n}\n\n.site-info a {\n\tborder-bottom: 1px solid transparent;\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n}\n\n.site-info a:hover {\n\tborder-bottom: 1px solid #333;\n}\n\n.site-info a:hover,\n.site-info a:focus {\n\tcolor: #333;\n}\n\n\n/**\n * 14.0 Media\n */\n\n.site .avatar {\n\tborder-radius: 50%;\n}\n\n.page-content img.wp-smiley,\n.entry-content img.wp-smiley,\n.comment-content img.wp-smiley {\n\tborder: none;\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\tpadding: 0;\n}\n\naudio,\ncanvas {\n\tdisplay: inline-block;\n}\n\nembed,\niframe,\nobject,\nvideo {\n\tmargin-bottom: 1.6em;\n\tmax-width: 100%;\n\tvertical-align: middle;\n}\n\np > embed,\np > iframe,\np > object,\np > video {\n\tmargin-bottom: 0;\n}\n\n.wp-audio-shortcode,\n.wp-video,\n.wp-playlist.wp-audio-playlist {\n\tfont-size: 15px;\n\tfont-size: 1.5rem;\n\tmargin-top: 0;\n\tmargin-bottom: 1.6em;\n}\n\n.wp-playlist.wp-playlist {\n\tpadding-bottom: 0;\n}\n\n.wp-playlist .wp-playlist-tracks {\n\tmargin-top: 0;\n}\n\n.wp-playlist-item .wp-playlist-caption {\n\tborder-bottom: 0;\n\tpadding: 10px 0;\n}\n\n.wp-playlist-item .wp-playlist-item-length {\n\ttop: 10px;\n}\n\n\n/**\n * 14.1 Captions\n */\n\n.wp-caption {\n\tmargin-bottom: 1.6em;\n\tmax-width: 100%;\n}\n\n.wp-caption img[class*=\"wp-image-\"] {\n\tdisplay: block;\n\tmargin: 0;\n}\n\n.wp-caption-text {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tline-height: 1.5;\n\tpadding: 0.5em 0;\n}\n\n\n/**\n * 14.2 Galleries\n */\n\n.gallery {\n\tmargin-bottom: 1.6em;\n}\n\n.gallery-item {\n\tdisplay: inline-block;\n\tpadding: 1.79104477%;\n\ttext-align: center;\n\tvertical-align: top;\n\twidth: 100%;\n}\n\n.gallery-columns-2 .gallery-item {\n\tmax-width: 50%;\n}\n\n.gallery-columns-3 .gallery-item {\n\tmax-width: 33.33%;\n}\n\n.gallery-columns-4 .gallery-item {\n\tmax-width: 25%;\n}\n\n.gallery-columns-5 .gallery-item {\n\tmax-width: 20%;\n}\n\n.gallery-columns-6 .gallery-item {\n\tmax-width: 16.66%;\n}\n\n.gallery-columns-7 .gallery-item {\n\tmax-width: 14.28%;\n}\n\n.gallery-columns-8 .gallery-item {\n\tmax-width: 12.5%;\n}\n\n.gallery-columns-9 .gallery-item {\n\tmax-width: 11.11%;\n}\n\n.gallery-icon img {\n\tmargin: 0 auto;\n}\n\n.gallery-caption {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tdisplay: block;\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tline-height: 1.5;\n\tpadding: 0.5em 0;\n}\n\n.gallery-columns-6 .gallery-caption,\n.gallery-columns-7 .gallery-caption,\n.gallery-columns-8 .gallery-caption,\n.gallery-columns-9 .gallery-caption {\n\tdisplay: none;\n}\n\n\n/**\n * 15.0 Multisite\n */\n\n.widecolumn {\n\tbackground-color: #fff;\n\tpadding: 7.6923%;\n}\n\n.widecolumn .mu_register {\n\twidth: auto;\n}\n\n.widecolumn .mu_alert {\n\tmargin-bottom: 1.6em;\n}\n\n.widecolumn form,\n.widecolumn .mu_register form {\n\tmargin-top: 0;\n}\n\n.widecolumn h2 {\n\tfont-size: 26px;\n\tfont-size: 2.6rem;\n\tline-height: 1.1538;\n\tmargin-bottom: 0.9231em;\n}\n\n.widecolumn p {\n\tmargin: 1.6em 0;\n}\n\n.widecolumn p + h2 {\n\tmargin-top: 1.8462em;\n}\n\n.widecolumn label,\n.widecolumn .mu_register label {\n\tcolor: #707070;\n\tcolor: rgba(51, 51, 51, 0.7);\n\tfont-family: \"Noto Sans\", sans-serif;\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tfont-weight: 700;\n\tletter-spacing: 0.04em;\n\tline-height: 1.5;\n\ttext-transform: uppercase;\n}\n\n.widecolumn .mu_register label {\n\tmargin: 2em 0 0;\n}\n\n.widecolumn #key,\n.widecolumn .mu_register #blog_title,\n.widecolumn .mu_register #user_email,\n.widecolumn .mu_register #blogname,\n.widecolumn .mu_register #user_name {\n\tfont-size: 16px;\n\tfont-size: 1.6rem;\n\twidth: 100%;\n}\n\n.widecolumn .mu_register #blogname {\n\tmargin: 0;\n}\n\n.widecolumn .mu_register #blog_title,\n.widecolumn .mu_register #user_email,\n.widecolumn .mu_register #user_name {\n\tmargin: 0 0 0.375em;\n}\n\n.widecolumn #submit,\n.widecolumn .mu_register input[type=\"submit\"] {\n\tfont-size: 12px;\n\tfont-size: 1.2rem;\n\tmargin: 0;\n\twidth: 100%;\n}\n\n.widecolumn .mu_register .prefix_address,\n.widecolumn .mu_register .suffix_address {\n\tfont-size: inherit;\n}\n\n.widecolumn .mu_register > :last-child,\n.widecolumn form > :last-child {\n\tmargin-bottom: 0;\n}\n\n\n/**\n * 16.0 Media Queries\n */\n\n/*\n * Does the same thing as <meta name=\"viewport\" content=\"width=device-width\">,\n * but in the future W3C standard way. -ms- prefix is required for IE10+ to\n * render responsive styling in Windows 8 \"snapped\" views; IE10+ does not honor\n * the meta tag. See https://core.trac.wordpress.org/ticket/25888.\n */\n@-ms-viewport {\n\twidth: device-width;\n}\n\n@viewport {\n\twidth: device-width;\n}\n\n/**\n * 16.1 Mobile Large 620px\n */\n\n@media screen and (min-width: 38.75em) {\n\tul,\n\tol {\n\t\tmargin-left: 0;\n\t}\n\n\tli > ul,\n\tli > ol,\n\tblockquote > ul,\n\tblockquote > ol {\n\t\tmargin-left: 1.3333em;\n\t}\n\n\tblockquote {\n\t\tmargin-left: -1em;\n\t}\n\n\tblockquote > blockquote {\n\t\tmargin-left: 0;\n\t}\n\n\t.site-branding {\n\t\tmin-height: 3.2em;\n\t}\n\n\t.site-title {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.0909;\n\t}\n\n\t.site-description {\n\t\tdisplay: block;\n\t}\n\n\t.secondary {\n\t\tbox-shadow: 0 0 1px rgba(0, 0, 0, 0.15);\n\t\tmargin: 7.6923% 7.6923% 0;\n\t\tpadding: 7.6923% 7.6923% 0;\n\t}\n\n\t.main-navigation {\n\t\tmargin-bottom: 11.1111%;\n\t}\n\n\t.main-navigation ul {\n\t\tborder-top: 1px solid rgba(51, 51, 51, 0.1);\n\t\tborder-bottom: 1px solid rgba(51, 51, 51, 0.1);\n\t}\n\n\t.main-navigation ul ul {\n\t\tborder-top: 0;\n\t\tborder-bottom: 0;\n\t}\n\n\t.social-navigation {\n\t\tmargin-bottom: 11.1111%;\n\t}\n\n\t.social-navigation {\n\t\tmargin-top: 0;\n\t}\n\n\t.widget-area {\n\t\tmargin-top: 0;\n\t}\n\n\t.widget {\n\t\tmargin-bottom: 11.1111%;\n\t}\n\n\t.site-main {\n\t\tpadding: 7.6923% 0;\n\t}\n\n\t.hentry.sticky:not(.has-post-thumbnail) {\n\t\tpadding-top: inherit;\n\t}\n\n\t.hentry,\n\t.page-header,\n\t.page-content {\n\t\tbox-shadow: 0 0 1px rgba(0, 0, 0, 0.15);\n\t\tmargin: 0 7.6923%;\n\t}\n\n\t.hentry + .hentry,\n\t.page-header + .hentry,\n\t.page-header + .page-content {\n\t\tmargin-top: 7.6923%;\n\t}\n\n\t.hentry + .hentry {\n\t\tborder-top: 0;\n\t}\n\n\t.post-thumbnail {\n\t\tmargin-bottom: 2.4em;\n\t}\n\n\t.entry-header {\n\t\tpadding: 0 9.0909%;\n\t}\n\n\t.entry-content,\n\t.entry-summary {\n\t\tpadding: 0 9.0909% 9.0909%;\n\t}\n\n\t.entry-footer {\n\t\tpadding: 4.5454% 9.0909%;\n\t}\n\n\t.page-header {\n\t\tborder-bottom: 0;\n\t\tborder-left: 7px solid #333;\n\t\tpadding: 3.8461% 7.6923%;\n\t}\n\n\t.page-title,\n\t.taxonomy-description {\n\t\tmargin-left: -7px;\n\t}\n\n\t.page-content {\n\t\tpadding: 9.0909%;\n\t}\n\n\t.site-footer {\n\t\tborder-top: 0;\n\t\tbox-shadow: 0 0 1px rgba(0, 0, 0, 0.15);\n\t\tmargin: 0 7.6923%;\n\t\tpadding: 3.84615% 7.6923%;\n\t}\n\n\t.post-navigation {\n\t\tborder-top: 0;\n\t\tbox-shadow: 0 0 1px rgba(0, 0, 0, 0.15);\n\t\tmargin: 7.6923% 7.6923% 0;\n\t}\n\n\t.post-navigation a {\n\t\tpadding: 4.5454% 9.0909%;\n\t}\n\n\t.pagination {\n\t\tborder-top: 0;\n\t\tbox-shadow: 0 0 1px rgba(0, 0, 0, 0.15);\n\t\tmargin: 7.6923% 7.6923% 0;\n\t\tpadding: 0;\n\t}\n\n\t/* restore screen-reader-text */\n\t.pagination .current .screen-reader-text {\n\t\tposition: absolute !important;\n\t}\n\n\t.pagination .page-numbers {\n\t\tdisplay: inline-block;\n\t}\n\n\t.image-navigation {\n\t\tpadding: 0 9.0909%;\n\t}\n\n\t.comments-area {\n\t\tborder-top: 0;\n\t\tbox-shadow: 0 0 1px rgba(0, 0, 0, 0.15);\n\t\tmargin: 7.6923% 7.6923% 0;\n\t}\n\n\t.comment-content ul,\n\t.comment-content ol {\n\t\tmargin-left: 0;\n\t}\n\n\t.comment-content li > ul,\n\t.comment-content li > ol,\n\t.comment-content blockquote > ul,\n\t.comment-content blockquote > ol {\n\t\tmargin-left: 1.3333em;\n\t}\n\n\t.widecolumn {\n\t\tbox-shadow: 0 0 1px rgba(0, 0, 0, 0.15);\n\t\tmargin: 7.6923%;\n\t}\n}\n\n\n/**\n * 16.2 Tablet Small 740px\n */\n\n@media screen and (min-width: 46.25em) {\n\tbody,\n\tbutton,\n\tinput,\n\tselect,\n\ttextarea {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tline-height: 1.6471;\n\t}\n\n\tbutton,\n\tinput {\n\t\tline-height: normal;\n\t}\n\n\tp,\n\taddress,\n\tpre,\n\thr,\n\tul,\n\tol,\n\tdl,\n\tdd,\n\ttable {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\tblockquote {\n\t\tfont-size: 20px;\n\t\tfont-size: 2rem;\n\t\tline-height: 1.75;\n\t\tmargin-bottom: 1.75em;\n\t\tmargin-left: -1.05em;\n\t\tpadding-left: 0.85em;\n\t}\n\n\tblockquote p {\n\t\tmargin-bottom: 1.75em;\n\t}\n\n\tblockquote cite,\n\tblockquote small {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tline-height: 1.6471;\n\t}\n\n\tpre {\n\t\tline-height: 1.2353;\n\t}\n\n\tbutton,\n\tinput[type=\"button\"],\n\tinput[type=\"reset\"],\n\tinput[type=\"submit\"],\n\t.post-password-form input[type=\"submit\"],\n\t.widecolumn #submit,\n\t.widecolumn .mu_register input[type=\"submit\"] {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t\tpadding: 0.8214em 1.6429em;\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"url\"],\n\tinput[type=\"password\"],\n\tinput[type=\"search\"],\n\ttextarea {\n\t\tpadding: 0.5em;\n\t}\n\n\t.main-navigation {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t\tline-height: 1.5;\n\t}\n\n\t.main-navigation a {\n\t\tpadding: 1em 0;\n\t}\n\n\t.main-navigation ul ul {\n\t\tmargin-left: 1em;\n\t}\n\n\t.main-navigation .menu-item-description {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t\tline-height: 1.5;\n\t}\n\n\t.social-navigation ul {\n\t\tmargin-bottom: -1.4706em;\n\t}\n\n\t.social-navigation a {\n\t\theight: 2.8824em;\n\t\twidth: 2.8824em;\n\t}\n\n\t.secondary-toggle {\n\t\theight: 56px;\n\t\twidth: 56px;\n\t}\n\n\t.secondary-toggle:before {\n\t\tline-height: 54px;\n\t\twidth: 54px;\n\t}\n\n\t.post-password-form label,\n\t.post-navigation .meta-nav,\n\t.image-navigation,\n\t.comment-navigation,\n\t.author-heading,\n\t.author-bio,\n\t.entry-footer,\n\t.page-links a,\n\t.page-links span,\n\t.comment-metadata,\n\t.pingback .edit-link,\n\t.comment-list .reply,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.logged-in-as,\n\t.comment-form label,\n\t.form-allowed-tags,\n\t.site-info,\n\t.wp-caption-text,\n\t.gallery-caption,\n\t.entry-caption,\n\t.widecolumn label,\n\t.widecolumn .mu_register label {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t}\n\n\t.pagination .nav-links {\n\t\tmin-height: 3.2941em;\n\t}\n\n\t.pagination .page-numbers {\n\t\tline-height: 3.2941em;\n\t\tpadding: 0 0.8235em;\n\t}\n\n\t.pagination .prev,\n\t.pagination .next {\n\t\theight: 56px;\n\t\tpadding: 0;\n\t\twidth: 56px;\n\t}\n\n\t.pagination .prev:before,\n\t.pagination .next:before {\n\t\theight: 56px;\n\t\tline-height: 56px;\n\t\twidth: 56px;\n\t}\n\n\t.image-navigation .nav-previous a:before,\n\t.image-navigation .nav-next a:after,\n\t.comment-navigation .nav-previous a:before,\n\t.comment-navigation .nav-next a:after {\n\t\ttop: 2px;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4118em 1.6471em 1.6471em 0;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4118em 0 1.6471em 1.6471em;\n\t}\n\n\tblockquote.aligncenter,\n\t.wp-caption.aligncenter,\n\timg.aligncenter {\n\t\tmargin-top: 0.4118em;\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.wp-caption.alignleft,\n\t.wp-caption.alignright,\n\t.wp-caption.aligncenter {\n\t\tmargin-bottom: 1.2353em;\n\t}\n\n\t.site-branding {\n\t\tmin-height: 3.7059em;\n\t\tpadding-right: 66px;\n\t}\n\n\t.site-title {\n\t\tfont-size: 29px;\n\t\tfont-size: 2.9rem;\n\t\tline-height: 1.2069;\n\t}\n\n\t.site-description {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t}\n\n\t.widget {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t\tline-height: 1.5;\n\t}\n\n\t.widget p,\n\t.widget address,\n\t.widget hr,\n\t.widget ul,\n\t.widget ol,\n\t.widget dl,\n\t.widget dd,\n\t.widget table,\n\t.widget pre {\n\t\tmargin-bottom: 1.5em;\n\t}\n\n\t.widget li > ul,\n\t.widget li > ol {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.widget blockquote {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tline-height: 1.6471;\n\t\tmargin-bottom: 1.6471em;\n\t\tmargin-left: -1.2353em;\n\t\tpadding-left: 1em;\n\t}\n\n\t.widget blockquote p {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.widget blockquote cite,\n\t.widget blockquote small {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t\tline-height: 1.5;\n\t}\n\n\t.widget blockquote > blockquote {\n\t\tmargin-left: 0;\n\t}\n\n\t.widget pre {\n\t\tline-height: 1.5;\n\t\tpadding: 0.75em;\n\t}\n\n\t.widget button,\n\t.widget input,\n\t.widget select,\n\t.widget textarea {\n\t\tline-height: 1.75;\n\t}\n\n\t.widget button,\n\t.widget input {\n\t\tline-height: normal;\n\t}\n\n\t.widget button,\n\t.widget input[type=\"button\"],\n\t.widget input[type=\"reset\"],\n\t.widget input[type=\"submit\"] {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t\tpadding: 0.8214em 1.6429em;\n\t}\n\n\t.widget input[type=\"text\"],\n\t.widget input[type=\"email\"],\n\t.widget input[type=\"url\"],\n\t.widget input[type=\"password\"],\n\t.widget input[type=\"search\"],\n\t.widget textarea {\n\t\tpadding: 0.5625em;\n\t}\n\n\t.widget blockquote.alignleft,\n\t.widget .wp-caption.alignleft,\n\t.widget img.alignleft {\n\t\tmargin: 0.5em 1.5em 1.5em 0;\n\t}\n\n\t.widget blockquote.alignright,\n\t.widget .wp-caption.alignright,\n\t.widget img.alignright {\n\t\tmargin: 0.5em 0 1.5em 1.5em;\n\t}\n\n\t.widget blockquote.aligncenter,\n\t.widget .wp-caption.aligncenter,\n\t.widget img.aligncenter {\n\t\tmargin-top: 0.5em;\n\t\tmargin-bottom: 1.5em;\n\t}\n\n\t.widget .wp-caption.alignleft,\n\t.widget .wp-caption.alignright,\n\t.widget .wp-caption.aligncenter {\n\t\tmargin-bottom: 1em;\n\t}\n\n\t.widget-title {\n\t\tmargin: 0 0 1.5em;\n\t}\n\n\t.widget_calendar td,\n\t.widget_calendar th {\n\t\tline-height: 2.9286;\n\t}\n\n\t.widget_calendar caption {\n\t\tmargin: 0 0 1.5em;\n\t}\n\n\t.widget_archive li,\n\t.widget_categories li,\n\t.widget_links li,\n\t.widget_meta li,\n\t.widget_nav_menu li,\n\t.widget_pages li,\n\t.widget_recent_comments li,\n\t.widget_recent_entries li {\n\t\tpadding: 0.9643em 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.9643em 0 0 1em;\n\t\tpadding-top: 0.9643em;\n\t}\n\n\t.widget_rss li {\n\t\tmargin-bottom: 1.5em;\n\t}\n\n\t.widget_rss .rss-date,\n\t.widget_rss cite {\n\t\tline-height: 1.75;\n\t}\n\n\t.post-thumbnail {\n\t\tmargin-bottom: 3em;\n\t}\n\n\t.entry-title,\n\t.widecolumn h2 {\n\t\tfont-size: 35px;\n\t\tfont-size: 3.5rem;\n\t\tline-height: 1.2;\n\t\tmargin-bottom: 1.2em;\n\t}\n\n\t.entry-content h1,\n\t.entry-summary h1,\n\t.page-content h1,\n\t.comment-content h1 {\n\t\tfont-size: 35px;\n\t\tfont-size: 3.5rem;\n\t\tline-height: 1.2;\n\t\tmargin-top: 1.6em;\n\t\tmargin-bottom: 0.8em;\n\t}\n\n\t.entry-content h2,\n\t.entry-summary h2,\n\t.page-content h2,\n\t.comment-content h2 {\n\t\tfont-size: 29px;\n\t\tfont-size: 2.9rem;\n\t\tline-height: 1.2069;\n\t\tmargin-top: 1.931em;\n\t\tmargin-bottom: 0.9655em;\n\t}\n\n\t.entry-content h3,\n\t.entry-summary h3,\n\t.page-content h3,\n\t.comment-content h3 {\n\t\tfont-size: 24px;\n\t\tfont-size: 2.4rem;\n\t\tline-height: 1.1667;\n\t\tmargin-top: 2.3333em;\n\t\tmargin-bottom: 1.1667em;\n\t}\n\n\t.entry-content h4,\n\t.entry-summary h4,\n\t.page-content h4,\n\t.comment-content h4 {\n\t\tfont-size: 20px;\n\t\tfont-size: 2rem;\n\t\tline-height: 1.4;\n\t\tmargin-top: 2.8em;\n\t\tmargin-bottom: 1.4em;\n\t}\n\n\t.entry-content h5,\n\t.entry-content h6,\n\t.entry-summary h5,\n\t.entry-summary h6,\n\t.page-content h5,\n\t.page-content h6,\n\t.comment-content h5,\n\t.comment-content h6 {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tline-height: 1.2353;\n\t\tmargin-top: 3.2941em;\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.entry-content .more-link:after,\n\t.entry-summary .more-link:after {\n\t\tfont-size: 24px;\n\t\ttop: 2px;\n\t}\n\n\t.author-info {\n\t\tmargin: 0 9.0909%;\n\t\tpadding: 9.0909% 0;\n\t}\n\n\t.author-info .avatar {\n\t\theight: 42px;\n\t\tmargin: 0 1.6471em 1.6471em 0;\n\t\twidth: 42px;\n\t}\n\n\t.author-link:after {\n\t\ttop: 3px;\n\t}\n\n\t.posted-on:before,\n\t.byline:before,\n\t.cat-links:before,\n\t.tags-links:before,\n\t.comments-link:before,\n\t.entry-format:before,\n\t.edit-link:before,\n\t.full-size-link:before {\n\t\ttop: 3px;\n\t}\n\n\t.taxonomy-description {\n\t\tpadding-top: 0.4118em;\n\t}\n\n\t.page-title,\n\t.comments-title,\n\t.comment-reply-title,\n\t.post-navigation .post-title {\n\t\tfont-size: 24px;\n\t\tfont-size: 2.4rem;\n\t\tline-height: 1.1667;\n\t}\n\n\t.page-links {\n\t\tmargin-bottom: 1.4117em;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0.2857em 0.2857em 0;\n\t}\n\n\t.entry-attachment {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.format-aside .entry-title,\n\t.format-image .entry-title,\n\t.format-video .entry-title,\n\t.format-quote .entry-title,\n\t.format-gallery .entry-title,\n\t.format-status .entry-title,\n\t.format-link .entry-title,\n\t.format-audio .entry-title,\n\t.format-chat .entry-title {\n\t\tfont-size: 20px;\n\t\tfont-size: 2rem;\n\t\tline-height: 1.4;\n\t\tmargin-bottom: 1.4em;\n\t}\n\n\t.format-link .entry-title a:after {\n\t\ttop: 0.0833em;\n\t}\n\n\t.comments-title {\n\t\tmargin-bottom: 1.4em;\n\t}\n\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback {\n\t\tpadding: 1.6471em 0;\n\t}\n\n\t.comment-list + .comment-respond,\n\t.comment-navigation + .comment-respond {\n\t\tpadding-top: 1.6471em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-left: 1.2353em;\n\t}\n\n\t.comment-meta {\n\t\tposition: relative;\n\t}\n\n\t.comment-author {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.comment-author .avatar {\n\t\theight: 42px;\n\t\tmargin-right: 1.64705em;\n\t\tposition: relative;\n\t\ttop: 5px;\n\t\twidth: 42px;\n\t}\n\n\t.comment-metadata .edit-link:before {\n\t\ttop: 2px;\n\t}\n\n\t.pingback .edit-link:before {\n\t\ttop: 6px;\n\t}\n\n\t.bypostauthor > article .fn:after {\n\t\ttop: 7px;\n\t\tleft: 6px;\n\t}\n\n\t.comment-content ul,\n\t.comment-content ol {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.comment-list .reply a {\n\t\tpadding: 0.4286em 0.8571em;\n\t}\n\n\t.comment-form,\n\t.no-comments {\n\t\tpadding-top: 1.6471em;\n\t}\n\n\t.comment-reply-title small a:before {\n\t\ttop: -1px;\n\t}\n\n\tembed,\n\tiframe,\n\tobject,\n\tvideo {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.wp-audio-shortcode,\n\t.wp-video,\n\t.wp-playlist.wp-audio-playlist {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.wp-caption,\n\t.gallery {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.widecolumn .mu_alert {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.widecolumn p {\n\t\tmargin: 1.6471em 0;\n\t}\n\n\t.widecolumn p + h2 {\n\t\tmargin-top: 1.6em;\n\t}\n\n\t.widecolumn #key,\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #blogname,\n\t.widecolumn .mu_register #user_name {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tline-height: normal;\n\t}\n\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #user_name {\n\t\tmargin: 0 0 0.4117em;\n\t}\n}\n\n\n/**\n * 16.3 Tablet Large 880px\n */\n\n@media screen and (min-width: 55em) {\n\tbody,\n\tbutton,\n\tinput,\n\tselect,\n\ttextarea {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tline-height: 1.6842;\n\t}\n\n\tbutton,\n\tinput {\n\t\tline-height: normal;\n\t}\n\n\tp,\n\taddress,\n\tpre,\n\thr,\n\tul,\n\tol,\n\tdl,\n\tdd,\n\ttable {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\tblockquote {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.8182;\n\t\tmargin-bottom: 1.8182em;\n\t\tmargin-left: -1.0909em;\n\t\tpadding-left: 0.9091em;\n\t}\n\n\tblockquote p {\n\t\tmargin-bottom: 1.8182em;\n\t}\n\n\tblockquote cite,\n\tblockquote small {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tline-height: 1.6842;\n\t}\n\n\tpre {\n\t\tline-height: 1.2632;\n\t}\n\n\tbutton,\n\tinput[type=\"button\"],\n\tinput[type=\"reset\"],\n\tinput[type=\"submit\"],\n\t.post-password-form input[type=\"submit\"],\n\t.widecolumn #submit,\n\t.widecolumn .mu_register input[type=\"submit\"] {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t\tpadding: 0.8125em 1.625em;\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"url\"],\n\tinput[type=\"password\"],\n\tinput[type=\"search\"],\n\ttextarea {\n\t\tpadding: 0.5278em;\n\t}\n\n\t.main-navigation {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t\tline-height: 1.5;\n\t}\n\n\t.main-navigation a {\n\t\tpadding: 0.75em 0;\n\t}\n\n\t.main-navigation .menu-item-description {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t\tline-height: 1.5;\n\t}\n\n\t.social-navigation ul {\n\t\tmargin-bottom: -1.2632em;\n\t}\n\n\t.social-navigation a {\n\t\theight: 2.5263em;\n\t\twidth: 2.5263em;\n\t}\n\n\t.secondary-toggle {\n\t\theight: 64px;\n\t\twidth: 64px;\n\t}\n\n\t.secondary-toggle:before {\n\t\tline-height: 62px;\n\t\twidth: 62px;\n\t}\n\n\t.post-password-form label,\n\t.post-navigation .meta-nav,\n\t.comment-navigation,\n\t.image-navigation,\n\t.author-heading,\n\t.author-bio,\n\t.entry-footer,\n\t.page-links a,\n\t.page-links span,\n\t.comment-metadata,\n\t.pingback .edit-link,\n\t.comment-list .reply,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.logged-in-as,\n\t.comment-form label,\n\t.form-allowed-tags,\n\t.site-info,\n\t.wp-caption-text,\n\t.gallery-caption,\n\t.entry-caption,\n\t.widecolumn label,\n\t.widecolumn .mu_register label {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.pagination .nav-links {\n\t\tmin-height: 3.3684em;\n\t}\n\n\t.pagination .page-numbers {\n\t\tline-height: 3.3684em;\n\t\tpadding: 0 0.8421em;\n\t}\n\n\t.pagination .prev,\n\t.pagination .next {\n\t\theight: 64px;\n\t\tpadding: 0;\n\t\twidth: 64px;\n\t}\n\n\t.pagination .prev:before,\n\t.pagination .next:before {\n\t\theight: 64px;\n\t\tline-height: 64px;\n\t\twidth: 64px;\n\t}\n\n\t.image-navigation .nav-previous a:before,\n\t.image-navigation .nav-next a:after,\n\t.comment-navigation .nav-previous a:before,\n\t.comment-navigation .nav-next a:after {\n\t\tfont-size: 24px;\n\t\ttop: -1px;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4211em 1.6842em 1.6842em 0;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4211em 0 1.6842em 1.6842em;\n\t}\n\n\tblockquote.aligncenter,\n\t.wp-caption.aligncenter,\n\timg.aligncenter {\n\t\tmargin-top: 0.4211em;\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.wp-caption.alignleft,\n\t.wp-caption.alignright,\n\t.wp-caption.aligncenter {\n\t\tmargin-bottom: 1.2632em;\n\t}\n\n\t.site-branding {\n\t\tmin-height: 3.7895em;\n\t\tpadding-right: 74px;\n\t}\n\n\t.site-title {\n\t\tfont-size: 32px;\n\t\tfont-size: 3.2rem;\n\t\tline-height: 1.25;\n\t}\n\n\t.site-description {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.widget {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.widget blockquote {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tline-height: 1.6842;\n\t\tmargin-bottom: 1.6842em;\n\t\tmargin-left: -1.2632em;\n\t\tpadding-left: 1.0526em;\n\t}\n\n\t.widget blockquote p {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.widget blockquote cite,\n\t.widget blockquote small {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.widget button,\n\t.widget input,\n\t.widget select,\n\t.widget textarea {\n\t\tline-height: 1.5;\n\t}\n\n\t.widget button,\n\t.widget input {\n\t\tline-height: normal;\n\t}\n\n\t.widget button,\n\t.widget input[type=\"button\"],\n\t.widget input[type=\"reset\"],\n\t.widget input[type=\"submit\"] {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t\tpadding: 0.8125em 1.625em;\n\t}\n\n\t.widget input[type=\"text\"],\n\t.widget input[type=\"email\"],\n\t.widget input[type=\"url\"],\n\t.widget input[type=\"password\"],\n\t.widget input[type=\"search\"],\n\t.widget textarea {\n\t\tpadding: 0.75em;\n\t}\n\n\t.widget .wp-caption-text,\n\t.widget .gallery-caption {\n\t\tline-height: 1.5;\n\t}\n\n\t.widget_calendar td,\n\t.widget_calendar th {\n\t\tline-height: 2.9375;\n\t}\n\n\t.widget_archive li,\n\t.widget_categories li,\n\t.widget_links li,\n\t.widget_meta li,\n\t.widget_nav_menu li,\n\t.widget_pages li,\n\t.widget_recent_comments li,\n\t.widget_recent_entries li {\n\t\tpadding: 0.7188em 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.7188em 0 0 1em;\n\t\tpadding-top: 0.7188em;\n\t}\n\n\t.widget_rss .rss-date,\n\t.widget_rss cite {\n\t\tfont-size: 13px;\n\t\tfont-size: 1.3rem;\n\t\tline-height: 1.8462;\n\t}\n\n\t.post-thumbnail {\n\t\tmargin-bottom: 2.9474em;\n\t}\n\n\t.entry-title,\n\t.widecolumn h2 {\n\t\tfont-size: 39px;\n\t\tfont-size: 3.9rem;\n\t\tline-height: 1.2308;\n\t\tmargin-bottom: 1.2308em;\n\t}\n\n\t.entry-content h1,\n\t.entry-summary h1,\n\t.page-content h1,\n\t.comment-content h1 {\n\t\tfont-size: 39px;\n\t\tfont-size: 3.9rem;\n\t\tline-height: 1.2308;\n\t\tmargin-top: 1.641em;\n\t\tmargin-bottom: 0.8205em;\n\t}\n\n\t.entry-content h2,\n\t.entry-summary h2,\n\t.page-content h2,\n\t.comment-content h2 {\n\t\tfont-size: 32px;\n\t\tfont-size: 3.2rem;\n\t\tline-height: 1.25;\n\t\tmargin-top: 2em;\n\t\tmargin-bottom: 1em;\n\t}\n\n\t.entry-content h3,\n\t.entry-summary h3,\n\t.page-content h3,\n\t.comment-content h3 {\n\t\tfont-size: 27px;\n\t\tfont-size: 2.7rem;\n\t\tline-height: 1.1852;\n\t\tmargin-top: 2.3704em;\n\t\tmargin-bottom: 1.1852em;\n\t}\n\n\t.entry-content h4,\n\t.entry-summary h4,\n\t.page-content h4,\n\t.comment-content h4 {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.4545;\n\t\tmargin-top: 2.9091em;\n\t\tmargin-bottom: 1.4545em;\n\t}\n\n\t.entry-content h5,\n\t.entry-content h6,\n\t.entry-summary h5,\n\t.entry-summary h6,\n\t.page-content h5,\n\t.page-content h6,\n\t.comment-content h5,\n\t.comment-content h6 {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tline-height: 1.2632;\n\t\tmargin-top: 3.3684em;\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.entry-content .more-link:after,\n\t.entry-summary .more-link:after {\n\t\ttop: 3px;\n\t}\n\n\t.author-info .avatar {\n\t\theight: 56px;\n\t\tmargin: 0 1.6842em 1.6842em 0;\n\t\twidth: 56px;\n\t}\n\n\t.author-link:after {\n\t\tfont-size: 24px;\n\t\ttop: 0;\n\t}\n\n\t.posted-on:before,\n\t.byline:before,\n\t.cat-links:before,\n\t.tags-links:before,\n\t.comments-link:before,\n\t.entry-format:before,\n\t.edit-link:before,\n\t.full-size-link:before {\n\t\ttop: 4px;\n\t}\n\n\t.taxonomy-description {\n\t\tpadding-top: 0.4211em;\n\t}\n\n\t.page-title,\n\t.comments-title,\n\t.comment-reply-title,\n\t.post-navigation .post-title {\n\t\tfont-size: 27px;\n\t\tfont-size: 2.7rem;\n\t\tline-height: 1.1852;\n\t}\n\n\t.page-links {\n\t\tmargin-bottom: 1.4736em;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0.25em 0.25em 0;\n\t}\n\n\t.entry-attachment {\n\t\tmargin-bottom: 1.6842em\n\t}\n\n\t.format-aside .entry-title,\n\t.format-image .entry-title,\n\t.format-video .entry-title,\n\t.format-quote .entry-title,\n\t.format-gallery .entry-title,\n\t.format-status .entry-title,\n\t.format-link .entry-title,\n\t.format-audio .entry-title,\n\t.format-chat .entry-title {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.4545;\n\t\tmargin-bottom: 1.4545em;\n\t}\n\n\t.format-link .entry-title a:after {\n\t\ttop: 0.125em;\n\t}\n\n\t.comments-title {\n\t\tmargin-bottom: 1.4545em;\n\t}\n\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback {\n\t\tpadding: 1.6842em 0;\n\t}\n\n\t.comment-list + .comment-respond,\n\t.comment-navigation + .comment-respond {\n\t\tpadding-top: 1.6842em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-left: 1.4737em;\n\t}\n\n\t.comment-author .avatar {\n\t\theight: 56px;\n\t\tmargin-right: 1.6842em;\n\t\ttop: 3px;\n\t\twidth: 56px;\n\t}\n\n\t.comment-metadata {\n\t\tline-height: 2;\n\t}\n\n\t.comment-metadata .edit-link:before {\n\t\ttop: 8px;\n\t}\n\n\t.pingback .edit-link:before {\n\t\ttop: 8px;\n\t}\n\n\t.bypostauthor > article .fn:after {\n\t\ttop: 8px;\n\t}\n\n\t.comment-content ul,\n\t.comment-content ol {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.comment-list .reply a {\n\t\tpadding: 0.4375em 0.875em;\n\t}\n\n\t.comment-form,\n\t.no-comments {\n\t\tpadding-top: 1.6842em;\n\t}\n\n\tembed,\n\tiframe,\n\tobject,\n\tvideo {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.wp-audio-shortcode,\n\t.wp-video,\n\t.wp-playlist.wp-audio-playlist {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.wp-caption,\n\t.gallery {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.widecolumn .mu_alert {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.widecolumn p {\n\t\tmargin: 1.6842em 0;\n\t}\n\n\t.widecolumn p + h2 {\n\t\tmargin-top: 1.641em;\n\t}\n\n\t.widecolumn #key,\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #blogname,\n\t.widecolumn .mu_register #user_name {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t}\n\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #user_name {\n\t\tmargin: 0 0 0.421em;\n\t}\n}\n\n\n/**\n * 16.4 Desktop Small 955px\n */\n\n@media screen and (min-width: 59.6875em) {\n\tbody:before {\n\t\tbackground-color: #fff;\n\t\tbox-shadow: 0 0 1px rgba(0, 0, 0, 0.15);\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 100%;\n\t\tmin-height: 100%;\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 29.4118%;\n\t\tz-index: 0; /* Fixes flashing bug with scrolling on Safari */\n\t}\n\n\t.site {\n\t\tmargin: 0 auto;\n\t\tmax-width: 1403px;\n\t}\n\n\t.sidebar {\n\t\tfloat: left;\n\t\tmargin-right: -100%;\n\t\tmax-width: 413px;\n\t\tposition: relative;\n\t\twidth: 29.4118%;\n\t}\n\n\t.secondary {\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\t\tdisplay: block;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.site-main {\n\t\tpadding: 8.3333% 0;\n\t}\n\n\t.site-content {\n\t\tdisplay: block;\n\t\tfloat: left;\n\t\tmargin-left: 29.4118%;\n\t\twidth: 70.5882%;\n\t}\n\n\tbody {\n\t\tfont-size: 15px;\n\t\tfont-size: 1.5rem;\n\t\tline-height: 1.6;\n\t}\n\n\tp,\n\taddress,\n\tpre,\n\thr,\n\tul,\n\tol,\n\tdl,\n\tdd,\n\ttable {\n\t\tmargin-bottom: 1.6em;\n\t}\n\n\tblockquote {\n\t\tfont-size: 18px;\n\t\tfont-size: 1.8rem;\n\t\tline-height: 1.6667;\n\t\tmargin-bottom: 1.6667em;\n\t\tmargin-left: -1.3333em;\n\t\tpadding-left: 1.1111em;\n\t}\n\n\tblockquote cite,\n\tblockquote small {\n\t\tfont-size: 15px;\n\t\tfont-size: 1.5rem;\n\t\tline-height: 1.6;\n\t}\n\n\tpre {\n\t\tline-height: 1.2;\n\t}\n\n\tbutton,\n\tinput,\n\tselect,\n\ttextarea {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t\tline-height: 1.5;\n\t}\n\n\tbutton,\n\tinput {\n\t\tline-height: normal;\n\t}\n\n\tbutton,\n\tinput[type=\"button\"],\n\tinput[type=\"reset\"],\n\tinput[type=\"submit\"],\n\t.post-password-form input[type=\"submit\"],\n\t.widecolumn #submit,\n\t.widecolumn .mu_register input[type=\"submit\"] {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t\tpadding: 0.7917em 1.5833em;\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"url\"],\n\tinput[type=\"password\"],\n\tinput[type=\"search\"],\n\ttextarea {\n\t\tpadding: 0.375em;\n\t}\n\n\t.main-navigation {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t\tmargin: 0 20% 20%;\n\t}\n\n\t.main-navigation a {\n\t\tpadding: 0.5em 0;\n\t}\n\n\t.main-navigation .menu-item-has-children > a {\n\t\tpadding-right: 30px;\n\t}\n\n\t.main-navigation .menu-item-description {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t\tline-height: 1.5;\n\t}\n\n\t.dropdown-toggle {\n\t\theight: 24px;\n\t\twidth: 24px;\n\t}\n\n\t.dropdown-toggle:after {\n\t\tfont-size: 16px;\n\t\tline-height: 24px;\n\t\twidth: 24px;\n\t}\n\n\t.social-navigation {\n\t\tmargin: 0 20% 20%;\n\t}\n\n\t.social-navigation ul {\n\t\tmargin-bottom: -1.6em;\n\t}\n\n\t.social-navigation li {\n\t\twidth: 25%;\n\t}\n\n\t.social-navigation a {\n\t\theight: 3.2em;\n\t}\n\n\t.secondary-toggle {\n\t\tdisplay: none;\n\t}\n\n\t.post-password-form label,\n\t.post-navigation .meta-nav,\n\t.comment-navigation,\n\t.image-navigation,\n\t.author-heading,\n\t.author-bio,\n\t.entry-footer,\n\t.page-links a,\n\t.page-links span,\n\t.comment-metadata,\n\t.pingback .edit-link,\n\t.comment-list .reply,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.logged-in-as,\n\t.comment-form label,\n\t.form-allowed-tags,\n\t.site-info,\n\t.wp-caption-text,\n\t.gallery-caption,\n\t.entry-caption,\n\t.widecolumn label,\n\t.widecolumn .mu_register label {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t}\n\n\t.post-navigation {\n\t\tmargin: 8.3333% 8.3333% 0;\n\t}\n\n\t.post-navigation a {\n\t\tpadding: 5% 10%;\n\t}\n\n\t.pagination {\n\t\tmargin: 8.333% 8.333% 0;\n\t}\n\n\t.pagination .nav-links {\n\t\tmin-height: 3.2em;\n\t}\n\n\t.pagination .page-numbers {\n\t\tline-height: 3.2em;\n\t\tpadding: 0 0.8em;\n\t}\n\n\t.pagination .prev,\n\t.pagination .next {\n\t\theight: 48px;\n\t\tpadding: 0;\n\t\twidth: 48px;\n\t}\n\n\t.pagination .prev:before,\n\t.pagination .next:before {\n\t\theight: 48px;\n\t\tline-height: 48px;\n\t\twidth: 48px;\n\t}\n\n\t.image-navigation .nav-previous a:before,\n\t.image-navigation .nav-next a:after,\n\t.comment-navigation .nav-previous a:before,\n\t.comment-navigation .nav-next a:after {\n\t\tfont-size: 16px;\n\t\ttop: 0;\n\t}\n\n\t.image-navigation {\n\t\tpadding: 0 10%;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4em 1.6em 1.6em 0;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4em 0 1.6em 1.6em;\n\t}\n\n\tblockquote.aligncenter,\n\t.wp-caption.aligncenter,\n\timg.aligncenter {\n\t\tclear: both;\n\t\tmargin-top: 0.4em;\n\t\tmargin-bottom: 1.6em;\n\t}\n\n\t.wp-caption.alignleft,\n\t.wp-caption.alignright,\n\t.wp-caption.aligncenter {\n\t\tmargin-bottom: 1.2em;\n\t}\n\n\t.site-header {\n\t\tbackground-color: transparent;\n\t\tborder-bottom: 0;\n\t\tmargin: 20% 0;\n\t\tpadding: 0 20%;\n\t}\n\n\t.site-branding {\n\t\tmin-height: 0;\n\t\tpadding: 0;\n\t}\n\n\t.site-title {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.3636;\n\t}\n\n\t.site-description {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t}\n\n\t.widget {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t\tmargin: 0 0 20%;\n\t\tpadding: 0 20%;\n\t}\n\n\t.widget blockquote {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t\tline-height: 1.5;\n\t\tmargin-bottom: 1.5em;\n\t\tmargin-left: -1.5em;\n\t\tpadding-left: 1.1667em;\n\t}\n\n\t.widget blockquote p {\n\t\tmargin-bottom: 1.5em;\n\t}\n\n\t.widget blockquote cite,\n\t.widget blockquote small {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t}\n\n\t.widget pre {\n\t\tpadding: 0.5em;\n\t}\n\n\t.widget button,\n\t.widget input,\n\t.widget select,\n\t.widget textarea {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t}\n\n\t.widget button,\n\t.widget input[type=\"button\"],\n\t.widget input[type=\"reset\"],\n\t.widget input[type=\"submit\"] {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t\tpadding: 0.5417em 1.0833em;\n\t}\n\n\t.widget input[type=\"text\"],\n\t.widget input[type=\"email\"],\n\t.widget input[type=\"url\"],\n\t.widget input[type=\"password\"],\n\t.widget input[type=\"search\"],\n\t.widget textarea {\n\t\tpadding: 0.4583em;\n\t}\n\n\t.widget .wp-caption-text,\n\t.widget .gallery-caption {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t}\n\n\t.widget_calendar td,\n\t.widget_calendar th {\n\t\tline-height: 1.9167;\n\t}\n\n\t.widget_archive li,\n\t.widget_categories li,\n\t.widget_links li,\n\t.widget_meta li,\n\t.widget_nav_menu li,\n\t.widget_pages li,\n\t.widget_recent_comments li,\n\t.widget_recent_entries li {\n\t\tpadding: 0.4583em 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.4583em 0 0 1em;\n\t\tpadding-top: 0.4583em;\n\t}\n\n\t.widget_rss .rss-date,\n\t.widget_rss cite {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t\tline-height: 1.5;\n\t}\n\n\t.hentry,\n\t.page-header,\n\t.page-content {\n\t\tmargin: 0 8.3333%;\n\t}\n\n\t.hentry {\n\t\tpadding-top: 8.3333%;\n\t}\n\n\t.hentry + .hentry,\n\t.page-header + .hentry,\n\t.page-header + .page-content {\n\t\tmargin-top: 8.3333%;\n\t}\n\n\t.post-thumbnail {\n\t\tmargin-bottom: 2.4em;\n\t}\n\n\t.entry-header {\n\t\tpadding: 0 10%;\n\t}\n\n\t.entry-title,\n\t.widecolumn h2 {\n\t\tfont-size: 31px;\n\t\tfont-size: 3.1rem;\n\t\tline-height: 1.1613;\n\t\tmargin-bottom: 1.1613em;\n\t}\n\n\t.entry-content,\n\t.entry-summary {\n\t\tpadding: 0 10% 10%;\n\t}\n\n\t.entry-content h1,\n\t.entry-summary h1,\n\t.page-content h1,\n\t.comment-content h1 {\n\t\tfont-size: 31px;\n\t\tfont-size: 3.1rem;\n\t\tline-height: 1.1613;\n\t\tmargin-top: 1.5484em;\n\t\tmargin-bottom: 0.7742em;\n\t}\n\n\t.entry-content h2,\n\t.entry-summary h2,\n\t.page-content h2,\n\t.comment-content h2 {\n\t\tfont-size: 26px;\n\t\tfont-size: 2.6rem;\n\t\tline-height: 1.3846;\n\t\tmargin-top: 1.8462em;\n\t\tmargin-bottom: 0.9231em;\n\t}\n\n\t.entry-content h3,\n\t.entry-summary h3,\n\t.page-content h3,\n\t.comment-content h3 {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.3636;\n\t\tmargin-top: 2.1818em;\n\t\tmargin-bottom: 1.0909em;\n\t}\n\n\t.entry-content h4,\n\t.entry-summary h4,\n\t.page-content h4,\n\t.comment-content h4 {\n\t\tfont-size: 18px;\n\t\tfont-size: 1.8rem;\n\t\tline-height: 1.3333;\n\t\tmargin-top: 2.6667em;\n\t\tmargin-bottom: 1.3333em;\n\t}\n\n\t.entry-content h5,\n\t.entry-content h6,\n\t.entry-summary h5,\n\t.entry-summary h6,\n\t.page-content h5,\n\t.page-content h6,\n\t.comment-content h5,\n\t.comment-content h6 {\n\t\tfont-size: 15px;\n\t\tfont-size: 1.5rem;\n\t\tline-height: 1.2;\n\t\tmargin-top: 3.2em;\n\t\tmargin-bottom: 1.6em;\n\t}\n\n\t.entry-content .more-link:after,\n\t.entry-summary .more-link:after {\n\t\tfont-size: 16px;\n\t\ttop: 5px;\n\t}\n\n\t.author-info {\n\t\tmargin: 0 10%;\n\t\tpadding: 10% 0;\n\t}\n\n\t.author-info .avatar {\n\t\theight: 36px;\n\t\tmargin: 0 1.5em 1.5em 0;\n\t\twidth: 36px;\n\t}\n\n\t.author-link:after {\n\t\tfont-size: 16px;\n\t\ttop: 1px;\n\t}\n\n\t.entry-footer {\n\t\tpadding: 5% 10%;\n\t}\n\n\t.posted-on:before,\n\t.byline:before,\n\t.cat-links:before,\n\t.tags-links:before,\n\t.comments-link:before,\n\t.entry-format:before,\n\t.edit-link:before,\n\t.full-size-link:before {\n\t\ttop: 0;\n\t}\n\n\t.page-header {\n\t\tpadding: 4.1666% 8.3333%;\n\t}\n\n\t.page-content {\n\t\tpadding: 8.3333%;\n\t}\n\n\t.taxonomy-description {\n\t\tpadding-top: 0.4em;\n\t}\n\n\t.page-title,\n\t.comments-title,\n\t.comment-reply-title,\n\t.post-navigation .post-title {\n\t\tfont-size: 18px;\n\t\tfont-size: 1.8rem;\n\t\tline-height: 1.3333;\n\t}\n\n\t.page-links {\n\t\tmargin-bottom: 1.3333em;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0.3333em 0.3333em 0;\n\t}\n\n\t.entry-attachment {\n\t\tmargin-bottom: 1.6em;\n\t}\n\n\t.format-aside .entry-title,\n\t.format-image .entry-title,\n\t.format-video .entry-title,\n\t.format-quote .entry-title,\n\t.format-gallery .entry-title,\n\t.format-status .entry-title,\n\t.format-link .entry-title,\n\t.format-audio .entry-title,\n\t.format-chat .entry-title {\n\t\tfont-size: 18px;\n\t\tfont-size: 1.8rem;\n\t\tline-height: 1.3333;\n\t\tmargin-bottom: 1.3333em;\n\t}\n\n\t.format-link .entry-title a:after {\n\t\ttop: 0;\n\t}\n\n\t.comments-area {\n\t\tmargin: 8.3333% 8.3333% 0;\n\t\tpadding: 8.3333%;\n\t}\n\n\t.comments-title {\n\t\tmargin-bottom: 1.3333em;\n\t}\n\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback {\n\t\tpadding: 1.6em 0;\n\t}\n\n\t.comment-list + .comment-respond,\n\t.comment-navigation + .comment-respond {\n\t\tpadding-top: 1.6em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-left: 0.8em;\n\t}\n\n\t.comment-author {\n\t\tmargin-bottom: 0.4em;\n\t}\n\n\t.comment-author .avatar {\n\t\theight: 24px;\n\t\tmargin-right: 0.8em;\n\t\ttop: 0;\n\t\twidth: 24px;\n\t}\n\n\t.comment-metadata .edit-link:before {\n\t\ttop: 3px;\n\t}\n\n\t.pingback .edit-link:before {\n\t\ttop: 5px;\n\t}\n\n\t.bypostauthor > article .fn:after {\n\t\ttop: 5px;\n\t\tleft: 3px;\n\t}\n\n\t.comment-content ul,\n\t.comment-content ol {\n\t\tmargin-bottom: 2em;\n\t}\n\n\t.comment-list .reply a {\n\t\tpadding: 0.4167em 0.8333em;\n\t}\n\n\t.comment-form,\n\t.no-comments {\n\t\tpadding-top: 1.6em;\n\t}\n\n\t.comment-reply-title small a:before {\n\t\ttop: -3px;\n\t}\n\n\t.site-footer {\n\t\tfloat: left;\n\t\tmargin: 0 0 0 35.2941%;\n\t\tpadding: 0;\n\t\twidth: 58.8235%;\n\t}\n\n\t.site-info {\n\t\tpadding: 5% 10%;\n\t}\n\n\tembed,\n\tiframe,\n\tobject,\n\tvideo {\n\t\tmargin-bottom: 1.6em;\n\t}\n\n\t.wp-audio-shortcode,\n\t.wp-video,\n\t.wp-playlist.wp-audio-playlist {\n\t\tfont-size: 15px;\n\t\tfont-size: 1.5rem;\n\t\tmargin-bottom: 1.6em;\n\t}\n\n\t.wp-caption,\n\t.gallery {\n\t\tmargin-bottom: 1.6em;\n\t}\n\n\t.widecolumn {\n\t\tmargin: 8.3333%;\n\t\tpadding: 8.3333%;\n\t}\n\n\t.widecolumn .mu_alert {\n\t\tmargin-bottom: 1.6em;\n\t}\n\n\t.widecolumn p {\n\t\tmargin: 1.6em 0;\n\t}\n\n\t.widecolumn p + h2 {\n\t\tmargin-top: 1.5484em;\n\t}\n\n\t.widecolumn #key,\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #blogname,\n\t.widecolumn .mu_register #user_name {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #user_name {\n\t\tmargin: 0 0 0.375em;\n\t}\n}\n\n\n/**\n * 16.5 Desktop Medium 1100px\n */\n\n@media screen and (min-width: 68.75em) {\n\tbody,\n\tbutton,\n\tinput,\n\tselect,\n\ttextarea {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tline-height: 1.6471;\n\t}\n\n\tbutton,\n\tinput {\n\t\tline-height: normal;\n\t}\n\n\tp,\n\taddress,\n\tpre,\n\thr,\n\tul,\n\tol,\n\tdl,\n\tdd,\n\ttable {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\tblockquote {\n\t\tfont-size: 20px;\n\t\tfont-size: 2rem;\n\t\tline-height: 1.75;\n\t\tmargin-bottom: 1.75em;\n\t\tmargin-left: -1.05em;\n\t\tpadding-left: 0.85em;\n\t}\n\n\tblockquote p {\n\t\tmargin-bottom: 1.75em;\n\t}\n\n\tblockquote cite,\n\tblockquote small {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tline-height: 1.6471;\n\t}\n\n\tpre {\n\t\tline-height: 1.2353;\n\t}\n\n\tbutton,\n\tinput[type=\"button\"],\n\tinput[type=\"reset\"],\n\tinput[type=\"submit\"],\n\t.post-password-form input[type=\"submit\"],\n\t.widecolumn #submit,\n\t.widecolumn .mu_register input[type=\"submit\"] {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t\tpadding: 0.8214em 1.5714em;\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"url\"],\n\tinput[type=\"password\"],\n\tinput[type=\"search\"],\n\ttextarea {\n\t\tpadding: 0.5em;\n\t}\n\n\t.main-navigation {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t}\n\n\t.main-navigation a {\n\t\tpadding: 0.4643em 0;\n\t}\n\n\t.main-navigation .menu-item-has-children > a {\n\t\tpadding-right: 34px;\n\t}\n\n\t.main-navigation .menu-item-description {\n\t\tline-height: 1.4583;\n\t\tmargin-top: 0.25em;\n\t}\n\n\t.dropdown-toggle {\n\t\theight: 28px;\n\t\twidth: 28px;\n\t}\n\n\t.dropdown-toggle:after {\n\t\tline-height: 28px;\n\t\twidth: 28px;\n\t}\n\n\t.social-navigation ul {\n\t\tmargin-bottom: -1.4706em;\n\t}\n\n\t.social-navigation li {\n\t\twidth: 20%;\n\t}\n\n\t.social-navigation a {\n\t\theight: 2.8824em;\n\t}\n\n\t.post-password-form label,\n\t.post-navigation .meta-nav,\n\t.comment-navigation,\n\t.image-navigation,\n\t.author-heading,\n\t.author-bio,\n\t.entry-footer,\n\t.page-links a,\n\t.page-links span,\n\t.comment-metadata,\n\t.pingback .edit-link,\n\t.comment-list .reply,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.logged-in-as,\n\t.comment-form label,\n\t.form-allowed-tags,\n\t.site-info,\n\t.wp-caption-text,\n\t.gallery-caption,\n\t.entry-caption,\n\t.widecolumn label,\n\t.widecolumn .mu_register label {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t}\n\n\t.pagination .nav-links {\n\t\tmin-height: 3.2941em;\n\t}\n\n\t.pagination .page-numbers {\n\t\tline-height: 3.2941em;\n\t\tpadding: 0 0.8235em;\n\t}\n\n\t.pagination .prev,\n\t.pagination .next {\n\t\theight: 56px;\n\t\tpadding: 0;\n\t\twidth: 56px;\n\t}\n\n\t.pagination .prev:before,\n\t.pagination .next:before {\n\t\theight: 56px;\n\t\tline-height: 56px;\n\t\twidth: 56px;\n\t}\n\n\t.image-navigation .nav-previous a:before,\n\t.image-navigation .nav-next a:after,\n\t.comment-navigation .nav-previous a:before,\n\t.comment-navigation .nav-next a:after {\n\t\ttop: 2px;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4118em 1.6471em 1.6471em 0;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4118em 0 1.6471em 1.6471em;\n\t}\n\n\tblockquote.aligncenter,\n\t.wp-caption.aligncenter,\n\timg.aligncenter {\n\t\tmargin-top: 0.4118em;\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.wp-caption.alignleft,\n\t.wp-caption.alignright,\n\t.wp-caption.aligncenter {\n\t\tmargin-bottom: 1.2353em;\n\t}\n\n\t.site-title {\n\t\tfont-size: 24px;\n\t\tfont-size: 2.4rem;\n\t\tline-height: 1.1667;\n\t}\n\n\t.site-description {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t}\n\n\t.widget {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t}\n\n\t.widget blockquote {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t\tpadding-left: 1.2143em;\n\t}\n\n\t.widget button,\n\t.widget input,\n\t.widget select,\n\t.widget textarea {\n\t\tfont-size: 14px;\n\t\tfont-size: 1.4rem;\n\t}\n\n\t.widget button,\n\t.widget input[type=\"button\"],\n\t.widget input[type=\"reset\"],\n\t.widget input[type=\"submit\"] {\n\t\tfont-size: 12px;\n\t\tfont-size: 1.2rem;\n\t\tpadding: 0.75em 1.5em;\n\t}\n\n\t.widget input[type=\"text\"],\n\t.widget input[type=\"email\"],\n\t.widget input[type=\"url\"],\n\t.widget input[type=\"password\"],\n\t.widget input[type=\"search\"],\n\t.widget textarea {\n\t\tpadding: 0.5em;\n\t}\n\n\t.widget .wp-caption-text,\n\t.widget .gallery-caption {\n\t\tline-height: 1.4583;\n\t\tpadding: 0.5833em 0;\n\t}\n\n\t.widget_calendar caption {\n\t\tmargin: 0 0 1.9286em;\n\t}\n\n\t.widget_calendar td,\n\t.widget_calendar th {\n\t\tline-height: 1.9286;\n\t}\n\n\t.widget_archive li,\n\t.widget_categories li,\n\t.widget_links li,\n\t.widget_meta li,\n\t.widget_nav_menu li,\n\t.widget_pages li,\n\t.widget_recent_comments li,\n\t.widget_recent_entries li {\n\t\tpadding: 0.4643em 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.4643em 0 0 1em;\n\t\tpadding-top: 0.4643em;\n\t}\n\n\t.widget_rss .rss-date,\n\t.widget_rss cite {\n\t\tline-height: 1.75;\n\t}\n\n\t.post-thumbnail {\n\t\tmargin-bottom: 2.4706em;\n\t}\n\n\t.entry-title,\n\t.widecolumn h2 {\n\t\tfont-size: 35px;\n\t\tfont-size: 3.5rem;\n\t\tline-height: 1.2;\n\t\tmargin-bottom: 1.2em;\n\t}\n\n\t.entry-content h1,\n\t.entry-summary h1,\n\t.page-content h1,\n\t.comment-content h1 {\n\t\tfont-size: 35px;\n\t\tfont-size: 3.5rem;\n\t\tline-height: 1.2;\n\t\tmargin-top: 1.6em;\n\t\tmargin-bottom: 0.8em;\n\t}\n\n\t.entry-content h2,\n\t.entry-summary h2,\n\t.page-content h2,\n\t.comment-content h2 {\n\t\tfont-size: 29px;\n\t\tfont-size: 2.9rem;\n\t\tline-height: 1.2069;\n\t\tmargin-top: 1.931em;\n\t\tmargin-bottom: 0.9655em;\n\t}\n\n\t.entry-content h3,\n\t.entry-summary h3,\n\t.page-content h3,\n\t.comment-content h3 {\n\t\tfont-size: 24px;\n\t\tfont-size: 2.4rem;\n\t\tline-height: 1.1667;\n\t\tmargin-top: 2.3333em;\n\t\tmargin-bottom: 1.1667em;\n\t}\n\n\t.entry-content h4,\n\t.entry-summary h4,\n\t.page-content h4,\n\t.comment-content h4 {\n\t\tfont-size: 20px;\n\t\tfont-size: 2rem;\n\t\tline-height: 1.4;\n\t\tmargin-top: 2.8em;\n\t\tmargin-bottom: 1.4em;\n\t}\n\n\t.entry-content h5,\n\t.entry-content h6,\n\t.entry-summary h5,\n\t.entry-summary h6,\n\t.page-content h5,\n\t.page-content h6,\n\t.comment-content h5,\n\t.comment-content h6 {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tline-height: 1.2353;\n\t\tmargin-top: 3.2941em;\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.entry-content .more-link:after,\n\t.entry-summary .more-link:after {\n\t\tfont-size: 24px;\n\t\ttop: 2px;\n\t}\n\n\t.author-info .avatar {\n\t\theight: 42px;\n\t\tmargin: 0 1.6471em 1.6471em 0;\n\t\twidth: 42px;\n\t}\n\n\t.author-link:after {\n\t\ttop: 3px;\n\t}\n\n\t.posted-on:before,\n\t.byline:before,\n\t.cat-links:before,\n\t.tags-links:before,\n\t.comments-link:before,\n\t.entry-format:before,\n\t.edit-link:before,\n\t.full-size-link:before {\n\t\ttop: 3px;\n\t}\n\n\t.taxonomy-description {\n\t\tpadding-top: 0.4118em;\n\t}\n\n\t.page-title,\n\t.comments-title,\n\t.comment-reply-title,\n\t.post-navigation .post-title {\n\t\tfont-size: 24px;\n\t\tfont-size: 2.4rem;\n\t\tline-height: 1.1667;\n\t}\n\n\t.page-links {\n\t\tmargin-bottom: 1.4117em;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0.2857em 0.2857em 0;\n\t}\n\n\t.entry-attachment {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.format-aside .entry-title,\n\t.format-image .entry-title,\n\t.format-video .entry-title,\n\t.format-quote .entry-title,\n\t.format-gallery .entry-title,\n\t.format-status .entry-title,\n\t.format-link .entry-title,\n\t.format-audio .entry-title,\n\t.format-chat .entry-title {\n\t\tfont-size: 20px;\n\t\tfont-size: 2rem;\n\t\tline-height: 1.4;\n\t\tmargin-bottom: 1.4em;\n\t}\n\n\t.format-link .entry-title a:after {\n\t\ttop: 0.0833em;\n\t}\n\n\t.comments-title {\n\t\tmargin-bottom: 1.4em;\n\t}\n\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback {\n\t\tpadding: 1.6471em 0;\n\t}\n\n\t.comment-list + .comment-respond,\n\t.comment-navigation + .comment-respond {\n\t\tpadding-top: 1.6471em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-left: 1.1667em;\n\t}\n\n\t.comment-author {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.comment-author .avatar {\n\t\theight: 42px;\n\t\tmargin-right: 1.64705em;\n\t\ttop: 5px;\n\t\twidth: 42px;\n\t}\n\n\t.bypostauthor > article .fn:after {\n\t\ttop: 7px;\n\t\tleft: 6px;\n\t}\n\n\t.comment-metadata .edit-link:before {\n\t\ttop: 6px;\n\t}\n\n\t.pingback .edit-link:before {\n\t\ttop: 6px;\n\t}\n\n\t.comment-content ul,\n\t.comment-content ol {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.comment-list .reply a {\n\t\tpadding: 0.4286em 0.8571em;\n\t}\n\n\t.comment-form,\n\t.no-comments {\n\t\tpadding-top: 1.6471em;\n\t}\n\n\t.comment-reply-title small a:before {\n\t\ttop: -1px;\n\t}\n\n\tembed,\n\tiframe,\n\tobject,\n\tvideo {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.wp-audio-shortcode,\n\t.wp-video,\n\t.wp-playlist.wp-audio-playlist {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.wp-caption,\n\t.gallery {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.widecolumn .mu_alert {\n\t\tmargin-bottom: 1.6471em;\n\t}\n\n\t.widecolumn p {\n\t\tmargin: 1.6471em 0;\n\t}\n\n\t.widecolumn p + h2 {\n\t\tmargin-top: 1.6em;\n\t}\n\n\t.widecolumn #key,\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #blogname,\n\t.widecolumn .mu_register #user_name {\n\t\tfont-size: 17px;\n\t\tfont-size: 1.7rem;\n\t}\n\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #user_name {\n\t\tmargin: 0 0 0.4117em;\n\t}\n}\n\n\n/**\n * 16.6 Desktop Large 1240px\n */\n\n@media screen and (min-width: 77.5em) {\n\tbody,\n\tbutton,\n\tinput,\n\tselect,\n\ttextarea {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tline-height: 1.6842;\n\t}\n\n\tbutton,\n\tinput {\n\t\tline-height: normal;\n\t}\n\n\tp,\n\taddress,\n\tpre,\n\thr,\n\tul,\n\tol,\n\tdl,\n\tdd,\n\ttable {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\tblockquote {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.8182;\n\t\tmargin-bottom: 1.8182em;\n\t\tmargin-left: -1.0909em;\n\t\tpadding-left: 0.9091em;\n\t}\n\n\tblockquote p {\n\t\tmargin-bottom: 1.8182em;\n\t}\n\n\tblockquote cite,\n\tblockquote small {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tline-height: 1.6842;\n\t}\n\n\tpre {\n\t\tline-height: 1.2632;\n\t}\n\n\tbutton,\n\tinput[type=\"button\"],\n\tinput[type=\"reset\"],\n\tinput[type=\"submit\"],\n\t.post-password-form input[type=\"submit\"],\n\t.widecolumn #submit,\n\t.widecolumn .mu_register input[type=\"submit\"] {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t\tpadding: 0.8125em 1.625em;\n\t}\n\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"url\"],\n\tinput[type=\"password\"],\n\tinput[type=\"search\"],\n\ttextarea {\n\t\tpadding: 0.5278em;\n\t}\n\n\t.main-navigation {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.main-navigation a {\n\t\tpadding: 0.5em 0;\n\t}\n\n\t.main-navigation .menu-item-has-children > a {\n\t\tpadding-right: 38px;\n\t}\n\n\t.main-navigation .menu-item-description {\n\t\tfont-size: 13px;\n\t\tfont-size: 1.3rem;\n\t\tline-height: 1.5385;\n\t\tmargin-top: 0.3077em;\n\t}\n\n\t.dropdown-toggle {\n\t\theight: 32px;\n\t\ttop: 4px;\n\t\twidth: 32px;\n\t}\n\n\t.dropdown-toggle:after {\n\t\tline-height: 32px;\n\t\twidth: 32px;\n\t}\n\n\t.social-navigation ul {\n\t\tmargin-bottom: -1.2632em;\n\t}\n\n\t.social-navigation a {\n\t\theight: 2.5263em;\n\t}\n\n\t.post-password-form label,\n\t.post-navigation .meta-nav,\n\t.comment-navigation,\n\t.image-navigation,\n\t.author-heading,\n\t.author-bio,\n\t.entry-footer,\n\t.page-links a,\n\t.page-links span,\n\t.comment-metadata,\n\t.pingback .edit-link,\n\t.comment-list .reply,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.logged-in-as,\n\t.comment-form label,\n\t.form-allowed-tags,\n\t.site-info,\n\t.wp-caption-text,\n\t.gallery-caption,\n\t.entry-caption,\n\t.widecolumn label,\n\t.widecolumn .mu_register label {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.pagination .nav-links {\n\t\tmin-height: 3.3684em;\n\t}\n\n\t.pagination .page-numbers {\n\t\tline-height: 3.3684em;\n\t\tpadding: 0 0.8421em;\n\t}\n\n\t.pagination .prev,\n\t.pagination .next {\n\t\theight: 64px;\n\t\tpadding: 0;\n\t\twidth: 64px;\n\t}\n\n\t.pagination .prev:before,\n\t.pagination .next:before {\n\t\theight: 64px;\n\t\tline-height: 64px;\n\t\twidth: 64px;\n\t}\n\n\t.image-navigation .nav-previous a:before,\n\t.image-navigation .nav-next a:after,\n\t.comment-navigation .nav-previous a:before,\n\t.comment-navigation .nav-next a:after {\n\t\tfont-size: 24px;\n\t\ttop: -1px;\n\t}\n\n\tblockquote.alignleft,\n\t.wp-caption.alignleft,\n\timg.alignleft {\n\t\tmargin: 0.4211em 1.6842em 1.6842em 0;\n\t}\n\n\tblockquote.alignright,\n\t.wp-caption.alignright,\n\timg.alignright {\n\t\tmargin: 0.4211em 0 1.6842em 1.6842em;\n\t}\n\n\tblockquote.aligncenter,\n\t.wp-caption.aligncenter,\n\timg.aligncenter {\n\t\tmargin-top: 0.4211em;\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.wp-caption.alignleft,\n\t.wp-caption.alignright,\n\t.wp-caption.aligncenter {\n\t\tmargin-bottom: 1.2632em;\n\t}\n\n\t.site-title {\n\t\tfont-size: 27px;\n\t\tfont-size: 2.7rem;\n\t\tline-height: 1.1852;\n\t}\n\n\t.site-description {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.widget {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.widget blockquote {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t\tpadding-left: 1.25em;\n\t}\n\n\t.widget blockquote cite,\n\t.widget blockquote small {\n\t\tfont-size: 13px;\n\t\tfont-size: 1.3rem;\n\t\tline-height: 1.8462;\n\t}\n\n\t.widget button,\n\t.widget input,\n\t.widget select,\n\t.widget textarea {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.6rem;\n\t}\n\n\t.widget button,\n\t.widget input[type=\"button\"],\n\t.widget input[type=\"reset\"],\n\t.widget input[type=\"submit\"] {\n\t\tfont-size: 13px;\n\t\tfont-size: 1.3rem;\n\t\tpadding: 0.8462em 1.6923em;\n\t}\n\n\t.widget input[type=\"text\"],\n\t.widget input[type=\"email\"],\n\t.widget input[type=\"url\"],\n\t.widget input[type=\"password\"],\n\t.widget input[type=\"search\"],\n\t.widget textarea {\n\t\tpadding: 0.5em;\n\t}\n\n\t.widget .wp-caption-text,\n\t.widget .gallery-caption {\n\t\tfont-size: 13px;\n\t\tfont-size: 1.3rem;\n\t\tline-height: 1.5385;\n\t\tpadding: 0.6154em 0;\n\t}\n\n\t.widget_calendar td,\n\t.widget_calendar th {\n\t\tline-height: 1.9375;\n\t}\n\n\t.widget_calendar caption {\n\t\tmargin: 0 0 1.5em;\n\t}\n\n\t.widget_archive li,\n\t.widget_categories li,\n\t.widget_links li,\n\t.widget_meta li,\n\t.widget_nav_menu li,\n\t.widget_pages li,\n\t.widget_recent_comments li,\n\t.widget_recent_entries li {\n\t\tpadding: 0.4688em 0;\n\t}\n\n\t.widget_categories .children,\n\t.widget_nav_menu .sub-menu,\n\t.widget_pages .children {\n\t\tmargin: 0.4688em 0 0 1em;\n\t\tpadding-top: 0.4688em;\n\t}\n\n\t.widget_rss .rss-date,\n\t.widget_rss cite {\n\t\tfont-size: 13px;\n\t\tfont-size: 1.3rem;\n\t\tline-height: 1.8462;\n\t}\n\n\t.post-thumbnail {\n\t\tmargin-bottom: 2.9474em;\n\t}\n\n\t.entry-title,\n\t.widecolumn h2 {\n\t\tfont-size: 39px;\n\t\tfont-size: 3.9rem;\n\t\tline-height: 1.2308;\n\t\tmargin-bottom: 1.2308em;\n\t}\n\n\t.entry-content h1,\n\t.entry-summary h1,\n\t.page-content h1,\n\t.comment-content h1 {\n\t\tfont-size: 39px;\n\t\tfont-size: 3.9rem;\n\t\tline-height: 1.2308;\n\t\tmargin-top: 1.641em;\n\t\tmargin-bottom: 0.8205em;\n\t}\n\n\t.entry-content h2,\n\t.entry-summary h2,\n\t.page-content h2,\n\t.comment-content h2 {\n\t\tfont-size: 32px;\n\t\tfont-size: 3.2rem;\n\t\tline-height: 1.25;\n\t\tmargin-top: 2em;\n\t\tmargin-bottom: 1em;\n\t}\n\n\t.entry-content h3,\n\t.entry-summary h3,\n\t.page-content h3,\n\t.comment-content h3 {\n\t\tfont-size: 27px;\n\t\tfont-size: 2.7rem;\n\t\tline-height: 1.1852;\n\t\tmargin-top: 2.3704em;\n\t\tmargin-bottom: 1.1852em;\n\t}\n\n\t.entry-content h4,\n\t.entry-summary h4,\n\t.page-content h4,\n\t.comment-content h4 {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.4545;\n\t\tmargin-top: 2.9091em;\n\t\tmargin-bottom: 1.4545em;\n\t}\n\n\t.entry-content h5,\n\t.entry-content h6,\n\t.entry-summary h5,\n\t.entry-summary h6,\n\t.page-content h5,\n\t.page-content h6,\n\t.comment-content h5,\n\t.comment-content h6 {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tline-height: 1.2632;\n\t\tmargin-top: 3.3684em;\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.entry-content .more-link:after,\n\t.entry-summary .more-link:after {\n\t\ttop: 3px;\n\t}\n\n\t.author-info .avatar {\n\t\theight: 56px;\n\t\tmargin: 0 1.6842em 1.6842em 0;\n\t\twidth: 56px;\n\t}\n\n\t.author-link:after {\n\t\tfont-size: 24px;\n\t\ttop: 0;\n\t}\n\n\t.posted-on:before,\n\t.byline:before,\n\t.cat-links:before,\n\t.tags-links:before,\n\t.comments-link:before,\n\t.entry-format:before,\n\t.edit-link:before,\n\t.full-size-link:before {\n\t\ttop: 4px;\n\t}\n\n\t.taxonomy-description {\n\t\tpadding-top: 0.4211em;\n\t}\n\n\t.page-title,\n\t.comments-title,\n\t.comment-reply-title,\n\t.post-navigation .post-title {\n\t\tfont-size: 27px;\n\t\tfont-size: 2.7rem;\n\t\tline-height: 1.1852;\n\t}\n\n\t.page-links {\n\t\tmargin-bottom: 1.4736em;\n\t}\n\n\t.page-links a,\n\t.page-links > span {\n\t\tmargin: 0 0.25em 0.25em 0;\n\t}\n\n\t.entry-attachment {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.format-aside .entry-title,\n\t.format-image .entry-title,\n\t.format-video .entry-title,\n\t.format-quote .entry-title,\n\t.format-gallery .entry-title,\n\t.format-status .entry-title,\n\t.format-link .entry-title,\n\t.format-audio .entry-title,\n\t.format-chat .entry-title {\n\t\tfont-size: 22px;\n\t\tfont-size: 2.2rem;\n\t\tline-height: 1.4545;\n\t\tmargin-bottom: 1.4545em;\n\t}\n\n\t.format-link .entry-title a:after {\n\t\ttop: 3px;\n\t}\n\n\t.comments-title {\n\t\tmargin-bottom: 1.4545em;\n\t}\n\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback {\n\t\tpadding: 1.6842em 0;\n\t}\n\n\t.comment-list + .comment-respond,\n\t.comment-navigation + .comment-respond {\n\t\tpadding-top: 1.6842em;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-left: 1.4737em;\n\t}\n\n\t.comment-author .avatar {\n\t\theight: 56px;\n\t\tmargin-right: 1.6842em;\n\t\ttop: 3px;\n\t\twidth: 56px;\n\t}\n\n\t.bypostauthor > article .fn:after {\n\t\ttop: 8px;\n\t}\n\n\t.comment-metadata .edit-link:before {\n\t\ttop: 8px;\n\t}\n\n\t.pingback .edit-link:before {\n\t\ttop: 8px;\n\t}\n\n\t.comment-content ul,\n\t.comment-content ol {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.comment-list .reply a {\n\t\tpadding: 0.4375em 0.875em;\n\t}\n\n\t.comment-form,\n\t.no-comments {\n\t\tpadding-top: 1.6842em;\n\t}\n\n\tembed,\n\tiframe,\n\tobject,\n\tvideo {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.wp-audio-shortcode,\n\t.wp-video,\n\t.wp-playlist.wp-audio-playlist {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.wp-caption,\n\t.gallery {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.widecolumn .mu_alert {\n\t\tmargin-bottom: 1.6842em;\n\t}\n\n\t.widecolumn p {\n\t\tmargin: 1.6842em 0;\n\t}\n\n\t.widecolumn p + h2 {\n\t\tmargin-top: 1.641em;\n\t}\n\n\t.widecolumn #key,\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #blogname,\n\t.widecolumn .mu_register #user_name {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.9rem;\n\t}\n\n\t.widecolumn .mu_register #blog_title,\n\t.widecolumn .mu_register #user_email,\n\t.widecolumn .mu_register #user_name {\n\t\tmargin: 0 0 0.421em;\n\t}\n}\n\n\n/**\n * 16.7 Desktop X-Large 1403px\n */\n\n@media screen and (min-width: 87.6875em) {\n\tbody:before {\n\t\twidth: -webkit-calc(50% - 289px);\n\t\twidth: calc(50% - 289px);\n\t}\n}\n\n\n/**\n * 17.0 Print\n */\n\n@media print {\n\tbody {\n\t\tbackground: none !important; /* Brute force since user agents all print differently. */\n\t\tfont-size: 11.25pt;\n\t}\n\n\t.secondary-toggle,\n\t.navigation,\n\t.page-links,\n\t.edit-link,\n\t#reply-title,\n\t.comment-form,\n\t.comment-edit-link,\n\t.comment-list .reply a,\n\tbutton,\n\tinput,\n\ttextarea,\n\tselect,\n\t.widecolumn form,\n\t.widecolumn .mu_register form {\n\t\tdisplay: none;\n\t}\n\n\t.site-header,\n\t.site-footer,\n\t.hentry,\n\t.entry-footer,\n\t.page-header,\n\t.page-content,\n\t.comments-area,\n\t.widecolumn {\n\t\tbackground: none !important; /* Make sure color schemes dont't affect to print */\n\t}\n\n\tbody,\n\tblockquote,\n\tblockquote cite,\n\tblockquote small,\n\tlabel,\n\ta,\n\t.site-title a,\n\t.site-description,\n\t.post-title,\n\t.author-heading,\n\t.entry-footer,\n\t.entry-footer a,\n\t.taxonomy-description,\n\t.entry-caption,\n\t.comment-author,\n\t.comment-metadata,\n\t.comment-metadata a,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.no-comments,\n\t.site-info,\n\t.site-info a,\n\t.wp-caption-text,\n\t.gallery-caption {\n\t\tcolor: #000 !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\tpre,\n\tabbr[title],\n\ttable,\n\tth,\n\ttd,\n\t.site-header,\n\t.site-footer,\n\t.hentry + .hentry,\n\t.author-info,\n\t.page-header,\n\t.comments-area,\n\t.comment-list + .comment-respond,\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback,\n\t.no-comments {\n\t\tborder-color: #eaeaea !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\t.site {\n\t\tmargin: 0 7.6923%;\n\t}\n\n\t.sidebar {\n\t\tposition: relative !important; /* Make sure sticky sidebar doesn't affect to print */\n\t}\n\n\t.site-branding {\n\t\tpadding: 0;\n\t}\n\n\t.site-header {\n\t\tpadding: 7.6923% 0;\n\t}\n\n\t.site-description {\n\t\tdisplay: block;\n\t}\n\n\t.hentry + .hentry {\n\t\tmargin-top: 7.6923%;\n\t}\n\n\t.hentry.has-post-thumbnail {\n\t\tpadding-top: 7.6923%;\n\t}\n\n\t.sticky-post {\n\t\tbackground: #000 !important;\n\t\tcolor: #fff !important;\n\t}\n\n\t.entry-header,\n\t.entry-footer {\n\t\tpadding: 0;\n\t}\n\n\t.entry-content,\n\t.entry-summary {\n\t\tpadding: 0 0 7.6923%;\n\t}\n\n\t.post-thumbnail img {\n\t\tmargin: 0;\n\t}\n\n\t.author-info {\n\t\tmargin: 0;\n\t}\n\n\t.page-content {\n\t\tpadding: 7.6923% 0 0;\n\t}\n\n\t.page-header {\n\t\tpadding: 3.84615% 0;\n\t}\n\n\t.comments-area {\n\t\tborder: 0;\n\t\tpadding: 7.6923% 0 0;\n\t}\n\n\t.site-footer {\n\t\tmargin-top: 7.6923%;\n\t\tpadding: 3.84615% 0;\n\t}\n\n\t.widecolumn {\n\t\tmargin: 7.6923% 0 0;\n\t\tpadding: 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/404.php",
    "content": "<?php\n/**\n * The template for displaying 404 pages (Not Found)\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t\t<header class=\"page-header\">\n\t\t\t\t<h1 class=\"page-title\"><?php _e( 'Not Found', 'twentyfourteen' ); ?></h1>\n\t\t\t</header>\n\n\t\t\t<div class=\"page-content\">\n\t\t\t\t<p><?php _e( 'It looks like nothing was found at this location. Maybe try a search?', 'twentyfourteen' ); ?></p>\n\n\t\t\t\t<?php get_search_form(); ?>\n\t\t\t</div><!-- .page-content -->\n\n\t\t</div><!-- #content -->\n\t</div><!-- #primary -->\n\n<?php\nget_sidebar( 'content' );\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/archive.php",
    "content": "<?php\n/**\n * The template for displaying Archive pages\n *\n * Used to display archive-type pages if nothing more specific matches a query.\n * For example, puts together date-based pages if no date.php file exists.\n *\n * If you'd like to further customize these archive views, you may create a\n * new template file for each specific one. For example, Twenty Fourteen\n * already has tag.php for Tag archives, category.php for Category archives,\n * and author.php for Author archives.\n *\n * @link https://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"page-header\">\n\t\t\t\t<h1 class=\"page-title\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\tif ( is_day() ) :\n\t\t\t\t\t\t\tprintf( __( 'Daily Archives: %s', 'twentyfourteen' ), get_the_date() );\n\n\t\t\t\t\t\telseif ( is_month() ) :\n\t\t\t\t\t\t\tprintf( __( 'Monthly Archives: %s', 'twentyfourteen' ), get_the_date( _x( 'F Y', 'monthly archives date format', 'twentyfourteen' ) ) );\n\n\t\t\t\t\t\telseif ( is_year() ) :\n\t\t\t\t\t\t\tprintf( __( 'Yearly Archives: %s', 'twentyfourteen' ), get_the_date( _x( 'Y', 'yearly archives date format', 'twentyfourteen' ) ) );\n\n\t\t\t\t\t\telse :\n\t\t\t\t\t\t\t_e( 'Archives', 'twentyfourteen' );\n\n\t\t\t\t\t\tendif;\n\t\t\t\t\t?>\n\t\t\t\t</h1>\n\t\t\t</header><!-- .page-header -->\n\n\t\t\t<?php\n\t\t\t\t\t// Start the Loop.\n\t\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t\t\tendwhile;\n\t\t\t\t\t// Previous/next page navigation.\n\t\t\t\t\ttwentyfourteen_paging_nav();\n\n\t\t\t\telse :\n\t\t\t\t\t// If no content, include the \"No posts found\" template.\n\t\t\t\t\tget_template_part( 'content', 'none' );\n\n\t\t\t\tendif;\n\t\t\t?>\n\t\t</div><!-- #content -->\n\t</section><!-- #primary -->\n\n<?php\nget_sidebar( 'content' );\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/author.php",
    "content": "<?php\n/**\n * The template for displaying Author archive pages\n *\n * @link https://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"archive-header\">\n\t\t\t\t<h1 class=\"archive-title\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Queue the first post, that way we know what author\n\t\t\t\t\t\t * we're dealing with (if that is the case).\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * We reset this later so we can run the loop properly\n\t\t\t\t\t\t * with a call to rewind_posts().\n\t\t\t\t\t\t */\n\t\t\t\t\t\tthe_post();\n\n\t\t\t\t\t\tprintf( __( 'All posts by %s', 'twentyfourteen' ), get_the_author() );\n\t\t\t\t\t?>\n\t\t\t\t</h1>\n\t\t\t\t<?php if ( get_the_author_meta( 'description' ) ) : ?>\n\t\t\t\t<div class=\"author-description\"><?php the_author_meta( 'description' ); ?></div>\n\t\t\t\t<?php endif; ?>\n\t\t\t</header><!-- .archive-header -->\n\n\t\t\t<?php\n\t\t\t\t\t/*\n\t\t\t\t\t * Since we called the_post() above, we need to rewind\n\t\t\t\t\t * the loop back to the beginning that way we can run\n\t\t\t\t\t * the loop properly, in full.\n\t\t\t\t\t */\n\t\t\t\t\trewind_posts();\n\n\t\t\t\t\t// Start the Loop.\n\t\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t\t\tendwhile;\n\t\t\t\t\t// Previous/next page navigation.\n\t\t\t\t\ttwentyfourteen_paging_nav();\n\n\t\t\t\telse :\n\t\t\t\t\t// If no content, include the \"No posts found\" template.\n\t\t\t\t\tget_template_part( 'content', 'none' );\n\n\t\t\t\tendif;\n\t\t\t?>\n\n\t\t</div><!-- #content -->\n\t</section><!-- #primary -->\n\n<?php\nget_sidebar( 'content' );\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/category.php",
    "content": "<?php\n/**\n * The template for displaying Category pages\n *\n * @link https://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"archive-header\">\n\t\t\t\t<h1 class=\"archive-title\"><?php printf( __( 'Category Archives: %s', 'twentyfourteen' ), single_cat_title( '', false ) ); ?></h1>\n\n\t\t\t\t<?php\n\t\t\t\t\t// Show an optional term description.\n\t\t\t\t\t$term_description = term_description();\n\t\t\t\t\tif ( ! empty( $term_description ) ) :\n\t\t\t\t\t\tprintf( '<div class=\"taxonomy-description\">%s</div>', $term_description );\n\t\t\t\t\tendif;\n\t\t\t\t?>\n\t\t\t</header><!-- .archive-header -->\n\n\t\t\t<?php\n\t\t\t\t\t// Start the Loop.\n\t\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t\t\t */\n\t\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t\t\tendwhile;\n\t\t\t\t\t// Previous/next page navigation.\n\t\t\t\t\ttwentyfourteen_paging_nav();\n\n\t\t\t\telse :\n\t\t\t\t\t// If no content, include the \"No posts found\" template.\n\t\t\t\t\tget_template_part( 'content', 'none' );\n\n\t\t\t\tendif;\n\t\t\t?>\n\t\t</div><!-- #content -->\n\t</section><!-- #primary -->\n\n<?php\nget_sidebar( 'content' );\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/comments.php",
    "content": "<?php\n/**\n * The template for displaying Comments\n *\n * The area of the page that contains comments and the comment form.\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\n/*\n * If the current post is protected by a password and the visitor has not yet\n * entered the password we will return early without loading the comments.\n */\nif ( post_password_required() ) {\n\treturn;\n}\n?>\n\n<div id=\"comments\" class=\"comments-area\">\n\n\t<?php if ( have_comments() ) : ?>\n\n\t<h2 class=\"comments-title\">\n\t\t<?php\n\t\t\tprintf( _n( 'One thought on &ldquo;%2$s&rdquo;', '%1$s thoughts on &ldquo;%2$s&rdquo;', get_comments_number(), 'twentyfourteen' ),\n\t\t\t\tnumber_format_i18n( get_comments_number() ), get_the_title() );\n\t\t?>\n\t</h2>\n\n\t<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : ?>\n\t<nav id=\"comment-nav-above\" class=\"navigation comment-navigation\" role=\"navigation\">\n\t\t<h1 class=\"screen-reader-text\"><?php _e( 'Comment navigation', 'twentyfourteen' ); ?></h1>\n\t\t<div class=\"nav-previous\"><?php previous_comments_link( __( '&larr; Older Comments', 'twentyfourteen' ) ); ?></div>\n\t\t<div class=\"nav-next\"><?php next_comments_link( __( 'Newer Comments &rarr;', 'twentyfourteen' ) ); ?></div>\n\t</nav><!-- #comment-nav-above -->\n\t<?php endif; // Check for comment navigation. ?>\n\n\t<ol class=\"comment-list\">\n\t\t<?php\n\t\t\twp_list_comments( array(\n\t\t\t\t'style'       => 'ol',\n\t\t\t\t'short_ping'  => true,\n\t\t\t\t'avatar_size' => 34,\n\t\t\t) );\n\t\t?>\n\t</ol><!-- .comment-list -->\n\n\t<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : ?>\n\t<nav id=\"comment-nav-below\" class=\"navigation comment-navigation\" role=\"navigation\">\n\t\t<h1 class=\"screen-reader-text\"><?php _e( 'Comment navigation', 'twentyfourteen' ); ?></h1>\n\t\t<div class=\"nav-previous\"><?php previous_comments_link( __( '&larr; Older Comments', 'twentyfourteen' ) ); ?></div>\n\t\t<div class=\"nav-next\"><?php next_comments_link( __( 'Newer Comments &rarr;', 'twentyfourteen' ) ); ?></div>\n\t</nav><!-- #comment-nav-below -->\n\t<?php endif; // Check for comment navigation. ?>\n\n\t<?php if ( ! comments_open() ) : ?>\n\t<p class=\"no-comments\"><?php _e( 'Comments are closed.', 'twentyfourteen' ); ?></p>\n\t<?php endif; ?>\n\n\t<?php endif; // have_comments() ?>\n\n\t<?php comment_form(); ?>\n\n</div><!-- #comments -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-aside.php",
    "content": "<?php\n/**\n * The template for displaying posts in the Aside post format\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfourteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div><!-- .entry-meta -->\n\t\t<?php\n\t\t\tendif;\n\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\tendif;\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"post-format\">\n\t\t\t\t<a class=\"entry-format\" href=\"<?php echo esc_url( get_post_format_link( 'aside' ) ); ?>\"><?php echo get_post_format_string( 'aside' ); ?></a>\n\t\t\t</span>\n\n\t\t\t<?php twentyfourteen_posted_on(); ?>\n\n\t\t\t<?php if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) : ?>\n\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t</div><!-- .entry-meta -->\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php the_tags( '<footer class=\"entry-meta\"><span class=\"tag-links\">', '', '</span></footer>' ); ?>\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-audio.php",
    "content": "<?php\n/**\n * The template for displaying posts in the Audio post format\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfourteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div><!-- .entry-meta -->\n\t\t<?php\n\t\t\tendif;\n\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\tendif;\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"post-format\">\n\t\t\t\t<a class=\"entry-format\" href=\"<?php echo esc_url( get_post_format_link( 'audio' ) ); ?>\"><?php echo get_post_format_string( 'audio' ); ?></a>\n\t\t\t</span>\n\n\t\t\t<?php twentyfourteen_posted_on(); ?>\n\n\t\t\t<?php if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) : ?>\n\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t</div><!-- .entry-meta -->\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php the_tags( '<footer class=\"entry-meta\"><span class=\"tag-links\">', '', '</span></footer>' ); ?>\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-featured-post.php",
    "content": "<?php\n/**\n * The template for displaying featured posts on the front page\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<a class=\"post-thumbnail\" href=\"<?php the_permalink(); ?>\">\n\t<?php\n\t\t// Output the featured image.\n\t\tif ( has_post_thumbnail() ) :\n\t\t\tif ( 'grid' == get_theme_mod( 'featured_content_layout' ) ) {\n\t\t\t\tthe_post_thumbnail();\n\t\t\t} else {\n\t\t\t\tthe_post_thumbnail( 'twentyfourteen-full-width' );\n\t\t\t}\n\t\tendif;\n\t?>\n\t</a>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div><!-- .entry-meta -->\n\t\t<?php endif; ?>\n\n\t\t<?php the_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">','</a></h1>' ); ?>\n\t</header><!-- .entry-header -->\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-gallery.php",
    "content": "<?php\n/**\n * The template for displaying posts in the Gallery post format\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfourteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div><!-- .entry-meta -->\n\t\t<?php\n\t\t\tendif;\n\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\tendif;\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"post-format\">\n\t\t\t\t<a class=\"entry-format\" href=\"<?php echo esc_url( get_post_format_link( 'gallery' ) ); ?>\"><?php echo get_post_format_string( 'gallery' ); ?></a>\n\t\t\t</span>\n\n\t\t\t<?php twentyfourteen_posted_on(); ?>\n\n\t\t\t<?php if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) : ?>\n\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t</div><!-- .entry-meta -->\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php the_tags( '<footer class=\"entry-meta\"><span class=\"tag-links\">', '', '</span></footer>' ); ?>\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-image.php",
    "content": "<?php\n/**\n * The template for displaying posts in the Image post format\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfourteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div><!-- .entry-meta -->\n\t\t<?php\n\t\t\tendif;\n\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\tendif;\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"post-format\">\n\t\t\t\t<a class=\"entry-format\" href=\"<?php echo esc_url( get_post_format_link( 'image' ) ); ?>\"><?php echo get_post_format_string( 'image' ); ?></a>\n\t\t\t</span>\n\n\t\t\t<?php twentyfourteen_posted_on(); ?>\n\n\t\t\t<?php if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) : ?>\n\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t</div><!-- .entry-meta -->\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php the_tags( '<footer class=\"entry-meta\"><span class=\"tag-links\">', '', '</span></footer>' ); ?>\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-link.php",
    "content": "<?php\n/**\n * The template for displaying posts in the Link post format\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfourteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div><!-- .entry-meta -->\n\t\t<?php\n\t\t\tendif;\n\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\tendif;\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"post-format\">\n\t\t\t\t<a class=\"entry-format\" href=\"<?php echo esc_url( get_post_format_link( 'link' ) ); ?>\"><?php echo get_post_format_string( 'link' ); ?></a>\n\t\t\t</span>\n\n\t\t\t<?php twentyfourteen_posted_on(); ?>\n\n\t\t\t<?php if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) : ?>\n\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t</div><!-- .entry-meta -->\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php the_tags( '<footer class=\"entry-meta\"><span class=\"tag-links\">', '', '</span></footer>' ); ?>\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-none.php",
    "content": "<?php\n/**\n * The template for displaying a \"No posts found\" message\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<header class=\"page-header\">\n\t<h1 class=\"page-title\"><?php _e( 'Nothing Found', 'twentyfourteen' ); ?></h1>\n</header>\n\n<div class=\"page-content\">\n\t<?php if ( is_home() && current_user_can( 'publish_posts' ) ) : ?>\n\n\t<p><?php printf( __( 'Ready to publish your first post? <a href=\"%1$s\">Get started here</a>.', 'twentyfourteen' ), admin_url( 'post-new.php' ) ); ?></p>\n\n\t<?php elseif ( is_search() ) : ?>\n\n\t<p><?php _e( 'Sorry, but nothing matched your search terms. Please try again with some different keywords.', 'twentyfourteen' ); ?></p>\n\t<?php get_search_form(); ?>\n\n\t<?php else : ?>\n\n\t<p><?php _e( 'It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps searching can help.', 'twentyfourteen' ); ?></p>\n\t<?php get_search_form(); ?>\n\n\t<?php endif; ?>\n</div><!-- .page-content -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-page.php",
    "content": "<?php\n/**\n * The template used for displaying page content\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php\n\t\t// Page thumbnail and title.\n\t\ttwentyfourteen_post_thumbnail();\n\t\tthe_title( '<header class=\"entry-header\"><h1 class=\"entry-title\">', '</h1></header><!-- .entry-header -->' );\n\t?>\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\tthe_content();\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\n\t\t\tedit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' );\n\t\t?>\n\t</div><!-- .entry-content -->\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-quote.php",
    "content": "<?php\n/**\n * The template for displaying posts in the Quote post format\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfourteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div><!-- .entry-meta -->\n\t\t<?php\n\t\t\tendif;\n\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\tendif;\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"post-format\">\n\t\t\t\t<a class=\"entry-format\" href=\"<?php echo esc_url( get_post_format_link( 'quote' ) ); ?>\"><?php echo get_post_format_string( 'quote' ); ?></a>\n\t\t\t</span>\n\n\t\t\t<?php twentyfourteen_posted_on(); ?>\n\n\t\t\t<?php if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) : ?>\n\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t</div><!-- .entry-meta -->\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php the_tags( '<footer class=\"entry-meta\"><span class=\"tag-links\">', '', '</span></footer>' ); ?>\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content-video.php",
    "content": "<?php\n/**\n * The template for displaying posts in the Video post format\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfourteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div><!-- .entry-meta -->\n\t\t<?php\n\t\t\tendif;\n\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\tendif;\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"post-format\">\n\t\t\t\t<a class=\"entry-format\" href=\"<?php echo esc_url( get_post_format_link( 'video' ) ); ?>\"><?php echo get_post_format_string( 'video' ); ?></a>\n\t\t\t</span>\n\n\t\t\t<?php twentyfourteen_posted_on(); ?>\n\n\t\t\t<?php if ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) : ?>\n\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t</div><!-- .entry-meta -->\n\t</header><!-- .entry-header -->\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php the_tags( '<footer class=\"entry-meta\"><span class=\"tag-links\">', '', '</span></footer>' ); ?>\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/content.php",
    "content": "<?php\n/**\n * The default template for displaying content\n *\n * Used for both single and index/archive/search.\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<?php twentyfourteen_post_thumbnail(); ?>\n\n\t<header class=\"entry-header\">\n\t\t<?php if ( in_array( 'category', get_object_taxonomies( get_post_type() ) ) && twentyfourteen_categorized_blog() ) : ?>\n\t\t<div class=\"entry-meta\">\n\t\t\t<span class=\"cat-links\"><?php echo get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfourteen' ) ); ?></span>\n\t\t</div>\n\t\t<?php\n\t\t\tendif;\n\n\t\t\tif ( is_single() ) :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\">', '</h1>' );\n\t\t\telse :\n\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\tendif;\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<?php\n\t\t\t\tif ( 'post' == get_post_type() )\n\t\t\t\t\ttwentyfourteen_posted_on();\n\n\t\t\t\tif ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) :\n\t\t\t?>\n\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t<?php\n\t\t\t\tendif;\n\n\t\t\t\tedit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' );\n\t\t\t?>\n\t\t</div><!-- .entry-meta -->\n\t</header><!-- .entry-header -->\n\n\t<?php if ( is_search() ) : ?>\n\t<div class=\"entry-summary\">\n\t\t<?php the_excerpt(); ?>\n\t</div><!-- .entry-summary -->\n\t<?php else : ?>\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ),\n\t\t\t\tthe_title( '<span class=\"screen-reader-text\">', '</span>', false )\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\t<?php endif; ?>\n\n\t<?php the_tags( '<footer class=\"entry-meta\"><span class=\"tag-links\">', '', '</span></footer>' ); ?>\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/css/editor-style.css",
    "content": "/*\nTheme Name: Twenty Fourteen\nDescription: Used to style the TinyMCE editor.\n*/\n\n\n/**\n * Table of Contents:\n *\n * 1.0 - Body\n * 2.0 - Headings\n * 3.0 - Text Elements\n * 4.0 - Links\n * 5.0 - Alignment\n * 6.0 - Tables\n * 7.0 - Images\n * 8.0 - Galleries\n * 9.0 - Audio/Video\n * 10.0 - RTL\n * ----------------------------------------------------------------------------\n */\n\n\n/**\n * 1.0 Body\n * ----------------------------------------------------------------------------\n */\n\nhtml .mceContentBody {\n\tfont-size: 100%;\n\tmax-width: 474px;\n}\n\nbody {\n\tcolor: #2b2b2b;\n\tfont-family: Lato, sans-serif;\n\tfont-weight: 400;\n\tline-height: 1.5;\n\tvertical-align: baseline;\n}\n\n\n/**\n * 2.0 Headings\n * ----------------------------------------------------------------------------\n */\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tclear: both;\n\tfont-weight: 700;\n\tmargin: 36px 0 12px;\n}\n\nh1 {\n\tfont-size: 26px;\n\tline-height: 1.3846153846;\n}\n\nh2 {\n\tfont-size: 24px;\n\tline-height: 1;\n}\n\nh3 {\n\tfont-size: 22px;\n\tline-height: 1.0909090909;\n}\n\nh4 {\n\tfont-size: 20px;\n\tline-height: 1.2;\n}\n\nh5 {\n\tfont-size: 18px;\n\tline-height: 1.3333333333;\n}\n\nh6 {\n\tfont-size: 16px;\n\tline-height: 1.5;\n}\n\nh1:first-child,\nh2:first-child,\nh3:first-child,\nh4:first-child,\nh5:first-child,\nh6:first-child {\n\tmargin-top: 0;\n}\n\n\n/**\n * 3.0 Text Elements\n * ----------------------------------------------------------------------------\n */\n\naddress {\n\tfont-style: italic;\n\tmargin-bottom: 24px;\n}\n\nabbr[title] {\n\tborder-bottom: 1px dotted #2b2b2b;\n\tcursor: help;\n}\n\nb,\nstrong {\n\tfont-weight: 700;\n}\n\ncite {\n\tborder: 0;\n}\n\ncite,\ndfn,\nem,\ni {\n\tfont-style: italic;\n}\n\nmark,\nins {\n\tbackground: #fff9c0;\n\tborder: 0;\n\tcolor: inherit;\n\ttext-decoration: none;\n}\n\np {\n\tmargin: 0 0 24px;\n}\n\ncode,\nkbd,\ntt,\nvar,\nsamp,\npre {\n\tfont-family: monospace, serif;\n\tfont-size: 15px;\n\tline-height: 1.6;\n}\n\npre {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tmargin-bottom: 24px;\n\tmax-width: 100%;\n\toverflow: auto;\n\tpadding: 12px;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\nblockquote,\nq {\n\tquotes: none;\n}\n\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n\tcontent: \"\";\n\tcontent: none;\n}\n\nblockquote {\n\tcolor: #767676;\n\tfont-size: 19px;\n\tfont-style: italic;\n\tfont-weight: 300;\n\tline-height: 1.2631578947;\n\tmargin: 0 0 24px;\n}\n\nblockquote cite,\nblockquote small {\n\tcolor: #2b2b2b;\n\tfont-size: 16px;\n\tfont-weight: 400;\n\tline-height: 1.5;\n}\n\nblockquote em,\nblockquote i,\nblockquote cite {\n\tfont-style: normal;\n}\n\nblockquote strong,\nblockquote b {\n\tfont-weight: 400;\n}\n\nsmall {\n\tfont-size: smaller;\n}\n\nbig {\n\tfont-size: 125%;\n}\n\nsup,\nsub {\n\tfont-size: 75%;\n\theight: 0;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsup {\n\tbottom: 1ex;\n}\n\nsub {\n\ttop: .5ex;\n}\n\ndl {\n\tmargin: 0 0 24px;\n}\n\ndt {\n\tfont-weight: bold;\n}\n\ndd {\n\tmargin: 0 0 24px;\n}\n\nul,\nol {\n\tlist-style: none;\n\tmargin: 0 0 24px 20px;\n\tpadding-left: 0;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin: 0 0 0 20px;\n}\n\ndel {\n\tcolor: #767676;\n}\n\nhr {\n\tbackground-color: rgba(0, 0, 0, 0.1);\n\tborder: 0;\n\theight: 1px;\n\tmargin-bottom: 23px;\n}\n\n\n/**\n * 4.0 Links\n * ----------------------------------------------------------------------------\n */\n\na {\n\tcolor: #24890d;\n\ttext-decoration: none;\n}\n\na:visited {\n\tcolor: #24890d;\n}\n\na:focus {\n\toutline: thin dotted;\n}\n\na:active,\na:hover {\n\tcolor: #41a62a;\n\toutline: 0;\n}\n\n\n/**\n * 5.0 Alignment\n * ----------------------------------------------------------------------------\n */\n\n.alignleft {\n\tfloat: left;\n\tmargin: 7px 24px 7px 0;\n}\n\n.alignright {\n\tfloat: right;\n\tmargin: 7px 0 7px 24px;\n}\n\n.aligncenter {\n\tclear: both;\n\tdisplay: block;\n\tmargin: 7px auto;\n}\n\nblockquote.alignleft,\nblockquote.alignright {\n\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\tpadding-top: 17px;\n\twidth: 50%;\n}\n\nblockquote.alignleft p,\nblockquote.alignright p {\n\tmargin-bottom: 17px;\n}\n\n\n/**\n * 6.0 Tables\n * ----------------------------------------------------------------------------\n */\n\n.mceItemTable,\n.mce-item-table {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tborder-width: 1px 0 0 1px;\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n\tfont-size: 14px;\n\tline-height: 1.2857142857;\n\tmargin-bottom: 24px;\n\twidth: 100%;\n}\n\n.mceItemTable th,\n.mceItemTable caption,\n.mce-item-table th,\n.mce-item-table caption {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tborder-width: 0 1px 1px 0;\n\tfont-weight: 700;\n\tpadding: 8px;\n\ttext-align: left;\n\ttext-transform: uppercase;\n\tvertical-align: baseline;\n}\n\n.mceItemTable td,\n.mce-item-table td {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tborder-width: 0 1px 1px 0;\n\tfont-family: Lato, sans-serif;\n\tfont-size: 14px;\n\tpadding: 8px;\n\tvertical-align: baseline;\n}\n\n\n/**\n * 7.0 Images\n * ----------------------------------------------------------------------------\n */\n\nimg {\n\theight: auto;\n\tmax-width: 100%;\n\tvertical-align: middle;\n}\n\n.wp-caption {\n\tbackground: transparent;\n\tborder: none;\n\tcolor: #767676;\n\tmargin: 0 0 24px 0;\n\tmax-width: 100%;\n\tpadding: 0;\n\ttext-align: left;\n}\n\n.html5-captions .wp-caption {\n\tpadding: 0;\n}\n\n.wp-caption.alignleft {\n\tmargin: 7px 14px 7px 0;\n}\n\n.html5-captions .wp-caption.alignleft {\n\tmargin-right: 24px;\n}\n\n.wp-caption.alignright {\n\tmargin: 7px 0 7px 14px;\n}\n\n.wp-caption.alignright img,\n.wp-caption.alignright .wp-caption-dd {\n\tpadding-left: 10px;\n}\n\n.html5-captions .wp-caption.alignright {\n\tmargin-left: 24px;\n}\n\n.html5-captions .wp-caption.alignright img,\n.html5-captions .wp-caption.alignright .wp-caption-dd {\n\tpadding: 0;\n}\n\n.wp-caption.aligncenter {\n\tmargin: 7px auto;\n}\n\n.wp-caption-dt {\n\tmargin: 0;\n}\n\n.wp-caption .wp-caption-text,\n.wp-caption-dd {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tfont-size: 12px;\n\tfont-style: italic;\n\tline-height: 1.5;\n\tmargin: 9px 0;\n\tpadding: 0 10px 0 0; /* Avoid the caption to overflow the width of the image because wp-caption has 10px wider width */\n\ttext-align: left;\n}\n\n.mceTemp + ul,\n.mceTemp + ol {\n\tlist-style-position: inside;\n}\n\n/**\n * 8.0 Gallery\n * -----------------------------------------------------------------------------\n */\n\n.gallery .gallery-item {\n\tfloat: left;\n\tmargin: 0 4px 4px 0;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: relative;\n}\n\n.gallery-columns-1 .gallery-item {\n\tmax-width: 100%;\n\twidth: auto;\n}\n\n.gallery-columns-2 .gallery-item {\n\tmax-width: 48%;\n\tmax-width: -webkit-calc(50% - 14px);\n\tmax-width:         calc(50% - 14px);\n\twidth: auto;\n}\n\n.gallery-columns-3 .gallery-item {\n\tmax-width: 32%;\n\tmax-width: -webkit-calc(33.3% - 11px);\n\tmax-width:         calc(33.3% - 11px);\n\twidth: auto;\n}\n\n.gallery-columns-4 .gallery-item {\n\tmax-width: 23%;\n\tmax-width: -webkit-calc(25% - 9px);\n\tmax-width:         calc(25% - 9px);\n\twidth: auto;\n}\n\n.gallery-columns-5 .gallery-item {\n\tmax-width: 19%;\n\tmax-width: -webkit-calc(20% - 8px);\n\tmax-width:         calc(20% - 8px);\n\twidth: auto;\n}\n\n.gallery-columns-6 .gallery-item {\n\tmax-width: 15%;\n\tmax-width: -webkit-calc(16.7% - 7px);\n\tmax-width:         calc(16.7% - 7px);\n\twidth: auto;\n}\n\n.gallery-columns-7 .gallery-item {\n\tmax-width: 13%;\n\tmax-width: -webkit-calc(14.28% - 7px);\n\tmax-width:         calc(14.28% - 7px);\n\twidth: auto;\n}\n\n.gallery-columns-8 .gallery-item {\n\tmax-width: 11%;\n\tmax-width: -webkit-calc(12.5% - 6px);\n\tmax-width:         calc(12.5% - 6px);\n\twidth: auto;\n}\n\n.gallery-columns-9 .gallery-item {\n\tmax-width: 9%;\n\tmax-width: -webkit-calc(11.1% - 6px);\n\tmax-width:         calc(11.1% - 6px);\n\twidth: auto;\n}\n\n.gallery-columns-1 .gallery-item:nth-of-type(1n),\n.gallery-columns-2 .gallery-item:nth-of-type(2n),\n.gallery-columns-3 .gallery-item:nth-of-type(3n),\n.gallery-columns-4 .gallery-item:nth-of-type(4n),\n.gallery-columns-5 .gallery-item:nth-of-type(5n),\n.gallery-columns-6 .gallery-item:nth-of-type(6n),\n.gallery-columns-7 .gallery-item:nth-of-type(7n),\n.gallery-columns-8 .gallery-item:nth-of-type(8n),\n.gallery-columns-9 .gallery-item:nth-of-type(9n) {\n\tmargin-right: 0;\n}\n\n.gallery-columns-1 .gallery-item:nth-of-type(1n),\n.gallery-columns-2 .gallery-item:nth-of-type(2n - 1),\n.gallery-columns-3 .gallery-item:nth-of-type(3n - 2),\n.gallery-columns-4 .gallery-item:nth-of-type(4n - 3),\n.gallery-columns-5 .gallery-item:nth-of-type(5n - 4),\n.gallery-columns-6 .gallery-item:nth-of-type(6n - 5),\n.gallery-columns-7 .gallery-item:nth-of-type(7n - 6),\n.gallery-columns-8 .gallery-item:nth-of-type(8n - 7),\n.gallery-columns-9 .gallery-item:nth-of-type(9n - 8) {\n\tmargin-left: 12px; /* Compensate for the default negative margin on .gallery, which can't be changed. */\n}\n\n.gallery .gallery-caption {\n\tbackground-color: rgba(0, 0, 0, 0.7);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tcolor: #fff;\n\tfont-size: 12px;\n\tline-height: 1.5;\n\tmargin: 0;\n\tmax-height: 50%;\n\topacity: 0;\n\tpadding: 6px 8px;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\ttext-align: left;\n\twidth: 100%;\n}\n\n.gallery .gallery-caption:before {\n\tcontent: \"\";\n\theight: 100%;\n\tmin-height: 49px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n\n.gallery-item:hover .gallery-caption {\n\topacity: 1;\n}\n\n.gallery-columns-7 .gallery-caption,\n.gallery-columns-8 .gallery-caption,\n.gallery-columns-9 .gallery-caption {\n\tdisplay: none;\n}\n\n\n/**\n * 9.0 Audio/Video\n * ----------------------------------------------------------------------------\n */\n\n.mejs-mediaelement,\n.mejs-container .mejs-controls {\n\tbackground: #000;\n}\n\n.mejs-controls .mejs-time-rail .mejs-time-loaded,\n.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {\n\tbackground: #fff;\n}\n\n.mejs-controls .mejs-time-rail .mejs-time-current {\n\tbackground: #24890d;\n}\n\n.mejs-controls .mejs-time-rail .mejs-time-total,\n.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total {\n\tbackground: rgba(255, 255, 255, .33);\n}\n\n.mejs-controls .mejs-time-rail span,\n.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total,\n.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {\n\tborder-radius: 0;\n}\n\n.mejs-overlay-loading {\n\tbackground: transparent;\n}\n\n.mejs-overlay-button {\n\tbackground-color: #fff;\n\tbackground-image: none;\n\tborder-radius: 2px;\n\tbox-shadow: 1px 1px 1px rgba(0,0,0,.8);\n\tcolor: #000;\n\theight: 36px;\n\tmargin-left: -24px;\n\twidth: 48px;\n}\n\n.mejs-overlay-button:before {\n\t-webkit-font-smoothing: antialiased;\n\tcontent: '\\f452';\n\tdisplay: inline-block;\n\tfont: normal 32px/1.125 Genericons;\n\tposition: absolute;\n\ttop: 1px;\n\tleft: 10px;\n}\n\n.mejs-controls .mejs-button button:focus {\n\toutline: none;\n}\n\n.mejs-controls .mejs-button button {\n\t-webkit-font-smoothing: antialiased;\n\tbackground: none;\n\tcolor: #fff;\n\tdisplay: inline-block;\n\tfont: normal 16px/1 Genericons;\n}\n\n.mejs-playpause-button.mejs-play button:before {\n\tcontent: '\\f452';\n}\n\n.mejs-playpause-button.mejs-pause button:before {\n\tcontent: '\\f448';\n}\n\n.mejs-volume-button.mejs-mute button:before {\n\tcontent: '\\f109';\n\tfont-size: 20px;\n\tposition: absolute;\n\ttop: -2px;\n\tleft: 0;\n}\n\n.mejs-volume-button.mejs-unmute button:before {\n\tcontent: '\\f109';\n\tleft: 0;\n\tposition: absolute;\n\ttop: 0;\n}\n\n.mejs-fullscreen-button button:before {\n\tcontent: '\\f474';\n}\n\n.mejs-fullscreen-button.mejs-unfullscreen button:before {\n\tcontent: '\\f406';\n}\n\n.mejs-overlay:hover .mejs-overlay-button {\n\tbackground-color: #24890d;\n\tcolor: #fff;\n}\n\n.mejs-controls .mejs-button button:hover {\n\tcolor: #41a62a;\n}\n\n\n/**\n * 10.0 RTL\n * ----------------------------------------------------------------------------\n */\n\nhtml .mceContentBody.rtl {\n\tdirection: rtl;\n\tunicode-bidi: embed;\n}\n\n.rtl ol,\n.rtl ul {\n\tmargin-left: 0;\n\tmargin-right: 24px;\n}\n\n.rtl .wp-caption,\n.rtl tr th {\n\ttext-align: right;\n}\n\n.rtl td {\n\ttext-align: right;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/css/ie.css",
    "content": "/**\n * Global Styles for older IE versions (previous to IE9).\n */\n\npre,\nfieldset,\ntable,\nth,\ntd,\ninput,\ntextarea {\n\tborder: 1px solid #e5e5e5;\n}\n\nhr {\n\tbackground-color: #e5e5e5;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n\tvertical-align: middle;\n}\n\n\ninput:focus,\ntextarea:focus {\n\tborder: 1px solid #b2b2b2;\n}\n\n.site-title {\n\tmax-width: 71%;\n}\n\n.site-content blockquote.alignleft,\n.site-content blockquote.alignright {\n\tborder-top: 1px solid #e5e5e5;\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n.post-thumbnail,\na.post-thumbnail:hover {\n\tbackground: transparent;\n}\n\n.list-view .site-content .hentry {\n\tborder-top: 1px solid #e5e5e5;\n\tpadding-top: 48px;\n}\n\n.gallery-caption {\n\tbackground: #000;\n\tfilter: alpha(opacity=0);\n}\n\n.gallery-item:hover .gallery-caption {\n\tfilter: alpha(opacity=70);\n}\n\n.nav-links {\n\tborder-top: 1px solid #e5e5e5;\n}\n\n.post-navigation a,\n.image-navigation .previous-image,\n.image-navigation .next-image,\n.contributor {\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n.contributor-avatar,\n.comment-author .avatar {\n\tborder: 1px solid #e5e5e5;\n}\n\n.comment-list article,\n.comment-list .pingback,\n.comment-list .trackback {\n\tborder-top: 1px solid #e5e5e5;\n}\n\n.comment-list .reply {\n\tmargin-top: 0;\n}\n\n#secondary {\n\tcolor: #b3b3b3;\n}\n\n.widget abbr[title] {\n\tborder-color: #b3b3b3;\n}\n\n.widget pre,\n.widget fieldset,\n.widget table,\n.widget th,\n.widget td,\n.widget input,\n.widget textarea {\n\tborder-color: #4d4d4d;\n}\n\n.widget blockquote,\n.widget .wp-caption,\n.widget_twentyfourteen_ephemera .entry-meta a {\n\tcolor: #b3b3b3;\n}\n\n.widget del {\n\tcolor: #666;\n}\n\n.widget hr {\n\tbackground-color: #4d4d4d;\n}\n\n.widget input,\n.widget textarea {\n\tbackground-color: #1a1a1a;\n}\n\n.widget input:focus,\n.widget textarea:focus {\n\tborder-color: #262626;\n}\n\n.widget_calendar thead th {\n\tbackground-color: #1a1a1a;\n}\n\n.widget_twentyfourteen_ephemera > ol > li {\n\tborder-bottom: 1px solid #4d4d4d;\n}\n\n.widget_archive li,\n.widget_categories li,\n.widget_links li,\n.widget_meta li,\n.widget_nav_menu li,\n.widget_pages li,\n.widget_recent_comments li,\n.widget_recent_entries li,\n.widget_categories li ul,\n.widget_nav_menu li ul,\n.widget_pages li ul {\n\tborder-top: 1px solid #4d4d4d;\n}\n\n.content-sidebar .widget pre,\n.content-sidebar .widget fieldset,\n.content-sidebar .widget table,\n.content-sidebar .widget th,\n.content-sidebar .widget td,\n.content-sidebar .widget input,\n.content-sidebar .widget textarea,\n.content-sidebar .widget_archive li,\n.content-sidebar .widget_categories li,\n.content-sidebar .widget_links li,\n.content-sidebar .widget_meta li,\n.content-sidebar .widget_nav_menu li,\n.content-sidebar .widget_pages li,\n.content-sidebar .widget_recent_comments li,\n.content-sidebar .widget_recent_entries li,\n.content-sidebar .widget_categories li ul,\n.content-sidebar .widget_nav_menu li ul,\n.content-sidebar .widget_pages li ul {\n\tborder-color: #e5e5e5;\n}\n\n.content-sidebar .widget hr {\n\tbackground-color: #e5e5e5;\n}\n\n.content-sidebar .widget input:focus,\n.content-sidebar .widget textarea:focus {\n\tborder: 1px solid #b2b2b2;\n}\n\n.content-sidebar .widget_calendar thead th {\n\tbackground-color: #fafafa;\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera > ol > li {\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n.site-footer,\n.site-info,\n.site-info a {\n\tcolor: #b3b3b3;\n}\n\n#supplementary + .site-info {\n\tborder-top: 1px solid #4d4d4d;\n}\n\n.featured-content {\n\tbackground: #000;\n}\n\n\n/**\n * Internet Explorer 8\n */\n\n.ie8 img.size-full,\n.ie8 img.size-large,\n.ie8 img.header-image,\n.ie8 img.wp-post-image,\n.ie8 img[class*=\"align\"],\n.ie8 img[class*=\"wp-image-\"],\n.ie8 img[class*=\"attachment-\"] {\n\theight: auto;\n\twidth: auto; /* Prevent stretching of full-size and large-size images with height and width attributes in IE8 */\n}\n\n.ie8 .full-size-link:before,\n.ie8 .parent-post-link:before,\n.ie8 .site-content span + .byline:before,\n.ie8 .site-content span + .comments-link:before,\n.ie8 .site-content span + .edit-link:before,\n.ie8 .site-content span + .entry-date:before {\n\tcontent: \"\";\n}\n\n.ie8 .attachment span.entry-date:before,\n.ie8 .entry-content .edit-link a:before,\n.ie8 .entry-meta .edit-link a:before,\n.ie8 .site-content .byline a:before,\n.ie8 .site-content .comments-link a:before,\n.ie8 .site-content .entry-date a:before,\n.ie8 .site-content .featured-post:before,\n.ie8 .site-content .full-size-link a:before,\n.ie8 .site-content .parent-post-link a:before,\n.ie8 .site-content .post-format a:before {\n\tdisplay: inline-block;\n\tfont: normal 16px/1 Genericons;\n\ttext-decoration: inherit;\n\tvertical-align: text-bottom;\n}\n\n.ie8 .site-content .entry-meta > span {\n\tmargin-right: 10px;\n}\n\n.ie8 .site-content .format-video .post-format a:before {\n\tcontent: \"\\f104\";\n}\n\n.ie8 .site-content .format-audio .post-format a:before {\n\tcontent: \"\\f109\";\n}\n\n.ie8 .site-content .format-image .post-format a:before {\n\tcontent: \"\\f473\";\n\tposition: relative;\n\ttop: 1px;\n}\n\n.ie8 .site-content .format-quote .post-format a:before {\n\tcontent: \"\\f106\";\n\tmargin-right: 2px;\n}\n\n.ie8 .site-content .format-gallery .post-format a:before {\n\tcontent: \"\\f103\";\n\tmargin-right: 4px;\n}\n\n.ie8 .site-content .format-aside .post-format a:before {\n\tcontent: \"\\f101\";\n\tmargin-right: 2px;\n}\n\n.ie8 .site-content .format-link .post-format a:before {\n\tcontent: \"\\f107\";\n\tposition: relative;\n\ttop: 1px;\n}\n\n.ie8 .site-content .featured-post:before {\n\tcontent: \"\\f308\";\n\tmargin-right: 3px;\n\tposition: relative;\n\ttop: 1px;\n}\n\n.ie8 .site-content .entry-date a:before,\n.ie8 .attachment .site-content span.entry-date:before {\n\tcontent: \"\\f303\";\n\tmargin-right: 1px;\n\tposition: relative;\n\ttop: 1px;\n}\n\n.ie8 .site-content .byline a:before {\n\tcontent: \"\\f304\";\n}\n\n.ie8 .site-content .comments-link a:before {\n\tcontent: \"\\f300\";\n\tmargin-right: 2px;\n}\n\n.ie8 .entry-content .edit-link a:before,\n.ie8 .entry-meta .edit-link a:before {\n\tcontent: \"\\f411\";\n}\n\n.ie8 .site-content .full-size-link a:before {\n\tcontent: \"\\f402\";\n\tmargin-right: 1px;\n}\n\n.ie8 .site-content .parent-post-link a:before {\n\tcontent: \"\\f301\";\n}\n\n.ie8 .main-content {\n\tfloat: left;\n}\n\n.ie8 .content-area {\n\tfloat: left;\n\tpadding-top: 72px;\n\twidth: 100%;\n}\n\n.ie8 .site-content {\n\tmargin-right: 29.04761904%;\n\tmargin-left: 17.61904761%;\n}\n\n.ie8 .search-box-wrapper,\n.ie8 .featured-content {\n\tpadding-left: 17.61904761%;\n}\n\n.ie8 .header-main {\n\tpadding: 0 0 0 30px;\n}\n\n.ie8 .search-toggle {\n\tmargin-right: 0;\n}\n\n.ie8 .search-box .search-field {\n\twidth: 324px;\n}\n\n.ie8 .site-navigation li .current_page_item > a,\n.ie8 .site-navigation li .current_page_ancestor > a,\n.ie8 .site-navigation li .current-menu-item > a,\n.ie8 .site-navigation li .current-menu-ancestor > a {\n\tbackground-color: #000;\n}\n\n.ie8 .primary-navigation {\n\tfloat: right;\n\tfont-size: 11px;\n\tmargin: 0 1px 0 -10px;\n\tpadding: 0;\n\ttext-transform: uppercase;\n}\n\n.ie8 .primary-navigation .menu-toggle {\n\tdisplay: none;\n\tpadding: 0;\n}\n\n.ie8 .primary-navigation .nav-menu {\n\tborder-bottom: 0;\n\tdisplay: block;\n}\n\n.ie8 .primary-navigation.toggled-on {\n\tborder-bottom: 0;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.ie8 .primary-navigation li {\n\tborder: 0;\n\tdisplay: inline-block;\n\theight: 48px;\n\tline-height: 48px;\n\tposition: relative;\n}\n\n.ie8 .primary-navigation a {\n\tdisplay: inline-block;\n\tpadding: 0 10px;\n\twhite-space: nowrap;\n}\n\n.ie8 .primary-navigation ul ul {\n\tbackground-color: #24890d;\n\tfloat: left;\n\tmargin: 0;\n\tposition: absolute;\n\ttop: 48px;\n\tleft: -999em;\n\tz-index: 99999;\n}\n\n.ie8 .primary-navigation li li {\n\tborder: 0;\n\tdisplay: block;\n\theight: auto;\n\tline-height: 1.0909090909;\n}\n\n.ie8 .primary-navigation ul ul ul {\n\tleft: -999em;\n\ttop: 0;\n}\n\n.ie8 .primary-navigation ul ul a {\n\tpadding: 18px 12px;\n\twhite-space: normal;\n\twidth: 176px;\n}\n\n.ie8 .primary-navigation li:hover > a,\n.ie8 .primary-navigation li.focus > a {\n\tbackground-color: #24890d;\n\tcolor: #fff;\n}\n\n.ie8 .primary-navigation ul ul a:hover,\n.ie8 .primary-navigation ul ul li.focus > a {\n\tbackground-color: #41a62a;\n}\n\n.ie8 .primary-navigation ul li:hover > ul,\n.ie8 .primary-navigation ul li.focus > ul {\n\tleft: auto;\n}\n\n.ie8 .primary-navigation ul ul li:hover > ul,\n.ie8 .primary-navigation ul ul li.focus > ul {\n\tleft: 100%;\n}\n\n.ie8 .archive-header,\n.ie8 .page-header {\n\tmargin: 0 auto 60px;\n\tpadding: 0 10px;\n}\n\n.ie8 .site-content .has-post-thumbnail .entry-header {\n\tmargin-top: -48px;\n}\n\n.ie8 .archive-header,\n.ie8 .comments-area,\n.ie8 .image-navigation,\n.ie8 .page-header,\n.ie8 .page-content,\n.ie8 .post-navigation,\n.ie8 .site-content .entry-header,\n.ie8 .site-content .entry-content,\n.ie8 .site-content .entry-summary,\n.ie8 .site-content footer.entry-meta {\n\tmargin-right: 54px;\n\tpadding-right: 30px;\n\tpadding-left: 30px;\n}\n\n.ie8 .list-view .site-content .hentry:first-child,\n.ie8 .list-view .site-content .hentry.has-post-thumbnail {\n\tborder-top: 0;\n\tpadding-top: 0;\n}\n\n.ie8 .comment-list .trackback,\n.ie8 .comment-list .pingback,\n.ie8 .comment-list article {\n\tmargin-bottom: 36px;\n\tpadding-top: 36px;\n}\n\n.ie8 .comment-author .avatar {\n\theight: 34px;\n\ttop: 2px;\n\twidth: 34px;\n}\n\n.ie8 .comment-author,\n.ie8 .comment-awaiting-moderation,\n.ie8 .comment-content,\n.ie8 .comment-list .reply,\n.ie8 .comment-metadata {\n\tpadding-left: 50px;\n}\n\n.ie8 .comment-list .children {\n\tmargin-left: 20px;\n}\n\n.ie8 .full-width .site-content {\n\tmargin-right: 0;\n}\n\n.ie8 .full-width .archive-header,\n.ie8 .full-width .comments-area,\n.ie8 .full-width .image-navigation,\n.ie8 .full-width .page-header,\n.ie8 .full-width .page-content,\n.ie8 .full-width .post-navigation,\n.ie8 .full-width .site-content .entry-header,\n.ie8 .full-width .site-content .entry-content,\n.ie8 .full-width .site-content .entry-summary,\n.ie8 .full-width .site-content footer.entry-meta {\n\tpadding-right: 30px;\n\tpadding-left: 30px;\n\tmargin-right: auto;\n}\n\n.ie8 .full-width .hentry.has-post-thumbnail:first-child {\n\tmargin-top: -72px;\n}\n\n\n.ie8 .singular .site-content .hentry.has-post-thumbnail {\n\tmargin-top: 0;\n}\n\n.ie8 .error404 .page-header {\n\tmargin-bottom: 24px;\n}\n\n.ie8 .contributor-avatar {\n\tmargin-left: -168px;\n}\n\n.ie8 .contributor-summary {\n\tfloat: left;\n}\n\n.ie8 .site:before {\n\tbackground-color: #000;\n\tcontent: \"\";\n\tdisplay: block;\n\theight: 100%;\n\tmin-height: 100%;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 17.61904761%;\n\tz-index: 2;\n}\n\n.ie8 #secondary {\n\tborder: 0;\n\tclear: none;\n\tcolor: #b3b3b3;\n\tfloat: left;\n\tmargin: 0 0 0 -100%;\n\tmin-height: 100vh;\n\tpadding: 0 30px;\n\twidth: 12.85714285%;\n}\n\n.ie8 .site-description {\n\tdisplay: block;\n\tmargin: -3px 0 21px;\n}\n\n.ie8 .secondary-navigation {\n\tfont-size: 11px;\n\tmargin: 0 -30px 48px;\n\twidth: calc(100% + 60px);\n}\n\n.ie8 .secondary-navigation li {\n\tborder-top: 1px solid #4d4d4d;\n\tposition: relative;\n}\n\n.ie8 .secondary-navigation a {\n\tpadding: 10px 30px;\n}\n\n.ie8 .secondary-navigation ul ul {\n\tbackground-color: #24890d;\n\tposition: absolute;\n\ttop: 0;\n\tleft: -999em;\n\twidth: 222px;\n\tz-index: 99999;\n}\n\n.ie8 .secondary-navigation li li {\n\tborder-top: 0;\n}\n\n.ie8 .secondary-navigation li:hover > a,\n.ie8 .secondary-navigation li.focus > a {\n\tbackground-color: #24890d;\n\tcolor: #fff;\n}\n\n.ie8 .secondary-navigation ul ul a:hover,\n.ie8 .secondary-navigation ul ul li.focus > a {\n\tbackground-color: #41a62a;\n}\n\n.ie8 .secondary-navigation ul li:hover > ul,\n.ie8 .secondary-navigation ul li.focus > ul {\n\tleft: 202px;\n}\n\n.ie8 .content-sidebar {\n\tborder: 0;\n\tfloat: right;\n\tmargin-left: -29.04761904%;\n\tpadding: 72px 30px 24px;\n\twidth: 29.04761904%;\n}\n\n.ie8 #supplementary {\n\tpadding: 0;\n}\n\n.ie8 .footer-sidebar {\n\tfont-size: 12px;\n\tline-height: 1.5;\n}\n\n.ie8 .footer-sidebar .widget,\n.ie8 .primary-sidebar .widget {\n\tfont-size: 12px;\n\tline-height: 1.5;\n}\n\n.ie8 .footer-sidebar .widget {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tfloat: left;\n\tpadding: 0 30px;\n\twidth: 25%;\n}\n\n.ie8 .footer-sidebar .widget h1,\n.ie8 .primary-sidebar .widget h1 {\n\tfont-size: 20px;\n\tline-height: 1.2;\n}\n\n.ie8 .footer-sidebar .widget h2,\n.ie8 .primary-sidebar .widget h2 {\n\tfont-size: 18px;\n\tline-height: 1.3333333333;\n}\n\n.ie8 .footer-sidebar .widget h3,\n.ie8 .primary-sidebar .widget h3 {\n\tfont-size: 16px;\n\tline-height: 1.5;\n}\n\n.ie8 .footer-sidebar .widget h4,\n.ie8 .primary-sidebar .widget h4 {\n\tfont-size: 14px;\n\tline-height: 1.7142857142;\n}\n\n.ie8 .footer-sidebar .widget h5,\n.ie8 .primary-sidebar .widget h5 {\n\tfont-size: 12px;\n\tline-height: 2;\n}\n\n.ie8 .footer-sidebar .widget h6,\n.ie8 .primary-sidebar .widget h6 {\n\tfont-size: 11px;\n\tline-height: 2.1818181818;\n}\n\n.ie8 .footer-sidebar .widget code,\n.ie8 .footer-sidebar .widget kbd,\n.ie8 .footer-sidebar .widget tt,\n.ie8 .footer-sidebar .widget var,\n.ie8 .footer-sidebar .widget samp,\n.ie8 .footer-sidebar .widget pre,\n.ie8 .primary-sidebar .widget code,\n.ie8 .primary-sidebar .widget kbd,\n.ie8 .primary-sidebar .widget tt,\n.ie8 .primary-sidebar .widget var,\n.ie8 .primary-sidebar .widget samp,\n.ie8 .primary-sidebar .widget pre {\n\tfont-size: 11px;\n\tline-height: 1.6363636363;\n}\n\n.ie8 .footer-sidebar .widget blockquote,\n.ie8 .primary-sidebar .widget blockquote {\n\tfont-size: 14px;\n\tline-height: 1.2857142857;\n}\n\n.ie8 .footer-sidebar .widget blockquote cite,\n.ie8 .primary-sidebar .widget blockquote cite {\n\tfont-size: 12px;\n\tline-height: 1.5;\n}\n\n.ie8 .footer-sidebar .widget input,\n.ie8 .footer-sidebar .widget textarea,\n.ie8 .primary-sidebar .widget input,\n.ie8 .primary-sidebar .widget textarea {\n\tfont-size: 12px;\n\tpadding: 3px 2px 4px 4px;\n}\n\n.ie8 .footer-sidebar .widget input[type=\"button\"],\n.ie8 .footer-sidebar .widget input[type=\"reset\"],\n.ie8 .footer-sidebar .widget input[type=\"submit\"],\n.ie8 .primary-sidebar .widget input[type=\"button\"],\n.ie8 .primary-sidebar .widget input[type=\"reset\"],\n.ie8 .primary-sidebar .widget input[type=\"submit\"] {\n\tpadding: 5px 15px 4px;\n}\n\n.ie8 .footer-sidebar .widget .widget-title,\n.ie8 .primary-sidebar .widget .widget-title {\n\tfont-size: 11px;\n\tfont-weight: 700;\n\tline-height: 1.6363636363;\n\tmargin-bottom: 18px;\n}\n\n.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .entry-title,\n.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .entry-meta,\n.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .wp-caption-text,\n.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link,\n.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .entry-content table,\n.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .entry-title,\n.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .entry-meta,\n.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .wp-caption-text,\n.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link,\n.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .entry-content table {\n\tfont-size: 11px;\n\tline-height: 1.6363636363;\n}\n\n.ie8 .footer-sidebar .widget_archive li,\n.ie8 .footer-sidebar .widget_categories li,\n.ie8 .footer-sidebar .widget_links li,\n.ie8 .footer-sidebar .widget_meta li,\n.ie8 .footer-sidebar .widget_nav_menu li,\n.ie8 .footer-sidebar .widget_pages li,\n.ie8 .footer-sidebar .widget_recent_comments li,\n.ie8 .footer-sidebar .widget_recent_entries li,\n.ie8 .primary-sidebar .widget_archive li,\n.ie8 .primary-sidebar .widget_categories li,\n.ie8 .primary-sidebar .widget_links li,\n.ie8 .primary-sidebar .widget_meta li,\n.ie8 .primary-sidebar .widget_nav_menu li,\n.ie8 .primary-sidebar .widget_pages li,\n.ie8 .primary-sidebar .widget_recent_comments li,\n.ie8 .primary-sidebar .widget_recent_entries li {\n\tborder-top: 0;\n\tpadding: 0 0 6px;\n}\n\n.ie8 .footer-sidebar .widget_categories li ul,\n.ie8 .footer-sidebar .widget_nav_menu li ul,\n.ie8 .footer-sidebar .widget_pages li ul,\n.ie8 .primary-sidebar .widget_categories li ul,\n.ie8 .primary-sidebar .widget_nav_menu li ul,\n.ie8 .primary-sidebar .widget_pages li ul {\n\tborder-top: 0;\n\tmargin-top: 0;\n}\n\n.ie8 .grid .featured-content .entry-header {\n\tborder-color: #000;\n\tborder-style: solid;\n\tborder-width: 12px 10px;\n\theight: 96px;\n\tpadding: 0;\n}\n\n.ie8 .featured-content {\n\tpadding-left: 17.61904761%;\n}\n\n.ie8 .grid .featured-content .hentry {\n\tfloat: left;\n\twidth: 33.3333333%;\n}\n\n.ie8 .grid .featured-content .hentry:nth-child( 3n+1 ) {\n\tclear: both;\n}\n\n.ie8 .grid .featured-content .entry-header {\n\theight: 120px;\n}\n\n.ie8 .slider .featured-content .entry-title {\n\tfont-size: 33px;\n\tline-height: 1.0909090909;\n}\n\n.ie8 .slider .featured-content .entry-header {\n\tmin-height: inherit;\n\tpadding: 24px 30px 48px;\n\tposition: absolute;\n\tleft: 0;\n\tbottom: 0;\n\twidth: 50%;\n\tz-index: 3;\n}\n\n.ie8 .slider-control-paging {\n\tbackground: transparent;\n\tmargin-top: -48px;\n\tpadding-left: 24px;\n\twidth: 50%;\n}\n\n.ie8 .slider-control-paging li {\n\tmargin: 12px 12px 12px 0;\n}\n\n.ie8 .slider-control-paging a {\n\theight: 24px;\n\twidth: 24px;\n}\n\n.ie8 .slider-control-paging a:before {\n\ttop: 6px;\n\tleft: 6px;\n}\n\n.ie8 .slider-direction-nav {\n\tclear: none;\n\tfloat: right;\n\tmargin-top: -48px;\n\twidth: 98px;\n}\n\n.ie8 .slider-direction-nav li:first-child {\n\tpadding: 0 1px 0 0;\n}\n\n.ie8 .slider-direction-nav li {\n\tborder: 0;\n\tpadding: 0 0 0 1px;\n}\n\n.ie8 .slider-direction-nav a {\n\theight: 48px;\n}\n\n.ie8 .slider-direction-nav a:before {\n\tline-height: 48px;\n}\n\n\n/**\n * Internet Explorer 7\n */\n\n.ie7 audio,\n.ie7 canvas,\n.ie7 video {\n\tdisplay: inline;\n\tzoom: 1;\n}\n\n.ie7 button,\n.ie7 input,\n.ie7 select,\n.ie7 textarea {\n\tvertical-align: middle;\n}\n\n.ie7 button,\n.ie7 input[type=\"button\"],\n.ie7 input[type=\"reset\"],\n.ie7 input[type=\"submit\"] {\n\toverflow: visible;\n}\n\n.ie7 .screen-reader-text {\n\tclip: rect(1px 1px 1px 1px);\n}\n\n.ie7 .site,\n.ie7 .site-header {\n\tmax-width: 100%;\n}\n\n.ie7 .search-toggle {\n\tline-height: 45px;\n\tmargin-right: 190px;\n\tpadding: 0 20px;\n\ttext-transform: uppercase;\n\twidth: auto;\n}\n\n.ie7 .search-toggle .screen-reader-text {\n\tcolor: #fff;\n\tposition: relative; /* Override inherited `absolute` value set in style.css. */\n}\n\n.ie7 .search-box {\n\theight: 24px;\n\tpadding: 12px 0;\n}\n\n.ie7 .search-box .search-field {\n\tmargin: 0 10px;\n\twidth: 33%;\n}\n\n.ie7 .site-navigation li {\n\tborder-top: 1px solid #4d4d4d;\n}\n\n.ie7 .primary-navigation .nav-menu,\n.ie7 .secondary-navigation {\n\tborder-bottom: 1px solid #4d4d4d;\n}\n\n.ie7 .secondary-navigation {\n\tmargin: 48px auto;\n\tmax-width: 474px\n}\n\n.ie7 .content-area {\n\tpadding-top: 48px;\n}\n\n.ie7 .hentry {\n\tmax-width: 100%;\n}\n\n.ie7 .menu-toggle {\n\tcolor: #fff;\n\tfont-weight: 400;\n\tfont-size: 16px;\n\tline-height: 45px;\n\ttext-transform: uppercase;\n\twidth: 200px;\n}\n\n.ie7 .post-thumbnail img {\n\tdisplay: block;\n\tmargin: 0 auto;\n}\n\n.ie7 .entry-meta .tag-links a {\n\tmargin-left: 0;\n}\n\n.ie7 .content-sidebar {\n\tpadding: 48px 10px;\n}\n\n.ie7 .singular .hentry.has-post-thumbnail {\n\tmargin-top: -48px;\n}\n\n.ie7 .entry-meta > span,\n.ie7 .widget_twentyfourteen_ephemera .entry-title {\n\tmargin-right: 20px;\n}\n\n.ie7 #secondary {\n\tborder-bottom: 1px solid #4d4d4d;\n}\n\n.ie7 .content-sidebar {\n\tborder-top: 1px solid #e5e5e5;\n\tborder-bottom: 1px solid #e5e5e5;\n}\n\n.ie7 .widget {\n\tmargin: 0 auto 48px;\n\tmax-width: 474px;\n}\n\n.ie7 .content-sidebar .widget_twentyfourteen_ephemera .widget-title {\n\tpadding-top: 7px;\n}\n\n.ie7 .slider .featured-content .hentry {\n\tdisplay: block;\n}\n\n.ie7 .featured-content .entry-header {\n\tmin-height: 0;\n}\n\n.ie7 .slider-control-paging a {\n\tline-height: 40px;\n\ttext-indent: 0;\n}\n\n.ie7 .slider-control-paging .slider-active {\n\tcolor: #41a62a;\n}\n\n.ie7 .slider-direction-nav {\n\tborder-top: 2px solid #fff;\n}\n\n.ie7 .slider-direction-nav li {\n\tborder: 0;\n\twidth: 49%;\n}\n\n.ie7 .slider-direction-nav a {\n\tfont-size: 16px;\n\tline-height: 45px;\n\ttext-transform: uppercase;\n}\n\n.ie7 .slider-direction-nav a:hover {\n\tbackground-color: #000;\n\tcolor: #41a62a;\n}\n\n.ie7 .search-toggle {\n\tline-height: 45px;\n\tmargin-right: 190px;\n}\n\n.ie7 .featured-content .post-thumbnail,\n.ie7 .slider .featured-content .post-thumbnail {\n\tpadding-top: 0;\n}\n\n.ie7 .featured-content .post-thumbnail img {\n\tposition: relative;\n}\n\n.ie7 .featured-content .entry-header {\n\twidth: auto;\n}\n\n.ie7 .grid .featured-content .hentry {\n\tfloat: left;\n\tmargin: 0 auto;\n\tmax-width: 672px;\n\twidth: 33.333333%;\n}\n\n.ie7 .slider .featured-content .entry-header {\n\tmargin: 0 auto;\n\tmax-width: 1038px;\n}\n\n.ie7 .slider-control-paging {\n\tfloat: none;\n\tmargin: -24px auto 0;\n\tmax-width: 1038px;\n\twidth: auto;\n}\n\n\n/**\n * RTL for Internet Explorer 8 & 7\n */\n\n.rtl .attachment a,\n.rtl .gallery a,\n.rtl .wp-caption a,\n.rtl .widget_twentyfourteen_ephemera .entry-content a {\n\tdisplay: inline;\n}\n\n\n/**\n * RTL overrides for Internet Explorer 8\n */\n\n.ie8 .rtl .site-content .entry-meta > span {\n\tmargin-right: auto;\n\tmargin-left: 10px;\n}\n\n.ie8 .rtl .site-content .format-quote .post-format a:before {\n\tmargin-right: auto;\n\tmargin-left: 2px;\n}\n\n.ie8 .rtl .site-content .format-gallery .post-format a:before {\n\tmargin-right: auto;\n\tmargin-left: 4px;\n}\n\n.ie8 .rtl .site-content .format-aside .post-format a:before {\n\tmargin-right: auto;\n\tmargin-left: 2px;\n}\n\n.ie8 .rtl .site-content .featured-post:before {\n\tmargin-right: auto;\n\tmargin-left: 3px;\n}\n\n.ie8 .rtl .site-content .entry-date a:before,\n.ie8 .rtl .attachment .site-content span.entry-date:before {\n\tmargin-right: auto;\n\tmargin-left: 1px;\n}\n\n.ie8 .rtl .site-content .comments-link a:before {\n\tmargin-right: auto;\n\tmargin-left: 2px;\n}\n\n.ie8 .rtl .site-content .full-size-link a:before {\n\tmargin-right: auto;\n\tmargin-left: 1px;\n}\n\n.ie8 .rtl .main-content {\n\tfloat: right;\n}\n\n.ie8 .rtl .content-area {\n\tfloat: right;\n}\n\n.ie8 .rtl .site-content {\n\tmargin-right: 17.61904761%;\n\tmargin-left: 29.04761904%;\n}\n\n.ie8 .rtl .search-box-wrapper,\n.ie8 .rtl .featured-content {\n\tpadding-right: 17.61904761%;\n\tpadding-left: 0;\n}\n\n.ie8 .rtl .header-main {\n\tpadding: 0 30px 0 0;\n}\n\n.ie8 .rtl .search-toggle {\n\tmargin-right: auto;\n\tmargin-left: 0;\n}\n\n.ie8 .rtl .primary-navigation {\n\tfloat: left;\n\tmargin: 0 -10px 0 1px;\n}\n\n.ie8 .rtl .primary-navigation ul ul {\n\tfloat: right;\n\tright: -999em;\n\tleft: auto;\n}\n\n.ie8 .rtl .primary-navigation ul ul ul {\n\tright: -999em;\n\tleft: auto;\n}\n\n.ie8 .rtl .primary-navigation ul li:hover > ul,\n.ie8 .rtl .primary-navigation ul li.focus > ul {\n\tright: auto;\n\tleft: auto;\n}\n\n.ie8 .rtl .primary-navigation ul ul li:hover > ul,\n.ie8 .rtl .primary-navigation ul ul li.focus > ul {\n\tright: 100%;\n\tleft: auto;\n}\n\n.ie8 .rtl .entry-meta .tag-links a:before {\n\tright: -8px;\n}\n\n.ie8 .rtl .archive-header,\n.ie8 .rtl .comments-area,\n.ie8 .rtl .image-navigation,\n.ie8 .rtl .page-header,\n.ie8 .rtl .page-content,\n.ie8 .rtl .post-navigation,\n.ie8 .rtl .site-content .entry-header,\n.ie8 .rtl .site-content .entry-content,\n.ie8 .rtl .site-content .entry-summary,\n.ie8 .rtl .site-content footer.entry-meta {\n\tmargin-right: auto;\n\tmargin-left: 54px;\n}\n\n.ie8 .rtl .comment-author,\n.ie8 .rtl .comment-awaiting-moderation,\n.ie8 .rtl .comment-content,\n.ie8 .rtl .comment-list .reply,\n.ie8 .rtl .comment-metadata {\n\tpadding-right: 50px;\n\tpadding-left: 0;\n}\n\n.ie8 .rtl .comment-list .children {\n\tmargin-right: 20px;\n\tmargin-left: auto;\n}\n\n\n.ie8 .rtl.full-width .site-content {\n\tmargin-left: 0;\n}\n\n.ie8 .rtl.full-width .archive-header,\n.ie8 .rtl.full-width .comments-area,\n.ie8 .rtl.full-width .image-navigation,\n.ie8 .rtl.full-width .page-header,\n.ie8 .rtl.full-width .page-content,\n.ie8 .rtl.full-width .post-navigation,\n.ie8 .rtl.full-width .site-content .entry-header,\n.ie8 .rtl.full-width .site-content .entry-content,\n.ie8 .rtl.full-width .site-content .entry-summary,\n.ie8 .rtl.full-width .site-content footer.entry-meta {\n\tmargin-left: auto;\n}\n\n.ie8 .rtl .contributor-avatar {\n\tmargin-right: -168px;\n\tmargin-left: auto;\n}\n\n.ie8 .rtl .contributor-summary {\n\tfloat: right;\n}\n\n.ie8 .rtl .site:before {\n\tright: 0;\n\tleft: auto;\n}\n\n.ie8 .rtl #secondary {\n\tfloat: right;\n\tmargin: 0 -100% 0 0;\n}\n\n.ie8 .rtl .secondary-navigation ul ul {\n\tright: -999em;\n\tleft: auto;\n}\n\n.ie8 .rtl .secondary-navigation ul li:hover > ul,\n.ie8 .rtl .secondary-navigation ul li.focus > ul {\n\tright: 202px;\n\tleft: auto;\n}\n\n.ie8 .rtl .content-sidebar {\n\tfloat: left;\n\tmargin-right: -29.04761904%;\n\tmargin-left: auto;\n}\n\n.ie8 .rtl .footer-sidebar .widget {\n\tfloat: right;\n}\n\n.ie8 .rtl .featured-content {\n\tpadding-right: 17.61904761%;\n\tpadding-left: 0;\n}\n\n.ie8 .rtl.grid .featured-content .hentry {\n\tfloat: right;\n}\n\n.ie8 .rtl.slider .featured-content .entry-header {\n\tright: 0;\n\tleft: auto;\n}\n\n.ie8 .rtl .slider-control-paging {\n\tpadding-right: 24px;\n\tpadding-left: 0;\n}\n\n.ie8 .rtl .slider-control-paging li {\n\tmargin: 12px 0 12px 12px;\n}\n\n.ie8 .rtl .slider-control-paging a:before {\n\tright: 6px;\n\tleft: auto;\n}\n\n.ie8 .rtl .slider-direction-nav {\n\tfloat: left;\n}\n\n.ie8 .rtl .slider-direction-nav li {\n\tpadding: 0 1px 0 0;\n}\n\n.ie8 .rtl .slider-direction-nav li:first-child {\n\tpadding: 0 0 0 1px;\n}\n\n\n/**\n * RTL overrides for Internet Explorer 7\n */\n\n.ie7 .rtl.grid .featured-content .hentry {\n\tfloat: right;\n}\n\n.ie7 .rtl .slider-control-paging {\n\tfloat: none;\n\tmargin: -24px auto 0;\n}\n\n.ie7 .rtl .entry-meta .tag-links a {\n\tmargin-right: 0;\n\tmargin-left: auto;\n}\n\n.ie7 .rtl .search-toggle {\n\tmargin-right: auto;\n\tmargin-left: 190px;\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/featured-content.php",
    "content": "<?php\n/**\n * The template for displaying featured content\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n<div id=\"featured-content\" class=\"featured-content\">\n\t<div class=\"featured-content-inner\">\n\t<?php\n\t\t/**\n\t\t * Fires before the Twenty Fourteen featured content.\n\t\t *\n\t\t * @since Twenty Fourteen 1.0\n\t\t */\n\t\tdo_action( 'twentyfourteen_featured_posts_before' );\n\n\t\t$featured_posts = twentyfourteen_get_featured_posts();\n\t\tforeach ( (array) $featured_posts as $order => $post ) :\n\t\t\tsetup_postdata( $post );\n\n\t\t\t// Include the featured content template.\n\t\t\tget_template_part( 'content', 'featured-post' );\n\t\tendforeach;\n\n\t\t/**\n\t\t * Fires after the Twenty Fourteen featured content.\n\t\t *\n\t\t * @since Twenty Fourteen 1.0\n\t\t */\n\t\tdo_action( 'twentyfourteen_featured_posts_after' );\n\n\t\twp_reset_postdata();\n\t?>\n\t</div><!-- .featured-content-inner -->\n</div><!-- #featured-content .featured-content -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/footer.php",
    "content": "<?php\n/**\n * The template for displaying the footer\n *\n * Contains footer content and the closing of the #main and #page div elements.\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n\n\t\t</div><!-- #main -->\n\n\t\t<footer id=\"colophon\" class=\"site-footer\" role=\"contentinfo\">\n\n\t\t\t<?php get_sidebar( 'footer' ); ?>\n\n\t\t\t<div class=\"site-info\">\n\t\t\t\t<?php do_action( 'twentyfourteen_credits' ); ?>\n\t\t\t\t<a href=\"<?php echo esc_url( __( 'https://wordpress.org/', 'twentyfourteen' ) ); ?>\"><?php printf( __( 'Proudly powered by %s', 'twentyfourteen' ), 'WordPress' ); ?></a>\n\t\t\t</div><!-- .site-info -->\n\t\t</footer><!-- #colophon -->\n\t</div><!-- #page -->\n\n\t<?php wp_footer(); ?>\n</body>\n</html>"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/functions.php",
    "content": "<?php\n/**\n * Twenty Fourteen functions and definitions\n *\n * Set up the theme and provides some helper functions, which are used in the\n * theme as custom template tags. Others are attached to action and filter\n * hooks in WordPress to change core functionality.\n *\n * When using a child theme you can override certain functions (those wrapped\n * in a function_exists() call) by defining them first in your child theme's\n * functions.php file. The child theme's functions.php file is included before\n * the parent theme's file, so the child theme functions would be used.\n *\n * @link https://codex.wordpress.org/Theme_Development\n * @link https://codex.wordpress.org/Child_Themes\n *\n * Functions that are not pluggable (not wrapped in function_exists()) are\n * instead attached to a filter or action hook.\n *\n * For more information on hooks, actions, and filters,\n * @link https://codex.wordpress.org/Plugin_API\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\n/**\n * Set up the content width value based on the theme's design.\n *\n * @see twentyfourteen_content_width()\n *\n * @since Twenty Fourteen 1.0\n */\nif ( ! isset( $content_width ) ) {\n\t$content_width = 474;\n}\n\n/**\n * Twenty Fourteen only works in WordPress 3.6 or later.\n */\nif ( version_compare( $GLOBALS['wp_version'], '3.6', '<' ) ) {\n\trequire get_template_directory() . '/inc/back-compat.php';\n}\n\nif ( ! function_exists( 'twentyfourteen_setup' ) ) :\n/**\n * Twenty Fourteen setup.\n *\n * Set up theme defaults and registers support for various WordPress features.\n *\n * Note that this function is hooked into the after_setup_theme hook, which\n * runs before the init hook. The init hook is too late for some features, such\n * as indicating support post thumbnails.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_setup() {\n\n\t/*\n\t * Make Twenty Fourteen available for translation.\n\t *\n\t * Translations can be added to the /languages/ directory.\n\t * If you're building a theme based on Twenty Fourteen, use a find and\n\t * replace to change 'twentyfourteen' to the name of your theme in all\n\t * template files.\n\t */\n\tload_theme_textdomain( 'twentyfourteen', get_template_directory() . '/languages' );\n\n\t// This theme styles the visual editor to resemble the theme style.\n\tadd_editor_style( array( 'css/editor-style.css', twentyfourteen_font_url(), 'genericons/genericons.css' ) );\n\n\t// Add RSS feed links to <head> for posts and comments.\n\tadd_theme_support( 'automatic-feed-links' );\n\n\t// Enable support for Post Thumbnails, and declare two sizes.\n\tadd_theme_support( 'post-thumbnails' );\n\tset_post_thumbnail_size( 672, 372, true );\n\tadd_image_size( 'twentyfourteen-full-width', 1038, 576, true );\n\n\t// This theme uses wp_nav_menu() in two locations.\n\tregister_nav_menus( array(\n\t\t'primary'   => __( 'Top primary menu', 'twentyfourteen' ),\n\t\t'secondary' => __( 'Secondary menu in left sidebar', 'twentyfourteen' ),\n\t) );\n\n\t/*\n\t * Switch default core markup for search form, comment form, and comments\n\t * to output valid HTML5.\n\t */\n\tadd_theme_support( 'html5', array(\n\t\t'search-form', 'comment-form', 'comment-list', 'gallery', 'caption'\n\t) );\n\n\t/*\n\t * Enable support for Post Formats.\n\t * See https://codex.wordpress.org/Post_Formats\n\t */\n\tadd_theme_support( 'post-formats', array(\n\t\t'aside', 'image', 'video', 'audio', 'quote', 'link', 'gallery',\n\t) );\n\n\t// This theme allows users to set a custom background.\n\tadd_theme_support( 'custom-background', apply_filters( 'twentyfourteen_custom_background_args', array(\n\t\t'default-color' => 'f5f5f5',\n\t) ) );\n\n\t// Add support for featured content.\n\tadd_theme_support( 'featured-content', array(\n\t\t'featured_content_filter' => 'twentyfourteen_get_featured_posts',\n\t\t'max_posts' => 6,\n\t) );\n\n\t// This theme uses its own gallery styles.\n\tadd_filter( 'use_default_gallery_style', '__return_false' );\n}\nendif; // twentyfourteen_setup\nadd_action( 'after_setup_theme', 'twentyfourteen_setup' );\n\n/**\n * Adjust content_width value for image attachment template.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_content_width() {\n\tif ( is_attachment() && wp_attachment_is_image() ) {\n\t\t$GLOBALS['content_width'] = 810;\n\t}\n}\nadd_action( 'template_redirect', 'twentyfourteen_content_width' );\n\n/**\n * Getter function for Featured Content Plugin.\n *\n * @since Twenty Fourteen 1.0\n *\n * @return array An array of WP_Post objects.\n */\nfunction twentyfourteen_get_featured_posts() {\n\t/**\n\t * Filter the featured posts to return in Twenty Fourteen.\n\t *\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array|bool $posts Array of featured posts, otherwise false.\n\t */\n\treturn apply_filters( 'twentyfourteen_get_featured_posts', array() );\n}\n\n/**\n * A helper conditional function that returns a boolean value.\n *\n * @since Twenty Fourteen 1.0\n *\n * @return bool Whether there are featured posts.\n */\nfunction twentyfourteen_has_featured_posts() {\n\treturn ! is_paged() && (bool) twentyfourteen_get_featured_posts();\n}\n\n/**\n * Register three Twenty Fourteen widget areas.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_widgets_init() {\n\trequire get_template_directory() . '/inc/widgets.php';\n\tregister_widget( 'Twenty_Fourteen_Ephemera_Widget' );\n\n\tregister_sidebar( array(\n\t\t'name'          => __( 'Primary Sidebar', 'twentyfourteen' ),\n\t\t'id'            => 'sidebar-1',\n\t\t'description'   => __( 'Main sidebar that appears on the left.', 'twentyfourteen' ),\n\t\t'before_widget' => '<aside id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget'  => '</aside>',\n\t\t'before_title'  => '<h1 class=\"widget-title\">',\n\t\t'after_title'   => '</h1>',\n\t) );\n\tregister_sidebar( array(\n\t\t'name'          => __( 'Content Sidebar', 'twentyfourteen' ),\n\t\t'id'            => 'sidebar-2',\n\t\t'description'   => __( 'Additional sidebar that appears on the right.', 'twentyfourteen' ),\n\t\t'before_widget' => '<aside id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget'  => '</aside>',\n\t\t'before_title'  => '<h1 class=\"widget-title\">',\n\t\t'after_title'   => '</h1>',\n\t) );\n\tregister_sidebar( array(\n\t\t'name'          => __( 'Footer Widget Area', 'twentyfourteen' ),\n\t\t'id'            => 'sidebar-3',\n\t\t'description'   => __( 'Appears in the footer section of the site.', 'twentyfourteen' ),\n\t\t'before_widget' => '<aside id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget'  => '</aside>',\n\t\t'before_title'  => '<h1 class=\"widget-title\">',\n\t\t'after_title'   => '</h1>',\n\t) );\n}\nadd_action( 'widgets_init', 'twentyfourteen_widgets_init' );\n\n/**\n * Register Lato Google font for Twenty Fourteen.\n *\n * @since Twenty Fourteen 1.0\n *\n * @return string\n */\nfunction twentyfourteen_font_url() {\n\t$font_url = '';\n\t/*\n\t * Translators: If there are characters in your language that are not supported\n\t * by Lato, translate this to 'off'. Do not translate into your own language.\n\t */\n\tif ( 'off' !== _x( 'on', 'Lato font: on or off', 'twentyfourteen' ) ) {\n\t\t$query_args = array(\n\t\t\t'family' => urlencode( 'Lato:300,400,700,900,300italic,400italic,700italic' ),\n\t\t\t'subset' => urlencode( 'latin,latin-ext' ),\n\t\t);\n\t\t$font_url = add_query_arg( $query_args, 'https://fonts.googleapis.com/css' );\n\t}\n\n\treturn $font_url;\n}\n\n/**\n * Enqueue scripts and styles for the front end.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_scripts() {\n\t// Add Lato font, used in the main stylesheet.\n\twp_enqueue_style( 'twentyfourteen-lato', twentyfourteen_font_url(), array(), null );\n\n\t// Add Genericons font, used in the main stylesheet.\n\twp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.0.3' );\n\n\t// Load our main stylesheet.\n\twp_enqueue_style( 'twentyfourteen-style', get_stylesheet_uri() );\n\n\t// Load the Internet Explorer specific stylesheet.\n\twp_enqueue_style( 'twentyfourteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfourteen-style' ), '20131205' );\n\twp_style_add_data( 'twentyfourteen-ie', 'conditional', 'lt IE 9' );\n\n\tif ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {\n\t\twp_enqueue_script( 'comment-reply' );\n\t}\n\n\tif ( is_singular() && wp_attachment_is_image() ) {\n\t\twp_enqueue_script( 'twentyfourteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20130402' );\n\t}\n\n\tif ( is_active_sidebar( 'sidebar-3' ) ) {\n\t\twp_enqueue_script( 'jquery-masonry' );\n\t}\n\n\tif ( is_front_page() && 'slider' == get_theme_mod( 'featured_content_layout' ) ) {\n\t\twp_enqueue_script( 'twentyfourteen-slider', get_template_directory_uri() . '/js/slider.js', array( 'jquery' ), '20131205', true );\n\t\twp_localize_script( 'twentyfourteen-slider', 'featuredSliderDefaults', array(\n\t\t\t'prevText' => __( 'Previous', 'twentyfourteen' ),\n\t\t\t'nextText' => __( 'Next', 'twentyfourteen' )\n\t\t) );\n\t}\n\n\twp_enqueue_script( 'twentyfourteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20150315', true );\n}\nadd_action( 'wp_enqueue_scripts', 'twentyfourteen_scripts' );\n\n/**\n * Enqueue Google fonts style to admin screen for custom header display.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_admin_fonts() {\n\twp_enqueue_style( 'twentyfourteen-lato', twentyfourteen_font_url(), array(), null );\n}\nadd_action( 'admin_print_scripts-appearance_page_custom-header', 'twentyfourteen_admin_fonts' );\n\nif ( ! function_exists( 'twentyfourteen_the_attached_image' ) ) :\n/**\n * Print the attached image with a link to the next attached image.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_the_attached_image() {\n\t$post                = get_post();\n\t/**\n\t * Filter the default Twenty Fourteen attachment size.\n\t *\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array $dimensions {\n\t *     An array of height and width dimensions.\n\t *\n\t *     @type int $height Height of the image in pixels. Default 810.\n\t *     @type int $width  Width of the image in pixels. Default 810.\n\t * }\n\t */\n\t$attachment_size     = apply_filters( 'twentyfourteen_attachment_size', array( 810, 810 ) );\n\t$next_attachment_url = wp_get_attachment_url();\n\n\t/*\n\t * Grab the IDs of all the image attachments in a gallery so we can get the URL\n\t * of the next adjacent image in a gallery, or the first image (if we're\n\t * looking at the last image in a gallery), or, in a gallery of one, just the\n\t * link to that image file.\n\t */\n\t$attachment_ids = get_posts( array(\n\t\t'post_parent'    => $post->post_parent,\n\t\t'fields'         => 'ids',\n\t\t'numberposts'    => -1,\n\t\t'post_status'    => 'inherit',\n\t\t'post_type'      => 'attachment',\n\t\t'post_mime_type' => 'image',\n\t\t'order'          => 'ASC',\n\t\t'orderby'        => 'menu_order ID',\n\t) );\n\n\t// If there is more than 1 attachment in a gallery...\n\tif ( count( $attachment_ids ) > 1 ) {\n\t\tforeach ( $attachment_ids as $attachment_id ) {\n\t\t\tif ( $attachment_id == $post->ID ) {\n\t\t\t\t$next_id = current( $attachment_ids );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// get the URL of the next image attachment...\n\t\tif ( $next_id ) {\n\t\t\t$next_attachment_url = get_attachment_link( $next_id );\n\t\t}\n\n\t\t// or get the URL of the first image attachment.\n\t\telse {\n\t\t\t$next_attachment_url = get_attachment_link( reset( $attachment_ids ) );\n\t\t}\n\t}\n\n\tprintf( '<a href=\"%1$s\" rel=\"attachment\">%2$s</a>',\n\t\tesc_url( $next_attachment_url ),\n\t\twp_get_attachment_image( $post->ID, $attachment_size )\n\t);\n}\nendif;\n\nif ( ! function_exists( 'twentyfourteen_list_authors' ) ) :\n/**\n * Print a list of all site contributors who published at least one post.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_list_authors() {\n\t$contributor_ids = get_users( array(\n\t\t'fields'  => 'ID',\n\t\t'orderby' => 'post_count',\n\t\t'order'   => 'DESC',\n\t\t'who'     => 'authors',\n\t) );\n\n\tforeach ( $contributor_ids as $contributor_id ) :\n\t\t$post_count = count_user_posts( $contributor_id );\n\n\t\t// Move on if user has not published a post (yet).\n\t\tif ( ! $post_count ) {\n\t\t\tcontinue;\n\t\t}\n\t?>\n\n\t<div class=\"contributor\">\n\t\t<div class=\"contributor-info\">\n\t\t\t<div class=\"contributor-avatar\"><?php echo get_avatar( $contributor_id, 132 ); ?></div>\n\t\t\t<div class=\"contributor-summary\">\n\t\t\t\t<h2 class=\"contributor-name\"><?php echo get_the_author_meta( 'display_name', $contributor_id ); ?></h2>\n\t\t\t\t<p class=\"contributor-bio\">\n\t\t\t\t\t<?php echo get_the_author_meta( 'description', $contributor_id ); ?>\n\t\t\t\t</p>\n\t\t\t\t<a class=\"button contributor-posts-link\" href=\"<?php echo esc_url( get_author_posts_url( $contributor_id ) ); ?>\">\n\t\t\t\t\t<?php printf( _n( '%d Article', '%d Articles', $post_count, 'twentyfourteen' ), $post_count ); ?>\n\t\t\t\t</a>\n\t\t\t</div><!-- .contributor-summary -->\n\t\t</div><!-- .contributor-info -->\n\t</div><!-- .contributor -->\n\n\t<?php\n\tendforeach;\n}\nendif;\n\n/**\n * Extend the default WordPress body classes.\n *\n * Adds body classes to denote:\n * 1. Single or multiple authors.\n * 2. Presence of header image except in Multisite signup and activate pages.\n * 3. Index views.\n * 4. Full-width content layout.\n * 5. Presence of footer widgets.\n * 6. Single views.\n * 7. Featured content layout.\n *\n * @since Twenty Fourteen 1.0\n *\n * @param array $classes A list of existing body class values.\n * @return array The filtered body class list.\n */\nfunction twentyfourteen_body_classes( $classes ) {\n\tif ( is_multi_author() ) {\n\t\t$classes[] = 'group-blog';\n\t}\n\n\tif ( get_header_image() ) {\n\t\t$classes[] = 'header-image';\n\t} elseif ( ! in_array( $GLOBALS['pagenow'], array( 'wp-activate.php', 'wp-signup.php' ) ) ) {\n\t\t$classes[] = 'masthead-fixed';\n\t}\n\n\tif ( is_archive() || is_search() || is_home() ) {\n\t\t$classes[] = 'list-view';\n\t}\n\n\tif ( ( ! is_active_sidebar( 'sidebar-2' ) )\n\t\t|| is_page_template( 'page-templates/full-width.php' )\n\t\t|| is_page_template( 'page-templates/contributors.php' )\n\t\t|| is_attachment() ) {\n\t\t$classes[] = 'full-width';\n\t}\n\n\tif ( is_active_sidebar( 'sidebar-3' ) ) {\n\t\t$classes[] = 'footer-widgets';\n\t}\n\n\tif ( is_singular() && ! is_front_page() ) {\n\t\t$classes[] = 'singular';\n\t}\n\n\tif ( is_front_page() && 'slider' == get_theme_mod( 'featured_content_layout' ) ) {\n\t\t$classes[] = 'slider';\n\t} elseif ( is_front_page() ) {\n\t\t$classes[] = 'grid';\n\t}\n\n\treturn $classes;\n}\nadd_filter( 'body_class', 'twentyfourteen_body_classes' );\n\n/**\n * Extend the default WordPress post classes.\n *\n * Adds a post class to denote:\n * Non-password protected page with a post thumbnail.\n *\n * @since Twenty Fourteen 1.0\n *\n * @param array $classes A list of existing post class values.\n * @return array The filtered post class list.\n */\nfunction twentyfourteen_post_classes( $classes ) {\n\tif ( ! post_password_required() && ! is_attachment() && has_post_thumbnail() ) {\n\t\t$classes[] = 'has-post-thumbnail';\n\t}\n\n\treturn $classes;\n}\nadd_filter( 'post_class', 'twentyfourteen_post_classes' );\n\n/**\n * Create a nicely formatted and more specific title element text for output\n * in head of document, based on current view.\n *\n * @since Twenty Fourteen 1.0\n *\n * @global int $paged WordPress archive pagination page count.\n * @global int $page  WordPress paginated post page count.\n *\n * @param string $title Default title text for current view.\n * @param string $sep Optional separator.\n * @return string The filtered title.\n */\nfunction twentyfourteen_wp_title( $title, $sep ) {\n\tglobal $paged, $page;\n\n\tif ( is_feed() ) {\n\t\treturn $title;\n\t}\n\n\t// Add the site name.\n\t$title .= get_bloginfo( 'name', 'display' );\n\n\t// Add the site description for the home/front page.\n\t$site_description = get_bloginfo( 'description', 'display' );\n\tif ( $site_description && ( is_home() || is_front_page() ) ) {\n\t\t$title = \"$title $sep $site_description\";\n\t}\n\n\t// Add a page number if necessary.\n\tif ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {\n\t\t$title = \"$title $sep \" . sprintf( __( 'Page %s', 'twentyfourteen' ), max( $paged, $page ) );\n\t}\n\n\treturn $title;\n}\nadd_filter( 'wp_title', 'twentyfourteen_wp_title', 10, 2 );\n\n// Implement Custom Header features.\nrequire get_template_directory() . '/inc/custom-header.php';\n\n// Custom template tags for this theme.\nrequire get_template_directory() . '/inc/template-tags.php';\n\n// Add Customizer functionality.\nrequire get_template_directory() . '/inc/customizer.php';\n\n/*\n * Add Featured Content functionality.\n *\n * To overwrite in a plugin, define your own Featured_Content class on or\n * before the 'setup_theme' hook.\n */\nif ( ! class_exists( 'Featured_Content' ) && 'plugins.php' !== $GLOBALS['pagenow'] ) {\n\trequire get_template_directory() . '/inc/featured-content.php';\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/genericons/COPYING.txt",
    "content": "Genericons is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThe fonts are distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\nAs a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.\n\nThis license does not convey any intellectual property rights to third party trademarks that may be included in the icon font; such marks remain subject to all rights and guidelines of use of their owner."
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/genericons/LICENSE.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/genericons/README.txt",
    "content": "  ___  ____  __ _  ____  ____  __  ___  __   __ _  ____ \n / __)(  __)(  ( \\(  __)(  _ \\(  )/ __)/  \\ (  ( \\/ ___)\n( (_ \\ ) _) /    / ) _)  )   / )(( (__(  O )/    /\\___ \\\n \\___/(____)\\_)__)(____)(__\\_)(__)\\___)\\__/ \\_)__)(____/\n\n\nGenericons are vector icons embedded in a webfont designed to be clean and simple keeping with a generic aesthetic.\n\nUse genericons for instant HiDPI, to change icon colors on the fly, or even with CSS effects such as drop-shadows or gradients!\n\n\n_  _ ____ ____ ____ ____ \n|  | [__  |__| | __ |___ \n|__| ___] |  | |__] |___ \n\n\nTo use it, place the font folder in your stylesheet directory and paste this in your CSS file:\n\n/* =Genericons, thanks to FontSquirrel.com for conversion!\n-------------------------------------------------------------- */\n@font-face {\n    font-family: 'Genericons';\n    src: url('font/genericons-regular-webfont.eot');\n    src: url('font/genericons-regular-webfont.eot?#iefix') format('embedded-opentype'),\n         url('font/genericons-regular-webfont.woff') format('woff'),\n         url('font/genericons-regular-webfont.ttf') format('truetype'),\n         url('font/genericons-regular-webfont.svg#genericonsregular') format('svg');\n    font-weight: normal;\n    font-style: normal;\n\n}\n\nNote: the above only works if you don't use a CDN. If you do, or don't know what that is, you should use the syntax that's embedded in genericons.css.\n\nFrom then on, you can create an icon like this:\n\n.my-icon:before {\n\tcontent: '\\f101';\n\tdisplay: inline-block;\n\t-webkit-font-smoothing: antialiased;\n\tfont: normal 16px/1 'Genericons';\n\tvertical-align: top;\n}\n\nThis will output a comment icon before every element with the class \"my-icon\". The \"content: '\\f101';\" part of this CSS is easily copied from the helper tool at http://genericons.com/\n\nYou can also use the bundled example.css if you'd rather insert the icons using HTML tags.\n\n\n_  _ ____ ___ ____ ____ \n|\\ | |  |  |  |___ [__  \n| \\| |__|  |  |___ ___]\n\n\nPhotoshop mockups:\n\nGenericons-Regular.otf found in the root directory of this zip has not been web-font-ified. So you can drop it in your system fonts folder and use the font in Photoshop if you like.\n\nFor those of you using Genericons in your Photoshop mockup, remember to delete the old version of the font from Font Book, and grab the new one from the zip file. This also affects using it in your webdesigns: if you have an old version of the font installed locally, that's the font that'll be used in your website as well, so if you're missing icons, check for old versions of the font on your system.\n\nPixel grid:\n\nNote that Genericons has been designed for a 16x16 pixel grid. That means it'll look sharp at font-size: 16px exactly. It'll also be crisp at multiples thereof, such as 32px or 64px. It'll also look reasonably crisp at in-between font sizes such as 24px or 48px, but not quite as crisp as 16 or 32. Please don't set the font-size to 17px, though, that'll just look terrible.\n\nAlso note the CSS property \"-webkit-font-smoothing: antialiased\". That makes the icons look great in WebKit browsers. Please see http://noscope.com/2012/font-smoothing for more info.\n\nUpdates:\n\nWe don't often update icons, but do very carefully when we get good feedback suggesting improvements. Please be mindful if you upgrade, and check that the updated icons behave as you intended.\n\n\n\n____ _  _ ____ _  _ ____ ____ _    ____ ____ \n|    |__| |__| |\\ | | __ |___ |    |  | | __ \n|___ |  | |  | | \\| |__] |___ |___ |__| |__] \n\nV3.0.3:\nBunch of updates mostly.\n- Two new icons, Dropbox and Fullscreen.\n- Updates to all icons containing an exclamation mark.\n- Updates to Image and Quote.\n- Nicer \"Share\" icon.\n- Bigger default Linkedin icon.\n\nV3.0.2: \nA slew of new stuff and updates.\n- Social icons: Skype, Digg, Reddit, Stumbleupon, Pocket.\n- New generic icons: heart, lock and print.\n- New editing icons: code, bold, italic, image\n- New interaction icons: subscribe, unsubscribe, subscribed, reply all, reply, flag.\n- The hyperlink icon has been updated to be clearer, chunkier.\n- The \"home\" icon has been updated for style, size and clarity.\n- The email icon has been updated for style and clarity, and to fit with the new subscribe icons.\n- The document icon has been updated for style.\n- The \"pin\" icon has been updated for style and clarity.\n- The Twitter icon has been scaled down to fit with the other social icons.\n\nV3.0.1: \nMostly maintenance. \n- Fixed an issue with the example page that showed an old \"top\" icon instead of the actual NEW \"refresh\" icon.\n- Added inverse Google+ and Path.\n- Replaced tabs with spaces in the helper CSS.\n- Changed the Genericons.com copy/paste tool to serve span's instead of div's for casual icon insertion. It's being converted to \"inline-block\" anyway.\n\nV3.0:\nMainly maintenance and a few new icons.\n- Fast forward, rewind, PollDaddy, Notice, Info, Help, Portfolio\n- Updated the feed icon. It's a bit smaller now for consistency, the previous one was rather big.\n- So, the previous version numbering, 2.09, wasn't very PHP version compare friendly. So from now on it'll be 3.0, 3.1 etc. Props Ipstenu.\n- Genericons.com now has a mini release blog.\n- The CSS has prettier formatting, props Konstantin Obenland.\n\nV2.09:\nUpdated Facebook icon to new version. Updated Instagram logo to use new one-color version. Updated Google+ icon to use same radius as Instagram and Facebook. Added a bunch of new icons, cog, unapprove, cart, media player buttons, tablet, send to tablet.                                            \n\nV2.06:\nIncluded Base64 encoded version. This is necessary for Genericons to work with CDNs in Firefox. Firefox blocks fonts linked from a different domain. A CDN (typically s.example.com) usually puts the font on a subdomain, and is hence blocked in Firefox.\n\nV2.05:\nAdded a bunch of new icons, including upload to cloud, download to cloud, many more.\n\nV2:\nInitial public release"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/genericons/genericons.css",
    "content": "/**\n\n\tGenericons Helper CSS\n\n*/\n\n\n/**\n * The font was graciously generated by Font Squirrel (http://www.fontsquirrel.com). We love those guys.\n */\n\n@font-face {\n    font-family: 'Genericons';\n    src: url('font/genericons-regular-webfont.eot');\n}\n\n@font-face {\n    font-family: 'Genericons';\n    src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAENIABEAAAAAatQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABgAAAABwAAAAcaii0EkdERUYAAAGcAAAAHQAAACAArQAET1MvMgAAAbwAAABCAAAAYJdbaIVjbWFwAAACAAAAAJgAAAGyqWnWY2N2dCAAAAKYAAAADgAAAA4BYgHJZnBnbQAAAqgAAAGxAAACZVO0L6dnYXNwAAAEXAAAAAgAAAAIAAAAEGdseWYAAARkAAA5fgAAWkD4H3YjaGVhZAAAPeQAAAArAAAANgUfUT9oaGVhAAA+EAAAABwAAAAkEAMH3WhtdHgAAD4sAAAAiAAAAQpVkUB7bG9jYQAAPrQAAAECAAABAoDMauhtYXhwAAA/uAAAACAAAAAgAagCQm5hbWUAAD/YAAABYgAAAthC114IcG9zdAAAQTwAAAHUAAAFCuMEJONwcmVwAABDEAAAAC4AAAAusPIrFHdlYmYAAENAAAAABgAAAAbRQFLPAAAAAQAAAADMPaLPAAAAAM71j4QAAAAAzvWBvnjaY2BkYGDgA2IJBhBgYmAEwnogZgHzGAAJvwCyAAAAeNpjYGb/zDiBgZWBhdWY5QwDA8NMCM10hsEIzAdKYQeh3uF+DA6qf74ys6X9S2Ng4GBg0AAKMyIpUWBgBACOigvWAAB42mNgYGBmgGAZBkYGEFgD5DGC+SwME4C0AhCyMDCo/vnI+Ynzk+Qn1c8cXzi/SH7R/GL5xfNL5JfMLyVfmf//B6tg+MTwSeCTwmeGLwxfBL4ofDH44vAl4EvCl4KvDP//32LnZ+Hj4+PgY+LV4DHk0eZR5ZHnkeQR5uHlYeeugdqOFzCyMcCVMTIBCSZ0BQzDHgAA5FwqMwAAAQkARQBBAGYAfwC3AAB42l1Ru05bQRDdDQ8DgcTYIDnaFLOZkMZ7oQUJxNWNYmQ7heUIaTdykYtxAR9AgUQN2q8ZoKGkSJsGIRdIfEI+IRIza4iiNDs7s3POmTNLypGqd+lrz1PnJJDC3QbNNv1OSLWzAPek6+uNjLSDB1psZvTKdfv+Cwab0ZQ7agDlPW8pDxlNO4FatKf+0fwKhvv8H/M7GLQ00/TUOgnpIQTmm3FLg+8ZzbrLD/qC1eFiMDCkmKbiLj+mUv63NOdqy7C1kdG8gzMR+ck0QFNrbQSa/tQh1fNxFEuQy6axNpiYsv4kE8GFyXRVU7XM+NrBXbKz6GCDKs2BB9jDVnkMHg4PJhTStyTKLA0R9mKrxAgRkxwKOeXcyf6kQPlIEsa8SUo744a1BsaR18CgNk+z/zybTW1vHcL4WRzBd78ZSzr4yIbaGBFiO2IpgAlEQkZV+YYaz70sBuRS+89AlIDl8Y9/nQi07thEPJe1dQ4xVgh6ftvc8suKu1a5zotCd2+qaqjSKc37Xs6+xwOeHgvDQWPBm8/7/kqB+jwsrjRoDgRDejd6/6K16oirvBc+sifTv7FaAAAAAAEAAf//AA942q18C3xU1bnvWnvveSaZmT3PZJKZzHtCJpkJ88hkIIQhCAECCAQCCCooggTkjS9q3Vqpioo9tqJVK2hbsdpj90xA2mJrjtVaW0fLFbmt1h6xp1ptPcfe9rSKmc39vrVnQhBsz/39bmBm7732npm1vvU9/t9jLaIh8Ef/yj1DeKIlBlJLzIRMFP1i2Mbb/DXUZeNdIv2r0vPEE166+An4u/MJ7pnyBZeS0+R0+XVymi6HE+X4aaoQSsb9TSREyxEOvlQjwXfrSA18s424yJVEJgmZlmQhIVtSsqYki0lZn5DtKdlQkh1JuTYh15WoXJ+QhRNFoq9NJpOyrlTUCcbYcF7HG/C9xhCTdZaCncZkV6lgsiaTRbsL79sthlihgcZIx0Sa8TvO9+KgO2Xo7GnCSWVJIGWJk07DNUckiY57KZUj4Sjc1cE/GION9BLZmJDNJdkGHYR+2mEwJ6DHcp2lIEJ/dKWCg8YKYp1oHRYMRj7kypGCzQxXVKsjcNUxkVisIZ9gtXCCL0TszmRnOhKg5BW6mj5KV7/yirJfuUTZT5P7ju/bd5xPjG985RXuIWzdhyQWiEQlnaSVGHVdxE+uZ7SFvvkSciMQMyHzpWEj79DH5JqSrIfeBlhva0tyraVQD731lGSPpWCFM22pEIR+11LRWtAbczm5XpS5nOyBUfAOM/RbtoqyBsbS6IOxaKm1FtscYoHT5GBMNuAYv00jIoVtdpJKkkyaBAPEle70OR12rS8iAYHZ/0+ArHmq+8EPqVY59cMfKJ9IR6nx6FHlb0epxCPNTxNpVBJ8B1aV34a7Y0/uPnp09y3PPIPj5oh+PF9Nx3EX9LWpFDKWIYm8BYxVl6SyJSGTE7KQBErIvKWgp4wU2qRcY4GxxoBYOGsEB+AXaeWVghfQVoHuKHCEA0fwUn1XiHprVALRwSYtzgEHFyJcCvABDTAV3sNTCfimjqQJlU2sK9AvTWnYoCEwKcYS8pKhVDAD5Y1EtALFCxoDHPkccnCFdjpRI8bh207SnpN3bz1Ntt6tkfafPLn/C8+3lP8gcfe3PM94FH5JS4iROMhKImsTspgCZpStSeSJGkaZWiCIk/WCUUP9/aKRR8kxakGmgEI1QBRTSTZZZAdyUNFhwrsOEeTKpcoVEMdOgmKyM+M/cwryIynHjw/t46onQDSQr+PKcUr2DY07JRzSjNGlgaTIPoKiDnMSS8he4NA065++VNQT/GG9AN3SWwpu6Fa8VIy7sTE+ERrjlkIdNDpKxToHNtZBF2WHpRCFRn+pGPVjYzQE/c4Add164GtjfS5XqIsD/9a4PDHg30LUAc3e1hzwdawGJVYMTWQySsV0Z9ahdYgonxkxHc14KVwAH+MdmBY412XwTiSAT7kcMENkaDC/5cCW/OAQ42aCfD3WxI1QafX+8H25JYq0YMuWBVRakrsvvH+1IgFjcxqKh91K5RHKHlHUR0DWgbvIiA5pZiVB0kZkf0K2pXCKgMFrU0wThRJy/QmQ6EIY5qkgWICNGmAkDcBGKX+S9Tjop2IwEKFZPw5KbYsB2x5YJZBVBw6sUvJKXlp1gEfN8vivsEVS8sjR7Ca8K3k6ckBZJf3qcSqdaSGEp1U50EAPfWRmRctT7Kj+BOoks6XghKlpKhUCMB9mmI9ho9VWj1rEKRYafDgHFGTgsNZgdjibKrMAHabhznQ06+VRElw9NB2BC+qwm6gOf5TJZaa/f4V7gscyOXNR34UX9q1Ydnl8YBJPkNE+hVd///H+FY1TZsyNzr+z86K+o7882rdi+Qc3L33srslo/uCV1oNGIevIBiJfkZAvKcmtqEGofCXjxs6S3GkpNFKU2MJ66H0n9LPYP29BDvRko/i0xuLovmDJZUzVX3IFcJTlMrjRKuZrjDYPaWlL52cPXooD1VgPBULhjiQbnJi2klAqKRCrw0I02kgm3ZlJR3sEfOMi0Tg1cbpIVKuL82aqdWkddi/v0upMNE6jcSHaSk3U6fIKLq+uM2tHNRENkUepje765TG6i1ofVa5TfhEK0BnzrpMGs+u1Rr3ZJtSlui/PXr1nz9XZy3oSRuOkjvXZQem6uZnapqnLlvo4gyfQ6RFqGwyimzd43IE6ytdZm0OdUxbFaSCk/EK5TiC/pF+AL39U+U9l9zGlUP7jOl1zg/D8wpsnG5pnDT217ZGt5pZZl06knGCdGPZznD88UdRy3D03bN+/7amhWT594qI6E+3KCnXBxnpOV+O2wtiau/y83t3Q3OAEXZS8Vqj3addxTrRxOnxjc2MmjYzzJ5E+soDsIMU6QmJypITao7kkd6nztZDZNwuIhaVwIcxXbxLV6yKYsgtBHvJ1mto6wdnUHGppz0yexearPgLtRgOxtfZMzfcumIvT1Cwe0tMmz2Q877IW/YkLcmjj6ilMmA/mywJqHkw3b7e6Okk2Eq2l0awzlOWiWkKd/mSW47XE5rT1CNlIKBjQUi/n6hRcXNTE2bwUPmPNhr6FM0UfgpftW99SPlR2K2vg9WFox8Yb6Hffs+SVd5Wtf/c9R/+6567h55Q/U/FXdNbho/7v/Va57W9rf649MO+O9RO+qBz5gU+iC5yeqPYJOvd695f7nv77YtOkFZ6HXq5X/sQnz/3+b8HvcrMPKq9eW6Kd8zqkwWT9V5yz4tT9tyXK0U8fGFlA2+gtc5RjmvWPKY9xk3w9vaEv3mMpb/GkFtf6tY3UM5y7dEh5tPF+5ef3baSLR+JMfiTaBjjkN6DNYdgpXxY41JlKwmEKsGicZtJZp+BC/k4lXZ1ZrQ5fyLImXgj6pI4WSn52zTOhqDeRvPHxBUvnLkvuoXveMf7q/gMbpfWt11y1dvYm2rPz6XeUX39LeZUe03yDu3uzrs7981s0MT756CVXLH7iFzXR9vv/9w731Fv66to3L9D59Nd//MEv7l+KfSOAkXQSiZILCKpIUJYBMG9JWUzIvpTsLMlulXVaAHeeQDAKMNRgAVwpuwBLpQoTgHlcgOZkd47BhPHaVPTb/FNQv7qykWDAxHloEMFDICLtG9KQoX37hpR3qalWeTfW+5h2/vpL7lnWpijltqF9iBHw9qfwzr1IhZHa7iz9P8bsJTsv+JMyWs4hwAOLTyTNe9D3BjKf6VMHs+K2ZJFQNG7EBRYPUIVetexupv+5JHZdTBZd9fiMy2GIFesZNq4nYAsbKzY8JaZ7uFTS2Ux54FAP5+fRmHPSb9Nrn7wqO+R26/5tborONikvKCP8SzRBufl7NuW1PK+8m59helU5NnqEn01A21fpawbcsRiQx1qyl8h1CXlpSW5OFMJpwGSNpcKEOKD4RSqh142T0W6Q0QuT8ppSsXsN9rG7H4a0xlJYBe0guFcC7btRcA0ouDbnkuUXM6FtXorCTPUGYrcFsn0rL161BmW1UTzkjM3qR0UsL7IWWjpQaq0WaydIrROkVgtSG0GppVpbKtk5lXY6tTqtjtp40LadLqfa5qVqYw+XSaOuNSDjulCSBYpsHYnytNMKWho4WCft/YjOpRvp3I/27v1IOaR8TTn0UfpUSblx5u50eGMw4LCZ7G0TaUS+YYndbLfvvjCyIRi02KjZEptIgwvrATnU2zmbxqKt1eh5fv4k4ybl/QdfVR6iF27ZsedmgfuY3nrkjcs1U/g5n/kVOOO4Pym71gieh6hJw/G0OcBruNH7OJEu03EBHzVio63ByUHrw7T2wtxKf3x5JiB4jY019SanaDfmBukVm58/9XV/XKvhDpb3DtHtb7463NJ66wOqfzE2tzPIcnIFeYjISxNyS0qeXUK+AxA5HRyNlGwvFafbcfqme2H6GoAX16pzjJ4bOmpg8WV3Ug6Btk4WAyF8NNAF3LgO5lcHHscwb5q5AmctIOaNmhrvhFhv/+LB1WyuZ8NcF0lsJqjgAm+Cc128C+3udPEItfiDockrL2Pm1Cbi5KCZpK6ANhjgM6qkeqhfDIp+hwrrUWrBzIJ51cP9LDtNZf0BLd9DXWBPNS6cVZBgW6TTBd/k1AJrSDeUvB6fu9lrnW07cp8q2uCknGaqDyCtotFcfDcfNIdsHlHUx+ceumjgwK3lR278/YzcG9LiObbBULfHo9PR8qElt01z3L3ruh85HdKuG16i79Lf38hPyfm7wx4qaKehRlD9H/zqUfiVJufdT23g3LVNYqO93mFMz5x815GtRzr2Xnbqm0vWU9pQN7lhYmBigyds0V8hdD7ya0H4/TcPjAjCL4mKycCAap8Br94CunkWQ9owB3wCcEwVaasT5IEJ8pYYUtYBtinUmYDCHrEghhCWhepF6yGLua09rqIyu3MyBQAZp6A6bKA3gMLpbA9NJREjw3mcA2Wo0WX8XmrhAKVdsZBbvJauGRhYZ6NzlKcBls2usQ9OnTTXT2fn1t2+KNSbSvh9jhrlCIU/rTj7sstm969aferb/L+P+rkJnY3JmZNWzyj/J9e15bsbsjW2xsZgk3iX+23lPeU/Lz6LT5sAe2bJDUwDARL2x0DtdDBn0Oc7IcqdKdkG/pdFdsP4u9j4wQO2MCfYy/wG2a9yawwcEkuhTVVDOSCL18NMgOwXC/UuIE7AKmdyckwsdHQiiXxwu9CSUV3h8SYC0PbnkosRixkOoNWYyUCbQMnCaXT6ALegd/oiC9WBF/x1qtdbZqR2U/3B25MLuwIW5ePxRmSfcO2kCy+c1D1v/qdH+IbR9+jRdltL17CyjL74vafr2yINW4AZngRAtQCw1DTyXVJ0In4yJ+QJJaSQFgjSywiSKckZS6EJRg52MmAptDOXuTAdDp3uH/bUfDSHOGJGk9wAVBwp2OkncmRk2GqP2GJFePft8e0JakFMc+SQ1d7gjsTxj447l/NuWmjKgCC7clNQkANiUevswLN2a8E8AanZMQF9NNLco0o2mCoEyk6rw84J4L9EOVDQ0UjWpmIKJ3MGtKi+rSzqYOIcdhBeHaLlaIR7su/eYzT2lEwTL+94QvnZi5d/LzDbErj4Xp3n0Za71g4sC08xua67YucPLlc++PiOD7+xbMCq01kMuqDzxi8Jf7rqN688fOl1Lymf3vk35eqTF+eV3+Z2fbXz4C5OXnjNHUc3LErd81zu8q98n058+gQ1XX7wzWu/usbhrp/SUm8xpKgaXhvDsINkNymakO4AO2Yn5C60kcwmLmWkD5fksKWQAkrPLclzLYWZcDa5JE9W3V/wPZYBI85NAW1iiYHFqC9nikdMGltz1zTLArycbC04pyIBnSb0QhYDTWeDF2IwEps7PCE1eeqCz3geiGSDgWhnFoCpSj4mu+BrOV3OTmDSbGckClRmWAHJDNTPomEErgVVC/ABpsJ1tuOh+gZfvXuOZ1bT3gWPlvdc8tjf9971f75zfW5ondUjcBZeozFd0CeNbH3p5IJ9lyy63FYz0ds3fdF2i96w1VavBbT61Fl+hnIJvP7z0dYd66g703+ETv3ZtuPfvGzeTY8NL9/zWqveZDPkDTanOP/61cVbF7751Nf+fu/OBfGHr27tXXr/1thCm00JD6zecy0dZX70AW6VbpXmAChGM2khTBeyOIlJDRZRNUJjKRiA4nXV4JDV4vR1WiI+oXI88Fe67K9/VR7n7qycCN9VHv9r5ZwdK7iY6G4EF8ZPMgRjnPUl2ZqQTSwOh9E28D7ADZa1GFsrEo0FZcBkHa5r8vhUxncBdzdSaypJic0aDvFwCUyNxi3CowxopcXX2Vcu/MrGb5TpJrq61qL8Sbnjlhn52yz6LVu7Znfb0xOPLZdv1Fy+cbFysvwX5ST93/QnlKcr9LXKgOf+lbJMzRfSWTRh09+/lTD6VGOKZvDjrYRimJMgWsNgKzlXuYUNVDq5XyAYjxqFd45FfdD1xhYF35vRSUd60F8RSdsCejoAnpxsSMC3UjmYkJtOYLTSmSyEkCQWjH/VoZlJiXZmgsGsd2ZFGHUUeVFEoBpEiAYg7Vc/dbtvufTiGzatWHbtl2+f290mivQJZfC02N4xe84G4dHyHdf1Ttvma3bau6h7WaihPf4AfZk20BfuWH7xlHzwLNsRJDEymdzMbAdYCW9CjpbkhoQcSMkJFp4SSrJgAaGlcneFKAhhfcAoquCCp4ADabRgpExOMddzCkhs2AcjCuTkCeKw19PGvMpGjM2QQkMUZLnRF27BtoRYCE04nwEB9z7FAjZ+EEEwcOBP+UMVTgyrxgWckEiMgkieZUWk/oyGZPqVjyzKcWWZctyifERZFPGk8hzX3J+RMv3s7SxDMoSNPOntwXhd2/Ge3mbluZP4oerT/RlQZ4AtKGALhdiJCzzzZqBeFOgXB9+cyglGHowfWjAYL3sZ9GuB9zFz0gF0aXDA6J31Tcjsckg8pNUgnnOhHRgOhFvbEP6xSFyWdiZdFOmho8gGNDKVRm1UDPOusMi7snAe1YiarIG6MpR4uB+LLSL3Y4+n3CvarbZyr+eWb387w2mUd957j3oPvv/BB72c5j3lHep9r/wpvffbvJO+1lxPX6upUdrrm5V2n1Npq6mhx50PbdqkPK48TtPP0q4HnqWp8rMPPfRQOUCXPfgs1/TsA3RZ+dlNvzmLhzJkKXmGPMZ4yF6SexLy90rynETV9fnRONcHsYUaWLoHzq4pydeoxAKm+TGGmNqAaZbm5HvEQ88sX9d7AOlyjbVYJ1yNWqJBzNtqNXZvoCPZ3TNn3qVbbv/6Y/9aHGaAuccOtjUyaTIC5jnguD5N9RZv97zvY7xTswjudSRTuc/xjIRUMoSgOM5FUfJAxwjRSCgasWY7Q1lA1wLHJFLIwjSgYz+V70RD4oqwpwSdltPg/U40G3E0wFoA1U5mR1B44RJvZ+PgUEbQvOCVDo033AS74vJyzGTjBWWP4ldgMIFMwbhXJMSU3nl8rp436bVv/Ynetnby0n0vbd8hRztnb9usPH3wceWDvjl1S5fR9iLn/6Vy8Gf3iY994Vrq2zV31r3lr93Dm+hl1PrQN6n3slDgSuU3+7+hvH7VVWuoqH/gqk3/PnmKs3/mmxcusTtSyZUrF0TSejGVXjwwOVerjTW3JOKz6jiTweGcMbfPFo9Y+2KxFf45Wm5wd+8FV3jqw+9s3taVjQQ/uOlL3+e1Swfv2HbtwIqfUIdxw+K1yl+v2jHlc1y6t5Tb3vz7y7fdvPPYQ0P2jueuu0956tpdWzyNv93/EL3q6w/+L6/W8rZy74dfOz27z5xzfE2598R+GMU26c5duegX79Xqdm7eoPz6+mue9/oHLl7xzpx59u6eSy9bvLjeNdHVN2FZ3yyNtjs7EJ5qcWhoV4z3zvF4/UIsMHdRNKs3NDRfcMW0DQmr5ao752xYF4tt33nddXe6bG/cvnf79tZgU4A6fsJteLZnnn1yz/oNpOoj6gnw/nxyJbmR3EFvIrImIa8tyVJCvjUl31SSdyeL0k3o8kl7DLHiTRKe3vQlcBRvssjXIyoHxBlNyJtSciuIyJ0JOXFCXl8avnB9Qh+TSQkDHxeW5PWWQp6l+2SXRc6W5GwCTgo7oMlXGr7ct0PNcfkshT3QdHNSvr0k35Is3r4Hf+32W+GH99yOp3skcDvvUrGsYevIsIplZ1nkmSOFQe4TednID4UdIy1qc59FnjFSWMp/Ii8fKcyaqYeG4Zl9M2yxQt8MPXxouG/WTFtMHrQMLx1cBq2Dy/TyUsvwsqXLbTFyZMbMvlmDS5ctj1f+6DktDArn14NIZjSbUKxdYnHl2utRcH07QDeK7ihahsKeGtAFE0C0pbXQSgDRoTa4SSw6XUzKo9dDszuxfoeKGuxeQGs94P/GhQSNc2mQPowqxwX0dH0gYBhKBqNqN6G3zLlMvM7EZ9M9fLYHmsEHdoDdAQ+44tMBGNSZABXGeZphTrQDHWopf90LX9j5i39Zl6zzeTpD/iU2m6ve5gq3dfvqLc3eeL39nvuURuXjb8ye55u+8ouzbV16quUESo2NJtuUOXfuSiVnt1hfDcSmheqDA7Paa4O2VM+0UHPt0986+rurU00r4l2XX5B0TbampzRNWjO9w8EfZYAKnGP6y95rLu1KDm6VprfMmNKebfb0mm2xjoTT6Yn09ixPxuZPhQvLkpvyBxd3bbikr1XDiYJZZ6ox69xtcVuDoHPGfJ7++X2WxMKOVrOhRtTxfCiebU2mvFvvOiAc2pQPtuZWbt+R3jrZ5rHmLtq6qXzqjF+uYvovg87vAr6/CP3qvgTLrq5A9V5IA3cBgzYni+ksslw6AbyetSAUAJtQWAnKPU1hzi9cMohznhULgb4cWjorThTv5ZupVwMk16CWFE1qyB/OvBygIL/YAfoT9GtcGw12MBBkovgRXZy/qaZv+syDBwuP3L9rpbuhtuWqi6/ItsQ2br5285VLp4lWytWIvpap4fSmxTNsVv8F07sstGvaK7vWu7jg1EUrVg7k7bbeX+/NtTQ28GJjvcFwUueaNEH45iM/XTl/22QfZ2pqMBo0tllLvvLo725YfvtA1qapq9NplT/ytYFAe7SlzsY1eGvraH0gZgq188Xyu3W+lfO/PffmFXPa/WY95Sw3JKe1r1owb1JbTe1LBt/6TYg37wI6bgc6+sm14JUi3mopFRtakHANDiDchoR8eUlekmApwSXVlCCVr0vI3hPyCnBRS8WAl0WU1oGUewN46iXwyRWWQpyB+GK8jmUNe0D0rwfqB7wgTr5cIb4CjKPgaGjRz9uJAlUnymYQspYGuA1Sd/kGkCpzPMDuLRGH67ykE0/1iNiZV0oxnl1xTHVOHXOPoiA6oQh4SFlw/NH4MfSKmZ3I+H9wH6PhzuoTldvBAE6pw67ewH/wzRXkW71/15dO7r7rmhn9T9Kud3bbUvRLJ2/ZtfHCuU8qP3tntzid3tmZXnrNkX1bN3dPDgSnTFoyb9PyxqDfLwKoXLm6LebzOhoSmUCgoX5SbtHg5js2bsjlsumVl37x4ik5v79n2vr57QlXo9PR5IulgyHNfbtPfqm/dvc7ys+eXLVkaDNcTTJ9+R3a9eTgwI7yX/rnz01MjccXL1m3bEpPJNrYUG/XG6xml90TD4R8vp4OmzMUXJlMtLc3uFuic2avXnvBtJYWN4CyZm8yP6HN6fQF0hNdbr+f+QcgY1rMcSbJCiK3If4uRttYGrcOpzyVkHUnZLFUFHXYKLZiLYjYwN697D0IHKATWaEIBrvTWIihg9l0wLRGEVARllQE7QgThMoOE4laM0Wwbdfqxt5iNOlk2Bu8YSqNTNy0Ok91tW6rf/lMi15PD2T6OyJO+N+fySMeVvLTdvRd1ErB97nkkY9v14jt/qbFDyxaciAc6c9M6K3zR9kbPDrU39LRwsIBJbpXl9JtJxPJJDKbLCJryEayg9xAryaYe5xaki9LyMtLxeWXwWjI8kHg55Usgr4hJc8rFdPrrsG6mK6E/IUUxmEBYTsS8paSvEP1qr6YkNtPyN2l4WR3+5gVTZbkbkuhH2RiQUleYCmshbOhkjxkYcGdSEnehtbYVhq+LjJdj8Gwwo2VoM9P/rJLtYg6i6wfKbiFT+SGkR/++eC/PYLNBXeDHsNB9SOFWrhTN0Ke1ulr6+ob3FXL95lrZve620VrIZEGDdgvDvOaLiZbC6zF1oGlqBbXisNT+5azUP6QdXjCiktYAnW6mDdYHE3eq7Zs3/kFbIhYC6FrMOKxaDlMb3dOnicejrQnQpOnq8m7w+A4kZ3X4QUvFjVNffjdDmtB2wh2c8cW6ILNynyuSnLKBrLq0qBkO5kRjIZ5p0uNMamsgUAZhDdOs3Z4HMMgTrsTYTOGkjFH4GQhKbs2YE+D18KEGy6ZEIfSnexOtegHv5qFUkpXD6zpPvL7lRqr1UFz9QMdc9avn9O3VqOcmvfb73WvG9jZFTe9oDylbFP+9QVLW2ZtS2KJp23CpIVP0OB3n6TBJ55Q3nryu8pb26bFE9N6V3pbzV13/0uXudVrHvzB0UH6L9MugVba0Z5vb8/TgY5YbkK78JWBqwdWG+hLzppazawJE9d/bf3qvm7li7WrBq8eyK5oTE689d3du39/a7KzcXkm0dTfE8q9cuLpoaHDGzbC+ycre3tX9t4f85q7uszemHlw8H3Wwl+PP9Fe/vGUec0dLZMI1qVwGIOWiAd8wzuI3JiQ21KytlTUNqKYaikwdgtj3tpS1XE8U6pTX5Lr1cismKyk7QJqhUer6kLqeZj1RlasVJNjir1Q247soG0EC9sQCrPpFp82mC31zT4/skGtVTbm1PIwtbajh/qcLocummGlHDyLcYUzriy7PYX6WfUS+Lu6xAUJzYvU+aLmG+vhlNKX7tr7Er9w/TfwQveS8h8/4xcee8WfSPjpe7f96NnbNrR3rAzE4wGlec9zP73tf3XEj+O9Xx2746c/qdbr6DCvHSJTmL/oLMkeFm1ATzHMKCGWZFEtPACvMALjbRQxOF+LI/Q4mRVTS1Uq4QKsKOOI3UWzzmTWRTuRt3QGGgnoME0hgHtfLSSjJEKHhPDesIYOhed0ZsLKG8qb4Y0hLPZgeUvpGJab0dX01qGIsk/I5wU6FBmaA8/RSDiMGAhzf8+C39vL6rDU6j5iM2htGZeBZh2UN2glehVnU+4u/5kz063lD4WH6Ta67eHyR5Sz043lPyt3062cWfka/ygNKt9XXuYP0OXKy8qRcnb7OppSSuu2Kz/hfkxnKW8pB/kXaFo5qPwG7QTWwmCtk5U4yLgCGFuiEqSi4rklL5Xxw8iwxgXLk6oDHdqHNSz70P5wwKlarPMLsnyroYR1VMCOHHx7bQLrjUjBgHVaOrU4xQVYmAdQjaZLgi8pS5KU50dOA9ODZwRoUSpX6ge12F+B1JJ6ghWOWBkDU25EZi+YWKcN1C/SM+WAGEIrY+3KEFgNHi4VuBQyeNU/Vm/D+KeZhMnFjIMcjIOQfSIs0KCyDwaogiU5OBZeAPkp+ICRhusEuwf9i4agaD1c69A0hcIsguBxwDVmV/3hasHiWYECK3gNYELTcS5gophLxlKczT+iGvDnNT/avPlHyqfKO8qnPxJXPPj6B68/uEI90G9LtPUivvCZh+CMM5x5Cg7KQ/QNZYVyYgVRa8W0qD+A7MTLZkUoYe4ea0StCbkGa4sKts9MO6koWo6c3E/J/pNlwoopEWBgWPI04fepZZRn6FhDGkkbuapaQRnDqpJirBmVVCwKSqo+AVxQ0BiSrJRQl6RyOxNRtZaSA8qqcWMMAoZKxQmY5CQTPPDJkKWgZYSXDRbsKYa/4tVSukzKwV4irQb5QGb9oIeEdOdkqrJwIJIBFkYuAoABQ/iU9Gd4FogbZcG7iFtyRyLpCFhVCYQS/j6FZ/E+x566KB2JuBUCz7jH1WpVxtxJ7quOOZOQ0ykspjl3rNnzjvWcYXVV8ELDR19CYCCn4yY5NVJo03wit4+QYlt7CtHAMBzTYzhAqwFma4pEWya0MubLmEG+Erl/Sp2UfzLnpS4Pb9eBzo6CQbb9YyKBKaK8089zkrbd7W7SbXzq8+nF+VwcRzmNEcjWpIPnaYHUnkW3asQzQVIkSyaTqWQ6OVKlZFOiEOpIpVgx3kSgoi9RbEl3p6DFD6yRmYLYrS1R6MpDS3upkJsG1+cS/YJxRG8CmeV8cK+5VBACeLRguLzQ0gbn0VKhFQssohZmFNNdcJ4qFTon4ZEVWRS0eTifWiroe/E4NmEz/ikf2qCVh1f1+Hnnn0d56Tx/5yc7Kk+qas1zirDHtzP/mw7SQd31uusBVxDaw2WxAis5lWKlINVFAmaqtbt0UQrqabDW3tVB7/jd4fCGyOFI5DDXfDg8FDkcDh/+nbLzghV0sD29UL0fPhwZCh8un8Sn8JF34H6SjKv/tsGvzWcWx4VzzDStl2laNdbtVvVrM9abYmxbI5gsCDkMiE5IwYUlmaac3CQOU1JjUFVruodLejnw8iiLbcep1YLV0xaCzFxRiZvpf0mK+PXv73z9wfCZwmmhv6I1d37/64oo0f/avOJBjlf2Ysk02FlWOsef1Xc/WVvtvZdVzVXGEDh3DMHKGA7jGLy+84zCKw4TR00Dq5ezygYcVpG67Syy/I9GxWMd/j8e2a2c9M8Gp6iMcPb4JpDhceMLM10WTBa9TIt7W8A5bGaRgmY/qOXK2FvHjb0Fo4koTnIgWYyyGEQ0DJ9qieJpCxa3RMcoFEPpAwrJQk6OikVXE0vfua0FDdZO/P8j1ljE7Z8RrRoe+x+Q7qxYlgAS1KYn2uOkjtVYxpBLahKytYTJuWjFFrIFGUAvcMs9J8YlvMBLbMcclwd4pUbk670sgzNBPGQUrM0BptGjCC90JkeTH9c/YM2Ex4cDFymiCgCLCCqiPOCCZGcW0Cr4VDrO0ulzWrQ+axUQnbqC1tA2WrOGfqpor1D+Wzmu/PeaP9Jt81741fNz6U7lroff3vhCv1DJbu1nsEkg9NS67dvXKhpFs24bYMpTyl3zBwbm0R10+yOL5pc/VB8+yVVhFWDaKi0QzzYCLVIkzzxyoIBBpUA6gXUypNDcCi6GpUnMsenOG4nO7HJ7wpF2LO+VBWtRa7XlquME51LHBkZdZuqiUcr8TRqxZbFsAdUXkiEYsFEni76y8e77t2/fvW4LDEu586PbwhdpyEWj7Sf3t3UqbSY33sCB//k2ei0jyL5/u5QeN8FtddSX3h1fNB8/9yZ+rjyw/6RJaessH7k7juP/863KbUgTehk93tm2/yRR6w05ieHUGkIMHGbTDBS8B06ieWUE3mheUkbYmzLCk7Ov2TNErbdktQ416AvQsS+R+PzoCLzxeWl0hL2NjgDIPeuaPYMyLVUwXw1orHZyC8EqCUR5rmSyaGbCbDaBWIqOBjSkrNC8YAwzm8pkOg4uQbXm3AI8aivJtupqIcwa1LNEbSEBfGsBtFHkAkEMo7vsWMMzQV37YgDGbcPFMJwhx9zFcAVcahyIeMf/U7O0RDWczGwi0OzPUAQeZJRUrB5aOGxAJIJY7DRxoxlkWVWpTLiRcn78C9oFcxpxHbN3hHrB57kXcDAxgGtFeaqpwdbfHKFv0jeP0N+UDx8+JNyoPF1+n85VDnEuOodyrvL7aL9Uv0aCqTWSVpaf0QGVQMQ11fovdLaFEq6IKegxYEYxHm3gdLggBiuWJOQNaRTr7UF1CPCFoEUUcFHU8v8xPx+1iQFXwhgoWwpE0ZHhySm4AyOEMeJ6mnKeB3IoqL8FNtcj2hH4nJ7VqeFnhSzNoozgSwJHbWQUGQ01VvsqbmCVMg/f4ZMjvKTkR+EbMCmg3ivX4XvFR4Rvhm/1MVTGw4gNTNeDx2VE+eWJqEZyKVv0gz0m6kBxSRgu1ygzl64ssSGOszU6tsahF6tHCqbGFKsf0TN30YZpX7bogZ4o6G3AkipSNldX1bDCqka2BgIoPBYIEtkyAH+aC8EpAE03dfgtHAlRsuXAFvivVtacJuC+HztG99KFtOmnm06TXyjfUSKchT2CU6OW3hyjq18Bv4ls+qnyH8r3lG3HqEDfoEt/gWMgYHt1f9Q9xWhdX/FG7Uy7m6HjDQk0b5iLiGRpD3W6qBM9aFvKVu3q/G3LuI9zDz44ifv7sm0HP/kjd0NqOK38helbSl7eK7x+8fTpF38a2/uyhi2tGz1c1a38WG2JlURInFxKEHg0lIoNGLMnDU4wryDoTSU5jnHI1lJloaAZhbpo1uBD5loMBCcScssJuU0NAbW1YJi+IaBhtqapGUQ22qaWUfhR7zpd6AlGWcESVwnJsaVLWlZKlq36ihLt7KdTnrv5/WXhOUORHQ/sP3nl3KHw1of2nwQu/3m/8pPnbv7Dcko5NiGgY8l3j69ZHh6aG9l2cr+yZmhOeDs6lthI6TY2I6SyPoytdYpiVWIEC+2wUNtaKlrZUiYr5jhgCnxqBfpY9KuJrU1DBXZGbemZI88K0s1NoLY07gjaHrtYqG3G5CFYnAYW8NKLhRq2nqbWigqM5tSot2h3+s6sWGKxr1TFvawsaQKu5ghbjgfdB80jwQGvlE8QPvB5VPK4TIlTlyepLuXzSjdecQTvlCW2ZI/VEgFH3qNFeTERJ8w3Lj1D7ewaVwRhV7EUKOSC3YJDEmpzLBdWAUV2LYavquVXVKogoOULlPXK+gUHKwsHxxDPB68tUIbovgW0pPztKN5U7doqtGuat1E9oWJx0SC3SnqbjqB7IfikEY6sKiN/wqTqsb/qukLvuJWqmoqAj4WBcF3VmQWDevIxUV+0srL0zPs4/0EkIfAfqsE9ISkbS0UjW+ZmBHsma6BBNU6+khxKFut9rGy/CW5Zkyz8x9YI8rmCrx6OQXWNoDUb9YtRTOpaXWIkxFGxGSQ3k+aiolPAikmdi5JrN/yOk/4wa8GvDx5SfvM4L9le71sI5zT0ONwRyIPUteF3ZekPfT+4UlY+jCmnvCfojPJRDp/74TqZ2mJU1/y68sOjDyrvb/idmqvhgaYCrsF0VOmEQS0hUdCMLROkkoDqG4lAqnYIJwHp21KN5ejUaJhepQmWWOE3oJY2jH1RmNkgAQwQLrvE4NooOptobQa4vJ5o/h2+0cbQ680Ew0IupjyaWG6kOYlrHUHu/EkMP9eqS+W04wv9zpQqqTIXUIFtuFqkVCtaMeVeCCBaaPI2I48WeBfc0Zsd9erSg2GDyd6gJuCBwxCwd6Z7aNJL7SYaiFRxrKFyb4Du3KL8N/2qNDL41ae+OohvrVsf3rr1Yfpo9Q6f5/b3KM1gMcn6yiODgzSHD21VpLF7Z9klXKGcJEhTdYWykfEtx9Yp47pkdSlyQUMA7uiNcCZUlAPFhXb+RnpG0aMx5NlS1zL5yxkdz401KtLZGt6g4rbKOmnVk6hGRu5ns13L1mm5U3IOy/2wii6Qkqew7FU+Ibem5GklOcJW5iRY700p6Dqu5+1UNcf4gAgMZpgTm0IhVxJtiA8DIXBmwRhUoRujHZNLwwZzTy8+MFldK6oGPAqTu2DgWAOlclcF1zEuCzr8maC1Gj38zNE6DuHZxq8qPwvtAbbBSEaEQbdx/y8ah/suomxhMb4wFoIQ8FNQRYAGRx9jj9PIWYc32GF0XDBErS8FzIXx6kaSIGhVeLY4iGeGhTdgRpQ3ob1sYhoXjUgJK/3RvGN0sbIiiyW7wPtMVXKe0r4hne7o7i9fkji6bf9Jl6tSGcjtO77PE9x9dNUVu07u7+lVF6Gjjsc8hqBG/4GHopH0VLVcz26mJhoFRwKj4y/SOXPe7z8+h3rhOOdYv5KjByg5cBoRpQ/vHu9/f84c5Z3+1/rfn83NUnL8L0+TA8xBpYggNeia6VAn69g4eVVlVMp1q7qiast5Nd5bjfKqueXXNB9q/hVUtHtsbaohoSJBXHYqa9SkELosUabelO8spR8qtqV0Ka5KXzqo2BTbIF0K9sRGX9NK7LuA6bPUD5+KQuOHS5XvoH6iS5fyI+xZ/BjLK+S12H/0LtEjghbAlGB/yiMCAOE8O2PPoZ3K43OAvQ3sgxz4V3klzxMuXwYva0TJj9WU89BJsNciKcIFTDOgUYGRATxOXl2gTkFDQzc/5zmQeVTQ6lL2qp+gkdi2DVZWG43+ri6ByAP9ARa6YQj5U+gjR9RSX2RGC15oJC05a6+H80VJv4/UL1p8HSm2Wr8o+iei4AqJoj2UxjbAeo5wBtv0iWJ9Sxe2GQAkTshhW22i2NTGIql1paKnHSOpFJUHOVEU1L0i+FJRazSxM+b9Fe31TXhlKxWdbi87YzmRYkhVGcFSMYLR0yRmSABQFtNd3UkWQC12TuqBs8K0yn4SZ4Kenw2C/k+uOSL94z9OOnsDijL5f7tmLMGxXBPLC6EOnsryQiD5jVgXUN2zomlc+bJYjeGDFkX470Gbh1Ere+6cTFoggstXqgaCw3X9akoNa43VXTVUG0HUVBuuYNpHh3gyOj5vpfZPC7IcIV8i2JlACZExgqEIA0N6QDwqpGCl2MU6G1vgb0ZdFlXXkyN2kuuSiJSM6qYFLFeMdcahBAbyCj4jrivTaDm1ulgWwGQTIxN0meKlXIdYSo1+G2gGADLYAL8jmDl7yKExe6hu/wC+Jg5VGj/4SpoOvQK4f5qwPSKYaIyRYX/VDWLxDbXOBXNaDVg/ZgSPIIUOokNdx2ms5u60NZhrKWq0SAANNcSKWg3Lm2OBE4AXK9xvKFVXdfrtBD32CMFpwxH4K0c0Mspbb50mbylvsTlib4L0nvJIu/IXWtdOL6XrKAtFoE1Sj5X1AES1Mc0wW4tJMYKrV7zgtqWq1sb7WWsDM+Q/ARPBZiHkB1tbE0G85I0AePL5Q+ih8GKxkQVd/qEpwlL/gIYdKNBbq/2MVcK9OBRpiA5RhrsBFIG29/nG2yi1YBDe1PGcsZkBXA/sYwPxgngki16Gtr1sIF6E4z6LOkRco6AuTfD6YDAuwvpfoM5/2ntM6TJ7em7PWXcRvimqZf1sr1VOw/xnJXZjAI18NbNcGuaR4HYemAUt1rLitloLkt42tsXI+OScheHaosWMD1rAg0a3i+XdipzRipEvtuYC49UCNurVRtwKRhZVAdHhJGRFA9o6DEVjtyT0cDAIFFEugpPyG5yKfShj/ze5MJ4/Vn6D8dFYHlcgRtJVHYdRtcM1n+l2JRKFPZQ56JVRI46JKmXOgOhHg0PBcPEqHZHB4Uri1LUm3JiMiaAFZxIMIjhwmTRKlzY1TguCX6BlmsRWGjZqcVeWehYNMTKoVDCCp1VwNuTOKEMxGNDiogsH6IZORISRdBYjflhfwKrB8qPq0gsebMfoKxlVGX6KGkJCLZC9J8vWIZEDulW6VeAXd+K8Rlh5VqcahckCxDkhd5TkDgurJnWzzGqhg8e0vEZfO6EddVpaHLaE6tjSEbf1sOiob2oOshhIEgTtsIf4Qy24x4ncKQ5TTT1uqCGbrYe1xjqLzaX6KVmsZIpmNZ1ZPusCzJZ18U5X2IV1TjqXLqzV2XRYzhjVRW2RqKaq9w/8Qa//wyQ6MdHtuOOl6ZbpL93p7ErRiZNYs/Jq21QnNBv001+6w9GVUl7lIgyFcX+sNnYnzvcwfony6qTKd0M7Z6yAN/6s/ZfYbKo7MLnHrNnYnkYudQcmnDkXOG2HcQcm0c6o4jYj9bQ6YnWcswsT27EoS7U22skWEJ6zG1OSth2/9QvlGbPK3NFZyvHjt52zL1PyuHJ8Fnf0izRVnrHrtuO07Zx+byIon+D9mJn3Y8QobKW+pIJHm5jmr2Wrprlk0cjKHI2o6o0WNAg65vagodYn2Rh16MKZbKCQRLFgBqll7ipu08SwLC41dWDyyFLBxdUCNNQvAsjvKGK/is0+zA5azLOi/yKQU79gJqu/arjOyDBivCZS9dnVgJWgUv6Mz872E2ABY9XJQcj4qRqPIWNxAO/ZsYPq15XGBRFQflSPX40zs32OJLZfGa5P01U+VMGo+AmbGsmFIai/qwLWcZ/lznyWRw0w9lnKdoFSd9ZSt3Eqs2+o7PNExu/zRKr7PPGUbVSir2KuaZW9Sf7/oS46DnWdKWQaZeuEkTAV+IHICm+cUmGXhpzKjIu9Vvqo4q4bSLEJ+/j/iLx045DX58CuELDkIU6jFZqZ1J0XcdmqiMtf+Xd+xFXdb0tSR3n6rJFzn4VcZdx4ipkBtbDr1HjUdbYsukgH0yF2dY+PsRmqT7C949REkA7tvFkEg5T7nD3b+JQYPHfftiLrV2xk5LMqgn+PdWYU+nlWf8xj/bGx/piYZR/fH5Or2p/a8/VnfHj+3P58+0zs5rM9EpLj4zfj+4R5zytZnxIlrLv2sB2R1OwnatumUrGJ7UHSZMNUugWjkyj+uIFAE+CGw7yxtq6NmamI+LRBMLfGO1JqbVmqOpbW847Fxcriseod/3loCivlqxX0wYD1c8fJrfzymkiju74+c0Gj+2XROmMgHF685KuHas87dP74oT6L2Bhsagy0trdNywU8dkd7ZtKkhZunTTuTsmBreNWcBagrm8jyWgA5VKEDXvPRt1mC6O1znsWkEjwrsN0GcZdB+rbiUz/B8l7VfBnm5KzECTKJ1HawiJcJdD83tilbTRJj5hgXRtWQsvltNGhLRYM2dp6iPJzDbw/SxYMgBo4TMWmkcgmC8Ue41LCYdBmVAOKlsYtKXlHViaCy3Jir7bRGQmYajQgfW7Zwt3G3bbH8XHltyyOPbFFe09yhPD9UfpC7Yoh2/0kc+vrXh0Tmz5C19KTuAW0zKHgD7h9po1nepmbvMPlrW0s7Xj927HW66WNKPqb3vE4TyrHXfykQJbeX5mhu7+iyHoH0jD6+l75IX9yrvFipSQBtVcknNpAw2U5QNtwsWNhUwhC6L1XZqC6IMUJW82hEzizogkkgYBMjoAYVGior/GiTutGFP6lmhDGn35zAckhAB00YDMWwaDAMZzyXY1un0TBLYxrO4wenRBUL+3m2V4dWrdYcq2XK9Et0rNBCzXxKSiXxiVJXfaqfZir7iJw+z7g96B2q4/aoK8e9bJRw7VYLg21qvVGjG/dt1KGf5XZVh2LyIMQ38Ll/NpjM5w+CZUP/Yfel8/S7mZB/8HsYYYt+3i9upBb6/EXKvsP/8FdnKB/RF/AptjdeRe40oNu9LP6vHxfx1luBCryWVGoxUIR5MD1J4hCjcRrEXY9YGQOmawC37ZvzzJrTiDlYXQP+Q/yg4KaGyvF9c+YqUiWeWJUbN8uhYozdlMBELylwtZWlJoazfoee5yfO/tpxuSIeaJgmiIlslV1SixqhGgVgOsFXRT5+/E2NwPYnqSAgMclWt/ApdEDjPG7pwAr0grlUz8a+mZv7+zfPRI5Tz/o29qRyiB5OEQzvY5AaX+Wxs7G9ZHCvUZE4SD/zqNT6aFoqaulYUIIf22NSrSwQ1FwOAPOCoAPDoDfWmK02dT2GbMqNA4tZrMhvpv5ohDn80J3TmObhydYtZbJlK88qCFiUCcgGfw9vhT/+YUrO8vccIDPziGrRCzXOJMv56FXBEU7IzlJRcGJnBeysU/UYakrFGrZFVg0AHSZOLmdVnCpoDNwCH/HQ8ZhMXS+AzEvb6OO0jVU8Eqw15TD8TBm/SjDdMMWV4o9+PsOwCcbpOMLipXWsx0sYDjaxPVvVdQCc2mWgo4m5CyZ1m1bAXm7MjmtUsddYWTE6KThMIq5rkJ0iXMqeSjhbZAubdGyVUzCcQssZo5nKEbswtC83sPbobmVkBFO4I2oxCoLbfUNLZ0UfumT3UUwBS8waYn2Q2ucapHANm38OQ7cFXp9Sly2o2VGsAZ7i/NP7rAaYi8v6uMxZCgbtJ7iTJ6/9hB/meL2hUgGMFM6mbMGsXxfkUzpOapE+klroCDtwhEXRykSq1gVJDPtj5Kx3XDU4VavBAZnUlHBr10oG0QYkqqFqjZ5GLBhMqB9FARFIbS43lluMUp6r4grE+5iJUfIjFVTNPACJy4+UV1EfPYMNNGx/D+Q5DUNxDsD+VlLdv7gpUUm12ERXVufCGIorymQzG3VlRcqyttID7z7wAALWBx54l66FkcIRrh94AFrQMuMlrsiAw+i7WHOjEPUTgsSeY/VWGN8fOW98P4V1VyP4bzSv5gzgUs80JuBvbGW3Vewi5FndFsfqtli7nozm4S4V8pWaLg7zHaIAjfj6WCL/F8P1u2sAAHjaY2BkYGBgZjjy6Mpmh3h+m68M8hwMIHDua+N+ZJqDgQNCMYEoAHf+C1gAeNpjYGRg4GD4fwNEMjD8/w8kgSIogBUAY/wD9XjaNU+7FcJADJNNCvq87MMOvEdNxRyq0mWH1GEWegZhACz54nvnj+yTzvGDLQ8gKr8iEQDBRDKqgmqZMMq7/y5kd/UdCLFiC+ITZiivaz6fR0er6d054SksUgzmU3qFEXdFzV2Ez8Ywlc/m5Pilsr2VWitP/bGJ4wvDWi96P3Not+n2B3lgIYIAAAAmACYAJgAuAJIA3gFaAaABrgHkAjoC1AMkA4IEUAUiBXAFzgYgBw4H7ghiCPYJsgp4Cq4LCAs2C4AMHAyiDiAPnBBAEUYRvBMwE7wUHhRaFIYUshTcFVAVgBX6FpYXXBeSF/AYYBkCGYgaBhooGkoa1BryGyQbQBtsG5Yb+Bw2HLAdLh1yHYYdsh4cHjYeYB7iHyYf3iAgIFIgdCCaILIgxiDcIPAhBiEkIegiOCK6IxAjeCPQJDQkbCS8JVIlriYWJjomWCZ2JpQmoib0J3QnvCgGKJAopii8KQApIilMKcgqJCpiKpwqyCsUK2QrvCwWLFYsnizgLPYtBC0SLSAAAAABAAAAgAC9ABAAAAAAAAIAAQACABYAAAEAAYEAAAAAeNqNkr1OAkEUhc8CmmBhRSysNtFCTfiXqFBZiIkaQzRqZ7KaBYz8CStg4/PpC1j6EJZWfjMMwSCFmczOuWfOPffOzEpa0avi8hJJSZ/MCfaUIprgmFb15XBcZW+qSWjTKzu8pLF36/Ay/IfDSa173w6/aS2WcvhdudiOjlXTmXwNFaqvgR7UVYe4wOzC+AqIX1hboMiq/qpHoEhNUN0yESjUWPd8e0RT3RaaiNFTWVnGyI6MGuw+s5qKDfgWGSa3Q42QmYXtwabxD/SE0vi0YTZUdRWP/tTb5nTGw/Rq/LrW74K4QTVznr6KeOUYRVV0pVPd6By0KC89l7lI489prufu6Xe1mi5hJtGMbaKMnN+Q/bzdy2iPb4UTB3rE02jqsOae7nirjEp27uNR0MG/+j+BD21Xh+y24Qf2tjvcQYjr7CUnPVStm09eYLPycKb/Em9Zoq755u2fk2Pd/QGe+3ARAAB42m3S1XIUURRG4VmDBHd3d5k+Z5/uBIdAcHd3CRI0OBRPyCshmRWu6Kqp/6brm9qrutVujTy/frZS63/Pjz8/Wm3ajGEs4xhPDxOYyCQmM4WpTGM6M5jJLGYzh7nMYz4LWMgiFrOEpSxjOStYySpWs4a1rGM9G9jIJjazha1sYzsdKhKZoFDT0EsfO9jJLnazh73sYz8H6OcghxjgMEc4yjGOc4KTnOI0ZzjLOc5zgYtc4jJXuMo1rnODm9ziNne4yz3u84CHPOIxTxjkKc94zguGeMkrXvOGt7xjmPd84COf+MwXvvKN7z3DQ4OpDPT/3YGq03ErN7nZDbe4tdu4vW7fyCa9pJf0kl7SS3pJL+klvTTqVXqVXqVX6VV6lV6lV+lVepVe0kt6SS/pJb3U9bL3ZO/J3pO9J3tP7oy+X7uN2/3/0Amd0Amd0Amd0Amd+Od07wi7hF3CLmGXsEvYJewSdgm7hF3CLmGXsEvYJewSdomkl/SSXtLLelkv62W9rJf1sl7Wy3pZL/RCL/RCL/RCL/RCL/RCr+gVvaJX9Ipe0St6Ra/oFb1ar9ar9Wq9Wq/Wq/VqvVqv1mv0Gr1Gr9Frul7xuyp+V8XvqnTyb1UoNRm4Af+FsAGNAEuwCFBYsQEBjlmxRgYrWCGwEFlLsBRSWCGwgFkdsAYrXFhZsBQrAAAAAVLP0T8AAA==) format('woff'),\n         url('font/genericons-regular-webfont.ttf') format('truetype'),\n         url('font/genericons-regular-webfont.svg#genericonsregular') format('svg');\n    font-weight: normal;\n    font-style: normal;\n}\n\n\n/**\n * All Genericons\n */\n\n.genericon {\n\tdisplay: inline-block;\n\twidth: 16px;\n\theight: 16px;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tfont-size: 16px;\n\tline-height: 1;\n\tfont-family: 'Genericons';\n\ttext-decoration: inherit;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tvertical-align: top;\n}\n\n/**\n * IE7 and IE6 hacks\n */\n\n.genericon {\n\t*overflow: auto;\n\t*zoom: 1;\n\t*display: inline;\n}\n\n/**\n * Individual icons\n */\n\n/* Post formats */\n.genericon-standard:before {        content: '\\f100'; }\n.genericon-aside:before {           content: '\\f101'; }\n.genericon-image:before {           content: '\\f102'; }\n.genericon-gallery:before {         content: '\\f103'; }\n.genericon-video:before {           content: '\\f104'; }\n.genericon-status:before {          content: '\\f105'; }\n.genericon-quote:before {           content: '\\f106'; }\n.genericon-link:before {            content: '\\f107'; }\n.genericon-chat:before {            content: '\\f108'; }\n.genericon-audio:before {           content: '\\f109'; }\n\n/* Social icons */\n.genericon-github:before {          content: '\\f200'; }\n.genericon-dribbble:before {        content: '\\f201'; }\n.genericon-twitter:before {         content: '\\f202'; }\n.genericon-facebook:before {        content: '\\f203'; }\n.genericon-facebook-alt:before {    content: '\\f204'; }\n.genericon-wordpress:before {       content: '\\f205'; }\n.genericon-googleplus:before {      content: '\\f206'; }\n.genericon-linkedin:before {        content: '\\f207'; }\n.genericon-linkedin-alt:before {    content: '\\f208'; }\n.genericon-pinterest:before {       content: '\\f209'; }\n.genericon-pinterest-alt:before {   content: '\\f210'; }\n.genericon-flickr:before {          content: '\\f211'; }\n.genericon-vimeo:before {           content: '\\f212'; }\n.genericon-youtube:before {         content: '\\f213'; }\n.genericon-tumblr:before {          content: '\\f214'; }\n.genericon-instagram:before {       content: '\\f215'; }\n.genericon-codepen:before {         content: '\\f216'; }\n.genericon-polldaddy:before {       content: '\\f217'; }\n.genericon-googleplus-alt:before {  content: '\\f218'; }\n.genericon-path:before {            content: '\\f219'; }\n.genericon-skype:before {           content: '\\f220'; }\n.genericon-digg:before {            content: '\\f221'; }\n.genericon-reddit:before {          content: '\\f222'; }\n.genericon-stumbleupon:before {     content: '\\f223'; }\n.genericon-pocket:before {          content: '\\f224'; }\n.genericon-dropbox:before {         content: '\\f225'; }\n\n/* Meta icons */\n.genericon-comment:before {         content: '\\f300'; }\n.genericon-category:before {        content: '\\f301'; }\n.genericon-tag:before {             content: '\\f302'; }\n.genericon-time:before {            content: '\\f303'; }\n.genericon-user:before {            content: '\\f304'; }\n.genericon-day:before {             content: '\\f305'; }\n.genericon-week:before {            content: '\\f306'; }\n.genericon-month:before {           content: '\\f307'; }\n.genericon-pinned:before {          content: '\\f308'; }\n\n/* Other icons */\n.genericon-search:before {          content: '\\f400'; }\n.genericon-unzoom:before {          content: '\\f401'; }\n.genericon-zoom:before {            content: '\\f402'; }\n.genericon-show:before {            content: '\\f403'; }\n.genericon-hide:before {            content: '\\f404'; }\n.genericon-close:before {           content: '\\f405'; }\n.genericon-close-alt:before {       content: '\\f406'; }\n.genericon-trash:before {           content: '\\f407'; }\n.genericon-star:before {            content: '\\f408'; }\n.genericon-home:before {            content: '\\f409'; }\n.genericon-mail:before {            content: '\\f410'; }\n.genericon-edit:before {            content: '\\f411'; }\n.genericon-reply:before {           content: '\\f412'; }\n.genericon-feed:before {            content: '\\f413'; }\n.genericon-warning:before {         content: '\\f414'; }\n.genericon-share:before {           content: '\\f415'; }\n.genericon-attachment:before {      content: '\\f416'; }\n.genericon-location:before {        content: '\\f417'; }\n.genericon-checkmark:before {       content: '\\f418'; }\n.genericon-menu:before {            content: '\\f419'; }\n.genericon-refresh:before {         content: '\\f420'; }\n.genericon-minimize:before {        content: '\\f421'; }\n.genericon-maximize:before {        content: '\\f422'; }\n.genericon-404:before {             content: '\\f423'; }\n.genericon-spam:before {            content: '\\f424'; }\n.genericon-summary:before {         content: '\\f425'; }\n.genericon-cloud:before {           content: '\\f426'; }\n.genericon-key:before {             content: '\\f427'; }\n.genericon-dot:before {             content: '\\f428'; }\n.genericon-next:before {            content: '\\f429'; }\n.genericon-previous:before {        content: '\\f430'; }\n.genericon-expand:before {          content: '\\f431'; }\n.genericon-collapse:before {        content: '\\f432'; }\n.genericon-dropdown:before {        content: '\\f433'; }\n.genericon-dropdown-left:before {   content: '\\f434'; }\n.genericon-top:before {             content: '\\f435'; }\n.genericon-draggable:before {       content: '\\f436'; }\n.genericon-phone:before {           content: '\\f437'; }\n.genericon-send-to-phone:before {   content: '\\f438'; }\n.genericon-plugin:before {          content: '\\f439'; }\n.genericon-cloud-download:before {  content: '\\f440'; }\n.genericon-cloud-upload:before {    content: '\\f441'; }\n.genericon-external:before {        content: '\\f442'; }\n.genericon-document:before {        content: '\\f443'; }\n.genericon-book:before {            content: '\\f444'; }\n.genericon-cog:before {             content: '\\f445'; }\n.genericon-unapprove:before {       content: '\\f446'; }\n.genericon-cart:before {            content: '\\f447'; }\n.genericon-pause:before {           content: '\\f448'; }\n.genericon-stop:before {            content: '\\f449'; }\n.genericon-skip-back:before {       content: '\\f450'; }\n.genericon-skip-ahead:before {      content: '\\f451'; }\n.genericon-play:before {            content: '\\f452'; }\n.genericon-tablet:before {          content: '\\f453'; }\n.genericon-send-to-tablet:before {  content: '\\f454'; }\n.genericon-info:before {            content: '\\f455'; }\n.genericon-notice:before {          content: '\\f456'; }\n.genericon-help:before {            content: '\\f457'; }\n.genericon-fastforward:before {     content: '\\f458'; }\n.genericon-rewind:before {          content: '\\f459'; }\n.genericon-portfolio:before {       content: '\\f460'; }\n.genericon-heart:before {           content: '\\f461'; }\n.genericon-code:before {            content: '\\f462'; }\n.genericon-subscribe:before {       content: '\\f463'; }\n.genericon-unsubscribe:before {     content: '\\f464'; }\n.genericon-subscribed:before {      content: '\\f465'; }\n.genericon-reply-alt:before {       content: '\\f466'; }\n.genericon-reply-single:before {    content: '\\f467'; }\n.genericon-flag:before {            content: '\\f468'; }\n.genericon-print:before {           content: '\\f469'; }\n.genericon-lock:before {            content: '\\f470'; }\n.genericon-bold:before {            content: '\\f471'; }\n.genericon-italic:before {          content: '\\f472'; }\n.genericon-picture:before {         content: '\\f473'; }\n.genericon-fullscreen:before {      content: '\\f474'; }\n\n/* Generic shapes */\n.genericon-uparrow:before {         content: '\\f500'; }\n.genericon-rightarrow:before {      content: '\\f501'; }\n.genericon-downarrow:before {       content: '\\f502'; }\n.genericon-leftarrow:before {       content: '\\f503'; }\n\n\n\n\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/header.php",
    "content": "<?php\n/**\n * The Header for our theme\n *\n * Displays all of the <head> section and everything up till <div id=\"main\">\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?><!DOCTYPE html>\n<!--[if IE 7]>\n<html class=\"ie ie7\" <?php language_attributes(); ?>>\n<![endif]-->\n<!--[if IE 8]>\n<html class=\"ie ie8\" <?php language_attributes(); ?>>\n<![endif]-->\n<!--[if !(IE 7) & !(IE 8)]><!-->\n<html <?php language_attributes(); ?>>\n<!--<![endif]-->\n<head>\n\t<meta charset=\"<?php bloginfo( 'charset' ); ?>\">\n\t<meta name=\"viewport\" content=\"width=device-width\">\n\t<title><?php wp_title( '|', true, 'right' ); ?></title>\n\t<link rel=\"profile\" href=\"http://gmpg.org/xfn/11\">\n\t<link rel=\"pingback\" href=\"<?php bloginfo( 'pingback_url' ); ?>\">\n\t<!--[if lt IE 9]>\n\t<script src=\"<?php echo get_template_directory_uri(); ?>/js/html5.js\"></script>\n\t<![endif]-->\n\t<?php wp_head(); ?>\n</head>\n\n<body <?php body_class(); ?>>\n<div id=\"page\" class=\"hfeed site\">\n\t<?php if ( get_header_image() ) : ?>\n\t<div id=\"site-header\">\n\t\t<a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" rel=\"home\">\n\t\t\t<img src=\"<?php header_image(); ?>\" width=\"<?php echo get_custom_header()->width; ?>\" height=\"<?php echo get_custom_header()->height; ?>\" alt=\"<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>\">\n\t\t</a>\n\t</div>\n\t<?php endif; ?>\n\n\t<header id=\"masthead\" class=\"site-header\" role=\"banner\">\n\t\t<div class=\"header-main\">\n\t\t\t<h1 class=\"site-title\"><a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" rel=\"home\"><?php bloginfo( 'name' ); ?></a></h1>\n\n\t\t\t<div class=\"search-toggle\">\n\t\t\t\t<a href=\"#search-container\" class=\"screen-reader-text\" aria-expanded=\"false\" aria-controls=\"search-container\"><?php _e( 'Search', 'twentyfourteen' ); ?></a>\n\t\t\t</div>\n\n\t\t\t<nav id=\"primary-navigation\" class=\"site-navigation primary-navigation\" role=\"navigation\">\n\t\t\t\t<button class=\"menu-toggle\"><?php _e( 'Primary Menu', 'twentyfourteen' ); ?></button>\n\t\t\t\t<a class=\"screen-reader-text skip-link\" href=\"#content\"><?php _e( 'Skip to content', 'twentyfourteen' ); ?></a>\n\t\t\t\t<?php wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu', 'menu_id' => 'primary-menu' ) ); ?>\n\t\t\t</nav>\n\t\t</div>\n\n\t\t<div id=\"search-container\" class=\"search-box-wrapper hide\">\n\t\t\t<div class=\"search-box\">\n\t\t\t\t<?php get_search_form(); ?>\n\t\t\t</div>\n\t\t</div>\n\t</header><!-- #masthead -->\n\n\t<div id=\"main\" class=\"site-main\">\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/image.php",
    "content": "<?php\n/**\n * The template for displaying image attachments\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\n// Retrieve attachment metadata.\n$metadata = wp_get_attachment_metadata();\n\nget_header();\n?>\n\n\t<section id=\"primary\" class=\"content-area image-attachment\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t<?php\n\t\t// Start the Loop.\n\t\twhile ( have_posts() ) : the_post();\n\t?>\n\t\t\t<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t\t\t\t<header class=\"entry-header\">\n\t\t\t\t\t<?php the_title( '<h1 class=\"entry-title\">', '</h1>' ); ?>\n\n\t\t\t\t\t<div class=\"entry-meta\">\n\n\t\t\t\t\t\t<span class=\"entry-date\"><time class=\"entry-date\" datetime=\"<?php echo esc_attr( get_the_date( 'c' ) ); ?>\"><?php echo esc_html( get_the_date() ); ?></time></span>\n\n\t\t\t\t\t\t<span class=\"full-size-link\"><a href=\"<?php echo esc_url( wp_get_attachment_url() ); ?>\"><?php echo esc_html( $metadata['width'] ); ?> &times; <?php echo esc_html( $metadata['height'] ); ?></a></span>\n\n\t\t\t\t\t\t<span class=\"parent-post-link\"><a href=\"<?php echo esc_url( get_permalink( $post->post_parent ) ); ?>\" rel=\"gallery\"><?php echo get_the_title( $post->post_parent ); ?></a></span>\n\t\t\t\t\t\t<?php edit_post_link( __( 'Edit', 'twentyfourteen' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t\t\t\t</div><!-- .entry-meta -->\n\t\t\t\t</header><!-- .entry-header -->\n\n\t\t\t\t<div class=\"entry-content\">\n\t\t\t\t\t<div class=\"entry-attachment\">\n\t\t\t\t\t\t<div class=\"attachment\">\n\t\t\t\t\t\t\t<?php twentyfourteen_the_attached_image(); ?>\n\t\t\t\t\t\t</div><!-- .attachment -->\n\n\t\t\t\t\t\t<?php if ( has_excerpt() ) : ?>\n\t\t\t\t\t\t<div class=\"entry-caption\">\n\t\t\t\t\t\t\t<?php the_excerpt(); ?>\n\t\t\t\t\t\t</div><!-- .entry-caption -->\n\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t</div><!-- .entry-attachment -->\n\n\t\t\t\t\t<?php\n\t\t\t\t\t\tthe_content();\n\t\t\t\t\t\twp_link_pages( array(\n\t\t\t\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentyfourteen' ) . '</span>',\n\t\t\t\t\t\t\t'after'       => '</div>',\n\t\t\t\t\t\t\t'link_before' => '<span>',\n\t\t\t\t\t\t\t'link_after'  => '</span>',\n\t\t\t\t\t\t) );\n\t\t\t\t\t?>\n\t\t\t\t</div><!-- .entry-content -->\n\t\t\t</article><!-- #post-## -->\n\n\t\t\t<nav id=\"image-navigation\" class=\"navigation image-navigation\">\n\t\t\t\t<div class=\"nav-links\">\n\t\t\t\t<?php previous_image_link( false, '<div class=\"previous-image\">' . __( 'Previous Image', 'twentyfourteen' ) . '</div>' ); ?>\n\t\t\t\t<?php next_image_link( false, '<div class=\"next-image\">' . __( 'Next Image', 'twentyfourteen' ) . '</div>' ); ?>\n\t\t\t\t</div><!-- .nav-links -->\n\t\t\t</nav><!-- #image-navigation -->\n\n\t\t\t<?php comments_template(); ?>\n\n\t\t<?php endwhile; // end of the loop. ?>\n\n\t\t</div><!-- #content -->\n\t</section><!-- #primary -->\n\n<?php\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/inc/back-compat.php",
    "content": "<?php\n/**\n * Twenty Fourteen back compat functionality\n *\n * Prevents Twenty Fourteen from running on WordPress versions prior to 3.6,\n * since this theme is not meant to be backward compatible beyond that\n * and relies on many newer functions and markup changes introduced in 3.6.\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\n/**\n * Prevent switching to Twenty Fourteen on old versions of WordPress.\n *\n * Switches to the default theme.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_switch_theme() {\n\tswitch_theme( WP_DEFAULT_THEME, WP_DEFAULT_THEME );\n\tunset( $_GET['activated'] );\n\tadd_action( 'admin_notices', 'twentyfourteen_upgrade_notice' );\n}\nadd_action( 'after_switch_theme', 'twentyfourteen_switch_theme' );\n\n/**\n * Add message for unsuccessful theme switch.\n *\n * Prints an update nag after an unsuccessful attempt to switch to\n * Twenty Fourteen on WordPress versions prior to 3.6.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_upgrade_notice() {\n\t$message = sprintf( __( 'Twenty Fourteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again.', 'twentyfourteen' ), $GLOBALS['wp_version'] );\n\tprintf( '<div class=\"error\"><p>%s</p></div>', $message );\n}\n\n/**\n * Prevent the Customizer from being loaded on WordPress versions prior to 3.6.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_customize() {\n\twp_die( sprintf( __( 'Twenty Fourteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again.', 'twentyfourteen' ), $GLOBALS['wp_version'] ), '', array(\n\t\t'back_link' => true,\n\t) );\n}\nadd_action( 'load-customize.php', 'twentyfourteen_customize' );\n\n/**\n * Prevent the Theme Preview from being loaded on WordPress versions prior to 3.4.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_preview() {\n\tif ( isset( $_GET['preview'] ) ) {\n\t\twp_die( sprintf( __( 'Twenty Fourteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again.', 'twentyfourteen' ), $GLOBALS['wp_version'] ) );\n\t}\n}\nadd_action( 'template_redirect', 'twentyfourteen_preview' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/inc/custom-header.php",
    "content": "<?php\n/**\n * Implement Custom Header functionality for Twenty Fourteen\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\n/**\n * Set up the WordPress core custom header settings.\n *\n * @since Twenty Fourteen 1.0\n *\n * @uses twentyfourteen_header_style()\n * @uses twentyfourteen_admin_header_style()\n * @uses twentyfourteen_admin_header_image()\n */\nfunction twentyfourteen_custom_header_setup() {\n\t/**\n\t * Filter Twenty Fourteen custom-header support arguments.\n\t *\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array $args {\n\t *     An array of custom-header support arguments.\n\t *\n\t *     @type bool   $header_text            Whether to display custom header text. Default false.\n\t *     @type int    $width                  Width in pixels of the custom header image. Default 1260.\n\t *     @type int    $height                 Height in pixels of the custom header image. Default 240.\n\t *     @type bool   $flex_height            Whether to allow flexible-height header images. Default true.\n\t *     @type string $admin_head_callback    Callback function used to style the image displayed in\n\t *                                          the Appearance > Header screen.\n\t *     @type string $admin_preview_callback Callback function used to create the custom header markup in\n\t *                                          the Appearance > Header screen.\n\t * }\n\t */\n\tadd_theme_support( 'custom-header', apply_filters( 'twentyfourteen_custom_header_args', array(\n\t\t'default-text-color'     => 'fff',\n\t\t'width'                  => 1260,\n\t\t'height'                 => 240,\n\t\t'flex-height'            => true,\n\t\t'wp-head-callback'       => 'twentyfourteen_header_style',\n\t\t'admin-head-callback'    => 'twentyfourteen_admin_header_style',\n\t\t'admin-preview-callback' => 'twentyfourteen_admin_header_image',\n\t) ) );\n}\nadd_action( 'after_setup_theme', 'twentyfourteen_custom_header_setup' );\n\nif ( ! function_exists( 'twentyfourteen_header_style' ) ) :\n/**\n * Styles the header image and text displayed on the blog\n *\n * @see twentyfourteen_custom_header_setup().\n *\n */\nfunction twentyfourteen_header_style() {\n\t$text_color = get_header_textcolor();\n\n\t// If no custom color for text is set, let's bail.\n\tif ( display_header_text() && $text_color === get_theme_support( 'custom-header', 'default-text-color' ) )\n\t\treturn;\n\n\t// If we get this far, we have custom styles.\n\t?>\n\t<style type=\"text/css\" id=\"twentyfourteen-header-css\">\n\t<?php\n\t\t// Has the text been hidden?\n\t\tif ( ! display_header_text() ) :\n\t?>\n\t\t.site-title,\n\t\t.site-description {\n\t\t\tclip: rect(1px 1px 1px 1px); /* IE7 */\n\t\t\tclip: rect(1px, 1px, 1px, 1px);\n\t\t\tposition: absolute;\n\t\t}\n\t<?php\n\t\t// If the user has set a custom color for the text, use that.\n\t\telseif ( $text_color != get_theme_support( 'custom-header', 'default-text-color' ) ) :\n\t?>\n\t\t.site-title a {\n\t\t\tcolor: #<?php echo esc_attr( $text_color ); ?>;\n\t\t}\n\t<?php endif; ?>\n\t</style>\n\t<?php\n}\nendif; // twentyfourteen_header_style\n\n\nif ( ! function_exists( 'twentyfourteen_admin_header_style' ) ) :\n/**\n * Style the header image displayed on the Appearance > Header screen.\n *\n * @see twentyfourteen_custom_header_setup()\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_admin_header_style() {\n?>\n\t<style type=\"text/css\" id=\"twentyfourteen-admin-header-css\">\n\t.appearance_page_custom-header #headimg {\n\t\tbackground-color: #000;\n\t\tborder: none;\n\t\tmax-width: 1260px;\n\t\tmin-height: 48px;\n\t}\n\t#headimg h1 {\n\t\tfont-family: Lato, sans-serif;\n\t\tfont-size: 18px;\n\t\tline-height: 48px;\n\t\tmargin: 0 0 0 30px;\n\t}\n\t.rtl #headimg h1  {\n\t\tmargin: 0 30px 0 0;\n\t}\n\t#headimg h1 a {\n\t\tcolor: #fff;\n\t\ttext-decoration: none;\n\t}\n\t#headimg img {\n\t\tvertical-align: middle;\n\t}\n\t</style>\n<?php\n}\nendif; // twentyfourteen_admin_header_style\n\nif ( ! function_exists( 'twentyfourteen_admin_header_image' ) ) :\n/**\n * Create the custom header image markup displayed on the Appearance > Header screen.\n *\n * @see twentyfourteen_custom_header_setup()\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_admin_header_image() {\n?>\n\t<div id=\"headimg\">\n\t\t<?php if ( get_header_image() ) : ?>\n\t\t<img src=\"<?php header_image(); ?>\" alt=\"\">\n\t\t<?php endif; ?>\n\t\t<h1 class=\"displaying-header-text\"><a id=\"name\" style=\"<?php echo esc_attr( sprintf( 'color: #%s;', get_header_textcolor() ) ); ?>\" onclick=\"return false;\" href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" tabindex=\"-1\"><?php bloginfo( 'name' ); ?></a></h1>\n\t</div>\n<?php\n}\nendif; // twentyfourteen_admin_header_image\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/inc/customizer.php",
    "content": "<?php\n/**\n * Twenty Fourteen Customizer support\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\n/**\n * Implement Customizer additions and adjustments.\n *\n * @since Twenty Fourteen 1.0\n *\n * @param WP_Customize_Manager $wp_customize Customizer object.\n */\nfunction twentyfourteen_customize_register( $wp_customize ) {\n\t// Add postMessage support for site title and description.\n\t$wp_customize->get_setting( 'blogname' )->transport         = 'postMessage';\n\t$wp_customize->get_setting( 'blogdescription' )->transport  = 'postMessage';\n\t$wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage';\n\n\t// Rename the label to \"Site Title Color\" because this only affects the site title in this theme.\n\t$wp_customize->get_control( 'header_textcolor' )->label = __( 'Site Title Color', 'twentyfourteen' );\n\n\t// Rename the label to \"Display Site Title & Tagline\" in order to make this option extra clear.\n\t$wp_customize->get_control( 'display_header_text' )->label = __( 'Display Site Title &amp; Tagline', 'twentyfourteen' );\n\n\t// Add custom description to Colors and Background controls or sections.\n\tif ( property_exists( $wp_customize->get_control( 'background_color' ), 'description' ) ) {\n\t\t$wp_customize->get_control( 'background_color' )->description = __( 'May only be visible on wide screens.', 'twentyfourteen' );\n\t\t$wp_customize->get_control( 'background_image' )->description = __( 'May only be visible on wide screens.', 'twentyfourteen' );\n\t} else {\n\t\t$wp_customize->get_section( 'colors' )->description           = __( 'Background may only be visible on wide screens.', 'twentyfourteen' );\n\t\t$wp_customize->get_section( 'background_image' )->description = __( 'Background may only be visible on wide screens.', 'twentyfourteen' );\n\t}\n\n\t// Add the featured content section in case it's not already there.\n\t$wp_customize->add_section( 'featured_content', array(\n\t\t'title'           => __( 'Featured Content', 'twentyfourteen' ),\n\t\t'description'     => sprintf( __( 'Use a <a href=\"%1$s\">tag</a> to feature your posts. If no posts match the tag, <a href=\"%2$s\">sticky posts</a> will be displayed instead.', 'twentyfourteen' ),\n\t\t\tesc_url( add_query_arg( 'tag', _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ), admin_url( 'edit.php' ) ) ),\n\t\t\tadmin_url( 'edit.php?show_sticky=1' )\n\t\t),\n\t\t'priority'        => 130,\n\t\t'active_callback' => 'is_front_page',\n\t) );\n\n\t// Add the featured content layout setting and control.\n\t$wp_customize->add_setting( 'featured_content_layout', array(\n\t\t'default'           => 'grid',\n\t\t'sanitize_callback' => 'twentyfourteen_sanitize_layout',\n\t) );\n\n\t$wp_customize->add_control( 'featured_content_layout', array(\n\t\t'label'   => __( 'Layout', 'twentyfourteen' ),\n\t\t'section' => 'featured_content',\n\t\t'type'    => 'select',\n\t\t'choices' => array(\n\t\t\t'grid'   => __( 'Grid',   'twentyfourteen' ),\n\t\t\t'slider' => __( 'Slider', 'twentyfourteen' ),\n\t\t),\n\t) );\n}\nadd_action( 'customize_register', 'twentyfourteen_customize_register' );\n\n/**\n * Sanitize the Featured Content layout value.\n *\n * @since Twenty Fourteen 1.0\n *\n * @param string $layout Layout type.\n * @return string Filtered layout type (grid|slider).\n */\nfunction twentyfourteen_sanitize_layout( $layout ) {\n\tif ( ! in_array( $layout, array( 'grid', 'slider' ) ) ) {\n\t\t$layout = 'grid';\n\t}\n\n\treturn $layout;\n}\n\n/**\n * Bind JS handlers to make Customizer preview reload changes asynchronously.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_customize_preview_js() {\n\twp_enqueue_script( 'twentyfourteen_customizer', get_template_directory_uri() . '/js/customizer.js', array( 'customize-preview' ), '20131205', true );\n}\nadd_action( 'customize_preview_init', 'twentyfourteen_customize_preview_js' );\n\n/**\n * Add contextual help to the Themes and Post edit screens.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_contextual_help() {\n\tif ( 'admin_head-edit.php' === current_filter() && 'post' !== $GLOBALS['typenow'] ) {\n\t\treturn;\n\t}\n\n\tget_current_screen()->add_help_tab( array(\n\t\t'id'      => 'twentyfourteen',\n\t\t'title'   => __( 'Twenty Fourteen', 'twentyfourteen' ),\n\t\t'content' =>\n\t\t\t'<ul>' .\n\t\t\t\t'<li>' . sprintf( __( 'The home page features your choice of up to 6 posts prominently displayed in a grid or slider, controlled by a <a href=\"%1$s\">tag</a>; you can change the tag and layout in <a href=\"%2$s\">Appearance &rarr; Customize</a>. If no posts match the tag, <a href=\"%3$s\">sticky posts</a> will be displayed instead.', 'twentyfourteen' ), esc_url( add_query_arg( 'tag', _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ), admin_url( 'edit.php' ) ) ), admin_url( 'customize.php' ), admin_url( 'edit.php?show_sticky=1' ) ) . '</li>' .\n\t\t\t\t'<li>' . sprintf( __( 'Enhance your site design by using <a href=\"%s\">Featured Images</a> for posts you&rsquo;d like to stand out (also known as post thumbnails). This allows you to associate an image with your post without inserting it. Twenty Fourteen uses featured images for posts and pages&mdash;above the title&mdash;and in the Featured Content area on the home page.', 'twentyfourteen' ), 'https://codex.wordpress.org/Post_Thumbnails#Setting_a_Post_Thumbnail' ) . '</li>' .\n\t\t\t\t'<li>' . sprintf( __( 'For an in-depth tutorial, and more tips and tricks, visit the <a href=\"%s\">Twenty Fourteen documentation</a>.', 'twentyfourteen' ), 'https://codex.wordpress.org/Twenty_Fourteen' ) . '</li>' .\n\t\t\t'</ul>',\n\t) );\n}\nadd_action( 'admin_head-themes.php', 'twentyfourteen_contextual_help' );\nadd_action( 'admin_head-edit.php',   'twentyfourteen_contextual_help' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/inc/featured-content.php",
    "content": "<?php\n/**\n * Twenty Fourteen Featured Content\n *\n * This module allows you to define a subset of posts to be displayed\n * in the theme's Featured Content area.\n *\n * For maximum compatibility with different methods of posting users\n * will designate a featured post tag to associate posts with. Since\n * this tag now has special meaning beyond that of a normal tags, users\n * will have the ability to hide it from the front-end of their site.\n */\nclass Featured_Content {\n\n\t/**\n\t * The maximum number of posts a Featured Content area can contain.\n\t *\n\t * We define a default value here but themes can override\n\t * this by defining a \"max_posts\" entry in the second parameter\n\t * passed in the call to add_theme_support( 'featured-content' ).\n\t *\n\t * @see Featured_Content::init()\n\t *\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @static\n\t * @access public\n\t * @var int\n\t */\n\tpublic static $max_posts = 15;\n\n\t/**\n\t * Instantiate.\n\t *\n\t * All custom functionality will be hooked into the \"init\" action.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t */\n\tpublic static function setup() {\n\t\tadd_action( 'init', array( __CLASS__, 'init' ), 30 );\n\t}\n\n\t/**\n\t * Conditionally hook into WordPress.\n\t *\n\t * Theme must declare that they support this module by adding\n\t * add_theme_support( 'featured-content' ); during after_setup_theme.\n\t *\n\t * If no theme support is found there is no need to hook into WordPress.\n\t * We'll just return early instead.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t */\n\tpublic static function init() {\n\t\t$theme_support = get_theme_support( 'featured-content' );\n\n\t\t// Return early if theme does not support Featured Content.\n\t\tif ( ! $theme_support ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/*\n\t\t * An array of named arguments must be passed as the second parameter\n\t\t * of add_theme_support().\n\t\t */\n\t\tif ( ! isset( $theme_support[0] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return early if \"featured_content_filter\" has not been defined.\n\t\tif ( ! isset( $theme_support[0]['featured_content_filter'] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$filter = $theme_support[0]['featured_content_filter'];\n\n\t\t// Theme can override the number of max posts.\n\t\tif ( isset( $theme_support[0]['max_posts'] ) ) {\n\t\t\tself::$max_posts = absint( $theme_support[0]['max_posts'] );\n\t\t}\n\n\t\tadd_filter( $filter,                              array( __CLASS__, 'get_featured_posts' )    );\n\t\tadd_action( 'customize_register',                 array( __CLASS__, 'customize_register' ), 9 );\n\t\tadd_action( 'admin_init',                         array( __CLASS__, 'register_setting'   )    );\n\t\tadd_action( 'switch_theme',                       array( __CLASS__, 'delete_transient'   )    );\n\t\tadd_action( 'save_post',                          array( __CLASS__, 'delete_transient'   )    );\n\t\tadd_action( 'delete_post_tag',                    array( __CLASS__, 'delete_post_tag'    )    );\n\t\tadd_action( 'customize_controls_enqueue_scripts', array( __CLASS__, 'enqueue_scripts'    )    );\n\t\tadd_action( 'pre_get_posts',                      array( __CLASS__, 'pre_get_posts'      )    );\n\t\tadd_action( 'wp_loaded',                          array( __CLASS__, 'wp_loaded'          )    );\n\t}\n\n\t/**\n\t * Hide \"featured\" tag from the front-end.\n\t *\n\t * Has to run on wp_loaded so that the preview filters of the Customizer\n\t * have a chance to alter the value.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t */\n\tpublic static function wp_loaded() {\n\t\tif ( self::get_setting( 'hide-tag' ) ) {\n\t\t\tadd_filter( 'get_terms',     array( __CLASS__, 'hide_featured_term'     ), 10, 3 );\n\t\t\tadd_filter( 'get_the_terms', array( __CLASS__, 'hide_the_featured_term' ), 10, 3 );\n\t\t}\n\t}\n\n\t/**\n\t * Get featured posts.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @return array Array of featured posts.\n\t */\n\tpublic static function get_featured_posts() {\n\t\t$post_ids = self::get_featured_post_ids();\n\n\t\t// No need to query if there is are no featured posts.\n\t\tif ( empty( $post_ids ) ) {\n\t\t\treturn array();\n\t\t}\n\n\t\t$featured_posts = get_posts( array(\n\t\t\t'include'        => $post_ids,\n\t\t\t'posts_per_page' => count( $post_ids ),\n\t\t) );\n\n\t\treturn $featured_posts;\n\t}\n\n\t/**\n\t * Get featured post IDs\n\t *\n\t * This function will return the an array containing the\n\t * post IDs of all featured posts.\n\t *\n\t * Sets the \"featured_content_ids\" transient.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @return array Array of post IDs.\n\t */\n\tpublic static function get_featured_post_ids() {\n\t\t// Get array of cached results if they exist.\n\t\t$featured_ids = get_transient( 'featured_content_ids' );\n\n\t\tif ( false === $featured_ids ) {\n\t\t\t$settings = self::get_setting();\n\t\t\t$term     = get_term_by( 'name', $settings['tag-name'], 'post_tag' );\n\n\t\t\tif ( $term ) {\n\t\t\t\t// Query for featured posts.\n\t\t\t\t$featured_ids = get_posts( array(\n\t\t\t\t\t'fields'           => 'ids',\n\t\t\t\t\t'numberposts'      => self::$max_posts,\n\t\t\t\t\t'suppress_filters' => false,\n\t\t\t\t\t'tax_query'        => array(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t'field'    => 'term_id',\n\t\t\t\t\t\t\t'taxonomy' => 'post_tag',\n\t\t\t\t\t\t\t'terms'    => $term->term_id,\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t) );\n\t\t\t}\n\n\t\t\t// Get sticky posts if no Featured Content exists.\n\t\t\tif ( ! $featured_ids ) {\n\t\t\t\t$featured_ids = self::get_sticky_posts();\n\t\t\t}\n\n\t\t\tset_transient( 'featured_content_ids', $featured_ids );\n\t\t}\n\n\t\t// Ensure correct format before return.\n\t\treturn array_map( 'absint', $featured_ids );\n\t}\n\n\t/**\n\t * Return an array with IDs of posts maked as sticky.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @return array Array of sticky posts.\n\t */\n\tpublic static function get_sticky_posts() {\n\t\treturn array_slice( get_option( 'sticky_posts', array() ), 0, self::$max_posts );\n\t}\n\n\t/**\n\t * Delete featured content ids transient.\n\t *\n\t * Hooks in the \"save_post\" action.\n\t *\n\t * @see Featured_Content::validate_settings().\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t */\n\tpublic static function delete_transient() {\n\t\tdelete_transient( 'featured_content_ids' );\n\t}\n\n\t/**\n\t * Exclude featured posts from the home page blog query.\n\t *\n\t * Filter the home page posts, and remove any featured post ID's from it.\n\t * Hooked onto the 'pre_get_posts' action, this changes the parameters of\n\t * the query before it gets any posts.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param WP_Query $query WP_Query object.\n\t * @return WP_Query Possibly-modified WP_Query.\n\t */\n\tpublic static function pre_get_posts( $query ) {\n\n\t\t// Bail if not home or not main query.\n\t\tif ( ! $query->is_home() || ! $query->is_main_query() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Bail if the blog page is not the front page.\n\t\tif ( 'posts' !== get_option( 'show_on_front' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$featured = self::get_featured_post_ids();\n\n\t\t// Bail if no featured posts.\n\t\tif ( ! $featured ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We need to respect post ids already in the blacklist.\n\t\t$post__not_in = $query->get( 'post__not_in' );\n\n\t\tif ( ! empty( $post__not_in ) ) {\n\t\t\t$featured = array_merge( (array) $post__not_in, $featured );\n\t\t\t$featured = array_unique( $featured );\n\t\t}\n\n\t\t$query->set( 'post__not_in', $featured );\n\t}\n\n\t/**\n\t * Reset tag option when the saved tag is deleted.\n\t *\n\t * It's important to mention that the transient needs to be deleted,\n\t * too. While it may not be obvious by looking at the function alone,\n\t * the transient is deleted by Featured_Content::validate_settings().\n\t *\n\t * Hooks in the \"delete_post_tag\" action.\n\t *\n\t * @see Featured_Content::validate_settings().\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param int $tag_id The term_id of the tag that has been deleted.\n\t */\n\tpublic static function delete_post_tag( $tag_id ) {\n\t\t$settings = self::get_setting();\n\n\t\tif ( empty( $settings['tag-id'] ) || $tag_id != $settings['tag-id'] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$settings['tag-id'] = 0;\n\t\t$settings = self::validate_settings( $settings );\n\t\tupdate_option( 'featured-content', $settings );\n\t}\n\n\t/**\n\t * Hide featured tag from displaying when global terms are queried from the front-end.\n\t *\n\t * Hooks into the \"get_terms\" filter.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array $terms      List of term objects. This is the return value of get_terms().\n\t * @param array $taxonomies An array of taxonomy slugs.\n\t * @return array A filtered array of terms.\n\t *\n\t * @uses Featured_Content::get_setting()\n\t */\n\tpublic static function hide_featured_term( $terms, $taxonomies, $args ) {\n\n\t\t// This filter is only appropriate on the front-end.\n\t\tif ( is_admin() ) {\n\t\t\treturn $terms;\n\t\t}\n\n\t\t// We only want to hide the featured tag.\n\t\tif ( ! in_array( 'post_tag', $taxonomies ) ) {\n\t\t\treturn $terms;\n\t\t}\n\n\t\t// Bail if no terms were returned.\n\t\tif ( empty( $terms ) ) {\n\t\t\treturn $terms;\n\t\t}\n\n\t\t// Bail if term objects are unavailable.\n\t\tif ( 'all' != $args['fields'] ) {\n\t\t\treturn $terms;\n\t\t}\n\n\t\t$settings = self::get_setting();\n\t\tforeach ( $terms as $order => $term ) {\n\t\t\tif ( ( $settings['tag-id'] === $term->term_id || $settings['tag-name'] === $term->name ) && 'post_tag' === $term->taxonomy ) {\n\t\t\t\tunset( $terms[ $order ] );\n\t\t\t}\n\t\t}\n\n\t\treturn $terms;\n\t}\n\n\t/**\n\t * Hide featured tag from display when terms associated with a post object\n\t * are queried from the front-end.\n\t *\n\t * Hooks into the \"get_the_terms\" filter.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array $terms    A list of term objects. This is the return value of get_the_terms().\n\t * @param int   $id       The ID field for the post object that terms are associated with.\n\t * @param array $taxonomy An array of taxonomy slugs.\n\t * @return array Filtered array of terms.\n\t *\n\t * @uses Featured_Content::get_setting()\n\t */\n\tpublic static function hide_the_featured_term( $terms, $id, $taxonomy ) {\n\n\t\t// This filter is only appropriate on the front-end.\n\t\tif ( is_admin() ) {\n\t\t\treturn $terms;\n\t\t}\n\n\t\t// Make sure we are in the correct taxonomy.\n\t\tif ( 'post_tag' != $taxonomy ) {\n\t\t\treturn $terms;\n\t\t}\n\n\t\t// No terms? Return early!\n\t\tif ( empty( $terms ) ) {\n\t\t\treturn $terms;\n\t\t}\n\n\t\t$settings = self::get_setting();\n\t\tforeach ( $terms as $order => $term ) {\n\t\t\tif ( ( $settings['tag-id'] === $term->term_id || $settings['tag-name'] === $term->name ) && 'post_tag' === $term->taxonomy ) {\n\t\t\t\tunset( $terms[ $term->term_id ] );\n\t\t\t}\n\t\t}\n\n\t\treturn $terms;\n\t}\n\n\t/**\n\t * Register custom setting on the Settings -> Reading screen.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t */\n\tpublic static function register_setting() {\n\t\tregister_setting( 'featured-content', 'featured-content', array( __CLASS__, 'validate_settings' ) );\n\t}\n\n\t/**\n\t * Add settings to the Customizer.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param WP_Customize_Manager $wp_customize Customizer object.\n\t */\n\tpublic static function customize_register( $wp_customize ) {\n\t\t$wp_customize->add_section( 'featured_content', array(\n\t\t\t'title'          => __( 'Featured Content', 'twentyfourteen' ),\n\t\t\t'description'    => sprintf( __( 'Use a <a href=\"%1$s\">tag</a> to feature your posts. If no posts match the tag, <a href=\"%2$s\">sticky posts</a> will be displayed instead.', 'twentyfourteen' ),\n\t\t\t\tesc_url( add_query_arg( 'tag', _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ), admin_url( 'edit.php' ) ) ),\n\t\t\t\tadmin_url( 'edit.php?show_sticky=1' )\n\t\t\t),\n\t\t\t'priority'       => 130,\n\t\t\t'theme_supports' => 'featured-content',\n\t\t) );\n\n\t\t// Add Featured Content settings.\n\t\t$wp_customize->add_setting( 'featured-content[tag-name]', array(\n\t\t\t'default'              => _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ),\n\t\t\t'type'                 => 'option',\n\t\t\t'sanitize_js_callback' => array( __CLASS__, 'delete_transient' ),\n\t\t) );\n\t\t$wp_customize->add_setting( 'featured-content[hide-tag]', array(\n\t\t\t'default'              => true,\n\t\t\t'type'                 => 'option',\n\t\t\t'sanitize_js_callback' => array( __CLASS__, 'delete_transient' ),\n\t\t) );\n\n\t\t// Add Featured Content controls.\n\t\t$wp_customize->add_control( 'featured-content[tag-name]', array(\n\t\t\t'label'    => __( 'Tag Name', 'twentyfourteen' ),\n\t\t\t'section'  => 'featured_content',\n\t\t\t'priority' => 20,\n\t\t) );\n\t\t$wp_customize->add_control( 'featured-content[hide-tag]', array(\n\t\t\t'label'    => __( 'Don&rsquo;t display tag on front end.', 'twentyfourteen' ),\n\t\t\t'section'  => 'featured_content',\n\t\t\t'type'     => 'checkbox',\n\t\t\t'priority' => 30,\n\t\t) );\n\t}\n\n\t/**\n\t * Enqueue the tag suggestion script.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t */\n\tpublic static function enqueue_scripts() {\n\t\twp_enqueue_script( 'featured-content-suggest', get_template_directory_uri() . '/js/featured-content-admin.js', array( 'jquery', 'suggest' ), '20131022', true );\n\t}\n\n\t/**\n\t * Get featured content settings.\n\t *\n\t * Get all settings recognized by this module. This function\n\t * will return all settings whether or not they have been stored\n\t * in the database yet. This ensures that all keys are available\n\t * at all times.\n\t *\n\t * In the event that you only require one setting, you may pass\n\t * its name as the first parameter to the function and only that\n\t * value will be returned.\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param string $key The key of a recognized setting.\n\t * @return mixed Array of all settings by default. A single value if passed as first parameter.\n\t */\n\tpublic static function get_setting( $key = 'all' ) {\n\t\t$saved = (array) get_option( 'featured-content' );\n\n\t\t$defaults = array(\n\t\t\t'hide-tag' => 1,\n\t\t\t'tag-id'   => 0,\n\t\t\t'tag-name' => _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ),\n\t\t);\n\n\t\t$options = wp_parse_args( $saved, $defaults );\n\t\t$options = array_intersect_key( $options, $defaults );\n\n\t\tif ( 'all' != $key ) {\n\t\t\treturn isset( $options[ $key ] ) ? $options[ $key ] : false;\n\t\t}\n\n\t\treturn $options;\n\t}\n\n\t/**\n\t * Validate featured content settings.\n\t *\n\t * Make sure that all user supplied content is in an expected\n\t * format before saving to the database. This function will also\n\t * delete the transient set in Featured_Content::get_featured_content().\n\t *\n\t * @static\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array $input Array of settings input.\n\t * @return array Validated settings output.\n\t */\n\tpublic static function validate_settings( $input ) {\n\t\t$output = array();\n\n\t\tif ( empty( $input['tag-name'] ) ) {\n\t\t\t$output['tag-id'] = 0;\n\t\t} else {\n\t\t\t$term = get_term_by( 'name', $input['tag-name'], 'post_tag' );\n\n\t\t\tif ( $term ) {\n\t\t\t\t$output['tag-id'] = $term->term_id;\n\t\t\t} else {\n\t\t\t\t$new_tag = wp_create_tag( $input['tag-name'] );\n\n\t\t\t\tif ( ! is_wp_error( $new_tag ) && isset( $new_tag['term_id'] ) ) {\n\t\t\t\t\t$output['tag-id'] = $new_tag['term_id'];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$output['tag-name'] = $input['tag-name'];\n\t\t}\n\n\t\t$output['hide-tag'] = isset( $input['hide-tag'] ) && $input['hide-tag'] ? 1 : 0;\n\n\t\t// Delete the featured post ids transient.\n\t\tself::delete_transient();\n\n\t\treturn $output;\n\t}\n} // Featured_Content\n\nFeatured_Content::setup();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/inc/template-tags.php",
    "content": "<?php\n/**\n * Custom template tags for Twenty Fourteen\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nif ( ! function_exists( 'twentyfourteen_paging_nav' ) ) :\n/**\n * Display navigation to next/previous set of posts when applicable.\n *\n * @since Twenty Fourteen 1.0\n *\n * @global WP_Query   $wp_query   WordPress Query object.\n * @global WP_Rewrite $wp_rewrite WordPress Rewrite object.\n */\nfunction twentyfourteen_paging_nav() {\n\tglobal $wp_query, $wp_rewrite;\n\n\t// Don't print empty markup if there's only one page.\n\tif ( $wp_query->max_num_pages < 2 ) {\n\t\treturn;\n\t}\n\n\t$paged        = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1;\n\t$pagenum_link = html_entity_decode( get_pagenum_link() );\n\t$query_args   = array();\n\t$url_parts    = explode( '?', $pagenum_link );\n\n\tif ( isset( $url_parts[1] ) ) {\n\t\twp_parse_str( $url_parts[1], $query_args );\n\t}\n\n\t$pagenum_link = remove_query_arg( array_keys( $query_args ), $pagenum_link );\n\t$pagenum_link = trailingslashit( $pagenum_link ) . '%_%';\n\n\t$format  = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';\n\t$format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%';\n\n\t// Set up paginated links.\n\t$links = paginate_links( array(\n\t\t'base'     => $pagenum_link,\n\t\t'format'   => $format,\n\t\t'total'    => $wp_query->max_num_pages,\n\t\t'current'  => $paged,\n\t\t'mid_size' => 1,\n\t\t'add_args' => array_map( 'urlencode', $query_args ),\n\t\t'prev_text' => __( '&larr; Previous', 'twentyfourteen' ),\n\t\t'next_text' => __( 'Next &rarr;', 'twentyfourteen' ),\n\t) );\n\n\tif ( $links ) :\n\n\t?>\n\t<nav class=\"navigation paging-navigation\" role=\"navigation\">\n\t\t<h1 class=\"screen-reader-text\"><?php _e( 'Posts navigation', 'twentyfourteen' ); ?></h1>\n\t\t<div class=\"pagination loop-pagination\">\n\t\t\t<?php echo $links; ?>\n\t\t</div><!-- .pagination -->\n\t</nav><!-- .navigation -->\n\t<?php\n\tendif;\n}\nendif;\n\nif ( ! function_exists( 'twentyfourteen_post_nav' ) ) :\n/**\n * Display navigation to next/previous post when applicable.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_post_nav() {\n\t// Don't print empty markup if there's nowhere to navigate.\n\t$previous = ( is_attachment() ) ? get_post( get_post()->post_parent ) : get_adjacent_post( false, '', true );\n\t$next     = get_adjacent_post( false, '', false );\n\n\tif ( ! $next && ! $previous ) {\n\t\treturn;\n\t}\n\n\t?>\n\t<nav class=\"navigation post-navigation\" role=\"navigation\">\n\t\t<h1 class=\"screen-reader-text\"><?php _e( 'Post navigation', 'twentyfourteen' ); ?></h1>\n\t\t<div class=\"nav-links\">\n\t\t\t<?php\n\t\t\tif ( is_attachment() ) :\n\t\t\t\tprevious_post_link( '%link', __( '<span class=\"meta-nav\">Published In</span>%title', 'twentyfourteen' ) );\n\t\t\telse :\n\t\t\t\tprevious_post_link( '%link', __( '<span class=\"meta-nav\">Previous Post</span>%title', 'twentyfourteen' ) );\n\t\t\t\tnext_post_link( '%link', __( '<span class=\"meta-nav\">Next Post</span>%title', 'twentyfourteen' ) );\n\t\t\tendif;\n\t\t\t?>\n\t\t</div><!-- .nav-links -->\n\t</nav><!-- .navigation -->\n\t<?php\n}\nendif;\n\nif ( ! function_exists( 'twentyfourteen_posted_on' ) ) :\n/**\n * Print HTML with meta information for the current post-date/time and author.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_posted_on() {\n\tif ( is_sticky() && is_home() && ! is_paged() ) {\n\t\techo '<span class=\"featured-post\">' . __( 'Sticky', 'twentyfourteen' ) . '</span>';\n\t}\n\n\t// Set up and print post meta information.\n\tprintf( '<span class=\"entry-date\"><a href=\"%1$s\" rel=\"bookmark\"><time class=\"entry-date\" datetime=\"%2$s\">%3$s</time></a></span> <span class=\"byline\"><span class=\"author vcard\"><a class=\"url fn n\" href=\"%4$s\" rel=\"author\">%5$s</a></span></span>',\n\t\tesc_url( get_permalink() ),\n\t\tesc_attr( get_the_date( 'c' ) ),\n\t\tesc_html( get_the_date() ),\n\t\tesc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),\n\t\tget_the_author()\n\t);\n}\nendif;\n\n/**\n * Find out if blog has more than one category.\n *\n * @since Twenty Fourteen 1.0\n *\n * @return boolean true if blog has more than 1 category\n */\nfunction twentyfourteen_categorized_blog() {\n\tif ( false === ( $all_the_cool_cats = get_transient( 'twentyfourteen_category_count' ) ) ) {\n\t\t// Create an array of all the categories that are attached to posts\n\t\t$all_the_cool_cats = get_categories( array(\n\t\t\t'hide_empty' => 1,\n\t\t) );\n\n\t\t// Count the number of categories that are attached to the posts\n\t\t$all_the_cool_cats = count( $all_the_cool_cats );\n\n\t\tset_transient( 'twentyfourteen_category_count', $all_the_cool_cats );\n\t}\n\n\tif ( 1 !== (int) $all_the_cool_cats ) {\n\t\t// This blog has more than 1 category so twentyfourteen_categorized_blog should return true\n\t\treturn true;\n\t} else {\n\t\t// This blog has only 1 category so twentyfourteen_categorized_blog should return false\n\t\treturn false;\n\t}\n}\n\n/**\n * Flush out the transients used in twentyfourteen_categorized_blog.\n *\n * @since Twenty Fourteen 1.0\n */\nfunction twentyfourteen_category_transient_flusher() {\n\t// Like, beat it. Dig?\n\tdelete_transient( 'twentyfourteen_category_count' );\n}\nadd_action( 'edit_category', 'twentyfourteen_category_transient_flusher' );\nadd_action( 'save_post',     'twentyfourteen_category_transient_flusher' );\n\nif ( ! function_exists( 'twentyfourteen_post_thumbnail' ) ) :\n/**\n * Display an optional post thumbnail.\n *\n * Wraps the post thumbnail in an anchor element on index\n * views, or a div element when on single views.\n *\n * @since Twenty Fourteen 1.0\n * @since Twenty Fourteen 1.4 Was made 'pluggable', or overridable.\n */\nfunction twentyfourteen_post_thumbnail() {\n\tif ( post_password_required() || is_attachment() || ! has_post_thumbnail() ) {\n\t\treturn;\n\t}\n\n\tif ( is_singular() ) :\n\t?>\n\n\t<div class=\"post-thumbnail\">\n\t<?php\n\t\tif ( ( ! is_active_sidebar( 'sidebar-2' ) || is_page_template( 'page-templates/full-width.php' ) ) ) {\n\t\t\tthe_post_thumbnail( 'twentyfourteen-full-width' );\n\t\t} else {\n\t\t\tthe_post_thumbnail();\n\t\t}\n\t?>\n\t</div>\n\n\t<?php else : ?>\n\n\t<a class=\"post-thumbnail\" href=\"<?php the_permalink(); ?>\" aria-hidden=\"true\">\n\t<?php\n\t\tif ( ( ! is_active_sidebar( 'sidebar-2' ) || is_page_template( 'page-templates/full-width.php' ) ) ) {\n\t\t\tthe_post_thumbnail( 'twentyfourteen-full-width' );\n\t\t} else {\n\t\t\tthe_post_thumbnail( 'post-thumbnail', array( 'alt' => get_the_title() ) );\n\t\t}\n\t?>\n\t</a>\n\n\t<?php endif; // End is_singular()\n}\nendif;\n\nif ( ! function_exists( 'twentyfourteen_excerpt_more' ) && ! is_admin() ) :\n/**\n * Replaces \"[...]\" (appended to automatically generated excerpts) with ...\n * and a Continue reading link.\n *\n * @since Twenty Fourteen 1.3\n *\n * @param string $more Default Read More excerpt link.\n * @return string Filtered Read More excerpt link.\n */\nfunction twentyfourteen_excerpt_more( $more ) {\n\t$link = sprintf( '<a href=\"%1$s\" class=\"more-link\">%2$s</a>',\n\t\tesc_url( get_permalink( get_the_ID() ) ),\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tsprintf( __( 'Continue reading %s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ), '<span class=\"screen-reader-text\">' . get_the_title( get_the_ID() ) . '</span>' )\n\t\t);\n\treturn ' &hellip; ' . $link;\n}\nadd_filter( 'excerpt_more', 'twentyfourteen_excerpt_more' );\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/inc/widgets.php",
    "content": "<?php\n/**\n * Custom Widget for displaying specific post formats\n *\n * Displays posts from Aside, Quote, Video, Audio, Image, Gallery, and Link formats.\n *\n * @link https://codex.wordpress.org/Widgets_API#Developing_Widgets\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nclass Twenty_Fourteen_Ephemera_Widget extends WP_Widget {\n\n\t/**\n\t * The supported post formats.\n\t *\n\t * @access private\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @var array\n\t */\n\tprivate $formats = array( 'aside', 'image', 'video', 'audio', 'quote', 'link', 'gallery' );\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @return Twenty_Fourteen_Ephemera_Widget\n\t */\n\tpublic function __construct() {\n\t\tparent::__construct( 'widget_twentyfourteen_ephemera', __( 'Twenty Fourteen Ephemera', 'twentyfourteen' ), array(\n\t\t\t'classname'   => 'widget_twentyfourteen_ephemera',\n\t\t\t'description' => __( 'Use this widget to list your recent Aside, Quote, Video, Audio, Image, Gallery, and Link posts.', 'twentyfourteen' ),\n\t\t) );\n\t}\n\n\t/**\n\t * Output the HTML for this widget.\n\t *\n\t * @access public\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array $args     An array of standard parameters for widgets in this theme.\n\t * @param array $instance An array of settings for this widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\t$format = isset( $instance['format'] ) && in_array( $instance['format'], $this->formats ) ? $instance['format'] : 'aside';\n\n\t\tswitch ( $format ) {\n\t\t\tcase 'image':\n\t\t\t\t$format_string      = __( 'Images', 'twentyfourteen' );\n\t\t\t\t$format_string_more = __( 'More images', 'twentyfourteen' );\n\t\t\t\tbreak;\n\t\t\tcase 'video':\n\t\t\t\t$format_string      = __( 'Videos', 'twentyfourteen' );\n\t\t\t\t$format_string_more = __( 'More videos', 'twentyfourteen' );\n\t\t\t\tbreak;\n\t\t\tcase 'audio':\n\t\t\t\t$format_string      = __( 'Audio', 'twentyfourteen' );\n\t\t\t\t$format_string_more = __( 'More audio', 'twentyfourteen' );\n\t\t\t\tbreak;\n\t\t\tcase 'quote':\n\t\t\t\t$format_string      = __( 'Quotes', 'twentyfourteen' );\n\t\t\t\t$format_string_more = __( 'More quotes', 'twentyfourteen' );\n\t\t\t\tbreak;\n\t\t\tcase 'link':\n\t\t\t\t$format_string      = __( 'Links', 'twentyfourteen' );\n\t\t\t\t$format_string_more = __( 'More links', 'twentyfourteen' );\n\t\t\t\tbreak;\n\t\t\tcase 'gallery':\n\t\t\t\t$format_string      = __( 'Galleries', 'twentyfourteen' );\n\t\t\t\t$format_string_more = __( 'More galleries', 'twentyfourteen' );\n\t\t\t\tbreak;\n\t\t\tcase 'aside':\n\t\t\tdefault:\n\t\t\t\t$format_string      = __( 'Asides', 'twentyfourteen' );\n\t\t\t\t$format_string_more = __( 'More asides', 'twentyfourteen' );\n\t\t\t\tbreak;\n\t\t}\n\n\t\t$number = empty( $instance['number'] ) ? 2 : absint( $instance['number'] );\n\t\t$title  = apply_filters( 'widget_title', empty( $instance['title'] ) ? $format_string : $instance['title'], $instance, $this->id_base );\n\n\t\t$ephemera = new WP_Query( array(\n\t\t\t'order'          => 'DESC',\n\t\t\t'posts_per_page' => $number,\n\t\t\t'no_found_rows'  => true,\n\t\t\t'post_status'    => 'publish',\n\t\t\t'post__not_in'   => get_option( 'sticky_posts' ),\n\t\t\t'tax_query'      => array(\n\t\t\t\tarray(\n\t\t\t\t\t'taxonomy' => 'post_format',\n\t\t\t\t\t'terms'    => array( \"post-format-$format\" ),\n\t\t\t\t\t'field'    => 'slug',\n\t\t\t\t\t'operator' => 'IN',\n\t\t\t\t),\n\t\t\t),\n\t\t) );\n\n\t\tif ( $ephemera->have_posts() ) :\n\t\t\t$tmp_content_width = $GLOBALS['content_width'];\n\t\t\t$GLOBALS['content_width'] = 306;\n\n\t\t\techo $args['before_widget'];\n\t\t\t?>\n\t\t\t<h1 class=\"widget-title <?php echo esc_attr( $format ); ?>\">\n\t\t\t\t<a class=\"entry-format\" href=\"<?php echo esc_url( get_post_format_link( $format ) ); ?>\"><?php echo esc_html( $title ); ?></a>\n\t\t\t</h1>\n\t\t\t<ol>\n\n\t\t\t\t<?php\n\t\t\t\t\twhile ( $ephemera->have_posts() ) :\n\t\t\t\t\t\t$ephemera->the_post();\n\t\t\t\t\t\t$tmp_more = $GLOBALS['more'];\n\t\t\t\t\t\t$GLOBALS['more'] = 0;\n\t\t\t\t?>\n\t\t\t\t<li>\n\t\t\t\t<article <?php post_class(); ?>>\n\t\t\t\t\t<div class=\"entry-content\">\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\tif ( has_post_format( 'gallery' ) ) :\n\n\t\t\t\t\t\t\t\tif ( post_password_required() ) :\n\t\t\t\t\t\t\t\t\tthe_content( __( 'Continue reading <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ) );\n\t\t\t\t\t\t\t\telse :\n\t\t\t\t\t\t\t\t\t$images = array();\n\n\t\t\t\t\t\t\t\t\t$galleries = get_post_galleries( get_the_ID(), false );\n\t\t\t\t\t\t\t\t\tif ( isset( $galleries[0]['ids'] ) )\n\t\t\t\t\t\t\t\t\t\t$images = explode( ',', $galleries[0]['ids'] );\n\n\t\t\t\t\t\t\t\t\tif ( ! $images ) :\n\t\t\t\t\t\t\t\t\t\t$images = get_posts( array(\n\t\t\t\t\t\t\t\t\t\t\t'fields'         => 'ids',\n\t\t\t\t\t\t\t\t\t\t\t'numberposts'    => -1,\n\t\t\t\t\t\t\t\t\t\t\t'order'          => 'ASC',\n\t\t\t\t\t\t\t\t\t\t\t'orderby'        => 'menu_order',\n\t\t\t\t\t\t\t\t\t\t\t'post_mime_type' => 'image',\n\t\t\t\t\t\t\t\t\t\t\t'post_parent'    => get_the_ID(),\n\t\t\t\t\t\t\t\t\t\t\t'post_type'      => 'attachment',\n\t\t\t\t\t\t\t\t\t\t) );\n\t\t\t\t\t\t\t\t\tendif;\n\n\t\t\t\t\t\t\t\t\t$total_images = count( $images );\n\n\t\t\t\t\t\t\t\t\tif ( has_post_thumbnail() ) :\n\t\t\t\t\t\t\t\t\t\t$post_thumbnail = get_the_post_thumbnail();\n\t\t\t\t\t\t\t\t\telseif ( $total_images > 0 ) :\n\t\t\t\t\t\t\t\t\t\t$image          = reset( $images );\n\t\t\t\t\t\t\t\t\t\t$post_thumbnail = wp_get_attachment_image( $image, 'post-thumbnail' );\n\t\t\t\t\t\t\t\t\tendif;\n\n\t\t\t\t\t\t\t\t\tif ( ! empty ( $post_thumbnail ) ) :\n\t\t\t\t\t\t?>\n\t\t\t\t\t\t<a href=\"<?php the_permalink(); ?>\"><?php echo $post_thumbnail; ?></a>\n\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t<p class=\"wp-caption-text\">\n\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\tprintf( _n( 'This gallery contains <a href=\"%1$s\" rel=\"bookmark\">%2$s photo</a>.', 'This gallery contains <a href=\"%1$s\" rel=\"bookmark\">%2$s photos</a>.', $total_images, 'twentyfourteen' ),\n\t\t\t\t\t\t\t\t\tesc_url( get_permalink() ),\n\t\t\t\t\t\t\t\t\tnumber_format_i18n( $total_images )\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\tendif;\n\n\t\t\t\t\t\t\telse :\n\t\t\t\t\t\t\t\tthe_content( __( 'Continue reading <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ) );\n\t\t\t\t\t\t\tendif;\n\t\t\t\t\t\t?>\n\t\t\t\t\t</div><!-- .entry-content -->\n\n\t\t\t\t\t<header class=\"entry-header\">\n\t\t\t\t\t\t<div class=\"entry-meta\">\n\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\tif ( ! has_post_format( 'link' ) ) :\n\t\t\t\t\t\t\t\t\tthe_title( '<h1 class=\"entry-title\"><a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">', '</a></h1>' );\n\t\t\t\t\t\t\t\tendif;\n\n\t\t\t\t\t\t\t\tprintf( '<span class=\"entry-date\"><a href=\"%1$s\" rel=\"bookmark\"><time class=\"entry-date\" datetime=\"%2$s\">%3$s</time></a></span> <span class=\"byline\"><span class=\"author vcard\"><a class=\"url fn n\" href=\"%4$s\" rel=\"author\">%5$s</a></span></span>',\n\t\t\t\t\t\t\t\t\tesc_url( get_permalink() ),\n\t\t\t\t\t\t\t\t\tesc_attr( get_the_date( 'c' ) ),\n\t\t\t\t\t\t\t\t\tesc_html( get_the_date() ),\n\t\t\t\t\t\t\t\t\tesc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),\n\t\t\t\t\t\t\t\t\tget_the_author()\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tif ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) :\n\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t<span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'twentyfourteen' ), __( '1 Comment', 'twentyfourteen' ), __( '% Comments', 'twentyfourteen' ) ); ?></span>\n\t\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t\t</div><!-- .entry-meta -->\n\t\t\t\t\t</header><!-- .entry-header -->\n\t\t\t\t</article><!-- #post-## -->\n\t\t\t\t</li>\n\t\t\t\t<?php endwhile; ?>\n\n\t\t\t</ol>\n\t\t\t<a class=\"post-format-archive-link\" href=\"<?php echo esc_url( get_post_format_link( $format ) ); ?>\">\n\t\t\t\t<?php\n\t\t\t\t\t/* translators: used with More archives link */\n\t\t\t\t\tprintf( __( '%s <span class=\"meta-nav\">&rarr;</span>', 'twentyfourteen' ), $format_string_more );\n\t\t\t\t?>\n\t\t\t</a>\n\t\t\t<?php\n\n\t\t\techo $args['after_widget'];\n\n\t\t\t// Reset the post globals as this query will have stomped on it.\n\t\t\twp_reset_postdata();\n\n\t\t\t$GLOBALS['more']          = $tmp_more;\n\t\t\t$GLOBALS['content_width'] = $tmp_content_width;\n\n\t\tendif; // End check for ephemeral posts.\n\t}\n\n\t/**\n\t * Deal with the settings when they are saved by the admin.\n\t *\n\t * Here is where any validation should happen.\n\t *\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array $new_instance New widget instance.\n\t * @param array $instance     Original widget instance.\n\t * @return array Updated widget instance.\n\t */\n\tfunction update( $new_instance, $instance ) {\n\t\t$instance['title']  = strip_tags( $new_instance['title'] );\n\t\t$instance['number'] = empty( $new_instance['number'] ) ? 2 : absint( $new_instance['number'] );\n\t\tif ( in_array( $new_instance['format'], $this->formats ) ) {\n\t\t\t$instance['format'] = $new_instance['format'];\n\t\t}\n\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Display the form for this widget on the Widgets page of the Admin area.\n\t *\n\t * @since Twenty Fourteen 1.0\n\t *\n\t * @param array $instance\n\t */\n\tfunction form( $instance ) {\n\t\t$title  = empty( $instance['title'] ) ? '' : esc_attr( $instance['title'] );\n\t\t$number = empty( $instance['number'] ) ? 2 : absint( $instance['number'] );\n\t\t$format = isset( $instance['format'] ) && in_array( $instance['format'], $this->formats ) ? $instance['format'] : 'aside';\n\t\t?>\n\t\t\t<p><label for=\"<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>\"><?php _e( 'Title:', 'twentyfourteen' ); ?></label>\n\t\t\t<input id=\"<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>\" class=\"widefat\" name=\"<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>\" type=\"text\" value=\"<?php echo esc_attr( $title ); ?>\"></p>\n\n\t\t\t<p><label for=\"<?php echo esc_attr( $this->get_field_id( 'number' ) ); ?>\"><?php _e( 'Number of posts to show:', 'twentyfourteen' ); ?></label>\n\t\t\t<input id=\"<?php echo esc_attr( $this->get_field_id( 'number' ) ); ?>\" name=\"<?php echo esc_attr( $this->get_field_name( 'number' ) ); ?>\" type=\"text\" value=\"<?php echo esc_attr( $number ); ?>\" size=\"3\"></p>\n\n\t\t\t<p><label for=\"<?php echo esc_attr( $this->get_field_id( 'format' ) ); ?>\"><?php _e( 'Post format to show:', 'twentyfourteen' ); ?></label>\n\t\t\t<select id=\"<?php echo esc_attr( $this->get_field_id( 'format' ) ); ?>\" class=\"widefat\" name=\"<?php echo esc_attr( $this->get_field_name( 'format' ) ); ?>\">\n\t\t\t\t<?php foreach ( $this->formats as $slug ) : ?>\n\t\t\t\t<option value=\"<?php echo esc_attr( $slug ); ?>\"<?php selected( $format, $slug ); ?>><?php echo esc_html( get_post_format_string( $slug ) ); ?></option>\n\t\t\t\t<?php endforeach; ?>\n\t\t\t</select>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/index.php",
    "content": "<?php\n/**\n * The main template file\n *\n * This is the most generic template file in a WordPress theme and one\n * of the two required files for a theme (the other being style.css).\n * It is used to display a page when nothing more specific matches a query,\n * e.g., it puts together the home page when no home.php file exists.\n *\n * @link https://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n<div id=\"main-content\" class=\"main-content\">\n\n<?php\n\tif ( is_front_page() && twentyfourteen_has_featured_posts() ) {\n\t\t// Include the featured content template.\n\t\tget_template_part( 'featured-content' );\n\t}\n?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t<?php\n\t\t\tif ( have_posts() ) :\n\t\t\t\t// Start the Loop.\n\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t\t\t */\n\t\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t\tendwhile;\n\t\t\t\t// Previous/next post navigation.\n\t\t\t\ttwentyfourteen_paging_nav();\n\n\t\t\telse :\n\t\t\t\t// If no content, include the \"No posts found\" template.\n\t\t\t\tget_template_part( 'content', 'none' );\n\n\t\t\tendif;\n\t\t?>\n\n\t\t</div><!-- #content -->\n\t</div><!-- #primary -->\n\t<?php get_sidebar( 'content' ); ?>\n</div><!-- #main-content -->\n\n<?php\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/js/customizer.js",
    "content": "/**\n * Twenty Fourteen Customizer enhancements for a better user experience.\n *\n * Contains handlers to make Customizer preview reload changes asynchronously.\n */\n( function( $ ) {\n\t// Site title and description.\n\twp.customize( 'blogname', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( '.site-title a' ).text( to );\n\t\t} );\n\t} );\n\twp.customize( 'blogdescription', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( '.site-description' ).text( to );\n\t\t} );\n\t} );\n\t// Header text color.\n\twp.customize( 'header_textcolor', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\tif ( 'blank' === to ) {\n\t\t\t\t$( '.site-title, .site-description' ).css( {\n\t\t\t\t\t'clip': 'rect(1px, 1px, 1px, 1px)',\n\t\t\t\t\t'position': 'absolute'\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\t$( '.site-title,  .site-description' ).css( {\n\t\t\t\t\t'clip': 'auto',\n\t\t\t\t\t'position': 'static'\n\t\t\t\t} );\n\n\t\t\t\t$( '.site-title a' ).css( {\n\t\t\t\t\t'color': to\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t} );\n} )( jQuery );"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/js/featured-content-admin.js",
    "content": "/**\n * Twenty Fourteen Featured Content admin behavior: add a tag suggestion\n * when changing the tag.\n */\n/* global ajaxurl:true */\n\njQuery( document ).ready( function( $ ) {\n\t$( '#customize-control-featured-content-tag-name input' ).suggest( ajaxurl + '?action=ajax-tag-search&tax=post_tag', { delay: 500, minchars: 2 } );\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/js/functions.js",
    "content": "/**\n * Theme functions file\n *\n * Contains handlers for navigation, accessibility, header sizing\n * footer widgets and Featured Content slider\n *\n */\n( function( $ ) {\n\tvar body    = $( 'body' ),\n\t\t_window = $( window ),\n\t\tnav, button, menu;\n\n\tnav = $( '#primary-navigation' );\n\tbutton = nav.find( '.menu-toggle' );\n\tmenu = nav.find( '.nav-menu' );\n\n\t// Enable menu toggle for small screens.\n\t( function() {\n\t\tif ( ! nav || ! button ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Hide button if menu is missing or empty.\n\t\tif ( ! menu || ! menu.children().length ) {\n\t\t\tbutton.hide();\n\t\t\treturn;\n\t\t}\n\n\t\tbutton.on( 'click.twentyfourteen', function() {\n\t\t\tnav.toggleClass( 'toggled-on' );\n\t\t\tif ( nav.hasClass( 'toggled-on' ) ) {\n\t\t\t\t$( this ).attr( 'aria-expanded', 'true' );\n\t\t\t\tmenu.attr( 'aria-expanded', 'true' );\n\t\t\t} else {\n\t\t\t\t$( this ).attr( 'aria-expanded', 'false' );\n\t\t\t\tmenu.attr( 'aria-expanded', 'false' );\n\t\t\t}\n\t\t} );\n\t} )();\n\n\t/*\n\t * Makes \"skip to content\" link work correctly in IE9 and Chrome for better\n\t * accessibility.\n\t *\n\t * @link http://www.nczonline.net/blog/2013/01/15/fixing-skip-to-content-links/\n\t */\n\t_window.on( 'hashchange.twentyfourteen', function() {\n\t\tvar hash = location.hash.substring( 1 ), element;\n\n\t\tif ( ! hash ) {\n\t\t\treturn;\n\t\t}\n\n\t\telement = document.getElementById( hash );\n\n\t\tif ( element ) {\n\t\t\tif ( ! /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) {\n\t\t\t\telement.tabIndex = -1;\n\t\t\t}\n\n\t\t\telement.focus();\n\n\t\t\t// Repositions the window on jump-to-anchor to account for header height.\n\t\t\twindow.scrollBy( 0, -80 );\n\t\t}\n\t} );\n\n\t$( function() {\n\t\t// Search toggle.\n\t\t$( '.search-toggle' ).on( 'click.twentyfourteen', function( event ) {\n\t\t\tvar that    = $( this ),\n\t\t\t\twrapper = $( '#search-container' ),\n\t\t\t\tcontainer = that.find( 'a' );\n\n\t\t\tthat.toggleClass( 'active' );\n\t\t\twrapper.toggleClass( 'hide' );\n\n\t\t\tif ( that.hasClass( 'active' ) ) {\n\t\t\t\tcontainer.attr( 'aria-expanded', 'true' );\n\t\t\t} else {\n\t\t\t\tcontainer.attr( 'aria-expanded', 'false' );\n\t\t\t}\n\n\t\t\tif ( that.is( '.active' ) || $( '.search-toggle .screen-reader-text' )[0] === event.target ) {\n\t\t\t\twrapper.find( '.search-field' ).focus();\n\t\t\t}\n\t\t} );\n\n\t\t/*\n\t\t * Fixed header for large screen.\n\t\t * If the header becomes more than 48px tall, unfix the header.\n\t\t *\n\t\t * The callback on the scroll event is only added if there is a header\n\t\t * image and we are not on mobile.\n\t\t */\n\t\tif ( _window.width() > 781 ) {\n\t\t\tvar mastheadHeight = $( '#masthead' ).height(),\n\t\t\t\ttoolbarOffset, mastheadOffset;\n\n\t\t\tif ( mastheadHeight > 48 ) {\n\t\t\t\tbody.removeClass( 'masthead-fixed' );\n\t\t\t}\n\n\t\t\tif ( body.is( '.header-image' ) ) {\n\t\t\t\ttoolbarOffset  = body.is( '.admin-bar' ) ? $( '#wpadminbar' ).height() : 0;\n\t\t\t\tmastheadOffset = $( '#masthead' ).offset().top - toolbarOffset;\n\n\t\t\t\t_window.on( 'scroll.twentyfourteen', function() {\n\t\t\t\t\tif ( _window.scrollTop() > mastheadOffset && mastheadHeight < 49 ) {\n\t\t\t\t\t\tbody.addClass( 'masthead-fixed' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbody.removeClass( 'masthead-fixed' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t// Focus styles for menus.\n\t\t$( '.primary-navigation, .secondary-navigation' ).find( 'a' ).on( 'focus.twentyfourteen blur.twentyfourteen', function() {\n\t\t\t$( this ).parents().toggleClass( 'focus' );\n\t\t} );\n\t} );\n\n\t/**\n\t * @summary Add or remove ARIA attributes.\n\t * Uses jQuery's width() function to determine the size of the window and add\n\t * the default ARIA attributes for the menu toggle if it's visible.\n\t * @since Twenty Fourteen 1.4\n\t */\n\tfunction onResizeARIA() {\n\t\tif ( 781 > _window.width() ) {\n\t\t\tbutton.attr( 'aria-expanded', 'false' );\n\t\t\tmenu.attr( 'aria-expanded', 'false' );\n\t\t\tbutton.attr( 'aria-controls', 'primary-menu' );\n\t\t} else {\n\t\t\tbutton.removeAttr( 'aria-expanded' );\n\t\t\tmenu.removeAttr( 'aria-expanded' );\n\t\t\tbutton.removeAttr( 'aria-controls' );\n\t\t}\n\t}\n\n\t_window\n\t\t.on( 'load.twentyfourteen', onResizeARIA )\n\t\t.on( 'resize.twentyfourteen', function() {\n\t\t\tonResizeARIA();\n\t} );\n\n\t_window.load( function() {\n\t\t// Arrange footer widgets vertically.\n\t\tif ( $.isFunction( $.fn.masonry ) ) {\n\t\t\t$( '#footer-sidebar' ).masonry( {\n\t\t\t\titemSelector: '.widget',\n\t\t\t\tcolumnWidth: function( containerWidth ) {\n\t\t\t\t\treturn containerWidth / 4;\n\t\t\t\t},\n\t\t\t\tgutterWidth: 0,\n\t\t\t\tisResizable: true,\n\t\t\t\tisRTL: $( 'body' ).is( '.rtl' )\n\t\t\t} );\n\t\t}\n\n\t\t// Initialize Featured Content slider.\n\t\tif ( body.is( '.slider' ) ) {\n\t\t\t$( '.featured-content' ).featuredslider( {\n\t\t\t\tselector: '.featured-content-inner > article',\n\t\t\t\tcontrolsContainer: '.featured-content'\n\t\t\t} );\n\t\t}\n\t} );\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/js/html5.js",
    "content": "/*\n HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n*/\n(function(l,f){function m(){var a=e.elements;return\"string\"==typeof a?a.split(\" \"):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();\na.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function(\"h,f\",\"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\"+m().join().replace(/[\\w\\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c(\"'+a+'\")'})+\");return n}\")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement(\"p\");d=d.getElementsByTagName(\"head\")[0]||d.documentElement;c.innerHTML=\"x<style>article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}</style>\";\nc=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o=\"_html5shiv\",h=0,n={},g;(function(){try{var a=f.createElement(\"a\");a.innerHTML=\"<xyz></xyz>\";j=\"hidden\"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement(\"a\");var c=f.createDocumentFragment();b=\"undefined\"==typeof c.cloneNode||\n\"undefined\"==typeof c.createDocumentFragment||\"undefined\"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||\"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video\",version:\"3.7.0\",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:\"default\",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);\nif(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/js/keyboard-image-navigation.js",
    "content": "/**\n * Twenty Fourteen keyboard support for image navigation.\n */\n( function( $ ) {\n\t$( document ).on( 'keydown.twentyfourteen', function( e ) {\n\t\tvar url = false;\n\n\t\t// Left arrow key code.\n\t\tif ( e.which === 37 ) {\n\t\t\turl = $( '.previous-image a' ).attr( 'href' );\n\n\t\t// Right arrow key code.\n\t\t} else if ( e.which === 39 ) {\n\t\t\turl = $( '.entry-attachment a' ).attr( 'href' );\n\t\t}\n\n\t\tif ( url && ( ! $( 'textarea, input' ).is( ':focus' ) ) ) {\n\t\t\twindow.location = url;\n\t\t}\n\t} );\n} )( jQuery );"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/js/slider.js",
    "content": "/*\n * Twenty Fourteen Featured Content Slider\n *\n * Adapted from FlexSlider v2.2.0, copyright 2012 WooThemes\n * @link http://www.woothemes.com/flexslider/\n */\n/* global DocumentTouch:true,setImmediate:true,featuredSliderDefaults:true,MSGesture:true */\n( function( $ ) {\n\t// FeaturedSlider: object instance.\n\t$.featuredslider = function( el, options ) {\n\t\tvar slider = $( el ),\n\t\t\tmsGesture = window.navigator && window.navigator.msPointerEnabled && window.MSGesture,\n\t\t\ttouch = ( ( 'ontouchstart' in window ) || msGesture || window.DocumentTouch && document instanceof DocumentTouch ), // MSFT specific.\n\t\t\teventType = 'click touchend MSPointerUp',\n\t\t\twatchedEvent = '',\n\t\t\twatchedEventClearTimer,\n\t\t\tmethods = {},\n\t\t\tnamespace;\n\n\t\t// Make variables public.\n\t\tslider.vars = $.extend( {}, $.featuredslider.defaults, options );\n\n\t\tnamespace = slider.vars.namespace,\n\n\t\t// Store a reference to the slider object.\n\t\t$.data( el, 'featuredslider', slider );\n\n\t\t// Private slider methods.\n\t\tmethods = {\n\t\t\tinit: function() {\n\t\t\t\tslider.animating = false;\n\t\t\t\tslider.currentSlide = 0;\n\t\t\t\tslider.animatingTo = slider.currentSlide;\n\t\t\t\tslider.atEnd = ( slider.currentSlide === 0 || slider.currentSlide === slider.last );\n\t\t\t\tslider.containerSelector = slider.vars.selector.substr( 0, slider.vars.selector.search( ' ' ) );\n\t\t\t\tslider.slides = $( slider.vars.selector, slider );\n\t\t\t\tslider.container = $( slider.containerSelector, slider );\n\t\t\t\tslider.count = slider.slides.length;\n\t\t\t\tslider.prop = 'marginLeft';\n\t\t\t\tslider.isRtl = $( 'body' ).hasClass( 'rtl' );\n\t\t\t\tslider.args = {};\n\t\t\t\t// TOUCH\n\t\t\t\tslider.transitions = ( function() {\n\t\t\t\t\tvar obj = document.createElement( 'div' ),\n\t\t\t\t\t\tprops = ['perspectiveProperty', 'WebkitPerspective', 'MozPerspective', 'OPerspective', 'msPerspective'],\n\t\t\t\t\t\ti;\n\n\t\t\t\t\tfor ( i in props ) {\n\t\t\t\t\t\tif ( obj.style[ props[i] ] !== undefined ) {\n\t\t\t\t\t\t\tslider.pfx = props[i].replace( 'Perspective', '' ).toLowerCase();\n\t\t\t\t\t\t\tslider.prop = '-' + slider.pfx + '-transform';\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}() );\n\t\t\t\t// CONTROLSCONTAINER\n\t\t\t\tif ( slider.vars.controlsContainer !== '' ) {\n\t\t\t\t\tslider.controlsContainer = $( slider.vars.controlsContainer ).length > 0 && $( slider.vars.controlsContainer );\n\t\t\t\t}\n\n\t\t\t\tslider.doMath();\n\n\t\t\t\t// INIT\n\t\t\t\tslider.setup( 'init' );\n\n\t\t\t\t// CONTROLNAV\n\t\t\t\tmethods.controlNav.setup();\n\n\t\t\t\t// DIRECTIONNAV\n\t\t\t\tmethods.directionNav.setup();\n\n\t\t\t\t// KEYBOARD\n\t\t\t\tif ( $( slider.containerSelector ).length === 1 ) {\n\t\t\t\t\t$( document ).bind( 'keyup', function( event ) {\n\t\t\t\t\t\tvar keycode = event.keyCode,\n\t\t\t\t\t\t\ttarget = false;\n\t\t\t\t\t\tif ( ! slider.animating && ( keycode === 39 || keycode === 37 ) ) {\n\t\t\t\t\t\t\tif ( keycode === 39 ) {\n\t\t\t\t\t\t\t\ttarget = slider.getTarget( 'next' );\n\t\t\t\t\t\t\t} else if ( keycode === 37 ) {\n\t\t\t\t\t\t\t\ttarget = slider.getTarget( 'prev' );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tslider.featureAnimate( target );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// TOUCH\n\t\t\t\tif ( touch ) {\n\t\t\t\t\tmethods.touch();\n\t\t\t\t}\n\n\t\t\t\t$( window ).bind( 'resize orientationchange focus', methods.resize );\n\n\t\t\t\tslider.find( 'img' ).attr( 'draggable', 'false' );\n\t\t\t},\n\n\t\t\tcontrolNav: {\n\t\t\t\tsetup: function() {\n\t\t\t\t\tmethods.controlNav.setupPaging();\n\t\t\t\t},\n\t\t\t\tsetupPaging: function() {\n\t\t\t\t\tvar type = 'control-paging',\n\t\t\t\t\t\tj = 1,\n\t\t\t\t\t\titem,\n\t\t\t\t\t\tslide,\n\t\t\t\t\t\ti;\n\n\t\t\t\t\tslider.controlNavScaffold = $( '<ol class=\"' + namespace + 'control-nav ' + namespace + type + '\"></ol>' );\n\n\t\t\t\t\tif ( slider.pagingCount > 1 ) {\n\t\t\t\t\t\tfor ( i = 0; i < slider.pagingCount; i++ ) {\n\t\t\t\t\t\t\tslide = slider.slides.eq( i );\n\t\t\t\t\t\t\titem = '<a>' + j + '</a>';\n\t\t\t\t\t\t\tslider.controlNavScaffold.append( '<li>' + item + '</li>' );\n\t\t\t\t\t\t\tj++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// CONTROLSCONTAINER\n\t\t\t\t\t( slider.controlsContainer ) ? $( slider.controlsContainer ).append( slider.controlNavScaffold ) : slider.append( slider.controlNavScaffold );\n\t\t\t\t\tmethods.controlNav.set();\n\n\t\t\t\t\tmethods.controlNav.active();\n\n\t\t\t\t\tslider.controlNavScaffold.delegate( 'a, img', eventType, function( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\tif ( watchedEvent === '' || watchedEvent === event.type ) {\n\t\t\t\t\t\t\tvar $this = $( this ),\n\t\t\t\t\t\t\t\ttarget = slider.controlNav.index( $this );\n\n\t\t\t\t\t\t\tif ( ! $this.hasClass( namespace + 'active' ) ) {\n\t\t\t\t\t\t\t\tslider.direction = ( target > slider.currentSlide ) ? 'next' : 'prev';\n\t\t\t\t\t\t\t\tslider.featureAnimate( target );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Set up flags to prevent event duplication.\n\t\t\t\t\t\tif ( watchedEvent === '' ) {\n\t\t\t\t\t\t\twatchedEvent = event.type;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmethods.setToClearWatchedEvent();\n\t\t\t\t\t} );\n\t\t\t\t},\n\t\t\t\tset: function() {\n\t\t\t\t\tvar selector = 'a';\n\t\t\t\t\tslider.controlNav = $( '.' + namespace + 'control-nav li ' + selector, ( slider.controlsContainer ) ? slider.controlsContainer : slider );\n\t\t\t\t},\n\t\t\t\tactive: function() {\n\t\t\t\t\tslider.controlNav.removeClass( namespace + 'active' ).eq( slider.animatingTo ).addClass( namespace + 'active' );\n\t\t\t\t},\n\t\t\t\tupdate: function( action, pos ) {\n\t\t\t\t\tif ( slider.pagingCount > 1 && action === 'add' ) {\n\t\t\t\t\t\tslider.controlNavScaffold.append( $( '<li><a>' + slider.count + '</a></li>' ) );\n\t\t\t\t\t} else if ( slider.pagingCount === 1 ) {\n\t\t\t\t\t\tslider.controlNavScaffold.find( 'li' ).remove();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tslider.controlNav.eq( pos ).closest( 'li' ).remove();\n\t\t\t\t\t}\n\t\t\t\t\tmethods.controlNav.set();\n\t\t\t\t\t( slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length ) ? slider.update( pos, action ) : methods.controlNav.active();\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tdirectionNav: {\n\t\t\t\tsetup: function() {\n\t\t\t\t\tvar directionNavScaffold = $( '<ul class=\"' + namespace + 'direction-nav\"><li><a class=\"' + namespace + 'prev\" href=\"#\">' + slider.vars.prevText + '</a></li><li><a class=\"' + namespace + 'next\" href=\"#\">' + slider.vars.nextText + '</a></li></ul>' );\n\n\t\t\t\t\t// CONTROLSCONTAINER\n\t\t\t\t\tif ( slider.controlsContainer ) {\n\t\t\t\t\t\t$( slider.controlsContainer ).append( directionNavScaffold );\n\t\t\t\t\t\tslider.directionNav = $( '.' + namespace + 'direction-nav li a', slider.controlsContainer );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tslider.append( directionNavScaffold );\n\t\t\t\t\t\tslider.directionNav = $( '.' + namespace + 'direction-nav li a', slider );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethods.directionNav.update();\n\n\t\t\t\t\tslider.directionNav.bind( eventType, function( event ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tvar target;\n\n\t\t\t\t\t\tif ( watchedEvent === '' || watchedEvent === event.type ) {\n\t\t\t\t\t\t\ttarget = ( $( this ).hasClass( namespace + 'next' ) ) ? slider.getTarget( 'next' ) : slider.getTarget( 'prev' );\n\t\t\t\t\t\t\tslider.featureAnimate( target );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Set up flags to prevent event duplication.\n\t\t\t\t\t\tif ( watchedEvent === '' ) {\n\t\t\t\t\t\t\twatchedEvent = event.type;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmethods.setToClearWatchedEvent();\n\t\t\t\t\t} );\n\t\t\t\t},\n\t\t\t\tupdate: function() {\n\t\t\t\t\tvar disabledClass = namespace + 'disabled';\n\t\t\t\t\tif ( slider.pagingCount === 1 ) {\n\t\t\t\t\t\tslider.directionNav.addClass( disabledClass ).attr( 'tabindex', '-1' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tslider.directionNav.removeClass( disabledClass ).removeAttr( 'tabindex' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\ttouch: function() {\n\t\t\t\tvar startX,\n\t\t\t\t\tstartY,\n\t\t\t\t\toffset,\n\t\t\t\t\tcwidth,\n\t\t\t\t\tdx,\n\t\t\t\t\tstartT,\n\t\t\t\t\tscrolling = false,\n\t\t\t\t\tlocalX = 0,\n\t\t\t\t\tlocalY = 0,\n\t\t\t\t\taccDx = 0;\n\n\t\t\t\tif ( ! msGesture ) {\n\t\t\t\t\tel.addEventListener( 'touchstart', onTouchStart, false );\n\t\t\t\t} else {\n\t\t\t\t\tel.style.msTouchAction = 'none';\n\t\t\t\t\tel._gesture = new MSGesture(); // MSFT specific.\n\t\t\t\t\tel._gesture.target = el;\n\t\t\t\t\tel.addEventListener( 'MSPointerDown', onMSPointerDown, false );\n\t\t\t\t\tel._slider = slider;\n\t\t\t\t\tel.addEventListener( 'MSGestureChange', onMSGestureChange, false );\n\t\t\t\t\tel.addEventListener( 'MSGestureEnd', onMSGestureEnd, false );\n\t\t\t\t}\n\n\t\t\t\tfunction onTouchStart( e ) {\n\t\t\t\t\tif ( slider.animating ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t} else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) {\n\t\t\t\t\t\tcwidth = slider.w;\n\t\t\t\t\t\tstartT = Number( new Date() );\n\n\t\t\t\t\t\t// Local vars for X and Y points.\n\t\t\t\t\t\tlocalX = e.touches[0].pageX;\n\t\t\t\t\t\tlocalY = e.touches[0].pageY;\n\n\t\t\t\t\t\toffset = ( slider.currentSlide + slider.cloneOffset ) * cwidth;\n\t\t\t\t\t\tif ( slider.animatingTo === slider.last && slider.direction !== 'next' ) {\n\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstartX = localX;\n\t\t\t\t\t\tstartY = localY;\n\n\t\t\t\t\t\tel.addEventListener( 'touchmove', onTouchMove, false );\n\t\t\t\t\t\tel.addEventListener( 'touchend', onTouchEnd, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction onTouchMove( e ) {\n\t\t\t\t\t// Local vars for X and Y points.\n\t\t\t\t\tlocalX = e.touches[0].pageX;\n\t\t\t\t\tlocalY = e.touches[0].pageY;\n\n\t\t\t\t\tdx = startX - localX;\n\t\t\t\t\tscrolling = Math.abs( dx ) < Math.abs( localY - startY );\n\n\t\t\t\t\tif ( ! scrolling ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif ( slider.transitions ) {\n\t\t\t\t\t\t\tslider.setProps( offset + dx, 'setTouch' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction onTouchEnd() {\n\t\t\t\t\t// Finish the touch by undoing the touch session.\n\t\t\t\t\tel.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\t\t\t\tif ( slider.animatingTo === slider.currentSlide && ! scrolling && dx !== null ) {\n\t\t\t\t\t\tvar updateDx = dx,\n\t\t\t\t\t\t\ttarget = ( updateDx > 0 ) ? slider.getTarget( 'next' ) : slider.getTarget( 'prev' );\n\n\t\t\t\t\t\tslider.featureAnimate( target );\n\t\t\t\t\t}\n\t\t\t\t\tel.removeEventListener( 'touchend', onTouchEnd, false );\n\n\t\t\t\t\tstartX = null;\n\t\t\t\t\tstartY = null;\n\t\t\t\t\tdx = null;\n\t\t\t\t\toffset = null;\n\t\t\t\t}\n\n\t\t\t\tfunction onMSPointerDown( e ) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tif ( slider.animating ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel._gesture.addPointer( e.pointerId );\n\t\t\t\t\t\taccDx = 0;\n\t\t\t\t\t\tcwidth = slider.w;\n\t\t\t\t\t\tstartT = Number( new Date() );\n\t\t\t\t\t\toffset = ( slider.currentSlide + slider.cloneOffset ) * cwidth;\n\t\t\t\t\t\tif ( slider.animatingTo === slider.last && slider.direction !== 'next' ) {\n\t\t\t\t\t\t\toffset = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction onMSGestureChange( e ) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tvar slider = e.target._slider,\n\t\t\t\t\t\ttransX,\n\t\t\t\t\t\ttransY;\n\t\t\t\t\tif ( ! slider ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\ttransX = -e.translationX,\n\t\t\t\t\ttransY = -e.translationY;\n\n\t\t\t\t\t// Accumulate translations.\n\t\t\t\t\taccDx = accDx + transX;\n\t\t\t\t\tdx = accDx;\n\t\t\t\t\tscrolling = Math.abs( accDx ) < Math.abs( -transY );\n\n\t\t\t\t\tif ( e.detail === e.MSGESTURE_FLAG_INERTIA ) {\n\t\t\t\t\t\tsetImmediate( function () { // MSFT specific.\n\t\t\t\t\t\t\tel._gesture.stop();\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! scrolling || Number( new Date() ) - startT > 500 ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tif ( slider.transitions ) {\n\t\t\t\t\t\t\tslider.setProps( offset + dx, 'setTouch' );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction onMSGestureEnd( e ) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tvar slider = e.target._slider,\n\t\t\t\t\t\tupdateDx,\n\t\t\t\t\t\ttarget;\n\t\t\t\t\tif ( ! slider ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( slider.animatingTo === slider.currentSlide && ! scrolling && dx !== null ) {\n\t\t\t\t\t\tupdateDx = dx,\n\t\t\t\t\t\ttarget = ( updateDx > 0 ) ? slider.getTarget( 'next' ) : slider.getTarget( 'prev' );\n\n\t\t\t\t\t\tslider.featureAnimate( target );\n\t\t\t\t\t}\n\n\t\t\t\t\tstartX = null;\n\t\t\t\t\tstartY = null;\n\t\t\t\t\tdx = null;\n\t\t\t\t\toffset = null;\n\t\t\t\t\taccDx = 0;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tresize: function() {\n\t\t\t\tif ( ! slider.animating && slider.is( ':visible' ) ) {\n\t\t\t\t\tslider.doMath();\n\n\t\t\t\t\t// SMOOTH HEIGHT\n\t\t\t\t\tmethods.smoothHeight();\n\t\t\t\t\tslider.newSlides.width( slider.computedW );\n\t\t\t\t\tslider.setProps( slider.computedW, 'setTotal' );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tsmoothHeight: function( dur ) {\n\t\t\t\tvar $obj = slider.viewport;\n\t\t\t\t( dur ) ? $obj.animate( { 'height': slider.slides.eq( slider.animatingTo ).height() }, dur ) : $obj.height( slider.slides.eq( slider.animatingTo ).height() );\n\t\t\t},\n\n\t\t\tsetToClearWatchedEvent: function() {\n\t\t\t\tclearTimeout( watchedEventClearTimer );\n\t\t\t\twatchedEventClearTimer = setTimeout( function() {\n\t\t\t\t\twatchedEvent = '';\n\t\t\t\t}, 3000 );\n\t\t\t}\n\t\t};\n\n\t\t// Public methods.\n\t\tslider.featureAnimate = function( target ) {\n\t\t\tif ( target !== slider.currentSlide ) {\n\t\t\t\tslider.direction = ( target > slider.currentSlide ) ? 'next' : 'prev';\n\t\t\t}\n\n\t\t\tif ( ! slider.animating && slider.is( ':visible' ) ) {\n\t\t\t\tslider.animating = true;\n\t\t\t\tslider.animatingTo = target;\n\n\t\t\t\t// CONTROLNAV\n\t\t\t\tmethods.controlNav.active();\n\n\t\t\t\tslider.slides.removeClass( namespace + 'active-slide' ).eq( target ).addClass( namespace + 'active-slide' );\n\n\t\t\t\tslider.atEnd = target === 0 || target === slider.last;\n\n\t\t\t\t// DIRECTIONNAV\n\t\t\t\tmethods.directionNav.update();\n\n\t\t\t\tvar dimension = slider.computedW,\n\t\t\t\t\tslideString;\n\n\t\t\t\tif ( slider.currentSlide === 0 && target === slider.count - 1 && slider.direction !== 'next' ) {\n\t\t\t\t\tslideString = 0;\n\t\t\t\t} else if ( slider.currentSlide === slider.last && target === 0 && slider.direction !== 'prev' ) {\n\t\t\t\t\tslideString = ( slider.count + 1 ) * dimension;\n\t\t\t\t} else {\n\t\t\t\t\tslideString = ( target + slider.cloneOffset ) * dimension;\n\t\t\t\t}\n\t\t\t\tslider.setProps( slideString, '', slider.vars.animationSpeed );\n\t\t\t\tif ( slider.transitions ) {\n\t\t\t\t\tif ( ! slider.atEnd ) {\n\t\t\t\t\t\tslider.animating = false;\n\t\t\t\t\t\tslider.currentSlide = slider.animatingTo;\n\t\t\t\t\t}\n\t\t\t\t\tslider.container.unbind( 'webkitTransitionEnd transitionend' );\n\t\t\t\t\tslider.container.bind( 'webkitTransitionEnd transitionend', function() {\n\t\t\t\t\t\tslider.wrapup( dimension );\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tslider.container.animate( slider.args, slider.vars.animationSpeed, 'swing', function() {\n\t\t\t\t\t\tslider.wrapup( dimension );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// SMOOTH HEIGHT\n\t\t\t\tmethods.smoothHeight( slider.vars.animationSpeed );\n\t\t\t}\n\t\t};\n\n\t\tslider.wrapup = function( dimension ) {\n\t\t\tif ( slider.currentSlide === 0 && slider.animatingTo === slider.last ) {\n\t\t\t\tslider.setProps( dimension, 'jumpEnd' );\n\t\t\t} else if ( slider.currentSlide === slider.last && slider.animatingTo === 0 ) {\n\t\t\t\tslider.setProps( dimension, 'jumpStart' );\n\t\t\t}\n\t\t\tslider.animating = false;\n\t\t\tslider.currentSlide = slider.animatingTo;\n\t\t};\n\n\t\tslider.getTarget = function( dir ) {\n\t\t\tslider.direction = dir;\n\n\t\t\t// Swap for RTL.\n\t\t\tif ( slider.isRtl ) {\n\t\t\t\tdir = 'next' === dir ? 'prev' : 'next';\n\t\t\t}\n\n\t\t\tif ( dir === 'next' ) {\n\t\t\t\treturn ( slider.currentSlide === slider.last ) ? 0 : slider.currentSlide + 1;\n\t\t\t} else {\n\t\t\t\treturn ( slider.currentSlide === 0 ) ? slider.last : slider.currentSlide - 1;\n\t\t\t}\n\t\t};\n\n\t\tslider.setProps = function( pos, special, dur ) {\n\t\t\tvar target = ( function() {\n\t\t\t\tvar posCalc = ( function() {\n\t\t\t\t\t\tswitch ( special ) {\n\t\t\t\t\t\t\tcase 'setTotal': return ( slider.currentSlide + slider.cloneOffset ) * pos;\n\t\t\t\t\t\t\tcase 'setTouch': return pos;\n\t\t\t\t\t\t\tcase 'jumpEnd': return slider.count * pos;\n\t\t\t\t\t\t\tcase 'jumpStart': return pos;\n\t\t\t\t\t\t\tdefault: return pos;\n\t\t\t\t\t\t}\n\t\t\t\t\t}() );\n\n\t\t\t\t\treturn ( posCalc * -1 ) + 'px';\n\t\t\t\t}() );\n\n\t\t\tif ( slider.transitions ) {\n\t\t\t\ttarget = 'translate3d(' + target + ',0,0 )';\n\t\t\t\tdur = ( dur !== undefined ) ? ( dur / 1000 ) + 's' : '0s';\n\t\t\t\tslider.container.css( '-' + slider.pfx + '-transition-duration', dur );\n\t\t\t}\n\n\t\t\tslider.args[slider.prop] = target;\n\t\t\tif ( slider.transitions || dur === undefined ) {\n\t\t\t\tslider.container.css( slider.args );\n\t\t\t}\n\t\t};\n\n\t\tslider.setup = function( type ) {\n\t\t\tvar sliderOffset;\n\n\t\t\tif ( type === 'init' ) {\n\t\t\t\tslider.viewport = $( '<div class=\"' + namespace + 'viewport\"></div>' ).css( { 'overflow': 'hidden', 'position': 'relative' } ).appendTo( slider ).append( slider.container );\n\t\t\t\tslider.cloneCount = 0;\n\t\t\t\tslider.cloneOffset = 0;\n\t\t\t}\n\t\t\tslider.cloneCount = 2;\n\t\t\tslider.cloneOffset = 1;\n\t\t\t// Clear out old clones.\n\t\t\tif ( type !== 'init' ) {\n\t\t\t\tslider.container.find( '.clone' ).remove();\n\t\t\t}\n\n\t\t\tslider.container.append( slider.slides.first().clone().addClass( 'clone' ).attr( 'aria-hidden', 'true' ) ).prepend( slider.slides.last().clone().addClass( 'clone' ).attr( 'aria-hidden', 'true' ) );\n\t\t\tslider.newSlides = $( slider.vars.selector, slider );\n\n\t\t\tsliderOffset = slider.currentSlide + slider.cloneOffset;\n\t\t\tslider.container.width( ( slider.count + slider.cloneCount ) * 200 + '%' );\n\t\t\tslider.setProps( sliderOffset * slider.computedW, 'init' );\n\t\t\tsetTimeout( function() {\n\t\t\t\tslider.doMath();\n\t\t\t\tslider.newSlides.css( { 'width': slider.computedW, 'float': 'left', 'display': 'block' } );\n\t\t\t\t// SMOOTH HEIGHT\n\t\t\t\tmethods.smoothHeight();\n\t\t\t}, ( type === 'init' ) ? 100 : 0 );\n\n\t\t\tslider.slides.removeClass( namespace + 'active-slide' ).eq( slider.currentSlide ).addClass( namespace + 'active-slide' );\n\t\t};\n\n\t\tslider.doMath = function() {\n\t\t\tvar slide = slider.slides.first();\n\n\t\t\tslider.w = ( slider.viewport === undefined ) ? slider.width() : slider.viewport.width();\n\t\t\tslider.h = slide.height();\n\t\t\tslider.boxPadding = slide.outerWidth() - slide.width();\n\n\t\t\tslider.itemW = slider.w;\n\t\t\tslider.pagingCount = slider.count;\n\t\t\tslider.last = slider.count - 1;\n\t\t\tslider.computedW = slider.itemW - slider.boxPadding;\n\t\t};\n\n\t\tslider.update = function( pos, action ) {\n\t\t\tslider.doMath();\n\n\t\t\t// Update currentSlide and slider.animatingTo if necessary.\n\t\t\tif ( pos < slider.currentSlide ) {\n\t\t\t\tslider.currentSlide += 1;\n\t\t\t} else if ( pos <= slider.currentSlide && pos !== 0 ) {\n\t\t\t\tslider.currentSlide -= 1;\n\t\t\t}\n\t\t\tslider.animatingTo = slider.currentSlide;\n\n\t\t\t// Update controlNav.\n\t\t\tif ( action === 'add' || slider.pagingCount > slider.controlNav.length ) {\n\t\t\t\tmethods.controlNav.update( 'add' );\n\t\t\t} else if ( action === 'remove' || slider.pagingCount < slider.controlNav.length ) {\n\t\t\t\tif ( slider.currentSlide > slider.last ) {\n\t\t\t\t\tslider.currentSlide -= 1;\n\t\t\t\t\tslider.animatingTo -= 1;\n\t\t\t\t}\n\t\t\t\tmethods.controlNav.update( 'remove', slider.last );\n\t\t\t}\n\t\t\t// Update directionNav.\n\t\t\tmethods.directionNav.update();\n\t\t};\n\n\t\t// FeaturedSlider: initialize.\n\t\tmethods.init();\n\t};\n\n\t// Default settings.\n\t$.featuredslider.defaults = {\n\t\tnamespace: 'slider-',     // String: prefix string attached to the class of every element generated by the plugin.\n\t\tselector: '.slides > li', // String: selector, must match a simple pattern.\n\t\tanimationSpeed: 600,      // Integer: Set the speed of animations, in milliseconds.\n\t\tcontrolsContainer: '',    // jQuery Object/Selector: container navigation to append elements.\n\n\t\t// Text labels.\n\t\tprevText: featuredSliderDefaults.prevText, // String: Set the text for the \"previous\" directionNav item.\n\t\tnextText: featuredSliderDefaults.nextText  // String: Set the text for the \"next\" directionNav item.\n\t};\n\n\t// FeaturedSlider: plugin function.\n\t$.fn.featuredslider = function( options ) {\n\t\tif ( options === undefined ) {\n\t\t\toptions = {};\n\t\t}\n\n\t\tif ( typeof options === 'object' ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\tselector = ( options.selector ) ? options.selector : '.slides > li',\n\t\t\t\t\t$slides = $this.find( selector );\n\n\t\t\tif ( $slides.length === 1 || $slides.length === 0 ) {\n\t\t\t\t\t$slides.fadeIn( 400 );\n\t\t\t\t} else if ( $this.data( 'featuredslider' ) === undefined ) {\n\t\t\t\t\tnew $.featuredslider( this, options );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/languages/twentyfourteen.pot",
    "content": "# Copyright (C) 2015 the WordPress team\n# This file is distributed under the GNU General Public License v2 or later.\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Twenty Fourteen 1.6\\n\"\n\"Report-Msgid-Bugs-To: https://wordpress.org/support/theme/twentyfourteen\\n\"\n\"POT-Creation-Date: 2015-12-08 15:15:01+00:00\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"PO-Revision-Date: 2015-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\n#: 404.php:17\nmsgid \"Not Found\"\nmsgstr \"\"\n\n#: 404.php:21\nmsgid \"It looks like nothing was found at this location. Maybe try a search?\"\nmsgstr \"\"\n\n#: archive.php:31\nmsgid \"Daily Archives: %s\"\nmsgstr \"\"\n\n#: archive.php:34\nmsgid \"Monthly Archives: %s\"\nmsgstr \"\"\n\n#: archive.php:34\nmsgctxt \"monthly archives date format\"\nmsgid \"F Y\"\nmsgstr \"\"\n\n#: archive.php:37\nmsgid \"Yearly Archives: %s\"\nmsgstr \"\"\n\n#: archive.php:37\nmsgctxt \"yearly archives date format\"\nmsgid \"Y\"\nmsgstr \"\"\n\n#: archive.php:40 taxonomy-post_format.php:51\nmsgid \"Archives\"\nmsgstr \"\"\n\n#: author.php:31\nmsgid \"All posts by %s\"\nmsgstr \"\"\n\n#: category.php:20\nmsgid \"Category Archives: %s\"\nmsgstr \"\"\n\n#: comments.php:27\nmsgid \"One thought on &ldquo;%2$s&rdquo;\"\nmsgid_plural \"%1$s thoughts on &ldquo;%2$s&rdquo;\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: comments.php:34 comments.php:52\nmsgid \"Comment navigation\"\nmsgstr \"\"\n\n#: comments.php:35 comments.php:53\nmsgid \"&larr; Older Comments\"\nmsgstr \"\"\n\n#: comments.php:36 comments.php:54\nmsgid \"Newer Comments &rarr;\"\nmsgstr \"\"\n\n#: comments.php:59\nmsgid \"Comments are closed.\"\nmsgstr \"\"\n\n#: content-aside.php:17 content-audio.php:17 content-featured-post.php:28\n#: content-gallery.php:17 content-image.php:17 content-link.php:17\n#: content-quote.php:17 content-video.php:17 content.php:19\nmsgctxt \"Used between list items, there is a space after the comma.\"\nmsgid \", \"\nmsgstr \"\"\n\n#: content-aside.php:37 content-audio.php:37 content-gallery.php:37\n#: content-image.php:37 content-link.php:37 content-quote.php:37\n#: content-video.php:37 content.php:38 inc/widgets.php:194\nmsgid \"Leave a comment\"\nmsgstr \"\"\n\n#: content-aside.php:37 content-audio.php:37 content-gallery.php:37\n#: content-image.php:37 content-link.php:37 content-quote.php:37\n#: content-video.php:37 content.php:38 inc/widgets.php:194\nmsgid \"1 Comment\"\nmsgstr \"\"\n\n#: content-aside.php:37 content-audio.php:37 content-gallery.php:37\n#: content-image.php:37 content-link.php:37 content-quote.php:37\n#: content-video.php:37 content.php:38 inc/widgets.php:194\nmsgid \"% Comments\"\nmsgstr \"\"\n\n#: content-aside.php:40 content-audio.php:40 content-gallery.php:40\n#: content-image.php:40 content-link.php:40 content-page.php:28\n#: content-quote.php:40 content-video.php:40 content.php:42 image.php:34\n#: page-templates/contributors.php:35\nmsgid \"Edit\"\nmsgstr \"\"\n\n#. translators: %s: Name of current post\n#: content-aside.php:48 content-audio.php:48 content-gallery.php:48\n#: content-image.php:48 content-link.php:48 content-quote.php:48\n#: content-video.php:48 content.php:56 inc/template-tags.php:222\nmsgid \"Continue reading %s <span class=\\\"meta-nav\\\">&rarr;</span>\"\nmsgstr \"\"\n\n#: content-aside.php:53 content-audio.php:53 content-gallery.php:53\n#: content-image.php:53 content-link.php:53 content-page.php:22\n#: content-quote.php:53 content-video.php:53 content.php:61 image.php:54\nmsgid \"Pages:\"\nmsgstr \"\"\n\n#: content-none.php:12\nmsgid \"Nothing Found\"\nmsgstr \"\"\n\n#: content-none.php:18\nmsgid \"\"\n\"Ready to publish your first post? <a href=\\\"%1$s\\\">Get started here</a>.\"\nmsgstr \"\"\n\n#: content-none.php:22\nmsgid \"\"\n\"Sorry, but nothing matched your search terms. Please try again with some \"\n\"different keywords.\"\nmsgstr \"\"\n\n#: content-none.php:27\nmsgid \"\"\n\"It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps \"\n\"searching can help.\"\nmsgstr \"\"\n\n#. #-#-#-#-#  twentyfourteen.pot (Twenty Fourteen 1.6)  #-#-#-#-#\n#. Author URI of the plugin/theme\n#: footer.php:21\nmsgid \"https://wordpress.org/\"\nmsgstr \"\"\n\n#: footer.php:21\nmsgid \"Proudly powered by %s\"\nmsgstr \"\"\n\n#: functions.php:83\nmsgid \"Top primary menu\"\nmsgstr \"\"\n\n#: functions.php:84\nmsgid \"Secondary menu in left sidebar\"\nmsgstr \"\"\n\n#: functions.php:171\nmsgid \"Primary Sidebar\"\nmsgstr \"\"\n\n#: functions.php:173\nmsgid \"Main sidebar that appears on the left.\"\nmsgstr \"\"\n\n#: functions.php:180\nmsgid \"Content Sidebar\"\nmsgstr \"\"\n\n#: functions.php:182\nmsgid \"Additional sidebar that appears on the right.\"\nmsgstr \"\"\n\n#: functions.php:189\nmsgid \"Footer Widget Area\"\nmsgstr \"\"\n\n#: functions.php:191\nmsgid \"Appears in the footer section of the site.\"\nmsgstr \"\"\n\n#. Translators: If there are characters in your language that are not supported\n#. by Lato, translate this to 'off'. Do not translate into your own language.\n#: functions.php:213\nmsgctxt \"Lato font: on or off\"\nmsgid \"on\"\nmsgstr \"\"\n\n#: functions.php:258\nmsgid \"Previous\"\nmsgstr \"\"\n\n#: functions.php:259\nmsgid \"Next\"\nmsgstr \"\"\n\n#: functions.php:376\nmsgid \"%d Article\"\nmsgid_plural \"%d Articles\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: functions.php:495\nmsgid \"Page %s\"\nmsgstr \"\"\n\n#: header.php:48\nmsgid \"Search\"\nmsgstr \"\"\n\n#: header.php:52\nmsgid \"Primary Menu\"\nmsgstr \"\"\n\n#: header.php:53\nmsgid \"Skip to content\"\nmsgstr \"\"\n\n#: image.php:65\nmsgid \"Previous Image\"\nmsgstr \"\"\n\n#: image.php:66\nmsgid \"Next Image\"\nmsgstr \"\"\n\n#: inc/back-compat.php:37 inc/back-compat.php:47 inc/back-compat.php:60\nmsgid \"\"\n\"Twenty Fourteen requires at least WordPress version 3.6. You are running \"\n\"version %s. Please upgrade and try again.\"\nmsgstr \"\"\n\n#: inc/customizer.php:24\nmsgid \"Site Title Color\"\nmsgstr \"\"\n\n#: inc/customizer.php:27\nmsgid \"Display Site Title &amp; Tagline\"\nmsgstr \"\"\n\n#: inc/customizer.php:31 inc/customizer.php:32\nmsgid \"May only be visible on wide screens.\"\nmsgstr \"\"\n\n#: inc/customizer.php:34 inc/customizer.php:35\nmsgid \"Background may only be visible on wide screens.\"\nmsgstr \"\"\n\n#: inc/customizer.php:40 inc/featured-content.php:403\nmsgid \"Featured Content\"\nmsgstr \"\"\n\n#: inc/customizer.php:41 inc/featured-content.php:404\nmsgid \"\"\n\"Use a <a href=\\\"%1$s\\\">tag</a> to feature your posts. If no posts match the \"\n\"tag, <a href=\\\"%2$s\\\">sticky posts</a> will be displayed instead.\"\nmsgstr \"\"\n\n#: inc/customizer.php:42 inc/customizer.php:108 inc/featured-content.php:405\n#: inc/featured-content.php:414 inc/featured-content.php:474\nmsgctxt \"featured content default tag slug\"\nmsgid \"featured\"\nmsgstr \"\"\n\n#: inc/customizer.php:56\nmsgid \"Layout\"\nmsgstr \"\"\n\n#: inc/customizer.php:60\nmsgid \"Grid\"\nmsgstr \"\"\n\n#: inc/customizer.php:61\nmsgid \"Slider\"\nmsgstr \"\"\n\n#. #-#-#-#-#  twentyfourteen.pot (Twenty Fourteen 1.6)  #-#-#-#-#\n#. Theme Name of the plugin/theme\n#: inc/customizer.php:105\nmsgid \"Twenty Fourteen\"\nmsgstr \"\"\n\n#: inc/customizer.php:108\nmsgid \"\"\n\"The home page features your choice of up to 6 posts prominently displayed in \"\n\"a grid or slider, controlled by a <a href=\\\"%1$s\\\">tag</a>; you can change \"\n\"the tag and layout in <a href=\\\"%2$s\\\">Appearance &rarr; Customize</a>. If \"\n\"no posts match the tag, <a href=\\\"%3$s\\\">sticky posts</a> will be displayed \"\n\"instead.\"\nmsgstr \"\"\n\n#: inc/customizer.php:109\nmsgid \"\"\n\"Enhance your site design by using <a href=\\\"%s\\\">Featured Images</a> for \"\n\"posts you&rsquo;d like to stand out (also known as post thumbnails). This \"\n\"allows you to associate an image with your post without inserting it. Twenty \"\n\"Fourteen uses featured images for posts and pages&mdash;above the \"\n\"title&mdash;and in the Featured Content area on the home page.\"\nmsgstr \"\"\n\n#: inc/customizer.php:110\nmsgid \"\"\n\"For an in-depth tutorial, and more tips and tricks, visit the <a href=\\\"%s\"\n\"\\\">Twenty Fourteen documentation</a>.\"\nmsgstr \"\"\n\n#: inc/featured-content.php:426\nmsgid \"Tag Name\"\nmsgstr \"\"\n\n#: inc/featured-content.php:431\nmsgid \"Don&rsquo;t display tag on front end.\"\nmsgstr \"\"\n\n#: inc/template-tags.php:50\nmsgid \"&larr; Previous\"\nmsgstr \"\"\n\n#: inc/template-tags.php:51\nmsgid \"Next &rarr;\"\nmsgstr \"\"\n\n#: inc/template-tags.php:58\nmsgid \"Posts navigation\"\nmsgstr \"\"\n\n#: inc/template-tags.php:85\nmsgid \"Post navigation\"\nmsgstr \"\"\n\n#: inc/template-tags.php:89\nmsgid \"<span class=\\\"meta-nav\\\">Published In</span>%title\"\nmsgstr \"\"\n\n#: inc/template-tags.php:91\nmsgid \"<span class=\\\"meta-nav\\\">Previous Post</span>%title\"\nmsgstr \"\"\n\n#: inc/template-tags.php:92\nmsgid \"<span class=\\\"meta-nav\\\">Next Post</span>%title\"\nmsgstr \"\"\n\n#: inc/template-tags.php:109\nmsgid \"Sticky\"\nmsgstr \"\"\n\n#: inc/widgets.php:34\nmsgid \"Twenty Fourteen Ephemera\"\nmsgstr \"\"\n\n#: inc/widgets.php:36\nmsgid \"\"\n\"Use this widget to list your recent Aside, Quote, Video, Audio, Image, \"\n\"Gallery, and Link posts.\"\nmsgstr \"\"\n\n#: inc/widgets.php:54 taxonomy-post_format.php:33\nmsgid \"Images\"\nmsgstr \"\"\n\n#: inc/widgets.php:55\nmsgid \"More images\"\nmsgstr \"\"\n\n#: inc/widgets.php:58 taxonomy-post_format.php:36\nmsgid \"Videos\"\nmsgstr \"\"\n\n#: inc/widgets.php:59\nmsgid \"More videos\"\nmsgstr \"\"\n\n#: inc/widgets.php:62 taxonomy-post_format.php:39\nmsgid \"Audio\"\nmsgstr \"\"\n\n#: inc/widgets.php:63\nmsgid \"More audio\"\nmsgstr \"\"\n\n#: inc/widgets.php:66 taxonomy-post_format.php:42\nmsgid \"Quotes\"\nmsgstr \"\"\n\n#: inc/widgets.php:67\nmsgid \"More quotes\"\nmsgstr \"\"\n\n#: inc/widgets.php:70 taxonomy-post_format.php:45\nmsgid \"Links\"\nmsgstr \"\"\n\n#: inc/widgets.php:71\nmsgid \"More links\"\nmsgstr \"\"\n\n#: inc/widgets.php:74 taxonomy-post_format.php:48\nmsgid \"Galleries\"\nmsgstr \"\"\n\n#: inc/widgets.php:75\nmsgid \"More galleries\"\nmsgstr \"\"\n\n#: inc/widgets.php:79 taxonomy-post_format.php:30\nmsgid \"Asides\"\nmsgstr \"\"\n\n#: inc/widgets.php:80\nmsgid \"More asides\"\nmsgstr \"\"\n\n#: inc/widgets.php:127 inc/widgets.php:172\nmsgid \"Continue reading <span class=\\\"meta-nav\\\">&rarr;</span>\"\nmsgstr \"\"\n\n#: inc/widgets.php:162\nmsgid \"This gallery contains <a href=\\\"%1$s\\\" rel=\\\"bookmark\\\">%2$s photo</a>.\"\nmsgid_plural \"\"\n\"This gallery contains <a href=\\\"%1$s\\\" rel=\\\"bookmark\\\">%2$s photos</a>.\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#. translators: used with More archives link\n#: inc/widgets.php:206\nmsgid \"%s <span class=\\\"meta-nav\\\">&rarr;</span>\"\nmsgstr \"\"\n\n#: inc/widgets.php:255\nmsgid \"Title:\"\nmsgstr \"\"\n\n#: inc/widgets.php:258\nmsgid \"Number of posts to show:\"\nmsgstr \"\"\n\n#: inc/widgets.php:261\nmsgid \"Post format to show:\"\nmsgstr \"\"\n\n#: search.php:18\nmsgid \"Search Results for: %s\"\nmsgstr \"\"\n\n#: tag.php:22\nmsgid \"Tag Archives: %s\"\nmsgstr \"\"\n\n#. Theme URI of the plugin/theme\nmsgid \"https://wordpress.org/themes/twentyfourteen/\"\nmsgstr \"\"\n\n#. Description of the plugin/theme\nmsgid \"\"\n\"In 2014, our default theme lets you create a responsive magazine website \"\n\"with a sleek, modern design. Feature your favorite homepage content in \"\n\"either a grid or a slider. Use the three widget areas to customize your \"\n\"website, and change your content's layout with a full-width page template \"\n\"and a contributor page to show off your authors. Creating a magazine website \"\n\"with WordPress has never been easier.\"\nmsgstr \"\"\n\n#. Author of the plugin/theme\nmsgid \"the WordPress team\"\nmsgstr \"\"\n\n#. Template Name of the plugin/theme\nmsgid \"Contributor Page\"\nmsgstr \"\"\n\n#. Template Name of the plugin/theme\nmsgid \"Full Width Page\"\nmsgstr \"\"\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/page-templates/contributors.php",
    "content": "<?php\n/**\n * Template Name: Contributor Page\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n<div id=\"main-content\" class=\"main-content\">\n\n<?php\n\tif ( is_front_page() && twentyfourteen_has_featured_posts() ) {\n\t\t// Include the featured content template.\n\t\tget_template_part( 'featured-content' );\n\t}\n?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\t\t\t<?php\n\t\t\t\t// Start the Loop.\n\t\t\t\twhile ( have_posts() ) : the_post();\n\t\t\t?>\n\n\t\t\t<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t\t\t\t<?php\n\t\t\t\t\tthe_title( '<header class=\"entry-header\"><h1 class=\"entry-title\">', '</h1></header><!-- .entry-header -->' );\n\n\t\t\t\t\t// Output the authors list.\n\t\t\t\t\ttwentyfourteen_list_authors();\n\n\t\t\t\t\tedit_post_link( __( 'Edit', 'twentyfourteen' ), '<footer class=\"entry-meta\"><span class=\"edit-link\">', '</span></footer>' );\n\t\t\t\t?>\n\t\t\t</article><!-- #post-## -->\n\n\t\t\t<?php\n\t\t\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\t\t\tif ( comments_open() || get_comments_number() ) {\n\t\t\t\t\t\tcomments_template();\n\t\t\t\t\t}\n\t\t\t\tendwhile;\n\t\t\t?>\n\t\t</div><!-- #content -->\n\t</div><!-- #primary -->\n</div><!-- #main-content -->\n\n<?php\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/page-templates/full-width.php",
    "content": "<?php\n/**\n * Template Name: Full Width Page\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n<div id=\"main-content\" class=\"main-content\">\n\n<?php\n\tif ( is_front_page() && twentyfourteen_has_featured_posts() ) {\n\t\t// Include the featured content template.\n\t\tget_template_part( 'featured-content' );\n\t}\n?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\t\t\t<?php\n\t\t\t\t// Start the Loop.\n\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t// Include the page content template.\n\t\t\t\t\tget_template_part( 'content', 'page' );\n\n\t\t\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\t\t\tif ( comments_open() || get_comments_number() ) {\n\t\t\t\t\t\tcomments_template();\n\t\t\t\t\t}\n\t\t\t\tendwhile;\n\t\t\t?>\n\t\t</div><!-- #content -->\n\t</div><!-- #primary -->\n</div><!-- #main-content -->\n\n<?php\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/page.php",
    "content": "<?php\n/**\n * The template for displaying all pages\n *\n * This is the template that displays all pages by default.\n * Please note that this is the WordPress construct of pages and that\n * other 'pages' on your WordPress site will use a different template.\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n<div id=\"main-content\" class=\"main-content\">\n\n<?php\n\tif ( is_front_page() && twentyfourteen_has_featured_posts() ) {\n\t\t// Include the featured content template.\n\t\tget_template_part( 'featured-content' );\n\t}\n?>\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t\t<?php\n\t\t\t\t// Start the Loop.\n\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t// Include the page content template.\n\t\t\t\t\tget_template_part( 'content', 'page' );\n\n\t\t\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\t\t\tif ( comments_open() || get_comments_number() ) {\n\t\t\t\t\t\tcomments_template();\n\t\t\t\t\t}\n\t\t\t\tendwhile;\n\t\t\t?>\n\n\t\t</div><!-- #content -->\n\t</div><!-- #primary -->\n\t<?php get_sidebar( 'content' ); ?>\n</div><!-- #main-content -->\n\n<?php\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/readme.txt",
    "content": "=== Twenty Fourteen ===\nContributors: the WordPress team\nRequires at least: WordPress 3.6\nTested up to: WordPress 4.5-trunk\nStable tag: 1.6\nLicense: GPLv2 or later\nLicense URI: http://www.gnu.org/licenses/gpl-2.0.html\nTags: black, green, white, light, dark, two-columns, three-columns, left-sidebar, right-sidebar, fixed-layout, responsive-layout, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready\n\n== Description ==\nIn 2014, our default theme lets you create a responsive magazine website with a sleek, modern design. Feature your favorite homepage content in either a grid or a slider. Use the three widget areas to customize your website, and change your content's layout with a full-width page template and a contributor page to show off your authors. Creating a magazine website with WordPress has never been easier.\n\nFor more information about Twenty Fourteen please go to https://codex.wordpress.org/Twenty_Fourteen.\n\n== Installation ==\n\n1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button.\n2. Type in Twenty Fourteen in the search form and press the 'Enter' key in your keyboard.\n3. Click on the 'Activate' button to use your new theme right away.\n4. Go to https://codex.wordpress.org/Twenty_Fourteen for a guide to customize this theme.\n5. Navigate to Appearance > Customize in your admin panel.\n\n== Copyright ==\n\nTwenty Fourteen WordPress Theme, Copyright 2013-2015 WordPress.org & Automattic.com\nTwenty Fourteen is Distributed under the terms of the GNU GPL\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nTwenty Fourteen Theme is derived from the Further Theme, Copyright 2013 Takashi Irie\nFurther Theme is distributed under the terms of the GNU GPL\n\nTwenty Fourteen Theme bundles the following third-party resources:\n\nHTML5 Shiv v3.7.0, Copyright 2014 Alexander Farkas\nLicenses: MIT/GPL2\nSource: https://github.com/aFarkas/html5shiv\n\nGenericons icon font, Copyright 2013-2015 Automattic.com\nLicense: GNU GPL, Version 2 (or later)\nSource: http://www.genericons.com\n\n== Changelog ==\n\n= 1.6 =\n* Released: December 8, 2015\n\nhttps://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.6\n\n= 1.5 =\n* Released: August 18, 2015\n\nhttps://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.5\n\n= 1.4 =\n* Released: April 23, 2015\n\nhttps://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.4\n\n= 1.3 =\n* Released: December 18, 2014\n\nhttps://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.3\n\n= 1.2 =\n* Released: September 4, 2014\n\nhttps://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.2\n\n= 1.1 =\n* Released: May 8, 2014\n\nhttps://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.1\n\n= 1.0 =\n* Released: December 12, 2013\n\nInitial release.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/rtl.css",
    "content": "/*\nTheme Name: Twenty Fourteen\nDescription: Adds support for languages written in a Right To Left (RTL) direction.\nIt's easy, just a matter of overwriting all the horizontal positioning attributes\nof your CSS stylesheet in a separate stylesheet file named rtl.css.\n\nSee https://codex.wordpress.org/Right_to_Left_Language_Support\n*/\n\n/**\n * Table of Contents:\n *\n * 1.0 - Reset\n * 2.0 - Repeatable Patterns\n * 4.0 - Header\n * 5.0 - Navigation\n * 6.0 - Content\n *   6.3 - Entry Meta\n *   6.4 - Entry Content\n *   6.5 - Galleries\n *   6.7 - Post/Image/Paging Navigation\n *   6.10 - Contributor Page\n *   6.14 - Comments\n * 7.0 - Sidebar\n *   7.1 - Widgets\n *   7.2 - Content Sidebar Widgets\n * 9.0 - Featured Content\n * 10.0 - Media Queries\n * -----------------------------------------------------------------------------\n */\n\n\n/**\n * 1.0 Reset\n * -----------------------------------------------------------------------------\n */\n\nbody {\n\tdirection: rtl;\n\tunicode-bidi: embed;\n}\n\na {\n\tdisplay: inline-block;\n}\n\nul,\nol {\n\tmargin: 0 20px 24px 0;\n}\n\nli > ul,\nli > ol {\n\tmargin: 0 20px 0 0;\n}\n\ncaption,\nth,\ntd {\n\ttext-align: right;\n}\n\n\n/**\n * 2.0 Repeatable Patterns\n * -----------------------------------------------------------------------------\n */\n\n.wp-caption-text {\n\tpadding-left: 10px;\n\tpadding-right: 0;\n}\n\n.screen-reader-text:focus {\n\tright: 5px;\n\tleft: auto;\n}\n\n\n/**\n * 4.0 Header\n * -----------------------------------------------------------------------------\n */\n\n.site-title {\n\tfloat: right;\n}\n\n.search-toggle {\n\tfloat: left;\n\tmargin-left: 38px;\n\tmargin-right: auto;\n}\n\n.search-box .search-field {\n\tfloat: left;\n\tpadding: 1px 6px 2px 2px;\n}\n\n.search-toggle .screen-reader-text {\n\tright: 5px; /* Avoid a horizontal scrollbar when the site has a long menu */\n\tleft: auto;\n}\n\n\n/**\n * 5.0 Navigation\n * -----------------------------------------------------------------------------\n */\n\n.site-navigation ul ul {\n\tmargin-right: 20px;\n\tmargin-left: auto;\n}\n\n.menu-toggle {\n\tright: auto;\n\tleft: 0;\n}\n\n\n/**\n * 6.0 Content\n * -----------------------------------------------------------------------------\n */\n\n/**\n * 6.3 Entry Meta\n * -----------------------------------------------------------------------------\n */\n\n.entry-meta .tag-links a {\n\tmargin: 0 10px 4px 4px;\n}\n\n.entry-meta .tag-links a:before {\n\tborder-right: 0;\n\tborder-left: 8px solid #767676;\n\tright: -7px;\n\tleft: auto;\n}\n\n.entry-meta .tag-links a:hover:before,\n.entry-meta .tag-links a:focus:before {\n\tborder-left-color: #41a62a;\n}\n\n.entry-meta .tag-links a:after {\n\tright: -2px;\n\tleft: auto;\n}\n\n\n/**\n * 6.4 Entry Content\n * -----------------------------------------------------------------------------\n */\n\n.page-links a,\n.page-links > span {\n\tmargin: 0 0 2px 1px;\n}\n\n.page-links > .page-links-title {\n\tpadding-right: 0;\n\tpadding-left: 7px;\n}\n\n\n/**\n * 6.5 Galleries\n * -----------------------------------------------------------------------------\n */\n\n.gallery-item {\n\tfloat: right;\n\tmargin: 0 0 4px 4px;\n}\n\n.gallery-columns-1 .gallery-item:nth-of-type(1n),\n.gallery-columns-2 .gallery-item:nth-of-type(2n),\n.gallery-columns-3 .gallery-item:nth-of-type(3n),\n.gallery-columns-4 .gallery-item:nth-of-type(4n),\n.gallery-columns-5 .gallery-item:nth-of-type(5n),\n.gallery-columns-6 .gallery-item:nth-of-type(6n),\n.gallery-columns-7 .gallery-item:nth-of-type(7n),\n.gallery-columns-8 .gallery-item:nth-of-type(8n),\n.gallery-columns-9 .gallery-item:nth-of-type(9n) {\n\tmargin-right: auto;\n\tmargin-left: 0;\n}\n\n.gallery-caption {\n\tpadding: 6px 8px;\n\tright: 0;\n\tleft: auto;\n\ttext-align: right;\n}\n\n.gallery-caption:before {\n\tright: 0;\n\tleft: auto;\n}\n\n\n/**\n * 6.7 Post/Image/Paging Navigation\n * -----------------------------------------------------------------------------\n */\n\n.paging-navigation .page-numbers {\n\tmargin-right: auto;\n\tmargin-left: 1px;\n}\n\n\n/**\n * 6.10 Contributor Page\n * -----------------------------------------------------------------------------\n */\n\n.contributor-avatar {\n\tfloat: right;\n\tmargin: 0 0 20px 30px;\n}\n\n\n/**\n * 6.14 Comments\n * -----------------------------------------------------------------------------\n */\n\n.comment-author .avatar {\n\tright: 0;\n\tleft: auto;\n}\n\n.bypostauthor > article .fn:before {\n\tmargin: 0 -2px 0 2px;\n}\n\n.comment-author,\n.comment-awaiting-moderation,\n.comment-content,\n.comment-list .reply,\n.comment-metadata {\n\tpadding-right: 30px;\n\tpadding-left: 0;\n}\n\n.comment-edit-link {\n\tmargin-right: 10px;\n\tmargin-left: auto;\n}\n\n.comment-reply-link:before,\n.comment-reply-login:before {\n\tmargin-left: auto;\n\tmargin-right: 2px;\n}\n\n.comment-reply-link:before,\n.comment-reply-login:before,\n.comment-edit-link:before {\n\t-webkit-transform: scaleX(-1);\n\t-moz-transform:    scaleX(-1);\n\t-ms-transform:     scaleX(-1);\n\t-o-transform:      scaleX(-1);\n\ttransform:         scaleX(-1);\n}\n\n.comment-content ul,\n.comment-content ol {\n\tmargin: 0 22px 24px 0;\n}\n\n.comment-list .children {\n\tmargin-right: 15px;\n\tmargin-left: auto;\n}\n\n.comment-reply-title small a {\n\tfloat: left;\n}\n\n.comment-navigation .nav-previous a {\n\tmargin-right: auto;\n\tmargin-left: 10px;\n}\n\n\n/**\n * 7.0 Sidebars\n * -----------------------------------------------------------------------------\n */\n\n/**\n * 7.1 Widgets\n * -----------------------------------------------------------------------------\n */\n\n.widget li > ol,\n.widget li > ul {\n\tmargin-right: 10px;\n\tmargin-left: auto;\n}\n\n.widget input,\n.widget textarea {\n\tpadding: 1px 4px 2px 2px;\n}\n\n.widget_calendar caption {\n\ttext-align: right;\n}\n\n.widget_calendar #prev {\n\tpadding-right: 5px;\n\tpadding-left: 0;\n}\n\n.widget_calendar #next {\n\tpadding-right: 0;\n\tpadding-left: 5px;\n\ttext-align: left;\n}\n\n.widget_twentyfourteen_ephemera .entry-content ul,\n.widget_twentyfourteen_ephemera .entry-content ol {\n\tmargin: 0 20px 18px 0;\n}\n\n.widget_twentyfourteen_ephemera .entry-content li > ul,\n.widget_twentyfourteen_ephemera .entry-content li > ol {\n\tmargin: 0 20px 0 0;\n}\n\n\n/**\n * 7.2 Content Sidebar Widgets\n * -----------------------------------------------------------------------------\n */\n\n.content-sidebar .widget li > ol,\n.content-sidebar .widget li > ul {\n\tmargin-right: 18px;\n\tmargin-left: auto;\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .widget-title:before {\n\tmargin: -1px 0 0 18px;\n}\n\n\n/**\n * 9.0 Featured Content\n * -----------------------------------------------------------------------------\n */\n\n.featured-content .post-thumbnail img {\n\tright: 0;\n\tleft: auto;\n}\n\n.slider-viewport {\n\tdirection: ltr;\n}\n\n.slider .featured-content .entry-header {\n\tright: 0;\n\tleft: auto;\n\ttext-align: right;\n}\n\n.slider-control-paging {\n\tfloat: right;\n}\n\n.slider-control-paging li {\n\tfloat: right;\n\tmargin: 2px 0 2px 4px;\n}\n\n.slider-control-paging li:last-child {\n\tmargin-right: auto;\n\tmargin-left: 0;\n}\n\n.slider-control-paging a:before {\n\tright: 10px;\n\tleft: auto;\n}\n\n.slider-direction-nav li {\n\tborder-width: 2px 0 0 1px;\n\tfloat: right;\n}\n\n.slider-direction-nav li:last-child {\n\tborder-width: 2px 1px 0 0;\n}\n\n.slider-direction-nav a:before {\n\tcontent: \"\\f429\";\n}\n\n.slider-direction-nav .slider-next:before {\n\tcontent: \"\\f430\";\n}\n\n\n/**\n * 10.0 Media Queries\n * -----------------------------------------------------------------------------\n */\n\n@media screen and (max-width: 400px) {\n\t.list-view .site-content .post-thumbnail img {\n\t\tfloat: right;\n\t\tmargin: 0 0 3px 10px;\n\t}\n}\n\n@media screen and (min-width: 401px) {\n\t.site-content .entry-meta > span {\n\t\tmargin-right: auto;\n\t\tmargin-left: 10px;\n\t}\n\n\t.site-content .format-quote .post-format a:before {\n\t\tmargin-right: auto;\n\t\tmargin-left: 2px;\n\t}\n\n\t.site-content .format-gallery .post-format a:before {\n\t\tmargin-right: auto;\n\t\tmargin-left: 4px;\n\t}\n\n\t.site-content .format-aside .post-format a:before {\n\t\tmargin-right: auto;\n\t\tmargin-left: 2px;\n\t}\n\n\t.site-content .featured-post:before {\n\t\tmargin-right: auto;\n\t\tmargin-left: 3px;\n\t}\n\n\t.site-content .entry-date a:before,\n\t.attachment .site-content span.entry-date:before {\n\t\tmargin-right: auto;\n\t\tmargin-left: 1px;\n\t}\n\n\t.site-content .comments-link a:before {\n\t\tmargin-right: auto;\n\t\tmargin-left: 2px;\n\t}\n\n\t.site-content .full-size-link a:before {\n\t\tmargin-right: auto;\n\t\tmargin-left: 1px;\n\t}\n\n\t.entry-content .edit-link a:before,\n\t.entry-meta .edit-link a:before {\n\t\t-webkit-transform: scaleX(-1);\n\t\t-moz-transform:    scaleX(-1);\n\t\t-ms-transform:     scaleX(-1);\n\t\t-o-transform:      scaleX(-1);\n\t\ttransform:         scaleX(-1);\n\t}\n}\n\n@media screen and (min-width: 594px) {\n\t.site-content .entry-header {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 30px;\n\t}\n}\n\n@media screen and (min-width: 673px) {\n\t.search-toggle {\n\t\tmargin-right: auto;\n\t\tmargin-left: 18px;\n\t}\n\n\t.content-area {\n\t\tfloat: right;\n\t}\n\n\t.site-content {\n\t\tmargin-right: auto;\n\t\tmargin-left: 33.33333333%;\n\t}\n\n\t.archive-header,\n\t.comments-area,\n\t.image-navigation,\n\t.page-header,\n\t.page-content,\n\t.post-navigation,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content footer.entry-meta {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 30px;\n\t}\n\n\t.full-width .site-content {\n\t\tmargin-left: 0;\n\t}\n\n\t.content-sidebar {\n\t\tfloat: left;\n\t\tmargin-right: -33.33333333%;\n\t\tmargin-left: auto;\n\t}\n\n\t.grid .featured-content .hentry {\n\t\tfloat: right;\n\t}\n\n\t.slider-control-paging {\n\t\tpadding-right: 20px;\n\t\tpadding-left: 0;\n\t}\n\n\t.slider-direction-nav {\n\t\tfloat: left;\n\t}\n\n\t.slider-direction-nav li {\n\t\tpadding: 0 0 0 1px;\n\t}\n\n\t.slider-direction-nav li:last-child {\n\t\tpadding: 0 1px 0 0;\n\t}\n}\n\n@media screen and (min-width: 783px) {\n\t.header-main {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 0;\n\t}\n\n\t.search-toggle {\n\t\tmargin-right: auto;\n\t\tmargin-left: 0;\n\t}\n\n\t.primary-navigation {\n\t\tfloat: left;\n\t\tmargin: 0 -12px 0 1px;\n\t}\n\n\t.primary-navigation ul ul {\n\t\tfloat: right;\n\t\tmargin: 0;\n\t\tright: -999em;\n\t\tleft: auto;\n\t}\n\n\t.primary-navigation ul ul ul {\n\t\tright: -999em;\n\t\tleft: auto;\n\t}\n\n\t.primary-navigation ul li:hover > ul,\n\t.primary-navigation ul li.focus > ul {\n\t\tright: auto;\n\t}\n\n\t.primary-navigation ul ul li:hover > ul,\n\t.primary-navigation ul ul li.focus > ul {\n\t\tright: 100%;\n\t\tleft: auto;\n\t}\n\n\t.primary-navigation .menu-item-has-children > a,\n\t.primary-navigation .page_item_has_children > a {\n\t\tpadding-right: 12px;\n\t\tpadding-left: 26px;\n\t}\n\n\t.primary-navigation .menu-item-has-children > a:after,\n\t.primary-navigation .page_item_has_children > a:after {\n\t\tright: auto;\n\t\tleft: 12px;\n\t}\n\n\t.primary-navigation li .menu-item-has-children > a,\n\t.primary-navigation li .page_item_has_children > a {\n\t\tpadding-right: 12px;\n\t\tpadding-left: 20px;\n\t}\n\n\t.primary-navigation .menu-item-has-children li.menu-item-has-children > a:after,\n\t.primary-navigation .menu-item-has-children li.page_item_has_children > a:after,\n\t.primary-navigation .page_item_has_children li.menu-item-has-children > a:after,\n\t.primary-navigation .page_item_has_children li.page_item_has_children > a:after {\n\t\tcontent: \"\\f503\";\n\t\tright: auto;\n\t\tleft: 8px;\n\t}\n}\n\n@media screen and (min-width: 810px) {\n\t.attachment .entry-attachment .attachment {\n\t\tmargin-right: -168px;\n\t\tmargin-left: -168px;\n\t}\n\n\t.attachment .entry-attachment .attachment a {\n\t\tdisplay: block;\n\t}\n\n\t.contributor-avatar {\n\t\tmargin-right: -168px;\n\t\tmargin-left: auto;\n\t}\n\n\t.contributor-summary {\n\t\tfloat: right;\n\t}\n\n\t.full-width .site-content blockquote.alignright,\n\t.full-width .site-content img.size-full.alignright,\n\t.full-width .site-content img.size-large.alignright,\n\t.full-width .site-content img.size-medium.alignright,\n\t.full-width .site-content .wp-caption.alignright {\n\t\tmargin-right: -168px;\n\t\tmargin-left: auto;\n\t}\n\n\t.full-width .site-content blockquote.alignleft,\n\t.full-width .site-content img.size-full.alignleft,\n\t.full-width .site-content img.size-large.alignleft,\n\t.full-width .site-content img.size-medium.alignleft,\n\t.full-width .site-content .wp-caption.alignleft {\n\t\tmargin-right: auto;\n\t\tmargin-left: -168px;\n\t}\n}\n\n@media screen and (min-width: 846px) {\n\t.comment-author,\n\t.comment-awaiting-moderation,\n\t.comment-content,\n\t.comment-list .reply,\n\t.comment-metadata {\n\t\tpadding-right: 50px;\n\t\tpadding-left: 0;\n\t}\n\n\t.comment-list .children {\n\t\tmargin-right: 20px;\n\t\tmargin-left: auto;\n\t}\n}\n\n@media screen and (min-width: 1008px) {\n\t.search-box-wrapper {\n\t\tpadding-right: 182px;\n\t\tpadding-left: 0;\n\t}\n\n\t.main-content {\n\t\tfloat: right;\n\t}\n\n\t.site-content {\n\t\tmargin-right: 182px;\n\t\tmargin-left: 29.04761904%;\n\t}\n\n\t.full-width .site-content {\n\t\tmargin-right: 182px;\n\t}\n\n\t.content-sidebar {\n\t\tmargin-right: -29.04761904%;\n\t\tmargin-left: auto;\n\t}\n\n\t.site:before {\n\t\tright: 0;\n\t\tleft: auto;\n\t}\n\n\t#secondary {\n\t\tfloat: right;\n\t\tmargin: 0 -100% 0 0;\n\t}\n\n\t.secondary-navigation ul ul {\n\t\tright: -999em;\n\t\tleft: auto;\n\t}\n\n\t.secondary-navigation ul li:hover > ul,\n\t.secondary-navigation ul li.focus > ul {\n\t\tright: 162px;\n\t\tleft: auto;\n\t}\n\n\t.secondary-navigation .menu-item-has-children > a {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 38px;\n\t}\n\n\t.secondary-navigation .menu-item-has-children > a:after {\n\t\tborder-right-color: #fff;\n\t\tborder-left-color: transparent;\n\t\tright: auto;\n\t\tleft: 26px;\n\t\tcontent: \"\\f503\";\n\t}\n\n\t.footer-sidebar .widget {\n\t\tfloat: right;\n\t}\n\n\t.featured-content {\n\t\tpadding-right: 182px;\n\t\tpadding-left: 0;\n\t}\n}\n\n@media screen and (min-width: 1040px) {\n\t.archive-header,\n\t.comments-area,\n\t.image-navigation,\n\t.page-header,\n\t.page-content,\n\t.post-navigation,\n\t.site-content .entry-header,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content footer.entry-meta {\n\t\tpadding-right: 15px;\n\t\tpadding-left: 15px;\n\t}\n\n\t.full-width .archive-header,\n\t.full-width .comments-area,\n\t.full-width .image-navigation,\n\t.full-width .page-header,\n\t.full-width .page-content,\n\t.full-width .post-navigation,\n\t.full-width .site-content .entry-header,\n\t.full-width .site-content .entry-content,\n\t.full-width .site-content .entry-summary,\n\t.full-width .site-content footer.entry-meta {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 30px;\n\t}\n}\n\n@media screen and (min-width: 1080px) {\n\t.site-content {\n\t\tmargin-right: 222px;\n\t\tmargin-left: 29.04761904%;\n\t}\n\n\t.full-width .site-content {\n\t\tmargin-right: 222px;\n\t}\n\n\t.search-box-wrapper,\n\t.featured-content {\n\t\tpadding-right: 222px;\n\t\tpadding-left: 0;\n\t}\n\n\t.secondary-navigation ul li:hover > ul,\n\t.secondary-navigation ul li.focus > ul {\n\t\tright: 202px;\n\t\tleft: auto;\n\t}\n\n\t.slider-control-paging {\n\t\tpadding-right: 24px;\n\t\tpadding-left: 0;\n\t}\n\n\t.slider-control-paging li {\n\t\tmargin: 12px 0 12px 12px;\n\t}\n\n\t.slider-control-paging a:before {\n\t\tright: 6px;\n\t\tleft: auto;\n\t}\n}\n\n@media screen and (min-width: 1110px) {\n\t.archive-header,\n\t.comments-area,\n\t.image-navigation,\n\t.page-header,\n\t.page-content,\n\t.post-navigation,\n\t.site-content .entry-header,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content footer.entry-meta {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 30px;\n\t}\n}\n\n@media screen and (min-width: 1218px) {\n\t.archive-header,\n\t.comments-area,\n\t.image-navigation,\n\t.page-header,\n\t.page-content,\n\t.post-navigation,\n\t.site-content .entry-header,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content footer.entry-meta {\n\t\tmargin-left: 54px;\n\t}\n\n\t.full-width .archive-header,\n\t.full-width .comments-area,\n\t.full-width .image-navigation,\n\t.full-width .page-header,\n\t.full-width .page-content,\n\t.full-width .post-navigation,\n\t.full-width .site-content .entry-header,\n\t.full-width .site-content .entry-content,\n\t.full-width .site-content .entry-summary,\n\t.full-width .site-content footer.entry-meta {\n\t\tmargin-right: auto;\n\t\tmargin-left: auto;\n\t}\n}\n\n@media screen and (min-width: 1260px) {\n\t.site-content blockquote.alignright {\n\t\tmargin-right: -18%;\n\t\tmargin-left: auto;\n\t}\n\n\t.site-content blockquote.alignleft {\n\t\tmargin-left: -18%;\n\t\tmargin-right: auto;\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/search.php",
    "content": "<?php\n/**\n * The template for displaying Search Results pages\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"page-header\">\n\t\t\t\t<h1 class=\"page-title\"><?php printf( __( 'Search Results for: %s', 'twentyfourteen' ), get_search_query() ); ?></h1>\n\t\t\t</header><!-- .page-header -->\n\n\t\t\t\t<?php\n\t\t\t\t\t// Start the Loop.\n\t\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t\t\tendwhile;\n\t\t\t\t\t// Previous/next post navigation.\n\t\t\t\t\ttwentyfourteen_paging_nav();\n\n\t\t\t\telse :\n\t\t\t\t\t// If no content, include the \"No posts found\" template.\n\t\t\t\t\tget_template_part( 'content', 'none' );\n\n\t\t\t\tendif;\n\t\t\t?>\n\n\t\t</div><!-- #content -->\n\t</section><!-- #primary -->\n\n<?php\nget_sidebar( 'content' );\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/sidebar-content.php",
    "content": "<?php\n/**\n * The Content Sidebar\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nif ( ! is_active_sidebar( 'sidebar-2' ) ) {\n\treturn;\n}\n?>\n<div id=\"content-sidebar\" class=\"content-sidebar widget-area\" role=\"complementary\">\n\t<?php dynamic_sidebar( 'sidebar-2' ); ?>\n</div><!-- #content-sidebar -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/sidebar-footer.php",
    "content": "<?php\n/**\n * The Footer Sidebar\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nif ( ! is_active_sidebar( 'sidebar-3' ) ) {\n\treturn;\n}\n?>\n\n<div id=\"supplementary\">\n\t<div id=\"footer-sidebar\" class=\"footer-sidebar widget-area\" role=\"complementary\">\n\t\t<?php dynamic_sidebar( 'sidebar-3' ); ?>\n\t</div><!-- #footer-sidebar -->\n</div><!-- #supplementary -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/sidebar.php",
    "content": "<?php\n/**\n * The Sidebar containing the main widget area\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n?>\n<div id=\"secondary\">\n\t<?php\n\t\t$description = get_bloginfo( 'description', 'display' );\n\t\tif ( ! empty ( $description ) ) :\n\t?>\n\t<h2 class=\"site-description\"><?php echo esc_html( $description ); ?></h2>\n\t<?php endif; ?>\n\n\t<?php if ( has_nav_menu( 'secondary' ) ) : ?>\n\t<nav role=\"navigation\" class=\"navigation site-navigation secondary-navigation\">\n\t\t<?php wp_nav_menu( array( 'theme_location' => 'secondary' ) ); ?>\n\t</nav>\n\t<?php endif; ?>\n\n\t<?php if ( is_active_sidebar( 'sidebar-1' ) ) : ?>\n\t<div id=\"primary-sidebar\" class=\"primary-sidebar widget-area\" role=\"complementary\">\n\t\t<?php dynamic_sidebar( 'sidebar-1' ); ?>\n\t</div><!-- #primary-sidebar -->\n\t<?php endif; ?>\n</div><!-- #secondary -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/single.php",
    "content": "<?php\n/**\n * The Template for displaying all single posts\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\t\t\t<?php\n\t\t\t\t// Start the Loop.\n\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t\t\t */\n\t\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t\t\t// Previous/next post navigation.\n\t\t\t\t\ttwentyfourteen_post_nav();\n\n\t\t\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\t\t\tif ( comments_open() || get_comments_number() ) {\n\t\t\t\t\t\tcomments_template();\n\t\t\t\t\t}\n\t\t\t\tendwhile;\n\t\t\t?>\n\t\t</div><!-- #content -->\n\t</div><!-- #primary -->\n\n<?php\nget_sidebar( 'content' );\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/style.css",
    "content": "/*\nTheme Name: Twenty Fourteen\nTheme URI: https://wordpress.org/themes/twentyfourteen/\nAuthor: the WordPress team\nAuthor URI: https://wordpress.org/\nDescription: In 2014, our default theme lets you create a responsive magazine website with a sleek, modern design. Feature your favorite homepage content in either a grid or a slider. Use the three widget areas to customize your website, and change your content's layout with a full-width page template and a contributor page to show off your authors. Creating a magazine website with WordPress has never been easier.\nVersion: 1.6\nLicense: GNU General Public License v2 or later\nLicense URI: http://www.gnu.org/licenses/gpl-2.0.html\nTags: black, green, white, light, dark, two-columns, three-columns, left-sidebar, right-sidebar, fixed-layout, responsive-layout, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready\nText Domain: twentyfourteen\n\nThis theme, like WordPress, is licensed under the GPL.\nUse it to make something cool, have fun, and share what you've learned with others.\n*/\n\n/**\n * Table of Contents:\n *\n * 1.0 - Reset\n * 2.0 - Repeatable Patterns\n * 3.0 - Basic Structure\n * 4.0 - Header\n * 5.0 - Navigation\n * 6.0 - Content\n *   6.1 - Post Thumbnail\n *   6.2 - Entry Header\n *   6.3 - Entry Meta\n *   6.4 - Entry Content\n *   6.5 - Galleries\n *   6.6 - Post Formats\n *   6.7 - Post/Image/Paging Navigation\n *   6.8 - Attachments\n *   6.9 - Archives\n *   6.10 - Contributor Page\n *   6.11 - 404 Page\n *   6.12 - Full-width\n *   6.13 - Singular\n *   6.14 - Comments\n * 7.0 - Sidebar\n *   7.1 - Widgets\n *   7.2 - Content Sidebar Widgets\n * 8.0 - Footer\n * 9.0 - Featured Content\n * 10.0 - Multisite\n * 11.0 - Media Queries\n * 12.0 - Print\n * -----------------------------------------------------------------------------\n */\n\n\n/**\n * 1.0 Reset\n *\n * Resetting and rebuilding styles have been helped along thanks to the fine\n * work of Eric Meyer, Nicolas Gallagher, Jonathan Neal, and Blueprint.\n *\n * -----------------------------------------------------------------------------\n */\n\nhtml, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {\n\tborder: 0;\n\tfont-family: inherit;\n\tfont-size: 100%;\n\tfont-style: inherit;\n\tfont-weight: inherit;\n\tmargin: 0;\n\toutline: 0;\n\tpadding: 0;\n\tvertical-align: baseline;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n\tdisplay: block;\n}\n\naudio,\ncanvas,\nvideo {\n\tdisplay: inline-block;\n\tmax-width: 100%;\n}\n\nhtml {\n\toverflow-y: scroll;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust:     100%;\n}\n\nbody,\nbutton,\ninput,\nselect,\ntextarea {\n\tcolor: #2b2b2b;\n\tfont-family: Lato, sans-serif;\n\tfont-size: 16px;\n\tfont-weight: 400;\n\tline-height: 1.5;\n}\n\nbody {\n\tbackground: #f5f5f5;\n}\n\na {\n\tcolor: #24890d;\n\ttext-decoration: none;\n}\n\na:focus {\n\toutline: thin dotted;\n}\n\na:hover,\na:active {\n\toutline: 0;\n}\n\na:active,\na:hover {\n\tcolor: #41a62a;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tclear: both;\n\tfont-weight: 700;\n\tmargin: 36px 0 12px;\n}\n\nh1 {\n\tfont-size: 26px;\n\tline-height: 1.3846153846;\n}\n\nh2 {\n\tfont-size: 24px;\n\tline-height: 1;\n}\n\nh3 {\n\tfont-size: 22px;\n\tline-height: 1.0909090909;\n}\n\nh4 {\n\tfont-size: 20px;\n\tline-height: 1.2;\n}\n\nh5 {\n\tfont-size: 18px;\n\tline-height: 1.3333333333;\n}\n\nh6 {\n\tfont-size: 16px;\n\tline-height: 1.5;\n}\n\naddress {\n\tfont-style: italic;\n\tmargin-bottom: 24px;\n}\n\nabbr[title] {\n\tborder-bottom: 1px dotted #2b2b2b;\n\tcursor: help;\n}\n\nb,\nstrong {\n\tfont-weight: 700;\n}\n\ncite,\ndfn,\nem,\ni {\n\tfont-style: italic;\n}\n\nmark,\nins {\n\tbackground: #fff9c0;\n\ttext-decoration: none;\n}\n\np {\n\tmargin-bottom: 24px;\n}\n\ncode,\nkbd,\ntt,\nvar,\nsamp,\npre {\n\tfont-family: monospace, serif;\n\tfont-size: 15px;\n\t-webkit-hyphens: none;\n\t-moz-hyphens:    none;\n\t-ms-hyphens:     none;\n\thyphens:         none;\n\tline-height: 1.6;\n}\n\npre {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tmargin-bottom: 24px;\n\tmax-width: 100%;\n\toverflow: auto;\n\tpadding: 12px;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\nblockquote,\nq {\n\t-webkit-hyphens: none;\n\t-moz-hyphens:    none;\n\t-ms-hyphens:     none;\n\thyphens:         none;\n\tquotes: none;\n}\n\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n\tcontent: \"\";\n\tcontent: none;\n}\n\nblockquote {\n\tcolor: #767676;\n\tfont-size: 19px;\n\tfont-style: italic;\n\tfont-weight: 300;\n\tline-height: 1.2631578947;\n\tmargin-bottom: 24px;\n}\n\nblockquote cite,\nblockquote small {\n\tcolor: #2b2b2b;\n\tfont-size: 16px;\n\tfont-weight: 400;\n\tline-height: 1.5;\n}\n\nblockquote em,\nblockquote i,\nblockquote cite {\n\tfont-style: normal;\n}\n\nblockquote strong,\nblockquote b {\n\tfont-weight: 400;\n}\n\nsmall {\n\tfont-size: smaller;\n}\n\nbig {\n\tfont-size: 125%;\n}\n\nsup,\nsub {\n\tfont-size: 75%;\n\theight: 0;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsup {\n\tbottom: 1ex;\n}\n\nsub {\n\ttop: .5ex;\n}\n\ndl {\n\tmargin-bottom: 24px;\n}\n\ndt {\n\tfont-weight: bold;\n}\n\ndd {\n\tmargin-bottom: 24px;\n}\n\nul,\nol {\n\tlist-style: none;\n\tmargin: 0 0 24px 20px;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin: 0 0 0 20px;\n}\n\nimg {\n\t-ms-interpolation-mode: bicubic;\n\tborder: 0;\n\tvertical-align: middle;\n}\n\nfigure {\n\tmargin: 0;\n}\n\nfieldset {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tmargin: 0 0 24px;\n\tpadding: 11px 12px 0;\n}\n\nlegend {\n\twhite-space: normal;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tfont-size: 100%;\n\tmargin: 0;\n\tmax-width: 100%;\n\tvertical-align: baseline;\n}\n\nbutton,\ninput {\n\tline-height: normal;\n}\n\ninput,\ntextarea {\n\tbackground-image: -webkit-linear-gradient(hsla(0,0%,100%,0), hsla(0,0%,100%,0)); /* Removing the inner shadow, rounded corners on iOS inputs */\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n\t-webkit-appearance: button;\n\tcursor: pointer;\n}\n\nbutton[disabled],\ninput[disabled] {\n\tcursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\tpadding: 0;\n}\n\ninput[type=\"search\"] {\n\t-webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\ntextarea {\n\toverflow: auto;\n\tvertical-align: top;\n}\n\ntable,\nth,\ntd {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n}\n\ntable {\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n\tborder-width: 1px 0 0 1px;\n\tmargin-bottom: 24px;\n\twidth: 100%;\n}\n\ncaption,\nth,\ntd {\n\tfont-weight: normal;\n\ttext-align: left;\n}\n\nth {\n\tborder-width: 0 1px 1px 0;\n\tfont-weight: bold;\n}\n\ntd {\n\tborder-width: 0 1px 1px 0;\n}\n\ndel {\n\tcolor: #767676;\n}\n\nhr {\n\tbackground-color: rgba(0, 0, 0, 0.1);\n\tborder: 0;\n\theight: 1px;\n\tmargin-bottom: 23px;\n}\n\n/* Support a widely-adopted but non-standard selector for text selection styles\n * to achieve a better experience. See https://core.trac.wordpress.org/ticket/25898.\n */\n::selection {\n\tbackground: #24890d;\n\tcolor: #fff;\n\ttext-shadow: none;\n}\n\n::-moz-selection {\n\tbackground: #24890d;\n\tcolor: #fff;\n\ttext-shadow: none;\n}\n\n\n/**\n * 2.0 Repeatable Patterns\n * -----------------------------------------------------------------------------\n */\n\n/* Input fields */\n\ninput,\ntextarea {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tborder-radius: 2px;\n\tcolor: #2b2b2b;\n\tpadding: 8px 10px 7px;\n}\n\ntextarea {\n\twidth: 100%;\n}\n\ninput:focus,\ntextarea:focus {\n\tborder: 1px solid rgba(0, 0, 0, 0.3);\n\toutline: 0;\n}\n\n/* Buttons */\n\nbutton,\n.button,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n\tbackground-color: #24890d;\n\tborder: 0;\n\tborder-radius: 2px;\n\tcolor: #fff;\n\tfont-size: 12px;\n\tfont-weight: 700;\n\tpadding: 10px 30px 11px;\n\ttext-transform: uppercase;\n\tvertical-align: bottom;\n}\n\nbutton:hover,\nbutton:focus,\n.button:hover,\n.button:focus,\ninput[type=\"button\"]:hover,\ninput[type=\"button\"]:focus,\ninput[type=\"reset\"]:hover,\ninput[type=\"reset\"]:focus,\ninput[type=\"submit\"]:hover,\ninput[type=\"submit\"]:focus {\n\tbackground-color: #41a62a;\n\tcolor: #fff;\n}\n\nbutton:active,\n.button:active,\ninput[type=\"button\"]:active,\ninput[type=\"reset\"]:active,\ninput[type=\"submit\"]:active {\n\tbackground-color: #55d737;\n}\n\n.search-field {\n\twidth: 100%;\n}\n\n.search-submit {\n\tdisplay: none;\n}\n\n/* Placeholder text color -- selectors need to be separate to work. */\n\n::-webkit-input-placeholder {\n\tcolor: #939393;\n}\n\n:-moz-placeholder {\n\tcolor: #939393;\n}\n\n::-moz-placeholder {\n\tcolor: #939393;\n\topacity: 1; /* Since FF19 lowers the opacity of the placeholder by default */\n}\n\n:-ms-input-placeholder {\n\tcolor: #939393;\n}\n\n/* Responsive images. Fluid images for posts, comments, and widgets */\n\n.comment-content img,\n.entry-content img,\n.entry-summary img,\n#site-header img,\n.widget img,\n.wp-caption {\n\tmax-width: 100%;\n}\n\n/**\n * Make sure images with WordPress-added height and width attributes are\n * scaled correctly.\n */\n\n.comment-content img[height],\n.entry-content img,\n.entry-summary img,\nimg[class*=\"align\"],\nimg[class*=\"wp-image-\"],\nimg[class*=\"attachment-\"],\n#site-header img {\n\theight: auto;\n}\n\nimg.size-full,\nimg.size-large,\n.wp-post-image,\n.post-thumbnail img {\n\theight: auto;\n\tmax-width: 100%;\n}\n\n/* Make sure embeds and iframes fit their containers */\n\nembed,\niframe,\nobject,\nvideo {\n\tmargin-bottom: 24px;\n\tmax-width: 100%;\n}\n\np > embed,\np > iframe,\np > object,\nspan > embed,\nspan > iframe,\nspan > object {\n\tmargin-bottom: 0;\n}\n\n/* Alignment */\n\n.alignleft {\n\tfloat: left;\n}\n\n.alignright {\n\tfloat: right;\n}\n\n.aligncenter {\n\tdisplay: block;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\nblockquote.alignleft,\nfigure.wp-caption.alignleft,\nimg.alignleft {\n\tmargin: 7px 24px 7px 0;\n}\n\n.wp-caption.alignleft {\n\tmargin: 7px 14px 7px 0;\n}\n\nblockquote.alignright,\nfigure.wp-caption.alignright,\nimg.alignright {\n\tmargin: 7px 0 7px 24px;\n}\n\n.wp-caption.alignright {\n\tmargin: 7px 0 7px 14px;\n}\n\nblockquote.aligncenter,\nimg.aligncenter,\n.wp-caption.aligncenter {\n\tmargin-top: 7px;\n\tmargin-bottom: 7px;\n}\n\n.site-content blockquote.alignleft,\n.site-content blockquote.alignright {\n\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\tpadding-top: 17px;\n\twidth: 50%;\n}\n\n.site-content blockquote.alignleft p,\n.site-content blockquote.alignright p {\n\tmargin-bottom: 17px;\n}\n\n.wp-caption {\n\tmargin-bottom: 24px;\n}\n\n.wp-caption img[class*=\"wp-image-\"] {\n\tdisplay: block;\n\tmargin: 0;\n}\n\n.wp-caption {\n\tcolor: #767676;\n}\n\n.wp-caption-text {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tfont-size: 12px;\n\tfont-style: italic;\n\tline-height: 1.5;\n\tmargin: 9px 0;\n}\n\ndiv.wp-caption .wp-caption-text {\n\tpadding-right: 10px;\n}\n\ndiv.wp-caption.alignright img[class*=\"wp-image-\"],\ndiv.wp-caption.alignright .wp-caption-text {\n\tpadding-left: 10px;\n\tpadding-right: 0;\n}\n\n.wp-smiley {\n\tborder: 0;\n\tmargin-bottom: 0;\n\tmargin-top: 0;\n\tpadding: 0;\n}\n\n/* Assistive text */\n\n.screen-reader-text {\n\tclip: rect(1px, 1px, 1px, 1px);\n\toverflow: hidden;\n\tposition: absolute !important;\n\theight: 1px;\n\twidth: 1px;\n}\n\n.screen-reader-text:focus {\n\tbackground-color: #f1f1f1;\n\tborder-radius: 3px;\n\tbox-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);\n\tclip: auto;\n\tcolor: #21759b;\n\tdisplay: block;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\theight: auto;\n\tline-height: normal;\n\tpadding: 15px 23px 14px;\n\tposition: absolute;\n\tleft: 5px;\n\ttop: 5px;\n\ttext-decoration: none;\n\ttext-transform: none;\n\twidth: auto;\n\tz-index: 100000; /* Above WP toolbar */\n}\n\n.hide {\n\tdisplay: none;\n}\n\n/* Clearing floats */\n\n.footer-sidebar:before,\n.footer-sidebar:after,\n.hentry:before,\n.hentry:after,\n.gallery:before,\n.gallery:after,\n.slider-direction-nav:before,\n.slider-direction-nav:after,\n.contributor-info:before,\n.contributor-info:after,\n.search-box:before,\n.search-box:after,\n[class*=\"content\"]:before,\n[class*=\"content\"]:after,\n[class*=\"site\"]:before,\n[class*=\"site\"]:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.footer-sidebar:after,\n.hentry:after,\n.gallery:after,\n.slider-direction-nav:after,\n.contributor-info:after,\n.search-box:after,\n[class*=\"content\"]:after,\n[class*=\"site\"]:after {\n\tclear: both;\n}\n\n/* Genericons */\n\n.bypostauthor > article .fn:before,\n.comment-edit-link:before,\n.comment-reply-link:before,\n.comment-reply-login:before,\n.comment-reply-title small a:before,\n.contributor-posts-link:before,\n.menu-toggle:before,\n.search-toggle:before,\n.slider-direction-nav a:before,\n.widget_twentyfourteen_ephemera .widget-title:before {\n\t-webkit-font-smoothing: antialiased;\n\tdisplay: inline-block;\n\tfont: normal 16px/1 Genericons;\n\ttext-decoration: inherit;\n\tvertical-align: text-bottom;\n}\n\n/* Separators */\n\n.site-content span + .entry-date:before,\n.full-size-link:before,\n.parent-post-link:before,\nspan + .byline:before,\nspan + .comments-link:before,\nspan + .edit-link:before,\n.widget_twentyfourteen_ephemera .entry-title:after {\n\tcontent: \"\\0020\\007c\\0020\";\n}\n\n\n/**\n * 3.0 Basic Structure\n * -----------------------------------------------------------------------------\n */\n\n.site {\n\tbackground-color: #fff;\n\tmax-width: 1260px;\n\tposition: relative;\n}\n\n.main-content {\n\twidth: 100%;\n}\n\n\n/**\n * 4.0 Header\n * -----------------------------------------------------------------------------\n */\n\n/* Ensure that there is no gap between the header and\n\t the admin bar for WordPress versions before 3.8. */\n#wpadminbar {\n\tmin-height: 32px;\n}\n\n#site-header {\n\tposition: relative;\n\tz-index: 3;\n}\n\n.site-header {\n\tbackground-color: #000;\n\tmax-width: 1260px;\n\tposition: relative;\n\twidth: 100%;\n\tz-index: 4;\n}\n\n.header-main {\n\tmin-height: 48px;\n\tpadding: 0 10px;\n}\n\n.site-title {\n\tfloat: left;\n\tfont-size: 18px;\n\tfont-weight: 700;\n\tline-height: 48px;\n\tmargin: 0;\n\n\t/* Nav-toggle width + search-toggle width - gutter = 86px */\n\tmax-width: -webkit-calc(100% - 86px);\n\tmax-width:         calc(100% - 86px);\n}\n\n.site-title a,\n.site-title a:hover {\n\tcolor: #fff;\n\tdisplay: block;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n/* Search in the header */\n\n.search-toggle {\n\tbackground-color: #24890d;\n\tcursor: pointer;\n\tfloat: right;\n\theight: 48px;\n\tmargin-right: 38px;\n\ttext-align: center;\n\twidth: 48px;\n}\n\n.search-toggle:hover,\n.search-toggle.active {\n\tbackground-color: #41a62a;\n}\n\n.search-toggle:before {\n\tcolor: #fff;\n\tcontent: \"\\f400\";\n\tfont-size: 20px;\n\tmargin-top: 14px;\n}\n\n.search-toggle .screen-reader-text {\n\tleft: 5px; /* Avoid a horizontal scrollbar when the site has a long menu */\n}\n\n.search-box-wrapper {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tposition: absolute;\n\ttop: 48px;\n\tright: 0;\n\twidth: 100%;\n\tz-index: 2;\n}\n\n.search-box {\n\tbackground-color: #41a62a;\n\tpadding: 12px;\n}\n\n.search-box .search-field {\n\tbackground-color: #fff;\n\tborder: 0;\n\tfloat: right;\n\tfont-size: 16px;\n\tpadding: 2px 2px 3px 6px;\n\twidth: 100%;\n}\n\n\n/**\n * 5.0 Navigation\n * -----------------------------------------------------------------------------\n */\n\n.site-navigation ul {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.site-navigation li {\n\tborder-top: 1px solid rgba(255, 255, 255, 0.2);\n}\n\n.site-navigation ul ul {\n\tmargin-left: 20px;\n}\n\n.site-navigation a {\n\tcolor: #fff;\n\tdisplay: block;\n\ttext-transform: uppercase;\n}\n\n.site-navigation a:hover {\n\tcolor: #41a62a;\n}\n\n.site-navigation .current_page_item > a,\n.site-navigation .current_page_ancestor > a,\n.site-navigation .current-menu-item > a,\n.site-navigation .current-menu-ancestor > a {\n\tcolor: #55d737;\n\tfont-weight: 900;\n}\n\n/* Primary Navigation */\n\n.primary-navigation {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tfont-size: 14px;\n\tpadding-top: 24px;\n}\n\n.primary-navigation.toggled-on {\n\tpadding: 72px 0 36px;\n}\n\n.primary-navigation .nav-menu {\n\tborder-bottom: 1px solid rgba(255, 255, 255, 0.2);\n\tdisplay: none;\n}\n\n.primary-navigation.toggled-on .nav-menu {\n\tdisplay: block;\n}\n\n.primary-navigation a {\n\tpadding: 7px 0;\n}\n\n/* Secondary Navigation */\n\n.secondary-navigation {\n\tborder-bottom: 1px solid rgba(255, 255, 255, 0.2);\n\tfont-size: 12px;\n\tmargin: 48px 0;\n}\n\n.secondary-navigation a {\n\tpadding: 9px 0;\n}\n\n.menu-toggle {\n\tbackground-color: #000;\n\tborder-radius: 0;\n\tcursor: pointer;\n\theight: 48px;\n\tmargin: 0;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\ttext-align: center;\n\twidth: 48px;\n}\n\n.menu-toggle:before {\n\tcolor: #fff;\n\tcontent: \"\\f419\";\n\tpadding: 16px;\n}\n\n.menu-toggle:active,\n.menu-toggle:focus,\n.menu-toggle:hover {\n\tbackground-color: #444;\n}\n\n.menu-toggle:focus {\n\toutline: 1px dotted;\n}\n\n\n/**\n * 6.0 Content\n * -----------------------------------------------------------------------------\n */\n\n.content-area {\n\tpadding-top: 48px;\n}\n\n.hentry {\n\tmargin: 0 auto 48px;\n\tmax-width: 672px;\n}\n\n.site-content .entry-header,\n.site-content .entry-content,\n.site-content .entry-summary,\n.site-content .entry-meta,\n.page-content {\n\tmargin: 0 auto;\n\tmax-width: 474px;\n}\n\n.page-content {\n\tmargin-bottom: 48px;\n}\n\n\n/**\n * 6.1 Post Thumbnail\n * -----------------------------------------------------------------------------\n */\n\n.post-thumbnail {\n\tbackground: #b2b2b2 url(images/pattern-light.svg) repeat fixed;\n\tdisplay: block;\n\tposition: relative;\n\twidth: 100%;\n\tz-index: 0;\n}\n\na.post-thumbnail:hover {\n\tbackground-color: #999;\n}\n\n.full-width .post-thumbnail img {\n\tdisplay: block;\n\tmargin: 0 auto;\n}\n\n\n/**\n * 6.2 Entry Header\n * -----------------------------------------------------------------------------\n */\n\n.entry-header {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.entry-title {\n\tfont-size: 33px;\n\tfont-weight: 300;\n\tline-height: 1.0909090909;\n\tmargin-bottom: 12px;\n\tmargin: 0 0 12px 0;\n\ttext-transform: uppercase;\n}\n\n.entry-title a {\n\tcolor: #2b2b2b;\n}\n\n.entry-title a:hover {\n\tcolor: #41a62a;\n}\n\n.site-content .entry-header {\n\tbackground-color: #fff;\n\tpadding: 0 10px 12px;\n}\n\n.site-content .has-post-thumbnail .entry-header {\n\tpadding-top: 24px;\n}\n\n\n/**\n * 6.3 Entry Meta\n * -----------------------------------------------------------------------------\n */\n\n.entry-meta {\n\tclear: both;\n\tcolor: #767676;\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tline-height: 1.3333333333;\n\ttext-transform: uppercase;\n}\n\n.entry-meta a {\n\tcolor: #767676;\n}\n\n.entry-meta a:hover {\n\tcolor: #41a62a;\n}\n\n.sticky .entry-date {\n\tdisplay: none;\n}\n\n.cat-links {\n\tfont-weight: 900;\n\ttext-transform: uppercase;\n}\n\n.cat-links a {\n\tcolor: #2b2b2b;\n}\n\n.cat-links a:hover {\n\tcolor: #41a62a;\n}\n\n.byline {\n\tdisplay: none;\n}\n\n.single .byline,\n.group-blog .byline {\n\tdisplay: inline;\n}\n\n.site-content .entry-meta {\n\tbackground-color: #fff;\n\tmargin-bottom: 8px;\n}\n\n.site-content footer.entry-meta {\n\tmargin: 24px auto 0;\n\tpadding: 0 10px;\n}\n\n/* Tag links style */\n\n.entry-meta .tag-links a {\n\tbackground-color: #767676;\n\tborder-radius: 0 2px 2px 0;\n\tcolor: #fff;\n\tdisplay: inline-block;\n\tfont-size: 11px;\n\tfont-weight: 700;\n\tline-height: 1.2727272727;\n\tmargin: 2px 4px 2px 10px;\n\tpadding: 3px 7px;\n\tposition: relative;\n\ttext-transform: uppercase;\n}\n\n.entry-meta .tag-links a:hover {\n\tbackground-color: #41a62a;\n\tcolor: #fff;\n}\n\n.entry-meta .tag-links a:before {\n\tborder-top: 10px solid transparent;\n\tborder-right: 8px solid #767676;\n\tborder-bottom: 10px solid transparent;\n\tcontent: \"\";\n\theight: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: -8px;\n\twidth: 0;\n}\n\n.entry-meta .tag-links a:hover:before {\n\tborder-right-color: #41a62a;\n}\n\n.entry-meta .tag-links a:after {\n\tbackground-color: #fff;\n\tborder-radius: 50%;\n\tcontent: \"\";\n\theight: 4px;\n\tposition: absolute;\n\ttop: 8px;\n\tleft: -2px;\n\twidth: 4px;\n}\n\n\n/**\n * 6.4 Entry Content\n * -----------------------------------------------------------------------------\n */\n\n.entry-content,\n.entry-summary,\n.page-content {\n\t-webkit-hyphens: auto;\n\t-moz-hyphens:    auto;\n\t-ms-hyphens:     auto;\n\thyphens:         auto;\n\tword-wrap: break-word;\n}\n\n.site-content .entry-content,\n.site-content .entry-summary,\n.page-content {\n\tbackground-color: #fff;\n\tpadding: 12px 10px 0;\n}\n\n.page .entry-content {\n\tpadding-top: 0;\n}\n\n.entry-content h1:first-child,\n.entry-content h2:first-child,\n.entry-content h3:first-child,\n.entry-content h4:first-child,\n.entry-content h5:first-child,\n.entry-content h6:first-child,\n.entry-summary h1:first-child,\n.entry-summary h2:first-child,\n.entry-summary h3:first-child,\n.entry-summary h4:first-child,\n.entry-summary h5:first-child,\n.entry-summary h6:first-child,\n.page-content h1:first-child,\n.page-content h2:first-child,\n.page-content h3:first-child,\n.page-content h4:first-child,\n.page-content h5:first-child,\n.page-content h6:first-child {\n\tmargin-top: 0;\n}\n\n.entry-content a,\n.entry-summary a,\n.page-content a,\n.comment-content a {\n\ttext-decoration: underline;\n}\n\n.entry-content a:hover,\n.entry-summary a:hover,\n.page-content a:hover,\n.comment-content a:hover,\n.entry-content a.button,\n.entry-summary a.button,\n.page-content a.button,\n.comment-content a.button {\n\ttext-decoration: none;\n}\n\n.entry-content table,\n.comment-content table {\n\tfont-size: 14px;\n\tline-height: 1.2857142857;\n\tmargin-bottom: 24px;\n}\n\n.entry-content th,\n.comment-content th {\n\tfont-weight: 700;\n\tpadding: 8px;\n\ttext-transform: uppercase;\n}\n\n.entry-content td,\n.comment-content td {\n\tpadding: 8px;\n}\n\n.entry-content .edit-link {\n\tclear: both;\n\tdisplay: block;\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tline-height: 1.3333333333;\n\ttext-transform: uppercase;\n}\n\n.entry-content .edit-link a {\n\tcolor: #767676;\n\ttext-decoration: none;\n}\n\n.entry-content .edit-link a:hover {\n\tcolor: #41a62a;\n}\n\n.entry-content .more-link {\n\twhite-space: nowrap;\n}\n\n/* Mediaelements */\n\n.hentry .mejs-container {\n\tmargin: 12px 0 18px;\n}\n\n.hentry .mejs-mediaelement,\n.hentry .mejs-container .mejs-controls {\n\tbackground: #000;\n}\n\n.hentry .mejs-controls .mejs-time-rail .mejs-time-loaded,\n.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {\n\tbackground: #fff;\n}\n\n.hentry .mejs-controls .mejs-time-rail .mejs-time-current {\n\tbackground: #24890d;\n}\n\n.hentry .mejs-controls .mejs-time-rail .mejs-time-total,\n.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total {\n\tbackground: rgba(255, 255, 255, .33);\n}\n\n.hentry .mejs-container .mejs-controls .mejs-time {\n\tpadding-top: 9px;\n}\n\n.hentry .mejs-controls .mejs-time-rail span,\n.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total,\n.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {\n\tborder-radius: 0;\n}\n\n.hentry .mejs-overlay-loading {\n\tbackground: transparent;\n}\n\n.hentry .mejs-overlay-button {\n\tbackground-color: #fff;\n\tbackground-image: none;\n\tborder-radius: 2px;\n\tbox-shadow: 1px 1px 1px rgba(0,0,0,.8);\n\tcolor: #000;\n\theight: 36px;\n\tmargin-left: -24px;\n\twidth: 48px;\n}\n\n.hentry .mejs-overlay-button:before {\n\t-webkit-font-smoothing: antialiased;\n\tcontent: '\\f452';\n\tdisplay: inline-block;\n\tfont: normal 32px/1.125 Genericons;\n\tposition: absolute;\n\ttop: 1px;\n\tleft: 10px;\n}\n\n.hentry .mejs-controls .mejs-button button:focus {\n\toutline: none;\n}\n\n.hentry .mejs-controls .mejs-button button {\n\t-webkit-font-smoothing: antialiased;\n\tbackground: none;\n\tcolor: #fff;\n\tdisplay: inline-block;\n\tfont: normal 16px/1 Genericons;\n}\n\n.hentry .mejs-playpause-button.mejs-play button:before {\n\tcontent: '\\f452';\n}\n\n.hentry .mejs-playpause-button.mejs-pause button:before {\n\tcontent: '\\f448';\n}\n\n.hentry .mejs-volume-button.mejs-mute button:before {\n\tcontent: '\\f109';\n\tfont-size: 20px;\n\tposition: absolute;\n\ttop: -2px;\n\tleft: 0;\n}\n\n.hentry .mejs-volume-button.mejs-unmute button:before {\n\tcontent: '\\f109';\n\tleft: 0;\n\tposition: absolute;\n\ttop: 0;\n}\n\n.hentry .mejs-fullscreen-button button:before {\n\tcontent: '\\f474';\n}\n\n.hentry .mejs-fullscreen-button.mejs-unfullscreen button:before {\n\tcontent: '\\f406';\n}\n\n.hentry .mejs-overlay:hover .mejs-overlay-button {\n\tbackground-color: #24890d;\n\tcolor: #fff;\n}\n\n.hentry .mejs-controls .mejs-button button:hover {\n\tcolor: #41a62a;\n}\n\n.content-sidebar .wp-playlist-item .wp-playlist-caption {\n\tcolor: #000;\n}\n\n/* Page links */\n\n.page-links {\n\tclear: both;\n\tfont-size: 12px;\n\tfont-weight: 900;\n\tline-height: 2;\n\tmargin: 24px 0;\n\ttext-transform: uppercase;\n}\n\n.page-links a,\n.page-links > span {\n\tbackground: #fff;\n\tborder: 1px solid #fff;\n\tdisplay: inline-block;\n\theight: 22px;\n\tmargin: 0 1px 2px 0;\n\ttext-align: center;\n\twidth: 22px;\n}\n\n.page-links a {\n\tbackground: #000;\n\tborder: 1px solid #000;\n\tcolor: #fff;\n\ttext-decoration: none;\n}\n\n.page-links a:hover {\n\tbackground: #41a62a;\n\tborder: 1px solid #41a62a;\n\tcolor: #fff;\n}\n\n.page-links > .page-links-title {\n\theight: auto;\n\tmargin: 0;\n\tpadding-right: 7px;\n\twidth: auto;\n}\n\n\n/**\n * 6.5 Gallery\n * -----------------------------------------------------------------------------\n */\n\n.gallery {\n\tmargin-bottom: 20px;\n}\n\n.gallery-item {\n\tfloat: left;\n\tmargin: 0 4px 4px 0;\n\toverflow: hidden;\n\tposition: relative;\n}\n\n.gallery-columns-1 .gallery-item {\n\tmax-width: 100%;\n}\n\n.gallery-columns-2 .gallery-item {\n\tmax-width: 48%;\n\tmax-width: -webkit-calc(50% - 4px);\n\tmax-width:         calc(50% - 4px);\n}\n\n.gallery-columns-3 .gallery-item {\n\tmax-width: 32%;\n\tmax-width: -webkit-calc(33.3% - 4px);\n\tmax-width:         calc(33.3% - 4px);\n}\n\n.gallery-columns-4 .gallery-item {\n\tmax-width: 23%;\n\tmax-width: -webkit-calc(25% - 4px);\n\tmax-width:         calc(25% - 4px);\n}\n\n.gallery-columns-5 .gallery-item {\n\tmax-width: 19%;\n\tmax-width: -webkit-calc(20% - 4px);\n\tmax-width:         calc(20% - 4px);\n}\n\n.gallery-columns-6 .gallery-item {\n\tmax-width: 15%;\n\tmax-width: -webkit-calc(16.7% - 4px);\n\tmax-width:         calc(16.7% - 4px);\n}\n\n.gallery-columns-7 .gallery-item {\n\tmax-width: 13%;\n\tmax-width: -webkit-calc(14.28% - 4px);\n\tmax-width:         calc(14.28% - 4px);\n}\n\n.gallery-columns-8 .gallery-item {\n\tmax-width: 11%;\n\tmax-width: -webkit-calc(12.5% - 4px);\n\tmax-width:         calc(12.5% - 4px);\n}\n\n.gallery-columns-9 .gallery-item {\n\tmax-width: 9%;\n\tmax-width: -webkit-calc(11.1% - 4px);\n\tmax-width:         calc(11.1% - 4px);\n}\n\n.gallery-columns-1 .gallery-item:nth-of-type(1n),\n.gallery-columns-2 .gallery-item:nth-of-type(2n),\n.gallery-columns-3 .gallery-item:nth-of-type(3n),\n.gallery-columns-4 .gallery-item:nth-of-type(4n),\n.gallery-columns-5 .gallery-item:nth-of-type(5n),\n.gallery-columns-6 .gallery-item:nth-of-type(6n),\n.gallery-columns-7 .gallery-item:nth-of-type(7n),\n.gallery-columns-8 .gallery-item:nth-of-type(8n),\n.gallery-columns-9 .gallery-item:nth-of-type(9n) {\n\tmargin-right: 0;\n}\n\n.gallery-columns-1.gallery-size-medium figure.gallery-item:nth-of-type(1n+1),\n.gallery-columns-1.gallery-size-thumbnail figure.gallery-item:nth-of-type(1n+1),\n.gallery-columns-2.gallery-size-thumbnail figure.gallery-item:nth-of-type(2n+1),\n.gallery-columns-3.gallery-size-thumbnail figure.gallery-item:nth-of-type(3n+1) {\n\tclear: left;\n}\n\n.gallery-caption {\n\tbackground-color: rgba(0, 0, 0, 0.7);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tcolor: #fff;\n\tfont-size: 12px;\n\tline-height: 1.5;\n\tmargin: 0;\n\tmax-height: 50%;\n\topacity: 0;\n\tpadding: 6px 8px;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\ttext-align: left;\n\twidth: 100%;\n}\n\n.gallery-caption:before {\n\tcontent: \"\";\n\theight: 100%;\n\tmin-height: 49px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n}\n\n.gallery-item:hover .gallery-caption {\n\topacity: 1;\n}\n\n.gallery-columns-7 .gallery-caption,\n.gallery-columns-8 .gallery-caption,\n.gallery-columns-9 .gallery-caption {\n\tdisplay: none;\n}\n\n\n/**\n * 6.6 Post Formats\n * -----------------------------------------------------------------------------\n */\n\n.format-aside .entry-content,\n.format-aside .entry-summary,\n.format-quote .entry-content,\n.format-quote .entry-summary,\n.format-link .entry-content,\n.format-link .entry-summary {\n\tpadding-top: 0;\n}\n\n.site-content .format-link .entry-title,\n.site-content .format-aside .entry-title,\n.site-content .format-quote .entry-title {\n\tdisplay: none;\n}\n\n\n/**\n * 6.7 Post/Image/Paging Navigation\n * -----------------------------------------------------------------------------\n */\n\n.nav-links {\n\t-webkit-hyphens: auto;\n\t-moz-hyphens:    auto;\n\t-ms-hyphens:     auto;\n\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n\thyphens:         auto;\n\tword-wrap: break-word;\n}\n\n.post-navigation,\n.image-navigation {\n\tmargin: 24px auto 48px;\n\tmax-width: 474px;\n\tpadding: 0 10px;\n}\n\n.post-navigation a,\n.image-navigation .previous-image,\n.image-navigation .next-image {\n\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\tpadding: 11px 0 12px;\n\twidth: 100%;\n}\n\n.post-navigation .meta-nav {\n\tcolor: #767676;\n\tdisplay: block;\n\tfont-size: 12px;\n\tfont-weight: 900;\n\tline-height: 2;\n\ttext-transform: uppercase;\n}\n\n.post-navigation a,\n.image-navigation a {\n\tcolor: #2b2b2b;\n\tdisplay: block;\n\tfont-size: 14px;\n\tfont-weight: 700;\n\tline-height: 1.7142857142;\n\ttext-transform: none;\n}\n\n.post-navigation a:hover,\n.image-navigation a:hover {\n\tcolor: #41a62a;\n}\n\n/* Paging Navigation */\n\n.paging-navigation {\n\tborder-top: 5px solid #000;\n\tmargin: 48px 0;\n}\n\n.paging-navigation .loop-pagination {\n\tmargin-top: -5px;\n\ttext-align: center;\n}\n\n.paging-navigation .page-numbers {\n\tborder-top: 5px solid transparent;\n\tdisplay: inline-block;\n\tfont-size: 14px;\n\tfont-weight: 900;\n\tmargin-right: 1px;\n\tpadding: 7px 16px;\n\ttext-transform: uppercase;\n}\n\n.paging-navigation a {\n\tcolor: #2b2b2b;\n}\n\n.paging-navigation .page-numbers.current {\n\tborder-top: 5px solid #24890d;\n}\n\n.paging-navigation a:hover {\n\tborder-top: 5px solid #41a62a;\n\tcolor: #2b2b2b;\n}\n\n\n/**\n * 6.8 Attachments\n * -----------------------------------------------------------------------------\n */\n\n.attachment .content-sidebar,\n.attachment .post-thumbnail {\n\tdisplay: none;\n}\n\n.attachment .entry-content {\n\tpadding-top: 0;\n}\n\n.attachment footer.entry-meta {\n\ttext-transform: none;\n}\n\n.entry-attachment .attachment {\n\tmargin-bottom: 24px;\n}\n\n\n/**\n * 6.9 Archives\n * -----------------------------------------------------------------------------\n */\n\n.archive-header,\n.page-header {\n\tmargin: 24px auto;\n\tmax-width: 474px;\n}\n\n.archive-title,\n.page-title {\n\tfont-size: 16px;\n\tfont-weight: 900;\n\tline-height: 1.5;\n\tmargin: 0;\n}\n\n.taxonomy-description,\n.author-description {\n\tcolor: #767676;\n\tfont-size: 14px;\n\tline-height: 1.2857142857;\n\tpadding-top: 18px;\n}\n\n.taxonomy-description p,\n.author-description p {\n\tmargin-bottom: 18px;\n}\n\n.taxonomy-description p:last-child,\n.author-description p:last-child {\n\tmargin-bottom: 0;\n}\n\n.taxonomy-description a,\n.author-description a {\n\ttext-decoration: underline;\n}\n\n.taxonomy-description a:hover,\n.author-description a:hover {\n\ttext-decoration: none;\n}\n\n\n/**\n * 6.10 Contributor Page\n * -----------------------------------------------------------------------------\n */\n\n.contributor {\n\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing:      border-box;\n\tpadding: 48px 10px;\n}\n\n.contributor:first-of-type {\n\tpadding-top: 24px;\n}\n\n.contributor-info {\n\tmargin: 0 auto;\n\tmax-width: 474px;\n}\n\n.contributor-avatar {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tfloat: left;\n\tmargin: 0 30px 20px 0;\n\tpadding: 2px;\n}\n\n.contributor-name {\n\tfont-size: 16px;\n\tfont-weight: 900;\n\tline-height: 1.5;\n\tmargin: 0;\n}\n\n.contributor-bio a {\n\ttext-decoration: underline;\n}\n\n.contributor-bio a:hover {\n\ttext-decoration: none;\n}\n\n.contributor-posts-link {\n\tdisplay: inline-block;\n\tline-height: normal;\n\tpadding: 10px 30px;\n}\n\n.contributor-posts-link:before {\n\tcontent: \"\\f443\";\n}\n\n\n/**\n * 6.11 404 Page\n * -----------------------------------------------------------------------------\n */\n\n.error404 .page-content {\n\tpadding-top: 0;\n}\n\n.error404 .page-content .search-form {\n\tmargin-bottom: 24px;\n}\n\n\n/**\n * 6.12 Full-width\n * -----------------------------------------------------------------------------\n */\n\n.full-width .hentry {\n\tmax-width: 100%;\n}\n\n\n/**\n * 6.13 Singular\n * -----------------------------------------------------------------------------\n */\n\n.singular .site-content .hentry.has-post-thumbnail {\n\tmargin-top: -48px;\n}\n\n\n/**\n * 6.14 Comments\n * -----------------------------------------------------------------------------\n */\n\n.comments-area {\n\tmargin: 48px auto;\n\tmax-width: 474px;\n\tpadding: 0 10px;\n}\n\n.comment-reply-title,\n.comments-title {\n\tfont: 900 16px/1.5 Lato, sans-serif;\n\tmargin: 0;\n\ttext-transform: uppercase;\n}\n\n.comment-list {\n\tlist-style: none;\n\tmargin: 0 0 48px 0;\n}\n\n.comment-author {\n\tfont-size: 14px;\n\tline-height: 1.7142857142;\n}\n\n.comment-list .reply,\n.comment-metadata {\n\tfont-size: 12px;\n\tline-height: 2;\n\ttext-transform: uppercase;\n}\n\n.comment-list .reply {\n\tmargin-top: 24px;\n}\n\n.comment-author .fn {\n\tfont-weight: 900;\n}\n\n.comment-author a {\n\tcolor: #2b2b2b;\n}\n\n.comment-list .trackback a,\n.comment-list .pingback a,\n.comment-metadata a {\n\tcolor: #767676;\n}\n\n.comment-author a:hover,\n.comment-list .pingback a:hover,\n.comment-list .trackback a:hover,\n.comment-metadata a:hover {\n\tcolor: #41a62a;\n}\n\n.comment-list article,\n.comment-list .pingback,\n.comment-list .trackback {\n\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n\tmargin-bottom: 24px;\n\tpadding-top: 24px;\n}\n\n.comment-list > li:first-child > article,\n.comment-list > .pingback:first-child,\n.comment-list > .trackback:first-child {\n\tborder-top: 0;\n}\n\n.comment-author {\n\tposition: relative;\n}\n\n.comment-author .avatar {\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\theight: 18px;\n\tpadding: 2px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 18px;\n}\n\n.bypostauthor > article .fn:before {\n\tcontent: \"\\f408\";\n\tmargin: 0 2px 0 -2px;\n\tposition: relative;\n\ttop: -1px;\n}\n\n.says {\n\tdisplay: none;\n}\n\n.comment-author,\n.comment-awaiting-moderation,\n.comment-content,\n.comment-list .reply,\n.comment-metadata {\n\tpadding-left: 30px;\n}\n\n.comment-edit-link {\n\tmargin-left: 10px;\n}\n\n.comment-edit-link:before {\n\tcontent: \"\\f411\";\n}\n\n.comment-reply-link:before,\n.comment-reply-login:before {\n\tcontent: \"\\f412\";\n\tmargin-right: 2px;\n}\n\n.comment-content {\n\t-webkit-hyphens: auto;\n\t-moz-hyphens:    auto;\n\t-ms-hyphens:     auto;\n\thyphens:         auto;\n\tword-wrap: break-word;\n}\n\n.comment-content ul,\n.comment-content ol {\n\tmargin: 0 0 24px 22px;\n}\n\n.comment-content li > ul,\n.comment-content li > ol {\n\tmargin-bottom: 0;\n}\n\n.comment-content > :last-child {\n\tmargin-bottom: 0;\n}\n\n.comment-list .children {\n\tlist-style: none;\n\tmargin-left: 15px;\n}\n\n.comment-respond {\n\tmargin-bottom: 24px;\n\tpadding: 0;\n}\n\n.comment .comment-respond {\n\tmargin-top: 24px;\n}\n\n.comment-respond h3 {\n\tmargin-top: 0;\n\tmargin-bottom: 24px;\n}\n\n.comment-notes,\n.comment-awaiting-moderation,\n.logged-in-as,\n.no-comments,\n.form-allowed-tags,\n.form-allowed-tags code {\n\tcolor: #767676;\n}\n\n.comment-notes,\n.comment-awaiting-moderation,\n.logged-in-as {\n\tfont-size: 14px;\n\tline-height: 1.7142857142;\n}\n\n.no-comments {\n\tfont-size: 16px;\n\tfont-weight: 900;\n\tline-height: 1.5;\n\tmargin-top: 24px;\n\ttext-transform: uppercase;\n}\n\n.comment-form label {\n\tdisplay: block;\n}\n\n.comment-form input[type=\"text\"],\n.comment-form input[type=\"email\"],\n.comment-form input[type=\"url\"] {\n\twidth: 100%;\n}\n\n.form-allowed-tags,\n.form-allowed-tags code {\n\tfont-size: 12px;\n\tline-height: 1.5;\n}\n\n.required {\n\tcolor: #c0392b;\n}\n\n.comment-reply-title small a {\n\tcolor: #2b2b2b;\n\tfloat: right;\n\theight: 24px;\n\toverflow: hidden;\n\twidth: 24px;\n}\n\n.comment-reply-title small a:hover {\n\tcolor: #41a62a;\n}\n\n.comment-reply-title small a:before {\n\tcontent: \"\\f405\";\n\tfont-size: 32px;\n}\n\n.comment-navigation {\n\tfont-size: 12px;\n\tline-height: 2;\n\tmargin-bottom: 48px;\n\ttext-transform: uppercase;\n}\n\n.comment-navigation .nav-next,\n.comment-navigation .nav-previous {\n\tdisplay: inline-block;\n}\n\n.comment-navigation .nav-previous a {\n\tmargin-right: 10px;\n}\n\n#comment-nav-above {\n\tmargin-top: 36px;\n\tmargin-bottom: 0;\n}\n\n\n/**\n * 7.0 Sidebars\n * -----------------------------------------------------------------------------\n */\n\n/* Secondary */\n\n#secondary {\n\tbackground-color: #000;\n\tborder-top: 1px solid #000;\n\tborder-bottom: 1px solid rgba(255, 255, 255, 0.2);\n\tclear: both;\n\tcolor: rgba(255, 255, 255, 0.7);\n\tmargin-top: -1px;\n\tpadding: 0 10px;\n\tposition: relative;\n\tz-index: 2;\n}\n\n.site-description {\n\tdisplay: none;\n\tfont-size: 12px;\n\tfont-weight: 400;\n\tline-height: 1.5;\n}\n\n/* Primary Sidebar */\n\n.primary-sidebar {\n\tpadding-top: 48px;\n}\n\n.secondary-navigation + .primary-sidebar {\n\tpadding-top: 0;\n}\n\n/* Content Sidebar */\n\n.content-sidebar {\n\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tcolor: #767676;\n\tpadding: 48px 10px 0;\n}\n\n\n/**\n * 7.1 Widgets\n * -----------------------------------------------------------------------------\n */\n\n/* Primary Sidebar, Footer Sidebar */\n\n.widget {\n\tfont-size: 14px;\n\t-webkit-hyphens: auto;\n\t-moz-hyphens:    auto;\n\t-ms-hyphens:     auto;\n\thyphens:         auto;\n\tline-height: 1.2857142857;\n\tmargin-bottom: 48px;\n\twidth: 100%;\n\tword-wrap: break-word;\n}\n\n.widget a {\n\tcolor: #fff;\n}\n\n.widget a:hover {\n\tcolor: #41a62a;\n}\n\n.widget h1,\n.widget h2,\n.widget h3,\n.widget h4,\n.widget h5,\n.widget h6 {\n\tmargin: 24px 0 12px;\n}\n\n.widget h1 {\n\tfont-size: 22px;\n\tline-height: 1.0909090909;\n}\n\n.widget h2 {\n\tfont-size: 20px;\n\tline-height: 1.2;\n}\n\n.widget h3 {\n\tfont-size: 18px;\n\tline-height: 1.3333333333;\n}\n\n.widget h4 {\n\tfont-size: 16px;\n\tline-height: 1.5;\n}\n\n.widget h5 {\n\tfont-size: 14px;\n\tline-height: 1.7142857142;\n}\n\n.widget h6 {\n\tfont-size: 12px;\n\tline-height: 2;\n}\n\n.widget address {\n\tmargin-bottom: 18px;\n}\n\n.widget abbr[title] {\n\tborder-color: rgba(255, 255, 255, 0.7);\n}\n\n.widget mark,\n.widget ins {\n\tcolor: #000;\n}\n\n.widget pre,\n.widget fieldset {\n\tborder-color: rgba(255, 255, 255, 0.2);\n}\n\n.widget code,\n.widget kbd,\n.widget tt,\n.widget var,\n.widget samp,\n.widget pre {\n\tfont-size: 12px;\n\tline-height: 1.5;\n}\n\n.widget blockquote {\n\tcolor: rgba(255, 255, 255, 0.7);\n\tfont-size: 18px;\n\tline-height: 1.5;\n\tmargin-bottom: 18px;\n}\n\n.widget blockquote cite {\n\tcolor: #fff;\n\tfont-size: 14px;\n\tline-height: 1.2857142857;\n}\n\n.widget dl,\n.widget dd {\n\tmargin-bottom: 18px;\n}\n\n.widget ul,\n.widget ol {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.widget li > ol,\n.widget li > ul {\n\tmargin-left: 10px;\n}\n\n.widget table,\n.widget th,\n.widget td {\n\tborder-color: rgba(255, 255, 255, 0.2);\n}\n\n.widget table {\n\tmargin-bottom: 18px;\n}\n\n.widget del {\n\tcolor: rgba(255, 255, 255, 0.4);\n}\n\n.widget hr {\n\tbackground-color: rgba(255, 255, 255, 0.2);\n}\n\n.widget p {\n\tmargin-bottom: 18px;\n}\n\n.widget-area .widget input,\n.widget-area .widget textarea {\n\tbackground-color: rgba(255, 255, 255, 0.1);\n\tborder-color: rgba(255, 255, 255, 0.2);\n\tcolor: #fff;\n\tfont-size: 16px;\n\tpadding: 1px 2px 2px 4px;\n}\n\n.widget-area .widget input:focus,\n.widget-area .widget textarea:focus {\n\tborder-color: rgba(255, 255, 255, 0.3);\n}\n\n.widget button,\n.widget .button,\n.widget input[type=\"button\"],\n.widget input[type=\"reset\"],\n.widget input[type=\"submit\"] {\n\tbackground-color: #24890d;\n\tborder: 0;\n\tfont-size: 12px;\n\tpadding: 5px 15px 4px;\n}\n\n.widget input[type=\"button\"]:hover,\n.widget input[type=\"button\"]:focus,\n.widget input[type=\"reset\"]:hover,\n.widget input[type=\"reset\"]:focus,\n.widget input[type=\"submit\"]:hover,\n.widget input[type=\"submit\"]:focus {\n\tbackground-color: #41a62a;\n}\n\n.widget input[type=\"button\"]:active,\n.widget input[type=\"reset\"]:active,\n.widget input[type=\"submit\"]:active {\n\tbackground-color: #55d737;\n}\n\n.widget .wp-caption {\n\tcolor: rgba(255, 255, 255, 0.7);\n\tmargin-bottom: 18px;\n}\n\n.widget .widget-title {\n\tfont-size: 14px;\n\tfont-weight: 700;\n\tline-height: 1.7142857142;\n\tmargin: 0 0 24px 0;\n\ttext-transform: uppercase;\n}\n\n.widget-title,\n.widget-title a {\n\tcolor: #fff;\n}\n\n.widget-title a:hover {\n\tcolor: #41a62a;\n}\n\n/* Calendar Widget*/\n\n.widget_calendar table {\n\tline-height: 2;\n\tmargin: 0;\n}\n\n.widget_calendar caption {\n\tcolor: #fff;\n\tfont-weight: 700;\n\tline-height: 1.7142857142;\n\tmargin-bottom: 18px;\n\ttext-align: left;\n\ttext-transform: uppercase;\n}\n\n.widget_calendar thead th {\n\tbackground-color: rgba(255, 255, 255, 0.1);\n}\n\n.widget_calendar tbody td,\n.widget_calendar thead th {\n\ttext-align: center;\n}\n\n.widget_calendar tbody a {\n\tbackground-color: #24890d;\n\tcolor: #fff;\n\tdisplay: block;\n}\n\n.widget_calendar tbody a:hover {\n\tbackground-color: #41a62a;\n}\n\n.widget_calendar tbody a:hover {\n\tcolor: #fff;\n}\n\n.widget_calendar #prev {\n\tpadding-left: 5px;\n}\n\n.widget_calendar #next {\n\tpadding-right: 5px;\n\ttext-align: right;\n}\n\n/* Ephemera Widget*/\n\n.widget_twentyfourteen_ephemera > ol > li {\n\tborder-bottom: 1px solid rgba(255, 255, 255, 0.2);\n\tmargin-bottom: 18px;\n\tpadding: 0;\n}\n\n.widget_twentyfourteen_ephemera .hentry {\n\tmargin: 0;\n\tmax-width: 100%;\n}\n\n.widget_twentyfourteen_ephemera .entry-title,\n.widget_twentyfourteen_ephemera .entry-meta,\n.widget_twentyfourteen_ephemera .wp-caption-text,\n.widget_twentyfourteen_ephemera .post-format-archive-link,\n.widget_twentyfourteen_ephemera .entry-content table {\n\tfont-size: 12px;\n\tline-height: 1.5;\n}\n\n.widget_twentyfourteen_ephemera .entry-title {\n\tdisplay: inline;\n\tfont-weight: 400;\n}\n\n.widget_twentyfourteen_ephemera .entry-meta {\n\tmargin-bottom: 18px;\n}\n\n.widget_twentyfourteen_ephemera .entry-meta a {\n\tcolor: rgba(255, 255, 255, 0.7);\n}\n\n.widget_twentyfourteen_ephemera .entry-meta a:hover {\n\tcolor: #41a62a;\n}\n\n.widget_twentyfourteen_ephemera .entry-content ul,\n.widget_twentyfourteen_ephemera .entry-content ol {\n\tmargin: 0 0 18px 20px;\n}\n\n.widget_twentyfourteen_ephemera .entry-content ul {\n\tlist-style: disc;\n}\n\n.widget_twentyfourteen_ephemera .entry-content ol {\n\tlist-style: decimal;\n}\n\n.widget_twentyfourteen_ephemera .entry-content li > ul,\n.widget_twentyfourteen_ephemera .entry-content li > ol {\n\tmargin: 0 0 0 20px;\n}\n\n.widget_twentyfourteen_ephemera .entry-content th,\n.widget_twentyfourteen_ephemera .entry-content td {\n\tpadding: 6px;\n}\n\n.widget_twentyfourteen_ephemera .post-format-archive-link {\n\tfont-weight: 700;\n\ttext-transform: uppercase;\n}\n\n/* List Style Widgets*/\n\n.widget_archive li,\n.widget_categories li,\n.widget_links li,\n.widget_meta li,\n.widget_nav_menu li,\n.widget_pages li,\n.widget_recent_comments li,\n.widget_recent_entries li {\n\tborder-top: 1px solid rgba(255, 255, 255, 0.2);\n\tpadding: 8px 0 9px;\n}\n\n.widget_archive li:first-child,\n.widget_categories li:first-child,\n.widget_links li:first-child,\n.widget_meta li:first-child,\n.widget_nav_menu li:first-child,\n.widget_pages li:first-child,\n.widget_recent_comments li:first-child,\n.widget_recent_entries li:first-child {\n\tborder-top: 0;\n}\n\n.widget_categories li ul,\n.widget_nav_menu li ul,\n.widget_pages li ul {\n\tborder-top: 1px solid rgba(255, 255, 255, 0.2);\n\tmargin-top: 9px;\n}\n\n.widget_categories li li:last-child,\n.widget_nav_menu li li:last-child,\n.widget_pages li li:last-child {\n\tpadding-bottom: 0;\n}\n\n/* Recent Posts Widget */\n\n.widget_recent_entries .post-date {\n\tdisplay: block;\n}\n\n/* RSS Widget */\n\n.rsswidget img {\n\tmargin-top: -4px;\n}\n\n.rssSummary {\n\tmargin: 9px 0;\n}\n\n.rss-date {\n\tdisplay: block;\n}\n\n.widget_rss li {\n\tmargin-bottom: 18px;\n}\n\n.widget_rss li:last-child {\n\tmargin-bottom: 0;\n}\n\n/* Text Widget */\n\n.widget_text > div > :last-child {\n\tmargin-bottom: 0;\n}\n\n\n/**\n * 7.2 Content Sidebar Widgets\n * -----------------------------------------------------------------------------\n */\n\n.content-sidebar .widget a {\n\tcolor: #24890d;\n}\n\n.content-sidebar .widget a:hover {\n\tcolor: #41a62a;\n}\n\n.content-sidebar .widget pre {\n\tborder-color: rgba(0, 0, 0, 0.1);\n}\n\n.content-sidebar .widget mark,\n.content-sidebar .widget ins {\n\tcolor: #2b2b2b;\n}\n\n.content-sidebar .widget abbr[title] {\n\tborder-color: #2b2b2b;\n}\n\n.content-sidebar .widget fieldset {\n\tborder-color: rgba(0, 0, 0, 0.1);\n}\n\n.content-sidebar .widget blockquote {\n\tcolor: #767676;\n}\n\n.content-sidebar .widget blockquote cite {\n\tcolor: #2b2b2b;\n}\n\n.content-sidebar .widget li > ol,\n.content-sidebar .widget li > ul {\n\tmargin-left: 18px;\n}\n\n.content-sidebar .widget table,\n.content-sidebar .widget th,\n.content-sidebar .widget td {\n\tborder-color: rgba(0, 0, 0, 0.1);\n}\n\n.content-sidebar .widget del {\n\tcolor: #767676;\n}\n\n.content-sidebar .widget hr {\n\tbackground-color: rgba(0, 0, 0, 0.1);\n}\n\n.content-sidebar .widget input,\n.content-sidebar .widget textarea {\n\tbackground-color: #fff;\n\tborder-color: rgba(0, 0, 0, 0.1);\n\tcolor: #2b2b2b;\n}\n\n.content-sidebar .widget input:focus,\n.content-sidebar .widget textarea:focus {\n\tborder-color: rgba(0, 0, 0, 0.3);\n}\n\n.content-sidebar .widget input[type=\"button\"],\n.content-sidebar .widget input[type=\"reset\"],\n.content-sidebar .widget input[type=\"submit\"] {\n\tbackground-color: #24890d;\n\tborder: 0;\n\tcolor: #fff;\n}\n\n.content-sidebar .widget input[type=\"button\"]:hover,\n.content-sidebar .widget input[type=\"button\"]:focus,\n.content-sidebar .widget input[type=\"reset\"]:hover,\n.content-sidebar .widget input[type=\"reset\"]:focus,\n.content-sidebar .widget input[type=\"submit\"]:hover,\n.content-sidebar .widget input[type=\"submit\"]:focus {\n\tbackground-color: #41a62a;\n}\n\n.content-sidebar .widget input[type=\"button\"]:active,\n.content-sidebar .widget input[type=\"reset\"]:active,\n.content-sidebar .widget input[type=\"submit\"]:active {\n\tbackground-color: #55d737;\n}\n\n.content-sidebar .widget .wp-caption {\n\tcolor: #767676;\n}\n\n.content-sidebar .widget .widget-title {\n\tborder-top: 5px solid #000;\n\tcolor: #2b2b2b;\n\tfont-size: 14px;\n\tfont-weight: 900;\n\tmargin: 0 0 18px;\n\tpadding-top: 7px;\n\ttext-transform: uppercase;\n}\n\n.content-sidebar .widget .widget-title a {\n\tcolor: #2b2b2b;\n}\n\n.content-sidebar .widget .widget-title a:hover {\n\tcolor: #41a62a;\n}\n\n/* List Style Widgets*/\n\n.content-sidebar .widget_archive li,\n.content-sidebar .widget_categories li,\n.content-sidebar .widget_links li,\n.content-sidebar .widget_meta li,\n.content-sidebar .widget_nav_menu li,\n.content-sidebar .widget_pages li,\n.content-sidebar .widget_recent_comments li,\n.content-sidebar .widget_recent_entries li,\n.content-sidebar .widget_categories li ul,\n.content-sidebar .widget_nav_menu li ul,\n.content-sidebar .widget_pages li ul {\n\tborder-color: rgba(0, 0, 0, 0.1);\n}\n\n/* Calendar Widget */\n\n.content-sidebar .widget_calendar caption {\n\tcolor: #2b2b2b;\n\tfont-weight: 900;\n}\n\n.content-sidebar .widget_calendar thead th {\n\tbackground-color: rgba(0, 0, 0, 0.02);\n}\n\n.content-sidebar .widget_calendar tbody a,\n.content-sidebar .widget_calendar tbody a:hover {\n\tcolor: #fff;\n}\n\n/* Ephemera widget*/\n\n.content-sidebar .widget_twentyfourteen_ephemera .widget-title {\n\tline-height: 1.2857142857;\n\tpadding-top: 1px;\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .widget-title:before {\n\tbackground-color: #000;\n\tcolor: #fff;\n\tmargin: -1px 9px 0 0;\n\tpadding: 6px 0 9px;\n\ttext-align: center;\n\tvertical-align: middle;\n\twidth: 36px;\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .video.widget-title:before {\n\tcontent: \"\\f104\";\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .audio.widget-title:before {\n\tcontent: \"\\f109\";\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .image.widget-title:before {\n\tcontent: \"\\f473\";\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .gallery.widget-title:before {\n\tcontent: \"\\f103\";\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .aside.widget-title:before {\n\tcontent: \"\\f101\";\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .quote.widget-title:before {\n\tcontent: \"\\f106\";\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .link.widget-title:before {\n\tcontent: \"\\f107\";\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera > ol > li {\n\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .entry-meta {\n\tcolor: #ccc;\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .entry-meta a {\n\tcolor: #767676;\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .entry-meta a:hover {\n\tcolor: #41a62a;\n}\n\n.content-sidebar.widget_twentyfourteen_ephemera blockquote cite {\n\tfont-size: 13px;\n\tline-height: 1.3846153846;\n}\n\n.content-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link {\n\tfont-weight: 900;\n}\n\n\n/**\n * 8.0 Footer\n * -----------------------------------------------------------------------------\n */\n\n#supplementary {\n\tpadding: 0 10px;\n}\n\n.site-footer,\n.site-info,\n.site-info a {\n\tcolor: rgba(255, 255, 255, 0.7);\n}\n\n.site-footer {\n\tbackground-color: #000;\n\tfont-size: 12px;\n\tposition: relative;\n\tz-index: 3;\n}\n\n.footer-sidebar {\n\tpadding-top: 48px;\n}\n\n.site-info {\n\tpadding: 15px 10px;\n}\n\n#supplementary + .site-info {\n\tborder-top: 1px solid rgba(255, 255, 255, 0.2);\n}\n\n.site-info a:hover {\n\tcolor: #41a62a;\n}\n\n\n/**\n * 9.0 Featured Content\n * -----------------------------------------------------------------------------\n */\n\n.featured-content {\n\tbackground: #000 url(images/pattern-dark.svg) repeat fixed;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tposition: relative;\n\twidth: 100%;\n}\n\n.featured-content-inner {\n\toverflow: hidden;\n}\n\n.featured-content .hentry {\n\tcolor: #fff;\n\tmargin: 0;\n\tmax-width: 100%;\n\twidth: 100%;\n}\n\n.featured-content .post-thumbnail,\n.featured-content .post-thumbnail:hover {\n\tbackground: transparent;\n}\n\n.featured-content .post-thumbnail {\n\tdisplay: block;\n\tposition: relative;\n\tpadding-top: 55.357142857%;\n\toverflow: hidden;\n}\n\n.featured-content .post-thumbnail img {\n\tleft: 0;\n\tposition: absolute;\n\ttop: 0;\n}\n\n.featured-content .entry-header {\n\tbackground-color: #000;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tmin-height: 96px;\n\toverflow: hidden;\n\tpadding: 24px 10px;\n}\n\n.featured-content a {\n\tcolor: #fff;\n}\n\n.featured-content a:hover {\n\tcolor: #41a62a;\n}\n\n.featured-content .entry-meta {\n\tcolor: #fff;\n\tfont-size: 11px;\n\tfont-weight: 700;\n\tline-height: 1.0909090909;\n\tmargin-bottom: 12px;\n}\n\n.featured-content .cat-links {\n\tfont-weight: 700;\n}\n\n.featured-content .entry-title {\n\tfont-size: 18px;\n\tfont-weight: 300;\n\tline-height: 1.3333333333;\n\tmargin: 0;\n\ttext-transform: uppercase;\n}\n\n\n/* Slider */\n\n.slider .featured-content .hentry {\n\t-webkit-backface-visibility: hidden;\n\tdisplay: none;\n\tposition: relative;\n}\n\n.slider .featured-content .post-thumbnail {\n\tpadding-top: 55.49132947%;\n}\n\n.slider-control-paging {\n\tbackground-color: #000;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tfloat: left;\n\tlist-style: none;\n\tmargin: -24px 0 0 0;\n\tposition: relative;\n\twidth: 100%;\n\tz-index: 3;\n}\n\n.slider-control-paging li {\n\tfloat: left;\n\tmargin: 2px 4px 2px 0;\n}\n\n.slider-control-paging li:last-child {\n\tmargin-right: 0;\n}\n\n.slider-control-paging a {\n\tcursor: pointer;\n\tdisplay: block;\n\theight: 44px;\n\tposition: relative;\n\ttext-indent: -999em;\n\twidth: 44px;\n}\n\n.slider-control-paging a:before {\n\tbackground-color: #4d4d4d;\n\tcontent: \"\";\n\theight: 12px;\n\tleft: 10px;\n\tposition: absolute;\n\ttop: 16px;\n\twidth: 12px;\n}\n\n.slider-control-paging a:hover:before {\n\tbackground-color: #41a62a;\n}\n\n.slider-control-paging .slider-active:before,\n.slider-control-paging .slider-active:hover:before {\n\tbackground-color: #24890d;\n}\n\n.slider-direction-nav {\n\tclear: both;\n\tlist-style: none;\n\tmargin: 0;\n\tposition: relative;\n\twidth: 100%;\n\tz-index: 3;\n}\n\n.slider-direction-nav li {\n\tborder-color: #fff;\n\tborder-style: solid;\n\tborder-width: 2px 1px 0 0;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing:    border-box;\n\tbox-sizing:         border-box;\n\tfloat: left;\n\ttext-align: center;\n\twidth: 50%;\n}\n\n.slider-direction-nav li:last-child {\n\tborder-width: 2px 0 0 1px;\n}\n\n.slider-direction-nav a {\n\tbackground-color: #000;\n\tdisplay: block;\n\tfont-size: 0;\n\theight: 46px;\n}\n\n.slider-direction-nav a:hover {\n\tbackground-color: #24890d;\n}\n\n.slider-direction-nav a:before {\n\tcolor: #fff;\n\tcontent: \"\\f430\";\n\tfont-size: 32px;\n\tline-height: 46px;\n}\n\n.slider-direction-nav .slider-next:before {\n\tcontent: \"\\f429\";\n}\n\n.slider-direction-nav .slider-disabled {\n\tdisplay: none;\n}\n\n\n/**\n * 10.0 Multisite\n * -----------------------------------------------------------------------------\n */\n\n.site-main .widecolumn {\n\tpadding-top: 72px;\n\twidth: auto;\n}\n.site-main .mu_register,\n.widecolumn > h2,\n.widecolumn > form {\n\tmargin: 0 auto 48px;\n\tmax-width: 474px;\n\tpadding: 0 30px;\n}\n\n.site-main .mu_register #blog_title,\n.site-main .mu_register #user_email,\n.site-main .mu_register #blogname,\n.site-main .mu_register #user_name {\n\tfont-size: inherit;\n\twidth: 90%;\n}\n\n.site-main .mu_register input[type=\"submit\"],\n.widecolumn #submit {\n\tfont-size: inherit;\n\twidth: auto;\n}\n\n\n/**\n * 11.0 Media Queries\n * -----------------------------------------------------------------------------\n */\n\n/* Does the same thing as <meta name=\"viewport\" content=\"width=device-width\">,\n * but in the future W3C standard way. -ms- prefix is required for IE10+ to\n * render responsive styling in Windows 8 \"snapped\" views; IE10+ does not honor\n * the meta tag. See https://core.trac.wordpress.org/ticket/25888.\n */\n@-ms-viewport {\n\twidth: device-width;\n}\n\n@viewport {\n\twidth: device-width;\n}\n\n@media screen and (max-width: 400px) {\n\t.list-view .site-content .post-thumbnail {\n\t\tbackground: none;\n\t\twidth: auto;\n\t\tz-index: 2;\n\t}\n\n\t.list-view .site-content .post-thumbnail img {\n\t\tfloat: left;\n\t\tmargin: 0 10px 3px 0;\n\t\twidth: 84px;\n\t}\n\n\t.list-view .site-content .entry-header {\n\t\tbackground-color: transparent;\n\t\tpadding: 0;\n\t}\n\n\t.list-view .content-area {\n\t\tpadding: 0 10px;\n\t}\n\n\t.list-view .site-content .hentry {\n\t\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\t\tmargin: 0;\n\t\tmin-height: 60px;\n\t\tpadding: 12px 0 9px;\n\t}\n\n\t.list-view .site-content .cat-links,\n\t.list-view .site-content .type-post .entry-content,\n\t.list-view .site-content .type-page .entry-content,\n\t.list-view .site-content .type-post .entry-summary,\n\t.list-view .site-content .type-page .entry-summary,\n\t.list-view .site-content footer.entry-meta {\n\t\tdisplay: none;\n\t}\n\n\t.list-view .site-content .entry-title {\n\t\tclear: none;\n\t\tfont-size: 15px;\n\t\tfont-weight: 900;\n\t\tline-height: 1.2;\n\t\tmargin-bottom: 6px;\n\t\ttext-transform: none;\n\t}\n\n\t.list-view .site-content .format-aside .entry-title,\n\t.list-view .site-content .format-link .entry-title,\n\t.list-view .site-content .format-quote .entry-title {\n\t\tdisplay: block;\n\t}\n\n\t.list-view .site-content .entry-meta {\n\t\tbackground-color: transparent;\n\t\tclear: none;\n\t\tmargin: 0;\n\t\ttext-transform: none;\n\t}\n\n\t.archive-header,\n\t.page-header {\n\t\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\t\tmargin: 24px auto 0;\n\t\tpadding-bottom: 24px;\n\t}\n\n\t.error404 .page-header {\n\t\tborder-bottom: 0;\n\t\tmargin: 0 auto 24px;\n\t\tpadding: 0 10px;\n\t}\n}\n\n@media screen and (min-width: 401px) {\n\ta.post-thumbnail:hover img {\n\t\topacity: 0.85;\n\t}\n\n\t.full-size-link:before,\n\t.parent-post-link:before,\n\t.site-content span + .byline:before,\n\t.site-content span + .comments-link:before,\n\t.site-content span + .edit-link:before,\n\t.site-content span + .entry-date:before {\n\t\tcontent: \"\";\n\t}\n\n\t.attachment span.entry-date:before,\n\t.entry-content .edit-link a:before,\n\t.entry-meta .edit-link a:before,\n\t.site-content .byline a:before,\n\t.site-content .comments-link a:before,\n\t.site-content .entry-date a:before,\n\t.site-content .featured-post:before,\n\t.site-content .full-size-link a:before,\n\t.site-content .parent-post-link a:before,\n\t.site-content .post-format a:before {\n\t\t-webkit-font-smoothing: antialiased;\n\t\tdisplay: inline-block;\n\t\tfont: normal 16px/1 Genericons;\n\t\ttext-decoration: inherit;\n\t\tvertical-align: text-bottom;\n\t}\n\n\t.site-content .entry-meta > span {\n\t\tmargin-right: 10px;\n\t}\n\n\t.site-content .format-video .post-format a:before {\n\t\tcontent: \"\\f104\";\n\t}\n\n\t.site-content .format-audio .post-format a:before {\n\t\tcontent: \"\\f109\";\n\t}\n\n\t.site-content .format-image .post-format a:before {\n\t\tcontent: \"\\f473\";\n\t}\n\n\t.site-content .format-quote .post-format a:before {\n\t\tcontent: \"\\f106\";\n\t\tmargin-right: 2px;\n\t}\n\n\t.site-content .format-gallery .post-format a:before {\n\t\tcontent: \"\\f103\";\n\t\tmargin-right: 4px;\n\t}\n\n\t.site-content .format-aside .post-format a:before {\n\t\tcontent: \"\\f101\";\n\t\tmargin-right: 2px;\n\t}\n\n\t.site-content .format-link .post-format a:before {\n\t\tcontent: \"\\f107\";\n\t\tposition: relative;\n\t\ttop: 1px;\n\t}\n\n\t.site-content .featured-post:before {\n\t\tcontent: \"\\f308\";\n\t\tmargin-right: 3px;\n\t\tposition: relative;\n\t\ttop: 1px;\n\t}\n\n\t.site-content .entry-date a:before,\n\t.attachment .site-content span.entry-date:before {\n\t\tcontent: \"\\f303\";\n\t\tmargin-right: 1px;\n\t\tposition: relative;\n\t\ttop: 1px;\n\t}\n\n\t.site-content .byline a:before {\n\t\tcontent: \"\\f304\";\n\t}\n\n\t.site-content .comments-link a:before {\n\t\tcontent: \"\\f300\";\n\t\tmargin-right: 2px;\n\t}\n\n\t.entry-content .edit-link a:before,\n\t.entry-meta .edit-link a:before {\n\t\tcontent: \"\\f411\";\n\t}\n\n\t.site-content .full-size-link a:before {\n\t\tcontent: \"\\f402\";\n\t\tmargin-right: 1px;\n\t}\n\n\t.site-content .parent-post-link a:before {\n\t\tcontent: \"\\f301\";\n\t}\n\n\t.list-view .site-content .hentry {\n\t\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n\t\tpadding-top: 48px;\n\t}\n\n\t.list-view .site-content .hentry:first-of-type,\n\t.list-view .site-content .hentry.has-post-thumbnail {\n\t\tborder-top: 0;\n\t\tpadding-top: 0;\n\t}\n\n\t.archive-header,\n\t.page-header {\n\t\tmargin: 0 auto 60px;\n\t\tpadding: 0 10px;\n\t}\n\n\t.error404 .page-header {\n\t\tmargin-bottom: 24px;\n\t}\n}\n\n@media screen and (min-width: 594px) {\n\t.site-content .entry-header {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 30px;\n\t}\n\n\t.site-content .has-post-thumbnail .entry-header {\n\t\tmargin-top: -48px;\n\t}\n}\n\n@media screen and (min-width: 673px) {\n\t.header-main {\n\t\tpadding: 0 30px;\n\t}\n\n\t.search-toggle {\n\t\tmargin-right: 18px;\n\t}\n\n\t.search-box .search-field {\n\t\twidth: 50%;\n\t}\n\n\t.content-area {\n\t\tfloat: left;\n\t\twidth: 100%;\n\t}\n\n\t.site-content {\n\t\tmargin-right: 33.33333333%;\n\t}\n\n\t.site-content .has-post-thumbnail .entry-header {\n\t\tmargin-top: 0;\n\t}\n\n\t.archive-header,\n\t.comments-area,\n\t.image-navigation,\n\t.page-header,\n\t.page-content,\n\t.post-navigation,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content footer.entry-meta {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 30px;\n\t}\n\n\t.singular .site-content .hentry.has-post-thumbnail {\n\t\tmargin-top: 0;\n\t}\n\n\t.full-width .site-content {\n\t\tmargin-right: 0;\n\t}\n\n\t.full-width .site-content .has-post-thumbnail .entry-header,\n\t.full-width .site-content .hentry.has-post-thumbnail:first-child {\n\t\tmargin-top: -48px;\n\t}\n\n\t#secondary,\n\t#supplementary {\n\t\tpadding: 0 30px;\n\t}\n\n\t.content-sidebar {\n\t\tborder: 0;\n\t\tfloat: right;\n\t\tmargin-left: -33.33333333%;\n\t\tpadding: 48px 30px 24px;\n\t\tposition: relative;\n\t\twidth: 33.33333333%;\n\t}\n\n\t.grid .featured-content .hentry {\n\t\tfloat: left;\n\t\twidth: 50%;\n\t}\n\n\t.grid .featured-content .hentry:nth-child( 2n+1 ) {\n\t\tclear: both;\n\t}\n\n\t.grid .featured-content .entry-header {\n\t\tborder-color: #000;\n\t\tborder-style: solid;\n\t\tborder-width: 12px 10px;\n\t\theight: 96px;\n\t\tpadding: 0;\n\t}\n\n\t.slider .featured-content .entry-title {\n\t\tfont-size: 22px;\n\t\tline-height: 1.0909090909;\n\t}\n\n\t.slider .featured-content .entry-header {\n\t\tmin-height: inherit;\n\t\tpadding: 24px 30px 48px;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\tbottom: 0;\n\t\twidth: 50%;\n\t\tz-index: 3;\n\t}\n\n\t.slider-control-paging {\n\t\tbackground: transparent;\n\t\tmargin-top: -48px;\n\t\tpadding-left: 20px;\n\t\twidth: 50%;\n\t}\n\n\t.slider-direction-nav {\n\t\tclear: none;\n\t\tfloat: right;\n\t\tmargin-top: -48px;\n\t\twidth: 98px;\n\t}\n\n\t.slider-direction-nav li {\n\t\tborder: 0;\n\t\tpadding: 0 1px 0 0;\n\t}\n\n\t.slider-direction-nav li:last-child {\n\t\tpadding: 0 0 0 1px;\n\t}\n\n\t.slider-direction-nav a {\n\t\theight: 48px;\n\t}\n\n\t.slider-direction-nav a:before {\n\t\tline-height: 48px;\n\t}\n\n\t.site-info {\n\t\tpadding: 15px 30px;\n\t}\n}\n\n@media screen and (min-width: 783px) {\n\t.site-title {\n\t\t/* Search-toggle width = 48px */\n\t\tmax-width: -webkit-calc(100% - 48px);\n\t\tmax-width:         calc(100% - 48px);\n\t}\n\n\t.header-main {\n\t\tpadding-right: 0;\n\t}\n\n\t.search-toggle {\n\t\tmargin-right: 0;\n\t}\n\n\t/* Fixed Header */\n\n\t.masthead-fixed .site-header {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t}\n\n\t.admin-bar.masthead-fixed .site-header {\n\t\ttop: 32px;\n\t}\n\n\t.masthead-fixed .site-main {\n\t\tmargin-top: 48px;\n\t}\n\n\t/* Navigation */\n\n\t.site-navigation li .current_page_item > a,\n\t.site-navigation li .current_page_ancestor > a,\n\t.site-navigation li .current-menu-item > a,\n\t.site-navigation li .current-menu-ancestor > a {\n\t\tcolor: #fff;\n\t}\n\n\t/* Primary Navigation */\n\n\t.primary-navigation {\n\t\tfloat: right;\n\t\tfont-size: 11px;\n\t\tmargin: 0 1px 0 -12px;\n\t\tpadding: 0;\n\t\ttext-transform: uppercase;\n\t}\n\n\t.primary-navigation .menu-toggle {\n\t\tdisplay: none;\n\t\tpadding: 0;\n\t}\n\n\t.primary-navigation .nav-menu {\n\t\tborder-bottom: 0;\n\t\tdisplay: block;\n\t}\n\n\t.primary-navigation.toggled-on {\n\t\tborder-bottom: 0;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.primary-navigation li {\n\t\tborder: 0;\n\t\tdisplay: inline-block;\n\t\theight: 48px;\n\t\tline-height: 48px;\n\t\tposition: relative;\n\t}\n\n\t.primary-navigation a {\n\t\tdisplay: inline-block;\n\t\tpadding: 0 12px;\n\t\twhite-space: nowrap;\n\t}\n\n\t.primary-navigation ul ul {\n\t\tbackground-color: #24890d;\n\t\tfloat: left;\n\t\tmargin: 0;\n\t\tposition: absolute;\n\t\ttop: 48px;\n\t\tleft: -999em;\n\t\tz-index: 99999;\n\t}\n\n\t.primary-navigation li li {\n\t\tborder: 0;\n\t\tdisplay: block;\n\t\theight: auto;\n\t\tline-height: 1.0909090909;\n\t}\n\n\t.primary-navigation ul ul ul {\n\t\tleft: -999em;\n\t\ttop: 0;\n\t}\n\n\t.primary-navigation ul ul a {\n\t\tpadding: 18px 12px;\n\t\twhite-space: normal;\n\t\twidth: 176px;\n\t}\n\n\t.primary-navigation li:hover > a,\n\t.primary-navigation li.focus > a {\n\t\tbackground-color: #24890d;\n\t\tcolor: #fff;\n\t}\n\n\t.primary-navigation ul ul a:hover,\n\t.primary-navigation ul ul li.focus > a {\n\t\tbackground-color: #41a62a;\n\t}\n\n\t.primary-navigation ul li:hover > ul,\n\t.primary-navigation ul li.focus > ul {\n\t\tleft: auto;\n\t}\n\n\t.primary-navigation ul ul li:hover > ul,\n\t.primary-navigation ul ul li.focus > ul {\n\t\tleft: 100%;\n\t}\n\n\t.primary-navigation .menu-item-has-children > a,\n\t.primary-navigation .page_item_has_children > a {\n\t\tpadding-right: 26px;\n\t}\n\n\t.primary-navigation .menu-item-has-children > a:after,\n\t.primary-navigation .page_item_has_children > a:after {\n\t\t-webkit-font-smoothing: antialiased;\n\t\tcontent: \"\\f502\";\n\t\tdisplay: inline-block;\n\t\tfont: normal 8px/1 Genericons;\n\t\tposition: absolute;\n\t\tright: 12px;\n\t\ttop: 22px;\n\t\tvertical-align: text-bottom;\n\t}\n\n\t.primary-navigation li .menu-item-has-children > a,\n\t.primary-navigation li .page_item_has_children > a {\n\t\tpadding-right: 20px;\n\t\twidth: 168px;\n\t}\n\n\t.primary-navigation .menu-item-has-children li.menu-item-has-children > a:after,\n\t.primary-navigation .menu-item-has-children li.page_item_has_children > a:after,\n\t.primary-navigation .page_item_has_children li.menu-item-has-children > a:after,\n\t.primary-navigation .page_item_has_children li.page_item_has_children > a:after {\n\t\tcontent: \"\\f501\";\n\t\tright: 8px;\n\t\ttop: 20px;\n\t}\n}\n\n@media screen and (min-width: 810px) {\n\t.attachment .entry-attachment .attachment {\n\t\tmargin-right: -168px;\n\t\tmargin-left: -168px;\n\t\tmax-width: 810px;\n\t}\n\n\t.attachment .site-content .attachment img {\n\t\tdisplay: block;\n\t\tmargin: 0 auto;\n\t}\n\n\t.contributor-avatar {\n\t\tmargin-left: -168px;\n\t}\n\n\t.contributor-summary {\n\t\tfloat: left;\n\t}\n\n\t.full-width .site-content blockquote.alignleft,\n\t.full-width .site-content blockquote.alignright {\n\t\twidth: -webkit-calc(50% + 130px);\n\t\twidth:         calc(50% + 130px);\n\t}\n\n\t.full-width .site-content blockquote.alignleft,\n\t.full-width .site-content img.size-full.alignleft,\n\t.full-width .site-content img.size-large.alignleft,\n\t.full-width .site-content img.size-medium.alignleft,\n\t.full-width .site-content .wp-caption.alignleft {\n\t\tmargin-left: -168px;\n\t}\n\n\t.full-width .site-content .alignleft {\n\t\tclear: left;\n\t}\n\n\t.full-width .site-content blockquote.alignright,\n\t.full-width .site-content img.size-full.alignright,\n\t.full-width .site-content img.size-large.alignright,\n\t.full-width .site-content img.size-medium.alignright,\n\t.full-width .site-content .wp-caption.alignright {\n\t\tmargin-right: -168px;\n\t}\n\n\t.full-width .site-content .alignright {\n\t\tclear: right;\n\t}\n}\n\n@media screen and (min-width: 846px) {\n\t.content-area,\n\t.content-sidebar {\n\t\tpadding-top: 72px;\n\t}\n\n\t.site-content .has-post-thumbnail .entry-header {\n\t\tmargin-top: -48px;\n\t}\n\n\t.comment-list .trackback,\n\t.comment-list .pingback,\n\t.comment-list article {\n\t\tmargin-bottom: 36px;\n\t\tpadding-top: 36px;\n\t}\n\n\t.comment-author .avatar {\n\t\theight: 34px;\n\t\ttop: 2px;\n\t\twidth: 34px;\n\t}\n\n\t.comment-author,\n\t.comment-awaiting-moderation,\n\t.comment-content,\n\t.comment-list .reply,\n\t.comment-metadata {\n\t\tpadding-left: 50px;\n\t}\n\n\t.comment-list .children {\n\t\tmargin-left: 20px;\n\t}\n\n\t.full-width .site-content .hentry.has-post-thumbnail:first-child {\n\t\tmargin-top: -72px;\n\t}\n\n\t.featured-content {\n\t\tmargin-bottom: 0;\n\t}\n}\n\n@media screen and (min-width: 1008px) {\n\t.search-box-wrapper {\n\t\tpadding-left: 182px;\n\t}\n\n\t.main-content {\n\t\tfloat: left;\n\t}\n\n\t.site-content {\n\t\tmargin-right: 29.04761904%;\n\t\tmargin-left: 182px;\n\t}\n\n\t.site-content .entry-header {\n\t\tmargin-top: 0;\n\t}\n\n\t.site-content .has-post-thumbnail .entry-header {\n\t\tmargin-top: 0;\n\t}\n\n\t.content-sidebar {\n\t\tmargin-left: -29.04761904%;\n\t\twidth: 29.04761904%;\n\t}\n\n\t.site:before {\n\t\tbackground-color: #000;\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 100%;\n\t\tmin-height: 100%;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 182px;\n\t\tz-index: 2;\n\t}\n\n\t#secondary {\n\t\tbackground-color: transparent;\n\t\tborder: 0;\n\t\tclear: none;\n\t\tfloat: left;\n\t\tmargin: 0 0 0 -100%;\n\t\tmin-height: 100vh;\n\t\twidth: 122px;\n\t}\n\n\t.primary-sidebar {\n\t\tpadding-top: 0;\n\t}\n\n\t.site-description {\n\t\tdisplay: block;\n\t\tmargin: 0 0 18px;\n\t}\n\n\t.site-description:empty {\n\t\tmargin: 0;\n\t}\n\n\t.secondary-navigation {\n\t\tfont-size: 11px;\n\t\tmargin: 0 -30px 48px;\n\t\twidth: 182px;\n\t}\n\n\t.secondary-navigation li {\n\t\tborder-top: 1px solid rgba(255, 255, 255, 0.2);\n\t\tposition: relative;\n\t}\n\n\t.secondary-navigation a {\n\t\tpadding: 10px 30px;\n\t}\n\n\t.secondary-navigation ul ul {\n\t\tbackground-color: #24890d;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: -999em;\n\t\twidth: 182px;\n\t\tz-index: 99999;\n\t}\n\n\t.secondary-navigation li li {\n\t\tborder-top: 0;\n\t}\n\n\t.secondary-navigation li:hover > a,\n\t.secondary-navigation li.focus > a {\n\t\tbackground-color: #24890d;\n\t\tcolor: #fff;\n\t}\n\n\t.secondary-navigation ul ul a:hover,\n\t.secondary-navigation ul ul li.focus > a {\n\t\tbackground-color: #41a62a;\n\t}\n\n\t.secondary-navigation ul li:hover > ul,\n\t.secondary-navigation ul li.focus > ul {\n\t\tleft: 162px;\n\t}\n\n\t.secondary-navigation .menu-item-has-children > a {\n\t\tpadding-right: 38px;\n\t}\n\n\t.secondary-navigation .menu-item-has-children > a:after {\n\t\t-webkit-font-smoothing: antialiased;\n\t\tcontent: \"\\f501\";\n\t\tdisplay: inline-block;\n\t\tfont: normal 8px/1 Genericons;\n\t\tposition: absolute;\n\t\tright: 26px;\n\t\ttop: 14px;\n\t\tvertical-align: text-bottom;\n\t}\n\n\t.footer-sidebar .widget,\n\t.primary-sidebar .widget {\n\t\tfont-size: 12px;\n\t\tline-height: 1.5;\n\t}\n\n\t.footer-sidebar .widget {\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing:    border-box;\n\t\tbox-sizing:         border-box;\n\t\tfloat: left;\n\t\tpadding: 0 30px;\n\t\twidth: 25%;\n\t}\n\n\t.footer-sidebar .widget h1,\n\t.primary-sidebar .widget h1 {\n\t\tfont-size: 20px;\n\t\tline-height: 1.2;\n\t}\n\n\t.footer-sidebar .widget h2,\n\t.primary-sidebar .widget h2 {\n\t\tfont-size: 18px;\n\t\tline-height: 1.3333333333;\n\t}\n\n\t.footer-sidebar .widget h3,\n\t.primary-sidebar .widget h3 {\n\t\tfont-size: 16px;\n\t\tline-height: 1.5;\n\t}\n\n\t.footer-sidebar .widget h4,\n\t.primary-sidebar .widget h4 {\n\t\tfont-size: 14px;\n\t\tline-height: 1.7142857142;\n\t}\n\n\t.footer-sidebar .widget h5,\n\t.primary-sidebar .widget h5 {\n\t\tfont-size: 12px;\n\t\tline-height: 2;\n\t}\n\n\t.footer-sidebar .widget h6,\n\t.primary-sidebar .widget h6 {\n\t\tfont-size: 11px;\n\t\tline-height: 2.1818181818;\n\t}\n\n\t.footer-sidebar .widget code,\n\t.footer-sidebar .widget kbd,\n\t.footer-sidebar .widget tt,\n\t.footer-sidebar .widget var,\n\t.footer-sidebar .widget samp,\n\t.footer-sidebar .widget pre,\n\t.primary-sidebar .widget code,\n\t.primary-sidebar .widget kbd,\n\t.primary-sidebar .widget tt,\n\t.primary-sidebar .widget var,\n\t.primary-sidebar .widget samp,\n\t.primary-sidebar .widget pre {\n\t\tfont-size: 11px;\n\t\tline-height: 1.6363636363;\n\t}\n\n\t.footer-sidebar .widget blockquote,\n\t.primary-sidebar .widget blockquote {\n\t\tfont-size: 14px;\n\t\tline-height: 1.2857142857;\n\t}\n\n\t.footer-sidebar .widget blockquote cite,\n\t.primary-sidebar .widget blockquote cite {\n\t\tfont-size: 12px;\n\t\tline-height: 1.5;\n\t}\n\n\t.footer-sidebar .widget input,\n\t.footer-sidebar .widget textarea,\n\t.primary-sidebar .widget input,\n\t.primary-sidebar .widget textarea {\n\t\tfont-size: 12px;\n\t\tpadding: 3px 2px 4px 4px;\n\t}\n\n\t.footer-sidebar .widget input[type=\"button\"],\n\t.footer-sidebar .widget input[type=\"reset\"],\n\t.footer-sidebar .widget input[type=\"submit\"],\n\t.primary-sidebar .widget input[type=\"button\"],\n\t.primary-sidebar .widget input[type=\"reset\"],\n\t.primary-sidebar .widget input[type=\"submit\"] {\n\t\tpadding: 5px 15px 4px;\n\t}\n\n\t.footer-sidebar .widget .widget-title,\n\t.primary-sidebar .widget .widget-title {\n\t\tfont-size: 11px;\n\t\tfont-weight: 900;\n\t\tline-height: 1.6363636363;\n\t\tmargin-bottom: 18px;\n\t}\n\n\t.footer-sidebar .widget_twentyfourteen_ephemera .entry-title,\n\t.footer-sidebar .widget_twentyfourteen_ephemera .entry-meta,\n\t.footer-sidebar .widget_twentyfourteen_ephemera .wp-caption-text,\n\t.footer-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link,\n\t.footer-sidebar .widget_twentyfourteen_ephemera .entry-content table,\n\t.primary-sidebar .widget_twentyfourteen_ephemera .entry-title,\n\t.primary-sidebar .widget_twentyfourteen_ephemera .entry-meta,\n\t.primary-sidebar .widget_twentyfourteen_ephemera .wp-caption-text,\n\t.primary-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link,\n\t.primary-sidebar .widget_twentyfourteen_ephemera .entry-content table {\n\t\tfont-size: 11px;\n\t\tline-height: 1.6363636363;\n\t}\n\n\t.footer-sidebar .widget_archive li,\n\t.footer-sidebar .widget_categories li,\n\t.footer-sidebar .widget_links li,\n\t.footer-sidebar .widget_meta li,\n\t.footer-sidebar .widget_nav_menu li,\n\t.footer-sidebar .widget_pages li,\n\t.footer-sidebar .widget_recent_comments li,\n\t.footer-sidebar .widget_recent_entries li,\n\t.primary-sidebar .widget_archive li,\n\t.primary-sidebar .widget_categories li,\n\t.primary-sidebar .widget_links li,\n\t.primary-sidebar .widget_meta li,\n\t.primary-sidebar .widget_nav_menu li,\n\t.primary-sidebar .widget_pages li,\n\t.primary-sidebar .widget_recent_comments li,\n\t.primary-sidebar .widget_recent_entries li {\n\t\tborder-top: 0;\n\t\tpadding: 0 0 6px;\n\t}\n\n\t.footer-sidebar .widget_archive li:last-child,\n\t.footer-sidebar .widget_categories li:last-child,\n\t.footer-sidebar .widget_links li:last-child,\n\t.footer-sidebar .widget_meta li:last-child,\n\t.footer-sidebar .widget_nav_menu li:last-child,\n\t.footer-sidebar .widget_pages li:last-child,\n\t.footer-sidebar .widget_recent_comments li:last-child,\n\t.footer-sidebar .widget_recent_entries li:last-child,\n\t.primary-sidebar .widget_archive li:last-child,\n\t.primary-sidebar .widget_categories li:last-child,\n\t.primary-sidebar .widget_links li:last-child,\n\t.primary-sidebar .widget_meta li:last-child,\n\t.primary-sidebar .widget_nav_menu li:last-child,\n\t.primary-sidebar .widget_pages li:last-child,\n\t.primary-sidebar .widget_recent_comments li:last-child,\n\t.primary-sidebar .widget_recent_entries li:last-child {\n\t\tpadding: 0;\n\t}\n\n\t.footer-sidebar .widget_categories li ul,\n\t.footer-sidebar .widget_nav_menu li ul,\n\t.footer-sidebar .widget_pages li ul,\n\t.primary-sidebar .widget_categories li ul,\n\t.primary-sidebar .widget_nav_menu li ul,\n\t.primary-sidebar .widget_pages li ul {\n\t\tborder-top: 0;\n\t\tmargin-top: 6px;\n\t}\n\n\t#supplementary {\n\t\tpadding: 0;\n\t}\n\n\t.footer-sidebar {\n\t\tfont-size: 12px;\n\t\tline-height: 1.5;\n\t}\n\n\t.featured-content {\n\t\tpadding-left: 182px;\n\t}\n\n\t.grid .featured-content .hentry {\n\t\twidth: 33.3333333%;\n\t}\n\n\t.grid .featured-content .hentry:nth-child( 2n+1 ) {\n\t\tclear: none;\n\t}\n\n\t.grid .featured-content .hentry:nth-child( 3n+1 ) {\n\t\tclear: both;\n\t}\n\n\t.grid .featured-content .entry-header {\n\t\theight: 120px;\n\t}\n}\n\n@media screen and (min-width: 1040px) {\n\t.site-content .has-post-thumbnail .entry-header {\n\t\tmargin-top: -48px;\n\t}\n\n\t.archive-header,\n\t.comments-area,\n\t.image-navigation,\n\t.page-header,\n\t.page-content,\n\t.post-navigation,\n\t.site-content .entry-header,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content footer.entry-meta {\n\t\tpadding-right: 15px;\n\t\tpadding-left: 15px;\n\t}\n\n\t.full-width .archive-header,\n\t.full-width .comments-area,\n\t.full-width .image-navigation,\n\t.full-width .page-header,\n\t.full-width .page-content,\n\t.full-width .post-navigation,\n\t.full-width .site-content .entry-header,\n\t.full-width .site-content .entry-content,\n\t.full-width .site-content .entry-summary,\n\t.full-width .site-content footer.entry-meta {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 30px;\n\t}\n}\n\n@media screen and (min-width: 1080px) {\n\t.search-box .search-field {\n\t\twidth: 324px;\n\t}\n\n\t.site-content,\n\t.site-main .widecolumn {\n\t\tmargin-left: 222px;\n\t}\n\n\t.site:before {\n\t\twidth: 222px;\n\t}\n\n\t.search-box-wrapper,\n\t.featured-content {\n\t\tpadding-left: 222px;\n\t}\n\n\t#secondary {\n\t\twidth: 162px;\n\t}\n\n\t.secondary-navigation,\n\t.secondary-navigation ul ul {\n\t\twidth: 222px;\n\t}\n\n\t.secondary-navigation ul li:hover > ul,\n\t.secondary-navigation ul li.focus > ul {\n\t\tleft: 202px;\n\t}\n\n\t.slider .featured-content .entry-title {\n\t\tfont-size: 33px;\n\t}\n\n\t.slider .featured-content .entry-header,\n\t.slider-control-paging {\n\t\twidth: 534px;\n\t}\n\n\t.slider-control-paging {\n\t\tpadding-left: 24px;\n\t}\n\n\t.slider-control-paging li {\n\t\tmargin: 12px 12px 12px 0;\n\t}\n\n\t.slider-control-paging a {\n\t\theight: 24px;\n\t\twidth: 24px;\n\t}\n\n\t.slider-control-paging a:before {\n\t\ttop: 6px;\n\t\tleft: 6px;\n\t}\n}\n\n@media screen and (min-width: 1110px) {\n\t.archive-header,\n\t.comments-area,\n\t.image-navigation,\n\t.page-header,\n\t.page-content,\n\t.post-navigation,\n\t.site-content .entry-header,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content footer.entry-meta {\n\t\tpadding-right: 30px;\n\t\tpadding-left: 30px;\n\t}\n}\n\n@media screen and (min-width: 1218px) {\n\t.archive-header,\n\t.comments-area,\n\t.image-navigation,\n\t.page-header,\n\t.page-content,\n\t.post-navigation,\n\t.site-content .entry-header,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content footer.entry-meta {\n\t\tmargin-right: 54px;\n\t}\n\n\t.full-width .archive-header,\n\t.full-width .comments-area,\n\t.full-width .image-navigation,\n\t.full-width .page-header,\n\t.full-width .page-content,\n\t.full-width .post-navigation,\n\t.full-width .site-content .entry-header,\n\t.full-width .site-content .entry-content,\n\t.full-width .site-content .entry-summary,\n\t.full-width .site-content footer.entry-meta {\n\t\tmargin-right: auto;\n\t}\n}\n\n@media screen and (min-width: 1260px) {\n\t.site-content blockquote.alignleft,\n\t.site-content blockquote.alignright {\n\t\twidth: -webkit-calc(50% + 18px);\n\t\twidth:         calc(50% + 18px);\n\t}\n\n\t.site-content blockquote.alignleft {\n\t\tmargin-left: -18%;\n\t}\n\n\t.site-content blockquote.alignright {\n\t\tmargin-right: -18%;\n\t}\n}\n\n\n/**\n * 12.0 Print\n * -----------------------------------------------------------------------------\n */\n\n@media print {\n\tbody {\n\t\tbackground: none !important; /* Brute force since user agents all print differently. */\n\t\tcolor: #2b2b2b;\n\t\tfont-size: 12pt;\n\t}\n\n\t.site,\n\t.site-header,\n\t.hentry,\n\t.site-content .entry-header,\n\t.site-content .entry-content,\n\t.site-content .entry-summary,\n\t.site-content .entry-meta,\n\t.page-content,\n\t.archive-header,\n\t.page-header,\n\t.contributor-info,\n\t.comments-area,\n\t.attachment .entry-attachment .attachment {\n\t\tmax-width: 100%;\n\t}\n\n\t#site-header img,\n\t.search-toggle,\n\t.site-navigation,\n\t.site-content nav,\n\t.edit-link,\n\t.page-links,\n\t.widget-area,\n\t.more-link,\n\t.post-format-archive-link,\n\t.comment-respond,\n\t.comment-list .reply,\n\t.comment-reply-login,\n\t#secondary,\n\t.site-footer,\n\t.slider-control-paging,\n\t.slider-direction-nav {\n\t\tdisplay: none;\n\t}\n\n\t.site-title a,\n\t.entry-meta,\n\t.entry-meta a,\n\t.featured-content .hentry,\n\t.featured-content a {\n\t\tcolor: #2b2b2b;\n\t}\n\n\t.entry-content a,\n\t.entry-summary a,\n\t.page-content a,\n\t.comment-content a {\n\t\ttext-decoration: none;\n\t}\n\n\t.site-header,\n\t.post-thumbnail,\n\ta.post-thumbnail:hover,\n\t.site-content .entry-header,\n\t.site-footer,\n\t.featured-content,\n\t.featured-content .entry-header {\n\t\tbackground: transparent;\n\t}\n\n\t.header-main {\n\t\tpadding: 48px 10px;\n\t}\n\n\t.site-title {\n\t\tfloat: none;\n\t\tfont-size: 19pt;\n\t}\n\n\t.content-area {\n\t\tpadding-top: 0;\n\t}\n\n\t.list-view .site-content .hentry {\n\t\tborder-bottom: 1px solid rgba(0, 0, 0, 0.1);\n\t\tmargin-bottom: 48px;\n\t\tpadding-bottom: 24px;\n\t}\n\n\t.post-thumbnail img {\n\t\tmargin: 0 10px 24px;\n\t}\n\n\t.site-content .has-post-thumbnail .entry-header {\n\t\tpadding-top: 0;\n\t}\n\n\t.site-content footer.entry-meta {\n\t\tmargin: 24px auto;\n\t}\n\n\t.entry-meta .tag-links a {\n\t\tcolor: #fff;\n\t}\n\n\t.singular .site-content .hentry.has-post-thumbnail {\n\t\tmargin-top: 0;\n\t}\n\n\t.gallery-columns-1.gallery-size-medium,\n\t.gallery-columns-1.gallery-size-thumbnail,\n\t.gallery-columns-2.gallery-size-thumbnail,\n\t.gallery-columns-3.gallery-size-thumbnail {\n\t\tdisplay: block;\n\t}\n\n\t.archive-title,\n\t.page-title {\n\t\tmargin: 0 10px 48px;\n\t}\n\n\t.featured-content .hentry {\n\t\tmargin-bottom: 48px;\n\t}\n\n\t.featured-content .post-thumbnail,\n\t.slider .featured-content .post-thumbnail {\n\t\tpadding-top: 0;\n\t}\n\n\t.featured-content .post-thumbnail img {\n\t\tposition: relative;\n\t}\n\n\t.featured-content .entry-header {\n\t\tpadding: 0 10px 24px;\n\t}\n\n\t.featured-content .entry-meta {\n\t\tfont-size: 9pt;\n\t\tmargin-bottom: 11px;\n\t}\n\n\t.featured-content .cat-links {\n\t\tfont-weight: 900;\n\t}\n\n\t.featured-content .entry-title {\n\t\tfont-size: 25pt;\n\t\tline-height: 36px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/tag.php",
    "content": "<?php\n/**\n * The template for displaying Tag pages\n *\n * Used to display archive-type pages for posts in a tag.\n *\n * @link https://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"archive-header\">\n\t\t\t\t<h1 class=\"archive-title\"><?php printf( __( 'Tag Archives: %s', 'twentyfourteen' ), single_tag_title( '', false ) ); ?></h1>\n\n\t\t\t\t<?php\n\t\t\t\t\t// Show an optional term description.\n\t\t\t\t\t$term_description = term_description();\n\t\t\t\t\tif ( ! empty( $term_description ) ) :\n\t\t\t\t\t\tprintf( '<div class=\"taxonomy-description\">%s</div>', $term_description );\n\t\t\t\t\tendif;\n\t\t\t\t?>\n\t\t\t</header><!-- .archive-header -->\n\n\t\t\t<?php\n\t\t\t\t\t// Start the Loop.\n\t\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t\t\tendwhile;\n\t\t\t\t\t// Previous/next page navigation.\n\t\t\t\t\ttwentyfourteen_paging_nav();\n\n\t\t\t\telse :\n\t\t\t\t\t// If no content, include the \"No posts found\" template.\n\t\t\t\t\tget_template_part( 'content', 'none' );\n\n\t\t\t\tendif;\n\t\t\t?>\n\t\t</div><!-- #content -->\n\t</section><!-- #primary -->\n\n<?php\nget_sidebar( 'content' );\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentyfourteen/taxonomy-post_format.php",
    "content": "<?php\n/**\n * The template for displaying Post Format pages\n *\n * Used to display archive-type pages for posts with a post format.\n * If you'd like to further customize these Post Format views, you may create a\n * new template file for each specific one.\n *\n * @todo https://core.trac.wordpress.org/ticket/23257: Add plural versions of Post Format strings\n * and remove plurals below.\n *\n * @link https://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Fourteen\n * @since Twenty Fourteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<div id=\"content\" class=\"site-content\" role=\"main\">\n\n\t\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"archive-header\">\n\t\t\t\t<h1 class=\"archive-title\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\tif ( is_tax( 'post_format', 'post-format-aside' ) ) :\n\t\t\t\t\t\t\t_e( 'Asides', 'twentyfourteen' );\n\n\t\t\t\t\t\telseif ( is_tax( 'post_format', 'post-format-image' ) ) :\n\t\t\t\t\t\t\t_e( 'Images', 'twentyfourteen' );\n\n\t\t\t\t\t\telseif ( is_tax( 'post_format', 'post-format-video' ) ) :\n\t\t\t\t\t\t\t_e( 'Videos', 'twentyfourteen' );\n\n\t\t\t\t\t\telseif ( is_tax( 'post_format', 'post-format-audio' ) ) :\n\t\t\t\t\t\t\t_e( 'Audio', 'twentyfourteen' );\n\n\t\t\t\t\t\telseif ( is_tax( 'post_format', 'post-format-quote' ) ) :\n\t\t\t\t\t\t\t_e( 'Quotes', 'twentyfourteen' );\n\n\t\t\t\t\t\telseif ( is_tax( 'post_format', 'post-format-link' ) ) :\n\t\t\t\t\t\t\t_e( 'Links', 'twentyfourteen' );\n\n\t\t\t\t\t\telseif ( is_tax( 'post_format', 'post-format-gallery' ) ) :\n\t\t\t\t\t\t\t_e( 'Galleries', 'twentyfourteen' );\n\n\t\t\t\t\t\telse :\n\t\t\t\t\t\t\t_e( 'Archives', 'twentyfourteen' );\n\n\t\t\t\t\t\tendif;\n\t\t\t\t\t?>\n\t\t\t\t</h1>\n\t\t\t</header><!-- .archive-header -->\n\n\t\t\t<?php\n\t\t\t\t\t// Start the Loop.\n\t\t\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Include the post format-specific template for the content. If you want to\n\t\t\t\t\t\t * use this in a child theme, then include a file called called content-___.php\n\t\t\t\t\t\t * (where ___ is the post format) and that will be used instead.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tget_template_part( 'content', get_post_format() );\n\n\t\t\t\t\tendwhile;\n\t\t\t\t\t// Previous/next page navigation.\n\t\t\t\t\ttwentyfourteen_paging_nav();\n\n\t\t\t\telse :\n\t\t\t\t\t// If no content, include the \"No posts found\" template.\n\t\t\t\t\tget_template_part( 'content', 'none' );\n\n\t\t\t\tendif;\n\t\t\t?>\n\t\t</div><!-- #content -->\n\t</section><!-- #primary -->\n\n<?php\nget_sidebar( 'content' );\nget_sidebar();\nget_footer();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/404.php",
    "content": "<?php\n/**\n * The template for displaying 404 pages (not found)\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t\t<section class=\"error-404 not-found\">\n\t\t\t\t<header class=\"page-header\">\n\t\t\t\t\t<h1 class=\"page-title\"><?php _e( 'Oops! That page can&rsquo;t be found.', 'twentysixteen' ); ?></h1>\n\t\t\t\t</header><!-- .page-header -->\n\n\t\t\t\t<div class=\"page-content\">\n\t\t\t\t\t<p><?php _e( 'It looks like nothing was found at this location. Maybe try a search?', 'twentysixteen' ); ?></p>\n\n\t\t\t\t\t<?php get_search_form(); ?>\n\t\t\t\t</div><!-- .page-content -->\n\t\t\t</section><!-- .error-404 -->\n\n\t\t</main><!-- .site-main -->\n\n\t\t<?php get_sidebar( 'content-bottom' ); ?>\n\n\t</div><!-- .content-area -->\n\n<?php get_sidebar(); ?>\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/archive.php",
    "content": "<?php\n/**\n * The template for displaying archive pages\n *\n * Used to display archive-type pages if nothing more specific matches a query.\n * For example, puts together date-based pages if no date.php file exists.\n *\n * If you'd like to further customize these archive views, you may create a\n * new template file for each one. For example, tag.php (Tag archives),\n * category.php (Category archives), author.php (Author archives), etc.\n *\n * @link https://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"page-header\">\n\t\t\t\t<?php\n\t\t\t\t\tthe_archive_title( '<h1 class=\"page-title\">', '</h1>' );\n\t\t\t\t\tthe_archive_description( '<div class=\"taxonomy-description\">', '</div>' );\n\t\t\t\t?>\n\t\t\t</header><!-- .page-header -->\n\n\t\t\t<?php\n\t\t\t// Start the Loop.\n\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t/*\n\t\t\t\t * Include the Post-Format-specific template for the content.\n\t\t\t\t * If you want to override this in a child theme, then include a file\n\t\t\t\t * called content-___.php (where ___ is the Post Format name) and that will be used instead.\n\t\t\t\t */\n\t\t\t\tget_template_part( 'template-parts/content', get_post_format() );\n\n\t\t\t// End the loop.\n\t\t\tendwhile;\n\n\t\t\t// Previous/next page navigation.\n\t\t\tthe_posts_pagination( array(\n\t\t\t\t'prev_text'          => __( 'Previous page', 'twentysixteen' ),\n\t\t\t\t'next_text'          => __( 'Next page', 'twentysixteen' ),\n\t\t\t\t'before_page_number' => '<span class=\"meta-nav screen-reader-text\">' . __( 'Page', 'twentysixteen' ) . ' </span>',\n\t\t\t) );\n\n\t\t// If no content, include the \"No posts found\" template.\n\t\telse :\n\t\t\tget_template_part( 'template-parts/content', 'none' );\n\n\t\tendif;\n\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</div><!-- .content-area -->\n\n<?php get_sidebar(); ?>\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/comments.php",
    "content": "<?php\n/**\n * The template for displaying comments\n *\n * The area of the page that contains both current comments\n * and the comment form.\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\n/*\n * If the current post is protected by a password and\n * the visitor has not yet entered the password we will\n * return early without loading the comments.\n */\nif ( post_password_required() ) {\n\treturn;\n}\n?>\n\n<div id=\"comments\" class=\"comments-area\">\n\n\t<?php if ( have_comments() ) : ?>\n\t\t<h2 class=\"comments-title\">\n\t\t\t<?php\n\t\t\t\t$comments_number = get_comments_number();\n\t\t\t\tif ( 1 === $comments_number ) {\n\t\t\t\t\t/* translators: %s: post title */\n\t\t\t\t\tprintf( _x( 'One thought on &ldquo;%s&rdquo;', 'comments title', 'twentysixteen' ), get_the_title() );\n\t\t\t\t} else {\n\t\t\t\t\tprintf(\n\t\t\t\t\t\t/* translators: 1: number of comments, 2: post title */\n\t\t\t\t\t\t_nx(\n\t\t\t\t\t\t\t'%1$s thought on &ldquo;%2$s&rdquo;',\n\t\t\t\t\t\t\t'%1$s thoughts on &ldquo;%2$s&rdquo;',\n\t\t\t\t\t\t\t$comments_number,\n\t\t\t\t\t\t\t'comments title',\n\t\t\t\t\t\t\t'twentysixteen'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tnumber_format_i18n( $comments_number ),\n\t\t\t\t\t\tget_the_title()\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t?>\n\t\t</h2>\n\n\t\t<?php the_comments_navigation(); ?>\n\n\t\t<ol class=\"comment-list\">\n\t\t\t<?php\n\t\t\t\twp_list_comments( array(\n\t\t\t\t\t'style'       => 'ol',\n\t\t\t\t\t'short_ping'  => true,\n\t\t\t\t\t'avatar_size' => 42,\n\t\t\t\t) );\n\t\t\t?>\n\t\t</ol><!-- .comment-list -->\n\n\t\t<?php the_comments_navigation(); ?>\n\n\t<?php endif; // Check for have_comments(). ?>\n\n\t<?php\n\t\t// If comments are closed and there are comments, let's leave a little note, shall we?\n\t\tif ( ! comments_open() && get_comments_number() && post_type_supports( get_post_type(), 'comments' ) ) :\n\t?>\n\t\t<p class=\"no-comments\"><?php _e( 'Comments are closed.', 'twentysixteen' ); ?></p>\n\t<?php endif; ?>\n\n\t<?php\n\t\tcomment_form( array(\n\t\t\t'title_reply_before' => '<h2 id=\"reply-title\" class=\"comment-reply-title\">',\n\t\t\t'title_reply_after'  => '</h2>',\n\t\t) );\n\t?>\n\n</div><!-- .comments-area -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/css/editor-style.css",
    "content": "/*\nTheme Name: Twenty Sixteen\nDescription: Used to style the TinyMCE editor.\n*/\n\n\n/**\n * Table of Contents:\n *\n * 1.0 - Body\n * 2.0 - Typography\n * 3.0 - Elements\n * 4.0 - Alignment\n * 5.0 - Caption\n * 6.0 - Galleries\n * 7.0 - Audio / Video\n * 8.0 - RTL\n */\n\n\n/**\n * 1.0 - Body\n */\n\nbody {\n\tcolor: #1a1a1a;\n\tfont-family: Merriweather, Georgia, serif;\n\tfont-size: 16px;\n\tfont-weight: 400;\n\tline-height: 1.75;\n\tmargin: 20px 40px;\n\tmax-width: 600px;\n\tvertical-align: baseline;\n}\n\nbody.post-type-page {\n\tmax-width: 840px;\n}\n\n\n/**\n * 2.0 - Typography\n */\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tclear: both;\n\tfont-weight: 900;\n\tmargin: 56px 0 28px;\n}\n\nh1 {\n\tfont-size: 33px;\n\tline-height: 1.2727272727;\n}\n\nh2 {\n\tfont-size: 28px;\n\tline-height: 1.25;\n}\n\nh3 {\n\tfont-size: 23px;\n\tline-height: 1.2173913043;\n}\n\nh4,\nh5,\nh6 {\n\tfont-size: 19px;\n\tline-height: 1.1052631579;\n}\n\nh4 {\n\tletter-spacing: 0.13333em;\n\ttext-transform: uppercase;\n}\n\nh6 {\n\tfont-style: italic;\n}\n\nh1:first-child,\nh2:first-child,\nh3:first-child,\nh4:first-child,\nh5:first-child,\nh6:first-child {\n\tmargin-top: 0;\n}\n\np {\n\tmargin: 0 0 28px;\n}\n\nb,\nstrong {\n\tfont-weight: 700;\n}\n\ndfn,\ncite,\nem,\ni {\n\tfont-style: italic;\n}\n\nblockquote {\n\tborder-left: 4px solid #1a1a1a;\n\tcolor: #686868;\n\tfont-size: 19px;\n\tfont-style: italic;\n\tline-height: 1.4736842105;\n\tmargin-bottom: 28px;\n\tpadding: 0 0 0 24px;\n}\n\nblockquote:not(.alignleft):not(.alignright) {\n\tmargin-left: -28px;\n}\n\nblockquote blockquote:not(.alignleft):not(.alignright) {\n\tmargin-left: 0;\n}\n\nblockquote:before,\nblockquote:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\nblockquote:after {\n\tclear: both;\n}\n\nblockquote > :last-child {\n\tmargin-bottom: 0;\n}\n\nblockquote cite,\nblockquote small {\n\tcolor: #1a1a1a;\n\tfont-size: 16px;\n\tline-height: 1.75;\n}\n\nblockquote em,\nblockquote i,\nblockquote cite {\n\tfont-style: normal;\n}\n\nblockquote strong,\nblockquote b {\n\tfont-weight: 400;\n}\n\nblockquote.alignleft,\nblockquote.alignright {\n\tborder: 0 solid #1a1a1a;\n\tborder-top-width: 4px;\n\tpadding: 18px 0 0;\n\twidth: -webkit-calc(50% - 14px);\n\twidth: calc(50% - 14px);\n}\n\naddress {\n\tfont-style: italic;\n\tmargin: 0 0 28px;\n}\n\ncode,\nkbd,\ntt,\nvar,\nsamp,\npre {\n\tfont-family: Inconsolata, monospace;\n}\n\npre {\n\tborder: 1px solid #d1d1d1;\n\tfont-size: 16px;\n\tline-height: 1.3125;\n\tmargin: 0 0 28px;\n\tmax-width: 100%;\n\toverflow: auto;\n\tpadding: 14px;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\ncode {\n\tbackground-color: #d1d1d1;\n\tpadding: 2px 4px;\n}\n\nabbr[title] {\n\tborder-bottom: 1px dotted #d1d1d1;\n\tcursor: help;\n}\n\nmark,\nins {\n\tbackground: #007acc;\n\tcolor: #fff;\n\tpadding: 2px 4px;\n\ttext-decoration: none;\n}\n\nsup,\nsub {\n\tfont-size: 75%;\n\theight: 0;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\ttop: -6px;\n}\n\nsup {\n\tbottom: -3px;\n}\n\nsmall {\n\tfont-size: 80%;\n}\n\nbig {\n\tfont-size: 125%;\n}\n\n\n/**\n * 3.0 - Elements\n */\n\nhr {\n\tbackground-color: #d1d1d1;\n\tborder: 0;\n\theight: 1px;\n\tmargin-bottom: 28px;\n}\n\nul,\nol {\n\tmargin: 0 0 28px 0;\n\tpadding: 0;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n}\n\nli > ul,\nli > ol {\n\tmargin-bottom: 0;\n}\n\nli > ul,\nblockquote > ul {\n\tmargin-left: 20px;\n}\n\nli > ol,\nblockquote > ol {\n\tmargin-left: 24px;\n}\n\ndl {\n\tmargin: 0 0 28px;\n}\n\ndt {\n\tfont-weight: bold;\n}\n\ndd {\n\tmargin: 0 0 28px;\n}\n\ntable,\nth,\ntd,\n.mce-item-table,\n.mce-item-table th,\n.mce-item-table td {\n\tborder: 1px solid #d1d1d1;\n}\n\ntable a {\n\tcolor: #007acc;\n}\n\ntable,\n.mce-item-table {\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n\tborder-width: 1px 0 0 1px;\n\tmargin: 0 0 28px;\n\twidth: 100%;\n}\n\ntable th,\n.mce-item-table th,\ntable caption {\n\tborder-width: 0 1px 1px 0;\n\tfont-size: 16px;\n\tfont-weight: 700;\n\tpadding: 7px;\n\ttext-align: left;\n\tvertical-align: baseline;\n}\n\ntable td,\n.mce-item-table td {\n\tborder-width: 0 1px 1px 0;\n\tfont-size: 16px;\n\tpadding: 7px;\n\tvertical-align: baseline;\n}\n\nimg {\n\tborder: 0;\n\theight: auto;\n\tmax-width: 100%;\n\tvertical-align: middle;\n}\n\na img {\n\tdisplay: block;\n}\n\nfigure {\n\tmargin: 0;\n}\n\ndel {\n\topacity: 0.8;\n}\n\na {\n\tbox-shadow: 0 1px 0 0 currentColor;\n\tcolor: #007acc;\n\ttext-decoration: none;\n}\n\nfieldset {\n\tborder: 1px solid #d1d1d1;\n\tmargin: 0 0 28px;\n\tpadding: 14px;\n}\n\n\n/**\n * 4.0 - Alignment\n */\n\n.alignleft {\n\tfloat: left;\n\tmargin: 6px 28px 28px 0;\n}\n\n.alignright {\n\tfloat: right;\n\tmargin: 6px 0 28px 28px;\n}\n\n.aligncenter {\n\tclear: both;\n\tdisplay: block;\n\tmargin: 0 auto 28px;\n}\n\n\n/**\n * 5.0 - Caption\n */\n\n.wp-caption {\n\tbackground: transparent;\n\tborder: none;\n\tmargin-bottom: 28px;\n\tmax-width: 100%;\n\tpadding: 0;\n\ttext-align: inherit;\n}\n\n.wp-caption-text,\n.wp-caption-dd {\n\tcolor: #686868;\n\tfont-size: 13px;\n\tfont-style: italic;\n\tline-height: 1.6153846154;\n\tpadding-top: 7px;\n}\n\n\n/**\n * 6.0 - Galleries\n */\n\n.mce-content-body .wpview-wrap {\n\tmargin-bottom: 28px;\n}\n\n.gallery {\n\tmargin: 0 -1.1666667%;\n\tpadding: 0;\n}\n\n.gallery .gallery-item {\n\tdisplay: inline-block;\n\tmax-width: 33.33%;\n\tpadding: 0 1.1400652% 2.2801304%;\n\ttext-align: center;\n\tvertical-align: top;\n\twidth: 100%;\n}\n\n.gallery-columns-1 .gallery-item {\n\tmax-width: 100%;\n}\n\n.gallery-columns-2 .gallery-item {\n\tmax-width: 50%;\n}\n\n.gallery-columns-4 .gallery-item {\n\tmax-width: 25%;\n}\n\n.gallery-columns-5 .gallery-item {\n\tmax-width: 20%;\n}\n\n.gallery-columns-6 .gallery-item {\n\tmax-width: 16.66%;\n}\n\n.gallery-columns-7 .gallery-item {\n\tmax-width: 14.28%;\n}\n\n.gallery-columns-8 .gallery-item {\n\tmax-width: 12.5%;\n}\n\n.gallery-columns-9 .gallery-item {\n\tmax-width: 11.11%;\n}\n\n.gallery .gallery-caption {\n\tfont-size: 13px;\n\tmargin: 0;\n}\n\n.gallery-columns-6 .gallery-caption,\n.gallery-columns-7 .gallery-caption,\n.gallery-columns-8 .gallery-caption,\n.gallery-columns-9 .gallery-caption {\n\tdisplay: none;\n}\n\n\n/**\n * 7.0 - Audio / Video\n */\n\n.wp-audio-shortcode a,\n.wp-playlist a {\n\tbox-shadow: none;\n}\n\n.mce-content-body .wp-audio-playlist {\n\tmargin: 0;\n\tpadding-bottom: 0;\n}\n\n.mce-content-body .wp-playlist-tracks {\n\tmargin-top: 0;\n}\n\n.mce-content-body  .wp-playlist-item {\n\tpadding: 10px 0;\n}\n\n.mce-content-body .wp-playlist-item-length {\n\ttop: 10px;\n}\n\n\n/**\n * 8.0 - RTL\n */\n\n.rtl blockquote {\n\tborder: 0 solid #1a1a1a;\n\tborder-right-width: 4px;\n}\n\n.rtl blockquote.alignleft,\n.rtl blockquote.alignright {\n\tborder: 0 solid #1a1a1a;\n\tborder-top-width: 4px;\n}\n\n.rtl blockquote:not(.alignleft):not(.alignright) {\n\tmargin-right: -28px;\n\tpadding: 0 24px 0 0;\n}\n\n.rtl blockquote blockquote:not(.alignleft):not(.alignright) {\n\tmargin-right: 0;\n\tmargin-left: auto;\n}\n\n.rtl li > ul,\n.rtl blockquote > ul {\n\tmargin-right: 20px;\n\tmargin-left: auto;\n}\n\n.rtl li > ol,\n.rtl blockquote > ol {\n\tmargin-right: 24px;\n\tmargin-left: auto;\n}\n\n.rtl table th,\n.rtl .mce-item-table th,\n.rtl table caption {\n\ttext-align: right;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/css/ie.css",
    "content": "/*\nTheme Name: Twenty Sixteen\nDescription: Global Styles for older IE versions (previous to IE10).\n*/\n\n.site-header-main:before,\n.site-header-main:after,\n.site-footer:before,\n.site-footer:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.site-header-main:after,\n.site-footer:after {\n\tclear: both;\n}\n\n@media screen and (min-width: 56.875em) {\n\t.site-branding,\n\t.site-info {\n\t\tfloat: left;\n\t}\n\n\t.site-header-menu,\n\t.site-footer .social-navigation {\n\t\tfloat: right;\n\t}\n\n\t.site-footer .social-navigation {\n\t\tmargin-left: 7px;\n\t}\n\n\t.rtl .site-branding,\n\t.rtl .site-info {\n\t\tfloat: right;\n\t}\n\n\t.rtl .site-header-menu,\n\t.rtl .site-footer .social-navigation {\n\t\tfloat: left;\n\t}\n\n\t.rtl .site-footer .social-navigation {\n\t\tmargin-right: 7px;\n\t\tmargin-left: 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/css/ie7.css",
    "content": "/*\nTheme Name: Twenty Sixteen\nDescription: IE7 specific style.\n*/\n\n.site-inner {\n\tmax-width: 656px;\n}\n\n.post-navigation,\n.pagination,\n.image-navigation,\n.entry-header,\n.entry-summary,\n.entry-content,\n.entry-footer,\n.page-header,\n.page-content,\n.post-thumbnail,\n.content-bottom-widgets,\n.comments-area {\n\tmargin-right: 28px;\n\tmargin-left: 28px;\n\tmax-width: 100%;\n}\n\n.site-header,\n.sidebar,\n.site-footer,\n.widecolumn {\n\tpadding-right: 28px;\n\tpadding-left: 28px;\n}\n\n.search-submit {\n\theight: auto;\n\tmargin-top: 28px;\n\tpadding: 15px 0 8px;\n\tposition: relative;\n\twidth: auto;\n}\n\n.search-submit .screen-reader-text {\n\theight: auto;\n\tposition: relative !important;\n\twidth: auto;\n}\n\n.image-navigation .nav-previous,\n.image-navigation .nav-next,\n.comment-navigation .nav-previous,\n.comment-navigation .nav-next {\n\t*display: inline;\n\tzoom: 1;\n}\n\n.image-navigation .nav-previous + .nav-next,\n.comment-navigation .nav-previous + .nav-next {\n\tmargin-left: 14px;\n}\n\n.pagination .nav-links {\n\tpadding: 0;\n}\n\n.pagination .page-numbers {\n\tline-height: 1;\n\tmargin: -4px 14px 0;\n\tpadding: 18px 0;\n}\n\n.pagination .prev,\n.pagination .next {\n\tdisplay: inline-block;\n\tfont-size: 16px;\n\tfont-weight: 700;\n\theight: auto;\n\tleft: 0;\n\tline-height: 1;\n\tmargin: 0;\n\tpadding: 18px 14px;\n\tposition: relative;\n\tright: 0;\n\ttext-transform: none;\n\twidth: auto;\n}\n\n.dropdown-toggle {\n\tdisplay: none;\n}\n\n.main-navigation ul ul {\n\tdisplay: block;\n}\n\n.social-navigation {\n\tmargin-top: 1.75em;\n}\n\n.social-navigation a {\n\theight: auto;\n\tpadding: 3px 7px;\n\twidth: auto;\n}\n\n.social-navigation .screen-reader-text {\n\theight: auto;\n\tposition: relative !important;\n\twidth: auto;\n}\n\n.site-header-main {\n\toverflow : hidden;\n\tzoom : 1;\n}\n\n.entry-footer > span {\n\tmargin-right: 14px;\n}\n\n.site-info .site-title {\n\tfont-size: 13px;\n\tmargin-right: 14px;\n}\n\n.gallery-item {\n\tmax-width: 30%;\n}\n\n.gallery-columns-1 .gallery-item {\n\tmax-width: 100%;\n}\n\n.gallery-columns-2 .gallery-item {\n\tmax-width: 46%;\n}\n\n.gallery-columns-4 .gallery-item {\n\tmax-width: 22%;\n}\n\n.gallery-columns-5 .gallery-item {\n\tmax-width: 17%;\n}\n\n.gallery-columns-6 .gallery-item {\n\tmax-width: 13.5%;\n}\n\n.gallery-columns-7 .gallery-item {\n\tmax-width: 11%;\n}\n\n.gallery-columns-8 .gallery-item {\n\tmax-width: 9.5%;\n}\n\n.gallery-columns-9 .gallery-item {\n\tmax-width: 8%;\n}\n\n.rtl .image-navigation .nav-previous + .nav-next,\n.rtl .comment-navigation .nav-previous + .nav-next {\n\tmargin-right: 14px;\n\tmargin-left: 0;\n}\n\n.rtl .entry-footer > span {\n\tmargin-right: 14px;\n\tmargin-left: 0;\n}\n\n.rtl .site-info .site-title {\n\tmargin-right: 0;\n\tmargin-left: 14px;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/css/ie8.css",
    "content": "/*\nTheme Name: Twenty Sixteen\nDescription: IE8 specific style.\n*/\n\ncode {\n\tbackground-color: transparent;\n\tpadding: 0;\n}\n\n.entry-content a,\n.entry-summary a,\n.taxonomy-description a,\n.logged-in-as a,\n.comment-content a,\n.pingback .comment-body > a,\n.textwidget a,\n.entry-footer a:hover,\n.site-info a:hover {\n\ttext-decoration: underline;\n}\n\n.entry-content a:hover,\n.entry-content a:focus,\n.entry-summary a:hover,\n.entry-summary a:focus,\n.taxonomy-description a:hover,\n.taxonomy-description a:focus,\n.logged-in-as a:hover,\n.logged-in-as a:focus,\n.comment-content a:hover,\n.comment-content a:focus,\n.pingback .comment-body > a:hover,\n.pingback .comment-body > a:focus,\n.textwidget a:hover,\n.textwidget a:focus,\n.entry-content .wp-audio-shortcode a,\n.entry-content .wp-playlist a,\n.page-links a {\n\ttext-decoration: none;\n}\n\n.site {\n\tmargin: 21px;\n}\n\n.site-inner {\n\tmax-width: 710px;\n}\n\n.site-header {\n\tpadding-top: 3.9375em;\n\tpadding-bottom: 3.9375em;\n}\n\n.site-branding {\n\tfloat: left;\n\tmargin-top: 1.3125em;\n\tmargin-bottom: 1.3125em;\n}\n\n.site-title {\n\tfont-size: 28px;\n\tline-height: 1.25;\n}\n\n.site-description {\n\tdisplay: block;\n}\n\n.menu-toggle {\n\tfloat: right;\n\tfont-size: 16px;\n\tmargin: 1.3125em 0;\n\tpadding: 0.8125em 0.875em 0.6875em;\n}\n\n.site-header-menu {\n\tclear: both;\n\tmargin: 0;\n\tpadding: 1.3125em 0;\n}\n\n.site-header .main-navigation + .social-navigation {\n\tmargin-top: 2.625em;\n}\n\n.header-image {\n\tmargin: 1.3125em 0;\n}\n\n.site-main {\n\tmargin-bottom: 5.25em;\n}\n\n.post-navigation {\n\tmargin-bottom: 5.25em;\n}\n\n.post-navigation .post-title {\n\tfont-size: 28px;\n\tline-height: 1.25;\n}\n\n.pagination {\n\tmargin: 0 7.6923% 4.421052632em;\n}\n\n.pagination .nav-links:before,\n.pagination .nav-links:after {\n\tdisplay: none;\n}\n\n/* restore screen-reader-text */\n.pagination .current .screen-reader-text {\n\tposition: absolute !important;\n}\n\n.pagination .page-numbers {\n\tdisplay: inline-block;\n\tfont-weight: 400;\n}\n\n.image-navigation .nav-previous,\n.image-navigation .nav-next,\n.comment-navigation .nav-previous,\n.comment-navigation .nav-next {\n\tdisplay: inline-block;\n}\n\n.image-navigation .nav-previous + .nav-next:before,\n.comment-navigation .nav-previous + .nav-next:before {\n\tcontent: \"\\002f\";\n\tdisplay: inline-block;\n\tfilter: alpha(opacity=70);\n\tpadding: 0 0.538461538em;\n}\n\n.site-main > article {\n\tmargin-bottom: 5.25em;\n}\n\n.entry-title {\n\tfont-size: 33px;\n\tline-height: 1.2727272727;\n\tmargin-bottom: 0.8484848485em;\n}\n\n.entry-content blockquote.alignleft,\n.entry-content blockquote.alignright {\n\tborder-width: 4px 0 0 0;\n\tpadding: 0.9473684211em 0 0;\n\twidth: 50%;\n}\n\n.entry-footer > span:after {\n\tcontent: \"\\002f\";\n\tdisplay: inline-block;\n\tfilter: alpha(opacity=70);\n\tpadding: 0 0.538461538em;\n}\n\n.updated {\n\tdisplay: none;\n}\n\n.updated.published {\n\tdisplay: inline;\n}\n\n.comment-author {\n\tmargin-bottom: 0;\n}\n\n.comment-author .avatar {\n\theight: 42px;\n\tposition: relative;\n\ttop: 0.25em;\n\twidth: 42px;\n}\n\n.comment-list .children > li {\n\tpadding-left: 1.75em;\n}\n\n.comment-list + .comment-respond,\n.comment-navigation + .comment-respond {\n\tpadding-top: 3.5em;\n}\n\n.comment-reply-link {\n\tmargin-top: 0;\n}\n\n.comments-area,\n.widget,\n.content-bottom-widgets .widget-area {\n\tmargin-bottom: 5.25em;\n}\n\n.sidebar,\n.widecolumn {\n\tmargin-bottom: 5.25em;\n}\n\n.site-footer .main-navigation,\n.site-footer .social-navigation {\n\tdisplay: none;\n}\n\n.rtl .site-branding {\n\tfloat: right;\n}\n\n.rtl .menu-toggle {\n\tfloat: left;\n}\n\n.rtl .comment-list .children > li {\n\tpadding-right: 1.75em;\n\tpadding-left: 0;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/footer.php",
    "content": "<?php\n/**\n * The template for displaying the footer\n *\n * Contains the closing of the #content div and all content after\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n\t\t</div><!-- .site-content -->\n\n\t\t<footer id=\"colophon\" class=\"site-footer\" role=\"contentinfo\">\n\t\t\t<?php if ( has_nav_menu( 'primary' ) ) : ?>\n\t\t\t\t<nav class=\"main-navigation\" role=\"navigation\" aria-label=\"<?php esc_attr_e( 'Footer Primary Menu', 'twentysixteen' ); ?>\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\twp_nav_menu( array(\n\t\t\t\t\t\t\t'theme_location' => 'primary',\n\t\t\t\t\t\t\t'menu_class'     => 'primary-menu',\n\t\t\t\t\t\t ) );\n\t\t\t\t\t?>\n\t\t\t\t</nav><!-- .main-navigation -->\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php if ( has_nav_menu( 'social' ) ) : ?>\n\t\t\t\t<nav class=\"social-navigation\" role=\"navigation\" aria-label=\"<?php esc_attr_e( 'Footer Social Links Menu', 'twentysixteen' ); ?>\">\n\t\t\t\t\t<?php\n\t\t\t\t\t\twp_nav_menu( array(\n\t\t\t\t\t\t\t'theme_location' => 'social',\n\t\t\t\t\t\t\t'menu_class'     => 'social-links-menu',\n\t\t\t\t\t\t\t'depth'          => 1,\n\t\t\t\t\t\t\t'link_before'    => '<span class=\"screen-reader-text\">',\n\t\t\t\t\t\t\t'link_after'     => '</span>',\n\t\t\t\t\t\t) );\n\t\t\t\t\t?>\n\t\t\t\t</nav><!-- .social-navigation -->\n\t\t\t<?php endif; ?>\n\n\t\t\t<div class=\"site-info\">\n\t\t\t\t<?php\n\t\t\t\t\t/**\n\t\t\t\t\t * Fires before the twentysixteen footer text for footer customization.\n\t\t\t\t\t *\n\t\t\t\t\t * @since Twenty Sixteen 1.0\n\t\t\t\t\t */\n\t\t\t\t\tdo_action( 'twentysixteen_credits' );\n\t\t\t\t?>\n\t\t\t\t<span class=\"site-title\"><a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" rel=\"home\"><?php bloginfo( 'name' ); ?></a></span>\n\t\t\t\t<a href=\"<?php echo esc_url( __( 'https://wordpress.org/', 'twentysixteen' ) ); ?>\"><?php printf( __( 'Proudly powered by %s', 'twentysixteen' ), 'WordPress' ); ?></a>\n\t\t\t</div><!-- .site-info -->\n\t\t</footer><!-- .site-footer -->\n\t</div><!-- .site-inner -->\n</div><!-- .site -->\n\n<?php wp_footer(); ?>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/functions.php",
    "content": "<?php\n/**\n * Twenty Sixteen functions and definitions\n *\n * Set up the theme and provides some helper functions, which are used in the\n * theme as custom template tags. Others are attached to action and filter\n * hooks in WordPress to change core functionality.\n *\n * When using a child theme you can override certain functions (those wrapped\n * in a function_exists() call) by defining them first in your child theme's\n * functions.php file. The child theme's functions.php file is included before\n * the parent theme's file, so the child theme functions would be used.\n *\n * @link https://codex.wordpress.org/Theme_Development\n * @link https://codex.wordpress.org/Child_Themes\n *\n * Functions that are not pluggable (not wrapped in function_exists()) are\n * instead attached to a filter or action hook.\n *\n * For more information on hooks, actions, and filters,\n * {@link https://codex.wordpress.org/Plugin_API}\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\n/**\n * Twenty Sixteen only works in WordPress 4.4 or later.\n */\nif ( version_compare( $GLOBALS['wp_version'], '4.4-alpha', '<' ) ) {\n\trequire get_template_directory() . '/inc/back-compat.php';\n}\n\nif ( ! function_exists( 'twentysixteen_setup' ) ) :\n/**\n * Sets up theme defaults and registers support for various WordPress features.\n *\n * Note that this function is hooked into the after_setup_theme hook, which\n * runs before the init hook. The init hook is too late for some features, such\n * as indicating support for post thumbnails.\n *\n * Create your own twentysixteen_setup() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_setup() {\n\t/*\n\t * Make theme available for translation.\n\t * Translations can be filed in the /languages/ directory.\n\t * If you're building a theme based on Twenty Sixteen, use a find and replace\n\t * to change 'twentysixteen' to the name of your theme in all the template files\n\t */\n\tload_theme_textdomain( 'twentysixteen', get_template_directory() . '/languages' );\n\n\t// Add default posts and comments RSS feed links to head.\n\tadd_theme_support( 'automatic-feed-links' );\n\n\t/*\n\t * Let WordPress manage the document title.\n\t * By adding theme support, we declare that this theme does not use a\n\t * hard-coded <title> tag in the document head, and expect WordPress to\n\t * provide it for us.\n\t */\n\tadd_theme_support( 'title-tag' );\n\n\t/*\n\t * Enable support for Post Thumbnails on posts and pages.\n\t *\n\t * @link http://codex.wordpress.org/Function_Reference/add_theme_support#Post_Thumbnails\n\t */\n\tadd_theme_support( 'post-thumbnails' );\n\tset_post_thumbnail_size( 1200, 9999 );\n\n\t// This theme uses wp_nav_menu() in two locations.\n\tregister_nav_menus( array(\n\t\t'primary' => __( 'Primary Menu', 'twentysixteen' ),\n\t\t'social'  => __( 'Social Links Menu', 'twentysixteen' ),\n\t) );\n\n\t/*\n\t * Switch default core markup for search form, comment form, and comments\n\t * to output valid HTML5.\n\t */\n\tadd_theme_support( 'html5', array(\n\t\t'search-form',\n\t\t'comment-form',\n\t\t'comment-list',\n\t\t'gallery',\n\t\t'caption',\n\t) );\n\n\t/*\n\t * Enable support for Post Formats.\n\t *\n\t * See: https://codex.wordpress.org/Post_Formats\n\t */\n\tadd_theme_support( 'post-formats', array(\n\t\t'aside',\n\t\t'image',\n\t\t'video',\n\t\t'quote',\n\t\t'link',\n\t\t'gallery',\n\t\t'status',\n\t\t'audio',\n\t\t'chat',\n\t) );\n\n\t/*\n\t * This theme styles the visual editor to resemble the theme style,\n\t * specifically font, colors, icons, and column width.\n\t */\n\tadd_editor_style( array( 'css/editor-style.css', twentysixteen_fonts_url() ) );\n}\nendif; // twentysixteen_setup\nadd_action( 'after_setup_theme', 'twentysixteen_setup' );\n\n/**\n * Sets the content width in pixels, based on the theme's design and stylesheet.\n *\n * Priority 0 to make it available to lower priority callbacks.\n *\n * @global int $content_width\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_content_width() {\n\t$GLOBALS['content_width'] = apply_filters( 'twentysixteen_content_width', 840 );\n}\nadd_action( 'after_setup_theme', 'twentysixteen_content_width', 0 );\n\n/**\n * Registers a widget area.\n *\n * @link https://developer.wordpress.org/reference/functions/register_sidebar/\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_widgets_init() {\n\tregister_sidebar( array(\n\t\t'name'          => __( 'Sidebar', 'twentysixteen' ),\n\t\t'id'            => 'sidebar-1',\n\t\t'description'   => __( 'Add widgets here to appear in your sidebar.', 'twentysixteen' ),\n\t\t'before_widget' => '<section id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget'  => '</section>',\n\t\t'before_title'  => '<h2 class=\"widget-title\">',\n\t\t'after_title'   => '</h2>',\n\t) );\n\n\tregister_sidebar( array(\n\t\t'name'          => __( 'Content Bottom 1', 'twentysixteen' ),\n\t\t'id'            => 'sidebar-2',\n\t\t'description'   => __( 'Appears at the bottom of the content on posts and pages.', 'twentysixteen' ),\n\t\t'before_widget' => '<section id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget'  => '</section>',\n\t\t'before_title'  => '<h2 class=\"widget-title\">',\n\t\t'after_title'   => '</h2>',\n\t) );\n\n\tregister_sidebar( array(\n\t\t'name'          => __( 'Content Bottom 2', 'twentysixteen' ),\n\t\t'id'            => 'sidebar-3',\n\t\t'description'   => __( 'Appears at the bottom of the content on posts and pages.', 'twentysixteen' ),\n\t\t'before_widget' => '<section id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget'  => '</section>',\n\t\t'before_title'  => '<h2 class=\"widget-title\">',\n\t\t'after_title'   => '</h2>',\n\t) );\n}\nadd_action( 'widgets_init', 'twentysixteen_widgets_init' );\n\nif ( ! function_exists( 'twentysixteen_fonts_url' ) ) :\n/**\n * Register Google fonts for Twenty Sixteen.\n *\n * Create your own twentysixteen_fonts_url() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n *\n * @return string Google fonts URL for the theme.\n */\nfunction twentysixteen_fonts_url() {\n\t$fonts_url = '';\n\t$fonts     = array();\n\t$subsets   = 'latin,latin-ext';\n\n\t/* translators: If there are characters in your language that are not supported by Merriweather, translate this to 'off'. Do not translate into your own language. */\n\tif ( 'off' !== _x( 'on', 'Merriweather font: on or off', 'twentysixteen' ) ) {\n\t\t$fonts[] = 'Merriweather:400,700,900,400italic,700italic,900italic';\n\t}\n\n\t/* translators: If there are characters in your language that are not supported by Montserrat, translate this to 'off'. Do not translate into your own language. */\n\tif ( 'off' !== _x( 'on', 'Montserrat font: on or off', 'twentysixteen' ) ) {\n\t\t$fonts[] = 'Montserrat:400,700';\n\t}\n\n\t/* translators: If there are characters in your language that are not supported by Inconsolata, translate this to 'off'. Do not translate into your own language. */\n\tif ( 'off' !== _x( 'on', 'Inconsolata font: on or off', 'twentysixteen' ) ) {\n\t\t$fonts[] = 'Inconsolata:400';\n\t}\n\n\tif ( $fonts ) {\n\t\t$fonts_url = add_query_arg( array(\n\t\t\t'family' => urlencode( implode( '|', $fonts ) ),\n\t\t\t'subset' => urlencode( $subsets ),\n\t\t), 'https://fonts.googleapis.com/css' );\n\t}\n\n\treturn $fonts_url;\n}\nendif;\n\n/**\n * Handles JavaScript detection.\n *\n * Adds a `js` class to the root `<html>` element when JavaScript is detected.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_javascript_detection() {\n\techo \"<script>(function(html){html.className = html.className.replace(/\\bno-js\\b/,'js')})(document.documentElement);</script>\\n\";\n}\nadd_action( 'wp_head', 'twentysixteen_javascript_detection', 0 );\n\n/**\n * Enqueues scripts and styles.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_scripts() {\n\t// Add custom fonts, used in the main stylesheet.\n\twp_enqueue_style( 'twentysixteen-fonts', twentysixteen_fonts_url(), array(), null );\n\n\t// Add Genericons, used in the main stylesheet.\n\twp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.4.1' );\n\n\t// Theme stylesheet.\n\twp_enqueue_style( 'twentysixteen-style', get_stylesheet_uri() );\n\n\t// Load the Internet Explorer specific stylesheet.\n\twp_enqueue_style( 'twentysixteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentysixteen-style' ), '20150930' );\n\twp_style_add_data( 'twentysixteen-ie', 'conditional', 'lt IE 10' );\n\n\t// Load the Internet Explorer 8 specific stylesheet.\n\twp_enqueue_style( 'twentysixteen-ie8', get_template_directory_uri() . '/css/ie8.css', array( 'twentysixteen-style' ), '20151230' );\n\twp_style_add_data( 'twentysixteen-ie8', 'conditional', 'lt IE 9' );\n\n\t// Load the Internet Explorer 7 specific stylesheet.\n\twp_enqueue_style( 'twentysixteen-ie7', get_template_directory_uri() . '/css/ie7.css', array( 'twentysixteen-style' ), '20150930' );\n\twp_style_add_data( 'twentysixteen-ie7', 'conditional', 'lt IE 8' );\n\n\t// Load the html5 shiv.\n\twp_enqueue_script( 'twentysixteen-html5', get_template_directory_uri() . '/js/html5.js', array(), '3.7.3' );\n\twp_script_add_data( 'twentysixteen-html5', 'conditional', 'lt IE 9' );\n\n\twp_enqueue_script( 'twentysixteen-skip-link-focus-fix', get_template_directory_uri() . '/js/skip-link-focus-fix.js', array(), '20151112', true );\n\n\tif ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {\n\t\twp_enqueue_script( 'comment-reply' );\n\t}\n\n\tif ( is_singular() && wp_attachment_is_image() ) {\n\t\twp_enqueue_script( 'twentysixteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20151104' );\n\t}\n\n\twp_enqueue_script( 'twentysixteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20151204', true );\n\n\twp_localize_script( 'twentysixteen-script', 'screenReaderText', array(\n\t\t'expand'   => __( 'expand child menu', 'twentysixteen' ),\n\t\t'collapse' => __( 'collapse child menu', 'twentysixteen' ),\n\t) );\n}\nadd_action( 'wp_enqueue_scripts', 'twentysixteen_scripts' );\n\n/**\n * Adds custom classes to the array of body classes.\n *\n * @since Twenty Sixteen 1.0\n *\n * @param array $classes Classes for the body element.\n * @return array (Maybe) filtered body classes.\n */\nfunction twentysixteen_body_classes( $classes ) {\n\t// Adds a class of custom-background-image to sites with a custom background image.\n\tif ( get_background_image() ) {\n\t\t$classes[] = 'custom-background-image';\n\t}\n\n\t// Adds a class of group-blog to sites with more than 1 published author.\n\tif ( is_multi_author() ) {\n\t\t$classes[] = 'group-blog';\n\t}\n\n\t// Adds a class of no-sidebar to sites without active sidebar.\n\tif ( ! is_active_sidebar( 'sidebar-1' ) ) {\n\t\t$classes[] = 'no-sidebar';\n\t}\n\n\t// Adds a class of hfeed to non-singular pages.\n\tif ( ! is_singular() ) {\n\t\t$classes[] = 'hfeed';\n\t}\n\n\treturn $classes;\n}\nadd_filter( 'body_class', 'twentysixteen_body_classes' );\n\n/**\n * Converts a HEX value to RGB.\n *\n * @since Twenty Sixteen 1.0\n *\n * @param string $color The original color, in 3- or 6-digit hexadecimal form.\n * @return array Array containing RGB (red, green, and blue) values for the given\n *               HEX code, empty array otherwise.\n */\nfunction twentysixteen_hex2rgb( $color ) {\n\t$color = trim( $color, '#' );\n\n\tif ( strlen( $color ) === 3 ) {\n\t\t$r = hexdec( substr( $color, 0, 1 ).substr( $color, 0, 1 ) );\n\t\t$g = hexdec( substr( $color, 1, 1 ).substr( $color, 1, 1 ) );\n\t\t$b = hexdec( substr( $color, 2, 1 ).substr( $color, 2, 1 ) );\n\t} else if ( strlen( $color ) === 6 ) {\n\t\t$r = hexdec( substr( $color, 0, 2 ) );\n\t\t$g = hexdec( substr( $color, 2, 2 ) );\n\t\t$b = hexdec( substr( $color, 4, 2 ) );\n\t} else {\n\t\treturn array();\n\t}\n\n\treturn array( 'red' => $r, 'green' => $g, 'blue' => $b );\n}\n\n/**\n * Custom template tags for this theme.\n */\nrequire get_template_directory() . '/inc/template-tags.php';\n\n/**\n * Customizer additions.\n */\nrequire get_template_directory() . '/inc/customizer.php';\n\n/**\n * Add custom image sizes attribute to enhance responsive image functionality\n * for content images\n *\n * @since Twenty Sixteen 1.0\n *\n * @param string $sizes A source size value for use in a 'sizes' attribute.\n * @param array  $size  Image size. Accepts an array of width and height\n *                      values in pixels (in that order).\n * @return string A source size value for use in a content image 'sizes' attribute.\n */\nfunction twentysixteen_content_image_sizes_attr( $sizes, $size ) {\n\t$width = $size[0];\n\n\t840 <= $width && $sizes = '(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px';\n\n\tif ( 'page' === get_post_type() ) {\n\t\t840 > $width && $sizes = '(max-width: ' . $width . 'px) 85vw, ' . $width . 'px';\n\t} else {\n\t\t840 > $width && 600 <= $width && $sizes = '(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px';\n\t\t600 > $width && $sizes = '(max-width: ' . $width . 'px) 85vw, ' . $width . 'px';\n\t}\n\n\treturn $sizes;\n}\nadd_filter( 'wp_calculate_image_sizes', 'twentysixteen_content_image_sizes_attr', 10 , 2 );\n\n/**\n * Add custom image sizes attribute to enhance responsive image functionality\n * for post thumbnails\n *\n * @since Twenty Sixteen 1.0\n *\n * @param array $attr Attributes for the image markup.\n * @param int   $attachment Image attachment ID.\n * @param array $size Registered image size or flat array of height and width dimensions.\n * @return string A source size value for use in a post thumbnail 'sizes' attribute.\n */\nfunction twentysixteen_post_thumbnail_sizes_attr( $attr, $attachment, $size ) {\n\tif ( 'post-thumbnail' === $size ) {\n\t\tis_active_sidebar( 'sidebar-1' ) && $attr['sizes'] = '(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 60vw, (max-width: 1362px) 62vw, 840px';\n\t\t! is_active_sidebar( 'sidebar-1' ) && $attr['sizes'] = '(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 88vw, 1200px';\n\t}\n\treturn $attr;\n}\nadd_filter( 'wp_get_attachment_image_attributes', 'twentysixteen_post_thumbnail_sizes_attr', 10 , 3 );\n\n/**\n * Modifies tag cloud widget arguments to have all tags in the widget same font size.\n *\n * @since Twenty Sixteen 1.1\n *\n * @param array $args Arguments for tag cloud widget.\n * @return array A new modified arguments.\n */\nfunction twentysixteen_widget_tag_cloud_args( $args ) {\n\t$args['largest'] = 1;\n\t$args['smallest'] = 1;\n\t$args['unit'] = 'em';\n\treturn $args;\n}\nadd_filter( 'widget_tag_cloud_args', 'twentysixteen_widget_tag_cloud_args' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/genericons/COPYING.txt",
    "content": "Genericons is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n\nThe fonts are distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\nAs a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.\n\nThis license does not convey any intellectual property rights to third party trademarks that may be included in the icon font; such marks remain subject to all rights and guidelines of use of their owner."
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/genericons/LICENSE.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/genericons/README.md",
    "content": "# Genericons\n\nGenericons are vector icons embedded in a webfont designed to be clean and simple keeping with a generic aesthetic.\n\nUse genericons for instant HiDPI, to change icon colors on the fly, or even with CSS effects such as drop-shadows or gradients!\n\n\n## Usage\n\nTo use it, place the `genericons` folder in your stylesheet directory and enqueue the genericons.css file. Now you can create an icon like this:\n\n```\n.my-icon:before {\n\tcontent: '\\f101';\n\tfont: normal 16px/1 'Genericons';\n\tdisplay: inline-block;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n```\n\nThis will output a comment icon before every element with the class \"my-icon\". The `content: '\\f101';` part of this CSS is easily copied from the helper tool at http://genericons.com/, or `example.html` in the `font` directory.\n\nYou can also use the bundled example.css if you'd rather insert the icons using HTML tags.\n\n\n## Building your own Genericons\n\nIn the `source` directory, you'll find all Genericons source icons in SVG format. This will allow you to bake your own flavor of Genericons using a tool such as FontCustom (http://fontcustom.com) or Fontello (http://fontello.com). Perhaps you need more logos than are available in the base Genericons package? Just add those logos and bake your own expanded set. Maybe you need just a few of the icons Genericons provides, but would like to trim the fat? Remove the ones you won't need!\n\n\n### FontCustom instructions\n\nFontCustom is a powerful commandline tool which which bakes icon fonts from the SVG source files. It's the tool Genericons is built on, and it provides highly accurate and perfectly crisp icons, *provided all SVGs have the same pixel height*.\n\nIt's not that hard to use, and once it's installed you'll never think of icon-fonts the same way again. Seriously, you should try it. Icon fonts for everyone!\n\n1. Install FontCustom. Follow the instructions on the website: http://fontcustom.com/\n2. In the `source` directory from the Genericons download, open the file called `fontcustom.yml` in a text editor. Customize the `font_name` and `css_selector`.\n3. Open a terminal. Browse to the `source` directory. Type `fontcustom compile`.\n\nYou'll now receive a brand new subdirectory called `fontcustom-webfont`. Inside here you'll find your very own flavor of Genericons, with only the icons you want, including a handy example page that'll help you copy/paste the necessary glyphs or CSS values. \n\n*Please note*: In the source directory, there's a hidden file called `.fontcustom-manifest.json`. This file is auto-generated by the FontCustom tool, and holds codepoints (unicode addresses) for every glyph, so its address doesn't change when you add or remove icons. If you feel the need to \"start fresh\" with the unicode addresses, you should delete this file. \n\n\n### Fontello instructions\n\nFontello is very easy to use. Just drop the SVG files of the icons you want onto their website and download the font. The downside is that Fontello seems to ignore the 16px pixelgrid, so you'll end up with fuzzy icons. Buyer beware.\n\n\n## Notes\n\n**Photoshop mockups**\n\nThe `Genericons.ttf` file can be placed in your system fonts folder and used Photoshop or other graphics apps if you like.\n\nIf you're using Genericons in your Photoshop mockups, please remember to delete the old version of the font from Font Book, and grab the new one from the zip file. This also affects using it in your webdesigns: if you have an old version of the font installed locally, that's the font that'll be used in your website as well, so if you're missing icons, check for old versions of the font on your system.\n\n**Pixel grid**\n\nGenericons has been designed for a 16x16px grid. That means it'll look sharp at font-size: 16px exactly. It'll also be crisp at multiples thereof, such as 32px or 64px. It'll look reasonably crisp at in-between font sizes such as 24px or 48px, but not quite as crisp as 16 or 32. Please don't set the font-size to 17px, though, that'll just look terrible blurry.\n\n**Antialiasing**\n\nIf you keep intact the `-webkit-font-smoothing: antialiased;` and `-moz-osx-font-smoothing: grayscale;` CSS properties. That'll make the icons look their best possible, in Firefox and WebKit based browsers.\n\n**optimizeLegibility**\n\nNote: On Android browsers with version 4.2, 4.3, and probably later, Genericons will simply not show up if you're using the CSS property \"text-rendering\" set to \"optimizeLegibility.\n\n**Updates**\n\nWe don't often update icons, but do very carefully when we get good feedback suggesting improvements. Please be mindful if you upgrade, and check that the updated icons behave as you intended.\n\n**Base64 encoding**\n\nBy default, Genericons ships with a stylesheet that includes a base64 encoded version of the font. This is to sidestep issues with cross-origin requests for fonts, that happen when a stylesheet loads a font that's stored on a different domain or subdomain. This is very common when using caching plugins.\n\nBase64 encoding comes with a 25% filesize overhead compared to just loading the WOFF file directly. If you know that you won't be loading fonts across domains, or have the ability to edit your server config files to allow it, you can get slightly faster performance by loading Genericons without the base64 encoding. Simply edit `genericons.css` and edit the `@font-face` declaration to match this:\n\n```\n@font-face {\n\tfont-family: 'Genericons';\n\t\tsrc: url('Genericons.woff') format('woff'),\n\t\turl('Genericons.ttf') format('truetype'),\n\t\turl('Genericons.svg#genericonsregular') format('svg');\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n```\n\n\n\n## Changelog\n\n**3.4.1**\n\n* IE8 support restored.\n\n**3.4**\n\n* Updated: Update Google Plus icon to new geometric version. This also *retires* the \"alt\" version, so *please be mindful if you choose to update, make sure you use the `f206` glyph, not the `f218` glyph, as it no longer exists!\n* New: Added helper rotation classes to the base CSS, thanks to geminorum. Apply `genericon-rotate-90` to rotate 90 degrees, -180, -270. Or `genericon-flip-horizontal` or -vertical. \n\n*Again, it is important if you choose to update to this version, make sure you're not using `genericon-googleplus-alt` or unicode character `f218`, as that has been retired! Use `genericon-googleplus` and glyph `f206` instead!*\n\n**3.3.1**\n\nSecurity Hardening: Remove Genericons example.html file. Please visit genericons.com instead.\n\n**3.3**\n\nThe Open Source release.\n\nYou can now build your own flavors of Genericons with all the SVGs provided. \n\n\n**3.2**\n\nA number of new icons and a couple of quick updates. \n\n* New: Activity\n* New: HTML anchor\n* New: Bug\n* New: Download\n* New: Handset\n* New: Microphone\n* New: Minus\n* New: Plus\n* New: Move\n* New: Rating stars, empty, half, full\n* New: Shuffle\n* New: video camera\n* New: Spotify\n* New: Twitch\n* Update: Fixed geometry in Edit icon\n* Update: Updated Foursquare icon\n* IE8 bugfix, slipstreamed into this. \n\nTwitch and Spotify mark the last social icons that will be added to Genericons.\nFuture social icons will have to happen in a separate font. \n\n**3.1**\n\nGenericons is now generated using a commandline tool called FontCustom. This makes it far easier to add new icons to the font, but the switch means the download zip now has a different layout, fonts have different filenames, there's now no .otf font included (but the .ttf should suffice), and the font now has slightly different metrics. I've taken great care to ensure this new version should work as a drop-in replacement, but please be mindful and test carefully if you choose to upgrade.\n\n* Per feedback, the baked-in 16px width and height has been removed from the helper CSS. It wasn't really necessary (the glyph itself has these dimensions naturally), and it caused some headaches.\n* Base64 encoding is now included by default in the helper CSS. This makes it drop-in easy to get Genericons working in Firefox even when using a CDN. \n* Title attribute on website tool.\n* New: Website.\n* New: Ellipsis.\n* New: Foursquare.\n* New: X-post.\n* New: Sitemap.\n* New: Hierarchy.\n* New: Paintbrush.\n* Updated: Show and Hide icons were updated for clarity.\n\n**3.0.3**\n\nBunch of updates mostly.\n\n* Two new icons, Dropbox and Fullscreen.\n* Updates to all icons containing an exclamation mark.\n* Updates to Image and Quote.\n* Nicer \"Share\" icon.\n* Bigger default Linkedin icon.\n\n**3.0.2**\n\nA slew of new stuff and updates.\n\n* Social icons: Skype, Digg, Reddit, Stumbleupon, Pocket.\n* New generic icons: heart, lock and print.\n* New editing icons: code, bold, italic, image\n* New interaction icons: subscribe, unsubscribe, subscribed, reply all, reply, flag.\n* The hyperlink icon has been updated to be clearer, chunkier.\n* The \"home\" icon has been updated for style, size and clarity.\n* The email icon has been updated for style and clarity, and to fit with the new subscribe icons.\n* The document icon has been updated for style.\n* The \"pin\" icon has been updated for style and clarity.\n* The Twitter icon has been scaled down to fit with the other social icons.\n\n**3.0.1**\n\nMostly maintenance. \n\n* Fixed an issue with the example page that showed an old \"top\" icon instead of the actual NEW \"refresh\" icon.\n* Added inverse Google+ and Path.\n* Replaced tabs with spaces in the helper CSS.\n* Changed the Genericons.com copy/paste tool to serve span's instead of div's for casual icon insertion. It's being converted to \"inline-block\" anyway.\n\n**3.0**\n\nMainly maintenance and a few new icons.\n\n* Fast forward, rewind, PollDaddy, Notice, Info, Help, Portfolio\n* Updated the feed icon. It's a bit smaller now for consistency, the previous one was rather big.\n* So, the previous version numbering, 2.09, wasn't very PHP version compare friendly. So from now on it'll be 3.0, 3.1 etc. Props Ipstenu.\n* Genericons.com now has a mini release blog.\n* The CSS has prettier formatting, props Konstantin Obenland.\n\n**2.09**\n\nUpdated Facebook icon to new version. Updated Instagram logo to use new one-color version. Updated Google+ icon to use same radius as Instagram and Facebook. Added a bunch of new icons, cog, unapprove, cart, media player buttons, tablet, send to tablet.                                            \n\n**2.06**\n\nIncluded Base64 encoded version. This is necessary for Genericons to work with CDNs in Firefox. Firefox blocks fonts linked from a different domain. A CDN (typically s.example.com) usually puts the font on a subdomain, and is hence blocked in Firefox.\n\n**2.05**\n\nAdded a bunch of new icons, including upload to cloud, download to cloud, many more.\n\n**2.0**\n\nInitial public release\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/genericons/genericons.css",
    "content": "/**\n\n\tGenericons\n\n*/\n\n\n/* IE8 and below use EOT and allow cross-site embedding. \n   IE9 uses WOFF which is base64 encoded to allow cross-site embedding.\n   So unfortunately, IE9 will throw a console error, but it'll still work.\n   When the font is base64 encoded, cross-site embedding works in Firefox */\n@font-face {\n  font-family: \"Genericons\";\n  src: url(\"./Genericons.eot\");\n  src: url(\"./Genericons.eot?\") format(\"embedded-opentype\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"Genericons\";\n  src: url(\"data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAADakAA0AAAAAVqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAA2iAAAABoAAAAcdeu6KE9TLzIAAAGgAAAARQAAAGBkLHXFY21hcAAAAogAAACWAAABsqlys6FjdnQgAAADIAAAAAQAAAAEAEQFEWdhc3AAADaAAAAACAAAAAj//wADZ2x5ZgAABFQAAC7AAABIkKrsSc5oZWFkAAABMAAAAC8AAAA2C2BCV2hoZWEAAAFgAAAAHQAAACQQuAgGaG10eAAAAegAAACfAAABOFjwU3Jsb2NhAAADJAAAATAAAAEwy4vdrm1heHAAAAGAAAAAIAAAACAA6QEZbmFtZQAAMxQAAAE5AAACN1KGf59wb3N0AAA0UAAAAjAAAAXo9iKXv3jaY2BkYGAAYqUtWvLx/DZfGbg5GEDgkmLVWhj9/ycDAwcbWJyDgQlEAQABJgkgAHjaY2BkYOBgAIIdHAz/fwLZbAyMDKiAFQBE7gLWAAAAAAEAAACXAOgAEAAAAAAAAgAAAAEAAQAAAEAALgAAAAB42mNgYf/MOIGBlYGB1Zh1JgMDoxyEZr7OkMYkxMDAxMDKzAADjAIMCBCQ5prC0MCg8FWcA8TdwQFVg6REgYERAPvTCMQAAAB42i1PsRXCUAg8SAprl7FN4QZqb2WZGRjAIVLrHj4be4ews7OJHAd54cMBd+Af7JHmt3RPYAOHAYFweFhmYE4jlj+uVb8nshCzd/qVeNUCLysG8lgwrojfSW/pcTK6o7rWX82En6HJwIEv+wbi28IwpndxRu/JaJGStHRDq5EB+OKCNumZLlSVl2TnOFVtl9nR5t7woR0QzVT+D7cKLeIAeNpjYGBgZoBgGQZGBhBYA+QxgvksDBOAtAIQsoDoj5yfOD9JflL7zPGF84vkF80vll88v0R+yfxS9lX8/3+wCoZPDJ8EPil8ZvjC8EXgi8IXgy8OXwK+JHwp+Mrw////x/wsfHx8HHxMvJo8Rjw6PGo8CjxSPCI8fDwc3PVQ2/ECRjYGuDJGJiDBhK4A4pXhDABtHClYAAAARAURAAAALAAsACwALABaAIQAzADyAQABHAFGAZQBzgIIArIDTAOkA+AEEgTCBRYFYgW+BjAGwgbkByQHSAeCB+AI2Ao4CowLGgvQDBwM6g08DX4Nug4kDkYOYg6ADsoO7A8yD4gP8hAwEGYQpBDuEUgRshHUEfYSQBJeEnoSlhLEEtwTIBNYE6oT6hQaFC4UShSQFJ4UtBTyFSAVjBW4FegV+hYUFiwWQBZWFmQWchaIFuYXFhdUF4gXyhgEGCwYThh8GNYZEhlCGVgZZhl8GZIZoBnQGhIaShp8GtIa6Br+GzAbVBt+G8Ib/Bw6HGgciBy8HOwdHh1WHXAdmB3eHvYfIB8uHzofSB9WH6of4CA4IMghACFCIcQh4CIGIjoiSCJ8IpYiyCLmIxAjWiPwJCQkSHja1Xx5YFTVvf/53nUm++zJJJnMkpkJJJkss5GFMIQ9w04IS0BZRSJLMIIo1l4XFETQFkVFBKwVrbuWpRaXPOtalZaCPKu1D2yf28NX21qfQubk9z3nzoSAS//+Mbn3nnvuuWc/n+/n+z3fCxHIaEKEJfJMIhKVhJ4GUtP8jCqRz+ufVuQ/NT8jChgkT4ssWmbRz6gK9DU/Ayw+bPKY/B6TZ7TgpuVwN71Unnnm0dHS24QQRSACUYis8XyzST6xEAch4LF5ZJsnKkc9NsDDj2ETXgUikT4iaClNJEBSGoZIP74qa+l//YRfKB5EAEyj4g/ztWBZbslcIEjucqHATOpjkYBXsYo18DNYeOQI3UMvonuOHIHXj+/YcXyHSs7FLGQp+o7sYA8IFq+BpmqKhtk6SDEZinWVWfMsHlLfIkRCgjdPsLpAtMlRUu8CmzVP8HlDEInJmkC+wcbihT54cN/6cePW79Mv/f1E+MUT2zvCM68cOWt7Rwc2pk8TNQ3IWW0gEbuI3yxI7KW9HdtnjbxyZrhj+xPbWX0EYhjcf9h3Jg9gldjBfhLm1af1ERF7BTAEmoxngQDeU35mB/YPsDiFtU0gxChgX2tn8S6FP3zG38O+zMWEVkU1yaYQRCMxt13WblvTT9bcdgpaTsnahlcqUp9owt0Vr2zYc+oUHwN8S2FjwMYV62PNA5+pPhaFc0EP4JhuPr2la4eQCVCsNRvnLac3A9nRNShIBFZPXpciEmHjareZsEbRWNTEBhVvHDasmyniwP7HJ+4AhlsgbmOP7PUsWVA8DFmHuzoSa3avSXR09XZ0HaZfHa7raOARKjm8kWoLdwfuamwHbcqaNVOo1t54V2D3QtA2nsQL1TYePrwRtMTaWUWYhvI0gGlYz5FeldWtgPiwvfW8bpVgAk/cwxqtR/hwhHxeVq9YWNG6duzo0miCHtBgy55TlN/jbYIHFGwyi6IJ6NVO7RG0c7c7ugBDRITMuMlYqovNAFYeuNg4BWPRSBCDBRhsEaKRQJCl5mOvSfmxpqbY3GQSCmYvXjy7s6bVP2WcjI/P4iEUxG7ddWt0brKrC5/P+Yz2fTans2bNjWMvPTwOi8B2Vhtw5pEr+cpyCWabVVAkVQngpGDFtChYcIsQCIYgT1ADQUUNifmQB7g4HIrN6pIdiponhCAYkoJDMd7ucEkOlxK32q02qxIMlAewtuYWQVwLdsg6+fyNbcufpfRunw+CruicxZMm1JYsV4zGfIuUV9+8OH7VzTdfFV80IpSVVZBvMErLS2rHT140JxrJtYfGjRjrFIyl3liplFNkNDlFY6nTmwuKwx0fu6gZfL67aOrZ5W03Pn/SQNiZfrXlIfr62RfrVXeh9JvpoxY4FUt5/eRFm2bsvTy/YvzFdSDK5jq/F8DrrzMpglAxtSFekt2zZ/rmRZPr/WYl1JmVJxdEq6VcX3GhoGY7zaAUuoZ5pNwhrqF5WabyKXVZhW4l/MJZaHhoC28cdiIDKkJ4nxqIiZQittSTBJlKiL8+LogKUe3+mDleLrvAjLhidsRIPBDMAda9LsERkxwCsETlccHiVXx2S4sUD1SBWyIIewRxjzDgk8iBw54n/0w3db0rjt/1ViE9TY/nNXaeue+KFT+Cxz4uSNCP6Bp5+biD/9dsLw0qj8DEq51nG1+if695Cb68Zevjbs19yW+VvZO2LB9yLT1Er4JdsAEsP/85/ZxupEvw+PznPweLNhWq4MY2evS13r0roL03FCq+m/5W2Jx4iP5u/dsQm1SrddTDuw0Xd7lKw+05HqUYSuGfM+nhE/bxIXBCrGAf3Sc0ultay6/9qXZB5lggL5R1FyAeVyEef0Aa8EZR7Qi4kuRz++3helzyOL0wgJfhOL8YXsXtkgNnaIsQrrc7YvE8UGOqllwpVM/Vnvo9pdvoEdpfVTXzgZ+MuPJ5n99dV/vjhyfPTs6uvwVu+TCrcfGm5OQt4R+tsLY3rFJquycX25Yff/vwfT0jH5QDY+vEbavV3KI3b5QrxfqfXbS445E3s4dUtm1a3Dg8XpRILPfm6vUlKD9UjQQH0MGHKG3xDEcZEXbEAz4UIKUIiyg0zwMI+hHk5dCPKlv3yZOWX/TT2VWUpqrYAxUR4SxB6HwNpN6c5jj8Iyt28drRp2lfqmFHl4xPOLZjufLHWK6b4YPIBAMrI9IiYU+Ugejl5YrSbpiQT1+lvX/+s6N6/EXXtsW7nE51/pKKiNMofU2P9h0SJ0ANCJEFs8bHShVRpB+Z/NVeUTASRJ9M2yyIzB6yhKzi2GA3s0HxeXFFF5hjgDMXFKjHuZsNdgtYYvEWMRphQGBA6AjXOwLlPq+kqPXh+tgIiNkVVVHBIiKOxBz2c3F+HGpVjJmjEbENVsDEL7aN7Nn38idXH6T7v9i27Qv6pzNv0x+PFQO3XC8JX/+j+y/gmypIBXkW1VFoBYdslvMkVZjcCMZV9NN7b6H9R8YXF/lX+Lw2S561qhb8T13bbs23WjdOCVzm82GkrVLwycO/OvSeqmHu+w9e/cnL+3pGbvsCJvLSU3mn6YYlUul9fTUhWREeSo30SHv7dkOOklNXNzZcGJoT9Qp+gzu7JL/Qlt3QAUu6Ox9YJQsilHlFWei7SzDBbFXwuiErE6lWVN68M9XQBT3vH2FzXSC3wj9Rlm4ldWQ4G0W73q8hITOh1ZARh5FBLM5+Me7xh20+my/qi4ajYeE9IZAbGLPkmh3T1723++JF9797+do3WncKVqO9oMjucpWblz66ZMmjS0d2j48VSXS/uE9nVJIWDE/fcc2SMYGLd7+3bu37uy+ePPEeyFVzDdmqURIXP/rbRxeXx8Y0Fb3Nk2M9RZ13Kc8jJzFjXTkjCTJxx4YX4R/FPkZF2FQHFYWyxxz02FoUfCbYhPn0ILQ9KExbumxGvL0KqjrkAnpoWkfluKG52fSQJMGEbJvbUxNuLZ++eVkDEPG/bl40oW1h9aS62kmhszsF8/Ir/WF3cSz1n+L187eaSnzFxZbs+GWPr2ZcKT0/Gct0k+ZBKzC91Bg/saCYDoEPiYTVjhG8moIa9dgLbCrWOs672mbSVyVbeCiGHfSbG0ZPg6mto6ZPGyk1PbSpftowbwH9GgAMhixvg3fMyMwy1ZfkGSIW9X0sbpzS2DxpclPjlL4N8NqTB4sqg4XdHtpz4CAcrrQ5h5Re3E5nY2c+isJhGsqFqazGLkkf9kBQwJURDMQtbALEWKWsrD/ZGsFVEULemYdJkQSpeewvyOeJLNWt++MT2xZEqmdctePgksVPeicUeOffqZb+TMqzb71kxuxAc57j6iVrn1005obXfzT/0ZtXTQjOMKuqaBVUn33munj5xBV3/fIvBhJftGnvgfkbPnxx18rm+Qn6wbAN22MPXy08ZfQsj9x6+LLp4e3/0bD49l9B3cFLn76uLTSt+6a7p965yOYszJmSVWgy+u54rnvS7nu3rp9Vr+N4RvYtzvCJAiFPwGYGY3ELn8/AGiXqjbI77AgbEI8Fgmk0x6nD2CRS7TinOWxuYboywE5yBMiFXCIt5+/YliwZX7J12lW/u31a0+W73u5Zd3T3tVOGdC0zl8iCSZDlvNHjtN41Sx/oGjZ1x0XRdn9Odp1r3KjY3GiBwbjG4pAP0NO7BjMH+hn9iuU/dP1icEaTlx0G8c7Ox+9YnYhfdM3td7bdcmyoIc9iSGRZbaYpVy185uZpzctvm7n96zujndGaXVcObZ01+upk5TSLhfpnLNo8BRyw7sgAQRDIXmGBukDei4srn/PeAuS2BeXpq2yF2V9+SR/+MnVFOiDvZecv03d41eUlUW9Xc4gXbyQR+bkP0TuIkwWpYhx/FrPDjCITQxhlVjaAtSAHlaGfpu5bsco7bZ71qvaN1z0152hdxNo8YdiabkPBpsSYG1VioA/SFB1Oh0AZ3HYtlLWvuKLnboOV/p7+agr9+1NPzbu7FB5nbcjoT/mIDd9af0ZBIag27OnjZ+CanoKsl/J7Ac99nL0SgHeJplTgWvbqWgUqEw47kw9xEwoHnDaMeEZNvihvVFwaBb+gs0wF1c0TN93cM3/+ig0XXzSqNfJqVzIZqjapGm2iH9PIrqoqZ/ls+lHMbi8ra2i8boOwNuVLJObO2cKm52D8cJBqjsEX1J+4lQK7O1aANeKr0c05B9bNHkb2b8J5WQlepRSs9iaojw2GELGMvnSKqVBIzf/XvPk0/ez0ZjP932RUJtFkMqqlT+ejCCWn9Lf6TolkbCMqSKg7NY1JsVekA5l3knxp9QOooPSTbeSnZAe5h9xH7icPkoeZNodNsNUq7M+q1KHOoNQpqpWdFBsDFOxOJR9A8QahtgYCwdpANKB3byAYCfIVGIhiZAS7IFobi8bqIqzPo/VxftV/I6A2DrF6B9Ta62rtYbtj4GdjRy37szqsdXYwyXEjOPyyLQ4mv+qPB1UjBGV/VFVx1Pk/Af+E9BkvqVZThSnVCiLgdBZZrADn/RNgIDGKVuEFTC68AAIM5JHOCDArcH2cujJ19mNwpV59EO6kH34sjPv000+hUpA/ph8KjQ9K/5AlWi2oAkjsHVaowIpM54D5A63OzoFjLPt0TUX+HC+AL+GLEhyTZAFkEPCWHew1ngE7H8vOptXpFop6jqwMlgzfgCn07Rd3wmz68M4X9/5pVeoFiLx47+Rdu3ZhaPbOF+//06rz56oF5dwL5GM2V5GJFaCO5uaqVQsSYVTXBJQPDrsUV9I8AjEVgXUEMEzFFKiHWTgDUxiRRmStjdQhVQuUsyj+aoyBcAgUPUI4B8whIRjggocnY1Qcc2MP2T0TSiIqi0GO1w6XiLfsjfStAPXlOINQiAVZlojhEpYZDJjjMYyPK5KCcG+2SxI5yJgfI2T0Dkb8OAc8tpueWLlyidW075r14N4wIbn6rTtmlSdC2KNGEUb+/OVlD4Brodt/KX3/dnHo0I4tV6xrn7vgyWuT2V3tl9AvV14xvCXLsHPlqv9qanEkQxs3RTsstnBBVbS0am4gEDEYzEUFlfXFzki1udghK5VlFTWh8bmohxlt9jGBwFirTTYbi70V9spOj9cvCh0bW8Mza3Js5qmXrBtWPjJsKjaaHRsebp91+0y64TRsuqRp1o43eibdsNAZG9/TTQ899BD9dFxb7qzZUP2MyXwv/fSNdde9DyGdd+rNZLQzzUDvMqxdfRn945139E8Yn9dgm739re6xm9bWY1uzBEiuaLp1Q7j62jtTWaNuGtYz1FfiTV775ALhshdbJlmbWpZfds3637g80+d3fpgMV1uDwxcsnFlcWaZm5zkc44YMbfc4PBZByHGai9v8/haTXYFhlQKUTSh1eQSo9Pnag1aP0yIZi8rcc2pHXhYy5Yy5aHU00l5tsOfVDC+Pb2ieclU0P2flA303f/3WTTeuPXrvZVb3yq3T7qJPrN/QXer8rz27YOU99/7BJQk5t7xL/7x7H/3D+9f//8R1mT73Y3W4ej25BG9cuAjy5BAqSKY8A858HnIJsTiKJ5eI+ngspPiC3kAeJgOXWAZqSMLF0iK6RIe8Wy2aMGb26CZnXlnlitVXdl86K2E2I+waTFa3P1IaWdU+xmzxjB41rACGKdbEiNmTpo+oyxLKW6Z3zpsx0mKRCsKR5NgZ48aXFBeJJmeR0XhKdTQOKc0eP2rMww899bO7N8xzqkPEnKH1M+ffsO3QojmbZ8Qtcm6uqtD/EVS7w+3yuUqzzUKRKycXCr2VeeXV4jOpjwQ5W5It1aMuGzPx+s62Km++ASFJyS+sCCerqxdMm9hYlZP9htG9fNWD9786b/LlTW4hr6QoKz2GiEFXIAYNIddh79hVbgwNMqiRUCwy5iaivseUAtlmBWapCgz+YRqmD9rTgn3gORITJpusg2SINS3zB57bMnQgpo4Mw6QbDiy5auWUiZe//yukq6ZRdZ3r75y69cq2sYteeHB7z4wqekmT1ze8qX368g6Xu9xtKYjEOxdVDvWUOIpqIj5vkXPYsBkzu7ctXzGsIR7tnL1xXsswr6el9dLJ1aFCp8NWUlYV8/pikVlXHrxnVbfYuuzyJQdumNSYN3zFrmff62mfefnGqXeu76xL5lTN6Nn+4AuL5tPftl86e3hzRbDY6bAYjeZ8zCPkLXe7W0I2e3l5dai+FqmIMzhkQtuCS0a3BgMlVrPJ46ofMbTKbvN4orWFRagDJSdNrBkRCnH+jKyIKMzuGGESHXFX1wbwrFQiS+EcJSRUgomjOO94Zp1Gwe6ptyuaPVhkZ0cymmCsgSZGXjFu7lCtt27VwgSoiACeOWMLDAbYG01KpLiu3OAJ6mdM3ZWsqK0QtIvu/3qzbKr2lLTvnD5zrz+Q1Cn927BVDas93KIVJLVkBBmPesxmrGUMq6UPWwSJAY4VYC3TWqK9nKkzCrvzxzidV+0oE1iQWwesdgmsjhgzlyjEqzCzbsRi1e0/gBKO866MXoTpLCimHHILYgXrCtQSgn7R7mD3LpBezx/qyu949nBHvmto/rDbfkL/1hoKjRwZCrXC6HmtrfNaBU9lw5DqshmpLY+C75FH6AePPkY/eOQR8KU+rKiZWVo1pFGuxoEYUb1vWCjvilfoF/QE/eKVtQWllUXrZtTNKDn03/Nks9kGDYXT69qWL2+rmVIn0jOT/vxkycz62LyYaMh3VeZ3dORXuvKHgRJqxeJbW/VzKDS8rHZIQ3B4alnXgctWHOzqOnjiYJdwb03JxOHlDUJ7qCVUnUg9Fe8srq9b+uzGKVM2/mop6n/hkb4Z66oDC43whj07Rx4/pG75HcurJ4Wa6bU5CypCsXlsfSK/Znq6RnwkjuPBjDBM7RX5loUwHDw23VzOu81hU2VPRscKRh1x/aE0ze63e2sA5t03f4w2LwZqzega+bUtW16X7kMaoc7bPX/+7nmw/D6Mlo7Os/ttIS8tm3vPnGjnj0YfPeKpqfHAx5uef3HTZdU/Ptq5a+6cnZ1/qA0dZ/FEryPbP8B5nU/KM3ybb+Lo+jrbxkF+yPZyHBB3IamOOxRkxpn9GyTW7wWSXX76Hn3P35UMwHLZ1DC6wSSr3Kx+VN/iOcrs6Kl9LAF9H/z8hR1Sqc9XKhHdrvUCcqnWgT0WByFG0WTMiduMEHUIt8Ga1Od0O6wULBTDggVWpv4u5NPtqc9hDb0dLt+d+iL1xW61lb5FD0F56lnw0V/RtyAC4+kH9CFxL/0TTIDI2W/o28t66EvQ0rOMt10ghCpzsO0uMoa3XRUFNU9iKoQKeaBrOEwcMr6F65vtb8TNyLCYcqGzMKaZcMuiBxVo+dXZjdbIHFlWrEU1rjMGWaVX5g11Z1vL8suaK4RTXtlpSa2ylcr/dFpLyz6wFouCS5RcFvr3Yp+vGEZk2wtUsmgRpbTFarVV2MyCgTYU5IqyWlkh2xxVVSV09S/tZW5zn0GRcZ4U5jnzDLtyrT5vcbDYk2PhOMX2R9h+0GDtb9BmCPnezY/0bgfHOgFnLd9TYnsdqPw5PDaPGBZ6xd5+wjRETJ7i8jylIRPW+klmLmHJCmPHOdwqZYTMRqCESyFFKBHf7GKApmAwRdg+U5Ldk8weC5+HZcSftmtm2DQza+q7f4hNeCdZTKhsmcQ6cIH8XHf3c/Qs/ZCefX716ufhjrXv3NvZee87a3fRr3buhKw/wdBO+rRKVj+vJ2LJkefji8+fXd2588RnJ3Z27qRf0dcxuUToXPqfnTAV3tPnB9aJ8L1IE957GY7arSLrVQ/rTKmL72ZqTGs+tUfS+B4m/ezUnn7siD2nCBncrmxSTKp0W53JEw3b8LAw45c+rbj+mh4vNlQ+VlhYRqFzBg9NwM5ORvu4xiniOdXrRKYcSODZqWhn2RLStLOYjCVIsbNwIOCkhD2HXkx5fl1cZChpxLrUoqasioxHxS16iZ4mqK0PowJRAnU/VFUJy1JC4RJ1xRO8DMK0KYebmya/s8bSb0AwqFij4pxQETyNVRLcDtTnDn9X5QnJGajr4H3rYpwblaQJZdwohqdhm5g+MmFPOowc1Wb6oZ7OvHtuO5vVmF+/pwGU6GnYM37Q9DVzFsh3NQWi+qY5Xx8zYaZ6tXo1tseNCAcOQB2tRYA4qAFvPt+jUyFurx+BsAt/Fsrmpk6VNzUGvTnWYcLX+4WyA/6uwIFCs7lwf+rkgQCG/cIwnspfU5pnDIWnS88dSJ3c7/cfKGptLTwglGHwoL9rYG1ynC8gJdh3KqCUZjv15W7JjOyOIM9HBEMJhdhHNGq6+9n0+oFhkLVzdd/q9Ue+PLKenQAb/LfVmSe4dHY9eze8mX64fv2AfTpdFm/pBcWRdFGoXtgtUY9NNsHfvlVmauxAngZBE1dT07fKpd+cq5VhsG2cr7cSUsFtVza2FeOJMjj6gXqIOIw4UGzpCv+mOkomIb6S+jf14vKNQKWBKO+QXKxTKaJbNdv/Z9AWNEIMqyIagXe8EZi2FUNVI8aNjgLnXYifMpyl8hL6JfKeL5dSBc4shRwYCjl+WEu3Tnrl3Zcn0lvh8kmvrFjxypQUYWauU/SlhRxbZXyTypf09CyDM3BmWU9PXyVcAT2TZ0yfTG+lW/EKL+3RXzglRDk6n1dn5ofh46uOgDcIjDWyuiOtjDNLeByCFgcE46whqEtk8N7PmSM2KK7zTYkUeWC/ckoAWMBbcucvdm2/qH3FK0lY+8fQdWfJdRpt5M268//eSG3h1YC3u257eAVvWsuaEaf2rEDIgf2eoj2nhJN0L2vTlO3e6ZPhinfhQ54DvMoauDf1Fm/4V13LeRNfWrNgJQdjEBho6b4S2P/M7IX1MwIKo15IaLSX9mqQ4CdIyBfcayxNen+R29HPz8NA+nrFhNbX29eriQl+EhPqBfcaS8PmqJaWKxbEsyjzcLFVGqJ+ziLsKutBhlWIVHJ4wPgZPveTiQ44mo49ySgg0DCB4OxPA76mg4+eQuGJEYoOIOjiX2+KqyACXjMH5w1QirxhBzGy9WrBP5CLQSW0/BD1U/8hWi5M3L9f+jE9mPoUJtL9ggPaQHCkPmXYovMFDbs2i692BN4gMxqj1Ne0PqKJuGAUBpiUGahTvdBLE+f4MeMLRu6TZAT8M3kYi0jhT8TfGQxzF5pedmJVJRLvv16lF98zkDzGdIwCW90OHIoaQfXjfMQ+6u3TaELUUo8vEGak9moLEgs0mIThBQqW3qdBL7acPetbwJ/lskdp/oS5syE2Ztx8VOQ5jPYgDCVS/E1WFegdjDc5uLY5g+a+Gp6IUO4z1aMYcwLeZEGgCnxmphyhmAWi7zm09ZMjdPfvj8I2mAYlr67qJ/Me/Jx+TA880b23G//kjLvE72HREZGsepX+lT5JLz/6BCSh6PMH5/VpPB2X7f3fADEo6ovYG07uo+JCecJ1UlyiLcgsBpZmMXgs6luVeZErZnxzunVZs8PhE76u7L68u5L+H193f4zQj8LC3LHa/LgvMbNrmPTO2AkTxp45ylcVRNmeAQ5MZp/BhtgQ1nkNQwXUXeJc3+RIhqCG6Oth0GB3sMYH1ZAgcBqleJnHFv1tkv7mpVkPbm0E1AoC0S2TmIMOHqi+JmH4S9d/MofFg2/G4i95YyWcSo8dD7U3AWoT/tjwU0IZ28h47PiSOSwCyutLaS3vPd3fivsxVWa8mPLAyzg9Liu7m7sz+bwDTkt8rXGazJ2XOIJrLLRmytRuXDcauzLXpZR2NcP2qxk2MD8lQZuypntqmmy9TJvZnUA2snUBP1HY3Mgjhbp/HIKnyrA+GjGjClHAii+wi+VccsyZSpfT5VPn7IR9Nz733I2Ys0qYNFl7DB/AXVOPrd0FWSnnc2B4jjlTMTxbwPBMPsmWEJIJH8QdMucl9KR2Uj65IEVgr9aLY4Vz1EAGuBQpwsFi48WuBvI10Q82k3GZ4pHionAQZ7CQIZhHEFd1HrMLO0w4iKwJzALi8JjKcIJxDwMTTn34y18E7ZOa0f4/PnTz6UcXrZc3DVs69i8pzfLO+KlLnljF4pRSvP8k1L1xzNP0b1X0jH3zqyDeugvsdPKlrz48Dt+3vDP215euPbKtFBR8SFNMJxGxrZLGW8OWpcb87tL1ZPjDOoG1j89EfzrFWVRP+vC9PsKd3RjSzBASBtZnKtczy9gq5/wgfQGHlN7vM6fXizCM/gu2a9QCa6UH04HuvlE4Mdgw/H33mjW718j30zLEJyLsSZ3Sry0L2VOcPvTwGpbkPG6icj7L8IW7kg1emTL3HUNVCa+QPLceEYnTsSJ3IBu8GAnLisuUdN4ZphzXmTJJ4475gqs/7f2pM2Vd/Mhc8Hi4EEK1Ecmzz8TSCPu48Bj8B2nnRuZHmRFDNKGrA/ycwMqx5zgI/A3QX6T6ZZ9OjCVOm5lE0nM9yzVK5oTKCB0j4kRlumgJ12d1cRiJNUHajsVtTNw+OWizT1UPb2xdVxV67vI9pwolwvWyHWWejYfD1Us3nNrT0srXpqaCKqf9Ye1Wxr+DbGEEA5ERbCdNRFquHEwmP207mqQN9CS8Bm1tnyaPt83e20/2yruSx/ARjKcN4GaPjuNdW2rHXiAMkIHJLpnRKPVc/4t6RWS9Qtym+Af5f+UnuKwRsPCoByQCn1PLLJjFXFTpL+THqYVaOmCWBrO4HRIX2B8UTX8H1zySWyS1EplFf8G8UGHWLGqRH++gv8B3O+BzrssnFFYPxuiYgASEiFRvCllNr8xksYDUJsHTMSxJsHRYFyMm41YCIYE/jQlsDKZ6B3wJRKwe88bEGSxyd9o+Pg8BVyhWTX+Gc5st0syzNE+QNe6STIwiq7zGSBmbAWeJoDsecx5fwG5kTfm2/ucjQZzZNShz4lwTJBl9jx3xsM03+D48SB/8vnthgEylMqE+7cLAgAN0xgP6e0K8awRuB+G2DFbnb+1iZ5CF4ZisG2T4WbeNMEMJs5718TiJObNo6dUu4qM0jvD8GX4FLsg/zASuzRcdVI4YZYownCtKYxlpmQI5K2NWwEyZqOExxfhcwQeYituv2xAydnCGM8U6FjN5Lqev4LEKCiOAIRBEfIc3iF/6cJBv+vQn/eQnn96kcODglnD9mnrzbvqvX5bSf0Ju6S8hm9FEoq97Ja3FMXxOAwBDq8Eg4IIBFJCwesz1FnDe8NZi43SHX0U5vLGqfVypDgoCVk3HLmBmGyZH8OJ2bzzsqHSlMeIc9pQPYI9ej+8rPe1JSDJ10If1/JI5HOnQ+R1lCtxfn/EqI7fgmdjWlkfl8hqBGDECFy3zLmf6JzNHpN6bKwToXIGNEMV1xy1yKMD38Qfn2bDymZgo5c4cePJFue86MKjFNP2MZbNhuUpNsdXI8gaUm/q6TY+5iY84kxBNyGrTs5nVLRCJc41F4apFIjN1+4hYX1/fd4TZo9hU0vT5fBZLi/80zjRNAdFyj7pAXUCq+M6K6ldUixpkRDFoCQTlINMf48G4HIuLcQeictwh2h1+h2rHseaT216vLmikv6tptm95Y4Sz5Y0ttqZa+rvGTwyGTxqhrrbJtuWNkdaRb9xqb6qFOhZNN3H4FU7fam+uOZdSzyA3O4E5NNfoST/RM771dcy4jGM3ucDGYEV9/rwvH4Ab+VWI+fnOaRyUC7+BkOo3n96yaYNweHwf4aHUmPHf+iAidWTL6c3jU2M2bGJX4fCGb/GH4nNypTyjVyCgstXPlrusc4eUfmEsCGGYsEkj4ezRY/XF/SaTwWx1n5srOo8y6SyRxWZEvUx0qGbceoBz8ZTsyxH965GBbxIyOK+7D4n48AwrnmTwftD+QyYtkiELm576dyB6iSkuIAa+nyCDvp/A0tLfT4jAHbwN34u5ZBDm6kbwNNalQRc7x4AAeEZfsXj+OgO6vKoixyOWv4LaFcNcjqnG84rxpH+DihPS4CoMFAm82rj0M0XzL1Gw/0UtUzy+hO1mrR+oxoXzznLhvJMym3TI1zy2MDK3C+edsExH+720V9v7rQlXz4vpSzJooWk5dl55ju/+wodx1m995ZMazFsvKOjskfP0yPPKCH93GfrONa4qB9+uZkDLfqUQjnIPqO8pH170t7ffsf/n825aUlHkLCyKjC52vmUyj5n+fXUSGhqndSdGXrR/XEFBia+k2Du0umpkg7fUaquOpH3hdZ1Xn9Xsp+K8YYYKjrknqRuHzQ0nL0jLEhpZ2hSOvESYwZ6lZcyHupk9I2MHYUzHTOz4RhgVg7AFj6DPb0HNLlzMggqjGimWeQe00/85UamlPuvgtkitYwTeybwu3I7JE6bDvO7/xPrkKtvYTgbTQFsEexnEW8CF0horv35CU/DGZ1+YcP/9E1741caK5gk4ZZeO+c1r97YMHXP33WOGttz7+ktj2Jwgl8BJdafixhWsfw3F7F8iqBbRwQzaQeGyE/Qo1Jw4Kh09cfToCag52/U1kK/lhm3IoRu2QQO8to2+Rl/bBq/RshaJtDCdjOunaTtQEdv9MQpRFLSoxX3LgTjKtTREubBJNxIpiCqsnX0oqges7lEm33UTrcxhhFnz8IRU9lwKbtMfMPp+ux6lP1wP2w+Xn/p3JWvkO8os+4EyLSj+g+oPldoHL8+lOw50/lDJOH1e7mSJGIqm56iMcgzLNRkF5rRgCqIIY/Y0k8CtngyARYJyaEfbc0v6OR7LCWYdpb18CrMPyujxHW0Tqabfp/0ldFzP4z7Vg3OVL8iLfMf752wPIuuTjCzycgdl0Weq5w4WHD0kPsnHrk4mV48dt6Il3ODzNYRbVozjMcB7SsaVxzRSdogDoUEYx/lRNrPSQBrEeYnMv9kT5Fv1wC0jDLgljS2shmHdKdLtDxcxNS/FxaPE51EfSW6Nr1lTPvfiem0wd+K2hguHlDkEurFzZE+Uf1qncEW4j583nwb76c1slxR5h3TeGGq6J6rG6SbTNwQiz8I2FBAn99f1cJRUVBt3QfF5mCmOQWglFOlBH8qkZV+uXr1w6sqFf/0NnQbk+iVz6uouXbt96YK3FG3smHuW3ZinFt20+r6nhV8NH9daWkpb6PFJU28jaTs6kTP7wz4xrHriYYsv7pFna19oFTRRwS6oXnKFikvOtM1b49wim2EQ6+eMYwmYgswRk7MLOJCWxzhxe/s5Vko6Xel7U0j0phaAm00QI/ezZv3KeIOR5HB/ZxuOIMp+i8ljYR8asNk2BEC3DKt+I6BKr+nKDWjf8DHTzS2gm5i1bzROhPFeThNjiqVnDC9shEHjLErjagYztmnny0kz+Y/zZZgjqKgjuLtlMF4j5EONMEJ1jIAyCNRAvhQcAY54cIQQCKoO/MsXWSK8RVkXR3jmCeP5QhnGYaAM8iGuloEazzcEK/HGEccMJYdaIyvMXdNRI48QkDiPEPBtScWkIuboyMdZd6GIzBPFLNnkEsjLkGhT8n1FhcMiFUEAWXbkWnL9geJRzsJch5xX6nCGC8XcGkOhrSJ/Yo9k9Ug2Q/OkZqUgJ2R3j3FdtuidJwO1bl+NSynJrk2Wx3ODxV6Lx2MszbYmY0PlvOxQgbMsz+fMcjsNhaFgnVLamD8kWIUKowEMcpYMTtc1726SsrJHubPUPIMh35rbHBTyLaPrvEaDx1BTWyY4Suoryk2CRxr6LcH9L0mxIMPum/zHp7LCRQaLTSyNueOq2ZdndfogS/VnNcdkVbD7so0VTtHuNNqz1ycFk5wlGLN8pc0em9VkMIH/ZsgxGBTVLDrkItvQfHOJN+AwmbPiVos9x1SgWixyvsliLXQ2O2srKt2uSqfRPKW2oNWUZcpxlIcWz/gJ7X+mPOeWEa3DSgqiLXK2Uc01Fxepdq9FrjMWZEuWxpGjyzplh8mpcBm6V3SrC6SMDfJbPH6Az/t+fcMNv75BFAdfpJM38Ougv7SfJLO79DJUxzlvIF9rYq84YK/BGwNbKyRqArEXUb8vwd6REnwvC+ORa/BYA+lLcDtOIr3PJXD+wqL1PAfbACpILRmmf6+sey4hJ/Po3y2nv5YxIWOLDYd0VHl6wUtpYodI08i/Ru4njWOZLtwYuPqmrh083KfvRQrJtMPI2LXeB5jc6NIkn3fdGIZ8oY5WB7WP29H1gHftWIyw87QHMoRZGdAtzv/2PS1LMps7me+4gejSpI8wBV5EAU55jMhAgmlOeFCSCQHnYXqY41ucY4BGcvX9EKOIOjEEWyS+Y+rzBiEaDCj5oDBfLodubiyDcyYaAp9igf/0+8EP3MtP/G0M2xGjBxPOTv9Ef5c/X9Dy/RjKdya0p6KBQNSvatSBtDPX3xWAclG2jZu+8QyNTkx2xaBNSzjzMbH+VheGOp2J1L/wJX+UkMHfEo4mE0k7mUeW8D2jtE9gC8SZU6DHNBDDfGzZ8A6KiHLlf2C0mdUHrxlQH/D8ueCqDgx1Mpoe9rGN/Sjx0kG2m5MOMiealD4N+tJq2vmX+fq484nwAJKqD9L3Y9Z5wZeMPpCeJ3j7wJ5TkJk2OJPoB6f2pMXKmeQgZTiZmTsC9skpNaH08v00ou/Lh42CiGzXwbZHM2tWfsS3plXMFmh3v84k6fH/Hsc9A/Cnb0TJPdEWoe+kwGcPqoOzerYxkxi7F36W3sETYBWuqZ/imvLwvRYH9w6Iu8BhYh7XgzrZFrb5TC2Q6WaZ3rGMPkCX0AeW3TH2lR5NS/edpvW8Qn+kd9OROY/+9s1H5rRdYoF/aQ+c64UHNJptWSqm0o0W0nOCkMk4H3SLVyX75tdcCqytwyESZFt85UFlIMIcDwR9ujUsEg+YeC3xoUtwtwjML47dFah2m98bCOreoI48QeWbBG/neucuCkQC18+lX+28h/5rzg14s3iOJ+9t9rS39D68XfrY5yB9/thSDO4qSWk7U8Pn/mNT5+M/aarY8mu+qTCybRnt38rzS5x49MpbNl/52HH9bivAsgmtmGTqgiMg6HHXY1aY5fX6He0/0tmh/WLzwpXhzsTcWyZnbF3aoL1swZNGC1nTTXps3TOeInHGwMaQMgSAAQ7AuI09bPJWAclCLcHqUO3EIb9+371H6eX0SfrXV1cJpOv5S6D+sBgOU7LqVSiBabDt6Ocnnn+a/m06r8OrOBca+f8FUcr9zjhX5CTaGg8rAjOvBoRg2AXumDR1z5o1UyJzws/2Wr98up88/aW11/EOFB8XtTVTBDJlTXhOhJKpBYfoF0PoF1AwBAoObT50KO3TLGJLB++pySS9p3buO2pHxoLDDZ+mwWE13SeDzpxAZc6MOn1XPKTfy+gJvL+zM9+Z6T/mLsDwltnSGbHWQ6y/+TduhNfNyHbRQPTIoh//PCIKMe654JHIOroVqtahHh25Eqro1nXHhMdT77yTOpE68U7qHeFx+WN6zx/onvffh4V/EFENodekboRb6DrhGrgx8917poyMP4SnGFCFH5TJsWOo7g96Mb0ZN7h++YPfFnklL8zjWKaK386MVrD6wbK07x7X1ezI8CuZ/cmIs4vtZnOc9nBvczbv1EAQYZk9hfq43cFs1gof036udnWxweCBueOHzLphj77r20f0O8q4MQcyLpaBpP/TkKZrF3Xq8ZSH4cLv9arJBLLoO7029Z3hgId9i8x2j+3hWJhv3NnjulJSnv5M2Wp31PNHkqPebhl4xp+EM0/s4njohol/27r1b3Q/vZ3uZyGxy+LKN+bn/Z3+NXb1xNEmk6nI6cz95SU//uKiXK2kPLiJPvPIuFunjA6HyhSn0vPLn0OgK8epuWrCd9Dr3+l7JBEO5Lvlx359GGZfXaRqg7OGiby4s8vykRcX5qlbTWaTIbvYbHPlOpsacj6qcTVYJ8/GEk3NJZGs3GDbqFxwRvxh57xZYduYQDg3MCWZc15fidybtIjNdh//TwL4ZrzoyzARWxxn7y6hZFffxcpwWk3v/+yvlChLzpyFiz+Fx+THaDUcYwccP/s8HcUIiPR6apQ45+yOY8c4DqVtSen95cHaJhPPusJznmcmV3XYyuQx/Pz/AAfdhq542o2QsWrDMBCGfyVOSjOUDn4AdSlJiY1sMCTZ0hQHQqcM6RyMahsSKVj2EChd+wgd+wZ9s7xDz4pKl0IrkO7T3a+73wZwhU8wnNcNHhwzDPDiuIMLvDvu4hYnxx4G7M5xD9fsyXGf8q+kZN4l3e7tq5YZfDw77tDcN8ddPOLDsQef+Y574Cxx3Kd8gQU0DjiiQokcBWpwDJFhRDGGQIQEY+IV6SQU0RwGezR0GpvBQh+OVZkXNR9mIx6LKBnzlZaKz82+MUaSZGmV0k7JqJOit1hKJasy04p4TcWcmu6wJRHWMm92W4LUimsbK1JIayskYxwz2r81PlciTBBgSvv7M5BqVae6yiWPQ8Fn/McAXaJJMA1a8/9wu7FFQ2Vtf4mwE0IbW2fYyMqUWnEholAIwf/u+QXtVlqxAAAAeNpt0meTFVUUheH7DhkJEgQJgpIFhdvn7NM9gxKGCZKzKGZyUHJGySAgSq7i5wrFfYdPdFXX+tRP9V61Wl2tt8//rdbh1vueV29eWl2tYXQxjOGMYCSjGM0YxvIB4xjPBCbyIZOYzBSm8hHTmM7HzGAms5jNJ8xhLp/yGfOYzwIWsojFLOFzlrKML/iS5aygTUUiExRqGrrpYSVf8TWrWM0a1tLLOvroZ4BBvmE9G9jIJjazha1sYzs72MkudvMte/iO79nLD/zIT/zML/zKb+xjPwc4yCEOc4SjHOM4v/MHJzjJKU5zhrOc4zwXuMglLnOFq/zJX1zjOje4yS1uc4e73ONv7vOAh/zDI/7lPx7zhKc84zkveDnqwsljg1W7bVZmMrMZZjFrszG7zZ63mfSSXtJLekkv6SW9pJf00pBX6VV6lV6lV+lVepVepVfpVXpJL+klvaSX9JJe6njZu7J3Ze/K3pW9K3tXbg9915id/wid0Amd0Amd0Amd0Il3TueesJ+wn7CfsJ+wn7CfsJ+wn7CfsJ+wn7CfsJ+wn7CfsJ+wn0h6SS/pZb2sl/WyXtbLelkv62W9rBd6oRd6oRd6oRd6oRd6oVf0il7RK3pFr+gVvaJX9IperVfr1Xq1Xq1X69V6tV6tV+s1eo1eo9foNXqNXtPxijsr7qy4s+LOijsr7qy0h75rzG6zx+w115l9Zr85YA520l0Wd1ncZXGXxV0Wd1ncZama1x+EcTsAAAAB//8AAnjaY2BgYGQAgosrjpwF0ZcUq9bCaABTzgdAAAA=\") format(\"woff\"),\n       url(\"./Genericons.ttf\") format(\"truetype\"),\n       url(\"./Genericons.svg#Genericons\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n  @font-face {\n    font-family: \"Genericons\";\n    src: url(\"./Genericons.svg#Genericons\") format(\"svg\");\n  }\n}\n\n\n/**\n * All Genericons\n */\n\n.genericon {\n\tfont-size: 16px;\n\tvertical-align: top;\n\ttext-align: center;\n\t-moz-transition: color .1s ease-in 0;\n\t-webkit-transition: color .1s ease-in 0;\n\tdisplay: inline-block;\n\tfont-family: \"Genericons\";\n\tfont-style: normal;\n\tfont-weight: normal;\n\tfont-variant: normal;\n\tline-height: 1;\n\ttext-decoration: inherit;\n\ttext-transform: none;\n\t-moz-osx-font-smoothing: grayscale;\n\t-webkit-font-smoothing: antialiased;\n\tspeak: none;\n}\n\n\n/**\n * Helper classes\n */\n\n.genericon-rotate-90 {\n\t-webkit-transform: rotate(90deg);\n\t-moz-transform: rotate(90deg);\n\t-ms-transform: rotate(90deg);\n\t-o-transform: rotate(90deg);\n\ttransform: rotate(90deg);\n\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n}\n\n.genericon-rotate-180 {\n\t-webkit-transform: rotate(180deg);\n\t-moz-transform: rotate(180deg);\n\t-ms-transform: rotate(180deg);\n\t-o-transform: rotate(180deg);\n\ttransform: rotate(180deg);\n\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n}\n\n.genericon-rotate-270 {\n\t-webkit-transform: rotate(270deg);\n\t-moz-transform: rotate(270deg);\n\t-ms-transform: rotate(270deg);\n\t-o-transform: rotate(270deg);\n\ttransform: rotate(270deg);\n\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n}\n\n.genericon-flip-horizontal {\n\t-webkit-transform: scale(-1, 1);\n\t-moz-transform: scale(-1, 1);\n\t-ms-transform: scale(-1, 1);\n\t-o-transform: scale(-1, 1);\n\ttransform: scale(-1, 1);\n}\n\n.genericon-flip-vertical {\n\t-webkit-transform: scale(1, -1);\n\t-moz-transform: scale(1, -1);\n\t-ms-transform: scale(1, -1);\n\t-o-transform: scale(1, -1);\n\ttransform: scale(1, -1);\n}\n\n\n/**\n * Individual icons\n */\n\n.genericon-404:before { content: \"\\f423\"; }\n.genericon-activity:before { content: \"\\f508\"; }\n.genericon-anchor:before { content: \"\\f509\"; }\n.genericon-aside:before { content: \"\\f101\"; }\n.genericon-attachment:before { content: \"\\f416\"; }\n.genericon-audio:before { content: \"\\f109\"; }\n.genericon-bold:before { content: \"\\f471\"; }\n.genericon-book:before { content: \"\\f444\"; }\n.genericon-bug:before { content: \"\\f50a\"; }\n.genericon-cart:before { content: \"\\f447\"; }\n.genericon-category:before { content: \"\\f301\"; }\n.genericon-chat:before { content: \"\\f108\"; }\n.genericon-checkmark:before { content: \"\\f418\"; }\n.genericon-close:before { content: \"\\f405\"; }\n.genericon-close-alt:before { content: \"\\f406\"; }\n.genericon-cloud:before { content: \"\\f426\"; }\n.genericon-cloud-download:before { content: \"\\f440\"; }\n.genericon-cloud-upload:before { content: \"\\f441\"; }\n.genericon-code:before { content: \"\\f462\"; }\n.genericon-codepen:before { content: \"\\f216\"; }\n.genericon-cog:before { content: \"\\f445\"; }\n.genericon-collapse:before { content: \"\\f432\"; }\n.genericon-comment:before { content: \"\\f300\"; }\n.genericon-day:before { content: \"\\f305\"; }\n.genericon-digg:before { content: \"\\f221\"; }\n.genericon-document:before { content: \"\\f443\"; }\n.genericon-dot:before { content: \"\\f428\"; }\n.genericon-downarrow:before { content: \"\\f502\"; }\n.genericon-download:before { content: \"\\f50b\"; }\n.genericon-draggable:before { content: \"\\f436\"; }\n.genericon-dribbble:before { content: \"\\f201\"; }\n.genericon-dropbox:before { content: \"\\f225\"; }\n.genericon-dropdown:before { content: \"\\f433\"; }\n.genericon-dropdown-left:before { content: \"\\f434\"; }\n.genericon-edit:before { content: \"\\f411\"; }\n.genericon-ellipsis:before { content: \"\\f476\"; }\n.genericon-expand:before { content: \"\\f431\"; }\n.genericon-external:before { content: \"\\f442\"; }\n.genericon-facebook:before { content: \"\\f203\"; }\n.genericon-facebook-alt:before { content: \"\\f204\"; }\n.genericon-fastforward:before { content: \"\\f458\"; }\n.genericon-feed:before { content: \"\\f413\"; }\n.genericon-flag:before { content: \"\\f468\"; }\n.genericon-flickr:before { content: \"\\f211\"; }\n.genericon-foursquare:before { content: \"\\f226\"; }\n.genericon-fullscreen:before { content: \"\\f474\"; }\n.genericon-gallery:before { content: \"\\f103\"; }\n.genericon-github:before { content: \"\\f200\"; }\n.genericon-googleplus:before { content: \"\\f206\"; }\n.genericon-googleplus-alt:before { content: \"\\f218\"; }\n.genericon-handset:before { content: \"\\f50c\"; }\n.genericon-heart:before { content: \"\\f461\"; }\n.genericon-help:before { content: \"\\f457\"; }\n.genericon-hide:before { content: \"\\f404\"; }\n.genericon-hierarchy:before { content: \"\\f505\"; }\n.genericon-home:before { content: \"\\f409\"; }\n.genericon-image:before { content: \"\\f102\"; }\n.genericon-info:before { content: \"\\f455\"; }\n.genericon-instagram:before { content: \"\\f215\"; }\n.genericon-italic:before { content: \"\\f472\"; }\n.genericon-key:before { content: \"\\f427\"; }\n.genericon-leftarrow:before { content: \"\\f503\"; }\n.genericon-link:before { content: \"\\f107\"; }\n.genericon-linkedin:before { content: \"\\f207\"; }\n.genericon-linkedin-alt:before { content: \"\\f208\"; }\n.genericon-location:before { content: \"\\f417\"; }\n.genericon-lock:before { content: \"\\f470\"; }\n.genericon-mail:before { content: \"\\f410\"; }\n.genericon-maximize:before { content: \"\\f422\"; }\n.genericon-menu:before { content: \"\\f419\"; }\n.genericon-microphone:before { content: \"\\f50d\"; }\n.genericon-minimize:before { content: \"\\f421\"; }\n.genericon-minus:before { content: \"\\f50e\"; }\n.genericon-month:before { content: \"\\f307\"; }\n.genericon-move:before { content: \"\\f50f\"; }\n.genericon-next:before { content: \"\\f429\"; }\n.genericon-notice:before { content: \"\\f456\"; }\n.genericon-paintbrush:before { content: \"\\f506\"; }\n.genericon-path:before { content: \"\\f219\"; }\n.genericon-pause:before { content: \"\\f448\"; }\n.genericon-phone:before { content: \"\\f437\"; }\n.genericon-picture:before { content: \"\\f473\"; }\n.genericon-pinned:before { content: \"\\f308\"; }\n.genericon-pinterest:before { content: \"\\f209\"; }\n.genericon-pinterest-alt:before { content: \"\\f210\"; }\n.genericon-play:before { content: \"\\f452\"; }\n.genericon-plugin:before { content: \"\\f439\"; }\n.genericon-plus:before { content: \"\\f510\"; }\n.genericon-pocket:before { content: \"\\f224\"; }\n.genericon-polldaddy:before { content: \"\\f217\"; }\n.genericon-portfolio:before { content: \"\\f460\"; }\n.genericon-previous:before { content: \"\\f430\"; }\n.genericon-print:before { content: \"\\f469\"; }\n.genericon-quote:before { content: \"\\f106\"; }\n.genericon-rating-empty:before { content: \"\\f511\"; }\n.genericon-rating-full:before { content: \"\\f512\"; }\n.genericon-rating-half:before { content: \"\\f513\"; }\n.genericon-reddit:before { content: \"\\f222\"; }\n.genericon-refresh:before { content: \"\\f420\"; }\n.genericon-reply:before { content: \"\\f412\"; }\n.genericon-reply-alt:before { content: \"\\f466\"; }\n.genericon-reply-single:before { content: \"\\f467\"; }\n.genericon-rewind:before { content: \"\\f459\"; }\n.genericon-rightarrow:before { content: \"\\f501\"; }\n.genericon-search:before { content: \"\\f400\"; }\n.genericon-send-to-phone:before { content: \"\\f438\"; }\n.genericon-send-to-tablet:before { content: \"\\f454\"; }\n.genericon-share:before { content: \"\\f415\"; }\n.genericon-show:before { content: \"\\f403\"; }\n.genericon-shuffle:before { content: \"\\f514\"; }\n.genericon-sitemap:before { content: \"\\f507\"; }\n.genericon-skip-ahead:before { content: \"\\f451\"; }\n.genericon-skip-back:before { content: \"\\f450\"; }\n.genericon-skype:before { content: \"\\f220\"; }\n.genericon-spam:before { content: \"\\f424\"; }\n.genericon-spotify:before { content: \"\\f515\"; }\n.genericon-standard:before { content: \"\\f100\"; }\n.genericon-star:before { content: \"\\f408\"; }\n.genericon-status:before { content: \"\\f105\"; }\n.genericon-stop:before { content: \"\\f449\"; }\n.genericon-stumbleupon:before { content: \"\\f223\"; }\n.genericon-subscribe:before { content: \"\\f463\"; }\n.genericon-subscribed:before { content: \"\\f465\"; }\n.genericon-summary:before { content: \"\\f425\"; }\n.genericon-tablet:before { content: \"\\f453\"; }\n.genericon-tag:before { content: \"\\f302\"; }\n.genericon-time:before { content: \"\\f303\"; }\n.genericon-top:before { content: \"\\f435\"; }\n.genericon-trash:before { content: \"\\f407\"; }\n.genericon-tumblr:before { content: \"\\f214\"; }\n.genericon-twitch:before { content: \"\\f516\"; }\n.genericon-twitter:before { content: \"\\f202\"; }\n.genericon-unapprove:before { content: \"\\f446\"; }\n.genericon-unsubscribe:before { content: \"\\f464\"; }\n.genericon-unzoom:before { content: \"\\f401\"; }\n.genericon-uparrow:before { content: \"\\f500\"; }\n.genericon-user:before { content: \"\\f304\"; }\n.genericon-video:before { content: \"\\f104\"; }\n.genericon-videocamera:before { content: \"\\f517\"; }\n.genericon-vimeo:before { content: \"\\f212\"; }\n.genericon-warning:before { content: \"\\f414\"; }\n.genericon-website:before { content: \"\\f475\"; }\n.genericon-week:before { content: \"\\f306\"; }\n.genericon-wordpress:before { content: \"\\f205\"; }\n.genericon-xpost:before { content: \"\\f504\"; }\n.genericon-youtube:before { content: \"\\f213\"; }\n.genericon-zoom:before { content: \"\\f402\"; }\n\n\n\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/header.php",
    "content": "<?php\n/**\n * The template for displaying the header\n *\n * Displays all of the head element and everything up until the \"site-content\" div.\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\n?><!DOCTYPE html>\n<html <?php language_attributes(); ?> class=\"no-js\">\n<head>\n\t<meta charset=\"<?php bloginfo( 'charset' ); ?>\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t<link rel=\"profile\" href=\"http://gmpg.org/xfn/11\">\n\t<?php if ( is_singular() && pings_open( get_queried_object() ) ) : ?>\n\t<link rel=\"pingback\" href=\"<?php bloginfo( 'pingback_url' ); ?>\">\n\t<?php endif; ?>\n\t<?php wp_head(); ?>\n</head>\n\n<body <?php body_class(); ?>>\n<div id=\"page\" class=\"site\">\n\t<div class=\"site-inner\">\n\t\t<a class=\"skip-link screen-reader-text\" href=\"#content\"><?php _e( 'Skip to content', 'twentysixteen' ); ?></a>\n\n\t\t<header id=\"masthead\" class=\"site-header\" role=\"banner\">\n\t\t\t<div class=\"site-header-main\">\n\t\t\t\t<div class=\"site-branding\">\n\t\t\t\t\t<?php if ( is_front_page() && is_home() ) : ?>\n\t\t\t\t\t\t<h1 class=\"site-title\"><a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" rel=\"home\"><?php bloginfo( 'name' ); ?></a></h1>\n\t\t\t\t\t<?php else : ?>\n\t\t\t\t\t\t<p class=\"site-title\"><a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" rel=\"home\"><?php bloginfo( 'name' ); ?></a></p>\n\t\t\t\t\t<?php endif;\n\n\t\t\t\t\t$description = get_bloginfo( 'description', 'display' );\n\t\t\t\t\tif ( $description || is_customize_preview() ) : ?>\n\t\t\t\t\t\t<p class=\"site-description\"><?php echo $description; ?></p>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t</div><!-- .site-branding -->\n\n\t\t\t\t<?php if ( has_nav_menu( 'primary' ) || has_nav_menu( 'social' ) ) : ?>\n\t\t\t\t\t<button id=\"menu-toggle\" class=\"menu-toggle\"><?php _e( 'Menu', 'twentysixteen' ); ?></button>\n\n\t\t\t\t\t<div id=\"site-header-menu\" class=\"site-header-menu\">\n\t\t\t\t\t\t<?php if ( has_nav_menu( 'primary' ) ) : ?>\n\t\t\t\t\t\t\t<nav id=\"site-navigation\" class=\"main-navigation\" role=\"navigation\" aria-label=\"<?php esc_attr_e( 'Primary Menu', 'twentysixteen' ); ?>\">\n\t\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\t\twp_nav_menu( array(\n\t\t\t\t\t\t\t\t\t\t'theme_location' => 'primary',\n\t\t\t\t\t\t\t\t\t\t'menu_class'     => 'primary-menu',\n\t\t\t\t\t\t\t\t\t ) );\n\t\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t</nav><!-- .main-navigation -->\n\t\t\t\t\t\t<?php endif; ?>\n\n\t\t\t\t\t\t<?php if ( has_nav_menu( 'social' ) ) : ?>\n\t\t\t\t\t\t\t<nav id=\"social-navigation\" class=\"social-navigation\" role=\"navigation\" aria-label=\"<?php esc_attr_e( 'Social Links Menu', 'twentysixteen' ); ?>\">\n\t\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\t\twp_nav_menu( array(\n\t\t\t\t\t\t\t\t\t\t'theme_location' => 'social',\n\t\t\t\t\t\t\t\t\t\t'menu_class'     => 'social-links-menu',\n\t\t\t\t\t\t\t\t\t\t'depth'          => 1,\n\t\t\t\t\t\t\t\t\t\t'link_before'    => '<span class=\"screen-reader-text\">',\n\t\t\t\t\t\t\t\t\t\t'link_after'     => '</span>',\n\t\t\t\t\t\t\t\t\t) );\n\t\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t</nav><!-- .social-navigation -->\n\t\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t</div><!-- .site-header-menu -->\n\t\t\t\t<?php endif; ?>\n\t\t\t</div><!-- .site-header-main -->\n\n\t\t\t<?php if ( get_header_image() ) : ?>\n\t\t\t\t<?php\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the default twentysixteen custom header sizes attribute.\n\t\t\t\t\t *\n\t\t\t\t\t * @since Twenty Sixteen 1.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param string $custom_header_sizes sizes attribute\n\t\t\t\t\t * for Custom Header. Default '(max-width: 709px) 85vw,\n\t\t\t\t\t * (max-width: 909px) 81vw, (max-width: 1362px) 88vw, 1200px'.\n\t\t\t\t\t */\n\t\t\t\t\t$custom_header_sizes = apply_filters( 'twentysixteen_custom_header_sizes', '(max-width: 709px) 85vw, (max-width: 909px) 81vw, (max-width: 1362px) 88vw, 1200px' );\n\t\t\t\t?>\n\t\t\t\t<div class=\"header-image\">\n\t\t\t\t\t<a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" rel=\"home\">\n\t\t\t\t\t\t<img src=\"<?php header_image(); ?>\" srcset=\"<?php echo esc_attr( wp_get_attachment_image_srcset( get_custom_header()->attachment_id ) ); ?>\" sizes=\"<?php echo esc_attr( $custom_header_sizes ); ?>\" width=\"<?php echo esc_attr( get_custom_header()->width ); ?>\" height=\"<?php echo esc_attr( get_custom_header()->height ); ?>\" alt=\"<?php echo esc_attr( get_bloginfo( 'name', 'display' ) ); ?>\">\n\t\t\t\t\t</a>\n\t\t\t\t</div><!-- .header-image -->\n\t\t\t<?php endif; // End header image check. ?>\n\t\t</header><!-- .site-header -->\n\n\t\t<div id=\"content\" class=\"site-content\">\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/image.php",
    "content": "<?php\n/**\n * The template for displaying image attachments\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t\t<?php\n\t\t\t\t// Start the loop.\n\t\t\t\twhile ( have_posts() ) : the_post();\n\t\t\t?>\n\n\t\t\t\t<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\n\t\t\t\t\t<nav id=\"image-navigation\" class=\"navigation image-navigation\">\n\t\t\t\t\t\t<div class=\"nav-links\">\n\t\t\t\t\t\t\t<div class=\"nav-previous\"><?php previous_image_link( false, __( 'Previous Image', 'twentysixteen' ) ); ?></div>\n\t\t\t\t\t\t\t<div class=\"nav-next\"><?php next_image_link( false, __( 'Next Image', 'twentysixteen' ) ); ?></div>\n\t\t\t\t\t\t</div><!-- .nav-links -->\n\t\t\t\t\t</nav><!-- .image-navigation -->\n\n\t\t\t\t\t<header class=\"entry-header\">\n\t\t\t\t\t\t<?php the_title( '<h1 class=\"entry-title\">', '</h1>' ); ?>\n\t\t\t\t\t</header><!-- .entry-header -->\n\n\t\t\t\t\t<div class=\"entry-content\">\n\n\t\t\t\t\t\t<div class=\"entry-attachment\">\n\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Filter the default twentysixteen image attachment size.\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t * @since Twenty Sixteen 1.0\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t * @param string $image_size Image size. Default 'large'.\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\t$image_size = apply_filters( 'twentysixteen_attachment_size', 'large' );\n\n\t\t\t\t\t\t\t\techo wp_get_attachment_image( get_the_ID(), $image_size );\n\t\t\t\t\t\t\t?>\n\n\t\t\t\t\t\t\t<?php twentysixteen_excerpt( 'entry-caption' ); ?>\n\n\t\t\t\t\t\t</div><!-- .entry-attachment -->\n\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\tthe_content();\n\t\t\t\t\t\t\twp_link_pages( array(\n\t\t\t\t\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentysixteen' ) . '</span>',\n\t\t\t\t\t\t\t\t'after'       => '</div>',\n\t\t\t\t\t\t\t\t'link_before' => '<span>',\n\t\t\t\t\t\t\t\t'link_after'  => '</span>',\n\t\t\t\t\t\t\t\t'pagelink'    => '<span class=\"screen-reader-text\">' . __( 'Page', 'twentysixteen' ) . ' </span>%',\n\t\t\t\t\t\t\t\t'separator'   => '<span class=\"screen-reader-text\">, </span>',\n\t\t\t\t\t\t\t) );\n\t\t\t\t\t\t?>\n\t\t\t\t\t</div><!-- .entry-content -->\n\n\t\t\t\t\t<footer class=\"entry-footer\">\n\t\t\t\t\t\t<?php twentysixteen_entry_meta(); ?>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t// Retrieve attachment metadata.\n\t\t\t\t\t\t\t$metadata = wp_get_attachment_metadata();\n\t\t\t\t\t\t\tif ( $metadata ) {\n\t\t\t\t\t\t\t\tprintf( '<span class=\"full-size-link\"><span class=\"screen-reader-text\">%1$s </span><a href=\"%2$s\">%3$s &times; %4$s</a></span>',\n\t\t\t\t\t\t\t\t\tesc_html_x( 'Full size', 'Used before full size attachment link.', 'twentysixteen' ),\n\t\t\t\t\t\t\t\t\tesc_url( wp_get_attachment_url() ),\n\t\t\t\t\t\t\t\t\tabsint( $metadata['width'] ),\n\t\t\t\t\t\t\t\t\tabsint( $metadata['height'] )\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t?>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\tedit_post_link(\n\t\t\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\t\t\t/* translators: %s: Name of current post */\n\t\t\t\t\t\t\t\t\t__( 'Edit<span class=\"screen-reader-text\"> \"%s\"</span>', 'twentysixteen' ),\n\t\t\t\t\t\t\t\t\tget_the_title()\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t'<span class=\"edit-link\">',\n\t\t\t\t\t\t\t\t'</span>'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t?>\n\t\t\t\t\t</footer><!-- .entry-footer -->\n\t\t\t\t</article><!-- #post-## -->\n\n\t\t\t\t<?php\n\t\t\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\t\t\tif ( comments_open() || get_comments_number() ) {\n\t\t\t\t\t\tcomments_template();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Parent post navigation.\n\t\t\t\t\tthe_post_navigation( array(\n\t\t\t\t\t\t'prev_text' => _x( '<span class=\"meta-nav\">Published in</span><span class=\"post-title\">%title</span>', 'Parent post link', 'twentysixteen' ),\n\t\t\t\t\t) );\n\t\t\t\t// End the loop.\n\t\t\t\tendwhile;\n\t\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</div><!-- .content-area -->\n\n<?php get_sidebar(); ?>\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/inc/back-compat.php",
    "content": "<?php\n/**\n * Twenty Sixteen back compat functionality\n *\n * Prevents Twenty Sixteen from running on WordPress versions prior to 4.4,\n * since this theme is not meant to be backward compatible beyond that and\n * relies on many newer functions and markup changes introduced in 4.4.\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\n/**\n * Prevent switching to Twenty Sixteen on old versions of WordPress.\n *\n * Switches to the default theme.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_switch_theme() {\n\tswitch_theme( WP_DEFAULT_THEME, WP_DEFAULT_THEME );\n\n\tunset( $_GET['activated'] );\n\n\tadd_action( 'admin_notices', 'twentysixteen_upgrade_notice' );\n}\nadd_action( 'after_switch_theme', 'twentysixteen_switch_theme' );\n\n/**\n * Adds a message for unsuccessful theme switch.\n *\n * Prints an update nag after an unsuccessful attempt to switch to\n * Twenty Sixteen on WordPress versions prior to 4.4.\n *\n * @since Twenty Sixteen 1.0\n *\n * @global string $wp_version WordPress version.\n */\nfunction twentysixteen_upgrade_notice() {\n\t$message = sprintf( __( 'Twenty Sixteen requires at least WordPress version 4.4. You are running version %s. Please upgrade and try again.', 'twentysixteen' ), $GLOBALS['wp_version'] );\n\tprintf( '<div class=\"error\"><p>%s</p></div>', $message );\n}\n\n/**\n * Prevents the Customizer from being loaded on WordPress versions prior to 4.4.\n *\n * @since Twenty Sixteen 1.0\n *\n * @global string $wp_version WordPress version.\n */\nfunction twentysixteen_customize() {\n\twp_die( sprintf( __( 'Twenty Sixteen requires at least WordPress version 4.4. You are running version %s. Please upgrade and try again.', 'twentysixteen' ), $GLOBALS['wp_version'] ), '', array(\n\t\t'back_link' => true,\n\t) );\n}\nadd_action( 'load-customize.php', 'twentysixteen_customize' );\n\n/**\n * Prevents the Theme Preview from being loaded on WordPress versions prior to 4.4.\n *\n * @since Twenty Sixteen 1.0\n *\n * @global string $wp_version WordPress version.\n */\nfunction twentysixteen_preview() {\n\tif ( isset( $_GET['preview'] ) ) {\n\t\twp_die( sprintf( __( 'Twenty Sixteen requires at least WordPress version 4.4. You are running version %s. Please upgrade and try again.', 'twentysixteen' ), $GLOBALS['wp_version'] ) );\n\t}\n}\nadd_action( 'template_redirect', 'twentysixteen_preview' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/inc/customizer.php",
    "content": "<?php\n/**\n * Twenty Sixteen Customizer functionality\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\n/**\n * Sets up the WordPress core custom header and custom background features.\n *\n * @since Twenty Sixteen 1.0\n *\n * @see twentysixteen_header_style()\n */\nfunction twentysixteen_custom_header_and_background() {\n\t$color_scheme             = twentysixteen_get_color_scheme();\n\t$default_background_color = trim( $color_scheme[0], '#' );\n\t$default_text_color       = trim( $color_scheme[3], '#' );\n\n\t/**\n\t * Filter the arguments used when adding 'custom-background' support in Twenty Sixteen.\n\t *\n\t * @since Twenty Sixteen 1.0\n\t *\n\t * @param array $args {\n\t *     An array of custom-background support arguments.\n\t *\n\t *     @type string $default-color Default color of the background.\n\t * }\n\t */\n\tadd_theme_support( 'custom-background', apply_filters( 'twentysixteen_custom_background_args', array(\n\t\t'default-color' => $default_background_color,\n\t) ) );\n\n\t/**\n\t * Filter the arguments used when adding 'custom-header' support in Twenty Sixteen.\n\t *\n\t * @since Twenty Sixteen 1.0\n\t *\n\t * @param array $args {\n\t *     An array of custom-header support arguments.\n\t *\n\t *     @type string $default-text-color Default color of the header text.\n\t *     @type int      $width            Width in pixels of the custom header image. Default 1200.\n\t *     @type int      $height           Height in pixels of the custom header image. Default 280.\n\t *     @type bool     $flex-height      Whether to allow flexible-height header images. Default true.\n\t *     @type callable $wp-head-callback Callback function used to style the header image and text\n\t *                                      displayed on the blog.\n\t * }\n\t */\n\tadd_theme_support( 'custom-header', apply_filters( 'twentysixteen_custom_header_args', array(\n\t\t'default-text-color'     => $default_text_color,\n\t\t'width'                  => 1200,\n\t\t'height'                 => 280,\n\t\t'flex-height'            => true,\n\t\t'wp-head-callback'       => 'twentysixteen_header_style',\n\t) ) );\n}\nadd_action( 'after_setup_theme', 'twentysixteen_custom_header_and_background' );\n\nif ( ! function_exists( 'twentysixteen_header_style' ) ) :\n/**\n * Styles the header text displayed on the site.\n *\n * Create your own twentysixteen_header_style() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n *\n * @see twentysixteen_custom_header_and_background().\n */\nfunction twentysixteen_header_style() {\n\t// If the header text option is untouched, let's bail.\n\tif ( display_header_text() ) {\n\t\treturn;\n\t}\n\n\t// If the header text has been hidden.\n\t?>\n\t<style type=\"text/css\" id=\"twentysixteen-header-css\">\n\t\t.site-branding {\n\t\t\tmargin: 0 auto 0 0;\n\t\t}\n\n\t\t.site-branding .site-title,\n\t\t.site-description {\n\t\t\tclip: rect(1px, 1px, 1px, 1px);\n\t\t\tposition: absolute;\n\t\t}\n\t</style>\n\t<?php\n}\nendif; // twentysixteen_header_style\n\n/**\n * Adds postMessage support for site title and description for the Customizer.\n *\n * @since Twenty Sixteen 1.0\n *\n * @param WP_Customize_Manager $wp_customize The Customizer object.\n */\nfunction twentysixteen_customize_register( $wp_customize ) {\n\t$color_scheme = twentysixteen_get_color_scheme();\n\n\t$wp_customize->get_setting( 'blogname' )->transport         = 'postMessage';\n\t$wp_customize->get_setting( 'blogdescription' )->transport  = 'postMessage';\n\n\t// Add color scheme setting and control.\n\t$wp_customize->add_setting( 'color_scheme', array(\n\t\t'default'           => 'default',\n\t\t'sanitize_callback' => 'twentysixteen_sanitize_color_scheme',\n\t\t'transport'         => 'postMessage',\n\t) );\n\n\t$wp_customize->add_control( 'color_scheme', array(\n\t\t'label'    => __( 'Base Color Scheme', 'twentysixteen' ),\n\t\t'section'  => 'colors',\n\t\t'type'     => 'select',\n\t\t'choices'  => twentysixteen_get_color_scheme_choices(),\n\t\t'priority' => 1,\n\t) );\n\n\t// Add page background color setting and control.\n\t$wp_customize->add_setting( 'page_background_color', array(\n\t\t'default'           => $color_scheme[1],\n\t\t'sanitize_callback' => 'sanitize_hex_color',\n\t\t'transport'         => 'postMessage',\n\t) );\n\n\t$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'page_background_color', array(\n\t\t'label'       => __( 'Page Background Color', 'twentysixteen' ),\n\t\t'section'     => 'colors',\n\t) ) );\n\n\t// Remove the core header textcolor control, as it shares the main text color.\n\t$wp_customize->remove_control( 'header_textcolor' );\n\n\t// Add link color setting and control.\n\t$wp_customize->add_setting( 'link_color', array(\n\t\t'default'           => $color_scheme[2],\n\t\t'sanitize_callback' => 'sanitize_hex_color',\n\t\t'transport'         => 'postMessage',\n\t) );\n\n\t$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'link_color', array(\n\t\t'label'       => __( 'Link Color', 'twentysixteen' ),\n\t\t'section'     => 'colors',\n\t) ) );\n\n\t// Add main text color setting and control.\n\t$wp_customize->add_setting( 'main_text_color', array(\n\t\t'default'           => $color_scheme[3],\n\t\t'sanitize_callback' => 'sanitize_hex_color',\n\t\t'transport'         => 'postMessage',\n\t) );\n\n\t$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'main_text_color', array(\n\t\t'label'       => __( 'Main Text Color', 'twentysixteen' ),\n\t\t'section'     => 'colors',\n\t) ) );\n\n\t// Add secondary text color setting and control.\n\t$wp_customize->add_setting( 'secondary_text_color', array(\n\t\t'default'           => $color_scheme[4],\n\t\t'sanitize_callback' => 'sanitize_hex_color',\n\t\t'transport'         => 'postMessage',\n\t) );\n\n\t$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'secondary_text_color', array(\n\t\t'label'       => __( 'Secondary Text Color', 'twentysixteen' ),\n\t\t'section'     => 'colors',\n\t) ) );\n}\nadd_action( 'customize_register', 'twentysixteen_customize_register', 11 );\n\n/**\n * Registers color schemes for Twenty Sixteen.\n *\n * Can be filtered with {@see 'twentysixteen_color_schemes'}.\n *\n * The order of colors in a colors array:\n * 1. Main Background Color.\n * 2. Page Background Color.\n * 3. Link Color.\n * 4. Main Text Color.\n * 5. Secondary Text Color.\n *\n * @since Twenty Sixteen 1.0\n *\n * @return array An associative array of color scheme options.\n */\nfunction twentysixteen_get_color_schemes() {\n\t/**\n\t * Filter the color schemes registered for use with Twenty Sixteen.\n\t *\n\t * The default schemes include 'default', 'dark', 'gray', 'red', and 'yellow'.\n\t *\n\t * @since Twenty Sixteen 1.0\n\t *\n\t * @param array $schemes {\n\t *     Associative array of color schemes data.\n\t *\n\t *     @type array $slug {\n\t *         Associative array of information for setting up the color scheme.\n\t *\n\t *         @type string $label  Color scheme label.\n\t *         @type array  $colors HEX codes for default colors prepended with a hash symbol ('#').\n\t *                              Colors are defined in the following order: Main background, page\n\t *                              background, link, main text, secondary text.\n\t *     }\n\t * }\n\t */\n\treturn apply_filters( 'twentysixteen_color_schemes', array(\n\t\t'default' => array(\n\t\t\t'label'  => __( 'Default', 'twentysixteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#1a1a1a',\n\t\t\t\t'#ffffff',\n\t\t\t\t'#007acc',\n\t\t\t\t'#1a1a1a',\n\t\t\t\t'#686868',\n\t\t\t),\n\t\t),\n\t\t'dark' => array(\n\t\t\t'label'  => __( 'Dark', 'twentysixteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#262626',\n\t\t\t\t'#1a1a1a',\n\t\t\t\t'#9adffd',\n\t\t\t\t'#e5e5e5',\n\t\t\t\t'#c1c1c1',\n\t\t\t),\n\t\t),\n\t\t'gray' => array(\n\t\t\t'label'  => __( 'Gray', 'twentysixteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#616a73',\n\t\t\t\t'#4d545c',\n\t\t\t\t'#c7c7c7',\n\t\t\t\t'#f2f2f2',\n\t\t\t\t'#f2f2f2',\n\t\t\t),\n\t\t),\n\t\t'red' => array(\n\t\t\t'label'  => __( 'Red', 'twentysixteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#ffffff',\n\t\t\t\t'#ff675f',\n\t\t\t\t'#640c1f',\n\t\t\t\t'#402b30',\n\t\t\t\t'#402b30',\n\t\t\t),\n\t\t),\n\t\t'yellow' => array(\n\t\t\t'label'  => __( 'Yellow', 'twentysixteen' ),\n\t\t\t'colors' => array(\n\t\t\t\t'#3b3721',\n\t\t\t\t'#ffef8e',\n\t\t\t\t'#774e24',\n\t\t\t\t'#3b3721',\n\t\t\t\t'#5b4d3e',\n\t\t\t),\n\t\t),\n\t) );\n}\n\nif ( ! function_exists( 'twentysixteen_get_color_scheme' ) ) :\n/**\n * Retrieves the current Twenty Sixteen color scheme.\n *\n * Create your own twentysixteen_get_color_scheme() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n *\n * @return array An associative array of either the current or default color scheme HEX values.\n */\nfunction twentysixteen_get_color_scheme() {\n\t$color_scheme_option = get_theme_mod( 'color_scheme', 'default' );\n\t$color_schemes       = twentysixteen_get_color_schemes();\n\n\tif ( array_key_exists( $color_scheme_option, $color_schemes ) ) {\n\t\treturn $color_schemes[ $color_scheme_option ]['colors'];\n\t}\n\n\treturn $color_schemes['default']['colors'];\n}\nendif; // twentysixteen_get_color_scheme\n\nif ( ! function_exists( 'twentysixteen_get_color_scheme_choices' ) ) :\n/**\n * Retrieves an array of color scheme choices registered for Twenty Sixteen.\n *\n * Create your own twentysixteen_get_color_scheme_choices() function to override\n * in a child theme.\n *\n * @since Twenty Sixteen 1.0\n *\n * @return array Array of color schemes.\n */\nfunction twentysixteen_get_color_scheme_choices() {\n\t$color_schemes                = twentysixteen_get_color_schemes();\n\t$color_scheme_control_options = array();\n\n\tforeach ( $color_schemes as $color_scheme => $value ) {\n\t\t$color_scheme_control_options[ $color_scheme ] = $value['label'];\n\t}\n\n\treturn $color_scheme_control_options;\n}\nendif; // twentysixteen_get_color_scheme_choices\n\n\nif ( ! function_exists( 'twentysixteen_sanitize_color_scheme' ) ) :\n/**\n * Handles sanitization for Twenty Sixteen color schemes.\n *\n * Create your own twentysixteen_sanitize_color_scheme() function to override\n * in a child theme.\n *\n * @since Twenty Sixteen 1.0\n *\n * @param string $value Color scheme name value.\n * @return string Color scheme name.\n */\nfunction twentysixteen_sanitize_color_scheme( $value ) {\n\t$color_schemes = twentysixteen_get_color_scheme_choices();\n\n\tif ( ! array_key_exists( $value, $color_schemes ) ) {\n\t\treturn 'default';\n\t}\n\n\treturn $value;\n}\nendif; // twentysixteen_sanitize_color_scheme\n\n/**\n * Enqueues front-end CSS for color scheme.\n *\n * @since Twenty Sixteen 1.0\n *\n * @see wp_add_inline_style()\n */\nfunction twentysixteen_color_scheme_css() {\n\t$color_scheme_option = get_theme_mod( 'color_scheme', 'default' );\n\n\t// Don't do anything if the default color scheme is selected.\n\tif ( 'default' === $color_scheme_option ) {\n\t\treturn;\n\t}\n\n\t$color_scheme = twentysixteen_get_color_scheme();\n\n\t// Convert main text hex color to rgba.\n\t$color_textcolor_rgb = twentysixteen_hex2rgb( $color_scheme[3] );\n\n\t// If the rgba values are empty return early.\n\tif ( empty( $color_textcolor_rgb ) ) {\n\t\treturn;\n\t}\n\n\t// If we get this far, we have a custom color scheme.\n\t$colors = array(\n\t\t'background_color'      => $color_scheme[0],\n\t\t'page_background_color' => $color_scheme[1],\n\t\t'link_color'            => $color_scheme[2],\n\t\t'main_text_color'       => $color_scheme[3],\n\t\t'secondary_text_color'  => $color_scheme[4],\n\t\t'border_color'          => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.2)', $color_textcolor_rgb ),\n\n\t);\n\n\t$color_scheme_css = twentysixteen_get_color_scheme_css( $colors );\n\n\twp_add_inline_style( 'twentysixteen-style', $color_scheme_css );\n}\nadd_action( 'wp_enqueue_scripts', 'twentysixteen_color_scheme_css' );\n\n/**\n * Binds the JS listener to make Customizer color_scheme control.\n *\n * Passes color scheme data as colorScheme global.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_customize_control_js() {\n\twp_enqueue_script( 'color-scheme-control', get_template_directory_uri() . '/js/color-scheme-control.js', array( 'customize-controls', 'iris', 'underscore', 'wp-util' ), '20150926', true );\n\twp_localize_script( 'color-scheme-control', 'colorScheme', twentysixteen_get_color_schemes() );\n}\nadd_action( 'customize_controls_enqueue_scripts', 'twentysixteen_customize_control_js' );\n\n/**\n * Binds JS handlers to make the Customizer preview reload changes asynchronously.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_customize_preview_js() {\n\twp_enqueue_script( 'twentysixteen-customize-preview', get_template_directory_uri() . '/js/customize-preview.js', array( 'customize-preview' ), '20150922', true );\n}\nadd_action( 'customize_preview_init', 'twentysixteen_customize_preview_js' );\n\n/**\n * Returns CSS for the color schemes.\n *\n * @since Twenty Sixteen 1.0\n *\n * @param array $colors Color scheme colors.\n * @return string Color scheme CSS.\n */\nfunction twentysixteen_get_color_scheme_css( $colors ) {\n\t$colors = wp_parse_args( $colors, array(\n\t\t'background_color'      => '',\n\t\t'page_background_color' => '',\n\t\t'link_color'            => '',\n\t\t'main_text_color'       => '',\n\t\t'secondary_text_color'  => '',\n\t\t'border_color'          => '',\n\t) );\n\n\treturn <<<CSS\n\t/* Color Scheme */\n\n\t/* Background Color */\n\tbody {\n\t\tbackground-color: {$colors['background_color']};\n\t}\n\n\t/* Page Background Color */\n\t.site {\n\t\tbackground-color: {$colors['page_background_color']};\n\t}\n\n\tmark,\n\tins,\n\tbutton,\n\tbutton[disabled]:hover,\n\tbutton[disabled]:focus,\n\tinput[type=\"button\"],\n\tinput[type=\"button\"][disabled]:hover,\n\tinput[type=\"button\"][disabled]:focus,\n\tinput[type=\"reset\"],\n\tinput[type=\"reset\"][disabled]:hover,\n\tinput[type=\"reset\"][disabled]:focus,\n\tinput[type=\"submit\"],\n\tinput[type=\"submit\"][disabled]:hover,\n\tinput[type=\"submit\"][disabled]:focus,\n\t.menu-toggle.toggled-on,\n\t.menu-toggle.toggled-on:hover,\n\t.menu-toggle.toggled-on:focus,\n\t.pagination .prev,\n\t.pagination .next,\n\t.pagination .prev:hover,\n\t.pagination .prev:focus,\n\t.pagination .next:hover,\n\t.pagination .next:focus,\n\t.pagination .nav-links:before,\n\t.pagination .nav-links:after,\n\t.widget_calendar tbody a,\n\t.widget_calendar tbody a:hover,\n\t.widget_calendar tbody a:focus,\n\t.page-links a,\n\t.page-links a:hover,\n\t.page-links a:focus {\n\t\tcolor: {$colors['page_background_color']};\n\t}\n\n\t/* Link Color */\n\t.menu-toggle:hover,\n\t.menu-toggle:focus,\n\ta,\n\t.main-navigation a:hover,\n\t.main-navigation a:focus,\n\t.dropdown-toggle:hover,\n\t.dropdown-toggle:focus,\n\t.social-navigation a:hover:before,\n\t.social-navigation a:focus:before,\n\t.post-navigation a:hover .post-title,\n\t.post-navigation a:focus .post-title,\n\t.tagcloud a:hover,\n\t.tagcloud a:focus,\n\t.site-branding .site-title a:hover,\n\t.site-branding .site-title a:focus,\n\t.entry-title a:hover,\n\t.entry-title a:focus,\n\t.entry-footer a:hover,\n\t.entry-footer a:focus,\n\t.comment-metadata a:hover,\n\t.comment-metadata a:focus,\n\t.pingback .comment-edit-link:hover,\n\t.pingback .comment-edit-link:focus,\n\t.comment-reply-link,\n\t.comment-reply-link:hover,\n\t.comment-reply-link:focus,\n\t.required,\n\t.site-info a:hover,\n\t.site-info a:focus {\n\t\tcolor: {$colors['link_color']};\n\t}\n\n\tmark,\n\tins,\n\tbutton:hover,\n\tbutton:focus,\n\tinput[type=\"button\"]:hover,\n\tinput[type=\"button\"]:focus,\n\tinput[type=\"reset\"]:hover,\n\tinput[type=\"reset\"]:focus,\n\tinput[type=\"submit\"]:hover,\n\tinput[type=\"submit\"]:focus,\n\t.pagination .prev:hover,\n\t.pagination .prev:focus,\n\t.pagination .next:hover,\n\t.pagination .next:focus,\n\t.widget_calendar tbody a,\n\t.page-links a:hover,\n\t.page-links a:focus {\n\t\tbackground-color: {$colors['link_color']};\n\t}\n\n\tinput[type=\"text\"]:focus,\n\tinput[type=\"email\"]:focus,\n\tinput[type=\"url\"]:focus,\n\tinput[type=\"password\"]:focus,\n\tinput[type=\"search\"]:focus,\n\ttextarea:focus,\n\t.tagcloud a:hover,\n\t.tagcloud a:focus,\n\t.menu-toggle:hover,\n\t.menu-toggle:focus {\n\t\tborder-color: {$colors['link_color']};\n\t}\n\n\t/* Main Text Color */\n\tbody,\n\tblockquote cite,\n\tblockquote small,\n\t.main-navigation a,\n\t.menu-toggle,\n\t.dropdown-toggle,\n\t.social-navigation a,\n\t.post-navigation a,\n\t.pagination a:hover,\n\t.pagination a:focus,\n\t.widget-title a,\n\t.site-branding .site-title a,\n\t.entry-title a,\n\t.page-links > .page-links-title,\n\t.comment-author,\n\t.comment-reply-title small a:hover,\n\t.comment-reply-title small a:focus {\n\t\tcolor: {$colors['main_text_color']};\n\t}\n\n\tblockquote,\n\t.menu-toggle.toggled-on,\n\t.menu-toggle.toggled-on:hover,\n\t.menu-toggle.toggled-on:focus,\n\t.post-navigation,\n\t.post-navigation div + div,\n\t.pagination,\n\t.widget,\n\t.page-header,\n\t.page-links a,\n\t.comments-title,\n\t.comment-reply-title {\n\t\tborder-color: {$colors['main_text_color']};\n\t}\n\n\tbutton,\n\tbutton[disabled]:hover,\n\tbutton[disabled]:focus,\n\tinput[type=\"button\"],\n\tinput[type=\"button\"][disabled]:hover,\n\tinput[type=\"button\"][disabled]:focus,\n\tinput[type=\"reset\"],\n\tinput[type=\"reset\"][disabled]:hover,\n\tinput[type=\"reset\"][disabled]:focus,\n\tinput[type=\"submit\"],\n\tinput[type=\"submit\"][disabled]:hover,\n\tinput[type=\"submit\"][disabled]:focus,\n\t.menu-toggle.toggled-on,\n\t.menu-toggle.toggled-on:hover,\n\t.menu-toggle.toggled-on:focus,\n\t.pagination:before,\n\t.pagination:after,\n\t.pagination .prev,\n\t.pagination .next,\n\t.page-links a {\n\t\tbackground-color: {$colors['main_text_color']};\n\t}\n\n\t/* Secondary Text Color */\n\n\t/**\n\t * IE8 and earlier will drop any block with CSS3 selectors.\n\t * Do not combine these styles with the next block.\n\t */\n\tbody:not(.search-results) .entry-summary {\n\t\tcolor: {$colors['secondary_text_color']};\n\t}\n\n\tblockquote,\n\t.post-password-form label,\n\ta:hover,\n\ta:focus,\n\ta:active,\n\t.post-navigation .meta-nav,\n\t.image-navigation,\n\t.comment-navigation,\n\t.widget_recent_entries .post-date,\n\t.widget_rss .rss-date,\n\t.widget_rss cite,\n\t.site-description,\n\t.author-bio,\n\t.entry-footer,\n\t.entry-footer a,\n\t.sticky-post,\n\t.taxonomy-description,\n\t.entry-caption,\n\t.comment-metadata,\n\t.pingback .edit-link,\n\t.comment-metadata a,\n\t.pingback .comment-edit-link,\n\t.comment-form label,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.logged-in-as,\n\t.form-allowed-tags,\n\t.site-info,\n\t.site-info a,\n\t.wp-caption .wp-caption-text,\n\t.gallery-caption,\n\t.widecolumn label,\n\t.widecolumn .mu_register label {\n\t\tcolor: {$colors['secondary_text_color']};\n\t}\n\n\t.widget_calendar tbody a:hover,\n\t.widget_calendar tbody a:focus {\n\t\tbackground-color: {$colors['secondary_text_color']};\n\t}\n\n\t/* Border Color */\n\tfieldset,\n\tpre,\n\tabbr,\n\tacronym,\n\ttable,\n\tth,\n\ttd,\n\tinput[type=\"text\"],\n\tinput[type=\"email\"],\n\tinput[type=\"url\"],\n\tinput[type=\"password\"],\n\tinput[type=\"search\"],\n\ttextarea,\n\t.main-navigation li,\n\t.main-navigation .primary-menu,\n\t.menu-toggle,\n\t.dropdown-toggle:after,\n\t.social-navigation a,\n\t.image-navigation,\n\t.comment-navigation,\n\t.tagcloud a,\n\t.entry-content,\n\t.entry-summary,\n\t.page-links a,\n\t.page-links > span,\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback,\n\t.comment-reply-link,\n\t.no-comments,\n\t.widecolumn .mu_register .mu_alert {\n\t\tborder-color: {$colors['main_text_color']}; /* Fallback for IE7 and IE8 */\n\t\tborder-color: {$colors['border_color']};\n\t}\n\n\thr,\n\tcode {\n\t\tbackground-color: {$colors['main_text_color']}; /* Fallback for IE7 and IE8 */\n\t\tbackground-color: {$colors['border_color']};\n\t}\n\n\t@media screen and (min-width: 56.875em) {\n\t\t.main-navigation li:hover > a,\n\t\t.main-navigation li.focus > a {\n\t\t\tcolor: {$colors['link_color']};\n\t\t}\n\n\t\t.main-navigation ul ul,\n\t\t.main-navigation ul ul li {\n\t\t\tborder-color: {$colors['border_color']};\n\t\t}\n\n\t\t.main-navigation ul ul:before {\n\t\t\tborder-top-color: {$colors['border_color']};\n\t\t\tborder-bottom-color: {$colors['border_color']};\n\t\t}\n\n\t\t.main-navigation ul ul li {\n\t\t\tbackground-color: {$colors['page_background_color']};\n\t\t}\n\n\t\t.main-navigation ul ul:after {\n\t\t\tborder-top-color: {$colors['page_background_color']};\n\t\t\tborder-bottom-color: {$colors['page_background_color']};\n\t\t}\n\t}\n\nCSS;\n}\n\n\n/**\n * Outputs an Underscore template for generating CSS for the color scheme.\n *\n * The template generates the css dynamically for instant display in the\n * Customizer preview.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_color_scheme_css_template() {\n\t$colors = array(\n\t\t'background_color'      => '{{ data.background_color }}',\n\t\t'page_background_color' => '{{ data.page_background_color }}',\n\t\t'link_color'            => '{{ data.link_color }}',\n\t\t'main_text_color'       => '{{ data.main_text_color }}',\n\t\t'secondary_text_color'  => '{{ data.secondary_text_color }}',\n\t\t'border_color'          => '{{ data.border_color }}',\n\t);\n\t?>\n\t<script type=\"text/html\" id=\"tmpl-twentysixteen-color-scheme\">\n\t\t<?php echo twentysixteen_get_color_scheme_css( $colors ); ?>\n\t</script>\n\t<?php\n}\nadd_action( 'customize_controls_print_footer_scripts', 'twentysixteen_color_scheme_css_template' );\n\n/**\n * Enqueues front-end CSS for the page background color.\n *\n * @since Twenty Sixteen 1.0\n *\n * @see wp_add_inline_style()\n */\nfunction twentysixteen_page_background_color_css() {\n\t$color_scheme          = twentysixteen_get_color_scheme();\n\t$default_color         = $color_scheme[1];\n\t$page_background_color = get_theme_mod( 'page_background_color', $default_color );\n\n\t// Don't do anything if the current color is the default.\n\tif ( $page_background_color === $default_color ) {\n\t\treturn;\n\t}\n\n\t$css = '\n\t\t/* Custom Page Background Color */\n\t\t.site {\n\t\t\tbackground-color: %1$s;\n\t\t}\n\n\t\tmark,\n\t\tins,\n\t\tbutton,\n\t\tbutton[disabled]:hover,\n\t\tbutton[disabled]:focus,\n\t\tinput[type=\"button\"],\n\t\tinput[type=\"button\"][disabled]:hover,\n\t\tinput[type=\"button\"][disabled]:focus,\n\t\tinput[type=\"reset\"],\n\t\tinput[type=\"reset\"][disabled]:hover,\n\t\tinput[type=\"reset\"][disabled]:focus,\n\t\tinput[type=\"submit\"],\n\t\tinput[type=\"submit\"][disabled]:hover,\n\t\tinput[type=\"submit\"][disabled]:focus,\n\t\t.menu-toggle.toggled-on,\n\t\t.menu-toggle.toggled-on:hover,\n\t\t.menu-toggle.toggled-on:focus,\n\t\t.pagination .prev,\n\t\t.pagination .next,\n\t\t.pagination .prev:hover,\n\t\t.pagination .prev:focus,\n\t\t.pagination .next:hover,\n\t\t.pagination .next:focus,\n\t\t.pagination .nav-links:before,\n\t\t.pagination .nav-links:after,\n\t\t.widget_calendar tbody a,\n\t\t.widget_calendar tbody a:hover,\n\t\t.widget_calendar tbody a:focus,\n\t\t.page-links a,\n\t\t.page-links a:hover,\n\t\t.page-links a:focus {\n\t\t\tcolor: %1$s;\n\t\t}\n\n\t\t@media screen and (min-width: 56.875em) {\n\t\t\t.main-navigation ul ul li {\n\t\t\t\tbackground-color: %1$s;\n\t\t\t}\n\n\t\t\t.main-navigation ul ul:after {\n\t\t\t\tborder-top-color: %1$s;\n\t\t\t\tborder-bottom-color: %1$s;\n\t\t\t}\n\t\t}\n\t';\n\n\twp_add_inline_style( 'twentysixteen-style', sprintf( $css, $page_background_color ) );\n}\nadd_action( 'wp_enqueue_scripts', 'twentysixteen_page_background_color_css', 11 );\n\n/**\n * Enqueues front-end CSS for the link color.\n *\n * @since Twenty Sixteen 1.0\n *\n * @see wp_add_inline_style()\n */\nfunction twentysixteen_link_color_css() {\n\t$color_scheme    = twentysixteen_get_color_scheme();\n\t$default_color   = $color_scheme[2];\n\t$link_color = get_theme_mod( 'link_color', $default_color );\n\n\t// Don't do anything if the current color is the default.\n\tif ( $link_color === $default_color ) {\n\t\treturn;\n\t}\n\n\t$css = '\n\t\t/* Custom Link Color */\n\t\t.menu-toggle:hover,\n\t\t.menu-toggle:focus,\n\t\ta,\n\t\t.main-navigation a:hover,\n\t\t.main-navigation a:focus,\n\t\t.dropdown-toggle:hover,\n\t\t.dropdown-toggle:focus,\n\t\t.social-navigation a:hover:before,\n\t\t.social-navigation a:focus:before,\n\t\t.post-navigation a:hover .post-title,\n\t\t.post-navigation a:focus .post-title,\n\t\t.tagcloud a:hover,\n\t\t.tagcloud a:focus,\n\t\t.site-branding .site-title a:hover,\n\t\t.site-branding .site-title a:focus,\n\t\t.entry-title a:hover,\n\t\t.entry-title a:focus,\n\t\t.entry-footer a:hover,\n\t\t.entry-footer a:focus,\n\t\t.comment-metadata a:hover,\n\t\t.comment-metadata a:focus,\n\t\t.pingback .comment-edit-link:hover,\n\t\t.pingback .comment-edit-link:focus,\n\t\t.comment-reply-link,\n\t\t.comment-reply-link:hover,\n\t\t.comment-reply-link:focus,\n\t\t.required,\n\t\t.site-info a:hover,\n\t\t.site-info a:focus {\n\t\t\tcolor: %1$s;\n\t\t}\n\n\t\tmark,\n\t\tins,\n\t\tbutton:hover,\n\t\tbutton:focus,\n\t\tinput[type=\"button\"]:hover,\n\t\tinput[type=\"button\"]:focus,\n\t\tinput[type=\"reset\"]:hover,\n\t\tinput[type=\"reset\"]:focus,\n\t\tinput[type=\"submit\"]:hover,\n\t\tinput[type=\"submit\"]:focus,\n\t\t.pagination .prev:hover,\n\t\t.pagination .prev:focus,\n\t\t.pagination .next:hover,\n\t\t.pagination .next:focus,\n\t\t.widget_calendar tbody a,\n\t\t.page-links a:hover,\n\t\t.page-links a:focus {\n\t\t\tbackground-color: %1$s;\n\t\t}\n\n\t\tinput[type=\"text\"]:focus,\n\t\tinput[type=\"email\"]:focus,\n\t\tinput[type=\"url\"]:focus,\n\t\tinput[type=\"password\"]:focus,\n\t\tinput[type=\"search\"]:focus,\n\t\ttextarea:focus,\n\t\t.tagcloud a:hover,\n\t\t.tagcloud a:focus,\n\t\t.menu-toggle:hover,\n\t\t.menu-toggle:focus {\n\t\t\tborder-color: %1$s;\n\t\t}\n\n\t\t@media screen and (min-width: 56.875em) {\n\t\t\t.main-navigation li:hover > a,\n\t\t\t.main-navigation li.focus > a {\n\t\t\t\tcolor: %1$s;\n\t\t\t}\n\t\t}\n\t';\n\n\twp_add_inline_style( 'twentysixteen-style', sprintf( $css, $link_color ) );\n}\nadd_action( 'wp_enqueue_scripts', 'twentysixteen_link_color_css', 11 );\n\n/**\n * Enqueues front-end CSS for the main text color.\n *\n * @since Twenty Sixteen 1.0\n *\n * @see wp_add_inline_style()\n */\nfunction twentysixteen_main_text_color_css() {\n\t$color_scheme    = twentysixteen_get_color_scheme();\n\t$default_color   = $color_scheme[3];\n\t$main_text_color = get_theme_mod( 'main_text_color', $default_color );\n\n\t// Don't do anything if the current color is the default.\n\tif ( $main_text_color === $default_color ) {\n\t\treturn;\n\t}\n\n\t// Convert main text hex color to rgba.\n\t$main_text_color_rgb = twentysixteen_hex2rgb( $main_text_color );\n\n\t// If the rgba values are empty return early.\n\tif ( empty( $main_text_color_rgb ) ) {\n\t\treturn;\n\t}\n\n\t// If we get this far, we have a custom color scheme.\n\t$border_color = vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.2)', $main_text_color_rgb );\n\n\t$css = '\n\t\t/* Custom Main Text Color */\n\t\tbody,\n\t\tblockquote cite,\n\t\tblockquote small,\n\t\t.main-navigation a,\n\t\t.menu-toggle,\n\t\t.dropdown-toggle,\n\t\t.social-navigation a,\n\t\t.post-navigation a,\n\t\t.pagination a:hover,\n\t\t.pagination a:focus,\n\t\t.widget-title a,\n\t\t.site-branding .site-title a,\n\t\t.entry-title a,\n\t\t.page-links > .page-links-title,\n\t\t.comment-author,\n\t\t.comment-reply-title small a:hover,\n\t\t.comment-reply-title small a:focus {\n\t\t\tcolor: %1$s\n\t\t}\n\n\t\tblockquote,\n\t\t.menu-toggle.toggled-on,\n\t\t.menu-toggle.toggled-on:hover,\n\t\t.menu-toggle.toggled-on:focus,\n\t\t.post-navigation,\n\t\t.post-navigation div + div,\n\t\t.pagination,\n\t\t.widget,\n\t\t.page-header,\n\t\t.page-links a,\n\t\t.comments-title,\n\t\t.comment-reply-title {\n\t\t\tborder-color: %1$s;\n\t\t}\n\n\t\tbutton,\n\t\tbutton[disabled]:hover,\n\t\tbutton[disabled]:focus,\n\t\tinput[type=\"button\"],\n\t\tinput[type=\"button\"][disabled]:hover,\n\t\tinput[type=\"button\"][disabled]:focus,\n\t\tinput[type=\"reset\"],\n\t\tinput[type=\"reset\"][disabled]:hover,\n\t\tinput[type=\"reset\"][disabled]:focus,\n\t\tinput[type=\"submit\"],\n\t\tinput[type=\"submit\"][disabled]:hover,\n\t\tinput[type=\"submit\"][disabled]:focus,\n\t\t.menu-toggle.toggled-on,\n\t\t.menu-toggle.toggled-on:hover,\n\t\t.menu-toggle.toggled-on:focus,\n\t\t.pagination:before,\n\t\t.pagination:after,\n\t\t.pagination .prev,\n\t\t.pagination .next,\n\t\t.page-links a {\n\t\t\tbackground-color: %1$s;\n\t\t}\n\n\t\t/* Border Color */\n\t\tfieldset,\n\t\tpre,\n\t\tabbr,\n\t\tacronym,\n\t\ttable,\n\t\tth,\n\t\ttd,\n\t\tinput[type=\"text\"],\n\t\tinput[type=\"email\"],\n\t\tinput[type=\"url\"],\n\t\tinput[type=\"password\"],\n\t\tinput[type=\"search\"],\n\t\ttextarea,\n\t\t.main-navigation li,\n\t\t.main-navigation .primary-menu,\n\t\t.menu-toggle,\n\t\t.dropdown-toggle:after,\n\t\t.social-navigation a,\n\t\t.image-navigation,\n\t\t.comment-navigation,\n\t\t.tagcloud a,\n\t\t.entry-content,\n\t\t.entry-summary,\n\t\t.page-links a,\n\t\t.page-links > span,\n\t\t.comment-list article,\n\t\t.comment-list .pingback,\n\t\t.comment-list .trackback,\n\t\t.comment-reply-link,\n\t\t.no-comments,\n\t\t.widecolumn .mu_register .mu_alert {\n\t\t\tborder-color: %1$s; /* Fallback for IE7 and IE8 */\n\t\t\tborder-color: %2$s;\n\t\t}\n\n\t\thr,\n\t\tcode {\n\t\t\tbackground-color: %1$s; /* Fallback for IE7 and IE8 */\n\t\t\tbackground-color: %2$s;\n\t\t}\n\n\t\t@media screen and (min-width: 56.875em) {\n\t\t\t.main-navigation ul ul,\n\t\t\t.main-navigation ul ul li {\n\t\t\t\tborder-color: %2$s;\n\t\t\t}\n\n\t\t\t.main-navigation ul ul:before {\n\t\t\t\tborder-top-color: %2$s;\n\t\t\t\tborder-bottom-color: %2$s;\n\t\t\t}\n\t\t}\n\t';\n\n\twp_add_inline_style( 'twentysixteen-style', sprintf( $css, $main_text_color, $border_color ) );\n}\nadd_action( 'wp_enqueue_scripts', 'twentysixteen_main_text_color_css', 11 );\n\n/**\n * Enqueues front-end CSS for the secondary text color.\n *\n * @since Twenty Sixteen 1.0\n *\n * @see wp_add_inline_style()\n */\nfunction twentysixteen_secondary_text_color_css() {\n\t$color_scheme    = twentysixteen_get_color_scheme();\n\t$default_color   = $color_scheme[4];\n\t$secondary_text_color = get_theme_mod( 'secondary_text_color', $default_color );\n\n\t// Don't do anything if the current color is the default.\n\tif ( $secondary_text_color === $default_color ) {\n\t\treturn;\n\t}\n\n\t$css = '\n\t\t/* Custom Secondary Text Color */\n\n\t\t/**\n\t\t * IE8 and earlier will drop any block with CSS3 selectors.\n\t\t * Do not combine these styles with the next block.\n\t\t */\n\t\tbody:not(.search-results) .entry-summary {\n\t\t\tcolor: %1$s;\n\t\t}\n\n\t\tblockquote,\n\t\t.post-password-form label,\n\t\ta:hover,\n\t\ta:focus,\n\t\ta:active,\n\t\t.post-navigation .meta-nav,\n\t\t.image-navigation,\n\t\t.comment-navigation,\n\t\t.widget_recent_entries .post-date,\n\t\t.widget_rss .rss-date,\n\t\t.widget_rss cite,\n\t\t.site-description,\n\t\t.author-bio,\n\t\t.entry-footer,\n\t\t.entry-footer a,\n\t\t.sticky-post,\n\t\t.taxonomy-description,\n\t\t.entry-caption,\n\t\t.comment-metadata,\n\t\t.pingback .edit-link,\n\t\t.comment-metadata a,\n\t\t.pingback .comment-edit-link,\n\t\t.comment-form label,\n\t\t.comment-notes,\n\t\t.comment-awaiting-moderation,\n\t\t.logged-in-as,\n\t\t.form-allowed-tags,\n\t\t.site-info,\n\t\t.site-info a,\n\t\t.wp-caption .wp-caption-text,\n\t\t.gallery-caption,\n\t\t.widecolumn label,\n\t\t.widecolumn .mu_register label {\n\t\t\tcolor: %1$s;\n\t\t}\n\n\t\t.widget_calendar tbody a:hover,\n\t\t.widget_calendar tbody a:focus {\n\t\t\tbackground-color: %1$s;\n\t\t}\n\t';\n\n\twp_add_inline_style( 'twentysixteen-style', sprintf( $css, $secondary_text_color ) );\n}\nadd_action( 'wp_enqueue_scripts', 'twentysixteen_secondary_text_color_css', 11 );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/inc/template-tags.php",
    "content": "<?php\n/**\n * Custom Twenty Sixteen template tags\n *\n * Eventually, some of the functionality here could be replaced by core features.\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nif ( ! function_exists( 'twentysixteen_entry_meta' ) ) :\n/**\n * Prints HTML with meta information for the categories, tags.\n *\n * Create your own twentysixteen_entry_meta() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_entry_meta() {\n\tif ( 'post' === get_post_type() ) {\n\t\t$author_avatar_size = apply_filters( 'twentysixteen_author_avatar_size', 49 );\n\t\tprintf( '<span class=\"byline\"><span class=\"author vcard\">%1$s<span class=\"screen-reader-text\">%2$s </span> <a class=\"url fn n\" href=\"%3$s\">%4$s</a></span></span>',\n\t\t\tget_avatar( get_the_author_meta( 'user_email' ), $author_avatar_size ),\n\t\t\t_x( 'Author', 'Used before post author name.', 'twentysixteen' ),\n\t\t\tesc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ),\n\t\t\tget_the_author()\n\t\t);\n\t}\n\n\tif ( in_array( get_post_type(), array( 'post', 'attachment' ) ) ) {\n\t\ttwentysixteen_entry_date();\n\t}\n\n\t$format = get_post_format();\n\tif ( current_theme_supports( 'post-formats', $format ) ) {\n\t\tprintf( '<span class=\"entry-format\">%1$s<a href=\"%2$s\">%3$s</a></span>',\n\t\t\tsprintf( '<span class=\"screen-reader-text\">%s </span>', _x( 'Format', 'Used before post format.', 'twentysixteen' ) ),\n\t\t\tesc_url( get_post_format_link( $format ) ),\n\t\t\tget_post_format_string( $format )\n\t\t);\n\t}\n\n\tif ( 'post' === get_post_type() ) {\n\t\ttwentysixteen_entry_taxonomies();\n\t}\n\n\tif ( ! is_singular() && ! post_password_required() && ( comments_open() || get_comments_number() ) ) {\n\t\techo '<span class=\"comments-link\">';\n\t\tcomments_popup_link( sprintf( __( 'Leave a comment<span class=\"screen-reader-text\"> on %s</span>', 'twentysixteen' ), get_the_title() ) );\n\t\techo '</span>';\n\t}\n}\nendif;\n\nif ( ! function_exists( 'twentysixteen_entry_date' ) ) :\n/**\n * Prints HTML with date information for current post.\n *\n * Create your own twentysixteen_entry_date() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_entry_date() {\n\t$time_string = '<time class=\"entry-date published updated\" datetime=\"%1$s\">%2$s</time>';\n\n\tif ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) {\n\t\t$time_string = '<time class=\"entry-date published\" datetime=\"%1$s\">%2$s</time><time class=\"updated\" datetime=\"%3$s\">%4$s</time>';\n\t}\n\n\t$time_string = sprintf( $time_string,\n\t\tesc_attr( get_the_date( 'c' ) ),\n\t\tget_the_date(),\n\t\tesc_attr( get_the_modified_date( 'c' ) ),\n\t\tget_the_modified_date()\n\t);\n\n\tprintf( '<span class=\"posted-on\"><span class=\"screen-reader-text\">%1$s </span><a href=\"%2$s\" rel=\"bookmark\">%3$s</a></span>',\n\t\t_x( 'Posted on', 'Used before publish date.', 'twentysixteen' ),\n\t\tesc_url( get_permalink() ),\n\t\t$time_string\n\t);\n}\nendif;\n\nif ( ! function_exists( 'twentysixteen_entry_taxonomies' ) ) :\n/**\n * Prints HTML with category and tags for current post.\n *\n * Create your own twentysixteen_entry_taxonomies() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_entry_taxonomies() {\n\t$categories_list = get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentysixteen' ) );\n\tif ( $categories_list && twentysixteen_categorized_blog() ) {\n\t\tprintf( '<span class=\"cat-links\"><span class=\"screen-reader-text\">%1$s </span>%2$s</span>',\n\t\t\t_x( 'Categories', 'Used before category names.', 'twentysixteen' ),\n\t\t\t$categories_list\n\t\t);\n\t}\n\n\t$tags_list = get_the_tag_list( '', _x( ', ', 'Used between list items, there is a space after the comma.', 'twentysixteen' ) );\n\tif ( $tags_list ) {\n\t\tprintf( '<span class=\"tags-links\"><span class=\"screen-reader-text\">%1$s </span>%2$s</span>',\n\t\t\t_x( 'Tags', 'Used before tag names.', 'twentysixteen' ),\n\t\t\t$tags_list\n\t\t);\n\t}\n}\nendif;\n\nif ( ! function_exists( 'twentysixteen_post_thumbnail' ) ) :\n/**\n * Displays an optional post thumbnail.\n *\n * Wraps the post thumbnail in an anchor element on index views, or a div\n * element when on single views.\n *\n * Create your own twentysixteen_post_thumbnail() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_post_thumbnail() {\n\tif ( post_password_required() || is_attachment() || ! has_post_thumbnail() ) {\n\t\treturn;\n\t}\n\n\tif ( is_singular() ) :\n\t?>\n\n\t<div class=\"post-thumbnail\">\n\t\t<?php the_post_thumbnail(); ?>\n\t</div><!-- .post-thumbnail -->\n\n\t<?php else : ?>\n\n\t<a class=\"post-thumbnail\" href=\"<?php the_permalink(); ?>\" aria-hidden=\"true\">\n\t\t<?php the_post_thumbnail( 'post-thumbnail', array( 'alt' => the_title_attribute( 'echo=0' ) ) ); ?>\n\t</a>\n\n\t<?php endif; // End is_singular()\n}\nendif;\n\nif ( ! function_exists( 'twentysixteen_excerpt' ) ) :\n\t/**\n\t * Displays the optional excerpt.\n\t *\n\t * Wraps the excerpt in a div element.\n\t *\n\t * Create your own twentysixteen_excerpt() function to override in a child theme.\n\t *\n\t * @since Twenty Sixteen 1.0\n\t *\n\t * @param string $class Optional. Class string of the div element. Defaults to 'entry-summary'.\n\t */\n\tfunction twentysixteen_excerpt( $class = 'entry-summary' ) {\n\t\t$class = esc_attr( $class );\n\n\t\tif ( has_excerpt() || is_search() ) : ?>\n\t\t\t<div class=\"<?php echo $class; ?>\">\n\t\t\t\t<?php the_excerpt(); ?>\n\t\t\t</div><!-- .<?php echo $class; ?> -->\n\t\t<?php endif;\n\t}\nendif;\n\nif ( ! function_exists( 'twentysixteen_excerpt_more' ) && ! is_admin() ) :\n/**\n * Replaces \"[...]\" (appended to automatically generated excerpts) with ... and\n * a 'Continue reading' link.\n *\n * Create your own twentysixteen_excerpt_more() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n *\n * @return string 'Continue reading' link prepended with an ellipsis.\n */\nfunction twentysixteen_excerpt_more() {\n\t$link = sprintf( '<a href=\"%1$s\" class=\"more-link\">%2$s</a>',\n\t\tesc_url( get_permalink( get_the_ID() ) ),\n\t\t/* translators: %s: Name of current post */\n\t\tsprintf( __( 'Continue reading<span class=\"screen-reader-text\"> \"%s\"</span>', 'twentysixteen' ), get_the_title( get_the_ID() ) )\n\t);\n\treturn ' &hellip; ' . $link;\n}\nadd_filter( 'excerpt_more', 'twentysixteen_excerpt_more' );\nendif;\n\n/**\n * Determines whether blog/site has more than one category.\n *\n * Create your own twentysixteen_categorized_blog() function to override in a child theme.\n *\n * @since Twenty Sixteen 1.0\n *\n * @return bool True if there is more than one category, false otherwise.\n */\nfunction twentysixteen_categorized_blog() {\n\tif ( false === ( $all_the_cool_cats = get_transient( 'twentysixteen_categories' ) ) ) {\n\t\t// Create an array of all the categories that are attached to posts.\n\t\t$all_the_cool_cats = get_categories( array(\n\t\t\t'fields'     => 'ids',\n\t\t\t// We only need to know if there is more than one category.\n\t\t\t'number'     => 2,\n\t\t) );\n\n\t\t// Count the number of categories that are attached to the posts.\n\t\t$all_the_cool_cats = count( $all_the_cool_cats );\n\n\t\tset_transient( 'twentysixteen_categories', $all_the_cool_cats );\n\t}\n\n\tif ( $all_the_cool_cats > 1 ) {\n\t\t// This blog has more than 1 category so twentysixteen_categorized_blog should return true.\n\t\treturn true;\n\t} else {\n\t\t// This blog has only 1 category so twentysixteen_categorized_blog should return false.\n\t\treturn false;\n\t}\n}\n\n/**\n * Flushes out the transients used in twentysixteen_categorized_blog().\n *\n * @since Twenty Sixteen 1.0\n */\nfunction twentysixteen_category_transient_flusher() {\n\tif ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {\n\t\treturn;\n\t}\n\t// Like, beat it. Dig?\n\tdelete_transient( 'twentysixteen_categories' );\n}\nadd_action( 'edit_category', 'twentysixteen_category_transient_flusher' );\nadd_action( 'save_post',     'twentysixteen_category_transient_flusher' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/index.php",
    "content": "<?php\n/**\n * The main template file\n *\n * This is the most generic template file in a WordPress theme\n * and one of the two required files for a theme (the other being style.css).\n * It is used to display a page when nothing more specific matches a query.\n * E.g., it puts together the home page when no home.php file exists.\n *\n * @link http://codex.wordpress.org/Template_Hierarchy\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nget_header(); ?>\n\n\t<div id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<?php if ( is_home() && ! is_front_page() ) : ?>\n\t\t\t\t<header>\n\t\t\t\t\t<h1 class=\"page-title screen-reader-text\"><?php single_post_title(); ?></h1>\n\t\t\t\t</header>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php\n\t\t\t// Start the loop.\n\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t/*\n\t\t\t\t * Include the Post-Format-specific template for the content.\n\t\t\t\t * If you want to override this in a child theme, then include a file\n\t\t\t\t * called content-___.php (where ___ is the Post Format name) and that will be used instead.\n\t\t\t\t */\n\t\t\t\tget_template_part( 'template-parts/content', get_post_format() );\n\n\t\t\t// End the loop.\n\t\t\tendwhile;\n\n\t\t\t// Previous/next page navigation.\n\t\t\tthe_posts_pagination( array(\n\t\t\t\t'prev_text'          => __( 'Previous page', 'twentysixteen' ),\n\t\t\t\t'next_text'          => __( 'Next page', 'twentysixteen' ),\n\t\t\t\t'before_page_number' => '<span class=\"meta-nav screen-reader-text\">' . __( 'Page', 'twentysixteen' ) . ' </span>',\n\t\t\t) );\n\n\t\t// If no content, include the \"No posts found\" template.\n\t\telse :\n\t\t\tget_template_part( 'template-parts/content', 'none' );\n\n\t\tendif;\n\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</div><!-- .content-area -->\n\n<?php get_sidebar(); ?>\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/js/color-scheme-control.js",
    "content": "/* global colorScheme, Color */\n/**\n * Add a listener to the Color Scheme control to update other color controls to new values/defaults.\n * Also trigger an update of the Color Scheme CSS when a color is changed.\n */\n\n( function( api ) {\n\tvar cssTemplate = wp.template( 'twentysixteen-color-scheme' ),\n\t\tcolorSchemeKeys = [\n\t\t\t'background_color',\n\t\t\t'page_background_color',\n\t\t\t'link_color',\n\t\t\t'main_text_color',\n\t\t\t'secondary_text_color'\n\t\t],\n\t\tcolorSettings = [\n\t\t\t'background_color',\n\t\t\t'page_background_color',\n\t\t\t'link_color',\n\t\t\t'main_text_color',\n\t\t\t'secondary_text_color'\n\t\t];\n\n\tapi.controlConstructor.select = api.Control.extend( {\n\t\tready: function() {\n\t\t\tif ( 'color_scheme' === this.id ) {\n\t\t\t\tthis.setting.bind( 'change', function( value ) {\n\t\t\t\t\tvar colors = colorScheme[value].colors;\n\n\t\t\t\t\t// Update Background Color.\n\t\t\t\t\tvar color = colors[0];\n\t\t\t\t\tapi( 'background_color' ).set( color );\n\t\t\t\t\tapi.control( 'background_color' ).container.find( '.color-picker-hex' )\n\t\t\t\t\t\t.data( 'data-default-color', color )\n\t\t\t\t\t\t.wpColorPicker( 'defaultColor', color );\n\n\t\t\t\t\t// Update Page Background Color.\n\t\t\t\t\tcolor = colors[1];\n\t\t\t\t\tapi( 'page_background_color' ).set( color );\n\t\t\t\t\tapi.control( 'page_background_color' ).container.find( '.color-picker-hex' )\n\t\t\t\t\t\t.data( 'data-default-color', color )\n\t\t\t\t\t\t.wpColorPicker( 'defaultColor', color );\n\n\t\t\t\t\t// Update Link Color.\n\t\t\t\t\tcolor = colors[2];\n\t\t\t\t\tapi( 'link_color' ).set( color );\n\t\t\t\t\tapi.control( 'link_color' ).container.find( '.color-picker-hex' )\n\t\t\t\t\t\t.data( 'data-default-color', color )\n\t\t\t\t\t\t.wpColorPicker( 'defaultColor', color );\n\n\t\t\t\t\t// Update Main Text Color.\n\t\t\t\t\tcolor = colors[3];\n\t\t\t\t\tapi( 'main_text_color' ).set( color );\n\t\t\t\t\tapi.control( 'main_text_color' ).container.find( '.color-picker-hex' )\n\t\t\t\t\t\t.data( 'data-default-color', color )\n\t\t\t\t\t\t.wpColorPicker( 'defaultColor', color );\n\n\t\t\t\t\t// Update Secondary Text Color.\n\t\t\t\t\tcolor = colors[4];\n\t\t\t\t\tapi( 'secondary_text_color' ).set( color );\n\t\t\t\t\tapi.control( 'secondary_text_color' ).container.find( '.color-picker-hex' )\n\t\t\t\t\t\t.data( 'data-default-color', color )\n\t\t\t\t\t\t.wpColorPicker( 'defaultColor', color );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t} );\n\n\t// Generate the CSS for the current Color Scheme.\n\tfunction updateCSS() {\n\t\tvar scheme = api( 'color_scheme' )(),\n\t\t\tcss,\n\t\t\tcolors = _.object( colorSchemeKeys, colorScheme[ scheme ].colors );\n\n\t\t// Merge in color scheme overrides.\n\t\t_.each( colorSettings, function( setting ) {\n\t\t\tcolors[ setting ] = api( setting )();\n\t\t} );\n\n\t\t// Add additional color.\n\t\t// jscs:disable\n\t\tcolors.border_color = Color( colors.main_text_color ).toCSS( 'rgba', 0.2 );\n\t\t// jscs:enable\n\n\t\tcss = cssTemplate( colors );\n\n\t\tapi.previewer.send( 'update-color-scheme-css', css );\n\t}\n\n\t// Update the CSS whenever a color setting is changed.\n\t_.each( colorSettings, function( setting ) {\n\t\tapi( setting, function( setting ) {\n\t\t\tsetting.bind( updateCSS );\n\t\t} );\n\t} );\n} )( wp.customize );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/js/customize-preview.js",
    "content": "/**\n * Live-update changed settings in real time in the Customizer preview.\n */\n\n( function( $ ) {\n\tvar style = $( '#twentysixteen-color-scheme-css' ),\n\t\tapi = wp.customize;\n\n\tif ( ! style.length ) {\n\t\tstyle = $( 'head' ).append( '<style type=\"text/css\" id=\"twentysixteen-color-scheme-css\" />' )\n\t\t                    .find( '#twentysixteen-color-scheme-css' );\n\t}\n\n\t// Site title.\n\tapi( 'blogname', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( '.site-title a' ).text( to );\n\t\t} );\n\t} );\n\n\t// Site tagline.\n\tapi( 'blogdescription', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( '.site-description' ).text( to );\n\t\t} );\n\t} );\n\n\t// Add custom-background-image body class when background image is added.\n\tapi( 'background_image', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( 'body' ).toggleClass( 'custom-background-image', '' !== to );\n\t\t} );\n\t} );\n\n\t// Color Scheme CSS.\n\tapi.bind( 'preview-ready', function() {\n\t\tapi.preview.bind( 'update-color-scheme-css', function( css ) {\n\t\t\tstyle.html( css );\n\t\t} );\n\t} );\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/js/functions.js",
    "content": "/* global screenReaderText */\n/**\n * Theme functions file.\n *\n * Contains handlers for navigation and widget area.\n */\n\n( function( $ ) {\n\tvar body, masthead, menuToggle, siteNavigation, socialNavigation, siteHeaderMenu, resizeTimer;\n\n\tfunction initMainNavigation( container ) {\n\n\t\t// Add dropdown toggle that displays child menu items.\n\t\tvar dropdownToggle = $( '<button />', {\n\t\t\t'class': 'dropdown-toggle',\n\t\t\t'aria-expanded': false\n\t\t} ).append( $( '<span />', {\n\t\t\t'class': 'screen-reader-text',\n\t\t\ttext: screenReaderText.expand\n\t\t} ) );\n\n\t\tcontainer.find( '.menu-item-has-children > a' ).after( dropdownToggle );\n\n\t\t// Toggle buttons and submenu items with active children menu items.\n\t\tcontainer.find( '.current-menu-ancestor > button' ).addClass( 'toggled-on' );\n\t\tcontainer.find( '.current-menu-ancestor > .sub-menu' ).addClass( 'toggled-on' );\n\n\t\t// Add menu items with submenus to aria-haspopup=\"true\".\n\t\tcontainer.find( '.menu-item-has-children' ).attr( 'aria-haspopup', 'true' );\n\n\t\tcontainer.find( '.dropdown-toggle' ).click( function( e ) {\n\t\t\tvar _this            = $( this ),\n\t\t\t\tscreenReaderSpan = _this.find( '.screen-reader-text' );\n\n\t\t\te.preventDefault();\n\t\t\t_this.toggleClass( 'toggled-on' );\n\t\t\t_this.next( '.children, .sub-menu' ).toggleClass( 'toggled-on' );\n\n\t\t\t// jscs:disable\n\t\t\t_this.attr( 'aria-expanded', _this.attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' );\n\t\t\t// jscs:enable\n\t\t\tscreenReaderSpan.text( screenReaderSpan.text() === screenReaderText.expand ? screenReaderText.collapse : screenReaderText.expand );\n\t\t} );\n\t}\n\tinitMainNavigation( $( '.main-navigation' ) );\n\n\tmasthead         = $( '#masthead' );\n\tmenuToggle       = masthead.find( '#menu-toggle' );\n\tsiteHeaderMenu   = masthead.find( '#site-header-menu' );\n\tsiteNavigation   = masthead.find( '#site-navigation' );\n\tsocialNavigation = masthead.find( '#social-navigation' );\n\n\t// Enable menuToggle.\n\t( function() {\n\n\t\t// Return early if menuToggle is missing.\n\t\tif ( ! menuToggle.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add an initial values for the attribute.\n\t\tmenuToggle.add( siteNavigation ).add( socialNavigation ).attr( 'aria-expanded', 'false' );\n\n\t\tmenuToggle.on( 'click.twentysixteen', function() {\n\t\t\t$( this ).add( siteHeaderMenu ).toggleClass( 'toggled-on' );\n\n\t\t\t// jscs:disable\n\t\t\t$( this ).add( siteNavigation ).add( socialNavigation ).attr( 'aria-expanded', $( this ).add( siteNavigation ).add( socialNavigation ).attr( 'aria-expanded' ) === 'false' ? 'true' : 'false' );\n\t\t\t// jscs:enable\n\t\t} );\n\t} )();\n\n\t// Fix sub-menus for touch devices and better focus for hidden submenu items for accessibility.\n\t( function() {\n\t\tif ( ! siteNavigation.length || ! siteNavigation.children().length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Toggle `focus` class to allow submenu access on tablets.\n\t\tfunction toggleFocusClassTouchScreen() {\n\t\t\tif ( window.innerWidth >= 910 ) {\n\t\t\t\t$( document.body ).on( 'touchstart.twentysixteen', function( e ) {\n\t\t\t\t\tif ( ! $( e.target ).closest( '.main-navigation li' ).length ) {\n\t\t\t\t\t\t$( '.main-navigation li' ).removeClass( 'focus' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tsiteNavigation.find( '.menu-item-has-children > a' ).on( 'touchstart.twentysixteen', function( e ) {\n\t\t\t\t\tvar el = $( this ).parent( 'li' );\n\n\t\t\t\t\tif ( ! el.hasClass( 'focus' ) ) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tel.toggleClass( 'focus' );\n\t\t\t\t\t\tel.siblings( '.focus' ).removeClass( 'focus' );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tsiteNavigation.find( '.menu-item-has-children > a' ).unbind( 'touchstart.twentysixteen' );\n\t\t\t}\n\t\t}\n\n\t\tif ( 'ontouchstart' in window ) {\n\t\t\t$( window ).on( 'resize.twentysixteen', toggleFocusClassTouchScreen );\n\t\t\ttoggleFocusClassTouchScreen();\n\t\t}\n\n\t\tsiteNavigation.find( 'a' ).on( 'focus.twentysixteen blur.twentysixteen', function() {\n\t\t\t$( this ).parents( '.menu-item' ).toggleClass( 'focus' );\n\t\t} );\n\t} )();\n\n\t// Add the default ARIA attributes for the menu toggle and the navigations.\n\tfunction onResizeARIA() {\n\t\tif ( window.innerWidth < 910 ) {\n\t\t\tif ( menuToggle.hasClass( 'toggled-on' ) ) {\n\t\t\t\tmenuToggle.attr( 'aria-expanded', 'true' );\n\t\t\t} else {\n\t\t\t\tmenuToggle.attr( 'aria-expanded', 'false' );\n\t\t\t}\n\n\t\t\tif ( siteHeaderMenu.hasClass( 'toggled-on' ) ) {\n\t\t\t\tsiteNavigation.attr( 'aria-expanded', 'true' );\n\t\t\t\tsocialNavigation.attr( 'aria-expanded', 'true' );\n\t\t\t} else {\n\t\t\t\tsiteNavigation.attr( 'aria-expanded', 'false' );\n\t\t\t\tsocialNavigation.attr( 'aria-expanded', 'false' );\n\t\t\t}\n\n\t\t\tmenuToggle.attr( 'aria-controls', 'site-navigation social-navigation' );\n\t\t} else {\n\t\t\tmenuToggle.removeAttr( 'aria-expanded' );\n\t\t\tsiteNavigation.removeAttr( 'aria-expanded' );\n\t\t\tsocialNavigation.removeAttr( 'aria-expanded' );\n\t\t\tmenuToggle.removeAttr( 'aria-controls' );\n\t\t}\n\t}\n\n\t// Add 'below-entry-meta' class to elements.\n\tfunction belowEntryMetaClass( param ) {\n\t\tif ( body.hasClass( 'page' ) || body.hasClass( 'search' ) || body.hasClass( 'single-attachment' ) || body.hasClass( 'error404' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$( '.entry-content' ).find( param ).each( function() {\n\t\t\tvar element              = $( this ),\n\t\t\t\telementPos           = element.offset(),\n\t\t\t\telementPosTop        = elementPos.top,\n\t\t\t\tentryFooter          = element.closest( 'article' ).find( '.entry-footer' ),\n\t\t\t\tentryFooterPos       = entryFooter.offset(),\n\t\t\t\tentryFooterPosBottom = entryFooterPos.top + ( entryFooter.height() + 28 ),\n\t\t\t\tcaption              = element.closest( 'figure' ),\n\t\t\t\tnewImg;\n\n\t\t\t// Add 'below-entry-meta' to elements below the entry meta.\n\t\t\tif ( elementPosTop > entryFooterPosBottom ) {\n\n\t\t\t\t// Check if full-size images and captions are larger than or equal to 840px.\n\t\t\t\tif ( 'img.size-full' === param ) {\n\n\t\t\t\t\t// Create an image to find native image width of resized images (i.e. max-width: 100%).\n\t\t\t\t\tnewImg = new Image();\n\t\t\t\t\tnewImg.src = element.attr( 'src' );\n\n\t\t\t\t\t$( newImg ).load( function() {\n\t\t\t\t\t\tif ( newImg.width >= 840  ) {\n\t\t\t\t\t\t\telement.addClass( 'below-entry-meta' );\n\n\t\t\t\t\t\t\tif ( caption.hasClass( 'wp-caption' ) ) {\n\t\t\t\t\t\t\t\tcaption.addClass( 'below-entry-meta' );\n\t\t\t\t\t\t\t\tcaption.removeAttr( 'style' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\telement.addClass( 'below-entry-meta' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telement.removeClass( 'below-entry-meta' );\n\t\t\t\tcaption.removeClass( 'below-entry-meta' );\n\t\t\t}\n\t\t} );\n\t}\n\n\t$( document ).ready( function() {\n\t\tbody = $( document.body );\n\n\t\t$( window )\n\t\t\t.on( 'load.twentysixteen', onResizeARIA )\n\t\t\t.on( 'resize.twentysixteen', function() {\n\t\t\t\tclearTimeout( resizeTimer );\n\t\t\t\tresizeTimer = setTimeout( function() {\n\t\t\t\t\tbelowEntryMetaClass( 'img.size-full' );\n\t\t\t\t\tbelowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' );\n\t\t\t\t}, 300 );\n\t\t\t\tonResizeARIA();\n\t\t\t} );\n\n\t\tbelowEntryMetaClass( 'img.size-full' );\n\t\tbelowEntryMetaClass( 'blockquote.alignleft, blockquote.alignright' );\n\t} );\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/js/html5.js",
    "content": "/**\n* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n*/\n;(function(window, document) {\n/*jshint evil:true */\n  /** version */\n  var version = '3.7.3';\n\n  /** Preset options */\n  var options = window.html5 || {};\n\n  /** Used to skip problem elements */\n  var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n  /** Not all elements can be cloned in IE **/\n  var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n  /** Detect whether the browser supports default html5 styles */\n  var supportsHtml5Styles;\n\n  /** Name of the expando, to work with multiple documents or to re-shiv one document */\n  var expando = '_html5shiv';\n\n  /** The id for the the documents expando */\n  var expanID = 0;\n\n  /** Cached data for each document */\n  var expandoData = {};\n\n  /** Detect whether the browser supports unknown elements */\n  var supportsUnknownElements;\n\n  (function() {\n    try {\n        var a = document.createElement('a');\n        a.innerHTML = '<xyz></xyz>';\n        //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n        supportsHtml5Styles = ('hidden' in a);\n\n        supportsUnknownElements = a.childNodes.length == 1 || (function() {\n          // assign a false positive if unable to shiv\n          (document.createElement)('a');\n          var frag = document.createDocumentFragment();\n          return (\n            typeof frag.cloneNode == 'undefined' ||\n            typeof frag.createDocumentFragment == 'undefined' ||\n            typeof frag.createElement == 'undefined'\n          );\n        }());\n    } catch(e) {\n      // assign a false positive if detection fails => unable to shiv\n      supportsHtml5Styles = true;\n      supportsUnknownElements = true;\n    }\n\n  }());\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Creates a style sheet with the given CSS text and adds it to the document.\n   * @private\n   * @param {Document} ownerDocument The document.\n   * @param {String} cssText The CSS text.\n   * @returns {StyleSheet} The style element.\n   */\n  function addStyleSheet(ownerDocument, cssText) {\n    var p = ownerDocument.createElement('p'),\n        parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n    p.innerHTML = 'x<style>' + cssText + '</style>';\n    return parent.insertBefore(p.lastChild, parent.firstChild);\n  }\n\n  /**\n   * Returns the value of `html5.elements` as an array.\n   * @private\n   * @returns {Array} An array of shived element node names.\n   */\n  function getElements() {\n    var elements = html5.elements;\n    return typeof elements == 'string' ? elements.split(' ') : elements;\n  }\n\n  /**\n   * Extends the built-in list of html5 elements\n   * @memberOf html5\n   * @param {String|Array} newElements whitespace separated list or array of new element names to shiv\n   * @param {Document} ownerDocument The context document.\n   */\n  function addElements(newElements, ownerDocument) {\n    var elements = html5.elements;\n    if(typeof elements != 'string'){\n      elements = elements.join(' ');\n    }\n    if(typeof newElements != 'string'){\n      newElements = newElements.join(' ');\n    }\n    html5.elements = elements +' '+ newElements;\n    shivDocument(ownerDocument);\n  }\n\n   /**\n   * Returns the data associated to the given document\n   * @private\n   * @param {Document} ownerDocument The document.\n   * @returns {Object} An object of data.\n   */\n  function getExpandoData(ownerDocument) {\n    var data = expandoData[ownerDocument[expando]];\n    if (!data) {\n        data = {};\n        expanID++;\n        ownerDocument[expando] = expanID;\n        expandoData[expanID] = data;\n    }\n    return data;\n  }\n\n  /**\n   * returns a shived element for the given nodeName and document\n   * @memberOf html5\n   * @param {String} nodeName name of the element\n   * @param {Document|DocumentFragment} ownerDocument The context document.\n   * @returns {Object} The shived element.\n   */\n  function createElement(nodeName, ownerDocument, data){\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    if(supportsUnknownElements){\n        return ownerDocument.createElement(nodeName);\n    }\n    if (!data) {\n        data = getExpandoData(ownerDocument);\n    }\n    var node;\n\n    if (data.cache[nodeName]) {\n        node = data.cache[nodeName].cloneNode();\n    } else if (saveClones.test(nodeName)) {\n        node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n    } else {\n        node = data.createElem(nodeName);\n    }\n\n    // Avoid adding some elements to fragments in IE < 9 because\n    // * Attributes like `name` or `type` cannot be set/changed once an element\n    //   is inserted into a document/fragment\n    // * Link elements with `src` attributes that are inaccessible, as with\n    //   a 403 response, will cause the tab/window to crash\n    // * Script elements appended to fragments will execute when their `src`\n    //   or `text` property is set\n    return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;\n  }\n\n  /**\n   * returns a shived DocumentFragment for the given document\n   * @memberOf html5\n   * @param {Document} ownerDocument The context document.\n   * @returns {Object} The shived DocumentFragment.\n   */\n  function createDocumentFragment(ownerDocument, data){\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    if(supportsUnknownElements){\n        return ownerDocument.createDocumentFragment();\n    }\n    data = data || getExpandoData(ownerDocument);\n    var clone = data.frag.cloneNode(),\n        i = 0,\n        elems = getElements(),\n        l = elems.length;\n    for(;i<l;i++){\n        clone.createElement(elems[i]);\n    }\n    return clone;\n  }\n\n  /**\n   * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n   * @private\n   * @param {Document|DocumentFragment} ownerDocument The document.\n   * @param {Object} data of the document.\n   */\n  function shivMethods(ownerDocument, data) {\n    if (!data.cache) {\n        data.cache = {};\n        data.createElem = ownerDocument.createElement;\n        data.createFrag = ownerDocument.createDocumentFragment;\n        data.frag = data.createFrag();\n    }\n\n\n    ownerDocument.createElement = function(nodeName) {\n      //abort shiv\n      if (!html5.shivMethods) {\n          return data.createElem(nodeName);\n      }\n      return createElement(nodeName, ownerDocument, data);\n    };\n\n    ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n      'var n=f.cloneNode(),c=n.createElement;' +\n      'h.shivMethods&&(' +\n        // unroll the `createElement` calls\n        getElements().join().replace(/[\\w\\-:]+/g, function(nodeName) {\n          data.createElem(nodeName);\n          data.frag.createElement(nodeName);\n          return 'c(\"' + nodeName + '\")';\n        }) +\n      ');return n}'\n    )(html5, data.frag);\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Shivs the given document.\n   * @memberOf html5\n   * @param {Document} ownerDocument The document to shiv.\n   * @returns {Document} The shived document.\n   */\n  function shivDocument(ownerDocument) {\n    if (!ownerDocument) {\n        ownerDocument = document;\n    }\n    var data = getExpandoData(ownerDocument);\n\n    if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n      data.hasCSS = !!addStyleSheet(ownerDocument,\n        // corrects block display not defined in IE6/7/8/9\n        'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +\n        // adds styling not present in IE6/7/8/9\n        'mark{background:#FF0;color:#000}' +\n        // hides non-rendered elements\n        'template{display:none}'\n      );\n    }\n    if (!supportsUnknownElements) {\n      shivMethods(ownerDocument, data);\n    }\n    return ownerDocument;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The `html5` object is exposed so that more elements can be shived and\n   * existing shiving can be detected on iframes.\n   * @type Object\n   * @example\n   *\n   * // options can be changed before the script is included\n   * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n   */\n  var html5 = {\n\n    /**\n     * An array or space separated string of node names of the elements to shiv.\n     * @memberOf html5\n     * @type Array|String\n     */\n    'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video',\n\n    /**\n     * current version of html5shiv\n     */\n    'version': version,\n\n    /**\n     * A flag to indicate that the HTML5 style sheet should be inserted.\n     * @memberOf html5\n     * @type Boolean\n     */\n    'shivCSS': (options.shivCSS !== false),\n\n    /**\n     * Is equal to true if a browser supports creating unknown/HTML5 elements\n     * @memberOf html5\n     * @type boolean\n     */\n    'supportsUnknownElements': supportsUnknownElements,\n\n    /**\n     * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n     * methods should be overwritten.\n     * @memberOf html5\n     * @type Boolean\n     */\n    'shivMethods': (options.shivMethods !== false),\n\n    /**\n     * A string to describe the type of `html5` object (\"default\" or \"default print\").\n     * @memberOf html5\n     * @type String\n     */\n    'type': 'default',\n\n    // shivs the document according to the specified `html5` object options\n    'shivDocument': shivDocument,\n\n    //creates a shived element\n    createElement: createElement,\n\n    //creates a shived documentFragment\n    createDocumentFragment: createDocumentFragment,\n\n    //extends list of elements\n    addElements: addElements\n  };\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose html5\n  window.html5 = html5;\n\n  // shiv the document\n  shivDocument(document);\n\n  if(typeof module == 'object' && module.exports){\n    module.exports = html5;\n  }\n\n}(typeof window !== \"undefined\" ? window : this, document));"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/js/keyboard-image-navigation.js",
    "content": "/**\n * Twenty Sixteen keyboard support for image navigation.\n */\n\n( function( $ ) {\n\t$( document ).on( 'keydown.twentysixteen', function( e ) {\n\t\tvar url = false;\n\n\t\t// Left arrow key code.\n\t\tif ( 37 === e.which ) {\n\t\t\turl = $( '.nav-previous a' ).attr( 'href' );\n\n\t\t// Right arrow key code.\n\t\t} else if ( 39 === e.which ) {\n\t\t\turl = $( '.nav-next a' ).attr( 'href' );\n\n\t\t// Other key code.\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( url && ! $( 'textarea, input' ).is( ':focus' ) ) {\n\t\t\twindow.location = url;\n\t\t}\n\t} );\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/js/skip-link-focus-fix.js",
    "content": "/**\n * Makes \"skip to content\" link work correctly in IE9, Chrome, and Opera\n * for better accessibility.\n *\n * @link http://www.nczonline.net/blog/2013/01/15/fixing-skip-to-content-links/\n */\n\n ( function() {\n\tvar isWebkit = navigator.userAgent.toLowerCase().indexOf( 'webkit' ) > -1,\n\t\tisOpera  = navigator.userAgent.toLowerCase().indexOf( 'opera' )  > -1,\n\t\tisIE     = navigator.userAgent.toLowerCase().indexOf( 'msie' )   > -1;\n\n\tif ( ( isWebkit || isOpera || isIE ) && document.getElementById && window.addEventListener ) {\n\t\twindow.addEventListener( 'hashchange', function() {\n\t\t\tvar id = location.hash.substring( 1 ),\n\t\t\t\telement;\n\n\t\t\tif ( ! ( /^[A-z0-9_-]+$/.test( id ) ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telement = document.getElementById( id );\n\n\t\t\tif ( element ) {\n\t\t\t\tif ( ! ( /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) ) {\n\t\t\t\t\telement.tabIndex = -1;\n\t\t\t\t}\n\n\t\t\t\telement.focus();\n\n\t\t\t\t// Repositions the window on jump-to-anchor to account for admin bar and border height.\n\t\t\t\twindow.scrollBy( 0, -53 );\n\t\t\t}\n\t\t}, false );\n\t}\n} )();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/languages/twentysixteen.pot",
    "content": "# Copyright (C) 2015 the WordPress team\n# This file is distributed under the GNU General Public License v2 or later.\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Twenty Sixteen 0.1.20150828\\n\"\n\"Report-Msgid-Bugs-To: https://wordpress.org/support/theme/twentysixteen\\n\"\n\"POT-Creation-Date: 2015-11-20 12:58:54+00:00\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"PO-Revision-Date: 2015-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\n#: 404.php:17\nmsgid \"Oops! That page can&rsquo;t be found.\"\nmsgstr \"\"\n\n#: 404.php:21\nmsgid \"It looks like nothing was found at this location. Maybe try a search?\"\nmsgstr \"\"\n\n#: archive.php:49 index.php:46 search.php:37\nmsgid \"Previous page\"\nmsgstr \"\"\n\n#: archive.php:50 index.php:47 search.php:38\nmsgid \"Next page\"\nmsgstr \"\"\n\n#: archive.php:51 image.php:60 index.php:48 search.php:39\n#: template-parts/content-page.php:27 template-parts/content-single.php:29\n#: template-parts/content.php:37\nmsgid \"Page\"\nmsgstr \"\"\n\n#. translators: %s: post title\n#: comments.php:31\nmsgctxt \"comments title\"\nmsgid \"One thought on &ldquo;%s&rdquo;\"\nmsgstr \"\"\n\n#. translators: 1: number of comments, 2: post title\n#: comments.php:35\nmsgctxt \"comments title\"\nmsgid \"%1$s thought on &ldquo;%2$s&rdquo;\"\nmsgid_plural \"%1$s thoughts on &ldquo;%2$s&rdquo;\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: comments.php:69\nmsgid \"Comments are closed.\"\nmsgstr \"\"\n\n#: footer.php:17\nmsgid \"Footer Primary Menu\"\nmsgstr \"\"\n\n#: footer.php:28\nmsgid \"Footer Social Links Menu\"\nmsgstr \"\"\n\n#. #-#-#-#-#  twentysixteen.pot (Twenty Sixteen 0.1.20150828)  #-#-#-#-#\n#. Author URI of the plugin/theme\n#: footer.php:51\nmsgid \"https://wordpress.org/\"\nmsgstr \"\"\n\n#: footer.php:51\nmsgid \"Proudly powered by %s\"\nmsgstr \"\"\n\n#: functions.php:77 header.php:49\nmsgid \"Primary Menu\"\nmsgstr \"\"\n\n#: functions.php:78 header.php:60\nmsgid \"Social Links Menu\"\nmsgstr \"\"\n\n#: functions.php:142\nmsgid \"Sidebar\"\nmsgstr \"\"\n\n#: functions.php:144\nmsgid \"Add widgets here to appear in your sidebar.\"\nmsgstr \"\"\n\n#: functions.php:152\nmsgid \"Content Bottom 1\"\nmsgstr \"\"\n\n#: functions.php:154 functions.php:164\nmsgid \"Appears at the bottom of the content on posts and pages.\"\nmsgstr \"\"\n\n#: functions.php:162\nmsgid \"Content Bottom 2\"\nmsgstr \"\"\n\n#. translators: If there are characters in your language that are not supported\n#. by Merriweather, translate this to 'off'. Do not translate into your own\n#. language.\n#: functions.php:189\nmsgctxt \"Merriweather font: on or off\"\nmsgid \"on\"\nmsgstr \"\"\n\n#. translators: If there are characters in your language that are not supported\n#. by Montserrat, translate this to 'off'. Do not translate into your own\n#. language.\n#: functions.php:194\nmsgctxt \"Montserrat font: on or off\"\nmsgid \"on\"\nmsgstr \"\"\n\n#. translators: If there are characters in your language that are not supported\n#. by Inconsolata, translate this to 'off'. Do not translate into your own\n#. language.\n#: functions.php:199\nmsgctxt \"Inconsolata font: on or off\"\nmsgid \"on\"\nmsgstr \"\"\n\n#: functions.php:270\nmsgid \"expand child menu\"\nmsgstr \"\"\n\n#: functions.php:271\nmsgid \"collapse child menu\"\nmsgstr \"\"\n\n#: header.php:27\nmsgid \"Skip to content\"\nmsgstr \"\"\n\n#: header.php:45\nmsgid \"Menu\"\nmsgstr \"\"\n\n#: image.php:24\nmsgid \"Previous Image\"\nmsgstr \"\"\n\n#: image.php:25\nmsgid \"Next Image\"\nmsgstr \"\"\n\n#: image.php:56 template-parts/content-page.php:23\n#: template-parts/content-single.php:25 template-parts/content.php:33\nmsgid \"Pages:\"\nmsgstr \"\"\n\n#: image.php:73\nmsgctxt \"Used before full size attachment link.\"\nmsgid \"Full size\"\nmsgstr \"\"\n\n#. translators: %s: Name of current post\n#: image.php:84 template-parts/content-page.php:37\n#: template-parts/content-search.php:28 template-parts/content-search.php:43\n#: template-parts/content-single.php:45 template-parts/content.php:49\nmsgid \"Edit<span class=\\\"screen-reader-text\\\"> \\\"%s\\\"</span>\"\nmsgstr \"\"\n\n#: image.php:102 single.php:29\nmsgctxt \"Parent post link\"\nmsgid \"\"\n\"<span class=\\\"meta-nav\\\">Published in</span><span class=\\\"post-title\\\">\"\n\"%title</span>\"\nmsgstr \"\"\n\n#: inc/back-compat.php:41 inc/back-compat.php:53 inc/back-compat.php:68\nmsgid \"\"\n\"Twenty Sixteen requires at least WordPress version 4.4. You are running \"\n\"version %s. Please upgrade and try again.\"\nmsgstr \"\"\n\n#: inc/customizer.php:117\nmsgid \"Base Color Scheme\"\nmsgstr \"\"\n\n#: inc/customizer.php:132\nmsgid \"Page Background Color\"\nmsgstr \"\"\n\n#: inc/customizer.php:147\nmsgid \"Link Color\"\nmsgstr \"\"\n\n#: inc/customizer.php:159\nmsgid \"Main Text Color\"\nmsgstr \"\"\n\n#: inc/customizer.php:171\nmsgid \"Secondary Text Color\"\nmsgstr \"\"\n\n#: inc/customizer.php:216\nmsgid \"Default\"\nmsgstr \"\"\n\n#: inc/customizer.php:226\nmsgid \"Dark\"\nmsgstr \"\"\n\n#: inc/customizer.php:236\nmsgid \"Gray\"\nmsgstr \"\"\n\n#: inc/customizer.php:246\nmsgid \"Red\"\nmsgstr \"\"\n\n#: inc/customizer.php:256\nmsgid \"Yellow\"\nmsgstr \"\"\n\n#: inc/template-tags.php:25\nmsgctxt \"Used before post author name.\"\nmsgid \"Author\"\nmsgstr \"\"\n\n#: inc/template-tags.php:38\nmsgctxt \"Used before post format.\"\nmsgid \"Format\"\nmsgstr \"\"\n\n#: inc/template-tags.php:50\nmsgid \"Leave a comment<span class=\\\"screen-reader-text\\\"> on %s</span>\"\nmsgstr \"\"\n\n#: inc/template-tags.php:79\nmsgctxt \"Used before publish date.\"\nmsgid \"Posted on\"\nmsgstr \"\"\n\n#: inc/template-tags.php:95 inc/template-tags.php:103\nmsgctxt \"Used between list items, there is a space after the comma.\"\nmsgid \", \"\nmsgstr \"\"\n\n#: inc/template-tags.php:98\nmsgctxt \"Used before category names.\"\nmsgid \"Categories\"\nmsgstr \"\"\n\n#: inc/template-tags.php:106\nmsgctxt \"Used before tag names.\"\nmsgid \"Tags\"\nmsgstr \"\"\n\n#. translators: %s: Name of current post\n#: inc/template-tags.php:184 template-parts/content.php:28\nmsgid \"Continue reading<span class=\\\"screen-reader-text\\\"> \\\"%s\\\"</span>\"\nmsgstr \"\"\n\n#: search.php:18\nmsgid \"Search Results for: %s\"\nmsgstr \"\"\n\n#: searchform.php:13 searchform.php:14\nmsgctxt \"label\"\nmsgid \"Search for:\"\nmsgstr \"\"\n\n#: searchform.php:14\nmsgctxt \"placeholder\"\nmsgid \"Search &hellip;\"\nmsgstr \"\"\n\n#: searchform.php:16\nmsgctxt \"submit button\"\nmsgid \"Search\"\nmsgstr \"\"\n\n#: single.php:34\nmsgid \"Next\"\nmsgstr \"\"\n\n#: single.php:35\nmsgid \"Next post:\"\nmsgstr \"\"\n\n#: single.php:37\nmsgid \"Previous\"\nmsgstr \"\"\n\n#: single.php:38\nmsgid \"Previous post:\"\nmsgstr \"\"\n\n#: template-parts/biography.php:28\nmsgid \"Author:\"\nmsgstr \"\"\n\n#: template-parts/biography.php:33\nmsgid \"View all posts by %s\"\nmsgstr \"\"\n\n#: template-parts/content-none.php:13\nmsgid \"Nothing Found\"\nmsgstr \"\"\n\n#: template-parts/content-none.php:19\nmsgid \"\"\n\"Ready to publish your first post? <a href=\\\"%1$s\\\">Get started here</a>.\"\nmsgstr \"\"\n\n#: template-parts/content-none.php:23\nmsgid \"\"\n\"Sorry, but nothing matched your search terms. Please try again with some \"\n\"different keywords.\"\nmsgstr \"\"\n\n#: template-parts/content-none.php:28\nmsgid \"\"\n\"It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps \"\n\"searching can help.\"\nmsgstr \"\"\n\n#: template-parts/content.php:14\nmsgid \"Featured\"\nmsgstr \"\"\n\n#. Theme Name of the plugin/theme\nmsgid \"Twenty Sixteen\"\nmsgstr \"\"\n\n#. Theme URI of the plugin/theme\nmsgid \"https://wordpress.org/themes/twentysixteen/\"\nmsgstr \"\"\n\n#. Description of the plugin/theme\nmsgid \"\"\n\"Twenty Sixteen is a modernized take on an ever-popular WordPress layout — \"\n\"the horizontal masthead with an optional right sidebar that works perfectly \"\n\"for blogs and websites. It has custom color options with beautiful default \"\n\"color schemes, a harmonious fluid grid using a mobile-first approach, and \"\n\"impeccable polish in every detail. Twenty Sixteen will make your WordPress \"\n\"look beautiful everywhere.\"\nmsgstr \"\"\n\n#. Author of the plugin/theme\nmsgid \"the WordPress team\"\nmsgstr \"\"\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/page.php",
    "content": "<?php\n/**\n * The template for displaying pages\n *\n * This is the template that displays all pages by default.\n * Please note that this is the WordPress construct of pages and that\n * other \"pages\" on your WordPress site will use a different template.\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nget_header(); ?>\n\n<div id=\"primary\" class=\"content-area\">\n\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\t\t<?php\n\t\t// Start the loop.\n\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t// Include the page content template.\n\t\t\tget_template_part( 'template-parts/content', 'page' );\n\n\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\tif ( comments_open() || get_comments_number() ) {\n\t\t\t\tcomments_template();\n\t\t\t}\n\n\t\t\t// End of the loop.\n\t\tendwhile;\n\t\t?>\n\n\t</main><!-- .site-main -->\n\n\t<?php get_sidebar( 'content-bottom' ); ?>\n\n</div><!-- .content-area -->\n\n<?php get_sidebar(); ?>\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/readme.txt",
    "content": "=== Twenty Sixteen ===\nContributors: the WordPress team\nRequires at least: WordPress 4.4\nTested up to: WordPress 4.4\nVersion: 1.1\nLicense: GPLv2 or later\nLicense URI: http://www.gnu.org/licenses/gpl-2.0.html\nTags: black, blue, gray, green, white, yellow, dark, light, one-column, two-columns, right-sidebar, fixed-layout, responsive-layout, accessibility-ready, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-images, flexible-header, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready\n\n== Description ==\nTwenty Sixteen is a modernized take on an ever-popular WordPress layout — the horizontal masthead with an optional right sidebar that works perfectly for blogs and websites. It has custom color options with beautiful default color schemes, a harmonious fluid grid using a mobile-first approach, and impeccable polish in every detail. Twenty Sixteen will make your WordPress look beautiful everywhere.\n\n* Mobile-first, Responsive Layout\n* Custom Colors\n* Custom Header\n* Social Links\n* Post Formats\n* The GPL v2.0 or later license. :) Use it to make something cool.\n\nFor more information about Twenty Sixteen please go to https://codex.wordpress.org/Twenty_Sixteen.\n\n== Installation ==\n\n1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button.\n2. Type in Twenty Sixteen in the search form and press the 'Enter' key on your keyboard.\n3. Click on the 'Activate' button to use your new theme right away.\n4. Go to https://codex.wordpress.org/Twenty_Sixteen for a guide on how to customize this theme.\n5. Navigate to Appearance > Customize in your admin panel and customize to taste.\n\n== Copyright ==\n\nTwenty Sixteen WordPress Theme, Copyright 2014-2015 WordPress.org\nTwenty Sixteen is distributed under the terms of the GNU GPL\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nTwenty Sixteen Theme bundles the following third-party resources:\n\nHTML5 Shiv v3.7.0, Copyright 2014 Alexander Farkas\nLicenses: MIT/GPL2\nSource: https://github.com/aFarkas/html5shiv\n\nGenericons icon font, Copyright 2013-2015 Automattic.com\nLicense: GNU GPL, Version 2 (or later)\nSource: http://www.genericons.com\n\nImage used in screenshot.png: A photo by Austin Schmid (https://unsplash.com/schmidy/), licensed under Creative Commons Zero(http://creativecommons.org/publicdomain/zero/1.0/)\n\n== Notes ==\n\nOnly the default and dark color schemes are accessibility ready.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/rtl.css",
    "content": "/*\nTheme Name: Twenty Sixteen\nDescription: Adds support for languages written in a Right To Left (RTL) direction.\nIt's easy, just a matter of overwriting all the horizontal positioning attributes\nof your CSS stylesheet in a separate stylesheet file named rtl.css.\n\nSee: https://codex.wordpress.org/Right_to_Left_Language_Support\n*/\n\n/**\n * Table of Contents:\n *\n * 1.0 - Normalize\n * 2.0 - Typography\n * 3.0 - Elements\n * 4.0 - Forms\n * 5.0 - Navigations\n * 6.0 - Accessibility\n * 7.0 - Widgets\n * 8.0 - Content\n *   8.1 - Header\n *   8.2 - Posts and pages\n *   8.3 - Comments\n *   8.4 - Footer\n * 9.0 - Multisites\n * 10.0 - Media Queries\n *    10.1 - >= 710px\n *    10.2 - >= 910px\n *    10.3 - >= 985px\n *    10.4 - >= 1200px\n */\n\n\n/**\n * 1.0 - Normalize\n */\n\nbody {\n\tdirection: rtl;\n\tunicode-bidi: embed;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\tmargin-right: auto;\n\tmargin-left: 0.4375em;\n}\n\n\n/**\n * 2.0 - Typography\n */\n\nbody,\nbutton,\nbutton[disabled]:hover,\nbutton[disabled]:focus,\ninput[type=\"button\"],\ninput[type=\"button\"][disabled]:hover,\ninput[type=\"button\"][disabled]:focus,\ninput[type=\"reset\"],\ninput[type=\"reset\"][disabled]:hover,\ninput[type=\"reset\"][disabled]:focus,\ninput[type=\"submit\"],\ninput[type=\"submit\"][disabled]:hover,\ninput[type=\"submit\"][disabled]:focus,\ninput,\nselect,\ntextarea,\n.post-password-form label,\n.main-navigation,\n.post-navigation,\n.post-navigation .post-title,\n.pagination,\n.image-navigation,\n.comment-navigation,\n.site .skip-link,\n.logged-in .site .skip-link,\n.widget .widget-title,\n.widget_recent_entries .post-date,\n.widget_rss .rss-date,\n.widget_rss cite,\n.tagcloud a,\n.site-title,\n.entry-title,\n.entry-footer,\n.sticky-post,\n.page-title,\n.page-links,\n.comments-title,\n.comment-reply-title,\n.comment-metadata,\n.pingback .edit-link,\n.comment-reply-link,\n.comment-form label,\n.no-comments,\n.required,\n.site-footer .site-title,\n.site-footer .site-title:after,\n.widecolumn label,\n.widecolumn .mu_register label {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n::-webkit-input-placeholder {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n:-moz-placeholder {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n::-moz-placeholder {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\n:-ms-input-placeholder {\n\tfont-family: Arial, Tahoma, sans-serif;\n}\n\nblockquote {\n\tborder-right-width: 4px;\n\tborder-left-width: 0;\n\tpadding-right: 1.263157895em;\n\tpadding-left: 0;\n}\n\n.entry-content h1,\n.entry-content h2,\n.entry-content h3,\n.entry-content h4,\n.entry-content h5,\n.entry-content h6,\n.entry-summary h1,\n.entry-summary h2,\n.entry-summary h3,\n.entry-summary h4,\n.entry-summary h5,\n.entry-summary h6,\n.comment-content h1,\n.comment-content h2,\n.comment-content h3,\n.comment-content h4,\n.comment-content h5,\n.comment-content h6,\n.textwidget h1,\n.textwidget h2,\n.textwidget h3,\n.textwidget h4,\n.textwidget h5,\n.textwidget h6,\n.entry-content .author-title,\n.widget_calendar caption,\n.widecolumn h2 {\n\tfont-weight: 700;\n}\n\n\n/**\n * 3.0 - Elements\n */\n\nul,\nol {\n\tmargin: 0 1.25em 1.75em 0;\n}\n\nol {\n\tmargin-right: 1.5em;\n\tmargin-left: 0;\n}\n\ncaption,\nth,\ntd {\n\ttext-align: right;\n}\n\n\n/**\n * 4.0 - Forms\n */\n\ninput[type=\"search\"].search-field {\n\tborder-radius: 0 2px 2px 0;\n}\n\n.search-submit:before {\n\tleft: 1px;\n}\n\n.search-submit {\n\tborder-radius: 2px 0 0 2px;\n\tleft: 0;\n\tright: auto;\n}\n\n\n/**\n * 5.0 - Navigation\n */\n\n.main-navigation ul ul {\n\tmargin-right: 0.875em;\n\tmargin-left: auto;\n}\n\n.main-navigation .menu-item-has-children > a {\n\tmargin-right: auto;\n\tmargin-left: 56px;\n}\n\n.dropdown-toggle {\n\tleft: 0;\n\tright: auto;\n}\n\n.dropdown-toggle:after {\n\tborder-right-width: 1px;\n\tborder-left-width: 0;\n\tleft: auto;\n\tright: 1px;\n}\n\n.social-navigation li {\n\tfloat: right;\n\tmargin: 0 0 0.4375em 0.4375em;\n}\n\n.pagination:before {\n\tleft: 0;\n\tright: auto;\n}\n\n.pagination:after {\n\tleft: 54px;\n\tright: auto;\n}\n\n.pagination .nav-links {\n\tpadding-right: 0;\n\tpadding-left: 106px;\n}\n\n.pagination .nav-links:before {\n\tcontent: \"\\f430\";\n\tleft: -1px;\n\tright: auto;\n}\n\n.pagination .nav-links:after {\n\tcontent: \"\\f429\";\n\tleft: 55px;\n\tright: auto;\n}\n\n.pagination .page-numbers {\n\tmargin: 0 -0.7368421053em 0 0.7368421053em;\n}\n\n.pagination .prev,\n.pagination .next {\n\tmargin: 0;\n}\n\n.pagination .prev {\n\tleft: 54px;\n\tright: auto;\n}\n\n.pagination .prev:before {\n\tcontent: \"\\f429\";\n\tleft: auto;\n\tright: -1px;\n}\n\n.pagination .next {\n\tleft: 0;\n\tright: auto;\n}\n\n.pagination .next:before {\n\tcontent: \"\\f430\";\n\tleft: -1px;\n\tright: auto;\n}\n\n.comment-navigation {\n\tmargin-right: 0;\n\tmargin-left: 0;\n}\n\n\n/**\n * 6.0 - Accessibility\n */\n\n.site .skip-link {\n\tleft: auto;\n\tright: -9999em;\n}\n\n.site .skip-link:focus {\n\tleft: auto;\n\tright: 6px;\n}\n\n\n/**\n * 7.0 - Widgets\n */\n\n.tagcloud a {\n\tmargin-right: 0;\n\tmargin-left: 0.1875em;\n}\n\n\n/**\n * 8.0 - Content\n */\n\n\n/**\n * 8.1 - Header\n */\n\n.site-branding {\n\tmargin-right: 0;\n\tmargin-left: auto;\n}\n\n\n/**\n * 8.2 - Posts and pages\n */\n\n.author-avatar .avatar {\n\tfloat: right;\n\tmargin-right: 0;\n\tmargin-left: 1.75em;\n}\n\n.entry-footer .avatar {\n\tmargin-right: 0;\n\tmargin-left: 0.5384615385em;\n}\n\n.page-links a,\n.page-links > span {\n\tmargin-right: auto;\n\tmargin-left: 0.3076923077em;\n}\n\n.page-links > .page-links-title {\n\tpadding-right: 0;\n\tpadding-left: 0.6153846154em;\n}\n\nbody:not(.search-results) .entry-summary .alignright {\n\tmargin: 0.2631578947em 0 1.4736842105em 1.4736842105em;\n}\n\nbody:not(.search-results) .entry-summary .alignleft {\n\tmargin: 0.2631578947em 1.4736842105em 1.4736842105em 0;\n}\n\n\n/**\n * 8.3 - Comments\n */\n\n.comment-list .children > li {\n\tpadding-right: 0.875em;\n\tpadding-left: 0;\n}\n\n.comment-author .avatar {\n\tfloat: right;\n\tmargin-right: auto;\n\tmargin-left: 0.875em;\n}\n\n.bypostauthor > article .fn:after {\n\tleft: auto;\n\tright: 3px;\n}\n\n.comment-content ul,\n.comment-content ol {\n\tmargin: 0 1.25em 1.5em 0;\n}\n\n.comment-reply-title small a {\n\tfloat: left;\n}\n\n\n/**\n * 8.4 - Footer\n */\n\n.site-footer .site-title:after {\n\tpadding-right: 0.538461538em;\n\tpadding-left: 0.307692308em;\n}\n\n\n/**\n * 9.0 - Multisites\n */\n\n.widecolumn .mu_register label {\n\tmargin-right: 0;\n\tmargin-left: 0.7692307692em;\n}\n\n\n/**\n * 10.0 - Media Queries\n */\n\n\n/**\n * 10.1 - >= 710px\n */\n\n@media screen and (min-width: 44.375em) {\n\t.pagination {\n\t\tmargin: 0 7.6923% 4.421052632em 23.0769%;\n\t}\n\n\t.entry-header,\n\t.post-thumbnail,\n\t.entry-content,\n\t.entry-summary,\n\t.entry-footer,\n\t.comments-area,\n\t.image-navigation,\n\t.post-navigation,\n\t.page-header,\n\t.page-content,\n\t.content-bottom-widgets {\n\t\tmargin-right: 7.6923%;\n\t\tmargin-left: 23.0769%;\n\t}\n\n\t.entry-content blockquote:not(.alignright):not(.alignleft),\n\t.entry-summary blockquote,\n\t.comment-content blockquote {\n\t\tmargin-right: -1.473684211em;\n\t\tmargin-left: auto;\n\t}\n\n\t.entry-content blockquote blockquote:not(.alignright):not(.alignleft),\n\t.entry-summary blockquote blockquote,\n\t.comment-content blockquote blockquote {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\t.entry-content ul,\n\t.entry-summary ul,\n\t.comment-content ul,\n\t.entry-content ol,\n\t.entry-summary ol,\n\t.comment-content ol {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\t.entry-content li > ul,\n\t.entry-summary li > ul,\n\t.comment-content li > ul,\n\t.entry-content blockquote > ul,\n\t.entry-summary blockquote > ul,\n\t.comment-content blockquote > ul {\n\t\tmargin-right: 1.25em;\n\t\tmargin-left: auto;\n\t}\n\n\t.entry-content li > ol,\n\t.entry-summary li > ol,\n\t.comment-content li > ol,\n\t.entry-content blockquote > ol,\n\t.entry-summary blockquote > ol,\n\t.comment-content blockquote > ol {\n\t\tmargin-right: 1.5em;\n\t\tmargin-left: auto;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-right: 1.75em;\n\t\tpadding-left: 0;\n\t}\n\n\t.sidebar,\n\t.widecolumn {\n\t\tpadding-right: 7.6923%;\n\t\tpadding-left: 23.0769%;\n\t}\n\n\tbody:not(.search-results) .entry-summary li > ul,\n\tbody:not(.search-results) .entry-summary blockquote > ul {\n\t\tmargin-right: 1.157894737em;\n\t\tmargin-left: auto;\n\t}\n\n\tbody:not(.search-results) .entry-summary li > ol,\n\tbody:not(.search-results) .entry-summary blockquote > ol {\n\t\tmargin-right: 1.473684211em;\n\t\tmargin-left: auto;\n\t}\n}\n\n\n/**\n * 10.2 - >= 910px\n */\n\n@media screen and (min-width: 56.875em) {\n\t.main-navigation .primary-menu > li {\n\t\tfloat: right;\n\t}\n\n\t.main-navigation ul ul {\n\t\tleft: auto;\n\t\tmargin: 0;\n\t\tright: -999em;\n\t}\n\n\t.main-navigation ul ul:before {\n\t\tleft: 9px;\n\t\tright: auto;\n\t}\n\n\t.main-navigation ul ul:after {\n\t\tleft: 11px;\n\t\tright: auto;\n\t}\n\n\t.main-navigation li:hover > ul,\n\t.main-navigation li.focus > ul {\n\t\tleft: 0;\n\t\tright: auto;\n\t}\n\n\t.main-navigation ul ul li:hover > ul,\n\t.main-navigation ul ul li.focus > ul {\n\t\tleft: 100%;\n\t\tright: auto;\n\t}\n\n\t.main-navigation .menu-item-has-children > a {\n\t\tmargin: 0;\n\t\tpadding-right: 0.875em;\n\t\tpadding-left: 2.25em;\n\t}\n\n\t.main-navigation .menu-item-has-children > a:after {\n\t\tleft: 0.625em;\n\t\tright: auto;\n\t}\n\n\t.main-navigation ul ul .menu-item-has-children > a {\n\t\tpadding-right: 0.875em;\n\t\tpadding-left: 2.0625em;\n\t}\n\n\t.main-navigation ul ul .menu-item-has-children > a:after {\n\t\tleft: 0.5625em;\n\t\tright: auto;\n\t\ttop: 0.8125em;\n\t\t-webkit-transform: rotate(-90deg);\n\t\t-moz-transform: rotate(-90deg);\n\t\t-ms-transform: rotate(-90deg);\n\t\ttransform: rotate(-90deg);\n\t}\n\n\t.content-area {\n\t\tfloat: right;\n\t\tmargin-right: auto;\n\t\tmargin-left: -100%;\n\t}\n\n\t.entry-header,\n\t.post-thumbnail,\n\t.entry-content,\n\t.entry-summary,\n\t.entry-footer,\n\t.comments-area,\n\t.image-navigation,\n\t.post-navigation,\n\t.pagination,\n\t.page-header,\n\t.page-content,\n\t.content-bottom-widgets {\n\t\tmargin-right: 0;\n\t\tmargin-left: 0;\n\t}\n\n\t.sidebar {\n\t\tfloat: right;\n\t\tmargin-right: 75%;\n\t\tmargin-left: auto;\n\t\tpadding: 0;\n\t}\n\n\t.widget blockquote {\n\t\tpadding-right: 1.0625em;\n\t\tpadding-left: 0;\n\t}\n\n\t.widget .alignright {\n\t\tmargin: 0.2307692308em 0 1.6153846154em 1.6153846154em;\n\t}\n\n\t.widget .alignleft {\n\t\tmargin: 0.2307692308em 1.6153846154em 1.6153846154em 0;\n\t}\n\n\t.tagcloud a {\n\t\tmargin: 0 0 0.5384615385em 0.2307692308em;\n\t}\n\n\t.content-bottom-widgets .widget-area:nth-child(1):nth-last-child(2),\n\t.content-bottom-widgets .widget-area:nth-child(2):nth-last-child(1) {\n\t\tfloat: right;\n\t\tmargin-right: auto;\n\t\tmargin-left: 7.1428571%;\n\t}\n\n\t.content-bottom-widgets .widget-area:nth-child(2):nth-last-child(1):last-of-type {\n\t\tmargin-right: auto;\n\t\tmargin-left: 0;\n\t}\n\n\t.site-info {\n\t\tmargin: 0.538461538em 0 0.538461538em auto;\n\t}\n\n\t.no-sidebar .entry-header,\n\t.no-sidebar .entry-content,\n\t.no-sidebar .entry-summary,\n\t.no-sidebar .entry-footer,\n\t.no-sidebar .comments-area,\n\t.no-sidebar .image-navigation,\n\t.no-sidebar .post-navigation,\n\t.no-sidebar .pagination,\n\t.no-sidebar .page-header,\n\t.no-sidebar .page-content,\n\t.no-sidebar .content-bottom-widgets {\n\t\tmargin-right: 15%;\n\t\tmargin-left: 15%;\n\t}\n\n\t.no-sidebar .post-thumbnail {\n\t\tmargin-right: 0;\n\t\tmargin-left: 0;\n\t}\n\n\t.widecolumn {\n\t\tpadding-right: 15%;\n\t\tpadding-left: 15%;\n\t}\n}\n\n\n/**\n * 10.3 - >= 985px\n */\n\n@media screen and (min-width: 61.5625em) {\n\tbody:not(.search-results) article:not(.type-page) .entry-content {\n\t\tfloat: left;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-content > blockquote.alignleft.below-entry-meta {\n\t\tmargin-right: 1.473684211em;\n\t\tmargin-left: 0;\n\t\twidth: -webkit-calc(50% - 0.736842105em);\n\t\twidth: calc(50% - 0.736842105em);;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-content > blockquote.alignright.below-entry-meta {\n\t\tmargin-right: -40%;\n\t\tmargin-left: 1.473684211em;\n\t\twidth: -webkit-calc(60% - 1.4736842105em);\n\t\twidth: calc(60% - 1.4736842105em);\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) img.below-entry-meta,\n\tbody:not(.search-results) article:not(.type-page) figure.below-entry-meta {\n\t\tmargin-right: -40%;\n\t\tmargin-left: 0;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-footer {\n\t\tfloat: right;\n\t}\n\n\tbody.no-sidebar:not(.search-results) article:not(.type-page) .entry-content {\n\t\tfloat: right;\n\t\tmargin-right: 34.99999999%;\n\t\tmargin-left: -100%;\n\t}\n\n\tbody.no-sidebar:not(.search-results) article:not(.type-page) .entry-footer {\n\t\tmargin-right: 15%;\n\t\tmargin-left: -100%;\n\t}\n}\n\n\n/**\n * 10.4 - >= 1200px\n */\n\n@media screen and (min-width: 75em) {\n\tbody:not(.search-results) .entry-summary li > ul,\n\tbody:not(.search-results) .entry-summary blockquote > ul {\n\t\tmargin-right: 0.956521739em;\n\t\tmargin-left: auto;\n\t}\n\n\tbody:not(.search-results) .entry-summary li > ol,\n\tbody:not(.search-results) .entry-summary blockquote > ol {\n\t\tmargin-right: 1.52173913em;\n\t\tmargin-left: auto;\n\t}\n\n\tbody:not(.search-results) .entry-summary blockquote {\n\t\tpadding-right: 1.347826087em;\n\t\tpadding-left: 0;\n\t}\n\n\tbody:not(.search-results) .entry-summary blockquote:not(.alignright):not(.alignleft) {\n\t\tmargin-right: -1.52173913em;\n\t\tmargin-left: auto;\n\t}\n\n\tbody:not(.search-results) .entry-summary blockquote blockquote:not(.alignright):not(.alignleft) {\n\t\tmargin-right: 0;\n\t\tmargin-left: auto;\n\t}\n\n\tbody:not(.search-results) .entry-summary .alignright {\n\t\tmargin: 0.2608695652em 0 1.5217391304em 1.5217391304em;\n\t}\n\n\tbody:not(.search-results) .entry-summary .alignleft {\n\t\tmargin: 0.2608695652em 1.5217391304em 1.5217391304em 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/search.php",
    "content": "<?php\n/**\n * The template for displaying search results pages\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nget_header(); ?>\n\n\t<section id=\"primary\" class=\"content-area\">\n\t\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\n\t\t<?php if ( have_posts() ) : ?>\n\n\t\t\t<header class=\"page-header\">\n\t\t\t\t<h1 class=\"page-title\"><?php printf( __( 'Search Results for: %s', 'twentysixteen' ), '<span>' . esc_html( get_search_query() ) . '</span>' ); ?></h1>\n\t\t\t</header><!-- .page-header -->\n\n\t\t\t<?php\n\t\t\t// Start the loop.\n\t\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t\t/**\n\t\t\t\t * Run the loop for the search to output the results.\n\t\t\t\t * If you want to overload this in a child theme then include a file\n\t\t\t\t * called content-search.php and that will be used instead.\n\t\t\t\t */\n\t\t\t\tget_template_part( 'template-parts/content', 'search' );\n\n\t\t\t// End the loop.\n\t\t\tendwhile;\n\n\t\t\t// Previous/next page navigation.\n\t\t\tthe_posts_pagination( array(\n\t\t\t\t'prev_text'          => __( 'Previous page', 'twentysixteen' ),\n\t\t\t\t'next_text'          => __( 'Next page', 'twentysixteen' ),\n\t\t\t\t'before_page_number' => '<span class=\"meta-nav screen-reader-text\">' . __( 'Page', 'twentysixteen' ) . ' </span>',\n\t\t\t) );\n\n\t\t// If no content, include the \"No posts found\" template.\n\t\telse :\n\t\t\tget_template_part( 'template-parts/content', 'none' );\n\n\t\tendif;\n\t\t?>\n\n\t\t</main><!-- .site-main -->\n\t</section><!-- .content-area -->\n\n<?php get_sidebar(); ?>\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/searchform.php",
    "content": "<?php\n/**\n * Template for displaying search forms in Twenty Sixteen\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n<form role=\"search\" method=\"get\" class=\"search-form\" action=\"<?php echo esc_url( home_url( '/' ) ); ?>\">\n\t<label>\n\t\t<span class=\"screen-reader-text\"><?php echo _x( 'Search for:', 'label', 'twentysixteen' ); ?></span>\n\t\t<input type=\"search\" class=\"search-field\" placeholder=\"<?php echo esc_attr_x( 'Search &hellip;', 'placeholder', 'twentysixteen' ); ?>\" value=\"<?php echo get_search_query(); ?>\" name=\"s\" title=\"<?php echo esc_attr_x( 'Search for:', 'label', 'twentysixteen' ); ?>\" />\n\t</label>\n\t<button type=\"submit\" class=\"search-submit\"><span class=\"screen-reader-text\"><?php echo _x( 'Search', 'submit button', 'twentysixteen' ); ?></span></button>\n</form>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/sidebar-content-bottom.php",
    "content": "<?php\n/**\n * The template for the content bottom widget areas on posts and pages\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nif ( ! is_active_sidebar( 'sidebar-2' ) && ! is_active_sidebar( 'sidebar-3' ) ) {\n\treturn;\n}\n\n// If we get this far, we have widgets. Let's do this.\n?>\n<aside id=\"content-bottom-widgets\" class=\"content-bottom-widgets\" role=\"complementary\">\n\t<?php if ( is_active_sidebar( 'sidebar-2' ) ) : ?>\n\t\t<div class=\"widget-area\">\n\t\t\t<?php dynamic_sidebar( 'sidebar-2' ); ?>\n\t\t</div><!-- .widget-area -->\n\t<?php endif; ?>\n\n\t<?php if ( is_active_sidebar( 'sidebar-3' ) ) : ?>\n\t\t<div class=\"widget-area\">\n\t\t\t<?php dynamic_sidebar( 'sidebar-3' ); ?>\n\t\t</div><!-- .widget-area -->\n\t<?php endif; ?>\n</aside><!-- .content-bottom-widgets -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/sidebar.php",
    "content": "<?php\n/**\n * The template for the sidebar containing the main widget area\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n<?php if ( is_active_sidebar( 'sidebar-1' )  ) : ?>\n\t<aside id=\"secondary\" class=\"sidebar widget-area\" role=\"complementary\">\n\t\t<?php dynamic_sidebar( 'sidebar-1' ); ?>\n\t</aside><!-- .sidebar .widget-area -->\n<?php endif; ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/single.php",
    "content": "<?php\n/**\n * The template for displaying all single posts and attachments\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n\nget_header(); ?>\n\n<div id=\"primary\" class=\"content-area\">\n\t<main id=\"main\" class=\"site-main\" role=\"main\">\n\t\t<?php\n\t\t// Start the loop.\n\t\twhile ( have_posts() ) : the_post();\n\n\t\t\t// Include the single post content template.\n\t\t\tget_template_part( 'template-parts/content', 'single' );\n\n\t\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\t\tif ( comments_open() || get_comments_number() ) {\n\t\t\t\tcomments_template();\n\t\t\t}\n\n\t\t\tif ( is_singular( 'attachment' ) ) {\n\t\t\t\t// Parent post navigation.\n\t\t\t\tthe_post_navigation( array(\n\t\t\t\t\t'prev_text' => _x( '<span class=\"meta-nav\">Published in</span><span class=\"post-title\">%title</span>', 'Parent post link', 'twentysixteen' ),\n\t\t\t\t) );\n\t\t\t} elseif ( is_singular( 'post' ) ) {\n\t\t\t\t// Previous/next post navigation.\n\t\t\t\tthe_post_navigation( array(\n\t\t\t\t\t'next_text' => '<span class=\"meta-nav\" aria-hidden=\"true\">' . __( 'Next', 'twentysixteen' ) . '</span> ' .\n\t\t\t\t\t\t'<span class=\"screen-reader-text\">' . __( 'Next post:', 'twentysixteen' ) . '</span> ' .\n\t\t\t\t\t\t'<span class=\"post-title\">%title</span>',\n\t\t\t\t\t'prev_text' => '<span class=\"meta-nav\" aria-hidden=\"true\">' . __( 'Previous', 'twentysixteen' ) . '</span> ' .\n\t\t\t\t\t\t'<span class=\"screen-reader-text\">' . __( 'Previous post:', 'twentysixteen' ) . '</span> ' .\n\t\t\t\t\t\t'<span class=\"post-title\">%title</span>',\n\t\t\t\t) );\n\t\t\t}\n\n\t\t\t// End of the loop.\n\t\tendwhile;\n\t\t?>\n\n\t</main><!-- .site-main -->\n\n\t<?php get_sidebar( 'content-bottom' ); ?>\n\n</div><!-- .content-area -->\n\n<?php get_sidebar(); ?>\n<?php get_footer(); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/style.css",
    "content": "/*\nTheme Name: Twenty Sixteen\nTheme URI: https://wordpress.org/themes/twentysixteen/\nAuthor: the WordPress team\nAuthor URI: https://wordpress.org/\nDescription: Twenty Sixteen is a modernized take on an ever-popular WordPress layout — the horizontal masthead with an optional right sidebar that works perfectly for blogs and websites. It has custom color options with beautiful default color schemes, a harmonious fluid grid using a mobile-first approach, and impeccable polish in every detail. Twenty Sixteen will make your WordPress look beautiful everywhere.\nVersion: 1.1\nLicense: GNU General Public License v2 or later\nLicense URI: http://www.gnu.org/licenses/gpl-2.0.html\nTags: black, blue, gray, red, white, yellow, dark, light, one-column, two-columns, right-sidebar, fixed-layout, responsive-layout, accessibility-ready, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-images, flexible-header, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready\nText Domain: twentysixteen\n\nThis theme, like WordPress, is licensed under the GPL.\nUse it to make something cool, have fun, and share what you've learned with others.\n*/\n\n\n/**\n * Table of Contents\n *\n * 1.0 - Normalize\n * 2.0 - Genericons\n * 3.0 - Typography\n * 4.0 - Elements\n * 5.0 - Forms\n * 6.0 - Navigation\n *   6.1 - Links\n *   6.2 - Menus\n * 7.0 - Accessibility\n * 8.0 - Alignments\n * 9.0 - Clearings\n * 10.0 - Widgets\n * 11.0 - Content\n *    11.1 - Header\n *    11.2 - Posts and pages\n *    11.3 - Post Formats\n *    11.4 - Comments\n *    11.5 - Sidebar\n *    11.6 - Footer\n * 12.0 - Media\n *    12.1 - Captions\n *    12.2 - Galleries\n * 13.0 - Multisite\n * 14.0 - Media Queries\n *    14.1 - >= 710px\n *    14.2 - >= 783px\n *    14.3 - >= 910px\n *    14.4 - >= 985px\n *    14.5 - >= 1200px\n * 15.0 - Print\n */\n\n\n/**\n * 1.0 - Normalize\n *\n * Normalizing styles have been helped along thanks to the fine work of\n * Nicolas Gallagher and Jonathan Neal http://necolas.github.com/normalize.css/\n */\n\nhtml {\n\tfont-family: sans-serif;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust: 100%;\n}\n\nbody {\n\tmargin: 0;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n\tdisplay: block;\n}\n\naudio,\ncanvas,\nprogress,\nvideo {\n\tdisplay: inline-block;\n\tvertical-align: baseline;\n}\n\naudio:not([controls]) {\n\tdisplay: none;\n\theight: 0;\n}\n\n[hidden],\ntemplate {\n\tdisplay: none;\n}\n\na {\n\tbackground-color: transparent;\n}\n\nabbr[title] {\n\tborder-bottom: 1px dotted;\n}\n\nb,\nstrong {\n\tfont-weight: 700;\n}\n\nsmall {\n\tfont-size: 80%;\n}\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nimg {\n\tborder: 0;\n}\n\nsvg:not(:root) {\n\toverflow: hidden;\n}\n\nfigure {\n\tmargin: 0;\n}\n\nhr {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\ncode,\nkbd,\npre,\nsamp {\n\tfont-size: 1em;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tcolor: inherit;\n\tfont: inherit;\n\tmargin: 0;\n}\n\nselect {\n\ttext-transform: none;\n}\n\nbutton {\n\toverflow: visible;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n\tmax-width: 100%;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n\t-webkit-appearance: button;\n\tcursor: pointer;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n\tcursor: default;\n\topacity: .5;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-right: 0.4375em;\n\tpadding: 0;\n}\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n\theight: auto;\n}\n\ninput[type=\"search\"] {\n\t-webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\nfieldset {\n\tborder: 1px solid #d1d1d1;\n\tmargin: 0 0 1.75em;\n\tpadding: 0.875em;\n}\n\nfieldset > :last-child {\n\tmargin-bottom: 0;\n}\n\nlegend {\n\tborder: 0;\n\tpadding: 0;\n}\n\ntextarea {\n\toverflow: auto;\n\tvertical-align: top;\n}\n\noptgroup {\n\tfont-weight: bold;\n}\n\n\n/**\n * 2.0 - Genericons\n */\n\n.menu-item-has-children a:after,\n.social-navigation a:before,\n.dropdown-toggle:after,\n.bypostauthor > article .fn:after,\n.comment-reply-title small a:before,\n.pagination .prev:before,\n.pagination .next:before,\n.pagination .nav-links:before,\n.pagination .nav-links:after,\n.search-submit:before {\n\t-moz-osx-font-smoothing: grayscale;\n\t-webkit-font-smoothing: antialiased;\n\tdisplay: inline-block;\n\tfont-family: \"Genericons\";\n\tfont-size: 16px;\n\tfont-style: normal;\n\tfont-variant: normal;\n\tfont-weight: normal;\n\tline-height: 1;\n\tspeak: none;\n\ttext-align: center;\n\ttext-decoration: inherit;\n\ttext-transform: none;\n\tvertical-align: top;\n}\n\n\n/**\n * 3.0 - Typography\n */\n\nbody,\nbutton,\ninput,\nselect,\ntextarea {\n\tcolor: #1a1a1a;\n\tfont-family: Merriweather, Georgia, serif;\n\tfont-size: 16px;\n\tfont-size: 1rem;\n\tline-height: 1.75;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tclear: both;\n\tfont-weight: 700;\n\tmargin: 0;\n\ttext-rendering: optimizeLegibility;\n}\n\np {\n\tmargin: 0 0 1.75em;\n}\n\ndfn,\ncite,\nem,\ni {\n\tfont-style: italic;\n}\n\nblockquote {\n\tborder: 0 solid #1a1a1a;\n\tborder-left-width: 4px;\n\tcolor: #686868;\n\tfont-size: 19px;\n\tfont-size: 1.1875rem;\n\tfont-style: italic;\n\tline-height: 1.4736842105;\n\tmargin: 0 0 1.4736842105em;\n\tpadding: 0 0 0 1.263157895em;\n}\n\nblockquote,\nq {\n\tquotes: none;\n}\n\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n\tcontent: \"\";\n}\n\nblockquote p {\n\tmargin-bottom: 1.4736842105em;\n}\n\nblockquote cite,\nblockquote small {\n\tcolor: #1a1a1a;\n\tdisplay: block;\n\tfont-size: 16px;\n\tfont-size: 1rem;\n\tline-height: 1.75;\n}\n\nblockquote cite:before,\nblockquote small:before {\n\tcontent: \"\\2014\\00a0\";\n}\n\nblockquote em,\nblockquote i,\nblockquote cite {\n\tfont-style: normal;\n}\n\nblockquote strong,\nblockquote b {\n\tfont-weight: 400;\n}\n\nblockquote > :last-child {\n\tmargin-bottom: 0;\n}\n\naddress {\n\tfont-style: italic;\n\tmargin: 0 0 1.75em;\n}\n\ncode,\nkbd,\ntt,\nvar,\nsamp,\npre {\n\tfont-family: Inconsolata, monospace;\n}\n\npre {\n\tborder: 1px solid #d1d1d1;\n\tfont-size: 16px;\n\tfont-size: 1rem;\n\tline-height: 1.3125;\n\tmargin: 0 0 1.75em;\n\tmax-width: 100%;\n\toverflow: auto;\n\tpadding: 1.75em;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\ncode {\n\tbackground-color: #d1d1d1;\n\tpadding: 0.125em 0.25em;\n}\n\nabbr,\nacronym {\n\tborder-bottom: 1px dotted #d1d1d1;\n\tcursor: help;\n}\n\nmark,\nins {\n\tbackground: #007acc;\n\tcolor: #fff;\n\tpadding: 0.125em 0.25em;\n\ttext-decoration: none;\n}\n\nbig {\n\tfont-size: 125%;\n}\n\n\n/**\n * 4.0 - Elements\n */\n\nhtml {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n*,\n*:before,\n*:after {\n\t/* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */\n\t-webkit-box-sizing: inherit;\n\t-moz-box-sizing: inherit;\n\tbox-sizing: inherit;\n}\n\nbody {\n\tbackground: #1a1a1a;\n\t/* Fallback for when there is no custom background color defined. */\n}\n\nhr {\n\tbackground-color: #d1d1d1;\n\tborder: 0;\n\theight: 1px;\n\tmargin: 0 0 1.75em;\n}\n\nul,\nol {\n\tmargin: 0 0 1.75em 1.25em;\n\tpadding: 0;\n}\n\nul {\n\tlist-style: disc;\n}\n\nol {\n\tlist-style: decimal;\n\tmargin-left: 1.5em;\n}\n\nli > ul,\nli > ol {\n\tmargin-bottom: 0;\n}\n\ndl {\n\tmargin: 0 0 1.75em;\n}\n\ndt {\n\tfont-weight: 700;\n}\n\ndd {\n\tmargin: 0 0 1.75em;\n}\n\nimg {\n\theight: auto;\n\t/* Make sure images are scaled correctly. */\n\tmax-width: 100%;\n\t/* Adhere to container width. */\n\tvertical-align: middle;\n}\n\ndel {\n\topacity: 0.8;\n}\n\ntable,\nth,\ntd {\n\tborder: 1px solid #d1d1d1;\n}\n\ntable {\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n\tborder-width: 1px 0 0 1px;\n\tmargin: 0 0 1.75em;\n\ttable-layout: fixed;\n\t/* Prevents HTML tables from becoming too wide */\n\twidth: 100%;\n}\n\ncaption,\nth,\ntd {\n\tfont-weight: normal;\n\ttext-align: left;\n}\n\nth {\n\tborder-width: 0 1px 1px 0;\n\tfont-weight: 700;\n}\n\ntd {\n\tborder-width: 0 1px 1px 0;\n}\n\nth,\ntd {\n\tpadding: 0.4375em;\n}\n\n/* Placeholder text color -- selectors need to be separate to work. */\n::-webkit-input-placeholder {\n\tcolor: #686868;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n}\n\n:-moz-placeholder {\n\tcolor: #686868;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n}\n\n::-moz-placeholder {\n\tcolor: #686868;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\topacity: 1;\n\t/* Since FF19 lowers the opacity of the placeholder by default */\n}\n\n:-ms-input-placeholder {\n\tcolor: #686868;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n}\n\n\n/**\n * 5.0 - Forms\n */\n\ninput {\n\tline-height: normal;\n}\n\nbutton,\nbutton[disabled]:hover,\nbutton[disabled]:focus,\ninput[type=\"button\"],\ninput[type=\"button\"][disabled]:hover,\ninput[type=\"button\"][disabled]:focus,\ninput[type=\"reset\"],\ninput[type=\"reset\"][disabled]:hover,\ninput[type=\"reset\"][disabled]:focus,\ninput[type=\"submit\"],\ninput[type=\"submit\"][disabled]:hover,\ninput[type=\"submit\"][disabled]:focus {\n\tbackground: #1a1a1a;\n\tborder: 0;\n\tborder-radius: 2px;\n\tcolor: #fff;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-weight: 700;\n\tletter-spacing: 0.046875em;\n\tline-height: 1;\n\tpadding: 0.84375em 0.875em 0.78125em;\n\ttext-transform: uppercase;\n}\n\nbutton:hover,\nbutton:focus,\ninput[type=\"button\"]:hover,\ninput[type=\"button\"]:focus,\ninput[type=\"reset\"]:hover,\ninput[type=\"reset\"]:focus,\ninput[type=\"submit\"]:hover,\ninput[type=\"submit\"]:focus {\n\tbackground: #007acc;\n}\n\nbutton:focus,\ninput[type=\"button\"]:focus,\ninput[type=\"reset\"]:focus,\ninput[type=\"submit\"]:focus {\n\toutline: thin dotted;\n\toutline-offset: -4px;\n}\n\ninput[type=\"text\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"password\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"number\"],\ntextarea {\n\tbackground: #f7f7f7;\n\tbackground-image: -webkit-linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0));\n\tborder: 1px solid #d1d1d1;\n\tborder-radius: 2px;\n\tcolor: #686868;\n\tpadding: 0.625em 0.4375em;\n\twidth: 100%;\n}\n\ninput[type=\"text\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"number\"]:focus,\ntextarea:focus {\n\tbackground-color: #fff;\n\tborder-color: #007acc;\n\tcolor: #1a1a1a;\n\toutline: 0;\n}\n\n.post-password-form {\n\tmargin-bottom: 1.75em;\n}\n\n.post-password-form label {\n\tcolor: #686868;\n\tdisplay: block;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tletter-spacing: 0.076923077em;\n\tline-height: 1.6153846154;\n\tmargin-bottom: 1.75em;\n\ttext-transform: uppercase;\n}\n\n.post-password-form input[type=\"password\"] {\n\tmargin-top: 0.4375em;\n}\n\n.post-password-form > :last-child {\n\tmargin-bottom: 0;\n}\n\n.search-form {\n\tposition: relative;\n}\n\ninput[type=\"search\"].search-field {\n\tborder-radius: 2px 0 0 2px;\n\twidth: -webkit-calc(100% - 42px);\n\twidth: calc(100% - 42px);\n}\n\n.search-submit:before {\n\tcontent: \"\\f400\";\n\tfont-size: 24px;\n\tleft: 2px;\n\tline-height: 42px;\n\tposition: relative;\n\twidth: 40px;\n}\n\n.search-submit {\n\tborder-radius: 0 2px 2px 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n\twidth: 42px;\n}\n\n\n/**\n * 6.0 - Navigation\n */\n\n/**\n * 6.1 - Links\n */\n\na {\n\tcolor: #007acc;\n\ttext-decoration: none;\n}\n\na:hover,\na:focus,\na:active {\n\tcolor: #686868;\n}\n\na:focus {\n\toutline: thin dotted;\n}\n\na:hover,\na:active {\n\toutline: 0;\n}\n\n.entry-content a,\n.entry-summary a,\n.taxonomy-description a,\n.logged-in-as a,\n.comment-content a,\n.pingback .comment-body > a,\n.textwidget a,\n.entry-footer a:hover,\n.site-info a:hover {\n\tbox-shadow: 0 1px 0 0 currentColor;\n}\n\n.entry-content a:hover,\n.entry-content a:focus,\n.entry-summary a:hover,\n.entry-summary a:focus,\n.taxonomy-description a:hover,\n.taxonomy-description a:focus,\n.logged-in-as a:hover,\n.logged-in-as a:focus,\n.comment-content a:hover,\n.comment-content a:focus,\n.pingback .comment-body > a:hover,\n.pingback .comment-body > a:focus,\n.textwidget a:hover,\n.textwidget a:focus {\n\tbox-shadow: none;\n}\n\n\n/**\n * 6.2 - Menus\n */\n\n.site-header-menu {\n\tdisplay: none;\n\t-webkit-flex: 0 1 100%;\n\t-ms-flex: 0 1 100%;\n\tflex: 0 1 100%;\n\tmargin: 0.875em 0;\n}\n\n.site-header-menu.toggled-on,\n.no-js .site-header-menu {\n\tdisplay: block;\n}\n\n.main-navigation {\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n}\n\n.site-footer .main-navigation {\n\tmargin-bottom: 1.75em;\n}\n\n.main-navigation ul {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.main-navigation li {\n\tborder-top: 1px solid #d1d1d1;\n\tposition: relative;\n}\n\n.main-navigation a {\n\tcolor: #1a1a1a;\n\tdisplay: block;\n\tline-height: 1.3125;\n\toutline-offset: -1px;\n\tpadding: 0.84375em 0;\n}\n\n.main-navigation a:hover,\n.main-navigation a:focus {\n\tcolor: #007acc;\n}\n\n.main-navigation .current-menu-item > a,\n.main-navigation .current-menu-ancestor > a {\n\tfont-weight: 700;\n}\n\n.main-navigation ul ul {\n\tdisplay: none;\n\tmargin-left: 0.875em;\n}\n\n.no-js .main-navigation ul ul {\n\tdisplay: block;\n}\n\n.main-navigation ul .toggled-on {\n\tdisplay: block;\n}\n\n.main-navigation .primary-menu {\n\tborder-bottom: 1px solid #d1d1d1;\n}\n\n.main-navigation .menu-item-has-children > a {\n\tmargin-right: 56px;\n}\n\n.dropdown-toggle {\n\tbackground-color: transparent;\n\tborder: 0;\n\tborder-radius: 0;\n\tcolor: #1a1a1a;\n\tcontent: \"\";\n\theight: 48px;\n\tpadding: 0;\n\tposition: absolute;\n\tright: 0;\n\ttext-transform: none;\n\ttop: 0;\n\twidth: 48px;\n}\n\n.dropdown-toggle:after {\n\tborder: 0 solid #d1d1d1;\n\tborder-left-width: 1px;\n\tcontent: \"\\f431\";\n\tfont-size: 24px;\n\tleft: 1px;\n\tposition: relative;\n\twidth: 48px;\n}\n\n.dropdown-toggle:hover,\n.dropdown-toggle:focus {\n\tbackground-color: transparent;\n\tcolor: #007acc;\n}\n\n.dropdown-toggle:focus {\n\toutline: thin dotted;\n\toutline-offset: -1px;\n}\n\n.dropdown-toggle:focus:after {\n\tborder-color: transparent;\n}\n\n.dropdown-toggle.toggled-on:after {\n\tcontent: \"\\f432\";\n}\n\n.site-header .main-navigation + .social-navigation {\n\tmargin-top: 1.75em;\n}\n\n.site-footer .social-navigation {\n\tmargin-bottom: 1.75em;\n}\n\n.social-navigation ul {\n\tlist-style: none;\n\tmargin: 0 0 -0.4375em;\n}\n\n.social-navigation li {\n\tfloat: left;\n\tmargin: 0 0.4375em 0.4375em 0;\n}\n\n.social-navigation a {\n\tborder: 1px solid #d1d1d1;\n\tborder-radius: 50%;\n\tcolor: #1a1a1a;\n\tdisplay: block;\n\theight: 35px;\n\tposition: relative;\n\twidth: 35px;\n}\n\n.social-navigation a:before {\n\tcontent: \"\\f415\";\n\theight: 33px;\n\tline-height: 33px;\n\ttext-align: center;\n\twidth: 33px;\n}\n\n.social-navigation a:hover:before,\n.social-navigation a:focus:before {\n\tcolor: #007acc;\n}\n\n.social-navigation a[href*=\"codepen.io\"]:before {\n\tcontent: \"\\f216\";\n}\n\n.social-navigation a[href*=\"digg.com\"]:before {\n\tcontent: \"\\f221\";\n}\n\n.social-navigation a[href*=\"dribbble.com\"]:before {\n\tcontent: \"\\f201\";\n}\n\n.social-navigation a[href*=\"dropbox.com\"]:before {\n\tcontent: \"\\f225\";\n}\n\n.social-navigation a[href*=\"facebook.com\"]:before {\n\tcontent: \"\\f203\";\n}\n\n.social-navigation a[href*=\"flickr.com\"]:before {\n\tcontent: \"\\f211\";\n}\n\n.social-navigation a[href*=\"foursquare.com\"]:before {\n\tcontent: \"\\f226\";\n}\n\n.social-navigation a[href*=\"plus.google.com\"]:before {\n\tcontent: \"\\f206\";\n}\n\n.social-navigation a[href*=\"github.com\"]:before {\n\tcontent: \"\\f200\";\n}\n\n.social-navigation a[href*=\"instagram.com\"]:before {\n\tcontent: \"\\f215\";\n}\n\n.social-navigation a[href*=\"linkedin.com\"]:before {\n\tcontent: \"\\f208\";\n}\n\n.social-navigation a[href*=\"path.com\"]:before {\n\tcontent: \"\\f219\";\n}\n\n.social-navigation a[href*=\"pinterest.com\"]:before {\n\tcontent: \"\\f210\";\n}\n\n.social-navigation a[href*=\"getpocket.com\"]:before {\n\tcontent: \"\\f224\";\n}\n\n.social-navigation a[href*=\"polldaddy.com\"]:before {\n\tcontent: \"\\f217\";\n}\n\n.social-navigation a[href*=\"reddit.com\"]:before {\n\tcontent: \"\\f222\";\n}\n\n.social-navigation a[href*=\"skype.com\"]:before {\n\tcontent: \"\\f220\";\n}\n\n.social-navigation a[href*=\"stumbleupon.com\"]:before {\n\tcontent: \"\\f223\";\n}\n\n.social-navigation a[href*=\"tumblr.com\"]:before {\n\tcontent: \"\\f214\";\n}\n\n.social-navigation a[href*=\"twitter.com\"]:before {\n\tcontent: \"\\f202\";\n}\n\n.social-navigation a[href*=\"vimeo.com\"]:before {\n\tcontent: \"\\f212\";\n}\n\n.social-navigation a[href*=\"wordpress.com\"]:before,\n.social-navigation a[href*=\"wordpress.org\"]:before {\n\tcontent: \"\\f205\";\n}\n\n.social-navigation a[href*=\"youtube.com\"]:before {\n\tcontent: \"\\f213\";\n}\n\n.social-navigation a[href^=\"mailto:\"]:before {\n\tcontent: \"\\f410\";\n}\n\n.social-navigation a[href*=\"spotify.com\"]:before {\n\tcontent: \"\\f515\";\n}\n\n.social-navigation a[href*=\"twitch.tv\"]:before {\n\tcontent: \"\\f516\";\n}\n\n.social-navigation a[href$=\"/feed/\"]:before {\n\tcontent: \"\\f413\";\n}\n\n.post-navigation {\n\tborder-top: 4px solid #1a1a1a;\n\tborder-bottom: 4px solid #1a1a1a;\n\tclear: both;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tmargin: 0 7.6923% 3.5em;\n}\n\n.post-navigation a {\n\tcolor: #1a1a1a;\n\tdisplay: block;\n\tpadding: 1.75em 0;\n}\n\n.post-navigation span {\n\tdisplay: block;\n}\n\n.post-navigation .meta-nav {\n\tcolor: #686868;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tletter-spacing: 0.076923077em;\n\tline-height: 1.6153846154;\n\tmargin-bottom: 0.5384615385em;\n\ttext-transform: uppercase;\n}\n\n.post-navigation .post-title {\n\tdisplay: inline;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 23px;\n\tfont-size: 1.4375rem;\n\tfont-weight: 700;\n\tline-height: 1.2173913043;\n\ttext-rendering: optimizeLegibility;\n}\n\n.post-navigation a:hover .post-title,\n.post-navigation a:focus .post-title {\n\tcolor: #007acc;\n}\n\n.post-navigation div + div {\n\tborder-top: 4px solid #1a1a1a;\n}\n\n.pagination {\n\tborder-top: 4px solid #1a1a1a;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 19px;\n\tfont-size: 1.1875rem;\n\tmargin: 0 7.6923% 2.947368421em;\n\tmin-height: 56px;\n\tposition: relative;\n}\n\n.pagination:before,\n.pagination:after {\n\tbackground-color: #1a1a1a;\n\tcontent: \"\";\n\theight: 52px;\n\tposition: absolute;\n\ttop:0;\n\twidth: 52px;\n\tz-index: 0;\n}\n\n.pagination:before {\n\tright: 0;\n}\n\n.pagination:after {\n\tright: 54px;\n}\n\n.pagination a:hover,\n.pagination a:focus {\n\tcolor: #1a1a1a;\n}\n\n.pagination .nav-links {\n\tpadding-right: 106px;\n\tposition: relative;\n}\n\n.pagination .nav-links:before,\n.pagination .nav-links:after {\n\tcolor: #fff;\n\tfont-size: 32px;\n\tline-height: 51px;\n\topacity: 0.3;\n\tposition: absolute;\n\twidth: 52px;\n\tz-index: 1;\n}\n\n.pagination .nav-links:before {\n\tcontent: \"\\f429\";\n\tright: -1px;\n}\n\n.pagination .nav-links:after {\n\tcontent: \"\\f430\";\n\tright: 55px;\n}\n\n/* reset screen-reader-text */\n.pagination .current .screen-reader-text {\n\tposition: static !important;\n}\n\n.pagination .page-numbers {\n\tdisplay: none;\n\tletter-spacing: 0.013157895em;\n\tline-height: 1;\n\tmargin: 0 0.7368421053em 0 -0.7368421053em;\n\tpadding: 0.8157894737em 0.7368421053em 0.3947368421em;\n\ttext-transform: uppercase;\n}\n\n.pagination .current {\n\tdisplay: inline-block;\n\tfont-weight: 700;\n}\n\n.pagination .prev,\n.pagination .next {\n\tbackground-color: #1a1a1a;\n\tcolor: #fff;\n\tdisplay: inline-block;\n\theight: 52px;\n\tmargin: 0;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\ttop: 0;\n\twidth: 52px;\n\tz-index: 2;\n}\n\n.pagination .prev:before,\n.pagination .next:before {\n\tfont-size: 32px;\n\theight: 53px;\n\tline-height: 52px;\n\tposition: relative;\n\twidth: 53px;\n}\n\n.pagination .prev:hover,\n.pagination .prev:focus,\n.pagination .next:hover,\n.pagination .next:focus {\n\tbackground-color: #007acc;\n\tcolor: #fff;\n}\n\n.pagination .prev:focus,\n.pagination .next:focus {\n\toutline: 0;\n}\n\n.pagination .prev {\n\tright: 54px;\n}\n\n.pagination .prev:before {\n\tcontent: \"\\f430\";\n\tleft: -1px;\n\ttop: -1px;\n}\n\n.pagination .next {\n\tright: 0;\n}\n\n.pagination .next:before {\n\tcontent: \"\\f429\";\n\tright: -1px;\n\ttop: -1px;\n}\n\n.image-navigation,\n.comment-navigation {\n\tborder-top: 1px solid #d1d1d1;\n\tborder-bottom: 1px solid #d1d1d1;\n\tcolor: #686868;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1.6153846154;\n\tmargin: 0 7.6923% 2.1538461538em;\n\tpadding: 1.0769230769em 0;\n}\n\n.comment-navigation {\n\tmargin-right: 0;\n\tmargin-left: 0;\n}\n\n.comments-title + .comment-navigation {\n\tborder-bottom: 0;\n\tmargin-bottom: 0;\n}\n\n.image-navigation .nav-previous:not(:empty),\n.image-navigation .nav-next:not(:empty),\n.comment-navigation .nav-previous:not(:empty),\n.comment-navigation .nav-next:not(:empty) {\n\tdisplay: inline-block;\n}\n\n.image-navigation .nav-previous:not(:empty) + .nav-next:not(:empty):before,\n.comment-navigation .nav-previous:not(:empty) + .nav-next:not(:empty):before {\n\tcontent: \"\\002f\";\n\tdisplay: inline-block;\n\topacity: 0.7;\n\tpadding: 0 0.538461538em;\n}\n\n\n/**\n * 7.0 - Accessibility\n */\n\n/* Text meant only for screen readers */\n.says,\n.screen-reader-text {\n\tclip: rect(1px, 1px, 1px, 1px);\n\theight: 1px;\n\toverflow: hidden;\n\tposition: absolute !important;\n\twidth: 1px;\n\t/* many screen reader and browser combinations announce broken words as they would appear visually */\n\tword-wrap: normal !important;\n}\n\n/* must have higher specificity than alternative color schemes inline styles */\n.site .skip-link {\n\tbackground-color: #f1f1f1;\n\tbox-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.2);\n\tcolor: #21759b;\n\tdisplay: block;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 14px;\n\tfont-weight: 700;\n\tleft: -9999em;\n\toutline: none;\n\tpadding: 15px 23px 14px;\n\ttext-decoration: none;\n\ttext-transform: none;\n\ttop: -9999em;\n}\n\n.logged-in .site .skip-link {\n\tbox-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.2);\n\tfont-family: \"Open Sans\", sans-serif;\n}\n\n.site .skip-link:focus {\n\tclip: auto;\n\theight: auto;\n\tleft: 6px;\n\ttop: 7px;\n\twidth: auto;\n\tz-index: 100000;\n}\n\n\n/**\n * 8.0 - Alignments\n */\n\n.alignleft {\n\tfloat: left;\n\tmargin: 0.375em 1.75em 1.75em 0;\n}\n\n.alignright {\n\tfloat: right;\n\tmargin: 0.375em 0 1.75em 1.75em;\n}\n\n.aligncenter {\n\tclear: both;\n\tdisplay: block;\n\tmargin: 0 auto 1.75em;\n}\n\nblockquote.alignleft {\n\tmargin: 0.3157894737em 1.4736842105em 1.473684211em 0;\n}\n\nblockquote.alignright {\n\tmargin: 0.3157894737em 0 1.473684211em 1.4736842105em;\n}\n\nblockquote.aligncenter {\n\tmargin-bottom: 1.473684211em;\n}\n\n\n/**\n * 9.0 - Clearings\n */\n\n.clear:before,\n.clear:after,\nblockquote:before,\nblockquote:after,\n.entry-content:before,\n.entry-content:after,\n.entry-summary:before,\n.entry-summary:after,\n.comment-content:before,\n.comment-content:after,\n.site-content:before,\n.site-content:after,\n.site-main > article:before,\n.site-main > article:after,\n.primary-menu:before,\n.primary-menu:after,\n.social-links-menu:before,\n.social-links-menu:after,\n.textwidget:before,\n.textwidget:after,\n.content-bottom-widgets:before,\n.content-bottom-widgets:after {\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.clear:after,\nblockquote:after,\n.entry-content:after,\n.entry-summary:after,\n.comment-content:after,\n.site-content:after,\n.site-main > article:after,\n.primary-menu:after,\n.social-links-menu:after,\n.textwidget:after,\n.content-bottom-widgets:after {\n\tclear: both;\n}\n\n\n/**\n * 10.0 - Widgets\n */\n\n.widget {\n\tborder-top: 4px solid #1a1a1a;\n\tmargin-bottom: 3.5em;\n\tpadding-top: 1.75em;\n}\n\n.widget-area > :last-child,\n.widget > :last-child {\n\tmargin-bottom: 0;\n}\n\n.widget .widget-title {\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 16px;\n\tfont-size: 1rem;\n\tletter-spacing: 0.046875em;\n\tline-height: 1.3125;\n\tmargin: 0 0 1.75em;\n\ttext-transform: uppercase;\n}\n\n.widget .widget-title:empty {\n\tmargin-bottom: 0;\n}\n\n.widget-title a {\n\tcolor: #1a1a1a;\n}\n\n/* Calendar widget */\n.widget.widget_calendar table {\n\tmargin: 0;\n}\n\n.widget_calendar td,\n.widget_calendar th {\n\tline-height: 2.5625;\n\tpadding: 0;\n\ttext-align: center;\n}\n\n.widget_calendar caption {\n\tfont-weight: 900;\n\tmargin-bottom: 1.75em;\n}\n\n.widget_calendar tbody a {\n\tbackground-color: #007acc;\n\tcolor: #fff;\n\tdisplay: block;\n\tfont-weight: 700;\n}\n\n.widget_calendar tbody a:hover,\n.widget_calendar tbody a:focus {\n\tbackground-color: #686868;\n\tcolor: #fff;\n}\n\n/* Recent Posts widget */\n.widget_recent_entries .post-date {\n\tcolor: #686868;\n\tdisplay: block;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1.615384615;\n\tmargin-bottom: 0.538461538em;\n}\n\n.widget_recent_entries li:last-child .post-date {\n\tmargin-bottom: 0;\n}\n\n/* RSS widget */\n.widget_rss .rsswidget img {\n\tmargin-top: -0.375em;\n}\n\n.widget_rss .rss-date,\n.widget_rss cite {\n\tcolor: #686868;\n\tdisplay: block;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tfont-style: normal;\n\tline-height: 1.615384615;\n\tmargin-bottom: 0.538461538em;\n}\n\n.widget_rss .rssSummary:last-child {\n\tmargin-bottom: 2.1538461538em;\n}\n\n.widget_rss li:last-child :last-child {\n\tmargin-bottom: 0;\n}\n\n/* Tag Cloud widget */\n.tagcloud a {\n\tborder: 1px solid #d1d1d1;\n\tborder-radius: 2px;\n\tdisplay: inline-block;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tline-height: 1;\n\tmargin: 0 0.1875em 0.4375em 0;\n\tpadding: 0.5625em 0.4375em 0.5em;\n}\n\n.tagcloud a:hover,\n.tagcloud a:focus {\n\tborder-color: #007acc;\n\tcolor: #007acc;\n\toutline: 0;\n}\n\n\n/**\n * 11.0 - Content\n */\n\n.site {\n\tbackground-color: #fff;\n}\n\n.site-inner {\n\tmargin: 0 auto;\n\tmax-width: 1320px;\n\tposition: relative;\n}\n\n.site-content {\n\tword-wrap: break-word;\n}\n\n/* Do not show the outline on the skip link target. */\n#content[tabindex=\"-1\"]:focus {\n\toutline: 0;\n}\n\n.site-main {\n\tmargin-bottom: 3.5em;\n}\n\n.site-main > :last-child {\n\tmargin-bottom: 0;\n}\n\n\n/**\n * 11.1 - Header\n */\n\n.site-header {\n\tpadding: 2.625em 7.6923%;\n}\n\n.site-header-main {\n\t-webkit-align-items: center;\n\t-ms-flex-align: center;\n\talign-items: center;\n\tdisplay: -webkit-flex;\n\tdisplay: -ms-flexbox;\n\tdisplay: flex;\n\t-webkit-flex-wrap: wrap;\n\t-ms-flex-wrap: wrap;\n\tflex-wrap: wrap;\n}\n\n.site-branding {\n\tmargin: 0.875em auto 0.875em 0;\n}\n\n.site-title {\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 23px;\n\tfont-size: 1.4375rem;\n\tfont-weight: 700;\n\tline-height: 1.2173913043;\n\tmargin: 0;\n}\n\n.site-branding .site-title a {\n\tcolor: #1a1a1a;\n}\n\n.site-branding .site-title a:hover,\n.site-branding .site-title a:focus {\n\tcolor: #007acc;\n}\n\n.site-description {\n\tcolor: #686868;\n\tdisplay: none;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tfont-weight: 400;\n\tline-height: 1.0769230769;\n\tmargin: 0.538461538em 0 0;\n}\n\n.menu-toggle {\n\tbackground-color: transparent;\n\tborder: 1px solid #d1d1d1;\n\tcolor: #1a1a1a;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tmargin: 1.076923077em 0;\n\tpadding: 0.769230769em;\n}\n\n.no-js .menu-toggle {\n\tdisplay: none;\n}\n\n.menu-toggle:hover,\n.menu-toggle:focus {\n\tbackground-color: transparent;\n\tborder-color: #007acc;\n\tcolor: #007acc;\n}\n\n.menu-toggle.toggled-on,\n.menu-toggle.toggled-on:hover,\n.menu-toggle.toggled-on:focus {\n\tbackground-color: #1a1a1a;\n\tborder-color: #1a1a1a;\n\tcolor: #fff;\n}\n\n.menu-toggle:focus {\n\toutline: 0;\n}\n\n.menu-toggle.toggled-on:focus {\n\toutline: thin dotted;\n}\n\n.header-image {\n\tclear: both;\n\tmargin: 0.875em 0;\n}\n\n.header-image a {\n\tdisplay: block;\n}\n\n.header-image a:hover img,\n.header-image a:focus img {\n\topacity: 0.85;\n}\n\n\n/**\n * 11.2 - Posts and pages\n */\n\n.site-main > article {\n\tmargin-bottom: 3.5em;\n\tposition: relative;\n}\n\n.entry-header,\n.entry-summary,\n.entry-content,\n.entry-footer,\n.page-content {\n\tmargin-right: 7.6923%;\n\tmargin-left: 7.6923%;\n}\n\n.entry-title {\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 28px;\n\tfont-size: 1.75rem;\n\tfont-weight: 700;\n\tline-height: 1.25;\n\tmargin-bottom: 1em;\n}\n\n.entry-title a {\n\tcolor: #1a1a1a;\n}\n\n.entry-title a:hover,\n.entry-title a:focus {\n\tcolor: #007acc;\n}\n\n.post-thumbnail {\n\tdisplay: block;\n\tmargin: 0 7.6923% 1.75em;\n}\n\n.post-thumbnail img {\n\tdisplay: block;\n}\n\n.no-sidebar .post-thumbnail img {\n\tmargin: 0 auto;\n}\n\na.post-thumbnail:hover,\na.post-thumbnail:focus {\n\topacity: 0.85;\n}\n\n.entry-content,\n.entry-summary {\n\tborder-color: #d1d1d1;\n}\n\n.entry-content h1,\n.entry-summary h1,\n.comment-content h1,\n.textwidget h1 {\n\tfont-size: 28px;\n\tfont-size: 1.75rem;\n\tline-height: 1.25;\n\tmargin-top: 2em;\n\tmargin-bottom: 1em;\n}\n\n.entry-content h2,\n.entry-summary h2,\n.comment-content h2,\n.textwidget h2 {\n\tfont-size: 23px;\n\tfont-size: 1.4375rem;\n\tline-height: 1.2173913043;\n\tmargin-top: 2.4347826087em;\n\tmargin-bottom: 1.2173913043em;\n}\n\n.entry-content h3,\n.entry-summary h3,\n.comment-content h3,\n.textwidget h3 {\n\tfont-size: 19px;\n\tfont-size: 1.1875rem;\n\tline-height: 1.1052631579;\n\tmargin-top: 2.9473684211em;\n\tmargin-bottom: 1.4736842105em;\n}\n\n.entry-content h4,\n.entry-content h5,\n.entry-content h6,\n.entry-summary h4,\n.entry-summary h5,\n.entry-summary h6,\n.comment-content h4,\n.comment-content h5,\n.comment-content h6,\n.textwidget h4,\n.textwidget h5,\n.textwidget h6 {\n\tfont-size: 16px;\n\tfont-size: 1rem;\n\tline-height: 1.3125;\n\tmargin-top: 3.5em;\n\tmargin-bottom: 1.75em;\n}\n\n.entry-content h4,\n.entry-summary h4,\n.comment-content h4,\n.textwidget h4 {\n\tletter-spacing: 0.140625em;\n\ttext-transform: uppercase;\n}\n\n.entry-content h6,\n.entry-summary h6,\n.comment-content h6,\n.textwidget h6 {\n\tfont-style: italic;\n}\n\n.entry-content h1,\n.entry-content h2,\n.entry-content h3,\n.entry-content h4,\n.entry-content h5,\n.entry-content h6,\n.entry-summary h1,\n.entry-summary h2,\n.entry-summary h3,\n.entry-summary h4,\n.entry-summary h5,\n.entry-summary h6,\n.comment-content h1,\n.comment-content h2,\n.comment-content h3,\n.comment-content h4,\n.comment-content h5,\n.comment-content h6,\n.textwidget h1,\n.textwidget h2,\n.textwidget h3,\n.textwidget h4,\n.textwidget h5,\n.textwidget h6 {\n\tfont-weight: 900;\n}\n\n.entry-content h1:first-child,\n.entry-content h2:first-child,\n.entry-content h3:first-child,\n.entry-content h4:first-child,\n.entry-content h5:first-child,\n.entry-content h6:first-child,\n.entry-summary h1:first-child,\n.entry-summary h2:first-child,\n.entry-summary h3:first-child,\n.entry-summary h4:first-child,\n.entry-summary h5:first-child,\n.entry-summary h6:first-child,\n.comment-content h1:first-child,\n.comment-content h2:first-child,\n.comment-content h3:first-child,\n.comment-content h4:first-child,\n.comment-content h5:first-child,\n.comment-content h6:first-child,\n.textwidget h1:first-child,\n.textwidget h2:first-child,\n.textwidget h3:first-child,\n.textwidget h4:first-child,\n.textwidget h5:first-child,\n.textwidget h6:first-child {\n\tmargin-top: 0;\n}\n\n.post-navigation .post-title,\n.entry-title,\n.comments-title {\n\t-webkit-hyphens: auto;\n\t-moz-hyphens: auto;\n\t-ms-hyphens: auto;\n\thyphens: auto;\n}\n\nbody:not(.search-results) .entry-summary {\n\tcolor: #686868;\n\tfont-size: 19px;\n\tfont-size: 1.1875rem;\n\tline-height: 1.4736842105;\n\tmargin-bottom: 1.4736842105em;\n}\n\nbody:not(.search-results) .entry-header + .entry-summary {\n\tmargin-top: -0.736842105em;\n}\n\nbody:not(.search-results) .entry-summary p,\nbody:not(.search-results) .entry-summary address,\nbody:not(.search-results) .entry-summary hr,\nbody:not(.search-results) .entry-summary ul,\nbody:not(.search-results) .entry-summary ol,\nbody:not(.search-results) .entry-summary dl,\nbody:not(.search-results) .entry-summary dd,\nbody:not(.search-results) .entry-summary table {\n\tmargin-bottom: 1.4736842105em;\n}\n\nbody:not(.search-results) .entry-summary li > ul,\nbody:not(.search-results) .entry-summary li > ol {\n\tmargin-bottom: 0;\n}\n\nbody:not(.search-results) .entry-summary th,\nbody:not(.search-results) .entry-summary td {\n\tpadding: 0.3684210526em;\n}\n\nbody:not(.search-results) .entry-summary fieldset {\n\tmargin-bottom: 1.4736842105em;\n\tpadding: 0.3684210526em;\n}\n\nbody:not(.search-results) .entry-summary blockquote {\n\tborder-color: currentColor;\n}\n\nbody:not(.search-results) .entry-summary blockquote > :last-child {\n\tmargin-bottom: 0;\n}\n\nbody:not(.search-results) .entry-summary .alignleft {\n\tmargin: 0.2631578947em 1.4736842105em 1.4736842105em 0;\n}\n\nbody:not(.search-results) .entry-summary .alignright {\n\tmargin: 0.2631578947em 0 1.4736842105em 1.4736842105em;\n}\n\nbody:not(.search-results) .entry-summary .aligncenter {\n\tmargin-bottom: 1.4736842105em;\n}\n\n.entry-content > :last-child,\n.entry-summary > :last-child,\nbody:not(.search-results) .entry-summary > :last-child,\n.page-content > :last-child,\n.comment-content > :last-child,\n.textwidget > :last-child {\n\tmargin-bottom: 0;\n}\n\n.more-link {\n\twhite-space: nowrap;\n}\n\n.author-info {\n\tborder-color: inherit;\n\tborder-style: solid;\n\tborder-width: 1px 0 1px 0;\n\tclear: both;\n\tpadding-top: 1.75em;\n\tpadding-bottom: 1.75em;\n}\n\n.author-avatar .avatar {\n\tfloat: left;\n\theight: 42px;\n\tmargin: 0 1.75em 1.75em 0;\n\twidth: 42px;\n}\n\n.author-description > :last-child {\n\tmargin-bottom: 0;\n}\n\n.entry-content .author-title {\n\tclear: none;\n\tfont-size: 16px;\n\tfont-size: 1rem;\n\tfont-weight: 900;\n\tline-height: 1.75;\n\tmargin: 0;\n}\n\n.author-bio {\n\tcolor: #686868;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1.6153846154;\n\tmargin-bottom: 1.6153846154em;\n\toverflow: hidden;\n}\n\n.author-link {\n\twhite-space: nowrap;\n}\n\n.entry-footer {\n\tcolor: #686868;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1.6153846154;\n\tmargin-top: 2.1538461538em;\n}\n\n.entry-footer:empty {\n\tmargin: 0;\n}\n\n.entry-footer a {\n\tcolor: #686868;\n}\n\n.entry-footer a:hover,\n.entry-footer a:focus {\n\tcolor: #007acc;\n}\n\n.entry-footer > span:not(:last-child):after {\n\tcontent: \"\\002f\";\n\tdisplay: inline-block;\n\topacity: 0.7;\n\tpadding: 0 0.538461538em;\n}\n\n.entry-footer .avatar {\n\theight: 21px;\n\tmargin: -0.1538461538em 0.5384615385em 0 0;\n\twidth: 21px;\n}\n\n.sticky-post {\n\tcolor: #686868;\n\tdisplay: block;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tletter-spacing: 0.076923077em;\n\tline-height: 1.6153846154;\n\tmargin-bottom: 0.5384615385em;\n\ttext-transform: uppercase;\n}\n\n/**\n * IE8 and earlier will drop any block with CSS3 selectors.\n * Do not combine these styles with the next block.\n */\n.updated:not(.published) {\n\tdisplay: none;\n}\n\n.sticky .posted-on,\n.byline {\n\tdisplay: none;\n}\n\n.single .byline,\n.group-blog .byline {\n\tdisplay: inline;\n}\n\n.page-header {\n\tborder-top: 4px solid #1a1a1a;\n\tmargin: 0 7.6923% 3.5em;\n\tpadding-top: 1.75em;\n}\n\nbody.error404 .page-header,\nbody.search-no-results .page-header {\n\tborder-top: 0;\n\tpadding-top: 0;\n}\n\n.page-title {\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 23px;\n\tfont-size: 1.4375rem;\n\tline-height: 1.2173913043;\n}\n\n.taxonomy-description {\n\tcolor: #686868;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1.6153846154;\n}\n\n.taxonomy-description p {\n\tmargin: 0.5384615385em 0 1.6153846154em;\n}\n\n.taxonomy-description > :last-child {\n\tmargin-bottom: 0;\n}\n\n.page-links {\n\tclear: both;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tmargin: 0 0 1.75em;\n}\n\n.page-links a,\n.page-links > span {\n\tborder: 1px solid #d1d1d1;\n\tborder-radius: 2px;\n\tdisplay: inline-block;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\theight: 1.8461538462em;\n\tline-height: 1.6923076923em;\n\tmargin-right: 0.3076923077em;\n\ttext-align: center;\n\twidth: 1.8461538462em;\n}\n\n.page-links a {\n\tbackground-color: #1a1a1a;\n\tborder-color: #1a1a1a;\n\tcolor: #fff;\n}\n\n.page-links a:hover,\n.page-links a:focus {\n\tbackground-color: #007acc;\n\tborder-color: transparent;\n\tcolor: #fff;\n}\n\n.page-links > .page-links-title {\n\tborder: 0;\n\tcolor: #1a1a1a;\n\theight: auto;\n\tmargin: 0;\n\tpadding-right: 0.6153846154em;\n\twidth: auto;\n}\n\n.entry-attachment {\n\tmargin-bottom: 1.75em;\n}\n\n.entry-caption {\n\tcolor: #686868;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tfont-style: italic;\n\tline-height: 1.6153846154;\n\tpadding-top: 1.0769230769em;\n}\n\n.entry-caption > :last-child {\n\tmargin-bottom: 0;\n}\n\n.content-bottom-widgets {\n\tmargin: 0 7.6923%;\n}\n\n.content-bottom-widgets .widget-area {\n\tmargin-bottom: 3.5em;\n}\n\n\n/**\n * 11.3 - Post Formats\n */\n\n.format-aside .entry-title,\n.format-image .entry-title,\n.format-video .entry-title,\n.format-quote .entry-title,\n.format-gallery .entry-title,\n.format-status .entry-title,\n.format-link .entry-title,\n.format-audio .entry-title,\n.format-chat .entry-title {\n\tfont-size: 19px;\n\tfont-size: 1.1875rem;\n\tline-height: 1.473684211;\n\tmargin-bottom: 1.473684211em;\n}\n\n.blog .format-status .entry-title,\n.archive .format-status .entry-title {\n\tdisplay: none;\n}\n\n\n/**\n * 11.4 - Comments\n */\n\n.comments-area {\n\tmargin: 0 7.6923% 3.5em;\n}\n\n.comment-list + .comment-respond,\n.comment-navigation + .comment-respond {\n\tpadding-top: 1.75em;\n}\n\n.comments-title,\n.comment-reply-title {\n\tborder-top: 4px solid #1a1a1a;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 23px;\n\tfont-size: 1.4375rem;\n\tfont-weight: 700;\n\tline-height: 1.3125;\n\tpadding-top: 1.217391304em;\n}\n\n.comments-title {\n\tmargin-bottom: 1.217391304em;\n}\n\n.comment-list {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.comment-list article,\n.comment-list .pingback,\n.comment-list .trackback {\n\tborder-top: 1px solid #d1d1d1;\n\tpadding: 1.75em 0;\n}\n\n.comment-list .children {\n\tlist-style: none;\n\tmargin: 0;\n}\n\n.comment-list .children > li {\n\tpadding-left: 0.875em;\n}\n\n.comment-author {\n\tcolor: #1a1a1a;\n\tmargin-bottom: 0.4375em;\n}\n\n.comment-author .avatar {\n\tfloat: left;\n\theight: 28px;\n\tmargin-right: 0.875em;\n\tposition: relative;\n\twidth: 28px;\n}\n\n.bypostauthor > article .fn:after {\n\tcontent: \"\\f304\";\n\tleft: 3px;\n\tposition: relative;\n\ttop: 5px;\n}\n\n.comment-metadata,\n.pingback .edit-link {\n\tcolor: #686868;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1.6153846154;\n}\n\n.comment-metadata {\n\tmargin-bottom: 2.1538461538em;\n}\n\n.comment-metadata a,\n.pingback .comment-edit-link {\n\tcolor: #686868;\n}\n\n.comment-metadata a:hover,\n.comment-metadata a:focus,\n.pingback .comment-edit-link:hover,\n.pingback .comment-edit-link:focus {\n\tcolor: #007acc;\n}\n\n.comment-metadata .edit-link,\n.pingback .edit-link {\n\tdisplay: inline-block;\n}\n\n.comment-metadata .edit-link:before,\n.pingback .edit-link:before {\n\tcontent: \"\\002f\";\n\tdisplay: inline-block;\n\topacity: 0.7;\n\tpadding: 0 0.538461538em;\n}\n\n.comment-content ul,\n.comment-content ol {\n\tmargin: 0 0 1.5em 1.25em;\n}\n\n.comment-content li > ul,\n.comment-content li > ol {\n\tmargin-bottom: 0;\n}\n\n.comment-reply-link {\n\tborder: 1px solid #d1d1d1;\n\tborder-radius: 2px;\n\tcolor: #007acc;\n\tdisplay: inline-block;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1;\n\tmargin-top: 2.1538461538em;\n\tpadding: 0.5384615385em 0.5384615385em 0.4615384615em;\n}\n\n.comment-reply-link:hover,\n.comment-reply-link:focus {\n\tborder-color: currentColor;\n\tcolor: #007acc;\n\toutline: 0;\n}\n\n.comment-form {\n\tpadding-top: 1.75em;\n}\n\n.comment-form label {\n\tcolor: #686868;\n\tdisplay: block;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tletter-spacing: 0.076923077em;\n\tline-height: 1.6153846154;\n\tmargin-bottom: 0.5384615385em;\n\ttext-transform: uppercase;\n}\n\n.comment-list .comment-form {\n\tpadding-bottom: 1.75em;\n}\n\n.comment-notes,\n.comment-awaiting-moderation,\n.logged-in-as,\n.form-allowed-tags {\n\tcolor: #686868;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1.6153846154;\n\tmargin-bottom: 2.1538461538em;\n}\n\n.no-comments {\n\tborder-top: 1px solid #d1d1d1;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-weight: 700;\n\tmargin: 0;\n\tpadding-top: 1.75em;\n}\n\n.comment-navigation + .no-comments {\n\tborder-top: 0;\n\tpadding-top: 0;\n}\n\n.form-allowed-tags code {\n\tfont-family: Inconsolata, monospace;\n}\n\n.form-submit {\n\tmargin-bottom: 0;\n}\n\n.required {\n\tcolor: #007acc;\n\tfont-family: Merriweather, Georgia, serif;\n}\n\n.comment-reply-title small {\n\tfont-size: 100%;\n}\n\n.comment-reply-title small a {\n\tborder: 0;\n\tfloat: right;\n\theight: 32px;\n\toverflow: hidden;\n\twidth: 26px;\n}\n\n.comment-reply-title small a:hover,\n.comment-reply-title small a:focus {\n\tcolor: #1a1a1a;\n}\n\n.comment-reply-title small a:before {\n\tcontent: \"\\f405\";\n\tfont-size: 32px;\n\tposition: relative;\n\ttop: -5px;\n}\n\n\n/**\n * 11.5 - Sidebar\n */\n\n.sidebar {\n\tmargin-bottom: 3.5em;\n\tpadding: 0 7.6923%;\n}\n\n\n/**\n * 11.6 - Footer\n */\n\n.site-footer {\n\tpadding: 0 7.6923% 1.75em;\n}\n\n.site-info {\n\tcolor: #686868;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tline-height: 1.6153846154;\n}\n\n.site-info a {\n\tcolor: #686868;\n}\n\n.site-info a:hover,\n.site-info a:focus {\n\tcolor: #007acc;\n}\n\n.site-footer .site-title {\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tfont-weight: 400;\n}\n\n.site-footer .site-title:after {\n\tcontent: \"\\002f\";\n\tdisplay: inline-block;\n\tfont-family: Montserrat, sans-serif;\n\topacity: 0.7;\n\tpadding: 0 0.307692308em 0 0.538461538em;\n}\n\n\n/**\n * 12.0 - Media\n */\n\n.site .avatar {\n\tborder-radius: 50%;\n}\n\n.entry-content .wp-smiley,\n.entry-summary .wp-smiley,\n.comment-content .wp-smiley,\n.textwidget .wp-smiley {\n\tborder: none;\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\tpadding: 0;\n}\n\n.entry-content a img,\n.entry-summary a img,\n.comment-content a img,\n.textwidget a img {\n\tdisplay: block;\n}\n\n/* Make sure embeds and iframes fit their containers. */\nembed,\niframe,\nobject,\nvideo {\n\tmargin-bottom: 1.75em;\n\tmax-width: 100%;\n\tvertical-align: middle;\n}\n\np > embed,\np > iframe,\np > object,\np > video {\n\tmargin-bottom: 0;\n}\n\n.entry-content .wp-audio-shortcode a,\n.entry-content .wp-playlist a {\n\tbox-shadow: none;\n}\n\n.wp-audio-shortcode,\n.wp-video,\n.wp-playlist.wp-audio-playlist {\n\tmargin-top: 0;\n\tmargin-bottom: 1.75em;\n}\n\n.wp-playlist.wp-audio-playlist {\n\tpadding-bottom: 0;\n}\n\n.wp-playlist .wp-playlist-tracks {\n\tmargin-top: 0;\n}\n\n.wp-playlist-item .wp-playlist-caption {\n\tborder-bottom: 0;\n\tpadding: 0.7142857143em 0;\n}\n\n.wp-playlist-item .wp-playlist-item-length {\n\ttop: 0.7142857143em;\n}\n\n\n/**\n * 12.1 - Captions\n */\n\n.wp-caption {\n\tmargin-bottom: 1.75em;\n\tmax-width: 100%;\n}\n\n.wp-caption img[class*=\"wp-image-\"] {\n\tdisplay: block;\n\tmargin: 0;\n}\n\n.wp-caption .wp-caption-text {\n\tcolor: #686868;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tfont-style: italic;\n\tline-height: 1.6153846154;\n\tpadding-top: 0.5384615385em;\n}\n\n\n/**\n * 12.2 - Galleries\n */\n\n.gallery {\n\tmargin: 0 -1.1666667% 1.75em;\n}\n\n.gallery-item {\n\tdisplay: inline-block;\n\tmax-width: 33.33%;\n\tpadding: 0 1.1400652% 2.2801304%;\n\ttext-align: center;\n\tvertical-align: top;\n\twidth: 100%;\n}\n\n.gallery-columns-1 .gallery-item {\n\tmax-width: 100%;\n}\n\n.gallery-columns-2 .gallery-item {\n\tmax-width: 50%;\n}\n\n.gallery-columns-4 .gallery-item {\n\tmax-width: 25%;\n}\n\n.gallery-columns-5 .gallery-item {\n\tmax-width: 20%;\n}\n\n.gallery-columns-6 .gallery-item {\n\tmax-width: 16.66%;\n}\n\n.gallery-columns-7 .gallery-item {\n\tmax-width: 14.28%;\n}\n\n.gallery-columns-8 .gallery-item {\n\tmax-width: 12.5%;\n}\n\n.gallery-columns-9 .gallery-item {\n\tmax-width: 11.11%;\n}\n\n.gallery-icon img {\n\tmargin: 0 auto;\n}\n\n.gallery-caption {\n\tcolor: #686868;\n\tdisplay: block;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tfont-style: italic;\n\tline-height: 1.6153846154;\n\tpadding-top: 0.5384615385em;\n}\n\n.gallery-columns-6 .gallery-caption,\n.gallery-columns-7 .gallery-caption,\n.gallery-columns-8 .gallery-caption,\n.gallery-columns-9 .gallery-caption {\n\tdisplay: none;\n}\n\n\n/**\n * 13.0 - Multisites\n */\n\n.widecolumn {\n\tmargin-bottom: 3.5em;\n\tpadding: 0 7.6923%;\n}\n\n.widecolumn .mu_register {\n\twidth: auto;\n}\n\n.widecolumn .mu_register .mu_alert {\n\tbackground: transparent;\n\tborder-color: #d1d1d1;\n\tcolor: inherit;\n\tmargin-bottom: 3.5em;\n\tpadding: 1.75em;\n}\n\n.widecolumn form,\n.widecolumn .mu_register form {\n\tmargin-top: 0;\n}\n\n.widecolumn h2 {\n\tfont-size: 23px;\n\tfont-size: 1.4375rem;\n\tfont-weight: 900;\n\tline-height: 1.2173913043;\n\tmargin-bottom: 1.2173913043em;\n}\n\n.widecolumn p {\n\tmargin: 1.75em 0;\n}\n\n.widecolumn p + h2 {\n\tmargin-top: 2.4347826087em;\n}\n\n.widecolumn label,\n.widecolumn .mu_register label {\n\tcolor: #686868;\n\tfont-family: Montserrat, \"Helvetica Neue\", sans-serif;\n\tfont-size: 13px;\n\tfont-size: 0.8125rem;\n\tfont-weight: 400;\n\tletter-spacing: 0.076923077em;\n\tline-height: 1.6153846154;\n\ttext-transform: uppercase;\n}\n\n.widecolumn .mu_register label {\n\tmargin: 2.1538461538em 0.7692307692em 0.5384615385em 0;\n}\n\n.widecolumn .mu_register label strong {\n\tfont-weight: 400;\n}\n\n.widecolumn #key,\n.widecolumn .mu_register #blog_title,\n.widecolumn .mu_register #user_email,\n.widecolumn .mu_register #blogname,\n.widecolumn .mu_register #user_name {\n\tfont-size: 16px;\n\tfont-size: 1rem;\n\twidth: 100%;\n}\n\n.widecolumn .mu_register #blogname {\n\tmargin: 0;\n}\n\n.widecolumn .mu_register #blog_title,\n.widecolumn .mu_register #user_email,\n.widecolumn .mu_register #user_name {\n\tmargin: 0 0 0.375em;\n}\n\n.widecolumn #submit,\n.widecolumn .mu_register input[type=\"submit\"] {\n\tfont-size: 16px;\n\tfont-size: 1rem;\n\tmargin: 0;\n\twidth: auto;\n}\n\n.widecolumn .mu_register .prefix_address,\n.widecolumn .mu_register .suffix_address {\n\tfont-size: inherit;\n}\n\n.widecolumn .mu_register > :last-child,\n.widecolumn form > :last-child {\n\tmargin-bottom: 0;\n}\n\n\n/**\n * 14.0 - Media Queries\n */\n\n/**\n * Does the same thing as <meta name=\"viewport\" content=\"width=device-width\">,\n * but in the future W3C standard way. -ms- prefix is required for IE10+ to\n * render responsive styling in Windows 8 \"snapped\" views; IE10+ does not honor\n * the meta tag. See https://core.trac.wordpress.org/ticket/25888.\n */\n@-ms-viewport {\n\twidth: device-width;\n}\n\n@viewport {\n\twidth: device-width;\n}\n\n\n/**\n * 14.1 - >= 710px\n */\n\n@media screen and (min-width: 44.375em) {\n\tbody:not(.custom-background-image):before,\n\tbody:not(.custom-background-image):after {\n\t\tbackground: inherit;\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\theight: 21px;\n\t\tleft: 0;\n\t\tposition: fixed;\n\t\twidth: 100%;\n\t\tz-index: 99;\n\t}\n\n\tbody:not(.custom-background-image):before {\n\t\ttop: 0;\n\t}\n\n\tbody:not(.custom-background-image).admin-bar:before {\n\t\ttop: 46px;\n\t}\n\n\tbody:not(.custom-background-image):after {\n\t\tbottom: 0;\n\t}\n\n\t.site {\n\t\tmargin: 21px;\n\t}\n\n\t.site-main {\n\t\tmargin-bottom: 5.25em;\n\t}\n\n\t.site-header {\n\t\tpadding: 3.9375em 7.6923%;\n\t}\n\n\t.site-branding {\n\t\tmargin-top: 1.3125em;\n\t\tmargin-bottom: 1.3125em;\n\t}\n\n\t.site-title {\n\t\tfont-size: 28px;\n\t\tfont-size: 1.75rem;\n\t\tline-height: 1.25;\n\t}\n\n\t.site-description {\n\t\tdisplay: block;\n\t}\n\n\t.menu-toggle {\n\t\tfont-size: 16px;\n\t\tfont-size: 1.0rem;\n\t\tmargin: 1.3125em 0;\n\t\tpadding: 0.8125em 0.875em 0.6875em;\n\t}\n\n\t.site-header-menu {\n\t\tmargin: 1.3125em 0;\n\t}\n\n\t.site-header .main-navigation + .social-navigation {\n\t\tmargin-top: 2.625em;\n\t}\n\n\t.header-image {\n\t\tmargin: 1.3125em 0;\n\t}\n\n\t.pagination {\n\t\tmargin: 0 23.0769% 4.421052632em 7.6923%\n\t}\n\n\t.post-navigation {\n\t\tmargin-bottom: 5.25em;\n\t}\n\n\t.post-navigation .post-title {\n\t\tfont-size: 28px;\n\t\tfont-size: 1.75rem;\n\t\tline-height: 1.25;\n\t}\n\n\t/* restore screen-reader-text */\n\t.pagination .current .screen-reader-text {\n\t\tposition: absolute !important;\n\t}\n\n\t.pagination .page-numbers {\n\t\tdisplay: inline-block;\n\t}\n\n\t.site-main > article {\n\t\tmargin-bottom: 5.25em;\n\t}\n\n\t.entry-header,\n\t.post-thumbnail,\n\t.entry-content,\n\t.entry-summary,\n\t.entry-footer,\n\t.comments-area,\n\t.image-navigation,\n\t.post-navigation,\n\t.page-header,\n\t.page-content,\n\t.content-bottom-widgets {\n\t\tmargin-right: 23.0769%;\n\t}\n\n\t.entry-title {\n\t\tfont-size: 33px;\n\t\tfont-size: 2.0625rem;\n\t\tline-height: 1.2727272727;\n\t\tmargin-bottom: 0.8484848485em;\n\t}\n\n\t.entry-content blockquote.alignleft,\n\t.entry-content blockquote.alignright {\n\t\tborder-width: 4px 0 0 0;\n\t\tpadding: 0.9473684211em 0 0;\n\t\twidth: -webkit-calc(50% - 0.736842105em);\n\t\twidth: calc(50% - 0.736842105em);\n\t}\n\n\t.entry-content blockquote:not(.alignleft):not(.alignright),\n\t.entry-summary blockquote,\n\t.comment-content blockquote {\n\t\tmargin-left: -1.473684211em;\n\t}\n\n\t.entry-content blockquote blockquote:not(.alignleft):not(.alignright),\n\t.entry-summary blockquote blockquote,\n\t.comment-content blockquote blockquote {\n\t\tmargin-left: 0;\n\t}\n\n\t.entry-content ul,\n\t.entry-summary ul,\n\t.comment-content ul,\n\t.entry-content ol,\n\t.entry-summary ol,\n\t.comment-content ol {\n\t\tmargin-left: 0;\n\t}\n\n\t.entry-content li > ul,\n\t.entry-summary li > ul,\n\t.comment-content li > ul,\n\t.entry-content blockquote > ul,\n\t.entry-summary blockquote > ul,\n\t.comment-content blockquote > ul {\n\t\tmargin-left: 1.25em;\n\t}\n\n\t.entry-content li > ol,\n\t.entry-summary li > ol,\n\t.comment-content li > ol,\n\t.entry-content blockquote > ol,\n\t.entry-summary blockquote > ol,\n\t.comment-content blockquote > ol {\n\t\tmargin-left: 1.5em;\n\t}\n\n\t.comment-author {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.comment-author .avatar {\n\t\theight: 42px;\n\t\tposition: relative;\n\t\ttop: 0.25em;\n\t\twidth: 42px;\n\t}\n\n\t.comment-list .children > li {\n\t\tpadding-left: 1.75em;\n\t}\n\n\t.comment-list + .comment-respond,\n\t.comment-navigation + .comment-respond {\n\t\tpadding-top: 3.5em;\n\t}\n\n\t.comments-area,\n\t.widget,\n\t.content-bottom-widgets .widget-area {\n\t\tmargin-bottom: 5.25em;\n\t}\n\n\t.sidebar,\n\t.widecolumn {\n\t\tmargin-bottom: 5.25em;\n\t\tpadding-right: 23.0769%;\n\t}\n\n\tbody:not(.search-results) .entry-summary li > ul,\n\tbody:not(.search-results) .entry-summary blockquote > ul {\n\t\tmargin-left: 1.157894737em;\n\t}\n\n\tbody:not(.search-results) .entry-summary li > ol,\n\tbody:not(.search-results) .entry-summary blockquote > ol {\n\t\tmargin-left: 1.473684211em;\n\t}\n}\n\n\n/**\n * 14.2 - >= 783px\n */\n\n@media screen and (min-width: 48.9375em) {\n\tbody:not(.custom-background-image).admin-bar:before {\n\t\ttop: 32px;\n\t}\n}\n\n\n/**\n * 14.3 - >= 910px\n */\n\n@media screen and (min-width: 56.875em) {\n\t.site-header {\n\t\tpadding-right: 4.5455%;\n\t\tpadding-left: 4.5455%;\n\t}\n\n\t.site-header-main {\n\t\t-webkit-align-items: flex-start;\n\t\t-ms-flex-align: start;\n\t\talign-items: flex-start;\n\t}\n\n\t.site-header-menu {\n\t\tdisplay: block;\n\t\t-webkit-flex: 0 1 auto;\n\t\t-ms-flex: 0 1 auto;\n\t\tflex: 0 1 auto;\n\t}\n\n\t.main-navigation {\n\t\tmargin: 0 -0.875em;\n\t}\n\n\t.main-navigation .primary-menu,\n\t.main-navigation .primary-menu > li {\n\t\tborder: 0;\n\t}\n\n\t.main-navigation .primary-menu > li {\n\t\tfloat: left;\n\t}\n\n\t.main-navigation a {\n\t\toutline-offset: -8px;\n\t\tpadding: 0.65625em 0.875em;\n\t\twhite-space: nowrap;\n\t}\n\n\t.main-navigation li:hover > a,\n\t.main-navigation li.focus > a {\n\t\tcolor: #007acc;\n\t}\n\n\t.main-navigation ul ul {\n\t\tborder-bottom: 1px solid #d1d1d1;\n\t\tdisplay: block;\n\t\tleft: -999em;\n\t\tmargin: 0;\n\t\tposition: absolute;\n\t\tz-index: 99999;\n\t}\n\n\t.main-navigation ul ul ul {\n\t\ttop: -1px;\n\t}\n\n\t.main-navigation ul ul ul:before,\n\t.main-navigation ul ul ul:after {\n\t\tborder: 0;\n\t}\n\n\t.main-navigation ul ul li {\n\t\tbackground-color: #fff;\n\t\tborder: 1px solid #d1d1d1;\n\t\tborder-bottom-width: 0;\n\t}\n\n\t.main-navigation ul ul a {\n\t\twhite-space: normal;\n\t\twidth: 12.6875em;\n\t}\n\n\t.main-navigation ul ul:before,\n\t.main-navigation ul ul:after {\n\t\tborder-style: solid;\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t}\n\n\t.main-navigation ul ul:before {\n\t\tborder-color: #d1d1d1 transparent;\n\t\tborder-width: 0 10px 10px;\n\t\tright: 9px;\n\t\ttop: -9px;\n\t}\n\n\t.main-navigation ul ul:after {\n\t\tborder-color: #fff transparent;\n\t\tborder-width: 0 8px 8px;\n\t\tright: 11px;\n\t\ttop: -7px;\n\t}\n\n\t.main-navigation li:hover > ul,\n\t.main-navigation li.focus > ul {\n\t\tleft: auto;\n\t\tright: 0;\n\t}\n\n\t.main-navigation ul ul li:hover > ul,\n\t.main-navigation ul ul li.focus > ul {\n\t\tleft: auto;\n\t\tright: 100%;\n\t}\n\n\t.main-navigation .menu-item-has-children > a {\n\t\tmargin: 0;\n\t\tpadding-right: 2.25em;\n\t}\n\n\t.main-navigation .menu-item-has-children > a:after {\n\t\tcontent: \"\\f431\";\n\t\tposition: absolute;\n\t\tright: 0.625em;\n\t\ttop: 0.8125em;\n\t}\n\n\t.main-navigation ul ul .menu-item-has-children > a {\n\t\tpadding-right: 2.0625em;\n\t}\n\n\t.main-navigation ul ul .menu-item-has-children > a:after {\n\t\tright: 0.5625em;\n\t\ttop: 0.875em;\n\t\t-webkit-transform: rotate(90deg);\n\t\t-moz-transform: rotate(90deg);\n\t\t-ms-transform: rotate(90deg);\n\t\ttransform: rotate(90deg);\n\t}\n\n\t.dropdown-toggle,\n\t.main-navigation ul .dropdown-toggle.toggled-on,\n\t.menu-toggle,\n\t.site-header .social-navigation,\n\t.site-footer .main-navigation {\n\t\tdisplay: none;\n\t}\n\n\t.site-content {\n\t\tpadding: 0 4.5455%;\n\t}\n\n\t.content-area {\n\t\tfloat: left;\n\t\tmargin-right: -100%;\n\t\twidth: 70%;\n\t}\n\n\t.entry-header,\n\t.post-thumbnail,\n\t.entry-content,\n\t.entry-summary,\n\t.entry-footer,\n\t.comments-area,\n\t.image-navigation,\n\t.post-navigation,\n\t.pagination,\n\t.page-header,\n\t.page-content,\n\t.content-bottom-widgets {\n\t\tmargin-right: 0;\n\t\tmargin-left: 0;\n\t}\n\n\t.sidebar {\n\t\tfloat: left;\n\t\tmargin-left: 75%;\n\t\tpadding: 0;\n\t\twidth: 25%;\n\t}\n\n\t.widget {\n\t\tfont-size: 13px;\n\t\tfont-size: 0.8125rem;\n\t\tline-height: 1.6153846154;\n\t\tmargin-bottom: 3.230769231em;\n\t\tpadding-top: 1.615384615em;\n\t}\n\n\t.widget .widget-title {\n\t\tmargin-bottom: 1.3125em;\n\t}\n\n\t.widget p,\n\t.widget address,\n\t.widget hr,\n\t.widget ul,\n\t.widget ol,\n\t.widget dl,\n\t.widget dd,\n\t.widget table {\n\t\tmargin-bottom: 1.6153846154em;\n\t}\n\n\t.widget li > ul,\n\t.widget li > ol {\n\t\tmargin-bottom: 0;\n\t}\n\n\t.widget blockquote {\n\t\tfont-size: 16px;\n\t\tfont-size: 1rem;\n\t\tline-height: 1.3125;\n\t\tmargin-bottom: 1.3125em;\n\t\tpadding-left: 1.0625em;\n\t}\n\n\t.widget blockquote cite,\n\t.widget blockquote small {\n\t\tfont-size: 13px;\n\t\tfont-size: 0.8125rem;\n\t\tline-height: 1.6153846154;\n\t}\n\n\t.widget th,\n\t.widget td {\n\t\tpadding: 0.5384615385em;\n\t}\n\n\t.widget pre {\n\t\tfont-size: 13px;\n\t\tfont-size: 0.8125rem;\n\t\tline-height: 1.6153846154;\n\t\tmargin-bottom: 1.6153846154em;\n\t\tpadding: 0.5384615385em;\n\t}\n\n\t.widget fieldset {\n\t\tmargin-bottom: 1.6153846154em;\n\t\tpadding: 0.5384615385em;\n\t}\n\n\t.widget button,\n\t.widget input,\n\t.widget select,\n\t.widget textarea {\n\t\tfont-size: 13px;\n\t\tfont-size: 0.8125rem;\n\t\tline-height: 1.6153846154;\n\t}\n\n\t.widget button,\n\t.widget input[type=\"button\"],\n\t.widget input[type=\"reset\"],\n\t.widget input[type=\"submit\"] {\n\t\tline-height: 1;\n\t\tpadding: 0.846153846em;\n\t}\n\n\t.widget input[type=\"text\"],\n\t.widget input[type=\"email\"],\n\t.widget input[type=\"url\"],\n\t.widget input[type=\"password\"],\n\t.widget input[type=\"search\"],\n\t.widget input[type=\"tel\"],\n\t.widget input[type=\"number\"],\n\t.widget textarea {\n\t\tpadding: 0.4615384615em 0.5384615385em;\n\t}\n\n\t.widget h1 {\n\t\tfont-size: 23px;\n\t\tfont-size: 1.4375rem;\n\t\tline-height: 1.2173913043;\n\t\tmargin-bottom: 0.9130434783em;\n\t}\n\n\t.widget h2 {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.1875rem;\n\t\tline-height: 1.1052631579;\n\t\tmargin-bottom: 1.1052631579em;\n\t}\n\n\t.widget h3 {\n\t\tfont-size: 16px;\n\t\tfont-size: 1rem;\n\t\tline-height: 1.3125;\n\t\tmargin-bottom: 1.3125em;\n\t}\n\n\t.widget h4,\n\t.widget h5,\n\t.widget h6 {\n\t\tfont-size: 13px;\n\t\tfont-size: 0.8125rem;\n\t\tline-height: 1.6153846154;\n\t\tmargin-bottom: 0.9130434783em;\n\t}\n\n\t.widget .alignleft {\n\t\tmargin: 0.2307692308em 1.6153846154em 1.6153846154em 0;\n\t}\n\n\t.widget .alignright {\n\t\tmargin: 0.2307692308em 0 1.6153846154em 1.6153846154em;\n\t}\n\n\t.widget .aligncenter {\n\t\tmargin-bottom: 1.6153846154em;\n\t}\n\n\t.widget_calendar td,\n\t.widget_calendar th {\n\t\tline-height: 2.6923076923;\n\t\tpadding: 0;\n\t}\n\n\t.widget_rss .rssSummary:last-child {\n\t\tmargin-bottom: 1.615384615em;\n\t}\n\n\t.widget input[type=\"search\"].search-field {\n\t\twidth: -webkit-calc(100% - 35px);\n\t\twidth: calc(100% - 35px);\n\t}\n\n\t.widget .search-submit:before {\n\t\tfont-size: 16px;\n\t\tleft: 1px;\n\t\tline-height: 35px;\n\t\twidth: 34px;\n\t}\n\n\t.widget button.search-submit {\n\t\tpadding: 0;\n\t\twidth: 35px;\n\t}\n\n\t.tagcloud a {\n\t\tmargin: 0 0.2307692308em 0.5384615385em 0;\n\t\tpadding: 0.5384615385em 0.4615384615em 0.4615384615em;\n\t}\n\n\t.textwidget h1 {\n\t\tmargin-top: 1.8260869565em;\n\t}\n\n\t.textwidget h2 {\n\t\tmargin-top: 2.2105263158em;\n\t}\n\n\t.textwidget h3 {\n\t\tmargin-top: 2.625em;\n\t}\n\n\t.textwidget h4 {\n\t\tletter-spacing: 0.153846154em;\n\t}\n\n\t.textwidget h4,\n\t.textwidget h5,\n\t.textwidget h6 {\n\t\tmargin-top: 3.2307692308em;\n\t}\n\n\t.content-bottom-widgets .widget-area:nth-child(1):nth-last-child(2),\n\t.content-bottom-widgets .widget-area:nth-child(2):nth-last-child(1) {\n\t\tfloat: left;\n\t\tmargin-right: 7.1428571%;\n\t\twidth: 46.42857145%;\n\t}\n\n\t.content-bottom-widgets .widget-area:nth-child(2):nth-last-child(1):last-of-type {\n\t\tmargin-right: 0;\n\t}\n\n\t.site-footer {\n\t\t-webkit-align-items: center;\n\t\t-ms-flex-align: center;\n\t\talign-items: center;\n\t\tdisplay: -webkit-flex;\n\t\tdisplay: -ms-flexbox;\n\t\tdisplay: flex;\n\t\t-webkit-flex-wrap: wrap;\n\t\t-ms-flex-wrap: wrap;\n\t\tflex-wrap: wrap;\n\t\tpadding: 0 4.5455% 3.5em;\n\t}\n\n\t.site-footer .social-navigation {\n\t\tmargin: 0;\n\t\t-webkit-order: 2;\n\t\t-ms-flex-order: 2;\n\t\torder: 2;\n\t}\n\n\t.site-info {\n\t\tmargin: 0.538461538em auto 0.538461538em 0;\n\t\t-webkit-order: 1;\n\t\t-ms-flex-order: 1;\n\t\torder: 1;\n\t}\n\n\t.no-sidebar .content-area {\n\t\tfloat: none;\n\t\tmargin: 0;\n\t\twidth: 100%;\n\t}\n\n\t.no-sidebar .entry-header,\n\t.no-sidebar .entry-content,\n\t.no-sidebar .entry-summary,\n\t.no-sidebar .entry-footer,\n\t.no-sidebar .comments-area,\n\t.no-sidebar .image-navigation,\n\t.no-sidebar .post-navigation,\n\t.no-sidebar .pagination,\n\t.no-sidebar .page-header,\n\t.no-sidebar .page-content,\n\t.no-sidebar .content-bottom-widgets {\n\t\tmargin-right: 15%;\n\t\tmargin-left: 15%;\n\t}\n\n\t.widecolumn {\n\t\tpadding-right: 15%;\n\t\tpadding-left: 15%;\n\t}\n}\n\n\n/**\n * 14.4 - >= 985px\n */\n\n@media screen and (min-width: 61.5625em) {\n\t.site-main {\n\t\tmargin-bottom: 7.0em;\n\t}\n\n\t.site-header {\n\t\tpadding: 5.25em 4.5455%;\n\t}\n\n\t.site-branding,\n\t.site-header-menu,\n\t.header-image {\n\t\tmargin-top: 1.75em;\n\t\tmargin-bottom: 1.75em;\n\t}\n\n\t.image-navigation {\n\t\tmargin-bottom: 3.230769231em;\n\t}\n\n\t.post-navigation {\n\t\tmargin-bottom: 7.0em;\n\t}\n\n\t.pagination {\n\t\tmargin-bottom: 5.894736842em;\n\t}\n\n\t.widget {\n\t\tmargin-bottom: 4.307692308em;\n\t}\n\n\t.site-main > article {\n\t\tmargin-bottom: 7.0em;\n\t}\n\n\t.entry-title {\n\t\tfont-size: 40px;\n\t\tfont-size: 2.5rem;\n\t\tline-height: 1.225;\n\t\tmargin-bottom: 1.05em;\n\t}\n\n\t.format-aside .entry-title,\n\t.format-image .entry-title,\n\t.format-video .entry-title,\n\t.format-quote .entry-title,\n\t.format-gallery .entry-title,\n\t.format-status .entry-title,\n\t.format-link .entry-title,\n\t.format-audio .entry-title,\n\t.format-chat .entry-title {\n\t\tfont-size: 23px;\n\t\tfont-size: 1.4375em;\n\t\tline-height: 1.304347826;\n\t\tmargin-bottom: 1.826086957em;\n\t}\n\n\t.post-thumbnail {\n\t\tmargin-bottom: 2.625em;\n\t}\n\n\t.entry-content h1,\n\t.entry-summary h1,\n\t.comment-content h1 {\n\t\tfont-size: 33px;\n\t\tfont-size: 2.0625rem;\n\t\tline-height: 1.2727272727;\n\t\tmargin-top: 1.696969697em;\n\t\tmargin-bottom: 0.8484848485em;\n\t}\n\n\t.entry-content h2,\n\t.entry-summary h2,\n\t.comment-content h2 {\n\t\tfont-size: 28px;\n\t\tfont-size: 1.75rem;\n\t\tline-height: 1.25;\n\t\tmargin-top: 2em;\n\t\tmargin-bottom: 1em;\n\t}\n\n\t.entry-content h3,\n\t.entry-summary h3,\n\t.comment-content h3 {\n\t\tfont-size: 23px;\n\t\tfont-size: 1.4375rem;\n\t\tline-height: 1.2173913043;\n\t\tmargin-top: 2.4347826087em;\n\t\tmargin-bottom: 1.2173913043em;\n\t}\n\n\t.entry-content h4,\n\t.entry-summary h4,\n\t.entry-intro h4,\n\t.comment-content h4 {\n\t\tletter-spacing: 0.131578947em;\n\t}\n\n\t.entry-content h4,\n\t.entry-content h5,\n\t.entry-content h6,\n\t.entry-summary h4,\n\t.entry-summary h5,\n\t.entry-summary h6,\n\t.comment-content h4,\n\t.comment-content h5,\n\t.comment-content h6 {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.1875rem;\n\t\tline-height: 1.1052631579;\n\t\tmargin-top: 2.9473684211em;\n\t\tmargin-bottom: 1.473684211em;\n\t}\n\n\t.author-info {\n\t\tborder-bottom-width: 0;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.comment-list + .comment-respond,\n\t.comment-navigation + .comment-respond {\n\t\tpadding-top: 5.25em;\n\t}\n\n\t.comments-area,\n\t.sidebar,\n\t.content-bottom-widgets .widget-area,\n\t.widecolumn {\n\t\tmargin-bottom: 7.0em;\n\t}\n\n\tbody:not(.search-results) .entry-summary {\n\t\tmargin-bottom: 2.210526316em;\n\t}\n\n\tbody:not(.search-results) .entry-header + .entry-summary {\n\t\tmargin-top: -1.105263158em;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-content {\n\t\tfloat: right;\n\t\twidth: 71.42857144%;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-content > blockquote.alignleft.below-entry-meta {\n\t\tmargin-left: -40%;\n\t\twidth: -webkit-calc(60% - 1.4736842105em);\n\t\twidth: calc(60% - 1.4736842105em);\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) img.below-entry-meta,\n\tbody:not(.search-results) article:not(.type-page) figure.below-entry-meta {\n\t\tclear: both;\n\t\tdisplay: block;\n\t\tfloat: none;\n\t\tmargin-right: 0;\n\t\tmargin-left: -40%;\n\t\tmax-width: 140%;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) figure.below-entry-meta img.below-entry-meta,\n\tbody:not(.search-results) article:not(.type-page) table figure.below-entry-meta,\n\tbody:not(.search-results) article:not(.type-page) table img.below-entry-meta {\n\t\tmargin: 0;\n\t\tmax-width: 100%;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-footer {\n\t\tfloat: left;\n\t\tmargin-top: 0.1538461538em;\n\t\twidth: 21.42857143%;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-footer > span:not(:last-child):after {\n\t\tdisplay: none;\n\t}\n\n\t.single .byline,\n\t.full-size-link,\n\tbody:not(.search-results).group-blog .byline,\n\tbody:not(.search-results) .entry-format,\n\tbody:not(.search-results) .cat-links,\n\tbody:not(.search-results) .tags-links,\n\tbody:not(.search-results) article:not(.sticky) .posted-on,\n\tbody:not(.search-results) article:not(.type-page) .comments-link,\n\tbody:not(.search-results) article:not(.type-page) .entry-footer .edit-link {\n\t\tdisplay: block;\n\t\tmargin-bottom: 0.5384615385em;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-footer > span:last-child {\n\t\tmargin-bottom: 0;\n\t}\n\n\tbody:not(.search-results) article:not(.type-page) .entry-footer .avatar {\n\t\tdisplay: block;\n\t\theight: auto;\n\t\tmargin: 0 0 0.5384615385em;\n\t\twidth: 49px;\n\t}\n\n\tbody.no-sidebar:not(.search-results) article:not(.type-page) .entry-content {\n\t\tfloat: left;\n\t\tmargin-right: -100%;\n\t\tmargin-left: 34.99999999%;\n\t\twidth: 50.00000001%;\n\t}\n\n\tbody.no-sidebar:not(.search-results) article:not(.type-page) .entry-footer {\n\t\tmargin-right: -100%;\n\t\tmargin-left: 15%;\n\t\twidth: 15%;\n\t}\n}\n\n\n/**\n * 14.5 - >= 1200px\n */\n\n@media screen and (min-width: 75em) {\n\tbody:not(.search-results) .entry-summary {\n\t\tfont-size: 23px;\n\t\tfont-size: 1.4375rem;\n\t\tline-height: 1.5217391304;\n\t\tmargin-bottom: 1.826086957em;\n\t}\n\n\tbody:not(.search-results) .entry-header + .entry-summary {\n\t\tmargin-top: -0.913043478em;\n\t}\n\n\tbody:not(.search-results) .entry-summary p,\n\tbody:not(.search-results) .entry-summary address,\n\tbody:not(.search-results) .entry-summary hr,\n\tbody:not(.search-results) .entry-summary ul,\n\tbody:not(.search-results) .entry-summary ol,\n\tbody:not(.search-results) .entry-summary dl,\n\tbody:not(.search-results) .entry-summary dd,\n\tbody:not(.search-results) .entry-summary table {\n\t\tmargin-bottom: 1.5217391304em;\n\t}\n\n\tbody:not(.search-results) .entry-summary li > ul,\n\tbody:not(.search-results) .entry-summary blockquote > ul {\n\t\tmargin-left: 0.956521739em;\n\t}\n\n\tbody:not(.search-results) .entry-summary li > ol,\n\tbody:not(.search-results) .entry-summary blockquote > ol {\n\t\tmargin-left: 1.52173913em;\n\t}\n\n\tbody:not(.search-results) .entry-summary blockquote {\n\t\tfont-size: 23px;\n\t\tfont-size: 1.4375rem;\n\t\tline-height: 1.5217391304;\n\t\tmargin: 0 0 1.5217391304em;\n\t\tpadding-left: 1.347826087em;\n\t}\n\n\tbody:not(.search-results) .entry-summary blockquote:not(.alignleft):not(.alignright) {\n\t\tmargin-left: -1.52173913em;\n\t}\n\n\tbody:not(.search-results) .entry-summary blockquote blockquote:not(.alignleft):not(.alignright) {\n\t\tmargin-left: 0;\n\t}\n\n\tbody:not(.search-results) .entry-summary blockquote cite,\n\tbody:not(.search-results) .entry-summary blockquote small {\n\t\tfont-size: 19px;\n\t\tfont-size: 1.1875rem;\n\t\tline-height: 1.8421052632;\n\t}\n\n\tbody:not(.search-results) .entry-summary th,\n\tbody:not(.search-results) .entry-summary td {\n\t\tpadding: 0.3043478261em;\n\t}\n\n\tbody:not(.search-results) .entry-summary pre {\n\t\tfont-size: 16px;\n\t\tfont-size: 1rem;\n\t\tline-height: 1.75;\n\t\tmargin-bottom: 1.75em;\n\t\tpadding: 1.75em;\n\t}\n\n\tbody:not(.search-results) .entry-summary fieldset {\n\t\tmargin-bottom: 1.5217391304em;\n\t\tpadding: 0.3043478261em;\n\t}\n\n\tbody:not(.search-results) .entry-summary h1 {\n\t\tmargin-top: 2.121212121em;\n\t\tmargin-bottom: 1.060606061em;\n\t}\n\n\tbody:not(.search-results) .entry-summary h2 {\n\t\tmargin-top: 2.5em;\n\t\tmargin-bottom: 1.25em;\n\t}\n\n\tbody:not(.search-results) .entry-summary h3 {\n\t\tmargin-top: 3.043478261em;\n\t\tmargin-bottom: 1.52173913em;\n\t}\n\n\tbody:not(.search-results) .entry-summary h4,\n\tbody:not(.search-results) .entry-summary h5,\n\tbody:not(.search-results) .entry-summary h6 {\n\t\tmargin-top: 3.684210526em;\n\t\tmargin-bottom: 1.842105263em;\n\t}\n\n\tbody:not(.search-results) .entry-summary h1:first-child,\n\tbody:not(.search-results) .entry-summary h2:first-child,\n\tbody:not(.search-results) .entry-summary h3:first-child,\n\tbody:not(.search-results) .entry-summary h4:first-child,\n\tbody:not(.search-results) .entry-summary h5:first-child,\n\tbody:not(.search-results) .entry-summary h6:first-child {\n\t\tmargin-top: 0;\n\t}\n\n\tbody:not(.search-results) .entry-summary .alignleft {\n\t\tmargin: 0.2608695652em 1.5217391304em 1.5217391304em 0;\n\t}\n\n\tbody:not(.search-results) .entry-summary .alignright {\n\t\tmargin: 0.2608695652em 0 1.5217391304em 1.5217391304em;\n\t}\n\n\tbody:not(.search-results) .entry-summary .aligncenter {\n\t\tmargin-bottom: 1.5217391304em;\n\t}\n}\n\n\n/**\n * 15.0 - Print\n */\n\n@media print {\n\tform,\n\tbutton,\n\tinput,\n\tselect,\n\ttextarea,\n\t.navigation,\n\t.main-navigation,\n\t.social-navigation,\n\t.sidebar,\n\t.content-bottom-widgets,\n\t.header-image,\n\t.page-links,\n\t.edit-link,\n\t.comment-respond,\n\t.comment-edit-link,\n\t.comment-reply-link,\n\t.comment-metadata .edit-link,\n\t.pingback .edit-link {\n\t\tdisplay: none;\n\t}\n\n\tbody,\n\tblockquote cite,\n\tblockquote small,\n\tpre,\n\t.entry-content h4,\n\t.entry-content h5,\n\t.entry-content h6,\n\t.entry-summary h4,\n\t.entry-summary h5,\n\t.entry-summary h6,\n\t.comment-content h4,\n\t.comment-content h5,\n\t.comment-content h6,\n\t.entry-content .author-title {\n\t\tfont-size: 12pt;\n\t}\n\n\tblockquote {\n\t\tfont-size: 14.25pt;\n\t}\n\n\t.site-title,\n\t.page-title,\n\t.comments-title,\n\t.entry-content h2,\n\t.entry-summary h2,\n\t.comment-content h2,\n\t.widecolumn h2 {\n\t\tfont-size: 17.25pt;\n\t}\n\n\t.site-description {\n\t\tdisplay: block;\n\t}\n\n\t.entry-title {\n\t\tfont-size: 24.75pt;\n\t\tline-height: 1.2727272727;\n\t\tmargin-bottom: 1.696969697em;\n\t}\n\n\t.format-aside .entry-title,\n\t.format-image .entry-title,\n\t.format-video .entry-title,\n\t.format-quote .entry-title,\n\t.format-gallery .entry-title,\n\t.format-status .entry-title,\n\t.format-link .entry-title,\n\t.format-audio .entry-title,\n\t.format-chat .entry-title {\n\t\tfont-size: 17.25pt;\n\t\tline-height: 1.304347826;\n\t\tmargin-bottom: 1.826086957em;\n\t}\n\n\t.entry-content h1,\n\t.entry-summary h1,\n\t.comment-content h1 {\n\t\tfont-size: 21pt;\n\t}\n\n\t.entry-content h3,\n\t.entry-summary h3,\n\t.comment-content h3,\n\tbody:not(.search-results) .entry-summary {\n\t\tfont-size: 14.25pt;\n\t}\n\n\t.site-description,\n\t.author-bio,\n\t.entry-footer,\n\t.sticky-post,\n\t.taxonomy-description,\n\t.entry-caption,\n\t.comment-metadata,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.site-info,\n\t.wp-caption .wp-caption-text,\n\t.gallery-caption {\n\t\tfont-size: 9.75pt;\n\t}\n\n\tbody,\n\t.site {\n\t\tbackground: none !important; /* Brute force since user agents all print differently. */\n\t}\n\n\tbody,\n\tblockquote cite,\n\tblockquote small,\n\t.site-branding .site-title a,\n\t.entry-title a,\n\t.comment-author {\n\t\tcolor: #1a1a1a !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\tblockquote,\n\t.page-header,\n\t.comments-title {\n\t\tborder-color: #1a1a1a !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\tblockquote,\n\t.site-description,\n\tbody:not(.search-results) .entry-summary,\n\tbody:not(.search-results) .entry-summary blockquote,\n\t.author-bio,\n\t.entry-footer,\n\t.entry-footer a,\n\t.sticky-post,\n\t.taxonomy-description,\n\t.entry-caption,\n\t.comment-author,\n\t.comment-metadata a,\n\t.comment-notes,\n\t.comment-awaiting-moderation,\n\t.site-info,\n\t.site-info a,\n\t.wp-caption .wp-caption-text,\n\t.gallery-caption {\n\t\tcolor: #686868 !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\tcode,\n\thr {\n\t\tbackground-color: #d1d1d1 !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\tpre,\n\tabbr,\n\tacronym,\n\ttable,\n\tth,\n\ttd,\n\t.author-info,\n\t.comment-list article,\n\t.comment-list .pingback,\n\t.comment-list .trackback,\n\t.no-comments {\n\t\tborder-color: #d1d1d1 !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\ta {\n\t\tcolor: #007acc !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\t.entry-content a,\n\t.entry-summary a,\n\t.taxonomy-description a,\n\t.comment-content a,\n\t.pingback .comment-body > a {\n\t\tbox-shadow: none;\n\t\tborder-bottom: 1px solid #007acc !important; /* Make sure color schemes don't affect to print */\n\t}\n\n\t.site {\n\t\tmargin: 5%;\n\t}\n\n\t.site-inner {\n\t\tmax-width: none;\n\t}\n\n\t.site-header {\n\t\tpadding: 0 0 1.75em;\n\t}\n\n\t.site-branding {\n\t\tmargin-top: 0;\n\t\tmargin-bottom: 1.75em;\n\t}\n\n\t.site-main {\n\t\tmargin-bottom: 3.5em;\n\t}\n\n\t.entry-header,\n\t.entry-footer,\n\t.page-header,\n\t.page-content,\n\t.entry-content,\n\t.entry-summary,\n\t.post-thumbnail,\n\t.comments-area {\n\t\tmargin-right: 0;\n\t\tmargin-left: 0;\n\t}\n\n\t.post-thumbnail,\n\t.site-main > article {\n\t\tmargin-bottom: 3.5em;\n\t}\n\n\t.entry-content blockquote.alignleft,\n\t.entry-content blockquote.alignright {\n\t\tborder-width: 4px 0 0 0;\n\t\tpadding: 0.9473684211em 0 0;\n\t\twidth: -webkit-calc(50% - 0.736842105em);\n\t\twidth: calc(50% - 0.736842105em);\n\t}\n\n\tbody:not(.search-results) .entry-header + .entry-summary {\n\t\tmargin-top: -1.473684211em;\n\t}\n\n\t.site-footer,\n\t.widecolumn {\n\t\tpadding: 0;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/template-parts/biography.php",
    "content": "<?php\n/**\n * The template part for displaying an Author biography\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n<div class=\"author-info\">\n\t<div class=\"author-avatar\">\n\t\t<?php\n\t\t/**\n\t\t * Filter the Twenty Sixteen author bio avatar size.\n\t\t *\n\t\t * @since Twenty Sixteen 1.0\n\t\t *\n\t\t * @param int $size The avatar height and width size in pixels.\n\t\t */\n\t\t$author_bio_avatar_size = apply_filters( 'twentysixteen_author_bio_avatar_size', 42 );\n\n\t\techo get_avatar( get_the_author_meta( 'user_email' ), $author_bio_avatar_size );\n\t\t?>\n\t</div><!-- .author-avatar -->\n\n\t<div class=\"author-description\">\n\t\t<h2 class=\"author-title\"><span class=\"author-heading\"><?php _e( 'Author:', 'twentysixteen' ); ?></span> <?php echo get_the_author(); ?></h2>\n\n\t\t<p class=\"author-bio\">\n\t\t\t<?php the_author_meta( 'description' ); ?>\n\t\t\t<a class=\"author-link\" href=\"<?php echo esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ); ?>\" rel=\"author\">\n\t\t\t\t<?php printf( __( 'View all posts by %s', 'twentysixteen' ), get_the_author() ); ?>\n\t\t\t</a>\n\t\t</p><!-- .author-bio -->\n\t</div><!-- .author-description -->\n</div><!-- .author-info -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/template-parts/content-none.php",
    "content": "<?php\n/**\n * The template part for displaying a message that posts cannot be found\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n<section class=\"no-results not-found\">\n\t<header class=\"page-header\">\n\t\t<h1 class=\"page-title\"><?php _e( 'Nothing Found', 'twentysixteen' ); ?></h1>\n\t</header><!-- .page-header -->\n\n\t<div class=\"page-content\">\n\t\t<?php if ( is_home() && current_user_can( 'publish_posts' ) ) : ?>\n\n\t\t\t<p><?php printf( __( 'Ready to publish your first post? <a href=\"%1$s\">Get started here</a>.', 'twentysixteen' ), esc_url( admin_url( 'post-new.php' ) ) ); ?></p>\n\n\t\t<?php elseif ( is_search() ) : ?>\n\n\t\t\t<p><?php _e( 'Sorry, but nothing matched your search terms. Please try again with some different keywords.', 'twentysixteen' ); ?></p>\n\t\t\t<?php get_search_form(); ?>\n\n\t\t<?php else : ?>\n\n\t\t\t<p><?php _e( 'It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps searching can help.', 'twentysixteen' ); ?></p>\n\t\t\t<?php get_search_form(); ?>\n\n\t\t<?php endif; ?>\n\t</div><!-- .page-content -->\n</section><!-- .no-results -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/template-parts/content-page.php",
    "content": "<?php\n/**\n * The template used for displaying page content\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<header class=\"entry-header\">\n\t\t<?php the_title( '<h1 class=\"entry-title\">', '</h1>' ); ?>\n\t</header><!-- .entry-header -->\n\n\t<?php twentysixteen_post_thumbnail(); ?>\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\tthe_content();\n\n\t\twp_link_pages( array(\n\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentysixteen' ) . '</span>',\n\t\t\t'after'       => '</div>',\n\t\t\t'link_before' => '<span>',\n\t\t\t'link_after'  => '</span>',\n\t\t\t'pagelink'    => '<span class=\"screen-reader-text\">' . __( 'Page', 'twentysixteen' ) . ' </span>%',\n\t\t\t'separator'   => '<span class=\"screen-reader-text\">, </span>',\n\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<?php\n\t\tedit_post_link(\n\t\t\tsprintf(\n\t\t\t\t/* translators: %s: Name of current post */\n\t\t\t\t__( 'Edit<span class=\"screen-reader-text\"> \"%s\"</span>', 'twentysixteen' ),\n\t\t\t\tget_the_title()\n\t\t\t),\n\t\t\t'<footer class=\"entry-footer\"><span class=\"edit-link\">',\n\t\t\t'</span></footer><!-- .entry-footer -->'\n\t\t);\n\t?>\n\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/template-parts/content-search.php",
    "content": "<?php\n/**\n * The template part for displaying results in search pages\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<header class=\"entry-header\">\n\t\t<?php the_title( sprintf( '<h2 class=\"entry-title\"><a href=\"%s\" rel=\"bookmark\">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>\n\t</header><!-- .entry-header -->\n\n\t<?php twentysixteen_post_thumbnail(); ?>\n\n\t<?php twentysixteen_excerpt(); ?>\n\n\t<?php if ( 'post' === get_post_type() ) : ?>\n\n\t\t<footer class=\"entry-footer\">\n\t\t\t<?php twentysixteen_entry_meta(); ?>\n\t\t\t<?php\n\t\t\t\tedit_post_link(\n\t\t\t\t\tsprintf(\n\t\t\t\t\t\t/* translators: %s: Name of current post */\n\t\t\t\t\t\t__( 'Edit<span class=\"screen-reader-text\"> \"%s\"</span>', 'twentysixteen' ),\n\t\t\t\t\t\tget_the_title()\n\t\t\t\t\t),\n\t\t\t\t\t'<span class=\"edit-link\">',\n\t\t\t\t\t'</span>'\n\t\t\t\t);\n\t\t\t?>\n\t\t</footer><!-- .entry-footer -->\n\n\t<?php else : ?>\n\n\t\t<?php\n\t\t\tedit_post_link(\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: Name of current post */\n\t\t\t\t\t__( 'Edit<span class=\"screen-reader-text\"> \"%s\"</span>', 'twentysixteen' ),\n\t\t\t\t\tget_the_title()\n\t\t\t\t),\n\t\t\t\t'<footer class=\"entry-footer\"><span class=\"edit-link\">',\n\t\t\t\t'</span></footer><!-- .entry-footer -->'\n\t\t\t);\n\t\t?>\n\n\t<?php endif; ?>\n</article><!-- #post-## -->\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/template-parts/content-single.php",
    "content": "<?php\n/**\n * The template part for displaying single posts\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<header class=\"entry-header\">\n\t\t<?php the_title( '<h1 class=\"entry-title\">', '</h1>' ); ?>\n\t</header><!-- .entry-header -->\n\n\t<?php twentysixteen_excerpt(); ?>\n\n\t<?php twentysixteen_post_thumbnail(); ?>\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\tthe_content();\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentysixteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t\t'pagelink'    => '<span class=\"screen-reader-text\">' . __( 'Page', 'twentysixteen' ) . ' </span>%',\n\t\t\t\t'separator'   => '<span class=\"screen-reader-text\">, </span>',\n\t\t\t) );\n\n\t\t\tif ( '' !== get_the_author_meta( 'description' ) ) {\n\t\t\t\tget_template_part( 'template-parts/biography' );\n\t\t\t}\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<footer class=\"entry-footer\">\n\t\t<?php twentysixteen_entry_meta(); ?>\n\t\t<?php\n\t\t\tedit_post_link(\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: Name of current post */\n\t\t\t\t\t__( 'Edit<span class=\"screen-reader-text\"> \"%s\"</span>', 'twentysixteen' ),\n\t\t\t\t\tget_the_title()\n\t\t\t\t),\n\t\t\t\t'<span class=\"edit-link\">',\n\t\t\t\t'</span>'\n\t\t\t);\n\t\t?>\n\t</footer><!-- .entry-footer -->\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-content/themes/twentysixteen/template-parts/content.php",
    "content": "<?php\n/**\n * The template part for displaying content\n *\n * @package WordPress\n * @subpackage Twenty_Sixteen\n * @since Twenty Sixteen 1.0\n */\n?>\n\n<article id=\"post-<?php the_ID(); ?>\" <?php post_class(); ?>>\n\t<header class=\"entry-header\">\n\t\t<?php if ( is_sticky() && is_home() && ! is_paged() ) : ?>\n\t\t\t<span class=\"sticky-post\"><?php _e( 'Featured', 'twentysixteen' ); ?></span>\n\t\t<?php endif; ?>\n\n\t\t<?php the_title( sprintf( '<h2 class=\"entry-title\"><a href=\"%s\" rel=\"bookmark\">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>\n\t</header><!-- .entry-header -->\n\n\t<?php twentysixteen_excerpt(); ?>\n\n\t<?php twentysixteen_post_thumbnail(); ?>\n\n\t<div class=\"entry-content\">\n\t\t<?php\n\t\t\t/* translators: %s: Name of current post */\n\t\t\tthe_content( sprintf(\n\t\t\t\t__( 'Continue reading<span class=\"screen-reader-text\"> \"%s\"</span>', 'twentysixteen' ),\n\t\t\t\tget_the_title()\n\t\t\t) );\n\n\t\t\twp_link_pages( array(\n\t\t\t\t'before'      => '<div class=\"page-links\"><span class=\"page-links-title\">' . __( 'Pages:', 'twentysixteen' ) . '</span>',\n\t\t\t\t'after'       => '</div>',\n\t\t\t\t'link_before' => '<span>',\n\t\t\t\t'link_after'  => '</span>',\n\t\t\t\t'pagelink'    => '<span class=\"screen-reader-text\">' . __( 'Page', 'twentysixteen' ) . ' </span>%',\n\t\t\t\t'separator'   => '<span class=\"screen-reader-text\">, </span>',\n\t\t\t) );\n\t\t?>\n\t</div><!-- .entry-content -->\n\n\t<footer class=\"entry-footer\">\n\t\t<?php twentysixteen_entry_meta(); ?>\n\t\t<?php\n\t\t\tedit_post_link(\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: Name of current post */\n\t\t\t\t\t__( 'Edit<span class=\"screen-reader-text\"> \"%s\"</span>', 'twentysixteen' ),\n\t\t\t\t\tget_the_title()\n\t\t\t\t),\n\t\t\t\t'<span class=\"edit-link\">',\n\t\t\t\t'</span>'\n\t\t\t);\n\t\t?>\n\t</footer><!-- .entry-footer -->\n</article><!-- #post-## -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-cron.php",
    "content": "<?php\n/**\n * WordPress Cron Implementation for hosts, which do not offer CRON or for which\n * the user has not set up a CRON job pointing to this file.\n *\n * The HTTP request to this file will not slow down the visitor who happens to\n * visit when the cron job is needed to run.\n *\n * @package WordPress\n */\n\nignore_user_abort(true);\n\nif ( !empty($_POST) || defined('DOING_AJAX') || defined('DOING_CRON') )\n\tdie();\n\n/**\n * Tell WordPress we are doing the CRON task.\n *\n * @var bool\n */\ndefine('DOING_CRON', true);\n\nif ( !defined('ABSPATH') ) {\n\t/** Set up WordPress environment */\n\trequire_once( dirname( __FILE__ ) . '/wp-load.php' );\n}\n\n/**\n * Retrieves the cron lock.\n *\n * Returns the uncached `doing_cron` transient.\n *\n * @ignore\n * @since 3.3.0\n *\n * @return string|false Value of the `doing_cron` transient, 0|false otherwise.\n */\nfunction _get_cron_lock() {\n\tglobal $wpdb;\n\n\t$value = 0;\n\tif ( wp_using_ext_object_cache() ) {\n\t\t/*\n\t\t * Skip local cache and force re-fetch of doing_cron transient\n\t\t * in case another process updated the cache.\n\t\t */\n\t\t$value = wp_cache_get( 'doing_cron', 'transient', true );\n\t} else {\n\t\t$row = $wpdb->get_row( $wpdb->prepare( \"SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1\", '_transient_doing_cron' ) );\n\t\tif ( is_object( $row ) )\n\t\t\t$value = $row->option_value;\n\t}\n\n\treturn $value;\n}\n\nif ( false === $crons = _get_cron_array() )\n\tdie();\n\n$keys = array_keys( $crons );\n$gmt_time = microtime( true );\n\nif ( isset($keys[0]) && $keys[0] > $gmt_time )\n\tdie();\n\n\n// The cron lock: a unix timestamp from when the cron was spawned.\n$doing_cron_transient = get_transient( 'doing_cron' );\n\n// Use global $doing_wp_cron lock otherwise use the GET lock. If no lock, trying grabbing a new lock.\nif ( empty( $doing_wp_cron ) ) {\n\tif ( empty( $_GET[ 'doing_wp_cron' ] ) ) {\n\t\t// Called from external script/job. Try setting a lock.\n\t\tif ( $doing_cron_transient && ( $doing_cron_transient + WP_CRON_LOCK_TIMEOUT > $gmt_time ) )\n\t\t\treturn;\n\t\t$doing_cron_transient = $doing_wp_cron = sprintf( '%.22F', microtime( true ) );\n\t\tset_transient( 'doing_cron', $doing_wp_cron );\n\t} else {\n\t\t$doing_wp_cron = $_GET[ 'doing_wp_cron' ];\n\t}\n}\n\n/*\n * The cron lock (a unix timestamp set when the cron was spawned),\n * must match $doing_wp_cron (the \"key\").\n */\nif ( $doing_cron_transient != $doing_wp_cron )\n\treturn;\n\nforeach ( $crons as $timestamp => $cronhooks ) {\n\tif ( $timestamp > $gmt_time )\n\t\tbreak;\n\n\tforeach ( $cronhooks as $hook => $keys ) {\n\n\t\tforeach ( $keys as $k => $v ) {\n\n\t\t\t$schedule = $v['schedule'];\n\n\t\t\tif ( $schedule != false ) {\n\t\t\t\t$new_args = array($timestamp, $schedule, $hook, $v['args']);\n\t\t\t\tcall_user_func_array('wp_reschedule_event', $new_args);\n\t\t\t}\n\n\t\t\twp_unschedule_event( $timestamp, $hook, $v['args'] );\n\n\t\t\t/**\n\t\t\t * Fires scheduled events.\n\t\t\t *\n\t\t\t * @ignore\n\t\t\t * @since 2.1.0\n\t\t\t *\n\t\t\t * @param string $hook Name of the hook that was scheduled to be fired.\n\t\t\t * @param array  $args The arguments to be passed to the hook.\n\t\t\t */\n \t\t\tdo_action_ref_array( $hook, $v['args'] );\n\n\t\t\t// If the hook ran too long and another cron process stole the lock, quit.\n\t\t\tif ( _get_cron_lock() != $doing_wp_cron )\n\t\t\t\treturn;\n\t\t}\n\t}\n}\n\nif ( _get_cron_lock() == $doing_wp_cron )\n\tdelete_transient( 'doing_cron' );\n\ndie();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/getid3.lib.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// getid3.lib.php - part of getID3()                           //\n// See readme.txt for more details                             //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n\nclass getid3_lib\n{\n\n\tpublic static function PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8') {\n\t\t$returnstring = '';\n\t\tfor ($i = 0; $i < strlen($string); $i++) {\n\t\t\tif ($hex) {\n\t\t\t\t$returnstring .= str_pad(dechex(ord($string{$i})), 2, '0', STR_PAD_LEFT);\n\t\t\t} else {\n\t\t\t\t$returnstring .= ' '.(preg_match(\"#[\\x20-\\x7E]#\", $string{$i}) ? $string{$i} : '¤');\n\t\t\t}\n\t\t\tif ($spaces) {\n\t\t\t\t$returnstring .= ' ';\n\t\t\t}\n\t\t}\n\t\tif (!empty($htmlencoding)) {\n\t\t\tif ($htmlencoding === true) {\n\t\t\t\t$htmlencoding = 'UTF-8'; // prior to getID3 v1.9.0 the function's 4th parameter was boolean\n\t\t\t}\n\t\t\t$returnstring = htmlentities($returnstring, ENT_QUOTES, $htmlencoding);\n\t\t}\n\t\treturn $returnstring;\n\t}\n\n\tpublic static function trunc($floatnumber) {\n\t\t// truncates a floating-point number at the decimal point\n\t\t// returns int (if possible, otherwise float)\n\t\tif ($floatnumber >= 1) {\n\t\t\t$truncatednumber = floor($floatnumber);\n\t\t} elseif ($floatnumber <= -1) {\n\t\t\t$truncatednumber = ceil($floatnumber);\n\t\t} else {\n\t\t\t$truncatednumber = 0;\n\t\t}\n\t\tif (self::intValueSupported($truncatednumber)) {\n\t\t\t$truncatednumber = (int) $truncatednumber;\n\t\t}\n\t\treturn $truncatednumber;\n\t}\n\n\n\tpublic static function safe_inc(&$variable, $increment=1) {\n\t\tif (isset($variable)) {\n\t\t\t$variable += $increment;\n\t\t} else {\n\t\t\t$variable = $increment;\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static function CastAsInt($floatnum) {\n\t\t// convert to float if not already\n\t\t$floatnum = (float) $floatnum;\n\n\t\t// convert a float to type int, only if possible\n\t\tif (self::trunc($floatnum) == $floatnum) {\n\t\t\t// it's not floating point\n\t\t\tif (self::intValueSupported($floatnum)) {\n\t\t\t\t// it's within int range\n\t\t\t\t$floatnum = (int) $floatnum;\n\t\t\t}\n\t\t}\n\t\treturn $floatnum;\n\t}\n\n\tpublic static function intValueSupported($num) {\n\t\t// check if integers are 64-bit\n\t\tstatic $hasINT64 = null;\n\t\tif ($hasINT64 === null) { // 10x faster than is_null()\n\t\t\t$hasINT64 = is_int(pow(2, 31)); // 32-bit int are limited to (2^31)-1\n\t\t\tif (!$hasINT64 && !defined('PHP_INT_MIN')) {\n\t\t\t\tdefine('PHP_INT_MIN', ~PHP_INT_MAX);\n\t\t\t}\n\t\t}\n\t\t// if integers are 64-bit - no other check required\n\t\tif ($hasINT64 || (($num <= PHP_INT_MAX) && ($num >= PHP_INT_MIN))) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static function DecimalizeFraction($fraction) {\n\t\tlist($numerator, $denominator) = explode('/', $fraction);\n\t\treturn $numerator / ($denominator ? $denominator : 1);\n\t}\n\n\n\tpublic static function DecimalBinary2Float($binarynumerator) {\n\t\t$numerator   = self::Bin2Dec($binarynumerator);\n\t\t$denominator = self::Bin2Dec('1'.str_repeat('0', strlen($binarynumerator)));\n\t\treturn ($numerator / $denominator);\n\t}\n\n\n\tpublic static function NormalizeBinaryPoint($binarypointnumber, $maxbits=52) {\n\t\t// http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html\n\t\tif (strpos($binarypointnumber, '.') === false) {\n\t\t\t$binarypointnumber = '0.'.$binarypointnumber;\n\t\t} elseif ($binarypointnumber{0} == '.') {\n\t\t\t$binarypointnumber = '0'.$binarypointnumber;\n\t\t}\n\t\t$exponent = 0;\n\t\twhile (($binarypointnumber{0} != '1') || (substr($binarypointnumber, 1, 1) != '.')) {\n\t\t\tif (substr($binarypointnumber, 1, 1) == '.') {\n\t\t\t\t$exponent--;\n\t\t\t\t$binarypointnumber = substr($binarypointnumber, 2, 1).'.'.substr($binarypointnumber, 3);\n\t\t\t} else {\n\t\t\t\t$pointpos = strpos($binarypointnumber, '.');\n\t\t\t\t$exponent += ($pointpos - 1);\n\t\t\t\t$binarypointnumber = str_replace('.', '', $binarypointnumber);\n\t\t\t\t$binarypointnumber = $binarypointnumber{0}.'.'.substr($binarypointnumber, 1);\n\t\t\t}\n\t\t}\n\t\t$binarypointnumber = str_pad(substr($binarypointnumber, 0, $maxbits + 2), $maxbits + 2, '0', STR_PAD_RIGHT);\n\t\treturn array('normalized'=>$binarypointnumber, 'exponent'=>(int) $exponent);\n\t}\n\n\n\tpublic static function Float2BinaryDecimal($floatvalue) {\n\t\t// http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html\n\t\t$maxbits = 128; // to how many bits of precision should the calculations be taken?\n\t\t$intpart   = self::trunc($floatvalue);\n\t\t$floatpart = abs($floatvalue - $intpart);\n\t\t$pointbitstring = '';\n\t\twhile (($floatpart != 0) && (strlen($pointbitstring) < $maxbits)) {\n\t\t\t$floatpart *= 2;\n\t\t\t$pointbitstring .= (string) self::trunc($floatpart);\n\t\t\t$floatpart -= self::trunc($floatpart);\n\t\t}\n\t\t$binarypointnumber = decbin($intpart).'.'.$pointbitstring;\n\t\treturn $binarypointnumber;\n\t}\n\n\n\tpublic static function Float2String($floatvalue, $bits) {\n\t\t// http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html\n\t\tswitch ($bits) {\n\t\t\tcase 32:\n\t\t\t\t$exponentbits = 8;\n\t\t\t\t$fractionbits = 23;\n\t\t\t\tbreak;\n\n\t\t\tcase 64:\n\t\t\t\t$exponentbits = 11;\n\t\t\t\t$fractionbits = 52;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t\t\tbreak;\n\t\t}\n\t\tif ($floatvalue >= 0) {\n\t\t\t$signbit = '0';\n\t\t} else {\n\t\t\t$signbit = '1';\n\t\t}\n\t\t$normalizedbinary  = self::NormalizeBinaryPoint(self::Float2BinaryDecimal($floatvalue), $fractionbits);\n\t\t$biasedexponent    = pow(2, $exponentbits - 1) - 1 + $normalizedbinary['exponent']; // (127 or 1023) +/- exponent\n\t\t$exponentbitstring = str_pad(decbin($biasedexponent), $exponentbits, '0', STR_PAD_LEFT);\n\t\t$fractionbitstring = str_pad(substr($normalizedbinary['normalized'], 2), $fractionbits, '0', STR_PAD_RIGHT);\n\n\t\treturn self::BigEndian2String(self::Bin2Dec($signbit.$exponentbitstring.$fractionbitstring), $bits % 8, false);\n\t}\n\n\n\tpublic static function LittleEndian2Float($byteword) {\n\t\treturn self::BigEndian2Float(strrev($byteword));\n\t}\n\n\n\tpublic static function BigEndian2Float($byteword) {\n\t\t// ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic\n\t\t// http://www.psc.edu/general/software/packages/ieee/ieee.html\n\t\t// http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html\n\n\t\t$bitword = self::BigEndian2Bin($byteword);\n\t\tif (!$bitword) {\n\t\t\treturn 0;\n\t\t}\n\t\t$signbit = $bitword{0};\n\n\t\tswitch (strlen($byteword) * 8) {\n\t\t\tcase 32:\n\t\t\t\t$exponentbits = 8;\n\t\t\t\t$fractionbits = 23;\n\t\t\t\tbreak;\n\n\t\t\tcase 64:\n\t\t\t\t$exponentbits = 11;\n\t\t\t\t$fractionbits = 52;\n\t\t\t\tbreak;\n\n\t\t\tcase 80:\n\t\t\t\t// 80-bit Apple SANE format\n\t\t\t\t// http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/\n\t\t\t\t$exponentstring = substr($bitword, 1, 15);\n\t\t\t\t$isnormalized = intval($bitword{16});\n\t\t\t\t$fractionstring = substr($bitword, 17, 63);\n\t\t\t\t$exponent = pow(2, self::Bin2Dec($exponentstring) - 16383);\n\t\t\t\t$fraction = $isnormalized + self::DecimalBinary2Float($fractionstring);\n\t\t\t\t$floatvalue = $exponent * $fraction;\n\t\t\t\tif ($signbit == '1') {\n\t\t\t\t\t$floatvalue *= -1;\n\t\t\t\t}\n\t\t\t\treturn $floatvalue;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t\t\tbreak;\n\t\t}\n\t\t$exponentstring = substr($bitword, 1, $exponentbits);\n\t\t$fractionstring = substr($bitword, $exponentbits + 1, $fractionbits);\n\t\t$exponent = self::Bin2Dec($exponentstring);\n\t\t$fraction = self::Bin2Dec($fractionstring);\n\n\t\tif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) {\n\t\t\t// Not a Number\n\t\t\t$floatvalue = false;\n\t\t} elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) {\n\t\t\tif ($signbit == '1') {\n\t\t\t\t$floatvalue = '-infinity';\n\t\t\t} else {\n\t\t\t\t$floatvalue = '+infinity';\n\t\t\t}\n\t\t} elseif (($exponent == 0) && ($fraction == 0)) {\n\t\t\tif ($signbit == '1') {\n\t\t\t\t$floatvalue = -0;\n\t\t\t} else {\n\t\t\t\t$floatvalue = 0;\n\t\t\t}\n\t\t\t$floatvalue = ($signbit ? 0 : -0);\n\t\t} elseif (($exponent == 0) && ($fraction != 0)) {\n\t\t\t// These are 'unnormalized' values\n\t\t\t$floatvalue = pow(2, (-1 * (pow(2, $exponentbits - 1) - 2))) * self::DecimalBinary2Float($fractionstring);\n\t\t\tif ($signbit == '1') {\n\t\t\t\t$floatvalue *= -1;\n\t\t\t}\n\t\t} elseif ($exponent != 0) {\n\t\t\t$floatvalue = pow(2, ($exponent - (pow(2, $exponentbits - 1) - 1))) * (1 + self::DecimalBinary2Float($fractionstring));\n\t\t\tif ($signbit == '1') {\n\t\t\t\t$floatvalue *= -1;\n\t\t\t}\n\t\t}\n\t\treturn (float) $floatvalue;\n\t}\n\n\n\tpublic static function BigEndian2Int($byteword, $synchsafe=false, $signed=false) {\n\t\t$intvalue = 0;\n\t\t$bytewordlen = strlen($byteword);\n\t\tif ($bytewordlen == 0) {\n\t\t\treturn false;\n\t\t}\n\t\tfor ($i = 0; $i < $bytewordlen; $i++) {\n\t\t\tif ($synchsafe) { // disregard MSB, effectively 7-bit bytes\n\t\t\t\t//$intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7); // faster, but runs into problems past 2^31 on 32-bit systems\n\t\t\t\t$intvalue += (ord($byteword{$i}) & 0x7F) * pow(2, ($bytewordlen - 1 - $i) * 7);\n\t\t\t} else {\n\t\t\t\t$intvalue += ord($byteword{$i}) * pow(256, ($bytewordlen - 1 - $i));\n\t\t\t}\n\t\t}\n\t\tif ($signed && !$synchsafe) {\n\t\t\t// synchsafe ints are not allowed to be signed\n\t\t\tif ($bytewordlen <= PHP_INT_SIZE) {\n\t\t\t\t$signMaskBit = 0x80 << (8 * ($bytewordlen - 1));\n\t\t\t\tif ($intvalue & $signMaskBit) {\n\t\t\t\t\t$intvalue = 0 - ($intvalue & ($signMaskBit - 1));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits ('.strlen($byteword).') in self::BigEndian2Int()');\n\t\t\t}\n\t\t}\n\t\treturn self::CastAsInt($intvalue);\n\t}\n\n\n\tpublic static function LittleEndian2Int($byteword, $signed=false) {\n\t\treturn self::BigEndian2Int(strrev($byteword), false, $signed);\n\t}\n\n\n\tpublic static function BigEndian2Bin($byteword) {\n\t\t$binvalue = '';\n\t\t$bytewordlen = strlen($byteword);\n\t\tfor ($i = 0; $i < $bytewordlen; $i++) {\n\t\t\t$binvalue .= str_pad(decbin(ord($byteword{$i})), 8, '0', STR_PAD_LEFT);\n\t\t}\n\t\treturn $binvalue;\n\t}\n\n\n\tpublic static function BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false) {\n\t\tif ($number < 0) {\n\t\t\tthrow new Exception('ERROR: self::BigEndian2String() does not support negative numbers');\n\t\t}\n\t\t$maskbyte = (($synchsafe || $signed) ? 0x7F : 0xFF);\n\t\t$intstring = '';\n\t\tif ($signed) {\n\t\t\tif ($minbytes > PHP_INT_SIZE) {\n\t\t\t\tthrow new Exception('ERROR: Cannot have signed integers larger than '.(8 * PHP_INT_SIZE).'-bits in self::BigEndian2String()');\n\t\t\t}\n\t\t\t$number = $number & (0x80 << (8 * ($minbytes - 1)));\n\t\t}\n\t\twhile ($number != 0) {\n\t\t\t$quotient = ($number / ($maskbyte + 1));\n\t\t\t$intstring = chr(ceil(($quotient - floor($quotient)) * $maskbyte)).$intstring;\n\t\t\t$number = floor($quotient);\n\t\t}\n\t\treturn str_pad($intstring, $minbytes, \"\\x00\", STR_PAD_LEFT);\n\t}\n\n\n\tpublic static function Dec2Bin($number) {\n\t\twhile ($number >= 256) {\n\t\t\t$bytes[] = (($number / 256) - (floor($number / 256))) * 256;\n\t\t\t$number = floor($number / 256);\n\t\t}\n\t\t$bytes[] = $number;\n\t\t$binstring = '';\n\t\tfor ($i = 0; $i < count($bytes); $i++) {\n\t\t\t$binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, '0', STR_PAD_LEFT)).$binstring;\n\t\t}\n\t\treturn $binstring;\n\t}\n\n\n\tpublic static function Bin2Dec($binstring, $signed=false) {\n\t\t$signmult = 1;\n\t\tif ($signed) {\n\t\t\tif ($binstring{0} == '1') {\n\t\t\t\t$signmult = -1;\n\t\t\t}\n\t\t\t$binstring = substr($binstring, 1);\n\t\t}\n\t\t$decvalue = 0;\n\t\tfor ($i = 0; $i < strlen($binstring); $i++) {\n\t\t\t$decvalue += ((int) substr($binstring, strlen($binstring) - $i - 1, 1)) * pow(2, $i);\n\t\t}\n\t\treturn self::CastAsInt($decvalue * $signmult);\n\t}\n\n\n\tpublic static function Bin2String($binstring) {\n\t\t// return 'hi' for input of '0110100001101001'\n\t\t$string = '';\n\t\t$binstringreversed = strrev($binstring);\n\t\tfor ($i = 0; $i < strlen($binstringreversed); $i += 8) {\n\t\t\t$string = chr(self::Bin2Dec(strrev(substr($binstringreversed, $i, 8)))).$string;\n\t\t}\n\t\treturn $string;\n\t}\n\n\n\tpublic static function LittleEndian2String($number, $minbytes=1, $synchsafe=false) {\n\t\t$intstring = '';\n\t\twhile ($number > 0) {\n\t\t\tif ($synchsafe) {\n\t\t\t\t$intstring = $intstring.chr($number & 127);\n\t\t\t\t$number >>= 7;\n\t\t\t} else {\n\t\t\t\t$intstring = $intstring.chr($number & 255);\n\t\t\t\t$number >>= 8;\n\t\t\t}\n\t\t}\n\t\treturn str_pad($intstring, $minbytes, \"\\x00\", STR_PAD_RIGHT);\n\t}\n\n\n\tpublic static function array_merge_clobber($array1, $array2) {\n\t\t// written by kcØhireability*com\n\t\t// taken from http://www.php.net/manual/en/function.array-merge-recursive.php\n\t\tif (!is_array($array1) || !is_array($array2)) {\n\t\t\treturn false;\n\t\t}\n\t\t$newarray = $array1;\n\t\tforeach ($array2 as $key => $val) {\n\t\t\tif (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) {\n\t\t\t\t$newarray[$key] = self::array_merge_clobber($newarray[$key], $val);\n\t\t\t} else {\n\t\t\t\t$newarray[$key] = $val;\n\t\t\t}\n\t\t}\n\t\treturn $newarray;\n\t}\n\n\n\tpublic static function array_merge_noclobber($array1, $array2) {\n\t\tif (!is_array($array1) || !is_array($array2)) {\n\t\t\treturn false;\n\t\t}\n\t\t$newarray = $array1;\n\t\tforeach ($array2 as $key => $val) {\n\t\t\tif (is_array($val) && isset($newarray[$key]) && is_array($newarray[$key])) {\n\t\t\t\t$newarray[$key] = self::array_merge_noclobber($newarray[$key], $val);\n\t\t\t} elseif (!isset($newarray[$key])) {\n\t\t\t\t$newarray[$key] = $val;\n\t\t\t}\n\t\t}\n\t\treturn $newarray;\n\t}\n\n\n\tpublic static function ksort_recursive(&$theArray) {\n\t\tksort($theArray);\n\t\tforeach ($theArray as $key => $value) {\n\t\t\tif (is_array($value)) {\n\t\t\t\tself::ksort_recursive($theArray[$key]);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static function fileextension($filename, $numextensions=1) {\n\t\tif (strstr($filename, '.')) {\n\t\t\t$reversedfilename = strrev($filename);\n\t\t\t$offset = 0;\n\t\t\tfor ($i = 0; $i < $numextensions; $i++) {\n\t\t\t\t$offset = strpos($reversedfilename, '.', $offset + 1);\n\t\t\t\tif ($offset === false) {\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn strrev(substr($reversedfilename, 0, $offset));\n\t\t}\n\t\treturn '';\n\t}\n\n\n\tpublic static function PlaytimeString($seconds) {\n\t\t$sign = (($seconds < 0) ? '-' : '');\n\t\t$seconds = round(abs($seconds));\n\t\t$H = (int) floor( $seconds                            / 3600);\n\t\t$M = (int) floor(($seconds - (3600 * $H)            ) /   60);\n\t\t$S = (int) round( $seconds - (3600 * $H) - (60 * $M)        );\n\t\treturn $sign.($H ? $H.':' : '').($H ? str_pad($M, 2, '0', STR_PAD_LEFT) : intval($M)).':'.str_pad($S, 2, 0, STR_PAD_LEFT);\n\t}\n\n\n\tpublic static function DateMac2Unix($macdate) {\n\t\t// Macintosh timestamp: seconds since 00:00h January 1, 1904\n\t\t// UNIX timestamp:      seconds since 00:00h January 1, 1970\n\t\treturn self::CastAsInt($macdate - 2082844800);\n\t}\n\n\n\tpublic static function FixedPoint8_8($rawdata) {\n\t\treturn self::BigEndian2Int(substr($rawdata, 0, 1)) + (float) (self::BigEndian2Int(substr($rawdata, 1, 1)) / pow(2, 8));\n\t}\n\n\n\tpublic static function FixedPoint16_16($rawdata) {\n\t\treturn self::BigEndian2Int(substr($rawdata, 0, 2)) + (float) (self::BigEndian2Int(substr($rawdata, 2, 2)) / pow(2, 16));\n\t}\n\n\n\tpublic static function FixedPoint2_30($rawdata) {\n\t\t$binarystring = self::BigEndian2Bin($rawdata);\n\t\treturn self::Bin2Dec(substr($binarystring, 0, 2)) + (float) (self::Bin2Dec(substr($binarystring, 2, 30)) / pow(2, 30));\n\t}\n\n\n\tpublic static function CreateDeepArray($ArrayPath, $Separator, $Value) {\n\t\t// assigns $Value to a nested array path:\n\t\t//   $foo = self::CreateDeepArray('/path/to/my', '/', 'file.txt')\n\t\t// is the same as:\n\t\t//   $foo = array('path'=>array('to'=>'array('my'=>array('file.txt'))));\n\t\t// or\n\t\t//   $foo['path']['to']['my'] = 'file.txt';\n\t\t$ArrayPath = ltrim($ArrayPath, $Separator);\n\t\tif (($pos = strpos($ArrayPath, $Separator)) !== false) {\n\t\t\t$ReturnedArray[substr($ArrayPath, 0, $pos)] = self::CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value);\n\t\t} else {\n\t\t\t$ReturnedArray[$ArrayPath] = $Value;\n\t\t}\n\t\treturn $ReturnedArray;\n\t}\n\n\tpublic static function array_max($arraydata, $returnkey=false) {\n\t\t$maxvalue = false;\n\t\t$maxkey = false;\n\t\tforeach ($arraydata as $key => $value) {\n\t\t\tif (!is_array($value)) {\n\t\t\t\tif ($value > $maxvalue) {\n\t\t\t\t\t$maxvalue = $value;\n\t\t\t\t\t$maxkey = $key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ($returnkey ? $maxkey : $maxvalue);\n\t}\n\n\tpublic static function array_min($arraydata, $returnkey=false) {\n\t\t$minvalue = false;\n\t\t$minkey = false;\n\t\tforeach ($arraydata as $key => $value) {\n\t\t\tif (!is_array($value)) {\n\t\t\t\tif ($value > $minvalue) {\n\t\t\t\t\t$minvalue = $value;\n\t\t\t\t\t$minkey = $key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn ($returnkey ? $minkey : $minvalue);\n\t}\n\n\tpublic static function XML2array($XMLstring) {\n\t\tif (function_exists('simplexml_load_string') && function_exists('libxml_disable_entity_loader')) {\n\t\t\t// http://websec.io/2012/08/27/Preventing-XEE-in-PHP.html\n\t\t\t// https://core.trac.wordpress.org/changeset/29378\n\t\t\t$loader = libxml_disable_entity_loader(true);\n\t\t\t$XMLobject = simplexml_load_string($XMLstring, 'SimpleXMLElement', LIBXML_NOENT);\n\t\t\t$return = self::SimpleXMLelement2array($XMLobject);\n\t\t\tlibxml_disable_entity_loader($loader);\n\t\t\treturn $return;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static function SimpleXMLelement2array($XMLobject) {\n\t\tif (!is_object($XMLobject) && !is_array($XMLobject)) {\n\t\t\treturn $XMLobject;\n\t\t}\n\t\t$XMLarray = (is_object($XMLobject) ? get_object_vars($XMLobject) : $XMLobject);\n\t\tforeach ($XMLarray as $key => $value) {\n\t\t\t$XMLarray[$key] = self::SimpleXMLelement2array($value);\n\t\t}\n\t\treturn $XMLarray;\n\t}\n\n\n\t// Allan Hansen <ahØartemis*dk>\n\t// self::md5_data() - returns md5sum for a file from startuing position to absolute end position\n\tpublic static function hash_data($file, $offset, $end, $algorithm) {\n\t\tstatic $tempdir = '';\n\t\tif (!self::intValueSupported($end)) {\n\t\t\treturn false;\n\t\t}\n\t\tswitch ($algorithm) {\n\t\t\tcase 'md5':\n\t\t\t\t$hash_function = 'md5_file';\n\t\t\t\t$unix_call     = 'md5sum';\n\t\t\t\t$windows_call  = 'md5sum.exe';\n\t\t\t\t$hash_length   = 32;\n\t\t\t\tbreak;\n\n\t\t\tcase 'sha1':\n\t\t\t\t$hash_function = 'sha1_file';\n\t\t\t\t$unix_call     = 'sha1sum';\n\t\t\t\t$windows_call  = 'sha1sum.exe';\n\t\t\t\t$hash_length   = 40;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Exception('Invalid algorithm ('.$algorithm.') in self::hash_data()');\n\t\t\t\tbreak;\n\t\t}\n\t\t$size = $end - $offset;\n\t\twhile (true) {\n\t\t\tif (GETID3_OS_ISWINDOWS) {\n\n\t\t\t\t// It seems that sha1sum.exe for Windows only works on physical files, does not accept piped data\n\t\t\t\t// Fall back to create-temp-file method:\n\t\t\t\tif ($algorithm == 'sha1') {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t$RequiredFiles = array('cygwin1.dll', 'head.exe', 'tail.exe', $windows_call);\n\t\t\t\tforeach ($RequiredFiles as $required_file) {\n\t\t\t\t\tif (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) {\n\t\t\t\t\t\t// helper apps not available - fall back to old method\n\t\t\t\t\t\tbreak 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$commandline  = GETID3_HELPERAPPSDIR.'head.exe -c '.$end.' '.escapeshellarg(str_replace('/', DIRECTORY_SEPARATOR, $file)).' | ';\n\t\t\t\t$commandline .= GETID3_HELPERAPPSDIR.'tail.exe -c '.$size.' | ';\n\t\t\t\t$commandline .= GETID3_HELPERAPPSDIR.$windows_call;\n\n\t\t\t} else {\n\n\t\t\t\t$commandline  = 'head -c'.$end.' '.escapeshellarg($file).' | ';\n\t\t\t\t$commandline .= 'tail -c'.$size.' | ';\n\t\t\t\t$commandline .= $unix_call;\n\n\t\t\t}\n\t\t\tif (preg_match('#(1|ON)#i', ini_get('safe_mode'))) {\n\t\t\t\t//throw new Exception('PHP running in Safe Mode - backtick operator not available, using slower non-system-call '.$algorithm.' algorithm');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn substr(`$commandline`, 0, $hash_length);\n\t\t}\n\n\t\tif (empty($tempdir)) {\n\t\t\t// yes this is ugly, feel free to suggest a better way\n\t\t\trequire_once(dirname(__FILE__).'/getid3.php');\n\t\t\t$getid3_temp = new getID3();\n\t\t\t$tempdir = $getid3_temp->tempdir;\n\t\t\tunset($getid3_temp);\n\t\t}\n\t\t// try to create a temporary file in the system temp directory - invalid dirname should force to system temp dir\n\t\tif (($data_filename = tempnam($tempdir, 'gI3')) === false) {\n\t\t\t// can't find anywhere to create a temp file, just fail\n\t\t\treturn false;\n\t\t}\n\n\t\t// Init\n\t\t$result = false;\n\n\t\t// copy parts of file\n\t\ttry {\n\t\t\tself::CopyFileParts($file, $data_filename, $offset, $end - $offset);\n\t\t\t$result = $hash_function($data_filename);\n\t\t} catch (Exception $e) {\n\t\t\tthrow new Exception('self::CopyFileParts() failed in getid_lib::hash_data(): '.$e->getMessage());\n\t\t}\n\t\tunlink($data_filename);\n\t\treturn $result;\n\t}\n\n\tpublic static function CopyFileParts($filename_source, $filename_dest, $offset, $length) {\n\t\tif (!self::intValueSupported($offset + $length)) {\n\t\t\tthrow new Exception('cannot copy file portion, it extends beyond the '.round(PHP_INT_MAX / 1073741824).'GB limit');\n\t\t}\n\t\tif (is_readable($filename_source) && is_file($filename_source) && ($fp_src = fopen($filename_source, 'rb'))) {\n\t\t\tif (($fp_dest = fopen($filename_dest, 'wb'))) {\n\t\t\t\tif (fseek($fp_src, $offset) == 0) {\n\t\t\t\t\t$byteslefttowrite = $length;\n\t\t\t\t\twhile (($byteslefttowrite > 0) && ($buffer = fread($fp_src, min($byteslefttowrite, getID3::FREAD_BUFFER_SIZE)))) {\n\t\t\t\t\t\t$byteswritten = fwrite($fp_dest, $buffer, $byteslefttowrite);\n\t\t\t\t\t\t$byteslefttowrite -= $byteswritten;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Exception('failed to seek to offset '.$offset.' in '.$filename_source);\n\t\t\t\t}\n\t\t\t\tfclose($fp_dest);\n\t\t\t} else {\n\t\t\t\tthrow new Exception('failed to create file for writing '.$filename_dest);\n\t\t\t}\n\t\t\tfclose($fp_src);\n\t\t} else {\n\t\t\tthrow new Exception('failed to open file for reading '.$filename_source);\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static function iconv_fallback_int_utf8($charval) {\n\t\tif ($charval < 128) {\n\t\t\t// 0bbbbbbb\n\t\t\t$newcharstring = chr($charval);\n\t\t} elseif ($charval < 2048) {\n\t\t\t// 110bbbbb 10bbbbbb\n\t\t\t$newcharstring  = chr(($charval >>   6) | 0xC0);\n\t\t\t$newcharstring .= chr(($charval & 0x3F) | 0x80);\n\t\t} elseif ($charval < 65536) {\n\t\t\t// 1110bbbb 10bbbbbb 10bbbbbb\n\t\t\t$newcharstring  = chr(($charval >>  12) | 0xE0);\n\t\t\t$newcharstring .= chr(($charval >>   6) | 0xC0);\n\t\t\t$newcharstring .= chr(($charval & 0x3F) | 0x80);\n\t\t} else {\n\t\t\t// 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb\n\t\t\t$newcharstring  = chr(($charval >>  18) | 0xF0);\n\t\t\t$newcharstring .= chr(($charval >>  12) | 0xC0);\n\t\t\t$newcharstring .= chr(($charval >>   6) | 0xC0);\n\t\t\t$newcharstring .= chr(($charval & 0x3F) | 0x80);\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// ISO-8859-1 => UTF-8\n\tpublic static function iconv_fallback_iso88591_utf8($string, $bom=false) {\n\t\tif (function_exists('utf8_encode')) {\n\t\t\treturn utf8_encode($string);\n\t\t}\n\t\t// utf8_encode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support)\n\t\t$newcharstring = '';\n\t\tif ($bom) {\n\t\t\t$newcharstring .= \"\\xEF\\xBB\\xBF\";\n\t\t}\n\t\tfor ($i = 0; $i < strlen($string); $i++) {\n\t\t\t$charval = ord($string{$i});\n\t\t\t$newcharstring .= self::iconv_fallback_int_utf8($charval);\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// ISO-8859-1 => UTF-16BE\n\tpublic static function iconv_fallback_iso88591_utf16be($string, $bom=false) {\n\t\t$newcharstring = '';\n\t\tif ($bom) {\n\t\t\t$newcharstring .= \"\\xFE\\xFF\";\n\t\t}\n\t\tfor ($i = 0; $i < strlen($string); $i++) {\n\t\t\t$newcharstring .= \"\\x00\".$string{$i};\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// ISO-8859-1 => UTF-16LE\n\tpublic static function iconv_fallback_iso88591_utf16le($string, $bom=false) {\n\t\t$newcharstring = '';\n\t\tif ($bom) {\n\t\t\t$newcharstring .= \"\\xFF\\xFE\";\n\t\t}\n\t\tfor ($i = 0; $i < strlen($string); $i++) {\n\t\t\t$newcharstring .= $string{$i}.\"\\x00\";\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// ISO-8859-1 => UTF-16LE (BOM)\n\tpublic static function iconv_fallback_iso88591_utf16($string) {\n\t\treturn self::iconv_fallback_iso88591_utf16le($string, true);\n\t}\n\n\t// UTF-8 => ISO-8859-1\n\tpublic static function iconv_fallback_utf8_iso88591($string) {\n\t\tif (function_exists('utf8_decode')) {\n\t\t\treturn utf8_decode($string);\n\t\t}\n\t\t// utf8_decode() unavailable, use getID3()'s iconv_fallback() conversions (possibly PHP is compiled without XML support)\n\t\t$newcharstring = '';\n\t\t$offset = 0;\n\t\t$stringlength = strlen($string);\n\t\twhile ($offset < $stringlength) {\n\t\t\tif ((ord($string{$offset}) | 0x07) == 0xF7) {\n\t\t\t\t// 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &\n\t\t\t\t\t\t   ((ord($string{($offset + 1)}) & 0x3F) << 12) &\n\t\t\t\t\t\t   ((ord($string{($offset + 2)}) & 0x3F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 3)}) & 0x3F);\n\t\t\t\t$offset += 4;\n\t\t\t} elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {\n\t\t\t\t// 1110bbbb 10bbbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &\n\t\t\t\t\t\t   ((ord($string{($offset + 1)}) & 0x3F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 2)}) & 0x3F);\n\t\t\t\t$offset += 3;\n\t\t\t} elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {\n\t\t\t\t// 110bbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x1F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 1)}) & 0x3F);\n\t\t\t\t$offset += 2;\n\t\t\t} elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {\n\t\t\t\t// 0bbbbbbb\n\t\t\t\t$charval = ord($string{$offset});\n\t\t\t\t$offset += 1;\n\t\t\t} else {\n\t\t\t\t// error? throw some kind of warning here?\n\t\t\t\t$charval = false;\n\t\t\t\t$offset += 1;\n\t\t\t}\n\t\t\tif ($charval !== false) {\n\t\t\t\t$newcharstring .= (($charval < 256) ? chr($charval) : '?');\n\t\t\t}\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// UTF-8 => UTF-16BE\n\tpublic static function iconv_fallback_utf8_utf16be($string, $bom=false) {\n\t\t$newcharstring = '';\n\t\tif ($bom) {\n\t\t\t$newcharstring .= \"\\xFE\\xFF\";\n\t\t}\n\t\t$offset = 0;\n\t\t$stringlength = strlen($string);\n\t\twhile ($offset < $stringlength) {\n\t\t\tif ((ord($string{$offset}) | 0x07) == 0xF7) {\n\t\t\t\t// 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &\n\t\t\t\t\t\t   ((ord($string{($offset + 1)}) & 0x3F) << 12) &\n\t\t\t\t\t\t   ((ord($string{($offset + 2)}) & 0x3F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 3)}) & 0x3F);\n\t\t\t\t$offset += 4;\n\t\t\t} elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {\n\t\t\t\t// 1110bbbb 10bbbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &\n\t\t\t\t\t\t   ((ord($string{($offset + 1)}) & 0x3F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 2)}) & 0x3F);\n\t\t\t\t$offset += 3;\n\t\t\t} elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {\n\t\t\t\t// 110bbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x1F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 1)}) & 0x3F);\n\t\t\t\t$offset += 2;\n\t\t\t} elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {\n\t\t\t\t// 0bbbbbbb\n\t\t\t\t$charval = ord($string{$offset});\n\t\t\t\t$offset += 1;\n\t\t\t} else {\n\t\t\t\t// error? throw some kind of warning here?\n\t\t\t\t$charval = false;\n\t\t\t\t$offset += 1;\n\t\t\t}\n\t\t\tif ($charval !== false) {\n\t\t\t\t$newcharstring .= (($charval < 65536) ? self::BigEndian2String($charval, 2) : \"\\x00\".'?');\n\t\t\t}\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// UTF-8 => UTF-16LE\n\tpublic static function iconv_fallback_utf8_utf16le($string, $bom=false) {\n\t\t$newcharstring = '';\n\t\tif ($bom) {\n\t\t\t$newcharstring .= \"\\xFF\\xFE\";\n\t\t}\n\t\t$offset = 0;\n\t\t$stringlength = strlen($string);\n\t\twhile ($offset < $stringlength) {\n\t\t\tif ((ord($string{$offset}) | 0x07) == 0xF7) {\n\t\t\t\t// 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &\n\t\t\t\t\t\t   ((ord($string{($offset + 1)}) & 0x3F) << 12) &\n\t\t\t\t\t\t   ((ord($string{($offset + 2)}) & 0x3F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 3)}) & 0x3F);\n\t\t\t\t$offset += 4;\n\t\t\t} elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {\n\t\t\t\t// 1110bbbb 10bbbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &\n\t\t\t\t\t\t   ((ord($string{($offset + 1)}) & 0x3F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 2)}) & 0x3F);\n\t\t\t\t$offset += 3;\n\t\t\t} elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {\n\t\t\t\t// 110bbbbb 10bbbbbb\n\t\t\t\t$charval = ((ord($string{($offset + 0)}) & 0x1F) <<  6) &\n\t\t\t\t\t\t\t(ord($string{($offset + 1)}) & 0x3F);\n\t\t\t\t$offset += 2;\n\t\t\t} elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {\n\t\t\t\t// 0bbbbbbb\n\t\t\t\t$charval = ord($string{$offset});\n\t\t\t\t$offset += 1;\n\t\t\t} else {\n\t\t\t\t// error? maybe throw some warning here?\n\t\t\t\t$charval = false;\n\t\t\t\t$offset += 1;\n\t\t\t}\n\t\t\tif ($charval !== false) {\n\t\t\t\t$newcharstring .= (($charval < 65536) ? self::LittleEndian2String($charval, 2) : '?'.\"\\x00\");\n\t\t\t}\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// UTF-8 => UTF-16LE (BOM)\n\tpublic static function iconv_fallback_utf8_utf16($string) {\n\t\treturn self::iconv_fallback_utf8_utf16le($string, true);\n\t}\n\n\t// UTF-16BE => UTF-8\n\tpublic static function iconv_fallback_utf16be_utf8($string) {\n\t\tif (substr($string, 0, 2) == \"\\xFE\\xFF\") {\n\t\t\t// strip BOM\n\t\t\t$string = substr($string, 2);\n\t\t}\n\t\t$newcharstring = '';\n\t\tfor ($i = 0; $i < strlen($string); $i += 2) {\n\t\t\t$charval = self::BigEndian2Int(substr($string, $i, 2));\n\t\t\t$newcharstring .= self::iconv_fallback_int_utf8($charval);\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// UTF-16LE => UTF-8\n\tpublic static function iconv_fallback_utf16le_utf8($string) {\n\t\tif (substr($string, 0, 2) == \"\\xFF\\xFE\") {\n\t\t\t// strip BOM\n\t\t\t$string = substr($string, 2);\n\t\t}\n\t\t$newcharstring = '';\n\t\tfor ($i = 0; $i < strlen($string); $i += 2) {\n\t\t\t$charval = self::LittleEndian2Int(substr($string, $i, 2));\n\t\t\t$newcharstring .= self::iconv_fallback_int_utf8($charval);\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// UTF-16BE => ISO-8859-1\n\tpublic static function iconv_fallback_utf16be_iso88591($string) {\n\t\tif (substr($string, 0, 2) == \"\\xFE\\xFF\") {\n\t\t\t// strip BOM\n\t\t\t$string = substr($string, 2);\n\t\t}\n\t\t$newcharstring = '';\n\t\tfor ($i = 0; $i < strlen($string); $i += 2) {\n\t\t\t$charval = self::BigEndian2Int(substr($string, $i, 2));\n\t\t\t$newcharstring .= (($charval < 256) ? chr($charval) : '?');\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// UTF-16LE => ISO-8859-1\n\tpublic static function iconv_fallback_utf16le_iso88591($string) {\n\t\tif (substr($string, 0, 2) == \"\\xFF\\xFE\") {\n\t\t\t// strip BOM\n\t\t\t$string = substr($string, 2);\n\t\t}\n\t\t$newcharstring = '';\n\t\tfor ($i = 0; $i < strlen($string); $i += 2) {\n\t\t\t$charval = self::LittleEndian2Int(substr($string, $i, 2));\n\t\t\t$newcharstring .= (($charval < 256) ? chr($charval) : '?');\n\t\t}\n\t\treturn $newcharstring;\n\t}\n\n\t// UTF-16 (BOM) => ISO-8859-1\n\tpublic static function iconv_fallback_utf16_iso88591($string) {\n\t\t$bom = substr($string, 0, 2);\n\t\tif ($bom == \"\\xFE\\xFF\") {\n\t\t\treturn self::iconv_fallback_utf16be_iso88591(substr($string, 2));\n\t\t} elseif ($bom == \"\\xFF\\xFE\") {\n\t\t\treturn self::iconv_fallback_utf16le_iso88591(substr($string, 2));\n\t\t}\n\t\treturn $string;\n\t}\n\n\t// UTF-16 (BOM) => UTF-8\n\tpublic static function iconv_fallback_utf16_utf8($string) {\n\t\t$bom = substr($string, 0, 2);\n\t\tif ($bom == \"\\xFE\\xFF\") {\n\t\t\treturn self::iconv_fallback_utf16be_utf8(substr($string, 2));\n\t\t} elseif ($bom == \"\\xFF\\xFE\") {\n\t\t\treturn self::iconv_fallback_utf16le_utf8(substr($string, 2));\n\t\t}\n\t\treturn $string;\n\t}\n\n\tpublic static function iconv_fallback($in_charset, $out_charset, $string) {\n\n\t\tif ($in_charset == $out_charset) {\n\t\t\treturn $string;\n\t\t}\n\n\t\t// iconv() availble\n\t\tif (function_exists('iconv')) {\n\t\t\tif ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) {\n\t\t\t\tswitch ($out_charset) {\n\t\t\t\t\tcase 'ISO-8859-1':\n\t\t\t\t\t\t$converted_string = rtrim($converted_string, \"\\x00\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treturn $converted_string;\n\t\t\t}\n\n\t\t\t// iconv() may sometimes fail with \"illegal character in input string\" error message\n\t\t\t// and return an empty string, but returning the unconverted string is more useful\n\t\t\treturn $string;\n\t\t}\n\n\n\t\t// iconv() not available\n\t\tstatic $ConversionFunctionList = array();\n\t\tif (empty($ConversionFunctionList)) {\n\t\t\t$ConversionFunctionList['ISO-8859-1']['UTF-8']    = 'iconv_fallback_iso88591_utf8';\n\t\t\t$ConversionFunctionList['ISO-8859-1']['UTF-16']   = 'iconv_fallback_iso88591_utf16';\n\t\t\t$ConversionFunctionList['ISO-8859-1']['UTF-16BE'] = 'iconv_fallback_iso88591_utf16be';\n\t\t\t$ConversionFunctionList['ISO-8859-1']['UTF-16LE'] = 'iconv_fallback_iso88591_utf16le';\n\t\t\t$ConversionFunctionList['UTF-8']['ISO-8859-1']    = 'iconv_fallback_utf8_iso88591';\n\t\t\t$ConversionFunctionList['UTF-8']['UTF-16']        = 'iconv_fallback_utf8_utf16';\n\t\t\t$ConversionFunctionList['UTF-8']['UTF-16BE']      = 'iconv_fallback_utf8_utf16be';\n\t\t\t$ConversionFunctionList['UTF-8']['UTF-16LE']      = 'iconv_fallback_utf8_utf16le';\n\t\t\t$ConversionFunctionList['UTF-16']['ISO-8859-1']   = 'iconv_fallback_utf16_iso88591';\n\t\t\t$ConversionFunctionList['UTF-16']['UTF-8']        = 'iconv_fallback_utf16_utf8';\n\t\t\t$ConversionFunctionList['UTF-16LE']['ISO-8859-1'] = 'iconv_fallback_utf16le_iso88591';\n\t\t\t$ConversionFunctionList['UTF-16LE']['UTF-8']      = 'iconv_fallback_utf16le_utf8';\n\t\t\t$ConversionFunctionList['UTF-16BE']['ISO-8859-1'] = 'iconv_fallback_utf16be_iso88591';\n\t\t\t$ConversionFunctionList['UTF-16BE']['UTF-8']      = 'iconv_fallback_utf16be_utf8';\n\t\t}\n\t\tif (isset($ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)])) {\n\t\t\t$ConversionFunction = $ConversionFunctionList[strtoupper($in_charset)][strtoupper($out_charset)];\n\t\t\treturn self::$ConversionFunction($string);\n\t\t}\n\t\tthrow new Exception('PHP does not have iconv() support - cannot convert from '.$in_charset.' to '.$out_charset);\n\t}\n\n\tpublic static function recursiveMultiByteCharString2HTML($data, $charset='ISO-8859-1') {\n\t\tif (is_string($data)) {\n\t\t\treturn self::MultiByteCharString2HTML($data, $charset);\n\t\t} elseif (is_array($data)) {\n\t\t\t$return_data = array();\n\t\t\tforeach ($data as $key => $value) {\n\t\t\t\t$return_data[$key] = self::recursiveMultiByteCharString2HTML($value, $charset);\n\t\t\t}\n\t\t\treturn $return_data;\n\t\t}\n\t\t// integer, float, objects, resources, etc\n\t\treturn $data;\n\t}\n\n\tpublic static function MultiByteCharString2HTML($string, $charset='ISO-8859-1') {\n\t\t$string = (string) $string; // in case trying to pass a numeric (float, int) string, would otherwise return an empty string\n\t\t$HTMLstring = '';\n\n\t\tswitch ($charset) {\n\t\t\tcase '1251':\n\t\t\tcase '1252':\n\t\t\tcase '866':\n\t\t\tcase '932':\n\t\t\tcase '936':\n\t\t\tcase '950':\n\t\t\tcase 'BIG5':\n\t\t\tcase 'BIG5-HKSCS':\n\t\t\tcase 'cp1251':\n\t\t\tcase 'cp1252':\n\t\t\tcase 'cp866':\n\t\t\tcase 'EUC-JP':\n\t\t\tcase 'EUCJP':\n\t\t\tcase 'GB2312':\n\t\t\tcase 'ibm866':\n\t\t\tcase 'ISO-8859-1':\n\t\t\tcase 'ISO-8859-15':\n\t\t\tcase 'ISO8859-1':\n\t\t\tcase 'ISO8859-15':\n\t\t\tcase 'KOI8-R':\n\t\t\tcase 'koi8-ru':\n\t\t\tcase 'koi8r':\n\t\t\tcase 'Shift_JIS':\n\t\t\tcase 'SJIS':\n\t\t\tcase 'win-1251':\n\t\t\tcase 'Windows-1251':\n\t\t\tcase 'Windows-1252':\n\t\t\t\t$HTMLstring = htmlentities($string, ENT_COMPAT, $charset);\n\t\t\t\tbreak;\n\n\t\t\tcase 'UTF-8':\n\t\t\t\t$strlen = strlen($string);\n\t\t\t\tfor ($i = 0; $i < $strlen; $i++) {\n\t\t\t\t\t$char_ord_val = ord($string{$i});\n\t\t\t\t\t$charval = 0;\n\t\t\t\t\tif ($char_ord_val < 0x80) {\n\t\t\t\t\t\t$charval = $char_ord_val;\n\t\t\t\t\t} elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F  &&  $i+3 < $strlen) {\n\t\t\t\t\t\t$charval  = (($char_ord_val & 0x07) << 18);\n\t\t\t\t\t\t$charval += ((ord($string{++$i}) & 0x3F) << 12);\n\t\t\t\t\t\t$charval += ((ord($string{++$i}) & 0x3F) << 6);\n\t\t\t\t\t\t$charval +=  (ord($string{++$i}) & 0x3F);\n\t\t\t\t\t} elseif ((($char_ord_val & 0xE0) >> 5) == 0x07  &&  $i+2 < $strlen) {\n\t\t\t\t\t\t$charval  = (($char_ord_val & 0x0F) << 12);\n\t\t\t\t\t\t$charval += ((ord($string{++$i}) & 0x3F) << 6);\n\t\t\t\t\t\t$charval +=  (ord($string{++$i}) & 0x3F);\n\t\t\t\t\t} elseif ((($char_ord_val & 0xC0) >> 6) == 0x03  &&  $i+1 < $strlen) {\n\t\t\t\t\t\t$charval  = (($char_ord_val & 0x1F) << 6);\n\t\t\t\t\t\t$charval += (ord($string{++$i}) & 0x3F);\n\t\t\t\t\t}\n\t\t\t\t\tif (($charval >= 32) && ($charval <= 127)) {\n\t\t\t\t\t\t$HTMLstring .= htmlentities(chr($charval));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$HTMLstring .= '&#'.$charval.';';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'UTF-16LE':\n\t\t\t\tfor ($i = 0; $i < strlen($string); $i += 2) {\n\t\t\t\t\t$charval = self::LittleEndian2Int(substr($string, $i, 2));\n\t\t\t\t\tif (($charval >= 32) && ($charval <= 127)) {\n\t\t\t\t\t\t$HTMLstring .= chr($charval);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$HTMLstring .= '&#'.$charval.';';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'UTF-16BE':\n\t\t\t\tfor ($i = 0; $i < strlen($string); $i += 2) {\n\t\t\t\t\t$charval = self::BigEndian2Int(substr($string, $i, 2));\n\t\t\t\t\tif (($charval >= 32) && ($charval <= 127)) {\n\t\t\t\t\t\t$HTMLstring .= chr($charval);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$HTMLstring .= '&#'.$charval.';';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$HTMLstring = 'ERROR: Character set \"'.$charset.'\" not supported in MultiByteCharString2HTML()';\n\t\t\t\tbreak;\n\t\t}\n\t\treturn $HTMLstring;\n\t}\n\n\n\n\tpublic static function RGADnameLookup($namecode) {\n\t\tstatic $RGADname = array();\n\t\tif (empty($RGADname)) {\n\t\t\t$RGADname[0] = 'not set';\n\t\t\t$RGADname[1] = 'Track Gain Adjustment';\n\t\t\t$RGADname[2] = 'Album Gain Adjustment';\n\t\t}\n\n\t\treturn (isset($RGADname[$namecode]) ? $RGADname[$namecode] : '');\n\t}\n\n\n\tpublic static function RGADoriginatorLookup($originatorcode) {\n\t\tstatic $RGADoriginator = array();\n\t\tif (empty($RGADoriginator)) {\n\t\t\t$RGADoriginator[0] = 'unspecified';\n\t\t\t$RGADoriginator[1] = 'pre-set by artist/producer/mastering engineer';\n\t\t\t$RGADoriginator[2] = 'set by user';\n\t\t\t$RGADoriginator[3] = 'determined automatically';\n\t\t}\n\n\t\treturn (isset($RGADoriginator[$originatorcode]) ? $RGADoriginator[$originatorcode] : '');\n\t}\n\n\n\tpublic static function RGADadjustmentLookup($rawadjustment, $signbit) {\n\t\t$adjustment = $rawadjustment / 10;\n\t\tif ($signbit == 1) {\n\t\t\t$adjustment *= -1;\n\t\t}\n\t\treturn (float) $adjustment;\n\t}\n\n\n\tpublic static function RGADgainString($namecode, $originatorcode, $replaygain) {\n\t\tif ($replaygain < 0) {\n\t\t\t$signbit = '1';\n\t\t} else {\n\t\t\t$signbit = '0';\n\t\t}\n\t\t$storedreplaygain = intval(round($replaygain * 10));\n\t\t$gainstring  = str_pad(decbin($namecode), 3, '0', STR_PAD_LEFT);\n\t\t$gainstring .= str_pad(decbin($originatorcode), 3, '0', STR_PAD_LEFT);\n\t\t$gainstring .= $signbit;\n\t\t$gainstring .= str_pad(decbin($storedreplaygain), 9, '0', STR_PAD_LEFT);\n\n\t\treturn $gainstring;\n\t}\n\n\tpublic static function RGADamplitude2dB($amplitude) {\n\t\treturn 20 * log10($amplitude);\n\t}\n\n\n\tpublic static function GetDataImageSize($imgData, &$imageinfo=array()) {\n\t\tstatic $tempdir = '';\n\t\tif (empty($tempdir)) {\n\t\t\t// yes this is ugly, feel free to suggest a better way\n\t\t\trequire_once(dirname(__FILE__).'/getid3.php');\n\t\t\t$getid3_temp = new getID3();\n\t\t\t$tempdir = $getid3_temp->tempdir;\n\t\t\tunset($getid3_temp);\n\t\t}\n\t\t$GetDataImageSize = false;\n\t\tif ($tempfilename = tempnam($tempdir, 'gI3')) {\n\t\t\tif (is_writable($tempfilename) && is_file($tempfilename) && ($tmp = fopen($tempfilename, 'wb'))) {\n\t\t\t\tfwrite($tmp, $imgData);\n\t\t\t\tfclose($tmp);\n\t\t\t\t$GetDataImageSize = @getimagesize($tempfilename, $imageinfo);\n\t\t\t\t$GetDataImageSize['height'] = $GetDataImageSize[0];\n\t\t\t\t$GetDataImageSize['width']  = $GetDataImageSize[1];\n\t\t\t}\n\t\t\tunlink($tempfilename);\n\t\t}\n\t\treturn $GetDataImageSize;\n\t}\n\n\tpublic static function ImageExtFromMime($mime_type) {\n\t\t// temporary way, works OK for now, but should be reworked in the future\n\t\treturn str_replace(array('image/', 'x-', 'jpeg'), array('', '', 'jpg'), $mime_type);\n\t}\n\n\tpublic static function ImageTypesLookup($imagetypeid) {\n\t\tstatic $ImageTypesLookup = array();\n\t\tif (empty($ImageTypesLookup)) {\n\t\t\t$ImageTypesLookup[1]  = 'gif';\n\t\t\t$ImageTypesLookup[2]  = 'jpeg';\n\t\t\t$ImageTypesLookup[3]  = 'png';\n\t\t\t$ImageTypesLookup[4]  = 'swf';\n\t\t\t$ImageTypesLookup[5]  = 'psd';\n\t\t\t$ImageTypesLookup[6]  = 'bmp';\n\t\t\t$ImageTypesLookup[7]  = 'tiff (little-endian)';\n\t\t\t$ImageTypesLookup[8]  = 'tiff (big-endian)';\n\t\t\t$ImageTypesLookup[9]  = 'jpc';\n\t\t\t$ImageTypesLookup[10] = 'jp2';\n\t\t\t$ImageTypesLookup[11] = 'jpx';\n\t\t\t$ImageTypesLookup[12] = 'jb2';\n\t\t\t$ImageTypesLookup[13] = 'swc';\n\t\t\t$ImageTypesLookup[14] = 'iff';\n\t\t}\n\t\treturn (isset($ImageTypesLookup[$imagetypeid]) ? $ImageTypesLookup[$imagetypeid] : '');\n\t}\n\n\tpublic static function CopyTagsToComments(&$ThisFileInfo) {\n\n\t\t// Copy all entries from ['tags'] into common ['comments']\n\t\tif (!empty($ThisFileInfo['tags'])) {\n\t\t\tforeach ($ThisFileInfo['tags'] as $tagtype => $tagarray) {\n\t\t\t\tforeach ($tagarray as $tagname => $tagdata) {\n\t\t\t\t\tforeach ($tagdata as $key => $value) {\n\t\t\t\t\t\tif (!empty($value)) {\n\t\t\t\t\t\t\tif (empty($ThisFileInfo['comments'][$tagname])) {\n\n\t\t\t\t\t\t\t\t// fall through and append value\n\n\t\t\t\t\t\t\t} elseif ($tagtype == 'id3v1') {\n\n\t\t\t\t\t\t\t\t$newvaluelength = strlen(trim($value));\n\t\t\t\t\t\t\t\tforeach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) {\n\t\t\t\t\t\t\t\t\t$oldvaluelength = strlen(trim($existingvalue));\n\t\t\t\t\t\t\t\t\tif (($newvaluelength <= $oldvaluelength) && (substr($existingvalue, 0, $newvaluelength) == trim($value))) {\n\t\t\t\t\t\t\t\t\t\t// new value is identical but shorter-than (or equal-length to) one already in comments - skip\n\t\t\t\t\t\t\t\t\t\tbreak 2;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} elseif (!is_array($value)) {\n\n\t\t\t\t\t\t\t\t$newvaluelength = strlen(trim($value));\n\t\t\t\t\t\t\t\tforeach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) {\n\t\t\t\t\t\t\t\t\t$oldvaluelength = strlen(trim($existingvalue));\n\t\t\t\t\t\t\t\t\tif ((strlen($existingvalue) > 10) && ($newvaluelength > $oldvaluelength) && (substr(trim($value), 0, strlen($existingvalue)) == $existingvalue)) {\n\t\t\t\t\t\t\t\t\t\t$ThisFileInfo['comments'][$tagname][$existingkey] = trim($value);\n\t\t\t\t\t\t\t\t\t\t//break 2;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($value) || empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) {\n\t\t\t\t\t\t\t\t$value = (is_string($value) ? trim($value) : $value);\n\t\t\t\t\t\t\t\tif (!is_numeric($key)) {\n\t\t\t\t\t\t\t\t\t$ThisFileInfo['comments'][$tagname][$key] = $value;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$ThisFileInfo['comments'][$tagname][]     = $value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Copy to ['comments_html']\n\t\t\tif (!empty($ThisFileInfo['comments'])) {\n\t\t\t\tforeach ($ThisFileInfo['comments'] as $field => $values) {\n\t\t\t\t\tif ($field == 'picture') {\n\t\t\t\t\t\t// pictures can take up a lot of space, and we don't need multiple copies of them\n\t\t\t\t\t\t// let there be a single copy in [comments][picture], and not elsewhere\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tforeach ($values as $index => $value) {\n\t\t\t\t\t\tif (is_array($value)) {\n\t\t\t\t\t\t\t$ThisFileInfo['comments_html'][$field][$index] = $value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$ThisFileInfo['comments_html'][$field][$index] = str_replace('&#0;', '', self::MultiByteCharString2HTML($value, $ThisFileInfo['encoding']));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn true;\n\t}\n\n\n\tpublic static function EmbeddedLookup($key, $begin, $end, $file, $name) {\n\n\t\t// Cached\n\t\tstatic $cache;\n\t\tif (isset($cache[$file][$name])) {\n\t\t\treturn (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : '');\n\t\t}\n\n\t\t// Init\n\t\t$keylength  = strlen($key);\n\t\t$line_count = $end - $begin - 7;\n\n\t\t// Open php file\n\t\t$fp = fopen($file, 'r');\n\n\t\t// Discard $begin lines\n\t\tfor ($i = 0; $i < ($begin + 3); $i++) {\n\t\t\tfgets($fp, 1024);\n\t\t}\n\n\t\t// Loop thru line\n\t\twhile (0 < $line_count--) {\n\n\t\t\t// Read line\n\t\t\t$line = ltrim(fgets($fp, 1024), \"\\t \");\n\n\t\t\t// METHOD A: only cache the matching key - less memory but slower on next lookup of not-previously-looked-up key\n\t\t\t//$keycheck = substr($line, 0, $keylength);\n\t\t\t//if ($key == $keycheck)  {\n\t\t\t//\t$cache[$file][$name][$keycheck] = substr($line, $keylength + 1);\n\t\t\t//\tbreak;\n\t\t\t//}\n\n\t\t\t// METHOD B: cache all keys in this lookup - more memory but faster on next lookup of not-previously-looked-up key\n\t\t\t//$cache[$file][$name][substr($line, 0, $keylength)] = trim(substr($line, $keylength + 1));\n\t\t\t$explodedLine = explode(\"\\t\", $line, 2);\n\t\t\t$ThisKey   = (isset($explodedLine[0]) ? $explodedLine[0] : '');\n\t\t\t$ThisValue = (isset($explodedLine[1]) ? $explodedLine[1] : '');\n\t\t\t$cache[$file][$name][$ThisKey] = trim($ThisValue);\n\t\t}\n\n\t\t// Close and return\n\t\tfclose($fp);\n\t\treturn (isset($cache[$file][$name][$key]) ? $cache[$file][$name][$key] : '');\n\t}\n\n\tpublic static function IncludeDependency($filename, $sourcefile, $DieOnFailure=false) {\n\t\tglobal $GETID3_ERRORARRAY;\n\n\t\tif (file_exists($filename)) {\n\t\t\tif (include_once($filename)) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\t$diemessage = basename($sourcefile).' depends on '.$filename.', which has errors';\n\t\t\t}\n\t\t} else {\n\t\t\t$diemessage = basename($sourcefile).' depends on '.$filename.', which is missing';\n\t\t}\n\t\tif ($DieOnFailure) {\n\t\t\tthrow new Exception($diemessage);\n\t\t} else {\n\t\t\t$GETID3_ERRORARRAY[] = $diemessage;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static function trimNullByte($string) {\n\t\treturn trim($string, \"\\x00\");\n\t}\n\n\tpublic static function getFileSizeSyscall($path) {\n\t\t$filesize = false;\n\n\t\tif (GETID3_OS_ISWINDOWS) {\n\t\t\tif (class_exists('COM')) { // From PHP 5.3.15 and 5.4.5, COM and DOTNET is no longer built into the php core.you have to add COM support in php.ini:\n\t\t\t\t$filesystem = new COM('Scripting.FileSystemObject');\n\t\t\t\t$file = $filesystem->GetFile($path);\n\t\t\t\t$filesize = $file->Size();\n\t\t\t\tunset($filesystem, $file);\n\t\t\t} else {\n\t\t\t\t$commandline = 'for %I in ('.escapeshellarg($path).') do @echo %~zI';\n\t\t\t}\n\t\t} else {\n\t\t\t$commandline = 'ls -l '.escapeshellarg($path).' | awk \\'{print $5}\\'';\n\t\t}\n\t\tif (isset($commandline)) {\n\t\t\t$output = trim(`$commandline`);\n\t\t\tif (ctype_digit($output)) {\n\t\t\t\t$filesize = (float) $output;\n\t\t\t}\n\t\t}\n\t\treturn $filesize;\n\t}\n\n\n\t/**\n\t* Workaround for Bug #37268 (https://bugs.php.net/bug.php?id=37268)\n\t* @param string $path A path.\n\t* @param string $suffix If the name component ends in suffix this will also be cut off.\n\t* @return string\n\t*/\n\tpublic static function mb_basename($path, $suffix = null) {\n\t\t$splited = preg_split('#/#', rtrim($path, '/ '));\n\t\treturn substr(basename('X'.$splited[count($splited) - 1], $suffix), 1);\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/getid3.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// Please see readme.txt for more information                  //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n// define a constant rather than looking up every time it is needed\nif (!defined('GETID3_OS_ISWINDOWS')) {\n\tdefine('GETID3_OS_ISWINDOWS', (stripos(PHP_OS, 'WIN') === 0));\n}\n// Get base path of getID3() - ONCE\nif (!defined('GETID3_INCLUDEPATH')) {\n\tdefine('GETID3_INCLUDEPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);\n}\n// Workaround Bug #39923 (https://bugs.php.net/bug.php?id=39923)\nif (!defined('IMG_JPG') && defined('IMAGETYPE_JPEG')) {\n\tdefine('IMG_JPG', IMAGETYPE_JPEG);\n}\n\n// attempt to define temp dir as something flexible but reliable\n$temp_dir = ini_get('upload_tmp_dir');\nif ($temp_dir && (!is_dir($temp_dir) || !is_readable($temp_dir))) {\n\t$temp_dir = '';\n}\nif (!$temp_dir && function_exists('sys_get_temp_dir')) { // sys_get_temp_dir added in PHP v5.2.1\n\t// sys_get_temp_dir() may give inaccessible temp dir, e.g. with open_basedir on virtual hosts\n\t$temp_dir = sys_get_temp_dir();\n}\n$temp_dir = @realpath($temp_dir); // see https://github.com/JamesHeinrich/getID3/pull/10\n$open_basedir = ini_get('open_basedir');\nif ($open_basedir) {\n\t// e.g. \"/var/www/vhosts/getid3.org/httpdocs/:/tmp/\"\n\t$temp_dir     = str_replace(array('/', '\\\\'), DIRECTORY_SEPARATOR, $temp_dir);\n\t$open_basedir = str_replace(array('/', '\\\\'), DIRECTORY_SEPARATOR, $open_basedir);\n\tif (substr($temp_dir, -1, 1) != DIRECTORY_SEPARATOR) {\n\t\t$temp_dir .= DIRECTORY_SEPARATOR;\n\t}\n\t$found_valid_tempdir = false;\n\t$open_basedirs = explode(PATH_SEPARATOR, $open_basedir);\n\tforeach ($open_basedirs as $basedir) {\n\t\tif (substr($basedir, -1, 1) != DIRECTORY_SEPARATOR) {\n\t\t\t$basedir .= DIRECTORY_SEPARATOR;\n\t\t}\n\t\tif (preg_match('#^'.preg_quote($basedir).'#', $temp_dir)) {\n\t\t\t$found_valid_tempdir = true;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!$found_valid_tempdir) {\n\t\t$temp_dir = '';\n\t}\n\tunset($open_basedirs, $found_valid_tempdir, $basedir);\n}\nif (!$temp_dir) {\n\t$temp_dir = '*'; // invalid directory name should force tempnam() to use system default temp dir\n}\n// $temp_dir = '/something/else/';  // feel free to override temp dir here if it works better for your system\nif (!defined('GETID3_TEMP_DIR')) {\n\tdefine('GETID3_TEMP_DIR', $temp_dir);\n}\nunset($open_basedir, $temp_dir);\n\n// End: Defines\n\n\nclass getID3\n{\n\t// public: Settings\n\tpublic $encoding        = 'UTF-8';        // CASE SENSITIVE! - i.e. (must be supported by iconv()). Examples:  ISO-8859-1  UTF-8  UTF-16  UTF-16BE\n\tpublic $encoding_id3v1  = 'ISO-8859-1';   // Should always be 'ISO-8859-1', but some tags may be written in other encodings such as 'EUC-CN' or 'CP1252'\n\n\t// public: Optional tag checks - disable for speed.\n\tpublic $option_tag_id3v1         = true;  // Read and process ID3v1 tags\n\tpublic $option_tag_id3v2         = true;  // Read and process ID3v2 tags\n\tpublic $option_tag_lyrics3       = true;  // Read and process Lyrics3 tags\n\tpublic $option_tag_apetag        = true;  // Read and process APE tags\n\tpublic $option_tags_process      = true;  // Copy tags to root key 'tags' and encode to $this->encoding\n\tpublic $option_tags_html         = true;  // Copy tags to root key 'tags_html' properly translated from various encodings to HTML entities\n\n\t// public: Optional tag/comment calucations\n\tpublic $option_extra_info        = true;  // Calculate additional info such as bitrate, channelmode etc\n\n\t// public: Optional handling of embedded attachments (e.g. images)\n\tpublic $option_save_attachments  = true; // defaults to true (ATTACHMENTS_INLINE) for backward compatibility\n\n\t// public: Optional calculations\n\tpublic $option_md5_data          = false; // Get MD5 sum of data part - slow\n\tpublic $option_md5_data_source   = false; // Use MD5 of source file if availble - only FLAC and OptimFROG\n\tpublic $option_sha1_data         = false; // Get SHA1 sum of data part - slow\n\tpublic $option_max_2gb_check     = null;  // Check whether file is larger than 2GB and thus not supported by 32-bit PHP (null: auto-detect based on PHP_INT_MAX)\n\n\t// public: Read buffer size in bytes\n\tpublic $option_fread_buffer_size = 32768;\n\n\t// Public variables\n\tpublic $filename;                         // Filename of file being analysed.\n\tpublic $fp;                               // Filepointer to file being analysed.\n\tpublic $info;                             // Result array.\n\tpublic $tempdir = GETID3_TEMP_DIR;\n\tpublic $memory_limit = 0;\n\n\t// Protected variables\n\tprotected $startup_error   = '';\n\tprotected $startup_warning = '';\n\n\tconst VERSION           = '1.9.9-20141121';\n\tconst FREAD_BUFFER_SIZE = 32768;\n\n\tconst ATTACHMENTS_NONE   = false;\n\tconst ATTACHMENTS_INLINE = true;\n\n\t// public: constructor\n\tpublic function __construct() {\n\n\t\t// Check memory\n\t\t$this->memory_limit = ini_get('memory_limit');\n\t\tif (preg_match('#([0-9]+)M#i', $this->memory_limit, $matches)) {\n\t\t\t// could be stored as \"16M\" rather than 16777216 for example\n\t\t\t$this->memory_limit = $matches[1] * 1048576;\n\t\t} elseif (preg_match('#([0-9]+)G#i', $this->memory_limit, $matches)) { // The 'G' modifier is available since PHP 5.1.0\n\t\t\t// could be stored as \"2G\" rather than 2147483648 for example\n\t\t\t$this->memory_limit = $matches[1] * 1073741824;\n\t\t}\n\t\tif ($this->memory_limit <= 0) {\n\t\t\t// memory limits probably disabled\n\t\t} elseif ($this->memory_limit <= 4194304) {\n\t\t\t$this->startup_error .= 'PHP has less than 4MB available memory and will very likely run out. Increase memory_limit in php.ini';\n\t\t} elseif ($this->memory_limit <= 12582912) {\n\t\t\t$this->startup_warning .= 'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini';\n\t\t}\n\n\t\t// Check safe_mode off\n\t\tif (preg_match('#(1|ON)#i', ini_get('safe_mode'))) {\n\t\t\t$this->warning('WARNING: Safe mode is on, shorten support disabled, md5data/sha1data for ogg vorbis disabled, ogg vorbos/flac tag writing disabled.');\n\t\t}\n\n\t\tif (intval(ini_get('mbstring.func_overload')) > 0) {\n\t\t\t$this->warning('WARNING: php.ini contains \"mbstring.func_overload = '.ini_get('mbstring.func_overload').'\", this may break things.');\n\t\t}\n\n\t\t// Check for magic_quotes_runtime\n\t\tif (function_exists('get_magic_quotes_runtime')) {\n\t\t\tif (get_magic_quotes_runtime()) {\n\t\t\t\treturn $this->startup_error('magic_quotes_runtime must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_runtime(0) and set_magic_quotes_runtime(1).');\n\t\t\t}\n\t\t}\n\n\t\t// Check for magic_quotes_gpc\n\t\tif (function_exists('magic_quotes_gpc')) {\n\t\t\tif (get_magic_quotes_gpc()) {\n\t\t\t\treturn $this->startup_error('magic_quotes_gpc must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_gpc(0) and set_magic_quotes_gpc(1).');\n\t\t\t}\n\t\t}\n\n\t\t// Load support library\n\t\tif (!include_once(GETID3_INCLUDEPATH.'getid3.lib.php')) {\n\t\t\t$this->startup_error .= 'getid3.lib.php is missing or corrupt';\n\t\t}\n\n\t\tif ($this->option_max_2gb_check === null) {\n\t\t\t$this->option_max_2gb_check = (PHP_INT_MAX <= 2147483647);\n\t\t}\n\n\n\t\t// Needed for Windows only:\n\t\t// Define locations of helper applications for Shorten, VorbisComment, MetaFLAC\n\t\t//   as well as other helper functions such as head, tail, md5sum, etc\n\t\t// This path cannot contain spaces, but the below code will attempt to get the\n\t\t//   8.3-equivalent path automatically\n\t\t// IMPORTANT: This path must include the trailing slash\n\t\tif (GETID3_OS_ISWINDOWS && !defined('GETID3_HELPERAPPSDIR')) {\n\n\t\t\t$helperappsdir = GETID3_INCLUDEPATH.'..'.DIRECTORY_SEPARATOR.'helperapps'; // must not have any space in this path\n\n\t\t\tif (!is_dir($helperappsdir)) {\n\t\t\t\t$this->startup_warning .= '\"'.$helperappsdir.'\" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist';\n\t\t\t} elseif (strpos(realpath($helperappsdir), ' ') !== false) {\n\t\t\t\t$DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir));\n\t\t\t\t$path_so_far = array();\n\t\t\t\tforeach ($DirPieces as $key => $value) {\n\t\t\t\t\tif (strpos($value, ' ') !== false) {\n\t\t\t\t\t\tif (!empty($path_so_far)) {\n\t\t\t\t\t\t\t$commandline = 'dir /x '.escapeshellarg(implode(DIRECTORY_SEPARATOR, $path_so_far));\n\t\t\t\t\t\t\t$dir_listing = `$commandline`;\n\t\t\t\t\t\t\t$lines = explode(\"\\n\", $dir_listing);\n\t\t\t\t\t\t\tforeach ($lines as $line) {\n\t\t\t\t\t\t\t\t$line = trim($line);\n\t\t\t\t\t\t\t\tif (preg_match('#^([0-9/]{10}) +([0-9:]{4,5}( [AP]M)?) +(<DIR>|[0-9,]+) +([^ ]{0,11}) +(.+)$#', $line, $matches)) {\n\t\t\t\t\t\t\t\t\tlist($dummy, $date, $time, $ampm, $filesize, $shortname, $filename) = $matches;\n\t\t\t\t\t\t\t\t\tif ((strtoupper($filesize) == '<DIR>') && (strtolower($filename) == strtolower($value))) {\n\t\t\t\t\t\t\t\t\t\t$value = $shortname;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this->startup_warning .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary. You can run \"dir /x\" from the commandline to see the correct 8.3-style names.';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$path_so_far[] = $value;\n\t\t\t\t}\n\t\t\t\t$helperappsdir = implode(DIRECTORY_SEPARATOR, $path_so_far);\n\t\t\t}\n\t\t\tdefine('GETID3_HELPERAPPSDIR', $helperappsdir.DIRECTORY_SEPARATOR);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic function version() {\n\t\treturn self::VERSION;\n\t}\n\n\tpublic function fread_buffer_size() {\n\t\treturn $this->option_fread_buffer_size;\n\t}\n\n\n\t// public: setOption\n\tpublic function setOption($optArray) {\n\t\tif (!is_array($optArray) || empty($optArray)) {\n\t\t\treturn false;\n\t\t}\n\t\tforeach ($optArray as $opt => $val) {\n\t\t\tif (isset($this->$opt) === false) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t$this->$opt = $val;\n\t\t}\n\t\treturn true;\n\t}\n\n\n\tpublic function openfile($filename) {\n\t\ttry {\n\t\t\tif (!empty($this->startup_error)) {\n\t\t\t\tthrow new getid3_exception($this->startup_error);\n\t\t\t}\n\t\t\tif (!empty($this->startup_warning)) {\n\t\t\t\t$this->warning($this->startup_warning);\n\t\t\t}\n\n\t\t\t// init result array and set parameters\n\t\t\t$this->filename = $filename;\n\t\t\t$this->info = array();\n\t\t\t$this->info['GETID3_VERSION']   = $this->version();\n\t\t\t$this->info['php_memory_limit'] = (($this->memory_limit > 0) ? $this->memory_limit : false);\n\n\t\t\t// remote files not supported\n\t\t\tif (preg_match('/^(ht|f)tp:\\/\\//', $filename)) {\n\t\t\t\tthrow new getid3_exception('Remote files are not supported - please copy the file locally first');\n\t\t\t}\n\n\t\t\t$filename = str_replace('/', DIRECTORY_SEPARATOR, $filename);\n\t\t\t$filename = preg_replace('#(.+)'.preg_quote(DIRECTORY_SEPARATOR).'{2,}#U', '\\1'.DIRECTORY_SEPARATOR, $filename);\n\n\t\t\t// open local file\n\t\t\t//if (is_readable($filename) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { // see http://www.getid3.org/phpBB3/viewtopic.php?t=1720\n\t\t\tif ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) {\n\t\t\t\t// great\n\t\t\t} else {\n\t\t\t\t$errormessagelist = array();\n\t\t\t\tif (!is_readable($filename)) {\n\t\t\t\t\t$errormessagelist[] = '!is_readable';\n\t\t\t\t}\n\t\t\t\tif (!is_file($filename)) {\n\t\t\t\t\t$errormessagelist[] = '!is_file';\n\t\t\t\t}\n\t\t\t\tif (!file_exists($filename)) {\n\t\t\t\t\t$errormessagelist[] = '!file_exists';\n\t\t\t\t}\n\t\t\t\tif (empty($errormessagelist)) {\n\t\t\t\t\t$errormessagelist[] = 'fopen failed';\n\t\t\t\t}\n\t\t\t\tthrow new getid3_exception('Could not open \"'.$filename.'\" ('.implode('; ', $errormessagelist).')');\n\t\t\t}\n\n\t\t\t$this->info['filesize'] = filesize($filename);\n\t\t\t// set redundant parameters - might be needed in some include file\n\t\t\t// filenames / filepaths in getID3 are always expressed with forward slashes (unix-style) for both Windows and other to try and minimize confusion\n\t\t\t$filename = str_replace('\\\\', '/', $filename);\n\t\t\t$this->info['filepath']     = str_replace('\\\\', '/', realpath(dirname($filename)));\n\t\t\t$this->info['filename']     = getid3_lib::mb_basename($filename);\n\t\t\t$this->info['filenamepath'] = $this->info['filepath'].'/'.$this->info['filename'];\n\n\n\t\t\t// option_max_2gb_check\n\t\t\tif ($this->option_max_2gb_check) {\n\t\t\t\t// PHP (32-bit all, and 64-bit Windows) doesn't support integers larger than 2^31 (~2GB)\n\t\t\t\t// filesize() simply returns (filesize % (pow(2, 32)), no matter the actual filesize\n\t\t\t\t// ftell() returns 0 if seeking to the end is beyond the range of unsigned integer\n\t\t\t\t$fseek = fseek($this->fp, 0, SEEK_END);\n\t\t\t\tif (($fseek < 0) || (($this->info['filesize'] != 0) && (ftell($this->fp) == 0)) ||\n\t\t\t\t\t($this->info['filesize'] < 0) ||\n\t\t\t\t\t(ftell($this->fp) < 0)) {\n\t\t\t\t\t\t$real_filesize = getid3_lib::getFileSizeSyscall($this->info['filenamepath']);\n\n\t\t\t\t\t\tif ($real_filesize === false) {\n\t\t\t\t\t\t\tunset($this->info['filesize']);\n\t\t\t\t\t\t\tfclose($this->fp);\n\t\t\t\t\t\t\tthrow new getid3_exception('Unable to determine actual filesize. File is most likely larger than '.round(PHP_INT_MAX / 1073741824).'GB and is not supported by PHP.');\n\t\t\t\t\t\t} elseif (getid3_lib::intValueSupported($real_filesize)) {\n\t\t\t\t\t\t\tunset($this->info['filesize']);\n\t\t\t\t\t\t\tfclose($this->fp);\n\t\t\t\t\t\t\tthrow new getid3_exception('PHP seems to think the file is larger than '.round(PHP_INT_MAX / 1073741824).'GB, but filesystem reports it as '.number_format($real_filesize, 3).'GB, please report to info@getid3.org');\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$this->info['filesize'] = $real_filesize;\n\t\t\t\t\t\t$this->warning('File is larger than '.round(PHP_INT_MAX / 1073741824).'GB (filesystem reports it as '.number_format($real_filesize, 3).'GB) and is not properly supported by PHP.');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// set more parameters\n\t\t\t$this->info['avdataoffset']        = 0;\n\t\t\t$this->info['avdataend']           = $this->info['filesize'];\n\t\t\t$this->info['fileformat']          = '';                // filled in later\n\t\t\t$this->info['audio']['dataformat'] = '';                // filled in later, unset if not used\n\t\t\t$this->info['video']['dataformat'] = '';                // filled in later, unset if not used\n\t\t\t$this->info['tags']                = array();           // filled in later, unset if not used\n\t\t\t$this->info['error']               = array();           // filled in later, unset if not used\n\t\t\t$this->info['warning']             = array();           // filled in later, unset if not used\n\t\t\t$this->info['comments']            = array();           // filled in later, unset if not used\n\t\t\t$this->info['encoding']            = $this->encoding;   // required by id3v2 and iso modules - can be unset at the end if desired\n\n\t\t\treturn true;\n\n\t\t} catch (Exception $e) {\n\t\t\t$this->error($e->getMessage());\n\t\t}\n\t\treturn false;\n\t}\n\n\t// public: analyze file\n\tpublic function analyze($filename) {\n\t\ttry {\n\t\t\tif (!$this->openfile($filename)) {\n\t\t\t\treturn $this->info;\n\t\t\t}\n\n\t\t\t// Handle tags\n\t\t\tforeach (array('id3v2'=>'id3v2', 'id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) {\n\t\t\t\t$option_tag = 'option_tag_'.$tag_name;\n\t\t\t\tif ($this->$option_tag) {\n\t\t\t\t\t$this->include_module('tag.'.$tag_name);\n\t\t\t\t\ttry {\n\t\t\t\t\t\t$tag_class = 'getid3_'.$tag_name;\n\t\t\t\t\t\t$tag = new $tag_class($this);\n\t\t\t\t\t\t$tag->Analyze();\n\t\t\t\t\t}\n\t\t\t\t\tcatch (getid3_exception $e) {\n\t\t\t\t\t\tthrow $e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isset($this->info['id3v2']['tag_offset_start'])) {\n\t\t\t\t$this->info['avdataoffset'] = max($this->info['avdataoffset'], $this->info['id3v2']['tag_offset_end']);\n\t\t\t}\n\t\t\tforeach (array('id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) {\n\t\t\t\tif (isset($this->info[$tag_key]['tag_offset_start'])) {\n\t\t\t\t\t$this->info['avdataend'] = min($this->info['avdataend'], $this->info[$tag_key]['tag_offset_start']);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// ID3v2 detection (NOT parsing), even if ($this->option_tag_id3v2 == false) done to make fileformat easier\n\t\t\tif (!$this->option_tag_id3v2) {\n\t\t\t\tfseek($this->fp, 0);\n\t\t\t\t$header = fread($this->fp, 10);\n\t\t\t\tif ((substr($header, 0, 3) == 'ID3') && (strlen($header) == 10)) {\n\t\t\t\t\t$this->info['id3v2']['header']        = true;\n\t\t\t\t\t$this->info['id3v2']['majorversion']  = ord($header{3});\n\t\t\t\t\t$this->info['id3v2']['minorversion']  = ord($header{4});\n\t\t\t\t\t$this->info['avdataoffset']          += getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// read 32 kb file data\n\t\t\tfseek($this->fp, $this->info['avdataoffset']);\n\t\t\t$formattest = fread($this->fp, 32774);\n\n\t\t\t// determine format\n\t\t\t$determined_format = $this->GetFileFormat($formattest, $filename);\n\n\t\t\t// unable to determine file format\n\t\t\tif (!$determined_format) {\n\t\t\t\tfclose($this->fp);\n\t\t\t\treturn $this->error('unable to determine file format');\n\t\t\t}\n\n\t\t\t// check for illegal ID3 tags\n\t\t\tif (isset($determined_format['fail_id3']) && (in_array('id3v1', $this->info['tags']) || in_array('id3v2', $this->info['tags']))) {\n\t\t\t\tif ($determined_format['fail_id3'] === 'ERROR') {\n\t\t\t\t\tfclose($this->fp);\n\t\t\t\t\treturn $this->error('ID3 tags not allowed on this file type.');\n\t\t\t\t} elseif ($determined_format['fail_id3'] === 'WARNING') {\n\t\t\t\t\t$this->warning('ID3 tags not allowed on this file type.');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// check for illegal APE tags\n\t\t\tif (isset($determined_format['fail_ape']) && in_array('ape', $this->info['tags'])) {\n\t\t\t\tif ($determined_format['fail_ape'] === 'ERROR') {\n\t\t\t\t\tfclose($this->fp);\n\t\t\t\t\treturn $this->error('APE tags not allowed on this file type.');\n\t\t\t\t} elseif ($determined_format['fail_ape'] === 'WARNING') {\n\t\t\t\t\t$this->warning('APE tags not allowed on this file type.');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// set mime type\n\t\t\t$this->info['mime_type'] = $determined_format['mime_type'];\n\n\t\t\t// supported format signature pattern detected, but module deleted\n\t\t\tif (!file_exists(GETID3_INCLUDEPATH.$determined_format['include'])) {\n\t\t\t\tfclose($this->fp);\n\t\t\t\treturn $this->error('Format not supported, module \"'.$determined_format['include'].'\" was removed.');\n\t\t\t}\n\n\t\t\t// module requires iconv support\n\t\t\t// Check encoding/iconv support\n\t\t\tif (!empty($determined_format['iconv_req']) && !function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) {\n\t\t\t\t$errormessage = 'iconv() support is required for this module ('.$determined_format['include'].') for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. ';\n\t\t\t\tif (GETID3_OS_ISWINDOWS) {\n\t\t\t\t\t$errormessage .= 'PHP does not have iconv() support. Please enable php_iconv.dll in php.ini, and copy iconv.dll from c:/php/dlls to c:/windows/system32';\n\t\t\t\t} else {\n\t\t\t\t\t$errormessage .= 'PHP is not compiled with iconv() support. Please recompile with the --with-iconv switch';\n\t\t\t\t}\n\t\t\t\treturn $this->error($errormessage);\n\t\t\t}\n\n\t\t\t// include module\n\t\t\tinclude_once(GETID3_INCLUDEPATH.$determined_format['include']);\n\n\t\t\t// instantiate module class\n\t\t\t$class_name = 'getid3_'.$determined_format['module'];\n\t\t\tif (!class_exists($class_name)) {\n\t\t\t\treturn $this->error('Format not supported, module \"'.$determined_format['include'].'\" is corrupt.');\n\t\t\t}\n\t\t\t$class = new $class_name($this);\n\t\t\t$class->Analyze();\n\t\t\tunset($class);\n\n\t\t\t// close file\n\t\t\tfclose($this->fp);\n\n\t\t\t// process all tags - copy to 'tags' and convert charsets\n\t\t\tif ($this->option_tags_process) {\n\t\t\t\t$this->HandleAllTags();\n\t\t\t}\n\n\t\t\t// perform more calculations\n\t\t\tif ($this->option_extra_info) {\n\t\t\t\t$this->ChannelsBitratePlaytimeCalculations();\n\t\t\t\t$this->CalculateCompressionRatioVideo();\n\t\t\t\t$this->CalculateCompressionRatioAudio();\n\t\t\t\t$this->CalculateReplayGain();\n\t\t\t\t$this->ProcessAudioStreams();\n\t\t\t}\n\n\t\t\t// get the MD5 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags\n\t\t\tif ($this->option_md5_data) {\n\t\t\t\t// do not calc md5_data if md5_data_source is present - set by flac only - future MPC/SV8 too\n\t\t\t\tif (!$this->option_md5_data_source || empty($this->info['md5_data_source'])) {\n\t\t\t\t\t$this->getHashdata('md5');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// get the SHA1 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags\n\t\t\tif ($this->option_sha1_data) {\n\t\t\t\t$this->getHashdata('sha1');\n\t\t\t}\n\n\t\t\t// remove undesired keys\n\t\t\t$this->CleanUp();\n\n\t\t} catch (Exception $e) {\n\t\t\t$this->error('Caught exception: '.$e->getMessage());\n\t\t}\n\n\t\t// return info array\n\t\treturn $this->info;\n\t}\n\n\n\t// private: error handling\n\tpublic function error($message) {\n\t\t$this->CleanUp();\n\t\tif (!isset($this->info['error'])) {\n\t\t\t$this->info['error'] = array();\n\t\t}\n\t\t$this->info['error'][] = $message;\n\t\treturn $this->info;\n\t}\n\n\n\t// private: warning handling\n\tpublic function warning($message) {\n\t\t$this->info['warning'][] = $message;\n\t\treturn true;\n\t}\n\n\n\t// private: CleanUp\n\tprivate function CleanUp() {\n\n\t\t// remove possible empty keys\n\t\t$AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams', 'bitrate');\n\t\tforeach ($AVpossibleEmptyKeys as $dummy => $key) {\n\t\t\tif (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) {\n\t\t\t\tunset($this->info['audio'][$key]);\n\t\t\t}\n\t\t\tif (empty($this->info['video'][$key]) && isset($this->info['video'][$key])) {\n\t\t\t\tunset($this->info['video'][$key]);\n\t\t\t}\n\t\t}\n\n\t\t// remove empty root keys\n\t\tif (!empty($this->info)) {\n\t\t\tforeach ($this->info as $key => $value) {\n\t\t\t\tif (empty($this->info[$key]) && ($this->info[$key] !== 0) && ($this->info[$key] !== '0')) {\n\t\t\t\t\tunset($this->info[$key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// remove meaningless entries from unknown-format files\n\t\tif (empty($this->info['fileformat'])) {\n\t\t\tif (isset($this->info['avdataoffset'])) {\n\t\t\t\tunset($this->info['avdataoffset']);\n\t\t\t}\n\t\t\tif (isset($this->info['avdataend'])) {\n\t\t\t\tunset($this->info['avdataend']);\n\t\t\t}\n\t\t}\n\n\t\t// remove possible duplicated identical entries\n\t\tif (!empty($this->info['error'])) {\n\t\t\t$this->info['error'] = array_values(array_unique($this->info['error']));\n\t\t}\n\t\tif (!empty($this->info['warning'])) {\n\t\t\t$this->info['warning'] = array_values(array_unique($this->info['warning']));\n\t\t}\n\n\t\t// remove \"global variable\" type keys\n\t\tunset($this->info['php_memory_limit']);\n\n\t\treturn true;\n\t}\n\n\n\t// return array containing information about all supported formats\n\tpublic function GetFileFormatArray() {\n\t\tstatic $format_info = array();\n\t\tif (empty($format_info)) {\n\t\t\t$format_info = array(\n\n\t\t\t\t// Audio formats\n\n\t\t\t\t// AC-3   - audio      - Dolby AC-3 / Dolby Digital\n\t\t\t\t'ac3'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x0B\\x77',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'ac3',\n\t\t\t\t\t\t\t'mime_type' => 'audio/ac3',\n\t\t\t\t\t\t),\n\n\t\t\t\t// AAC  - audio       - Advanced Audio Coding (AAC) - ADIF format\n\t\t\t\t'adif' => array(\n\t\t\t\t\t\t\t'pattern'   => '^ADIF',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'aac',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t\t'fail_ape'  => 'WARNING',\n\t\t\t\t\t\t),\n\n/*\n\t\t\t\t// AA   - audio       - Audible Audiobook\n\t\t\t\t'aa'   => array(\n\t\t\t\t\t\t\t'pattern'   => '^.{4}\\x57\\x90\\x75\\x36',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'aa',\n\t\t\t\t\t\t\t'mime_type' => 'audio/audible',\n\t\t\t\t\t\t),\n*/\n\t\t\t\t// AAC  - audio       - Advanced Audio Coding (AAC) - ADTS format (very similar to MP3)\n\t\t\t\t'adts' => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\xFF[\\xF0-\\xF1\\xF8-\\xF9]',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'aac',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t\t'fail_ape'  => 'WARNING',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// AU   - audio       - NeXT/Sun AUdio (AU)\n\t\t\t\t'au'   => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\.snd',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'au',\n\t\t\t\t\t\t\t'mime_type' => 'audio/basic',\n\t\t\t\t\t\t),\n\n\t\t\t\t// AMR  - audio       - Adaptive Multi Rate\n\t\t\t\t'amr'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x23\\x21AMR\\x0A', // #!AMR[0A]\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'amr',\n\t\t\t\t\t\t\t'mime_type' => 'audio/amr',\n\t\t\t\t\t\t),\n\n\t\t\t\t// AVR  - audio       - Audio Visual Research\n\t\t\t\t'avr'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^2BIT',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'avr',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// BONK - audio       - Bonk v0.9+\n\t\t\t\t'bonk' => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x00(BONK|INFO|META| ID3)',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'bonk',\n\t\t\t\t\t\t\t'mime_type' => 'audio/xmms-bonk',\n\t\t\t\t\t\t),\n\n\t\t\t\t// DSS  - audio       - Digital Speech Standard\n\t\t\t\t'dss'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^[\\x02-\\x03]ds[s2]',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'dss',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// DTS  - audio       - Dolby Theatre System\n\t\t\t\t'dts'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x7F\\xFE\\x80\\x01',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'dts',\n\t\t\t\t\t\t\t'mime_type' => 'audio/dts',\n\t\t\t\t\t\t),\n\n\t\t\t\t// FLAC - audio       - Free Lossless Audio Codec\n\t\t\t\t'flac' => array(\n\t\t\t\t\t\t\t'pattern'   => '^fLaC',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'flac',\n\t\t\t\t\t\t\t'mime_type' => 'audio/x-flac',\n\t\t\t\t\t\t),\n\n\t\t\t\t// LA   - audio       - Lossless Audio (LA)\n\t\t\t\t'la'   => array(\n\t\t\t\t\t\t\t'pattern'   => '^LA0[2-4]',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'la',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// LPAC - audio       - Lossless Predictive Audio Compression (LPAC)\n\t\t\t\t'lpac' => array(\n\t\t\t\t\t\t\t'pattern'   => '^LPAC',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'lpac',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// MIDI - audio       - MIDI (Musical Instrument Digital Interface)\n\t\t\t\t'midi' => array(\n\t\t\t\t\t\t\t'pattern'   => '^MThd',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'midi',\n\t\t\t\t\t\t\t'mime_type' => 'audio/midi',\n\t\t\t\t\t\t),\n\n\t\t\t\t// MAC  - audio       - Monkey's Audio Compressor\n\t\t\t\t'mac'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^MAC ',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'monkey',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n// has been known to produce false matches in random files (e.g. JPEGs), leave out until more precise matching available\n//\t\t\t\t// MOD  - audio       - MODule (assorted sub-formats)\n//\t\t\t\t'mod'  => array(\n//\t\t\t\t\t\t\t'pattern'   => '^.{1080}(M\\\\.K\\\\.|M!K!|FLT4|FLT8|[5-9]CHN|[1-3][0-9]CH)',\n//\t\t\t\t\t\t\t'group'     => 'audio',\n//\t\t\t\t\t\t\t'module'    => 'mod',\n//\t\t\t\t\t\t\t'option'    => 'mod',\n//\t\t\t\t\t\t\t'mime_type' => 'audio/mod',\n//\t\t\t\t\t\t),\n\n\t\t\t\t// MOD  - audio       - MODule (Impulse Tracker)\n\t\t\t\t'it'   => array(\n\t\t\t\t\t\t\t'pattern'   => '^IMPM',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'mod',\n\t\t\t\t\t\t\t//'option'    => 'it',\n\t\t\t\t\t\t\t'mime_type' => 'audio/it',\n\t\t\t\t\t\t),\n\n\t\t\t\t// MOD  - audio       - MODule (eXtended Module, various sub-formats)\n\t\t\t\t'xm'   => array(\n\t\t\t\t\t\t\t'pattern'   => '^Extended Module',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'mod',\n\t\t\t\t\t\t\t//'option'    => 'xm',\n\t\t\t\t\t\t\t'mime_type' => 'audio/xm',\n\t\t\t\t\t\t),\n\n\t\t\t\t// MOD  - audio       - MODule (ScreamTracker)\n\t\t\t\t's3m'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^.{44}SCRM',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'mod',\n\t\t\t\t\t\t\t//'option'    => 's3m',\n\t\t\t\t\t\t\t'mime_type' => 'audio/s3m',\n\t\t\t\t\t\t),\n\n\t\t\t\t// MPC  - audio       - Musepack / MPEGplus\n\t\t\t\t'mpc'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^(MPCK|MP\\+|[\\x00\\x01\\x10\\x11\\x40\\x41\\x50\\x51\\x80\\x81\\x90\\x91\\xC0\\xC1\\xD0\\xD1][\\x20-37][\\x00\\x20\\x40\\x60\\x80\\xA0\\xC0\\xE0])',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'mpc',\n\t\t\t\t\t\t\t'mime_type' => 'audio/x-musepack',\n\t\t\t\t\t\t),\n\n\t\t\t\t// MP3  - audio       - MPEG-audio Layer 3 (very similar to AAC-ADTS)\n\t\t\t\t'mp3'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\xFF[\\xE2-\\xE7\\xF2-\\xF7\\xFA-\\xFF][\\x00-\\x0B\\x10-\\x1B\\x20-\\x2B\\x30-\\x3B\\x40-\\x4B\\x50-\\x5B\\x60-\\x6B\\x70-\\x7B\\x80-\\x8B\\x90-\\x9B\\xA0-\\xAB\\xB0-\\xBB\\xC0-\\xCB\\xD0-\\xDB\\xE0-\\xEB\\xF0-\\xFB]',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'mp3',\n\t\t\t\t\t\t\t'mime_type' => 'audio/mpeg',\n\t\t\t\t\t\t),\n\n\t\t\t\t// OFR  - audio       - OptimFROG\n\t\t\t\t'ofr'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^(\\*RIFF|OFR)',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'optimfrog',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// RKAU - audio       - RKive AUdio compressor\n\t\t\t\t'rkau' => array(\n\t\t\t\t\t\t\t'pattern'   => '^RKA',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'rkau',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// SHN  - audio       - Shorten\n\t\t\t\t'shn'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^ajkg',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'shorten',\n\t\t\t\t\t\t\t'mime_type' => 'audio/xmms-shn',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// TTA  - audio       - TTA Lossless Audio Compressor (http://tta.corecodec.org)\n\t\t\t\t'tta'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^TTA',  // could also be '^TTA(\\x01|\\x02|\\x03|2|1)'\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'tta',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// VOC  - audio       - Creative Voice (VOC)\n\t\t\t\t'voc'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^Creative Voice File',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'voc',\n\t\t\t\t\t\t\t'mime_type' => 'audio/voc',\n\t\t\t\t\t\t),\n\n\t\t\t\t// VQF  - audio       - transform-domain weighted interleave Vector Quantization Format (VQF)\n\t\t\t\t'vqf'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^TWIN',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'vqf',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// WV  - audio        - WavPack (v4.0+)\n\t\t\t\t'wv'   => array(\n\t\t\t\t\t\t\t'pattern'   => '^wvpk',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'wavpack',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// Audio-Video formats\n\n\t\t\t\t// ASF  - audio/video - Advanced Streaming Format, Windows Media Video, Windows Media Audio\n\t\t\t\t'asf'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x30\\x26\\xB2\\x75\\x8E\\x66\\xCF\\x11\\xA6\\xD9\\x00\\xAA\\x00\\x62\\xCE\\x6C',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'asf',\n\t\t\t\t\t\t\t'mime_type' => 'video/x-ms-asf',\n\t\t\t\t\t\t\t'iconv_req' => false,\n\t\t\t\t\t\t),\n\n\t\t\t\t// BINK - audio/video - Bink / Smacker\n\t\t\t\t'bink' => array(\n\t\t\t\t\t\t\t'pattern'   => '^(BIK|SMK)',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'bink',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// FLV  - audio/video - FLash Video\n\t\t\t\t'flv' => array(\n\t\t\t\t\t\t\t'pattern'   => '^FLV\\x01',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'flv',\n\t\t\t\t\t\t\t'mime_type' => 'video/x-flv',\n\t\t\t\t\t\t),\n\n\t\t\t\t// MKAV - audio/video - Mastroka\n\t\t\t\t'matroska' => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x1A\\x45\\xDF\\xA3',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'matroska',\n\t\t\t\t\t\t\t'mime_type' => 'video/x-matroska', // may also be audio/x-matroska\n\t\t\t\t\t\t),\n\n\t\t\t\t// MPEG - audio/video - MPEG (Moving Pictures Experts Group)\n\t\t\t\t'mpeg' => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x00\\x00\\x01(\\xBA|\\xB3)',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'mpeg',\n\t\t\t\t\t\t\t'mime_type' => 'video/mpeg',\n\t\t\t\t\t\t),\n\n\t\t\t\t// NSV  - audio/video - Nullsoft Streaming Video (NSV)\n\t\t\t\t'nsv'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^NSV[sf]',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'nsv',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t),\n\n\t\t\t\t// Ogg  - audio/video - Ogg (Ogg-Vorbis, Ogg-FLAC, Speex, Ogg-Theora(*), Ogg-Tarkin(*))\n\t\t\t\t'ogg'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^OggS',\n\t\t\t\t\t\t\t'group'     => 'audio',\n\t\t\t\t\t\t\t'module'    => 'ogg',\n\t\t\t\t\t\t\t'mime_type' => 'application/ogg',\n\t\t\t\t\t\t\t'fail_id3'  => 'WARNING',\n\t\t\t\t\t\t\t'fail_ape'  => 'WARNING',\n\t\t\t\t\t\t),\n\n\t\t\t\t// QT   - audio/video - Quicktime\n\t\t\t\t'quicktime' => array(\n\t\t\t\t\t\t\t'pattern'   => '^.{4}(cmov|free|ftyp|mdat|moov|pnot|skip|wide)',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'quicktime',\n\t\t\t\t\t\t\t'mime_type' => 'video/quicktime',\n\t\t\t\t\t\t),\n\n\t\t\t\t// RIFF - audio/video - Resource Interchange File Format (RIFF) / WAV / AVI / CD-audio / SDSS = renamed variant used by SmartSound QuickTracks (www.smartsound.com) / FORM = Audio Interchange File Format (AIFF)\n\t\t\t\t'riff' => array(\n\t\t\t\t\t\t\t'pattern'   => '^(RIFF|SDSS|FORM)',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'riff',\n\t\t\t\t\t\t\t'mime_type' => 'audio/x-wave',\n\t\t\t\t\t\t\t'fail_ape'  => 'WARNING',\n\t\t\t\t\t\t),\n\n\t\t\t\t// Real - audio/video - RealAudio, RealVideo\n\t\t\t\t'real' => array(\n\t\t\t\t\t\t\t'pattern'   => '^(\\\\.RMF|\\\\.ra)',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'real',\n\t\t\t\t\t\t\t'mime_type' => 'audio/x-realaudio',\n\t\t\t\t\t\t),\n\n\t\t\t\t// SWF - audio/video - ShockWave Flash\n\t\t\t\t'swf' => array(\n\t\t\t\t\t\t\t'pattern'   => '^(F|C)WS',\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'swf',\n\t\t\t\t\t\t\t'mime_type' => 'application/x-shockwave-flash',\n\t\t\t\t\t\t),\n\n\t\t\t\t// TS - audio/video - MPEG-2 Transport Stream\n\t\t\t\t'ts' => array(\n\t\t\t\t\t\t\t'pattern'   => '^(\\x47.{187}){10,}', // packets are 188 bytes long and start with 0x47 \"G\".  Check for at least 10 packets matching this pattern\n\t\t\t\t\t\t\t'group'     => 'audio-video',\n\t\t\t\t\t\t\t'module'    => 'ts',\n\t\t\t\t\t\t\t'mime_type' => 'video/MP2T',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// Still-Image formats\n\n\t\t\t\t// BMP  - still image - Bitmap (Windows, OS/2; uncompressed, RLE8, RLE4)\n\t\t\t\t'bmp'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^BM',\n\t\t\t\t\t\t\t'group'     => 'graphic',\n\t\t\t\t\t\t\t'module'    => 'bmp',\n\t\t\t\t\t\t\t'mime_type' => 'image/bmp',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// GIF  - still image - Graphics Interchange Format\n\t\t\t\t'gif'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^GIF',\n\t\t\t\t\t\t\t'group'     => 'graphic',\n\t\t\t\t\t\t\t'module'    => 'gif',\n\t\t\t\t\t\t\t'mime_type' => 'image/gif',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// JPEG - still image - Joint Photographic Experts Group (JPEG)\n\t\t\t\t'jpg'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\xFF\\xD8\\xFF',\n\t\t\t\t\t\t\t'group'     => 'graphic',\n\t\t\t\t\t\t\t'module'    => 'jpg',\n\t\t\t\t\t\t\t'mime_type' => 'image/jpeg',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// PCD  - still image - Kodak Photo CD\n\t\t\t\t'pcd'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^.{2048}PCD_IPI\\x00',\n\t\t\t\t\t\t\t'group'     => 'graphic',\n\t\t\t\t\t\t\t'module'    => 'pcd',\n\t\t\t\t\t\t\t'mime_type' => 'image/x-photo-cd',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// PNG  - still image - Portable Network Graphics (PNG)\n\t\t\t\t'png'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A',\n\t\t\t\t\t\t\t'group'     => 'graphic',\n\t\t\t\t\t\t\t'module'    => 'png',\n\t\t\t\t\t\t\t'mime_type' => 'image/png',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// SVG  - still image - Scalable Vector Graphics (SVG)\n\t\t\t\t'svg'  => array(\n\t\t\t\t\t\t\t'pattern'   => '(<!DOCTYPE svg PUBLIC |xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg\")',\n\t\t\t\t\t\t\t'group'     => 'graphic',\n\t\t\t\t\t\t\t'module'    => 'svg',\n\t\t\t\t\t\t\t'mime_type' => 'image/svg+xml',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// TIFF - still image - Tagged Information File Format (TIFF)\n\t\t\t\t'tiff' => array(\n\t\t\t\t\t\t\t'pattern'   => '^(II\\x2A\\x00|MM\\x00\\x2A)',\n\t\t\t\t\t\t\t'group'     => 'graphic',\n\t\t\t\t\t\t\t'module'    => 'tiff',\n\t\t\t\t\t\t\t'mime_type' => 'image/tiff',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// EFAX - still image - eFax (TIFF derivative)\n\t\t\t\t'efax'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\xDC\\xFE',\n\t\t\t\t\t\t\t'group'     => 'graphic',\n\t\t\t\t\t\t\t'module'    => 'efax',\n\t\t\t\t\t\t\t'mime_type' => 'image/efax',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// Data formats\n\n\t\t\t\t// ISO  - data        - International Standards Organization (ISO) CD-ROM Image\n\t\t\t\t'iso'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^.{32769}CD001',\n\t\t\t\t\t\t\t'group'     => 'misc',\n\t\t\t\t\t\t\t'module'    => 'iso',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t\t'iconv_req' => false,\n\t\t\t\t\t\t),\n\n\t\t\t\t// RAR  - data        - RAR compressed data\n\t\t\t\t'rar'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^Rar\\!',\n\t\t\t\t\t\t\t'group'     => 'archive',\n\t\t\t\t\t\t\t'module'    => 'rar',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// SZIP - audio/data  - SZIP compressed data\n\t\t\t\t'szip' => array(\n\t\t\t\t\t\t\t'pattern'   => '^SZ\\x0A\\x04',\n\t\t\t\t\t\t\t'group'     => 'archive',\n\t\t\t\t\t\t\t'module'    => 'szip',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// TAR  - data        - TAR compressed data\n\t\t\t\t'tar'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^.{100}[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20\\x00]{12}[0-9\\x20\\x00]{12}',\n\t\t\t\t\t\t\t'group'     => 'archive',\n\t\t\t\t\t\t\t'module'    => 'tar',\n\t\t\t\t\t\t\t'mime_type' => 'application/x-tar',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// GZIP  - data        - GZIP compressed data\n\t\t\t\t'gz'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x1F\\x8B\\x08',\n\t\t\t\t\t\t\t'group'     => 'archive',\n\t\t\t\t\t\t\t'module'    => 'gzip',\n\t\t\t\t\t\t\t'mime_type' => 'application/x-gzip',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// ZIP  - data         - ZIP compressed data\n\t\t\t\t'zip'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^PK\\x03\\x04',\n\t\t\t\t\t\t\t'group'     => 'archive',\n\t\t\t\t\t\t\t'module'    => 'zip',\n\t\t\t\t\t\t\t'mime_type' => 'application/zip',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\n\t\t\t\t// Misc other formats\n\n\t\t\t\t// PAR2 - data        - Parity Volume Set Specification 2.0\n\t\t\t\t'par2' => array (\n\t\t\t\t\t\t\t'pattern'   => '^PAR2\\x00PKT',\n\t\t\t\t\t\t\t'group'     => 'misc',\n\t\t\t\t\t\t\t'module'    => 'par2',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// PDF  - data        - Portable Document Format\n\t\t\t\t'pdf'  => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\x25PDF',\n\t\t\t\t\t\t\t'group'     => 'misc',\n\t\t\t\t\t\t\t'module'    => 'pdf',\n\t\t\t\t\t\t\t'mime_type' => 'application/pdf',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t// MSOFFICE  - data   - ZIP compressed data\n\t\t\t\t'msoffice' => array(\n\t\t\t\t\t\t\t'pattern'   => '^\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1', // D0CF11E == DOCFILE == Microsoft Office Document\n\t\t\t\t\t\t\t'group'     => 'misc',\n\t\t\t\t\t\t\t'module'    => 'msoffice',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t\t'fail_id3'  => 'ERROR',\n\t\t\t\t\t\t\t'fail_ape'  => 'ERROR',\n\t\t\t\t\t\t),\n\n\t\t\t\t // CUE  - data       - CUEsheet (index to single-file disc images)\n\t\t\t\t 'cue' => array(\n\t\t\t\t\t\t\t'pattern'   => '', // empty pattern means cannot be automatically detected, will fall through all other formats and match based on filename and very basic file contents\n\t\t\t\t\t\t\t'group'     => 'misc',\n\t\t\t\t\t\t\t'module'    => 'cue',\n\t\t\t\t\t\t\t'mime_type' => 'application/octet-stream',\n\t\t\t\t\t\t   ),\n\n\t\t\t);\n\t\t}\n\n\t\treturn $format_info;\n\t}\n\n\n\n\tpublic function GetFileFormat(&$filedata, $filename='') {\n\t\t// this function will determine the format of a file based on usually\n\t\t// the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG,\n\t\t// and in the case of ISO CD image, 6 bytes offset 32kb from the start\n\t\t// of the file).\n\n\t\t// Identify file format - loop through $format_info and detect with reg expr\n\t\tforeach ($this->GetFileFormatArray() as $format_name => $info) {\n\t\t\t// The /s switch on preg_match() forces preg_match() NOT to treat\n\t\t\t// newline (0x0A) characters as special chars but do a binary match\n\t\t\tif (!empty($info['pattern']) && preg_match('#'.$info['pattern'].'#s', $filedata)) {\n\t\t\t\t$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';\n\t\t\t\treturn $info;\n\t\t\t}\n\t\t}\n\n\n\t\tif (preg_match('#\\.mp[123a]$#i', $filename)) {\n\t\t\t// Too many mp3 encoders on the market put gabage in front of mpeg files\n\t\t\t// use assume format on these if format detection failed\n\t\t\t$GetFileFormatArray = $this->GetFileFormatArray();\n\t\t\t$info = $GetFileFormatArray['mp3'];\n\t\t\t$info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';\n\t\t\treturn $info;\n\t\t} elseif (preg_match('/\\.cue$/i', $filename) && preg_match('#FILE \"[^\"]+\" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) {\n\t\t\t// there's not really a useful consistent \"magic\" at the beginning of .cue files to identify them\n\t\t\t// so until I think of something better, just go by filename if all other format checks fail\n\t\t\t// and verify there's at least one instance of \"TRACK xx AUDIO\" in the file\n\t\t\t$GetFileFormatArray = $this->GetFileFormatArray();\n\t\t\t$info = $GetFileFormatArray['cue'];\n\t\t\t$info['include']   = 'module.'.$info['group'].'.'.$info['module'].'.php';\n\t\t\treturn $info;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\n\t// converts array to $encoding charset from $this->encoding\n\tpublic function CharConvert(&$array, $encoding) {\n\n\t\t// identical encoding - end here\n\t\tif ($encoding == $this->encoding) {\n\t\t\treturn;\n\t\t}\n\n\t\t// loop thru array\n\t\tforeach ($array as $key => $value) {\n\n\t\t\t// go recursive\n\t\t\tif (is_array($value)) {\n\t\t\t\t$this->CharConvert($array[$key], $encoding);\n\t\t\t}\n\n\t\t\t// convert string\n\t\t\telseif (is_string($value)) {\n\t\t\t\t$array[$key] = trim(getid3_lib::iconv_fallback($encoding, $this->encoding, $value));\n\t\t\t}\n\t\t}\n\t}\n\n\n\tpublic function HandleAllTags() {\n\n\t\t// key name => array (tag name, character encoding)\n\t\tstatic $tags;\n\t\tif (empty($tags)) {\n\t\t\t$tags = array(\n\t\t\t\t'asf'       => array('asf'           , 'UTF-16LE'),\n\t\t\t\t'midi'      => array('midi'          , 'ISO-8859-1'),\n\t\t\t\t'nsv'       => array('nsv'           , 'ISO-8859-1'),\n\t\t\t\t'ogg'       => array('vorbiscomment' , 'UTF-8'),\n\t\t\t\t'png'       => array('png'           , 'UTF-8'),\n\t\t\t\t'tiff'      => array('tiff'          , 'ISO-8859-1'),\n\t\t\t\t'quicktime' => array('quicktime'     , 'UTF-8'),\n\t\t\t\t'real'      => array('real'          , 'ISO-8859-1'),\n\t\t\t\t'vqf'       => array('vqf'           , 'ISO-8859-1'),\n\t\t\t\t'zip'       => array('zip'           , 'ISO-8859-1'),\n\t\t\t\t'riff'      => array('riff'          , 'ISO-8859-1'),\n\t\t\t\t'lyrics3'   => array('lyrics3'       , 'ISO-8859-1'),\n\t\t\t\t'id3v1'     => array('id3v1'         , $this->encoding_id3v1),\n\t\t\t\t'id3v2'     => array('id3v2'         , 'UTF-8'), // not according to the specs (every frame can have a different encoding), but getID3() force-converts all encodings to UTF-8\n\t\t\t\t'ape'       => array('ape'           , 'UTF-8'),\n\t\t\t\t'cue'       => array('cue'           , 'ISO-8859-1'),\n\t\t\t\t'matroska'  => array('matroska'      , 'UTF-8'),\n\t\t\t\t'flac'      => array('vorbiscomment' , 'UTF-8'),\n\t\t\t\t'divxtag'   => array('divx'          , 'ISO-8859-1'),\n\t\t\t\t'iptc'      => array('iptc'          , 'ISO-8859-1'),\n\t\t\t);\n\t\t}\n\n\t\t// loop through comments array\n\t\tforeach ($tags as $comment_name => $tagname_encoding_array) {\n\t\t\tlist($tag_name, $encoding) = $tagname_encoding_array;\n\n\t\t\t// fill in default encoding type if not already present\n\t\t\tif (isset($this->info[$comment_name]) && !isset($this->info[$comment_name]['encoding'])) {\n\t\t\t\t$this->info[$comment_name]['encoding'] = $encoding;\n\t\t\t}\n\n\t\t\t// copy comments if key name set\n\t\t\tif (!empty($this->info[$comment_name]['comments'])) {\n\t\t\t\tforeach ($this->info[$comment_name]['comments'] as $tag_key => $valuearray) {\n\t\t\t\t\tforeach ($valuearray as $key => $value) {\n\t\t\t\t\t\tif (is_string($value)) {\n\t\t\t\t\t\t\t$value = trim($value, \" \\r\\n\\t\"); // do not trim nulls from $value!! Unicode characters will get mangled if trailing nulls are removed!\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($value) {\n\t\t\t\t\t\t\tif (!is_numeric($key)) {\n\t\t\t\t\t\t\t\t$this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$this->info['tags'][trim($tag_name)][trim($tag_key)][]     = $value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ($tag_key == 'picture') {\n\t\t\t\t\t\tunset($this->info[$comment_name]['comments'][$tag_key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!isset($this->info['tags'][$tag_name])) {\n\t\t\t\t\t// comments are set but contain nothing but empty strings, so skip\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ($this->option_tags_html) {\n\t\t\t\t\tforeach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) {\n\t\t\t\t\t\t$this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $encoding);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$this->CharConvert($this->info['tags'][$tag_name], $encoding);           // only copy gets converted!\n\t\t\t}\n\n\t\t}\n\n\t\t// pictures can take up a lot of space, and we don't need multiple copies of them\n\t\t// let there be a single copy in [comments][picture], and not elsewhere\n\t\tif (!empty($this->info['tags'])) {\n\t\t\t$unset_keys = array('tags', 'tags_html');\n\t\t\tforeach ($this->info['tags'] as $tagtype => $tagarray) {\n\t\t\t\tforeach ($tagarray as $tagname => $tagdata) {\n\t\t\t\t\tif ($tagname == 'picture') {\n\t\t\t\t\t\tforeach ($tagdata as $key => $tagarray) {\n\t\t\t\t\t\t\t$this->info['comments']['picture'][] = $tagarray;\n\t\t\t\t\t\t\tif (isset($tagarray['data']) && isset($tagarray['image_mime'])) {\n\t\t\t\t\t\t\t\tif (isset($this->info['tags'][$tagtype][$tagname][$key])) {\n\t\t\t\t\t\t\t\t\tunset($this->info['tags'][$tagtype][$tagname][$key]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($this->info['tags_html'][$tagtype][$tagname][$key])) {\n\t\t\t\t\t\t\t\t\tunset($this->info['tags_html'][$tagtype][$tagname][$key]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tforeach ($unset_keys as $unset_key) {\n\t\t\t\t\t// remove possible empty keys from (e.g. [tags][id3v2][picture])\n\t\t\t\t\tif (empty($this->info[$unset_key][$tagtype]['picture'])) {\n\t\t\t\t\t\tunset($this->info[$unset_key][$tagtype]['picture']);\n\t\t\t\t\t}\n\t\t\t\t\tif (empty($this->info[$unset_key][$tagtype])) {\n\t\t\t\t\t\tunset($this->info[$unset_key][$tagtype]);\n\t\t\t\t\t}\n\t\t\t\t\tif (empty($this->info[$unset_key])) {\n\t\t\t\t\t\tunset($this->info[$unset_key]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// remove duplicate copy of picture data from (e.g. [id3v2][comments][picture])\n\t\t\t\tif (isset($this->info[$tagtype]['comments']['picture'])) {\n\t\t\t\t\tunset($this->info[$tagtype]['comments']['picture']);\n\t\t\t\t}\n\t\t\t\tif (empty($this->info[$tagtype]['comments'])) {\n\t\t\t\t\tunset($this->info[$tagtype]['comments']);\n\t\t\t\t}\n\t\t\t\tif (empty($this->info[$tagtype])) {\n\t\t\t\t\tunset($this->info[$tagtype]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic function getHashdata($algorithm) {\n\t\tswitch ($algorithm) {\n\t\t\tcase 'md5':\n\t\t\tcase 'sha1':\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn $this->error('bad algorithm \"'.$algorithm.'\" in getHashdata()');\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (!empty($this->info['fileformat']) && !empty($this->info['dataformat']) && ($this->info['fileformat'] == 'ogg') && ($this->info['audio']['dataformat'] == 'vorbis')) {\n\n\t\t\t// We cannot get an identical md5_data value for Ogg files where the comments\n\t\t\t// span more than 1 Ogg page (compared to the same audio data with smaller\n\t\t\t// comments) using the normal getID3() method of MD5'ing the data between the\n\t\t\t// end of the comments and the end of the file (minus any trailing tags),\n\t\t\t// because the page sequence numbers of the pages that the audio data is on\n\t\t\t// do not match. Under normal circumstances, where comments are smaller than\n\t\t\t// the nominal 4-8kB page size, then this is not a problem, but if there are\n\t\t\t// very large comments, the only way around it is to strip off the comment\n\t\t\t// tags with vorbiscomment and MD5 that file.\n\t\t\t// This procedure must be applied to ALL Ogg files, not just the ones with\n\t\t\t// comments larger than 1 page, because the below method simply MD5's the\n\t\t\t// whole file with the comments stripped, not just the portion after the\n\t\t\t// comments block (which is the standard getID3() method.\n\n\t\t\t// The above-mentioned problem of comments spanning multiple pages and changing\n\t\t\t// page sequence numbers likely happens for OggSpeex and OggFLAC as well, but\n\t\t\t// currently vorbiscomment only works on OggVorbis files.\n\n\t\t\tif (preg_match('#(1|ON)#i', ini_get('safe_mode'))) {\n\n\t\t\t\t$this->warning('Failed making system call to vorbiscomment.exe - '.$algorithm.'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)');\n\t\t\t\t$this->info[$algorithm.'_data'] = false;\n\n\t\t\t} else {\n\n\t\t\t\t// Prevent user from aborting script\n\t\t\t\t$old_abort = ignore_user_abort(true);\n\n\t\t\t\t// Create empty file\n\t\t\t\t$empty = tempnam(GETID3_TEMP_DIR, 'getID3');\n\t\t\t\ttouch($empty);\n\n\t\t\t\t// Use vorbiscomment to make temp file without comments\n\t\t\t\t$temp = tempnam(GETID3_TEMP_DIR, 'getID3');\n\t\t\t\t$file = $this->info['filenamepath'];\n\n\t\t\t\tif (GETID3_OS_ISWINDOWS) {\n\n\t\t\t\t\tif (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) {\n\n\t\t\t\t\t\t$commandline = '\"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe\" -w -c \"'.$empty.'\" \"'.$file.'\" \"'.$temp.'\"';\n\t\t\t\t\t\t$VorbisCommentError = `$commandline`;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t$VorbisCommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t$commandline = 'vorbiscomment -w -c \"'.$empty.'\" \"'.$file.'\" \"'.$temp.'\" 2>&1';\n\t\t\t\t\t$commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1';\n\t\t\t\t\t$VorbisCommentError = `$commandline`;\n\n\t\t\t\t}\n\n\t\t\t\tif (!empty($VorbisCommentError)) {\n\n\t\t\t\t\t$this->info['warning'][]         = 'Failed making system call to vorbiscomment(.exe) - '.$algorithm.'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError;\n\t\t\t\t\t$this->info[$algorithm.'_data']  = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Get hash of newly created file\n\t\t\t\t\tswitch ($algorithm) {\n\t\t\t\t\t\tcase 'md5':\n\t\t\t\t\t\t\t$this->info[$algorithm.'_data'] = md5_file($temp);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'sha1':\n\t\t\t\t\t\t\t$this->info[$algorithm.'_data'] = sha1_file($temp);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Clean up\n\t\t\t\tunlink($empty);\n\t\t\t\tunlink($temp);\n\n\t\t\t\t// Reset abort setting\n\t\t\t\tignore_user_abort($old_abort);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif (!empty($this->info['avdataoffset']) || (isset($this->info['avdataend']) && ($this->info['avdataend'] < $this->info['filesize']))) {\n\n\t\t\t\t// get hash from part of file\n\t\t\t\t$this->info[$algorithm.'_data'] = getid3_lib::hash_data($this->info['filenamepath'], $this->info['avdataoffset'], $this->info['avdataend'], $algorithm);\n\n\t\t\t} else {\n\n\t\t\t\t// get hash from whole file\n\t\t\t\tswitch ($algorithm) {\n\t\t\t\t\tcase 'md5':\n\t\t\t\t\t\t$this->info[$algorithm.'_data'] = md5_file($this->info['filenamepath']);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'sha1':\n\t\t\t\t\t\t$this->info[$algorithm.'_data'] = sha1_file($this->info['filenamepath']);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn true;\n\t}\n\n\n\tpublic function ChannelsBitratePlaytimeCalculations() {\n\n\t\t// set channelmode on audio\n\t\tif (!empty($this->info['audio']['channelmode']) || !isset($this->info['audio']['channels'])) {\n\t\t\t// ignore\n\t\t} elseif ($this->info['audio']['channels'] == 1) {\n\t\t\t$this->info['audio']['channelmode'] = 'mono';\n\t\t} elseif ($this->info['audio']['channels'] == 2) {\n\t\t\t$this->info['audio']['channelmode'] = 'stereo';\n\t\t}\n\n\t\t// Calculate combined bitrate - audio + video\n\t\t$CombinedBitrate  = 0;\n\t\t$CombinedBitrate += (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : 0);\n\t\t$CombinedBitrate += (isset($this->info['video']['bitrate']) ? $this->info['video']['bitrate'] : 0);\n\t\tif (($CombinedBitrate > 0) && empty($this->info['bitrate'])) {\n\t\t\t$this->info['bitrate'] = $CombinedBitrate;\n\t\t}\n\t\t//if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) {\n\t\t//\t// for example, VBR MPEG video files cannot determine video bitrate:\n\t\t//\t// should not set overall bitrate and playtime from audio bitrate only\n\t\t//\tunset($this->info['bitrate']);\n\t\t//}\n\n\t\t// video bitrate undetermined, but calculable\n\t\tif (isset($this->info['video']['dataformat']) && $this->info['video']['dataformat'] && (!isset($this->info['video']['bitrate']) || ($this->info['video']['bitrate'] == 0))) {\n\t\t\t// if video bitrate not set\n\t\t\tif (isset($this->info['audio']['bitrate']) && ($this->info['audio']['bitrate'] > 0) && ($this->info['audio']['bitrate'] == $this->info['bitrate'])) {\n\t\t\t\t// AND if audio bitrate is set to same as overall bitrate\n\t\t\t\tif (isset($this->info['playtime_seconds']) && ($this->info['playtime_seconds'] > 0)) {\n\t\t\t\t\t// AND if playtime is set\n\t\t\t\t\tif (isset($this->info['avdataend']) && isset($this->info['avdataoffset'])) {\n\t\t\t\t\t\t// AND if AV data offset start/end is known\n\t\t\t\t\t\t// THEN we can calculate the video bitrate\n\t\t\t\t\t\t$this->info['bitrate'] = round((($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']);\n\t\t\t\t\t\t$this->info['video']['bitrate'] = $this->info['bitrate'] - $this->info['audio']['bitrate'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ((!isset($this->info['playtime_seconds']) || ($this->info['playtime_seconds'] <= 0)) && !empty($this->info['bitrate'])) {\n\t\t\t$this->info['playtime_seconds'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['bitrate'];\n\t\t}\n\n\t\tif (!isset($this->info['bitrate']) && !empty($this->info['playtime_seconds'])) {\n\t\t\t$this->info['bitrate'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds'];\n\t\t}\n\t\tif (isset($this->info['bitrate']) && empty($this->info['audio']['bitrate']) && empty($this->info['video']['bitrate'])) {\n\t\t\tif (isset($this->info['audio']['dataformat']) && empty($this->info['video']['resolution_x'])) {\n\t\t\t\t// audio only\n\t\t\t\t$this->info['audio']['bitrate'] = $this->info['bitrate'];\n\t\t\t} elseif (isset($this->info['video']['resolution_x']) && empty($this->info['audio']['dataformat'])) {\n\t\t\t\t// video only\n\t\t\t\t$this->info['video']['bitrate'] = $this->info['bitrate'];\n\t\t\t}\n\t\t}\n\n\t\t// Set playtime string\n\t\tif (!empty($this->info['playtime_seconds']) && empty($this->info['playtime_string'])) {\n\t\t\t$this->info['playtime_string'] = getid3_lib::PlaytimeString($this->info['playtime_seconds']);\n\t\t}\n\t}\n\n\n\tpublic function CalculateCompressionRatioVideo() {\n\t\tif (empty($this->info['video'])) {\n\t\t\treturn false;\n\t\t}\n\t\tif (empty($this->info['video']['resolution_x']) || empty($this->info['video']['resolution_y'])) {\n\t\t\treturn false;\n\t\t}\n\t\tif (empty($this->info['video']['bits_per_sample'])) {\n\t\t\treturn false;\n\t\t}\n\n\t\tswitch ($this->info['video']['dataformat']) {\n\t\t\tcase 'bmp':\n\t\t\tcase 'gif':\n\t\t\tcase 'jpeg':\n\t\t\tcase 'jpg':\n\t\t\tcase 'png':\n\t\t\tcase 'tiff':\n\t\t\t\t$FrameRate = 1;\n\t\t\t\t$PlaytimeSeconds = 1;\n\t\t\t\t$BitrateCompressed = $this->info['filesize'] * 8;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tif (!empty($this->info['video']['frame_rate'])) {\n\t\t\t\t\t$FrameRate = $this->info['video']['frame_rate'];\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (!empty($this->info['playtime_seconds'])) {\n\t\t\t\t\t$PlaytimeSeconds = $this->info['playtime_seconds'];\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (!empty($this->info['video']['bitrate'])) {\n\t\t\t\t\t$BitrateCompressed = $this->info['video']['bitrate'];\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\t$BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate;\n\n\t\t$this->info['video']['compression_ratio'] = $BitrateCompressed / $BitrateUncompressed;\n\t\treturn true;\n\t}\n\n\n\tpublic function CalculateCompressionRatioAudio() {\n\t\tif (empty($this->info['audio']['bitrate']) || empty($this->info['audio']['channels']) || empty($this->info['audio']['sample_rate']) || !is_numeric($this->info['audio']['sample_rate'])) {\n\t\t\treturn false;\n\t\t}\n\t\t$this->info['audio']['compression_ratio'] = $this->info['audio']['bitrate'] / ($this->info['audio']['channels'] * $this->info['audio']['sample_rate'] * (!empty($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : 16));\n\n\t\tif (!empty($this->info['audio']['streams'])) {\n\t\t\tforeach ($this->info['audio']['streams'] as $streamnumber => $streamdata) {\n\t\t\t\tif (!empty($streamdata['bitrate']) && !empty($streamdata['channels']) && !empty($streamdata['sample_rate'])) {\n\t\t\t\t\t$this->info['audio']['streams'][$streamnumber]['compression_ratio'] = $streamdata['bitrate'] / ($streamdata['channels'] * $streamdata['sample_rate'] * (!empty($streamdata['bits_per_sample']) ? $streamdata['bits_per_sample'] : 16));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\n\tpublic function CalculateReplayGain() {\n\t\tif (isset($this->info['replay_gain'])) {\n\t\t\tif (!isset($this->info['replay_gain']['reference_volume'])) {\n\t\t\t\t$this->info['replay_gain']['reference_volume'] = (double) 89.0;\n\t\t\t}\n\t\t\tif (isset($this->info['replay_gain']['track']['adjustment'])) {\n\t\t\t\t$this->info['replay_gain']['track']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['track']['adjustment'];\n\t\t\t}\n\t\t\tif (isset($this->info['replay_gain']['album']['adjustment'])) {\n\t\t\t\t$this->info['replay_gain']['album']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['album']['adjustment'];\n\t\t\t}\n\n\t\t\tif (isset($this->info['replay_gain']['track']['peak'])) {\n\t\t\t\t$this->info['replay_gain']['track']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['track']['peak']);\n\t\t\t}\n\t\t\tif (isset($this->info['replay_gain']['album']['peak'])) {\n\t\t\t\t$this->info['replay_gain']['album']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['album']['peak']);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic function ProcessAudioStreams() {\n\t\tif (!empty($this->info['audio']['bitrate']) || !empty($this->info['audio']['channels']) || !empty($this->info['audio']['sample_rate'])) {\n\t\t\tif (!isset($this->info['audio']['streams'])) {\n\t\t\t\tforeach ($this->info['audio'] as $key => $value) {\n\t\t\t\t\tif ($key != 'streams') {\n\t\t\t\t\t\t$this->info['audio']['streams'][0][$key] = $value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic function getid3_tempnam() {\n\t\treturn tempnam($this->tempdir, 'gI3');\n\t}\n\n\tpublic function include_module($name) {\n\t\t//if (!file_exists($this->include_path.'module.'.$name.'.php')) {\n\t\tif (!file_exists(GETID3_INCLUDEPATH.'module.'.$name.'.php')) {\n\t\t\tthrow new getid3_exception('Required module.'.$name.'.php is missing.');\n\t\t}\n\t\tinclude_once(GETID3_INCLUDEPATH.'module.'.$name.'.php');\n\t\treturn true;\n\t}\n\n}\n\n\nabstract class getid3_handler {\n\n\t/**\n\t* @var getID3\n\t*/\n\tprotected $getid3;                       // pointer\n\n\tprotected $data_string_flag     = false; // analyzing filepointer or string\n\tprotected $data_string          = '';    // string to analyze\n\tprotected $data_string_position = 0;     // seek position in string\n\tprotected $data_string_length   = 0;     // string length\n\n\tprivate $dependency_to = null;\n\n\n\tpublic function __construct(getID3 $getid3, $call_module=null) {\n\t\t$this->getid3 = $getid3;\n\n\t\tif ($call_module) {\n\t\t\t$this->dependency_to = str_replace('getid3_', '', $call_module);\n\t\t}\n\t}\n\n\n\t// Analyze from file pointer\n\tabstract public function Analyze();\n\n\n\t// Analyze from string instead\n\tpublic function AnalyzeString($string) {\n\t\t// Enter string mode\n\t\t$this->setStringMode($string);\n\n\t\t// Save info\n\t\t$saved_avdataoffset = $this->getid3->info['avdataoffset'];\n\t\t$saved_avdataend    = $this->getid3->info['avdataend'];\n\t\t$saved_filesize     = (isset($this->getid3->info['filesize']) ? $this->getid3->info['filesize'] : null); // may be not set if called as dependency without openfile() call\n\n\t\t// Reset some info\n\t\t$this->getid3->info['avdataoffset'] = 0;\n\t\t$this->getid3->info['avdataend']    = $this->getid3->info['filesize'] = $this->data_string_length;\n\n\t\t// Analyze\n\t\t$this->Analyze();\n\n\t\t// Restore some info\n\t\t$this->getid3->info['avdataoffset'] = $saved_avdataoffset;\n\t\t$this->getid3->info['avdataend']    = $saved_avdataend;\n\t\t$this->getid3->info['filesize']     = $saved_filesize;\n\n\t\t// Exit string mode\n\t\t$this->data_string_flag = false;\n\t}\n\n\tpublic function setStringMode($string) {\n\t\t$this->data_string_flag   = true;\n\t\t$this->data_string        = $string;\n\t\t$this->data_string_length = strlen($string);\n\t}\n\n\tprotected function ftell() {\n\t\tif ($this->data_string_flag) {\n\t\t\treturn $this->data_string_position;\n\t\t}\n\t\treturn ftell($this->getid3->fp);\n\t}\n\n\tprotected function fread($bytes) {\n\t\tif ($this->data_string_flag) {\n\t\t\t$this->data_string_position += $bytes;\n\t\t\treturn substr($this->data_string, $this->data_string_position - $bytes, $bytes);\n\t\t}\n\t\t$pos = $this->ftell() + $bytes;\n\t\tif (!getid3_lib::intValueSupported($pos)) {\n\t\t\tthrow new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10);\n\t\t}\n\t\treturn fread($this->getid3->fp, $bytes);\n\t}\n\n\tprotected function fseek($bytes, $whence=SEEK_SET) {\n\t\tif ($this->data_string_flag) {\n\t\t\tswitch ($whence) {\n\t\t\t\tcase SEEK_SET:\n\t\t\t\t\t$this->data_string_position = $bytes;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SEEK_CUR:\n\t\t\t\t\t$this->data_string_position += $bytes;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SEEK_END:\n\t\t\t\t\t$this->data_string_position = $this->data_string_length + $bytes;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn 0;\n\t\t} else {\n\t\t\t$pos = $bytes;\n\t\t\tif ($whence == SEEK_CUR) {\n\t\t\t\t$pos = $this->ftell() + $bytes;\n\t\t\t} elseif ($whence == SEEK_END) {\n\t\t\t\t$pos = $this->getid3->info['filesize'] + $bytes;\n\t\t\t}\n\t\t\tif (!getid3_lib::intValueSupported($pos)) {\n\t\t\t\tthrow new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10);\n\t\t\t}\n\t\t}\n\t\treturn fseek($this->getid3->fp, $bytes, $whence);\n\t}\n\n\tprotected function feof() {\n\t\tif ($this->data_string_flag) {\n\t\t\treturn $this->data_string_position >= $this->data_string_length;\n\t\t}\n\t\treturn feof($this->getid3->fp);\n\t}\n\n\tfinal protected function isDependencyFor($module) {\n\t\treturn $this->dependency_to == $module;\n\t}\n\n\tprotected function error($text) {\n\t\t$this->getid3->info['error'][] = $text;\n\n\t\treturn false;\n\t}\n\n\tprotected function warning($text) {\n\t\treturn $this->getid3->warning($text);\n\t}\n\n\tprotected function notice($text) {\n\t\t// does nothing for now\n\t}\n\n\tpublic function saveAttachment($name, $offset, $length, $image_mime=null) {\n\t\ttry {\n\n\t\t\t// do not extract at all\n\t\t\tif ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_NONE) {\n\n\t\t\t\t$attachment = null; // do not set any\n\n\t\t\t// extract to return array\n\t\t\t} elseif ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_INLINE) {\n\n\t\t\t\t$this->fseek($offset);\n\t\t\t\t$attachment = $this->fread($length); // get whole data in one pass, till it is anyway stored in memory\n\t\t\t\tif ($attachment === false || strlen($attachment) != $length) {\n\t\t\t\t\tthrow new Exception('failed to read attachment data');\n\t\t\t\t}\n\n\t\t\t// assume directory path is given\n\t\t\t} else {\n\n\t\t\t\t// set up destination path\n\t\t\t\t$dir = rtrim(str_replace(array('/', '\\\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR);\n\t\t\t\tif (!is_dir($dir) || !is_writable($dir)) { // check supplied directory\n\t\t\t\t\tthrow new Exception('supplied path ('.$dir.') does not exist, or is not writable');\n\t\t\t\t}\n\t\t\t\t$dest = $dir.DIRECTORY_SEPARATOR.$name.($image_mime ? '.'.getid3_lib::ImageExtFromMime($image_mime) : '');\n\n\t\t\t\t// create dest file\n\t\t\t\tif (($fp_dest = fopen($dest, 'wb')) == false) {\n\t\t\t\t\tthrow new Exception('failed to create file '.$dest);\n\t\t\t\t}\n\n\t\t\t\t// copy data\n\t\t\t\t$this->fseek($offset);\n\t\t\t\t$buffersize = ($this->data_string_flag ? $length : $this->getid3->fread_buffer_size());\n\t\t\t\t$bytesleft = $length;\n\t\t\t\twhile ($bytesleft > 0) {\n\t\t\t\t\tif (($buffer = $this->fread(min($buffersize, $bytesleft))) === false || ($byteswritten = fwrite($fp_dest, $buffer)) === false || ($byteswritten === 0)) {\n\t\t\t\t\t\tthrow new Exception($buffer === false ? 'not enough data to read' : 'failed to write to destination file, may be not enough disk space');\n\t\t\t\t\t}\n\t\t\t\t\t$bytesleft -= $byteswritten;\n\t\t\t\t}\n\n\t\t\t\tfclose($fp_dest);\n\t\t\t\t$attachment = $dest;\n\n\t\t\t}\n\n\t\t} catch (Exception $e) {\n\n\t\t\t// close and remove dest file if created\n\t\t\tif (isset($fp_dest) && is_resource($fp_dest)) {\n\t\t\t\tfclose($fp_dest);\n\t\t\t\tunlink($dest);\n\t\t\t}\n\n\t\t\t// do not set any is case of error\n\t\t\t$attachment = null;\n\t\t\t$this->warning('Failed to extract attachment '.$name.': '.$e->getMessage());\n\n\t\t}\n\n\t\t// seek to the end of attachment\n\t\t$this->fseek($offset + $length);\n\n\t\treturn $attachment;\n\t}\n\n}\n\n\nclass getid3_exception extends Exception\n{\n\tpublic $message;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/license.commercial.txt",
    "content": "                  getID3() Commercial License\n                  ===========================\n\ngetID3() is licensed under the \"GNU Public License\" (GPL) and/or the\n\"getID3() Commercial License\" (gCL). This document describes the gCL.\n\n---------------------------------------------------------------------\n\nThe license is non-exclusively granted to a single person or company,\nper payment of the license fee, for the lifetime of that person or\ncompany. The license is non-transferrable.\n\nThe gCL grants the licensee the right to use getID3() in commercial\nclosed-source projects. Modifications may be made to getID3() with no\nobligation to release the modified source code. getID3() (or pieces\nthereof) may be included in any number of projects authored (in whole\nor in part) by the licensee.\n\nThe licensee may use any version of getID3(), past, present or future,\nas is most convenient. This license does not entitle the licensee to\nreceive any technical support, updates or bugfixes, except as such are\nmade publicly available to all getID3() users.\n\nThe licensee may not sub-license getID3() itself, meaning that any\ncommercially released product containing all or parts of getID3() must\nhave added functionality beyond what is available in getID3();\ngetID3() itself may not be re-licensed by the licensee.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/license.txt",
    "content": "/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n\n*****************************************************************\n*****************************************************************\n\n   getID3() is released under multiple licenses. You may choose\n   from the following licenses, and use getID3 according to the\n   terms of the license most suitable to your project.\n\nGNU GPL: https://gnu.org/licenses/gpl.html                   (v3)\n         https://gnu.org/licenses/old-licenses/gpl-2.0.html  (v2)\n         https://gnu.org/licenses/old-licenses/gpl-1.0.html  (v1)\n\nGNU LGPL: https://gnu.org/licenses/lgpl.html                 (v3)\n\nMozilla MPL: http://www.mozilla.org/MPL/2.0/                 (v2)\n\ngetID3 Commercial License: http://getid3.org/#gCL (payment required)\n\n*****************************************************************\n*****************************************************************\n\nCopies of each of the above licenses are included in the 'licenses'\ndirectory of the getID3 distribution.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio-video.asf.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio-video.asf.php                                  //\n// module for analyzing ASF, WMA and WMV files                 //\n// dependencies: module.audio-video.riff.php                   //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);\n\nclass getid3_asf extends getid3_handler {\n\n\tpublic function __construct(getID3 $getid3) {\n\t\tparent::__construct($getid3);  // extends getid3_handler::__construct()\n\n\t\t// initialize all GUID constants\n\t\t$GUIDarray = $this->KnownGUIDs();\n\t\tforeach ($GUIDarray as $GUIDname => $hexstringvalue) {\n\t\t\tif (!defined($GUIDname)) {\n\t\t\t\tdefine($GUIDname, $this->GUIDtoBytestring($hexstringvalue));\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t// Shortcuts\n\t\t$thisfile_audio = &$info['audio'];\n\t\t$thisfile_video = &$info['video'];\n\t\t$info['asf']  = array();\n\t\t$thisfile_asf = &$info['asf'];\n\t\t$thisfile_asf['comments'] = array();\n\t\t$thisfile_asf_comments    = &$thisfile_asf['comments'];\n\t\t$thisfile_asf['header_object'] = array();\n\t\t$thisfile_asf_headerobject     = &$thisfile_asf['header_object'];\n\n\n\t\t// ASF structure:\n\t\t// * Header Object [required]\n\t\t//   * File Properties Object [required]   (global file attributes)\n\t\t//   * Stream Properties Object [required] (defines media stream & characteristics)\n\t\t//   * Header Extension Object [required]  (additional functionality)\n\t\t//   * Content Description Object          (bibliographic information)\n\t\t//   * Script Command Object               (commands for during playback)\n\t\t//   * Marker Object                       (named jumped points within the file)\n\t\t// * Data Object [required]\n\t\t//   * Data Packets\n\t\t// * Index Object\n\n\t\t// Header Object: (mandatory, one only)\n\t\t// Field Name                   Field Type   Size (bits)\n\t\t// Object ID                    GUID         128             // GUID for header object - GETID3_ASF_Header_Object\n\t\t// Object Size                  QWORD        64              // size of header object, including 30 bytes of Header Object header\n\t\t// Number of Header Objects     DWORD        32              // number of objects in header object\n\t\t// Reserved1                    BYTE         8               // hardcoded: 0x01\n\t\t// Reserved2                    BYTE         8               // hardcoded: 0x02\n\n\t\t$info['fileformat'] = 'asf';\n\n\t\t$this->fseek($info['avdataoffset']);\n\t\t$HeaderObjectData = $this->fread(30);\n\n\t\t$thisfile_asf_headerobject['objectid']      = substr($HeaderObjectData, 0, 16);\n\t\t$thisfile_asf_headerobject['objectid_guid'] = $this->BytestringToGUID($thisfile_asf_headerobject['objectid']);\n\t\tif ($thisfile_asf_headerobject['objectid'] != GETID3_ASF_Header_Object) {\n\t\t\tunset($info['fileformat'], $info['asf']);\n\t\t\treturn $this->error('ASF header GUID {'.$this->BytestringToGUID($thisfile_asf_headerobject['objectid']).'} does not match expected \"GETID3_ASF_Header_Object\" GUID {'.$this->BytestringToGUID(GETID3_ASF_Header_Object).'}');\n\t\t}\n\t\t$thisfile_asf_headerobject['objectsize']    = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 16, 8));\n\t\t$thisfile_asf_headerobject['headerobjects'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 24, 4));\n\t\t$thisfile_asf_headerobject['reserved1']     = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 28, 1));\n\t\t$thisfile_asf_headerobject['reserved2']     = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 29, 1));\n\n\t\t$NextObjectOffset = $this->ftell();\n\t\t$ASFHeaderData = $this->fread($thisfile_asf_headerobject['objectsize'] - 30);\n\t\t$offset = 0;\n\n\t\tfor ($HeaderObjectsCounter = 0; $HeaderObjectsCounter < $thisfile_asf_headerobject['headerobjects']; $HeaderObjectsCounter++) {\n\t\t\t$NextObjectGUID = substr($ASFHeaderData, $offset, 16);\n\t\t\t$offset += 16;\n\t\t\t$NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID);\n\t\t\t$NextObjectSize = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t$offset += 8;\n\t\t\tswitch ($NextObjectGUID) {\n\n\t\t\t\tcase GETID3_ASF_File_Properties_Object:\n\t\t\t\t\t// File Properties Object: (mandatory, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for file properties object - GETID3_ASF_File_Properties_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of file properties object, including 104 bytes of File Properties Object header\n\t\t\t\t\t// File ID                      GUID         128             // unique ID - identical to File ID in Data Object\n\t\t\t\t\t// File Size                    QWORD        64              // entire file in bytes. Invalid if Broadcast Flag == 1\n\t\t\t\t\t// Creation Date                QWORD        64              // date & time of file creation. Maybe invalid if Broadcast Flag == 1\n\t\t\t\t\t// Data Packets Count           QWORD        64              // number of data packets in Data Object. Invalid if Broadcast Flag == 1\n\t\t\t\t\t// Play Duration                QWORD        64              // playtime, in 100-nanosecond units. Invalid if Broadcast Flag == 1\n\t\t\t\t\t// Send Duration                QWORD        64              // time needed to send file, in 100-nanosecond units. Players can ignore this value. Invalid if Broadcast Flag == 1\n\t\t\t\t\t// Preroll                      QWORD        64              // time to buffer data before starting to play file, in 1-millisecond units. If <> 0, PlayDuration and PresentationTime have been offset by this amount\n\t\t\t\t\t// Flags                        DWORD        32              //\n\t\t\t\t\t// * Broadcast Flag             bits         1  (0x01)       // file is currently being written, some header values are invalid\n\t\t\t\t\t// * Seekable Flag              bits         1  (0x02)       // is file seekable\n\t\t\t\t\t// * Reserved                   bits         30 (0xFFFFFFFC) // reserved - set to zero\n\t\t\t\t\t// Minimum Data Packet Size     DWORD        32              // in bytes. should be same as Maximum Data Packet Size. Invalid if Broadcast Flag == 1\n\t\t\t\t\t// Maximum Data Packet Size     DWORD        32              // in bytes. should be same as Minimum Data Packet Size. Invalid if Broadcast Flag == 1\n\t\t\t\t\t// Maximum Bitrate              DWORD        32              // maximum instantaneous bitrate in bits per second for entire file, including all data streams and ASF overhead\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['file_properties_object'] = array();\n\t\t\t\t\t$thisfile_asf_filepropertiesobject      = &$thisfile_asf['file_properties_object'];\n\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['offset']             = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['objectid']           = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['objectid_guid']      = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['objectsize']         = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['fileid']             = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['fileid_guid']        = $this->BytestringToGUID($thisfile_asf_filepropertiesobject['fileid']);\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['filesize']           = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['creation_date']      = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['creation_date_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_filepropertiesobject['creation_date']);\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['data_packets']       = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['play_duration']      = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['send_duration']      = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['preroll']            = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['flags_raw']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['flags']['broadcast'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0001);\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['flags']['seekable']  = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0002);\n\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['min_packet_size']    = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['max_packet_size']    = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$thisfile_asf_filepropertiesobject['max_bitrate']        = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\tif ($thisfile_asf_filepropertiesobject['flags']['broadcast']) {\n\n\t\t\t\t\t\t// broadcast flag is set, some values invalid\n\t\t\t\t\t\tunset($thisfile_asf_filepropertiesobject['filesize']);\n\t\t\t\t\t\tunset($thisfile_asf_filepropertiesobject['data_packets']);\n\t\t\t\t\t\tunset($thisfile_asf_filepropertiesobject['play_duration']);\n\t\t\t\t\t\tunset($thisfile_asf_filepropertiesobject['send_duration']);\n\t\t\t\t\t\tunset($thisfile_asf_filepropertiesobject['min_packet_size']);\n\t\t\t\t\t\tunset($thisfile_asf_filepropertiesobject['max_packet_size']);\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// broadcast flag NOT set, perform calculations\n\t\t\t\t\t\t$info['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000);\n\n\t\t\t\t\t\t//$info['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate'];\n\t\t\t\t\t\t$info['bitrate'] = ((isset($thisfile_asf_filepropertiesobject['filesize']) ? $thisfile_asf_filepropertiesobject['filesize'] : $info['filesize']) * 8) / $info['playtime_seconds'];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Stream_Properties_Object:\n\t\t\t\t\t// Stream Properties Object: (mandatory, one per media stream)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for stream properties object - GETID3_ASF_Stream_Properties_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of stream properties object, including 78 bytes of Stream Properties Object header\n\t\t\t\t\t// Stream Type                  GUID         128             // GETID3_ASF_Audio_Media, GETID3_ASF_Video_Media or GETID3_ASF_Command_Media\n\t\t\t\t\t// Error Correction Type        GUID         128             // GETID3_ASF_Audio_Spread for audio-only streams, GETID3_ASF_No_Error_Correction for other stream types\n\t\t\t\t\t// Time Offset                  QWORD        64              // 100-nanosecond units. typically zero. added to all timestamps of samples in the stream\n\t\t\t\t\t// Type-Specific Data Length    DWORD        32              // number of bytes for Type-Specific Data field\n\t\t\t\t\t// Error Correction Data Length DWORD        32              // number of bytes for Error Correction Data field\n\t\t\t\t\t// Flags                        WORD         16              //\n\t\t\t\t\t// * Stream Number              bits         7 (0x007F)      // number of this stream.  1 <= valid <= 127\n\t\t\t\t\t// * Reserved                   bits         8 (0x7F80)      // reserved - set to zero\n\t\t\t\t\t// * Encrypted Content Flag     bits         1 (0x8000)      // stream contents encrypted if set\n\t\t\t\t\t// Reserved                     DWORD        32              // reserved - set to zero\n\t\t\t\t\t// Type-Specific Data           BYTESTREAM   variable        // type-specific format data, depending on value of Stream Type\n\t\t\t\t\t// Error Correction Data        BYTESTREAM   variable        // error-correction-specific format data, depending on value of Error Correct Type\n\n\t\t\t\t\t// There is one GETID3_ASF_Stream_Properties_Object for each stream (audio, video) but the\n\t\t\t\t\t// stream number isn't known until halfway through decoding the structure, hence it\n\t\t\t\t\t// it is decoded to a temporary variable and then stuck in the appropriate index later\n\n\t\t\t\t\t$StreamPropertiesObjectData['offset']             = $NextObjectOffset + $offset;\n\t\t\t\t\t$StreamPropertiesObjectData['objectid']           = $NextObjectGUID;\n\t\t\t\t\t$StreamPropertiesObjectData['objectid_guid']      = $NextObjectGUIDtext;\n\t\t\t\t\t$StreamPropertiesObjectData['objectsize']         = $NextObjectSize;\n\t\t\t\t\t$StreamPropertiesObjectData['stream_type']        = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$StreamPropertiesObjectData['stream_type_guid']   = $this->BytestringToGUID($StreamPropertiesObjectData['stream_type']);\n\t\t\t\t\t$StreamPropertiesObjectData['error_correct_type'] = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$StreamPropertiesObjectData['error_correct_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['error_correct_type']);\n\t\t\t\t\t$StreamPropertiesObjectData['time_offset']        = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$StreamPropertiesObjectData['type_data_length']   = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$StreamPropertiesObjectData['error_data_length']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$StreamPropertiesObjectData['flags_raw']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$StreamPropertiesObjectStreamNumber               = $StreamPropertiesObjectData['flags_raw'] & 0x007F;\n\t\t\t\t\t$StreamPropertiesObjectData['flags']['encrypted'] = (bool) ($StreamPropertiesObjectData['flags_raw'] & 0x8000);\n\n\t\t\t\t\t$offset += 4; // reserved - DWORD\n\t\t\t\t\t$StreamPropertiesObjectData['type_specific_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['type_data_length']);\n\t\t\t\t\t$offset += $StreamPropertiesObjectData['type_data_length'];\n\t\t\t\t\t$StreamPropertiesObjectData['error_correct_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['error_data_length']);\n\t\t\t\t\t$offset += $StreamPropertiesObjectData['error_data_length'];\n\n\t\t\t\t\tswitch ($StreamPropertiesObjectData['stream_type']) {\n\n\t\t\t\t\t\tcase GETID3_ASF_Audio_Media:\n\t\t\t\t\t\t\t$thisfile_audio['dataformat']   = (!empty($thisfile_audio['dataformat'])   ? $thisfile_audio['dataformat']   : 'asf');\n\t\t\t\t\t\t\t$thisfile_audio['bitrate_mode'] = (!empty($thisfile_audio['bitrate_mode']) ? $thisfile_audio['bitrate_mode'] : 'cbr');\n\n\t\t\t\t\t\t\t$audiodata = getid3_riff::parseWAVEFORMATex(substr($StreamPropertiesObjectData['type_specific_data'], 0, 16));\n\t\t\t\t\t\t\tunset($audiodata['raw']);\n\t\t\t\t\t\t\t$thisfile_audio = getid3_lib::array_merge_noclobber($audiodata, $thisfile_audio);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GETID3_ASF_Video_Media:\n\t\t\t\t\t\t\t$thisfile_video['dataformat']   = (!empty($thisfile_video['dataformat'])   ? $thisfile_video['dataformat']   : 'asf');\n\t\t\t\t\t\t\t$thisfile_video['bitrate_mode'] = (!empty($thisfile_video['bitrate_mode']) ? $thisfile_video['bitrate_mode'] : 'cbr');\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GETID3_ASF_Command_Media:\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// do nothing\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t$thisfile_asf['stream_properties_object'][$StreamPropertiesObjectStreamNumber] = $StreamPropertiesObjectData;\n\t\t\t\t\tunset($StreamPropertiesObjectData); // clear for next stream, if any\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Header_Extension_Object:\n\t\t\t\t\t// Header Extension Object: (mandatory, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Header Extension object - GETID3_ASF_Header_Extension_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Header Extension object, including 46 bytes of Header Extension Object header\n\t\t\t\t\t// Reserved Field 1             GUID         128             // hardcoded: GETID3_ASF_Reserved_1\n\t\t\t\t\t// Reserved Field 2             WORD         16              // hardcoded: 0x00000006\n\t\t\t\t\t// Header Extension Data Size   DWORD        32              // in bytes. valid: 0, or > 24. equals object size minus 46\n\t\t\t\t\t// Header Extension Data        BYTESTREAM   variable        // array of zero or more extended header objects\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['header_extension_object'] = array();\n\t\t\t\t\t$thisfile_asf_headerextensionobject      = &$thisfile_asf['header_extension_object'];\n\n\t\t\t\t\t$thisfile_asf_headerextensionobject['offset']              = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_headerextensionobject['objectid']            = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_headerextensionobject['objectid_guid']       = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_headerextensionobject['objectsize']          = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_headerextensionobject['reserved_1']          = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$thisfile_asf_headerextensionobject['reserved_1_guid']     = $this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']);\n\t\t\t\t\tif ($thisfile_asf_headerextensionobject['reserved_1'] != GETID3_ASF_Reserved_1) {\n\t\t\t\t\t\t$info['warning'][] = 'header_extension_object.reserved_1 GUID ('.$this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']).') does not match expected \"GETID3_ASF_Reserved_1\" GUID ('.$this->BytestringToGUID(GETID3_ASF_Reserved_1).')';\n\t\t\t\t\t\t//return false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_asf_headerextensionobject['reserved_2']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\tif ($thisfile_asf_headerextensionobject['reserved_2'] != 6) {\n\t\t\t\t\t\t$info['warning'][] = 'header_extension_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_headerextensionobject['reserved_2']).') does not match expected value of \"6\"';\n\t\t\t\t\t\t//return false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_asf_headerextensionobject['extension_data_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$thisfile_asf_headerextensionobject['extension_data']      =                              substr($ASFHeaderData, $offset, $thisfile_asf_headerextensionobject['extension_data_size']);\n\t\t\t\t\t$unhandled_sections = 0;\n\t\t\t\t\t$thisfile_asf_headerextensionobject['extension_data_parsed'] = $this->HeaderExtensionObjectDataParse($thisfile_asf_headerextensionobject['extension_data'], $unhandled_sections);\n\t\t\t\t\tif ($unhandled_sections === 0) {\n\t\t\t\t\t\tunset($thisfile_asf_headerextensionobject['extension_data']);\n\t\t\t\t\t}\n\t\t\t\t\t$offset += $thisfile_asf_headerextensionobject['extension_data_size'];\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Codec_List_Object:\n\t\t\t\t\t// Codec List Object: (optional, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Codec List object - GETID3_ASF_Codec_List_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Codec List object, including 44 bytes of Codec List Object header\n\t\t\t\t\t// Reserved                     GUID         128             // hardcoded: 86D15241-311D-11D0-A3A4-00A0C90348F6\n\t\t\t\t\t// Codec Entries Count          DWORD        32              // number of entries in Codec Entries array\n\t\t\t\t\t// Codec Entries                array of:    variable        //\n\t\t\t\t\t// * Type                       WORD         16              // 0x0001 = Video Codec, 0x0002 = Audio Codec, 0xFFFF = Unknown Codec\n\t\t\t\t\t// * Codec Name Length          WORD         16              // number of Unicode characters stored in the Codec Name field\n\t\t\t\t\t// * Codec Name                 WCHAR        variable        // array of Unicode characters - name of codec used to create the content\n\t\t\t\t\t// * Codec Description Length   WORD         16              // number of Unicode characters stored in the Codec Description field\n\t\t\t\t\t// * Codec Description          WCHAR        variable        // array of Unicode characters - description of format used to create the content\n\t\t\t\t\t// * Codec Information Length   WORD         16              // number of Unicode characters stored in the Codec Information field\n\t\t\t\t\t// * Codec Information          BYTESTREAM   variable        // opaque array of information bytes about the codec used to create the content\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['codec_list_object'] = array();\n\t\t\t\t\t$thisfile_asf_codeclistobject      = &$thisfile_asf['codec_list_object'];\n\n\t\t\t\t\t$thisfile_asf_codeclistobject['offset']                    = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_codeclistobject['objectid']                  = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_codeclistobject['objectid_guid']             = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_codeclistobject['objectsize']                = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_codeclistobject['reserved']                  = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$thisfile_asf_codeclistobject['reserved_guid']             = $this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']);\n\t\t\t\t\tif ($thisfile_asf_codeclistobject['reserved'] != $this->GUIDtoBytestring('86D15241-311D-11D0-A3A4-00A0C90348F6')) {\n\t\t\t\t\t\t$info['warning'][] = 'codec_list_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']).'} does not match expected \"GETID3_ASF_Reserved_1\" GUID {86D15241-311D-11D0-A3A4-00A0C90348F6}';\n\t\t\t\t\t\t//return false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_asf_codeclistobject['codec_entries_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\tfor ($CodecEntryCounter = 0; $CodecEntryCounter < $thisfile_asf_codeclistobject['codec_entries_count']; $CodecEntryCounter++) {\n\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter] = array();\n\t\t\t\t\t\t$thisfile_asf_codeclistobject_codecentries_current = &$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter];\n\n\t\t\t\t\t\t$thisfile_asf_codeclistobject_codecentries_current['type_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_codeclistobject_codecentries_current['type'] = self::codecListObjectTypeLookup($thisfile_asf_codeclistobject_codecentries_current['type_raw']);\n\n\t\t\t\t\t\t$CodecNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_codeclistobject_codecentries_current['name'] = substr($ASFHeaderData, $offset, $CodecNameLength);\n\t\t\t\t\t\t$offset += $CodecNameLength;\n\n\t\t\t\t\t\t$CodecDescriptionLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_codeclistobject_codecentries_current['description'] = substr($ASFHeaderData, $offset, $CodecDescriptionLength);\n\t\t\t\t\t\t$offset += $CodecDescriptionLength;\n\n\t\t\t\t\t\t$CodecInformationLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_codeclistobject_codecentries_current['information'] = substr($ASFHeaderData, $offset, $CodecInformationLength);\n\t\t\t\t\t\t$offset += $CodecInformationLength;\n\n\t\t\t\t\t\tif ($thisfile_asf_codeclistobject_codecentries_current['type_raw'] == 2) { // audio codec\n\n\t\t\t\t\t\t\tif (strpos($thisfile_asf_codeclistobject_codecentries_current['description'], ',') === false) {\n\t\t\t\t\t\t\t\t$info['warning'][] = '[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-seperated list of parameters: \"'.$thisfile_asf_codeclistobject_codecentries_current['description'].'\"';\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tlist($AudioCodecBitrate, $AudioCodecFrequency, $AudioCodecChannels) = explode(',', $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']));\n\t\t\t\t\t\t\t\t$thisfile_audio['codec'] = $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['name']);\n\n\t\t\t\t\t\t\t\tif (!isset($thisfile_audio['bitrate']) && strstr($AudioCodecBitrate, 'kbps')) {\n\t\t\t\t\t\t\t\t\t$thisfile_audio['bitrate'] = (int) (trim(str_replace('kbps', '', $AudioCodecBitrate)) * 1000);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) {\n\t\t\t\t\t\t\t\tif (empty($thisfile_video['bitrate']) && !empty($thisfile_audio['bitrate']) && !empty($info['bitrate'])) {\n\t\t\t\t\t\t\t\t\t//$thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate'];\n\t\t\t\t\t\t\t\t\t$thisfile_video['bitrate'] = $info['bitrate'] - $thisfile_audio['bitrate'];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t$AudioCodecFrequency = (int) trim(str_replace('kHz', '', $AudioCodecFrequency));\n\t\t\t\t\t\t\t\tswitch ($AudioCodecFrequency) {\n\t\t\t\t\t\t\t\t\tcase 8:\n\t\t\t\t\t\t\t\t\tcase 8000:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 8000;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 11:\n\t\t\t\t\t\t\t\t\tcase 11025:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 11025;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\t\t\tcase 12000:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 12000;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\t\t\tcase 16000:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 16000;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 22:\n\t\t\t\t\t\t\t\t\tcase 22050:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 22050;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 24:\n\t\t\t\t\t\t\t\t\tcase 24000:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 24000;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\t\t\tcase 32000:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 32000;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 44:\n\t\t\t\t\t\t\t\t\tcase 441000:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 44100;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 48:\n\t\t\t\t\t\t\t\t\tcase 48000:\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = 48000;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t$info['warning'][] = 'unknown frequency: \"'.$AudioCodecFrequency.'\" ('.$this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']).')';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!isset($thisfile_audio['channels'])) {\n\t\t\t\t\t\t\t\t\tif (strstr($AudioCodecChannels, 'stereo')) {\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['channels'] = 2;\n\t\t\t\t\t\t\t\t\t} elseif (strstr($AudioCodecChannels, 'mono')) {\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['channels'] = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Script_Command_Object:\n\t\t\t\t\t// Script Command Object: (optional, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Script Command object - GETID3_ASF_Script_Command_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Script Command object, including 44 bytes of Script Command Object header\n\t\t\t\t\t// Reserved                     GUID         128             // hardcoded: 4B1ACBE3-100B-11D0-A39B-00A0C90348F6\n\t\t\t\t\t// Commands Count               WORD         16              // number of Commands structures in the Script Commands Objects\n\t\t\t\t\t// Command Types Count          WORD         16              // number of Command Types structures in the Script Commands Objects\n\t\t\t\t\t// Command Types                array of:    variable        //\n\t\t\t\t\t// * Command Type Name Length   WORD         16              // number of Unicode characters for Command Type Name\n\t\t\t\t\t// * Command Type Name          WCHAR        variable        // array of Unicode characters - name of a type of command\n\t\t\t\t\t// Commands                     array of:    variable        //\n\t\t\t\t\t// * Presentation Time          DWORD        32              // presentation time of that command, in milliseconds\n\t\t\t\t\t// * Type Index                 WORD         16              // type of this command, as a zero-based index into the array of Command Types of this object\n\t\t\t\t\t// * Command Name Length        WORD         16              // number of Unicode characters for Command Name\n\t\t\t\t\t// * Command Name               WCHAR        variable        // array of Unicode characters - name of this command\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['script_command_object'] = array();\n\t\t\t\t\t$thisfile_asf_scriptcommandobject      = &$thisfile_asf['script_command_object'];\n\n\t\t\t\t\t$thisfile_asf_scriptcommandobject['offset']               = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_scriptcommandobject['objectid']             = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_scriptcommandobject['objectid_guid']        = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_scriptcommandobject['objectsize']           = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_scriptcommandobject['reserved']             = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$thisfile_asf_scriptcommandobject['reserved_guid']        = $this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']);\n\t\t\t\t\tif ($thisfile_asf_scriptcommandobject['reserved'] != $this->GUIDtoBytestring('4B1ACBE3-100B-11D0-A39B-00A0C90348F6')) {\n\t\t\t\t\t\t$info['warning'][] = 'script_command_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']).'} does not match expected \"GETID3_ASF_Reserved_1\" GUID {4B1ACBE3-100B-11D0-A39B-00A0C90348F6}';\n\t\t\t\t\t\t//return false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_asf_scriptcommandobject['commands_count']       = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$thisfile_asf_scriptcommandobject['command_types_count']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\tfor ($CommandTypesCounter = 0; $CommandTypesCounter < $thisfile_asf_scriptcommandobject['command_types_count']; $CommandTypesCounter++) {\n\t\t\t\t\t\t$CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_scriptcommandobject['command_types'][$CommandTypesCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength);\n\t\t\t\t\t\t$offset += $CommandTypeNameLength;\n\t\t\t\t\t}\n\t\t\t\t\tfor ($CommandsCounter = 0; $CommandsCounter < $thisfile_asf_scriptcommandobject['commands_count']; $CommandsCounter++) {\n\t\t\t\t\t\t$thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['presentation_time']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t\t$offset += 4;\n\t\t\t\t\t\t$thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['type_index']         = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength);\n\t\t\t\t\t\t$offset += $CommandTypeNameLength;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Marker_Object:\n\t\t\t\t\t// Marker Object: (optional, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Marker object - GETID3_ASF_Marker_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Marker object, including 48 bytes of Marker Object header\n\t\t\t\t\t// Reserved                     GUID         128             // hardcoded: 4CFEDB20-75F6-11CF-9C0F-00A0C90349CB\n\t\t\t\t\t// Markers Count                DWORD        32              // number of Marker structures in Marker Object\n\t\t\t\t\t// Reserved                     WORD         16              // hardcoded: 0x0000\n\t\t\t\t\t// Name Length                  WORD         16              // number of bytes in the Name field\n\t\t\t\t\t// Name                         WCHAR        variable        // name of the Marker Object\n\t\t\t\t\t// Markers                      array of:    variable        //\n\t\t\t\t\t// * Offset                     QWORD        64              // byte offset into Data Object\n\t\t\t\t\t// * Presentation Time          QWORD        64              // in 100-nanosecond units\n\t\t\t\t\t// * Entry Length               WORD         16              // length in bytes of (Send Time + Flags + Marker Description Length + Marker Description + Padding)\n\t\t\t\t\t// * Send Time                  DWORD        32              // in milliseconds\n\t\t\t\t\t// * Flags                      DWORD        32              // hardcoded: 0x00000000\n\t\t\t\t\t// * Marker Description Length  DWORD        32              // number of bytes in Marker Description field\n\t\t\t\t\t// * Marker Description         WCHAR        variable        // array of Unicode characters - description of marker entry\n\t\t\t\t\t// * Padding                    BYTESTREAM   variable        // optional padding bytes\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['marker_object'] = array();\n\t\t\t\t\t$thisfile_asf_markerobject     = &$thisfile_asf['marker_object'];\n\n\t\t\t\t\t$thisfile_asf_markerobject['offset']               = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_markerobject['objectid']             = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_markerobject['objectid_guid']        = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_markerobject['objectsize']           = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_markerobject['reserved']             = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$thisfile_asf_markerobject['reserved_guid']        = $this->BytestringToGUID($thisfile_asf_markerobject['reserved']);\n\t\t\t\t\tif ($thisfile_asf_markerobject['reserved'] != $this->GUIDtoBytestring('4CFEDB20-75F6-11CF-9C0F-00A0C90349CB')) {\n\t\t\t\t\t\t$info['warning'][] = 'marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved_1']).'} does not match expected \"GETID3_ASF_Reserved_1\" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_asf_markerobject['markers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$thisfile_asf_markerobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\tif ($thisfile_asf_markerobject['reserved_2'] != 0) {\n\t\t\t\t\t\t$info['warning'][] = 'marker_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_markerobject['reserved_2']).') does not match expected value of \"0\"';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_asf_markerobject['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$thisfile_asf_markerobject['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['name_length']);\n\t\t\t\t\t$offset += $thisfile_asf_markerobject['name_length'];\n\t\t\t\t\tfor ($MarkersCounter = 0; $MarkersCounter < $thisfile_asf_markerobject['markers_count']; $MarkersCounter++) {\n\t\t\t\t\t\t$thisfile_asf_markerobject['markers'][$MarkersCounter]['offset']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t\t$offset += 8;\n\t\t\t\t\t\t$thisfile_asf_markerobject['markers'][$MarkersCounter]['presentation_time']         = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8));\n\t\t\t\t\t\t$offset += 8;\n\t\t\t\t\t\t$thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length']              = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_markerobject['markers'][$MarkersCounter]['send_time']                 = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t\t$offset += 4;\n\t\t\t\t\t\t$thisfile_asf_markerobject['markers'][$MarkersCounter]['flags']                     = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t\t$offset += 4;\n\t\t\t\t\t\t$thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t\t$offset += 4;\n\t\t\t\t\t\t$thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description']        = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']);\n\t\t\t\t\t\t$offset += $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'];\n\t\t\t\t\t\t$PaddingLength = $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] - 4 -  4 - 4 - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'];\n\t\t\t\t\t\tif ($PaddingLength > 0) {\n\t\t\t\t\t\t\t$thisfile_asf_markerobject['markers'][$MarkersCounter]['padding']               = substr($ASFHeaderData, $offset, $PaddingLength);\n\t\t\t\t\t\t\t$offset += $PaddingLength;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Bitrate_Mutual_Exclusion_Object:\n\t\t\t\t\t// Bitrate Mutual Exclusion Object: (optional)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Bitrate Mutual Exclusion object - GETID3_ASF_Bitrate_Mutual_Exclusion_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Bitrate Mutual Exclusion object, including 42 bytes of Bitrate Mutual Exclusion Object header\n\t\t\t\t\t// Exlusion Type                GUID         128             // nature of mutual exclusion relationship. one of: (GETID3_ASF_Mutex_Bitrate, GETID3_ASF_Mutex_Unknown)\n\t\t\t\t\t// Stream Numbers Count         WORD         16              // number of video streams\n\t\t\t\t\t// Stream Numbers               WORD         variable        // array of mutually exclusive video stream numbers. 1 <= valid <= 127\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['bitrate_mutual_exclusion_object'] = array();\n\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject       = &$thisfile_asf['bitrate_mutual_exclusion_object'];\n\n\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject['offset']               = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject['objectid']             = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject['objectid_guid']        = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject['objectsize']           = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject['reserved']             = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject['reserved_guid']        = $this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\tif (($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Bitrate) && ($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Unknown)) {\n\t\t\t\t\t\t$info['warning'][] = 'bitrate_mutual_exclusion_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']).'} does not match expected \"GETID3_ASF_Mutex_Bitrate\" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Bitrate).'} or  \"GETID3_ASF_Mutex_Unknown\" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Unknown).'}';\n\t\t\t\t\t\t//return false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\tfor ($StreamNumberCounter = 0; $StreamNumberCounter < $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count']; $StreamNumberCounter++) {\n\t\t\t\t\t\t$thisfile_asf_bitratemutualexclusionobject['stream_numbers'][$StreamNumberCounter] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Error_Correction_Object:\n\t\t\t\t\t// Error Correction Object: (optional, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Error Correction object - GETID3_ASF_Error_Correction_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Error Correction object, including 44 bytes of Error Correction Object header\n\t\t\t\t\t// Error Correction Type        GUID         128             // type of error correction. one of: (GETID3_ASF_No_Error_Correction, GETID3_ASF_Audio_Spread)\n\t\t\t\t\t// Error Correction Data Length DWORD        32              // number of bytes in Error Correction Data field\n\t\t\t\t\t// Error Correction Data        BYTESTREAM   variable        // structure depends on value of Error Correction Type field\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['error_correction_object'] = array();\n\t\t\t\t\t$thisfile_asf_errorcorrectionobject      = &$thisfile_asf['error_correction_object'];\n\n\t\t\t\t\t$thisfile_asf_errorcorrectionobject['offset']                = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_errorcorrectionobject['objectid']              = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_errorcorrectionobject['objectid_guid']         = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_errorcorrectionobject['objectsize']            = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_errorcorrectionobject['error_correction_type'] = substr($ASFHeaderData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$thisfile_asf_errorcorrectionobject['error_correction_guid'] = $this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']);\n\t\t\t\t\t$thisfile_asf_errorcorrectionobject['error_correction_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\tswitch ($thisfile_asf_errorcorrectionobject['error_correction_type']) {\n\t\t\t\t\t\tcase GETID3_ASF_No_Error_Correction:\n\t\t\t\t\t\t\t// should be no data, but just in case there is, skip to the end of the field\n\t\t\t\t\t\t\t$offset += $thisfile_asf_errorcorrectionobject['error_correction_data_length'];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GETID3_ASF_Audio_Spread:\n\t\t\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t\t\t// Span                         BYTE         8               // number of packets over which audio will be spread.\n\t\t\t\t\t\t\t// Virtual Packet Length        WORD         16              // size of largest audio payload found in audio stream\n\t\t\t\t\t\t\t// Virtual Chunk Length         WORD         16              // size of largest audio payload found in audio stream\n\t\t\t\t\t\t\t// Silence Data Length          WORD         16              // number of bytes in Silence Data field\n\t\t\t\t\t\t\t// Silence Data                 BYTESTREAM   variable        // hardcoded: 0x00 * (Silence Data Length) bytes\n\n\t\t\t\t\t\t\t$thisfile_asf_errorcorrectionobject['span']                  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 1));\n\t\t\t\t\t\t\t$offset += 1;\n\t\t\t\t\t\t\t$thisfile_asf_errorcorrectionobject['virtual_packet_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t\t$thisfile_asf_errorcorrectionobject['virtual_chunk_length']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t\t$thisfile_asf_errorcorrectionobject['silence_data_length']   = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t\t$thisfile_asf_errorcorrectionobject['silence_data']          = substr($ASFHeaderData, $offset, $thisfile_asf_errorcorrectionobject['silence_data_length']);\n\t\t\t\t\t\t\t$offset += $thisfile_asf_errorcorrectionobject['silence_data_length'];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t$info['warning'][] = 'error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['reserved']).'} does not match expected \"GETID3_ASF_No_Error_Correction\" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or  \"GETID3_ASF_Audio_Spread\" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}';\n\t\t\t\t\t\t\t//return false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Content_Description_Object:\n\t\t\t\t\t// Content Description Object: (optional, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Content Description object - GETID3_ASF_Content_Description_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Content Description object, including 34 bytes of Content Description Object header\n\t\t\t\t\t// Title Length                 WORD         16              // number of bytes in Title field\n\t\t\t\t\t// Author Length                WORD         16              // number of bytes in Author field\n\t\t\t\t\t// Copyright Length             WORD         16              // number of bytes in Copyright field\n\t\t\t\t\t// Description Length           WORD         16              // number of bytes in Description field\n\t\t\t\t\t// Rating Length                WORD         16              // number of bytes in Rating field\n\t\t\t\t\t// Title                        WCHAR        16              // array of Unicode characters - Title\n\t\t\t\t\t// Author                       WCHAR        16              // array of Unicode characters - Author\n\t\t\t\t\t// Copyright                    WCHAR        16              // array of Unicode characters - Copyright\n\t\t\t\t\t// Description                  WCHAR        16              // array of Unicode characters - Description\n\t\t\t\t\t// Rating                       WCHAR        16              // array of Unicode characters - Rating\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['content_description_object'] = array();\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject      = &$thisfile_asf['content_description_object'];\n\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['offset']                = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['objectid']              = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['objectid_guid']         = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['objectsize']            = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['title_length']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['author_length']         = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['copyright_length']      = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['description_length']    = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['rating_length']         = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['title']                 = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['title_length']);\n\t\t\t\t\t$offset += $thisfile_asf_contentdescriptionobject['title_length'];\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['author']                = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['author_length']);\n\t\t\t\t\t$offset += $thisfile_asf_contentdescriptionobject['author_length'];\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['copyright']             = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['copyright_length']);\n\t\t\t\t\t$offset += $thisfile_asf_contentdescriptionobject['copyright_length'];\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['description']           = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['description_length']);\n\t\t\t\t\t$offset += $thisfile_asf_contentdescriptionobject['description_length'];\n\t\t\t\t\t$thisfile_asf_contentdescriptionobject['rating']                = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['rating_length']);\n\t\t\t\t\t$offset += $thisfile_asf_contentdescriptionobject['rating_length'];\n\n\t\t\t\t\t$ASFcommentKeysToCopy = array('title'=>'title', 'author'=>'artist', 'copyright'=>'copyright', 'description'=>'comment', 'rating'=>'rating');\n\t\t\t\t\tforeach ($ASFcommentKeysToCopy as $keytocopyfrom => $keytocopyto) {\n\t\t\t\t\t\tif (!empty($thisfile_asf_contentdescriptionobject[$keytocopyfrom])) {\n\t\t\t\t\t\t\t$thisfile_asf_comments[$keytocopyto][] = $this->TrimTerm($thisfile_asf_contentdescriptionobject[$keytocopyfrom]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Extended_Content_Description_Object:\n\t\t\t\t\t// Extended Content Description Object: (optional, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Extended Content Description object - GETID3_ASF_Extended_Content_Description_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of ExtendedContent Description object, including 26 bytes of Extended Content Description Object header\n\t\t\t\t\t// Content Descriptors Count    WORD         16              // number of entries in Content Descriptors list\n\t\t\t\t\t// Content Descriptors          array of:    variable        //\n\t\t\t\t\t// * Descriptor Name Length     WORD         16              // size in bytes of Descriptor Name field\n\t\t\t\t\t// * Descriptor Name            WCHAR        variable        // array of Unicode characters - Descriptor Name\n\t\t\t\t\t// * Descriptor Value Data Type WORD         16              // Lookup array:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 0x0000 = Unicode String (variable length)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 0x0001 = BYTE array     (variable length)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 0x0002 = BOOL           (DWORD, 32 bits)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 0x0003 = DWORD          (DWORD, 32 bits)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 0x0004 = QWORD          (QWORD, 64 bits)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// 0x0005 = WORD           (WORD,  16 bits)\n\t\t\t\t\t// * Descriptor Value Length    WORD         16              // number of bytes stored in Descriptor Value field\n\t\t\t\t\t// * Descriptor Value           variable     variable        // value for Content Descriptor\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['extended_content_description_object'] = array();\n\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject       = &$thisfile_asf['extended_content_description_object'];\n\n\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject['offset']                    = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject['objectid']                  = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject['objectid_guid']             = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject['objectsize']                = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\tfor ($ExtendedContentDescriptorsCounter = 0; $ExtendedContentDescriptorsCounter < $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count']; $ExtendedContentDescriptorsCounter++) {\n\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter] = array();\n\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current                 = &$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter];\n\n\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['base_offset']  = $offset + 30;\n\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']  = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']         = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']);\n\t\t\t\t\t\t$offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length'];\n\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']   = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']        = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']);\n\t\t\t\t\t\t$offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'];\n\t\t\t\t\t\tswitch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) {\n\t\t\t\t\t\t\tcase 0x0000: // Unicode string\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x0001: // BYTE array\n\t\t\t\t\t\t\t\t// do nothing\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x0002: // BOOL\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = (bool) getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x0003: // DWORD\n\t\t\t\t\t\t\tcase 0x0004: // QWORD\n\t\t\t\t\t\t\tcase 0x0005: // WORD\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t$info['warning'][] = 'extended_content_description.content_descriptors.'.$ExtendedContentDescriptorsCounter.'.value_type is invalid ('.$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'].')';\n\t\t\t\t\t\t\t\t//return false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch ($this->TrimConvert(strtolower($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']))) {\n\n\t\t\t\t\t\t\tcase 'wm/albumartist':\n\t\t\t\t\t\t\tcase 'artist':\n\t\t\t\t\t\t\t\t// Note: not 'artist', that comes from 'author' tag\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['albumartist'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/albumtitle':\n\t\t\t\t\t\t\tcase 'album':\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['album']  = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/genre':\n\t\t\t\t\t\t\tcase 'genre':\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['genre'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/partofset':\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['partofset'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/tracknumber':\n\t\t\t\t\t\t\tcase 'tracknumber':\n\t\t\t\t\t\t\t\t// be careful casting to int: casting unicode strings to int gives unexpected results (stops parsing at first non-numeric character)\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['track'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\tforeach ($thisfile_asf_comments['track'] as $key => $value) {\n\t\t\t\t\t\t\t\t\tif (preg_match('/^[0-9\\x00]+$/', $value)) {\n\t\t\t\t\t\t\t\t\t\t$thisfile_asf_comments['track'][$key] = intval(str_replace(\"\\x00\", '', $value));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/track':\n\t\t\t\t\t\t\t\tif (empty($thisfile_asf_comments['track'])) {\n\t\t\t\t\t\t\t\t\t$thisfile_asf_comments['track'] = array(1 + $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/year':\n\t\t\t\t\t\t\tcase 'year':\n\t\t\t\t\t\t\tcase 'date':\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['year'] = array( $this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/lyrics':\n\t\t\t\t\t\t\tcase 'lyrics':\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['lyrics'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'isvbr':\n\t\t\t\t\t\t\t\tif ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']) {\n\t\t\t\t\t\t\t\t\t$thisfile_audio['bitrate_mode'] = 'vbr';\n\t\t\t\t\t\t\t\t\t$thisfile_video['bitrate_mode'] = 'vbr';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'id3':\n\t\t\t\t\t\t\t\t$this->getid3->include_module('tag.id3v2');\n\n\t\t\t\t\t\t\t\t$getid3_id3v2 = new getid3_id3v2($this->getid3);\n\t\t\t\t\t\t\t\t$getid3_id3v2->AnalyzeString($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);\n\t\t\t\t\t\t\t\tunset($getid3_id3v2);\n\n\t\t\t\t\t\t\t\tif ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] > 1024) {\n\t\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = '<value too large to display>';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/encodingtime':\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['encoding_time_unix'] = array($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix']);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'wm/picture':\n\t\t\t\t\t\t\t\t$WMpicture = $this->ASF_WMpicture($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);\n\t\t\t\t\t\t\t\tforeach ($WMpicture as $key => $value) {\n\t\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current[$key] = $value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tunset($WMpicture);\n/*\n\t\t\t\t\t\t\t\t$wm_picture_offset = 0;\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 1));\n\t\t\t\t\t\t\t\t$wm_picture_offset += 1;\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type']    = self::WMpictureTypeLookup($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id']);\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_size']    = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 4));\n\t\t\t\t\t\t\t\t$wm_picture_offset += 4;\n\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = '';\n\t\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\t\t$next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2);\n\t\t\t\t\t\t\t\t\t$wm_picture_offset += 2;\n\t\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] .= $next_byte_pair;\n\t\t\t\t\t\t\t\t} while ($next_byte_pair !== \"\\x00\\x00\");\n\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] = '';\n\t\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\t\t$next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2);\n\t\t\t\t\t\t\t\t\t$wm_picture_offset += 2;\n\t\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] .= $next_byte_pair;\n\t\t\t\t\t\t\t\t} while ($next_byte_pair !== \"\\x00\\x00\");\n\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['dataoffset'] = $wm_picture_offset;\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'] = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset);\n\t\t\t\t\t\t\t\tunset($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']);\n\n\t\t\t\t\t\t\t\t$imageinfo = array();\n\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = '';\n\t\t\t\t\t\t\t\t$imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], $imageinfo);\n\t\t\t\t\t\t\t\tunset($imageinfo);\n\t\t\t\t\t\t\t\tif (!empty($imagechunkcheck)) {\n\t\t\t\t\t\t\t\t\t$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!isset($thisfile_asf_comments['picture'])) {\n\t\t\t\t\t\t\t\t\t$thisfile_asf_comments['picture'] = array();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$thisfile_asf_comments['picture'][] = array('data'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], 'image_mime'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime']);\n*/\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tswitch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) {\n\t\t\t\t\t\t\t\t\tcase 0: // Unicode string\n\t\t\t\t\t\t\t\t\t\tif (substr($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']), 0, 3) == 'WM/') {\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_asf_comments[str_replace('wm/', '', strtolower($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'])))] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Stream_Bitrate_Properties_Object:\n\t\t\t\t\t// Stream Bitrate Properties Object: (optional, one only)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Stream Bitrate Properties object - GETID3_ASF_Stream_Bitrate_Properties_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Extended Content Description object, including 26 bytes of Stream Bitrate Properties Object header\n\t\t\t\t\t// Bitrate Records Count        WORD         16              // number of records in Bitrate Records\n\t\t\t\t\t// Bitrate Records              array of:    variable        //\n\t\t\t\t\t// * Flags                      WORD         16              //\n\t\t\t\t\t// * * Stream Number            bits         7  (0x007F)     // number of this stream\n\t\t\t\t\t// * * Reserved                 bits         9  (0xFF80)     // hardcoded: 0\n\t\t\t\t\t// * Average Bitrate            DWORD        32              // in bits per second\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['stream_bitrate_properties_object'] = array();\n\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject       = &$thisfile_asf['stream_bitrate_properties_object'];\n\n\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject['offset']                    = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject['objectid']                  = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject['objectid_guid']             = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject['objectsize']                = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject['bitrate_records_count']     = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\tfor ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) {\n\t\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F;\n\t\t\t\t\t\t$thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4));\n\t\t\t\t\t\t$offset += 4;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Padding_Object:\n\t\t\t\t\t// Padding Object: (optional)\n\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t// Object ID                    GUID         128             // GUID for Padding object - GETID3_ASF_Padding_Object\n\t\t\t\t\t// Object Size                  QWORD        64              // size of Padding object, including 24 bytes of ASF Padding Object header\n\t\t\t\t\t// Padding Data                 BYTESTREAM   variable        // ignore\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['padding_object'] = array();\n\t\t\t\t\t$thisfile_asf_paddingobject     = &$thisfile_asf['padding_object'];\n\n\t\t\t\t\t$thisfile_asf_paddingobject['offset']                    = $NextObjectOffset + $offset;\n\t\t\t\t\t$thisfile_asf_paddingobject['objectid']                  = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_paddingobject['objectid_guid']             = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_paddingobject['objectsize']                = $NextObjectSize;\n\t\t\t\t\t$thisfile_asf_paddingobject['padding_length']            = $thisfile_asf_paddingobject['objectsize'] - 16 - 8;\n\t\t\t\t\t$thisfile_asf_paddingobject['padding']                   = substr($ASFHeaderData, $offset, $thisfile_asf_paddingobject['padding_length']);\n\t\t\t\t\t$offset += ($NextObjectSize - 16 - 8);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Extended_Content_Encryption_Object:\n\t\t\t\tcase GETID3_ASF_Content_Encryption_Object:\n\t\t\t\t\t// WMA DRM - just ignore\n\t\t\t\t\t$offset += ($NextObjectSize - 16 - 8);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// Implementations shall ignore any standard or non-standard object that they do not know how to handle.\n\t\t\t\t\tif ($this->GUIDname($NextObjectGUIDtext)) {\n\t\t\t\t\t\t$info['warning'][] = 'unhandled GUID \"'.$this->GUIDname($NextObjectGUIDtext).'\" {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'unknown GUID {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8);\n\t\t\t\t\t}\n\t\t\t\t\t$offset += ($NextObjectSize - 16 - 8);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (isset($thisfile_asf_streambitrateproperties['bitrate_records_count'])) {\n\t\t\t$ASFbitrateAudio = 0;\n\t\t\t$ASFbitrateVideo = 0;\n\t\t\tfor ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitrateproperties['bitrate_records_count']; $BitrateRecordsCounter++) {\n\t\t\t\tif (isset($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter])) {\n\t\t\t\t\tswitch ($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter]['type_raw']) {\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t$ASFbitrateVideo += $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['bitrate'];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t$ASFbitrateAudio += $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['bitrate'];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// do nothing\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($ASFbitrateAudio > 0) {\n\t\t\t\t$thisfile_audio['bitrate'] = $ASFbitrateAudio;\n\t\t\t}\n\t\t\tif ($ASFbitrateVideo > 0) {\n\t\t\t\t$thisfile_video['bitrate'] = $ASFbitrateVideo;\n\t\t\t}\n\t\t}\n\t\tif (isset($thisfile_asf['stream_properties_object']) && is_array($thisfile_asf['stream_properties_object'])) {\n\n\t\t\t$thisfile_audio['bitrate'] = 0;\n\t\t\t$thisfile_video['bitrate'] = 0;\n\n\t\t\tforeach ($thisfile_asf['stream_properties_object'] as $streamnumber => $streamdata) {\n\n\t\t\t\tswitch ($streamdata['stream_type']) {\n\t\t\t\t\tcase GETID3_ASF_Audio_Media:\n\t\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t\t// Codec ID / Format Tag        WORD         16              // unique ID of audio codec - defined as wFormatTag field of WAVEFORMATEX structure\n\t\t\t\t\t\t// Number of Channels           WORD         16              // number of channels of audio - defined as nChannels field of WAVEFORMATEX structure\n\t\t\t\t\t\t// Samples Per Second           DWORD        32              // in Hertz - defined as nSamplesPerSec field of WAVEFORMATEX structure\n\t\t\t\t\t\t// Average number of Bytes/sec  DWORD        32              // bytes/sec of audio stream  - defined as nAvgBytesPerSec field of WAVEFORMATEX structure\n\t\t\t\t\t\t// Block Alignment              WORD         16              // block size in bytes of audio codec - defined as nBlockAlign field of WAVEFORMATEX structure\n\t\t\t\t\t\t// Bits per sample              WORD         16              // bits per sample of mono data. set to zero for variable bitrate codecs. defined as wBitsPerSample field of WAVEFORMATEX structure\n\t\t\t\t\t\t// Codec Specific Data Size     WORD         16              // size in bytes of Codec Specific Data buffer - defined as cbSize field of WAVEFORMATEX structure\n\t\t\t\t\t\t// Codec Specific Data          BYTESTREAM   variable        // array of codec-specific data bytes\n\n\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t$thisfile_asf['audio_media'][$streamnumber] = array();\n\t\t\t\t\t\t$thisfile_asf_audiomedia_currentstream      = &$thisfile_asf['audio_media'][$streamnumber];\n\n\t\t\t\t\t\t$audiomediaoffset = 0;\n\n\t\t\t\t\t\t$thisfile_asf_audiomedia_currentstream = getid3_riff::parseWAVEFORMATex(substr($streamdata['type_specific_data'], $audiomediaoffset, 16));\n\t\t\t\t\t\t$audiomediaoffset += 16;\n\n\t\t\t\t\t\t$thisfile_audio['lossless'] = false;\n\t\t\t\t\t\tswitch ($thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']) {\n\t\t\t\t\t\t\tcase 0x0001: // PCM\n\t\t\t\t\t\t\tcase 0x0163: // WMA9 Lossless\n\t\t\t\t\t\t\t\t$thisfile_audio['lossless'] = true;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) {\n\t\t\t\t\t\t\tforeach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {\n\t\t\t\t\t\t\t\tif (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) {\n\t\t\t\t\t\t\t\t\t$thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate'];\n\t\t\t\t\t\t\t\t\t$thisfile_audio['bitrate'] += $dataarray['bitrate'];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (!empty($thisfile_asf_audiomedia_currentstream['bytes_sec'])) {\n\t\t\t\t\t\t\t\t$thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8;\n\t\t\t\t\t\t\t} elseif (!empty($thisfile_asf_audiomedia_currentstream['bitrate'])) {\n\t\t\t\t\t\t\t\t$thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bitrate'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]                = $thisfile_asf_audiomedia_currentstream;\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['wformattag']  = $thisfile_asf_audiomedia_currentstream['raw']['wFormatTag'];\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['lossless']    = $thisfile_audio['lossless'];\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['bitrate']     = $thisfile_audio['bitrate'];\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['dataformat']  = 'wma';\n\t\t\t\t\t\tunset($thisfile_audio['streams'][$streamnumber]['raw']);\n\n\t\t\t\t\t\t$thisfile_asf_audiomedia_currentstream['codec_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $audiomediaoffset, 2));\n\t\t\t\t\t\t$audiomediaoffset += 2;\n\t\t\t\t\t\t$thisfile_asf_audiomedia_currentstream['codec_data']      = substr($streamdata['type_specific_data'], $audiomediaoffset, $thisfile_asf_audiomedia_currentstream['codec_data_size']);\n\t\t\t\t\t\t$audiomediaoffset += $thisfile_asf_audiomedia_currentstream['codec_data_size'];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase GETID3_ASF_Video_Media:\n\t\t\t\t\t\t// Field Name                   Field Type   Size (bits)\n\t\t\t\t\t\t// Encoded Image Width          DWORD        32              // width of image in pixels\n\t\t\t\t\t\t// Encoded Image Height         DWORD        32              // height of image in pixels\n\t\t\t\t\t\t// Reserved Flags               BYTE         8               // hardcoded: 0x02\n\t\t\t\t\t\t// Format Data Size             WORD         16              // size of Format Data field in bytes\n\t\t\t\t\t\t// Format Data                  array of:    variable        //\n\t\t\t\t\t\t// * Format Data Size           DWORD        32              // number of bytes in Format Data field, in bytes - defined as biSize field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Image Width                LONG         32              // width of encoded image in pixels - defined as biWidth field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Image Height               LONG         32              // height of encoded image in pixels - defined as biHeight field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Reserved                   WORD         16              // hardcoded: 0x0001 - defined as biPlanes field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Bits Per Pixel Count       WORD         16              // bits per pixel - defined as biBitCount field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Compression ID             FOURCC       32              // fourcc of video codec - defined as biCompression field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Image Size                 DWORD        32              // image size in bytes - defined as biSizeImage field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Horizontal Pixels / Meter  DWORD        32              // horizontal resolution of target device in pixels per meter - defined as biXPelsPerMeter field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Vertical Pixels / Meter    DWORD        32              // vertical resolution of target device in pixels per meter - defined as biYPelsPerMeter field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Colors Used Count          DWORD        32              // number of color indexes in the color table that are actually used - defined as biClrUsed field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Important Colors Count     DWORD        32              // number of color index required for displaying bitmap. if zero, all colors are required. defined as biClrImportant field of BITMAPINFOHEADER structure\n\t\t\t\t\t\t// * Codec Specific Data        BYTESTREAM   variable        // array of codec-specific data bytes\n\n\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t$thisfile_asf['video_media'][$streamnumber] = array();\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream      = &$thisfile_asf['video_media'][$streamnumber];\n\n\t\t\t\t\t\t$videomediaoffset = 0;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['image_width']                     = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['image_height']                    = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['flags']                           = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 1));\n\t\t\t\t\t\t$videomediaoffset += 1;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data_size']                = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2));\n\t\t\t\t\t\t$videomediaoffset += 2;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['image_width']      = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['image_height']     = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['reserved']         = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2));\n\t\t\t\t\t\t$videomediaoffset += 2;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel']   = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2));\n\t\t\t\t\t\t$videomediaoffset += 2;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']     = substr($streamdata['type_specific_data'], $videomediaoffset, 4);\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['image_size']       = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['horizontal_pels']  = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['vertical_pels']    = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['colors_used']      = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['colors_important'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4));\n\t\t\t\t\t\t$videomediaoffset += 4;\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['codec_data']       = substr($streamdata['type_specific_data'], $videomediaoffset);\n\n\t\t\t\t\t\tif (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) {\n\t\t\t\t\t\t\tforeach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) {\n\t\t\t\t\t\t\t\tif (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) {\n\t\t\t\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate'];\n\t\t\t\t\t\t\t\t\t$thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate'];\n\t\t\t\t\t\t\t\t\t$thisfile_video['bitrate'] += $dataarray['bitrate'];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$thisfile_asf_videomedia_currentstream['format_data']['codec'] = getid3_riff::fourccLookup($thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']);\n\n\t\t\t\t\t\t$thisfile_video['streams'][$streamnumber]['fourcc']          = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'];\n\t\t\t\t\t\t$thisfile_video['streams'][$streamnumber]['codec']           = $thisfile_asf_videomedia_currentstream['format_data']['codec'];\n\t\t\t\t\t\t$thisfile_video['streams'][$streamnumber]['resolution_x']    = $thisfile_asf_videomedia_currentstream['image_width'];\n\t\t\t\t\t\t$thisfile_video['streams'][$streamnumber]['resolution_y']    = $thisfile_asf_videomedia_currentstream['image_height'];\n\t\t\t\t\t\t$thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twhile ($this->ftell() < $info['avdataend']) {\n\t\t\t$NextObjectDataHeader = $this->fread(24);\n\t\t\t$offset = 0;\n\t\t\t$NextObjectGUID = substr($NextObjectDataHeader, 0, 16);\n\t\t\t$offset += 16;\n\t\t\t$NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID);\n\t\t\t$NextObjectSize = getid3_lib::LittleEndian2Int(substr($NextObjectDataHeader, $offset, 8));\n\t\t\t$offset += 8;\n\n\t\t\tswitch ($NextObjectGUID) {\n\t\t\t\tcase GETID3_ASF_Data_Object:\n\t\t\t\t\t// Data Object: (mandatory, one only)\n\t\t\t\t\t// Field Name                       Field Type   Size (bits)\n\t\t\t\t\t// Object ID                        GUID         128             // GUID for Data object - GETID3_ASF_Data_Object\n\t\t\t\t\t// Object Size                      QWORD        64              // size of Data object, including 50 bytes of Data Object header. may be 0 if FilePropertiesObject.BroadcastFlag == 1\n\t\t\t\t\t// File ID                          GUID         128             // unique identifier. identical to File ID field in Header Object\n\t\t\t\t\t// Total Data Packets               QWORD        64              // number of Data Packet entries in Data Object. invalid if FilePropertiesObject.BroadcastFlag == 1\n\t\t\t\t\t// Reserved                         WORD         16              // hardcoded: 0x0101\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['data_object'] = array();\n\t\t\t\t\t$thisfile_asf_dataobject     = &$thisfile_asf['data_object'];\n\n\t\t\t\t\t$DataObjectData = $NextObjectDataHeader.$this->fread(50 - 24);\n\t\t\t\t\t$offset = 24;\n\n\t\t\t\t\t$thisfile_asf_dataobject['objectid']           = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_dataobject['objectid_guid']      = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_dataobject['objectsize']         = $NextObjectSize;\n\n\t\t\t\t\t$thisfile_asf_dataobject['fileid']             = substr($DataObjectData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$thisfile_asf_dataobject['fileid_guid']        = $this->BytestringToGUID($thisfile_asf_dataobject['fileid']);\n\t\t\t\t\t$thisfile_asf_dataobject['total_data_packets'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisfile_asf_dataobject['reserved']           = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\tif ($thisfile_asf_dataobject['reserved'] != 0x0101) {\n\t\t\t\t\t\t$info['warning'][] = 'data_object.reserved ('.getid3_lib::PrintHexBytes($thisfile_asf_dataobject['reserved']).') does not match expected value of \"0x0101\"';\n\t\t\t\t\t\t//return false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Data Packets                     array of:    variable        //\n\t\t\t\t\t// * Error Correction Flags         BYTE         8               //\n\t\t\t\t\t// * * Error Correction Data Length bits         4               // if Error Correction Length Type == 00, size of Error Correction Data in bytes, else hardcoded: 0000\n\t\t\t\t\t// * * Opaque Data Present          bits         1               //\n\t\t\t\t\t// * * Error Correction Length Type bits         2               // number of bits for size of the error correction data. hardcoded: 00\n\t\t\t\t\t// * * Error Correction Present     bits         1               // If set, use Opaque Data Packet structure, else use Payload structure\n\t\t\t\t\t// * Error Correction Data\n\n\t\t\t\t\t$info['avdataoffset'] = $this->ftell();\n\t\t\t\t\t$this->fseek(($thisfile_asf_dataobject['objectsize'] - 50), SEEK_CUR); // skip actual audio/video data\n\t\t\t\t\t$info['avdataend'] = $this->ftell();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Simple_Index_Object:\n\t\t\t\t\t// Simple Index Object: (optional, recommended, one per video stream)\n\t\t\t\t\t// Field Name                       Field Type   Size (bits)\n\t\t\t\t\t// Object ID                        GUID         128             // GUID for Simple Index object - GETID3_ASF_Data_Object\n\t\t\t\t\t// Object Size                      QWORD        64              // size of Simple Index object, including 56 bytes of Simple Index Object header\n\t\t\t\t\t// File ID                          GUID         128             // unique identifier. may be zero or identical to File ID field in Data Object and Header Object\n\t\t\t\t\t// Index Entry Time Interval        QWORD        64              // interval between index entries in 100-nanosecond units\n\t\t\t\t\t// Maximum Packet Count             DWORD        32              // maximum packet count for all index entries\n\t\t\t\t\t// Index Entries Count              DWORD        32              // number of Index Entries structures\n\t\t\t\t\t// Index Entries                    array of:    variable        //\n\t\t\t\t\t// * Packet Number                  DWORD        32              // number of the Data Packet associated with this index entry\n\t\t\t\t\t// * Packet Count                   WORD         16              // number of Data Packets to sent at this index entry\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['simple_index_object'] = array();\n\t\t\t\t\t$thisfile_asf_simpleindexobject      = &$thisfile_asf['simple_index_object'];\n\n\t\t\t\t\t$SimpleIndexObjectData = $NextObjectDataHeader.$this->fread(56 - 24);\n\t\t\t\t\t$offset = 24;\n\n\t\t\t\t\t$thisfile_asf_simpleindexobject['objectid']                  = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_simpleindexobject['objectid_guid']             = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_simpleindexobject['objectsize']                = $NextObjectSize;\n\n\t\t\t\t\t$thisfile_asf_simpleindexobject['fileid']                    =                  substr($SimpleIndexObjectData, $offset, 16);\n\t\t\t\t\t$offset += 16;\n\t\t\t\t\t$thisfile_asf_simpleindexobject['fileid_guid']               = $this->BytestringToGUID($thisfile_asf_simpleindexobject['fileid']);\n\t\t\t\t\t$thisfile_asf_simpleindexobject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisfile_asf_simpleindexobject['maximum_packet_count']      = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$thisfile_asf_simpleindexobject['index_entries_count']       = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$IndexEntriesData = $SimpleIndexObjectData.$this->fread(6 * $thisfile_asf_simpleindexobject['index_entries_count']);\n\t\t\t\t\tfor ($IndexEntriesCounter = 0; $IndexEntriesCounter < $thisfile_asf_simpleindexobject['index_entries_count']; $IndexEntriesCounter++) {\n\t\t\t\t\t\t$thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_number'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4));\n\t\t\t\t\t\t$offset += 4;\n\t\t\t\t\t\t$thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_count']  = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Index_Object:\n\t\t\t\t\t// 6.2 ASF top-level Index Object (optional but recommended when appropriate, 0 or 1)\n\t\t\t\t\t// Field Name                       Field Type   Size (bits)\n\t\t\t\t\t// Object ID                        GUID         128             // GUID for the Index Object - GETID3_ASF_Index_Object\n\t\t\t\t\t// Object Size                      QWORD        64              // Specifies the size, in bytes, of the Index Object, including at least 34 bytes of Index Object header\n\t\t\t\t\t// Index Entry Time Interval        DWORD        32              // Specifies the time interval between each index entry in ms.\n\t\t\t\t\t// Index Specifiers Count           WORD         16              // Specifies the number of Index Specifiers structures in this Index Object.\n\t\t\t\t\t// Index Blocks Count               DWORD        32              // Specifies the number of Index Blocks structures in this Index Object.\n\n\t\t\t\t\t// Index Entry Time Interval        DWORD        32              // Specifies the time interval between index entries in milliseconds.  This value cannot be 0.\n\t\t\t\t\t// Index Specifiers Count           WORD         16              // Specifies the number of entries in the Index Specifiers list.  Valid values are 1 and greater.\n\t\t\t\t\t// Index Specifiers                 array of:    varies          //\n\t\t\t\t\t// * Stream Number                  WORD         16              // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127.\n\t\t\t\t\t// * Index Type                     WORD         16              // Specifies Index Type values as follows:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//   1 = Nearest Past Data Packet - indexes point to the data packet whose presentation time is closest to the index entry time.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//   2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire object or first fragment of an object.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//   3 = Nearest Past Cleanpoint. - indexes point to the closest data packet containing an entire object (or first fragment of an object) that has the Cleanpoint Flag set.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//   Nearest Past Cleanpoint is the most common type of index.\n\t\t\t\t\t// Index Entry Count                DWORD        32              // Specifies the number of Index Entries in the block.\n\t\t\t\t\t// * Block Positions                QWORD        varies          // Specifies a list of byte offsets of the beginnings of the blocks relative to the beginning of the first Data Packet (i.e., the beginning of the Data Object + 50 bytes). The number of entries in this list is specified by the value of the Index Specifiers Count field. The order of those byte offsets is tied to the order in which Index Specifiers are listed.\n\t\t\t\t\t// * Index Entries                  array of:    varies          //\n\t\t\t\t\t// * * Offsets                      DWORD        varies          // An offset value of 0xffffffff indicates an invalid offset value\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_asf['asf_index_object'] = array();\n\t\t\t\t\t$thisfile_asf_asfindexobject      = &$thisfile_asf['asf_index_object'];\n\n\t\t\t\t\t$ASFIndexObjectData = $NextObjectDataHeader.$this->fread(34 - 24);\n\t\t\t\t\t$offset = 24;\n\n\t\t\t\t\t$thisfile_asf_asfindexobject['objectid']                  = $NextObjectGUID;\n\t\t\t\t\t$thisfile_asf_asfindexobject['objectid_guid']             = $NextObjectGUIDtext;\n\t\t\t\t\t$thisfile_asf_asfindexobject['objectsize']                = $NextObjectSize;\n\n\t\t\t\t\t$thisfile_asf_asfindexobject['entry_time_interval']       = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$thisfile_asf_asfindexobject['index_specifiers_count']    = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2));\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\t$thisfile_asf_asfindexobject['index_blocks_count']        = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count']);\n\t\t\t\t\tfor ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) {\n\t\t\t\t\t\t$IndexSpecifierStreamNumber = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['stream_number']   = $IndexSpecifierStreamNumber;\n\t\t\t\t\t\t$thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']      = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type_text'] = $this->ASFIndexObjectIndexTypeLookup($thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']);\n\t\t\t\t\t}\n\n\t\t\t\t\t$ASFIndexObjectData .= $this->fread(4);\n\t\t\t\t\t$thisfile_asf_asfindexobject['index_entry_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$ASFIndexObjectData .= $this->fread(8 * $thisfile_asf_asfindexobject['index_specifiers_count']);\n\t\t\t\t\tfor ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) {\n\t\t\t\t\t\t$thisfile_asf_asfindexobject['block_positions'][$IndexSpecifiersCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 8));\n\t\t\t\t\t\t$offset += 8;\n\t\t\t\t\t}\n\n\t\t\t\t\t$ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count'] * $thisfile_asf_asfindexobject['index_entry_count']);\n\t\t\t\t\tfor ($IndexEntryCounter = 0; $IndexEntryCounter < $thisfile_asf_asfindexobject['index_entry_count']; $IndexEntryCounter++) {\n\t\t\t\t\t\tfor ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) {\n\t\t\t\t\t\t\t$thisfile_asf_asfindexobject['offsets'][$IndexSpecifiersCounter][$IndexEntryCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4));\n\t\t\t\t\t\t\t$offset += 4;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\n\t\t\t\tdefault:\n\t\t\t\t\t// Implementations shall ignore any standard or non-standard object that they do not know how to handle.\n\t\t\t\t\tif ($this->GUIDname($NextObjectGUIDtext)) {\n\t\t\t\t\t\t$info['warning'][] = 'unhandled GUID \"'.$this->GUIDname($NextObjectGUIDtext).'\" {'.$NextObjectGUIDtext.'} in ASF body at offset '.($offset - 16 - 8);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'unknown GUID {'.$NextObjectGUIDtext.'} in ASF body at offset '.($this->ftell() - 16 - 8);\n\t\t\t\t\t}\n\t\t\t\t\t$this->fseek(($NextObjectSize - 16 - 8), SEEK_CUR);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (isset($thisfile_asf_codeclistobject['codec_entries']) && is_array($thisfile_asf_codeclistobject['codec_entries'])) {\n\t\t\tforeach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) {\n\t\t\t\tswitch ($streamdata['information']) {\n\t\t\t\t\tcase 'WMV1':\n\t\t\t\t\tcase 'WMV2':\n\t\t\t\t\tcase 'WMV3':\n\t\t\t\t\tcase 'MSS1':\n\t\t\t\t\tcase 'MSS2':\n\t\t\t\t\tcase 'WMVA':\n\t\t\t\t\tcase 'WVC1':\n\t\t\t\t\tcase 'WMVP':\n\t\t\t\t\tcase 'WVP2':\n\t\t\t\t\t\t$thisfile_video['dataformat'] = 'wmv';\n\t\t\t\t\t\t$info['mime_type'] = 'video/x-ms-wmv';\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'MP42':\n\t\t\t\t\tcase 'MP43':\n\t\t\t\t\tcase 'MP4S':\n\t\t\t\t\tcase 'mp4s':\n\t\t\t\t\t\t$thisfile_video['dataformat'] = 'asf';\n\t\t\t\t\t\t$info['mime_type'] = 'video/x-ms-asf';\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tswitch ($streamdata['type_raw']) {\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\tif (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) {\n\t\t\t\t\t\t\t\t\t$thisfile_video['dataformat'] = 'wmv';\n\t\t\t\t\t\t\t\t\tif ($info['mime_type'] == 'video/x-ms-asf') {\n\t\t\t\t\t\t\t\t\t\t$info['mime_type'] = 'video/x-ms-wmv';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tif (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) {\n\t\t\t\t\t\t\t\t\t$thisfile_audio['dataformat'] = 'wma';\n\t\t\t\t\t\t\t\t\tif ($info['mime_type'] == 'video/x-ms-asf') {\n\t\t\t\t\t\t\t\t\t\t$info['mime_type'] = 'audio/x-ms-wma';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tswitch (isset($thisfile_audio['codec']) ? $thisfile_audio['codec'] : '') {\n\t\t\tcase 'MPEG Layer-3':\n\t\t\t\t$thisfile_audio['dataformat'] = 'mp3';\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isset($thisfile_asf_codeclistobject['codec_entries'])) {\n\t\t\tforeach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) {\n\t\t\t\tswitch ($streamdata['type_raw']) {\n\n\t\t\t\t\tcase 1: // video\n\t\t\t\t\t\t$thisfile_video['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 2: // audio\n\t\t\t\t\t\t$thisfile_audio['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']);\n\n\t\t\t\t\t\t// AH 2003-10-01\n\t\t\t\t\t\t$thisfile_audio['encoder_options'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][0]['description']);\n\n\t\t\t\t\t\t$thisfile_audio['codec']   = $thisfile_audio['encoder'];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$info['warning'][] = 'Unknown streamtype: [codec_list_object][codec_entries]['.$streamnumber.'][type_raw] == '.$streamdata['type_raw'];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isset($info['audio'])) {\n\t\t\t$thisfile_audio['lossless']           = (isset($thisfile_audio['lossless'])           ? $thisfile_audio['lossless']           : false);\n\t\t\t$thisfile_audio['dataformat']         = (!empty($thisfile_audio['dataformat'])        ? $thisfile_audio['dataformat']         : 'asf');\n\t\t}\n\t\tif (!empty($thisfile_video['dataformat'])) {\n\t\t\t$thisfile_video['lossless']           = (isset($thisfile_audio['lossless'])           ? $thisfile_audio['lossless']           : false);\n\t\t\t$thisfile_video['pixel_aspect_ratio'] = (isset($thisfile_audio['pixel_aspect_ratio']) ? $thisfile_audio['pixel_aspect_ratio'] : (float) 1);\n\t\t\t$thisfile_video['dataformat']         = (!empty($thisfile_video['dataformat'])        ? $thisfile_video['dataformat']         : 'asf');\n\t\t}\n\t\tif (!empty($thisfile_video['streams'])) {\n\t\t\t$thisfile_video['resolution_x'] = 0;\n\t\t\t$thisfile_video['resolution_y'] = 0;\n\t\t\tforeach ($thisfile_video['streams'] as $key => $valuearray) {\n\t\t\t\tif (($valuearray['resolution_x'] > $thisfile_video['resolution_x']) || ($valuearray['resolution_y'] > $thisfile_video['resolution_y'])) {\n\t\t\t\t\t$thisfile_video['resolution_x'] = $valuearray['resolution_x'];\n\t\t\t\t\t$thisfile_video['resolution_y'] = $valuearray['resolution_y'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$info['bitrate'] = (isset($thisfile_audio['bitrate']) ? $thisfile_audio['bitrate'] : 0) + (isset($thisfile_video['bitrate']) ? $thisfile_video['bitrate'] : 0);\n\n\t\tif ((!isset($info['playtime_seconds']) || ($info['playtime_seconds'] <= 0)) && ($info['bitrate'] > 0)) {\n\t\t\t$info['playtime_seconds'] = ($info['filesize'] - $info['avdataoffset']) / ($info['bitrate'] / 8);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic static function codecListObjectTypeLookup($CodecListType) {\n\t\tstatic $lookup = array(\n\t\t\t0x0001 => 'Video Codec',\n\t\t\t0x0002 => 'Audio Codec',\n\t\t\t0xFFFF => 'Unknown Codec'\n\t\t);\n\n\t\treturn (isset($lookup[$CodecListType]) ? $lookup[$CodecListType] : 'Invalid Codec Type');\n\t}\n\n\tpublic static function KnownGUIDs() {\n\t\tstatic $GUIDarray = array(\n\t\t\t'GETID3_ASF_Extended_Stream_Properties_Object'   => '14E6A5CB-C672-4332-8399-A96952065B5A',\n\t\t\t'GETID3_ASF_Padding_Object'                      => '1806D474-CADF-4509-A4BA-9AABCB96AAE8',\n\t\t\t'GETID3_ASF_Payload_Ext_Syst_Pixel_Aspect_Ratio' => '1B1EE554-F9EA-4BC8-821A-376B74E4C4B8',\n\t\t\t'GETID3_ASF_Script_Command_Object'               => '1EFB1A30-0B62-11D0-A39B-00A0C90348F6',\n\t\t\t'GETID3_ASF_No_Error_Correction'                 => '20FB5700-5B55-11CF-A8FD-00805F5C442B',\n\t\t\t'GETID3_ASF_Content_Branding_Object'             => '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E',\n\t\t\t'GETID3_ASF_Content_Encryption_Object'           => '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E',\n\t\t\t'GETID3_ASF_Digital_Signature_Object'            => '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E',\n\t\t\t'GETID3_ASF_Extended_Content_Encryption_Object'  => '298AE614-2622-4C17-B935-DAE07EE9289C',\n\t\t\t'GETID3_ASF_Simple_Index_Object'                 => '33000890-E5B1-11CF-89F4-00A0C90349CB',\n\t\t\t'GETID3_ASF_Degradable_JPEG_Media'               => '35907DE0-E415-11CF-A917-00805F5C442B',\n\t\t\t'GETID3_ASF_Payload_Extension_System_Timecode'   => '399595EC-8667-4E2D-8FDB-98814CE76C1E',\n\t\t\t'GETID3_ASF_Binary_Media'                        => '3AFB65E2-47EF-40F2-AC2C-70A90D71D343',\n\t\t\t'GETID3_ASF_Timecode_Index_Object'               => '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C',\n\t\t\t'GETID3_ASF_Metadata_Library_Object'             => '44231C94-9498-49D1-A141-1D134E457054',\n\t\t\t'GETID3_ASF_Reserved_3'                          => '4B1ACBE3-100B-11D0-A39B-00A0C90348F6',\n\t\t\t'GETID3_ASF_Reserved_4'                          => '4CFEDB20-75F6-11CF-9C0F-00A0C90349CB',\n\t\t\t'GETID3_ASF_Command_Media'                       => '59DACFC0-59E6-11D0-A3AC-00A0C90348F6',\n\t\t\t'GETID3_ASF_Header_Extension_Object'             => '5FBF03B5-A92E-11CF-8EE3-00C00C205365',\n\t\t\t'GETID3_ASF_Media_Object_Index_Parameters_Obj'   => '6B203BAD-3F11-4E84-ACA8-D7613DE2CFA7',\n\t\t\t'GETID3_ASF_Header_Object'                       => '75B22630-668E-11CF-A6D9-00AA0062CE6C',\n\t\t\t'GETID3_ASF_Content_Description_Object'          => '75B22633-668E-11CF-A6D9-00AA0062CE6C',\n\t\t\t'GETID3_ASF_Error_Correction_Object'             => '75B22635-668E-11CF-A6D9-00AA0062CE6C',\n\t\t\t'GETID3_ASF_Data_Object'                         => '75B22636-668E-11CF-A6D9-00AA0062CE6C',\n\t\t\t'GETID3_ASF_Web_Stream_Media_Subtype'            => '776257D4-C627-41CB-8F81-7AC7FF1C40CC',\n\t\t\t'GETID3_ASF_Stream_Bitrate_Properties_Object'    => '7BF875CE-468D-11D1-8D82-006097C9A2B2',\n\t\t\t'GETID3_ASF_Language_List_Object'                => '7C4346A9-EFE0-4BFC-B229-393EDE415C85',\n\t\t\t'GETID3_ASF_Codec_List_Object'                   => '86D15240-311D-11D0-A3A4-00A0C90348F6',\n\t\t\t'GETID3_ASF_Reserved_2'                          => '86D15241-311D-11D0-A3A4-00A0C90348F6',\n\t\t\t'GETID3_ASF_File_Properties_Object'              => '8CABDCA1-A947-11CF-8EE4-00C00C205365',\n\t\t\t'GETID3_ASF_File_Transfer_Media'                 => '91BD222C-F21C-497A-8B6D-5AA86BFC0185',\n\t\t\t'GETID3_ASF_Old_RTP_Extension_Data'              => '96800C63-4C94-11D1-837B-0080C7A37F95',\n\t\t\t'GETID3_ASF_Advanced_Mutual_Exclusion_Object'    => 'A08649CF-4775-4670-8A16-6E35357566CD',\n\t\t\t'GETID3_ASF_Bandwidth_Sharing_Object'            => 'A69609E6-517B-11D2-B6AF-00C04FD908E9',\n\t\t\t'GETID3_ASF_Reserved_1'                          => 'ABD3D211-A9BA-11cf-8EE6-00C00C205365',\n\t\t\t'GETID3_ASF_Bandwidth_Sharing_Exclusive'         => 'AF6060AA-5197-11D2-B6AF-00C04FD908E9',\n\t\t\t'GETID3_ASF_Bandwidth_Sharing_Partial'           => 'AF6060AB-5197-11D2-B6AF-00C04FD908E9',\n\t\t\t'GETID3_ASF_JFIF_Media'                          => 'B61BE100-5B4E-11CF-A8FD-00805F5C442B',\n\t\t\t'GETID3_ASF_Stream_Properties_Object'            => 'B7DC0791-A9B7-11CF-8EE6-00C00C205365',\n\t\t\t'GETID3_ASF_Video_Media'                         => 'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B',\n\t\t\t'GETID3_ASF_Audio_Spread'                        => 'BFC3CD50-618F-11CF-8BB2-00AA00B4E220',\n\t\t\t'GETID3_ASF_Metadata_Object'                     => 'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA',\n\t\t\t'GETID3_ASF_Payload_Ext_Syst_Sample_Duration'    => 'C6BD9450-867F-4907-83A3-C77921B733AD',\n\t\t\t'GETID3_ASF_Group_Mutual_Exclusion_Object'       => 'D1465A40-5A79-4338-B71B-E36B8FD6C249',\n\t\t\t'GETID3_ASF_Extended_Content_Description_Object' => 'D2D0A440-E307-11D2-97F0-00A0C95EA850',\n\t\t\t'GETID3_ASF_Stream_Prioritization_Object'        => 'D4FED15B-88D3-454F-81F0-ED5C45999E24',\n\t\t\t'GETID3_ASF_Payload_Ext_System_Content_Type'     => 'D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC',\n\t\t\t'GETID3_ASF_Old_File_Properties_Object'          => 'D6E229D0-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_ASF_Header_Object'               => 'D6E229D1-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_ASF_Data_Object'                 => 'D6E229D2-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Index_Object'                        => 'D6E229D3-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Stream_Properties_Object'        => 'D6E229D4-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Content_Description_Object'      => 'D6E229D5-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Script_Command_Object'           => 'D6E229D6-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Marker_Object'                   => 'D6E229D7-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Component_Download_Object'       => 'D6E229D8-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Stream_Group_Object'             => 'D6E229D9-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Scalable_Object'                 => 'D6E229DA-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Prioritization_Object'           => 'D6E229DB-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Bitrate_Mutual_Exclusion_Object'     => 'D6E229DC-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Inter_Media_Dependency_Object'   => 'D6E229DD-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Rating_Object'                   => 'D6E229DE-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Index_Parameters_Object'             => 'D6E229DF-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Color_Table_Object'              => 'D6E229E0-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Language_List_Object'            => 'D6E229E1-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Audio_Media'                     => 'D6E229E2-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Video_Media'                     => 'D6E229E3-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Image_Media'                     => 'D6E229E4-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Timecode_Media'                  => 'D6E229E5-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Text_Media'                      => 'D6E229E6-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_MIDI_Media'                      => 'D6E229E7-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Command_Media'                   => 'D6E229E8-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_No_Error_Concealment'            => 'D6E229EA-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Scrambled_Audio'                 => 'D6E229EB-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_No_Color_Table'                  => 'D6E229EC-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_SMPTE_Time'                      => 'D6E229ED-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_ASCII_Text'                      => 'D6E229EE-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Unicode_Text'                    => 'D6E229EF-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_HTML_Text'                       => 'D6E229F0-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_URL_Command'                     => 'D6E229F1-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Filename_Command'                => 'D6E229F2-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_ACM_Codec'                       => 'D6E229F3-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_VCM_Codec'                       => 'D6E229F4-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_QuickTime_Codec'                 => 'D6E229F5-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_DirectShow_Transform_Filter'     => 'D6E229F6-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_DirectShow_Rendering_Filter'     => 'D6E229F7-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_No_Enhancement'                  => 'D6E229F8-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Unknown_Enhancement_Type'        => 'D6E229F9-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Temporal_Enhancement'            => 'D6E229FA-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Spatial_Enhancement'             => 'D6E229FB-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Quality_Enhancement'             => 'D6E229FC-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Number_of_Channels_Enhancement'  => 'D6E229FD-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Frequency_Response_Enhancement'  => 'D6E229FE-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Media_Object'                    => 'D6E229FF-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Mutex_Language'                      => 'D6E22A00-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Mutex_Bitrate'                       => 'D6E22A01-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Mutex_Unknown'                       => 'D6E22A02-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_ASF_Placeholder_Object'          => 'D6E22A0E-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Old_Data_Unit_Extension_Object'      => 'D6E22A0F-35DA-11D1-9034-00A0C90349BE',\n\t\t\t'GETID3_ASF_Web_Stream_Format'                   => 'DA1E6B13-8359-4050-B398-388E965BF00C',\n\t\t\t'GETID3_ASF_Payload_Ext_System_File_Name'        => 'E165EC0E-19ED-45D7-B4A7-25CBD1E28E9B',\n\t\t\t'GETID3_ASF_Marker_Object'                       => 'F487CD01-A951-11CF-8EE6-00C00C205365',\n\t\t\t'GETID3_ASF_Timecode_Index_Parameters_Object'    => 'F55E496D-9797-4B5D-8C8B-604DFE9BFB24',\n\t\t\t'GETID3_ASF_Audio_Media'                         => 'F8699E40-5B4D-11CF-A8FD-00805F5C442B',\n\t\t\t'GETID3_ASF_Media_Object_Index_Object'           => 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C',\n\t\t\t'GETID3_ASF_Alt_Extended_Content_Encryption_Obj' => 'FF889EF1-ADEE-40DA-9E71-98704BB928CE',\n\t\t\t'GETID3_ASF_Index_Placeholder_Object'            => 'D9AADE20-7C17-4F9C-BC28-8555DD98E2A2', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html\n\t\t\t'GETID3_ASF_Compatibility_Object'                => '26F18B5D-4584-47EC-9F5F-0E651F0452C9', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html\n\t\t);\n\t\treturn $GUIDarray;\n\t}\n\n\tpublic static function GUIDname($GUIDstring) {\n\t\tstatic $GUIDarray = array();\n\t\tif (empty($GUIDarray)) {\n\t\t\t$GUIDarray = self::KnownGUIDs();\n\t\t}\n\t\treturn array_search($GUIDstring, $GUIDarray);\n\t}\n\n\tpublic static function ASFIndexObjectIndexTypeLookup($id) {\n\t\tstatic $ASFIndexObjectIndexTypeLookup = array();\n\t\tif (empty($ASFIndexObjectIndexTypeLookup)) {\n\t\t\t$ASFIndexObjectIndexTypeLookup[1] = 'Nearest Past Data Packet';\n\t\t\t$ASFIndexObjectIndexTypeLookup[2] = 'Nearest Past Media Object';\n\t\t\t$ASFIndexObjectIndexTypeLookup[3] = 'Nearest Past Cleanpoint';\n\t\t}\n\t\treturn (isset($ASFIndexObjectIndexTypeLookup[$id]) ? $ASFIndexObjectIndexTypeLookup[$id] : 'invalid');\n\t}\n\n\tpublic static function GUIDtoBytestring($GUIDstring) {\n\t\t// Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way:\n\t\t// first 4 bytes are in little-endian order\n\t\t// next 2 bytes are appended in little-endian order\n\t\t// next 2 bytes are appended in little-endian order\n\t\t// next 2 bytes are appended in big-endian order\n\t\t// next 6 bytes are appended in big-endian order\n\n\t\t// AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string:\n\t\t// $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp\n\n\t\t$hexbytecharstring  = chr(hexdec(substr($GUIDstring,  6, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  4, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  2, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  0, 2)));\n\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring,  9, 2)));\n\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2)));\n\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2)));\n\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2)));\n\t\t$hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2)));\n\n\t\treturn $hexbytecharstring;\n\t}\n\n\tpublic static function BytestringToGUID($Bytestring) {\n\t\t$GUIDstring  = str_pad(dechex(ord($Bytestring{3})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{2})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{1})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{0})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= '-';\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{5})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{4})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= '-';\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{7})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{6})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= '-';\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{8})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{9})),  2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= '-';\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{10})), 2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{11})), 2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{12})), 2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{13})), 2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{14})), 2, '0', STR_PAD_LEFT);\n\t\t$GUIDstring .= str_pad(dechex(ord($Bytestring{15})), 2, '0', STR_PAD_LEFT);\n\n\t\treturn strtoupper($GUIDstring);\n\t}\n\n\tpublic static function FILETIMEtoUNIXtime($FILETIME, $round=true) {\n\t\t// FILETIME is a 64-bit unsigned integer representing\n\t\t// the number of 100-nanosecond intervals since January 1, 1601\n\t\t// UNIX timestamp is number of seconds since January 1, 1970\n\t\t// 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days\n\t\tif ($round) {\n\t\t\treturn intval(round(($FILETIME - 116444736000000000) / 10000000));\n\t\t}\n\t\treturn ($FILETIME - 116444736000000000) / 10000000;\n\t}\n\n\tpublic static function WMpictureTypeLookup($WMpictureType) {\n\t\tstatic $lookup = null;\n\t\tif ($lookup === null) {\n\t\t\t$lookup = array(\n\t\t\t\t0x03 => 'Front Cover',\n\t\t\t\t0x04 => 'Back Cover',\n\t\t\t\t0x00 => 'User Defined',\n\t\t\t\t0x05 => 'Leaflet Page',\n\t\t\t\t0x06 => 'Media Label',\n\t\t\t\t0x07 => 'Lead Artist',\n\t\t\t\t0x08 => 'Artist',\n\t\t\t\t0x09 => 'Conductor',\n\t\t\t\t0x0A => 'Band',\n\t\t\t\t0x0B => 'Composer',\n\t\t\t\t0x0C => 'Lyricist',\n\t\t\t\t0x0D => 'Recording Location',\n\t\t\t\t0x0E => 'During Recording',\n\t\t\t\t0x0F => 'During Performance',\n\t\t\t\t0x10 => 'Video Screen Capture',\n\t\t\t\t0x12 => 'Illustration',\n\t\t\t\t0x13 => 'Band Logotype',\n\t\t\t\t0x14 => 'Publisher Logotype'\n\t\t\t);\n\t\t\t$lookup = array_map(function($str) {\n\t\t\t\treturn getid3_lib::iconv_fallback('UTF-8', 'UTF-16LE', $str);\n\t\t\t}, $lookup);\n\t\t}\n\n\t\treturn (isset($lookup[$WMpictureType]) ? $lookup[$WMpictureType] : '');\n\t}\n\n\tpublic function HeaderExtensionObjectDataParse(&$asf_header_extension_object_data, &$unhandled_sections) {\n\t\t// http://msdn.microsoft.com/en-us/library/bb643323.aspx\n\n\t\t$offset = 0;\n\t\t$objectOffset = 0;\n\t\t$HeaderExtensionObjectParsed = array();\n\t\twhile ($objectOffset < strlen($asf_header_extension_object_data)) {\n\t\t\t$offset = $objectOffset;\n\t\t\t$thisObject = array();\n\n\t\t\t$thisObject['guid']                              =                              substr($asf_header_extension_object_data, $offset, 16);\n\t\t\t$offset += 16;\n\t\t\t$thisObject['guid_text'] = $this->BytestringToGUID($thisObject['guid']);\n\t\t\t$thisObject['guid_name'] = $this->GUIDname($thisObject['guid_text']);\n\n\t\t\t$thisObject['size']                              = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  8));\n\t\t\t$offset += 8;\n\t\t\tif ($thisObject['size'] <= 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tswitch ($thisObject['guid']) {\n\t\t\t\tcase GETID3_ASF_Extended_Stream_Properties_Object:\n\t\t\t\t\t$thisObject['start_time']                        = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisObject['start_time_unix']                   = $this->FILETIMEtoUNIXtime($thisObject['start_time']);\n\n\t\t\t\t\t$thisObject['end_time']                          = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  8));\n\t\t\t\t\t$offset += 8;\n\t\t\t\t\t$thisObject['end_time_unix']                     = $this->FILETIMEtoUNIXtime($thisObject['end_time']);\n\n\t\t\t\t\t$thisObject['data_bitrate']                      = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$thisObject['buffer_size']                       = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$thisObject['initial_buffer_fullness']           = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$thisObject['alternate_data_bitrate']            = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$thisObject['alternate_buffer_size']             = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$thisObject['alternate_initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$thisObject['maximum_object_size']               = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$thisObject['flags_raw']                         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t\t$thisObject['flags']['reliable']                = (bool) $thisObject['flags_raw'] & 0x00000001;\n\t\t\t\t\t$thisObject['flags']['seekable']                = (bool) $thisObject['flags_raw'] & 0x00000002;\n\t\t\t\t\t$thisObject['flags']['no_cleanpoints']          = (bool) $thisObject['flags_raw'] & 0x00000004;\n\t\t\t\t\t$thisObject['flags']['resend_live_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000008;\n\n\t\t\t\t\t$thisObject['stream_number']                     = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t$thisObject['stream_language_id_index']          = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t$thisObject['average_time_per_frame']            = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t$thisObject['stream_name_count']                 = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t$thisObject['payload_extension_system_count']    = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\tfor ($i = 0; $i < $thisObject['stream_name_count']; $i++) {\n\t\t\t\t\t\t$streamName = array();\n\n\t\t\t\t\t\t$streamName['language_id_index']             = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$streamName['stream_name_length']            = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$streamName['stream_name']                   = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  $streamName['stream_name_length']));\n\t\t\t\t\t\t$offset += $streamName['stream_name_length'];\n\n\t\t\t\t\t\t$thisObject['stream_names'][$i] = $streamName;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ($i = 0; $i < $thisObject['payload_extension_system_count']; $i++) {\n\t\t\t\t\t\t$payloadExtensionSystem = array();\n\n\t\t\t\t\t\t$payloadExtensionSystem['extension_system_id']   =                              substr($asf_header_extension_object_data, $offset, 16);\n\t\t\t\t\t\t$offset += 16;\n\t\t\t\t\t\t$payloadExtensionSystem['extension_system_id_text'] = $this->BytestringToGUID($payloadExtensionSystem['extension_system_id']);\n\n\t\t\t\t\t\t$payloadExtensionSystem['extension_system_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\tif ($payloadExtensionSystem['extension_system_size'] <= 0) {\n\t\t\t\t\t\t\tbreak 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t\t$payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  $payloadExtensionSystem['extension_system_info_length']));\n\t\t\t\t\t\t$offset += $payloadExtensionSystem['extension_system_info_length'];\n\n\t\t\t\t\t\t$thisObject['payload_extension_systems'][$i] = $payloadExtensionSystem;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Padding_Object:\n\t\t\t\t\t// padding, skip it\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Metadata_Object:\n\t\t\t\t\t$thisObject['description_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\tfor ($i = 0; $i < $thisObject['description_record_counts']; $i++) {\n\t\t\t\t\t\t$descriptionRecord = array();\n\n\t\t\t\t\t\t$descriptionRecord['reserved_1']         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2)); // must be zero\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$descriptionRecord['stream_number']      = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$descriptionRecord['name_length']        = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$descriptionRecord['data_type']          = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']);\n\n\t\t\t\t\t\t$descriptionRecord['data_length']        = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t\t$descriptionRecord['name']               =                              substr($asf_header_extension_object_data, $offset,  $descriptionRecord['name_length']);\n\t\t\t\t\t\t$offset += $descriptionRecord['name_length'];\n\n\t\t\t\t\t\t$descriptionRecord['data']               =                              substr($asf_header_extension_object_data, $offset,  $descriptionRecord['data_length']);\n\t\t\t\t\t\t$offset += $descriptionRecord['data_length'];\n\t\t\t\t\t\tswitch ($descriptionRecord['data_type']) {\n\t\t\t\t\t\t\tcase 0x0000: // Unicode string\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x0001: // BYTE array\n\t\t\t\t\t\t\t\t// do nothing\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x0002: // BOOL\n\t\t\t\t\t\t\t\t$descriptionRecord['data'] = (bool) getid3_lib::LittleEndian2Int($descriptionRecord['data']);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x0003: // DWORD\n\t\t\t\t\t\t\tcase 0x0004: // QWORD\n\t\t\t\t\t\t\tcase 0x0005: // WORD\n\t\t\t\t\t\t\t\t$descriptionRecord['data'] = getid3_lib::LittleEndian2Int($descriptionRecord['data']);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x0006: // GUID\n\t\t\t\t\t\t\t\t$descriptionRecord['data_text'] = $this->BytestringToGUID($descriptionRecord['data']);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$thisObject['description_record'][$i] = $descriptionRecord;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Language_List_Object:\n\t\t\t\t\t$thisObject['language_id_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\tfor ($i = 0; $i < $thisObject['language_id_record_counts']; $i++) {\n\t\t\t\t\t\t$languageIDrecord = array();\n\n\t\t\t\t\t\t$languageIDrecord['language_id_length']         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  1));\n\t\t\t\t\t\t$offset += 1;\n\n\t\t\t\t\t\t$languageIDrecord['language_id']                =                              substr($asf_header_extension_object_data, $offset,  $languageIDrecord['language_id_length']);\n\t\t\t\t\t\t$offset += $languageIDrecord['language_id_length'];\n\n\t\t\t\t\t\t$thisObject['language_id_record'][$i] = $languageIDrecord;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_ASF_Metadata_Library_Object:\n\t\t\t\t\t$thisObject['description_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\tfor ($i = 0; $i < $thisObject['description_records_count']; $i++) {\n\t\t\t\t\t\t$descriptionRecord = array();\n\n\t\t\t\t\t\t$descriptionRecord['language_list_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$descriptionRecord['stream_number']       = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$descriptionRecord['name_length']         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\n\t\t\t\t\t\t$descriptionRecord['data_type']           = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  2));\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']);\n\n\t\t\t\t\t\t$descriptionRecord['data_length']         = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset,  4));\n\t\t\t\t\t\t$offset += 4;\n\n\t\t\t\t\t\t$descriptionRecord['name']                =                              substr($asf_header_extension_object_data, $offset,  $descriptionRecord['name_length']);\n\t\t\t\t\t\t$offset += $descriptionRecord['name_length'];\n\n\t\t\t\t\t\t$descriptionRecord['data']                =                              substr($asf_header_extension_object_data, $offset,  $descriptionRecord['data_length']);\n\t\t\t\t\t\t$offset += $descriptionRecord['data_length'];\n\n\t\t\t\t\t\tif (preg_match('#^WM/Picture$#', str_replace(\"\\x00\", '', trim($descriptionRecord['name'])))) {\n\t\t\t\t\t\t\t$WMpicture = $this->ASF_WMpicture($descriptionRecord['data']);\n\t\t\t\t\t\t\tforeach ($WMpicture as $key => $value) {\n\t\t\t\t\t\t\t\t$descriptionRecord['data'] = $WMpicture;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tunset($WMpicture);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$thisObject['description_record'][$i] = $descriptionRecord;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$unhandled_sections++;\n\t\t\t\t\tif ($this->GUIDname($thisObject['guid_text'])) {\n\t\t\t\t\t\t$this->getid3->info['warning'][] = 'unhandled Header Extension Object GUID \"'.$this->GUIDname($thisObject['guid_text']).'\" {'.$thisObject['guid_text'].'} at offset '.($offset - 16 - 8);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this->getid3->info['warning'][] = 'unknown Header Extension Object GUID {'.$thisObject['guid_text'].'} in at offset '.($offset - 16 - 8);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$HeaderExtensionObjectParsed[] = $thisObject;\n\n\t\t\t$objectOffset += $thisObject['size'];\n\t\t}\n\t\treturn $HeaderExtensionObjectParsed;\n\t}\n\n\n\tpublic static function metadataLibraryObjectDataTypeLookup($id) {\n\t\tstatic $lookup = array(\n\t\t\t0x0000 => 'Unicode string', // The data consists of a sequence of Unicode characters\n\t\t\t0x0001 => 'BYTE array',     // The type of the data is implementation-specific\n\t\t\t0x0002 => 'BOOL',           // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer. Only 0x0000 or 0x0001 are permitted values\n\t\t\t0x0003 => 'DWORD',          // The data is 4 bytes long and should be interpreted as a 32-bit unsigned integer\n\t\t\t0x0004 => 'QWORD',          // The data is 8 bytes long and should be interpreted as a 64-bit unsigned integer\n\t\t\t0x0005 => 'WORD',           // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer\n\t\t\t0x0006 => 'GUID',           // The data is 16 bytes long and should be interpreted as a 128-bit GUID\n\t\t);\n\t\treturn (isset($lookup[$id]) ? $lookup[$id] : 'invalid');\n\t}\n\n\tpublic function ASF_WMpicture(&$data) {\n\t\t//typedef struct _WMPicture{\n\t\t//  LPWSTR  pwszMIMEType;\n\t\t//  BYTE  bPictureType;\n\t\t//  LPWSTR  pwszDescription;\n\t\t//  DWORD  dwDataLen;\n\t\t//  BYTE*  pbData;\n\t\t//} WM_PICTURE;\n\n\t\t$WMpicture = array();\n\n\t\t$offset = 0;\n\t\t$WMpicture['image_type_id'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 1));\n\t\t$offset += 1;\n\t\t$WMpicture['image_type']    = self::WMpictureTypeLookup($WMpicture['image_type_id']);\n\t\t$WMpicture['image_size']    = getid3_lib::LittleEndian2Int(substr($data, $offset, 4));\n\t\t$offset += 4;\n\n\t\t$WMpicture['image_mime'] = '';\n\t\tdo {\n\t\t\t$next_byte_pair = substr($data, $offset, 2);\n\t\t\t$offset += 2;\n\t\t\t$WMpicture['image_mime'] .= $next_byte_pair;\n\t\t} while ($next_byte_pair !== \"\\x00\\x00\");\n\n\t\t$WMpicture['image_description'] = '';\n\t\tdo {\n\t\t\t$next_byte_pair = substr($data, $offset, 2);\n\t\t\t$offset += 2;\n\t\t\t$WMpicture['image_description'] .= $next_byte_pair;\n\t\t} while ($next_byte_pair !== \"\\x00\\x00\");\n\n\t\t$WMpicture['dataoffset'] = $offset;\n\t\t$WMpicture['data'] = substr($data, $offset);\n\n\t\t$imageinfo = array();\n\t\t$WMpicture['image_mime'] = '';\n\t\t$imagechunkcheck = getid3_lib::GetDataImageSize($WMpicture['data'], $imageinfo);\n\t\tunset($imageinfo);\n\t\tif (!empty($imagechunkcheck)) {\n\t\t\t$WMpicture['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]);\n\t\t}\n\t\tif (!isset($this->getid3->info['asf']['comments']['picture'])) {\n\t\t\t$this->getid3->info['asf']['comments']['picture'] = array();\n\t\t}\n\t\t$this->getid3->info['asf']['comments']['picture'][] = array('data'=>$WMpicture['data'], 'image_mime'=>$WMpicture['image_mime']);\n\n\t\treturn $WMpicture;\n\t}\n\n\n\t// Remove terminator 00 00 and convert UTF-16LE to Latin-1\n\tpublic static function TrimConvert($string) {\n\t\treturn trim(getid3_lib::iconv_fallback('UTF-16LE', 'ISO-8859-1', self::TrimTerm($string)), ' ');\n\t}\n\n\n\t// Remove terminator 00 00\n\tpublic static function TrimTerm($string) {\n\t\t// remove terminator, only if present (it should be, but...)\n\t\tif (substr($string, -2) === \"\\x00\\x00\") {\n\t\t\t$string = substr($string, 0, -2);\n\t\t}\n\t\treturn $string;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio-video.flv.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n//                                                             //\n//  FLV module by Seth Kaufman <sethØwhirl-i-gig*com>          //\n//                                                             //\n//  * version 0.1 (26 June 2005)                               //\n//                                                             //\n//                                                             //\n//  * version 0.1.1 (15 July 2005)                             //\n//  minor modifications by James Heinrich <info@getid3.org>    //\n//                                                             //\n//  * version 0.2 (22 February 2006)                           //\n//  Support for On2 VP6 codec and meta information             //\n//    by Steve Webster <steve.websterØfeaturecreep*com>        //\n//                                                             //\n//  * version 0.3 (15 June 2006)                               //\n//  Modified to not read entire file into memory               //\n//    by James Heinrich <info@getid3.org>                      //\n//                                                             //\n//  * version 0.4 (07 December 2007)                           //\n//  Bugfixes for incorrectly parsed FLV dimensions             //\n//    and incorrect parsing of onMetaTag                       //\n//    by Evgeny Moysevich <moysevichØgmail*com>                //\n//                                                             //\n//  * version 0.5 (21 May 2009)                                //\n//  Fixed parsing of audio tags and added additional codec     //\n//    details. The duration is now read from onMetaTag (if     //\n//    exists), rather than parsing whole file                  //\n//    by Nigel Barnes <ngbarnesØhotmail*com>                   //\n//                                                             //\n//  * version 0.6 (24 May 2009)                                //\n//  Better parsing of files with h264 video                    //\n//    by Evgeny Moysevich <moysevichØgmail*com>                //\n//                                                             //\n//  * version 0.6.1 (30 May 2011)                              //\n//    prevent infinite loops in expGolombUe()                  //\n//                                                             //\n//  * version 0.7.0 (16 Jul 2013)                              //\n//  handle GETID3_FLV_VIDEO_VP6FLV_ALPHA                       //\n//  improved AVCSequenceParameterSetReader::readData()         //\n//    by Xander Schouwerwou <schouwerwouØgmail*com>            //\n//                                                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio-video.flv.php                                  //\n// module for analyzing Shockwave Flash Video files            //\n// dependencies: NONE                                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\ndefine('GETID3_FLV_TAG_AUDIO',          8);\ndefine('GETID3_FLV_TAG_VIDEO',          9);\ndefine('GETID3_FLV_TAG_META',          18);\n\ndefine('GETID3_FLV_VIDEO_H263',         2);\ndefine('GETID3_FLV_VIDEO_SCREEN',       3);\ndefine('GETID3_FLV_VIDEO_VP6FLV',       4);\ndefine('GETID3_FLV_VIDEO_VP6FLV_ALPHA', 5);\ndefine('GETID3_FLV_VIDEO_SCREENV2',     6);\ndefine('GETID3_FLV_VIDEO_H264',         7);\n\ndefine('H264_AVC_SEQUENCE_HEADER',          0);\ndefine('H264_PROFILE_BASELINE',            66);\ndefine('H264_PROFILE_MAIN',                77);\ndefine('H264_PROFILE_EXTENDED',            88);\ndefine('H264_PROFILE_HIGH',               100);\ndefine('H264_PROFILE_HIGH10',             110);\ndefine('H264_PROFILE_HIGH422',            122);\ndefine('H264_PROFILE_HIGH444',            144);\ndefine('H264_PROFILE_HIGH444_PREDICTIVE', 244);\n\nclass getid3_flv extends getid3_handler {\n\n\tconst magic = 'FLV';\n\n\tpublic $max_frames = 100000; // break out of the loop if too many frames have been scanned; only scan this many if meta frame does not contain useful duration\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t$this->fseek($info['avdataoffset']);\n\n\t\t$FLVdataLength = $info['avdataend'] - $info['avdataoffset'];\n\t\t$FLVheader = $this->fread(5);\n\n\t\t$info['fileformat'] = 'flv';\n\t\t$info['flv']['header']['signature'] =                           substr($FLVheader, 0, 3);\n\t\t$info['flv']['header']['version']   = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1));\n\t\t$TypeFlags                          = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1));\n\n\t\tif ($info['flv']['header']['signature'] != self::magic) {\n\t\t\t$info['error'][] = 'Expecting \"'.getid3_lib::PrintHexBytes(self::magic).'\" at offset '.$info['avdataoffset'].', found \"'.getid3_lib::PrintHexBytes($info['flv']['header']['signature']).'\"';\n\t\t\tunset($info['flv'], $info['fileformat']);\n\t\t\treturn false;\n\t\t}\n\n\t\t$info['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04);\n\t\t$info['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01);\n\n\t\t$FrameSizeDataLength = getid3_lib::BigEndian2Int($this->fread(4));\n\t\t$FLVheaderFrameLength = 9;\n\t\tif ($FrameSizeDataLength > $FLVheaderFrameLength) {\n\t\t\t$this->fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR);\n\t\t}\n\t\t$Duration = 0;\n\t\t$found_video = false;\n\t\t$found_audio = false;\n\t\t$found_meta  = false;\n\t\t$found_valid_meta_playtime = false;\n\t\t$tagParseCount = 0;\n\t\t$info['flv']['framecount'] = array('total'=>0, 'audio'=>0, 'video'=>0);\n\t\t$flv_framecount = &$info['flv']['framecount'];\n\t\twhile ((($this->ftell() + 16) < $info['avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime))  {\n\t\t\t$ThisTagHeader = $this->fread(16);\n\n\t\t\t$PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  0, 4));\n\t\t\t$TagType           = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  4, 1));\n\t\t\t$DataLength        = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  5, 3));\n\t\t\t$Timestamp         = getid3_lib::BigEndian2Int(substr($ThisTagHeader,  8, 3));\n\t\t\t$LastHeaderByte    = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1));\n\t\t\t$NextOffset = $this->ftell() - 1 + $DataLength;\n\t\t\tif ($Timestamp > $Duration) {\n\t\t\t\t$Duration = $Timestamp;\n\t\t\t}\n\n\t\t\t$flv_framecount['total']++;\n\t\t\tswitch ($TagType) {\n\t\t\t\tcase GETID3_FLV_TAG_AUDIO:\n\t\t\t\t\t$flv_framecount['audio']++;\n\t\t\t\t\tif (!$found_audio) {\n\t\t\t\t\t\t$found_audio = true;\n\t\t\t\t\t\t$info['flv']['audio']['audioFormat']     = ($LastHeaderByte >> 4) & 0x0F;\n\t\t\t\t\t\t$info['flv']['audio']['audioRate']       = ($LastHeaderByte >> 2) & 0x03;\n\t\t\t\t\t\t$info['flv']['audio']['audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01;\n\t\t\t\t\t\t$info['flv']['audio']['audioType']       =  $LastHeaderByte       & 0x01;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GETID3_FLV_TAG_VIDEO:\n\t\t\t\t\t$flv_framecount['video']++;\n\t\t\t\t\tif (!$found_video) {\n\t\t\t\t\t\t$found_video = true;\n\t\t\t\t\t\t$info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07;\n\n\t\t\t\t\t\t$FLVvideoHeader = $this->fread(11);\n\n\t\t\t\t\t\tif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) {\n\t\t\t\t\t\t\t// this code block contributed by: moysevichØgmail*com\n\n\t\t\t\t\t\t\t$AVCPacketType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 0, 1));\n\t\t\t\t\t\t\tif ($AVCPacketType == H264_AVC_SEQUENCE_HEADER) {\n\t\t\t\t\t\t\t\t//\tread AVCDecoderConfigurationRecord\n\t\t\t\t\t\t\t\t$configurationVersion       = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  4, 1));\n\t\t\t\t\t\t\t\t$AVCProfileIndication       = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  5, 1));\n\t\t\t\t\t\t\t\t$profile_compatibility      = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  6, 1));\n\t\t\t\t\t\t\t\t$lengthSizeMinusOne         = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  7, 1));\n\t\t\t\t\t\t\t\t$numOfSequenceParameterSets = getid3_lib::BigEndian2Int(substr($FLVvideoHeader,  8, 1));\n\n\t\t\t\t\t\t\t\tif (($numOfSequenceParameterSets & 0x1F) != 0) {\n\t\t\t\t\t\t\t\t\t//\tthere is at least one SequenceParameterSet\n\t\t\t\t\t\t\t\t\t//\tread size of the first SequenceParameterSet\n\t\t\t\t\t\t\t\t\t//$spsSize = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 9, 2));\n\t\t\t\t\t\t\t\t\t$spsSize = getid3_lib::LittleEndian2Int(substr($FLVvideoHeader, 9, 2));\n\t\t\t\t\t\t\t\t\t//\tread the first SequenceParameterSet\n\t\t\t\t\t\t\t\t\t$sps = $this->fread($spsSize);\n\t\t\t\t\t\t\t\t\tif (strlen($sps) == $spsSize) {\t//\tmake sure that whole SequenceParameterSet was red\n\t\t\t\t\t\t\t\t\t\t$spsReader = new AVCSequenceParameterSetReader($sps);\n\t\t\t\t\t\t\t\t\t\t$spsReader->readData();\n\t\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = $spsReader->getWidth();\n\t\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = $spsReader->getHeight();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// end: moysevichØgmail*com\n\n\t\t\t\t\t\t} elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H263) {\n\n\t\t\t\t\t\t\t$PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7;\n\t\t\t\t\t\t\t$PictureSizeType = $PictureSizeType & 0x0007;\n\t\t\t\t\t\t\t$info['flv']['header']['videoSizeType'] = $PictureSizeType;\n\t\t\t\t\t\t\tswitch ($PictureSizeType) {\n\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t//$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2));\n\t\t\t\t\t\t\t\t\t//$PictureSizeEnc <<= 1;\n\t\t\t\t\t\t\t\t\t//$info['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8;\n\t\t\t\t\t\t\t\t\t//$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));\n\t\t\t\t\t\t\t\t\t//$PictureSizeEnc <<= 1;\n\t\t\t\t\t\t\t\t\t//$info['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8;\n\n\t\t\t\t\t\t\t\t\t$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 2)) >> 7;\n\t\t\t\t\t\t\t\t\t$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)) >> 7;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFF;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFF;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\t$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 3)) >> 7;\n\t\t\t\t\t\t\t\t\t$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 3)) >> 7;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFFFF;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFFFF;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = 352;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = 288;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = 176;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = 144;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = 128;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = 96;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = 320;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = 240;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = 160;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = 120;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = 0;\n\t\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = 0;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} elseif ($info['flv']['video']['videoCodec'] ==  GETID3_FLV_VIDEO_VP6FLV_ALPHA) {\n\n\t\t\t\t\t\t\t/* contributed by schouwerwouØgmail*com */\n\t\t\t\t\t\t\tif (!isset($info['video']['resolution_x'])) { // only when meta data isn't set\n\t\t\t\t\t\t\t\t$PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2));\n\t\t\t\t\t\t\t\t$PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 2));\n\t\t\t\t\t\t\t\t$info['video']['resolution_x'] = ($PictureSizeEnc['x'] & 0xFF) << 3;\n\t\t\t\t\t\t\t\t$info['video']['resolution_y'] = ($PictureSizeEnc['y'] & 0xFF) << 3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/* end schouwerwouØgmail*com */\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!empty($info['video']['resolution_x']) && !empty($info['video']['resolution_y'])) {\n\t\t\t\t\t\t\t$info['video']['pixel_aspect_ratio'] = $info['video']['resolution_x'] / $info['video']['resolution_y'];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Meta tag\n\t\t\t\tcase GETID3_FLV_TAG_META:\n\t\t\t\t\tif (!$found_meta) {\n\t\t\t\t\t\t$found_meta = true;\n\t\t\t\t\t\t$this->fseek(-1, SEEK_CUR);\n\t\t\t\t\t\t$datachunk = $this->fread($DataLength);\n\t\t\t\t\t\t$AMFstream = new AMFStream($datachunk);\n\t\t\t\t\t\t$reader = new AMFReader($AMFstream);\n\t\t\t\t\t\t$eventName = $reader->readData();\n\t\t\t\t\t\t$info['flv']['meta'][$eventName] = $reader->readData();\n\t\t\t\t\t\tunset($reader);\n\n\t\t\t\t\t\t$copykeys = array('framerate'=>'frame_rate', 'width'=>'resolution_x', 'height'=>'resolution_y', 'audiodatarate'=>'bitrate', 'videodatarate'=>'bitrate');\n\t\t\t\t\t\tforeach ($copykeys as $sourcekey => $destkey) {\n\t\t\t\t\t\t\tif (isset($info['flv']['meta']['onMetaData'][$sourcekey])) {\n\t\t\t\t\t\t\t\tswitch ($sourcekey) {\n\t\t\t\t\t\t\t\t\tcase 'width':\n\t\t\t\t\t\t\t\t\tcase 'height':\n\t\t\t\t\t\t\t\t\t\t$info['video'][$destkey] = intval(round($info['flv']['meta']['onMetaData'][$sourcekey]));\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'audiodatarate':\n\t\t\t\t\t\t\t\t\t\t$info['audio'][$destkey] = getid3_lib::CastAsInt(round($info['flv']['meta']['onMetaData'][$sourcekey] * 1000));\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'videodatarate':\n\t\t\t\t\t\t\t\t\tcase 'frame_rate':\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t$info['video'][$destkey] = $info['flv']['meta']['onMetaData'][$sourcekey];\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!empty($info['flv']['meta']['onMetaData']['duration'])) {\n\t\t\t\t\t\t\t$found_valid_meta_playtime = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// noop\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$this->fseek($NextOffset);\n\t\t}\n\n\t\t$info['playtime_seconds'] = $Duration / 1000;\n\t\tif ($info['playtime_seconds'] > 0) {\n\t\t\t$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];\n\t\t}\n\n\t\tif ($info['flv']['header']['hasAudio']) {\n\t\t\t$info['audio']['codec']           =   self::audioFormatLookup($info['flv']['audio']['audioFormat']);\n\t\t\t$info['audio']['sample_rate']     =     self::audioRateLookup($info['flv']['audio']['audioRate']);\n\t\t\t$info['audio']['bits_per_sample'] = self::audioBitDepthLookup($info['flv']['audio']['audioSampleSize']);\n\n\t\t\t$info['audio']['channels']   =  $info['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo\n\t\t\t$info['audio']['lossless']   = ($info['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed\n\t\t\t$info['audio']['dataformat'] = 'flv';\n\t\t}\n\t\tif (!empty($info['flv']['header']['hasVideo'])) {\n\t\t\t$info['video']['codec']      = self::videoCodecLookup($info['flv']['video']['videoCodec']);\n\t\t\t$info['video']['dataformat'] = 'flv';\n\t\t\t$info['video']['lossless']   = false;\n\t\t}\n\n\t\t// Set information from meta\n\t\tif (!empty($info['flv']['meta']['onMetaData']['duration'])) {\n\t\t\t$info['playtime_seconds'] = $info['flv']['meta']['onMetaData']['duration'];\n\t\t\t$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];\n\t\t}\n\t\tif (isset($info['flv']['meta']['onMetaData']['audiocodecid'])) {\n\t\t\t$info['audio']['codec'] = self::audioFormatLookup($info['flv']['meta']['onMetaData']['audiocodecid']);\n\t\t}\n\t\tif (isset($info['flv']['meta']['onMetaData']['videocodecid'])) {\n\t\t\t$info['video']['codec'] = self::videoCodecLookup($info['flv']['meta']['onMetaData']['videocodecid']);\n\t\t}\n\t\treturn true;\n\t}\n\n\n\tpublic static function audioFormatLookup($id) {\n\t\tstatic $lookup = array(\n\t\t\t0  => 'Linear PCM, platform endian',\n\t\t\t1  => 'ADPCM',\n\t\t\t2  => 'mp3',\n\t\t\t3  => 'Linear PCM, little endian',\n\t\t\t4  => 'Nellymoser 16kHz mono',\n\t\t\t5  => 'Nellymoser 8kHz mono',\n\t\t\t6  => 'Nellymoser',\n\t\t\t7  => 'G.711A-law logarithmic PCM',\n\t\t\t8  => 'G.711 mu-law logarithmic PCM',\n\t\t\t9  => 'reserved',\n\t\t\t10 => 'AAC',\n\t\t\t11 => 'Speex',\n\t\t\t12 => false, // unknown?\n\t\t\t13 => false, // unknown?\n\t\t\t14 => 'mp3 8kHz',\n\t\t\t15 => 'Device-specific sound',\n\t\t);\n\t\treturn (isset($lookup[$id]) ? $lookup[$id] : false);\n\t}\n\n\tpublic static function audioRateLookup($id) {\n\t\tstatic $lookup = array(\n\t\t\t0 =>  5500,\n\t\t\t1 => 11025,\n\t\t\t2 => 22050,\n\t\t\t3 => 44100,\n\t\t);\n\t\treturn (isset($lookup[$id]) ? $lookup[$id] : false);\n\t}\n\n\tpublic static function audioBitDepthLookup($id) {\n\t\tstatic $lookup = array(\n\t\t\t0 =>  8,\n\t\t\t1 => 16,\n\t\t);\n\t\treturn (isset($lookup[$id]) ? $lookup[$id] : false);\n\t}\n\n\tpublic static function videoCodecLookup($id) {\n\t\tstatic $lookup = array(\n\t\t\tGETID3_FLV_VIDEO_H263         => 'Sorenson H.263',\n\t\t\tGETID3_FLV_VIDEO_SCREEN       => 'Screen video',\n\t\t\tGETID3_FLV_VIDEO_VP6FLV       => 'On2 VP6',\n\t\t\tGETID3_FLV_VIDEO_VP6FLV_ALPHA => 'On2 VP6 with alpha channel',\n\t\t\tGETID3_FLV_VIDEO_SCREENV2     => 'Screen video v2',\n\t\t\tGETID3_FLV_VIDEO_H264         => 'Sorenson H.264',\n\t\t);\n\t\treturn (isset($lookup[$id]) ? $lookup[$id] : false);\n\t}\n}\n\nclass AMFStream {\n\tpublic $bytes;\n\tpublic $pos;\n\n\tpublic function __construct(&$bytes) {\n\t\t$this->bytes =& $bytes;\n\t\t$this->pos = 0;\n\t}\n\n\tpublic function readByte() {\n\t\treturn getid3_lib::BigEndian2Int(substr($this->bytes, $this->pos++, 1));\n\t}\n\n\tpublic function readInt() {\n\t\treturn ($this->readByte() << 8) + $this->readByte();\n\t}\n\n\tpublic function readLong() {\n\t\treturn ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte();\n\t}\n\n\tpublic function readDouble() {\n\t\treturn getid3_lib::BigEndian2Float($this->read(8));\n\t}\n\n\tpublic function readUTF() {\n\t\t$length = $this->readInt();\n\t\treturn $this->read($length);\n\t}\n\n\tpublic function readLongUTF() {\n\t\t$length = $this->readLong();\n\t\treturn $this->read($length);\n\t}\n\n\tpublic function read($length) {\n\t\t$val = substr($this->bytes, $this->pos, $length);\n\t\t$this->pos += $length;\n\t\treturn $val;\n\t}\n\n\tpublic function peekByte() {\n\t\t$pos = $this->pos;\n\t\t$val = $this->readByte();\n\t\t$this->pos = $pos;\n\t\treturn $val;\n\t}\n\n\tpublic function peekInt() {\n\t\t$pos = $this->pos;\n\t\t$val = $this->readInt();\n\t\t$this->pos = $pos;\n\t\treturn $val;\n\t}\n\n\tpublic function peekLong() {\n\t\t$pos = $this->pos;\n\t\t$val = $this->readLong();\n\t\t$this->pos = $pos;\n\t\treturn $val;\n\t}\n\n\tpublic function peekDouble() {\n\t\t$pos = $this->pos;\n\t\t$val = $this->readDouble();\n\t\t$this->pos = $pos;\n\t\treturn $val;\n\t}\n\n\tpublic function peekUTF() {\n\t\t$pos = $this->pos;\n\t\t$val = $this->readUTF();\n\t\t$this->pos = $pos;\n\t\treturn $val;\n\t}\n\n\tpublic function peekLongUTF() {\n\t\t$pos = $this->pos;\n\t\t$val = $this->readLongUTF();\n\t\t$this->pos = $pos;\n\t\treturn $val;\n\t}\n}\n\nclass AMFReader {\n\tpublic $stream;\n\n\tpublic function __construct(&$stream) {\n\t\t$this->stream =& $stream;\n\t}\n\n\tpublic function readData() {\n\t\t$value = null;\n\n\t\t$type = $this->stream->readByte();\n\t\tswitch ($type) {\n\n\t\t\t// Double\n\t\t\tcase 0:\n\t\t\t\t$value = $this->readDouble();\n\t\t\tbreak;\n\n\t\t\t// Boolean\n\t\t\tcase 1:\n\t\t\t\t$value = $this->readBoolean();\n\t\t\t\tbreak;\n\n\t\t\t// String\n\t\t\tcase 2:\n\t\t\t\t$value = $this->readString();\n\t\t\t\tbreak;\n\n\t\t\t// Object\n\t\t\tcase 3:\n\t\t\t\t$value = $this->readObject();\n\t\t\t\tbreak;\n\n\t\t\t// null\n\t\t\tcase 6:\n\t\t\t\treturn null;\n\t\t\t\tbreak;\n\n\t\t\t// Mixed array\n\t\t\tcase 8:\n\t\t\t\t$value = $this->readMixedArray();\n\t\t\t\tbreak;\n\n\t\t\t// Array\n\t\t\tcase 10:\n\t\t\t\t$value = $this->readArray();\n\t\t\t\tbreak;\n\n\t\t\t// Date\n\t\t\tcase 11:\n\t\t\t\t$value = $this->readDate();\n\t\t\t\tbreak;\n\n\t\t\t// Long string\n\t\t\tcase 13:\n\t\t\t\t$value = $this->readLongString();\n\t\t\t\tbreak;\n\n\t\t\t// XML (handled as string)\n\t\t\tcase 15:\n\t\t\t\t$value = $this->readXML();\n\t\t\t\tbreak;\n\n\t\t\t// Typed object (handled as object)\n\t\t\tcase 16:\n\t\t\t\t$value = $this->readTypedObject();\n\t\t\t\tbreak;\n\n\t\t\t// Long string\n\t\t\tdefault:\n\t\t\t\t$value = '(unknown or unsupported data type)';\n\t\t\tbreak;\n\t\t}\n\n\t\treturn $value;\n\t}\n\n\tpublic function readDouble() {\n\t\treturn $this->stream->readDouble();\n\t}\n\n\tpublic function readBoolean() {\n\t\treturn $this->stream->readByte() == 1;\n\t}\n\n\tpublic function readString() {\n\t\treturn $this->stream->readUTF();\n\t}\n\n\tpublic function readObject() {\n\t\t// Get highest numerical index - ignored\n//\t\t$highestIndex = $this->stream->readLong();\n\n\t\t$data = array();\n\n\t\twhile ($key = $this->stream->readUTF()) {\n\t\t\t$data[$key] = $this->readData();\n\t\t}\n\t\t// Mixed array record ends with empty string (0x00 0x00) and 0x09\n\t\tif (($key == '') && ($this->stream->peekByte() == 0x09)) {\n\t\t\t// Consume byte\n\t\t\t$this->stream->readByte();\n\t\t}\n\t\treturn $data;\n\t}\n\n\tpublic function readMixedArray() {\n\t\t// Get highest numerical index - ignored\n\t\t$highestIndex = $this->stream->readLong();\n\n\t\t$data = array();\n\n\t\twhile ($key = $this->stream->readUTF()) {\n\t\t\tif (is_numeric($key)) {\n\t\t\t\t$key = (float) $key;\n\t\t\t}\n\t\t\t$data[$key] = $this->readData();\n\t\t}\n\t\t// Mixed array record ends with empty string (0x00 0x00) and 0x09\n\t\tif (($key == '') && ($this->stream->peekByte() == 0x09)) {\n\t\t\t// Consume byte\n\t\t\t$this->stream->readByte();\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\tpublic function readArray() {\n\t\t$length = $this->stream->readLong();\n\t\t$data = array();\n\n\t\tfor ($i = 0; $i < $length; $i++) {\n\t\t\t$data[] = $this->readData();\n\t\t}\n\t\treturn $data;\n\t}\n\n\tpublic function readDate() {\n\t\t$timestamp = $this->stream->readDouble();\n\t\t$timezone = $this->stream->readInt();\n\t\treturn $timestamp;\n\t}\n\n\tpublic function readLongString() {\n\t\treturn $this->stream->readLongUTF();\n\t}\n\n\tpublic function readXML() {\n\t\treturn $this->stream->readLongUTF();\n\t}\n\n\tpublic function readTypedObject() {\n\t\t$className = $this->stream->readUTF();\n\t\treturn $this->readObject();\n\t}\n}\n\nclass AVCSequenceParameterSetReader {\n\tpublic $sps;\n\tpublic $start = 0;\n\tpublic $currentBytes = 0;\n\tpublic $currentBits = 0;\n\tpublic $width;\n\tpublic $height;\n\n\tpublic function __construct($sps) {\n\t\t$this->sps = $sps;\n\t}\n\n\tpublic function readData() {\n\t\t$this->skipBits(8);\n\t\t$this->skipBits(8);\n\t\t$profile = $this->getBits(8);                               // read profile\n\t\tif ($profile > 0) {\n\t\t\t$this->skipBits(8);\n\t\t\t$level_idc = $this->getBits(8);                         // level_idc\n\t\t\t$this->expGolombUe();                                   // seq_parameter_set_id // sps\n\t\t\t$this->expGolombUe();                                   // log2_max_frame_num_minus4\n\t\t\t$picOrderType = $this->expGolombUe();                   // pic_order_cnt_type\n\t\t\tif ($picOrderType == 0) {\n\t\t\t\t$this->expGolombUe();                               // log2_max_pic_order_cnt_lsb_minus4\n\t\t\t} elseif ($picOrderType == 1) {\n\t\t\t\t$this->skipBits(1);                                 // delta_pic_order_always_zero_flag\n\t\t\t\t$this->expGolombSe();                               // offset_for_non_ref_pic\n\t\t\t\t$this->expGolombSe();                               // offset_for_top_to_bottom_field\n\t\t\t\t$num_ref_frames_in_pic_order_cnt_cycle = $this->expGolombUe(); // num_ref_frames_in_pic_order_cnt_cycle\n\t\t\t\tfor ($i = 0; $i < $num_ref_frames_in_pic_order_cnt_cycle; $i++) {\n\t\t\t\t\t$this->expGolombSe();                           // offset_for_ref_frame[ i ]\n\t\t\t\t}\n\t\t\t}\n\t\t\t$this->expGolombUe();                                   // num_ref_frames\n\t\t\t$this->skipBits(1);                                     // gaps_in_frame_num_value_allowed_flag\n\t\t\t$pic_width_in_mbs_minus1 = $this->expGolombUe();        // pic_width_in_mbs_minus1\n\t\t\t$pic_height_in_map_units_minus1 = $this->expGolombUe(); // pic_height_in_map_units_minus1\n\n\t\t\t$frame_mbs_only_flag = $this->getBits(1);               // frame_mbs_only_flag\n\t\t\tif ($frame_mbs_only_flag == 0) {\n\t\t\t\t$this->skipBits(1);                                 // mb_adaptive_frame_field_flag\n\t\t\t}\n\t\t\t$this->skipBits(1);                                     // direct_8x8_inference_flag\n\t\t\t$frame_cropping_flag = $this->getBits(1);               // frame_cropping_flag\n\n\t\t\t$frame_crop_left_offset   = 0;\n\t\t\t$frame_crop_right_offset  = 0;\n\t\t\t$frame_crop_top_offset    = 0;\n\t\t\t$frame_crop_bottom_offset = 0;\n\n\t\t\tif ($frame_cropping_flag) {\n\t\t\t\t$frame_crop_left_offset   = $this->expGolombUe();   // frame_crop_left_offset\n\t\t\t\t$frame_crop_right_offset  = $this->expGolombUe();   // frame_crop_right_offset\n\t\t\t\t$frame_crop_top_offset    = $this->expGolombUe();   // frame_crop_top_offset\n\t\t\t\t$frame_crop_bottom_offset = $this->expGolombUe();   // frame_crop_bottom_offset\n\t\t\t}\n\t\t\t$this->skipBits(1);                                     // vui_parameters_present_flag\n\t\t\t// etc\n\n\t\t\t$this->width  = (($pic_width_in_mbs_minus1 + 1) * 16) - ($frame_crop_left_offset * 2) - ($frame_crop_right_offset * 2);\n\t\t\t$this->height = ((2 - $frame_mbs_only_flag) * ($pic_height_in_map_units_minus1 + 1) * 16) - ($frame_crop_top_offset * 2) - ($frame_crop_bottom_offset * 2);\n\t\t}\n\t}\n\n\tpublic function skipBits($bits) {\n\t\t$newBits = $this->currentBits + $bits;\n\t\t$this->currentBytes += (int)floor($newBits / 8);\n\t\t$this->currentBits = $newBits % 8;\n\t}\n\n\tpublic function getBit() {\n\t\t$result = (getid3_lib::BigEndian2Int(substr($this->sps, $this->currentBytes, 1)) >> (7 - $this->currentBits)) & 0x01;\n\t\t$this->skipBits(1);\n\t\treturn $result;\n\t}\n\n\tpublic function getBits($bits) {\n\t\t$result = 0;\n\t\tfor ($i = 0; $i < $bits; $i++) {\n\t\t\t$result = ($result << 1) + $this->getBit();\n\t\t}\n\t\treturn $result;\n\t}\n\n\tpublic function expGolombUe() {\n\t\t$significantBits = 0;\n\t\t$bit = $this->getBit();\n\t\twhile ($bit == 0) {\n\t\t\t$significantBits++;\n\t\t\t$bit = $this->getBit();\n\n\t\t\tif ($significantBits > 31) {\n\t\t\t\t// something is broken, this is an emergency escape to prevent infinite loops\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\treturn (1 << $significantBits) + $this->getBits($significantBits) - 1;\n\t}\n\n\tpublic function expGolombSe() {\n\t\t$result = $this->expGolombUe();\n\t\tif (($result & 0x01) == 0) {\n\t\t\treturn -($result >> 1);\n\t\t} else {\n\t\t\treturn ($result + 1) >> 1;\n\t\t}\n\t}\n\n\tpublic function getWidth() {\n\t\treturn $this->width;\n\t}\n\n\tpublic function getHeight() {\n\t\treturn $this->height;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio-video.matroska.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio-video.matriska.php                             //\n// module for analyzing Matroska containers                    //\n// dependencies: NONE                                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n\ndefine('EBML_ID_CHAPTERS',                  0x0043A770); // [10][43][A7][70] -- A system to define basic menus and partition data. For more detailed information, look at the Chapters Explanation.\ndefine('EBML_ID_SEEKHEAD',                  0x014D9B74); // [11][4D][9B][74] -- Contains the position of other level 1 elements.\ndefine('EBML_ID_TAGS',                      0x0254C367); // [12][54][C3][67] -- Element containing elements specific to Tracks/Chapters. A list of valid tags can be found <http://www.matroska.org/technical/specs/tagging/index.html>.\ndefine('EBML_ID_INFO',                      0x0549A966); // [15][49][A9][66] -- Contains miscellaneous general information and statistics on the file.\ndefine('EBML_ID_TRACKS',                    0x0654AE6B); // [16][54][AE][6B] -- A top-level block of information with many tracks described.\ndefine('EBML_ID_SEGMENT',                   0x08538067); // [18][53][80][67] -- This element contains all other top-level (level 1) elements. Typically a Matroska file is composed of 1 segment.\ndefine('EBML_ID_ATTACHMENTS',               0x0941A469); // [19][41][A4][69] -- Contain attached files.\ndefine('EBML_ID_EBML',                      0x0A45DFA3); // [1A][45][DF][A3] -- Set the EBML characteristics of the data to follow. Each EBML document has to start with this.\ndefine('EBML_ID_CUES',                      0x0C53BB6B); // [1C][53][BB][6B] -- A top-level element to speed seeking access. All entries are local to the segment.\ndefine('EBML_ID_CLUSTER',                   0x0F43B675); // [1F][43][B6][75] -- The lower level element containing the (monolithic) Block structure.\ndefine('EBML_ID_LANGUAGE',                    0x02B59C); //     [22][B5][9C] -- Specifies the language of the track in the Matroska languages form.\ndefine('EBML_ID_TRACKTIMECODESCALE',          0x03314F); //     [23][31][4F] -- The scale to apply on this track to work at normal speed in relation with other tracks (mostly used to adjust video speed when the audio length differs).\ndefine('EBML_ID_DEFAULTDURATION',             0x03E383); //     [23][E3][83] -- Number of nanoseconds (i.e. not scaled) per frame.\ndefine('EBML_ID_CODECNAME',                   0x058688); //     [25][86][88] -- A human-readable string specifying the codec.\ndefine('EBML_ID_CODECDOWNLOADURL',            0x06B240); //     [26][B2][40] -- A URL to download about the codec used.\ndefine('EBML_ID_TIMECODESCALE',               0x0AD7B1); //     [2A][D7][B1] -- Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are expressed in milliseconds).\ndefine('EBML_ID_COLOURSPACE',                 0x0EB524); //     [2E][B5][24] -- Same value as in AVI (32 bits).\ndefine('EBML_ID_GAMMAVALUE',                  0x0FB523); //     [2F][B5][23] -- Gamma Value.\ndefine('EBML_ID_CODECSETTINGS',               0x1A9697); //     [3A][96][97] -- A string describing the encoding setting used.\ndefine('EBML_ID_CODECINFOURL',                0x1B4040); //     [3B][40][40] -- A URL to find information about the codec used.\ndefine('EBML_ID_PREVFILENAME',                0x1C83AB); //     [3C][83][AB] -- An escaped filename corresponding to the previous segment.\ndefine('EBML_ID_PREVUID',                     0x1CB923); //     [3C][B9][23] -- A unique ID to identify the previous chained segment (128 bits).\ndefine('EBML_ID_NEXTFILENAME',                0x1E83BB); //     [3E][83][BB] -- An escaped filename corresponding to the next segment.\ndefine('EBML_ID_NEXTUID',                     0x1EB923); //     [3E][B9][23] -- A unique ID to identify the next chained segment (128 bits).\ndefine('EBML_ID_CONTENTCOMPALGO',               0x0254); //         [42][54] -- The compression algorithm used. Algorithms that have been specified so far are:\ndefine('EBML_ID_CONTENTCOMPSETTINGS',           0x0255); //         [42][55] -- Settings that might be needed by the decompressor. For Header Stripping (ContentCompAlgo=3), the bytes that were removed from the beggining of each frames of the track.\ndefine('EBML_ID_DOCTYPE',                       0x0282); //         [42][82] -- A string that describes the type of document that follows this EBML header ('matroska' in our case).\ndefine('EBML_ID_DOCTYPEREADVERSION',            0x0285); //         [42][85] -- The minimum DocType version an interpreter has to support to read this file.\ndefine('EBML_ID_EBMLVERSION',                   0x0286); //         [42][86] -- The version of EBML parser used to create the file.\ndefine('EBML_ID_DOCTYPEVERSION',                0x0287); //         [42][87] -- The version of DocType interpreter used to create the file.\ndefine('EBML_ID_EBMLMAXIDLENGTH',               0x02F2); //         [42][F2] -- The maximum length of the IDs you'll find in this file (4 or less in Matroska).\ndefine('EBML_ID_EBMLMAXSIZELENGTH',             0x02F3); //         [42][F3] -- The maximum length of the sizes you'll find in this file (8 or less in Matroska). This does not override the element size indicated at the beginning of an element. Elements that have an indicated size which is larger than what is allowed by EBMLMaxSizeLength shall be considered invalid.\ndefine('EBML_ID_EBMLREADVERSION',               0x02F7); //         [42][F7] -- The minimum EBML version a parser has to support to read this file.\ndefine('EBML_ID_CHAPLANGUAGE',                  0x037C); //         [43][7C] -- The languages corresponding to the string, in the bibliographic ISO-639-2 form.\ndefine('EBML_ID_CHAPCOUNTRY',                   0x037E); //         [43][7E] -- The countries corresponding to the string, same 2 octets as in Internet domains.\ndefine('EBML_ID_SEGMENTFAMILY',                 0x0444); //         [44][44] -- A randomly generated unique ID that all segments related to each other must use (128 bits).\ndefine('EBML_ID_DATEUTC',                       0x0461); //         [44][61] -- Date of the origin of timecode (value 0), i.e. production date.\ndefine('EBML_ID_TAGLANGUAGE',                   0x047A); //         [44][7A] -- Specifies the language of the tag specified, in the Matroska languages form.\ndefine('EBML_ID_TAGDEFAULT',                    0x0484); //         [44][84] -- Indication to know if this is the default/original language to use for the given tag.\ndefine('EBML_ID_TAGBINARY',                     0x0485); //         [44][85] -- The values of the Tag if it is binary. Note that this cannot be used in the same SimpleTag as TagString.\ndefine('EBML_ID_TAGSTRING',                     0x0487); //         [44][87] -- The value of the Tag.\ndefine('EBML_ID_DURATION',                      0x0489); //         [44][89] -- Duration of the segment (based on TimecodeScale).\ndefine('EBML_ID_CHAPPROCESSPRIVATE',            0x050D); //         [45][0D] -- Some optional data attached to the ChapProcessCodecID information. For ChapProcessCodecID = 1, it is the \"DVD level\" equivalent.\ndefine('EBML_ID_CHAPTERFLAGENABLED',            0x0598); //         [45][98] -- Specify wether the chapter is enabled. It can be enabled/disabled by a Control Track. When disabled, the movie should skip all the content between the TimeStart and TimeEnd of this chapter.\ndefine('EBML_ID_TAGNAME',                       0x05A3); //         [45][A3] -- The name of the Tag that is going to be stored.\ndefine('EBML_ID_EDITIONENTRY',                  0x05B9); //         [45][B9] -- Contains all information about a segment edition.\ndefine('EBML_ID_EDITIONUID',                    0x05BC); //         [45][BC] -- A unique ID to identify the edition. It's useful for tagging an edition.\ndefine('EBML_ID_EDITIONFLAGHIDDEN',             0x05BD); //         [45][BD] -- If an edition is hidden (1), it should not be available to the user interface (but still to Control Tracks).\ndefine('EBML_ID_EDITIONFLAGDEFAULT',            0x05DB); //         [45][DB] -- If a flag is set (1) the edition should be used as the default one.\ndefine('EBML_ID_EDITIONFLAGORDERED',            0x05DD); //         [45][DD] -- Specify if the chapters can be defined multiple times and the order to play them is enforced.\ndefine('EBML_ID_FILEDATA',                      0x065C); //         [46][5C] -- The data of the file.\ndefine('EBML_ID_FILEMIMETYPE',                  0x0660); //         [46][60] -- MIME type of the file.\ndefine('EBML_ID_FILENAME',                      0x066E); //         [46][6E] -- Filename of the attached file.\ndefine('EBML_ID_FILEREFERRAL',                  0x0675); //         [46][75] -- A binary value that a track/codec can refer to when the attachment is needed.\ndefine('EBML_ID_FILEDESCRIPTION',               0x067E); //         [46][7E] -- A human-friendly name for the attached file.\ndefine('EBML_ID_FILEUID',                       0x06AE); //         [46][AE] -- Unique ID representing the file, as random as possible.\ndefine('EBML_ID_CONTENTENCALGO',                0x07E1); //         [47][E1] -- The encryption algorithm used. The value '0' means that the contents have not been encrypted but only signed. Predefined values:\ndefine('EBML_ID_CONTENTENCKEYID',               0x07E2); //         [47][E2] -- For public key algorithms this is the ID of the public key the the data was encrypted with.\ndefine('EBML_ID_CONTENTSIGNATURE',              0x07E3); //         [47][E3] -- A cryptographic signature of the contents.\ndefine('EBML_ID_CONTENTSIGKEYID',               0x07E4); //         [47][E4] -- This is the ID of the private key the data was signed with.\ndefine('EBML_ID_CONTENTSIGALGO',                0x07E5); //         [47][E5] -- The algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values:\ndefine('EBML_ID_CONTENTSIGHASHALGO',            0x07E6); //         [47][E6] -- The hash algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values:\ndefine('EBML_ID_MUXINGAPP',                     0x0D80); //         [4D][80] -- Muxing application or library (\"libmatroska-0.4.3\").\ndefine('EBML_ID_SEEK',                          0x0DBB); //         [4D][BB] -- Contains a single seek entry to an EBML element.\ndefine('EBML_ID_CONTENTENCODINGORDER',          0x1031); //         [50][31] -- Tells when this modification was used during encoding/muxing starting with 0 and counting upwards. The decoder/demuxer has to start with the highest order number it finds and work its way down. This value has to be unique over all ContentEncodingOrder elements in the segment.\ndefine('EBML_ID_CONTENTENCODINGSCOPE',          0x1032); //         [50][32] -- A bit field that describes which elements have been modified in this way. Values (big endian) can be OR'ed. Possible values:\ndefine('EBML_ID_CONTENTENCODINGTYPE',           0x1033); //         [50][33] -- A value describing what kind of transformation has been done. Possible values:\ndefine('EBML_ID_CONTENTCOMPRESSION',            0x1034); //         [50][34] -- Settings describing the compression used. Must be present if the value of ContentEncodingType is 0 and absent otherwise. Each block must be decompressable even if no previous block is available in order not to prevent seeking.\ndefine('EBML_ID_CONTENTENCRYPTION',             0x1035); //         [50][35] -- Settings describing the encryption used. Must be present if the value of ContentEncodingType is 1 and absent otherwise.\ndefine('EBML_ID_CUEREFNUMBER',                  0x135F); //         [53][5F] -- Number of the referenced Block of Track X in the specified Cluster.\ndefine('EBML_ID_NAME',                          0x136E); //         [53][6E] -- A human-readable track name.\ndefine('EBML_ID_CUEBLOCKNUMBER',                0x1378); //         [53][78] -- Number of the Block in the specified Cluster.\ndefine('EBML_ID_TRACKOFFSET',                   0x137F); //         [53][7F] -- A value to add to the Block's Timecode. This can be used to adjust the playback offset of a track.\ndefine('EBML_ID_SEEKID',                        0x13AB); //         [53][AB] -- The binary ID corresponding to the element name.\ndefine('EBML_ID_SEEKPOSITION',                  0x13AC); //         [53][AC] -- The position of the element in the segment in octets (0 = first level 1 element).\ndefine('EBML_ID_STEREOMODE',                    0x13B8); //         [53][B8] -- Stereo-3D video mode.\ndefine('EBML_ID_OLDSTEREOMODE',                 0x13B9); //         [53][B9] -- Bogus StereoMode value used in old versions of libmatroska. DO NOT USE. (0: mono, 1: right eye, 2: left eye, 3: both eyes).\ndefine('EBML_ID_PIXELCROPBOTTOM',               0x14AA); //         [54][AA] -- The number of video pixels to remove at the bottom of the image (for HDTV content).\ndefine('EBML_ID_DISPLAYWIDTH',                  0x14B0); //         [54][B0] -- Width of the video frames to display.\ndefine('EBML_ID_DISPLAYUNIT',                   0x14B2); //         [54][B2] -- Type of the unit for DisplayWidth/Height (0: pixels, 1: centimeters, 2: inches).\ndefine('EBML_ID_ASPECTRATIOTYPE',               0x14B3); //         [54][B3] -- Specify the possible modifications to the aspect ratio (0: free resizing, 1: keep aspect ratio, 2: fixed).\ndefine('EBML_ID_DISPLAYHEIGHT',                 0x14BA); //         [54][BA] -- Height of the video frames to display.\ndefine('EBML_ID_PIXELCROPTOP',                  0x14BB); //         [54][BB] -- The number of video pixels to remove at the top of the image.\ndefine('EBML_ID_PIXELCROPLEFT',                 0x14CC); //         [54][CC] -- The number of video pixels to remove on the left of the image.\ndefine('EBML_ID_PIXELCROPRIGHT',                0x14DD); //         [54][DD] -- The number of video pixels to remove on the right of the image.\ndefine('EBML_ID_FLAGFORCED',                    0x15AA); //         [55][AA] -- Set if that track MUST be used during playback. There can be many forced track for a kind (audio, video or subs), the player should select the one which language matches the user preference or the default + forced track. Overlay MAY happen between a forced and non-forced track of the same kind.\ndefine('EBML_ID_MAXBLOCKADDITIONID',            0x15EE); //         [55][EE] -- The maximum value of BlockAddID. A value 0 means there is no BlockAdditions for this track.\ndefine('EBML_ID_WRITINGAPP',                    0x1741); //         [57][41] -- Writing application (\"mkvmerge-0.3.3\").\ndefine('EBML_ID_CLUSTERSILENTTRACKS',           0x1854); //         [58][54] -- The list of tracks that are not used in that part of the stream. It is useful when using overlay tracks on seeking. Then you should decide what track to use.\ndefine('EBML_ID_CLUSTERSILENTTRACKNUMBER',      0x18D7); //         [58][D7] -- One of the track number that are not used from now on in the stream. It could change later if not specified as silent in a further Cluster.\ndefine('EBML_ID_ATTACHEDFILE',                  0x21A7); //         [61][A7] -- An attached file.\ndefine('EBML_ID_CONTENTENCODING',               0x2240); //         [62][40] -- Settings for one content encoding like compression or encryption.\ndefine('EBML_ID_BITDEPTH',                      0x2264); //         [62][64] -- Bits per sample, mostly used for PCM.\ndefine('EBML_ID_CODECPRIVATE',                  0x23A2); //         [63][A2] -- Private data only known to the codec.\ndefine('EBML_ID_TARGETS',                       0x23C0); //         [63][C0] -- Contain all UIDs where the specified meta data apply. It is void to describe everything in the segment.\ndefine('EBML_ID_CHAPTERPHYSICALEQUIV',          0x23C3); //         [63][C3] -- Specify the physical equivalent of this ChapterAtom like \"DVD\" (60) or \"SIDE\" (50), see complete list of values.\ndefine('EBML_ID_TAGCHAPTERUID',                 0x23C4); //         [63][C4] -- A unique ID to identify the Chapter(s) the tags belong to. If the value is 0 at this level, the tags apply to all chapters in the Segment.\ndefine('EBML_ID_TAGTRACKUID',                   0x23C5); //         [63][C5] -- A unique ID to identify the Track(s) the tags belong to. If the value is 0 at this level, the tags apply to all tracks in the Segment.\ndefine('EBML_ID_TAGATTACHMENTUID',              0x23C6); //         [63][C6] -- A unique ID to identify the Attachment(s) the tags belong to. If the value is 0 at this level, the tags apply to all the attachments in the Segment.\ndefine('EBML_ID_TAGEDITIONUID',                 0x23C9); //         [63][C9] -- A unique ID to identify the EditionEntry(s) the tags belong to. If the value is 0 at this level, the tags apply to all editions in the Segment.\ndefine('EBML_ID_TARGETTYPE',                    0x23CA); //         [63][CA] -- An informational string that can be used to display the logical level of the target like \"ALBUM\", \"TRACK\", \"MOVIE\", \"CHAPTER\", etc (see TargetType).\ndefine('EBML_ID_TRACKTRANSLATE',                0x2624); //         [66][24] -- The track identification for the given Chapter Codec.\ndefine('EBML_ID_TRACKTRANSLATETRACKID',         0x26A5); //         [66][A5] -- The binary value used to represent this track in the chapter codec data. The format depends on the ChapProcessCodecID used.\ndefine('EBML_ID_TRACKTRANSLATECODEC',           0x26BF); //         [66][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu).\ndefine('EBML_ID_TRACKTRANSLATEEDITIONUID',      0x26FC); //         [66][FC] -- Specify an edition UID on which this translation applies. When not specified, it means for all editions found in the segment.\ndefine('EBML_ID_SIMPLETAG',                     0x27C8); //         [67][C8] -- Contains general information about the target.\ndefine('EBML_ID_TARGETTYPEVALUE',               0x28CA); //         [68][CA] -- A number to indicate the logical level of the target (see TargetType).\ndefine('EBML_ID_CHAPPROCESSCOMMAND',            0x2911); //         [69][11] -- Contains all the commands associated to the Atom.\ndefine('EBML_ID_CHAPPROCESSTIME',               0x2922); //         [69][22] -- Defines when the process command should be handled (0: during the whole chapter, 1: before starting playback, 2: after playback of the chapter).\ndefine('EBML_ID_CHAPTERTRANSLATE',              0x2924); //         [69][24] -- A tuple of corresponding ID used by chapter codecs to represent this segment.\ndefine('EBML_ID_CHAPPROCESSDATA',               0x2933); //         [69][33] -- Contains the command information. The data should be interpreted depending on the ChapProcessCodecID value. For ChapProcessCodecID = 1, the data correspond to the binary DVD cell pre/post commands.\ndefine('EBML_ID_CHAPPROCESS',                   0x2944); //         [69][44] -- Contains all the commands associated to the Atom.\ndefine('EBML_ID_CHAPPROCESSCODECID',            0x2955); //         [69][55] -- Contains the type of the codec used for the processing. A value of 0 means native Matroska processing (to be defined), a value of 1 means the DVD command set is used. More codec IDs can be added later.\ndefine('EBML_ID_CHAPTERTRANSLATEID',            0x29A5); //         [69][A5] -- The binary value used to represent this segment in the chapter codec data. The format depends on the ChapProcessCodecID used.\ndefine('EBML_ID_CHAPTERTRANSLATECODEC',         0x29BF); //         [69][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu).\ndefine('EBML_ID_CHAPTERTRANSLATEEDITIONUID',    0x29FC); //         [69][FC] -- Specify an edition UID on which this correspondance applies. When not specified, it means for all editions found in the segment.\ndefine('EBML_ID_CONTENTENCODINGS',              0x2D80); //         [6D][80] -- Settings for several content encoding mechanisms like compression or encryption.\ndefine('EBML_ID_MINCACHE',                      0x2DE7); //         [6D][E7] -- The minimum number of frames a player should be able to cache during playback. If set to 0, the reference pseudo-cache system is not used.\ndefine('EBML_ID_MAXCACHE',                      0x2DF8); //         [6D][F8] -- The maximum cache size required to store referenced frames in and the current frame. 0 means no cache is needed.\ndefine('EBML_ID_CHAPTERSEGMENTUID',             0x2E67); //         [6E][67] -- A segment to play in place of this chapter. Edition ChapterSegmentEditionUID should be used for this segment, otherwise no edition is used.\ndefine('EBML_ID_CHAPTERSEGMENTEDITIONUID',      0x2EBC); //         [6E][BC] -- The edition to play from the segment linked in ChapterSegmentUID.\ndefine('EBML_ID_TRACKOVERLAY',                  0x2FAB); //         [6F][AB] -- Specify that this track is an overlay track for the Track specified (in the u-integer). That means when this track has a gap (see SilentTracks) the overlay track should be used instead. The order of multiple TrackOverlay matters, the first one is the one that should be used. If not found it should be the second, etc.\ndefine('EBML_ID_TAG',                           0x3373); //         [73][73] -- Element containing elements specific to Tracks/Chapters.\ndefine('EBML_ID_SEGMENTFILENAME',               0x3384); //         [73][84] -- A filename corresponding to this segment.\ndefine('EBML_ID_SEGMENTUID',                    0x33A4); //         [73][A4] -- A randomly generated unique ID to identify the current segment between many others (128 bits).\ndefine('EBML_ID_CHAPTERUID',                    0x33C4); //         [73][C4] -- A unique ID to identify the Chapter.\ndefine('EBML_ID_TRACKUID',                      0x33C5); //         [73][C5] -- A unique ID to identify the Track. This should be kept the same when making a direct stream copy of the Track to another file.\ndefine('EBML_ID_ATTACHMENTLINK',                0x3446); //         [74][46] -- The UID of an attachment that is used by this codec.\ndefine('EBML_ID_CLUSTERBLOCKADDITIONS',         0x35A1); //         [75][A1] -- Contain additional blocks to complete the main one. An EBML parser that has no knowledge of the Block structure could still see and use/skip these data.\ndefine('EBML_ID_CHANNELPOSITIONS',              0x347B); //         [7D][7B] -- Table of horizontal angles for each successive channel, see appendix.\ndefine('EBML_ID_OUTPUTSAMPLINGFREQUENCY',       0x38B5); //         [78][B5] -- Real output sampling frequency in Hz (used for SBR techniques).\ndefine('EBML_ID_TITLE',                         0x3BA9); //         [7B][A9] -- General name of the segment.\ndefine('EBML_ID_CHAPTERDISPLAY',                  0x00); //             [80] -- Contains all possible strings to use for the chapter display.\ndefine('EBML_ID_TRACKTYPE',                       0x03); //             [83] -- A set of track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: subtitle, 0x12: buttons, 0x20: control).\ndefine('EBML_ID_CHAPSTRING',                      0x05); //             [85] -- Contains the string to use as the chapter atom.\ndefine('EBML_ID_CODECID',                         0x06); //             [86] -- An ID corresponding to the codec, see the codec page for more info.\ndefine('EBML_ID_FLAGDEFAULT',                     0x08); //             [88] -- Set if that track (audio, video or subs) SHOULD be used if no language found matches the user preference.\ndefine('EBML_ID_CHAPTERTRACKNUMBER',              0x09); //             [89] -- UID of the Track to apply this chapter too. In the absense of a control track, choosing this chapter will select the listed Tracks and deselect unlisted tracks. Absense of this element indicates that the Chapter should be applied to any currently used Tracks.\ndefine('EBML_ID_CLUSTERSLICES',                   0x0E); //             [8E] -- Contains slices description.\ndefine('EBML_ID_CHAPTERTRACK',                    0x0F); //             [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply\ndefine('EBML_ID_CHAPTERTIMESTART',                0x11); //             [91] -- Timecode of the start of Chapter (not scaled).\ndefine('EBML_ID_CHAPTERTIMEEND',                  0x12); //             [92] -- Timecode of the end of Chapter (timecode excluded, not scaled).\ndefine('EBML_ID_CUEREFTIME',                      0x16); //             [96] -- Timecode of the referenced Block.\ndefine('EBML_ID_CUEREFCLUSTER',                   0x17); //             [97] -- Position of the Cluster containing the referenced Block.\ndefine('EBML_ID_CHAPTERFLAGHIDDEN',               0x18); //             [98] -- If a chapter is hidden (1), it should not be available to the user interface (but still to Control Tracks).\ndefine('EBML_ID_FLAGINTERLACED',                  0x1A); //             [9A] -- Set if the video is interlaced.\ndefine('EBML_ID_CLUSTERBLOCKDURATION',            0x1B); //             [9B] -- The duration of the Block (based on TimecodeScale). This element is mandatory when DefaultDuration is set for the track. When not written and with no DefaultDuration, the value is assumed to be the difference between the timecode of this Block and the timecode of the next Block in \"display\" order (not coding order). This element can be useful at the end of a Track (as there is not other Block available), or when there is a break in a track like for subtitle tracks.\ndefine('EBML_ID_FLAGLACING',                      0x1C); //             [9C] -- Set if the track may contain blocks using lacing.\ndefine('EBML_ID_CHANNELS',                        0x1F); //             [9F] -- Numbers of channels in the track.\ndefine('EBML_ID_CLUSTERBLOCKGROUP',               0x20); //             [A0] -- Basic container of information containing a single Block or BlockVirtual, and information specific to that Block/VirtualBlock.\ndefine('EBML_ID_CLUSTERBLOCK',                    0x21); //             [A1] -- Block containing the actual data to be rendered and a timecode relative to the Cluster Timecode.\ndefine('EBML_ID_CLUSTERBLOCKVIRTUAL',             0x22); //             [A2] -- A Block with no data. It must be stored in the stream at the place the real Block should be in display order.\ndefine('EBML_ID_CLUSTERSIMPLEBLOCK',              0x23); //             [A3] -- Similar to Block but without all the extra information, mostly used to reduced overhead when no extra feature is needed.\ndefine('EBML_ID_CLUSTERCODECSTATE',               0x24); //             [A4] -- The new codec state to use. Data interpretation is private to the codec. This information should always be referenced by a seek entry.\ndefine('EBML_ID_CLUSTERBLOCKADDITIONAL',          0x25); //             [A5] -- Interpreted by the codec as it wishes (using the BlockAddID).\ndefine('EBML_ID_CLUSTERBLOCKMORE',                0x26); //             [A6] -- Contain the BlockAdditional and some parameters.\ndefine('EBML_ID_CLUSTERPOSITION',                 0x27); //             [A7] -- Position of the Cluster in the segment (0 in live broadcast streams). It might help to resynchronise offset on damaged streams.\ndefine('EBML_ID_CODECDECODEALL',                  0x2A); //             [AA] -- The codec can decode potentially damaged data.\ndefine('EBML_ID_CLUSTERPREVSIZE',                 0x2B); //             [AB] -- Size of the previous Cluster, in octets. Can be useful for backward playing.\ndefine('EBML_ID_TRACKENTRY',                      0x2E); //             [AE] -- Describes a track with all elements.\ndefine('EBML_ID_CLUSTERENCRYPTEDBLOCK',           0x2F); //             [AF] -- Similar to SimpleBlock but the data inside the Block are Transformed (encrypt and/or signed).\ndefine('EBML_ID_PIXELWIDTH',                      0x30); //             [B0] -- Width of the encoded video frames in pixels.\ndefine('EBML_ID_CUETIME',                         0x33); //             [B3] -- Absolute timecode according to the segment time base.\ndefine('EBML_ID_SAMPLINGFREQUENCY',               0x35); //             [B5] -- Sampling frequency in Hz.\ndefine('EBML_ID_CHAPTERATOM',                     0x36); //             [B6] -- Contains the atom information to use as the chapter atom (apply to all tracks).\ndefine('EBML_ID_CUETRACKPOSITIONS',               0x37); //             [B7] -- Contain positions for different tracks corresponding to the timecode.\ndefine('EBML_ID_FLAGENABLED',                     0x39); //             [B9] -- Set if the track is used.\ndefine('EBML_ID_PIXELHEIGHT',                     0x3A); //             [BA] -- Height of the encoded video frames in pixels.\ndefine('EBML_ID_CUEPOINT',                        0x3B); //             [BB] -- Contains all information relative to a seek point in the segment.\ndefine('EBML_ID_CRC32',                           0x3F); //             [BF] -- The CRC is computed on all the data of the Master element it's in, regardless of its position. It's recommended to put the CRC value at the beggining of the Master element for easier reading. All level 1 elements should include a CRC-32.\ndefine('EBML_ID_CLUSTERBLOCKADDITIONID',          0x4B); //             [CB] -- The ID of the BlockAdditional element (0 is the main Block).\ndefine('EBML_ID_CLUSTERLACENUMBER',               0x4C); //             [CC] -- The reverse number of the frame in the lace (0 is the last frame, 1 is the next to last, etc). While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback.\ndefine('EBML_ID_CLUSTERFRAMENUMBER',              0x4D); //             [CD] -- The number of the frame to generate from this lace with this delay (allow you to generate many frames from the same Block/Frame).\ndefine('EBML_ID_CLUSTERDELAY',                    0x4E); //             [CE] -- The (scaled) delay to apply to the element.\ndefine('EBML_ID_CLUSTERDURATION',                 0x4F); //             [CF] -- The (scaled) duration to apply to the element.\ndefine('EBML_ID_TRACKNUMBER',                     0x57); //             [D7] -- The track number as used in the Block Header (using more than 127 tracks is not encouraged, though the design allows an unlimited number).\ndefine('EBML_ID_CUEREFERENCE',                    0x5B); //             [DB] -- The Clusters containing the required referenced Blocks.\ndefine('EBML_ID_VIDEO',                           0x60); //             [E0] -- Video settings.\ndefine('EBML_ID_AUDIO',                           0x61); //             [E1] -- Audio settings.\ndefine('EBML_ID_CLUSTERTIMESLICE',                0x68); //             [E8] -- Contains extra time information about the data contained in the Block. While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback.\ndefine('EBML_ID_CUECODECSTATE',                   0x6A); //             [EA] -- The position of the Codec State corresponding to this Cue element. 0 means that the data is taken from the initial Track Entry.\ndefine('EBML_ID_CUEREFCODECSTATE',                0x6B); //             [EB] -- The position of the Codec State corresponding to this referenced element. 0 means that the data is taken from the initial Track Entry.\ndefine('EBML_ID_VOID',                            0x6C); //             [EC] -- Used to void damaged data, to avoid unexpected behaviors when using damaged data. The content is discarded. Also used to reserve space in a sub-element for later use.\ndefine('EBML_ID_CLUSTERTIMECODE',                 0x67); //             [E7] -- Absolute timecode of the cluster (based on TimecodeScale).\ndefine('EBML_ID_CLUSTERBLOCKADDID',               0x6E); //             [EE] -- An ID to identify the BlockAdditional level.\ndefine('EBML_ID_CUECLUSTERPOSITION',              0x71); //             [F1] -- The position of the Cluster containing the required Block.\ndefine('EBML_ID_CUETRACK',                        0x77); //             [F7] -- The track for which a position is given.\ndefine('EBML_ID_CLUSTERREFERENCEPRIORITY',        0x7A); //             [FA] -- This frame is referenced and has the specified cache priority. In cache only a frame of the same or higher priority can replace this frame. A value of 0 means the frame is not referenced.\ndefine('EBML_ID_CLUSTERREFERENCEBLOCK',           0x7B); //             [FB] -- Timecode of another frame used as a reference (ie: B or P frame). The timecode is relative to the block it's attached to.\ndefine('EBML_ID_CLUSTERREFERENCEVIRTUAL',         0x7D); //             [FD] -- Relative position of the data that should be in position of the virtual block.\n\n\n/**\n* @tutorial http://www.matroska.org/technical/specs/index.html\n*\n* @todo Rewrite EBML parser to reduce it's size and honor default element values\n* @todo After rewrite implement stream size calculation, that will provide additional useful info and enable AAC/FLAC audio bitrate detection\n*/\nclass getid3_matroska extends getid3_handler\n{\n\t// public options\n\tpublic static $hide_clusters    = true;  // if true, do not return information about CLUSTER chunks, since there's a lot of them and they're not usually useful [default: TRUE]\n\tpublic static $parse_whole_file = false; // true to parse the whole file, not only header [default: FALSE]\n\n\t// private parser settings/placeholders\n\tprivate $EBMLbuffer        = '';\n\tprivate $EBMLbuffer_offset = 0;\n\tprivate $EBMLbuffer_length = 0;\n\tprivate $current_offset    = 0;\n\tprivate $unuseful_elements = array(EBML_ID_CRC32, EBML_ID_VOID);\n\n\tpublic function Analyze()\n\t{\n\t\t$info = &$this->getid3->info;\n\n\t\t// parse container\n\t\ttry {\n\t\t\t$this->parseEBML($info);\n\t\t} catch (Exception $e) {\n\t\t\t$info['error'][] = 'EBML parser: '.$e->getMessage();\n\t\t}\n\n\t\t// calculate playtime\n\t\tif (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {\n\t\t\tforeach ($info['matroska']['info'] as $key => $infoarray) {\n\t\t\t\tif (isset($infoarray['Duration'])) {\n\t\t\t\t\t// TimecodeScale is how many nanoseconds each Duration unit is\n\t\t\t\t\t$info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// extract tags\n\t\tif (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) {\n\t\t\tforeach ($info['matroska']['tags'] as $key => $infoarray) {\n\t\t\t\t$this->ExtractCommentsSimpleTag($infoarray);\n\t\t\t}\n\t\t}\n\n\t\t// process tracks\n\t\tif (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {\n\t\t\tforeach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) {\n\n\t\t\t\t$track_info = array();\n\t\t\t\t$track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']);\n\t\t\t\t$track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true);\n\t\t\t\tif (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; }\n\n\t\t\t\tswitch ($trackarray['TrackType']) {\n\n\t\t\t\t\tcase 1: // Video\n\t\t\t\t\t\t$track_info['resolution_x'] = $trackarray['PixelWidth'];\n\t\t\t\t\t\t$track_info['resolution_y'] = $trackarray['PixelHeight'];\n\t\t\t\t\t\t$track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0);\n\t\t\t\t\t\t$track_info['display_x']    = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']);\n\t\t\t\t\t\t$track_info['display_y']    = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']);\n\n\t\t\t\t\t\tif (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; }\n\t\t\t\t\t\tif (isset($trackarray['PixelCropTop']))    { $track_info['crop_top']    = $trackarray['PixelCropTop']; }\n\t\t\t\t\t\tif (isset($trackarray['PixelCropLeft']))   { $track_info['crop_left']   = $trackarray['PixelCropLeft']; }\n\t\t\t\t\t\tif (isset($trackarray['PixelCropRight']))  { $track_info['crop_right']  = $trackarray['PixelCropRight']; }\n\t\t\t\t\t\tif (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate']  = round(1000000000 / $trackarray['DefaultDuration'], 3); }\n\t\t\t\t\t\tif (isset($trackarray['CodecName']))       { $track_info['codec']       = $trackarray['CodecName']; }\n\n\t\t\t\t\t\tswitch ($trackarray['CodecID']) {\n\t\t\t\t\t\t\tcase 'V_MS/VFW/FOURCC':\n\t\t\t\t\t\t\t\tgetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);\n\n\t\t\t\t\t\t\t\t$parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']);\n\t\t\t\t\t\t\t\t$track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']);\n\t\t\t\t\t\t\t\t$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t/*case 'V_MPEG4/ISO/AVC':\n\t\t\t\t\t\t\t\t$h264['profile']    = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1));\n\t\t\t\t\t\t\t\t$h264['level']      = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1));\n\t\t\t\t\t\t\t\t$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1));\n\t\t\t\t\t\t\t\t$h264['NALUlength'] = ($rn & 3) + 1;\n\t\t\t\t\t\t\t\t$rn                 = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1));\n\t\t\t\t\t\t\t\t$nsps               = ($rn & 31);\n\t\t\t\t\t\t\t\t$offset             = 6;\n\t\t\t\t\t\t\t\tfor ($i = 0; $i < $nsps; $i ++) {\n\t\t\t\t\t\t\t\t\t$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));\n\t\t\t\t\t\t\t\t\t$h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);\n\t\t\t\t\t\t\t\t\t$offset       += 2 + $length;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$npps               = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1));\n\t\t\t\t\t\t\t\t$offset            += 1;\n\t\t\t\t\t\t\t\tfor ($i = 0; $i < $npps; $i ++) {\n\t\t\t\t\t\t\t\t\t$length        = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2));\n\t\t\t\t\t\t\t\t\t$h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length);\n\t\t\t\t\t\t\t\t\t$offset       += 2 + $length;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264;\n\t\t\t\t\t\t\t\tbreak;*/\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$info['video']['streams'][] = $track_info;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 2: // Audio\n\t\t\t\t\t\t$track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0);\n\t\t\t\t\t\t$track_info['channels']    = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1);\n\t\t\t\t\t\t$track_info['language']    = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng');\n\t\t\t\t\t\tif (isset($trackarray['BitDepth']))  { $track_info['bits_per_sample'] = $trackarray['BitDepth']; }\n\t\t\t\t\t\tif (isset($trackarray['CodecName'])) { $track_info['codec']           = $trackarray['CodecName']; }\n\n\t\t\t\t\t\tswitch ($trackarray['CodecID']) {\n\t\t\t\t\t\t\tcase 'A_PCM/INT/LIT':\n\t\t\t\t\t\t\tcase 'A_PCM/INT/BIG':\n\t\t\t\t\t\t\t\t$track_info['bitrate'] = $trackarray['SamplingFrequency'] * $trackarray['Channels'] * $trackarray['BitDepth'];\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'A_AC3':\n\t\t\t\t\t\t\tcase 'A_DTS':\n\t\t\t\t\t\t\tcase 'A_MPEG/L3':\n\t\t\t\t\t\t\tcase 'A_MPEG/L2':\n\t\t\t\t\t\t\tcase 'A_FLAC':\n\t\t\t\t\t\t\t\tgetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']).'.php', __FILE__, true);\n\n\t\t\t\t\t\t\t\tif (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) {\n\t\t\t\t\t\t\t\t\t$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// create temp instance\n\t\t\t\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t\t\t\tif ($track_info['dataformat'] != 'flac') {\n\t\t\t\t\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'];\n\t\t\t\t\t\t\t\tif ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') {\n\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length'];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// analyze\n\t\t\t\t\t\t\t\t$class = 'getid3_'.($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']);\n\t\t\t\t\t\t\t\t$header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat'];\n\t\t\t\t\t\t\t\t$getid3_audio = new $class($getid3_temp, __CLASS__);\n\t\t\t\t\t\t\t\tif ($track_info['dataformat'] == 'flac') {\n\t\t\t\t\t\t\t\t\t$getid3_audio->AnalyzeString($trackarray['CodecPrivate']);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t$getid3_audio->Analyze();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info[$header_data_key])) {\n\t\t\t\t\t\t\t\t\t$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key];\n\t\t\t\t\t\t\t\t\tif (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {\n\t\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['audio'] as $key => $value) {\n\t\t\t\t\t\t\t\t\t\t\t$track_info[$key] = $value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// copy errors and warnings\n\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['error'])) {\n\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['error'] as $newerror) {\n\t\t\t\t\t\t\t\t\t\t$this->warning($class.'() says: ['.$newerror.']');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['warning'])) {\n\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['warning'] as $newerror) {\n\t\t\t\t\t\t\t\t\t\t$this->warning($class.'() says: ['.$newerror.']');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tunset($getid3_temp, $getid3_audio);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'A_AAC':\n\t\t\t\t\t\t\tcase 'A_AAC/MPEG2/LC':\n\t\t\t\t\t\t\tcase 'A_AAC/MPEG2/LC/SBR':\n\t\t\t\t\t\t\tcase 'A_AAC/MPEG4/LC':\n\t\t\t\t\t\t\tcase 'A_AAC/MPEG4/LC/SBR':\n\t\t\t\t\t\t\t\t$this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\\'t be calculated');\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'A_VORBIS':\n\t\t\t\t\t\t\t\tif (!isset($trackarray['CodecPrivate'])) {\n\t\t\t\t\t\t\t\t\t$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1);\n\t\t\t\t\t\t\t\tif ($vorbis_offset === false) {\n\t\t\t\t\t\t\t\t\t$this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain \"vorbis\" keyword');\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$vorbis_offset -= 1;\n\n\t\t\t\t\t\t\t\tgetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);\n\n\t\t\t\t\t\t\t\t// create temp instance\n\t\t\t\t\t\t\t\t$getid3_temp = new getID3();\n\n\t\t\t\t\t\t\t\t// analyze\n\t\t\t\t\t\t\t\t$getid3_ogg = new getid3_ogg($getid3_temp);\n\t\t\t\t\t\t\t\t$oggpageinfo['page_seqno'] = 0;\n\t\t\t\t\t\t\t\t$getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo);\n\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['ogg'])) {\n\t\t\t\t\t\t\t\t\t$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg'];\n\t\t\t\t\t\t\t\t\tif (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) {\n\t\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['audio'] as $key => $value) {\n\t\t\t\t\t\t\t\t\t\t\t$track_info[$key] = $value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// copy errors and warnings\n\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['error'])) {\n\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['error'] as $newerror) {\n\t\t\t\t\t\t\t\t\t\t$this->warning('getid3_ogg() says: ['.$newerror.']');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['warning'])) {\n\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['warning'] as $newerror) {\n\t\t\t\t\t\t\t\t\t\t$this->warning('getid3_ogg() says: ['.$newerror.']');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) {\n\t\t\t\t\t\t\t\t\t$track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal'];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tunset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'A_MS/ACM':\n\t\t\t\t\t\t\t\tgetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true);\n\n\t\t\t\t\t\t\t\t$parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']);\n\t\t\t\t\t\t\t\tforeach ($parsed as $key => $value) {\n\t\t\t\t\t\t\t\t\tif ($key != 'raw') {\n\t\t\t\t\t\t\t\t\t\t$track_info[$key] = $value;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t$this->warning('Unhandled audio type \"'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'\"');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$info['audio']['streams'][] = $track_info;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!empty($info['video']['streams'])) {\n\t\t\t\t$info['video'] = self::getDefaultStreamInfo($info['video']['streams']);\n\t\t\t}\n\t\t\tif (!empty($info['audio']['streams'])) {\n\t\t\t\t$info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']);\n\t\t\t}\n\t\t}\n\n\t\t// process attachments\n\t\tif (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) {\n\t\t\tforeach ($info['matroska']['attachments'] as $i => $entry) {\n\t\t\t\tif (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) {\n\t\t\t\t\t$info['matroska']['comments']['picture'][] = array('data' => $entry['FileData'], 'image_mime' => $entry['FileMimeType'], 'filename' => $entry['FileName']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// determine mime type\n\t\tif (!empty($info['video']['streams'])) {\n\t\t\t$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska');\n\t\t} elseif (!empty($info['audio']['streams'])) {\n\t\t\t$info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska');\n\t\t} elseif (isset($info['mime_type'])) {\n\t\t\tunset($info['mime_type']);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function parseEBML(&$info) {\n\t\t// http://www.matroska.org/technical/specs/index.html#EBMLBasics\n\t\t$this->current_offset = $info['avdataoffset'];\n\n\t\twhile ($this->getEBMLelement($top_element, $info['avdataend'])) {\n\t\t\tswitch ($top_element['id']) {\n\n\t\t\t\tcase EBML_ID_EBML:\n\t\t\t\t\t$info['matroska']['header']['offset'] = $top_element['offset'];\n\t\t\t\t\t$info['matroska']['header']['length'] = $top_element['length'];\n\n\t\t\t\t\twhile ($this->getEBMLelement($element_data, $top_element['end'], true)) {\n\t\t\t\t\t\tswitch ($element_data['id']) {\n\n\t\t\t\t\t\t\tcase EBML_ID_EBMLVERSION:\n\t\t\t\t\t\t\tcase EBML_ID_EBMLREADVERSION:\n\t\t\t\t\t\t\tcase EBML_ID_EBMLMAXIDLENGTH:\n\t\t\t\t\t\t\tcase EBML_ID_EBMLMAXSIZELENGTH:\n\t\t\t\t\t\t\tcase EBML_ID_DOCTYPEVERSION:\n\t\t\t\t\t\t\tcase EBML_ID_DOCTYPEREADVERSION:\n\t\t\t\t\t\t\t\t$element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EBML_ID_DOCTYPE:\n\t\t\t\t\t\t\t\t$element_data['data'] = getid3_lib::trimNullByte($element_data['data']);\n\t\t\t\t\t\t\t\t$info['matroska']['doctype'] = $element_data['data'];\n\t\t\t\t\t\t\t\t$info['fileformat'] = $element_data['data'];\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t$this->unhandledElement('header', __LINE__, $element_data);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tunset($element_data['offset'], $element_data['end']);\n\t\t\t\t\t\t$info['matroska']['header']['elements'][] = $element_data;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EBML_ID_SEGMENT:\n\t\t\t\t\t$info['matroska']['segment'][0]['offset'] = $top_element['offset'];\n\t\t\t\t\t$info['matroska']['segment'][0]['length'] = $top_element['length'];\n\n\t\t\t\t\twhile ($this->getEBMLelement($element_data, $top_element['end'])) {\n\t\t\t\t\t\tif ($element_data['id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required\n\t\t\t\t\t\t\t$info['matroska']['segments'][] = $element_data;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch ($element_data['id']) {\n\n\t\t\t\t\t\t\tcase EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements.\n\n\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($seek_entry, $element_data['end'])) {\n\t\t\t\t\t\t\t\t\tswitch ($seek_entry['id']) {\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_SEEK: // Contains a single seek entry to an EBML element\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_seek_entry['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_SEEKID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$seek_entry['target_id']   = self::EBML2Int($sub_seek_entry['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_SEEKPOSITION:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$seek_entry['target_offset'] = $element_data['offset'] + getid3_lib::BigEndian2Int($sub_seek_entry['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry);\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tif ($seek_entry['target_id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required\n\t\t\t\t\t\t\t\t\t\t\t\t$info['matroska']['seek'][] = $seek_entry;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('seekhead', __LINE__, $seek_entry);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EBML_ID_TRACKS: // A top-level block of information with many tracks described.\n\t\t\t\t\t\t\t\t$info['matroska']['tracks'] = $element_data;\n\n\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($track_entry, $element_data['end'])) {\n\t\t\t\t\t\t\t\t\tswitch ($track_entry['id']) {\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements.\n\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($subelement, $track_entry['end'], array(EBML_ID_VIDEO, EBML_ID_AUDIO, EBML_ID_CONTENTENCODINGS, EBML_ID_CODECPRIVATE))) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TRACKNUMBER:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TRACKUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TRACKTYPE:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_MINCACHE:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_MAXCACHE:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_MAXBLOCKADDITIONID:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_DEFAULTDURATION: // nanoseconds per frame\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TRACKTIMECODESCALE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CODECID:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_LANGUAGE:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_NAME:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CODECNAME:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CODECPRIVATE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FLAGENABLED:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FLAGDEFAULT:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FLAGFORCED:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FLAGLACING:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CODECDECODEALL:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_VIDEO:\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_PIXELWIDTH:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_PIXELHEIGHT:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_PIXELCROPBOTTOM:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_PIXELCROPTOP:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_PIXELCROPLEFT:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_PIXELCROPRIGHT:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_DISPLAYWIDTH:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_DISPLAYHEIGHT:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_DISPLAYUNIT:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_ASPECTRATIOTYPE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_STEREOMODE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_OLDSTEREOMODE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FLAGINTERLACED:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_GAMMAVALUE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_COLOURSPACE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('track.video', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_AUDIO:\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHANNELS:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_BITDEPTH:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_SAMPLINGFREQUENCY:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_OUTPUTSAMPLINGFREQUENCY:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHANNELPOSITIONS:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('track.audio', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTENCODINGS:\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'])) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTENCODING:\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTENCODINGORDER:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTENCODINGSCOPE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTENCODINGTYPE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTCOMPRESSION:\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_sub_sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTCOMPALGO:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTCOMPSETTINGS:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTENCRYPTION:\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_sub_sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTENCALGO:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTSIGALGO:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTSIGHASHALGO:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTENCKEYID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTSIGNATURE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CONTENTSIGKEYID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('track', __LINE__, $subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t$info['matroska']['tracks']['tracks'][] = $track_entry;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('tracks', __LINE__, $track_entry);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file.\n\t\t\t\t\t\t\t\t$info_entry = array();\n\n\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($subelement, $element_data['end'], true)) {\n\t\t\t\t\t\t\t\t\tswitch ($subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TIMECODESCALE:\n\t\t\t\t\t\t\t\t\t\t\t$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_DURATION:\n\t\t\t\t\t\t\t\t\t\t\t$info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_DATEUTC:\n\t\t\t\t\t\t\t\t\t\t\t$info_entry[$subelement['id_name']]         = getid3_lib::BigEndian2Int($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t$info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_SEGMENTUID:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_PREVUID:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_NEXTUID:\n\t\t\t\t\t\t\t\t\t\t\t$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_SEGMENTFAMILY:\n\t\t\t\t\t\t\t\t\t\t\t$info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_SEGMENTFILENAME:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_PREVFILENAME:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_NEXTFILENAME:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TITLE:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_MUXINGAPP:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_WRITINGAPP:\n\t\t\t\t\t\t\t\t\t\t\t$info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t$info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']];\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERTRANSLATE:\n\t\t\t\t\t\t\t\t\t\t\t$chaptertranslate_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERTRANSLATEEDITIONUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERTRANSLATECODEC:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERTRANSLATEID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$info_entry[$subelement['id_name']] = $chaptertranslate_entry;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('info', __LINE__, $subelement);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$info['matroska']['info'][] = $info_entry;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non \"live\" streams.\n\t\t\t\t\t\t\t\tif (self::$hide_clusters) { // do not parse cues if hide clusters is \"ON\" till they point to clusters anyway\n\t\t\t\t\t\t\t\t\t$this->current_offset = $element_data['end'];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$cues_entry = array();\n\n\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($subelement, $element_data['end'])) {\n\t\t\t\t\t\t\t\t\tswitch ($subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CUEPOINT:\n\t\t\t\t\t\t\t\t\t\t\t$cuepoint_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CUETRACKPOSITIONS:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cuetrackpositions_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CUETRACK:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CUECLUSTERPOSITION:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CUEBLOCKNUMBER:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CUECODECSTATE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cuetrackpositions_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CUETIME:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$cues_entry[] = $cuepoint_entry;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('cues', __LINE__, $subelement);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$info['matroska']['cues'] = $cues_entry;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters.\n\t\t\t\t\t\t\t\t$tags_entry = array();\n\n\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($subelement, $element_data['end'], false)) {\n\t\t\t\t\t\t\t\t\tswitch ($subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TAG:\n\t\t\t\t\t\t\t\t\t\t\t$tag_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TARGETS:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$targets_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TARGETTYPEVALUE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$targets_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TARGETTYPE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TAGTRACKUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TAGEDITIONUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TAGCHAPTERUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_TAGATTACHMENTUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$targets_entry[$sub_sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$tag_entry[$sub_subelement['id_name']] = $targets_entry;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_SIMPLETAG:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('tags.tag', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$tags_entry[] = $tag_entry;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('tags', __LINE__, $subelement);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$info['matroska']['tags'] = $tags_entry;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EBML_ID_ATTACHMENTS: // Contain attached files.\n\n\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($subelement, $element_data['end'])) {\n\t\t\t\t\t\t\t\t\tswitch ($subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_ATTACHEDFILE:\n\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FILEDESCRIPTION:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FILENAME:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FILEMIMETYPE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data'];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FILEDATA:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry['data_offset'] = $this->current_offset;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry['data_length'] = $sub_subelement['length'];\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry['FileName'],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry['data_offset'],\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry['data_length']);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->current_offset = $sub_subelement['end'];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_FILEUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$info['matroska']['attachments'][] = $attachedfile_entry;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('attachments', __LINE__, $subelement);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EBML_ID_CHAPTERS:\n\n\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($subelement, $element_data['end'])) {\n\t\t\t\t\t\t\t\t\tswitch ($subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_EDITIONENTRY:\n\t\t\t\t\t\t\t\t\t\t\t$editionentry_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_EDITIONUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_EDITIONFLAGHIDDEN:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_EDITIONFLAGDEFAULT:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_EDITIONFLAGORDERED:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERATOM:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chapteratom_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CHAPTERTRACK, EBML_ID_CHAPTERDISPLAY))) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERSEGMENTUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERSEGMENTEDITIONUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data'];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERFLAGENABLED:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERFLAGHIDDEN:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chapteratom_entry[$sub_sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERUID:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERTIMESTART:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERTIMEEND:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chapteratom_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERTRACK:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chaptertrack_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_sub_sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERTRACKNUMBER:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPTERDISPLAY:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chapterdisplay_entry = array();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_sub_sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPSTRING:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPLANGUAGE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CHAPCOUNTRY:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data'];\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$info['matroska']['chapters'][] = $editionentry_entry;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('chapters', __LINE__, $subelement);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure.\n\t\t\t\t\t\t\t\t$cluster_entry = array();\n\n\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($subelement, $element_data['end'], array(EBML_ID_CLUSTERSILENTTRACKS, EBML_ID_CLUSTERBLOCKGROUP, EBML_ID_CLUSTERSIMPLEBLOCK))) {\n\t\t\t\t\t\t\t\t\tswitch ($subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERTIMECODE:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERPOSITION:\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERPREVSIZE:\n\t\t\t\t\t\t\t\t\t\t\t$cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERSILENTTRACKS:\n\t\t\t\t\t\t\t\t\t\t\t$cluster_silent_tracks = array();\n\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERSILENTTRACKNUMBER:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERBLOCKGROUP:\n\t\t\t\t\t\t\t\t\t\t\t$cluster_block_group = array('offset' => $this->current_offset);\n\n\t\t\t\t\t\t\t\t\t\t\twhile ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch ($sub_subelement['id']) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERBLOCK:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, EBML_ID_CLUSTERBLOCK, $info);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERBLOCKDURATION:     // unsigned-int\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERREFERENCEBLOCK:    // signed-int\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cluster_block_group[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data'], false, true);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERCODECSTATE:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$cluster_entry[$subelement['id_name']][] = $cluster_block_group;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase EBML_ID_CLUSTERSIMPLEBLOCK:\n\t\t\t\t\t\t\t\t\t\t\t$cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info);\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$this->unhandledElement('cluster', __LINE__, $subelement);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$this->current_offset = $subelement['end'];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (!self::$hide_clusters) {\n\t\t\t\t\t\t\t\t\t$info['matroska']['cluster'][] = $cluster_entry;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// check to see if all the data we need exists already, if so, break out of the loop\n\t\t\t\t\t\t\t\tif (!self::$parse_whole_file) {\n\t\t\t\t\t\t\t\t\tif (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {\n\t\t\t\t\t\t\t\t\t\tif (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {\n\t\t\t\t\t\t\t\t\t\t\tif (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t$this->unhandledElement('segment', __LINE__, $element_data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$this->unhandledElement('root', __LINE__, $top_element);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate function EnsureBufferHasEnoughData($min_data=1024) {\n\t\tif (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) {\n\t\t\t$read_bytes = max($min_data, $this->getid3->fread_buffer_size());\n\n\t\t\ttry {\n\t\t\t\t$this->fseek($this->current_offset);\n\t\t\t\t$this->EBMLbuffer_offset = $this->current_offset;\n\t\t\t\t$this->EBMLbuffer        = $this->fread($read_bytes);\n\t\t\t\t$this->EBMLbuffer_length = strlen($this->EBMLbuffer);\n\t\t\t} catch (getid3_exception $e) {\n\t\t\t\t$this->warning('EBML parser: '.$e->getMessage());\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ($this->EBMLbuffer_length == 0 && $this->feof()) {\n\t\t\t\treturn $this->error('EBML parser: ran out of file at offset '.$this->current_offset);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate function readEBMLint() {\n\t\t$actual_offset = $this->current_offset - $this->EBMLbuffer_offset;\n\n\t\t// get length of integer\n\t\t$first_byte_int = ord($this->EBMLbuffer[$actual_offset]);\n\t\tif       (0x80 & $first_byte_int) {\n\t\t\t$length = 1;\n\t\t} elseif (0x40 & $first_byte_int) {\n\t\t\t$length = 2;\n\t\t} elseif (0x20 & $first_byte_int) {\n\t\t\t$length = 3;\n\t\t} elseif (0x10 & $first_byte_int) {\n\t\t\t$length = 4;\n\t\t} elseif (0x08 & $first_byte_int) {\n\t\t\t$length = 5;\n\t\t} elseif (0x04 & $first_byte_int) {\n\t\t\t$length = 6;\n\t\t} elseif (0x02 & $first_byte_int) {\n\t\t\t$length = 7;\n\t\t} elseif (0x01 & $first_byte_int) {\n\t\t\t$length = 8;\n\t\t} else {\n\t\t\tthrow new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset);\n\t\t}\n\n\t\t// read\n\t\t$int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length));\n\t\t$this->current_offset += $length;\n\n\t\treturn $int_value;\n\t}\n\n\tprivate function readEBMLelementData($length, $check_buffer=false) {\n\t\tif ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) {\n\t\t\treturn false;\n\t\t}\n\t\t$data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length);\n\t\t$this->current_offset += $length;\n\t\treturn $data;\n\t}\n\n\tprivate function getEBMLelement(&$element, $parent_end, $get_data=false) {\n\t\tif ($this->current_offset >= $parent_end) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!$this->EnsureBufferHasEnoughData()) {\n\t\t\t$this->current_offset = PHP_INT_MAX; // do not exit parser right now, allow to finish current loop to gather maximum information\n\t\t\treturn false;\n\t\t}\n\n\t\t$element = array();\n\n\t\t// set offset\n\t\t$element['offset'] = $this->current_offset;\n\n\t\t// get ID\n\t\t$element['id'] = $this->readEBMLint();\n\n\t\t// get name\n\t\t$element['id_name'] = self::EBMLidName($element['id']);\n\n\t\t// get length\n\t\t$element['length'] = $this->readEBMLint();\n\n\t\t// get end offset\n\t\t$element['end'] = $this->current_offset + $element['length'];\n\n\t\t// get raw data\n\t\t$dont_parse = (in_array($element['id'], $this->unuseful_elements) || $element['id_name'] == dechex($element['id']));\n\t\tif (($get_data === true || (is_array($get_data) && !in_array($element['id'], $get_data))) && !$dont_parse) {\n\t\t\t$element['data'] = $this->readEBMLelementData($element['length'], $element);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function unhandledElement($type, $line, $element) {\n\t\t// warn only about unknown and missed elements, not about unuseful\n\t\tif (!in_array($element['id'], $this->unuseful_elements)) {\n\t\t\t$this->warning('Unhandled '.$type.' element ['.basename(__FILE__).':'.$line.'] ('.$element['id'].'::'.$element['id_name'].' ['.$element['length'].' bytes]) at '.$element['offset']);\n\t\t}\n\n\t\t// increase offset for unparsed elements\n\t\tif (!isset($element['data'])) {\n\t\t\t$this->current_offset = $element['end'];\n\t\t}\n\t}\n\n\tprivate function ExtractCommentsSimpleTag($SimpleTagArray) {\n\t\tif (!empty($SimpleTagArray['SimpleTag'])) {\n\t\t\tforeach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) {\n\t\t\t\tif (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) {\n\t\t\t\t\t$this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString'];\n\t\t\t\t}\n\t\t\t\tif (!empty($SimpleTagData['SimpleTag'])) {\n\t\t\t\t\t$this->ExtractCommentsSimpleTag($SimpleTagData);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function HandleEMBLSimpleTag($parent_end) {\n\t\t$simpletag_entry = array();\n\n\t\twhile ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) {\n\t\t\tswitch ($element['id']) {\n\n\t\t\t\tcase EBML_ID_TAGNAME:\n\t\t\t\tcase EBML_ID_TAGLANGUAGE:\n\t\t\t\tcase EBML_ID_TAGSTRING:\n\t\t\t\tcase EBML_ID_TAGBINARY:\n\t\t\t\t\t$simpletag_entry[$element['id_name']] = $element['data'];\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EBML_ID_SIMPLETAG:\n\t\t\t\t\t$simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EBML_ID_TAGDEFAULT:\n\t\t\t\t\t$simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$this->unhandledElement('tag.simpletag', __LINE__, $element);\n\t\t\t}\n\t\t}\n\n\t\treturn $simpletag_entry;\n\t}\n\n\tprivate function HandleEMBLClusterBlock($element, $block_type, &$info) {\n\t\t// http://www.matroska.org/technical/specs/index.html#block_structure\n\t\t// http://www.matroska.org/technical/specs/index.html#simpleblock_structure\n\n\t\t$block_data = array();\n\t\t$block_data['tracknumber'] = $this->readEBMLint();\n\t\t$block_data['timecode']    = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true);\n\t\t$block_data['flags_raw']   = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));\n\n\t\tif ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {\n\t\t\t$block_data['flags']['keyframe']  = (($block_data['flags_raw'] & 0x80) >> 7);\n\t\t\t//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4);\n\t\t}\n\t\telse {\n\t\t\t//$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4);\n\t\t}\n\t\t$block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3);\n\t\t$block_data['flags']['lacing']    =       (($block_data['flags_raw'] & 0x06) >> 1);  // 00=no lacing; 01=Xiph lacing; 11=EBML lacing; 10=fixed-size lacing\n\t\tif ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) {\n\t\t\t$block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01));\n\t\t}\n\t\telse {\n\t\t\t//$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0);\n\t\t}\n\t\t$block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']);\n\n\t\t// Lace (when lacing bit is set)\n\t\tif ($block_data['flags']['lacing'] > 0) {\n\t\t\t$block_data['lace_frames'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)) + 1; // Number of frames in the lace-1 (uint8)\n\t\t\tif ($block_data['flags']['lacing'] != 0x02) {\n\t\t\t\tfor ($i = 1; $i < $block_data['lace_frames']; $i ++) { // Lace-coded size of each frame of the lace, except for the last one (multiple uint8). *This is not used with Fixed-size lacing as it is calculated automatically from (total size of lace) / (number of frames in lace).\n\t\t\t\t\tif ($block_data['flags']['lacing'] == 0x03) { // EBML lacing\n\t\t\t\t\t\t$block_data['lace_frames_size'][$i] = $this->readEBMLint(); // TODO: read size correctly, calc size for the last frame. For now offsets are deteminded OK with readEBMLint() and that's the most important thing.\n\t\t\t\t\t}\n\t\t\t\t\telse { // Xiph lacing\n\t\t\t\t\t\t$block_data['lace_frames_size'][$i] = 0;\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t$size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1));\n\t\t\t\t\t\t\t$block_data['lace_frames_size'][$i] += $size;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twhile ($size == 255);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($block_data['flags']['lacing'] == 0x01) { // calc size of the last frame only for Xiph lacing, till EBML sizes are now anyway determined incorrectly\n\t\t\t\t\t$block_data['lace_frames_size'][] = $element['end'] - $this->current_offset - array_sum($block_data['lace_frames_size']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) {\n\t\t\t$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset;\n\t\t\t$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'] = $element['end'] - $this->current_offset;\n\t\t\t//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0;\n\t\t}\n\t\t//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] += $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'];\n\t\t//$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['duration']      = $block_data['timecode'] * ((isset($info['matroska']['info'][0]['TimecodeScale']) ? $info['matroska']['info'][0]['TimecodeScale'] : 1000000) / 1000000000);\n\n\t\t// set offset manually\n\t\t$this->current_offset = $element['end'];\n\n\t\treturn $block_data;\n\t}\n\n\tprivate static function EBML2Int($EBMLstring) {\n\t\t// http://matroska.org/specs/\n\n\t\t// Element ID coded with an UTF-8 like system:\n\t\t// 1xxx xxxx                                  - Class A IDs (2^7 -2 possible values) (base 0x8X)\n\t\t// 01xx xxxx  xxxx xxxx                       - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX)\n\t\t// 001x xxxx  xxxx xxxx  xxxx xxxx            - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX)\n\t\t// 0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX)\n\t\t// Values with all x at 0 and 1 are reserved (hence the -2).\n\n\t\t// Data size, in octets, is also coded with an UTF-8 like system :\n\t\t// 1xxx xxxx                                                                              - value 0 to  2^7-2\n\t\t// 01xx xxxx  xxxx xxxx                                                                   - value 0 to 2^14-2\n\t\t// 001x xxxx  xxxx xxxx  xxxx xxxx                                                        - value 0 to 2^21-2\n\t\t// 0001 xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                             - value 0 to 2^28-2\n\t\t// 0000 1xxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                                  - value 0 to 2^35-2\n\t\t// 0000 01xx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx                       - value 0 to 2^42-2\n\t\t// 0000 001x  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx            - value 0 to 2^49-2\n\t\t// 0000 0001  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx  xxxx xxxx - value 0 to 2^56-2\n\n\t\t$first_byte_int = ord($EBMLstring[0]);\n\t\tif (0x80 & $first_byte_int) {\n\t\t\t$EBMLstring[0] = chr($first_byte_int & 0x7F);\n\t\t} elseif (0x40 & $first_byte_int) {\n\t\t\t$EBMLstring[0] = chr($first_byte_int & 0x3F);\n\t\t} elseif (0x20 & $first_byte_int) {\n\t\t\t$EBMLstring[0] = chr($first_byte_int & 0x1F);\n\t\t} elseif (0x10 & $first_byte_int) {\n\t\t\t$EBMLstring[0] = chr($first_byte_int & 0x0F);\n\t\t} elseif (0x08 & $first_byte_int) {\n\t\t\t$EBMLstring[0] = chr($first_byte_int & 0x07);\n\t\t} elseif (0x04 & $first_byte_int) {\n\t\t\t$EBMLstring[0] = chr($first_byte_int & 0x03);\n\t\t} elseif (0x02 & $first_byte_int) {\n\t\t\t$EBMLstring[0] = chr($first_byte_int & 0x01);\n\t\t} elseif (0x01 & $first_byte_int) {\n\t\t\t$EBMLstring[0] = chr($first_byte_int & 0x00);\n\t\t}\n\n\t\treturn getid3_lib::BigEndian2Int($EBMLstring);\n\t}\n\n\tprivate static function EBMLdate2unix($EBMLdatestamp) {\n\t\t// Date - signed 8 octets integer in nanoseconds with 0 indicating the precise beginning of the millennium (at 2001-01-01T00:00:00,000000000 UTC)\n\t\t// 978307200 == mktime(0, 0, 0, 1, 1, 2001) == January 1, 2001 12:00:00am UTC\n\t\treturn round(($EBMLdatestamp / 1000000000) + 978307200);\n\t}\n\n\tpublic static function TargetTypeValue($target_type) {\n\t\t// http://www.matroska.org/technical/specs/tagging/index.html\n\t\tstatic $TargetTypeValue = array();\n\t\tif (empty($TargetTypeValue)) {\n\t\t\t$TargetTypeValue[10] = 'A: ~ V:shot';                                           // the lowest hierarchy found in music or movies\n\t\t\t$TargetTypeValue[20] = 'A:subtrack/part/movement ~ V:scene';                    // corresponds to parts of a track for audio (like a movement)\n\t\t\t$TargetTypeValue[30] = 'A:track/song ~ V:chapter';                              // the common parts of an album or a movie\n\t\t\t$TargetTypeValue[40] = 'A:part/session ~ V:part/session';                       // when an album or episode has different logical parts\n\t\t\t$TargetTypeValue[50] = 'A:album/opera/concert ~ V:movie/episode/concert';       // the most common grouping level of music and video (equals to an episode for TV series)\n\t\t\t$TargetTypeValue[60] = 'A:edition/issue/volume/opus ~ V:season/sequel/volume';  // a list of lower levels grouped together\n\t\t\t$TargetTypeValue[70] = 'A:collection ~ V:collection';                           // the high hierarchy consisting of many different lower items\n\t\t}\n\t\treturn (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type);\n\t}\n\n\tpublic static function BlockLacingType($lacingtype) {\n\t\t// http://matroska.org/technical/specs/index.html#block_structure\n\t\tstatic $BlockLacingType = array();\n\t\tif (empty($BlockLacingType)) {\n\t\t\t$BlockLacingType[0x00] = 'no lacing';\n\t\t\t$BlockLacingType[0x01] = 'Xiph lacing';\n\t\t\t$BlockLacingType[0x02] = 'fixed-size lacing';\n\t\t\t$BlockLacingType[0x03] = 'EBML lacing';\n\t\t}\n\t\treturn (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype);\n\t}\n\n\tpublic static function CodecIDtoCommonName($codecid) {\n\t\t// http://www.matroska.org/technical/specs/codecid/index.html\n\t\tstatic $CodecIDlist = array();\n\t\tif (empty($CodecIDlist)) {\n\t\t\t$CodecIDlist['A_AAC']            = 'aac';\n\t\t\t$CodecIDlist['A_AAC/MPEG2/LC']   = 'aac';\n\t\t\t$CodecIDlist['A_AC3']            = 'ac3';\n\t\t\t$CodecIDlist['A_DTS']            = 'dts';\n\t\t\t$CodecIDlist['A_FLAC']           = 'flac';\n\t\t\t$CodecIDlist['A_MPEG/L1']        = 'mp1';\n\t\t\t$CodecIDlist['A_MPEG/L2']        = 'mp2';\n\t\t\t$CodecIDlist['A_MPEG/L3']        = 'mp3';\n\t\t\t$CodecIDlist['A_PCM/INT/LIT']    = 'pcm';       // PCM Integer Little Endian\n\t\t\t$CodecIDlist['A_PCM/INT/BIG']    = 'pcm';       // PCM Integer Big Endian\n\t\t\t$CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music\n\t\t\t$CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2\n\t\t\t$CodecIDlist['A_VORBIS']         = 'vorbis';\n\t\t\t$CodecIDlist['V_MPEG1']          = 'mpeg';\n\t\t\t$CodecIDlist['V_THEORA']         = 'theora';\n\t\t\t$CodecIDlist['V_REAL/RV40']      = 'real';\n\t\t\t$CodecIDlist['V_REAL/RV10']      = 'real';\n\t\t\t$CodecIDlist['V_REAL/RV20']      = 'real';\n\t\t\t$CodecIDlist['V_REAL/RV30']      = 'real';\n\t\t\t$CodecIDlist['V_QUICKTIME']      = 'quicktime'; // Quicktime\n\t\t\t$CodecIDlist['V_MPEG4/ISO/AP']   = 'mpeg4';\n\t\t\t$CodecIDlist['V_MPEG4/ISO/ASP']  = 'mpeg4';\n\t\t\t$CodecIDlist['V_MPEG4/ISO/AVC']  = 'h264';\n\t\t\t$CodecIDlist['V_MPEG4/ISO/SP']   = 'mpeg4';\n\t\t\t$CodecIDlist['V_VP8']            = 'vp8';\n\t\t\t$CodecIDlist['V_MS/VFW/FOURCC']  = 'vcm'; // Microsoft (TM) Video Codec Manager (VCM)\n\t\t\t$CodecIDlist['A_MS/ACM']         = 'acm'; // Microsoft (TM) Audio Codec Manager (ACM)\n\t\t}\n\t\treturn (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid);\n\t}\n\n\tprivate static function EBMLidName($value) {\n\t\tstatic $EBMLidList = array();\n\t\tif (empty($EBMLidList)) {\n\t\t\t$EBMLidList[EBML_ID_ASPECTRATIOTYPE]            = 'AspectRatioType';\n\t\t\t$EBMLidList[EBML_ID_ATTACHEDFILE]               = 'AttachedFile';\n\t\t\t$EBMLidList[EBML_ID_ATTACHMENTLINK]             = 'AttachmentLink';\n\t\t\t$EBMLidList[EBML_ID_ATTACHMENTS]                = 'Attachments';\n\t\t\t$EBMLidList[EBML_ID_AUDIO]                      = 'Audio';\n\t\t\t$EBMLidList[EBML_ID_BITDEPTH]                   = 'BitDepth';\n\t\t\t$EBMLidList[EBML_ID_CHANNELPOSITIONS]           = 'ChannelPositions';\n\t\t\t$EBMLidList[EBML_ID_CHANNELS]                   = 'Channels';\n\t\t\t$EBMLidList[EBML_ID_CHAPCOUNTRY]                = 'ChapCountry';\n\t\t\t$EBMLidList[EBML_ID_CHAPLANGUAGE]               = 'ChapLanguage';\n\t\t\t$EBMLidList[EBML_ID_CHAPPROCESS]                = 'ChapProcess';\n\t\t\t$EBMLidList[EBML_ID_CHAPPROCESSCODECID]         = 'ChapProcessCodecID';\n\t\t\t$EBMLidList[EBML_ID_CHAPPROCESSCOMMAND]         = 'ChapProcessCommand';\n\t\t\t$EBMLidList[EBML_ID_CHAPPROCESSDATA]            = 'ChapProcessData';\n\t\t\t$EBMLidList[EBML_ID_CHAPPROCESSPRIVATE]         = 'ChapProcessPrivate';\n\t\t\t$EBMLidList[EBML_ID_CHAPPROCESSTIME]            = 'ChapProcessTime';\n\t\t\t$EBMLidList[EBML_ID_CHAPSTRING]                 = 'ChapString';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERATOM]                = 'ChapterAtom';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERDISPLAY]             = 'ChapterDisplay';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERFLAGENABLED]         = 'ChapterFlagEnabled';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN]          = 'ChapterFlagHidden';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV]       = 'ChapterPhysicalEquiv';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERS]                   = 'Chapters';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID]   = 'ChapterSegmentEditionUID';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERSEGMENTUID]          = 'ChapterSegmentUID';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERTIMEEND]             = 'ChapterTimeEnd';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERTIMESTART]           = 'ChapterTimeStart';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERTRACK]               = 'ChapterTrack';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERTRACKNUMBER]         = 'ChapterTrackNumber';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERTRANSLATE]           = 'ChapterTranslate';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC]      = 'ChapterTranslateCodec';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERTRANSLATEID]         = 'ChapterTranslateID';\n\t\t\t$EBMLidList[EBML_ID_CHAPTERUID]                 = 'ChapterUID';\n\t\t\t$EBMLidList[EBML_ID_CLUSTER]                    = 'Cluster';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCK]               = 'ClusterBlock';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCKADDID]          = 'ClusterBlockAddID';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL]     = 'ClusterBlockAdditional';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID]     = 'ClusterBlockAdditionID';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS]      = 'ClusterBlockAdditions';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCKDURATION]       = 'ClusterBlockDuration';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCKGROUP]          = 'ClusterBlockGroup';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCKMORE]           = 'ClusterBlockMore';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL]        = 'ClusterBlockVirtual';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERCODECSTATE]          = 'ClusterCodecState';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERDELAY]               = 'ClusterDelay';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERDURATION]            = 'ClusterDuration';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK]      = 'ClusterEncryptedBlock';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERFRAMENUMBER]         = 'ClusterFrameNumber';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERLACENUMBER]          = 'ClusterLaceNumber';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERPOSITION]            = 'ClusterPosition';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERPREVSIZE]            = 'ClusterPrevSize';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK]      = 'ClusterReferenceBlock';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY]   = 'ClusterReferencePriority';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL]    = 'ClusterReferenceVirtual';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER]   = 'ClusterSilentTrackNumber';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERSILENTTRACKS]        = 'ClusterSilentTracks';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK]         = 'ClusterSimpleBlock';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERTIMECODE]            = 'ClusterTimecode';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERTIMESLICE]           = 'ClusterTimeSlice';\n\t\t\t$EBMLidList[EBML_ID_CODECDECODEALL]             = 'CodecDecodeAll';\n\t\t\t$EBMLidList[EBML_ID_CODECDOWNLOADURL]           = 'CodecDownloadURL';\n\t\t\t$EBMLidList[EBML_ID_CODECID]                    = 'CodecID';\n\t\t\t$EBMLidList[EBML_ID_CODECINFOURL]               = 'CodecInfoURL';\n\t\t\t$EBMLidList[EBML_ID_CODECNAME]                  = 'CodecName';\n\t\t\t$EBMLidList[EBML_ID_CODECPRIVATE]               = 'CodecPrivate';\n\t\t\t$EBMLidList[EBML_ID_CODECSETTINGS]              = 'CodecSettings';\n\t\t\t$EBMLidList[EBML_ID_COLOURSPACE]                = 'ColourSpace';\n\t\t\t$EBMLidList[EBML_ID_CONTENTCOMPALGO]            = 'ContentCompAlgo';\n\t\t\t$EBMLidList[EBML_ID_CONTENTCOMPRESSION]         = 'ContentCompression';\n\t\t\t$EBMLidList[EBML_ID_CONTENTCOMPSETTINGS]        = 'ContentCompSettings';\n\t\t\t$EBMLidList[EBML_ID_CONTENTENCALGO]             = 'ContentEncAlgo';\n\t\t\t$EBMLidList[EBML_ID_CONTENTENCKEYID]            = 'ContentEncKeyID';\n\t\t\t$EBMLidList[EBML_ID_CONTENTENCODING]            = 'ContentEncoding';\n\t\t\t$EBMLidList[EBML_ID_CONTENTENCODINGORDER]       = 'ContentEncodingOrder';\n\t\t\t$EBMLidList[EBML_ID_CONTENTENCODINGS]           = 'ContentEncodings';\n\t\t\t$EBMLidList[EBML_ID_CONTENTENCODINGSCOPE]       = 'ContentEncodingScope';\n\t\t\t$EBMLidList[EBML_ID_CONTENTENCODINGTYPE]        = 'ContentEncodingType';\n\t\t\t$EBMLidList[EBML_ID_CONTENTENCRYPTION]          = 'ContentEncryption';\n\t\t\t$EBMLidList[EBML_ID_CONTENTSIGALGO]             = 'ContentSigAlgo';\n\t\t\t$EBMLidList[EBML_ID_CONTENTSIGHASHALGO]         = 'ContentSigHashAlgo';\n\t\t\t$EBMLidList[EBML_ID_CONTENTSIGKEYID]            = 'ContentSigKeyID';\n\t\t\t$EBMLidList[EBML_ID_CONTENTSIGNATURE]           = 'ContentSignature';\n\t\t\t$EBMLidList[EBML_ID_CRC32]                      = 'CRC32';\n\t\t\t$EBMLidList[EBML_ID_CUEBLOCKNUMBER]             = 'CueBlockNumber';\n\t\t\t$EBMLidList[EBML_ID_CUECLUSTERPOSITION]         = 'CueClusterPosition';\n\t\t\t$EBMLidList[EBML_ID_CUECODECSTATE]              = 'CueCodecState';\n\t\t\t$EBMLidList[EBML_ID_CUEPOINT]                   = 'CuePoint';\n\t\t\t$EBMLidList[EBML_ID_CUEREFCLUSTER]              = 'CueRefCluster';\n\t\t\t$EBMLidList[EBML_ID_CUEREFCODECSTATE]           = 'CueRefCodecState';\n\t\t\t$EBMLidList[EBML_ID_CUEREFERENCE]               = 'CueReference';\n\t\t\t$EBMLidList[EBML_ID_CUEREFNUMBER]               = 'CueRefNumber';\n\t\t\t$EBMLidList[EBML_ID_CUEREFTIME]                 = 'CueRefTime';\n\t\t\t$EBMLidList[EBML_ID_CUES]                       = 'Cues';\n\t\t\t$EBMLidList[EBML_ID_CUETIME]                    = 'CueTime';\n\t\t\t$EBMLidList[EBML_ID_CUETRACK]                   = 'CueTrack';\n\t\t\t$EBMLidList[EBML_ID_CUETRACKPOSITIONS]          = 'CueTrackPositions';\n\t\t\t$EBMLidList[EBML_ID_DATEUTC]                    = 'DateUTC';\n\t\t\t$EBMLidList[EBML_ID_DEFAULTDURATION]            = 'DefaultDuration';\n\t\t\t$EBMLidList[EBML_ID_DISPLAYHEIGHT]              = 'DisplayHeight';\n\t\t\t$EBMLidList[EBML_ID_DISPLAYUNIT]                = 'DisplayUnit';\n\t\t\t$EBMLidList[EBML_ID_DISPLAYWIDTH]               = 'DisplayWidth';\n\t\t\t$EBMLidList[EBML_ID_DOCTYPE]                    = 'DocType';\n\t\t\t$EBMLidList[EBML_ID_DOCTYPEREADVERSION]         = 'DocTypeReadVersion';\n\t\t\t$EBMLidList[EBML_ID_DOCTYPEVERSION]             = 'DocTypeVersion';\n\t\t\t$EBMLidList[EBML_ID_DURATION]                   = 'Duration';\n\t\t\t$EBMLidList[EBML_ID_EBML]                       = 'EBML';\n\t\t\t$EBMLidList[EBML_ID_EBMLMAXIDLENGTH]            = 'EBMLMaxIDLength';\n\t\t\t$EBMLidList[EBML_ID_EBMLMAXSIZELENGTH]          = 'EBMLMaxSizeLength';\n\t\t\t$EBMLidList[EBML_ID_EBMLREADVERSION]            = 'EBMLReadVersion';\n\t\t\t$EBMLidList[EBML_ID_EBMLVERSION]                = 'EBMLVersion';\n\t\t\t$EBMLidList[EBML_ID_EDITIONENTRY]               = 'EditionEntry';\n\t\t\t$EBMLidList[EBML_ID_EDITIONFLAGDEFAULT]         = 'EditionFlagDefault';\n\t\t\t$EBMLidList[EBML_ID_EDITIONFLAGHIDDEN]          = 'EditionFlagHidden';\n\t\t\t$EBMLidList[EBML_ID_EDITIONFLAGORDERED]         = 'EditionFlagOrdered';\n\t\t\t$EBMLidList[EBML_ID_EDITIONUID]                 = 'EditionUID';\n\t\t\t$EBMLidList[EBML_ID_FILEDATA]                   = 'FileData';\n\t\t\t$EBMLidList[EBML_ID_FILEDESCRIPTION]            = 'FileDescription';\n\t\t\t$EBMLidList[EBML_ID_FILEMIMETYPE]               = 'FileMimeType';\n\t\t\t$EBMLidList[EBML_ID_FILENAME]                   = 'FileName';\n\t\t\t$EBMLidList[EBML_ID_FILEREFERRAL]               = 'FileReferral';\n\t\t\t$EBMLidList[EBML_ID_FILEUID]                    = 'FileUID';\n\t\t\t$EBMLidList[EBML_ID_FLAGDEFAULT]                = 'FlagDefault';\n\t\t\t$EBMLidList[EBML_ID_FLAGENABLED]                = 'FlagEnabled';\n\t\t\t$EBMLidList[EBML_ID_FLAGFORCED]                 = 'FlagForced';\n\t\t\t$EBMLidList[EBML_ID_FLAGINTERLACED]             = 'FlagInterlaced';\n\t\t\t$EBMLidList[EBML_ID_FLAGLACING]                 = 'FlagLacing';\n\t\t\t$EBMLidList[EBML_ID_GAMMAVALUE]                 = 'GammaValue';\n\t\t\t$EBMLidList[EBML_ID_INFO]                       = 'Info';\n\t\t\t$EBMLidList[EBML_ID_LANGUAGE]                   = 'Language';\n\t\t\t$EBMLidList[EBML_ID_MAXBLOCKADDITIONID]         = 'MaxBlockAdditionID';\n\t\t\t$EBMLidList[EBML_ID_MAXCACHE]                   = 'MaxCache';\n\t\t\t$EBMLidList[EBML_ID_MINCACHE]                   = 'MinCache';\n\t\t\t$EBMLidList[EBML_ID_MUXINGAPP]                  = 'MuxingApp';\n\t\t\t$EBMLidList[EBML_ID_NAME]                       = 'Name';\n\t\t\t$EBMLidList[EBML_ID_NEXTFILENAME]               = 'NextFilename';\n\t\t\t$EBMLidList[EBML_ID_NEXTUID]                    = 'NextUID';\n\t\t\t$EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY]    = 'OutputSamplingFrequency';\n\t\t\t$EBMLidList[EBML_ID_PIXELCROPBOTTOM]            = 'PixelCropBottom';\n\t\t\t$EBMLidList[EBML_ID_PIXELCROPLEFT]              = 'PixelCropLeft';\n\t\t\t$EBMLidList[EBML_ID_PIXELCROPRIGHT]             = 'PixelCropRight';\n\t\t\t$EBMLidList[EBML_ID_PIXELCROPTOP]               = 'PixelCropTop';\n\t\t\t$EBMLidList[EBML_ID_PIXELHEIGHT]                = 'PixelHeight';\n\t\t\t$EBMLidList[EBML_ID_PIXELWIDTH]                 = 'PixelWidth';\n\t\t\t$EBMLidList[EBML_ID_PREVFILENAME]               = 'PrevFilename';\n\t\t\t$EBMLidList[EBML_ID_PREVUID]                    = 'PrevUID';\n\t\t\t$EBMLidList[EBML_ID_SAMPLINGFREQUENCY]          = 'SamplingFrequency';\n\t\t\t$EBMLidList[EBML_ID_SEEK]                       = 'Seek';\n\t\t\t$EBMLidList[EBML_ID_SEEKHEAD]                   = 'SeekHead';\n\t\t\t$EBMLidList[EBML_ID_SEEKID]                     = 'SeekID';\n\t\t\t$EBMLidList[EBML_ID_SEEKPOSITION]               = 'SeekPosition';\n\t\t\t$EBMLidList[EBML_ID_SEGMENT]                    = 'Segment';\n\t\t\t$EBMLidList[EBML_ID_SEGMENTFAMILY]              = 'SegmentFamily';\n\t\t\t$EBMLidList[EBML_ID_SEGMENTFILENAME]            = 'SegmentFilename';\n\t\t\t$EBMLidList[EBML_ID_SEGMENTUID]                 = 'SegmentUID';\n\t\t\t$EBMLidList[EBML_ID_SIMPLETAG]                  = 'SimpleTag';\n\t\t\t$EBMLidList[EBML_ID_CLUSTERSLICES]              = 'ClusterSlices';\n\t\t\t$EBMLidList[EBML_ID_STEREOMODE]                 = 'StereoMode';\n\t\t\t$EBMLidList[EBML_ID_OLDSTEREOMODE]              = 'OldStereoMode';\n\t\t\t$EBMLidList[EBML_ID_TAG]                        = 'Tag';\n\t\t\t$EBMLidList[EBML_ID_TAGATTACHMENTUID]           = 'TagAttachmentUID';\n\t\t\t$EBMLidList[EBML_ID_TAGBINARY]                  = 'TagBinary';\n\t\t\t$EBMLidList[EBML_ID_TAGCHAPTERUID]              = 'TagChapterUID';\n\t\t\t$EBMLidList[EBML_ID_TAGDEFAULT]                 = 'TagDefault';\n\t\t\t$EBMLidList[EBML_ID_TAGEDITIONUID]              = 'TagEditionUID';\n\t\t\t$EBMLidList[EBML_ID_TAGLANGUAGE]                = 'TagLanguage';\n\t\t\t$EBMLidList[EBML_ID_TAGNAME]                    = 'TagName';\n\t\t\t$EBMLidList[EBML_ID_TAGTRACKUID]                = 'TagTrackUID';\n\t\t\t$EBMLidList[EBML_ID_TAGS]                       = 'Tags';\n\t\t\t$EBMLidList[EBML_ID_TAGSTRING]                  = 'TagString';\n\t\t\t$EBMLidList[EBML_ID_TARGETS]                    = 'Targets';\n\t\t\t$EBMLidList[EBML_ID_TARGETTYPE]                 = 'TargetType';\n\t\t\t$EBMLidList[EBML_ID_TARGETTYPEVALUE]            = 'TargetTypeValue';\n\t\t\t$EBMLidList[EBML_ID_TIMECODESCALE]              = 'TimecodeScale';\n\t\t\t$EBMLidList[EBML_ID_TITLE]                      = 'Title';\n\t\t\t$EBMLidList[EBML_ID_TRACKENTRY]                 = 'TrackEntry';\n\t\t\t$EBMLidList[EBML_ID_TRACKNUMBER]                = 'TrackNumber';\n\t\t\t$EBMLidList[EBML_ID_TRACKOFFSET]                = 'TrackOffset';\n\t\t\t$EBMLidList[EBML_ID_TRACKOVERLAY]               = 'TrackOverlay';\n\t\t\t$EBMLidList[EBML_ID_TRACKS]                     = 'Tracks';\n\t\t\t$EBMLidList[EBML_ID_TRACKTIMECODESCALE]         = 'TrackTimecodeScale';\n\t\t\t$EBMLidList[EBML_ID_TRACKTRANSLATE]             = 'TrackTranslate';\n\t\t\t$EBMLidList[EBML_ID_TRACKTRANSLATECODEC]        = 'TrackTranslateCodec';\n\t\t\t$EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID]   = 'TrackTranslateEditionUID';\n\t\t\t$EBMLidList[EBML_ID_TRACKTRANSLATETRACKID]      = 'TrackTranslateTrackID';\n\t\t\t$EBMLidList[EBML_ID_TRACKTYPE]                  = 'TrackType';\n\t\t\t$EBMLidList[EBML_ID_TRACKUID]                   = 'TrackUID';\n\t\t\t$EBMLidList[EBML_ID_VIDEO]                      = 'Video';\n\t\t\t$EBMLidList[EBML_ID_VOID]                       = 'Void';\n\t\t\t$EBMLidList[EBML_ID_WRITINGAPP]                 = 'WritingApp';\n\t\t}\n\n\t\treturn (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value));\n\t}\n\n\tpublic static function displayUnit($value) {\n\t\t// http://www.matroska.org/technical/specs/index.html#DisplayUnit\n\t\tstatic $units = array(\n\t\t\t0 => 'pixels',\n\t\t\t1 => 'centimeters',\n\t\t\t2 => 'inches',\n\t\t\t3 => 'Display Aspect Ratio');\n\n\t\treturn (isset($units[$value]) ? $units[$value] : 'unknown');\n\t}\n\n\tprivate static function getDefaultStreamInfo($streams)\n\t{\n\t\tforeach (array_reverse($streams) as $stream) {\n\t\t\tif ($stream['default']) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$unset = array('default', 'name');\n\t\tforeach ($unset as $u) {\n\t\t\tif (isset($stream[$u])) {\n\t\t\t\tunset($stream[$u]);\n\t\t\t}\n\t\t}\n\n\t\t$info = $stream;\n\t\t$info['streams'] = $streams;\n\n\t\treturn $info;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio-video.quicktime.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio-video.quicktime.php                            //\n// module for analyzing Quicktime and MP3-in-MP4 files         //\n// dependencies: module.audio.mp3.php                          //\n// dependencies: module.tag.id3v2.php                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); // needed for ISO 639-2 language code lookup\n\nclass getid3_quicktime extends getid3_handler\n{\n\n\tpublic $ReturnAtomData        = true;\n\tpublic $ParseAllPossibleAtoms = false;\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t$info['fileformat'] = 'quicktime';\n\t\t$info['quicktime']['hinting']    = false;\n\t\t$info['quicktime']['controller'] = 'standard'; // may be overridden if 'ctyp' atom is present\n\n\t\t$this->fseek($info['avdataoffset']);\n\n\t\t$offset      = 0;\n\t\t$atomcounter = 0;\n\t\t$atom_data_read_buffer_size = ($info['php_memory_limit'] ? round($info['php_memory_limit'] / 2) : $this->getid3->option_fread_buffer_size * 1024); // allow [default: 32MB] if PHP configured with no memory_limit\n\t\twhile ($offset < $info['avdataend']) {\n\t\t\tif (!getid3_lib::intValueSupported($offset)) {\n\t\t\t\t$info['error'][] = 'Unable to parse atom at offset '.$offset.' because beyond '.round(PHP_INT_MAX / 1073741824).'GB limit of PHP filesystem functions';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$this->fseek($offset);\n\t\t\t$AtomHeader = $this->fread(8);\n\n\t\t\t$atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4));\n\t\t\t$atomname = substr($AtomHeader, 4, 4);\n\n\t\t\t// 64-bit MOV patch by jlegateØktnc*com\n\t\t\tif ($atomsize == 1) {\n\t\t\t\t$atomsize = getid3_lib::BigEndian2Int($this->fread(8));\n\t\t\t}\n\n\t\t\t$info['quicktime'][$atomname]['name']   = $atomname;\n\t\t\t$info['quicktime'][$atomname]['size']   = $atomsize;\n\t\t\t$info['quicktime'][$atomname]['offset'] = $offset;\n\n\t\t\tif (($offset + $atomsize) > $info['avdataend']) {\n\t\t\t\t$info['error'][] = 'Atom at offset '.$offset.' claims to go beyond end-of-file (length: '.$atomsize.' bytes)';\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ($atomsize == 0) {\n\t\t\t\t// Furthermore, for historical reasons the list of atoms is optionally\n\t\t\t\t// terminated by a 32-bit integer set to 0. If you are writing a program\n\t\t\t\t// to read user data atoms, you should allow for the terminating 0.\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$atomHierarchy = array();\n\t\t\t$info['quicktime'][$atomname] = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize, $atom_data_read_buffer_size)), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms);\n\n\t\t\t$offset += $atomsize;\n\t\t\t$atomcounter++;\n\t\t}\n\n\t\tif (!empty($info['avdataend_tmp'])) {\n\t\t\t// this value is assigned to a temp value and then erased because\n\t\t\t// otherwise any atoms beyond the 'mdat' atom would not get parsed\n\t\t\t$info['avdataend'] = $info['avdataend_tmp'];\n\t\t\tunset($info['avdataend_tmp']);\n\t\t}\n\n\t\tif (!isset($info['bitrate']) && isset($info['playtime_seconds'])) {\n\t\t\t$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];\n\t\t}\n\t\tif (isset($info['bitrate']) && !isset($info['audio']['bitrate']) && !isset($info['quicktime']['video'])) {\n\t\t\t$info['audio']['bitrate'] = $info['bitrate'];\n\t\t}\n\t\tif (!empty($info['playtime_seconds']) && !isset($info['video']['frame_rate']) && !empty($info['quicktime']['stts_framecount'])) {\n\t\t\tforeach ($info['quicktime']['stts_framecount'] as $key => $samples_count) {\n\t\t\t\t$samples_per_second = $samples_count / $info['playtime_seconds'];\n\t\t\t\tif ($samples_per_second > 240) {\n\t\t\t\t\t// has to be audio samples\n\t\t\t\t} else {\n\t\t\t\t\t$info['video']['frame_rate'] = $samples_per_second;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (($info['audio']['dataformat'] == 'mp4') && empty($info['video']['resolution_x'])) {\n\t\t\t$info['fileformat'] = 'mp4';\n\t\t\t$info['mime_type']  = 'audio/mp4';\n\t\t\tunset($info['video']['dataformat']);\n\t\t}\n\n\t\tif (!$this->ReturnAtomData) {\n\t\t\tunset($info['quicktime']['moov']);\n\t\t}\n\n\t\tif (empty($info['audio']['dataformat']) && !empty($info['quicktime']['audio'])) {\n\t\t\t$info['audio']['dataformat'] = 'quicktime';\n\t\t}\n\t\tif (empty($info['video']['dataformat']) && !empty($info['quicktime']['video'])) {\n\t\t\t$info['video']['dataformat'] = 'quicktime';\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic function QuicktimeParseAtom($atomname, $atomsize, $atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) {\n\t\t// http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/INDEX/atomalphaindex.htm\n\n\t\t$info = &$this->getid3->info;\n\n\t\t$atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see http://www.getid3.org/phpBB3/viewtopic.php?t=1717\n\t\tarray_push($atomHierarchy, $atomname);\n\t\t$atom_structure['hierarchy'] = implode(' ', $atomHierarchy);\n\t\t$atom_structure['name']      = $atomname;\n\t\t$atom_structure['size']      = $atomsize;\n\t\t$atom_structure['offset']    = $baseoffset;\n\t\tswitch ($atomname) {\n\t\t\tcase 'moov': // MOVie container atom\n\t\t\tcase 'trak': // TRAcK container atom\n\t\t\tcase 'clip': // CLIPping container atom\n\t\t\tcase 'matt': // track MATTe container atom\n\t\t\tcase 'edts': // EDiTS container atom\n\t\t\tcase 'tref': // Track REFerence container atom\n\t\t\tcase 'mdia': // MeDIA container atom\n\t\t\tcase 'minf': // Media INFormation container atom\n\t\t\tcase 'dinf': // Data INFormation container atom\n\t\t\tcase 'udta': // User DaTA container atom\n\t\t\tcase 'cmov': // Compressed MOVie container atom\n\t\t\tcase 'rmra': // Reference Movie Record Atom\n\t\t\tcase 'rmda': // Reference Movie Descriptor Atom\n\t\t\tcase 'gmhd': // Generic Media info HeaDer atom (seen on QTVR)\n\t\t\t\t$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ilst': // Item LiST container atom\n\t\t\t\tif ($atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms)) {\n\t\t\t\t\t// some \"ilst\" atoms contain data atoms that have a numeric name, and the data is far more accessible if the returned array is compacted\n\t\t\t\t\t$allnumericnames = true;\n\t\t\t\t\tforeach ($atom_structure['subatoms'] as $subatomarray) {\n\t\t\t\t\t\tif (!is_integer($subatomarray['name']) || (count($subatomarray['subatoms']) != 1)) {\n\t\t\t\t\t\t\t$allnumericnames = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ($allnumericnames) {\n\t\t\t\t\t\t$newData = array();\n\t\t\t\t\t\tforeach ($atom_structure['subatoms'] as $subatomarray) {\n\t\t\t\t\t\t\tforeach ($subatomarray['subatoms'] as $newData_subatomarray) {\n\t\t\t\t\t\t\t\tunset($newData_subatomarray['hierarchy'], $newData_subatomarray['name']);\n\t\t\t\t\t\t\t\t$newData[$subatomarray['name']] = $newData_subatomarray;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$atom_structure['data'] = $newData;\n\t\t\t\t\t\tunset($atom_structure['subatoms']);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"\\x00\\x00\\x00\\x01\":\n\t\t\tcase \"\\x00\\x00\\x00\\x02\":\n\t\t\tcase \"\\x00\\x00\\x00\\x03\":\n\t\t\tcase \"\\x00\\x00\\x00\\x04\":\n\t\t\tcase \"\\x00\\x00\\x00\\x05\":\n\t\t\t\t$atomname = getid3_lib::BigEndian2Int($atomname);\n\t\t\t\t$atom_structure['name'] = $atomname;\n\t\t\t\t$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);\n\t\t\t\tbreak;\n\n\t\t\tcase 'stbl': // Sample TaBLe container atom\n\t\t\t\t$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);\n\t\t\t\t$isVideo = false;\n\t\t\t\t$framerate  = 0;\n\t\t\t\t$framecount = 0;\n\t\t\t\tforeach ($atom_structure['subatoms'] as $key => $value_array) {\n\t\t\t\t\tif (isset($value_array['sample_description_table'])) {\n\t\t\t\t\t\tforeach ($value_array['sample_description_table'] as $key2 => $value_array2) {\n\t\t\t\t\t\t\tif (isset($value_array2['data_format'])) {\n\t\t\t\t\t\t\t\tswitch ($value_array2['data_format']) {\n\t\t\t\t\t\t\t\t\tcase 'avc1':\n\t\t\t\t\t\t\t\t\tcase 'mp4v':\n\t\t\t\t\t\t\t\t\t\t// video data\n\t\t\t\t\t\t\t\t\t\t$isVideo = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'mp4a':\n\t\t\t\t\t\t\t\t\t\t// audio data\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} elseif (isset($value_array['time_to_sample_table'])) {\n\t\t\t\t\t\tforeach ($value_array['time_to_sample_table'] as $key2 => $value_array2) {\n\t\t\t\t\t\t\tif (isset($value_array2['sample_count']) && isset($value_array2['sample_duration']) && ($value_array2['sample_duration'] > 0)) {\n\t\t\t\t\t\t\t\t$framerate  = round($info['quicktime']['time_scale'] / $value_array2['sample_duration'], 3);\n\t\t\t\t\t\t\t\t$framecount = $value_array2['sample_count'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($isVideo && $framerate) {\n\t\t\t\t\t$info['quicktime']['video']['frame_rate'] = $framerate;\n\t\t\t\t\t$info['video']['frame_rate'] = $info['quicktime']['video']['frame_rate'];\n\t\t\t\t}\n\t\t\t\tif ($isVideo && $framecount) {\n\t\t\t\t\t$info['quicktime']['video']['frame_count'] = $framecount;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'aART': // Album ARTist\n\t\t\tcase 'catg': // CaTeGory\n\t\t\tcase 'covr': // COVeR artwork\n\t\t\tcase 'cpil': // ComPILation\n\t\t\tcase 'cprt': // CoPyRighT\n\t\t\tcase 'desc': // DESCription\n\t\t\tcase 'disk': // DISK number\n\t\t\tcase 'egid': // Episode Global ID\n\t\t\tcase 'gnre': // GeNRE\n\t\t\tcase 'keyw': // KEYWord\n\t\t\tcase 'ldes':\n\t\t\tcase 'pcst': // PodCaST\n\t\t\tcase 'pgap': // GAPless Playback\n\t\t\tcase 'purd': // PURchase Date\n\t\t\tcase 'purl': // Podcast URL\n\t\t\tcase 'rati':\n\t\t\tcase 'rndu':\n\t\t\tcase 'rpdu':\n\t\t\tcase 'rtng': // RaTiNG\n\t\t\tcase 'stik':\n\t\t\tcase 'tmpo': // TeMPO (BPM)\n\t\t\tcase 'trkn': // TRacK Number\n\t\t\tcase 'tves': // TV EpiSode\n\t\t\tcase 'tvnn': // TV Network Name\n\t\t\tcase 'tvsh': // TV SHow Name\n\t\t\tcase 'tvsn': // TV SeasoN\n\t\t\tcase 'akID': // iTunes store account type\n\t\t\tcase 'apID':\n\t\t\tcase 'atID':\n\t\t\tcase 'cmID':\n\t\t\tcase 'cnID':\n\t\t\tcase 'geID':\n\t\t\tcase 'plID':\n\t\t\tcase 'sfID': // iTunes store country\n\t\t\tcase \"\\xA9\".'alb': // ALBum\n\t\t\tcase \"\\xA9\".'art': // ARTist\n\t\t\tcase \"\\xA9\".'ART':\n\t\t\tcase \"\\xA9\".'aut':\n\t\t\tcase \"\\xA9\".'cmt': // CoMmenT\n\t\t\tcase \"\\xA9\".'com': // COMposer\n\t\t\tcase \"\\xA9\".'cpy':\n\t\t\tcase \"\\xA9\".'day': // content created year\n\t\t\tcase \"\\xA9\".'dir':\n\t\t\tcase \"\\xA9\".'ed1':\n\t\t\tcase \"\\xA9\".'ed2':\n\t\t\tcase \"\\xA9\".'ed3':\n\t\t\tcase \"\\xA9\".'ed4':\n\t\t\tcase \"\\xA9\".'ed5':\n\t\t\tcase \"\\xA9\".'ed6':\n\t\t\tcase \"\\xA9\".'ed7':\n\t\t\tcase \"\\xA9\".'ed8':\n\t\t\tcase \"\\xA9\".'ed9':\n\t\t\tcase \"\\xA9\".'enc':\n\t\t\tcase \"\\xA9\".'fmt':\n\t\t\tcase \"\\xA9\".'gen': // GENre\n\t\t\tcase \"\\xA9\".'grp': // GRouPing\n\t\t\tcase \"\\xA9\".'hst':\n\t\t\tcase \"\\xA9\".'inf':\n\t\t\tcase \"\\xA9\".'lyr': // LYRics\n\t\t\tcase \"\\xA9\".'mak':\n\t\t\tcase \"\\xA9\".'mod':\n\t\t\tcase \"\\xA9\".'nam': // full NAMe\n\t\t\tcase \"\\xA9\".'ope':\n\t\t\tcase \"\\xA9\".'PRD':\n\t\t\tcase \"\\xA9\".'prd':\n\t\t\tcase \"\\xA9\".'prf':\n\t\t\tcase \"\\xA9\".'req':\n\t\t\tcase \"\\xA9\".'src':\n\t\t\tcase \"\\xA9\".'swr':\n\t\t\tcase \"\\xA9\".'too': // encoder\n\t\t\tcase \"\\xA9\".'trk': // TRacK\n\t\t\tcase \"\\xA9\".'url':\n\t\t\tcase \"\\xA9\".'wrn':\n\t\t\tcase \"\\xA9\".'wrt': // WRiTer\n\t\t\tcase '----': // itunes specific\n\t\t\t\tif ($atom_parent == 'udta') {\n\t\t\t\t\t// User data atom handler\n\t\t\t\t\t$atom_structure['data_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2));\n\t\t\t\t\t$atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2));\n\t\t\t\t\t$atom_structure['data']        =                           substr($atom_data, 4);\n\n\t\t\t\t\t$atom_structure['language']    = $this->QuicktimeLanguageLookup($atom_structure['language_id']);\n\t\t\t\t\tif (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {\n\t\t\t\t\t\t$info['comments']['language'][] = $atom_structure['language'];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Apple item list box atom handler\n\t\t\t\t\t$atomoffset = 0;\n\t\t\t\t\tif (substr($atom_data, 2, 2) == \"\\x10\\xB5\") {\n\t\t\t\t\t\t// not sure what it means, but observed on iPhone4 data.\n\t\t\t\t\t\t// Each $atom_data has 2 bytes of datasize, plus 0x10B5, then data\n\t\t\t\t\t\twhile ($atomoffset < strlen($atom_data)) {\n\t\t\t\t\t\t\t$boxsmallsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset,     2));\n\t\t\t\t\t\t\t$boxsmalltype =                           substr($atom_data, $atomoffset + 2, 2);\n\t\t\t\t\t\t\t$boxsmalldata =                           substr($atom_data, $atomoffset + 4, $boxsmallsize);\n\t\t\t\t\t\t\tif ($boxsmallsize <= 1) {\n\t\t\t\t\t\t\t\t$info['warning'][] = 'Invalid QuickTime atom smallbox size \"'.$boxsmallsize.'\" in atom \"'.preg_replace('#[^a-zA-Z0-9 _\\\\-]#', '?', $atomname).'\" at offset: '.($atom_structure['offset'] + $atomoffset);\n\t\t\t\t\t\t\t\t$atom_structure['data'] = null;\n\t\t\t\t\t\t\t\t$atomoffset = strlen($atom_data);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tswitch ($boxsmalltype) {\n\t\t\t\t\t\t\t\tcase \"\\x10\\xB5\":\n\t\t\t\t\t\t\t\t\t$atom_structure['data'] = $boxsmalldata;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t$info['warning'][] = 'Unknown QuickTime smallbox type: \"'.preg_replace('#[^a-zA-Z0-9 _\\\\-]#', '?', $boxsmalltype).'\" ('.trim(getid3_lib::PrintHexBytes($boxsmalltype)).') at offset '.$baseoffset;\n\t\t\t\t\t\t\t\t\t$atom_structure['data'] = $atom_data;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$atomoffset += (4 + $boxsmallsize);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\twhile ($atomoffset < strlen($atom_data)) {\n\t\t\t\t\t\t\t$boxsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 4));\n\t\t\t\t\t\t\t$boxtype =                           substr($atom_data, $atomoffset + 4, 4);\n\t\t\t\t\t\t\t$boxdata =                           substr($atom_data, $atomoffset + 8, $boxsize - 8);\n\t\t\t\t\t\t\tif ($boxsize <= 1) {\n\t\t\t\t\t\t\t\t$info['warning'][] = 'Invalid QuickTime atom box size \"'.$boxsize.'\" in atom \"'.preg_replace('#[^a-zA-Z0-9 _\\\\-]#', '?', $atomname).'\" at offset: '.($atom_structure['offset'] + $atomoffset);\n\t\t\t\t\t\t\t\t$atom_structure['data'] = null;\n\t\t\t\t\t\t\t\t$atomoffset = strlen($atom_data);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$atomoffset += $boxsize;\n\n\t\t\t\t\t\t\tswitch ($boxtype) {\n\t\t\t\t\t\t\t\tcase 'mean':\n\t\t\t\t\t\t\t\tcase 'name':\n\t\t\t\t\t\t\t\t\t$atom_structure[$boxtype] = substr($boxdata, 4);\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'data':\n\t\t\t\t\t\t\t\t\t$atom_structure['version']   = getid3_lib::BigEndian2Int(substr($boxdata,  0, 1));\n\t\t\t\t\t\t\t\t\t$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($boxdata,  1, 3));\n\t\t\t\t\t\t\t\t\tswitch ($atom_structure['flags_raw']) {\n\t\t\t\t\t\t\t\t\t\tcase  0: // data flag\n\t\t\t\t\t\t\t\t\t\tcase 21: // tmpo/cpil flag\n\t\t\t\t\t\t\t\t\t\t\tswitch ($atomname) {\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'cpil':\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'pcst':\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'pgap':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'tmpo':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 2));\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'disk':\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'trkn':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$num       = getid3_lib::BigEndian2Int(substr($boxdata, 10, 2));\n\t\t\t\t\t\t\t\t\t\t\t\t\t$num_total = getid3_lib::BigEndian2Int(substr($boxdata, 12, 2));\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data']  = empty($num) ? '' : $num;\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data'] .= empty($num_total) ? '' : '/'.$num_total;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'gnre':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$GenreID = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data']    = getid3_id3v1::LookupGenreName($GenreID - 1);\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'rtng':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data']    = $this->QuicktimeContentRatingLookup($atom_structure[$atomname]);\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'stik':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1));\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data']    = $this->QuicktimeSTIKLookup($atom_structure[$atomname]);\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'sfID':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data']    = $this->QuicktimeStoreFrontCodeLookup($atom_structure[$atomname]);\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'egid':\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'purl':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data'] = substr($boxdata, 8);\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4));\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase  1: // text flag\n\t\t\t\t\t\t\t\t\t\tcase 13: // image flag\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$atom_structure['data'] = substr($boxdata, 8);\n\t\t\t\t\t\t\t\t\t\t\tif ($atomname == 'covr') {\n\t\t\t\t\t\t\t\t\t\t\t\t// not a foolproof check, but better than nothing\n\t\t\t\t\t\t\t\t\t\t\t\tif (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['image_mime'] = 'image/jpeg';\n\t\t\t\t\t\t\t\t\t\t\t\t} elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['image_mime'] = 'image/png';\n\t\t\t\t\t\t\t\t\t\t\t\t} elseif (preg_match('#^GIF#', $atom_structure['data'])) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t$atom_structure['image_mime'] = 'image/gif';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t$info['warning'][] = 'Unknown QuickTime box type: \"'.preg_replace('#[^a-zA-Z0-9 _\\\\-]#', '?', $boxtype).'\" ('.trim(getid3_lib::PrintHexBytes($boxtype)).') at offset '.$baseoffset;\n\t\t\t\t\t\t\t\t\t$atom_structure['data'] = $atom_data;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$this->CopyToAppropriateCommentsSection($atomname, $atom_structure['data'], $atom_structure['name']);\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'play': // auto-PLAY atom\n\t\t\t\t$atom_structure['autoplay'] = (bool) getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\n\t\t\t\t$info['quicktime']['autoplay'] = $atom_structure['autoplay'];\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'WLOC': // Window LOCation atom\n\t\t\t\t$atom_structure['location_x']  = getid3_lib::BigEndian2Int(substr($atom_data,  0, 2));\n\t\t\t\t$atom_structure['location_y']  = getid3_lib::BigEndian2Int(substr($atom_data,  2, 2));\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'LOOP': // LOOPing atom\n\t\t\tcase 'SelO': // play SELection Only atom\n\t\t\tcase 'AllF': // play ALL Frames atom\n\t\t\t\t$atom_structure['data'] = getid3_lib::BigEndian2Int($atom_data);\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'name': //\n\t\t\tcase 'MCPS': // Media Cleaner PRo\n\t\t\tcase '@PRM': // adobe PReMiere version\n\t\t\tcase '@PRQ': // adobe PRemiere Quicktime version\n\t\t\t\t$atom_structure['data'] = $atom_data;\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'cmvd': // Compressed MooV Data atom\n\t\t\t\t// Code by ubergeekØubergeek*tv based on information from\n\t\t\t\t// http://developer.apple.com/quicktime/icefloe/dispatch012.html\n\t\t\t\t$atom_structure['unCompressedSize'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4));\n\n\t\t\t\t$CompressedFileData = substr($atom_data, 4);\n\t\t\t\tif ($UncompressedHeader = @gzuncompress($CompressedFileData)) {\n\t\t\t\t\t$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($UncompressedHeader, 0, $atomHierarchy, $ParseAllPossibleAtoms);\n\t\t\t\t} else {\n\t\t\t\t\t$info['warning'][] = 'Error decompressing compressed MOV atom at offset '.$atom_structure['offset'];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'dcom': // Data COMpression atom\n\t\t\t\t$atom_structure['compression_id']   = $atom_data;\n\t\t\t\t$atom_structure['compression_text'] = $this->QuicktimeDCOMLookup($atom_data);\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'rdrf': // Reference movie Data ReFerence atom\n\t\t\t\t$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));\n\t\t\t\t$atom_structure['flags']['internal_data'] = (bool) ($atom_structure['flags_raw'] & 0x000001);\n\n\t\t\t\t$atom_structure['reference_type_name']    =                           substr($atom_data,  4, 4);\n\t\t\t\t$atom_structure['reference_length']       = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));\n\t\t\t\tswitch ($atom_structure['reference_type_name']) {\n\t\t\t\t\tcase 'url ':\n\t\t\t\t\t\t$atom_structure['url']            =       $this->NoNullString(substr($atom_data, 12));\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'alis':\n\t\t\t\t\t\t$atom_structure['file_alias']     =                           substr($atom_data, 12);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rsrc':\n\t\t\t\t\t\t$atom_structure['resource_alias'] =                           substr($atom_data, 12);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$atom_structure['data']           =                           substr($atom_data, 12);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'rmqu': // Reference Movie QUality atom\n\t\t\t\t$atom_structure['movie_quality'] = getid3_lib::BigEndian2Int($atom_data);\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'rmcs': // Reference Movie Cpu Speed atom\n\t\t\t\t$atom_structure['version']          = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']        = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['cpu_speed_rating'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'rmvc': // Reference Movie Version Check atom\n\t\t\t\t$atom_structure['version']            = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']          = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['gestalt_selector']   =                           substr($atom_data,  4, 4);\n\t\t\t\t$atom_structure['gestalt_value_mask'] = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));\n\t\t\t\t$atom_structure['gestalt_value']      = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));\n\t\t\t\t$atom_structure['gestalt_check_type'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2));\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'rmcd': // Reference Movie Component check atom\n\t\t\t\t$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['component_type']         =                           substr($atom_data,  4, 4);\n\t\t\t\t$atom_structure['component_subtype']      =                           substr($atom_data,  8, 4);\n\t\t\t\t$atom_structure['component_manufacturer'] =                           substr($atom_data, 12, 4);\n\t\t\t\t$atom_structure['component_flags_raw']    = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));\n\t\t\t\t$atom_structure['component_flags_mask']   = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));\n\t\t\t\t$atom_structure['component_min_version']  = getid3_lib::BigEndian2Int(substr($atom_data, 24, 4));\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'rmdr': // Reference Movie Data Rate atom\n\t\t\t\t$atom_structure['version']       = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']     = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['data_rate']     = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\n\t\t\t\t$atom_structure['data_rate_bps'] = $atom_structure['data_rate'] * 10;\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'rmla': // Reference Movie Language Atom\n\t\t\t\t$atom_structure['version']     = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']   = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));\n\n\t\t\t\t$atom_structure['language']    = $this->QuicktimeLanguageLookup($atom_structure['language_id']);\n\t\t\t\tif (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {\n\t\t\t\t\t$info['comments']['language'][] = $atom_structure['language'];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'rmla': // Reference Movie Language Atom\n\t\t\t\t$atom_structure['version']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['track_id']  = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'ptv ': // Print To Video - defines a movie's full screen mode\n\t\t\t\t// http://developer.apple.com/documentation/QuickTime/APIREF/SOURCESIV/at_ptv-_pg.htm\n\t\t\t\t$atom_structure['display_size_raw']  = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2));\n\t\t\t\t$atom_structure['reserved_1']        = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['reserved_2']        = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['slide_show_flag']   = getid3_lib::BigEndian2Int(substr($atom_data, 6, 1));\n\t\t\t\t$atom_structure['play_on_open_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 7, 1));\n\n\t\t\t\t$atom_structure['flags']['play_on_open'] = (bool) $atom_structure['play_on_open_flag'];\n\t\t\t\t$atom_structure['flags']['slide_show']   = (bool) $atom_structure['slide_show_flag'];\n\n\t\t\t\t$ptv_lookup[0] = 'normal';\n\t\t\t\t$ptv_lookup[1] = 'double';\n\t\t\t\t$ptv_lookup[2] = 'half';\n\t\t\t\t$ptv_lookup[3] = 'full';\n\t\t\t\t$ptv_lookup[4] = 'current';\n\t\t\t\tif (isset($ptv_lookup[$atom_structure['display_size_raw']])) {\n\t\t\t\t\t$atom_structure['display_size'] = $ptv_lookup[$atom_structure['display_size_raw']];\n\t\t\t\t} else {\n\t\t\t\t\t$info['warning'][] = 'unknown \"ptv \" display constant ('.$atom_structure['display_size_raw'].')';\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'stsd': // Sample Table Sample Description atom\n\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t$stsdEntriesDataOffset = 8;\n\t\t\t\tfor ($i = 0; $i < $atom_structure['number_entries']; $i++) {\n\t\t\t\t\t$atom_structure['sample_description_table'][$i]['size']             = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 4));\n\t\t\t\t\t$stsdEntriesDataOffset += 4;\n\t\t\t\t\t$atom_structure['sample_description_table'][$i]['data_format']      =                           substr($atom_data, $stsdEntriesDataOffset, 4);\n\t\t\t\t\t$stsdEntriesDataOffset += 4;\n\t\t\t\t\t$atom_structure['sample_description_table'][$i]['reserved']         = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 6));\n\t\t\t\t\t$stsdEntriesDataOffset += 6;\n\t\t\t\t\t$atom_structure['sample_description_table'][$i]['reference_index']  = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 2));\n\t\t\t\t\t$stsdEntriesDataOffset += 2;\n\t\t\t\t\t$atom_structure['sample_description_table'][$i]['data']             =                           substr($atom_data, $stsdEntriesDataOffset, ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2));\n\t\t\t\t\t$stsdEntriesDataOffset += ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2);\n\n\t\t\t\t\t$atom_structure['sample_description_table'][$i]['encoder_version']  = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  0, 2));\n\t\t\t\t\t$atom_structure['sample_description_table'][$i]['encoder_revision'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  2, 2));\n\t\t\t\t\t$atom_structure['sample_description_table'][$i]['encoder_vendor']   =                           substr($atom_structure['sample_description_table'][$i]['data'],  4, 4);\n\n\t\t\t\t\tswitch ($atom_structure['sample_description_table'][$i]['encoder_vendor']) {\n\n\t\t\t\t\t\tcase \"\\x00\\x00\\x00\\x00\":\n\t\t\t\t\t\t\t// audio tracks\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['audio_channels']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  2));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['audio_bit_depth']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 10,  2));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['audio_compression_id'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  2));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['audio_packet_size']    =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 14,  2));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['audio_sample_rate']    = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 16,  4));\n\n\t\t\t\t\t\t\t// video tracks\n\t\t\t\t\t\t\t// http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap3/qtff3.html\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['temporal_quality'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  4));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['spatial_quality']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  4));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['width']            =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16,  2));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['height']           =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18,  2));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['resolution_x']     = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24,  4));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['resolution_y']     = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 28,  4));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['data_size']        =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32,  4));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['frame_count']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 36,  2));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['compressor_name']  =                             substr($atom_structure['sample_description_table'][$i]['data'], 38,  4);\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['pixel_depth']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 42,  2));\n\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['color_table_id']   =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 44,  2));\n\n\t\t\t\t\t\t\tswitch ($atom_structure['sample_description_table'][$i]['data_format']) {\n\t\t\t\t\t\t\t\tcase '2vuY':\n\t\t\t\t\t\t\t\tcase 'avc1':\n\t\t\t\t\t\t\t\tcase 'cvid':\n\t\t\t\t\t\t\t\tcase 'dvc ':\n\t\t\t\t\t\t\t\tcase 'dvcp':\n\t\t\t\t\t\t\t\tcase 'gif ':\n\t\t\t\t\t\t\t\tcase 'h263':\n\t\t\t\t\t\t\t\tcase 'jpeg':\n\t\t\t\t\t\t\t\tcase 'kpcd':\n\t\t\t\t\t\t\t\tcase 'mjpa':\n\t\t\t\t\t\t\t\tcase 'mjpb':\n\t\t\t\t\t\t\t\tcase 'mp4v':\n\t\t\t\t\t\t\t\tcase 'png ':\n\t\t\t\t\t\t\t\tcase 'raw ':\n\t\t\t\t\t\t\t\tcase 'rle ':\n\t\t\t\t\t\t\t\tcase 'rpza':\n\t\t\t\t\t\t\t\tcase 'smc ':\n\t\t\t\t\t\t\t\tcase 'SVQ1':\n\t\t\t\t\t\t\t\tcase 'SVQ3':\n\t\t\t\t\t\t\t\tcase 'tiff':\n\t\t\t\t\t\t\t\tcase 'v210':\n\t\t\t\t\t\t\t\tcase 'v216':\n\t\t\t\t\t\t\t\tcase 'v308':\n\t\t\t\t\t\t\t\tcase 'v408':\n\t\t\t\t\t\t\t\tcase 'v410':\n\t\t\t\t\t\t\t\tcase 'yuv2':\n\t\t\t\t\t\t\t\t\t$info['fileformat'] = 'mp4';\n\t\t\t\t\t\t\t\t\t$info['video']['fourcc'] = $atom_structure['sample_description_table'][$i]['data_format'];\n// http://www.getid3.org/phpBB3/viewtopic.php?t=1550\n//if ((!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['width'])) && (empty($info['video']['resolution_x']) || empty($info['video']['resolution_y']) || (number_format($info['video']['resolution_x'], 6) != number_format(round($info['video']['resolution_x']), 6)) || (number_format($info['video']['resolution_y'], 6) != number_format(round($info['video']['resolution_y']), 6)))) { // ugly check for floating point numbers\nif (!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['height'])) {\n\t// assume that values stored here are more important than values stored in [tkhd] atom\n\t$info['video']['resolution_x'] = $atom_structure['sample_description_table'][$i]['width'];\n\t$info['video']['resolution_y'] = $atom_structure['sample_description_table'][$i]['height'];\n\t$info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x'];\n\t$info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y'];\n}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'qtvr':\n\t\t\t\t\t\t\t\t\t$info['video']['dataformat'] = 'quicktimevr';\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'mp4a':\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t$info['quicktime']['audio']['codec']       = $this->QuicktimeAudioCodecLookup($atom_structure['sample_description_table'][$i]['data_format']);\n\t\t\t\t\t\t\t\t\t$info['quicktime']['audio']['sample_rate'] = $atom_structure['sample_description_table'][$i]['audio_sample_rate'];\n\t\t\t\t\t\t\t\t\t$info['quicktime']['audio']['channels']    = $atom_structure['sample_description_table'][$i]['audio_channels'];\n\t\t\t\t\t\t\t\t\t$info['quicktime']['audio']['bit_depth']   = $atom_structure['sample_description_table'][$i]['audio_bit_depth'];\n\t\t\t\t\t\t\t\t\t$info['audio']['codec']                    = $info['quicktime']['audio']['codec'];\n\t\t\t\t\t\t\t\t\t$info['audio']['sample_rate']              = $info['quicktime']['audio']['sample_rate'];\n\t\t\t\t\t\t\t\t\t$info['audio']['channels']                 = $info['quicktime']['audio']['channels'];\n\t\t\t\t\t\t\t\t\t$info['audio']['bits_per_sample']          = $info['quicktime']['audio']['bit_depth'];\n\t\t\t\t\t\t\t\t\tswitch ($atom_structure['sample_description_table'][$i]['data_format']) {\n\t\t\t\t\t\t\t\t\t\tcase 'raw ': // PCM\n\t\t\t\t\t\t\t\t\t\tcase 'alac': // Apple Lossless Audio Codec\n\t\t\t\t\t\t\t\t\t\t\t$info['audio']['lossless'] = true;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$info['audio']['lossless'] = false;\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tswitch ($atom_structure['sample_description_table'][$i]['data_format']) {\n\t\t\t\t\t\t\t\tcase 'mp4s':\n\t\t\t\t\t\t\t\t\t$info['fileformat'] = 'mp4';\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t// video atom\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_temporal_quality']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'],  8,  4));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_spatial_quality']   =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12,  4));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_frame_width']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16,  2));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_frame_height']      =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18,  2));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_resolution_x']      = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 20,  4));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_resolution_y']      = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24,  4));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_data_size']         =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 28,  4));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_frame_count']       =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32,  2));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_encoder_name_len']  =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 34,  1));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_encoder_name']      =                             substr($atom_structure['sample_description_table'][$i]['data'], 35, $atom_structure['sample_description_table'][$i]['video_encoder_name_len']);\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 66,  2));\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_color_table_id']    =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 68,  2));\n\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_pixel_color_type']  = (($atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color');\n\t\t\t\t\t\t\t\t\t$atom_structure['sample_description_table'][$i]['video_pixel_color_name']  = $this->QuicktimeColorNameLookup($atom_structure['sample_description_table'][$i]['video_pixel_color_depth']);\n\n\t\t\t\t\t\t\t\t\tif ($atom_structure['sample_description_table'][$i]['video_pixel_color_name'] != 'invalid') {\n\t\t\t\t\t\t\t\t\t\t$info['quicktime']['video']['codec_fourcc']        = $atom_structure['sample_description_table'][$i]['data_format'];\n\t\t\t\t\t\t\t\t\t\t$info['quicktime']['video']['codec_fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($atom_structure['sample_description_table'][$i]['data_format']);\n\t\t\t\t\t\t\t\t\t\t$info['quicktime']['video']['codec']               = (($atom_structure['sample_description_table'][$i]['video_encoder_name_len'] > 0) ? $atom_structure['sample_description_table'][$i]['video_encoder_name'] : $atom_structure['sample_description_table'][$i]['data_format']);\n\t\t\t\t\t\t\t\t\t\t$info['quicktime']['video']['color_depth']         = $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'];\n\t\t\t\t\t\t\t\t\t\t$info['quicktime']['video']['color_depth_name']    = $atom_structure['sample_description_table'][$i]['video_pixel_color_name'];\n\n\t\t\t\t\t\t\t\t\t\t$info['video']['codec']           = $info['quicktime']['video']['codec'];\n\t\t\t\t\t\t\t\t\t\t$info['video']['bits_per_sample'] = $info['quicktime']['video']['color_depth'];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$info['video']['lossless']           = false;\n\t\t\t\t\t\t\t\t\t$info['video']['pixel_aspect_ratio'] = (float) 1;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (strtolower($atom_structure['sample_description_table'][$i]['data_format'])) {\n\t\t\t\t\t\tcase 'mp4a':\n\t\t\t\t\t\t\t$info['audio']['dataformat']         = 'mp4';\n\t\t\t\t\t\t\t$info['quicktime']['audio']['codec'] = 'mp4';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase '3ivx':\n\t\t\t\t\t\tcase '3iv1':\n\t\t\t\t\t\tcase '3iv2':\n\t\t\t\t\t\t\t$info['video']['dataformat'] = '3ivx';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'xvid':\n\t\t\t\t\t\t\t$info['video']['dataformat'] = 'xvid';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'mp4v':\n\t\t\t\t\t\t\t$info['video']['dataformat'] = 'mpeg4';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'divx':\n\t\t\t\t\t\tcase 'div1':\n\t\t\t\t\t\tcase 'div2':\n\t\t\t\t\t\tcase 'div3':\n\t\t\t\t\t\tcase 'div4':\n\t\t\t\t\t\tcase 'div5':\n\t\t\t\t\t\tcase 'div6':\n\t\t\t\t\t\t\t$info['video']['dataformat'] = 'divx';\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// do nothing\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tunset($atom_structure['sample_description_table'][$i]['data']);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'stts': // Sample Table Time-to-Sample atom\n\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t$sttsEntriesDataOffset = 8;\n\t\t\t\t//$FrameRateCalculatorArray = array();\n\t\t\t\t$frames_count = 0;\n\n\t\t\t\t$max_stts_entries_to_scan = ($info['php_memory_limit'] ? min(floor($this->getid3->memory_limit / 10000), $atom_structure['number_entries']) : $atom_structure['number_entries']);\n\t\t\t\tif ($max_stts_entries_to_scan < $atom_structure['number_entries']) {\n\t\t\t\t\t$info['warning'][] = 'QuickTime atom \"stts\" has '.$atom_structure['number_entries'].' but only scanning the first '.$max_stts_entries_to_scan.' entries due to limited PHP memory available ('.floor($atom_structure['number_entries'] / 1048576).'MB).';\n\t\t\t\t}\n\t\t\t\tfor ($i = 0; $i < $max_stts_entries_to_scan; $i++) {\n\t\t\t\t\t$atom_structure['time_to_sample_table'][$i]['sample_count']    = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));\n\t\t\t\t\t$sttsEntriesDataOffset += 4;\n\t\t\t\t\t$atom_structure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));\n\t\t\t\t\t$sttsEntriesDataOffset += 4;\n\n\t\t\t\t\t$frames_count += $atom_structure['time_to_sample_table'][$i]['sample_count'];\n\n\t\t\t\t\t// THIS SECTION REPLACED WITH CODE IN \"stbl\" ATOM\n\t\t\t\t\t//if (!empty($info['quicktime']['time_scale']) && ($atom_structure['time_to_sample_table'][$i]['sample_duration'] > 0)) {\n\t\t\t\t\t//\t$stts_new_framerate = $info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'];\n\t\t\t\t\t//\tif ($stts_new_framerate <= 60) {\n\t\t\t\t\t//\t\t// some atoms have durations of \"1\" giving a very large framerate, which probably is not right\n\t\t\t\t\t//\t\t$info['video']['frame_rate'] = max($info['video']['frame_rate'], $stts_new_framerate);\n\t\t\t\t\t//\t}\n\t\t\t\t\t//}\n\t\t\t\t\t//\n\t\t\t\t\t//$FrameRateCalculatorArray[($info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'])] += $atom_structure['time_to_sample_table'][$i]['sample_count'];\n\t\t\t\t}\n\t\t\t\t$info['quicktime']['stts_framecount'][] = $frames_count;\n\t\t\t\t//$sttsFramesTotal  = 0;\n\t\t\t\t//$sttsSecondsTotal = 0;\n\t\t\t\t//foreach ($FrameRateCalculatorArray as $frames_per_second => $frame_count) {\n\t\t\t\t//\tif (($frames_per_second > 60) || ($frames_per_second < 1)) {\n\t\t\t\t//\t\t// not video FPS information, probably audio information\n\t\t\t\t//\t\t$sttsFramesTotal  = 0;\n\t\t\t\t//\t\t$sttsSecondsTotal = 0;\n\t\t\t\t//\t\tbreak;\n\t\t\t\t//\t}\n\t\t\t\t//\t$sttsFramesTotal  += $frame_count;\n\t\t\t\t//\t$sttsSecondsTotal += $frame_count / $frames_per_second;\n\t\t\t\t//}\n\t\t\t\t//if (($sttsFramesTotal > 0) && ($sttsSecondsTotal > 0)) {\n\t\t\t\t//\tif (($sttsFramesTotal / $sttsSecondsTotal) > $info['video']['frame_rate']) {\n\t\t\t\t//\t\t$info['video']['frame_rate'] = $sttsFramesTotal / $sttsSecondsTotal;\n\t\t\t\t//\t}\n\t\t\t\t//}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'stss': // Sample Table Sync Sample (key frames) atom\n\t\t\t\tif ($ParseAllPossibleAtoms) {\n\t\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t\t$stssEntriesDataOffset = 8;\n\t\t\t\t\tfor ($i = 0; $i < $atom_structure['number_entries']; $i++) {\n\t\t\t\t\t\t$atom_structure['time_to_sample_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stssEntriesDataOffset, 4));\n\t\t\t\t\t\t$stssEntriesDataOffset += 4;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'stsc': // Sample Table Sample-to-Chunk atom\n\t\t\t\tif ($ParseAllPossibleAtoms) {\n\t\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t\t$stscEntriesDataOffset = 8;\n\t\t\t\t\tfor ($i = 0; $i < $atom_structure['number_entries']; $i++) {\n\t\t\t\t\t\t$atom_structure['sample_to_chunk_table'][$i]['first_chunk']        = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));\n\t\t\t\t\t\t$stscEntriesDataOffset += 4;\n\t\t\t\t\t\t$atom_structure['sample_to_chunk_table'][$i]['samples_per_chunk']  = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));\n\t\t\t\t\t\t$stscEntriesDataOffset += 4;\n\t\t\t\t\t\t$atom_structure['sample_to_chunk_table'][$i]['sample_description'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4));\n\t\t\t\t\t\t$stscEntriesDataOffset += 4;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'stsz': // Sample Table SiZe atom\n\t\t\t\tif ($ParseAllPossibleAtoms) {\n\t\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t\t$atom_structure['sample_size']    = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));\n\t\t\t\t\t$stszEntriesDataOffset = 12;\n\t\t\t\t\tif ($atom_structure['sample_size'] == 0) {\n\t\t\t\t\t\tfor ($i = 0; $i < $atom_structure['number_entries']; $i++) {\n\t\t\t\t\t\t\t$atom_structure['sample_size_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stszEntriesDataOffset, 4));\n\t\t\t\t\t\t\t$stszEntriesDataOffset += 4;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'stco': // Sample Table Chunk Offset atom\n\t\t\t\tif ($ParseAllPossibleAtoms) {\n\t\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t\t$stcoEntriesDataOffset = 8;\n\t\t\t\t\tfor ($i = 0; $i < $atom_structure['number_entries']; $i++) {\n\t\t\t\t\t\t$atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 4));\n\t\t\t\t\t\t$stcoEntriesDataOffset += 4;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'co64': // Chunk Offset 64-bit (version of \"stco\" that supports > 2GB files)\n\t\t\t\tif ($ParseAllPossibleAtoms) {\n\t\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t\t$stcoEntriesDataOffset = 8;\n\t\t\t\t\tfor ($i = 0; $i < $atom_structure['number_entries']; $i++) {\n\t\t\t\t\t\t$atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 8));\n\t\t\t\t\t\t$stcoEntriesDataOffset += 8;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'dref': // Data REFerence atom\n\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t$drefDataOffset = 8;\n\t\t\t\tfor ($i = 0; $i < $atom_structure['number_entries']; $i++) {\n\t\t\t\t\t$atom_structure['data_references'][$i]['size']                    = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4));\n\t\t\t\t\t$drefDataOffset += 4;\n\t\t\t\t\t$atom_structure['data_references'][$i]['type']                    =               substr($atom_data, $drefDataOffset, 4);\n\t\t\t\t\t$drefDataOffset += 4;\n\t\t\t\t\t$atom_structure['data_references'][$i]['version']                 = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 1));\n\t\t\t\t\t$drefDataOffset += 1;\n\t\t\t\t\t$atom_structure['data_references'][$i]['flags_raw']               = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 3)); // hardcoded: 0x0000\n\t\t\t\t\t$drefDataOffset += 3;\n\t\t\t\t\t$atom_structure['data_references'][$i]['data']                    =               substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3));\n\t\t\t\t\t$drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3);\n\n\t\t\t\t\t$atom_structure['data_references'][$i]['flags']['self_reference'] = (bool) ($atom_structure['data_references'][$i]['flags_raw'] & 0x001);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'gmin': // base Media INformation atom\n\t\t\t\t$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['graphics_mode']          = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));\n\t\t\t\t$atom_structure['opcolor_red']            = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));\n\t\t\t\t$atom_structure['opcolor_green']          = getid3_lib::BigEndian2Int(substr($atom_data,  8, 2));\n\t\t\t\t$atom_structure['opcolor_blue']           = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2));\n\t\t\t\t$atom_structure['balance']                = getid3_lib::BigEndian2Int(substr($atom_data, 12, 2));\n\t\t\t\t$atom_structure['reserved']               = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2));\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'smhd': // Sound Media information HeaDer atom\n\t\t\t\t$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['balance']                = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));\n\t\t\t\t$atom_structure['reserved']               = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'vmhd': // Video Media information HeaDer atom\n\t\t\t\t$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));\n\t\t\t\t$atom_structure['graphics_mode']          = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2));\n\t\t\t\t$atom_structure['opcolor_red']            = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2));\n\t\t\t\t$atom_structure['opcolor_green']          = getid3_lib::BigEndian2Int(substr($atom_data,  8, 2));\n\t\t\t\t$atom_structure['opcolor_blue']           = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2));\n\n\t\t\t\t$atom_structure['flags']['no_lean_ahead'] = (bool) ($atom_structure['flags_raw'] & 0x001);\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'hdlr': // HanDLeR reference atom\n\t\t\t\t$atom_structure['version']                = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']              = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['component_type']         =                           substr($atom_data,  4, 4);\n\t\t\t\t$atom_structure['component_subtype']      =                           substr($atom_data,  8, 4);\n\t\t\t\t$atom_structure['component_manufacturer'] =                           substr($atom_data, 12, 4);\n\t\t\t\t$atom_structure['component_flags_raw']    = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));\n\t\t\t\t$atom_structure['component_flags_mask']   = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));\n\t\t\t\t$atom_structure['component_name']         =      $this->Pascal2String(substr($atom_data, 24));\n\n\t\t\t\tif (($atom_structure['component_subtype'] == 'STpn') && ($atom_structure['component_manufacturer'] == 'zzzz')) {\n\t\t\t\t\t$info['video']['dataformat'] = 'quicktimevr';\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'mdhd': // MeDia HeaDer atom\n\t\t\t\t$atom_structure['version']               = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']             = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['creation_time']         = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t$atom_structure['modify_time']           = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));\n\t\t\t\t$atom_structure['time_scale']            = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));\n\t\t\t\t$atom_structure['duration']              = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));\n\t\t\t\t$atom_structure['language_id']           = getid3_lib::BigEndian2Int(substr($atom_data, 20, 2));\n\t\t\t\t$atom_structure['quality']               = getid3_lib::BigEndian2Int(substr($atom_data, 22, 2));\n\n\t\t\t\tif ($atom_structure['time_scale'] == 0) {\n\t\t\t\t\t$info['error'][] = 'Corrupt Quicktime file: mdhd.time_scale == zero';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$info['quicktime']['time_scale'] = (isset($info['quicktime']['time_scale']) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);\n\n\t\t\t\t$atom_structure['creation_time_unix']    = getid3_lib::DateMac2Unix($atom_structure['creation_time']);\n\t\t\t\t$atom_structure['modify_time_unix']      = getid3_lib::DateMac2Unix($atom_structure['modify_time']);\n\t\t\t\t$atom_structure['playtime_seconds']      = $atom_structure['duration'] / $atom_structure['time_scale'];\n\t\t\t\t$atom_structure['language']              = $this->QuicktimeLanguageLookup($atom_structure['language_id']);\n\t\t\t\tif (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) {\n\t\t\t\t\t$info['comments']['language'][] = $atom_structure['language'];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'pnot': // Preview atom\n\t\t\t\t$atom_structure['modification_date']      = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4)); // \"standard Macintosh format\"\n\t\t\t\t$atom_structure['version_number']         = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2)); // hardcoded: 0x00\n\t\t\t\t$atom_structure['atom_type']              =               substr($atom_data,  6, 4);        // usually: 'PICT'\n\t\t\t\t$atom_structure['atom_index']             = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01\n\n\t\t\t\t$atom_structure['modification_date_unix'] = getid3_lib::DateMac2Unix($atom_structure['modification_date']);\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'crgn': // Clipping ReGioN atom\n\t\t\t\t$atom_structure['region_size']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 2)); // The Region size, Region boundary box,\n\t\t\t\t$atom_structure['boundary_box']  = getid3_lib::BigEndian2Int(substr($atom_data,  2, 8)); // and Clipping region data fields\n\t\t\t\t$atom_structure['clipping_data'] =               substr($atom_data, 10);           // constitute a QuickDraw region.\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'load': // track LOAD settings atom\n\t\t\t\t$atom_structure['preload_start_time'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));\n\t\t\t\t$atom_structure['preload_duration']   = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t$atom_structure['preload_flags_raw']  = getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));\n\t\t\t\t$atom_structure['default_hints_raw']  = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));\n\n\t\t\t\t$atom_structure['default_hints']['double_buffer'] = (bool) ($atom_structure['default_hints_raw'] & 0x0020);\n\t\t\t\t$atom_structure['default_hints']['high_quality']  = (bool) ($atom_structure['default_hints_raw'] & 0x0100);\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'tmcd': // TiMe CoDe atom\n\t\t\tcase 'chap': // CHAPter list atom\n\t\t\tcase 'sync': // SYNChronization atom\n\t\t\tcase 'scpt': // tranSCriPT atom\n\t\t\tcase 'ssrc': // non-primary SouRCe atom\n\t\t\t\tfor ($i = 0; $i < strlen($atom_data); $i += 4) {\n\t\t\t\t\t@$atom_structure['track_id'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'elst': // Edit LiST atom\n\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\tfor ($i = 0; $i < $atom_structure['number_entries']; $i++ ) {\n\t\t\t\t\t$atom_structure['edit_list'][$i]['track_duration'] =   getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 0, 4));\n\t\t\t\t\t$atom_structure['edit_list'][$i]['media_time']     =   getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 4, 4));\n\t\t\t\t\t$atom_structure['edit_list'][$i]['media_rate']     = getid3_lib::FixedPoint16_16(substr($atom_data, 8 + ($i * 12) + 8, 4));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'kmat': // compressed MATte atom\n\t\t\t\t$atom_structure['version']        = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']      = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3)); // hardcoded: 0x0000\n\t\t\t\t$atom_structure['matte_data_raw'] =               substr($atom_data,  4);\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'ctab': // Color TABle atom\n\t\t\t\t$atom_structure['color_table_seed']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4)); // hardcoded: 0x00000000\n\t\t\t\t$atom_structure['color_table_flags']  = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2)); // hardcoded: 0x8000\n\t\t\t\t$atom_structure['color_table_size']   = getid3_lib::BigEndian2Int(substr($atom_data,  6, 2)) + 1;\n\t\t\t\tfor ($colortableentry = 0; $colortableentry < $atom_structure['color_table_size']; $colortableentry++) {\n\t\t\t\t\t$atom_structure['color_table'][$colortableentry]['alpha'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 0, 2));\n\t\t\t\t\t$atom_structure['color_table'][$colortableentry]['red']   = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 2, 2));\n\t\t\t\t\t$atom_structure['color_table'][$colortableentry]['green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 4, 2));\n\t\t\t\t\t$atom_structure['color_table'][$colortableentry]['blue']  = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 6, 2));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'mvhd': // MoVie HeaDer atom\n\t\t\t\t$atom_structure['version']            =   getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']          =   getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));\n\t\t\t\t$atom_structure['creation_time']      =   getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t$atom_structure['modify_time']        =   getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));\n\t\t\t\t$atom_structure['time_scale']         =   getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));\n\t\t\t\t$atom_structure['duration']           =   getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));\n\t\t\t\t$atom_structure['preferred_rate']     = getid3_lib::FixedPoint16_16(substr($atom_data, 20, 4));\n\t\t\t\t$atom_structure['preferred_volume']   =   getid3_lib::FixedPoint8_8(substr($atom_data, 24, 2));\n\t\t\t\t$atom_structure['reserved']           =                             substr($atom_data, 26, 10);\n\t\t\t\t$atom_structure['matrix_a']           = getid3_lib::FixedPoint16_16(substr($atom_data, 36, 4));\n\t\t\t\t$atom_structure['matrix_b']           = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4));\n\t\t\t\t$atom_structure['matrix_u']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 44, 4));\n\t\t\t\t$atom_structure['matrix_c']           = getid3_lib::FixedPoint16_16(substr($atom_data, 48, 4));\n\t\t\t\t$atom_structure['matrix_d']           = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4));\n\t\t\t\t$atom_structure['matrix_v']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 56, 4));\n\t\t\t\t$atom_structure['matrix_x']           = getid3_lib::FixedPoint16_16(substr($atom_data, 60, 4));\n\t\t\t\t$atom_structure['matrix_y']           = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4));\n\t\t\t\t$atom_structure['matrix_w']           =  getid3_lib::FixedPoint2_30(substr($atom_data, 68, 4));\n\t\t\t\t$atom_structure['preview_time']       =   getid3_lib::BigEndian2Int(substr($atom_data, 72, 4));\n\t\t\t\t$atom_structure['preview_duration']   =   getid3_lib::BigEndian2Int(substr($atom_data, 76, 4));\n\t\t\t\t$atom_structure['poster_time']        =   getid3_lib::BigEndian2Int(substr($atom_data, 80, 4));\n\t\t\t\t$atom_structure['selection_time']     =   getid3_lib::BigEndian2Int(substr($atom_data, 84, 4));\n\t\t\t\t$atom_structure['selection_duration'] =   getid3_lib::BigEndian2Int(substr($atom_data, 88, 4));\n\t\t\t\t$atom_structure['current_time']       =   getid3_lib::BigEndian2Int(substr($atom_data, 92, 4));\n\t\t\t\t$atom_structure['next_track_id']      =   getid3_lib::BigEndian2Int(substr($atom_data, 96, 4));\n\n\t\t\t\tif ($atom_structure['time_scale'] == 0) {\n\t\t\t\t\t$info['error'][] = 'Corrupt Quicktime file: mvhd.time_scale == zero';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$atom_structure['creation_time_unix']        = getid3_lib::DateMac2Unix($atom_structure['creation_time']);\n\t\t\t\t$atom_structure['modify_time_unix']          = getid3_lib::DateMac2Unix($atom_structure['modify_time']);\n\t\t\t\t$info['quicktime']['time_scale']    = (isset($info['quicktime']['time_scale']) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);\n\t\t\t\t$info['quicktime']['display_scale'] = $atom_structure['matrix_a'];\n\t\t\t\t$info['playtime_seconds']           = $atom_structure['duration'] / $atom_structure['time_scale'];\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'tkhd': // TracK HeaDer atom\n\t\t\t\t$atom_structure['version']             =   getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));\n\t\t\t\t$atom_structure['flags_raw']           =   getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));\n\t\t\t\t$atom_structure['creation_time']       =   getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t$atom_structure['modify_time']         =   getid3_lib::BigEndian2Int(substr($atom_data,  8, 4));\n\t\t\t\t$atom_structure['trackid']             =   getid3_lib::BigEndian2Int(substr($atom_data, 12, 4));\n\t\t\t\t$atom_structure['reserved1']           =   getid3_lib::BigEndian2Int(substr($atom_data, 16, 4));\n\t\t\t\t$atom_structure['duration']            =   getid3_lib::BigEndian2Int(substr($atom_data, 20, 4));\n\t\t\t\t$atom_structure['reserved2']           =   getid3_lib::BigEndian2Int(substr($atom_data, 24, 8));\n\t\t\t\t$atom_structure['layer']               =   getid3_lib::BigEndian2Int(substr($atom_data, 32, 2));\n\t\t\t\t$atom_structure['alternate_group']     =   getid3_lib::BigEndian2Int(substr($atom_data, 34, 2));\n\t\t\t\t$atom_structure['volume']              =   getid3_lib::FixedPoint8_8(substr($atom_data, 36, 2));\n\t\t\t\t$atom_structure['reserved3']           =   getid3_lib::BigEndian2Int(substr($atom_data, 38, 2));\n// http://developer.apple.com/library/mac/#documentation/QuickTime/RM/MovieBasics/MTEditing/K-Chapter/11MatrixFunctions.html\n// http://developer.apple.com/library/mac/#documentation/QuickTime/qtff/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737\n\t\t\t\t$atom_structure['matrix_a']            = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4));\n\t\t\t\t$atom_structure['matrix_b']            = getid3_lib::FixedPoint16_16(substr($atom_data, 44, 4));\n\t\t\t\t$atom_structure['matrix_u']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 48, 4));\n\t\t\t\t$atom_structure['matrix_c']            = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4));\n\t\t\t\t$atom_structure['matrix_d']            = getid3_lib::FixedPoint16_16(substr($atom_data, 56, 4));\n\t\t\t\t$atom_structure['matrix_v']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 60, 4));\n\t\t\t\t$atom_structure['matrix_x']            = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4));\n\t\t\t\t$atom_structure['matrix_y']            = getid3_lib::FixedPoint16_16(substr($atom_data, 68, 4));\n\t\t\t\t$atom_structure['matrix_w']            =  getid3_lib::FixedPoint2_30(substr($atom_data, 72, 4));\n\t\t\t\t$atom_structure['width']               = getid3_lib::FixedPoint16_16(substr($atom_data, 76, 4));\n\t\t\t\t$atom_structure['height']              = getid3_lib::FixedPoint16_16(substr($atom_data, 80, 4));\n\t\t\t\t$atom_structure['flags']['enabled']    = (bool) ($atom_structure['flags_raw'] & 0x0001);\n\t\t\t\t$atom_structure['flags']['in_movie']   = (bool) ($atom_structure['flags_raw'] & 0x0002);\n\t\t\t\t$atom_structure['flags']['in_preview'] = (bool) ($atom_structure['flags_raw'] & 0x0004);\n\t\t\t\t$atom_structure['flags']['in_poster']  = (bool) ($atom_structure['flags_raw'] & 0x0008);\n\t\t\t\t$atom_structure['creation_time_unix']  = getid3_lib::DateMac2Unix($atom_structure['creation_time']);\n\t\t\t\t$atom_structure['modify_time_unix']    = getid3_lib::DateMac2Unix($atom_structure['modify_time']);\n\n\t\t\t\tif ($atom_structure['flags']['enabled'] == 1) {\n\t\t\t\t\tif (!isset($info['video']['resolution_x']) || !isset($info['video']['resolution_y'])) {\n\t\t\t\t\t\t$info['video']['resolution_x'] = $atom_structure['width'];\n\t\t\t\t\t\t$info['video']['resolution_y'] = $atom_structure['height'];\n\t\t\t\t\t}\n\t\t\t\t\t$info['video']['resolution_x'] = max($info['video']['resolution_x'], $atom_structure['width']);\n\t\t\t\t\t$info['video']['resolution_y'] = max($info['video']['resolution_y'], $atom_structure['height']);\n\t\t\t\t\t$info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x'];\n\t\t\t\t\t$info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y'];\n\t\t\t\t} else {\n\t\t\t\t\t// see: http://www.getid3.org/phpBB3/viewtopic.php?t=1295\n\t\t\t\t\t//if (isset($info['video']['resolution_x'])) { unset($info['video']['resolution_x']); }\n\t\t\t\t\t//if (isset($info['video']['resolution_y'])) { unset($info['video']['resolution_y']); }\n\t\t\t\t\t//if (isset($info['quicktime']['video']))    { unset($info['quicktime']['video']);    }\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'iods': // Initial Object DeScriptor atom\n\t\t\t\t// http://www.koders.com/c/fid1FAB3E762903DC482D8A246D4A4BF9F28E049594.aspx?s=windows.h\n\t\t\t\t// http://libquicktime.sourcearchive.com/documentation/1.0.2plus-pdebian/iods_8c-source.html\n\t\t\t\t$offset = 0;\n\t\t\t\t$atom_structure['version']                =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));\n\t\t\t\t$offset += 1;\n\t\t\t\t$atom_structure['flags_raw']              =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 3));\n\t\t\t\t$offset += 3;\n\t\t\t\t$atom_structure['mp4_iod_tag']            =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));\n\t\t\t\t$offset += 1;\n\t\t\t\t$atom_structure['length']                 = $this->quicktime_read_mp4_descr_length($atom_data, $offset);\n\t\t\t\t//$offset already adjusted by quicktime_read_mp4_descr_length()\n\t\t\t\t$atom_structure['object_descriptor_id']   =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));\n\t\t\t\t$offset += 2;\n\t\t\t\t$atom_structure['od_profile_level']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));\n\t\t\t\t$offset += 1;\n\t\t\t\t$atom_structure['scene_profile_level']    =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));\n\t\t\t\t$offset += 1;\n\t\t\t\t$atom_structure['audio_profile_id']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));\n\t\t\t\t$offset += 1;\n\t\t\t\t$atom_structure['video_profile_id']       =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));\n\t\t\t\t$offset += 1;\n\t\t\t\t$atom_structure['graphics_profile_level'] =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));\n\t\t\t\t$offset += 1;\n\n\t\t\t\t$atom_structure['num_iods_tracks'] = ($atom_structure['length'] - 7) / 6; // 6 bytes would only be right if all tracks use 1-byte length fields\n\t\t\t\tfor ($i = 0; $i < $atom_structure['num_iods_tracks']; $i++) {\n\t\t\t\t\t$atom_structure['track'][$i]['ES_ID_IncTag'] =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1));\n\t\t\t\t\t$offset += 1;\n\t\t\t\t\t$atom_structure['track'][$i]['length']       = $this->quicktime_read_mp4_descr_length($atom_data, $offset);\n\t\t\t\t\t//$offset already adjusted by quicktime_read_mp4_descr_length()\n\t\t\t\t\t$atom_structure['track'][$i]['track_id']     =       getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4));\n\t\t\t\t\t$offset += 4;\n\t\t\t\t}\n\n\t\t\t\t$atom_structure['audio_profile_name'] = $this->QuicktimeIODSaudioProfileName($atom_structure['audio_profile_id']);\n\t\t\t\t$atom_structure['video_profile_name'] = $this->QuicktimeIODSvideoProfileName($atom_structure['video_profile_id']);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ftyp': // FileTYPe (?) atom (for MP4 it seems)\n\t\t\t\t$atom_structure['signature'] =                           substr($atom_data,  0, 4);\n\t\t\t\t$atom_structure['unknown_1'] = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));\n\t\t\t\t$atom_structure['fourcc']    =                           substr($atom_data,  8, 4);\n\t\t\t\tbreak;\n\n\t\t\tcase 'mdat': // Media DATa atom\n\t\t\t\t// 'mdat' contains the actual data for the audio/video, possibly also subtitles\n\n/* due to lack of known documentation, this is a kludge implementation. If you know of documentation on how mdat is properly structed, please send it to info@getid3.org */\n\n\t\t\t\t// first, skip any 'wide' padding, and second 'mdat' header (with specified size of zero?)\n\t\t\t\t$mdat_offset = 0;\n\t\t\t\twhile (true) {\n\t\t\t\t\tif (substr($atom_data, $mdat_offset, 8) == \"\\x00\\x00\\x00\\x08\".'wide') {\n\t\t\t\t\t\t$mdat_offset += 8;\n\t\t\t\t\t} elseif (substr($atom_data, $mdat_offset, 8) == \"\\x00\\x00\\x00\\x00\".'mdat') {\n\t\t\t\t\t\t$mdat_offset += 8;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field\n\t\t\t\twhile  (($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2)))\n\t\t\t\t\t&& ($chapter_string_length < 1000)\n\t\t\t\t\t&& ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2))\n\t\t\t\t\t&& preg_match('#^[\\x20-\\xFF]+$#', substr($atom_data, $mdat_offset + 2, $chapter_string_length), $chapter_matches)) {\n\t\t\t\t\t\t$mdat_offset += (2 + $chapter_string_length);\n\t\t\t\t\t\t@$info['quicktime']['comments']['chapters'][] = $chapter_matches[0];\n\t\t\t\t}\n\n\n\n\t\t\t\tif (($atomsize > 8) && (!isset($info['avdataend_tmp']) || ($info['quicktime'][$atomname]['size'] > ($info['avdataend_tmp'] - $info['avdataoffset'])))) {\n\n\t\t\t\t\t$info['avdataoffset'] = $atom_structure['offset'] + 8;                       // $info['quicktime'][$atomname]['offset'] + 8;\n\t\t\t\t\t$OldAVDataEnd         = $info['avdataend'];\n\t\t\t\t\t$info['avdataend']    = $atom_structure['offset'] + $atom_structure['size']; // $info['quicktime'][$atomname]['offset'] + $info['quicktime'][$atomname]['size'];\n\n\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];\n\t\t\t\t\t$getid3_temp->info['avdataend']    = $info['avdataend'];\n\t\t\t\t\t$getid3_mp3 = new getid3_mp3($getid3_temp);\n\t\t\t\t\tif ($getid3_mp3->MPEGaudioHeaderValid($getid3_mp3->MPEGaudioHeaderDecode($this->fread(4)))) {\n\t\t\t\t\t\t$getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false);\n\t\t\t\t\t\tif (!empty($getid3_temp->info['warning'])) {\n\t\t\t\t\t\t\tforeach ($getid3_temp->info['warning'] as $value) {\n\t\t\t\t\t\t\t\t$info['warning'][] = $value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!empty($getid3_temp->info['mpeg'])) {\n\t\t\t\t\t\t\t$info['mpeg'] = $getid3_temp->info['mpeg'];\n\t\t\t\t\t\t\tif (isset($info['mpeg']['audio'])) {\n\t\t\t\t\t\t\t\t$info['audio']['dataformat']   = 'mp3';\n\t\t\t\t\t\t\t\t$info['audio']['codec']        = (!empty($info['mpeg']['audio']['encoder']) ? $info['mpeg']['audio']['encoder'] : (!empty($info['mpeg']['audio']['codec']) ? $info['mpeg']['audio']['codec'] : (!empty($info['mpeg']['audio']['LAME']) ? 'LAME' :'mp3')));\n\t\t\t\t\t\t\t\t$info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];\n\t\t\t\t\t\t\t\t$info['audio']['channels']     = $info['mpeg']['audio']['channels'];\n\t\t\t\t\t\t\t\t$info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];\n\t\t\t\t\t\t\t\t$info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);\n\t\t\t\t\t\t\t\t$info['bitrate']               = $info['audio']['bitrate'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tunset($getid3_mp3, $getid3_temp);\n\t\t\t\t\t$info['avdataend'] = $OldAVDataEnd;\n\t\t\t\t\tunset($OldAVDataEnd);\n\n\t\t\t\t}\n\n\t\t\t\tunset($mdat_offset, $chapter_string_length, $chapter_matches);\n\t\t\t\tbreak;\n\n\t\t\tcase 'free': // FREE space atom\n\t\t\tcase 'skip': // SKIP atom\n\t\t\tcase 'wide': // 64-bit expansion placeholder atom\n\t\t\t\t// 'free', 'skip' and 'wide' are just padding, contains no useful data at all\n\n\t\t\t\t// When writing QuickTime files, it is sometimes necessary to update an atom's size.\n\t\t\t\t// It is impossible to update a 32-bit atom to a 64-bit atom since the 32-bit atom\n\t\t\t\t// is only 8 bytes in size, and the 64-bit atom requires 16 bytes. Therefore, QuickTime\n\t\t\t\t// puts an 8-byte placeholder atom before any atoms it may have to update the size of.\n\t\t\t\t// In this way, if the atom needs to be converted from a 32-bit to a 64-bit atom, the\n\t\t\t\t// placeholder atom can be overwritten to obtain the necessary 8 extra bytes.\n\t\t\t\t// The placeholder atom has a type of kWideAtomPlaceholderType ( 'wide' ).\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'nsav': // NoSAVe atom\n\t\t\t\t// http://developer.apple.com/technotes/tn/tn2038.html\n\t\t\t\t$atom_structure['data'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));\n\t\t\t\tbreak;\n\n\t\t\tcase 'ctyp': // Controller TYPe atom (seen on QTVR)\n\t\t\t\t// http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt\n\t\t\t\t// some controller names are:\n\t\t\t\t//   0x00 + 'std' for linear movie\n\t\t\t\t//   'none' for no controls\n\t\t\t\t$atom_structure['ctyp'] = substr($atom_data, 0, 4);\n\t\t\t\t$info['quicktime']['controller'] = $atom_structure['ctyp'];\n\t\t\t\tswitch ($atom_structure['ctyp']) {\n\t\t\t\t\tcase 'qtvr':\n\t\t\t\t\t\t$info['video']['dataformat'] = 'quicktimevr';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'pano': // PANOrama track (seen on QTVR)\n\t\t\t\t$atom_structure['pano'] = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4));\n\t\t\t\tbreak;\n\n\t\t\tcase 'hint': // HINT track\n\t\t\tcase 'hinf': //\n\t\t\tcase 'hinv': //\n\t\t\tcase 'hnti': //\n\t\t\t\t$info['quicktime']['hinting'] = true;\n\t\t\t\tbreak;\n\n\t\t\tcase 'imgt': // IMaGe Track reference (kQTVRImageTrackRefType) (seen on QTVR)\n\t\t\t\tfor ($i = 0; $i < ($atom_structure['size'] - 8); $i += 4) {\n\t\t\t\t\t$atom_structure['imgt'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\t// Observed-but-not-handled atom types are just listed here to prevent warnings being generated\n\t\t\tcase 'FXTC': // Something to do with Adobe After Effects (?)\n\t\t\tcase 'PrmA':\n\t\t\tcase 'code':\n\t\t\tcase 'FIEL': // this is NOT \"fiel\" (Field Ordering) as describe here: http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html\n\t\t\tcase 'tapt': // TrackApertureModeDimensionsAID - http://developer.apple.com/documentation/QuickTime/Reference/QT7-1_Update_Reference/Constants/Constants.html\n\t\t\t\t\t\t// tapt seems to be used to compute the video size [http://www.getid3.org/phpBB3/viewtopic.php?t=838]\n\t\t\t\t\t\t// * http://lists.apple.com/archives/quicktime-api/2006/Aug/msg00014.html\n\t\t\t\t\t\t// * http://handbrake.fr/irclogs/handbrake-dev/handbrake-dev20080128_pg2.html\n\t\t\tcase 'ctts'://  STCompositionOffsetAID             - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html\n\t\t\tcase 'cslg'://  STCompositionShiftLeastGreatestAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html\n\t\t\tcase 'sdtp'://  STSampleDependencyAID              - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html\n\t\t\tcase 'stps'://  STPartialSyncSampleAID             - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html\n\t\t\t\t//$atom_structure['data'] = $atom_data;\n\t\t\t\tbreak;\n\n\t\t\tcase \"\\xA9\".'xyz':  // GPS latitude+longitude+altitude\n\t\t\t\t$atom_structure['data'] = $atom_data;\n\t\t\t\tif (preg_match('#([\\\\+\\\\-][0-9\\\\.]+)([\\\\+\\\\-][0-9\\\\.]+)([\\\\+\\\\-][0-9\\\\.]+)?/$#i', $atom_data, $matches)) {\n\t\t\t\t\t@list($all, $latitude, $longitude, $altitude) = $matches;\n\t\t\t\t\t$info['quicktime']['comments']['gps_latitude'][]  = floatval($latitude);\n\t\t\t\t\t$info['quicktime']['comments']['gps_longitude'][] = floatval($longitude);\n\t\t\t\t\tif (!empty($altitude)) {\n\t\t\t\t\t\t$info['quicktime']['comments']['gps_altitude'][] = floatval($altitude);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$info['warning'][] = 'QuickTime atom \"©xyz\" data does not match expected data pattern at offset '.$baseoffset.'. Please report as getID3() bug.';\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'NCDT':\n\t\t\t\t// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html\n\t\t\t\t// Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100\n\t\t\t\t$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms);\n\t\t\t\tbreak;\n\t\t\tcase 'NCTH': // Nikon Camera THumbnail image\n\t\t\tcase 'NCVW': // Nikon Camera preVieW image\n\t\t\t\t// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html\n\t\t\t\tif (preg_match('/^\\xFF\\xD8\\xFF/', $atom_data)) {\n\t\t\t\t\t$atom_structure['data'] = $atom_data;\n\t\t\t\t\t$atom_structure['image_mime'] = 'image/jpeg';\n\t\t\t\t\t$atom_structure['description'] = (($atomname == 'NCTH') ? 'Nikon Camera Thumbnail Image' : (($atomname == 'NCVW') ? 'Nikon Camera Preview Image' : 'Nikon preview image'));\n\t\t\t\t\t$info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_data, 'description'=>$atom_structure['description']);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'NCTG': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG\n\t\t\t\t$atom_structure['data'] = $this->QuicktimeParseNikonNCTG($atom_data);\n\t\t\t\tbreak;\n\t\t\tcase 'NCHD': // Nikon:MakerNoteVersion  - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html\n\t\t\tcase 'NCDB': // Nikon                   - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html\n\t\t\tcase 'CNCV': // Canon:CompressorVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html\n\t\t\t\t$atom_structure['data'] = $atom_data;\n\t\t\t\tbreak;\n\n\t\t\tcase \"\\x00\\x00\\x00\\x00\":\n\t\t\tcase 'meta': // METAdata atom\n\t\t\t\t// some kind of metacontainer, may contain a big data dump such as:\n\t\t\t\t// mdta keys \\005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \\01D \\001 \\015data \\001DE\\010Apple 0 \\002 (data \\001DE\\0102011-05-11T17:54:04+0200 2 \\003 *data \\001DE\\010+52.4936+013.3897+040.247/ \\01D \\004 \\015data \\001DE\\0104.3.1 \\005 \\018data \\001DE\\010iPhone 4\n\t\t\t\t// http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt\n\n\t            $atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));\n\t            $atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));\n\t            $atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);\n\t\t\t\t//$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);\n\t\t\t\tbreak;\n\n\t\t\tcase 'data': // metaDATA atom\n\t\t\t\t// seems to be 2 bytes language code (ASCII), 2 bytes unknown (set to 0x10B5 in sample I have), remainder is useful data\n\t\t\t\t$atom_structure['language'] =                           substr($atom_data, 4 + 0, 2);\n\t\t\t\t$atom_structure['unknown']  = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2));\n\t\t\t\t$atom_structure['data']     =                           substr($atom_data, 4 + 4);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$info['warning'][] = 'Unknown QuickTime atom type: \"'.preg_replace('#[^a-zA-Z0-9 _\\\\-]#', '?', $atomname).'\" ('.trim(getid3_lib::PrintHexBytes($atomname)).') at offset '.$baseoffset;\n\t\t\t\t$atom_structure['data'] = $atom_data;\n\t\t\t\tbreak;\n\t\t}\n\t\tarray_pop($atomHierarchy);\n\t\treturn $atom_structure;\n\t}\n\n\tpublic function QuicktimeParseContainerAtom($atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) {\n//echo 'QuicktimeParseContainerAtom('.substr($atom_data, 4, 4).') @ '.$baseoffset.'<br><br>';\n\t\t$atom_structure  = false;\n\t\t$subatomoffset  = 0;\n\t\t$subatomcounter = 0;\n\t\tif ((strlen($atom_data) == 4) && (getid3_lib::BigEndian2Int($atom_data) == 0x00000000)) {\n\t\t\treturn false;\n\t\t}\n\t\twhile ($subatomoffset < strlen($atom_data)) {\n\t\t\t$subatomsize = getid3_lib::BigEndian2Int(substr($atom_data, $subatomoffset + 0, 4));\n\t\t\t$subatomname =                           substr($atom_data, $subatomoffset + 4, 4);\n\t\t\t$subatomdata =                           substr($atom_data, $subatomoffset + 8, $subatomsize - 8);\n\t\t\tif ($subatomsize == 0) {\n\t\t\t\t// Furthermore, for historical reasons the list of atoms is optionally\n\t\t\t\t// terminated by a 32-bit integer set to 0. If you are writing a program\n\t\t\t\t// to read user data atoms, you should allow for the terminating 0.\n\t\t\t\treturn $atom_structure;\n\t\t\t}\n\n\t\t\t$atom_structure[$subatomcounter] = $this->QuicktimeParseAtom($subatomname, $subatomsize, $subatomdata, $baseoffset + $subatomoffset, $atomHierarchy, $ParseAllPossibleAtoms);\n\n\t\t\t$subatomoffset += $subatomsize;\n\t\t\t$subatomcounter++;\n\t\t}\n\t\treturn $atom_structure;\n\t}\n\n\n\tpublic function quicktime_read_mp4_descr_length($data, &$offset) {\n\t\t// http://libquicktime.sourcearchive.com/documentation/2:1.0.2plus-pdebian-2build1/esds_8c-source.html\n\t\t$num_bytes = 0;\n\t\t$length    = 0;\n\t\tdo {\n\t\t\t$b = ord(substr($data, $offset++, 1));\n\t\t\t$length = ($length << 7) | ($b & 0x7F);\n\t\t} while (($b & 0x80) && ($num_bytes++ < 4));\n\t\treturn $length;\n\t}\n\n\n\tpublic function QuicktimeLanguageLookup($languageid) {\n\t\t// http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-34353\n\t\tstatic $QuicktimeLanguageLookup = array();\n\t\tif (empty($QuicktimeLanguageLookup)) {\n\t\t\t$QuicktimeLanguageLookup[0]     = 'English';\n\t\t\t$QuicktimeLanguageLookup[1]     = 'French';\n\t\t\t$QuicktimeLanguageLookup[2]     = 'German';\n\t\t\t$QuicktimeLanguageLookup[3]     = 'Italian';\n\t\t\t$QuicktimeLanguageLookup[4]     = 'Dutch';\n\t\t\t$QuicktimeLanguageLookup[5]     = 'Swedish';\n\t\t\t$QuicktimeLanguageLookup[6]     = 'Spanish';\n\t\t\t$QuicktimeLanguageLookup[7]     = 'Danish';\n\t\t\t$QuicktimeLanguageLookup[8]     = 'Portuguese';\n\t\t\t$QuicktimeLanguageLookup[9]     = 'Norwegian';\n\t\t\t$QuicktimeLanguageLookup[10]    = 'Hebrew';\n\t\t\t$QuicktimeLanguageLookup[11]    = 'Japanese';\n\t\t\t$QuicktimeLanguageLookup[12]    = 'Arabic';\n\t\t\t$QuicktimeLanguageLookup[13]    = 'Finnish';\n\t\t\t$QuicktimeLanguageLookup[14]    = 'Greek';\n\t\t\t$QuicktimeLanguageLookup[15]    = 'Icelandic';\n\t\t\t$QuicktimeLanguageLookup[16]    = 'Maltese';\n\t\t\t$QuicktimeLanguageLookup[17]    = 'Turkish';\n\t\t\t$QuicktimeLanguageLookup[18]    = 'Croatian';\n\t\t\t$QuicktimeLanguageLookup[19]    = 'Chinese (Traditional)';\n\t\t\t$QuicktimeLanguageLookup[20]    = 'Urdu';\n\t\t\t$QuicktimeLanguageLookup[21]    = 'Hindi';\n\t\t\t$QuicktimeLanguageLookup[22]    = 'Thai';\n\t\t\t$QuicktimeLanguageLookup[23]    = 'Korean';\n\t\t\t$QuicktimeLanguageLookup[24]    = 'Lithuanian';\n\t\t\t$QuicktimeLanguageLookup[25]    = 'Polish';\n\t\t\t$QuicktimeLanguageLookup[26]    = 'Hungarian';\n\t\t\t$QuicktimeLanguageLookup[27]    = 'Estonian';\n\t\t\t$QuicktimeLanguageLookup[28]    = 'Lettish';\n\t\t\t$QuicktimeLanguageLookup[28]    = 'Latvian';\n\t\t\t$QuicktimeLanguageLookup[29]    = 'Saamisk';\n\t\t\t$QuicktimeLanguageLookup[29]    = 'Lappish';\n\t\t\t$QuicktimeLanguageLookup[30]    = 'Faeroese';\n\t\t\t$QuicktimeLanguageLookup[31]    = 'Farsi';\n\t\t\t$QuicktimeLanguageLookup[31]    = 'Persian';\n\t\t\t$QuicktimeLanguageLookup[32]    = 'Russian';\n\t\t\t$QuicktimeLanguageLookup[33]    = 'Chinese (Simplified)';\n\t\t\t$QuicktimeLanguageLookup[34]    = 'Flemish';\n\t\t\t$QuicktimeLanguageLookup[35]    = 'Irish';\n\t\t\t$QuicktimeLanguageLookup[36]    = 'Albanian';\n\t\t\t$QuicktimeLanguageLookup[37]    = 'Romanian';\n\t\t\t$QuicktimeLanguageLookup[38]    = 'Czech';\n\t\t\t$QuicktimeLanguageLookup[39]    = 'Slovak';\n\t\t\t$QuicktimeLanguageLookup[40]    = 'Slovenian';\n\t\t\t$QuicktimeLanguageLookup[41]    = 'Yiddish';\n\t\t\t$QuicktimeLanguageLookup[42]    = 'Serbian';\n\t\t\t$QuicktimeLanguageLookup[43]    = 'Macedonian';\n\t\t\t$QuicktimeLanguageLookup[44]    = 'Bulgarian';\n\t\t\t$QuicktimeLanguageLookup[45]    = 'Ukrainian';\n\t\t\t$QuicktimeLanguageLookup[46]    = 'Byelorussian';\n\t\t\t$QuicktimeLanguageLookup[47]    = 'Uzbek';\n\t\t\t$QuicktimeLanguageLookup[48]    = 'Kazakh';\n\t\t\t$QuicktimeLanguageLookup[49]    = 'Azerbaijani';\n\t\t\t$QuicktimeLanguageLookup[50]    = 'AzerbaijanAr';\n\t\t\t$QuicktimeLanguageLookup[51]    = 'Armenian';\n\t\t\t$QuicktimeLanguageLookup[52]    = 'Georgian';\n\t\t\t$QuicktimeLanguageLookup[53]    = 'Moldavian';\n\t\t\t$QuicktimeLanguageLookup[54]    = 'Kirghiz';\n\t\t\t$QuicktimeLanguageLookup[55]    = 'Tajiki';\n\t\t\t$QuicktimeLanguageLookup[56]    = 'Turkmen';\n\t\t\t$QuicktimeLanguageLookup[57]    = 'Mongolian';\n\t\t\t$QuicktimeLanguageLookup[58]    = 'MongolianCyr';\n\t\t\t$QuicktimeLanguageLookup[59]    = 'Pashto';\n\t\t\t$QuicktimeLanguageLookup[60]    = 'Kurdish';\n\t\t\t$QuicktimeLanguageLookup[61]    = 'Kashmiri';\n\t\t\t$QuicktimeLanguageLookup[62]    = 'Sindhi';\n\t\t\t$QuicktimeLanguageLookup[63]    = 'Tibetan';\n\t\t\t$QuicktimeLanguageLookup[64]    = 'Nepali';\n\t\t\t$QuicktimeLanguageLookup[65]    = 'Sanskrit';\n\t\t\t$QuicktimeLanguageLookup[66]    = 'Marathi';\n\t\t\t$QuicktimeLanguageLookup[67]    = 'Bengali';\n\t\t\t$QuicktimeLanguageLookup[68]    = 'Assamese';\n\t\t\t$QuicktimeLanguageLookup[69]    = 'Gujarati';\n\t\t\t$QuicktimeLanguageLookup[70]    = 'Punjabi';\n\t\t\t$QuicktimeLanguageLookup[71]    = 'Oriya';\n\t\t\t$QuicktimeLanguageLookup[72]    = 'Malayalam';\n\t\t\t$QuicktimeLanguageLookup[73]    = 'Kannada';\n\t\t\t$QuicktimeLanguageLookup[74]    = 'Tamil';\n\t\t\t$QuicktimeLanguageLookup[75]    = 'Telugu';\n\t\t\t$QuicktimeLanguageLookup[76]    = 'Sinhalese';\n\t\t\t$QuicktimeLanguageLookup[77]    = 'Burmese';\n\t\t\t$QuicktimeLanguageLookup[78]    = 'Khmer';\n\t\t\t$QuicktimeLanguageLookup[79]    = 'Lao';\n\t\t\t$QuicktimeLanguageLookup[80]    = 'Vietnamese';\n\t\t\t$QuicktimeLanguageLookup[81]    = 'Indonesian';\n\t\t\t$QuicktimeLanguageLookup[82]    = 'Tagalog';\n\t\t\t$QuicktimeLanguageLookup[83]    = 'MalayRoman';\n\t\t\t$QuicktimeLanguageLookup[84]    = 'MalayArabic';\n\t\t\t$QuicktimeLanguageLookup[85]    = 'Amharic';\n\t\t\t$QuicktimeLanguageLookup[86]    = 'Tigrinya';\n\t\t\t$QuicktimeLanguageLookup[87]    = 'Galla';\n\t\t\t$QuicktimeLanguageLookup[87]    = 'Oromo';\n\t\t\t$QuicktimeLanguageLookup[88]    = 'Somali';\n\t\t\t$QuicktimeLanguageLookup[89]    = 'Swahili';\n\t\t\t$QuicktimeLanguageLookup[90]    = 'Ruanda';\n\t\t\t$QuicktimeLanguageLookup[91]    = 'Rundi';\n\t\t\t$QuicktimeLanguageLookup[92]    = 'Chewa';\n\t\t\t$QuicktimeLanguageLookup[93]    = 'Malagasy';\n\t\t\t$QuicktimeLanguageLookup[94]    = 'Esperanto';\n\t\t\t$QuicktimeLanguageLookup[128]   = 'Welsh';\n\t\t\t$QuicktimeLanguageLookup[129]   = 'Basque';\n\t\t\t$QuicktimeLanguageLookup[130]   = 'Catalan';\n\t\t\t$QuicktimeLanguageLookup[131]   = 'Latin';\n\t\t\t$QuicktimeLanguageLookup[132]   = 'Quechua';\n\t\t\t$QuicktimeLanguageLookup[133]   = 'Guarani';\n\t\t\t$QuicktimeLanguageLookup[134]   = 'Aymara';\n\t\t\t$QuicktimeLanguageLookup[135]   = 'Tatar';\n\t\t\t$QuicktimeLanguageLookup[136]   = 'Uighur';\n\t\t\t$QuicktimeLanguageLookup[137]   = 'Dzongkha';\n\t\t\t$QuicktimeLanguageLookup[138]   = 'JavaneseRom';\n\t\t\t$QuicktimeLanguageLookup[32767] = 'Unspecified';\n\t\t}\n\t\tif (($languageid > 138) && ($languageid < 32767)) {\n\t\t\t/*\n\t\t\tISO Language Codes - http://www.loc.gov/standards/iso639-2/php/code_list.php\n\t\t\tBecause the language codes specified by ISO 639-2/T are three characters long, they must be packed to fit into a 16-bit field.\n\t\t\tThe packing algorithm must map each of the three characters, which are always lowercase, into a 5-bit integer and then concatenate\n\t\t\tthese integers into the least significant 15 bits of a 16-bit integer, leaving the 16-bit integer's most significant bit set to zero.\n\n\t\t\tOne algorithm for performing this packing is to treat each ISO character as a 16-bit integer. Subtract 0x60 from the first character\n\t\t\tand multiply by 2^10 (0x400), subtract 0x60 from the second character and multiply by 2^5 (0x20), subtract 0x60 from the third character,\n\t\t\tand add the three 16-bit values. This will result in a single 16-bit value with the three codes correctly packed into the 15 least\n\t\t\tsignificant bits and the most significant bit set to zero.\n\t\t\t*/\n\t\t\t$iso_language_id  = '';\n\t\t\t$iso_language_id .= chr((($languageid & 0x7C00) >> 10) + 0x60);\n\t\t\t$iso_language_id .= chr((($languageid & 0x03E0) >>  5) + 0x60);\n\t\t\t$iso_language_id .= chr((($languageid & 0x001F) >>  0) + 0x60);\n\t\t\t$QuicktimeLanguageLookup[$languageid] = getid3_id3v2::LanguageLookup($iso_language_id);\n\t\t}\n\t\treturn (isset($QuicktimeLanguageLookup[$languageid]) ? $QuicktimeLanguageLookup[$languageid] : 'invalid');\n\t}\n\n\tpublic function QuicktimeVideoCodecLookup($codecid) {\n\t\tstatic $QuicktimeVideoCodecLookup = array();\n\t\tif (empty($QuicktimeVideoCodecLookup)) {\n\t\t\t$QuicktimeVideoCodecLookup['.SGI'] = 'SGI';\n\t\t\t$QuicktimeVideoCodecLookup['3IV1'] = '3ivx MPEG-4 v1';\n\t\t\t$QuicktimeVideoCodecLookup['3IV2'] = '3ivx MPEG-4 v2';\n\t\t\t$QuicktimeVideoCodecLookup['3IVX'] = '3ivx MPEG-4';\n\t\t\t$QuicktimeVideoCodecLookup['8BPS'] = 'Planar RGB';\n\t\t\t$QuicktimeVideoCodecLookup['avc1'] = 'H.264/MPEG-4 AVC';\n\t\t\t$QuicktimeVideoCodecLookup['avr '] = 'AVR-JPEG';\n\t\t\t$QuicktimeVideoCodecLookup['b16g'] = '16Gray';\n\t\t\t$QuicktimeVideoCodecLookup['b32a'] = '32AlphaGray';\n\t\t\t$QuicktimeVideoCodecLookup['b48r'] = '48RGB';\n\t\t\t$QuicktimeVideoCodecLookup['b64a'] = '64ARGB';\n\t\t\t$QuicktimeVideoCodecLookup['base'] = 'Base';\n\t\t\t$QuicktimeVideoCodecLookup['clou'] = 'Cloud';\n\t\t\t$QuicktimeVideoCodecLookup['cmyk'] = 'CMYK';\n\t\t\t$QuicktimeVideoCodecLookup['cvid'] = 'Cinepak';\n\t\t\t$QuicktimeVideoCodecLookup['dmb1'] = 'OpenDML JPEG';\n\t\t\t$QuicktimeVideoCodecLookup['dvc '] = 'DVC-NTSC';\n\t\t\t$QuicktimeVideoCodecLookup['dvcp'] = 'DVC-PAL';\n\t\t\t$QuicktimeVideoCodecLookup['dvpn'] = 'DVCPro-NTSC';\n\t\t\t$QuicktimeVideoCodecLookup['dvpp'] = 'DVCPro-PAL';\n\t\t\t$QuicktimeVideoCodecLookup['fire'] = 'Fire';\n\t\t\t$QuicktimeVideoCodecLookup['flic'] = 'FLC';\n\t\t\t$QuicktimeVideoCodecLookup['gif '] = 'GIF';\n\t\t\t$QuicktimeVideoCodecLookup['h261'] = 'H261';\n\t\t\t$QuicktimeVideoCodecLookup['h263'] = 'H263';\n\t\t\t$QuicktimeVideoCodecLookup['IV41'] = 'Indeo4';\n\t\t\t$QuicktimeVideoCodecLookup['jpeg'] = 'JPEG';\n\t\t\t$QuicktimeVideoCodecLookup['kpcd'] = 'PhotoCD';\n\t\t\t$QuicktimeVideoCodecLookup['mjpa'] = 'Motion JPEG-A';\n\t\t\t$QuicktimeVideoCodecLookup['mjpb'] = 'Motion JPEG-B';\n\t\t\t$QuicktimeVideoCodecLookup['msvc'] = 'Microsoft Video1';\n\t\t\t$QuicktimeVideoCodecLookup['myuv'] = 'MPEG YUV420';\n\t\t\t$QuicktimeVideoCodecLookup['path'] = 'Vector';\n\t\t\t$QuicktimeVideoCodecLookup['png '] = 'PNG';\n\t\t\t$QuicktimeVideoCodecLookup['PNTG'] = 'MacPaint';\n\t\t\t$QuicktimeVideoCodecLookup['qdgx'] = 'QuickDrawGX';\n\t\t\t$QuicktimeVideoCodecLookup['qdrw'] = 'QuickDraw';\n\t\t\t$QuicktimeVideoCodecLookup['raw '] = 'RAW';\n\t\t\t$QuicktimeVideoCodecLookup['ripl'] = 'WaterRipple';\n\t\t\t$QuicktimeVideoCodecLookup['rpza'] = 'Video';\n\t\t\t$QuicktimeVideoCodecLookup['smc '] = 'Graphics';\n\t\t\t$QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 1';\n\t\t\t$QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 3';\n\t\t\t$QuicktimeVideoCodecLookup['syv9'] = 'Sorenson YUV9';\n\t\t\t$QuicktimeVideoCodecLookup['tga '] = 'Targa';\n\t\t\t$QuicktimeVideoCodecLookup['tiff'] = 'TIFF';\n\t\t\t$QuicktimeVideoCodecLookup['WRAW'] = 'Windows RAW';\n\t\t\t$QuicktimeVideoCodecLookup['WRLE'] = 'BMP';\n\t\t\t$QuicktimeVideoCodecLookup['y420'] = 'YUV420';\n\t\t\t$QuicktimeVideoCodecLookup['yuv2'] = 'ComponentVideo';\n\t\t\t$QuicktimeVideoCodecLookup['yuvs'] = 'ComponentVideoUnsigned';\n\t\t\t$QuicktimeVideoCodecLookup['yuvu'] = 'ComponentVideoSigned';\n\t\t}\n\t\treturn (isset($QuicktimeVideoCodecLookup[$codecid]) ? $QuicktimeVideoCodecLookup[$codecid] : '');\n\t}\n\n\tpublic function QuicktimeAudioCodecLookup($codecid) {\n\t\tstatic $QuicktimeAudioCodecLookup = array();\n\t\tif (empty($QuicktimeAudioCodecLookup)) {\n\t\t\t$QuicktimeAudioCodecLookup['.mp3']          = 'Fraunhofer MPEG Layer-III alias';\n\t\t\t$QuicktimeAudioCodecLookup['aac ']          = 'ISO/IEC 14496-3 AAC';\n\t\t\t$QuicktimeAudioCodecLookup['agsm']          = 'Apple GSM 10:1';\n\t\t\t$QuicktimeAudioCodecLookup['alac']          = 'Apple Lossless Audio Codec';\n\t\t\t$QuicktimeAudioCodecLookup['alaw']          = 'A-law 2:1';\n\t\t\t$QuicktimeAudioCodecLookup['conv']          = 'Sample Format';\n\t\t\t$QuicktimeAudioCodecLookup['dvca']          = 'DV';\n\t\t\t$QuicktimeAudioCodecLookup['dvi ']          = 'DV 4:1';\n\t\t\t$QuicktimeAudioCodecLookup['eqal']          = 'Frequency Equalizer';\n\t\t\t$QuicktimeAudioCodecLookup['fl32']          = '32-bit Floating Point';\n\t\t\t$QuicktimeAudioCodecLookup['fl64']          = '64-bit Floating Point';\n\t\t\t$QuicktimeAudioCodecLookup['ima4']          = 'Interactive Multimedia Association 4:1';\n\t\t\t$QuicktimeAudioCodecLookup['in24']          = '24-bit Integer';\n\t\t\t$QuicktimeAudioCodecLookup['in32']          = '32-bit Integer';\n\t\t\t$QuicktimeAudioCodecLookup['lpc ']          = 'LPC 23:1';\n\t\t\t$QuicktimeAudioCodecLookup['MAC3']          = 'Macintosh Audio Compression/Expansion (MACE) 3:1';\n\t\t\t$QuicktimeAudioCodecLookup['MAC6']          = 'Macintosh Audio Compression/Expansion (MACE) 6:1';\n\t\t\t$QuicktimeAudioCodecLookup['mixb']          = '8-bit Mixer';\n\t\t\t$QuicktimeAudioCodecLookup['mixw']          = '16-bit Mixer';\n\t\t\t$QuicktimeAudioCodecLookup['mp4a']          = 'ISO/IEC 14496-3 AAC';\n\t\t\t$QuicktimeAudioCodecLookup['MS'.\"\\x00\\x02\"] = 'Microsoft ADPCM';\n\t\t\t$QuicktimeAudioCodecLookup['MS'.\"\\x00\\x11\"] = 'DV IMA';\n\t\t\t$QuicktimeAudioCodecLookup['MS'.\"\\x00\\x55\"] = 'Fraunhofer MPEG Layer III';\n\t\t\t$QuicktimeAudioCodecLookup['NONE']          = 'No Encoding';\n\t\t\t$QuicktimeAudioCodecLookup['Qclp']          = 'Qualcomm PureVoice';\n\t\t\t$QuicktimeAudioCodecLookup['QDM2']          = 'QDesign Music 2';\n\t\t\t$QuicktimeAudioCodecLookup['QDMC']          = 'QDesign Music 1';\n\t\t\t$QuicktimeAudioCodecLookup['ratb']          = '8-bit Rate';\n\t\t\t$QuicktimeAudioCodecLookup['ratw']          = '16-bit Rate';\n\t\t\t$QuicktimeAudioCodecLookup['raw ']          = 'raw PCM';\n\t\t\t$QuicktimeAudioCodecLookup['sour']          = 'Sound Source';\n\t\t\t$QuicktimeAudioCodecLookup['sowt']          = 'signed/two\\'s complement (Little Endian)';\n\t\t\t$QuicktimeAudioCodecLookup['str1']          = 'Iomega MPEG layer II';\n\t\t\t$QuicktimeAudioCodecLookup['str2']          = 'Iomega MPEG *layer II';\n\t\t\t$QuicktimeAudioCodecLookup['str3']          = 'Iomega MPEG **layer II';\n\t\t\t$QuicktimeAudioCodecLookup['str4']          = 'Iomega MPEG ***layer II';\n\t\t\t$QuicktimeAudioCodecLookup['twos']          = 'signed/two\\'s complement (Big Endian)';\n\t\t\t$QuicktimeAudioCodecLookup['ulaw']          = 'mu-law 2:1';\n\t\t}\n\t\treturn (isset($QuicktimeAudioCodecLookup[$codecid]) ? $QuicktimeAudioCodecLookup[$codecid] : '');\n\t}\n\n\tpublic function QuicktimeDCOMLookup($compressionid) {\n\t\tstatic $QuicktimeDCOMLookup = array();\n\t\tif (empty($QuicktimeDCOMLookup)) {\n\t\t\t$QuicktimeDCOMLookup['zlib'] = 'ZLib Deflate';\n\t\t\t$QuicktimeDCOMLookup['adec'] = 'Apple Compression';\n\t\t}\n\t\treturn (isset($QuicktimeDCOMLookup[$compressionid]) ? $QuicktimeDCOMLookup[$compressionid] : '');\n\t}\n\n\tpublic function QuicktimeColorNameLookup($colordepthid) {\n\t\tstatic $QuicktimeColorNameLookup = array();\n\t\tif (empty($QuicktimeColorNameLookup)) {\n\t\t\t$QuicktimeColorNameLookup[1]  = '2-color (monochrome)';\n\t\t\t$QuicktimeColorNameLookup[2]  = '4-color';\n\t\t\t$QuicktimeColorNameLookup[4]  = '16-color';\n\t\t\t$QuicktimeColorNameLookup[8]  = '256-color';\n\t\t\t$QuicktimeColorNameLookup[16] = 'thousands (16-bit color)';\n\t\t\t$QuicktimeColorNameLookup[24] = 'millions (24-bit color)';\n\t\t\t$QuicktimeColorNameLookup[32] = 'millions+ (32-bit color)';\n\t\t\t$QuicktimeColorNameLookup[33] = 'black & white';\n\t\t\t$QuicktimeColorNameLookup[34] = '4-gray';\n\t\t\t$QuicktimeColorNameLookup[36] = '16-gray';\n\t\t\t$QuicktimeColorNameLookup[40] = '256-gray';\n\t\t}\n\t\treturn (isset($QuicktimeColorNameLookup[$colordepthid]) ? $QuicktimeColorNameLookup[$colordepthid] : 'invalid');\n\t}\n\n\tpublic function QuicktimeSTIKLookup($stik) {\n\t\tstatic $QuicktimeSTIKLookup = array();\n\t\tif (empty($QuicktimeSTIKLookup)) {\n\t\t\t$QuicktimeSTIKLookup[0]  = 'Movie';\n\t\t\t$QuicktimeSTIKLookup[1]  = 'Normal';\n\t\t\t$QuicktimeSTIKLookup[2]  = 'Audiobook';\n\t\t\t$QuicktimeSTIKLookup[5]  = 'Whacked Bookmark';\n\t\t\t$QuicktimeSTIKLookup[6]  = 'Music Video';\n\t\t\t$QuicktimeSTIKLookup[9]  = 'Short Film';\n\t\t\t$QuicktimeSTIKLookup[10] = 'TV Show';\n\t\t\t$QuicktimeSTIKLookup[11] = 'Booklet';\n\t\t\t$QuicktimeSTIKLookup[14] = 'Ringtone';\n\t\t\t$QuicktimeSTIKLookup[21] = 'Podcast';\n\t\t}\n\t\treturn (isset($QuicktimeSTIKLookup[$stik]) ? $QuicktimeSTIKLookup[$stik] : 'invalid');\n\t}\n\n\tpublic function QuicktimeIODSaudioProfileName($audio_profile_id) {\n\t\tstatic $QuicktimeIODSaudioProfileNameLookup = array();\n\t\tif (empty($QuicktimeIODSaudioProfileNameLookup)) {\n\t\t\t$QuicktimeIODSaudioProfileNameLookup = array(\n\t\t\t    0x00 => 'ISO Reserved (0x00)',\n\t\t\t    0x01 => 'Main Audio Profile @ Level 1',\n\t\t\t    0x02 => 'Main Audio Profile @ Level 2',\n\t\t\t    0x03 => 'Main Audio Profile @ Level 3',\n\t\t\t    0x04 => 'Main Audio Profile @ Level 4',\n\t\t\t    0x05 => 'Scalable Audio Profile @ Level 1',\n\t\t\t    0x06 => 'Scalable Audio Profile @ Level 2',\n\t\t\t    0x07 => 'Scalable Audio Profile @ Level 3',\n\t\t\t    0x08 => 'Scalable Audio Profile @ Level 4',\n\t\t\t    0x09 => 'Speech Audio Profile @ Level 1',\n\t\t\t    0x0A => 'Speech Audio Profile @ Level 2',\n\t\t\t    0x0B => 'Synthetic Audio Profile @ Level 1',\n\t\t\t    0x0C => 'Synthetic Audio Profile @ Level 2',\n\t\t\t    0x0D => 'Synthetic Audio Profile @ Level 3',\n\t\t\t    0x0E => 'High Quality Audio Profile @ Level 1',\n\t\t\t    0x0F => 'High Quality Audio Profile @ Level 2',\n\t\t\t    0x10 => 'High Quality Audio Profile @ Level 3',\n\t\t\t    0x11 => 'High Quality Audio Profile @ Level 4',\n\t\t\t    0x12 => 'High Quality Audio Profile @ Level 5',\n\t\t\t    0x13 => 'High Quality Audio Profile @ Level 6',\n\t\t\t    0x14 => 'High Quality Audio Profile @ Level 7',\n\t\t\t    0x15 => 'High Quality Audio Profile @ Level 8',\n\t\t\t    0x16 => 'Low Delay Audio Profile @ Level 1',\n\t\t\t    0x17 => 'Low Delay Audio Profile @ Level 2',\n\t\t\t    0x18 => 'Low Delay Audio Profile @ Level 3',\n\t\t\t    0x19 => 'Low Delay Audio Profile @ Level 4',\n\t\t\t    0x1A => 'Low Delay Audio Profile @ Level 5',\n\t\t\t    0x1B => 'Low Delay Audio Profile @ Level 6',\n\t\t\t    0x1C => 'Low Delay Audio Profile @ Level 7',\n\t\t\t    0x1D => 'Low Delay Audio Profile @ Level 8',\n\t\t\t    0x1E => 'Natural Audio Profile @ Level 1',\n\t\t\t    0x1F => 'Natural Audio Profile @ Level 2',\n\t\t\t    0x20 => 'Natural Audio Profile @ Level 3',\n\t\t\t    0x21 => 'Natural Audio Profile @ Level 4',\n\t\t\t    0x22 => 'Mobile Audio Internetworking Profile @ Level 1',\n\t\t\t    0x23 => 'Mobile Audio Internetworking Profile @ Level 2',\n\t\t\t    0x24 => 'Mobile Audio Internetworking Profile @ Level 3',\n\t\t\t    0x25 => 'Mobile Audio Internetworking Profile @ Level 4',\n\t\t\t    0x26 => 'Mobile Audio Internetworking Profile @ Level 5',\n\t\t\t    0x27 => 'Mobile Audio Internetworking Profile @ Level 6',\n\t\t\t    0x28 => 'AAC Profile @ Level 1',\n\t\t\t    0x29 => 'AAC Profile @ Level 2',\n\t\t\t    0x2A => 'AAC Profile @ Level 4',\n\t\t\t    0x2B => 'AAC Profile @ Level 5',\n\t\t\t    0x2C => 'High Efficiency AAC Profile @ Level 2',\n\t\t\t    0x2D => 'High Efficiency AAC Profile @ Level 3',\n\t\t\t    0x2E => 'High Efficiency AAC Profile @ Level 4',\n\t\t\t    0x2F => 'High Efficiency AAC Profile @ Level 5',\n\t\t\t    0xFE => 'Not part of MPEG-4 audio profiles',\n\t\t\t    0xFF => 'No audio capability required',\n\t\t\t);\n\t\t}\n\t\treturn (isset($QuicktimeIODSaudioProfileNameLookup[$audio_profile_id]) ? $QuicktimeIODSaudioProfileNameLookup[$audio_profile_id] : 'ISO Reserved / User Private');\n\t}\n\n\n\tpublic function QuicktimeIODSvideoProfileName($video_profile_id) {\n\t\tstatic $QuicktimeIODSvideoProfileNameLookup = array();\n\t\tif (empty($QuicktimeIODSvideoProfileNameLookup)) {\n\t\t\t$QuicktimeIODSvideoProfileNameLookup = array(\n\t\t\t\t0x00 => 'Reserved (0x00) Profile',\n\t\t\t\t0x01 => 'Simple Profile @ Level 1',\n\t\t\t\t0x02 => 'Simple Profile @ Level 2',\n\t\t\t\t0x03 => 'Simple Profile @ Level 3',\n\t\t\t\t0x08 => 'Simple Profile @ Level 0',\n\t\t\t\t0x10 => 'Simple Scalable Profile @ Level 0',\n\t\t\t\t0x11 => 'Simple Scalable Profile @ Level 1',\n\t\t\t\t0x12 => 'Simple Scalable Profile @ Level 2',\n\t\t\t\t0x15 => 'AVC/H264 Profile',\n\t\t\t\t0x21 => 'Core Profile @ Level 1',\n\t\t\t\t0x22 => 'Core Profile @ Level 2',\n\t\t\t\t0x32 => 'Main Profile @ Level 2',\n\t\t\t\t0x33 => 'Main Profile @ Level 3',\n\t\t\t\t0x34 => 'Main Profile @ Level 4',\n\t\t\t\t0x42 => 'N-bit Profile @ Level 2',\n\t\t\t\t0x51 => 'Scalable Texture Profile @ Level 1',\n\t\t\t\t0x61 => 'Simple Face Animation Profile @ Level 1',\n\t\t\t\t0x62 => 'Simple Face Animation Profile @ Level 2',\n\t\t\t\t0x63 => 'Simple FBA Profile @ Level 1',\n\t\t\t\t0x64 => 'Simple FBA Profile @ Level 2',\n\t\t\t\t0x71 => 'Basic Animated Texture Profile @ Level 1',\n\t\t\t\t0x72 => 'Basic Animated Texture Profile @ Level 2',\n\t\t\t\t0x81 => 'Hybrid Profile @ Level 1',\n\t\t\t\t0x82 => 'Hybrid Profile @ Level 2',\n\t\t\t\t0x91 => 'Advanced Real Time Simple Profile @ Level 1',\n\t\t\t\t0x92 => 'Advanced Real Time Simple Profile @ Level 2',\n\t\t\t\t0x93 => 'Advanced Real Time Simple Profile @ Level 3',\n\t\t\t\t0x94 => 'Advanced Real Time Simple Profile @ Level 4',\n\t\t\t\t0xA1 => 'Core Scalable Profile @ Level1',\n\t\t\t\t0xA2 => 'Core Scalable Profile @ Level2',\n\t\t\t\t0xA3 => 'Core Scalable Profile @ Level3',\n\t\t\t\t0xB1 => 'Advanced Coding Efficiency Profile @ Level 1',\n\t\t\t\t0xB2 => 'Advanced Coding Efficiency Profile @ Level 2',\n\t\t\t\t0xB3 => 'Advanced Coding Efficiency Profile @ Level 3',\n\t\t\t\t0xB4 => 'Advanced Coding Efficiency Profile @ Level 4',\n\t\t\t\t0xC1 => 'Advanced Core Profile @ Level 1',\n\t\t\t\t0xC2 => 'Advanced Core Profile @ Level 2',\n\t\t\t\t0xD1 => 'Advanced Scalable Texture @ Level1',\n\t\t\t\t0xD2 => 'Advanced Scalable Texture @ Level2',\n\t\t\t\t0xE1 => 'Simple Studio Profile @ Level 1',\n\t\t\t\t0xE2 => 'Simple Studio Profile @ Level 2',\n\t\t\t\t0xE3 => 'Simple Studio Profile @ Level 3',\n\t\t\t\t0xE4 => 'Simple Studio Profile @ Level 4',\n\t\t\t\t0xE5 => 'Core Studio Profile @ Level 1',\n\t\t\t\t0xE6 => 'Core Studio Profile @ Level 2',\n\t\t\t\t0xE7 => 'Core Studio Profile @ Level 3',\n\t\t\t\t0xE8 => 'Core Studio Profile @ Level 4',\n\t\t\t\t0xF0 => 'Advanced Simple Profile @ Level 0',\n\t\t\t\t0xF1 => 'Advanced Simple Profile @ Level 1',\n\t\t\t\t0xF2 => 'Advanced Simple Profile @ Level 2',\n\t\t\t\t0xF3 => 'Advanced Simple Profile @ Level 3',\n\t\t\t\t0xF4 => 'Advanced Simple Profile @ Level 4',\n\t\t\t\t0xF5 => 'Advanced Simple Profile @ Level 5',\n\t\t\t\t0xF7 => 'Advanced Simple Profile @ Level 3b',\n\t\t\t\t0xF8 => 'Fine Granularity Scalable Profile @ Level 0',\n\t\t\t\t0xF9 => 'Fine Granularity Scalable Profile @ Level 1',\n\t\t\t\t0xFA => 'Fine Granularity Scalable Profile @ Level 2',\n\t\t\t\t0xFB => 'Fine Granularity Scalable Profile @ Level 3',\n\t\t\t\t0xFC => 'Fine Granularity Scalable Profile @ Level 4',\n\t\t\t\t0xFD => 'Fine Granularity Scalable Profile @ Level 5',\n\t\t\t\t0xFE => 'Not part of MPEG-4 Visual profiles',\n\t\t\t\t0xFF => 'No visual capability required',\n\t\t\t);\n\t\t}\n\t\treturn (isset($QuicktimeIODSvideoProfileNameLookup[$video_profile_id]) ? $QuicktimeIODSvideoProfileNameLookup[$video_profile_id] : 'ISO Reserved Profile');\n\t}\n\n\n\tpublic function QuicktimeContentRatingLookup($rtng) {\n\t\tstatic $QuicktimeContentRatingLookup = array();\n\t\tif (empty($QuicktimeContentRatingLookup)) {\n\t\t\t$QuicktimeContentRatingLookup[0]  = 'None';\n\t\t\t$QuicktimeContentRatingLookup[2]  = 'Clean';\n\t\t\t$QuicktimeContentRatingLookup[4]  = 'Explicit';\n\t\t}\n\t\treturn (isset($QuicktimeContentRatingLookup[$rtng]) ? $QuicktimeContentRatingLookup[$rtng] : 'invalid');\n\t}\n\n\tpublic function QuicktimeStoreAccountTypeLookup($akid) {\n\t\tstatic $QuicktimeStoreAccountTypeLookup = array();\n\t\tif (empty($QuicktimeStoreAccountTypeLookup)) {\n\t\t\t$QuicktimeStoreAccountTypeLookup[0] = 'iTunes';\n\t\t\t$QuicktimeStoreAccountTypeLookup[1] = 'AOL';\n\t\t}\n\t\treturn (isset($QuicktimeStoreAccountTypeLookup[$akid]) ? $QuicktimeStoreAccountTypeLookup[$akid] : 'invalid');\n\t}\n\n\tpublic function QuicktimeStoreFrontCodeLookup($sfid) {\n\t\tstatic $QuicktimeStoreFrontCodeLookup = array();\n\t\tif (empty($QuicktimeStoreFrontCodeLookup)) {\n\t\t\t$QuicktimeStoreFrontCodeLookup[143460] = 'Australia';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143445] = 'Austria';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143446] = 'Belgium';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143455] = 'Canada';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143458] = 'Denmark';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143447] = 'Finland';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143442] = 'France';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143443] = 'Germany';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143448] = 'Greece';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143449] = 'Ireland';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143450] = 'Italy';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143462] = 'Japan';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143451] = 'Luxembourg';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143452] = 'Netherlands';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143461] = 'New Zealand';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143457] = 'Norway';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143453] = 'Portugal';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143454] = 'Spain';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143456] = 'Sweden';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143459] = 'Switzerland';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143444] = 'United Kingdom';\n\t\t\t$QuicktimeStoreFrontCodeLookup[143441] = 'United States';\n\t\t}\n\t\treturn (isset($QuicktimeStoreFrontCodeLookup[$sfid]) ? $QuicktimeStoreFrontCodeLookup[$sfid] : 'invalid');\n\t}\n\n\tpublic function QuicktimeParseNikonNCTG($atom_data) {\n\t\t// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG\n\t\t// Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100\n\t\t// Data is stored as records of:\n\t\t// * 4 bytes record type\n\t\t// * 2 bytes size of data field type:\n\t\t//     0x0001 = flag   (size field *= 1-byte)\n\t\t//     0x0002 = char   (size field *= 1-byte)\n\t\t//     0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB\n\t\t//     0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD\n\t\t//     0x0005 = float  (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together\n\t\t//     0x0007 = bytes  (size field *= 1-byte), values are stored as ??????\n\t\t//     0x0008 = ?????  (size field *= 2-byte), values are stored as ??????\n\t\t// * 2 bytes data size field\n\t\t// * ? bytes data (string data may be null-padded; datestamp fields are in the format \"2011:05:25 20:24:15\")\n\t\t// all integers are stored BigEndian\n\n\t\t$NCTGtagName = array(\n\t\t\t0x00000001 => 'Make',\n\t\t\t0x00000002 => 'Model',\n\t\t\t0x00000003 => 'Software',\n\t\t\t0x00000011 => 'CreateDate',\n\t\t\t0x00000012 => 'DateTimeOriginal',\n\t\t\t0x00000013 => 'FrameCount',\n\t\t\t0x00000016 => 'FrameRate',\n\t\t\t0x00000022 => 'FrameWidth',\n\t\t\t0x00000023 => 'FrameHeight',\n\t\t\t0x00000032 => 'AudioChannels',\n\t\t\t0x00000033 => 'AudioBitsPerSample',\n\t\t\t0x00000034 => 'AudioSampleRate',\n\t\t\t0x02000001 => 'MakerNoteVersion',\n\t\t\t0x02000005 => 'WhiteBalance',\n\t\t\t0x0200000b => 'WhiteBalanceFineTune',\n\t\t\t0x0200001e => 'ColorSpace',\n\t\t\t0x02000023 => 'PictureControlData',\n\t\t\t0x02000024 => 'WorldTime',\n\t\t\t0x02000032 => 'UnknownInfo',\n\t\t\t0x02000083 => 'LensType',\n\t\t\t0x02000084 => 'Lens',\n\t\t);\n\n\t\t$offset = 0;\n\t\t$datalength = strlen($atom_data);\n\t\t$parsed = array();\n\t\twhile ($offset < $datalength) {\n//echo getid3_lib::PrintHexBytes(substr($atom_data, $offset, 4)).'<br>';\n\t\t\t$record_type       = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4));  $offset += 4;\n\t\t\t$data_size_type    = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));  $offset += 2;\n\t\t\t$data_size         = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));  $offset += 2;\n\t\t\tswitch ($data_size_type) {\n\t\t\t\tcase 0x0001: // 0x0001 = flag   (size field *= 1-byte)\n\t\t\t\t\t$data = getid3_lib::BigEndian2Int(substr($atom_data, $offset, $data_size * 1));\n\t\t\t\t\t$offset += ($data_size * 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0002: // 0x0002 = char   (size field *= 1-byte)\n\t\t\t\t\t$data = substr($atom_data, $offset, $data_size * 1);\n\t\t\t\t\t$offset += ($data_size * 1);\n\t\t\t\t\t$data = rtrim($data, \"\\x00\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0003: // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB\n\t\t\t\t\t$data = '';\n\t\t\t\t\tfor ($i = $data_size - 1; $i >= 0; $i--) {\n\t\t\t\t\t\t$data .= substr($atom_data, $offset + ($i * 2), 2);\n\t\t\t\t\t}\n\t\t\t\t\t$data = getid3_lib::BigEndian2Int($data);\n\t\t\t\t\t$offset += ($data_size * 2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0004: // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD\n\t\t\t\t\t$data = '';\n\t\t\t\t\tfor ($i = $data_size - 1; $i >= 0; $i--) {\n\t\t\t\t\t\t$data .= substr($atom_data, $offset + ($i * 4), 4);\n\t\t\t\t\t}\n\t\t\t\t\t$data = getid3_lib::BigEndian2Int($data);\n\t\t\t\t\t$offset += ($data_size * 4);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0005: // 0x0005 = float  (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together\n\t\t\t\t\t$data = array();\n\t\t\t\t\tfor ($i = 0; $i < $data_size; $i++) {\n\t\t\t\t\t\t$numerator    = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 0, 4));\n\t\t\t\t\t\t$denomninator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 4, 4));\n\t\t\t\t\t\tif ($denomninator == 0) {\n\t\t\t\t\t\t\t$data[$i] = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$data[$i] = (double) $numerator / $denomninator;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$offset += (8 * $data_size);\n\t\t\t\t\tif (count($data) == 1) {\n\t\t\t\t\t\t$data = $data[0];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0007: // 0x0007 = bytes  (size field *= 1-byte), values are stored as ??????\n\t\t\t\t\t$data = substr($atom_data, $offset, $data_size * 1);\n\t\t\t\t\t$offset += ($data_size * 1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0008: // 0x0008 = ?????  (size field *= 2-byte), values are stored as ??????\n\t\t\t\t\t$data = substr($atom_data, $offset, $data_size * 2);\n\t\t\t\t\t$offset += ($data_size * 2);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\necho 'QuicktimeParseNikonNCTG()::unknown $data_size_type: '.$data_size_type.'<br>';\n\t\t\t\t\tbreak 2;\n\t\t\t}\n\n\t\t\tswitch ($record_type) {\n\t\t\t\tcase 0x00000011: // CreateDate\n\t\t\t\tcase 0x00000012: // DateTimeOriginal\n\t\t\t\t\t$data = strtotime($data);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0200001e: // ColorSpace\n\t\t\t\t\tswitch ($data) {\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t$data = 'sRGB';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t$data = 'Adobe RGB';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x02000023: // PictureControlData\n\t\t\t\t\t$PictureControlAdjust = array(0=>'default', 1=>'quick', 2=>'full');\n\t\t\t\t\t$FilterEffect = array(0x80=>'off', 0x81=>'yellow', 0x82=>'orange',    0x83=>'red', 0x84=>'green',  0xff=>'n/a');\n\t\t\t\t\t$ToningEffect = array(0x80=>'b&w', 0x81=>'sepia',  0x82=>'cyanotype', 0x83=>'red', 0x84=>'yellow', 0x85=>'green', 0x86=>'blue-green', 0x87=>'blue', 0x88=>'purple-blue', 0x89=>'red-purple', 0xff=>'n/a');\n\t\t\t\t\t$data = array(\n\t\t\t\t\t\t'PictureControlVersion'     =>                           substr($data,  0,  4),\n\t\t\t\t\t\t'PictureControlName'        =>                     rtrim(substr($data,  4, 20), \"\\x00\"),\n\t\t\t\t\t\t'PictureControlBase'        =>                     rtrim(substr($data, 24, 20), \"\\x00\"),\n\t\t\t\t\t\t//'?'                       =>                           substr($data, 44,  4),\n\t\t\t\t\t\t'PictureControlAdjust'      => $PictureControlAdjust[ord(substr($data, 48,  1))],\n\t\t\t\t\t\t'PictureControlQuickAdjust' =>                       ord(substr($data, 49,  1)),\n\t\t\t\t\t\t'Sharpness'                 =>                       ord(substr($data, 50,  1)),\n\t\t\t\t\t\t'Contrast'                  =>                       ord(substr($data, 51,  1)),\n\t\t\t\t\t\t'Brightness'                =>                       ord(substr($data, 52,  1)),\n\t\t\t\t\t\t'Saturation'                =>                       ord(substr($data, 53,  1)),\n\t\t\t\t\t\t'HueAdjustment'             =>                       ord(substr($data, 54,  1)),\n\t\t\t\t\t\t'FilterEffect'              =>         $FilterEffect[ord(substr($data, 55,  1))],\n\t\t\t\t\t\t'ToningEffect'              =>         $ToningEffect[ord(substr($data, 56,  1))],\n\t\t\t\t\t\t'ToningSaturation'          =>                       ord(substr($data, 57,  1)),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x02000024: // WorldTime\n\t\t\t\t\t// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#WorldTime\n\t\t\t\t\t// timezone is stored as offset from GMT in minutes\n\t\t\t\t\t$timezone = getid3_lib::BigEndian2Int(substr($data, 0, 2));\n\t\t\t\t\tif ($timezone & 0x8000) {\n\t\t\t\t\t\t$timezone = 0 - (0x10000 - $timezone);\n\t\t\t\t\t}\n\t\t\t\t\t$timezone /= 60;\n\n\t\t\t\t\t$dst = (bool) getid3_lib::BigEndian2Int(substr($data, 2, 1));\n\t\t\t\t\tswitch (getid3_lib::BigEndian2Int(substr($data, 3, 1))) {\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t$datedisplayformat = 'D/M/Y'; break;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t$datedisplayformat = 'M/D/Y'; break;\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t$datedisplayformat = 'Y/M/D'; break;\n\t\t\t\t\t}\n\n\t\t\t\t\t$data = array('timezone'=>floatval($timezone), 'dst'=>$dst, 'display'=>$datedisplayformat);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x02000083: // LensType\n\t\t\t\t\t$data = array(\n\t\t\t\t\t\t//'_'  => $data,\n\t\t\t\t\t\t'mf' => (bool) ($data & 0x01),\n\t\t\t\t\t\t'd'  => (bool) ($data & 0x02),\n\t\t\t\t\t\t'g'  => (bool) ($data & 0x04),\n\t\t\t\t\t\t'vr' => (bool) ($data & 0x08),\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$tag_name = (isset($NCTGtagName[$record_type]) ? $NCTGtagName[$record_type] : '0x'.str_pad(dechex($record_type), 8, '0', STR_PAD_LEFT));\n\t\t\t$parsed[$tag_name] = $data;\n\t\t}\n\t\treturn $parsed;\n\t}\n\n\n\tpublic function CopyToAppropriateCommentsSection($keyname, $data, $boxname='') {\n\t\tstatic $handyatomtranslatorarray = array();\n\t\tif (empty($handyatomtranslatorarray)) {\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'cpy'] = 'copyright';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'day'] = 'creation_date';    // iTunes 4.0\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'dir'] = 'director';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed1'] = 'edit1';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed2'] = 'edit2';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed3'] = 'edit3';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed4'] = 'edit4';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed5'] = 'edit5';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed6'] = 'edit6';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed7'] = 'edit7';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed8'] = 'edit8';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ed9'] = 'edit9';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'fmt'] = 'format';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'inf'] = 'information';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'prd'] = 'producer';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'prf'] = 'performers';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'req'] = 'system_requirements';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'src'] = 'source_credit';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'wrt'] = 'writer';\n\n\t\t\t// http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'nam'] = 'title';           // iTunes 4.0\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'cmt'] = 'comment';         // iTunes 4.0\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'wrn'] = 'warning';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'hst'] = 'host_computer';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'mak'] = 'make';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'mod'] = 'model';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'PRD'] = 'product';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'swr'] = 'software';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'aut'] = 'author';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ART'] = 'artist';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'trk'] = 'track';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'alb'] = 'album';           // iTunes 4.0\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'com'] = 'comment';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'gen'] = 'genre';           // iTunes 4.0\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'ope'] = 'composer';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'url'] = 'url';\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'enc'] = 'encoder';\n\n\t\t\t// http://atomicparsley.sourceforge.net/mpeg-4files.html\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'art'] = 'artist';           // iTunes 4.0\n\t\t\t$handyatomtranslatorarray['aART'] = 'album_artist';\n\t\t\t$handyatomtranslatorarray['trkn'] = 'track_number';     // iTunes 4.0\n\t\t\t$handyatomtranslatorarray['disk'] = 'disc_number';      // iTunes 4.0\n\t\t\t$handyatomtranslatorarray['gnre'] = 'genre';            // iTunes 4.0\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'too'] = 'encoder';          // iTunes 4.0\n\t\t\t$handyatomtranslatorarray['tmpo'] = 'bpm';              // iTunes 4.0\n\t\t\t$handyatomtranslatorarray['cprt'] = 'copyright';        // iTunes 4.0?\n\t\t\t$handyatomtranslatorarray['cpil'] = 'compilation';      // iTunes 4.0\n\t\t\t$handyatomtranslatorarray['covr'] = 'picture';          // iTunes 4.0\n\t\t\t$handyatomtranslatorarray['rtng'] = 'rating';           // iTunes 4.0\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'grp'] = 'grouping';         // iTunes 4.2\n\t\t\t$handyatomtranslatorarray['stik'] = 'stik';             // iTunes 4.9\n\t\t\t$handyatomtranslatorarray['pcst'] = 'podcast';          // iTunes 4.9\n\t\t\t$handyatomtranslatorarray['catg'] = 'category';         // iTunes 4.9\n\t\t\t$handyatomtranslatorarray['keyw'] = 'keyword';          // iTunes 4.9\n\t\t\t$handyatomtranslatorarray['purl'] = 'podcast_url';      // iTunes 4.9\n\t\t\t$handyatomtranslatorarray['egid'] = 'episode_guid';     // iTunes 4.9\n\t\t\t$handyatomtranslatorarray['desc'] = 'description';      // iTunes 5.0\n\t\t\t$handyatomtranslatorarray[\"\\xA9\".'lyr'] = 'lyrics';           // iTunes 5.0\n\t\t\t$handyatomtranslatorarray['tvnn'] = 'tv_network_name';  // iTunes 6.0\n\t\t\t$handyatomtranslatorarray['tvsh'] = 'tv_show_name';     // iTunes 6.0\n\t\t\t$handyatomtranslatorarray['tvsn'] = 'tv_season';        // iTunes 6.0\n\t\t\t$handyatomtranslatorarray['tves'] = 'tv_episode';       // iTunes 6.0\n\t\t\t$handyatomtranslatorarray['purd'] = 'purchase_date';    // iTunes 6.0.2\n\t\t\t$handyatomtranslatorarray['pgap'] = 'gapless_playback'; // iTunes 7.0\n\n\t\t\t// http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt\n\n\n\n\t\t\t// boxnames:\n\t\t\t/*\n\t\t\t$handyatomtranslatorarray['iTunSMPB']                    = 'iTunSMPB';\n\t\t\t$handyatomtranslatorarray['iTunNORM']                    = 'iTunNORM';\n\t\t\t$handyatomtranslatorarray['Encoding Params']             = 'Encoding Params';\n\t\t\t$handyatomtranslatorarray['replaygain_track_gain']       = 'replaygain_track_gain';\n\t\t\t$handyatomtranslatorarray['replaygain_track_peak']       = 'replaygain_track_peak';\n\t\t\t$handyatomtranslatorarray['replaygain_track_minmax']     = 'replaygain_track_minmax';\n\t\t\t$handyatomtranslatorarray['MusicIP PUID']                = 'MusicIP PUID';\n\t\t\t$handyatomtranslatorarray['MusicBrainz Artist Id']       = 'MusicBrainz Artist Id';\n\t\t\t$handyatomtranslatorarray['MusicBrainz Album Id']        = 'MusicBrainz Album Id';\n\t\t\t$handyatomtranslatorarray['MusicBrainz Album Artist Id'] = 'MusicBrainz Album Artist Id';\n\t\t\t$handyatomtranslatorarray['MusicBrainz Track Id']        = 'MusicBrainz Track Id';\n\t\t\t$handyatomtranslatorarray['MusicBrainz Disc Id']         = 'MusicBrainz Disc Id';\n\n\t\t\t// http://age.hobba.nl/audio/tag_frame_reference.html\n\t\t\t$handyatomtranslatorarray['PLAY_COUNTER']                = 'play_counter'; // Foobar2000 - http://www.getid3.org/phpBB3/viewtopic.php?t=1355\n\t\t\t$handyatomtranslatorarray['MEDIATYPE']                   = 'mediatype';    // Foobar2000 - http://www.getid3.org/phpBB3/viewtopic.php?t=1355\n\t\t\t*/\n\t\t}\n\t\t$info = &$this->getid3->info;\n\t\t$comment_key = '';\n\t\tif ($boxname && ($boxname != $keyname)) {\n\t\t\t$comment_key = (isset($handyatomtranslatorarray[$boxname]) ? $handyatomtranslatorarray[$boxname] : $boxname);\n\t\t} elseif (isset($handyatomtranslatorarray[$keyname])) {\n\t\t\t$comment_key = $handyatomtranslatorarray[$keyname];\n\t\t}\n\t\tif ($comment_key) {\n\t\t\tif ($comment_key == 'picture') {\n\t\t\t\tif (!is_array($data)) {\n\t\t\t\t\t$image_mime = '';\n\t\t\t\t\tif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $data)) {\n\t\t\t\t\t\t$image_mime = 'image/png';\n\t\t\t\t\t} elseif (preg_match('#^\\xFF\\xD8\\xFF#', $data)) {\n\t\t\t\t\t\t$image_mime = 'image/jpeg';\n\t\t\t\t\t} elseif (preg_match('#^GIF#', $data)) {\n\t\t\t\t\t\t$image_mime = 'image/gif';\n\t\t\t\t\t} elseif (preg_match('#^BM#', $data)) {\n\t\t\t\t\t\t$image_mime = 'image/bmp';\n\t\t\t\t\t}\n\t\t\t\t\t$data = array('data'=>$data, 'image_mime'=>$image_mime);\n\t\t\t\t}\n\t\t\t}\n\t\t\t$info['quicktime']['comments'][$comment_key][] = $data;\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic function NoNullString($nullterminatedstring) {\n\t\t// remove the single null terminator on null terminated strings\n\t\tif (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === \"\\x00\") {\n\t\t\treturn substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1);\n\t\t}\n\t\treturn $nullterminatedstring;\n\t}\n\n\tpublic function Pascal2String($pascalstring) {\n\t\t// Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string\n\t\treturn substr($pascalstring, 1);\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio-video.riff.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio-video.riff.php                                 //\n// module for analyzing RIFF files                             //\n// multiple formats supported by this module:                  //\n//    Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX   //\n// dependencies: module.audio.mp3.php                          //\n//               module.audio.ac3.php                          //\n//               module.audio.dts.php                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n/**\n* @todo Parse AC-3/DTS audio inside WAVE correctly\n* @todo Rewrite RIFF parser totally\n*/\n\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, true);\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.dts.php', __FILE__, true);\n\nclass getid3_riff extends getid3_handler {\n\n\tprotected $container = 'riff'; // default\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t// initialize these values to an empty array, otherwise they default to NULL\n\t\t// and you can't append array values to a NULL value\n\t\t$info['riff'] = array('raw'=>array());\n\n\t\t// Shortcuts\n\t\t$thisfile_riff             = &$info['riff'];\n\t\t$thisfile_riff_raw         = &$thisfile_riff['raw'];\n\t\t$thisfile_audio            = &$info['audio'];\n\t\t$thisfile_video            = &$info['video'];\n\t\t$thisfile_audio_dataformat = &$thisfile_audio['dataformat'];\n\t\t$thisfile_riff_audio       = &$thisfile_riff['audio'];\n\t\t$thisfile_riff_video       = &$thisfile_riff['video'];\n\n\t\t$Original['avdataoffset'] = $info['avdataoffset'];\n\t\t$Original['avdataend']    = $info['avdataend'];\n\n\t\t$this->fseek($info['avdataoffset']);\n\t\t$RIFFheader = $this->fread(12);\n\t\t$offset = $this->ftell();\n\t\t$RIFFtype    = substr($RIFFheader, 0, 4);\n\t\t$RIFFsize    = substr($RIFFheader, 4, 4);\n\t\t$RIFFsubtype = substr($RIFFheader, 8, 4);\n\n\t\tswitch ($RIFFtype) {\n\n\t\t\tcase 'FORM':  // AIFF, AIFC\n\t\t\t\t//$info['fileformat']   = 'aiff';\n\t\t\t\t$this->container = 'aiff';\n\t\t\t\t$thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize);\n\t\t\t\t$thisfile_riff[$RIFFsubtype]  = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4));\n\t\t\t\tbreak;\n\n\t\t\tcase 'RIFF':  // AVI, WAV, etc\n\t\t\tcase 'SDSS':  // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com)\n\t\t\tcase 'RMP3':  // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s\n\t\t\t\t//$info['fileformat']   = 'riff';\n\t\t\t\t$this->container = 'riff';\n\t\t\t\t$thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize);\n\t\t\t\tif ($RIFFsubtype == 'RMP3') {\n\t\t\t\t\t// RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s\n\t\t\t\t\t$RIFFsubtype = 'WAVE';\n\t\t\t\t}\n\t\t\t\tif ($RIFFsubtype != 'AMV ') {\n\t\t\t\t\t// AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size\n\t\t\t\t\t// Handled separately in ParseRIFFAMV()\n\t\t\t\t\t$thisfile_riff[$RIFFsubtype]  = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4));\n\t\t\t\t}\n\t\t\t\tif (($info['avdataend'] - $info['filesize']) == 1) {\n\t\t\t\t\t// LiteWave appears to incorrectly *not* pad actual output file\n\t\t\t\t\t// to nearest WORD boundary so may appear to be short by one\n\t\t\t\t\t// byte, in which case - skip warning\n\t\t\t\t\t$info['avdataend'] = $info['filesize'];\n\t\t\t\t}\n\n\t\t\t\t$nextRIFFoffset = $Original['avdataoffset'] + 8 + $thisfile_riff['header_size']; // 8 = \"RIFF\" + 32-bit offset\n\t\t\t\twhile ($nextRIFFoffset < min($info['filesize'], $info['avdataend'])) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t$this->fseek($nextRIFFoffset);\n\t\t\t\t\t} catch (getid3_exception $e) {\n\t\t\t\t\t\tif ($e->getCode() == 10) {\n\t\t\t\t\t\t\t//$this->warning('RIFF parser: '.$e->getMessage());\n\t\t\t\t\t\t\t$this->error('AVI extends beyond '.round(PHP_INT_MAX / 1073741824).'GB and PHP filesystem functions cannot read that far, playtime may be wrong');\n\t\t\t\t\t\t\t$this->warning('[avdataend] value may be incorrect, multiple AVIX chunks may be present');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow $e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$nextRIFFheader = $this->fread(12);\n\t\t\t\t\tif ($nextRIFFoffset == ($info['avdataend'] - 1)) {\n\t\t\t\t\t\tif (substr($nextRIFFheader, 0, 1) == \"\\x00\") {\n\t\t\t\t\t\t\t// RIFF padded to WORD boundary, we're actually already at the end\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$nextRIFFheaderID =                         substr($nextRIFFheader, 0, 4);\n\t\t\t\t\t$nextRIFFsize     = $this->EitherEndian2Int(substr($nextRIFFheader, 4, 4));\n\t\t\t\t\t$nextRIFFtype     =                         substr($nextRIFFheader, 8, 4);\n\t\t\t\t\t$chunkdata = array();\n\t\t\t\t\t$chunkdata['offset'] = $nextRIFFoffset + 8;\n\t\t\t\t\t$chunkdata['size']   = $nextRIFFsize;\n\t\t\t\t\t$nextRIFFoffset = $chunkdata['offset'] + $chunkdata['size'];\n\n\t\t\t\t\tswitch ($nextRIFFheaderID) {\n\t\t\t\t\t\tcase 'RIFF':\n\t\t\t\t\t\t\t$chunkdata['chunks'] = $this->ParseRIFF($chunkdata['offset'] + 4, $nextRIFFoffset);\n\t\t\t\t\t\t\tif (!isset($thisfile_riff[$nextRIFFtype])) {\n\t\t\t\t\t\t\t\t$thisfile_riff[$nextRIFFtype] = array();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$thisfile_riff[$nextRIFFtype][] = $chunkdata;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'AMV ':\n\t\t\t\t\t\t\tunset($info['riff']);\n\t\t\t\t\t\t\t$info['amv'] = $this->ParseRIFFAMV($chunkdata['offset'] + 4, $nextRIFFoffset);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'JUNK':\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t\t$thisfile_riff[$nextRIFFheaderID][] = $chunkdata;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'IDVX':\n\t\t\t\t\t\t\t$info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunkdata['size']));\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif ($info['filesize'] == ($chunkdata['offset'] - 8 + 128)) {\n\t\t\t\t\t\t\t\t$DIVXTAG = $nextRIFFheader.$this->fread(128 - 12);\n\t\t\t\t\t\t\t\tif (substr($DIVXTAG, -7) == 'DIVXTAG') {\n\t\t\t\t\t\t\t\t\t// DIVXTAG is supposed to be inside an IDVX chunk in a LIST chunk, but some bad encoders just slap it on the end of a file\n\t\t\t\t\t\t\t\t\t$this->warning('Found wrongly-structured DIVXTAG at offset '.($this->ftell() - 128).', parsing anyway');\n\t\t\t\t\t\t\t\t\t$info['divxtag']['comments'] = self::ParseDIVXTAG($DIVXTAG);\n\t\t\t\t\t\t\t\t\tbreak 2;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$this->warning('Expecting \"RIFF|JUNK|IDVX\" at '.$nextRIFFoffset.', found \"'.$nextRIFFheaderID.'\" ('.getid3_lib::PrintHexBytes($nextRIFFheaderID).') - skipping rest of file');\n\t\t\t\t\t\t\tbreak 2;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\tif ($RIFFsubtype == 'WAVE') {\n\t\t\t\t\t$thisfile_riff_WAVE = &$thisfile_riff['WAVE'];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$this->error('Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting \"FORM|RIFF|SDSS|RMP3\" found \"'.$RIFFsubtype.'\" instead');\n\t\t\t\t//unset($info['fileformat']);\n\t\t\t\treturn false;\n\t\t}\n\n\t\t$streamindex = 0;\n\t\tswitch ($RIFFsubtype) {\n\n\t\t\t// http://en.wikipedia.org/wiki/Wav\n\t\t\tcase 'WAVE':\n\t\t\t\t$info['fileformat'] = 'wav';\n\n\t\t\t\tif (empty($thisfile_audio['bitrate_mode'])) {\n\t\t\t\t\t$thisfile_audio['bitrate_mode'] = 'cbr';\n\t\t\t\t}\n\t\t\t\tif (empty($thisfile_audio_dataformat)) {\n\t\t\t\t\t$thisfile_audio_dataformat = 'wav';\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_WAVE['data'][0]['offset'])) {\n\t\t\t\t\t$info['avdataoffset'] = $thisfile_riff_WAVE['data'][0]['offset'] + 8;\n\t\t\t\t\t$info['avdataend']    = $info['avdataoffset'] + $thisfile_riff_WAVE['data'][0]['size'];\n\t\t\t\t}\n\t\t\t\tif (isset($thisfile_riff_WAVE['fmt '][0]['data'])) {\n\n\t\t\t\t\t$thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']);\n\t\t\t\t\t$thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag'];\n\t\t\t\t\tif (!isset($thisfile_riff_audio[$streamindex]['bitrate']) || ($thisfile_riff_audio[$streamindex]['bitrate'] == 0)) {\n\t\t\t\t\t\t$info['error'][] = 'Corrupt RIFF file: bitrate_audio == zero';\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw'];\n\t\t\t\t\tunset($thisfile_riff_audio[$streamindex]['raw']);\n\t\t\t\t\t$thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex];\n\n\t\t\t\t\t$thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]);\n\t\t\t\t\tif (substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') {\n\t\t\t\t\t\t$info['warning'][] = 'Audio codec = '.$thisfile_audio['codec'];\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];\n\n\t\t\t\t\tif (empty($info['playtime_seconds'])) { // may already be set (e.g. DTS-WAV)\n\t\t\t\t\t\t$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']);\n\t\t\t\t\t}\n\n\t\t\t\t\t$thisfile_audio['lossless'] = false;\n\t\t\t\t\tif (isset($thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) {\n\t\t\t\t\t\tswitch ($thisfile_riff_raw['fmt ']['wFormatTag']) {\n\n\t\t\t\t\t\t\tcase 0x0001:  // PCM\n\t\t\t\t\t\t\t\t$thisfile_audio['lossless'] = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 0x2000:  // AC-3\n\t\t\t\t\t\t\t\t$thisfile_audio_dataformat = 'ac3';\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t// do nothing\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_audio['streams'][$streamindex]['wformattag']   = $thisfile_audio['wformattag'];\n\t\t\t\t\t$thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode'];\n\t\t\t\t\t$thisfile_audio['streams'][$streamindex]['lossless']     = $thisfile_audio['lossless'];\n\t\t\t\t\t$thisfile_audio['streams'][$streamindex]['dataformat']   = $thisfile_audio_dataformat;\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_WAVE['rgad'][0]['data'])) {\n\n\t\t\t\t\t// shortcuts\n\t\t\t\t\t$rgadData = &$thisfile_riff_WAVE['rgad'][0]['data'];\n\t\t\t\t\t$thisfile_riff_raw['rgad']    = array('track'=>array(), 'album'=>array());\n\t\t\t\t\t$thisfile_riff_raw_rgad       = &$thisfile_riff_raw['rgad'];\n\t\t\t\t\t$thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track'];\n\t\t\t\t\t$thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album'];\n\n\t\t\t\t\t$thisfile_riff_raw_rgad['fPeakAmplitude']      = getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4));\n\t\t\t\t\t$thisfile_riff_raw_rgad['nRadioRgAdjust']      =        $this->EitherEndian2Int(substr($rgadData, 4, 2));\n\t\t\t\t\t$thisfile_riff_raw_rgad['nAudiophileRgAdjust'] =        $this->EitherEndian2Int(substr($rgadData, 6, 2));\n\n\t\t\t\t\t$nRadioRgAdjustBitstring      = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT);\n\t\t\t\t\t$nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT);\n\t\t\t\t\t$thisfile_riff_raw_rgad_track['name']       = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3));\n\t\t\t\t\t$thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3));\n\t\t\t\t\t$thisfile_riff_raw_rgad_track['signbit']    = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1));\n\t\t\t\t\t$thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9));\n\t\t\t\t\t$thisfile_riff_raw_rgad_album['name']       = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3));\n\t\t\t\t\t$thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3));\n\t\t\t\t\t$thisfile_riff_raw_rgad_album['signbit']    = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1));\n\t\t\t\t\t$thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9));\n\n\t\t\t\t\t$thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude'];\n\t\t\t\t\tif (($thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) {\n\t\t\t\t\t\t$thisfile_riff['rgad']['track']['name']            = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']);\n\t\t\t\t\t\t$thisfile_riff['rgad']['track']['originator']      = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']);\n\t\t\t\t\t\t$thisfile_riff['rgad']['track']['adjustment']      = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']);\n\t\t\t\t\t}\n\t\t\t\t\tif (($thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) {\n\t\t\t\t\t\t$thisfile_riff['rgad']['album']['name']       = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']);\n\t\t\t\t\t\t$thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']);\n\t\t\t\t\t\t$thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_WAVE['fact'][0]['data'])) {\n\t\t\t\t\t$thisfile_riff_raw['fact']['NumberOfSamples'] = $this->EitherEndian2Int(substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4));\n\n\t\t\t\t\t// This should be a good way of calculating exact playtime,\n\t\t\t\t\t// but some sample files have had incorrect number of samples,\n\t\t\t\t\t// so cannot use this method\n\n\t\t\t\t\t// if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) {\n\t\t\t\t\t//     $info['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec'];\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t\tif (!empty($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) {\n\t\t\t\t\t$thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8);\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_WAVE['bext'][0]['data'])) {\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0];\n\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['title']          =                         trim(substr($thisfile_riff_WAVE_bext_0['data'],   0, 256));\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['author']         =                         trim(substr($thisfile_riff_WAVE_bext_0['data'], 256,  32));\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['reference']      =                         trim(substr($thisfile_riff_WAVE_bext_0['data'], 288,  32));\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['origin_date']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 320,  10);\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['origin_time']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 330,   8);\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338,   8));\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['bwf_version']    = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346,   1));\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['reserved']       =                              substr($thisfile_riff_WAVE_bext_0['data'], 347, 254);\n\t\t\t\t\t$thisfile_riff_WAVE_bext_0['coding_history'] =         explode(\"\\r\\n\", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601)));\n\t\t\t\t\tif (preg_match('#^([0-9]{4}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_date'], $matches_bext_date)) {\n\t\t\t\t\t\tif (preg_match('#^([0-9]{2}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_time'], $matches_bext_time)) {\n\t\t\t\t\t\t\tlist($dummy, $bext_timestamp['year'], $bext_timestamp['month'],  $bext_timestamp['day'])    = $matches_bext_date;\n\t\t\t\t\t\t\tlist($dummy, $bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second']) = $matches_bext_time;\n\t\t\t\t\t\t\t$thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime($bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second'], $bext_timestamp['month'], $bext_timestamp['day'], $bext_timestamp['year']);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$info['warning'][] = 'RIFF.WAVE.BEXT.origin_time is invalid';\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'RIFF.WAVE.BEXT.origin_date is invalid';\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author'];\n\t\t\t\t\t$thisfile_riff['comments']['title'][]  = $thisfile_riff_WAVE_bext_0['title'];\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_WAVE['MEXT'][0]['data'])) {\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0];\n\n\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['raw']['sound_information']      = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2));\n\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['flags']['homogenous']           = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001);\n\t\t\t\t\tif ($thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) {\n\t\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['flags']['padding']          = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true;\n\t\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['flags']['22_or_44']         =        (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004);\n\t\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['flags']['free_format']      =        (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008);\n\n\t\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['nominal_frame_size']        = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2));\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['anciliary_data_length']         = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2));\n\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def']     = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2));\n\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left']  = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001);\n\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free']  = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002);\n\t\t\t\t\t$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004);\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_WAVE['cart'][0]['data'])) {\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0];\n\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['version']              =                              substr($thisfile_riff_WAVE_cart_0['data'],   0,  4);\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['title']                =                         trim(substr($thisfile_riff_WAVE_cart_0['data'],   4, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['artist']               =                         trim(substr($thisfile_riff_WAVE_cart_0['data'],  68, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['cut_id']               =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 132, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['client_id']            =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 196, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['category']             =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 260, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['classification']       =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 324, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['out_cue']              =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 388, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['start_date']           =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 452, 10));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['start_time']           =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 462,  8));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['end_date']             =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 470, 10));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['end_time']             =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 480,  8));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['producer_app_id']      =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 488, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['producer_app_version'] =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 552, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['user_defined_text']    =                         trim(substr($thisfile_riff_WAVE_cart_0['data'], 616, 64));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['zero_db_reference']    = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 680,  4), true);\n\t\t\t\t\tfor ($i = 0; $i < 8; $i++) {\n\t\t\t\t\t\t$thisfile_riff_WAVE_cart_0['post_time'][$i]['usage_fourcc'] =                  substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8), 4);\n\t\t\t\t\t\t$thisfile_riff_WAVE_cart_0['post_time'][$i]['timer_value']  = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8) + 4, 4));\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['url']              =                 trim(substr($thisfile_riff_WAVE_cart_0['data'],  748, 1024));\n\t\t\t\t\t$thisfile_riff_WAVE_cart_0['tag_text']         = explode(\"\\r\\n\", trim(substr($thisfile_riff_WAVE_cart_0['data'], 1772)));\n\n\t\t\t\t\t$thisfile_riff['comments']['artist'][] = $thisfile_riff_WAVE_cart_0['artist'];\n\t\t\t\t\t$thisfile_riff['comments']['title'][]  = $thisfile_riff_WAVE_cart_0['title'];\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_WAVE['SNDM'][0]['data'])) {\n\t\t\t\t\t// SoundMiner metadata\n\n\t\t\t\t\t// shortcuts\n\t\t\t\t\t$thisfile_riff_WAVE_SNDM_0      = &$thisfile_riff_WAVE['SNDM'][0];\n\t\t\t\t\t$thisfile_riff_WAVE_SNDM_0_data = &$thisfile_riff_WAVE_SNDM_0['data'];\n\t\t\t\t\t$SNDM_startoffset = 0;\n\t\t\t\t\t$SNDM_endoffset   = $thisfile_riff_WAVE_SNDM_0['size'];\n\n\t\t\t\t\twhile ($SNDM_startoffset < $SNDM_endoffset) {\n\t\t\t\t\t\t$SNDM_thisTagOffset = 0;\n\t\t\t\t\t\t$SNDM_thisTagSize      = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4));\n\t\t\t\t\t\t$SNDM_thisTagOffset += 4;\n\t\t\t\t\t\t$SNDM_thisTagKey       =                           substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4);\n\t\t\t\t\t\t$SNDM_thisTagOffset += 4;\n\t\t\t\t\t\t$SNDM_thisTagDataSize  = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2));\n\t\t\t\t\t\t$SNDM_thisTagOffset += 2;\n\t\t\t\t\t\t$SNDM_thisTagDataFlags = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2));\n\t\t\t\t\t\t$SNDM_thisTagOffset += 2;\n\t\t\t\t\t\t$SNDM_thisTagDataText =                            substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, $SNDM_thisTagDataSize);\n\t\t\t\t\t\t$SNDM_thisTagOffset += $SNDM_thisTagDataSize;\n\n\t\t\t\t\t\tif ($SNDM_thisTagSize != (4 + 4 + 2 + 2 + $SNDM_thisTagDataSize)) {\n\t\t\t\t\t\t\t$info['warning'][] = 'RIFF.WAVE.SNDM.data contains tag not expected length (expected: '.$SNDM_thisTagSize.', found: '.(4 + 4 + 2 + 2 + $SNDM_thisTagDataSize).') at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} elseif ($SNDM_thisTagSize <= 0) {\n\t\t\t\t\t\t\t$info['warning'][] = 'RIFF.WAVE.SNDM.data contains zero-size tag at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$SNDM_startoffset += $SNDM_thisTagSize;\n\n\t\t\t\t\t\t$thisfile_riff_WAVE_SNDM_0['parsed_raw'][$SNDM_thisTagKey] = $SNDM_thisTagDataText;\n\t\t\t\t\t\tif ($parsedkey = self::waveSNDMtagLookup($SNDM_thisTagKey)) {\n\t\t\t\t\t\t\t$thisfile_riff_WAVE_SNDM_0['parsed'][$parsedkey] = $SNDM_thisTagDataText;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$info['warning'][] = 'RIFF.WAVE.SNDM contains unknown tag \"'.$SNDM_thisTagKey.'\" at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$tagmapping = array(\n\t\t\t\t\t\t'tracktitle'=>'title',\n\t\t\t\t\t\t'category'  =>'genre',\n\t\t\t\t\t\t'cdtitle'   =>'album',\n\t\t\t\t\t\t'tracktitle'=>'title',\n\t\t\t\t\t);\n\t\t\t\t\tforeach ($tagmapping as $fromkey => $tokey) {\n\t\t\t\t\t\tif (isset($thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey])) {\n\t\t\t\t\t\t\t$thisfile_riff['comments'][$tokey][] = $thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_WAVE['iXML'][0]['data'])) {\n\t\t\t\t\t// requires functions simplexml_load_string and get_object_vars\n\t\t\t\t\tif ($parsedXML = getid3_lib::XML2array($thisfile_riff_WAVE['iXML'][0]['data'])) {\n\t\t\t\t\t\t$thisfile_riff_WAVE['iXML'][0]['parsed'] = $parsedXML;\n\t\t\t\t\t\tif (isset($parsedXML['SPEED']['MASTER_SPEED'])) {\n\t\t\t\t\t\t\t@list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['MASTER_SPEED']);\n\t\t\t\t\t\t\t$thisfile_riff_WAVE['iXML'][0]['master_speed'] = $numerator / ($denominator ? $denominator : 1000);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($parsedXML['SPEED']['TIMECODE_RATE'])) {\n\t\t\t\t\t\t\t@list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['TIMECODE_RATE']);\n\t\t\t\t\t\t\t$thisfile_riff_WAVE['iXML'][0]['timecode_rate'] = $numerator / ($denominator ? $denominator : 1000);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO']) && !empty($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) && !empty($thisfile_riff_WAVE['iXML'][0]['timecode_rate'])) {\n\t\t\t\t\t\t\t$samples_since_midnight = floatval(ltrim($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_HI'].$parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO'], '0'));\n\t\t\t\t\t\t\t$thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] = $samples_since_midnight / $parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE'];\n\t\t\t\t\t\t\t$h = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds']       / 3600);\n\t\t\t\t\t\t\t$m = floor(($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600))      / 60);\n\t\t\t\t\t\t\t$s = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60));\n\t\t\t\t\t\t\t$f =       ($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60) - $s) * $thisfile_riff_WAVE['iXML'][0]['timecode_rate'];\n\t\t\t\t\t\t\t$thisfile_riff_WAVE['iXML'][0]['timecode_string']       = sprintf('%02d:%02d:%02d:%05.2f', $h, $m, $s,       $f);\n\t\t\t\t\t\t\t$thisfile_riff_WAVE['iXML'][0]['timecode_string_round'] = sprintf('%02d:%02d:%02d:%02d',   $h, $m, $s, round($f));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tunset($parsedXML);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\n\t\t\t\tif (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) {\n\t\t\t\t\t$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];\n\t\t\t\t\t$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']);\n\t\t\t\t}\n\n\t\t\t\tif (!empty($info['wavpack'])) {\n\t\t\t\t\t$thisfile_audio_dataformat = 'wavpack';\n\t\t\t\t\t$thisfile_audio['bitrate_mode'] = 'vbr';\n\t\t\t\t\t$thisfile_audio['encoder']      = 'WavPack v'.$info['wavpack']['version'];\n\n\t\t\t\t\t// Reset to the way it was - RIFF parsing will have messed this up\n\t\t\t\t\t$info['avdataend']        = $Original['avdataend'];\n\t\t\t\t\t$thisfile_audio['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];\n\n\t\t\t\t\t$this->fseek($info['avdataoffset'] - 44);\n\t\t\t\t\t$RIFFdata = $this->fread(44);\n\t\t\t\t\t$OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata,  4, 4)) +  8;\n\t\t\t\t\t$OrignalRIFFdataSize   = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44;\n\n\t\t\t\t\tif ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) {\n\t\t\t\t\t\t$info['avdataend'] -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize);\n\t\t\t\t\t\t$this->fseek($info['avdataend']);\n\t\t\t\t\t\t$RIFFdata .= $this->fread($OrignalRIFFheaderSize - $OrignalRIFFdataSize);\n\t\t\t\t\t}\n\n\t\t\t\t\t// move the data chunk after all other chunks (if any)\n\t\t\t\t\t// so that the RIFF parser doesn't see EOF when trying\n\t\t\t\t\t// to skip over the data chunk\n\t\t\t\t\t$RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8);\n\t\t\t\t\t$getid3_riff = new getid3_riff($this->getid3);\n\t\t\t\t\t$getid3_riff->ParseRIFFdata($RIFFdata);\n\t\t\t\t\tunset($getid3_riff);\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff_raw['fmt ']['wFormatTag'])) {\n\t\t\t\t\tswitch ($thisfile_riff_raw['fmt ']['wFormatTag']) {\n\t\t\t\t\t\tcase 0x0001: // PCM\n\t\t\t\t\t\t\tif (!empty($info['ac3'])) {\n\t\t\t\t\t\t\t\t// Dolby Digital WAV files masquerade as PCM-WAV, but they're not\n\t\t\t\t\t\t\t\t$thisfile_audio['wformattag']  = 0x2000;\n\t\t\t\t\t\t\t\t$thisfile_audio['codec']       = self::wFormatTagLookup($thisfile_audio['wformattag']);\n\t\t\t\t\t\t\t\t$thisfile_audio['lossless']    = false;\n\t\t\t\t\t\t\t\t$thisfile_audio['bitrate']     = $info['ac3']['bitrate'];\n\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = $info['ac3']['sample_rate'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!empty($info['dts'])) {\n\t\t\t\t\t\t\t\t// Dolby DTS files masquerade as PCM-WAV, but they're not\n\t\t\t\t\t\t\t\t$thisfile_audio['wformattag']  = 0x2001;\n\t\t\t\t\t\t\t\t$thisfile_audio['codec']       = self::wFormatTagLookup($thisfile_audio['wformattag']);\n\t\t\t\t\t\t\t\t$thisfile_audio['lossless']    = false;\n\t\t\t\t\t\t\t\t$thisfile_audio['bitrate']     = $info['dts']['bitrate'];\n\t\t\t\t\t\t\t\t$thisfile_audio['sample_rate'] = $info['dts']['sample_rate'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0x08AE: // ClearJump LiteWave\n\t\t\t\t\t\t\t$thisfile_audio['bitrate_mode'] = 'vbr';\n\t\t\t\t\t\t\t$thisfile_audio_dataformat   = 'litewave';\n\n\t\t\t\t\t\t\t//typedef struct tagSLwFormat {\n\t\t\t\t\t\t\t//  WORD    m_wCompFormat;     // low byte defines compression method, high byte is compression flags\n\t\t\t\t\t\t\t//  DWORD   m_dwScale;         // scale factor for lossy compression\n\t\t\t\t\t\t\t//  DWORD   m_dwBlockSize;     // number of samples in encoded blocks\n\t\t\t\t\t\t\t//  WORD    m_wQuality;        // alias for the scale factor\n\t\t\t\t\t\t\t//  WORD    m_wMarkDistance;   // distance between marks in bytes\n\t\t\t\t\t\t\t//  WORD    m_wReserved;\n\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t//  //following paramters are ignored if CF_FILESRC is not set\n\t\t\t\t\t\t\t//  DWORD   m_dwOrgSize;       // original file size in bytes\n\t\t\t\t\t\t\t//  WORD    m_bFactExists;     // indicates if 'fact' chunk exists in the original file\n\t\t\t\t\t\t\t//  DWORD   m_dwRiffChunkSize; // riff chunk size in the original file\n\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t//  PCMWAVEFORMAT m_OrgWf;     // original wave format\n\t\t\t\t\t\t\t// }SLwFormat, *PSLwFormat;\n\n\t\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t\t$thisfile_riff['litewave']['raw'] = array();\n\t\t\t\t\t\t\t$riff_litewave     = &$thisfile_riff['litewave'];\n\t\t\t\t\t\t\t$riff_litewave_raw = &$riff_litewave['raw'];\n\n\t\t\t\t\t\t\t$flags = array(\n\t\t\t\t\t\t\t\t'compression_method' => 1,\n\t\t\t\t\t\t\t\t'compression_flags'  => 1,\n\t\t\t\t\t\t\t\t'm_dwScale'          => 4,\n\t\t\t\t\t\t\t\t'm_dwBlockSize'      => 4,\n\t\t\t\t\t\t\t\t'm_wQuality'         => 2,\n\t\t\t\t\t\t\t\t'm_wMarkDistance'    => 2,\n\t\t\t\t\t\t\t\t'm_wReserved'        => 2,\n\t\t\t\t\t\t\t\t'm_dwOrgSize'        => 4,\n\t\t\t\t\t\t\t\t'm_bFactExists'      => 2,\n\t\t\t\t\t\t\t\t'm_dwRiffChunkSize'  => 4,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t$litewave_offset = 18;\n\t\t\t\t\t\t\tforeach ($flags as $flag => $length) {\n\t\t\t\t\t\t\t\t$riff_litewave_raw[$flag] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], $litewave_offset, $length));\n\t\t\t\t\t\t\t\t$litewave_offset += $length;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//$riff_litewave['quality_factor'] = intval(round((2000 - $riff_litewave_raw['m_dwScale']) / 20));\n\t\t\t\t\t\t\t$riff_litewave['quality_factor'] = $riff_litewave_raw['m_wQuality'];\n\n\t\t\t\t\t\t\t$riff_litewave['flags']['raw_source']    = ($riff_litewave_raw['compression_flags'] & 0x01) ? false : true;\n\t\t\t\t\t\t\t$riff_litewave['flags']['vbr_blocksize'] = ($riff_litewave_raw['compression_flags'] & 0x02) ? false : true;\n\t\t\t\t\t\t\t$riff_litewave['flags']['seekpoints']    =        (bool) ($riff_litewave_raw['compression_flags'] & 0x04);\n\n\t\t\t\t\t\t\t$thisfile_audio['lossless']        = (($riff_litewave_raw['m_wQuality'] == 100) ? true : false);\n\t\t\t\t\t\t\t$thisfile_audio['encoder_options'] = '-q'.$riff_litewave['quality_factor'];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($info['avdataend'] > $info['filesize']) {\n\t\t\t\t\tswitch (!empty($thisfile_audio_dataformat) ? $thisfile_audio_dataformat : '') {\n\t\t\t\t\t\tcase 'wavpack': // WavPack\n\t\t\t\t\t\tcase 'lpac':    // LPAC\n\t\t\t\t\t\tcase 'ofr':     // OptimFROG\n\t\t\t\t\t\tcase 'ofs':     // OptimFROG DualStream\n\t\t\t\t\t\t\t// lossless compressed audio formats that keep original RIFF headers - skip warning\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'litewave':\n\t\t\t\t\t\t\tif (($info['avdataend'] - $info['filesize']) == 1) {\n\t\t\t\t\t\t\t\t// LiteWave appears to incorrectly *not* pad actual output file\n\t\t\t\t\t\t\t\t// to nearest WORD boundary so may appear to be short by one\n\t\t\t\t\t\t\t\t// byte, in which case - skip warning\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Short by more than one byte, throw warning\n\t\t\t\t\t\t\t\t$info['warning'][] = 'Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)';\n\t\t\t\t\t\t\t\t$info['avdataend'] = $info['filesize'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif ((($info['avdataend'] - $info['filesize']) == 1) && (($thisfile_riff[$RIFFsubtype]['data'][0]['size'] % 2) == 0) && ((($info['filesize'] - $info['avdataoffset']) % 2) == 1)) {\n\t\t\t\t\t\t\t\t// output file appears to be incorrectly *not* padded to nearest WORD boundary\n\t\t\t\t\t\t\t\t// Output less severe warning\n\t\t\t\t\t\t\t\t$info['warning'][] = 'File should probably be padded to nearest WORD boundary, but it is not (expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' therefore short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)';\n\t\t\t\t\t\t\t\t$info['avdataend'] = $info['filesize'];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Short by more than one byte, throw warning\n\t\t\t\t\t\t\t\t$info['warning'][] = 'Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)';\n\t\t\t\t\t\t\t\t$info['avdataend'] = $info['filesize'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!empty($info['mpeg']['audio']['LAME']['audio_bytes'])) {\n\t\t\t\t\tif ((($info['avdataend'] - $info['avdataoffset']) - $info['mpeg']['audio']['LAME']['audio_bytes']) == 1) {\n\t\t\t\t\t\t$info['avdataend']--;\n\t\t\t\t\t\t$info['warning'][] = 'Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isset($thisfile_audio_dataformat) && ($thisfile_audio_dataformat == 'ac3')) {\n\t\t\t\t\tunset($thisfile_audio['bits_per_sample']);\n\t\t\t\t\tif (!empty($info['ac3']['bitrate']) && ($info['ac3']['bitrate'] != $thisfile_audio['bitrate'])) {\n\t\t\t\t\t\t$thisfile_audio['bitrate'] = $info['ac3']['bitrate'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t// http://en.wikipedia.org/wiki/Audio_Video_Interleave\n\t\t\tcase 'AVI ':\n\t\t\t\t$info['fileformat'] = 'avi';\n\t\t\t\t$info['mime_type']  = 'video/avi';\n\n\t\t\t\t$thisfile_video['bitrate_mode'] = 'vbr'; // maybe not, but probably\n\t\t\t\t$thisfile_video['dataformat']   = 'avi';\n\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['movi']['offset'])) {\n\t\t\t\t\t$info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['movi']['offset'] + 8;\n\t\t\t\t\tif (isset($thisfile_riff['AVIX'])) {\n\t\t\t\t\t\t$info['avdataend'] = $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['offset'] + $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['size'];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['avdataend'] = $thisfile_riff['AVI ']['movi']['offset'] + $thisfile_riff['AVI ']['movi']['size'];\n\t\t\t\t\t}\n\t\t\t\t\tif ($info['avdataend'] > $info['filesize']) {\n\t\t\t\t\t\t$info['warning'][] = 'Probably truncated file - expecting '.($info['avdataend'] - $info['avdataoffset']).' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($info['avdataend'] - $info['filesize']).' bytes)';\n\t\t\t\t\t\t$info['avdataend'] = $info['filesize'];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff['AVI ']['hdrl']['strl']['indx'])) {\n\t\t\t\t\t//$bIndexType = array(\n\t\t\t\t\t//\t0x00 => 'AVI_INDEX_OF_INDEXES',\n\t\t\t\t\t//\t0x01 => 'AVI_INDEX_OF_CHUNKS',\n\t\t\t\t\t//\t0x80 => 'AVI_INDEX_IS_DATA',\n\t\t\t\t\t//);\n\t\t\t\t\t//$bIndexSubtype = array(\n\t\t\t\t\t//\t0x01 => array(\n\t\t\t\t\t//\t\t0x01 => 'AVI_INDEX_2FIELD',\n\t\t\t\t\t//\t),\n\t\t\t\t\t//);\n\t\t\t\t\tforeach ($thisfile_riff['AVI ']['hdrl']['strl']['indx'] as $streamnumber => $steamdataarray) {\n\t\t\t\t\t\t$ahsisd = &$thisfile_riff['AVI ']['hdrl']['strl']['indx'][$streamnumber]['data'];\n\n\t\t\t\t\t\t$thisfile_riff_raw['indx'][$streamnumber]['wLongsPerEntry'] = $this->EitherEndian2Int(substr($ahsisd,  0, 2));\n\t\t\t\t\t\t$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType']  = $this->EitherEndian2Int(substr($ahsisd,  2, 1));\n\t\t\t\t\t\t$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']     = $this->EitherEndian2Int(substr($ahsisd,  3, 1));\n\t\t\t\t\t\t$thisfile_riff_raw['indx'][$streamnumber]['nEntriesInUse']  = $this->EitherEndian2Int(substr($ahsisd,  4, 4));\n\t\t\t\t\t\t$thisfile_riff_raw['indx'][$streamnumber]['dwChunkId']      =                         substr($ahsisd,  8, 4);\n\t\t\t\t\t\t$thisfile_riff_raw['indx'][$streamnumber]['dwReserved']     = $this->EitherEndian2Int(substr($ahsisd, 12, 4));\n\n\t\t\t\t\t\t//$thisfile_riff_raw['indx'][$streamnumber]['bIndexType_name']    =    $bIndexType[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']];\n\t\t\t\t\t\t//$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType_name'] = $bIndexSubtype[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']][$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType']];\n\n\t\t\t\t\t\tunset($ahsisd);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isset($thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'])) {\n\t\t\t\t\t$avihData = $thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'];\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_riff_raw['avih'] = array();\n\t\t\t\t\t$thisfile_riff_raw_avih = &$thisfile_riff_raw['avih'];\n\n\t\t\t\t\t$thisfile_riff_raw_avih['dwMicroSecPerFrame']    = $this->EitherEndian2Int(substr($avihData,  0, 4)); // frame display rate (or 0L)\n\t\t\t\t\tif ($thisfile_riff_raw_avih['dwMicroSecPerFrame'] == 0) {\n\t\t\t\t\t\t$info['error'][] = 'Corrupt RIFF file: avih.dwMicroSecPerFrame == zero';\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t$flags = array(\n\t\t\t\t\t\t'dwMaxBytesPerSec',       // max. transfer rate\n\t\t\t\t\t\t'dwPaddingGranularity',   // pad to multiples of this size; normally 2K.\n\t\t\t\t\t\t'dwFlags',                // the ever-present flags\n\t\t\t\t\t\t'dwTotalFrames',          // # frames in file\n\t\t\t\t\t\t'dwInitialFrames',        //\n\t\t\t\t\t\t'dwStreams',              //\n\t\t\t\t\t\t'dwSuggestedBufferSize',  //\n\t\t\t\t\t\t'dwWidth',                //\n\t\t\t\t\t\t'dwHeight',               //\n\t\t\t\t\t\t'dwScale',                //\n\t\t\t\t\t\t'dwRate',                 //\n\t\t\t\t\t\t'dwStart',                //\n\t\t\t\t\t\t'dwLength',               //\n\t\t\t\t\t);\n\t\t\t\t\t$avih_offset = 4;\n\t\t\t\t\tforeach ($flags as $flag) {\n\t\t\t\t\t\t$thisfile_riff_raw_avih[$flag] = $this->EitherEndian2Int(substr($avihData, $avih_offset, 4));\n\t\t\t\t\t\t$avih_offset += 4;\n\t\t\t\t\t}\n\n\t\t\t\t\t$flags = array(\n\t\t\t\t\t\t'hasindex'     => 0x00000010,\n\t\t\t\t\t\t'mustuseindex' => 0x00000020,\n\t\t\t\t\t\t'interleaved'  => 0x00000100,\n\t\t\t\t\t\t'trustcktype'  => 0x00000800,\n\t\t\t\t\t\t'capturedfile' => 0x00010000,\n\t\t\t\t\t\t'copyrighted'  => 0x00020010,\n\t\t\t\t\t);\n                    foreach ($flags as $flag => $value) {\n\t\t\t\t\t\t$thisfile_riff_raw_avih['flags'][$flag] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & $value);\n\t\t\t\t\t}\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_riff_video[$streamindex] = array();\n\t\t\t\t\t$thisfile_riff_video_current = &$thisfile_riff_video[$streamindex];\n\n\t\t\t\t\tif ($thisfile_riff_raw_avih['dwWidth'] > 0) {\n\t\t\t\t\t\t$thisfile_riff_video_current['frame_width'] = $thisfile_riff_raw_avih['dwWidth'];\n\t\t\t\t\t\t$thisfile_video['resolution_x']             = $thisfile_riff_video_current['frame_width'];\n\t\t\t\t\t}\n\t\t\t\t\tif ($thisfile_riff_raw_avih['dwHeight'] > 0) {\n\t\t\t\t\t\t$thisfile_riff_video_current['frame_height'] = $thisfile_riff_raw_avih['dwHeight'];\n\t\t\t\t\t\t$thisfile_video['resolution_y']              = $thisfile_riff_video_current['frame_height'];\n\t\t\t\t\t}\n\t\t\t\t\tif ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) {\n\t\t\t\t\t\t$thisfile_riff_video_current['total_frames'] = $thisfile_riff_raw_avih['dwTotalFrames'];\n\t\t\t\t\t\t$thisfile_video['total_frames']              = $thisfile_riff_video_current['total_frames'];\n\t\t\t\t\t}\n\n\t\t\t\t\t$thisfile_riff_video_current['frame_rate'] = round(1000000 / $thisfile_riff_raw_avih['dwMicroSecPerFrame'], 3);\n\t\t\t\t\t$thisfile_video['frame_rate'] = $thisfile_riff_video_current['frame_rate'];\n\t\t\t\t}\n\t\t\t\tif (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][0]['data'])) {\n\t\t\t\t\tif (is_array($thisfile_riff['AVI ']['hdrl']['strl']['strh'])) {\n\t\t\t\t\t\tfor ($i = 0; $i < count($thisfile_riff['AVI ']['hdrl']['strl']['strh']); $i++) {\n\t\t\t\t\t\t\tif (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'])) {\n\t\t\t\t\t\t\t\t$strhData = $thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'];\n\t\t\t\t\t\t\t\t$strhfccType = substr($strhData,  0, 4);\n\n\t\t\t\t\t\t\t\tif (isset($thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'])) {\n\t\t\t\t\t\t\t\t\t$strfData = $thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'];\n\n\t\t\t\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strf_strhfccType_streamindex = &$thisfile_riff_raw['strf'][$strhfccType][$streamindex];\n\n\t\t\t\t\t\t\t\t\tswitch ($strhfccType) {\n\t\t\t\t\t\t\t\t\t\tcase 'auds':\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio['bitrate_mode'] = 'cbr';\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat      = 'wav';\n\t\t\t\t\t\t\t\t\t\t\tif (isset($thisfile_riff_audio) && is_array($thisfile_riff_audio)) {\n\t\t\t\t\t\t\t\t\t\t\t\t$streamindex = count($thisfile_riff_audio);\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($strfData);\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag'];\n\n\t\t\t\t\t\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex];\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_streams_currentstream = &$thisfile_audio['streams'][$streamindex];\n\n\t\t\t\t\t\t\t\t\t\t\tif ($thisfile_audio_streams_currentstream['bits_per_sample'] == 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tunset($thisfile_audio_streams_currentstream['bits_per_sample']);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_streams_currentstream['wformattag'] = $thisfile_audio_streams_currentstream['raw']['wFormatTag'];\n\t\t\t\t\t\t\t\t\t\t\tunset($thisfile_audio_streams_currentstream['raw']);\n\n\t\t\t\t\t\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw['strf'][$strhfccType][$streamindex] = $thisfile_riff_audio[$streamindex]['raw'];\n\n\t\t\t\t\t\t\t\t\t\t\tunset($thisfile_riff_audio[$streamindex]['raw']);\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]);\n\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio['lossless'] = false;\n\t\t\t\t\t\t\t\t\t\t\tswitch ($thisfile_riff_raw_strf_strhfccType_streamindex['wFormatTag']) {\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x0001:  // PCM\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat  = 'wav';\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio['lossless'] = true;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x0050: // MPEG Layer 2 or Layer 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat = 'mp2'; // Assume Layer-2\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x0055: // MPEG Layer 3\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat = 'mp3';\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x00FF: // AAC\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat = 'aac';\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x0161: // Windows Media v7 / v8 / v9\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x0162: // Windows Media Professional v9\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x0163: // Windows Media Lossess v9\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat = 'wma';\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x2000: // AC-3\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat = 'ac3';\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 0x2001: // DTS\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat = 'dts';\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_dataformat = 'wav';\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_streams_currentstream['dataformat']   = $thisfile_audio_dataformat;\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_streams_currentstream['lossless']     = $thisfile_audio['lossless'];\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_audio_streams_currentstream['bitrate_mode'] = $thisfile_audio['bitrate_mode'];\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\t\t\t\t\t\tcase 'iavs':\n\t\t\t\t\t\t\t\t\t\tcase 'vids':\n\t\t\t\t\t\t\t\t\t\t\t// shortcut\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw['strh'][$i]                  = array();\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current                 = &$thisfile_riff_raw['strh'][$i];\n\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['fccType']               =                         substr($strhData,  0, 4);  // same as $strhfccType;\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['fccHandler']            =                         substr($strhData,  4, 4);\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwFlags']               = $this->EitherEndian2Int(substr($strhData,  8, 4)); // Contains AVITF_* flags\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['wPriority']             = $this->EitherEndian2Int(substr($strhData, 12, 2));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['wLanguage']             = $this->EitherEndian2Int(substr($strhData, 14, 2));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwInitialFrames']       = $this->EitherEndian2Int(substr($strhData, 16, 4));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwScale']               = $this->EitherEndian2Int(substr($strhData, 20, 4));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwRate']                = $this->EitherEndian2Int(substr($strhData, 24, 4));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwStart']               = $this->EitherEndian2Int(substr($strhData, 28, 4));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwLength']              = $this->EitherEndian2Int(substr($strhData, 32, 4));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwSuggestedBufferSize'] = $this->EitherEndian2Int(substr($strhData, 36, 4));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwQuality']             = $this->EitherEndian2Int(substr($strhData, 40, 4));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['dwSampleSize']          = $this->EitherEndian2Int(substr($strhData, 44, 4));\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strh_current['rcFrame']               = $this->EitherEndian2Int(substr($strhData, 48, 4));\n\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strh_current['fccHandler']);\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_video['fourcc']             = $thisfile_riff_raw_strh_current['fccHandler'];\n\t\t\t\t\t\t\t\t\t\t\tif (!$thisfile_riff_video_current['codec'] && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) && self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) {\n\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']);\n\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_video['fourcc']             = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'];\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_video['codec']              = $thisfile_riff_video_current['codec'];\n\t\t\t\t\t\t\t\t\t\t\t$thisfile_video['pixel_aspect_ratio'] = (float) 1;\n\t\t\t\t\t\t\t\t\t\t\tswitch ($thisfile_riff_raw_strh_current['fccHandler']) {\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'HFYU': // Huffman Lossless Codec\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'IRAW': // Intel YUV Uncompressed\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'YUY2': // Uncompressed YUV 4:2:2\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_video['lossless'] = true;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_video['lossless'] = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tswitch ($strhfccType) {\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'vids':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_raw_strf_strhfccType_streamindex = self::ParseBITMAPINFOHEADER(substr($strfData, 0, 40), ($this->container == 'riff'));\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_video['bits_per_sample'] = $thisfile_riff_raw_strf_strhfccType_streamindex['biBitCount'];\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tif ($thisfile_riff_video_current['codec'] == 'DV') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_video_current['dv_type'] = 2;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcase 'iavs':\n\t\t\t\t\t\t\t\t\t\t\t\t\t$thisfile_riff_video_current['dv_type'] = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t$info['warning'][] = 'Unhandled fccType for stream ('.$i.'): \"'.$strhfccType.'\"';\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) {\n\n\t\t\t\t\t\t\t\t$thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'];\n\t\t\t\t\t\t\t\tif (self::fourccLookup($thisfile_video['fourcc'])) {\n\t\t\t\t\t\t\t\t\t$thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_video['fourcc']);\n\t\t\t\t\t\t\t\t\t$thisfile_video['codec']              = $thisfile_riff_video_current['codec'];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tswitch ($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) {\n\t\t\t\t\t\t\t\t\tcase 'HFYU': // Huffman Lossless Codec\n\t\t\t\t\t\t\t\t\tcase 'IRAW': // Intel YUV Uncompressed\n\t\t\t\t\t\t\t\t\tcase 'YUY2': // Uncompressed YUV 4:2:2\n\t\t\t\t\t\t\t\t\t\t$thisfile_video['lossless']        = true;\n\t\t\t\t\t\t\t\t\t\t//$thisfile_video['bits_per_sample'] = 24;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t$thisfile_video['lossless']        = false;\n\t\t\t\t\t\t\t\t\t\t//$thisfile_video['bits_per_sample'] = 24;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'AMV ':\n\t\t\t\t$info['fileformat'] = 'amv';\n\t\t\t\t$info['mime_type']  = 'video/amv';\n\n\t\t\t\t$thisfile_video['bitrate_mode']    = 'vbr'; // it's MJPEG, presumably contant-quality encoding, thereby VBR\n\t\t\t\t$thisfile_video['dataformat']      = 'mjpeg';\n\t\t\t\t$thisfile_video['codec']           = 'mjpeg';\n\t\t\t\t$thisfile_video['lossless']        = false;\n\t\t\t\t$thisfile_video['bits_per_sample'] = 24;\n\n\t\t\t\t$thisfile_audio['dataformat']   = 'adpcm';\n\t\t\t\t$thisfile_audio['lossless']     = false;\n\t\t\t\tbreak;\n\n\n\t\t\t// http://en.wikipedia.org/wiki/CD-DA\n\t\t\tcase 'CDDA':\n\t\t\t\t$info['fileformat'] = 'cda';\n\t\t\t    unset($info['mime_type']);\n\n\t\t\t\t$thisfile_audio_dataformat      = 'cda';\n\n\t\t\t\t$info['avdataoffset'] = 44;\n\n\t\t\t\tif (isset($thisfile_riff['CDDA']['fmt '][0]['data'])) {\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0 = &$thisfile_riff['CDDA']['fmt '][0];\n\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['unknown1']           = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'],  0, 2));\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['track_num']          = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'],  2, 2));\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['disc_id']            = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'],  4, 4));\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['start_offset_frame'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'],  8, 4));\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['playtime_frames']    = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 12, 4));\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['unknown6']           = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 16, 4));\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['unknown7']           = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 20, 4));\n\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['start_offset_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['start_offset_frame'] / 75;\n\t\t\t\t\t$thisfile_riff_CDDA_fmt_0['playtime_seconds']     = (float) $thisfile_riff_CDDA_fmt_0['playtime_frames'] / 75;\n\t\t\t\t\t$info['comments']['track']                = $thisfile_riff_CDDA_fmt_0['track_num'];\n\t\t\t\t\t$info['playtime_seconds']                 = $thisfile_riff_CDDA_fmt_0['playtime_seconds'];\n\n\t\t\t\t\t// hardcoded data for CD-audio\n\t\t\t\t\t$thisfile_audio['lossless']        = true;\n\t\t\t\t\t$thisfile_audio['sample_rate']     = 44100;\n\t\t\t\t\t$thisfile_audio['channels']        = 2;\n\t\t\t\t\t$thisfile_audio['bits_per_sample'] = 16;\n\t\t\t\t\t$thisfile_audio['bitrate']         = $thisfile_audio['sample_rate'] * $thisfile_audio['channels'] * $thisfile_audio['bits_per_sample'];\n\t\t\t\t\t$thisfile_audio['bitrate_mode']    = 'cbr';\n\t\t\t\t}\n\t\t\t\tbreak;\n\n            // http://en.wikipedia.org/wiki/AIFF\n\t\t\tcase 'AIFF':\n\t\t\tcase 'AIFC':\n\t\t\t\t$info['fileformat'] = 'aiff';\n\t\t\t\t$info['mime_type']  = 'audio/x-aiff';\n\n\t\t\t\t$thisfile_audio['bitrate_mode'] = 'cbr';\n\t\t\t\t$thisfile_audio_dataformat      = 'aiff';\n\t\t\t\t$thisfile_audio['lossless']     = true;\n\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'])) {\n\t\t\t\t\t$info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'] + 8;\n\t\t\t\t\t$info['avdataend']    = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['SSND'][0]['size'];\n\t\t\t\t\tif ($info['avdataend'] > $info['filesize']) {\n\t\t\t\t\t\tif (($info['avdataend'] == ($info['filesize'] + 1)) && (($info['filesize'] % 2) == 1)) {\n\t\t\t\t\t\t\t// structures rounded to 2-byte boundary, but dumb encoders\n\t\t\t\t\t\t\t// forget to pad end of file to make this actually work\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$info['warning'][] = 'Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['SSND'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$info['avdataend'] = $info['filesize'];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['COMM'][0]['data'])) {\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_COMM_0_data = &$thisfile_riff[$RIFFsubtype]['COMM'][0]['data'];\n\n\t\t\t\t\t$thisfile_riff_audio['channels']         =         getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data,  0,  2), true);\n\t\t\t\t\t$thisfile_riff_audio['total_samples']    =         getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data,  2,  4), false);\n\t\t\t\t\t$thisfile_riff_audio['bits_per_sample']  =         getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data,  6,  2), true);\n\t\t\t\t\t$thisfile_riff_audio['sample_rate']      = (int) getid3_lib::BigEndian2Float(substr($thisfile_riff_RIFFsubtype_COMM_0_data,  8, 10));\n\n\t\t\t\t\tif ($thisfile_riff[$RIFFsubtype]['COMM'][0]['size'] > 18) {\n\t\t\t\t\t\t$thisfile_riff_audio['codec_fourcc'] =                                   substr($thisfile_riff_RIFFsubtype_COMM_0_data, 18,  4);\n\t\t\t\t\t\t$CodecNameSize                       =         getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 22,  1), false);\n\t\t\t\t\t\t$thisfile_riff_audio['codec_name']   =                                   substr($thisfile_riff_RIFFsubtype_COMM_0_data, 23,  $CodecNameSize);\n\t\t\t\t\t\tswitch ($thisfile_riff_audio['codec_name']) {\n\t\t\t\t\t\t\tcase 'NONE':\n\t\t\t\t\t\t\t\t$thisfile_audio['codec']    = 'Pulse Code Modulation (PCM)';\n\t\t\t\t\t\t\t\t$thisfile_audio['lossless'] = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase '':\n\t\t\t\t\t\t\t\tswitch ($thisfile_riff_audio['codec_fourcc']) {\n\t\t\t\t\t\t\t\t\t// http://developer.apple.com/qa/snd/snd07.html\n\t\t\t\t\t\t\t\t\tcase 'sowt':\n\t\t\t\t\t\t\t\t\t\t$thisfile_riff_audio['codec_name'] = 'Two\\'s Compliment Little-Endian PCM';\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['lossless'] = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'twos':\n\t\t\t\t\t\t\t\t\t\t$thisfile_riff_audio['codec_name'] = 'Two\\'s Compliment Big-Endian PCM';\n\t\t\t\t\t\t\t\t\t\t$thisfile_audio['lossless'] = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t$thisfile_audio['codec']    = $thisfile_riff_audio['codec_name'];\n\t\t\t\t\t\t\t\t$thisfile_audio['lossless'] = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$thisfile_audio['channels']        = $thisfile_riff_audio['channels'];\n\t\t\t\t\tif ($thisfile_riff_audio['bits_per_sample'] > 0) {\n\t\t\t\t\t\t$thisfile_audio['bits_per_sample'] = $thisfile_riff_audio['bits_per_sample'];\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_audio['sample_rate']     = $thisfile_riff_audio['sample_rate'];\n\t\t\t\t\tif ($thisfile_audio['sample_rate'] == 0) {\n\t\t\t\t\t\t$info['error'][] = 'Corrupted AIFF file: sample_rate == zero';\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$info['playtime_seconds'] = $thisfile_riff_audio['total_samples'] / $thisfile_audio['sample_rate'];\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['COMT'])) {\n\t\t\t\t\t$offset = 0;\n\t\t\t\t\t$CommentCount                                   = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false);\n\t\t\t\t\t$offset += 2;\n\t\t\t\t\tfor ($i = 0; $i < $CommentCount; $i++) {\n\t\t\t\t\t\t$info['comments_raw'][$i]['timestamp']      = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 4), false);\n\t\t\t\t\t\t$offset += 4;\n\t\t\t\t\t\t$info['comments_raw'][$i]['marker_id']      = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), true);\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$CommentLength                              = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false);\n\t\t\t\t\t\t$offset += 2;\n\t\t\t\t\t\t$info['comments_raw'][$i]['comment']        =                           substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, $CommentLength);\n\t\t\t\t\t\t$offset += $CommentLength;\n\n\t\t\t\t\t\t$info['comments_raw'][$i]['timestamp_unix'] = getid3_lib::DateMac2Unix($info['comments_raw'][$i]['timestamp']);\n\t\t\t\t\t\t$thisfile_riff['comments']['comment'][] = $info['comments_raw'][$i]['comment'];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment');\n\t\t\t\tforeach ($CommentsChunkNames as $key => $value) {\n\t\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) {\n\t\t\t\t\t\t$thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data'];\n\t\t\t\t\t}\n\t\t\t\t}\n/*\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['ID3 '])) {\n\t\t\t\t\tgetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);\n\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t$getid3_id3v2 = new getid3_id3v2($getid3_temp);\n\t\t\t\t\t$getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['ID3 '][0]['offset'] + 8;\n\t\t\t\t\tif ($thisfile_riff[$RIFFsubtype]['ID3 '][0]['valid'] = $getid3_id3v2->Analyze()) {\n\t\t\t\t\t\t$info['id3v2'] = $getid3_temp->info['id3v2'];\n\t\t\t\t\t}\n\t\t\t\t\tunset($getid3_temp, $getid3_id3v2);\n\t\t\t\t}\n*/\n\t\t\t\tbreak;\n\n\t\t\t// http://en.wikipedia.org/wiki/8SVX\n\t\t\tcase '8SVX':\n\t\t\t\t$info['fileformat'] = '8svx';\n\t\t\t\t$info['mime_type']  = 'audio/8svx';\n\n\t\t\t\t$thisfile_audio['bitrate_mode']    = 'cbr';\n\t\t\t\t$thisfile_audio_dataformat         = '8svx';\n\t\t\t\t$thisfile_audio['bits_per_sample'] = 8;\n\t\t\t\t$thisfile_audio['channels']        = 1; // overridden below, if need be\n\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'])) {\n\t\t\t\t\t$info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'] + 8;\n\t\t\t\t\t$info['avdataend']    = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['BODY'][0]['size'];\n\t\t\t\t\tif ($info['avdataend'] > $info['filesize']) {\n\t\t\t\t\t\t$info['warning'][] = 'Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['BODY'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['VHDR'][0]['offset'])) {\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_VHDR_0 = &$thisfile_riff[$RIFFsubtype]['VHDR'][0];\n\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_VHDR_0['oneShotHiSamples']  =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'],  0, 4));\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_VHDR_0['repeatHiSamples']   =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'],  4, 4));\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_VHDR_0['samplesPerHiCycle'] =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'],  8, 4));\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec']     =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 12, 2));\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_VHDR_0['ctOctave']          =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 14, 1));\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_VHDR_0['sCompression']      =   getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 15, 1));\n\t\t\t\t\t$thisfile_riff_RIFFsubtype_VHDR_0['Volume']            = getid3_lib::FixedPoint16_16(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 16, 4));\n\n\t\t\t\t\t$thisfile_audio['sample_rate'] = $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec'];\n\n\t\t\t\t\tswitch ($thisfile_riff_RIFFsubtype_VHDR_0['sCompression']) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t$thisfile_audio['codec']    = 'Pulse Code Modulation (PCM)';\n\t\t\t\t\t\t\t$thisfile_audio['lossless'] = true;\n\t\t\t\t\t\t\t$ActualBitsPerSample        = 8;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t$thisfile_audio['codec']    = 'Fibonacci-delta encoding';\n\t\t\t\t\t\t\t$thisfile_audio['lossless'] = false;\n\t\t\t\t\t\t\t$ActualBitsPerSample        = 4;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t$info['warning'][] = 'Unexpected sCompression value in 8SVX.VHDR chunk - expecting 0 or 1, found \"'.sCompression.'\"';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'])) {\n\t\t\t\t\t$ChannelsIndex = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'], 0, 4));\n\t\t\t\t\tswitch ($ChannelsIndex) {\n\t\t\t\t\t\tcase 6: // Stereo\n\t\t\t\t\t\t\t$thisfile_audio['channels'] = 2;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2: // Left channel only\n\t\t\t\t\t\tcase 4: // Right channel only\n\t\t\t\t\t\t\t$thisfile_audio['channels'] = 1;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t$info['warning'][] = 'Unexpected value in 8SVX.CHAN chunk - expecting 2 or 4 or 6, found \"'.$ChannelsIndex.'\"';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t$CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment');\n\t\t\t\tforeach ($CommentsChunkNames as $key => $value) {\n\t\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) {\n\t\t\t\t\t\t$thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data'];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $ActualBitsPerSample * $thisfile_audio['channels'];\n\t\t\t\tif (!empty($thisfile_audio['bitrate'])) {\n\t\t\t\t\t$info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($thisfile_audio['bitrate'] / 8);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'CDXA':\n\t\t\t\t$info['fileformat'] = 'vcd'; // Asume Video CD\n\t\t\t\t$info['mime_type']  = 'video/mpeg';\n\n\t\t\t\tif (!empty($thisfile_riff['CDXA']['data'][0]['size'])) {\n\t\t\t\t\tgetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.mpeg.php', __FILE__, true);\n\n\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t$getid3_mpeg = new getid3_mpeg($getid3_temp);\n\t\t\t\t\t$getid3_mpeg->Analyze();\n\t\t\t\t\tif (empty($getid3_temp->info['error'])) {\n\t\t\t\t\t\t$info['audio']   = $getid3_temp->info['audio'];\n\t\t\t\t\t\t$info['video']   = $getid3_temp->info['video'];\n\t\t\t\t\t\t$info['mpeg']    = $getid3_temp->info['mpeg'];\n\t\t\t\t\t\t$info['warning'] = $getid3_temp->info['warning'];\n\t\t\t\t\t}\n\t\t\t\t\tunset($getid3_temp, $getid3_mpeg);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\n\t\t\tdefault:\n\t\t\t\t$info['error'][] = 'Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA), found \"'.$RIFFsubtype.'\" instead';\n\t\t\t\t//unset($info['fileformat']);\n\t\t}\n\n\t\tswitch ($RIFFsubtype) {\n\t\t\tcase 'WAVE':\n\t\t\tcase 'AIFF':\n\t\t\tcase 'AIFC':\n\t\t\t\t$ID3v2_key_good = 'id3 ';\n\t\t\t\t$ID3v2_keys_bad = array('ID3 ', 'tag ');\n\t\t\t\tforeach ($ID3v2_keys_bad as $ID3v2_key_bad) {\n\t\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]) && !array_key_exists($ID3v2_key_good, $thisfile_riff[$RIFFsubtype])) {\n\t\t\t\t\t\t$thisfile_riff[$RIFFsubtype][$ID3v2_key_good] = $thisfile_riff[$RIFFsubtype][$ID3v2_key_bad];\n\t\t\t\t\t\t$info['warning'][] = 'mapping \"'.$ID3v2_key_bad.'\" chunk to \"'.$ID3v2_key_good.'\"';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isset($thisfile_riff[$RIFFsubtype]['id3 '])) {\n\t\t\t\t\tgetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);\n\n\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t$getid3_id3v2 = new getid3_id3v2($getid3_temp);\n\t\t\t\t\t$getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['id3 '][0]['offset'] + 8;\n\t\t\t\t\tif ($thisfile_riff[$RIFFsubtype]['id3 '][0]['valid'] = $getid3_id3v2->Analyze()) {\n\t\t\t\t\t\t$info['id3v2'] = $getid3_temp->info['id3v2'];\n\t\t\t\t\t}\n\t\t\t\t\tunset($getid3_temp, $getid3_id3v2);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isset($thisfile_riff_WAVE['DISP']) && is_array($thisfile_riff_WAVE['DISP'])) {\n\t\t\t$thisfile_riff['comments']['title'][] = trim(substr($thisfile_riff_WAVE['DISP'][count($thisfile_riff_WAVE['DISP']) - 1]['data'], 4));\n\t\t}\n\t\tif (isset($thisfile_riff_WAVE['INFO']) && is_array($thisfile_riff_WAVE['INFO'])) {\n\t\t\tself::parseComments($thisfile_riff_WAVE['INFO'], $thisfile_riff['comments']);\n\t\t}\n\t\tif (isset($thisfile_riff['AVI ']['INFO']) && is_array($thisfile_riff['AVI ']['INFO'])) {\n\t\t\tself::parseComments($thisfile_riff['AVI ']['INFO'], $thisfile_riff['comments']);\n\t\t}\n\n\t\tif (empty($thisfile_audio['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version'])) {\n\t\t\t$thisfile_audio['encoder'] = $info['mpeg']['audio']['LAME']['short_version'];\n\t\t}\n\n\t\tif (!isset($info['playtime_seconds'])) {\n\t\t\t$info['playtime_seconds'] = 0;\n\t\t}\n\t\tif (isset($thisfile_riff_raw['strh'][0]['dwLength']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) {\n\t\t\t// needed for >2GB AVIs where 'avih' chunk only lists number of frames in that chunk, not entire movie\n\t\t\t$info['playtime_seconds'] = $thisfile_riff_raw['strh'][0]['dwLength'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000);\n\t\t} elseif (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) {\n\t\t\t$info['playtime_seconds'] = $thisfile_riff_raw['avih']['dwTotalFrames'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000);\n\t\t}\n\n\t\tif ($info['playtime_seconds'] > 0) {\n\t\t\tif (isset($thisfile_riff_audio) && isset($thisfile_riff_video)) {\n\n\t\t\t\tif (!isset($info['bitrate'])) {\n\t\t\t\t\t$info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8);\n\t\t\t\t}\n\n\t\t\t} elseif (isset($thisfile_riff_audio) && !isset($thisfile_riff_video)) {\n\n\t\t\t\tif (!isset($thisfile_audio['bitrate'])) {\n\t\t\t\t\t$thisfile_audio['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8);\n\t\t\t\t}\n\n\t\t\t} elseif (!isset($thisfile_riff_audio) && isset($thisfile_riff_video)) {\n\n\t\t\t\tif (!isset($thisfile_video['bitrate'])) {\n\t\t\t\t\t$thisfile_video['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\n\t\tif (isset($thisfile_riff_video) && isset($thisfile_audio['bitrate']) && ($thisfile_audio['bitrate'] > 0) && ($info['playtime_seconds'] > 0)) {\n\n\t\t\t$info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8);\n\t\t\t$thisfile_audio['bitrate'] = 0;\n\t\t\t$thisfile_video['bitrate'] = $info['bitrate'];\n\t\t\tforeach ($thisfile_riff_audio as $channelnumber => $audioinfoarray) {\n\t\t\t\t$thisfile_video['bitrate'] -= $audioinfoarray['bitrate'];\n\t\t\t\t$thisfile_audio['bitrate'] += $audioinfoarray['bitrate'];\n\t\t\t}\n\t\t\tif ($thisfile_video['bitrate'] <= 0) {\n\t\t\t\tunset($thisfile_video['bitrate']);\n\t\t\t}\n\t\t\tif ($thisfile_audio['bitrate'] <= 0) {\n\t\t\t\tunset($thisfile_audio['bitrate']);\n\t\t\t}\n\t\t}\n\n\t\tif (isset($info['mpeg']['audio'])) {\n\t\t\t$thisfile_audio_dataformat      = 'mp'.$info['mpeg']['audio']['layer'];\n\t\t\t$thisfile_audio['sample_rate']  = $info['mpeg']['audio']['sample_rate'];\n\t\t\t$thisfile_audio['channels']     = $info['mpeg']['audio']['channels'];\n\t\t\t$thisfile_audio['bitrate']      = $info['mpeg']['audio']['bitrate'];\n\t\t\t$thisfile_audio['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);\n\t\t\tif (!empty($info['mpeg']['audio']['codec'])) {\n\t\t\t\t$thisfile_audio['codec'] = $info['mpeg']['audio']['codec'].' '.$thisfile_audio['codec'];\n\t\t\t}\n\t\t\tif (!empty($thisfile_audio['streams'])) {\n\t\t\t\tforeach ($thisfile_audio['streams'] as $streamnumber => $streamdata) {\n\t\t\t\t\tif ($streamdata['dataformat'] == $thisfile_audio_dataformat) {\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['sample_rate']  = $thisfile_audio['sample_rate'];\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['channels']     = $thisfile_audio['channels'];\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['bitrate']      = $thisfile_audio['bitrate'];\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['bitrate_mode'] = $thisfile_audio['bitrate_mode'];\n\t\t\t\t\t\t$thisfile_audio['streams'][$streamnumber]['codec']        = $thisfile_audio['codec'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t$getid3_mp3 = new getid3_mp3($this->getid3);\n\t\t\t$thisfile_audio['encoder_options'] = $getid3_mp3->GuessEncoderOptions();\n\t\t\tunset($getid3_mp3);\n\t\t}\n\n\n\t\tif (!empty($thisfile_riff_raw['fmt ']['wBitsPerSample']) && ($thisfile_riff_raw['fmt ']['wBitsPerSample'] > 0)) {\n\t\t\tswitch ($thisfile_audio_dataformat) {\n\t\t\t\tcase 'ac3':\n\t\t\t\t\t// ignore bits_per_sample\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$thisfile_audio['bits_per_sample'] = $thisfile_riff_raw['fmt ']['wBitsPerSample'];\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\n\t\tif (empty($thisfile_riff_raw)) {\n\t\t\tunset($thisfile_riff['raw']);\n\t\t}\n\t\tif (empty($thisfile_riff_audio)) {\n\t\t\tunset($thisfile_riff['audio']);\n\t\t}\n\t\tif (empty($thisfile_riff_video)) {\n\t\t\tunset($thisfile_riff['video']);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic function ParseRIFFAMV($startoffset, $maxoffset) {\n\t\t// AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size\n\n\t\t// https://code.google.com/p/amv-codec-tools/wiki/AmvDocumentation\n\t\t//typedef struct _amvmainheader {\n\t\t//FOURCC fcc; // 'amvh'\n\t\t//DWORD cb;\n\t\t//DWORD dwMicroSecPerFrame;\n\t\t//BYTE reserve[28];\n\t\t//DWORD dwWidth;\n\t\t//DWORD dwHeight;\n\t\t//DWORD dwSpeed;\n\t\t//DWORD reserve0;\n\t\t//DWORD reserve1;\n\t\t//BYTE bTimeSec;\n\t\t//BYTE bTimeMin;\n\t\t//WORD wTimeHour;\n\t\t//} AMVMAINHEADER;\n\n\t\t$info = &$this->getid3->info;\n\t\t$RIFFchunk = false;\n\n\t\ttry {\n\n\t\t\t$this->fseek($startoffset);\n\t\t\t$maxoffset = min($maxoffset, $info['avdataend']);\n\t\t\t$AMVheader = $this->fread(284);\n\t\t\tif (substr($AMVheader,   0,  8) != 'hdrlamvh') {\n\t\t\t\tthrow new Exception('expecting \"hdrlamv\" at offset '.($startoffset +   0).', found \"'.substr($AMVheader,   0, 8).'\"');\n\t\t\t}\n\t\t\tif (substr($AMVheader,   8,  4) != \"\\x38\\x00\\x00\\x00\") { // \"amvh\" chunk size, hardcoded to 0x38 = 56 bytes\n\t\t\t\tthrow new Exception('expecting \"0x38000000\" at offset '.($startoffset +   8).', found \"'.getid3_lib::PrintHexBytes(substr($AMVheader,   8, 4)).'\"');\n\t\t\t}\n\t\t\t$RIFFchunk = array();\n\t\t\t$RIFFchunk['amvh']['us_per_frame']   = getid3_lib::LittleEndian2Int(substr($AMVheader,  12,  4));\n\t\t\t$RIFFchunk['amvh']['reserved28']     =                              substr($AMVheader,  16, 28);  // null? reserved?\n\t\t\t$RIFFchunk['amvh']['resolution_x']   = getid3_lib::LittleEndian2Int(substr($AMVheader,  44,  4));\n\t\t\t$RIFFchunk['amvh']['resolution_y']   = getid3_lib::LittleEndian2Int(substr($AMVheader,  48,  4));\n\t\t\t$RIFFchunk['amvh']['frame_rate_int'] = getid3_lib::LittleEndian2Int(substr($AMVheader,  52,  4));\n\t\t\t$RIFFchunk['amvh']['reserved0']      = getid3_lib::LittleEndian2Int(substr($AMVheader,  56,  4)); // 1? reserved?\n\t\t\t$RIFFchunk['amvh']['reserved1']      = getid3_lib::LittleEndian2Int(substr($AMVheader,  60,  4)); // 0? reserved?\n\t\t\t$RIFFchunk['amvh']['runtime_sec']    = getid3_lib::LittleEndian2Int(substr($AMVheader,  64,  1));\n\t\t\t$RIFFchunk['amvh']['runtime_min']    = getid3_lib::LittleEndian2Int(substr($AMVheader,  65,  1));\n\t\t\t$RIFFchunk['amvh']['runtime_hrs']    = getid3_lib::LittleEndian2Int(substr($AMVheader,  66,  2));\n\n\t\t\t$info['video']['frame_rate']   = 1000000 / $RIFFchunk['amvh']['us_per_frame'];\n\t\t\t$info['video']['resolution_x'] = $RIFFchunk['amvh']['resolution_x'];\n\t\t\t$info['video']['resolution_y'] = $RIFFchunk['amvh']['resolution_y'];\n\t\t\t$info['playtime_seconds']      = ($RIFFchunk['amvh']['runtime_hrs'] * 3600) + ($RIFFchunk['amvh']['runtime_min'] * 60) + $RIFFchunk['amvh']['runtime_sec'];\n\n\t\t\t// the rest is all hardcoded(?) and does not appear to be useful until you get to audio info at offset 256, even then everything is probably hardcoded\n\n\t\t\tif (substr($AMVheader,  68, 20) != 'LIST'.\"\\x00\\x00\\x00\\x00\".'strlstrh'.\"\\x38\\x00\\x00\\x00\") {\n\t\t\t\tthrow new Exception('expecting \"LIST<0x00000000>strlstrh<0x38000000>\" at offset '.($startoffset +  68).', found \"'.getid3_lib::PrintHexBytes(substr($AMVheader,  68, 20)).'\"');\n\t\t\t}\n\t\t\t// followed by 56 bytes of null: substr($AMVheader,  88, 56) -> 144\n\t\t\tif (substr($AMVheader, 144,  8) != 'strf'.\"\\x24\\x00\\x00\\x00\") {\n\t\t\t\tthrow new Exception('expecting \"strf<0x24000000>\" at offset '.($startoffset + 144).', found \"'.getid3_lib::PrintHexBytes(substr($AMVheader, 144,  8)).'\"');\n\t\t\t}\n\t\t\t// followed by 36 bytes of null: substr($AMVheader, 144, 36) -> 180\n\n\t\t\tif (substr($AMVheader, 188, 20) != 'LIST'.\"\\x00\\x00\\x00\\x00\".'strlstrh'.\"\\x30\\x00\\x00\\x00\") {\n\t\t\t\tthrow new Exception('expecting \"LIST<0x00000000>strlstrh<0x30000000>\" at offset '.($startoffset + 188).', found \"'.getid3_lib::PrintHexBytes(substr($AMVheader, 188, 20)).'\"');\n\t\t\t}\n\t\t\t// followed by 48 bytes of null: substr($AMVheader, 208, 48) -> 256\n\t\t\tif (substr($AMVheader, 256,  8) != 'strf'.\"\\x14\\x00\\x00\\x00\") {\n\t\t\t\tthrow new Exception('expecting \"strf<0x14000000>\" at offset '.($startoffset + 256).', found \"'.getid3_lib::PrintHexBytes(substr($AMVheader, 256,  8)).'\"');\n\t\t\t}\n\t\t\t// followed by 20 bytes of a modified WAVEFORMATEX:\n\t\t\t// typedef struct {\n\t\t\t// WORD wFormatTag;       //(Fixme: this is equal to PCM's 0x01 format code)\n\t\t\t// WORD nChannels;        //(Fixme: this is always 1)\n\t\t\t// DWORD nSamplesPerSec;  //(Fixme: for all known sample files this is equal to 22050)\n\t\t\t// DWORD nAvgBytesPerSec; //(Fixme: for all known sample files this is equal to 44100)\n\t\t\t// WORD nBlockAlign;      //(Fixme: this seems to be 2 in AMV files, is this correct ?)\n\t\t\t// WORD wBitsPerSample;   //(Fixme: this seems to be 16 in AMV files instead of the expected 4)\n\t\t\t// WORD cbSize;           //(Fixme: this seems to be 0 in AMV files)\n\t\t\t// WORD reserved;\n\t\t\t// } WAVEFORMATEX;\n\t\t\t$RIFFchunk['strf']['wformattag']      = getid3_lib::LittleEndian2Int(substr($AMVheader,  264,  2));\n\t\t\t$RIFFchunk['strf']['nchannels']       = getid3_lib::LittleEndian2Int(substr($AMVheader,  266,  2));\n\t\t\t$RIFFchunk['strf']['nsamplespersec']  = getid3_lib::LittleEndian2Int(substr($AMVheader,  268,  4));\n\t\t\t$RIFFchunk['strf']['navgbytespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader,  272,  4));\n\t\t\t$RIFFchunk['strf']['nblockalign']     = getid3_lib::LittleEndian2Int(substr($AMVheader,  276,  2));\n\t\t\t$RIFFchunk['strf']['wbitspersample']  = getid3_lib::LittleEndian2Int(substr($AMVheader,  278,  2));\n\t\t\t$RIFFchunk['strf']['cbsize']          = getid3_lib::LittleEndian2Int(substr($AMVheader,  280,  2));\n\t\t\t$RIFFchunk['strf']['reserved']        = getid3_lib::LittleEndian2Int(substr($AMVheader,  282,  2));\n\n\n\t\t\t$info['audio']['lossless']        = false;\n\t\t\t$info['audio']['sample_rate']     = $RIFFchunk['strf']['nsamplespersec'];\n\t\t\t$info['audio']['channels']        = $RIFFchunk['strf']['nchannels'];\n\t\t\t$info['audio']['bits_per_sample'] = $RIFFchunk['strf']['wbitspersample'];\n\t\t\t$info['audio']['bitrate']         = $info['audio']['sample_rate'] * $info['audio']['channels'] * $info['audio']['bits_per_sample'];\n\t\t\t$info['audio']['bitrate_mode']    = 'cbr';\n\n\n\t\t} catch (getid3_exception $e) {\n\t\t\tif ($e->getCode() == 10) {\n\t\t\t\t$this->warning('RIFFAMV parser: '.$e->getMessage());\n\t\t\t} else {\n\t\t\t\tthrow $e;\n\t\t\t}\n\t\t}\n\n\t\treturn $RIFFchunk;\n\t}\n\n\n\tpublic function ParseRIFF($startoffset, $maxoffset) {\n\t\t$info = &$this->getid3->info;\n\n\t\t$RIFFchunk = false;\n\t\t$FoundAllChunksWeNeed = false;\n\n\t\ttry {\n\t\t\t$this->fseek($startoffset);\n\t\t\t$maxoffset = min($maxoffset, $info['avdataend']);\n\t\t\twhile ($this->ftell() < $maxoffset) {\n\t\t\t\t$chunknamesize = $this->fread(8);\n\t\t\t\t//$chunkname =                          substr($chunknamesize, 0, 4);\n\t\t\t\t$chunkname = str_replace(\"\\x00\", '_', substr($chunknamesize, 0, 4));  // note: chunk names of 4 null bytes do appear to be legal (has been observed inside INFO and PRMI chunks, for example), but makes traversing array keys more difficult\n\t\t\t\t$chunksize =  $this->EitherEndian2Int(substr($chunknamesize, 4, 4));\n\t\t\t\t//if (strlen(trim($chunkname, \"\\x00\")) < 4) {\n\t\t\t\tif (strlen($chunkname) < 4) {\n\t\t\t\t\t$this->error('Expecting chunk name at offset '.($this->ftell() - 8).' but found nothing. Aborting RIFF parsing.');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (($chunksize == 0) && ($chunkname != 'JUNK')) {\n\t\t\t\t\t$this->warning('Chunk ('.$chunkname.') size at offset '.($this->ftell() - 4).' is zero. Aborting RIFF parsing.');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (($chunksize % 2) != 0) {\n\t\t\t\t\t// all structures are packed on word boundaries\n\t\t\t\t\t$chunksize++;\n\t\t\t\t}\n\n\t\t\t\tswitch ($chunkname) {\n\t\t\t\t\tcase 'LIST':\n\t\t\t\t\t\t$listname = $this->fread(4);\n\t\t\t\t\t\tif (preg_match('#^(movi|rec )$#i', $listname)) {\n\t\t\t\t\t\t\t$RIFFchunk[$listname]['offset'] = $this->ftell() - 4;\n\t\t\t\t\t\t\t$RIFFchunk[$listname]['size']   = $chunksize;\n\n\t\t\t\t\t\t\tif (!$FoundAllChunksWeNeed) {\n\t\t\t\t\t\t\t\t$WhereWeWere      = $this->ftell();\n\t\t\t\t\t\t\t\t$AudioChunkHeader = $this->fread(12);\n\t\t\t\t\t\t\t\t$AudioChunkStreamNum  =                              substr($AudioChunkHeader, 0, 2);\n\t\t\t\t\t\t\t\t$AudioChunkStreamType =                              substr($AudioChunkHeader, 2, 2);\n\t\t\t\t\t\t\t\t$AudioChunkSize       = getid3_lib::LittleEndian2Int(substr($AudioChunkHeader, 4, 4));\n\n\t\t\t\t\t\t\t\tif ($AudioChunkStreamType == 'wb') {\n\t\t\t\t\t\t\t\t\t$FirstFourBytes = substr($AudioChunkHeader, 8, 4);\n\t\t\t\t\t\t\t\t\tif (preg_match('/^\\xFF[\\xE2-\\xE7\\xF2-\\xF7\\xFA-\\xFF][\\x00-\\xEB]/s', $FirstFourBytes)) {\n\t\t\t\t\t\t\t\t\t\t// MP3\n\t\t\t\t\t\t\t\t\t\tif (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) {\n\t\t\t\t\t\t\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t\t\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataoffset'] = $this->ftell() - 4;\n\t\t\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataend']    = $this->ftell() + $AudioChunkSize;\n\t\t\t\t\t\t\t\t\t\t\t$getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__);\n\t\t\t\t\t\t\t\t\t\t\t$getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false);\n\t\t\t\t\t\t\t\t\t\t\tif (isset($getid3_temp->info['mpeg']['audio'])) {\n\t\t\t\t\t\t\t\t\t\t\t\t$info['mpeg']['audio']         = $getid3_temp->info['mpeg']['audio'];\n\t\t\t\t\t\t\t\t\t\t\t\t$info['audio']                 = $getid3_temp->info['audio'];\n\t\t\t\t\t\t\t\t\t\t\t\t$info['audio']['dataformat']   = 'mp'.$info['mpeg']['audio']['layer'];\n\t\t\t\t\t\t\t\t\t\t\t\t$info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];\n\t\t\t\t\t\t\t\t\t\t\t\t$info['audio']['channels']     = $info['mpeg']['audio']['channels'];\n\t\t\t\t\t\t\t\t\t\t\t\t$info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];\n\t\t\t\t\t\t\t\t\t\t\t\t$info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);\n\t\t\t\t\t\t\t\t\t\t\t\t//$info['bitrate']               = $info['audio']['bitrate'];\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tunset($getid3_temp, $getid3_mp3);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t} elseif (strpos($FirstFourBytes, getid3_ac3::syncword) === 0) {\n\n\t\t\t\t\t\t\t\t\t\t// AC3\n\t\t\t\t\t\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataoffset'] = $this->ftell() - 4;\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataend']    = $this->ftell() + $AudioChunkSize;\n\t\t\t\t\t\t\t\t\t\t$getid3_ac3 = new getid3_ac3($getid3_temp);\n\t\t\t\t\t\t\t\t\t\t$getid3_ac3->Analyze();\n\t\t\t\t\t\t\t\t\t\tif (empty($getid3_temp->info['error'])) {\n\t\t\t\t\t\t\t\t\t\t\t$info['audio']   = $getid3_temp->info['audio'];\n\t\t\t\t\t\t\t\t\t\t\t$info['ac3']     = $getid3_temp->info['ac3'];\n\t\t\t\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['warning'])) {\n\t\t\t\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['warning'] as $key => $value) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t$info['warning'][] = $value;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tunset($getid3_temp, $getid3_ac3);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$FoundAllChunksWeNeed = true;\n\t\t\t\t\t\t\t\t$this->fseek($WhereWeWere);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$this->fseek($chunksize - 4, SEEK_CUR);\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif (!isset($RIFFchunk[$listname])) {\n\t\t\t\t\t\t\t\t$RIFFchunk[$listname] = array();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$LISTchunkParent    = $listname;\n\t\t\t\t\t\t\t$LISTchunkMaxOffset = $this->ftell() - 4 + $chunksize;\n\t\t\t\t\t\t\tif ($parsedChunk = $this->ParseRIFF($this->ftell(), $LISTchunkMaxOffset)) {\n\t\t\t\t\t\t\t\t$RIFFchunk[$listname] = array_merge_recursive($RIFFchunk[$listname], $parsedChunk);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif (preg_match('#^[0-9]{2}(wb|pc|dc|db)$#', $chunkname)) {\n\t\t\t\t\t\t\t$this->fseek($chunksize, SEEK_CUR);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$thisindex = 0;\n\t\t\t\t\t\tif (isset($RIFFchunk[$chunkname]) && is_array($RIFFchunk[$chunkname])) {\n\t\t\t\t\t\t\t$thisindex = count($RIFFchunk[$chunkname]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$RIFFchunk[$chunkname][$thisindex]['offset'] = $this->ftell() - 8;\n\t\t\t\t\t\t$RIFFchunk[$chunkname][$thisindex]['size']   = $chunksize;\n\t\t\t\t\t\tswitch ($chunkname) {\n\t\t\t\t\t\t\tcase 'data':\n\t\t\t\t\t\t\t\t$info['avdataoffset'] = $this->ftell();\n\t\t\t\t\t\t\t\t$info['avdataend']    = $info['avdataoffset'] + $chunksize;\n\n\t\t\t\t\t\t\t\t$testData = $this->fread(36);\n\t\t\t\t\t\t\t\tif ($testData === '') {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (preg_match('/^\\xFF[\\xE2-\\xE7\\xF2-\\xF7\\xFA-\\xFF][\\x00-\\xEB]/s', substr($testData, 0, 4))) {\n\n\t\t\t\t\t\t\t\t\t// Probably is MP3 data\n\t\t\t\t\t\t\t\t\tif (getid3_mp3::MPEGaudioHeaderBytesValid(substr($testData, 0, 4))) {\n\t\t\t\t\t\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataend']    = $info['avdataend'];\n\t\t\t\t\t\t\t\t\t\t$getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__);\n\t\t\t\t\t\t\t\t\t\t$getid3_mp3->getOnlyMPEGaudioInfo($info['avdataoffset'], false);\n\t\t\t\t\t\t\t\t\t\tif (empty($getid3_temp->info['error'])) {\n\t\t\t\t\t\t\t\t\t\t\t$info['audio'] = $getid3_temp->info['audio'];\n\t\t\t\t\t\t\t\t\t\t\t$info['mpeg']  = $getid3_temp->info['mpeg'];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tunset($getid3_temp, $getid3_mp3);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} elseif (($isRegularAC3 = (substr($testData, 0, 2) == getid3_ac3::syncword)) || substr($testData, 8, 2) == strrev(getid3_ac3::syncword)) {\n\n\t\t\t\t\t\t\t\t\t// This is probably AC-3 data\n\t\t\t\t\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t\t\t\t\tif ($isRegularAC3) {\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];\n\t\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataend']    = $info['avdataend'];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$getid3_ac3 = new getid3_ac3($getid3_temp);\n\t\t\t\t\t\t\t\t\tif ($isRegularAC3) {\n\t\t\t\t\t\t\t\t\t\t$getid3_ac3->Analyze();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// Dolby Digital WAV\n\t\t\t\t\t\t\t\t\t\t// AC-3 content, but not encoded in same format as normal AC-3 file\n\t\t\t\t\t\t\t\t\t\t// For one thing, byte order is swapped\n\t\t\t\t\t\t\t\t\t\t$ac3_data = '';\n\t\t\t\t\t\t\t\t\t\tfor ($i = 0; $i < 28; $i += 2) {\n\t\t\t\t\t\t\t\t\t\t\t$ac3_data .= substr($testData, 8 + $i + 1, 1);\n\t\t\t\t\t\t\t\t\t\t\t$ac3_data .= substr($testData, 8 + $i + 0, 1);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t$getid3_ac3->AnalyzeString($ac3_data);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (empty($getid3_temp->info['error'])) {\n\t\t\t\t\t\t\t\t\t\t$info['audio'] = $getid3_temp->info['audio'];\n\t\t\t\t\t\t\t\t\t\t$info['ac3']   = $getid3_temp->info['ac3'];\n\t\t\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['warning'])) {\n\t\t\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['warning'] as $newerror) {\n\t\t\t\t\t\t\t\t\t\t\t\t$this->warning('getid3_ac3() says: ['.$newerror.']');\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tunset($getid3_temp, $getid3_ac3);\n\n\t\t\t\t\t\t\t\t} elseif (preg_match('/^('.implode('|', array_map('preg_quote', getid3_dts::$syncwords)).')/', $testData)) {\n\n\t\t\t\t\t\t\t\t\t// This is probably DTS data\n\t\t\t\t\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t\t\t\t\t$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];\n\t\t\t\t\t\t\t\t\t$getid3_dts = new getid3_dts($getid3_temp);\n\t\t\t\t\t\t\t\t\t$getid3_dts->Analyze();\n\t\t\t\t\t\t\t\t\tif (empty($getid3_temp->info['error'])) {\n\t\t\t\t\t\t\t\t\t\t$info['audio']            = $getid3_temp->info['audio'];\n\t\t\t\t\t\t\t\t\t\t$info['dts']              = $getid3_temp->info['dts'];\n\t\t\t\t\t\t\t\t\t\t$info['playtime_seconds'] = $getid3_temp->info['playtime_seconds']; // may not match RIFF calculations since DTS-WAV often used 14/16 bit-word packing\n\t\t\t\t\t\t\t\t\t\tif (!empty($getid3_temp->info['warning'])) {\n\t\t\t\t\t\t\t\t\t\t\tforeach ($getid3_temp->info['warning'] as $newerror) {\n\t\t\t\t\t\t\t\t\t\t\t\t$this->warning('getid3_dts() says: ['.$newerror.']');\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tunset($getid3_temp, $getid3_dts);\n\n\t\t\t\t\t\t\t\t} elseif (substr($testData, 0, 4) == 'wvpk') {\n\n\t\t\t\t\t\t\t\t\t// This is WavPack data\n\t\t\t\t\t\t\t\t\t$info['wavpack']['offset'] = $info['avdataoffset'];\n\t\t\t\t\t\t\t\t\t$info['wavpack']['size']   = getid3_lib::LittleEndian2Int(substr($testData, 4, 4));\n\t\t\t\t\t\t\t\t\t$this->parseWavPackHeader(substr($testData, 8, 28));\n\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// This is some other kind of data (quite possibly just PCM)\n\t\t\t\t\t\t\t\t\t// do nothing special, just skip it\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$nextoffset = $info['avdataend'];\n\t\t\t\t\t\t\t\t$this->fseek($nextoffset);\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'iXML':\n\t\t\t\t\t\t\tcase 'bext':\n\t\t\t\t\t\t\tcase 'cart':\n\t\t\t\t\t\t\tcase 'fmt ':\n\t\t\t\t\t\t\tcase 'strh':\n\t\t\t\t\t\t\tcase 'strf':\n\t\t\t\t\t\t\tcase 'indx':\n\t\t\t\t\t\t\tcase 'MEXT':\n\t\t\t\t\t\t\tcase 'DISP':\n\t\t\t\t\t\t\t\t// always read data in\n\t\t\t\t\t\t\tcase 'JUNK':\n\t\t\t\t\t\t\t\t// should be: never read data in\n\t\t\t\t\t\t\t\t// but some programs write their version strings in a JUNK chunk (e.g. VirtualDub, AVIdemux, etc)\n\t\t\t\t\t\t\t\tif ($chunksize < 1048576) {\n\t\t\t\t\t\t\t\t\tif ($chunksize > 0) {\n\t\t\t\t\t\t\t\t\t\t$RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize);\n\t\t\t\t\t\t\t\t\t\tif ($chunkname == 'JUNK') {\n\t\t\t\t\t\t\t\t\t\t\tif (preg_match('#^([\\\\x20-\\\\x7F]+)#', $RIFFchunk[$chunkname][$thisindex]['data'], $matches)) {\n\t\t\t\t\t\t\t\t\t\t\t\t// only keep text characters [chr(32)-chr(127)]\n\t\t\t\t\t\t\t\t\t\t\t\t$info['riff']['comments']['junk'][] = trim($matches[1]);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t// but if nothing there, ignore\n\t\t\t\t\t\t\t\t\t\t\t// remove the key in either case\n\t\t\t\t\t\t\t\t\t\t\tunset($RIFFchunk[$chunkname][$thisindex]['data']);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$this->warning('Chunk \"'.$chunkname.'\" at offset '.$this->ftell().' is unexpectedly larger than 1MB (claims to be '.number_format($chunksize).' bytes), skipping data');\n\t\t\t\t\t\t\t\t\t$this->fseek($chunksize, SEEK_CUR);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t//case 'IDVX':\n\t\t\t\t\t\t\t//\t$info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunksize));\n\t\t\t\t\t\t\t//\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tif (!empty($LISTchunkParent) && (($RIFFchunk[$chunkname][$thisindex]['offset'] + $RIFFchunk[$chunkname][$thisindex]['size']) <= $LISTchunkMaxOffset)) {\n\t\t\t\t\t\t\t\t\t$RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['offset'] = $RIFFchunk[$chunkname][$thisindex]['offset'];\n\t\t\t\t\t\t\t\t\t$RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['size']   = $RIFFchunk[$chunkname][$thisindex]['size'];\n\t\t\t\t\t\t\t\t\tunset($RIFFchunk[$chunkname][$thisindex]['offset']);\n\t\t\t\t\t\t\t\t\tunset($RIFFchunk[$chunkname][$thisindex]['size']);\n\t\t\t\t\t\t\t\t\tif (isset($RIFFchunk[$chunkname][$thisindex]) && empty($RIFFchunk[$chunkname][$thisindex])) {\n\t\t\t\t\t\t\t\t\t\tunset($RIFFchunk[$chunkname][$thisindex]);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($RIFFchunk[$chunkname]) && empty($RIFFchunk[$chunkname])) {\n\t\t\t\t\t\t\t\t\t\tunset($RIFFchunk[$chunkname]);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['data'] = $this->fread($chunksize);\n\t\t\t\t\t\t\t\t} elseif ($chunksize < 2048) {\n\t\t\t\t\t\t\t\t\t// only read data in if smaller than 2kB\n\t\t\t\t\t\t\t\t\t$RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$this->fseek($chunksize, SEEK_CUR);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} catch (getid3_exception $e) {\n\t\t\tif ($e->getCode() == 10) {\n\t\t\t\t$this->warning('RIFF parser: '.$e->getMessage());\n\t\t\t} else {\n\t\t\t\tthrow $e;\n\t\t\t}\n\t\t}\n\n\t\treturn $RIFFchunk;\n\t}\n\n\tpublic function ParseRIFFdata(&$RIFFdata) {\n\t\t$info = &$this->getid3->info;\n\t\tif ($RIFFdata) {\n\t\t\t$tempfile = tempnam(GETID3_TEMP_DIR, 'getID3');\n\t\t\t$fp_temp  = fopen($tempfile, 'wb');\n\t\t\t$RIFFdataLength = strlen($RIFFdata);\n\t\t\t$NewLengthString = getid3_lib::LittleEndian2String($RIFFdataLength, 4);\n\t\t\tfor ($i = 0; $i < 4; $i++) {\n\t\t\t\t$RIFFdata[($i + 4)] = $NewLengthString[$i];\n\t\t\t}\n\t\t\tfwrite($fp_temp, $RIFFdata);\n\t\t\tfclose($fp_temp);\n\n\t\t\t$getid3_temp = new getID3();\n\t\t\t$getid3_temp->openfile($tempfile);\n\t\t\t$getid3_temp->info['filesize']     = $RIFFdataLength;\n\t\t\t$getid3_temp->info['filenamepath'] = $info['filenamepath'];\n\t\t\t$getid3_temp->info['tags']         = $info['tags'];\n\t\t\t$getid3_temp->info['warning']      = $info['warning'];\n\t\t\t$getid3_temp->info['error']        = $info['error'];\n\t\t\t$getid3_temp->info['comments']     = $info['comments'];\n\t\t\t$getid3_temp->info['audio']        = (isset($info['audio']) ? $info['audio'] : array());\n\t\t\t$getid3_temp->info['video']        = (isset($info['video']) ? $info['video'] : array());\n\t\t\t$getid3_riff = new getid3_riff($getid3_temp);\n\t\t\t$getid3_riff->Analyze();\n\n\t\t\t$info['riff']     = $getid3_temp->info['riff'];\n\t\t\t$info['warning']  = $getid3_temp->info['warning'];\n\t\t\t$info['error']    = $getid3_temp->info['error'];\n\t\t\t$info['tags']     = $getid3_temp->info['tags'];\n\t\t\t$info['comments'] = $getid3_temp->info['comments'];\n\t\t\tunset($getid3_riff, $getid3_temp);\n\t\t\tunlink($tempfile);\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static function parseComments(&$RIFFinfoArray, &$CommentsTargetArray) {\n\t\t$RIFFinfoKeyLookup = array(\n\t\t\t'IARL'=>'archivallocation',\n\t\t\t'IART'=>'artist',\n\t\t\t'ICDS'=>'costumedesigner',\n\t\t\t'ICMS'=>'commissionedby',\n\t\t\t'ICMT'=>'comment',\n\t\t\t'ICNT'=>'country',\n\t\t\t'ICOP'=>'copyright',\n\t\t\t'ICRD'=>'creationdate',\n\t\t\t'IDIM'=>'dimensions',\n\t\t\t'IDIT'=>'digitizationdate',\n\t\t\t'IDPI'=>'resolution',\n\t\t\t'IDST'=>'distributor',\n\t\t\t'IEDT'=>'editor',\n\t\t\t'IENG'=>'engineers',\n\t\t\t'IFRM'=>'accountofparts',\n\t\t\t'IGNR'=>'genre',\n\t\t\t'IKEY'=>'keywords',\n\t\t\t'ILGT'=>'lightness',\n\t\t\t'ILNG'=>'language',\n\t\t\t'IMED'=>'orignalmedium',\n\t\t\t'IMUS'=>'composer',\n\t\t\t'INAM'=>'title',\n\t\t\t'IPDS'=>'productiondesigner',\n\t\t\t'IPLT'=>'palette',\n\t\t\t'IPRD'=>'product',\n\t\t\t'IPRO'=>'producer',\n\t\t\t'IPRT'=>'part',\n\t\t\t'IRTD'=>'rating',\n\t\t\t'ISBJ'=>'subject',\n\t\t\t'ISFT'=>'software',\n\t\t\t'ISGN'=>'secondarygenre',\n\t\t\t'ISHP'=>'sharpness',\n\t\t\t'ISRC'=>'sourcesupplier',\n\t\t\t'ISRF'=>'digitizationsource',\n\t\t\t'ISTD'=>'productionstudio',\n\t\t\t'ISTR'=>'starring',\n\t\t\t'ITCH'=>'encoded_by',\n\t\t\t'IWEB'=>'url',\n\t\t\t'IWRI'=>'writer',\n\t\t\t'____'=>'comment',\n\t\t);\n\t\tforeach ($RIFFinfoKeyLookup as $key => $value) {\n\t\t\tif (isset($RIFFinfoArray[$key])) {\n\t\t\t\tforeach ($RIFFinfoArray[$key] as $commentid => $commentdata) {\n\t\t\t\t\tif (trim($commentdata['data']) != '') {\n\t\t\t\t\t\tif (isset($CommentsTargetArray[$value])) {\n\t\t\t\t\t\t\t$CommentsTargetArray[$value][] =     trim($commentdata['data']);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$CommentsTargetArray[$value] = array(trim($commentdata['data']));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static function parseWAVEFORMATex($WaveFormatExData) {\n\t\t// shortcut\n\t\t$WaveFormatEx['raw'] = array();\n\t\t$WaveFormatEx_raw    = &$WaveFormatEx['raw'];\n\n\t\t$WaveFormatEx_raw['wFormatTag']      = substr($WaveFormatExData,  0, 2);\n\t\t$WaveFormatEx_raw['nChannels']       = substr($WaveFormatExData,  2, 2);\n\t\t$WaveFormatEx_raw['nSamplesPerSec']  = substr($WaveFormatExData,  4, 4);\n\t\t$WaveFormatEx_raw['nAvgBytesPerSec'] = substr($WaveFormatExData,  8, 4);\n\t\t$WaveFormatEx_raw['nBlockAlign']     = substr($WaveFormatExData, 12, 2);\n\t\t$WaveFormatEx_raw['wBitsPerSample']  = substr($WaveFormatExData, 14, 2);\n\t\tif (strlen($WaveFormatExData) > 16) {\n\t\t\t$WaveFormatEx_raw['cbSize']      = substr($WaveFormatExData, 16, 2);\n\t\t}\n\t\t$WaveFormatEx_raw = array_map('getid3_lib::LittleEndian2Int', $WaveFormatEx_raw);\n\n\t\t$WaveFormatEx['codec']           = self::wFormatTagLookup($WaveFormatEx_raw['wFormatTag']);\n\t\t$WaveFormatEx['channels']        = $WaveFormatEx_raw['nChannels'];\n\t\t$WaveFormatEx['sample_rate']     = $WaveFormatEx_raw['nSamplesPerSec'];\n\t\t$WaveFormatEx['bitrate']         = $WaveFormatEx_raw['nAvgBytesPerSec'] * 8;\n\t\t$WaveFormatEx['bits_per_sample'] = $WaveFormatEx_raw['wBitsPerSample'];\n\n\t\treturn $WaveFormatEx;\n\t}\n\n\tpublic function parseWavPackHeader($WavPackChunkData) {\n\t\t// typedef struct {\n\t\t//     char ckID [4];\n\t\t//     long ckSize;\n\t\t//     short version;\n\t\t//     short bits;                // added for version 2.00\n\t\t//     short flags, shift;        // added for version 3.00\n\t\t//     long total_samples, crc, crc2;\n\t\t//     char extension [4], extra_bc, extras [3];\n\t\t// } WavpackHeader;\n\n\t\t// shortcut\n\t\t$info = &$this->getid3->info;\n\t\t$info['wavpack']  = array();\n\t\t$thisfile_wavpack = &$info['wavpack'];\n\n\t\t$thisfile_wavpack['version']           = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  0, 2));\n\t\tif ($thisfile_wavpack['version'] >= 2) {\n\t\t\t$thisfile_wavpack['bits']          = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  2, 2));\n\t\t}\n\t\tif ($thisfile_wavpack['version'] >= 3) {\n\t\t\t$thisfile_wavpack['flags_raw']     = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  4, 2));\n\t\t\t$thisfile_wavpack['shift']         = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  6, 2));\n\t\t\t$thisfile_wavpack['total_samples'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData,  8, 4));\n\t\t\t$thisfile_wavpack['crc1']          = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 12, 4));\n\t\t\t$thisfile_wavpack['crc2']          = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 16, 4));\n\t\t\t$thisfile_wavpack['extension']     =                              substr($WavPackChunkData, 20, 4);\n\t\t\t$thisfile_wavpack['extra_bc']      = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 24, 1));\n\t\t\tfor ($i = 0; $i <= 2; $i++) {\n\t\t\t\t$thisfile_wavpack['extras'][]  = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 25 + $i, 1));\n\t\t\t}\n\n\t\t\t// shortcut\n\t\t\t$thisfile_wavpack['flags'] = array();\n\t\t\t$thisfile_wavpack_flags = &$thisfile_wavpack['flags'];\n\n\t\t\t$thisfile_wavpack_flags['mono']                 = (bool) ($thisfile_wavpack['flags_raw'] & 0x000001);\n\t\t\t$thisfile_wavpack_flags['fast_mode']            = (bool) ($thisfile_wavpack['flags_raw'] & 0x000002);\n\t\t\t$thisfile_wavpack_flags['raw_mode']             = (bool) ($thisfile_wavpack['flags_raw'] & 0x000004);\n\t\t\t$thisfile_wavpack_flags['calc_noise']           = (bool) ($thisfile_wavpack['flags_raw'] & 0x000008);\n\t\t\t$thisfile_wavpack_flags['high_quality']         = (bool) ($thisfile_wavpack['flags_raw'] & 0x000010);\n\t\t\t$thisfile_wavpack_flags['3_byte_samples']       = (bool) ($thisfile_wavpack['flags_raw'] & 0x000020);\n\t\t\t$thisfile_wavpack_flags['over_20_bits']         = (bool) ($thisfile_wavpack['flags_raw'] & 0x000040);\n\t\t\t$thisfile_wavpack_flags['use_wvc']              = (bool) ($thisfile_wavpack['flags_raw'] & 0x000080);\n\t\t\t$thisfile_wavpack_flags['noiseshaping']         = (bool) ($thisfile_wavpack['flags_raw'] & 0x000100);\n\t\t\t$thisfile_wavpack_flags['very_fast_mode']       = (bool) ($thisfile_wavpack['flags_raw'] & 0x000200);\n\t\t\t$thisfile_wavpack_flags['new_high_quality']     = (bool) ($thisfile_wavpack['flags_raw'] & 0x000400);\n\t\t\t$thisfile_wavpack_flags['cancel_extreme']       = (bool) ($thisfile_wavpack['flags_raw'] & 0x000800);\n\t\t\t$thisfile_wavpack_flags['cross_decorrelation']  = (bool) ($thisfile_wavpack['flags_raw'] & 0x001000);\n\t\t\t$thisfile_wavpack_flags['new_decorrelation']    = (bool) ($thisfile_wavpack['flags_raw'] & 0x002000);\n\t\t\t$thisfile_wavpack_flags['joint_stereo']         = (bool) ($thisfile_wavpack['flags_raw'] & 0x004000);\n\t\t\t$thisfile_wavpack_flags['extra_decorrelation']  = (bool) ($thisfile_wavpack['flags_raw'] & 0x008000);\n\t\t\t$thisfile_wavpack_flags['override_noiseshape']  = (bool) ($thisfile_wavpack['flags_raw'] & 0x010000);\n\t\t\t$thisfile_wavpack_flags['override_jointstereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x020000);\n\t\t\t$thisfile_wavpack_flags['copy_source_filetime'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x040000);\n\t\t\t$thisfile_wavpack_flags['create_exe']           = (bool) ($thisfile_wavpack['flags_raw'] & 0x080000);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true) {\n\n\t\t$parsed['biSize']          = substr($BITMAPINFOHEADER,  0, 4); // number of bytes required by the BITMAPINFOHEADER structure\n\t\t$parsed['biWidth']         = substr($BITMAPINFOHEADER,  4, 4); // width of the bitmap in pixels\n\t\t$parsed['biHeight']        = substr($BITMAPINFOHEADER,  8, 4); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner\n\t\t$parsed['biPlanes']        = substr($BITMAPINFOHEADER, 12, 2); // number of color planes on the target device. In most cases this value must be set to 1\n\t\t$parsed['biBitCount']      = substr($BITMAPINFOHEADER, 14, 2); // Specifies the number of bits per pixels\n\t\t$parsed['biSizeImage']     = substr($BITMAPINFOHEADER, 20, 4); // size of the bitmap data section of the image (the actual pixel data, excluding BITMAPINFOHEADER and RGBQUAD structures)\n\t\t$parsed['biXPelsPerMeter'] = substr($BITMAPINFOHEADER, 24, 4); // horizontal resolution, in pixels per metre, of the target device\n\t\t$parsed['biYPelsPerMeter'] = substr($BITMAPINFOHEADER, 28, 4); // vertical resolution, in pixels per metre, of the target device\n\t\t$parsed['biClrUsed']       = substr($BITMAPINFOHEADER, 32, 4); // actual number of color indices in the color table used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression\n\t\t$parsed['biClrImportant']  = substr($BITMAPINFOHEADER, 36, 4); // number of color indices that are considered important for displaying the bitmap. If this value is zero, all colors are important\n\t\t$parsed = array_map('getid3_lib::'.($littleEndian ? 'Little' : 'Big').'Endian2Int', $parsed);\n\n\t\t$parsed['fourcc']          = substr($BITMAPINFOHEADER, 16, 4);  // compression identifier\n\n\t\treturn $parsed;\n\t}\n\n\tpublic static function ParseDIVXTAG($DIVXTAG, $raw=false) {\n\t\t// structure from \"IDivX\" source, Form1.frm, by \"Greg Frazier of Daemonic Software Group\", email: gfrazier@icestorm.net, web: http://dsg.cjb.net/\n\t\t// source available at http://files.divx-digest.com/download/c663efe7ef8ad2e90bf4af4d3ea6188a/on0SWN2r/edit/IDivX.zip\n\t\t// 'Byte Layout:                   '1111111111111111\n\t\t// '32 for Movie - 1               '1111111111111111\n\t\t// '28 for Author - 6              '6666666666666666\n\t\t// '4  for year - 2                '6666666666662222\n\t\t// '3  for genre - 3               '7777777777777777\n\t\t// '48 for Comments - 7            '7777777777777777\n\t\t// '1  for Rating - 4              '7777777777777777\n\t\t// '5  for Future Additions - 0    '333400000DIVXTAG\n\t\t// '128 bytes total\n\n\t\tstatic $DIVXTAGgenre  = array(\n\t\t\t 0 => 'Action',\n\t\t\t 1 => 'Action/Adventure',\n\t\t\t 2 => 'Adventure',\n\t\t\t 3 => 'Adult',\n\t\t\t 4 => 'Anime',\n\t\t\t 5 => 'Cartoon',\n\t\t\t 6 => 'Claymation',\n\t\t\t 7 => 'Comedy',\n\t\t\t 8 => 'Commercial',\n\t\t\t 9 => 'Documentary',\n\t\t\t10 => 'Drama',\n\t\t\t11 => 'Home Video',\n\t\t\t12 => 'Horror',\n\t\t\t13 => 'Infomercial',\n\t\t\t14 => 'Interactive',\n\t\t\t15 => 'Mystery',\n\t\t\t16 => 'Music Video',\n\t\t\t17 => 'Other',\n\t\t\t18 => 'Religion',\n\t\t\t19 => 'Sci Fi',\n\t\t\t20 => 'Thriller',\n\t\t\t21 => 'Western',\n\t\t),\n\t\t$DIVXTAGrating = array(\n\t\t\t 0 => 'Unrated',\n\t\t\t 1 => 'G',\n\t\t\t 2 => 'PG',\n\t\t\t 3 => 'PG-13',\n\t\t\t 4 => 'R',\n\t\t\t 5 => 'NC-17',\n\t\t);\n\n\t\t$parsed['title']     =        trim(substr($DIVXTAG,   0, 32));\n\t\t$parsed['artist']    =        trim(substr($DIVXTAG,  32, 28));\n\t\t$parsed['year']      = intval(trim(substr($DIVXTAG,  60,  4)));\n\t\t$parsed['comment']   =        trim(substr($DIVXTAG,  64, 48));\n\t\t$parsed['genre_id']  = intval(trim(substr($DIVXTAG, 112,  3)));\n\t\t$parsed['rating_id'] =         ord(substr($DIVXTAG, 115,  1));\n\t\t//$parsed['padding'] =             substr($DIVXTAG, 116,  5);  // 5-byte null\n\t\t//$parsed['magic']   =             substr($DIVXTAG, 121,  7);  // \"DIVXTAG\"\n\n\t\t$parsed['genre']  = (isset($DIVXTAGgenre[$parsed['genre_id']])   ? $DIVXTAGgenre[$parsed['genre_id']]   : $parsed['genre_id']);\n\t\t$parsed['rating'] = (isset($DIVXTAGrating[$parsed['rating_id']]) ? $DIVXTAGrating[$parsed['rating_id']] : $parsed['rating_id']);\n\n\t\tif (!$raw) {\n\t\t\tunset($parsed['genre_id'], $parsed['rating_id']);\n\t\t\tforeach ($parsed as $key => $value) {\n\t\t\t\tif (!$value === '') {\n\t\t\t\t\tunset($parsed['key']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tforeach ($parsed as $tag => $value) {\n\t\t\t$parsed[$tag] = array($value);\n\t\t}\n\n\t\treturn $parsed;\n\t}\n\n\tpublic static function waveSNDMtagLookup($tagshortname) {\n\t\t$begin = __LINE__;\n\n\t\t/** This is not a comment!\n\n\t\t\t©kwd\tkeywords\n\t\t\t©BPM\tbpm\n\t\t\t©trt\ttracktitle\n\t\t\t©des\tdescription\n\t\t\t©gen\tcategory\n\t\t\t©fin\tfeaturedinstrument\n\t\t\t©LID\tlongid\n\t\t\t©bex\tbwdescription\n\t\t\t©pub\tpublisher\n\t\t\t©cdt\tcdtitle\n\t\t\t©alb\tlibrary\n\t\t\t©com\tcomposer\n\n\t\t*/\n\n\t\treturn getid3_lib::EmbeddedLookup($tagshortname, $begin, __LINE__, __FILE__, 'riff-sndm');\n\t}\n\n\tpublic static function wFormatTagLookup($wFormatTag) {\n\n\t\t$begin = __LINE__;\n\n\t\t/** This is not a comment!\n\n\t\t\t0x0000\tMicrosoft Unknown Wave Format\n\t\t\t0x0001\tPulse Code Modulation (PCM)\n\t\t\t0x0002\tMicrosoft ADPCM\n\t\t\t0x0003\tIEEE Float\n\t\t\t0x0004\tCompaq Computer VSELP\n\t\t\t0x0005\tIBM CVSD\n\t\t\t0x0006\tMicrosoft A-Law\n\t\t\t0x0007\tMicrosoft mu-Law\n\t\t\t0x0008\tMicrosoft DTS\n\t\t\t0x0010\tOKI ADPCM\n\t\t\t0x0011\tIntel DVI/IMA ADPCM\n\t\t\t0x0012\tVideologic MediaSpace ADPCM\n\t\t\t0x0013\tSierra Semiconductor ADPCM\n\t\t\t0x0014\tAntex Electronics G.723 ADPCM\n\t\t\t0x0015\tDSP Solutions DigiSTD\n\t\t\t0x0016\tDSP Solutions DigiFIX\n\t\t\t0x0017\tDialogic OKI ADPCM\n\t\t\t0x0018\tMediaVision ADPCM\n\t\t\t0x0019\tHewlett-Packard CU\n\t\t\t0x0020\tYamaha ADPCM\n\t\t\t0x0021\tSpeech Compression Sonarc\n\t\t\t0x0022\tDSP Group TrueSpeech\n\t\t\t0x0023\tEcho Speech EchoSC1\n\t\t\t0x0024\tAudiofile AF36\n\t\t\t0x0025\tAudio Processing Technology APTX\n\t\t\t0x0026\tAudioFile AF10\n\t\t\t0x0027\tProsody 1612\n\t\t\t0x0028\tLRC\n\t\t\t0x0030\tDolby AC2\n\t\t\t0x0031\tMicrosoft GSM 6.10\n\t\t\t0x0032\tMSNAudio\n\t\t\t0x0033\tAntex Electronics ADPCME\n\t\t\t0x0034\tControl Resources VQLPC\n\t\t\t0x0035\tDSP Solutions DigiREAL\n\t\t\t0x0036\tDSP Solutions DigiADPCM\n\t\t\t0x0037\tControl Resources CR10\n\t\t\t0x0038\tNatural MicroSystems VBXADPCM\n\t\t\t0x0039\tCrystal Semiconductor IMA ADPCM\n\t\t\t0x003A\tEchoSC3\n\t\t\t0x003B\tRockwell ADPCM\n\t\t\t0x003C\tRockwell Digit LK\n\t\t\t0x003D\tXebec\n\t\t\t0x0040\tAntex Electronics G.721 ADPCM\n\t\t\t0x0041\tG.728 CELP\n\t\t\t0x0042\tMSG723\n\t\t\t0x0050\tMPEG Layer-2 or Layer-1\n\t\t\t0x0052\tRT24\n\t\t\t0x0053\tPAC\n\t\t\t0x0055\tMPEG Layer-3\n\t\t\t0x0059\tLucent G.723\n\t\t\t0x0060\tCirrus\n\t\t\t0x0061\tESPCM\n\t\t\t0x0062\tVoxware\n\t\t\t0x0063\tCanopus Atrac\n\t\t\t0x0064\tG.726 ADPCM\n\t\t\t0x0065\tG.722 ADPCM\n\t\t\t0x0066\tDSAT\n\t\t\t0x0067\tDSAT Display\n\t\t\t0x0069\tVoxware Byte Aligned\n\t\t\t0x0070\tVoxware AC8\n\t\t\t0x0071\tVoxware AC10\n\t\t\t0x0072\tVoxware AC16\n\t\t\t0x0073\tVoxware AC20\n\t\t\t0x0074\tVoxware MetaVoice\n\t\t\t0x0075\tVoxware MetaSound\n\t\t\t0x0076\tVoxware RT29HW\n\t\t\t0x0077\tVoxware VR12\n\t\t\t0x0078\tVoxware VR18\n\t\t\t0x0079\tVoxware TQ40\n\t\t\t0x0080\tSoftsound\n\t\t\t0x0081\tVoxware TQ60\n\t\t\t0x0082\tMSRT24\n\t\t\t0x0083\tG.729A\n\t\t\t0x0084\tMVI MV12\n\t\t\t0x0085\tDF G.726\n\t\t\t0x0086\tDF GSM610\n\t\t\t0x0088\tISIAudio\n\t\t\t0x0089\tOnlive\n\t\t\t0x0091\tSBC24\n\t\t\t0x0092\tDolby AC3 SPDIF\n\t\t\t0x0093\tMediaSonic G.723\n\t\t\t0x0094\tAculab PLC    Prosody 8kbps\n\t\t\t0x0097\tZyXEL ADPCM\n\t\t\t0x0098\tPhilips LPCBB\n\t\t\t0x0099\tPacked\n\t\t\t0x00FF\tAAC\n\t\t\t0x0100\tRhetorex ADPCM\n\t\t\t0x0101\tIBM mu-law\n\t\t\t0x0102\tIBM A-law\n\t\t\t0x0103\tIBM AVC Adaptive Differential Pulse Code Modulation (ADPCM)\n\t\t\t0x0111\tVivo G.723\n\t\t\t0x0112\tVivo Siren\n\t\t\t0x0123\tDigital G.723\n\t\t\t0x0125\tSanyo LD ADPCM\n\t\t\t0x0130\tSipro Lab Telecom ACELP NET\n\t\t\t0x0131\tSipro Lab Telecom ACELP 4800\n\t\t\t0x0132\tSipro Lab Telecom ACELP 8V3\n\t\t\t0x0133\tSipro Lab Telecom G.729\n\t\t\t0x0134\tSipro Lab Telecom G.729A\n\t\t\t0x0135\tSipro Lab Telecom Kelvin\n\t\t\t0x0140\tWindows Media Video V8\n\t\t\t0x0150\tQualcomm PureVoice\n\t\t\t0x0151\tQualcomm HalfRate\n\t\t\t0x0155\tRing Zero Systems TUB GSM\n\t\t\t0x0160\tMicrosoft Audio 1\n\t\t\t0x0161\tWindows Media Audio V7 / V8 / V9\n\t\t\t0x0162\tWindows Media Audio Professional V9\n\t\t\t0x0163\tWindows Media Audio Lossless V9\n\t\t\t0x0200\tCreative Labs ADPCM\n\t\t\t0x0202\tCreative Labs Fastspeech8\n\t\t\t0x0203\tCreative Labs Fastspeech10\n\t\t\t0x0210\tUHER Informatic GmbH ADPCM\n\t\t\t0x0220\tQuarterdeck\n\t\t\t0x0230\tI-link Worldwide VC\n\t\t\t0x0240\tAureal RAW Sport\n\t\t\t0x0250\tInteractive Products HSX\n\t\t\t0x0251\tInteractive Products RPELP\n\t\t\t0x0260\tConsistent Software CS2\n\t\t\t0x0270\tSony SCX\n\t\t\t0x0300\tFujitsu FM Towns Snd\n\t\t\t0x0400\tBTV Digital\n\t\t\t0x0401\tIntel Music Coder\n\t\t\t0x0450\tQDesign Music\n\t\t\t0x0680\tVME VMPCM\n\t\t\t0x0681\tAT&T Labs TPC\n\t\t\t0x08AE\tClearJump LiteWave\n\t\t\t0x1000\tOlivetti GSM\n\t\t\t0x1001\tOlivetti ADPCM\n\t\t\t0x1002\tOlivetti CELP\n\t\t\t0x1003\tOlivetti SBC\n\t\t\t0x1004\tOlivetti OPR\n\t\t\t0x1100\tLernout & Hauspie Codec (0x1100)\n\t\t\t0x1101\tLernout & Hauspie CELP Codec (0x1101)\n\t\t\t0x1102\tLernout & Hauspie SBC Codec (0x1102)\n\t\t\t0x1103\tLernout & Hauspie SBC Codec (0x1103)\n\t\t\t0x1104\tLernout & Hauspie SBC Codec (0x1104)\n\t\t\t0x1400\tNorris\n\t\t\t0x1401\tAT&T ISIAudio\n\t\t\t0x1500\tSoundspace Music Compression\n\t\t\t0x181C\tVoxWare RT24 Speech\n\t\t\t0x1FC4\tNCT Soft ALF2CD (www.nctsoft.com)\n\t\t\t0x2000\tDolby AC3\n\t\t\t0x2001\tDolby DTS\n\t\t\t0x2002\tWAVE_FORMAT_14_4\n\t\t\t0x2003\tWAVE_FORMAT_28_8\n\t\t\t0x2004\tWAVE_FORMAT_COOK\n\t\t\t0x2005\tWAVE_FORMAT_DNET\n\t\t\t0x674F\tOgg Vorbis 1\n\t\t\t0x6750\tOgg Vorbis 2\n\t\t\t0x6751\tOgg Vorbis 3\n\t\t\t0x676F\tOgg Vorbis 1+\n\t\t\t0x6770\tOgg Vorbis 2+\n\t\t\t0x6771\tOgg Vorbis 3+\n\t\t\t0x7A21\tGSM-AMR (CBR, no SID)\n\t\t\t0x7A22\tGSM-AMR (VBR, including SID)\n\t\t\t0xFFFE\tWAVE_FORMAT_EXTENSIBLE\n\t\t\t0xFFFF\tWAVE_FORMAT_DEVELOPMENT\n\n\t\t*/\n\n\t\treturn getid3_lib::EmbeddedLookup('0x'.str_pad(strtoupper(dechex($wFormatTag)), 4, '0', STR_PAD_LEFT), $begin, __LINE__, __FILE__, 'riff-wFormatTag');\n\t}\n\n\tpublic static function fourccLookup($fourcc) {\n\n\t\t$begin = __LINE__;\n\n\t\t/** This is not a comment!\n\n\t\t\tswot\thttp://developer.apple.com/qa/snd/snd07.html\n\t\t\t____\tNo Codec (____)\n\t\t\t_BIT\tBI_BITFIELDS (Raw RGB)\n\t\t\t_JPG\tJPEG compressed\n\t\t\t_PNG\tPNG compressed W3C/ISO/IEC (RFC-2083)\n\t\t\t_RAW\tFull Frames (Uncompressed)\n\t\t\t_RGB\tRaw RGB Bitmap\n\t\t\t_RL4\tRLE 4bpp RGB\n\t\t\t_RL8\tRLE 8bpp RGB\n\t\t\t3IV1\t3ivx MPEG-4 v1\n\t\t\t3IV2\t3ivx MPEG-4 v2\n\t\t\t3IVX\t3ivx MPEG-4\n\t\t\tAASC\tAutodesk Animator\n\t\t\tABYR\tKensington ?ABYR?\n\t\t\tAEMI\tArray Microsystems VideoONE MPEG1-I Capture\n\t\t\tAFLC\tAutodesk Animator FLC\n\t\t\tAFLI\tAutodesk Animator FLI\n\t\t\tAMPG\tArray Microsystems VideoONE MPEG\n\t\t\tANIM\tIntel RDX (ANIM)\n\t\t\tAP41\tAngelPotion Definitive\n\t\t\tASV1\tAsus Video v1\n\t\t\tASV2\tAsus Video v2\n\t\t\tASVX\tAsus Video 2.0 (audio)\n\t\t\tAUR2\tAuraVision Aura 2 Codec - YUV 4:2:2\n\t\t\tAURA\tAuraVision Aura 1 Codec - YUV 4:1:1\n\t\t\tAVDJ\tIndependent JPEG Group\\'s codec (AVDJ)\n\t\t\tAVRN\tIndependent JPEG Group\\'s codec (AVRN)\n\t\t\tAYUV\t4:4:4 YUV (AYUV)\n\t\t\tAZPR\tQuicktime Apple Video (AZPR)\n\t\t\tBGR \tRaw RGB32\n\t\t\tBLZ0\tBlizzard DivX MPEG-4\n\t\t\tBTVC\tConexant Composite Video\n\t\t\tBINK\tRAD Game Tools Bink Video\n\t\t\tBT20\tConexant Prosumer Video\n\t\t\tBTCV\tConexant Composite Video Codec\n\t\t\tBW10\tData Translation Broadway MPEG Capture\n\t\t\tCC12\tIntel YUV12\n\t\t\tCDVC\tCanopus DV\n\t\t\tCFCC\tDigital Processing Systems DPS Perception\n\t\t\tCGDI\tMicrosoft Office 97 Camcorder Video\n\t\t\tCHAM\tWinnov Caviara Champagne\n\t\t\tCJPG\tCreative WebCam JPEG\n\t\t\tCLJR\tCirrus Logic YUV 4:1:1\n\t\t\tCMYK\tCommon Data Format in Printing (Colorgraph)\n\t\t\tCPLA\tWeitek 4:2:0 YUV Planar\n\t\t\tCRAM\tMicrosoft Video 1 (CRAM)\n\t\t\tcvid\tRadius Cinepak\n\t\t\tCVID\tRadius Cinepak\n\t\t\tCWLT\tMicrosoft Color WLT DIB\n\t\t\tCYUV\tCreative Labs YUV\n\t\t\tCYUY\tATI YUV\n\t\t\tD261\tH.261\n\t\t\tD263\tH.263\n\t\t\tDIB \tDevice Independent Bitmap\n\t\t\tDIV1\tFFmpeg OpenDivX\n\t\t\tDIV2\tMicrosoft MPEG-4 v1/v2\n\t\t\tDIV3\tDivX ;-) MPEG-4 v3.x Low-Motion\n\t\t\tDIV4\tDivX ;-) MPEG-4 v3.x Fast-Motion\n\t\t\tDIV5\tDivX MPEG-4 v5.x\n\t\t\tDIV6\tDivX ;-) (MS MPEG-4 v3.x)\n\t\t\tDIVX\tDivX MPEG-4 v4 (OpenDivX / Project Mayo)\n\t\t\tdivx\tDivX MPEG-4\n\t\t\tDMB1\tMatrox Rainbow Runner hardware MJPEG\n\t\t\tDMB2\tParadigm MJPEG\n\t\t\tDSVD\t?DSVD?\n\t\t\tDUCK\tDuck TrueMotion 1.0\n\t\t\tDPS0\tDPS/Leitch Reality Motion JPEG\n\t\t\tDPSC\tDPS/Leitch PAR Motion JPEG\n\t\t\tDV25\tMatrox DVCPRO codec\n\t\t\tDV50\tMatrox DVCPRO50 codec\n\t\t\tDVC \tIEC 61834 and SMPTE 314M (DVC/DV Video)\n\t\t\tDVCP\tIEC 61834 and SMPTE 314M (DVC/DV Video)\n\t\t\tDVHD\tIEC Standard DV 1125 lines @ 30fps / 1250 lines @ 25fps\n\t\t\tDVMA\tDarim Vision DVMPEG (dummy for MPEG compressor) (www.darvision.com)\n\t\t\tDVSL\tIEC Standard DV compressed in SD (SDL)\n\t\t\tDVAN\t?DVAN?\n\t\t\tDVE2\tInSoft DVE-2 Videoconferencing\n\t\t\tdvsd\tIEC 61834 and SMPTE 314M DVC/DV Video\n\t\t\tDVSD\tIEC 61834 and SMPTE 314M DVC/DV Video\n\t\t\tDVX1\tLucent DVX1000SP Video Decoder\n\t\t\tDVX2\tLucent DVX2000S Video Decoder\n\t\t\tDVX3\tLucent DVX3000S Video Decoder\n\t\t\tDX50\tDivX v5\n\t\t\tDXT1\tMicrosoft DirectX Compressed Texture (DXT1)\n\t\t\tDXT2\tMicrosoft DirectX Compressed Texture (DXT2)\n\t\t\tDXT3\tMicrosoft DirectX Compressed Texture (DXT3)\n\t\t\tDXT4\tMicrosoft DirectX Compressed Texture (DXT4)\n\t\t\tDXT5\tMicrosoft DirectX Compressed Texture (DXT5)\n\t\t\tDXTC\tMicrosoft DirectX Compressed Texture (DXTC)\n\t\t\tDXTn\tMicrosoft DirectX Compressed Texture (DXTn)\n\t\t\tEM2V\tEtymonix MPEG-2 I-frame (www.etymonix.com)\n\t\t\tEKQ0\tElsa ?EKQ0?\n\t\t\tELK0\tElsa ?ELK0?\n\t\t\tESCP\tEidos Escape\n\t\t\tETV1\teTreppid Video ETV1\n\t\t\tETV2\teTreppid Video ETV2\n\t\t\tETVC\teTreppid Video ETVC\n\t\t\tFLIC\tAutodesk FLI/FLC Animation\n\t\t\tFLV1\tSorenson Spark\n\t\t\tFLV4\tOn2 TrueMotion VP6\n\t\t\tFRWT\tDarim Vision Forward Motion JPEG (www.darvision.com)\n\t\t\tFRWU\tDarim Vision Forward Uncompressed (www.darvision.com)\n\t\t\tFLJP\tD-Vision Field Encoded Motion JPEG\n\t\t\tFPS1\tFRAPS v1\n\t\t\tFRWA\tSoftLab-Nsk Forward Motion JPEG w/ alpha channel\n\t\t\tFRWD\tSoftLab-Nsk Forward Motion JPEG\n\t\t\tFVF1\tIterated Systems Fractal Video Frame\n\t\t\tGLZW\tMotion LZW (gabest@freemail.hu)\n\t\t\tGPEG\tMotion JPEG (gabest@freemail.hu)\n\t\t\tGWLT\tMicrosoft Greyscale WLT DIB\n\t\t\tH260\tIntel ITU H.260 Videoconferencing\n\t\t\tH261\tIntel ITU H.261 Videoconferencing\n\t\t\tH262\tIntel ITU H.262 Videoconferencing\n\t\t\tH263\tIntel ITU H.263 Videoconferencing\n\t\t\tH264\tIntel ITU H.264 Videoconferencing\n\t\t\tH265\tIntel ITU H.265 Videoconferencing\n\t\t\tH266\tIntel ITU H.266 Videoconferencing\n\t\t\tH267\tIntel ITU H.267 Videoconferencing\n\t\t\tH268\tIntel ITU H.268 Videoconferencing\n\t\t\tH269\tIntel ITU H.269 Videoconferencing\n\t\t\tHFYU\tHuffman Lossless Codec\n\t\t\tHMCR\tRendition Motion Compensation Format (HMCR)\n\t\t\tHMRR\tRendition Motion Compensation Format (HMRR)\n\t\t\tI263\tFFmpeg I263 decoder\n\t\t\tIF09\tIndeo YVU9 (\"YVU9 with additional delta-frame info after the U plane\")\n\t\t\tIUYV\tInterlaced version of UYVY (www.leadtools.com)\n\t\t\tIY41\tInterlaced version of Y41P (www.leadtools.com)\n\t\t\tIYU1\t12 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec    IEEE standard\n\t\t\tIYU2\t24 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec    IEEE standard\n\t\t\tIYUV\tPlanar YUV format (8-bpp Y plane, followed by 8-bpp 2×2 U and V planes)\n\t\t\ti263\tIntel ITU H.263 Videoconferencing (i263)\n\t\t\tI420\tIntel Indeo 4\n\t\t\tIAN \tIntel Indeo 4 (RDX)\n\t\t\tICLB\tInSoft CellB Videoconferencing\n\t\t\tIGOR\tPower DVD\n\t\t\tIJPG\tIntergraph JPEG\n\t\t\tILVC\tIntel Layered Video\n\t\t\tILVR\tITU-T H.263+\n\t\t\tIPDV\tI-O Data Device Giga AVI DV Codec\n\t\t\tIR21\tIntel Indeo 2.1\n\t\t\tIRAW\tIntel YUV Uncompressed\n\t\t\tIV30\tIntel Indeo 3.0\n\t\t\tIV31\tIntel Indeo 3.1\n\t\t\tIV32\tLigos Indeo 3.2\n\t\t\tIV33\tLigos Indeo 3.3\n\t\t\tIV34\tLigos Indeo 3.4\n\t\t\tIV35\tLigos Indeo 3.5\n\t\t\tIV36\tLigos Indeo 3.6\n\t\t\tIV37\tLigos Indeo 3.7\n\t\t\tIV38\tLigos Indeo 3.8\n\t\t\tIV39\tLigos Indeo 3.9\n\t\t\tIV40\tLigos Indeo Interactive 4.0\n\t\t\tIV41\tLigos Indeo Interactive 4.1\n\t\t\tIV42\tLigos Indeo Interactive 4.2\n\t\t\tIV43\tLigos Indeo Interactive 4.3\n\t\t\tIV44\tLigos Indeo Interactive 4.4\n\t\t\tIV45\tLigos Indeo Interactive 4.5\n\t\t\tIV46\tLigos Indeo Interactive 4.6\n\t\t\tIV47\tLigos Indeo Interactive 4.7\n\t\t\tIV48\tLigos Indeo Interactive 4.8\n\t\t\tIV49\tLigos Indeo Interactive 4.9\n\t\t\tIV50\tLigos Indeo Interactive 5.0\n\t\t\tJBYR\tKensington ?JBYR?\n\t\t\tJPEG\tStill Image JPEG DIB\n\t\t\tJPGL\tPegasus Lossless Motion JPEG\n\t\t\tKMVC\tTeam17 Software Karl Morton\\'s Video Codec\n\t\t\tLSVM\tVianet Lighting Strike Vmail (Streaming) (www.vianet.com)\n\t\t\tLEAD\tLEAD Video Codec\n\t\t\tLjpg\tLEAD MJPEG Codec\n\t\t\tMDVD\tAlex MicroDVD Video (hacked MS MPEG-4) (www.tiasoft.de)\n\t\t\tMJPA\tMorgan Motion JPEG (MJPA) (www.morgan-multimedia.com)\n\t\t\tMJPB\tMorgan Motion JPEG (MJPB) (www.morgan-multimedia.com)\n\t\t\tMMES\tMatrox MPEG-2 I-frame\n\t\t\tMP2v\tMicrosoft S-Mpeg 4 version 1 (MP2v)\n\t\t\tMP42\tMicrosoft S-Mpeg 4 version 2 (MP42)\n\t\t\tMP43\tMicrosoft S-Mpeg 4 version 3 (MP43)\n\t\t\tMP4S\tMicrosoft S-Mpeg 4 version 3 (MP4S)\n\t\t\tMP4V\tFFmpeg MPEG-4\n\t\t\tMPG1\tFFmpeg MPEG 1/2\n\t\t\tMPG2\tFFmpeg MPEG 1/2\n\t\t\tMPG3\tFFmpeg DivX ;-) (MS MPEG-4 v3)\n\t\t\tMPG4\tMicrosoft MPEG-4\n\t\t\tMPGI\tSigma Designs MPEG\n\t\t\tMPNG\tPNG images decoder\n\t\t\tMSS1\tMicrosoft Windows Screen Video\n\t\t\tMSZH\tLCL (Lossless Codec Library) (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm)\n\t\t\tM261\tMicrosoft H.261\n\t\t\tM263\tMicrosoft H.263\n\t\t\tM4S2\tMicrosoft Fully Compliant MPEG-4 v2 simple profile (M4S2)\n\t\t\tm4s2\tMicrosoft Fully Compliant MPEG-4 v2 simple profile (m4s2)\n\t\t\tMC12\tATI Motion Compensation Format (MC12)\n\t\t\tMCAM\tATI Motion Compensation Format (MCAM)\n\t\t\tMJ2C\tMorgan Multimedia Motion JPEG2000\n\t\t\tmJPG\tIBM Motion JPEG w/ Huffman Tables\n\t\t\tMJPG\tMicrosoft Motion JPEG DIB\n\t\t\tMP42\tMicrosoft MPEG-4 (low-motion)\n\t\t\tMP43\tMicrosoft MPEG-4 (fast-motion)\n\t\t\tMP4S\tMicrosoft MPEG-4 (MP4S)\n\t\t\tmp4s\tMicrosoft MPEG-4 (mp4s)\n\t\t\tMPEG\tChromatic Research MPEG-1 Video I-Frame\n\t\t\tMPG4\tMicrosoft MPEG-4 Video High Speed Compressor\n\t\t\tMPGI\tSigma Designs MPEG\n\t\t\tMRCA\tFAST Multimedia Martin Regen Codec\n\t\t\tMRLE\tMicrosoft Run Length Encoding\n\t\t\tMSVC\tMicrosoft Video 1\n\t\t\tMTX1\tMatrox ?MTX1?\n\t\t\tMTX2\tMatrox ?MTX2?\n\t\t\tMTX3\tMatrox ?MTX3?\n\t\t\tMTX4\tMatrox ?MTX4?\n\t\t\tMTX5\tMatrox ?MTX5?\n\t\t\tMTX6\tMatrox ?MTX6?\n\t\t\tMTX7\tMatrox ?MTX7?\n\t\t\tMTX8\tMatrox ?MTX8?\n\t\t\tMTX9\tMatrox ?MTX9?\n\t\t\tMV12\tMotion Pixels Codec (old)\n\t\t\tMWV1\tAware Motion Wavelets\n\t\t\tnAVI\tSMR Codec (hack of Microsoft MPEG-4) (IRC #shadowrealm)\n\t\t\tNT00\tNewTek LightWave HDTV YUV w/ Alpha (www.newtek.com)\n\t\t\tNUV1\tNuppelVideo\n\t\t\tNTN1\tNogatech Video Compression 1\n\t\t\tNVS0\tnVidia GeForce Texture (NVS0)\n\t\t\tNVS1\tnVidia GeForce Texture (NVS1)\n\t\t\tNVS2\tnVidia GeForce Texture (NVS2)\n\t\t\tNVS3\tnVidia GeForce Texture (NVS3)\n\t\t\tNVS4\tnVidia GeForce Texture (NVS4)\n\t\t\tNVS5\tnVidia GeForce Texture (NVS5)\n\t\t\tNVT0\tnVidia GeForce Texture (NVT0)\n\t\t\tNVT1\tnVidia GeForce Texture (NVT1)\n\t\t\tNVT2\tnVidia GeForce Texture (NVT2)\n\t\t\tNVT3\tnVidia GeForce Texture (NVT3)\n\t\t\tNVT4\tnVidia GeForce Texture (NVT4)\n\t\t\tNVT5\tnVidia GeForce Texture (NVT5)\n\t\t\tPIXL\tMiroXL, Pinnacle PCTV\n\t\t\tPDVC\tI-O Data Device Digital Video Capture DV codec\n\t\t\tPGVV\tRadius Video Vision\n\t\t\tPHMO\tIBM Photomotion\n\t\t\tPIM1\tMPEG Realtime (Pinnacle Cards)\n\t\t\tPIM2\tPegasus Imaging ?PIM2?\n\t\t\tPIMJ\tPegasus Imaging Lossless JPEG\n\t\t\tPVEZ\tHorizons Technology PowerEZ\n\t\t\tPVMM\tPacketVideo Corporation MPEG-4\n\t\t\tPVW2\tPegasus Imaging Wavelet Compression\n\t\t\tQ1.0\tQ-Team\\'s QPEG 1.0 (www.q-team.de)\n\t\t\tQ1.1\tQ-Team\\'s QPEG 1.1 (www.q-team.de)\n\t\t\tQPEG\tQ-Team QPEG 1.0\n\t\t\tqpeq\tQ-Team QPEG 1.1\n\t\t\tRGB \tRaw BGR32\n\t\t\tRGBA\tRaw RGB w/ Alpha\n\t\t\tRMP4\tREALmagic MPEG-4 (unauthorized XVID copy) (www.sigmadesigns.com)\n\t\t\tROQV\tId RoQ File Video Decoder\n\t\t\tRPZA\tQuicktime Apple Video (RPZA)\n\t\t\tRUD0\tRududu video codec (http://rududu.ifrance.com/rududu/)\n\t\t\tRV10\tRealVideo 1.0 (aka RealVideo 5.0)\n\t\t\tRV13\tRealVideo 1.0 (RV13)\n\t\t\tRV20\tRealVideo G2\n\t\t\tRV30\tRealVideo 8\n\t\t\tRV40\tRealVideo 9\n\t\t\tRGBT\tRaw RGB w/ Transparency\n\t\t\tRLE \tMicrosoft Run Length Encoder\n\t\t\tRLE4\tRun Length Encoded (4bpp, 16-color)\n\t\t\tRLE8\tRun Length Encoded (8bpp, 256-color)\n\t\t\tRT21\tIntel Indeo RealTime Video 2.1\n\t\t\trv20\tRealVideo G2\n\t\t\trv30\tRealVideo 8\n\t\t\tRVX \tIntel RDX (RVX )\n\t\t\tSMC \tApple Graphics (SMC )\n\t\t\tSP54\tLogitech Sunplus Sp54 Codec for Mustek GSmart Mini 2\n\t\t\tSPIG\tRadius Spigot\n\t\t\tSVQ3\tSorenson Video 3 (Apple Quicktime 5)\n\t\t\ts422\tTekram VideoCap C210 YUV 4:2:2\n\t\t\tSDCC\tSun Communication Digital Camera Codec\n\t\t\tSFMC\tCrystalNet Surface Fitting Method\n\t\t\tSMSC\tRadius SMSC\n\t\t\tSMSD\tRadius SMSD\n\t\t\tsmsv\tWorldConnect Wavelet Video\n\t\t\tSPIG\tRadius Spigot\n\t\t\tSPLC\tSplash Studios ACM Audio Codec (www.splashstudios.net)\n\t\t\tSQZ2\tMicrosoft VXTreme Video Codec V2\n\t\t\tSTVA\tST Microelectronics CMOS Imager Data (Bayer)\n\t\t\tSTVB\tST Microelectronics CMOS Imager Data (Nudged Bayer)\n\t\t\tSTVC\tST Microelectronics CMOS Imager Data (Bunched)\n\t\t\tSTVX\tST Microelectronics CMOS Imager Data (Extended CODEC Data Format)\n\t\t\tSTVY\tST Microelectronics CMOS Imager Data (Extended CODEC Data Format with Correction Data)\n\t\t\tSV10\tSorenson Video R1\n\t\t\tSVQ1\tSorenson Video\n\t\t\tT420\tToshiba YUV 4:2:0\n\t\t\tTM2A\tDuck TrueMotion Archiver 2.0 (www.duck.com)\n\t\t\tTVJP\tPinnacle/Truevision Targa 2000 board (TVJP)\n\t\t\tTVMJ\tPinnacle/Truevision Targa 2000 board (TVMJ)\n\t\t\tTY0N\tTecomac Low-Bit Rate Codec (www.tecomac.com)\n\t\t\tTY2C\tTrident Decompression Driver\n\t\t\tTLMS\tTeraLogic Motion Intraframe Codec (TLMS)\n\t\t\tTLST\tTeraLogic Motion Intraframe Codec (TLST)\n\t\t\tTM20\tDuck TrueMotion 2.0\n\t\t\tTM2X\tDuck TrueMotion 2X\n\t\t\tTMIC\tTeraLogic Motion Intraframe Codec (TMIC)\n\t\t\tTMOT\tHorizons Technology TrueMotion S\n\t\t\ttmot\tHorizons TrueMotion Video Compression\n\t\t\tTR20\tDuck TrueMotion RealTime 2.0\n\t\t\tTSCC\tTechSmith Screen Capture Codec\n\t\t\tTV10\tTecomac Low-Bit Rate Codec\n\t\t\tTY2N\tTrident ?TY2N?\n\t\t\tU263\tUB Video H.263/H.263+/H.263++ Decoder\n\t\t\tUMP4\tUB Video MPEG 4 (www.ubvideo.com)\n\t\t\tUYNV\tNvidia UYVY packed 4:2:2\n\t\t\tUYVP\tEvans & Sutherland YCbCr 4:2:2 extended precision\n\t\t\tUCOD\teMajix.com ClearVideo\n\t\t\tULTI\tIBM Ultimotion\n\t\t\tUYVY\tUYVY packed 4:2:2\n\t\t\tV261\tLucent VX2000S\n\t\t\tVIFP\tVFAPI Reader Codec (www.yks.ne.jp/~hori/)\n\t\t\tVIV1\tFFmpeg H263+ decoder\n\t\t\tVIV2\tVivo H.263\n\t\t\tVQC2\tVector-quantised codec 2 (research) http://eprints.ecs.soton.ac.uk/archive/00001310/01/VTC97-js.pdf)\n\t\t\tVTLP\tAlaris VideoGramPiX\n\t\t\tVYU9\tATI YUV (VYU9)\n\t\t\tVYUY\tATI YUV (VYUY)\n\t\t\tV261\tLucent VX2000S\n\t\t\tV422\tVitec Multimedia 24-bit YUV 4:2:2 Format\n\t\t\tV655\tVitec Multimedia 16-bit YUV 4:2:2 Format\n\t\t\tVCR1\tATI Video Codec 1\n\t\t\tVCR2\tATI Video Codec 2\n\t\t\tVCR3\tATI VCR 3.0\n\t\t\tVCR4\tATI VCR 4.0\n\t\t\tVCR5\tATI VCR 5.0\n\t\t\tVCR6\tATI VCR 6.0\n\t\t\tVCR7\tATI VCR 7.0\n\t\t\tVCR8\tATI VCR 8.0\n\t\t\tVCR9\tATI VCR 9.0\n\t\t\tVDCT\tVitec Multimedia Video Maker Pro DIB\n\t\t\tVDOM\tVDOnet VDOWave\n\t\t\tVDOW\tVDOnet VDOLive (H.263)\n\t\t\tVDTZ\tDarim Vison VideoTizer YUV\n\t\t\tVGPX\tAlaris VideoGramPiX\n\t\t\tVIDS\tVitec Multimedia YUV 4:2:2 CCIR 601 for V422\n\t\t\tVIVO\tVivo H.263 v2.00\n\t\t\tvivo\tVivo H.263\n\t\t\tVIXL\tMiro/Pinnacle Video XL\n\t\t\tVLV1\tVideoLogic/PURE Digital Videologic Capture\n\t\t\tVP30\tOn2 VP3.0\n\t\t\tVP31\tOn2 VP3.1\n\t\t\tVP6F\tOn2 TrueMotion VP6\n\t\t\tVX1K\tLucent VX1000S Video Codec\n\t\t\tVX2K\tLucent VX2000S Video Codec\n\t\t\tVXSP\tLucent VX1000SP Video Codec\n\t\t\tWBVC\tWinbond W9960\n\t\t\tWHAM\tMicrosoft Video 1 (WHAM)\n\t\t\tWINX\tWinnov Software Compression\n\t\t\tWJPG\tAverMedia Winbond JPEG\n\t\t\tWMV1\tWindows Media Video V7\n\t\t\tWMV2\tWindows Media Video V8\n\t\t\tWMV3\tWindows Media Video V9\n\t\t\tWNV1\tWinnov Hardware Compression\n\t\t\tXYZP\tExtended PAL format XYZ palette (www.riff.org)\n\t\t\tx263\tXirlink H.263\n\t\t\tXLV0\tNetXL Video Decoder\n\t\t\tXMPG\tXing MPEG (I-Frame only)\n\t\t\tXVID\tXviD MPEG-4 (www.xvid.org)\n\t\t\tXXAN\t?XXAN?\n\t\t\tYU92\tIntel YUV (YU92)\n\t\t\tYUNV\tNvidia Uncompressed YUV 4:2:2\n\t\t\tYUVP\tExtended PAL format YUV palette (www.riff.org)\n\t\t\tY211\tYUV 2:1:1 Packed\n\t\t\tY411\tYUV 4:1:1 Packed\n\t\t\tY41B\tWeitek YUV 4:1:1 Planar\n\t\t\tY41P\tBrooktree PC1 YUV 4:1:1 Packed\n\t\t\tY41T\tBrooktree PC1 YUV 4:1:1 with transparency\n\t\t\tY42B\tWeitek YUV 4:2:2 Planar\n\t\t\tY42T\tBrooktree UYUV 4:2:2 with transparency\n\t\t\tY422\tADS Technologies Copy of UYVY used in Pyro WebCam firewire camera\n\t\t\tY800\tSimple, single Y plane for monochrome images\n\t\t\tY8  \tGrayscale video\n\t\t\tYC12\tIntel YUV 12 codec\n\t\t\tYUV8\tWinnov Caviar YUV8\n\t\t\tYUV9\tIntel YUV9\n\t\t\tYUY2\tUncompressed YUV 4:2:2\n\t\t\tYUYV\tCanopus YUV\n\t\t\tYV12\tYVU12 Planar\n\t\t\tYVU9\tIntel YVU9 Planar (8-bpp Y plane, followed by 8-bpp 4x4 U and V planes)\n\t\t\tYVYU\tYVYU 4:2:2 Packed\n\t\t\tZLIB\tLossless Codec Library zlib compression (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm)\n\t\t\tZPEG\tMetheus Video Zipper\n\n\t\t*/\n\n\t\treturn getid3_lib::EmbeddedLookup($fourcc, $begin, __LINE__, __FILE__, 'riff-fourcc');\n\t}\n\n\tprivate function EitherEndian2Int($byteword, $signed=false) {\n\t\tif ($this->container == 'riff') {\n\t\t\treturn getid3_lib::LittleEndian2Int($byteword, $signed);\n\t\t}\n\t\treturn getid3_lib::BigEndian2Int($byteword, false, $signed);\n\t}\n\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio.ac3.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio.ac3.php                                        //\n// module for analyzing AC-3 (aka Dolby Digital) audio files   //\n// dependencies: NONE                                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n\nclass getid3_ac3 extends getid3_handler\n{\n    private $AC3header = array();\n    private $BSIoffset = 0;\n\n    const syncword = \"\\x0B\\x77\";\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t///AH\n\t\t$info['ac3']['raw']['bsi'] = array();\n\t\t$thisfile_ac3              = &$info['ac3'];\n\t\t$thisfile_ac3_raw          = &$thisfile_ac3['raw'];\n\t\t$thisfile_ac3_raw_bsi      = &$thisfile_ac3_raw['bsi'];\n\n\n\t\t// http://www.atsc.org/standards/a_52a.pdf\n\n\t\t$info['fileformat'] = 'ac3';\n\n\t\t// An AC-3 serial coded audio bit stream is made up of a sequence of synchronization frames\n\t\t// Each synchronization frame contains 6 coded audio blocks (AB), each of which represent 256\n\t\t// new audio samples per channel. A synchronization information (SI) header at the beginning\n\t\t// of each frame contains information needed to acquire and maintain synchronization. A\n\t\t// bit stream information (BSI) header follows SI, and contains parameters describing the coded\n\t\t// audio service. The coded audio blocks may be followed by an auxiliary data (Aux) field. At the\n\t\t// end of each frame is an error check field that includes a CRC word for error detection. An\n\t\t// additional CRC word is located in the SI header, the use of which, by a decoder, is optional.\n\t\t//\n\t\t// syncinfo() | bsi() | AB0 | AB1 | AB2 | AB3 | AB4 | AB5 | Aux | CRC\n\n\t\t// syncinfo() {\n\t\t// \t syncword    16\n\t\t// \t crc1        16\n\t\t// \t fscod        2\n\t\t// \t frmsizecod   6\n\t\t// } /* end of syncinfo */\n\n\t\t$this->fseek($info['avdataoffset']);\n\t\t$this->AC3header['syncinfo'] = $this->fread(5);\n\n\t\tif (strpos($this->AC3header['syncinfo'], self::syncword) === 0) {\n\t\t\t$thisfile_ac3_raw['synchinfo']['synchword'] = self::syncword;\n\t\t\t$offset = 2;\n\t\t} else {\n\t\t\tif (!$this->isDependencyFor('matroska')) {\n\t\t\t\tunset($info['fileformat'], $info['ac3']);\n\t\t\t\treturn $this->error('Expecting \"'.getid3_lib::PrintHexBytes(self::syncword).'\" at offset '.$info['avdataoffset'].', found \"'.getid3_lib::PrintHexBytes(substr($this->AC3header['syncinfo'], 0, 2)).'\"');\n\t\t\t}\n\t\t\t$offset = 0;\n\t\t\t$this->fseek(-2, SEEK_CUR);\n\t\t}\n\n\t\t$info['audio']['dataformat']   = 'ac3';\n\t\t$info['audio']['bitrate_mode'] = 'cbr';\n\t\t$info['audio']['lossless']     = false;\n\n\t\t$thisfile_ac3_raw['synchinfo']['crc1']       = getid3_lib::LittleEndian2Int(substr($this->AC3header['syncinfo'], $offset, 2));\n\t\t$ac3_synchinfo_fscod_frmsizecod              = getid3_lib::LittleEndian2Int(substr($this->AC3header['syncinfo'], ($offset + 2), 1));\n\t\t$thisfile_ac3_raw['synchinfo']['fscod']      = ($ac3_synchinfo_fscod_frmsizecod & 0xC0) >> 6;\n\t\t$thisfile_ac3_raw['synchinfo']['frmsizecod'] = ($ac3_synchinfo_fscod_frmsizecod & 0x3F);\n\n\t\t$thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup($thisfile_ac3_raw['synchinfo']['fscod']);\n\t\tif ($thisfile_ac3_raw['synchinfo']['fscod'] <= 3) {\n\t\t\t$info['audio']['sample_rate'] = $thisfile_ac3['sample_rate'];\n\t\t}\n\n\t\t$thisfile_ac3['frame_length'] = self::frameSizeLookup($thisfile_ac3_raw['synchinfo']['frmsizecod'], $thisfile_ac3_raw['synchinfo']['fscod']);\n\t\t$thisfile_ac3['bitrate']      = self::bitrateLookup($thisfile_ac3_raw['synchinfo']['frmsizecod']);\n\t\t$info['audio']['bitrate'] = $thisfile_ac3['bitrate'];\n\n\t\t$this->AC3header['bsi'] = getid3_lib::BigEndian2Bin($this->fread(15));\n\t\t$ac3_bsi_offset = 0;\n\n\t\t$thisfile_ac3_raw_bsi['bsid'] = $this->readHeaderBSI(5);\n\t\tif ($thisfile_ac3_raw_bsi['bsid'] > 8) {\n\t\t\t// Decoders which can decode version 8 will thus be able to decode version numbers less than 8.\n\t\t\t// If this standard is extended by the addition of additional elements or features, a value of bsid greater than 8 will be used.\n\t\t\t// Decoders built to this version of the standard will not be able to decode versions with bsid greater than 8.\n\t\t\t$this->error('Bit stream identification is version '.$thisfile_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 8');\n\t\t    unset($info['ac3']);\n\t\t\treturn false;\n\t\t}\n\n\t\t$thisfile_ac3_raw_bsi['bsmod'] = $this->readHeaderBSI(3);\n\t\t$thisfile_ac3_raw_bsi['acmod'] = $this->readHeaderBSI(3);\n\n\t\t$thisfile_ac3['service_type'] = self::serviceTypeLookup($thisfile_ac3_raw_bsi['bsmod'], $thisfile_ac3_raw_bsi['acmod']);\n\t\t$ac3_coding_mode = self::audioCodingModeLookup($thisfile_ac3_raw_bsi['acmod']);\n\t\tforeach($ac3_coding_mode as $key => $value) {\n\t\t\t$thisfile_ac3[$key] = $value;\n\t\t}\n\t\tswitch ($thisfile_ac3_raw_bsi['acmod']) {\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\t\t$info['audio']['channelmode'] = 'mono';\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\tcase 4:\n\t\t\t\t$info['audio']['channelmode'] = 'stereo';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$info['audio']['channelmode'] = 'surround';\n\t\t\t\tbreak;\n\t\t}\n\t\t$info['audio']['channels'] = $thisfile_ac3['num_channels'];\n\n\t\tif ($thisfile_ac3_raw_bsi['acmod'] & 0x01) {\n\t\t\t// If the lsb of acmod is a 1, center channel is in use and cmixlev follows in the bit stream.\n\t\t\t$thisfile_ac3_raw_bsi['cmixlev'] = $this->readHeaderBSI(2);\n\t\t\t$thisfile_ac3['center_mix_level'] = self::centerMixLevelLookup($thisfile_ac3_raw_bsi['cmixlev']);\n\t\t}\n\n\t\tif ($thisfile_ac3_raw_bsi['acmod'] & 0x04) {\n\t\t\t// If the msb of acmod is a 1, surround channels are in use and surmixlev follows in the bit stream.\n\t\t\t$thisfile_ac3_raw_bsi['surmixlev'] = $this->readHeaderBSI(2);\n\t\t\t$thisfile_ac3['surround_mix_level'] = self::surroundMixLevelLookup($thisfile_ac3_raw_bsi['surmixlev']);\n\t\t}\n\n\t\tif ($thisfile_ac3_raw_bsi['acmod'] == 0x02) {\n\t\t\t// When operating in the two channel mode, this 2-bit code indicates whether or not the program has been encoded in Dolby Surround.\n\t\t\t$thisfile_ac3_raw_bsi['dsurmod'] = $this->readHeaderBSI(2);\n\t\t\t$thisfile_ac3['dolby_surround_mode'] = self::dolbySurroundModeLookup($thisfile_ac3_raw_bsi['dsurmod']);\n\t\t}\n\n\t\t$thisfile_ac3_raw_bsi['lfeon'] = (bool) $this->readHeaderBSI(1);\n\t\t$thisfile_ac3['lfe_enabled'] = $thisfile_ac3_raw_bsi['lfeon'];\n\t\tif ($thisfile_ac3_raw_bsi['lfeon']) {\n\t\t\t//$info['audio']['channels']++;\n\t\t\t$info['audio']['channels'] .= '.1';\n\t\t}\n\n\t\t$thisfile_ac3['channels_enabled'] = self::channelsEnabledLookup($thisfile_ac3_raw_bsi['acmod'], $thisfile_ac3_raw_bsi['lfeon']);\n\n\t\t// This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31.\n\t\t// The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent.\n\t\t$thisfile_ac3_raw_bsi['dialnorm'] = $this->readHeaderBSI(5);\n\t\t$thisfile_ac3['dialogue_normalization'] = '-'.$thisfile_ac3_raw_bsi['dialnorm'].'dB';\n\n\t\t$thisfile_ac3_raw_bsi['compre_flag'] = (bool) $this->readHeaderBSI(1);\n\t\tif ($thisfile_ac3_raw_bsi['compre_flag']) {\n\t\t\t$thisfile_ac3_raw_bsi['compr'] = $this->readHeaderBSI(8);\n\t\t\t$thisfile_ac3['heavy_compression'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr']);\n\t\t}\n\n\t\t$thisfile_ac3_raw_bsi['langcode_flag'] = (bool) $this->readHeaderBSI(1);\n\t\tif ($thisfile_ac3_raw_bsi['langcode_flag']) {\n\t\t\t$thisfile_ac3_raw_bsi['langcod'] = $this->readHeaderBSI(8);\n\t\t}\n\n\t\t$thisfile_ac3_raw_bsi['audprodie'] = (bool) $this->readHeaderBSI(1);\n\t\tif ($thisfile_ac3_raw_bsi['audprodie']) {\n\t\t\t$thisfile_ac3_raw_bsi['mixlevel'] = $this->readHeaderBSI(5);\n\t\t\t$thisfile_ac3_raw_bsi['roomtyp']  = $this->readHeaderBSI(2);\n\n\t\t\t$thisfile_ac3['mixing_level'] = (80 + $thisfile_ac3_raw_bsi['mixlevel']).'dB';\n\t\t\t$thisfile_ac3['room_type']    = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp']);\n\t\t}\n\n\t\tif ($thisfile_ac3_raw_bsi['acmod'] == 0x00) {\n\t\t\t// If acmod is 0, then two completely independent program channels (dual mono)\n\t\t\t// are encoded into the bit stream, and are referenced as Ch1, Ch2. In this case,\n\t\t\t// a number of additional items are present in BSI or audblk to fully describe Ch2.\n\n\t\t\t// This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31.\n\t\t\t// The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent.\n\t\t\t$thisfile_ac3_raw_bsi['dialnorm2'] = $this->readHeaderBSI(5);\n\t\t\t$thisfile_ac3['dialogue_normalization2'] = '-'.$thisfile_ac3_raw_bsi['dialnorm2'].'dB';\n\n\t\t\t$thisfile_ac3_raw_bsi['compre_flag2'] = (bool) $this->readHeaderBSI(1);\n\t\t\tif ($thisfile_ac3_raw_bsi['compre_flag2']) {\n\t\t\t\t$thisfile_ac3_raw_bsi['compr2'] = $this->readHeaderBSI(8);\n\t\t\t\t$thisfile_ac3['heavy_compression2'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr2']);\n\t\t\t}\n\n\t\t\t$thisfile_ac3_raw_bsi['langcode_flag2'] = (bool) $this->readHeaderBSI(1);\n\t\t\tif ($thisfile_ac3_raw_bsi['langcode_flag2']) {\n\t\t\t\t$thisfile_ac3_raw_bsi['langcod2'] = $this->readHeaderBSI(8);\n\t\t\t}\n\n\t\t\t$thisfile_ac3_raw_bsi['audprodie2'] = (bool) $this->readHeaderBSI(1);\n\t\t\tif ($thisfile_ac3_raw_bsi['audprodie2']) {\n\t\t\t\t$thisfile_ac3_raw_bsi['mixlevel2'] = $this->readHeaderBSI(5);\n\t\t\t\t$thisfile_ac3_raw_bsi['roomtyp2']  = $this->readHeaderBSI(2);\n\n\t\t\t\t$thisfile_ac3['mixing_level2'] = (80 + $thisfile_ac3_raw_bsi['mixlevel2']).'dB';\n\t\t\t\t$thisfile_ac3['room_type2']    = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp2']);\n\t\t\t}\n\n\t\t}\n\n\t\t$thisfile_ac3_raw_bsi['copyright'] = (bool) $this->readHeaderBSI(1);\n\n\t\t$thisfile_ac3_raw_bsi['original']  = (bool) $this->readHeaderBSI(1);\n\n\t\t$thisfile_ac3_raw_bsi['timecode1_flag'] = (bool) $this->readHeaderBSI(1);\n\t\tif ($thisfile_ac3_raw_bsi['timecode1_flag']) {\n\t\t\t$thisfile_ac3_raw_bsi['timecode1'] = $this->readHeaderBSI(14);\n\t\t}\n\n\t\t$thisfile_ac3_raw_bsi['timecode2_flag'] = (bool) $this->readHeaderBSI(1);\n\t\tif ($thisfile_ac3_raw_bsi['timecode2_flag']) {\n\t\t\t$thisfile_ac3_raw_bsi['timecode2'] = $this->readHeaderBSI(14);\n\t\t}\n\n\t\t$thisfile_ac3_raw_bsi['addbsi_flag'] = (bool) $this->readHeaderBSI(1);\n\t\tif ($thisfile_ac3_raw_bsi['addbsi_flag']) {\n\t\t\t$thisfile_ac3_raw_bsi['addbsi_length'] = $this->readHeaderBSI(6);\n\n\t\t\t$this->AC3header['bsi'] .= getid3_lib::BigEndian2Bin($this->fread($thisfile_ac3_raw_bsi['addbsi_length']));\n\n\t\t\t$thisfile_ac3_raw_bsi['addbsi_data'] = substr($this->AC3header['bsi'], $this->BSIoffset, $thisfile_ac3_raw_bsi['addbsi_length'] * 8);\n\t\t\t$this->BSIoffset += $thisfile_ac3_raw_bsi['addbsi_length'] * 8;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function readHeaderBSI($length) {\n\t\t$data = substr($this->AC3header['bsi'], $this->BSIoffset, $length);\n\t\t$this->BSIoffset += $length;\n\n\t\treturn bindec($data);\n\t}\n\n\tpublic static function sampleRateCodeLookup($fscod) {\n\t\tstatic $sampleRateCodeLookup = array(\n\t\t\t0 => 48000,\n\t\t\t1 => 44100,\n\t\t\t2 => 32000,\n\t\t\t3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute.\n\t\t);\n\t\treturn (isset($sampleRateCodeLookup[$fscod]) ? $sampleRateCodeLookup[$fscod] : false);\n\t}\n\n\tpublic static function serviceTypeLookup($bsmod, $acmod) {\n\t\tstatic $serviceTypeLookup = array();\n\t\tif (empty($serviceTypeLookup)) {\n\t\t\tfor ($i = 0; $i <= 7; $i++) {\n\t\t\t\t$serviceTypeLookup[0][$i] = 'main audio service: complete main (CM)';\n\t\t\t\t$serviceTypeLookup[1][$i] = 'main audio service: music and effects (ME)';\n\t\t\t\t$serviceTypeLookup[2][$i] = 'associated service: visually impaired (VI)';\n\t\t\t\t$serviceTypeLookup[3][$i] = 'associated service: hearing impaired (HI)';\n\t\t\t\t$serviceTypeLookup[4][$i] = 'associated service: dialogue (D)';\n\t\t\t\t$serviceTypeLookup[5][$i] = 'associated service: commentary (C)';\n\t\t\t\t$serviceTypeLookup[6][$i] = 'associated service: emergency (E)';\n\t\t\t}\n\n\t\t\t$serviceTypeLookup[7][1]      = 'associated service: voice over (VO)';\n\t\t\tfor ($i = 2; $i <= 7; $i++) {\n\t\t\t\t$serviceTypeLookup[7][$i] = 'main audio service: karaoke';\n\t\t\t}\n\t\t}\n\t\treturn (isset($serviceTypeLookup[$bsmod][$acmod]) ? $serviceTypeLookup[$bsmod][$acmod] : false);\n\t}\n\n\tpublic static function audioCodingModeLookup($acmod) {\n\t\t// array(channel configuration, # channels (not incl LFE), channel order)\n\t\tstatic $audioCodingModeLookup = array (\n\t\t\t0 => array('channel_config'=>'1+1', 'num_channels'=>2, 'channel_order'=>'Ch1,Ch2'),\n\t\t\t1 => array('channel_config'=>'1/0', 'num_channels'=>1, 'channel_order'=>'C'),\n\t\t\t2 => array('channel_config'=>'2/0', 'num_channels'=>2, 'channel_order'=>'L,R'),\n\t\t\t3 => array('channel_config'=>'3/0', 'num_channels'=>3, 'channel_order'=>'L,C,R'),\n\t\t\t4 => array('channel_config'=>'2/1', 'num_channels'=>3, 'channel_order'=>'L,R,S'),\n\t\t\t5 => array('channel_config'=>'3/1', 'num_channels'=>4, 'channel_order'=>'L,C,R,S'),\n\t\t\t6 => array('channel_config'=>'2/2', 'num_channels'=>4, 'channel_order'=>'L,R,SL,SR'),\n\t\t\t7 => array('channel_config'=>'3/2', 'num_channels'=>5, 'channel_order'=>'L,C,R,SL,SR'),\n\t\t);\n\t\treturn (isset($audioCodingModeLookup[$acmod]) ? $audioCodingModeLookup[$acmod] : false);\n\t}\n\n\tpublic static function centerMixLevelLookup($cmixlev) {\n\t\tstatic $centerMixLevelLookup;\n\t\tif (empty($centerMixLevelLookup)) {\n\t\t\t$centerMixLevelLookup = array(\n\t\t\t\t0 => pow(2, -3.0 / 6), // 0.707 (-3.0 dB)\n\t\t\t\t1 => pow(2, -4.5 / 6), // 0.595 (-4.5 dB)\n\t\t\t\t2 => pow(2, -6.0 / 6), // 0.500 (-6.0 dB)\n\t\t\t\t3 => 'reserved'\n\t\t\t);\n\t\t}\n\t\treturn (isset($centerMixLevelLookup[$cmixlev]) ? $centerMixLevelLookup[$cmixlev] : false);\n\t}\n\n\tpublic static function surroundMixLevelLookup($surmixlev) {\n\t\tstatic $surroundMixLevelLookup;\n\t\tif (empty($surroundMixLevelLookup)) {\n\t\t\t$surroundMixLevelLookup = array(\n\t\t\t\t0 => pow(2, -3.0 / 6),\n\t\t\t\t1 => pow(2, -6.0 / 6),\n\t\t\t\t2 => 0,\n\t\t\t\t3 => 'reserved'\n\t\t\t);\n\t\t}\n\t\treturn (isset($surroundMixLevelLookup[$surmixlev]) ? $surroundMixLevelLookup[$surmixlev] : false);\n\t}\n\n\tpublic static function dolbySurroundModeLookup($dsurmod) {\n\t\tstatic $dolbySurroundModeLookup = array(\n\t\t\t0 => 'not indicated',\n\t\t\t1 => 'Not Dolby Surround encoded',\n\t\t\t2 => 'Dolby Surround encoded',\n\t\t\t3 => 'reserved'\n\t\t);\n\t\treturn (isset($dolbySurroundModeLookup[$dsurmod]) ? $dolbySurroundModeLookup[$dsurmod] : false);\n\t}\n\n\tpublic static function channelsEnabledLookup($acmod, $lfeon) {\n\t\t$lookup = array(\n\t\t\t'ch1'=>(bool) ($acmod == 0),\n\t\t\t'ch2'=>(bool) ($acmod == 0),\n\t\t\t'left'=>(bool) ($acmod > 1),\n\t\t\t'right'=>(bool) ($acmod > 1),\n\t\t\t'center'=>(bool) ($acmod & 0x01),\n\t\t\t'surround_mono'=>false,\n\t\t\t'surround_left'=>false,\n\t\t\t'surround_right'=>false,\n\t\t\t'lfe'=>$lfeon);\n\t\tswitch ($acmod) {\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\t$lookup['surround_mono']  = true;\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\tcase 7:\n\t\t\t\t$lookup['surround_left']  = true;\n\t\t\t\t$lookup['surround_right'] = true;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn $lookup;\n\t}\n\n\tpublic static function heavyCompression($compre) {\n\t\t// The first four bits indicate gain changes in 6.02dB increments which can be\n\t\t// implemented with an arithmetic shift operation. The following four bits\n\t\t// indicate linear gain changes, and require a 5-bit multiply.\n\t\t// We will represent the two 4-bit fields of compr as follows:\n\t\t//   X0 X1 X2 X3 . Y4 Y5 Y6 Y7\n\t\t// The meaning of the X values is most simply described by considering X to represent a 4-bit\n\t\t// signed integer with values from -8 to +7. The gain indicated by X is then (X + 1) * 6.02 dB. The\n\t\t// following table shows this in detail.\n\n\t\t// Meaning of 4 msb of compr\n\t\t//  7    +48.16 dB\n\t\t//  6    +42.14 dB\n\t\t//  5    +36.12 dB\n\t\t//  4    +30.10 dB\n\t\t//  3    +24.08 dB\n\t\t//  2    +18.06 dB\n\t\t//  1    +12.04 dB\n\t\t//  0     +6.02 dB\n\t\t// -1         0 dB\n\t\t// -2     -6.02 dB\n\t\t// -3    -12.04 dB\n\t\t// -4    -18.06 dB\n\t\t// -5    -24.08 dB\n\t\t// -6    -30.10 dB\n\t\t// -7    -36.12 dB\n\t\t// -8    -42.14 dB\n\n\t\t$fourbit = str_pad(decbin(($compre & 0xF0) >> 4), 4, '0', STR_PAD_LEFT);\n\t\tif ($fourbit{0} == '1') {\n\t\t\t$log_gain = -8 + bindec(substr($fourbit, 1));\n\t\t} else {\n\t\t\t$log_gain = bindec(substr($fourbit, 1));\n\t\t}\n\t\t$log_gain = ($log_gain + 1) * getid3_lib::RGADamplitude2dB(2);\n\n\t\t// The value of Y is a linear representation of a gain change of up to -6 dB. Y is considered to\n\t\t// be an unsigned fractional integer, with a leading value of 1, or: 0.1 Y4 Y5 Y6 Y7 (base 2). Y can\n\t\t// represent values between 0.111112 (or 31/32) and 0.100002 (or 1/2). Thus, Y can represent gain\n\t\t// changes from -0.28 dB to -6.02 dB.\n\n\t\t$lin_gain = (16 + ($compre & 0x0F)) / 32;\n\n\t\t// The combination of X and Y values allows compr to indicate gain changes from\n\t\t//  48.16 - 0.28 = +47.89 dB, to\n\t\t// -42.14 - 6.02 = -48.16 dB.\n\n\t\treturn $log_gain - $lin_gain;\n\t}\n\n\tpublic static function roomTypeLookup($roomtyp) {\n\t\tstatic $roomTypeLookup = array(\n\t\t\t0 => 'not indicated',\n\t\t\t1 => 'large room, X curve monitor',\n\t\t\t2 => 'small room, flat monitor',\n\t\t\t3 => 'reserved'\n\t\t);\n\t\treturn (isset($roomTypeLookup[$roomtyp]) ? $roomTypeLookup[$roomtyp] : false);\n\t}\n\n\tpublic static function frameSizeLookup($frmsizecod, $fscod) {\n\t\t$padding     = (bool) ($frmsizecod % 2);\n\t\t$framesizeid =   floor($frmsizecod / 2);\n\n\t\tstatic $frameSizeLookup = array();\n\t\tif (empty($frameSizeLookup)) {\n\t\t\t$frameSizeLookup = array (\n\t\t\t\t0  => array(128, 138, 192),\n\t\t\t\t1  => array(40, 160, 174, 240),\n\t\t\t\t2  => array(48, 192, 208, 288),\n\t\t\t\t3  => array(56, 224, 242, 336),\n\t\t\t\t4  => array(64, 256, 278, 384),\n\t\t\t\t5  => array(80, 320, 348, 480),\n\t\t\t\t6  => array(96, 384, 416, 576),\n\t\t\t\t7  => array(112, 448, 486, 672),\n\t\t\t\t8  => array(128, 512, 556, 768),\n\t\t\t\t9  => array(160, 640, 696, 960),\n\t\t\t\t10 => array(192, 768, 834, 1152),\n\t\t\t\t11 => array(224, 896, 974, 1344),\n\t\t\t\t12 => array(256, 1024, 1114, 1536),\n\t\t\t\t13 => array(320, 1280, 1392, 1920),\n\t\t\t\t14 => array(384, 1536, 1670, 2304),\n\t\t\t\t15 => array(448, 1792, 1950, 2688),\n\t\t\t\t16 => array(512, 2048, 2228, 3072),\n\t\t\t\t17 => array(576, 2304, 2506, 3456),\n\t\t\t\t18 => array(640, 2560, 2786, 3840)\n\t\t\t);\n\t\t}\n\t\tif (($fscod == 1) && $padding) {\n\t\t\t// frame lengths are padded by 1 word (16 bits) at 44100\n\t\t\t$frameSizeLookup[$frmsizecod] += 2;\n\t\t}\n\t\treturn (isset($frameSizeLookup[$framesizeid][$fscod]) ? $frameSizeLookup[$framesizeid][$fscod] : false);\n\t}\n\n\tpublic static function bitrateLookup($frmsizecod) {\n\t\t$framesizeid =   floor($frmsizecod / 2);\n\n\t\tstatic $bitrateLookup = array(\n\t\t\t0  => 32000,\n\t\t\t1  => 40000,\n\t\t\t2  => 48000,\n\t\t\t3  => 56000,\n\t\t\t4  => 64000,\n\t\t\t5  => 80000,\n\t\t\t6  => 96000,\n\t\t\t7  => 112000,\n\t\t\t8  => 128000,\n\t\t\t9  => 160000,\n\t\t\t10 => 192000,\n\t\t\t11 => 224000,\n\t\t\t12 => 256000,\n\t\t\t13 => 320000,\n\t\t\t14 => 384000,\n\t\t\t15 => 448000,\n\t\t\t16 => 512000,\n\t\t\t17 => 576000,\n\t\t\t18 => 640000\n\t\t);\n\t\treturn (isset($bitrateLookup[$framesizeid]) ? $bitrateLookup[$framesizeid] : false);\n\t}\n\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio.dts.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio.dts.php                                        //\n// module for analyzing DTS Audio files                        //\n// dependencies: NONE                                          //\n//                                                             //\n/////////////////////////////////////////////////////////////////\n\n\n/**\n* @tutorial http://wiki.multimedia.cx/index.php?title=DTS\n*/\nclass getid3_dts extends getid3_handler\n{\n\t/**\n\t* Default DTS syncword used in native .cpt or .dts formats\n\t*/\n    const syncword = \"\\x7F\\xFE\\x80\\x01\";\n\n\tprivate $readBinDataOffset = 0;\n\n    /**\n    * Possible syncwords indicating bitstream encoding\n    */\n    public static $syncwords = array(\n    \t0 => \"\\x7F\\xFE\\x80\\x01\",  // raw big-endian\n    \t1 => \"\\xFE\\x7F\\x01\\x80\",  // raw little-endian\n    \t2 => \"\\x1F\\xFF\\xE8\\x00\",  // 14-bit big-endian\n    \t3 => \"\\xFF\\x1F\\x00\\xE8\"); // 14-bit little-endian\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\t\t$info['fileformat'] = 'dts';\n\n\t\t$this->fseek($info['avdataoffset']);\n\t\t$DTSheader = $this->fread(20); // we only need 2 words magic + 6 words frame header, but these words may be normal 16-bit words OR 14-bit words with 2 highest bits set to zero, so 8 words can be either 8*16/8 = 16 bytes OR 8*16*(16/14)/8 = 18.3 bytes\n\n\t\t// check syncword\n\t\t$sync = substr($DTSheader, 0, 4);\n        if (($encoding = array_search($sync, self::$syncwords)) !== false) {\n\n        \t$info['dts']['raw']['magic'] = $sync;\n\t\t\t$this->readBinDataOffset = 32;\n\n        } elseif ($this->isDependencyFor('matroska')) {\n\n\t\t\t// Matroska contains DTS without syncword encoded as raw big-endian format\n\t\t\t$encoding = 0;\n\t\t\t$this->readBinDataOffset = 0;\n\n        } else {\n\n\t\t\tunset($info['fileformat']);\n\t\t\treturn $this->error('Expecting \"'.implode('| ', array_map('getid3_lib::PrintHexBytes', self::$syncwords)).'\" at offset '.$info['avdataoffset'].', found \"'.getid3_lib::PrintHexBytes($sync).'\"');\n\n\t\t}\n\n\t\t// decode header\n\t\t$fhBS = '';\n\t\tfor ($word_offset = 0; $word_offset <= strlen($DTSheader); $word_offset += 2) {\n\t\t\tswitch ($encoding) {\n\t\t\t\tcase 0: // raw big-endian\n\t\t\t\t\t$fhBS .=        getid3_lib::BigEndian2Bin(       substr($DTSheader, $word_offset, 2) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1: // raw little-endian\n\t\t\t\t\t$fhBS .=        getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2)));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2: // 14-bit big-endian\n\t\t\t\t\t$fhBS .= substr(getid3_lib::BigEndian2Bin(       substr($DTSheader, $word_offset, 2) ), 2, 14);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3: // 14-bit little-endian\n\t\t\t\t\t$fhBS .= substr(getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2))), 2, 14);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$info['dts']['raw']['frame_type']             =        $this->readBinData($fhBS,  1);\n\t\t$info['dts']['raw']['deficit_samples']        =        $this->readBinData($fhBS,  5);\n\t\t$info['dts']['flags']['crc_present']          = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['raw']['pcm_sample_blocks']      =        $this->readBinData($fhBS,  7);\n\t\t$info['dts']['raw']['frame_byte_size']        =        $this->readBinData($fhBS, 14);\n\t\t$info['dts']['raw']['channel_arrangement']    =        $this->readBinData($fhBS,  6);\n\t\t$info['dts']['raw']['sample_frequency']       =        $this->readBinData($fhBS,  4);\n\t\t$info['dts']['raw']['bitrate']                =        $this->readBinData($fhBS,  5);\n\t\t$info['dts']['flags']['embedded_downmix']     = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['flags']['dynamicrange']         = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['flags']['timestamp']            = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['flags']['auxdata']              = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['flags']['hdcd']                 = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['raw']['extension_audio']        =        $this->readBinData($fhBS,  3);\n\t\t$info['dts']['flags']['extended_coding']      = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['flags']['audio_sync_insertion'] = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['raw']['lfe_effects']            =        $this->readBinData($fhBS,  2);\n\t\t$info['dts']['flags']['predictor_history']    = (bool) $this->readBinData($fhBS,  1);\n\t\tif ($info['dts']['flags']['crc_present']) {\n\t\t\t$info['dts']['raw']['crc16']              =        $this->readBinData($fhBS, 16);\n\t\t}\n\t\t$info['dts']['flags']['mri_perfect_reconst']  = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['raw']['encoder_soft_version']   =        $this->readBinData($fhBS,  4);\n\t\t$info['dts']['raw']['copy_history']           =        $this->readBinData($fhBS,  2);\n\t\t$info['dts']['raw']['bits_per_sample']        =        $this->readBinData($fhBS,  2);\n\t\t$info['dts']['flags']['surround_es']          = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['flags']['front_sum_diff']       = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['flags']['surround_sum_diff']    = (bool) $this->readBinData($fhBS,  1);\n\t\t$info['dts']['raw']['dialog_normalization']   =        $this->readBinData($fhBS,  4);\n\n\n\t\t$info['dts']['bitrate']              = self::bitrateLookup($info['dts']['raw']['bitrate']);\n\t\t$info['dts']['bits_per_sample']      = self::bitPerSampleLookup($info['dts']['raw']['bits_per_sample']);\n\t\t$info['dts']['sample_rate']          = self::sampleRateLookup($info['dts']['raw']['sample_frequency']);\n\t\t$info['dts']['dialog_normalization'] = self::dialogNormalization($info['dts']['raw']['dialog_normalization'], $info['dts']['raw']['encoder_soft_version']);\n\t\t$info['dts']['flags']['lossless']    = (($info['dts']['raw']['bitrate'] == 31) ? true  : false);\n\t\t$info['dts']['bitrate_mode']         = (($info['dts']['raw']['bitrate'] == 30) ? 'vbr' : 'cbr');\n\t\t$info['dts']['channels']             = self::numChannelsLookup($info['dts']['raw']['channel_arrangement']);\n\t\t$info['dts']['channel_arrangement']  = self::channelArrangementLookup($info['dts']['raw']['channel_arrangement']);\n\n\t\t$info['audio']['dataformat']          = 'dts';\n\t\t$info['audio']['lossless']            = $info['dts']['flags']['lossless'];\n\t\t$info['audio']['bitrate_mode']        = $info['dts']['bitrate_mode'];\n\t\t$info['audio']['bits_per_sample']     = $info['dts']['bits_per_sample'];\n\t\t$info['audio']['sample_rate']         = $info['dts']['sample_rate'];\n\t\t$info['audio']['channels']            = $info['dts']['channels'];\n\t\t$info['audio']['bitrate']             = $info['dts']['bitrate'];\n\t\tif (isset($info['avdataend']) && !empty($info['dts']['bitrate']) && is_numeric($info['dts']['bitrate'])) {\n\t\t\t$info['playtime_seconds']         = ($info['avdataend'] - $info['avdataoffset']) / ($info['dts']['bitrate'] / 8);\n\t\t\tif (($encoding == 2) || ($encoding == 3)) {\n\t\t\t\t// 14-bit data packed into 16-bit words, so the playtime is wrong because only (14/16) of the bytes in the data portion of the file are used at the specified bitrate\n\t\t\t\t$info['playtime_seconds'] *= (14 / 16);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate function readBinData($bin, $length) {\n\t\t$data = substr($bin, $this->readBinDataOffset, $length);\n\t\t$this->readBinDataOffset += $length;\n\n\t\treturn bindec($data);\n\t}\n\n\tpublic static function bitrateLookup($index) {\n\t\tstatic $lookup = array(\n\t\t\t0  => 32000,\n\t\t\t1  => 56000,\n\t\t\t2  => 64000,\n\t\t\t3  => 96000,\n\t\t\t4  => 112000,\n\t\t\t5  => 128000,\n\t\t\t6  => 192000,\n\t\t\t7  => 224000,\n\t\t\t8  => 256000,\n\t\t\t9  => 320000,\n\t\t\t10 => 384000,\n\t\t\t11 => 448000,\n\t\t\t12 => 512000,\n\t\t\t13 => 576000,\n\t\t\t14 => 640000,\n\t\t\t15 => 768000,\n\t\t\t16 => 960000,\n\t\t\t17 => 1024000,\n\t\t\t18 => 1152000,\n\t\t\t19 => 1280000,\n\t\t\t20 => 1344000,\n\t\t\t21 => 1408000,\n\t\t\t22 => 1411200,\n\t\t\t23 => 1472000,\n\t\t\t24 => 1536000,\n\t\t\t25 => 1920000,\n\t\t\t26 => 2048000,\n\t\t\t27 => 3072000,\n\t\t\t28 => 3840000,\n\t\t\t29 => 'open',\n\t\t\t30 => 'variable',\n\t\t\t31 => 'lossless',\n\t\t);\n\t\treturn (isset($lookup[$index]) ? $lookup[$index] : false);\n\t}\n\n\tpublic static function sampleRateLookup($index) {\n\t\tstatic $lookup = array(\n\t\t\t0  => 'invalid',\n\t\t\t1  => 8000,\n\t\t\t2  => 16000,\n\t\t\t3  => 32000,\n\t\t\t4  => 'invalid',\n\t\t\t5  => 'invalid',\n\t\t\t6  => 11025,\n\t\t\t7  => 22050,\n\t\t\t8  => 44100,\n\t\t\t9  => 'invalid',\n\t\t\t10 => 'invalid',\n\t\t\t11 => 12000,\n\t\t\t12 => 24000,\n\t\t\t13 => 48000,\n\t\t\t14 => 'invalid',\n\t\t\t15 => 'invalid',\n\t\t);\n\t\treturn (isset($lookup[$index]) ? $lookup[$index] : false);\n\t}\n\n\tpublic static function bitPerSampleLookup($index) {\n\t\tstatic $lookup = array(\n\t\t\t0  => 16,\n\t\t\t1  => 20,\n\t\t\t2  => 24,\n\t\t\t3  => 24,\n\t\t);\n\t\treturn (isset($lookup[$index]) ? $lookup[$index] : false);\n\t}\n\n\tpublic static function numChannelsLookup($index) {\n\t\tswitch ($index) {\n\t\t\tcase 0:\n\t\t\t\treturn 1;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\tcase 3:\n\t\t\tcase 4:\n\t\t\t\treturn 2;\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\tcase 6:\n\t\t\t\treturn 3;\n\t\t\t\tbreak;\n\t\t\tcase 7:\n\t\t\tcase 8:\n\t\t\t\treturn 4;\n\t\t\t\tbreak;\n\t\t\tcase 9:\n\t\t\t\treturn 5;\n\t\t\t\tbreak;\n\t\t\tcase 10:\n\t\t\tcase 11:\n\t\t\tcase 12:\n\t\t\t\treturn 6;\n\t\t\t\tbreak;\n\t\t\tcase 13:\n\t\t\t\treturn 7;\n\t\t\t\tbreak;\n\t\t\tcase 14:\n\t\t\tcase 15:\n\t\t\t\treturn 8;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static function channelArrangementLookup($index) {\n\t\tstatic $lookup = array(\n\t\t\t0  => 'A',\n\t\t\t1  => 'A + B (dual mono)',\n\t\t\t2  => 'L + R (stereo)',\n\t\t\t3  => '(L+R) + (L-R) (sum-difference)',\n\t\t\t4  => 'LT + RT (left and right total)',\n\t\t\t5  => 'C + L + R',\n\t\t\t6  => 'L + R + S',\n\t\t\t7  => 'C + L + R + S',\n\t\t\t8  => 'L + R + SL + SR',\n\t\t\t9  => 'C + L + R + SL + SR',\n\t\t\t10 => 'CL + CR + L + R + SL + SR',\n\t\t\t11 => 'C + L + R+ LR + RR + OV',\n\t\t\t12 => 'CF + CR + LF + RF + LR + RR',\n\t\t\t13 => 'CL + C + CR + L + R + SL + SR',\n\t\t\t14 => 'CL + CR + L + R + SL1 + SL2 + SR1 + SR2',\n\t\t\t15 => 'CL + C+ CR + L + R + SL + S + SR',\n\t\t);\n\t\treturn (isset($lookup[$index]) ? $lookup[$index] : 'user-defined');\n\t}\n\n\tpublic static function dialogNormalization($index, $version) {\n\t\tswitch ($version) {\n\t\t\tcase 7:\n\t\t\t\treturn 0 - $index;\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\treturn 0 - 16 - $index;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn false;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio.flac.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio.flac.php                                       //\n// module for analyzing FLAC and OggFLAC audio files           //\n// dependencies: module.audio.ogg.php                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true);\n\n/**\n* @tutorial http://flac.sourceforge.net/format.html\n*/\nclass getid3_flac extends getid3_handler\n{\n\tconst syncword = 'fLaC';\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t$this->fseek($info['avdataoffset']);\n\t\t$StreamMarker = $this->fread(4);\n\t\tif ($StreamMarker != self::syncword) {\n\t\t\treturn $this->error('Expecting \"'.getid3_lib::PrintHexBytes(self::syncword).'\" at offset '.$info['avdataoffset'].', found \"'.getid3_lib::PrintHexBytes($StreamMarker).'\"');\n\t\t}\n\t\t$info['fileformat']            = 'flac';\n\t\t$info['audio']['dataformat']   = 'flac';\n\t\t$info['audio']['bitrate_mode'] = 'vbr';\n\t\t$info['audio']['lossless']     = true;\n\n\t\t// parse flac container\n\t\treturn $this->parseMETAdata();\n\t}\n\n\tpublic function parseMETAdata() {\n\t\t$info = &$this->getid3->info;\n\t\tdo {\n\t\t\t$BlockOffset   = $this->ftell();\n\t\t\t$BlockHeader   = $this->fread(4);\n\t\t\t$LBFBT         = getid3_lib::BigEndian2Int(substr($BlockHeader, 0, 1));\n\t\t\t$LastBlockFlag = (bool) ($LBFBT & 0x80);\n\t\t\t$BlockType     =        ($LBFBT & 0x7F);\n\t\t\t$BlockLength   = getid3_lib::BigEndian2Int(substr($BlockHeader, 1, 3));\n\t\t\t$BlockTypeText = self::metaBlockTypeLookup($BlockType);\n\n\t\t\tif (($BlockOffset + 4 + $BlockLength) > $info['avdataend']) {\n\t\t\t\t$this->error('METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockTypeText.') at offset '.$BlockOffset.' extends beyond end of file');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ($BlockLength < 1) {\n\t\t\t\t$this->error('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockLength.') at offset '.$BlockOffset.' is invalid');\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$info['flac'][$BlockTypeText]['raw'] = array();\n\t\t\t$BlockTypeText_raw = &$info['flac'][$BlockTypeText]['raw'];\n\n\t\t\t$BlockTypeText_raw['offset']          = $BlockOffset;\n\t\t\t$BlockTypeText_raw['last_meta_block'] = $LastBlockFlag;\n\t\t\t$BlockTypeText_raw['block_type']      = $BlockType;\n\t\t\t$BlockTypeText_raw['block_type_text'] = $BlockTypeText;\n\t\t\t$BlockTypeText_raw['block_length']    = $BlockLength;\n\t\t\tif ($BlockTypeText_raw['block_type'] != 0x06) { // do not read attachment data automatically\n\t\t\t\t$BlockTypeText_raw['block_data']  = $this->fread($BlockLength);\n\t\t\t}\n\n\t\t\tswitch ($BlockTypeText) {\n\t\t\t\tcase 'STREAMINFO':     // 0x00\n\t\t\t\t\tif (!$this->parseSTREAMINFO($BlockTypeText_raw['block_data'])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PADDING':        // 0x01\n\t\t\t\t\tunset($info['flac']['PADDING']); // ignore\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'APPLICATION':    // 0x02\n\t\t\t\t\tif (!$this->parseAPPLICATION($BlockTypeText_raw['block_data'])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SEEKTABLE':      // 0x03\n\t\t\t\t\tif (!$this->parseSEEKTABLE($BlockTypeText_raw['block_data'])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'VORBIS_COMMENT': // 0x04\n\t\t\t\t\tif (!$this->parseVORBIS_COMMENT($BlockTypeText_raw['block_data'])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'CUESHEET':       // 0x05\n\t\t\t\t\tif (!$this->parseCUESHEET($BlockTypeText_raw['block_data'])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PICTURE':        // 0x06\n\t\t\t\t\tif (!$this->parsePICTURE()) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$this->warning('Unhandled METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockType.') at offset '.$BlockOffset);\n\t\t\t}\n\n\t\t\tunset($info['flac'][$BlockTypeText]['raw']);\n\t\t\t$info['avdataoffset'] = $this->ftell();\n\t\t}\n\t\twhile ($LastBlockFlag === false);\n\n\t\t// handle tags\n\t\tif (!empty($info['flac']['VORBIS_COMMENT']['comments'])) {\n\t\t\t$info['flac']['comments'] = $info['flac']['VORBIS_COMMENT']['comments'];\n\t\t}\n\t\tif (!empty($info['flac']['VORBIS_COMMENT']['vendor'])) {\n\t\t\t$info['audio']['encoder'] = str_replace('reference ', '', $info['flac']['VORBIS_COMMENT']['vendor']);\n\t\t}\n\n\t\t// copy attachments to 'comments' array if nesesary\n\t\tif (isset($info['flac']['PICTURE']) && ($this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE)) {\n\t\t\tforeach ($info['flac']['PICTURE'] as $entry) {\n\t\t\t\tif (!empty($entry['data'])) {\n\t\t\t\t\tif (!isset($info['flac']['comments']['picture'])) {\n\t\t\t\t\t\t$info['flac']['comments']['picture'] = array();\n\t\t\t\t\t}\n\t\t\t\t\t$comments_picture_data = array();\n\t\t\t\t\tforeach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) {\n\t\t\t\t\t\tif (isset($entry[$picture_key])) {\n\t\t\t\t\t\t\t$comments_picture_data[$picture_key] = $entry[$picture_key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$info['flac']['comments']['picture'][] = $comments_picture_data;\n\t\t\t\t\tunset($comments_picture_data);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isset($info['flac']['STREAMINFO'])) {\n\t\t\tif (!$this->isDependencyFor('matroska')) {\n\t\t\t\t$info['flac']['compressed_audio_bytes'] = $info['avdataend'] - $info['avdataoffset'];\n\t\t\t}\n\t\t\t$info['flac']['uncompressed_audio_bytes'] = $info['flac']['STREAMINFO']['samples_stream'] * $info['flac']['STREAMINFO']['channels'] * ($info['flac']['STREAMINFO']['bits_per_sample'] / 8);\n\t\t\tif ($info['flac']['uncompressed_audio_bytes'] == 0) {\n\t\t\t\treturn $this->error('Corrupt FLAC file: uncompressed_audio_bytes == zero');\n\t\t\t}\n\t\t\tif (!empty($info['flac']['compressed_audio_bytes'])) {\n\t\t\t\t$info['flac']['compression_ratio'] = $info['flac']['compressed_audio_bytes'] / $info['flac']['uncompressed_audio_bytes'];\n\t\t\t}\n\t\t}\n\n\t\t// set md5_data_source - built into flac 0.5+\n\t\tif (isset($info['flac']['STREAMINFO']['audio_signature'])) {\n\n\t\t\tif ($info['flac']['STREAMINFO']['audio_signature'] === str_repeat(\"\\x00\", 16)) {\n                $this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)');\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$info['md5_data_source'] = '';\n\t\t\t\t$md5 = $info['flac']['STREAMINFO']['audio_signature'];\n\t\t\t\tfor ($i = 0; $i < strlen($md5); $i++) {\n\t\t\t\t\t$info['md5_data_source'] .= str_pad(dechex(ord($md5[$i])), 2, '00', STR_PAD_LEFT);\n\t\t\t\t}\n\t\t\t\tif (!preg_match('/^[0-9a-f]{32}$/', $info['md5_data_source'])) {\n\t\t\t\t\tunset($info['md5_data_source']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isset($info['flac']['STREAMINFO']['bits_per_sample'])) {\n\t\t\t$info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample'];\n\t\t\tif ($info['audio']['bits_per_sample'] == 8) {\n\t\t\t\t// special case\n\t\t\t\t// must invert sign bit on all data bytes before MD5'ing to match FLAC's calculated value\n\t\t\t\t// MD5sum calculates on unsigned bytes, but FLAC calculated MD5 on 8-bit audio data as signed\n\t\t\t\t$this->warning('FLAC calculates MD5 data strangely on 8-bit audio, so the stored md5_data_source value will not match the decoded WAV file');\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function parseSTREAMINFO($BlockData) {\n\t\t$info = &$this->getid3->info;\n\n\t\t$info['flac']['STREAMINFO'] = array();\n\t\t$streaminfo = &$info['flac']['STREAMINFO'];\n\n\t\t$streaminfo['min_block_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 0, 2));\n\t\t$streaminfo['max_block_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 2, 2));\n\t\t$streaminfo['min_frame_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 4, 3));\n\t\t$streaminfo['max_frame_size']  = getid3_lib::BigEndian2Int(substr($BlockData, 7, 3));\n\n\t\t$SRCSBSS                       = getid3_lib::BigEndian2Bin(substr($BlockData, 10, 8));\n\t\t$streaminfo['sample_rate']     = getid3_lib::Bin2Dec(substr($SRCSBSS,  0, 20));\n\t\t$streaminfo['channels']        = getid3_lib::Bin2Dec(substr($SRCSBSS, 20,  3)) + 1;\n\t\t$streaminfo['bits_per_sample'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 23,  5)) + 1;\n\t\t$streaminfo['samples_stream']  = getid3_lib::Bin2Dec(substr($SRCSBSS, 28, 36));\n\n\t\t$streaminfo['audio_signature'] = substr($BlockData, 18, 16);\n\n\t\tif (!empty($streaminfo['sample_rate'])) {\n\n\t\t\t$info['audio']['bitrate_mode']    = 'vbr';\n\t\t\t$info['audio']['sample_rate']     = $streaminfo['sample_rate'];\n\t\t\t$info['audio']['channels']        = $streaminfo['channels'];\n\t\t\t$info['audio']['bits_per_sample'] = $streaminfo['bits_per_sample'];\n\t\t\t$info['playtime_seconds']         = $streaminfo['samples_stream'] / $streaminfo['sample_rate'];\n\t\t\tif ($info['playtime_seconds'] > 0) {\n\t\t\t\tif (!$this->isDependencyFor('matroska')) {\n\t\t\t\t\t$info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$this->warning('Cannot determine audio bitrate because total stream size is unknown');\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\treturn $this->error('Corrupt METAdata block: STREAMINFO');\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function parseAPPLICATION($BlockData) {\n\t\t$info = &$this->getid3->info;\n\n\t\t$ApplicationID = getid3_lib::BigEndian2Int(substr($BlockData, 0, 4));\n\t\t$info['flac']['APPLICATION'][$ApplicationID]['name'] = self::applicationIDLookup($ApplicationID);\n\t\t$info['flac']['APPLICATION'][$ApplicationID]['data'] = substr($BlockData, 4);\n\n\t\treturn true;\n\t}\n\n\tprivate function parseSEEKTABLE($BlockData) {\n\t\t$info = &$this->getid3->info;\n\n\t\t$offset = 0;\n\t\t$BlockLength = strlen($BlockData);\n\t\t$placeholderpattern = str_repeat(\"\\xFF\", 8);\n\t\twhile ($offset < $BlockLength) {\n\t\t\t$SampleNumberString = substr($BlockData, $offset, 8);\n\t\t\t$offset += 8;\n\t\t\tif ($SampleNumberString == $placeholderpattern) {\n\n\t\t\t\t// placeholder point\n\t\t\t\tgetid3_lib::safe_inc($info['flac']['SEEKTABLE']['placeholders'], 1);\n\t\t\t\t$offset += 10;\n\n\t\t\t} else {\n\n\t\t\t\t$SampleNumber                                        = getid3_lib::BigEndian2Int($SampleNumberString);\n\t\t\t\t$info['flac']['SEEKTABLE'][$SampleNumber]['offset']  = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));\n\t\t\t\t$offset += 8;\n\t\t\t\t$info['flac']['SEEKTABLE'][$SampleNumber]['samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 2));\n\t\t\t\t$offset += 2;\n\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate function parseVORBIS_COMMENT($BlockData) {\n\t\t$info = &$this->getid3->info;\n\n\t\t$getid3_ogg = new getid3_ogg($this->getid3);\n\t\tif ($this->isDependencyFor('matroska')) {\n\t\t\t$getid3_ogg->setStringMode($this->data_string);\n\t\t}\n\t\t$getid3_ogg->ParseVorbisComments();\n\t\tif (isset($info['ogg'])) {\n\t\t\tunset($info['ogg']['comments_raw']);\n\t\t\t$info['flac']['VORBIS_COMMENT'] = $info['ogg'];\n\t\t\tunset($info['ogg']);\n\t\t}\n\n\t\tunset($getid3_ogg);\n\n\t\treturn true;\n\t}\n\n\tprivate function parseCUESHEET($BlockData) {\n\t\t$info = &$this->getid3->info;\n\t\t$offset = 0;\n\t\t$info['flac']['CUESHEET']['media_catalog_number'] =                              trim(substr($BlockData, $offset, 128), \"\\0\");\n\t\t$offset += 128;\n\t\t$info['flac']['CUESHEET']['lead_in_samples']      =         getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));\n\t\t$offset += 8;\n\t\t$info['flac']['CUESHEET']['flags']['is_cd']       = (bool) (getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)) & 0x80);\n\t\t$offset += 1;\n\n\t\t$offset += 258; // reserved\n\n\t\t$info['flac']['CUESHEET']['number_tracks']        =         getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));\n\t\t$offset += 1;\n\n\t\tfor ($track = 0; $track < $info['flac']['CUESHEET']['number_tracks']; $track++) {\n\t\t\t$TrackSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));\n\t\t\t$offset += 8;\n\t\t\t$TrackNumber       = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));\n\t\t\t$offset += 1;\n\n\t\t\t$info['flac']['CUESHEET']['tracks'][$TrackNumber]['sample_offset']         = $TrackSampleOffset;\n\n\t\t\t$info['flac']['CUESHEET']['tracks'][$TrackNumber]['isrc']                  =                           substr($BlockData, $offset, 12);\n\t\t\t$offset += 12;\n\n\t\t\t$TrackFlagsRaw                                                             = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));\n\t\t\t$offset += 1;\n\t\t\t$info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['is_audio']     = (bool) ($TrackFlagsRaw & 0x80);\n\t\t\t$info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['pre_emphasis'] = (bool) ($TrackFlagsRaw & 0x40);\n\n\t\t\t$offset += 13; // reserved\n\n\t\t\t$info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']          = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));\n\t\t\t$offset += 1;\n\n\t\t\tfor ($index = 0; $index < $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']; $index++) {\n\t\t\t\t$IndexSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8));\n\t\t\t\t$offset += 8;\n\t\t\t\t$IndexNumber       = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1));\n\t\t\t\t$offset += 1;\n\n\t\t\t\t$offset += 3; // reserved\n\n\t\t\t\t$info['flac']['CUESHEET']['tracks'][$TrackNumber]['indexes'][$IndexNumber] = $IndexSampleOffset;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t* Parse METADATA_BLOCK_PICTURE flac structure and extract attachment\n\t* External usage: audio.ogg\n\t*/\n\tpublic function parsePICTURE() {\n\t\t$info = &$this->getid3->info;\n\n\t\t$picture['typeid']         = getid3_lib::BigEndian2Int($this->fread(4));\n\t\t$picture['picturetype']    = self::pictureTypeLookup($picture['typeid']);\n\t\t$picture['image_mime']     = $this->fread(getid3_lib::BigEndian2Int($this->fread(4)));\n\t\t$descr_length              = getid3_lib::BigEndian2Int($this->fread(4));\n\t\tif ($descr_length) {\n\t\t\t$picture['description'] = $this->fread($descr_length);\n\t\t}\n\t\t$picture['image_width']    = getid3_lib::BigEndian2Int($this->fread(4));\n\t\t$picture['image_height']   = getid3_lib::BigEndian2Int($this->fread(4));\n\t\t$picture['color_depth']    = getid3_lib::BigEndian2Int($this->fread(4));\n\t\t$picture['colors_indexed'] = getid3_lib::BigEndian2Int($this->fread(4));\n\t\t$picture['datalength']     = getid3_lib::BigEndian2Int($this->fread(4));\n\n\t\tif ($picture['image_mime'] == '-->') {\n\t\t\t$picture['data'] = $this->fread($picture['datalength']);\n\t\t} else {\n\t\t\t$picture['data'] = $this->saveAttachment(\n\t\t\t\tstr_replace('/', '_', $picture['picturetype']).'_'.$this->ftell(),\n\t\t\t\t$this->ftell(),\n\t\t\t\t$picture['datalength'],\n\t\t\t\t$picture['image_mime']);\n\t\t}\n\n\t\t$info['flac']['PICTURE'][] = $picture;\n\n\t\treturn true;\n\t}\n\n\tpublic static function metaBlockTypeLookup($blocktype) {\n\t\tstatic $lookup = array(\n\t\t\t0 => 'STREAMINFO',\n\t\t\t1 => 'PADDING',\n\t\t\t2 => 'APPLICATION',\n\t\t\t3 => 'SEEKTABLE',\n\t\t\t4 => 'VORBIS_COMMENT',\n\t\t\t5 => 'CUESHEET',\n\t\t\t6 => 'PICTURE',\n\t\t);\n\t\treturn (isset($lookup[$blocktype]) ? $lookup[$blocktype] : 'reserved');\n\t}\n\n\tpublic static function applicationIDLookup($applicationid) {\n\t\t// http://flac.sourceforge.net/id.html\n\t\tstatic $lookup = array(\n\t\t\t0x41544348 => 'FlacFile',                                                                           // \"ATCH\"\n\t\t\t0x42534F4C => 'beSolo',                                                                             // \"BSOL\"\n\t\t\t0x42554753 => 'Bugs Player',                                                                        // \"BUGS\"\n\t\t\t0x43756573 => 'GoldWave cue points (specification)',                                                // \"Cues\"\n\t\t\t0x46696361 => 'CUE Splitter',                                                                       // \"Fica\"\n\t\t\t0x46746F6C => 'flac-tools',                                                                         // \"Ftol\"\n\t\t\t0x4D4F5442 => 'MOTB MetaCzar',                                                                      // \"MOTB\"\n\t\t\t0x4D505345 => 'MP3 Stream Editor',                                                                  // \"MPSE\"\n\t\t\t0x4D754D4C => 'MusicML: Music Metadata Language',                                                   // \"MuML\"\n\t\t\t0x52494646 => 'Sound Devices RIFF chunk storage',                                                   // \"RIFF\"\n\t\t\t0x5346464C => 'Sound Font FLAC',                                                                    // \"SFFL\"\n\t\t\t0x534F4E59 => 'Sony Creative Software',                                                             // \"SONY\"\n\t\t\t0x5351455A => 'flacsqueeze',                                                                        // \"SQEZ\"\n\t\t\t0x54745776 => 'TwistedWave',                                                                        // \"TtWv\"\n\t\t\t0x55495453 => 'UITS Embedding tools',                                                               // \"UITS\"\n\t\t\t0x61696666 => 'FLAC AIFF chunk storage',                                                            // \"aiff\"\n\t\t\t0x696D6167 => 'flac-image application for storing arbitrary files in APPLICATION metadata blocks',  // \"imag\"\n\t\t\t0x7065656D => 'Parseable Embedded Extensible Metadata (specification)',                             // \"peem\"\n\t\t\t0x71667374 => 'QFLAC Studio',                                                                       // \"qfst\"\n\t\t\t0x72696666 => 'FLAC RIFF chunk storage',                                                            // \"riff\"\n\t\t\t0x74756E65 => 'TagTuner',                                                                           // \"tune\"\n\t\t\t0x78626174 => 'XBAT',                                                                               // \"xbat\"\n\t\t\t0x786D6364 => 'xmcd',                                                                               // \"xmcd\"\n\t\t);\n\t\treturn (isset($lookup[$applicationid]) ? $lookup[$applicationid] : 'reserved');\n\t}\n\n\tpublic static function pictureTypeLookup($type_id) {\n\t\tstatic $lookup = array (\n\t\t\t 0 => 'Other',\n\t\t\t 1 => '32x32 pixels \\'file icon\\' (PNG only)',\n\t\t\t 2 => 'Other file icon',\n\t\t\t 3 => 'Cover (front)',\n\t\t\t 4 => 'Cover (back)',\n\t\t\t 5 => 'Leaflet page',\n\t\t\t 6 => 'Media (e.g. label side of CD)',\n\t\t\t 7 => 'Lead artist/lead performer/soloist',\n\t\t\t 8 => 'Artist/performer',\n\t\t\t 9 => 'Conductor',\n\t\t\t10 => 'Band/Orchestra',\n\t\t\t11 => 'Composer',\n\t\t\t12 => 'Lyricist/text writer',\n\t\t\t13 => 'Recording Location',\n\t\t\t14 => 'During recording',\n\t\t\t15 => 'During performance',\n\t\t\t16 => 'Movie/video screen capture',\n\t\t\t17 => 'A bright coloured fish',\n\t\t\t18 => 'Illustration',\n\t\t\t19 => 'Band/artist logotype',\n\t\t\t20 => 'Publisher/Studio logotype',\n\t\t);\n\t\treturn (isset($lookup[$type_id]) ? $lookup[$type_id] : 'reserved');\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio.mp3.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio.mp3.php                                        //\n// module for analyzing MP3 files                              //\n// dependencies: NONE                                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n\n// number of frames to scan to determine if MPEG-audio sequence is valid\n// Lower this number to 5-20 for faster scanning\n// Increase this number to 50+ for most accurate detection of valid VBR/CBR\n// mpeg-audio streams\ndefine('GETID3_MP3_VALID_CHECK_FRAMES', 35);\n\n\nclass getid3_mp3 extends getid3_handler\n{\n\n\tpublic $allow_bruteforce = false; // forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow, unrecommended, but may provide data from otherwise-unusuable files\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t$initialOffset = $info['avdataoffset'];\n\n\t\tif (!$this->getOnlyMPEGaudioInfo($info['avdataoffset'])) {\n\t\t\tif ($this->allow_bruteforce) {\n\t\t\t\t$info['error'][] = 'Rescanning file in BruteForce mode';\n\t\t\t\t$this->getOnlyMPEGaudioInfoBruteForce($this->getid3->fp, $info);\n\t\t\t}\n\t\t}\n\n\n\t\tif (isset($info['mpeg']['audio']['bitrate_mode'])) {\n\t\t\t$info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);\n\t\t}\n\n\t\tif (((isset($info['id3v2']['headerlength']) && ($info['avdataoffset'] > $info['id3v2']['headerlength'])) || (!isset($info['id3v2']) && ($info['avdataoffset'] > 0) && ($info['avdataoffset'] != $initialOffset)))) {\n\n\t\t\t$synchoffsetwarning = 'Unknown data before synch ';\n\t\t\tif (isset($info['id3v2']['headerlength'])) {\n\t\t\t\t$synchoffsetwarning .= '(ID3v2 header ends at '.$info['id3v2']['headerlength'].', then '.($info['avdataoffset'] - $info['id3v2']['headerlength']).' bytes garbage, ';\n\t\t\t} elseif ($initialOffset > 0) {\n\t\t\t\t$synchoffsetwarning .= '(should be at '.$initialOffset.', ';\n\t\t\t} else {\n\t\t\t\t$synchoffsetwarning .= '(should be at beginning of file, ';\n\t\t\t}\n\t\t\t$synchoffsetwarning .= 'synch detected at '.$info['avdataoffset'].')';\n\t\t\tif (isset($info['audio']['bitrate_mode']) && ($info['audio']['bitrate_mode'] == 'cbr')) {\n\n\t\t\t\tif (!empty($info['id3v2']['headerlength']) && (($info['avdataoffset'] - $info['id3v2']['headerlength']) == $info['mpeg']['audio']['framelength'])) {\n\n\t\t\t\t\t$synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90-3.92) DLL in CBR mode.';\n\t\t\t\t\t$info['audio']['codec'] = 'LAME';\n\t\t\t\t\t$CurrentDataLAMEversionString = 'LAME3.';\n\n\t\t\t\t} elseif (empty($info['id3v2']['headerlength']) && ($info['avdataoffset'] == $info['mpeg']['audio']['framelength'])) {\n\n\t\t\t\t\t$synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90 - 3.92) DLL in CBR mode.';\n\t\t\t\t\t$info['audio']['codec'] = 'LAME';\n\t\t\t\t\t$CurrentDataLAMEversionString = 'LAME3.';\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t$info['warning'][] = $synchoffsetwarning;\n\n\t\t}\n\n\t\tif (isset($info['mpeg']['audio']['LAME'])) {\n\t\t\t$info['audio']['codec'] = 'LAME';\n\t\t\tif (!empty($info['mpeg']['audio']['LAME']['long_version'])) {\n\t\t\t\t$info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['long_version'], \"\\x00\");\n\t\t\t} elseif (!empty($info['mpeg']['audio']['LAME']['short_version'])) {\n\t\t\t\t$info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['short_version'], \"\\x00\");\n\t\t\t}\n\t\t}\n\n\t\t$CurrentDataLAMEversionString = (!empty($CurrentDataLAMEversionString) ? $CurrentDataLAMEversionString : (isset($info['audio']['encoder']) ? $info['audio']['encoder'] : ''));\n\t\tif (!empty($CurrentDataLAMEversionString) && (substr($CurrentDataLAMEversionString, 0, 6) == 'LAME3.') && !preg_match('[0-9\\)]', substr($CurrentDataLAMEversionString, -1))) {\n\t\t\t// a version number of LAME that does not end with a number like \"LAME3.92\"\n\t\t\t// or with a closing parenthesis like \"LAME3.88 (alpha)\"\n\t\t\t// or a version of LAME with the LAMEtag-not-filled-in-DLL-mode bug (3.90-3.92)\n\n\t\t\t// not sure what the actual last frame length will be, but will be less than or equal to 1441\n\t\t\t$PossiblyLongerLAMEversion_FrameLength = 1441;\n\n\t\t\t// Not sure what version of LAME this is - look in padding of last frame for longer version string\n\t\t\t$PossibleLAMEversionStringOffset = $info['avdataend'] - $PossiblyLongerLAMEversion_FrameLength;\n\t\t\t$this->fseek($PossibleLAMEversionStringOffset);\n\t\t\t$PossiblyLongerLAMEversion_Data = $this->fread($PossiblyLongerLAMEversion_FrameLength);\n\t\t\tswitch (substr($CurrentDataLAMEversionString, -1)) {\n\t\t\t\tcase 'a':\n\t\t\t\tcase 'b':\n\t\t\t\t\t// \"LAME3.94a\" will have a longer version string of \"LAME3.94 (alpha)\" for example\n\t\t\t\t\t// need to trim off \"a\" to match longer string\n\t\t\t\t\t$CurrentDataLAMEversionString = substr($CurrentDataLAMEversionString, 0, -1);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (($PossiblyLongerLAMEversion_String = strstr($PossiblyLongerLAMEversion_Data, $CurrentDataLAMEversionString)) !== false) {\n\t\t\t\tif (substr($PossiblyLongerLAMEversion_String, 0, strlen($CurrentDataLAMEversionString)) == $CurrentDataLAMEversionString) {\n\t\t\t\t\t$PossiblyLongerLAMEversion_NewString = substr($PossiblyLongerLAMEversion_String, 0, strspn($PossiblyLongerLAMEversion_String, 'LAME0123456789., (abcdefghijklmnopqrstuvwxyzJFSOND)')); //\"LAME3.90.3\"  \"LAME3.87 (beta 1, Sep 27 2000)\" \"LAME3.88 (beta)\"\n\t\t\t\t\tif (empty($info['audio']['encoder']) || (strlen($PossiblyLongerLAMEversion_NewString) > strlen($info['audio']['encoder']))) {\n\t\t\t\t\t\t$info['audio']['encoder'] = $PossiblyLongerLAMEversion_NewString;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!empty($info['audio']['encoder'])) {\n\t\t\t$info['audio']['encoder'] = rtrim($info['audio']['encoder'], \"\\x00 \");\n\t\t}\n\n\t\tswitch (isset($info['mpeg']['audio']['layer']) ? $info['mpeg']['audio']['layer'] : '') {\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\t$info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer'];\n\t\t\t\tbreak;\n\t\t}\n\t\tif (isset($info['fileformat']) && ($info['fileformat'] == 'mp3')) {\n\t\t\tswitch ($info['audio']['dataformat']) {\n\t\t\t\tcase 'mp1':\n\t\t\t\tcase 'mp2':\n\t\t\t\tcase 'mp3':\n\t\t\t\t\t$info['fileformat'] = $info['audio']['dataformat'];\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$info['warning'][] = 'Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually \"'.$info['audio']['dataformat'].'\"';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (empty($info['fileformat'])) {\n\t\t\tunset($info['fileformat']);\n\t\t\tunset($info['audio']['bitrate_mode']);\n\t\t\tunset($info['avdataoffset']);\n\t\t\tunset($info['avdataend']);\n\t\t\treturn false;\n\t\t}\n\n\t\t$info['mime_type']         = 'audio/mpeg';\n\t\t$info['audio']['lossless'] = false;\n\n\t\t// Calculate playtime\n\t\tif (!isset($info['playtime_seconds']) && isset($info['audio']['bitrate']) && ($info['audio']['bitrate'] > 0)) {\n\t\t\t$info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) * 8 / $info['audio']['bitrate'];\n\t\t}\n\n\t\t$info['audio']['encoder_options'] = $this->GuessEncoderOptions();\n\n\t\treturn true;\n\t}\n\n\n\tpublic function GuessEncoderOptions() {\n\t\t// shortcuts\n\t\t$info = &$this->getid3->info;\n\t\tif (!empty($info['mpeg']['audio'])) {\n\t\t\t$thisfile_mpeg_audio = &$info['mpeg']['audio'];\n\t\t\tif (!empty($thisfile_mpeg_audio['LAME'])) {\n\t\t\t\t$thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME'];\n\t\t\t}\n\t\t}\n\n\t\t$encoder_options = '';\n\t\tstatic $NamedPresetBitrates = array(16, 24, 40, 56, 112, 128, 160, 192, 256);\n\n\t\tif (isset($thisfile_mpeg_audio['VBR_method']) && ($thisfile_mpeg_audio['VBR_method'] == 'Fraunhofer') && !empty($thisfile_mpeg_audio['VBR_quality'])) {\n\n\t\t\t$encoder_options = 'VBR q'.$thisfile_mpeg_audio['VBR_quality'];\n\n\t\t} elseif (!empty($thisfile_mpeg_audio_lame['preset_used']) && (!in_array($thisfile_mpeg_audio_lame['preset_used_id'], $NamedPresetBitrates))) {\n\n\t\t\t$encoder_options = $thisfile_mpeg_audio_lame['preset_used'];\n\n\t\t} elseif (!empty($thisfile_mpeg_audio_lame['vbr_quality'])) {\n\n\t\t\tstatic $KnownEncoderValues = array();\n\t\t\tif (empty($KnownEncoderValues)) {\n\n\t\t\t\t//$KnownEncoderValues[abrbitrate_minbitrate][vbr_quality][raw_vbr_method][raw_noise_shaping][raw_stereo_mode][ath_type][lowpass_frequency] = 'preset name';\n\t\t\t\t$KnownEncoderValues[0xFF][58][1][1][3][2][20500] = '--alt-preset insane';        // 3.90,   3.90.1, 3.92\n\t\t\t\t$KnownEncoderValues[0xFF][58][1][1][3][2][20600] = '--alt-preset insane';        // 3.90.2, 3.90.3, 3.91\n\t\t\t\t$KnownEncoderValues[0xFF][57][1][1][3][4][20500] = '--alt-preset insane';        // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues['**'][78][3][2][3][2][19500] = '--alt-preset extreme';       // 3.90,   3.90.1, 3.92\n\t\t\t\t$KnownEncoderValues['**'][78][3][2][3][2][19600] = '--alt-preset extreme';       // 3.90.2, 3.91\n\t\t\t\t$KnownEncoderValues['**'][78][3][1][3][2][19600] = '--alt-preset extreme';       // 3.90.3\n\t\t\t\t$KnownEncoderValues['**'][78][4][2][3][2][19500] = '--alt-preset fast extreme';  // 3.90,   3.90.1, 3.92\n\t\t\t\t$KnownEncoderValues['**'][78][4][2][3][2][19600] = '--alt-preset fast extreme';  // 3.90.2, 3.90.3, 3.91\n\t\t\t\t$KnownEncoderValues['**'][78][3][2][3][4][19000] = '--alt-preset standard';      // 3.90,   3.90.1, 3.90.2, 3.91, 3.92\n\t\t\t\t$KnownEncoderValues['**'][78][3][1][3][4][19000] = '--alt-preset standard';      // 3.90.3\n\t\t\t\t$KnownEncoderValues['**'][78][4][2][3][4][19000] = '--alt-preset fast standard'; // 3.90,   3.90.1, 3.90.2, 3.91, 3.92\n\t\t\t\t$KnownEncoderValues['**'][78][4][1][3][4][19000] = '--alt-preset fast standard'; // 3.90.3\n\t\t\t\t$KnownEncoderValues['**'][88][4][1][3][3][19500] = '--r3mix';                    // 3.90,   3.90.1, 3.92\n\t\t\t\t$KnownEncoderValues['**'][88][4][1][3][3][19600] = '--r3mix';                    // 3.90.2, 3.90.3, 3.91\n\t\t\t\t$KnownEncoderValues['**'][67][4][1][3][4][18000] = '--r3mix';                    // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues['**'][68][3][2][3][4][18000] = '--alt-preset medium';        // 3.90.3\n\t\t\t\t$KnownEncoderValues['**'][68][4][2][3][4][18000] = '--alt-preset fast medium';   // 3.90.3\n\n\t\t\t\t$KnownEncoderValues[0xFF][99][1][1][1][2][0]     = '--preset studio';            // 3.90,   3.90.1, 3.90.2, 3.91, 3.92\n\t\t\t\t$KnownEncoderValues[0xFF][58][2][1][3][2][20600] = '--preset studio';            // 3.90.3, 3.93.1\n\t\t\t\t$KnownEncoderValues[0xFF][58][2][1][3][2][20500] = '--preset studio';            // 3.93\n\t\t\t\t$KnownEncoderValues[0xFF][57][2][1][3][4][20500] = '--preset studio';            // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues[0xC0][88][1][1][1][2][0]     = '--preset cd';                // 3.90,   3.90.1, 3.90.2,   3.91, 3.92\n\t\t\t\t$KnownEncoderValues[0xC0][58][2][2][3][2][19600] = '--preset cd';                // 3.90.3, 3.93.1\n\t\t\t\t$KnownEncoderValues[0xC0][58][2][2][3][2][19500] = '--preset cd';                // 3.93\n\t\t\t\t$KnownEncoderValues[0xC0][57][2][1][3][4][19500] = '--preset cd';                // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues[0xA0][78][1][1][3][2][18000] = '--preset hifi';              // 3.90,   3.90.1, 3.90.2,   3.91, 3.92\n\t\t\t\t$KnownEncoderValues[0xA0][58][2][2][3][2][18000] = '--preset hifi';              // 3.90.3, 3.93,   3.93.1\n\t\t\t\t$KnownEncoderValues[0xA0][57][2][1][3][4][18000] = '--preset hifi';              // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues[0x80][67][1][1][3][2][18000] = '--preset tape';              // 3.90,   3.90.1, 3.90.2,   3.91, 3.92\n\t\t\t\t$KnownEncoderValues[0x80][67][1][1][3][2][15000] = '--preset radio';             // 3.90,   3.90.1, 3.90.2,   3.91, 3.92\n\t\t\t\t$KnownEncoderValues[0x70][67][1][1][3][2][15000] = '--preset fm';                // 3.90,   3.90.1, 3.90.2,   3.91, 3.92\n\t\t\t\t$KnownEncoderValues[0x70][58][2][2][3][2][16000] = '--preset tape/radio/fm';     // 3.90.3, 3.93,   3.93.1\n\t\t\t\t$KnownEncoderValues[0x70][57][2][1][3][4][16000] = '--preset tape/radio/fm';     // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues[0x38][58][2][2][0][2][10000] = '--preset voice';             // 3.90.3, 3.93,   3.93.1\n\t\t\t\t$KnownEncoderValues[0x38][57][2][1][0][4][15000] = '--preset voice';             // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues[0x38][57][2][1][0][4][16000] = '--preset voice';             // 3.94a14\n\t\t\t\t$KnownEncoderValues[0x28][65][1][1][0][2][7500]  = '--preset mw-us';             // 3.90,   3.90.1, 3.92\n\t\t\t\t$KnownEncoderValues[0x28][65][1][1][0][2][7600]  = '--preset mw-us';             // 3.90.2, 3.91\n\t\t\t\t$KnownEncoderValues[0x28][58][2][2][0][2][7000]  = '--preset mw-us';             // 3.90.3, 3.93,   3.93.1\n\t\t\t\t$KnownEncoderValues[0x28][57][2][1][0][4][10500] = '--preset mw-us';             // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues[0x28][57][2][1][0][4][11200] = '--preset mw-us';             // 3.94a14\n\t\t\t\t$KnownEncoderValues[0x28][57][2][1][0][4][8800]  = '--preset mw-us';             // 3.94a15\n\t\t\t\t$KnownEncoderValues[0x18][58][2][2][0][2][4000]  = '--preset phon+/lw/mw-eu/sw'; // 3.90.3, 3.93.1\n\t\t\t\t$KnownEncoderValues[0x18][58][2][2][0][2][3900]  = '--preset phon+/lw/mw-eu/sw'; // 3.93\n\t\t\t\t$KnownEncoderValues[0x18][57][2][1][0][4][5900]  = '--preset phon+/lw/mw-eu/sw'; // 3.94,   3.95\n\t\t\t\t$KnownEncoderValues[0x18][57][2][1][0][4][6200]  = '--preset phon+/lw/mw-eu/sw'; // 3.94a14\n\t\t\t\t$KnownEncoderValues[0x18][57][2][1][0][4][3200]  = '--preset phon+/lw/mw-eu/sw'; // 3.94a15\n\t\t\t\t$KnownEncoderValues[0x10][58][2][2][0][2][3800]  = '--preset phone';             // 3.90.3, 3.93.1\n\t\t\t\t$KnownEncoderValues[0x10][58][2][2][0][2][3700]  = '--preset phone';             // 3.93\n\t\t\t\t$KnownEncoderValues[0x10][57][2][1][0][4][5600]  = '--preset phone';             // 3.94,   3.95\n\t\t\t}\n\n\t\t\tif (isset($KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) {\n\n\t\t\t\t$encoder_options = $KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']];\n\n\t\t\t} elseif (isset($KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) {\n\n\t\t\t\t$encoder_options = $KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']];\n\n\t\t\t} elseif ($info['audio']['bitrate_mode'] == 'vbr') {\n\n\t\t\t\t// http://gabriel.mp3-tech.org/mp3infotag.html\n\t\t\t\t// int    Quality = (100 - 10 * gfp->VBR_q - gfp->quality)h\n\n\n\t\t\t\t$LAME_V_value = 10 - ceil($thisfile_mpeg_audio_lame['vbr_quality'] / 10);\n\t\t\t\t$LAME_q_value = 100 - $thisfile_mpeg_audio_lame['vbr_quality'] - ($LAME_V_value * 10);\n\t\t\t\t$encoder_options = '-V'.$LAME_V_value.' -q'.$LAME_q_value;\n\n\t\t\t} elseif ($info['audio']['bitrate_mode'] == 'cbr') {\n\n\t\t\t\t$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000);\n\n\t\t\t} else {\n\n\t\t\t\t$encoder_options = strtoupper($info['audio']['bitrate_mode']);\n\n\t\t\t}\n\n\t\t} elseif (!empty($thisfile_mpeg_audio_lame['bitrate_abr'])) {\n\n\t\t\t$encoder_options = 'ABR'.$thisfile_mpeg_audio_lame['bitrate_abr'];\n\n\t\t} elseif (!empty($info['audio']['bitrate'])) {\n\n\t\t\tif ($info['audio']['bitrate_mode'] == 'cbr') {\n\t\t\t\t$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000);\n\t\t\t} else {\n\t\t\t\t$encoder_options = strtoupper($info['audio']['bitrate_mode']);\n\t\t\t}\n\n\t\t}\n\t\tif (!empty($thisfile_mpeg_audio_lame['bitrate_min'])) {\n\t\t\t$encoder_options .= ' -b'.$thisfile_mpeg_audio_lame['bitrate_min'];\n\t\t}\n\n\t\tif (!empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']) || !empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'])) {\n\t\t\t$encoder_options .= ' --nogap';\n\t\t}\n\n\t\tif (!empty($thisfile_mpeg_audio_lame['lowpass_frequency'])) {\n\t\t\t$ExplodedOptions = explode(' ', $encoder_options, 4);\n\t\t\tif ($ExplodedOptions[0] == '--r3mix') {\n\t\t\t\t$ExplodedOptions[1] = 'r3mix';\n\t\t\t}\n\t\t\tswitch ($ExplodedOptions[0]) {\n\t\t\t\tcase '--preset':\n\t\t\t\tcase '--alt-preset':\n\t\t\t\tcase '--r3mix':\n\t\t\t\t\tif ($ExplodedOptions[1] == 'fast') {\n\t\t\t\t\t\t$ExplodedOptions[1] .= ' '.$ExplodedOptions[2];\n\t\t\t\t\t}\n\t\t\t\t\tswitch ($ExplodedOptions[1]) {\n\t\t\t\t\t\tcase 'portable':\n\t\t\t\t\t\tcase 'medium':\n\t\t\t\t\t\tcase 'standard':\n\t\t\t\t\t\tcase 'extreme':\n\t\t\t\t\t\tcase 'insane':\n\t\t\t\t\t\tcase 'fast portable':\n\t\t\t\t\t\tcase 'fast medium':\n\t\t\t\t\t\tcase 'fast standard':\n\t\t\t\t\t\tcase 'fast extreme':\n\t\t\t\t\t\tcase 'fast insane':\n\t\t\t\t\t\tcase 'r3mix':\n\t\t\t\t\t\t\tstatic $ExpectedLowpass = array(\n\t\t\t\t\t\t\t\t\t'insane|20500'        => 20500,\n\t\t\t\t\t\t\t\t\t'insane|20600'        => 20600,  // 3.90.2, 3.90.3, 3.91\n\t\t\t\t\t\t\t\t\t'medium|18000'        => 18000,\n\t\t\t\t\t\t\t\t\t'fast medium|18000'   => 18000,\n\t\t\t\t\t\t\t\t\t'extreme|19500'       => 19500,  // 3.90,   3.90.1, 3.92, 3.95\n\t\t\t\t\t\t\t\t\t'extreme|19600'       => 19600,  // 3.90.2, 3.90.3, 3.91, 3.93.1\n\t\t\t\t\t\t\t\t\t'fast extreme|19500'  => 19500,  // 3.90,   3.90.1, 3.92, 3.95\n\t\t\t\t\t\t\t\t\t'fast extreme|19600'  => 19600,  // 3.90.2, 3.90.3, 3.91, 3.93.1\n\t\t\t\t\t\t\t\t\t'standard|19000'      => 19000,\n\t\t\t\t\t\t\t\t\t'fast standard|19000' => 19000,\n\t\t\t\t\t\t\t\t\t'r3mix|19500'         => 19500,  // 3.90,   3.90.1, 3.92\n\t\t\t\t\t\t\t\t\t'r3mix|19600'         => 19600,  // 3.90.2, 3.90.3, 3.91\n\t\t\t\t\t\t\t\t\t'r3mix|18000'         => 18000,  // 3.94,   3.95\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']]) && ($thisfile_mpeg_audio_lame['lowpass_frequency'] < 22050) && (round($thisfile_mpeg_audio_lame['lowpass_frequency'] / 1000) < round($thisfile_mpeg_audio['sample_rate'] / 2000))) {\n\t\t\t\t\t\t\t\t$encoder_options .= ' --lowpass '.$thisfile_mpeg_audio_lame['lowpass_frequency'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (isset($thisfile_mpeg_audio_lame['raw']['source_sample_freq'])) {\n\t\t\tif (($thisfile_mpeg_audio['sample_rate'] == 44100) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 1)) {\n\t\t\t\t$encoder_options .= ' --resample 44100';\n\t\t\t} elseif (($thisfile_mpeg_audio['sample_rate'] == 48000) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 2)) {\n\t\t\t\t$encoder_options .= ' --resample 48000';\n\t\t\t} elseif ($thisfile_mpeg_audio['sample_rate'] < 44100) {\n\t\t\t\tswitch ($thisfile_mpeg_audio_lame['raw']['source_sample_freq']) {\n\t\t\t\t\tcase 0: // <= 32000\n\t\t\t\t\t\t// may or may not be same as source frequency - ignore\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1: // 44100\n\t\t\t\t\tcase 2: // 48000\n\t\t\t\t\tcase 3: // 48000+\n\t\t\t\t\t\t$ExplodedOptions = explode(' ', $encoder_options, 4);\n\t\t\t\t\t\tswitch ($ExplodedOptions[0]) {\n\t\t\t\t\t\t\tcase '--preset':\n\t\t\t\t\t\t\tcase '--alt-preset':\n\t\t\t\t\t\t\t\tswitch ($ExplodedOptions[1]) {\n\t\t\t\t\t\t\t\t\tcase 'fast':\n\t\t\t\t\t\t\t\t\tcase 'portable':\n\t\t\t\t\t\t\t\t\tcase 'medium':\n\t\t\t\t\t\t\t\t\tcase 'standard':\n\t\t\t\t\t\t\t\t\tcase 'extreme':\n\t\t\t\t\t\t\t\t\tcase 'insane':\n\t\t\t\t\t\t\t\t\t\t$encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate'];\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tstatic $ExpectedResampledRate = array(\n\t\t\t\t\t\t\t\t\t\t\t\t'phon+/lw/mw-eu/sw|16000' => 16000,\n\t\t\t\t\t\t\t\t\t\t\t\t'mw-us|24000'             => 24000, // 3.95\n\t\t\t\t\t\t\t\t\t\t\t\t'mw-us|32000'             => 32000, // 3.93\n\t\t\t\t\t\t\t\t\t\t\t\t'mw-us|16000'             => 16000, // 3.92\n\t\t\t\t\t\t\t\t\t\t\t\t'phone|16000'             => 16000,\n\t\t\t\t\t\t\t\t\t\t\t\t'phone|11025'             => 11025, // 3.94a15\n\t\t\t\t\t\t\t\t\t\t\t\t'radio|32000'             => 32000, // 3.94a15\n\t\t\t\t\t\t\t\t\t\t\t\t'fm/radio|32000'          => 32000, // 3.92\n\t\t\t\t\t\t\t\t\t\t\t\t'fm|32000'                => 32000, // 3.90\n\t\t\t\t\t\t\t\t\t\t\t\t'voice|32000'             => 32000);\n\t\t\t\t\t\t\t\t\t\tif (!isset($ExpectedResampledRate[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio['sample_rate']])) {\n\t\t\t\t\t\t\t\t\t\t\t$encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate'];\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase '--r3mix':\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t$encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate'];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (empty($encoder_options) && !empty($info['audio']['bitrate']) && !empty($info['audio']['bitrate_mode'])) {\n\t\t\t//$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000);\n\t\t\t$encoder_options = strtoupper($info['audio']['bitrate_mode']);\n\t\t}\n\n\t\treturn $encoder_options;\n\t}\n\n\n\tpublic function decodeMPEGaudioHeader($offset, &$info, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) {\n\t\tstatic $MPEGaudioVersionLookup;\n\t\tstatic $MPEGaudioLayerLookup;\n\t\tstatic $MPEGaudioBitrateLookup;\n\t\tstatic $MPEGaudioFrequencyLookup;\n\t\tstatic $MPEGaudioChannelModeLookup;\n\t\tstatic $MPEGaudioModeExtensionLookup;\n\t\tstatic $MPEGaudioEmphasisLookup;\n\t\tif (empty($MPEGaudioVersionLookup)) {\n\t\t\t$MPEGaudioVersionLookup       = self::MPEGaudioVersionArray();\n\t\t\t$MPEGaudioLayerLookup         = self::MPEGaudioLayerArray();\n\t\t\t$MPEGaudioBitrateLookup       = self::MPEGaudioBitrateArray();\n\t\t\t$MPEGaudioFrequencyLookup     = self::MPEGaudioFrequencyArray();\n\t\t\t$MPEGaudioChannelModeLookup   = self::MPEGaudioChannelModeArray();\n\t\t\t$MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray();\n\t\t\t$MPEGaudioEmphasisLookup      = self::MPEGaudioEmphasisArray();\n\t\t}\n\n\t\tif ($this->fseek($offset) != 0) {\n\t\t\t$info['error'][] = 'decodeMPEGaudioHeader() failed to seek to next offset at '.$offset;\n\t\t\treturn false;\n\t\t}\n\t\t//$headerstring = $this->fread(1441); // worst-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame\n\t\t$headerstring = $this->fread(226); // LAME header at offset 36 + 190 bytes of Xing/LAME data\n\n\t\t// MP3 audio frame structure:\n\t\t// $aa $aa $aa $aa [$bb $bb] $cc...\n\t\t// where $aa..$aa is the four-byte mpeg-audio header (below)\n\t\t// $bb $bb is the optional 2-byte CRC\n\t\t// and $cc... is the audio data\n\n\t\t$head4 = substr($headerstring, 0, 4);\n\n\t\tstatic $MPEGaudioHeaderDecodeCache = array();\n\t\tif (isset($MPEGaudioHeaderDecodeCache[$head4])) {\n\t\t\t$MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4];\n\t\t} else {\n\t\t\t$MPEGheaderRawArray = self::MPEGaudioHeaderDecode($head4);\n\t\t\t$MPEGaudioHeaderDecodeCache[$head4] = $MPEGheaderRawArray;\n\t\t}\n\n\t\tstatic $MPEGaudioHeaderValidCache = array();\n\t\tif (!isset($MPEGaudioHeaderValidCache[$head4])) { // Not in cache\n\t\t\t//$MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, true);  // allow badly-formatted freeformat (from LAME 3.90 - 3.93.1)\n\t\t\t$MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, false);\n\t\t}\n\n\t\t// shortcut\n\t\tif (!isset($info['mpeg']['audio'])) {\n\t\t\t$info['mpeg']['audio'] = array();\n\t\t}\n\t\t$thisfile_mpeg_audio = &$info['mpeg']['audio'];\n\n\n\t\tif ($MPEGaudioHeaderValidCache[$head4]) {\n\t\t\t$thisfile_mpeg_audio['raw'] = $MPEGheaderRawArray;\n\t\t} else {\n\t\t\t$info['error'][] = 'Invalid MPEG audio header ('.getid3_lib::PrintHexBytes($head4).') at offset '.$offset;\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!$FastMPEGheaderScan) {\n\t\t\t$thisfile_mpeg_audio['version']       = $MPEGaudioVersionLookup[$thisfile_mpeg_audio['raw']['version']];\n\t\t\t$thisfile_mpeg_audio['layer']         = $MPEGaudioLayerLookup[$thisfile_mpeg_audio['raw']['layer']];\n\n\t\t\t$thisfile_mpeg_audio['channelmode']   = $MPEGaudioChannelModeLookup[$thisfile_mpeg_audio['raw']['channelmode']];\n\t\t\t$thisfile_mpeg_audio['channels']      = (($thisfile_mpeg_audio['channelmode'] == 'mono') ? 1 : 2);\n\t\t\t$thisfile_mpeg_audio['sample_rate']   = $MPEGaudioFrequencyLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['raw']['sample_rate']];\n\t\t\t$thisfile_mpeg_audio['protection']    = !$thisfile_mpeg_audio['raw']['protection'];\n\t\t\t$thisfile_mpeg_audio['private']       = (bool) $thisfile_mpeg_audio['raw']['private'];\n\t\t\t$thisfile_mpeg_audio['modeextension'] = $MPEGaudioModeExtensionLookup[$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['modeextension']];\n\t\t\t$thisfile_mpeg_audio['copyright']     = (bool) $thisfile_mpeg_audio['raw']['copyright'];\n\t\t\t$thisfile_mpeg_audio['original']      = (bool) $thisfile_mpeg_audio['raw']['original'];\n\t\t\t$thisfile_mpeg_audio['emphasis']      = $MPEGaudioEmphasisLookup[$thisfile_mpeg_audio['raw']['emphasis']];\n\n\t\t\t$info['audio']['channels']    = $thisfile_mpeg_audio['channels'];\n\t\t\t$info['audio']['sample_rate'] = $thisfile_mpeg_audio['sample_rate'];\n\n\t\t\tif ($thisfile_mpeg_audio['protection']) {\n\t\t\t\t$thisfile_mpeg_audio['crc'] = getid3_lib::BigEndian2Int(substr($headerstring, 4, 2));\n\t\t\t}\n\t\t}\n\n\t\tif ($thisfile_mpeg_audio['raw']['bitrate'] == 15) {\n\t\t\t// http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0\n\t\t\t$info['warning'][] = 'Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1';\n\t\t\t$thisfile_mpeg_audio['raw']['bitrate'] = 0;\n\t\t}\n\t\t$thisfile_mpeg_audio['padding'] = (bool) $thisfile_mpeg_audio['raw']['padding'];\n\t\t$thisfile_mpeg_audio['bitrate'] = $MPEGaudioBitrateLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['bitrate']];\n\n\t\tif (($thisfile_mpeg_audio['bitrate'] == 'free') && ($offset == $info['avdataoffset'])) {\n\t\t\t// only skip multiple frame check if free-format bitstream found at beginning of file\n\t\t\t// otherwise is quite possibly simply corrupted data\n\t\t\t$recursivesearch = false;\n\t\t}\n\n\t\t// For Layer 2 there are some combinations of bitrate and mode which are not allowed.\n\t\tif (!$FastMPEGheaderScan && ($thisfile_mpeg_audio['layer'] == '2')) {\n\n\t\t\t$info['audio']['dataformat'] = 'mp2';\n\t\t\tswitch ($thisfile_mpeg_audio['channelmode']) {\n\n\t\t\t\tcase 'mono':\n\t\t\t\t\tif (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] <= 192000)) {\n\t\t\t\t\t\t// these are ok\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['error'][] = $thisfile_mpeg_audio['bitrate'].'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.';\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'stereo':\n\t\t\t\tcase 'joint stereo':\n\t\t\t\tcase 'dual channel':\n\t\t\t\t\tif (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] == 64000) || ($thisfile_mpeg_audio['bitrate'] >= 96000)) {\n\t\t\t\t\t\t// these are ok\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['error'][] = intval(round($thisfile_mpeg_audio['bitrate'] / 1000)).'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.';\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tif ($info['audio']['sample_rate'] > 0) {\n\t\t\t$thisfile_mpeg_audio['framelength'] = self::MPEGaudioFrameLength($thisfile_mpeg_audio['bitrate'], $thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['layer'], (int) $thisfile_mpeg_audio['padding'], $info['audio']['sample_rate']);\n\t\t}\n\n\t\t$nextframetestoffset = $offset + 1;\n\t\tif ($thisfile_mpeg_audio['bitrate'] != 'free') {\n\n\t\t\t$info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate'];\n\n\t\t\tif (isset($thisfile_mpeg_audio['framelength'])) {\n\t\t\t\t$nextframetestoffset = $offset + $thisfile_mpeg_audio['framelength'];\n\t\t\t} else {\n\t\t\t\t$info['error'][] = 'Frame at offset('.$offset.') is has an invalid frame length.';\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t}\n\n\t\t$ExpectedNumberOfAudioBytes = 0;\n\n\t\t////////////////////////////////////////////////////////////////////////////////////\n\t\t// Variable-bitrate headers\n\n\t\tif (substr($headerstring, 4 + 32, 4) == 'VBRI') {\n\t\t\t// Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36)\n\t\t\t// specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html\n\n\t\t\t$thisfile_mpeg_audio['bitrate_mode'] = 'vbr';\n\t\t\t$thisfile_mpeg_audio['VBR_method']   = 'Fraunhofer';\n\t\t\t$info['audio']['codec']                = 'Fraunhofer';\n\n\t\t\t$SideInfoData = substr($headerstring, 4 + 2, 32);\n\n\t\t\t$FraunhoferVBROffset = 36;\n\n\t\t\t$thisfile_mpeg_audio['VBR_encoder_version']     = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  4, 2)); // VbriVersion\n\t\t\t$thisfile_mpeg_audio['VBR_encoder_delay']       = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  6, 2)); // VbriDelay\n\t\t\t$thisfile_mpeg_audio['VBR_quality']             = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset +  8, 2)); // VbriQuality\n\t\t\t$thisfile_mpeg_audio['VBR_bytes']               = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4)); // VbriStreamBytes\n\t\t\t$thisfile_mpeg_audio['VBR_frames']              = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4)); // VbriStreamFrames\n\t\t\t$thisfile_mpeg_audio['VBR_seek_offsets']        = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2)); // VbriTableSize\n\t\t\t$thisfile_mpeg_audio['VBR_seek_scale']          = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 2)); // VbriTableScale\n\t\t\t$thisfile_mpeg_audio['VBR_entry_bytes']         = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 22, 2)); // VbriEntryBytes\n\t\t\t$thisfile_mpeg_audio['VBR_entry_frames']        = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2)); // VbriEntryFrames\n\n\t\t\t$ExpectedNumberOfAudioBytes = $thisfile_mpeg_audio['VBR_bytes'];\n\n\t\t\t$previousbyteoffset = $offset;\n\t\t\tfor ($i = 0; $i < $thisfile_mpeg_audio['VBR_seek_offsets']; $i++) {\n\t\t\t\t$Fraunhofer_OffsetN = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, $thisfile_mpeg_audio['VBR_entry_bytes']));\n\t\t\t\t$FraunhoferVBROffset += $thisfile_mpeg_audio['VBR_entry_bytes'];\n\t\t\t\t$thisfile_mpeg_audio['VBR_offsets_relative'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']);\n\t\t\t\t$thisfile_mpeg_audio['VBR_offsets_absolute'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']) + $previousbyteoffset;\n\t\t\t\t$previousbyteoffset += $Fraunhofer_OffsetN;\n\t\t\t}\n\n\n\t\t} else {\n\n\t\t\t// Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36)\n\t\t\t// depending on MPEG layer and number of channels\n\n\t\t\t$VBRidOffset = self::XingVBRidOffset($thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['channelmode']);\n\t\t\t$SideInfoData = substr($headerstring, 4 + 2, $VBRidOffset - 4);\n\n\t\t\tif ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) {\n\t\t\t\t// 'Xing' is traditional Xing VBR frame\n\t\t\t\t// 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.)\n\t\t\t\t// 'Info' *can* legally be used to specify a VBR file as well, however.\n\n\t\t\t\t// http://www.multiweb.cz/twoinches/MP3inside.htm\n\t\t\t\t//00..03 = \"Xing\" or \"Info\"\n\t\t\t\t//04..07 = Flags:\n\t\t\t\t//  0x01  Frames Flag     set if value for number of frames in file is stored\n\t\t\t\t//  0x02  Bytes Flag      set if value for filesize in bytes is stored\n\t\t\t\t//  0x04  TOC Flag        set if values for TOC are stored\n\t\t\t\t//  0x08  VBR Scale Flag  set if values for VBR scale is stored\n\t\t\t\t//08..11  Frames: Number of frames in file (including the first Xing/Info one)\n\t\t\t\t//12..15  Bytes:  File length in Bytes\n\t\t\t\t//16..115  TOC (Table of Contents):\n\t\t\t\t//  Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately solves problem with moving inside file.\n\t\t\t\t//  Each Byte has a value according this formula:\n\t\t\t\t//  (TOC[i] / 256) * fileLenInBytes\n\t\t\t\t//  So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000 000 Bytes length) you can use:\n\t\t\t\t//  TOC[(60/240)*100] = TOC[25]\n\t\t\t\t//  and corresponding Byte in file is then approximately at:\n\t\t\t\t//  (TOC[25]/256) * 5000000\n\t\t\t\t//116..119  VBR Scale\n\n\n\t\t\t\t// should be safe to leave this at 'vbr' and let it be overriden to 'cbr' if a CBR preset/mode is used by LAME\n//\t\t\t\tif (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Xing') {\n\t\t\t\t\t$thisfile_mpeg_audio['bitrate_mode'] = 'vbr';\n\t\t\t\t\t$thisfile_mpeg_audio['VBR_method']   = 'Xing';\n//\t\t\t\t} else {\n//\t\t\t\t\t$ScanAsCBR = true;\n//\t\t\t\t\t$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';\n//\t\t\t\t}\n\n\t\t\t\t$thisfile_mpeg_audio['xing_flags_raw'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4));\n\n\t\t\t\t$thisfile_mpeg_audio['xing_flags']['frames']    = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000001);\n\t\t\t\t$thisfile_mpeg_audio['xing_flags']['bytes']     = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000002);\n\t\t\t\t$thisfile_mpeg_audio['xing_flags']['toc']       = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000004);\n\t\t\t\t$thisfile_mpeg_audio['xing_flags']['vbr_scale'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000008);\n\n\t\t\t\tif ($thisfile_mpeg_audio['xing_flags']['frames']) {\n\t\t\t\t\t$thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset +  8, 4));\n\t\t\t\t\t//$thisfile_mpeg_audio['VBR_frames']--; // don't count header Xing/Info frame\n\t\t\t\t}\n\t\t\t\tif ($thisfile_mpeg_audio['xing_flags']['bytes']) {\n\t\t\t\t\t$thisfile_mpeg_audio['VBR_bytes']  = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4));\n\t\t\t\t}\n\n\t\t\t\t//if (($thisfile_mpeg_audio['bitrate'] == 'free') && !empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) {\n\t\t\t\tif (!empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) {\n\n\t\t\t\t\t$framelengthfloat = $thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames'];\n\n\t\t\t\t\tif ($thisfile_mpeg_audio['layer'] == '1') {\n\t\t\t\t\t\t// BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12\n\t\t\t\t\t\t//$info['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12;\n\t\t\t\t\t\t$info['audio']['bitrate'] = ($framelengthfloat / 4) * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 12;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144\n\t\t\t\t\t\t//$info['audio']['bitrate'] = (($framelengthfloat - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144;\n\t\t\t\t\t\t$info['audio']['bitrate'] = $framelengthfloat * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 144;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_mpeg_audio['framelength'] = floor($framelengthfloat);\n\t\t\t\t}\n\n\t\t\t\tif ($thisfile_mpeg_audio['xing_flags']['toc']) {\n\t\t\t\t\t$LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100);\n\t\t\t\t\tfor ($i = 0; $i < 100; $i++) {\n\t\t\t\t\t\t$thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData{$i});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($thisfile_mpeg_audio['xing_flags']['vbr_scale']) {\n\t\t\t\t\t$thisfile_mpeg_audio['VBR_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4));\n\t\t\t\t}\n\n\n\t\t\t\t// http://gabriel.mp3-tech.org/mp3infotag.html\n\t\t\t\tif (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') {\n\n\t\t\t\t\t// shortcut\n\t\t\t\t\t$thisfile_mpeg_audio['LAME'] = array();\n\t\t\t\t\t$thisfile_mpeg_audio_lame    = &$thisfile_mpeg_audio['LAME'];\n\n\n\t\t\t\t\t$thisfile_mpeg_audio_lame['long_version']  = substr($headerstring, $VBRidOffset + 120, 20);\n\t\t\t\t\t$thisfile_mpeg_audio_lame['short_version'] = substr($thisfile_mpeg_audio_lame['long_version'], 0, 9);\n\n\t\t\t\t\tif ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') {\n\n\t\t\t\t\t\t// extra 11 chars are not part of version string when LAMEtag present\n\t\t\t\t\t\tunset($thisfile_mpeg_audio_lame['long_version']);\n\n\t\t\t\t\t\t// It the LAME tag was only introduced in LAME v3.90\n\t\t\t\t\t\t// http://www.hydrogenaudio.org/?act=ST&f=15&t=9933\n\n\t\t\t\t\t\t// Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html\n\t\t\t\t\t\t// are assuming a 'Xing' identifier offset of 0x24, which is the case for\n\t\t\t\t\t\t// MPEG-1 non-mono, but not for other combinations\n\t\t\t\t\t\t$LAMEtagOffsetContant = $VBRidOffset - 0x24;\n\n\t\t\t\t\t\t// shortcuts\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['RGAD']    = array('track'=>array(), 'album'=>array());\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD       = &$thisfile_mpeg_audio_lame['RGAD'];\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track'];\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album'];\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['raw'] = array();\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw    = &$thisfile_mpeg_audio_lame['raw'];\n\n\t\t\t\t\t\t// byte $9B  VBR Quality\n\t\t\t\t\t\t// This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications.\n\t\t\t\t\t\t// Actually overwrites original Xing bytes\n\t\t\t\t\t\tunset($thisfile_mpeg_audio['VBR_scale']);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1));\n\n\t\t\t\t\t\t// bytes $9C-$A4  Encoder short VersionString\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9);\n\n\t\t\t\t\t\t// byte $A5  Info Tag revision + VBR method\n\t\t\t\t\t\t$LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1));\n\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['tag_revision']   = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4;\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['vbr_method'] =  $LAMEtagRevisionVBRmethod & 0x0F;\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['vbr_method']     = self::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']);\n\t\t\t\t\t\t$thisfile_mpeg_audio['bitrate_mode']        = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr'\n\n\t\t\t\t\t\t// byte $A6  Lowpass filter value\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100;\n\n\t\t\t\t\t\t// bytes $A7-$AE  Replay Gain\n\t\t\t\t\t\t// http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html\n\t\t\t\t\t\t// bytes $A7-$AA : 32 bit floating point \"Peak signal amplitude\"\n\t\t\t\t\t\tif ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') {\n\t\t\t\t\t\t\t// LAME 3.94a16 and later - 9.23 fixed point\n\t\t\t\t\t\t\t// ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// LAME 3.94a15 and earlier - 32-bit floating point\n\t\t\t\t\t\t\t// Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) {\n\t\t\t\t\t\t\tunset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['RGAD_track']      =   getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2));\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['RGAD_album']      =   getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2));\n\n\n\t\t\t\t\t\tif ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) {\n\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_track['raw']['name']        = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13;\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']  = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10;\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']    = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9;\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] =  $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF;\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_track['name']       = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']);\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']);\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_track['gain_db']    = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']);\n\n\t\t\t\t\t\t\tif (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) {\n\t\t\t\t\t\t\t\t$info['replay_gain']['track']['peak']   = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$info['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator'];\n\t\t\t\t\t\t\t$info['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db'];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tunset($thisfile_mpeg_audio_lame_RGAD['track']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) {\n\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_album['raw']['name']        = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13;\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']  = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10;\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']    = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9;\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF;\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_album['name']       = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']);\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']);\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame_RGAD_album['gain_db']    = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']);\n\n\t\t\t\t\t\t\tif (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) {\n\t\t\t\t\t\t\t\t$info['replay_gain']['album']['peak']   = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$info['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator'];\n\t\t\t\t\t\t\t$info['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db'];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tunset($thisfile_mpeg_audio_lame_RGAD['album']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (empty($thisfile_mpeg_audio_lame_RGAD)) {\n\t\t\t\t\t\t\tunset($thisfile_mpeg_audio_lame['RGAD']);\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t// byte $AF  Encoding flags + ATH Type\n\t\t\t\t\t\t$EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1));\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['encoding_flags']['nspsytune']   = (bool) ($EncodingFlagsATHtype & 0x10);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['encoding_flags']['nogap_next']  = (bool) ($EncodingFlagsATHtype & 0x40);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']  = (bool) ($EncodingFlagsATHtype & 0x80);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['ath_type']                      =         $EncodingFlagsATHtype & 0x0F;\n\n\t\t\t\t\t\t// byte $B0  if ABR {specified bitrate} else {minimal bitrate}\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1));\n\t\t\t\t\t\tif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR)\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'];\n\t\t\t\t\t\t} elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR)\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t} elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// bytes $B1-$B3  Encoder delays\n\t\t\t\t\t\t$EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3));\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12;\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['end_padding']   =  $EncoderDelays & 0x000FFF;\n\n\t\t\t\t\t\t// byte $B4  Misc\n\t\t\t\t\t\t$MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1));\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['noise_shaping']       = ($MiscByte & 0x03);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['stereo_mode']         = ($MiscByte & 0x1C) >> 2;\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5;\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['source_sample_freq']  = ($MiscByte & 0xC0) >> 6;\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['noise_shaping']       = $thisfile_mpeg_audio_lame_raw['noise_shaping'];\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['stereo_mode']         = self::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality'];\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['source_sample_freq']  = self::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']);\n\n\t\t\t\t\t\t// byte $B5  MP3 Gain\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['mp3_gain_db']     = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain'];\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6));\n\n\t\t\t\t\t\t// bytes $B6-$B7  Preset and surround info\n\t\t\t\t\t\t$PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2));\n\t\t\t\t\t\t// Reserved                                                    = ($PresetSurroundBytes & 0xC000);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['surround_info']     = self::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['preset_used_id']    = ($PresetSurroundBytes & 0x07FF);\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['preset_used']       = self::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame);\n\t\t\t\t\t\tif (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) {\n\t\t\t\t\t\t\t$info['warning'][] = 'Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) {\n\t\t\t\t\t\t\t// this may change if 3.90.4 ever comes out\n\t\t\t\t\t\t\t$thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// bytes $B8-$BB  MusicLength\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4));\n\t\t\t\t\t\t$ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']);\n\n\t\t\t\t\t\t// bytes $BC-$BD  MusicCRC\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['music_crc']    = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2));\n\n\t\t\t\t\t\t// bytes $BE-$BF  CRC-16 of Info Tag\n\t\t\t\t\t\t$thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2));\n\n\n\t\t\t\t\t\t// LAME CBR\n\t\t\t\t\t\tif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) {\n\n\t\t\t\t\t\t\t$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';\n\t\t\t\t\t\t\t$thisfile_mpeg_audio['bitrate'] = self::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']);\n\t\t\t\t\t\t\t$info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate'];\n\t\t\t\t\t\t\t//if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) {\n\t\t\t\t\t\t\t//\t$thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min'];\n\t\t\t\t\t\t\t//}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header)\n\t\t\t\t$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';\n\t\t\t\tif ($recursivesearch) {\n\t\t\t\t\t$thisfile_mpeg_audio['bitrate_mode'] = 'vbr';\n\t\t\t\t\tif ($this->RecursiveFrameScanning($offset, $nextframetestoffset, true)) {\n\t\t\t\t\t\t$recursivesearch = false;\n\t\t\t\t\t\t$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';\n\t\t\t\t\t}\n\t\t\t\t\tif ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') {\n\t\t\t\t\t\t$info['warning'][] = 'VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($info['avdataend'] - $info['avdataoffset']))) {\n\t\t\tif ($ExpectedNumberOfAudioBytes > ($info['avdataend'] - $info['avdataoffset'])) {\n\t\t\t\tif ($this->isDependencyFor('matroska') || $this->isDependencyFor('riff')) {\n\t\t\t\t\t// ignore, audio data is broken into chunks so will always be data \"missing\"\n\t\t\t\t}\n\t\t\t\telseif (($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])) == 1) {\n\t\t\t\t\t$this->warning('Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$this->warning('Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($info['avdataend'] - $info['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])).' bytes)');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ((($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes) == 1) {\n\t\t\t\t//\t$prenullbytefileoffset = $this->ftell();\n\t\t\t\t//\t$this->fseek($info['avdataend']);\n\t\t\t\t//\t$PossibleNullByte = $this->fread(1);\n\t\t\t\t//\t$this->fseek($prenullbytefileoffset);\n\t\t\t\t//\tif ($PossibleNullByte === \"\\x00\") {\n\t\t\t\t\t\t$info['avdataend']--;\n\t\t\t\t//\t\t$info['warning'][] = 'Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored';\n\t\t\t\t//\t} else {\n\t\t\t\t//\t\t$info['warning'][] = 'Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)';\n\t\t\t\t//\t}\n\t\t\t\t} else {\n\t\t\t\t\t$info['warning'][] = 'Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (($thisfile_mpeg_audio['bitrate'] == 'free') && empty($info['audio']['bitrate'])) {\n\t\t\tif (($offset == $info['avdataoffset']) && empty($thisfile_mpeg_audio['VBR_frames'])) {\n\t\t\t\t$framebytelength = $this->FreeFormatFrameLength($offset, true);\n\t\t\t\tif ($framebytelength > 0) {\n\t\t\t\t\t$thisfile_mpeg_audio['framelength'] = $framebytelength;\n\t\t\t\t\tif ($thisfile_mpeg_audio['layer'] == '1') {\n\t\t\t\t\t\t// BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12\n\t\t\t\t\t\t$info['audio']['bitrate'] = ((($framebytelength / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144\n\t\t\t\t\t\t$info['audio']['bitrate'] = (($framebytelength - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$info['error'][] = 'Error calculating frame length of free-format MP3 without Xing/LAME header';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isset($thisfile_mpeg_audio['VBR_frames']) ? $thisfile_mpeg_audio['VBR_frames'] : '') {\n\t\t\tswitch ($thisfile_mpeg_audio['bitrate_mode']) {\n\t\t\t\tcase 'vbr':\n\t\t\t\tcase 'abr':\n\t\t\t\t\t$bytes_per_frame = 1152;\n\t\t\t\t\tif (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) {\n\t\t\t\t\t\t$bytes_per_frame = 384;\n\t\t\t\t\t} elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) {\n\t\t\t\t\t\t$bytes_per_frame = 576;\n\t\t\t\t\t}\n\t\t\t\t\t$thisfile_mpeg_audio['VBR_bitrate'] = (isset($thisfile_mpeg_audio['VBR_bytes']) ? (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($info['audio']['sample_rate'] / $bytes_per_frame) : 0);\n\t\t\t\t\tif ($thisfile_mpeg_audio['VBR_bitrate'] > 0) {\n\t\t\t\t\t\t$info['audio']['bitrate']         = $thisfile_mpeg_audio['VBR_bitrate'];\n\t\t\t\t\t\t$thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; // to avoid confusion\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// End variable-bitrate headers\n\t\t////////////////////////////////////////////////////////////////////////////////////\n\n\t\tif ($recursivesearch) {\n\n\t\t\tif (!$this->RecursiveFrameScanning($offset, $nextframetestoffset, $ScanAsCBR)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t}\n\n\n\t\t//if (false) {\n\t\t//    // experimental side info parsing section - not returning anything useful yet\n\t\t//\n\t\t//    $SideInfoBitstream = getid3_lib::BigEndian2Bin($SideInfoData);\n\t\t//    $SideInfoOffset = 0;\n\t\t//\n\t\t//    if ($thisfile_mpeg_audio['version'] == '1') {\n\t\t//        if ($thisfile_mpeg_audio['channelmode'] == 'mono') {\n\t\t//            // MPEG-1 (mono)\n\t\t//            $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9);\n\t\t//            $SideInfoOffset += 9;\n\t\t//            $SideInfoOffset += 5;\n\t\t//        } else {\n\t\t//            // MPEG-1 (stereo, joint-stereo, dual-channel)\n\t\t//            $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9);\n\t\t//            $SideInfoOffset += 9;\n\t\t//            $SideInfoOffset += 3;\n\t\t//        }\n\t\t//    } else { // 2 or 2.5\n\t\t//        if ($thisfile_mpeg_audio['channelmode'] == 'mono') {\n\t\t//            // MPEG-2, MPEG-2.5 (mono)\n\t\t//            $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8);\n\t\t//            $SideInfoOffset += 8;\n\t\t//            $SideInfoOffset += 1;\n\t\t//        } else {\n\t\t//            // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel)\n\t\t//            $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8);\n\t\t//            $SideInfoOffset += 8;\n\t\t//            $SideInfoOffset += 2;\n\t\t//        }\n\t\t//    }\n\t\t//\n\t\t//    if ($thisfile_mpeg_audio['version'] == '1') {\n\t\t//        for ($channel = 0; $channel < $info['audio']['channels']; $channel++) {\n\t\t//            for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) {\n\t\t//                $thisfile_mpeg_audio['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1);\n\t\t//                $SideInfoOffset += 2;\n\t\t//            }\n\t\t//        }\n\t\t//    }\n\t\t//    for ($granule = 0; $granule < (($thisfile_mpeg_audio['version'] == '1') ? 2 : 1); $granule++) {\n\t\t//        for ($channel = 0; $channel < $info['audio']['channels']; $channel++) {\n\t\t//            $thisfile_mpeg_audio['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12);\n\t\t//            $SideInfoOffset += 12;\n\t\t//            $thisfile_mpeg_audio['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9);\n\t\t//            $SideInfoOffset += 9;\n\t\t//            $thisfile_mpeg_audio['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8);\n\t\t//            $SideInfoOffset += 8;\n\t\t//            if ($thisfile_mpeg_audio['version'] == '1') {\n\t\t//                $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4);\n\t\t//                $SideInfoOffset += 4;\n\t\t//            } else {\n\t\t//                $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9);\n\t\t//                $SideInfoOffset += 9;\n\t\t//            }\n\t\t//            $thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);\n\t\t//            $SideInfoOffset += 1;\n\t\t//\n\t\t//            if ($thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] == '1') {\n\t\t//\n\t\t//                $thisfile_mpeg_audio['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2);\n\t\t//                $SideInfoOffset += 2;\n\t\t//                $thisfile_mpeg_audio['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);\n\t\t//                $SideInfoOffset += 1;\n\t\t//\n\t\t//                for ($region = 0; $region < 2; $region++) {\n\t\t//                    $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5);\n\t\t//                    $SideInfoOffset += 5;\n\t\t//                }\n\t\t//                $thisfile_mpeg_audio['table_select'][$granule][$channel][2] = 0;\n\t\t//\n\t\t//                for ($window = 0; $window < 3; $window++) {\n\t\t//                    $thisfile_mpeg_audio['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3);\n\t\t//                    $SideInfoOffset += 3;\n\t\t//                }\n\t\t//\n\t\t//            } else {\n\t\t//\n\t\t//                for ($region = 0; $region < 3; $region++) {\n\t\t//                    $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5);\n\t\t//                    $SideInfoOffset += 5;\n\t\t//                }\n\t\t//\n\t\t//                $thisfile_mpeg_audio['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4);\n\t\t//                $SideInfoOffset += 4;\n\t\t//                $thisfile_mpeg_audio['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3);\n\t\t//                $SideInfoOffset += 3;\n\t\t//                $thisfile_mpeg_audio['block_type'][$granule][$channel] = 0;\n\t\t//            }\n\t\t//\n\t\t//            if ($thisfile_mpeg_audio['version'] == '1') {\n\t\t//                $thisfile_mpeg_audio['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);\n\t\t//                $SideInfoOffset += 1;\n\t\t//            }\n\t\t//            $thisfile_mpeg_audio['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);\n\t\t//            $SideInfoOffset += 1;\n\t\t//            $thisfile_mpeg_audio['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1);\n\t\t//            $SideInfoOffset += 1;\n\t\t//        }\n\t\t//    }\n\t\t//}\n\n\t\treturn true;\n\t}\n\n\tpublic function RecursiveFrameScanning(&$offset, &$nextframetestoffset, $ScanAsCBR) {\n\t\t$info = &$this->getid3->info;\n\t\t$firstframetestarray = array('error'=>'', 'warning'=>'', 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']);\n\t\t$this->decodeMPEGaudioHeader($offset, $firstframetestarray, false);\n\n\t\tfor ($i = 0; $i < GETID3_MP3_VALID_CHECK_FRAMES; $i++) {\n\t\t\t// check next GETID3_MP3_VALID_CHECK_FRAMES frames for validity, to make sure we haven't run across a false synch\n\t\t\tif (($nextframetestoffset + 4) >= $info['avdataend']) {\n\t\t\t\t// end of file\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t$nextframetestarray = array('error'=>'', 'warning'=>'', 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']);\n\t\t\tif ($this->decodeMPEGaudioHeader($nextframetestoffset, $nextframetestarray, false)) {\n\t\t\t\tif ($ScanAsCBR) {\n\t\t\t\t\t// force CBR mode, used for trying to pick out invalid audio streams with valid(?) VBR headers, or VBR streams with no VBR header\n\t\t\t\t\tif (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($firstframetestarray['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $firstframetestarray['mpeg']['audio']['bitrate'])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t\t// next frame is OK, get ready to check the one after that\n\t\t\t\tif (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) {\n\t\t\t\t\t$nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength'];\n\t\t\t\t} else {\n\t\t\t\t\t$info['error'][] = 'Frame at offset ('.$offset.') is has an invalid frame length.';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t} elseif (!empty($firstframetestarray['mpeg']['audio']['framelength']) && (($nextframetestoffset + $firstframetestarray['mpeg']['audio']['framelength']) > $info['avdataend'])) {\n\n\t\t\t\t// it's not the end of the file, but there's not enough data left for another frame, so assume it's garbage/padding and return OK\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\t// next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence\n\t\t\t\t$info['warning'][] = 'Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.';\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic function FreeFormatFrameLength($offset, $deepscan=false) {\n\t\t$info = &$this->getid3->info;\n\n\t\t$this->fseek($offset);\n\t\t$MPEGaudioData = $this->fread(32768);\n\n\t\t$SyncPattern1 = substr($MPEGaudioData, 0, 4);\n\t\t// may be different pattern due to padding\n\t\t$SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) | 0x02).$SyncPattern1{3};\n\t\tif ($SyncPattern2 === $SyncPattern1) {\n\t\t\t$SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) & 0xFD).$SyncPattern1{3};\n\t\t}\n\n\t\t$framelength = false;\n\t\t$framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4);\n\t\t$framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4);\n\t\tif ($framelength1 > 4) {\n\t\t\t$framelength = $framelength1;\n\t\t}\n\t\tif (($framelength2 > 4) && ($framelength2 < $framelength1)) {\n\t\t\t$framelength = $framelength2;\n\t\t}\n\t\tif (!$framelength) {\n\n\t\t\t// LAME 3.88 has a different value for modeextension on the first frame vs the rest\n\t\t\t$framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4);\n\t\t\t$framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4);\n\n\t\t\tif ($framelength1 > 4) {\n\t\t\t\t$framelength = $framelength1;\n\t\t\t}\n\t\t\tif (($framelength2 > 4) && ($framelength2 < $framelength1)) {\n\t\t\t\t$framelength = $framelength2;\n\t\t\t}\n\t\t\tif (!$framelength) {\n\t\t\t\t$info['error'][] = 'Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset;\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\t$info['warning'][] = 'ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)';\n\t\t\t\t$info['audio']['codec']   = 'LAME';\n\t\t\t\t$info['audio']['encoder'] = 'LAME3.88';\n\t\t\t\t$SyncPattern1 = substr($SyncPattern1, 0, 3);\n\t\t\t\t$SyncPattern2 = substr($SyncPattern2, 0, 3);\n\t\t\t}\n\t\t}\n\n\t\tif ($deepscan) {\n\n\t\t\t$ActualFrameLengthValues = array();\n\t\t\t$nextoffset = $offset + $framelength;\n\t\t\twhile ($nextoffset < ($info['avdataend'] - 6)) {\n\t\t\t\t$this->fseek($nextoffset - 1);\n\t\t\t\t$NextSyncPattern = $this->fread(6);\n\t\t\t\tif ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) {\n\t\t\t\t\t// good - found where expected\n\t\t\t\t\t$ActualFrameLengthValues[] = $framelength;\n\t\t\t\t} elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) {\n\t\t\t\t\t// ok - found one byte earlier than expected (last frame wasn't padded, first frame was)\n\t\t\t\t\t$ActualFrameLengthValues[] = ($framelength - 1);\n\t\t\t\t\t$nextoffset--;\n\t\t\t\t} elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) {\n\t\t\t\t\t// ok - found one byte later than expected (last frame was padded, first frame wasn't)\n\t\t\t\t\t$ActualFrameLengthValues[] = ($framelength + 1);\n\t\t\t\t\t$nextoffset++;\n\t\t\t\t} else {\n\t\t\t\t\t$info['error'][] = 'Did not find expected free-format sync pattern at offset '.$nextoffset;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$nextoffset += $framelength;\n\t\t\t}\n\t\t\tif (count($ActualFrameLengthValues) > 0) {\n\t\t\t\t$framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues)));\n\t\t\t}\n\t\t}\n\t\treturn $framelength;\n\t}\n\n\tpublic function getOnlyMPEGaudioInfoBruteForce() {\n\t\t$MPEGaudioHeaderDecodeCache   = array();\n\t\t$MPEGaudioHeaderValidCache    = array();\n\t\t$MPEGaudioHeaderLengthCache   = array();\n\t\t$MPEGaudioVersionLookup       = self::MPEGaudioVersionArray();\n\t\t$MPEGaudioLayerLookup         = self::MPEGaudioLayerArray();\n\t\t$MPEGaudioBitrateLookup       = self::MPEGaudioBitrateArray();\n\t\t$MPEGaudioFrequencyLookup     = self::MPEGaudioFrequencyArray();\n\t\t$MPEGaudioChannelModeLookup   = self::MPEGaudioChannelModeArray();\n\t\t$MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray();\n\t\t$MPEGaudioEmphasisLookup      = self::MPEGaudioEmphasisArray();\n\t\t$LongMPEGversionLookup        = array();\n\t\t$LongMPEGlayerLookup          = array();\n\t\t$LongMPEGbitrateLookup        = array();\n\t\t$LongMPEGpaddingLookup        = array();\n\t\t$LongMPEGfrequencyLookup      = array();\n\t\t$Distribution['bitrate']      = array();\n\t\t$Distribution['frequency']    = array();\n\t\t$Distribution['layer']        = array();\n\t\t$Distribution['version']      = array();\n\t\t$Distribution['padding']      = array();\n\n\t\t$info = &$this->getid3->info;\n\t\t$this->fseek($info['avdataoffset']);\n\n\t\t$max_frames_scan = 5000;\n\t\t$frames_scanned  = 0;\n\n\t\t$previousvalidframe = $info['avdataoffset'];\n\t\twhile ($this->ftell() < $info['avdataend']) {\n\t\t\tset_time_limit(30);\n\t\t\t$head4 = $this->fread(4);\n\t\t\tif (strlen($head4) < 4) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ($head4{0} != \"\\xFF\") {\n\t\t\t\tfor ($i = 1; $i < 4; $i++) {\n\t\t\t\t\tif ($head4{$i} == \"\\xFF\") {\n\t\t\t\t\t\t$this->fseek($i - 4, SEEK_CUR);\n\t\t\t\t\t\tcontinue 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!isset($MPEGaudioHeaderDecodeCache[$head4])) {\n\t\t\t\t$MPEGaudioHeaderDecodeCache[$head4] = self::MPEGaudioHeaderDecode($head4);\n\t\t\t}\n\t\t\tif (!isset($MPEGaudioHeaderValidCache[$head4])) {\n\t\t\t\t$MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$head4], false, false);\n\t\t\t}\n\t\t\tif ($MPEGaudioHeaderValidCache[$head4]) {\n\n\t\t\t\tif (!isset($MPEGaudioHeaderLengthCache[$head4])) {\n\t\t\t\t\t$LongMPEGversionLookup[$head4]   = $MPEGaudioVersionLookup[$MPEGaudioHeaderDecodeCache[$head4]['version']];\n\t\t\t\t\t$LongMPEGlayerLookup[$head4]     = $MPEGaudioLayerLookup[$MPEGaudioHeaderDecodeCache[$head4]['layer']];\n\t\t\t\t\t$LongMPEGbitrateLookup[$head4]   = $MPEGaudioBitrateLookup[$LongMPEGversionLookup[$head4]][$LongMPEGlayerLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['bitrate']];\n\t\t\t\t\t$LongMPEGpaddingLookup[$head4]   = (bool) $MPEGaudioHeaderDecodeCache[$head4]['padding'];\n\t\t\t\t\t$LongMPEGfrequencyLookup[$head4] = $MPEGaudioFrequencyLookup[$LongMPEGversionLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['sample_rate']];\n\t\t\t\t\t$MPEGaudioHeaderLengthCache[$head4] = self::MPEGaudioFrameLength(\n\t\t\t\t\t\t$LongMPEGbitrateLookup[$head4],\n\t\t\t\t\t\t$LongMPEGversionLookup[$head4],\n\t\t\t\t\t\t$LongMPEGlayerLookup[$head4],\n\t\t\t\t\t\t$LongMPEGpaddingLookup[$head4],\n\t\t\t\t\t\t$LongMPEGfrequencyLookup[$head4]);\n\t\t\t\t}\n\t\t\t\tif ($MPEGaudioHeaderLengthCache[$head4] > 4) {\n\t\t\t\t\t$WhereWeWere = $this->ftell();\n\t\t\t\t\t$this->fseek($MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR);\n\t\t\t\t\t$next4 = $this->fread(4);\n\t\t\t\t\tif ($next4{0} == \"\\xFF\") {\n\t\t\t\t\t\tif (!isset($MPEGaudioHeaderDecodeCache[$next4])) {\n\t\t\t\t\t\t\t$MPEGaudioHeaderDecodeCache[$next4] = self::MPEGaudioHeaderDecode($next4);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!isset($MPEGaudioHeaderValidCache[$next4])) {\n\t\t\t\t\t\t\t$MPEGaudioHeaderValidCache[$next4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$next4], false, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($MPEGaudioHeaderValidCache[$next4]) {\n\t\t\t\t\t\t\t$this->fseek(-4, SEEK_CUR);\n\n\t\t\t\t\t\t\tgetid3_lib::safe_inc($Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]]);\n\t\t\t\t\t\t\tgetid3_lib::safe_inc($Distribution['layer'][$LongMPEGlayerLookup[$head4]]);\n\t\t\t\t\t\t\tgetid3_lib::safe_inc($Distribution['version'][$LongMPEGversionLookup[$head4]]);\n\t\t\t\t\t\t\tgetid3_lib::safe_inc($Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]);\n\t\t\t\t\t\t\tgetid3_lib::safe_inc($Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]);\n\t\t\t\t\t\t\tif ($max_frames_scan && (++$frames_scanned >= $max_frames_scan)) {\n\t\t\t\t\t\t\t\t$pct_data_scanned = ($this->ftell() - $info['avdataoffset']) / ($info['avdataend'] - $info['avdataoffset']);\n\t\t\t\t\t\t\t\t$info['warning'][] = 'too many MPEG audio frames to scan, only scanned first '.$max_frames_scan.' frames ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.';\n\t\t\t\t\t\t\t\tforeach ($Distribution as $key1 => $value1) {\n\t\t\t\t\t\t\t\t\tforeach ($value1 as $key2 => $value2) {\n\t\t\t\t\t\t\t\t\t\t$Distribution[$key1][$key2] = round($value2 / $pct_data_scanned);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tunset($next4);\n\t\t\t\t\t$this->fseek($WhereWeWere - 3);\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\tforeach ($Distribution as $key => $value) {\n\t\t\tksort($Distribution[$key], SORT_NUMERIC);\n\t\t}\n\t\tksort($Distribution['version'], SORT_STRING);\n\t\t$info['mpeg']['audio']['bitrate_distribution']   = $Distribution['bitrate'];\n\t\t$info['mpeg']['audio']['frequency_distribution'] = $Distribution['frequency'];\n\t\t$info['mpeg']['audio']['layer_distribution']     = $Distribution['layer'];\n\t\t$info['mpeg']['audio']['version_distribution']   = $Distribution['version'];\n\t\t$info['mpeg']['audio']['padding_distribution']   = $Distribution['padding'];\n\t\tif (count($Distribution['version']) > 1) {\n\t\t\t$info['error'][] = 'Corrupt file - more than one MPEG version detected';\n\t\t}\n\t\tif (count($Distribution['layer']) > 1) {\n\t\t\t$info['error'][] = 'Corrupt file - more than one MPEG layer detected';\n\t\t}\n\t\tif (count($Distribution['frequency']) > 1) {\n\t\t\t$info['error'][] = 'Corrupt file - more than one MPEG sample rate detected';\n\t\t}\n\n\n\t\t$bittotal = 0;\n\t\tforeach ($Distribution['bitrate'] as $bitratevalue => $bitratecount) {\n\t\t\tif ($bitratevalue != 'free') {\n\t\t\t\t$bittotal += ($bitratevalue * $bitratecount);\n\t\t\t}\n\t\t}\n\t\t$info['mpeg']['audio']['frame_count']  = array_sum($Distribution['bitrate']);\n\t\tif ($info['mpeg']['audio']['frame_count'] == 0) {\n\t\t\t$info['error'][] = 'no MPEG audio frames found';\n\t\t\treturn false;\n\t\t}\n\t\t$info['mpeg']['audio']['bitrate']      = ($bittotal / $info['mpeg']['audio']['frame_count']);\n\t\t$info['mpeg']['audio']['bitrate_mode'] = ((count($Distribution['bitrate']) > 0) ? 'vbr' : 'cbr');\n\t\t$info['mpeg']['audio']['sample_rate']  = getid3_lib::array_max($Distribution['frequency'], true);\n\n\t\t$info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];\n\t\t$info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode'];\n\t\t$info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];\n\t\t$info['audio']['dataformat']   = 'mp'.getid3_lib::array_max($Distribution['layer'], true);\n\t\t$info['fileformat']            = $info['audio']['dataformat'];\n\n\t\treturn true;\n\t}\n\n\n\tpublic function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram=false) {\n\t\t// looks for synch, decodes MPEG audio header\n\n\t\t$info = &$this->getid3->info;\n\n\t\tstatic $MPEGaudioVersionLookup;\n\t\tstatic $MPEGaudioLayerLookup;\n\t\tstatic $MPEGaudioBitrateLookup;\n\t\tif (empty($MPEGaudioVersionLookup)) {\n\t\t   $MPEGaudioVersionLookup = self::MPEGaudioVersionArray();\n\t\t   $MPEGaudioLayerLookup   = self::MPEGaudioLayerArray();\n\t\t   $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray();\n\n\t\t}\n\n\t\t$this->fseek($avdataoffset);\n\t\t$sync_seek_buffer_size = min(128 * 1024, $info['avdataend'] - $avdataoffset);\n\t\tif ($sync_seek_buffer_size <= 0) {\n\t\t\t$info['error'][] = 'Invalid $sync_seek_buffer_size at offset '.$avdataoffset;\n\t\t\treturn false;\n\t\t}\n\t\t$header = $this->fread($sync_seek_buffer_size);\n\t\t$sync_seek_buffer_size = strlen($header);\n\t\t$SynchSeekOffset = 0;\n\t\twhile ($SynchSeekOffset < $sync_seek_buffer_size) {\n\t\t\tif ((($avdataoffset + $SynchSeekOffset)  < $info['avdataend']) && !feof($this->getid3->fp)) {\n\n\t\t\t\tif ($SynchSeekOffset > $sync_seek_buffer_size) {\n\t\t\t\t\t// if a synch's not found within the first 128k bytes, then give up\n\t\t\t\t\t$info['error'][] = 'Could not find valid MPEG audio synch within the first '.round($sync_seek_buffer_size / 1024).'kB';\n\t\t\t\t\tif (isset($info['audio']['bitrate'])) {\n\t\t\t\t\t\tunset($info['audio']['bitrate']);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($info['mpeg']['audio'])) {\n\t\t\t\t\t\tunset($info['mpeg']['audio']);\n\t\t\t\t\t}\n\t\t\t\t\tif (empty($info['mpeg'])) {\n\t\t\t\t\t\tunset($info['mpeg']);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\n\t\t\t\t} elseif (feof($this->getid3->fp)) {\n\n\t\t\t\t\t$info['error'][] = 'Could not find valid MPEG audio synch before end of file';\n\t\t\t\t\tif (isset($info['audio']['bitrate'])) {\n\t\t\t\t\t\tunset($info['audio']['bitrate']);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($info['mpeg']['audio'])) {\n\t\t\t\t\t\tunset($info['mpeg']['audio']);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($info['mpeg']) && (!is_array($info['mpeg']) || (count($info['mpeg']) == 0))) {\n\t\t\t\t\t\tunset($info['mpeg']);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (($SynchSeekOffset + 1) >= strlen($header)) {\n\t\t\t\t$info['error'][] = 'Could not find valid MPEG synch before end of file';\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (($header{$SynchSeekOffset} == \"\\xFF\") && ($header{($SynchSeekOffset + 1)} > \"\\xE0\")) { // synch detected\n\t\t\t\tif (!isset($FirstFrameThisfileInfo) && !isset($info['mpeg']['audio'])) {\n\t\t\t\t\t$FirstFrameThisfileInfo = $info;\n\t\t\t\t\t$FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset;\n\t\t\t\t\tif (!$this->decodeMPEGaudioHeader($FirstFrameAVDataOffset, $FirstFrameThisfileInfo, false)) {\n\t\t\t\t\t\t// if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's\n\t\t\t\t\t\t// garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below\n\t\t\t\t\t\tunset($FirstFrameThisfileInfo);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$dummy = $info; // only overwrite real data if valid header found\n\t\t\t\tif ($this->decodeMPEGaudioHeader($avdataoffset + $SynchSeekOffset, $dummy, true)) {\n\t\t\t\t\t$info = $dummy;\n\t\t\t\t\t$info['avdataoffset'] = $avdataoffset + $SynchSeekOffset;\n\t\t\t\t\tswitch (isset($info['fileformat']) ? $info['fileformat'] : '') {\n\t\t\t\t\t\tcase '':\n\t\t\t\t\t\tcase 'id3':\n\t\t\t\t\t\tcase 'ape':\n\t\t\t\t\t\tcase 'mp3':\n\t\t\t\t\t\t\t$info['fileformat']          = 'mp3';\n\t\t\t\t\t\t\t$info['audio']['dataformat'] = 'mp3';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) {\n\t\t\t\t\t\tif (!(abs($info['audio']['bitrate'] - $FirstFrameThisfileInfo['audio']['bitrate']) <= 1)) {\n\t\t\t\t\t\t\t// If there is garbage data between a valid VBR header frame and a sequence\n\t\t\t\t\t\t\t// of valid MPEG-audio frames the VBR data is no longer discarded.\n\t\t\t\t\t\t\t$info = $FirstFrameThisfileInfo;\n\t\t\t\t\t\t\t$info['avdataoffset']        = $FirstFrameAVDataOffset;\n\t\t\t\t\t\t\t$info['fileformat']          = 'mp3';\n\t\t\t\t\t\t\t$info['audio']['dataformat'] = 'mp3';\n\t\t\t\t\t\t\t$dummy                       = $info;\n\t\t\t\t\t\t\tunset($dummy['mpeg']['audio']);\n\t\t\t\t\t\t\t$GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength'];\n\t\t\t\t\t\t\t$GarbageOffsetEnd   = $avdataoffset + $SynchSeekOffset;\n\t\t\t\t\t\t\tif ($this->decodeMPEGaudioHeader($GarbageOffsetEnd, $dummy, true, true)) {\n\t\t\t\t\t\t\t\t$info = $dummy;\n\t\t\t\t\t\t\t\t$info['avdataoffset'] = $GarbageOffsetEnd;\n\t\t\t\t\t\t\t\t$info['warning'][] = 'apparently-valid VBR header not used because could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$info['warning'][] = 'using data from VBR header even though could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($info['mpeg']['audio']['bitrate_mode']) && ($info['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($info['mpeg']['audio']['VBR_method'])) {\n\t\t\t\t\t\t// VBR file with no VBR header\n\t\t\t\t\t\t$BitrateHistogram = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($BitrateHistogram) {\n\n\t\t\t\t\t\t$info['mpeg']['audio']['stereo_distribution']  = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0);\n\t\t\t\t\t\t$info['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0);\n\n\t\t\t\t\t\tif ($info['mpeg']['audio']['version'] == '1') {\n\t\t\t\t\t\t\tif ($info['mpeg']['audio']['layer'] == 3) {\n\t\t\t\t\t\t\t\t$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0);\n\t\t\t\t\t\t\t} elseif ($info['mpeg']['audio']['layer'] == 2) {\n\t\t\t\t\t\t\t\t$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0, 384000=>0);\n\t\t\t\t\t\t\t} elseif ($info['mpeg']['audio']['layer'] == 1) {\n\t\t\t\t\t\t\t\t$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 64000=>0, 96000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 288000=>0, 320000=>0, 352000=>0, 384000=>0, 416000=>0, 448000=>0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} elseif ($info['mpeg']['audio']['layer'] == 1) {\n\t\t\t\t\t\t\t$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0, 176000=>0, 192000=>0, 224000=>0, 256000=>0);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8000=>0, 16000=>0, 24000=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$dummy = array('error'=>$info['error'], 'warning'=>$info['warning'], 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']);\n\t\t\t\t\t\t$synchstartoffset = $info['avdataoffset'];\n\t\t\t\t\t\t$this->fseek($info['avdataoffset']);\n\n\t\t\t\t\t\t// you can play with these numbers:\n\t\t\t\t\t\t$max_frames_scan  = 50000;\n\t\t\t\t\t\t$max_scan_segments = 10;\n\n\t\t\t\t\t\t// don't play with these numbers:\n\t\t\t\t\t\t$FastMode = false;\n\t\t\t\t\t\t$SynchErrorsFound = 0;\n\t\t\t\t\t\t$frames_scanned   = 0;\n\t\t\t\t\t\t$this_scan_segment = 0;\n\t\t\t\t\t\t$frames_scan_per_segment = ceil($max_frames_scan / $max_scan_segments);\n\t\t\t\t\t\t$pct_data_scanned = 0;\n\t\t\t\t\t\tfor ($current_segment = 0; $current_segment < $max_scan_segments; $current_segment++) {\n\t\t\t\t\t\t\t$frames_scanned_this_segment = 0;\n\t\t\t\t\t\t\tif ($this->ftell() >= $info['avdataend']) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$scan_start_offset[$current_segment] = max($this->ftell(), $info['avdataoffset'] + round($current_segment * (($info['avdataend'] - $info['avdataoffset']) / $max_scan_segments)));\n\t\t\t\t\t\t\tif ($current_segment > 0) {\n\t\t\t\t\t\t\t\t$this->fseek($scan_start_offset[$current_segment]);\n\t\t\t\t\t\t\t\t$buffer_4k = $this->fread(4096);\n\t\t\t\t\t\t\t\tfor ($j = 0; $j < (strlen($buffer_4k) - 4); $j++) {\n\t\t\t\t\t\t\t\t\tif (($buffer_4k{$j} == \"\\xFF\") && ($buffer_4k{($j + 1)} > \"\\xE0\")) { // synch detected\n\t\t\t\t\t\t\t\t\t\tif ($this->decodeMPEGaudioHeader($scan_start_offset[$current_segment] + $j, $dummy, false, false, $FastMode)) {\n\t\t\t\t\t\t\t\t\t\t\t$calculated_next_offset = $scan_start_offset[$current_segment] + $j + $dummy['mpeg']['audio']['framelength'];\n\t\t\t\t\t\t\t\t\t\t\tif ($this->decodeMPEGaudioHeader($calculated_next_offset, $dummy, false, false, $FastMode)) {\n\t\t\t\t\t\t\t\t\t\t\t\t$scan_start_offset[$current_segment] += $j;\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$synchstartoffset = $scan_start_offset[$current_segment];\n\t\t\t\t\t\t\twhile ($this->decodeMPEGaudioHeader($synchstartoffset, $dummy, false, false, $FastMode)) {\n\t\t\t\t\t\t\t\t$FastMode = true;\n\t\t\t\t\t\t\t\t$thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']];\n\n\t\t\t\t\t\t\t\tif (empty($dummy['mpeg']['audio']['framelength'])) {\n\t\t\t\t\t\t\t\t\t$SynchErrorsFound++;\n\t\t\t\t\t\t\t\t\t$synchstartoffset++;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tgetid3_lib::safe_inc($info['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]);\n\t\t\t\t\t\t\t\t\tgetid3_lib::safe_inc($info['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]);\n\t\t\t\t\t\t\t\t\tgetid3_lib::safe_inc($info['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]);\n\t\t\t\t\t\t\t\t\t$synchstartoffset += $dummy['mpeg']['audio']['framelength'];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$frames_scanned++;\n\t\t\t\t\t\t\t\tif ($frames_scan_per_segment && (++$frames_scanned_this_segment >= $frames_scan_per_segment)) {\n\t\t\t\t\t\t\t\t\t$this_pct_scanned = ($this->ftell() - $scan_start_offset[$current_segment]) / ($info['avdataend'] - $info['avdataoffset']);\n\t\t\t\t\t\t\t\t\tif (($current_segment == 0) && (($this_pct_scanned * $max_scan_segments) >= 1)) {\n\t\t\t\t\t\t\t\t\t\t// file likely contains < $max_frames_scan, just scan as one segment\n\t\t\t\t\t\t\t\t\t\t$max_scan_segments = 1;\n\t\t\t\t\t\t\t\t\t\t$frames_scan_per_segment = $max_frames_scan;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t$pct_data_scanned += $this_pct_scanned;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($pct_data_scanned > 0) {\n\t\t\t\t\t\t\t$info['warning'][] = 'too many MPEG audio frames to scan, only scanned '.$frames_scanned.' frames in '.$max_scan_segments.' segments ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.';\n\t\t\t\t\t\t\tforeach ($info['mpeg']['audio'] as $key1 => $value1) {\n\t\t\t\t\t\t\t\tif (!preg_match('#_distribution$#i', $key1)) {\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tforeach ($value1 as $key2 => $value2) {\n\t\t\t\t\t\t\t\t\t$info['mpeg']['audio'][$key1][$key2] = round($value2 / $pct_data_scanned);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ($SynchErrorsFound > 0) {\n\t\t\t\t\t\t\t$info['warning'][] = 'Found '.$SynchErrorsFound.' synch errors in histogram analysis';\n\t\t\t\t\t\t\t//return false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$bittotal     = 0;\n\t\t\t\t\t\t$framecounter = 0;\n\t\t\t\t\t\tforeach ($info['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) {\n\t\t\t\t\t\t\t$framecounter += $bitratecount;\n\t\t\t\t\t\t\tif ($bitratevalue != 'free') {\n\t\t\t\t\t\t\t\t$bittotal += ($bitratevalue * $bitratecount);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($framecounter == 0) {\n\t\t\t\t\t\t\t$info['error'][] = 'Corrupt MP3 file: framecounter == zero';\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$info['mpeg']['audio']['frame_count'] = getid3_lib::CastAsInt($framecounter);\n\t\t\t\t\t\t$info['mpeg']['audio']['bitrate']     = ($bittotal / $framecounter);\n\n\t\t\t\t\t\t$info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate'];\n\n\n\t\t\t\t\t\t// Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently\n\t\t\t\t\t\t$distinct_bitrates = 0;\n\t\t\t\t\t\tforeach ($info['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) {\n\t\t\t\t\t\t\tif ($bitrate_count > 0) {\n\t\t\t\t\t\t\t\t$distinct_bitrates++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($distinct_bitrates > 1) {\n\t\t\t\t\t\t\t$info['mpeg']['audio']['bitrate_mode'] = 'vbr';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$info['mpeg']['audio']['bitrate_mode'] = 'cbr';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode'];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak; // exit while()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$SynchSeekOffset++;\n\t\t\tif (($avdataoffset + $SynchSeekOffset) >= $info['avdataend']) {\n\t\t\t\t// end of file/data\n\n\t\t\t\tif (empty($info['mpeg']['audio'])) {\n\n\t\t\t\t\t$info['error'][] = 'could not find valid MPEG synch before end of file';\n\t\t\t\t\tif (isset($info['audio']['bitrate'])) {\n\t\t\t\t\t\tunset($info['audio']['bitrate']);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($info['mpeg']['audio'])) {\n\t\t\t\t\t\tunset($info['mpeg']['audio']);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($info['mpeg']) && (!is_array($info['mpeg']) || empty($info['mpeg']))) {\n\t\t\t\t\t\tunset($info['mpeg']);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n\t\t$info['audio']['channels']        = $info['mpeg']['audio']['channels'];\n\t\t$info['audio']['channelmode']     = $info['mpeg']['audio']['channelmode'];\n\t\t$info['audio']['sample_rate']     = $info['mpeg']['audio']['sample_rate'];\n\t\treturn true;\n\t}\n\n\n\tpublic static function MPEGaudioVersionArray() {\n\t\tstatic $MPEGaudioVersion = array('2.5', false, '2', '1');\n\t\treturn $MPEGaudioVersion;\n\t}\n\n\tpublic static function MPEGaudioLayerArray() {\n\t\tstatic $MPEGaudioLayer = array(false, 3, 2, 1);\n\t\treturn $MPEGaudioLayer;\n\t}\n\n\tpublic static function MPEGaudioBitrateArray() {\n\t\tstatic $MPEGaudioBitrate;\n\t\tif (empty($MPEGaudioBitrate)) {\n\t\t\t$MPEGaudioBitrate = array (\n\t\t\t\t'1'  =>  array (1 => array('free', 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000),\n\t\t\t\t\t\t\t\t2 => array('free', 32000, 48000, 56000,  64000,  80000,  96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000),\n\t\t\t\t\t\t\t\t3 => array('free', 32000, 40000, 48000,  56000,  64000,  80000,  96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000)\n\t\t\t\t\t\t\t   ),\n\n\t\t\t\t'2'  =>  array (1 => array('free', 32000, 48000, 56000,  64000,  80000,  96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000),\n\t\t\t\t\t\t\t\t2 => array('free',  8000, 16000, 24000,  32000,  40000,  48000,  56000,  64000,  80000,  96000, 112000, 128000, 144000, 160000),\n\t\t\t\t\t\t\t   )\n\t\t\t);\n\t\t\t$MPEGaudioBitrate['2'][3] = $MPEGaudioBitrate['2'][2];\n\t\t\t$MPEGaudioBitrate['2.5']  = $MPEGaudioBitrate['2'];\n\t\t}\n\t\treturn $MPEGaudioBitrate;\n\t}\n\n\tpublic static function MPEGaudioFrequencyArray() {\n\t\tstatic $MPEGaudioFrequency;\n\t\tif (empty($MPEGaudioFrequency)) {\n\t\t\t$MPEGaudioFrequency = array (\n\t\t\t\t'1'   => array(44100, 48000, 32000),\n\t\t\t\t'2'   => array(22050, 24000, 16000),\n\t\t\t\t'2.5' => array(11025, 12000,  8000)\n\t\t\t);\n\t\t}\n\t\treturn $MPEGaudioFrequency;\n\t}\n\n\tpublic static function MPEGaudioChannelModeArray() {\n\t\tstatic $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono');\n\t\treturn $MPEGaudioChannelMode;\n\t}\n\n\tpublic static function MPEGaudioModeExtensionArray() {\n\t\tstatic $MPEGaudioModeExtension;\n\t\tif (empty($MPEGaudioModeExtension)) {\n\t\t\t$MPEGaudioModeExtension = array (\n\t\t\t\t1 => array('4-31', '8-31', '12-31', '16-31'),\n\t\t\t\t2 => array('4-31', '8-31', '12-31', '16-31'),\n\t\t\t\t3 => array('', 'IS', 'MS', 'IS+MS')\n\t\t\t);\n\t\t}\n\t\treturn $MPEGaudioModeExtension;\n\t}\n\n\tpublic static function MPEGaudioEmphasisArray() {\n\t\tstatic $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17');\n\t\treturn $MPEGaudioEmphasis;\n\t}\n\n\tpublic static function MPEGaudioHeaderBytesValid($head4, $allowBitrate15=false) {\n\t\treturn self::MPEGaudioHeaderValid(self::MPEGaudioHeaderDecode($head4), false, $allowBitrate15);\n\t}\n\n\tpublic static function MPEGaudioHeaderValid($rawarray, $echoerrors=false, $allowBitrate15=false) {\n\t\tif (($rawarray['synch'] & 0x0FFE) != 0x0FFE) {\n\t\t\treturn false;\n\t\t}\n\n\t\tstatic $MPEGaudioVersionLookup;\n\t\tstatic $MPEGaudioLayerLookup;\n\t\tstatic $MPEGaudioBitrateLookup;\n\t\tstatic $MPEGaudioFrequencyLookup;\n\t\tstatic $MPEGaudioChannelModeLookup;\n\t\tstatic $MPEGaudioModeExtensionLookup;\n\t\tstatic $MPEGaudioEmphasisLookup;\n\t\tif (empty($MPEGaudioVersionLookup)) {\n\t\t\t$MPEGaudioVersionLookup       = self::MPEGaudioVersionArray();\n\t\t\t$MPEGaudioLayerLookup         = self::MPEGaudioLayerArray();\n\t\t\t$MPEGaudioBitrateLookup       = self::MPEGaudioBitrateArray();\n\t\t\t$MPEGaudioFrequencyLookup     = self::MPEGaudioFrequencyArray();\n\t\t\t$MPEGaudioChannelModeLookup   = self::MPEGaudioChannelModeArray();\n\t\t\t$MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray();\n\t\t\t$MPEGaudioEmphasisLookup      = self::MPEGaudioEmphasisArray();\n\t\t}\n\n\t\tif (isset($MPEGaudioVersionLookup[$rawarray['version']])) {\n\t\t\t$decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']];\n\t\t} else {\n\t\t\techo ($echoerrors ? \"\\n\".'invalid Version ('.$rawarray['version'].')' : '');\n\t\t\treturn false;\n\t\t}\n\t\tif (isset($MPEGaudioLayerLookup[$rawarray['layer']])) {\n\t\t\t$decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']];\n\t\t} else {\n\t\t\techo ($echoerrors ? \"\\n\".'invalid Layer ('.$rawarray['layer'].')' : '');\n\t\t\treturn false;\n\t\t}\n\t\tif (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) {\n\t\t\techo ($echoerrors ? \"\\n\".'invalid Bitrate ('.$rawarray['bitrate'].')' : '');\n\t\t\tif ($rawarray['bitrate'] == 15) {\n\t\t\t\t// known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0\n\t\t\t\t// let it go through here otherwise file will not be identified\n\t\t\t\tif (!$allowBitrate15) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) {\n\t\t\techo ($echoerrors ? \"\\n\".'invalid Frequency ('.$rawarray['sample_rate'].')' : '');\n\t\t\treturn false;\n\t\t}\n\t\tif (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) {\n\t\t\techo ($echoerrors ? \"\\n\".'invalid ChannelMode ('.$rawarray['channelmode'].')' : '');\n\t\t\treturn false;\n\t\t}\n\t\tif (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) {\n\t\t\techo ($echoerrors ? \"\\n\".'invalid Mode Extension ('.$rawarray['modeextension'].')' : '');\n\t\t\treturn false;\n\t\t}\n\t\tif (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) {\n\t\t\techo ($echoerrors ? \"\\n\".'invalid Emphasis ('.$rawarray['emphasis'].')' : '');\n\t\t\treturn false;\n\t\t}\n\t\t// These are just either set or not set, you can't mess that up :)\n\t\t// $rawarray['protection'];\n\t\t// $rawarray['padding'];\n\t\t// $rawarray['private'];\n\t\t// $rawarray['copyright'];\n\t\t// $rawarray['original'];\n\n\t\treturn true;\n\t}\n\n\tpublic static function MPEGaudioHeaderDecode($Header4Bytes) {\n\t\t// AAAA AAAA  AAAB BCCD  EEEE FFGH  IIJJ KLMM\n\t\t// A - Frame sync (all bits set)\n\t\t// B - MPEG Audio version ID\n\t\t// C - Layer description\n\t\t// D - Protection bit\n\t\t// E - Bitrate index\n\t\t// F - Sampling rate frequency index\n\t\t// G - Padding bit\n\t\t// H - Private bit\n\t\t// I - Channel Mode\n\t\t// J - Mode extension (Only if Joint stereo)\n\t\t// K - Copyright\n\t\t// L - Original\n\t\t// M - Emphasis\n\n\t\tif (strlen($Header4Bytes) != 4) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$MPEGrawHeader['synch']         = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4;\n\t\t$MPEGrawHeader['version']       = (ord($Header4Bytes{1}) & 0x18) >> 3; //    BB\n\t\t$MPEGrawHeader['layer']         = (ord($Header4Bytes{1}) & 0x06) >> 1; //      CC\n\t\t$MPEGrawHeader['protection']    = (ord($Header4Bytes{1}) & 0x01);      //        D\n\t\t$MPEGrawHeader['bitrate']       = (ord($Header4Bytes{2}) & 0xF0) >> 4; // EEEE\n\t\t$MPEGrawHeader['sample_rate']   = (ord($Header4Bytes{2}) & 0x0C) >> 2; //     FF\n\t\t$MPEGrawHeader['padding']       = (ord($Header4Bytes{2}) & 0x02) >> 1; //       G\n\t\t$MPEGrawHeader['private']       = (ord($Header4Bytes{2}) & 0x01);      //        H\n\t\t$MPEGrawHeader['channelmode']   = (ord($Header4Bytes{3}) & 0xC0) >> 6; // II\n\t\t$MPEGrawHeader['modeextension'] = (ord($Header4Bytes{3}) & 0x30) >> 4; //   JJ\n\t\t$MPEGrawHeader['copyright']     = (ord($Header4Bytes{3}) & 0x08) >> 3; //     K\n\t\t$MPEGrawHeader['original']      = (ord($Header4Bytes{3}) & 0x04) >> 2; //      L\n\t\t$MPEGrawHeader['emphasis']      = (ord($Header4Bytes{3}) & 0x03);      //       MM\n\n\t\treturn $MPEGrawHeader;\n\t}\n\n\tpublic static function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) {\n\t\tstatic $AudioFrameLengthCache = array();\n\n\t\tif (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) {\n\t\t\t$AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false;\n\t\t\tif ($bitrate != 'free') {\n\n\t\t\t\tif ($version == '1') {\n\n\t\t\t\t\tif ($layer == '1') {\n\n\t\t\t\t\t\t// For Layer I slot is 32 bits long\n\t\t\t\t\t\t$FrameLengthCoefficient = 48;\n\t\t\t\t\t\t$SlotLength = 4;\n\n\t\t\t\t\t} else { // Layer 2 / 3\n\n\t\t\t\t\t\t// for Layer 2 and Layer 3 slot is 8 bits long.\n\t\t\t\t\t\t$FrameLengthCoefficient = 144;\n\t\t\t\t\t\t$SlotLength = 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else { // MPEG-2 / MPEG-2.5\n\n\t\t\t\t\tif ($layer == '1') {\n\n\t\t\t\t\t\t// For Layer I slot is 32 bits long\n\t\t\t\t\t\t$FrameLengthCoefficient = 24;\n\t\t\t\t\t\t$SlotLength = 4;\n\n\t\t\t\t\t} elseif ($layer == '2') {\n\n\t\t\t\t\t\t// for Layer 2 and Layer 3 slot is 8 bits long.\n\t\t\t\t\t\t$FrameLengthCoefficient = 144;\n\t\t\t\t\t\t$SlotLength = 1;\n\n\t\t\t\t\t} else { // layer 3\n\n\t\t\t\t\t\t// for Layer 2 and Layer 3 slot is 8 bits long.\n\t\t\t\t\t\t$FrameLengthCoefficient = 72;\n\t\t\t\t\t\t$SlotLength = 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding\n\t\t\t\tif ($samplerate > 0) {\n\t\t\t\t\t$NewFramelength  = ($FrameLengthCoefficient * $bitrate) / $samplerate;\n\t\t\t\t\t$NewFramelength  = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer 2/3, 4 bytes for Layer I)\n\t\t\t\t\tif ($padding) {\n\t\t\t\t\t\t$NewFramelength += $SlotLength;\n\t\t\t\t\t}\n\t\t\t\t\t$AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate];\n\t}\n\n\tpublic static function ClosestStandardMP3Bitrate($bit_rate) {\n\t\tstatic $standard_bit_rates = array (320000, 256000, 224000, 192000, 160000, 128000, 112000, 96000, 80000, 64000, 56000, 48000, 40000, 32000, 24000, 16000, 8000);\n\t\tstatic $bit_rate_table = array (0=>'-');\n\t\t$round_bit_rate = intval(round($bit_rate, -3));\n\t\tif (!isset($bit_rate_table[$round_bit_rate])) {\n\t\t\tif ($round_bit_rate > max($standard_bit_rates)) {\n\t\t\t\t$bit_rate_table[$round_bit_rate] = round($bit_rate, 2 - strlen($bit_rate));\n\t\t\t} else {\n\t\t\t\t$bit_rate_table[$round_bit_rate] = max($standard_bit_rates);\n\t\t\t\tforeach ($standard_bit_rates as $standard_bit_rate) {\n\t\t\t\t\tif ($round_bit_rate >= $standard_bit_rate + (($bit_rate_table[$round_bit_rate] - $standard_bit_rate) / 2)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$bit_rate_table[$round_bit_rate] = $standard_bit_rate;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $bit_rate_table[$round_bit_rate];\n\t}\n\n\tpublic static function XingVBRidOffset($version, $channelmode) {\n\t\tstatic $XingVBRidOffsetCache = array();\n\t\tif (empty($XingVBRidOffset)) {\n\t\t\t$XingVBRidOffset = array (\n\t\t\t\t'1'   => array ('mono'          => 0x15, // 4 + 17 = 21\n\t\t\t\t\t\t\t\t'stereo'        => 0x24, // 4 + 32 = 36\n\t\t\t\t\t\t\t\t'joint stereo'  => 0x24,\n\t\t\t\t\t\t\t\t'dual channel'  => 0x24\n\t\t\t\t\t\t\t   ),\n\n\t\t\t\t'2'   => array ('mono'          => 0x0D, // 4 +  9 = 13\n\t\t\t\t\t\t\t\t'stereo'        => 0x15, // 4 + 17 = 21\n\t\t\t\t\t\t\t\t'joint stereo'  => 0x15,\n\t\t\t\t\t\t\t\t'dual channel'  => 0x15\n\t\t\t\t\t\t\t   ),\n\n\t\t\t\t'2.5' => array ('mono'          => 0x15,\n\t\t\t\t\t\t\t\t'stereo'        => 0x15,\n\t\t\t\t\t\t\t\t'joint stereo'  => 0x15,\n\t\t\t\t\t\t\t\t'dual channel'  => 0x15\n\t\t\t\t\t\t\t   )\n\t\t\t);\n\t\t}\n\t\treturn $XingVBRidOffset[$version][$channelmode];\n\t}\n\n\tpublic static function LAMEvbrMethodLookup($VBRmethodID) {\n\t\tstatic $LAMEvbrMethodLookup = array(\n\t\t\t0x00 => 'unknown',\n\t\t\t0x01 => 'cbr',\n\t\t\t0x02 => 'abr',\n\t\t\t0x03 => 'vbr-old / vbr-rh',\n\t\t\t0x04 => 'vbr-new / vbr-mtrh',\n\t\t\t0x05 => 'vbr-mt',\n\t\t\t0x06 => 'vbr (full vbr method 4)',\n\t\t\t0x08 => 'cbr (constant bitrate 2 pass)',\n\t\t\t0x09 => 'abr (2 pass)',\n\t\t\t0x0F => 'reserved'\n\t\t);\n\t\treturn (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : '');\n\t}\n\n\tpublic static function LAMEmiscStereoModeLookup($StereoModeID) {\n\t\tstatic $LAMEmiscStereoModeLookup = array(\n\t\t\t0 => 'mono',\n\t\t\t1 => 'stereo',\n\t\t\t2 => 'dual mono',\n\t\t\t3 => 'joint stereo',\n\t\t\t4 => 'forced stereo',\n\t\t\t5 => 'auto',\n\t\t\t6 => 'intensity stereo',\n\t\t\t7 => 'other'\n\t\t);\n\t\treturn (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : '');\n\t}\n\n\tpublic static function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) {\n\t\tstatic $LAMEmiscSourceSampleFrequencyLookup = array(\n\t\t\t0 => '<= 32 kHz',\n\t\t\t1 => '44.1 kHz',\n\t\t\t2 => '48 kHz',\n\t\t\t3 => '> 48kHz'\n\t\t);\n\t\treturn (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : '');\n\t}\n\n\tpublic static function LAMEsurroundInfoLookup($SurroundInfoID) {\n\t\tstatic $LAMEsurroundInfoLookup = array(\n\t\t\t0 => 'no surround info',\n\t\t\t1 => 'DPL encoding',\n\t\t\t2 => 'DPL2 encoding',\n\t\t\t3 => 'Ambisonic encoding'\n\t\t);\n\t\treturn (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved');\n\t}\n\n\tpublic static function LAMEpresetUsedLookup($LAMEtag) {\n\n\t\tif ($LAMEtag['preset_used_id'] == 0) {\n\t\t\t// no preset used (LAME >=3.93)\n\t\t\t// no preset recorded (LAME <3.93)\n\t\t\treturn '';\n\t\t}\n\t\t$LAMEpresetUsedLookup = array();\n\n\t\t/////  THIS PART CANNOT BE STATIC .\n\t\tfor ($i = 8; $i <= 320; $i++) {\n\t\t\tswitch ($LAMEtag['vbr_method']) {\n\t\t\t\tcase 'cbr':\n\t\t\t\t\t$LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'abr':\n\t\t\t\tdefault: // other VBR modes shouldn't be here(?)\n\t\t\t\t\t$LAMEpresetUsedLookup[$i] = '--alt-preset '.$i;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions()\n\n\t\t// named alt-presets\n\t\t$LAMEpresetUsedLookup[1000] = '--r3mix';\n\t\t$LAMEpresetUsedLookup[1001] = '--alt-preset standard';\n\t\t$LAMEpresetUsedLookup[1002] = '--alt-preset extreme';\n\t\t$LAMEpresetUsedLookup[1003] = '--alt-preset insane';\n\t\t$LAMEpresetUsedLookup[1004] = '--alt-preset fast standard';\n\t\t$LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme';\n\t\t$LAMEpresetUsedLookup[1006] = '--alt-preset medium';\n\t\t$LAMEpresetUsedLookup[1007] = '--alt-preset fast medium';\n\n\t\t// LAME 3.94 additions/changes\n\t\t$LAMEpresetUsedLookup[1010] = '--preset portable';                                                           // 3.94a15 Oct 21 2003\n\t\t$LAMEpresetUsedLookup[1015] = '--preset radio';                                                              // 3.94a15 Oct 21 2003\n\n\t\t$LAMEpresetUsedLookup[320]  = '--preset insane';                                                             // 3.94a15 Nov 12 2003\n\t\t$LAMEpresetUsedLookup[410]  = '-V9';\n\t\t$LAMEpresetUsedLookup[420]  = '-V8';\n\t\t$LAMEpresetUsedLookup[440]  = '-V6';\n\t\t$LAMEpresetUsedLookup[430]  = '--preset radio';                                                              // 3.94a15 Nov 12 2003\n\t\t$LAMEpresetUsedLookup[450]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable';  // 3.94a15 Nov 12 2003\n\t\t$LAMEpresetUsedLookup[460]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium';    // 3.94a15 Nov 12 2003\n\t\t$LAMEpresetUsedLookup[470]  = '--r3mix';                                                                     // 3.94b1  Dec 18 2003\n\t\t$LAMEpresetUsedLookup[480]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard';  // 3.94a15 Nov 12 2003\n\t\t$LAMEpresetUsedLookup[490]  = '-V1';\n\t\t$LAMEpresetUsedLookup[500]  = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme';   // 3.94a15 Nov 12 2003\n\n\t\treturn (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org');\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.audio.ogg.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.audio.ogg.php                                        //\n// module for analyzing Ogg Vorbis, OggFLAC and Speex files    //\n// dependencies: module.audio.flac.php                         //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true);\n\nclass getid3_ogg extends getid3_handler\n{\n\t// http://xiph.org/vorbis/doc/Vorbis_I_spec.html\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t$info['fileformat'] = 'ogg';\n\n\t\t// Warn about illegal tags - only vorbiscomments are allowed\n\t\tif (isset($info['id3v2'])) {\n\t\t\t$info['warning'][] = 'Illegal ID3v2 tag present.';\n\t\t}\n\t\tif (isset($info['id3v1'])) {\n\t\t\t$info['warning'][] = 'Illegal ID3v1 tag present.';\n\t\t}\n\t\tif (isset($info['ape'])) {\n\t\t\t$info['warning'][] = 'Illegal APE tag present.';\n\t\t}\n\n\n\t\t// Page 1 - Stream Header\n\n\t\t$this->fseek($info['avdataoffset']);\n\n\t\t$oggpageinfo = $this->ParseOggPageHeader();\n\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;\n\n\t\tif ($this->ftell() >= $this->getid3->fread_buffer_size()) {\n\t\t\t$info['error'][] = 'Could not find start of Ogg page in the first '.$this->getid3->fread_buffer_size().' bytes (this might not be an Ogg-Vorbis file?)';\n\t\t\tunset($info['fileformat']);\n\t\t\tunset($info['ogg']);\n\t\t\treturn false;\n\t\t}\n\n\t\t$filedata = $this->fread($oggpageinfo['page_length']);\n\t\t$filedataoffset = 0;\n\n\t\tif (substr($filedata, 0, 4) == 'fLaC') {\n\n\t\t\t$info['audio']['dataformat']   = 'flac';\n\t\t\t$info['audio']['bitrate_mode'] = 'vbr';\n\t\t\t$info['audio']['lossless']     = true;\n\n\t\t} elseif (substr($filedata, 1, 6) == 'vorbis') {\n\n\t\t\t$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);\n\n\t\t} elseif (substr($filedata, 0, 8) == 'OpusHead') {\n\n\t\t\tif( $this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) == false ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t} elseif (substr($filedata, 0, 8) == 'Speex   ') {\n\n\t\t\t// http://www.speex.org/manual/node10.html\n\n\t\t\t$info['audio']['dataformat']   = 'speex';\n\t\t\t$info['mime_type']             = 'audio/speex';\n\t\t\t$info['audio']['bitrate_mode'] = 'abr';\n\t\t\t$info['audio']['lossless']     = false;\n\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_string']           =                              substr($filedata, $filedataoffset, 8); // hard-coded to 'Speex   '\n\t\t\t$filedataoffset += 8;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']          =                              substr($filedata, $filedataoffset, 20);\n\t\t\t$filedataoffset += 20;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version_id']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['header_size']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate']                   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']                   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode_bitstream_version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['bitrate']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['framesize']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr']                    = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['frames_per_packet']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['extra_headers']          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved1']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved2']              = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t\t$filedataoffset += 4;\n\n\t\t\t$info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']);\n\t\t\t$info['speex']['sample_rate']   = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'];\n\t\t\t$info['speex']['channels']      = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'];\n\t\t\t$info['speex']['vbr']           = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'];\n\t\t\t$info['speex']['band_type']     = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']);\n\n\t\t\t$info['audio']['sample_rate']   = $info['speex']['sample_rate'];\n\t\t\t$info['audio']['channels']      = $info['speex']['channels'];\n\t\t\tif ($info['speex']['vbr']) {\n\t\t\t\t$info['audio']['bitrate_mode'] = 'vbr';\n\t\t\t}\n\n\t\t} elseif (substr($filedata, 0, 7) == \"\\x80\".'theora') {\n\n\t\t\t// http://www.theora.org/doc/Theora.pdf (section 6.2)\n\n\t\t\t$info['ogg']['pageheader']['theora']['theora_magic']             =                           substr($filedata, $filedataoffset,  7); // hard-coded to \"\\x80.'theora'\n\t\t\t$filedataoffset += 7;\n\t\t\t$info['ogg']['pageheader']['theora']['version_major']            = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t\t$filedataoffset += 1;\n\t\t\t$info['ogg']['pageheader']['theora']['version_minor']            = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t\t$filedataoffset += 1;\n\t\t\t$info['ogg']['pageheader']['theora']['version_revision']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t\t$filedataoffset += 1;\n\t\t\t$info['ogg']['pageheader']['theora']['frame_width_macroblocks']  = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));\n\t\t\t$filedataoffset += 2;\n\t\t\t$info['ogg']['pageheader']['theora']['frame_height_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));\n\t\t\t$filedataoffset += 2;\n\t\t\t$info['ogg']['pageheader']['theora']['resolution_x']             = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));\n\t\t\t$filedataoffset += 3;\n\t\t\t$info['ogg']['pageheader']['theora']['resolution_y']             = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));\n\t\t\t$filedataoffset += 3;\n\t\t\t$info['ogg']['pageheader']['theora']['picture_offset_x']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t\t$filedataoffset += 1;\n\t\t\t$info['ogg']['pageheader']['theora']['picture_offset_y']         = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t\t$filedataoffset += 1;\n\t\t\t$info['ogg']['pageheader']['theora']['frame_rate_numerator']     = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader']['theora']['frame_rate_denominator']   = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  4));\n\t\t\t$filedataoffset += 4;\n\t\t\t$info['ogg']['pageheader']['theora']['pixel_aspect_numerator']   = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));\n\t\t\t$filedataoffset += 3;\n\t\t\t$info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));\n\t\t\t$filedataoffset += 3;\n\t\t\t$info['ogg']['pageheader']['theora']['color_space_id']           = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t\t$filedataoffset += 1;\n\t\t\t$info['ogg']['pageheader']['theora']['nominal_bitrate']          = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  3));\n\t\t\t$filedataoffset += 3;\n\t\t\t$info['ogg']['pageheader']['theora']['flags']                    = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset,  2));\n\t\t\t$filedataoffset += 2;\n\n\t\t\t$info['ogg']['pageheader']['theora']['quality']         = ($info['ogg']['pageheader']['theora']['flags'] & 0xFC00) >> 10;\n\t\t\t$info['ogg']['pageheader']['theora']['kfg_shift']       = ($info['ogg']['pageheader']['theora']['flags'] & 0x03E0) >>  5;\n\t\t\t$info['ogg']['pageheader']['theora']['pixel_format_id'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0018) >>  3;\n\t\t\t$info['ogg']['pageheader']['theora']['reserved']        = ($info['ogg']['pageheader']['theora']['flags'] & 0x0007) >>  0; // should be 0\n\t\t\t$info['ogg']['pageheader']['theora']['color_space']     = self::TheoraColorSpace($info['ogg']['pageheader']['theora']['color_space_id']);\n\t\t\t$info['ogg']['pageheader']['theora']['pixel_format']    = self::TheoraPixelFormat($info['ogg']['pageheader']['theora']['pixel_format_id']);\n\n\t\t\t$info['video']['dataformat']   = 'theora';\n\t\t\t$info['mime_type']             = 'video/ogg';\n\t\t\t//$info['audio']['bitrate_mode'] = 'abr';\n\t\t\t//$info['audio']['lossless']     = false;\n\t\t\t$info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x'];\n\t\t\t$info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y'];\n\t\t\tif ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) {\n\t\t\t\t$info['video']['frame_rate'] = (float) $info['ogg']['pageheader']['theora']['frame_rate_numerator'] / $info['ogg']['pageheader']['theora']['frame_rate_denominator'];\n\t\t\t}\n\t\t\tif ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) {\n\t\t\t\t$info['video']['pixel_aspect_ratio'] = (float) $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] / $info['ogg']['pageheader']['theora']['pixel_aspect_denominator'];\n\t\t\t}\n$info['warning'][] = 'Ogg Theora (v3) not fully supported in this version of getID3 ['.$this->getid3->version().'] -- bitrate, playtime and all audio data are currently unavailable';\n\n\n\t\t} elseif (substr($filedata, 0, 8) == \"fishead\\x00\") {\n\n\t\t\t// Ogg Skeleton version 3.0 Format Specification\n\t\t\t// http://xiph.org/ogg/doc/skeleton.html\n\t\t\t$filedataoffset += 8;\n\t\t\t$info['ogg']['skeleton']['fishead']['raw']['version_major']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));\n\t\t\t$filedataoffset += 2;\n\t\t\t$info['ogg']['skeleton']['fishead']['raw']['version_minor']                = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));\n\t\t\t$filedataoffset += 2;\n\t\t\t$info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));\n\t\t\t$filedataoffset += 8;\n\t\t\t$info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));\n\t\t\t$filedataoffset += 8;\n\t\t\t$info['ogg']['skeleton']['fishead']['raw']['basetime_numerator']           = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));\n\t\t\t$filedataoffset += 8;\n\t\t\t$info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));\n\t\t\t$filedataoffset += 8;\n\t\t\t$info['ogg']['skeleton']['fishead']['raw']['utc']                          = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20));\n\t\t\t$filedataoffset += 20;\n\n\t\t\t$info['ogg']['skeleton']['fishead']['version']          = $info['ogg']['skeleton']['fishead']['raw']['version_major'].'.'.$info['ogg']['skeleton']['fishead']['raw']['version_minor'];\n\t\t\t$info['ogg']['skeleton']['fishead']['presentationtime'] = $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'];\n\t\t\t$info['ogg']['skeleton']['fishead']['basetime']         = $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator']         / $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator'];\n\t\t\t$info['ogg']['skeleton']['fishead']['utc']              = $info['ogg']['skeleton']['fishead']['raw']['utc'];\n\n\n\t\t\t$counter = 0;\n\t\t\tdo {\n\t\t\t\t$oggpageinfo = $this->ParseOggPageHeader();\n\t\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo;\n\t\t\t\t$filedata = $this->fread($oggpageinfo['page_length']);\n\t\t\t\t$this->fseek($oggpageinfo['page_end_offset']);\n\n\t\t\t\tif (substr($filedata, 0, 8) == \"fisbone\\x00\") {\n\n\t\t\t\t\t$filedataoffset = 8;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['message_header_offset']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));\n\t\t\t\t\t$filedataoffset += 4;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['serial_number']           = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));\n\t\t\t\t\t$filedataoffset += 4;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['number_header_packets']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));\n\t\t\t\t\t$filedataoffset += 4;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['granulerate_numerator']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));\n\t\t\t\t\t$filedataoffset += 8;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['granulerate_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));\n\t\t\t\t\t$filedataoffset += 8;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['basegranule']             = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  8));\n\t\t\t\t\t$filedataoffset += 8;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['preroll']                 = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));\n\t\t\t\t\t$filedataoffset += 4;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['granuleshift']            = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t\t\t\t$filedataoffset += 1;\n\t\t\t\t\t$info['ogg']['skeleton']['fisbone']['raw']['padding']                 =                              substr($filedata, $filedataoffset,  3);\n\t\t\t\t\t$filedataoffset += 3;\n\n\t\t\t\t} elseif (substr($filedata, 1, 6) == 'theora') {\n\n\t\t\t\t\t$info['video']['dataformat'] = 'theora1';\n\t\t\t\t\t$info['error'][] = 'Ogg Theora (v1) not correctly handled in this version of getID3 ['.$this->getid3->version().']';\n\t\t\t\t\t//break;\n\n\t\t\t\t} elseif (substr($filedata, 1, 6) == 'vorbis') {\n\n\t\t\t\t\t$this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo);\n\n\t\t\t\t} else {\n\t\t\t\t\t$info['error'][] = 'unexpected';\n\t\t\t\t\t//break;\n\t\t\t\t}\n\t\t\t//} while ($oggpageinfo['page_seqno'] == 0);\n\t\t\t} while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != \"fisbone\\x00\"));\n\n\t\t\t$this->fseek($oggpageinfo['page_start_offset']);\n\n\t\t\t$info['error'][] = 'Ogg Skeleton not correctly handled in this version of getID3 ['.$this->getid3->version().']';\n\t\t\t//return false;\n\n\t\t} else {\n\n\t\t\t$info['error'][] = 'Expecting either \"Speex   \", \"OpusHead\" or \"vorbis\" identifier strings, found \"'.substr($filedata, 0, 8).'\"';\n\t\t\tunset($info['ogg']);\n\t\t\tunset($info['mime_type']);\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// Page 2 - Comment Header\n\t\t$oggpageinfo = $this->ParseOggPageHeader();\n\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;\n\n\t\tswitch ($info['audio']['dataformat']) {\n\t\t\tcase 'vorbis':\n\t\t\t\t$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);\n\t\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, 0, 1));\n\t\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] =                              substr($filedata, 1, 6); // hard-coded to 'vorbis'\n\n\t\t\t\t$this->ParseVorbisComments();\n\t\t\t\tbreak;\n\n\t\t\tcase 'flac':\n\t\t\t\t$flac = new getid3_flac($this->getid3);\n\t\t\t\tif (!$flac->parseMETAdata()) {\n\t\t\t\t\t$info['error'][] = 'Failed to parse FLAC headers';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tunset($flac);\n\t\t\t\tbreak;\n\n\t\t\tcase 'speex':\n\t\t\t\t$this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR);\n\t\t\t\t$this->ParseVorbisComments();\n\t\t\t\tbreak;\n\n\t\t\tcase 'opus':\n\t\t\t\t$filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);\n\t\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 0, 8); // hard-coded to 'OpusTags'\n\t\t\t\tif(substr($filedata, 0, 8)  != 'OpusTags') {\n\t\t\t\t\t$info['error'][] = 'Expected \"OpusTags\" as header but got \"'.substr($filedata, 0, 8).'\"';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t$this->ParseVorbisComments();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// Last Page - Number of Samples\n\t\tif (!getid3_lib::intValueSupported($info['avdataend'])) {\n\n\t\t\t$info['warning'][] = 'Unable to parse Ogg end chunk file (PHP does not support file operations beyond '.round(PHP_INT_MAX / 1073741824).'GB)';\n\n\t\t} else {\n\n\t\t\t$this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0));\n\t\t\t$LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size()));\n\t\t\tif ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) {\n\t\t\t\t$this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO')));\n\t\t\t\t$info['avdataend'] = $this->ftell();\n\t\t\t\t$info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader();\n\t\t\t\t$info['ogg']['samples']   = $info['ogg']['pageheader']['eos']['pcm_abs_position'];\n\t\t\t\tif ($info['ogg']['samples'] == 0) {\n\t\t\t\t\t$info['error'][] = 'Corrupt Ogg file: eos.number of samples == zero';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (!empty($info['audio']['sample_rate'])) {\n\t\t\t\t\t$info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / ($info['ogg']['samples'] / $info['audio']['sample_rate']);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif (!empty($info['ogg']['bitrate_average'])) {\n\t\t\t$info['audio']['bitrate'] = $info['ogg']['bitrate_average'];\n\t\t} elseif (!empty($info['ogg']['bitrate_nominal'])) {\n\t\t\t$info['audio']['bitrate'] = $info['ogg']['bitrate_nominal'];\n\t\t} elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) {\n\t\t\t$info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2;\n\t\t}\n\t\tif (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) {\n\t\t\tif ($info['audio']['bitrate'] == 0) {\n\t\t\t\t$info['error'][] = 'Corrupt Ogg file: bitrate_audio == zero';\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t$info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']);\n\t\t}\n\n\t\tif (isset($info['ogg']['vendor'])) {\n\t\t\t$info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']);\n\n\t\t\t// Vorbis only\n\t\t\tif ($info['audio']['dataformat'] == 'vorbis') {\n\n\t\t\t\t// Vorbis 1.0 starts with Xiph.Org\n\t\t\t\tif  (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) {\n\n\t\t\t\t\tif ($info['audio']['bitrate_mode'] == 'abr') {\n\n\t\t\t\t\t\t// Set -b 128 on abr files\n\t\t\t\t\t\t$info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000);\n\n\t\t\t\t\t} elseif (($info['audio']['bitrate_mode'] == 'vbr') && ($info['audio']['channels'] == 2) && ($info['audio']['sample_rate'] >= 44100) && ($info['audio']['sample_rate'] <= 48000)) {\n\t\t\t\t\t\t// Set -q N on vbr files\n\t\t\t\t\t\t$info['audio']['encoder_options'] = '-q '.$this->get_quality_from_nominal_bitrate($info['ogg']['bitrate_nominal']);\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) {\n\t\t\t\t\t$info['audio']['encoder_options'] = 'Nominal bitrate: '.intval(round($info['ogg']['bitrate_nominal'] / 1000)).'kbps';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {\n\t\t$info = &$this->getid3->info;\n\t\t$info['audio']['dataformat'] = 'vorbis';\n\t\t$info['audio']['lossless']   = false;\n\n\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));\n\t\t$filedataoffset += 1;\n\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, $filedataoffset, 6); // hard-coded to 'vorbis'\n\t\t$filedataoffset += 6;\n\t\t$info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t$filedataoffset += 4;\n\t\t$info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));\n\t\t$filedataoffset += 1;\n\t\t$info['audio']['channels']       = $info['ogg']['numberofchannels'];\n\t\t$info['ogg']['samplerate']       = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t$filedataoffset += 4;\n\t\tif ($info['ogg']['samplerate'] == 0) {\n\t\t\t$info['error'][] = 'Corrupt Ogg file: sample rate == zero';\n\t\t\treturn false;\n\t\t}\n\t\t$info['audio']['sample_rate']    = $info['ogg']['samplerate'];\n\t\t$info['ogg']['samples']          = 0; // filled in later\n\t\t$info['ogg']['bitrate_average']  = 0; // filled in later\n\t\t$info['ogg']['bitrate_max']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t$filedataoffset += 4;\n\t\t$info['ogg']['bitrate_nominal']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t$filedataoffset += 4;\n\t\t$info['ogg']['bitrate_min']      = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t$filedataoffset += 4;\n\t\t$info['ogg']['blocksize_small']  = pow(2,  getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0x0F);\n\t\t$info['ogg']['blocksize_large']  = pow(2, (getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0xF0) >> 4);\n\t\t$info['ogg']['stop_bit']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); // must be 1, marks end of packet\n\n\t\t$info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr\n\t\tif ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) {\n\t\t\tunset($info['ogg']['bitrate_max']);\n\t\t\t$info['audio']['bitrate_mode'] = 'abr';\n\t\t}\n\t\tif ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) {\n\t\t\tunset($info['ogg']['bitrate_nominal']);\n\t\t}\n\t\tif ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) {\n\t\t\tunset($info['ogg']['bitrate_min']);\n\t\t\t$info['audio']['bitrate_mode'] = 'abr';\n\t\t}\n\t\treturn true;\n\t}\n\n\t// http://tools.ietf.org/html/draft-ietf-codec-oggopus-03\n\tpublic function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) {\n\t\t$info = &$this->getid3->info;\n\t\t$info['audio']['dataformat']   = 'opus';\n\t\t$info['mime_type']             = 'audio/ogg; codecs=opus';\n\n\t\t/** @todo find a usable way to detect abr (vbr that is padded to be abr) */\n\t\t$info['audio']['bitrate_mode'] = 'vbr';\n\n\t\t$info['audio']['lossless']     = false;\n\n\t\t$info['ogg']['pageheader']['opus']['opus_magic'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'OpusHead'\n\t\t$filedataoffset += 8;\n\t\t$info['ogg']['pageheader']['opus']['version']    = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t$filedataoffset += 1;\n\n\t\tif ($info['ogg']['pageheader']['opus']['version'] < 1 || $info['ogg']['pageheader']['opus']['version'] > 15) {\n\t\t\t$info['error'][] = 'Unknown opus version number (only accepting 1-15)';\n\t\t\treturn false;\n\t\t}\n\n\t\t$info['ogg']['pageheader']['opus']['out_channel_count'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t$filedataoffset += 1;\n\n\t\tif ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) {\n\t\t\t$info['error'][] = 'Invalid channel count in opus header (must not be zero)';\n\t\t\treturn false;\n\t\t}\n\n\t\t$info['ogg']['pageheader']['opus']['pre_skip'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));\n\t\t$filedataoffset += 2;\n\n\t\t$info['ogg']['pageheader']['opus']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  4));\n\t\t$filedataoffset += 4;\n\n\t\t//$info['ogg']['pageheader']['opus']['output_gain'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  2));\n\t\t//$filedataoffset += 2;\n\n\t\t//$info['ogg']['pageheader']['opus']['channel_mapping_family'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset,  1));\n\t\t//$filedataoffset += 1;\n\n\t\t$info['opus']['opus_version']      = $info['ogg']['pageheader']['opus']['version'];\n\t\t$info['opus']['sample_rate']       = $info['ogg']['pageheader']['opus']['sample_rate'];\n\t\t$info['opus']['out_channel_count'] = $info['ogg']['pageheader']['opus']['out_channel_count'];\n\n\t\t$info['audio']['channels']      = $info['opus']['out_channel_count'];\n\t\t$info['audio']['sample_rate']   = $info['opus']['sample_rate'];\n\t\treturn true;\n\t}\n\n\n\tpublic function ParseOggPageHeader() {\n\t\t// http://xiph.org/ogg/vorbis/doc/framing.html\n\t\t$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file\n\n\t\t$filedata = $this->fread($this->getid3->fread_buffer_size());\n\t\t$filedataoffset = 0;\n\t\twhile ((substr($filedata, $filedataoffset++, 4) != 'OggS')) {\n\t\t\tif (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) {\n\t\t\t\t// should be found before here\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) {\n\t\t\t\tif ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === false)) {\n\t\t\t\t\t// get some more data, unless eof, in which case fail\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS'\n\n\t\t$oggheader['stream_structver']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));\n\t\t$filedataoffset += 1;\n\t\t$oggheader['flags_raw']         = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));\n\t\t$filedataoffset += 1;\n\t\t$oggheader['flags']['fresh']    = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet\n\t\t$oggheader['flags']['bos']      = (bool) ($oggheader['flags_raw'] & 0x02); // first page of logical bitstream (bos)\n\t\t$oggheader['flags']['eos']      = (bool) ($oggheader['flags_raw'] & 0x04); // last page of logical bitstream (eos)\n\n\t\t$oggheader['pcm_abs_position']  = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8));\n\t\t$filedataoffset += 8;\n\t\t$oggheader['stream_serialno']   = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t$filedataoffset += 4;\n\t\t$oggheader['page_seqno']        = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t$filedataoffset += 4;\n\t\t$oggheader['page_checksum']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4));\n\t\t$filedataoffset += 4;\n\t\t$oggheader['page_segments']     = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));\n\t\t$filedataoffset += 1;\n\t\t$oggheader['page_length'] = 0;\n\t\tfor ($i = 0; $i < $oggheader['page_segments']; $i++) {\n\t\t\t$oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1));\n\t\t\t$filedataoffset += 1;\n\t\t\t$oggheader['page_length'] += $oggheader['segment_table'][$i];\n\t\t}\n\t\t$oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset;\n\t\t$oggheader['page_end_offset']   = $oggheader['header_end_offset'] + $oggheader['page_length'];\n\t\t$this->fseek($oggheader['header_end_offset']);\n\n\t\treturn $oggheader;\n\t}\n\n    // http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005\n\tpublic function ParseVorbisComments() {\n\t\t$info = &$this->getid3->info;\n\n\t\t$OriginalOffset = $this->ftell();\n\t\t$commentdataoffset = 0;\n\t\t$VorbisCommentPage = 1;\n\n\t\tswitch ($info['audio']['dataformat']) {\n\t\t\tcase 'vorbis':\n\t\t\tcase 'speex':\n\t\t\tcase 'opus':\n\t\t\t\t$CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset'];  // Second Ogg page, after header block\n\t\t\t\t$this->fseek($CommentStartOffset);\n\t\t\t\t$commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments'];\n\t\t\t\t$commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset);\n\n\t\t\t\tif ($info['audio']['dataformat'] == 'vorbis') {\n\t\t\t\t\t$commentdataoffset += (strlen('vorbis') + 1);\n\t\t\t\t}\n\t\t\t\telse if ($info['audio']['dataformat'] == 'opus') {\n\t\t\t\t\t$commentdataoffset += strlen('OpusTags');\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'flac':\n\t\t\t\t$CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4;\n\t\t\t\t$this->fseek($CommentStartOffset);\n\t\t\t\t$commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\n\t\t$VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));\n\t\t$commentdataoffset += 4;\n\n\t\t$info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize);\n\t\t$commentdataoffset += $VendorSize;\n\n\t\t$CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));\n\t\t$commentdataoffset += 4;\n\t\t$info['avdataoffset'] = $CommentStartOffset + $commentdataoffset;\n\n\t\t$basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT');\n\t\t$ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw'];\n\t\tfor ($i = 0; $i < $CommentsCount; $i++) {\n\n\t\t\tif ($i >= 10000) {\n\t\t\t\t// https://github.com/owncloud/music/issues/212#issuecomment-43082336\n\t\t\t\t$info['warning'][] = 'Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments';\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset;\n\n\t\t\tif ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) {\n\t\t\t\tif ($oggpageinfo = $this->ParseOggPageHeader()) {\n\t\t\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;\n\n\t\t\t\t\t$VorbisCommentPage++;\n\n\t\t\t\t\t// First, save what we haven't read yet\n\t\t\t\t\t$AsYetUnusedData = substr($commentdata, $commentdataoffset);\n\n\t\t\t\t\t// Then take that data off the end\n\t\t\t\t\t$commentdata     = substr($commentdata, 0, $commentdataoffset);\n\n\t\t\t\t\t// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct\n\t\t\t\t\t$commentdata .= str_repeat(\"\\x00\", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);\n\t\t\t\t\t$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);\n\n\t\t\t\t\t// Finally, stick the unused data back on the end\n\t\t\t\t\t$commentdata .= $AsYetUnusedData;\n\n\t\t\t\t\t//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);\n\t\t\t\t\t$commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1));\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t$ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4));\n\n\t\t\t// replace avdataoffset with position just after the last vorbiscomment\n\t\t\t$info['avdataoffset'] = $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + $ThisFileInfo_ogg_comments_raw[$i]['size'] + 4;\n\n\t\t\t$commentdataoffset += 4;\n\t\t\twhile ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) {\n\t\t\t\tif (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) {\n\t\t\t\t\t$info['warning'][] = 'Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments';\n\t\t\t\t\tbreak 2;\n\t\t\t\t}\n\n\t\t\t\t$VorbisCommentPage++;\n\n\t\t\t\t$oggpageinfo = $this->ParseOggPageHeader();\n\t\t\t\t$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;\n\n\t\t\t\t// First, save what we haven't read yet\n\t\t\t\t$AsYetUnusedData = substr($commentdata, $commentdataoffset);\n\n\t\t\t\t// Then take that data off the end\n\t\t\t\t$commentdata     = substr($commentdata, 0, $commentdataoffset);\n\n\t\t\t\t// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct\n\t\t\t\t$commentdata .= str_repeat(\"\\x00\", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);\n\t\t\t\t$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);\n\n\t\t\t\t// Finally, stick the unused data back on the end\n\t\t\t\t$commentdata .= $AsYetUnusedData;\n\n\t\t\t\t//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);\n\t\t\t\tif (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {\n\t\t\t\t\t$info['warning'][] = 'undefined Vorbis Comment page \"'.$VorbisCommentPage.'\" at offset '.$this->ftell();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);\n\t\t\t\tif ($readlength <= 0) {\n\t\t\t\t\t$info['warning'][] = 'invalid length Vorbis Comment page \"'.$VorbisCommentPage.'\" at offset '.$this->ftell();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t$commentdata .= $this->fread($readlength);\n\n\t\t\t\t//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];\n\t\t\t}\n\t\t\t$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;\n\t\t\t$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);\n\t\t\t$commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size'];\n\n\t\t\tif (!$commentstring) {\n\n\t\t\t\t// no comment?\n\t\t\t\t$info['warning'][] = 'Blank Ogg comment ['.$i.']';\n\n\t\t\t} elseif (strstr($commentstring, '=')) {\n\n\t\t\t\t$commentexploded = explode('=', $commentstring, 2);\n\t\t\t\t$ThisFileInfo_ogg_comments_raw[$i]['key']   = strtoupper($commentexploded[0]);\n\t\t\t\t$ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : '');\n\n\t\t\t\tif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') {\n\n\t\t\t\t\t// http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE\n\t\t\t\t\t// The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard.\n\t\t\t\t\t// http://flac.sourceforge.net/format.html#metadata_block_picture\n\t\t\t\t\t$flac = new getid3_flac($this->getid3);\n\t\t\t\t\t$flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']));\n\t\t\t\t\t$flac->parsePICTURE();\n\t\t\t\t\t$info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0];\n\t\t\t\t\tunset($flac);\n\n\t\t\t\t} elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') {\n\n\t\t\t\t\t$data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']);\n\t\t\t\t\t$this->notice('Found deprecated COVERART tag, it should be replaced in honor of METADATA_BLOCK_PICTURE structure');\n\t\t\t\t\t/** @todo use 'coverartmime' where available */\n\t\t\t\t\t$imageinfo = getid3_lib::GetDataImageSize($data);\n\t\t\t\t\tif ($imageinfo === false || !isset($imageinfo['mime'])) {\n\t\t\t\t\t\t$this->warning('COVERART vorbiscomment tag contains invalid image');\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$ogg = new self($this->getid3);\n\t\t\t\t\t$ogg->setStringMode($data);\n\t\t\t\t\t$info['ogg']['comments']['picture'][] = array(\n\t\t\t\t\t\t'image_mime'   => $imageinfo['mime'],\n\t\t\t\t\t\t'datalength'   => strlen($data),\n\t\t\t\t\t\t'picturetype'  => 'cover art',\n\t\t\t\t\t\t'image_height' => $imageinfo['height'],\n\t\t\t\t\t\t'image_width'  => $imageinfo['width'],\n\t\t\t\t\t\t'data'         => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']),\n\t\t\t\t\t);\n\t\t\t\t\tunset($ogg);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t$info['ogg']['comments'][strtolower($ThisFileInfo_ogg_comments_raw[$i]['key'])][] = $ThisFileInfo_ogg_comments_raw[$i]['value'];\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t$info['warning'][] = '[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring;\n\n\t\t\t}\n\t\t\tunset($ThisFileInfo_ogg_comments_raw[$i]);\n\t\t}\n\t\tunset($ThisFileInfo_ogg_comments_raw);\n\n\n\t\t// Replay Gain Adjustment\n\t\t// http://privatewww.essex.ac.uk/~djmrob/replaygain/\n\t\tif (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) {\n\t\t\tforeach ($info['ogg']['comments'] as $index => $commentvalue) {\n\t\t\t\tswitch ($index) {\n\t\t\t\t\tcase 'rg_audiophile':\n\t\t\t\t\tcase 'replaygain_album_gain':\n\t\t\t\t\t\t$info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0];\n\t\t\t\t\t\tunset($info['ogg']['comments'][$index]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rg_radio':\n\t\t\t\t\tcase 'replaygain_track_gain':\n\t\t\t\t\t\t$info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0];\n\t\t\t\t\t\tunset($info['ogg']['comments'][$index]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'replaygain_album_peak':\n\t\t\t\t\t\t$info['replay_gain']['album']['peak'] = (double) $commentvalue[0];\n\t\t\t\t\t\tunset($info['ogg']['comments'][$index]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rg_peak':\n\t\t\t\t\tcase 'replaygain_track_peak':\n\t\t\t\t\t\t$info['replay_gain']['track']['peak'] = (double) $commentvalue[0];\n\t\t\t\t\t\tunset($info['ogg']['comments'][$index]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'replaygain_reference_loudness':\n\t\t\t\t\t\t$info['replay_gain']['reference_volume'] = (double) $commentvalue[0];\n\t\t\t\t\t\tunset($info['ogg']['comments'][$index]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// do nothing\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$this->fseek($OriginalOffset);\n\n\t\treturn true;\n\t}\n\n\tpublic static function SpeexBandModeLookup($mode) {\n\t\tstatic $SpeexBandModeLookup = array();\n\t\tif (empty($SpeexBandModeLookup)) {\n\t\t\t$SpeexBandModeLookup[0] = 'narrow';\n\t\t\t$SpeexBandModeLookup[1] = 'wide';\n\t\t\t$SpeexBandModeLookup[2] = 'ultra-wide';\n\t\t}\n\t\treturn (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null);\n\t}\n\n\n\tpublic static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) {\n\t\tfor ($i = 0; $i < $SegmentNumber; $i++) {\n\t\t\t$segmentlength = 0;\n\t\t\tforeach ($OggInfoArray['segment_table'] as $key => $value) {\n\t\t\t\t$segmentlength += $value;\n\t\t\t\tif ($value < 255) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $segmentlength;\n\t}\n\n\n\tpublic static function get_quality_from_nominal_bitrate($nominal_bitrate) {\n\n\t\t// decrease precision\n\t\t$nominal_bitrate = $nominal_bitrate / 1000;\n\n\t\tif ($nominal_bitrate < 128) {\n\t\t\t// q-1 to q4\n\t\t\t$qval = ($nominal_bitrate - 64) / 16;\n\t\t} elseif ($nominal_bitrate < 256) {\n\t\t\t// q4 to q8\n\t\t\t$qval = $nominal_bitrate / 32;\n\t\t} elseif ($nominal_bitrate < 320) {\n\t\t\t// q8 to q9\n\t\t\t$qval = ($nominal_bitrate + 256) / 64;\n\t\t} else {\n\t\t\t// q9 to q10\n\t\t\t$qval = ($nominal_bitrate + 1300) / 180;\n\t\t}\n\t\t//return $qval; // 5.031324\n\t\t//return intval($qval); // 5\n\t\treturn round($qval, 1); // 5 or 4.9\n\t}\n\n\tpublic static function TheoraColorSpace($colorspace_id) {\n\t\t// http://www.theora.org/doc/Theora.pdf (table 6.3)\n\t\tstatic $TheoraColorSpaceLookup = array();\n\t\tif (empty($TheoraColorSpaceLookup)) {\n\t\t\t$TheoraColorSpaceLookup[0] = 'Undefined';\n\t\t\t$TheoraColorSpaceLookup[1] = 'Rec. 470M';\n\t\t\t$TheoraColorSpaceLookup[2] = 'Rec. 470BG';\n\t\t\t$TheoraColorSpaceLookup[3] = 'Reserved';\n\t\t}\n\t\treturn (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null);\n\t}\n\n\tpublic static function TheoraPixelFormat($pixelformat_id) {\n\t\t// http://www.theora.org/doc/Theora.pdf (table 6.4)\n\t\tstatic $TheoraPixelFormatLookup = array();\n\t\tif (empty($TheoraPixelFormatLookup)) {\n\t\t\t$TheoraPixelFormatLookup[0] = '4:2:0';\n\t\t\t$TheoraPixelFormatLookup[1] = 'Reserved';\n\t\t\t$TheoraPixelFormatLookup[2] = '4:2:2';\n\t\t\t$TheoraPixelFormatLookup[3] = '4:4:4';\n\t\t}\n\t\treturn (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null);\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.tag.apetag.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.tag.apetag.php                                       //\n// module for analyzing APE tags                               //\n// dependencies: NONE                                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\nclass getid3_apetag extends getid3_handler\n{\n\tpublic $inline_attachments = true; // true: return full data for all attachments; false: return no data for all attachments; integer: return data for attachments <= than this; string: save as file to this directory\n\tpublic $overrideendoffset  = 0;\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\tif (!getid3_lib::intValueSupported($info['filesize'])) {\n\t\t\t$info['warning'][] = 'Unable to check for APEtags because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB';\n\t\t\treturn false;\n\t\t}\n\n\t\t$id3v1tagsize     = 128;\n\t\t$apetagheadersize = 32;\n\t\t$lyrics3tagsize   = 10;\n\n\t\tif ($this->overrideendoffset == 0) {\n\n\t\t\t$this->fseek(0 - $id3v1tagsize - $apetagheadersize - $lyrics3tagsize, SEEK_END);\n\t\t\t$APEfooterID3v1 = $this->fread($id3v1tagsize + $apetagheadersize + $lyrics3tagsize);\n\n\t\t\t//if (preg_match('/APETAGEX.{24}TAG.{125}$/i', $APEfooterID3v1)) {\n\t\t\tif (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $id3v1tagsize - $apetagheadersize, 8) == 'APETAGEX') {\n\n\t\t\t\t// APE tag found before ID3v1\n\t\t\t\t$info['ape']['tag_offset_end'] = $info['filesize'] - $id3v1tagsize;\n\n\t\t\t//} elseif (preg_match('/APETAGEX.{24}$/i', $APEfooterID3v1)) {\n\t\t\t} elseif (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $apetagheadersize, 8) == 'APETAGEX') {\n\n\t\t\t\t// APE tag found, no ID3v1\n\t\t\t\t$info['ape']['tag_offset_end'] = $info['filesize'];\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t$this->fseek($this->overrideendoffset - $apetagheadersize);\n\t\t\tif ($this->fread(8) == 'APETAGEX') {\n\t\t\t\t$info['ape']['tag_offset_end'] = $this->overrideendoffset;\n\t\t\t}\n\n\t\t}\n\t\tif (!isset($info['ape']['tag_offset_end'])) {\n\n\t\t\t// APE tag not found\n\t\t\tunset($info['ape']);\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// shortcut\n\t\t$thisfile_ape = &$info['ape'];\n\n\t\t$this->fseek($thisfile_ape['tag_offset_end'] - $apetagheadersize);\n\t\t$APEfooterData = $this->fread(32);\n\t\tif (!($thisfile_ape['footer'] = $this->parseAPEheaderFooter($APEfooterData))) {\n\t\t\t$info['error'][] = 'Error parsing APE footer at offset '.$thisfile_ape['tag_offset_end'];\n\t\t\treturn false;\n\t\t}\n\n\t\tif (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) {\n\t\t\t$this->fseek($thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize'] - $apetagheadersize);\n\t\t\t$thisfile_ape['tag_offset_start'] = $this->ftell();\n\t\t\t$APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize'] + $apetagheadersize);\n\t\t} else {\n\t\t\t$thisfile_ape['tag_offset_start'] = $thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize'];\n\t\t\t$this->fseek($thisfile_ape['tag_offset_start']);\n\t\t\t$APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize']);\n\t\t}\n\t\t$info['avdataend'] = $thisfile_ape['tag_offset_start'];\n\n\t\tif (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] < $thisfile_ape['tag_offset_end'])) {\n\t\t\t$info['warning'][] = 'ID3v1 tag information ignored since it appears to be a false synch in APEtag data';\n\t\t\tunset($info['id3v1']);\n\t\t\tforeach ($info['warning'] as $key => $value) {\n\t\t\t\tif ($value == 'Some ID3v1 fields do not use NULL characters for padding') {\n\t\t\t\t\tunset($info['warning'][$key]);\n\t\t\t\t\tsort($info['warning']);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$offset = 0;\n\t\tif (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) {\n\t\t\tif ($thisfile_ape['header'] = $this->parseAPEheaderFooter(substr($APEtagData, 0, $apetagheadersize))) {\n\t\t\t\t$offset += $apetagheadersize;\n\t\t\t} else {\n\t\t\t\t$info['error'][] = 'Error parsing APE header at offset '.$thisfile_ape['tag_offset_start'];\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// shortcut\n\t\t$info['replay_gain'] = array();\n\t\t$thisfile_replaygain = &$info['replay_gain'];\n\n\t\tfor ($i = 0; $i < $thisfile_ape['footer']['raw']['tag_items']; $i++) {\n\t\t\t$value_size = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4));\n\t\t\t$offset += 4;\n\t\t\t$item_flags = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4));\n\t\t\t$offset += 4;\n\t\t\tif (strstr(substr($APEtagData, $offset), \"\\x00\") === false) {\n\t\t\t\t$info['error'][] = 'Cannot find null-byte (0x00) seperator between ItemKey #'.$i.' and value. ItemKey starts '.$offset.' bytes into the APE tag, at file offset '.($thisfile_ape['tag_offset_start'] + $offset);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t$ItemKeyLength = strpos($APEtagData, \"\\x00\", $offset) - $offset;\n\t\t\t$item_key      = strtolower(substr($APEtagData, $offset, $ItemKeyLength));\n\n\t\t\t// shortcut\n\t\t\t$thisfile_ape['items'][$item_key] = array();\n\t\t\t$thisfile_ape_items_current = &$thisfile_ape['items'][$item_key];\n\n\t\t\t$thisfile_ape_items_current['offset'] = $thisfile_ape['tag_offset_start'] + $offset;\n\n\t\t\t$offset += ($ItemKeyLength + 1); // skip 0x00 terminator\n\t\t\t$thisfile_ape_items_current['data'] = substr($APEtagData, $offset, $value_size);\n\t\t\t$offset += $value_size;\n\n\t\t\t$thisfile_ape_items_current['flags'] = $this->parseAPEtagFlags($item_flags);\n\t\t\tswitch ($thisfile_ape_items_current['flags']['item_contents_raw']) {\n\t\t\t\tcase 0: // UTF-8\n\t\t\t\tcase 2: // Locator (URL, filename, etc), UTF-8 encoded\n\t\t\t\t\t$thisfile_ape_items_current['data'] = explode(\"\\x00\", $thisfile_ape_items_current['data']);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:  // binary data\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tswitch (strtolower($item_key)) {\n\t\t\t\t// http://wiki.hydrogenaud.io/index.php?title=ReplayGain#MP3Gain\n\t\t\t\tcase 'replaygain_track_gain':\n\t\t\t\t\tif (preg_match('#^[\\\\-\\\\+][0-9\\\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) {\n\t\t\t\t\t\t$thisfile_replaygain['track']['adjustment'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see \"0,95\" as zero!\n\t\t\t\t\t\t$thisfile_replaygain['track']['originator'] = 'unspecified';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'MP3gainTrackGain value in APEtag appears invalid: \"'.$thisfile_ape_items_current['data'][0].'\"';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'replaygain_track_peak':\n\t\t\t\t\tif (preg_match('#^[0-9\\\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) {\n\t\t\t\t\t\t$thisfile_replaygain['track']['peak']       = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see \"0,95\" as zero!\n\t\t\t\t\t\t$thisfile_replaygain['track']['originator'] = 'unspecified';\n\t\t\t\t\t\tif ($thisfile_replaygain['track']['peak'] <= 0) {\n\t\t\t\t\t\t\t$info['warning'][] = 'ReplayGain Track peak from APEtag appears invalid: '.$thisfile_replaygain['track']['peak'].' (original value = \"'.$thisfile_ape_items_current['data'][0].'\")';\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'MP3gainTrackPeak value in APEtag appears invalid: \"'.$thisfile_ape_items_current['data'][0].'\"';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'replaygain_album_gain':\n\t\t\t\t\tif (preg_match('#^[\\\\-\\\\+][0-9\\\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) {\n\t\t\t\t\t\t$thisfile_replaygain['album']['adjustment'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see \"0,95\" as zero!\n\t\t\t\t\t\t$thisfile_replaygain['album']['originator'] = 'unspecified';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'MP3gainAlbumGain value in APEtag appears invalid: \"'.$thisfile_ape_items_current['data'][0].'\"';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'replaygain_album_peak':\n\t\t\t\t\tif (preg_match('#^[0-9\\\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) {\n\t\t\t\t\t\t$thisfile_replaygain['album']['peak']       = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see \"0,95\" as zero!\n\t\t\t\t\t\t$thisfile_replaygain['album']['originator'] = 'unspecified';\n\t\t\t\t\t\tif ($thisfile_replaygain['album']['peak'] <= 0) {\n\t\t\t\t\t\t\t$info['warning'][] = 'ReplayGain Album peak from APEtag appears invalid: '.$thisfile_replaygain['album']['peak'].' (original value = \"'.$thisfile_ape_items_current['data'][0].'\")';\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'MP3gainAlbumPeak value in APEtag appears invalid: \"'.$thisfile_ape_items_current['data'][0].'\"';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mp3gain_undo':\n\t\t\t\t\tif (preg_match('#^[\\\\-\\\\+][0-9]{3},[\\\\-\\\\+][0-9]{3},[NW]$#', $thisfile_ape_items_current['data'][0])) {\n\t\t\t\t\t\tlist($mp3gain_undo_left, $mp3gain_undo_right, $mp3gain_undo_wrap) = explode(',', $thisfile_ape_items_current['data'][0]);\n\t\t\t\t\t\t$thisfile_replaygain['mp3gain']['undo_left']  = intval($mp3gain_undo_left);\n\t\t\t\t\t\t$thisfile_replaygain['mp3gain']['undo_right'] = intval($mp3gain_undo_right);\n\t\t\t\t\t\t$thisfile_replaygain['mp3gain']['undo_wrap']  = (($mp3gain_undo_wrap == 'Y') ? true : false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'MP3gainUndo value in APEtag appears invalid: \"'.$thisfile_ape_items_current['data'][0].'\"';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mp3gain_minmax':\n\t\t\t\t\tif (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) {\n\t\t\t\t\t\tlist($mp3gain_globalgain_min, $mp3gain_globalgain_max) = explode(',', $thisfile_ape_items_current['data'][0]);\n\t\t\t\t\t\t$thisfile_replaygain['mp3gain']['globalgain_track_min'] = intval($mp3gain_globalgain_min);\n\t\t\t\t\t\t$thisfile_replaygain['mp3gain']['globalgain_track_max'] = intval($mp3gain_globalgain_max);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'MP3gainMinMax value in APEtag appears invalid: \"'.$thisfile_ape_items_current['data'][0].'\"';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mp3gain_album_minmax':\n\t\t\t\t\tif (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) {\n\t\t\t\t\t\tlist($mp3gain_globalgain_album_min, $mp3gain_globalgain_album_max) = explode(',', $thisfile_ape_items_current['data'][0]);\n\t\t\t\t\t\t$thisfile_replaygain['mp3gain']['globalgain_album_min'] = intval($mp3gain_globalgain_album_min);\n\t\t\t\t\t\t$thisfile_replaygain['mp3gain']['globalgain_album_max'] = intval($mp3gain_globalgain_album_max);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'MP3gainAlbumMinMax value in APEtag appears invalid: \"'.$thisfile_ape_items_current['data'][0].'\"';\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'tracknumber':\n\t\t\t\t\tif (is_array($thisfile_ape_items_current['data'])) {\n\t\t\t\t\t\tforeach ($thisfile_ape_items_current['data'] as $comment) {\n\t\t\t\t\t\t\t$thisfile_ape['comments']['track'][] = $comment;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'cover art (artist)':\n\t\t\t\tcase 'cover art (back)':\n\t\t\t\tcase 'cover art (band logo)':\n\t\t\t\tcase 'cover art (band)':\n\t\t\t\tcase 'cover art (colored fish)':\n\t\t\t\tcase 'cover art (composer)':\n\t\t\t\tcase 'cover art (conductor)':\n\t\t\t\tcase 'cover art (front)':\n\t\t\t\tcase 'cover art (icon)':\n\t\t\t\tcase 'cover art (illustration)':\n\t\t\t\tcase 'cover art (lead)':\n\t\t\t\tcase 'cover art (leaflet)':\n\t\t\t\tcase 'cover art (lyricist)':\n\t\t\t\tcase 'cover art (media)':\n\t\t\t\tcase 'cover art (movie scene)':\n\t\t\t\tcase 'cover art (other icon)':\n\t\t\t\tcase 'cover art (other)':\n\t\t\t\tcase 'cover art (performance)':\n\t\t\t\tcase 'cover art (publisher logo)':\n\t\t\t\tcase 'cover art (recording)':\n\t\t\t\tcase 'cover art (studio)':\n\t\t\t\t\t// list of possible cover arts from http://taglib-sharp.sourcearchive.com/documentation/2.0.3.0-2/Ape_2Tag_8cs-source.html\n\t\t\t\t\tif (is_array($thisfile_ape_items_current['data'])) {\n\t\t\t\t\t\t$info['warning'][] = 'APEtag \"'.$item_key.'\" should be flagged as Binary data, but was incorrectly flagged as UTF-8';\n\t\t\t\t\t\t$thisfile_ape_items_current['data'] = implode(\"\\x00\", $thisfile_ape_items_current['data']);\n\t\t\t\t\t}\n\t\t\t\t\tlist($thisfile_ape_items_current['filename'], $thisfile_ape_items_current['data']) = explode(\"\\x00\", $thisfile_ape_items_current['data'], 2);\n\t\t\t\t\t$thisfile_ape_items_current['data_offset'] = $thisfile_ape_items_current['offset'] + strlen($thisfile_ape_items_current['filename'].\"\\x00\");\n\t\t\t\t\t$thisfile_ape_items_current['data_length'] = strlen($thisfile_ape_items_current['data']);\n\n\t\t\t\t\t$thisfile_ape_items_current['image_mime'] = '';\n\t\t\t\t\t$imageinfo = array();\n\t\t\t\t\t$imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_ape_items_current['data'], $imageinfo);\n\t\t\t\t\t$thisfile_ape_items_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]);\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\tif ($this->inline_attachments === false) {\n\t\t\t\t\t\t\t// skip entirely\n\t\t\t\t\t\t\tunset($thisfile_ape_items_current['data']);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($this->inline_attachments === true) {\n\t\t\t\t\t\t\t// great\n\t\t\t\t\t\t} elseif (is_int($this->inline_attachments)) {\n\t\t\t\t\t\t\tif ($this->inline_attachments < $thisfile_ape_items_current['data_length']) {\n\t\t\t\t\t\t\t\t// too big, skip\n\t\t\t\t\t\t\t\t$info['warning'][] = 'attachment at '.$thisfile_ape_items_current['offset'].' is too large to process inline ('.number_format($thisfile_ape_items_current['data_length']).' bytes)';\n\t\t\t\t\t\t\t\tunset($thisfile_ape_items_current['data']);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} elseif (is_string($this->inline_attachments)) {\n\t\t\t\t\t\t\t$this->inline_attachments = rtrim(str_replace(array('/', '\\\\'), DIRECTORY_SEPARATOR, $this->inline_attachments), DIRECTORY_SEPARATOR);\n\t\t\t\t\t\t\tif (!is_dir($this->inline_attachments) || !is_writable($this->inline_attachments)) {\n\t\t\t\t\t\t\t\t// cannot write, skip\n\t\t\t\t\t\t\t\t$info['warning'][] = 'attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to \"'.$this->inline_attachments.'\" (not writable)';\n\t\t\t\t\t\t\t\tunset($thisfile_ape_items_current['data']);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if we get this far, must be OK\n\t\t\t\t\t\tif (is_string($this->inline_attachments)) {\n\t\t\t\t\t\t\t$destination_filename = $this->inline_attachments.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$thisfile_ape_items_current['data_offset'];\n\t\t\t\t\t\t\tif (!file_exists($destination_filename) || is_writable($destination_filename)) {\n\t\t\t\t\t\t\t\tfile_put_contents($destination_filename, $thisfile_ape_items_current['data']);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$info['warning'][] = 'attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to \"'.$destination_filename.'\" (not writable)';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$thisfile_ape_items_current['data_filename'] = $destination_filename;\n\t\t\t\t\t\t\tunset($thisfile_ape_items_current['data']);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (!isset($info['ape']['comments']['picture'])) {\n\t\t\t\t\t\t\t\t$info['ape']['comments']['picture'] = array();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$comments_picture_data = array();\n\t\t\t\t\t\t\tforeach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) {\n\t\t\t\t\t\t\t\tif (isset($thisfile_ape_items_current[$picture_key])) {\n\t\t\t\t\t\t\t\t\t$comments_picture_data[$picture_key] = $thisfile_ape_items_current[$picture_key];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$info['ape']['comments']['picture'][] = $comments_picture_data;\n\t\t\t\t\t\t\tunset($comments_picture_data);\n\t\t\t\t\t\t}\n\t\t\t\t\t} while (false);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tif (is_array($thisfile_ape_items_current['data'])) {\n\t\t\t\t\t\tforeach ($thisfile_ape_items_current['data'] as $comment) {\n\t\t\t\t\t\t\t$thisfile_ape['comments'][strtolower($item_key)][] = $comment;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n\t\tif (empty($thisfile_replaygain)) {\n\t\t\tunset($info['replay_gain']);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic function parseAPEheaderFooter($APEheaderFooterData) {\n\t\t// http://www.uni-jena.de/~pfk/mpp/sv8/apeheader.html\n\n\t\t// shortcut\n\t\t$headerfooterinfo['raw'] = array();\n\t\t$headerfooterinfo_raw = &$headerfooterinfo['raw'];\n\n\t\t$headerfooterinfo_raw['footer_tag']   =                  substr($APEheaderFooterData,  0, 8);\n\t\tif ($headerfooterinfo_raw['footer_tag'] != 'APETAGEX') {\n\t\t\treturn false;\n\t\t}\n\t\t$headerfooterinfo_raw['version']      = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData,  8, 4));\n\t\t$headerfooterinfo_raw['tagsize']      = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 12, 4));\n\t\t$headerfooterinfo_raw['tag_items']    = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 16, 4));\n\t\t$headerfooterinfo_raw['global_flags'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 20, 4));\n\t\t$headerfooterinfo_raw['reserved']     =                              substr($APEheaderFooterData, 24, 8);\n\n\t\t$headerfooterinfo['tag_version']         = $headerfooterinfo_raw['version'] / 1000;\n\t\tif ($headerfooterinfo['tag_version'] >= 2) {\n\t\t\t$headerfooterinfo['flags'] = $this->parseAPEtagFlags($headerfooterinfo_raw['global_flags']);\n\t\t}\n\t\treturn $headerfooterinfo;\n\t}\n\n\tpublic function parseAPEtagFlags($rawflagint) {\n\t\t// \"Note: APE Tags 1.0 do not use any of the APE Tag flags.\n\t\t// All are set to zero on creation and ignored on reading.\"\n\t\t// http://wiki.hydrogenaud.io/index.php?title=Ape_Tags_Flags\n\t\t$flags['header']            = (bool) ($rawflagint & 0x80000000);\n\t\t$flags['footer']            = (bool) ($rawflagint & 0x40000000);\n\t\t$flags['this_is_header']    = (bool) ($rawflagint & 0x20000000);\n\t\t$flags['item_contents_raw'] =        ($rawflagint & 0x00000006) >> 1;\n\t\t$flags['read_only']         = (bool) ($rawflagint & 0x00000001);\n\n\t\t$flags['item_contents']     = $this->APEcontentTypeFlagLookup($flags['item_contents_raw']);\n\n\t\treturn $flags;\n\t}\n\n\tpublic function APEcontentTypeFlagLookup($contenttypeid) {\n\t\tstatic $APEcontentTypeFlagLookup = array(\n\t\t\t0 => 'utf-8',\n\t\t\t1 => 'binary',\n\t\t\t2 => 'external',\n\t\t\t3 => 'reserved'\n\t\t);\n\t\treturn (isset($APEcontentTypeFlagLookup[$contenttypeid]) ? $APEcontentTypeFlagLookup[$contenttypeid] : 'invalid');\n\t}\n\n\tpublic function APEtagItemIsUTF8Lookup($itemkey) {\n\t\tstatic $APEtagItemIsUTF8Lookup = array(\n\t\t\t'title',\n\t\t\t'subtitle',\n\t\t\t'artist',\n\t\t\t'album',\n\t\t\t'debut album',\n\t\t\t'publisher',\n\t\t\t'conductor',\n\t\t\t'track',\n\t\t\t'composer',\n\t\t\t'comment',\n\t\t\t'copyright',\n\t\t\t'publicationright',\n\t\t\t'file',\n\t\t\t'year',\n\t\t\t'record date',\n\t\t\t'record location',\n\t\t\t'genre',\n\t\t\t'media',\n\t\t\t'related',\n\t\t\t'isrc',\n\t\t\t'abstract',\n\t\t\t'language',\n\t\t\t'bibliography'\n\t\t);\n\t\treturn in_array(strtolower($itemkey), $APEtagItemIsUTF8Lookup);\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.tag.id3v1.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n//                                                             //\n// module.tag.id3v1.php                                        //\n// module for analyzing ID3v1 tags                             //\n// dependencies: NONE                                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n\nclass getid3_id3v1 extends getid3_handler\n{\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\tif (!getid3_lib::intValueSupported($info['filesize'])) {\n\t\t\t$info['warning'][] = 'Unable to check for ID3v1 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB';\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->fseek(-256, SEEK_END);\n\t\t$preid3v1 = $this->fread(128);\n\t\t$id3v1tag = $this->fread(128);\n\n\t\tif (substr($id3v1tag, 0, 3) == 'TAG') {\n\n\t\t\t$info['avdataend'] = $info['filesize'] - 128;\n\n\t\t\t$ParsedID3v1['title']   = $this->cutfield(substr($id3v1tag,   3, 30));\n\t\t\t$ParsedID3v1['artist']  = $this->cutfield(substr($id3v1tag,  33, 30));\n\t\t\t$ParsedID3v1['album']   = $this->cutfield(substr($id3v1tag,  63, 30));\n\t\t\t$ParsedID3v1['year']    = $this->cutfield(substr($id3v1tag,  93,  4));\n\t\t\t$ParsedID3v1['comment'] =                 substr($id3v1tag,  97, 30);  // can't remove nulls yet, track detection depends on them\n\t\t\t$ParsedID3v1['genreid'] =             ord(substr($id3v1tag, 127,  1));\n\n\t\t\t// If second-last byte of comment field is null and last byte of comment field is non-null\n\t\t\t// then this is ID3v1.1 and the comment field is 28 bytes long and the 30th byte is the track number\n\t\t\tif (($id3v1tag{125} === \"\\x00\") && ($id3v1tag{126} !== \"\\x00\")) {\n\t\t\t\t$ParsedID3v1['track']   = ord(substr($ParsedID3v1['comment'], 29,  1));\n\t\t\t\t$ParsedID3v1['comment'] =     substr($ParsedID3v1['comment'],  0, 28);\n\t\t\t}\n\t\t\t$ParsedID3v1['comment'] = $this->cutfield($ParsedID3v1['comment']);\n\n\t\t\t$ParsedID3v1['genre'] = $this->LookupGenreName($ParsedID3v1['genreid']);\n\t\t\tif (!empty($ParsedID3v1['genre'])) {\n\t\t\t\tunset($ParsedID3v1['genreid']);\n\t\t\t}\n\t\t\tif (isset($ParsedID3v1['genre']) && (empty($ParsedID3v1['genre']) || ($ParsedID3v1['genre'] == 'Unknown'))) {\n\t\t\t\tunset($ParsedID3v1['genre']);\n\t\t\t}\n\n\t\t\tforeach ($ParsedID3v1 as $key => $value) {\n\t\t\t\t$ParsedID3v1['comments'][$key][0] = $value;\n\t\t\t}\n\n\t\t\t// ID3v1 data is supposed to be padded with NULL characters, but some taggers pad with spaces\n\t\t\t$GoodFormatID3v1tag = $this->GenerateID3v1Tag(\n\t\t\t\t\t\t\t\t\t\t\t$ParsedID3v1['title'],\n\t\t\t\t\t\t\t\t\t\t\t$ParsedID3v1['artist'],\n\t\t\t\t\t\t\t\t\t\t\t$ParsedID3v1['album'],\n\t\t\t\t\t\t\t\t\t\t\t$ParsedID3v1['year'],\n\t\t\t\t\t\t\t\t\t\t\t(isset($ParsedID3v1['genre']) ? $this->LookupGenreID($ParsedID3v1['genre']) : false),\n\t\t\t\t\t\t\t\t\t\t\t$ParsedID3v1['comment'],\n\t\t\t\t\t\t\t\t\t\t\t(!empty($ParsedID3v1['track']) ? $ParsedID3v1['track'] : ''));\n\t\t\t$ParsedID3v1['padding_valid'] = true;\n\t\t\tif ($id3v1tag !== $GoodFormatID3v1tag) {\n\t\t\t\t$ParsedID3v1['padding_valid'] = false;\n\t\t\t\t$info['warning'][] = 'Some ID3v1 fields do not use NULL characters for padding';\n\t\t\t}\n\n\t\t\t$ParsedID3v1['tag_offset_end']   = $info['filesize'];\n\t\t\t$ParsedID3v1['tag_offset_start'] = $ParsedID3v1['tag_offset_end'] - 128;\n\n\t\t\t$info['id3v1'] = $ParsedID3v1;\n\t\t}\n\n\t\tif (substr($preid3v1, 0, 3) == 'TAG') {\n\t\t\t// The way iTunes handles tags is, well, brain-damaged.\n\t\t\t// It completely ignores v1 if ID3v2 is present.\n\t\t\t// This goes as far as adding a new v1 tag *even if there already is one*\n\n\t\t\t// A suspected double-ID3v1 tag has been detected, but it could be that\n\t\t\t// the \"TAG\" identifier is a legitimate part of an APE or Lyrics3 tag\n\t\t\tif (substr($preid3v1, 96, 8) == 'APETAGEX') {\n\t\t\t\t// an APE tag footer was found before the last ID3v1, assume false \"TAG\" synch\n\t\t\t} elseif (substr($preid3v1, 119, 6) == 'LYRICS') {\n\t\t\t\t// a Lyrics3 tag footer was found before the last ID3v1, assume false \"TAG\" synch\n\t\t\t} else {\n\t\t\t\t// APE and Lyrics3 footers not found - assume double ID3v1\n\t\t\t\t$info['warning'][] = 'Duplicate ID3v1 tag detected - this has been known to happen with iTunes';\n\t\t\t\t$info['avdataend'] -= 128;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic static function cutfield($str) {\n\t\treturn trim(substr($str, 0, strcspn($str, \"\\x00\")));\n\t}\n\n\tpublic static function ArrayOfGenres($allowSCMPXextended=false) {\n\t\tstatic $GenreLookup = array(\n\t\t\t0    => 'Blues',\n\t\t\t1    => 'Classic Rock',\n\t\t\t2    => 'Country',\n\t\t\t3    => 'Dance',\n\t\t\t4    => 'Disco',\n\t\t\t5    => 'Funk',\n\t\t\t6    => 'Grunge',\n\t\t\t7    => 'Hip-Hop',\n\t\t\t8    => 'Jazz',\n\t\t\t9    => 'Metal',\n\t\t\t10   => 'New Age',\n\t\t\t11   => 'Oldies',\n\t\t\t12   => 'Other',\n\t\t\t13   => 'Pop',\n\t\t\t14   => 'R&B',\n\t\t\t15   => 'Rap',\n\t\t\t16   => 'Reggae',\n\t\t\t17   => 'Rock',\n\t\t\t18   => 'Techno',\n\t\t\t19   => 'Industrial',\n\t\t\t20   => 'Alternative',\n\t\t\t21   => 'Ska',\n\t\t\t22   => 'Death Metal',\n\t\t\t23   => 'Pranks',\n\t\t\t24   => 'Soundtrack',\n\t\t\t25   => 'Euro-Techno',\n\t\t\t26   => 'Ambient',\n\t\t\t27   => 'Trip-Hop',\n\t\t\t28   => 'Vocal',\n\t\t\t29   => 'Jazz+Funk',\n\t\t\t30   => 'Fusion',\n\t\t\t31   => 'Trance',\n\t\t\t32   => 'Classical',\n\t\t\t33   => 'Instrumental',\n\t\t\t34   => 'Acid',\n\t\t\t35   => 'House',\n\t\t\t36   => 'Game',\n\t\t\t37   => 'Sound Clip',\n\t\t\t38   => 'Gospel',\n\t\t\t39   => 'Noise',\n\t\t\t40   => 'Alt. Rock',\n\t\t\t41   => 'Bass',\n\t\t\t42   => 'Soul',\n\t\t\t43   => 'Punk',\n\t\t\t44   => 'Space',\n\t\t\t45   => 'Meditative',\n\t\t\t46   => 'Instrumental Pop',\n\t\t\t47   => 'Instrumental Rock',\n\t\t\t48   => 'Ethnic',\n\t\t\t49   => 'Gothic',\n\t\t\t50   => 'Darkwave',\n\t\t\t51   => 'Techno-Industrial',\n\t\t\t52   => 'Electronic',\n\t\t\t53   => 'Pop-Folk',\n\t\t\t54   => 'Eurodance',\n\t\t\t55   => 'Dream',\n\t\t\t56   => 'Southern Rock',\n\t\t\t57   => 'Comedy',\n\t\t\t58   => 'Cult',\n\t\t\t59   => 'Gangsta Rap',\n\t\t\t60   => 'Top 40',\n\t\t\t61   => 'Christian Rap',\n\t\t\t62   => 'Pop/Funk',\n\t\t\t63   => 'Jungle',\n\t\t\t64   => 'Native American',\n\t\t\t65   => 'Cabaret',\n\t\t\t66   => 'New Wave',\n\t\t\t67   => 'Psychedelic',\n\t\t\t68   => 'Rave',\n\t\t\t69   => 'Showtunes',\n\t\t\t70   => 'Trailer',\n\t\t\t71   => 'Lo-Fi',\n\t\t\t72   => 'Tribal',\n\t\t\t73   => 'Acid Punk',\n\t\t\t74   => 'Acid Jazz',\n\t\t\t75   => 'Polka',\n\t\t\t76   => 'Retro',\n\t\t\t77   => 'Musical',\n\t\t\t78   => 'Rock & Roll',\n\t\t\t79   => 'Hard Rock',\n\t\t\t80   => 'Folk',\n\t\t\t81   => 'Folk/Rock',\n\t\t\t82   => 'National Folk',\n\t\t\t83   => 'Swing',\n\t\t\t84   => 'Fast-Fusion',\n\t\t\t85   => 'Bebob',\n\t\t\t86   => 'Latin',\n\t\t\t87   => 'Revival',\n\t\t\t88   => 'Celtic',\n\t\t\t89   => 'Bluegrass',\n\t\t\t90   => 'Avantgarde',\n\t\t\t91   => 'Gothic Rock',\n\t\t\t92   => 'Progressive Rock',\n\t\t\t93   => 'Psychedelic Rock',\n\t\t\t94   => 'Symphonic Rock',\n\t\t\t95   => 'Slow Rock',\n\t\t\t96   => 'Big Band',\n\t\t\t97   => 'Chorus',\n\t\t\t98   => 'Easy Listening',\n\t\t\t99   => 'Acoustic',\n\t\t\t100  => 'Humour',\n\t\t\t101  => 'Speech',\n\t\t\t102  => 'Chanson',\n\t\t\t103  => 'Opera',\n\t\t\t104  => 'Chamber Music',\n\t\t\t105  => 'Sonata',\n\t\t\t106  => 'Symphony',\n\t\t\t107  => 'Booty Bass',\n\t\t\t108  => 'Primus',\n\t\t\t109  => 'Porn Groove',\n\t\t\t110  => 'Satire',\n\t\t\t111  => 'Slow Jam',\n\t\t\t112  => 'Club',\n\t\t\t113  => 'Tango',\n\t\t\t114  => 'Samba',\n\t\t\t115  => 'Folklore',\n\t\t\t116  => 'Ballad',\n\t\t\t117  => 'Power Ballad',\n\t\t\t118  => 'Rhythmic Soul',\n\t\t\t119  => 'Freestyle',\n\t\t\t120  => 'Duet',\n\t\t\t121  => 'Punk Rock',\n\t\t\t122  => 'Drum Solo',\n\t\t\t123  => 'A Cappella',\n\t\t\t124  => 'Euro-House',\n\t\t\t125  => 'Dance Hall',\n\t\t\t126  => 'Goa',\n\t\t\t127  => 'Drum & Bass',\n\t\t\t128  => 'Club-House',\n\t\t\t129  => 'Hardcore',\n\t\t\t130  => 'Terror',\n\t\t\t131  => 'Indie',\n\t\t\t132  => 'BritPop',\n\t\t\t133  => 'Negerpunk',\n\t\t\t134  => 'Polsk Punk',\n\t\t\t135  => 'Beat',\n\t\t\t136  => 'Christian Gangsta Rap',\n\t\t\t137  => 'Heavy Metal',\n\t\t\t138  => 'Black Metal',\n\t\t\t139  => 'Crossover',\n\t\t\t140  => 'Contemporary Christian',\n\t\t\t141  => 'Christian Rock',\n\t\t\t142  => 'Merengue',\n\t\t\t143  => 'Salsa',\n\t\t\t144  => 'Thrash Metal',\n\t\t\t145  => 'Anime',\n\t\t\t146  => 'JPop',\n\t\t\t147  => 'Synthpop',\n\n\t\t\t255  => 'Unknown',\n\n\t\t\t'CR' => 'Cover',\n\t\t\t'RX' => 'Remix'\n\t\t);\n\n\t\tstatic $GenreLookupSCMPX = array();\n\t\tif ($allowSCMPXextended && empty($GenreLookupSCMPX)) {\n\t\t\t$GenreLookupSCMPX = $GenreLookup;\n\t\t\t// http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended\n\t\t\t// Extended ID3v1 genres invented by SCMPX\n\t\t\t// Note that 255 \"Japanese Anime\" conflicts with standard \"Unknown\"\n\t\t\t$GenreLookupSCMPX[240] = 'Sacred';\n\t\t\t$GenreLookupSCMPX[241] = 'Northern Europe';\n\t\t\t$GenreLookupSCMPX[242] = 'Irish & Scottish';\n\t\t\t$GenreLookupSCMPX[243] = 'Scotland';\n\t\t\t$GenreLookupSCMPX[244] = 'Ethnic Europe';\n\t\t\t$GenreLookupSCMPX[245] = 'Enka';\n\t\t\t$GenreLookupSCMPX[246] = 'Children\\'s Song';\n\t\t\t$GenreLookupSCMPX[247] = 'Japanese Sky';\n\t\t\t$GenreLookupSCMPX[248] = 'Japanese Heavy Rock';\n\t\t\t$GenreLookupSCMPX[249] = 'Japanese Doom Rock';\n\t\t\t$GenreLookupSCMPX[250] = 'Japanese J-POP';\n\t\t\t$GenreLookupSCMPX[251] = 'Japanese Seiyu';\n\t\t\t$GenreLookupSCMPX[252] = 'Japanese Ambient Techno';\n\t\t\t$GenreLookupSCMPX[253] = 'Japanese Moemoe';\n\t\t\t$GenreLookupSCMPX[254] = 'Japanese Tokusatsu';\n\t\t\t//$GenreLookupSCMPX[255] = 'Japanese Anime';\n\t\t}\n\n\t\treturn ($allowSCMPXextended ? $GenreLookupSCMPX : $GenreLookup);\n\t}\n\n\tpublic static function LookupGenreName($genreid, $allowSCMPXextended=true) {\n\t\tswitch ($genreid) {\n\t\t\tcase 'RX':\n\t\t\tcase 'CR':\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (!is_numeric($genreid)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$genreid = intval($genreid); // to handle 3 or '3' or '03'\n\t\t\t\tbreak;\n\t\t}\n\t\t$GenreLookup = self::ArrayOfGenres($allowSCMPXextended);\n\t\treturn (isset($GenreLookup[$genreid]) ? $GenreLookup[$genreid] : false);\n\t}\n\n\tpublic static function LookupGenreID($genre, $allowSCMPXextended=false) {\n\t\t$GenreLookup = self::ArrayOfGenres($allowSCMPXextended);\n\t\t$LowerCaseNoSpaceSearchTerm = strtolower(str_replace(' ', '', $genre));\n\t\tforeach ($GenreLookup as $key => $value) {\n\t\t\tif (strtolower(str_replace(' ', '', $value)) == $LowerCaseNoSpaceSearchTerm) {\n\t\t\t\treturn $key;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static function StandardiseID3v1GenreName($OriginalGenre) {\n\t\tif (($GenreID = self::LookupGenreID($OriginalGenre)) !== false) {\n\t\t\treturn self::LookupGenreName($GenreID);\n\t\t}\n\t\treturn $OriginalGenre;\n\t}\n\n\tpublic static function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track='') {\n\t\t$ID3v1Tag  = 'TAG';\n\t\t$ID3v1Tag .= str_pad(trim(substr($title,  0, 30)), 30, \"\\x00\", STR_PAD_RIGHT);\n\t\t$ID3v1Tag .= str_pad(trim(substr($artist, 0, 30)), 30, \"\\x00\", STR_PAD_RIGHT);\n\t\t$ID3v1Tag .= str_pad(trim(substr($album,  0, 30)), 30, \"\\x00\", STR_PAD_RIGHT);\n\t\t$ID3v1Tag .= str_pad(trim(substr($year,   0,  4)),  4, \"\\x00\", STR_PAD_LEFT);\n\t\tif (!empty($track) && ($track > 0) && ($track <= 255)) {\n\t\t\t$ID3v1Tag .= str_pad(trim(substr($comment, 0, 28)), 28, \"\\x00\", STR_PAD_RIGHT);\n\t\t\t$ID3v1Tag .= \"\\x00\";\n\t\t\tif (gettype($track) == 'string') {\n\t\t\t\t$track = (int) $track;\n\t\t\t}\n\t\t\t$ID3v1Tag .= chr($track);\n\t\t} else {\n\t\t\t$ID3v1Tag .= str_pad(trim(substr($comment, 0, 30)), 30, \"\\x00\", STR_PAD_RIGHT);\n\t\t}\n\t\tif (($genreid < 0) || ($genreid > 147)) {\n\t\t\t$genreid = 255; // 'unknown' genre\n\t\t}\n\t\tswitch (gettype($genreid)) {\n\t\t\tcase 'string':\n\t\t\tcase 'integer':\n\t\t\t\t$ID3v1Tag .= chr(intval($genreid));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$ID3v1Tag .= chr(255); // 'unknown' genre\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn $ID3v1Tag;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.tag.id3v2.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n///                                                            //\n// module.tag.id3v2.php                                        //\n// module for analyzing ID3v2 tags                             //\n// dependencies: module.tag.id3v1.php                          //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\ngetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true);\n\nclass getid3_id3v2 extends getid3_handler\n{\n\tpublic $StartingOffset = 0;\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t//    Overall tag structure:\n\t\t//        +-----------------------------+\n\t\t//        |      Header (10 bytes)      |\n\t\t//        +-----------------------------+\n\t\t//        |       Extended Header       |\n\t\t//        | (variable length, OPTIONAL) |\n\t\t//        +-----------------------------+\n\t\t//        |   Frames (variable length)  |\n\t\t//        +-----------------------------+\n\t\t//        |           Padding           |\n\t\t//        | (variable length, OPTIONAL) |\n\t\t//        +-----------------------------+\n\t\t//        | Footer (10 bytes, OPTIONAL) |\n\t\t//        +-----------------------------+\n\n\t\t//    Header\n\t\t//        ID3v2/file identifier      \"ID3\"\n\t\t//        ID3v2 version              $04 00\n\t\t//        ID3v2 flags                (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x)\n\t\t//        ID3v2 size             4 * %0xxxxxxx\n\n\n\t\t// shortcuts\n\t\t$info['id3v2']['header'] = true;\n\t\t$thisfile_id3v2                  = &$info['id3v2'];\n\t\t$thisfile_id3v2['flags']         =  array();\n\t\t$thisfile_id3v2_flags            = &$thisfile_id3v2['flags'];\n\n\n\t\t$this->fseek($this->StartingOffset);\n\t\t$header = $this->fread(10);\n\t\tif (substr($header, 0, 3) == 'ID3'  &&  strlen($header) == 10) {\n\n\t\t\t$thisfile_id3v2['majorversion'] = ord($header{3});\n\t\t\t$thisfile_id3v2['minorversion'] = ord($header{4});\n\n\t\t\t// shortcut\n\t\t\t$id3v2_majorversion = &$thisfile_id3v2['majorversion'];\n\n\t\t} else {\n\n\t\t\tunset($info['id3v2']);\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists)\n\n\t\t\t$info['error'][] = 'this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion'];\n\t\t\treturn false;\n\n\t\t}\n\n\t\t$id3_flags = ord($header{5});\n\t\tswitch ($id3v2_majorversion) {\n\t\t\tcase 2:\n\t\t\t\t// %ab000000 in v2.2\n\t\t\t\t$thisfile_id3v2_flags['unsynch']     = (bool) ($id3_flags & 0x80); // a - Unsynchronisation\n\t\t\t\t$thisfile_id3v2_flags['compression'] = (bool) ($id3_flags & 0x40); // b - Compression\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\t// %abc00000 in v2.3\n\t\t\t\t$thisfile_id3v2_flags['unsynch']     = (bool) ($id3_flags & 0x80); // a - Unsynchronisation\n\t\t\t\t$thisfile_id3v2_flags['exthead']     = (bool) ($id3_flags & 0x40); // b - Extended header\n\t\t\t\t$thisfile_id3v2_flags['experim']     = (bool) ($id3_flags & 0x20); // c - Experimental indicator\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\t// %abcd0000 in v2.4\n\t\t\t\t$thisfile_id3v2_flags['unsynch']     = (bool) ($id3_flags & 0x80); // a - Unsynchronisation\n\t\t\t\t$thisfile_id3v2_flags['exthead']     = (bool) ($id3_flags & 0x40); // b - Extended header\n\t\t\t\t$thisfile_id3v2_flags['experim']     = (bool) ($id3_flags & 0x20); // c - Experimental indicator\n\t\t\t\t$thisfile_id3v2_flags['isfooter']    = (bool) ($id3_flags & 0x10); // d - Footer present\n\t\t\t\tbreak;\n\t\t}\n\n\t\t$thisfile_id3v2['headerlength'] = getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length\n\n\t\t$thisfile_id3v2['tag_offset_start'] = $this->StartingOffset;\n\t\t$thisfile_id3v2['tag_offset_end']   = $thisfile_id3v2['tag_offset_start'] + $thisfile_id3v2['headerlength'];\n\n\n\n\t\t// create 'encoding' key - used by getid3::HandleAllTags()\n\t\t// in ID3v2 every field can have it's own encoding type\n\t\t// so force everything to UTF-8 so it can be handled consistantly\n\t\t$thisfile_id3v2['encoding'] = 'UTF-8';\n\n\n\t//    Frames\n\n\t//        All ID3v2 frames consists of one frame header followed by one or more\n\t//        fields containing the actual information. The header is always 10\n\t//        bytes and laid out as follows:\n\t//\n\t//        Frame ID      $xx xx xx xx  (four characters)\n\t//        Size      4 * %0xxxxxxx\n\t//        Flags         $xx xx\n\n\t\t$sizeofframes = $thisfile_id3v2['headerlength'] - 10; // not including 10-byte initial header\n\t\tif (!empty($thisfile_id3v2['exthead']['length'])) {\n\t\t\t$sizeofframes -= ($thisfile_id3v2['exthead']['length'] + 4);\n\t\t}\n\t\tif (!empty($thisfile_id3v2_flags['isfooter'])) {\n\t\t\t$sizeofframes -= 10; // footer takes last 10 bytes of ID3v2 header, after frame data, before audio\n\t\t}\n\t\tif ($sizeofframes > 0) {\n\n\t\t\t$framedata = $this->fread($sizeofframes); // read all frames from file into $framedata variable\n\n\t\t\t//    if entire frame data is unsynched, de-unsynch it now (ID3v2.3.x)\n\t\t\tif (!empty($thisfile_id3v2_flags['unsynch']) && ($id3v2_majorversion <= 3)) {\n\t\t\t\t$framedata = $this->DeUnsynchronise($framedata);\n\t\t\t}\n\t\t\t//        [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead\n\t\t\t//        of on tag level, making it easier to skip frames, increasing the streamability\n\t\t\t//        of the tag. The unsynchronisation flag in the header [S:3.1] indicates that\n\t\t\t//        there exists an unsynchronised frame, while the new unsynchronisation flag in\n\t\t\t//        the frame header [S:4.1.2] indicates unsynchronisation.\n\n\n\t\t\t//$framedataoffset = 10 + ($thisfile_id3v2['exthead']['length'] ? $thisfile_id3v2['exthead']['length'] + 4 : 0); // how many bytes into the stream - start from after the 10-byte header (and extended header length+4, if present)\n\t\t\t$framedataoffset = 10; // how many bytes into the stream - start from after the 10-byte header\n\n\n\t\t\t//    Extended Header\n\t\t\tif (!empty($thisfile_id3v2_flags['exthead'])) {\n\t\t\t\t$extended_header_offset = 0;\n\n\t\t\t\tif ($id3v2_majorversion == 3) {\n\n\t\t\t\t\t// v2.3 definition:\n\t\t\t\t\t//Extended header size  $xx xx xx xx   // 32-bit integer\n\t\t\t\t\t//Extended Flags        $xx xx\n\t\t\t\t\t//     %x0000000 %00000000 // v2.3\n\t\t\t\t\t//     x - CRC data present\n\t\t\t\t\t//Size of padding       $xx xx xx xx\n\n\t\t\t\t\t$thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), 0);\n\t\t\t\t\t$extended_header_offset += 4;\n\n\t\t\t\t\t$thisfile_id3v2['exthead']['flag_bytes'] = 2;\n\t\t\t\t\t$thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes']));\n\t\t\t\t\t$extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes'];\n\n\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x8000);\n\n\t\t\t\t\t$thisfile_id3v2['exthead']['padding_size'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4));\n\t\t\t\t\t$extended_header_offset += 4;\n\n\t\t\t\t\tif ($thisfile_id3v2['exthead']['flags']['crc']) {\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4));\n\t\t\t\t\t\t$extended_header_offset += 4;\n\t\t\t\t\t}\n\t\t\t\t\t$extended_header_offset += $thisfile_id3v2['exthead']['padding_size'];\n\n\t\t\t\t} elseif ($id3v2_majorversion == 4) {\n\n\t\t\t\t\t// v2.4 definition:\n\t\t\t\t\t//Extended header size   4 * %0xxxxxxx // 28-bit synchsafe integer\n\t\t\t\t\t//Number of flag bytes       $01\n\t\t\t\t\t//Extended Flags             $xx\n\t\t\t\t\t//     %0bcd0000 // v2.4\n\t\t\t\t\t//     b - Tag is an update\n\t\t\t\t\t//         Flag data length       $00\n\t\t\t\t\t//     c - CRC data present\n\t\t\t\t\t//         Flag data length       $05\n\t\t\t\t\t//         Total frame CRC    5 * %0xxxxxxx\n\t\t\t\t\t//     d - Tag restrictions\n\t\t\t\t\t//         Flag data length       $01\n\n\t\t\t\t\t$thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), true);\n\t\t\t\t\t$extended_header_offset += 4;\n\n\t\t\t\t\t$thisfile_id3v2['exthead']['flag_bytes'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should always be 1\n\t\t\t\t\t$extended_header_offset += 1;\n\n\t\t\t\t\t$thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes']));\n\t\t\t\t\t$extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes'];\n\n\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['update']       = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x40);\n\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['crc']          = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x20);\n\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x10);\n\n\t\t\t\t\tif ($thisfile_id3v2['exthead']['flags']['update']) {\n\t\t\t\t\t\t$ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 0\n\t\t\t\t\t\t$extended_header_offset += 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($thisfile_id3v2['exthead']['flags']['crc']) {\n\t\t\t\t\t\t$ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 5\n\t\t\t\t\t\t$extended_header_offset += 1;\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $ext_header_chunk_length), true, false);\n\t\t\t\t\t\t$extended_header_offset += $ext_header_chunk_length;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($thisfile_id3v2['exthead']['flags']['restrictions']) {\n\t\t\t\t\t\t$ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 1\n\t\t\t\t\t\t$extended_header_offset += 1;\n\n\t\t\t\t\t\t// %ppqrrstt\n\t\t\t\t\t\t$restrictions_raw = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1));\n\t\t\t\t\t\t$extended_header_offset += 1;\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']  = ($restrictions_raw & 0xC0) >> 6; // p - Tag size restrictions\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions']['textenc']  = ($restrictions_raw & 0x20) >> 5; // q - Text encoding restrictions\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions']['textsize'] = ($restrictions_raw & 0x18) >> 3; // r - Text fields size restrictions\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']   = ($restrictions_raw & 0x04) >> 2; // s - Image encoding restrictions\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']  = ($restrictions_raw & 0x03) >> 0; // t - Image size restrictions\n\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions_text']['tagsize']  = $this->LookupExtendedHeaderRestrictionsTagSizeLimits($thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']);\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions_text']['textenc']  = $this->LookupExtendedHeaderRestrictionsTextEncodings($thisfile_id3v2['exthead']['flags']['restrictions']['textenc']);\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions_text']['textsize'] = $this->LookupExtendedHeaderRestrictionsTextFieldSize($thisfile_id3v2['exthead']['flags']['restrictions']['textsize']);\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions_text']['imgenc']   = $this->LookupExtendedHeaderRestrictionsImageEncoding($thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']);\n\t\t\t\t\t\t$thisfile_id3v2['exthead']['flags']['restrictions_text']['imgsize']  = $this->LookupExtendedHeaderRestrictionsImageSizeSize($thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']);\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($thisfile_id3v2['exthead']['length'] != $extended_header_offset) {\n\t\t\t\t\t\t$info['warning'][] = 'ID3v2.4 extended header length mismatch (expecting '.intval($thisfile_id3v2['exthead']['length']).', found '.intval($extended_header_offset).')';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$framedataoffset += $extended_header_offset;\n\t\t\t\t$framedata = substr($framedata, $extended_header_offset);\n\t\t\t} // end extended header\n\n\n\t\t\twhile (isset($framedata) && (strlen($framedata) > 0)) { // cycle through until no more frame data is left to parse\n\t\t\t\tif (strlen($framedata) <= $this->ID3v2HeaderLength($id3v2_majorversion)) {\n\t\t\t\t\t// insufficient room left in ID3v2 header for actual data - must be padding\n\t\t\t\t\t$thisfile_id3v2['padding']['start']  = $framedataoffset;\n\t\t\t\t\t$thisfile_id3v2['padding']['length'] = strlen($framedata);\n\t\t\t\t\t$thisfile_id3v2['padding']['valid']  = true;\n\t\t\t\t\tfor ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) {\n\t\t\t\t\t\tif ($framedata{$i} != \"\\x00\") {\n\t\t\t\t\t\t\t$thisfile_id3v2['padding']['valid'] = false;\n\t\t\t\t\t\t\t$thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i;\n\t\t\t\t\t\t\t$info['warning'][] = 'Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak; // skip rest of ID3v2 header\n\t\t\t\t}\n\t\t\t\tif ($id3v2_majorversion == 2) {\n\t\t\t\t\t// Frame ID  $xx xx xx (three characters)\n\t\t\t\t\t// Size      $xx xx xx (24-bit integer)\n\t\t\t\t\t// Flags     $xx xx\n\n\t\t\t\t\t$frame_header = substr($framedata, 0, 6); // take next 6 bytes for header\n\t\t\t\t\t$framedata    = substr($framedata, 6);    // and leave the rest in $framedata\n\t\t\t\t\t$frame_name   = substr($frame_header, 0, 3);\n\t\t\t\t\t$frame_size   = getid3_lib::BigEndian2Int(substr($frame_header, 3, 3), 0);\n\t\t\t\t\t$frame_flags  = 0; // not used for anything in ID3v2.2, just set to avoid E_NOTICEs\n\n\t\t\t\t} elseif ($id3v2_majorversion > 2) {\n\n\t\t\t\t\t// Frame ID  $xx xx xx xx (four characters)\n\t\t\t\t\t// Size      $xx xx xx xx (32-bit integer in v2.3, 28-bit synchsafe in v2.4+)\n\t\t\t\t\t// Flags     $xx xx\n\n\t\t\t\t\t$frame_header = substr($framedata, 0, 10); // take next 10 bytes for header\n\t\t\t\t\t$framedata    = substr($framedata, 10);    // and leave the rest in $framedata\n\n\t\t\t\t\t$frame_name = substr($frame_header, 0, 4);\n\t\t\t\t\tif ($id3v2_majorversion == 3) {\n\t\t\t\t\t\t$frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer\n\t\t\t\t\t} else { // ID3v2.4+\n\t\t\t\t\t\t$frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 1); // 32-bit synchsafe integer (28-bit value)\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($frame_size < (strlen($framedata) + 4)) {\n\t\t\t\t\t\t$nextFrameID = substr($framedata, $frame_size, 4);\n\t\t\t\t\t\tif ($this->IsValidID3v2FrameName($nextFrameID, $id3v2_majorversion)) {\n\t\t\t\t\t\t\t// next frame is OK\n\t\t\t\t\t\t} elseif (($frame_name == \"\\x00\".'MP3') || ($frame_name == \"\\x00\\x00\".'MP') || ($frame_name == ' MP3') || ($frame_name == 'MP3e')) {\n\t\t\t\t\t\t\t// MP3ext known broken frames - \"ok\" for the purposes of this test\n\t\t\t\t\t\t} elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) {\n\t\t\t\t\t\t\t$info['warning'][] = 'ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3';\n\t\t\t\t\t\t\t$id3v2_majorversion = 3;\n\t\t\t\t\t\t\t$frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\n\t\t\t\t\t$frame_flags = getid3_lib::BigEndian2Int(substr($frame_header, 8, 2));\n\t\t\t\t}\n\n\t\t\t\tif ((($id3v2_majorversion == 2) && ($frame_name == \"\\x00\\x00\\x00\")) || ($frame_name == \"\\x00\\x00\\x00\\x00\")) {\n\t\t\t\t\t// padding encountered\n\n\t\t\t\t\t$thisfile_id3v2['padding']['start']  = $framedataoffset;\n\t\t\t\t\t$thisfile_id3v2['padding']['length'] = strlen($frame_header) + strlen($framedata);\n\t\t\t\t\t$thisfile_id3v2['padding']['valid']  = true;\n\n\t\t\t\t\t$len = strlen($framedata);\n\t\t\t\t\tfor ($i = 0; $i < $len; $i++) {\n\t\t\t\t\t\tif ($framedata{$i} != \"\\x00\") {\n\t\t\t\t\t\t\t$thisfile_id3v2['padding']['valid'] = false;\n\t\t\t\t\t\t\t$thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i;\n\t\t\t\t\t\t\t$info['warning'][] = 'Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak; // skip rest of ID3v2 header\n\t\t\t\t}\n\n\t\t\t\tif ($frame_name == 'COM ') {\n\t\t\t\t\t$info['warning'][] = 'error parsing \"'.$frame_name.'\" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName(\"'.str_replace(\"\\x00\", ' ', $frame_name).'\", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions \"X v2.0.3\", \"v3.0.1\" are known-guilty, probably others too)]';\n\t\t\t\t\t$frame_name = 'COMM';\n\t\t\t\t}\n\t\t\t\tif (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) {\n\n\t\t\t\t\tunset($parsedFrame);\n\t\t\t\t\t$parsedFrame['frame_name']      = $frame_name;\n\t\t\t\t\t$parsedFrame['frame_flags_raw'] = $frame_flags;\n\t\t\t\t\t$parsedFrame['data']            = substr($framedata, 0, $frame_size);\n\t\t\t\t\t$parsedFrame['datalength']      = getid3_lib::CastAsInt($frame_size);\n\t\t\t\t\t$parsedFrame['dataoffset']      = $framedataoffset;\n\n\t\t\t\t\t$this->ParseID3v2Frame($parsedFrame);\n\t\t\t\t\t$thisfile_id3v2[$frame_name][] = $parsedFrame;\n\n\t\t\t\t\t$framedata = substr($framedata, $frame_size);\n\n\t\t\t\t} else { // invalid frame length or FrameID\n\n\t\t\t\t\tif ($frame_size <= strlen($framedata)) {\n\n\t\t\t\t\t\tif ($this->IsValidID3v2FrameName(substr($framedata, $frame_size, 4), $id3v2_majorversion)) {\n\n\t\t\t\t\t\t\t// next frame is valid, just skip the current frame\n\t\t\t\t\t\t\t$framedata = substr($framedata, $frame_size);\n\t\t\t\t\t\t\t$info['warning'][] = 'Next ID3v2 frame is valid, skipping current frame.';\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// next frame is invalid too, abort processing\n\t\t\t\t\t\t\t//unset($framedata);\n\t\t\t\t\t\t\t$framedata = null;\n\t\t\t\t\t\t\t$info['error'][] = 'Next ID3v2 frame is also invalid, aborting processing.';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} elseif ($frame_size == strlen($framedata)) {\n\n\t\t\t\t\t\t// this is the last frame, just skip\n\t\t\t\t\t\t$info['warning'][] = 'This was the last ID3v2 frame.';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// next frame is invalid too, abort processing\n\t\t\t\t\t\t//unset($framedata);\n\t\t\t\t\t\t$framedata = null;\n\t\t\t\t\t\t$info['warning'][] = 'Invalid ID3v2 frame size, aborting.';\n\n\t\t\t\t\t}\n\t\t\t\t\tif (!$this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion)) {\n\n\t\t\t\t\t\tswitch ($frame_name) {\n\t\t\t\t\t\t\tcase \"\\x00\\x00\".'MP':\n\t\t\t\t\t\t\tcase \"\\x00\".'MP3':\n\t\t\t\t\t\t\tcase ' MP3':\n\t\t\t\t\t\t\tcase 'MP3e':\n\t\t\t\t\t\t\tcase \"\\x00\".'MP':\n\t\t\t\t\t\t\tcase ' MP':\n\t\t\t\t\t\t\tcase 'MP3':\n\t\t\t\t\t\t\t\t$info['warning'][] = 'error parsing \"'.$frame_name.'\" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName(\"'.str_replace(\"\\x00\", ' ', $frame_name).'\", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by \"MP3ext (www.mutschler.de/mp3ext/)\"]';\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t$info['warning'][] = 'error parsing \"'.$frame_name.'\" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName(\"'.str_replace(\"\\x00\", ' ', $frame_name).'\", '.$id3v2_majorversion.'))).';\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} elseif (!isset($framedata) || ($frame_size > strlen($framedata))) {\n\n\t\t\t\t\t\t$info['error'][] = 'error parsing \"'.$frame_name.'\" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.(isset($framedata) ? strlen($framedata) : 'null').')).';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t$info['error'][] = 'error parsing \"'.$frame_name.'\" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).';\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t$framedataoffset += ($frame_size + $this->ID3v2HeaderLength($id3v2_majorversion));\n\n\t\t\t}\n\n\t\t}\n\n\n\t//    Footer\n\n\t//    The footer is a copy of the header, but with a different identifier.\n\t//        ID3v2 identifier           \"3DI\"\n\t//        ID3v2 version              $04 00\n\t//        ID3v2 flags                %abcd0000\n\t//        ID3v2 size             4 * %0xxxxxxx\n\n\t\tif (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) {\n\t\t\t$footer = $this->fread(10);\n\t\t\tif (substr($footer, 0, 3) == '3DI') {\n\t\t\t\t$thisfile_id3v2['footer'] = true;\n\t\t\t\t$thisfile_id3v2['majorversion_footer'] = ord($footer{3});\n\t\t\t\t$thisfile_id3v2['minorversion_footer'] = ord($footer{4});\n\t\t\t}\n\t\t\tif ($thisfile_id3v2['majorversion_footer'] <= 4) {\n\t\t\t\t$id3_flags = ord(substr($footer{5}));\n\t\t\t\t$thisfile_id3v2_flags['unsynch_footer']  = (bool) ($id3_flags & 0x80);\n\t\t\t\t$thisfile_id3v2_flags['extfoot_footer']  = (bool) ($id3_flags & 0x40);\n\t\t\t\t$thisfile_id3v2_flags['experim_footer']  = (bool) ($id3_flags & 0x20);\n\t\t\t\t$thisfile_id3v2_flags['isfooter_footer'] = (bool) ($id3_flags & 0x10);\n\n\t\t\t\t$thisfile_id3v2['footerlength'] = getid3_lib::BigEndian2Int(substr($footer, 6, 4), 1);\n\t\t\t}\n\t\t} // end footer\n\n\t\tif (isset($thisfile_id3v2['comments']['genre'])) {\n\t\t\tforeach ($thisfile_id3v2['comments']['genre'] as $key => $value) {\n\t\t\t\tunset($thisfile_id3v2['comments']['genre'][$key]);\n\t\t\t\t$thisfile_id3v2['comments'] = getid3_lib::array_merge_noclobber($thisfile_id3v2['comments'], array('genre'=>$this->ParseID3v2GenreString($value)));\n\t\t\t}\n\t\t}\n\n\t\tif (isset($thisfile_id3v2['comments']['track'])) {\n\t\t\tforeach ($thisfile_id3v2['comments']['track'] as $key => $value) {\n\t\t\t\tif (strstr($value, '/')) {\n\t\t\t\t\tlist($thisfile_id3v2['comments']['tracknum'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track'][$key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!isset($thisfile_id3v2['comments']['year']) && !empty($thisfile_id3v2['comments']['recording_time'][0]) && preg_match('#^([0-9]{4})#', trim($thisfile_id3v2['comments']['recording_time'][0]), $matches)) {\n\t\t\t$thisfile_id3v2['comments']['year'] = array($matches[1]);\n\t\t}\n\n\n\t\tif (!empty($thisfile_id3v2['TXXX'])) {\n\t\t\t// MediaMonkey does this, maybe others: write a blank RGAD frame, but put replay-gain adjustment values in TXXX frames\n\t\t\tforeach ($thisfile_id3v2['TXXX'] as $txxx_array) {\n\t\t\t\tswitch ($txxx_array['description']) {\n\t\t\t\t\tcase 'replaygain_track_gain':\n\t\t\t\t\t\tif (empty($info['replay_gain']['track']['adjustment']) && !empty($txxx_array['data'])) {\n\t\t\t\t\t\t\t$info['replay_gain']['track']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data'])));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'replaygain_track_peak':\n\t\t\t\t\t\tif (empty($info['replay_gain']['track']['peak']) && !empty($txxx_array['data'])) {\n\t\t\t\t\t\t\t$info['replay_gain']['track']['peak'] = floatval($txxx_array['data']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'replaygain_album_gain':\n\t\t\t\t\t\tif (empty($info['replay_gain']['album']['adjustment']) && !empty($txxx_array['data'])) {\n\t\t\t\t\t\t\t$info['replay_gain']['album']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data'])));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\n\t\t// Set avdataoffset\n\t\t$info['avdataoffset'] = $thisfile_id3v2['headerlength'];\n\t\tif (isset($thisfile_id3v2['footer'])) {\n\t\t\t$info['avdataoffset'] += 10;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\tpublic function ParseID3v2GenreString($genrestring) {\n\t\t// Parse genres into arrays of genreName and genreID\n\t\t// ID3v2.2.x, ID3v2.3.x: '(21)' or '(4)Eurodisco' or '(51)(39)' or '(55)((I think...)'\n\t\t// ID3v2.4.x: '21' $00 'Eurodisco' $00\n\t\t$clean_genres = array();\n\t\tif (strpos($genrestring, \"\\x00\") === false) {\n\t\t\t$genrestring = preg_replace('#\\(([0-9]{1,3})\\)#', '$1'.\"\\x00\", $genrestring);\n\t\t}\n\t\t$genre_elements = explode(\"\\x00\", $genrestring);\n\t\tforeach ($genre_elements as $element) {\n\t\t\t$element = trim($element);\n\t\t\tif ($element) {\n\t\t\t\tif (preg_match('#^[0-9]{1,3}#', $element)) {\n\t\t\t\t\t$clean_genres[] = getid3_id3v1::LookupGenreName($element);\n\t\t\t\t} else {\n\t\t\t\t\t$clean_genres[] = str_replace('((', '(', $element);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $clean_genres;\n\t}\n\n\n\tpublic function ParseID3v2Frame(&$parsedFrame) {\n\n\t\t// shortcuts\n\t\t$info = &$this->getid3->info;\n\t\t$id3v2_majorversion = $info['id3v2']['majorversion'];\n\n\t\t$parsedFrame['framenamelong']  = $this->FrameNameLongLookup($parsedFrame['frame_name']);\n\t\tif (empty($parsedFrame['framenamelong'])) {\n\t\t\tunset($parsedFrame['framenamelong']);\n\t\t}\n\t\t$parsedFrame['framenameshort'] = $this->FrameNameShortLookup($parsedFrame['frame_name']);\n\t\tif (empty($parsedFrame['framenameshort'])) {\n\t\t\tunset($parsedFrame['framenameshort']);\n\t\t}\n\n\t\tif ($id3v2_majorversion >= 3) { // frame flags are not part of the ID3v2.2 standard\n\t\t\tif ($id3v2_majorversion == 3) {\n\t\t\t\t//    Frame Header Flags\n\t\t\t\t//    %abc00000 %ijk00000\n\t\t\t\t$parsedFrame['flags']['TagAlterPreservation']  = (bool) ($parsedFrame['frame_flags_raw'] & 0x8000); // a - Tag alter preservation\n\t\t\t\t$parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // b - File alter preservation\n\t\t\t\t$parsedFrame['flags']['ReadOnly']              = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // c - Read only\n\t\t\t\t$parsedFrame['flags']['compression']           = (bool) ($parsedFrame['frame_flags_raw'] & 0x0080); // i - Compression\n\t\t\t\t$parsedFrame['flags']['Encryption']            = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // j - Encryption\n\t\t\t\t$parsedFrame['flags']['GroupingIdentity']      = (bool) ($parsedFrame['frame_flags_raw'] & 0x0020); // k - Grouping identity\n\n\t\t\t} elseif ($id3v2_majorversion == 4) {\n\t\t\t\t//    Frame Header Flags\n\t\t\t\t//    %0abc0000 %0h00kmnp\n\t\t\t\t$parsedFrame['flags']['TagAlterPreservation']  = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // a - Tag alter preservation\n\t\t\t\t$parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // b - File alter preservation\n\t\t\t\t$parsedFrame['flags']['ReadOnly']              = (bool) ($parsedFrame['frame_flags_raw'] & 0x1000); // c - Read only\n\t\t\t\t$parsedFrame['flags']['GroupingIdentity']      = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // h - Grouping identity\n\t\t\t\t$parsedFrame['flags']['compression']           = (bool) ($parsedFrame['frame_flags_raw'] & 0x0008); // k - Compression\n\t\t\t\t$parsedFrame['flags']['Encryption']            = (bool) ($parsedFrame['frame_flags_raw'] & 0x0004); // m - Encryption\n\t\t\t\t$parsedFrame['flags']['Unsynchronisation']     = (bool) ($parsedFrame['frame_flags_raw'] & 0x0002); // n - Unsynchronisation\n\t\t\t\t$parsedFrame['flags']['DataLengthIndicator']   = (bool) ($parsedFrame['frame_flags_raw'] & 0x0001); // p - Data length indicator\n\n\t\t\t\t// Frame-level de-unsynchronisation - ID3v2.4\n\t\t\t\tif ($parsedFrame['flags']['Unsynchronisation']) {\n\t\t\t\t\t$parsedFrame['data'] = $this->DeUnsynchronise($parsedFrame['data']);\n\t\t\t\t}\n\n\t\t\t\tif ($parsedFrame['flags']['DataLengthIndicator']) {\n\t\t\t\t\t$parsedFrame['data_length_indicator'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4), 1);\n\t\t\t\t\t$parsedFrame['data']                  =                           substr($parsedFrame['data'], 4);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//    Frame-level de-compression\n\t\t\tif ($parsedFrame['flags']['compression']) {\n\t\t\t\t$parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4));\n\t\t\t\tif (!function_exists('gzuncompress')) {\n\t\t\t\t\t$info['warning'][] = 'gzuncompress() support required to decompress ID3v2 frame \"'.$parsedFrame['frame_name'].'\"';\n\t\t\t\t} else {\n\t\t\t\t\tif ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) {\n\t\t\t\t\t//if ($decompresseddata = @gzuncompress($parsedFrame['data'])) {\n\t\t\t\t\t\t$parsedFrame['data'] = $decompresseddata;\n\t\t\t\t\t\tunset($decompresseddata);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'gzuncompress() failed on compressed contents of ID3v2 frame \"'.$parsedFrame['frame_name'].'\"';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!empty($parsedFrame['flags']['DataLengthIndicator'])) {\n\t\t\tif ($parsedFrame['data_length_indicator'] != strlen($parsedFrame['data'])) {\n\t\t\t\t$info['warning'][] = 'ID3v2 frame \"'.$parsedFrame['frame_name'].'\" should be '.$parsedFrame['data_length_indicator'].' bytes long according to DataLengthIndicator, but found '.strlen($parsedFrame['data']).' bytes of data';\n\t\t\t}\n\t\t}\n\n\t\tif (isset($parsedFrame['datalength']) && ($parsedFrame['datalength'] == 0)) {\n\n\t\t\t$warning = 'Frame \"'.$parsedFrame['frame_name'].'\" at offset '.$parsedFrame['dataoffset'].' has no data portion';\n\t\t\tswitch ($parsedFrame['frame_name']) {\n\t\t\t\tcase 'WCOM':\n\t\t\t\t\t$warning .= ' (this is known to happen with files tagged by RioPort)';\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$info['warning'][] = $warning;\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1   UFID Unique file identifier\n\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'UFI'))) {  // 4.1   UFI  Unique file identifier\n\t\t\t//   There may be more than one 'UFID' frame in a tag,\n\t\t\t//   but only one with the same 'Owner identifier'.\n\t\t\t// <Header for 'Unique file identifier', ID: 'UFID'>\n\t\t\t// Owner identifier        <text string> $00\n\t\t\t// Identifier              <up to 64 bytes binary data>\n\t\t\t$exploded = explode(\"\\x00\", $parsedFrame['data'], 2);\n\t\t\t$parsedFrame['ownerid'] = (isset($exploded[0]) ? $exploded[0] : '');\n\t\t\t$parsedFrame['data']    = (isset($exploded[1]) ? $exploded[1] : '');\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'TXXX')) || // 4.2.2 TXXX User defined text information frame\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'TXX'))) {    // 4.2.2 TXX  User defined text information frame\n\t\t\t//   There may be more than one 'TXXX' frame in each tag,\n\t\t\t//   but only one with the same description.\n\t\t\t// <Header for 'User defined text information frame', ID: 'TXXX'>\n\t\t\t// Text encoding     $xx\n\t\t\t// Description       <text string according to encoding> $00 (00)\n\t\t\t// Value             <text string according to encoding>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t\t$frame_textencoding_terminator = \"\\x00\";\n\t\t\t}\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t}\n\t\t\t$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_description) === 0) {\n\t\t\t\t$frame_description = '';\n\t\t\t}\n\t\t\t$parsedFrame['encodingid']  = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']    = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t$parsedFrame['description'] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $frame_description));\n\t\t\t$parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));\n\t\t\tif (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {\n\t\t\t\t$commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0));\n\t\t\t\tif (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) {\n\t\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']));\n\t\t\t\t} else {\n\t\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][]            = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']));\n\t\t\t\t}\n\t\t\t}\n\t\t\t//unset($parsedFrame['data']); do not unset, may be needed elsewhere, e.g. for replaygain\n\n\n\t\t} elseif ($parsedFrame['frame_name']{0} == 'T') { // 4.2. T??[?] Text information frame\n\t\t\t//   There may only be one text information frame of its kind in an tag.\n\t\t\t// <Header for 'Text information frame', ID: 'T000' - 'TZZZ',\n\t\t\t// excluding 'TXXX' described in 4.2.6.>\n\t\t\t// Text encoding                $xx\n\t\t\t// Information                  <text string(s) according to encoding>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t}\n\n\t\t\t$parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);\n\n\t\t\t$parsedFrame['encodingid'] = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']   = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\tif (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {\n\t\t\t\t// ID3v2.3 specs say that TPE1 (and others) can contain multiple artist values separated with /\n\t\t\t\t// This of course breaks when an artist name contains slash character, e.g. \"AC/DC\"\n\t\t\t\t// MP3tag (maybe others) implement alternative system where multiple artists are null-separated, which makes more sense\n\t\t\t\t// getID3 will split null-separated artists into multiple artists and leave slash-separated ones to the user\n\t\t\t\tswitch ($parsedFrame['encoding']) {\n\t\t\t\t\tcase 'UTF-16':\n\t\t\t\t\tcase 'UTF-16BE':\n\t\t\t\t\tcase 'UTF-16LE':\n\t\t\t\t\t\t$wordsize = 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ISO-8859-1':\n\t\t\t\t\tcase 'UTF-8':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$wordsize = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t$Txxx_elements = array();\n\t\t\t\t$Txxx_elements_start_offset = 0;\n\t\t\t\tfor ($i = 0; $i < strlen($parsedFrame['data']); $i += $wordsize) {\n\t\t\t\t\tif (substr($parsedFrame['data'], $i, $wordsize) == str_repeat(\"\\x00\", $wordsize)) {\n\t\t\t\t\t\t$Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset);\n\t\t\t\t\t\t$Txxx_elements_start_offset = $i + $wordsize;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset);\n\t\t\t\tforeach ($Txxx_elements as $Txxx_element) {\n\t\t\t\t\t$string = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $Txxx_element);\n\t\t\t\t\tif (!empty($string)) {\n\t\t\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $string;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset($string, $wordsize, $i, $Txxx_elements, $Txxx_element, $Txxx_elements_start_offset);\n\t\t\t}\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'WXXX')) || // 4.3.2 WXXX User defined URL link frame\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'WXX'))) {    // 4.3.2 WXX  User defined URL link frame\n\t\t\t//   There may be more than one 'WXXX' frame in each tag,\n\t\t\t//   but only one with the same description\n\t\t\t// <Header for 'User defined URL link frame', ID: 'WXXX'>\n\t\t\t// Text encoding     $xx\n\t\t\t// Description       <text string according to encoding> $00 (00)\n\t\t\t// URL               <text string>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t\t$frame_textencoding_terminator = \"\\x00\";\n\t\t\t}\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t}\n\t\t\t$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\n\t\t\tif (ord($frame_description) === 0) {\n\t\t\t\t$frame_description = '';\n\t\t\t}\n\t\t\t$parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator);\n\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t}\n\t\t\tif ($frame_terminatorpos) {\n\t\t\t\t// there are null bytes after the data - this is not according to spec\n\t\t\t\t// only use data up to first null byte\n\t\t\t\t$frame_urldata = (string) substr($parsedFrame['data'], 0, $frame_terminatorpos);\n\t\t\t} else {\n\t\t\t\t// no null bytes following data, just use all data\n\t\t\t\t$frame_urldata = (string) $parsedFrame['data'];\n\t\t\t}\n\n\t\t\t$parsedFrame['encodingid']  = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']    = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t$parsedFrame['url']         = $frame_urldata;\n\t\t\t$parsedFrame['description'] = $frame_description;\n\t\t\tif (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {\n\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['url']);\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ($parsedFrame['frame_name']{0} == 'W') { // 4.3. W??? URL link frames\n\t\t\t//   There may only be one URL link frame of its kind in a tag,\n\t\t\t//   except when stated otherwise in the frame description\n\t\t\t// <Header for 'URL link frame', ID: 'W000' - 'WZZZ', excluding 'WXXX'\n\t\t\t// described in 4.3.2.>\n\t\t\t// URL              <text string>\n\n\t\t\t$parsedFrame['url'] = trim($parsedFrame['data']);\n\t\t\tif (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {\n\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['url'];\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'IPLS')) || // 4.4  IPLS Involved people list (ID3v2.3 only)\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'IPL'))) {     // 4.4  IPL  Involved people list (ID3v2.2 only)\n\t\t\t// http://id3.org/id3v2.3.0#sec4.4\n\t\t\t//   There may only be one 'IPL' frame in each tag\n\t\t\t// <Header for 'User defined URL link frame', ID: 'IPL'>\n\t\t\t// Text encoding     $xx\n\t\t\t// People list strings    <textstrings>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t}\n\t\t\t$parsedFrame['encodingid'] = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']   = $this->TextEncodingNameLookup($parsedFrame['encodingid']);\n\t\t\t$parsedFrame['data_raw']   = (string) substr($parsedFrame['data'], $frame_offset);\n\n\t\t\t// http://www.getid3.org/phpBB3/viewtopic.php?t=1369\n\t\t\t// \"this tag typically contains null terminated strings, which are associated in pairs\"\n\t\t\t// \"there are users that use the tag incorrectly\"\n\t\t\t$IPLS_parts = array();\n\t\t\tif (strpos($parsedFrame['data_raw'], \"\\x00\") !== false) {\n\t\t\t\t$IPLS_parts_unsorted = array();\n\t\t\t\tif (((strlen($parsedFrame['data_raw']) % 2) == 0) && ((substr($parsedFrame['data_raw'], 0, 2) == \"\\xFF\\xFE\") || (substr($parsedFrame['data_raw'], 0, 2) == \"\\xFE\\xFF\"))) {\n\t\t\t\t\t// UTF-16, be careful looking for null bytes since most 2-byte characters may contain one; you need to find twin null bytes, and on even padding\n\t\t\t\t\t$thisILPS  = '';\n\t\t\t\t\tfor ($i = 0; $i < strlen($parsedFrame['data_raw']); $i += 2) {\n\t\t\t\t\t\t$twobytes = substr($parsedFrame['data_raw'], $i, 2);\n\t\t\t\t\t\tif ($twobytes === \"\\x00\\x00\") {\n\t\t\t\t\t\t\t$IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS);\n\t\t\t\t\t\t\t$thisILPS  = '';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$thisILPS .= $twobytes;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (strlen($thisILPS) > 2) { // 2-byte BOM\n\t\t\t\t\t\t$IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// ISO-8859-1 or UTF-8 or other single-byte-null character set\n\t\t\t\t\t$IPLS_parts_unsorted = explode(\"\\x00\", $parsedFrame['data_raw']);\n\t\t\t\t}\n\t\t\t\tif (count($IPLS_parts_unsorted) == 1) {\n\t\t\t\t\t// just a list of names, e.g. \"Dino Baptiste, Jimmy Copley, John Gordon, Bernie Marsden, Sharon Watson\"\n\t\t\t\t\tforeach ($IPLS_parts_unsorted as $key => $value) {\n\t\t\t\t\t\t$IPLS_parts_sorted = preg_split('#[;,\\\\r\\\\n\\\\t]#', $value);\n\t\t\t\t\t\t$position = '';\n\t\t\t\t\t\tforeach ($IPLS_parts_sorted as $person) {\n\t\t\t\t\t\t\t$IPLS_parts[] = array('position'=>$position, 'person'=>$person);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} elseif ((count($IPLS_parts_unsorted) % 2) == 0) {\n\t\t\t\t\t$position = '';\n\t\t\t\t\t$person   = '';\n\t\t\t\t\tforeach ($IPLS_parts_unsorted as $key => $value) {\n\t\t\t\t\t\tif (($key % 2) == 0) {\n\t\t\t\t\t\t\t$position = $value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$person   = $value;\n\t\t\t\t\t\t\t$IPLS_parts[] = array('position'=>$position, 'person'=>$person);\n\t\t\t\t\t\t\t$position = '';\n\t\t\t\t\t\t\t$person   = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tforeach ($IPLS_parts_unsorted as $key => $value) {\n\t\t\t\t\t\t$IPLS_parts[] = array($value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t$IPLS_parts = preg_split('#[;,\\\\r\\\\n\\\\t]#', $parsedFrame['data_raw']);\n\t\t\t}\n\t\t\t$parsedFrame['data'] = $IPLS_parts;\n\n\t\t\tif (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {\n\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data'];\n\t\t\t}\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MCDI')) || // 4.4   MCDI Music CD identifier\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MCI'))) {     // 4.5   MCI  Music CD identifier\n\t\t\t//   There may only be one 'MCDI' frame in each tag\n\t\t\t// <Header for 'Music CD identifier', ID: 'MCDI'>\n\t\t\t// CD TOC                <binary data>\n\n\t\t\tif (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {\n\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data'];\n\t\t\t}\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) || // 4.5   ETCO Event timing codes\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) {     // 4.6   ETC  Event timing codes\n\t\t\t//   There may only be one 'ETCO' frame in each tag\n\t\t\t// <Header for 'Event timing codes', ID: 'ETCO'>\n\t\t\t// Time stamp format    $xx\n\t\t\t//   Where time stamp format is:\n\t\t\t// $01  (32-bit value) MPEG frames from beginning of file\n\t\t\t// $02  (32-bit value) milliseconds from beginning of file\n\t\t\t//   Followed by a list of key events in the following format:\n\t\t\t// Type of event   $xx\n\t\t\t// Time stamp      $xx (xx ...)\n\t\t\t//   The 'Time stamp' is set to zero if directly at the beginning of the sound\n\t\t\t//   or after the previous event. All events MUST be sorted in chronological order.\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\n\t\t\twhile ($frame_offset < strlen($parsedFrame['data'])) {\n\t\t\t\t$parsedFrame['typeid']    = substr($parsedFrame['data'], $frame_offset++, 1);\n\t\t\t\t$parsedFrame['type']      = $this->ETCOEventLookup($parsedFrame['typeid']);\n\t\t\t\t$parsedFrame['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t\t$frame_offset += 4;\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MLLT')) || // 4.6   MLLT MPEG location lookup table\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MLL'))) {     // 4.7   MLL MPEG location lookup table\n\t\t\t//   There may only be one 'MLLT' frame in each tag\n\t\t\t// <Header for 'Location lookup table', ID: 'MLLT'>\n\t\t\t// MPEG frames between reference  $xx xx\n\t\t\t// Bytes between reference        $xx xx xx\n\t\t\t// Milliseconds between reference $xx xx xx\n\t\t\t// Bits for bytes deviation       $xx\n\t\t\t// Bits for milliseconds dev.     $xx\n\t\t\t//   Then for every reference the following data is included;\n\t\t\t// Deviation in bytes         %xxx....\n\t\t\t// Deviation in milliseconds  %xxx....\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['framesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 2));\n\t\t\t$parsedFrame['bytesbetweenreferences']  = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 2, 3));\n\t\t\t$parsedFrame['msbetweenreferences']     = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 5, 3));\n\t\t\t$parsedFrame['bitsforbytesdeviation']   = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 8, 1));\n\t\t\t$parsedFrame['bitsformsdeviation']      = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 9, 1));\n\t\t\t$parsedFrame['data'] = substr($parsedFrame['data'], 10);\n\t\t\twhile ($frame_offset < strlen($parsedFrame['data'])) {\n\t\t\t\t$deviationbitstream .= getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t}\n\t\t\t$reference_counter = 0;\n\t\t\twhile (strlen($deviationbitstream) > 0) {\n\t\t\t\t$parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation']));\n\t\t\t\t$parsedFrame[$reference_counter]['msdeviation']   = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation']));\n\t\t\t\t$deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']);\n\t\t\t\t$reference_counter++;\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) || // 4.7   SYTC Synchronised tempo codes\n\t\t\t\t  (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) {  // 4.8   STC  Synchronised tempo codes\n\t\t\t//   There may only be one 'SYTC' frame in each tag\n\t\t\t// <Header for 'Synchronised tempo codes', ID: 'SYTC'>\n\t\t\t// Time stamp format   $xx\n\t\t\t// Tempo data          <binary data>\n\t\t\t//   Where time stamp format is:\n\t\t\t// $01  (32-bit value) MPEG frames from beginning of file\n\t\t\t// $02  (32-bit value) milliseconds from beginning of file\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$timestamp_counter = 0;\n\t\t\twhile ($frame_offset < strlen($parsedFrame['data'])) {\n\t\t\t\t$parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t\tif ($parsedFrame[$timestamp_counter]['tempo'] == 255) {\n\t\t\t\t\t$parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t\t}\n\t\t\t\t$parsedFrame[$timestamp_counter]['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t\t$frame_offset += 4;\n\t\t\t\t$timestamp_counter++;\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8   USLT Unsynchronised lyric/text transcription\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) {     // 4.9   ULT  Unsynchronised lyric/text transcription\n\t\t\t//   There may be more than one 'Unsynchronised lyrics/text transcription' frame\n\t\t\t//   in each tag, but only one with the same language and content descriptor.\n\t\t\t// <Header for 'Unsynchronised lyrics/text transcription', ID: 'USLT'>\n\t\t\t// Text encoding        $xx\n\t\t\t// Language             $xx xx xx\n\t\t\t// Content descriptor   <text string according to encoding> $00 (00)\n\t\t\t// Lyrics/text          <full text string according to encoding>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t\t$frame_textencoding_terminator = \"\\x00\";\n\t\t\t}\n\t\t\t$frame_language = substr($parsedFrame['data'], $frame_offset, 3);\n\t\t\t$frame_offset += 3;\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t}\n\t\t\t$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_description) === 0) {\n\t\t\t\t$frame_description = '';\n\t\t\t}\n\t\t\t$parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));\n\n\t\t\t$parsedFrame['encodingid']   = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t$parsedFrame['data']         = $parsedFrame['data'];\n\t\t\t$parsedFrame['language']     = $frame_language;\n\t\t\t$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);\n\t\t\t$parsedFrame['description']  = $frame_description;\n\t\t\tif (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {\n\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) || // 4.9   SYLT Synchronised lyric/text\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) {     // 4.10  SLT  Synchronised lyric/text\n\t\t\t//   There may be more than one 'SYLT' frame in each tag,\n\t\t\t//   but only one with the same language and content descriptor.\n\t\t\t// <Header for 'Synchronised lyrics/text', ID: 'SYLT'>\n\t\t\t// Text encoding        $xx\n\t\t\t// Language             $xx xx xx\n\t\t\t// Time stamp format    $xx\n\t\t\t//   $01  (32-bit value) MPEG frames from beginning of file\n\t\t\t//   $02  (32-bit value) milliseconds from beginning of file\n\t\t\t// Content type         $xx\n\t\t\t// Content descriptor   <text string according to encoding> $00 (00)\n\t\t\t//   Terminated text to be synced (typically a syllable)\n\t\t\t//   Sync identifier (terminator to above string)   $00 (00)\n\t\t\t//   Time stamp                                     $xx (xx ...)\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t\t$frame_textencoding_terminator = \"\\x00\";\n\t\t\t}\n\t\t\t$frame_language = substr($parsedFrame['data'], $frame_offset, 3);\n\t\t\t$frame_offset += 3;\n\t\t\t$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['contenttypeid']   = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['contenttype']     = $this->SYTLContentTypeLookup($parsedFrame['contenttypeid']);\n\t\t\t$parsedFrame['encodingid']      = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']        = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t$parsedFrame['language']        = $frame_language;\n\t\t\t$parsedFrame['languagename']    = $this->LanguageLookup($frame_language, false);\n\n\t\t\t$timestampindex = 0;\n\t\t\t$frame_remainingdata = substr($parsedFrame['data'], $frame_offset);\n\t\t\twhile (strlen($frame_remainingdata)) {\n\t\t\t\t$frame_offset = 0;\n\t\t\t\t$frame_terminatorpos = strpos($frame_remainingdata, $frame_textencoding_terminator);\n\t\t\t\tif ($frame_terminatorpos === false) {\n\t\t\t\t\t$frame_remainingdata = '';\n\t\t\t\t} else {\n\t\t\t\t\tif (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t\t\t}\n\t\t\t\t\t$parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset);\n\n\t\t\t\t\t$frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator));\n\t\t\t\t\tif (($timestampindex == 0) && (ord($frame_remainingdata{0}) != 0)) {\n\t\t\t\t\t\t// timestamp probably omitted for first data item\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$parsedFrame['lyrics'][$timestampindex]['timestamp'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 4));\n\t\t\t\t\t\t$frame_remainingdata = substr($frame_remainingdata, 4);\n\t\t\t\t\t}\n\t\t\t\t\t$timestampindex++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) || // 4.10  COMM Comments\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) {     // 4.11  COM  Comments\n\t\t\t//   There may be more than one comment frame in each tag,\n\t\t\t//   but only one with the same language and content descriptor.\n\t\t\t// <Header for 'Comment', ID: 'COMM'>\n\t\t\t// Text encoding          $xx\n\t\t\t// Language               $xx xx xx\n\t\t\t// Short content descrip. <text string according to encoding> $00 (00)\n\t\t\t// The actual text        <full text string according to encoding>\n\n\t\t\tif (strlen($parsedFrame['data']) < 5) {\n\n\t\t\t\t$info['warning'][] = 'Invalid data (too short) for \"'.$parsedFrame['frame_name'].'\" frame at offset '.$parsedFrame['dataoffset'];\n\n\t\t\t} else {\n\n\t\t\t\t$frame_offset = 0;\n\t\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t\t$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);\n\t\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t\t\t$frame_textencoding_terminator = \"\\x00\";\n\t\t\t\t}\n\t\t\t\t$frame_language = substr($parsedFrame['data'], $frame_offset, 3);\n\t\t\t\t$frame_offset += 3;\n\t\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t\t}\n\t\t\t\t$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t\tif (ord($frame_description) === 0) {\n\t\t\t\t\t$frame_description = '';\n\t\t\t\t}\n\t\t\t\t$frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));\n\n\t\t\t\t$parsedFrame['encodingid']   = $frame_textencoding;\n\t\t\t\t$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t\t$parsedFrame['language']     = $frame_language;\n\t\t\t\t$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);\n\t\t\t\t$parsedFrame['description']  = $frame_description;\n\t\t\t\t$parsedFrame['data']         = $frame_text;\n\t\t\t\tif (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {\n\t\t\t\t\t$commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (!empty($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0));\n\t\t\t\t\tif (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) {\n\t\t\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][]            = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) { // 4.11  RVA2 Relative volume adjustment (2) (ID3v2.4+ only)\n\t\t\t//   There may be more than one 'RVA2' frame in each tag,\n\t\t\t//   but only one with the same identification string\n\t\t\t// <Header for 'Relative volume adjustment (2)', ID: 'RVA2'>\n\t\t\t// Identification          <text string> $00\n\t\t\t//   The 'identification' string is used to identify the situation and/or\n\t\t\t//   device where this adjustment should apply. The following is then\n\t\t\t//   repeated for every channel:\n\t\t\t// Type of channel         $xx\n\t\t\t// Volume adjustment       $xx xx\n\t\t\t// Bits representing peak  $xx\n\t\t\t// Peak volume             $xx (xx ...)\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\");\n\t\t\t$frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos);\n\t\t\tif (ord($frame_idstring) === 0) {\n\t\t\t\t$frame_idstring = '';\n\t\t\t}\n\t\t\t$frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen(\"\\x00\"));\n\t\t\t$parsedFrame['description'] = $frame_idstring;\n\t\t\t$RVA2channelcounter = 0;\n\t\t\twhile (strlen($frame_remainingdata) >= 5) {\n\t\t\t\t$frame_offset = 0;\n\t\t\t\t$frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1));\n\t\t\t\t$parsedFrame[$RVA2channelcounter]['channeltypeid']  = $frame_channeltypeid;\n\t\t\t\t$parsedFrame[$RVA2channelcounter]['channeltype']    = $this->RVA2ChannelTypeLookup($frame_channeltypeid);\n\t\t\t\t$parsedFrame[$RVA2channelcounter]['volumeadjust']   = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2), false, true); // 16-bit signed\n\t\t\t\t$frame_offset += 2;\n\t\t\t\t$parsedFrame[$RVA2channelcounter]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1));\n\t\t\t\tif (($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] < 1) || ($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] > 4)) {\n\t\t\t\t\t$info['warning'][] = 'ID3v2::RVA2 frame['.$RVA2channelcounter.'] contains invalid '.$parsedFrame[$RVA2channelcounter]['bitspeakvolume'].'-byte bits-representing-peak value';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t$frame_bytespeakvolume = ceil($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] / 8);\n\t\t\t\t$parsedFrame[$RVA2channelcounter]['peakvolume']     = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume));\n\t\t\t\t$frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume);\n\t\t\t\t$RVA2channelcounter++;\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) || // 4.12  RVAD Relative volume adjustment (ID3v2.3 only)\n\t\t\t\t  (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) {  // 4.12  RVA  Relative volume adjustment (ID3v2.2 only)\n\t\t\t//   There may only be one 'RVA' frame in each tag\n\t\t\t// <Header for 'Relative volume adjustment', ID: 'RVA'>\n\t\t\t// ID3v2.2 => Increment/decrement     %000000ba\n\t\t\t// ID3v2.3 => Increment/decrement     %00fedcba\n\t\t\t// Bits used for volume descr.        $xx\n\t\t\t// Relative volume change, right      $xx xx (xx ...) // a\n\t\t\t// Relative volume change, left       $xx xx (xx ...) // b\n\t\t\t// Peak volume right                  $xx xx (xx ...)\n\t\t\t// Peak volume left                   $xx xx (xx ...)\n\t\t\t//   ID3v2.3 only, optional (not present in ID3v2.2):\n\t\t\t// Relative volume change, right back $xx xx (xx ...) // c\n\t\t\t// Relative volume change, left back  $xx xx (xx ...) // d\n\t\t\t// Peak volume right back             $xx xx (xx ...)\n\t\t\t// Peak volume left back              $xx xx (xx ...)\n\t\t\t//   ID3v2.3 only, optional (not present in ID3v2.2):\n\t\t\t// Relative volume change, center     $xx xx (xx ...) // e\n\t\t\t// Peak volume center                 $xx xx (xx ...)\n\t\t\t//   ID3v2.3 only, optional (not present in ID3v2.2):\n\t\t\t// Relative volume change, bass       $xx xx (xx ...) // f\n\t\t\t// Peak volume bass                   $xx xx (xx ...)\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_incrdecrflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1);\n\t\t\t$parsedFrame['incdec']['left']  = (bool) substr($frame_incrdecrflags, 7, 1);\n\t\t\t$parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8);\n\t\t\t$parsedFrame['volumechange']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\tif ($parsedFrame['incdec']['right'] === false) {\n\t\t\t\t$parsedFrame['volumechange']['right'] *= -1;\n\t\t\t}\n\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t$parsedFrame['volumechange']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\tif ($parsedFrame['incdec']['left'] === false) {\n\t\t\t\t$parsedFrame['volumechange']['left'] *= -1;\n\t\t\t}\n\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t$parsedFrame['peakvolume']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t$parsedFrame['peakvolume']['left']  = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\tif ($id3v2_majorversion == 3) {\n\t\t\t\t$parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);\n\t\t\t\tif (strlen($parsedFrame['data']) > 0) {\n\t\t\t\t\t$parsedFrame['incdec']['rightrear'] = (bool) substr($frame_incrdecrflags, 4, 1);\n\t\t\t\t\t$parsedFrame['incdec']['leftrear']  = (bool) substr($frame_incrdecrflags, 5, 1);\n\t\t\t\t\t$parsedFrame['volumechange']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t\t\tif ($parsedFrame['incdec']['rightrear'] === false) {\n\t\t\t\t\t\t$parsedFrame['volumechange']['rightrear'] *= -1;\n\t\t\t\t\t}\n\t\t\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t\t\t$parsedFrame['volumechange']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t\t\tif ($parsedFrame['incdec']['leftrear'] === false) {\n\t\t\t\t\t\t$parsedFrame['volumechange']['leftrear'] *= -1;\n\t\t\t\t\t}\n\t\t\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t\t\t$parsedFrame['peakvolume']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t\t\t$parsedFrame['peakvolume']['leftrear']  = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t\t}\n\t\t\t\t$parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);\n\t\t\t\tif (strlen($parsedFrame['data']) > 0) {\n\t\t\t\t\t$parsedFrame['incdec']['center'] = (bool) substr($frame_incrdecrflags, 3, 1);\n\t\t\t\t\t$parsedFrame['volumechange']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t\t\tif ($parsedFrame['incdec']['center'] === false) {\n\t\t\t\t\t\t$parsedFrame['volumechange']['center'] *= -1;\n\t\t\t\t\t}\n\t\t\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t\t\t$parsedFrame['peakvolume']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t\t}\n\t\t\t\t$parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset);\n\t\t\t\tif (strlen($parsedFrame['data']) > 0) {\n\t\t\t\t\t$parsedFrame['incdec']['bass'] = (bool) substr($frame_incrdecrflags, 2, 1);\n\t\t\t\t\t$parsedFrame['volumechange']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t\t\tif ($parsedFrame['incdec']['bass'] === false) {\n\t\t\t\t\t\t$parsedFrame['volumechange']['bass'] *= -1;\n\t\t\t\t\t}\n\t\t\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t\t\t$parsedFrame['peakvolume']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume));\n\t\t\t\t\t$frame_offset += $frame_bytesvolume;\n\t\t\t\t}\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'EQU2')) { // 4.12  EQU2 Equalisation (2) (ID3v2.4+ only)\n\t\t\t//   There may be more than one 'EQU2' frame in each tag,\n\t\t\t//   but only one with the same identification string\n\t\t\t// <Header of 'Equalisation (2)', ID: 'EQU2'>\n\t\t\t// Interpolation method  $xx\n\t\t\t//   $00  Band\n\t\t\t//   $01  Linear\n\t\t\t// Identification        <text string> $00\n\t\t\t//   The following is then repeated for every adjustment point\n\t\t\t// Frequency          $xx xx\n\t\t\t// Volume adjustment  $xx xx\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_idstring) === 0) {\n\t\t\t\t$frame_idstring = '';\n\t\t\t}\n\t\t\t$parsedFrame['description'] = $frame_idstring;\n\t\t\t$frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen(\"\\x00\"));\n\t\t\twhile (strlen($frame_remainingdata)) {\n\t\t\t\t$frame_frequency = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 2)) / 2;\n\t\t\t\t$parsedFrame['data'][$frame_frequency] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, 2), false, true);\n\t\t\t\t$frame_remainingdata = substr($frame_remainingdata, 4);\n\t\t\t}\n\t\t\t$parsedFrame['interpolationmethod'] = $frame_interpolationmethod;\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'EQUA')) || // 4.12  EQUA Equalisation (ID3v2.3 only)\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'EQU'))) {     // 4.13  EQU  Equalisation (ID3v2.2 only)\n\t\t\t//   There may only be one 'EQUA' frame in each tag\n\t\t\t// <Header for 'Relative volume adjustment', ID: 'EQU'>\n\t\t\t// Adjustment bits    $xx\n\t\t\t//   This is followed by 2 bytes + ('adjustment bits' rounded up to the\n\t\t\t//   nearest byte) for every equalisation band in the following format,\n\t\t\t//   giving a frequency range of 0 - 32767Hz:\n\t\t\t// Increment/decrement   %x (MSB of the Frequency)\n\t\t\t// Frequency             (lower 15 bits)\n\t\t\t// Adjustment            $xx (xx ...)\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['adjustmentbits'] = substr($parsedFrame['data'], $frame_offset++, 1);\n\t\t\t$frame_adjustmentbytes = ceil($parsedFrame['adjustmentbits'] / 8);\n\n\t\t\t$frame_remainingdata = (string) substr($parsedFrame['data'], $frame_offset);\n\t\t\twhile (strlen($frame_remainingdata) > 0) {\n\t\t\t\t$frame_frequencystr = getid3_lib::BigEndian2Bin(substr($frame_remainingdata, 0, 2));\n\t\t\t\t$frame_incdec    = (bool) substr($frame_frequencystr, 0, 1);\n\t\t\t\t$frame_frequency = bindec(substr($frame_frequencystr, 1, 15));\n\t\t\t\t$parsedFrame[$frame_frequency]['incdec'] = $frame_incdec;\n\t\t\t\t$parsedFrame[$frame_frequency]['adjustment'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, $frame_adjustmentbytes));\n\t\t\t\tif ($parsedFrame[$frame_frequency]['incdec'] === false) {\n\t\t\t\t\t$parsedFrame[$frame_frequency]['adjustment'] *= -1;\n\t\t\t\t}\n\t\t\t\t$frame_remainingdata = substr($frame_remainingdata, 2 + $frame_adjustmentbytes);\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RVRB')) || // 4.13  RVRB Reverb\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'REV'))) {     // 4.14  REV  Reverb\n\t\t\t//   There may only be one 'RVRB' frame in each tag.\n\t\t\t// <Header for 'Reverb', ID: 'RVRB'>\n\t\t\t// Reverb left (ms)                 $xx xx\n\t\t\t// Reverb right (ms)                $xx xx\n\t\t\t// Reverb bounces, left             $xx\n\t\t\t// Reverb bounces, right            $xx\n\t\t\t// Reverb feedback, left to left    $xx\n\t\t\t// Reverb feedback, left to right   $xx\n\t\t\t// Reverb feedback, right to right  $xx\n\t\t\t// Reverb feedback, right to left   $xx\n\t\t\t// Premix left to right             $xx\n\t\t\t// Premix right to left             $xx\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['left']  = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t$frame_offset += 2;\n\t\t\t$parsedFrame['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t$frame_offset += 2;\n\t\t\t$parsedFrame['bouncesL']      = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['bouncesR']      = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['feedbackLL']    = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['feedbackLR']    = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['feedbackRR']    = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['feedbackRL']    = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['premixLR']      = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['premixRL']      = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'APIC')) || // 4.14  APIC Attached picture\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'PIC'))) {     // 4.15  PIC  Attached picture\n\t\t\t//   There may be several pictures attached to one file,\n\t\t\t//   each in their individual 'APIC' frame, but only one\n\t\t\t//   with the same content descriptor\n\t\t\t// <Header for 'Attached picture', ID: 'APIC'>\n\t\t\t// Text encoding      $xx\n\t\t\t// ID3v2.3+ => MIME type          <text string> $00\n\t\t\t// ID3v2.2  => Image format       $xx xx xx\n\t\t\t// Picture type       $xx\n\t\t\t// Description        <text string according to encoding> $00 (00)\n\t\t\t// Picture data       <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t\t$frame_textencoding_terminator = \"\\x00\";\n\t\t\t}\n\n\t\t\tif ($id3v2_majorversion == 2 && strlen($parsedFrame['data']) > $frame_offset) {\n\t\t\t\t$frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3);\n\t\t\t\tif (strtolower($frame_imagetype) == 'ima') {\n\t\t\t\t\t// complete hack for mp3Rage (www.chaoticsoftware.com) that puts ID3v2.3-formatted\n\t\t\t\t\t// MIME type instead of 3-char ID3v2.2-format image type  (thanks xbhoffØpacbell*net)\n\t\t\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t\t\t$frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t\t\tif (ord($frame_mimetype) === 0) {\n\t\t\t\t\t\t$frame_mimetype = '';\n\t\t\t\t\t}\n\t\t\t\t\t$frame_imagetype = strtoupper(str_replace('image/', '', strtolower($frame_mimetype)));\n\t\t\t\t\tif ($frame_imagetype == 'JPEG') {\n\t\t\t\t\t\t$frame_imagetype = 'JPG';\n\t\t\t\t\t}\n\t\t\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\t\t\t\t} else {\n\t\t\t\t\t$frame_offset += 3;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($id3v2_majorversion > 2 && strlen($parsedFrame['data']) > $frame_offset) {\n\t\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t\t$frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t\tif (ord($frame_mimetype) === 0) {\n\t\t\t\t\t$frame_mimetype = '';\n\t\t\t\t}\n\t\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\t\t\t}\n\n\t\t\t$frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\n\t\t\tif ($frame_offset >= $parsedFrame['datalength']) {\n\t\t\t\t$info['warning'][] = 'data portion of APIC frame is missing at offset '.($parsedFrame['dataoffset'] + 8 + $frame_offset);\n\t\t\t} else {\n\t\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t\t}\n\t\t\t\t$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t\tif (ord($frame_description) === 0) {\n\t\t\t\t\t$frame_description = '';\n\t\t\t\t}\n\t\t\t\t$parsedFrame['encodingid']       = $frame_textencoding;\n\t\t\t\t$parsedFrame['encoding']         = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t\tif ($id3v2_majorversion == 2) {\n\t\t\t\t\t$parsedFrame['imagetype']    = $frame_imagetype;\n\t\t\t\t} else {\n\t\t\t\t\t$parsedFrame['mime']         = $frame_mimetype;\n\t\t\t\t}\n\t\t\t\t$parsedFrame['picturetypeid']    = $frame_picturetype;\n\t\t\t\t$parsedFrame['picturetype']      = $this->APICPictureTypeLookup($frame_picturetype);\n\t\t\t\t$parsedFrame['description']      = $frame_description;\n\t\t\t\t$parsedFrame['data']             = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));\n\t\t\t\t$parsedFrame['datalength']       = strlen($parsedFrame['data']);\n\n\t\t\t\t$parsedFrame['image_mime'] = '';\n\t\t\t\t$imageinfo = array();\n\t\t\t\t$imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo);\n\t\t\t\tif (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) {\n\t\t\t\t\t$parsedFrame['image_mime']       = 'image/'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]);\n\t\t\t\t\tif ($imagechunkcheck[0]) {\n\t\t\t\t\t\t$parsedFrame['image_width']  = $imagechunkcheck[0];\n\t\t\t\t\t}\n\t\t\t\t\tif ($imagechunkcheck[1]) {\n\t\t\t\t\t\t$parsedFrame['image_height'] = $imagechunkcheck[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdo {\n\t\t\t\t\tif ($this->getid3->option_save_attachments === false) {\n\t\t\t\t\t\t// skip entirely\n\t\t\t\t\t\tunset($parsedFrame['data']);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif ($this->getid3->option_save_attachments === true) {\n\t\t\t\t\t\t// great\n/*\n\t\t\t\t\t} elseif (is_int($this->getid3->option_save_attachments)) {\n\t\t\t\t\t\tif ($this->getid3->option_save_attachments < $parsedFrame['data_length']) {\n\t\t\t\t\t\t\t// too big, skip\n\t\t\t\t\t\t\t$info['warning'][] = 'attachment at '.$frame_offset.' is too large to process inline ('.number_format($parsedFrame['data_length']).' bytes)';\n\t\t\t\t\t\t\tunset($parsedFrame['data']);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n*/\n\t\t\t\t\t} elseif (is_string($this->getid3->option_save_attachments)) {\n\t\t\t\t\t\t$dir = rtrim(str_replace(array('/', '\\\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR);\n\t\t\t\t\t\tif (!is_dir($dir) || !is_writable($dir)) {\n\t\t\t\t\t\t\t// cannot write, skip\n\t\t\t\t\t\t\t$info['warning'][] = 'attachment at '.$frame_offset.' cannot be saved to \"'.$dir.'\" (not writable)';\n\t\t\t\t\t\t\tunset($parsedFrame['data']);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// if we get this far, must be OK\n\t\t\t\t\tif (is_string($this->getid3->option_save_attachments)) {\n\t\t\t\t\t\t$destination_filename = $dir.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$frame_offset;\n\t\t\t\t\t\tif (!file_exists($destination_filename) || is_writable($destination_filename)) {\n\t\t\t\t\t\t\tfile_put_contents($destination_filename, $parsedFrame['data']);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$info['warning'][] = 'attachment at '.$frame_offset.' cannot be saved to \"'.$destination_filename.'\" (not writable)';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$parsedFrame['data_filename'] = $destination_filename;\n\t\t\t\t\t\tunset($parsedFrame['data']);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {\n\t\t\t\t\t\t\tif (!isset($info['id3v2']['comments']['picture'])) {\n\t\t\t\t\t\t\t\t$info['id3v2']['comments']['picture'] = array();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$comments_picture_data = array();\n\t\t\t\t\t\t\tforeach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) {\n\t\t\t\t\t\t\t\tif (isset($parsedFrame[$picture_key])) {\n\t\t\t\t\t\t\t\t\t$comments_picture_data[$picture_key] = $parsedFrame[$picture_key];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$info['id3v2']['comments']['picture'][] = $comments_picture_data;\n\t\t\t\t\t\t\tunset($comments_picture_data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} while (false);\n\t\t\t}\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) || // 4.15  GEOB General encapsulated object\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'GEO'))) {     // 4.16  GEO  General encapsulated object\n\t\t\t//   There may be more than one 'GEOB' frame in each tag,\n\t\t\t//   but only one with the same content descriptor\n\t\t\t// <Header for 'General encapsulated object', ID: 'GEOB'>\n\t\t\t// Text encoding          $xx\n\t\t\t// MIME type              <text string> $00\n\t\t\t// Filename               <text string according to encoding> $00 (00)\n\t\t\t// Content description    <text string according to encoding> $00 (00)\n\t\t\t// Encapsulated object    <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t\t$frame_textencoding_terminator = \"\\x00\";\n\t\t\t}\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_mimetype) === 0) {\n\t\t\t\t$frame_mimetype = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t}\n\t\t\t$frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_filename) === 0) {\n\t\t\t\t$frame_filename = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t}\n\t\t\t$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_description) === 0) {\n\t\t\t\t$frame_description = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);\n\n\t\t\t$parsedFrame['objectdata']  = (string) substr($parsedFrame['data'], $frame_offset);\n\t\t\t$parsedFrame['encodingid']  = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']    = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t$parsedFrame['mime']        = $frame_mimetype;\n\t\t\t$parsedFrame['filename']    = $frame_filename;\n\t\t\t$parsedFrame['description'] = $frame_description;\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PCNT')) || // 4.16  PCNT Play counter\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CNT'))) {     // 4.17  CNT  Play counter\n\t\t\t//   There may only be one 'PCNT' frame in each tag.\n\t\t\t//   When the counter reaches all one's, one byte is inserted in\n\t\t\t//   front of the counter thus making the counter eight bits bigger\n\t\t\t// <Header for 'Play counter', ID: 'PCNT'>\n\t\t\t// Counter        $xx xx xx xx (xx ...)\n\n\t\t\t$parsedFrame['data']          = getid3_lib::BigEndian2Int($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POPM')) || // 4.17  POPM Popularimeter\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'POP'))) {    // 4.18  POP  Popularimeter\n\t\t\t//   There may be more than one 'POPM' frame in each tag,\n\t\t\t//   but only one with the same email address\n\t\t\t// <Header for 'Popularimeter', ID: 'POPM'>\n\t\t\t// Email to user   <text string> $00\n\t\t\t// Rating          $xx\n\t\t\t// Counter         $xx xx xx xx (xx ...)\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_emailaddress) === 0) {\n\t\t\t\t$frame_emailaddress = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\t\t\t$frame_rating = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['counter'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset));\n\t\t\t$parsedFrame['email']   = $frame_emailaddress;\n\t\t\t$parsedFrame['rating']  = $frame_rating;\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RBUF')) || // 4.18  RBUF Recommended buffer size\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'BUF'))) {     // 4.19  BUF  Recommended buffer size\n\t\t\t//   There may only be one 'RBUF' frame in each tag\n\t\t\t// <Header for 'Recommended buffer size', ID: 'RBUF'>\n\t\t\t// Buffer size               $xx xx xx\n\t\t\t// Embedded info flag        %0000000x\n\t\t\t// Offset to next tag        $xx xx xx xx\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['buffersize'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 3));\n\t\t\t$frame_offset += 3;\n\n\t\t\t$frame_embeddedinfoflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['flags']['embededinfo'] = (bool) substr($frame_embeddedinfoflags, 7, 1);\n\t\t\t$parsedFrame['nexttagoffset'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRM')) { // 4.20  Encrypted meta frame (ID3v2.2 only)\n\t\t\t//   There may be more than one 'CRM' frame in a tag,\n\t\t\t//   but only one with the same 'owner identifier'\n\t\t\t// <Header for 'Encrypted meta frame', ID: 'CRM'>\n\t\t\t// Owner identifier      <textstring> $00 (00)\n\t\t\t// Content/explanation   <textstring> $00 (00)\n\t\t\t// Encrypted datablock   <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_description) === 0) {\n\t\t\t\t$frame_description = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$parsedFrame['ownerid']     = $frame_ownerid;\n\t\t\t$parsedFrame['data']        = (string) substr($parsedFrame['data'], $frame_offset);\n\t\t\t$parsedFrame['description'] = $frame_description;\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'AENC')) || // 4.19  AENC Audio encryption\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRA'))) {     // 4.21  CRA  Audio encryption\n\t\t\t//   There may be more than one 'AENC' frames in a tag,\n\t\t\t//   but only one with the same 'Owner identifier'\n\t\t\t// <Header for 'Audio encryption', ID: 'AENC'>\n\t\t\t// Owner identifier   <text string> $00\n\t\t\t// Preview start      $xx xx\n\t\t\t// Preview length     $xx xx\n\t\t\t// Encryption info    <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_ownerid) === 0) {\n\t\t\t\t$frame_ownerid == '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\t\t\t$parsedFrame['ownerid'] = $frame_ownerid;\n\t\t\t$parsedFrame['previewstart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t$frame_offset += 2;\n\t\t\t$parsedFrame['previewlength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t$frame_offset += 2;\n\t\t\t$parsedFrame['encryptioninfo'] = (string) substr($parsedFrame['data'], $frame_offset);\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'LINK')) || // 4.20  LINK Linked information\n\t\t\t\t(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'LNK'))) {    // 4.22  LNK  Linked information\n\t\t\t//   There may be more than one 'LINK' frame in a tag,\n\t\t\t//   but only one with the same contents\n\t\t\t// <Header for 'Linked information', ID: 'LINK'>\n\t\t\t// ID3v2.3+ => Frame identifier   $xx xx xx xx\n\t\t\t// ID3v2.2  => Frame identifier   $xx xx xx\n\t\t\t// URL                            <text string> $00\n\t\t\t// ID and additional data         <text string(s)>\n\n\t\t\t$frame_offset = 0;\n\t\t\tif ($id3v2_majorversion == 2) {\n\t\t\t\t$parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 3);\n\t\t\t\t$frame_offset += 3;\n\t\t\t} else {\n\t\t\t\t$parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 4);\n\t\t\t\t$frame_offset += 4;\n\t\t\t}\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_url) === 0) {\n\t\t\t\t$frame_url = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\t\t\t$parsedFrame['url'] = $frame_url;\n\n\t\t\t$parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset);\n\t\t\tif (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {\n\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback_iso88591_utf8($parsedFrame['url']);\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POSS')) { // 4.21  POSS Position synchronisation frame (ID3v2.3+ only)\n\t\t\t//   There may only be one 'POSS' frame in each tag\n\t\t\t// <Head for 'Position synchronisation', ID: 'POSS'>\n\t\t\t// Time stamp format         $xx\n\t\t\t// Position                  $xx (xx ...)\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['position']        = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset));\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USER')) { // 4.22  USER Terms of use (ID3v2.3+ only)\n\t\t\t//   There may be more than one 'Terms of use' frame in a tag,\n\t\t\t//   but only one with the same 'Language'\n\t\t\t// <Header for 'Terms of use frame', ID: 'USER'>\n\t\t\t// Text encoding        $xx\n\t\t\t// Language             $xx xx xx\n\t\t\t// The actual text      <text string according to encoding>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t}\n\t\t\t$frame_language = substr($parsedFrame['data'], $frame_offset, 3);\n\t\t\t$frame_offset += 3;\n\t\t\t$parsedFrame['language']     = $frame_language;\n\t\t\t$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);\n\t\t\t$parsedFrame['encodingid']   = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t$parsedFrame['data']         = (string) substr($parsedFrame['data'], $frame_offset);\n\t\t\tif (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {\n\t\t\t\t$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'OWNE')) { // 4.23  OWNE Ownership frame (ID3v2.3+ only)\n\t\t\t//   There may only be one 'OWNE' frame in a tag\n\t\t\t// <Header for 'Ownership frame', ID: 'OWNE'>\n\t\t\t// Text encoding     $xx\n\t\t\t// Price paid        <text string> $00\n\t\t\t// Date of purch.    <text string>\n\t\t\t// Seller            <text string according to encoding>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t}\n\t\t\t$parsedFrame['encodingid'] = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']   = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$parsedFrame['pricepaid']['currencyid'] = substr($frame_pricepaid, 0, 3);\n\t\t\t$parsedFrame['pricepaid']['currency']   = $this->LookupCurrencyUnits($parsedFrame['pricepaid']['currencyid']);\n\t\t\t$parsedFrame['pricepaid']['value']      = substr($frame_pricepaid, 3);\n\n\t\t\t$parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8);\n\t\t\tif (!$this->IsValidDateStampString($parsedFrame['purchasedate'])) {\n\t\t\t\t$parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4));\n\t\t\t}\n\t\t\t$frame_offset += 8;\n\n\t\t\t$parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset);\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMR')) { // 4.24  COMR Commercial frame (ID3v2.3+ only)\n\t\t\t//   There may be more than one 'commercial frame' in a tag,\n\t\t\t//   but no two may be identical\n\t\t\t// <Header for 'Commercial frame', ID: 'COMR'>\n\t\t\t// Text encoding      $xx\n\t\t\t// Price string       <text string> $00\n\t\t\t// Valid until        <text string>\n\t\t\t// Contact URL        <text string> $00\n\t\t\t// Received as        $xx\n\t\t\t// Name of seller     <text string according to encoding> $00 (00)\n\t\t\t// Description        <text string according to encoding> $00 (00)\n\t\t\t// Picture MIME type  <string> $00\n\t\t\t// Seller logo        <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding);\n\t\t\tif ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) {\n\t\t\t\t$info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame \"'.$parsedFrame['frame_name'].'\" - defaulting to ISO-8859-1 encoding';\n\t\t\t\t$frame_textencoding_terminator = \"\\x00\";\n\t\t\t}\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\t\t\t$frame_rawpricearray = explode('/', $frame_pricestring);\n\t\t\tforeach ($frame_rawpricearray as $key => $val) {\n\t\t\t\t$frame_currencyid = substr($val, 0, 3);\n\t\t\t\t$parsedFrame['price'][$frame_currencyid]['currency'] = $this->LookupCurrencyUnits($frame_currencyid);\n\t\t\t\t$parsedFrame['price'][$frame_currencyid]['value']    = substr($val, 3);\n\t\t\t}\n\n\t\t\t$frame_datestring = substr($parsedFrame['data'], $frame_offset, 8);\n\t\t\t$frame_offset += 8;\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t}\n\t\t\t$frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_sellername) === 0) {\n\t\t\t\t$frame_sellername = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);\n\t\t\tif (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {\n\t\t\t\t$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00\n\t\t\t}\n\t\t\t$frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_description) === 0) {\n\t\t\t\t$frame_description = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);\n\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$frame_sellerlogo = substr($parsedFrame['data'], $frame_offset);\n\n\t\t\t$parsedFrame['encodingid']        = $frame_textencoding;\n\t\t\t$parsedFrame['encoding']          = $this->TextEncodingNameLookup($frame_textencoding);\n\n\t\t\t$parsedFrame['pricevaliduntil']   = $frame_datestring;\n\t\t\t$parsedFrame['contacturl']        = $frame_contacturl;\n\t\t\t$parsedFrame['receivedasid']      = $frame_receivedasid;\n\t\t\t$parsedFrame['receivedas']        = $this->COMRReceivedAsLookup($frame_receivedasid);\n\t\t\t$parsedFrame['sellername']        = $frame_sellername;\n\t\t\t$parsedFrame['description']       = $frame_description;\n\t\t\t$parsedFrame['mime']              = $frame_mimetype;\n\t\t\t$parsedFrame['logo']              = $frame_sellerlogo;\n\t\t\tunset($parsedFrame['data']);\n\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ENCR')) { // 4.25  ENCR Encryption method registration (ID3v2.3+ only)\n\t\t\t//   There may be several 'ENCR' frames in a tag,\n\t\t\t//   but only one containing the same symbol\n\t\t\t//   and only one containing the same owner identifier\n\t\t\t// <Header for 'Encryption method registration', ID: 'ENCR'>\n\t\t\t// Owner identifier    <text string> $00\n\t\t\t// Method symbol       $xx\n\t\t\t// Encryption data     <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_ownerid) === 0) {\n\t\t\t\t$frame_ownerid = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$parsedFrame['ownerid']      = $frame_ownerid;\n\t\t\t$parsedFrame['methodsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['data']         = (string) substr($parsedFrame['data'], $frame_offset);\n\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GRID')) { // 4.26  GRID Group identification registration (ID3v2.3+ only)\n\n\t\t\t//   There may be several 'GRID' frames in a tag,\n\t\t\t//   but only one containing the same symbol\n\t\t\t//   and only one containing the same owner identifier\n\t\t\t// <Header for 'Group ID registration', ID: 'GRID'>\n\t\t\t// Owner identifier      <text string> $00\n\t\t\t// Group symbol          $xx\n\t\t\t// Group dependent data  <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_ownerid) === 0) {\n\t\t\t\t$frame_ownerid = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$parsedFrame['ownerid']       = $frame_ownerid;\n\t\t\t$parsedFrame['groupsymbol']   = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['data']          = (string) substr($parsedFrame['data'], $frame_offset);\n\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PRIV')) { // 4.27  PRIV Private frame (ID3v2.3+ only)\n\t\t\t//   The tag may contain more than one 'PRIV' frame\n\t\t\t//   but only with different contents\n\t\t\t// <Header for 'Private frame', ID: 'PRIV'>\n\t\t\t// Owner identifier      <text string> $00\n\t\t\t// The private data      <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$frame_terminatorpos = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t$frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);\n\t\t\tif (ord($frame_ownerid) === 0) {\n\t\t\t\t$frame_ownerid = '';\n\t\t\t}\n\t\t\t$frame_offset = $frame_terminatorpos + strlen(\"\\x00\");\n\n\t\t\t$parsedFrame['ownerid'] = $frame_ownerid;\n\t\t\t$parsedFrame['data']    = (string) substr($parsedFrame['data'], $frame_offset);\n\n\n\t\t} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SIGN')) { // 4.28  SIGN Signature frame (ID3v2.4+ only)\n\t\t\t//   There may be more than one 'signature frame' in a tag,\n\t\t\t//   but no two may be identical\n\t\t\t// <Header for 'Signature frame', ID: 'SIGN'>\n\t\t\t// Group symbol      $xx\n\t\t\t// Signature         <binary data>\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$parsedFrame['data']        = (string) substr($parsedFrame['data'], $frame_offset);\n\n\n\t\t} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SEEK')) { // 4.29  SEEK Seek frame (ID3v2.4+ only)\n\t\t\t//   There may only be one 'seek frame' in a tag\n\t\t\t// <Header for 'Seek frame', ID: 'SEEK'>\n\t\t\t// Minimum offset to next tag       $xx xx xx xx\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['data']          = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\n\n\t\t} elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'ASPI')) { // 4.30  ASPI Audio seek point index (ID3v2.4+ only)\n\t\t\t//   There may only be one 'audio seek point index' frame in a tag\n\t\t\t// <Header for 'Seek Point Index', ID: 'ASPI'>\n\t\t\t// Indexed data start (S)         $xx xx xx xx\n\t\t\t// Indexed data length (L)        $xx xx xx xx\n\t\t\t// Number of index points (N)     $xx xx\n\t\t\t// Bits per index point (b)       $xx\n\t\t\t//   Then for every index point the following data is included:\n\t\t\t// Fraction at index (Fi)          $xx (xx)\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['datastart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t$frame_offset += 4;\n\t\t\t$parsedFrame['indexeddatalength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t$frame_offset += 4;\n\t\t\t$parsedFrame['indexpoints'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t$frame_offset += 2;\n\t\t\t$parsedFrame['bitsperpoint'] = ord(substr($parsedFrame['data'], $frame_offset++, 1));\n\t\t\t$frame_bytesperpoint = ceil($parsedFrame['bitsperpoint'] / 8);\n\t\t\tfor ($i = 0; $i < $parsedFrame['indexpoints']; $i++) {\n\t\t\t\t$parsedFrame['indexes'][$i] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesperpoint));\n\t\t\t\t$frame_offset += $frame_bytesperpoint;\n\t\t\t}\n\t\t\tunset($parsedFrame['data']);\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RGAD')) { // Replay Gain Adjustment\n\t\t\t// http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html\n\t\t\t//   There may only be one 'RGAD' frame in a tag\n\t\t\t// <Header for 'Replay Gain Adjustment', ID: 'RGAD'>\n\t\t\t// Peak Amplitude                      $xx $xx $xx $xx\n\t\t\t// Radio Replay Gain Adjustment        %aaabbbcd %dddddddd\n\t\t\t// Audiophile Replay Gain Adjustment   %aaabbbcd %dddddddd\n\t\t\t//   a - name code\n\t\t\t//   b - originator code\n\t\t\t//   c - sign bit\n\t\t\t//   d - replay gain adjustment\n\n\t\t\t$frame_offset = 0;\n\t\t\t$parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t$frame_offset += 4;\n\t\t\t$rg_track_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t$frame_offset += 2;\n\t\t\t$rg_album_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t$frame_offset += 2;\n\t\t\t$parsedFrame['raw']['track']['name']       = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 0, 3));\n\t\t\t$parsedFrame['raw']['track']['originator'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 3, 3));\n\t\t\t$parsedFrame['raw']['track']['signbit']    = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 6, 1));\n\t\t\t$parsedFrame['raw']['track']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 7, 9));\n\t\t\t$parsedFrame['raw']['album']['name']       = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 0, 3));\n\t\t\t$parsedFrame['raw']['album']['originator'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 3, 3));\n\t\t\t$parsedFrame['raw']['album']['signbit']    = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 6, 1));\n\t\t\t$parsedFrame['raw']['album']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 7, 9));\n\t\t\t$parsedFrame['track']['name']       = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']);\n\t\t\t$parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']);\n\t\t\t$parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']);\n\t\t\t$parsedFrame['album']['name']       = getid3_lib::RGADnameLookup($parsedFrame['raw']['album']['name']);\n\t\t\t$parsedFrame['album']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['album']['originator']);\n\t\t\t$parsedFrame['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['album']['adjustment'], $parsedFrame['raw']['album']['signbit']);\n\n\t\t\t$info['replay_gain']['track']['peak']       = $parsedFrame['peakamplitude'];\n\t\t\t$info['replay_gain']['track']['originator'] = $parsedFrame['track']['originator'];\n\t\t\t$info['replay_gain']['track']['adjustment'] = $parsedFrame['track']['adjustment'];\n\t\t\t$info['replay_gain']['album']['originator'] = $parsedFrame['album']['originator'];\n\t\t\t$info['replay_gain']['album']['adjustment'] = $parsedFrame['album']['adjustment'];\n\n\t\t\tunset($parsedFrame['data']);\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CHAP')) { // CHAP Chapters frame (ID3v2.3+ only)\n\t\t\t// http://id3.org/id3v2-chapters-1.0\n\t\t\t// <ID3v2.3 or ID3v2.4 frame header, ID: \"CHAP\">           (10 bytes)\n\t\t\t// Element ID      <text string> $00\n\t\t\t// Start time      $xx xx xx xx\n\t\t\t// End time        $xx xx xx xx\n            // Start offset    $xx xx xx xx\n            // End offset      $xx xx xx xx\n            // <Optional embedded sub-frames>\n\n\t\t\t$frame_offset = 0;\n\t\t\t@list($parsedFrame['element_id']) = explode(\"\\x00\", $parsedFrame['data'], 2);\n\t\t\t$frame_offset += strlen($parsedFrame['element_id'].\"\\x00\");\n\t\t\t$parsedFrame['time_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t$frame_offset += 4;\n\t\t\t$parsedFrame['time_end']   = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t$frame_offset += 4;\n\t\t\tif (substr($parsedFrame['data'], $frame_offset, 4) != \"\\xFF\\xFF\\xFF\\xFF\") {\n\t\t\t\t// \"If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized.\"\n\t\t\t\t$parsedFrame['offset_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t}\n\t\t\t$frame_offset += 4;\n\t\t\tif (substr($parsedFrame['data'], $frame_offset, 4) != \"\\xFF\\xFF\\xFF\\xFF\") {\n\t\t\t\t// \"If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized.\"\n\t\t\t\t$parsedFrame['offset_end']   = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t}\n\t\t\t$frame_offset += 4;\n\n\t\t\tif ($frame_offset < strlen($parsedFrame['data'])) {\n\t\t\t\t$parsedFrame['subframes'] = array();\n\t\t\t\twhile ($frame_offset < strlen($parsedFrame['data'])) {\n\t\t\t\t\t// <Optional embedded sub-frames>\n\t\t\t\t\t$subframe = array();\n\t\t\t\t\t$subframe['name']      =                           substr($parsedFrame['data'], $frame_offset, 4);\n\t\t\t\t\t$frame_offset += 4;\n\t\t\t\t\t$subframe['size']      = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t\t\t$frame_offset += 4;\n\t\t\t\t\t$subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t\t\t$frame_offset += 2;\n\t\t\t\t\tif ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) {\n\t\t\t\t\t\t$info['warning'][] = 'CHAP subframe \"'.$subframe['name'].'\" at frame offset '.$frame_offset.' claims to be \"'.$subframe['size'].'\" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']);\n\t\t\t\t\t$frame_offset += $subframe['size'];\n\n\t\t\t\t\t$subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1));\n\t\t\t\t\t$subframe['text']       =     substr($subframe_rawdata, 1);\n\t\t\t\t\t$subframe['encoding']   = $this->TextEncodingNameLookup($subframe['encodingid']);\n\t\t\t\t\t$encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));;\n\t\t\t\t\tswitch (substr($encoding_converted_text, 0, 2)) {\n\t\t\t\t\t\tcase \"\\xFF\\xFE\":\n\t\t\t\t\t\tcase \"\\xFE\\xFF\":\n\t\t\t\t\t\t\tswitch (strtoupper($info['id3v2']['encoding'])) {\n\t\t\t\t\t\t\t\tcase 'ISO-8859-1':\n\t\t\t\t\t\t\t\tcase 'UTF-8':\n\t\t\t\t\t\t\t\t\t$encoding_converted_text = substr($encoding_converted_text, 2);\n\t\t\t\t\t\t\t\t\t// remove unwanted byte-order-marks\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// do not remove BOM\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) {\n\t\t\t\t\t\tif ($subframe['name'] == 'TIT2') {\n\t\t\t\t\t\t\t$parsedFrame['chapter_name']        = $encoding_converted_text;\n\t\t\t\t\t\t} elseif ($subframe['name'] == 'TIT3') {\n\t\t\t\t\t\t\t$parsedFrame['chapter_description'] = $encoding_converted_text;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$parsedFrame['subframes'][] = $subframe;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'ID3v2.CHAP subframe \"'.$subframe['name'].'\" not handled (only TIT2 and TIT3)';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset($subframe_rawdata, $subframe, $encoding_converted_text);\n\t\t\t}\n\n\t\t\t$id3v2_chapter_entry = array();\n\t\t\tforeach (array('id', 'time_begin', 'time_end', 'offset_begin', 'offset_end', 'chapter_name', 'chapter_description') as $id3v2_chapter_key) {\n\t\t\t\tif (isset($parsedFrame[$id3v2_chapter_key])) {\n\t\t\t\t\t$id3v2_chapter_entry[$id3v2_chapter_key] = $parsedFrame[$id3v2_chapter_key];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!isset($info['id3v2']['chapters'])) {\n\t\t\t\t$info['id3v2']['chapters'] = array();\n\t\t\t}\n\t\t\t$info['id3v2']['chapters'][] = $id3v2_chapter_entry;\n\t\t\tunset($id3v2_chapter_entry, $id3v2_chapter_key);\n\n\n\t\t} elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CTOC')) { // CTOC Chapters Table Of Contents frame (ID3v2.3+ only)\n\t\t\t// http://id3.org/id3v2-chapters-1.0\n\t\t\t// <ID3v2.3 or ID3v2.4 frame header, ID: \"CTOC\">           (10 bytes)\n\t\t\t// Element ID      <text string> $00\n\t\t\t// CTOC flags        %xx\n\t\t\t// Entry count       $xx\n\t\t\t// Child Element ID  <string>$00   /* zero or more child CHAP or CTOC entries */\n            // <Optional embedded sub-frames>\n\n\t\t\t$frame_offset = 0;\n\t\t\t@list($parsedFrame['element_id']) = explode(\"\\x00\", $parsedFrame['data'], 2);\n\t\t\t$frame_offset += strlen($parsedFrame['element_id'].\"\\x00\");\n\t\t\t$ctoc_flags_raw = ord(substr($parsedFrame['data'], $frame_offset, 1));\n\t\t\t$frame_offset += 1;\n\t\t\t$parsedFrame['entry_count'] = ord(substr($parsedFrame['data'], $frame_offset, 1));\n\t\t\t$frame_offset += 1;\n\n\t\t\t$terminator_position = null;\n\t\t\tfor ($i = 0; $i < $parsedFrame['entry_count']; $i++) {\n\t\t\t\t$terminator_position = strpos($parsedFrame['data'], \"\\x00\", $frame_offset);\n\t\t\t\t$parsedFrame['child_element_ids'][$i] = substr($parsedFrame['data'], $frame_offset, $terminator_position - $frame_offset);\n\t\t\t\t$frame_offset = $terminator_position + 1;\n\t\t\t}\n\n\t\t\t$parsedFrame['ctoc_flags']['ordered']   = (bool) ($ctoc_flags_raw & 0x01);\n\t\t\t$parsedFrame['ctoc_flags']['top_level'] = (bool) ($ctoc_flags_raw & 0x03);\n\n\t\t\tunset($ctoc_flags_raw, $terminator_position);\n\n\t\t\tif ($frame_offset < strlen($parsedFrame['data'])) {\n\t\t\t\t$parsedFrame['subframes'] = array();\n\t\t\t\twhile ($frame_offset < strlen($parsedFrame['data'])) {\n\t\t\t\t\t// <Optional embedded sub-frames>\n\t\t\t\t\t$subframe = array();\n\t\t\t\t\t$subframe['name']      =                           substr($parsedFrame['data'], $frame_offset, 4);\n\t\t\t\t\t$frame_offset += 4;\n\t\t\t\t\t$subframe['size']      = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4));\n\t\t\t\t\t$frame_offset += 4;\n\t\t\t\t\t$subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));\n\t\t\t\t\t$frame_offset += 2;\n\t\t\t\t\tif ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) {\n\t\t\t\t\t\t$info['warning'][] = 'CTOS subframe \"'.$subframe['name'].'\" at frame offset '.$frame_offset.' claims to be \"'.$subframe['size'].'\" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']);\n\t\t\t\t\t$frame_offset += $subframe['size'];\n\n\t\t\t\t\t$subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1));\n\t\t\t\t\t$subframe['text']       =     substr($subframe_rawdata, 1);\n\t\t\t\t\t$subframe['encoding']   = $this->TextEncodingNameLookup($subframe['encodingid']);\n\t\t\t\t\t$encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));;\n\t\t\t\t\tswitch (substr($encoding_converted_text, 0, 2)) {\n\t\t\t\t\t\tcase \"\\xFF\\xFE\":\n\t\t\t\t\t\tcase \"\\xFE\\xFF\":\n\t\t\t\t\t\t\tswitch (strtoupper($info['id3v2']['encoding'])) {\n\t\t\t\t\t\t\t\tcase 'ISO-8859-1':\n\t\t\t\t\t\t\t\tcase 'UTF-8':\n\t\t\t\t\t\t\t\t\t$encoding_converted_text = substr($encoding_converted_text, 2);\n\t\t\t\t\t\t\t\t\t// remove unwanted byte-order-marks\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// do not remove BOM\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) {\n\t\t\t\t\t\tif ($subframe['name'] == 'TIT2') {\n\t\t\t\t\t\t\t$parsedFrame['toc_name']        = $encoding_converted_text;\n\t\t\t\t\t\t} elseif ($subframe['name'] == 'TIT3') {\n\t\t\t\t\t\t\t$parsedFrame['toc_description'] = $encoding_converted_text;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$parsedFrame['subframes'][] = $subframe;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$info['warning'][] = 'ID3v2.CTOC subframe \"'.$subframe['name'].'\" not handled (only TIT2 and TIT3)';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset($subframe_rawdata, $subframe, $encoding_converted_text);\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\t}\n\n\n\tpublic function DeUnsynchronise($data) {\n\t\treturn str_replace(\"\\xFF\\x00\", \"\\xFF\", $data);\n\t}\n\n\tpublic function LookupExtendedHeaderRestrictionsTagSizeLimits($index) {\n\t\tstatic $LookupExtendedHeaderRestrictionsTagSizeLimits = array(\n\t\t\t0x00 => 'No more than 128 frames and 1 MB total tag size',\n\t\t\t0x01 => 'No more than 64 frames and 128 KB total tag size',\n\t\t\t0x02 => 'No more than 32 frames and 40 KB total tag size',\n\t\t\t0x03 => 'No more than 32 frames and 4 KB total tag size',\n\t\t);\n\t\treturn (isset($LookupExtendedHeaderRestrictionsTagSizeLimits[$index]) ? $LookupExtendedHeaderRestrictionsTagSizeLimits[$index] : '');\n\t}\n\n\tpublic function LookupExtendedHeaderRestrictionsTextEncodings($index) {\n\t\tstatic $LookupExtendedHeaderRestrictionsTextEncodings = array(\n\t\t\t0x00 => 'No restrictions',\n\t\t\t0x01 => 'Strings are only encoded with ISO-8859-1 or UTF-8',\n\t\t);\n\t\treturn (isset($LookupExtendedHeaderRestrictionsTextEncodings[$index]) ? $LookupExtendedHeaderRestrictionsTextEncodings[$index] : '');\n\t}\n\n\tpublic function LookupExtendedHeaderRestrictionsTextFieldSize($index) {\n\t\tstatic $LookupExtendedHeaderRestrictionsTextFieldSize = array(\n\t\t\t0x00 => 'No restrictions',\n\t\t\t0x01 => 'No string is longer than 1024 characters',\n\t\t\t0x02 => 'No string is longer than 128 characters',\n\t\t\t0x03 => 'No string is longer than 30 characters',\n\t\t);\n\t\treturn (isset($LookupExtendedHeaderRestrictionsTextFieldSize[$index]) ? $LookupExtendedHeaderRestrictionsTextFieldSize[$index] : '');\n\t}\n\n\tpublic function LookupExtendedHeaderRestrictionsImageEncoding($index) {\n\t\tstatic $LookupExtendedHeaderRestrictionsImageEncoding = array(\n\t\t\t0x00 => 'No restrictions',\n\t\t\t0x01 => 'Images are encoded only with PNG or JPEG',\n\t\t);\n\t\treturn (isset($LookupExtendedHeaderRestrictionsImageEncoding[$index]) ? $LookupExtendedHeaderRestrictionsImageEncoding[$index] : '');\n\t}\n\n\tpublic function LookupExtendedHeaderRestrictionsImageSizeSize($index) {\n\t\tstatic $LookupExtendedHeaderRestrictionsImageSizeSize = array(\n\t\t\t0x00 => 'No restrictions',\n\t\t\t0x01 => 'All images are 256x256 pixels or smaller',\n\t\t\t0x02 => 'All images are 64x64 pixels or smaller',\n\t\t\t0x03 => 'All images are exactly 64x64 pixels, unless required otherwise',\n\t\t);\n\t\treturn (isset($LookupExtendedHeaderRestrictionsImageSizeSize[$index]) ? $LookupExtendedHeaderRestrictionsImageSizeSize[$index] : '');\n\t}\n\n\tpublic function LookupCurrencyUnits($currencyid) {\n\n\t\t$begin = __LINE__;\n\n\t\t/** This is not a comment!\n\n\n\t\t\tAED\tDirhams\n\t\t\tAFA\tAfghanis\n\t\t\tALL\tLeke\n\t\t\tAMD\tDrams\n\t\t\tANG\tGuilders\n\t\t\tAOA\tKwanza\n\t\t\tARS\tPesos\n\t\t\tATS\tSchillings\n\t\t\tAUD\tDollars\n\t\t\tAWG\tGuilders\n\t\t\tAZM\tManats\n\t\t\tBAM\tConvertible Marka\n\t\t\tBBD\tDollars\n\t\t\tBDT\tTaka\n\t\t\tBEF\tFrancs\n\t\t\tBGL\tLeva\n\t\t\tBHD\tDinars\n\t\t\tBIF\tFrancs\n\t\t\tBMD\tDollars\n\t\t\tBND\tDollars\n\t\t\tBOB\tBolivianos\n\t\t\tBRL\tBrazil Real\n\t\t\tBSD\tDollars\n\t\t\tBTN\tNgultrum\n\t\t\tBWP\tPulas\n\t\t\tBYR\tRubles\n\t\t\tBZD\tDollars\n\t\t\tCAD\tDollars\n\t\t\tCDF\tCongolese Francs\n\t\t\tCHF\tFrancs\n\t\t\tCLP\tPesos\n\t\t\tCNY\tYuan Renminbi\n\t\t\tCOP\tPesos\n\t\t\tCRC\tColones\n\t\t\tCUP\tPesos\n\t\t\tCVE\tEscudos\n\t\t\tCYP\tPounds\n\t\t\tCZK\tKoruny\n\t\t\tDEM\tDeutsche Marks\n\t\t\tDJF\tFrancs\n\t\t\tDKK\tKroner\n\t\t\tDOP\tPesos\n\t\t\tDZD\tAlgeria Dinars\n\t\t\tEEK\tKrooni\n\t\t\tEGP\tPounds\n\t\t\tERN\tNakfa\n\t\t\tESP\tPesetas\n\t\t\tETB\tBirr\n\t\t\tEUR\tEuro\n\t\t\tFIM\tMarkkaa\n\t\t\tFJD\tDollars\n\t\t\tFKP\tPounds\n\t\t\tFRF\tFrancs\n\t\t\tGBP\tPounds\n\t\t\tGEL\tLari\n\t\t\tGGP\tPounds\n\t\t\tGHC\tCedis\n\t\t\tGIP\tPounds\n\t\t\tGMD\tDalasi\n\t\t\tGNF\tFrancs\n\t\t\tGRD\tDrachmae\n\t\t\tGTQ\tQuetzales\n\t\t\tGYD\tDollars\n\t\t\tHKD\tDollars\n\t\t\tHNL\tLempiras\n\t\t\tHRK\tKuna\n\t\t\tHTG\tGourdes\n\t\t\tHUF\tForints\n\t\t\tIDR\tRupiahs\n\t\t\tIEP\tPounds\n\t\t\tILS\tNew Shekels\n\t\t\tIMP\tPounds\n\t\t\tINR\tRupees\n\t\t\tIQD\tDinars\n\t\t\tIRR\tRials\n\t\t\tISK\tKronur\n\t\t\tITL\tLire\n\t\t\tJEP\tPounds\n\t\t\tJMD\tDollars\n\t\t\tJOD\tDinars\n\t\t\tJPY\tYen\n\t\t\tKES\tShillings\n\t\t\tKGS\tSoms\n\t\t\tKHR\tRiels\n\t\t\tKMF\tFrancs\n\t\t\tKPW\tWon\n\t\t\tKWD\tDinars\n\t\t\tKYD\tDollars\n\t\t\tKZT\tTenge\n\t\t\tLAK\tKips\n\t\t\tLBP\tPounds\n\t\t\tLKR\tRupees\n\t\t\tLRD\tDollars\n\t\t\tLSL\tMaloti\n\t\t\tLTL\tLitai\n\t\t\tLUF\tFrancs\n\t\t\tLVL\tLati\n\t\t\tLYD\tDinars\n\t\t\tMAD\tDirhams\n\t\t\tMDL\tLei\n\t\t\tMGF\tMalagasy Francs\n\t\t\tMKD\tDenars\n\t\t\tMMK\tKyats\n\t\t\tMNT\tTugriks\n\t\t\tMOP\tPatacas\n\t\t\tMRO\tOuguiyas\n\t\t\tMTL\tLiri\n\t\t\tMUR\tRupees\n\t\t\tMVR\tRufiyaa\n\t\t\tMWK\tKwachas\n\t\t\tMXN\tPesos\n\t\t\tMYR\tRinggits\n\t\t\tMZM\tMeticais\n\t\t\tNAD\tDollars\n\t\t\tNGN\tNairas\n\t\t\tNIO\tGold Cordobas\n\t\t\tNLG\tGuilders\n\t\t\tNOK\tKrone\n\t\t\tNPR\tNepal Rupees\n\t\t\tNZD\tDollars\n\t\t\tOMR\tRials\n\t\t\tPAB\tBalboa\n\t\t\tPEN\tNuevos Soles\n\t\t\tPGK\tKina\n\t\t\tPHP\tPesos\n\t\t\tPKR\tRupees\n\t\t\tPLN\tZlotych\n\t\t\tPTE\tEscudos\n\t\t\tPYG\tGuarani\n\t\t\tQAR\tRials\n\t\t\tROL\tLei\n\t\t\tRUR\tRubles\n\t\t\tRWF\tRwanda Francs\n\t\t\tSAR\tRiyals\n\t\t\tSBD\tDollars\n\t\t\tSCR\tRupees\n\t\t\tSDD\tDinars\n\t\t\tSEK\tKronor\n\t\t\tSGD\tDollars\n\t\t\tSHP\tPounds\n\t\t\tSIT\tTolars\n\t\t\tSKK\tKoruny\n\t\t\tSLL\tLeones\n\t\t\tSOS\tShillings\n\t\t\tSPL\tLuigini\n\t\t\tSRG\tGuilders\n\t\t\tSTD\tDobras\n\t\t\tSVC\tColones\n\t\t\tSYP\tPounds\n\t\t\tSZL\tEmalangeni\n\t\t\tTHB\tBaht\n\t\t\tTJR\tRubles\n\t\t\tTMM\tManats\n\t\t\tTND\tDinars\n\t\t\tTOP\tPa'anga\n\t\t\tTRL\tLiras\n\t\t\tTTD\tDollars\n\t\t\tTVD\tTuvalu Dollars\n\t\t\tTWD\tNew Dollars\n\t\t\tTZS\tShillings\n\t\t\tUAH\tHryvnia\n\t\t\tUGX\tShillings\n\t\t\tUSD\tDollars\n\t\t\tUYU\tPesos\n\t\t\tUZS\tSums\n\t\t\tVAL\tLire\n\t\t\tVEB\tBolivares\n\t\t\tVND\tDong\n\t\t\tVUV\tVatu\n\t\t\tWST\tTala\n\t\t\tXAF\tFrancs\n\t\t\tXAG\tOunces\n\t\t\tXAU\tOunces\n\t\t\tXCD\tDollars\n\t\t\tXDR\tSpecial Drawing Rights\n\t\t\tXPD\tOunces\n\t\t\tXPF\tFrancs\n\t\t\tXPT\tOunces\n\t\t\tYER\tRials\n\t\t\tYUM\tNew Dinars\n\t\t\tZAR\tRand\n\t\t\tZMK\tKwacha\n\t\t\tZWD\tZimbabwe Dollars\n\n\t\t*/\n\n\t\treturn getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-units');\n\t}\n\n\n\tpublic function LookupCurrencyCountry($currencyid) {\n\n\t\t$begin = __LINE__;\n\n\t\t/** This is not a comment!\n\n\t\t\tAED\tUnited Arab Emirates\n\t\t\tAFA\tAfghanistan\n\t\t\tALL\tAlbania\n\t\t\tAMD\tArmenia\n\t\t\tANG\tNetherlands Antilles\n\t\t\tAOA\tAngola\n\t\t\tARS\tArgentina\n\t\t\tATS\tAustria\n\t\t\tAUD\tAustralia\n\t\t\tAWG\tAruba\n\t\t\tAZM\tAzerbaijan\n\t\t\tBAM\tBosnia and Herzegovina\n\t\t\tBBD\tBarbados\n\t\t\tBDT\tBangladesh\n\t\t\tBEF\tBelgium\n\t\t\tBGL\tBulgaria\n\t\t\tBHD\tBahrain\n\t\t\tBIF\tBurundi\n\t\t\tBMD\tBermuda\n\t\t\tBND\tBrunei Darussalam\n\t\t\tBOB\tBolivia\n\t\t\tBRL\tBrazil\n\t\t\tBSD\tBahamas\n\t\t\tBTN\tBhutan\n\t\t\tBWP\tBotswana\n\t\t\tBYR\tBelarus\n\t\t\tBZD\tBelize\n\t\t\tCAD\tCanada\n\t\t\tCDF\tCongo/Kinshasa\n\t\t\tCHF\tSwitzerland\n\t\t\tCLP\tChile\n\t\t\tCNY\tChina\n\t\t\tCOP\tColombia\n\t\t\tCRC\tCosta Rica\n\t\t\tCUP\tCuba\n\t\t\tCVE\tCape Verde\n\t\t\tCYP\tCyprus\n\t\t\tCZK\tCzech Republic\n\t\t\tDEM\tGermany\n\t\t\tDJF\tDjibouti\n\t\t\tDKK\tDenmark\n\t\t\tDOP\tDominican Republic\n\t\t\tDZD\tAlgeria\n\t\t\tEEK\tEstonia\n\t\t\tEGP\tEgypt\n\t\t\tERN\tEritrea\n\t\t\tESP\tSpain\n\t\t\tETB\tEthiopia\n\t\t\tEUR\tEuro Member Countries\n\t\t\tFIM\tFinland\n\t\t\tFJD\tFiji\n\t\t\tFKP\tFalkland Islands (Malvinas)\n\t\t\tFRF\tFrance\n\t\t\tGBP\tUnited Kingdom\n\t\t\tGEL\tGeorgia\n\t\t\tGGP\tGuernsey\n\t\t\tGHC\tGhana\n\t\t\tGIP\tGibraltar\n\t\t\tGMD\tGambia\n\t\t\tGNF\tGuinea\n\t\t\tGRD\tGreece\n\t\t\tGTQ\tGuatemala\n\t\t\tGYD\tGuyana\n\t\t\tHKD\tHong Kong\n\t\t\tHNL\tHonduras\n\t\t\tHRK\tCroatia\n\t\t\tHTG\tHaiti\n\t\t\tHUF\tHungary\n\t\t\tIDR\tIndonesia\n\t\t\tIEP\tIreland (Eire)\n\t\t\tILS\tIsrael\n\t\t\tIMP\tIsle of Man\n\t\t\tINR\tIndia\n\t\t\tIQD\tIraq\n\t\t\tIRR\tIran\n\t\t\tISK\tIceland\n\t\t\tITL\tItaly\n\t\t\tJEP\tJersey\n\t\t\tJMD\tJamaica\n\t\t\tJOD\tJordan\n\t\t\tJPY\tJapan\n\t\t\tKES\tKenya\n\t\t\tKGS\tKyrgyzstan\n\t\t\tKHR\tCambodia\n\t\t\tKMF\tComoros\n\t\t\tKPW\tKorea\n\t\t\tKWD\tKuwait\n\t\t\tKYD\tCayman Islands\n\t\t\tKZT\tKazakstan\n\t\t\tLAK\tLaos\n\t\t\tLBP\tLebanon\n\t\t\tLKR\tSri Lanka\n\t\t\tLRD\tLiberia\n\t\t\tLSL\tLesotho\n\t\t\tLTL\tLithuania\n\t\t\tLUF\tLuxembourg\n\t\t\tLVL\tLatvia\n\t\t\tLYD\tLibya\n\t\t\tMAD\tMorocco\n\t\t\tMDL\tMoldova\n\t\t\tMGF\tMadagascar\n\t\t\tMKD\tMacedonia\n\t\t\tMMK\tMyanmar (Burma)\n\t\t\tMNT\tMongolia\n\t\t\tMOP\tMacau\n\t\t\tMRO\tMauritania\n\t\t\tMTL\tMalta\n\t\t\tMUR\tMauritius\n\t\t\tMVR\tMaldives (Maldive Islands)\n\t\t\tMWK\tMalawi\n\t\t\tMXN\tMexico\n\t\t\tMYR\tMalaysia\n\t\t\tMZM\tMozambique\n\t\t\tNAD\tNamibia\n\t\t\tNGN\tNigeria\n\t\t\tNIO\tNicaragua\n\t\t\tNLG\tNetherlands (Holland)\n\t\t\tNOK\tNorway\n\t\t\tNPR\tNepal\n\t\t\tNZD\tNew Zealand\n\t\t\tOMR\tOman\n\t\t\tPAB\tPanama\n\t\t\tPEN\tPeru\n\t\t\tPGK\tPapua New Guinea\n\t\t\tPHP\tPhilippines\n\t\t\tPKR\tPakistan\n\t\t\tPLN\tPoland\n\t\t\tPTE\tPortugal\n\t\t\tPYG\tParaguay\n\t\t\tQAR\tQatar\n\t\t\tROL\tRomania\n\t\t\tRUR\tRussia\n\t\t\tRWF\tRwanda\n\t\t\tSAR\tSaudi Arabia\n\t\t\tSBD\tSolomon Islands\n\t\t\tSCR\tSeychelles\n\t\t\tSDD\tSudan\n\t\t\tSEK\tSweden\n\t\t\tSGD\tSingapore\n\t\t\tSHP\tSaint Helena\n\t\t\tSIT\tSlovenia\n\t\t\tSKK\tSlovakia\n\t\t\tSLL\tSierra Leone\n\t\t\tSOS\tSomalia\n\t\t\tSPL\tSeborga\n\t\t\tSRG\tSuriname\n\t\t\tSTD\tSão Tome and Principe\n\t\t\tSVC\tEl Salvador\n\t\t\tSYP\tSyria\n\t\t\tSZL\tSwaziland\n\t\t\tTHB\tThailand\n\t\t\tTJR\tTajikistan\n\t\t\tTMM\tTurkmenistan\n\t\t\tTND\tTunisia\n\t\t\tTOP\tTonga\n\t\t\tTRL\tTurkey\n\t\t\tTTD\tTrinidad and Tobago\n\t\t\tTVD\tTuvalu\n\t\t\tTWD\tTaiwan\n\t\t\tTZS\tTanzania\n\t\t\tUAH\tUkraine\n\t\t\tUGX\tUganda\n\t\t\tUSD\tUnited States of America\n\t\t\tUYU\tUruguay\n\t\t\tUZS\tUzbekistan\n\t\t\tVAL\tVatican City\n\t\t\tVEB\tVenezuela\n\t\t\tVND\tViet Nam\n\t\t\tVUV\tVanuatu\n\t\t\tWST\tSamoa\n\t\t\tXAF\tCommunauté Financière Africaine\n\t\t\tXAG\tSilver\n\t\t\tXAU\tGold\n\t\t\tXCD\tEast Caribbean\n\t\t\tXDR\tInternational Monetary Fund\n\t\t\tXPD\tPalladium\n\t\t\tXPF\tComptoirs Français du Pacifique\n\t\t\tXPT\tPlatinum\n\t\t\tYER\tYemen\n\t\t\tYUM\tYugoslavia\n\t\t\tZAR\tSouth Africa\n\t\t\tZMK\tZambia\n\t\t\tZWD\tZimbabwe\n\n\t\t*/\n\n\t\treturn getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-country');\n\t}\n\n\n\n\tpublic static function LanguageLookup($languagecode, $casesensitive=false) {\n\n\t\tif (!$casesensitive) {\n\t\t\t$languagecode = strtolower($languagecode);\n\t\t}\n\n\t\t// http://www.id3.org/id3v2.4.0-structure.txt\n\t\t// [4.   ID3v2 frame overview]\n\t\t// The three byte language field, present in several frames, is used to\n\t\t// describe the language of the frame's content, according to ISO-639-2\n\t\t// [ISO-639-2]. The language should be represented in lower case. If the\n\t\t// language is not known the string \"XXX\" should be used.\n\n\n\t\t// ISO 639-2 - http://www.id3.org/iso639-2.html\n\n\t\t$begin = __LINE__;\n\n\t\t/** This is not a comment!\n\n\t\t\tXXX\tunknown\n\t\t\txxx\tunknown\n\t\t\taar\tAfar\n\t\t\tabk\tAbkhazian\n\t\t\tace\tAchinese\n\t\t\tach\tAcoli\n\t\t\tada\tAdangme\n\t\t\tafa\tAfro-Asiatic (Other)\n\t\t\tafh\tAfrihili\n\t\t\tafr\tAfrikaans\n\t\t\taka\tAkan\n\t\t\takk\tAkkadian\n\t\t\talb\tAlbanian\n\t\t\tale\tAleut\n\t\t\talg\tAlgonquian Languages\n\t\t\tamh\tAmharic\n\t\t\tang\tEnglish, Old (ca. 450-1100)\n\t\t\tapa\tApache Languages\n\t\t\tara\tArabic\n\t\t\tarc\tAramaic\n\t\t\tarm\tArmenian\n\t\t\tarn\tAraucanian\n\t\t\tarp\tArapaho\n\t\t\tart\tArtificial (Other)\n\t\t\tarw\tArawak\n\t\t\tasm\tAssamese\n\t\t\tath\tAthapascan Languages\n\t\t\tava\tAvaric\n\t\t\tave\tAvestan\n\t\t\tawa\tAwadhi\n\t\t\taym\tAymara\n\t\t\taze\tAzerbaijani\n\t\t\tbad\tBanda\n\t\t\tbai\tBamileke Languages\n\t\t\tbak\tBashkir\n\t\t\tbal\tBaluchi\n\t\t\tbam\tBambara\n\t\t\tban\tBalinese\n\t\t\tbaq\tBasque\n\t\t\tbas\tBasa\n\t\t\tbat\tBaltic (Other)\n\t\t\tbej\tBeja\n\t\t\tbel\tByelorussian\n\t\t\tbem\tBemba\n\t\t\tben\tBengali\n\t\t\tber\tBerber (Other)\n\t\t\tbho\tBhojpuri\n\t\t\tbih\tBihari\n\t\t\tbik\tBikol\n\t\t\tbin\tBini\n\t\t\tbis\tBislama\n\t\t\tbla\tSiksika\n\t\t\tbnt\tBantu (Other)\n\t\t\tbod\tTibetan\n\t\t\tbra\tBraj\n\t\t\tbre\tBreton\n\t\t\tbua\tBuriat\n\t\t\tbug\tBuginese\n\t\t\tbul\tBulgarian\n\t\t\tbur\tBurmese\n\t\t\tcad\tCaddo\n\t\t\tcai\tCentral American Indian (Other)\n\t\t\tcar\tCarib\n\t\t\tcat\tCatalan\n\t\t\tcau\tCaucasian (Other)\n\t\t\tceb\tCebuano\n\t\t\tcel\tCeltic (Other)\n\t\t\tces\tCzech\n\t\t\tcha\tChamorro\n\t\t\tchb\tChibcha\n\t\t\tche\tChechen\n\t\t\tchg\tChagatai\n\t\t\tchi\tChinese\n\t\t\tchm\tMari\n\t\t\tchn\tChinook jargon\n\t\t\tcho\tChoctaw\n\t\t\tchr\tCherokee\n\t\t\tchu\tChurch Slavic\n\t\t\tchv\tChuvash\n\t\t\tchy\tCheyenne\n\t\t\tcop\tCoptic\n\t\t\tcor\tCornish\n\t\t\tcos\tCorsican\n\t\t\tcpe\tCreoles and Pidgins, English-based (Other)\n\t\t\tcpf\tCreoles and Pidgins, French-based (Other)\n\t\t\tcpp\tCreoles and Pidgins, Portuguese-based (Other)\n\t\t\tcre\tCree\n\t\t\tcrp\tCreoles and Pidgins (Other)\n\t\t\tcus\tCushitic (Other)\n\t\t\tcym\tWelsh\n\t\t\tcze\tCzech\n\t\t\tdak\tDakota\n\t\t\tdan\tDanish\n\t\t\tdel\tDelaware\n\t\t\tdeu\tGerman\n\t\t\tdin\tDinka\n\t\t\tdiv\tDivehi\n\t\t\tdoi\tDogri\n\t\t\tdra\tDravidian (Other)\n\t\t\tdua\tDuala\n\t\t\tdum\tDutch, Middle (ca. 1050-1350)\n\t\t\tdut\tDutch\n\t\t\tdyu\tDyula\n\t\t\tdzo\tDzongkha\n\t\t\tefi\tEfik\n\t\t\tegy\tEgyptian (Ancient)\n\t\t\teka\tEkajuk\n\t\t\tell\tGreek, Modern (1453-)\n\t\t\telx\tElamite\n\t\t\teng\tEnglish\n\t\t\tenm\tEnglish, Middle (ca. 1100-1500)\n\t\t\tepo\tEsperanto\n\t\t\tesk\tEskimo (Other)\n\t\t\tesl\tSpanish\n\t\t\test\tEstonian\n\t\t\teus\tBasque\n\t\t\tewe\tEwe\n\t\t\tewo\tEwondo\n\t\t\tfan\tFang\n\t\t\tfao\tFaroese\n\t\t\tfas\tPersian\n\t\t\tfat\tFanti\n\t\t\tfij\tFijian\n\t\t\tfin\tFinnish\n\t\t\tfiu\tFinno-Ugrian (Other)\n\t\t\tfon\tFon\n\t\t\tfra\tFrench\n\t\t\tfre\tFrench\n\t\t\tfrm\tFrench, Middle (ca. 1400-1600)\n\t\t\tfro\tFrench, Old (842- ca. 1400)\n\t\t\tfry\tFrisian\n\t\t\tful\tFulah\n\t\t\tgaa\tGa\n\t\t\tgae\tGaelic (Scots)\n\t\t\tgai\tIrish\n\t\t\tgay\tGayo\n\t\t\tgdh\tGaelic (Scots)\n\t\t\tgem\tGermanic (Other)\n\t\t\tgeo\tGeorgian\n\t\t\tger\tGerman\n\t\t\tgez\tGeez\n\t\t\tgil\tGilbertese\n\t\t\tglg\tGallegan\n\t\t\tgmh\tGerman, Middle High (ca. 1050-1500)\n\t\t\tgoh\tGerman, Old High (ca. 750-1050)\n\t\t\tgon\tGondi\n\t\t\tgot\tGothic\n\t\t\tgrb\tGrebo\n\t\t\tgrc\tGreek, Ancient (to 1453)\n\t\t\tgre\tGreek, Modern (1453-)\n\t\t\tgrn\tGuarani\n\t\t\tguj\tGujarati\n\t\t\thai\tHaida\n\t\t\thau\tHausa\n\t\t\thaw\tHawaiian\n\t\t\theb\tHebrew\n\t\t\ther\tHerero\n\t\t\thil\tHiligaynon\n\t\t\thim\tHimachali\n\t\t\thin\tHindi\n\t\t\thmo\tHiri Motu\n\t\t\thun\tHungarian\n\t\t\thup\tHupa\n\t\t\thye\tArmenian\n\t\t\tiba\tIban\n\t\t\tibo\tIgbo\n\t\t\tice\tIcelandic\n\t\t\tijo\tIjo\n\t\t\tiku\tInuktitut\n\t\t\tilo\tIloko\n\t\t\tina\tInterlingua (International Auxiliary language Association)\n\t\t\tinc\tIndic (Other)\n\t\t\tind\tIndonesian\n\t\t\tine\tIndo-European (Other)\n\t\t\tine\tInterlingue\n\t\t\tipk\tInupiak\n\t\t\tira\tIranian (Other)\n\t\t\tiri\tIrish\n\t\t\tiro\tIroquoian uages\n\t\t\tisl\tIcelandic\n\t\t\tita\tItalian\n\t\t\tjav\tJavanese\n\t\t\tjaw\tJavanese\n\t\t\tjpn\tJapanese\n\t\t\tjpr\tJudeo-Persian\n\t\t\tjrb\tJudeo-Arabic\n\t\t\tkaa\tKara-Kalpak\n\t\t\tkab\tKabyle\n\t\t\tkac\tKachin\n\t\t\tkal\tGreenlandic\n\t\t\tkam\tKamba\n\t\t\tkan\tKannada\n\t\t\tkar\tKaren\n\t\t\tkas\tKashmiri\n\t\t\tkat\tGeorgian\n\t\t\tkau\tKanuri\n\t\t\tkaw\tKawi\n\t\t\tkaz\tKazakh\n\t\t\tkha\tKhasi\n\t\t\tkhi\tKhoisan (Other)\n\t\t\tkhm\tKhmer\n\t\t\tkho\tKhotanese\n\t\t\tkik\tKikuyu\n\t\t\tkin\tKinyarwanda\n\t\t\tkir\tKirghiz\n\t\t\tkok\tKonkani\n\t\t\tkom\tKomi\n\t\t\tkon\tKongo\n\t\t\tkor\tKorean\n\t\t\tkpe\tKpelle\n\t\t\tkro\tKru\n\t\t\tkru\tKurukh\n\t\t\tkua\tKuanyama\n\t\t\tkum\tKumyk\n\t\t\tkur\tKurdish\n\t\t\tkus\tKusaie\n\t\t\tkut\tKutenai\n\t\t\tlad\tLadino\n\t\t\tlah\tLahnda\n\t\t\tlam\tLamba\n\t\t\tlao\tLao\n\t\t\tlat\tLatin\n\t\t\tlav\tLatvian\n\t\t\tlez\tLezghian\n\t\t\tlin\tLingala\n\t\t\tlit\tLithuanian\n\t\t\tlol\tMongo\n\t\t\tloz\tLozi\n\t\t\tltz\tLetzeburgesch\n\t\t\tlub\tLuba-Katanga\n\t\t\tlug\tGanda\n\t\t\tlui\tLuiseno\n\t\t\tlun\tLunda\n\t\t\tluo\tLuo (Kenya and Tanzania)\n\t\t\tmac\tMacedonian\n\t\t\tmad\tMadurese\n\t\t\tmag\tMagahi\n\t\t\tmah\tMarshall\n\t\t\tmai\tMaithili\n\t\t\tmak\tMacedonian\n\t\t\tmak\tMakasar\n\t\t\tmal\tMalayalam\n\t\t\tman\tMandingo\n\t\t\tmao\tMaori\n\t\t\tmap\tAustronesian (Other)\n\t\t\tmar\tMarathi\n\t\t\tmas\tMasai\n\t\t\tmax\tManx\n\t\t\tmay\tMalay\n\t\t\tmen\tMende\n\t\t\tmga\tIrish, Middle (900 - 1200)\n\t\t\tmic\tMicmac\n\t\t\tmin\tMinangkabau\n\t\t\tmis\tMiscellaneous (Other)\n\t\t\tmkh\tMon-Kmer (Other)\n\t\t\tmlg\tMalagasy\n\t\t\tmlt\tMaltese\n\t\t\tmni\tManipuri\n\t\t\tmno\tManobo Languages\n\t\t\tmoh\tMohawk\n\t\t\tmol\tMoldavian\n\t\t\tmon\tMongolian\n\t\t\tmos\tMossi\n\t\t\tmri\tMaori\n\t\t\tmsa\tMalay\n\t\t\tmul\tMultiple Languages\n\t\t\tmun\tMunda Languages\n\t\t\tmus\tCreek\n\t\t\tmwr\tMarwari\n\t\t\tmya\tBurmese\n\t\t\tmyn\tMayan Languages\n\t\t\tnah\tAztec\n\t\t\tnai\tNorth American Indian (Other)\n\t\t\tnau\tNauru\n\t\t\tnav\tNavajo\n\t\t\tnbl\tNdebele, South\n\t\t\tnde\tNdebele, North\n\t\t\tndo\tNdongo\n\t\t\tnep\tNepali\n\t\t\tnew\tNewari\n\t\t\tnic\tNiger-Kordofanian (Other)\n\t\t\tniu\tNiuean\n\t\t\tnla\tDutch\n\t\t\tnno\tNorwegian (Nynorsk)\n\t\t\tnon\tNorse, Old\n\t\t\tnor\tNorwegian\n\t\t\tnso\tSotho, Northern\n\t\t\tnub\tNubian Languages\n\t\t\tnya\tNyanja\n\t\t\tnym\tNyamwezi\n\t\t\tnyn\tNyankole\n\t\t\tnyo\tNyoro\n\t\t\tnzi\tNzima\n\t\t\toci\tLangue d'Oc (post 1500)\n\t\t\toji\tOjibwa\n\t\t\tori\tOriya\n\t\t\torm\tOromo\n\t\t\tosa\tOsage\n\t\t\toss\tOssetic\n\t\t\tota\tTurkish, Ottoman (1500 - 1928)\n\t\t\toto\tOtomian Languages\n\t\t\tpaa\tPapuan-Australian (Other)\n\t\t\tpag\tPangasinan\n\t\t\tpal\tPahlavi\n\t\t\tpam\tPampanga\n\t\t\tpan\tPanjabi\n\t\t\tpap\tPapiamento\n\t\t\tpau\tPalauan\n\t\t\tpeo\tPersian, Old (ca 600 - 400 B.C.)\n\t\t\tper\tPersian\n\t\t\tphn\tPhoenician\n\t\t\tpli\tPali\n\t\t\tpol\tPolish\n\t\t\tpon\tPonape\n\t\t\tpor\tPortuguese\n\t\t\tpra\tPrakrit uages\n\t\t\tpro\tProvencal, Old (to 1500)\n\t\t\tpus\tPushto\n\t\t\tque\tQuechua\n\t\t\traj\tRajasthani\n\t\t\trar\tRarotongan\n\t\t\troa\tRomance (Other)\n\t\t\troh\tRhaeto-Romance\n\t\t\trom\tRomany\n\t\t\tron\tRomanian\n\t\t\trum\tRomanian\n\t\t\trun\tRundi\n\t\t\trus\tRussian\n\t\t\tsad\tSandawe\n\t\t\tsag\tSango\n\t\t\tsah\tYakut\n\t\t\tsai\tSouth American Indian (Other)\n\t\t\tsal\tSalishan Languages\n\t\t\tsam\tSamaritan Aramaic\n\t\t\tsan\tSanskrit\n\t\t\tsco\tScots\n\t\t\tscr\tSerbo-Croatian\n\t\t\tsel\tSelkup\n\t\t\tsem\tSemitic (Other)\n\t\t\tsga\tIrish, Old (to 900)\n\t\t\tshn\tShan\n\t\t\tsid\tSidamo\n\t\t\tsin\tSinghalese\n\t\t\tsio\tSiouan Languages\n\t\t\tsit\tSino-Tibetan (Other)\n\t\t\tsla\tSlavic (Other)\n\t\t\tslk\tSlovak\n\t\t\tslo\tSlovak\n\t\t\tslv\tSlovenian\n\t\t\tsmi\tSami Languages\n\t\t\tsmo\tSamoan\n\t\t\tsna\tShona\n\t\t\tsnd\tSindhi\n\t\t\tsog\tSogdian\n\t\t\tsom\tSomali\n\t\t\tson\tSonghai\n\t\t\tsot\tSotho, Southern\n\t\t\tspa\tSpanish\n\t\t\tsqi\tAlbanian\n\t\t\tsrd\tSardinian\n\t\t\tsrr\tSerer\n\t\t\tssa\tNilo-Saharan (Other)\n\t\t\tssw\tSiswant\n\t\t\tssw\tSwazi\n\t\t\tsuk\tSukuma\n\t\t\tsun\tSudanese\n\t\t\tsus\tSusu\n\t\t\tsux\tSumerian\n\t\t\tsve\tSwedish\n\t\t\tswa\tSwahili\n\t\t\tswe\tSwedish\n\t\t\tsyr\tSyriac\n\t\t\ttah\tTahitian\n\t\t\ttam\tTamil\n\t\t\ttat\tTatar\n\t\t\ttel\tTelugu\n\t\t\ttem\tTimne\n\t\t\tter\tTereno\n\t\t\ttgk\tTajik\n\t\t\ttgl\tTagalog\n\t\t\ttha\tThai\n\t\t\ttib\tTibetan\n\t\t\ttig\tTigre\n\t\t\ttir\tTigrinya\n\t\t\ttiv\tTivi\n\t\t\ttli\tTlingit\n\t\t\ttmh\tTamashek\n\t\t\ttog\tTonga (Nyasa)\n\t\t\tton\tTonga (Tonga Islands)\n\t\t\ttru\tTruk\n\t\t\ttsi\tTsimshian\n\t\t\ttsn\tTswana\n\t\t\ttso\tTsonga\n\t\t\ttuk\tTurkmen\n\t\t\ttum\tTumbuka\n\t\t\ttur\tTurkish\n\t\t\ttut\tAltaic (Other)\n\t\t\ttwi\tTwi\n\t\t\ttyv\tTuvinian\n\t\t\tuga\tUgaritic\n\t\t\tuig\tUighur\n\t\t\tukr\tUkrainian\n\t\t\tumb\tUmbundu\n\t\t\tund\tUndetermined\n\t\t\turd\tUrdu\n\t\t\tuzb\tUzbek\n\t\t\tvai\tVai\n\t\t\tven\tVenda\n\t\t\tvie\tVietnamese\n\t\t\tvol\tVolapük\n\t\t\tvot\tVotic\n\t\t\twak\tWakashan Languages\n\t\t\twal\tWalamo\n\t\t\twar\tWaray\n\t\t\twas\tWasho\n\t\t\twel\tWelsh\n\t\t\twen\tSorbian Languages\n\t\t\twol\tWolof\n\t\t\txho\tXhosa\n\t\t\tyao\tYao\n\t\t\tyap\tYap\n\t\t\tyid\tYiddish\n\t\t\tyor\tYoruba\n\t\t\tzap\tZapotec\n\t\t\tzen\tZenaga\n\t\t\tzha\tZhuang\n\t\t\tzho\tChinese\n\t\t\tzul\tZulu\n\t\t\tzun\tZuni\n\n\t\t*/\n\n\t\treturn getid3_lib::EmbeddedLookup($languagecode, $begin, __LINE__, __FILE__, 'id3v2-languagecode');\n\t}\n\n\n\tpublic static function ETCOEventLookup($index) {\n\t\tif (($index >= 0x17) && ($index <= 0xDF)) {\n\t\t\treturn 'reserved for future use';\n\t\t}\n\t\tif (($index >= 0xE0) && ($index <= 0xEF)) {\n\t\t\treturn 'not predefined synch 0-F';\n\t\t}\n\t\tif (($index >= 0xF0) && ($index <= 0xFC)) {\n\t\t\treturn 'reserved for future use';\n\t\t}\n\n\t\tstatic $EventLookup = array(\n\t\t\t0x00 => 'padding (has no meaning)',\n\t\t\t0x01 => 'end of initial silence',\n\t\t\t0x02 => 'intro start',\n\t\t\t0x03 => 'main part start',\n\t\t\t0x04 => 'outro start',\n\t\t\t0x05 => 'outro end',\n\t\t\t0x06 => 'verse start',\n\t\t\t0x07 => 'refrain start',\n\t\t\t0x08 => 'interlude start',\n\t\t\t0x09 => 'theme start',\n\t\t\t0x0A => 'variation start',\n\t\t\t0x0B => 'key change',\n\t\t\t0x0C => 'time change',\n\t\t\t0x0D => 'momentary unwanted noise (Snap, Crackle & Pop)',\n\t\t\t0x0E => 'sustained noise',\n\t\t\t0x0F => 'sustained noise end',\n\t\t\t0x10 => 'intro end',\n\t\t\t0x11 => 'main part end',\n\t\t\t0x12 => 'verse end',\n\t\t\t0x13 => 'refrain end',\n\t\t\t0x14 => 'theme end',\n\t\t\t0x15 => 'profanity',\n\t\t\t0x16 => 'profanity end',\n\t\t\t0xFD => 'audio end (start of silence)',\n\t\t\t0xFE => 'audio file ends',\n\t\t\t0xFF => 'one more byte of events follows'\n\t\t);\n\n\t\treturn (isset($EventLookup[$index]) ? $EventLookup[$index] : '');\n\t}\n\n\tpublic static function SYTLContentTypeLookup($index) {\n\t\tstatic $SYTLContentTypeLookup = array(\n\t\t\t0x00 => 'other',\n\t\t\t0x01 => 'lyrics',\n\t\t\t0x02 => 'text transcription',\n\t\t\t0x03 => 'movement/part name', // (e.g. 'Adagio')\n\t\t\t0x04 => 'events',             // (e.g. 'Don Quijote enters the stage')\n\t\t\t0x05 => 'chord',              // (e.g. 'Bb F Fsus')\n\t\t\t0x06 => 'trivia/\\'pop up\\' information',\n\t\t\t0x07 => 'URLs to webpages',\n\t\t\t0x08 => 'URLs to images'\n\t\t);\n\n\t\treturn (isset($SYTLContentTypeLookup[$index]) ? $SYTLContentTypeLookup[$index] : '');\n\t}\n\n\tpublic static function APICPictureTypeLookup($index, $returnarray=false) {\n\t\tstatic $APICPictureTypeLookup = array(\n\t\t\t0x00 => 'Other',\n\t\t\t0x01 => '32x32 pixels \\'file icon\\' (PNG only)',\n\t\t\t0x02 => 'Other file icon',\n\t\t\t0x03 => 'Cover (front)',\n\t\t\t0x04 => 'Cover (back)',\n\t\t\t0x05 => 'Leaflet page',\n\t\t\t0x06 => 'Media (e.g. label side of CD)',\n\t\t\t0x07 => 'Lead artist/lead performer/soloist',\n\t\t\t0x08 => 'Artist/performer',\n\t\t\t0x09 => 'Conductor',\n\t\t\t0x0A => 'Band/Orchestra',\n\t\t\t0x0B => 'Composer',\n\t\t\t0x0C => 'Lyricist/text writer',\n\t\t\t0x0D => 'Recording Location',\n\t\t\t0x0E => 'During recording',\n\t\t\t0x0F => 'During performance',\n\t\t\t0x10 => 'Movie/video screen capture',\n\t\t\t0x11 => 'A bright coloured fish',\n\t\t\t0x12 => 'Illustration',\n\t\t\t0x13 => 'Band/artist logotype',\n\t\t\t0x14 => 'Publisher/Studio logotype'\n\t\t);\n\t\tif ($returnarray) {\n\t\t\treturn $APICPictureTypeLookup;\n\t\t}\n\t\treturn (isset($APICPictureTypeLookup[$index]) ? $APICPictureTypeLookup[$index] : '');\n\t}\n\n\tpublic static function COMRReceivedAsLookup($index) {\n\t\tstatic $COMRReceivedAsLookup = array(\n\t\t\t0x00 => 'Other',\n\t\t\t0x01 => 'Standard CD album with other songs',\n\t\t\t0x02 => 'Compressed audio on CD',\n\t\t\t0x03 => 'File over the Internet',\n\t\t\t0x04 => 'Stream over the Internet',\n\t\t\t0x05 => 'As note sheets',\n\t\t\t0x06 => 'As note sheets in a book with other sheets',\n\t\t\t0x07 => 'Music on other media',\n\t\t\t0x08 => 'Non-musical merchandise'\n\t\t);\n\n\t\treturn (isset($COMRReceivedAsLookup[$index]) ? $COMRReceivedAsLookup[$index] : '');\n\t}\n\n\tpublic static function RVA2ChannelTypeLookup($index) {\n\t\tstatic $RVA2ChannelTypeLookup = array(\n\t\t\t0x00 => 'Other',\n\t\t\t0x01 => 'Master volume',\n\t\t\t0x02 => 'Front right',\n\t\t\t0x03 => 'Front left',\n\t\t\t0x04 => 'Back right',\n\t\t\t0x05 => 'Back left',\n\t\t\t0x06 => 'Front centre',\n\t\t\t0x07 => 'Back centre',\n\t\t\t0x08 => 'Subwoofer'\n\t\t);\n\n\t\treturn (isset($RVA2ChannelTypeLookup[$index]) ? $RVA2ChannelTypeLookup[$index] : '');\n\t}\n\n\tpublic static function FrameNameLongLookup($framename) {\n\n\t\t$begin = __LINE__;\n\n\t\t/** This is not a comment!\n\n\t\t\tAENC\tAudio encryption\n\t\t\tAPIC\tAttached picture\n\t\t\tASPI\tAudio seek point index\n\t\t\tBUF\tRecommended buffer size\n\t\t\tCNT\tPlay counter\n\t\t\tCOM\tComments\n\t\t\tCOMM\tComments\n\t\t\tCOMR\tCommercial frame\n\t\t\tCRA\tAudio encryption\n\t\t\tCRM\tEncrypted meta frame\n\t\t\tENCR\tEncryption method registration\n\t\t\tEQU\tEqualisation\n\t\t\tEQU2\tEqualisation (2)\n\t\t\tEQUA\tEqualisation\n\t\t\tETC\tEvent timing codes\n\t\t\tETCO\tEvent timing codes\n\t\t\tGEO\tGeneral encapsulated object\n\t\t\tGEOB\tGeneral encapsulated object\n\t\t\tGRID\tGroup identification registration\n\t\t\tIPL\tInvolved people list\n\t\t\tIPLS\tInvolved people list\n\t\t\tLINK\tLinked information\n\t\t\tLNK\tLinked information\n\t\t\tMCDI\tMusic CD identifier\n\t\t\tMCI\tMusic CD Identifier\n\t\t\tMLL\tMPEG location lookup table\n\t\t\tMLLT\tMPEG location lookup table\n\t\t\tOWNE\tOwnership frame\n\t\t\tPCNT\tPlay counter\n\t\t\tPIC\tAttached picture\n\t\t\tPOP\tPopularimeter\n\t\t\tPOPM\tPopularimeter\n\t\t\tPOSS\tPosition synchronisation frame\n\t\t\tPRIV\tPrivate frame\n\t\t\tRBUF\tRecommended buffer size\n\t\t\tREV\tReverb\n\t\t\tRVA\tRelative volume adjustment\n\t\t\tRVA2\tRelative volume adjustment (2)\n\t\t\tRVAD\tRelative volume adjustment\n\t\t\tRVRB\tReverb\n\t\t\tSEEK\tSeek frame\n\t\t\tSIGN\tSignature frame\n\t\t\tSLT\tSynchronised lyric/text\n\t\t\tSTC\tSynced tempo codes\n\t\t\tSYLT\tSynchronised lyric/text\n\t\t\tSYTC\tSynchronised tempo codes\n\t\t\tTAL\tAlbum/Movie/Show title\n\t\t\tTALB\tAlbum/Movie/Show title\n\t\t\tTBP\tBPM (Beats Per Minute)\n\t\t\tTBPM\tBPM (beats per minute)\n\t\t\tTCM\tComposer\n\t\t\tTCMP\tPart of a compilation\n\t\t\tTCO\tContent type\n\t\t\tTCOM\tComposer\n\t\t\tTCON\tContent type\n\t\t\tTCOP\tCopyright message\n\t\t\tTCP\tPart of a compilation\n\t\t\tTCR\tCopyright message\n\t\t\tTDA\tDate\n\t\t\tTDAT\tDate\n\t\t\tTDEN\tEncoding time\n\t\t\tTDLY\tPlaylist delay\n\t\t\tTDOR\tOriginal release time\n\t\t\tTDRC\tRecording time\n\t\t\tTDRL\tRelease time\n\t\t\tTDTG\tTagging time\n\t\t\tTDY\tPlaylist delay\n\t\t\tTEN\tEncoded by\n\t\t\tTENC\tEncoded by\n\t\t\tTEXT\tLyricist/Text writer\n\t\t\tTFLT\tFile type\n\t\t\tTFT\tFile type\n\t\t\tTIM\tTime\n\t\t\tTIME\tTime\n\t\t\tTIPL\tInvolved people list\n\t\t\tTIT1\tContent group description\n\t\t\tTIT2\tTitle/songname/content description\n\t\t\tTIT3\tSubtitle/Description refinement\n\t\t\tTKE\tInitial key\n\t\t\tTKEY\tInitial key\n\t\t\tTLA\tLanguage(s)\n\t\t\tTLAN\tLanguage(s)\n\t\t\tTLE\tLength\n\t\t\tTLEN\tLength\n\t\t\tTMCL\tMusician credits list\n\t\t\tTMED\tMedia type\n\t\t\tTMOO\tMood\n\t\t\tTMT\tMedia type\n\t\t\tTOA\tOriginal artist(s)/performer(s)\n\t\t\tTOAL\tOriginal album/movie/show title\n\t\t\tTOF\tOriginal filename\n\t\t\tTOFN\tOriginal filename\n\t\t\tTOL\tOriginal Lyricist(s)/text writer(s)\n\t\t\tTOLY\tOriginal lyricist(s)/text writer(s)\n\t\t\tTOPE\tOriginal artist(s)/performer(s)\n\t\t\tTOR\tOriginal release year\n\t\t\tTORY\tOriginal release year\n\t\t\tTOT\tOriginal album/Movie/Show title\n\t\t\tTOWN\tFile owner/licensee\n\t\t\tTP1\tLead artist(s)/Lead performer(s)/Soloist(s)/Performing group\n\t\t\tTP2\tBand/Orchestra/Accompaniment\n\t\t\tTP3\tConductor/Performer refinement\n\t\t\tTP4\tInterpreted, remixed, or otherwise modified by\n\t\t\tTPA\tPart of a set\n\t\t\tTPB\tPublisher\n\t\t\tTPE1\tLead performer(s)/Soloist(s)\n\t\t\tTPE2\tBand/orchestra/accompaniment\n\t\t\tTPE3\tConductor/performer refinement\n\t\t\tTPE4\tInterpreted, remixed, or otherwise modified by\n\t\t\tTPOS\tPart of a set\n\t\t\tTPRO\tProduced notice\n\t\t\tTPUB\tPublisher\n\t\t\tTRC\tISRC (International Standard Recording Code)\n\t\t\tTRCK\tTrack number/Position in set\n\t\t\tTRD\tRecording dates\n\t\t\tTRDA\tRecording dates\n\t\t\tTRK\tTrack number/Position in set\n\t\t\tTRSN\tInternet radio station name\n\t\t\tTRSO\tInternet radio station owner\n\t\t\tTS2\tAlbum-Artist sort order\n\t\t\tTSA\tAlbum sort order\n\t\t\tTSC\tComposer sort order\n\t\t\tTSI\tSize\n\t\t\tTSIZ\tSize\n\t\t\tTSO2\tAlbum-Artist sort order\n\t\t\tTSOA\tAlbum sort order\n\t\t\tTSOC\tComposer sort order\n\t\t\tTSOP\tPerformer sort order\n\t\t\tTSOT\tTitle sort order\n\t\t\tTSP\tPerformer sort order\n\t\t\tTSRC\tISRC (international standard recording code)\n\t\t\tTSS\tSoftware/hardware and settings used for encoding\n\t\t\tTSSE\tSoftware/Hardware and settings used for encoding\n\t\t\tTSST\tSet subtitle\n\t\t\tTST\tTitle sort order\n\t\t\tTT1\tContent group description\n\t\t\tTT2\tTitle/Songname/Content description\n\t\t\tTT3\tSubtitle/Description refinement\n\t\t\tTXT\tLyricist/text writer\n\t\t\tTXX\tUser defined text information frame\n\t\t\tTXXX\tUser defined text information frame\n\t\t\tTYE\tYear\n\t\t\tTYER\tYear\n\t\t\tUFI\tUnique file identifier\n\t\t\tUFID\tUnique file identifier\n\t\t\tULT\tUnsychronised lyric/text transcription\n\t\t\tUSER\tTerms of use\n\t\t\tUSLT\tUnsynchronised lyric/text transcription\n\t\t\tWAF\tOfficial audio file webpage\n\t\t\tWAR\tOfficial artist/performer webpage\n\t\t\tWAS\tOfficial audio source webpage\n\t\t\tWCM\tCommercial information\n\t\t\tWCOM\tCommercial information\n\t\t\tWCOP\tCopyright/Legal information\n\t\t\tWCP\tCopyright/Legal information\n\t\t\tWOAF\tOfficial audio file webpage\n\t\t\tWOAR\tOfficial artist/performer webpage\n\t\t\tWOAS\tOfficial audio source webpage\n\t\t\tWORS\tOfficial Internet radio station homepage\n\t\t\tWPAY\tPayment\n\t\t\tWPB\tPublishers official webpage\n\t\t\tWPUB\tPublishers official webpage\n\t\t\tWXX\tUser defined URL link frame\n\t\t\tWXXX\tUser defined URL link frame\n\t\t\tTFEA\tFeatured Artist\n\t\t\tTSTU\tRecording Studio\n\t\t\trgad\tReplay Gain Adjustment\n\n\t\t*/\n\n\t\treturn getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_long');\n\n\t\t// Last three:\n\t\t// from Helium2 [www.helium2.com]\n\t\t// from http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html\n\t}\n\n\n\tpublic static function FrameNameShortLookup($framename) {\n\n\t\t$begin = __LINE__;\n\n\t\t/** This is not a comment!\n\n\t\t\tAENC\taudio_encryption\n\t\t\tAPIC\tattached_picture\n\t\t\tASPI\taudio_seek_point_index\n\t\t\tBUF\trecommended_buffer_size\n\t\t\tCNT\tplay_counter\n\t\t\tCOM\tcomment\n\t\t\tCOMM\tcomment\n\t\t\tCOMR\tcommercial_frame\n\t\t\tCRA\taudio_encryption\n\t\t\tCRM\tencrypted_meta_frame\n\t\t\tENCR\tencryption_method_registration\n\t\t\tEQU\tequalisation\n\t\t\tEQU2\tequalisation\n\t\t\tEQUA\tequalisation\n\t\t\tETC\tevent_timing_codes\n\t\t\tETCO\tevent_timing_codes\n\t\t\tGEO\tgeneral_encapsulated_object\n\t\t\tGEOB\tgeneral_encapsulated_object\n\t\t\tGRID\tgroup_identification_registration\n\t\t\tIPL\tinvolved_people_list\n\t\t\tIPLS\tinvolved_people_list\n\t\t\tLINK\tlinked_information\n\t\t\tLNK\tlinked_information\n\t\t\tMCDI\tmusic_cd_identifier\n\t\t\tMCI\tmusic_cd_identifier\n\t\t\tMLL\tmpeg_location_lookup_table\n\t\t\tMLLT\tmpeg_location_lookup_table\n\t\t\tOWNE\townership_frame\n\t\t\tPCNT\tplay_counter\n\t\t\tPIC\tattached_picture\n\t\t\tPOP\tpopularimeter\n\t\t\tPOPM\tpopularimeter\n\t\t\tPOSS\tposition_synchronisation_frame\n\t\t\tPRIV\tprivate_frame\n\t\t\tRBUF\trecommended_buffer_size\n\t\t\tREV\treverb\n\t\t\tRVA\trelative_volume_adjustment\n\t\t\tRVA2\trelative_volume_adjustment\n\t\t\tRVAD\trelative_volume_adjustment\n\t\t\tRVRB\treverb\n\t\t\tSEEK\tseek_frame\n\t\t\tSIGN\tsignature_frame\n\t\t\tSLT\tsynchronised_lyric\n\t\t\tSTC\tsynced_tempo_codes\n\t\t\tSYLT\tsynchronised_lyric\n\t\t\tSYTC\tsynchronised_tempo_codes\n\t\t\tTAL\talbum\n\t\t\tTALB\talbum\n\t\t\tTBP\tbpm\n\t\t\tTBPM\tbpm\n\t\t\tTCM\tcomposer\n\t\t\tTCMP\tpart_of_a_compilation\n\t\t\tTCO\tgenre\n\t\t\tTCOM\tcomposer\n\t\t\tTCON\tgenre\n\t\t\tTCOP\tcopyright_message\n\t\t\tTCP\tpart_of_a_compilation\n\t\t\tTCR\tcopyright_message\n\t\t\tTDA\tdate\n\t\t\tTDAT\tdate\n\t\t\tTDEN\tencoding_time\n\t\t\tTDLY\tplaylist_delay\n\t\t\tTDOR\toriginal_release_time\n\t\t\tTDRC\trecording_time\n\t\t\tTDRL\trelease_time\n\t\t\tTDTG\ttagging_time\n\t\t\tTDY\tplaylist_delay\n\t\t\tTEN\tencoded_by\n\t\t\tTENC\tencoded_by\n\t\t\tTEXT\tlyricist\n\t\t\tTFLT\tfile_type\n\t\t\tTFT\tfile_type\n\t\t\tTIM\ttime\n\t\t\tTIME\ttime\n\t\t\tTIPL\tinvolved_people_list\n\t\t\tTIT1\tcontent_group_description\n\t\t\tTIT2\ttitle\n\t\t\tTIT3\tsubtitle\n\t\t\tTKE\tinitial_key\n\t\t\tTKEY\tinitial_key\n\t\t\tTLA\tlanguage\n\t\t\tTLAN\tlanguage\n\t\t\tTLE\tlength\n\t\t\tTLEN\tlength\n\t\t\tTMCL\tmusician_credits_list\n\t\t\tTMED\tmedia_type\n\t\t\tTMOO\tmood\n\t\t\tTMT\tmedia_type\n\t\t\tTOA\toriginal_artist\n\t\t\tTOAL\toriginal_album\n\t\t\tTOF\toriginal_filename\n\t\t\tTOFN\toriginal_filename\n\t\t\tTOL\toriginal_lyricist\n\t\t\tTOLY\toriginal_lyricist\n\t\t\tTOPE\toriginal_artist\n\t\t\tTOR\toriginal_year\n\t\t\tTORY\toriginal_year\n\t\t\tTOT\toriginal_album\n\t\t\tTOWN\tfile_owner\n\t\t\tTP1\tartist\n\t\t\tTP2\tband\n\t\t\tTP3\tconductor\n\t\t\tTP4\tremixer\n\t\t\tTPA\tpart_of_a_set\n\t\t\tTPB\tpublisher\n\t\t\tTPE1\tartist\n\t\t\tTPE2\tband\n\t\t\tTPE3\tconductor\n\t\t\tTPE4\tremixer\n\t\t\tTPOS\tpart_of_a_set\n\t\t\tTPRO\tproduced_notice\n\t\t\tTPUB\tpublisher\n\t\t\tTRC\tisrc\n\t\t\tTRCK\ttrack_number\n\t\t\tTRD\trecording_dates\n\t\t\tTRDA\trecording_dates\n\t\t\tTRK\ttrack_number\n\t\t\tTRSN\tinternet_radio_station_name\n\t\t\tTRSO\tinternet_radio_station_owner\n\t\t\tTS2\talbum_artist_sort_order\n\t\t\tTSA\talbum_sort_order\n\t\t\tTSC\tcomposer_sort_order\n\t\t\tTSI\tsize\n\t\t\tTSIZ\tsize\n\t\t\tTSO2\talbum_artist_sort_order\n\t\t\tTSOA\talbum_sort_order\n\t\t\tTSOC\tcomposer_sort_order\n\t\t\tTSOP\tperformer_sort_order\n\t\t\tTSOT\ttitle_sort_order\n\t\t\tTSP\tperformer_sort_order\n\t\t\tTSRC\tisrc\n\t\t\tTSS\tencoder_settings\n\t\t\tTSSE\tencoder_settings\n\t\t\tTSST\tset_subtitle\n\t\t\tTST\ttitle_sort_order\n\t\t\tTT1\tcontent_group_description\n\t\t\tTT2\ttitle\n\t\t\tTT3\tsubtitle\n\t\t\tTXT\tlyricist\n\t\t\tTXX\ttext\n\t\t\tTXXX\ttext\n\t\t\tTYE\tyear\n\t\t\tTYER\tyear\n\t\t\tUFI\tunique_file_identifier\n\t\t\tUFID\tunique_file_identifier\n\t\t\tULT\tunsychronised_lyric\n\t\t\tUSER\tterms_of_use\n\t\t\tUSLT\tunsynchronised_lyric\n\t\t\tWAF\turl_file\n\t\t\tWAR\turl_artist\n\t\t\tWAS\turl_source\n\t\t\tWCM\tcommercial_information\n\t\t\tWCOM\tcommercial_information\n\t\t\tWCOP\tcopyright\n\t\t\tWCP\tcopyright\n\t\t\tWOAF\turl_file\n\t\t\tWOAR\turl_artist\n\t\t\tWOAS\turl_source\n\t\t\tWORS\turl_station\n\t\t\tWPAY\turl_payment\n\t\t\tWPB\turl_publisher\n\t\t\tWPUB\turl_publisher\n\t\t\tWXX\turl_user\n\t\t\tWXXX\turl_user\n\t\t\tTFEA\tfeatured_artist\n\t\t\tTSTU\trecording_studio\n\t\t\trgad\treplay_gain_adjustment\n\n\t\t*/\n\n\t\treturn getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_short');\n\t}\n\n\tpublic static function TextEncodingTerminatorLookup($encoding) {\n\t\t// http://www.id3.org/id3v2.4.0-structure.txt\n\t\t// Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings:\n\t\tstatic $TextEncodingTerminatorLookup = array(\n\t\t\t0   => \"\\x00\",     // $00  ISO-8859-1. Terminated with $00.\n\t\t\t1   => \"\\x00\\x00\", // $01  UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00.\n\t\t\t2   => \"\\x00\\x00\", // $02  UTF-16BE encoded Unicode without BOM. Terminated with $00 00.\n\t\t\t3   => \"\\x00\",     // $03  UTF-8 encoded Unicode. Terminated with $00.\n\t\t\t255 => \"\\x00\\x00\"\n\t\t);\n\t\treturn (isset($TextEncodingTerminatorLookup[$encoding]) ? $TextEncodingTerminatorLookup[$encoding] : \"\\x00\");\n\t}\n\n\tpublic static function TextEncodingNameLookup($encoding) {\n\t\t// http://www.id3.org/id3v2.4.0-structure.txt\n\t\t// Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings:\n\t\tstatic $TextEncodingNameLookup = array(\n\t\t\t0   => 'ISO-8859-1', // $00  ISO-8859-1. Terminated with $00.\n\t\t\t1   => 'UTF-16',     // $01  UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00.\n\t\t\t2   => 'UTF-16BE',   // $02  UTF-16BE encoded Unicode without BOM. Terminated with $00 00.\n\t\t\t3   => 'UTF-8',      // $03  UTF-8 encoded Unicode. Terminated with $00.\n\t\t\t255 => 'UTF-16BE'\n\t\t);\n\t\treturn (isset($TextEncodingNameLookup[$encoding]) ? $TextEncodingNameLookup[$encoding] : 'ISO-8859-1');\n\t}\n\n\tpublic static function IsValidID3v2FrameName($framename, $id3v2majorversion) {\n\t\tswitch ($id3v2majorversion) {\n\t\t\tcase 2:\n\t\t\t\treturn preg_match('#[A-Z][A-Z0-9]{2}#', $framename);\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\tcase 4:\n\t\t\t\treturn preg_match('#[A-Z][A-Z0-9]{3}#', $framename);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) {\n\t\tfor ($i = 0; $i < strlen($numberstring); $i++) {\n\t\t\tif ((chr($numberstring{$i}) < chr('0')) || (chr($numberstring{$i}) > chr('9'))) {\n\t\t\t\tif (($numberstring{$i} == '.') && $allowdecimal) {\n\t\t\t\t\t// allowed\n\t\t\t\t} elseif (($numberstring{$i} == '-') && $allownegative && ($i == 0)) {\n\t\t\t\t\t// allowed\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static function IsValidDateStampString($datestamp) {\n\t\tif (strlen($datestamp) != 8) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!self::IsANumber($datestamp, false)) {\n\t\t\treturn false;\n\t\t}\n\t\t$year  = substr($datestamp, 0, 4);\n\t\t$month = substr($datestamp, 4, 2);\n\t\t$day   = substr($datestamp, 6, 2);\n\t\tif (($year == 0) || ($month == 0) || ($day == 0)) {\n\t\t\treturn false;\n\t\t}\n\t\tif ($month > 12) {\n\t\t\treturn false;\n\t\t}\n\t\tif ($day > 31) {\n\t\t\treturn false;\n\t\t}\n\t\tif (($day > 30) && (($month == 4) || ($month == 6) || ($month == 9) || ($month == 11))) {\n\t\t\treturn false;\n\t\t}\n\t\tif (($day > 29) && ($month == 2)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic static function ID3v2HeaderLength($majorversion) {\n\t\treturn (($majorversion == 2) ? 6 : 10);\n\t}\n\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/module.tag.lyrics3.php",
    "content": "<?php\n/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n// See readme.txt for more details                             //\n/////////////////////////////////////////////////////////////////\n///                                                            //\n// module.tag.lyrics3.php                                      //\n// module for analyzing Lyrics3 tags                           //\n// dependencies: module.tag.apetag.php (optional)              //\n//                                                            ///\n/////////////////////////////////////////////////////////////////\n\n\nclass getid3_lyrics3 extends getid3_handler\n{\n\n\tpublic function Analyze() {\n\t\t$info = &$this->getid3->info;\n\n\t\t// http://www.volweb.cz/str/tags.htm\n\n\t\tif (!getid3_lib::intValueSupported($info['filesize'])) {\n\t\t\t$info['warning'][] = 'Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB';\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->fseek((0 - 128 - 9 - 6), SEEK_END);          // end - ID3v1 - \"LYRICSEND\" - [Lyrics3size]\n\t\t$lyrics3_id3v1 = $this->fread(128 + 9 + 6);\n\t\t$lyrics3lsz    = substr($lyrics3_id3v1,  0,   6); // Lyrics3size\n\t\t$lyrics3end    = substr($lyrics3_id3v1,  6,   9); // LYRICSEND or LYRICS200\n\t\t$id3v1tag      = substr($lyrics3_id3v1, 15, 128); // ID3v1\n\n\t\tif ($lyrics3end == 'LYRICSEND') {\n\t\t\t// Lyrics3v1, ID3v1, no APE\n\n\t\t\t$lyrics3size    = 5100;\n\t\t\t$lyrics3offset  = $info['filesize'] - 128 - $lyrics3size;\n\t\t\t$lyrics3version = 1;\n\n\t\t} elseif ($lyrics3end == 'LYRICS200') {\n\t\t\t// Lyrics3v2, ID3v1, no APE\n\n\t\t\t// LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'\n\t\t\t$lyrics3size    = $lyrics3lsz + 6 + strlen('LYRICS200');\n\t\t\t$lyrics3offset  = $info['filesize'] - 128 - $lyrics3size;\n\t\t\t$lyrics3version = 2;\n\n\t\t} elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICSEND')) {\n\t\t\t// Lyrics3v1, no ID3v1, no APE\n\n\t\t\t$lyrics3size    = 5100;\n\t\t\t$lyrics3offset  = $info['filesize'] - $lyrics3size;\n\t\t\t$lyrics3version = 1;\n\t\t\t$lyrics3offset  = $info['filesize'] - $lyrics3size;\n\n\t\t} elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICS200')) {\n\n\t\t\t// Lyrics3v2, no ID3v1, no APE\n\n\t\t\t$lyrics3size    = strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'\n\t\t\t$lyrics3offset  = $info['filesize'] - $lyrics3size;\n\t\t\t$lyrics3version = 2;\n\n\t\t} else {\n\n\t\t\tif (isset($info['ape']['tag_offset_start']) && ($info['ape']['tag_offset_start'] > 15)) {\n\n\t\t\t\t$this->fseek($info['ape']['tag_offset_start'] - 15);\n\t\t\t\t$lyrics3lsz = $this->fread(6);\n\t\t\t\t$lyrics3end = $this->fread(9);\n\n\t\t\t\tif ($lyrics3end == 'LYRICSEND') {\n\t\t\t\t\t// Lyrics3v1, APE, maybe ID3v1\n\n\t\t\t\t\t$lyrics3size    = 5100;\n\t\t\t\t\t$lyrics3offset  = $info['ape']['tag_offset_start'] - $lyrics3size;\n\t\t\t\t\t$info['avdataend'] = $lyrics3offset;\n\t\t\t\t\t$lyrics3version = 1;\n\t\t\t\t\t$info['warning'][] = 'APE tag located after Lyrics3, will probably break Lyrics3 compatability';\n\n\t\t\t\t} elseif ($lyrics3end == 'LYRICS200') {\n\t\t\t\t\t// Lyrics3v2, APE, maybe ID3v1\n\n\t\t\t\t\t$lyrics3size    = $lyrics3lsz + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200'\n\t\t\t\t\t$lyrics3offset  = $info['ape']['tag_offset_start'] - $lyrics3size;\n\t\t\t\t\t$lyrics3version = 2;\n\t\t\t\t\t$info['warning'][] = 'APE tag located after Lyrics3, will probably break Lyrics3 compatability';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif (isset($lyrics3offset)) {\n\t\t\t$info['avdataend'] = $lyrics3offset;\n\t\t\t$this->getLyrics3Data($lyrics3offset, $lyrics3version, $lyrics3size);\n\n\t\t\tif (!isset($info['ape'])) {\n\t\t\t\tif (isset($info['lyrics3']['tag_offset_start'])) {\n\t\t\t\t\t$GETID3_ERRORARRAY = &$info['warning'];\n\t\t\t\t\tgetid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, true);\n\t\t\t\t\t$getid3_temp = new getID3();\n\t\t\t\t\t$getid3_temp->openfile($this->getid3->filename);\n\t\t\t\t\t$getid3_apetag = new getid3_apetag($getid3_temp);\n\t\t\t\t\t$getid3_apetag->overrideendoffset = $info['lyrics3']['tag_offset_start'];\n\t\t\t\t\t$getid3_apetag->Analyze();\n\t\t\t\t\tif (!empty($getid3_temp->info['ape'])) {\n\t\t\t\t\t\t$info['ape'] = $getid3_temp->info['ape'];\n\t\t\t\t\t}\n\t\t\t\t\tif (!empty($getid3_temp->info['replay_gain'])) {\n\t\t\t\t\t\t$info['replay_gain'] = $getid3_temp->info['replay_gain'];\n\t\t\t\t\t}\n\t\t\t\t\tunset($getid3_temp, $getid3_apetag);\n\t\t\t\t} else {\n\t\t\t\t\t$info['warning'][] = 'Lyrics3 and APE tags appear to have become entangled (most likely due to updating the APE tags with a non-Lyrics3-aware tagger)';\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic function getLyrics3Data($endoffset, $version, $length) {\n\t\t// http://www.volweb.cz/str/tags.htm\n\n\t\t$info = &$this->getid3->info;\n\n\t\tif (!getid3_lib::intValueSupported($endoffset)) {\n\t\t\t$info['warning'][] = 'Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB';\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->fseek($endoffset);\n\t\tif ($length <= 0) {\n\t\t\treturn false;\n\t\t}\n\t\t$rawdata = $this->fread($length);\n\n\t\t$ParsedLyrics3['raw']['lyrics3version'] = $version;\n\t\t$ParsedLyrics3['raw']['lyrics3tagsize'] = $length;\n\t\t$ParsedLyrics3['tag_offset_start']      = $endoffset;\n\t\t$ParsedLyrics3['tag_offset_end']        = $endoffset + $length - 1;\n\n\t\tif (substr($rawdata, 0, 11) != 'LYRICSBEGIN') {\n\t\t\tif (strpos($rawdata, 'LYRICSBEGIN') !== false) {\n\n\t\t\t\t$info['warning'][] = '\"LYRICSBEGIN\" expected at '.$endoffset.' but actually found at '.($endoffset + strpos($rawdata, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$version;\n\t\t\t\t$info['avdataend'] = $endoffset + strpos($rawdata, 'LYRICSBEGIN');\n\t\t\t\t$rawdata = substr($rawdata, strpos($rawdata, 'LYRICSBEGIN'));\n\t\t\t\t$length = strlen($rawdata);\n\t\t\t\t$ParsedLyrics3['tag_offset_start'] = $info['avdataend'];\n\t\t\t\t$ParsedLyrics3['raw']['lyrics3tagsize'] = $length;\n\n\t\t\t} else {\n\n\t\t\t\t$info['error'][] = '\"LYRICSBEGIN\" expected at '.$endoffset.' but found \"'.substr($rawdata, 0, 11).'\" instead';\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tswitch ($version) {\n\n\t\t\tcase 1:\n\t\t\t\tif (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICSEND') {\n\t\t\t\t\t$ParsedLyrics3['raw']['LYR'] = trim(substr($rawdata, 11, strlen($rawdata) - 11 - 9));\n\t\t\t\t\t$this->Lyrics3LyricsTimestampParse($ParsedLyrics3);\n\t\t\t\t} else {\n\t\t\t\t\t$info['error'][] = '\"LYRICSEND\" expected at '.($this->ftell() - 11 + $length - 9).' but found \"'.substr($rawdata, strlen($rawdata) - 9, 9).'\" instead';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tif (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICS200') {\n\t\t\t\t\t$ParsedLyrics3['raw']['unparsed'] = substr($rawdata, 11, strlen($rawdata) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ\n\t\t\t\t\t$rawdata = $ParsedLyrics3['raw']['unparsed'];\n\t\t\t\t\twhile (strlen($rawdata) > 0) {\n\t\t\t\t\t\t$fieldname = substr($rawdata, 0, 3);\n\t\t\t\t\t\t$fieldsize = (int) substr($rawdata, 3, 5);\n\t\t\t\t\t\t$ParsedLyrics3['raw'][$fieldname] = substr($rawdata, 8, $fieldsize);\n\t\t\t\t\t\t$rawdata = substr($rawdata, 3 + 5 + $fieldsize);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isset($ParsedLyrics3['raw']['IND'])) {\n\t\t\t\t\t\t$i = 0;\n\t\t\t\t\t\t$flagnames = array('lyrics', 'timestamps', 'inhibitrandom');\n\t\t\t\t\t\tforeach ($flagnames as $flagname) {\n\t\t\t\t\t\t\tif (strlen($ParsedLyrics3['raw']['IND']) > $i++) {\n\t\t\t\t\t\t\t\t$ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1 - 1));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$fieldnametranslation = array('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author');\n\t\t\t\t\tforeach ($fieldnametranslation as $key => $value) {\n\t\t\t\t\t\tif (isset($ParsedLyrics3['raw'][$key])) {\n\t\t\t\t\t\t\t$ParsedLyrics3['comments'][$value][] = trim($ParsedLyrics3['raw'][$key]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isset($ParsedLyrics3['raw']['IMG'])) {\n\t\t\t\t\t\t$imagestrings = explode(\"\\r\\n\", $ParsedLyrics3['raw']['IMG']);\n\t\t\t\t\t\tforeach ($imagestrings as $key => $imagestring) {\n\t\t\t\t\t\t\tif (strpos($imagestring, '||') !== false) {\n\t\t\t\t\t\t\t\t$imagearray = explode('||', $imagestring);\n\t\t\t\t\t\t\t\t$ParsedLyrics3['images'][$key]['filename']     =                                (isset($imagearray[0]) ? $imagearray[0] : '');\n\t\t\t\t\t\t\t\t$ParsedLyrics3['images'][$key]['description']  =                                (isset($imagearray[1]) ? $imagearray[1] : '');\n\t\t\t\t\t\t\t\t$ParsedLyrics3['images'][$key]['timestamp']    = $this->Lyrics3Timestamp2Seconds(isset($imagearray[2]) ? $imagearray[2] : '');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($ParsedLyrics3['raw']['LYR'])) {\n\t\t\t\t\t\t$this->Lyrics3LyricsTimestampParse($ParsedLyrics3);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$info['error'][] = '\"LYRICS200\" expected at '.($this->ftell() - 11 + $length - 9).' but found \"'.substr($rawdata, strlen($rawdata) - 9, 9).'\" instead';\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$info['error'][] = 'Cannot process Lyrics3 version '.$version.' (only v1 and v2)';\n\t\t\t\treturn false;\n\t\t\t\tbreak;\n\t\t}\n\n\n\t\tif (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] <= $ParsedLyrics3['tag_offset_end'])) {\n\t\t\t$info['warning'][] = 'ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data';\n\t\t\tunset($info['id3v1']);\n\t\t\tforeach ($info['warning'] as $key => $value) {\n\t\t\t\tif ($value == 'Some ID3v1 fields do not use NULL characters for padding') {\n\t\t\t\t\tunset($info['warning'][$key]);\n\t\t\t\t\tsort($info['warning']);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$info['lyrics3'] = $ParsedLyrics3;\n\n\t\treturn true;\n\t}\n\n\tpublic function Lyrics3Timestamp2Seconds($rawtimestamp) {\n\t\tif (preg_match('#^\\\\[([0-9]{2}):([0-9]{2})\\\\]$#', $rawtimestamp, $regs)) {\n\t\t\treturn (int) (($regs[1] * 60) + $regs[2]);\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic function Lyrics3LyricsTimestampParse(&$Lyrics3data) {\n\t\t$lyricsarray = explode(\"\\r\\n\", $Lyrics3data['raw']['LYR']);\n\t\tforeach ($lyricsarray as $key => $lyricline) {\n\t\t\t$regs = array();\n\t\t\tunset($thislinetimestamps);\n\t\t\twhile (preg_match('#^(\\\\[[0-9]{2}:[0-9]{2}\\\\])#', $lyricline, $regs)) {\n\t\t\t\t$thislinetimestamps[] = $this->Lyrics3Timestamp2Seconds($regs[0]);\n\t\t\t\t$lyricline = str_replace($regs[0], '', $lyricline);\n\t\t\t}\n\t\t\t$notimestamplyricsarray[$key] = $lyricline;\n\t\t\tif (isset($thislinetimestamps) && is_array($thislinetimestamps)) {\n\t\t\t\tsort($thislinetimestamps);\n\t\t\t\tforeach ($thislinetimestamps as $timestampkey => $timestamp) {\n\t\t\t\t\tif (isset($Lyrics3data['synchedlyrics'][$timestamp])) {\n\t\t\t\t\t\t// timestamps only have a 1-second resolution, it's possible that multiple lines\n\t\t\t\t\t\t// could have the same timestamp, if so, append\n\t\t\t\t\t\t$Lyrics3data['synchedlyrics'][$timestamp] .= \"\\r\\n\".$lyricline;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$Lyrics3data['synchedlyrics'][$timestamp] = $lyricline;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$Lyrics3data['unsynchedlyrics'] = implode(\"\\r\\n\", $notimestamplyricsarray);\n\t\tif (isset($Lyrics3data['synchedlyrics']) && is_array($Lyrics3data['synchedlyrics'])) {\n\t\t\tksort($Lyrics3data['synchedlyrics']);\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic function IntString2Bool($char) {\n\t\tif ($char == '1') {\n\t\t\treturn true;\n\t\t} elseif ($char == '0') {\n\t\t\treturn false;\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ID3/readme.txt",
    "content": "/////////////////////////////////////////////////////////////////\n/// getID3() by James Heinrich <info@getid3.org>               //\n//  available at http://getid3.sourceforge.net                 //\n//            or http://www.getid3.org                         //\n//          also https://github.com/JamesHeinrich/getID3       //\n/////////////////////////////////////////////////////////////////\n\n*****************************************************************\n*****************************************************************\n\n   getID3() is released under multiple licenses. You may choose\n   from the following licenses, and use getID3 according to the\n   terms of the license most suitable to your project.\n\nGNU GPL: https://gnu.org/licenses/gpl.html                   (v3)\n         https://gnu.org/licenses/old-licenses/gpl-2.0.html  (v2)\n         https://gnu.org/licenses/old-licenses/gpl-1.0.html  (v1)\n\nGNU LGPL: https://gnu.org/licenses/lgpl.html                 (v3)\n\nMozilla MPL: http://www.mozilla.org/MPL/2.0/                 (v2)\n\ngetID3 Commercial License: http://getid3.org/#gCL (payment required)\n\n*****************************************************************\n*****************************************************************\nCopies of each of the above licenses are included in the 'licenses'\ndirectory of the getID3 distribution.\n\n\n       +---------------------------------------------+\n       | If you want to donate, there is a link on   |\n       | http://www.getid3.org for PayPal donations. |\n       +---------------------------------------------+\n\n\nQuick Start\n===========================================================================\n\nQ: How can I check that getID3() works on my server/files?\nA: Unzip getID3() to a directory, then access /demos/demo.browse.php\n\n\n\nSupport\n===========================================================================\n\nQ: I have a question, or I found a bug. What do I do?\nA: The preferred method of support requests and/or bug reports is the\n   forum at http://support.getid3.org/\n\n\n\nSourceforge Notification\n===========================================================================\n\nIt's highly recommended that you sign up for notification from\nSourceforge for when new versions are released. Please visit:\nhttp://sourceforge.net/project/showfiles.php?group_id=55859\nand click the little \"monitor package\" icon/link.  If you're\npreviously signed up for the mailing list, be aware that it has\nbeen discontinued, only the automated Sourceforge notification\nwill be used from now on.\n\n\n\nWhat does getID3() do?\n===========================================================================\n\nReads & parses (to varying degrees):\n ¤ tags:\n  * APE (v1 and v2)\n  * ID3v1 (& ID3v1.1)\n  * ID3v2 (v2.4, v2.3, v2.2)\n  * Lyrics3 (v1 & v2)\n\n ¤ audio-lossy:\n  * MP3/MP2/MP1\n  * MPC / Musepack\n  * Ogg (Vorbis, OggFLAC, Speex)\n  * AAC / MP4\n  * AC3\n  * DTS\n  * RealAudio\n  * Speex\n  * DSS\n  * VQF\n\n ¤ audio-lossless:\n  * AIFF\n  * AU\n  * Bonk\n  * CD-audio (*.cda)\n  * FLAC\n  * LA (Lossless Audio)\n  * LiteWave\n  * LPAC\n  * MIDI\n  * Monkey's Audio\n  * OptimFROG\n  * RKAU\n  * Shorten\n  * TTA\n  * VOC\n  * WAV (RIFF)\n  * WavPack\n\n ¤ audio-video:\n  * ASF: ASF, Windows Media Audio (WMA), Windows Media Video (WMV)\n  * AVI (RIFF)\n  * Flash\n  * Matroska (MKV)\n  * MPEG-1 / MPEG-2\n  * NSV (Nullsoft Streaming Video)\n  * Quicktime (including MP4)\n  * RealVideo\n\n ¤ still image:\n  * BMP\n  * GIF\n  * JPEG\n  * PNG\n  * TIFF\n  * SWF (Flash)\n  * PhotoCD\n\n ¤ data:\n  * ISO-9660 CD-ROM image (directory structure)\n  * SZIP (limited support)\n  * ZIP (directory structure)\n  * TAR\n  * CUE\n\n\nWrites:\n  * ID3v1 (& ID3v1.1)\n  * ID3v2 (v2.3 & v2.4)\n  * VorbisComment on OggVorbis\n  * VorbisComment on FLAC (not OggFLAC)\n  * APE v2\n  * Lyrics3 (delete only)\n\n\n\nRequirements\n===========================================================================\n\n* PHP 4.2.0 up to 5.2.x for getID3() 1.7.x (and earlier)\n* PHP 5.0.5 (or higher) for getID3() 1.8.x (and up)\n* PHP 5.0.5 (or higher) for getID3() 2.0.x (and up)\n* at least 4MB memory for PHP. 8MB or more is highly recommended.\n  12MB is required with all modules loaded.\n\n\n\nUsage\n===========================================================================\n\nSee /demos/demo.basic.php for a very basic use of getID3() with no\nfancy output, just scanning one file.\n\nSee structure.txt for the returned data structure.\n\n*>  For an example of a complete directory-browsing,       <*\n*>  file-scanning implementation of getID3(), please run   <*\n*>  /demos/demo.browse.php                                 <*\n\nSee /demos/demo.mysql.php for a sample recursive scanning code that\nscans every file in a given directory, and all sub-directories, stores\nthe results in a database and allows various analysis / maintenance\noperations\n\nTo analyze remote files over HTTP or FTP you need to copy the file\nlocally first before running getID3(). Your code would look something\nlike this:\n\n// Copy remote file locally to scan with getID3()\n$remotefilename = 'http://www.example.com/filename.mp3';\nif ($fp_remote = fopen($remotefilename, 'rb')) {\n    $localtempfilename = tempnam('/tmp', 'getID3');\n    if ($fp_local = fopen($localtempfilename, 'wb')) {\n        while ($buffer = fread($fp_remote, 8192)) {\n            fwrite($fp_local, $buffer);\n        }\n        fclose($fp_local);\n\n\t\t// Initialize getID3 engine\n\t\t$getID3 = new getID3;\n\n\t\t$ThisFileInfo = $getID3->analyze($filename);\n\n        // Delete temporary file\n        unlink($localtempfilename);\n    }\n    fclose($fp_remote);\n}\n\n\nSee /demos/demo.write.php for how to write tags.\n\n\n\nWhat does the returned data structure look like?\n===========================================================================\n\nSee structure.txt\n\nIt is recommended that you look at the output of\n/demos/demo.browse.php scanning the file(s) you're interested in to\nconfirm what data is actually returned for any particular filetype in\ngeneral, and your files in particular, as the actual data returned\nmay vary considerably depending on what information is available in\nthe file itself.\n\n\n\nNotes\n===========================================================================\n\ngetID3() 1.x:\nIf the format parser encounters a critical problem, it will return\nsomething in $fileinfo['error'], describing the encountered error. If\na less critical error or notice is generated it will appear in\n$fileinfo['warning']. Both keys may contain more than one warning or\nerror. If something is returned in ['error'] then the file was not\ncorrectly parsed and returned data may or may not be correct and/or\ncomplete. If something is returned in ['warning'] (and not ['error'])\nthen the data that is returned is OK - usually getID3() is reporting\nerrors in the file that have been worked around due to known bugs in\nother programs. Some warnings may indicate that the data that is\nreturned is OK but that some data could not be extracted due to\nerrors in the file.\n\ngetID3() 2.x:\nSee above except errors are thrown (so you will only get one error).\n\n\n\nDisclaimer\n===========================================================================\n\ngetID3() has been tested on many systems, on many types of files,\nunder many operating systems, and is generally believe to be stable\nand safe. That being said, there is still the chance there is an\nundiscovered and/or unfixed bug that may potentially corrupt your\nfile, especially within the writing functions. By using getID3() you\nagree that it's not my fault if any of your files are corrupted.\nIn fact, I'm not liable for anything :)\n\n\n\nLicense\n===========================================================================\n\nGNU General Public License - see license.txt\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to:\nFree Software Foundation, Inc.\n59 Temple Place - Suite 330\nBoston, MA  02111-1307, USA.\n\nFAQ:\nQ: Can I use getID3() in my program? Do I need a commercial license?\nA: You're generally free to use getID3 however you see fit. The only\n   case in which you would require a commercial license is if you're\n   selling your closed-source program that integrates getID3. If you\n   sell your program including a copy of getID3, that's fine as long\n   as you include a copy of the sourcecode when you sell it.  Or you\n   can distribute your code without getID3 and say \"download it from\n   getid3.sourceforge.net\"\n\n\n\nWhy is it called \"getID3()\" if it does so much more than just that?\n===========================================================================\n\nv0.1 did in fact just do that. I don't have a copy of code that old, but I\ncould essentially write it today with a one-line function:\n  function getID3($filename) { return unpack('a3TAG/a30title/a30artist/a30album/a4year/a28comment/c1track/c1genreid', substr(file_get_contents($filename), -128)); }\n\n\nFuture Plans\n===========================================================================\nhttp://www.getid3.org/phpBB3/viewforum.php?f=7\n\n* Better support for MP4 container format\n* Scan for appended ID3v2 tag at end of file per ID3v2.4 specs (Section 5.0)\n* Support for JPEG-2000 (http://www.morgan-multimedia.com/jpeg2000_overview.htm)\n* Support for MOD (mod/stm/s3m/it/xm/mtm/ult/669)\n* Support for ACE (thanks Vince)\n* Support for Ogg other than Vorbis, Speex and OggFlac (ie. Ogg+Xvid)\n* Ability to create Xing/LAME VBR header for VBR MP3s that are missing VBR header\n* Ability to \"clean\" ID3v2 padding (replace invalid padding with valid padding)\n* Warn if MP3s change version mid-stream (in full-scan mode)\n* check for corrupt/broken mid-file MP3 streams in histogram scan\n* Support for lossless-compression formats\n  (http://www.firstpr.com.au/audiocomp/lossless/#Links)\n  (http://compression.ca/act-sound.html)\n  (http://web.inter.nl.net/users/hvdh/lossless/lossless.htm)\n* Support for RIFF-INFO chunks\n  * http://lotto.st-andrews.ac.uk/~njh/tag_interchange.html\n    (thanks Nick Humfrey <njhØsurgeradio*co*uk>)\n  * http://abcavi.narod.ru/sof/abcavi/infotags.htm\n    (thanks Kibi)\n* Better support for Bink video\n* http://www.hr/josip/DSP/AudioFile2.html\n* http://www.pcisys.net/~melanson/codecs/\n* Detect mp3PRO\n* Support for PSD\n* Support for JPC\n* Support for JP2\n* Support for JPX\n* Support for JB2\n* Support for IFF\n* Support for ICO\n* Support for ANI\n* Support for EXE (comments, author, etc) (thanks p*quaedackersØplanet*nl)\n* Support for DVD-IFO (region, subtitles, aspect ratio, etc)\n  (thanks p*quaedackersØplanet*nl)\n* More complete support for SWF - parsing encapsulated MP3 and/or JPEG content\n    (thanks n8n8Øyahoo*com)\n* Support for a2b\n* Optional scan-through-frames for AVI verification\n  (thanks rockcohenØmassive-interactive*nl)\n* Support for TTF (thanks infoØbutterflyx*com)\n* Support for DSS (http://www.getid3.org/phpBB3/viewtopic.php?t=171)\n* Support for SMAF (http://smaf-yamaha.com/what/demo.html)\n  http://www.getid3.org/phpBB3/viewtopic.php?t=182\n* Support for AMR (http://www.getid3.org/phpBB3/viewtopic.php?t=195)\n* Support for 3gpp (http://www.getid3.org/phpBB3/viewtopic.php?t=195)\n* Support for ID4 (http://www.wackysoft.cjb.net grizlyY2KØhotmail*com)\n* Parse XML data returned in Ogg comments\n* Parse XML data from Quicktime SMIL metafiles (klausrathØmac*com)\n* ID3v2 genre string creator function\n* More complete parsing of JPG\n* Support for all old-style ASF packets\n* ASF/WMA/WMV tag writing\n* Parse declared T??? ID3v2 text information frames, where appropriate\n    (thanks Christian Fritz for the idea)\n* Recognize encoder:\n  http://www.guerillasoft.com/EncSpot2/index.html\n  http://ff123.net/identify.html\n  http://www.hydrogenaudio.org/?act=ST&f=16&t=9414\n  http://www.hydrogenaudio.org/?showtopic=11785\n* Support for other OS/2 bitmap structures: Bitmap Array('BA'),\n  Color Icon('CI'), Color Pointer('CP'), Icon('IC'), Pointer ('PT')\n  http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm\n* Support for WavPack RAW mode\n* ASF/WMA/WMV data packet parsing\n* ID3v2FrameFlagsLookupTagAlter()\n* ID3v2FrameFlagsLookupFileAlter()\n* obey ID3v2 tag alter/preserve/discard rules\n* http://www.geocities.com/SiliconValley/Sector/9654/Softdoc/Illyrium/Aolyr.htm\n* proper checking for LINK/LNK frame validity in ID3v2 writing\n* proper checking for ASPI-TLEN frame validity in ID3v2 writing\n* proper checking for COMR frame validity in ID3v2 writing\n* http://www.geocities.co.jp/SiliconValley-Oakland/3664/index.html\n* decode GEOB ID3v2 structure as encoded by RealJukebox,\n  decode NCON ID3v2 structure as encoded by MusicMatch\n  (probably won't happen - the formats are proprietary)\n\n\n\nKnown Bugs/Issues in getID3() that may be fixed eventually\n===========================================================================\nhttp://www.getid3.org/phpBB3/viewtopic.php?t=25\n\n* Cannot determine bitrate for MPEG video with VBR video data\n  (need documentation)\n* Interlace/progressive cannot be determined for MPEG video\n  (need documentation)\n* MIDI playtime is sometimes inaccurate\n* AAC-RAW mode files cannot be identified\n* WavPack-RAW mode files cannot be identified\n* mp4 files report lots of \"Unknown QuickTime atom type\"\n   (need documentation)\n* Encrypted ASF/WMA/WMV files warn about \"unhandled GUID\n  ASF_Content_Encryption_Object\"\n* Bitrate split between audio and video cannot be calculated for\n  NSV, only the total bitrate. (need documentation)\n* All Ogg formats (Vorbis, OggFLAC, Speex) are affected by the\n  problem of large VorbisComments spanning multiple Ogg pages, but\n  but only OggVorbis files can be processed with vorbiscomment.\n* The version of \"head\" supplied with Mac OS 10.2.8 (maybe other\n  versions too) does only understands a single option (-n) and\n  therefore fails. getID3 ignores this and returns wrong md5_data.\n\n\n\nKnown Bugs/Issues in getID3() that cannot be fixed\n--------------------------------------------------\nhttp://www.getid3.org/phpBB3/viewtopic.php?t=25\n\n* 32-bit PHP installations only:\n  Files larger than 2GB cannot always be parsed fully by getID3()\n  due to limitations in the 32-bit PHP filesystem functions.\n  NOTE: Since v1.7.8b3 there is partial support for larger-than-\n  2GB files, most of which will parse OK, as long as no critical\n  data is located beyond the 2GB offset.\n  Known will-work:\n  * all file formats on 64-bit PHP\n  * ZIP  (format doesn't support files >2GB)\n  * FLAC (current encoders don't support files >2GB)\n  Known will-not-work:\n  * ID3v1 tags (always located at end-of-file)\n  * Lyrics3 tags (always located at end-of-file)\n  * APE tags (always located at end-of-file)\n  Maybe-will-work:\n  * Quicktime (will work if needed metadata is before 2GB offset,\n    that is if the file has been hinted/optimized for streaming)\n  * RIFF.WAV (should work fine, but gives warnings about not being\n    able to parse all chunks)\n  * RIFF.AVI (playtime will probably be wrong, is only based on\n    \"movi\" chunk that fits in the first 2GB, should issue error\n    to show that playtime is incorrect. Other data should be mostly\n    correct, assuming that data is constant throughout the file)\n* PHP <= v5 on Windows cannot read UTF-8 filenames\n\n\nKnown Bugs/Issues in other programs\n-----------------------------------\nhttp://www.getid3.org/phpBB3/viewtopic.php?t=25\n\n* Windows Media Player (up to v11) and iTunes (up to v10+) do\n    not correctly handle ID3v2.3 tags with UTF-16BE+BOM\n    encoding (they assume the data is UTF-16LE+BOM and either\n    crash (WMP) or output Asian character set (iTunes)\n* Winamp (up to v2.80 at least) does not support ID3v2.4 tags,\n    only ID3v2.3\n    see: http://forums.winamp.com/showthread.php?postid=387524\n* Some versions of Helium2 (www.helium2.com) do not write\n    ID3v2.4-compliant Frame Sizes, even though the tag is marked\n    as ID3v2.4)  (detected by getID3())\n* MP3ext V3.3.17 places a non-compliant padding string at the end\n    of the ID3v2 header. This is supposedly fixed in v3.4b21 but\n    only if you manually add a registry key. This fix is not yet\n    confirmed.  (detected by getID3())\n* CDex v1.40 (fixed by v1.50b7) writes non-compliant Ogg comment\n    strings, supposed to be in the format \"NAME=value\" but actually\n    written just \"value\"  (detected by getID3())\n* Oggenc 0.9-rc3 flags the encoded file as ABR whether it's\n    actually ABR or VBR.\n* iTunes (versions \"X v2.0.3\", \"v3.0.1\" are known-guilty, probably\n    other versions are too) writes ID3v2.3 comment tags using a\n    frame name 'COM ' which is not valid for ID3v2.3+ (it's an\n    ID3v2.2-style frame name)  (detected by getID3())\n* MP2enc does not encode mono CBR MP2 files properly (half speed\n    sound and double playtime)\n* MP2enc does not encode mono VBR MP2 files properly (actually\n    encoded as stereo)\n* tooLAME does not encode mono VBR MP2 files properly (actually\n    encoded as stereo)\n* AACenc encodes files in VBR mode (actually ABR) even if CBR is\n   specified\n* AAC/ADIF - bitrate_mode = cbr for vbr files\n* LAME 3.90-3.92 prepends one frame of null data (space for the\n  LAME/VBR header, but it never gets written) when encoding in CBR\n  mode with the DLL\n* Ahead Nero encodes TwinVQF with a DSIZ value (which is supposed\n  to be the filesize in bytes) of \"0\" for TwinVQF v1.0 and \"1\" for\n  TwinVQF v2.0  (detected by getID3())\n* Ahead Nero encodes TwinVQF files 1 second shorter than they\n  should be\n* AAC-ADTS files are always actually encoded VBR, even if CBR mode\n  is specified (the CBR-mode switches on the encoder enable ABR\n  mode, not CBR as such, but it's not possible to tell the\n  difference between such ABR files and true VBR)\n* STREAMINFO.audio_signature in OggFLAC is always null. \"The reason\n  it's like that is because there is no seeking support in\n  libOggFLAC yet, so it has no way to go back and write the\n  computed sum after encoding. Seeking support in Ogg FLAC is the\n  #1 item for the next release.\" - Josh Coalson (FLAC developer)\n  NOTE: getID3() will calculate md5_data in a method similar to\n  other file formats, but that value cannot be compared to the\n  md5_data value from FLAC data in a FLAC file format.\n* STREAMINFO.audio_signature is not calculated in FLAC v0.3.0 &\n  v0.4.0 - getID3() will calculate md5_data in a method similar to\n  other file formats, but that value cannot be compared to the\n  md5_data value from FLAC v0.5.0+\n* RioPort (various versions including 2.0 and 3.11) tags ID3v2 with\n  a WCOM frame that has no data portion\n* Earlier versions of Coolplayer adds illegal ID3 tags to Ogg Vorbis\n  files, thus making them corrupt.\n* Meracl ID3 Tag Writer v1.3.4 (and older) incorrectly truncates the\n  last byte of data from an MP3 file when appending a new ID3v1 tag.\n  (detected by getID3())\n* Lossless-Audio files encoded with and without the -noseek switch\n  do actually differ internally and therefore cannot match md5_data\n* iTunes has been known to append a new ID3v1 tag on the end of an\n  existing ID3v1 tag when ID3v2 tag is also present\n  (detected by getID3())\n* MediaMonkey may write a blank RGAD ID3v2 frame but put actual\n  replay gain adjustments in a series of user-defined TXXX frames\n  (detected and handled by getID3() since v1.9.2)\n\n\n\n\nReference material:\n===========================================================================\n\n[www.id3.org material now mirrored at http://id3lib.sourceforge.net/id3/]\n* http://www.id3.org/id3v2.4.0-structure.txt\n* http://www.id3.org/id3v2.4.0-frames.txt\n* http://www.id3.org/id3v2.4.0-changes.txt\n* http://www.id3.org/id3v2.3.0.txt\n* http://www.id3.org/id3v2-00.txt\n* http://www.id3.org/mp3frame.html\n* http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html <mathewhendry@hotmail.com>\n* http://www.dv.co.yu/mpgscript/mpeghdr.htm\n* http://www.mp3-tech.org/programmer/frame_header.html\n* http://users.belgacom.net/gc247244/extra/tag.html\n* http://gabriel.mp3-tech.org/mp3infotag.html\n* http://www.id3.org/iso4217.html\n* http://www.unicode.org/Public/MAPPINGS/ISO8859/8859-1.TXT\n* http://www.xiph.org/ogg/vorbis/doc/framing.html\n* http://www.xiph.org/ogg/vorbis/doc/v-comment.html\n* http://leknor.com/code/php/class.ogg.php.txt\n* http://www.id3.org/iso639-2.html\n* http://www.id3.org/lyrics3.html\n* http://www.id3.org/lyrics3200.html\n* http://www.psc.edu/general/software/packages/ieee/ieee.html\n* http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html\n* http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html\n* http://www.jmcgowan.com/avi.html\n* http://www.wotsit.org/\n* http://www.herdsoft.com/ti/davincie/davp3xo2.htm\n* http://www.mathdogs.com/vorbis-illuminated/bitstream-appendix.html\n* \"Standard MIDI File Format\" by Dustin Caldwell (from www.wotsit.org)\n* http://midistudio.com/Help/GMSpecs_Patches.htm\n* http://www.xiph.org/archives/vorbis/200109/0459.html\n* http://www.replaygain.org/\n* http://www.lossless-audio.com/\n* http://download.microsoft.com/download/winmediatech40/Doc/1.0/WIN98MeXP/EN-US/ASF_Specification_v.1.0.exe\n* http://mediaxw.sourceforge.net/files/doc/Active%20Streaming%20Format%20(ASF)%201.0%20Specification.pdf\n* http://www.uni-jena.de/~pfk/mpp/sv8/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/sv8/)\n* http://jfaul.de/atl/\n* http://www.uni-jena.de/~pfk/mpp/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/)\n* http://www.libpng.org/pub/png/spec/png-1.2-pdg.html\n* http://www.real.com/devzone/library/creating/rmsdk/doc/rmff.htm\n* http://www.fastgraph.com/help/bmp_os2_header_format.html\n* http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm\n* http://flac.sourceforge.net/format.html\n* http://www.research.att.com/projects/mpegaudio/mpeg2.html\n* http://www.audiocoding.com/wiki/index.php?page=AAC\n* http://libmpeg.org/mpeg4/doc/w2203tfs.pdf\n* http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt\n* http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/frameset.htm\n* http://www.nullsoft.com/nsv/\n* http://www.wotsit.org/download.asp?f=iso9660\n* http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html\n* http://www.cdroller.com/htm/readdata.html\n* http://www.speex.org/manual/node10.html\n* http://www.harmony-central.com/Computer/Programming/aiff-file-format.doc\n* http://www.faqs.org/rfcs/rfc2361.html\n* http://ghido.shelter.ro/\n* http://www.ebu.ch/tech_t3285.pdf\n* http://www.sr.se/utveckling/tu/bwf\n* http://ftp.aessc.org/pub/aes46-2002.pdf\n* http://cartchunk.org:8080/\n* http://www.broadcastpapers.com/radio/cartchunk01.htm\n* http://www.hr/josip/DSP/AudioFile2.html\n* http://home.attbi.com/~chris.bagwell/AudioFormats-11.html\n* http://www.pure-mac.com/extkey.html\n* http://cesnet.dl.sourceforge.net/sourceforge/bonkenc/bonk-binary-format-0.9.txt\n* http://www.headbands.com/gspot/\n* http://www.openswf.org/spec/SWFfileformat.html\n* http://j-faul.virtualave.net/\n* http://www.btinternet.com/~AnthonyJ/Atari/programming/avr_format.html\n* http://cui.unige.ch/OSG/info/AudioFormats/ap11.html\n* http://sswf.sourceforge.net/SWFalexref.html\n* http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt\n* http://www-lehre.informatik.uni-osnabrueck.de/~fbstark/diplom/docs/swf/Flash_Uncovered.htm\n* http://developer.apple.com/quicktime/icefloe/dispatch012.html\n* http://www.csdn.net/Dev/Format/graphics/PCD.htm\n* http://tta.iszf.irk.ru/\n* http://www.atsc.org/standards/a_52a.pdf\n* http://www.alanwood.net/unicode/\n* http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html\n* http://www.its.msstate.edu/net/real/reports/config/tags.stats\n* http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt\n* http://brennan.young.net/Comp/LiveStage/things.html\n* http://www.multiweb.cz/twoinches/MP3inside.htm\n* http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended\n* http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/\n* http://www.unicode.org/unicode/faq/utf_bom.html\n* http://tta.corecodec.org/?menu=format\n* http://www.scvi.net/nsvformat.htm\n* http://pda.etsi.org/pda/queryform.asp\n* http://cpansearch.perl.org/src/RGIBSON/Audio-DSS-0.02/lib/Audio/DSS.pm\n* http://trac.musepack.net/trac/wiki/SV8Specification\n* http://wyday.com/cuesharp/specification.php\n* http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Author.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Manages all author-related data\n *\n * Used by {@see SimplePie_Item::get_author()} and {@see SimplePie::get_authors()}\n *\n * This class can be overloaded with {@see SimplePie::set_author_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Author\n{\n\t/**\n\t * Author's name\n\t *\n\t * @var string\n\t * @see get_name()\n\t */\n\tvar $name;\n\n\t/**\n\t * Author's link\n\t *\n\t * @var string\n\t * @see get_link()\n\t */\n\tvar $link;\n\n\t/**\n\t * Author's email address\n\t *\n\t * @var string\n\t * @see get_email()\n\t */\n\tvar $email;\n\n\t/**\n\t * Constructor, used to input the data\n\t *\n\t * @param string $name\n\t * @param string $link\n\t * @param string $email\n\t */\n\tpublic function __construct($name = null, $link = null, $email = null)\n\t{\n\t\t$this->name = $name;\n\t\t$this->link = $link;\n\t\t$this->email = $email;\n\t}\n\n\t/**\n\t * String-ified version\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t// There is no $this->data here\n\t\treturn md5(serialize($this));\n\t}\n\n\t/**\n\t * Author's name\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_name()\n\t{\n\t\tif ($this->name !== null)\n\t\t{\n\t\t\treturn $this->name;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Author's link\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_link()\n\t{\n\t\tif ($this->link !== null)\n\t\t{\n\t\t\treturn $this->link;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Author's email address\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_email()\n\t{\n\t\tif ($this->email !== null)\n\t\t{\n\t\t\treturn $this->email;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Cache/Base.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Base for cache objects\n *\n * Classes to be used with {@see SimplePie_Cache::register()} are expected\n * to implement this interface.\n *\n * @package SimplePie\n * @subpackage Caching\n */\ninterface SimplePie_Cache_Base\n{\n\t/**\n\t * Feed cache type\n\t *\n\t * @var string\n\t */\n\tconst TYPE_FEED = 'spc';\n\n\t/**\n\t * Image cache type\n\t *\n\t * @var string\n\t */\n\tconst TYPE_IMAGE = 'spi';\n\n\t/**\n\t * Create a new cache object\n\t *\n\t * @param string $location Location string (from SimplePie::$cache_location)\n\t * @param string $name Unique ID for the cache\n\t * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data\n\t */\n\tpublic function __construct($location, $name, $type);\n\n\t/**\n\t * Save data to the cache\n\t *\n\t * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property\n\t * @return bool Successfulness\n\t */\n\tpublic function save($data);\n\n\t/**\n\t * Retrieve the data saved to the cache\n\t *\n\t * @return array Data for SimplePie::$data\n\t */\n\tpublic function load();\n\n\t/**\n\t * Retrieve the last modified time for the cache\n\t *\n\t * @return int Timestamp\n\t */\n\tpublic function mtime();\n\n\t/**\n\t * Set the last modified time to the current time\n\t *\n\t * @return bool Success status\n\t */\n\tpublic function touch();\n\n\t/**\n\t * Remove the cache\n\t *\n\t * @return bool Success status\n\t */\n\tpublic function unlink();\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Cache/DB.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Base class for database-based caches\n *\n * @package SimplePie\n * @subpackage Caching\n */\nabstract class SimplePie_Cache_DB implements SimplePie_Cache_Base\n{\n\t/**\n\t * Helper for database conversion\n\t *\n\t * Converts a given {@see SimplePie} object into data to be stored\n\t *\n\t * @param SimplePie $data\n\t * @return array First item is the serialized data for storage, second item is the unique ID for this item\n\t */\n\tprotected static function prepare_simplepie_object_for_cache($data)\n\t{\n\t\t$items = $data->get_items();\n\t\t$items_by_id = array();\n\n\t\tif (!empty($items))\n\t\t{\n\t\t\tforeach ($items as $item)\n\t\t\t{\n\t\t\t\t$items_by_id[$item->get_id()] = $item;\n\t\t\t}\n\n\t\t\tif (count($items_by_id) !== count($items))\n\t\t\t{\n\t\t\t\t$items_by_id = array();\n\t\t\t\tforeach ($items as $item)\n\t\t\t\t{\n\t\t\t\t\t$items_by_id[$item->get_id(true)] = $item;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))\n\t\t\t{\n\t\t\t\t$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];\n\t\t\t}\n\t\t\telseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))\n\t\t\t{\n\t\t\t\t$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];\n\t\t\t}\n\t\t\telseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))\n\t\t\t{\n\t\t\t\t$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];\n\t\t\t}\n\t\t\telseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]))\n\t\t\t{\n\t\t\t\t$channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$channel = null;\n\t\t\t}\n\n\t\t\tif ($channel !== null)\n\t\t\t{\n\t\t\t\tif (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']))\n\t\t\t\t{\n\t\t\t\t\tunset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']);\n\t\t\t\t}\n\t\t\t\tif (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']))\n\t\t\t\t{\n\t\t\t\t\tunset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']);\n\t\t\t\t}\n\t\t\t\tif (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']))\n\t\t\t\t{\n\t\t\t\t\tunset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']);\n\t\t\t\t}\n\t\t\t\tif (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']))\n\t\t\t\t{\n\t\t\t\t\tunset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']);\n\t\t\t\t}\n\t\t\t\tif (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']))\n\t\t\t\t{\n\t\t\t\t\tunset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isset($data->data['items']))\n\t\t\t{\n\t\t\t\tunset($data->data['items']);\n\t\t\t}\n\t\t\tif (isset($data->data['ordered_items']))\n\t\t\t{\n\t\t\t\tunset($data->data['ordered_items']);\n\t\t\t}\n\t\t}\n\t\treturn array(serialize($data->data), $items_by_id);\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Cache/File.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Caches data to the filesystem\n *\n * @package SimplePie\n * @subpackage Caching\n */\nclass SimplePie_Cache_File implements SimplePie_Cache_Base\n{\n\t/**\n\t * Location string\n\t *\n\t * @see SimplePie::$cache_location\n\t * @var string\n\t */\n\tprotected $location;\n\n\t/**\n\t * Filename\n\t *\n\t * @var string\n\t */\n\tprotected $filename;\n\n\t/**\n\t * File extension\n\t *\n\t * @var string\n\t */\n\tprotected $extension;\n\n\t/**\n\t * File path\n\t *\n\t * @var string\n\t */\n\tprotected $name;\n\n\t/**\n\t * Create a new cache object\n\t *\n\t * @param string $location Location string (from SimplePie::$cache_location)\n\t * @param string $name Unique ID for the cache\n\t * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data\n\t */\n\tpublic function __construct($location, $name, $type)\n\t{\n\t\t$this->location = $location;\n\t\t$this->filename = $name;\n\t\t$this->extension = $type;\n\t\t$this->name = \"$this->location/$this->filename.$this->extension\";\n\t}\n\n\t/**\n\t * Save data to the cache\n\t *\n\t * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property\n\t * @return bool Successfulness\n\t */\n\tpublic function save($data)\n\t{\n\t\tif (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))\n\t\t{\n\t\t\tif ($data instanceof SimplePie)\n\t\t\t{\n\t\t\t\t$data = $data->data;\n\t\t\t}\n\n\t\t\t$data = serialize($data);\n\t\t\treturn (bool) file_put_contents($this->name, $data);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Retrieve the data saved to the cache\n\t *\n\t * @return array Data for SimplePie::$data\n\t */\n\tpublic function load()\n\t{\n\t\tif (file_exists($this->name) && is_readable($this->name))\n\t\t{\n\t\t\treturn unserialize(file_get_contents($this->name));\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Retrieve the last modified time for the cache\n\t *\n\t * @return int Timestamp\n\t */\n\tpublic function mtime()\n\t{\n\t\tif (file_exists($this->name))\n\t\t{\n\t\t\treturn filemtime($this->name);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Set the last modified time to the current time\n\t *\n\t * @return bool Success status\n\t */\n\tpublic function touch()\n\t{\n\t\tif (file_exists($this->name))\n\t\t{\n\t\t\treturn touch($this->name);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Remove the cache\n\t *\n\t * @return bool Success status\n\t */\n\tpublic function unlink()\n\t{\n\t\tif (file_exists($this->name))\n\t\t{\n\t\t\treturn unlink($this->name);\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Cache/Memcache.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Caches data to memcache\n *\n * Registered for URLs with the \"memcache\" protocol\n *\n * For example, `memcache://localhost:11211/?timeout=3600&prefix=sp_` will\n * connect to memcache on `localhost` on port 11211. All tables will be\n * prefixed with `sp_` and data will expire after 3600 seconds\n *\n * @package SimplePie\n * @subpackage Caching\n * @uses Memcache\n */\nclass SimplePie_Cache_Memcache implements SimplePie_Cache_Base\n{\n\t/**\n\t * Memcache instance\n\t *\n\t * @var Memcache\n\t */\n\tprotected $cache;\n\n\t/**\n\t * Options\n\t *\n\t * @var array\n\t */\n\tprotected $options;\n\n\t/**\n\t * Cache name\n\t *\n\t * @var string\n\t */\n\tprotected $name;\n\n\t/**\n\t * Create a new cache object\n\t *\n\t * @param string $location Location string (from SimplePie::$cache_location)\n\t * @param string $name Unique ID for the cache\n\t * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data\n\t */\n\tpublic function __construct($location, $name, $type)\n\t{\n\t\t$this->options = array(\n\t\t\t'host' => '127.0.0.1',\n\t\t\t'port' => 11211,\n\t\t\t'extras' => array(\n\t\t\t\t'timeout' => 3600, // one hour\n\t\t\t\t'prefix' => 'simplepie_',\n\t\t\t),\n\t\t);\n\t\t$parsed = SimplePie_Cache::parse_URL($location);\n\t\t$this->options['host'] = empty($parsed['host']) ? $this->options['host'] : $parsed['host'];\n\t\t$this->options['port'] = empty($parsed['port']) ? $this->options['port'] : $parsed['port'];\n\t\t$this->options['extras'] = array_merge($this->options['extras'], $parsed['extras']);\n\t\t$this->name = $this->options['extras']['prefix'] . md5(\"$name:$type\");\n\n\t\t$this->cache = new Memcache();\n\t\t$this->cache->addServer($this->options['host'], (int) $this->options['port']);\n\t}\n\n\t/**\n\t * Save data to the cache\n\t *\n\t * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property\n\t * @return bool Successfulness\n\t */\n\tpublic function save($data)\n\t{\n\t\tif ($data instanceof SimplePie)\n\t\t{\n\t\t\t$data = $data->data;\n\t\t}\n\t\treturn $this->cache->set($this->name, serialize($data), MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']);\n\t}\n\n\t/**\n\t * Retrieve the data saved to the cache\n\t *\n\t * @return array Data for SimplePie::$data\n\t */\n\tpublic function load()\n\t{\n\t\t$data = $this->cache->get($this->name);\n\n\t\tif ($data !== false)\n\t\t{\n\t\t\treturn unserialize($data);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Retrieve the last modified time for the cache\n\t *\n\t * @return int Timestamp\n\t */\n\tpublic function mtime()\n\t{\n\t\t$data = $this->cache->get($this->name);\n\n\t\tif ($data !== false)\n\t\t{\n\t\t\t// essentially ignore the mtime because Memcache expires on it's own\n\t\t\treturn time();\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Set the last modified time to the current time\n\t *\n\t * @return bool Success status\n\t */\n\tpublic function touch()\n\t{\n\t\t$data = $this->cache->get($this->name);\n\n\t\tif ($data !== false)\n\t\t{\n\t\t\treturn $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->duration);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Remove the cache\n\t *\n\t * @return bool Success status\n\t */\n\tpublic function unlink()\n\t{\n\t\treturn $this->cache->delete($this->name, 0);\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Cache/MySQL.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Caches data to a MySQL database\n *\n * Registered for URLs with the \"mysql\" protocol\n *\n * For example, `mysql://root:password@localhost:3306/mydb?prefix=sp_` will\n * connect to the `mydb` database on `localhost` on port 3306, with the user\n * `root` and the password `password`. All tables will be prefixed with `sp_`\n *\n * @package SimplePie\n * @subpackage Caching\n */\nclass SimplePie_Cache_MySQL extends SimplePie_Cache_DB\n{\n\t/**\n\t * PDO instance\n\t *\n\t * @var PDO\n\t */\n\tprotected $mysql;\n\n\t/**\n\t * Options\n\t *\n\t * @var array\n\t */\n\tprotected $options;\n\n\t/**\n\t * Cache ID\n\t *\n\t * @var string\n\t */\n\tprotected $id;\n\n\t/**\n\t * Create a new cache object\n\t *\n\t * @param string $location Location string (from SimplePie::$cache_location)\n\t * @param string $name Unique ID for the cache\n\t * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data\n\t */\n\tpublic function __construct($location, $name, $type)\n\t{\n\t\t$this->options = array(\n\t\t\t'user' => null,\n\t\t\t'pass' => null,\n\t\t\t'host' => '127.0.0.1',\n\t\t\t'port' => '3306',\n\t\t\t'path' => '',\n\t\t\t'extras' => array(\n\t\t\t\t'prefix' => '',\n\t\t\t),\n\t\t);\n\t\t$this->options = array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));\n\n\t\t// Path is prefixed with a \"/\"\n\t\t$this->options['dbname'] = substr($this->options['path'], 1);\n\n\t\ttry\n\t\t{\n\t\t\t$this->mysql = new PDO(\"mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}\", $this->options['user'], $this->options['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));\n\t\t}\n\t\tcatch (PDOException $e)\n\t\t{\n\t\t\t$this->mysql = null;\n\t\t\treturn;\n\t\t}\n\n\t\t$this->id = $name . $type;\n\n\t\tif (!$query = $this->mysql->query('SHOW TABLES'))\n\t\t{\n\t\t\t$this->mysql = null;\n\t\t\treturn;\n\t\t}\n\n\t\t$db = array();\n\t\twhile ($row = $query->fetchColumn())\n\t\t{\n\t\t\t$db[] = $row;\n\t\t}\n\n\t\tif (!in_array($this->options['extras']['prefix'] . 'cache_data', $db))\n\t\t{\n\t\t\t$query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))');\n\t\t\tif ($query === false)\n\t\t\t{\n\t\t\t\t$this->mysql = null;\n\t\t\t}\n\t\t}\n\n\t\tif (!in_array($this->options['extras']['prefix'] . 'items', $db))\n\t\t{\n\t\t\t$query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))');\n\t\t\tif ($query === false)\n\t\t\t{\n\t\t\t\t$this->mysql = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Save data to the cache\n\t *\n\t * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property\n\t * @return bool Successfulness\n\t */\n\tpublic function save($data)\n\t{\n\t\tif ($this->mysql === null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\tif ($data instanceof SimplePie)\n\t\t{\n\t\t\t$data = clone $data;\n\n\t\t\t$prepared = self::prepare_simplepie_object_for_cache($data);\n\n\t\t\t$query = $this->mysql->prepare('SELECT COUNT(*) FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed');\n\t\t\t$query->bindValue(':feed', $this->id);\n\t\t\tif ($query->execute())\n\t\t\t{\n\t\t\t\tif ($query->fetchColumn() > 0)\n\t\t\t\t{\n\t\t\t\t\t$items = count($prepared[1]);\n\t\t\t\t\tif ($items)\n\t\t\t\t\t{\n\t\t\t\t\t\t$sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = :items, `data` = :data, `mtime` = :time WHERE `id` = :feed';\n\t\t\t\t\t\t$query = $this->mysql->prepare($sql);\n\t\t\t\t\t\t$query->bindValue(':items', $items);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `data` = :data, `mtime` = :time WHERE `id` = :feed';\n\t\t\t\t\t\t$query = $this->mysql->prepare($sql);\n\t\t\t\t\t}\n\n\t\t\t\t\t$query->bindValue(':data', $prepared[0]);\n\t\t\t\t\t$query->bindValue(':time', time());\n\t\t\t\t\t$query->bindValue(':feed', $this->id);\n\t\t\t\t\tif (!$query->execute())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:feed, :count, :data, :time)');\n\t\t\t\t\t$query->bindValue(':feed', $this->id);\n\t\t\t\t\t$query->bindValue(':count', count($prepared[1]));\n\t\t\t\t\t$query->bindValue(':data', $prepared[0]);\n\t\t\t\t\t$query->bindValue(':time', time());\n\t\t\t\t\tif (!$query->execute())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$ids = array_keys($prepared[1]);\n\t\t\t\tif (!empty($ids))\n\t\t\t\t{\n\t\t\t\t\tforeach ($ids as $id)\n\t\t\t\t\t{\n\t\t\t\t\t\t$database_ids[] = $this->mysql->quote($id);\n\t\t\t\t\t}\n\n\t\t\t\t\t$query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `id` = ' . implode(' OR `id` = ', $database_ids) . ' AND `feed_id` = :feed');\n\t\t\t\t\t$query->bindValue(':feed', $this->id);\n\n\t\t\t\t\tif ($query->execute())\n\t\t\t\t\t{\n\t\t\t\t\t\t$existing_ids = array();\n\t\t\t\t\t\twhile ($row = $query->fetchColumn())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$existing_ids[] = $row;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$new_ids = array_diff($ids, $existing_ids);\n\n\t\t\t\t\t\tforeach ($new_ids as $new_id)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (!($date = $prepared[1][$new_id]->get_date('U')))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$date = time();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(:feed, :id, :data, :date)');\n\t\t\t\t\t\t\t$query->bindValue(':feed', $this->id);\n\t\t\t\t\t\t\t$query->bindValue(':id', $new_id);\n\t\t\t\t\t\t\t$query->bindValue(':data', serialize($prepared[1][$new_id]->data));\n\t\t\t\t\t\t\t$query->bindValue(':date', $date);\n\t\t\t\t\t\t\tif (!$query->execute())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed');\n\t\t\t$query->bindValue(':feed', $this->id);\n\t\t\tif ($query->execute())\n\t\t\t{\n\t\t\t\tif ($query->rowCount() > 0)\n\t\t\t\t{\n\t\t\t\t\t$query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = 0, `data` = :data, `mtime` = :time WHERE `id` = :feed');\n\t\t\t\t\t$query->bindValue(':data', serialize($data));\n\t\t\t\t\t$query->bindValue(':time', time());\n\t\t\t\t\t$query->bindValue(':feed', $this->id);\n\t\t\t\t\tif ($this->execute())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:id, 0, :data, :time)');\n\t\t\t\t\t$query->bindValue(':id', $this->id);\n\t\t\t\t\t$query->bindValue(':data', serialize($data));\n\t\t\t\t\t$query->bindValue(':time', time());\n\t\t\t\t\tif ($query->execute())\n\t\t\t\t\t{\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Retrieve the data saved to the cache\n\t *\n\t * @return array Data for SimplePie::$data\n\t */\n\tpublic function load()\n\t{\n\t\tif ($this->mysql === null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t$query = $this->mysql->prepare('SELECT `items`, `data` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');\n\t\t$query->bindValue(':id', $this->id);\n\t\tif ($query->execute() && ($row = $query->fetch()))\n\t\t{\n\t\t\t$data = unserialize($row[1]);\n\n\t\t\tif (isset($this->options['items'][0]))\n\t\t\t{\n\t\t\t\t$items = (int) $this->options['items'][0];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$items = (int) $row[0];\n\t\t\t}\n\n\t\t\tif ($items !== 0)\n\t\t\t{\n\t\t\t\tif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))\n\t\t\t\t{\n\t\t\t\t\t$feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];\n\t\t\t\t}\n\t\t\t\telseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))\n\t\t\t\t{\n\t\t\t\t\t$feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];\n\t\t\t\t}\n\t\t\t\telseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))\n\t\t\t\t{\n\t\t\t\t\t$feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];\n\t\t\t\t}\n\t\t\t\telseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]))\n\t\t\t\t{\n\t\t\t\t\t$feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$feed = null;\n\t\t\t\t}\n\n\t\t\t\tif ($feed !== null)\n\t\t\t\t{\n\t\t\t\t\t$sql = 'SELECT `data` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :feed ORDER BY `posted` DESC';\n\t\t\t\t\tif ($items > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t$sql .= ' LIMIT ' . $items;\n\t\t\t\t\t}\n\n\t\t\t\t\t$query = $this->mysql->prepare($sql);\n\t\t\t\t\t$query->bindValue(':feed', $this->id);\n\t\t\t\t\tif ($query->execute())\n\t\t\t\t\t{\n\t\t\t\t\t\twhile ($row = $query->fetchColumn())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn $data;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Retrieve the last modified time for the cache\n\t *\n\t * @return int Timestamp\n\t */\n\tpublic function mtime()\n\t{\n\t\tif ($this->mysql === null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t$query = $this->mysql->prepare('SELECT `mtime` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');\n\t\t$query->bindValue(':id', $this->id);\n\t\tif ($query->execute() && ($time = $query->fetchColumn()))\n\t\t{\n\t\t\treturn $time;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Set the last modified time to the current time\n\t *\n\t * @return bool Success status\n\t */\n\tpublic function touch()\n\t{\n\t\tif ($this->mysql === null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t$query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id');\n\t\t$query->bindValue(':time', time());\n\t\t$query->bindValue(':id', $this->id);\n\t\tif ($query->execute() && $query->rowCount() > 0)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Remove the cache\n\t *\n\t * @return bool Success status\n\t */\n\tpublic function unlink()\n\t{\n\t\tif ($this->mysql === null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t$query = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');\n\t\t$query->bindValue(':id', $this->id);\n\t\t$query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id');\n\t\t$query2->bindValue(':id', $this->id);\n\t\tif ($query->execute() && $query2->execute())\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Cache.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Used to create cache objects\n *\n * This class can be overloaded with {@see SimplePie::set_cache_class()},\n * although the preferred way is to create your own handler\n * via {@see register()}\n *\n * @package SimplePie\n * @subpackage Caching\n */\nclass SimplePie_Cache\n{\n\t/**\n\t * Cache handler classes\n\t *\n\t * These receive 3 parameters to their constructor, as documented in\n\t * {@see register()}\n\t * @var array\n\t */\n\tprotected static $handlers = array(\n\t\t'mysql' => 'SimplePie_Cache_MySQL',\n\t\t'memcache' => 'SimplePie_Cache_Memcache',\n\t);\n\n\t/**\n\t * Don't call the constructor. Please.\n\t */\n\tprivate function __construct() { }\n\n\t/**\n\t * Create a new SimplePie_Cache object\n\t *\n\t * @param string $location URL location (scheme is used to determine handler)\n\t * @param string $filename Unique identifier for cache object\n\t * @param string $extension 'spi' or 'spc'\n\t * @return SimplePie_Cache_Base Type of object depends on scheme of `$location`\n\t */\n\tpublic static function get_handler($location, $filename, $extension)\n\t{\n\t\t$type = explode(':', $location, 2);\n\t\t$type = $type[0];\n\t\tif (!empty(self::$handlers[$type]))\n\t\t{\n\t\t\t$class = self::$handlers[$type];\n\t\t\treturn new $class($location, $filename, $extension);\n\t\t}\n\n\t\treturn new SimplePie_Cache_File($location, $filename, $extension);\n\t}\n\n\t/**\n\t * Create a new SimplePie_Cache object\n\t *\n\t * @deprecated Use {@see get_handler} instead\n\t */\n\tpublic function create($location, $filename, $extension)\n\t{\n\t\ttrigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED);\n\t\treturn self::get_handler($location, $filename, $extension);\n\t}\n\n\t/**\n\t * Register a handler\n\t *\n\t * @param string $type DSN type to register for\n\t * @param string $class Name of handler class. Must implement SimplePie_Cache_Base\n\t */\n\tpublic static function register($type, $class)\n\t{\n\t\tself::$handlers[$type] = $class;\n\t}\n\n\t/**\n\t * Parse a URL into an array\n\t *\n\t * @param string $url\n\t * @return array\n\t */\n\tpublic static function parse_URL($url)\n\t{\n\t\t$params = parse_url($url);\n\t\t$params['extras'] = array();\n\t\tif (isset($params['query']))\n\t\t{\n\t\t\tparse_str($params['query'], $params['extras']);\n\t\t}\n\t\treturn $params;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Caption.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * Handles `<media:text>` captions as defined in Media RSS.\n *\n * Used by {@see SimplePie_Enclosure::get_caption()} and {@see SimplePie_Enclosure::get_captions()}\n *\n * This class can be overloaded with {@see SimplePie::set_caption_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Caption\n{\n\t/**\n\t * Content type\n\t *\n\t * @var string\n\t * @see get_type()\n\t */\n\tvar $type;\n\n\t/**\n\t * Language\n\t *\n\t * @var string\n\t * @see get_language()\n\t */\n\tvar $lang;\n\n\t/**\n\t * Start time\n\t *\n\t * @var string\n\t * @see get_starttime()\n\t */\n\tvar $startTime;\n\n\t/**\n\t * End time\n\t *\n\t * @var string\n\t * @see get_endtime()\n\t */\n\tvar $endTime;\n\n\t/**\n\t * Caption text\n\t *\n\t * @var string\n\t * @see get_text()\n\t */\n\tvar $text;\n\n\t/**\n\t * Constructor, used to input the data\n\t *\n\t * For documentation on all the parameters, see the corresponding\n\t * properties and their accessors\n\t */\n\tpublic function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)\n\t{\n\t\t$this->type = $type;\n\t\t$this->lang = $lang;\n\t\t$this->startTime = $startTime;\n\t\t$this->endTime = $endTime;\n\t\t$this->text = $text;\n\t}\n\n\t/**\n\t * String-ified version\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t// There is no $this->data here\n\t\treturn md5(serialize($this));\n\t}\n\n\t/**\n\t * Get the end time\n\t *\n\t * @return string|null Time in the format 'hh:mm:ss.SSS'\n\t */\n\tpublic function get_endtime()\n\t{\n\t\tif ($this->endTime !== null)\n\t\t{\n\t\t\treturn $this->endTime;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the language\n\t *\n\t * @link http://tools.ietf.org/html/rfc3066\n\t * @return string|null Language code as per RFC 3066\n\t */\n\tpublic function get_language()\n\t{\n\t\tif ($this->lang !== null)\n\t\t{\n\t\t\treturn $this->lang;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the start time\n\t *\n\t * @return string|null Time in the format 'hh:mm:ss.SSS'\n\t */\n\tpublic function get_starttime()\n\t{\n\t\tif ($this->startTime !== null)\n\t\t{\n\t\t\treturn $this->startTime;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the text of the caption\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_text()\n\t{\n\t\tif ($this->text !== null)\n\t\t{\n\t\t\treturn $this->text;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the content type (not MIME type)\n\t *\n\t * @return string|null Either 'text' or 'html'\n\t */\n\tpublic function get_type()\n\t{\n\t\tif ($this->type !== null)\n\t\t{\n\t\t\treturn $this->type;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Category.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Manages all category-related data\n *\n * Used by {@see SimplePie_Item::get_category()} and {@see SimplePie_Item::get_categories()}\n *\n * This class can be overloaded with {@see SimplePie::set_category_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Category\n{\n\t/**\n\t * Category identifier\n\t *\n\t * @var string\n\t * @see get_term\n\t */\n\tvar $term;\n\n\t/**\n\t * Categorization scheme identifier\n\t *\n\t * @var string\n\t * @see get_scheme()\n\t */\n\tvar $scheme;\n\n\t/**\n\t * Human readable label\n\t *\n\t * @var string\n\t * @see get_label()\n\t */\n\tvar $label;\n\n\t/**\n\t * Constructor, used to input the data\n\t *\n\t * @param string $term\n\t * @param string $scheme\n\t * @param string $label\n\t */\n\tpublic function __construct($term = null, $scheme = null, $label = null)\n\t{\n\t\t$this->term = $term;\n\t\t$this->scheme = $scheme;\n\t\t$this->label = $label;\n\t}\n\n\t/**\n\t * String-ified version\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t// There is no $this->data here\n\t\treturn md5(serialize($this));\n\t}\n\n\t/**\n\t * Get the category identifier\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_term()\n\t{\n\t\tif ($this->term !== null)\n\t\t{\n\t\t\treturn $this->term;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the categorization scheme identifier\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_scheme()\n\t{\n\t\tif ($this->scheme !== null)\n\t\t{\n\t\t\treturn $this->scheme;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the human readable label\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_label()\n\t{\n\t\tif ($this->label !== null)\n\t\t{\n\t\t\treturn $this->label;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $this->get_term();\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Content/Type/Sniffer.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * Content-type sniffing\n *\n * Based on the rules in http://tools.ietf.org/html/draft-abarth-mime-sniff-06\n *\n * This is used since we can't always trust Content-Type headers, and is based\n * upon the HTML5 parsing rules.\n *\n *\n * This class can be overloaded with {@see SimplePie::set_content_type_sniffer_class()}\n *\n * @package SimplePie\n * @subpackage HTTP\n */\nclass SimplePie_Content_Type_Sniffer\n{\n\t/**\n\t * File object\n\t *\n\t * @var SimplePie_File\n\t */\n\tvar $file;\n\n\t/**\n\t * Create an instance of the class with the input file\n\t *\n\t * @param SimplePie_Content_Type_Sniffer $file Input file\n\t */\n\tpublic function __construct($file)\n\t{\n\t\t$this->file = $file;\n\t}\n\n\t/**\n\t * Get the Content-Type of the specified file\n\t *\n\t * @return string Actual Content-Type\n\t */\n\tpublic function get_type()\n\t{\n\t\tif (isset($this->file->headers['content-type']))\n\t\t{\n\t\t\tif (!isset($this->file->headers['content-encoding'])\n\t\t\t\t&& ($this->file->headers['content-type'] === 'text/plain'\n\t\t\t\t\t|| $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'\n\t\t\t\t\t|| $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'\n\t\t\t\t\t|| $this->file->headers['content-type'] === 'text/plain; charset=UTF-8'))\n\t\t\t{\n\t\t\t\treturn $this->text_or_binary();\n\t\t\t}\n\n\t\t\tif (($pos = strpos($this->file->headers['content-type'], ';')) !== false)\n\t\t\t{\n\t\t\t\t$official = substr($this->file->headers['content-type'], 0, $pos);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$official = $this->file->headers['content-type'];\n\t\t\t}\n\t\t\t$official = trim(strtolower($official));\n\n\t\t\tif ($official === 'unknown/unknown'\n\t\t\t\t|| $official === 'application/unknown')\n\t\t\t{\n\t\t\t\treturn $this->unknown();\n\t\t\t}\n\t\t\telseif (substr($official, -4) === '+xml'\n\t\t\t\t|| $official === 'text/xml'\n\t\t\t\t|| $official === 'application/xml')\n\t\t\t{\n\t\t\t\treturn $official;\n\t\t\t}\n\t\t\telseif (substr($official, 0, 6) === 'image/')\n\t\t\t{\n\t\t\t\tif ($return = $this->image())\n\t\t\t\t{\n\t\t\t\t\treturn $return;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn $official;\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($official === 'text/html')\n\t\t\t{\n\t\t\t\treturn $this->feed_or_html();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn $official;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $this->unknown();\n\t\t}\n\t}\n\n\t/**\n\t * Sniff text or binary\n\t *\n\t * @return string Actual Content-Type\n\t */\n\tpublic function text_or_binary()\n\t{\n\t\tif (substr($this->file->body, 0, 2) === \"\\xFE\\xFF\"\n\t\t\t|| substr($this->file->body, 0, 2) === \"\\xFF\\xFE\"\n\t\t\t|| substr($this->file->body, 0, 4) === \"\\x00\\x00\\xFE\\xFF\"\n\t\t\t|| substr($this->file->body, 0, 3) === \"\\xEF\\xBB\\xBF\")\n\t\t{\n\t\t\treturn 'text/plain';\n\t\t}\n\t\telseif (preg_match('/[\\x00-\\x08\\x0E-\\x1A\\x1C-\\x1F]/', $this->file->body))\n\t\t{\n\t\t\treturn 'application/octect-stream';\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 'text/plain';\n\t\t}\n\t}\n\n\t/**\n\t * Sniff unknown\n\t *\n\t * @return string Actual Content-Type\n\t */\n\tpublic function unknown()\n\t{\n\t\t$ws = strspn($this->file->body, \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\");\n\t\tif (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html'\n\t\t\t|| strtolower(substr($this->file->body, $ws, 5)) === '<html'\n\t\t\t|| strtolower(substr($this->file->body, $ws, 7)) === '<script')\n\t\t{\n\t\t\treturn 'text/html';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 5) === '%PDF-')\n\t\t{\n\t\t\treturn 'application/pdf';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-')\n\t\t{\n\t\t\treturn 'application/postscript';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 6) === 'GIF87a'\n\t\t\t|| substr($this->file->body, 0, 6) === 'GIF89a')\n\t\t{\n\t\t\treturn 'image/gif';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 8) === \"\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A\")\n\t\t{\n\t\t\treturn 'image/png';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 3) === \"\\xFF\\xD8\\xFF\")\n\t\t{\n\t\t\treturn 'image/jpeg';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 2) === \"\\x42\\x4D\")\n\t\t{\n\t\t\treturn 'image/bmp';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 4) === \"\\x00\\x00\\x01\\x00\")\n\t\t{\n\t\t\treturn 'image/vnd.microsoft.icon';\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $this->text_or_binary();\n\t\t}\n\t}\n\n\t/**\n\t * Sniff images\n\t *\n\t * @return string Actual Content-Type\n\t */\n\tpublic function image()\n\t{\n\t\tif (substr($this->file->body, 0, 6) === 'GIF87a'\n\t\t\t|| substr($this->file->body, 0, 6) === 'GIF89a')\n\t\t{\n\t\t\treturn 'image/gif';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 8) === \"\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A\")\n\t\t{\n\t\t\treturn 'image/png';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 3) === \"\\xFF\\xD8\\xFF\")\n\t\t{\n\t\t\treturn 'image/jpeg';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 2) === \"\\x42\\x4D\")\n\t\t{\n\t\t\treturn 'image/bmp';\n\t\t}\n\t\telseif (substr($this->file->body, 0, 4) === \"\\x00\\x00\\x01\\x00\")\n\t\t{\n\t\t\treturn 'image/vnd.microsoft.icon';\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Sniff HTML\n\t *\n\t * @return string Actual Content-Type\n\t */\n\tpublic function feed_or_html()\n\t{\n\t\t$len = strlen($this->file->body);\n\t\t$pos = strspn($this->file->body, \"\\x09\\x0A\\x0D\\x20\");\n\n\t\twhile ($pos < $len)\n\t\t{\n\t\t\tswitch ($this->file->body[$pos])\n\t\t\t{\n\t\t\t\tcase \"\\x09\":\n\t\t\t\tcase \"\\x0A\":\n\t\t\t\tcase \"\\x0D\":\n\t\t\t\tcase \"\\x20\":\n\t\t\t\t\t$pos += strspn($this->file->body, \"\\x09\\x0A\\x0D\\x20\", $pos);\n\t\t\t\t\tcontinue 2;\n\n\t\t\t\tcase '<':\n\t\t\t\t\t$pos++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn 'text/html';\n\t\t\t}\n\n\t\t\tif (substr($this->file->body, $pos, 3) === '!--')\n\t\t\t{\n\t\t\t\t$pos += 3;\n\t\t\t\tif ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false)\n\t\t\t\t{\n\t\t\t\t\t$pos += 3;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn 'text/html';\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif (substr($this->file->body, $pos, 1) === '!')\n\t\t\t{\n\t\t\t\tif ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false)\n\t\t\t\t{\n\t\t\t\t\t$pos++;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn 'text/html';\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif (substr($this->file->body, $pos, 1) === '?')\n\t\t\t{\n\t\t\t\tif ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false)\n\t\t\t\t{\n\t\t\t\t\t$pos += 2;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn 'text/html';\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif (substr($this->file->body, $pos, 3) === 'rss'\n\t\t\t\t|| substr($this->file->body, $pos, 7) === 'rdf:RDF')\n\t\t\t{\n\t\t\t\treturn 'application/rss+xml';\n\t\t\t}\n\t\t\telseif (substr($this->file->body, $pos, 4) === 'feed')\n\t\t\t{\n\t\t\t\treturn 'application/atom+xml';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn 'text/html';\n\t\t\t}\n\t\t}\n\n\t\treturn 'text/html';\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Copyright.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Manages `<media:copyright>` copyright tags as defined in Media RSS\n *\n * Used by {@see SimplePie_Enclosure::get_copyright()}\n *\n * This class can be overloaded with {@see SimplePie::set_copyright_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Copyright\n{\n\t/**\n\t * Copyright URL\n\t *\n\t * @var string\n\t * @see get_url()\n\t */\n\tvar $url;\n\n\t/**\n\t * Attribution\n\t *\n\t * @var string\n\t * @see get_attribution()\n\t */\n\tvar $label;\n\n\t/**\n\t * Constructor, used to input the data\n\t *\n\t * For documentation on all the parameters, see the corresponding\n\t * properties and their accessors\n\t */\n\tpublic function __construct($url = null, $label = null)\n\t{\n\t\t$this->url = $url;\n\t\t$this->label = $label;\n\t}\n\n\t/**\n\t * String-ified version\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t// There is no $this->data here\n\t\treturn md5(serialize($this));\n\t}\n\n\t/**\n\t * Get the copyright URL\n\t *\n\t * @return string|null URL to copyright information\n\t */\n\tpublic function get_url()\n\t{\n\t\tif ($this->url !== null)\n\t\t{\n\t\t\treturn $this->url;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the attribution text\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_attribution()\n\t{\n\t\tif ($this->label !== null)\n\t\t{\n\t\t\treturn $this->label;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Core.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2009, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * SimplePie class.\n *\n * Class for backward compatibility.\n *\n * @deprecated Use {@see SimplePie} directly\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Core extends SimplePie\n{\n\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Credit.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Handles `<media:credit>` as defined in Media RSS\n *\n * Used by {@see SimplePie_Enclosure::get_credit()} and {@see SimplePie_Enclosure::get_credits()}\n *\n * This class can be overloaded with {@see SimplePie::set_credit_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Credit\n{\n\t/**\n\t * Credited role\n\t *\n\t * @var string\n\t * @see get_role()\n\t */\n\tvar $role;\n\n\t/**\n\t * Organizational scheme\n\t *\n\t * @var string\n\t * @see get_scheme()\n\t */\n\tvar $scheme;\n\n\t/**\n\t * Credited name\n\t *\n\t * @var string\n\t * @see get_name()\n\t */\n\tvar $name;\n\n\t/**\n\t * Constructor, used to input the data\n\t *\n\t * For documentation on all the parameters, see the corresponding\n\t * properties and their accessors\n\t */\n\tpublic function __construct($role = null, $scheme = null, $name = null)\n\t{\n\t\t$this->role = $role;\n\t\t$this->scheme = $scheme;\n\t\t$this->name = $name;\n\t}\n\n\t/**\n\t * String-ified version\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t// There is no $this->data here\n\t\treturn md5(serialize($this));\n\t}\n\n\t/**\n\t * Get the role of the person receiving credit\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_role()\n\t{\n\t\tif ($this->role !== null)\n\t\t{\n\t\t\treturn $this->role;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the organizational scheme\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_scheme()\n\t{\n\t\tif ($this->scheme !== null)\n\t\t{\n\t\t\treturn $this->scheme;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the credited person/entity's name\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_name()\n\t{\n\t\tif ($this->name !== null)\n\t\t{\n\t\t\treturn $this->name;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Decode/HTML/Entities.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * Decode HTML Entities\n *\n * This implements HTML5 as of revision 967 (2007-06-28)\n *\n * @deprecated Use DOMDocument instead!\n * @package SimplePie\n */\nclass SimplePie_Decode_HTML_Entities\n{\n\t/**\n\t * Data to be parsed\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tvar $data = '';\n\n\t/**\n\t * Currently consumed bytes\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tvar $consumed = '';\n\n\t/**\n\t * Position of the current byte being parsed\n\t *\n\t * @access private\n\t * @var int\n\t */\n\tvar $position = 0;\n\n\t/**\n\t * Create an instance of the class with the input data\n\t *\n\t * @access public\n\t * @param string $data Input data\n\t */\n\tpublic function __construct($data)\n\t{\n\t\t$this->data = $data;\n\t}\n\n\t/**\n\t * Parse the input data\n\t *\n\t * @access public\n\t * @return string Output data\n\t */\n\tpublic function parse()\n\t{\n\t\twhile (($this->position = strpos($this->data, '&', $this->position)) !== false)\n\t\t{\n\t\t\t$this->consume();\n\t\t\t$this->entity();\n\t\t\t$this->consumed = '';\n\t\t}\n\t\treturn $this->data;\n\t}\n\n\t/**\n\t * Consume the next byte\n\t *\n\t * @access private\n\t * @return mixed The next byte, or false, if there is no more data\n\t */\n\tpublic function consume()\n\t{\n\t\tif (isset($this->data[$this->position]))\n\t\t{\n\t\t\t$this->consumed .= $this->data[$this->position];\n\t\t\treturn $this->data[$this->position++];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Consume a range of characters\n\t *\n\t * @access private\n\t * @param string $chars Characters to consume\n\t * @return mixed A series of characters that match the range, or false\n\t */\n\tpublic function consume_range($chars)\n\t{\n\t\tif ($len = strspn($this->data, $chars, $this->position))\n\t\t{\n\t\t\t$data = substr($this->data, $this->position, $len);\n\t\t\t$this->consumed .= $data;\n\t\t\t$this->position += $len;\n\t\t\treturn $data;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Unconsume one byte\n\t *\n\t * @access private\n\t */\n\tpublic function unconsume()\n\t{\n\t\t$this->consumed = substr($this->consumed, 0, -1);\n\t\t$this->position--;\n\t}\n\n\t/**\n\t * Decode an entity\n\t *\n\t * @access private\n\t */\n\tpublic function entity()\n\t{\n\t\tswitch ($this->consume())\n\t\t{\n\t\t\tcase \"\\x09\":\n\t\t\tcase \"\\x0A\":\n\t\t\tcase \"\\x0B\":\n\t\t\tcase \"\\x0B\":\n\t\t\tcase \"\\x0C\":\n\t\t\tcase \"\\x20\":\n\t\t\tcase \"\\x3C\":\n\t\t\tcase \"\\x26\":\n\t\t\tcase false:\n\t\t\t\tbreak;\n\n\t\t\tcase \"\\x23\":\n\t\t\t\tswitch ($this->consume())\n\t\t\t\t{\n\t\t\t\t\tcase \"\\x78\":\n\t\t\t\t\tcase \"\\x58\":\n\t\t\t\t\t\t$range = '0123456789ABCDEFabcdef';\n\t\t\t\t\t\t$hex = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$range = '0123456789';\n\t\t\t\t\t\t$hex = false;\n\t\t\t\t\t\t$this->unconsume();\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ($codepoint = $this->consume_range($range))\n\t\t\t\t{\n\t\t\t\t\tstatic $windows_1252_specials = array(0x0D => \"\\x0A\", 0x80 => \"\\xE2\\x82\\xAC\", 0x81 => \"\\xEF\\xBF\\xBD\", 0x82 => \"\\xE2\\x80\\x9A\", 0x83 => \"\\xC6\\x92\", 0x84 => \"\\xE2\\x80\\x9E\", 0x85 => \"\\xE2\\x80\\xA6\", 0x86 => \"\\xE2\\x80\\xA0\", 0x87 => \"\\xE2\\x80\\xA1\", 0x88 => \"\\xCB\\x86\", 0x89 => \"\\xE2\\x80\\xB0\", 0x8A => \"\\xC5\\xA0\", 0x8B => \"\\xE2\\x80\\xB9\", 0x8C => \"\\xC5\\x92\", 0x8D => \"\\xEF\\xBF\\xBD\", 0x8E => \"\\xC5\\xBD\", 0x8F => \"\\xEF\\xBF\\xBD\", 0x90 => \"\\xEF\\xBF\\xBD\", 0x91 => \"\\xE2\\x80\\x98\", 0x92 => \"\\xE2\\x80\\x99\", 0x93 => \"\\xE2\\x80\\x9C\", 0x94 => \"\\xE2\\x80\\x9D\", 0x95 => \"\\xE2\\x80\\xA2\", 0x96 => \"\\xE2\\x80\\x93\", 0x97 => \"\\xE2\\x80\\x94\", 0x98 => \"\\xCB\\x9C\", 0x99 => \"\\xE2\\x84\\xA2\", 0x9A => \"\\xC5\\xA1\", 0x9B => \"\\xE2\\x80\\xBA\", 0x9C => \"\\xC5\\x93\", 0x9D => \"\\xEF\\xBF\\xBD\", 0x9E => \"\\xC5\\xBE\", 0x9F => \"\\xC5\\xB8\");\n\n\t\t\t\t\tif ($hex)\n\t\t\t\t\t{\n\t\t\t\t\t\t$codepoint = hexdec($codepoint);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$codepoint = intval($codepoint);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isset($windows_1252_specials[$codepoint]))\n\t\t\t\t\t{\n\t\t\t\t\t\t$replacement = $windows_1252_specials[$codepoint];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!in_array($this->consume(), array(';', false), true))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->unconsume();\n\t\t\t\t\t}\n\n\t\t\t\t\t$consumed_length = strlen($this->consumed);\n\t\t\t\t\t$this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);\n\t\t\t\t\t$this->position += strlen($replacement) - $consumed_length;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tstatic $entities = array(\n\t\t\t\t\t'Aacute' => \"\\xC3\\x81\",\n\t\t\t\t\t'aacute' => \"\\xC3\\xA1\",\n\t\t\t\t\t'Aacute;' => \"\\xC3\\x81\",\n\t\t\t\t\t'aacute;' => \"\\xC3\\xA1\",\n\t\t\t\t\t'Acirc' => \"\\xC3\\x82\",\n\t\t\t\t\t'acirc' => \"\\xC3\\xA2\",\n\t\t\t\t\t'Acirc;' => \"\\xC3\\x82\",\n\t\t\t\t\t'acirc;' => \"\\xC3\\xA2\",\n\t\t\t\t\t'acute' => \"\\xC2\\xB4\",\n\t\t\t\t\t'acute;' => \"\\xC2\\xB4\",\n\t\t\t\t\t'AElig' => \"\\xC3\\x86\",\n\t\t\t\t\t'aelig' => \"\\xC3\\xA6\",\n\t\t\t\t\t'AElig;' => \"\\xC3\\x86\",\n\t\t\t\t\t'aelig;' => \"\\xC3\\xA6\",\n\t\t\t\t\t'Agrave' => \"\\xC3\\x80\",\n\t\t\t\t\t'agrave' => \"\\xC3\\xA0\",\n\t\t\t\t\t'Agrave;' => \"\\xC3\\x80\",\n\t\t\t\t\t'agrave;' => \"\\xC3\\xA0\",\n\t\t\t\t\t'alefsym;' => \"\\xE2\\x84\\xB5\",\n\t\t\t\t\t'Alpha;' => \"\\xCE\\x91\",\n\t\t\t\t\t'alpha;' => \"\\xCE\\xB1\",\n\t\t\t\t\t'AMP' => \"\\x26\",\n\t\t\t\t\t'amp' => \"\\x26\",\n\t\t\t\t\t'AMP;' => \"\\x26\",\n\t\t\t\t\t'amp;' => \"\\x26\",\n\t\t\t\t\t'and;' => \"\\xE2\\x88\\xA7\",\n\t\t\t\t\t'ang;' => \"\\xE2\\x88\\xA0\",\n\t\t\t\t\t'apos;' => \"\\x27\",\n\t\t\t\t\t'Aring' => \"\\xC3\\x85\",\n\t\t\t\t\t'aring' => \"\\xC3\\xA5\",\n\t\t\t\t\t'Aring;' => \"\\xC3\\x85\",\n\t\t\t\t\t'aring;' => \"\\xC3\\xA5\",\n\t\t\t\t\t'asymp;' => \"\\xE2\\x89\\x88\",\n\t\t\t\t\t'Atilde' => \"\\xC3\\x83\",\n\t\t\t\t\t'atilde' => \"\\xC3\\xA3\",\n\t\t\t\t\t'Atilde;' => \"\\xC3\\x83\",\n\t\t\t\t\t'atilde;' => \"\\xC3\\xA3\",\n\t\t\t\t\t'Auml' => \"\\xC3\\x84\",\n\t\t\t\t\t'auml' => \"\\xC3\\xA4\",\n\t\t\t\t\t'Auml;' => \"\\xC3\\x84\",\n\t\t\t\t\t'auml;' => \"\\xC3\\xA4\",\n\t\t\t\t\t'bdquo;' => \"\\xE2\\x80\\x9E\",\n\t\t\t\t\t'Beta;' => \"\\xCE\\x92\",\n\t\t\t\t\t'beta;' => \"\\xCE\\xB2\",\n\t\t\t\t\t'brvbar' => \"\\xC2\\xA6\",\n\t\t\t\t\t'brvbar;' => \"\\xC2\\xA6\",\n\t\t\t\t\t'bull;' => \"\\xE2\\x80\\xA2\",\n\t\t\t\t\t'cap;' => \"\\xE2\\x88\\xA9\",\n\t\t\t\t\t'Ccedil' => \"\\xC3\\x87\",\n\t\t\t\t\t'ccedil' => \"\\xC3\\xA7\",\n\t\t\t\t\t'Ccedil;' => \"\\xC3\\x87\",\n\t\t\t\t\t'ccedil;' => \"\\xC3\\xA7\",\n\t\t\t\t\t'cedil' => \"\\xC2\\xB8\",\n\t\t\t\t\t'cedil;' => \"\\xC2\\xB8\",\n\t\t\t\t\t'cent' => \"\\xC2\\xA2\",\n\t\t\t\t\t'cent;' => \"\\xC2\\xA2\",\n\t\t\t\t\t'Chi;' => \"\\xCE\\xA7\",\n\t\t\t\t\t'chi;' => \"\\xCF\\x87\",\n\t\t\t\t\t'circ;' => \"\\xCB\\x86\",\n\t\t\t\t\t'clubs;' => \"\\xE2\\x99\\xA3\",\n\t\t\t\t\t'cong;' => \"\\xE2\\x89\\x85\",\n\t\t\t\t\t'COPY' => \"\\xC2\\xA9\",\n\t\t\t\t\t'copy' => \"\\xC2\\xA9\",\n\t\t\t\t\t'COPY;' => \"\\xC2\\xA9\",\n\t\t\t\t\t'copy;' => \"\\xC2\\xA9\",\n\t\t\t\t\t'crarr;' => \"\\xE2\\x86\\xB5\",\n\t\t\t\t\t'cup;' => \"\\xE2\\x88\\xAA\",\n\t\t\t\t\t'curren' => \"\\xC2\\xA4\",\n\t\t\t\t\t'curren;' => \"\\xC2\\xA4\",\n\t\t\t\t\t'Dagger;' => \"\\xE2\\x80\\xA1\",\n\t\t\t\t\t'dagger;' => \"\\xE2\\x80\\xA0\",\n\t\t\t\t\t'dArr;' => \"\\xE2\\x87\\x93\",\n\t\t\t\t\t'darr;' => \"\\xE2\\x86\\x93\",\n\t\t\t\t\t'deg' => \"\\xC2\\xB0\",\n\t\t\t\t\t'deg;' => \"\\xC2\\xB0\",\n\t\t\t\t\t'Delta;' => \"\\xCE\\x94\",\n\t\t\t\t\t'delta;' => \"\\xCE\\xB4\",\n\t\t\t\t\t'diams;' => \"\\xE2\\x99\\xA6\",\n\t\t\t\t\t'divide' => \"\\xC3\\xB7\",\n\t\t\t\t\t'divide;' => \"\\xC3\\xB7\",\n\t\t\t\t\t'Eacute' => \"\\xC3\\x89\",\n\t\t\t\t\t'eacute' => \"\\xC3\\xA9\",\n\t\t\t\t\t'Eacute;' => \"\\xC3\\x89\",\n\t\t\t\t\t'eacute;' => \"\\xC3\\xA9\",\n\t\t\t\t\t'Ecirc' => \"\\xC3\\x8A\",\n\t\t\t\t\t'ecirc' => \"\\xC3\\xAA\",\n\t\t\t\t\t'Ecirc;' => \"\\xC3\\x8A\",\n\t\t\t\t\t'ecirc;' => \"\\xC3\\xAA\",\n\t\t\t\t\t'Egrave' => \"\\xC3\\x88\",\n\t\t\t\t\t'egrave' => \"\\xC3\\xA8\",\n\t\t\t\t\t'Egrave;' => \"\\xC3\\x88\",\n\t\t\t\t\t'egrave;' => \"\\xC3\\xA8\",\n\t\t\t\t\t'empty;' => \"\\xE2\\x88\\x85\",\n\t\t\t\t\t'emsp;' => \"\\xE2\\x80\\x83\",\n\t\t\t\t\t'ensp;' => \"\\xE2\\x80\\x82\",\n\t\t\t\t\t'Epsilon;' => \"\\xCE\\x95\",\n\t\t\t\t\t'epsilon;' => \"\\xCE\\xB5\",\n\t\t\t\t\t'equiv;' => \"\\xE2\\x89\\xA1\",\n\t\t\t\t\t'Eta;' => \"\\xCE\\x97\",\n\t\t\t\t\t'eta;' => \"\\xCE\\xB7\",\n\t\t\t\t\t'ETH' => \"\\xC3\\x90\",\n\t\t\t\t\t'eth' => \"\\xC3\\xB0\",\n\t\t\t\t\t'ETH;' => \"\\xC3\\x90\",\n\t\t\t\t\t'eth;' => \"\\xC3\\xB0\",\n\t\t\t\t\t'Euml' => \"\\xC3\\x8B\",\n\t\t\t\t\t'euml' => \"\\xC3\\xAB\",\n\t\t\t\t\t'Euml;' => \"\\xC3\\x8B\",\n\t\t\t\t\t'euml;' => \"\\xC3\\xAB\",\n\t\t\t\t\t'euro;' => \"\\xE2\\x82\\xAC\",\n\t\t\t\t\t'exist;' => \"\\xE2\\x88\\x83\",\n\t\t\t\t\t'fnof;' => \"\\xC6\\x92\",\n\t\t\t\t\t'forall;' => \"\\xE2\\x88\\x80\",\n\t\t\t\t\t'frac12' => \"\\xC2\\xBD\",\n\t\t\t\t\t'frac12;' => \"\\xC2\\xBD\",\n\t\t\t\t\t'frac14' => \"\\xC2\\xBC\",\n\t\t\t\t\t'frac14;' => \"\\xC2\\xBC\",\n\t\t\t\t\t'frac34' => \"\\xC2\\xBE\",\n\t\t\t\t\t'frac34;' => \"\\xC2\\xBE\",\n\t\t\t\t\t'frasl;' => \"\\xE2\\x81\\x84\",\n\t\t\t\t\t'Gamma;' => \"\\xCE\\x93\",\n\t\t\t\t\t'gamma;' => \"\\xCE\\xB3\",\n\t\t\t\t\t'ge;' => \"\\xE2\\x89\\xA5\",\n\t\t\t\t\t'GT' => \"\\x3E\",\n\t\t\t\t\t'gt' => \"\\x3E\",\n\t\t\t\t\t'GT;' => \"\\x3E\",\n\t\t\t\t\t'gt;' => \"\\x3E\",\n\t\t\t\t\t'hArr;' => \"\\xE2\\x87\\x94\",\n\t\t\t\t\t'harr;' => \"\\xE2\\x86\\x94\",\n\t\t\t\t\t'hearts;' => \"\\xE2\\x99\\xA5\",\n\t\t\t\t\t'hellip;' => \"\\xE2\\x80\\xA6\",\n\t\t\t\t\t'Iacute' => \"\\xC3\\x8D\",\n\t\t\t\t\t'iacute' => \"\\xC3\\xAD\",\n\t\t\t\t\t'Iacute;' => \"\\xC3\\x8D\",\n\t\t\t\t\t'iacute;' => \"\\xC3\\xAD\",\n\t\t\t\t\t'Icirc' => \"\\xC3\\x8E\",\n\t\t\t\t\t'icirc' => \"\\xC3\\xAE\",\n\t\t\t\t\t'Icirc;' => \"\\xC3\\x8E\",\n\t\t\t\t\t'icirc;' => \"\\xC3\\xAE\",\n\t\t\t\t\t'iexcl' => \"\\xC2\\xA1\",\n\t\t\t\t\t'iexcl;' => \"\\xC2\\xA1\",\n\t\t\t\t\t'Igrave' => \"\\xC3\\x8C\",\n\t\t\t\t\t'igrave' => \"\\xC3\\xAC\",\n\t\t\t\t\t'Igrave;' => \"\\xC3\\x8C\",\n\t\t\t\t\t'igrave;' => \"\\xC3\\xAC\",\n\t\t\t\t\t'image;' => \"\\xE2\\x84\\x91\",\n\t\t\t\t\t'infin;' => \"\\xE2\\x88\\x9E\",\n\t\t\t\t\t'int;' => \"\\xE2\\x88\\xAB\",\n\t\t\t\t\t'Iota;' => \"\\xCE\\x99\",\n\t\t\t\t\t'iota;' => \"\\xCE\\xB9\",\n\t\t\t\t\t'iquest' => \"\\xC2\\xBF\",\n\t\t\t\t\t'iquest;' => \"\\xC2\\xBF\",\n\t\t\t\t\t'isin;' => \"\\xE2\\x88\\x88\",\n\t\t\t\t\t'Iuml' => \"\\xC3\\x8F\",\n\t\t\t\t\t'iuml' => \"\\xC3\\xAF\",\n\t\t\t\t\t'Iuml;' => \"\\xC3\\x8F\",\n\t\t\t\t\t'iuml;' => \"\\xC3\\xAF\",\n\t\t\t\t\t'Kappa;' => \"\\xCE\\x9A\",\n\t\t\t\t\t'kappa;' => \"\\xCE\\xBA\",\n\t\t\t\t\t'Lambda;' => \"\\xCE\\x9B\",\n\t\t\t\t\t'lambda;' => \"\\xCE\\xBB\",\n\t\t\t\t\t'lang;' => \"\\xE3\\x80\\x88\",\n\t\t\t\t\t'laquo' => \"\\xC2\\xAB\",\n\t\t\t\t\t'laquo;' => \"\\xC2\\xAB\",\n\t\t\t\t\t'lArr;' => \"\\xE2\\x87\\x90\",\n\t\t\t\t\t'larr;' => \"\\xE2\\x86\\x90\",\n\t\t\t\t\t'lceil;' => \"\\xE2\\x8C\\x88\",\n\t\t\t\t\t'ldquo;' => \"\\xE2\\x80\\x9C\",\n\t\t\t\t\t'le;' => \"\\xE2\\x89\\xA4\",\n\t\t\t\t\t'lfloor;' => \"\\xE2\\x8C\\x8A\",\n\t\t\t\t\t'lowast;' => \"\\xE2\\x88\\x97\",\n\t\t\t\t\t'loz;' => \"\\xE2\\x97\\x8A\",\n\t\t\t\t\t'lrm;' => \"\\xE2\\x80\\x8E\",\n\t\t\t\t\t'lsaquo;' => \"\\xE2\\x80\\xB9\",\n\t\t\t\t\t'lsquo;' => \"\\xE2\\x80\\x98\",\n\t\t\t\t\t'LT' => \"\\x3C\",\n\t\t\t\t\t'lt' => \"\\x3C\",\n\t\t\t\t\t'LT;' => \"\\x3C\",\n\t\t\t\t\t'lt;' => \"\\x3C\",\n\t\t\t\t\t'macr' => \"\\xC2\\xAF\",\n\t\t\t\t\t'macr;' => \"\\xC2\\xAF\",\n\t\t\t\t\t'mdash;' => \"\\xE2\\x80\\x94\",\n\t\t\t\t\t'micro' => \"\\xC2\\xB5\",\n\t\t\t\t\t'micro;' => \"\\xC2\\xB5\",\n\t\t\t\t\t'middot' => \"\\xC2\\xB7\",\n\t\t\t\t\t'middot;' => \"\\xC2\\xB7\",\n\t\t\t\t\t'minus;' => \"\\xE2\\x88\\x92\",\n\t\t\t\t\t'Mu;' => \"\\xCE\\x9C\",\n\t\t\t\t\t'mu;' => \"\\xCE\\xBC\",\n\t\t\t\t\t'nabla;' => \"\\xE2\\x88\\x87\",\n\t\t\t\t\t'nbsp' => \"\\xC2\\xA0\",\n\t\t\t\t\t'nbsp;' => \"\\xC2\\xA0\",\n\t\t\t\t\t'ndash;' => \"\\xE2\\x80\\x93\",\n\t\t\t\t\t'ne;' => \"\\xE2\\x89\\xA0\",\n\t\t\t\t\t'ni;' => \"\\xE2\\x88\\x8B\",\n\t\t\t\t\t'not' => \"\\xC2\\xAC\",\n\t\t\t\t\t'not;' => \"\\xC2\\xAC\",\n\t\t\t\t\t'notin;' => \"\\xE2\\x88\\x89\",\n\t\t\t\t\t'nsub;' => \"\\xE2\\x8A\\x84\",\n\t\t\t\t\t'Ntilde' => \"\\xC3\\x91\",\n\t\t\t\t\t'ntilde' => \"\\xC3\\xB1\",\n\t\t\t\t\t'Ntilde;' => \"\\xC3\\x91\",\n\t\t\t\t\t'ntilde;' => \"\\xC3\\xB1\",\n\t\t\t\t\t'Nu;' => \"\\xCE\\x9D\",\n\t\t\t\t\t'nu;' => \"\\xCE\\xBD\",\n\t\t\t\t\t'Oacute' => \"\\xC3\\x93\",\n\t\t\t\t\t'oacute' => \"\\xC3\\xB3\",\n\t\t\t\t\t'Oacute;' => \"\\xC3\\x93\",\n\t\t\t\t\t'oacute;' => \"\\xC3\\xB3\",\n\t\t\t\t\t'Ocirc' => \"\\xC3\\x94\",\n\t\t\t\t\t'ocirc' => \"\\xC3\\xB4\",\n\t\t\t\t\t'Ocirc;' => \"\\xC3\\x94\",\n\t\t\t\t\t'ocirc;' => \"\\xC3\\xB4\",\n\t\t\t\t\t'OElig;' => \"\\xC5\\x92\",\n\t\t\t\t\t'oelig;' => \"\\xC5\\x93\",\n\t\t\t\t\t'Ograve' => \"\\xC3\\x92\",\n\t\t\t\t\t'ograve' => \"\\xC3\\xB2\",\n\t\t\t\t\t'Ograve;' => \"\\xC3\\x92\",\n\t\t\t\t\t'ograve;' => \"\\xC3\\xB2\",\n\t\t\t\t\t'oline;' => \"\\xE2\\x80\\xBE\",\n\t\t\t\t\t'Omega;' => \"\\xCE\\xA9\",\n\t\t\t\t\t'omega;' => \"\\xCF\\x89\",\n\t\t\t\t\t'Omicron;' => \"\\xCE\\x9F\",\n\t\t\t\t\t'omicron;' => \"\\xCE\\xBF\",\n\t\t\t\t\t'oplus;' => \"\\xE2\\x8A\\x95\",\n\t\t\t\t\t'or;' => \"\\xE2\\x88\\xA8\",\n\t\t\t\t\t'ordf' => \"\\xC2\\xAA\",\n\t\t\t\t\t'ordf;' => \"\\xC2\\xAA\",\n\t\t\t\t\t'ordm' => \"\\xC2\\xBA\",\n\t\t\t\t\t'ordm;' => \"\\xC2\\xBA\",\n\t\t\t\t\t'Oslash' => \"\\xC3\\x98\",\n\t\t\t\t\t'oslash' => \"\\xC3\\xB8\",\n\t\t\t\t\t'Oslash;' => \"\\xC3\\x98\",\n\t\t\t\t\t'oslash;' => \"\\xC3\\xB8\",\n\t\t\t\t\t'Otilde' => \"\\xC3\\x95\",\n\t\t\t\t\t'otilde' => \"\\xC3\\xB5\",\n\t\t\t\t\t'Otilde;' => \"\\xC3\\x95\",\n\t\t\t\t\t'otilde;' => \"\\xC3\\xB5\",\n\t\t\t\t\t'otimes;' => \"\\xE2\\x8A\\x97\",\n\t\t\t\t\t'Ouml' => \"\\xC3\\x96\",\n\t\t\t\t\t'ouml' => \"\\xC3\\xB6\",\n\t\t\t\t\t'Ouml;' => \"\\xC3\\x96\",\n\t\t\t\t\t'ouml;' => \"\\xC3\\xB6\",\n\t\t\t\t\t'para' => \"\\xC2\\xB6\",\n\t\t\t\t\t'para;' => \"\\xC2\\xB6\",\n\t\t\t\t\t'part;' => \"\\xE2\\x88\\x82\",\n\t\t\t\t\t'permil;' => \"\\xE2\\x80\\xB0\",\n\t\t\t\t\t'perp;' => \"\\xE2\\x8A\\xA5\",\n\t\t\t\t\t'Phi;' => \"\\xCE\\xA6\",\n\t\t\t\t\t'phi;' => \"\\xCF\\x86\",\n\t\t\t\t\t'Pi;' => \"\\xCE\\xA0\",\n\t\t\t\t\t'pi;' => \"\\xCF\\x80\",\n\t\t\t\t\t'piv;' => \"\\xCF\\x96\",\n\t\t\t\t\t'plusmn' => \"\\xC2\\xB1\",\n\t\t\t\t\t'plusmn;' => \"\\xC2\\xB1\",\n\t\t\t\t\t'pound' => \"\\xC2\\xA3\",\n\t\t\t\t\t'pound;' => \"\\xC2\\xA3\",\n\t\t\t\t\t'Prime;' => \"\\xE2\\x80\\xB3\",\n\t\t\t\t\t'prime;' => \"\\xE2\\x80\\xB2\",\n\t\t\t\t\t'prod;' => \"\\xE2\\x88\\x8F\",\n\t\t\t\t\t'prop;' => \"\\xE2\\x88\\x9D\",\n\t\t\t\t\t'Psi;' => \"\\xCE\\xA8\",\n\t\t\t\t\t'psi;' => \"\\xCF\\x88\",\n\t\t\t\t\t'QUOT' => \"\\x22\",\n\t\t\t\t\t'quot' => \"\\x22\",\n\t\t\t\t\t'QUOT;' => \"\\x22\",\n\t\t\t\t\t'quot;' => \"\\x22\",\n\t\t\t\t\t'radic;' => \"\\xE2\\x88\\x9A\",\n\t\t\t\t\t'rang;' => \"\\xE3\\x80\\x89\",\n\t\t\t\t\t'raquo' => \"\\xC2\\xBB\",\n\t\t\t\t\t'raquo;' => \"\\xC2\\xBB\",\n\t\t\t\t\t'rArr;' => \"\\xE2\\x87\\x92\",\n\t\t\t\t\t'rarr;' => \"\\xE2\\x86\\x92\",\n\t\t\t\t\t'rceil;' => \"\\xE2\\x8C\\x89\",\n\t\t\t\t\t'rdquo;' => \"\\xE2\\x80\\x9D\",\n\t\t\t\t\t'real;' => \"\\xE2\\x84\\x9C\",\n\t\t\t\t\t'REG' => \"\\xC2\\xAE\",\n\t\t\t\t\t'reg' => \"\\xC2\\xAE\",\n\t\t\t\t\t'REG;' => \"\\xC2\\xAE\",\n\t\t\t\t\t'reg;' => \"\\xC2\\xAE\",\n\t\t\t\t\t'rfloor;' => \"\\xE2\\x8C\\x8B\",\n\t\t\t\t\t'Rho;' => \"\\xCE\\xA1\",\n\t\t\t\t\t'rho;' => \"\\xCF\\x81\",\n\t\t\t\t\t'rlm;' => \"\\xE2\\x80\\x8F\",\n\t\t\t\t\t'rsaquo;' => \"\\xE2\\x80\\xBA\",\n\t\t\t\t\t'rsquo;' => \"\\xE2\\x80\\x99\",\n\t\t\t\t\t'sbquo;' => \"\\xE2\\x80\\x9A\",\n\t\t\t\t\t'Scaron;' => \"\\xC5\\xA0\",\n\t\t\t\t\t'scaron;' => \"\\xC5\\xA1\",\n\t\t\t\t\t'sdot;' => \"\\xE2\\x8B\\x85\",\n\t\t\t\t\t'sect' => \"\\xC2\\xA7\",\n\t\t\t\t\t'sect;' => \"\\xC2\\xA7\",\n\t\t\t\t\t'shy' => \"\\xC2\\xAD\",\n\t\t\t\t\t'shy;' => \"\\xC2\\xAD\",\n\t\t\t\t\t'Sigma;' => \"\\xCE\\xA3\",\n\t\t\t\t\t'sigma;' => \"\\xCF\\x83\",\n\t\t\t\t\t'sigmaf;' => \"\\xCF\\x82\",\n\t\t\t\t\t'sim;' => \"\\xE2\\x88\\xBC\",\n\t\t\t\t\t'spades;' => \"\\xE2\\x99\\xA0\",\n\t\t\t\t\t'sub;' => \"\\xE2\\x8A\\x82\",\n\t\t\t\t\t'sube;' => \"\\xE2\\x8A\\x86\",\n\t\t\t\t\t'sum;' => \"\\xE2\\x88\\x91\",\n\t\t\t\t\t'sup;' => \"\\xE2\\x8A\\x83\",\n\t\t\t\t\t'sup1' => \"\\xC2\\xB9\",\n\t\t\t\t\t'sup1;' => \"\\xC2\\xB9\",\n\t\t\t\t\t'sup2' => \"\\xC2\\xB2\",\n\t\t\t\t\t'sup2;' => \"\\xC2\\xB2\",\n\t\t\t\t\t'sup3' => \"\\xC2\\xB3\",\n\t\t\t\t\t'sup3;' => \"\\xC2\\xB3\",\n\t\t\t\t\t'supe;' => \"\\xE2\\x8A\\x87\",\n\t\t\t\t\t'szlig' => \"\\xC3\\x9F\",\n\t\t\t\t\t'szlig;' => \"\\xC3\\x9F\",\n\t\t\t\t\t'Tau;' => \"\\xCE\\xA4\",\n\t\t\t\t\t'tau;' => \"\\xCF\\x84\",\n\t\t\t\t\t'there4;' => \"\\xE2\\x88\\xB4\",\n\t\t\t\t\t'Theta;' => \"\\xCE\\x98\",\n\t\t\t\t\t'theta;' => \"\\xCE\\xB8\",\n\t\t\t\t\t'thetasym;' => \"\\xCF\\x91\",\n\t\t\t\t\t'thinsp;' => \"\\xE2\\x80\\x89\",\n\t\t\t\t\t'THORN' => \"\\xC3\\x9E\",\n\t\t\t\t\t'thorn' => \"\\xC3\\xBE\",\n\t\t\t\t\t'THORN;' => \"\\xC3\\x9E\",\n\t\t\t\t\t'thorn;' => \"\\xC3\\xBE\",\n\t\t\t\t\t'tilde;' => \"\\xCB\\x9C\",\n\t\t\t\t\t'times' => \"\\xC3\\x97\",\n\t\t\t\t\t'times;' => \"\\xC3\\x97\",\n\t\t\t\t\t'TRADE;' => \"\\xE2\\x84\\xA2\",\n\t\t\t\t\t'trade;' => \"\\xE2\\x84\\xA2\",\n\t\t\t\t\t'Uacute' => \"\\xC3\\x9A\",\n\t\t\t\t\t'uacute' => \"\\xC3\\xBA\",\n\t\t\t\t\t'Uacute;' => \"\\xC3\\x9A\",\n\t\t\t\t\t'uacute;' => \"\\xC3\\xBA\",\n\t\t\t\t\t'uArr;' => \"\\xE2\\x87\\x91\",\n\t\t\t\t\t'uarr;' => \"\\xE2\\x86\\x91\",\n\t\t\t\t\t'Ucirc' => \"\\xC3\\x9B\",\n\t\t\t\t\t'ucirc' => \"\\xC3\\xBB\",\n\t\t\t\t\t'Ucirc;' => \"\\xC3\\x9B\",\n\t\t\t\t\t'ucirc;' => \"\\xC3\\xBB\",\n\t\t\t\t\t'Ugrave' => \"\\xC3\\x99\",\n\t\t\t\t\t'ugrave' => \"\\xC3\\xB9\",\n\t\t\t\t\t'Ugrave;' => \"\\xC3\\x99\",\n\t\t\t\t\t'ugrave;' => \"\\xC3\\xB9\",\n\t\t\t\t\t'uml' => \"\\xC2\\xA8\",\n\t\t\t\t\t'uml;' => \"\\xC2\\xA8\",\n\t\t\t\t\t'upsih;' => \"\\xCF\\x92\",\n\t\t\t\t\t'Upsilon;' => \"\\xCE\\xA5\",\n\t\t\t\t\t'upsilon;' => \"\\xCF\\x85\",\n\t\t\t\t\t'Uuml' => \"\\xC3\\x9C\",\n\t\t\t\t\t'uuml' => \"\\xC3\\xBC\",\n\t\t\t\t\t'Uuml;' => \"\\xC3\\x9C\",\n\t\t\t\t\t'uuml;' => \"\\xC3\\xBC\",\n\t\t\t\t\t'weierp;' => \"\\xE2\\x84\\x98\",\n\t\t\t\t\t'Xi;' => \"\\xCE\\x9E\",\n\t\t\t\t\t'xi;' => \"\\xCE\\xBE\",\n\t\t\t\t\t'Yacute' => \"\\xC3\\x9D\",\n\t\t\t\t\t'yacute' => \"\\xC3\\xBD\",\n\t\t\t\t\t'Yacute;' => \"\\xC3\\x9D\",\n\t\t\t\t\t'yacute;' => \"\\xC3\\xBD\",\n\t\t\t\t\t'yen' => \"\\xC2\\xA5\",\n\t\t\t\t\t'yen;' => \"\\xC2\\xA5\",\n\t\t\t\t\t'yuml' => \"\\xC3\\xBF\",\n\t\t\t\t\t'Yuml;' => \"\\xC5\\xB8\",\n\t\t\t\t\t'yuml;' => \"\\xC3\\xBF\",\n\t\t\t\t\t'Zeta;' => \"\\xCE\\x96\",\n\t\t\t\t\t'zeta;' => \"\\xCE\\xB6\",\n\t\t\t\t\t'zwj;' => \"\\xE2\\x80\\x8D\",\n\t\t\t\t\t'zwnj;' => \"\\xE2\\x80\\x8C\"\n\t\t\t\t);\n\n\t\t\t\tfor ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)\n\t\t\t\t{\n\t\t\t\t\t$consumed = substr($this->consumed, 1);\n\t\t\t\t\tif (isset($entities[$consumed]))\n\t\t\t\t\t{\n\t\t\t\t\t\t$match = $consumed;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ($match !== null)\n\t\t\t\t{\n \t\t\t\t\t$this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);\n\t\t\t\t\t$this->position += strlen($entities[$match]) - strlen($consumed) - 1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Enclosure.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Handles everything related to enclosures (including Media RSS and iTunes RSS)\n *\n * Used by {@see SimplePie_Item::get_enclosure()} and {@see SimplePie_Item::get_enclosures()}\n *\n * This class can be overloaded with {@see SimplePie::set_enclosure_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Enclosure\n{\n\t/**\n\t * @var string\n\t * @see get_bitrate()\n\t */\n\tvar $bitrate;\n\n\t/**\n\t * @var array\n\t * @see get_captions()\n\t */\n\tvar $captions;\n\n\t/**\n\t * @var array\n\t * @see get_categories()\n\t */\n\tvar $categories;\n\n\t/**\n\t * @var int\n\t * @see get_channels()\n\t */\n\tvar $channels;\n\n\t/**\n\t * @var SimplePie_Copyright\n\t * @see get_copyright()\n\t */\n\tvar $copyright;\n\n\t/**\n\t * @var array\n\t * @see get_credits()\n\t */\n\tvar $credits;\n\n\t/**\n\t * @var string\n\t * @see get_description()\n\t */\n\tvar $description;\n\n\t/**\n\t * @var int\n\t * @see get_duration()\n\t */\n\tvar $duration;\n\n\t/**\n\t * @var string\n\t * @see get_expression()\n\t */\n\tvar $expression;\n\n\t/**\n\t * @var string\n\t * @see get_framerate()\n\t */\n\tvar $framerate;\n\n\t/**\n\t * @var string\n\t * @see get_handler()\n\t */\n\tvar $handler;\n\n\t/**\n\t * @var array\n\t * @see get_hashes()\n\t */\n\tvar $hashes;\n\n\t/**\n\t * @var string\n\t * @see get_height()\n\t */\n\tvar $height;\n\n\t/**\n\t * @deprecated\n\t * @var null\n\t */\n\tvar $javascript;\n\n\t/**\n\t * @var array\n\t * @see get_keywords()\n\t */\n\tvar $keywords;\n\n\t/**\n\t * @var string\n\t * @see get_language()\n\t */\n\tvar $lang;\n\n\t/**\n\t * @var string\n\t * @see get_length()\n\t */\n\tvar $length;\n\n\t/**\n\t * @var string\n\t * @see get_link()\n\t */\n\tvar $link;\n\n\t/**\n\t * @var string\n\t * @see get_medium()\n\t */\n\tvar $medium;\n\n\t/**\n\t * @var string\n\t * @see get_player()\n\t */\n\tvar $player;\n\n\t/**\n\t * @var array\n\t * @see get_ratings()\n\t */\n\tvar $ratings;\n\n\t/**\n\t * @var array\n\t * @see get_restrictions()\n\t */\n\tvar $restrictions;\n\n\t/**\n\t * @var string\n\t * @see get_sampling_rate()\n\t */\n\tvar $samplingrate;\n\n\t/**\n\t * @var array\n\t * @see get_thumbnails()\n\t */\n\tvar $thumbnails;\n\n\t/**\n\t * @var string\n\t * @see get_title()\n\t */\n\tvar $title;\n\n\t/**\n\t * @var string\n\t * @see get_type()\n\t */\n\tvar $type;\n\n\t/**\n\t * @var string\n\t * @see get_width()\n\t */\n\tvar $width;\n\n\t/**\n\t * Constructor, used to input the data\n\t *\n\t * For documentation on all the parameters, see the corresponding\n\t * properties and their accessors\n\t *\n\t * @uses idna_convert If available, this will convert an IDN\n\t */\n\tpublic function __construct($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null)\n\t{\n\t\t$this->bitrate = $bitrate;\n\t\t$this->captions = $captions;\n\t\t$this->categories = $categories;\n\t\t$this->channels = $channels;\n\t\t$this->copyright = $copyright;\n\t\t$this->credits = $credits;\n\t\t$this->description = $description;\n\t\t$this->duration = $duration;\n\t\t$this->expression = $expression;\n\t\t$this->framerate = $framerate;\n\t\t$this->hashes = $hashes;\n\t\t$this->height = $height;\n\t\t$this->keywords = $keywords;\n\t\t$this->lang = $lang;\n\t\t$this->length = $length;\n\t\t$this->link = $link;\n\t\t$this->medium = $medium;\n\t\t$this->player = $player;\n\t\t$this->ratings = $ratings;\n\t\t$this->restrictions = $restrictions;\n\t\t$this->samplingrate = $samplingrate;\n\t\t$this->thumbnails = $thumbnails;\n\t\t$this->title = $title;\n\t\t$this->type = $type;\n\t\t$this->width = $width;\n\n\t\tif (class_exists('idna_convert'))\n\t\t{\n\t\t\t$idn = new idna_convert();\n\t\t\t$parsed = SimplePie_Misc::parse_url($link);\n\t\t\t$this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);\n\t\t}\n\t\t$this->handler = $this->get_handler(); // Needs to load last\n\t}\n\n\t/**\n\t * String-ified version\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t// There is no $this->data here\n\t\treturn md5(serialize($this));\n\t}\n\n\t/**\n\t * Get the bitrate\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_bitrate()\n\t{\n\t\tif ($this->bitrate !== null)\n\t\t{\n\t\t\treturn $this->bitrate;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single caption\n\t *\n\t * @param int $key\n\t * @return SimplePie_Caption|null\n\t */\n\tpublic function get_caption($key = 0)\n\t{\n\t\t$captions = $this->get_captions();\n\t\tif (isset($captions[$key]))\n\t\t{\n\t\t\treturn $captions[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all captions\n\t *\n\t * @return array|null Array of {@see SimplePie_Caption} objects\n\t */\n\tpublic function get_captions()\n\t{\n\t\tif ($this->captions !== null)\n\t\t{\n\t\t\treturn $this->captions;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single category\n\t *\n\t * @param int $key\n\t * @return SimplePie_Category|null\n\t */\n\tpublic function get_category($key = 0)\n\t{\n\t\t$categories = $this->get_categories();\n\t\tif (isset($categories[$key]))\n\t\t{\n\t\t\treturn $categories[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all categories\n\t *\n\t * @return array|null Array of {@see SimplePie_Category} objects\n\t */\n\tpublic function get_categories()\n\t{\n\t\tif ($this->categories !== null)\n\t\t{\n\t\t\treturn $this->categories;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the number of audio channels\n\t *\n\t * @return int|null\n\t */\n\tpublic function get_channels()\n\t{\n\t\tif ($this->channels !== null)\n\t\t{\n\t\t\treturn $this->channels;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the copyright information\n\t *\n\t * @return SimplePie_Copyright|null\n\t */\n\tpublic function get_copyright()\n\t{\n\t\tif ($this->copyright !== null)\n\t\t{\n\t\t\treturn $this->copyright;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single credit\n\t *\n\t * @param int $key\n\t * @return SimplePie_Credit|null\n\t */\n\tpublic function get_credit($key = 0)\n\t{\n\t\t$credits = $this->get_credits();\n\t\tif (isset($credits[$key]))\n\t\t{\n\t\t\treturn $credits[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all credits\n\t *\n\t * @return array|null Array of {@see SimplePie_Credit} objects\n\t */\n\tpublic function get_credits()\n\t{\n\t\tif ($this->credits !== null)\n\t\t{\n\t\t\treturn $this->credits;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the description of the enclosure\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_description()\n\t{\n\t\tif ($this->description !== null)\n\t\t{\n\t\t\treturn $this->description;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the duration of the enclosure\n\t *\n\t * @param string $convert Convert seconds into hh:mm:ss\n\t * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found)\n\t */\n\tpublic function get_duration($convert = false)\n\t{\n\t\tif ($this->duration !== null)\n\t\t{\n\t\t\tif ($convert)\n\t\t\t{\n\t\t\t\t$time = SimplePie_Misc::time_hms($this->duration);\n\t\t\t\treturn $time;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn $this->duration;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the expression\n\t *\n\t * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full'\n\t */\n\tpublic function get_expression()\n\t{\n\t\tif ($this->expression !== null)\n\t\t{\n\t\t\treturn $this->expression;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 'full';\n\t\t}\n\t}\n\n\t/**\n\t * Get the file extension\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_extension()\n\t{\n\t\tif ($this->link !== null)\n\t\t{\n\t\t\t$url = SimplePie_Misc::parse_url($this->link);\n\t\t\tif ($url['path'] !== '')\n\t\t\t{\n\t\t\t\treturn pathinfo($url['path'], PATHINFO_EXTENSION);\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get the framerate (in frames-per-second)\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_framerate()\n\t{\n\t\tif ($this->framerate !== null)\n\t\t{\n\t\t\treturn $this->framerate;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the preferred handler\n\t *\n\t * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3'\n\t */\n\tpublic function get_handler()\n\t{\n\t\treturn $this->get_real_type(true);\n\t}\n\n\t/**\n\t * Get a single hash\n\t *\n\t * @link http://www.rssboard.org/media-rss#media-hash\n\t * @param int $key\n\t * @return string|null Hash as per `media:hash`, prefixed with \"$algo:\"\n\t */\n\tpublic function get_hash($key = 0)\n\t{\n\t\t$hashes = $this->get_hashes();\n\t\tif (isset($hashes[$key]))\n\t\t{\n\t\t\treturn $hashes[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all credits\n\t *\n\t * @return array|null Array of strings, see {@see get_hash()}\n\t */\n\tpublic function get_hashes()\n\t{\n\t\tif ($this->hashes !== null)\n\t\t{\n\t\t\treturn $this->hashes;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the height\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_height()\n\t{\n\t\tif ($this->height !== null)\n\t\t{\n\t\t\treturn $this->height;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the language\n\t *\n\t * @link http://tools.ietf.org/html/rfc3066\n\t * @return string|null Language code as per RFC 3066\n\t */\n\tpublic function get_language()\n\t{\n\t\tif ($this->lang !== null)\n\t\t{\n\t\t\treturn $this->lang;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single keyword\n\t *\n\t * @param int $key\n\t * @return string|null\n\t */\n\tpublic function get_keyword($key = 0)\n\t{\n\t\t$keywords = $this->get_keywords();\n\t\tif (isset($keywords[$key]))\n\t\t{\n\t\t\treturn $keywords[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all keywords\n\t *\n\t * @return array|null Array of strings\n\t */\n\tpublic function get_keywords()\n\t{\n\t\tif ($this->keywords !== null)\n\t\t{\n\t\t\treturn $this->keywords;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get length\n\t *\n\t * @return float Length in bytes\n\t */\n\tpublic function get_length()\n\t{\n\t\tif ($this->length !== null)\n\t\t{\n\t\t\treturn $this->length;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the URL\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_link()\n\t{\n\t\tif ($this->link !== null)\n\t\t{\n\t\t\treturn urldecode($this->link);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the medium\n\t *\n\t * @link http://www.rssboard.org/media-rss#media-content\n\t * @return string|null Should be one of 'image', 'audio', 'video', 'document', 'executable'\n\t */\n\tpublic function get_medium()\n\t{\n\t\tif ($this->medium !== null)\n\t\t{\n\t\t\treturn $this->medium;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the player URL\n\t *\n\t * Typically the same as {@see get_permalink()}\n\t * @return string|null Player URL\n\t */\n\tpublic function get_player()\n\t{\n\t\tif ($this->player !== null)\n\t\t{\n\t\t\treturn $this->player;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single rating\n\t *\n\t * @param int $key\n\t * @return SimplePie_Rating|null\n\t */\n\tpublic function get_rating($key = 0)\n\t{\n\t\t$ratings = $this->get_ratings();\n\t\tif (isset($ratings[$key]))\n\t\t{\n\t\t\treturn $ratings[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all ratings\n\t *\n\t * @return array|null Array of {@see SimplePie_Rating} objects\n\t */\n\tpublic function get_ratings()\n\t{\n\t\tif ($this->ratings !== null)\n\t\t{\n\t\t\treturn $this->ratings;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single restriction\n\t *\n\t * @param int $key\n\t * @return SimplePie_Restriction|null\n\t */\n\tpublic function get_restriction($key = 0)\n\t{\n\t\t$restrictions = $this->get_restrictions();\n\t\tif (isset($restrictions[$key]))\n\t\t{\n\t\t\treturn $restrictions[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all restrictions\n\t *\n\t * @return array|null Array of {@see SimplePie_Restriction} objects\n\t */\n\tpublic function get_restrictions()\n\t{\n\t\tif ($this->restrictions !== null)\n\t\t{\n\t\t\treturn $this->restrictions;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the sampling rate (in kHz)\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_sampling_rate()\n\t{\n\t\tif ($this->samplingrate !== null)\n\t\t{\n\t\t\treturn $this->samplingrate;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the file size (in MiB)\n\t *\n\t * @return float|null File size in mebibytes (1048 bytes)\n\t */\n\tpublic function get_size()\n\t{\n\t\t$length = $this->get_length();\n\t\tif ($length !== null)\n\t\t{\n\t\t\treturn round($length/1048576, 2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single thumbnail\n\t *\n\t * @param int $key\n\t * @return string|null Thumbnail URL\n\t */\n\tpublic function get_thumbnail($key = 0)\n\t{\n\t\t$thumbnails = $this->get_thumbnails();\n\t\tif (isset($thumbnails[$key]))\n\t\t{\n\t\t\treturn $thumbnails[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all thumbnails\n\t *\n\t * @return array|null Array of thumbnail URLs\n\t */\n\tpublic function get_thumbnails()\n\t{\n\t\tif ($this->thumbnails !== null)\n\t\t{\n\t\t\treturn $this->thumbnails;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the title\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_title()\n\t{\n\t\tif ($this->title !== null)\n\t\t{\n\t\t\treturn $this->title;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get mimetype of the enclosure\n\t *\n\t * @see get_real_type()\n\t * @return string|null MIME type\n\t */\n\tpublic function get_type()\n\t{\n\t\tif ($this->type !== null)\n\t\t{\n\t\t\treturn $this->type;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the width\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_width()\n\t{\n\t\tif ($this->width !== null)\n\t\t{\n\t\t\treturn $this->width;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Embed the enclosure using `<embed>`\n\t *\n\t * @deprecated Use the second parameter to {@see embed} instead\n\t *\n\t * @param array|string $options See first paramter to {@see embed}\n\t * @return string HTML string to output\n\t */\n\tpublic function native_embed($options='')\n\t{\n\t\treturn $this->embed($options, true);\n\t}\n\n\t/**\n\t * Embed the enclosure using Javascript\n\t *\n\t * `$options` is an array or comma-separated key:value string, with the\n\t * following properties:\n\t *\n\t * - `alt` (string): Alternate content for when an end-user does not have\n\t *    the appropriate handler installed or when a file type is\n\t *    unsupported. Can be any text or HTML. Defaults to blank.\n\t * - `altclass` (string): If a file type is unsupported, the end-user will\n\t *    see the alt text (above) linked directly to the content. That link\n\t *    will have this value as its class name. Defaults to blank.\n\t * - `audio` (string): This is an image that should be used as a\n\t *    placeholder for audio files before they're loaded (QuickTime-only).\n\t *    Can be any relative or absolute URL. Defaults to blank.\n\t * - `bgcolor` (string): The background color for the media, if not\n\t *    already transparent. Defaults to `#ffffff`.\n\t * - `height` (integer): The height of the embedded media. Accepts any\n\t *    numeric pixel value (such as `360`) or `auto`. Defaults to `auto`,\n\t *    and it is recommended that you use this default.\n\t * - `loop` (boolean): Do you want the media to loop when its done?\n\t *    Defaults to `false`.\n\t * - `mediaplayer` (string): The location of the included\n\t *    `mediaplayer.swf` file. This allows for the playback of Flash Video\n\t *    (`.flv`) files, and is the default handler for non-Odeo MP3's.\n\t *    Defaults to blank.\n\t * - `video` (string): This is an image that should be used as a\n\t *    placeholder for video files before they're loaded (QuickTime-only).\n\t *    Can be any relative or absolute URL. Defaults to blank.\n\t * - `width` (integer): The width of the embedded media. Accepts any\n\t *    numeric pixel value (such as `480`) or `auto`. Defaults to `auto`,\n\t *    and it is recommended that you use this default.\n\t * - `widescreen` (boolean): Is the enclosure widescreen or standard?\n\t *    This applies only to video enclosures, and will automatically resize\n\t *    the content appropriately.  Defaults to `false`, implying 4:3 mode.\n\t *\n\t * Note: Non-widescreen (4:3) mode with `width` and `height` set to `auto`\n\t * will default to 480x360 video resolution.  Widescreen (16:9) mode with\n\t * `width` and `height` set to `auto` will default to 480x270 video resolution.\n\t *\n\t * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'.\n\t * @param array|string $options Comma-separated key:value list, or array\n\t * @param bool $native Use `<embed>`\n\t * @return string HTML string to output\n\t */\n\tpublic function embed($options = '', $native = false)\n\t{\n\t\t// Set up defaults\n\t\t$audio = '';\n\t\t$video = '';\n\t\t$alt = '';\n\t\t$altclass = '';\n\t\t$loop = 'false';\n\t\t$width = 'auto';\n\t\t$height = 'auto';\n\t\t$bgcolor = '#ffffff';\n\t\t$mediaplayer = '';\n\t\t$widescreen = false;\n\t\t$handler = $this->get_handler();\n\t\t$type = $this->get_real_type();\n\n\t\t// Process options and reassign values as necessary\n\t\tif (is_array($options))\n\t\t{\n\t\t\textract($options);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$options = explode(',', $options);\n\t\t\tforeach($options as $option)\n\t\t\t{\n\t\t\t\t$opt = explode(':', $option, 2);\n\t\t\t\tif (isset($opt[0], $opt[1]))\n\t\t\t\t{\n\t\t\t\t\t$opt[0] = trim($opt[0]);\n\t\t\t\t\t$opt[1] = trim($opt[1]);\n\t\t\t\t\tswitch ($opt[0])\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 'audio':\n\t\t\t\t\t\t\t$audio = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'video':\n\t\t\t\t\t\t\t$video = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'alt':\n\t\t\t\t\t\t\t$alt = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'altclass':\n\t\t\t\t\t\t\t$altclass = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'loop':\n\t\t\t\t\t\t\t$loop = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'width':\n\t\t\t\t\t\t\t$width = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'height':\n\t\t\t\t\t\t\t$height = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'bgcolor':\n\t\t\t\t\t\t\t$bgcolor = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'mediaplayer':\n\t\t\t\t\t\t\t$mediaplayer = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'widescreen':\n\t\t\t\t\t\t\t$widescreen = $opt[1];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$mime = explode('/', $type, 2);\n\t\t$mime = $mime[0];\n\n\t\t// Process values for 'auto'\n\t\tif ($width === 'auto')\n\t\t{\n\t\t\tif ($mime === 'video')\n\t\t\t{\n\t\t\t\tif ($height === 'auto')\n\t\t\t\t{\n\t\t\t\t\t$width = 480;\n\t\t\t\t}\n\t\t\t\telseif ($widescreen)\n\t\t\t\t{\n\t\t\t\t\t$width = round((intval($height)/9)*16);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$width = round((intval($height)/3)*4);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$width = '100%';\n\t\t\t}\n\t\t}\n\n\t\tif ($height === 'auto')\n\t\t{\n\t\t\tif ($mime === 'audio')\n\t\t\t{\n\t\t\t\t$height = 0;\n\t\t\t}\n\t\t\telseif ($mime === 'video')\n\t\t\t{\n\t\t\t\tif ($width === 'auto')\n\t\t\t\t{\n\t\t\t\t\tif ($widescreen)\n\t\t\t\t\t{\n\t\t\t\t\t\t$height = 270;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$height = 360;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telseif ($widescreen)\n\t\t\t\t{\n\t\t\t\t\t$height = round((intval($width)/16)*9);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$height = round((intval($width)/4)*3);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$height = 376;\n\t\t\t}\n\t\t}\n\t\telseif ($mime === 'audio')\n\t\t{\n\t\t\t$height = 0;\n\t\t}\n\n\t\t// Set proper placeholder value\n\t\tif ($mime === 'audio')\n\t\t{\n\t\t\t$placeholder = $audio;\n\t\t}\n\t\telseif ($mime === 'video')\n\t\t{\n\t\t\t$placeholder = $video;\n\t\t}\n\n\t\t$embed = '';\n\n\t\t// Flash\n\t\tif ($handler === 'flash')\n\t\t{\n\t\t\tif ($native)\n\t\t\t{\n\t\t\t\t$embed .= \"<embed src=\\\"\" . $this->get_link() . \"\\\" pluginspage=\\\"http://adobe.com/go/getflashplayer\\\" type=\\\"$type\\\" quality=\\\"high\\\" width=\\\"$width\\\" height=\\\"$height\\\" bgcolor=\\\"$bgcolor\\\" loop=\\\"$loop\\\"></embed>\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$embed .= \"<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '\" . $this->get_link() . \"', '$loop', '$type');</script>\";\n\t\t\t}\n\t\t}\n\n\t\t// Flash Media Player file types.\n\t\t// Preferred handler for MP3 file types.\n\t\telseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== ''))\n\t\t{\n\t\t\t$height += 20;\n\t\t\tif ($native)\n\t\t\t{\n\t\t\t\t$embed .= \"<embed src=\\\"$mediaplayer\\\" pluginspage=\\\"http://adobe.com/go/getflashplayer\\\" type=\\\"application/x-shockwave-flash\\\" quality=\\\"high\\\" width=\\\"$width\\\" height=\\\"$height\\\" wmode=\\\"transparent\\\" flashvars=\\\"file=\" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . \"&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\\\"></embed>\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$embed .= \"<script type='text/javascript'>embed_flv('$width', '$height', '\" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . \"', '$placeholder', '$loop', '$mediaplayer');</script>\";\n\t\t\t}\n\t\t}\n\n\t\t// QuickTime 7 file types.  Need to test with QuickTime 6.\n\t\t// Only handle MP3's if the Flash Media Player is not present.\n\t\telseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === ''))\n\t\t{\n\t\t\t$height += 16;\n\t\t\tif ($native)\n\t\t\t{\n\t\t\t\tif ($placeholder !== '')\n\t\t\t\t{\n\t\t\t\t\t$embed .= \"<embed type=\\\"$type\\\" style=\\\"cursor:hand; cursor:pointer;\\\" href=\\\"\" . $this->get_link() . \"\\\" src=\\\"$placeholder\\\" width=\\\"$width\\\" height=\\\"$height\\\" autoplay=\\\"false\\\" target=\\\"myself\\\" controller=\\\"false\\\" loop=\\\"$loop\\\" scale=\\\"aspect\\\" bgcolor=\\\"$bgcolor\\\" pluginspage=\\\"http://apple.com/quicktime/download/\\\"></embed>\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$embed .= \"<embed type=\\\"$type\\\" style=\\\"cursor:hand; cursor:pointer;\\\" src=\\\"\" . $this->get_link() . \"\\\" width=\\\"$width\\\" height=\\\"$height\\\" autoplay=\\\"false\\\" target=\\\"myself\\\" controller=\\\"true\\\" loop=\\\"$loop\\\" scale=\\\"aspect\\\" bgcolor=\\\"$bgcolor\\\" pluginspage=\\\"http://apple.com/quicktime/download/\\\"></embed>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$embed .= \"<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '\" . $this->get_link() . \"', '$placeholder', '$loop');</script>\";\n\t\t\t}\n\t\t}\n\n\t\t// Windows Media\n\t\telseif ($handler === 'wmedia')\n\t\t{\n\t\t\t$height += 45;\n\t\t\tif ($native)\n\t\t\t{\n\t\t\t\t$embed .= \"<embed type=\\\"application/x-mplayer2\\\" src=\\\"\" . $this->get_link() . \"\\\" autosize=\\\"1\\\" width=\\\"$width\\\" height=\\\"$height\\\" showcontrols=\\\"1\\\" showstatusbar=\\\"0\\\" showdisplay=\\\"0\\\" autostart=\\\"0\\\"></embed>\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$embed .= \"<script type='text/javascript'>embed_wmedia('$width', '$height', '\" . $this->get_link() . \"');</script>\";\n\t\t\t}\n\t\t}\n\n\t\t// Everything else\n\t\telse $embed .= '<a href=\"' . $this->get_link() . '\" class=\"' . $altclass . '\">' . $alt . '</a>';\n\n\t\treturn $embed;\n\t}\n\n\t/**\n\t * Get the real media type\n\t *\n\t * Often, feeds lie to us, necessitating a bit of deeper inspection. This\n\t * converts types to their canonical representations based on the file\n\t * extension\n\t *\n\t * @see get_type()\n\t * @param bool $find_handler Internal use only, use {@see get_handler()} instead\n\t * @return string MIME type\n\t */\n\tpublic function get_real_type($find_handler = false)\n\t{\n\t\t// Mime-types by handler.\n\t\t$types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash\n\t\t$types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player\n\t\t$types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime\n\t\t$types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media\n\t\t$types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3\n\n\t\tif ($this->get_type() !== null)\n\t\t{\n\t\t\t$type = strtolower($this->type);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$type = null;\n\t\t}\n\n\t\t// If we encounter an unsupported mime-type, check the file extension and guess intelligently.\n\t\tif (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))\n\t\t{\n\t\t\tswitch (strtolower($this->get_extension()))\n\t\t\t{\n\t\t\t\t// Audio mime-types\n\t\t\t\tcase 'aac':\n\t\t\t\tcase 'adts':\n\t\t\t\t\t$type = 'audio/acc';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'aif':\n\t\t\t\tcase 'aifc':\n\t\t\t\tcase 'aiff':\n\t\t\t\tcase 'cdda':\n\t\t\t\t\t$type = 'audio/aiff';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bwf':\n\t\t\t\t\t$type = 'audio/wav';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'kar':\n\t\t\t\tcase 'mid':\n\t\t\t\tcase 'midi':\n\t\t\t\tcase 'smf':\n\t\t\t\t\t$type = 'audio/midi';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'm4a':\n\t\t\t\t\t$type = 'audio/x-m4a';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mp3':\n\t\t\t\tcase 'swa':\n\t\t\t\t\t$type = 'audio/mp3';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wav':\n\t\t\t\t\t$type = 'audio/wav';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wax':\n\t\t\t\t\t$type = 'audio/x-ms-wax';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wma':\n\t\t\t\t\t$type = 'audio/x-ms-wma';\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Video mime-types\n\t\t\t\tcase '3gp':\n\t\t\t\tcase '3gpp':\n\t\t\t\t\t$type = 'video/3gpp';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase '3g2':\n\t\t\t\tcase '3gp2':\n\t\t\t\t\t$type = 'video/3gpp2';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'asf':\n\t\t\t\t\t$type = 'video/x-ms-asf';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'flv':\n\t\t\t\t\t$type = 'video/x-flv';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'm1a':\n\t\t\t\tcase 'm1s':\n\t\t\t\tcase 'm1v':\n\t\t\t\tcase 'm15':\n\t\t\t\tcase 'm75':\n\t\t\t\tcase 'mp2':\n\t\t\t\tcase 'mpa':\n\t\t\t\tcase 'mpeg':\n\t\t\t\tcase 'mpg':\n\t\t\t\tcase 'mpm':\n\t\t\t\tcase 'mpv':\n\t\t\t\t\t$type = 'video/mpeg';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'm4v':\n\t\t\t\t\t$type = 'video/x-m4v';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mov':\n\t\t\t\tcase 'qt':\n\t\t\t\t\t$type = 'video/quicktime';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mp4':\n\t\t\t\tcase 'mpg4':\n\t\t\t\t\t$type = 'video/mp4';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'sdv':\n\t\t\t\t\t$type = 'video/sd-video';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wm':\n\t\t\t\t\t$type = 'video/x-ms-wm';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wmv':\n\t\t\t\t\t$type = 'video/x-ms-wmv';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'wvx':\n\t\t\t\t\t$type = 'video/x-ms-wvx';\n\t\t\t\t\tbreak;\n\n\t\t\t\t// Flash mime-types\n\t\t\t\tcase 'spl':\n\t\t\t\t\t$type = 'application/futuresplash';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'swf':\n\t\t\t\t\t$type = 'application/x-shockwave-flash';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ($find_handler)\n\t\t{\n\t\t\tif (in_array($type, $types_flash))\n\t\t\t{\n\t\t\t\treturn 'flash';\n\t\t\t}\n\t\t\telseif (in_array($type, $types_fmedia))\n\t\t\t{\n\t\t\t\treturn 'fmedia';\n\t\t\t}\n\t\t\telseif (in_array($type, $types_quicktime))\n\t\t\t{\n\t\t\t\treturn 'quicktime';\n\t\t\t}\n\t\t\telseif (in_array($type, $types_wmedia))\n\t\t\t{\n\t\t\t\treturn 'wmedia';\n\t\t\t}\n\t\t\telseif (in_array($type, $types_mp3))\n\t\t\t{\n\t\t\t\treturn 'mp3';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $type;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Exception.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.4-dev\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * General SimplePie exception class\n *\n * @package SimplePie\n */\nclass SimplePie_Exception extends Exception\n{\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/File.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Used for fetching remote files and reading local files\n *\n * Supports HTTP 1.0 via cURL or fsockopen, with spotty HTTP 1.1 support\n *\n * This class can be overloaded with {@see SimplePie::set_file_class()}\n *\n * @package SimplePie\n * @subpackage HTTP\n * @todo Move to properly supporting RFC2616 (HTTP/1.1)\n */\nclass SimplePie_File\n{\n\tvar $url;\n\tvar $useragent;\n\tvar $success = true;\n\tvar $headers = array();\n\tvar $body;\n\tvar $status_code;\n\tvar $redirects = 0;\n\tvar $error;\n\tvar $method = SIMPLEPIE_FILE_SOURCE_NONE;\n\n\tpublic function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)\n\t{\n\t\tif (class_exists('idna_convert'))\n\t\t{\n\t\t\t$idn = new idna_convert();\n\t\t\t$parsed = SimplePie_Misc::parse_url($url);\n\t\t\t$url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);\n\t\t}\n\t\t$this->url = $url;\n\t\t$this->useragent = $useragent;\n\t\tif (preg_match('/^http(s)?:\\/\\//i', $url))\n\t\t{\n\t\t\tif ($useragent === null)\n\t\t\t{\n\t\t\t\t$useragent = ini_get('user_agent');\n\t\t\t\t$this->useragent = $useragent;\n\t\t\t}\n\t\t\tif (!is_array($headers))\n\t\t\t{\n\t\t\t\t$headers = array();\n\t\t\t}\n\t\t\tif (!$force_fsockopen && function_exists('curl_exec'))\n\t\t\t{\n\t\t\t\t$this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;\n\t\t\t\t$fp = curl_init();\n\t\t\t\t$headers2 = array();\n\t\t\t\tforeach ($headers as $key => $value)\n\t\t\t\t{\n\t\t\t\t\t$headers2[] = \"$key: $value\";\n\t\t\t\t}\n\t\t\t\tif (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))\n\t\t\t\t{\n\t\t\t\t\tcurl_setopt($fp, CURLOPT_ENCODING, '');\n\t\t\t\t}\n\t\t\t\tcurl_setopt($fp, CURLOPT_URL, $url);\n\t\t\t\tcurl_setopt($fp, CURLOPT_HEADER, 1);\n\t\t\t\tcurl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);\n\t\t\t\tcurl_setopt($fp, CURLOPT_TIMEOUT, $timeout);\n\t\t\t\tcurl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);\n\t\t\t\tcurl_setopt($fp, CURLOPT_REFERER, $url);\n\t\t\t\tcurl_setopt($fp, CURLOPT_USERAGENT, $useragent);\n\t\t\t\tcurl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);\n\t\t\t\tif (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))\n\t\t\t\t{\n\t\t\t\t\tcurl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);\n\t\t\t\t\tcurl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);\n\t\t\t\t}\n\n\t\t\t\t$this->headers = curl_exec($fp);\n\t\t\t\tif (curl_errno($fp) === 23 || curl_errno($fp) === 61)\n\t\t\t\t{\n\t\t\t\t\tcurl_setopt($fp, CURLOPT_ENCODING, 'none');\n\t\t\t\t\t$this->headers = curl_exec($fp);\n\t\t\t\t}\n\t\t\t\tif (curl_errno($fp))\n\t\t\t\t{\n\t\t\t\t\t$this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);\n\t\t\t\t\t$this->success = false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$info = curl_getinfo($fp);\n\t\t\t\t\tcurl_close($fp);\n\t\t\t\t\t$this->headers = explode(\"\\r\\n\\r\\n\", $this->headers, $info['redirect_count'] + 1);\n\t\t\t\t\t$this->headers = array_pop($this->headers);\n\t\t\t\t\t$parser = new SimplePie_HTTP_Parser($this->headers);\n\t\t\t\t\tif ($parser->parse())\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->headers = $parser->headers;\n\t\t\t\t\t\t$this->body = $parser->body;\n\t\t\t\t\t\t$this->status_code = $parser->status_code;\n\t\t\t\t\t\tif ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->redirects++;\n\t\t\t\t\t\t\t$location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);\n\t\t\t\t\t\t\treturn $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;\n\t\t\t\t$url_parts = parse_url($url);\n\t\t\t\t$socket_host = $url_parts['host'];\n\t\t\t\tif (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')\n\t\t\t\t{\n\t\t\t\t\t$socket_host = \"ssl://$url_parts[host]\";\n\t\t\t\t\t$url_parts['port'] = 443;\n\t\t\t\t}\n\t\t\t\tif (!isset($url_parts['port']))\n\t\t\t\t{\n\t\t\t\t\t$url_parts['port'] = 80;\n\t\t\t\t}\n\t\t\t\t$fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);\n\t\t\t\tif (!$fp)\n\t\t\t\t{\n\t\t\t\t\t$this->error = 'fsockopen error: ' . $errstr;\n\t\t\t\t\t$this->success = false;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstream_set_timeout($fp, $timeout);\n\t\t\t\t\tif (isset($url_parts['path']))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (isset($url_parts['query']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$get = \"$url_parts[path]?$url_parts[query]\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$get = $url_parts['path'];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$get = '/';\n\t\t\t\t\t}\n\t\t\t\t\t$out = \"GET $get HTTP/1.1\\r\\n\";\n\t\t\t\t\t$out .= \"Host: $url_parts[host]\\r\\n\";\n\t\t\t\t\t$out .= \"User-Agent: $useragent\\r\\n\";\n\t\t\t\t\tif (extension_loaded('zlib'))\n\t\t\t\t\t{\n\t\t\t\t\t\t$out .= \"Accept-Encoding: x-gzip,gzip,deflate\\r\\n\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isset($url_parts['user']) && isset($url_parts['pass']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$out .= \"Authorization: Basic \" . base64_encode(\"$url_parts[user]:$url_parts[pass]\") . \"\\r\\n\";\n\t\t\t\t\t}\n\t\t\t\t\tforeach ($headers as $key => $value)\n\t\t\t\t\t{\n\t\t\t\t\t\t$out .= \"$key: $value\\r\\n\";\n\t\t\t\t\t}\n\t\t\t\t\t$out .= \"Connection: Close\\r\\n\\r\\n\";\n\t\t\t\t\tfwrite($fp, $out);\n\n\t\t\t\t\t$info = stream_get_meta_data($fp);\n\n\t\t\t\t\t$this->headers = '';\n\t\t\t\t\twhile (!$info['eof'] && !$info['timed_out'])\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->headers .= fread($fp, 1160);\n\t\t\t\t\t\t$info = stream_get_meta_data($fp);\n\t\t\t\t\t}\n\t\t\t\t\tif (!$info['timed_out'])\n\t\t\t\t\t{\n\t\t\t\t\t\t$parser = new SimplePie_HTTP_Parser($this->headers);\n\t\t\t\t\t\tif ($parser->parse())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->headers = $parser->headers;\n\t\t\t\t\t\t\t$this->body = $parser->body;\n\t\t\t\t\t\t\t$this->status_code = $parser->status_code;\n\t\t\t\t\t\t\tif ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$this->redirects++;\n\t\t\t\t\t\t\t\t$location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);\n\t\t\t\t\t\t\t\treturn $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($this->headers['content-encoding']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t// Hey, we act dumb elsewhere, so let's do that here too\n\t\t\t\t\t\t\t\tswitch (strtolower(trim($this->headers['content-encoding'], \"\\x09\\x0A\\x0D\\x20\")))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase 'gzip':\n\t\t\t\t\t\t\t\t\tcase 'x-gzip':\n\t\t\t\t\t\t\t\t\t\t$decoder = new SimplePie_gzdecode($this->body);\n\t\t\t\t\t\t\t\t\t\tif (!$decoder->parse())\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$this->error = 'Unable to decode HTTP \"gzip\" stream';\n\t\t\t\t\t\t\t\t\t\t\t$this->success = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$this->body = $decoder->data;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'deflate':\n\t\t\t\t\t\t\t\t\t\tif (($decompressed = gzinflate($this->body)) !== false)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$this->body = $decompressed;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (($decompressed = gzuncompress($this->body)) !== false)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$this->body = $decompressed;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$this->body = $decompressed;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t$this->error = 'Unable to decode HTTP \"deflate\" stream';\n\t\t\t\t\t\t\t\t\t\t\t$this->success = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t$this->error = 'Unknown content coding';\n\t\t\t\t\t\t\t\t\t\t$this->success = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->error = 'fsocket timed out';\n\t\t\t\t\t\t$this->success = false;\n\t\t\t\t\t}\n\t\t\t\t\tfclose($fp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;\n\t\t\tif (!$this->body = file_get_contents($url))\n\t\t\t{\n\t\t\t\t$this->error = 'file_get_contents could not read the file';\n\t\t\t\t$this->success = false;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/HTTP/Parser.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * HTTP Response Parser\n *\n * @package SimplePie\n * @subpackage HTTP\n */\nclass SimplePie_HTTP_Parser\n{\n\t/**\n\t * HTTP Version\n\t *\n\t * @var float\n\t */\n\tpublic $http_version = 0.0;\n\n\t/**\n\t * Status code\n\t *\n\t * @var int\n\t */\n\tpublic $status_code = 0;\n\n\t/**\n\t * Reason phrase\n\t *\n\t * @var string\n\t */\n\tpublic $reason = '';\n\n\t/**\n\t * Key/value pairs of the headers\n\t *\n\t * @var array\n\t */\n\tpublic $headers = array();\n\n\t/**\n\t * Body of the response\n\t *\n\t * @var string\n\t */\n\tpublic $body = '';\n\n\t/**\n\t * Current state of the state machine\n\t *\n\t * @var string\n\t */\n\tprotected $state = 'http_version';\n\n\t/**\n\t * Input data\n\t *\n\t * @var string\n\t */\n\tprotected $data = '';\n\n\t/**\n\t * Input data length (to avoid calling strlen() everytime this is needed)\n\t *\n\t * @var int\n\t */\n\tprotected $data_length = 0;\n\n\t/**\n\t * Current position of the pointer\n\t *\n\t * @var int\n\t */\n\tprotected $position = 0;\n\n\t/**\n\t * Name of the hedaer currently being parsed\n\t *\n\t * @var string\n\t */\n\tprotected $name = '';\n\n\t/**\n\t * Value of the hedaer currently being parsed\n\t *\n\t * @var string\n\t */\n\tprotected $value = '';\n\n\t/**\n\t * Create an instance of the class with the input data\n\t *\n\t * @param string $data Input data\n\t */\n\tpublic function __construct($data)\n\t{\n\t\t$this->data = $data;\n\t\t$this->data_length = strlen($this->data);\n\t}\n\n\t/**\n\t * Parse the input data\n\t *\n\t * @return bool true on success, false on failure\n\t */\n\tpublic function parse()\n\t{\n\t\twhile ($this->state && $this->state !== 'emit' && $this->has_data())\n\t\t{\n\t\t\t$state = $this->state;\n\t\t\t$this->$state();\n\t\t}\n\t\t$this->data = '';\n\t\tif ($this->state === 'emit' || $this->state === 'body')\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->http_version = '';\n\t\t\t$this->status_code = '';\n\t\t\t$this->reason = '';\n\t\t\t$this->headers = array();\n\t\t\t$this->body = '';\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Check whether there is data beyond the pointer\n\t *\n\t * @return bool true if there is further data, false if not\n\t */\n\tprotected function has_data()\n\t{\n\t\treturn (bool) ($this->position < $this->data_length);\n\t}\n\n\t/**\n\t * See if the next character is LWS\n\t *\n\t * @return bool true if the next character is LWS, false if not\n\t */\n\tprotected function is_linear_whitespace()\n\t{\n\t\treturn (bool) ($this->data[$this->position] === \"\\x09\"\n\t\t\t|| $this->data[$this->position] === \"\\x20\"\n\t\t\t|| ($this->data[$this->position] === \"\\x0A\"\n\t\t\t\t&& isset($this->data[$this->position + 1])\n\t\t\t\t&& ($this->data[$this->position + 1] === \"\\x09\" || $this->data[$this->position + 1] === \"\\x20\")));\n\t}\n\n\t/**\n\t * Parse the HTTP version\n\t */\n\tprotected function http_version()\n\t{\n\t\tif (strpos($this->data, \"\\x0A\") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')\n\t\t{\n\t\t\t$len = strspn($this->data, '0123456789.', 5);\n\t\t\t$this->http_version = substr($this->data, 5, $len);\n\t\t\t$this->position += 5 + $len;\n\t\t\tif (substr_count($this->http_version, '.') <= 1)\n\t\t\t{\n\t\t\t\t$this->http_version = (float) $this->http_version;\n\t\t\t\t$this->position += strspn($this->data, \"\\x09\\x20\", $this->position);\n\t\t\t\t$this->state = 'status';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->state = false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\t/**\n\t * Parse the status code\n\t */\n\tprotected function status()\n\t{\n\t\tif ($len = strspn($this->data, '0123456789', $this->position))\n\t\t{\n\t\t\t$this->status_code = (int) substr($this->data, $this->position, $len);\n\t\t\t$this->position += $len;\n\t\t\t$this->state = 'reason';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\t/**\n\t * Parse the reason phrase\n\t */\n\tprotected function reason()\n\t{\n\t\t$len = strcspn($this->data, \"\\x0A\", $this->position);\n\t\t$this->reason = trim(substr($this->data, $this->position, $len), \"\\x09\\x0D\\x20\");\n\t\t$this->position += $len + 1;\n\t\t$this->state = 'new_line';\n\t}\n\n\t/**\n\t * Deal with a new line, shifting data around as needed\n\t */\n\tprotected function new_line()\n\t{\n\t\t$this->value = trim($this->value, \"\\x0D\\x20\");\n\t\tif ($this->name !== '' && $this->value !== '')\n\t\t{\n\t\t\t$this->name = strtolower($this->name);\n\t\t\t// We should only use the last Content-Type header. c.f. issue #1\n\t\t\tif (isset($this->headers[$this->name]) && $this->name !== 'content-type')\n\t\t\t{\n\t\t\t\t$this->headers[$this->name] .= ', ' . $this->value;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->headers[$this->name] = $this->value;\n\t\t\t}\n\t\t}\n\t\t$this->name = '';\n\t\t$this->value = '';\n\t\tif (substr($this->data[$this->position], 0, 2) === \"\\x0D\\x0A\")\n\t\t{\n\t\t\t$this->position += 2;\n\t\t\t$this->state = 'body';\n\t\t}\n\t\telseif ($this->data[$this->position] === \"\\x0A\")\n\t\t{\n\t\t\t$this->position++;\n\t\t\t$this->state = 'body';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = 'name';\n\t\t}\n\t}\n\n\t/**\n\t * Parse a header name\n\t */\n\tprotected function name()\n\t{\n\t\t$len = strcspn($this->data, \"\\x0A:\", $this->position);\n\t\tif (isset($this->data[$this->position + $len]))\n\t\t{\n\t\t\tif ($this->data[$this->position + $len] === \"\\x0A\")\n\t\t\t{\n\t\t\t\t$this->position += $len;\n\t\t\t\t$this->state = 'new_line';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->name = substr($this->data, $this->position, $len);\n\t\t\t\t$this->position += $len + 1;\n\t\t\t\t$this->state = 'value';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\t/**\n\t * Parse LWS, replacing consecutive LWS characters with a single space\n\t */\n\tprotected function linear_whitespace()\n\t{\n\t\tdo\n\t\t{\n\t\t\tif (substr($this->data, $this->position, 2) === \"\\x0D\\x0A\")\n\t\t\t{\n\t\t\t\t$this->position += 2;\n\t\t\t}\n\t\t\telseif ($this->data[$this->position] === \"\\x0A\")\n\t\t\t{\n\t\t\t\t$this->position++;\n\t\t\t}\n\t\t\t$this->position += strspn($this->data, \"\\x09\\x20\", $this->position);\n\t\t} while ($this->has_data() && $this->is_linear_whitespace());\n\t\t$this->value .= \"\\x20\";\n\t}\n\n\t/**\n\t * See what state to move to while within non-quoted header values\n\t */\n\tprotected function value()\n\t{\n\t\tif ($this->is_linear_whitespace())\n\t\t{\n\t\t\t$this->linear_whitespace();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch ($this->data[$this->position])\n\t\t\t{\n\t\t\t\tcase '\"':\n\t\t\t\t\t// Workaround for ETags: we have to include the quotes as\n\t\t\t\t\t// part of the tag.\n\t\t\t\t\tif (strtolower($this->name) === 'etag')\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->value .= '\"';\n\t\t\t\t\t\t$this->position++;\n\t\t\t\t\t\t$this->state = 'value_char';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t$this->position++;\n\t\t\t\t\t$this->state = 'quote';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"\\x0A\":\n\t\t\t\t\t$this->position++;\n\t\t\t\t\t$this->state = 'new_line';\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$this->state = 'value_char';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Parse a header value while outside quotes\n\t */\n\tprotected function value_char()\n\t{\n\t\t$len = strcspn($this->data, \"\\x09\\x20\\x0A\\\"\", $this->position);\n\t\t$this->value .= substr($this->data, $this->position, $len);\n\t\t$this->position += $len;\n\t\t$this->state = 'value';\n\t}\n\n\t/**\n\t * See what state to move to while within quoted header values\n\t */\n\tprotected function quote()\n\t{\n\t\tif ($this->is_linear_whitespace())\n\t\t{\n\t\t\t$this->linear_whitespace();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tswitch ($this->data[$this->position])\n\t\t\t{\n\t\t\t\tcase '\"':\n\t\t\t\t\t$this->position++;\n\t\t\t\t\t$this->state = 'value';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"\\x0A\":\n\t\t\t\t\t$this->position++;\n\t\t\t\t\t$this->state = 'new_line';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase '\\\\':\n\t\t\t\t\t$this->position++;\n\t\t\t\t\t$this->state = 'quote_escaped';\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$this->state = 'quote_char';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Parse a header value while within quotes\n\t */\n\tprotected function quote_char()\n\t{\n\t\t$len = strcspn($this->data, \"\\x09\\x20\\x0A\\\"\\\\\", $this->position);\n\t\t$this->value .= substr($this->data, $this->position, $len);\n\t\t$this->position += $len;\n\t\t$this->state = 'value';\n\t}\n\n\t/**\n\t * Parse an escaped character within quotes\n\t */\n\tprotected function quote_escaped()\n\t{\n\t\t$this->value .= $this->data[$this->position];\n\t\t$this->position++;\n\t\t$this->state = 'quote';\n\t}\n\n\t/**\n\t * Parse the body\n\t */\n\tprotected function body()\n\t{\n\t\t$this->body = substr($this->data, $this->position);\n\t\tif (!empty($this->headers['transfer-encoding']))\n\t\t{\n\t\t\tunset($this->headers['transfer-encoding']);\n\t\t\t$this->state = 'chunked';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = 'emit';\n\t\t}\n\t}\n\n\t/**\n\t * Parsed a \"Transfer-Encoding: chunked\" body\n\t */\n\tprotected function chunked()\n\t{\n\t\tif (!preg_match('/^([0-9a-f]+)[^\\r\\n]*\\r\\n/i', trim($this->body)))\n\t\t{\n\t\t\t$this->state = 'emit';\n\t\t\treturn;\n\t\t}\n\n\t\t$decoded = '';\n\t\t$encoded = $this->body;\n\n\t\twhile (true)\n\t\t{\n\t\t\t$is_chunked = (bool) preg_match( '/^([0-9a-f]+)[^\\r\\n]*\\r\\n/i', $encoded, $matches );\n\t\t\tif (!$is_chunked)\n\t\t\t{\n\t\t\t\t// Looks like it's not chunked after all\n\t\t\t\t$this->state = 'emit';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$length = hexdec(trim($matches[1]));\n\t\t\tif ($length === 0)\n\t\t\t{\n\t\t\t\t// Ignore trailer headers\n\t\t\t\t$this->state = 'emit';\n\t\t\t\t$this->body = $decoded;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$chunk_length = strlen($matches[0]);\n\t\t\t$decoded .= $part = substr($encoded, $chunk_length, $length);\n\t\t\t$encoded = substr($encoded, $chunk_length + $length + 2);\n\n\t\t\tif (trim($encoded) === '0' || empty($encoded))\n\t\t\t{\n\t\t\t\t$this->state = 'emit';\n\t\t\t\t$this->body = $decoded;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/IRI.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * IRI parser/serialiser/normaliser\n *\n * @package SimplePie\n * @subpackage HTTP\n * @author Geoffrey Sneddon\n * @author Steve Minutillo\n * @author Ryan McCue\n * @copyright 2007-2012 Geoffrey Sneddon, Steve Minutillo, Ryan McCue\n * @license http://www.opensource.org/licenses/bsd-license.php\n */\nclass SimplePie_IRI\n{\n\t/**\n\t * Scheme\n\t *\n\t * @var string\n\t */\n\tprotected $scheme = null;\n\n\t/**\n\t * User Information\n\t *\n\t * @var string\n\t */\n\tprotected $iuserinfo = null;\n\n\t/**\n\t * ihost\n\t *\n\t * @var string\n\t */\n\tprotected $ihost = null;\n\n\t/**\n\t * Port\n\t *\n\t * @var string\n\t */\n\tprotected $port = null;\n\n\t/**\n\t * ipath\n\t *\n\t * @var string\n\t */\n\tprotected $ipath = '';\n\n\t/**\n\t * iquery\n\t *\n\t * @var string\n\t */\n\tprotected $iquery = null;\n\n\t/**\n\t * ifragment\n\t *\n\t * @var string\n\t */\n\tprotected $ifragment = null;\n\n\t/**\n\t * Normalization database\n\t *\n\t * Each key is the scheme, each value is an array with each key as the IRI\n\t * part and value as the default value for that part.\n\t */\n\tprotected $normalization = array(\n\t\t'acap' => array(\n\t\t\t'port' => 674\n\t\t),\n\t\t'dict' => array(\n\t\t\t'port' => 2628\n\t\t),\n\t\t'file' => array(\n\t\t\t'ihost' => 'localhost'\n\t\t),\n\t\t'http' => array(\n\t\t\t'port' => 80,\n\t\t\t'ipath' => '/'\n\t\t),\n\t\t'https' => array(\n\t\t\t'port' => 443,\n\t\t\t'ipath' => '/'\n\t\t),\n\t);\n\n\t/**\n\t * Return the entire IRI when you try and read the object as a string\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\treturn $this->get_iri();\n\t}\n\n\t/**\n\t * Overload __set() to provide access via properties\n\t *\n\t * @param string $name Property name\n\t * @param mixed $value Property value\n\t */\n\tpublic function __set($name, $value)\n\t{\n\t\tif (method_exists($this, 'set_' . $name))\n\t\t{\n\t\t\tcall_user_func(array($this, 'set_' . $name), $value);\n\t\t}\n\t\telseif (\n\t\t\t   $name === 'iauthority'\n\t\t\t|| $name === 'iuserinfo'\n\t\t\t|| $name === 'ihost'\n\t\t\t|| $name === 'ipath'\n\t\t\t|| $name === 'iquery'\n\t\t\t|| $name === 'ifragment'\n\t\t)\n\t\t{\n\t\t\tcall_user_func(array($this, 'set_' . substr($name, 1)), $value);\n\t\t}\n\t}\n\n\t/**\n\t * Overload __get() to provide access via properties\n\t *\n\t * @param string $name Property name\n\t * @return mixed\n\t */\n\tpublic function __get($name)\n\t{\n\t\t// isset() returns false for null, we don't want to do that\n\t\t// Also why we use array_key_exists below instead of isset()\n\t\t$props = get_object_vars($this);\n\n\t\tif (\n\t\t\t$name === 'iri' ||\n\t\t\t$name === 'uri' ||\n\t\t\t$name === 'iauthority' ||\n\t\t\t$name === 'authority'\n\t\t)\n\t\t{\n\t\t\t$return = $this->{\"get_$name\"}();\n\t\t}\n\t\telseif (array_key_exists($name, $props))\n\t\t{\n\t\t\t$return = $this->$name;\n\t\t}\n\t\t// host -> ihost\n\t\telseif (($prop = 'i' . $name) && array_key_exists($prop, $props))\n\t\t{\n\t\t\t$name = $prop;\n\t\t\t$return = $this->$prop;\n\t\t}\n\t\t// ischeme -> scheme\n\t\telseif (($prop = substr($name, 1)) && array_key_exists($prop, $props))\n\t\t{\n\t\t\t$name = $prop;\n\t\t\t$return = $this->$prop;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttrigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE);\n\t\t\t$return = null;\n\t\t}\n\n\t\tif ($return === null && isset($this->normalization[$this->scheme][$name]))\n\t\t{\n\t\t\treturn $this->normalization[$this->scheme][$name];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $return;\n\t\t}\n\t}\n\n\t/**\n\t * Overload __isset() to provide access via properties\n\t *\n\t * @param string $name Property name\n\t * @return bool\n\t */\n\tpublic function __isset($name)\n\t{\n\t\tif (method_exists($this, 'get_' . $name) || isset($this->$name))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Overload __unset() to provide access via properties\n\t *\n\t * @param string $name Property name\n\t */\n\tpublic function __unset($name)\n\t{\n\t\tif (method_exists($this, 'set_' . $name))\n\t\t{\n\t\t\tcall_user_func(array($this, 'set_' . $name), '');\n\t\t}\n\t}\n\n\t/**\n\t * Create a new IRI object, from a specified string\n\t *\n\t * @param string $iri\n\t */\n\tpublic function __construct($iri = null)\n\t{\n\t\t$this->set_iri($iri);\n\t}\n\n\t/**\n\t * Create a new IRI object by resolving a relative IRI\n\t *\n\t * Returns false if $base is not absolute, otherwise an IRI.\n\t *\n\t * @param IRI|string $base (Absolute) Base IRI\n\t * @param IRI|string $relative Relative IRI\n\t * @return IRI|false\n\t */\n\tpublic static function absolutize($base, $relative)\n\t{\n\t\tif (!($relative instanceof SimplePie_IRI))\n\t\t{\n\t\t\t$relative = new SimplePie_IRI($relative);\n\t\t}\n\t\tif (!$relative->is_valid())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\telseif ($relative->scheme !== null)\n\t\t{\n\t\t\treturn clone $relative;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!($base instanceof SimplePie_IRI))\n\t\t\t{\n\t\t\t\t$base = new SimplePie_IRI($base);\n\t\t\t}\n\t\t\tif ($base->scheme !== null && $base->is_valid())\n\t\t\t{\n\t\t\t\tif ($relative->get_iri() !== '')\n\t\t\t\t{\n\t\t\t\t\tif ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null)\n\t\t\t\t\t{\n\t\t\t\t\t\t$target = clone $relative;\n\t\t\t\t\t\t$target->scheme = $base->scheme;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$target = new SimplePie_IRI;\n\t\t\t\t\t\t$target->scheme = $base->scheme;\n\t\t\t\t\t\t$target->iuserinfo = $base->iuserinfo;\n\t\t\t\t\t\t$target->ihost = $base->ihost;\n\t\t\t\t\t\t$target->port = $base->port;\n\t\t\t\t\t\tif ($relative->ipath !== '')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ($relative->ipath[0] === '/')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$target->ipath = $relative->ipath;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$target->ipath = '/' . $relative->ipath;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (($last_segment = strrpos($base->ipath, '/')) !== false)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$target->ipath = $relative->ipath;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$target->ipath = $target->remove_dot_segments($target->ipath);\n\t\t\t\t\t\t\t$target->iquery = $relative->iquery;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$target->ipath = $base->ipath;\n\t\t\t\t\t\t\tif ($relative->iquery !== null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$target->iquery = $relative->iquery;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif ($base->iquery !== null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$target->iquery = $base->iquery;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$target->ifragment = $relative->ifragment;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$target = clone $base;\n\t\t\t\t\t$target->ifragment = null;\n\t\t\t\t}\n\t\t\t\t$target->scheme_normalization();\n\t\t\t\treturn $target;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Parse an IRI into scheme/authority/path/query/fragment segments\n\t *\n\t * @param string $iri\n\t * @return array\n\t */\n\tprotected function parse_iri($iri)\n\t{\n\t\t$iri = trim($iri, \"\\x20\\x09\\x0A\\x0C\\x0D\");\n\t\tif (preg_match('/^((?P<scheme>[^:\\/?#]+):)?(\\/\\/(?P<authority>[^\\/?#]*))?(?P<path>[^?#]*)(\\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match))\n\t\t{\n\t\t\tif ($match[1] === '')\n\t\t\t{\n\t\t\t\t$match['scheme'] = null;\n\t\t\t}\n\t\t\tif (!isset($match[3]) || $match[3] === '')\n\t\t\t{\n\t\t\t\t$match['authority'] = null;\n\t\t\t}\n\t\t\tif (!isset($match[5]))\n\t\t\t{\n\t\t\t\t$match['path'] = '';\n\t\t\t}\n\t\t\tif (!isset($match[6]) || $match[6] === '')\n\t\t\t{\n\t\t\t\t$match['query'] = null;\n\t\t\t}\n\t\t\tif (!isset($match[8]) || $match[8] === '')\n\t\t\t{\n\t\t\t\t$match['fragment'] = null;\n\t\t\t}\n\t\t\treturn $match;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// This can occur when a paragraph is accidentally parsed as a URI\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Remove dot segments from a path\n\t *\n\t * @param string $input\n\t * @return string\n\t */\n\tprotected function remove_dot_segments($input)\n\t{\n\t\t$output = '';\n\t\twhile (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..')\n\t\t{\n\t\t\t// A: If the input buffer begins with a prefix of \"../\" or \"./\", then remove that prefix from the input buffer; otherwise,\n\t\t\tif (strpos($input, '../') === 0)\n\t\t\t{\n\t\t\t\t$input = substr($input, 3);\n\t\t\t}\n\t\t\telseif (strpos($input, './') === 0)\n\t\t\t{\n\t\t\t\t$input = substr($input, 2);\n\t\t\t}\n\t\t\t// B: if the input buffer begins with a prefix of \"/./\" or \"/.\", where \".\" is a complete path segment, then replace that prefix with \"/\" in the input buffer; otherwise,\n\t\t\telseif (strpos($input, '/./') === 0)\n\t\t\t{\n\t\t\t\t$input = substr($input, 2);\n\t\t\t}\n\t\t\telseif ($input === '/.')\n\t\t\t{\n\t\t\t\t$input = '/';\n\t\t\t}\n\t\t\t// C: if the input buffer begins with a prefix of \"/../\" or \"/..\", where \"..\" is a complete path segment, then replace that prefix with \"/\" in the input buffer and remove the last segment and its preceding \"/\" (if any) from the output buffer; otherwise,\n\t\t\telseif (strpos($input, '/../') === 0)\n\t\t\t{\n\t\t\t\t$input = substr($input, 3);\n\t\t\t\t$output = substr_replace($output, '', strrpos($output, '/'));\n\t\t\t}\n\t\t\telseif ($input === '/..')\n\t\t\t{\n\t\t\t\t$input = '/';\n\t\t\t\t$output = substr_replace($output, '', strrpos($output, '/'));\n\t\t\t}\n\t\t\t// D: if the input buffer consists only of \".\" or \"..\", then remove that from the input buffer; otherwise,\n\t\t\telseif ($input === '.' || $input === '..')\n\t\t\t{\n\t\t\t\t$input = '';\n\t\t\t}\n\t\t\t// E: move the first path segment in the input buffer to the end of the output buffer, including the initial \"/\" character (if any) and any subsequent characters up to, but not including, the next \"/\" character or the end of the input buffer\n\t\t\telseif (($pos = strpos($input, '/', 1)) !== false)\n\t\t\t{\n\t\t\t\t$output .= substr($input, 0, $pos);\n\t\t\t\t$input = substr_replace($input, '', 0, $pos);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$output .= $input;\n\t\t\t\t$input = '';\n\t\t\t}\n\t\t}\n\t\treturn $output . $input;\n\t}\n\n\t/**\n\t * Replace invalid character with percent encoding\n\t *\n\t * @param string $string Input string\n\t * @param string $extra_chars Valid characters not in iunreserved or\n\t *                            iprivate (this is ASCII-only)\n\t * @param bool $iprivate Allow iprivate\n\t * @return string\n\t */\n\tprotected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false)\n\t{\n\t\t// Normalize as many pct-encoded sections as possible\n\t\t$string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $string);\n\n\t\t// Replace invalid percent characters\n\t\t$string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);\n\n\t\t// Add unreserved and % to $extra_chars (the latter is safe because all\n\t\t// pct-encoded sections are now valid).\n\t\t$extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';\n\n\t\t// Now replace any bytes that aren't allowed with their pct-encoded versions\n\t\t$position = 0;\n\t\t$strlen = strlen($string);\n\t\twhile (($position += strspn($string, $extra_chars, $position)) < $strlen)\n\t\t{\n\t\t\t$value = ord($string[$position]);\n\n\t\t\t// Start position\n\t\t\t$start = $position;\n\n\t\t\t// By default we are valid\n\t\t\t$valid = true;\n\n\t\t\t// No one byte sequences are valid due to the while.\n\t\t\t// Two byte sequence:\n\t\t\tif (($value & 0xE0) === 0xC0)\n\t\t\t{\n\t\t\t\t$character = ($value & 0x1F) << 6;\n\t\t\t\t$length = 2;\n\t\t\t\t$remaining = 1;\n\t\t\t}\n\t\t\t// Three byte sequence:\n\t\t\telseif (($value & 0xF0) === 0xE0)\n\t\t\t{\n\t\t\t\t$character = ($value & 0x0F) << 12;\n\t\t\t\t$length = 3;\n\t\t\t\t$remaining = 2;\n\t\t\t}\n\t\t\t// Four byte sequence:\n\t\t\telseif (($value & 0xF8) === 0xF0)\n\t\t\t{\n\t\t\t\t$character = ($value & 0x07) << 18;\n\t\t\t\t$length = 4;\n\t\t\t\t$remaining = 3;\n\t\t\t}\n\t\t\t// Invalid byte:\n\t\t\telse\n\t\t\t{\n\t\t\t\t$valid = false;\n\t\t\t\t$length = 1;\n\t\t\t\t$remaining = 0;\n\t\t\t}\n\n\t\t\tif ($remaining)\n\t\t\t{\n\t\t\t\tif ($position + $length <= $strlen)\n\t\t\t\t{\n\t\t\t\t\tfor ($position++; $remaining; $position++)\n\t\t\t\t\t{\n\t\t\t\t\t\t$value = ord($string[$position]);\n\n\t\t\t\t\t\t// Check that the byte is valid, then add it to the character:\n\t\t\t\t\t\tif (($value & 0xC0) === 0x80)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$character |= ($value & 0x3F) << (--$remaining * 6);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// If it is invalid, count the sequence as invalid and reprocess the current byte:\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$valid = false;\n\t\t\t\t\t\t\t$position--;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$position = $strlen - 1;\n\t\t\t\t\t$valid = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Percent encode anything invalid or not in ucschar\n\t\t\tif (\n\t\t\t\t// Invalid sequences\n\t\t\t\t!$valid\n\t\t\t\t// Non-shortest form sequences are invalid\n\t\t\t\t|| $length > 1 && $character <= 0x7F\n\t\t\t\t|| $length > 2 && $character <= 0x7FF\n\t\t\t\t|| $length > 3 && $character <= 0xFFFF\n\t\t\t\t// Outside of range of ucschar codepoints\n\t\t\t\t// Noncharacters\n\t\t\t\t|| ($character & 0xFFFE) === 0xFFFE\n\t\t\t\t|| $character >= 0xFDD0 && $character <= 0xFDEF\n\t\t\t\t|| (\n\t\t\t\t\t// Everything else not in ucschar\n\t\t\t\t\t   $character > 0xD7FF && $character < 0xF900\n\t\t\t\t\t|| $character < 0xA0\n\t\t\t\t\t|| $character > 0xEFFFD\n\t\t\t\t)\n\t\t\t\t&& (\n\t\t\t\t\t// Everything not in iprivate, if it applies\n\t\t\t\t\t   !$iprivate\n\t\t\t\t\t|| $character < 0xE000\n\t\t\t\t\t|| $character > 0x10FFFD\n\t\t\t\t)\n\t\t\t)\n\t\t\t{\n\t\t\t\t// If we were a character, pretend we weren't, but rather an error.\n\t\t\t\tif ($valid)\n\t\t\t\t\t$position--;\n\n\t\t\t\tfor ($j = $start; $j <= $position; $j++)\n\t\t\t\t{\n\t\t\t\t\t$string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);\n\t\t\t\t\t$j += 2;\n\t\t\t\t\t$position += 2;\n\t\t\t\t\t$strlen += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $string;\n\t}\n\n\t/**\n\t * Callback function for preg_replace_callback.\n\t *\n\t * Removes sequences of percent encoded bytes that represent UTF-8\n\t * encoded characters in iunreserved\n\t *\n\t * @param array $match PCRE match\n\t * @return string Replacement\n\t */\n\tprotected function remove_iunreserved_percent_encoded($match)\n\t{\n\t\t// As we just have valid percent encoded sequences we can just explode\n\t\t// and ignore the first member of the returned array (an empty string).\n\t\t$bytes = explode('%', $match[0]);\n\n\t\t// Initialize the new string (this is what will be returned) and that\n\t\t// there are no bytes remaining in the current sequence (unsurprising\n\t\t// at the first byte!).\n\t\t$string = '';\n\t\t$remaining = 0;\n\n\t\t// Loop over each and every byte, and set $value to its value\n\t\tfor ($i = 1, $len = count($bytes); $i < $len; $i++)\n\t\t{\n\t\t\t$value = hexdec($bytes[$i]);\n\n\t\t\t// If we're the first byte of sequence:\n\t\t\tif (!$remaining)\n\t\t\t{\n\t\t\t\t// Start position\n\t\t\t\t$start = $i;\n\n\t\t\t\t// By default we are valid\n\t\t\t\t$valid = true;\n\n\t\t\t\t// One byte sequence:\n\t\t\t\tif ($value <= 0x7F)\n\t\t\t\t{\n\t\t\t\t\t$character = $value;\n\t\t\t\t\t$length = 1;\n\t\t\t\t}\n\t\t\t\t// Two byte sequence:\n\t\t\t\telseif (($value & 0xE0) === 0xC0)\n\t\t\t\t{\n\t\t\t\t\t$character = ($value & 0x1F) << 6;\n\t\t\t\t\t$length = 2;\n\t\t\t\t\t$remaining = 1;\n\t\t\t\t}\n\t\t\t\t// Three byte sequence:\n\t\t\t\telseif (($value & 0xF0) === 0xE0)\n\t\t\t\t{\n\t\t\t\t\t$character = ($value & 0x0F) << 12;\n\t\t\t\t\t$length = 3;\n\t\t\t\t\t$remaining = 2;\n\t\t\t\t}\n\t\t\t\t// Four byte sequence:\n\t\t\t\telseif (($value & 0xF8) === 0xF0)\n\t\t\t\t{\n\t\t\t\t\t$character = ($value & 0x07) << 18;\n\t\t\t\t\t$length = 4;\n\t\t\t\t\t$remaining = 3;\n\t\t\t\t}\n\t\t\t\t// Invalid byte:\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$valid = false;\n\t\t\t\t\t$remaining = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Continuation byte:\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Check that the byte is valid, then add it to the character:\n\t\t\t\tif (($value & 0xC0) === 0x80)\n\t\t\t\t{\n\t\t\t\t\t$remaining--;\n\t\t\t\t\t$character |= ($value & 0x3F) << ($remaining * 6);\n\t\t\t\t}\n\t\t\t\t// If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$valid = false;\n\t\t\t\t\t$remaining = 0;\n\t\t\t\t\t$i--;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we've reached the end of the current byte sequence, append it to Unicode::$data\n\t\t\tif (!$remaining)\n\t\t\t{\n\t\t\t\t// Percent encode anything invalid or not in iunreserved\n\t\t\t\tif (\n\t\t\t\t\t// Invalid sequences\n\t\t\t\t\t!$valid\n\t\t\t\t\t// Non-shortest form sequences are invalid\n\t\t\t\t\t|| $length > 1 && $character <= 0x7F\n\t\t\t\t\t|| $length > 2 && $character <= 0x7FF\n\t\t\t\t\t|| $length > 3 && $character <= 0xFFFF\n\t\t\t\t\t// Outside of range of iunreserved codepoints\n\t\t\t\t\t|| $character < 0x2D\n\t\t\t\t\t|| $character > 0xEFFFD\n\t\t\t\t\t// Noncharacters\n\t\t\t\t\t|| ($character & 0xFFFE) === 0xFFFE\n\t\t\t\t\t|| $character >= 0xFDD0 && $character <= 0xFDEF\n\t\t\t\t\t// Everything else not in iunreserved (this is all BMP)\n\t\t\t\t\t|| $character === 0x2F\n\t\t\t\t\t|| $character > 0x39 && $character < 0x41\n\t\t\t\t\t|| $character > 0x5A && $character < 0x61\n\t\t\t\t\t|| $character > 0x7A && $character < 0x7E\n\t\t\t\t\t|| $character > 0x7E && $character < 0xA0\n\t\t\t\t\t|| $character > 0xD7FF && $character < 0xF900\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tfor ($j = $start; $j <= $i; $j++)\n\t\t\t\t\t{\n\t\t\t\t\t\t$string .= '%' . strtoupper($bytes[$j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor ($j = $start; $j <= $i; $j++)\n\t\t\t\t\t{\n\t\t\t\t\t\t$string .= chr(hexdec($bytes[$j]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we have any bytes left over they are invalid (i.e., we are\n\t\t// mid-way through a multi-byte sequence)\n\t\tif ($remaining)\n\t\t{\n\t\t\tfor ($j = $start; $j < $len; $j++)\n\t\t\t{\n\t\t\t\t$string .= '%' . strtoupper($bytes[$j]);\n\t\t\t}\n\t\t}\n\n\t\treturn $string;\n\t}\n\n\tprotected function scheme_normalization()\n\t{\n\t\tif (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo'])\n\t\t{\n\t\t\t$this->iuserinfo = null;\n\t\t}\n\t\tif (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost'])\n\t\t{\n\t\t\t$this->ihost = null;\n\t\t}\n\t\tif (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port'])\n\t\t{\n\t\t\t$this->port = null;\n\t\t}\n\t\tif (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath'])\n\t\t{\n\t\t\t$this->ipath = '';\n\t\t}\n\t\tif (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery'])\n\t\t{\n\t\t\t$this->iquery = null;\n\t\t}\n\t\tif (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment'])\n\t\t{\n\t\t\t$this->ifragment = null;\n\t\t}\n\t}\n\n\t/**\n\t * Check if the object represents a valid IRI. This needs to be done on each\n\t * call as some things change depending on another part of the IRI.\n\t *\n\t * @return bool\n\t */\n\tpublic function is_valid()\n\t{\n\t\t$isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null;\n\t\tif ($this->ipath !== '' &&\n\t\t\t(\n\t\t\t\t$isauthority && (\n\t\t\t\t\t$this->ipath[0] !== '/' ||\n\t\t\t\t\tsubstr($this->ipath, 0, 2) === '//'\n\t\t\t\t) ||\n\t\t\t\t(\n\t\t\t\t\t$this->scheme === null &&\n\t\t\t\t\t!$isauthority &&\n\t\t\t\t\tstrpos($this->ipath, ':') !== false &&\n\t\t\t\t\t(strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/'))\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set the entire IRI. Returns true on success, false on failure (if there\n\t * are any invalid characters).\n\t *\n\t * @param string $iri\n\t * @return bool\n\t */\n\tpublic function set_iri($iri)\n\t{\n\t\tstatic $cache;\n\t\tif (!$cache)\n\t\t{\n\t\t\t$cache = array();\n\t\t}\n\n\t\tif ($iri === null)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telseif (isset($cache[$iri]))\n\t\t{\n\t\t\tlist($this->scheme,\n\t\t\t\t $this->iuserinfo,\n\t\t\t\t $this->ihost,\n\t\t\t\t $this->port,\n\t\t\t\t $this->ipath,\n\t\t\t\t $this->iquery,\n\t\t\t\t $this->ifragment,\n\t\t\t\t $return) = $cache[$iri];\n\t\t\treturn $return;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$parsed = $this->parse_iri((string) $iri);\n\t\t\tif (!$parsed)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t$return = $this->set_scheme($parsed['scheme'])\n\t\t\t\t&& $this->set_authority($parsed['authority'])\n\t\t\t\t&& $this->set_path($parsed['path'])\n\t\t\t\t&& $this->set_query($parsed['query'])\n\t\t\t\t&& $this->set_fragment($parsed['fragment']);\n\n\t\t\t$cache[$iri] = array($this->scheme,\n\t\t\t\t\t\t\t\t $this->iuserinfo,\n\t\t\t\t\t\t\t\t $this->ihost,\n\t\t\t\t\t\t\t\t $this->port,\n\t\t\t\t\t\t\t\t $this->ipath,\n\t\t\t\t\t\t\t\t $this->iquery,\n\t\t\t\t\t\t\t\t $this->ifragment,\n\t\t\t\t\t\t\t\t $return);\n\t\t\treturn $return;\n\t\t}\n\t}\n\n\t/**\n\t * Set the scheme. Returns true on success, false on failure (if there are\n\t * any invalid characters).\n\t *\n\t * @param string $scheme\n\t * @return bool\n\t */\n\tpublic function set_scheme($scheme)\n\t{\n\t\tif ($scheme === null)\n\t\t{\n\t\t\t$this->scheme = null;\n\t\t}\n\t\telseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\\-.]*$/', $scheme))\n\t\t{\n\t\t\t$this->scheme = null;\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->scheme = strtolower($scheme);\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set the authority. Returns true on success, false on failure (if there are\n\t * any invalid characters).\n\t *\n\t * @param string $authority\n\t * @return bool\n\t */\n\tpublic function set_authority($authority)\n\t{\n\t\tstatic $cache;\n\t\tif (!$cache)\n\t\t\t$cache = array();\n\n\t\tif ($authority === null)\n\t\t{\n\t\t\t$this->iuserinfo = null;\n\t\t\t$this->ihost = null;\n\t\t\t$this->port = null;\n\t\t\treturn true;\n\t\t}\n\t\telseif (isset($cache[$authority]))\n\t\t{\n\t\t\tlist($this->iuserinfo,\n\t\t\t\t $this->ihost,\n\t\t\t\t $this->port,\n\t\t\t\t $return) = $cache[$authority];\n\n\t\t\treturn $return;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$remaining = $authority;\n\t\t\tif (($iuserinfo_end = strrpos($remaining, '@')) !== false)\n\t\t\t{\n\t\t\t\t$iuserinfo = substr($remaining, 0, $iuserinfo_end);\n\t\t\t\t$remaining = substr($remaining, $iuserinfo_end + 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$iuserinfo = null;\n\t\t\t}\n\t\t\tif (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false)\n\t\t\t{\n\t\t\t\tif (($port = substr($remaining, $port_start + 1)) === false)\n\t\t\t\t{\n\t\t\t\t\t$port = null;\n\t\t\t\t}\n\t\t\t\t$remaining = substr($remaining, 0, $port_start);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$port = null;\n\t\t\t}\n\n\t\t\t$return = $this->set_userinfo($iuserinfo) &&\n\t\t\t\t\t  $this->set_host($remaining) &&\n\t\t\t\t\t  $this->set_port($port);\n\n\t\t\t$cache[$authority] = array($this->iuserinfo,\n\t\t\t\t\t\t\t\t\t   $this->ihost,\n\t\t\t\t\t\t\t\t\t   $this->port,\n\t\t\t\t\t\t\t\t\t   $return);\n\n\t\t\treturn $return;\n\t\t}\n\t}\n\n\t/**\n\t * Set the iuserinfo.\n\t *\n\t * @param string $iuserinfo\n\t * @return bool\n\t */\n\tpublic function set_userinfo($iuserinfo)\n\t{\n\t\tif ($iuserinfo === null)\n\t\t{\n\t\t\t$this->iuserinfo = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\\'()*+,;=:');\n\t\t\t$this->scheme_normalization();\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set the ihost. Returns true on success, false on failure (if there are\n\t * any invalid characters).\n\t *\n\t * @param string $ihost\n\t * @return bool\n\t */\n\tpublic function set_host($ihost)\n\t{\n\t\tif ($ihost === null)\n\t\t{\n\t\t\t$this->ihost = null;\n\t\t\treturn true;\n\t\t}\n\t\telseif (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']')\n\t\t{\n\t\t\tif (SimplePie_Net_IPv6::check_ipv6(substr($ihost, 1, -1)))\n\t\t\t{\n\t\t\t\t$this->ihost = '[' . SimplePie_Net_IPv6::compress(substr($ihost, 1, -1)) . ']';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->ihost = null;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\\'()*+,;=');\n\n\t\t\t// Lowercase, but ignore pct-encoded sections (as they should\n\t\t\t// remain uppercase). This must be done after the previous step\n\t\t\t// as that can add unescaped characters.\n\t\t\t$position = 0;\n\t\t\t$strlen = strlen($ihost);\n\t\t\twhile (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen)\n\t\t\t{\n\t\t\t\tif ($ihost[$position] === '%')\n\t\t\t\t{\n\t\t\t\t\t$position += 3;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$ihost[$position] = strtolower($ihost[$position]);\n\t\t\t\t\t$position++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->ihost = $ihost;\n\t\t}\n\n\t\t$this->scheme_normalization();\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set the port. Returns true on success, false on failure (if there are\n\t * any invalid characters).\n\t *\n\t * @param string $port\n\t * @return bool\n\t */\n\tpublic function set_port($port)\n\t{\n\t\tif ($port === null)\n\t\t{\n\t\t\t$this->port = null;\n\t\t\treturn true;\n\t\t}\n\t\telseif (strspn($port, '0123456789') === strlen($port))\n\t\t{\n\t\t\t$this->port = (int) $port;\n\t\t\t$this->scheme_normalization();\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->port = null;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Set the ipath.\n\t *\n\t * @param string $ipath\n\t * @return bool\n\t */\n\tpublic function set_path($ipath)\n\t{\n\t\tstatic $cache;\n\t\tif (!$cache)\n\t\t{\n\t\t\t$cache = array();\n\t\t}\n\n\t\t$ipath = (string) $ipath;\n\n\t\tif (isset($cache[$ipath]))\n\t\t{\n\t\t\t$this->ipath = $cache[$ipath][(int) ($this->scheme !== null)];\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\\'()*+,;=@:/');\n\t\t\t$removed = $this->remove_dot_segments($valid);\n\n\t\t\t$cache[$ipath] = array($valid, $removed);\n\t\t\t$this->ipath =  ($this->scheme !== null) ? $removed : $valid;\n\t\t}\n\n\t\t$this->scheme_normalization();\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set the iquery.\n\t *\n\t * @param string $iquery\n\t * @return bool\n\t */\n\tpublic function set_query($iquery)\n\t{\n\t\tif ($iquery === null)\n\t\t{\n\t\t\t$this->iquery = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\\'()*+,;=:@/?', true);\n\t\t\t$this->scheme_normalization();\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set the ifragment.\n\t *\n\t * @param string $ifragment\n\t * @return bool\n\t */\n\tpublic function set_fragment($ifragment)\n\t{\n\t\tif ($ifragment === null)\n\t\t{\n\t\t\t$this->ifragment = null;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\\'()*+,;=:@/?');\n\t\t\t$this->scheme_normalization();\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Convert an IRI to a URI (or parts thereof)\n\t *\n\t * @return string\n\t */\n\tpublic function to_uri($string)\n\t{\n\t\tstatic $non_ascii;\n\t\tif (!$non_ascii)\n\t\t{\n\t\t\t$non_ascii = implode('', range(\"\\x80\", \"\\xFF\"));\n\t\t}\n\n\t\t$position = 0;\n\t\t$strlen = strlen($string);\n\t\twhile (($position += strcspn($string, $non_ascii, $position)) < $strlen)\n\t\t{\n\t\t\t$string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1);\n\t\t\t$position += 3;\n\t\t\t$strlen += 2;\n\t\t}\n\n\t\treturn $string;\n\t}\n\n\t/**\n\t * Get the complete IRI\n\t *\n\t * @return string\n\t */\n\tpublic function get_iri()\n\t{\n\t\tif (!$this->is_valid())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t$iri = '';\n\t\tif ($this->scheme !== null)\n\t\t{\n\t\t\t$iri .= $this->scheme . ':';\n\t\t}\n\t\tif (($iauthority = $this->get_iauthority()) !== null)\n\t\t{\n\t\t\t$iri .= '//' . $iauthority;\n\t\t}\n\t\tif ($this->ipath !== '')\n\t\t{\n\t\t\t$iri .= $this->ipath;\n\t\t}\n\t\telseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '')\n\t\t{\n\t\t\t$iri .= $this->normalization[$this->scheme]['ipath'];\n\t\t}\n\t\tif ($this->iquery !== null)\n\t\t{\n\t\t\t$iri .= '?' . $this->iquery;\n\t\t}\n\t\tif ($this->ifragment !== null)\n\t\t{\n\t\t\t$iri .= '#' . $this->ifragment;\n\t\t}\n\n\t\treturn $iri;\n\t}\n\n\t/**\n\t * Get the complete URI\n\t *\n\t * @return string\n\t */\n\tpublic function get_uri()\n\t{\n\t\treturn $this->to_uri($this->get_iri());\n\t}\n\n\t/**\n\t * Get the complete iauthority\n\t *\n\t * @return string\n\t */\n\tprotected function get_iauthority()\n\t{\n\t\tif ($this->iuserinfo !== null || $this->ihost !== null || $this->port !== null)\n\t\t{\n\t\t\t$iauthority = '';\n\t\t\tif ($this->iuserinfo !== null)\n\t\t\t{\n\t\t\t\t$iauthority .= $this->iuserinfo . '@';\n\t\t\t}\n\t\t\tif ($this->ihost !== null)\n\t\t\t{\n\t\t\t\t$iauthority .= $this->ihost;\n\t\t\t}\n\t\t\tif ($this->port !== null)\n\t\t\t{\n\t\t\t\t$iauthority .= ':' . $this->port;\n\t\t\t}\n\t\t\treturn $iauthority;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the complete authority\n\t *\n\t * @return string\n\t */\n\tprotected function get_authority()\n\t{\n\t\t$iauthority = $this->get_iauthority();\n\t\tif (is_string($iauthority))\n\t\t\treturn $this->to_uri($iauthority);\n\t\telse\n\t\t\treturn $iauthority;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Item.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * Manages all item-related data\n *\n * Used by {@see SimplePie::get_item()} and {@see SimplePie::get_items()}\n *\n * This class can be overloaded with {@see SimplePie::set_item_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Item\n{\n\t/**\n\t * Parent feed\n\t *\n\t * @access private\n\t * @var SimplePie\n\t */\n\tvar $feed;\n\n\t/**\n\t * Raw data\n\t *\n\t * @access private\n\t * @var array\n\t */\n\tvar $data = array();\n\n\t/**\n\t * Registry object\n\t *\n\t * @see set_registry\n\t * @var SimplePie_Registry\n\t */\n\tprotected $registry;\n\n\t/**\n\t * Create a new item object\n\t *\n\t * This is usually used by {@see SimplePie::get_items} and\n\t * {@see SimplePie::get_item}. Avoid creating this manually.\n\t *\n\t * @param SimplePie $feed Parent feed\n\t * @param array $data Raw data\n\t */\n\tpublic function __construct($feed, $data)\n\t{\n\t\t$this->feed = $feed;\n\t\t$this->data = $data;\n\t}\n\n\t/**\n\t * Set the registry handler\n\t *\n\t * This is usually used by {@see SimplePie_Registry::create}\n\t *\n\t * @since 1.3\n\t * @param SimplePie_Registry $registry\n\t */\n\tpublic function set_registry(SimplePie_Registry $registry)\n\t{\n\t\t$this->registry = $registry;\n\t}\n\n\t/**\n\t * Get a string representation of the item\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\treturn md5(serialize($this->data));\n\t}\n\n\t/**\n\t * Remove items that link back to this before destroying this object\n\t */\n\tpublic function __destruct()\n\t{\n\t\tif ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))\n\t\t{\n\t\t\tunset($this->feed);\n\t\t}\n\t}\n\n\t/**\n\t * Get data for an item-level element\n\t *\n\t * This method allows you to get access to ANY element/attribute that is a\n\t * sub-element of the item/entry tag.\n\t *\n\t * See {@see SimplePie::get_feed_tags()} for a description of the return value\n\t *\n\t * @since 1.0\n\t * @see http://simplepie.org/wiki/faq/supported_xml_namespaces\n\t * @param string $namespace The URL of the XML namespace of the elements you're trying to access\n\t * @param string $tag Tag name\n\t * @return array\n\t */\n\tpublic function get_item_tags($namespace, $tag)\n\t{\n\t\tif (isset($this->data['child'][$namespace][$tag]))\n\t\t{\n\t\t\treturn $this->data['child'][$namespace][$tag];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the base URL value from the parent feed\n\t *\n\t * Uses `<xml:base>`\n\t *\n\t * @param array $element\n\t * @return string\n\t */\n\tpublic function get_base($element = array())\n\t{\n\t\treturn $this->feed->get_base($element);\n\t}\n\n\t/**\n\t * Sanitize feed data\n\t *\n\t * @access private\n\t * @see SimplePie::sanitize()\n\t * @param string $data Data to sanitize\n\t * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants\n\t * @param string $base Base URL to resolve URLs against\n\t * @return string Sanitized data\n\t */\n\tpublic function sanitize($data, $type, $base = '')\n\t{\n\t\treturn $this->feed->sanitize($data, $type, $base);\n\t}\n\n\t/**\n\t * Get the parent feed\n\t *\n\t * Note: this may not work as you think for multifeeds!\n\t *\n\t * @link http://simplepie.org/faq/typical_multifeed_gotchas#missing_data_from_feed\n\t * @since 1.0\n\t * @return SimplePie\n\t */\n\tpublic function get_feed()\n\t{\n\t\treturn $this->feed;\n\t}\n\n\t/**\n\t * Get the unique identifier for the item\n\t *\n\t * This is usually used when writing code to check for new items in a feed.\n\t *\n\t * Uses `<atom:id>`, `<guid>`, `<dc:identifier>` or the `about` attribute\n\t * for RDF. If none of these are supplied (or `$hash` is true), creates an\n\t * MD5 hash based on the permalink and title. If either of those are not\n\t * supplied, creates a hash based on the full feed data.\n\t *\n\t * @since Beta 2\n\t * @param boolean $hash Should we force using a hash instead of the supplied ID?\n\t * @return string\n\t */\n\tpublic function get_id($hash = false)\n\t{\n\t\tif (!$hash)\n\t\t{\n\t\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))\n\t\t\t{\n\t\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))\n\t\t\t{\n\t\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))\n\t\t\t{\n\t\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))\n\t\t\t{\n\t\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))\n\t\t\t{\n\t\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telseif (isset($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about']))\n\t\t\t{\n\t\t\t\treturn $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telseif (($return = $this->get_permalink()) !== null)\n\t\t\t{\n\t\t\t\treturn $return;\n\t\t\t}\n\t\t\telseif (($return = $this->get_title()) !== null)\n\t\t\t{\n\t\t\t\treturn $return;\n\t\t\t}\n\t\t}\n\t\tif ($this->get_permalink() !== null || $this->get_title() !== null)\n\t\t{\n\t\t\treturn md5($this->get_permalink() . $this->get_title());\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn md5(serialize($this->data));\n\t\t}\n\t}\n\n\t/**\n\t * Get the title of the item\n\t *\n\t * Uses `<atom:title>`, `<title>` or `<dc:title>`\n\t *\n\t * @since Beta 2 (previously called `get_item_title` since 0.8)\n\t * @return string|null\n\t */\n\tpublic function get_title()\n\t{\n\t\tif (!isset($this->data['title']))\n\t\t{\n\t\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))\n\t\t\t{\n\t\t\t\t$this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))\n\t\t\t{\n\t\t\t\t$this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))\n\t\t\t{\n\t\t\t\t$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))\n\t\t\t{\n\t\t\t\t$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))\n\t\t\t{\n\t\t\t\t$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))\n\t\t\t{\n\t\t\t\t$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))\n\t\t\t{\n\t\t\t\t$this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->data['title'] = null;\n\t\t\t}\n\t\t}\n\t\treturn $this->data['title'];\n\t}\n\n\t/**\n\t * Get the content for the item\n\t *\n\t * Prefers summaries over full content , but will return full content if a\n\t * summary does not exist.\n\t *\n\t * To prefer full content instead, use {@see get_content}\n\t *\n\t * Uses `<atom:summary>`, `<description>`, `<dc:description>` or\n\t * `<itunes:subtitle>`\n\t *\n\t * @since 0.8\n\t * @param boolean $description_only Should we avoid falling back to the content?\n\t * @return string|null\n\t */\n\tpublic function get_description($description_only = false)\n\t{\n\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML);\n\t\t}\n\n\t\telseif (!$description_only)\n\t\t{\n\t\t\treturn $this->get_content(true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the content for the item\n\t *\n\t * Prefers full content over summaries, but will return a summary if full\n\t * content does not exist.\n\t *\n\t * To prefer summaries instead, use {@see get_description}\n\t *\n\t * Uses `<atom:content>` or `<content:encoded>` (RSS 1.0 Content Module)\n\t *\n\t * @since 1.0\n\t * @param boolean $content_only Should we avoid falling back to the description?\n\t * @return string|null\n\t */\n\tpublic function get_content($content_only = false)\n\t{\n\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif (!$content_only)\n\t\t{\n\t\t\treturn $this->get_description(true);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a category for the item\n\t *\n\t * @since Beta 3 (previously called `get_categories()` since Beta 2)\n\t * @param int $key The category that you want to return.  Remember that arrays begin with 0, not 1\n\t * @return SimplePie_Category|null\n\t */\n\tpublic function get_category($key = 0)\n\t{\n\t\t$categories = $this->get_categories();\n\t\tif (isset($categories[$key]))\n\t\t{\n\t\t\treturn $categories[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all categories for the item\n\t *\n\t * Uses `<atom:category>`, `<category>` or `<dc:subject>`\n\t *\n\t * @since Beta 3\n\t * @return array|null List of {@see SimplePie_Category} objects\n\t */\n\tpublic function get_categories()\n\t{\n\t\t$categories = array();\n\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)\n\t\t{\n\t\t\t$term = null;\n\t\t\t$scheme = null;\n\t\t\t$label = null;\n\t\t\tif (isset($category['attribs']['']['term']))\n\t\t\t{\n\t\t\t\t$term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($category['attribs']['']['scheme']))\n\t\t\t{\n\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($category['attribs']['']['label']))\n\t\t\t{\n\t\t\t\t$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t}\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)\n\t\t{\n\t\t\t// This is really the label, but keep this as the term also for BC.\n\t\t\t// Label will also work on retrieving because that falls back to term.\n\t\t\t$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\tif (isset($category['attribs']['']['domain']))\n\t\t\t{\n\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$scheme = null;\n\t\t\t}\n\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, null));\n\t\t}\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)\n\t\t{\n\t\t\t$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)\n\t\t{\n\t\t\t$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\n\t\tif (!empty($categories))\n\t\t{\n\t\t\treturn array_unique($categories);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get an author for the item\n\t *\n\t * @since Beta 2\n\t * @param int $key The author that you want to return.  Remember that arrays begin with 0, not 1\n\t * @return SimplePie_Author|null\n\t */\n\tpublic function get_author($key = 0)\n\t{\n\t\t$authors = $this->get_authors();\n\t\tif (isset($authors[$key]))\n\t\t{\n\t\t\treturn $authors[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a contributor for the item\n\t *\n\t * @since 1.1\n\t * @param int $key The contrbutor that you want to return.  Remember that arrays begin with 0, not 1\n\t * @return SimplePie_Author|null\n\t */\n\tpublic function get_contributor($key = 0)\n\t{\n\t\t$contributors = $this->get_contributors();\n\t\tif (isset($contributors[$key]))\n\t\t{\n\t\t\treturn $contributors[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all contributors for the item\n\t *\n\t * Uses `<atom:contributor>`\n\t *\n\t * @since 1.1\n\t * @return array|null List of {@see SimplePie_Author} objects\n\t */\n\tpublic function get_contributors()\n\t{\n\t\t$contributors = array();\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$uri = null;\n\t\t\t$email = null;\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))\n\t\t\t{\n\t\t\t\t$uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $uri !== null)\n\t\t\t{\n\t\t\t\t$contributors[] = $this->registry->create('Author', array($name, $uri, $email));\n\t\t\t}\n\t\t}\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$url = null;\n\t\t\t$email = null;\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))\n\t\t\t{\n\t\t\t\t$url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $url !== null)\n\t\t\t{\n\t\t\t\t$contributors[] = $this->registry->create('Author', array($name, $url, $email));\n\t\t\t}\n\t\t}\n\n\t\tif (!empty($contributors))\n\t\t{\n\t\t\treturn array_unique($contributors);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all authors for the item\n\t *\n\t * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`\n\t *\n\t * @since Beta 2\n\t * @return array|null List of {@see SimplePie_Author} objects\n\t */\n\tpublic function get_authors()\n\t{\n\t\t$authors = array();\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$uri = null;\n\t\t\t$email = null;\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))\n\t\t\t{\n\t\t\t\t$uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));\n\t\t\t}\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $uri !== null)\n\t\t\t{\n\t\t\t\t$authors[] = $this->registry->create('Author', array($name, $uri, $email));\n\t\t\t}\n\t\t}\n\t\tif ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))\n\t\t{\n\t\t\t$name = null;\n\t\t\t$url = null;\n\t\t\t$email = null;\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))\n\t\t\t{\n\t\t\t\t$url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));\n\t\t\t}\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $url !== null)\n\t\t\t{\n\t\t\t\t$authors[] = $this->registry->create('Author', array($name, $url, $email));\n\t\t\t}\n\t\t}\n\t\tif ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)));\n\t\t}\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\n\t\tif (!empty($authors))\n\t\t{\n\t\t\treturn array_unique($authors);\n\t\t}\n\t\telseif (($source = $this->get_source()) && ($authors = $source->get_authors()))\n\t\t{\n\t\t\treturn $authors;\n\t\t}\n\t\telseif ($authors = $this->feed->get_authors())\n\t\t{\n\t\t\treturn $authors;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the copyright info for the item\n\t *\n\t * Uses `<atom:rights>` or `<dc:rights>`\n\t *\n\t * @since 1.1\n\t * @return string\n\t */\n\tpublic function get_copyright()\n\t{\n\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the posting date/time for the item\n\t *\n\t * Uses `<atom:published>`, `<atom:updated>`, `<atom:issued>`,\n\t * `<atom:modified>`, `<pubDate>` or `<dc:date>`\n\t *\n\t * Note: obeys PHP's timezone setting. To get a UTC date/time, use\n\t * {@see get_gmdate}\n\t *\n\t * @since Beta 2 (previously called `get_item_date` since 0.8)\n\t *\n\t * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)\n\t * @return int|string|null\n\t */\n\tpublic function get_date($date_format = 'j F Y, g:i a')\n\t{\n\t\tif (!isset($this->data['date']))\n\t\t{\n\t\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))\n\t\t\t{\n\t\t\t\t$this->data['date']['raw'] = $return[0]['data'];\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))\n\t\t\t{\n\t\t\t\t$this->data['date']['raw'] = $return[0]['data'];\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))\n\t\t\t{\n\t\t\t\t$this->data['date']['raw'] = $return[0]['data'];\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))\n\t\t\t{\n\t\t\t\t$this->data['date']['raw'] = $return[0]['data'];\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))\n\t\t\t{\n\t\t\t\t$this->data['date']['raw'] = $return[0]['data'];\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))\n\t\t\t{\n\t\t\t\t$this->data['date']['raw'] = $return[0]['data'];\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))\n\t\t\t{\n\t\t\t\t$this->data['date']['raw'] = $return[0]['data'];\n\t\t\t}\n\t\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))\n\t\t\t{\n\t\t\t\t$this->data['date']['raw'] = $return[0]['data'];\n\t\t\t}\n\n\t\t\tif (!empty($this->data['date']['raw']))\n\t\t\t{\n\t\t\t\t$parser = $this->registry->call('Parse_Date', 'get');\n\t\t\t\t$this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->data['date'] = null;\n\t\t\t}\n\t\t}\n\t\tif ($this->data['date'])\n\t\t{\n\t\t\t$date_format = (string) $date_format;\n\t\t\tswitch ($date_format)\n\t\t\t{\n\t\t\t\tcase '':\n\t\t\t\t\treturn $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);\n\n\t\t\t\tcase 'U':\n\t\t\t\t\treturn $this->data['date']['parsed'];\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn date($date_format, $this->data['date']['parsed']);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the update date/time for the item\n\t *\n\t * Uses `<atom:updated>`\n\t *\n\t * Note: obeys PHP's timezone setting. To get a UTC date/time, use\n\t * {@see get_gmdate}\n\t *\n\t * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)\n\t * @return int|string|null\n\t */\n\tpublic function get_updated_date($date_format = 'j F Y, g:i a')\n\t{\n\t\tif (!isset($this->data['updated']))\n\t\t{\n\t\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))\n\t\t\t{\n\t\t\t\t$this->data['updated']['raw'] = $return[0]['data'];\n\t\t\t}\n\n\t\t\tif (!empty($this->data['updated']['raw']))\n\t\t\t{\n\t\t\t\t$parser = $this->registry->call('Parse_Date', 'get');\n\t\t\t\t$this->data['updated']['parsed'] = $parser->parse($this->data['date']['raw']);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->data['updated'] = null;\n\t\t\t}\n\t\t}\n\t\tif ($this->data['updated'])\n\t\t{\n\t\t\t$date_format = (string) $date_format;\n\t\t\tswitch ($date_format)\n\t\t\t{\n\t\t\t\tcase '':\n\t\t\t\t\treturn $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);\n\n\t\t\t\tcase 'U':\n\t\t\t\t\treturn $this->data['updated']['parsed'];\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn date($date_format, $this->data['updated']['parsed']);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the localized posting date/time for the item\n\t *\n\t * Returns the date formatted in the localized language. To display in\n\t * languages other than the server's default, you need to change the locale\n\t * with {@link http://php.net/setlocale setlocale()}. The available\n\t * localizations depend on which ones are installed on your web server.\n\t *\n\t * @since 1.0\n\t *\n\t * @param string $date_format Supports any PHP date format from {@see http://php.net/strftime} (empty for the raw data)\n\t * @return int|string|null\n\t */\n\tpublic function get_local_date($date_format = '%c')\n\t{\n\t\tif (!$date_format)\n\t\t{\n\t\t\treturn $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif (($date = $this->get_date('U')) !== null && $date !== false)\n\t\t{\n\t\t\treturn strftime($date_format, $date);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the posting date/time for the item (UTC time)\n\t *\n\t * @see get_date\n\t * @param string $date_format Supports any PHP date format from {@see http://php.net/date}\n\t * @return int|string|null\n\t */\n\tpublic function get_gmdate($date_format = 'j F Y, g:i a')\n\t{\n\t\t$date = $this->get_date('U');\n\t\tif ($date === null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\treturn gmdate($date_format, $date);\n\t}\n\n\t/**\n\t * Get the update date/time for the item (UTC time)\n\t *\n\t * @see get_updated_date\n\t * @param string $date_format Supports any PHP date format from {@see http://php.net/date}\n\t * @return int|string|null\n\t */\n\tpublic function get_updated_gmdate($date_format = 'j F Y, g:i a')\n\t{\n\t\t$date = $this->get_updated_date('U');\n\t\tif ($date === null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\treturn gmdate($date_format, $date);\n\t}\n\n\t/**\n\t * Get the permalink for the item\n\t *\n\t * Returns the first link available with a relationship of \"alternate\".\n\t * Identical to {@see get_link()} with key 0\n\t *\n\t * @see get_link\n\t * @since 0.8\n\t * @return string|null Permalink URL\n\t */\n\tpublic function get_permalink()\n\t{\n\t\t$link = $this->get_link();\n\t\t$enclosure = $this->get_enclosure(0);\n\t\tif ($link !== null)\n\t\t{\n\t\t\treturn $link;\n\t\t}\n\t\telseif ($enclosure !== null)\n\t\t{\n\t\t\treturn $enclosure->get_link();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single link for the item\n\t *\n\t * @since Beta 3\n\t * @param int $key The link that you want to return.  Remember that arrays begin with 0, not 1\n\t * @param string $rel The relationship of the link to return\n\t * @return string|null Link URL\n\t */\n\tpublic function get_link($key = 0, $rel = 'alternate')\n\t{\n\t\t$links = $this->get_links($rel);\n\t\tif ($links[$key] !== null)\n\t\t{\n\t\t\treturn $links[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all links for the item\n\t *\n\t * Uses `<atom:link>`, `<link>` or `<guid>`\n\t *\n\t * @since Beta 2\n\t * @param string $rel The relationship of links to return\n\t * @return array|null Links found for the item (strings)\n\t */\n\tpublic function get_links($rel = 'alternate')\n\t{\n\t\tif (!isset($this->data['links']))\n\t\t{\n\t\t\t$this->data['links'] = array();\n\t\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)\n\t\t\t{\n\t\t\t\tif (isset($link['attribs']['']['href']))\n\t\t\t\t{\n\t\t\t\t\t$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';\n\t\t\t\t\t$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)\n\t\t\t{\n\t\t\t\tif (isset($link['attribs']['']['href']))\n\t\t\t\t{\n\t\t\t\t\t$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';\n\t\t\t\t\t$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\t\t\tif ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\t\t\tif ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\t\t\tif ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))\n\t\t\t{\n\t\t\t\tif (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true')\n\t\t\t\t{\n\t\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$keys = array_keys($this->data['links']);\n\t\t\tforeach ($keys as $key)\n\t\t\t{\n\t\t\t\tif ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))\n\t\t\t\t{\n\t\t\t\t\tif (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);\n\t\t\t\t\t\t$this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)\n\t\t\t\t{\n\t\t\t\t\t$this->data['links'][substr($key, 41)] =& $this->data['links'][$key];\n\t\t\t\t}\n\t\t\t\t$this->data['links'][$key] = array_unique($this->data['links'][$key]);\n\t\t\t}\n\t\t}\n\t\tif (isset($this->data['links'][$rel]))\n\t\t{\n\t\t\treturn $this->data['links'][$rel];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get an enclosure from the item\n\t *\n\t * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.\n\t *\n\t * @since Beta 2\n\t * @todo Add ability to prefer one type of content over another (in a media group).\n\t * @param int $key The enclosure that you want to return.  Remember that arrays begin with 0, not 1\n\t * @return SimplePie_Enclosure|null\n\t */\n\tpublic function get_enclosure($key = 0, $prefer = null)\n\t{\n\t\t$enclosures = $this->get_enclosures();\n\t\tif (isset($enclosures[$key]))\n\t\t{\n\t\t\treturn $enclosures[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all available enclosures (podcasts, etc.)\n\t *\n\t * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.\n\t *\n\t * At this point, we're pretty much assuming that all enclosures for an item\n\t * are the same content.  Anything else is too complicated to\n\t * properly support.\n\t *\n\t * @since Beta 2\n\t * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).\n\t * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists).\n\t * @return array|null List of SimplePie_Enclosure items\n\t */\n\tpublic function get_enclosures()\n\t{\n\t\tif (!isset($this->data['enclosures']))\n\t\t{\n\t\t\t$this->data['enclosures'] = array();\n\n\t\t\t// Elements\n\t\t\t$captions_parent = null;\n\t\t\t$categories_parent = null;\n\t\t\t$copyrights_parent = null;\n\t\t\t$credits_parent = null;\n\t\t\t$description_parent = null;\n\t\t\t$duration_parent = null;\n\t\t\t$hashes_parent = null;\n\t\t\t$keywords_parent = null;\n\t\t\t$player_parent = null;\n\t\t\t$ratings_parent = null;\n\t\t\t$restrictions_parent = null;\n\t\t\t$thumbnails_parent = null;\n\t\t\t$title_parent = null;\n\n\t\t\t// Let's do the channel and item-level ones first, and just re-use them if we need to.\n\t\t\t$parent = $this->get_feed();\n\n\t\t\t// CAPTIONS\n\t\t\tif ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))\n\t\t\t{\n\t\t\t\tforeach ($captions as $caption)\n\t\t\t\t{\n\t\t\t\t\t$caption_type = null;\n\t\t\t\t\t$caption_lang = null;\n\t\t\t\t\t$caption_startTime = null;\n\t\t\t\t\t$caption_endTime = null;\n\t\t\t\t\t$caption_text = null;\n\t\t\t\t\tif (isset($caption['attribs']['']['type']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($caption['attribs']['']['lang']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($caption['attribs']['']['start']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($caption['attribs']['']['end']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($caption['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))\n\t\t\t{\n\t\t\t\tforeach ($captions as $caption)\n\t\t\t\t{\n\t\t\t\t\t$caption_type = null;\n\t\t\t\t\t$caption_lang = null;\n\t\t\t\t\t$caption_startTime = null;\n\t\t\t\t\t$caption_endTime = null;\n\t\t\t\t\t$caption_text = null;\n\t\t\t\t\tif (isset($caption['attribs']['']['type']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($caption['attribs']['']['lang']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($caption['attribs']['']['start']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($caption['attribs']['']['end']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($caption['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (is_array($captions_parent))\n\t\t\t{\n\t\t\t\t$captions_parent = array_values(array_unique($captions_parent));\n\t\t\t}\n\n\t\t\t// CATEGORIES\n\t\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)\n\t\t\t{\n\t\t\t\t$term = null;\n\t\t\t\t$scheme = null;\n\t\t\t\t$label = null;\n\t\t\t\tif (isset($category['data']))\n\t\t\t\t{\n\t\t\t\t\t$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\tif (isset($category['attribs']['']['scheme']))\n\t\t\t\t{\n\t\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$scheme = 'http://search.yahoo.com/mrss/category_schema';\n\t\t\t\t}\n\t\t\t\tif (isset($category['attribs']['']['label']))\n\t\t\t\t{\n\t\t\t\t\t$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\t$categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t\t}\n\t\t\tforeach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)\n\t\t\t{\n\t\t\t\t$term = null;\n\t\t\t\t$scheme = null;\n\t\t\t\t$label = null;\n\t\t\t\tif (isset($category['data']))\n\t\t\t\t{\n\t\t\t\t\t$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\tif (isset($category['attribs']['']['scheme']))\n\t\t\t\t{\n\t\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$scheme = 'http://search.yahoo.com/mrss/category_schema';\n\t\t\t\t}\n\t\t\t\tif (isset($category['attribs']['']['label']))\n\t\t\t\t{\n\t\t\t\t\t$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\t$categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t\t}\n\t\t\tforeach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)\n\t\t\t{\n\t\t\t\t$term = null;\n\t\t\t\t$scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';\n\t\t\t\t$label = null;\n\t\t\t\tif (isset($category['attribs']['']['text']))\n\t\t\t\t{\n\t\t\t\t\t$label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\t$categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));\n\n\t\t\t\tif (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))\n\t\t\t\t{\n\t\t\t\t\tforeach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (isset($subcategory['attribs']['']['text']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (is_array($categories_parent))\n\t\t\t{\n\t\t\t\t$categories_parent = array_values(array_unique($categories_parent));\n\t\t\t}\n\n\t\t\t// COPYRIGHT\n\t\t\tif ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))\n\t\t\t{\n\t\t\t\t$copyright_url = null;\n\t\t\t\t$copyright_label = null;\n\t\t\t\tif (isset($copyright[0]['attribs']['']['url']))\n\t\t\t\t{\n\t\t\t\t\t$copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\tif (isset($copyright[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\t$copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));\n\t\t\t}\n\t\t\telseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))\n\t\t\t{\n\t\t\t\t$copyright_url = null;\n\t\t\t\t$copyright_label = null;\n\t\t\t\tif (isset($copyright[0]['attribs']['']['url']))\n\t\t\t\t{\n\t\t\t\t\t$copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\tif (isset($copyright[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t\t$copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));\n\t\t\t}\n\n\t\t\t// CREDITS\n\t\t\tif ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))\n\t\t\t{\n\t\t\t\tforeach ($credits as $credit)\n\t\t\t\t{\n\t\t\t\t\t$credit_role = null;\n\t\t\t\t\t$credit_scheme = null;\n\t\t\t\t\t$credit_name = null;\n\t\t\t\t\tif (isset($credit['attribs']['']['role']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($credit['attribs']['']['scheme']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$credit_scheme = 'urn:ebu';\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($credit['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))\n\t\t\t{\n\t\t\t\tforeach ($credits as $credit)\n\t\t\t\t{\n\t\t\t\t\t$credit_role = null;\n\t\t\t\t\t$credit_scheme = null;\n\t\t\t\t\t$credit_name = null;\n\t\t\t\t\tif (isset($credit['attribs']['']['role']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($credit['attribs']['']['scheme']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$credit_scheme = 'urn:ebu';\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($credit['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (is_array($credits_parent))\n\t\t\t{\n\t\t\t\t$credits_parent = array_values(array_unique($credits_parent));\n\t\t\t}\n\n\t\t\t// DESCRIPTION\n\t\t\tif ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))\n\t\t\t{\n\t\t\t\tif (isset($description_parent[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))\n\t\t\t{\n\t\t\t\tif (isset($description_parent[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// DURATION\n\t\t\tif ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))\n\t\t\t{\n\t\t\t\t$seconds = null;\n\t\t\t\t$minutes = null;\n\t\t\t\t$hours = null;\n\t\t\t\tif (isset($duration_parent[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));\n\t\t\t\t\tif (sizeof($temp) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t$seconds = (int) array_pop($temp);\n\t\t\t\t\t}\n\t\t\t\t\tif (sizeof($temp) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t$minutes = (int) array_pop($temp);\n\t\t\t\t\t\t$seconds += $minutes * 60;\n\t\t\t\t\t}\n\t\t\t\t\tif (sizeof($temp) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t$hours = (int) array_pop($temp);\n\t\t\t\t\t\t$seconds += $hours * 3600;\n\t\t\t\t\t}\n\t\t\t\t\tunset($temp);\n\t\t\t\t\t$duration_parent = $seconds;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// HASHES\n\t\t\tif ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))\n\t\t\t{\n\t\t\t\tforeach ($hashes_iterator as $hash)\n\t\t\t\t{\n\t\t\t\t\t$value = null;\n\t\t\t\t\t$algo = null;\n\t\t\t\t\tif (isset($hash['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($hash['attribs']['']['algo']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$algo = 'md5';\n\t\t\t\t\t}\n\t\t\t\t\t$hashes_parent[] = $algo.':'.$value;\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))\n\t\t\t{\n\t\t\t\tforeach ($hashes_iterator as $hash)\n\t\t\t\t{\n\t\t\t\t\t$value = null;\n\t\t\t\t\t$algo = null;\n\t\t\t\t\tif (isset($hash['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($hash['attribs']['']['algo']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$algo = 'md5';\n\t\t\t\t\t}\n\t\t\t\t\t$hashes_parent[] = $algo.':'.$value;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (is_array($hashes_parent))\n\t\t\t{\n\t\t\t\t$hashes_parent = array_values(array_unique($hashes_parent));\n\t\t\t}\n\n\t\t\t// KEYWORDS\n\t\t\tif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))\n\t\t\t{\n\t\t\t\tif (isset($keywords[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));\n\t\t\t\t\tforeach ($temp as $word)\n\t\t\t\t\t{\n\t\t\t\t\t\t$keywords_parent[] = trim($word);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset($temp);\n\t\t\t}\n\t\t\telseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))\n\t\t\t{\n\t\t\t\tif (isset($keywords[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));\n\t\t\t\t\tforeach ($temp as $word)\n\t\t\t\t\t{\n\t\t\t\t\t\t$keywords_parent[] = trim($word);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset($temp);\n\t\t\t}\n\t\t\telseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))\n\t\t\t{\n\t\t\t\tif (isset($keywords[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));\n\t\t\t\t\tforeach ($temp as $word)\n\t\t\t\t\t{\n\t\t\t\t\t\t$keywords_parent[] = trim($word);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset($temp);\n\t\t\t}\n\t\t\telseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))\n\t\t\t{\n\t\t\t\tif (isset($keywords[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));\n\t\t\t\t\tforeach ($temp as $word)\n\t\t\t\t\t{\n\t\t\t\t\t\t$keywords_parent[] = trim($word);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset($temp);\n\t\t\t}\n\t\t\tif (is_array($keywords_parent))\n\t\t\t{\n\t\t\t\t$keywords_parent = array_values(array_unique($keywords_parent));\n\t\t\t}\n\n\t\t\t// PLAYER\n\t\t\tif ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))\n\t\t\t{\n\t\t\t\tif (isset($player_parent[0]['attribs']['']['url']))\n\t\t\t\t{\n\t\t\t\t\t$player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))\n\t\t\t{\n\t\t\t\tif (isset($player_parent[0]['attribs']['']['url']))\n\t\t\t\t{\n\t\t\t\t\t$player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// RATINGS\n\t\t\tif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))\n\t\t\t{\n\t\t\t\tforeach ($ratings as $rating)\n\t\t\t\t{\n\t\t\t\t\t$rating_scheme = null;\n\t\t\t\t\t$rating_value = null;\n\t\t\t\t\tif (isset($rating['attribs']['']['scheme']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$rating_scheme = 'urn:simple';\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($rating['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))\n\t\t\t{\n\t\t\t\tforeach ($ratings as $rating)\n\t\t\t\t{\n\t\t\t\t\t$rating_scheme = 'urn:itunes';\n\t\t\t\t\t$rating_value = null;\n\t\t\t\t\tif (isset($rating['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))\n\t\t\t{\n\t\t\t\tforeach ($ratings as $rating)\n\t\t\t\t{\n\t\t\t\t\t$rating_scheme = null;\n\t\t\t\t\t$rating_value = null;\n\t\t\t\t\tif (isset($rating['attribs']['']['scheme']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$rating_scheme = 'urn:simple';\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($rating['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))\n\t\t\t{\n\t\t\t\tforeach ($ratings as $rating)\n\t\t\t\t{\n\t\t\t\t\t$rating_scheme = 'urn:itunes';\n\t\t\t\t\t$rating_value = null;\n\t\t\t\t\tif (isset($rating['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (is_array($ratings_parent))\n\t\t\t{\n\t\t\t\t$ratings_parent = array_values(array_unique($ratings_parent));\n\t\t\t}\n\n\t\t\t// RESTRICTIONS\n\t\t\tif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))\n\t\t\t{\n\t\t\t\tforeach ($restrictions as $restriction)\n\t\t\t\t{\n\t\t\t\t\t$restriction_relationship = null;\n\t\t\t\t\t$restriction_type = null;\n\t\t\t\t\t$restriction_value = null;\n\t\t\t\t\tif (isset($restriction['attribs']['']['relationship']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($restriction['attribs']['']['type']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($restriction['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))\n\t\t\t{\n\t\t\t\tforeach ($restrictions as $restriction)\n\t\t\t\t{\n\t\t\t\t\t$restriction_relationship = 'allow';\n\t\t\t\t\t$restriction_type = null;\n\t\t\t\t\t$restriction_value = 'itunes';\n\t\t\t\t\tif (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')\n\t\t\t\t\t{\n\t\t\t\t\t\t$restriction_relationship = 'deny';\n\t\t\t\t\t}\n\t\t\t\t\t$restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))\n\t\t\t{\n\t\t\t\tforeach ($restrictions as $restriction)\n\t\t\t\t{\n\t\t\t\t\t$restriction_relationship = null;\n\t\t\t\t\t$restriction_type = null;\n\t\t\t\t\t$restriction_value = null;\n\t\t\t\t\tif (isset($restriction['attribs']['']['relationship']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($restriction['attribs']['']['type']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($restriction['data']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\t$restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))\n\t\t\t{\n\t\t\t\tforeach ($restrictions as $restriction)\n\t\t\t\t{\n\t\t\t\t\t$restriction_relationship = 'allow';\n\t\t\t\t\t$restriction_type = null;\n\t\t\t\t\t$restriction_value = 'itunes';\n\t\t\t\t\tif (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')\n\t\t\t\t\t{\n\t\t\t\t\t\t$restriction_relationship = 'deny';\n\t\t\t\t\t}\n\t\t\t\t\t$restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (is_array($restrictions_parent))\n\t\t\t{\n\t\t\t\t$restrictions_parent = array_values(array_unique($restrictions_parent));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$restrictions_parent = array(new SimplePie_Restriction('allow', null, 'default'));\n\t\t\t}\n\n\t\t\t// THUMBNAILS\n\t\t\tif ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))\n\t\t\t{\n\t\t\t\tforeach ($thumbnails as $thumbnail)\n\t\t\t\t{\n\t\t\t\t\tif (isset($thumbnail['attribs']['']['url']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))\n\t\t\t{\n\t\t\t\tforeach ($thumbnails as $thumbnail)\n\t\t\t\t{\n\t\t\t\t\tif (isset($thumbnail['attribs']['']['url']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// TITLES\n\t\t\tif ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))\n\t\t\t{\n\t\t\t\tif (isset($title_parent[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))\n\t\t\t{\n\t\t\t\tif (isset($title_parent[0]['data']))\n\t\t\t\t{\n\t\t\t\t\t$title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Clear the memory\n\t\t\tunset($parent);\n\n\t\t\t// Attributes\n\t\t\t$bitrate = null;\n\t\t\t$channels = null;\n\t\t\t$duration = null;\n\t\t\t$expression = null;\n\t\t\t$framerate = null;\n\t\t\t$height = null;\n\t\t\t$javascript = null;\n\t\t\t$lang = null;\n\t\t\t$length = null;\n\t\t\t$medium = null;\n\t\t\t$samplingrate = null;\n\t\t\t$type = null;\n\t\t\t$url = null;\n\t\t\t$width = null;\n\n\t\t\t// Elements\n\t\t\t$captions = null;\n\t\t\t$categories = null;\n\t\t\t$copyrights = null;\n\t\t\t$credits = null;\n\t\t\t$description = null;\n\t\t\t$hashes = null;\n\t\t\t$keywords = null;\n\t\t\t$player = null;\n\t\t\t$ratings = null;\n\t\t\t$restrictions = null;\n\t\t\t$thumbnails = null;\n\t\t\t$title = null;\n\n\t\t\t// If we have media:group tags, loop through them.\n\t\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)\n\t\t\t{\n\t\t\t\tif(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))\n\t\t\t\t{\n\t\t\t\t\t// If we have media:content tags, loop through them.\n\t\t\t\t\tforeach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (isset($content['attribs']['']['url']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Attributes\n\t\t\t\t\t\t\t$bitrate = null;\n\t\t\t\t\t\t\t$channels = null;\n\t\t\t\t\t\t\t$duration = null;\n\t\t\t\t\t\t\t$expression = null;\n\t\t\t\t\t\t\t$framerate = null;\n\t\t\t\t\t\t\t$height = null;\n\t\t\t\t\t\t\t$javascript = null;\n\t\t\t\t\t\t\t$lang = null;\n\t\t\t\t\t\t\t$length = null;\n\t\t\t\t\t\t\t$medium = null;\n\t\t\t\t\t\t\t$samplingrate = null;\n\t\t\t\t\t\t\t$type = null;\n\t\t\t\t\t\t\t$url = null;\n\t\t\t\t\t\t\t$width = null;\n\n\t\t\t\t\t\t\t// Elements\n\t\t\t\t\t\t\t$captions = null;\n\t\t\t\t\t\t\t$categories = null;\n\t\t\t\t\t\t\t$copyrights = null;\n\t\t\t\t\t\t\t$credits = null;\n\t\t\t\t\t\t\t$description = null;\n\t\t\t\t\t\t\t$hashes = null;\n\t\t\t\t\t\t\t$keywords = null;\n\t\t\t\t\t\t\t$player = null;\n\t\t\t\t\t\t\t$ratings = null;\n\t\t\t\t\t\t\t$restrictions = null;\n\t\t\t\t\t\t\t$thumbnails = null;\n\t\t\t\t\t\t\t$title = null;\n\n\t\t\t\t\t\t\t// Start checking the attributes of media:content\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['bitrate']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['channels']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['duration']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$duration = $duration_parent;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['expression']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['framerate']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['height']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['lang']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['fileSize']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$length = ceil($content['attribs']['']['fileSize']);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['medium']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['samplingrate']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['type']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['attribs']['']['width']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\n\t\t\t\t\t\t\t// Checking the other optional media: elements. Priority: media:content, media:group, item, channel\n\n\t\t\t\t\t\t\t// CAPTIONS\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$caption_type = null;\n\t\t\t\t\t\t\t\t\t$caption_lang = null;\n\t\t\t\t\t\t\t\t\t$caption_startTime = null;\n\t\t\t\t\t\t\t\t\t$caption_endTime = null;\n\t\t\t\t\t\t\t\t\t$caption_text = null;\n\t\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['type']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['lang']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['start']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['end']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($caption['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($captions))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$captions = array_values(array_unique($captions));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$caption_type = null;\n\t\t\t\t\t\t\t\t\t$caption_lang = null;\n\t\t\t\t\t\t\t\t\t$caption_startTime = null;\n\t\t\t\t\t\t\t\t\t$caption_endTime = null;\n\t\t\t\t\t\t\t\t\t$caption_text = null;\n\t\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['type']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['lang']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['start']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['end']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($caption['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($captions))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$captions = array_values(array_unique($captions));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$captions = $captions_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// CATEGORIES\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$term = null;\n\t\t\t\t\t\t\t\t\t$scheme = null;\n\t\t\t\t\t\t\t\t\t$label = null;\n\t\t\t\t\t\t\t\t\tif (isset($category['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($category['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$scheme = 'http://search.yahoo.com/mrss/category_schema';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($category['attribs']['']['label']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$term = null;\n\t\t\t\t\t\t\t\t\t$scheme = null;\n\t\t\t\t\t\t\t\t\t$label = null;\n\t\t\t\t\t\t\t\t\tif (isset($category['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($category['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$scheme = 'http://search.yahoo.com/mrss/category_schema';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($category['attribs']['']['label']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($categories) && is_array($categories_parent))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$categories = array_values(array_unique(array_merge($categories, $categories_parent)));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (is_array($categories))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$categories = array_values(array_unique($categories));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (is_array($categories_parent))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$categories = array_values(array_unique($categories_parent));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// COPYRIGHTS\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$copyright_url = null;\n\t\t\t\t\t\t\t\t$copyright_label = null;\n\t\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$copyright_url = null;\n\t\t\t\t\t\t\t\t$copyright_label = null;\n\t\t\t\t\t\t\t\tif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$copyrights = $copyrights_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// CREDITS\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$credit_role = null;\n\t\t\t\t\t\t\t\t\t$credit_scheme = null;\n\t\t\t\t\t\t\t\t\t$credit_name = null;\n\t\t\t\t\t\t\t\t\tif (isset($credit['attribs']['']['role']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($credit['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$credit_scheme = 'urn:ebu';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($credit['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($credits))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$credits = array_values(array_unique($credits));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$credit_role = null;\n\t\t\t\t\t\t\t\t\t$credit_scheme = null;\n\t\t\t\t\t\t\t\t\t$credit_name = null;\n\t\t\t\t\t\t\t\t\tif (isset($credit['attribs']['']['role']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($credit['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$credit_scheme = 'urn:ebu';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($credit['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($credits))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$credits = array_values(array_unique($credits));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$credits = $credits_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// DESCRIPTION\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$description = $description_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// HASHES\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$value = null;\n\t\t\t\t\t\t\t\t\t$algo = null;\n\t\t\t\t\t\t\t\t\tif (isset($hash['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($hash['attribs']['']['algo']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$algo = 'md5';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$hashes[] = $algo.':'.$value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($hashes))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$hashes = array_values(array_unique($hashes));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$value = null;\n\t\t\t\t\t\t\t\t\t$algo = null;\n\t\t\t\t\t\t\t\t\tif (isset($hash['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($hash['attribs']['']['algo']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$algo = 'md5';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$hashes[] = $algo.':'.$value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($hashes))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$hashes = array_values(array_unique($hashes));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$hashes = $hashes_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// KEYWORDS\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));\n\t\t\t\t\t\t\t\t\tforeach ($temp as $word)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$keywords[] = trim($word);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tunset($temp);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($keywords))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$keywords = array_values(array_unique($keywords));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));\n\t\t\t\t\t\t\t\t\tforeach ($temp as $word)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$keywords[] = trim($word);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tunset($temp);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($keywords))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$keywords = array_values(array_unique($keywords));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$keywords = $keywords_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// PLAYER\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$player = $player_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// RATINGS\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$rating_scheme = null;\n\t\t\t\t\t\t\t\t\t$rating_value = null;\n\t\t\t\t\t\t\t\t\tif (isset($rating['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$rating_scheme = 'urn:simple';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($rating['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($ratings))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$ratings = array_values(array_unique($ratings));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$rating_scheme = null;\n\t\t\t\t\t\t\t\t\t$rating_value = null;\n\t\t\t\t\t\t\t\t\tif (isset($rating['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$rating_scheme = 'urn:simple';\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($rating['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($ratings))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$ratings = array_values(array_unique($ratings));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$ratings = $ratings_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// RESTRICTIONS\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$restriction_relationship = null;\n\t\t\t\t\t\t\t\t\t$restriction_type = null;\n\t\t\t\t\t\t\t\t\t$restriction_value = null;\n\t\t\t\t\t\t\t\t\tif (isset($restriction['attribs']['']['relationship']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($restriction['attribs']['']['type']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($restriction['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($restrictions))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$restrictions = array_values(array_unique($restrictions));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$restriction_relationship = null;\n\t\t\t\t\t\t\t\t\t$restriction_type = null;\n\t\t\t\t\t\t\t\t\t$restriction_value = null;\n\t\t\t\t\t\t\t\t\tif (isset($restriction['attribs']['']['relationship']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($restriction['attribs']['']['type']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (isset($restriction['data']))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t$restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($restrictions))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$restrictions = array_values(array_unique($restrictions));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$restrictions = $restrictions_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// THUMBNAILS\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($thumbnails))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$thumbnails = array_values(array_unique($thumbnails));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tforeach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (is_array($thumbnails))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$thumbnails = array_values(array_unique($thumbnails));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$thumbnails = $thumbnails_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// TITLES\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$title = $title_parent;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we have standalone media:content tags, loop through them.\n\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))\n\t\t\t{\n\t\t\t\tforeach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)\n\t\t\t\t{\n\t\t\t\t\tif (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Attributes\n\t\t\t\t\t\t$bitrate = null;\n\t\t\t\t\t\t$channels = null;\n\t\t\t\t\t\t$duration = null;\n\t\t\t\t\t\t$expression = null;\n\t\t\t\t\t\t$framerate = null;\n\t\t\t\t\t\t$height = null;\n\t\t\t\t\t\t$javascript = null;\n\t\t\t\t\t\t$lang = null;\n\t\t\t\t\t\t$length = null;\n\t\t\t\t\t\t$medium = null;\n\t\t\t\t\t\t$samplingrate = null;\n\t\t\t\t\t\t$type = null;\n\t\t\t\t\t\t$url = null;\n\t\t\t\t\t\t$width = null;\n\n\t\t\t\t\t\t// Elements\n\t\t\t\t\t\t$captions = null;\n\t\t\t\t\t\t$categories = null;\n\t\t\t\t\t\t$copyrights = null;\n\t\t\t\t\t\t$credits = null;\n\t\t\t\t\t\t$description = null;\n\t\t\t\t\t\t$hashes = null;\n\t\t\t\t\t\t$keywords = null;\n\t\t\t\t\t\t$player = null;\n\t\t\t\t\t\t$ratings = null;\n\t\t\t\t\t\t$restrictions = null;\n\t\t\t\t\t\t$thumbnails = null;\n\t\t\t\t\t\t$title = null;\n\n\t\t\t\t\t\t// Start checking the attributes of media:content\n\t\t\t\t\t\tif (isset($content['attribs']['']['bitrate']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['channels']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['duration']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$duration = $duration_parent;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['expression']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['framerate']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['height']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['lang']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['fileSize']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$length = ceil($content['attribs']['']['fileSize']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['medium']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['samplingrate']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['type']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['width']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($content['attribs']['']['url']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Checking the other optional media: elements. Priority: media:content, media:group, item, channel\n\n\t\t\t\t\t\t// CAPTIONS\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$caption_type = null;\n\t\t\t\t\t\t\t\t$caption_lang = null;\n\t\t\t\t\t\t\t\t$caption_startTime = null;\n\t\t\t\t\t\t\t\t$caption_endTime = null;\n\t\t\t\t\t\t\t\t$caption_text = null;\n\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['type']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['lang']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['start']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($caption['attribs']['']['end']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($caption['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($captions))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$captions = array_values(array_unique($captions));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$captions = $captions_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// CATEGORIES\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$term = null;\n\t\t\t\t\t\t\t\t$scheme = null;\n\t\t\t\t\t\t\t\t$label = null;\n\t\t\t\t\t\t\t\tif (isset($category['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($category['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$scheme = 'http://search.yahoo.com/mrss/category_schema';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($category['attribs']['']['label']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (is_array($categories) && is_array($categories_parent))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$categories = array_values(array_unique(array_merge($categories, $categories_parent)));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telseif (is_array($categories))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$categories = array_values(array_unique($categories));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telseif (is_array($categories_parent))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$categories = array_values(array_unique($categories_parent));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$categories = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// COPYRIGHTS\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$copyright_url = null;\n\t\t\t\t\t\t\t$copyright_label = null;\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$copyrights = $copyrights_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// CREDITS\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$credit_role = null;\n\t\t\t\t\t\t\t\t$credit_scheme = null;\n\t\t\t\t\t\t\t\t$credit_name = null;\n\t\t\t\t\t\t\t\tif (isset($credit['attribs']['']['role']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($credit['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$credit_scheme = 'urn:ebu';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($credit['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($credits))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$credits = array_values(array_unique($credits));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$credits = $credits_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// DESCRIPTION\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$description = $description_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HASHES\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$value = null;\n\t\t\t\t\t\t\t\t$algo = null;\n\t\t\t\t\t\t\t\tif (isset($hash['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($hash['attribs']['']['algo']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$algo = 'md5';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$hashes[] = $algo.':'.$value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($hashes))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$hashes = array_values(array_unique($hashes));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$hashes = $hashes_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// KEYWORDS\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));\n\t\t\t\t\t\t\t\tforeach ($temp as $word)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$keywords[] = trim($word);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tunset($temp);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($keywords))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$keywords = array_values(array_unique($keywords));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$keywords = $keywords_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// PLAYER\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$player = $player_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// RATINGS\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$rating_scheme = null;\n\t\t\t\t\t\t\t\t$rating_value = null;\n\t\t\t\t\t\t\t\tif (isset($rating['attribs']['']['scheme']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$rating_scheme = 'urn:simple';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($rating['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($ratings))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$ratings = array_values(array_unique($ratings));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$ratings = $ratings_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// RESTRICTIONS\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$restriction_relationship = null;\n\t\t\t\t\t\t\t\t$restriction_type = null;\n\t\t\t\t\t\t\t\t$restriction_value = null;\n\t\t\t\t\t\t\t\tif (isset($restriction['attribs']['']['relationship']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($restriction['attribs']['']['type']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (isset($restriction['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t$restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t$restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($restrictions))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$restrictions = array_values(array_unique($restrictions));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$restrictions = $restrictions_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// THUMBNAILS\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (is_array($thumbnails))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$thumbnails = array_values(array_unique($thumbnails));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$thumbnails = $thumbnails_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// TITLES\n\t\t\t\t\t\tif (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$title = $title_parent;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)\n\t\t\t{\n\t\t\t\tif (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')\n\t\t\t\t{\n\t\t\t\t\t// Attributes\n\t\t\t\t\t$bitrate = null;\n\t\t\t\t\t$channels = null;\n\t\t\t\t\t$duration = null;\n\t\t\t\t\t$expression = null;\n\t\t\t\t\t$framerate = null;\n\t\t\t\t\t$height = null;\n\t\t\t\t\t$javascript = null;\n\t\t\t\t\t$lang = null;\n\t\t\t\t\t$length = null;\n\t\t\t\t\t$medium = null;\n\t\t\t\t\t$samplingrate = null;\n\t\t\t\t\t$type = null;\n\t\t\t\t\t$url = null;\n\t\t\t\t\t$width = null;\n\n\t\t\t\t\t$url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));\n\t\t\t\t\tif (isset($link['attribs']['']['type']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($link['attribs']['']['length']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$length = ceil($link['attribs']['']['length']);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor\n\t\t\t\t\t$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tforeach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)\n\t\t\t{\n\t\t\t\tif (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')\n\t\t\t\t{\n\t\t\t\t\t// Attributes\n\t\t\t\t\t$bitrate = null;\n\t\t\t\t\t$channels = null;\n\t\t\t\t\t$duration = null;\n\t\t\t\t\t$expression = null;\n\t\t\t\t\t$framerate = null;\n\t\t\t\t\t$height = null;\n\t\t\t\t\t$javascript = null;\n\t\t\t\t\t$lang = null;\n\t\t\t\t\t$length = null;\n\t\t\t\t\t$medium = null;\n\t\t\t\t\t$samplingrate = null;\n\t\t\t\t\t$type = null;\n\t\t\t\t\t$url = null;\n\t\t\t\t\t$width = null;\n\n\t\t\t\t\t$url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));\n\t\t\t\t\tif (isset($link['attribs']['']['type']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($link['attribs']['']['length']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$length = ceil($link['attribs']['']['length']);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor\n\t\t\t\t\t$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure'))\n\t\t\t{\n\t\t\t\tif (isset($enclosure[0]['attribs']['']['url']))\n\t\t\t\t{\n\t\t\t\t\t// Attributes\n\t\t\t\t\t$bitrate = null;\n\t\t\t\t\t$channels = null;\n\t\t\t\t\t$duration = null;\n\t\t\t\t\t$expression = null;\n\t\t\t\t\t$framerate = null;\n\t\t\t\t\t$height = null;\n\t\t\t\t\t$javascript = null;\n\t\t\t\t\t$lang = null;\n\t\t\t\t\t$length = null;\n\t\t\t\t\t$medium = null;\n\t\t\t\t\t$samplingrate = null;\n\t\t\t\t\t$type = null;\n\t\t\t\t\t$url = null;\n\t\t\t\t\t$width = null;\n\n\t\t\t\t\t$url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));\n\t\t\t\t\tif (isset($enclosure[0]['attribs']['']['type']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t\t\t}\n\t\t\t\t\tif (isset($enclosure[0]['attribs']['']['length']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$length = ceil($enclosure[0]['attribs']['']['length']);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor\n\t\t\t\t\t$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width))\n\t\t\t{\n\t\t\t\t// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor\n\t\t\t\t$this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));\n\t\t\t}\n\n\t\t\t$this->data['enclosures'] = array_values(array_unique($this->data['enclosures']));\n\t\t}\n\t\tif (!empty($this->data['enclosures']))\n\t\t{\n\t\t\treturn $this->data['enclosures'];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the latitude coordinates for the item\n\t *\n\t * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications\n\t *\n\t * Uses `<geo:lat>` or `<georss:point>`\n\t *\n\t * @since 1.0\n\t * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo\n\t * @link http://www.georss.org/ GeoRSS\n\t * @return string|null\n\t */\n\tpublic function get_latitude()\n\t{\n\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\\.[0-9]+)) ((?:-)?[0-9]+(?:\\.[0-9]+))$/', trim($return[0]['data']), $match))\n\t\t{\n\t\t\treturn (float) $match[1];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the longitude coordinates for the item\n\t *\n\t * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications\n\t *\n\t * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>`\n\t *\n\t * @since 1.0\n\t * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo\n\t * @link http://www.georss.org/ GeoRSS\n\t * @return string|null\n\t */\n\tpublic function get_longitude()\n\t{\n\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\\.[0-9]+)) ((?:-)?[0-9]+(?:\\.[0-9]+))$/', trim($return[0]['data']), $match))\n\t\t{\n\t\t\treturn (float) $match[2];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the `<atom:source>` for the item\n\t *\n\t * @since 1.1\n\t * @return SimplePie_Source|null\n\t */\n\tpublic function get_source()\n\t{\n\t\tif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))\n\t\t{\n\t\t\treturn $this->registry->create('Source', array($this, $return[0]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Locator.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Used for feed auto-discovery\n *\n *\n * This class can be overloaded with {@see SimplePie::set_locator_class()}\n *\n * @package SimplePie\n */\nclass SimplePie_Locator\n{\n\tvar $useragent;\n\tvar $timeout;\n\tvar $file;\n\tvar $local = array();\n\tvar $elsewhere = array();\n\tvar $cached_entities = array();\n\tvar $http_base;\n\tvar $base;\n\tvar $base_location = 0;\n\tvar $checked_feeds = 0;\n\tvar $max_checked_feeds = 10;\n\tprotected $registry;\n\n\tpublic function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10)\n\t{\n\t\t$this->file = $file;\n\t\t$this->useragent = $useragent;\n\t\t$this->timeout = $timeout;\n\t\t$this->max_checked_feeds = $max_checked_feeds;\n\n\t\tif (class_exists('DOMDocument'))\n\t\t{\n\t\t\t$this->dom = new DOMDocument();\n\n\t\t\tset_error_handler(array('SimplePie_Misc', 'silence_errors'));\n\t\t\t$this->dom->loadHTML($this->file->body);\n\t\t\trestore_error_handler();\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->dom = null;\n\t\t}\n\t}\n\n\tpublic function set_registry(SimplePie_Registry $registry)\n\t{\n\t\t$this->registry = $registry;\n\t}\n\n\tpublic function find($type = SIMPLEPIE_LOCATOR_ALL, &$working)\n\t{\n\t\tif ($this->is_feed($this->file))\n\t\t{\n\t\t\treturn $this->file;\n\t\t}\n\n\t\tif ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)\n\t\t{\n\t\t\t$sniffer = $this->registry->create('Content_Type_Sniffer', array($this->file));\n\t\t\tif ($sniffer->get_type() !== 'text/html')\n\t\t\t{\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif ($type & ~SIMPLEPIE_LOCATOR_NONE)\n\t\t{\n\t\t\t$this->get_base();\n\t\t}\n\n\t\tif ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery())\n\t\t{\n\t\t\treturn $working[0];\n\t\t}\n\n\t\tif ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links())\n\t\t{\n\t\t\tif ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))\n\t\t\t{\n\t\t\t\treturn $working;\n\t\t\t}\n\n\t\t\tif ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))\n\t\t\t{\n\t\t\t\treturn $working;\n\t\t\t}\n\n\t\t\tif ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))\n\t\t\t{\n\t\t\t\treturn $working;\n\t\t\t}\n\n\t\t\tif ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))\n\t\t\t{\n\t\t\t\treturn $working;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic function is_feed($file)\n\t{\n\t\tif ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)\n\t\t{\n\t\t\t$sniffer = $this->registry->create('Content_Type_Sniffer', array($file));\n\t\t\t$sniffed = $sniffer->get_type();\n\t\t\tif (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml')))\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\telseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic function get_base()\n\t{\n\t\tif ($this->dom === null)\n\t\t{\n\t\t\tthrow new SimplePie_Exception('DOMDocument not found, unable to use locator');\n\t\t}\n\t\t$this->http_base = $this->file->url;\n\t\t$this->base = $this->http_base;\n\t\t$elements = $this->dom->getElementsByTagName('base');\n\t\tforeach ($elements as $element)\n\t\t{\n\t\t\tif ($element->hasAttribute('href'))\n\t\t\t{\n\t\t\t\t$base = $this->registry->call('Misc', 'absolutize_url', array(trim($element->getAttribute('href')), $this->http_base));\n\t\t\t\tif ($base === false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$this->base = $base;\n\t\t\t\t$this->base_location = method_exists($element, 'getLineNo') ? $element->getLineNo() : 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function autodiscovery()\n\t{\n\t\t$done = array();\n\t\t$feeds = array();\n\t\t$feeds = array_merge($feeds, $this->search_elements_by_tag('link', $done, $feeds));\n\t\t$feeds = array_merge($feeds, $this->search_elements_by_tag('a', $done, $feeds));\n\t\t$feeds = array_merge($feeds, $this->search_elements_by_tag('area', $done, $feeds));\n\n\t\tif (!empty($feeds))\n\t\t{\n\t\t\treturn array_values($feeds);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprotected function search_elements_by_tag($name, &$done, $feeds)\n\t{\n\t\tif ($this->dom === null)\n\t\t{\n\t\t\tthrow new SimplePie_Exception('DOMDocument not found, unable to use locator');\n\t\t}\n\n\t\t$links = $this->dom->getElementsByTagName($name);\n\t\tforeach ($links as $link)\n\t\t{\n\t\t\tif ($this->checked_feeds === $this->max_checked_feeds)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ($link->hasAttribute('href') && $link->hasAttribute('rel'))\n\t\t\t{\n\t\t\t\t$rel = array_unique($this->registry->call('Misc', 'space_seperated_tokens', array(strtolower($link->getAttribute('rel')))));\n\t\t\t\t$line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1;\n\n\t\t\t\tif ($this->base_location < $line)\n\t\t\t\t{\n\t\t\t\t\t$href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base));\n\t\t\t\t}\n\t\t\t\tif ($href === false)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href]))\n\t\t\t\t{\n\t\t\t\t\t$this->checked_feeds++;\n\t\t\t\t\t$headers = array(\n\t\t\t\t\t\t'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',\n\t\t\t\t\t);\n\t\t\t\t\t$feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent));\n\t\t\t\t\tif ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))\n\t\t\t\t\t{\n\t\t\t\t\t\t$feeds[$href] = $feed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$done[] = $href;\n\t\t\t}\n\t\t}\n\n\t\treturn $feeds;\n\t}\n\n\tpublic function get_links()\n\t{\n\t\tif ($this->dom === null)\n\t\t{\n\t\t\tthrow new SimplePie_Exception('DOMDocument not found, unable to use locator');\n\t\t}\n\n\t\t$links = $this->dom->getElementsByTagName('a');\n\t\tforeach ($links as $link)\n\t\t{\n\t\t\tif ($link->hasAttribute('href'))\n\t\t\t{\n\t\t\t\t$href = trim($link->getAttribute('href'));\n\t\t\t\t$parsed = $this->registry->call('Misc', 'parse_url', array($href));\n\t\t\t\tif ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme']))\n\t\t\t\t{\n\t\t\t\t\tif (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo())\n\t\t\t\t\t{\n\t\t\t\t\t\t$href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base));\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base));\n\t\t\t\t\t}\n\t\t\t\t\tif ($href === false)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$current = $this->registry->call('Misc', 'parse_url', array($this->file->url));\n\n\t\t\t\t\tif ($parsed['authority'] === '' || $parsed['authority'] === $current['authority'])\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->local[] = $href;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->elsewhere[] = $href;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$this->local = array_unique($this->local);\n\t\t$this->elsewhere = array_unique($this->elsewhere);\n\t\tif (!empty($this->local) || !empty($this->elsewhere))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic function extension(&$array)\n\t{\n\t\tforeach ($array as $key => $value)\n\t\t{\n\t\t\tif ($this->checked_feeds === $this->max_checked_feeds)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml')))\n\t\t\t{\n\t\t\t\t$this->checked_feeds++;\n\n\t\t\t\t$headers = array(\n\t\t\t\t\t'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',\n\t\t\t\t);\n\t\t\t\t$feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent));\n\t\t\t\tif ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))\n\t\t\t\t{\n\t\t\t\t\treturn $feed;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tunset($array[$key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic function body(&$array)\n\t{\n\t\tforeach ($array as $key => $value)\n\t\t{\n\t\t\tif ($this->checked_feeds === $this->max_checked_feeds)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (preg_match('/(rss|rdf|atom|xml)/i', $value))\n\t\t\t{\n\t\t\t\t$this->checked_feeds++;\n\t\t\t\t$headers = array(\n\t\t\t\t\t'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',\n\t\t\t\t);\n\t\t\t\t$feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent));\n\t\t\t\tif ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))\n\t\t\t\t{\n\t\t\t\t\treturn $feed;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tunset($array[$key]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Misc.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Miscellanous utilities\n *\n * @package SimplePie\n */\nclass SimplePie_Misc\n{\n\tpublic static function time_hms($seconds)\n\t{\n\t\t$time = '';\n\n\t\t$hours = floor($seconds / 3600);\n\t\t$remainder = $seconds % 3600;\n\t\tif ($hours > 0)\n\t\t{\n\t\t\t$time .= $hours.':';\n\t\t}\n\n\t\t$minutes = floor($remainder / 60);\n\t\t$seconds = $remainder % 60;\n\t\tif ($minutes < 10 && $hours > 0)\n\t\t{\n\t\t\t$minutes = '0' . $minutes;\n\t\t}\n\t\tif ($seconds < 10)\n\t\t{\n\t\t\t$seconds = '0' . $seconds;\n\t\t}\n\n\t\t$time .= $minutes.':';\n\t\t$time .= $seconds;\n\n\t\treturn $time;\n\t}\n\n\tpublic static function absolutize_url($relative, $base)\n\t{\n\t\t$iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);\n\t\tif ($iri === false)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\treturn $iri->get_uri();\n\t}\n\n\t/**\n\t * Get a HTML/XML element from a HTML string\n\t *\n\t * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!)\n\t * @param string $realname Element name (including namespace prefix if applicable)\n\t * @param string $string HTML document\n\t * @return array\n\t */\n\tpublic static function get_element($realname, $string)\n\t{\n\t\t$return = array();\n\t\t$name = preg_quote($realname, '/');\n\t\tif (preg_match_all(\"/<($name)\" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . \"(>(.*)<\\/$name>|(\\/)?>)/siU\", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))\n\t\t{\n\t\t\tfor ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)\n\t\t\t{\n\t\t\t\t$return[$i]['tag'] = $realname;\n\t\t\t\t$return[$i]['full'] = $matches[$i][0][0];\n\t\t\t\t$return[$i]['offset'] = $matches[$i][0][1];\n\t\t\t\tif (strlen($matches[$i][3][0]) <= 2)\n\t\t\t\t{\n\t\t\t\t\t$return[$i]['self_closing'] = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$return[$i]['self_closing'] = false;\n\t\t\t\t\t$return[$i]['content'] = $matches[$i][4][0];\n\t\t\t\t}\n\t\t\t\t$return[$i]['attribs'] = array();\n\t\t\t\tif (isset($matches[$i][2][0]) && preg_match_all('/[\\x09\\x0A\\x0B\\x0C\\x0D\\x20]+([^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x2F\\x3E][^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x2F\\x3D\\x3E]*)(?:[\\x09\\x0A\\x0B\\x0C\\x0D\\x20]*=[\\x09\\x0A\\x0B\\x0C\\x0D\\x20]*(?:\"([^\"]*)\"|\\'([^\\']*)\\'|([^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x22\\x27\\x3E][^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))\n\t\t\t\t{\n\t\t\t\t\tfor ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (count($attribs[$j]) === 2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$attribs[$j][2] = $attribs[$j][1];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $return;\n\t}\n\n\tpublic static function element_implode($element)\n\t{\n\t\t$full = \"<$element[tag]\";\n\t\tforeach ($element['attribs'] as $key => $value)\n\t\t{\n\t\t\t$key = strtolower($key);\n\t\t\t$full .= \" $key=\\\"\" . htmlspecialchars($value['data']) . '\"';\n\t\t}\n\t\tif ($element['self_closing'])\n\t\t{\n\t\t\t$full .= ' />';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$full .= \">$element[content]</$element[tag]>\";\n\t\t}\n\t\treturn $full;\n\t}\n\n\tpublic static function error($message, $level, $file, $line)\n\t{\n\t\tif ((ini_get('error_reporting') & $level) > 0)\n\t\t{\n\t\t\tswitch ($level)\n\t\t\t{\n\t\t\t\tcase E_USER_ERROR:\n\t\t\t\t\t$note = 'PHP Error';\n\t\t\t\t\tbreak;\n\t\t\t\tcase E_USER_WARNING:\n\t\t\t\t\t$note = 'PHP Warning';\n\t\t\t\t\tbreak;\n\t\t\t\tcase E_USER_NOTICE:\n\t\t\t\t\t$note = 'PHP Notice';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$note = 'Unknown Error';\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$log_error = true;\n\t\t\tif (!function_exists('error_log'))\n\t\t\t{\n\t\t\t\t$log_error = false;\n\t\t\t}\n\n\t\t\t$log_file = @ini_get('error_log');\n\t\t\tif (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file))\n\t\t\t{\n\t\t\t\t$log_error = false;\n\t\t\t}\n\n\t\t\tif ($log_error)\n\t\t\t{\n\t\t\t\t@error_log(\"$note: $message in $file on line $line\", 0);\n\t\t\t}\n\t\t}\n\n\t\treturn $message;\n\t}\n\n\tpublic static function fix_protocol($url, $http = 1)\n\t{\n\t\t$url = SimplePie_Misc::normalize_url($url);\n\t\t$parsed = SimplePie_Misc::parse_url($url);\n\t\tif ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https')\n\t\t{\n\t\t\treturn SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);\n\t\t}\n\n\t\tif ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))\n\t\t{\n\t\t\treturn SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);\n\t\t}\n\n\t\tif ($http === 2 && $parsed['scheme'] !== '')\n\t\t{\n\t\t\treturn \"feed:$url\";\n\t\t}\n\t\telseif ($http === 3 && strtolower($parsed['scheme']) === 'http')\n\t\t{\n\t\t\treturn substr_replace($url, 'podcast', 0, 4);\n\t\t}\n\t\telseif ($http === 4 && strtolower($parsed['scheme']) === 'http')\n\t\t{\n\t\t\treturn substr_replace($url, 'itpc', 0, 4);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $url;\n\t\t}\n\t}\n\n\tpublic static function parse_url($url)\n\t{\n\t\t$iri = new SimplePie_IRI($url);\n\t\treturn array(\n\t\t\t'scheme' => (string) $iri->scheme,\n\t\t\t'authority' => (string) $iri->authority,\n\t\t\t'path' => (string) $iri->path,\n\t\t\t'query' => (string) $iri->query,\n\t\t\t'fragment' => (string) $iri->fragment\n\t\t);\n\t}\n\n\tpublic static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')\n\t{\n\t\t$iri = new SimplePie_IRI('');\n\t\t$iri->scheme = $scheme;\n\t\t$iri->authority = $authority;\n\t\t$iri->path = $path;\n\t\t$iri->query = $query;\n\t\t$iri->fragment = $fragment;\n\t\treturn $iri->get_uri();\n\t}\n\n\tpublic static function normalize_url($url)\n\t{\n\t\t$iri = new SimplePie_IRI($url);\n\t\treturn $iri->get_uri();\n\t}\n\n\tpublic static function percent_encoding_normalization($match)\n\t{\n\t\t$integer = hexdec($match[1]);\n\t\tif ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E)\n\t\t{\n\t\t\treturn chr($integer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn strtoupper($match[0]);\n\t\t}\n\t}\n\n\t/**\n\t * Converts a Windows-1252 encoded string to a UTF-8 encoded string\n\t *\n\t * @static\n\t * @param string $string Windows-1252 encoded string\n\t * @return string UTF-8 encoded string\n\t */\n\tpublic static function windows_1252_to_utf8($string)\n\t{\n\t\tstatic $convert_table = array(\"\\x80\" => \"\\xE2\\x82\\xAC\", \"\\x81\" => \"\\xEF\\xBF\\xBD\", \"\\x82\" => \"\\xE2\\x80\\x9A\", \"\\x83\" => \"\\xC6\\x92\", \"\\x84\" => \"\\xE2\\x80\\x9E\", \"\\x85\" => \"\\xE2\\x80\\xA6\", \"\\x86\" => \"\\xE2\\x80\\xA0\", \"\\x87\" => \"\\xE2\\x80\\xA1\", \"\\x88\" => \"\\xCB\\x86\", \"\\x89\" => \"\\xE2\\x80\\xB0\", \"\\x8A\" => \"\\xC5\\xA0\", \"\\x8B\" => \"\\xE2\\x80\\xB9\", \"\\x8C\" => \"\\xC5\\x92\", \"\\x8D\" => \"\\xEF\\xBF\\xBD\", \"\\x8E\" => \"\\xC5\\xBD\", \"\\x8F\" => \"\\xEF\\xBF\\xBD\", \"\\x90\" => \"\\xEF\\xBF\\xBD\", \"\\x91\" => \"\\xE2\\x80\\x98\", \"\\x92\" => \"\\xE2\\x80\\x99\", \"\\x93\" => \"\\xE2\\x80\\x9C\", \"\\x94\" => \"\\xE2\\x80\\x9D\", \"\\x95\" => \"\\xE2\\x80\\xA2\", \"\\x96\" => \"\\xE2\\x80\\x93\", \"\\x97\" => \"\\xE2\\x80\\x94\", \"\\x98\" => \"\\xCB\\x9C\", \"\\x99\" => \"\\xE2\\x84\\xA2\", \"\\x9A\" => \"\\xC5\\xA1\", \"\\x9B\" => \"\\xE2\\x80\\xBA\", \"\\x9C\" => \"\\xC5\\x93\", \"\\x9D\" => \"\\xEF\\xBF\\xBD\", \"\\x9E\" => \"\\xC5\\xBE\", \"\\x9F\" => \"\\xC5\\xB8\", \"\\xA0\" => \"\\xC2\\xA0\", \"\\xA1\" => \"\\xC2\\xA1\", \"\\xA2\" => \"\\xC2\\xA2\", \"\\xA3\" => \"\\xC2\\xA3\", \"\\xA4\" => \"\\xC2\\xA4\", \"\\xA5\" => \"\\xC2\\xA5\", \"\\xA6\" => \"\\xC2\\xA6\", \"\\xA7\" => \"\\xC2\\xA7\", \"\\xA8\" => \"\\xC2\\xA8\", \"\\xA9\" => \"\\xC2\\xA9\", \"\\xAA\" => \"\\xC2\\xAA\", \"\\xAB\" => \"\\xC2\\xAB\", \"\\xAC\" => \"\\xC2\\xAC\", \"\\xAD\" => \"\\xC2\\xAD\", \"\\xAE\" => \"\\xC2\\xAE\", \"\\xAF\" => \"\\xC2\\xAF\", \"\\xB0\" => \"\\xC2\\xB0\", \"\\xB1\" => \"\\xC2\\xB1\", \"\\xB2\" => \"\\xC2\\xB2\", \"\\xB3\" => \"\\xC2\\xB3\", \"\\xB4\" => \"\\xC2\\xB4\", \"\\xB5\" => \"\\xC2\\xB5\", \"\\xB6\" => \"\\xC2\\xB6\", \"\\xB7\" => \"\\xC2\\xB7\", \"\\xB8\" => \"\\xC2\\xB8\", \"\\xB9\" => \"\\xC2\\xB9\", \"\\xBA\" => \"\\xC2\\xBA\", \"\\xBB\" => \"\\xC2\\xBB\", \"\\xBC\" => \"\\xC2\\xBC\", \"\\xBD\" => \"\\xC2\\xBD\", \"\\xBE\" => \"\\xC2\\xBE\", \"\\xBF\" => \"\\xC2\\xBF\", \"\\xC0\" => \"\\xC3\\x80\", \"\\xC1\" => \"\\xC3\\x81\", \"\\xC2\" => \"\\xC3\\x82\", \"\\xC3\" => \"\\xC3\\x83\", \"\\xC4\" => \"\\xC3\\x84\", \"\\xC5\" => \"\\xC3\\x85\", \"\\xC6\" => \"\\xC3\\x86\", \"\\xC7\" => \"\\xC3\\x87\", \"\\xC8\" => \"\\xC3\\x88\", \"\\xC9\" => \"\\xC3\\x89\", \"\\xCA\" => \"\\xC3\\x8A\", \"\\xCB\" => \"\\xC3\\x8B\", \"\\xCC\" => \"\\xC3\\x8C\", \"\\xCD\" => \"\\xC3\\x8D\", \"\\xCE\" => \"\\xC3\\x8E\", \"\\xCF\" => \"\\xC3\\x8F\", \"\\xD0\" => \"\\xC3\\x90\", \"\\xD1\" => \"\\xC3\\x91\", \"\\xD2\" => \"\\xC3\\x92\", \"\\xD3\" => \"\\xC3\\x93\", \"\\xD4\" => \"\\xC3\\x94\", \"\\xD5\" => \"\\xC3\\x95\", \"\\xD6\" => \"\\xC3\\x96\", \"\\xD7\" => \"\\xC3\\x97\", \"\\xD8\" => \"\\xC3\\x98\", \"\\xD9\" => \"\\xC3\\x99\", \"\\xDA\" => \"\\xC3\\x9A\", \"\\xDB\" => \"\\xC3\\x9B\", \"\\xDC\" => \"\\xC3\\x9C\", \"\\xDD\" => \"\\xC3\\x9D\", \"\\xDE\" => \"\\xC3\\x9E\", \"\\xDF\" => \"\\xC3\\x9F\", \"\\xE0\" => \"\\xC3\\xA0\", \"\\xE1\" => \"\\xC3\\xA1\", \"\\xE2\" => \"\\xC3\\xA2\", \"\\xE3\" => \"\\xC3\\xA3\", \"\\xE4\" => \"\\xC3\\xA4\", \"\\xE5\" => \"\\xC3\\xA5\", \"\\xE6\" => \"\\xC3\\xA6\", \"\\xE7\" => \"\\xC3\\xA7\", \"\\xE8\" => \"\\xC3\\xA8\", \"\\xE9\" => \"\\xC3\\xA9\", \"\\xEA\" => \"\\xC3\\xAA\", \"\\xEB\" => \"\\xC3\\xAB\", \"\\xEC\" => \"\\xC3\\xAC\", \"\\xED\" => \"\\xC3\\xAD\", \"\\xEE\" => \"\\xC3\\xAE\", \"\\xEF\" => \"\\xC3\\xAF\", \"\\xF0\" => \"\\xC3\\xB0\", \"\\xF1\" => \"\\xC3\\xB1\", \"\\xF2\" => \"\\xC3\\xB2\", \"\\xF3\" => \"\\xC3\\xB3\", \"\\xF4\" => \"\\xC3\\xB4\", \"\\xF5\" => \"\\xC3\\xB5\", \"\\xF6\" => \"\\xC3\\xB6\", \"\\xF7\" => \"\\xC3\\xB7\", \"\\xF8\" => \"\\xC3\\xB8\", \"\\xF9\" => \"\\xC3\\xB9\", \"\\xFA\" => \"\\xC3\\xBA\", \"\\xFB\" => \"\\xC3\\xBB\", \"\\xFC\" => \"\\xC3\\xBC\", \"\\xFD\" => \"\\xC3\\xBD\", \"\\xFE\" => \"\\xC3\\xBE\", \"\\xFF\" => \"\\xC3\\xBF\");\n\n\t\treturn strtr($string, $convert_table);\n\t}\n\n\t/**\n\t * Change a string from one encoding to another\n\t *\n\t * @param string $data Raw data in $input encoding\n\t * @param string $input Encoding of $data\n\t * @param string $output Encoding you want\n\t * @return string|boolean False if we can't convert it\n\t */\n\tpublic static function change_encoding($data, $input, $output)\n\t{\n\t\t$input = SimplePie_Misc::encoding($input);\n\t\t$output = SimplePie_Misc::encoding($output);\n\n\t\t// We fail to fail on non US-ASCII bytes\n\t\tif ($input === 'US-ASCII')\n\t\t{\n\t\t\tstatic $non_ascii_octects = '';\n\t\t\tif (!$non_ascii_octects)\n\t\t\t{\n\t\t\t\tfor ($i = 0x80; $i <= 0xFF; $i++)\n\t\t\t\t{\n\t\t\t\t\t$non_ascii_octects .= chr($i);\n\t\t\t\t}\n\t\t\t}\n\t\t\t$data = substr($data, 0, strcspn($data, $non_ascii_octects));\n\t\t}\n\n\t\t// This is first, as behaviour of this is completely predictable\n\t\tif ($input === 'windows-1252' && $output === 'UTF-8')\n\t\t{\n\t\t\treturn SimplePie_Misc::windows_1252_to_utf8($data);\n\t\t}\n\t\t// This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).\n\t\telseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output)))\n\t\t{\n\t\t\treturn $return;\n \t\t}\n\t\t// This is last, as behaviour of this varies with OS userland and PHP version\n\t\telseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output)))\n\t\t{\n\t\t\treturn $return;\n\t\t}\n\t\t// If we can't do anything, just fail\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprotected static function change_encoding_mbstring($data, $input, $output)\n\t{\n\t\tif ($input === 'windows-949')\n\t\t{\n\t\t\t$input = 'EUC-KR';\n\t\t}\n\t\tif ($output === 'windows-949')\n\t\t{\n\t\t\t$output = 'EUC-KR';\n\t\t}\n\t\tif ($input === 'Windows-31J')\n\t\t{\n\t\t\t$input = 'SJIS';\n\t\t}\n\t\tif ($output === 'Windows-31J')\n\t\t{\n\t\t\t$output = 'SJIS';\n\t\t}\n\n\t\t// Check that the encoding is supported\n\t\tif (@mb_convert_encoding(\"\\x80\", 'UTF-16BE', $input) === \"\\x00\\x80\")\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!in_array($input, mb_list_encodings()))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t// Let's do some conversion\n\t\tif ($return = @mb_convert_encoding($data, $output, $input))\n\t\t{\n\t\t\treturn $return;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprotected static function change_encoding_iconv($data, $input, $output)\n\t{\n\t\treturn @iconv($input, $output, $data);\n\t}\n\n\t/**\n\t * Normalize an encoding name\n\t *\n\t * This is automatically generated by create.php\n\t *\n\t * To generate it, run `php create.php` on the command line, and copy the\n\t * output to replace this function.\n\t *\n\t * @param string $charset Character set to standardise\n\t * @return string Standardised name\n\t */\n\tpublic static function encoding($charset)\n\t{\n\t\t// Normalization from UTS #22\n\t\tswitch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\\1', $charset)))\n\t\t{\n\t\t\tcase 'adobestandardencoding':\n\t\t\tcase 'csadobestandardencoding':\n\t\t\t\treturn 'Adobe-Standard-Encoding';\n\n\t\t\tcase 'adobesymbolencoding':\n\t\t\tcase 'cshppsmath':\n\t\t\t\treturn 'Adobe-Symbol-Encoding';\n\n\t\t\tcase 'ami1251':\n\t\t\tcase 'amiga1251':\n\t\t\t\treturn 'Amiga-1251';\n\n\t\t\tcase 'ansix31101983':\n\t\t\tcase 'csat5001983':\n\t\t\tcase 'csiso99naplps':\n\t\t\tcase 'isoir99':\n\t\t\tcase 'naplps':\n\t\t\t\treturn 'ANSI_X3.110-1983';\n\n\t\t\tcase 'arabic7':\n\t\t\tcase 'asmo449':\n\t\t\tcase 'csiso89asmo449':\n\t\t\tcase 'iso9036':\n\t\t\tcase 'isoir89':\n\t\t\t\treturn 'ASMO_449';\n\n\t\t\tcase 'big5':\n\t\t\tcase 'csbig5':\n\t\t\t\treturn 'Big5';\n\n\t\t\tcase 'big5hkscs':\n\t\t\t\treturn 'Big5-HKSCS';\n\n\t\t\tcase 'bocu1':\n\t\t\tcase 'csbocu1':\n\t\t\t\treturn 'BOCU-1';\n\n\t\t\tcase 'brf':\n\t\t\tcase 'csbrf':\n\t\t\t\treturn 'BRF';\n\n\t\t\tcase 'bs4730':\n\t\t\tcase 'csiso4unitedkingdom':\n\t\t\tcase 'gb':\n\t\t\tcase 'iso646gb':\n\t\t\tcase 'isoir4':\n\t\t\tcase 'uk':\n\t\t\t\treturn 'BS_4730';\n\n\t\t\tcase 'bsviewdata':\n\t\t\tcase 'csiso47bsviewdata':\n\t\t\tcase 'isoir47':\n\t\t\t\treturn 'BS_viewdata';\n\n\t\t\tcase 'cesu8':\n\t\t\tcase 'cscesu8':\n\t\t\t\treturn 'CESU-8';\n\n\t\t\tcase 'ca':\n\t\t\tcase 'csa71':\n\t\t\tcase 'csaz243419851':\n\t\t\tcase 'csiso121canadian1':\n\t\t\tcase 'iso646ca':\n\t\t\tcase 'isoir121':\n\t\t\t\treturn 'CSA_Z243.4-1985-1';\n\n\t\t\tcase 'csa72':\n\t\t\tcase 'csaz243419852':\n\t\t\tcase 'csiso122canadian2':\n\t\t\tcase 'iso646ca2':\n\t\t\tcase 'isoir122':\n\t\t\t\treturn 'CSA_Z243.4-1985-2';\n\n\t\t\tcase 'csaz24341985gr':\n\t\t\tcase 'csiso123csaz24341985gr':\n\t\t\tcase 'isoir123':\n\t\t\t\treturn 'CSA_Z243.4-1985-gr';\n\n\t\t\tcase 'csiso139csn369103':\n\t\t\tcase 'csn369103':\n\t\t\tcase 'isoir139':\n\t\t\t\treturn 'CSN_369103';\n\n\t\t\tcase 'csdecmcs':\n\t\t\tcase 'dec':\n\t\t\tcase 'decmcs':\n\t\t\t\treturn 'DEC-MCS';\n\n\t\t\tcase 'csiso21german':\n\t\t\tcase 'de':\n\t\t\tcase 'din66003':\n\t\t\tcase 'iso646de':\n\t\t\tcase 'isoir21':\n\t\t\t\treturn 'DIN_66003';\n\n\t\t\tcase 'csdkus':\n\t\t\tcase 'dkus':\n\t\t\t\treturn 'dk-us';\n\n\t\t\tcase 'csiso646danish':\n\t\t\tcase 'dk':\n\t\t\tcase 'ds2089':\n\t\t\tcase 'iso646dk':\n\t\t\t\treturn 'DS_2089';\n\n\t\t\tcase 'csibmebcdicatde':\n\t\t\tcase 'ebcdicatde':\n\t\t\t\treturn 'EBCDIC-AT-DE';\n\n\t\t\tcase 'csebcdicatdea':\n\t\t\tcase 'ebcdicatdea':\n\t\t\t\treturn 'EBCDIC-AT-DE-A';\n\n\t\t\tcase 'csebcdiccafr':\n\t\t\tcase 'ebcdiccafr':\n\t\t\t\treturn 'EBCDIC-CA-FR';\n\n\t\t\tcase 'csebcdicdkno':\n\t\t\tcase 'ebcdicdkno':\n\t\t\t\treturn 'EBCDIC-DK-NO';\n\n\t\t\tcase 'csebcdicdknoa':\n\t\t\tcase 'ebcdicdknoa':\n\t\t\t\treturn 'EBCDIC-DK-NO-A';\n\n\t\t\tcase 'csebcdices':\n\t\t\tcase 'ebcdices':\n\t\t\t\treturn 'EBCDIC-ES';\n\n\t\t\tcase 'csebcdicesa':\n\t\t\tcase 'ebcdicesa':\n\t\t\t\treturn 'EBCDIC-ES-A';\n\n\t\t\tcase 'csebcdicess':\n\t\t\tcase 'ebcdicess':\n\t\t\t\treturn 'EBCDIC-ES-S';\n\n\t\t\tcase 'csebcdicfise':\n\t\t\tcase 'ebcdicfise':\n\t\t\t\treturn 'EBCDIC-FI-SE';\n\n\t\t\tcase 'csebcdicfisea':\n\t\t\tcase 'ebcdicfisea':\n\t\t\t\treturn 'EBCDIC-FI-SE-A';\n\n\t\t\tcase 'csebcdicfr':\n\t\t\tcase 'ebcdicfr':\n\t\t\t\treturn 'EBCDIC-FR';\n\n\t\t\tcase 'csebcdicit':\n\t\t\tcase 'ebcdicit':\n\t\t\t\treturn 'EBCDIC-IT';\n\n\t\t\tcase 'csebcdicpt':\n\t\t\tcase 'ebcdicpt':\n\t\t\t\treturn 'EBCDIC-PT';\n\n\t\t\tcase 'csebcdicuk':\n\t\t\tcase 'ebcdicuk':\n\t\t\t\treturn 'EBCDIC-UK';\n\n\t\t\tcase 'csebcdicus':\n\t\t\tcase 'ebcdicus':\n\t\t\t\treturn 'EBCDIC-US';\n\n\t\t\tcase 'csiso111ecmacyrillic':\n\t\t\tcase 'ecmacyrillic':\n\t\t\tcase 'isoir111':\n\t\t\tcase 'koi8e':\n\t\t\t\treturn 'ECMA-cyrillic';\n\n\t\t\tcase 'csiso17spanish':\n\t\t\tcase 'es':\n\t\t\tcase 'iso646es':\n\t\t\tcase 'isoir17':\n\t\t\t\treturn 'ES';\n\n\t\t\tcase 'csiso85spanish2':\n\t\t\tcase 'es2':\n\t\t\tcase 'iso646es2':\n\t\t\tcase 'isoir85':\n\t\t\t\treturn 'ES2';\n\n\t\t\tcase 'cseucpkdfmtjapanese':\n\t\t\tcase 'eucjp':\n\t\t\tcase 'extendedunixcodepackedformatforjapanese':\n\t\t\t\treturn 'EUC-JP';\n\n\t\t\tcase 'cseucfixwidjapanese':\n\t\t\tcase 'extendedunixcodefixedwidthforjapanese':\n\t\t\t\treturn 'Extended_UNIX_Code_Fixed_Width_for_Japanese';\n\n\t\t\tcase 'gb18030':\n\t\t\t\treturn 'GB18030';\n\n\t\t\tcase 'chinese':\n\t\t\tcase 'cp936':\n\t\t\tcase 'csgb2312':\n\t\t\tcase 'csiso58gb231280':\n\t\t\tcase 'gb2312':\n\t\t\tcase 'gb231280':\n\t\t\tcase 'gbk':\n\t\t\tcase 'isoir58':\n\t\t\tcase 'ms936':\n\t\t\tcase 'windows936':\n\t\t\t\treturn 'GBK';\n\n\t\t\tcase 'cn':\n\t\t\tcase 'csiso57gb1988':\n\t\t\tcase 'gb198880':\n\t\t\tcase 'iso646cn':\n\t\t\tcase 'isoir57':\n\t\t\t\treturn 'GB_1988-80';\n\n\t\t\tcase 'csiso153gost1976874':\n\t\t\tcase 'gost1976874':\n\t\t\tcase 'isoir153':\n\t\t\tcase 'stsev35888':\n\t\t\t\treturn 'GOST_19768-74';\n\n\t\t\tcase 'csiso150':\n\t\t\tcase 'csiso150greekccitt':\n\t\t\tcase 'greekccitt':\n\t\t\tcase 'isoir150':\n\t\t\t\treturn 'greek-ccitt';\n\n\t\t\tcase 'csiso88greek7':\n\t\t\tcase 'greek7':\n\t\t\tcase 'isoir88':\n\t\t\t\treturn 'greek7';\n\n\t\t\tcase 'csiso18greek7old':\n\t\t\tcase 'greek7old':\n\t\t\tcase 'isoir18':\n\t\t\t\treturn 'greek7-old';\n\n\t\t\tcase 'cshpdesktop':\n\t\t\tcase 'hpdesktop':\n\t\t\t\treturn 'HP-DeskTop';\n\n\t\t\tcase 'cshplegal':\n\t\t\tcase 'hplegal':\n\t\t\t\treturn 'HP-Legal';\n\n\t\t\tcase 'cshpmath8':\n\t\t\tcase 'hpmath8':\n\t\t\t\treturn 'HP-Math8';\n\n\t\t\tcase 'cshppifont':\n\t\t\tcase 'hppifont':\n\t\t\t\treturn 'HP-Pi-font';\n\n\t\t\tcase 'cshproman8':\n\t\t\tcase 'hproman8':\n\t\t\tcase 'r8':\n\t\t\tcase 'roman8':\n\t\t\t\treturn 'hp-roman8';\n\n\t\t\tcase 'hzgb2312':\n\t\t\t\treturn 'HZ-GB-2312';\n\n\t\t\tcase 'csibmsymbols':\n\t\t\tcase 'ibmsymbols':\n\t\t\t\treturn 'IBM-Symbols';\n\n\t\t\tcase 'csibmthai':\n\t\t\tcase 'ibmthai':\n\t\t\t\treturn 'IBM-Thai';\n\n\t\t\tcase 'cp37':\n\t\t\tcase 'csibm37':\n\t\t\tcase 'ebcdiccpca':\n\t\t\tcase 'ebcdiccpnl':\n\t\t\tcase 'ebcdiccpus':\n\t\t\tcase 'ebcdiccpwt':\n\t\t\tcase 'ibm37':\n\t\t\t\treturn 'IBM037';\n\n\t\t\tcase 'cp38':\n\t\t\tcase 'csibm38':\n\t\t\tcase 'ebcdicint':\n\t\t\tcase 'ibm38':\n\t\t\t\treturn 'IBM038';\n\n\t\t\tcase 'cp273':\n\t\t\tcase 'csibm273':\n\t\t\tcase 'ibm273':\n\t\t\t\treturn 'IBM273';\n\n\t\t\tcase 'cp274':\n\t\t\tcase 'csibm274':\n\t\t\tcase 'ebcdicbe':\n\t\t\tcase 'ibm274':\n\t\t\t\treturn 'IBM274';\n\n\t\t\tcase 'cp275':\n\t\t\tcase 'csibm275':\n\t\t\tcase 'ebcdicbr':\n\t\t\tcase 'ibm275':\n\t\t\t\treturn 'IBM275';\n\n\t\t\tcase 'csibm277':\n\t\t\tcase 'ebcdiccpdk':\n\t\t\tcase 'ebcdiccpno':\n\t\t\tcase 'ibm277':\n\t\t\t\treturn 'IBM277';\n\n\t\t\tcase 'cp278':\n\t\t\tcase 'csibm278':\n\t\t\tcase 'ebcdiccpfi':\n\t\t\tcase 'ebcdiccpse':\n\t\t\tcase 'ibm278':\n\t\t\t\treturn 'IBM278';\n\n\t\t\tcase 'cp280':\n\t\t\tcase 'csibm280':\n\t\t\tcase 'ebcdiccpit':\n\t\t\tcase 'ibm280':\n\t\t\t\treturn 'IBM280';\n\n\t\t\tcase 'cp281':\n\t\t\tcase 'csibm281':\n\t\t\tcase 'ebcdicjpe':\n\t\t\tcase 'ibm281':\n\t\t\t\treturn 'IBM281';\n\n\t\t\tcase 'cp284':\n\t\t\tcase 'csibm284':\n\t\t\tcase 'ebcdiccpes':\n\t\t\tcase 'ibm284':\n\t\t\t\treturn 'IBM284';\n\n\t\t\tcase 'cp285':\n\t\t\tcase 'csibm285':\n\t\t\tcase 'ebcdiccpgb':\n\t\t\tcase 'ibm285':\n\t\t\t\treturn 'IBM285';\n\n\t\t\tcase 'cp290':\n\t\t\tcase 'csibm290':\n\t\t\tcase 'ebcdicjpkana':\n\t\t\tcase 'ibm290':\n\t\t\t\treturn 'IBM290';\n\n\t\t\tcase 'cp297':\n\t\t\tcase 'csibm297':\n\t\t\tcase 'ebcdiccpfr':\n\t\t\tcase 'ibm297':\n\t\t\t\treturn 'IBM297';\n\n\t\t\tcase 'cp420':\n\t\t\tcase 'csibm420':\n\t\t\tcase 'ebcdiccpar1':\n\t\t\tcase 'ibm420':\n\t\t\t\treturn 'IBM420';\n\n\t\t\tcase 'cp423':\n\t\t\tcase 'csibm423':\n\t\t\tcase 'ebcdiccpgr':\n\t\t\tcase 'ibm423':\n\t\t\t\treturn 'IBM423';\n\n\t\t\tcase 'cp424':\n\t\t\tcase 'csibm424':\n\t\t\tcase 'ebcdiccphe':\n\t\t\tcase 'ibm424':\n\t\t\t\treturn 'IBM424';\n\n\t\t\tcase '437':\n\t\t\tcase 'cp437':\n\t\t\tcase 'cspc8codepage437':\n\t\t\tcase 'ibm437':\n\t\t\t\treturn 'IBM437';\n\n\t\t\tcase 'cp500':\n\t\t\tcase 'csibm500':\n\t\t\tcase 'ebcdiccpbe':\n\t\t\tcase 'ebcdiccpch':\n\t\t\tcase 'ibm500':\n\t\t\t\treturn 'IBM500';\n\n\t\t\tcase 'cp775':\n\t\t\tcase 'cspc775baltic':\n\t\t\tcase 'ibm775':\n\t\t\t\treturn 'IBM775';\n\n\t\t\tcase '850':\n\t\t\tcase 'cp850':\n\t\t\tcase 'cspc850multilingual':\n\t\t\tcase 'ibm850':\n\t\t\t\treturn 'IBM850';\n\n\t\t\tcase '851':\n\t\t\tcase 'cp851':\n\t\t\tcase 'csibm851':\n\t\t\tcase 'ibm851':\n\t\t\t\treturn 'IBM851';\n\n\t\t\tcase '852':\n\t\t\tcase 'cp852':\n\t\t\tcase 'cspcp852':\n\t\t\tcase 'ibm852':\n\t\t\t\treturn 'IBM852';\n\n\t\t\tcase '855':\n\t\t\tcase 'cp855':\n\t\t\tcase 'csibm855':\n\t\t\tcase 'ibm855':\n\t\t\t\treturn 'IBM855';\n\n\t\t\tcase '857':\n\t\t\tcase 'cp857':\n\t\t\tcase 'csibm857':\n\t\t\tcase 'ibm857':\n\t\t\t\treturn 'IBM857';\n\n\t\t\tcase 'ccsid858':\n\t\t\tcase 'cp858':\n\t\t\tcase 'ibm858':\n\t\t\tcase 'pcmultilingual850euro':\n\t\t\t\treturn 'IBM00858';\n\n\t\t\tcase '860':\n\t\t\tcase 'cp860':\n\t\t\tcase 'csibm860':\n\t\t\tcase 'ibm860':\n\t\t\t\treturn 'IBM860';\n\n\t\t\tcase '861':\n\t\t\tcase 'cp861':\n\t\t\tcase 'cpis':\n\t\t\tcase 'csibm861':\n\t\t\tcase 'ibm861':\n\t\t\t\treturn 'IBM861';\n\n\t\t\tcase '862':\n\t\t\tcase 'cp862':\n\t\t\tcase 'cspc862latinhebrew':\n\t\t\tcase 'ibm862':\n\t\t\t\treturn 'IBM862';\n\n\t\t\tcase '863':\n\t\t\tcase 'cp863':\n\t\t\tcase 'csibm863':\n\t\t\tcase 'ibm863':\n\t\t\t\treturn 'IBM863';\n\n\t\t\tcase 'cp864':\n\t\t\tcase 'csibm864':\n\t\t\tcase 'ibm864':\n\t\t\t\treturn 'IBM864';\n\n\t\t\tcase '865':\n\t\t\tcase 'cp865':\n\t\t\tcase 'csibm865':\n\t\t\tcase 'ibm865':\n\t\t\t\treturn 'IBM865';\n\n\t\t\tcase '866':\n\t\t\tcase 'cp866':\n\t\t\tcase 'csibm866':\n\t\t\tcase 'ibm866':\n\t\t\t\treturn 'IBM866';\n\n\t\t\tcase 'cp868':\n\t\t\tcase 'cpar':\n\t\t\tcase 'csibm868':\n\t\t\tcase 'ibm868':\n\t\t\t\treturn 'IBM868';\n\n\t\t\tcase '869':\n\t\t\tcase 'cp869':\n\t\t\tcase 'cpgr':\n\t\t\tcase 'csibm869':\n\t\t\tcase 'ibm869':\n\t\t\t\treturn 'IBM869';\n\n\t\t\tcase 'cp870':\n\t\t\tcase 'csibm870':\n\t\t\tcase 'ebcdiccproece':\n\t\t\tcase 'ebcdiccpyu':\n\t\t\tcase 'ibm870':\n\t\t\t\treturn 'IBM870';\n\n\t\t\tcase 'cp871':\n\t\t\tcase 'csibm871':\n\t\t\tcase 'ebcdiccpis':\n\t\t\tcase 'ibm871':\n\t\t\t\treturn 'IBM871';\n\n\t\t\tcase 'cp880':\n\t\t\tcase 'csibm880':\n\t\t\tcase 'ebcdiccyrillic':\n\t\t\tcase 'ibm880':\n\t\t\t\treturn 'IBM880';\n\n\t\t\tcase 'cp891':\n\t\t\tcase 'csibm891':\n\t\t\tcase 'ibm891':\n\t\t\t\treturn 'IBM891';\n\n\t\t\tcase 'cp903':\n\t\t\tcase 'csibm903':\n\t\t\tcase 'ibm903':\n\t\t\t\treturn 'IBM903';\n\n\t\t\tcase '904':\n\t\t\tcase 'cp904':\n\t\t\tcase 'csibbm904':\n\t\t\tcase 'ibm904':\n\t\t\t\treturn 'IBM904';\n\n\t\t\tcase 'cp905':\n\t\t\tcase 'csibm905':\n\t\t\tcase 'ebcdiccptr':\n\t\t\tcase 'ibm905':\n\t\t\t\treturn 'IBM905';\n\n\t\t\tcase 'cp918':\n\t\t\tcase 'csibm918':\n\t\t\tcase 'ebcdiccpar2':\n\t\t\tcase 'ibm918':\n\t\t\t\treturn 'IBM918';\n\n\t\t\tcase 'ccsid924':\n\t\t\tcase 'cp924':\n\t\t\tcase 'ebcdiclatin9euro':\n\t\t\tcase 'ibm924':\n\t\t\t\treturn 'IBM00924';\n\n\t\t\tcase 'cp1026':\n\t\t\tcase 'csibm1026':\n\t\t\tcase 'ibm1026':\n\t\t\t\treturn 'IBM1026';\n\n\t\t\tcase 'ibm1047':\n\t\t\t\treturn 'IBM1047';\n\n\t\t\tcase 'ccsid1140':\n\t\t\tcase 'cp1140':\n\t\t\tcase 'ebcdicus37euro':\n\t\t\tcase 'ibm1140':\n\t\t\t\treturn 'IBM01140';\n\n\t\t\tcase 'ccsid1141':\n\t\t\tcase 'cp1141':\n\t\t\tcase 'ebcdicde273euro':\n\t\t\tcase 'ibm1141':\n\t\t\t\treturn 'IBM01141';\n\n\t\t\tcase 'ccsid1142':\n\t\t\tcase 'cp1142':\n\t\t\tcase 'ebcdicdk277euro':\n\t\t\tcase 'ebcdicno277euro':\n\t\t\tcase 'ibm1142':\n\t\t\t\treturn 'IBM01142';\n\n\t\t\tcase 'ccsid1143':\n\t\t\tcase 'cp1143':\n\t\t\tcase 'ebcdicfi278euro':\n\t\t\tcase 'ebcdicse278euro':\n\t\t\tcase 'ibm1143':\n\t\t\t\treturn 'IBM01143';\n\n\t\t\tcase 'ccsid1144':\n\t\t\tcase 'cp1144':\n\t\t\tcase 'ebcdicit280euro':\n\t\t\tcase 'ibm1144':\n\t\t\t\treturn 'IBM01144';\n\n\t\t\tcase 'ccsid1145':\n\t\t\tcase 'cp1145':\n\t\t\tcase 'ebcdices284euro':\n\t\t\tcase 'ibm1145':\n\t\t\t\treturn 'IBM01145';\n\n\t\t\tcase 'ccsid1146':\n\t\t\tcase 'cp1146':\n\t\t\tcase 'ebcdicgb285euro':\n\t\t\tcase 'ibm1146':\n\t\t\t\treturn 'IBM01146';\n\n\t\t\tcase 'ccsid1147':\n\t\t\tcase 'cp1147':\n\t\t\tcase 'ebcdicfr297euro':\n\t\t\tcase 'ibm1147':\n\t\t\t\treturn 'IBM01147';\n\n\t\t\tcase 'ccsid1148':\n\t\t\tcase 'cp1148':\n\t\t\tcase 'ebcdicinternational500euro':\n\t\t\tcase 'ibm1148':\n\t\t\t\treturn 'IBM01148';\n\n\t\t\tcase 'ccsid1149':\n\t\t\tcase 'cp1149':\n\t\t\tcase 'ebcdicis871euro':\n\t\t\tcase 'ibm1149':\n\t\t\t\treturn 'IBM01149';\n\n\t\t\tcase 'csiso143iecp271':\n\t\t\tcase 'iecp271':\n\t\t\tcase 'isoir143':\n\t\t\t\treturn 'IEC_P27-1';\n\n\t\t\tcase 'csiso49inis':\n\t\t\tcase 'inis':\n\t\t\tcase 'isoir49':\n\t\t\t\treturn 'INIS';\n\n\t\t\tcase 'csiso50inis8':\n\t\t\tcase 'inis8':\n\t\t\tcase 'isoir50':\n\t\t\t\treturn 'INIS-8';\n\n\t\t\tcase 'csiso51iniscyrillic':\n\t\t\tcase 'iniscyrillic':\n\t\t\tcase 'isoir51':\n\t\t\t\treturn 'INIS-cyrillic';\n\n\t\t\tcase 'csinvariant':\n\t\t\tcase 'invariant':\n\t\t\t\treturn 'INVARIANT';\n\n\t\t\tcase 'iso2022cn':\n\t\t\t\treturn 'ISO-2022-CN';\n\n\t\t\tcase 'iso2022cnext':\n\t\t\t\treturn 'ISO-2022-CN-EXT';\n\n\t\t\tcase 'csiso2022jp':\n\t\t\tcase 'iso2022jp':\n\t\t\t\treturn 'ISO-2022-JP';\n\n\t\t\tcase 'csiso2022jp2':\n\t\t\tcase 'iso2022jp2':\n\t\t\t\treturn 'ISO-2022-JP-2';\n\n\t\t\tcase 'csiso2022kr':\n\t\t\tcase 'iso2022kr':\n\t\t\t\treturn 'ISO-2022-KR';\n\n\t\t\tcase 'cswindows30latin1':\n\t\t\tcase 'iso88591windows30latin1':\n\t\t\t\treturn 'ISO-8859-1-Windows-3.0-Latin-1';\n\n\t\t\tcase 'cswindows31latin1':\n\t\t\tcase 'iso88591windows31latin1':\n\t\t\t\treturn 'ISO-8859-1-Windows-3.1-Latin-1';\n\n\t\t\tcase 'csisolatin2':\n\t\t\tcase 'iso88592':\n\t\t\tcase 'iso885921987':\n\t\t\tcase 'isoir101':\n\t\t\tcase 'l2':\n\t\t\tcase 'latin2':\n\t\t\t\treturn 'ISO-8859-2';\n\n\t\t\tcase 'cswindows31latin2':\n\t\t\tcase 'iso88592windowslatin2':\n\t\t\t\treturn 'ISO-8859-2-Windows-Latin-2';\n\n\t\t\tcase 'csisolatin3':\n\t\t\tcase 'iso88593':\n\t\t\tcase 'iso885931988':\n\t\t\tcase 'isoir109':\n\t\t\tcase 'l3':\n\t\t\tcase 'latin3':\n\t\t\t\treturn 'ISO-8859-3';\n\n\t\t\tcase 'csisolatin4':\n\t\t\tcase 'iso88594':\n\t\t\tcase 'iso885941988':\n\t\t\tcase 'isoir110':\n\t\t\tcase 'l4':\n\t\t\tcase 'latin4':\n\t\t\t\treturn 'ISO-8859-4';\n\n\t\t\tcase 'csisolatincyrillic':\n\t\t\tcase 'cyrillic':\n\t\t\tcase 'iso88595':\n\t\t\tcase 'iso885951988':\n\t\t\tcase 'isoir144':\n\t\t\t\treturn 'ISO-8859-5';\n\n\t\t\tcase 'arabic':\n\t\t\tcase 'asmo708':\n\t\t\tcase 'csisolatinarabic':\n\t\t\tcase 'ecma114':\n\t\t\tcase 'iso88596':\n\t\t\tcase 'iso885961987':\n\t\t\tcase 'isoir127':\n\t\t\t\treturn 'ISO-8859-6';\n\n\t\t\tcase 'csiso88596e':\n\t\t\tcase 'iso88596e':\n\t\t\t\treturn 'ISO-8859-6-E';\n\n\t\t\tcase 'csiso88596i':\n\t\t\tcase 'iso88596i':\n\t\t\t\treturn 'ISO-8859-6-I';\n\n\t\t\tcase 'csisolatingreek':\n\t\t\tcase 'ecma118':\n\t\t\tcase 'elot928':\n\t\t\tcase 'greek':\n\t\t\tcase 'greek8':\n\t\t\tcase 'iso88597':\n\t\t\tcase 'iso885971987':\n\t\t\tcase 'isoir126':\n\t\t\t\treturn 'ISO-8859-7';\n\n\t\t\tcase 'csisolatinhebrew':\n\t\t\tcase 'hebrew':\n\t\t\tcase 'iso88598':\n\t\t\tcase 'iso885981988':\n\t\t\tcase 'isoir138':\n\t\t\t\treturn 'ISO-8859-8';\n\n\t\t\tcase 'csiso88598e':\n\t\t\tcase 'iso88598e':\n\t\t\t\treturn 'ISO-8859-8-E';\n\n\t\t\tcase 'csiso88598i':\n\t\t\tcase 'iso88598i':\n\t\t\t\treturn 'ISO-8859-8-I';\n\n\t\t\tcase 'cswindows31latin5':\n\t\t\tcase 'iso88599windowslatin5':\n\t\t\t\treturn 'ISO-8859-9-Windows-Latin-5';\n\n\t\t\tcase 'csisolatin6':\n\t\t\tcase 'iso885910':\n\t\t\tcase 'iso8859101992':\n\t\t\tcase 'isoir157':\n\t\t\tcase 'l6':\n\t\t\tcase 'latin6':\n\t\t\t\treturn 'ISO-8859-10';\n\n\t\t\tcase 'iso885913':\n\t\t\t\treturn 'ISO-8859-13';\n\n\t\t\tcase 'iso885914':\n\t\t\tcase 'iso8859141998':\n\t\t\tcase 'isoceltic':\n\t\t\tcase 'isoir199':\n\t\t\tcase 'l8':\n\t\t\tcase 'latin8':\n\t\t\t\treturn 'ISO-8859-14';\n\n\t\t\tcase 'iso885915':\n\t\t\tcase 'latin9':\n\t\t\t\treturn 'ISO-8859-15';\n\n\t\t\tcase 'iso885916':\n\t\t\tcase 'iso8859162001':\n\t\t\tcase 'isoir226':\n\t\t\tcase 'l10':\n\t\t\tcase 'latin10':\n\t\t\t\treturn 'ISO-8859-16';\n\n\t\t\tcase 'iso10646j1':\n\t\t\t\treturn 'ISO-10646-J-1';\n\n\t\t\tcase 'csunicode':\n\t\t\tcase 'iso10646ucs2':\n\t\t\t\treturn 'ISO-10646-UCS-2';\n\n\t\t\tcase 'csucs4':\n\t\t\tcase 'iso10646ucs4':\n\t\t\t\treturn 'ISO-10646-UCS-4';\n\n\t\t\tcase 'csunicodeascii':\n\t\t\tcase 'iso10646ucsbasic':\n\t\t\t\treturn 'ISO-10646-UCS-Basic';\n\n\t\t\tcase 'csunicodelatin1':\n\t\t\tcase 'iso10646':\n\t\t\tcase 'iso10646unicodelatin1':\n\t\t\t\treturn 'ISO-10646-Unicode-Latin1';\n\n\t\t\tcase 'csiso10646utf1':\n\t\t\tcase 'iso10646utf1':\n\t\t\t\treturn 'ISO-10646-UTF-1';\n\n\t\t\tcase 'csiso115481':\n\t\t\tcase 'iso115481':\n\t\t\tcase 'isotr115481':\n\t\t\t\treturn 'ISO-11548-1';\n\n\t\t\tcase 'csiso90':\n\t\t\tcase 'isoir90':\n\t\t\t\treturn 'iso-ir-90';\n\n\t\t\tcase 'csunicodeibm1261':\n\t\t\tcase 'isounicodeibm1261':\n\t\t\t\treturn 'ISO-Unicode-IBM-1261';\n\n\t\t\tcase 'csunicodeibm1264':\n\t\t\tcase 'isounicodeibm1264':\n\t\t\t\treturn 'ISO-Unicode-IBM-1264';\n\n\t\t\tcase 'csunicodeibm1265':\n\t\t\tcase 'isounicodeibm1265':\n\t\t\t\treturn 'ISO-Unicode-IBM-1265';\n\n\t\t\tcase 'csunicodeibm1268':\n\t\t\tcase 'isounicodeibm1268':\n\t\t\t\treturn 'ISO-Unicode-IBM-1268';\n\n\t\t\tcase 'csunicodeibm1276':\n\t\t\tcase 'isounicodeibm1276':\n\t\t\t\treturn 'ISO-Unicode-IBM-1276';\n\n\t\t\tcase 'csiso646basic1983':\n\t\t\tcase 'iso646basic1983':\n\t\t\tcase 'ref':\n\t\t\t\treturn 'ISO_646.basic:1983';\n\n\t\t\tcase 'csiso2intlrefversion':\n\t\t\tcase 'irv':\n\t\t\tcase 'iso646irv1983':\n\t\t\tcase 'isoir2':\n\t\t\t\treturn 'ISO_646.irv:1983';\n\n\t\t\tcase 'csiso2033':\n\t\t\tcase 'e13b':\n\t\t\tcase 'iso20331983':\n\t\t\tcase 'isoir98':\n\t\t\t\treturn 'ISO_2033-1983';\n\n\t\t\tcase 'csiso5427cyrillic':\n\t\t\tcase 'iso5427':\n\t\t\tcase 'isoir37':\n\t\t\t\treturn 'ISO_5427';\n\n\t\t\tcase 'iso5427cyrillic1981':\n\t\t\tcase 'iso54271981':\n\t\t\tcase 'isoir54':\n\t\t\t\treturn 'ISO_5427:1981';\n\n\t\t\tcase 'csiso5428greek':\n\t\t\tcase 'iso54281980':\n\t\t\tcase 'isoir55':\n\t\t\t\treturn 'ISO_5428:1980';\n\n\t\t\tcase 'csiso6937add':\n\t\t\tcase 'iso6937225':\n\t\t\tcase 'isoir152':\n\t\t\t\treturn 'ISO_6937-2-25';\n\n\t\t\tcase 'csisotextcomm':\n\t\t\tcase 'iso69372add':\n\t\t\tcase 'isoir142':\n\t\t\t\treturn 'ISO_6937-2-add';\n\n\t\t\tcase 'csiso8859supp':\n\t\t\tcase 'iso8859supp':\n\t\t\tcase 'isoir154':\n\t\t\tcase 'latin125':\n\t\t\t\treturn 'ISO_8859-supp';\n\n\t\t\tcase 'csiso10367box':\n\t\t\tcase 'iso10367box':\n\t\t\tcase 'isoir155':\n\t\t\t\treturn 'ISO_10367-box';\n\n\t\t\tcase 'csiso15italian':\n\t\t\tcase 'iso646it':\n\t\t\tcase 'isoir15':\n\t\t\tcase 'it':\n\t\t\t\treturn 'IT';\n\n\t\t\tcase 'csiso13jisc6220jp':\n\t\t\tcase 'isoir13':\n\t\t\tcase 'jisc62201969':\n\t\t\tcase 'jisc62201969jp':\n\t\t\tcase 'katakana':\n\t\t\tcase 'x2017':\n\t\t\t\treturn 'JIS_C6220-1969-jp';\n\n\t\t\tcase 'csiso14jisc6220ro':\n\t\t\tcase 'iso646jp':\n\t\t\tcase 'isoir14':\n\t\t\tcase 'jisc62201969ro':\n\t\t\tcase 'jp':\n\t\t\t\treturn 'JIS_C6220-1969-ro';\n\n\t\t\tcase 'csiso42jisc62261978':\n\t\t\tcase 'isoir42':\n\t\t\tcase 'jisc62261978':\n\t\t\t\treturn 'JIS_C6226-1978';\n\n\t\t\tcase 'csiso87jisx208':\n\t\t\tcase 'isoir87':\n\t\t\tcase 'jisc62261983':\n\t\t\tcase 'jisx2081983':\n\t\t\tcase 'x208':\n\t\t\t\treturn 'JIS_C6226-1983';\n\n\t\t\tcase 'csiso91jisc62291984a':\n\t\t\tcase 'isoir91':\n\t\t\tcase 'jisc62291984a':\n\t\t\tcase 'jpocra':\n\t\t\t\treturn 'JIS_C6229-1984-a';\n\n\t\t\tcase 'csiso92jisc62991984b':\n\t\t\tcase 'iso646jpocrb':\n\t\t\tcase 'isoir92':\n\t\t\tcase 'jisc62291984b':\n\t\t\tcase 'jpocrb':\n\t\t\t\treturn 'JIS_C6229-1984-b';\n\n\t\t\tcase 'csiso93jis62291984badd':\n\t\t\tcase 'isoir93':\n\t\t\tcase 'jisc62291984badd':\n\t\t\tcase 'jpocrbadd':\n\t\t\t\treturn 'JIS_C6229-1984-b-add';\n\n\t\t\tcase 'csiso94jis62291984hand':\n\t\t\tcase 'isoir94':\n\t\t\tcase 'jisc62291984hand':\n\t\t\tcase 'jpocrhand':\n\t\t\t\treturn 'JIS_C6229-1984-hand';\n\n\t\t\tcase 'csiso95jis62291984handadd':\n\t\t\tcase 'isoir95':\n\t\t\tcase 'jisc62291984handadd':\n\t\t\tcase 'jpocrhandadd':\n\t\t\t\treturn 'JIS_C6229-1984-hand-add';\n\n\t\t\tcase 'csiso96jisc62291984kana':\n\t\t\tcase 'isoir96':\n\t\t\tcase 'jisc62291984kana':\n\t\t\t\treturn 'JIS_C6229-1984-kana';\n\n\t\t\tcase 'csjisencoding':\n\t\t\tcase 'jisencoding':\n\t\t\t\treturn 'JIS_Encoding';\n\n\t\t\tcase 'cshalfwidthkatakana':\n\t\t\tcase 'jisx201':\n\t\t\tcase 'x201':\n\t\t\t\treturn 'JIS_X0201';\n\n\t\t\tcase 'csiso159jisx2121990':\n\t\t\tcase 'isoir159':\n\t\t\tcase 'jisx2121990':\n\t\t\tcase 'x212':\n\t\t\t\treturn 'JIS_X0212-1990';\n\n\t\t\tcase 'csiso141jusib1002':\n\t\t\tcase 'iso646yu':\n\t\t\tcase 'isoir141':\n\t\t\tcase 'js':\n\t\t\tcase 'jusib1002':\n\t\t\tcase 'yu':\n\t\t\t\treturn 'JUS_I.B1.002';\n\n\t\t\tcase 'csiso147macedonian':\n\t\t\tcase 'isoir147':\n\t\t\tcase 'jusib1003mac':\n\t\t\tcase 'macedonian':\n\t\t\t\treturn 'JUS_I.B1.003-mac';\n\n\t\t\tcase 'csiso146serbian':\n\t\t\tcase 'isoir146':\n\t\t\tcase 'jusib1003serb':\n\t\t\tcase 'serbian':\n\t\t\t\treturn 'JUS_I.B1.003-serb';\n\n\t\t\tcase 'koi7switched':\n\t\t\t\treturn 'KOI7-switched';\n\n\t\t\tcase 'cskoi8r':\n\t\t\tcase 'koi8r':\n\t\t\t\treturn 'KOI8-R';\n\n\t\t\tcase 'koi8u':\n\t\t\t\treturn 'KOI8-U';\n\n\t\t\tcase 'csksc5636':\n\t\t\tcase 'iso646kr':\n\t\t\tcase 'ksc5636':\n\t\t\t\treturn 'KSC5636';\n\n\t\t\tcase 'cskz1048':\n\t\t\tcase 'kz1048':\n\t\t\tcase 'rk1048':\n\t\t\tcase 'strk10482002':\n\t\t\t\treturn 'KZ-1048';\n\n\t\t\tcase 'csiso19latingreek':\n\t\t\tcase 'isoir19':\n\t\t\tcase 'latingreek':\n\t\t\t\treturn 'latin-greek';\n\n\t\t\tcase 'csiso27latingreek1':\n\t\t\tcase 'isoir27':\n\t\t\tcase 'latingreek1':\n\t\t\t\treturn 'Latin-greek-1';\n\n\t\t\tcase 'csiso158lap':\n\t\t\tcase 'isoir158':\n\t\t\tcase 'lap':\n\t\t\tcase 'latinlap':\n\t\t\t\treturn 'latin-lap';\n\n\t\t\tcase 'csmacintosh':\n\t\t\tcase 'mac':\n\t\t\tcase 'macintosh':\n\t\t\t\treturn 'macintosh';\n\n\t\t\tcase 'csmicrosoftpublishing':\n\t\t\tcase 'microsoftpublishing':\n\t\t\t\treturn 'Microsoft-Publishing';\n\n\t\t\tcase 'csmnem':\n\t\t\tcase 'mnem':\n\t\t\t\treturn 'MNEM';\n\n\t\t\tcase 'csmnemonic':\n\t\t\tcase 'mnemonic':\n\t\t\t\treturn 'MNEMONIC';\n\n\t\t\tcase 'csiso86hungarian':\n\t\t\tcase 'hu':\n\t\t\tcase 'iso646hu':\n\t\t\tcase 'isoir86':\n\t\t\tcase 'msz77953':\n\t\t\t\treturn 'MSZ_7795.3';\n\n\t\t\tcase 'csnatsdano':\n\t\t\tcase 'isoir91':\n\t\t\tcase 'natsdano':\n\t\t\t\treturn 'NATS-DANO';\n\n\t\t\tcase 'csnatsdanoadd':\n\t\t\tcase 'isoir92':\n\t\t\tcase 'natsdanoadd':\n\t\t\t\treturn 'NATS-DANO-ADD';\n\n\t\t\tcase 'csnatssefi':\n\t\t\tcase 'isoir81':\n\t\t\tcase 'natssefi':\n\t\t\t\treturn 'NATS-SEFI';\n\n\t\t\tcase 'csnatssefiadd':\n\t\t\tcase 'isoir82':\n\t\t\tcase 'natssefiadd':\n\t\t\t\treturn 'NATS-SEFI-ADD';\n\n\t\t\tcase 'csiso151cuba':\n\t\t\tcase 'cuba':\n\t\t\tcase 'iso646cu':\n\t\t\tcase 'isoir151':\n\t\t\tcase 'ncnc1081':\n\t\t\t\treturn 'NC_NC00-10:81';\n\n\t\t\tcase 'csiso69french':\n\t\t\tcase 'fr':\n\t\t\tcase 'iso646fr':\n\t\t\tcase 'isoir69':\n\t\t\tcase 'nfz62010':\n\t\t\t\treturn 'NF_Z_62-010';\n\n\t\t\tcase 'csiso25french':\n\t\t\tcase 'iso646fr1':\n\t\t\tcase 'isoir25':\n\t\t\tcase 'nfz620101973':\n\t\t\t\treturn 'NF_Z_62-010_(1973)';\n\n\t\t\tcase 'csiso60danishnorwegian':\n\t\t\tcase 'csiso60norwegian1':\n\t\t\tcase 'iso646no':\n\t\t\tcase 'isoir60':\n\t\t\tcase 'no':\n\t\t\tcase 'ns45511':\n\t\t\t\treturn 'NS_4551-1';\n\n\t\t\tcase 'csiso61norwegian2':\n\t\t\tcase 'iso646no2':\n\t\t\tcase 'isoir61':\n\t\t\tcase 'no2':\n\t\t\tcase 'ns45512':\n\t\t\t\treturn 'NS_4551-2';\n\n\t\t\tcase 'osdebcdicdf3irv':\n\t\t\t\treturn 'OSD_EBCDIC_DF03_IRV';\n\n\t\t\tcase 'osdebcdicdf41':\n\t\t\t\treturn 'OSD_EBCDIC_DF04_1';\n\n\t\t\tcase 'osdebcdicdf415':\n\t\t\t\treturn 'OSD_EBCDIC_DF04_15';\n\n\t\t\tcase 'cspc8danishnorwegian':\n\t\t\tcase 'pc8danishnorwegian':\n\t\t\t\treturn 'PC8-Danish-Norwegian';\n\n\t\t\tcase 'cspc8turkish':\n\t\t\tcase 'pc8turkish':\n\t\t\t\treturn 'PC8-Turkish';\n\n\t\t\tcase 'csiso16portuguese':\n\t\t\tcase 'iso646pt':\n\t\t\tcase 'isoir16':\n\t\t\tcase 'pt':\n\t\t\t\treturn 'PT';\n\n\t\t\tcase 'csiso84portuguese2':\n\t\t\tcase 'iso646pt2':\n\t\t\tcase 'isoir84':\n\t\t\tcase 'pt2':\n\t\t\t\treturn 'PT2';\n\n\t\t\tcase 'cp154':\n\t\t\tcase 'csptcp154':\n\t\t\tcase 'cyrillicasian':\n\t\t\tcase 'pt154':\n\t\t\tcase 'ptcp154':\n\t\t\t\treturn 'PTCP154';\n\n\t\t\tcase 'scsu':\n\t\t\t\treturn 'SCSU';\n\n\t\t\tcase 'csiso10swedish':\n\t\t\tcase 'fi':\n\t\t\tcase 'iso646fi':\n\t\t\tcase 'iso646se':\n\t\t\tcase 'isoir10':\n\t\t\tcase 'se':\n\t\t\tcase 'sen850200b':\n\t\t\t\treturn 'SEN_850200_B';\n\n\t\t\tcase 'csiso11swedishfornames':\n\t\t\tcase 'iso646se2':\n\t\t\tcase 'isoir11':\n\t\t\tcase 'se2':\n\t\t\tcase 'sen850200c':\n\t\t\t\treturn 'SEN_850200_C';\n\n\t\t\tcase 'csiso102t617bit':\n\t\t\tcase 'isoir102':\n\t\t\tcase 't617bit':\n\t\t\t\treturn 'T.61-7bit';\n\n\t\t\tcase 'csiso103t618bit':\n\t\t\tcase 'isoir103':\n\t\t\tcase 't61':\n\t\t\tcase 't618bit':\n\t\t\t\treturn 'T.61-8bit';\n\n\t\t\tcase 'csiso128t101g2':\n\t\t\tcase 'isoir128':\n\t\t\tcase 't101g2':\n\t\t\t\treturn 'T.101-G2';\n\n\t\t\tcase 'cstscii':\n\t\t\tcase 'tscii':\n\t\t\t\treturn 'TSCII';\n\n\t\t\tcase 'csunicode11':\n\t\t\tcase 'unicode11':\n\t\t\t\treturn 'UNICODE-1-1';\n\n\t\t\tcase 'csunicode11utf7':\n\t\t\tcase 'unicode11utf7':\n\t\t\t\treturn 'UNICODE-1-1-UTF-7';\n\n\t\t\tcase 'csunknown8bit':\n\t\t\tcase 'unknown8bit':\n\t\t\t\treturn 'UNKNOWN-8BIT';\n\n\t\t\tcase 'ansix341968':\n\t\t\tcase 'ansix341986':\n\t\t\tcase 'ascii':\n\t\t\tcase 'cp367':\n\t\t\tcase 'csascii':\n\t\t\tcase 'ibm367':\n\t\t\tcase 'iso646irv1991':\n\t\t\tcase 'iso646us':\n\t\t\tcase 'isoir6':\n\t\t\tcase 'us':\n\t\t\tcase 'usascii':\n\t\t\t\treturn 'US-ASCII';\n\n\t\t\tcase 'csusdk':\n\t\t\tcase 'usdk':\n\t\t\t\treturn 'us-dk';\n\n\t\t\tcase 'utf7':\n\t\t\t\treturn 'UTF-7';\n\n\t\t\tcase 'utf8':\n\t\t\t\treturn 'UTF-8';\n\n\t\t\tcase 'utf16':\n\t\t\t\treturn 'UTF-16';\n\n\t\t\tcase 'utf16be':\n\t\t\t\treturn 'UTF-16BE';\n\n\t\t\tcase 'utf16le':\n\t\t\t\treturn 'UTF-16LE';\n\n\t\t\tcase 'utf32':\n\t\t\t\treturn 'UTF-32';\n\n\t\t\tcase 'utf32be':\n\t\t\t\treturn 'UTF-32BE';\n\n\t\t\tcase 'utf32le':\n\t\t\t\treturn 'UTF-32LE';\n\n\t\t\tcase 'csventurainternational':\n\t\t\tcase 'venturainternational':\n\t\t\t\treturn 'Ventura-International';\n\n\t\t\tcase 'csventuramath':\n\t\t\tcase 'venturamath':\n\t\t\t\treturn 'Ventura-Math';\n\n\t\t\tcase 'csventuraus':\n\t\t\tcase 'venturaus':\n\t\t\t\treturn 'Ventura-US';\n\n\t\t\tcase 'csiso70videotexsupp1':\n\t\t\tcase 'isoir70':\n\t\t\tcase 'videotexsuppl':\n\t\t\t\treturn 'videotex-suppl';\n\n\t\t\tcase 'csviqr':\n\t\t\tcase 'viqr':\n\t\t\t\treturn 'VIQR';\n\n\t\t\tcase 'csviscii':\n\t\t\tcase 'viscii':\n\t\t\t\treturn 'VISCII';\n\n\t\t\tcase 'csshiftjis':\n\t\t\tcase 'cswindows31j':\n\t\t\tcase 'mskanji':\n\t\t\tcase 'shiftjis':\n\t\t\tcase 'windows31j':\n\t\t\t\treturn 'Windows-31J';\n\n\t\t\tcase 'iso885911':\n\t\t\tcase 'tis620':\n\t\t\t\treturn 'windows-874';\n\n\t\t\tcase 'cseuckr':\n\t\t\tcase 'csksc56011987':\n\t\t\tcase 'euckr':\n\t\t\tcase 'isoir149':\n\t\t\tcase 'korean':\n\t\t\tcase 'ksc5601':\n\t\t\tcase 'ksc56011987':\n\t\t\tcase 'ksc56011989':\n\t\t\tcase 'windows949':\n\t\t\t\treturn 'windows-949';\n\n\t\t\tcase 'windows1250':\n\t\t\t\treturn 'windows-1250';\n\n\t\t\tcase 'windows1251':\n\t\t\t\treturn 'windows-1251';\n\n\t\t\tcase 'cp819':\n\t\t\tcase 'csisolatin1':\n\t\t\tcase 'ibm819':\n\t\t\tcase 'iso88591':\n\t\t\tcase 'iso885911987':\n\t\t\tcase 'isoir100':\n\t\t\tcase 'l1':\n\t\t\tcase 'latin1':\n\t\t\tcase 'windows1252':\n\t\t\t\treturn 'windows-1252';\n\n\t\t\tcase 'windows1253':\n\t\t\t\treturn 'windows-1253';\n\n\t\t\tcase 'csisolatin5':\n\t\t\tcase 'iso88599':\n\t\t\tcase 'iso885991989':\n\t\t\tcase 'isoir148':\n\t\t\tcase 'l5':\n\t\t\tcase 'latin5':\n\t\t\tcase 'windows1254':\n\t\t\t\treturn 'windows-1254';\n\n\t\t\tcase 'windows1255':\n\t\t\t\treturn 'windows-1255';\n\n\t\t\tcase 'windows1256':\n\t\t\t\treturn 'windows-1256';\n\n\t\t\tcase 'windows1257':\n\t\t\t\treturn 'windows-1257';\n\n\t\t\tcase 'windows1258':\n\t\t\t\treturn 'windows-1258';\n\n\t\t\tdefault:\n\t\t\t\treturn $charset;\n\t\t}\n\t}\n\n\tpublic static function get_curl_version()\n\t{\n\t\tif (is_array($curl = curl_version()))\n\t\t{\n\t\t\t$curl = $curl['version'];\n\t\t}\n\t\telseif (substr($curl, 0, 5) === 'curl/')\n\t\t{\n\t\t\t$curl = substr($curl, 5, strcspn($curl, \"\\x09\\x0A\\x0B\\x0C\\x0D\", 5));\n\t\t}\n\t\telseif (substr($curl, 0, 8) === 'libcurl/')\n\t\t{\n\t\t\t$curl = substr($curl, 8, strcspn($curl, \"\\x09\\x0A\\x0B\\x0C\\x0D\", 8));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$curl = 0;\n\t\t}\n\t\treturn $curl;\n\t}\n\n\t/**\n\t * Strip HTML comments\n\t *\n\t * @param string $data Data to strip comments from\n\t * @return string Comment stripped string\n\t */\n\tpublic static function strip_comments($data)\n\t{\n\t\t$output = '';\n\t\twhile (($start = strpos($data, '<!--')) !== false)\n\t\t{\n\t\t\t$output .= substr($data, 0, $start);\n\t\t\tif (($end = strpos($data, '-->', $start)) !== false)\n\t\t\t{\n\t\t\t\t$data = substr_replace($data, '', 0, $end + 3);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$data = '';\n\t\t\t}\n\t\t}\n\t\treturn $output . $data;\n\t}\n\n\tpublic static function parse_date($dt)\n\t{\n\t\t$parser = SimplePie_Parse_Date::get();\n\t\treturn $parser->parse($dt);\n\t}\n\n\t/**\n\t * Decode HTML entities\n\t *\n\t * @deprecated Use DOMDocument instead\n\t * @param string $data Input data\n\t * @return string Output data\n\t */\n\tpublic static function entities_decode($data)\n\t{\n\t\t$decoder = new SimplePie_Decode_HTML_Entities($data);\n\t\treturn $decoder->parse();\n\t}\n\n\t/**\n\t * Remove RFC822 comments\n\t *\n\t * @param string $data Data to strip comments from\n\t * @return string Comment stripped string\n\t */\n\tpublic static function uncomment_rfc822($string)\n\t{\n\t\t$string = (string) $string;\n\t\t$position = 0;\n\t\t$length = strlen($string);\n\t\t$depth = 0;\n\n\t\t$output = '';\n\n\t\twhile ($position < $length && ($pos = strpos($string, '(', $position)) !== false)\n\t\t{\n\t\t\t$output .= substr($string, $position, $pos - $position);\n\t\t\t$position = $pos + 1;\n\t\t\tif ($string[$pos - 1] !== '\\\\')\n\t\t\t{\n\t\t\t\t$depth++;\n\t\t\t\twhile ($depth && $position < $length)\n\t\t\t\t{\n\t\t\t\t\t$position += strcspn($string, '()', $position);\n\t\t\t\t\tif ($string[$position - 1] === '\\\\')\n\t\t\t\t\t{\n\t\t\t\t\t\t$position++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telseif (isset($string[$position]))\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch ($string[$position])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase '(':\n\t\t\t\t\t\t\t\t$depth++;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase ')':\n\t\t\t\t\t\t\t\t$depth--;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$position++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$output .= '(';\n\t\t\t}\n\t\t}\n\t\t$output .= substr($string, $position);\n\n\t\treturn $output;\n\t}\n\n\tpublic static function parse_mime($mime)\n\t{\n\t\tif (($pos = strpos($mime, ';')) === false)\n\t\t{\n\t\t\treturn trim($mime);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn trim(substr($mime, 0, $pos));\n\t\t}\n\t}\n\n\tpublic static function atom_03_construct_type($attribs)\n\t{\n\t\tif (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64'))\n\t\t{\n\t\t\t$mode = SIMPLEPIE_CONSTRUCT_BASE64;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$mode = SIMPLEPIE_CONSTRUCT_NONE;\n\t\t}\n\t\tif (isset($attribs['']['type']))\n\t\t{\n\t\t\tswitch (strtolower(trim($attribs['']['type'])))\n\t\t\t{\n\t\t\t\tcase 'text':\n\t\t\t\tcase 'text/plain':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_TEXT | $mode;\n\n\t\t\t\tcase 'html':\n\t\t\t\tcase 'text/html':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_HTML | $mode;\n\n\t\t\t\tcase 'xhtml':\n\t\t\t\tcase 'application/xhtml+xml':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_XHTML | $mode;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_NONE | $mode;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn SIMPLEPIE_CONSTRUCT_TEXT | $mode;\n\t\t}\n\t}\n\n\tpublic static function atom_10_construct_type($attribs)\n\t{\n\t\tif (isset($attribs['']['type']))\n\t\t{\n\t\t\tswitch (strtolower(trim($attribs['']['type'])))\n\t\t\t{\n\t\t\t\tcase 'text':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_TEXT;\n\n\t\t\t\tcase 'html':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_HTML;\n\n\t\t\t\tcase 'xhtml':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_XHTML;\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_NONE;\n\t\t\t}\n\t\t}\n\t\treturn SIMPLEPIE_CONSTRUCT_TEXT;\n\t}\n\n\tpublic static function atom_10_content_construct_type($attribs)\n\t{\n\t\tif (isset($attribs['']['type']))\n\t\t{\n\t\t\t$type = strtolower(trim($attribs['']['type']));\n\t\t\tswitch ($type)\n\t\t\t{\n\t\t\t\tcase 'text':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_TEXT;\n\n\t\t\t\tcase 'html':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_HTML;\n\n\t\t\t\tcase 'xhtml':\n\t\t\t\t\treturn SIMPLEPIE_CONSTRUCT_XHTML;\n\t\t\t}\n\t\t\tif (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/')\n\t\t\t{\n\t\t\t\treturn SIMPLEPIE_CONSTRUCT_NONE;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn SIMPLEPIE_CONSTRUCT_BASE64;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn SIMPLEPIE_CONSTRUCT_TEXT;\n\t\t}\n\t}\n\n\tpublic static function is_isegment_nz_nc($string)\n\t{\n\t\treturn (bool) preg_match('/^([A-Za-z0-9\\-._~\\x{A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}\\x{10000}-\\x{1FFFD}\\x{20000}-\\x{2FFFD}\\x{30000}-\\x{3FFFD}\\x{40000}-\\x{4FFFD}\\x{50000}-\\x{5FFFD}\\x{60000}-\\x{6FFFD}\\x{70000}-\\x{7FFFD}\\x{80000}-\\x{8FFFD}\\x{90000}-\\x{9FFFD}\\x{A0000}-\\x{AFFFD}\\x{B0000}-\\x{BFFFD}\\x{C0000}-\\x{CFFFD}\\x{D0000}-\\x{DFFFD}\\x{E1000}-\\x{EFFFD}!$&\\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);\n\t}\n\n\tpublic static function space_seperated_tokens($string)\n\t{\n\t\t$space_characters = \"\\x20\\x09\\x0A\\x0B\\x0C\\x0D\";\n\t\t$string_length = strlen($string);\n\n\t\t$position = strspn($string, $space_characters);\n\t\t$tokens = array();\n\n\t\twhile ($position < $string_length)\n\t\t{\n\t\t\t$len = strcspn($string, $space_characters, $position);\n\t\t\t$tokens[] = substr($string, $position, $len);\n\t\t\t$position += $len;\n\t\t\t$position += strspn($string, $space_characters, $position);\n\t\t}\n\n\t\treturn $tokens;\n\t}\n\n\t/**\n\t * Converts a unicode codepoint to a UTF-8 character\n\t *\n\t * @static\n\t * @param int $codepoint Unicode codepoint\n\t * @return string UTF-8 character\n\t */\n\tpublic static function codepoint_to_utf8($codepoint)\n\t{\n\t\t$codepoint = (int) $codepoint;\n\t\tif ($codepoint < 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\telse if ($codepoint <= 0x7f)\n\t\t{\n\t\t\treturn chr($codepoint);\n\t\t}\n\t\telse if ($codepoint <= 0x7ff)\n\t\t{\n\t\t\treturn chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));\n\t\t}\n\t\telse if ($codepoint <= 0xffff)\n\t\t{\n\t\t\treturn chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));\n\t\t}\n\t\telse if ($codepoint <= 0x10ffff)\n\t\t{\n\t\t\treturn chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// U+FFFD REPLACEMENT CHARACTER\n\t\t\treturn \"\\xEF\\xBF\\xBD\";\n\t\t}\n\t}\n\n\t/**\n\t * Similar to parse_str()\n\t *\n\t * Returns an associative array of name/value pairs, where the value is an\n\t * array of values that have used the same name\n\t *\n\t * @static\n\t * @param string $str The input string.\n\t * @return array\n\t */\n\tpublic static function parse_str($str)\n\t{\n\t\t$return = array();\n\t\t$str = explode('&', $str);\n\n\t\tforeach ($str as $section)\n\t\t{\n\t\t\tif (strpos($section, '=') !== false)\n\t\t\t{\n\t\t\t\tlist($name, $value) = explode('=', $section, 2);\n\t\t\t\t$return[urldecode($name)][] = urldecode($value);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$return[urldecode($section)][] = null;\n\t\t\t}\n\t\t}\n\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Detect XML encoding, as per XML 1.0 Appendix F.1\n\t *\n\t * @todo Add support for EBCDIC\n\t * @param string $data XML data\n\t * @param SimplePie_Registry $registry Class registry\n\t * @return array Possible encodings\n\t */\n\tpublic static function xml_encoding($data, $registry)\n\t{\n\t\t// UTF-32 Big Endian BOM\n\t\tif (substr($data, 0, 4) === \"\\x00\\x00\\xFE\\xFF\")\n\t\t{\n\t\t\t$encoding[] = 'UTF-32BE';\n\t\t}\n\t\t// UTF-32 Little Endian BOM\n\t\telseif (substr($data, 0, 4) === \"\\xFF\\xFE\\x00\\x00\")\n\t\t{\n\t\t\t$encoding[] = 'UTF-32LE';\n\t\t}\n\t\t// UTF-16 Big Endian BOM\n\t\telseif (substr($data, 0, 2) === \"\\xFE\\xFF\")\n\t\t{\n\t\t\t$encoding[] = 'UTF-16BE';\n\t\t}\n\t\t// UTF-16 Little Endian BOM\n\t\telseif (substr($data, 0, 2) === \"\\xFF\\xFE\")\n\t\t{\n\t\t\t$encoding[] = 'UTF-16LE';\n\t\t}\n\t\t// UTF-8 BOM\n\t\telseif (substr($data, 0, 3) === \"\\xEF\\xBB\\xBF\")\n\t\t{\n\t\t\t$encoding[] = 'UTF-8';\n\t\t}\n\t\t// UTF-32 Big Endian Without BOM\n\t\telseif (substr($data, 0, 20) === \"\\x00\\x00\\x00\\x3C\\x00\\x00\\x00\\x3F\\x00\\x00\\x00\\x78\\x00\\x00\\x00\\x6D\\x00\\x00\\x00\\x6C\")\n\t\t{\n\t\t\tif ($pos = strpos($data, \"\\x00\\x00\\x00\\x3F\\x00\\x00\\x00\\x3E\"))\n\t\t\t{\n\t\t\t\t$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));\n\t\t\t\tif ($parser->parse())\n\t\t\t\t{\n\t\t\t\t\t$encoding[] = $parser->encoding;\n\t\t\t\t}\n\t\t\t}\n\t\t\t$encoding[] = 'UTF-32BE';\n\t\t}\n\t\t// UTF-32 Little Endian Without BOM\n\t\telseif (substr($data, 0, 20) === \"\\x3C\\x00\\x00\\x00\\x3F\\x00\\x00\\x00\\x78\\x00\\x00\\x00\\x6D\\x00\\x00\\x00\\x6C\\x00\\x00\\x00\")\n\t\t{\n\t\t\tif ($pos = strpos($data, \"\\x3F\\x00\\x00\\x00\\x3E\\x00\\x00\\x00\"))\n\t\t\t{\n\t\t\t\t$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));\n\t\t\t\tif ($parser->parse())\n\t\t\t\t{\n\t\t\t\t\t$encoding[] = $parser->encoding;\n\t\t\t\t}\n\t\t\t}\n\t\t\t$encoding[] = 'UTF-32LE';\n\t\t}\n\t\t// UTF-16 Big Endian Without BOM\n\t\telseif (substr($data, 0, 10) === \"\\x00\\x3C\\x00\\x3F\\x00\\x78\\x00\\x6D\\x00\\x6C\")\n\t\t{\n\t\t\tif ($pos = strpos($data, \"\\x00\\x3F\\x00\\x3E\"))\n\t\t\t{\n\t\t\t\t$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));\n\t\t\t\tif ($parser->parse())\n\t\t\t\t{\n\t\t\t\t\t$encoding[] = $parser->encoding;\n\t\t\t\t}\n\t\t\t}\n\t\t\t$encoding[] = 'UTF-16BE';\n\t\t}\n\t\t// UTF-16 Little Endian Without BOM\n\t\telseif (substr($data, 0, 10) === \"\\x3C\\x00\\x3F\\x00\\x78\\x00\\x6D\\x00\\x6C\\x00\")\n\t\t{\n\t\t\tif ($pos = strpos($data, \"\\x3F\\x00\\x3E\\x00\"))\n\t\t\t{\n\t\t\t\t$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));\n\t\t\t\tif ($parser->parse())\n\t\t\t\t{\n\t\t\t\t\t$encoding[] = $parser->encoding;\n\t\t\t\t}\n\t\t\t}\n\t\t\t$encoding[] = 'UTF-16LE';\n\t\t}\n\t\t// US-ASCII (or superset)\n\t\telseif (substr($data, 0, 5) === \"\\x3C\\x3F\\x78\\x6D\\x6C\")\n\t\t{\n\t\t\tif ($pos = strpos($data, \"\\x3F\\x3E\"))\n\t\t\t{\n\t\t\t\t$parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));\n\t\t\t\tif ($parser->parse())\n\t\t\t\t{\n\t\t\t\t\t$encoding[] = $parser->encoding;\n\t\t\t\t}\n\t\t\t}\n\t\t\t$encoding[] = 'UTF-8';\n\t\t}\n\t\t// Fallback to UTF-8\n\t\telse\n\t\t{\n\t\t\t$encoding[] = 'UTF-8';\n\t\t}\n\t\treturn $encoding;\n\t}\n\n\tpublic static function output_javascript()\n\t{\n\t\tif (function_exists('ob_gzhandler'))\n\t\t{\n\t\t\tob_start('ob_gzhandler');\n\t\t}\n\t\theader('Content-type: text/javascript; charset: UTF-8');\n\t\theader('Cache-Control: must-revalidate');\n\t\theader('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days\n\t\t?>\nfunction embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {\n\tif (placeholder != '') {\n\t\tdocument.writeln('<embed type=\"'+type+'\" style=\"cursor:hand; cursor:pointer;\" href=\"'+link+'\" src=\"'+placeholder+'\" width=\"'+width+'\" height=\"'+height+'\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"'+loop+'\" scale=\"aspect\" bgcolor=\"'+bgcolor+'\" pluginspage=\"http://www.apple.com/quicktime/download/\"></embed>');\n\t}\n\telse {\n\t\tdocument.writeln('<embed type=\"'+type+'\" style=\"cursor:hand; cursor:pointer;\" src=\"'+link+'\" width=\"'+width+'\" height=\"'+height+'\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"'+loop+'\" scale=\"aspect\" bgcolor=\"'+bgcolor+'\" pluginspage=\"http://www.apple.com/quicktime/download/\"></embed>');\n\t}\n}\n\nfunction embed_flash(bgcolor, width, height, link, loop, type) {\n\tdocument.writeln('<embed src=\"'+link+'\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" type=\"'+type+'\" quality=\"high\" width=\"'+width+'\" height=\"'+height+'\" bgcolor=\"'+bgcolor+'\" loop=\"'+loop+'\"></embed>');\n}\n\nfunction embed_flv(width, height, link, placeholder, loop, player) {\n\tdocument.writeln('<embed src=\"'+player+'\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"'+width+'\" height=\"'+height+'\" wmode=\"transparent\" flashvars=\"file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false\"></embed>');\n}\n\nfunction embed_wmedia(width, height, link) {\n\tdocument.writeln('<embed type=\"application/x-mplayer2\" src=\"'+link+'\" autosize=\"1\" width=\"'+width+'\" height=\"'+height+'\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>');\n}\n\t\t<?php\n\t}\n\n\t/**\n\t * Get the SimplePie build timestamp\n\t *\n\t * Uses the git index if it exists, otherwise uses the modification time\n\t * of the newest file.\n\t */\n\tpublic static function get_build()\n\t{\n\t\t$root = dirname(dirname(__FILE__));\n\t\tif (file_exists($root . '/.git/index'))\n\t\t{\n\t\t\treturn filemtime($root . '/.git/index');\n\t\t}\n\t\telseif (file_exists($root . '/SimplePie'))\n\t\t{\n\t\t\t$time = 0;\n\t\t\tforeach (glob($root . '/SimplePie/*.php') as $file)\n\t\t\t{\n\t\t\t\tif (($mtime = filemtime($file)) > $time)\n\t\t\t\t{\n\t\t\t\t\t$time = $mtime;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn $time;\n\t\t}\n\t\telseif (file_exists(dirname(__FILE__) . '/Core.php'))\n\t\t{\n\t\t\treturn filemtime(dirname(__FILE__) . '/Core.php');\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn filemtime(__FILE__);\n\t\t}\n\t}\n\n\t/**\n\t * Format debugging information\n\t */\n\tpublic static function debug(&$sp)\n\t{\n\t\t$info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . \"\\n\";\n\t\t$info .= 'PHP ' . PHP_VERSION . \"\\n\";\n\t\tif ($sp->error() !== null)\n\t\t{\n\t\t\t$info .= 'Error occurred: ' . $sp->error() . \"\\n\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$info .= \"No error found.\\n\";\n\t\t}\n\t\t$info .= \"Extensions:\\n\";\n\t\t$extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');\n\t\tforeach ($extensions as $ext)\n\t\t{\n\t\t\tif (extension_loaded($ext))\n\t\t\t{\n\t\t\t\t$info .= \"    $ext loaded\\n\";\n\t\t\t\tswitch ($ext)\n\t\t\t\t{\n\t\t\t\t\tcase 'pcre':\n\t\t\t\t\t\t$info .= '      Version ' . PCRE_VERSION . \"\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'curl':\n\t\t\t\t\t\t$version = curl_version();\n\t\t\t\t\t\t$info .= '      Version ' . $version['version'] . \"\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mbstring':\n\t\t\t\t\t\t$info .= '      Overloading: ' . mb_get_info('func_overload') . \"\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'iconv':\n\t\t\t\t\t\t$info .= '      Version ' . ICONV_VERSION . \"\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'xml':\n\t\t\t\t\t\t$info .= '      Version ' . LIBXML_DOTTED_VERSION . \"\\n\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$info .= \"    $ext not loaded\\n\";\n\t\t\t}\n\t\t}\n\t\treturn $info;\n\t}\n\n\tpublic static function silence_errors($num, $str)\n\t{\n\t\t// No-op\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Net/IPv6.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * Class to validate and to work with IPv6 addresses.\n *\n * @package SimplePie\n * @subpackage HTTP\n * @copyright 2003-2005 The PHP Group\n * @license http://www.opensource.org/licenses/bsd-license.php\n * @link http://pear.php.net/package/Net_IPv6\n * @author Alexander Merz <alexander.merz@web.de>\n * @author elfrink at introweb dot nl\n * @author Josh Peck <jmp at joshpeck dot org>\n * @author Geoffrey Sneddon <geoffers@gmail.com>\n */\nclass SimplePie_Net_IPv6\n{\n\t/**\n\t * Uncompresses an IPv6 address\n\t *\n\t * RFC 4291 allows you to compress concecutive zero pieces in an address to\n\t * '::'. This method expects a valid IPv6 address and expands the '::' to\n\t * the required number of zero pieces.\n\t *\n\t * Example:  FF01::101   ->  FF01:0:0:0:0:0:0:101\n\t *           ::1         ->  0:0:0:0:0:0:0:1\n\t *\n\t * @author Alexander Merz <alexander.merz@web.de>\n\t * @author elfrink at introweb dot nl\n\t * @author Josh Peck <jmp at joshpeck dot org>\n\t * @copyright 2003-2005 The PHP Group\n\t * @license http://www.opensource.org/licenses/bsd-license.php\n\t * @param string $ip An IPv6 address\n\t * @return string The uncompressed IPv6 address\n\t */\n\tpublic static function uncompress($ip)\n\t{\n\t\t$c1 = -1;\n\t\t$c2 = -1;\n\t\tif (substr_count($ip, '::') === 1)\n\t\t{\n\t\t\tlist($ip1, $ip2) = explode('::', $ip);\n\t\t\tif ($ip1 === '')\n\t\t\t{\n\t\t\t\t$c1 = -1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$c1 = substr_count($ip1, ':');\n\t\t\t}\n\t\t\tif ($ip2 === '')\n\t\t\t{\n\t\t\t\t$c2 = -1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$c2 = substr_count($ip2, ':');\n\t\t\t}\n\t\t\tif (strpos($ip2, '.') !== false)\n\t\t\t{\n\t\t\t\t$c2++;\n\t\t\t}\n\t\t\t// ::\n\t\t\tif ($c1 === -1 && $c2 === -1)\n\t\t\t{\n\t\t\t\t$ip = '0:0:0:0:0:0:0:0';\n\t\t\t}\n\t\t\t// ::xxx\n\t\t\telse if ($c1 === -1)\n\t\t\t{\n\t\t\t\t$fill = str_repeat('0:', 7 - $c2);\n\t\t\t\t$ip = str_replace('::', $fill, $ip);\n\t\t\t}\n\t\t\t// xxx::\n\t\t\telse if ($c2 === -1)\n\t\t\t{\n\t\t\t\t$fill = str_repeat(':0', 7 - $c1);\n\t\t\t\t$ip = str_replace('::', $fill, $ip);\n\t\t\t}\n\t\t\t// xxx::xxx\n\t\t\telse\n\t\t\t{\n\t\t\t\t$fill = ':' . str_repeat('0:', 6 - $c2 - $c1);\n\t\t\t\t$ip = str_replace('::', $fill, $ip);\n\t\t\t}\n\t\t}\n\t\treturn $ip;\n\t}\n\n\t/**\n\t * Compresses an IPv6 address\n\t *\n\t * RFC 4291 allows you to compress concecutive zero pieces in an address to\n\t * '::'. This method expects a valid IPv6 address and compresses consecutive\n\t * zero pieces to '::'.\n\t *\n\t * Example:  FF01:0:0:0:0:0:0:101   ->  FF01::101\n\t *           0:0:0:0:0:0:0:1        ->  ::1\n\t *\n\t * @see uncompress()\n\t * @param string $ip An IPv6 address\n\t * @return string The compressed IPv6 address\n\t */\n\tpublic static function compress($ip)\n\t{\n\t\t// Prepare the IP to be compressed\n\t\t$ip = self::uncompress($ip);\n\t\t$ip_parts = self::split_v6_v4($ip);\n\n\t\t// Replace all leading zeros\n\t\t$ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\\1\\2', $ip_parts[0]);\n\n\t\t// Find bunches of zeros\n\t\tif (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE))\n\t\t{\n\t\t\t$max = 0;\n\t\t\t$pos = null;\n\t\t\tforeach ($matches[0] as $match)\n\t\t\t{\n\t\t\t\tif (strlen($match[0]) > $max)\n\t\t\t\t{\n\t\t\t\t\t$max = strlen($match[0]);\n\t\t\t\t\t$pos = $match[1];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max);\n\t\t}\n\n\t\tif ($ip_parts[1] !== '')\n\t\t{\n\t\t\treturn implode(':', $ip_parts);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $ip_parts[0];\n\t\t}\n\t}\n\n\t/**\n\t * Splits an IPv6 address into the IPv6 and IPv4 representation parts\n\t *\n\t * RFC 4291 allows you to represent the last two parts of an IPv6 address\n\t * using the standard IPv4 representation\n\t *\n\t * Example:  0:0:0:0:0:0:13.1.68.3\n\t *           0:0:0:0:0:FFFF:129.144.52.38\n\t *\n\t * @param string $ip An IPv6 address\n\t * @return array [0] contains the IPv6 represented part, and [1] the IPv4 represented part\n\t */\n\tprivate static function split_v6_v4($ip)\n\t{\n\t\tif (strpos($ip, '.') !== false)\n\t\t{\n\t\t\t$pos = strrpos($ip, ':');\n\t\t\t$ipv6_part = substr($ip, 0, $pos);\n\t\t\t$ipv4_part = substr($ip, $pos + 1);\n\t\t\treturn array($ipv6_part, $ipv4_part);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn array($ip, '');\n\t\t}\n\t}\n\n\t/**\n\t * Checks an IPv6 address\n\t *\n\t * Checks if the given IP is a valid IPv6 address\n\t *\n\t * @param string $ip An IPv6 address\n\t * @return bool true if $ip is a valid IPv6 address\n\t */\n\tpublic static function check_ipv6($ip)\n\t{\n\t\t$ip = self::uncompress($ip);\n\t\tlist($ipv6, $ipv4) = self::split_v6_v4($ip);\n\t\t$ipv6 = explode(':', $ipv6);\n\t\t$ipv4 = explode('.', $ipv4);\n\t\tif (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4)\n\t\t{\n\t\t\tforeach ($ipv6 as $ipv6_part)\n\t\t\t{\n\t\t\t\t// The section can't be empty\n\t\t\t\tif ($ipv6_part === '')\n\t\t\t\t\treturn false;\n\n\t\t\t\t// Nor can it be over four characters\n\t\t\t\tif (strlen($ipv6_part) > 4)\n\t\t\t\t\treturn false;\n\n\t\t\t\t// Remove leading zeros (this is safe because of the above)\n\t\t\t\t$ipv6_part = ltrim($ipv6_part, '0');\n\t\t\t\tif ($ipv6_part === '')\n\t\t\t\t\t$ipv6_part = '0';\n\n\t\t\t\t// Check the value is valid\n\t\t\t\t$value = hexdec($ipv6_part);\n\t\t\t\tif (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF)\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (count($ipv4) === 4)\n\t\t\t{\n\t\t\t\tforeach ($ipv4 as $ipv4_part)\n\t\t\t\t{\n\t\t\t\t\t$value = (int) $ipv4_part;\n\t\t\t\t\tif ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF)\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given IP is a valid IPv6 address\n\t *\n\t * @codeCoverageIgnore\n\t * @deprecated Use {@see SimplePie_Net_IPv6::check_ipv6()} instead\n\t * @see check_ipv6\n\t * @param string $ip An IPv6 address\n\t * @return bool true if $ip is a valid IPv6 address\n\t */\n\tpublic static function checkIPv6($ip)\n\t{\n\t\treturn self::check_ipv6($ip);\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Parse/Date.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * Date Parser\n *\n * @package SimplePie\n * @subpackage Parsing\n */\nclass SimplePie_Parse_Date\n{\n\t/**\n\t * Input data\n\t *\n\t * @access protected\n\t * @var string\n\t */\n\tvar $date;\n\n\t/**\n\t * List of days, calendar day name => ordinal day number in the week\n\t *\n\t * @access protected\n\t * @var array\n\t */\n\tvar $day = array(\n\t\t// English\n\t\t'mon' => 1,\n\t\t'monday' => 1,\n\t\t'tue' => 2,\n\t\t'tuesday' => 2,\n\t\t'wed' => 3,\n\t\t'wednesday' => 3,\n\t\t'thu' => 4,\n\t\t'thursday' => 4,\n\t\t'fri' => 5,\n\t\t'friday' => 5,\n\t\t'sat' => 6,\n\t\t'saturday' => 6,\n\t\t'sun' => 7,\n\t\t'sunday' => 7,\n\t\t// Dutch\n\t\t'maandag' => 1,\n\t\t'dinsdag' => 2,\n\t\t'woensdag' => 3,\n\t\t'donderdag' => 4,\n\t\t'vrijdag' => 5,\n\t\t'zaterdag' => 6,\n\t\t'zondag' => 7,\n\t\t// French\n\t\t'lundi' => 1,\n\t\t'mardi' => 2,\n\t\t'mercredi' => 3,\n\t\t'jeudi' => 4,\n\t\t'vendredi' => 5,\n\t\t'samedi' => 6,\n\t\t'dimanche' => 7,\n\t\t// German\n\t\t'montag' => 1,\n\t\t'dienstag' => 2,\n\t\t'mittwoch' => 3,\n\t\t'donnerstag' => 4,\n\t\t'freitag' => 5,\n\t\t'samstag' => 6,\n\t\t'sonnabend' => 6,\n\t\t'sonntag' => 7,\n\t\t// Italian\n\t\t'lunedì' => 1,\n\t\t'martedì' => 2,\n\t\t'mercoledì' => 3,\n\t\t'giovedì' => 4,\n\t\t'venerdì' => 5,\n\t\t'sabato' => 6,\n\t\t'domenica' => 7,\n\t\t// Spanish\n\t\t'lunes' => 1,\n\t\t'martes' => 2,\n\t\t'miércoles' => 3,\n\t\t'jueves' => 4,\n\t\t'viernes' => 5,\n\t\t'sábado' => 6,\n\t\t'domingo' => 7,\n\t\t// Finnish\n\t\t'maanantai' => 1,\n\t\t'tiistai' => 2,\n\t\t'keskiviikko' => 3,\n\t\t'torstai' => 4,\n\t\t'perjantai' => 5,\n\t\t'lauantai' => 6,\n\t\t'sunnuntai' => 7,\n\t\t// Hungarian\n\t\t'hétfő' => 1,\n\t\t'kedd' => 2,\n\t\t'szerda' => 3,\n\t\t'csütörtok' => 4,\n\t\t'péntek' => 5,\n\t\t'szombat' => 6,\n\t\t'vasárnap' => 7,\n\t\t// Greek\n\t\t'Δευ' => 1,\n\t\t'Τρι' => 2,\n\t\t'Τετ' => 3,\n\t\t'Πεμ' => 4,\n\t\t'Παρ' => 5,\n\t\t'Σαβ' => 6,\n\t\t'Κυρ' => 7,\n\t);\n\n\t/**\n\t * List of months, calendar month name => calendar month number\n\t *\n\t * @access protected\n\t * @var array\n\t */\n\tvar $month = array(\n\t\t// English\n\t\t'jan' => 1,\n\t\t'january' => 1,\n\t\t'feb' => 2,\n\t\t'february' => 2,\n\t\t'mar' => 3,\n\t\t'march' => 3,\n\t\t'apr' => 4,\n\t\t'april' => 4,\n\t\t'may' => 5,\n\t\t// No long form of May\n\t\t'jun' => 6,\n\t\t'june' => 6,\n\t\t'jul' => 7,\n\t\t'july' => 7,\n\t\t'aug' => 8,\n\t\t'august' => 8,\n\t\t'sep' => 9,\n\t\t'september' => 8,\n\t\t'oct' => 10,\n\t\t'october' => 10,\n\t\t'nov' => 11,\n\t\t'november' => 11,\n\t\t'dec' => 12,\n\t\t'december' => 12,\n\t\t// Dutch\n\t\t'januari' => 1,\n\t\t'februari' => 2,\n\t\t'maart' => 3,\n\t\t'april' => 4,\n\t\t'mei' => 5,\n\t\t'juni' => 6,\n\t\t'juli' => 7,\n\t\t'augustus' => 8,\n\t\t'september' => 9,\n\t\t'oktober' => 10,\n\t\t'november' => 11,\n\t\t'december' => 12,\n\t\t// French\n\t\t'janvier' => 1,\n\t\t'février' => 2,\n\t\t'mars' => 3,\n\t\t'avril' => 4,\n\t\t'mai' => 5,\n\t\t'juin' => 6,\n\t\t'juillet' => 7,\n\t\t'août' => 8,\n\t\t'septembre' => 9,\n\t\t'octobre' => 10,\n\t\t'novembre' => 11,\n\t\t'décembre' => 12,\n\t\t// German\n\t\t'januar' => 1,\n\t\t'februar' => 2,\n\t\t'märz' => 3,\n\t\t'april' => 4,\n\t\t'mai' => 5,\n\t\t'juni' => 6,\n\t\t'juli' => 7,\n\t\t'august' => 8,\n\t\t'september' => 9,\n\t\t'oktober' => 10,\n\t\t'november' => 11,\n\t\t'dezember' => 12,\n\t\t// Italian\n\t\t'gennaio' => 1,\n\t\t'febbraio' => 2,\n\t\t'marzo' => 3,\n\t\t'aprile' => 4,\n\t\t'maggio' => 5,\n\t\t'giugno' => 6,\n\t\t'luglio' => 7,\n\t\t'agosto' => 8,\n\t\t'settembre' => 9,\n\t\t'ottobre' => 10,\n\t\t'novembre' => 11,\n\t\t'dicembre' => 12,\n\t\t// Spanish\n\t\t'enero' => 1,\n\t\t'febrero' => 2,\n\t\t'marzo' => 3,\n\t\t'abril' => 4,\n\t\t'mayo' => 5,\n\t\t'junio' => 6,\n\t\t'julio' => 7,\n\t\t'agosto' => 8,\n\t\t'septiembre' => 9,\n\t\t'setiembre' => 9,\n\t\t'octubre' => 10,\n\t\t'noviembre' => 11,\n\t\t'diciembre' => 12,\n\t\t// Finnish\n\t\t'tammikuu' => 1,\n\t\t'helmikuu' => 2,\n\t\t'maaliskuu' => 3,\n\t\t'huhtikuu' => 4,\n\t\t'toukokuu' => 5,\n\t\t'kesäkuu' => 6,\n\t\t'heinäkuu' => 7,\n\t\t'elokuu' => 8,\n\t\t'suuskuu' => 9,\n\t\t'lokakuu' => 10,\n\t\t'marras' => 11,\n\t\t'joulukuu' => 12,\n\t\t// Hungarian\n\t\t'január' => 1,\n\t\t'február' => 2,\n\t\t'március' => 3,\n\t\t'április' => 4,\n\t\t'május' => 5,\n\t\t'június' => 6,\n\t\t'július' => 7,\n\t\t'augusztus' => 8,\n\t\t'szeptember' => 9,\n\t\t'október' => 10,\n\t\t'november' => 11,\n\t\t'december' => 12,\n\t\t// Greek\n\t\t'Ιαν' => 1,\n\t\t'Φεβ' => 2,\n\t\t'Μάώ' => 3,\n\t\t'Μαώ' => 3,\n\t\t'Απρ' => 4,\n\t\t'Μάι' => 5,\n\t\t'Μαϊ' => 5,\n\t\t'Μαι' => 5,\n\t\t'Ιούν' => 6,\n\t\t'Ιον' => 6,\n\t\t'Ιούλ' => 7,\n\t\t'Ιολ' => 7,\n\t\t'Αύγ' => 8,\n\t\t'Αυγ' => 8,\n\t\t'Σεπ' => 9,\n\t\t'Οκτ' => 10,\n\t\t'Νοέ' => 11,\n\t\t'Δεκ' => 12,\n\t);\n\n\t/**\n\t * List of timezones, abbreviation => offset from UTC\n\t *\n\t * @access protected\n\t * @var array\n\t */\n\tvar $timezone = array(\n\t\t'ACDT' => 37800,\n\t\t'ACIT' => 28800,\n\t\t'ACST' => 34200,\n\t\t'ACT' => -18000,\n\t\t'ACWDT' => 35100,\n\t\t'ACWST' => 31500,\n\t\t'AEDT' => 39600,\n\t\t'AEST' => 36000,\n\t\t'AFT' => 16200,\n\t\t'AKDT' => -28800,\n\t\t'AKST' => -32400,\n\t\t'AMDT' => 18000,\n\t\t'AMT' => -14400,\n\t\t'ANAST' => 46800,\n\t\t'ANAT' => 43200,\n\t\t'ART' => -10800,\n\t\t'AZOST' => -3600,\n\t\t'AZST' => 18000,\n\t\t'AZT' => 14400,\n\t\t'BIOT' => 21600,\n\t\t'BIT' => -43200,\n\t\t'BOT' => -14400,\n\t\t'BRST' => -7200,\n\t\t'BRT' => -10800,\n\t\t'BST' => 3600,\n\t\t'BTT' => 21600,\n\t\t'CAST' => 18000,\n\t\t'CAT' => 7200,\n\t\t'CCT' => 23400,\n\t\t'CDT' => -18000,\n\t\t'CEDT' => 7200,\n\t\t'CEST' => 7200,\n\t\t'CET' => 3600,\n\t\t'CGST' => -7200,\n\t\t'CGT' => -10800,\n\t\t'CHADT' => 49500,\n\t\t'CHAST' => 45900,\n\t\t'CIST' => -28800,\n\t\t'CKT' => -36000,\n\t\t'CLDT' => -10800,\n\t\t'CLST' => -14400,\n\t\t'COT' => -18000,\n\t\t'CST' => -21600,\n\t\t'CVT' => -3600,\n\t\t'CXT' => 25200,\n\t\t'DAVT' => 25200,\n\t\t'DTAT' => 36000,\n\t\t'EADT' => -18000,\n\t\t'EAST' => -21600,\n\t\t'EAT' => 10800,\n\t\t'ECT' => -18000,\n\t\t'EDT' => -14400,\n\t\t'EEST' => 10800,\n\t\t'EET' => 7200,\n\t\t'EGT' => -3600,\n\t\t'EKST' => 21600,\n\t\t'EST' => -18000,\n\t\t'FJT' => 43200,\n\t\t'FKDT' => -10800,\n\t\t'FKST' => -14400,\n\t\t'FNT' => -7200,\n\t\t'GALT' => -21600,\n\t\t'GEDT' => 14400,\n\t\t'GEST' => 10800,\n\t\t'GFT' => -10800,\n\t\t'GILT' => 43200,\n\t\t'GIT' => -32400,\n\t\t'GST' => 14400,\n\t\t'GST' => -7200,\n\t\t'GYT' => -14400,\n\t\t'HAA' => -10800,\n\t\t'HAC' => -18000,\n\t\t'HADT' => -32400,\n\t\t'HAE' => -14400,\n\t\t'HAP' => -25200,\n\t\t'HAR' => -21600,\n\t\t'HAST' => -36000,\n\t\t'HAT' => -9000,\n\t\t'HAY' => -28800,\n\t\t'HKST' => 28800,\n\t\t'HMT' => 18000,\n\t\t'HNA' => -14400,\n\t\t'HNC' => -21600,\n\t\t'HNE' => -18000,\n\t\t'HNP' => -28800,\n\t\t'HNR' => -25200,\n\t\t'HNT' => -12600,\n\t\t'HNY' => -32400,\n\t\t'IRDT' => 16200,\n\t\t'IRKST' => 32400,\n\t\t'IRKT' => 28800,\n\t\t'IRST' => 12600,\n\t\t'JFDT' => -10800,\n\t\t'JFST' => -14400,\n\t\t'JST' => 32400,\n\t\t'KGST' => 21600,\n\t\t'KGT' => 18000,\n\t\t'KOST' => 39600,\n\t\t'KOVST' => 28800,\n\t\t'KOVT' => 25200,\n\t\t'KRAST' => 28800,\n\t\t'KRAT' => 25200,\n\t\t'KST' => 32400,\n\t\t'LHDT' => 39600,\n\t\t'LHST' => 37800,\n\t\t'LINT' => 50400,\n\t\t'LKT' => 21600,\n\t\t'MAGST' => 43200,\n\t\t'MAGT' => 39600,\n\t\t'MAWT' => 21600,\n\t\t'MDT' => -21600,\n\t\t'MESZ' => 7200,\n\t\t'MEZ' => 3600,\n\t\t'MHT' => 43200,\n\t\t'MIT' => -34200,\n\t\t'MNST' => 32400,\n\t\t'MSDT' => 14400,\n\t\t'MSST' => 10800,\n\t\t'MST' => -25200,\n\t\t'MUT' => 14400,\n\t\t'MVT' => 18000,\n\t\t'MYT' => 28800,\n\t\t'NCT' => 39600,\n\t\t'NDT' => -9000,\n\t\t'NFT' => 41400,\n\t\t'NMIT' => 36000,\n\t\t'NOVST' => 25200,\n\t\t'NOVT' => 21600,\n\t\t'NPT' => 20700,\n\t\t'NRT' => 43200,\n\t\t'NST' => -12600,\n\t\t'NUT' => -39600,\n\t\t'NZDT' => 46800,\n\t\t'NZST' => 43200,\n\t\t'OMSST' => 25200,\n\t\t'OMST' => 21600,\n\t\t'PDT' => -25200,\n\t\t'PET' => -18000,\n\t\t'PETST' => 46800,\n\t\t'PETT' => 43200,\n\t\t'PGT' => 36000,\n\t\t'PHOT' => 46800,\n\t\t'PHT' => 28800,\n\t\t'PKT' => 18000,\n\t\t'PMDT' => -7200,\n\t\t'PMST' => -10800,\n\t\t'PONT' => 39600,\n\t\t'PST' => -28800,\n\t\t'PWT' => 32400,\n\t\t'PYST' => -10800,\n\t\t'PYT' => -14400,\n\t\t'RET' => 14400,\n\t\t'ROTT' => -10800,\n\t\t'SAMST' => 18000,\n\t\t'SAMT' => 14400,\n\t\t'SAST' => 7200,\n\t\t'SBT' => 39600,\n\t\t'SCDT' => 46800,\n\t\t'SCST' => 43200,\n\t\t'SCT' => 14400,\n\t\t'SEST' => 3600,\n\t\t'SGT' => 28800,\n\t\t'SIT' => 28800,\n\t\t'SRT' => -10800,\n\t\t'SST' => -39600,\n\t\t'SYST' => 10800,\n\t\t'SYT' => 7200,\n\t\t'TFT' => 18000,\n\t\t'THAT' => -36000,\n\t\t'TJT' => 18000,\n\t\t'TKT' => -36000,\n\t\t'TMT' => 18000,\n\t\t'TOT' => 46800,\n\t\t'TPT' => 32400,\n\t\t'TRUT' => 36000,\n\t\t'TVT' => 43200,\n\t\t'TWT' => 28800,\n\t\t'UYST' => -7200,\n\t\t'UYT' => -10800,\n\t\t'UZT' => 18000,\n\t\t'VET' => -14400,\n\t\t'VLAST' => 39600,\n\t\t'VLAT' => 36000,\n\t\t'VOST' => 21600,\n\t\t'VUT' => 39600,\n\t\t'WAST' => 7200,\n\t\t'WAT' => 3600,\n\t\t'WDT' => 32400,\n\t\t'WEST' => 3600,\n\t\t'WFT' => 43200,\n\t\t'WIB' => 25200,\n\t\t'WIT' => 32400,\n\t\t'WITA' => 28800,\n\t\t'WKST' => 18000,\n\t\t'WST' => 28800,\n\t\t'YAKST' => 36000,\n\t\t'YAKT' => 32400,\n\t\t'YAPT' => 36000,\n\t\t'YEKST' => 21600,\n\t\t'YEKT' => 18000,\n\t);\n\n\t/**\n\t * Cached PCRE for SimplePie_Parse_Date::$day\n\t *\n\t * @access protected\n\t * @var string\n\t */\n\tvar $day_pcre;\n\n\t/**\n\t * Cached PCRE for SimplePie_Parse_Date::$month\n\t *\n\t * @access protected\n\t * @var string\n\t */\n\tvar $month_pcre;\n\n\t/**\n\t * Array of user-added callback methods\n\t *\n\t * @access private\n\t * @var array\n\t */\n\tvar $built_in = array();\n\n\t/**\n\t * Array of user-added callback methods\n\t *\n\t * @access private\n\t * @var array\n\t */\n\tvar $user = array();\n\n\t/**\n\t * Create new SimplePie_Parse_Date object, and set self::day_pcre,\n\t * self::month_pcre, and self::built_in\n\t *\n\t * @access private\n\t */\n\tpublic function __construct()\n\t{\n\t\t$this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';\n\t\t$this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';\n\n\t\tstatic $cache;\n\t\tif (!isset($cache[get_class($this)]))\n\t\t{\n\t\t\t$all_methods = get_class_methods($this);\n\n\t\t\tforeach ($all_methods as $method)\n\t\t\t{\n\t\t\t\tif (strtolower(substr($method, 0, 5)) === 'date_')\n\t\t\t\t{\n\t\t\t\t\t$cache[get_class($this)][] = $method;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tforeach ($cache[get_class($this)] as $method)\n\t\t{\n\t\t\t$this->built_in[] = $method;\n\t\t}\n\t}\n\n\t/**\n\t * Get the object\n\t *\n\t * @access public\n\t */\n\tpublic static function get()\n\t{\n\t\tstatic $object;\n\t\tif (!$object)\n\t\t{\n\t\t\t$object = new SimplePie_Parse_Date;\n\t\t}\n\t\treturn $object;\n\t}\n\n\t/**\n\t * Parse a date\n\t *\n\t * @final\n\t * @access public\n\t * @param string $date Date to parse\n\t * @return int Timestamp corresponding to date string, or false on failure\n\t */\n\tpublic function parse($date)\n\t{\n\t\tforeach ($this->user as $method)\n\t\t{\n\t\t\tif (($returned = call_user_func($method, $date)) !== false)\n\t\t\t{\n\t\t\t\treturn $returned;\n\t\t\t}\n\t\t}\n\n\t\tforeach ($this->built_in as $method)\n\t\t{\n\t\t\tif (($returned = call_user_func(array($this, $method), $date)) !== false)\n\t\t\t{\n\t\t\t\treturn $returned;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Add a callback method to parse a date\n\t *\n\t * @final\n\t * @access public\n\t * @param callable $callback\n\t */\n\tpublic function add_callback($callback)\n\t{\n\t\tif (is_callable($callback))\n\t\t{\n\t\t\t$this->user[] = $callback;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttrigger_error('User-supplied function must be a valid callback', E_USER_WARNING);\n\t\t}\n\t}\n\n\t/**\n\t * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as\n\t * well as allowing any of upper or lower case \"T\", horizontal tabs, or\n\t * spaces to be used as the time seperator (including more than one))\n\t *\n\t * @access protected\n\t * @return int Timestamp\n\t */\n\tpublic function date_w3cdtf($date)\n\t{\n\t\tstatic $pcre;\n\t\tif (!$pcre)\n\t\t{\n\t\t\t$year = '([0-9]{4})';\n\t\t\t$month = $day = $hour = $minute = $second = '([0-9]{2})';\n\t\t\t$decimal = '([0-9]*)';\n\t\t\t$zone = '(?:(Z)|([+\\-])([0-9]{1,2}):?([0-9]{1,2}))';\n\t\t\t$pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\\x09\\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';\n\t\t}\n\t\tif (preg_match($pcre, $date, $match))\n\t\t{\n\t\t\t/*\n\t\t\tCapturing subpatterns:\n\t\t\t1: Year\n\t\t\t2: Month\n\t\t\t3: Day\n\t\t\t4: Hour\n\t\t\t5: Minute\n\t\t\t6: Second\n\t\t\t7: Decimal fraction of a second\n\t\t\t8: Zulu\n\t\t\t9: Timezone ±\n\t\t\t10: Timezone hours\n\t\t\t11: Timezone minutes\n\t\t\t*/\n\n\t\t\t// Fill in empty matches\n\t\t\tfor ($i = count($match); $i <= 3; $i++)\n\t\t\t{\n\t\t\t\t$match[$i] = '1';\n\t\t\t}\n\n\t\t\tfor ($i = count($match); $i <= 7; $i++)\n\t\t\t{\n\t\t\t\t$match[$i] = '0';\n\t\t\t}\n\n\t\t\t// Numeric timezone\n\t\t\tif (isset($match[9]) && $match[9] !== '')\n\t\t\t{\n\t\t\t\t$timezone = $match[10] * 3600;\n\t\t\t\t$timezone += $match[11] * 60;\n\t\t\t\tif ($match[9] === '-')\n\t\t\t\t{\n\t\t\t\t\t$timezone = 0 - $timezone;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$timezone = 0;\n\t\t\t}\n\n\t\t\t// Convert the number of seconds to an integer, taking decimals into account\n\t\t\t$second = round($match[6] + $match[7] / pow(10, strlen($match[7])));\n\n\t\t\treturn gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Remove RFC822 comments\n\t *\n\t * @access protected\n\t * @param string $data Data to strip comments from\n\t * @return string Comment stripped string\n\t */\n\tpublic function remove_rfc2822_comments($string)\n\t{\n\t\t$string = (string) $string;\n\t\t$position = 0;\n\t\t$length = strlen($string);\n\t\t$depth = 0;\n\n\t\t$output = '';\n\n\t\twhile ($position < $length && ($pos = strpos($string, '(', $position)) !== false)\n\t\t{\n\t\t\t$output .= substr($string, $position, $pos - $position);\n\t\t\t$position = $pos + 1;\n\t\t\tif ($string[$pos - 1] !== '\\\\')\n\t\t\t{\n\t\t\t\t$depth++;\n\t\t\t\twhile ($depth && $position < $length)\n\t\t\t\t{\n\t\t\t\t\t$position += strcspn($string, '()', $position);\n\t\t\t\t\tif ($string[$position - 1] === '\\\\')\n\t\t\t\t\t{\n\t\t\t\t\t\t$position++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telseif (isset($string[$position]))\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch ($string[$position])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase '(':\n\t\t\t\t\t\t\t\t$depth++;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase ')':\n\t\t\t\t\t\t\t\t$depth--;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$position++;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$output .= '(';\n\t\t\t}\n\t\t}\n\t\t$output .= substr($string, $position);\n\n\t\treturn $output;\n\t}\n\n\t/**\n\t * Parse RFC2822's date format\n\t *\n\t * @access protected\n\t * @return int Timestamp\n\t */\n\tpublic function date_rfc2822($date)\n\t{\n\t\tstatic $pcre;\n\t\tif (!$pcre)\n\t\t{\n\t\t\t$wsp = '[\\x09\\x20]';\n\t\t\t$fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\\x0D\\x0A' . $wsp . '+)+)';\n\t\t\t$optional_fws = $fws . '?';\n\t\t\t$day_name = $this->day_pcre;\n\t\t\t$month = $this->month_pcre;\n\t\t\t$day = '([0-9]{1,2})';\n\t\t\t$hour = $minute = $second = '([0-9]{2})';\n\t\t\t$year = '([0-9]{2,4})';\n\t\t\t$num_zone = '([+\\-])([0-9]{2})([0-9]{2})';\n\t\t\t$character_zone = '([A-Z]{1,5})';\n\t\t\t$zone = '(?:' . $num_zone . '|' . $character_zone . ')';\n\t\t\t$pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';\n\t\t}\n\t\tif (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))\n\t\t{\n\t\t\t/*\n\t\t\tCapturing subpatterns:\n\t\t\t1: Day name\n\t\t\t2: Day\n\t\t\t3: Month\n\t\t\t4: Year\n\t\t\t5: Hour\n\t\t\t6: Minute\n\t\t\t7: Second\n\t\t\t8: Timezone ±\n\t\t\t9: Timezone hours\n\t\t\t10: Timezone minutes\n\t\t\t11: Alphabetic timezone\n\t\t\t*/\n\n\t\t\t// Find the month number\n\t\t\t$month = $this->month[strtolower($match[3])];\n\n\t\t\t// Numeric timezone\n\t\t\tif ($match[8] !== '')\n\t\t\t{\n\t\t\t\t$timezone = $match[9] * 3600;\n\t\t\t\t$timezone += $match[10] * 60;\n\t\t\t\tif ($match[8] === '-')\n\t\t\t\t{\n\t\t\t\t\t$timezone = 0 - $timezone;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Character timezone\n\t\t\telseif (isset($this->timezone[strtoupper($match[11])]))\n\t\t\t{\n\t\t\t\t$timezone = $this->timezone[strtoupper($match[11])];\n\t\t\t}\n\t\t\t// Assume everything else to be -0000\n\t\t\telse\n\t\t\t{\n\t\t\t\t$timezone = 0;\n\t\t\t}\n\n\t\t\t// Deal with 2/3 digit years\n\t\t\tif ($match[4] < 50)\n\t\t\t{\n\t\t\t\t$match[4] += 2000;\n\t\t\t}\n\t\t\telseif ($match[4] < 1000)\n\t\t\t{\n\t\t\t\t$match[4] += 1900;\n\t\t\t}\n\n\t\t\t// Second is optional, if it is empty set it to zero\n\t\t\tif ($match[7] !== '')\n\t\t\t{\n\t\t\t\t$second = $match[7];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$second = 0;\n\t\t\t}\n\n\t\t\treturn gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Parse RFC850's date format\n\t *\n\t * @access protected\n\t * @return int Timestamp\n\t */\n\tpublic function date_rfc850($date)\n\t{\n\t\tstatic $pcre;\n\t\tif (!$pcre)\n\t\t{\n\t\t\t$space = '[\\x09\\x20]+';\n\t\t\t$day_name = $this->day_pcre;\n\t\t\t$month = $this->month_pcre;\n\t\t\t$day = '([0-9]{1,2})';\n\t\t\t$year = $hour = $minute = $second = '([0-9]{2})';\n\t\t\t$zone = '([A-Z]{1,5})';\n\t\t\t$pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';\n\t\t}\n\t\tif (preg_match($pcre, $date, $match))\n\t\t{\n\t\t\t/*\n\t\t\tCapturing subpatterns:\n\t\t\t1: Day name\n\t\t\t2: Day\n\t\t\t3: Month\n\t\t\t4: Year\n\t\t\t5: Hour\n\t\t\t6: Minute\n\t\t\t7: Second\n\t\t\t8: Timezone\n\t\t\t*/\n\n\t\t\t// Month\n\t\t\t$month = $this->month[strtolower($match[3])];\n\n\t\t\t// Character timezone\n\t\t\tif (isset($this->timezone[strtoupper($match[8])]))\n\t\t\t{\n\t\t\t\t$timezone = $this->timezone[strtoupper($match[8])];\n\t\t\t}\n\t\t\t// Assume everything else to be -0000\n\t\t\telse\n\t\t\t{\n\t\t\t\t$timezone = 0;\n\t\t\t}\n\n\t\t\t// Deal with 2 digit year\n\t\t\tif ($match[4] < 50)\n\t\t\t{\n\t\t\t\t$match[4] += 2000;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$match[4] += 1900;\n\t\t\t}\n\n\t\t\treturn gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Parse C99's asctime()'s date format\n\t *\n\t * @access protected\n\t * @return int Timestamp\n\t */\n\tpublic function date_asctime($date)\n\t{\n\t\tstatic $pcre;\n\t\tif (!$pcre)\n\t\t{\n\t\t\t$space = '[\\x09\\x20]+';\n\t\t\t$wday_name = $this->day_pcre;\n\t\t\t$mon_name = $this->month_pcre;\n\t\t\t$day = '([0-9]{1,2})';\n\t\t\t$hour = $sec = $min = '([0-9]{2})';\n\t\t\t$year = '([0-9]{4})';\n\t\t\t$terminator = '\\x0A?\\x00?';\n\t\t\t$pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';\n\t\t}\n\t\tif (preg_match($pcre, $date, $match))\n\t\t{\n\t\t\t/*\n\t\t\tCapturing subpatterns:\n\t\t\t1: Day name\n\t\t\t2: Month\n\t\t\t3: Day\n\t\t\t4: Hour\n\t\t\t5: Minute\n\t\t\t6: Second\n\t\t\t7: Year\n\t\t\t*/\n\n\t\t\t$month = $this->month[strtolower($match[2])];\n\t\t\treturn gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Parse dates using strtotime()\n\t *\n\t * @access protected\n\t * @return int Timestamp\n\t */\n\tpublic function date_strtotime($date)\n\t{\n\t\t$strtotime = strtotime($date);\n\t\tif ($strtotime === -1 || $strtotime === false)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $strtotime;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Parser.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Parses XML into something sane\n *\n *\n * This class can be overloaded with {@see SimplePie::set_parser_class()}\n *\n * @package SimplePie\n * @subpackage Parsing\n */\nclass SimplePie_Parser\n{\n\tvar $error_code;\n\tvar $error_string;\n\tvar $current_line;\n\tvar $current_column;\n\tvar $current_byte;\n\tvar $separator = ' ';\n\tvar $namespace = array('');\n\tvar $element = array('');\n\tvar $xml_base = array('');\n\tvar $xml_base_explicit = array(false);\n\tvar $xml_lang = array('');\n\tvar $data = array();\n\tvar $datas = array(array());\n\tvar $current_xhtml_construct = -1;\n\tvar $encoding;\n\tprotected $registry;\n\n\tpublic function set_registry(SimplePie_Registry $registry)\n\t{\n\t\t$this->registry = $registry;\n\t}\n\n\tpublic function parse(&$data, $encoding)\n\t{\n\t\t// Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character\n\t\tif (strtoupper($encoding) === 'US-ASCII')\n\t\t{\n\t\t\t$this->encoding = 'UTF-8';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->encoding = $encoding;\n\t\t}\n\n\t\t// Strip BOM:\n\t\t// UTF-32 Big Endian BOM\n\t\tif (substr($data, 0, 4) === \"\\x00\\x00\\xFE\\xFF\")\n\t\t{\n\t\t\t$data = substr($data, 4);\n\t\t}\n\t\t// UTF-32 Little Endian BOM\n\t\telseif (substr($data, 0, 4) === \"\\xFF\\xFE\\x00\\x00\")\n\t\t{\n\t\t\t$data = substr($data, 4);\n\t\t}\n\t\t// UTF-16 Big Endian BOM\n\t\telseif (substr($data, 0, 2) === \"\\xFE\\xFF\")\n\t\t{\n\t\t\t$data = substr($data, 2);\n\t\t}\n\t\t// UTF-16 Little Endian BOM\n\t\telseif (substr($data, 0, 2) === \"\\xFF\\xFE\")\n\t\t{\n\t\t\t$data = substr($data, 2);\n\t\t}\n\t\t// UTF-8 BOM\n\t\telseif (substr($data, 0, 3) === \"\\xEF\\xBB\\xBF\")\n\t\t{\n\t\t\t$data = substr($data, 3);\n\t\t}\n\n\t\tif (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), \"\\x09\\x0A\\x0D\\x20\") && ($pos = strpos($data, '?>')) !== false)\n\t\t{\n\t\t\t$declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));\n\t\t\tif ($declaration->parse())\n\t\t\t{\n\t\t\t\t$data = substr($data, $pos + 2);\n\t\t\t\t$data = '<?xml version=\"' . $declaration->version . '\" encoding=\"' . $encoding . '\" standalone=\"' . (($declaration->standalone) ? 'yes' : 'no') . '\"?>' . $data;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->error_string = 'SimplePie bug! Please report this!';\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t$return = true;\n\n\t\tstatic $xml_is_sane = null;\n\t\tif ($xml_is_sane === null)\n\t\t{\n\t\t\t$parser_check = xml_parser_create();\n\t\t\txml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);\n\t\t\txml_parser_free($parser_check);\n\t\t\t$xml_is_sane = isset($values[0]['value']);\n\t\t}\n\n\t\t// Create the parser\n\t\tif ($xml_is_sane)\n\t\t{\n\t\t\t$xml = xml_parser_create_ns($this->encoding, $this->separator);\n\t\t\txml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1);\n\t\t\txml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0);\n\t\t\txml_set_object($xml, $this);\n\t\t\txml_set_character_data_handler($xml, 'cdata');\n\t\t\txml_set_element_handler($xml, 'tag_open', 'tag_close');\n\n\t\t\t// Parse!\n\t\t\tif (!xml_parse($xml, $data, true))\n\t\t\t{\n\t\t\t\t$this->error_code = xml_get_error_code($xml);\n\t\t\t\t$this->error_string = xml_error_string($this->error_code);\n\t\t\t\t$return = false;\n\t\t\t}\n\t\t\t$this->current_line = xml_get_current_line_number($xml);\n\t\t\t$this->current_column = xml_get_current_column_number($xml);\n\t\t\t$this->current_byte = xml_get_current_byte_index($xml);\n\t\t\txml_parser_free($xml);\n\t\t\treturn $return;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlibxml_clear_errors();\n\t\t\t$xml = new XMLReader();\n\t\t\t$xml->xml($data);\n\t\t\twhile (@$xml->read())\n\t\t\t{\n\t\t\t\tswitch ($xml->nodeType)\n\t\t\t\t{\n\n\t\t\t\t\tcase constant('XMLReader::END_ELEMENT'):\n\t\t\t\t\t\tif ($xml->namespaceURI !== '')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$tagName = $xml->namespaceURI . $this->separator . $xml->localName;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$tagName = $xml->localName;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$this->tag_close(null, $tagName);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase constant('XMLReader::ELEMENT'):\n\t\t\t\t\t\t$empty = $xml->isEmptyElement;\n\t\t\t\t\t\tif ($xml->namespaceURI !== '')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$tagName = $xml->namespaceURI . $this->separator . $xml->localName;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$tagName = $xml->localName;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$attributes = array();\n\t\t\t\t\t\twhile ($xml->moveToNextAttribute())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ($xml->namespaceURI !== '')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$attrName = $xml->namespaceURI . $this->separator . $xml->localName;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$attrName = $xml->localName;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$attributes[$attrName] = $xml->value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$this->tag_open(null, $tagName, $attributes);\n\t\t\t\t\t\tif ($empty)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->tag_close(null, $tagName);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase constant('XMLReader::TEXT'):\n\n\t\t\t\t\tcase constant('XMLReader::CDATA'):\n\t\t\t\t\t\t$this->cdata(null, $xml->value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($error = libxml_get_last_error())\n\t\t\t{\n\t\t\t\t$this->error_code = $error->code;\n\t\t\t\t$this->error_string = $error->message;\n\t\t\t\t$this->current_line = $error->line;\n\t\t\t\t$this->current_column = $error->column;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function get_error_code()\n\t{\n\t\treturn $this->error_code;\n\t}\n\n\tpublic function get_error_string()\n\t{\n\t\treturn $this->error_string;\n\t}\n\n\tpublic function get_current_line()\n\t{\n\t\treturn $this->current_line;\n\t}\n\n\tpublic function get_current_column()\n\t{\n\t\treturn $this->current_column;\n\t}\n\n\tpublic function get_current_byte()\n\t{\n\t\treturn $this->current_byte;\n\t}\n\n\tpublic function get_data()\n\t{\n\t\treturn $this->data;\n\t}\n\n\tpublic function tag_open($parser, $tag, $attributes)\n\t{\n\t\tlist($this->namespace[], $this->element[]) = $this->split_ns($tag);\n\n\t\t$attribs = array();\n\t\tforeach ($attributes as $name => $value)\n\t\t{\n\t\t\tlist($attrib_namespace, $attribute) = $this->split_ns($name);\n\t\t\t$attribs[$attrib_namespace][$attribute] = $value;\n\t\t}\n\n\t\tif (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base']))\n\t\t{\n\t\t\t$base = $this->registry->call('Misc', 'absolutize_url', array($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base)));\n\t\t\tif ($base !== false)\n\t\t\t{\n\t\t\t\t$this->xml_base[] = $base;\n\t\t\t\t$this->xml_base_explicit[] = true;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->xml_base[] = end($this->xml_base);\n\t\t\t$this->xml_base_explicit[] = end($this->xml_base_explicit);\n\t\t}\n\n\t\tif (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang']))\n\t\t{\n\t\t\t$this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang'];\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->xml_lang[] = end($this->xml_lang);\n\t\t}\n\n\t\tif ($this->current_xhtml_construct >= 0)\n\t\t{\n\t\t\t$this->current_xhtml_construct++;\n\t\t\tif (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML)\n\t\t\t{\n\t\t\t\t$this->data['data'] .= '<' . end($this->element);\n\t\t\t\tif (isset($attribs['']))\n\t\t\t\t{\n\t\t\t\t\tforeach ($attribs[''] as $name => $value)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['data'] .= ' ' . $name . '=\"' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '\"';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$this->data['data'] .= '>';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->datas[] =& $this->data;\n\t\t\t$this->data =& $this->data['child'][end($this->namespace)][end($this->element)][];\n\t\t\t$this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang));\n\t\t\tif ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml')\n\t\t\t|| (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml')\n\t\t\t|| (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_20 && in_array(end($this->element), array('title')))\n\t\t\t|| (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_090 && in_array(end($this->element), array('title')))\n\t\t\t|| (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_10 && in_array(end($this->element), array('title'))))\n\t\t\t{\n\t\t\t\t$this->current_xhtml_construct = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function cdata($parser, $cdata)\n\t{\n\t\tif ($this->current_xhtml_construct >= 0)\n\t\t{\n\t\t\t$this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding);\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->data['data'] .= $cdata;\n\t\t}\n\t}\n\n\tpublic function tag_close($parser, $tag)\n\t{\n\t\tif ($this->current_xhtml_construct >= 0)\n\t\t{\n\t\t\t$this->current_xhtml_construct--;\n\t\t\tif (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param')))\n\t\t\t{\n\t\t\t\t$this->data['data'] .= '</' . end($this->element) . '>';\n\t\t\t}\n\t\t}\n\t\tif ($this->current_xhtml_construct === -1)\n\t\t{\n\t\t\t$this->data =& $this->datas[count($this->datas) - 1];\n\t\t\tarray_pop($this->datas);\n\t\t}\n\n\t\tarray_pop($this->element);\n\t\tarray_pop($this->namespace);\n\t\tarray_pop($this->xml_base);\n\t\tarray_pop($this->xml_base_explicit);\n\t\tarray_pop($this->xml_lang);\n\t}\n\n\tpublic function split_ns($string)\n\t{\n\t\tstatic $cache = array();\n\t\tif (!isset($cache[$string]))\n\t\t{\n\t\t\tif ($pos = strpos($string, $this->separator))\n\t\t\t{\n\t\t\t\tstatic $separator_length;\n\t\t\t\tif (!$separator_length)\n\t\t\t\t{\n\t\t\t\t\t$separator_length = strlen($this->separator);\n\t\t\t\t}\n\t\t\t\t$namespace = substr($string, 0, $pos);\n\t\t\t\t$local_name = substr($string, $pos + $separator_length);\n\t\t\t\tif (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES)\n\t\t\t\t{\n\t\t\t\t\t$namespace = SIMPLEPIE_NAMESPACE_ITUNES;\n\t\t\t\t}\n\n\t\t\t\t// Normalize the Media RSS namespaces\n\t\t\t\tif ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG ||\n\t\t\t\t\t$namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2 ||\n\t\t\t\t\t$namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3 ||\n\t\t\t\t\t$namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4 ||\n\t\t\t\t\t$namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5 )\n\t\t\t\t{\n\t\t\t\t\t$namespace = SIMPLEPIE_NAMESPACE_MEDIARSS;\n\t\t\t\t}\n\t\t\t\t$cache[$string] = array($namespace, $local_name);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$cache[$string] = array('', $string);\n\t\t\t}\n\t\t}\n\t\treturn $cache[$string];\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Rating.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Handles `<media:rating>` or `<itunes:explicit>` tags as defined in Media RSS and iTunes RSS respectively\n *\n * Used by {@see SimplePie_Enclosure::get_rating()} and {@see SimplePie_Enclosure::get_ratings()}\n *\n * This class can be overloaded with {@see SimplePie::set_rating_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Rating\n{\n\t/**\n\t * Rating scheme\n\t *\n\t * @var string\n\t * @see get_scheme()\n\t */\n\tvar $scheme;\n\n\t/**\n\t * Rating value\n\t *\n\t * @var string\n\t * @see get_value()\n\t */\n\tvar $value;\n\n\t/**\n\t * Constructor, used to input the data\n\t *\n\t * For documentation on all the parameters, see the corresponding\n\t * properties and their accessors\n\t */\n\tpublic function __construct($scheme = null, $value = null)\n\t{\n\t\t$this->scheme = $scheme;\n\t\t$this->value = $value;\n\t}\n\n\t/**\n\t * String-ified version\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t// There is no $this->data here\n\t\treturn md5(serialize($this));\n\t}\n\n\t/**\n\t * Get the organizational scheme for the rating\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_scheme()\n\t{\n\t\tif ($this->scheme !== null)\n\t\t{\n\t\t\treturn $this->scheme;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the value of the rating\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_value()\n\t{\n\t\tif ($this->value !== null)\n\t\t{\n\t\t\treturn $this->value;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Registry.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Handles creating objects and calling methods\n *\n * Access this via {@see SimplePie::get_registry()}\n *\n * @package SimplePie\n */\nclass SimplePie_Registry\n{\n\t/**\n\t * Default class mapping\n\t *\n\t * Overriding classes *must* subclass these.\n\t *\n\t * @var array\n\t */\n\tprotected $default = array(\n\t\t'Cache' => 'SimplePie_Cache',\n\t\t'Locator' => 'SimplePie_Locator',\n\t\t'Parser' => 'SimplePie_Parser',\n\t\t'File' => 'SimplePie_File',\n\t\t'Sanitize' => 'SimplePie_Sanitize',\n\t\t'Item' => 'SimplePie_Item',\n\t\t'Author' => 'SimplePie_Author',\n\t\t'Category' => 'SimplePie_Category',\n\t\t'Enclosure' => 'SimplePie_Enclosure',\n\t\t'Caption' => 'SimplePie_Caption',\n\t\t'Copyright' => 'SimplePie_Copyright',\n\t\t'Credit' => 'SimplePie_Credit',\n\t\t'Rating' => 'SimplePie_Rating',\n\t\t'Restriction' => 'SimplePie_Restriction',\n\t\t'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer',\n\t\t'Source' => 'SimplePie_Source',\n\t\t'Misc' => 'SimplePie_Misc',\n\t\t'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser',\n\t\t'Parse_Date' => 'SimplePie_Parse_Date',\n\t);\n\n\t/**\n\t * Class mapping\n\t *\n\t * @see register()\n\t * @var array\n\t */\n\tprotected $classes = array();\n\n\t/**\n\t * Legacy classes\n\t *\n\t * @see register()\n\t * @var array\n\t */\n\tprotected $legacy = array();\n\n\t/**\n\t * Constructor\n\t *\n\t * No-op\n\t */\n\tpublic function __construct() { }\n\n\t/**\n\t * Register a class\n\t *\n\t * @param string $type See {@see $default} for names\n\t * @param string $class Class name, must subclass the corresponding default\n\t * @param bool $legacy Whether to enable legacy support for this class\n\t * @return bool Successfulness\n\t */\n\tpublic function register($type, $class, $legacy = false)\n\t{\n\t\tif (!is_subclass_of($class, $this->default[$type]))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->classes[$type] = $class;\n\n\t\tif ($legacy)\n\t\t{\n\t\t\t$this->legacy[] = $class;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get the class registered for a type\n\t *\n\t * Where possible, use {@see create()} or {@see call()} instead\n\t *\n\t * @param string $type\n\t * @return string|null\n\t */\n\tpublic function get_class($type)\n\t{\n\t\tif (!empty($this->classes[$type]))\n\t\t{\n\t\t\treturn $this->classes[$type];\n\t\t}\n\t\tif (!empty($this->default[$type]))\n\t\t{\n\t\t\treturn $this->default[$type];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Create a new instance of a given type\n\t *\n\t * @param string $type\n\t * @param array $parameters Parameters to pass to the constructor\n\t * @return object Instance of class\n\t */\n\tpublic function &create($type, $parameters = array())\n\t{\n\t\t$class = $this->get_class($type);\n\n\t\tif (in_array($class, $this->legacy))\n\t\t{\n\t\t\tswitch ($type)\n\t\t\t{\n\t\t\t\tcase 'locator':\n\t\t\t\t\t// Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class\n\t\t\t\t\t// Specified: file, timeout, useragent, max_checked_feeds\n\t\t\t\t\t$replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer'));\n\t\t\t\t\tarray_splice($parameters, 3, 1, $replacement);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!method_exists($class, '__construct'))\n\t\t{\n\t\t\t$instance = new $class;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$reflector = new ReflectionClass($class);\n\t\t\t$instance = $reflector->newInstanceArgs($parameters);\n\t\t}\n\n\t\tif (method_exists($instance, 'set_registry'))\n\t\t{\n\t\t\t$instance->set_registry($this);\n\t\t}\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Call a static method for a type\n\t *\n\t * @param string $type\n\t * @param string $method\n\t * @param array $parameters\n\t * @return mixed\n\t */\n\tpublic function &call($type, $method, $parameters = array())\n\t{\n\t\t$class = $this->get_class($type);\n\n\t\tif (in_array($class, $this->legacy))\n\t\t{\n\t\t\tswitch ($type)\n\t\t\t{\n\t\t\t\tcase 'Cache':\n\t\t\t\t\t// For backwards compatibility with old non-static\n\t\t\t\t\t// Cache::create() methods\n\t\t\t\t\tif ($method === 'get_handler')\n\t\t\t\t\t{\n\t\t\t\t\t\t$result = @call_user_func_array(array($class, 'create'), $parameters);\n\t\t\t\t\t\treturn $result;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$result = call_user_func_array(array($class, $method), $parameters);\n\t\treturn $result;\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Restriction.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Handles `<media:restriction>` as defined in Media RSS\n *\n * Used by {@see SimplePie_Enclosure::get_restriction()} and {@see SimplePie_Enclosure::get_restrictions()}\n *\n * This class can be overloaded with {@see SimplePie::set_restriction_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Restriction\n{\n\t/**\n\t * Relationship ('allow'/'deny')\n\t *\n\t * @var string\n\t * @see get_relationship()\n\t */\n\tvar $relationship;\n\n\t/**\n\t * Type of restriction\n\t *\n\t * @var string\n\t * @see get_type()\n\t */\n\tvar $type;\n\n\t/**\n\t * Restricted values\n\t *\n\t * @var string\n\t * @see get_value()\n\t */\n\tvar $value;\n\n\t/**\n\t * Constructor, used to input the data\n\t *\n\t * For documentation on all the parameters, see the corresponding\n\t * properties and their accessors\n\t */\n\tpublic function __construct($relationship = null, $type = null, $value = null)\n\t{\n\t\t$this->relationship = $relationship;\n\t\t$this->type = $type;\n\t\t$this->value = $value;\n\t}\n\n\t/**\n\t * String-ified version\n\t *\n\t * @return string\n\t */\n\tpublic function __toString()\n\t{\n\t\t// There is no $this->data here\n\t\treturn md5(serialize($this));\n\t}\n\n\t/**\n\t * Get the relationship\n\t *\n\t * @return string|null Either 'allow' or 'deny'\n\t */\n\tpublic function get_relationship()\n\t{\n\t\tif ($this->relationship !== null)\n\t\t{\n\t\t\treturn $this->relationship;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the type\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_type()\n\t{\n\t\tif ($this->type !== null)\n\t\t{\n\t\t\treturn $this->type;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the list of restricted things\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_value()\n\t{\n\t\tif ($this->value !== null)\n\t\t{\n\t\t\treturn $this->value;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Sanitize.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Used for data cleanup and post-processing\n *\n *\n * This class can be overloaded with {@see SimplePie::set_sanitize_class()}\n *\n * @package SimplePie\n * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags\n */\nclass SimplePie_Sanitize\n{\n\t// Private vars\n\tvar $base;\n\n\t// Options\n\tvar $remove_div = true;\n\tvar $image_handler = '';\n\tvar $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');\n\tvar $encode_instead_of_strip = false;\n\tvar $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');\n\tvar $strip_comments = false;\n\tvar $output_encoding = 'UTF-8';\n\tvar $enable_cache = true;\n\tvar $cache_location = './cache';\n\tvar $cache_name_function = 'md5';\n\tvar $timeout = 10;\n\tvar $useragent = '';\n\tvar $force_fsockopen = false;\n\tvar $replace_url_attributes = null;\n\n\tpublic function __construct()\n\t{\n\t\t// Set defaults\n\t\t$this->set_url_replacements(null);\n\t}\n\n\tpublic function remove_div($enable = true)\n\t{\n\t\t$this->remove_div = (bool) $enable;\n\t}\n\n\tpublic function set_image_handler($page = false)\n\t{\n\t\tif ($page)\n\t\t{\n\t\t\t$this->image_handler = (string) $page;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->image_handler = false;\n\t\t}\n\t}\n\n\tpublic function set_registry(SimplePie_Registry $registry)\n\t{\n\t\t$this->registry = $registry;\n\t}\n\n\tpublic function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache')\n\t{\n\t\tif (isset($enable_cache))\n\t\t{\n\t\t\t$this->enable_cache = (bool) $enable_cache;\n\t\t}\n\n\t\tif ($cache_location)\n\t\t{\n\t\t\t$this->cache_location = (string) $cache_location;\n\t\t}\n\n\t\tif ($cache_name_function)\n\t\t{\n\t\t\t$this->cache_name_function = (string) $cache_name_function;\n\t\t}\n\t}\n\n\tpublic function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false)\n\t{\n\t\tif ($timeout)\n\t\t{\n\t\t\t$this->timeout = (string) $timeout;\n\t\t}\n\n\t\tif ($useragent)\n\t\t{\n\t\t\t$this->useragent = (string) $useragent;\n\t\t}\n\n\t\tif ($force_fsockopen)\n\t\t{\n\t\t\t$this->force_fsockopen = (string) $force_fsockopen;\n\t\t}\n\t}\n\n\tpublic function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))\n\t{\n\t\tif ($tags)\n\t\t{\n\t\t\tif (is_array($tags))\n\t\t\t{\n\t\t\t\t$this->strip_htmltags = $tags;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->strip_htmltags = explode(',', $tags);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->strip_htmltags = false;\n\t\t}\n\t}\n\n\tpublic function encode_instead_of_strip($encode = false)\n\t{\n\t\t$this->encode_instead_of_strip = (bool) $encode;\n\t}\n\n\tpublic function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))\n\t{\n\t\tif ($attribs)\n\t\t{\n\t\t\tif (is_array($attribs))\n\t\t\t{\n\t\t\t\t$this->strip_attributes = $attribs;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->strip_attributes = explode(',', $attribs);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->strip_attributes = false;\n\t\t}\n\t}\n\n\tpublic function strip_comments($strip = false)\n\t{\n\t\t$this->strip_comments = (bool) $strip;\n\t}\n\n\tpublic function set_output_encoding($encoding = 'UTF-8')\n\t{\n\t\t$this->output_encoding = (string) $encoding;\n\t}\n\n\t/**\n\t * Set element/attribute key/value pairs of HTML attributes\n\t * containing URLs that need to be resolved relative to the feed\n\t *\n\t * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite,\n\t * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite,\n\t * |q|@cite\n\t *\n\t * @since 1.0\n\t * @param array|null $element_attribute Element/attribute key/value pairs, null for default\n\t */\n\tpublic function set_url_replacements($element_attribute = null)\n\t{\n\t\tif ($element_attribute === null)\n\t\t{\n\t\t\t$element_attribute = array(\n\t\t\t\t'a' => 'href',\n\t\t\t\t'area' => 'href',\n\t\t\t\t'blockquote' => 'cite',\n\t\t\t\t'del' => 'cite',\n\t\t\t\t'form' => 'action',\n\t\t\t\t'img' => array(\n\t\t\t\t\t'longdesc',\n\t\t\t\t\t'src'\n\t\t\t\t),\n\t\t\t\t'input' => 'src',\n\t\t\t\t'ins' => 'cite',\n\t\t\t\t'q' => 'cite'\n\t\t\t);\n\t\t}\n\t\t$this->replace_url_attributes = (array) $element_attribute;\n\t}\n\n\tpublic function sanitize($data, $type, $base = '')\n\t{\n\t\t$data = trim($data);\n\t\tif ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI)\n\t\t{\n\t\t\tif ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML)\n\t\t\t{\n\t\t\t\tif (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\\/[A-Za-z][^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x2F\\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data))\n\t\t\t\t{\n\t\t\t\t\t$type |= SIMPLEPIE_CONSTRUCT_HTML;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$type |= SIMPLEPIE_CONSTRUCT_TEXT;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($type & SIMPLEPIE_CONSTRUCT_BASE64)\n\t\t\t{\n\t\t\t\t$data = base64_decode($data);\n\t\t\t}\n\n\t\t\tif ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML))\n\t\t\t{\n\n\t\t\t\tif (!class_exists('DOMDocument'))\n\t\t\t\t{\n\t\t\t\t\t$this->registry->call('Misc', 'error', array('DOMDocument not found, unable to use sanitizer', E_USER_WARNING, __FILE__, __LINE__));\n\t\t\t\t\treturn '';\n\t\t\t\t}\n\t\t\t\t$document = new DOMDocument();\n\t\t\t\t$document->encoding = 'UTF-8';\n\t\t\t\t$data = $this->preprocess($data, $type);\n\n\t\t\t\tset_error_handler(array('SimplePie_Misc', 'silence_errors'));\n\t\t\t\t$document->loadHTML($data);\n\t\t\t\trestore_error_handler();\n\n\t\t\t\t// Strip comments\n\t\t\t\tif ($this->strip_comments)\n\t\t\t\t{\n\t\t\t\t\t$xpath = new DOMXPath($document);\n\t\t\t\t\t$comments = $xpath->query('//comment()');\n\n\t\t\t\t\tforeach ($comments as $comment)\n\t\t\t\t\t{\n\t\t\t\t\t\t$comment->parentNode->removeChild($comment);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Strip out HTML tags and attributes that might cause various security problems.\n\t\t\t\t// Based on recommendations by Mark Pilgrim at:\n\t\t\t\t// http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely\n\t\t\t\tif ($this->strip_htmltags)\n\t\t\t\t{\n\t\t\t\t\tforeach ($this->strip_htmltags as $tag)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->strip_tag($tag, $document, $type);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ($this->strip_attributes)\n\t\t\t\t{\n\t\t\t\t\tforeach ($this->strip_attributes as $attrib)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->strip_attr($attrib, $document);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Replace relative URLs\n\t\t\t\t$this->base = $base;\n\t\t\t\tforeach ($this->replace_url_attributes as $element => $attributes)\n\t\t\t\t{\n\t\t\t\t\t$this->replace_urls($document, $element, $attributes);\n\t\t\t\t}\n\n\t\t\t\t// If image handling (caching, etc.) is enabled, cache and rewrite all the image tags.\n\t\t\t\tif (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache)\n\t\t\t\t{\n\t\t\t\t\t$images = $document->getElementsByTagName('img');\n\t\t\t\t\tforeach ($images as $img)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ($img->hasAttribute('src'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$image_url = call_user_func($this->cache_name_function, $img->getAttribute('src'));\n\t\t\t\t\t\t\t$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi'));\n\n\t\t\t\t\t\t\tif ($cache->load())\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$img->setAttribute('src', $this->image_handler . $image_url);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$file = $this->registry->create('File', array($img->getAttribute('src'), $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen));\n\t\t\t\t\t\t\t\t$headers = $file->headers;\n\n\t\t\t\t\t\t\t\tif ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t$img->setAttribute('src', $this->image_handler . $image_url);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttrigger_error(\"$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.\", E_USER_WARNING);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Remove the DOCTYPE\n\t\t\t\t// Seems to cause segfaulting if we don't do this\n\t\t\t\tif ($document->firstChild instanceof DOMDocumentType)\n\t\t\t\t{\n\t\t\t\t\t$document->removeChild($document->firstChild);\n\t\t\t\t}\n\n\t\t\t\t// Move everything from the body to the root\n\t\t\t\t$real_body = $document->getElementsByTagName('body')->item(0)->childNodes->item(0);\n\t\t\t\t$document->replaceChild($real_body, $document->firstChild);\n\n\t\t\t\t// Finally, convert to a HTML string\n\t\t\t\t$data = trim($document->saveHTML());\n\n\t\t\t\tif ($this->remove_div)\n\t\t\t\t{\n\t\t\t\t\t$data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data);\n\t\t\t\t\t$data = preg_replace('/<\\/div>$/', '', $data);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($type & SIMPLEPIE_CONSTRUCT_IRI)\n\t\t\t{\n\t\t\t\t$absolute = $this->registry->call('Misc', 'absolutize_url', array($data, $base));\n\t\t\t\tif ($absolute !== false)\n\t\t\t\t{\n\t\t\t\t\t$data = $absolute;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI))\n\t\t\t{\n\t\t\t\t$data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');\n\t\t\t}\n\n\t\t\tif ($this->output_encoding !== 'UTF-8')\n\t\t\t{\n\t\t\t\t$data = $this->registry->call('Misc', 'change_encoding', array($data, 'UTF-8', $this->output_encoding));\n\t\t\t}\n\t\t}\n\t\treturn $data;\n\t}\n\n\tprotected function preprocess($html, $type)\n\t{\n\t\t$ret = '';\n\t\tif ($type & ~SIMPLEPIE_CONSTRUCT_XHTML)\n\t\t{\n\t\t\t// Atom XHTML constructs are wrapped with a div by default\n\t\t\t// Note: No protection if $html contains a stray </div>!\n\t\t\t$html = '<div>' . $html . '</div>';\n\t\t\t$ret .= '<!DOCTYPE html>';\n\t\t\t$content_type = 'text/html';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$ret .= '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">';\n\t\t\t$content_type = 'application/xhtml+xml';\n\t\t}\n\n\t\t$ret .= '<html><head>';\n\t\t$ret .= '<meta http-equiv=\"Content-Type\" content=\"' . $content_type . '; charset=utf-8\" />';\n\t\t$ret .= '</head><body>' . $html . '</body></html>';\n\t\treturn $ret;\n\t}\n\n\tpublic function replace_urls($document, $tag, $attributes)\n\t{\n\t\tif (!is_array($attributes))\n\t\t{\n\t\t\t$attributes = array($attributes);\n\t\t}\n\n\t\tif (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags))\n\t\t{\n\t\t\t$elements = $document->getElementsByTagName($tag);\n\t\t\tforeach ($elements as $element)\n\t\t\t{\n\t\t\t\tforeach ($attributes as $attribute)\n\t\t\t\t{\n\t\t\t\t\tif ($element->hasAttribute($attribute))\n\t\t\t\t\t{\n\t\t\t\t\t\t$value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base));\n\t\t\t\t\t\tif ($value !== false)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$element->setAttribute($attribute, $value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic function do_strip_htmltags($match)\n\t{\n\t\tif ($this->encode_instead_of_strip)\n\t\t{\n\t\t\tif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))\n\t\t\t{\n\t\t\t\t$match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8');\n\t\t\t\t$match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8');\n\t\t\t\treturn \"&lt;$match[1]$match[2]&gt;$match[3]&lt;/$match[1]&gt;\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8');\n\t\t\t}\n\t\t}\n\t\telseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))\n\t\t{\n\t\t\treturn $match[4];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn '';\n\t\t}\n\t}\n\n\tprotected function strip_tag($tag, $document, $type)\n\t{\n\t\t$xpath = new DOMXPath($document);\n\t\t$elements = $xpath->query('body//' . $tag);\n\t\tif ($this->encode_instead_of_strip)\n\t\t{\n\t\t\tforeach ($elements as $element)\n\t\t\t{\n\t\t\t\t$fragment = $document->createDocumentFragment();\n\n\t\t\t\t// For elements which aren't script or style, include the tag itself\n\t\t\t\tif (!in_array($tag, array('script', 'style')))\n\t\t\t\t{\n\t\t\t\t\t$text = '<' . $tag;\n\t\t\t\t\tif ($element->hasAttributes())\n\t\t\t\t\t{\n\t\t\t\t\t\t$attrs = array();\n\t\t\t\t\t\tforeach ($element->attributes as $name => $attr)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$value = $attr->value;\n\n\t\t\t\t\t\t\t// In XHTML, empty values should never exist, so we repeat the value\n\t\t\t\t\t\t\tif (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_XHTML))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$value = $name;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// For HTML, empty is fine\n\t\t\t\t\t\t\telseif (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_HTML))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$attrs[] = $name;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Standard attribute text\n\t\t\t\t\t\t\t$attrs[] = $name . '=\"' . $attr->value . '\"';\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$text .= ' ' . implode(' ', $attrs);\n\t\t\t\t\t}\n\t\t\t\t\t$text .= '>';\n\t\t\t\t\t$fragment->appendChild(new DOMText($text));\n\t\t\t\t}\n\n\t\t\t\t$number = $element->childNodes->length;\n\t\t\t\tfor ($i = $number; $i > 0; $i--)\n\t\t\t\t{\n\t\t\t\t\t$child = $element->childNodes->item(0);\n\t\t\t\t\t$fragment->appendChild($child);\n\t\t\t\t}\n\n\t\t\t\tif (!in_array($tag, array('script', 'style')))\n\t\t\t\t{\n\t\t\t\t\t$fragment->appendChild(new DOMText('</' . $tag . '>'));\n\t\t\t\t}\n\n\t\t\t\t$element->parentNode->replaceChild($fragment, $element);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telseif (in_array($tag, array('script', 'style')))\n\t\t{\n\t\t\tforeach ($elements as $element)\n\t\t\t{\n\t\t\t\t$element->parentNode->removeChild($element);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforeach ($elements as $element)\n\t\t\t{\n\t\t\t\t$fragment = $document->createDocumentFragment();\n\t\t\t\t$number = $element->childNodes->length;\n\t\t\t\tfor ($i = $number; $i > 0; $i--)\n\t\t\t\t{\n\t\t\t\t\t$child = $element->childNodes->item(0);\n\t\t\t\t\t$fragment->appendChild($child);\n\t\t\t\t}\n\n\t\t\t\t$element->parentNode->replaceChild($fragment, $element);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected function strip_attr($attrib, $document)\n\t{\n\t\t$xpath = new DOMXPath($document);\n\t\t$elements = $xpath->query('//*[@' . $attrib . ']');\n\n\t\tforeach ($elements as $element)\n\t\t{\n\t\t\t$element->removeAttribute($attrib);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/Source.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * Handles `<atom:source>`\n *\n * Used by {@see SimplePie_Item::get_source()}\n *\n * This class can be overloaded with {@see SimplePie::set_source_class()}\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie_Source\n{\n\tvar $item;\n\tvar $data = array();\n\tprotected $registry;\n\n\tpublic function __construct($item, $data)\n\t{\n\t\t$this->item = $item;\n\t\t$this->data = $data;\n\t}\n\n\tpublic function set_registry(SimplePie_Registry $registry)\n\t{\n\t\t$this->registry = $registry;\n\t}\n\n\tpublic function __toString()\n\t{\n\t\treturn md5(serialize($this->data));\n\t}\n\n\tpublic function get_source_tags($namespace, $tag)\n\t{\n\t\tif (isset($this->data['child'][$namespace][$tag]))\n\t\t{\n\t\t\treturn $this->data['child'][$namespace][$tag];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_base($element = array())\n\t{\n\t\treturn $this->item->get_base($element);\n\t}\n\n\tpublic function sanitize($data, $type, $base = '')\n\t{\n\t\treturn $this->item->sanitize($data, $type, $base);\n\t}\n\n\tpublic function get_item()\n\t{\n\t\treturn $this->item;\n\t}\n\n\tpublic function get_title()\n\t{\n\t\tif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_category($key = 0)\n\t{\n\t\t$categories = $this->get_categories();\n\t\tif (isset($categories[$key]))\n\t\t{\n\t\t\treturn $categories[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_categories()\n\t{\n\t\t$categories = array();\n\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)\n\t\t{\n\t\t\t$term = null;\n\t\t\t$scheme = null;\n\t\t\t$label = null;\n\t\t\tif (isset($category['attribs']['']['term']))\n\t\t\t{\n\t\t\t\t$term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($category['attribs']['']['scheme']))\n\t\t\t{\n\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($category['attribs']['']['label']))\n\t\t\t{\n\t\t\t\t$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t}\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)\n\t\t{\n\t\t\t// This is really the label, but keep this as the term also for BC.\n\t\t\t// Label will also work on retrieving because that falls back to term.\n\t\t\t$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\tif (isset($category['attribs']['']['domain']))\n\t\t\t{\n\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$scheme = null;\n\t\t\t}\n\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, null));\n\t\t}\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)\n\t\t{\n\t\t\t$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)\n\t\t{\n\t\t\t$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\n\t\tif (!empty($categories))\n\t\t{\n\t\t\treturn array_unique($categories);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_author($key = 0)\n\t{\n\t\t$authors = $this->get_authors();\n\t\tif (isset($authors[$key]))\n\t\t{\n\t\t\treturn $authors[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_authors()\n\t{\n\t\t$authors = array();\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$uri = null;\n\t\t\t$email = null;\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))\n\t\t\t{\n\t\t\t\t$uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));\n\t\t\t}\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $uri !== null)\n\t\t\t{\n\t\t\t\t$authors[] = $this->registry->create('Author', array($name, $uri, $email));\n\t\t\t}\n\t\t}\n\t\tif ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))\n\t\t{\n\t\t\t$name = null;\n\t\t\t$url = null;\n\t\t\t$email = null;\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))\n\t\t\t{\n\t\t\t\t$url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));\n\t\t\t}\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $url !== null)\n\t\t\t{\n\t\t\t\t$authors[] = $this->registry->create('Author', array($name, $url, $email));\n\t\t\t}\n\t\t}\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\n\t\tif (!empty($authors))\n\t\t{\n\t\t\treturn array_unique($authors);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_contributor($key = 0)\n\t{\n\t\t$contributors = $this->get_contributors();\n\t\tif (isset($contributors[$key]))\n\t\t{\n\t\t\treturn $contributors[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_contributors()\n\t{\n\t\t$contributors = array();\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$uri = null;\n\t\t\t$email = null;\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))\n\t\t\t{\n\t\t\t\t$uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $uri !== null)\n\t\t\t{\n\t\t\t\t$contributors[] = $this->registry->create('Author', array($name, $uri, $email));\n\t\t\t}\n\t\t}\n\t\tforeach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$url = null;\n\t\t\t$email = null;\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))\n\t\t\t{\n\t\t\t\t$url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $url !== null)\n\t\t\t{\n\t\t\t\t$contributors[] = $this->registry->create('Author', array($name, $url, $email));\n\t\t\t}\n\t\t}\n\n\t\tif (!empty($contributors))\n\t\t{\n\t\t\treturn array_unique($contributors);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_link($key = 0, $rel = 'alternate')\n\t{\n\t\t$links = $this->get_links($rel);\n\t\tif (isset($links[$key]))\n\t\t{\n\t\t\treturn $links[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Added for parity between the parent-level and the item/entry-level.\n\t */\n\tpublic function get_permalink()\n\t{\n\t\treturn $this->get_link(0);\n\t}\n\n\tpublic function get_links($rel = 'alternate')\n\t{\n\t\tif (!isset($this->data['links']))\n\t\t{\n\t\t\t$this->data['links'] = array();\n\t\t\tif ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))\n\t\t\t{\n\t\t\t\tforeach ($links as $link)\n\t\t\t\t{\n\t\t\t\t\tif (isset($link['attribs']['']['href']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';\n\t\t\t\t\t\t$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))\n\t\t\t{\n\t\t\t\tforeach ($links as $link)\n\t\t\t\t{\n\t\t\t\t\tif (isset($link['attribs']['']['href']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';\n\t\t\t\t\t\t$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\t\t\tif ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\t\t\tif ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\n\t\t\t$keys = array_keys($this->data['links']);\n\t\t\tforeach ($keys as $key)\n\t\t\t{\n\t\t\t\tif ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))\n\t\t\t\t{\n\t\t\t\t\tif (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);\n\t\t\t\t\t\t$this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)\n\t\t\t\t{\n\t\t\t\t\t$this->data['links'][substr($key, 41)] =& $this->data['links'][$key];\n\t\t\t\t}\n\t\t\t\t$this->data['links'][$key] = array_unique($this->data['links'][$key]);\n\t\t\t}\n\t\t}\n\n\t\tif (isset($this->data['links'][$rel]))\n\t\t{\n\t\t\treturn $this->data['links'][$rel];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_description()\n\t{\n\t\tif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_copyright()\n\t{\n\t\tif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_language()\n\t{\n\t\tif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif (isset($this->data['xml_lang']))\n\t\t{\n\t\t\treturn $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_latitude()\n\t{\n\t\tif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\\.[0-9]+)) ((?:-)?[0-9]+(?:\\.[0-9]+))$/', trim($return[0]['data']), $match))\n\t\t{\n\t\t\treturn (float) $match[1];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_longitude()\n\t{\n\t\tif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\\.[0-9]+)) ((?:-)?[0-9]+(?:\\.[0-9]+))$/', trim($return[0]['data']), $match))\n\t\t{\n\t\t\treturn (float) $match[2];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_image_url()\n\t{\n\t\tif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/XML/Declaration/Parser.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * Parses the XML Declaration\n *\n * @package SimplePie\n * @subpackage Parsing\n */\nclass SimplePie_XML_Declaration_Parser\n{\n\t/**\n\t * XML Version\n\t *\n\t * @access public\n\t * @var string\n\t */\n\tvar $version = '1.0';\n\n\t/**\n\t * Encoding\n\t *\n\t * @access public\n\t * @var string\n\t */\n\tvar $encoding = 'UTF-8';\n\n\t/**\n\t * Standalone\n\t *\n\t * @access public\n\t * @var bool\n\t */\n\tvar $standalone = false;\n\n\t/**\n\t * Current state of the state machine\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tvar $state = 'before_version_name';\n\n\t/**\n\t * Input data\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tvar $data = '';\n\n\t/**\n\t * Input data length (to avoid calling strlen() everytime this is needed)\n\t *\n\t * @access private\n\t * @var int\n\t */\n\tvar $data_length = 0;\n\n\t/**\n\t * Current position of the pointer\n\t *\n\t * @var int\n\t * @access private\n\t */\n\tvar $position = 0;\n\n\t/**\n\t * Create an instance of the class with the input data\n\t *\n\t * @access public\n\t * @param string $data Input data\n\t */\n\tpublic function __construct($data)\n\t{\n\t\t$this->data = $data;\n\t\t$this->data_length = strlen($this->data);\n\t}\n\n\t/**\n\t * Parse the input data\n\t *\n\t * @access public\n\t * @return bool true on success, false on failure\n\t */\n\tpublic function parse()\n\t{\n\t\twhile ($this->state && $this->state !== 'emit' && $this->has_data())\n\t\t{\n\t\t\t$state = $this->state;\n\t\t\t$this->$state();\n\t\t}\n\t\t$this->data = '';\n\t\tif ($this->state === 'emit')\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->version = '';\n\t\t\t$this->encoding = '';\n\t\t\t$this->standalone = '';\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Check whether there is data beyond the pointer\n\t *\n\t * @access private\n\t * @return bool true if there is further data, false if not\n\t */\n\tpublic function has_data()\n\t{\n\t\treturn (bool) ($this->position < $this->data_length);\n\t}\n\n\t/**\n\t * Advance past any whitespace\n\t *\n\t * @return int Number of whitespace characters passed\n\t */\n\tpublic function skip_whitespace()\n\t{\n\t\t$whitespace = strspn($this->data, \"\\x09\\x0A\\x0D\\x20\", $this->position);\n\t\t$this->position += $whitespace;\n\t\treturn $whitespace;\n\t}\n\n\t/**\n\t * Read value\n\t */\n\tpublic function get_value()\n\t{\n\t\t$quote = substr($this->data, $this->position, 1);\n\t\tif ($quote === '\"' || $quote === \"'\")\n\t\t{\n\t\t\t$this->position++;\n\t\t\t$len = strcspn($this->data, $quote, $this->position);\n\t\t\tif ($this->has_data())\n\t\t\t{\n\t\t\t\t$value = substr($this->data, $this->position, $len);\n\t\t\t\t$this->position += $len + 1;\n\t\t\t\treturn $value;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic function before_version_name()\n\t{\n\t\tif ($this->skip_whitespace())\n\t\t{\n\t\t\t$this->state = 'version_name';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\tpublic function version_name()\n\t{\n\t\tif (substr($this->data, $this->position, 7) === 'version')\n\t\t{\n\t\t\t$this->position += 7;\n\t\t\t$this->skip_whitespace();\n\t\t\t$this->state = 'version_equals';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\tpublic function version_equals()\n\t{\n\t\tif (substr($this->data, $this->position, 1) === '=')\n\t\t{\n\t\t\t$this->position++;\n\t\t\t$this->skip_whitespace();\n\t\t\t$this->state = 'version_value';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\tpublic function version_value()\n\t{\n\t\tif ($this->version = $this->get_value())\n\t\t{\n\t\t\t$this->skip_whitespace();\n\t\t\tif ($this->has_data())\n\t\t\t{\n\t\t\t\t$this->state = 'encoding_name';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->state = 'emit';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\tpublic function encoding_name()\n\t{\n\t\tif (substr($this->data, $this->position, 8) === 'encoding')\n\t\t{\n\t\t\t$this->position += 8;\n\t\t\t$this->skip_whitespace();\n\t\t\t$this->state = 'encoding_equals';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = 'standalone_name';\n\t\t}\n\t}\n\n\tpublic function encoding_equals()\n\t{\n\t\tif (substr($this->data, $this->position, 1) === '=')\n\t\t{\n\t\t\t$this->position++;\n\t\t\t$this->skip_whitespace();\n\t\t\t$this->state = 'encoding_value';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\tpublic function encoding_value()\n\t{\n\t\tif ($this->encoding = $this->get_value())\n\t\t{\n\t\t\t$this->skip_whitespace();\n\t\t\tif ($this->has_data())\n\t\t\t{\n\t\t\t\t$this->state = 'standalone_name';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->state = 'emit';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\tpublic function standalone_name()\n\t{\n\t\tif (substr($this->data, $this->position, 10) === 'standalone')\n\t\t{\n\t\t\t$this->position += 10;\n\t\t\t$this->skip_whitespace();\n\t\t\t$this->state = 'standalone_equals';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\tpublic function standalone_equals()\n\t{\n\t\tif (substr($this->data, $this->position, 1) === '=')\n\t\t{\n\t\t\t$this->position++;\n\t\t\t$this->skip_whitespace();\n\t\t\t$this->state = 'standalone_value';\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n\n\tpublic function standalone_value()\n\t{\n\t\tif ($standalone = $this->get_value())\n\t\t{\n\t\t\tswitch ($standalone)\n\t\t\t{\n\t\t\t\tcase 'yes':\n\t\t\t\t\t$this->standalone = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'no':\n\t\t\t\t\t$this->standalone = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$this->state = false;\n\t\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$this->skip_whitespace();\n\t\t\tif ($this->has_data())\n\t\t\t{\n\t\t\t\t$this->state = false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->state = 'emit';\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->state = false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/SimplePie/gzdecode.php",
    "content": "<?php\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n\n/**\n * Decode 'gzip' encoded HTTP data\n *\n * @package SimplePie\n * @subpackage HTTP\n * @link http://www.gzip.org/format.txt\n */\nclass SimplePie_gzdecode\n{\n\t/**\n\t * Compressed data\n\t *\n\t * @access private\n\t * @var string\n\t * @see gzdecode::$data\n\t */\n\tvar $compressed_data;\n\n\t/**\n\t * Size of compressed data\n\t *\n\t * @access private\n\t * @var int\n\t */\n\tvar $compressed_size;\n\n\t/**\n\t * Minimum size of a valid gzip string\n\t *\n\t * @access private\n\t * @var int\n\t */\n\tvar $min_compressed_size = 18;\n\n\t/**\n\t * Current position of pointer\n\t *\n\t * @access private\n\t * @var int\n\t */\n\tvar $position = 0;\n\n\t/**\n\t * Flags (FLG)\n\t *\n\t * @access private\n\t * @var int\n\t */\n\tvar $flags;\n\n\t/**\n\t * Uncompressed data\n\t *\n\t * @access public\n\t * @see gzdecode::$compressed_data\n\t * @var string\n\t */\n\tvar $data;\n\n\t/**\n\t * Modified time\n\t *\n\t * @access public\n\t * @var int\n\t */\n\tvar $MTIME;\n\n\t/**\n\t * Extra Flags\n\t *\n\t * @access public\n\t * @var int\n\t */\n\tvar $XFL;\n\n\t/**\n\t * Operating System\n\t *\n\t * @access public\n\t * @var int\n\t */\n\tvar $OS;\n\n\t/**\n\t * Subfield ID 1\n\t *\n\t * @access public\n\t * @see gzdecode::$extra_field\n\t * @see gzdecode::$SI2\n\t * @var string\n\t */\n\tvar $SI1;\n\n\t/**\n\t * Subfield ID 2\n\t *\n\t * @access public\n\t * @see gzdecode::$extra_field\n\t * @see gzdecode::$SI1\n\t * @var string\n\t */\n\tvar $SI2;\n\n\t/**\n\t * Extra field content\n\t *\n\t * @access public\n\t * @see gzdecode::$SI1\n\t * @see gzdecode::$SI2\n\t * @var string\n\t */\n\tvar $extra_field;\n\n\t/**\n\t * Original filename\n\t *\n\t * @access public\n\t * @var string\n\t */\n\tvar $filename;\n\n\t/**\n\t * Human readable comment\n\t *\n\t * @access public\n\t * @var string\n\t */\n\tvar $comment;\n\n\t/**\n\t * Don't allow anything to be set\n\t *\n\t * @param string $name\n\t * @param mixed $value\n\t */\n\tpublic function __set($name, $value)\n\t{\n\t\ttrigger_error(\"Cannot write property $name\", E_USER_ERROR);\n\t}\n\n\t/**\n\t * Set the compressed string and related properties\n\t *\n\t * @param string $data\n\t */\n\tpublic function __construct($data)\n\t{\n\t\t$this->compressed_data = $data;\n\t\t$this->compressed_size = strlen($data);\n\t}\n\n\t/**\n\t * Decode the GZIP stream\n\t *\n\t * @return bool Successfulness\n\t */\n\tpublic function parse()\n\t{\n\t\tif ($this->compressed_size >= $this->min_compressed_size)\n\t\t{\n\t\t\t// Check ID1, ID2, and CM\n\t\t\tif (substr($this->compressed_data, 0, 3) !== \"\\x1F\\x8B\\x08\")\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Get the FLG (FLaGs)\n\t\t\t$this->flags = ord($this->compressed_data[3]);\n\n\t\t\t// FLG bits above (1 << 4) are reserved\n\t\t\tif ($this->flags > 0x1F)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Advance the pointer after the above\n\t\t\t$this->position += 4;\n\n\t\t\t// MTIME\n\t\t\t$mtime = substr($this->compressed_data, $this->position, 4);\n\t\t\t// Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness\n\t\t\tif (current(unpack('S', \"\\x00\\x01\")) === 1)\n\t\t\t{\n\t\t\t\t$mtime = strrev($mtime);\n\t\t\t}\n\t\t\t$this->MTIME = current(unpack('l', $mtime));\n\t\t\t$this->position += 4;\n\n\t\t\t// Get the XFL (eXtra FLags)\n\t\t\t$this->XFL = ord($this->compressed_data[$this->position++]);\n\n\t\t\t// Get the OS (Operating System)\n\t\t\t$this->OS = ord($this->compressed_data[$this->position++]);\n\n\t\t\t// Parse the FEXTRA\n\t\t\tif ($this->flags & 4)\n\t\t\t{\n\t\t\t\t// Read subfield IDs\n\t\t\t\t$this->SI1 = $this->compressed_data[$this->position++];\n\t\t\t\t$this->SI2 = $this->compressed_data[$this->position++];\n\n\t\t\t\t// SI2 set to zero is reserved for future use\n\t\t\t\tif ($this->SI2 === \"\\x00\")\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Get the length of the extra field\n\t\t\t\t$len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));\n\t\t\t\t$this->position += 2;\n\n\t\t\t\t// Check the length of the string is still valid\n\t\t\t\t$this->min_compressed_size += $len + 4;\n\t\t\t\tif ($this->compressed_size >= $this->min_compressed_size)\n\t\t\t\t{\n\t\t\t\t\t// Set the extra field to the given data\n\t\t\t\t\t$this->extra_field = substr($this->compressed_data, $this->position, $len);\n\t\t\t\t\t$this->position += $len;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Parse the FNAME\n\t\t\tif ($this->flags & 8)\n\t\t\t{\n\t\t\t\t// Get the length of the filename\n\t\t\t\t$len = strcspn($this->compressed_data, \"\\x00\", $this->position);\n\n\t\t\t\t// Check the length of the string is still valid\n\t\t\t\t$this->min_compressed_size += $len + 1;\n\t\t\t\tif ($this->compressed_size >= $this->min_compressed_size)\n\t\t\t\t{\n\t\t\t\t\t// Set the original filename to the given string\n\t\t\t\t\t$this->filename = substr($this->compressed_data, $this->position, $len);\n\t\t\t\t\t$this->position += $len + 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Parse the FCOMMENT\n\t\t\tif ($this->flags & 16)\n\t\t\t{\n\t\t\t\t// Get the length of the comment\n\t\t\t\t$len = strcspn($this->compressed_data, \"\\x00\", $this->position);\n\n\t\t\t\t// Check the length of the string is still valid\n\t\t\t\t$this->min_compressed_size += $len + 1;\n\t\t\t\tif ($this->compressed_size >= $this->min_compressed_size)\n\t\t\t\t{\n\t\t\t\t\t// Set the original comment to the given string\n\t\t\t\t\t$this->comment = substr($this->compressed_data, $this->position, $len);\n\t\t\t\t\t$this->position += $len + 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Parse the FHCRC\n\t\t\tif ($this->flags & 2)\n\t\t\t{\n\t\t\t\t// Check the length of the string is still valid\n\t\t\t\t$this->min_compressed_size += $len + 2;\n\t\t\t\tif ($this->compressed_size >= $this->min_compressed_size)\n\t\t\t\t{\n\t\t\t\t\t// Read the CRC\n\t\t\t\t\t$crc = current(unpack('v', substr($this->compressed_data, $this->position, 2)));\n\n\t\t\t\t\t// Check the CRC matches\n\t\t\t\t\tif ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->position += 2;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Decompress the actual data\n\t\t\tif (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->position = $this->compressed_size - 8;\n\t\t\t}\n\n\t\t\t// Check CRC of data\n\t\t\t$crc = current(unpack('V', substr($this->compressed_data, $this->position, 4)));\n\t\t\t$this->position += 4;\n\t\t\t/*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}*/\n\n\t\t\t// Check ISIZE of data\n\t\t\t$isize = current(unpack('V', substr($this->compressed_data, $this->position, 4)));\n\t\t\t$this->position += 4;\n\t\t\tif (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Wow, against all odds, we've actually got a valid gzip string\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/Text/Diff/Engine/native.php",
    "content": "<?php\n/**\n * Class used internally by Text_Diff to actually compute the diffs.\n *\n * This class is implemented using native PHP code.\n *\n * The algorithm used here is mostly lifted from the perl module\n * Algorithm::Diff (version 1.06) by Ned Konz, which is available at:\n * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip\n *\n * More ideas are taken from: http://www.ics.uci.edu/~eppstein/161/960229.html\n *\n * Some ideas (and a bit of code) are taken from analyze.c, of GNU\n * diffutils-2.7, which can be found at:\n * ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz\n *\n * Some ideas (subdivision by NCHUNKS > 2, and some optimizations) are from\n * Geoffrey T. Dairiki <dairiki@dairiki.org>. The original PHP version of this\n * code was written by him, and is used/adapted with his permission.\n *\n * Copyright 2004-2010 The Horde Project (http://www.horde.org/)\n *\n * See the enclosed file COPYING for license information (LGPL). If you did\n * not receive this file, see http://opensource.org/licenses/lgpl-license.php.\n *\n * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>\n * @package Text_Diff\n */\nclass Text_Diff_Engine_native {\n\n    function diff($from_lines, $to_lines)\n    {\n        array_walk($from_lines, array('Text_Diff', 'trimNewlines'));\n        array_walk($to_lines, array('Text_Diff', 'trimNewlines'));\n\n        $n_from = count($from_lines);\n        $n_to = count($to_lines);\n\n        $this->xchanged = $this->ychanged = array();\n        $this->xv = $this->yv = array();\n        $this->xind = $this->yind = array();\n        unset($this->seq);\n        unset($this->in_seq);\n        unset($this->lcs);\n\n        // Skip leading common lines.\n        for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) {\n            if ($from_lines[$skip] !== $to_lines[$skip]) {\n                break;\n            }\n            $this->xchanged[$skip] = $this->ychanged[$skip] = false;\n        }\n\n        // Skip trailing common lines.\n        $xi = $n_from; $yi = $n_to;\n        for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) {\n            if ($from_lines[$xi] !== $to_lines[$yi]) {\n                break;\n            }\n            $this->xchanged[$xi] = $this->ychanged[$yi] = false;\n        }\n\n        // Ignore lines which do not exist in both files.\n        for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {\n            $xhash[$from_lines[$xi]] = 1;\n        }\n        for ($yi = $skip; $yi < $n_to - $endskip; $yi++) {\n            $line = $to_lines[$yi];\n            if (($this->ychanged[$yi] = empty($xhash[$line]))) {\n                continue;\n            }\n            $yhash[$line] = 1;\n            $this->yv[] = $line;\n            $this->yind[] = $yi;\n        }\n        for ($xi = $skip; $xi < $n_from - $endskip; $xi++) {\n            $line = $from_lines[$xi];\n            if (($this->xchanged[$xi] = empty($yhash[$line]))) {\n                continue;\n            }\n            $this->xv[] = $line;\n            $this->xind[] = $xi;\n        }\n\n        // Find the LCS.\n        $this->_compareseq(0, count($this->xv), 0, count($this->yv));\n\n        // Merge edits when possible.\n        $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged);\n        $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged);\n\n        // Compute the edit operations.\n        $edits = array();\n        $xi = $yi = 0;\n        while ($xi < $n_from || $yi < $n_to) {\n            assert($yi < $n_to || $this->xchanged[$xi]);\n            assert($xi < $n_from || $this->ychanged[$yi]);\n\n            // Skip matching \"snake\".\n            $copy = array();\n            while ($xi < $n_from && $yi < $n_to\n                   && !$this->xchanged[$xi] && !$this->ychanged[$yi]) {\n                $copy[] = $from_lines[$xi++];\n                ++$yi;\n            }\n            if ($copy) {\n                $edits[] = new Text_Diff_Op_copy($copy);\n            }\n\n            // Find deletes & adds.\n            $delete = array();\n            while ($xi < $n_from && $this->xchanged[$xi]) {\n                $delete[] = $from_lines[$xi++];\n            }\n\n            $add = array();\n            while ($yi < $n_to && $this->ychanged[$yi]) {\n                $add[] = $to_lines[$yi++];\n            }\n\n            if ($delete && $add) {\n                $edits[] = new Text_Diff_Op_change($delete, $add);\n            } elseif ($delete) {\n                $edits[] = new Text_Diff_Op_delete($delete);\n            } elseif ($add) {\n                $edits[] = new Text_Diff_Op_add($add);\n            }\n        }\n\n        return $edits;\n    }\n\n    /**\n     * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF,\n     * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized\n     * segments.\n     *\n     * Returns (LCS, PTS).  LCS is the length of the LCS. PTS is an array of\n     * NCHUNKS+1 (X, Y) indexes giving the diving points between sub\n     * sequences.  The first sub-sequence is contained in (X0, X1), (Y0, Y1),\n     * the second in (X1, X2), (Y1, Y2) and so on.  Note that (X0, Y0) ==\n     * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM).\n     *\n     * This function assumes that the first lines of the specified portions of\n     * the two files do not match, and likewise that the last lines do not\n     * match.  The caller must trim matching lines from the beginning and end\n     * of the portions it is going to specify.\n     */\n    function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks)\n    {\n        $flip = false;\n\n        if ($xlim - $xoff > $ylim - $yoff) {\n            /* Things seems faster (I'm not sure I understand why) when the\n             * shortest sequence is in X. */\n            $flip = true;\n            list ($xoff, $xlim, $yoff, $ylim)\n                = array($yoff, $ylim, $xoff, $xlim);\n        }\n\n        if ($flip) {\n            for ($i = $ylim - 1; $i >= $yoff; $i--) {\n                $ymatches[$this->xv[$i]][] = $i;\n            }\n        } else {\n            for ($i = $ylim - 1; $i >= $yoff; $i--) {\n                $ymatches[$this->yv[$i]][] = $i;\n            }\n        }\n\n        $this->lcs = 0;\n        $this->seq[0]= $yoff - 1;\n        $this->in_seq = array();\n        $ymids[0] = array();\n\n        $numer = $xlim - $xoff + $nchunks - 1;\n        $x = $xoff;\n        for ($chunk = 0; $chunk < $nchunks; $chunk++) {\n            if ($chunk > 0) {\n                for ($i = 0; $i <= $this->lcs; $i++) {\n                    $ymids[$i][$chunk - 1] = $this->seq[$i];\n                }\n            }\n\n            $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks);\n            for (; $x < $x1; $x++) {\n                $line = $flip ? $this->yv[$x] : $this->xv[$x];\n                if (empty($ymatches[$line])) {\n                    continue;\n                }\n                $matches = $ymatches[$line];\n                reset($matches);\n                while (list(, $y) = each($matches)) {\n                    if (empty($this->in_seq[$y])) {\n                        $k = $this->_lcsPos($y);\n                        assert($k > 0);\n                        $ymids[$k] = $ymids[$k - 1];\n                        break;\n                    }\n                }\n                while (list(, $y) = each($matches)) {\n                    if ($y > $this->seq[$k - 1]) {\n                        assert($y <= $this->seq[$k]);\n                        /* Optimization: this is a common case: next match is\n                         * just replacing previous match. */\n                        $this->in_seq[$this->seq[$k]] = false;\n                        $this->seq[$k] = $y;\n                        $this->in_seq[$y] = 1;\n                    } elseif (empty($this->in_seq[$y])) {\n                        $k = $this->_lcsPos($y);\n                        assert($k > 0);\n                        $ymids[$k] = $ymids[$k - 1];\n                    }\n                }\n            }\n        }\n\n        $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff);\n        $ymid = $ymids[$this->lcs];\n        for ($n = 0; $n < $nchunks - 1; $n++) {\n            $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks);\n            $y1 = $ymid[$n] + 1;\n            $seps[] = $flip ? array($y1, $x1) : array($x1, $y1);\n        }\n        $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim);\n\n        return array($this->lcs, $seps);\n    }\n\n    function _lcsPos($ypos)\n    {\n        $end = $this->lcs;\n        if ($end == 0 || $ypos > $this->seq[$end]) {\n            $this->seq[++$this->lcs] = $ypos;\n            $this->in_seq[$ypos] = 1;\n            return $this->lcs;\n        }\n\n        $beg = 1;\n        while ($beg < $end) {\n            $mid = (int)(($beg + $end) / 2);\n            if ($ypos > $this->seq[$mid]) {\n                $beg = $mid + 1;\n            } else {\n                $end = $mid;\n            }\n        }\n\n        assert($ypos != $this->seq[$end]);\n\n        $this->in_seq[$this->seq[$end]] = false;\n        $this->seq[$end] = $ypos;\n        $this->in_seq[$ypos] = 1;\n        return $end;\n    }\n\n    /**\n     * Finds LCS of two sequences.\n     *\n     * The results are recorded in the vectors $this->{x,y}changed[], by\n     * storing a 1 in the element for each line that is an insertion or\n     * deletion (ie. is not in the LCS).\n     *\n     * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1.\n     *\n     * Note that XLIM, YLIM are exclusive bounds.  All line numbers are\n     * origin-0 and discarded lines are not counted.\n     */\n    function _compareseq ($xoff, $xlim, $yoff, $ylim)\n    {\n        /* Slide down the bottom initial diagonal. */\n        while ($xoff < $xlim && $yoff < $ylim\n               && $this->xv[$xoff] == $this->yv[$yoff]) {\n            ++$xoff;\n            ++$yoff;\n        }\n\n        /* Slide up the top initial diagonal. */\n        while ($xlim > $xoff && $ylim > $yoff\n               && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) {\n            --$xlim;\n            --$ylim;\n        }\n\n        if ($xoff == $xlim || $yoff == $ylim) {\n            $lcs = 0;\n        } else {\n            /* This is ad hoc but seems to work well.  $nchunks =\n             * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks =\n             * max(2,min(8,(int)$nchunks)); */\n            $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1;\n            list($lcs, $seps)\n                = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks);\n        }\n\n        if ($lcs == 0) {\n            /* X and Y sequences have no common subsequence: mark all\n             * changed. */\n            while ($yoff < $ylim) {\n                $this->ychanged[$this->yind[$yoff++]] = 1;\n            }\n            while ($xoff < $xlim) {\n                $this->xchanged[$this->xind[$xoff++]] = 1;\n            }\n        } else {\n            /* Use the partitions to split this problem into subproblems. */\n            reset($seps);\n            $pt1 = $seps[0];\n            while ($pt2 = next($seps)) {\n                $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]);\n                $pt1 = $pt2;\n            }\n        }\n    }\n\n    /**\n     * Adjusts inserts/deletes of identical lines to join changes as much as\n     * possible.\n     *\n     * We do something when a run of changed lines include a line at one end\n     * and has an excluded, identical line at the other.  We are free to\n     * choose which identical line is included.  `compareseq' usually chooses\n     * the one at the beginning, but usually it is cleaner to consider the\n     * following identical line to be the \"change\".\n     *\n     * This is extracted verbatim from analyze.c (GNU diffutils-2.7).\n     */\n    function _shiftBoundaries($lines, &$changed, $other_changed)\n    {\n        $i = 0;\n        $j = 0;\n\n        assert('count($lines) == count($changed)');\n        $len = count($lines);\n        $other_len = count($other_changed);\n\n        while (1) {\n            /* Scan forward to find the beginning of another run of\n             * changes. Also keep track of the corresponding point in the\n             * other file.\n             *\n             * Throughout this code, $i and $j are adjusted together so that\n             * the first $i elements of $changed and the first $j elements of\n             * $other_changed both contain the same number of zeros (unchanged\n             * lines).\n             *\n             * Furthermore, $j is always kept so that $j == $other_len or\n             * $other_changed[$j] == false. */\n            while ($j < $other_len && $other_changed[$j]) {\n                $j++;\n            }\n\n            while ($i < $len && ! $changed[$i]) {\n                assert('$j < $other_len && ! $other_changed[$j]');\n                $i++; $j++;\n                while ($j < $other_len && $other_changed[$j]) {\n                    $j++;\n                }\n            }\n\n            if ($i == $len) {\n                break;\n            }\n\n            $start = $i;\n\n            /* Find the end of this run of changes. */\n            while (++$i < $len && $changed[$i]) {\n                continue;\n            }\n\n            do {\n                /* Record the length of this run of changes, so that we can\n                 * later determine whether the run has grown. */\n                $runlength = $i - $start;\n\n                /* Move the changed region back, so long as the previous\n                 * unchanged line matches the last changed one.  This merges\n                 * with previous changed regions. */\n                while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) {\n                    $changed[--$start] = 1;\n                    $changed[--$i] = false;\n                    while ($start > 0 && $changed[$start - 1]) {\n                        $start--;\n                    }\n                    assert('$j > 0');\n                    while ($other_changed[--$j]) {\n                        continue;\n                    }\n                    assert('$j >= 0 && !$other_changed[$j]');\n                }\n\n                /* Set CORRESPONDING to the end of the changed run, at the\n                 * last point where it corresponds to a changed run in the\n                 * other file. CORRESPONDING == LEN means no such point has\n                 * been found. */\n                $corresponding = $j < $other_len ? $i : $len;\n\n                /* Move the changed region forward, so long as the first\n                 * changed line matches the following unchanged one.  This\n                 * merges with following changed regions.  Do this second, so\n                 * that if there are no merges, the changed region is moved\n                 * forward as far as possible. */\n                while ($i < $len && $lines[$start] == $lines[$i]) {\n                    $changed[$start++] = false;\n                    $changed[$i++] = 1;\n                    while ($i < $len && $changed[$i]) {\n                        $i++;\n                    }\n\n                    assert('$j < $other_len && ! $other_changed[$j]');\n                    $j++;\n                    if ($j < $other_len && $other_changed[$j]) {\n                        $corresponding = $i;\n                        while ($j < $other_len && $other_changed[$j]) {\n                            $j++;\n                        }\n                    }\n                }\n            } while ($runlength != $i - $start);\n\n            /* If possible, move the fully-merged run of changes back to a\n             * corresponding run in the other file. */\n            while ($corresponding < $i) {\n                $changed[--$start] = 1;\n                $changed[--$i] = 0;\n                assert('$j > 0');\n                while ($other_changed[--$j]) {\n                    continue;\n                }\n                assert('$j >= 0 && !$other_changed[$j]');\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/Text/Diff/Engine/shell.php",
    "content": "<?php\n/**\n * Class used internally by Diff to actually compute the diffs.\n *\n * This class uses the Unix `diff` program via shell_exec to compute the\n * differences between the two input arrays.\n *\n * Copyright 2007-2010 The Horde Project (http://www.horde.org/)\n *\n * See the enclosed file COPYING for license information (LGPL). If you did\n * not receive this file, see http://opensource.org/licenses/lgpl-license.php.\n *\n * @author  Milian Wolff <mail@milianw.de>\n * @package Text_Diff\n * @since   0.3.0\n */\nclass Text_Diff_Engine_shell {\n\n    /**\n     * Path to the diff executable\n     *\n     * @var string\n     */\n    var $_diffCommand = 'diff';\n\n    /**\n     * Returns the array of differences.\n     *\n     * @param array $from_lines lines of text from old file\n     * @param array $to_lines   lines of text from new file\n     *\n     * @return array all changes made (array with Text_Diff_Op_* objects)\n     */\n    function diff($from_lines, $to_lines)\n    {\n        array_walk($from_lines, array('Text_Diff', 'trimNewlines'));\n        array_walk($to_lines, array('Text_Diff', 'trimNewlines'));\n\n        $temp_dir = Text_Diff::_getTempDir();\n\n        // Execute gnu diff or similar to get a standard diff file.\n        $from_file = tempnam($temp_dir, 'Text_Diff');\n        $to_file = tempnam($temp_dir, 'Text_Diff');\n        $fp = fopen($from_file, 'w');\n        fwrite($fp, implode(\"\\n\", $from_lines));\n        fclose($fp);\n        $fp = fopen($to_file, 'w');\n        fwrite($fp, implode(\"\\n\", $to_lines));\n        fclose($fp);\n        $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file);\n        unlink($from_file);\n        unlink($to_file);\n\n        if (is_null($diff)) {\n            // No changes were made\n            return array(new Text_Diff_Op_copy($from_lines));\n        }\n\n        $from_line_no = 1;\n        $to_line_no = 1;\n        $edits = array();\n\n        // Get changed lines by parsing something like:\n        // 0a1,2\n        // 1,2c4,6\n        // 1,5d6\n        preg_match_all('#^(\\d+)(?:,(\\d+))?([adc])(\\d+)(?:,(\\d+))?$#m', $diff,\n            $matches, PREG_SET_ORDER);\n\n        foreach ($matches as $match) {\n            if (!isset($match[5])) {\n                // This paren is not set every time (see regex).\n                $match[5] = false;\n            }\n\n            if ($match[3] == 'a') {\n                $from_line_no--;\n            }\n\n            if ($match[3] == 'd') {\n                $to_line_no--;\n            }\n\n            if ($from_line_no < $match[1] || $to_line_no < $match[4]) {\n                // copied lines\n                assert('$match[1] - $from_line_no == $match[4] - $to_line_no');\n                array_push($edits,\n                    new Text_Diff_Op_copy(\n                        $this->_getLines($from_lines, $from_line_no, $match[1] - 1),\n                        $this->_getLines($to_lines, $to_line_no, $match[4] - 1)));\n            }\n\n            switch ($match[3]) {\n            case 'd':\n                // deleted lines\n                array_push($edits,\n                    new Text_Diff_Op_delete(\n                        $this->_getLines($from_lines, $from_line_no, $match[2])));\n                $to_line_no++;\n                break;\n\n            case 'c':\n                // changed lines\n                array_push($edits,\n                    new Text_Diff_Op_change(\n                        $this->_getLines($from_lines, $from_line_no, $match[2]),\n                        $this->_getLines($to_lines, $to_line_no, $match[5])));\n                break;\n\n            case 'a':\n                // added lines\n                array_push($edits,\n                    new Text_Diff_Op_add(\n                        $this->_getLines($to_lines, $to_line_no, $match[5])));\n                $from_line_no++;\n                break;\n            }\n        }\n\n        if (!empty($from_lines)) {\n            // Some lines might still be pending. Add them as copied\n            array_push($edits,\n                new Text_Diff_Op_copy(\n                    $this->_getLines($from_lines, $from_line_no,\n                                     $from_line_no + count($from_lines) - 1),\n                    $this->_getLines($to_lines, $to_line_no,\n                                     $to_line_no + count($to_lines) - 1)));\n        }\n\n        return $edits;\n    }\n\n    /**\n     * Get lines from either the old or new text\n     *\n     * @access private\n     *\n     * @param array &$text_lines Either $from_lines or $to_lines\n     * @param int   &$line_no    Current line number\n     * @param int   $end         Optional end line, when we want to chop more\n     *                           than one line.\n     *\n     * @return array The chopped lines\n     */\n    function _getLines(&$text_lines, &$line_no, $end = false)\n    {\n        if (!empty($end)) {\n            $lines = array();\n            // We can shift even more\n            while ($line_no <= $end) {\n                array_push($lines, array_shift($text_lines));\n                $line_no++;\n            }\n        } else {\n            $lines = array(array_shift($text_lines));\n            $line_no++;\n        }\n\n        return $lines;\n    }\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/Text/Diff/Engine/string.php",
    "content": "<?php\n/**\n * Parses unified or context diffs output from eg. the diff utility.\n *\n * Example:\n * <code>\n * $patch = file_get_contents('example.patch');\n * $diff = new Text_Diff('string', array($patch));\n * $renderer = new Text_Diff_Renderer_inline();\n * echo $renderer->render($diff);\n * </code>\n *\n * Copyright 2005 Örjan Persson <o@42mm.org>\n * Copyright 2005-2010 The Horde Project (http://www.horde.org/)\n *\n * See the enclosed file COPYING for license information (LGPL). If you did\n * not receive this file, see http://opensource.org/licenses/lgpl-license.php.\n *\n * @author  Örjan Persson <o@42mm.org>\n * @package Text_Diff\n * @since   0.2.0\n */\nclass Text_Diff_Engine_string {\n\n    /**\n     * Parses a unified or context diff.\n     *\n     * First param contains the whole diff and the second can be used to force\n     * a specific diff type. If the second parameter is 'autodetect', the\n     * diff will be examined to find out which type of diff this is.\n     *\n     * @param string $diff  The diff content.\n     * @param string $mode  The diff mode of the content in $diff. One of\n     *                      'context', 'unified', or 'autodetect'.\n     *\n     * @return array  List of all diff operations.\n     */\n    function diff($diff, $mode = 'autodetect')\n    {\n        // Detect line breaks.\n        $lnbr = \"\\n\";\n        if (strpos($diff, \"\\r\\n\") !== false) {\n            $lnbr = \"\\r\\n\";\n        } elseif (strpos($diff, \"\\r\") !== false) {\n            $lnbr = \"\\r\";\n        }\n\n        // Make sure we have a line break at the EOF.\n        if (substr($diff, -strlen($lnbr)) != $lnbr) {\n            $diff .= $lnbr;\n        }\n\n        if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') {\n            return PEAR::raiseError('Type of diff is unsupported');\n        }\n\n        if ($mode == 'autodetect') {\n            $context = strpos($diff, '***');\n            $unified = strpos($diff, '---');\n            if ($context === $unified) {\n                return PEAR::raiseError('Type of diff could not be detected');\n            } elseif ($context === false || $unified === false) {\n                $mode = $context !== false ? 'context' : 'unified';\n            } else {\n                $mode = $context < $unified ? 'context' : 'unified';\n            }\n        }\n\n        // Split by new line and remove the diff header, if there is one.\n        $diff = explode($lnbr, $diff);\n        if (($mode == 'context' && strpos($diff[0], '***') === 0) ||\n            ($mode == 'unified' && strpos($diff[0], '---') === 0)) {\n            array_shift($diff);\n            array_shift($diff);\n        }\n\n        if ($mode == 'context') {\n            return $this->parseContextDiff($diff);\n        } else {\n            return $this->parseUnifiedDiff($diff);\n        }\n    }\n\n    /**\n     * Parses an array containing the unified diff.\n     *\n     * @param array $diff  Array of lines.\n     *\n     * @return array  List of all diff operations.\n     */\n    function parseUnifiedDiff($diff)\n    {\n        $edits = array();\n        $end = count($diff) - 1;\n        for ($i = 0; $i < $end;) {\n            $diff1 = array();\n            switch (substr($diff[$i], 0, 1)) {\n            case ' ':\n                do {\n                    $diff1[] = substr($diff[$i], 1);\n                } while (++$i < $end && substr($diff[$i], 0, 1) == ' ');\n                $edits[] = new Text_Diff_Op_copy($diff1);\n                break;\n\n            case '+':\n                // get all new lines\n                do {\n                    $diff1[] = substr($diff[$i], 1);\n                } while (++$i < $end && substr($diff[$i], 0, 1) == '+');\n                $edits[] = new Text_Diff_Op_add($diff1);\n                break;\n\n            case '-':\n                // get changed or removed lines\n                $diff2 = array();\n                do {\n                    $diff1[] = substr($diff[$i], 1);\n                } while (++$i < $end && substr($diff[$i], 0, 1) == '-');\n\n                while ($i < $end && substr($diff[$i], 0, 1) == '+') {\n                    $diff2[] = substr($diff[$i++], 1);\n                }\n                if (count($diff2) == 0) {\n                    $edits[] = new Text_Diff_Op_delete($diff1);\n                } else {\n                    $edits[] = new Text_Diff_Op_change($diff1, $diff2);\n                }\n                break;\n\n            default:\n                $i++;\n                break;\n            }\n        }\n\n        return $edits;\n    }\n\n    /**\n     * Parses an array containing the context diff.\n     *\n     * @param array $diff  Array of lines.\n     *\n     * @return array  List of all diff operations.\n     */\n    function parseContextDiff(&$diff)\n    {\n        $edits = array();\n        $i = $max_i = $j = $max_j = 0;\n        $end = count($diff) - 1;\n        while ($i < $end && $j < $end) {\n            while ($i >= $max_i && $j >= $max_j) {\n                // Find the boundaries of the diff output of the two files\n                for ($i = $j;\n                     $i < $end && substr($diff[$i], 0, 3) == '***';\n                     $i++);\n                for ($max_i = $i;\n                     $max_i < $end && substr($diff[$max_i], 0, 3) != '---';\n                     $max_i++);\n                for ($j = $max_i;\n                     $j < $end && substr($diff[$j], 0, 3) == '---';\n                     $j++);\n                for ($max_j = $j;\n                     $max_j < $end && substr($diff[$max_j], 0, 3) != '***';\n                     $max_j++);\n            }\n\n            // find what hasn't been changed\n            $array = array();\n            while ($i < $max_i &&\n                   $j < $max_j &&\n                   strcmp($diff[$i], $diff[$j]) == 0) {\n                $array[] = substr($diff[$i], 2);\n                $i++;\n                $j++;\n            }\n\n            while ($i < $max_i && ($max_j-$j) <= 1) {\n                if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') {\n                    break;\n                }\n                $array[] = substr($diff[$i++], 2);\n            }\n\n            while ($j < $max_j && ($max_i-$i) <= 1) {\n                if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') {\n                    break;\n                }\n                $array[] = substr($diff[$j++], 2);\n            }\n            if (count($array) > 0) {\n                $edits[] = new Text_Diff_Op_copy($array);\n            }\n\n            if ($i < $max_i) {\n                $diff1 = array();\n                switch (substr($diff[$i], 0, 1)) {\n                case '!':\n                    $diff2 = array();\n                    do {\n                        $diff1[] = substr($diff[$i], 2);\n                        if ($j < $max_j && substr($diff[$j], 0, 1) == '!') {\n                            $diff2[] = substr($diff[$j++], 2);\n                        }\n                    } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!');\n                    $edits[] = new Text_Diff_Op_change($diff1, $diff2);\n                    break;\n\n                case '+':\n                    do {\n                        $diff1[] = substr($diff[$i], 2);\n                    } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+');\n                    $edits[] = new Text_Diff_Op_add($diff1);\n                    break;\n\n                case '-':\n                    do {\n                        $diff1[] = substr($diff[$i], 2);\n                    } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-');\n                    $edits[] = new Text_Diff_Op_delete($diff1);\n                    break;\n                }\n            }\n\n            if ($j < $max_j) {\n                $diff2 = array();\n                switch (substr($diff[$j], 0, 1)) {\n                case '+':\n                    do {\n                        $diff2[] = substr($diff[$j++], 2);\n                    } while ($j < $max_j && substr($diff[$j], 0, 1) == '+');\n                    $edits[] = new Text_Diff_Op_add($diff2);\n                    break;\n\n                case '-':\n                    do {\n                        $diff2[] = substr($diff[$j++], 2);\n                    } while ($j < $max_j && substr($diff[$j], 0, 1) == '-');\n                    $edits[] = new Text_Diff_Op_delete($diff2);\n                    break;\n                }\n            }\n        }\n\n        return $edits;\n    }\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/Text/Diff/Engine/xdiff.php",
    "content": "<?php\n/**\n * Class used internally by Diff to actually compute the diffs.\n *\n * This class uses the xdiff PECL package (http://pecl.php.net/package/xdiff)\n * to compute the differences between the two input arrays.\n *\n * Copyright 2004-2010 The Horde Project (http://www.horde.org/)\n *\n * See the enclosed file COPYING for license information (LGPL). If you did\n * not receive this file, see http://opensource.org/licenses/lgpl-license.php.\n *\n * @author  Jon Parise <jon@horde.org>\n * @package Text_Diff\n */\nclass Text_Diff_Engine_xdiff {\n\n    /**\n     */\n    function diff($from_lines, $to_lines)\n    {\n        array_walk($from_lines, array('Text_Diff', 'trimNewlines'));\n        array_walk($to_lines, array('Text_Diff', 'trimNewlines'));\n\n        /* Convert the two input arrays into strings for xdiff processing. */\n        $from_string = implode(\"\\n\", $from_lines);\n        $to_string = implode(\"\\n\", $to_lines);\n\n        /* Diff the two strings and convert the result to an array. */\n        $diff = xdiff_string_diff($from_string, $to_string, count($to_lines));\n        $diff = explode(\"\\n\", $diff);\n\n        /* Walk through the diff one line at a time.  We build the $edits\n         * array of diff operations by reading the first character of the\n         * xdiff output (which is in the \"unified diff\" format).\n         *\n         * Note that we don't have enough information to detect \"changed\"\n         * lines using this approach, so we can't add Text_Diff_Op_changed\n         * instances to the $edits array.  The result is still perfectly\n         * valid, albeit a little less descriptive and efficient. */\n        $edits = array();\n        foreach ($diff as $line) {\n            if (!strlen($line)) {\n                continue;\n            }\n            switch ($line[0]) {\n            case ' ':\n                $edits[] = new Text_Diff_Op_copy(array(substr($line, 1)));\n                break;\n\n            case '+':\n                $edits[] = new Text_Diff_Op_add(array(substr($line, 1)));\n                break;\n\n            case '-':\n                $edits[] = new Text_Diff_Op_delete(array(substr($line, 1)));\n                break;\n            }\n        }\n\n        return $edits;\n    }\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/Text/Diff/Renderer/inline.php",
    "content": "<?php\n/**\n * \"Inline\" diff renderer.\n *\n * Copyright 2004-2010 The Horde Project (http://www.horde.org/)\n *\n * See the enclosed file COPYING for license information (LGPL). If you did\n * not receive this file, see http://opensource.org/licenses/lgpl-license.php.\n *\n * @author  Ciprian Popovici\n * @package Text_Diff\n */\n\n/** Text_Diff_Renderer */\n\n// WP #7391\nrequire_once dirname(dirname(__FILE__)) . '/Renderer.php';\n\n/**\n * \"Inline\" diff renderer.\n *\n * This class renders diffs in the Wiki-style \"inline\" format.\n *\n * @author  Ciprian Popovici\n * @package Text_Diff\n */\nclass Text_Diff_Renderer_inline extends Text_Diff_Renderer {\n\n    /**\n     * Number of leading context \"lines\" to preserve.\n     *\n     * @var integer\n     */\n    var $_leading_context_lines = 10000;\n\n    /**\n     * Number of trailing context \"lines\" to preserve.\n     *\n     * @var integer\n     */\n    var $_trailing_context_lines = 10000;\n\n    /**\n     * Prefix for inserted text.\n     *\n     * @var string\n     */\n    var $_ins_prefix = '<ins>';\n\n    /**\n     * Suffix for inserted text.\n     *\n     * @var string\n     */\n    var $_ins_suffix = '</ins>';\n\n    /**\n     * Prefix for deleted text.\n     *\n     * @var string\n     */\n    var $_del_prefix = '<del>';\n\n    /**\n     * Suffix for deleted text.\n     *\n     * @var string\n     */\n    var $_del_suffix = '</del>';\n\n    /**\n     * Header for each change block.\n     *\n     * @var string\n     */\n    var $_block_header = '';\n\n    /**\n     * Whether to split down to character-level.\n     *\n     * @var boolean\n     */\n    var $_split_characters = false;\n\n    /**\n     * What are we currently splitting on? Used to recurse to show word-level\n     * or character-level changes.\n     *\n     * @var string\n     */\n    var $_split_level = 'lines';\n\n    function _blockHeader($xbeg, $xlen, $ybeg, $ylen)\n    {\n        return $this->_block_header;\n    }\n\n    function _startBlock($header)\n    {\n        return $header;\n    }\n\n    function _lines($lines, $prefix = ' ', $encode = true)\n    {\n        if ($encode) {\n            array_walk($lines, array(&$this, '_encode'));\n        }\n\n        if ($this->_split_level == 'lines') {\n            return implode(\"\\n\", $lines) . \"\\n\";\n        } else {\n            return implode('', $lines);\n        }\n    }\n\n    function _added($lines)\n    {\n        array_walk($lines, array(&$this, '_encode'));\n        $lines[0] = $this->_ins_prefix . $lines[0];\n        $lines[count($lines) - 1] .= $this->_ins_suffix;\n        return $this->_lines($lines, ' ', false);\n    }\n\n    function _deleted($lines, $words = false)\n    {\n        array_walk($lines, array(&$this, '_encode'));\n        $lines[0] = $this->_del_prefix . $lines[0];\n        $lines[count($lines) - 1] .= $this->_del_suffix;\n        return $this->_lines($lines, ' ', false);\n    }\n\n    function _changed($orig, $final)\n    {\n        /* If we've already split on characters, just display. */\n        if ($this->_split_level == 'characters') {\n            return $this->_deleted($orig)\n                . $this->_added($final);\n        }\n\n        /* If we've already split on words, just display. */\n        if ($this->_split_level == 'words') {\n            $prefix = '';\n            while ($orig[0] !== false && $final[0] !== false &&\n                   substr($orig[0], 0, 1) == ' ' &&\n                   substr($final[0], 0, 1) == ' ') {\n                $prefix .= substr($orig[0], 0, 1);\n                $orig[0] = substr($orig[0], 1);\n                $final[0] = substr($final[0], 1);\n            }\n            return $prefix . $this->_deleted($orig) . $this->_added($final);\n        }\n\n        $text1 = implode(\"\\n\", $orig);\n        $text2 = implode(\"\\n\", $final);\n\n        /* Non-printing newline marker. */\n        $nl = \"\\0\";\n\n        if ($this->_split_characters) {\n            $diff = new Text_Diff('native',\n                                  array(preg_split('//', $text1),\n                                        preg_split('//', $text2)));\n        } else {\n            /* We want to split on word boundaries, but we need to preserve\n             * whitespace as well. Therefore we split on words, but include\n             * all blocks of whitespace in the wordlist. */\n            $diff = new Text_Diff('native',\n                                  array($this->_splitOnWords($text1, $nl),\n                                        $this->_splitOnWords($text2, $nl)));\n        }\n\n        /* Get the diff in inline format. */\n        $renderer = new Text_Diff_Renderer_inline\n            (array_merge($this->getParams(),\n                         array('split_level' => $this->_split_characters ? 'characters' : 'words')));\n\n        /* Run the diff and get the output. */\n        return str_replace($nl, \"\\n\", $renderer->render($diff)) . \"\\n\";\n    }\n\n    function _splitOnWords($string, $newlineEscape = \"\\n\")\n    {\n        // Ignore \\0; otherwise the while loop will never finish.\n        $string = str_replace(\"\\0\", '', $string);\n\n        $words = array();\n        $length = strlen($string);\n        $pos = 0;\n\n        while ($pos < $length) {\n            // Eat a word with any preceding whitespace.\n            $spaces = strspn(substr($string, $pos), \" \\n\");\n            $nextpos = strcspn(substr($string, $pos + $spaces), \" \\n\");\n            $words[] = str_replace(\"\\n\", $newlineEscape, substr($string, $pos, $spaces + $nextpos));\n            $pos += $spaces + $nextpos;\n        }\n\n        return $words;\n    }\n\n    function _encode(&$string)\n    {\n        $string = htmlspecialchars($string);\n    }\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/Text/Diff/Renderer.php",
    "content": "<?php\n/**\n * A class to render Diffs in different formats.\n *\n * This class renders the diff in classic diff format. It is intended that\n * this class be customized via inheritance, to obtain fancier outputs.\n *\n * Copyright 2004-2010 The Horde Project (http://www.horde.org/)\n *\n * See the enclosed file COPYING for license information (LGPL). If you did\n * not receive this file, see http://opensource.org/licenses/lgpl-license.php.\n *\n * @package Text_Diff\n */\nclass Text_Diff_Renderer {\n\n    /**\n     * Number of leading context \"lines\" to preserve.\n     *\n     * This should be left at zero for this class, but subclasses may want to\n     * set this to other values.\n     */\n    var $_leading_context_lines = 0;\n\n    /**\n     * Number of trailing context \"lines\" to preserve.\n     *\n     * This should be left at zero for this class, but subclasses may want to\n     * set this to other values.\n     */\n    var $_trailing_context_lines = 0;\n\n    /**\n     * Constructor.\n     */\n    function __construct( $params = array() )\n    {\n        foreach ($params as $param => $value) {\n            $v = '_' . $param;\n            if (isset($this->$v)) {\n                $this->$v = $value;\n            }\n        }\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Text_Diff_Renderer( $params = array() ) {\n\t\tself::__construct( $params );\n\t}\n\n    /**\n     * Get any renderer parameters.\n     *\n     * @return array  All parameters of this renderer object.\n     */\n    function getParams()\n    {\n        $params = array();\n        foreach (get_object_vars($this) as $k => $v) {\n            if ($k[0] == '_') {\n                $params[substr($k, 1)] = $v;\n            }\n        }\n\n        return $params;\n    }\n\n    /**\n     * Renders a diff.\n     *\n     * @param Text_Diff $diff  A Text_Diff object.\n     *\n     * @return string  The formatted output.\n     */\n    function render($diff)\n    {\n        $xi = $yi = 1;\n        $block = false;\n        $context = array();\n\n        $nlead = $this->_leading_context_lines;\n        $ntrail = $this->_trailing_context_lines;\n\n        $output = $this->_startDiff();\n\n        $diffs = $diff->getDiff();\n        foreach ($diffs as $i => $edit) {\n            /* If these are unchanged (copied) lines, and we want to keep\n             * leading or trailing context lines, extract them from the copy\n             * block. */\n            if (is_a($edit, 'Text_Diff_Op_copy')) {\n                /* Do we have any diff blocks yet? */\n                if (is_array($block)) {\n                    /* How many lines to keep as context from the copy\n                     * block. */\n                    $keep = $i == count($diffs) - 1 ? $ntrail : $nlead + $ntrail;\n                    if (count($edit->orig) <= $keep) {\n                        /* We have less lines in the block than we want for\n                         * context => keep the whole block. */\n                        $block[] = $edit;\n                    } else {\n                        if ($ntrail) {\n                            /* Create a new block with as many lines as we need\n                             * for the trailing context. */\n                            $context = array_slice($edit->orig, 0, $ntrail);\n                            $block[] = new Text_Diff_Op_copy($context);\n                        }\n                        /* @todo */\n                        $output .= $this->_block($x0, $ntrail + $xi - $x0,\n                                                 $y0, $ntrail + $yi - $y0,\n                                                 $block);\n                        $block = false;\n                    }\n                }\n                /* Keep the copy block as the context for the next block. */\n                $context = $edit->orig;\n            } else {\n                /* Don't we have any diff blocks yet? */\n                if (!is_array($block)) {\n                    /* Extract context lines from the preceding copy block. */\n                    $context = array_slice($context, count($context) - $nlead);\n                    $x0 = $xi - count($context);\n                    $y0 = $yi - count($context);\n                    $block = array();\n                    if ($context) {\n                        $block[] = new Text_Diff_Op_copy($context);\n                    }\n                }\n                $block[] = $edit;\n            }\n\n            if ($edit->orig) {\n                $xi += count($edit->orig);\n            }\n            if ($edit->final) {\n                $yi += count($edit->final);\n            }\n        }\n\n        if (is_array($block)) {\n            $output .= $this->_block($x0, $xi - $x0,\n                                     $y0, $yi - $y0,\n                                     $block);\n        }\n\n        return $output . $this->_endDiff();\n    }\n\n    function _block($xbeg, $xlen, $ybeg, $ylen, &$edits)\n    {\n        $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen));\n\n        foreach ($edits as $edit) {\n            switch (strtolower(get_class($edit))) {\n            case 'text_diff_op_copy':\n                $output .= $this->_context($edit->orig);\n                break;\n\n            case 'text_diff_op_add':\n                $output .= $this->_added($edit->final);\n                break;\n\n            case 'text_diff_op_delete':\n                $output .= $this->_deleted($edit->orig);\n                break;\n\n            case 'text_diff_op_change':\n                $output .= $this->_changed($edit->orig, $edit->final);\n                break;\n            }\n        }\n\n        return $output . $this->_endBlock();\n    }\n\n    function _startDiff()\n    {\n        return '';\n    }\n\n    function _endDiff()\n    {\n        return '';\n    }\n\n    function _blockHeader($xbeg, $xlen, $ybeg, $ylen)\n    {\n        if ($xlen > 1) {\n            $xbeg .= ',' . ($xbeg + $xlen - 1);\n        }\n        if ($ylen > 1) {\n            $ybeg .= ',' . ($ybeg + $ylen - 1);\n        }\n\n        // this matches the GNU Diff behaviour\n        if ($xlen && !$ylen) {\n            $ybeg--;\n        } elseif (!$xlen) {\n            $xbeg--;\n        }\n\n        return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg;\n    }\n\n    function _startBlock($header)\n    {\n        return $header . \"\\n\";\n    }\n\n    function _endBlock()\n    {\n        return '';\n    }\n\n    function _lines($lines, $prefix = ' ')\n    {\n        return $prefix . implode(\"\\n$prefix\", $lines) . \"\\n\";\n    }\n\n    function _context($lines)\n    {\n        return $this->_lines($lines, '  ');\n    }\n\n    function _added($lines)\n    {\n        return $this->_lines($lines, '> ');\n    }\n\n    function _deleted($lines)\n    {\n        return $this->_lines($lines, '< ');\n    }\n\n    function _changed($orig, $final)\n    {\n        return $this->_deleted($orig) . \"---\\n\" . $this->_added($final);\n    }\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/Text/Diff.php",
    "content": "<?php\n/**\n * General API for generating and formatting diffs - the differences between\n * two sequences of strings.\n *\n * The original PHP version of this code was written by Geoffrey T. Dairiki\n * <dairiki@dairiki.org>, and is used/adapted with his permission.\n *\n * Copyright 2004 Geoffrey T. Dairiki <dairiki@dairiki.org>\n * Copyright 2004-2010 The Horde Project (http://www.horde.org/)\n *\n * See the enclosed file COPYING for license information (LGPL). If you did\n * not receive this file, see http://opensource.org/licenses/lgpl-license.php.\n *\n * @package Text_Diff\n * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>\n */\nclass Text_Diff {\n\n    /**\n     * Array of changes.\n     *\n     * @var array\n     */\n    var $_edits;\n\n    /**\n     * Computes diffs between sequences of strings.\n     *\n     * @param string $engine     Name of the diffing engine to use.  'auto'\n     *                           will automatically select the best.\n     * @param array $params      Parameters to pass to the diffing engine.\n     *                           Normally an array of two arrays, each\n     *                           containing the lines from a file.\n     */\n    function __construct( $engine, $params )\n    {\n        // Backward compatibility workaround.\n        if (!is_string($engine)) {\n            $params = array($engine, $params);\n            $engine = 'auto';\n        }\n\n        if ($engine == 'auto') {\n            $engine = extension_loaded('xdiff') ? 'xdiff' : 'native';\n        } else {\n            $engine = basename($engine);\n        }\n\n        // WP #7391\n        require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php';\n        $class = 'Text_Diff_Engine_' . $engine;\n        $diff_engine = new $class();\n\n        $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params);\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Text_Diff( $engine, $params ) {\n\t\tself::__construct( $engine, $params );\n\t}\n\n    /**\n     * Returns the array of differences.\n     */\n    function getDiff()\n    {\n        return $this->_edits;\n    }\n\n    /**\n     * returns the number of new (added) lines in a given diff.\n     *\n     * @since Text_Diff 1.1.0\n     *\n     * @return integer The number of new lines\n     */\n    function countAddedLines()\n    {\n        $count = 0;\n        foreach ($this->_edits as $edit) {\n            if (is_a($edit, 'Text_Diff_Op_add') ||\n                is_a($edit, 'Text_Diff_Op_change')) {\n                $count += $edit->nfinal();\n            }\n        }\n        return $count;\n    }\n\n    /**\n     * Returns the number of deleted (removed) lines in a given diff.\n     *\n     * @since Text_Diff 1.1.0\n     *\n     * @return integer The number of deleted lines\n     */\n    function countDeletedLines()\n    {\n        $count = 0;\n        foreach ($this->_edits as $edit) {\n            if (is_a($edit, 'Text_Diff_Op_delete') ||\n                is_a($edit, 'Text_Diff_Op_change')) {\n                $count += $edit->norig();\n            }\n        }\n        return $count;\n    }\n\n    /**\n     * Computes a reversed diff.\n     *\n     * Example:\n     * <code>\n     * $diff = new Text_Diff($lines1, $lines2);\n     * $rev = $diff->reverse();\n     * </code>\n     *\n     * @return Text_Diff  A Diff object representing the inverse of the\n     *                    original diff.  Note that we purposely don't return a\n     *                    reference here, since this essentially is a clone()\n     *                    method.\n     */\n    function reverse()\n    {\n        if (version_compare(zend_version(), '2', '>')) {\n            $rev = clone($this);\n        } else {\n            $rev = $this;\n        }\n        $rev->_edits = array();\n        foreach ($this->_edits as $edit) {\n            $rev->_edits[] = $edit->reverse();\n        }\n        return $rev;\n    }\n\n    /**\n     * Checks for an empty diff.\n     *\n     * @return boolean  True if two sequences were identical.\n     */\n    function isEmpty()\n    {\n        foreach ($this->_edits as $edit) {\n            if (!is_a($edit, 'Text_Diff_Op_copy')) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Computes the length of the Longest Common Subsequence (LCS).\n     *\n     * This is mostly for diagnostic purposes.\n     *\n     * @return integer  The length of the LCS.\n     */\n    function lcs()\n    {\n        $lcs = 0;\n        foreach ($this->_edits as $edit) {\n            if (is_a($edit, 'Text_Diff_Op_copy')) {\n                $lcs += count($edit->orig);\n            }\n        }\n        return $lcs;\n    }\n\n    /**\n     * Gets the original set of lines.\n     *\n     * This reconstructs the $from_lines parameter passed to the constructor.\n     *\n     * @return array  The original sequence of strings.\n     */\n    function getOriginal()\n    {\n        $lines = array();\n        foreach ($this->_edits as $edit) {\n            if ($edit->orig) {\n                array_splice($lines, count($lines), 0, $edit->orig);\n            }\n        }\n        return $lines;\n    }\n\n    /**\n     * Gets the final set of lines.\n     *\n     * This reconstructs the $to_lines parameter passed to the constructor.\n     *\n     * @return array  The sequence of strings.\n     */\n    function getFinal()\n    {\n        $lines = array();\n        foreach ($this->_edits as $edit) {\n            if ($edit->final) {\n                array_splice($lines, count($lines), 0, $edit->final);\n            }\n        }\n        return $lines;\n    }\n\n    /**\n     * Removes trailing newlines from a line of text. This is meant to be used\n     * with array_walk().\n     *\n     * @param string $line  The line to trim.\n     * @param integer $key  The index of the line in the array. Not used.\n     */\n    static function trimNewlines(&$line, $key)\n    {\n        $line = str_replace(array(\"\\n\", \"\\r\"), '', $line);\n    }\n\n    /**\n     * Determines the location of the system temporary directory.\n     *\n     * @static\n     *\n     * @access protected\n     *\n     * @return string  A directory name which can be used for temp files.\n     *                 Returns false if one could not be found.\n     */\n    function _getTempDir()\n    {\n        $tmp_locations = array('/tmp', '/var/tmp', 'c:\\WUTemp', 'c:\\temp',\n                               'c:\\windows\\temp', 'c:\\winnt\\temp');\n\n        /* Try PHP's upload_tmp_dir directive. */\n        $tmp = ini_get('upload_tmp_dir');\n\n        /* Otherwise, try to determine the TMPDIR environment variable. */\n        if (!strlen($tmp)) {\n            $tmp = getenv('TMPDIR');\n        }\n\n        /* If we still cannot determine a value, then cycle through a list of\n         * preset possibilities. */\n        while (!strlen($tmp) && count($tmp_locations)) {\n            $tmp_check = array_shift($tmp_locations);\n            if (@is_dir($tmp_check)) {\n                $tmp = $tmp_check;\n            }\n        }\n\n        /* If it is still empty, we have failed, so return false; otherwise\n         * return the directory determined. */\n        return strlen($tmp) ? $tmp : false;\n    }\n\n    /**\n     * Checks a diff for validity.\n     *\n     * This is here only for debugging purposes.\n     */\n    function _check($from_lines, $to_lines)\n    {\n        if (serialize($from_lines) != serialize($this->getOriginal())) {\n            trigger_error(\"Reconstructed original doesn't match\", E_USER_ERROR);\n        }\n        if (serialize($to_lines) != serialize($this->getFinal())) {\n            trigger_error(\"Reconstructed final doesn't match\", E_USER_ERROR);\n        }\n\n        $rev = $this->reverse();\n        if (serialize($to_lines) != serialize($rev->getOriginal())) {\n            trigger_error(\"Reversed original doesn't match\", E_USER_ERROR);\n        }\n        if (serialize($from_lines) != serialize($rev->getFinal())) {\n            trigger_error(\"Reversed final doesn't match\", E_USER_ERROR);\n        }\n\n        $prevtype = null;\n        foreach ($this->_edits as $edit) {\n            if ($prevtype == get_class($edit)) {\n                trigger_error(\"Edit sequence is non-optimal\", E_USER_ERROR);\n            }\n            $prevtype = get_class($edit);\n        }\n\n        return true;\n    }\n\n}\n\n/**\n * @package Text_Diff\n * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>\n */\nclass Text_MappedDiff extends Text_Diff {\n\n    /**\n     * Computes a diff between sequences of strings.\n     *\n     * This can be used to compute things like case-insensitve diffs, or diffs\n     * which ignore changes in white-space.\n     *\n     * @param array $from_lines         An array of strings.\n     * @param array $to_lines           An array of strings.\n     * @param array $mapped_from_lines  This array should have the same size\n     *                                  number of elements as $from_lines.  The\n     *                                  elements in $mapped_from_lines and\n     *                                  $mapped_to_lines are what is actually\n     *                                  compared when computing the diff.\n     * @param array $mapped_to_lines    This array should have the same number\n     *                                  of elements as $to_lines.\n     */\n    function __construct($from_lines, $to_lines,\n                             $mapped_from_lines, $mapped_to_lines)\n    {\n        assert(count($from_lines) == count($mapped_from_lines));\n        assert(count($to_lines) == count($mapped_to_lines));\n\n        parent::Text_Diff($mapped_from_lines, $mapped_to_lines);\n\n        $xi = $yi = 0;\n        for ($i = 0; $i < count($this->_edits); $i++) {\n            $orig = &$this->_edits[$i]->orig;\n            if (is_array($orig)) {\n                $orig = array_slice($from_lines, $xi, count($orig));\n                $xi += count($orig);\n            }\n\n            $final = &$this->_edits[$i]->final;\n            if (is_array($final)) {\n                $final = array_slice($to_lines, $yi, count($final));\n                $yi += count($final);\n            }\n        }\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Text_MappedDiff( $from_lines, $to_lines,\n                             $mapped_from_lines, $mapped_to_lines ) {\n\t\tself::__construct( $from_lines, $to_lines,\n                             $mapped_from_lines, $mapped_to_lines );\n\t}\n\n}\n\n/**\n * @package Text_Diff\n * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>\n *\n * @access private\n */\nclass Text_Diff_Op {\n\n    var $orig;\n    var $final;\n\n    function &reverse()\n    {\n        trigger_error('Abstract method', E_USER_ERROR);\n    }\n\n    function norig()\n    {\n        return $this->orig ? count($this->orig) : 0;\n    }\n\n    function nfinal()\n    {\n        return $this->final ? count($this->final) : 0;\n    }\n\n}\n\n/**\n * @package Text_Diff\n * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>\n *\n * @access private\n */\nclass Text_Diff_Op_copy extends Text_Diff_Op {\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $orig, $final = false )\n    {\n        if (!is_array($final)) {\n            $final = $orig;\n        }\n        $this->orig = $orig;\n        $this->final = $final;\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Text_Diff_Op_copy( $orig, $final = false ) {\n\t\tself::__construct( $orig, $final );\n\t}\n\n    function &reverse()\n    {\n        $reverse = new Text_Diff_Op_copy($this->final, $this->orig);\n        return $reverse;\n    }\n\n}\n\n/**\n * @package Text_Diff\n * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>\n *\n * @access private\n */\nclass Text_Diff_Op_delete extends Text_Diff_Op {\n\n\t/**\n\t * PHP5 constructor.\n\t */\n\tfunction __construct( $lines )\n    {\n        $this->orig = $lines;\n        $this->final = false;\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Text_Diff_Op_delete( $lines ) {\n\t\tself::__construct( $lines );\n\t}\n\n    function &reverse()\n    {\n        $reverse = new Text_Diff_Op_add($this->orig);\n        return $reverse;\n    }\n\n}\n\n/**\n * @package Text_Diff\n * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>\n *\n * @access private\n */\nclass Text_Diff_Op_add extends Text_Diff_Op {\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $lines )\n    {\n        $this->final = $lines;\n        $this->orig = false;\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Text_Diff_Op_add( $lines ) {\n\t\tself::__construct( $lines );\n\t}\n\n    function &reverse()\n    {\n        $reverse = new Text_Diff_Op_delete($this->final);\n        return $reverse;\n    }\n\n}\n\n/**\n * @package Text_Diff\n * @author  Geoffrey T. Dairiki <dairiki@dairiki.org>\n *\n * @access private\n */\nclass Text_Diff_Op_change extends Text_Diff_Op {\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $orig, $final )\n    {\n        $this->orig = $orig;\n        $this->final = $final;\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Text_Diff_Op_change( $orig, $final ) {\n\t\tself::__construct( $orig, $final );\n\t}\n\n    function &reverse()\n    {\n        $reverse = new Text_Diff_Op_change($this->final, $this->orig);\n        return $reverse;\n    }\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/admin-bar.php",
    "content": "<?php\n/**\n * Toolbar API: Top-level Toolbar functionality\n *\n * @package WordPress\n * @subpackage Toolbar\n * @since 3.1.0\n */\n\n/**\n * Instantiate the admin bar object and set it up as a global for access elsewhere.\n *\n * UNHOOKING THIS FUNCTION WILL NOT PROPERLY REMOVE THE ADMIN BAR.\n * For that, use show_admin_bar(false) or the 'show_admin_bar' filter.\n *\n * @since 3.1.0\n * @access private\n *\n * @global WP_Admin_Bar $wp_admin_bar\n *\n * @return bool Whether the admin bar was successfully initialized.\n */\nfunction _wp_admin_bar_init() {\n\tglobal $wp_admin_bar;\n\n\tif ( ! is_admin_bar_showing() )\n\t\treturn false;\n\n\t/* Load the admin bar class code ready for instantiation */\n\trequire_once( ABSPATH . WPINC . '/class-wp-admin-bar.php' );\n\n\t/* Instantiate the admin bar */\n\n\t/**\n\t * Filter the admin bar class to instantiate.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $wp_admin_bar_class Admin bar class to use. Default 'WP_Admin_Bar'.\n\t */\n\t$admin_bar_class = apply_filters( 'wp_admin_bar_class', 'WP_Admin_Bar' );\n\tif ( class_exists( $admin_bar_class ) )\n\t\t$wp_admin_bar = new $admin_bar_class;\n\telse\n\t\treturn false;\n\n\t$wp_admin_bar->initialize();\n\t$wp_admin_bar->add_menus();\n\n\treturn true;\n}\n\n/**\n * Render the admin bar to the page based on the $wp_admin_bar->menu member var.\n * This is called very late on the footer actions so that it will render after anything else being\n * added to the footer.\n *\n * It includes the action \"admin_bar_menu\" which should be used to hook in and\n * add new menus to the admin bar. That way you can be sure that you are adding at most optimal point,\n * right before the admin bar is rendered. This also gives you access to the $post global, among others.\n *\n * @since 3.1.0\n *\n * @global WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_render() {\n\tglobal $wp_admin_bar;\n\n\tif ( ! is_admin_bar_showing() || ! is_object( $wp_admin_bar ) )\n\t\treturn;\n\n\t/**\n\t * Load all necessary admin bar items.\n\t *\n\t * This is the hook used to add, remove, or manipulate admin bar items.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference\n\t */\n\tdo_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) );\n\n\t/**\n\t * Fires before the admin bar is rendered.\n\t *\n\t * @since 3.1.0\n\t */\n\tdo_action( 'wp_before_admin_bar_render' );\n\n\t$wp_admin_bar->render();\n\n\t/**\n\t * Fires after the admin bar is rendered.\n\t *\n\t * @since 3.1.0\n\t */\n\tdo_action( 'wp_after_admin_bar_render' );\n}\n\n/**\n * Add the WordPress logo menu.\n *\n * @since 3.3.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_wp_menu( $wp_admin_bar ) {\n\t$wp_admin_bar->add_menu( array(\n\t\t'id'    => 'wp-logo',\n\t\t'title' => '<span class=\"ab-icon\"></span><span class=\"screen-reader-text\">' . __( 'About WordPress' ) . '</span>',\n\t\t'href'  => self_admin_url( 'about.php' ),\n\t) );\n\n\tif ( is_user_logged_in() ) {\n\t\t// Add \"About WordPress\" link\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'wp-logo',\n\t\t\t'id'     => 'about',\n\t\t\t'title'  => __('About WordPress'),\n\t\t\t'href'   => self_admin_url( 'about.php' ),\n\t\t) );\n\t}\n\n\t// Add WordPress.org link\n\t$wp_admin_bar->add_menu( array(\n\t\t'parent'    => 'wp-logo-external',\n\t\t'id'        => 'wporg',\n\t\t'title'     => __('WordPress.org'),\n\t\t'href'      => __('https://wordpress.org/'),\n\t) );\n\n\t// Add codex link\n\t$wp_admin_bar->add_menu( array(\n\t\t'parent'    => 'wp-logo-external',\n\t\t'id'        => 'documentation',\n\t\t'title'     => __('Documentation'),\n\t\t'href'      => __('https://codex.wordpress.org/'),\n\t) );\n\n\t// Add forums link\n\t$wp_admin_bar->add_menu( array(\n\t\t'parent'    => 'wp-logo-external',\n\t\t'id'        => 'support-forums',\n\t\t'title'     => __('Support Forums'),\n\t\t'href'      => __('https://wordpress.org/support/'),\n\t) );\n\n\t// Add feedback link\n\t$wp_admin_bar->add_menu( array(\n\t\t'parent'    => 'wp-logo-external',\n\t\t'id'        => 'feedback',\n\t\t'title'     => __('Feedback'),\n\t\t'href'      => __('https://wordpress.org/support/forum/requests-and-feedback'),\n\t) );\n}\n\n/**\n * Add the sidebar toggle button.\n *\n * @since 3.8.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_sidebar_toggle( $wp_admin_bar ) {\n\tif ( is_admin() ) {\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'id'    => 'menu-toggle',\n\t\t\t'title' => '<span class=\"ab-icon\"></span><span class=\"screen-reader-text\">' . __( 'Menu' ) . '</span>',\n\t\t\t'href'  => '#',\n\t\t) );\n\t}\n}\n\n/**\n * Add the \"My Account\" item.\n *\n * @since 3.3.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_my_account_item( $wp_admin_bar ) {\n\t$user_id      = get_current_user_id();\n\t$current_user = wp_get_current_user();\n\n\tif ( ! $user_id )\n\t\treturn;\n\n\tif ( current_user_can( 'read' ) ) {\n\t\t$profile_url = get_edit_profile_url( $user_id );\n\t} elseif ( is_multisite() ) {\n\t\t$profile_url = get_dashboard_url( $user_id, 'profile.php' );\n\t} else {\n\t\t$profile_url = false;\n\t}\n\n\t$avatar = get_avatar( $user_id, 26 );\n\t$howdy  = sprintf( __('Howdy, %1$s'), $current_user->display_name );\n\t$class  = empty( $avatar ) ? '' : 'with-avatar';\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'id'        => 'my-account',\n\t\t'parent'    => 'top-secondary',\n\t\t'title'     => $howdy . $avatar,\n\t\t'href'      => $profile_url,\n\t\t'meta'      => array(\n\t\t\t'class'     => $class,\n\t\t),\n\t) );\n}\n\n/**\n * Add the \"My Account\" submenu items.\n *\n * @since 3.1.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_my_account_menu( $wp_admin_bar ) {\n\t$user_id      = get_current_user_id();\n\t$current_user = wp_get_current_user();\n\n\tif ( ! $user_id )\n\t\treturn;\n\n\tif ( current_user_can( 'read' ) ) {\n\t\t$profile_url = get_edit_profile_url( $user_id );\n\t} elseif ( is_multisite() ) {\n\t\t$profile_url = get_dashboard_url( $user_id, 'profile.php' );\n\t} else {\n\t\t$profile_url = false;\n\t}\n\n\t$wp_admin_bar->add_group( array(\n\t\t'parent' => 'my-account',\n\t\t'id'     => 'user-actions',\n\t) );\n\n\t$user_info  = get_avatar( $user_id, 64 );\n\t$user_info .= \"<span class='display-name'>{$current_user->display_name}</span>\";\n\n\tif ( $current_user->display_name !== $current_user->user_login )\n\t\t$user_info .= \"<span class='username'>{$current_user->user_login}</span>\";\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'parent' => 'user-actions',\n\t\t'id'     => 'user-info',\n\t\t'title'  => $user_info,\n\t\t'href'   => $profile_url,\n\t\t'meta'   => array(\n\t\t\t'tabindex' => -1,\n\t\t),\n\t) );\n\n\tif ( false !== $profile_url ) {\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'user-actions',\n\t\t\t'id'     => 'edit-profile',\n\t\t\t'title'  => __( 'Edit My Profile' ),\n\t\t\t'href'   => $profile_url,\n\t\t) );\n\t}\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'parent' => 'user-actions',\n\t\t'id'     => 'logout',\n\t\t'title'  => __( 'Log Out' ),\n\t\t'href'   => wp_logout_url(),\n\t) );\n}\n\n/**\n * Add the \"Site Name\" menu.\n *\n * @since 3.3.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_site_menu( $wp_admin_bar ) {\n\t// Don't show for logged out users.\n\tif ( ! is_user_logged_in() )\n\t\treturn;\n\n\t// Show only when the user is a member of this site, or they're a super admin.\n\tif ( ! is_user_member_of_blog() && ! is_super_admin() )\n\t\treturn;\n\n\t$blogname = get_bloginfo('name');\n\n\tif ( ! $blogname ) {\n\t\t$blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() );\n\t}\n\n\tif ( is_network_admin() ) {\n\t\t$blogname = sprintf( __('Network Admin: %s'), esc_html( get_current_site()->site_name ) );\n\t} elseif ( is_user_admin() ) {\n\t\t$blogname = sprintf( __('User Dashboard: %s'), esc_html( get_current_site()->site_name ) );\n\t}\n\n\t$title = wp_html_excerpt( $blogname, 40, '&hellip;' );\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'id'    => 'site-name',\n\t\t'title' => $title,\n\t\t'href'  => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(),\n\t) );\n\n\t// Create submenu items.\n\n\tif ( is_admin() ) {\n\t\t// Add an option to visit the site.\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'site-name',\n\t\t\t'id'     => 'view-site',\n\t\t\t'title'  => __( 'Visit Site' ),\n\t\t\t'href'   => home_url( '/' ),\n\t\t) );\n\n\t\tif ( is_blog_admin() && is_multisite() && current_user_can( 'manage_sites' ) ) {\n\t\t\t$wp_admin_bar->add_menu( array(\n\t\t\t\t'parent' => 'site-name',\n\t\t\t\t'id'     => 'edit-site',\n\t\t\t\t'title'  => __( 'Edit Site' ),\n\t\t\t\t'href'   => network_admin_url( 'site-info.php?id=' . get_current_blog_id() ),\n\t\t\t) );\n\t\t}\n\n\t} else if ( current_user_can( 'read' ) ) {\n\t\t// We're on the front end, link to the Dashboard.\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'site-name',\n\t\t\t'id'     => 'dashboard',\n\t\t\t'title'  => __( 'Dashboard' ),\n\t\t\t'href'   => admin_url(),\n\t\t) );\n\n\t\t// Add the appearance submenu items.\n\t\twp_admin_bar_appearance_menu( $wp_admin_bar );\n\t}\n}\n\n/**\n * Adds the \"Customize\" link to the Toolbar.\n *\n * @since 4.3.0\n *\n * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance.\n */\nfunction wp_admin_bar_customize_menu( $wp_admin_bar ) {\n\t// Don't show for users who can't access the customizer or when in the admin.\n\tif ( ! current_user_can( 'customize' ) || is_admin() ) {\n\t\treturn;\n\t}\n\n\t$current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];\n\t$customize_url = add_query_arg( 'url', urlencode( $current_url ), wp_customize_url() );\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'id'     => 'customize',\n\t\t'title'  => __( 'Customize' ),\n\t\t'href'   => $customize_url,\n\t\t'meta'   => array(\n\t\t\t'class' => 'hide-if-no-customize',\n\t\t),\n\t) );\n\tadd_action( 'wp_before_admin_bar_render', 'wp_customize_support_script' );\n}\n\n/**\n * Add the \"My Sites/[Site Name]\" menu and all submenus.\n *\n * @since 3.1.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_my_sites_menu( $wp_admin_bar ) {\n\t// Don't show for logged out users or single site mode.\n\tif ( ! is_user_logged_in() || ! is_multisite() )\n\t\treturn;\n\n\t// Show only when the user has at least one site, or they're a super admin.\n\tif ( count( $wp_admin_bar->user->blogs ) < 1 && ! is_super_admin() )\n\t\treturn;\n\n\tif ( $wp_admin_bar->user->active_blog ) {\n\t\t$my_sites_url = get_admin_url( $wp_admin_bar->user->active_blog->blog_id, 'my-sites.php' );\n\t} else {\n\t\t$my_sites_url = admin_url( 'my-sites.php' );\n\t}\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'id'    => 'my-sites',\n\t\t'title' => __( 'My Sites' ),\n\t\t'href'  => $my_sites_url,\n\t) );\n\n\tif ( is_super_admin() ) {\n\t\t$wp_admin_bar->add_group( array(\n\t\t\t'parent' => 'my-sites',\n\t\t\t'id'     => 'my-sites-super-admin',\n\t\t) );\n\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'my-sites-super-admin',\n\t\t\t'id'     => 'network-admin',\n\t\t\t'title'  => __('Network Admin'),\n\t\t\t'href'   => network_admin_url(),\n\t\t) );\n\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'network-admin',\n\t\t\t'id'     => 'network-admin-d',\n\t\t\t'title'  => __( 'Dashboard' ),\n\t\t\t'href'   => network_admin_url(),\n\t\t) );\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'network-admin',\n\t\t\t'id'     => 'network-admin-s',\n\t\t\t'title'  => __( 'Sites' ),\n\t\t\t'href'   => network_admin_url( 'sites.php' ),\n\t\t) );\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'network-admin',\n\t\t\t'id'     => 'network-admin-u',\n\t\t\t'title'  => __( 'Users' ),\n\t\t\t'href'   => network_admin_url( 'users.php' ),\n\t\t) );\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'network-admin',\n\t\t\t'id'     => 'network-admin-t',\n\t\t\t'title'  => __( 'Themes' ),\n\t\t\t'href'   => network_admin_url( 'themes.php' ),\n\t\t) );\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'network-admin',\n\t\t\t'id'     => 'network-admin-p',\n\t\t\t'title'  => __( 'Plugins' ),\n\t\t\t'href'   => network_admin_url( 'plugins.php' ),\n\t\t) );\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'network-admin',\n\t\t\t'id'     => 'network-admin-o',\n\t\t\t'title'  => __( 'Settings' ),\n\t\t\t'href'   => network_admin_url( 'settings.php' ),\n\t\t) );\n\t}\n\n\t// Add site links\n\t$wp_admin_bar->add_group( array(\n\t\t'parent' => 'my-sites',\n\t\t'id'     => 'my-sites-list',\n\t\t'meta'   => array(\n\t\t\t'class' => is_super_admin() ? 'ab-sub-secondary' : '',\n\t\t),\n\t) );\n\n\tforeach ( (array) $wp_admin_bar->user->blogs as $blog ) {\n\t\tswitch_to_blog( $blog->userblog_id );\n\n\t\t$blavatar = '<div class=\"blavatar\"></div>';\n\n\t\t$blogname = $blog->blogname;\n\n\t\tif ( ! $blogname ) {\n\t\t\t$blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() );\n\t\t}\n\n\t\t$menu_id  = 'blog-' . $blog->userblog_id;\n\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent'    => 'my-sites-list',\n\t\t\t'id'        => $menu_id,\n\t\t\t'title'     => $blavatar . $blogname,\n\t\t\t'href'      => admin_url(),\n\t\t) );\n\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => $menu_id,\n\t\t\t'id'     => $menu_id . '-d',\n\t\t\t'title'  => __( 'Dashboard' ),\n\t\t\t'href'   => admin_url(),\n\t\t) );\n\n\t\tif ( current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) {\n\t\t\t$wp_admin_bar->add_menu( array(\n\t\t\t\t'parent' => $menu_id,\n\t\t\t\t'id'     => $menu_id . '-n',\n\t\t\t\t'title'  => __( 'New Post' ),\n\t\t\t\t'href'   => admin_url( 'post-new.php' ),\n\t\t\t) );\n\t\t}\n\n\t\tif ( current_user_can( 'edit_posts' ) ) {\n\t\t\t$wp_admin_bar->add_menu( array(\n\t\t\t\t'parent' => $menu_id,\n\t\t\t\t'id'     => $menu_id . '-c',\n\t\t\t\t'title'  => __( 'Manage Comments' ),\n\t\t\t\t'href'   => admin_url( 'edit-comments.php' ),\n\t\t\t) );\n\t\t}\n\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => $menu_id,\n\t\t\t'id'     => $menu_id . '-v',\n\t\t\t'title'  => __( 'Visit Site' ),\n\t\t\t'href'   => home_url( '/' ),\n\t\t) );\n\n\t\trestore_current_blog();\n\t}\n}\n\n/**\n * Provide a shortlink.\n *\n * @since 3.1.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_shortlink_menu( $wp_admin_bar ) {\n\t$short = wp_get_shortlink( 0, 'query' );\n\t$id = 'get-shortlink';\n\n\tif ( empty( $short ) )\n\t\treturn;\n\n\t$html = '<input class=\"shortlink-input\" type=\"text\" readonly=\"readonly\" value=\"' . esc_attr( $short ) . '\" />';\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'id' => $id,\n\t\t'title' => __( 'Shortlink' ),\n\t\t'href' => $short,\n\t\t'meta' => array( 'html' => $html ),\n\t) );\n}\n\n/**\n * Provide an edit link for posts and terms.\n *\n * @since 3.1.0\n *\n * @global WP_Term  $tag\n * @global WP_Query $wp_the_query\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_edit_menu( $wp_admin_bar ) {\n\tglobal $tag, $wp_the_query;\n\n\tif ( is_admin() ) {\n\t\t$current_screen = get_current_screen();\n\t\t$post = get_post();\n\n\t\tif ( 'post' == $current_screen->base\n\t\t\t&& 'add' != $current_screen->action\n\t\t\t&& ( $post_type_object = get_post_type_object( $post->post_type ) )\n\t\t\t&& current_user_can( 'read_post', $post->ID )\n\t\t\t&& ( $post_type_object->public )\n\t\t\t&& ( $post_type_object->show_in_admin_bar ) )\n\t\t{\n\t\t\tif ( 'draft' == $post->post_status ) {\n\t\t\t\t$draft_link = set_url_scheme( get_permalink( $post->ID ) );\n\t\t\t\t$preview_link = get_preview_post_link( $post, array(), $draft_link );\n\t\t\t\t$wp_admin_bar->add_menu( array(\n\t\t\t\t\t'id' => 'preview',\n\t\t\t\t\t'title' => $post_type_object->labels->view_item,\n\t\t\t\t\t'href' => esc_url( $preview_link ),\n\t\t\t\t\t'meta' => array( 'target' => 'wp-preview-' . $post->ID ),\n\t\t\t\t) );\n\t\t\t} else {\n\t\t\t\t$wp_admin_bar->add_menu( array(\n\t\t\t\t\t'id' => 'view',\n\t\t\t\t\t'title' => $post_type_object->labels->view_item,\n\t\t\t\t\t'href' => get_permalink( $post->ID )\n\t\t\t\t) );\n\t\t\t}\n\t\t} elseif ( 'edit-tags' == $current_screen->base\n\t\t\t&& isset( $tag ) && is_object( $tag )\n\t\t\t&& ( $tax = get_taxonomy( $tag->taxonomy ) )\n\t\t\t&& $tax->public )\n\t\t{\n\t\t\t$wp_admin_bar->add_menu( array(\n\t\t\t\t'id' => 'view',\n\t\t\t\t'title' => $tax->labels->view_item,\n\t\t\t\t'href' => get_term_link( $tag )\n\t\t\t) );\n\t\t}\n\t} else {\n\t\t$current_object = $wp_the_query->get_queried_object();\n\n\t\tif ( empty( $current_object ) )\n\t\t\treturn;\n\n\t\tif ( ! empty( $current_object->post_type )\n\t\t\t&& ( $post_type_object = get_post_type_object( $current_object->post_type ) )\n\t\t\t&& current_user_can( 'edit_post', $current_object->ID )\n\t\t\t&& $post_type_object->show_in_admin_bar\n\t\t\t&& $edit_post_link = get_edit_post_link( $current_object->ID ) )\n\t\t{\n\t\t\t$wp_admin_bar->add_menu( array(\n\t\t\t\t'id' => 'edit',\n\t\t\t\t'title' => $post_type_object->labels->edit_item,\n\t\t\t\t'href' => $edit_post_link\n\t\t\t) );\n\t\t} elseif ( ! empty( $current_object->taxonomy )\n\t\t\t&& ( $tax = get_taxonomy( $current_object->taxonomy ) )\n\t\t\t&& current_user_can( $tax->cap->edit_terms )\n\t\t\t&& $edit_term_link = get_edit_term_link( $current_object->term_id, $current_object->taxonomy ) )\n\t\t{\n\t\t\t$wp_admin_bar->add_menu( array(\n\t\t\t\t'id' => 'edit',\n\t\t\t\t'title' => $tax->labels->edit_item,\n\t\t\t\t'href' => $edit_term_link\n\t\t\t) );\n\t\t}\n\t}\n}\n\n/**\n * Add \"Add New\" menu.\n *\n * @since 3.1.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_new_content_menu( $wp_admin_bar ) {\n\t$actions = array();\n\n\t$cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' );\n\n\tif ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->create_posts ) )\n\t\t$actions[ 'post-new.php' ] = array( $cpts['post']->labels->name_admin_bar, 'new-post' );\n\n\tif ( isset( $cpts['attachment'] ) && current_user_can( 'upload_files' ) )\n\t\t$actions[ 'media-new.php' ] = array( $cpts['attachment']->labels->name_admin_bar, 'new-media' );\n\n\tif ( current_user_can( 'manage_links' ) )\n\t\t$actions[ 'link-add.php' ] = array( _x( 'Link', 'add new from admin bar' ), 'new-link' );\n\n\tif ( isset( $cpts['page'] ) && current_user_can( $cpts['page']->cap->create_posts ) )\n\t\t$actions[ 'post-new.php?post_type=page' ] = array( $cpts['page']->labels->name_admin_bar, 'new-page' );\n\n\tunset( $cpts['post'], $cpts['page'], $cpts['attachment'] );\n\n\t// Add any additional custom post types.\n\tforeach ( $cpts as $cpt ) {\n\t\tif ( ! current_user_can( $cpt->cap->create_posts ) )\n\t\t\tcontinue;\n\n\t\t$key = 'post-new.php?post_type=' . $cpt->name;\n\t\t$actions[ $key ] = array( $cpt->labels->name_admin_bar, 'new-' . $cpt->name );\n\t}\n\t// Avoid clash with parent node and a 'content' post type.\n\tif ( isset( $actions['post-new.php?post_type=content'] ) )\n\t\t$actions['post-new.php?post_type=content'][1] = 'add-new-content';\n\n\tif ( current_user_can( 'create_users' ) || current_user_can( 'promote_users' ) )\n\t\t$actions[ 'user-new.php' ] = array( _x( 'User', 'add new from admin bar' ), 'new-user' );\n\n\tif ( ! $actions )\n\t\treturn;\n\n\t$title = '<span class=\"ab-icon\"></span><span class=\"ab-label\">' . _x( 'New', 'admin bar menu group label' ) . '</span>';\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'id'    => 'new-content',\n\t\t'title' => $title,\n\t\t'href'  => admin_url( current( array_keys( $actions ) ) ),\n\t) );\n\n\tforeach ( $actions as $link => $action ) {\n\t\tlist( $title, $id ) = $action;\n\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent'    => 'new-content',\n\t\t\t'id'        => $id,\n\t\t\t'title'     => $title,\n\t\t\t'href'      => admin_url( $link )\n\t\t) );\n\t}\n}\n\n/**\n * Add edit comments link with awaiting moderation count bubble.\n *\n * @since 3.1.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_comments_menu( $wp_admin_bar ) {\n\tif ( !current_user_can('edit_posts') )\n\t\treturn;\n\n\t$awaiting_mod = wp_count_comments();\n\t$awaiting_mod = $awaiting_mod->moderated;\n\t$awaiting_title = esc_attr( sprintf( _n( '%s comment awaiting moderation', '%s comments awaiting moderation', $awaiting_mod ), number_format_i18n( $awaiting_mod ) ) );\n\n\t$icon  = '<span class=\"ab-icon\"></span>';\n\t$title = '<span id=\"ab-awaiting-mod\" class=\"ab-label awaiting-mod pending-count count-' . $awaiting_mod . '\">' . number_format_i18n( $awaiting_mod ) . '</span>';\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'id'    => 'comments',\n\t\t'title' => $icon . $title,\n\t\t'href'  => admin_url('edit-comments.php'),\n\t\t'meta'  => array( 'title' => $awaiting_title ),\n\t) );\n}\n\n/**\n * Add appearance submenu items to the \"Site Name\" menu.\n *\n * @since 3.1.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_appearance_menu( $wp_admin_bar ) {\n\t$wp_admin_bar->add_group( array( 'parent' => 'site-name', 'id' => 'appearance' ) );\n\n\tif ( current_user_can( 'switch_themes' ) ) {\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'appearance',\n\t\t\t'id'     => 'themes',\n\t\t\t'title'  => __( 'Themes' ),\n\t\t\t'href'   => admin_url( 'themes.php' ),\n\t\t) );\n\t}\n\n\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\treturn;\n\t}\n\n\tif ( current_theme_supports( 'widgets' )  ) {\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'appearance',\n\t\t\t'id'     => 'widgets',\n\t\t\t'title'  => __( 'Widgets' ),\n\t\t\t'href'   => admin_url( 'widgets.php' ),\n\t\t) );\n\t}\n\n\tif ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) )\n\t\t$wp_admin_bar->add_menu( array( 'parent' => 'appearance', 'id' => 'menus', 'title' => __('Menus'), 'href' => admin_url('nav-menus.php') ) );\n\n\tif ( current_theme_supports( 'custom-background' ) ) {\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'appearance',\n\t\t\t'id'     => 'background',\n\t\t\t'title'  => __( 'Background' ),\n\t\t\t'href'   => admin_url( 'themes.php?page=custom-background' ),\n\t\t\t'meta'   => array(\n\t\t\t\t'class' => 'hide-if-customize',\n\t\t\t),\n\t\t) );\n\t}\n\n\tif ( current_theme_supports( 'custom-header' ) ) {\n\t\t$wp_admin_bar->add_menu( array(\n\t\t\t'parent' => 'appearance',\n\t\t\t'id'     => 'header',\n\t\t\t'title'  => __( 'Header' ),\n\t\t\t'href'   => admin_url( 'themes.php?page=custom-header' ),\n\t\t\t'meta'   => array(\n\t\t\t\t'class' => 'hide-if-customize',\n\t\t\t),\n\t\t) );\n\t}\n\n}\n\n/**\n * Provide an update link if theme/plugin/core updates are available.\n *\n * @since 3.1.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_updates_menu( $wp_admin_bar ) {\n\n\t$update_data = wp_get_update_data();\n\n\tif ( !$update_data['counts']['total'] )\n\t\treturn;\n\n\t$title = '<span class=\"ab-icon\"></span><span class=\"ab-label\">' . number_format_i18n( $update_data['counts']['total'] ) . '</span>';\n\t$title .= '<span class=\"screen-reader-text\">' . $update_data['title'] . '</span>';\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'id'    => 'updates',\n\t\t'title' => $title,\n\t\t'href'  => network_admin_url( 'update-core.php' ),\n\t\t'meta'  => array(\n\t\t\t'title' => $update_data['title'],\n\t\t),\n\t) );\n}\n\n/**\n * Add search form.\n *\n * @since 3.3.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_search_menu( $wp_admin_bar ) {\n\tif ( is_admin() )\n\t\treturn;\n\n\t$form  = '<form action=\"' . esc_url( home_url( '/' ) ) . '\" method=\"get\" id=\"adminbarsearch\">';\n\t$form .= '<input class=\"adminbar-input\" name=\"s\" id=\"adminbar-search\" type=\"text\" value=\"\" maxlength=\"150\" />';\n\t$form .= '<label for=\"adminbar-search\" class=\"screen-reader-text\">' . __( 'Search' ) . '</label>';\n\t$form .= '<input type=\"submit\" class=\"adminbar-button\" value=\"' . __('Search') . '\"/>';\n\t$form .= '</form>';\n\n\t$wp_admin_bar->add_menu( array(\n\t\t'parent' => 'top-secondary',\n\t\t'id'     => 'search',\n\t\t'title'  => $form,\n\t\t'meta'   => array(\n\t\t\t'class'    => 'admin-bar-search',\n\t\t\t'tabindex' => -1,\n\t\t)\n\t) );\n}\n\n/**\n * Add secondary menus.\n *\n * @since 3.3.0\n *\n * @param WP_Admin_Bar $wp_admin_bar\n */\nfunction wp_admin_bar_add_secondary_groups( $wp_admin_bar ) {\n\t$wp_admin_bar->add_group( array(\n\t\t'id'     => 'top-secondary',\n\t\t'meta'   => array(\n\t\t\t'class' => 'ab-top-secondary',\n\t\t),\n\t) );\n\n\t$wp_admin_bar->add_group( array(\n\t\t'parent' => 'wp-logo',\n\t\t'id'     => 'wp-logo-external',\n\t\t'meta'   => array(\n\t\t\t'class' => 'ab-sub-secondary',\n\t\t),\n\t) );\n}\n\n/**\n * Style and scripts for the admin bar.\n *\n * @since 3.1.0\n */\nfunction wp_admin_bar_header() { ?>\n<style type=\"text/css\" media=\"print\">#wpadminbar { display:none; }</style>\n<?php\n}\n\n/**\n * Default admin bar callback.\n *\n * @since 3.1.0\n */\nfunction _admin_bar_bump_cb() { ?>\n<style type=\"text/css\" media=\"screen\">\n\thtml { margin-top: 32px !important; }\n\t* html body { margin-top: 32px !important; }\n\t@media screen and ( max-width: 782px ) {\n\t\thtml { margin-top: 46px !important; }\n\t\t* html body { margin-top: 46px !important; }\n\t}\n</style>\n<?php\n}\n\n/**\n * Set the display status of the admin bar.\n *\n * This can be called immediately upon plugin load. It does not need to be called from a function hooked to the init action.\n *\n * @since 3.1.0\n *\n * @global WP_Admin_Bar $wp_admin_bar\n *\n * @param bool $show Whether to allow the admin bar to show.\n */\nfunction show_admin_bar( $show ) {\n\tglobal $show_admin_bar;\n\t$show_admin_bar = (bool) $show;\n}\n\n/**\n * Determine whether the admin bar should be showing.\n *\n * @since 3.1.0\n *\n * @global WP_Admin_Bar $wp_admin_bar\n * @global string       $pagenow\n *\n * @return bool Whether the admin bar should be showing.\n */\nfunction is_admin_bar_showing() {\n\tglobal $show_admin_bar, $pagenow;\n\n\t// For all these types of requests, we never want an admin bar.\n\tif ( defined('XMLRPC_REQUEST') || defined('DOING_AJAX') || defined('IFRAME_REQUEST') )\n\t\treturn false;\n\n\tif ( is_embed() ) {\n\t\treturn false;\n\t}\n\n\t// Integrated into the admin.\n\tif ( is_admin() )\n\t\treturn true;\n\n\tif ( ! isset( $show_admin_bar ) ) {\n\t\tif ( ! is_user_logged_in() || 'wp-login.php' == $pagenow ) {\n\t\t\t$show_admin_bar = false;\n\t\t} else {\n\t\t\t$show_admin_bar = _get_admin_bar_pref();\n\t\t}\n\t}\n\n\t/**\n\t * Filter whether to show the admin bar.\n\t *\n\t * Returning false to this hook is the recommended way to hide the admin bar.\n\t * The user's display preference is used for logged in users.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool $show_admin_bar Whether the admin bar should be shown. Default false.\n\t */\n\t$show_admin_bar = apply_filters( 'show_admin_bar', $show_admin_bar );\n\n\treturn $show_admin_bar;\n}\n\n/**\n * Retrieve the admin bar display preference of a user.\n *\n * @since 3.1.0\n * @access private\n *\n * @param string $context Context of this preference check. Defaults to 'front'. The 'admin'\n * \tpreference is no longer used.\n * @param int $user Optional. ID of the user to check, defaults to 0 for current user.\n * @return bool Whether the admin bar should be showing for this user.\n */\nfunction _get_admin_bar_pref( $context = 'front', $user = 0 ) {\n\t$pref = get_user_option( \"show_admin_bar_{$context}\", $user );\n\tif ( false === $pref )\n\t\treturn true;\n\n\treturn 'true' === $pref;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/atomlib.php",
    "content": "<?php\n/**\n * Atom Syndication Format PHP Library\n *\n * @package AtomLib\n * @link http://code.google.com/p/phpatomlib/\n *\n * @author Elias Torres <elias@torrez.us>\n * @version 0.4\n * @since 2.3.0\n */\n\n/**\n * Structure that store common Atom Feed Properties\n *\n * @package AtomLib\n */\nclass AtomFeed {\n\t/**\n\t * Stores Links\n\t * @var array\n\t * @access public\n\t */\n    var $links = array();\n    /**\n     * Stores Categories\n     * @var array\n     * @access public\n     */\n    var $categories = array();\n\t/**\n\t * Stores Entries\n\t *\n\t * @var array\n\t * @access public\n\t */\n    var $entries = array();\n}\n\n/**\n * Structure that store Atom Entry Properties\n *\n * @package AtomLib\n */\nclass AtomEntry {\n\t/**\n\t * Stores Links\n\t * @var array\n\t * @access public\n\t */\n    var $links = array();\n    /**\n     * Stores Categories\n     * @var array\n\t * @access public\n     */\n    var $categories = array();\n}\n\n/**\n * AtomLib Atom Parser API\n *\n * @package AtomLib\n */\nclass AtomParser {\n\n    var $NS = 'http://www.w3.org/2005/Atom';\n    var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights');\n    var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft');\n\n    var $debug = false;\n\n    var $depth = 0;\n    var $indent = 2;\n    var $in_content;\n    var $ns_contexts = array();\n    var $ns_decls = array();\n    var $content_ns_decls = array();\n    var $content_ns_contexts = array();\n    var $is_xhtml = false;\n    var $is_html = false;\n    var $is_text = true;\n    var $skipped_div = false;\n\n    var $FILE = \"php://input\";\n\n    var $feed;\n    var $current;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct() {\n\n        $this->feed = new AtomFeed();\n        $this->current = null;\n        $this->map_attrs_func = create_function('$k,$v', 'return \"$k=\\\"$v\\\"\";');\n        $this->map_xmlns_func = create_function('$p,$n', '$xd = \"xmlns\"; if(strlen($n[0])>0) $xd .= \":{$n[0]}\"; return \"{$xd}=\\\"{$n[1]}\\\"\";');\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function AtomParser() {\n\t\tself::__construct();\n\t}\n\n    function _p($msg) {\n        if($this->debug) {\n            print str_repeat(\" \", $this->depth * $this->indent) . $msg .\"\\n\";\n        }\n    }\n\n    function error_handler($log_level, $log_text, $error_file, $error_line) {\n        $this->error = $log_text;\n    }\n\n    function parse() {\n\n        set_error_handler(array(&$this, 'error_handler'));\n\n        array_unshift($this->ns_contexts, array());\n\n        $parser = xml_parser_create_ns();\n        xml_set_object($parser, $this);\n        xml_set_element_handler($parser, \"start_element\", \"end_element\");\n        xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);\n        xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);\n        xml_set_character_data_handler($parser, \"cdata\");\n        xml_set_default_handler($parser, \"_default\");\n        xml_set_start_namespace_decl_handler($parser, \"start_ns\");\n        xml_set_end_namespace_decl_handler($parser, \"end_ns\");\n\n        $this->content = '';\n\n        $ret = true;\n\n        $fp = fopen($this->FILE, \"r\");\n        while ($data = fread($fp, 4096)) {\n            if($this->debug) $this->content .= $data;\n\n            if(!xml_parse($parser, $data, feof($fp))) {\n                /* translators: 1: error message, 2: line number */\n                trigger_error(sprintf(__('XML Error: %1$s at line %2$s').\"\\n\",\n                    xml_error_string(xml_get_error_code($parser)),\n                    xml_get_current_line_number($parser)));\n                $ret = false;\n                break;\n            }\n        }\n        fclose($fp);\n\n        xml_parser_free($parser);\n\n        restore_error_handler();\n\n        return $ret;\n    }\n\n    function start_element($parser, $name, $attrs) {\n\n        $tag = array_pop(split(\":\", $name));\n\n        switch($name) {\n            case $this->NS . ':feed':\n                $this->current = $this->feed;\n                break;\n            case $this->NS . ':entry':\n                $this->current = new AtomEntry();\n                break;\n        };\n\n        $this->_p(\"start_element('$name')\");\n        #$this->_p(print_r($this->ns_contexts,true));\n        #$this->_p('current(' . $this->current . ')');\n\n        array_unshift($this->ns_contexts, $this->ns_decls);\n\n        $this->depth++;\n\n        if(!empty($this->in_content)) {\n\n            $this->content_ns_decls = array();\n\n            if($this->is_html || $this->is_text)\n                trigger_error(\"Invalid content in element found. Content must not be of type text or html if it contains markup.\");\n\n            $attrs_prefix = array();\n\n            // resolve prefixes for attributes\n            foreach($attrs as $key => $value) {\n                $with_prefix = $this->ns_to_prefix($key, true);\n                $attrs_prefix[$with_prefix[1]] = $this->xml_escape($value);\n            }\n\n            $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix)));\n            if(strlen($attrs_str) > 0) {\n                $attrs_str = \" \" . $attrs_str;\n            }\n\n            $with_prefix = $this->ns_to_prefix($name);\n\n            if(!$this->is_declared_content_ns($with_prefix[0])) {\n                array_push($this->content_ns_decls, $with_prefix[0]);\n            }\n\n            $xmlns_str = '';\n            if(count($this->content_ns_decls) > 0) {\n                array_unshift($this->content_ns_contexts, $this->content_ns_decls);\n                $xmlns_str .= join(' ', array_map($this->map_xmlns_func, array_keys($this->content_ns_contexts[0]), array_values($this->content_ns_contexts[0])));\n                if(strlen($xmlns_str) > 0) {\n                    $xmlns_str = \" \" . $xmlns_str;\n                }\n            }\n\n            array_push($this->in_content, array($tag, $this->depth, \"<\". $with_prefix[1] .\"{$xmlns_str}{$attrs_str}\" . \">\"));\n\n        } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) {\n            $this->in_content = array();\n            $this->is_xhtml = $attrs['type'] == 'xhtml';\n            $this->is_html = $attrs['type'] == 'html' || $attrs['type'] == 'text/html';\n            $this->is_text = !in_array('type',array_keys($attrs)) || $attrs['type'] == 'text';\n            $type = $this->is_xhtml ? 'XHTML' : ($this->is_html ? 'HTML' : ($this->is_text ? 'TEXT' : $attrs['type']));\n\n            if(in_array('src',array_keys($attrs))) {\n                $this->current->$tag = $attrs;\n            } else {\n                array_push($this->in_content, array($tag,$this->depth, $type));\n            }\n        } else if($tag == 'link') {\n            array_push($this->current->links, $attrs);\n        } else if($tag == 'category') {\n            array_push($this->current->categories, $attrs);\n        }\n\n        $this->ns_decls = array();\n    }\n\n    function end_element($parser, $name) {\n\n        $tag = array_pop(split(\":\", $name));\n\n        $ccount = count($this->in_content);\n\n        # if we are *in* content, then let's proceed to serialize it\n        if(!empty($this->in_content)) {\n            # if we are ending the original content element\n            # then let's finalize the content\n            if($this->in_content[0][0] == $tag &&\n                $this->in_content[0][1] == $this->depth) {\n                $origtype = $this->in_content[0][2];\n                array_shift($this->in_content);\n                $newcontent = array();\n                foreach($this->in_content as $c) {\n                    if(count($c) == 3) {\n                        array_push($newcontent, $c[2]);\n                    } else {\n                        if($this->is_xhtml || $this->is_text) {\n                            array_push($newcontent, $this->xml_escape($c));\n                        } else {\n                            array_push($newcontent, $c);\n                        }\n                    }\n                }\n                if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS)) {\n                    $this->current->$tag = array($origtype, join('',$newcontent));\n                } else {\n                    $this->current->$tag = join('',$newcontent);\n                }\n                $this->in_content = array();\n            } else if($this->in_content[$ccount-1][0] == $tag &&\n                $this->in_content[$ccount-1][1] == $this->depth) {\n                $this->in_content[$ccount-1][2] = substr($this->in_content[$ccount-1][2],0,-1) . \"/>\";\n            } else {\n                # else, just finalize the current element's content\n                $endtag = $this->ns_to_prefix($name);\n                array_push($this->in_content, array($tag, $this->depth, \"</$endtag[1]>\"));\n            }\n        }\n\n        array_shift($this->ns_contexts);\n\n        $this->depth--;\n\n        if($name == ($this->NS . ':entry')) {\n            array_push($this->feed->entries, $this->current);\n            $this->current = null;\n        }\n\n        $this->_p(\"end_element('$name')\");\n    }\n\n    function start_ns($parser, $prefix, $uri) {\n        $this->_p(\"starting: \" . $prefix . \":\" . $uri);\n        array_push($this->ns_decls, array($prefix,$uri));\n    }\n\n    function end_ns($parser, $prefix) {\n        $this->_p(\"ending: #\" . $prefix . \"#\");\n    }\n\n    function cdata($parser, $data) {\n        $this->_p(\"data: #\" . str_replace(array(\"\\n\"), array(\"\\\\n\"), trim($data)) . \"#\");\n        if(!empty($this->in_content)) {\n            array_push($this->in_content, $data);\n        }\n    }\n\n    function _default($parser, $data) {\n        # when does this gets called?\n    }\n\n\n    function ns_to_prefix($qname, $attr=false) {\n        # split 'http://www.w3.org/1999/xhtml:div' into ('http','//www.w3.org/1999/xhtml','div')\n        $components = split(\":\", $qname);\n\n        # grab the last one (e.g 'div')\n        $name = array_pop($components);\n\n        if(!empty($components)) {\n            # re-join back the namespace component\n            $ns = join(\":\",$components);\n            foreach($this->ns_contexts as $context) {\n                foreach($context as $mapping) {\n                    if($mapping[1] == $ns && strlen($mapping[0]) > 0) {\n                        return array($mapping, \"$mapping[0]:$name\");\n                    }\n                }\n            }\n        }\n\n        if($attr) {\n            return array(null, $name);\n        } else {\n            foreach($this->ns_contexts as $context) {\n                foreach($context as $mapping) {\n                    if(strlen($mapping[0]) == 0) {\n                        return array($mapping, $name);\n                    }\n                }\n            }\n        }\n    }\n\n    function is_declared_content_ns($new_mapping) {\n        foreach($this->content_ns_contexts as $context) {\n            foreach($context as $mapping) {\n                if($new_mapping == $mapping) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    function xml_escape($string)\n    {\n             return str_replace(array('&','\"',\"'\",'<','>'),\n                array('&amp;','&quot;','&apos;','&lt;','&gt;'),\n                $string );\n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/author-template.php",
    "content": "<?php\n/**\n * Author Template functions for use in themes.\n *\n * These functions must be used within the WordPress Loop.\n *\n * @link https://codex.wordpress.org/Author_Templates\n *\n * @package WordPress\n * @subpackage Template\n */\n\n/**\n * Retrieve the author of the current post.\n *\n * @since 1.5.0\n *\n * @global object $authordata The current author's DB object.\n *\n * @param string $deprecated Deprecated.\n * @return string|null The author's display name.\n */\nfunction get_the_author($deprecated = '') {\n\tglobal $authordata;\n\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.1' );\n\n\t/**\n\t * Filter the display name of the current post's author.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $authordata->display_name The author's display name.\n\t */\n\treturn apply_filters('the_author', is_object($authordata) ? $authordata->display_name : null);\n}\n\n/**\n * Display the name of the author of the current post.\n *\n * The behavior of this function is based off of old functionality predating\n * get_the_author(). This function is not deprecated, but is designed to echo\n * the value from get_the_author() and as an result of any old theme that might\n * still use the old behavior will also pass the value from get_the_author().\n *\n * The normal, expected behavior of this function is to echo the author and not\n * return it. However, backwards compatibility has to be maintained.\n *\n * @since 0.71\n * @see get_the_author()\n * @link https://codex.wordpress.org/Template_Tags/the_author\n *\n * @param string $deprecated Deprecated.\n * @param string $deprecated_echo Deprecated. Use get_the_author(). Echo the string or return it.\n * @return string|null The author's display name, from get_the_author().\n */\nfunction the_author( $deprecated = '', $deprecated_echo = true ) {\n\tif ( ! empty( $deprecated ) ) {\n\t\t_deprecated_argument( __FUNCTION__, '2.1' );\n\t}\n\n\tif ( true !== $deprecated_echo ) {\n\t\t_deprecated_argument( __FUNCTION__, '1.5',\n\t\t\t/* translators: %s: get_the_author() */\n\t\t\tsprintf( __( 'Use %s instead if you do not want the value echoed.' ),\n\t\t\t\t'<code>get_the_author()</code>'\n\t\t\t)\n\t\t);\n\t}\n\n\tif ( $deprecated_echo ) {\n\t\techo get_the_author();\n\t}\n\n\treturn get_the_author();\n}\n\n/**\n * Retrieve the author who last edited the current post.\n *\n * @since 2.8.0\n *\n * @return string|void The author's display name.\n */\nfunction get_the_modified_author() {\n\tif ( $last_id = get_post_meta( get_post()->ID, '_edit_last', true) ) {\n\t\t$last_user = get_userdata($last_id);\n\n\t\t/**\n\t\t * Filter the display name of the author who last edited the current post.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param string $last_user->display_name The author's display name.\n\t\t */\n\t\treturn apply_filters('the_modified_author', $last_user->display_name);\n\t}\n}\n\n/**\n * Display the name of the author who last edited the current post,\n * if the author's ID is available.\n *\n * @since 2.8.0\n *\n * @see get_the_author()\n */\nfunction the_modified_author() {\n\techo get_the_modified_author();\n}\n\n/**\n * Retrieve the requested data of the author of the current post.\n * @link https://codex.wordpress.org/Template_Tags/the_author_meta\n * @since 2.8.0\n *\n * @global object $authordata The current author's DB object.\n *\n * @param string $field selects the field of the users record.\n * @param int $user_id Optional. User ID.\n * @return string The author's field from the current author's DB object.\n */\nfunction get_the_author_meta( $field = '', $user_id = false ) {\n\t$original_user_id = $user_id;\n\n\tif ( ! $user_id ) {\n\t\tglobal $authordata;\n\t\t$user_id = isset( $authordata->ID ) ? $authordata->ID : 0;\n\t} else {\n\t\t$authordata = get_userdata( $user_id );\n\t}\n\n\tif ( in_array( $field, array( 'login', 'pass', 'nicename', 'email', 'url', 'registered', 'activation_key', 'status' ) ) )\n\t\t$field = 'user_' . $field;\n\n\t$value = isset( $authordata->$field ) ? $authordata->$field : '';\n\n\t/**\n\t * Filter the value of the requested user metadata.\n\t *\n\t * The filter name is dynamic and depends on the $field parameter of the function.\n\t *\n\t * @since 2.8.0\n\t * @since 4.3.0 The `$original_user_id` parameter was added.\n\t *\n\t * @param string   $value            The value of the metadata.\n\t * @param int      $user_id          The user ID for the value.\n\t * @param int|bool $original_user_id The original user ID, as passed to the function.\n\t */\n\treturn apply_filters( 'get_the_author_' . $field, $value, $user_id, $original_user_id );\n}\n\n/**\n * Outputs the field from the user's DB object. Defaults to current post's author.\n *\n * @link https://codex.wordpress.org/Template_Tags/the_author_meta\n *\n * @since 2.8.0\n *\n * @param string $field selects the field of the users record.\n * @param int $user_id Optional. User ID.\n */\nfunction the_author_meta( $field = '', $user_id = false ) {\n\t$author_meta = get_the_author_meta( $field, $user_id );\n\n\t/**\n\t * The value of the requested user metadata.\n\t *\n\t * The filter name is dynamic and depends on the $field parameter of the function.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $author_meta The value of the metadata.\n\t * @param int    $user_id     The user ID.\n\t */\n\techo apply_filters( 'the_author_' . $field, $author_meta, $user_id );\n}\n\n/**\n * Retrieve either author's link or author's name.\n *\n * If the author has a home page set, return an HTML link, otherwise just return the\n * author's name.\n *\n * @return string|null An HTML link if the author's url exist in user meta,\n *                     else the result of get_the_author().\n */\nfunction get_the_author_link() {\n\tif ( get_the_author_meta('url') ) {\n\t\treturn '<a href=\"' . esc_url( get_the_author_meta('url') ) . '\" title=\"' . esc_attr( sprintf(__(\"Visit %s&#8217;s website\"), get_the_author()) ) . '\" rel=\"author external\">' . get_the_author() . '</a>';\n\t} else {\n\t\treturn get_the_author();\n\t}\n}\n\n/**\n * Display either author's link or author's name.\n *\n * If the author has a home page set, echo an HTML link, otherwise just echo the\n * author's name.\n *\n * @link https://codex.wordpress.org/Template_Tags/the_author_link\n *\n * @since 2.1.0\n */\nfunction the_author_link() {\n\techo get_the_author_link();\n}\n\n/**\n * Retrieve the number of posts by the author of the current post.\n *\n * @since 1.5.0\n *\n * @return int The number of posts by the author.\n */\nfunction get_the_author_posts() {\n\t$post = get_post();\n\tif ( ! $post ) {\n\t\treturn 0;\n\t}\n\treturn count_user_posts( $post->post_author, $post->post_type );\n}\n\n/**\n * Display the number of posts by the author of the current post.\n *\n * @link https://codex.wordpress.org/Template_Tags/the_author_posts\n * @since 0.71\n */\nfunction the_author_posts() {\n\techo get_the_author_posts();\n}\n\n/**\n * Retrieves an HTML link to the author page of the current post's author.\n *\n * Returns an HTML-formatted link using get_author_posts_url().\n *\n * @since 4.4.0\n *\n * @global object $authordata The current author's DB object.\n *\n * @return string An HTML link to the author page.\n */\nfunction get_the_author_posts_link() {\n\tglobal $authordata;\n\tif ( ! is_object( $authordata ) ) {\n\t\treturn;\n\t}\n\n\t$link = sprintf(\n\t\t'<a href=\"%1$s\" title=\"%2$s\" rel=\"author\">%3$s</a>',\n\t\tesc_url( get_author_posts_url( $authordata->ID, $authordata->user_nicename ) ),\n\t\tesc_attr( sprintf( __( 'Posts by %s' ), get_the_author() ) ),\n\t\tget_the_author()\n\t);\n\n\t/**\n\t * Filter the link to the author page of the author of the current post.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $link HTML link.\n\t */\n\treturn apply_filters( 'the_author_posts_link', $link );\n}\n\n/**\n * Displays an HTML link to the author page of the current post's author.\n *\n * @since 1.2.0\n * @since 4.4.0 Converted into a wrapper for get_the_author_posts_link()\n *\n * @param string $deprecated Unused.\n */\nfunction the_author_posts_link( $deprecated = '' ) {\n\tif ( ! empty( $deprecated ) ) {\n\t\t_deprecated_argument( __FUNCTION__, '2.1' );\n\t}\n\techo get_the_author_posts_link();\n}\n\n/**\n * Retrieve the URL to the author page for the user with the ID provided.\n *\n * @since 2.1.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @return string The URL to the author's page.\n */\nfunction get_author_posts_url($author_id, $author_nicename = '') {\n\tglobal $wp_rewrite;\n\t$auth_ID = (int) $author_id;\n\t$link = $wp_rewrite->get_author_permastruct();\n\n\tif ( empty($link) ) {\n\t\t$file = home_url( '/' );\n\t\t$link = $file . '?author=' . $auth_ID;\n\t} else {\n\t\tif ( '' == $author_nicename ) {\n\t\t\t$user = get_userdata($author_id);\n\t\t\tif ( !empty($user->user_nicename) )\n\t\t\t\t$author_nicename = $user->user_nicename;\n\t\t}\n\t\t$link = str_replace('%author%', $author_nicename, $link);\n\t\t$link = home_url( user_trailingslashit( $link ) );\n\t}\n\n\t/**\n\t * Filter the URL to the author's page.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $link            The URL to the author's page.\n\t * @param int    $author_id       The author's id.\n\t * @param string $author_nicename The author's nice name.\n\t */\n\t$link = apply_filters( 'author_link', $link, $author_id, $author_nicename );\n\n\treturn $link;\n}\n\n/**\n * List all the authors of the blog, with several options available.\n *\n * @link https://codex.wordpress.org/Template_Tags/wp_list_authors\n *\n * @since 1.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string|array $args {\n *     Optional. Array or string of default arguments.\n *\n *     @type string $orderby       How to sort the authors. Accepts 'nicename', 'email', 'url', 'registered',\n *                                 'user_nicename', 'user_email', 'user_url', 'user_registered', 'name',\n *                                 'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'.\n *     @type string $order         Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'.\n *     @type int    $number        Maximum authors to return or display. Default empty (all authors).\n *     @type bool   $optioncount   Show the count in parenthesis next to the author's name. Default false.\n *     @type bool   $exclude_admin Whether to exclude the 'admin' account, if it exists. Default false.\n *     @type bool   $show_fullname Whether to show the author's full name. Default false.\n *     @type bool   $hide_empty    Whether to hide any authors with no posts. Default true.\n *     @type string $feed          If not empty, show a link to the author's feed and use this text as the alt\n *                                 parameter of the link. Default empty.\n *     @type string $feed_image    If not empty, show a link to the author's feed and use this image URL as\n *                                 clickable anchor. Default empty.\n *     @type string $feed_type     The feed type to link to, such as 'rss2'. Defaults to default feed type.\n *     @type bool   $echo          Whether to output the result or instead return it. Default true.\n *     @type string $style         If 'list', each author is wrapped in an `<li>` element, otherwise the authors\n *                                 will be separated by commas.\n *     @type bool   $html          Whether to list the items in HTML form or plaintext. Default true.\n *     @type string $exclude       An array, comma-, or space-separated list of author IDs to exclude. Default empty.\n *     @type string $exclude       An array, comma-, or space-separated list of author IDs to include. Default empty.\n * }\n * @return string|void The output, if echo is set to false.\n */\nfunction wp_list_authors( $args = '' ) {\n\tglobal $wpdb;\n\n\t$defaults = array(\n\t\t'orderby' => 'name', 'order' => 'ASC', 'number' => '',\n\t\t'optioncount' => false, 'exclude_admin' => true,\n\t\t'show_fullname' => false, 'hide_empty' => true,\n\t\t'feed' => '', 'feed_image' => '', 'feed_type' => '', 'echo' => true,\n\t\t'style' => 'list', 'html' => true, 'exclude' => '', 'include' => ''\n\t);\n\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$return = '';\n\n\t$query_args = wp_array_slice_assoc( $args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) );\n\t$query_args['fields'] = 'ids';\n\t$authors = get_users( $query_args );\n\n\t$author_count = array();\n\tforeach ( (array) $wpdb->get_results( \"SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE \" . get_private_posts_cap_sql( 'post' ) . \" GROUP BY post_author\" ) as $row ) {\n\t\t$author_count[$row->post_author] = $row->count;\n\t}\n\tforeach ( $authors as $author_id ) {\n\t\t$author = get_userdata( $author_id );\n\n\t\tif ( $args['exclude_admin'] && 'admin' == $author->display_name ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$posts = isset( $author_count[$author->ID] ) ? $author_count[$author->ID] : 0;\n\n\t\tif ( ! $posts && $args['hide_empty'] ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( $args['show_fullname'] && $author->first_name && $author->last_name ) {\n\t\t\t$name = \"$author->first_name $author->last_name\";\n\t\t} else {\n\t\t\t$name = $author->display_name;\n\t\t}\n\n\t\tif ( ! $args['html'] ) {\n\t\t\t$return .= $name . ', ';\n\n\t\t\tcontinue; // No need to go further to process HTML.\n\t\t}\n\n\t\tif ( 'list' == $args['style'] ) {\n\t\t\t$return .= '<li>';\n\t\t}\n\n\t\t$link = '<a href=\"' . get_author_posts_url( $author->ID, $author->user_nicename ) . '\" title=\"' . esc_attr( sprintf(__(\"Posts by %s\"), $author->display_name) ) . '\">' . $name . '</a>';\n\n\t\tif ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) {\n\t\t\t$link .= ' ';\n\t\t\tif ( empty( $args['feed_image'] ) ) {\n\t\t\t\t$link .= '(';\n\t\t\t}\n\n\t\t\t$link .= '<a href=\"' . get_author_feed_link( $author->ID, $args['feed_type'] ) . '\"';\n\n\t\t\t$alt = '';\n\t\t\tif ( ! empty( $args['feed'] ) ) {\n\t\t\t\t$alt = ' alt=\"' . esc_attr( $args['feed'] ) . '\"';\n\t\t\t\t$name = $args['feed'];\n\t\t\t}\n\n\t\t\t$link .= '>';\n\n\t\t\tif ( ! empty( $args['feed_image'] ) ) {\n\t\t\t\t$link .= '<img src=\"' . esc_url( $args['feed_image'] ) . '\" style=\"border: none;\"' . $alt . ' />';\n\t\t\t} else {\n\t\t\t\t$link .= $name;\n\t\t\t}\n\n\t\t\t$link .= '</a>';\n\n\t\t\tif ( empty( $args['feed_image'] ) ) {\n\t\t\t\t$link .= ')';\n\t\t\t}\n\t\t}\n\n\t\tif ( $args['optioncount'] ) {\n\t\t\t$link .= ' ('. $posts . ')';\n\t\t}\n\n\t\t$return .= $link;\n\t\t$return .= ( 'list' == $args['style'] ) ? '</li>' : ', ';\n\t}\n\n\t$return = rtrim( $return, ', ' );\n\n\tif ( ! $args['echo'] ) {\n\t\treturn $return;\n\t}\n\techo $return;\n}\n\n/**\n * Does this site have more than one author\n *\n * Checks to see if more than one author has published posts.\n *\n * @since 3.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return bool Whether or not we have more than one author\n */\nfunction is_multi_author() {\n\tglobal $wpdb;\n\n\tif ( false === ( $is_multi_author = get_transient( 'is_multi_author' ) ) ) {\n\t\t$rows = (array) $wpdb->get_col(\"SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 2\");\n\t\t$is_multi_author = 1 < count( $rows ) ? 1 : 0;\n\t\tset_transient( 'is_multi_author', $is_multi_author );\n\t}\n\n\t/**\n\t * Filter whether the site has more than one author with published posts.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @param bool $is_multi_author Whether $is_multi_author should evaluate as true.\n\t */\n\treturn apply_filters( 'is_multi_author', (bool) $is_multi_author );\n}\n\n/**\n * Helper function to clear the cache for number of authors.\n *\n * @private\n */\nfunction __clear_multi_author_cache() {\n\tdelete_transient( 'is_multi_author' );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/bookmark-template.php",
    "content": "<?php\n/**\n * Bookmark Template Functions for usage in Themes\n *\n * @package WordPress\n * @subpackage Template\n */\n\n/**\n * The formatted output of a list of bookmarks.\n *\n * The $bookmarks array must contain bookmark objects and will be iterated over\n * to retrieve the bookmark to be used in the output.\n *\n * The output is formatted as HTML with no way to change that format. However,\n * what is between, before, and after can be changed. The link itself will be\n * HTML.\n *\n * This function is used internally by wp_list_bookmarks() and should not be\n * used by themes.\n *\n * @since 2.1.0\n * @access private\n *\n * @param array $bookmarks List of bookmarks to traverse.\n * @param string|array $args {\n *     Optional. Bookmarks arguments.\n *\n *     @type int|bool $show_updated     Whether to show the time the bookmark was last updated.\n *                                      Accepts 1|true or 0|false. Default 0|false.\n *     @type int|bool $show_description Whether to show the bookmakr description. Accepts 1|true,\n *                                      Accepts 1|true or 0|false. Default 0|false.\n *     @type int|bool $show_images      Whether to show the link image if available. Accepts 1|true\n *                                      or 0|false. Default 1|true.\n *     @type int|bool $show_name        Whether to show link name if available. Accepts 1|true or\n *                                      0|false. Default 0|false.\n *     @type string   $before           The HTML or text to prepend to each bookmark. Default `<li>`.\n *     @type string   $after            The HTML or text to append to each bookmark. Default `</li>`.\n *     @type string   $link_before      The HTML or text to prepend to each bookmark inside the anchor\n *                                      tags. Default empty.\n *     @type string   $link_after       The HTML or text to append to each bookmark inside the anchor\n *                                      tags. Default empty.\n *     @type string   $between          The string for use in between the link, description, and image.\n *                                      Default \"\\n\".\n *     @type int|bool $show_rating      Whether to show the link rating. Accepts 1|true or 0|false.\n *                                      Default 0|false.\n *\n * }\n * @return string Formatted output in HTML\n */\nfunction _walk_bookmarks( $bookmarks, $args = '' ) {\n\t$defaults = array(\n\t\t'show_updated' => 0, 'show_description' => 0,\n\t\t'show_images' => 1, 'show_name' => 0,\n\t\t'before' => '<li>', 'after' => '</li>', 'between' => \"\\n\",\n\t\t'show_rating' => 0, 'link_before' => '', 'link_after' => ''\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$output = ''; // Blank string to start with.\n\n\tforeach ( (array) $bookmarks as $bookmark ) {\n\t\tif ( ! isset( $bookmark->recently_updated ) ) {\n\t\t\t$bookmark->recently_updated = false;\n\t\t}\n\t\t$output .= $r['before'];\n\t\tif ( $r['show_updated'] && $bookmark->recently_updated ) {\n\t\t\t$output .= '<em>';\n\t\t}\n\t\t$the_link = '#';\n\t\tif ( ! empty( $bookmark->link_url ) ) {\n\t\t\t$the_link = esc_url( $bookmark->link_url );\n\t\t}\n\t\t$desc = esc_attr( sanitize_bookmark_field( 'link_description', $bookmark->link_description, $bookmark->link_id, 'display' ) );\n\t\t$name = esc_attr( sanitize_bookmark_field( 'link_name', $bookmark->link_name, $bookmark->link_id, 'display' ) );\n \t\t$title = $desc;\n\n\t\tif ( $r['show_updated'] ) {\n\t\t\tif ( '00' != substr( $bookmark->link_updated_f, 0, 2 ) ) {\n\t\t\t\t$title .= ' (';\n\t\t\t\t$title .= sprintf(\n\t\t\t\t\t__('Last updated: %s'),\n\t\t\t\t\tdate(\n\t\t\t\t\t\tget_option( 'links_updated_date_format' ),\n\t\t\t\t\t\t$bookmark->link_updated_f + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS )\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t\t$title .= ')';\n\t\t\t}\n\t\t}\n\t\t$alt = ' alt=\"' . $name . ( $r['show_description'] ? ' ' . $title : '' ) . '\"';\n\n\t\tif ( '' != $title ) {\n\t\t\t$title = ' title=\"' . $title . '\"';\n\t\t}\n\t\t$rel = $bookmark->link_rel;\n\t\tif ( '' != $rel ) {\n\t\t\t$rel = ' rel=\"' . esc_attr($rel) . '\"';\n\t\t}\n\t\t$target = $bookmark->link_target;\n\t\tif ( '' != $target ) {\n\t\t\t$target = ' target=\"' . $target . '\"';\n\t\t}\n\t\t$output .= '<a href=\"' . $the_link . '\"' . $rel . $title . $target . '>';\n\n\t\t$output .= $r['link_before'];\n\n\t\tif ( $bookmark->link_image != null && $r['show_images'] ) {\n\t\t\tif ( strpos( $bookmark->link_image, 'http' ) === 0 ) {\n\t\t\t\t$output .= \"<img src=\\\"$bookmark->link_image\\\" $alt $title />\";\n\t\t\t} else { // If it's a relative path\n\t\t\t\t$output .= \"<img src=\\\"\" . get_option('siteurl') . \"$bookmark->link_image\\\" $alt $title />\";\n\t\t\t}\n\t\t\tif ( $r['show_name'] ) {\n\t\t\t\t$output .= \" $name\";\n\t\t\t}\n\t\t} else {\n\t\t\t$output .= $name;\n\t\t}\n\n\t\t$output .= $r['link_after'];\n\n\t\t$output .= '</a>';\n\n\t\tif ( $r['show_updated'] && $bookmark->recently_updated ) {\n\t\t\t$output .= '</em>';\n\t\t}\n\n\t\tif ( $r['show_description'] && '' != $desc ) {\n\t\t\t$output .= $r['between'] . $desc;\n\t\t}\n\n\t\tif ( $r['show_rating'] ) {\n\t\t\t$output .= $r['between'] . sanitize_bookmark_field(\n\t\t\t\t'link_rating',\n\t\t\t\t$bookmark->link_rating,\n\t\t\t\t$bookmark->link_id,\n\t\t\t\t'display'\n\t\t\t);\n\t\t}\n\t\t$output .= $r['after'] . \"\\n\";\n\t} // end while\n\n\treturn $output;\n}\n\n/**\n * Retrieve or echo all of the bookmarks.\n *\n * List of default arguments are as follows:\n *\n * These options define how the Category name will appear before the category\n * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will\n * display for only the 'title_li' string and only if 'title_li' is not empty.\n *\n * @since 2.1.0\n *\n * @see _walk_bookmarks()\n *\n * @param string|array $args {\n *     Optional. String or array of arguments to list bookmarks.\n *\n *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.\n *     @type string   $order            Whether to order bookmarks in ascending or descending order.\n *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.\n *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.\n *                                      Default -1.\n *     @type string   $category         Comma-separated list of category ids to include links from.\n *                                      Default empty.\n *     @type string   $category_name    Category to retrieve links for by name. Default empty.\n *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts\n *                                      1|true or 0|false. Default 1|true.\n *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.\n *                                      Accepts 1|true or 0|false. Default 0|false.\n *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts\n *                                      1|true (echo) or 0|false (return). Default 1|true.\n *     @type int|bool $categorize       Whether to show links listed by category or in a single column.\n *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.\n *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.\n *                                      Default 0|false.\n *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.\n *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.\n *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.\n *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.\n *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.\n *                                      String must contain '%id' and '%class' to inherit the category ID and\n *                                      the $class argument used for formatting in themes.\n *                                      Default '<li id=\"%id\" class=\"%class\">'.\n *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.\n *                                      Default '</li>'.\n *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize\n *                                      is true. Default 'name'.\n *     @type string   $category_order   Whether to order categories in ascending or descending order if\n *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).\n *                                      Default 'ASC'.\n * }\n * @return string|void Will only return if echo option is set to not echo. Default is not return anything.\n */\nfunction wp_list_bookmarks( $args = '' ) {\n\t$defaults = array(\n\t\t'orderby' => 'name', 'order' => 'ASC',\n\t\t'limit' => -1, 'category' => '', 'exclude_category' => '',\n\t\t'category_name' => '', 'hide_invisible' => 1,\n\t\t'show_updated' => 0, 'echo' => 1,\n\t\t'categorize' => 1, 'title_li' => __('Bookmarks'),\n\t\t'title_before' => '<h2>', 'title_after' => '</h2>',\n\t\t'category_orderby' => 'name', 'category_order' => 'ASC',\n\t\t'class' => 'linkcat', 'category_before' => '<li id=\"%id\" class=\"%class\">',\n\t\t'category_after' => '</li>'\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$output = '';\n\n\tif ( ! is_array( $r['class'] ) ) {\n\t\t$r['class'] = explode( ' ', $r['class'] );\n\t}\n \t$r['class'] = array_map( 'sanitize_html_class', $r['class'] );\n \t$r['class'] = trim( join( ' ', $r['class'] ) );\n\n\tif ( $r['categorize'] ) {\n\t\t$cats = get_terms( 'link_category', array(\n\t\t\t'name__like' => $r['category_name'],\n\t\t\t'include' => $r['category'],\n\t\t\t'exclude' => $r['exclude_category'],\n\t\t\t'orderby' => $r['category_orderby'],\n\t\t\t'order' => $r['category_order'],\n\t\t\t'hierarchical' => 0\n\t\t) );\n\t\tif ( empty( $cats ) ) {\n\t\t\t$r['categorize'] = false;\n\t\t}\n\t}\n\n\tif ( $r['categorize'] ) {\n\t\t// Split the bookmarks into ul's for each category\n\t\tforeach ( (array) $cats as $cat ) {\n\t\t\t$params = array_merge( $r, array( 'category' => $cat->term_id ) );\n\t\t\t$bookmarks = get_bookmarks( $params );\n\t\t\tif ( empty( $bookmarks ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t$output .= str_replace(\n\t\t\t\tarray( '%id', '%class' ),\n\t\t\t\tarray( \"linkcat-$cat->term_id\", $r['class'] ),\n\t\t\t\t$r['category_before']\n\t\t\t);\n\t\t\t/**\n\t\t\t * Filter the bookmarks category name.\n\t\t\t *\n\t\t\t * @since 2.2.0\n\t\t\t *\n\t\t\t * @param string $cat_name The category name of bookmarks.\n\t\t\t */\n\t\t\t$catname = apply_filters( 'link_category', $cat->name );\n\n\t\t\t$output .= $r['title_before'];\n\t\t\t$output .= $catname;\n\t\t\t$output .= $r['title_after'];\n\t\t\t$output .= \"\\n\\t<ul class='xoxo blogroll'>\\n\";\n\t\t\t$output .= _walk_bookmarks( $bookmarks, $r );\n\t\t\t$output .= \"\\n\\t</ul>\\n\";\n\t\t\t$output .= $r['category_after'] . \"\\n\";\n\t\t}\n\t} else {\n\t\t//output one single list using title_li for the title\n\t\t$bookmarks = get_bookmarks( $r );\n\n\t\tif ( ! empty( $bookmarks ) ) {\n\t\t\tif ( ! empty( $r['title_li'] ) ) {\n\t\t\t\t$output .= str_replace(\n\t\t\t\t\tarray( '%id', '%class' ),\n\t\t\t\t\tarray( \"linkcat-\" . $r['category'], $r['class'] ),\n\t\t\t\t\t$r['category_before']\n\t\t\t\t);\n\t\t\t\t$output .= $r['title_before'];\n\t\t\t\t$output .= $r['title_li'];\n\t\t\t\t$output .= $r['title_after'];\n\t\t\t\t$output .= \"\\n\\t<ul class='xoxo blogroll'>\\n\";\n\t\t\t\t$output .= _walk_bookmarks( $bookmarks, $r );\n\t\t\t\t$output .= \"\\n\\t</ul>\\n\";\n\t\t\t\t$output .= $r['category_after'] . \"\\n\";\n\t\t\t} else {\n\t\t\t\t$output .= _walk_bookmarks( $bookmarks, $r );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter the bookmarks list before it is echoed or returned.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $html The HTML list of bookmarks.\n\t */\n\t$html = apply_filters( 'wp_list_bookmarks', $output );\n\n\tif ( ! $r['echo'] ) {\n\t\treturn $html;\n\t}\n\techo $html;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/bookmark.php",
    "content": "<?php\n/**\n * Link/Bookmark API\n *\n * @package WordPress\n * @subpackage Bookmark\n */\n\n/**\n * Retrieve Bookmark data\n *\n * @since 2.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|stdClass $bookmark\n * @param string $output Optional. Either OBJECT, ARRAY_N, or ARRAY_A constant\n * @param string $filter Optional, default is 'raw'.\n * @return array|object|null Type returned depends on $output value.\n */\nfunction get_bookmark($bookmark, $output = OBJECT, $filter = 'raw') {\n\tglobal $wpdb;\n\n\tif ( empty($bookmark) ) {\n\t\tif ( isset($GLOBALS['link']) )\n\t\t\t$_bookmark = & $GLOBALS['link'];\n\t\telse\n\t\t\t$_bookmark = null;\n\t} elseif ( is_object($bookmark) ) {\n\t\twp_cache_add($bookmark->link_id, $bookmark, 'bookmark');\n\t\t$_bookmark = $bookmark;\n\t} else {\n\t\tif ( isset($GLOBALS['link']) && ($GLOBALS['link']->link_id == $bookmark) ) {\n\t\t\t$_bookmark = & $GLOBALS['link'];\n\t\t} elseif ( ! $_bookmark = wp_cache_get($bookmark, 'bookmark') ) {\n\t\t\t$_bookmark = $wpdb->get_row($wpdb->prepare(\"SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1\", $bookmark));\n\t\t\tif ( $_bookmark ) {\n\t\t\t\t$_bookmark->link_category = array_unique( wp_get_object_terms( $_bookmark->link_id, 'link_category', array( 'fields' => 'ids' ) ) );\n\t\t\t\twp_cache_add( $_bookmark->link_id, $_bookmark, 'bookmark' );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( ! $_bookmark )\n\t\treturn $_bookmark;\n\n\t$_bookmark = sanitize_bookmark($_bookmark, $filter);\n\n\tif ( $output == OBJECT ) {\n\t\treturn $_bookmark;\n\t} elseif ( $output == ARRAY_A ) {\n\t\treturn get_object_vars($_bookmark);\n\t} elseif ( $output == ARRAY_N ) {\n\t\treturn array_values(get_object_vars($_bookmark));\n\t} else {\n\t\treturn $_bookmark;\n\t}\n}\n\n/**\n * Retrieve single bookmark data item or field.\n *\n * @since 2.3.0\n *\n * @param string $field The name of the data field to return\n * @param int $bookmark The bookmark ID to get field\n * @param string $context Optional. The context of how the field will be used.\n * @return string|WP_Error\n */\nfunction get_bookmark_field( $field, $bookmark, $context = 'display' ) {\n\t$bookmark = (int) $bookmark;\n\t$bookmark = get_bookmark( $bookmark );\n\n\tif ( is_wp_error($bookmark) )\n\t\treturn $bookmark;\n\n\tif ( !is_object($bookmark) )\n\t\treturn '';\n\n\tif ( !isset($bookmark->$field) )\n\t\treturn '';\n\n\treturn sanitize_bookmark_field($field, $bookmark->$field, $bookmark->link_id, $context);\n}\n\n/**\n * Retrieves the list of bookmarks\n *\n * Attempts to retrieve from the cache first based on MD5 hash of arguments. If\n * that fails, then the query will be built from the arguments and executed. The\n * results will be stored to the cache.\n *\n * @since 2.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string|array $args {\n *     Optional. String or array of arguments to retrieve bookmarks.\n *\n *     @type string   $orderby        How to order the links by. Accepts post fields. Default 'name'.\n *     @type string   $order          Whether to order bookmarks in ascending or descending order.\n *                                    Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.\n *     @type int      $limit          Amount of bookmarks to display. Accepts 1+ or -1 for all.\n *                                    Default -1.\n *     @type string   $category       Comma-separated list of category ids to include links from.\n *                                    Default empty.\n *     @type string   $category_name  Category to retrieve links for by name. Default empty.\n *     @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts\n *                                    1|true or 0|false. Default 1|true.\n *     @type int|bool $show_updated   Whether to display the time the bookmark was last updated.\n *                                    Accepts 1|true or 0|false. Default 0|false.\n *     @type string   $include        Comma-separated list of bookmark IDs to include. Default empty.\n *     @type string   $exclude        Comma-separated list of bookmark IDs to exclude. Default empty.\n * }\n * @return array List of bookmark row objects.\n */\nfunction get_bookmarks( $args = '' ) {\n\tglobal $wpdb;\n\n\t$defaults = array(\n\t\t'orderby' => 'name', 'order' => 'ASC',\n\t\t'limit' => -1, 'category' => '',\n\t\t'category_name' => '', 'hide_invisible' => 1,\n\t\t'show_updated' => 0, 'include' => '',\n\t\t'exclude' => '', 'search' => ''\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$key = md5( serialize( $r ) );\n\tif ( $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) ) {\n\t\tif ( is_array( $cache ) && isset( $cache[ $key ] ) ) {\n\t\t\t$bookmarks = $cache[ $key ];\n\t\t\t/**\n\t\t\t * Filter the returned list of bookmarks.\n\t\t\t *\n\t\t\t * The first time the hook is evaluated in this file, it returns the cached\n\t\t\t * bookmarks list. The second evaluation returns a cached bookmarks list if the\n\t\t\t * link category is passed but does not exist. The third evaluation returns\n\t\t\t * the full cached results.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t *\n\t\t\t * @see get_bookmarks()\n\t\t\t *\n\t\t\t * @param array $bookmarks List of the cached bookmarks.\n\t\t\t * @param array $r         An array of bookmark query arguments.\n\t\t\t */\n\t\t\treturn apply_filters( 'get_bookmarks', $bookmarks, $r );\n\t\t}\n\t}\n\n\tif ( ! is_array( $cache ) ) {\n\t\t$cache = array();\n\t}\n\n\t$inclusions = '';\n\tif ( ! empty( $r['include'] ) ) {\n\t\t$r['exclude'] = '';  //ignore exclude, category, and category_name params if using include\n\t\t$r['category'] = '';\n\t\t$r['category_name'] = '';\n\t\t$inclinks = preg_split( '/[\\s,]+/', $r['include'] );\n\t\tif ( count( $inclinks ) ) {\n\t\t\tforeach ( $inclinks as $inclink ) {\n\t\t\t\tif ( empty( $inclusions ) ) {\n\t\t\t\t\t$inclusions = ' AND ( link_id = ' . intval( $inclink ) . ' ';\n\t\t\t\t} else {\n\t\t\t\t\t$inclusions .= ' OR link_id = ' . intval( $inclink ) . ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (! empty( $inclusions ) ) {\n\t\t$inclusions .= ')';\n\t}\n\n\t$exclusions = '';\n\tif ( ! empty( $r['exclude'] ) ) {\n\t\t$exlinks = preg_split( '/[\\s,]+/', $r['exclude'] );\n\t\tif ( count( $exlinks ) ) {\n\t\t\tforeach ( $exlinks as $exlink ) {\n\t\t\t\tif ( empty( $exclusions ) ) {\n\t\t\t\t\t$exclusions = ' AND ( link_id <> ' . intval( $exlink ) . ' ';\n\t\t\t\t} else {\n\t\t\t\t\t$exclusions .= ' AND link_id <> ' . intval( $exlink ) . ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif ( ! empty( $exclusions ) ) {\n\t\t$exclusions .= ')';\n\t}\n\n\tif ( ! empty( $r['category_name'] ) ) {\n\t\tif ( $r['category'] = get_term_by('name', $r['category_name'], 'link_category') ) {\n\t\t\t$r['category'] = $r['category']->term_id;\n\t\t} else {\n\t\t\t$cache[ $key ] = array();\n\t\t\twp_cache_set( 'get_bookmarks', $cache, 'bookmark' );\n\t\t\t/** This filter is documented in wp-includes/bookmark.php */\n\t\t\treturn apply_filters( 'get_bookmarks', array(), $r );\n\t\t}\n\t}\n\n\t$search = '';\n\tif ( ! empty( $r['search'] ) ) {\n\t\t$like = '%' . $wpdb->esc_like( $r['search'] ) . '%';\n\t\t$search = $wpdb->prepare(\" AND ( (link_url LIKE %s) OR (link_name LIKE %s) OR (link_description LIKE %s) ) \", $like, $like, $like );\n\t}\n\n\t$category_query = '';\n\t$join = '';\n\tif ( ! empty( $r['category'] ) ) {\n\t\t$incategories = preg_split( '/[\\s,]+/', $r['category'] );\n\t\tif ( count($incategories) ) {\n\t\t\tforeach ( $incategories as $incat ) {\n\t\t\t\tif ( empty( $category_query ) ) {\n\t\t\t\t\t$category_query = ' AND ( tt.term_id = ' . intval( $incat ) . ' ';\n\t\t\t\t} else {\n\t\t\t\t\t$category_query .= ' OR tt.term_id = ' . intval( $incat ) . ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif ( ! empty( $category_query ) ) {\n\t\t$category_query .= \") AND taxonomy = 'link_category'\";\n\t\t$join = \" INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id\";\n\t}\n\n\tif ( $r['show_updated'] ) {\n\t\t$recently_updated_test = \", IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated \";\n\t} else {\n\t\t$recently_updated_test = '';\n\t}\n\n\t$get_updated = ( $r['show_updated'] ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : '';\n\n\t$orderby = strtolower( $r['orderby'] );\n\t$length = '';\n\tswitch ( $orderby ) {\n\t\tcase 'length':\n\t\t\t$length = \", CHAR_LENGTH(link_name) AS length\";\n\t\t\tbreak;\n\t\tcase 'rand':\n\t\t\t$orderby = 'rand()';\n\t\t\tbreak;\n\t\tcase 'link_id':\n\t\t\t$orderby = \"$wpdb->links.link_id\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t$orderparams = array();\n\t\t\t$keys = array( 'link_id', 'link_name', 'link_url', 'link_visible', 'link_rating', 'link_owner', 'link_updated', 'link_notes', 'link_description' );\n\t\t\tforeach ( explode( ',', $orderby ) as $ordparam ) {\n\t\t\t\t$ordparam = trim( $ordparam );\n\n\t\t\t\tif ( in_array( 'link_' . $ordparam, $keys ) ) {\n\t\t\t\t\t$orderparams[] = 'link_' . $ordparam;\n\t\t\t\t} elseif ( in_array( $ordparam, $keys ) ) {\n\t\t\t\t\t$orderparams[] = $ordparam;\n\t\t\t\t}\n\t\t\t}\n\t\t\t$orderby = implode( ',', $orderparams );\n\t}\n\n\tif ( empty( $orderby ) ) {\n\t\t$orderby = 'link_name';\n\t}\n\n\t$order = strtoupper( $r['order'] );\n\tif ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ) ) ) {\n\t\t$order = 'ASC';\n\t}\n\n\t$visible = '';\n\tif ( $r['hide_invisible'] ) {\n\t\t$visible = \"AND link_visible = 'Y'\";\n\t}\n\n\t$query = \"SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query\";\n\t$query .= \" $exclusions $inclusions $search\";\n\t$query .= \" ORDER BY $orderby $order\";\n\tif ( $r['limit'] != -1 ) {\n\t\t$query .= ' LIMIT ' . $r['limit'];\n\t}\n\n\t$results = $wpdb->get_results( $query );\n\n\t$cache[ $key ] = $results;\n\twp_cache_set( 'get_bookmarks', $cache, 'bookmark' );\n\n\t/** This filter is documented in wp-includes/bookmark.php */\n\treturn apply_filters( 'get_bookmarks', $results, $r );\n}\n\n/**\n * Sanitizes all bookmark fields\n *\n * @since 2.3.0\n *\n * @param object|array $bookmark Bookmark row\n * @param string $context Optional, default is 'display'. How to filter the\n *\t\tfields\n * @return object|array Same type as $bookmark but with fields sanitized.\n */\nfunction sanitize_bookmark($bookmark, $context = 'display') {\n\t$fields = array('link_id', 'link_url', 'link_name', 'link_image', 'link_target', 'link_category',\n\t\t'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_updated',\n\t\t'link_rel', 'link_notes', 'link_rss', );\n\n\tif ( is_object($bookmark) ) {\n\t\t$do_object = true;\n\t\t$link_id = $bookmark->link_id;\n\t} else {\n\t\t$do_object = false;\n\t\t$link_id = $bookmark['link_id'];\n\t}\n\n\tforeach ( $fields as $field ) {\n\t\tif ( $do_object ) {\n\t\t\tif ( isset($bookmark->$field) )\n\t\t\t\t$bookmark->$field = sanitize_bookmark_field($field, $bookmark->$field, $link_id, $context);\n\t\t} else {\n\t\t\tif ( isset($bookmark[$field]) )\n\t\t\t\t$bookmark[$field] = sanitize_bookmark_field($field, $bookmark[$field], $link_id, $context);\n\t\t}\n\t}\n\n\treturn $bookmark;\n}\n\n/**\n * Sanitizes a bookmark field\n *\n * Sanitizes the bookmark fields based on what the field name is. If the field\n * has a strict value set, then it will be tested for that, else a more generic\n * filtering is applied. After the more strict filter is applied, if the\n * $context is 'raw' then the value is immediately return.\n *\n * Hooks exist for the more generic cases. With the 'edit' context, the\n * 'edit_$field' filter will be called and passed the $value and $bookmark_id\n * respectively. With the 'db' context, the 'pre_$field' filter is called and\n * passed the value. The 'display' context is the final context and has the\n * $field has the filter name and is passed the $value, $bookmark_id, and\n * $context respectively.\n *\n * @since 2.3.0\n *\n * @param string $field The bookmark field\n * @param mixed $value The bookmark field value\n * @param int $bookmark_id Bookmark ID\n * @param string $context How to filter the field value. Either 'raw', 'edit',\n *\t\t'attribute', 'js', 'db', or 'display'\n * @return mixed The filtered value\n */\nfunction sanitize_bookmark_field($field, $value, $bookmark_id, $context) {\n\tswitch ( $field ) {\n\tcase 'link_id' : // ints\n\tcase 'link_rating' :\n\t\t$value = (int) $value;\n\t\tbreak;\n\tcase 'link_category' : // array( ints )\n\t\t$value = array_map('absint', (array) $value);\n\t\t// We return here so that the categories aren't filtered.\n\t\t// The 'link_category' filter is for the name of a link category, not an array of a link's link categories\n\t\treturn $value;\n\n\tcase 'link_visible' : // bool stored as Y|N\n\t\t$value = preg_replace('/[^YNyn]/', '', $value);\n\t\tbreak;\n\tcase 'link_target' : // \"enum\"\n\t\t$targets = array('_top', '_blank');\n\t\tif ( ! in_array($value, $targets) )\n\t\t\t$value = '';\n\t\tbreak;\n\t}\n\n\tif ( 'raw' == $context )\n\t\treturn $value;\n\n\tif ( 'edit' == $context ) {\n\t\t/** This filter is documented in wp-includes/post.php */\n\t\t$value = apply_filters( \"edit_$field\", $value, $bookmark_id );\n\n\t\tif ( 'link_notes' == $field ) {\n\t\t\t$value = esc_html( $value ); // textarea_escaped\n\t\t} else {\n\t\t\t$value = esc_attr($value);\n\t\t}\n\t} elseif ( 'db' == $context ) {\n\t\t/** This filter is documented in wp-includes/post.php */\n\t\t$value = apply_filters( \"pre_$field\", $value );\n\t} else {\n\t\t/** This filter is documented in wp-includes/post.php */\n\t\t$value = apply_filters( $field, $value, $bookmark_id, $context );\n\n\t\tif ( 'attribute' == $context ) {\n\t\t\t$value = esc_attr( $value );\n\t\t} elseif ( 'js' == $context ) {\n\t\t\t$value = esc_js( $value );\n\t\t}\n\t}\n\n\treturn $value;\n}\n\n/**\n * Deletes bookmark cache\n *\n * @since 2.7.0\n */\nfunction clean_bookmark_cache( $bookmark_id ) {\n\twp_cache_delete( $bookmark_id, 'bookmark' );\n\twp_cache_delete( 'get_bookmarks', 'bookmark' );\n\tclean_object_term_cache( $bookmark_id, 'link');\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/cache.php",
    "content": "<?php\n/**\n * Object Cache API\n *\n * @link https://codex.wordpress.org/Function_Reference/WP_Cache\n *\n * @package WordPress\n * @subpackage Cache\n */\n\n/**\n * Adds data to the cache, if the cache key doesn't already exist.\n *\n * @since 2.0.0\n *\n * @see WP_Object_Cache::add()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param int|string $key    The cache key to use for retrieval later.\n * @param mixed      $data   The data to add to the cache.\n * @param string     $group  Optional. The group to add the cache to. Enables the same key\n *                           to be used across groups. Default empty.\n * @param int        $expire Optional. When the cache data should expire, in seconds.\n *                           Default 0 (no expiration).\n * @return bool False if cache key and group already exist, true on success.\n */\nfunction wp_cache_add( $key, $data, $group = '', $expire = 0 ) {\n\tglobal $wp_object_cache;\n\n\treturn $wp_object_cache->add( $key, $data, $group, (int) $expire );\n}\n\n/**\n * Closes the cache.\n *\n * This function has ceased to do anything since WordPress 2.5. The\n * functionality was removed along with the rest of the persistent cache.\n *\n * This does not mean that plugins can't implement this function when they need\n * to make sure that the cache is cleaned up after WordPress no longer needs it.\n *\n * @since 2.0.0\n *\n * @return true Always returns true.\n */\nfunction wp_cache_close() {\n\treturn true;\n}\n\n/**\n * Decrements numeric cache item's value.\n *\n * @since 3.3.0\n *\n * @see WP_Object_Cache::decr()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param int|string $key    The cache key to decrement.\n * @param int        $offset Optional. The amount by which to decrement the item's value. Default 1.\n * @param string     $group  Optional. The group the key is in. Default empty.\n * @return false|int False on failure, the item's new value on success.\n */\nfunction wp_cache_decr( $key, $offset = 1, $group = '' ) {\n\tglobal $wp_object_cache;\n\n\treturn $wp_object_cache->decr( $key, $offset, $group );\n}\n\n/**\n * Removes the cache contents matching key and group.\n *\n * @since 2.0.0\n *\n * @see WP_Object_Cache::delete()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param int|string $key   What the contents in the cache are called.\n * @param string     $group Optional. Where the cache contents are grouped. Default empty.\n * @return bool True on successful removal, false on failure.\n */\nfunction wp_cache_delete( $key, $group = '' ) {\n\tglobal $wp_object_cache;\n\n\treturn $wp_object_cache->delete($key, $group);\n}\n\n/**\n * Removes all cache items.\n *\n * @since 2.0.0\n *\n * @see WP_Object_Cache::flush()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @return bool False on failure, true on success\n */\nfunction wp_cache_flush() {\n\tglobal $wp_object_cache;\n\n\treturn $wp_object_cache->flush();\n}\n\n/**\n * Retrieves the cache contents from the cache by key and group.\n *\n * @since 2.0.0\n *\n * @see WP_Object_Cache::get()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param int|string  $key    The key under which the cache contents are stored.\n * @param string      $group  Optional. Where the cache contents are grouped. Default empty.\n * @param bool        $force  Optional. Whether to force an update of the local cache from the persistent\n *                            cache. Default false.\n * @param bool        &$found Optional. Whether the key was found in the cache. Disambiguates a return of false,\n *                            a storable value. Passed by reference. Default null.\n * @return bool|mixed False on failure to retrieve contents or the cache\n *\t\t              contents on success\n */\nfunction wp_cache_get( $key, $group = '', $force = false, &$found = null ) {\n\tglobal $wp_object_cache;\n\n\treturn $wp_object_cache->get( $key, $group, $force, $found );\n}\n\n/**\n * Increment numeric cache item's value\n *\n * @since 3.3.0\n *\n * @see WP_Object_Cache::incr()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param int|string $key    The key for the cache contents that should be incremented.\n * @param int        $offset Optional. The amount by which to increment the item's value. Default 1.\n * @param string     $group  Optional. The group the key is in. Default empty.\n * @return false|int False on failure, the item's new value on success.\n */\nfunction wp_cache_incr( $key, $offset = 1, $group = '' ) {\n\tglobal $wp_object_cache;\n\n\treturn $wp_object_cache->incr( $key, $offset, $group );\n}\n\n/**\n * Sets up Object Cache Global and assigns it.\n *\n * @since 2.0.0\n *\n * @global WP_Object_Cache $wp_object_cache\n */\nfunction wp_cache_init() {\n\t$GLOBALS['wp_object_cache'] = new WP_Object_Cache();\n}\n\n/**\n * Replaces the contents of the cache with new data.\n *\n * @since 2.0.0\n *\n * @see WP_Object_Cache::replace()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param int|string $key    The key for the cache data that should be replaced.\n * @param mixed      $data   The new data to store in the cache.\n * @param string     $group  Optional. The group for the cache data that should be replaced.\n *                           Default empty.\n * @param int        $expire Optional. When to expire the cache contents, in seconds.\n *                           Default 0 (no expiration).\n * @return bool False if original value does not exist, true if contents were replaced\n */\nfunction wp_cache_replace( $key, $data, $group = '', $expire = 0 ) {\n\tglobal $wp_object_cache;\n\n\treturn $wp_object_cache->replace( $key, $data, $group, (int) $expire );\n}\n\n/**\n * Saves the data to the cache.\n *\n * Differs from wp_cache_add() and wp_cache_replace() in that it will always write data.\n *\n * @since 2.0.0\n *\n * @see WP_Object_Cache::set()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param int|string $key    The cache key to use for retrieval later.\n * @param mixed      $data   The contents to store in the cache.\n * @param string     $group  Optional. Where to group the cache contents. Enables the same key\n *                           to be used across groups. Default empty.\n * @param int        $expire Optional. When to expire the cache contents, in seconds.\n *                           Default 0 (no expiration).\n * @return bool False on failure, true on success\n */\nfunction wp_cache_set( $key, $data, $group = '', $expire = 0 ) {\n\tglobal $wp_object_cache;\n\n\treturn $wp_object_cache->set( $key, $data, $group, (int) $expire );\n}\n\n/**\n * Switches the interal blog ID.\n *\n * This changes the blog id used to create keys in blog specific groups.\n *\n * @since 3.5.0\n *\n * @see WP_Object_Cache::switch_to_blog()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param int $blog_id Blog ID.\n */\nfunction wp_cache_switch_to_blog( $blog_id ) {\n\tglobal $wp_object_cache;\n\n\t$wp_object_cache->switch_to_blog( $blog_id );\n}\n\n/**\n * Adds a group or set of groups to the list of global groups.\n *\n * @since 2.6.0\n *\n * @see WP_Object_Cache::add_global_groups()\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n *\n * @param string|array $groups A group or an array of groups to add.\n */\nfunction wp_cache_add_global_groups( $groups ) {\n\tglobal $wp_object_cache;\n\n\t$wp_object_cache->add_global_groups( $groups );\n}\n\n/**\n * Adds a group or set of groups to the list of non-persistent groups.\n *\n * @since 2.6.0\n *\n * @param string|array $groups A group or an array of groups to add.\n */\nfunction wp_cache_add_non_persistent_groups( $groups ) {\n\t// Default cache doesn't persist so nothing to do here.\n}\n\n/**\n * Reset internal cache keys and structures.\n *\n * If the cache backend uses global blog or site IDs as part of its cache keys,\n * this function instructs the backend to reset those keys and perform any cleanup\n * since blog or site IDs have changed since cache init.\n *\n * This function is deprecated. Use wp_cache_switch_to_blog() instead of this\n * function when preparing the cache for a blog switch. For clearing the cache\n * during unit tests, consider using wp_cache_init(). wp_cache_init() is not\n * recommended outside of unit tests as the performance penality for using it is\n * high.\n *\n * @since 2.6.0\n * @deprecated 3.5.0 WP_Object_Cache::reset()\n * @see WP_Object_Cache::reset()\n *\n * @global WP_Object_Cache $wp_object_cache Object cache global instance.\n */\nfunction wp_cache_reset() {\n\t_deprecated_function( __FUNCTION__, '3.5' );\n\n\tglobal $wp_object_cache;\n\n\t$wp_object_cache->reset();\n}\n\n/**\n * Core class that implements an object cache.\n *\n * The WordPress Object Cache is used to save on trips to the database. The\n * Object Cache stores all of the cache data to memory and makes the cache\n * contents available by using a key, which is used to name and later retrieve\n * the cache contents.\n *\n * The Object Cache can be replaced by other caching mechanisms by placing files\n * in the wp-content folder which is looked at in wp-settings. If that file\n * exists, then this file will not be included.\n *\n * @package WordPress\n * @subpackage Cache\n * @since 2.0.0\n */\nclass WP_Object_Cache {\n\n\t/**\n\t * Holds the cached objects.\n\t *\n\t * @since 2.0.0\n\t * @access private\n\t * @var array\n\t */\n\tprivate $cache = array();\n\n\t/**\n\t * The amount of times the cache data was already stored in the cache.\n\t *\n\t * @since 2.5.0\n\t * @access private\n\t * @var int\n\t */\n\tprivate $cache_hits = 0;\n\n\t/**\n\t * Amount of times the cache did not have the request in cache.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $cache_misses = 0;\n\n\t/**\n\t * List of global cache groups.\n\t *\n\t * @since 3.0.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $global_groups = array();\n\n\t/**\n\t * The blog prefix to prepend to keys in non-global groups.\n\t *\n\t * @since 3.5.0\n\t * @access private\n\t * @var int\n\t */\n\tprivate $blog_prefix;\n\n\t/**\n\t * Holds the value of is_multisite().\n\t *\n\t * @since 3.5.0\n\t * @access private\n\t * @var bool\n\t */\n\tprivate $multisite;\n\n\t/**\n\t * Makes private properties readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to get.\n\t * @return mixed Property.\n\t */\n\tpublic function __get( $name ) {\n\t\treturn $this->$name;\n\t}\n\n\t/**\n\t * Makes private properties settable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name  Property to set.\n\t * @param mixed  $value Property value.\n\t * @return mixed Newly-set property.\n\t */\n\tpublic function __set( $name, $value ) {\n\t\treturn $this->$name = $value;\n\t}\n\n\t/**\n\t * Makes private properties checkable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to check if set.\n\t * @return bool Whether the property is set.\n\t */\n\tpublic function __isset( $name ) {\n\t\treturn isset( $this->$name );\n\t}\n\n\t/**\n\t * Makes private properties un-settable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to unset.\n\t */\n\tpublic function __unset( $name ) {\n\t\tunset( $this->$name );\n\t}\n\n\t/**\n\t * Adds data to the cache if it doesn't already exist.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @uses WP_Object_Cache::_exists() Checks to see if the cache already has data.\n\t * @uses WP_Object_Cache::set()     Sets the data after the checking the cache\n\t *\t\t                            contents existence.\n\t *\n\t * @param int|string $key    What to call the contents in the cache.\n\t * @param mixed      $data   The contents to store in the cache.\n\t * @param string     $group  Optional. Where to group the cache contents. Default 'default'.\n\t * @param int        $expire Optional. When to expire the cache contents. Default 0 (no expiration).\n\t * @return bool False if cache key and group already exist, true on success\n\t */\n\tpublic function add( $key, $data, $group = 'default', $expire = 0 ) {\n\t\tif ( wp_suspend_cache_addition() )\n\t\t\treturn false;\n\n\t\tif ( empty( $group ) )\n\t\t\t$group = 'default';\n\n\t\t$id = $key;\n\t\tif ( $this->multisite && ! isset( $this->global_groups[ $group ] ) )\n\t\t\t$id = $this->blog_prefix . $key;\n\n\t\tif ( $this->_exists( $id, $group ) )\n\t\t\treturn false;\n\n\t\treturn $this->set( $key, $data, $group, (int) $expire );\n\t}\n\n\t/**\n\t * Sets the list of global cache groups.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t *\n\t * @param array $groups List of groups that are global.\n\t */\n\tpublic function add_global_groups( $groups ) {\n\t\t$groups = (array) $groups;\n\n\t\t$groups = array_fill_keys( $groups, true );\n\t\t$this->global_groups = array_merge( $this->global_groups, $groups );\n\t}\n\n\t/**\n\t * Decrements numeric cache item's value.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t *\n\t * @param int|string $key    The cache key to decrement.\n\t * @param int        $offset Optional. The amount by which to decrement the item's value. Default 1.\n\t * @param string     $group  Optional. The group the key is in. Default 'default'.\n\t * @return false|int False on failure, the item's new value on success.\n\t */\n\tpublic function decr( $key, $offset = 1, $group = 'default' ) {\n\t\tif ( empty( $group ) )\n\t\t\t$group = 'default';\n\n\t\tif ( $this->multisite && ! isset( $this->global_groups[ $group ] ) )\n\t\t\t$key = $this->blog_prefix . $key;\n\n\t\tif ( ! $this->_exists( $key, $group ) )\n\t\t\treturn false;\n\n\t\tif ( ! is_numeric( $this->cache[ $group ][ $key ] ) )\n\t\t\t$this->cache[ $group ][ $key ] = 0;\n\n\t\t$offset = (int) $offset;\n\n\t\t$this->cache[ $group ][ $key ] -= $offset;\n\n\t\tif ( $this->cache[ $group ][ $key ] < 0 )\n\t\t\t$this->cache[ $group ][ $key ] = 0;\n\n\t\treturn $this->cache[ $group ][ $key ];\n\t}\n\n\t/**\n\t * Removes the contents of the cache key in the group.\n\t *\n\t * If the cache key does not exist in the group, then nothing will happen.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param int|string $key        What the contents in the cache are called.\n\t * @param string     $group      Optional. Where the cache contents are grouped. Default 'default'.\n\t * @param bool       $deprecated Optional. Unused. Default false.\n\t * @return bool False if the contents weren't deleted and true on success.\n\t */\n\tpublic function delete( $key, $group = 'default', $deprecated = false ) {\n\t\tif ( empty( $group ) )\n\t\t\t$group = 'default';\n\n\t\tif ( $this->multisite && ! isset( $this->global_groups[ $group ] ) )\n\t\t\t$key = $this->blog_prefix . $key;\n\n\t\tif ( ! $this->_exists( $key, $group ) )\n\t\t\treturn false;\n\n\t\tunset( $this->cache[$group][$key] );\n\t\treturn true;\n\t}\n\n\t/**\n\t * Clears the object cache of all data.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @return true Always returns true.\n\t */\n\tpublic function flush() {\n\t\t$this->cache = array();\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Retrieves the cache contents, if it exists.\n\t *\n\t * The contents will be first attempted to be retrieved by searching by the\n\t * key in the cache group. If the cache is hit (success) then the contents\n\t * are returned.\n\t *\n\t * On failure, the number of cache misses will be incremented.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param int|string $key    What the contents in the cache are called.\n\t * @param string     $group  Optional. Where the cache contents are grouped. Default 'default'.\n\t * @param string     $force  Optional. Unused. Whether to force a refetch rather than relying on the local\n\t *                           cache. Default false.\n\t * @param bool       &$found Optional. Whether the key was found in the cache. Disambiguates a return of\n\t *                           false, a storable value. Passed by reference. Default null.\n\t * @return false|mixed False on failure to retrieve contents or the cache contents on success.\n\t */\n\tpublic function get( $key, $group = 'default', $force = false, &$found = null ) {\n\t\tif ( empty( $group ) )\n\t\t\t$group = 'default';\n\n\t\tif ( $this->multisite && ! isset( $this->global_groups[ $group ] ) )\n\t\t\t$key = $this->blog_prefix . $key;\n\n\t\tif ( $this->_exists( $key, $group ) ) {\n\t\t\t$found = true;\n\t\t\t$this->cache_hits += 1;\n\t\t\tif ( is_object($this->cache[$group][$key]) )\n\t\t\t\treturn clone $this->cache[$group][$key];\n\t\t\telse\n\t\t\t\treturn $this->cache[$group][$key];\n\t\t}\n\n\t\t$found = false;\n\t\t$this->cache_misses += 1;\n\t\treturn false;\n\t}\n\n\t/**\n\t * Increments numeric cache item's value.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t *\n\t * @param int|string $key    The cache key to increment\n\t * @param int        $offset Optional. The amount by which to increment the item's value. Default 1.\n\t * @param string     $group  Optional. The group the key is in. Default 'default'.\n\t * @return false|int False on failure, the item's new value on success.\n\t */\n\tpublic function incr( $key, $offset = 1, $group = 'default' ) {\n\t\tif ( empty( $group ) )\n\t\t\t$group = 'default';\n\n\t\tif ( $this->multisite && ! isset( $this->global_groups[ $group ] ) )\n\t\t\t$key = $this->blog_prefix . $key;\n\n\t\tif ( ! $this->_exists( $key, $group ) )\n\t\t\treturn false;\n\n\t\tif ( ! is_numeric( $this->cache[ $group ][ $key ] ) )\n\t\t\t$this->cache[ $group ][ $key ] = 0;\n\n\t\t$offset = (int) $offset;\n\n\t\t$this->cache[ $group ][ $key ] += $offset;\n\n\t\tif ( $this->cache[ $group ][ $key ] < 0 )\n\t\t\t$this->cache[ $group ][ $key ] = 0;\n\n\t\treturn $this->cache[ $group ][ $key ];\n\t}\n\n\t/**\n\t * Replaces the contents in the cache, if contents already exist.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @see WP_Object_Cache::set()\n\t *\n\t * @param int|string $key    What to call the contents in the cache.\n\t * @param mixed      $data   The contents to store in the cache.\n\t * @param string     $group  Optional. Where to group the cache contents. Default 'default'.\n\t * @param int        $expire Optional. When to expire the cache contents. Default 0 (no expiration).\n\t * @return bool False if not exists, true if contents were replaced.\n\t */\n\tpublic function replace( $key, $data, $group = 'default', $expire = 0 ) {\n\t\tif ( empty( $group ) )\n\t\t\t$group = 'default';\n\n\t\t$id = $key;\n\t\tif ( $this->multisite && ! isset( $this->global_groups[ $group ] ) )\n\t\t\t$id = $this->blog_prefix . $key;\n\n\t\tif ( ! $this->_exists( $id, $group ) )\n\t\t\treturn false;\n\n\t\treturn $this->set( $key, $data, $group, (int) $expire );\n\t}\n\n\t/**\n\t * Resets cache keys.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t *\n\t * @deprecated 3.5.0 Use switch_to_blog()\n\t * @see switch_to_blog()\n\t */\n\tpublic function reset() {\n\t\t_deprecated_function( __FUNCTION__, '3.5', 'switch_to_blog()' );\n\n\t\t// Clear out non-global caches since the blog ID has changed.\n\t\tforeach ( array_keys( $this->cache ) as $group ) {\n\t\t\tif ( ! isset( $this->global_groups[ $group ] ) )\n\t\t\t\tunset( $this->cache[ $group ] );\n\t\t}\n\t}\n\n\t/**\n\t * Sets the data contents into the cache.\n\t *\n\t * The cache contents is grouped by the $group parameter followed by the\n\t * $key. This allows for duplicate ids in unique groups. Therefore, naming of\n\t * the group should be used with care and should follow normal function\n\t * naming guidelines outside of core WordPress usage.\n\t *\n\t * The $expire parameter is not used, because the cache will automatically\n\t * expire for each time a page is accessed and PHP finishes. The method is\n\t * more for cache plugins which use files.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param int|string $key    What to call the contents in the cache.\n\t * @param mixed      $data   The contents to store in the cache.\n\t * @param string     $group  Optional. Where to group the cache contents. Default 'default'.\n\t * @param int        $expire Not Used.\n\t * @return true Always returns true.\n\t */\n\tpublic function set( $key, $data, $group = 'default', $expire = 0 ) {\n\t\tif ( empty( $group ) )\n\t\t\t$group = 'default';\n\n\t\tif ( $this->multisite && ! isset( $this->global_groups[ $group ] ) )\n\t\t\t$key = $this->blog_prefix . $key;\n\n\t\tif ( is_object( $data ) )\n\t\t\t$data = clone $data;\n\n\t\t$this->cache[$group][$key] = $data;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Echoes the stats of the caching.\n\t *\n\t * Gives the cache hits, and cache misses. Also prints every cached group,\n\t * key and the data.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t */\n\tpublic function stats() {\n\t\techo \"<p>\";\n\t\techo \"<strong>Cache Hits:</strong> {$this->cache_hits}<br />\";\n\t\techo \"<strong>Cache Misses:</strong> {$this->cache_misses}<br />\";\n\t\techo \"</p>\";\n\t\techo '<ul>';\n\t\tforeach ($this->cache as $group => $cache) {\n\t\t\techo \"<li><strong>Group:</strong> $group - ( \" . number_format( strlen( serialize( $cache ) ) / KB_IN_BYTES, 2 ) . 'k )</li>';\n\t\t}\n\t\techo '</ul>';\n\t}\n\n\t/**\n\t * Switches the interal blog ID.\n\t *\n\t * This changes the blog ID used to create keys in blog specific groups.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param int $blog_id Blog ID.\n\t */\n\tpublic function switch_to_blog( $blog_id ) {\n\t\t$blog_id = (int) $blog_id;\n\t\t$this->blog_prefix = $this->multisite ? $blog_id . ':' : '';\n\t}\n\n\t/**\n\t * Serves as a utility function to determine whether a key exists in the cache.\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t *\n\t * @param int|string $key   Cache key to check for existence.\n\t * @param string     $group Cache group for the key existence check.\n\t * @return bool Whether the key exists in the cache for the given group.\n\t */\n\tprotected function _exists( $key, $group ) {\n\t\treturn isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) );\n\t}\n\n\t/**\n\t * Sets up object properties; PHP 5 style constructor.\n\t *\n\t * @since 2.0.8\n\t *\n     * @global int $blog_id Global blog ID.\n\t */\n\tpublic function __construct() {\n\t\tglobal $blog_id;\n\n\t\t$this->multisite = is_multisite();\n\t\t$this->blog_prefix =  $this->multisite ? $blog_id . ':' : '';\n\n\n\t\t/**\n\t\t * @todo This should be moved to the PHP4 style constructor, PHP5\n\t\t * already calls __destruct()\n\t\t */\n\t\tregister_shutdown_function( array( $this, '__destruct' ) );\n\t}\n\n\t/**\n\t * Saves the object cache before object is completely destroyed.\n\t *\n\t * Called upon object destruction, which should be when PHP ends.\n\t *\n\t * @since 2.0.8\n\t *\n\t * @return true Always returns true.\n\t */\n\tpublic function __destruct() {\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/canonical.php",
    "content": "<?php\n/**\n * Canonical API to handle WordPress Redirecting\n *\n * Based on \"Permalink Redirect\" from Scott Yang and \"Enforce www. Preference\"\n * by Mark Jaquith\n *\n * @package WordPress\n * @since 2.3.0\n */\n\n/**\n * Redirects incoming links to the proper URL based on the site url.\n *\n * Search engines consider www.somedomain.com and somedomain.com to be two\n * different URLs when they both go to the same location. This SEO enhancement\n * prevents penalty for duplicate content by redirecting all incoming links to\n * one or the other.\n *\n * Prevents redirection for feeds, trackbacks, searches, comment popup, and\n * admin URLs. Does not redirect on non-pretty-permalink-supporting IIS 7+,\n * page/post previews, WP admin, Trackbacks, robots.txt, searches, or on POST\n * requests.\n *\n * Will also attempt to find the correct link when a user enters a URL that does\n * not exist based on exact WordPress query. Will instead try to parse the URL\n * or query in an attempt to figure the correct page to go to.\n *\n * @since 2.3.0\n *\n * @global WP_Rewrite $wp_rewrite\n * @global bool $is_IIS\n * @global WP_Query $wp_query\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $requested_url Optional. The URL that was requested, used to\n *\t\tfigure if redirect is needed.\n * @param bool $do_redirect Optional. Redirect to the new URL.\n * @return string|void The string of the URL, if redirect needed.\n */\nfunction redirect_canonical( $requested_url = null, $do_redirect = true ) {\n\tglobal $wp_rewrite, $is_IIS, $wp_query, $wpdb, $wp;\n\n\tif ( isset( $_SERVER['REQUEST_METHOD'] ) && ! in_array( strtoupper( $_SERVER['REQUEST_METHOD'] ), array( 'GET', 'HEAD' ) ) ) {\n\t\treturn;\n\t}\n\n\t// If we're not in wp-admin and the post has been published and preview nonce\n\t// is non-existent or invalid then no need for preview in query\n\tif ( is_preview() && get_query_var( 'p' ) && 'publish' == get_post_status( get_query_var( 'p' ) ) ) {\n\t\tif ( ! isset( $_GET['preview_id'] )\n\t\t\t|| ! isset( $_GET['preview_nonce'] )\n\t\t\t|| ! wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . (int) $_GET['preview_id'] ) ) {\n\t\t\t$wp_query->is_preview = false;\n\t\t}\n\t}\n\n\tif ( is_trackback() || is_search() || is_comments_popup() || is_admin() || is_preview() || is_robots() || ( $is_IIS && !iis7_supports_permalinks() ) ) {\n\t\treturn;\n\t}\n\n\tif ( ! $requested_url && isset( $_SERVER['HTTP_HOST'] ) ) {\n\t\t// build the URL in the address bar\n\t\t$requested_url  = is_ssl() ? 'https://' : 'http://';\n\t\t$requested_url .= $_SERVER['HTTP_HOST'];\n\t\t$requested_url .= $_SERVER['REQUEST_URI'];\n\t}\n\n\t$original = @parse_url($requested_url);\n\tif ( false === $original ) {\n\t\treturn;\n\t}\n\n\t$redirect = $original;\n\t$redirect_url = false;\n\n\t// Notice fixing\n\tif ( !isset($redirect['path']) )\n\t\t$redirect['path'] = '';\n\tif ( !isset($redirect['query']) )\n\t\t$redirect['query'] = '';\n\n\t// If the original URL ended with non-breaking spaces, they were almost\n\t// certainly inserted by accident. Let's remove them, so the reader doesn't\n\t// see a 404 error with no obvious cause.\n\t$redirect['path'] = preg_replace( '|(%C2%A0)+$|i', '', $redirect['path'] );\n\n\t// It's not a preview, so remove it from URL\n\tif ( get_query_var( 'preview' ) ) {\n\t\t$redirect['query'] = remove_query_arg( 'preview', $redirect['query'] );\n\t}\n\n\tif ( is_feed() && ( $id = get_query_var( 'p' ) ) ) {\n\t\tif ( $redirect_url = get_post_comments_feed_link( $id, get_query_var( 'feed' ) ) ) {\n\t\t\t$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type', 'feed'), $redirect_url );\n\t\t\t$redirect['path'] = parse_url( $redirect_url, PHP_URL_PATH );\n\t\t}\n\t}\n\n\tif ( is_singular() && 1 > $wp_query->post_count && ($id = get_query_var('p')) ) {\n\n\t\t$vars = $wpdb->get_results( $wpdb->prepare(\"SELECT post_type, post_parent FROM $wpdb->posts WHERE ID = %d\", $id) );\n\n\t\tif ( isset($vars[0]) && $vars = $vars[0] ) {\n\t\t\tif ( 'revision' == $vars->post_type && $vars->post_parent > 0 )\n\t\t\t\t$id = $vars->post_parent;\n\n\t\t\tif ( $redirect_url = get_permalink($id) )\n\t\t\t\t$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url );\n\t\t}\n\t}\n\n\t// These tests give us a WP-generated permalink\n\tif ( is_404() ) {\n\n\t\t// Redirect ?page_id, ?p=, ?attachment_id= to their respective url's\n\t\t$id = max( get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id') );\n\t\tif ( $id && $redirect_post = get_post($id) ) {\n\t\t\t$post_type_obj = get_post_type_object($redirect_post->post_type);\n\t\t\tif ( $post_type_obj->public && 'auto-draft' != $redirect_post->post_status ) {\n\t\t\t\t$redirect_url = get_permalink($redirect_post);\n\t\t\t\t$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url );\n\t\t\t}\n\t\t}\n\n\t\tif ( get_query_var( 'day' ) && get_query_var( 'monthnum' ) && get_query_var( 'year' ) ) {\n\t\t\t$year  = get_query_var( 'year' );\n\t\t\t$month = get_query_var( 'monthnum' );\n\t\t\t$day   = get_query_var( 'day' );\n\t\t\t$date  = sprintf( '%04d-%02d-%02d', $year, $month, $day );\n\t\t\tif ( ! wp_checkdate( $month, $day, $year, $date ) ) {\n\t\t\t\t$redirect_url = get_month_link( $year, $month );\n\t\t\t\t$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum', 'day' ), $redirect_url );\n\t\t\t}\n\t\t} elseif ( get_query_var( 'monthnum' ) && get_query_var( 'year' ) && 12 < get_query_var( 'monthnum' ) ) {\n\t\t\t$redirect_url = get_year_link( get_query_var( 'year' ) );\n\t\t\t$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum' ), $redirect_url );\n\t\t}\n\n\t\tif ( ! $redirect_url ) {\n\t\t\tif ( $redirect_url = redirect_guess_404_permalink() ) {\n\t\t\t\t$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'page', 'feed', 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url );\n\t\t\t}\n\t\t}\n\n\t\tif ( get_query_var( 'page' ) && $wp_query->post &&\n\t\t\tfalse !== strpos( $wp_query->post->post_content, '<!--nextpage-->' ) ) {\n\t\t\t$redirect['path'] = rtrim( $redirect['path'], (int) get_query_var( 'page' ) . '/' );\n\t\t\t$redirect['query'] = remove_query_arg( 'page', $redirect['query'] );\n\t\t\t$redirect_url = get_permalink( $wp_query->post->ID );\n\t\t}\n\n\t} elseif ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) {\n\t\t// rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101\n\t\tif ( is_attachment() &&\n\t\t\t! array_diff( array_keys( $wp->query_vars ), array( 'attachment', 'attachment_id' ) ) &&\n\t\t\t! $redirect_url ) {\n\t\t\tif ( ! empty( $_GET['attachment_id'] ) ) {\n\t\t\t\t$redirect_url = get_attachment_link( get_query_var( 'attachment_id' ) );\n\t\t\t\tif ( $redirect_url ) {\n\t\t\t\t\t$redirect['query'] = remove_query_arg( 'attachment_id', $redirect['query'] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$redirect_url = get_attachment_link();\n\t\t\t}\n\t\t} elseif ( is_single() && !empty($_GET['p']) && ! $redirect_url ) {\n\t\t\tif ( $redirect_url = get_permalink(get_query_var('p')) )\n\t\t\t\t$redirect['query'] = remove_query_arg(array('p', 'post_type'), $redirect['query']);\n\t\t} elseif ( is_single() && !empty($_GET['name'])  && ! $redirect_url ) {\n\t\t\tif ( $redirect_url = get_permalink( $wp_query->get_queried_object_id() ) )\n\t\t\t\t$redirect['query'] = remove_query_arg('name', $redirect['query']);\n\t\t} elseif ( is_page() && !empty($_GET['page_id']) && ! $redirect_url ) {\n\t\t\tif ( $redirect_url = get_permalink(get_query_var('page_id')) )\n\t\t\t\t$redirect['query'] = remove_query_arg('page_id', $redirect['query']);\n\t\t} elseif ( is_page() && !is_feed() && isset($wp_query->queried_object) && 'page' == get_option('show_on_front') && $wp_query->queried_object->ID == get_option('page_on_front')  && ! $redirect_url ) {\n\t\t\t$redirect_url = home_url('/');\n\t\t} elseif ( is_home() && !empty($_GET['page_id']) && 'page' == get_option('show_on_front') && get_query_var('page_id') == get_option('page_for_posts')  && ! $redirect_url ) {\n\t\t\tif ( $redirect_url = get_permalink(get_option('page_for_posts')) )\n\t\t\t\t$redirect['query'] = remove_query_arg('page_id', $redirect['query']);\n\t\t} elseif ( !empty($_GET['m']) && ( is_year() || is_month() || is_day() ) ) {\n\t\t\t$m = get_query_var('m');\n\t\t\tswitch ( strlen($m) ) {\n\t\t\t\tcase 4: // Yearly\n\t\t\t\t\t$redirect_url = get_year_link($m);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 6: // Monthly\n\t\t\t\t\t$redirect_url = get_month_link( substr($m, 0, 4), substr($m, 4, 2) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8: // Daily\n\t\t\t\t\t$redirect_url = get_day_link(substr($m, 0, 4), substr($m, 4, 2), substr($m, 6, 2));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( $redirect_url )\n\t\t\t\t$redirect['query'] = remove_query_arg('m', $redirect['query']);\n\t\t// now moving on to non ?m=X year/month/day links\n\t\t} elseif ( is_day() && get_query_var('year') && get_query_var('monthnum') && !empty($_GET['day']) ) {\n\t\t\tif ( $redirect_url = get_day_link(get_query_var('year'), get_query_var('monthnum'), get_query_var('day')) )\n\t\t\t\t$redirect['query'] = remove_query_arg(array('year', 'monthnum', 'day'), $redirect['query']);\n\t\t} elseif ( is_month() && get_query_var('year') && !empty($_GET['monthnum']) ) {\n\t\t\tif ( $redirect_url = get_month_link(get_query_var('year'), get_query_var('monthnum')) )\n\t\t\t\t$redirect['query'] = remove_query_arg(array('year', 'monthnum'), $redirect['query']);\n\t\t} elseif ( is_year() && !empty($_GET['year']) ) {\n\t\t\tif ( $redirect_url = get_year_link(get_query_var('year')) )\n\t\t\t\t$redirect['query'] = remove_query_arg('year', $redirect['query']);\n\t\t} elseif ( is_author() && !empty($_GET['author']) && preg_match( '|^[0-9]+$|', $_GET['author'] ) ) {\n\t\t\t$author = get_userdata(get_query_var('author'));\n\t\t\tif ( ( false !== $author ) && $wpdb->get_var( $wpdb->prepare( \"SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_author = %d AND $wpdb->posts.post_status = 'publish' LIMIT 1\", $author->ID ) ) ) {\n\t\t\t\tif ( $redirect_url = get_author_posts_url($author->ID, $author->user_nicename) )\n\t\t\t\t\t$redirect['query'] = remove_query_arg('author', $redirect['query']);\n\t\t\t}\n\t\t} elseif ( is_category() || is_tag() || is_tax() ) { // Terms (Tags/categories)\n\n\t\t\t$term_count = 0;\n\t\t\tforeach ( $wp_query->tax_query->queried_terms as $tax_query )\n\t\t\t\t$term_count += count( $tax_query['terms'] );\n\n\t\t\t$obj = $wp_query->get_queried_object();\n\t\t\tif ( $term_count <= 1 && !empty($obj->term_id) && ( $tax_url = get_term_link((int)$obj->term_id, $obj->taxonomy) ) && !is_wp_error($tax_url) ) {\n\t\t\t\tif ( !empty($redirect['query']) ) {\n\t\t\t\t\t// Strip taxonomy query vars off the url.\n\t\t\t\t\t$qv_remove = array( 'term', 'taxonomy');\n\t\t\t\t\tif ( is_category() ) {\n\t\t\t\t\t\t$qv_remove[] = 'category_name';\n\t\t\t\t\t\t$qv_remove[] = 'cat';\n\t\t\t\t\t} elseif ( is_tag() ) {\n\t\t\t\t\t\t$qv_remove[] = 'tag';\n\t\t\t\t\t\t$qv_remove[] = 'tag_id';\n\t\t\t\t\t} else { // Custom taxonomies will have a custom query var, remove those too:\n\t\t\t\t\t\t$tax_obj = get_taxonomy( $obj->taxonomy );\n\t\t\t\t\t\tif ( false !== $tax_obj->query_var )\n\t\t\t\t\t\t\t$qv_remove[] = $tax_obj->query_var;\n\t\t\t\t\t}\n\n\t\t\t\t\t$rewrite_vars = array_diff( array_keys($wp_query->query), array_keys($_GET) );\n\n\t\t\t\t\tif ( !array_diff($rewrite_vars, array_keys($_GET))  ) { // Check to see if all the Query vars are coming from the rewrite, none are set via $_GET\n\t\t\t\t\t\t$redirect['query'] = remove_query_arg($qv_remove, $redirect['query']); //Remove all of the per-tax qv's\n\n\t\t\t\t\t\t// Create the destination url for this taxonomy\n\t\t\t\t\t\t$tax_url = parse_url($tax_url);\n\t\t\t\t\t\tif ( ! empty($tax_url['query']) ) { // Taxonomy accessible via ?taxonomy=..&term=.. or any custom qv..\n\t\t\t\t\t\t\tparse_str($tax_url['query'], $query_vars);\n\t\t\t\t\t\t\t$redirect['query'] = add_query_arg($query_vars, $redirect['query']);\n\t\t\t\t\t\t} else { // Taxonomy is accessible via a \"pretty-URL\"\n\t\t\t\t\t\t\t$redirect['path'] = $tax_url['path'];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else { // Some query vars are set via $_GET. Unset those from $_GET that exist via the rewrite\n\t\t\t\t\t\tforeach ( $qv_remove as $_qv ) {\n\t\t\t\t\t\t\tif ( isset($rewrite_vars[$_qv]) )\n\t\t\t\t\t\t\t\t$redirect['query'] = remove_query_arg($_qv, $redirect['query']);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t} elseif ( is_single() && strpos($wp_rewrite->permalink_structure, '%category%') !== false && $cat = get_query_var( 'category_name' ) ) {\n\t\t\t$category = get_category_by_path( $cat );\n\t\t\t$post_terms = wp_get_object_terms($wp_query->get_queried_object_id(), 'category', array('fields' => 'tt_ids'));\n\t\t\tif ( (!$category || is_wp_error($category)) || ( !is_wp_error($post_terms) && !empty($post_terms) && !in_array($category->term_taxonomy_id, $post_terms) ) )\n\t\t\t\t$redirect_url = get_permalink($wp_query->get_queried_object_id());\n\t\t}\n\n\t\t// Post Paging\n\t\tif ( is_singular() && ! is_front_page() && get_query_var('page') ) {\n\t\t\tif ( !$redirect_url )\n\t\t\t\t$redirect_url = get_permalink( get_queried_object_id() );\n\t\t\t$redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( get_query_var( 'page' ), 'single_paged' );\n\t\t\t$redirect['query'] = remove_query_arg( 'page', $redirect['query'] );\n\t\t}\n\n\t\t// paging and feeds\n\t\tif ( get_query_var('paged') || is_feed() || get_query_var('cpage') ) {\n\t\t\twhile ( preg_match( \"#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#\", $redirect['path'] ) || preg_match( '#/(comments/?)?(feed|rss|rdf|atom|rss2)(/+)?$#', $redirect['path'] ) || preg_match( \"#/{$wp_rewrite->comments_pagination_base}-[0-9]+(/+)?$#\", $redirect['path'] ) ) {\n\t\t\t\t// Strip off paging and feed\n\t\t\t\t$redirect['path'] = preg_replace(\"#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#\", '/', $redirect['path']); // strip off any existing paging\n\t\t\t\t$redirect['path'] = preg_replace('#/(comments/?)?(feed|rss2?|rdf|atom)(/+|$)#', '/', $redirect['path']); // strip off feed endings\n\t\t\t\t$redirect['path'] = preg_replace(\"#/{$wp_rewrite->comments_pagination_base}-[0-9]+?(/+)?$#\", '/', $redirect['path']); // strip off any existing comment paging\n\t\t\t}\n\n\t\t\t$addl_path = '';\n\t\t\tif ( is_feed() && in_array( get_query_var('feed'), $wp_rewrite->feeds ) ) {\n\t\t\t\t$addl_path = !empty( $addl_path ) ? trailingslashit($addl_path) : '';\n\t\t\t\tif ( !is_singular() && get_query_var( 'withcomments' ) )\n\t\t\t\t\t$addl_path .= 'comments/';\n\t\t\t\tif ( ( 'rss' == get_default_feed() && 'feed' == get_query_var('feed') ) || 'rss' == get_query_var('feed') )\n\t\t\t\t\t$addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() == 'rss2' ) ? '' : 'rss2' ), 'feed' );\n\t\t\t\telse\n\t\t\t\t\t$addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() ==  get_query_var('feed') || 'feed' == get_query_var('feed') ) ? '' : get_query_var('feed') ), 'feed' );\n\t\t\t\t$redirect['query'] = remove_query_arg( 'feed', $redirect['query'] );\n\t\t\t} elseif ( is_feed() && 'old' == get_query_var('feed') ) {\n\t\t\t\t$old_feed_files = array(\n\t\t\t\t\t'wp-atom.php'         => 'atom',\n\t\t\t\t\t'wp-commentsrss2.php' => 'comments_rss2',\n\t\t\t\t\t'wp-feed.php'         => get_default_feed(),\n\t\t\t\t\t'wp-rdf.php'          => 'rdf',\n\t\t\t\t\t'wp-rss.php'          => 'rss2',\n\t\t\t\t\t'wp-rss2.php'         => 'rss2',\n\t\t\t\t);\n\t\t\t\tif ( isset( $old_feed_files[ basename( $redirect['path'] ) ] ) ) {\n\t\t\t\t\t$redirect_url = get_feed_link( $old_feed_files[ basename( $redirect['path'] ) ] );\n\t\t\t\t\twp_redirect( $redirect_url, 301 );\n\t\t\t\t\tdie();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( get_query_var('paged') > 0 ) {\n\t\t\t\t$paged = get_query_var('paged');\n\t\t\t\t$redirect['query'] = remove_query_arg( 'paged', $redirect['query'] );\n\t\t\t\tif ( !is_feed() ) {\n\t\t\t\t\tif ( $paged > 1 && !is_single() ) {\n\t\t\t\t\t\t$addl_path = ( !empty( $addl_path ) ? trailingslashit($addl_path) : '' ) . user_trailingslashit(\"$wp_rewrite->pagination_base/$paged\", 'paged');\n\t\t\t\t\t} elseif ( !is_single() ) {\n\t\t\t\t\t\t$addl_path = !empty( $addl_path ) ? trailingslashit($addl_path) : '';\n\t\t\t\t\t}\n\t\t\t\t} elseif ( $paged > 1 ) {\n\t\t\t\t\t$redirect['query'] = add_query_arg( 'paged', $paged, $redirect['query'] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( get_option( 'page_comments' ) && (\n\t\t\t\t( 'newest' == get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 0 ) ||\n\t\t\t\t( 'newest' != get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 1 )\n\t\t\t) ) {\n\t\t\t\t$addl_path = ( !empty( $addl_path ) ? trailingslashit($addl_path) : '' ) . user_trailingslashit( $wp_rewrite->comments_pagination_base . '-' . get_query_var('cpage'), 'commentpaged' );\n\t\t\t\t$redirect['query'] = remove_query_arg( 'cpage', $redirect['query'] );\n\t\t\t}\n\n\t\t\t$redirect['path'] = user_trailingslashit( preg_replace('|/' . preg_quote( $wp_rewrite->index, '|' ) . '/?$|', '/', $redirect['path']) ); // strip off trailing /index.php/\n\t\t\tif ( !empty( $addl_path ) && $wp_rewrite->using_index_permalinks() && strpos($redirect['path'], '/' . $wp_rewrite->index . '/') === false )\n\t\t\t\t$redirect['path'] = trailingslashit($redirect['path']) . $wp_rewrite->index . '/';\n\t\t\tif ( !empty( $addl_path ) )\n\t\t\t\t$redirect['path'] = trailingslashit($redirect['path']) . $addl_path;\n\t\t\t$redirect_url = $redirect['scheme'] . '://' . $redirect['host'] . $redirect['path'];\n\t\t}\n\n\t\tif ( 'wp-register.php' == basename( $redirect['path'] ) ) {\n\t\t\tif ( is_multisite() ) {\n\t\t\t\t/** This filter is documented in wp-login.php */\n\t\t\t\t$redirect_url = apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) );\n\t\t\t} else {\n\t\t\t\t$redirect_url = wp_registration_url();\n\t\t\t}\n\n\t\t\twp_redirect( $redirect_url, 301 );\n\t\t\tdie();\n\t\t}\n\t}\n\n\t// tack on any additional query vars\n\t$redirect['query'] = preg_replace( '#^\\??&*?#', '', $redirect['query'] );\n\tif ( $redirect_url && !empty($redirect['query']) ) {\n\t\tparse_str( $redirect['query'], $_parsed_query );\n\t\t$redirect = @parse_url($redirect_url);\n\n\t\tif ( ! empty( $_parsed_query['name'] ) && ! empty( $redirect['query'] ) ) {\n\t\t\tparse_str( $redirect['query'], $_parsed_redirect_query );\n\n\t\t\tif ( empty( $_parsed_redirect_query['name'] ) )\n\t\t\t\tunset( $_parsed_query['name'] );\n\t\t}\n\n\t\t$_parsed_query = rawurlencode_deep( $_parsed_query );\n\t\t$redirect_url = add_query_arg( $_parsed_query, $redirect_url );\n\t}\n\n\tif ( $redirect_url )\n\t\t$redirect = @parse_url($redirect_url);\n\n\t// www.example.com vs example.com\n\t$user_home = @parse_url(home_url());\n\tif ( !empty($user_home['host']) )\n\t\t$redirect['host'] = $user_home['host'];\n\tif ( empty($user_home['path']) )\n\t\t$user_home['path'] = '/';\n\n\t// Handle ports\n\tif ( !empty($user_home['port']) )\n\t\t$redirect['port'] = $user_home['port'];\n\telse\n\t\tunset($redirect['port']);\n\n\t// trailing /index.php\n\t$redirect['path'] = preg_replace('|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path']);\n\n\t// Remove trailing spaces from the path\n\t$redirect['path'] = preg_replace( '#(%20| )+$#', '', $redirect['path'] );\n\n\tif ( !empty( $redirect['query'] ) ) {\n\t\t// Remove trailing spaces from certain terminating query string args\n\t\t$redirect['query'] = preg_replace( '#((p|page_id|cat|tag)=[^&]*?)(%20| )+$#', '$1', $redirect['query'] );\n\n\t\t// Clean up empty query strings\n\t\t$redirect['query'] = trim(preg_replace( '#(^|&)(p|page_id|cat|tag)=?(&|$)#', '&', $redirect['query']), '&');\n\n\t\t// Redirect obsolete feeds\n\t\t$redirect['query'] = preg_replace( '#(^|&)feed=rss(&|$)#', '$1feed=rss2$2', $redirect['query'] );\n\n\t\t// Remove redundant leading ampersands\n\t\t$redirect['query'] = preg_replace( '#^\\??&*?#', '', $redirect['query'] );\n\t}\n\n\t// strip /index.php/ when we're not using PATHINFO permalinks\n\tif ( !$wp_rewrite->using_index_permalinks() )\n\t\t$redirect['path'] = str_replace( '/' . $wp_rewrite->index . '/', '/', $redirect['path'] );\n\n\t// trailing slashes\n\tif ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() && !is_404() && (!is_front_page() || ( is_front_page() && (get_query_var('paged') > 1) ) ) ) {\n\t\t$user_ts_type = '';\n\t\tif ( get_query_var('paged') > 0 ) {\n\t\t\t$user_ts_type = 'paged';\n\t\t} else {\n\t\t\tforeach ( array('single', 'category', 'page', 'day', 'month', 'year', 'home') as $type ) {\n\t\t\t\t$func = 'is_' . $type;\n\t\t\t\tif ( call_user_func($func) ) {\n\t\t\t\t\t$user_ts_type = $type;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$redirect['path'] = user_trailingslashit($redirect['path'], $user_ts_type);\n\t} elseif ( is_front_page() ) {\n\t\t$redirect['path'] = trailingslashit($redirect['path']);\n\t}\n\n\t// Strip multiple slashes out of the URL\n\tif ( strpos($redirect['path'], '//') > -1 )\n\t\t$redirect['path'] = preg_replace('|/+|', '/', $redirect['path']);\n\n\t// Always trailing slash the Front Page URL\n\tif ( trailingslashit( $redirect['path'] ) == trailingslashit( $user_home['path'] ) )\n\t\t$redirect['path'] = trailingslashit($redirect['path']);\n\n\t// Ignore differences in host capitalization, as this can lead to infinite redirects\n\t// Only redirect no-www <=> yes-www\n\tif ( strtolower($original['host']) == strtolower($redirect['host']) ||\n\t\t( strtolower($original['host']) != 'www.' . strtolower($redirect['host']) && 'www.' . strtolower($original['host']) != strtolower($redirect['host']) ) )\n\t\t$redirect['host'] = $original['host'];\n\n\t$compare_original = array( $original['host'], $original['path'] );\n\n\tif ( !empty( $original['port'] ) )\n\t\t$compare_original[] = $original['port'];\n\n\tif ( !empty( $original['query'] ) )\n\t\t$compare_original[] = $original['query'];\n\n\t$compare_redirect = array( $redirect['host'], $redirect['path'] );\n\n\tif ( !empty( $redirect['port'] ) )\n\t\t$compare_redirect[] = $redirect['port'];\n\n\tif ( !empty( $redirect['query'] ) )\n\t\t$compare_redirect[] = $redirect['query'];\n\n\tif ( $compare_original !== $compare_redirect ) {\n\t\t$redirect_url = $redirect['scheme'] . '://' . $redirect['host'];\n\t\tif ( !empty($redirect['port']) )\n\t\t\t$redirect_url .= ':' . $redirect['port'];\n\t\t$redirect_url .= $redirect['path'];\n\t\tif ( !empty($redirect['query']) )\n\t\t\t$redirect_url .= '?' . $redirect['query'];\n\t}\n\n\tif ( ! $redirect_url || $redirect_url == $requested_url ) {\n\t\treturn;\n\t}\n\n\t// Hex encoded octets are case-insensitive.\n\tif ( false !== strpos($requested_url, '%') ) {\n\t\tif ( !function_exists('lowercase_octets') ) {\n\t\t\tfunction lowercase_octets($matches) {\n\t\t\t\treturn strtolower( $matches[0] );\n\t\t\t}\n\t\t}\n\t\t$requested_url = preg_replace_callback('|%[a-fA-F0-9][a-fA-F0-9]|', 'lowercase_octets', $requested_url);\n\t}\n\n\t/**\n\t * Filter the canonical redirect URL.\n\t *\n\t * Returning false to this filter will cancel the redirect.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $redirect_url  The redirect URL.\n\t * @param string $requested_url The requested URL.\n\t */\n\t$redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url );\n\n\t// yes, again -- in case the filter aborted the request\n\tif ( ! $redirect_url || strip_fragment_from_url( $redirect_url ) == strip_fragment_from_url( $requested_url ) ) {\n\t\treturn;\n\t}\n\n\tif ( $do_redirect ) {\n\t\t// protect against chained redirects\n\t\tif ( !redirect_canonical($redirect_url, false) ) {\n\t\t\twp_redirect($redirect_url, 301);\n\t\t\texit();\n\t\t} else {\n\t\t\t// Debug\n\t\t\t// die(\"1: $redirect_url<br />2: \" . redirect_canonical( $redirect_url, false ) );\n\t\t\treturn;\n\t\t}\n\t} else {\n\t\treturn $redirect_url;\n\t}\n}\n\n/**\n * Removes arguments from a query string if they are not present in a URL\n * DO NOT use this in plugin code.\n *\n * @since 3.4.0\n * @access private\n *\n * @param string $query_string\n * @param array $args_to_check\n * @param string $url\n * @return string The altered query string\n */\nfunction _remove_qs_args_if_not_in_url( $query_string, Array $args_to_check, $url ) {\n\t$parsed_url = @parse_url( $url );\n\tif ( ! empty( $parsed_url['query'] ) ) {\n\t\tparse_str( $parsed_url['query'], $parsed_query );\n\t\tforeach ( $args_to_check as $qv ) {\n\t\t\tif ( !isset( $parsed_query[$qv] ) )\n\t\t\t\t$query_string = remove_query_arg( $qv, $query_string );\n\t\t}\n\t} else {\n\t\t$query_string = remove_query_arg( $args_to_check, $query_string );\n\t}\n\treturn $query_string;\n}\n\n/**\n * Strips the #fragment from a URL, if one is present.\n *\n * @since 4.4.0\n *\n * @param string $url The URL to strip.\n * @return string The altered URL.\n */\nfunction strip_fragment_from_url( $url ) {\n\t$parsed_url = @parse_url( $url );\n\tif ( ! empty( $parsed_url['host'] ) ) {\n\t\t// This mirrors code in redirect_canonical(). It does not handle every case.\n\t\t$url = $parsed_url['scheme'] . '://' . $parsed_url['host'];\n\t\tif ( ! empty( $parsed_url['port'] ) ) {\n\t\t\t$url .= ':' . $parsed_url['port'];\n\t\t}\n\t\t$url .= $parsed_url['path'];\n\t\tif ( ! empty( $parsed_url['query'] ) ) {\n\t\t\t$url .= '?' . $parsed_url['query'];\n\t\t}\n\t}\n\n\treturn $url;\n}\n\n/**\n * Attempts to guess the correct URL based on query vars\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return false|string The correct URL if one is found. False on failure.\n */\nfunction redirect_guess_404_permalink() {\n\tglobal $wpdb;\n\n\tif ( get_query_var('name') ) {\n\t\t$where = $wpdb->prepare(\"post_name LIKE %s\", $wpdb->esc_like( get_query_var('name') ) . '%');\n\n\t\t// if any of post_type, year, monthnum, or day are set, use them to refine the query\n\t\tif ( get_query_var('post_type') )\n\t\t\t$where .= $wpdb->prepare(\" AND post_type = %s\", get_query_var('post_type'));\n\t\telse\n\t\t\t$where .= \" AND post_type IN ('\" . implode( \"', '\", get_post_types( array( 'public' => true ) ) ) . \"')\";\n\n\t\tif ( get_query_var('year') )\n\t\t\t$where .= $wpdb->prepare(\" AND YEAR(post_date) = %d\", get_query_var('year'));\n\t\tif ( get_query_var('monthnum') )\n\t\t\t$where .= $wpdb->prepare(\" AND MONTH(post_date) = %d\", get_query_var('monthnum'));\n\t\tif ( get_query_var('day') )\n\t\t\t$where .= $wpdb->prepare(\" AND DAYOFMONTH(post_date) = %d\", get_query_var('day'));\n\n\t\t$post_id = $wpdb->get_var(\"SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'\");\n\t\tif ( ! $post_id )\n\t\t\treturn false;\n\t\tif ( get_query_var( 'feed' ) )\n\t\t\treturn get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) );\n\t\telseif ( get_query_var( 'page' ) && 1 < get_query_var( 'page' ) )\n\t\t\treturn trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( get_query_var( 'page' ), 'single_paged' );\n\t\telse\n\t\t\treturn get_permalink( $post_id );\n\t}\n\n\treturn false;\n}\n\n/**\n *\n * @global WP_Rewrite $wp_rewrite\n */\nfunction wp_redirect_admin_locations() {\n\tglobal $wp_rewrite;\n\tif ( ! ( is_404() && $wp_rewrite->using_permalinks() ) )\n\t\treturn;\n\n\t$admins = array(\n\t\thome_url( 'wp-admin', 'relative' ),\n\t\thome_url( 'dashboard', 'relative' ),\n\t\thome_url( 'admin', 'relative' ),\n\t\tsite_url( 'dashboard', 'relative' ),\n\t\tsite_url( 'admin', 'relative' ),\n\t);\n\tif ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $admins ) ) {\n\t\twp_redirect( admin_url() );\n\t\texit;\n\t}\n\n\t$logins = array(\n\t\thome_url( 'wp-login.php', 'relative' ),\n\t\thome_url( 'login', 'relative' ),\n\t\tsite_url( 'login', 'relative' ),\n\t);\n\tif ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $logins ) ) {\n\t\twp_redirect( wp_login_url() );\n\t\texit;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/capabilities.php",
    "content": "<?php\n/**\n * Core User Role & Capabilities API\n *\n * @package WordPress\n * @subpackage Users\n */\n\n/**\n * Map meta capabilities to primitive capabilities.\n *\n * This does not actually compare whether the user ID has the actual capability,\n * just what the capability or capabilities are. Meta capability list value can\n * be 'delete_user', 'edit_user', 'remove_user', 'promote_user', 'delete_post',\n * 'delete_page', 'edit_post', 'edit_page', 'read_post', or 'read_page'.\n *\n * @since 2.0.0\n *\n * @param string $cap       Capability name.\n * @param int    $user_id   User ID.\n * @param int    $object_id Optional. ID of the specific object to check against if `$cap` is a \"meta\" cap.\n *                          \"Meta\" capabilities, e.g. 'edit_post', 'edit_user', etc., are capabilities used\n *                          by map_meta_cap() to map to other \"primitive\" capabilities, e.g. 'edit_posts',\n *                          'edit_others_posts', etc. The parameter is accessed via func_get_args().\n * @return array Actual capabilities for meta capability.\n */\nfunction map_meta_cap( $cap, $user_id ) {\n\t$args = array_slice( func_get_args(), 2 );\n\t$caps = array();\n\n\tswitch ( $cap ) {\n\tcase 'remove_user':\n\t\t$caps[] = 'remove_users';\n\t\tbreak;\n\tcase 'promote_user':\n\tcase 'add_users':\n\t\t$caps[] = 'promote_users';\n\t\tbreak;\n\tcase 'edit_user':\n\tcase 'edit_users':\n\t\t// Allow user to edit itself\n\t\tif ( 'edit_user' == $cap && isset( $args[0] ) && $user_id == $args[0] )\n\t\t\tbreak;\n\n\t\t// In multisite the user must have manage_network_users caps. If editing a super admin, the user must be a super admin.\n\t\tif ( is_multisite() && ( ( ! is_super_admin( $user_id ) && 'edit_user' === $cap && is_super_admin( $args[0] ) ) || ! user_can( $user_id, 'manage_network_users' ) ) ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t} else {\n\t\t\t$caps[] = 'edit_users'; // edit_user maps to edit_users.\n\t\t}\n\t\tbreak;\n\tcase 'delete_post':\n\tcase 'delete_page':\n\t\t$post = get_post( $args[0] );\n\t\tif ( ! $post ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( 'revision' == $post->post_type ) {\n\t\t\t$post = get_post( $post->post_parent );\n\t\t\tif ( ! $post ) {\n\t\t\t\t$caps[] = 'do_not_allow';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$post_type = get_post_type_object( $post->post_type );\n\t\tif ( ! $post_type ) {\n\t\t\t/* translators: 1: post type, 2: capability name */\n\t\t\t_doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability \"%2$s\" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' );\n\t\t\t$caps[] = 'edit_others_posts';\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( ! $post_type->map_meta_cap ) {\n\t\t\t$caps[] = $post_type->cap->$cap;\n\t\t\t// Prior to 3.1 we would re-call map_meta_cap here.\n\t\t\tif ( 'delete_post' == $cap )\n\t\t\t\t$cap = $post_type->cap->$cap;\n\t\t\tbreak;\n\t\t}\n\n\t\t// If the post author is set and the user is the author...\n\t\tif ( $post->post_author && $user_id == $post->post_author ) {\n\t\t\t// If the post is published or scheduled...\n\t\t\tif ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) {\n\t\t\t\t$caps[] = $post_type->cap->delete_published_posts;\n\t\t\t} elseif ( 'trash' == $post->post_status ) {\n\t\t\t\t$status = get_post_meta( $post->ID, '_wp_trash_meta_status', true );\n\t\t\t\tif ( in_array( $status, array( 'publish', 'future' ), true ) ) {\n\t\t\t\t\t$caps[] = $post_type->cap->delete_published_posts;\n\t\t\t\t} else {\n\t\t\t\t\t$caps[] = $post_type->cap->delete_posts;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the post is draft...\n\t\t\t\t$caps[] = $post_type->cap->delete_posts;\n\t\t\t}\n\t\t} else {\n\t\t\t// The user is trying to edit someone else's post.\n\t\t\t$caps[] = $post_type->cap->delete_others_posts;\n\t\t\t// The post is published or scheduled, extra cap required.\n\t\t\tif ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) {\n\t\t\t\t$caps[] = $post_type->cap->delete_published_posts;\n\t\t\t} elseif ( 'private' == $post->post_status ) {\n\t\t\t\t$caps[] = $post_type->cap->delete_private_posts;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t\t// edit_post breaks down to edit_posts, edit_published_posts, or\n\t\t// edit_others_posts\n\tcase 'edit_post':\n\tcase 'edit_page':\n\t\t$post = get_post( $args[0] );\n\t\tif ( ! $post ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( 'revision' == $post->post_type ) {\n\t\t\t$post = get_post( $post->post_parent );\n\t\t\tif ( ! $post ) {\n\t\t\t\t$caps[] = 'do_not_allow';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$post_type = get_post_type_object( $post->post_type );\n\t\tif ( ! $post_type ) {\n\t\t\t/* translators: 1: post type, 2: capability name */\n\t\t\t_doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability \"%2$s\" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' );\n\t\t\t$caps[] = 'edit_others_posts';\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( ! $post_type->map_meta_cap ) {\n\t\t\t$caps[] = $post_type->cap->$cap;\n\t\t\t// Prior to 3.1 we would re-call map_meta_cap here.\n\t\t\tif ( 'edit_post' == $cap )\n\t\t\t\t$cap = $post_type->cap->$cap;\n\t\t\tbreak;\n\t\t}\n\n\t\t// If the post author is set and the user is the author...\n\t\tif ( $post->post_author && $user_id == $post->post_author ) {\n\t\t\t// If the post is published or scheduled...\n\t\t\tif ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) {\n\t\t\t\t$caps[] = $post_type->cap->edit_published_posts;\n\t\t\t} elseif ( 'trash' == $post->post_status ) {\n\t\t\t\t$status = get_post_meta( $post->ID, '_wp_trash_meta_status', true );\n\t\t\t\tif ( in_array( $status, array( 'publish', 'future' ), true ) ) {\n\t\t\t\t\t$caps[] = $post_type->cap->edit_published_posts;\n\t\t\t\t} else {\n\t\t\t\t\t$caps[] = $post_type->cap->edit_posts;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the post is draft...\n\t\t\t\t$caps[] = $post_type->cap->edit_posts;\n\t\t\t}\n\t\t} else {\n\t\t\t// The user is trying to edit someone else's post.\n\t\t\t$caps[] = $post_type->cap->edit_others_posts;\n\t\t\t// The post is published or scheduled, extra cap required.\n\t\t\tif ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) {\n\t\t\t\t$caps[] = $post_type->cap->edit_published_posts;\n\t\t\t} elseif ( 'private' == $post->post_status ) {\n\t\t\t\t$caps[] = $post_type->cap->edit_private_posts;\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase 'read_post':\n\tcase 'read_page':\n\t\t$post = get_post( $args[0] );\n\t\tif ( ! $post ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( 'revision' == $post->post_type ) {\n\t\t\t$post = get_post( $post->post_parent );\n\t\t\tif ( ! $post ) {\n\t\t\t\t$caps[] = 'do_not_allow';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$post_type = get_post_type_object( $post->post_type );\n\t\tif ( ! $post_type ) {\n\t\t\t/* translators: 1: post type, 2: capability name */\n\t\t\t_doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability \"%2$s\" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' );\n\t\t\t$caps[] = 'edit_others_posts';\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( ! $post_type->map_meta_cap ) {\n\t\t\t$caps[] = $post_type->cap->$cap;\n\t\t\t// Prior to 3.1 we would re-call map_meta_cap here.\n\t\t\tif ( 'read_post' == $cap )\n\t\t\t\t$cap = $post_type->cap->$cap;\n\t\t\tbreak;\n\t\t}\n\n\t\t$status_obj = get_post_status_object( $post->post_status );\n\t\tif ( $status_obj->public ) {\n\t\t\t$caps[] = $post_type->cap->read;\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( $post->post_author && $user_id == $post->post_author ) {\n\t\t\t$caps[] = $post_type->cap->read;\n\t\t} elseif ( $status_obj->private ) {\n\t\t\t$caps[] = $post_type->cap->read_private_posts;\n\t\t} else {\n\t\t\t$caps = map_meta_cap( 'edit_post', $user_id, $post->ID );\n\t\t}\n\t\tbreak;\n\tcase 'publish_post':\n\t\t$post = get_post( $args[0] );\n\t\tif ( ! $post ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t\tbreak;\n\t\t}\n\n\t\t$post_type = get_post_type_object( $post->post_type );\n\t\tif ( ! $post_type ) {\n\t\t\t/* translators: 1: post type, 2: capability name */\n\t\t\t_doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability \"%2$s\" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' );\n\t\t\t$caps[] = 'edit_others_posts';\n\t\t\tbreak;\n\t\t}\n\n\t\t$caps[] = $post_type->cap->publish_posts;\n\t\tbreak;\n\tcase 'edit_post_meta':\n\tcase 'delete_post_meta':\n\tcase 'add_post_meta':\n\t\t$post = get_post( $args[0] );\n\t\tif ( ! $post ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t\tbreak;\n\t\t}\n\n\t\t$caps = map_meta_cap( 'edit_post', $user_id, $post->ID );\n\n\t\t$meta_key = isset( $args[ 1 ] ) ? $args[ 1 ] : false;\n\n\t\tif ( $meta_key && has_filter( \"auth_post_meta_{$meta_key}\" ) ) {\n\t\t\t/**\n\t\t\t * Filter whether the user is allowed to add post meta to a post.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$meta_key`, refers to the\n\t\t\t * meta key passed to {@see map_meta_cap()}.\n\t\t\t *\n\t\t\t * @since 3.3.0\n\t\t\t *\n\t\t\t * @param bool   $allowed  Whether the user can add the post meta. Default false.\n\t\t\t * @param string $meta_key The meta key.\n\t\t\t * @param int    $post_id  Post ID.\n\t\t\t * @param int    $user_id  User ID.\n\t\t\t * @param string $cap      Capability name.\n\t\t\t * @param array  $caps     User capabilities.\n\t\t\t */\n\t\t\t$allowed = apply_filters( \"auth_post_meta_{$meta_key}\", false, $meta_key, $post->ID, $user_id, $cap, $caps );\n\t\t\tif ( ! $allowed )\n\t\t\t\t$caps[] = $cap;\n\t\t} elseif ( $meta_key && is_protected_meta( $meta_key, 'post' ) ) {\n\t\t\t$caps[] = $cap;\n\t\t}\n\t\tbreak;\n\tcase 'edit_comment':\n\t\t$comment = get_comment( $args[0] );\n\t\tif ( ! $comment ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t\tbreak;\n\t\t}\n\n\t\t$post = get_post( $comment->comment_post_ID );\n\n\t\t/*\n\t\t * If the post doesn't exist, we have an orphaned comment.\n\t\t * Fall back to the edit_posts capability, instead.\n\t\t */\n\t\tif ( $post ) {\n\t\t\t$caps = map_meta_cap( 'edit_post', $user_id, $post->ID );\n\t\t} else {\n\t\t\t$caps = map_meta_cap( 'edit_posts', $user_id );\n\t\t}\n\t\tbreak;\n\tcase 'unfiltered_upload':\n\t\tif ( defined('ALLOW_UNFILTERED_UPLOADS') && ALLOW_UNFILTERED_UPLOADS && ( !is_multisite() || is_super_admin( $user_id ) )  )\n\t\t\t$caps[] = $cap;\n\t\telse\n\t\t\t$caps[] = 'do_not_allow';\n\t\tbreak;\n\tcase 'unfiltered_html' :\n\t\t// Disallow unfiltered_html for all users, even admins and super admins.\n\t\tif ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML )\n\t\t\t$caps[] = 'do_not_allow';\n\t\telseif ( is_multisite() && ! is_super_admin( $user_id ) )\n\t\t\t$caps[] = 'do_not_allow';\n\t\telse\n\t\t\t$caps[] = $cap;\n\t\tbreak;\n\tcase 'edit_files':\n\tcase 'edit_plugins':\n\tcase 'edit_themes':\n\t\t// Disallow the file editors.\n\t\tif ( defined( 'DISALLOW_FILE_EDIT' ) && DISALLOW_FILE_EDIT )\n\t\t\t$caps[] = 'do_not_allow';\n\t\telseif ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS )\n\t\t\t$caps[] = 'do_not_allow';\n\t\telseif ( is_multisite() && ! is_super_admin( $user_id ) )\n\t\t\t$caps[] = 'do_not_allow';\n\t\telse\n\t\t\t$caps[] = $cap;\n\t\tbreak;\n\tcase 'update_plugins':\n\tcase 'delete_plugins':\n\tcase 'install_plugins':\n\tcase 'upload_plugins':\n\tcase 'update_themes':\n\tcase 'delete_themes':\n\tcase 'install_themes':\n\tcase 'upload_themes':\n\tcase 'update_core':\n\t\t// Disallow anything that creates, deletes, or updates core, plugin, or theme files.\n\t\t// Files in uploads are excepted.\n\t\tif ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t} elseif ( is_multisite() && ! is_super_admin( $user_id ) ) {\n\t\t\t$caps[] = 'do_not_allow';\n\t\t} elseif ( 'upload_themes' === $cap ) {\n\t\t\t$caps[] = 'install_themes';\n\t\t} elseif ( 'upload_plugins' === $cap ) {\n\t\t\t$caps[] = 'install_plugins';\n\t\t} else {\n\t\t\t$caps[] = $cap;\n\t\t}\n\t\tbreak;\n\tcase 'activate_plugins':\n\t\t$caps[] = $cap;\n\t\tif ( is_multisite() ) {\n\t\t\t// update_, install_, and delete_ are handled above with is_super_admin().\n\t\t\t$menu_perms = get_site_option( 'menu_items', array() );\n\t\t\tif ( empty( $menu_perms['plugins'] ) )\n\t\t\t\t$caps[] = 'manage_network_plugins';\n\t\t}\n\t\tbreak;\n\tcase 'delete_user':\n\tcase 'delete_users':\n\t\t// If multisite only super admins can delete users.\n\t\tif ( is_multisite() && ! is_super_admin( $user_id ) )\n\t\t\t$caps[] = 'do_not_allow';\n\t\telse\n\t\t\t$caps[] = 'delete_users'; // delete_user maps to delete_users.\n\t\tbreak;\n\tcase 'create_users':\n\t\tif ( !is_multisite() )\n\t\t\t$caps[] = $cap;\n\t\telseif ( is_super_admin( $user_id ) || get_site_option( 'add_new_users' ) )\n\t\t\t$caps[] = $cap;\n\t\telse\n\t\t\t$caps[] = 'do_not_allow';\n\t\tbreak;\n\tcase 'manage_links' :\n\t\tif ( get_option( 'link_manager_enabled' ) )\n\t\t\t$caps[] = $cap;\n\t\telse\n\t\t\t$caps[] = 'do_not_allow';\n\t\tbreak;\n\tcase 'customize' :\n\t\t$caps[] = 'edit_theme_options';\n\t\tbreak;\n\tcase 'delete_site':\n\t\t$caps[] = 'manage_options';\n\t\tbreak;\n\tdefault:\n\t\t// Handle meta capabilities for custom post types.\n\t\t$post_type_meta_caps = _post_type_meta_capabilities();\n\t\tif ( isset( $post_type_meta_caps[ $cap ] ) ) {\n\t\t\t$args = array_merge( array( $post_type_meta_caps[ $cap ], $user_id ), $args );\n\t\t\treturn call_user_func_array( 'map_meta_cap', $args );\n\t\t}\n\n\t\t// If no meta caps match, return the original cap.\n\t\t$caps[] = $cap;\n\t}\n\n\t/**\n\t * Filter a user's capabilities depending on specific context and/or privilege.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array  $caps    Returns the user's actual capabilities.\n\t * @param string $cap     Capability name.\n\t * @param int    $user_id The user ID.\n\t * @param array  $args    Adds the context to the cap. Typically the object ID.\n\t */\n\treturn apply_filters( 'map_meta_cap', $caps, $cap, $user_id, $args );\n}\n\n/**\n * Whether the current user has a specific capability.\n *\n * While checking against particular roles in place of a capability is supported\n * in part, this practice is discouraged as it may produce unreliable results.\n *\n * @since 2.0.0\n *\n * @see WP_User::has_cap()\n * @see map_meta_cap()\n *\n * @param string $capability Capability name.\n * @param int    $object_id  Optional. ID of the specific object to check against if `$capability` is a \"meta\" cap.\n *                           \"Meta\" capabilities, e.g. 'edit_post', 'edit_user', etc., are capabilities used\n *                           by map_meta_cap() to map to other \"primitive\" capabilities, e.g. 'edit_posts',\n *                           'edit_others_posts', etc. Accessed via func_get_args() and passed to WP_User::has_cap(),\n *                           then map_meta_cap().\n * @return bool Whether the current user has the given capability. If `$capability` is a meta cap and `$object_id` is\n *              passed, whether the current user has the given meta capability for the given object.\n */\nfunction current_user_can( $capability ) {\n\t$current_user = wp_get_current_user();\n\n\tif ( empty( $current_user ) )\n\t\treturn false;\n\n\t$args = array_slice( func_get_args(), 1 );\n\t$args = array_merge( array( $capability ), $args );\n\n\treturn call_user_func_array( array( $current_user, 'has_cap' ), $args );\n}\n\n/**\n * Whether current user has a capability or role for a given blog.\n *\n * @since 3.0.0\n *\n * @param int $blog_id Blog ID\n * @param string $capability Capability or role name.\n * @return bool\n */\nfunction current_user_can_for_blog( $blog_id, $capability ) {\n\t$switched = is_multisite() ? switch_to_blog( $blog_id ) : false;\n\n\t$current_user = wp_get_current_user();\n\n\tif ( empty( $current_user ) ) {\n\t\tif ( $switched ) {\n\t\t\trestore_current_blog();\n\t\t}\n\t\treturn false;\n\t}\n\n\t$args = array_slice( func_get_args(), 2 );\n\t$args = array_merge( array( $capability ), $args );\n\n\t$can = call_user_func_array( array( $current_user, 'has_cap' ), $args );\n\n\tif ( $switched ) {\n\t\trestore_current_blog();\n\t}\n\n\treturn $can;\n}\n\n/**\n * Whether author of supplied post has capability or role.\n *\n * @since 2.9.0\n *\n * @param int|object $post Post ID or post object.\n * @param string $capability Capability or role name.\n * @return bool\n */\nfunction author_can( $post, $capability ) {\n\tif ( !$post = get_post($post) )\n\t\treturn false;\n\n\t$author = get_userdata( $post->post_author );\n\n\tif ( ! $author )\n\t\treturn false;\n\n\t$args = array_slice( func_get_args(), 2 );\n\t$args = array_merge( array( $capability ), $args );\n\n\treturn call_user_func_array( array( $author, 'has_cap' ), $args );\n}\n\n/**\n * Whether a particular user has capability or role.\n *\n * @since 3.1.0\n *\n * @param int|object $user User ID or object.\n * @param string $capability Capability or role name.\n * @return bool\n */\nfunction user_can( $user, $capability ) {\n\tif ( ! is_object( $user ) )\n\t\t$user = get_userdata( $user );\n\n\tif ( ! $user || ! $user->exists() )\n\t\treturn false;\n\n\t$args = array_slice( func_get_args(), 2 );\n\t$args = array_merge( array( $capability ), $args );\n\n\treturn call_user_func_array( array( $user, 'has_cap' ), $args );\n}\n\n/**\n * Retrieves the global WP_Roles instance and instantiates it if necessary.\n *\n * @since 4.3.0\n *\n * @global WP_Roles $wp_roles WP_Roles global instance.\n *\n * @return WP_Roles WP_Roles global instance if not already instantiated.\n */\nfunction wp_roles() {\n\tglobal $wp_roles;\n\n\tif ( ! isset( $wp_roles ) ) {\n\t\t$wp_roles = new WP_Roles();\n\t}\n\treturn $wp_roles;\n}\n\n/**\n * Retrieve role object.\n *\n * @since 2.0.0\n *\n * @param string $role Role name.\n * @return WP_Role|null WP_Role object if found, null if the role does not exist.\n */\nfunction get_role( $role ) {\n\treturn wp_roles()->get_role( $role );\n}\n\n/**\n * Add role, if it does not exist.\n *\n * @since 2.0.0\n *\n * @param string $role Role name.\n * @param string $display_name Display name for role.\n * @param array $capabilities List of capabilities, e.g. array( 'edit_posts' => true, 'delete_posts' => false );\n * @return WP_Role|null WP_Role object if role is added, null if already exists.\n */\nfunction add_role( $role, $display_name, $capabilities = array() ) {\n\tif ( empty( $role ) ) {\n\t\treturn;\n\t}\n\treturn wp_roles()->add_role( $role, $display_name, $capabilities );\n}\n\n/**\n * Remove role, if it exists.\n *\n * @since 2.0.0\n *\n * @param string $role Role name.\n */\nfunction remove_role( $role ) {\n\twp_roles()->remove_role( $role );\n}\n\n/**\n * Retrieve a list of super admins.\n *\n * @since 3.0.0\n *\n * @global array $super_admins\n *\n * @return array List of super admin logins\n */\nfunction get_super_admins() {\n\tglobal $super_admins;\n\n\tif ( isset($super_admins) )\n\t\treturn $super_admins;\n\telse\n\t\treturn get_site_option( 'site_admins', array('admin') );\n}\n\n/**\n * Determine if user is a site admin.\n *\n * @since 3.0.0\n *\n * @param int $user_id (Optional) The ID of a user. Defaults to the current user.\n * @return bool True if the user is a site admin.\n */\nfunction is_super_admin( $user_id = false ) {\n\tif ( ! $user_id || $user_id == get_current_user_id() )\n\t\t$user = wp_get_current_user();\n\telse\n\t\t$user = get_userdata( $user_id );\n\n\tif ( ! $user || ! $user->exists() )\n\t\treturn false;\n\n\tif ( is_multisite() ) {\n\t\t$super_admins = get_super_admins();\n\t\tif ( is_array( $super_admins ) && in_array( $user->user_login, $super_admins ) )\n\t\t\treturn true;\n\t} else {\n\t\tif ( $user->has_cap('delete_users') )\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/category-template.php",
    "content": "<?php\n/**\n * Taxonomy API: Core category-specific template tags\n *\n * @package WordPress\n * @subpackage Template\n * @since 1.2.0\n */\n\n/**\n * Retrieve category link URL.\n *\n * @since 1.0.0\n * @see get_term_link()\n *\n * @param int|object $category Category ID or object.\n * @return string Link on success, empty string if category does not exist.\n */\nfunction get_category_link( $category ) {\n\tif ( ! is_object( $category ) )\n\t\t$category = (int) $category;\n\n\t$category = get_term_link( $category, 'category' );\n\n\tif ( is_wp_error( $category ) )\n\t\treturn '';\n\n\treturn $category;\n}\n\n/**\n * Retrieve category parents with separator.\n *\n * @since 1.2.0\n *\n * @param int $id Category ID.\n * @param bool $link Optional, default is false. Whether to format with link.\n * @param string $separator Optional, default is '/'. How to separate categories.\n * @param bool $nicename Optional, default is false. Whether to use nice name for display.\n * @param array $visited Optional. Already linked to categories to prevent duplicates.\n * @return string|WP_Error A list of category parents on success, WP_Error on failure.\n */\nfunction get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $visited = array() ) {\n\t$chain = '';\n\t$parent = get_term( $id, 'category' );\n\tif ( is_wp_error( $parent ) )\n\t\treturn $parent;\n\n\tif ( $nicename )\n\t\t$name = $parent->slug;\n\telse\n\t\t$name = $parent->name;\n\n\tif ( $parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited ) ) {\n\t\t$visited[] = $parent->parent;\n\t\t$chain .= get_category_parents( $parent->parent, $link, $separator, $nicename, $visited );\n\t}\n\n\tif ( $link )\n\t\t$chain .= '<a href=\"' . esc_url( get_category_link( $parent->term_id ) ) . '\">'.$name.'</a>' . $separator;\n\telse\n\t\t$chain .= $name.$separator;\n\treturn $chain;\n}\n\n/**\n * Retrieve post categories.\n *\n * This tag may be used outside The Loop by passing a post id as the parameter.\n *\n * Note: This function only returns results from the default \"category\" taxonomy.\n * For custom taxonomies use get_the_terms().\n *\n * @since 0.71\n *\n * @param int $id Optional, default to current post ID. The post ID.\n * @return array Array of objects, one for each category assigned to the post.\n */\nfunction get_the_category( $id = false ) {\n\t$categories = get_the_terms( $id, 'category' );\n\tif ( ! $categories || is_wp_error( $categories ) )\n\t\t$categories = array();\n\n\t$categories = array_values( $categories );\n\n\tforeach ( array_keys( $categories ) as $key ) {\n\t\t_make_cat_compat( $categories[$key] );\n\t}\n\n\t/**\n\t * Filter the array of categories to return for a post.\n\t *\n\t * @since 3.1.0\n\t * @since 4.4.0 Added `$id` parameter.\n\t *\n\t * @param array $categories An array of categories to return for the post.\n\t * @param int   $id         ID of the post.\n\t */\n\treturn apply_filters( 'get_the_categories', $categories, $id );\n}\n\n/**\n * Sort categories by name.\n *\n * Used by usort() as a callback, should not be used directly. Can actually be\n * used to sort any term object.\n *\n * @since 2.3.0\n * @access private\n *\n * @param object $a\n * @param object $b\n * @return int\n */\nfunction _usort_terms_by_name( $a, $b ) {\n\treturn strcmp( $a->name, $b->name );\n}\n\n/**\n * Sort categories by ID.\n *\n * Used by usort() as a callback, should not be used directly. Can actually be\n * used to sort any term object.\n *\n * @since 2.3.0\n * @access private\n *\n * @param object $a\n * @param object $b\n * @return int\n */\nfunction _usort_terms_by_ID( $a, $b ) {\n\tif ( $a->term_id > $b->term_id )\n\t\treturn 1;\n\telseif ( $a->term_id < $b->term_id )\n\t\treturn -1;\n\telse\n\t\treturn 0;\n}\n\n/**\n * Retrieve category name based on category ID.\n *\n * @since 0.71\n *\n * @param int $cat_ID Category ID.\n * @return string|WP_Error Category name on success, WP_Error on failure.\n */\nfunction get_the_category_by_ID( $cat_ID ) {\n\t$cat_ID = (int) $cat_ID;\n\t$category = get_term( $cat_ID, 'category' );\n\n\tif ( is_wp_error( $category ) )\n\t\treturn $category;\n\n\treturn ( $category ) ? $category->name : '';\n}\n\n/**\n * Retrieve category list in either HTML list or custom format.\n *\n * @since 1.5.1\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $separator Optional, default is empty string. Separator for between the categories.\n * @param string $parents Optional. How to display the parents.\n * @param int $post_id Optional. Post ID to retrieve categories.\n * @return string\n */\nfunction get_the_category_list( $separator = '', $parents='', $post_id = false ) {\n\tglobal $wp_rewrite;\n\tif ( ! is_object_in_taxonomy( get_post_type( $post_id ), 'category' ) ) {\n\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\treturn apply_filters( 'the_category', '', $separator, $parents );\n\t}\n\n\t/**\n\t * Filter the categories before building the category list.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array    $categories An array of the post's categories.\n\t * @param int|bool $post_id    ID of the post we're retrieving categories for. When `false`, we assume the\n\t *                             current post in the loop.\n\t */\n\t$categories = apply_filters( 'the_category_list', get_the_category( $post_id ), $post_id );\n\n\tif ( empty( $categories ) ) {\n\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\treturn apply_filters( 'the_category', __( 'Uncategorized' ), $separator, $parents );\n\t}\n\n\t$rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? 'rel=\"category tag\"' : 'rel=\"category\"';\n\n\t$thelist = '';\n\tif ( '' == $separator ) {\n\t\t$thelist .= '<ul class=\"post-categories\">';\n\t\tforeach ( $categories as $category ) {\n\t\t\t$thelist .= \"\\n\\t<li>\";\n\t\t\tswitch ( strtolower( $parents ) ) {\n\t\t\t\tcase 'multiple':\n\t\t\t\t\tif ( $category->parent )\n\t\t\t\t\t\t$thelist .= get_category_parents( $category->parent, true, $separator );\n\t\t\t\t\t$thelist .= '<a href=\"' . esc_url( get_category_link( $category->term_id ) ) . '\" ' . $rel . '>' . $category->name.'</a></li>';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'single':\n\t\t\t\t\t$thelist .= '<a href=\"' . esc_url( get_category_link( $category->term_id ) ) . '\"  ' . $rel . '>';\n\t\t\t\t\tif ( $category->parent )\n\t\t\t\t\t\t$thelist .= get_category_parents( $category->parent, false, $separator );\n\t\t\t\t\t$thelist .= $category->name.'</a></li>';\n\t\t\t\t\tbreak;\n\t\t\t\tcase '':\n\t\t\t\tdefault:\n\t\t\t\t\t$thelist .= '<a href=\"' . esc_url( get_category_link( $category->term_id ) ) . '\" ' . $rel . '>' . $category->name.'</a></li>';\n\t\t\t}\n\t\t}\n\t\t$thelist .= '</ul>';\n\t} else {\n\t\t$i = 0;\n\t\tforeach ( $categories as $category ) {\n\t\t\tif ( 0 < $i )\n\t\t\t\t$thelist .= $separator;\n\t\t\tswitch ( strtolower( $parents ) ) {\n\t\t\t\tcase 'multiple':\n\t\t\t\t\tif ( $category->parent )\n\t\t\t\t\t\t$thelist .= get_category_parents( $category->parent, true, $separator );\n\t\t\t\t\t$thelist .= '<a href=\"' . esc_url( get_category_link( $category->term_id ) ) . '\" ' . $rel . '>' . $category->name.'</a>';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'single':\n\t\t\t\t\t$thelist .= '<a href=\"' . esc_url( get_category_link( $category->term_id ) ) . '\" ' . $rel . '>';\n\t\t\t\t\tif ( $category->parent )\n\t\t\t\t\t\t$thelist .= get_category_parents( $category->parent, false, $separator );\n\t\t\t\t\t$thelist .= \"$category->name</a>\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase '':\n\t\t\t\tdefault:\n\t\t\t\t\t$thelist .= '<a href=\"' . esc_url( get_category_link( $category->term_id ) ) . '\" ' . $rel . '>' . $category->name.'</a>';\n\t\t\t}\n\t\t\t++$i;\n\t\t}\n\t}\n\n\t/**\n\t * Filter the category or list of categories.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param array  $thelist   List of categories for the current post.\n\t * @param string $separator Separator used between the categories.\n\t * @param string $parents   How to display the category parents. Accepts 'multiple',\n\t *                          'single', or empty.\n\t */\n\treturn apply_filters( 'the_category', $thelist, $separator, $parents );\n}\n\n/**\n * Check if the current post in within any of the given categories.\n *\n * The given categories are checked against the post's categories' term_ids, names and slugs.\n * Categories given as integers will only be checked against the post's categories' term_ids.\n *\n * Prior to v2.5 of WordPress, category names were not supported.\n * Prior to v2.7, category slugs were not supported.\n * Prior to v2.7, only one category could be compared: in_category( $single_category ).\n * Prior to v2.7, this function could only be used in the WordPress Loop.\n * As of 2.7, the function can be used anywhere if it is provided a post ID or post object.\n *\n * @since 1.2.0\n *\n * @param int|string|array $category Category ID, name or slug, or array of said.\n * @param int|object $post Optional. Post to check instead of the current post. (since 2.7.0)\n * @return bool True if the current post is in any of the given categories.\n */\nfunction in_category( $category, $post = null ) {\n\tif ( empty( $category ) )\n\t\treturn false;\n\n\treturn has_category( $category, $post );\n}\n\n/**\n * Display the category list for the post.\n *\n * @since 0.71\n *\n * @param string $separator Optional, default is empty string. Separator for between the categories.\n * @param string $parents Optional. How to display the parents.\n * @param int $post_id Optional. Post ID to retrieve categories.\n */\nfunction the_category( $separator = '', $parents='', $post_id = false ) {\n\techo get_the_category_list( $separator, $parents, $post_id );\n}\n\n/**\n * Retrieve category description.\n *\n * @since 1.0.0\n *\n * @param int $category Optional. Category ID. Will use global category ID by default.\n * @return string Category description, available.\n */\nfunction category_description( $category = 0 ) {\n\treturn term_description( $category, 'category' );\n}\n\n/**\n * Display or retrieve the HTML dropdown list of categories.\n *\n * The 'hierarchical' argument, which is disabled by default, will override the\n * depth argument, unless it is true. When the argument is false, it will\n * display all of the categories. When it is enabled it will use the value in\n * the 'depth' argument.\n *\n * @since 2.1.0\n * @since 4.2.0 Introduced the `value_field` argument.\n *\n * @param string|array $args {\n *     Optional. Array or string of arguments to generate a categories drop-down element.\n *\n *     @type string       $show_option_all   Text to display for showing all categories. Default empty.\n *     @type string       $show_option_none  Text to display for showing no categories. Default empty.\n *     @type string       $option_none_value Value to use when no category is selected. Default empty.\n *     @type string       $orderby           Which column to use for ordering categories. See get_terms() for a list\n *                                           of accepted values. Default 'id' (term_id).\n *     @type string       $order             Whether to order terms in ascending or descending order. Accepts 'ASC'\n *                                           or 'DESC'. Default 'ASC'.\n *     @type bool         $pad_counts        See get_terms() for an argument description. Default false.\n *     @type bool|int     $show_count        Whether to include post counts. Accepts 0, 1, or their bool equivalents.\n *                                           Default 0.\n *     @type bool|int     $hide_empty        Whether to hide categories that don't have any posts. Accepts 0, 1, or\n *                                           their bool equivalents. Default 1.\n *     @type int          $child_of          Term ID to retrieve child terms of. See get_terms(). Default 0.\n *     @type array|string $exclude           Array or comma/space-separated string of term ids to exclude.\n *                                           If `$include` is non-empty, `$exclude` is ignored. Default empty array.\n *     @type bool|int     $echo              Whether to echo or return the generated markup. Accepts 0, 1, or their\n *                                           bool equivalents. Default 1.\n *     @type bool|int     $hierarchical      Whether to traverse the taxonomy hierarchy. Accepts 0, 1, or their bool\n *                                           equivalents. Default 0.\n *     @type int          $depth             Maximum depth. Default 0.\n *     @type int          $tab_index         Tab index for the select element. Default 0 (no tabindex).\n *     @type string       $name              Value for the 'name' attribute of the select element. Default 'cat'.\n *     @type string       $id                Value for the 'id' attribute of the select element. Defaults to the value\n *                                           of `$name`.\n *     @type string       $class             Value for the 'class' attribute of the select element. Default 'postform'.\n *     @type int|string   $selected          Value of the option that should be selected. Default 0.\n *     @type string       $value_field       Term field that should be used to populate the 'value' attribute\n *                                           of the option elements. Accepts any valid term field: 'term_id', 'name',\n *                                           'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description',\n *                                           'parent', 'count'. Default 'term_id'.\n *     @type string       $taxonomy          Name of the category to retrieve. Default 'category'.\n *     @type bool         $hide_if_empty     True to skip generating markup if no categories are found.\n *                                           Default false (create select element even if no categories are found).\n * }\n * @return string HTML content only if 'echo' argument is 0.\n */\nfunction wp_dropdown_categories( $args = '' ) {\n\t$defaults = array(\n\t\t'show_option_all' => '', 'show_option_none' => '',\n\t\t'orderby' => 'id', 'order' => 'ASC',\n\t\t'show_count' => 0,\n\t\t'hide_empty' => 1, 'child_of' => 0,\n\t\t'exclude' => '', 'echo' => 1,\n\t\t'selected' => 0, 'hierarchical' => 0,\n\t\t'name' => 'cat', 'id' => '',\n\t\t'class' => 'postform', 'depth' => 0,\n\t\t'tab_index' => 0, 'taxonomy' => 'category',\n\t\t'hide_if_empty' => false, 'option_none_value' => -1,\n\t\t'value_field' => 'term_id',\n\t);\n\n\t$defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0;\n\n\t// Back compat.\n\tif ( isset( $args['type'] ) && 'link' == $args['type'] ) {\n\t\t/* translators: 1: \"type => link\", 2: \"taxonomy => link_category\" alternative */\n\t\t_deprecated_argument( __FUNCTION__, '3.0',\n\t\t\tsprintf( __( '%1$s is deprecated. Use %2$s instead.' ),\n\t\t\t\t'<code>type => link</code>',\n\t\t\t\t'<code>taxonomy => link_category</code>'\n\t\t\t)\n\t\t);\n\t\t$args['taxonomy'] = 'link_category';\n\t}\n\n\t$r = wp_parse_args( $args, $defaults );\n\t$option_none_value = $r['option_none_value'];\n\n\tif ( ! isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] ) {\n\t\t$r['pad_counts'] = true;\n\t}\n\n\t$tab_index = $r['tab_index'];\n\n\t$tab_index_attribute = '';\n\tif ( (int) $tab_index > 0 ) {\n\t\t$tab_index_attribute = \" tabindex=\\\"$tab_index\\\"\";\n\t}\n\n\t// Avoid clashes with the 'name' param of get_terms().\n\t$get_terms_args = $r;\n\tunset( $get_terms_args['name'] );\n\t$categories = get_terms( $r['taxonomy'], $get_terms_args );\n\n\t$name = esc_attr( $r['name'] );\n\t$class = esc_attr( $r['class'] );\n\t$id = $r['id'] ? esc_attr( $r['id'] ) : $name;\n\n\tif ( ! $r['hide_if_empty'] || ! empty( $categories ) ) {\n\t\t$output = \"<select name='$name' id='$id' class='$class' $tab_index_attribute>\\n\";\n\t} else {\n\t\t$output = '';\n\t}\n\tif ( empty( $categories ) && ! $r['hide_if_empty'] && ! empty( $r['show_option_none'] ) ) {\n\n\t\t/**\n\t\t * Filter a taxonomy drop-down display element.\n\t\t *\n\t\t * A variety of taxonomy drop-down display elements can be modified\n\t\t * just prior to display via this filter. Filterable arguments include\n\t\t * 'show_option_none', 'show_option_all', and various forms of the\n\t\t * term name.\n\t\t *\n\t\t * @since 1.2.0\n\t\t *\n\t\t * @see wp_dropdown_categories()\n\t\t *\n\t\t * @param string $element Taxonomy element to list.\n\t\t */\n\t\t$show_option_none = apply_filters( 'list_cats', $r['show_option_none'] );\n\t\t$output .= \"\\t<option value='\" . esc_attr( $option_none_value ) . \"' selected='selected'>$show_option_none</option>\\n\";\n\t}\n\n\tif ( ! empty( $categories ) ) {\n\n\t\tif ( $r['show_option_all'] ) {\n\n\t\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t\t$show_option_all = apply_filters( 'list_cats', $r['show_option_all'] );\n\t\t\t$selected = ( '0' === strval($r['selected']) ) ? \" selected='selected'\" : '';\n\t\t\t$output .= \"\\t<option value='0'$selected>$show_option_all</option>\\n\";\n\t\t}\n\n\t\tif ( $r['show_option_none'] ) {\n\n\t\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t\t$show_option_none = apply_filters( 'list_cats', $r['show_option_none'] );\n\t\t\t$selected = selected( $option_none_value, $r['selected'], false );\n\t\t\t$output .= \"\\t<option value='\" . esc_attr( $option_none_value ) . \"'$selected>$show_option_none</option>\\n\";\n\t\t}\n\n\t\tif ( $r['hierarchical'] ) {\n\t\t\t$depth = $r['depth'];  // Walk the full depth.\n\t\t} else {\n\t\t\t$depth = -1; // Flat.\n\t\t}\n\t\t$output .= walk_category_dropdown_tree( $categories, $depth, $r );\n\t}\n\n\tif ( ! $r['hide_if_empty'] || ! empty( $categories ) ) {\n\t\t$output .= \"</select>\\n\";\n\t}\n\t/**\n\t * Filter the taxonomy drop-down output.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $output HTML output.\n\t * @param array  $r      Arguments used to build the drop-down.\n\t */\n\t$output = apply_filters( 'wp_dropdown_cats', $output, $r );\n\n\tif ( $r['echo'] ) {\n\t\techo $output;\n\t}\n\treturn $output;\n}\n\n/**\n * Display or retrieve the HTML list of categories.\n *\n * @since 2.1.0\n * @since 4.4.0 Introduced the `hide_title_if_empty` and `separator` arguments. The `current_category` argument was modified to\n *              optionally accept an array of values.\n *\n * @param string|array $args {\n *     Array of optional arguments.\n *\n *     @type string       $show_option_all       Text to display for showing all categories. Default empty string.\n *     @type string       $show_option_none      Text to display for the 'no categories' option.\n *                                               Default 'No categories'.\n *     @type string       $orderby               The column to use for ordering categories. Default 'ID'.\n *     @type string       $order                 Which direction to order categories. Accepts 'ASC' or 'DESC'.\n *                                               Default 'ASC'.\n *     @type bool|int     $show_count            Whether to show how many posts are in the category. Default 0.\n *     @type bool|int     $hide_empty            Whether to hide categories that don't have any posts attached to them.\n *                                               Default 1.\n *     @type bool|int     $use_desc_for_title    Whether to use the category description as the title attribute.\n *                                               Default 1.\n *     @type string       $feed                  Text to use for the feed link. Default 'Feed for all posts filed\n *                                               under [cat name]'.\n *     @type string       $feed_type             Feed type. Used to build feed link. See {@link get_term_feed_link()}.\n *                                               Default empty string (default feed).\n *     @type string       $feed_image            URL of an image to use for the feed link. Default empty string.\n *     @type int          $child_of              Term ID to retrieve child terms of. See {@link get_terms()}. Default 0.\n *     @type array|string $exclude               Array or comma/space-separated string of term IDs to exclude.\n *                                               If `$hierarchical` is true, descendants of `$exclude` terms will also\n *                                               be excluded; see `$exclude_tree`. See {@link get_terms()}.\n *                                               Default empty string.\n *     @type array|string $exclude_tree          Array or comma/space-separated string of term IDs to exclude, along\n *                                               with their descendants. See {@link get_terms()}. Default empty string.\n *     @type bool|int     $echo                  True to echo markup, false to return it. Default 1.\n *     @type int|array    $current_category      ID of category, or array of IDs of categories, that should get the\n *                                               'current-cat' class. Default 0.\n *     @type bool         $hierarchical          Whether to include terms that have non-empty descendants.\n *                                               See {@link get_terms()}. Default true.\n *     @type string       $title_li              Text to use for the list title `<li>` element. Pass an empty string\n *                                               to disable. Default 'Categories'.\n *     @type bool         $hide_title_if_empty   Whether to hide the `$title_li` element if there are no terms in\n *                                               the list. Default false (title will always be shown).\n *     @type int          $depth                 Category depth. Used for tab indentation. Default 0.\n *     @type string       $taxonomy              Taxonomy name. Default 'category'.\n * }\n * @return false|string HTML content only if 'echo' argument is 0.\n */\nfunction wp_list_categories( $args = '' ) {\n\t$defaults = array(\n\t\t'show_option_all' => '', 'show_option_none' => __('No categories'),\n\t\t'orderby' => 'name', 'order' => 'ASC',\n\t\t'style' => 'list',\n\t\t'show_count' => 0, 'hide_empty' => 1,\n\t\t'use_desc_for_title' => 1, 'child_of' => 0,\n\t\t'feed' => '', 'feed_type' => '',\n\t\t'feed_image' => '', 'exclude' => '',\n\t\t'exclude_tree' => '', 'current_category' => 0,\n\t\t'hierarchical' => true, 'title_li' => __( 'Categories' ),\n\t\t'hide_title_if_empty' => false,\n\t\t'echo' => 1, 'depth' => 0,\n\t\t'separator' => '<br />',\n\t\t'taxonomy' => 'category'\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\tif ( !isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] )\n\t\t$r['pad_counts'] = true;\n\n\t// Descendants of exclusions should be excluded too.\n\tif ( true == $r['hierarchical'] ) {\n\t\t$exclude_tree = array();\n\n\t\tif ( $r['exclude_tree'] ) {\n\t\t\t$exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $r['exclude_tree'] ) );\n\t\t}\n\n\t\tif ( $r['exclude'] ) {\n\t\t\t$exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $r['exclude'] ) );\n\t\t}\n\n\t\t$r['exclude_tree'] = $exclude_tree;\n\t\t$r['exclude'] = '';\n\t}\n\n\tif ( ! isset( $r['class'] ) )\n\t\t$r['class'] = ( 'category' == $r['taxonomy'] ) ? 'categories' : $r['taxonomy'];\n\n\tif ( ! taxonomy_exists( $r['taxonomy'] ) ) {\n\t\treturn false;\n\t}\n\n\t$show_option_all = $r['show_option_all'];\n\t$show_option_none = $r['show_option_none'];\n\n\t$categories = get_categories( $r );\n\n\t$output = '';\n\tif ( $r['title_li'] && 'list' == $r['style'] && ( ! empty( $categories ) || ! $r['hide_title_if_empty'] ) ) {\n\t\t$output = '<li class=\"' . esc_attr( $r['class'] ) . '\">' . $r['title_li'] . '<ul>';\n\t}\n\tif ( empty( $categories ) ) {\n\t\tif ( ! empty( $show_option_none ) ) {\n\t\t\tif ( 'list' == $r['style'] ) {\n\t\t\t\t$output .= '<li class=\"cat-item-none\">' . $show_option_none . '</li>';\n\t\t\t} else {\n\t\t\t\t$output .= $show_option_none;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ( ! empty( $show_option_all ) ) {\n\n\t\t\t$posts_page = '';\n\n\t\t\t// For taxonomies that belong only to custom post types, point to a valid archive.\n\t\t\t$taxonomy_object = get_taxonomy( $r['taxonomy'] );\n\t\t\tif ( ! in_array( 'post', $taxonomy_object->object_type ) && ! in_array( 'page', $taxonomy_object->object_type ) ) {\n\t\t\t\tforeach ( $taxonomy_object->object_type as $object_type ) {\n\t\t\t\t\t$_object_type = get_post_type_object( $object_type );\n\n\t\t\t\t\t// Grab the first one.\n\t\t\t\t\tif ( ! empty( $_object_type->has_archive ) ) {\n\t\t\t\t\t\t$posts_page = get_post_type_archive_link( $object_type );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fallback for the 'All' link is the posts page.\n\t\t\tif ( ! $posts_page ) {\n\t\t\t\tif ( 'page' == get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) ) {\n\t\t\t\t\t$posts_page = get_permalink( get_option( 'page_for_posts' ) );\n\t\t\t\t} else {\n\t\t\t\t\t$posts_page = home_url( '/' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$posts_page = esc_url( $posts_page );\n\t\t\tif ( 'list' == $r['style'] ) {\n\t\t\t\t$output .= \"<li class='cat-item-all'><a href='$posts_page'>$show_option_all</a></li>\";\n\t\t\t} else {\n\t\t\t\t$output .= \"<a href='$posts_page'>$show_option_all</a>\";\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $r['current_category'] ) && ( is_category() || is_tax() || is_tag() ) ) {\n\t\t\t$current_term_object = get_queried_object();\n\t\t\tif ( $current_term_object && $r['taxonomy'] === $current_term_object->taxonomy ) {\n\t\t\t\t$r['current_category'] = get_queried_object_id();\n\t\t\t}\n\t\t}\n\n\t\tif ( $r['hierarchical'] ) {\n\t\t\t$depth = $r['depth'];\n\t\t} else {\n\t\t\t$depth = -1; // Flat.\n\t\t}\n\t\t$output .= walk_category_tree( $categories, $depth, $r );\n\t}\n\n\tif ( $r['title_li'] && 'list' == $r['style'] )\n\t\t$output .= '</ul></li>';\n\n\t/**\n\t * Filter the HTML output of a taxonomy list.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $output HTML output.\n\t * @param array  $args   An array of taxonomy-listing arguments.\n\t */\n\t$html = apply_filters( 'wp_list_categories', $output, $args );\n\n\tif ( $r['echo'] ) {\n\t\techo $html;\n\t} else {\n\t\treturn $html;\n\t}\n}\n\n/**\n * Display tag cloud.\n *\n * The text size is set by the 'smallest' and 'largest' arguments, which will\n * use the 'unit' argument value for the CSS text size unit. The 'format'\n * argument can be 'flat' (default), 'list', or 'array'. The flat value for the\n * 'format' argument will separate tags with spaces. The list value for the\n * 'format' argument will format the tags in a UL HTML list. The array value for\n * the 'format' argument will return in PHP array type format.\n *\n * The 'orderby' argument will accept 'name' or 'count' and defaults to 'name'.\n * The 'order' is the direction to sort, defaults to 'ASC' and can be 'DESC'.\n *\n * The 'number' argument is how many tags to return. By default, the limit will\n * be to return the top 45 tags in the tag cloud list.\n *\n * The 'topic_count_text' argument is a nooped plural from _n_noop() to generate the\n * text for the tooltip of the tag link.\n *\n * The 'topic_count_text_callback' argument is a function, which given the count\n * of the posts with that tag returns a text for the tooltip of the tag link.\n *\n * The 'post_type' argument is used only when 'link' is set to 'edit'. It determines the post_type\n * passed to edit.php for the popular tags edit links.\n *\n * The 'exclude' and 'include' arguments are used for the {@link get_tags()}\n * function. Only one should be used, because only one will be used and the\n * other ignored, if they are both set.\n *\n * @since 2.3.0\n *\n * @param array|string|null $args Optional. Override default arguments.\n * @return void|array Generated tag cloud, only if no failures and 'array' is set for the 'format' argument.\n *                    Otherwise, this function outputs the tag cloud.\n */\nfunction wp_tag_cloud( $args = '' ) {\n\t$defaults = array(\n\t\t'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45,\n\t\t'format' => 'flat', 'separator' => \"\\n\", 'orderby' => 'name', 'order' => 'ASC',\n\t\t'exclude' => '', 'include' => '', 'link' => 'view', 'taxonomy' => 'post_tag', 'post_type' => '', 'echo' => true\n\t);\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$tags = get_terms( $args['taxonomy'], array_merge( $args, array( 'orderby' => 'count', 'order' => 'DESC' ) ) ); // Always query top tags\n\n\tif ( empty( $tags ) || is_wp_error( $tags ) )\n\t\treturn;\n\n\tforeach ( $tags as $key => $tag ) {\n\t\tif ( 'edit' == $args['link'] )\n\t\t\t$link = get_edit_term_link( $tag->term_id, $tag->taxonomy, $args['post_type'] );\n\t\telse\n\t\t\t$link = get_term_link( intval($tag->term_id), $tag->taxonomy );\n\t\tif ( is_wp_error( $link ) )\n\t\t\treturn;\n\n\t\t$tags[ $key ]->link = $link;\n\t\t$tags[ $key ]->id = $tag->term_id;\n\t}\n\n\t$return = wp_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args\n\n\t/**\n\t * Filter the tag cloud output.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $return HTML output of the tag cloud.\n\t * @param array  $args   An array of tag cloud arguments.\n\t */\n\t$return = apply_filters( 'wp_tag_cloud', $return, $args );\n\n\tif ( 'array' == $args['format'] || empty($args['echo']) )\n\t\treturn $return;\n\n\techo $return;\n}\n\n/**\n * Default topic count scaling for tag links\n *\n * @param int $count number of posts with that tag\n * @return int scaled count\n */\nfunction default_topic_count_scale( $count ) {\n\treturn round(log10($count + 1) * 100);\n}\n\n/**\n * Generates a tag cloud (heatmap) from provided data.\n *\n * The text size is set by the 'smallest' and 'largest' arguments, which will\n * use the 'unit' argument value for the CSS text size unit. The 'format'\n * argument can be 'flat' (default), 'list', or 'array'. The flat value for the\n * 'format' argument will separate tags with spaces. The list value for the\n * 'format' argument will format the tags in a UL HTML list. The array value for\n * the 'format' argument will return in PHP array type format.\n *\n * The 'tag_cloud_sort' filter allows you to override the sorting.\n * Passed to the filter: $tags array and $args array, has to return the $tags array\n * after sorting it.\n *\n * The 'orderby' argument will accept 'name' or 'count' and defaults to 'name'.\n * The 'order' is the direction to sort, defaults to 'ASC' and can be 'DESC' or\n * 'RAND'.\n *\n * The 'number' argument is how many tags to return. By default, the limit will\n * be to return the entire tag cloud list.\n *\n * The 'topic_count_text' argument is a nooped plural from _n_noop() to generate the\n * text for the tooltip of the tag link.\n *\n * The 'topic_count_text_callback' argument is a function, which given the count\n * of the posts with that tag returns a text for the tooltip of the tag link.\n *\n * @todo Complete functionality.\n * @since 2.3.0\n *\n * @param array $tags List of tags.\n * @param string|array $args Optional, override default arguments.\n * @return string|array Tag cloud as a string or an array, depending on 'format' argument.\n */\nfunction wp_generate_tag_cloud( $tags, $args = '' ) {\n\t$defaults = array(\n\t\t'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 0,\n\t\t'format' => 'flat', 'separator' => \"\\n\", 'orderby' => 'name', 'order' => 'ASC',\n\t\t'topic_count_text' => null, 'topic_count_text_callback' => null,\n\t\t'topic_count_scale_callback' => 'default_topic_count_scale', 'filter' => 1,\n\t);\n\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$return = ( 'array' === $args['format'] ) ? array() : '';\n\n\tif ( empty( $tags ) ) {\n\t\treturn $return;\n\t}\n\n\t// Juggle topic count tooltips:\n\tif ( isset( $args['topic_count_text'] ) ) {\n\t\t// First look for nooped plural support via topic_count_text.\n\t\t$translate_nooped_plural = $args['topic_count_text'];\n\t} elseif ( ! empty( $args['topic_count_text_callback'] ) ) {\n\t\t// Look for the alternative callback style. Ignore the previous default.\n\t\tif ( $args['topic_count_text_callback'] === 'default_topic_count_text' ) {\n\t\t\t$translate_nooped_plural = _n_noop( '%s topic', '%s topics' );\n\t\t} else {\n\t\t\t$translate_nooped_plural = false;\n\t\t}\n\t} elseif ( isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) {\n\t\t// If no callback exists, look for the old-style single_text and multiple_text arguments.\n\t\t$translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] );\n\t} else {\n\t\t// This is the default for when no callback, plural, or argument is passed in.\n\t\t$translate_nooped_plural = _n_noop( '%s topic', '%s topics' );\n\t}\n\n\t/**\n\t * Filter how the items in a tag cloud are sorted.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $tags Ordered array of terms.\n\t * @param array $args An array of tag cloud arguments.\n\t */\n\t$tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args );\n\tif ( empty( $tags_sorted ) ) {\n\t\treturn $return;\n\t}\n\n\tif ( $tags_sorted !== $tags ) {\n\t\t$tags = $tags_sorted;\n\t\tunset( $tags_sorted );\n\t} else {\n\t\tif ( 'RAND' === $args['order'] ) {\n\t\t\tshuffle( $tags );\n\t\t} else {\n\t\t\t// SQL cannot save you; this is a second (potentially different) sort on a subset of data.\n\t\t\tif ( 'name' === $args['orderby'] ) {\n\t\t\t\tuasort( $tags, '_wp_object_name_sort_cb' );\n\t\t\t} else {\n\t\t\t\tuasort( $tags, '_wp_object_count_sort_cb' );\n\t\t\t}\n\n\t\t\tif ( 'DESC' === $args['order'] ) {\n\t\t\t\t$tags = array_reverse( $tags, true );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( $args['number'] > 0 )\n\t\t$tags = array_slice( $tags, 0, $args['number'] );\n\n\t$counts = array();\n\t$real_counts = array(); // For the alt tag\n\tforeach ( (array) $tags as $key => $tag ) {\n\t\t$real_counts[ $key ] = $tag->count;\n\t\t$counts[ $key ] = call_user_func( $args['topic_count_scale_callback'], $tag->count );\n\t}\n\n\t$min_count = min( $counts );\n\t$spread = max( $counts ) - $min_count;\n\tif ( $spread <= 0 )\n\t\t$spread = 1;\n\t$font_spread = $args['largest'] - $args['smallest'];\n\tif ( $font_spread < 0 )\n\t\t$font_spread = 1;\n\t$font_step = $font_spread / $spread;\n\n\t// Assemble the data that will be used to generate the tag cloud markup.\n\t$tags_data = array();\n\tforeach ( $tags as $key => $tag ) {\n\t\t$tag_id = isset( $tag->id ) ? $tag->id : $key;\n\n\t\t$count = $counts[ $key ];\n\t\t$real_count = $real_counts[ $key ];\n\n\t\tif ( $translate_nooped_plural ) {\n\t\t\t$title = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) );\n\t\t} else {\n\t\t\t$title = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args );\n\t\t}\n\n\t\t$tags_data[] = array(\n\t\t\t'id'         => $tag_id,\n\t\t\t'url'        => '#' != $tag->link ? $tag->link : '#',\n\t\t\t'name'\t     => $tag->name,\n\t\t\t'title'      => $title,\n\t\t\t'slug'       => $tag->slug,\n\t\t\t'real_count' => $real_count,\n\t\t\t'class'\t     => 'tag-link-' . $tag_id,\n\t\t\t'font_size'  => $args['smallest'] + ( $count - $min_count ) * $font_step,\n\t\t);\n\t}\n\n\t/**\n\t * Filter the data used to generate the tag cloud.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param array $tags_data An array of term data for term used to generate the tag cloud.\n\t */\n\t$tags_data = apply_filters( 'wp_generate_tag_cloud_data', $tags_data );\n\n\t$a = array();\n\n\t// generate the output links array\n\tforeach ( $tags_data as $key => $tag_data ) {\n\t\t$a[] = \"<a href='\" . esc_url( $tag_data['url'] ) . \"' class='\" . esc_attr( $tag_data['class'] ) . \"' title='\" . esc_attr( $tag_data['title'] ) . \"' style='font-size: \" . esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ) . \";'>\" . esc_html( $tag_data['name'] ) . \"</a>\";\n\t}\n\n\tswitch ( $args['format'] ) {\n\t\tcase 'array' :\n\t\t\t$return =& $a;\n\t\t\tbreak;\n\t\tcase 'list' :\n\t\t\t$return = \"<ul class='wp-tag-cloud'>\\n\\t<li>\";\n\t\t\t$return .= join( \"</li>\\n\\t<li>\", $a );\n\t\t\t$return .= \"</li>\\n</ul>\\n\";\n\t\t\tbreak;\n\t\tdefault :\n\t\t\t$return = join( $args['separator'], $a );\n\t\t\tbreak;\n\t}\n\n\tif ( $args['filter'] ) {\n\t\t/**\n\t\t * Filter the generated output of a tag cloud.\n\t\t *\n\t\t * The filter is only evaluated if a true value is passed\n\t\t * to the $filter argument in wp_generate_tag_cloud().\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @see wp_generate_tag_cloud()\n\t\t *\n\t\t * @param array|string $return String containing the generated HTML tag cloud output\n\t\t *                             or an array of tag links if the 'format' argument\n\t\t *                             equals 'array'.\n\t\t * @param array        $tags   An array of terms used in the tag cloud.\n\t\t * @param array        $args   An array of wp_generate_tag_cloud() arguments.\n\t\t */\n\t\treturn apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args );\n\t}\n\n\telse\n\t\treturn $return;\n}\n\n/**\n * Callback for comparing objects based on name\n *\n * @since 3.1.0\n * @access private\n * @return int\n */\nfunction _wp_object_name_sort_cb( $a, $b ) {\n\treturn strnatcasecmp( $a->name, $b->name );\n}\n\n/**\n * Callback for comparing objects based on count\n *\n * @since 3.1.0\n * @access private\n * @return bool\n */\nfunction _wp_object_count_sort_cb( $a, $b ) {\n\treturn ( $a->count > $b->count );\n}\n\n//\n// Helper functions\n//\n\n/**\n * Retrieve HTML list content for category list.\n *\n * @uses Walker_Category to create HTML list content.\n * @since 2.1.0\n * @see Walker_Category::walk() for parameters and return description.\n * @return string\n */\nfunction walk_category_tree() {\n\t$args = func_get_args();\n\t// the user's options are the third parameter\n\tif ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) {\n\t\t$walker = new Walker_Category;\n\t} else {\n\t\t$walker = $args[2]['walker'];\n\t}\n\treturn call_user_func_array( array( $walker, 'walk' ), $args );\n}\n\n/**\n * Retrieve HTML dropdown (select) content for category list.\n *\n * @uses Walker_CategoryDropdown to create HTML dropdown content.\n * @since 2.1.0\n * @see Walker_CategoryDropdown::walk() for parameters and return description.\n * @return string\n */\nfunction walk_category_dropdown_tree() {\n\t$args = func_get_args();\n\t// the user's options are the third parameter\n\tif ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) {\n\t\t$walker = new Walker_CategoryDropdown;\n\t} else {\n\t\t$walker = $args[2]['walker'];\n\t}\n\treturn call_user_func_array( array( $walker, 'walk' ), $args );\n}\n\n//\n// Tags\n//\n\n/**\n * Retrieve the link to the tag.\n *\n * @since 2.3.0\n * @see get_term_link()\n *\n * @param int|object $tag Tag ID or object.\n * @return string Link on success, empty string if tag does not exist.\n */\nfunction get_tag_link( $tag ) {\n\tif ( ! is_object( $tag ) )\n\t\t$tag = (int) $tag;\n\n\t$tag = get_term_link( $tag, 'post_tag' );\n\n\tif ( is_wp_error( $tag ) )\n\t\treturn '';\n\n\treturn $tag;\n}\n\n/**\n * Retrieve the tags for a post.\n *\n * @since 2.3.0\n *\n * @param int $id Post ID.\n * @return array|false|WP_Error Array of tag objects on success, false on failure.\n */\nfunction get_the_tags( $id = 0 ) {\n\n\t/**\n\t * Filter the array of tags for the given post.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @see get_the_terms()\n\t *\n\t * @param array $terms An array of tags for the given post.\n\t */\n\treturn apply_filters( 'get_the_tags', get_the_terms( $id, 'post_tag' ) );\n}\n\n/**\n * Retrieve the tags for a post formatted as a string.\n *\n * @since 2.3.0\n *\n * @param string $before Optional. Before tags.\n * @param string $sep Optional. Between tags.\n * @param string $after Optional. After tags.\n * @param int $id Optional. Post ID. Defaults to the current post.\n * @return string|false|WP_Error A list of tags on success, false if there are no terms, WP_Error on failure.\n */\nfunction get_the_tag_list( $before = '', $sep = '', $after = '', $id = 0 ) {\n\n\t/**\n\t * Filter the tags list for a given post.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $tag_list List of tags.\n\t * @param string $before   String to use before tags.\n\t * @param string $sep      String to use between the tags.\n\t * @param string $after    String to use after tags.\n\t * @param int    $id       Post ID.\n\t */\n\treturn apply_filters( 'the_tags', get_the_term_list( $id, 'post_tag', $before, $sep, $after ), $before, $sep, $after, $id );\n}\n\n/**\n * Retrieve the tags for a post.\n *\n * @since 2.3.0\n *\n * @param string $before Optional. Before list.\n * @param string $sep Optional. Separate items using this.\n * @param string $after Optional. After list.\n */\nfunction the_tags( $before = null, $sep = ', ', $after = '' ) {\n\tif ( null === $before )\n\t\t$before = __('Tags: ');\n\techo get_the_tag_list($before, $sep, $after);\n}\n\n/**\n * Retrieve tag description.\n *\n * @since 2.8.0\n *\n * @param int $tag Optional. Tag ID. Will use global tag ID by default.\n * @return string Tag description, available.\n */\nfunction tag_description( $tag = 0 ) {\n\treturn term_description( $tag );\n}\n\n/**\n * Retrieve term description.\n *\n * @since 2.8.0\n *\n * @param int $term Optional. Term ID. Will use global term ID by default.\n * @param string $taxonomy Optional taxonomy name. Defaults to 'post_tag'.\n * @return string Term description, available.\n */\nfunction term_description( $term = 0, $taxonomy = 'post_tag' ) {\n\tif ( ! $term && ( is_tax() || is_tag() || is_category() ) ) {\n\t\t$term = get_queried_object();\n\t\tif ( $term ) {\n\t\t\t$taxonomy = $term->taxonomy;\n\t\t\t$term = $term->term_id;\n\t\t}\n\t}\n\t$description = get_term_field( 'description', $term, $taxonomy );\n\treturn is_wp_error( $description ) ? '' : $description;\n}\n\n/**\n * Retrieve the terms of the taxonomy that are attached to the post.\n *\n * @since 2.5.0\n *\n * @param int|object $post Post ID or object.\n * @param string $taxonomy Taxonomy name.\n * @return array|false|WP_Error Array of term objects on success, false if there are no terms\n *                              or the post does not exist, WP_Error on failure.\n */\nfunction get_the_terms( $post, $taxonomy ) {\n\tif ( ! $post = get_post( $post ) )\n\t\treturn false;\n\n\t$terms = get_object_term_cache( $post->ID, $taxonomy );\n\tif ( false === $terms ) {\n\t\t$terms = wp_get_object_terms( $post->ID, $taxonomy );\n\t\tif ( ! is_wp_error( $terms ) ) {\n\t\t\t$to_cache = array();\n\t\t\tforeach ( $terms as $key => $term ) {\n\t\t\t\t$to_cache[ $key ] = $term->data;\n\t\t\t}\n\t\t\twp_cache_add( $post->ID, $to_cache, $taxonomy . '_relationships' );\n\t\t}\n\t}\n\n\tif ( ! is_wp_error( $terms ) ) {\n\t\t$terms = array_map( 'get_term', $terms );\n\t}\n\n\t/**\n\t * Filter the list of terms attached to the given post.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array|WP_Error $terms    List of attached terms, or WP_Error on failure.\n\t * @param int            $post_id  Post ID.\n\t * @param string         $taxonomy Name of the taxonomy.\n\t */\n\t$terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy );\n\n\tif ( empty( $terms ) )\n\t\treturn false;\n\n\treturn $terms;\n}\n\n/**\n * Retrieve a post's terms as a list with specified format.\n *\n * @since 2.5.0\n *\n * @param int $id Post ID.\n * @param string $taxonomy Taxonomy name.\n * @param string $before Optional. Before list.\n * @param string $sep Optional. Separate items using this.\n * @param string $after Optional. After list.\n * @return string|false|WP_Error A list of terms on success, false if there are no terms, WP_Error on failure.\n */\nfunction get_the_term_list( $id, $taxonomy, $before = '', $sep = '', $after = '' ) {\n\t$terms = get_the_terms( $id, $taxonomy );\n\n\tif ( is_wp_error( $terms ) )\n\t\treturn $terms;\n\n\tif ( empty( $terms ) )\n\t\treturn false;\n\n\t$links = array();\n\n\tforeach ( $terms as $term ) {\n\t\t$link = get_term_link( $term, $taxonomy );\n\t\tif ( is_wp_error( $link ) ) {\n\t\t\treturn $link;\n\t\t}\n\t\t$links[] = '<a href=\"' . esc_url( $link ) . '\" rel=\"tag\">' . $term->name . '</a>';\n\t}\n\n\t/**\n\t * Filter the term links for a given taxonomy.\n\t *\n\t * The dynamic portion of the filter name, `$taxonomy`, refers\n\t * to the taxonomy slug.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array $links An array of term links.\n\t */\n\t$term_links = apply_filters( \"term_links-$taxonomy\", $links );\n\n\treturn $before . join( $sep, $term_links ) . $after;\n}\n\n/**\n * Display the terms in a list.\n *\n * @since 2.5.0\n *\n * @param int $id Post ID.\n * @param string $taxonomy Taxonomy name.\n * @param string $before Optional. Before list.\n * @param string $sep Optional. Separate items using this.\n * @param string $after Optional. After list.\n * @return false|void False on WordPress error.\n */\nfunction the_terms( $id, $taxonomy, $before = '', $sep = ', ', $after = '' ) {\n\t$term_list = get_the_term_list( $id, $taxonomy, $before, $sep, $after );\n\n\tif ( is_wp_error( $term_list ) )\n\t\treturn false;\n\n\t/**\n\t * Filter the list of terms to display.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param array  $term_list List of terms to display.\n\t * @param string $taxonomy  The taxonomy name.\n\t * @param string $before    String to use before the terms.\n\t * @param string $sep       String to use between the terms.\n\t * @param string $after     String to use after the terms.\n\t */\n\techo apply_filters( 'the_terms', $term_list, $taxonomy, $before, $sep, $after );\n}\n\n/**\n * Check if the current post has any of given category.\n *\n * @since 3.1.0\n *\n * @param string|int|array $category Optional. The category name/term_id/slug or array of them to check for.\n * @param int|object $post Optional. Post to check instead of the current post.\n * @return bool True if the current post has any of the given categories (or any category, if no category specified).\n */\nfunction has_category( $category = '', $post = null ) {\n\treturn has_term( $category, 'category', $post );\n}\n\n/**\n * Check if the current post has any of given tags.\n *\n * The given tags are checked against the post's tags' term_ids, names and slugs.\n * Tags given as integers will only be checked against the post's tags' term_ids.\n * If no tags are given, determines if post has any tags.\n *\n * Prior to v2.7 of WordPress, tags given as integers would also be checked against the post's tags' names and slugs (in addition to term_ids)\n * Prior to v2.7, this function could only be used in the WordPress Loop.\n * As of 2.7, the function can be used anywhere if it is provided a post ID or post object.\n *\n * @since 2.6.0\n *\n * @param string|int|array $tag Optional. The tag name/term_id/slug or array of them to check for.\n * @param int|object $post Optional. Post to check instead of the current post. (since 2.7.0)\n * @return bool True if the current post has any of the given tags (or any tag, if no tag specified).\n */\nfunction has_tag( $tag = '', $post = null ) {\n\treturn has_term( $tag, 'post_tag', $post );\n}\n\n/**\n * Check if the current post has any of given terms.\n *\n * The given terms are checked against the post's terms' term_ids, names and slugs.\n * Terms given as integers will only be checked against the post's terms' term_ids.\n * If no terms are given, determines if post has any terms.\n *\n * @since 3.1.0\n *\n * @param string|int|array $term Optional. The term name/term_id/slug or array of them to check for.\n * @param string $taxonomy Taxonomy name\n * @param int|object $post Optional. Post to check instead of the current post.\n * @return bool True if the current post has any of the given tags (or any tag, if no tag specified).\n */\nfunction has_term( $term = '', $taxonomy = '', $post = null ) {\n\t$post = get_post($post);\n\n\tif ( !$post )\n\t\treturn false;\n\n\t$r = is_object_in_term( $post->ID, $taxonomy, $term );\n\tif ( is_wp_error( $r ) )\n\t\treturn false;\n\n\treturn $r;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/category.php",
    "content": "<?php\n/**\n * Taxonomy API: Core category-specific functionality\n *\n * @package WordPress\n * @subpackage Taxonomy\n */\n\n/**\n * Retrieve list of category objects.\n *\n * If you change the type to 'link' in the arguments, then the link categories\n * will be returned instead. Also all categories will be updated to be backwards\n * compatible with pre-2.3 plugins and themes.\n *\n * @since 2.1.0\n * @see get_terms() Type of arguments that can be changed.\n * @link https://codex.wordpress.org/Function_Reference/get_categories\n *\n * @param string|array $args Optional. Change the defaults retrieving categories.\n * @return array List of categories.\n */\nfunction get_categories( $args = '' ) {\n\t$defaults = array( 'taxonomy' => 'category' );\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$taxonomy = $args['taxonomy'];\n\n\t/**\n\t * Filter the taxonomy used to retrieve terms when calling {@see get_categories()}.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $taxonomy Taxonomy to retrieve terms from.\n\t * @param array  $args     An array of arguments. See {@see get_terms()}.\n\t */\n\t$taxonomy = apply_filters( 'get_categories_taxonomy', $taxonomy, $args );\n\n\t// Back compat\n\tif ( isset($args['type']) && 'link' == $args['type'] ) {\n\t\t/* translators: 1: \"type => link\", 2: \"taxonomy => link_category\" alternative */\n\t\t_deprecated_argument( __FUNCTION__, '3.0',\n\t\t\tsprintf( __( '%1$s is deprecated. Use %2$s instead.' ),\n\t\t\t\t'<code>type => link</code>',\n\t\t\t\t'<code>taxonomy => link_category</code>'\n\t\t\t)\n\t\t);\n\t\t$taxonomy = $args['taxonomy'] = 'link_category';\n\t}\n\n\t$categories = (array) get_terms( $taxonomy, $args );\n\n\tforeach ( array_keys( $categories ) as $k )\n\t\t_make_cat_compat( $categories[$k] );\n\n\treturn $categories;\n}\n\n/**\n * Retrieves category data given a category ID or category object.\n *\n * If you pass the $category parameter an object, which is assumed to be the\n * category row object retrieved the database. It will cache the category data.\n *\n * If you pass $category an integer of the category ID, then that category will\n * be retrieved from the database, if it isn't already cached, and pass it back.\n *\n * If you look at get_term(), then both types will be passed through several\n * filters and finally sanitized based on the $filter parameter value.\n *\n * The category will converted to maintain backwards compatibility.\n *\n * @since 1.5.1\n *\n * @param int|object $category Category ID or Category row object\n * @param string $output Optional. Constant OBJECT, ARRAY_A, or ARRAY_N\n * @param string $filter Optional. Default is raw or no WordPress defined filter will applied.\n * @return object|array|WP_Error|null Category data in type defined by $output parameter.\n *                                    WP_Error if $category is empty, null if it does not exist.\n */\nfunction get_category( $category, $output = OBJECT, $filter = 'raw' ) {\n\t$category = get_term( $category, 'category', $output, $filter );\n\n\tif ( is_wp_error( $category ) )\n\t\treturn $category;\n\n\t_make_cat_compat( $category );\n\n\treturn $category;\n}\n\n/**\n * Retrieve category based on URL containing the category slug.\n *\n * Breaks the $category_path parameter up to get the category slug.\n *\n * Tries to find the child path and will return it. If it doesn't find a\n * match, then it will return the first category matching slug, if $full_match,\n * is set to false. If it does not, then it will return null.\n *\n * It is also possible that it will return a WP_Error object on failure. Check\n * for it when using this function.\n *\n * @since 2.1.0\n *\n * @param string $category_path URL containing category slugs.\n * @param bool $full_match Optional. Whether full path should be matched.\n * @param string $output Optional. Constant OBJECT, ARRAY_A, or ARRAY_N\n * @return object|array|WP_Error|void Type is based on $output value.\n */\nfunction get_category_by_path( $category_path, $full_match = true, $output = OBJECT ) {\n\t$category_path = rawurlencode( urldecode( $category_path ) );\n\t$category_path = str_replace( '%2F', '/', $category_path );\n\t$category_path = str_replace( '%20', ' ', $category_path );\n\t$category_paths = '/' . trim( $category_path, '/' );\n\t$leaf_path  = sanitize_title( basename( $category_paths ) );\n\t$category_paths = explode( '/', $category_paths );\n\t$full_path = '';\n\tforeach ( (array) $category_paths as $pathdir ) {\n\t\t$full_path .= ( $pathdir != '' ? '/' : '' ) . sanitize_title( $pathdir );\n\t}\n\t$categories = get_terms( 'category', array('get' => 'all', 'slug' => $leaf_path) );\n\n\tif ( empty( $categories ) ) {\n\t\treturn;\n\t}\n\n\tforeach ( $categories as $category ) {\n\t\t$path = '/' . $leaf_path;\n\t\t$curcategory = $category;\n\t\twhile ( ( $curcategory->parent != 0 ) && ( $curcategory->parent != $curcategory->term_id ) ) {\n\t\t\t$curcategory = get_term( $curcategory->parent, 'category' );\n\t\t\tif ( is_wp_error( $curcategory ) ) {\n\t\t\t\treturn $curcategory;\n\t\t\t}\n\t\t\t$path = '/' . $curcategory->slug . $path;\n\t\t}\n\n\t\tif ( $path == $full_path ) {\n\t\t\t$category = get_term( $category->term_id, 'category', $output );\n\t\t\t_make_cat_compat( $category );\n\t\t\treturn $category;\n\t\t}\n\t}\n\n\t// If full matching is not required, return the first cat that matches the leaf.\n\tif ( ! $full_match ) {\n\t\t$category = get_term( reset( $categories )->term_id, 'category', $output );\n\t\t_make_cat_compat( $category );\n\t\treturn $category;\n\t}\n}\n\n/**\n * Retrieve category object by category slug.\n *\n * @since 2.3.0\n *\n * @param string $slug The category slug.\n * @return object Category data object\n */\nfunction get_category_by_slug( $slug  ) {\n\t$category = get_term_by( 'slug', $slug, 'category' );\n\tif ( $category )\n\t\t_make_cat_compat( $category );\n\n\treturn $category;\n}\n\n/**\n * Retrieve the ID of a category from its name.\n *\n * @since 1.0.0\n *\n * @param string $cat_name Category name.\n * @return int 0, if failure and ID of category on success.\n */\nfunction get_cat_ID( $cat_name ) {\n\t$cat = get_term_by( 'name', $cat_name, 'category' );\n\tif ( $cat )\n\t\treturn $cat->term_id;\n\treturn 0;\n}\n\n/**\n * Retrieve the name of a category from its ID.\n *\n * @since 1.0.0\n *\n * @param int $cat_id Category ID\n * @return string Category name, or an empty string if category doesn't exist.\n */\nfunction get_cat_name( $cat_id ) {\n\t$cat_id = (int) $cat_id;\n\t$category = get_term( $cat_id, 'category' );\n\tif ( ! $category || is_wp_error( $category ) )\n\t\treturn '';\n\treturn $category->name;\n}\n\n/**\n * Check if a category is an ancestor of another category.\n *\n * You can use either an id or the category object for both parameters. If you\n * use an integer the category will be retrieved.\n *\n * @since 2.1.0\n *\n * @param int|object $cat1 ID or object to check if this is the parent category.\n * @param int|object $cat2 The child category.\n * @return bool Whether $cat2 is child of $cat1\n */\nfunction cat_is_ancestor_of( $cat1, $cat2 ) {\n\treturn term_is_ancestor_of( $cat1, $cat2, 'category' );\n}\n\n/**\n * Sanitizes category data based on context.\n *\n * @since 2.3.0\n *\n * @param object|array $category Category data\n * @param string $context Optional. Default is 'display'.\n * @return object|array Same type as $category with sanitized data for safe use.\n */\nfunction sanitize_category( $category, $context = 'display' ) {\n\treturn sanitize_term( $category, 'category', $context );\n}\n\n/**\n * Sanitizes data in single category key field.\n *\n * @since 2.3.0\n *\n * @param string $field Category key to sanitize\n * @param mixed $value Category value to sanitize\n * @param int $cat_id Category ID\n * @param string $context What filter to use, 'raw', 'display', etc.\n * @return mixed Same type as $value after $value has been sanitized.\n */\nfunction sanitize_category_field( $field, $value, $cat_id, $context ) {\n\treturn sanitize_term_field( $field, $value, $cat_id, 'category', $context );\n}\n\n/* Tags */\n\n/**\n * Retrieves all post tags.\n *\n * @since 2.3.0\n * @see get_terms() For list of arguments to pass.\n *\n * @param string|array $args Tag arguments to use when retrieving tags.\n * @return array List of tags.\n */\nfunction get_tags( $args = '' ) {\n\t$tags = get_terms( 'post_tag', $args );\n\n\tif ( empty( $tags ) ) {\n\t\t$return = array();\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Filter the array of term objects returned for the 'post_tag' taxonomy.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param array $tags Array of 'post_tag' term objects.\n\t * @param array $args An array of arguments. @see get_terms()\n\t */\n\t$tags = apply_filters( 'get_tags', $tags, $args );\n\treturn $tags;\n}\n\n/**\n * Retrieve post tag by tag ID or tag object.\n *\n * If you pass the $tag parameter an object, which is assumed to be the tag row\n * object retrieved the database. It will cache the tag data.\n *\n * If you pass $tag an integer of the tag ID, then that tag will\n * be retrieved from the database, if it isn't already cached, and pass it back.\n *\n * If you look at get_term(), then both types will be passed through several\n * filters and finally sanitized based on the $filter parameter value.\n *\n * @since 2.3.0\n *\n * @param int|object $tag\n * @param string $output Optional. Constant OBJECT, ARRAY_A, or ARRAY_N\n * @param string $filter Optional. Default is raw or no WordPress defined filter will applied.\n * @return object|array|WP_Error|null Tag data in type defined by $output parameter. WP_Error if $tag is empty, null if it does not exist.\n */\nfunction get_tag( $tag, $output = OBJECT, $filter = 'raw' ) {\n\treturn get_term( $tag, 'post_tag', $output, $filter );\n}\n\n/* Cache */\n\n/**\n * Remove the category cache data based on ID.\n *\n * @since 2.1.0\n *\n * @param int $id Category ID\n */\nfunction clean_category_cache( $id ) {\n\tclean_term_cache( $id, 'category' );\n}\n\n/**\n * Update category structure to old pre 2.3 from new taxonomy structure.\n *\n * This function was added for the taxonomy support to update the new category\n * structure with the old category one. This will maintain compatibility with\n * plugins and themes which depend on the old key or property names.\n *\n * The parameter should only be passed a variable and not create the array or\n * object inline to the parameter. The reason for this is that parameter is\n * passed by reference and PHP will fail unless it has the variable.\n *\n * There is no return value, because everything is updated on the variable you\n * pass to it. This is one of the features with using pass by reference in PHP.\n *\n * @since 2.3.0\n * @since 4.4.0 The `$category` parameter now also accepts a WP_Term object.\n * @access private\n *\n * @param array|object|WP_Term $category Category Row object or array\n */\nfunction _make_cat_compat( &$category ) {\n\tif ( is_object( $category ) && ! is_wp_error( $category ) ) {\n\t\t$category->cat_ID = $category->term_id;\n\t\t$category->category_count = $category->count;\n\t\t$category->category_description = $category->description;\n\t\t$category->cat_name = $category->name;\n\t\t$category->category_nicename = $category->slug;\n\t\t$category->category_parent = $category->parent;\n\t} elseif ( is_array( $category ) && isset( $category['term_id'] ) ) {\n\t\t$category['cat_ID'] = &$category['term_id'];\n\t\t$category['category_count'] = &$category['count'];\n\t\t$category['category_description'] = &$category['description'];\n\t\t$category['cat_name'] = &$category['name'];\n\t\t$category['category_nicename'] = &$category['slug'];\n\t\t$category['category_parent'] = &$category['parent'];\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/certificates/ca-bundle.crt",
    "content": "##\n## Bundle of CA Root Certificates\n##\n## Certificate data from Mozilla as of: Wed Sep 16 08:58:11 2015\n## Includes a WordPress Modification - We include the 'legacy' 1024bit certificates\n## for backwards compatibility. See https://core.trac.wordpress.org/ticket/34935#comment:10\n##\n## This is a bundle of X.509 certificates of public Certificate Authorities\n## (CA). These were automatically extracted from Mozilla's root certificates\n## file (certdata.txt).  This file can be found in the mozilla source tree:\n## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt\n##\n## It contains the certificates in PEM format and therefore\n## can be directly used with curl / libcurl / php_curl, or with\n## an Apache+mod_ssl webserver for SSL client authentication.\n## Just configure this file as the SSLCACertificateFile.\n##\n## Conversion done with mk-ca-bundle.pl version 1.25.\n## SHA1: ed3c0bbfb7912bcc00cd2033b0cb85c98d10559c\n##\n\nEE Certification Centre Root CA\n===============================\n-----BEGIN CERTIFICATE-----\nMIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG\nEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy\ndGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw\nMTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB\nUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy\nZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB\nDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM\nTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2\nrpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw\n93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN\nP2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T\nAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ\nMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF\nBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj\nxY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM\nlIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u\nuSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU\n3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM\ndcGWxZ0=\n-----END CERTIFICATE-----\n\nGTE CyberTrust Global Root\n==========================\n-----BEGIN CERTIFICATE-----\nMIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg\nQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG\nA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz\nMjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL\nEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0\nIEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u\nsJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql\nHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID\nAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW\nM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF\nNMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/\n-----END CERTIFICATE-----\n\nThawte Server CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT\nDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs\ndGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE\nAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j\nb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV\nBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u\nc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG\nA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0\nZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl\n/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7\n1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR\nMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J\nGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ\nGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=\n-----END CERTIFICATE-----\n\nThawte Premium Server CA\n========================\n-----BEGIN CERTIFICATE-----\nMIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT\nDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs\ndGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE\nAxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl\nckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT\nAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU\nVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2\naXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ\ncHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2\naovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh\nUdib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/\nqgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm\nSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf\n8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t\nUCemDaYj+bvLpgcUQg==\n-----END CERTIFICATE-----\n\nEquifax Secure CA\n=================\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE\nChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5\nMB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT\nB0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB\nnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR\nfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW\n8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG\nA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE\nCxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG\nA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS\nspXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB\nAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961\nzgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB\nBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95\n70+sB3c4\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx\nFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow\nXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz\nIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94\nf56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol\nhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA\nTxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah\nWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf\nTqj/ZA1k\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority - G2\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT\nMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz\ndCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT\nMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz\ndCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO\nFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71\nlSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB\nMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT\n1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD\nOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9\n-----END CERTIFICATE-----\n\nGlobalSign Root CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\nGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\nb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\nBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\nVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\nDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\nTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\nKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\nc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\ngzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\nAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\nY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\nj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\nhm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\nX4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n-----END CERTIFICATE-----\n\nGlobalSign Root CA - R2\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6\nErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp\ns6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN\nS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL\nTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C\nygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i\nYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN\nBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp\n9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu\n01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7\n9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\nTBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n-----END CERTIFICATE-----\n\n\nValiCert Class 1 VA\n===================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy\nMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi\nGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm\nDuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG\nlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX\nicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP\nOrf1LXLI\n-----END CERTIFICATE-----\n\nValiCert Class 2 VA\n===================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw\nMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC\nCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf\nZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ\nSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV\nUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8\nW9ViH0Pd\n-----END CERTIFICATE-----\n\nRSA Root Certificate 1\n======================\n-----BEGIN CERTIFICATE-----\nMIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp\nb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs\nYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh\nbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw\nMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0\nd29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg\nUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0\nLmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td\n3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H\nBFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs\n3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF\nV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r\non+jjBXu\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority - G3\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ndXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1\nEUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc\ncLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw\nEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj\n055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\nERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f\nj267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC\n/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0\nxuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa\nt20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==\n-----END CERTIFICATE-----\n\nVerisign Class 4 Public Primary Certification Authority - G3\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw\nCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy\ndXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS\ntBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM\n8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW\nLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX\nRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA\nj/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt\nmhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm\nfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd\nRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG\nUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==\n-----END CERTIFICATE-----\n\nEntrust.net Secure Server CA\n============================\n-----BEGIN CERTIFICATE-----\nMIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV\nBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg\ncmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl\nZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv\ncml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG\nA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi\neSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p\ndGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ\naO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5\ngXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw\nggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw\nCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l\ndC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF\nbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu\ndHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw\nNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow\nHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA\nBAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN\nEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9\nn9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=\n-----END CERTIFICATE-----\n\nEntrust.net Premium 2048 Secure Server CA\n=========================================\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u\nZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp\nbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\nBAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx\nNzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3\nd3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl\nMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u\nZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL\nGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr\nhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW\nnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi\nVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ\nKoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy\nT/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf\nzX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT\nJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e\nnNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=\n-----END CERTIFICATE-----\n\nBaltimore CyberTrust Root\n=========================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE\nChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li\nZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC\nSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs\ndGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME\nuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB\nUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C\nG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9\nXbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr\nl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI\nVDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB\nBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh\ncL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5\nhbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa\nY71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H\nRCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n-----END CERTIFICATE-----\n\nEquifax Secure Global eBusiness CA\n==================================\n-----BEGIN CERTIFICATE-----\nMIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp\nbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx\nHDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds\nb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV\nPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN\nqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn\nhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j\nBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs\nMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN\nI7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY\nNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV\n-----END CERTIFICATE-----\n\nEquifax Secure eBusiness CA 1\n=============================\n-----BEGIN CERTIFICATE-----\nMIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB\nLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE\nChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz\nIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ\n1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a\nIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk\nMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW\nNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF\nAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5\nlSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+\nKpYrtWKmpj29f5JZzVoqgrI3eQ==\n-----END CERTIFICATE-----\n\nAddTrust Low-Value Services Root\n================================\n-----BEGIN CERTIFICATE-----\nMIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU\ncnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw\nCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO\nZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB\nAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6\n54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr\noulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1\nZmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui\nGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w\nHQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD\nAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT\nRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw\nHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt\nZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph\niVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY\neDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr\nmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj\nccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=\n-----END CERTIFICATE-----\n\nAddTrust External Root\n======================\n-----BEGIN CERTIFICATE-----\nMIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD\nVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw\nNDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU\ncnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg\nUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821\n+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw\nTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo\naSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy\n2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7\n7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P\nBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL\nVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk\nVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB\nIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl\nj7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\n6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355\ne6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u\nG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\n-----END CERTIFICATE-----\n\nAddTrust Public Services Root\n=============================\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU\ncnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ\nBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l\ndHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu\nnyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i\nd9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG\nAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw\nHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G\nA1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux\nFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G\nA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4\nJNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL\n+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao\nGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9\nYjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H\nEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=\n-----END CERTIFICATE-----\n\nAddTrust Qualified Certificates Root\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML\nQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU\ncnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx\nCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ\nIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx\n64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3\nKP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o\nL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR\nwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU\nMIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE\nBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y\nazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD\nggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG\nGuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X\ndgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze\nRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB\niFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV\nBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw\nb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG\nA1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0\nMloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu\nMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu\nY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v\ndCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz\nA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww\nCj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68\nj6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN\nrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1\nMzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH\nhmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\nA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM\nY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa\nv52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS\nW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0\ntHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8\n-----END CERTIFICATE-----\n\nRSA Security 2048 v3\n====================\n-----BEGIN CERTIFICATE-----\nMIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK\nExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy\nMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb\nBgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7\nJylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb\nWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH\nKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP\n+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/\nMA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E\nFgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY\nv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj\n0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj\nVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395\nnzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA\npKnXwiJPZ9d37CAFYd4=\n-----END CERTIFICATE-----\n\nGeoTrust Global CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK\nEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw\nMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\nLjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo\nBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet\n8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc\nT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU\nvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk\nDBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q\nzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4\nd0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2\nmqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p\nXE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm\nMw==\n-----END CERTIFICATE-----\n\nGeoTrust Global CA 2\n====================\n-----BEGIN CERTIFICATE-----\nMIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw\nMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j\nLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/\nNTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k\nLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA\nVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b\nHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH\nK266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7\nsrJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh\nZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL\nOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC\nx1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF\nH4z1Ir+rzoPz4iIprn2DQKi6bA==\n-----END CERTIFICATE-----\n\nGeoTrust Universal CA\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1\nMDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu\nYy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t\nJPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e\nRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs\n7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d\n8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V\nqnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga\nRr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB\nZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu\nKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08\nni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0\nXG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc\naanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2\nqaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL\noJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK\nxr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF\nKyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2\nDFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK\nxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU\np8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI\nP/rmMuGNG2+k5o7Y+SlIis5z/iw=\n-----END CERTIFICATE-----\n\nGeoTrust Universal CA 2\n=======================\n-----BEGIN CERTIFICATE-----\nMIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN\nR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0\nMDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg\nSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0\nDE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17\nj1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q\nJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a\nQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2\nWP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP\n20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn\nZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC\nSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG\n8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2\n+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E\nBAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z\ndXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ\n4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+\nmbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq\nA1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg\nY+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP\npm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d\nFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp\ngn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm\nX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS\n-----END CERTIFICATE-----\n\n\nAmerica Online Root Certification Authority 1\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG\nA1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg\nT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG\nv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z\nDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh\nsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP\n8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z\no/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf\nGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF\nVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft\n3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g\nKd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds\nsPmuujz9dLQR6FgNgLzTqIA6me11zEZ7\n-----END CERTIFICATE-----\n\nAmerica Online Root Certification Authority 2\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT\nQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG\nA1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg\nT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en\nfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8\nf3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO\nqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN\nRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0\ngBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn\n6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid\nFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6\nKc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj\nB453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op\naaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE\nAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY\nT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p\n+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg\nJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy\nzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO\nZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh\n1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf\nGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff\nZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP\ncX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=\n-----END CERTIFICATE-----\n\nVisa eCommerce Root\n===================\n-----BEGIN CERTIFICATE-----\nMIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG\nEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug\nQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2\nWhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm\nVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv\nbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL\nF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b\nRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0\nTP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI\n/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs\nGHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG\nMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc\nCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW\nYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz\nzkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu\nYQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt\n398znM/jra6O1I7mT1GvFpLgXPYHDw==\n-----END CERTIFICATE-----\n\nCertum Root CA\n==============\n-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK\nExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla\nFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u\nby4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x\nwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL\nkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ\n89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K\nUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P\nNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq\nhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+\nGXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg\nGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/\n0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS\nqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==\n-----END CERTIFICATE-----\n\nComodo AAA Services root\n========================\n-----BEGIN CERTIFICATE-----\nMIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw\nMFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl\nc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\nBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG\nC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs\ni14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW\nY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH\nYpy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK\nIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f\nBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl\ncy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz\nLmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm\n7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\nRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z\n8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C\n12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\n-----END CERTIFICATE-----\n\nComodo Secure Services root\n===========================\n-----BEGIN CERTIFICATE-----\nMIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw\nMDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu\nY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi\nBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP\n9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc\nrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC\noznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V\np6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E\nFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\ngYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj\nYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm\naWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm\n4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj\nZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL\nDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw\npCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H\nRR3B7Hzs/Sk=\n-----END CERTIFICATE-----\n\nComodo Trusted Services root\n============================\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw\nMDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h\nbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw\nIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7\n3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y\n/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6\njuljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS\nivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud\nDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB\n/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp\nZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl\ncnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw\nuleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32\npSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA\nBHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l\nR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O\n9y5Xt5hwXsjEeLBi\n-----END CERTIFICATE-----\n\nQuoVadis Root CA\n================\n-----BEGIN CERTIFICATE-----\nMIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE\nChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz\nMTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp\ncyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD\nEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk\nJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL\nF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL\nYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen\nAScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w\nPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y\nZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7\nMIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj\nYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs\nZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh\nY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW\nFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu\nBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw\nFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6\ntlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo\nfFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul\nLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x\ngI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi\n5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi\n5nrQNiOKSnQ2+Q==\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 2\n==================\n-----BEGIN CERTIFICATE-----\nMIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\nEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx\nODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6\nXJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk\nlvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB\nlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy\nlZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt\n66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn\nwQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh\nD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy\nBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie\nJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud\nDgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU\na6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT\nElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv\nZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3\nUIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm\nVjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK\n+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW\nIozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1\nWVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X\nf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II\n4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8\nVCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 3\n==================\n-----BEGIN CERTIFICATE-----\nMIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT\nEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx\nOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM\naW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg\nDhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij\nKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K\nDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv\nBNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp\np5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8\nnT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX\nMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM\nGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz\nuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT\nBgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj\nYXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0\naWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB\nBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD\nVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4\nywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE\nAxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV\nqyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s\nhvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z\nPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2\nPb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp\n8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC\nbjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu\ng/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p\nvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr\nqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=\n-----END CERTIFICATE-----\n\nSecurity Communication Root CA\n==============================\n-----BEGIN CERTIFICATE-----\nMIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\nU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\nHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP\nU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw\n8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM\nDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX\n5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd\nDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2\nJChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g\n0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a\nmCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ\ns58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ\n6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi\nFL39vmwLAw==\n-----END CERTIFICATE-----\n\nSonera Class 2 Root CA\n======================\n-----BEGIN CERTIFICATE-----\nMIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG\nU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw\nNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh\nIENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3\n/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT\ndXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG\nf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P\ntOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH\nnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT\nXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt\n0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI\ncbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph\nOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx\nEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH\nllpwrN9M\n-----END CERTIFICATE-----\n\nStaat der Nederlanden Root CA\n=============================\n-----BEGIN CERTIFICATE-----\nMIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE\nChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w\nHAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh\nbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt\nvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P\njLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca\nC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth\nvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6\n22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV\nHSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v\ndC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN\nBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR\nEytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw\nMVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y\nnGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR\niJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==\n-----END CERTIFICATE-----\n\nUTN DATACorp SGC Root CA\n========================\n-----BEGIN CERTIFICATE-----\nMIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE\nBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl\nIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ\nBgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa\nMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w\nHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy\ndXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys\nraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo\nwHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA\n9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv\n33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud\nDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9\nBgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD\nLmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3\nDQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft\nGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0\nI3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx\nEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP\nDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI\n-----END CERTIFICATE-----\n\nUTN USERFirst Hardware Root CA\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE\nBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl\nIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd\nBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx\nOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0\neTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz\nZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI\nwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd\ntqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8\ni4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf\nPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw\ngbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF\nlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF\nUkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF\nBwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM\n//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW\nXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2\nlzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn\niCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67\nnfhmqA==\n-----END CERTIFICATE-----\n\nCamerfirma Chambers of Commerce Root\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\nQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\nZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx\nNjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp\ncm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn\nMSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC\nAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU\nxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH\nNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW\nDA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV\nd9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud\nEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v\ncmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P\nAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh\nbWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD\nVR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz\naWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi\nfJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD\nL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN\nUPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n\nADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1\nerfutGWaIZDgqtCYvDi1czyL+Nw=\n-----END CERTIFICATE-----\n\nCamerfirma Global Chambersign Root\n==================================\n-----BEGIN CERTIFICATE-----\nMIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe\nQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i\nZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx\nNDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt\nYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg\nMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw\nggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J\n1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O\nby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl\n6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c\n8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/\nBAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j\naGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B\nAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj\naGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y\nZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh\nbWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA\nPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y\ngOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ\nPJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4\nIBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes\nt2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==\n-----END CERTIFICATE-----\n\nNetLock Notary (Class A) Root\n=============================\n-----BEGIN CERTIFICATE-----\nMIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI\nEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6\ndG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j\nayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX\nDTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH\nEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD\nVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz\ncyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM\nD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ\nz+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC\n/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7\ntqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6\n4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG\nA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC\nAk1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv\nbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu\nIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn\nLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0\nZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz\nIGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh\nIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu\nb3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh\nbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg\nQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp\nbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5\nayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP\nytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB\nCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr\nKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM\n8CgHrTwXZoi1/baI\n-----END CERTIFICATE-----\n\n\nNetLock Business (Class B) Root\n===============================\n-----BEGIN CERTIFICATE-----\nMIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT\nCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV\nBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg\nVGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD\nVQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv\nbnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg\nVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB\niQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S\no/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr\n1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV\nHQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ\nRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh\ndGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0\nZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv\nc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg\nYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh\nc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz\nOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA\nbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl\nIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2\nYWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj\ncHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM\n43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR\nstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI\n-----END CERTIFICATE-----\n\nNetLock Express (Class C) Root\n==============================\n-----BEGIN CERTIFICATE-----\nMIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT\nCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV\nBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD\nKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ\nBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6\ndG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j\nayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB\njQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z\nW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63\neuyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw\nDgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN\nRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn\nYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB\nIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i\naXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0\nZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs\nZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo\ndHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y\nemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k\nIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ\nUyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg\nYXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2\nxJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW\ngyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==\n-----END CERTIFICATE-----\n\nXRamp Global CA Root\n====================\n-----BEGIN CERTIFICATE-----\nMIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE\nBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj\ndXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx\nHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg\nU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu\nIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx\nfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE\nzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs\nAxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry\nxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap\noCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC\nAQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc\n/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\nqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n\nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz\n8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=\n-----END CERTIFICATE-----\n\nGo Daddy Class 2 CA\n===================\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY\nVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG\nA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\nRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD\nggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\n2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32\nqRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j\nYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY\nvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O\nBBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o\natTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu\nMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG\nA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim\nPQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt\nI3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\nHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI\nLs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b\nvZ8=\n-----END CERTIFICATE-----\n\nStarfield Class 2 CA\n====================\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc\nU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo\nMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG\nA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG\nSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY\nbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ\nJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm\nepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN\nF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF\nMIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f\nhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo\nbm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g\nQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs\nafPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM\nPUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\nxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD\nKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3\nQBFGmh95DmK/D5fs4C8fF5Q=\n-----END CERTIFICATE-----\n\nStartCom Certification Authority\n================================\n-----BEGIN CERTIFICATE-----\nMIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\nU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu\nZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0\nNjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk\nLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg\nU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\nggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y\no4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/\nHo/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d\neMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt\n2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z\n6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ\nosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/\nuntp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc\nUjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT\n37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE\nFE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0\nY29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj\nYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH\nAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw\nOi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg\nU3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5\nLCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh\ncnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT\ndGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC\nAgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh\n3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm\nvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk\nfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3\nfsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ\nEoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq\nyvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl\n1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/\nlwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro\ng14=\n-----END CERTIFICATE-----\n\nTaiwan GRCA\n===========\n-----BEGIN CERTIFICATE-----\nMIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG\nEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X\nDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv\ndmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN\nw8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5\nBtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O\n1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO\nhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov\nJ5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7\nQ3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t\nB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB\nO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8\nlSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV\nHRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2\n09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ\nTulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj\nZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2\nNe//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU\nD7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz\nDxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk\nZ6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk\n7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ\nCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy\n+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS\n-----END CERTIFICATE-----\n\nSwisscom Root CA 1\n==================\n-----BEGIN CERTIFICATE-----\nMIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG\nEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy\ndmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4\nMTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln\naXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM\nMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF\nNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe\nAR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC\nb6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn\n7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN\ncA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp\nWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5\nhaa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY\nMUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw\nHQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j\nBBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9\nMA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn\njgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ\nMbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H\nVtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl\nvrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl\nOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3\n1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq\nnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy\nx/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW\nNY6E0F/6MBr1mmz0DlP5OlvRHA==\n-----END CERTIFICATE-----\n\nDigiCert Assured ID Root CA\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\nIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx\nMTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\nExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO\n9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy\nUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW\n/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy\noeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf\nGHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF\n66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq\nhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc\nEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn\nSbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i\n8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\n+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\n-----END CERTIFICATE-----\n\nDigiCert Global Root CA\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\nHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw\nMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ndy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn\nTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5\nBmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H\n4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y\n7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB\no2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm\n8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF\nBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr\nEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt\ntep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886\nUAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n\nDigiCert High Assurance EV Root CA\n==================================\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw\nKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw\nMFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ\nMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu\nY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t\nMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS\nOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3\nMRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ\nNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe\nh10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB\nAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY\nJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ\nV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp\nmyPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK\nmNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\nvEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\n-----END CERTIFICATE-----\n\nCertplus Class 2 Primary CA\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE\nBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN\nOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy\ndHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR\n5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ\nVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO\nYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e\ne++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME\nCDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ\nYIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t\nL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD\nP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R\nTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+\n7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW\n//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7\nl7+ijrRU\n-----END CERTIFICATE-----\n\nDST Root CA X3\n==============\n-----BEGIN CERTIFICATE-----\nMIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK\nExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X\nDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1\ncmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT\nrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9\nUL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy\nxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d\nutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ\nMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug\ndB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE\nGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw\nRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS\nfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ\n-----END CERTIFICATE-----\n\nDST ACES CA X6\n==============\n-----BEGIN CERTIFICATE-----\nMIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT\nMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha\nMFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE\nCxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI\nDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa\npCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow\nGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy\nMjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud\nEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu\nY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy\ndXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU\nCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2\n5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t\nFr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq\nnExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs\nvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3\noKfN5XozNmr6mis=\n-----END CERTIFICATE-----\n\nTURKTRUST Certificate Services Provider Root 1\n==============================================\n-----BEGIN CERTIFICATE-----\nMIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP\nMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0\nacWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx\nMDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg\nU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB\nTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC\naWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX\nyGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i\nSi9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ\n8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4\nW09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME\nBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46\nsWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE\nq8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy\nB0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY\nnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H\n-----END CERTIFICATE-----\n\nTURKTRUST Certificate Services Provider Root 2\n==============================================\n-----BEGIN CERTIFICATE-----\nMIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP\nMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg\nQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN\nMDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr\ndHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G\nA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls\nacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe\nLCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI\nx+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g\nQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr\n5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB\nAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G\nA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt\nRbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4\nJl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+\nhGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P\n9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5\nUrbnBEI=\n-----END CERTIFICATE-----\n\nSwissSign Gold CA - G2\n======================\n-----BEGIN CERTIFICATE-----\nMIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw\nEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN\nMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp\nc3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq\nt2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C\njCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg\nvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF\nylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR\nAiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend\njIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO\npeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR\n7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi\nGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64\nOfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov\nL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm\n5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr\n44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf\nMke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m\nGu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp\nmo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk\nvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf\nKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br\nNU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj\nviOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ\n-----END CERTIFICATE-----\n\nSwissSign Silver CA - G2\n========================\n-----BEGIN CERTIFICATE-----\nMIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT\nBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X\nDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3\naXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG\n9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644\nN0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm\n+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH\n6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu\nMGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h\nqAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5\nFZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs\nROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc\ncelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X\nCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB\ntjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0\ncDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P\n4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F\nkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L\n3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx\n/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa\nDGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP\ne97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu\nWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ\nDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub\nDgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority\n========================================\n-----BEGIN CERTIFICATE-----\nMIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx\nCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ\ncmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN\nb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9\nnceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge\nRwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt\ntm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI\nhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K\nTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN\nNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa\nFloxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG\n1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=\n-----END CERTIFICATE-----\n\nthawte Primary Root CA\n======================\n-----BEGIN CERTIFICATE-----\nMIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE\nBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\naWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3\nMDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg\nSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv\nKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT\nFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs\noPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ\n1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc\nq/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K\naAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p\nafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD\nVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF\nAAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE\nuzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX\nxPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89\njxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH\nz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==\n-----END CERTIFICATE-----\n\nVeriSign Class 3 Public Primary Certification Authority - G5\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\nIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln\nbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh\ndXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt\nYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz\nj/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD\nY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/\nArr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r\nfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/\nBAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv\nZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\naXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG\nSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+\nX6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE\nKQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC\nKm0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE\nZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n-----END CERTIFICATE-----\n\nSecureTrust CA\n==============\n-----BEGIN CERTIFICATE-----\nMIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy\ndXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe\nBgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX\nOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t\nDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH\nGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b\n01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH\nursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj\naHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu\nSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf\nmbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ\nnMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\n3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\n-----END CERTIFICATE-----\n\nSecure Global CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH\nbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg\nMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg\nQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx\nYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ\nbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g\n8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV\nHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi\n0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn\noCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA\nMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+\nOYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn\nCDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5\n3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\nf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\n-----END CERTIFICATE-----\n\nCOMODO Certification Authority\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE\nBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\nA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb\nMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD\nT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH\n+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww\nxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV\n4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA\n1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI\nrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k\nb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC\nAQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP\nOGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\nRxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc\nIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN\n+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==\n-----END CERTIFICATE-----\n\nNetwork Solutions Certificate Authority\n=======================================\n-----BEGIN CERTIFICATE-----\nMIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG\nEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr\nIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx\nMjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu\nMTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx\njOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT\naaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT\ncrA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc\n/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB\nAAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv\nbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA\nA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q\n4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/\nGGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv\nwKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD\nydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey\n-----END CERTIFICATE-----\n\nWellsSecure Public Root Certificate Authority\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM\nF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw\nNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl\nbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD\nVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1\niGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13\ni0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8\nbJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB\nK0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB\nAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu\ncGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm\nlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB\ni6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww\nGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI\nK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0\nbh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj\nqHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es\nE2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ\ntylv2G0xffX8oRAHh84vWdw+WNs=\n-----END CERTIFICATE-----\n\nCOMODO ECC Certification Authority\n==================================\n-----BEGIN CERTIFICATE-----\nMIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC\nR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\nChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix\nGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\nQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo\nb3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X\n4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni\nwz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG\nFAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA\nU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n-----END CERTIFICATE-----\n\nIGC/A\n=====\n-----BEGIN CERTIFICATE-----\nMIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD\nVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE\nQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy\nMB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI\nEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT\nSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2\nTqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW\nSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy\nHF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd\nfrGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ\ntQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB\negF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC\niQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK\nq89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q\nMZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg\nCrpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI\nlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF\n0mBWWg==\n-----END CERTIFICATE-----\n\nSecurity Communication EV RootCA1\n=================================\n-----BEGIN CERTIFICATE-----\nMIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh\ndGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE\nBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl\nY3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO\n/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX\nWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z\nZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4\nbepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK\n9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG\nSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm\niEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG\nAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW\nmHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW\nT1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490\n-----END CERTIFICATE-----\n\nOISTE WISeKey Global Root GA CA\n===============================\n-----BEGIN CERTIFICATE-----\nMIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE\nBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG\nA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH\nbG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD\nVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw\nIAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5\nIEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9\nNt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg\nAsj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD\nd50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ\n/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R\nLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm\nMMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4\n+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa\nhNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY\nokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=\n-----END CERTIFICATE-----\n\nMicrosec e-Szigno Root CA\n=========================\n-----BEGIN CERTIFICATE-----\nMIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE\nBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL\nEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0\nMDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz\ndDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT\nGU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\nAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG\nd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N\noqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc\nQR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ\nPqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb\nMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG\nIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD\nVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3\nLmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A\ndAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn\nAGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA\n4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg\nAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA\negBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6\nLy93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO\nPU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv\nc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h\ncnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw\nIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT\nWjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV\nMIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER\nMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp\nZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal\nHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT\nnGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE\naGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a\n86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK\nyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB\nS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=\n-----END CERTIFICATE-----\n\nCertigna\n========\n-----BEGIN CERTIFICATE-----\nMIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw\nEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3\nMDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI\nQ2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q\nXOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH\nGxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p\nogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg\nDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf\nIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ\ntCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ\nBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J\nSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA\nhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+\nImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu\nPBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY\n1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\nWyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\n-----END CERTIFICATE-----\n\nTC TrustCenter Class 2 CA II\n============================\n-----BEGIN CERTIFICATE-----\nMIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy\nIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw\nMTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1\nc3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE\nAxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw\nIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2\nxgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ\nXa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u\nSNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB\n7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90\nY19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU\ncnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i\nSCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u\nTGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G\ndXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ\nKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj\nTYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP\nJOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk\nvQ==\n-----END CERTIFICATE-----\n\nTC TrustCenter Universal CA I\n=============================\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC\nREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy\nIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN\nMDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg\nVHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw\nJAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC\nqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv\nxrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw\nag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O\ngdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j\nBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG\n1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy\nvwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3\nghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT\nujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a\n7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY\n-----END CERTIFICATE-----\n\nDeutsche Telekom Root CA 2\n==========================\n-----BEGIN CERTIFICATE-----\nMIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT\nRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG\nA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5\nMjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G\nA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS\nb290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5\nbzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI\nKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY\nAUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK\nSe5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV\njlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV\nHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr\nE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy\nzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8\nrZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G\ndyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU\nCm26OWMohpLzGITY+9HPBVZkVw==\n-----END CERTIFICATE-----\n\nComSign Secured CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE\nAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w\nNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD\nQTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw\nggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs\n49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH\n7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB\nkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1\n9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw\nAwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t\nU2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA\nj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC\nAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a\nBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp\nFhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP\n51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz\nOjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==\n-----END CERTIFICATE-----\n\nCybertrust Global Root\n======================\n-----BEGIN CERTIFICATE-----\nMIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li\nZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4\nMDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD\nExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW\n0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL\nAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin\n89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT\n8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2\nMDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G\nA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO\nlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi\n5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2\nhO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T\nX3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW\nWL1WMRJOEcgh4LMRkWXbtKaIOM5V\n-----END CERTIFICATE-----\n\nePKI Root Certification Authority\n=================================\n-----BEGIN CERTIFICATE-----\nMIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG\nEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg\nUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx\nMjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq\nMCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs\nIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi\nlTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv\nqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX\n12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O\nWQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+\nETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao\nlQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/\nvv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi\nZo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi\nMAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\nClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0\n1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\nKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV\nxrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP\nNXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r\nGNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE\nxJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx\ngMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy\nsP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD\nBCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\n-----END CERTIFICATE-----\n\nT\\xc3\\x9c\\x42\\xC4\\xB0TAK UEKAE K\\xC3\\xB6k Sertifika Hizmet Sa\\xC4\\x9Flay\\xc4\\xb1\\x63\\xc4\\xb1s\\xc4\\xb1 - S\\xC3\\xBCr\\xC3\\xBCm 3\n=============================================================================================================================\n-----BEGIN CERTIFICATE-----\nMIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH\nDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q\naWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry\nb25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV\nBAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg\nS8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4\nMjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl\nIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF\nn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl\nIEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft\ndSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl\ncnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO\nEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1\nxnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR\n6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL\nhmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd\nBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\nMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4\nN5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT\ny9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh\nLBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M\ndqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=\n-----END CERTIFICATE-----\n\nBuypass Class 2 CA 1\n====================\n-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2\nMTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh\nc3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M\ncXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83\n0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4\n0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R\nuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P\nAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV\n1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt\n7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2\nfZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w\nwDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho\n-----END CERTIFICATE-----\n\nBuypass Class 3 CA 1\n====================\n-----BEGIN CERTIFICATE-----\nMIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1\nMDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh\nc3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx\nifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0\nn6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia\nAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c\n1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P\nAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7\npYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA\nEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5\nhtOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj\nel/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915\n-----END CERTIFICATE-----\n\nEBG Elektronik Sertifika Hizmet Sa\\xC4\\x9Flay\\xc4\\xb1\\x63\\xc4\\xb1s\\xc4\\xb1\n==========================================================================\n-----BEGIN CERTIFICATE-----\nMIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg\nQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe\nFw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p\nayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt\nIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG\nSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by\nX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b\ngmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr\neYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ\nTqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy\nY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn\nuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI\nqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm\nExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0\nNokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW\nZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t\nFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm\nzJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k\nXPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT\nbCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU\nRT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK\n1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt\n2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ\nY9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9\nAahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT\n-----END CERTIFICATE-----\n\ncertSIGN ROOT CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD\nVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa\nFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE\nCxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I\nJUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH\nrfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2\nssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD\n0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943\nAAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\nAf8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB\nAQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8\nSG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0\nx2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt\nvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz\nTogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD\n-----END CERTIFICATE-----\n\nCNNIC ROOT\n==========\n-----BEGIN CERTIFICATE-----\nMIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE\nChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw\nOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD\no+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz\nVHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT\nVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or\nczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK\ny5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC\nwQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S\nlgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5\nGv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM\nO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8\nBS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2\nG8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m\nmxE=\n-----END CERTIFICATE-----\n\nApplicationCA - Japanese Government\n===================================\n-----BEGIN CERTIFICATE-----\nMIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT\nSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw\nMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl\ncm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\nCgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4\nfl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN\nwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE\njP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu\nnyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU\nWssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV\nBAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD\nvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs\no2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g\n/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD\nio+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW\ndupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL\nrosot4LKGAfmt1t06SAZf7IbiVQ=\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority - G3\n=============================================\n-----BEGIN CERTIFICATE-----\nMIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE\nBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0\nIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy\neSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz\nNTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo\nYykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT\nLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j\nK/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE\nc5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C\nIShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu\ndlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr\n2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9\ncr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE\nAp7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD\nAWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s\nt/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt\n-----END CERTIFICATE-----\n\nthawte Primary Root CA - G2\n===========================\n-----BEGIN CERTIFICATE-----\nMIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC\nVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu\nIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg\nQ0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV\nMBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG\nb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt\nIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS\nLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5\n8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU\nmtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN\nG4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K\nrr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==\n-----END CERTIFICATE-----\n\nthawte Primary Root CA - G3\n===========================\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE\nBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2\naWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w\nODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh\nd3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD\nVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG\nA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At\nP0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC\n+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY\n7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW\nvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ\nKoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK\nA3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu\nt8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC\n8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm\ner/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=\n-----END CERTIFICATE-----\n\nGeoTrust Primary Certification Authority - G2\n=============================================\n-----BEGIN CERTIFICATE-----\nMIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC\nVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu\nYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD\nZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1\nOVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg\nMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl\nb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG\nBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc\nKiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD\nVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+\nEVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m\nndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2\nnpaqBA+K\n-----END CERTIFICATE-----\n\nVeriSign Universal Root Certification Authority\n===============================================\n-----BEGIN CERTIFICATE-----\nMIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\nIHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u\nIEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv\ncmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl\nIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj\n1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP\nMiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72\n9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I\nAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR\ntPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G\nCCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O\na8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud\nDgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3\nY8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx\nY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx\nP/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P\nwGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4\nmJO37M2CYfE45k+XmCpajQ==\n-----END CERTIFICATE-----\n\nVeriSign Class 3 Public Primary Certification Authority - G4\n============================================================\n-----BEGIN CERTIFICATE-----\nMIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC\nVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3\nb3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz\nZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU\ncnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo\nb3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8\nUtpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz\nrl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw\nHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u\nY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD\nA2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx\nAJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==\n-----END CERTIFICATE-----\n\nNetLock Arany (Class Gold) Főtanúsítvány\n============================================\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G\nA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610\ndsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB\ncmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx\nMjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO\nZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv\nbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6\nc8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu\n0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw\n/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk\nH3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw\nfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1\nneWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB\nBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW\nqZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta\nYtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\nbLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna\nNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu\ndZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\n-----END CERTIFICATE-----\n\nStaat der Nederlanden Root CA - G2\n==================================\n-----BEGIN CERTIFICATE-----\nMIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\nCgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC\nTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\nZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ\n5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn\nvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj\nCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil\ne7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR\nOME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI\nCT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65\n48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi\ntrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737\nqWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB\nAAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC\nARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV\nHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA\nA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz\n+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj\nf/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN\nkqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk\nCpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF\nURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb\nCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h\noKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV\nIPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm\n66+KAQ==\n-----END CERTIFICATE-----\n\nCA Disig\n========\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK\nQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw\nMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz\nbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm\nGErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD\nPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo\nhwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt\nymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w\ngfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P\nAQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz\naWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff\nZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa\nBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t\nWDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3\nmkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/\nCBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K\nezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA\n4Z7CRneC9VkGjCFMhwnN5ag=\n-----END CERTIFICATE-----\n\nJuur-SK\n=======\n-----BEGIN CERTIFICATE-----\nMIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA\nc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw\nDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG\nSIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy\naW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf\nTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC\n+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw\nUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa\nTpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF\nMAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD\nHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh\nAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA\ncwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr\nAGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw\ncy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE\nFASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G\nA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo\nERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL\nabVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678\nIIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh\nMp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2\nyyqcjg==\n-----END CERTIFICATE-----\n\nHongkong Post Root CA 1\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT\nDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx\nNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n\nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1\nApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr\nauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh\nqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY\nV18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV\nHRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i\nh9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio\nl7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei\nIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps\nT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT\nc4afU9hDDl3WY4JxHYB0yvbiAmvZWg==\n-----END CERTIFICATE-----\n\nSecureSign RootCA11\n===================\n-----BEGIN CERTIFICATE-----\nMIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi\nSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS\nb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw\nKQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1\ncmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL\nTJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO\nwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq\ng6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP\nO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA\nbpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX\nt94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh\nOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r\nbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ\nOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01\ny8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061\nlgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=\n-----END CERTIFICATE-----\n\nACEDICOM Root\n=============\n-----BEGIN CERTIFICATE-----\nMIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD\nT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4\nMDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG\nA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk\nWLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD\nYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew\nMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb\nm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk\nHQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT\nxKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2\n3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9\n2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq\nTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz\n4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU\n9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv\nbS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg\naHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP\neGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk\nzQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1\nThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI\nKiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq\nnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE\nI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp\nMCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o\ntkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==\n-----END CERTIFICATE-----\n\nVerisign Class 3 Public Primary Certification Authority\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx\nFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5\nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow\nXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz\nIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA\nA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94\nf56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol\nhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky\nCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX\nbj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/\nD/xwzoiQ\n-----END CERTIFICATE-----\n\nMicrosec e-Szigno Root CA 2009\n==============================\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER\nMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv\nc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ndTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE\nBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt\nU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA\nfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG\n0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA\npxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm\n1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC\nAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf\nQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE\nFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o\nlZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX\nI/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ntyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02\nyULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi\nLXpUq3DDfSJlgnCW\n-----END CERTIFICATE-----\n\nGlobalSign Root CA - R3\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt\niHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ\n0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3\nrHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl\nOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2\nxmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7\nlgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8\nEpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E\nbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18\nYIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r\nkpeDMdmztcpHWD9f\n-----END CERTIFICATE-----\n\nAutoridad de Certificacion Firmaprofesional CIF A62634068\n=========================================================\n-----BEGIN CERTIFICATE-----\nMIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA\nBgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\nMjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw\nQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB\nNjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD\nUtd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P\nB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY\n7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH\nECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI\nplD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX\nMbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX\nLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK\nbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU\nvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud\nEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH\nDhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp\ncm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA\nbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx\nADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx\n51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk\nR71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP\nT481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f\nJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl\nosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR\ncrHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR\nsaS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD\nKCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi\n6Et8Vcad+qMUu2WFbm5PEn4KPJ2V\n-----END CERTIFICATE-----\n\nIzenpe.com\n==========\n-----BEGIN CERTIFICATE-----\nMIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG\nEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz\nMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu\nQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ\n03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK\nClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU\n+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC\nPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT\nOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK\nF7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK\n0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+\n0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB\nleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID\nAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+\nSVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG\nNjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx\nMCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\nBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l\nFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga\nkEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q\nhT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs\ng1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5\naTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5\nnXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC\nClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo\nQ0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z\nWrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==\n-----END CERTIFICATE-----\n\nChambers of Commerce Root - 2008\n================================\n-----BEGIN CERTIFICATE-----\nMIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD\nMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\nbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\nQS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy\nMjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl\nZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF\nEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl\ncnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\nAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA\nXuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj\nh40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/\nikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk\nNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g\nD2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331\nlubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ\n0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj\nya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2\nEQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI\nG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ\nBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh\nbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh\nbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC\nCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH\nAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1\nwqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH\n3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU\nRWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6\nM6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1\nYJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF\n9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK\nzBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG\nnrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg\nOGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ\n-----END CERTIFICATE-----\n\nGlobal Chambersign Root - 2008\n==============================\n-----BEGIN CERTIFICATE-----\nMIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD\nMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv\nbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu\nQS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx\nNDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg\nY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ\nQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD\naGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf\nVtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf\nXjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0\nZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB\n/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA\nTH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M\nH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe\nOx2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF\nHTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh\nwZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB\nAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT\nBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE\nBhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm\naXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm\naXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp\n1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0\ndHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG\n/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6\nReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s\ndZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg\n9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH\nfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du\nqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr\nP3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq\nc5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z\n09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B\n-----END CERTIFICATE-----\n\nGo Daddy Root Certificate Authority - G2\n========================================\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\nMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\nb25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\nA1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\n9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\n+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\nfMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\nNAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\nBUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\nvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\n5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\nN8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\nLPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\n-----END CERTIFICATE-----\n\nStarfield Root Certificate Authority - G2\n=========================================\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0\neSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw\nDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg\nVGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB\ndXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv\nW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs\nbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk\nN3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf\nZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU\nJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol\nTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx\n4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw\nF5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\npL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ\nc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\n-----END CERTIFICATE-----\n\nStarfield Services Root Certificate Authority - G2\n==================================================\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl\nIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV\nBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT\ndGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2\nh/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa\nhHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP\nLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB\nrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG\nSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP\nE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy\nxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza\nYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\n-----END CERTIFICATE-----\n\nAffirmTrust Commercial\n======================\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw\nMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb\nDuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV\nC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6\nBfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww\nMmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV\nHQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG\nhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi\nqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv\n0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh\nsUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\n-----END CERTIFICATE-----\n\nAffirmTrust Networking\n======================\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw\nMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE\nHi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI\ndIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24\n/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb\nh+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV\nHQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu\nUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6\n12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23\nWJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9\n/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\n-----END CERTIFICATE-----\n\nAffirmTrust Premium\n===================\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy\nOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy\ndXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn\nBKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV\n5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs\n+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd\nGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R\np9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI\nS+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04\n6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5\n/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo\n+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv\nMiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\nNt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC\n6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S\nL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK\n+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV\nBtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg\nIxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60\ng2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb\nzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==\n-----END CERTIFICATE-----\n\nAffirmTrust Premium ECC\n=======================\n-----BEGIN CERTIFICATE-----\nMIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV\nBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx\nMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U\ncnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ\nN8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW\nBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK\nBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X\n57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM\neQ==\n-----END CERTIFICATE-----\n\nCertum Trusted Network CA\n=========================\n-----BEGIN CERTIFICATE-----\nMIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK\nExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy\nMTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU\nZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC\nl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J\nJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4\nfOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0\ncvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw\nDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj\njSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1\nmS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj\nZt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\n03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\n-----END CERTIFICATE-----\n\nCertinomis - Autorité Racine\n=============================\n-----BEGIN CERTIFICATE-----\nMIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK\nQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg\nLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG\nA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw\nJAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD\nggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa\nwE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly\nLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw\n2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N\njMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q\nc1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC\nlrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb\nxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g\n530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna\n4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ\nKoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x\nWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva\nR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40\nnJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B\nCxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv\nJL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE\nqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b\nWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE\nwk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/\nvgt2Fl43N+bYdJeimUV5\n-----END CERTIFICATE-----\n\nRoot CA Generalitat Valenciana\n==============================\n-----BEGIN CERTIFICATE-----\nMIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE\nChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290\nIENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3\nWjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE\nCxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2\nF0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B\nZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ\nD0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte\nJajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB\nAAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n\ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB\nADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl\nAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA\nYQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy\nAGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA\naQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt\nAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA\nYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu\nAHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA\nOgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0\ndHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV\nBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G\nA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S\nb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh\nTvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz\nCkj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63\nNI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH\niJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt\n+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=\n-----END CERTIFICATE-----\n\nA-Trust-nQual-03\n================\n-----BEGIN CERTIFICATE-----\nMIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE\nCgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy\na2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R\ndWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw\nRgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0\nZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1\nc3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA\nzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n\nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE\nSU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4\niHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V\ncuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV\neRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40\nozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr\nsQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd\nJXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS\nmYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6\nahq97BvIxYSazQ==\n-----END CERTIFICATE-----\n\nTWCA Root Certification Authority\n=================================\n-----BEGIN CERTIFICATE-----\nMIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ\nVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG\nEwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB\nIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx\nQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC\noi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP\n4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r\ny+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB\nBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG\n9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC\nmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW\nQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY\nT0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny\nYh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\n-----END CERTIFICATE-----\n\nSecurity Communication RootCA2\n==============================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh\ndGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC\nSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy\naXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++\n+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R\n3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV\nspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K\nEOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8\nQIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB\nCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj\nu/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk\n3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q\ntnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29\nmvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\n-----END CERTIFICATE-----\n\nEC-ACC\n======\n-----BEGIN CERTIFICATE-----\nMIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE\nBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w\nODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD\nVQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE\nCxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT\nBkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7\nMDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt\nSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl\nZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh\ncnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK\nw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT\nae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4\nHvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a\nE9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw\n0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD\nVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0\nLm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l\ndC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ\nlF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa\nAl6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe\nl+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2\nE/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D\n5EI=\n-----END CERTIFICATE-----\n\nHellenic Academic and Research Institutions RootCA 2011\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT\nO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y\naXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\nIFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT\nAkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z\nIENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo\nIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI\n1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa\n71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u\n8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH\n3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/\nMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8\nMAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu\nb3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt\nXdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8\nTqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD\n/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N\n7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4\n-----END CERTIFICATE-----\n\nActalis Authentication Root CA\n==============================\n-----BEGIN CERTIFICATE-----\nMIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM\nBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE\nAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky\nMjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz\nIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290\nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ\nwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa\nby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6\nzfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f\nYVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2\noxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l\nEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7\nhNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8\nEBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5\njF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY\niDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt\nifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI\nWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0\nJZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx\nK3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+\nXlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC\n4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo\n2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz\nlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem\nOR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9\nvwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==\n-----END CERTIFICATE-----\n\nTrustis FPS Root CA\n===================\n-----BEGIN CERTIFICATE-----\nMIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG\nEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290\nIENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV\nBAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ\nRUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk\nH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa\ncY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt\no3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA\nAaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd\nBgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c\nGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC\nyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P\n8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV\nl/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl\niB6XzCGcKQENZetX2fNXlrtIzYE=\n-----END CERTIFICATE-----\n\nStartCom Certification Authority\n================================\n-----BEGIN CERTIFICATE-----\nMIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\nU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu\nZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0\nNjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk\nLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg\nU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw\nggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y\no4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/\nHo/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d\neMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt\n2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z\n6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ\nosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/\nuntp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc\nUjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT\n37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD\nVR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ\nQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0\ndHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu\nc3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv\nbW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0\naGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0\naW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t\nL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG\ncmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5\nfPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm\nN3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN\nOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T\ntn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX\ne2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA\n2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs\nHvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE\nJnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib\nD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=\n-----END CERTIFICATE-----\n\nStartCom Certification Authority G2\n===================================\n-----BEGIN CERTIFICATE-----\nMIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN\nU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg\nRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE\nChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O\no1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG\n4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi\nAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul\nQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs\nO+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H\nvKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L\nnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS\nFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa\nz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E\nBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ\nKoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K\n2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk\nJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+\nJYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG\n/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc\nnIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld\nblhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc\nl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm\n7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm\nobp573PYtlNXLfbQ4ddI\n-----END CERTIFICATE-----\n\nBuypass Class 2 Root CA\n=======================\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X\nDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\neXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1\ng1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn\n9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b\n/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU\nCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff\nawrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI\nzRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn\nBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX\nUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs\nM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\nAAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s\nA20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI\nosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S\naq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd\nDnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD\nLfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0\noyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC\nwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS\nCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN\nrJgWVqA=\n-----END CERTIFICATE-----\n\nBuypass Class 3 Root CA\n=======================\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X\nDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\neXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH\nsJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR\n5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh\n7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ\nZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH\n2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV\n/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ\nRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA\nXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq\nj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\nAAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV\ncSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G\nuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG\nQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8\nZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2\nKSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz\n6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug\nUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe\neOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi\nCp/HuZc=\n-----END CERTIFICATE-----\n\nT-TeleSec GlobalRoot Class 3\n============================\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\nIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ncnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx\nMDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ndGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\nZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK\n9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU\nNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF\niP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W\n0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA\nMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr\nAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb\nfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT\nucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h\nP0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\ne9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==\n-----END CERTIFICATE-----\n\nTURKTRUST Certificate Services Provider Root 2007\n=================================================\n-----BEGIN CERTIFICATE-----\nMIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF\nbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP\nMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg\nQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X\nDTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl\na3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN\nBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp\nbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N\nYvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv\nKUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya\nKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT\nrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC\nAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP\nBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s\nPx+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I\naE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO\nXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb\nBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK\npoRq0Tl9\n-----END CERTIFICATE-----\n\nD-TRUST Root Class 3 CA 2 2009\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe\nFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE\nLVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD\nER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA\nBF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv\nKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z\np+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC\nAwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ\n4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y\neS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw\nMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G\nPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw\nOS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm\n2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\no3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV\ndT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph\nX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=\n-----END CERTIFICATE-----\n\nD-TRUST Root Class 3 CA 2 EV 2009\n=================================\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\nOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\nOTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS\negpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh\nzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T\n7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60\nsUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35\n11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv\ncop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v\nZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El\nMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp\nb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh\nc3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+\nPPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05\nnsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX\nANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA\nNCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv\nw9y4AyHqnxbxLFS1\n-----END CERTIFICATE-----\n\nPSCProcert\n==========\n-----BEGIN CERTIFICATE-----\nMIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk\nZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ\nMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz\ndGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl\ncmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw\nIwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw\nMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w\nDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD\nZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp\nY2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC\nwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA\n3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh\nRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO\nEO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2\n0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH\n0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU\ntd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw\nBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp\nr2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/\nAgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz\nNi0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId\nxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp\nZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH\nEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h\nY2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k\nZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG\n9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG\nMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG\nLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52\nZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy\nYWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v\nY3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o\ndHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq\nT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN\ng7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q\nuxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1\nn8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn\nFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo\n5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq\n3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5\npoLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y\neMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km\n-----END CERTIFICATE-----\n\nChina Internet Network Information Center EV Certificates Root\n==============================================================\n-----BEGIN CERTIFICATE-----\nMIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV\nBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D\naGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg\nUm9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG\nA1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM\nPkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl\ncyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y\njUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV\n98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H\nklY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23\nKzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC\n7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD\nglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5\n0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM\n7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws\nZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0\n5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=\n-----END CERTIFICATE-----\n\nSwisscom Root CA 2\n==================\n-----BEGIN CERTIFICATE-----\nMIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG\nEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy\ndmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2\nMjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln\naXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC\nIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM\nLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo\nysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ\nwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH\nWrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a\nSgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS\nNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab\nmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY\nYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3\nqPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw\nHQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O\nBBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu\nMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO\nv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ\n82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz\no9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs\na0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx\nOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW\nmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o\n+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC\nrvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX\n5OfNeOI5wSsSnqaeG8XmDtkx2Q==\n-----END CERTIFICATE-----\n\nSwisscom Root EV CA 2\n=====================\n-----BEGIN CERTIFICATE-----\nMIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE\nBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl\ncnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN\nMzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT\nHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg\nQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz\no3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy\nXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti\nGZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li\nqG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH\nZa0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG\nalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa\nm3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox\nbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi\nxzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/\nBAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED\nMB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB\nbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL\nj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU\nwp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7\nXwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH\n59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/\n23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq\nJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA\nHmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi\nuMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW\nl8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=\n-----END CERTIFICATE-----\n\nCA Disig Root R1\n================\n-----BEGIN CERTIFICATE-----\nMIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw\nEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\nZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx\nEzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\nc2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy\n3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8\nu8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2\nm6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk\nCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa\nYVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6\nvpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL\nLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX\nZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is\nXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ\n04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR\nxVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B\nLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM\nCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb\nVSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85\nYmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS\nds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix\nlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N\nUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ\na7+h89n07eLw4+1knj0vllJPgFOL\n-----END CERTIFICATE-----\n\nCA Disig Root R2\n================\n-----BEGIN CERTIFICATE-----\nMIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw\nEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\nZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx\nEzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\nc2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC\nw3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia\nxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7\nA7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S\nGBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV\ng8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa\n5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE\nkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A\nAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i\nFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u\nQu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM\ntCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV\nsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je\ndR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8\n1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx\nmHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01\nutI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0\nsorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg\nUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV\n7+ZtsH8tZ/3zbBt1RqPlShfppNcL\n-----END CERTIFICATE-----\n\nACCVRAIZ1\n=========\n-----BEGIN CERTIFICATE-----\nMIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB\nSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1\nMDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH\nUEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM\njmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0\nRGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD\naaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ\n0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG\nWuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7\n8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR\n5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J\n9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK\nQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw\nOi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu\nY3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2\nVuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM\nHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA\nQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh\nAO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA\nYwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj\nAHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA\nIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk\naHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0\ndHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2\nMV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI\nhvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E\nR9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN\nYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49\nnCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ\nTS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3\nsCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\nI6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg\nNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd\n3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p\nEfbRD0tVNEYqi4Y7\n-----END CERTIFICATE-----\n\nTWCA Global Root CA\n===================\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT\nCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD\nQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK\nEwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg\nQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C\nnJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV\nr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR\nQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV\ntTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W\nKKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99\nsy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p\nyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn\nkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI\nzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC\nAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g\ncFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn\nLhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M\n8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg\n/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg\nlPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP\nA9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m\ni4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8\nEHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3\nzqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=\n-----END CERTIFICATE-----\n\nTeliaSonera Root CA v1\n======================\n-----BEGIN CERTIFICATE-----\nMIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE\nCgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4\nMTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW\nVGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+\n6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA\n3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k\nB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn\nXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH\noLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3\nF0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ\noWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7\ngUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc\nTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB\nAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW\nDNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm\nzqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx\n0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW\npb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV\nG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc\nc41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT\nJsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2\nqReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6\nY2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems\nWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=\n-----END CERTIFICATE-----\n\nE-Tugra Certification Authority\n===============================\n-----BEGIN CERTIFICATE-----\nMIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w\nDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls\nZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN\nZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw\nNTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx\nQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl\ncmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD\nDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd\nhQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K\nCKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g\nElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ\nBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0\nE+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz\nrt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq\njqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn\nrFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5\ndUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB\n/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG\nMA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK\nkEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO\nXKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807\nVRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo\na2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc\ndlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV\nKV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT\nDx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0\n8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G\nC7TbO6Orb1wdtn7os4I07QZcJA==\n-----END CERTIFICATE-----\n\nT-TeleSec GlobalRoot Class 2\n============================\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\nIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ncnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx\nMDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ndGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\nZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ\nSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F\nvudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970\n2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV\nWOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA\nMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy\nYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4\nr6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf\nvNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR\n3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\n9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==\n-----END CERTIFICATE-----\n\nAtos TrustedRoot 2011\n=====================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU\ncnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4\nMzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG\nA1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV\nhTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr\n54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+\nDgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320\nHLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR\nz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R\nl+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ\nbNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\nCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h\nk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh\nTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9\n61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G\n3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 1 G3\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE\nPBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm\nPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6\nPser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN\nofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l\ng6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV\n7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX\n9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f\niyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg\nt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI\nhvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC\nMTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3\nGPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct\nTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP\n+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh\n3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa\nwx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6\nO0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0\nFU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV\nhMJKzRwuJIczYOXD\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 2 G3\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh\nZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY\nNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t\noIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o\nMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l\nV0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo\nL1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ\nsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD\n6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh\nlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI\nhvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66\nAarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K\npVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9\nx52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz\ndWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X\nU/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw\nmNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD\nzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN\nJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr\nO3jtZsSOeWmD3n+M\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 3 G3\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286\nIxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL\nMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe\n6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3\nI4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U\nVDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7\n5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi\nMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM\ndyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt\nrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI\nhvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px\nKGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS\nt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ\nTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du\nDcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib\nIh6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD\nhPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX\n0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW\ndSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2\nPpxxVJkES/1Y+Zj0\n-----END CERTIFICATE-----\n\nDigiCert Assured ID Root G2\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\nIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw\nMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\nExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH\n35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq\nbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw\nVWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP\nYLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn\nlTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO\nw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv\n0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz\nd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW\nhsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M\njomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo\nIhNzbM8m9Yop5w==\n-----END CERTIFICATE-----\n\nDigiCert Assured ID Root G3\n===========================\n-----BEGIN CERTIFICATE-----\nMIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV\nUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD\nVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\nMTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ\nBgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb\nRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs\nKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF\nUaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy\nYZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy\n1vUhZscv6pZjamVFkpUBtA==\n-----END CERTIFICATE-----\n\nDigiCert Global Root G2\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\nHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx\nMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ndy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ\nkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO\n3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV\nBJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM\nUNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB\no0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu\n5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr\nF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U\nWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH\nQRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/\niyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\nMrY=\n-----END CERTIFICATE-----\n\nDigiCert Global Root G3\n=======================\n-----BEGIN CERTIFICATE-----\nMIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV\nUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD\nVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw\nMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k\naWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C\nAQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O\nYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP\nBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp\nYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y\n3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34\nVOKa5Vt8sycX\n-----END CERTIFICATE-----\n\nDigiCert Trusted Root G4\n========================\n-----BEGIN CERTIFICATE-----\nMIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw\nHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\nMTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G\nCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp\npz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o\nk3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa\nvOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY\nQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6\nMUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm\nmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7\nf/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH\ndL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8\noR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\nDwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD\nggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY\nZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr\nyF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy\n7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah\nixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN\n5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb\n/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa\n5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK\nG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP\n82Z+\n-----END CERTIFICATE-----\n\nWoSign\n======\n-----BEGIN CERTIFICATE-----\nMIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG\nEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g\nQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ\nBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\nvcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO\nCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX\n2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5\nKIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR\n+ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez\nEC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk\nlWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2\n8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY\nyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C\nAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R\n8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1\nLOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq\nT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj\ny+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC\n2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes\n5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/\nEaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh\nmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx\nkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi\nkpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==\n-----END CERTIFICATE-----\n\nWoSign China\n============\n-----BEGIN CERTIFICATE-----\nMIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG\nEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv\ngeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD\nVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN\nBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k\n8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5\nuQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85\ndE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5\nEd+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy\nb7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc\n76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m\n+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6\nyke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX\nGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA\nA4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6\nyAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY\nr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115\nj0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A\nkLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97\nqA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y\njj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB\nONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv\nT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO\nkI26oQ==\n-----END CERTIFICATE-----\n\nCOMODO RSA Certification Authority\n==================================\n-----BEGIN CERTIFICATE-----\nMIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE\nBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\nA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC\nR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\nChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn\ndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ\nFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+\n5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG\nx8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX\n2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL\nOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3\nsgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C\nGCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5\nWdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\nFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\nDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt\nrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+\nnq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg\ntZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW\nsRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp\npC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA\nzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq\nZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52\n7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I\nLaZRfyHBNVOFBkpdn627G190\n-----END CERTIFICATE-----\n\nUSERTrust RSA Certification Authority\n=====================================\n-----BEGIN CERTIFICATE-----\nMIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE\nBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\nExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE\nBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK\nExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz\n0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j\nY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn\nRghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O\n+T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq\n/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE\nY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM\nlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8\nyexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+\neLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\nBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF\nMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW\nFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ\n7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ\nEg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM\n8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi\nFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi\nyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c\nJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw\nsAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx\nQ+6IHdfGjjxDah2nGN59PRbxYvnKkKj9\n-----END CERTIFICATE-----\n\nUSERTrust ECC Certification Authority\n=====================================\n-----BEGIN CERTIFICATE-----\nMIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC\nVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\naGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC\nVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\naGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2\n0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez\nnPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV\nHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB\nHU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu\n9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\n-----END CERTIFICATE-----\n\nGlobalSign ECC Root CA - R4\n===========================\n-----BEGIN CERTIFICATE-----\nMIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl\nOQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P\nAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV\nMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF\nJzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=\n-----END CERTIFICATE-----\n\nGlobalSign ECC Root CA - R5\n===========================\n-----BEGIN CERTIFICATE-----\nMIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6\nSFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS\nh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx\nuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7\nyFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3\n-----END CERTIFICATE-----\n\nStaat der Nederlanden Root CA - G3\n==================================\n-----BEGIN CERTIFICATE-----\nMIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE\nCgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC\nTkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l\nZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y\nolQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t\nx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy\nEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K\nTj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur\nmkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5\n1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp\n07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo\nFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE\n41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB\nAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu\nyjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD\nU5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq\nKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1\nv0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA\n8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b\n8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r\nmj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq\n1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI\nJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV\ntzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=\n-----END CERTIFICATE-----\n\nStaat der Nederlanden EV Root CA\n================================\n-----BEGIN CERTIFICATE-----\nMIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE\nCgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g\nRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M\nMR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl\ncmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk\nSzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW\nO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r\n0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8\nKj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV\nXJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr\n08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV\n0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd\n74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx\nfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa\nivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI\neK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu\nc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq\n5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN\nb/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN\nf1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi\n5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4\nWeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK\nDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy\neUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==\n-----END CERTIFICATE-----\n\nIdenTrust Commercial Root CA 1\n==============================\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG\nEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS\nb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES\nMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB\nIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld\nhNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/\nmNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi\n1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C\nXZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl\n3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy\nNeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV\nWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg\nxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix\nuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC\nAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI\nhvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH\n6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg\nghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt\nozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV\nYjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX\nfeu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro\nkTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe\n2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz\nZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R\ncGzM7vRX+Bi6hG6H\n-----END CERTIFICATE-----\n\nIdenTrust Public Sector Root CA 1\n=================================\n-----BEGIN CERTIFICATE-----\nMIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG\nEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv\nciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV\nUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS\nb290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy\nP4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6\nHi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI\nrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf\nqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS\nmJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn\nol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh\nLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v\niDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL\n4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B\nAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw\nDQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj\nt2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A\nmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt\nGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt\nm6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx\nNRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4\nMhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI\najjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC\nZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ\n3Wl9af0AVqW3rLatt8o+Ae+c\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority - G2\n=========================================\n-----BEGIN CERTIFICATE-----\nMIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV\nBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy\nbXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug\nb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw\nHhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT\nDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx\nOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s\neTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP\n/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz\nHHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU\ns/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y\nTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx\nAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6\n0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z\niXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ\nRkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi\nnWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+\nvGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO\ne4pIb4tF9g==\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority - EC1\n==========================================\n-----BEGIN CERTIFICATE-----\nMIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx\nFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn\nYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl\nZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nIC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw\nFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs\nLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg\ndXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt\nIEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy\nAsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef\n9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h\nvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8\nkmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G\n-----END CERTIFICATE-----\n\nCFCA EV ROOT\n============\n-----BEGIN CERTIFICATE-----\nMIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE\nCgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB\nIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw\nMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD\nDAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV\nBU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD\n7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN\nuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW\nZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7\nxzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f\npy25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K\ngWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol\nhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ\ntqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf\nBgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB\nACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q\necsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua\n4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG\nE5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX\nBDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn\naH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy\nPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX\nkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C\nekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-IXR.php",
    "content": "<?php\n/**\n * IXR - The Incutio XML-RPC Library\n *\n * Copyright (c) 2010, Incutio Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n *  - Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n *  - Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *  - Neither the name of Incutio Ltd. nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n * IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * @package IXR\n * @since 1.5.0\n *\n * @copyright  Incutio Ltd 2010 (http://www.incutio.com)\n * @version    1.7.4 7th September 2010\n * @author     Simon Willison\n * @link       http://scripts.incutio.com/xmlrpc/ Site/manual\n * @license    http://www.opensource.org/licenses/bsd-license.php BSD\n */\n\n/**\n * IXR_Value\n *\n * @package IXR\n * @since 1.5.0\n */\nclass IXR_Value {\n    var $data;\n    var $type;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n\tfunction __construct( $data, $type = false )\n    {\n        $this->data = $data;\n        if (!$type) {\n            $type = $this->calculateType();\n        }\n        $this->type = $type;\n        if ($type == 'struct') {\n            // Turn all the values in the array in to new IXR_Value objects\n            foreach ($this->data as $key => $value) {\n                $this->data[$key] = new IXR_Value($value);\n            }\n        }\n        if ($type == 'array') {\n            for ($i = 0, $j = count($this->data); $i < $j; $i++) {\n                $this->data[$i] = new IXR_Value($this->data[$i]);\n            }\n        }\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_Value( $data, $type = false ) {\n\t\tself::__construct( $data, $type );\n\t}\n\n    function calculateType()\n    {\n        if ($this->data === true || $this->data === false) {\n            return 'boolean';\n        }\n        if (is_integer($this->data)) {\n            return 'int';\n        }\n        if (is_double($this->data)) {\n            return 'double';\n        }\n\n        // Deal with IXR object types base64 and date\n        if (is_object($this->data) && is_a($this->data, 'IXR_Date')) {\n            return 'date';\n        }\n        if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) {\n            return 'base64';\n        }\n\n        // If it is a normal PHP object convert it in to a struct\n        if (is_object($this->data)) {\n            $this->data = get_object_vars($this->data);\n            return 'struct';\n        }\n        if (!is_array($this->data)) {\n            return 'string';\n        }\n\n        // We have an array - is it an array or a struct?\n        if ($this->isStruct($this->data)) {\n            return 'struct';\n        } else {\n            return 'array';\n        }\n    }\n\n    function getXml()\n    {\n        // Return XML for this value\n        switch ($this->type) {\n            case 'boolean':\n                return '<boolean>'.(($this->data) ? '1' : '0').'</boolean>';\n                break;\n            case 'int':\n                return '<int>'.$this->data.'</int>';\n                break;\n            case 'double':\n                return '<double>'.$this->data.'</double>';\n                break;\n            case 'string':\n                return '<string>'.htmlspecialchars($this->data).'</string>';\n                break;\n            case 'array':\n                $return = '<array><data>'.\"\\n\";\n                foreach ($this->data as $item) {\n                    $return .= '  <value>'.$item->getXml().\"</value>\\n\";\n                }\n                $return .= '</data></array>';\n                return $return;\n                break;\n            case 'struct':\n                $return = '<struct>'.\"\\n\";\n                foreach ($this->data as $name => $value) {\n\t\t\t\t\t$name = htmlspecialchars($name);\n                    $return .= \"  <member><name>$name</name><value>\";\n                    $return .= $value->getXml().\"</value></member>\\n\";\n                }\n                $return .= '</struct>';\n                return $return;\n                break;\n            case 'date':\n            case 'base64':\n                return $this->data->getXml();\n                break;\n        }\n        return false;\n    }\n\n    /**\n     * Checks whether or not the supplied array is a struct or not\n     *\n     * @param array $array\n     * @return bool\n     */\n    function isStruct($array)\n    {\n        $expected = 0;\n        foreach ($array as $key => $value) {\n            if ((string)$key != (string)$expected) {\n                return true;\n            }\n            $expected++;\n        }\n        return false;\n    }\n}\n\n/**\n * IXR_MESSAGE\n *\n * @package IXR\n * @since 1.5.0\n *\n */\nclass IXR_Message\n{\n    var $message;\n    var $messageType;  // methodCall / methodResponse / fault\n    var $faultCode;\n    var $faultString;\n    var $methodName;\n    var $params;\n\n    // Current variable stacks\n    var $_arraystructs = array();   // The stack used to keep track of the current array/struct\n    var $_arraystructstypes = array(); // Stack keeping track of if things are structs or array\n    var $_currentStructName = array();  // A stack as well\n    var $_param;\n    var $_value;\n    var $_currentTag;\n    var $_currentTagContents;\n    // The XML parser\n    var $_parser;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $message )\n    {\n        $this->message =& $message;\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_Message( $message ) {\n\t\tself::__construct( $message );\n\t}\n\n    function parse()\n    {\n        // first remove the XML declaration\n        // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages\n        $header = preg_replace( '/<\\?xml.*?\\?'.'>/s', '', substr( $this->message, 0, 100 ), 1 );\n        $this->message = trim( substr_replace( $this->message, $header, 0, 100 ) );\n        if ( '' == $this->message ) {\n            return false;\n        }\n\n        // Then remove the DOCTYPE\n        $header = preg_replace( '/^<!DOCTYPE[^>]*+>/i', '', substr( $this->message, 0, 200 ), 1 );\n        $this->message = trim( substr_replace( $this->message, $header, 0, 200 ) );\n        if ( '' == $this->message ) {\n            return false;\n        }\n\n        // Check that the root tag is valid\n        $root_tag = substr( $this->message, 0, strcspn( substr( $this->message, 0, 20 ), \"> \\t\\r\\n\" ) );\n        if ( '<!DOCTYPE' === strtoupper( $root_tag ) ) {\n            return false;\n        }\n        if ( ! in_array( $root_tag, array( '<methodCall', '<methodResponse', '<fault' ) ) ) {\n            return false;\n        }\n\n        // Bail if there are too many elements to parse\n        $element_limit = 30000;\n        if ( function_exists( 'apply_filters' ) ) {\n            /**\n             * Filter the number of elements to parse in an XML-RPC response.\n             *\n             * @since 4.0.0\n             *\n             * @param int $element_limit Default elements limit.\n             */\n            $element_limit = apply_filters( 'xmlrpc_element_limit', $element_limit );\n        }\n        if ( $element_limit && 2 * $element_limit < substr_count( $this->message, '<' ) ) {\n            return false;\n        }\n\n        $this->_parser = xml_parser_create();\n        // Set XML parser to take the case of tags in to account\n        xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);\n        // Set XML parser callback functions\n        xml_set_object($this->_parser, $this);\n        xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');\n        xml_set_character_data_handler($this->_parser, 'cdata');\n\n        // 256Kb, parse in chunks to avoid the RAM usage on very large messages\n        $chunk_size = 262144;\n\n        /**\n         * Filter the chunk size that can be used to parse an XML-RPC reponse message.\n         *\n         * @since 4.4.0\n         *\n         * @param int $chunk_size Chunk size to parse in bytes.\n         */\n        $chunk_size = apply_filters( 'xmlrpc_chunk_parsing_size', $chunk_size );\n\n        $final = false;\n        do {\n            if (strlen($this->message) <= $chunk_size) {\n                $final = true;\n            }\n            $part = substr($this->message, 0, $chunk_size);\n            $this->message = substr($this->message, $chunk_size);\n            if (!xml_parse($this->_parser, $part, $final)) {\n                return false;\n            }\n            if ($final) {\n                break;\n            }\n        } while (true);\n        xml_parser_free($this->_parser);\n\n        // Grab the error messages, if any\n        if ($this->messageType == 'fault') {\n            $this->faultCode = $this->params[0]['faultCode'];\n            $this->faultString = $this->params[0]['faultString'];\n        }\n        return true;\n    }\n\n    function tag_open($parser, $tag, $attr)\n    {\n        $this->_currentTagContents = '';\n        $this->currentTag = $tag;\n        switch($tag) {\n            case 'methodCall':\n            case 'methodResponse':\n            case 'fault':\n                $this->messageType = $tag;\n                break;\n                /* Deal with stacks of arrays and structs */\n            case 'data':    // data is to all intents and puposes more interesting than array\n                $this->_arraystructstypes[] = 'array';\n                $this->_arraystructs[] = array();\n                break;\n            case 'struct':\n                $this->_arraystructstypes[] = 'struct';\n                $this->_arraystructs[] = array();\n                break;\n        }\n    }\n\n    function cdata($parser, $cdata)\n    {\n        $this->_currentTagContents .= $cdata;\n    }\n\n    function tag_close($parser, $tag)\n    {\n        $valueFlag = false;\n        switch($tag) {\n            case 'int':\n            case 'i4':\n                $value = (int)trim($this->_currentTagContents);\n                $valueFlag = true;\n                break;\n            case 'double':\n                $value = (double)trim($this->_currentTagContents);\n                $valueFlag = true;\n                break;\n            case 'string':\n                $value = (string)trim($this->_currentTagContents);\n                $valueFlag = true;\n                break;\n            case 'dateTime.iso8601':\n                $value = new IXR_Date(trim($this->_currentTagContents));\n                $valueFlag = true;\n                break;\n            case 'value':\n                // \"If no type is indicated, the type is string.\"\n                if (trim($this->_currentTagContents) != '') {\n                    $value = (string)$this->_currentTagContents;\n                    $valueFlag = true;\n                }\n                break;\n            case 'boolean':\n                $value = (boolean)trim($this->_currentTagContents);\n                $valueFlag = true;\n                break;\n            case 'base64':\n                $value = base64_decode($this->_currentTagContents);\n                $valueFlag = true;\n                break;\n                /* Deal with stacks of arrays and structs */\n            case 'data':\n            case 'struct':\n                $value = array_pop($this->_arraystructs);\n                array_pop($this->_arraystructstypes);\n                $valueFlag = true;\n                break;\n            case 'member':\n                array_pop($this->_currentStructName);\n                break;\n            case 'name':\n                $this->_currentStructName[] = trim($this->_currentTagContents);\n                break;\n            case 'methodName':\n                $this->methodName = trim($this->_currentTagContents);\n                break;\n        }\n\n        if ($valueFlag) {\n            if (count($this->_arraystructs) > 0) {\n                // Add value to struct or array\n                if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') {\n                    // Add to struct\n                    $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value;\n                } else {\n                    // Add to array\n                    $this->_arraystructs[count($this->_arraystructs)-1][] = $value;\n                }\n            } else {\n                // Just add as a parameter\n                $this->params[] = $value;\n            }\n        }\n        $this->_currentTagContents = '';\n    }\n}\n\n/**\n * IXR_Server\n *\n * @package IXR\n * @since 1.5.0\n */\nclass IXR_Server\n{\n    var $data;\n    var $callbacks = array();\n    var $message;\n    var $capabilities;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $callbacks = false, $data = false, $wait = false )\n    {\n        $this->setCapabilities();\n        if ($callbacks) {\n            $this->callbacks = $callbacks;\n        }\n        $this->setCallbacks();\n        if (!$wait) {\n            $this->serve($data);\n        }\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_Server( $callbacks = false, $data = false, $wait = false ) {\n\t\tself::__construct( $callbacks, $data, $wait );\n\t}\n\n    function serve($data = false)\n    {\n        if (!$data) {\n            if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') {\n                if ( function_exists( 'status_header' ) ) {\n                    status_header( 405 ); // WP #20986\n                    header( 'Allow: POST' );\n                }\n                header('Content-Type: text/plain'); // merged from WP #9093\n                die('XML-RPC server accepts POST requests only.');\n            }\n\n            global $HTTP_RAW_POST_DATA;\n            if (empty($HTTP_RAW_POST_DATA)) {\n                // workaround for a bug in PHP 5.2.2 - http://bugs.php.net/bug.php?id=41293\n                $data = file_get_contents('php://input');\n            } else {\n                $data =& $HTTP_RAW_POST_DATA;\n            }\n        }\n        $this->message = new IXR_Message($data);\n        if (!$this->message->parse()) {\n            $this->error(-32700, 'parse error. not well formed');\n        }\n        if ($this->message->messageType != 'methodCall') {\n            $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall');\n        }\n        $result = $this->call($this->message->methodName, $this->message->params);\n\n        // Is the result an error?\n        if (is_a($result, 'IXR_Error')) {\n            $this->error($result);\n        }\n\n        // Encode the result\n        $r = new IXR_Value($result);\n        $resultxml = $r->getXml();\n\n        // Create the XML\n        $xml = <<<EOD\n<methodResponse>\n  <params>\n    <param>\n      <value>\n      $resultxml\n      </value>\n    </param>\n  </params>\n</methodResponse>\n\nEOD;\n      // Send it\n      $this->output($xml);\n    }\n\n    function call($methodname, $args)\n    {\n        if (!$this->hasMethod($methodname)) {\n            return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.');\n        }\n        $method = $this->callbacks[$methodname];\n\n        // Perform the callback and send the response\n        if (count($args) == 1) {\n            // If only one parameter just send that instead of the whole array\n            $args = $args[0];\n        }\n\n        // Are we dealing with a function or a method?\n        if (is_string($method) && substr($method, 0, 5) == 'this:') {\n            // It's a class method - check it exists\n            $method = substr($method, 5);\n            if (!method_exists($this, $method)) {\n                return new IXR_Error(-32601, 'server error. requested class method \"'.$method.'\" does not exist.');\n            }\n\n            //Call the method\n            $result = $this->$method($args);\n        } else {\n            // It's a function - does it exist?\n            if (is_array($method)) {\n                if (!is_callable(array($method[0], $method[1]))) {\n                    return new IXR_Error(-32601, 'server error. requested object method \"'.$method[1].'\" does not exist.');\n                }\n            } else if (!function_exists($method)) {\n                return new IXR_Error(-32601, 'server error. requested function \"'.$method.'\" does not exist.');\n            }\n\n            // Call the function\n            $result = call_user_func($method, $args);\n        }\n        return $result;\n    }\n\n    function error($error, $message = false)\n    {\n        // Accepts either an error object or an error code and message\n        if ($message && !is_object($error)) {\n            $error = new IXR_Error($error, $message);\n        }\n        $this->output($error->getXml());\n    }\n\n    function output($xml)\n    {\n        $charset = function_exists('get_option') ? get_option('blog_charset') : '';\n        if ($charset)\n            $xml = '<?xml version=\"1.0\" encoding=\"'.$charset.'\"?>'.\"\\n\".$xml;\n        else\n            $xml = '<?xml version=\"1.0\"?>'.\"\\n\".$xml;\n        $length = strlen($xml);\n        header('Connection: close');\n        if ($charset)\n            header('Content-Type: text/xml; charset='.$charset);\n        else\n            header('Content-Type: text/xml');\n        header('Date: '.date('r'));\n        echo $xml;\n        exit;\n    }\n\n    function hasMethod($method)\n    {\n        return in_array($method, array_keys($this->callbacks));\n    }\n\n    function setCapabilities()\n    {\n        // Initialises capabilities array\n        $this->capabilities = array(\n            'xmlrpc' => array(\n                'specUrl' => 'http://www.xmlrpc.com/spec',\n                'specVersion' => 1\n        ),\n            'faults_interop' => array(\n                'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php',\n                'specVersion' => 20010516\n        ),\n            'system.multicall' => array(\n                'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208',\n                'specVersion' => 1\n        ),\n        );\n    }\n\n    function getCapabilities($args)\n    {\n        return $this->capabilities;\n    }\n\n    function setCallbacks()\n    {\n        $this->callbacks['system.getCapabilities'] = 'this:getCapabilities';\n        $this->callbacks['system.listMethods'] = 'this:listMethods';\n        $this->callbacks['system.multicall'] = 'this:multiCall';\n    }\n\n    function listMethods($args)\n    {\n        // Returns a list of methods - uses array_reverse to ensure user defined\n        // methods are listed before server defined methods\n        return array_reverse(array_keys($this->callbacks));\n    }\n\n    function multiCall($methodcalls)\n    {\n        // See http://www.xmlrpc.com/discuss/msgReader$1208\n        $return = array();\n        foreach ($methodcalls as $call) {\n            $method = $call['methodName'];\n            $params = $call['params'];\n            if ($method == 'system.multicall') {\n                $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden');\n            } else {\n                $result = $this->call($method, $params);\n            }\n            if (is_a($result, 'IXR_Error')) {\n                $return[] = array(\n                    'faultCode' => $result->code,\n                    'faultString' => $result->message\n                );\n            } else {\n                $return[] = array($result);\n            }\n        }\n        return $return;\n    }\n}\n\n/**\n * IXR_Request\n *\n * @package IXR\n * @since 1.5.0\n */\nclass IXR_Request\n{\n    var $method;\n    var $args;\n    var $xml;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct($method, $args)\n    {\n        $this->method = $method;\n        $this->args = $args;\n        $this->xml = <<<EOD\n<?xml version=\"1.0\"?>\n<methodCall>\n<methodName>{$this->method}</methodName>\n<params>\n\nEOD;\n        foreach ($this->args as $arg) {\n            $this->xml .= '<param><value>';\n            $v = new IXR_Value($arg);\n            $this->xml .= $v->getXml();\n            $this->xml .= \"</value></param>\\n\";\n        }\n        $this->xml .= '</params></methodCall>';\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_Request( $method, $args ) {\n\t\tself::__construct( $method, $args );\n\t}\n\n    function getLength()\n    {\n        return strlen($this->xml);\n    }\n\n    function getXml()\n    {\n        return $this->xml;\n    }\n}\n\n/**\n * IXR_Client\n *\n * @package IXR\n * @since 1.5.0\n *\n */\nclass IXR_Client\n{\n    var $server;\n    var $port;\n    var $path;\n    var $useragent;\n    var $response;\n    var $message = false;\n    var $debug = false;\n    var $timeout;\n    var $headers = array();\n\n    // Storage place for an error message\n    var $error = false;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $server, $path = false, $port = 80, $timeout = 15 )\n    {\n        if (!$path) {\n            // Assume we have been given a URL instead\n            $bits = parse_url($server);\n            $this->server = $bits['host'];\n            $this->port = isset($bits['port']) ? $bits['port'] : 80;\n            $this->path = isset($bits['path']) ? $bits['path'] : '/';\n\n            // Make absolutely sure we have a path\n            if (!$this->path) {\n                $this->path = '/';\n            }\n\n            if ( ! empty( $bits['query'] ) ) {\n                $this->path .= '?' . $bits['query'];\n            }\n        } else {\n            $this->server = $server;\n            $this->path = $path;\n            $this->port = $port;\n        }\n        $this->useragent = 'The Incutio XML-RPC PHP Library';\n        $this->timeout = $timeout;\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_Client( $server, $path = false, $port = 80, $timeout = 15 ) {\n\t\tself::__construct( $server, $path, $port, $timeout );\n\t}\n\n    function query()\n    {\n        $args = func_get_args();\n        $method = array_shift($args);\n        $request = new IXR_Request($method, $args);\n        $length = $request->getLength();\n        $xml = $request->getXml();\n        $r = \"\\r\\n\";\n        $request  = \"POST {$this->path} HTTP/1.0$r\";\n\n        // Merged from WP #8145 - allow custom headers\n        $this->headers['Host']          = $this->server;\n        $this->headers['Content-Type']  = 'text/xml';\n        $this->headers['User-Agent']    = $this->useragent;\n        $this->headers['Content-Length']= $length;\n\n        foreach( $this->headers as $header => $value ) {\n            $request .= \"{$header}: {$value}{$r}\";\n        }\n        $request .= $r;\n\n        $request .= $xml;\n\n        // Now send the request\n        if ($this->debug) {\n            echo '<pre class=\"ixr_request\">'.htmlspecialchars($request).\"\\n</pre>\\n\\n\";\n        }\n\n        if ($this->timeout) {\n            $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout);\n        } else {\n            $fp = @fsockopen($this->server, $this->port, $errno, $errstr);\n        }\n        if (!$fp) {\n            $this->error = new IXR_Error(-32300, 'transport error - could not open socket');\n            return false;\n        }\n        fputs($fp, $request);\n        $contents = '';\n        $debugContents = '';\n        $gotFirstLine = false;\n        $gettingHeaders = true;\n        while (!feof($fp)) {\n            $line = fgets($fp, 4096);\n            if (!$gotFirstLine) {\n                // Check line for '200'\n                if (strstr($line, '200') === false) {\n                    $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200');\n                    return false;\n                }\n                $gotFirstLine = true;\n            }\n            if (trim($line) == '') {\n                $gettingHeaders = false;\n            }\n            if (!$gettingHeaders) {\n            \t// merged from WP #12559 - remove trim\n                $contents .= $line;\n            }\n            if ($this->debug) {\n            \t$debugContents .= $line;\n            }\n        }\n        if ($this->debug) {\n            echo '<pre class=\"ixr_response\">'.htmlspecialchars($debugContents).\"\\n</pre>\\n\\n\";\n        }\n\n        // Now parse what we've got back\n        $this->message = new IXR_Message($contents);\n        if (!$this->message->parse()) {\n            // XML error\n            $this->error = new IXR_Error(-32700, 'parse error. not well formed');\n            return false;\n        }\n\n        // Is the message a fault?\n        if ($this->message->messageType == 'fault') {\n            $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);\n            return false;\n        }\n\n        // Message must be OK\n        return true;\n    }\n\n    function getResponse()\n    {\n        // methodResponses can only have one param - return that\n        return $this->message->params[0];\n    }\n\n    function isError()\n    {\n        return (is_object($this->error));\n    }\n\n    function getErrorCode()\n    {\n        return $this->error->code;\n    }\n\n    function getErrorMessage()\n    {\n        return $this->error->message;\n    }\n}\n\n\n/**\n * IXR_Error\n *\n * @package IXR\n * @since 1.5.0\n */\nclass IXR_Error\n{\n    var $code;\n    var $message;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $code, $message )\n    {\n        $this->code = $code;\n        $this->message = htmlspecialchars($message);\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_Error( $code, $message ) {\n\t\tself::__construct( $code, $message );\n\t}\n\n    function getXml()\n    {\n        $xml = <<<EOD\n<methodResponse>\n  <fault>\n    <value>\n      <struct>\n        <member>\n          <name>faultCode</name>\n          <value><int>{$this->code}</int></value>\n        </member>\n        <member>\n          <name>faultString</name>\n          <value><string>{$this->message}</string></value>\n        </member>\n      </struct>\n    </value>\n  </fault>\n</methodResponse>\n\nEOD;\n        return $xml;\n    }\n}\n\n/**\n * IXR_Date\n *\n * @package IXR\n * @since 1.5.0\n */\nclass IXR_Date {\n    var $year;\n    var $month;\n    var $day;\n    var $hour;\n    var $minute;\n    var $second;\n    var $timezone;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $time )\n    {\n        // $time can be a PHP timestamp or an ISO one\n        if (is_numeric($time)) {\n            $this->parseTimestamp($time);\n        } else {\n            $this->parseIso($time);\n        }\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_Date( $time ) {\n\t\tself::__construct( $time );\n\t}\n\n    function parseTimestamp($timestamp)\n    {\n        $this->year = date('Y', $timestamp);\n        $this->month = date('m', $timestamp);\n        $this->day = date('d', $timestamp);\n        $this->hour = date('H', $timestamp);\n        $this->minute = date('i', $timestamp);\n        $this->second = date('s', $timestamp);\n        $this->timezone = '';\n    }\n\n    function parseIso($iso)\n    {\n        $this->year = substr($iso, 0, 4);\n        $this->month = substr($iso, 4, 2);\n        $this->day = substr($iso, 6, 2);\n        $this->hour = substr($iso, 9, 2);\n        $this->minute = substr($iso, 12, 2);\n        $this->second = substr($iso, 15, 2);\n        $this->timezone = substr($iso, 17);\n    }\n\n    function getIso()\n    {\n        return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone;\n    }\n\n    function getXml()\n    {\n        return '<dateTime.iso8601>'.$this->getIso().'</dateTime.iso8601>';\n    }\n\n    function getTimestamp()\n    {\n        return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);\n    }\n}\n\n/**\n * IXR_Base64\n *\n * @package IXR\n * @since 1.5.0\n */\nclass IXR_Base64\n{\n    var $data;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $data )\n    {\n        $this->data = $data;\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_Base64( $data ) {\n\t\tself::__construct( $data );\n\t}\n\n    function getXml()\n    {\n        return '<base64>'.base64_encode($this->data).'</base64>';\n    }\n}\n\n/**\n * IXR_IntrospectionServer\n *\n * @package IXR\n * @since 1.5.0\n */\nclass IXR_IntrospectionServer extends IXR_Server\n{\n    var $signatures;\n    var $help;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct()\n    {\n        $this->setCallbacks();\n        $this->setCapabilities();\n        $this->capabilities['introspection'] = array(\n            'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html',\n            'specVersion' => 1\n        );\n        $this->addCallback(\n            'system.methodSignature',\n            'this:methodSignature',\n            array('array', 'string'),\n            'Returns an array describing the return type and required parameters of a method'\n        );\n        $this->addCallback(\n            'system.getCapabilities',\n            'this:getCapabilities',\n            array('struct'),\n            'Returns a struct describing the XML-RPC specifications supported by this server'\n        );\n        $this->addCallback(\n            'system.listMethods',\n            'this:listMethods',\n            array('array'),\n            'Returns an array of available methods on this server'\n        );\n        $this->addCallback(\n            'system.methodHelp',\n            'this:methodHelp',\n            array('string', 'string'),\n            'Returns a documentation string for the specified method'\n        );\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_IntrospectionServer() {\n\t\tself::__construct();\n\t}\n\n    function addCallback($method, $callback, $args, $help)\n    {\n        $this->callbacks[$method] = $callback;\n        $this->signatures[$method] = $args;\n        $this->help[$method] = $help;\n    }\n\n    function call($methodname, $args)\n    {\n        // Make sure it's in an array\n        if ($args && !is_array($args)) {\n            $args = array($args);\n        }\n\n        // Over-rides default call method, adds signature check\n        if (!$this->hasMethod($methodname)) {\n            return new IXR_Error(-32601, 'server error. requested method \"'.$this->message->methodName.'\" not specified.');\n        }\n        $method = $this->callbacks[$methodname];\n        $signature = $this->signatures[$methodname];\n        $returnType = array_shift($signature);\n\n        // Check the number of arguments\n        if (count($args) != count($signature)) {\n            return new IXR_Error(-32602, 'server error. wrong number of method parameters');\n        }\n\n        // Check the argument types\n        $ok = true;\n        $argsbackup = $args;\n        for ($i = 0, $j = count($args); $i < $j; $i++) {\n            $arg = array_shift($args);\n            $type = array_shift($signature);\n            switch ($type) {\n                case 'int':\n                case 'i4':\n                    if (is_array($arg) || !is_int($arg)) {\n                        $ok = false;\n                    }\n                    break;\n                case 'base64':\n                case 'string':\n                    if (!is_string($arg)) {\n                        $ok = false;\n                    }\n                    break;\n                case 'boolean':\n                    if ($arg !== false && $arg !== true) {\n                        $ok = false;\n                    }\n                    break;\n                case 'float':\n                case 'double':\n                    if (!is_float($arg)) {\n                        $ok = false;\n                    }\n                    break;\n                case 'date':\n                case 'dateTime.iso8601':\n                    if (!is_a($arg, 'IXR_Date')) {\n                        $ok = false;\n                    }\n                    break;\n            }\n            if (!$ok) {\n                return new IXR_Error(-32602, 'server error. invalid method parameters');\n            }\n        }\n        // It passed the test - run the \"real\" method call\n        return parent::call($methodname, $argsbackup);\n    }\n\n    function methodSignature($method)\n    {\n        if (!$this->hasMethod($method)) {\n            return new IXR_Error(-32601, 'server error. requested method \"'.$method.'\" not specified.');\n        }\n        // We should be returning an array of types\n        $types = $this->signatures[$method];\n        $return = array();\n        foreach ($types as $type) {\n            switch ($type) {\n                case 'string':\n                    $return[] = 'string';\n                    break;\n                case 'int':\n                case 'i4':\n                    $return[] = 42;\n                    break;\n                case 'double':\n                    $return[] = 3.1415;\n                    break;\n                case 'dateTime.iso8601':\n                    $return[] = new IXR_Date(time());\n                    break;\n                case 'boolean':\n                    $return[] = true;\n                    break;\n                case 'base64':\n                    $return[] = new IXR_Base64('base64');\n                    break;\n                case 'array':\n                    $return[] = array('array');\n                    break;\n                case 'struct':\n                    $return[] = array('struct' => 'struct');\n                    break;\n            }\n        }\n        return $return;\n    }\n\n    function methodHelp($method)\n    {\n        return $this->help[$method];\n    }\n}\n\n/**\n * IXR_ClientMulticall\n *\n * @package IXR\n * @since 1.5.0\n */\nclass IXR_ClientMulticall extends IXR_Client\n{\n    var $calls = array();\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct( $server, $path = false, $port = 80 )\n    {\n        parent::IXR_Client($server, $path, $port);\n        $this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function IXR_ClientMulticall( $server, $path = false, $port = 80 ) {\n\t\tself::__construct( $server, $path, $port );\n\t}\n\n    function addCall()\n    {\n        $args = func_get_args();\n        $methodName = array_shift($args);\n        $struct = array(\n            'methodName' => $methodName,\n            'params' => $args\n        );\n        $this->calls[] = $struct;\n    }\n\n    function query()\n    {\n        // Prepare multicall, then call the parent::query() method\n        return parent::query('system.multicall', $this->calls);\n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-feed.php",
    "content": "<?php\n\nif ( ! class_exists( 'SimplePie', false ) )\n\trequire_once( ABSPATH . WPINC . '/class-simplepie.php' );\n\nclass WP_Feed_Cache extends SimplePie_Cache {\n\t/**\n\t * Create a new SimplePie_Cache object\n\t *\n\t * @static\n\t * @access public\n\t */\n\tpublic function create($location, $filename, $extension) {\n\t\treturn new WP_Feed_Cache_Transient($location, $filename, $extension);\n\t}\n}\n\nclass WP_Feed_Cache_Transient {\n\tpublic $name;\n\tpublic $mod_name;\n\tpublic $lifetime = 43200; //Default lifetime in cache of 12 hours\n\n\tpublic function __construct($location, $filename, $extension) {\n\t\t$this->name = 'feed_' . $filename;\n\t\t$this->mod_name = 'feed_mod_' . $filename;\n\n\t\t$lifetime = $this->lifetime;\n\t\t/**\n\t\t * Filter the transient lifetime of the feed cache.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param int    $lifetime Cache duration in seconds. Default is 43200 seconds (12 hours).\n\t\t * @param string $filename Unique identifier for the cache object.\n\t\t */\n\t\t$this->lifetime = apply_filters( 'wp_feed_cache_transient_lifetime', $lifetime, $filename);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function save($data) {\n\t\tif ( $data instanceof SimplePie ) {\n\t\t\t$data = $data->data;\n\t\t}\n\n\t\tset_transient($this->name, $data, $this->lifetime);\n\t\tset_transient($this->mod_name, time(), $this->lifetime);\n\t\treturn true;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function load() {\n\t\treturn get_transient($this->name);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function mtime() {\n\t\treturn get_transient($this->mod_name);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function touch() {\n\t\treturn set_transient($this->mod_name, time(), $this->lifetime);\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function unlink() {\n\t\tdelete_transient($this->name);\n\t\tdelete_transient($this->mod_name);\n\t\treturn true;\n\t}\n}\n\nclass WP_SimplePie_File extends SimplePie_File {\n\n\tpublic function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) {\n\t\t$this->url = $url;\n\t\t$this->timeout = $timeout;\n\t\t$this->redirects = $redirects;\n\t\t$this->headers = $headers;\n\t\t$this->useragent = $useragent;\n\n\t\t$this->method = SIMPLEPIE_FILE_SOURCE_REMOTE;\n\n\t\tif ( preg_match('/^http(s)?:\\/\\//i', $url) ) {\n\t\t\t$args = array(\n\t\t\t\t'timeout' => $this->timeout,\n\t\t\t\t'redirection' => $this->redirects,\n\t\t\t);\n\n\t\t\tif ( !empty($this->headers) )\n\t\t\t\t$args['headers'] = $this->headers;\n\n\t\t\tif ( SIMPLEPIE_USERAGENT != $this->useragent ) //Use default WP user agent unless custom has been specified\n\t\t\t\t$args['user-agent'] = $this->useragent;\n\n\t\t\t$res = wp_safe_remote_request($url, $args);\n\n\t\t\tif ( is_wp_error($res) ) {\n\t\t\t\t$this->error = 'WP HTTP Error: ' . $res->get_error_message();\n\t\t\t\t$this->success = false;\n\t\t\t} else {\n\t\t\t\t$this->headers = wp_remote_retrieve_headers( $res );\n\t\t\t\t$this->body = wp_remote_retrieve_body( $res );\n\t\t\t\t$this->status_code = wp_remote_retrieve_response_code( $res );\n\t\t\t}\n\t\t} else {\n\t\t\t$this->error = '';\n\t\t\t$this->success = false;\n\t\t}\n\t}\n}\n\n/**\n * WordPress SimplePie Sanitization Class\n *\n * Extension of the SimplePie_Sanitize class to use KSES, because\n * we cannot universally count on DOMDocument being available\n *\n * @package WordPress\n * @since 3.5.0\n */\nclass WP_SimplePie_Sanitize_KSES extends SimplePie_Sanitize {\n\tpublic function sanitize( $data, $type, $base = '' ) {\n\t\t$data = trim( $data );\n\t\tif ( $type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML ) {\n\t\t\tif (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\\/[A-Za-z][^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x2F\\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data)) {\n\t\t\t\t$type |= SIMPLEPIE_CONSTRUCT_HTML;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$type |= SIMPLEPIE_CONSTRUCT_TEXT;\n\t\t\t}\n\t\t}\n\t\tif ( $type & SIMPLEPIE_CONSTRUCT_BASE64 ) {\n\t\t\t$data = base64_decode( $data );\n\t\t}\n\t\tif ( $type & ( SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML ) ) {\n\t\t\t$data = wp_kses_post( $data );\n\t\t\tif ( $this->output_encoding !== 'UTF-8' ) {\n\t\t\t\t$data = $this->registry->call( 'Misc', 'change_encoding', array( $data, 'UTF-8', $this->output_encoding ) );\n\t\t\t}\n\t\t\treturn $data;\n\t\t} else {\n\t\t\treturn parent::sanitize( $data, $type, $base );\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-http.php",
    "content": "<?php\n/**\n * HTTP API: WP_Http class\n *\n * @package WordPress\n * @subpackage HTTP\n * @since 2.7.0\n */\n\n/**\n * Core class used for managing HTTP transports and making HTTP requests.\n *\n * This class is used to consistently make outgoing HTTP requests easy for developers\n * while still being compatible with the many PHP configurations under which\n * WordPress runs.\n *\n * Debugging includes several actions, which pass different variables for debugging the HTTP API.\n *\n * @since 2.7.0\n */\nclass WP_Http {\n\n\t/**\n\t * Send an HTTP request to a URI.\n\t *\n\t * Please note: The only URI that are supported in the HTTP Transport implementation\n\t * are the HTTP and HTTPS protocols.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @global string $wp_version\n\t *\n\t * @param string       $url  The request URL.\n\t * @param string|array $args {\n\t *     Optional. Array or string of HTTP request arguments.\n\t *\n\t *     @type string       $method              Request method. Accepts 'GET', 'POST', 'HEAD', or 'PUT'.\n\t *                                             Some transports technically allow others, but should not be\n\t *                                             assumed. Default 'GET'.\n\t *     @type int          $timeout             How long the connection should stay open in seconds. Default 5.\n\t *     @type int          $redirection         Number of allowed redirects. Not supported by all transports\n\t *                                             Default 5.\n\t *     @type string       $httpversion         Version of the HTTP protocol to use. Accepts '1.0' and '1.1'.\n\t *                                             Default '1.0'.\n\t *     @type string       $user-agent          User-agent value sent.\n\t *                                             Default WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ).\n\t *     @type bool         $reject_unsafe_urls  Whether to pass URLs through {@see wp_http_validate_url()}.\n\t *                                             Default false.\n\t *     @type bool         $blocking            Whether the calling code requires the result of the request.\n\t *                                             If set to false, the request will be sent to the remote server,\n\t *                                             and processing returned to the calling code immediately, the caller\n\t *                                             will know if the request succeeded or failed, but will not receive\n\t *                                             any response from the remote server. Default true.\n\t *     @type string|array $headers             Array or string of headers to send with the request.\n\t *                                             Default empty array.\n\t *     @type array        $cookies             List of cookies to send with the request. Default empty array.\n\t *     @type string|array $body                Body to send with the request. Default null.\n\t *     @type bool         $compress            Whether to compress the $body when sending the request.\n\t *                                             Default false.\n\t *     @type bool         $decompress          Whether to decompress a compressed response. If set to false and\n\t *                                             compressed content is returned in the response anyway, it will\n\t *                                             need to be separately decompressed. Default true.\n\t *     @type bool         $sslverify           Whether to verify SSL for the request. Default true.\n\t *     @type string       sslcertificates      Absolute path to an SSL certificate .crt file.\n\t *                                             Default ABSPATH . WPINC . '/certificates/ca-bundle.crt'.\n\t *     @type bool         $stream              Whether to stream to a file. If set to true and no filename was\n\t *                                             given, it will be droped it in the WP temp dir and its name will\n\t *                                             be set using the basename of the URL. Default false.\n\t *     @type string       $filename            Filename of the file to write to when streaming. $stream must be\n\t *                                             set to true. Default null.\n\t *     @type int          $limit_response_size Size in bytes to limit the response to. Default null.\n\t *\n\t * }\n\t * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'.\n\t *                        A WP_Error instance upon error.\n\t */\n\tpublic function request( $url, $args = array() ) {\n\t\tglobal $wp_version;\n\n\t\t$defaults = array(\n\t\t\t'method' => 'GET',\n\t\t\t/**\n\t\t\t * Filter the timeout value for an HTTP request.\n\t\t\t *\n\t\t\t * @since 2.7.0\n\t\t\t *\n\t\t\t * @param int $timeout_value Time in seconds until a request times out.\n\t\t\t *                           Default 5.\n\t\t\t */\n\t\t\t'timeout' => apply_filters( 'http_request_timeout', 5 ),\n\t\t\t/**\n\t\t\t * Filter the number of redirects allowed during an HTTP request.\n\t\t\t *\n\t\t\t * @since 2.7.0\n\t\t\t *\n\t\t\t * @param int $redirect_count Number of redirects allowed. Default 5.\n\t\t\t */\n\t\t\t'redirection' => apply_filters( 'http_request_redirection_count', 5 ),\n\t\t\t/**\n\t\t\t * Filter the version of the HTTP protocol used in a request.\n\t\t\t *\n\t\t\t * @since 2.7.0\n\t\t\t *\n\t\t\t * @param string $version Version of HTTP used. Accepts '1.0' and '1.1'.\n\t\t\t *                        Default '1.0'.\n\t\t\t */\n\t\t\t'httpversion' => apply_filters( 'http_request_version', '1.0' ),\n\t\t\t/**\n\t\t\t * Filter the user agent value sent with an HTTP request.\n\t\t\t *\n\t\t\t * @since 2.7.0\n\t\t\t *\n\t\t\t * @param string $user_agent WordPress user agent string.\n\t\t\t */\n\t\t\t'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) ),\n\t\t\t/**\n\t\t\t * Filter whether to pass URLs through wp_http_validate_url() in an HTTP request.\n\t\t\t *\n\t\t\t * @since 3.6.0\n\t\t\t *\n\t\t\t * @param bool $pass_url Whether to pass URLs through wp_http_validate_url().\n\t\t\t *                       Default false.\n\t\t\t */\n\t\t\t'reject_unsafe_urls' => apply_filters( 'http_request_reject_unsafe_urls', false ),\n\t\t\t'blocking' => true,\n\t\t\t'headers' => array(),\n\t\t\t'cookies' => array(),\n\t\t\t'body' => null,\n\t\t\t'compress' => false,\n\t\t\t'decompress' => true,\n\t\t\t'sslverify' => true,\n\t\t\t'sslcertificates' => ABSPATH . WPINC . '/certificates/ca-bundle.crt',\n\t\t\t'stream' => false,\n\t\t\t'filename' => null,\n\t\t\t'limit_response_size' => null,\n\t\t);\n\n\t\t// Pre-parse for the HEAD checks.\n\t\t$args = wp_parse_args( $args );\n\n\t\t// By default, Head requests do not cause redirections.\n\t\tif ( isset($args['method']) && 'HEAD' == $args['method'] )\n\t\t\t$defaults['redirection'] = 0;\n\n\t\t$r = wp_parse_args( $args, $defaults );\n\t\t/**\n\t\t * Filter the arguments used in an HTTP request.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array  $r   An array of HTTP request arguments.\n\t\t * @param string $url The request URL.\n\t\t */\n\t\t$r = apply_filters( 'http_request_args', $r, $url );\n\n\t\t// The transports decrement this, store a copy of the original value for loop purposes.\n\t\tif ( ! isset( $r['_redirection'] ) )\n\t\t\t$r['_redirection'] = $r['redirection'];\n\n\t\t/**\n\t\t * Filter whether to preempt an HTTP request's return value.\n\t\t *\n\t\t * Returning a non-false value from the filter will short-circuit the HTTP request and return\n\t\t * early with that value. A filter should return either:\n\t\t *\n\t\t *  - An array containing 'headers', 'body', 'response', 'cookies', and 'filename' elements\n\t\t *  - A WP_Error instance\n\t\t *  - boolean false (to avoid short-circuiting the response)\n\t\t *\n\t\t * Returning any other value may result in unexpected behaviour.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param false|array|WP_Error $preempt Whether to preempt an HTTP request's return value. Default false.\n\t\t * @param array               $r        HTTP request arguments.\n\t\t * @param string              $url      The request URL.\n\t\t */\n\t\t$pre = apply_filters( 'pre_http_request', false, $r, $url );\n\n\t\tif ( false !== $pre )\n\t\t\treturn $pre;\n\n\t\tif ( function_exists( 'wp_kses_bad_protocol' ) ) {\n\t\t\tif ( $r['reject_unsafe_urls'] )\n\t\t\t\t$url = wp_http_validate_url( $url );\n\t\t\tif ( $url ) {\n\t\t\t\t$url = wp_kses_bad_protocol( $url, array( 'http', 'https', 'ssl' ) );\n\t\t\t}\n\t\t}\n\n\t\t$arrURL = @parse_url( $url );\n\n\t\tif ( empty( $url ) || empty( $arrURL['scheme'] ) )\n\t\t\treturn new WP_Error('http_request_failed', __('A valid URL was not provided.'));\n\n\t\tif ( $this->block_request( $url ) )\n\t\t\treturn new WP_Error( 'http_request_failed', __( 'User has blocked requests through HTTP.' ) );\n\n\t\t/*\n\t\t * Determine if this is a https call and pass that on to the transport functions\n\t\t * so that we can blacklist the transports that do not support ssl verification\n\t\t */\n\t\t$r['ssl'] = $arrURL['scheme'] == 'https' || $arrURL['scheme'] == 'ssl';\n\n\t\t// Determine if this request is to OUR install of WordPress.\n\t\t$homeURL = parse_url( get_bloginfo( 'url' ) );\n\t\t$r['local'] = 'localhost' == $arrURL['host'] || ( isset( $homeURL['host'] ) && $homeURL['host'] == $arrURL['host'] );\n\t\tunset( $homeURL );\n\n\t\t/*\n\t\t * If we are streaming to a file but no filename was given drop it in the WP temp dir\n\t\t * and pick its name using the basename of the $url.\n\t\t */\n\t\tif ( $r['stream']  && empty( $r['filename'] ) ) {\n\t\t\t$r['filename'] = get_temp_dir() . wp_unique_filename( get_temp_dir(), basename( $url ) );\n\t\t}\n\n\t\t/*\n\t\t * Force some settings if we are streaming to a file and check for existence and perms\n\t\t * of destination directory.\n\t\t */\n\t\tif ( $r['stream'] ) {\n\t\t\t$r['blocking'] = true;\n\t\t\tif ( ! wp_is_writable( dirname( $r['filename'] ) ) )\n\t\t\t\treturn new WP_Error( 'http_request_failed', __( 'Destination directory for file streaming does not exist or is not writable.' ) );\n\t\t}\n\n\t\tif ( is_null( $r['headers'] ) )\n\t\t\t$r['headers'] = array();\n\n\t\tif ( ! is_array( $r['headers'] ) ) {\n\t\t\t$processedHeaders = self::processHeaders( $r['headers'], $url );\n\t\t\t$r['headers'] = $processedHeaders['headers'];\n\t\t}\n\n\t\tif ( isset( $r['headers']['User-Agent'] ) ) {\n\t\t\t$r['user-agent'] = $r['headers']['User-Agent'];\n\t\t\tunset( $r['headers']['User-Agent'] );\n\t\t}\n\n\t\tif ( isset( $r['headers']['user-agent'] ) ) {\n\t\t\t$r['user-agent'] = $r['headers']['user-agent'];\n\t\t\tunset( $r['headers']['user-agent'] );\n\t\t}\n\n\t\tif ( '1.1' == $r['httpversion'] && !isset( $r['headers']['connection'] ) ) {\n\t\t\t$r['headers']['connection'] = 'close';\n\t\t}\n\n\t\t// Construct Cookie: header if any cookies are set.\n\t\tself::buildCookieHeader( $r );\n\n\t\t// Avoid issues where mbstring.func_overload is enabled.\n\t\tmbstring_binary_safe_encoding();\n\n\t\tif ( ! isset( $r['headers']['Accept-Encoding'] ) ) {\n\t\t\tif ( $encoding = WP_Http_Encoding::accept_encoding( $url, $r ) )\n\t\t\t\t$r['headers']['Accept-Encoding'] = $encoding;\n\t\t}\n\n\t\tif ( ( ! is_null( $r['body'] ) && '' != $r['body'] ) || 'POST' == $r['method'] || 'PUT' == $r['method'] ) {\n\t\t\tif ( is_array( $r['body'] ) || is_object( $r['body'] ) ) {\n\t\t\t\t$r['body'] = http_build_query( $r['body'], null, '&' );\n\n\t\t\t\tif ( ! isset( $r['headers']['Content-Type'] ) )\n\t\t\t\t\t$r['headers']['Content-Type'] = 'application/x-www-form-urlencoded; charset=' . get_option( 'blog_charset' );\n\t\t\t}\n\n\t\t\tif ( '' === $r['body'] )\n\t\t\t\t$r['body'] = null;\n\n\t\t\tif ( ! isset( $r['headers']['Content-Length'] ) && ! isset( $r['headers']['content-length'] ) )\n\t\t\t\t$r['headers']['Content-Length'] = strlen( $r['body'] );\n\t\t}\n\n\t\t$response = $this->_dispatch_request( $url, $r );\n\n\t\treset_mbstring_encoding();\n\n\t\tif ( is_wp_error( $response ) )\n\t\t\treturn $response;\n\n\t\t// Append cookies that were used in this request to the response\n\t\tif ( ! empty( $r['cookies'] ) ) {\n\t\t\t$cookies_set = wp_list_pluck( $response['cookies'], 'name' );\n\t\t\tforeach ( $r['cookies'] as $cookie ) {\n\t\t\t\tif ( ! in_array( $cookie->name, $cookies_set ) && $cookie->test( $url ) ) {\n\t\t\t\t\t$response['cookies'][] = $cookie;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $response;\n\t}\n\n\t/**\n\t * Tests which transports are capable of supporting the request.\n\t *\n\t * @since 3.2.0\n\t * @access private\n\t *\n\t * @param array $args Request arguments\n\t * @param string $url URL to Request\n\t *\n\t * @return string|false Class name for the first transport that claims to support the request. False if no transport claims to support the request.\n\t */\n\tpublic function _get_first_available_transport( $args, $url = null ) {\n\t\t$transports = array( 'curl', 'streams' );\n\t\t/**\n\t\t * Filter which HTTP transports are available and in what order.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array  $transports Array of HTTP transports to check. Default array contains\n\t\t *                           'curl', and 'streams', in that order.\n\t\t * @param array  $args       HTTP request arguments.\n\t\t * @param string $url        The URL to request.\n\t\t */\n\t\t$request_order = apply_filters( 'http_api_transports', $transports, $args, $url );\n\n\t\t// Loop over each transport on each HTTP request looking for one which will serve this request's needs.\n\t\tforeach ( $request_order as $transport ) {\n\t\t\tif ( in_array( $transport, $transports ) ) {\n\t\t\t\t$transport = ucfirst( $transport );\n\t\t\t}\n\t\t\t$class = 'WP_Http_' . $transport;\n\n\t\t\t// Check to see if this transport is a possibility, calls the transport statically.\n\t\t\tif ( !call_user_func( array( $class, 'test' ), $args, $url ) )\n\t\t\t\tcontinue;\n\n\t\t\treturn $class;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Dispatches a HTTP request to a supporting transport.\n\t *\n\t * Tests each transport in order to find a transport which matches the request arguments.\n\t * Also caches the transport instance to be used later.\n\t *\n\t * The order for requests is cURL, and then PHP Streams.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @static\n\t * @access private\n\t *\n\t * @param string $url URL to Request\n\t * @param array $args Request arguments\n\t * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error\n\t */\n\tprivate function _dispatch_request( $url, $args ) {\n\t\tstatic $transports = array();\n\n\t\t$class = $this->_get_first_available_transport( $args, $url );\n\t\tif ( !$class )\n\t\t\treturn new WP_Error( 'http_failure', __( 'There are no HTTP transports available which can complete the requested request.' ) );\n\n\t\t// Transport claims to support request, instantiate it and give it a whirl.\n\t\tif ( empty( $transports[$class] ) )\n\t\t\t$transports[$class] = new $class;\n\n\t\t$response = $transports[$class]->request( $url, $args );\n\n\t\t/**\n\t\t * Fires after an HTTP API response is received and before the response is returned.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array|WP_Error $response HTTP response or WP_Error object.\n\t\t * @param string         $context  Context under which the hook is fired.\n\t\t * @param string         $class    HTTP transport used.\n\t\t * @param array          $args     HTTP request arguments.\n\t\t * @param string         $url      The request URL.\n\t\t */\n\t\tdo_action( 'http_api_debug', $response, 'response', $class, $args, $url );\n\n\t\tif ( is_wp_error( $response ) )\n\t\t\treturn $response;\n\n\t\t/**\n\t\t * Filter the HTTP API response immediately before the response is returned.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param array  $response HTTP response.\n\t\t * @param array  $args     HTTP request arguments.\n\t\t * @param string $url      The request URL.\n\t\t */\n\t\treturn apply_filters( 'http_response', $response, $args, $url );\n\t}\n\n\t/**\n\t * Uses the POST HTTP method.\n\t *\n\t * Used for sending data that is expected to be in the body.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @param string       $url  The request URL.\n\t * @param string|array $args Optional. Override the defaults.\n\t * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error\n\t */\n\tpublic function post($url, $args = array()) {\n\t\t$defaults = array('method' => 'POST');\n\t\t$r = wp_parse_args( $args, $defaults );\n\t\treturn $this->request($url, $r);\n\t}\n\n\t/**\n\t * Uses the GET HTTP method.\n\t *\n\t * Used for sending data that is expected to be in the body.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @param string $url The request URL.\n\t * @param string|array $args Optional. Override the defaults.\n\t * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error\n\t */\n\tpublic function get($url, $args = array()) {\n\t\t$defaults = array('method' => 'GET');\n\t\t$r = wp_parse_args( $args, $defaults );\n\t\treturn $this->request($url, $r);\n\t}\n\n\t/**\n\t * Uses the HEAD HTTP method.\n\t *\n\t * Used for sending data that is expected to be in the body.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @param string $url The request URL.\n\t * @param string|array $args Optional. Override the defaults.\n\t * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error\n\t */\n\tpublic function head($url, $args = array()) {\n\t\t$defaults = array('method' => 'HEAD');\n\t\t$r = wp_parse_args( $args, $defaults );\n\t\treturn $this->request($url, $r);\n\t}\n\n\t/**\n\t * Parses the responses and splits the parts into headers and body.\n\t *\n\t * @access public\n\t * @static\n\t * @since 2.7.0\n\t *\n\t * @param string $strResponse The full response string\n\t * @return array Array with 'headers' and 'body' keys.\n\t */\n\tpublic static function processResponse($strResponse) {\n\t\t$res = explode(\"\\r\\n\\r\\n\", $strResponse, 2);\n\n\t\treturn array('headers' => $res[0], 'body' => isset($res[1]) ? $res[1] : '');\n\t}\n\n\t/**\n\t * Transform header string into an array.\n\t *\n\t * If an array is given then it is assumed to be raw header data with numeric keys with the\n\t * headers as the values. No headers must be passed that were already processed.\n\t *\n\t * @access public\n\t * @static\n\t * @since 2.7.0\n\t *\n\t * @param string|array $headers\n\t * @param string $url The URL that was requested\n\t * @return array Processed string headers. If duplicate headers are encountered,\n\t * \t\t\t\t\tThen a numbered array is returned as the value of that header-key.\n\t */\n\tpublic static function processHeaders( $headers, $url = '' ) {\n\t\t// Split headers, one per array element.\n\t\tif ( is_string($headers) ) {\n\t\t\t// Tolerate line terminator: CRLF = LF (RFC 2616 19.3).\n\t\t\t$headers = str_replace(\"\\r\\n\", \"\\n\", $headers);\n\t\t\t/*\n\t\t\t * Unfold folded header fields. LWS = [CRLF] 1*( SP | HT ) <US-ASCII SP, space (32)>,\n\t\t\t * <US-ASCII HT, horizontal-tab (9)> (RFC 2616 2.2).\n\t\t\t */\n\t\t\t$headers = preg_replace('/\\n[ \\t]/', ' ', $headers);\n\t\t\t// Create the headers array.\n\t\t\t$headers = explode(\"\\n\", $headers);\n\t\t}\n\n\t\t$response = array('code' => 0, 'message' => '');\n\n\t\t/*\n\t\t * If a redirection has taken place, The headers for each page request may have been passed.\n\t\t * In this case, determine the final HTTP header and parse from there.\n\t\t */\n\t\tfor ( $i = count($headers)-1; $i >= 0; $i-- ) {\n\t\t\tif ( !empty($headers[$i]) && false === strpos($headers[$i], ':') ) {\n\t\t\t\t$headers = array_splice($headers, $i);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$cookies = array();\n\t\t$newheaders = array();\n\t\tforeach ( (array) $headers as $tempheader ) {\n\t\t\tif ( empty($tempheader) )\n\t\t\t\tcontinue;\n\n\t\t\tif ( false === strpos($tempheader, ':') ) {\n\t\t\t\t$stack = explode(' ', $tempheader, 3);\n\t\t\t\t$stack[] = '';\n\t\t\t\tlist( , $response['code'], $response['message']) = $stack;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlist($key, $value) = explode(':', $tempheader, 2);\n\n\t\t\t$key = strtolower( $key );\n\t\t\t$value = trim( $value );\n\n\t\t\tif ( isset( $newheaders[ $key ] ) ) {\n\t\t\t\tif ( ! is_array( $newheaders[ $key ] ) )\n\t\t\t\t\t$newheaders[$key] = array( $newheaders[ $key ] );\n\t\t\t\t$newheaders[ $key ][] = $value;\n\t\t\t} else {\n\t\t\t\t$newheaders[ $key ] = $value;\n\t\t\t}\n\t\t\tif ( 'set-cookie' == $key )\n\t\t\t\t$cookies[] = new WP_Http_Cookie( $value, $url );\n\t\t}\n\n\t\t// Cast the Response Code to an int\n\t\t$response['code'] = intval( $response['code'] );\n\n\t\treturn array('response' => $response, 'headers' => $newheaders, 'cookies' => $cookies);\n\t}\n\n\t/**\n\t * Takes the arguments for a ::request() and checks for the cookie array.\n\t *\n\t * If it's found, then it upgrades any basic name => value pairs to WP_Http_Cookie instances,\n\t * which are each parsed into strings and added to the Cookie: header (within the arguments array).\n\t * Edits the array by reference.\n\t *\n\t * @access public\n\t * @version 2.8.0\n\t * @static\n\t *\n\t * @param array $r Full array of args passed into ::request()\n\t */\n\tpublic static function buildCookieHeader( &$r ) {\n\t\tif ( ! empty($r['cookies']) ) {\n\t\t\t// Upgrade any name => value cookie pairs to WP_HTTP_Cookie instances.\n\t\t\tforeach ( $r['cookies'] as $name => $value ) {\n\t\t\t\tif ( ! is_object( $value ) )\n\t\t\t\t\t$r['cookies'][ $name ] = new WP_Http_Cookie( array( 'name' => $name, 'value' => $value ) );\n\t\t\t}\n\n\t\t\t$cookies_header = '';\n\t\t\tforeach ( (array) $r['cookies'] as $cookie ) {\n\t\t\t\t$cookies_header .= $cookie->getHeaderValue() . '; ';\n\t\t\t}\n\n\t\t\t$cookies_header = substr( $cookies_header, 0, -2 );\n\t\t\t$r['headers']['cookie'] = $cookies_header;\n\t\t}\n\t}\n\n\t/**\n\t * Decodes chunk transfer-encoding, based off the HTTP 1.1 specification.\n\t *\n\t * Based off the HTTP http_encoding_dechunk function.\n\t *\n\t * @link http://tools.ietf.org/html/rfc2616#section-19.4.6 Process for chunked decoding.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t * @static\n\t *\n\t * @param string $body Body content\n\t * @return string Chunked decoded body on success or raw body on failure.\n\t */\n\tpublic static function chunkTransferDecode( $body ) {\n\t\t// The body is not chunked encoded or is malformed.\n\t\tif ( ! preg_match( '/^([0-9a-f]+)[^\\r\\n]*\\r\\n/i', trim( $body ) ) )\n\t\t\treturn $body;\n\n\t\t$parsed_body = '';\n\n\t\t// We'll be altering $body, so need a backup in case of error.\n\t\t$body_original = $body;\n\n\t\twhile ( true ) {\n\t\t\t$has_chunk = (bool) preg_match( '/^([0-9a-f]+)[^\\r\\n]*\\r\\n/i', $body, $match );\n\t\t\tif ( ! $has_chunk || empty( $match[1] ) )\n\t\t\t\treturn $body_original;\n\n\t\t\t$length = hexdec( $match[1] );\n\t\t\t$chunk_length = strlen( $match[0] );\n\n\t\t\t// Parse out the chunk of data.\n\t\t\t$parsed_body .= substr( $body, $chunk_length, $length );\n\n\t\t\t// Remove the chunk from the raw data.\n\t\t\t$body = substr( $body, $length + $chunk_length );\n\n\t\t\t// End of the document.\n\t\t\tif ( '0' === trim( $body ) )\n\t\t\t\treturn $parsed_body;\n\t\t}\n\t}\n\n\t/**\n\t * Block requests through the proxy.\n\t *\n\t * Those who are behind a proxy and want to prevent access to certain hosts may do so. This will\n\t * prevent plugins from working and core functionality, if you don't include api.wordpress.org.\n\t *\n\t * You block external URL requests by defining WP_HTTP_BLOCK_EXTERNAL as true in your wp-config.php\n\t * file and this will only allow localhost and your blog to make requests. The constant\n\t * WP_ACCESSIBLE_HOSTS will allow additional hosts to go through for requests. The format of the\n\t * WP_ACCESSIBLE_HOSTS constant is a comma separated list of hostnames to allow, wildcard domains\n\t * are supported, eg *.wordpress.org will allow for all subdomains of wordpress.org to be contacted.\n\t *\n\t * @since 2.8.0\n\t * @link https://core.trac.wordpress.org/ticket/8927 Allow preventing external requests.\n\t * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_ACCESSIBLE_HOSTS\n\t *\n\t * @staticvar array|null $accessible_hosts\n\t * @staticvar array      $wildcard_regex\n\t *\n\t * @param string $uri URI of url.\n\t * @return bool True to block, false to allow.\n\t */\n\tpublic function block_request($uri) {\n\t\t// We don't need to block requests, because nothing is blocked.\n\t\tif ( ! defined( 'WP_HTTP_BLOCK_EXTERNAL' ) || ! WP_HTTP_BLOCK_EXTERNAL )\n\t\t\treturn false;\n\n\t\t$check = parse_url($uri);\n\t\tif ( ! $check )\n\t\t\treturn true;\n\n\t\t$home = parse_url( get_option('siteurl') );\n\n\t\t// Don't block requests back to ourselves by default.\n\t\tif ( 'localhost' == $check['host'] || ( isset( $home['host'] ) && $home['host'] == $check['host'] ) ) {\n\t\t\t/**\n\t\t\t * Filter whether to block local requests through the proxy.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param bool $block Whether to block local requests through proxy.\n\t\t\t *                    Default false.\n\t\t\t */\n\t\t\treturn apply_filters( 'block_local_requests', false );\n\t\t}\n\n\t\tif ( !defined('WP_ACCESSIBLE_HOSTS') )\n\t\t\treturn true;\n\n\t\tstatic $accessible_hosts = null;\n\t\tstatic $wildcard_regex = array();\n\t\tif ( null === $accessible_hosts ) {\n\t\t\t$accessible_hosts = preg_split('|,\\s*|', WP_ACCESSIBLE_HOSTS);\n\n\t\t\tif ( false !== strpos(WP_ACCESSIBLE_HOSTS, '*') ) {\n\t\t\t\t$wildcard_regex = array();\n\t\t\t\tforeach ( $accessible_hosts as $host )\n\t\t\t\t\t$wildcard_regex[] = str_replace( '\\*', '.+', preg_quote( $host, '/' ) );\n\t\t\t\t$wildcard_regex = '/^(' . implode('|', $wildcard_regex) . ')$/i';\n\t\t\t}\n\t\t}\n\n\t\tif ( !empty($wildcard_regex) )\n\t\t\treturn !preg_match($wildcard_regex, $check['host']);\n\t\telse\n\t\t\treturn !in_array( $check['host'], $accessible_hosts ); //Inverse logic, If it's in the array, then we can't access it.\n\n\t}\n\n\t/**\n\t * Used as a wrapper for PHP's parse_url() function that handles edgecases in < PHP 5.4.7.\n\t *\n\t * @access protected\n\t * @deprecated 4.4.0 Use wp_parse_url()\n\t * @see wp_parse_url()\n\t *\n\t * @param string $url The URL to parse.\n\t * @return bool|array False on failure; Array of URL components on success;\n\t *                    See parse_url()'s return values.\n\t */\n\tprotected static function parse_url( $url ) {\n\t\t_deprecated_function( __METHOD__, '4.4.0', 'wp_parse_url()' );\n\t\treturn wp_parse_url( $url );\n\t}\n\n\t/**\n\t * Converts a relative URL to an absolute URL relative to a given URL.\n\t *\n\t * If an Absolute URL is provided, no processing of that URL is done.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @param string $maybe_relative_path The URL which might be relative\n\t * @param string $url                 The URL which $maybe_relative_path is relative to\n\t * @return string An Absolute URL, in a failure condition where the URL cannot be parsed, the relative URL will be returned.\n\t */\n\tpublic static function make_absolute_url( $maybe_relative_path, $url ) {\n\t\tif ( empty( $url ) )\n\t\t\treturn $maybe_relative_path;\n\n\t\tif ( ! $url_parts = wp_parse_url( $url ) ) {\n\t\t\treturn $maybe_relative_path;\n\t\t}\n\n\t\tif ( ! $relative_url_parts = wp_parse_url( $maybe_relative_path ) ) {\n\t\t\treturn $maybe_relative_path;\n\t\t}\n\n\t\t// Check for a scheme on the 'relative' url\n\t\tif ( ! empty( $relative_url_parts['scheme'] ) ) {\n\t\t\treturn $maybe_relative_path;\n\t\t}\n\n\t\t$absolute_path = $url_parts['scheme'] . '://';\n\n\t\t// Schemeless URL's will make it this far, so we check for a host in the relative url and convert it to a protocol-url\n\t\tif ( isset( $relative_url_parts['host'] ) ) {\n\t\t\t$absolute_path .= $relative_url_parts['host'];\n\t\t\tif ( isset( $relative_url_parts['port'] ) )\n\t\t\t\t$absolute_path .= ':' . $relative_url_parts['port'];\n\t\t} else {\n\t\t\t$absolute_path .= $url_parts['host'];\n\t\t\tif ( isset( $url_parts['port'] ) )\n\t\t\t\t$absolute_path .= ':' . $url_parts['port'];\n\t\t}\n\n\t\t// Start off with the Absolute URL path.\n\t\t$path = ! empty( $url_parts['path'] ) ? $url_parts['path'] : '/';\n\n\t\t// If it's a root-relative path, then great.\n\t\tif ( ! empty( $relative_url_parts['path'] ) && '/' == $relative_url_parts['path'][0] ) {\n\t\t\t$path = $relative_url_parts['path'];\n\n\t\t// Else it's a relative path.\n\t\t} elseif ( ! empty( $relative_url_parts['path'] ) ) {\n\t\t\t// Strip off any file components from the absolute path.\n\t\t\t$path = substr( $path, 0, strrpos( $path, '/' ) + 1 );\n\n\t\t\t// Build the new path.\n\t\t\t$path .= $relative_url_parts['path'];\n\n\t\t\t// Strip all /path/../ out of the path.\n\t\t\twhile ( strpos( $path, '../' ) > 1 ) {\n\t\t\t\t$path = preg_replace( '![^/]+/\\.\\./!', '', $path );\n\t\t\t}\n\n\t\t\t// Strip any final leading ../ from the path.\n\t\t\t$path = preg_replace( '!^/(\\.\\./)+!', '', $path );\n\t\t}\n\n\t\t// Add the Query string.\n\t\tif ( ! empty( $relative_url_parts['query'] ) )\n\t\t\t$path .= '?' . $relative_url_parts['query'];\n\n\t\treturn $absolute_path . '/' . ltrim( $path, '/' );\n\t}\n\n\t/**\n\t * Handles HTTP Redirects and follows them if appropriate.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @static\n\t *\n\t * @param string $url The URL which was requested.\n\t * @param array $args The Arguments which were used to make the request.\n\t * @param array $response The Response of the HTTP request.\n\t * @return false|object False if no redirect is present, a WP_HTTP or WP_Error result otherwise.\n\t */\n\tpublic static function handle_redirects( $url, $args, $response ) {\n\t\t// If no redirects are present, or, redirects were not requested, perform no action.\n\t\tif ( ! isset( $response['headers']['location'] ) || 0 === $args['_redirection'] )\n\t\t\treturn false;\n\n\t\t// Only perform redirections on redirection http codes.\n\t\tif ( $response['response']['code'] > 399 || $response['response']['code'] < 300 )\n\t\t\treturn false;\n\n\t\t// Don't redirect if we've run out of redirects.\n\t\tif ( $args['redirection']-- <= 0 )\n\t\t\treturn new WP_Error( 'http_request_failed', __('Too many redirects.') );\n\n\t\t$redirect_location = $response['headers']['location'];\n\n\t\t// If there were multiple Location headers, use the last header specified.\n\t\tif ( is_array( $redirect_location ) )\n\t\t\t$redirect_location = array_pop( $redirect_location );\n\n\t\t$redirect_location = WP_Http::make_absolute_url( $redirect_location, $url );\n\n\t\t// POST requests should not POST to a redirected location.\n\t\tif ( 'POST' == $args['method'] ) {\n\t\t\tif ( in_array( $response['response']['code'], array( 302, 303 ) ) )\n\t\t\t\t$args['method'] = 'GET';\n\t\t}\n\n\t\t// Include valid cookies in the redirect process.\n\t\tif ( ! empty( $response['cookies'] ) ) {\n\t\t\tforeach ( $response['cookies'] as $cookie ) {\n\t\t\t\tif ( $cookie->test( $redirect_location ) )\n\t\t\t\t\t$args['cookies'][] = $cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn wp_remote_request( $redirect_location, $args );\n\t}\n\n\t/**\n\t * Determines if a specified string represents an IP address or not.\n\t *\n\t * This function also detects the type of the IP address, returning either\n\t * '4' or '6' to represent a IPv4 and IPv6 address respectively.\n\t * This does not verify if the IP is a valid IP, only that it appears to be\n\t * an IP address.\n\t *\n\t * @see http://home.deds.nl/~aeron/regex/ for IPv6 regex\n\t *\n\t * @since 3.7.0\n\t * @static\n\t *\n\t * @param string $maybe_ip A suspected IP address\n\t * @return integer|bool Upon success, '4' or '6' to represent a IPv4 or IPv6 address, false upon failure\n\t */\n\tpublic static function is_ip_address( $maybe_ip ) {\n\t\tif ( preg_match( '/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/', $maybe_ip ) )\n\t\t\treturn 4;\n\n\t\tif ( false !== strpos( $maybe_ip, ':' ) && preg_match( '/^(((?=.*(::))(?!.*\\3.+\\3))\\3?|([\\dA-F]{1,4}(\\3|:\\b|$)|\\2))(?4){5}((?4){2}|(((2[0-4]|1\\d|[1-9])?\\d|25[0-5])\\.?\\b){4})$/i', trim( $maybe_ip, ' []' ) ) )\n\t\t\treturn 6;\n\n\t\treturn false;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-json.php",
    "content": "<?php\nif ( ! class_exists( 'Services_JSON' ) ) :\n/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */\n/**\n * Converts to and from JSON format.\n *\n * JSON (JavaScript Object Notation) is a lightweight data-interchange\n * format. It is easy for humans to read and write. It is easy for machines\n * to parse and generate. It is based on a subset of the JavaScript\n * Programming Language, Standard ECMA-262 3rd Edition - December 1999.\n * This feature can also be found in  Python. JSON is a text format that is\n * completely language independent but uses conventions that are familiar\n * to programmers of the C-family of languages, including C, C++, C#, Java,\n * JavaScript, Perl, TCL, and many others. These properties make JSON an\n * ideal data-interchange language.\n *\n * This package provides a simple encoder and decoder for JSON notation. It\n * is intended for use with client-side Javascript applications that make\n * use of HTTPRequest to perform server communication functions - data can\n * be encoded into JSON notation for use in a client-side javascript, or\n * decoded from incoming Javascript requests. JSON format is native to\n * Javascript, and can be directly eval()'ed with no further parsing\n * overhead\n *\n * All strings should be in ASCII or UTF-8 format!\n *\n * LICENSE: Redistribution and use in source and binary forms, with or\n * without modification, are permitted provided that the following\n * conditions are met: Redistributions of source code must retain the\n * above copyright notice, this list of conditions and the following\n * disclaimer. Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN\n * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n * DAMAGE.\n *\n * @category\n * @package     Services_JSON\n * @author      Michal Migurski <mike-json@teczno.com>\n * @author      Matt Knapp <mdknapp[at]gmail[dot]com>\n * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>\n * @copyright   2005 Michal Migurski\n * @version     CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $\n * @license     http://www.opensource.org/licenses/bsd-license.php\n * @link        http://pear.php.net/pepr/pepr-proposal-show.php?id=198\n */\n\n/**\n * Marker constant for Services_JSON::decode(), used to flag stack state\n */\ndefine('SERVICES_JSON_SLICE',   1);\n\n/**\n * Marker constant for Services_JSON::decode(), used to flag stack state\n */\ndefine('SERVICES_JSON_IN_STR',  2);\n\n/**\n * Marker constant for Services_JSON::decode(), used to flag stack state\n */\ndefine('SERVICES_JSON_IN_ARR',  3);\n\n/**\n * Marker constant for Services_JSON::decode(), used to flag stack state\n */\ndefine('SERVICES_JSON_IN_OBJ',  4);\n\n/**\n * Marker constant for Services_JSON::decode(), used to flag stack state\n */\ndefine('SERVICES_JSON_IN_CMT', 5);\n\n/**\n * Behavior switch for Services_JSON::decode()\n */\ndefine('SERVICES_JSON_LOOSE_TYPE', 16);\n\n/**\n * Behavior switch for Services_JSON::decode()\n */\ndefine('SERVICES_JSON_SUPPRESS_ERRORS', 32);\n\n/**\n * Behavior switch for Services_JSON::decode()\n */\ndefine('SERVICES_JSON_USE_TO_JSON', 64);\n\n/**\n * Converts to and from JSON format.\n *\n * Brief example of use:\n *\n * <code>\n * // create a new instance of Services_JSON\n * $json = new Services_JSON();\n *\n * // convert a complexe value to JSON notation, and send it to the browser\n * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));\n * $output = $json->encode($value);\n *\n * print($output);\n * // prints: [\"foo\",\"bar\",[1,2,\"baz\"],[3,[4]]]\n *\n * // accept incoming POST data, assumed to be in JSON notation\n * $input = file_get_contents('php://input', 1000000);\n * $value = $json->decode($input);\n * </code>\n */\nclass Services_JSON\n{\n   /**\n    * constructs a new JSON instance\n    *\n    * @param    int     $use    object behavior flags; combine with boolean-OR\n    *\n    *                           possible values:\n    *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing.\n    *                                   \"{...}\" syntax creates associative arrays\n    *                                   instead of objects in decode().\n    *                           - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.\n    *                                   Values which can't be encoded (e.g. resources)\n    *                                   appear as NULL instead of throwing errors.\n    *                                   By default, a deeply-nested resource will\n    *                                   bubble up with an error, so all return values\n    *                                   from encode() should be checked with isError()\n    *                           - SERVICES_JSON_USE_TO_JSON:  call toJSON when serializing objects\n    *                                   It serializes the return value from the toJSON call rather \n    *                                   than the object itself, toJSON can return associative arrays, \n    *                                   strings or numbers, if you return an object, make sure it does\n    *                                   not have a toJSON method, otherwise an error will occur.\n    */\n    function __construct( $use = 0 )\n    {\n        $this->use = $use;\n        $this->_mb_strlen            = function_exists('mb_strlen');\n        $this->_mb_convert_encoding  = function_exists('mb_convert_encoding');\n        $this->_mb_substr            = function_exists('mb_substr');\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Services_JSON( $use = 0 ) {\n\t\tself::__construct( $use );\n\t}\n    // private - cache the mbstring lookup results..\n    var $_mb_strlen = false;\n    var $_mb_substr = false;\n    var $_mb_convert_encoding = false;\n    \n   /**\n    * convert a string from one UTF-16 char to one UTF-8 char\n    *\n    * Normally should be handled by mb_convert_encoding, but\n    * provides a slower PHP-only method for installations\n    * that lack the multibye string extension.\n    *\n    * @param    string  $utf16  UTF-16 character\n    * @return   string  UTF-8 character\n    * @access   private\n    */\n    function utf162utf8($utf16)\n    {\n        // oh please oh please oh please oh please oh please\n        if($this->_mb_convert_encoding) {\n            return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');\n        }\n\n        $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});\n\n        switch(true) {\n            case ((0x7F & $bytes) == $bytes):\n                // this case should never be reached, because we are in ASCII range\n                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                return chr(0x7F & $bytes);\n\n            case (0x07FF & $bytes) == $bytes:\n                // return a 2-byte UTF-8 character\n                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                return chr(0xC0 | (($bytes >> 6) & 0x1F))\n                     . chr(0x80 | ($bytes & 0x3F));\n\n            case (0xFFFF & $bytes) == $bytes:\n                // return a 3-byte UTF-8 character\n                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                return chr(0xE0 | (($bytes >> 12) & 0x0F))\n                     . chr(0x80 | (($bytes >> 6) & 0x3F))\n                     . chr(0x80 | ($bytes & 0x3F));\n        }\n\n        // ignoring UTF-32 for now, sorry\n        return '';\n    }\n\n   /**\n    * convert a string from one UTF-8 char to one UTF-16 char\n    *\n    * Normally should be handled by mb_convert_encoding, but\n    * provides a slower PHP-only method for installations\n    * that lack the multibye string extension.\n    *\n    * @param    string  $utf8   UTF-8 character\n    * @return   string  UTF-16 character\n    * @access   private\n    */\n    function utf82utf16($utf8)\n    {\n        // oh please oh please oh please oh please oh please\n        if($this->_mb_convert_encoding) {\n            return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');\n        }\n\n        switch($this->strlen8($utf8)) {\n            case 1:\n                // this case should never be reached, because we are in ASCII range\n                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                return $utf8;\n\n            case 2:\n                // return a UTF-16 character from a 2-byte UTF-8 char\n                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                return chr(0x07 & (ord($utf8{0}) >> 2))\n                     . chr((0xC0 & (ord($utf8{0}) << 6))\n                         | (0x3F & ord($utf8{1})));\n\n            case 3:\n                // return a UTF-16 character from a 3-byte UTF-8 char\n                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                return chr((0xF0 & (ord($utf8{0}) << 4))\n                         | (0x0F & (ord($utf8{1}) >> 2)))\n                     . chr((0xC0 & (ord($utf8{1}) << 6))\n                         | (0x7F & ord($utf8{2})));\n        }\n\n        // ignoring UTF-32 for now, sorry\n        return '';\n    }\n\n   /**\n    * encodes an arbitrary variable into JSON format (and sends JSON Header)\n    *\n    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.\n    *                           see argument 1 to Services_JSON() above for array-parsing behavior.\n    *                           if var is a strng, note that encode() always expects it\n    *                           to be in ASCII or UTF-8 format!\n    *\n    * @return   mixed   JSON string representation of input var or an error if a problem occurs\n    * @access   public\n    */\n    function encode($var)\n    {\n        header('Content-type: application/json');\n        return $this->encodeUnsafe($var);\n    }\n    /**\n    * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!)\n    *\n    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.\n    *                           see argument 1 to Services_JSON() above for array-parsing behavior.\n    *                           if var is a strng, note that encode() always expects it\n    *                           to be in ASCII or UTF-8 format!\n    *\n    * @return   mixed   JSON string representation of input var or an error if a problem occurs\n    * @access   public\n    */\n    function encodeUnsafe($var)\n    {\n        // see bug #16908 - regarding numeric locale printing\n        $lc = setlocale(LC_NUMERIC, 0);\n        setlocale(LC_NUMERIC, 'C');\n        $ret = $this->_encode($var);\n        setlocale(LC_NUMERIC, $lc);\n        return $ret;\n        \n    }\n    /**\n    * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format \n    *\n    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.\n    *                           see argument 1 to Services_JSON() above for array-parsing behavior.\n    *                           if var is a strng, note that encode() always expects it\n    *                           to be in ASCII or UTF-8 format!\n    *\n    * @return   mixed   JSON string representation of input var or an error if a problem occurs\n    * @access   public\n    */\n    function _encode($var) \n    {\n         \n        switch (gettype($var)) {\n            case 'boolean':\n                return $var ? 'true' : 'false';\n\n            case 'NULL':\n                return 'null';\n\n            case 'integer':\n                return (int) $var;\n\n            case 'double':\n            case 'float':\n                return  (float) $var;\n\n            case 'string':\n                // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT\n                $ascii = '';\n                $strlen_var = $this->strlen8($var);\n\n               /*\n                * Iterate over every character in the string,\n                * escaping with a slash or encoding to UTF-8 where necessary\n                */\n                for ($c = 0; $c < $strlen_var; ++$c) {\n\n                    $ord_var_c = ord($var{$c});\n\n                    switch (true) {\n                        case $ord_var_c == 0x08:\n                            $ascii .= '\\b';\n                            break;\n                        case $ord_var_c == 0x09:\n                            $ascii .= '\\t';\n                            break;\n                        case $ord_var_c == 0x0A:\n                            $ascii .= '\\n';\n                            break;\n                        case $ord_var_c == 0x0C:\n                            $ascii .= '\\f';\n                            break;\n                        case $ord_var_c == 0x0D:\n                            $ascii .= '\\r';\n                            break;\n\n                        case $ord_var_c == 0x22:\n                        case $ord_var_c == 0x2F:\n                        case $ord_var_c == 0x5C:\n                            // double quote, slash, slosh\n                            $ascii .= '\\\\'.$var{$c};\n                            break;\n\n                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):\n                            // characters U-00000000 - U-0000007F (same as ASCII)\n                            $ascii .= $var{$c};\n                            break;\n\n                        case (($ord_var_c & 0xE0) == 0xC0):\n                            // characters U-00000080 - U-000007FF, mask 110XXXXX\n                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                            if ($c+1 >= $strlen_var) {\n                                $c += 1;\n                                $ascii .= '?';\n                                break;\n                            }\n                            \n                            $char = pack('C*', $ord_var_c, ord($var{$c + 1}));\n                            $c += 1;\n                            $utf16 = $this->utf82utf16($char);\n                            $ascii .= sprintf('\\u%04s', bin2hex($utf16));\n                            break;\n\n                        case (($ord_var_c & 0xF0) == 0xE0):\n                            if ($c+2 >= $strlen_var) {\n                                $c += 2;\n                                $ascii .= '?';\n                                break;\n                            }\n                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX\n                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                            $char = pack('C*', $ord_var_c,\n                                         @ord($var{$c + 1}),\n                                         @ord($var{$c + 2}));\n                            $c += 2;\n                            $utf16 = $this->utf82utf16($char);\n                            $ascii .= sprintf('\\u%04s', bin2hex($utf16));\n                            break;\n\n                        case (($ord_var_c & 0xF8) == 0xF0):\n                            if ($c+3 >= $strlen_var) {\n                                $c += 3;\n                                $ascii .= '?';\n                                break;\n                            }\n                            // characters U-00010000 - U-001FFFFF, mask 11110XXX\n                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                            $char = pack('C*', $ord_var_c,\n                                         ord($var{$c + 1}),\n                                         ord($var{$c + 2}),\n                                         ord($var{$c + 3}));\n                            $c += 3;\n                            $utf16 = $this->utf82utf16($char);\n                            $ascii .= sprintf('\\u%04s', bin2hex($utf16));\n                            break;\n\n                        case (($ord_var_c & 0xFC) == 0xF8):\n                            // characters U-00200000 - U-03FFFFFF, mask 111110XX\n                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                            if ($c+4 >= $strlen_var) {\n                                $c += 4;\n                                $ascii .= '?';\n                                break;\n                            }\n                            $char = pack('C*', $ord_var_c,\n                                         ord($var{$c + 1}),\n                                         ord($var{$c + 2}),\n                                         ord($var{$c + 3}),\n                                         ord($var{$c + 4}));\n                            $c += 4;\n                            $utf16 = $this->utf82utf16($char);\n                            $ascii .= sprintf('\\u%04s', bin2hex($utf16));\n                            break;\n\n                        case (($ord_var_c & 0xFE) == 0xFC):\n                        if ($c+5 >= $strlen_var) {\n                                $c += 5;\n                                $ascii .= '?';\n                                break;\n                            }\n                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X\n                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                            $char = pack('C*', $ord_var_c,\n                                         ord($var{$c + 1}),\n                                         ord($var{$c + 2}),\n                                         ord($var{$c + 3}),\n                                         ord($var{$c + 4}),\n                                         ord($var{$c + 5}));\n                            $c += 5;\n                            $utf16 = $this->utf82utf16($char);\n                            $ascii .= sprintf('\\u%04s', bin2hex($utf16));\n                            break;\n                    }\n                }\n                return  '\"'.$ascii.'\"';\n\n            case 'array':\n               /*\n                * As per JSON spec if any array key is not an integer\n                * we must treat the the whole array as an object. We\n                * also try to catch a sparsely populated associative\n                * array with numeric keys here because some JS engines\n                * will create an array with empty indexes up to\n                * max_index which can cause memory issues and because\n                * the keys, which may be relevant, will be remapped\n                * otherwise.\n                *\n                * As per the ECMA and JSON specification an object may\n                * have any string as a property. Unfortunately due to\n                * a hole in the ECMA specification if the key is a\n                * ECMA reserved word or starts with a digit the\n                * parameter is only accessible using ECMAScript's\n                * bracket notation.\n                */\n\n                // treat as a JSON object\n                if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {\n                    $properties = array_map(array($this, 'name_value'),\n                                            array_keys($var),\n                                            array_values($var));\n\n                    foreach($properties as $property) {\n                        if(Services_JSON::isError($property)) {\n                            return $property;\n                        }\n                    }\n\n                    return '{' . join(',', $properties) . '}';\n                }\n\n                // treat it like a regular array\n                $elements = array_map(array($this, '_encode'), $var);\n\n                foreach($elements as $element) {\n                    if(Services_JSON::isError($element)) {\n                        return $element;\n                    }\n                }\n\n                return '[' . join(',', $elements) . ']';\n\n            case 'object':\n            \n                // support toJSON methods.\n                if (($this->use & SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) {\n                    // this may end up allowing unlimited recursion\n                    // so we check the return value to make sure it's not got the same method.\n                    $recode = $var->toJSON();\n                    \n                    if (method_exists($recode, 'toJSON')) {\n                        \n                        return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)\n                        ? 'null'\n                        : new Services_JSON_Error(get_class($var).\n                            \" toJSON returned an object with a toJSON method.\");\n                            \n                    }\n                    \n                    return $this->_encode( $recode );\n                } \n                \n                $vars = get_object_vars($var);\n                \n                $properties = array_map(array($this, 'name_value'),\n                                        array_keys($vars),\n                                        array_values($vars));\n\n                foreach($properties as $property) {\n                    if(Services_JSON::isError($property)) {\n                        return $property;\n                    }\n                }\n\n                return '{' . join(',', $properties) . '}';\n\n            default:\n                return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)\n                    ? 'null'\n                    : new Services_JSON_Error(gettype($var).\" can not be encoded as JSON string\");\n        }\n    }\n\n   /**\n    * array-walking function for use in generating JSON-formatted name-value pairs\n    *\n    * @param    string  $name   name of key to use\n    * @param    mixed   $value  reference to an array element to be encoded\n    *\n    * @return   string  JSON-formatted name-value pair, like '\"name\":value'\n    * @access   private\n    */\n    function name_value($name, $value)\n    {\n        $encoded_value = $this->_encode($value);\n\n        if(Services_JSON::isError($encoded_value)) {\n            return $encoded_value;\n        }\n\n        return $this->_encode(strval($name)) . ':' . $encoded_value;\n    }\n\n   /**\n    * reduce a string by removing leading and trailing comments and whitespace\n    *\n    * @param    $str    string      string value to strip of comments and whitespace\n    *\n    * @return   string  string value stripped of comments and whitespace\n    * @access   private\n    */\n    function reduce_string($str)\n    {\n        $str = preg_replace(array(\n\n                // eliminate single line comments in '// ...' form\n                '#^\\s*//(.+)$#m',\n\n                // eliminate multi-line comments in '/* ... */' form, at start of string\n                '#^\\s*/\\*(.+)\\*/#Us',\n\n                // eliminate multi-line comments in '/* ... */' form, at end of string\n                '#/\\*(.+)\\*/\\s*$#Us'\n\n            ), '', $str);\n\n        // eliminate extraneous space\n        return trim($str);\n    }\n\n   /**\n    * decodes a JSON string into appropriate variable\n    *\n    * @param    string  $str    JSON-formatted string\n    *\n    * @return   mixed   number, boolean, string, array, or object\n    *                   corresponding to given JSON input string.\n    *                   See argument 1 to Services_JSON() above for object-output behavior.\n    *                   Note that decode() always returns strings\n    *                   in ASCII or UTF-8 format!\n    * @access   public\n    */\n    function decode($str)\n    {\n        $str = $this->reduce_string($str);\n\n        switch (strtolower($str)) {\n            case 'true':\n                return true;\n\n            case 'false':\n                return false;\n\n            case 'null':\n                return null;\n\n            default:\n                $m = array();\n\n                if (is_numeric($str)) {\n                    // Lookie-loo, it's a number\n\n                    // This would work on its own, but I'm trying to be\n                    // good about returning integers where appropriate:\n                    // return (float)$str;\n\n                    // Return float or int, as appropriate\n                    return ((float)$str == (integer)$str)\n                        ? (integer)$str\n                        : (float)$str;\n\n                } elseif (preg_match('/^(\"|\\').*(\\1)$/s', $str, $m) && $m[1] == $m[2]) {\n                    // STRINGS RETURNED IN UTF-8 FORMAT\n                    $delim = $this->substr8($str, 0, 1);\n                    $chrs = $this->substr8($str, 1, -1);\n                    $utf8 = '';\n                    $strlen_chrs = $this->strlen8($chrs);\n\n                    for ($c = 0; $c < $strlen_chrs; ++$c) {\n\n                        $substr_chrs_c_2 = $this->substr8($chrs, $c, 2);\n                        $ord_chrs_c = ord($chrs{$c});\n\n                        switch (true) {\n                            case $substr_chrs_c_2 == '\\b':\n                                $utf8 .= chr(0x08);\n                                ++$c;\n                                break;\n                            case $substr_chrs_c_2 == '\\t':\n                                $utf8 .= chr(0x09);\n                                ++$c;\n                                break;\n                            case $substr_chrs_c_2 == '\\n':\n                                $utf8 .= chr(0x0A);\n                                ++$c;\n                                break;\n                            case $substr_chrs_c_2 == '\\f':\n                                $utf8 .= chr(0x0C);\n                                ++$c;\n                                break;\n                            case $substr_chrs_c_2 == '\\r':\n                                $utf8 .= chr(0x0D);\n                                ++$c;\n                                break;\n\n                            case $substr_chrs_c_2 == '\\\\\"':\n                            case $substr_chrs_c_2 == '\\\\\\'':\n                            case $substr_chrs_c_2 == '\\\\\\\\':\n                            case $substr_chrs_c_2 == '\\\\/':\n                                if (($delim == '\"' && $substr_chrs_c_2 != '\\\\\\'') ||\n                                   ($delim == \"'\" && $substr_chrs_c_2 != '\\\\\"')) {\n                                    $utf8 .= $chrs{++$c};\n                                }\n                                break;\n\n                            case preg_match('/\\\\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)):\n                                // single, escaped unicode character\n                                $utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2)))\n                                       . chr(hexdec($this->substr8($chrs, ($c + 4), 2)));\n                                $utf8 .= $this->utf162utf8($utf16);\n                                $c += 5;\n                                break;\n\n                            case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):\n                                $utf8 .= $chrs{$c};\n                                break;\n\n                            case ($ord_chrs_c & 0xE0) == 0xC0:\n                                // characters U-00000080 - U-000007FF, mask 110XXXXX\n                                //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                                $utf8 .= $this->substr8($chrs, $c, 2);\n                                ++$c;\n                                break;\n\n                            case ($ord_chrs_c & 0xF0) == 0xE0:\n                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX\n                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                                $utf8 .= $this->substr8($chrs, $c, 3);\n                                $c += 2;\n                                break;\n\n                            case ($ord_chrs_c & 0xF8) == 0xF0:\n                                // characters U-00010000 - U-001FFFFF, mask 11110XXX\n                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                                $utf8 .= $this->substr8($chrs, $c, 4);\n                                $c += 3;\n                                break;\n\n                            case ($ord_chrs_c & 0xFC) == 0xF8:\n                                // characters U-00200000 - U-03FFFFFF, mask 111110XX\n                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                                $utf8 .= $this->substr8($chrs, $c, 5);\n                                $c += 4;\n                                break;\n\n                            case ($ord_chrs_c & 0xFE) == 0xFC:\n                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X\n                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8\n                                $utf8 .= $this->substr8($chrs, $c, 6);\n                                $c += 5;\n                                break;\n\n                        }\n\n                    }\n\n                    return $utf8;\n\n                } elseif (preg_match('/^\\[.*\\]$/s', $str) || preg_match('/^\\{.*\\}$/s', $str)) {\n                    // array, or object notation\n\n                    if ($str{0} == '[') {\n                        $stk = array(SERVICES_JSON_IN_ARR);\n                        $arr = array();\n                    } else {\n                        if ($this->use & SERVICES_JSON_LOOSE_TYPE) {\n                            $stk = array(SERVICES_JSON_IN_OBJ);\n                            $obj = array();\n                        } else {\n                            $stk = array(SERVICES_JSON_IN_OBJ);\n                            $obj = new stdClass();\n                        }\n                    }\n\n                    array_push($stk, array('what'  => SERVICES_JSON_SLICE,\n                                           'where' => 0,\n                                           'delim' => false));\n\n                    $chrs = $this->substr8($str, 1, -1);\n                    $chrs = $this->reduce_string($chrs);\n\n                    if ($chrs == '') {\n                        if (reset($stk) == SERVICES_JSON_IN_ARR) {\n                            return $arr;\n\n                        } else {\n                            return $obj;\n\n                        }\n                    }\n\n                    //print(\"\\nparsing {$chrs}\\n\");\n\n                    $strlen_chrs = $this->strlen8($chrs);\n\n                    for ($c = 0; $c <= $strlen_chrs; ++$c) {\n\n                        $top = end($stk);\n                        $substr_chrs_c_2 = $this->substr8($chrs, $c, 2);\n\n                        if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {\n                            // found a comma that is not inside a string, array, etc.,\n                            // OR we've reached the end of the character list\n                            $slice = $this->substr8($chrs, $top['where'], ($c - $top['where']));\n                            array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));\n                            //print(\"Found split at {$c}: \".$this->substr8($chrs, $top['where'], (1 + $c - $top['where'])).\"\\n\");\n\n                            if (reset($stk) == SERVICES_JSON_IN_ARR) {\n                                // we are in an array, so just push an element onto the stack\n                                array_push($arr, $this->decode($slice));\n\n                            } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {\n                                // we are in an object, so figure\n                                // out the property name and set an\n                                // element in an associative array,\n                                // for now\n                                $parts = array();\n                                \n                               if (preg_match('/^\\s*([\"\\'].*[^\\\\\\][\"\\'])\\s*:/Uis', $slice, $parts)) {\n \t                              // \"name\":value pair\n                                    $key = $this->decode($parts[1]);\n                                    $val = $this->decode(trim(substr($slice, strlen($parts[0])), \", \\t\\n\\r\\0\\x0B\"));\n                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {\n                                        $obj[$key] = $val;\n                                    } else {\n                                        $obj->$key = $val;\n                                    }\n                                } elseif (preg_match('/^\\s*(\\w+)\\s*:/Uis', $slice, $parts)) {\n                                    // name:value pair, where name is unquoted\n                                    $key = $parts[1];\n                                    $val = $this->decode(trim(substr($slice, strlen($parts[0])), \", \\t\\n\\r\\0\\x0B\"));\n\n                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {\n                                        $obj[$key] = $val;\n                                    } else {\n                                        $obj->$key = $val;\n                                    }\n                                }\n\n                            }\n\n                        } elseif ((($chrs{$c} == '\"') || ($chrs{$c} == \"'\")) && ($top['what'] != SERVICES_JSON_IN_STR)) {\n                            // found a quote, and we are not inside a string\n                            array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));\n                            //print(\"Found start of string at {$c}\\n\");\n\n                        } elseif (($chrs{$c} == $top['delim']) &&\n                                 ($top['what'] == SERVICES_JSON_IN_STR) &&\n                                 (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\\\'))) % 2 != 1)) {\n                            // found a quote, we're in a string, and it's not escaped\n                            // we know that it's not escaped becase there is _not_ an\n                            // odd number of backslashes at the end of the string so far\n                            array_pop($stk);\n                            //print(\"Found end of string at {$c}: \".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where'])).\"\\n\");\n\n                        } elseif (($chrs{$c} == '[') &&\n                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {\n                            // found a left-bracket, and we are in an array, object, or slice\n                            array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));\n                            //print(\"Found start of array at {$c}\\n\");\n\n                        } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {\n                            // found a right-bracket, and we're in an array\n                            array_pop($stk);\n                            //print(\"Found end of array at {$c}: \".$this->substr8($chrs, $top['where'], (1 + $c - $top['where'])).\"\\n\");\n\n                        } elseif (($chrs{$c} == '{') &&\n                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {\n                            // found a left-brace, and we are in an array, object, or slice\n                            array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));\n                            //print(\"Found start of object at {$c}\\n\");\n\n                        } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {\n                            // found a right-brace, and we're in an object\n                            array_pop($stk);\n                            //print(\"Found end of object at {$c}: \".$this->substr8($chrs, $top['where'], (1 + $c - $top['where'])).\"\\n\");\n\n                        } elseif (($substr_chrs_c_2 == '/*') &&\n                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {\n                            // found a comment start, and we are in an array, object, or slice\n                            array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));\n                            $c++;\n                            //print(\"Found start of comment at {$c}\\n\");\n\n                        } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {\n                            // found a comment end, and we're in one now\n                            array_pop($stk);\n                            $c++;\n\n                            for ($i = $top['where']; $i <= $c; ++$i)\n                                $chrs = substr_replace($chrs, ' ', $i, 1);\n\n                            //print(\"Found end of comment at {$c}: \".$this->substr8($chrs, $top['where'], (1 + $c - $top['where'])).\"\\n\");\n\n                        }\n\n                    }\n\n                    if (reset($stk) == SERVICES_JSON_IN_ARR) {\n                        return $arr;\n\n                    } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {\n                        return $obj;\n\n                    }\n\n                }\n        }\n    }\n\n    /**\n     * @todo Ultimately, this should just call PEAR::isError()\n     */\n    function isError($data, $code = null)\n    {\n        if (class_exists('pear')) {\n            return PEAR::isError($data, $code);\n        } elseif (is_object($data) && (get_class($data) == 'services_json_error' ||\n                                 is_subclass_of($data, 'services_json_error'))) {\n            return true;\n        }\n\n        return false;\n    }\n    \n    /**\n    * Calculates length of string in bytes\n    * @param string \n    * @return integer length\n    */\n    function strlen8( $str ) \n    {\n        if ( $this->_mb_strlen ) {\n            return mb_strlen( $str, \"8bit\" );\n        }\n        return strlen( $str );\n    }\n    \n    /**\n    * Returns part of a string, interpreting $start and $length as number of bytes.\n    * @param string \n    * @param integer start \n    * @param integer length \n    * @return integer length\n    */\n    function substr8( $string, $start, $length=false ) \n    {\n        if ( $length === false ) {\n            $length = $this->strlen8( $string ) - $start;\n        }\n        if ( $this->_mb_substr ) {\n            return mb_substr( $string, $start, $length, \"8bit\" );\n        }\n        return substr( $string, $start, $length );\n    }\n\n}\n\nif (class_exists('PEAR_Error')) {\n\n    class Services_JSON_Error extends PEAR_Error\n    {\n        function __construct($message = 'unknown error', $code = null,\n                                     $mode = null, $options = null, $userinfo = null)\n        {\n            parent::PEAR_Error($message, $code, $mode, $options, $userinfo);\n        }\n\n\tpublic function Services_JSON_Error($message = 'unknown error', $code = null,\n                                     $mode = null, $options = null, $userinfo = null) {\n\t\tself::__construct($message = 'unknown error', $code = null,\n                                     $mode = null, $options = null, $userinfo = null);\n\t}\n    }\n\n} else {\n\n    /**\n     * @todo Ultimately, this class shall be descended from PEAR_Error\n     */\n    class Services_JSON_Error\n    {\n\t    /**\n\t     * PHP5 constructor.\n\t     */\n        function __construct( $message = 'unknown error', $code = null,\n                                     $mode = null, $options = null, $userinfo = null )\n        {\n\n        }\n\n\t    /**\n\t     * PHP4 constructor.\n\t     */\n\t\tpublic function Services_JSON_Error( $message = 'unknown error', $code = null,\n\t                                     $mode = null, $options = null, $userinfo = null ) {\n\t\t\tself::__construct( $message, $code, $mode, $options, $userinfo );\n\t\t}\n    }\n    \n}\n\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-oembed.php",
    "content": "<?php\n/**\n * API for fetching the HTML to embed remote content based on a provided URL.\n * Used internally by the {@link WP_Embed} class, but is designed to be generic.\n *\n * @link https://codex.wordpress.org/oEmbed oEmbed Codex Article\n * @link http://oembed.com/ oEmbed Homepage\n *\n * @package WordPress\n * @subpackage oEmbed\n */\n\n/**\n * oEmbed class.\n *\n * @package WordPress\n * @subpackage oEmbed\n * @since 2.9.0\n */\nclass WP_oEmbed {\n\tpublic $providers = array();\n\t/**\n\t * @static\n\t * @var array\n\t */\n\tpublic static $early_providers = array();\n\n\tprivate $compat_methods = array( '_fetch_with_format', '_parse_json', '_parse_xml', '_parse_body' );\n\n\t/**\n\t * Constructor\n\t *\n\t * @since 2.9.0\n\t */\n\tpublic function __construct() {\n\t\t$host = urlencode( home_url() );\n\t\t$providers = array(\n\t\t\t'#http://((m|www)\\.)?youtube\\.com/watch.*#i'          => array( 'http://www.youtube.com/oembed',                             true  ),\n\t\t\t'#https://((m|www)\\.)?youtube\\.com/watch.*#i'         => array( 'http://www.youtube.com/oembed?scheme=https',                true  ),\n\t\t\t'#http://((m|www)\\.)?youtube\\.com/playlist.*#i'       => array( 'http://www.youtube.com/oembed',                             true  ),\n\t\t\t'#https://((m|www)\\.)?youtube\\.com/playlist.*#i'      => array( 'http://www.youtube.com/oembed?scheme=https',                true  ),\n\t\t\t'#http://youtu\\.be/.*#i'                              => array( 'http://www.youtube.com/oembed',                             true  ),\n\t\t\t'#https://youtu\\.be/.*#i'                             => array( 'http://www.youtube.com/oembed?scheme=https',                true  ),\n\t\t\t'#https?://(.+\\.)?vimeo\\.com/.*#i'                    => array( 'http://vimeo.com/api/oembed.{format}',                      true  ),\n\t\t\t'#https?://(www\\.)?dailymotion\\.com/.*#i'             => array( 'https://www.dailymotion.com/services/oembed',               true  ),\n\t\t\t'http://dai.ly/*'                                     => array( 'https://www.dailymotion.com/services/oembed',               false ),\n\t\t\t'#https?://(www\\.)?flickr\\.com/.*#i'                  => array( 'https://www.flickr.com/services/oembed/',                   true  ),\n\t\t\t'#https?://flic\\.kr/.*#i'                             => array( 'https://www.flickr.com/services/oembed/',                   true  ),\n\t\t\t'#https?://(.+\\.)?smugmug\\.com/.*#i'                  => array( 'http://api.smugmug.com/services/oembed/',                   true  ),\n\t\t\t'#https?://(www\\.)?hulu\\.com/watch/.*#i'              => array( 'http://www.hulu.com/api/oembed.{format}',                   true  ),\n\t\t\t'http://i*.photobucket.com/albums/*'                  => array( 'http://api.photobucket.com/oembed',                         false ),\n\t\t\t'http://gi*.photobucket.com/groups/*'                 => array( 'http://api.photobucket.com/oembed',                         false ),\n\t\t\t'#https?://(www\\.)?scribd\\.com/doc/.*#i'              => array( 'http://www.scribd.com/services/oembed',                     true  ),\n\t\t\t'#https?://wordpress.tv/.*#i'                         => array( 'http://wordpress.tv/oembed/',                               true  ),\n\t\t\t'#https?://(.+\\.)?polldaddy\\.com/.*#i'                => array( 'https://polldaddy.com/oembed/',                             true  ),\n\t\t\t'#https?://poll\\.fm/.*#i'                             => array( 'https://polldaddy.com/oembed/',                             true  ),\n\t\t\t'#https?://(www\\.)?funnyordie\\.com/videos/.*#i'       => array( 'http://www.funnyordie.com/oembed',                          true  ),\n\t\t\t'#https?://(www\\.)?twitter\\.com/.+?/status(es)?/.*#i' => array( 'https://api.twitter.com/1/statuses/oembed.{format}',        true  ),\n\t\t\t'#https?://vine.co/v/.*#i'                            => array( 'https://vine.co/oembed.{format}',                           true  ),\n\t\t\t'#https?://(www\\.)?soundcloud\\.com/.*#i'              => array( 'http://soundcloud.com/oembed',                              true  ),\n\t\t\t'#https?://(.+?\\.)?slideshare\\.net/.*#i'              => array( 'https://www.slideshare.net/api/oembed/2',                   true  ),\n\t\t\t'#https?://(www\\.)?instagr(\\.am|am\\.com)/p/.*#i'      => array( 'https://api.instagram.com/oembed',                          true  ),\n\t\t\t'#https?://(open|play)\\.spotify\\.com/.*#i'            => array( 'https://embed.spotify.com/oembed/',                         true  ),\n\t\t\t'#https?://(.+\\.)?imgur\\.com/.*#i'                    => array( 'http://api.imgur.com/oembed',                               true  ),\n\t\t\t'#https?://(www\\.)?meetu(\\.ps|p\\.com)/.*#i'           => array( 'http://api.meetup.com/oembed',                              true  ),\n\t\t\t'#https?://(www\\.)?issuu\\.com/.+/docs/.+#i'           => array( 'http://issuu.com/oembed_wp',                                true  ),\n\t\t\t'#https?://(www\\.)?collegehumor\\.com/video/.*#i'      => array( 'http://www.collegehumor.com/oembed.{format}',               true  ),\n\t\t\t'#https?://(www\\.)?mixcloud\\.com/.*#i'                => array( 'http://www.mixcloud.com/oembed',                            true  ),\n\t\t\t'#https?://(www\\.|embed\\.)?ted\\.com/talks/.*#i'       => array( 'http://www.ted.com/talks/oembed.{format}',                  true  ),\n\t\t\t'#https?://(www\\.)?(animoto|video214)\\.com/play/.*#i' => array( 'https://animoto.com/oembeds/create',                        true  ),\n\t\t\t'#https?://(.+)\\.tumblr\\.com/post/.*#i'               => array( 'https://www.tumblr.com/oembed/1.0',                         true  ),\n\t\t\t'#https?://(www\\.)?kickstarter\\.com/projects/.*#i'    => array( 'https://www.kickstarter.com/services/oembed',               true  ),\n\t\t\t'#https?://kck\\.st/.*#i'                              => array( 'https://www.kickstarter.com/services/oembed',               true  ),\n\t\t\t'#https?://cloudup\\.com/.*#i'                         => array( 'https://cloudup.com/oembed',                                true  ),\n\t\t\t'#https?://(www\\.)?reverbnation\\.com/.*#i'            => array( 'https://www.reverbnation.com/oembed',                       true  ),\n\t\t\t'#https?://videopress.com/v/.*#'                      => array( 'https://public-api.wordpress.com/oembed/1.0/?for=' . $host, true  ),\n\t\t\t'#https?://(www\\.)?reddit\\.com/r/[^/]+/comments/.*#i' => array( 'https://www.reddit.com/oembed',                             true  ),\n\t\t\t'#https?://(www\\.)?speakerdeck\\.com/.*#i'             => array( 'https://speakerdeck.com/oembed.{format}',                   true  ),\n\t\t);\n\n\t\tif ( ! empty( self::$early_providers['add'] ) ) {\n\t\t\tforeach ( self::$early_providers['add'] as $format => $data ) {\n\t\t\t\t$providers[ $format ] = $data;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( self::$early_providers['remove'] ) ) {\n\t\t\tforeach ( self::$early_providers['remove'] as $format ) {\n\t\t\t\tunset( $providers[ $format ] );\n\t\t\t}\n\t\t}\n\n\t\tself::$early_providers = array();\n\n\t\t/**\n\t\t * Filter the list of whitelisted oEmbed providers.\n\t\t *\n\t\t * Since WordPress 4.4, oEmbed discovery is enabled for all users and allows embedding of sanitized\n\t\t * iframes. The providers in this list are whitelisted, meaning they are trusted and allowed to\n\t\t * embed any content, such as iframes, videos, JavaScript, and arbitrary HTML.\n\t\t *\n\t\t * Supported providers:\n\t\t *\n\t\t * |   Provider   |        Flavor        | HTTPS |   Since   |\n\t\t * | ------------ | -------------------- | :---: | --------- |\n\t\t * | Dailymotion  | dailymotion.com      |  Yes  | 2.9.0     |\n\t\t * | Flickr       | flickr.com           |  Yes  | 2.9.0     |\n\t\t * | Hulu         | hulu.com             |  Yes  | 2.9.0     |\n\t\t * | Photobucket  | photobucket.com      |  No   | 2.9.0     |\n\t\t * | Scribd       | scribd.com           |  Yes  | 2.9.0     |\n\t\t * | Vimeo        | vimeo.com            |  Yes  | 2.9.0     |\n\t\t * | WordPress.tv | wordpress.tv         |  Yes  | 2.9.0     |\n\t\t * | YouTube      | youtube.com/watch    |  Yes  | 2.9.0     |\n\t\t * | Funny or Die | funnyordie.com       |  Yes  | 3.0.0     |\n\t\t * | Polldaddy    | polldaddy.com        |  Yes  | 3.0.0     |\n\t\t * | SmugMug      | smugmug.com          |  Yes  | 3.0.0     |\n\t\t * | YouTube      | youtu.be             |  Yes  | 3.0.0     |\n\t\t * | Twitter      | twitter.com          |  Yes  | 3.4.0     |\n\t\t * | Instagram    | instagram.com        |  Yes  | 3.5.0     |\n\t\t * | Instagram    | instagr.am           |  Yes  | 3.5.0     |\n\t\t * | Slideshare   | slideshare.net       |  Yes  | 3.5.0     |\n\t\t * | SoundCloud   | soundcloud.com       |  Yes  | 3.5.0     |\n\t\t * | Dailymotion  | dai.ly               |  No   | 3.6.0     |\n\t\t * | Flickr       | flic.kr              |  Yes  | 3.6.0     |\n\t\t * | Spotify      | spotify.com          |  Yes  | 3.6.0     |\n\t\t * | Imgur        | imgur.com            |  Yes  | 3.9.0     |\n\t\t * | Meetup.com   | meetup.com           |  Yes  | 3.9.0     |\n\t\t * | Meetup.com   | meetu.ps             |  Yes  | 3.9.0     |\n\t\t * | Animoto      | animoto.com          |  Yes  | 4.0.0     |\n\t\t * | Animoto      | video214.com         |  Yes  | 4.0.0     |\n\t\t * | CollegeHumor | collegehumor.com     |  Yes  | 4.0.0     |\n\t\t * | Issuu        | issuu.com            |  Yes  | 4.0.0     |\n\t\t * | Mixcloud     | mixcloud.com         |  Yes  | 4.0.0     |\n\t\t * | Polldaddy    | poll.fm              |  Yes  | 4.0.0     |\n\t\t * | TED          | ted.com              |  Yes  | 4.0.0     |\n\t\t * | YouTube      | youtube.com/playlist |  Yes  | 4.0.0     |\n\t\t * | Vine         | vine.co              |  Yes  | 4.1.0     |\n\t\t * | Tumblr       | tumblr.com           |  Yes  | 4.2.0     |\n\t\t * | Kickstarter  | kickstarter.com      |  Yes  | 4.2.0     |\n\t\t * | Kickstarter  | kck.st               |  Yes  | 4.2.0     |\n\t\t * | Cloudup      | cloudup.com          |  Yes  | 4.4.0     |\n\t\t * | ReverbNation | reverbnation.com     |  Yes  | 4.4.0     |\n\t\t * | VideoPress   | videopress.com       |  Yes  | 4.4.0     |\n\t\t * | Reddit       | reddit.com           |  Yes  | 4.4.0     |\n\t\t * | Speaker Deck | speakerdeck.com      |  Yes  | 4.4.0     |\n\t\t *\n\t\t * No longer supported providers:\n\t\t *\n\t\t * |   Provider   |        Flavor        | HTTPS |   Since   |  Removed  |\n\t\t * | ------------ | -------------------- | :---: | --------- | --------- |\n\t\t * | Qik          | qik.com              |  Yes  | 2.9.0     | 3.9.0     |\n\t\t * | Viddler      | viddler.com          |  Yes  | 2.9.0     | 4.0.0     |\n\t\t * | Revision3    | revision3.com        |  No   | 2.9.0     | 4.2.0     |\n\t\t * | Blip         | blip.tv              |  No   | 2.9.0     | 4.4.0     |\n\t\t * | Rdio         | rdio.com             |  Yes  | 3.6.0     | 4.4.1     |\n\t\t * | Rdio         | rd.io                |  Yes  | 3.6.0     | 4.4.1     |\n\t\t *\n\t\t * @see wp_oembed_add_provider()\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param array $providers An array of popular oEmbed providers.\n\t\t */\n\t\t$this->providers = apply_filters( 'oembed_providers', $providers );\n\n\t\t// Fix any embeds that contain new lines in the middle of the HTML which breaks wpautop().\n\t\tadd_filter( 'oembed_dataparse', array($this, '_strip_newlines'), 10, 3 );\n\t}\n\n\t/**\n\t * Make private/protected methods readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param callable $name      Method to call.\n\t * @param array    $arguments Arguments to pass when calling.\n\t * @return mixed|bool Return value of the callback, false otherwise.\n\t */\n\tpublic function __call( $name, $arguments ) {\n\t\tif ( in_array( $name, $this->compat_methods ) ) {\n\t\t\treturn call_user_func_array( array( $this, $name ), $arguments );\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Takes a URL and returns the corresponding oEmbed provider's URL, if there is one.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @see WP_oEmbed::discover()\n\t *\n\t * @param string        $url  The URL to the content.\n\t * @param string|array  $args Optional provider arguments.\n\t * @return false|string False on failure, otherwise the oEmbed provider URL.\n\t */\n\tpublic function get_provider( $url, $args = '' ) {\n\n\t\t$provider = false;\n\n\t\tif ( !isset($args['discover']) )\n\t\t\t$args['discover'] = true;\n\n\t\tforeach ( $this->providers as $matchmask => $data ) {\n\t\t\tlist( $providerurl, $regex ) = $data;\n\n\t\t\t// Turn the asterisk-type provider URLs into regex\n\t\t\tif ( !$regex ) {\n\t\t\t\t$matchmask = '#' . str_replace( '___wildcard___', '(.+)', preg_quote( str_replace( '*', '___wildcard___', $matchmask ), '#' ) ) . '#i';\n\t\t\t\t$matchmask = preg_replace( '|^#http\\\\\\://|', '#https?\\://', $matchmask );\n\t\t\t}\n\n\t\t\tif ( preg_match( $matchmask, $url ) ) {\n\t\t\t\t$provider = str_replace( '{format}', 'json', $providerurl ); // JSON is easier to deal with than XML\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( !$provider && $args['discover'] )\n\t\t\t$provider = $this->discover( $url );\n\n\t\treturn $provider;\n\t}\n\n\t/**\n\t * Add an oEmbed provider just-in-time when wp_oembed_add_provider() is called\n\t * before the 'plugins_loaded' hook.\n\t *\n\t * The just-in-time addition is for the benefit of the 'oembed_providers' filter.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @static\n\t *\n\t * @see wp_oembed_add_provider()\n\t *\n\t * @param string $format   Format of URL that this provider can handle. You can use\n\t *                         asterisks as wildcards.\n\t * @param string $provider The URL to the oEmbed provider..\n\t * @param bool   $regex    Optional. Whether the $format parameter is in a regex format.\n\t *                         Default false.\n\t */\n\tpublic static function _add_provider_early( $format, $provider, $regex = false ) {\n\t\tif ( empty( self::$early_providers['add'] ) ) {\n\t\t\tself::$early_providers['add'] = array();\n\t\t}\n\n\t\tself::$early_providers['add'][ $format ] = array( $provider, $regex );\n\t}\n\n\t/**\n\t * Remove an oEmbed provider just-in-time when wp_oembed_remove_provider() is called\n\t * before the 'plugins_loaded' hook.\n\t *\n\t * The just-in-time removal is for the benefit of the 'oembed_providers' filter.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @static\n\t *\n\t * @see wp_oembed_remove_provider()\n\t *\n\t * @param string $format The format of URL that this provider can handle. You can use\n\t *                       asterisks as wildcards.\n\t */\n\tpublic static function _remove_provider_early( $format ) {\n\t\tif ( empty( self::$early_providers['remove'] ) ) {\n\t\t\tself::$early_providers['remove'] = array();\n\t\t}\n\n\t\tself::$early_providers['remove'][] = $format;\n\t}\n\n\t/**\n\t * The do-it-all function that takes a URL and attempts to return the HTML.\n\t *\n\t * @see WP_oEmbed::fetch()\n\t * @see WP_oEmbed::data2html()\n\t *\n\t * @param string $url The URL to the content that should be attempted to be embedded.\n\t * @param array $args Optional arguments. Usually passed from a shortcode.\n\t * @return false|string False on failure, otherwise the UNSANITIZED (and potentially unsafe) HTML that should be used to embed.\n\t */\n\tpublic function get_html( $url, $args = '' ) {\n\t\t$provider = $this->get_provider( $url, $args );\n\n\t\tif ( !$provider || false === $data = $this->fetch( $provider, $url, $args ) )\n\t\t\treturn false;\n\n\t\t/**\n\t\t * Filter the HTML returned by the oEmbed provider.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param string $data The returned oEmbed HTML.\n\t\t * @param string $url  URL of the content to be embedded.\n\t\t * @param array  $args Optional arguments, usually passed from a shortcode.\n\t\t */\n\t\treturn apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args );\n\t}\n\n\t/**\n\t * Attempts to discover link tags at the given URL for an oEmbed provider.\n\t *\n\t * @param string $url The URL that should be inspected for discovery `<link>` tags.\n\t * @return false|string False on failure, otherwise the oEmbed provider URL.\n\t */\n\tpublic function discover( $url ) {\n\t\t$providers = array();\n\n\t\t/**\n\t\t * Filter oEmbed remote get arguments.\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @see WP_Http::request()\n\t\t *\n\t\t * @param array  $args oEmbed remote get arguments.\n\t\t * @param string $url  URL to be inspected.\n\t\t */\n\t\t$args = apply_filters( 'oembed_remote_get_args', array(), $url );\n\n\t\t// Fetch URL content\n\t\t$request = wp_safe_remote_get( $url, $args );\n\t\tif ( $html = wp_remote_retrieve_body( $request ) ) {\n\n\t\t\t/**\n\t\t\t * Filter the link types that contain oEmbed provider URLs.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param array $format Array of oEmbed link types. Accepts 'application/json+oembed',\n\t\t\t *                      'text/xml+oembed', and 'application/xml+oembed' (incorrect,\n\t\t\t *                      used by at least Vimeo).\n\t\t\t */\n\t\t\t$linktypes = apply_filters( 'oembed_linktypes', array(\n\t\t\t\t'application/json+oembed' => 'json',\n\t\t\t\t'text/xml+oembed' => 'xml',\n\t\t\t\t'application/xml+oembed' => 'xml',\n\t\t\t) );\n\n\t\t\t// Strip <body>\n\t\t\t$html = substr( $html, 0, stripos( $html, '</head>' ) );\n\n\t\t\t// Do a quick check\n\t\t\t$tagfound = false;\n\t\t\tforeach ( $linktypes as $linktype => $format ) {\n\t\t\t\tif ( stripos($html, $linktype) ) {\n\t\t\t\t\t$tagfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $tagfound && preg_match_all( '#<link([^<>]+)/?>#iU', $html, $links ) ) {\n\t\t\t\tforeach ( $links[1] as $link ) {\n\t\t\t\t\t$atts = shortcode_parse_atts( $link );\n\n\t\t\t\t\tif ( !empty($atts['type']) && !empty($linktypes[$atts['type']]) && !empty($atts['href']) ) {\n\t\t\t\t\t\t$providers[$linktypes[$atts['type']]] = htmlspecialchars_decode( $atts['href'] );\n\n\t\t\t\t\t\t// Stop here if it's JSON (that's all we need)\n\t\t\t\t\t\tif ( 'json' == $linktypes[$atts['type']] )\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// JSON is preferred to XML\n\t\tif ( !empty($providers['json']) )\n\t\t\treturn $providers['json'];\n\t\telseif ( !empty($providers['xml']) )\n\t\t\treturn $providers['xml'];\n\t\telse\n\t\t\treturn false;\n\t}\n\n\t/**\n\t * Connects to a oEmbed provider and returns the result.\n\t *\n\t * @param string $provider The URL to the oEmbed provider.\n\t * @param string $url The URL to the content that is desired to be embedded.\n\t * @param array $args Optional arguments. Usually passed from a shortcode.\n\t * @return false|object False on failure, otherwise the result in the form of an object.\n\t */\n\tpublic function fetch( $provider, $url, $args = '' ) {\n\t\t$args = wp_parse_args( $args, wp_embed_defaults( $url ) );\n\n\t\t$provider = add_query_arg( 'maxwidth', (int) $args['width'], $provider );\n\t\t$provider = add_query_arg( 'maxheight', (int) $args['height'], $provider );\n\t\t$provider = add_query_arg( 'url', urlencode($url), $provider );\n\n\t\t/**\n\t\t * Filter the oEmbed URL to be fetched.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param string $provider URL of the oEmbed provider.\n\t\t * @param string $url      URL of the content to be embedded.\n\t\t * @param array  $args     Optional arguments, usually passed from a shortcode.\n\t\t */\n\t\t$provider = apply_filters( 'oembed_fetch_url', $provider, $url, $args );\n\n\t\tforeach ( array( 'json', 'xml' ) as $format ) {\n\t\t\t$result = $this->_fetch_with_format( $provider, $format );\n\t\t\tif ( is_wp_error( $result ) && 'not-implemented' == $result->get_error_code() )\n\t\t\t\tcontinue;\n\t\t\treturn ( $result && ! is_wp_error( $result ) ) ? $result : false;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fetches result from an oEmbed provider for a specific format and complete provider URL\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t * @param string $provider_url_with_args URL to the provider with full arguments list (url, maxheight, etc.)\n\t * @param string $format Format to use\n\t * @return false|object|WP_Error False on failure, otherwise the result in the form of an object.\n\t */\n\tprivate function _fetch_with_format( $provider_url_with_args, $format ) {\n\t\t$provider_url_with_args = add_query_arg( 'format', $format, $provider_url_with_args );\n\n\t\t/** This filter is documented in wp-includes/class-oembed.php */\n\t\t$args = apply_filters( 'oembed_remote_get_args', array(), $provider_url_with_args );\n\n\t\t$response = wp_safe_remote_get( $provider_url_with_args, $args );\n\t\tif ( 501 == wp_remote_retrieve_response_code( $response ) )\n\t\t\treturn new WP_Error( 'not-implemented' );\n\t\tif ( ! $body = wp_remote_retrieve_body( $response ) )\n\t\t\treturn false;\n\t\t$parse_method = \"_parse_$format\";\n\t\treturn $this->$parse_method( $body );\n\t}\n\n\t/**\n\t * Parses a json response body.\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t *\n\t * @param string $response_body\n\t * @return object|false\n\t */\n\tprivate function _parse_json( $response_body ) {\n\t\t$data = json_decode( trim( $response_body ) );\n\t\treturn ( $data && is_object( $data ) ) ? $data : false;\n\t}\n\n\t/**\n\t * Parses an XML response body.\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t *\n\t * @param string $response_body\n\t * @return object|false\n\t */\n\tprivate function _parse_xml( $response_body ) {\n\t\tif ( ! function_exists( 'libxml_disable_entity_loader' ) )\n\t\t\treturn false;\n\n\t\t$loader = libxml_disable_entity_loader( true );\n\t\t$errors = libxml_use_internal_errors( true );\n\n\t\t$return = $this->_parse_xml_body( $response_body );\n\n\t\tlibxml_use_internal_errors( $errors );\n\t\tlibxml_disable_entity_loader( $loader );\n\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Helper function for parsing an XML response body.\n\t *\n\t * @since 3.6.0\n\t * @access private\n\t *\n\t * @param string $response_body\n\t * @return object|false\n\t */\n\tprivate function _parse_xml_body( $response_body ) {\n\t\tif ( ! function_exists( 'simplexml_import_dom' ) || ! class_exists( 'DOMDocument', false ) )\n\t\t\treturn false;\n\n\t\t$dom = new DOMDocument;\n\t\t$success = $dom->loadXML( $response_body );\n\t\tif ( ! $success )\n\t\t\treturn false;\n\n\t\tif ( isset( $dom->doctype ) )\n\t\t\treturn false;\n\n\t\tforeach ( $dom->childNodes as $child ) {\n\t\t\tif ( XML_DOCUMENT_TYPE_NODE === $child->nodeType )\n\t\t\t\treturn false;\n\t\t}\n\n\t\t$xml = simplexml_import_dom( $dom );\n\t\tif ( ! $xml )\n\t\t\treturn false;\n\n\t\t$return = new stdClass;\n\t\tforeach ( $xml as $key => $value ) {\n\t\t\t$return->$key = (string) $value;\n\t\t}\n\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Converts a data object from {@link WP_oEmbed::fetch()} and returns the HTML.\n\t *\n\t * @param object $data A data object result from an oEmbed provider.\n\t * @param string $url The URL to the content that is desired to be embedded.\n\t * @return false|string False on error, otherwise the HTML needed to embed.\n\t */\n\tpublic function data2html( $data, $url ) {\n\t\tif ( ! is_object( $data ) || empty( $data->type ) )\n\t\t\treturn false;\n\n\t\t$return = false;\n\n\t\tswitch ( $data->type ) {\n\t\t\tcase 'photo':\n\t\t\t\tif ( empty( $data->url ) || empty( $data->width ) || empty( $data->height ) )\n\t\t\t\t\tbreak;\n\t\t\t\tif ( ! is_string( $data->url ) || ! is_numeric( $data->width ) || ! is_numeric( $data->height ) )\n\t\t\t\t\tbreak;\n\n\t\t\t\t$title = ! empty( $data->title ) && is_string( $data->title ) ? $data->title : '';\n\t\t\t\t$return = '<a href=\"' . esc_url( $url ) . '\"><img src=\"' . esc_url( $data->url ) . '\" alt=\"' . esc_attr($title) . '\" width=\"' . esc_attr($data->width) . '\" height=\"' . esc_attr($data->height) . '\" /></a>';\n\t\t\t\tbreak;\n\n\t\t\tcase 'video':\n\t\t\tcase 'rich':\n\t\t\t\tif ( ! empty( $data->html ) && is_string( $data->html ) )\n\t\t\t\t\t$return = $data->html;\n\t\t\t\tbreak;\n\n\t\t\tcase 'link':\n\t\t\t\tif ( ! empty( $data->title ) && is_string( $data->title ) )\n\t\t\t\t\t$return = '<a href=\"' . esc_url( $url ) . '\">' . esc_html( $data->title ) . '</a>';\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$return = false;\n\t\t}\n\n\t\t/**\n\t\t * Filter the returned oEmbed HTML.\n\t\t *\n\t\t * Use this filter to add support for custom data types, or to filter the result.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param string $return The returned oEmbed HTML.\n\t\t * @param object $data   A data object result from an oEmbed provider.\n\t\t * @param string $url    The URL of the content to be embedded.\n\t\t */\n\t\treturn apply_filters( 'oembed_dataparse', $return, $data, $url );\n\t}\n\n\t/**\n\t * Strip any new lines from the HTML.\n\t *\n\t * @access public\n\t * @param string $html Existing HTML.\n\t * @param object $data Data object from WP_oEmbed::data2html()\n\t * @param string $url The original URL passed to oEmbed.\n\t * @return string Possibly modified $html\n\t */\n\tpublic function _strip_newlines( $html, $data, $url ) {\n\t\tif ( false === strpos( $html, \"\\n\" ) ) {\n\t\t\treturn $html;\n\t\t}\n\n\t\t$count = 1;\n\t\t$found = array();\n\t\t$token = '__PRE__';\n\t\t$search = array( \"\\t\", \"\\n\", \"\\r\", ' ' );\n\t\t$replace = array( '__TAB__', '__NL__', '__CR__', '__SPACE__' );\n\t\t$tokenized = str_replace( $search, $replace, $html );\n\n\t\tpreg_match_all( '#(<pre[^>]*>.+?</pre>)#i', $tokenized, $matches, PREG_SET_ORDER );\n\t\tforeach ( $matches as $i => $match ) {\n\t\t\t$tag_html = str_replace( $replace, $search, $match[0] );\n\t\t\t$tag_token = $token . $i;\n\n\t\t\t$found[ $tag_token ] = $tag_html;\n\t\t\t$html = str_replace( $tag_html, $tag_token, $html, $count );\n\t\t}\n\n\t\t$replaced = str_replace( $replace, $search, $html );\n\t\t$stripped = str_replace( array( \"\\r\\n\", \"\\n\" ), '', $replaced );\n\t\t$pre = array_values( $found );\n\t\t$tokens = array_keys( $found );\n\n\t\treturn str_replace( $tokens, $pre, $stripped );\n\t}\n}\n\n/**\n * Returns the initialized {@link WP_oEmbed} object\n *\n * @since 2.9.0\n * @access private\n *\n * @staticvar WP_oEmbed $wp_oembed\n *\n * @return WP_oEmbed object.\n */\nfunction _wp_oembed_get_object() {\n\tstatic $wp_oembed = null;\n\n\tif ( is_null( $wp_oembed ) ) {\n\t\t$wp_oembed = new WP_oEmbed();\n\t}\n\treturn $wp_oembed;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-phpass.php",
    "content": "<?php\n/**\n * Portable PHP password hashing framework.\n * @package phpass\n * @since 2.5.0\n * @version 0.3 / WordPress\n * @link http://www.openwall.com/phpass/\n */\n\n#\n# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in\n# the public domain.  Revised in subsequent years, still public domain.\n#\n# There's absolutely no warranty.\n#\n# Please be sure to update the Version line if you edit this file in any way.\n# It is suggested that you leave the main version number intact, but indicate\n# your project name (after the slash) and add your own revision information.\n#\n# Please do not change the \"private\" password hashing method implemented in\n# here, thereby making your hashes incompatible.  However, if you must, please\n# change the hash type identifier (the \"$P$\") to something different.\n#\n# Obviously, since this code is in the public domain, the above are not\n# requirements (there can be none), but merely suggestions.\n#\n\n/**\n * Portable PHP password hashing framework.\n *\n * @package phpass\n * @version 0.3 / WordPress\n * @link http://www.openwall.com/phpass/\n * @since 2.5.0\n */\nclass PasswordHash {\n\tvar $itoa64;\n\tvar $iteration_count_log2;\n\tvar $portable_hashes;\n\tvar $random_state;\n\n\t/**\n\t * PHP5 constructor.\n\t */\n\tfunction __construct( $iteration_count_log2, $portable_hashes )\n\t{\n\t\t$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\n\t\tif ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)\n\t\t\t$iteration_count_log2 = 8;\n\t\t$this->iteration_count_log2 = $iteration_count_log2;\n\n\t\t$this->portable_hashes = $portable_hashes;\n\n\t\t$this->random_state = microtime() . uniqid(rand(), TRUE); // removed getmypid() for compatibility reasons\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function PasswordHash( $iteration_count_log2, $portable_hashes ) {\n\t\tself::__construct( $iteration_count_log2, $portable_hashes );\n\t}\n\n\tfunction get_random_bytes($count)\n\t{\n\t\t$output = '';\n\t\tif ( @is_readable('/dev/urandom') &&\n\t\t    ($fh = @fopen('/dev/urandom', 'rb'))) {\n\t\t\t$output = fread($fh, $count);\n\t\t\tfclose($fh);\n\t\t}\n\n\t\tif (strlen($output) < $count) {\n\t\t\t$output = '';\n\t\t\tfor ($i = 0; $i < $count; $i += 16) {\n\t\t\t\t$this->random_state =\n\t\t\t\t    md5(microtime() . $this->random_state);\n\t\t\t\t$output .=\n\t\t\t\t    pack('H*', md5($this->random_state));\n\t\t\t}\n\t\t\t$output = substr($output, 0, $count);\n\t\t}\n\n\t\treturn $output;\n\t}\n\n\tfunction encode64($input, $count)\n\t{\n\t\t$output = '';\n\t\t$i = 0;\n\t\tdo {\n\t\t\t$value = ord($input[$i++]);\n\t\t\t$output .= $this->itoa64[$value & 0x3f];\n\t\t\tif ($i < $count)\n\t\t\t\t$value |= ord($input[$i]) << 8;\n\t\t\t$output .= $this->itoa64[($value >> 6) & 0x3f];\n\t\t\tif ($i++ >= $count)\n\t\t\t\tbreak;\n\t\t\tif ($i < $count)\n\t\t\t\t$value |= ord($input[$i]) << 16;\n\t\t\t$output .= $this->itoa64[($value >> 12) & 0x3f];\n\t\t\tif ($i++ >= $count)\n\t\t\t\tbreak;\n\t\t\t$output .= $this->itoa64[($value >> 18) & 0x3f];\n\t\t} while ($i < $count);\n\n\t\treturn $output;\n\t}\n\n\tfunction gensalt_private($input)\n\t{\n\t\t$output = '$P$';\n\t\t$output .= $this->itoa64[min($this->iteration_count_log2 +\n\t\t\t((PHP_VERSION >= '5') ? 5 : 3), 30)];\n\t\t$output .= $this->encode64($input, 6);\n\n\t\treturn $output;\n\t}\n\n\tfunction crypt_private($password, $setting)\n\t{\n\t\t$output = '*0';\n\t\tif (substr($setting, 0, 2) == $output)\n\t\t\t$output = '*1';\n\n\t\t$id = substr($setting, 0, 3);\n\t\t# We use \"$P$\", phpBB3 uses \"$H$\" for the same thing\n\t\tif ($id != '$P$' && $id != '$H$')\n\t\t\treturn $output;\n\n\t\t$count_log2 = strpos($this->itoa64, $setting[3]);\n\t\tif ($count_log2 < 7 || $count_log2 > 30)\n\t\t\treturn $output;\n\n\t\t$count = 1 << $count_log2;\n\n\t\t$salt = substr($setting, 4, 8);\n\t\tif (strlen($salt) != 8)\n\t\t\treturn $output;\n\n\t\t# We're kind of forced to use MD5 here since it's the only\n\t\t# cryptographic primitive available in all versions of PHP\n\t\t# currently in use.  To implement our own low-level crypto\n\t\t# in PHP would result in much worse performance and\n\t\t# consequently in lower iteration counts and hashes that are\n\t\t# quicker to crack (by non-PHP code).\n\t\tif (PHP_VERSION >= '5') {\n\t\t\t$hash = md5($salt . $password, TRUE);\n\t\t\tdo {\n\t\t\t\t$hash = md5($hash . $password, TRUE);\n\t\t\t} while (--$count);\n\t\t} else {\n\t\t\t$hash = pack('H*', md5($salt . $password));\n\t\t\tdo {\n\t\t\t\t$hash = pack('H*', md5($hash . $password));\n\t\t\t} while (--$count);\n\t\t}\n\n\t\t$output = substr($setting, 0, 12);\n\t\t$output .= $this->encode64($hash, 16);\n\n\t\treturn $output;\n\t}\n\n\tfunction gensalt_extended($input)\n\t{\n\t\t$count_log2 = min($this->iteration_count_log2 + 8, 24);\n\t\t# This should be odd to not reveal weak DES keys, and the\n\t\t# maximum valid value is (2**24 - 1) which is odd anyway.\n\t\t$count = (1 << $count_log2) - 1;\n\n\t\t$output = '_';\n\t\t$output .= $this->itoa64[$count & 0x3f];\n\t\t$output .= $this->itoa64[($count >> 6) & 0x3f];\n\t\t$output .= $this->itoa64[($count >> 12) & 0x3f];\n\t\t$output .= $this->itoa64[($count >> 18) & 0x3f];\n\n\t\t$output .= $this->encode64($input, 3);\n\n\t\treturn $output;\n\t}\n\n\tfunction gensalt_blowfish($input)\n\t{\n\t\t# This one needs to use a different order of characters and a\n\t\t# different encoding scheme from the one in encode64() above.\n\t\t# We care because the last character in our encoded string will\n\t\t# only represent 2 bits.  While two known implementations of\n\t\t# bcrypt will happily accept and correct a salt string which\n\t\t# has the 4 unused bits set to non-zero, we do not want to take\n\t\t# chances and we also do not want to waste an additional byte\n\t\t# of entropy.\n\t\t$itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n\t\t$output = '$2a$';\n\t\t$output .= chr(ord('0') + $this->iteration_count_log2 / 10);\n\t\t$output .= chr(ord('0') + $this->iteration_count_log2 % 10);\n\t\t$output .= '$';\n\n\t\t$i = 0;\n\t\tdo {\n\t\t\t$c1 = ord($input[$i++]);\n\t\t\t$output .= $itoa64[$c1 >> 2];\n\t\t\t$c1 = ($c1 & 0x03) << 4;\n\t\t\tif ($i >= 16) {\n\t\t\t\t$output .= $itoa64[$c1];\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$c2 = ord($input[$i++]);\n\t\t\t$c1 |= $c2 >> 4;\n\t\t\t$output .= $itoa64[$c1];\n\t\t\t$c1 = ($c2 & 0x0f) << 2;\n\n\t\t\t$c2 = ord($input[$i++]);\n\t\t\t$c1 |= $c2 >> 6;\n\t\t\t$output .= $itoa64[$c1];\n\t\t\t$output .= $itoa64[$c2 & 0x3f];\n\t\t} while (1);\n\n\t\treturn $output;\n\t}\n\n\tfunction HashPassword($password)\n\t{\n\t\tif ( strlen( $password ) > 4096 ) {\n\t\t\treturn '*';\n\t\t}\n\n\t\t$random = '';\n\n\t\tif (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) {\n\t\t\t$random = $this->get_random_bytes(16);\n\t\t\t$hash =\n\t\t\t    crypt($password, $this->gensalt_blowfish($random));\n\t\t\tif (strlen($hash) == 60)\n\t\t\t\treturn $hash;\n\t\t}\n\n\t\tif (CRYPT_EXT_DES == 1 && !$this->portable_hashes) {\n\t\t\tif (strlen($random) < 3)\n\t\t\t\t$random = $this->get_random_bytes(3);\n\t\t\t$hash =\n\t\t\t    crypt($password, $this->gensalt_extended($random));\n\t\t\tif (strlen($hash) == 20)\n\t\t\t\treturn $hash;\n\t\t}\n\n\t\tif (strlen($random) < 6)\n\t\t\t$random = $this->get_random_bytes(6);\n\t\t$hash =\n\t\t    $this->crypt_private($password,\n\t\t    $this->gensalt_private($random));\n\t\tif (strlen($hash) == 34)\n\t\t\treturn $hash;\n\n\t\t# Returning '*' on error is safe here, but would _not_ be safe\n\t\t# in a crypt(3)-like function used _both_ for generating new\n\t\t# hashes and for validating passwords against existing hashes.\n\t\treturn '*';\n\t}\n\n\tfunction CheckPassword($password, $stored_hash)\n\t{\n\t\tif ( strlen( $password ) > 4096 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$hash = $this->crypt_private($password, $stored_hash);\n\t\tif ($hash[0] == '*')\n\t\t\t$hash = crypt($password, $stored_hash);\n\n\t\treturn $hash === $stored_hash;\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-phpmailer.php",
    "content": "<?php\n/**\n * PHPMailer - PHP email creation and transport class.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2012 - 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer - PHP email creation and transport class.\n * @package PHPMailer\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n */\nclass PHPMailer\n{\n    /**\n     * The PHPMailer Version number.\n     * @var string\n     */\n    public $Version = '5.2.14';\n\n    /**\n     * Email priority.\n     * Options: null (default), 1 = High, 3 = Normal, 5 = low.\n     * When null, the header is not set at all.\n     * @var integer\n     */\n    public $Priority = null;\n\n    /**\n     * The character set of the message.\n     * @var string\n     */\n    public $CharSet = 'iso-8859-1';\n\n    /**\n     * The MIME Content-type of the message.\n     * @var string\n     */\n    public $ContentType = 'text/plain';\n\n    /**\n     * The message encoding.\n     * Options: \"8bit\", \"7bit\", \"binary\", \"base64\", and \"quoted-printable\".\n     * @var string\n     */\n    public $Encoding = '8bit';\n\n    /**\n     * Holds the most recent mailer error message.\n     * @var string\n     */\n    public $ErrorInfo = '';\n\n    /**\n     * The From email address for the message.\n     * @var string\n     */\n    public $From = 'root@localhost';\n\n    /**\n     * The From name of the message.\n     * @var string\n     */\n    public $FromName = 'Root User';\n\n    /**\n     * The Sender email (Return-Path) of the message.\n     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.\n     * @var string\n     */\n    public $Sender = '';\n\n    /**\n     * The Return-Path of the message.\n     * If empty, it will be set to either From or Sender.\n     * @var string\n     * @deprecated Email senders should never set a return-path header;\n     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.\n     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference\n     */\n    public $ReturnPath = '';\n\n    /**\n     * The Subject of the message.\n     * @var string\n     */\n    public $Subject = '';\n\n    /**\n     * An HTML or plain text message body.\n     * If HTML then call isHTML(true).\n     * @var string\n     */\n    public $Body = '';\n\n    /**\n     * The plain-text message body.\n     * This body can be read by mail clients that do not have HTML email\n     * capability such as mutt & Eudora.\n     * Clients that can read HTML will view the normal Body.\n     * @var string\n     */\n    public $AltBody = '';\n\n    /**\n     * An iCal message part body.\n     * Only supported in simple alt or alt_inline message types\n     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator\n     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/\n     * @link http://kigkonsult.se/iCalcreator/\n     * @var string\n     */\n    public $Ical = '';\n\n    /**\n     * The complete compiled MIME message body.\n     * @access protected\n     * @var string\n     */\n    protected $MIMEBody = '';\n\n    /**\n     * The complete compiled MIME message headers.\n     * @var string\n     * @access protected\n     */\n    protected $MIMEHeader = '';\n\n    /**\n     * Extra headers that createHeader() doesn't fold in.\n     * @var string\n     * @access protected\n     */\n    protected $mailHeader = '';\n\n    /**\n     * Word-wrap the message body to this number of chars.\n     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.\n     * @var integer\n     */\n    public $WordWrap = 0;\n\n    /**\n     * Which method to use to send mail.\n     * Options: \"mail\", \"sendmail\", or \"smtp\".\n     * @var string\n     */\n    public $Mailer = 'mail';\n\n    /**\n     * The path to the sendmail program.\n     * @var string\n     */\n    public $Sendmail = '/usr/sbin/sendmail';\n\n    /**\n     * Whether mail() uses a fully sendmail-compatible MTA.\n     * One which supports sendmail's \"-oi -f\" options.\n     * @var boolean\n     */\n    public $UseSendmailOptions = true;\n\n    /**\n     * Path to PHPMailer plugins.\n     * Useful if the SMTP class is not in the PHP include path.\n     * @var string\n     * @deprecated Should not be needed now there is an autoloader.\n     */\n    public $PluginDir = '';\n\n    /**\n     * The email address that a reading confirmation should be sent to, also known as read receipt.\n     * @var string\n     */\n    public $ConfirmReadingTo = '';\n\n    /**\n     * The hostname to use in the Message-ID header and as default HELO string.\n     * If empty, PHPMailer attempts to find one with, in order,\n     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value\n     * 'localhost.localdomain'.\n     * @var string\n     */\n    public $Hostname = '';\n\n    /**\n     * An ID to be used in the Message-ID header.\n     * If empty, a unique id will be generated.\n     * @var string\n     */\n    public $MessageID = '';\n\n    /**\n     * The message Date to be used in the Date header.\n     * If empty, the current date will be added.\n     * @var string\n     */\n    public $MessageDate = '';\n\n    /**\n     * SMTP hosts.\n     * Either a single hostname or multiple semicolon-delimited hostnames.\n     * You can also specify a different port\n     * for each host by using this format: [hostname:port]\n     * (e.g. \"smtp1.example.com:25;smtp2.example.com\").\n     * You can also specify encryption type, for example:\n     * (e.g. \"tls://smtp1.example.com:587;ssl://smtp2.example.com:465\").\n     * Hosts will be tried in order.\n     * @var string\n     */\n    public $Host = 'localhost';\n\n    /**\n     * The default SMTP server port.\n     * @var integer\n     * @TODO Why is this needed when the SMTP class takes care of it?\n     */\n    public $Port = 25;\n\n    /**\n     * The SMTP HELO of the message.\n     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find\n     * one with the same method described above for $Hostname.\n     * @var string\n     * @see PHPMailer::$Hostname\n     */\n    public $Helo = '';\n\n    /**\n     * What kind of encryption to use on the SMTP connection.\n     * Options: '', 'ssl' or 'tls'\n     * @var string\n     */\n    public $SMTPSecure = '';\n\n    /**\n     * Whether to enable TLS encryption automatically if a server supports it,\n     * even if `SMTPSecure` is not set to 'tls'.\n     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.\n     * @var boolean\n     */\n    public $SMTPAutoTLS = true;\n\n    /**\n     * Whether to use SMTP authentication.\n     * Uses the Username and Password properties.\n     * @var boolean\n     * @see PHPMailer::$Username\n     * @see PHPMailer::$Password\n     */\n    public $SMTPAuth = false;\n\n    /**\n     * Options array passed to stream_context_create when connecting via SMTP.\n     * @var array\n     */\n    public $SMTPOptions = array();\n\n    /**\n     * SMTP username.\n     * @var string\n     */\n    public $Username = '';\n\n    /**\n     * SMTP password.\n     * @var string\n     */\n    public $Password = '';\n\n    /**\n     * SMTP auth type.\n     * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5\n     * @var string\n     */\n    public $AuthType = '';\n\n    /**\n     * SMTP realm.\n     * Used for NTLM auth\n     * @var string\n     */\n    public $Realm = '';\n\n    /**\n     * SMTP workstation.\n     * Used for NTLM auth\n     * @var string\n     */\n    public $Workstation = '';\n\n    /**\n     * The SMTP server timeout in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * @var integer\n     */\n    public $Timeout = 300;\n\n    /**\n     * SMTP class debug output mode.\n     * Debug output level.\n     * Options:\n     * * `0` No output\n     * * `1` Commands\n     * * `2` Data and commands\n     * * `3` As 2 plus connection status\n     * * `4` Low-level data output\n     * @var integer\n     * @see SMTP::$do_debug\n     */\n    public $SMTPDebug = 0;\n\n    /**\n     * How to handle debug output.\n     * Options:\n     * * `echo` Output plain-text as-is, appropriate for CLI\n     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n     * * `error_log` Output to error log as configured in php.ini\n     *\n     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n     * <code>\n     * $mail->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n     * </code>\n     * @var string|callable\n     * @see SMTP::$Debugoutput\n     */\n    public $Debugoutput = 'echo';\n\n    /**\n     * Whether to keep SMTP connection open after each message.\n     * If this is set to true then to close the connection\n     * requires an explicit call to smtpClose().\n     * @var boolean\n     */\n    public $SMTPKeepAlive = false;\n\n    /**\n     * Whether to split multiple to addresses into multiple messages\n     * or send them all in one message.\n     * @var boolean\n     */\n    public $SingleTo = false;\n\n    /**\n     * Storage for addresses when SingleTo is enabled.\n     * @var array\n     * @TODO This should really not be public\n     */\n    public $SingleToArray = array();\n\n    /**\n     * Whether to generate VERP addresses on send.\n     * Only applicable when sending via SMTP.\n     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path\n     * @link http://www.postfix.org/VERP_README.html Postfix VERP info\n     * @var boolean\n     */\n    public $do_verp = false;\n\n    /**\n     * Whether to allow sending messages with an empty body.\n     * @var boolean\n     */\n    public $AllowEmpty = false;\n\n    /**\n     * The default line ending.\n     * @note The default remains \"\\n\". We force CRLF where we know\n     *        it must be used via self::CRLF.\n     * @var string\n     */\n    public $LE = \"\\n\";\n\n    /**\n     * DKIM selector.\n     * @var string\n     */\n    public $DKIM_selector = '';\n\n    /**\n     * DKIM Identity.\n     * Usually the email address used as the source of the email\n     * @var string\n     */\n    public $DKIM_identity = '';\n\n    /**\n     * DKIM passphrase.\n     * Used if your key is encrypted.\n     * @var string\n     */\n    public $DKIM_passphrase = '';\n\n    /**\n     * DKIM signing domain name.\n     * @example 'example.com'\n     * @var string\n     */\n    public $DKIM_domain = '';\n\n    /**\n     * DKIM private key file path.\n     * @var string\n     */\n    public $DKIM_private = '';\n\n    /**\n     * Callback Action function name.\n     *\n     * The function that handles the result of the send email action.\n     * It is called out by send() for each email sent.\n     *\n     * Value can be any php callable: http://www.php.net/is_callable\n     *\n     * Parameters:\n     *   boolean $result        result of the send action\n     *   string  $to            email address of the recipient\n     *   string  $cc            cc email addresses\n     *   string  $bcc           bcc email addresses\n     *   string  $subject       the subject\n     *   string  $body          the email body\n     *   string  $from          email address of sender\n     * @var string\n     */\n    public $action_function = '';\n\n    /**\n     * What to put in the X-Mailer header.\n     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use\n     * @var string\n     */\n    public $XMailer = '';\n\n    /**\n     * An instance of the SMTP sender class.\n     * @var SMTP\n     * @access protected\n     */\n    protected $smtp = null;\n\n    /**\n     * The array of 'to' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $to = array();\n\n    /**\n     * The array of 'cc' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $cc = array();\n\n    /**\n     * The array of 'bcc' names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $bcc = array();\n\n    /**\n     * The array of reply-to names and addresses.\n     * @var array\n     * @access protected\n     */\n    protected $ReplyTo = array();\n\n    /**\n     * An array of all kinds of addresses.\n     * Includes all of $to, $cc, $bcc\n     * @var array\n     * @access protected\n     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n     */\n    protected $all_recipients = array();\n\n    /**\n     * An array of names and addresses queued for validation.\n     * In send(), valid and non duplicate entries are moved to $all_recipients\n     * and one of $to, $cc, or $bcc.\n     * This array is used only for addresses with IDN.\n     * @var array\n     * @access protected\n     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc\n     * @see PHPMailer::$all_recipients\n     */\n    protected $RecipientsQueue = array();\n\n    /**\n     * An array of reply-to names and addresses queued for validation.\n     * In send(), valid and non duplicate entries are moved to $ReplyTo.\n     * This array is used only for addresses with IDN.\n     * @var array\n     * @access protected\n     * @see PHPMailer::$ReplyTo\n     */\n    protected $ReplyToQueue = array();\n\n    /**\n     * The array of attachments.\n     * @var array\n     * @access protected\n     */\n    protected $attachment = array();\n\n    /**\n     * The array of custom headers.\n     * @var array\n     * @access protected\n     */\n    protected $CustomHeader = array();\n\n    /**\n     * The most recent Message-ID (including angular brackets).\n     * @var string\n     * @access protected\n     */\n    protected $lastMessageID = '';\n\n    /**\n     * The message's MIME type.\n     * @var string\n     * @access protected\n     */\n    protected $message_type = '';\n\n    /**\n     * The array of MIME boundary strings.\n     * @var array\n     * @access protected\n     */\n    protected $boundary = array();\n\n    /**\n     * The array of available languages.\n     * @var array\n     * @access protected\n     */\n    protected $language = array();\n\n    /**\n     * The number of errors encountered.\n     * @var integer\n     * @access protected\n     */\n    protected $error_count = 0;\n\n    /**\n     * The S/MIME certificate file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_cert_file = '';\n\n    /**\n     * The S/MIME key file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_key_file = '';\n\n    /**\n     * The optional S/MIME extra certificates (\"CA Chain\") file path.\n     * @var string\n     * @access protected\n     */\n    protected $sign_extracerts_file = '';\n\n    /**\n     * The S/MIME password for the key.\n     * Used only if the key is encrypted.\n     * @var string\n     * @access protected\n     */\n    protected $sign_key_pass = '';\n\n    /**\n     * Whether to throw exceptions for errors.\n     * @var boolean\n     * @access protected\n     */\n    protected $exceptions = false;\n\n    /**\n     * Unique ID used for message ID and boundaries.\n     * @var string\n     * @access protected\n     */\n    protected $uniqueid = '';\n\n    /**\n     * Error severity: message only, continue processing.\n     */\n    const STOP_MESSAGE = 0;\n\n    /**\n     * Error severity: message, likely ok to continue processing.\n     */\n    const STOP_CONTINUE = 1;\n\n    /**\n     * Error severity: message, plus full stop, critical error reached.\n     */\n    const STOP_CRITICAL = 2;\n\n    /**\n     * SMTP RFC standard line ending.\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * The maximum line length allowed by RFC 2822 section 2.1.1\n     * @var integer\n     */\n    const MAX_LINE_LENGTH = 998;\n\n    /**\n     * Constructor.\n     * @param boolean $exceptions Should we throw external exceptions?\n     */\n    public function __construct($exceptions = false)\n    {\n        $this->exceptions = (boolean)$exceptions;\n    }\n\n    /**\n     * Destructor.\n     */\n    public function __destruct()\n    {\n        //Close any open SMTP connection nicely\n        if ($this->Mailer == 'smtp') {\n            $this->smtpClose();\n        }\n    }\n\n    /**\n     * Call mail() in a safe_mode-aware fashion.\n     * Also, unless sendmail_path points to sendmail (or something that\n     * claims to be sendmail), don't pass params (not a perfect fix,\n     * but it will do)\n     * @param string $to To\n     * @param string $subject Subject\n     * @param string $body Message Body\n     * @param string $header Additional Header(s)\n     * @param string $params Params\n     * @access private\n     * @return boolean\n     */\n    private function mailPassthru($to, $subject, $body, $header, $params)\n    {\n        //Check overloading of mail function to avoid double-encoding\n        if (ini_get('mbstring.func_overload') & 1) {\n            $subject = $this->secureHeader($subject);\n        } else {\n            $subject = $this->encodeHeader($this->secureHeader($subject));\n        }\n        if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {\n            $result = @mail($to, $subject, $body, $header);\n        } else {\n            $result = @mail($to, $subject, $body, $header, $params);\n        }\n        return $result;\n    }\n\n    /**\n     * Output debugging info via user-defined method.\n     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).\n     * @see PHPMailer::$Debugoutput\n     * @see PHPMailer::$SMTPDebug\n     * @param string $str\n     */\n    protected function edebug($str)\n    {\n        if ($this->SMTPDebug <= 0) {\n            return;\n        }\n        //Avoid clash with built-in function names\n        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);\n            return;\n        }\n        switch ($this->Debugoutput) {\n            case 'error_log':\n                //Don't output, just log\n                error_log($str);\n                break;\n            case 'html':\n                //Cleans up output a bit for a better looking, HTML-safe output\n                echo htmlentities(\n                    preg_replace('/[\\r\\n]+/', '', $str),\n                    ENT_QUOTES,\n                    'UTF-8'\n                )\n                . \"<br>\\n\";\n                break;\n            case 'echo':\n            default:\n                //Normalize line breaks\n                $str = preg_replace('/(\\r\\n|\\r|\\n)/ms', \"\\n\", $str);\n                echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n                    \"\\n\",\n                    \"\\n                   \\t                  \",\n                    trim($str)\n                ) . \"\\n\";\n        }\n    }\n\n    /**\n     * Sets message type to HTML or plain.\n     * @param boolean $isHtml True for HTML mode.\n     * @return void\n     */\n    public function isHTML($isHtml = true)\n    {\n        if ($isHtml) {\n            $this->ContentType = 'text/html';\n        } else {\n            $this->ContentType = 'text/plain';\n        }\n    }\n\n    /**\n     * Send messages using SMTP.\n     * @return void\n     */\n    public function isSMTP()\n    {\n        $this->Mailer = 'smtp';\n    }\n\n    /**\n     * Send messages using PHP's mail() function.\n     * @return void\n     */\n    public function isMail()\n    {\n        $this->Mailer = 'mail';\n    }\n\n    /**\n     * Send messages using $Sendmail.\n     * @return void\n     */\n    public function isSendmail()\n    {\n        $ini_sendmail_path = ini_get('sendmail_path');\n\n        if (!stristr($ini_sendmail_path, 'sendmail')) {\n            $this->Sendmail = '/usr/sbin/sendmail';\n        } else {\n            $this->Sendmail = $ini_sendmail_path;\n        }\n        $this->Mailer = 'sendmail';\n    }\n\n    /**\n     * Send messages using qmail.\n     * @return void\n     */\n    public function isQmail()\n    {\n        $ini_sendmail_path = ini_get('sendmail_path');\n\n        if (!stristr($ini_sendmail_path, 'qmail')) {\n            $this->Sendmail = '/var/qmail/bin/qmail-inject';\n        } else {\n            $this->Sendmail = $ini_sendmail_path;\n        }\n        $this->Mailer = 'qmail';\n    }\n\n    /**\n     * Add a \"To\" address.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addAddress($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('to', $address, $name);\n    }\n\n    /**\n     * Add a \"CC\" address.\n     * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addCC($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('cc', $address, $name);\n    }\n\n    /**\n     * Add a \"BCC\" address.\n     * @note: This function works with the SMTP mailer on win32, not with the \"mail\" mailer.\n     * @param string $address The email address to send to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addBCC($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('bcc', $address, $name);\n    }\n\n    /**\n     * Add a \"Reply-To\" address.\n     * @param string $address The email address to reply to\n     * @param string $name\n     * @return boolean true on success, false if address already used or invalid in some way\n     */\n    public function addReplyTo($address, $name = '')\n    {\n        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);\n    }\n\n    /**\n     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer\n     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still\n     * be modified after calling this function), addition of such addresses is delayed until send().\n     * Addresses that have been added already return false, but do not throw exceptions.\n     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n     * @param string $address The email address to send, resp. to reply to\n     * @param string $name\n     * @throws phpmailerException\n     * @return boolean true on success, false if address already used or invalid in some way\n     * @access protected\n     */\n    protected function addOrEnqueueAnAddress($kind, $address, $name)\n    {\n        $address = trim($address);\n        $name = trim(preg_replace('/[\\r\\n]+/', '', $name)); //Strip breaks and trim\n        if (($pos = strrpos($address, '@')) === false) {\n            // At-sign is misssing.\n            $error_message = $this->lang('invalid_address') . $address;\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        $params = array($kind, $address, $name);\n        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.\n        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {\n            if ($kind != 'Reply-To') {\n                if (!array_key_exists($address, $this->RecipientsQueue)) {\n                    $this->RecipientsQueue[$address] = $params;\n                    return true;\n                }\n            } else {\n                if (!array_key_exists($address, $this->ReplyToQueue)) {\n                    $this->ReplyToQueue[$address] = $params;\n                    return true;\n                }\n            }\n            return false;\n        }\n        // Immediately add standard addresses without IDN.\n        return call_user_func_array(array($this, 'addAnAddress'), $params);\n    }\n\n    /**\n     * Add an address to one of the recipient arrays or to the ReplyTo array.\n     * Addresses that have been added already return false, but do not throw exceptions.\n     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'\n     * @param string $address The email address to send, resp. to reply to\n     * @param string $name\n     * @throws phpmailerException\n     * @return boolean true on success, false if address already used or invalid in some way\n     * @access protected\n     */\n    protected function addAnAddress($kind, $address, $name = '')\n    {\n        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {\n            $error_message = $this->lang('Invalid recipient kind: ') . $kind;\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        if (!$this->validateAddress($address)) {\n            $error_message = $this->lang('invalid_address') . $address;\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        if ($kind != 'Reply-To') {\n            if (!array_key_exists(strtolower($address), $this->all_recipients)) {\n                array_push($this->$kind, array($address, $name));\n                $this->all_recipients[strtolower($address)] = true;\n                return true;\n            }\n        } else {\n            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {\n                $this->ReplyTo[strtolower($address)] = array($address, $name);\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Set the From and FromName properties.\n     * @param string $address\n     * @param string $name\n     * @param boolean $auto Whether to also set the Sender address, defaults to true\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function setFrom($address, $name = '', $auto = true)\n    {\n        $address = trim($address);\n        $name = trim(preg_replace('/[\\r\\n]+/', '', $name)); //Strip breaks and trim\n        // Don't validate now addresses with IDN. Will be done in send().\n        if (($pos = strrpos($address, '@')) === false or\n            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and\n            !$this->validateAddress($address)) {\n            $error_message = $this->lang('invalid_address') . $address;\n            $this->setError($error_message);\n            $this->edebug($error_message);\n            if ($this->exceptions) {\n                throw new phpmailerException($error_message);\n            }\n            return false;\n        }\n        $this->From = $address;\n        $this->FromName = $name;\n        if ($auto) {\n            if (empty($this->Sender)) {\n                $this->Sender = $address;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Return the Message-ID header of the last email.\n     * Technically this is the value from the last time the headers were created,\n     * but it's also the message ID of the last sent message except in\n     * pathological cases.\n     * @return string\n     */\n    public function getLastMessageID()\n    {\n        return $this->lastMessageID;\n    }\n\n    /**\n     * Check that a string looks like an email address.\n     * @param string $address The email address to check\n     * @param string $patternselect A selector for the validation pattern to use :\n     * * `auto` Pick best pattern automatically;\n     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;\n     * * `pcre` Use old PCRE implementation;\n     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;\n     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.\n     * * `noregex` Don't use a regex: super fast, really dumb.\n     * @return boolean\n     * @static\n     * @access public\n     */\n    public static function validateAddress($address, $patternselect = 'auto')\n    {\n        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321\n        if (strpos($address, \"\\n\") !== false or strpos($address, \"\\r\") !== false) {\n            return false;\n        }\n        if (!$patternselect or $patternselect == 'auto') {\n            //Check this constant first so it works when extension_loaded() is disabled by safe mode\n            //Constant was added in PHP 5.2.4\n            if (defined('PCRE_VERSION')) {\n                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2\n                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {\n                    $patternselect = 'pcre8';\n                } else {\n                    $patternselect = 'pcre';\n                }\n            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {\n                //Fall back to older PCRE\n                $patternselect = 'pcre';\n            } else {\n                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension\n                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {\n                    $patternselect = 'php';\n                } else {\n                    $patternselect = 'noregex';\n                }\n            }\n        }\n        switch ($patternselect) {\n            case 'pcre8':\n                /**\n                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.\n                 * @link http://squiloople.com/2009/12/20/email-address-validation/\n                 * @copyright 2009-2010 Michael Rushton\n                 * Feel free to use and redistribute this code. But please keep this copyright notice.\n                 */\n                return (boolean)preg_match(\n                    '/^(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){255,})(?!(?>(?1)\"?(?>\\\\\\[ -~]|[^\"])\"?(?1)){65,}@)' .\n                    '((?>(?>(?>((?>(?>(?>\\x0D\\x0A)?[\\t ])+|(?>[\\t ]*\\x0D\\x0A)?[\\t ]+)?)(\\((?>(?2)' .\n                    '(?>[\\x01-\\x08\\x0B\\x0C\\x0E-\\'*-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]|(?3)))*(?2)\\)))+(?2))|(?2))?)' .\n                    '([!#-\\'*+\\/-9=?^-~-]+|\"(?>(?2)(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\x7F]))*' .\n                    '(?2)\")(?>(?1)\\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .\n                    '(?>(?1)\\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .\n                    '|(?!(?:.*[a-f0-9][:\\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .\n                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n                    '|[1-9]?[0-9])(?>\\.(?9)){3}))\\])(?1)$/isD',\n                    $address\n                );\n            case 'pcre':\n                //An older regex that doesn't need a recent PCRE\n                return (boolean)preg_match(\n                    '/^(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){255,})(?!(?>\"?(?>\\\\\\[ -~]|[^\"])\"?){65,}@)(?>' .\n                    '[!#-\\'*+\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\")' .\n                    '(?>\\.(?>[!#-\\'*+\\/-9=?^-~-]+|\"(?>(?>[\\x01-\\x08\\x0B\\x0C\\x0E-!#-\\[\\]-\\x7F]|\\\\\\[\\x00-\\xFF]))*\"))*' .\n                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\\.(?![a-z0-9-]{64,})' .\n                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .\n                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .\n                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .\n                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .\n                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .\n                    '|[1-9]?[0-9])(?>\\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\\])$/isD',\n                    $address\n                );\n            case 'html5':\n                /**\n                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.\n                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)\n                 */\n                return (boolean)preg_match(\n                    '/^[a-zA-Z0-9.!#$%&\\'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .\n                    '[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',\n                    $address\n                );\n            case 'noregex':\n                //No PCRE! Do something _very_ approximate!\n                //Check the address is 3 chars or longer and contains an @ that's not the first or last char\n                return (strlen($address) >= 3\n                    and strpos($address, '@') >= 1\n                    and strpos($address, '@') != strlen($address) - 1);\n            case 'php':\n            default:\n                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);\n        }\n    }\n\n    /**\n     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the\n     * \"intl\" and \"mbstring\" PHP extensions.\n     * @return bool \"true\" if required functions for IDN support are present\n     */\n    public function idnSupported()\n    {\n        // @TODO: Write our own \"idn_to_ascii\" function for PHP <= 5.2.\n        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');\n    }\n\n    /**\n     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.\n     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.\n     * This function silently returns unmodified address if:\n     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)\n     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)\n     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)\n     * @see PHPMailer::$CharSet\n     * @param string $address The email address to convert\n     * @return string The encoded address in ASCII form\n     */\n    public function punyencodeAddress($address)\n    {\n        // Verify we have required functions, CharSet, and at-sign.\n        if ($this->idnSupported() and\n            !empty($this->CharSet) and\n            ($pos = strrpos($address, '@')) !== false) {\n            $domain = substr($address, ++$pos);\n            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.\n            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {\n                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);\n                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?\n                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :\n                    idn_to_ascii($domain)) !== false) {\n                    return substr($address, 0, $pos) . $punycode;\n                }\n            }\n        }\n        return $address;\n    }\n\n    /**\n     * Create a message and send it.\n     * Uses the sending method specified by $Mailer.\n     * @throws phpmailerException\n     * @return boolean false on error - See the ErrorInfo property for details of the error.\n     */\n    public function send()\n    {\n        try {\n            if (!$this->preSend()) {\n                return false;\n            }\n            return $this->postSend();\n        } catch (phpmailerException $exc) {\n            $this->mailHeader = '';\n            $this->setError($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n    }\n\n    /**\n     * Prepare a message for sending.\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function preSend()\n    {\n        try {\n            $this->error_count = 0; // Reset errors\n            $this->mailHeader = '';\n\n            // Dequeue recipient and Reply-To addresses with IDN\n            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {\n                $params[1] = $this->punyencodeAddress($params[1]);\n                call_user_func_array(array($this, 'addAnAddress'), $params);\n            }\n            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {\n                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);\n            }\n\n            // Validate From, Sender, and ConfirmReadingTo addresses\n            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {\n                $this->$address_kind = trim($this->$address_kind);\n                if (empty($this->$address_kind)) {\n                    continue;\n                }\n                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);\n                if (!$this->validateAddress($this->$address_kind)) {\n                    $error_message = $this->lang('invalid_address') . $this->$address_kind;\n                    $this->setError($error_message);\n                    $this->edebug($error_message);\n                    if ($this->exceptions) {\n                        throw new phpmailerException($error_message);\n                    }\n                    return false;\n                }\n            }\n\n            // Set whether the message is multipart/alternative\n            if (!empty($this->AltBody)) {\n                $this->ContentType = 'multipart/alternative';\n            }\n\n            $this->setMessageType();\n            // Refuse to send an empty message unless we are specifically allowing it\n            if (!$this->AllowEmpty and empty($this->Body)) {\n                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);\n            }\n\n            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)\n            $this->MIMEHeader = '';\n            $this->MIMEBody = $this->createBody();\n            // createBody may have added some headers, so retain them\n            $tempheaders = $this->MIMEHeader;\n            $this->MIMEHeader = $this->createHeader();\n            $this->MIMEHeader .= $tempheaders;\n\n            // To capture the complete message when using mail(), create\n            // an extra header list which createHeader() doesn't fold in\n            if ($this->Mailer == 'mail') {\n                if (count($this->to) > 0) {\n                    $this->mailHeader .= $this->addrAppend('To', $this->to);\n                } else {\n                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');\n                }\n                $this->mailHeader .= $this->headerLine(\n                    'Subject',\n                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))\n                );\n            }\n\n            // Sign with DKIM if enabled\n            if (!empty($this->DKIM_domain)\n                && !empty($this->DKIM_private)\n                && !empty($this->DKIM_selector)\n                && file_exists($this->DKIM_private)) {\n                $header_dkim = $this->DKIM_Add(\n                    $this->MIMEHeader . $this->mailHeader,\n                    $this->encodeHeader($this->secureHeader($this->Subject)),\n                    $this->MIMEBody\n                );\n                $this->MIMEHeader = rtrim($this->MIMEHeader, \"\\r\\n \") . self::CRLF .\n                    str_replace(\"\\r\\n\", \"\\n\", $header_dkim) . self::CRLF;\n            }\n            return true;\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n    }\n\n    /**\n     * Actually send a message.\n     * Send the email via the selected mechanism\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function postSend()\n    {\n        try {\n            // Choose the mailer and send through it\n            switch ($this->Mailer) {\n                case 'sendmail':\n                case 'qmail':\n                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);\n                case 'smtp':\n                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);\n                case 'mail':\n                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n                default:\n                    $sendMethod = $this->Mailer.'Send';\n                    if (method_exists($this, $sendMethod)) {\n                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);\n                    }\n\n                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);\n            }\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Send mail using the $Sendmail program.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @see PHPMailer::$Sendmail\n     * @throws phpmailerException\n     * @access protected\n     * @return boolean\n     */\n    protected function sendmailSend($header, $body)\n    {\n        if ($this->Sender != '') {\n            if ($this->Mailer == 'qmail') {\n                $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));\n            } else {\n                $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));\n            }\n        } else {\n            if ($this->Mailer == 'qmail') {\n                $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));\n            } else {\n                $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail));\n            }\n        }\n        if ($this->SingleTo) {\n            foreach ($this->SingleToArray as $toAddr) {\n                if (!@$mail = popen($sendmail, 'w')) {\n                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n                }\n                fputs($mail, 'To: ' . $toAddr . \"\\n\");\n                fputs($mail, $header);\n                fputs($mail, $body);\n                $result = pclose($mail);\n                $this->doCallback(\n                    ($result == 0),\n                    array($toAddr),\n                    $this->cc,\n                    $this->bcc,\n                    $this->Subject,\n                    $body,\n                    $this->From\n                );\n                if ($result != 0) {\n                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n                }\n            }\n        } else {\n            if (!@$mail = popen($sendmail, 'w')) {\n                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n            }\n            fputs($mail, $header);\n            fputs($mail, $body);\n            $result = pclose($mail);\n            $this->doCallback(\n                ($result == 0),\n                $this->to,\n                $this->cc,\n                $this->bcc,\n                $this->Subject,\n                $body,\n                $this->From\n            );\n            if ($result != 0) {\n                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);\n            }\n        }\n        return true;\n    }\n\n    /**\n     * Send mail using the PHP mail() function.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @link http://www.php.net/manual/en/book.mail.php\n     * @throws phpmailerException\n     * @access protected\n     * @return boolean\n     */\n    protected function mailSend($header, $body)\n    {\n        $toArr = array();\n        foreach ($this->to as $toaddr) {\n            $toArr[] = $this->addrFormat($toaddr);\n        }\n        $to = implode(', ', $toArr);\n\n        if (empty($this->Sender)) {\n            $params = ' ';\n        } else {\n            $params = sprintf('-f%s', $this->Sender);\n        }\n        if ($this->Sender != '' and !ini_get('safe_mode')) {\n            $old_from = ini_get('sendmail_from');\n            ini_set('sendmail_from', $this->Sender);\n        }\n        $result = false;\n        if ($this->SingleTo && count($toArr) > 1) {\n            foreach ($toArr as $toAddr) {\n                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);\n                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n            }\n        } else {\n            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);\n            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);\n        }\n        if (isset($old_from)) {\n            ini_set('sendmail_from', $old_from);\n        }\n        if (!$result) {\n            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);\n        }\n        return true;\n    }\n\n    /**\n     * Get an instance to use for SMTP operations.\n     * Override this function to load your own SMTP implementation\n     * @return SMTP\n     */\n    public function getSMTPInstance()\n    {\n        if (!is_object($this->smtp)) {\n        \trequire_once( 'class-smtp.php' );\n            $this->smtp = new SMTP;\n        }\n        return $this->smtp;\n    }\n\n    /**\n     * Send mail via SMTP.\n     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.\n     * Uses the PHPMailerSMTP class by default.\n     * @see PHPMailer::getSMTPInstance() to use a different class.\n     * @param string $header The message headers\n     * @param string $body The message body\n     * @throws phpmailerException\n     * @uses SMTP\n     * @access protected\n     * @return boolean\n     */\n    protected function smtpSend($header, $body)\n    {\n        $bad_rcpt = array();\n        if (!$this->smtpConnect($this->SMTPOptions)) {\n            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);\n        }\n        if ('' == $this->Sender) {\n            $smtp_from = $this->From;\n        } else {\n            $smtp_from = $this->Sender;\n        }\n        if (!$this->smtp->mail($smtp_from)) {\n            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));\n            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);\n        }\n\n        // Attempt to send to all recipients\n        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {\n            foreach ($togroup as $to) {\n                if (!$this->smtp->recipient($to[0])) {\n                    $error = $this->smtp->getError();\n                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);\n                    $isSent = false;\n                } else {\n                    $isSent = true;\n                }\n                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);\n            }\n        }\n\n        // Only send the DATA command if we have viable recipients\n        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {\n            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);\n        }\n        if ($this->SMTPKeepAlive) {\n            $this->smtp->reset();\n        } else {\n            $this->smtp->quit();\n            $this->smtp->close();\n        }\n        //Create error message for any bad addresses\n        if (count($bad_rcpt) > 0) {\n            $errstr = '';\n            foreach ($bad_rcpt as $bad) {\n                $errstr .= $bad['to'] . ': ' . $bad['error'];\n            }\n            throw new phpmailerException(\n                $this->lang('recipients_failed') . $errstr,\n                self::STOP_CONTINUE\n            );\n        }\n        return true;\n    }\n\n    /**\n     * Initiate a connection to an SMTP server.\n     * Returns false if the operation failed.\n     * @param array $options An array of options compatible with stream_context_create()\n     * @uses SMTP\n     * @access public\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function smtpConnect($options = array())\n    {\n        if (is_null($this->smtp)) {\n            $this->smtp = $this->getSMTPInstance();\n        }\n\n        // Already connected?\n        if ($this->smtp->connected()) {\n            return true;\n        }\n\n        $this->smtp->setTimeout($this->Timeout);\n        $this->smtp->setDebugLevel($this->SMTPDebug);\n        $this->smtp->setDebugOutput($this->Debugoutput);\n        $this->smtp->setVerp($this->do_verp);\n        $hosts = explode(';', $this->Host);\n        $lastexception = null;\n\n        foreach ($hosts as $hostentry) {\n            $hostinfo = array();\n            if (!preg_match('/^((ssl|tls):\\/\\/)*([a-zA-Z0-9\\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {\n                // Not a valid host entry\n                continue;\n            }\n            // $hostinfo[2]: optional ssl or tls prefix\n            // $hostinfo[3]: the hostname\n            // $hostinfo[4]: optional port number\n            // The host string prefix can temporarily override the current setting for SMTPSecure\n            // If it's not specified, the default value is used\n            $prefix = '';\n            $secure = $this->SMTPSecure;\n            $tls = ($this->SMTPSecure == 'tls');\n            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {\n                $prefix = 'ssl://';\n                $tls = false; // Can't have SSL and TLS at the same time\n                $secure = 'ssl';\n            } elseif ($hostinfo[2] == 'tls') {\n                $tls = true;\n                // tls doesn't use a prefix\n                $secure = 'tls';\n            }\n            //Do we need the OpenSSL extension?\n            $sslext = defined('OPENSSL_ALGO_SHA1');\n            if ('tls' === $secure or 'ssl' === $secure) {\n                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled\n                if (!$sslext) {\n                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);\n                }\n            }\n            $host = $hostinfo[3];\n            $port = $this->Port;\n            $tport = (integer)$hostinfo[4];\n            if ($tport > 0 and $tport < 65536) {\n                $port = $tport;\n            }\n            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {\n                try {\n                    if ($this->Helo) {\n                        $hello = $this->Helo;\n                    } else {\n                        $hello = $this->serverHostname();\n                    }\n                    $this->smtp->hello($hello);\n                    //Automatically enable TLS encryption if:\n                    // * it's not disabled\n                    // * we have openssl extension\n                    // * we are not already using SSL\n                    // * the server offers STARTTLS\n                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {\n                        $tls = true;\n                    }\n                    if ($tls) {\n                        if (!$this->smtp->startTLS()) {\n                            throw new phpmailerException($this->lang('connect_host'));\n                        }\n                        // We must resend HELO after tls negotiation\n                        $this->smtp->hello($hello);\n                    }\n                    if ($this->SMTPAuth) {\n                        if (!$this->smtp->authenticate(\n                            $this->Username,\n                            $this->Password,\n                            $this->AuthType,\n                            $this->Realm,\n                            $this->Workstation\n                        )\n                        ) {\n                            throw new phpmailerException($this->lang('authenticate'));\n                        }\n                    }\n                    return true;\n                } catch (phpmailerException $exc) {\n                    $lastexception = $exc;\n                    $this->edebug($exc->getMessage());\n                    // We must have connected, but then failed TLS or Auth, so close connection nicely\n                    $this->smtp->quit();\n                }\n            }\n        }\n        // If we get here, all connection attempts have failed, so close connection hard\n        $this->smtp->close();\n        // As we've caught all exceptions, just report whatever the last one was\n        if ($this->exceptions and !is_null($lastexception)) {\n            throw $lastexception;\n        }\n        return false;\n    }\n\n    /**\n     * Close the active SMTP session if one exists.\n     * @return void\n     */\n    public function smtpClose()\n    {\n        if ($this->smtp !== null) {\n            if ($this->smtp->connected()) {\n                $this->smtp->quit();\n                $this->smtp->close();\n            }\n        }\n    }\n\n    /**\n     * Set the language for error messages.\n     * Returns false if it cannot load the language file.\n     * The default language is English.\n     * @param string $langcode ISO 639-1 2-character language code (e.g. French is \"fr\")\n     * @param string $lang_path Path to the language file directory, with trailing separator (slash)\n     * @return boolean\n     * @access public\n     */\n    public function setLanguage($langcode = 'en', $lang_path = '')\n    {\n        // Define full set of translatable strings in English\n        $PHPMAILER_LANG = array(\n            'authenticate' => 'SMTP Error: Could not authenticate.',\n            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',\n            'data_not_accepted' => 'SMTP Error: data not accepted.',\n            'empty_message' => 'Message body empty',\n            'encoding' => 'Unknown encoding: ',\n            'execute' => 'Could not execute: ',\n            'file_access' => 'Could not access file: ',\n            'file_open' => 'File Error: Could not open file: ',\n            'from_failed' => 'The following From address failed: ',\n            'instantiate' => 'Could not instantiate mail function.',\n            'invalid_address' => 'Invalid address: ',\n            'mailer_not_supported' => ' mailer is not supported.',\n            'provide_address' => 'You must provide at least one recipient email address.',\n            'recipients_failed' => 'SMTP Error: The following recipients failed: ',\n            'signing' => 'Signing Error: ',\n            'smtp_connect_failed' => 'SMTP connect() failed.',\n            'smtp_error' => 'SMTP server error: ',\n            'variable_set' => 'Cannot set or reset variable: ',\n            'extension_missing' => 'Extension missing: '\n        );\n        if (empty($lang_path)) {\n            // Calculate an absolute path so it can work if CWD is not here\n            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;\n        }\n        $foundlang = true;\n        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';\n        // There is no English translation file\n        if ($langcode != 'en') {\n            // Make sure language file path is readable\n            if (!is_readable($lang_file)) {\n                $foundlang = false;\n            } else {\n                // Overwrite language-specific strings.\n                // This way we'll never have missing translation keys.\n                $foundlang = include $lang_file;\n            }\n        }\n        $this->language = $PHPMAILER_LANG;\n        return (boolean)$foundlang; // Returns false if language not found\n    }\n\n    /**\n     * Get the array of strings for the current language.\n     * @return array\n     */\n    public function getTranslations()\n    {\n        return $this->language;\n    }\n\n    /**\n     * Create recipient headers.\n     * @access public\n     * @param string $type\n     * @param array $addr An array of recipient,\n     * where each recipient is a 2-element indexed array with element 0 containing an address\n     * and element 1 containing a name, like:\n     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))\n     * @return string\n     */\n    public function addrAppend($type, $addr)\n    {\n        $addresses = array();\n        foreach ($addr as $address) {\n            $addresses[] = $this->addrFormat($address);\n        }\n        return $type . ': ' . implode(', ', $addresses) . $this->LE;\n    }\n\n    /**\n     * Format an address for use in a message header.\n     * @access public\n     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name\n     *      like array('joe@example.com', 'Joe User')\n     * @return string\n     */\n    public function addrFormat($addr)\n    {\n        if (empty($addr[1])) { // No name provided\n            return $this->secureHeader($addr[0]);\n        } else {\n            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(\n                $addr[0]\n            ) . '>';\n        }\n    }\n\n    /**\n     * Word-wrap message.\n     * For use with mailers that do not automatically perform wrapping\n     * and for quoted-printable encoded messages.\n     * Original written by philippe.\n     * @param string $message The message to wrap\n     * @param integer $length The line length to wrap to\n     * @param boolean $qp_mode Whether to run in Quoted-Printable mode\n     * @access public\n     * @return string\n     */\n    public function wrapText($message, $length, $qp_mode = false)\n    {\n        if ($qp_mode) {\n            $soft_break = sprintf(' =%s', $this->LE);\n        } else {\n            $soft_break = $this->LE;\n        }\n        // If utf-8 encoding is used, we will need to make sure we don't\n        // split multibyte characters when we wrap\n        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');\n        $lelen = strlen($this->LE);\n        $crlflen = strlen(self::CRLF);\n\n        $message = $this->fixEOL($message);\n        //Remove a trailing line break\n        if (substr($message, -$lelen) == $this->LE) {\n            $message = substr($message, 0, -$lelen);\n        }\n\n        //Split message into lines\n        $lines = explode($this->LE, $message);\n        //Message will be rebuilt in here\n        $message = '';\n        foreach ($lines as $line) {\n            $words = explode(' ', $line);\n            $buf = '';\n            $firstword = true;\n            foreach ($words as $word) {\n                if ($qp_mode and (strlen($word) > $length)) {\n                    $space_left = $length - strlen($buf) - $crlflen;\n                    if (!$firstword) {\n                        if ($space_left > 20) {\n                            $len = $space_left;\n                            if ($is_utf8) {\n                                $len = $this->utf8CharBoundary($word, $len);\n                            } elseif (substr($word, $len - 1, 1) == '=') {\n                                $len--;\n                            } elseif (substr($word, $len - 2, 1) == '=') {\n                                $len -= 2;\n                            }\n                            $part = substr($word, 0, $len);\n                            $word = substr($word, $len);\n                            $buf .= ' ' . $part;\n                            $message .= $buf . sprintf('=%s', self::CRLF);\n                        } else {\n                            $message .= $buf . $soft_break;\n                        }\n                        $buf = '';\n                    }\n                    while (strlen($word) > 0) {\n                        if ($length <= 0) {\n                            break;\n                        }\n                        $len = $length;\n                        if ($is_utf8) {\n                            $len = $this->utf8CharBoundary($word, $len);\n                        } elseif (substr($word, $len - 1, 1) == '=') {\n                            $len--;\n                        } elseif (substr($word, $len - 2, 1) == '=') {\n                            $len -= 2;\n                        }\n                        $part = substr($word, 0, $len);\n                        $word = substr($word, $len);\n\n                        if (strlen($word) > 0) {\n                            $message .= $part . sprintf('=%s', self::CRLF);\n                        } else {\n                            $buf = $part;\n                        }\n                    }\n                } else {\n                    $buf_o = $buf;\n                    if (!$firstword) {\n                        $buf .= ' ';\n                    }\n                    $buf .= $word;\n\n                    if (strlen($buf) > $length and $buf_o != '') {\n                        $message .= $buf_o . $soft_break;\n                        $buf = $word;\n                    }\n                }\n                $firstword = false;\n            }\n            $message .= $buf . self::CRLF;\n        }\n\n        return $message;\n    }\n\n    /**\n     * Find the last character boundary prior to $maxLength in a utf-8\n     * quoted-printable encoded string.\n     * Original written by Colin Brown.\n     * @access public\n     * @param string $encodedText utf-8 QP text\n     * @param integer $maxLength Find the last character boundary prior to this length\n     * @return integer\n     */\n    public function utf8CharBoundary($encodedText, $maxLength)\n    {\n        $foundSplitPos = false;\n        $lookBack = 3;\n        while (!$foundSplitPos) {\n            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);\n            $encodedCharPos = strpos($lastChunk, '=');\n            if (false !== $encodedCharPos) {\n                // Found start of encoded character byte within $lookBack block.\n                // Check the encoded byte value (the 2 chars after the '=')\n                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);\n                $dec = hexdec($hex);\n                if ($dec < 128) {\n                    // Single byte character.\n                    // If the encoded char was found at pos 0, it will fit\n                    // otherwise reduce maxLength to start of the encoded char\n                    if ($encodedCharPos > 0) {\n                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n                    }\n                    $foundSplitPos = true;\n                } elseif ($dec >= 192) {\n                    // First byte of a multi byte character\n                    // Reduce maxLength to split at start of character\n                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);\n                    $foundSplitPos = true;\n                } elseif ($dec < 192) {\n                    // Middle byte of a multi byte character, look further back\n                    $lookBack += 3;\n                }\n            } else {\n                // No encoded character found\n                $foundSplitPos = true;\n            }\n        }\n        return $maxLength;\n    }\n\n    /**\n     * Apply word wrapping to the message body.\n     * Wraps the message body to the number of chars set in the WordWrap property.\n     * You should only do this to plain-text bodies as wrapping HTML tags may break them.\n     * This is called automatically by createBody(), so you don't need to call it yourself.\n     * @access public\n     * @return void\n     */\n    public function setWordWrap()\n    {\n        if ($this->WordWrap < 1) {\n            return;\n        }\n\n        switch ($this->message_type) {\n            case 'alt':\n            case 'alt_inline':\n            case 'alt_attach':\n            case 'alt_inline_attach':\n                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);\n                break;\n            default:\n                $this->Body = $this->wrapText($this->Body, $this->WordWrap);\n                break;\n        }\n    }\n\n    /**\n     * Assemble message headers.\n     * @access public\n     * @return string The assembled headers\n     */\n    public function createHeader()\n    {\n        $result = '';\n\n        if ($this->MessageDate == '') {\n            $this->MessageDate = self::rfcDate();\n        }\n        $result .= $this->headerLine('Date', $this->MessageDate);\n\n        // To be created automatically by mail()\n        if ($this->SingleTo) {\n            if ($this->Mailer != 'mail') {\n                foreach ($this->to as $toaddr) {\n                    $this->SingleToArray[] = $this->addrFormat($toaddr);\n                }\n            }\n        } else {\n            if (count($this->to) > 0) {\n                if ($this->Mailer != 'mail') {\n                    $result .= $this->addrAppend('To', $this->to);\n                }\n            } elseif (count($this->cc) == 0) {\n                $result .= $this->headerLine('To', 'undisclosed-recipients:;');\n            }\n        }\n\n        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));\n\n        // sendmail and mail() extract Cc from the header before sending\n        if (count($this->cc) > 0) {\n            $result .= $this->addrAppend('Cc', $this->cc);\n        }\n\n        // sendmail and mail() extract Bcc from the header before sending\n        if ((\n                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'\n            )\n            and count($this->bcc) > 0\n        ) {\n            $result .= $this->addrAppend('Bcc', $this->bcc);\n        }\n\n        if (count($this->ReplyTo) > 0) {\n            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);\n        }\n\n        // mail() sets the subject itself\n        if ($this->Mailer != 'mail') {\n            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));\n        }\n\n        if ($this->MessageID != '') {\n            $this->lastMessageID = $this->MessageID;\n        } else {\n            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());\n        }\n        $result .= $this->headerLine('Message-ID', $this->lastMessageID);\n        if (!is_null($this->Priority)) {\n            $result .= $this->headerLine('X-Priority', $this->Priority);\n        }\n        if ($this->XMailer == '') {\n            $result .= $this->headerLine(\n                'X-Mailer',\n                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'\n            );\n        } else {\n            $myXmailer = trim($this->XMailer);\n            if ($myXmailer) {\n                $result .= $this->headerLine('X-Mailer', $myXmailer);\n            }\n        }\n\n        if ($this->ConfirmReadingTo != '') {\n            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');\n        }\n\n        // Add custom headers\n        foreach ($this->CustomHeader as $header) {\n            $result .= $this->headerLine(\n                trim($header[0]),\n                $this->encodeHeader(trim($header[1]))\n            );\n        }\n        if (!$this->sign_key_file) {\n            $result .= $this->headerLine('MIME-Version', '1.0');\n            $result .= $this->getMailMIME();\n        }\n\n        return $result;\n    }\n\n    /**\n     * Get the message MIME type headers.\n     * @access public\n     * @return string\n     */\n    public function getMailMIME()\n    {\n        $result = '';\n        $ismultipart = true;\n        switch ($this->message_type) {\n            case 'inline':\n                $result .= $this->headerLine('Content-Type', 'multipart/related;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            case 'attach':\n            case 'inline_attach':\n            case 'alt_attach':\n            case 'alt_inline_attach':\n                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            case 'alt':\n            case 'alt_inline':\n                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $result .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[1] . '\"');\n                break;\n            default:\n                // Catches case 'plain': and case '':\n                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);\n                $ismultipart = false;\n                break;\n        }\n        // RFC1341 part 5 says 7bit is assumed if not specified\n        if ($this->Encoding != '7bit') {\n            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE\n            if ($ismultipart) {\n                if ($this->Encoding == '8bit') {\n                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');\n                }\n                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible\n            } else {\n                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);\n            }\n        }\n\n        if ($this->Mailer != 'mail') {\n            $result .= $this->LE;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Returns the whole MIME message.\n     * Includes complete headers and body.\n     * Only valid post preSend().\n     * @see PHPMailer::preSend()\n     * @access public\n     * @return string\n     */\n    public function getSentMIMEMessage()\n    {\n        return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody;\n    }\n\n    /**\n     * Assemble the message body.\n     * Returns an empty string on failure.\n     * @access public\n     * @throws phpmailerException\n     * @return string The assembled message body\n     */\n    public function createBody()\n    {\n        $body = '';\n        //Create unique IDs and preset boundaries\n        $this->uniqueid = md5(uniqid(time()));\n        $this->boundary[1] = 'b1_' . $this->uniqueid;\n        $this->boundary[2] = 'b2_' . $this->uniqueid;\n        $this->boundary[3] = 'b3_' . $this->uniqueid;\n\n        if ($this->sign_key_file) {\n            $body .= $this->getMailMIME() . $this->LE;\n        }\n\n        $this->setWordWrap();\n\n        $bodyEncoding = $this->Encoding;\n        $bodyCharSet = $this->CharSet;\n        //Can we do a 7-bit downgrade?\n        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {\n            $bodyEncoding = '7bit';\n            $bodyCharSet = 'us-ascii';\n        }\n        //If lines are too long, change to quoted-printable transfer encoding\n        if (self::hasLineLongerThanMax($this->Body)) {\n            $this->Encoding = 'quoted-printable';\n            $bodyEncoding = 'quoted-printable';\n        }\n\n        $altBodyEncoding = $this->Encoding;\n        $altBodyCharSet = $this->CharSet;\n        //Can we do a 7-bit downgrade?\n        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {\n            $altBodyEncoding = '7bit';\n            $altBodyCharSet = 'us-ascii';\n        }\n        //If lines are too long, change to quoted-printable transfer encoding\n        if (self::hasLineLongerThanMax($this->AltBody)) {\n            $altBodyEncoding = 'quoted-printable';\n        }\n        //Use this as a preamble in all multipart message types\n        $mimepre = \"This is a multi-part message in MIME format.\" . $this->LE . $this->LE;\n        switch ($this->message_type) {\n            case 'inline':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[1]);\n                break;\n            case 'attach':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'inline_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'alt':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                if (!empty($this->Ical)) {\n                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');\n                    $body .= $this->encodeString($this->Ical, $this->Encoding);\n                    $body .= $this->LE . $this->LE;\n                }\n                $body .= $this->endBoundary($this->boundary[1]);\n                break;\n            case 'alt_inline':\n                $body .= $mimepre;\n                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->endBoundary($this->boundary[1]);\n                break;\n            case 'alt_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->endBoundary($this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            case 'alt_inline_attach':\n                $body .= $mimepre;\n                $body .= $this->textLine('--' . $this->boundary[1]);\n                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[2] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);\n                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->textLine('--' . $this->boundary[2]);\n                $body .= $this->headerLine('Content-Type', 'multipart/related;');\n                $body .= $this->textLine(\"\\tboundary=\\\"\" . $this->boundary[3] . '\"');\n                $body .= $this->LE;\n                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                $body .= $this->LE . $this->LE;\n                $body .= $this->attachAll('inline', $this->boundary[3]);\n                $body .= $this->LE;\n                $body .= $this->endBoundary($this->boundary[2]);\n                $body .= $this->LE;\n                $body .= $this->attachAll('attachment', $this->boundary[1]);\n                break;\n            default:\n                // catch case 'plain' and case ''\n                $body .= $this->encodeString($this->Body, $bodyEncoding);\n                break;\n        }\n\n        if ($this->isError()) {\n            $body = '';\n        } elseif ($this->sign_key_file) {\n            try {\n                if (!defined('PKCS7_TEXT')) {\n                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n                }\n                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1\n                $file = tempnam(sys_get_temp_dir(), 'mail');\n                if (false === file_put_contents($file, $body)) {\n                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');\n                }\n                $signed = tempnam(sys_get_temp_dir(), 'signed');\n                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197\n                if (empty($this->sign_extracerts_file)) {\n                    $sign = @openssl_pkcs7_sign(\n                        $file,\n                        $signed,\n                        'file://' . realpath($this->sign_cert_file),\n                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),\n                        null\n                    );\n                } else {\n                    $sign = @openssl_pkcs7_sign(\n                        $file,\n                        $signed,\n                        'file://' . realpath($this->sign_cert_file),\n                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),\n                        null,\n                        PKCS7_DETACHED,\n                        $this->sign_extracerts_file\n                    );\n                }\n                if ($sign) {\n                    @unlink($file);\n                    $body = file_get_contents($signed);\n                    @unlink($signed);\n                    //The message returned by openssl contains both headers and body, so need to split them up\n                    $parts = explode(\"\\n\\n\", $body, 2);\n                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;\n                    $body = $parts[1];\n                } else {\n                    @unlink($file);\n                    @unlink($signed);\n                    throw new phpmailerException($this->lang('signing') . openssl_error_string());\n                }\n            } catch (phpmailerException $exc) {\n                $body = '';\n                if ($this->exceptions) {\n                    throw $exc;\n                }\n            }\n        }\n        return $body;\n    }\n\n    /**\n     * Return the start of a message boundary.\n     * @access protected\n     * @param string $boundary\n     * @param string $charSet\n     * @param string $contentType\n     * @param string $encoding\n     * @return string\n     */\n    protected function getBoundary($boundary, $charSet, $contentType, $encoding)\n    {\n        $result = '';\n        if ($charSet == '') {\n            $charSet = $this->CharSet;\n        }\n        if ($contentType == '') {\n            $contentType = $this->ContentType;\n        }\n        if ($encoding == '') {\n            $encoding = $this->Encoding;\n        }\n        $result .= $this->textLine('--' . $boundary);\n        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);\n        $result .= $this->LE;\n        // RFC1341 part 5 says 7bit is assumed if not specified\n        if ($encoding != '7bit') {\n            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);\n        }\n        $result .= $this->LE;\n\n        return $result;\n    }\n\n    /**\n     * Return the end of a message boundary.\n     * @access protected\n     * @param string $boundary\n     * @return string\n     */\n    protected function endBoundary($boundary)\n    {\n        return $this->LE . '--' . $boundary . '--' . $this->LE;\n    }\n\n    /**\n     * Set the message type.\n     * PHPMailer only supports some preset message types,\n     * not arbitrary MIME structures.\n     * @access protected\n     * @return void\n     */\n    protected function setMessageType()\n    {\n        $type = array();\n        if ($this->alternativeExists()) {\n            $type[] = 'alt';\n        }\n        if ($this->inlineImageExists()) {\n            $type[] = 'inline';\n        }\n        if ($this->attachmentExists()) {\n            $type[] = 'attach';\n        }\n        $this->message_type = implode('_', $type);\n        if ($this->message_type == '') {\n            $this->message_type = 'plain';\n        }\n    }\n\n    /**\n     * Format a header line.\n     * @access public\n     * @param string $name\n     * @param string $value\n     * @return string\n     */\n    public function headerLine($name, $value)\n    {\n        return $name . ': ' . $value . $this->LE;\n    }\n\n    /**\n     * Return a formatted mail line.\n     * @access public\n     * @param string $value\n     * @return string\n     */\n    public function textLine($value)\n    {\n        return $value . $this->LE;\n    }\n\n    /**\n     * Add an attachment from a path on the filesystem.\n     * Returns false if the file could not be found or read.\n     * @param string $path Path to the attachment.\n     * @param string $name Overrides the attachment name.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File extension (MIME) type.\n     * @param string $disposition Disposition to use\n     * @throws phpmailerException\n     * @return boolean\n     */\n    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')\n    {\n        try {\n            if (!@is_file($path)) {\n                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);\n            }\n\n            // If a MIME type is not specified, try to work it out from the file name\n            if ($type == '') {\n                $type = self::filenameToType($path);\n            }\n\n            $filename = basename($path);\n            if ($name == '') {\n                $name = $filename;\n            }\n\n            $this->attachment[] = array(\n                0 => $path,\n                1 => $filename,\n                2 => $name,\n                3 => $encoding,\n                4 => $type,\n                5 => false, // isStringAttachment\n                6 => $disposition,\n                7 => 0\n            );\n\n        } catch (phpmailerException $exc) {\n            $this->setError($exc->getMessage());\n            $this->edebug($exc->getMessage());\n            if ($this->exceptions) {\n                throw $exc;\n            }\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Return the array of attachments.\n     * @return array\n     */\n    public function getAttachments()\n    {\n        return $this->attachment;\n    }\n\n    /**\n     * Attach all file, string, and binary attachments to the message.\n     * Returns an empty string on failure.\n     * @access protected\n     * @param string $disposition_type\n     * @param string $boundary\n     * @return string\n     */\n    protected function attachAll($disposition_type, $boundary)\n    {\n        // Return text of body\n        $mime = array();\n        $cidUniq = array();\n        $incl = array();\n\n        // Add all attachments\n        foreach ($this->attachment as $attachment) {\n            // Check if it is a valid disposition_filter\n            if ($attachment[6] == $disposition_type) {\n                // Check for string attachment\n                $string = '';\n                $path = '';\n                $bString = $attachment[5];\n                if ($bString) {\n                    $string = $attachment[0];\n                } else {\n                    $path = $attachment[0];\n                }\n\n                $inclhash = md5(serialize($attachment));\n                if (in_array($inclhash, $incl)) {\n                    continue;\n                }\n                $incl[] = $inclhash;\n                $name = $attachment[2];\n                $encoding = $attachment[3];\n                $type = $attachment[4];\n                $disposition = $attachment[6];\n                $cid = $attachment[7];\n                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {\n                    continue;\n                }\n                $cidUniq[$cid] = true;\n\n                $mime[] = sprintf('--%s%s', $boundary, $this->LE);\n                //Only include a filename property if we have one\n                if (!empty($name)) {\n                    $mime[] = sprintf(\n                        'Content-Type: %s; name=\"%s\"%s',\n                        $type,\n                        $this->encodeHeader($this->secureHeader($name)),\n                        $this->LE\n                    );\n                } else {\n                    $mime[] = sprintf(\n                        'Content-Type: %s%s',\n                        $type,\n                        $this->LE\n                    );\n                }\n                // RFC1341 part 5 says 7bit is assumed if not specified\n                if ($encoding != '7bit') {\n                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);\n                }\n\n                if ($disposition == 'inline') {\n                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);\n                }\n\n                // If a filename contains any of these chars, it should be quoted,\n                // but not otherwise: RFC2183 & RFC2045 5.1\n                // Fixes a warning in IETF's msglint MIME checker\n                // Allow for bypassing the Content-Disposition header totally\n                if (!(empty($disposition))) {\n                    $encoded_name = $this->encodeHeader($this->secureHeader($name));\n                    if (preg_match('/[ \\(\\)<>@,;:\\\\\"\\/\\[\\]\\?=]/', $encoded_name)) {\n                        $mime[] = sprintf(\n                            'Content-Disposition: %s; filename=\"%s\"%s',\n                            $disposition,\n                            $encoded_name,\n                            $this->LE . $this->LE\n                        );\n                    } else {\n                        if (!empty($encoded_name)) {\n                            $mime[] = sprintf(\n                                'Content-Disposition: %s; filename=%s%s',\n                                $disposition,\n                                $encoded_name,\n                                $this->LE . $this->LE\n                            );\n                        } else {\n                            $mime[] = sprintf(\n                                'Content-Disposition: %s%s',\n                                $disposition,\n                                $this->LE . $this->LE\n                            );\n                        }\n                    }\n                } else {\n                    $mime[] = $this->LE;\n                }\n\n                // Encode as string attachment\n                if ($bString) {\n                    $mime[] = $this->encodeString($string, $encoding);\n                    if ($this->isError()) {\n                        return '';\n                    }\n                    $mime[] = $this->LE . $this->LE;\n                } else {\n                    $mime[] = $this->encodeFile($path, $encoding);\n                    if ($this->isError()) {\n                        return '';\n                    }\n                    $mime[] = $this->LE . $this->LE;\n                }\n            }\n        }\n\n        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);\n\n        return implode('', $mime);\n    }\n\n    /**\n     * Encode a file attachment in requested format.\n     * Returns an empty string on failure.\n     * @param string $path The full path to the file\n     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n     * @throws phpmailerException\n     * @access protected\n     * @return string\n     */\n    protected function encodeFile($path, $encoding = 'base64')\n    {\n        try {\n            if (!is_readable($path)) {\n                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);\n            }\n            $magic_quotes = get_magic_quotes_runtime();\n            if ($magic_quotes) {\n                if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n                    set_magic_quotes_runtime(false);\n                } else {\n                    //Doesn't exist in PHP 5.4, but we don't need to check because\n                    //get_magic_quotes_runtime always returns false in 5.4+\n                    //so it will never get here\n                    ini_set('magic_quotes_runtime', false);\n                }\n            }\n            $file_buffer = file_get_contents($path);\n            $file_buffer = $this->encodeString($file_buffer, $encoding);\n            if ($magic_quotes) {\n                if (version_compare(PHP_VERSION, '5.3.0', '<')) {\n                    set_magic_quotes_runtime($magic_quotes);\n                } else {\n                    ini_set('magic_quotes_runtime', $magic_quotes);\n                }\n            }\n            return $file_buffer;\n        } catch (Exception $exc) {\n            $this->setError($exc->getMessage());\n            return '';\n        }\n    }\n\n    /**\n     * Encode a string in requested format.\n     * Returns an empty string on failure.\n     * @param string $str The text to encode\n     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'\n     * @access public\n     * @return string\n     */\n    public function encodeString($str, $encoding = 'base64')\n    {\n        $encoded = '';\n        switch (strtolower($encoding)) {\n            case 'base64':\n                $encoded = chunk_split(base64_encode($str), 76, $this->LE);\n                break;\n            case '7bit':\n            case '8bit':\n                $encoded = $this->fixEOL($str);\n                // Make sure it ends with a line break\n                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {\n                    $encoded .= $this->LE;\n                }\n                break;\n            case 'binary':\n                $encoded = $str;\n                break;\n            case 'quoted-printable':\n                $encoded = $this->encodeQP($str);\n                break;\n            default:\n                $this->setError($this->lang('encoding') . $encoding);\n                break;\n        }\n        return $encoded;\n    }\n\n    /**\n     * Encode a header string optimally.\n     * Picks shortest of Q, B, quoted-printable or none.\n     * @access public\n     * @param string $str\n     * @param string $position\n     * @return string\n     */\n    public function encodeHeader($str, $position = 'text')\n    {\n        $matchcount = 0;\n        switch (strtolower($position)) {\n            case 'phrase':\n                if (!preg_match('/[\\200-\\377]/', $str)) {\n                    // Can't use addslashes as we don't know the value of magic_quotes_sybase\n                    $encoded = addcslashes($str, \"\\0..\\37\\177\\\\\\\"\");\n                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\\'*+\\/=?^_`{|}~ -]/', $str)) {\n                        return ($encoded);\n                    } else {\n                        return (\"\\\"$encoded\\\"\");\n                    }\n                }\n                $matchcount = preg_match_all('/[^\\040\\041\\043-\\133\\135-\\176]/', $str, $matches);\n                break;\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 'comment':\n                $matchcount = preg_match_all('/[()\"]/', $str, $matches);\n                // Intentional fall-through\n            case 'text':\n            default:\n                $matchcount += preg_match_all('/[\\000-\\010\\013\\014\\016-\\037\\177-\\377]/', $str, $matches);\n                break;\n        }\n\n        //There are no chars that need encoding\n        if ($matchcount == 0) {\n            return ($str);\n        }\n\n        $maxlen = 75 - 7 - strlen($this->CharSet);\n        // Try to select the encoding which should produce the shortest output\n        if ($matchcount > strlen($str) / 3) {\n            // More than a third of the content will need encoding, so B encoding will be most efficient\n            $encoding = 'B';\n            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {\n                // Use a custom function which correctly encodes and wraps long\n                // multibyte strings without breaking lines within a character\n                $encoded = $this->base64EncodeWrapMB($str, \"\\n\");\n            } else {\n                $encoded = base64_encode($str);\n                $maxlen -= $maxlen % 4;\n                $encoded = trim(chunk_split($encoded, $maxlen, \"\\n\"));\n            }\n        } else {\n            $encoding = 'Q';\n            $encoded = $this->encodeQ($str, $position);\n            $encoded = $this->wrapText($encoded, $maxlen, true);\n            $encoded = str_replace('=' . self::CRLF, \"\\n\", trim($encoded));\n        }\n\n        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . \"?$encoding?\\\\1?=\", $encoded);\n        $encoded = trim(str_replace(\"\\n\", $this->LE, $encoded));\n\n        return $encoded;\n    }\n\n    /**\n     * Check if a string contains multi-byte characters.\n     * @access public\n     * @param string $str multi-byte text to wrap encode\n     * @return boolean\n     */\n    public function hasMultiBytes($str)\n    {\n        if (function_exists('mb_strlen')) {\n            return (strlen($str) > mb_strlen($str, $this->CharSet));\n        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)\n            return false;\n        }\n    }\n\n    /**\n     * Does a string contain any 8-bit chars (in any charset)?\n     * @param string $text\n     * @return boolean\n     */\n    public function has8bitChars($text)\n    {\n        return (boolean)preg_match('/[\\x80-\\xFF]/', $text);\n    }\n\n    /**\n     * Encode and wrap long multibyte strings for mail headers\n     * without breaking lines within a character.\n     * Adapted from a function by paravoid\n     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283\n     * @access public\n     * @param string $str multi-byte text to wrap encode\n     * @param string $linebreak string to use as linefeed/end-of-line\n     * @return string\n     */\n    public function base64EncodeWrapMB($str, $linebreak = null)\n    {\n        $start = '=?' . $this->CharSet . '?B?';\n        $end = '?=';\n        $encoded = '';\n        if ($linebreak === null) {\n            $linebreak = $this->LE;\n        }\n\n        $mb_length = mb_strlen($str, $this->CharSet);\n        // Each line must have length <= 75, including $start and $end\n        $length = 75 - strlen($start) - strlen($end);\n        // Average multi-byte ratio\n        $ratio = $mb_length / strlen($str);\n        // Base64 has a 4:3 ratio\n        $avgLength = floor($length * $ratio * .75);\n\n        for ($i = 0; $i < $mb_length; $i += $offset) {\n            $lookBack = 0;\n            do {\n                $offset = $avgLength - $lookBack;\n                $chunk = mb_substr($str, $i, $offset, $this->CharSet);\n                $chunk = base64_encode($chunk);\n                $lookBack++;\n            } while (strlen($chunk) > $length);\n            $encoded .= $chunk . $linebreak;\n        }\n\n        // Chomp the last linefeed\n        $encoded = substr($encoded, 0, -strlen($linebreak));\n        return $encoded;\n    }\n\n    /**\n     * Encode a string in quoted-printable format.\n     * According to RFC2045 section 6.7.\n     * @access public\n     * @param string $string The text to encode\n     * @param integer $line_max Number of chars allowed on a line before wrapping\n     * @return string\n     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment\n     */\n    public function encodeQP($string, $line_max = 76)\n    {\n        // Use native function if it's available (>= PHP5.3)\n        if (function_exists('quoted_printable_encode')) {\n            return quoted_printable_encode($string);\n        }\n        // Fall back to a pure PHP implementation\n        $string = str_replace(\n            array('%20', '%0D%0A.', '%0D%0A', '%'),\n            array(' ', \"\\r\\n=2E\", \"\\r\\n\", '='),\n            rawurlencode($string)\n        );\n        return preg_replace('/[^\\r\\n]{' . ($line_max - 3) . '}[^=\\r\\n]{2}/', \"$0=\\r\\n\", $string);\n    }\n\n    /**\n     * Backward compatibility wrapper for an old QP encoding function that was removed.\n     * @see PHPMailer::encodeQP()\n     * @access public\n     * @param string $string\n     * @param integer $line_max\n     * @param boolean $space_conv\n     * @return string\n     * @deprecated Use encodeQP instead.\n     */\n    public function encodeQPphp(\n        $string,\n        $line_max = 76,\n        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false\n    ) {\n        return $this->encodeQP($string, $line_max);\n    }\n\n    /**\n     * Encode a string using Q encoding.\n     * @link http://tools.ietf.org/html/rfc2047\n     * @param string $str the text to encode\n     * @param string $position Where the text is going to be used, see the RFC for what that means\n     * @access public\n     * @return string\n     */\n    public function encodeQ($str, $position = 'text')\n    {\n        // There should not be any EOL in the string\n        $pattern = '';\n        $encoded = str_replace(array(\"\\r\", \"\\n\"), '', $str);\n        switch (strtolower($position)) {\n            case 'phrase':\n                // RFC 2047 section 5.3\n                $pattern = '^A-Za-z0-9!*+\\/ -';\n                break;\n            /** @noinspection PhpMissingBreakStatementInspection */\n            case 'comment':\n                // RFC 2047 section 5.2\n                $pattern = '\\(\\)\"';\n                // intentional fall-through\n                // for this reason we build the $pattern without including delimiters and []\n            case 'text':\n            default:\n                // RFC 2047 section 5.1\n                // Replace every high ascii, control, =, ? and _ characters\n                $pattern = '\\000-\\011\\013\\014\\016-\\037\\075\\077\\137\\177-\\377' . $pattern;\n                break;\n        }\n        $matches = array();\n        if (preg_match_all(\"/[{$pattern}]/\", $encoded, $matches)) {\n            // If the string contains an '=', make sure it's the first thing we replace\n            // so as to avoid double-encoding\n            $eqkey = array_search('=', $matches[0]);\n            if (false !== $eqkey) {\n                unset($matches[0][$eqkey]);\n                array_unshift($matches[0], '=');\n            }\n            foreach (array_unique($matches[0]) as $char) {\n                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);\n            }\n        }\n        // Replace every spaces to _ (more readable than =20)\n        return str_replace(' ', '_', $encoded);\n    }\n\n    /**\n     * Add a string or binary attachment (non-filesystem).\n     * This method can be used to attach ascii or binary data,\n     * such as a BLOB record from a database.\n     * @param string $string String attachment data.\n     * @param string $filename Name of the attachment.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File extension (MIME) type.\n     * @param string $disposition Disposition to use\n     * @return void\n     */\n    public function addStringAttachment(\n        $string,\n        $filename,\n        $encoding = 'base64',\n        $type = '',\n        $disposition = 'attachment'\n    ) {\n        // If a MIME type is not specified, try to work it out from the file name\n        if ($type == '') {\n            $type = self::filenameToType($filename);\n        }\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $string,\n            1 => $filename,\n            2 => basename($filename),\n            3 => $encoding,\n            4 => $type,\n            5 => true, // isStringAttachment\n            6 => $disposition,\n            7 => 0\n        );\n    }\n\n    /**\n     * Add an embedded (inline) attachment from a file.\n     * This can include images, sounds, and just about any other document type.\n     * These differ from 'regular' attachments in that they are intended to be\n     * displayed inline with the message, not just attached for download.\n     * This is used in HTML messages that embed the images\n     * the HTML refers to using the $cid value.\n     * @param string $path Path to the attachment.\n     * @param string $cid Content ID of the attachment; Use this to reference\n     *        the content when using an embedded image in HTML.\n     * @param string $name Overrides the attachment name.\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type File MIME type.\n     * @param string $disposition Disposition to use\n     * @return boolean True on successfully adding an attachment\n     */\n    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')\n    {\n        if (!@is_file($path)) {\n            $this->setError($this->lang('file_access') . $path);\n            return false;\n        }\n\n        // If a MIME type is not specified, try to work it out from the file name\n        if ($type == '') {\n            $type = self::filenameToType($path);\n        }\n\n        $filename = basename($path);\n        if ($name == '') {\n            $name = $filename;\n        }\n\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $path,\n            1 => $filename,\n            2 => $name,\n            3 => $encoding,\n            4 => $type,\n            5 => false, // isStringAttachment\n            6 => $disposition,\n            7 => $cid\n        );\n        return true;\n    }\n\n    /**\n     * Add an embedded stringified attachment.\n     * This can include images, sounds, and just about any other document type.\n     * Be sure to set the $type to an image type for images:\n     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.\n     * @param string $string The attachment binary data.\n     * @param string $cid Content ID of the attachment; Use this to reference\n     *        the content when using an embedded image in HTML.\n     * @param string $name\n     * @param string $encoding File encoding (see $Encoding).\n     * @param string $type MIME type.\n     * @param string $disposition Disposition to use\n     * @return boolean True on successfully adding an attachment\n     */\n    public function addStringEmbeddedImage(\n        $string,\n        $cid,\n        $name = '',\n        $encoding = 'base64',\n        $type = '',\n        $disposition = 'inline'\n    ) {\n        // If a MIME type is not specified, try to work it out from the name\n        if ($type == '' and !empty($name)) {\n            $type = self::filenameToType($name);\n        }\n\n        // Append to $attachment array\n        $this->attachment[] = array(\n            0 => $string,\n            1 => $name,\n            2 => $name,\n            3 => $encoding,\n            4 => $type,\n            5 => true, // isStringAttachment\n            6 => $disposition,\n            7 => $cid\n        );\n        return true;\n    }\n\n    /**\n     * Check if an inline attachment is present.\n     * @access public\n     * @return boolean\n     */\n    public function inlineImageExists()\n    {\n        foreach ($this->attachment as $attachment) {\n            if ($attachment[6] == 'inline') {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Check if an attachment (non-inline) is present.\n     * @return boolean\n     */\n    public function attachmentExists()\n    {\n        foreach ($this->attachment as $attachment) {\n            if ($attachment[6] == 'attachment') {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Check if this message has an alternative body set.\n     * @return boolean\n     */\n    public function alternativeExists()\n    {\n        return !empty($this->AltBody);\n    }\n\n    /**\n     * Clear queued addresses of given kind.\n     * @access protected\n     * @param string $kind 'to', 'cc', or 'bcc'\n     * @return void\n     */\n    public function clearQueuedAddresses($kind)\n    {\n        $RecipientsQueue = $this->RecipientsQueue;\n        foreach ($RecipientsQueue as $address => $params) {\n            if ($params[0] == $kind) {\n                unset($this->RecipientsQueue[$address]);\n            }\n        }\n    }\n\n    /**\n     * Clear all To recipients.\n     * @return void\n     */\n    public function clearAddresses()\n    {\n        foreach ($this->to as $to) {\n            unset($this->all_recipients[strtolower($to[0])]);\n        }\n        $this->to = array();\n        $this->clearQueuedAddresses('to');\n    }\n\n    /**\n     * Clear all CC recipients.\n     * @return void\n     */\n    public function clearCCs()\n    {\n        foreach ($this->cc as $cc) {\n            unset($this->all_recipients[strtolower($cc[0])]);\n        }\n        $this->cc = array();\n        $this->clearQueuedAddresses('cc');\n    }\n\n    /**\n     * Clear all BCC recipients.\n     * @return void\n     */\n    public function clearBCCs()\n    {\n        foreach ($this->bcc as $bcc) {\n            unset($this->all_recipients[strtolower($bcc[0])]);\n        }\n        $this->bcc = array();\n        $this->clearQueuedAddresses('bcc');\n    }\n\n    /**\n     * Clear all ReplyTo recipients.\n     * @return void\n     */\n    public function clearReplyTos()\n    {\n        $this->ReplyTo = array();\n        $this->ReplyToQueue = array();\n    }\n\n    /**\n     * Clear all recipient types.\n     * @return void\n     */\n    public function clearAllRecipients()\n    {\n        $this->to = array();\n        $this->cc = array();\n        $this->bcc = array();\n        $this->all_recipients = array();\n        $this->RecipientsQueue = array();\n    }\n\n    /**\n     * Clear all filesystem, string, and binary attachments.\n     * @return void\n     */\n    public function clearAttachments()\n    {\n        $this->attachment = array();\n    }\n\n    /**\n     * Clear all custom headers.\n     * @return void\n     */\n    public function clearCustomHeaders()\n    {\n        $this->CustomHeader = array();\n    }\n\n    /**\n     * Add an error message to the error container.\n     * @access protected\n     * @param string $msg\n     * @return void\n     */\n    protected function setError($msg)\n    {\n        $this->error_count++;\n        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {\n            $lasterror = $this->smtp->getError();\n            if (!empty($lasterror['error'])) {\n                $msg .= $this->lang('smtp_error') . $lasterror['error'];\n                if (!empty($lasterror['detail'])) {\n                    $msg .= ' Detail: '. $lasterror['detail'];\n                }\n                if (!empty($lasterror['smtp_code'])) {\n                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];\n                }\n                if (!empty($lasterror['smtp_code_ex'])) {\n                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];\n                }\n            }\n        }\n        $this->ErrorInfo = $msg;\n    }\n\n    /**\n     * Return an RFC 822 formatted date.\n     * @access public\n     * @return string\n     * @static\n     */\n    public static function rfcDate()\n    {\n        // Set the time zone to whatever the default is to avoid 500 errors\n        // Will default to UTC if it's not set properly in php.ini\n        date_default_timezone_set(@date_default_timezone_get());\n        return date('D, j M Y H:i:s O');\n    }\n\n    /**\n     * Get the server hostname.\n     * Returns 'localhost.localdomain' if unknown.\n     * @access protected\n     * @return string\n     */\n    protected function serverHostname()\n    {\n        $result = 'localhost.localdomain';\n        if (!empty($this->Hostname)) {\n            $result = $this->Hostname;\n        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {\n            $result = $_SERVER['SERVER_NAME'];\n        } elseif (function_exists('gethostname') && gethostname() !== false) {\n            $result = gethostname();\n        } elseif (php_uname('n') !== false) {\n            $result = php_uname('n');\n        }\n        return $result;\n    }\n\n    /**\n     * Get an error message in the current language.\n     * @access protected\n     * @param string $key\n     * @return string\n     */\n    protected function lang($key)\n    {\n        if (count($this->language) < 1) {\n            $this->setLanguage('en'); // set the default language\n        }\n\n        if (array_key_exists($key, $this->language)) {\n            if ($key == 'smtp_connect_failed') {\n                //Include a link to troubleshooting docs on SMTP connection failure\n                //this is by far the biggest cause of support questions\n                //but it's usually not PHPMailer's fault.\n                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';\n            }\n            return $this->language[$key];\n        } else {\n            //Return the key as a fallback\n            return $key;\n        }\n    }\n\n    /**\n     * Check if an error occurred.\n     * @access public\n     * @return boolean True if an error did occur.\n     */\n    public function isError()\n    {\n        return ($this->error_count > 0);\n    }\n\n    /**\n     * Ensure consistent line endings in a string.\n     * Changes every end of line from CRLF, CR or LF to $this->LE.\n     * @access public\n     * @param string $str String to fixEOL\n     * @return string\n     */\n    public function fixEOL($str)\n    {\n        // Normalise to \\n\n        $nstr = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $str);\n        // Now convert LE as needed\n        if ($this->LE !== \"\\n\") {\n            $nstr = str_replace(\"\\n\", $this->LE, $nstr);\n        }\n        return $nstr;\n    }\n\n    /**\n     * Add a custom header.\n     * $name value can be overloaded to contain\n     * both header name and value (name:value)\n     * @access public\n     * @param string $name Custom header name\n     * @param string $value Header value\n     * @return void\n     */\n    public function addCustomHeader($name, $value = null)\n    {\n        if ($value === null) {\n            // Value passed in as name:value\n            $this->CustomHeader[] = explode(':', $name, 2);\n        } else {\n            $this->CustomHeader[] = array($name, $value);\n        }\n    }\n\n    /**\n     * Returns all custom headers.\n     * @return array\n     */\n    public function getCustomHeaders()\n    {\n        return $this->CustomHeader;\n    }\n\n    /**\n     * Create a message from an HTML string.\n     * Automatically makes modifications for inline images and backgrounds\n     * and creates a plain-text version by converting the HTML.\n     * Overwrites any existing values in $this->Body and $this->AltBody\n     * @access public\n     * @param string $message HTML message string\n     * @param string $basedir baseline directory for path\n     * @param boolean|callable $advanced Whether to use the internal HTML to text converter\n     *    or your own custom converter @see PHPMailer::html2text()\n     * @return string $message\n     */\n    public function msgHTML($message, $basedir = '', $advanced = false)\n    {\n        preg_match_all('/(src|background)=[\"\\'](.*)[\"\\']/Ui', $message, $images);\n        if (array_key_exists(2, $images)) {\n            foreach ($images[2] as $imgindex => $url) {\n                // Convert data URIs into embedded images\n                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {\n                    $data = substr($url, strpos($url, ','));\n                    if ($match[2]) {\n                        $data = base64_decode($data);\n                    } else {\n                        $data = rawurldecode($data);\n                    }\n                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2\n                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {\n                        $message = str_replace(\n                            $images[0][$imgindex],\n                            $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n                            $message\n                        );\n                    }\n                } elseif (substr($url, 0, 4) !== 'cid:' && !preg_match('#^[A-z]+://#', $url)) {\n                    // Do not change urls for absolute images (thanks to corvuscorax)\n                    // Do not change urls that are already inline images\n                    $filename = basename($url);\n                    $directory = dirname($url);\n                    if ($directory == '.') {\n                        $directory = '';\n                    }\n                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2\n                    if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {\n                        $basedir .= '/';\n                    }\n                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {\n                        $directory .= '/';\n                    }\n                    if ($this->addEmbeddedImage(\n                        $basedir . $directory . $filename,\n                        $cid,\n                        $filename,\n                        'base64',\n                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))\n                    )\n                    ) {\n                        $message = preg_replace(\n                            '/' . $images[1][$imgindex] . '=[\"\\']' . preg_quote($url, '/') . '[\"\\']/Ui',\n                            $images[1][$imgindex] . '=\"cid:' . $cid . '\"',\n                            $message\n                        );\n                    }\n                }\n            }\n        }\n        $this->isHTML(true);\n        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better\n        $this->Body = $this->normalizeBreaks($message);\n        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));\n        if (empty($this->AltBody)) {\n            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .\n                self::CRLF . self::CRLF;\n        }\n        return $this->Body;\n    }\n\n    /**\n     * Convert an HTML string into plain text.\n     * This is used by msgHTML().\n     * Note - older versions of this function used a bundled advanced converter\n     * which was been removed for license reasons in #232\n     * Example usage:\n     * <code>\n     * // Use default conversion\n     * $plain = $mail->html2text($html);\n     * // Use your own custom converter\n     * $plain = $mail->html2text($html, function($html) {\n     *     $converter = new MyHtml2text($html);\n     *     return $converter->get_text();\n     * });\n     * </code>\n     * @param string $html The HTML text to convert\n     * @param boolean|callable $advanced Any boolean value to use the internal converter,\n     *   or provide your own callable for custom conversion.\n     * @return string\n     */\n    public function html2text($html, $advanced = false)\n    {\n        if (is_callable($advanced)) {\n            return call_user_func($advanced, $html);\n        }\n        return html_entity_decode(\n            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\\/\\\\1>/si', '', $html))),\n            ENT_QUOTES,\n            $this->CharSet\n        );\n    }\n\n    /**\n     * Get the MIME type for a file extension.\n     * @param string $ext File extension\n     * @access public\n     * @return string MIME type of file.\n     * @static\n     */\n    public static function _mime_types($ext = '')\n    {\n        $mimes = array(\n            'xl'    => 'application/excel',\n            'js'    => 'application/javascript',\n            'hqx'   => 'application/mac-binhex40',\n            'cpt'   => 'application/mac-compactpro',\n            'bin'   => 'application/macbinary',\n            'doc'   => 'application/msword',\n            'word'  => 'application/msword',\n            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',\n            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',\n            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',\n            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n            'class' => 'application/octet-stream',\n            'dll'   => 'application/octet-stream',\n            'dms'   => 'application/octet-stream',\n            'exe'   => 'application/octet-stream',\n            'lha'   => 'application/octet-stream',\n            'lzh'   => 'application/octet-stream',\n            'psd'   => 'application/octet-stream',\n            'sea'   => 'application/octet-stream',\n            'so'    => 'application/octet-stream',\n            'oda'   => 'application/oda',\n            'pdf'   => 'application/pdf',\n            'ai'    => 'application/postscript',\n            'eps'   => 'application/postscript',\n            'ps'    => 'application/postscript',\n            'smi'   => 'application/smil',\n            'smil'  => 'application/smil',\n            'mif'   => 'application/vnd.mif',\n            'xls'   => 'application/vnd.ms-excel',\n            'ppt'   => 'application/vnd.ms-powerpoint',\n            'wbxml' => 'application/vnd.wap.wbxml',\n            'wmlc'  => 'application/vnd.wap.wmlc',\n            'dcr'   => 'application/x-director',\n            'dir'   => 'application/x-director',\n            'dxr'   => 'application/x-director',\n            'dvi'   => 'application/x-dvi',\n            'gtar'  => 'application/x-gtar',\n            'php3'  => 'application/x-httpd-php',\n            'php4'  => 'application/x-httpd-php',\n            'php'   => 'application/x-httpd-php',\n            'phtml' => 'application/x-httpd-php',\n            'phps'  => 'application/x-httpd-php-source',\n            'swf'   => 'application/x-shockwave-flash',\n            'sit'   => 'application/x-stuffit',\n            'tar'   => 'application/x-tar',\n            'tgz'   => 'application/x-tar',\n            'xht'   => 'application/xhtml+xml',\n            'xhtml' => 'application/xhtml+xml',\n            'zip'   => 'application/zip',\n            'mid'   => 'audio/midi',\n            'midi'  => 'audio/midi',\n            'mp2'   => 'audio/mpeg',\n            'mp3'   => 'audio/mpeg',\n            'mpga'  => 'audio/mpeg',\n            'aif'   => 'audio/x-aiff',\n            'aifc'  => 'audio/x-aiff',\n            'aiff'  => 'audio/x-aiff',\n            'ram'   => 'audio/x-pn-realaudio',\n            'rm'    => 'audio/x-pn-realaudio',\n            'rpm'   => 'audio/x-pn-realaudio-plugin',\n            'ra'    => 'audio/x-realaudio',\n            'wav'   => 'audio/x-wav',\n            'bmp'   => 'image/bmp',\n            'gif'   => 'image/gif',\n            'jpeg'  => 'image/jpeg',\n            'jpe'   => 'image/jpeg',\n            'jpg'   => 'image/jpeg',\n            'png'   => 'image/png',\n            'tiff'  => 'image/tiff',\n            'tif'   => 'image/tiff',\n            'eml'   => 'message/rfc822',\n            'css'   => 'text/css',\n            'html'  => 'text/html',\n            'htm'   => 'text/html',\n            'shtml' => 'text/html',\n            'log'   => 'text/plain',\n            'text'  => 'text/plain',\n            'txt'   => 'text/plain',\n            'rtx'   => 'text/richtext',\n            'rtf'   => 'text/rtf',\n            'vcf'   => 'text/vcard',\n            'vcard' => 'text/vcard',\n            'xml'   => 'text/xml',\n            'xsl'   => 'text/xml',\n            'mpeg'  => 'video/mpeg',\n            'mpe'   => 'video/mpeg',\n            'mpg'   => 'video/mpeg',\n            'mov'   => 'video/quicktime',\n            'qt'    => 'video/quicktime',\n            'rv'    => 'video/vnd.rn-realvideo',\n            'avi'   => 'video/x-msvideo',\n            'movie' => 'video/x-sgi-movie'\n        );\n        if (array_key_exists(strtolower($ext), $mimes)) {\n            return $mimes[strtolower($ext)];\n        }\n        return 'application/octet-stream';\n    }\n\n    /**\n     * Map a file name to a MIME type.\n     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.\n     * @param string $filename A file name or full path, does not need to exist as a file\n     * @return string\n     * @static\n     */\n    public static function filenameToType($filename)\n    {\n        // In case the path is a URL, strip any query string before getting extension\n        $qpos = strpos($filename, '?');\n        if (false !== $qpos) {\n            $filename = substr($filename, 0, $qpos);\n        }\n        $pathinfo = self::mb_pathinfo($filename);\n        return self::_mime_types($pathinfo['extension']);\n    }\n\n    /**\n     * Multi-byte-safe pathinfo replacement.\n     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.\n     * Works similarly to the one in PHP >= 5.2.0\n     * @link http://www.php.net/manual/en/function.pathinfo.php#107461\n     * @param string $path A filename or path, does not need to exist as a file\n     * @param integer|string $options Either a PATHINFO_* constant,\n     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2\n     * @return string|array\n     * @static\n     */\n    public static function mb_pathinfo($path, $options = null)\n    {\n        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');\n        $pathinfo = array();\n        if (preg_match('%^(.*?)[\\\\\\\\/]*(([^/\\\\\\\\]*?)(\\.([^\\.\\\\\\\\/]+?)|))[\\\\\\\\/\\.]*$%im', $path, $pathinfo)) {\n            if (array_key_exists(1, $pathinfo)) {\n                $ret['dirname'] = $pathinfo[1];\n            }\n            if (array_key_exists(2, $pathinfo)) {\n                $ret['basename'] = $pathinfo[2];\n            }\n            if (array_key_exists(5, $pathinfo)) {\n                $ret['extension'] = $pathinfo[5];\n            }\n            if (array_key_exists(3, $pathinfo)) {\n                $ret['filename'] = $pathinfo[3];\n            }\n        }\n        switch ($options) {\n            case PATHINFO_DIRNAME:\n            case 'dirname':\n                return $ret['dirname'];\n            case PATHINFO_BASENAME:\n            case 'basename':\n                return $ret['basename'];\n            case PATHINFO_EXTENSION:\n            case 'extension':\n                return $ret['extension'];\n            case PATHINFO_FILENAME:\n            case 'filename':\n                return $ret['filename'];\n            default:\n                return $ret;\n        }\n    }\n\n    /**\n     * Set or reset instance properties.\n     * You should avoid this function - it's more verbose, less efficient, more error-prone and\n     * harder to debug than setting properties directly.\n     * Usage Example:\n     * `$mail->set('SMTPSecure', 'tls');`\n     *   is the same as:\n     * `$mail->SMTPSecure = 'tls';`\n     * @access public\n     * @param string $name The property name to set\n     * @param mixed $value The value to set the property to\n     * @return boolean\n     * @TODO Should this not be using the __set() magic function?\n     */\n    public function set($name, $value = '')\n    {\n        if (property_exists($this, $name)) {\n            $this->$name = $value;\n            return true;\n        } else {\n            $this->setError($this->lang('variable_set') . $name);\n            return false;\n        }\n    }\n\n    /**\n     * Strip newlines to prevent header injection.\n     * @access public\n     * @param string $str\n     * @return string\n     */\n    public function secureHeader($str)\n    {\n        return trim(str_replace(array(\"\\r\", \"\\n\"), '', $str));\n    }\n\n    /**\n     * Normalize line breaks in a string.\n     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.\n     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.\n     * @param string $text\n     * @param string $breaktype What kind of line break to use, defaults to CRLF\n     * @return string\n     * @access public\n     * @static\n     */\n    public static function normalizeBreaks($text, $breaktype = \"\\r\\n\")\n    {\n        return preg_replace('/(\\r\\n|\\r|\\n)/ms', $breaktype, $text);\n    }\n\n    /**\n     * Set the public and private key files and password for S/MIME signing.\n     * @access public\n     * @param string $cert_filename\n     * @param string $key_filename\n     * @param string $key_pass Password for private key\n     * @param string $extracerts_filename Optional path to chain certificate\n     */\n    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')\n    {\n        $this->sign_cert_file = $cert_filename;\n        $this->sign_key_file = $key_filename;\n        $this->sign_key_pass = $key_pass;\n        $this->sign_extracerts_file = $extracerts_filename;\n    }\n\n    /**\n     * Quoted-Printable-encode a DKIM header.\n     * @access public\n     * @param string $txt\n     * @return string\n     */\n    public function DKIM_QP($txt)\n    {\n        $line = '';\n        for ($i = 0; $i < strlen($txt); $i++) {\n            $ord = ord($txt[$i]);\n            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {\n                $line .= $txt[$i];\n            } else {\n                $line .= '=' . sprintf('%02X', $ord);\n            }\n        }\n        return $line;\n    }\n\n    /**\n     * Generate a DKIM signature.\n     * @access public\n     * @param string $signHeader\n     * @throws phpmailerException\n     * @return string\n     */\n    public function DKIM_Sign($signHeader)\n    {\n        if (!defined('PKCS7_TEXT')) {\n            if ($this->exceptions) {\n                throw new phpmailerException($this->lang('extension_missing') . 'openssl');\n            }\n            return '';\n        }\n        $privKeyStr = file_get_contents($this->DKIM_private);\n        if ($this->DKIM_passphrase != '') {\n            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);\n        } else {\n            $privKey = $privKeyStr;\n        }\n        if (openssl_sign($signHeader, $signature, $privKey)) {\n            return base64_encode($signature);\n        }\n        return '';\n    }\n\n    /**\n     * Generate a DKIM canonicalization header.\n     * @access public\n     * @param string $signHeader Header\n     * @return string\n     */\n    public function DKIM_HeaderC($signHeader)\n    {\n        $signHeader = preg_replace('/\\r\\n\\s+/', ' ', $signHeader);\n        $lines = explode(\"\\r\\n\", $signHeader);\n        foreach ($lines as $key => $line) {\n            list($heading, $value) = explode(':', $line, 2);\n            $heading = strtolower($heading);\n            $value = preg_replace('/\\s+/', ' ', $value); // Compress useless spaces\n            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value\n        }\n        $signHeader = implode(\"\\r\\n\", $lines);\n        return $signHeader;\n    }\n\n    /**\n     * Generate a DKIM canonicalization body.\n     * @access public\n     * @param string $body Message Body\n     * @return string\n     */\n    public function DKIM_BodyC($body)\n    {\n        if ($body == '') {\n            return \"\\r\\n\";\n        }\n        // stabilize line endings\n        $body = str_replace(\"\\r\\n\", \"\\n\", $body);\n        $body = str_replace(\"\\n\", \"\\r\\n\", $body);\n        // END stabilize line endings\n        while (substr($body, strlen($body) - 4, 4) == \"\\r\\n\\r\\n\") {\n            $body = substr($body, 0, strlen($body) - 2);\n        }\n        return $body;\n    }\n\n    /**\n     * Create the DKIM header and body in a new message header.\n     * @access public\n     * @param string $headers_line Header lines\n     * @param string $subject Subject\n     * @param string $body Body\n     * @return string\n     */\n    public function DKIM_Add($headers_line, $subject, $body)\n    {\n        $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms\n        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body\n        $DKIMquery = 'dns/txt'; // Query method\n        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)\n        $subject_header = \"Subject: $subject\";\n        $headers = explode($this->LE, $headers_line);\n        $from_header = '';\n        $to_header = '';\n        $current = '';\n        foreach ($headers as $header) {\n            if (strpos($header, 'From:') === 0) {\n                $from_header = $header;\n                $current = 'from_header';\n            } elseif (strpos($header, 'To:') === 0) {\n                $to_header = $header;\n                $current = 'to_header';\n            } else {\n                if (!empty($$current) && strpos($header, ' =?') === 0) {\n                    $$current .= $header;\n                } else {\n                    $current = '';\n                }\n            }\n        }\n        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));\n        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));\n        $subject = str_replace(\n            '|',\n            '=7C',\n            $this->DKIM_QP($subject_header)\n        ); // Copied header fields (dkim-quoted-printable)\n        $body = $this->DKIM_BodyC($body);\n        $DKIMlen = strlen($body); // Length of body\n        $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body\n        if ('' == $this->DKIM_identity) {\n            $ident = '';\n        } else {\n            $ident = ' i=' . $this->DKIM_identity . ';';\n        }\n        $dkimhdrs = 'DKIM-Signature: v=1; a=' .\n            $DKIMsignatureType . '; q=' .\n            $DKIMquery . '; l=' .\n            $DKIMlen . '; s=' .\n            $this->DKIM_selector .\n            \";\\r\\n\" .\n            \"\\tt=\" . $DKIMtime . '; c=' . $DKIMcanonicalization . \";\\r\\n\" .\n            \"\\th=From:To:Subject;\\r\\n\" .\n            \"\\td=\" . $this->DKIM_domain . ';' . $ident . \"\\r\\n\" .\n            \"\\tz=$from\\r\\n\" .\n            \"\\t|$to\\r\\n\" .\n            \"\\t|$subject;\\r\\n\" .\n            \"\\tbh=\" . $DKIMb64 . \";\\r\\n\" .\n            \"\\tb=\";\n        $toSign = $this->DKIM_HeaderC(\n            $from_header . \"\\r\\n\" .\n            $to_header . \"\\r\\n\" .\n            $subject_header . \"\\r\\n\" .\n            $dkimhdrs\n        );\n        $signed = $this->DKIM_Sign($toSign);\n        return $dkimhdrs . $signed . \"\\r\\n\";\n    }\n\n    /**\n     * Detect if a string contains a line longer than the maximum line length allowed.\n     * @param string $str\n     * @return boolean\n     * @static\n     */\n    public static function hasLineLongerThanMax($str)\n    {\n        //+2 to include CRLF line break for a 1000 total\n        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);\n    }\n\n    /**\n     * Allows for public read access to 'to' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getToAddresses()\n    {\n        return $this->to;\n    }\n\n    /**\n     * Allows for public read access to 'cc' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getCcAddresses()\n    {\n        return $this->cc;\n    }\n\n    /**\n     * Allows for public read access to 'bcc' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getBccAddresses()\n    {\n        return $this->bcc;\n    }\n\n    /**\n     * Allows for public read access to 'ReplyTo' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getReplyToAddresses()\n    {\n        return $this->ReplyTo;\n    }\n\n    /**\n     * Allows for public read access to 'all_recipients' property.\n     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.\n     * @access public\n     * @return array\n     */\n    public function getAllRecipientAddresses()\n    {\n        return $this->all_recipients;\n    }\n\n    /**\n     * Perform a callback.\n     * @param boolean $isSent\n     * @param array $to\n     * @param array $cc\n     * @param array $bcc\n     * @param string $subject\n     * @param string $body\n     * @param string $from\n     */\n    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)\n    {\n        if (!empty($this->action_function) && is_callable($this->action_function)) {\n            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);\n            call_user_func_array($this->action_function, $params);\n        }\n    }\n}\n\n/**\n * PHPMailer exception handler\n * @package PHPMailer\n */\nclass phpmailerException extends Exception\n{\n    /**\n     * Prettify error message output\n     * @return string\n     */\n    public function errorMessage()\n    {\n        $errorMsg = '<strong>' . $this->getMessage() . \"</strong><br />\\n\";\n        return $errorMsg;\n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-pop3.php",
    "content": "<?php\n/**\n * mail_fetch/setup.php\n *\n * Copyright (c) 1999-2011 CDI (cdi@thewebmasters.net) All Rights Reserved\n * Modified by Philippe Mingo 2001-2009 mingo@rotedic.com\n * An RFC 1939 compliant wrapper class for the POP3 protocol.\n *\n * Licensed under the GNU GPL. For full terms see the file COPYING.\n *\n * POP3 class\n *\n * @copyright 1999-2011 The SquirrelMail Project Team\n * @license http://opensource.org/licenses/gpl-license.php GNU Public License\n * @package plugins\n * @subpackage mail_fetch\n */\n\nclass POP3 {\n    var $ERROR      = '';       //  Error string.\n\n    var $TIMEOUT    = 60;       //  Default timeout before giving up on a\n                                //  network operation.\n\n    var $COUNT      = -1;       //  Mailbox msg count\n\n    var $BUFFER     = 512;      //  Socket buffer for socket fgets() calls.\n                                //  Per RFC 1939 the returned line a POP3\n                                //  server can send is 512 bytes.\n\n    var $FP         = '';       //  The connection to the server's\n                                //  file descriptor\n\n    var $MAILSERVER = '';       // Set this to hard code the server name\n\n    var $DEBUG      = FALSE;    // set to true to echo pop3\n                                // commands and responses to error_log\n                                // this WILL log passwords!\n\n    var $BANNER     = '';       //  Holds the banner returned by the\n                                //  pop server - used for apop()\n\n    var $ALLOWAPOP  = FALSE;    //  Allow or disallow apop()\n                                //  This must be set to true\n                                //  manually\n\n\t/**\n\t * PHP5 constructor.\n\t */\n    function __construct ( $server = '', $timeout = '' ) {\n        settype($this->BUFFER,\"integer\");\n        if( !empty($server) ) {\n            // Do not allow programs to alter MAILSERVER\n            // if it is already specified. They can get around\n            // this if they -really- want to, so don't count on it.\n            if(empty($this->MAILSERVER))\n                $this->MAILSERVER = $server;\n        }\n        if(!empty($timeout)) {\n            settype($timeout,\"integer\");\n            $this->TIMEOUT = $timeout;\n            if (!ini_get('safe_mode'))\n                set_time_limit($timeout);\n        }\n        return true;\n    }\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function POP3( $server = '', $timeout = '' ) {\n\t\tself::__construct( $server, $timeout );\n\t}\n\n    function update_timer () {\n        if (!ini_get('safe_mode'))\n            set_time_limit($this->TIMEOUT);\n        return true;\n    }\n\n    function connect ($server, $port = 110)  {\n        //  Opens a socket to the specified server. Unless overridden,\n        //  port defaults to 110. Returns true on success, false on fail\n\n        // If MAILSERVER is set, override $server with its value.\n\n    if (!isset($port) || !$port) {$port = 110;}\n        if(!empty($this->MAILSERVER))\n            $server = $this->MAILSERVER;\n\n        if(empty($server)){\n            $this->ERROR = \"POP3 connect: \" . _(\"No server specified\");\n            unset($this->FP);\n            return false;\n        }\n\n        $fp = @fsockopen(\"$server\", $port, $errno, $errstr);\n\n        if(!$fp) {\n            $this->ERROR = \"POP3 connect: \" . _(\"Error \") . \"[$errno] [$errstr]\";\n            unset($this->FP);\n            return false;\n        }\n\n        socket_set_blocking($fp,-1);\n        $this->update_timer();\n        $reply = fgets($fp,$this->BUFFER);\n        $reply = $this->strip_clf($reply);\n        if($this->DEBUG)\n            error_log(\"POP3 SEND [connect: $server] GOT [$reply]\",0);\n        if(!$this->is_ok($reply)) {\n            $this->ERROR = \"POP3 connect: \" . _(\"Error \") . \"[$reply]\";\n            unset($this->FP);\n            return false;\n        }\n        $this->FP = $fp;\n        $this->BANNER = $this->parse_banner($reply);\n        return true;\n    }\n\n    function user ($user = \"\") {\n        // Sends the USER command, returns true or false\n\n        if( empty($user) ) {\n            $this->ERROR = \"POP3 user: \" . _(\"no login ID submitted\");\n            return false;\n        } elseif(!isset($this->FP)) {\n            $this->ERROR = \"POP3 user: \" . _(\"connection not established\");\n            return false;\n        } else {\n            $reply = $this->send_cmd(\"USER $user\");\n            if(!$this->is_ok($reply)) {\n                $this->ERROR = \"POP3 user: \" . _(\"Error \") . \"[$reply]\";\n                return false;\n            } else\n                return true;\n        }\n    }\n\n    function pass ($pass = \"\")     {\n        // Sends the PASS command, returns # of msgs in mailbox,\n        // returns false (undef) on Auth failure\n\n        if(empty($pass)) {\n            $this->ERROR = \"POP3 pass: \" . _(\"No password submitted\");\n            return false;\n        } elseif(!isset($this->FP)) {\n            $this->ERROR = \"POP3 pass: \" . _(\"connection not established\");\n            return false;\n        } else {\n            $reply = $this->send_cmd(\"PASS $pass\");\n            if(!$this->is_ok($reply)) {\n                $this->ERROR = \"POP3 pass: \" . _(\"Authentication failed\") . \" [$reply]\";\n                $this->quit();\n                return false;\n            } else {\n                //  Auth successful.\n                $count = $this->last(\"count\");\n                $this->COUNT = $count;\n                return $count;\n            }\n        }\n    }\n\n    function apop ($login,$pass) {\n        //  Attempts an APOP login. If this fails, it'll\n        //  try a standard login. YOUR SERVER MUST SUPPORT\n        //  THE USE OF THE APOP COMMAND!\n        //  (apop is optional per rfc1939)\n\n        if(!isset($this->FP)) {\n            $this->ERROR = \"POP3 apop: \" . _(\"No connection to server\");\n            return false;\n        } elseif(!$this->ALLOWAPOP) {\n            $retVal = $this->login($login,$pass);\n            return $retVal;\n        } elseif(empty($login)) {\n            $this->ERROR = \"POP3 apop: \" . _(\"No login ID submitted\");\n            return false;\n        } elseif(empty($pass)) {\n            $this->ERROR = \"POP3 apop: \" . _(\"No password submitted\");\n            return false;\n        } else {\n            $banner = $this->BANNER;\n            if( (!$banner) or (empty($banner)) ) {\n                $this->ERROR = \"POP3 apop: \" . _(\"No server banner\") . ' - ' . _(\"abort\");\n                $retVal = $this->login($login,$pass);\n                return $retVal;\n            } else {\n                $AuthString = $banner;\n                $AuthString .= $pass;\n                $APOPString = md5($AuthString);\n                $cmd = \"APOP $login $APOPString\";\n                $reply = $this->send_cmd($cmd);\n                if(!$this->is_ok($reply)) {\n                    $this->ERROR = \"POP3 apop: \" . _(\"apop authentication failed\") . ' - ' . _(\"abort\");\n                    $retVal = $this->login($login,$pass);\n                    return $retVal;\n                } else {\n                    //  Auth successful.\n                    $count = $this->last(\"count\");\n                    $this->COUNT = $count;\n                    return $count;\n                }\n            }\n        }\n    }\n\n    function login ($login = \"\", $pass = \"\") {\n        // Sends both user and pass. Returns # of msgs in mailbox or\n        // false on failure (or -1, if the error occurs while getting\n        // the number of messages.)\n\n        if( !isset($this->FP) ) {\n            $this->ERROR = \"POP3 login: \" . _(\"No connection to server\");\n            return false;\n        } else {\n            $fp = $this->FP;\n            if( !$this->user( $login ) ) {\n                //  Preserve the error generated by user()\n                return false;\n            } else {\n                $count = $this->pass($pass);\n                if( (!$count) || ($count == -1) ) {\n                    //  Preserve the error generated by last() and pass()\n                    return false;\n                } else\n                    return $count;\n            }\n        }\n    }\n\n    function top ($msgNum, $numLines = \"0\") {\n        //  Gets the header and first $numLines of the msg body\n        //  returns data in an array with each returned line being\n        //  an array element. If $numLines is empty, returns\n        //  only the header information, and none of the body.\n\n        if(!isset($this->FP)) {\n            $this->ERROR = \"POP3 top: \" . _(\"No connection to server\");\n            return false;\n        }\n        $this->update_timer();\n\n        $fp = $this->FP;\n        $buffer = $this->BUFFER;\n        $cmd = \"TOP $msgNum $numLines\";\n        fwrite($fp, \"TOP $msgNum $numLines\\r\\n\");\n        $reply = fgets($fp, $buffer);\n        $reply = $this->strip_clf($reply);\n        if($this->DEBUG) {\n            @error_log(\"POP3 SEND [$cmd] GOT [$reply]\",0);\n        }\n        if(!$this->is_ok($reply))\n        {\n            $this->ERROR = \"POP3 top: \" . _(\"Error \") . \"[$reply]\";\n            return false;\n        }\n\n        $count = 0;\n        $MsgArray = array();\n\n        $line = fgets($fp,$buffer);\n        while ( !preg_match('/^\\.\\r\\n/',$line))\n        {\n            $MsgArray[$count] = $line;\n            $count++;\n            $line = fgets($fp,$buffer);\n            if(empty($line))    { break; }\n        }\n\n        return $MsgArray;\n    }\n\n    function pop_list ($msgNum = \"\") {\n        //  If called with an argument, returns that msgs' size in octets\n        //  No argument returns an associative array of undeleted\n        //  msg numbers and their sizes in octets\n\n        if(!isset($this->FP))\n        {\n            $this->ERROR = \"POP3 pop_list: \" . _(\"No connection to server\");\n            return false;\n        }\n        $fp = $this->FP;\n        $Total = $this->COUNT;\n        if( (!$Total) or ($Total == -1) )\n        {\n            return false;\n        }\n        if($Total == 0)\n        {\n            return array(\"0\",\"0\");\n            // return -1;   // mailbox empty\n        }\n\n        $this->update_timer();\n\n        if(!empty($msgNum))\n        {\n            $cmd = \"LIST $msgNum\";\n            fwrite($fp,\"$cmd\\r\\n\");\n            $reply = fgets($fp,$this->BUFFER);\n            $reply = $this->strip_clf($reply);\n            if($this->DEBUG) {\n                @error_log(\"POP3 SEND [$cmd] GOT [$reply]\",0);\n            }\n            if(!$this->is_ok($reply))\n            {\n                $this->ERROR = \"POP3 pop_list: \" . _(\"Error \") . \"[$reply]\";\n                return false;\n            }\n            list($junk,$num,$size) = preg_split('/\\s+/',$reply);\n            return $size;\n        }\n        $cmd = \"LIST\";\n        $reply = $this->send_cmd($cmd);\n        if(!$this->is_ok($reply))\n        {\n            $reply = $this->strip_clf($reply);\n            $this->ERROR = \"POP3 pop_list: \" . _(\"Error \") .  \"[$reply]\";\n            return false;\n        }\n        $MsgArray = array();\n        $MsgArray[0] = $Total;\n        for($msgC=1;$msgC <= $Total; $msgC++)\n        {\n            if($msgC > $Total) { break; }\n            $line = fgets($fp,$this->BUFFER);\n            $line = $this->strip_clf($line);\n            if(strpos($line, '.') === 0)\n            {\n                $this->ERROR = \"POP3 pop_list: \" . _(\"Premature end of list\");\n                return false;\n            }\n            list($thisMsg,$msgSize) = preg_split('/\\s+/',$line);\n            settype($thisMsg,\"integer\");\n            if($thisMsg != $msgC)\n            {\n                $MsgArray[$msgC] = \"deleted\";\n            }\n            else\n            {\n                $MsgArray[$msgC] = $msgSize;\n            }\n        }\n        return $MsgArray;\n    }\n\n    function get ($msgNum) {\n        //  Retrieve the specified msg number. Returns an array\n        //  where each line of the msg is an array element.\n\n        if(!isset($this->FP))\n        {\n            $this->ERROR = \"POP3 get: \" . _(\"No connection to server\");\n            return false;\n        }\n\n        $this->update_timer();\n\n        $fp = $this->FP;\n        $buffer = $this->BUFFER;\n        $cmd = \"RETR $msgNum\";\n        $reply = $this->send_cmd($cmd);\n\n        if(!$this->is_ok($reply))\n        {\n            $this->ERROR = \"POP3 get: \" . _(\"Error \") . \"[$reply]\";\n            return false;\n        }\n\n        $count = 0;\n        $MsgArray = array();\n\n        $line = fgets($fp,$buffer);\n        while ( !preg_match('/^\\.\\r\\n/',$line))\n        {\n            if ( $line{0} == '.' ) { $line = substr($line,1); }\n            $MsgArray[$count] = $line;\n            $count++;\n            $line = fgets($fp,$buffer);\n            if(empty($line))    { break; }\n        }\n        return $MsgArray;\n    }\n\n    function last ( $type = \"count\" ) {\n        //  Returns the highest msg number in the mailbox.\n        //  returns -1 on error, 0+ on success, if type != count\n        //  results in a popstat() call (2 element array returned)\n\n        $last = -1;\n        if(!isset($this->FP))\n        {\n            $this->ERROR = \"POP3 last: \" . _(\"No connection to server\");\n            return $last;\n        }\n\n        $reply = $this->send_cmd(\"STAT\");\n        if(!$this->is_ok($reply))\n        {\n            $this->ERROR = \"POP3 last: \" . _(\"Error \") . \"[$reply]\";\n            return $last;\n        }\n\n        $Vars = preg_split('/\\s+/',$reply);\n        $count = $Vars[1];\n        $size = $Vars[2];\n        settype($count,\"integer\");\n        settype($size,\"integer\");\n        if($type != \"count\")\n        {\n            return array($count,$size);\n        }\n        return $count;\n    }\n\n    function reset () {\n        //  Resets the status of the remote server. This includes\n        //  resetting the status of ALL msgs to not be deleted.\n        //  This method automatically closes the connection to the server.\n\n        if(!isset($this->FP))\n        {\n            $this->ERROR = \"POP3 reset: \" . _(\"No connection to server\");\n            return false;\n        }\n        $reply = $this->send_cmd(\"RSET\");\n        if(!$this->is_ok($reply))\n        {\n            //  The POP3 RSET command -never- gives a -ERR\n            //  response - if it ever does, something truely\n            //  wild is going on.\n\n            $this->ERROR = \"POP3 reset: \" . _(\"Error \") . \"[$reply]\";\n            @error_log(\"POP3 reset: ERROR [$reply]\",0);\n        }\n        $this->quit();\n        return true;\n    }\n\n    function send_cmd ( $cmd = \"\" )\n    {\n        //  Sends a user defined command string to the\n        //  POP server and returns the results. Useful for\n        //  non-compliant or custom POP servers.\n        //  Do NOT includ the \\r\\n as part of your command\n        //  string - it will be appended automatically.\n\n        //  The return value is a standard fgets() call, which\n        //  will read up to $this->BUFFER bytes of data, until it\n        //  encounters a new line, or EOF, whichever happens first.\n\n        //  This method works best if $cmd responds with only\n        //  one line of data.\n\n        if(!isset($this->FP))\n        {\n            $this->ERROR = \"POP3 send_cmd: \" . _(\"No connection to server\");\n            return false;\n        }\n\n        if(empty($cmd))\n        {\n            $this->ERROR = \"POP3 send_cmd: \" . _(\"Empty command string\");\n            return \"\";\n        }\n\n        $fp = $this->FP;\n        $buffer = $this->BUFFER;\n        $this->update_timer();\n        fwrite($fp,\"$cmd\\r\\n\");\n        $reply = fgets($fp,$buffer);\n        $reply = $this->strip_clf($reply);\n        if($this->DEBUG) { @error_log(\"POP3 SEND [$cmd] GOT [$reply]\",0); }\n        return $reply;\n    }\n\n    function quit() {\n        //  Closes the connection to the POP3 server, deleting\n        //  any msgs marked as deleted.\n\n        if(!isset($this->FP))\n        {\n            $this->ERROR = \"POP3 quit: \" . _(\"connection does not exist\");\n            return false;\n        }\n        $fp = $this->FP;\n        $cmd = \"QUIT\";\n        fwrite($fp,\"$cmd\\r\\n\");\n        $reply = fgets($fp,$this->BUFFER);\n        $reply = $this->strip_clf($reply);\n        if($this->DEBUG) { @error_log(\"POP3 SEND [$cmd] GOT [$reply]\",0); }\n        fclose($fp);\n        unset($this->FP);\n        return true;\n    }\n\n    function popstat () {\n        //  Returns an array of 2 elements. The number of undeleted\n        //  msgs in the mailbox, and the size of the mbox in octets.\n\n        $PopArray = $this->last(\"array\");\n\n        if($PopArray == -1) { return false; }\n\n        if( (!$PopArray) or (empty($PopArray)) )\n        {\n            return false;\n        }\n        return $PopArray;\n    }\n\n    function uidl ($msgNum = \"\")\n    {\n        //  Returns the UIDL of the msg specified. If called with\n        //  no arguments, returns an associative array where each\n        //  undeleted msg num is a key, and the msg's uidl is the element\n        //  Array element 0 will contain the total number of msgs\n\n        if(!isset($this->FP)) {\n            $this->ERROR = \"POP3 uidl: \" . _(\"No connection to server\");\n            return false;\n        }\n\n        $fp = $this->FP;\n        $buffer = $this->BUFFER;\n\n        if(!empty($msgNum)) {\n            $cmd = \"UIDL $msgNum\";\n            $reply = $this->send_cmd($cmd);\n            if(!$this->is_ok($reply))\n            {\n                $this->ERROR = \"POP3 uidl: \" . _(\"Error \") . \"[$reply]\";\n                return false;\n            }\n            list ($ok,$num,$myUidl) = preg_split('/\\s+/',$reply);\n            return $myUidl;\n        } else {\n            $this->update_timer();\n\n            $UIDLArray = array();\n            $Total = $this->COUNT;\n            $UIDLArray[0] = $Total;\n\n            if ($Total < 1)\n            {\n                return $UIDLArray;\n            }\n            $cmd = \"UIDL\";\n            fwrite($fp, \"UIDL\\r\\n\");\n            $reply = fgets($fp, $buffer);\n            $reply = $this->strip_clf($reply);\n            if($this->DEBUG) { @error_log(\"POP3 SEND [$cmd] GOT [$reply]\",0); }\n            if(!$this->is_ok($reply))\n            {\n                $this->ERROR = \"POP3 uidl: \" . _(\"Error \") . \"[$reply]\";\n                return false;\n            }\n\n            $line = \"\";\n            $count = 1;\n            $line = fgets($fp,$buffer);\n            while ( !preg_match('/^\\.\\r\\n/',$line)) {\n                list ($msg,$msgUidl) = preg_split('/\\s+/',$line);\n                $msgUidl = $this->strip_clf($msgUidl);\n                if($count == $msg) {\n                    $UIDLArray[$msg] = $msgUidl;\n                }\n                else\n                {\n                    $UIDLArray[$count] = 'deleted';\n                }\n                $count++;\n                $line = fgets($fp,$buffer);\n            }\n        }\n        return $UIDLArray;\n    }\n\n    function delete ($msgNum = \"\") {\n        //  Flags a specified msg as deleted. The msg will not\n        //  be deleted until a quit() method is called.\n\n        if(!isset($this->FP))\n        {\n            $this->ERROR = \"POP3 delete: \" . _(\"No connection to server\");\n            return false;\n        }\n        if(empty($msgNum))\n        {\n            $this->ERROR = \"POP3 delete: \" . _(\"No msg number submitted\");\n            return false;\n        }\n        $reply = $this->send_cmd(\"DELE $msgNum\");\n        if(!$this->is_ok($reply))\n        {\n            $this->ERROR = \"POP3 delete: \" . _(\"Command failed \") . \"[$reply]\";\n            return false;\n        }\n        return true;\n    }\n\n    //  *********************************************************\n\n    //  The following methods are internal to the class.\n\n    function is_ok ($cmd = \"\") {\n        //  Return true or false on +OK or -ERR\n\n        if( empty($cmd) )\n            return false;\n        else\n            return( stripos($cmd, '+OK') !== false );\n    }\n\n    function strip_clf ($text = \"\") {\n        // Strips \\r\\n from server responses\n\n        if(empty($text))\n            return $text;\n        else {\n            $stripped = str_replace(array(\"\\r\",\"\\n\"),'',$text);\n            return $stripped;\n        }\n    }\n\n    function parse_banner ( $server_text ) {\n        $outside = true;\n        $banner = \"\";\n        $length = strlen($server_text);\n        for($count =0; $count < $length; $count++)\n        {\n            $digit = substr($server_text,$count,1);\n            if(!empty($digit))             {\n                if( (!$outside) && ($digit != '<') && ($digit != '>') )\n                {\n                    $banner .= $digit;\n                }\n                if ($digit == '<')\n                {\n                    $outside = false;\n                }\n                if($digit == '>')\n                {\n                    $outside = true;\n                }\n            }\n        }\n        $banner = $this->strip_clf($banner);    // Just in case\n        return \"<$banner>\";\n    }\n\n}   // End class\n\n// For php4 compatibility\nif (!function_exists(\"stripos\")) {\n    function stripos($haystack, $needle){\n        return strpos($haystack, stristr( $haystack, $needle ));\n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-simplepie.php",
    "content": "<?php\nif ( ! class_exists( 'SimplePie', false ) ) :\n\n// Load classes we will need.\nrequire ABSPATH . WPINC . '/SimplePie/Misc.php';\nrequire ABSPATH . WPINC . '/SimplePie/Cache.php';\nrequire ABSPATH . WPINC . '/SimplePie/File.php';\nrequire ABSPATH . WPINC . '/SimplePie/Sanitize.php';\nrequire ABSPATH . WPINC . '/SimplePie/Registry.php';\nrequire ABSPATH . WPINC . '/SimplePie/IRI.php';\nrequire ABSPATH . WPINC . '/SimplePie/Locator.php';\nrequire ABSPATH . WPINC . '/SimplePie/Content/Type/Sniffer.php';\nrequire ABSPATH . WPINC . '/SimplePie/XML/Declaration/Parser.php';\nrequire ABSPATH . WPINC . '/SimplePie/Parser.php';\nrequire ABSPATH . WPINC . '/SimplePie/Item.php';\nrequire ABSPATH . WPINC . '/SimplePie/Parse/Date.php';\nrequire ABSPATH . WPINC . '/SimplePie/Author.php';\n\n/**\n * WordPress autoloader for SimplePie.\n *\n * @since 3.5.0\n */\nfunction wp_simplepie_autoload( $class ) {\n\tif ( 0 !== strpos( $class, 'SimplePie_' ) )\n\t\treturn;\n\n\t$file = ABSPATH . WPINC . '/' . str_replace( '_', '/', $class ) . '.php';\n\tinclude( $file );\n}\n\nif ( function_exists( 'spl_autoload_register' ) ) {\n\t/**\n\t * We autoload classes we may not need.\n\t *\n\t * If SPL is disabled, we load all of SimplePie manually.\n\t *\n\t * Core.php is not loaded manually, because SimplePie_Core (a deprecated class)\n\t * was never included in WordPress core.\n\t */\n\tspl_autoload_register( 'wp_simplepie_autoload' );\n} else {\n\trequire ABSPATH . WPINC . '/SimplePie/Cache/Base.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Cache/DB.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Cache/File.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Cache/Memcache.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Cache/MySQL.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Caption.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Category.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Copyright.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Credit.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Decode/HTML/Entities.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Enclosure.php';\n\trequire ABSPATH . WPINC . '/SimplePie/gzdecode.php';\n\trequire ABSPATH . WPINC . '/SimplePie/HTTP/Parser.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Net/IPv6.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Rating.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Restriction.php';\n\trequire ABSPATH . WPINC . '/SimplePie/Source.php';\n}\n\n/**\n * SimplePie\n *\n * A PHP-Based RSS and Atom Feed Framework.\n * Takes the hard work out of managing a complete RSS/Atom solution.\n *\n * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are\n * permitted provided that the following conditions are met:\n *\n * \t* Redistributions of source code must retain the above copyright notice, this list of\n * \t  conditions and the following disclaimer.\n *\n * \t* Redistributions in binary form must reproduce the above copyright notice, this list\n * \t  of conditions and the following disclaimer in the documentation and/or other materials\n * \t  provided with the distribution.\n *\n * \t* Neither the name of the SimplePie Team nor the names of its contributors may be used\n * \t  to endorse or promote products derived from this software without specific prior\n * \t  written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS\n * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @package SimplePie\n * @version 1.3.1\n * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue\n * @author Ryan Parman\n * @author Geoffrey Sneddon\n * @author Ryan McCue\n * @link http://simplepie.org/ SimplePie\n * @license http://www.opensource.org/licenses/bsd-license.php BSD License\n */\n\n/**\n * SimplePie Name\n */\ndefine('SIMPLEPIE_NAME', 'SimplePie');\n\n/**\n * SimplePie Version\n */\ndefine('SIMPLEPIE_VERSION', '1.3.1');\n\n/**\n * SimplePie Build\n * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::get_build() only every load of simplepie.inc)\n */\ndefine('SIMPLEPIE_BUILD', gmdate('YmdHis', SimplePie_Misc::get_build()));\n\n/**\n * SimplePie Website URL\n */\ndefine('SIMPLEPIE_URL', 'http://simplepie.org');\n\n/**\n * SimplePie Useragent\n * @see SimplePie::set_useragent()\n */\ndefine('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD);\n\n/**\n * SimplePie Linkback\n */\ndefine('SIMPLEPIE_LINKBACK', '<a href=\"' . SIMPLEPIE_URL . '\" title=\"' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '\">' . SIMPLEPIE_NAME . '</a>');\n\n/**\n * No Autodiscovery\n * @see SimplePie::set_autodiscovery_level()\n */\ndefine('SIMPLEPIE_LOCATOR_NONE', 0);\n\n/**\n * Feed Link Element Autodiscovery\n * @see SimplePie::set_autodiscovery_level()\n */\ndefine('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1);\n\n/**\n * Local Feed Extension Autodiscovery\n * @see SimplePie::set_autodiscovery_level()\n */\ndefine('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2);\n\n/**\n * Local Feed Body Autodiscovery\n * @see SimplePie::set_autodiscovery_level()\n */\ndefine('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4);\n\n/**\n * Remote Feed Extension Autodiscovery\n * @see SimplePie::set_autodiscovery_level()\n */\ndefine('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8);\n\n/**\n * Remote Feed Body Autodiscovery\n * @see SimplePie::set_autodiscovery_level()\n */\ndefine('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16);\n\n/**\n * All Feed Autodiscovery\n * @see SimplePie::set_autodiscovery_level()\n */\ndefine('SIMPLEPIE_LOCATOR_ALL', 31);\n\n/**\n * No known feed type\n */\ndefine('SIMPLEPIE_TYPE_NONE', 0);\n\n/**\n * RSS 0.90\n */\ndefine('SIMPLEPIE_TYPE_RSS_090', 1);\n\n/**\n * RSS 0.91 (Netscape)\n */\ndefine('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2);\n\n/**\n * RSS 0.91 (Userland)\n */\ndefine('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4);\n\n/**\n * RSS 0.91 (both Netscape and Userland)\n */\ndefine('SIMPLEPIE_TYPE_RSS_091', 6);\n\n/**\n * RSS 0.92\n */\ndefine('SIMPLEPIE_TYPE_RSS_092', 8);\n\n/**\n * RSS 0.93\n */\ndefine('SIMPLEPIE_TYPE_RSS_093', 16);\n\n/**\n * RSS 0.94\n */\ndefine('SIMPLEPIE_TYPE_RSS_094', 32);\n\n/**\n * RSS 1.0\n */\ndefine('SIMPLEPIE_TYPE_RSS_10', 64);\n\n/**\n * RSS 2.0\n */\ndefine('SIMPLEPIE_TYPE_RSS_20', 128);\n\n/**\n * RDF-based RSS\n */\ndefine('SIMPLEPIE_TYPE_RSS_RDF', 65);\n\n/**\n * Non-RDF-based RSS (truly intended as syndication format)\n */\ndefine('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190);\n\n/**\n * All RSS\n */\ndefine('SIMPLEPIE_TYPE_RSS_ALL', 255);\n\n/**\n * Atom 0.3\n */\ndefine('SIMPLEPIE_TYPE_ATOM_03', 256);\n\n/**\n * Atom 1.0\n */\ndefine('SIMPLEPIE_TYPE_ATOM_10', 512);\n\n/**\n * All Atom\n */\ndefine('SIMPLEPIE_TYPE_ATOM_ALL', 768);\n\n/**\n * All feed types\n */\ndefine('SIMPLEPIE_TYPE_ALL', 1023);\n\n/**\n * No construct\n */\ndefine('SIMPLEPIE_CONSTRUCT_NONE', 0);\n\n/**\n * Text construct\n */\ndefine('SIMPLEPIE_CONSTRUCT_TEXT', 1);\n\n/**\n * HTML construct\n */\ndefine('SIMPLEPIE_CONSTRUCT_HTML', 2);\n\n/**\n * XHTML construct\n */\ndefine('SIMPLEPIE_CONSTRUCT_XHTML', 4);\n\n/**\n * base64-encoded construct\n */\ndefine('SIMPLEPIE_CONSTRUCT_BASE64', 8);\n\n/**\n * IRI construct\n */\ndefine('SIMPLEPIE_CONSTRUCT_IRI', 16);\n\n/**\n * A construct that might be HTML\n */\ndefine('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32);\n\n/**\n * All constructs\n */\ndefine('SIMPLEPIE_CONSTRUCT_ALL', 63);\n\n/**\n * Don't change case\n */\ndefine('SIMPLEPIE_SAME_CASE', 1);\n\n/**\n * Change to lowercase\n */\ndefine('SIMPLEPIE_LOWERCASE', 2);\n\n/**\n * Change to uppercase\n */\ndefine('SIMPLEPIE_UPPERCASE', 4);\n\n/**\n * PCRE for HTML attributes\n */\ndefine('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\\x09\\x0A\\x0B\\x0C\\x0D\\x20]+[^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x2F\\x3E][^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x2F\\x3D\\x3E]*(?:[\\x09\\x0A\\x0B\\x0C\\x0D\\x20]*=[\\x09\\x0A\\x0B\\x0C\\x0D\\x20]*(?:\"(?:[^\"]*)\"|\\'(?:[^\\']*)\\'|(?:[^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x22\\x27\\x3E][^\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\x3E]*)?))?)*)[\\x09\\x0A\\x0B\\x0C\\x0D\\x20]*');\n\n/**\n * PCRE for XML attributes\n */\ndefine('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\\s+(?:(?:[^\\s:]+:)?[^\\s:]+)\\s*=\\s*(?:\"(?:[^\"]*)\"|\\'(?:[^\\']*)\\'))*)\\s*');\n\n/**\n * XML Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace');\n\n/**\n * Atom 1.0 Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom');\n\n/**\n * Atom 0.3 Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#');\n\n/**\n * RDF Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');\n\n/**\n * RSS 0.90 Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/');\n\n/**\n * RSS 1.0 Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/');\n\n/**\n * RSS 1.0 Content Module Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/');\n\n/**\n * RSS 2.0 Namespace\n * (Stupid, I know, but I'm certain it will confuse people less with support.)\n */\ndefine('SIMPLEPIE_NAMESPACE_RSS_20', '');\n\n/**\n * DC 1.0 Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/');\n\n/**\n * DC 1.1 Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/');\n\n/**\n * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#');\n\n/**\n * GeoRSS Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss');\n\n/**\n * Media RSS Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');\n\n/**\n * Wrong Media RSS Namespace. Caused by a long-standing typo in the spec.\n */\ndefine('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss');\n\n/**\n * Wrong Media RSS Namespace #2. New namespace introduced in Media RSS 1.5.\n */\ndefine('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2', 'http://video.search.yahoo.com/mrss');\n\n/**\n * Wrong Media RSS Namespace #3. A possible typo of the Media RSS 1.5 namespace.\n */\ndefine('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3', 'http://video.search.yahoo.com/mrss/');\n\n/**\n * Wrong Media RSS Namespace #4. New spec location after the RSS Advisory Board takes it over, but not a valid namespace.\n */\ndefine('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4', 'http://www.rssboard.org/media-rss');\n\n/**\n * Wrong Media RSS Namespace #5. A possible typo of the RSS Advisory Board URL.\n */\ndefine('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5', 'http://www.rssboard.org/media-rss/');\n\n/**\n * iTunes RSS Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');\n\n/**\n * XHTML Namespace\n */\ndefine('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml');\n\n/**\n * IANA Link Relations Registry\n */\ndefine('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');\n\n/**\n * No file source\n */\ndefine('SIMPLEPIE_FILE_SOURCE_NONE', 0);\n\n/**\n * Remote file source\n */\ndefine('SIMPLEPIE_FILE_SOURCE_REMOTE', 1);\n\n/**\n * Local file source\n */\ndefine('SIMPLEPIE_FILE_SOURCE_LOCAL', 2);\n\n/**\n * fsockopen() file source\n */\ndefine('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4);\n\n/**\n * cURL file source\n */\ndefine('SIMPLEPIE_FILE_SOURCE_CURL', 8);\n\n/**\n * file_get_contents() file source\n */\ndefine('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16);\n\n\n\n/**\n * SimplePie\n *\n * @package SimplePie\n * @subpackage API\n */\nclass SimplePie\n{\n\t/**\n\t * @var array Raw data\n\t * @access private\n\t */\n\tpublic $data = array();\n\n\t/**\n\t * @var mixed Error string\n\t * @access private\n\t */\n\tpublic $error;\n\n\t/**\n\t * @var object Instance of SimplePie_Sanitize (or other class)\n\t * @see SimplePie::set_sanitize_class()\n\t * @access private\n\t */\n\tpublic $sanitize;\n\n\t/**\n\t * @var string SimplePie Useragent\n\t * @see SimplePie::set_useragent()\n\t * @access private\n\t */\n\tpublic $useragent = SIMPLEPIE_USERAGENT;\n\n\t/**\n\t * @var string Feed URL\n\t * @see SimplePie::set_feed_url()\n\t * @access private\n\t */\n\tpublic $feed_url;\n\n\t/**\n\t * @var object Instance of SimplePie_File to use as a feed\n\t * @see SimplePie::set_file()\n\t * @access private\n\t */\n\tpublic $file;\n\n\t/**\n\t * @var string Raw feed data\n\t * @see SimplePie::set_raw_data()\n\t * @access private\n\t */\n\tpublic $raw_data;\n\n\t/**\n\t * @var int Timeout for fetching remote files\n\t * @see SimplePie::set_timeout()\n\t * @access private\n\t */\n\tpublic $timeout = 10;\n\n\t/**\n\t * @var bool Forces fsockopen() to be used for remote files instead\n\t * of cURL, even if a new enough version is installed\n\t * @see SimplePie::force_fsockopen()\n\t * @access private\n\t */\n\tpublic $force_fsockopen = false;\n\n\t/**\n\t * @var bool Force the given data/URL to be treated as a feed no matter what\n\t * it appears like\n\t * @see SimplePie::force_feed()\n\t * @access private\n\t */\n\tpublic $force_feed = false;\n\n\t/**\n\t * @var bool Enable/Disable Caching\n\t * @see SimplePie::enable_cache()\n\t * @access private\n\t */\n\tpublic $cache = true;\n\n\t/**\n\t * @var int Cache duration (in seconds)\n\t * @see SimplePie::set_cache_duration()\n\t * @access private\n\t */\n\tpublic $cache_duration = 3600;\n\n\t/**\n\t * @var int Auto-discovery cache duration (in seconds)\n\t * @see SimplePie::set_autodiscovery_cache_duration()\n\t * @access private\n\t */\n\tpublic $autodiscovery_cache_duration = 604800; // 7 Days.\n\n\t/**\n\t * @var string Cache location (relative to executing script)\n\t * @see SimplePie::set_cache_location()\n\t * @access private\n\t */\n\tpublic $cache_location = './cache';\n\n\t/**\n\t * @var string Function that creates the cache filename\n\t * @see SimplePie::set_cache_name_function()\n\t * @access private\n\t */\n\tpublic $cache_name_function = 'md5';\n\n\t/**\n\t * @var bool Reorder feed by date descending\n\t * @see SimplePie::enable_order_by_date()\n\t * @access private\n\t */\n\tpublic $order_by_date = true;\n\n\t/**\n\t * @var mixed Force input encoding to be set to the follow value\n\t * (false, or anything type-cast to false, disables this feature)\n\t * @see SimplePie::set_input_encoding()\n\t * @access private\n\t */\n\tpublic $input_encoding = false;\n\n\t/**\n\t * @var int Feed Autodiscovery Level\n\t * @see SimplePie::set_autodiscovery_level()\n\t * @access private\n\t */\n\tpublic $autodiscovery = SIMPLEPIE_LOCATOR_ALL;\n\n\t/**\n\t * Class registry object\n\t *\n\t * @var SimplePie_Registry\n\t */\n\tpublic $registry;\n\n\t/**\n\t * @var int Maximum number of feeds to check with autodiscovery\n\t * @see SimplePie::set_max_checked_feeds()\n\t * @access private\n\t */\n\tpublic $max_checked_feeds = 10;\n\n\t/**\n\t * @var array All the feeds found during the autodiscovery process\n\t * @see SimplePie::get_all_discovered_feeds()\n\t * @access private\n\t */\n\tpublic $all_discovered_feeds = array();\n\n\t/**\n\t * @var string Web-accessible path to the handler_image.php file.\n\t * @see SimplePie::set_image_handler()\n\t * @access private\n\t */\n\tpublic $image_handler = '';\n\n\t/**\n\t * @var array Stores the URLs when multiple feeds are being initialized.\n\t * @see SimplePie::set_feed_url()\n\t * @access private\n\t */\n\tpublic $multifeed_url = array();\n\n\t/**\n\t * @var array Stores SimplePie objects when multiple feeds initialized.\n\t * @access private\n\t */\n\tpublic $multifeed_objects = array();\n\n\t/**\n\t * @var array Stores the get_object_vars() array for use with multifeeds.\n\t * @see SimplePie::set_feed_url()\n\t * @access private\n\t */\n\tpublic $config_settings = null;\n\n\t/**\n\t * @var integer Stores the number of items to return per-feed with multifeeds.\n\t * @see SimplePie::set_item_limit()\n\t * @access private\n\t */\n\tpublic $item_limit = 0;\n\n\t/**\n\t * @var array Stores the default attributes to be stripped by strip_attributes().\n\t * @see SimplePie::strip_attributes()\n\t * @access private\n\t */\n\tpublic $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');\n\n\t/**\n\t * @var array Stores the default tags to be stripped by strip_htmltags().\n\t * @see SimplePie::strip_htmltags()\n\t * @access private\n\t */\n\tpublic $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');\n\n\t/**\n\t * The SimplePie class contains feed level data and options\n\t *\n\t * To use SimplePie, create the SimplePie object with no parameters. You can\n\t * then set configuration options using the provided methods. After setting\n\t * them, you must initialise the feed using $feed->init(). At that point the\n\t * object's methods and properties will be available to you.\n\t *\n\t * Previously, it was possible to pass in the feed URL along with cache\n\t * options directly into the constructor. This has been removed as of 1.3 as\n\t * it caused a lot of confusion.\n\t *\n\t * @since 1.0 Preview Release\n\t */\n\tpublic function __construct()\n\t{\n\t\tif (version_compare(PHP_VERSION, '5.2', '<'))\n\t\t{\n\t\t\ttrigger_error('PHP 4.x, 5.0 and 5.1 are no longer supported. Please upgrade to PHP 5.2 or newer.');\n\t\t\tdie();\n\t\t}\n\n\t\t// Other objects, instances created here so we can set options on them\n\t\t$this->sanitize = new SimplePie_Sanitize();\n\t\t$this->registry = new SimplePie_Registry();\n\n\t\tif (func_num_args() > 0)\n\t\t{\n\t\t\t$level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;\n\t\t\ttrigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_location() directly.', $level);\n\n\t\t\t$args = func_get_args();\n\t\t\tswitch (count($args)) {\n\t\t\t\tcase 3:\n\t\t\t\t\t$this->set_cache_duration($args[2]);\n\t\t\t\tcase 2:\n\t\t\t\t\t$this->set_cache_location($args[1]);\n\t\t\t\tcase 1:\n\t\t\t\t\t$this->set_feed_url($args[0]);\n\t\t\t\t\t$this->init();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Used for converting object to a string\n\t */\n\tpublic function __toString()\n\t{\n\t\treturn md5(serialize($this->data));\n\t}\n\n\t/**\n\t * Remove items that link back to this before destroying this object\n\t */\n\tpublic function __destruct()\n\t{\n\t\tif ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))\n\t\t{\n\t\t\tif (!empty($this->data['items']))\n\t\t\t{\n\t\t\t\tforeach ($this->data['items'] as $item)\n\t\t\t\t{\n\t\t\t\t\t$item->__destruct();\n\t\t\t\t}\n\t\t\t\tunset($item, $this->data['items']);\n\t\t\t}\n\t\t\tif (!empty($this->data['ordered_items']))\n\t\t\t{\n\t\t\t\tforeach ($this->data['ordered_items'] as $item)\n\t\t\t\t{\n\t\t\t\t\t$item->__destruct();\n\t\t\t\t}\n\t\t\t\tunset($item, $this->data['ordered_items']);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Force the given data/URL to be treated as a feed\n\t *\n\t * This tells SimplePie to ignore the content-type provided by the server.\n\t * Be careful when using this option, as it will also disable autodiscovery.\n\t *\n\t * @since 1.1\n\t * @param bool $enable Force the given data/URL to be treated as a feed\n\t */\n\tpublic function force_feed($enable = false)\n\t{\n\t\t$this->force_feed = (bool) $enable;\n\t}\n\n\t/**\n\t * Set the URL of the feed you want to parse\n\t *\n\t * This allows you to enter the URL of the feed you want to parse, or the\n\t * website you want to try to use auto-discovery on. This takes priority\n\t * over any set raw data.\n\t *\n\t * You can set multiple feeds to mash together by passing an array instead\n\t * of a string for the $url. Remember that with each additional feed comes\n\t * additional processing and resources.\n\t *\n\t * @since 1.0 Preview Release\n\t * @see set_raw_data()\n\t * @param string|array $url This is the URL (or array of URLs) that you want to parse.\n\t */\n\tpublic function set_feed_url($url)\n\t{\n\t\t$this->multifeed_url = array();\n\t\tif (is_array($url))\n\t\t{\n\t\t\tforeach ($url as $value)\n\t\t\t{\n\t\t\t\t$this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', array($value, 1));\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->feed_url = $this->registry->call('Misc', 'fix_protocol', array($url, 1));\n\t\t}\n\t}\n\n\t/**\n\t * Set an instance of {@see SimplePie_File} to use as a feed\n\t *\n\t * @param SimplePie_File &$file\n\t * @return bool True on success, false on failure\n\t */\n\tpublic function set_file(&$file)\n\t{\n\t\tif ($file instanceof SimplePie_File)\n\t\t{\n\t\t\t$this->feed_url = $file->url;\n\t\t\t$this->file =& $file;\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Set the raw XML data to parse\n\t *\n\t * Allows you to use a string of RSS/Atom data instead of a remote feed.\n\t *\n\t * If you have a feed available as a string in PHP, you can tell SimplePie\n\t * to parse that data string instead of a remote feed. Any set feed URL\n\t * takes precedence.\n\t *\n\t * @since 1.0 Beta 3\n\t * @param string $data RSS or Atom data as a string.\n\t * @see set_feed_url()\n\t */\n\tpublic function set_raw_data($data)\n\t{\n\t\t$this->raw_data = $data;\n\t}\n\n\t/**\n\t * Set the the default timeout for fetching remote feeds\n\t *\n\t * This allows you to change the maximum time the feed's server to respond\n\t * and send the feed back.\n\t *\n\t * @since 1.0 Beta 3\n\t * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed.\n\t */\n\tpublic function set_timeout($timeout = 10)\n\t{\n\t\t$this->timeout = (int) $timeout;\n\t}\n\n\t/**\n\t * Force SimplePie to use fsockopen() instead of cURL\n\t *\n\t * @since 1.0 Beta 3\n\t * @param bool $enable Force fsockopen() to be used\n\t */\n\tpublic function force_fsockopen($enable = false)\n\t{\n\t\t$this->force_fsockopen = (bool) $enable;\n\t}\n\n\t/**\n\t * Enable/disable caching in SimplePie.\n\t *\n\t * This option allows you to disable caching all-together in SimplePie.\n\t * However, disabling the cache can lead to longer load times.\n\t *\n\t * @since 1.0 Preview Release\n\t * @param bool $enable Enable caching\n\t */\n\tpublic function enable_cache($enable = true)\n\t{\n\t\t$this->cache = (bool) $enable;\n\t}\n\n\t/**\n\t * Set the length of time (in seconds) that the contents of a feed will be\n\t * cached\n\t *\n\t * @param int $seconds The feed content cache duration\n\t */\n\tpublic function set_cache_duration($seconds = 3600)\n\t{\n\t\t$this->cache_duration = (int) $seconds;\n\t}\n\n\t/**\n\t * Set the length of time (in seconds) that the autodiscovered feed URL will\n\t * be cached\n\t *\n\t * @param int $seconds The autodiscovered feed URL cache duration.\n\t */\n\tpublic function set_autodiscovery_cache_duration($seconds = 604800)\n\t{\n\t\t$this->autodiscovery_cache_duration = (int) $seconds;\n\t}\n\n\t/**\n\t * Set the file system location where the cached files should be stored\n\t *\n\t * @param string $location The file system location.\n\t */\n\tpublic function set_cache_location($location = './cache')\n\t{\n\t\t$this->cache_location = (string) $location;\n\t}\n\n\t/**\n\t * Set whether feed items should be sorted into reverse chronological order\n\t *\n\t * @param bool $enable Sort as reverse chronological order.\n\t */\n\tpublic function enable_order_by_date($enable = true)\n\t{\n\t\t$this->order_by_date = (bool) $enable;\n\t}\n\n\t/**\n\t * Set the character encoding used to parse the feed\n\t *\n\t * This overrides the encoding reported by the feed, however it will fall\n\t * back to the normal encoding detection if the override fails\n\t *\n\t * @param string $encoding Character encoding\n\t */\n\tpublic function set_input_encoding($encoding = false)\n\t{\n\t\tif ($encoding)\n\t\t{\n\t\t\t$this->input_encoding = (string) $encoding;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->input_encoding = false;\n\t\t}\n\t}\n\n\t/**\n\t * Set how much feed autodiscovery to do\n\t *\n\t * @see SIMPLEPIE_LOCATOR_NONE\n\t * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY\n\t * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION\n\t * @see SIMPLEPIE_LOCATOR_LOCAL_BODY\n\t * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION\n\t * @see SIMPLEPIE_LOCATOR_REMOTE_BODY\n\t * @see SIMPLEPIE_LOCATOR_ALL\n\t * @param int $level Feed Autodiscovery Level (level can be a combination of the above constants, see bitwise OR operator)\n\t */\n\tpublic function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)\n\t{\n\t\t$this->autodiscovery = (int) $level;\n\t}\n\n\t/**\n\t * Get the class registry\n\t *\n\t * Use this to override SimplePie's default classes\n\t * @see SimplePie_Registry\n\t * @return SimplePie_Registry\n\t */\n\tpublic function &get_registry()\n\t{\n\t\treturn $this->registry;\n\t}\n\n\t/**#@+\n\t * Useful when you are overloading or extending SimplePie's default classes.\n\t *\n\t * @deprecated Use {@see get_registry()} instead\n\t * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation\n\t * @param string $class Name of custom class\n\t * @return boolean True on success, false otherwise\n\t */\n\t/**\n\t * Set which class SimplePie uses for caching\n\t */\n\tpublic function set_cache_class($class = 'SimplePie_Cache')\n\t{\n\t\treturn $this->registry->register('Cache', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for auto-discovery\n\t */\n\tpublic function set_locator_class($class = 'SimplePie_Locator')\n\t{\n\t\treturn $this->registry->register('Locator', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for XML parsing\n\t */\n\tpublic function set_parser_class($class = 'SimplePie_Parser')\n\t{\n\t\treturn $this->registry->register('Parser', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for remote file fetching\n\t */\n\tpublic function set_file_class($class = 'SimplePie_File')\n\t{\n\t\treturn $this->registry->register('File', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for data sanitization\n\t */\n\tpublic function set_sanitize_class($class = 'SimplePie_Sanitize')\n\t{\n\t\treturn $this->registry->register('Sanitize', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for handling feed items\n\t */\n\tpublic function set_item_class($class = 'SimplePie_Item')\n\t{\n\t\treturn $this->registry->register('Item', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for handling author data\n\t */\n\tpublic function set_author_class($class = 'SimplePie_Author')\n\t{\n\t\treturn $this->registry->register('Author', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for handling category data\n\t */\n\tpublic function set_category_class($class = 'SimplePie_Category')\n\t{\n\t\treturn $this->registry->register('Category', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for feed enclosures\n\t */\n\tpublic function set_enclosure_class($class = 'SimplePie_Enclosure')\n\t{\n\t\treturn $this->registry->register('Enclosure', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for `<media:text>` captions\n\t */\n\tpublic function set_caption_class($class = 'SimplePie_Caption')\n\t{\n\t\treturn $this->registry->register('Caption', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for `<media:copyright>`\n\t */\n\tpublic function set_copyright_class($class = 'SimplePie_Copyright')\n\t{\n\t\treturn $this->registry->register('Copyright', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for `<media:credit>`\n\t */\n\tpublic function set_credit_class($class = 'SimplePie_Credit')\n\t{\n\t\treturn $this->registry->register('Credit', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for `<media:rating>`\n\t */\n\tpublic function set_rating_class($class = 'SimplePie_Rating')\n\t{\n\t\treturn $this->registry->register('Rating', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for `<media:restriction>`\n\t */\n\tpublic function set_restriction_class($class = 'SimplePie_Restriction')\n\t{\n\t\treturn $this->registry->register('Restriction', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses for content-type sniffing\n\t */\n\tpublic function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')\n\t{\n\t\treturn $this->registry->register('Content_Type_Sniffer', $class, true);\n\t}\n\n\t/**\n\t * Set which class SimplePie uses item sources\n\t */\n\tpublic function set_source_class($class = 'SimplePie_Source')\n\t{\n\t\treturn $this->registry->register('Source', $class, true);\n\t}\n\t/**#@-*/\n\n\t/**\n\t * Set the user agent string\n\t *\n\t * @param string $ua New user agent string.\n\t */\n\tpublic function set_useragent($ua = SIMPLEPIE_USERAGENT)\n\t{\n\t\t$this->useragent = (string) $ua;\n\t}\n\n\t/**\n\t * Set callback function to create cache filename with\n\t *\n\t * @param mixed $function Callback function\n\t */\n\tpublic function set_cache_name_function($function = 'md5')\n\t{\n\t\tif (is_callable($function))\n\t\t{\n\t\t\t$this->cache_name_function = $function;\n\t\t}\n\t}\n\n\t/**\n\t * Set options to make SP as fast as possible\n\t *\n\t * Forgoes a substantial amount of data sanitization in favor of speed. This\n\t * turns SimplePie into a dumb parser of feeds.\n\t *\n\t * @param bool $set Whether to set them or not\n\t */\n\tpublic function set_stupidly_fast($set = false)\n\t{\n\t\tif ($set)\n\t\t{\n\t\t\t$this->enable_order_by_date(false);\n\t\t\t$this->remove_div(false);\n\t\t\t$this->strip_comments(false);\n\t\t\t$this->strip_htmltags(false);\n\t\t\t$this->strip_attributes(false);\n\t\t\t$this->set_image_handler(false);\n\t\t}\n\t}\n\n\t/**\n\t * Set maximum number of feeds to check with autodiscovery\n\t *\n\t * @param int $max Maximum number of feeds to check\n\t */\n\tpublic function set_max_checked_feeds($max = 10)\n\t{\n\t\t$this->max_checked_feeds = (int) $max;\n\t}\n\n\tpublic function remove_div($enable = true)\n\t{\n\t\t$this->sanitize->remove_div($enable);\n\t}\n\n\tpublic function strip_htmltags($tags = '', $encode = null)\n\t{\n\t\tif ($tags === '')\n\t\t{\n\t\t\t$tags = $this->strip_htmltags;\n\t\t}\n\t\t$this->sanitize->strip_htmltags($tags);\n\t\tif ($encode !== null)\n\t\t{\n\t\t\t$this->sanitize->encode_instead_of_strip($tags);\n\t\t}\n\t}\n\n\tpublic function encode_instead_of_strip($enable = true)\n\t{\n\t\t$this->sanitize->encode_instead_of_strip($enable);\n\t}\n\n\tpublic function strip_attributes($attribs = '')\n\t{\n\t\tif ($attribs === '')\n\t\t{\n\t\t\t$attribs = $this->strip_attributes;\n\t\t}\n\t\t$this->sanitize->strip_attributes($attribs);\n\t}\n\n\t/**\n\t * Set the output encoding\n\t *\n\t * Allows you to override SimplePie's output to match that of your webpage.\n\t * This is useful for times when your webpages are not being served as\n\t * UTF-8.  This setting will be obeyed by {@see handle_content_type()}, and\n\t * is similar to {@see set_input_encoding()}.\n\t *\n\t * It should be noted, however, that not all character encodings can support\n\t * all characters.  If your page is being served as ISO-8859-1 and you try\n\t * to display a Japanese feed, you'll likely see garbled characters.\n\t * Because of this, it is highly recommended to ensure that your webpages\n\t * are served as UTF-8.\n\t *\n\t * The number of supported character encodings depends on whether your web\n\t * host supports {@link http://php.net/mbstring mbstring},\n\t * {@link http://php.net/iconv iconv}, or both. See\n\t * {@link http://simplepie.org/wiki/faq/Supported_Character_Encodings} for\n\t * more information.\n\t *\n\t * @param string $encoding\n\t */\n\tpublic function set_output_encoding($encoding = 'UTF-8')\n\t{\n\t\t$this->sanitize->set_output_encoding($encoding);\n\t}\n\n\tpublic function strip_comments($strip = false)\n\t{\n\t\t$this->sanitize->strip_comments($strip);\n\t}\n\n\t/**\n\t * Set element/attribute key/value pairs of HTML attributes\n\t * containing URLs that need to be resolved relative to the feed\n\t *\n\t * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite,\n\t * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite,\n\t * |q|@cite\n\t *\n\t * @since 1.0\n\t * @param array|null $element_attribute Element/attribute key/value pairs, null for default\n\t */\n\tpublic function set_url_replacements($element_attribute = null)\n\t{\n\t\t$this->sanitize->set_url_replacements($element_attribute);\n\t}\n\n\t/**\n\t * Set the handler to enable the display of cached images.\n\t *\n\t * @param str $page Web-accessible path to the handler_image.php file.\n\t * @param str $qs The query string that the value should be passed to.\n\t */\n\tpublic function set_image_handler($page = false, $qs = 'i')\n\t{\n\t\tif ($page !== false)\n\t\t{\n\t\t\t$this->sanitize->set_image_handler($page . '?' . $qs . '=');\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->image_handler = '';\n\t\t}\n\t}\n\n\t/**\n\t * Set the limit for items returned per-feed with multifeeds\n\t *\n\t * @param integer $limit The maximum number of items to return.\n\t */\n\tpublic function set_item_limit($limit = 0)\n\t{\n\t\t$this->item_limit = (int) $limit;\n\t}\n\n\t/**\n\t * Initialize the feed object\n\t *\n\t * This is what makes everything happen.  Period.  This is where all of the\n\t * configuration options get processed, feeds are fetched, cached, and\n\t * parsed, and all of that other good stuff.\n\t *\n\t * @return boolean True if successful, false otherwise\n\t */\n\tpublic function init()\n\t{\n\t\t// Check absolute bare minimum requirements.\n\t\tif (!extension_loaded('xml') || !extension_loaded('pcre'))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\t// Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader.\n\t\telseif (!extension_loaded('xmlreader'))\n\t\t{\n\t\t\tstatic $xml_is_sane = null;\n\t\t\tif ($xml_is_sane === null)\n\t\t\t{\n\t\t\t\t$parser_check = xml_parser_create();\n\t\t\t\txml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);\n\t\t\t\txml_parser_free($parser_check);\n\t\t\t\t$xml_is_sane = isset($values[0]['value']);\n\t\t\t}\n\t\t\tif (!$xml_is_sane)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (method_exists($this->sanitize, 'set_registry'))\n\t\t{\n\t\t\t$this->sanitize->set_registry($this->registry);\n\t\t}\n\n\t\t// Pass whatever was set with config options over to the sanitizer.\n\t\t// Pass the classes in for legacy support; new classes should use the registry instead\n\t\t$this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->registry->get_class('Cache'));\n\t\t$this->sanitize->pass_file_data($this->registry->get_class('File'), $this->timeout, $this->useragent, $this->force_fsockopen);\n\n\t\tif (!empty($this->multifeed_url))\n\t\t{\n\t\t\t$i = 0;\n\t\t\t$success = 0;\n\t\t\t$this->multifeed_objects = array();\n\t\t\t$this->error = array();\n\t\t\tforeach ($this->multifeed_url as $url)\n\t\t\t{\n\t\t\t\t$this->multifeed_objects[$i] = clone $this;\n\t\t\t\t$this->multifeed_objects[$i]->set_feed_url($url);\n\t\t\t\t$single_success = $this->multifeed_objects[$i]->init();\n\t\t\t\t$success |= $single_success;\n\t\t\t\tif (!$single_success)\n\t\t\t\t{\n\t\t\t\t\t$this->error[$i] = $this->multifeed_objects[$i]->error();\n\t\t\t\t}\n\t\t\t\t$i++;\n\t\t\t}\n\t\t\treturn (bool) $success;\n\t\t}\n\t\telseif ($this->feed_url === null && $this->raw_data === null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->error = null;\n\t\t$this->data = array();\n\t\t$this->multifeed_objects = array();\n\t\t$cache = false;\n\n\t\tif ($this->feed_url !== null)\n\t\t{\n\t\t\t$parsed_feed_url = $this->registry->call('Misc', 'parse_url', array($this->feed_url));\n\n\t\t\t// Decide whether to enable caching\n\t\t\tif ($this->cache && $parsed_feed_url['scheme'] !== '')\n\t\t\t{\n\t\t\t\t$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));\n\t\t\t}\n\n\t\t\t// Fetch the data via SimplePie_File into $this->raw_data\n\t\t\tif (($fetched = $this->fetch_data($cache)) === true)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telseif ($fetched === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tlist($headers, $sniffed) = $fetched;\n\t\t}\n\n\t\t// Set up array of possible encodings\n\t\t$encodings = array();\n\n\t\t// First check to see if input has been overridden.\n\t\tif ($this->input_encoding !== false)\n\t\t{\n\t\t\t$encodings[] = $this->input_encoding;\n\t\t}\n\n\t\t$application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');\n\t\t$text_types = array('text/xml', 'text/xml-external-parsed-entity');\n\n\t\t// RFC 3023 (only applies to sniffed content)\n\t\tif (isset($sniffed))\n\t\t{\n\t\t\tif (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')\n\t\t\t{\n\t\t\t\tif (isset($headers['content-type']) && preg_match('/;\\x20?charset=([^;]*)/i', $headers['content-type'], $charset))\n\t\t\t\t{\n\t\t\t\t\t$encodings[] = strtoupper($charset[1]);\n\t\t\t\t}\n\t\t\t\t$encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry)));\n\t\t\t\t$encodings[] = 'UTF-8';\n\t\t\t}\n\t\t\telseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')\n\t\t\t{\n\t\t\t\tif (isset($headers['content-type']) && preg_match('/;\\x20?charset=([^;]*)/i', $headers['content-type'], $charset))\n\t\t\t\t{\n\t\t\t\t\t$encodings[] = $charset[1];\n\t\t\t\t}\n\t\t\t\t$encodings[] = 'US-ASCII';\n\t\t\t}\n\t\t\t// Text MIME-type default\n\t\t\telseif (substr($sniffed, 0, 5) === 'text/')\n\t\t\t{\n\t\t\t\t$encodings[] = 'US-ASCII';\n\t\t\t}\n\t\t}\n\n\t\t// Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1\n\t\t$encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry)));\n\t\t$encodings[] = 'UTF-8';\n\t\t$encodings[] = 'ISO-8859-1';\n\n\t\t// There's no point in trying an encoding twice\n\t\t$encodings = array_unique($encodings);\n\n\t\t// Loop through each possible encoding, till we return something, or run out of possibilities\n\t\tforeach ($encodings as $encoding)\n\t\t{\n\t\t\t// Change the encoding to UTF-8 (as we always use UTF-8 internally)\n\t\t\tif ($utf8_data = $this->registry->call('Misc', 'change_encoding', array($this->raw_data, $encoding, 'UTF-8')))\n\t\t\t{\n\t\t\t\t// Create new parser\n\t\t\t\t$parser = $this->registry->create('Parser');\n\n\t\t\t\t// If it's parsed fine\n\t\t\t\tif ($parser->parse($utf8_data, 'UTF-8'))\n\t\t\t\t{\n\t\t\t\t\t$this->data = $parser->get_data();\n\t\t\t\t\tif (!($this->get_type() & ~SIMPLEPIE_TYPE_NONE))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->error = \"A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed.\";\n\t\t\t\t\t\t$this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isset($headers))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['headers'] = $headers;\n\t\t\t\t\t}\n\t\t\t\t\t$this->data['build'] = SIMPLEPIE_BUILD;\n\n\t\t\t\t\t// Cache the file if caching is enabled\n\t\t\t\t\tif ($cache && !$cache->save($this))\n\t\t\t\t\t{\n\t\t\t\t\t\ttrigger_error(\"$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.\", E_USER_WARNING);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (isset($parser))\n\t\t{\n\t\t\t// We have an error, just set SimplePie_Misc::error to it and quit\n\t\t\t$this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());\n\t\t}\n\t\telse\n\t\t{\n\t\t\t$this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.';\n\t\t}\n\n\t\t$this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fetch the data via SimplePie_File\n\t *\n\t * If the data is already cached, attempt to fetch it from there instead\n\t * @param SimplePie_Cache|false $cache Cache handler, or false to not load from the cache\n\t * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type\n\t */\n\tprotected function fetch_data(&$cache)\n\t{\n\t\t// If it's enabled, use the cache\n\t\tif ($cache)\n\t\t{\n\t\t\t// Load the Cache\n\t\t\t$this->data = $cache->load();\n\t\t\tif (!empty($this->data))\n\t\t\t{\n\t\t\t\t// If the cache is for an outdated build of SimplePie\n\t\t\t\tif (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD)\n\t\t\t\t{\n\t\t\t\t\t$cache->unlink();\n\t\t\t\t\t$this->data = array();\n\t\t\t\t}\n\t\t\t\t// If we've hit a collision just rerun it with caching disabled\n\t\t\t\telseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url)\n\t\t\t\t{\n\t\t\t\t\t$cache = false;\n\t\t\t\t\t$this->data = array();\n\t\t\t\t}\n\t\t\t\t// If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.\n\t\t\t\telseif (isset($this->data['feed_url']))\n\t\t\t\t{\n\t\t\t\t\t// If the autodiscovery cache is still valid use it.\n\t\t\t\t\tif ($cache->mtime() + $this->autodiscovery_cache_duration > time())\n\t\t\t\t\t{\n\t\t\t\t\t\t// Do not need to do feed autodiscovery yet.\n\t\t\t\t\t\tif ($this->data['feed_url'] !== $this->data['url'])\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->set_feed_url($this->data['feed_url']);\n\t\t\t\t\t\t\treturn $this->init();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$cache->unlink();\n\t\t\t\t\t\t$this->data = array();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Check if the cache has been updated\n\t\t\t\telseif ($cache->mtime() + $this->cache_duration < time())\n\t\t\t\t{\n\t\t\t\t\t// If we have last-modified and/or etag set\n\t\t\t\t\tif (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$headers = array(\n\t\t\t\t\t\t\t'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (isset($this->data['headers']['last-modified']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$headers['if-modified-since'] = $this->data['headers']['last-modified'];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (isset($this->data['headers']['etag']))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$headers['if-none-match'] = $this->data['headers']['etag'];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen));\n\n\t\t\t\t\t\tif ($file->success)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif ($file->status_code === 304)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$cache->touch();\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tunset($file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If the cache is still valid, just return true\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$this->raw_data = false;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If the cache is empty, delete it\n\t\t\telse\n\t\t\t{\n\t\t\t\t$cache->unlink();\n\t\t\t\t$this->data = array();\n\t\t\t}\n\t\t}\n\t\t// If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.\n\t\tif (!isset($file))\n\t\t{\n\t\t\tif ($this->file instanceof SimplePie_File && $this->file->url === $this->feed_url)\n\t\t\t{\n\t\t\t\t$file =& $this->file;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$headers = array(\n\t\t\t\t\t'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',\n\t\t\t\t);\n\t\t\t\t$file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen));\n\t\t\t}\n\t\t}\n\t\t// If the file connection has an error, set SimplePie::error to that and quit\n\t\tif (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))\n\t\t{\n\t\t\t$this->error = $file->error;\n\t\t\treturn !empty($this->data);\n\t\t}\n\n\t\tif (!$this->force_feed)\n\t\t{\n\t\t\t// Check if the supplied URL is a feed, if it isn't, look for it.\n\t\t\t$locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds));\n\n\t\t\tif (!$locate->is_feed($file))\n\t\t\t{\n\t\t\t\t// We need to unset this so that if SimplePie::set_file() has been called that object is untouched\n\t\t\t\tunset($file);\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tif (!($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds)))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->error = \"A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or \" . SIMPLEPIE_NAME . \" was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed.\";\n\t\t\t\t\t\t$this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (SimplePie_Exception $e)\n\t\t\t\t{\n\t\t\t\t\t// This is usually because DOMDocument doesn't exist\n\t\t\t\t\t$this->error = $e->getMessage();\n\t\t\t\t\t$this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, $e->getFile(), $e->getLine()));\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ($cache)\n\t\t\t\t{\n\t\t\t\t\t$this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);\n\t\t\t\t\tif (!$cache->save($this))\n\t\t\t\t\t{\n\t\t\t\t\t\ttrigger_error(\"$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.\", E_USER_WARNING);\n\t\t\t\t\t}\n\t\t\t\t\t$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));\n\t\t\t\t}\n\t\t\t\t$this->feed_url = $file->url;\n\t\t\t}\n\t\t\t$locate = null;\n\t\t}\n\n\t\t$this->raw_data = $file->body;\n\n\t\t$headers = $file->headers;\n\t\t$sniffer = $this->registry->create('Content_Type_Sniffer', array(&$file));\n\t\t$sniffed = $sniffer->get_type();\n\n\t\treturn array($headers, $sniffed);\n\t}\n\n\t/**\n\t * Get the error message for the occurred error.\n\t *\n\t * @return string|array Error message, or array of messages for multifeeds\n\t */\n\tpublic function error()\n\t{\n\t\treturn $this->error;\n\t}\n\n\t/**\n\t * Get the raw XML\n\t *\n\t * This is the same as the old `$feed->enable_xml_dump(true)`, but returns\n\t * the data instead of printing it.\n\t *\n\t * @return string|boolean Raw XML data, false if the cache is used\n\t */\n\tpublic function get_raw_data()\n\t{\n\t\treturn $this->raw_data;\n\t}\n\n\t/**\n\t * Get the character encoding used for output\n\t *\n\t * @since Preview Release\n\t * @return string\n\t */\n\tpublic function get_encoding()\n\t{\n\t\treturn $this->sanitize->output_encoding;\n\t}\n\n\t/**\n\t * Send the content-type header with correct encoding\n\t *\n\t * This method ensures that the SimplePie-enabled page is being served with\n\t * the correct {@link http://www.iana.org/assignments/media-types/ mime-type}\n\t * and character encoding HTTP headers (character encoding determined by the\n\t * {@see set_output_encoding} config option).\n\t *\n\t * This won't work properly if any content or whitespace has already been\n\t * sent to the browser, because it relies on PHP's\n\t * {@link http://php.net/header header()} function, and these are the\n\t * circumstances under which the function works.\n\t *\n\t * Because it's setting these settings for the entire page (as is the nature\n\t * of HTTP headers), this should only be used once per page (again, at the\n\t * top).\n\t *\n\t * @param string $mime MIME type to serve the page as\n\t */\n\tpublic function handle_content_type($mime = 'text/html')\n\t{\n\t\tif (!headers_sent())\n\t\t{\n\t\t\t$header = \"Content-type: $mime;\";\n\t\t\tif ($this->get_encoding())\n\t\t\t{\n\t\t\t\t$header .= ' charset=' . $this->get_encoding();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$header .= ' charset=UTF-8';\n\t\t\t}\n\t\t\theader($header);\n\t\t}\n\t}\n\n\t/**\n\t * Get the type of the feed\n\t *\n\t * This returns a SIMPLEPIE_TYPE_* constant, which can be tested against\n\t * using {@link http://php.net/language.operators.bitwise bitwise operators}\n\t *\n\t * @since 0.8 (usage changed to using constants in 1.0)\n\t * @see SIMPLEPIE_TYPE_NONE Unknown.\n\t * @see SIMPLEPIE_TYPE_RSS_090 RSS 0.90.\n\t * @see SIMPLEPIE_TYPE_RSS_091_NETSCAPE RSS 0.91 (Netscape).\n\t * @see SIMPLEPIE_TYPE_RSS_091_USERLAND RSS 0.91 (Userland).\n\t * @see SIMPLEPIE_TYPE_RSS_091 RSS 0.91.\n\t * @see SIMPLEPIE_TYPE_RSS_092 RSS 0.92.\n\t * @see SIMPLEPIE_TYPE_RSS_093 RSS 0.93.\n\t * @see SIMPLEPIE_TYPE_RSS_094 RSS 0.94.\n\t * @see SIMPLEPIE_TYPE_RSS_10 RSS 1.0.\n\t * @see SIMPLEPIE_TYPE_RSS_20 RSS 2.0.x.\n\t * @see SIMPLEPIE_TYPE_RSS_RDF RDF-based RSS.\n\t * @see SIMPLEPIE_TYPE_RSS_SYNDICATION Non-RDF-based RSS (truly intended as syndication format).\n\t * @see SIMPLEPIE_TYPE_RSS_ALL Any version of RSS.\n\t * @see SIMPLEPIE_TYPE_ATOM_03 Atom 0.3.\n\t * @see SIMPLEPIE_TYPE_ATOM_10 Atom 1.0.\n\t * @see SIMPLEPIE_TYPE_ATOM_ALL Any version of Atom.\n\t * @see SIMPLEPIE_TYPE_ALL Any known/supported feed type.\n\t * @return int SIMPLEPIE_TYPE_* constant\n\t */\n\tpublic function get_type()\n\t{\n\t\tif (!isset($this->data['type']))\n\t\t{\n\t\t\t$this->data['type'] = SIMPLEPIE_TYPE_ALL;\n\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed']))\n\t\t\t{\n\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10;\n\t\t\t}\n\t\t\telseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed']))\n\t\t\t{\n\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03;\n\t\t\t}\n\t\t\telseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF']))\n\t\t\t{\n\t\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel'])\n\t\t\t\t|| isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image'])\n\t\t\t\t|| isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])\n\t\t\t\t|| isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput']))\n\t\t\t\t{\n\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_10;\n\t\t\t\t}\n\t\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel'])\n\t\t\t\t|| isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image'])\n\t\t\t\t|| isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])\n\t\t\t\t|| isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput']))\n\t\t\t\t{\n\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_090;\n\t\t\t\t}\n\t\t\t}\n\t\t\telseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss']))\n\t\t\t{\n\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL;\n\t\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))\n\t\t\t\t{\n\t\t\t\t\tswitch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))\n\t\t\t\t\t{\n\t\t\t\t\t\tcase '0.91':\n\t\t\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_091;\n\t\t\t\t\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tswitch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcase '0':\n\t\t\t\t\t\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase '24':\n\t\t\t\t\t\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase '0.92':\n\t\t\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_092;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase '0.93':\n\t\t\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_093;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase '0.94':\n\t\t\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_094;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase '2.0':\n\t\t\t\t\t\t\t$this->data['type'] &= SIMPLEPIE_TYPE_RSS_20;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->data['type'] = SIMPLEPIE_TYPE_NONE;\n\t\t\t}\n\t\t}\n\t\treturn $this->data['type'];\n\t}\n\n\t/**\n\t * Get the URL for the feed\n\t *\n\t * May or may not be different from the URL passed to {@see set_feed_url()},\n\t * depending on whether auto-discovery was used.\n\t *\n\t * @since Preview Release (previously called `get_feed_url()` since SimplePie 0.8.)\n\t * @todo If we have a perm redirect we should return the new URL\n\t * @todo When we make the above change, let's support <itunes:new-feed-url> as well\n\t * @todo Also, |atom:link|@rel=self\n\t * @return string|null\n\t */\n\tpublic function subscribe_url()\n\t{\n\t\tif ($this->feed_url !== null)\n\t\t{\n\t\t\treturn $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get data for an feed-level element\n\t *\n\t * This method allows you to get access to ANY element/attribute that is a\n\t * sub-element of the opening feed tag.\n\t *\n\t * The return value is an indexed array of elements matching the given\n\t * namespace and tag name. Each element has `attribs`, `data` and `child`\n\t * subkeys. For `attribs` and `child`, these contain namespace subkeys.\n\t * `attribs` then has one level of associative name => value data (where\n\t * `value` is a string) after the namespace. `child` has tag-indexed keys\n\t * after the namespace, each member of which is an indexed array matching\n\t * this same format.\n\t *\n\t * For example:\n\t * <pre>\n\t * // This is probably a bad example because we already support\n\t * // <media:content> natively, but it shows you how to parse through\n\t * // the nodes.\n\t * $group = $item->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group');\n\t * $content = $group[0]['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'];\n\t * $file = $content[0]['attribs']['']['url'];\n\t * echo $file;\n\t * </pre>\n\t *\n\t * @since 1.0\n\t * @see http://simplepie.org/wiki/faq/supported_xml_namespaces\n\t * @param string $namespace The URL of the XML namespace of the elements you're trying to access\n\t * @param string $tag Tag name\n\t * @return array\n\t */\n\tpublic function get_feed_tags($namespace, $tag)\n\t{\n\t\t$type = $this->get_type();\n\t\tif ($type & SIMPLEPIE_TYPE_ATOM_10)\n\t\t{\n\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))\n\t\t\t{\n\t\t\t\treturn $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag];\n\t\t\t}\n\t\t}\n\t\tif ($type & SIMPLEPIE_TYPE_ATOM_03)\n\t\t{\n\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]))\n\t\t\t{\n\t\t\t\treturn $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag];\n\t\t\t}\n\t\t}\n\t\tif ($type & SIMPLEPIE_TYPE_RSS_RDF)\n\t\t{\n\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]))\n\t\t\t{\n\t\t\t\treturn $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag];\n\t\t\t}\n\t\t}\n\t\tif ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)\n\t\t{\n\t\t\tif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]))\n\t\t\t{\n\t\t\t\treturn $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get data for an channel-level element\n\t *\n\t * This method allows you to get access to ANY element/attribute in the\n\t * channel/header section of the feed.\n\t *\n\t * See {@see SimplePie::get_feed_tags()} for a description of the return value\n\t *\n\t * @since 1.0\n\t * @see http://simplepie.org/wiki/faq/supported_xml_namespaces\n\t * @param string $namespace The URL of the XML namespace of the elements you're trying to access\n\t * @param string $tag Tag name\n\t * @return array\n\t */\n\tpublic function get_channel_tags($namespace, $tag)\n\t{\n\t\t$type = $this->get_type();\n\t\tif ($type & SIMPLEPIE_TYPE_ATOM_ALL)\n\t\t{\n\t\t\tif ($return = $this->get_feed_tags($namespace, $tag))\n\t\t\t{\n\t\t\t\treturn $return;\n\t\t\t}\n\t\t}\n\t\tif ($type & SIMPLEPIE_TYPE_RSS_10)\n\t\t{\n\t\t\tif ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel'))\n\t\t\t{\n\t\t\t\tif (isset($channel[0]['child'][$namespace][$tag]))\n\t\t\t\t{\n\t\t\t\t\treturn $channel[0]['child'][$namespace][$tag];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ($type & SIMPLEPIE_TYPE_RSS_090)\n\t\t{\n\t\t\tif ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel'))\n\t\t\t{\n\t\t\t\tif (isset($channel[0]['child'][$namespace][$tag]))\n\t\t\t\t{\n\t\t\t\t\treturn $channel[0]['child'][$namespace][$tag];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)\n\t\t{\n\t\t\tif ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel'))\n\t\t\t{\n\t\t\t\tif (isset($channel[0]['child'][$namespace][$tag]))\n\t\t\t\t{\n\t\t\t\t\treturn $channel[0]['child'][$namespace][$tag];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get data for an channel-level element\n\t *\n\t * This method allows you to get access to ANY element/attribute in the\n\t * image/logo section of the feed.\n\t *\n\t * See {@see SimplePie::get_feed_tags()} for a description of the return value\n\t *\n\t * @since 1.0\n\t * @see http://simplepie.org/wiki/faq/supported_xml_namespaces\n\t * @param string $namespace The URL of the XML namespace of the elements you're trying to access\n\t * @param string $tag Tag name\n\t * @return array\n\t */\n\tpublic function get_image_tags($namespace, $tag)\n\t{\n\t\t$type = $this->get_type();\n\t\tif ($type & SIMPLEPIE_TYPE_RSS_10)\n\t\t{\n\t\t\tif ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image'))\n\t\t\t{\n\t\t\t\tif (isset($image[0]['child'][$namespace][$tag]))\n\t\t\t\t{\n\t\t\t\t\treturn $image[0]['child'][$namespace][$tag];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ($type & SIMPLEPIE_TYPE_RSS_090)\n\t\t{\n\t\t\tif ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image'))\n\t\t\t{\n\t\t\t\tif (isset($image[0]['child'][$namespace][$tag]))\n\t\t\t\t{\n\t\t\t\t\treturn $image[0]['child'][$namespace][$tag];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)\n\t\t{\n\t\t\tif ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image'))\n\t\t\t{\n\t\t\t\tif (isset($image[0]['child'][$namespace][$tag]))\n\t\t\t\t{\n\t\t\t\t\treturn $image[0]['child'][$namespace][$tag];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get the base URL value from the feed\n\t *\n\t * Uses `<xml:base>` if available, otherwise uses the first link in the\n\t * feed, or failing that, the URL of the feed itself.\n\t *\n\t * @see get_link\n\t * @see subscribe_url\n\t *\n\t * @param array $element\n\t * @return string\n\t */\n\tpublic function get_base($element = array())\n\t{\n\t\tif (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base']))\n\t\t{\n\t\t\treturn $element['xml_base'];\n\t\t}\n\t\telseif ($this->get_link() !== null)\n\t\t{\n\t\t\treturn $this->get_link();\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn $this->subscribe_url();\n\t\t}\n\t}\n\n\t/**\n\t * Sanitize feed data\n\t *\n\t * @access private\n\t * @see SimplePie_Sanitize::sanitize()\n\t * @param string $data Data to sanitize\n\t * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants\n\t * @param string $base Base URL to resolve URLs against\n\t * @return string Sanitized data\n\t */\n\tpublic function sanitize($data, $type, $base = '')\n\t{\n\t\treturn $this->sanitize->sanitize($data, $type, $base);\n\t}\n\n\t/**\n\t * Get the title of the feed\n\t *\n\t * Uses `<atom:title>`, `<title>` or `<dc:title>`\n\t *\n\t * @since 1.0 (previously called `get_feed_title` since 0.8)\n\t * @return string|null\n\t */\n\tpublic function get_title()\n\t{\n\t\tif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a category for the feed\n\t *\n\t * @since Unknown\n\t * @param int $key The category that you want to return.  Remember that arrays begin with 0, not 1\n\t * @return SimplePie_Category|null\n\t */\n\tpublic function get_category($key = 0)\n\t{\n\t\t$categories = $this->get_categories();\n\t\tif (isset($categories[$key]))\n\t\t{\n\t\t\treturn $categories[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all categories for the feed\n\t *\n\t * Uses `<atom:category>`, `<category>` or `<dc:subject>`\n\t *\n\t * @since Unknown\n\t * @return array|null List of {@see SimplePie_Category} objects\n\t */\n\tpublic function get_categories()\n\t{\n\t\t$categories = array();\n\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)\n\t\t{\n\t\t\t$term = null;\n\t\t\t$scheme = null;\n\t\t\t$label = null;\n\t\t\tif (isset($category['attribs']['']['term']))\n\t\t\t{\n\t\t\t\t$term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($category['attribs']['']['scheme']))\n\t\t\t{\n\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($category['attribs']['']['label']))\n\t\t\t{\n\t\t\t\t$label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, $label));\n\t\t}\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)\n\t\t{\n\t\t\t// This is really the label, but keep this as the term also for BC.\n\t\t\t// Label will also work on retrieving because that falls back to term.\n\t\t\t$term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\tif (isset($category['attribs']['']['domain']))\n\t\t\t{\n\t\t\t\t$scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$scheme = null;\n\t\t\t}\n\t\t\t$categories[] = $this->registry->create('Category', array($term, $scheme, null));\n\t\t}\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)\n\t\t{\n\t\t\t$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)\n\t\t{\n\t\t\t$categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\n\t\tif (!empty($categories))\n\t\t{\n\t\t\treturn array_unique($categories);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get an author for the feed\n\t *\n\t * @since 1.1\n\t * @param int $key The author that you want to return.  Remember that arrays begin with 0, not 1\n\t * @return SimplePie_Author|null\n\t */\n\tpublic function get_author($key = 0)\n\t{\n\t\t$authors = $this->get_authors();\n\t\tif (isset($authors[$key]))\n\t\t{\n\t\t\treturn $authors[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all authors for the feed\n\t *\n\t * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`\n\t *\n\t * @since 1.1\n\t * @return array|null List of {@see SimplePie_Author} objects\n\t */\n\tpublic function get_authors()\n\t{\n\t\t$authors = array();\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$uri = null;\n\t\t\t$email = null;\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))\n\t\t\t{\n\t\t\t\t$uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));\n\t\t\t}\n\t\t\tif (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $uri !== null)\n\t\t\t{\n\t\t\t\t$authors[] = $this->registry->create('Author', array($name, $uri, $email));\n\t\t\t}\n\t\t}\n\t\tif ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))\n\t\t{\n\t\t\t$name = null;\n\t\t\t$url = null;\n\t\t\t$email = null;\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))\n\t\t\t{\n\t\t\t\t$url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));\n\t\t\t}\n\t\t\tif (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $url !== null)\n\t\t\t{\n\t\t\t\t$authors[] = $this->registry->create('Author', array($name, $url, $email));\n\t\t\t}\n\t\t}\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)\n\t\t{\n\t\t\t$authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));\n\t\t}\n\n\t\tif (!empty($authors))\n\t\t{\n\t\t\treturn array_unique($authors);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a contributor for the feed\n\t *\n\t * @since 1.1\n\t * @param int $key The contrbutor that you want to return.  Remember that arrays begin with 0, not 1\n\t * @return SimplePie_Author|null\n\t */\n\tpublic function get_contributor($key = 0)\n\t{\n\t\t$contributors = $this->get_contributors();\n\t\tif (isset($contributors[$key]))\n\t\t{\n\t\t\treturn $contributors[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all contributors for the feed\n\t *\n\t * Uses `<atom:contributor>`\n\t *\n\t * @since 1.1\n\t * @return array|null List of {@see SimplePie_Author} objects\n\t */\n\tpublic function get_contributors()\n\t{\n\t\t$contributors = array();\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$uri = null;\n\t\t\t$email = null;\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))\n\t\t\t{\n\t\t\t\t$uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $uri !== null)\n\t\t\t{\n\t\t\t\t$contributors[] = $this->registry->create('Author', array($name, $uri, $email));\n\t\t\t}\n\t\t}\n\t\tforeach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)\n\t\t{\n\t\t\t$name = null;\n\t\t\t$url = null;\n\t\t\t$email = null;\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))\n\t\t\t{\n\t\t\t\t$name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))\n\t\t\t{\n\t\t\t\t$url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));\n\t\t\t}\n\t\t\tif (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))\n\t\t\t{\n\t\t\t\t$email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t\t}\n\t\t\tif ($name !== null || $email !== null || $url !== null)\n\t\t\t{\n\t\t\t\t$contributors[] = $this->registry->create('Author', array($name, $url, $email));\n\t\t\t}\n\t\t}\n\n\t\tif (!empty($contributors))\n\t\t{\n\t\t\treturn array_unique($contributors);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single link for the feed\n\t *\n\t * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8)\n\t * @param int $key The link that you want to return.  Remember that arrays begin with 0, not 1\n\t * @param string $rel The relationship of the link to return\n\t * @return string|null Link URL\n\t */\n\tpublic function get_link($key = 0, $rel = 'alternate')\n\t{\n\t\t$links = $this->get_links($rel);\n\t\tif (isset($links[$key]))\n\t\t{\n\t\t\treturn $links[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the permalink for the item\n\t *\n\t * Returns the first link available with a relationship of \"alternate\".\n\t * Identical to {@see get_link()} with key 0\n\t *\n\t * @see get_link\n\t * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8)\n\t * @internal Added for parity between the parent-level and the item/entry-level.\n\t * @return string|null Link URL\n\t */\n\tpublic function get_permalink()\n\t{\n\t\treturn $this->get_link(0);\n\t}\n\n\t/**\n\t * Get all links for the feed\n\t *\n\t * Uses `<atom:link>` or `<link>`\n\t *\n\t * @since Beta 2\n\t * @param string $rel The relationship of links to return\n\t * @return array|null Links found for the feed (strings)\n\t */\n\tpublic function get_links($rel = 'alternate')\n\t{\n\t\tif (!isset($this->data['links']))\n\t\t{\n\t\t\t$this->data['links'] = array();\n\t\t\tif ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))\n\t\t\t{\n\t\t\t\tforeach ($links as $link)\n\t\t\t\t{\n\t\t\t\t\tif (isset($link['attribs']['']['href']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';\n\t\t\t\t\t\t$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))\n\t\t\t{\n\t\t\t\tforeach ($links as $link)\n\t\t\t\t{\n\t\t\t\t\tif (isset($link['attribs']['']['href']))\n\t\t\t\t\t{\n\t\t\t\t\t\t$link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';\n\t\t\t\t\t\t$this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\t\t\tif ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\t\t\tif ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))\n\t\t\t{\n\t\t\t\t$this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));\n\t\t\t}\n\n\t\t\t$keys = array_keys($this->data['links']);\n\t\t\tforeach ($keys as $key)\n\t\t\t{\n\t\t\t\tif ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))\n\t\t\t\t{\n\t\t\t\t\tif (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);\n\t\t\t\t\t\t$this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)\n\t\t\t\t{\n\t\t\t\t\t$this->data['links'][substr($key, 41)] =& $this->data['links'][$key];\n\t\t\t\t}\n\t\t\t\t$this->data['links'][$key] = array_unique($this->data['links'][$key]);\n\t\t\t}\n\t\t}\n\n\t\tif (isset($this->data['links'][$rel]))\n\t\t{\n\t\t\treturn $this->data['links'][$rel];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic function get_all_discovered_feeds()\n\t{\n\t\treturn $this->all_discovered_feeds;\n\t}\n\n\t/**\n\t * Get the content for the item\n\t *\n\t * Uses `<atom:subtitle>`, `<atom:tagline>`, `<description>`,\n\t * `<dc:description>`, `<itunes:summary>` or `<itunes:subtitle>`\n\t *\n\t * @since 1.0 (previously called `get_feed_description()` since 0.8)\n\t * @return string|null\n\t */\n\tpublic function get_description()\n\t{\n\t\tif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the copyright info for the feed\n\t *\n\t * Uses `<atom:rights>`, `<atom:copyright>` or `<dc:rights>`\n\t *\n\t * @since 1.0 (previously called `get_feed_copyright()` since 0.8)\n\t * @return string|null\n\t */\n\tpublic function get_copyright()\n\t{\n\t\tif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the language for the feed\n\t *\n\t * Uses `<language>`, `<dc:language>`, or @xml_lang\n\t *\n\t * @since 1.0 (previously called `get_feed_language()` since 0.8)\n\t * @return string|null\n\t */\n\tpublic function get_language()\n\t{\n\t\tif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang']))\n\t\t{\n\t\t\treturn $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang']))\n\t\t{\n\t\t\treturn $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang']))\n\t\t{\n\t\t\treturn $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif (isset($this->data['headers']['content-language']))\n\t\t{\n\t\t\treturn $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the latitude coordinates for the item\n\t *\n\t * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications\n\t *\n\t * Uses `<geo:lat>` or `<georss:point>`\n\t *\n\t * @since 1.0\n\t * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo\n\t * @link http://www.georss.org/ GeoRSS\n\t * @return string|null\n\t */\n\tpublic function get_latitude()\n\t{\n\n\t\tif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\\.[0-9]+)) ((?:-)?[0-9]+(?:\\.[0-9]+))$/', trim($return[0]['data']), $match))\n\t\t{\n\t\t\treturn (float) $match[1];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the longitude coordinates for the feed\n\t *\n\t * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications\n\t *\n\t * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>`\n\t *\n\t * @since 1.0\n\t * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo\n\t * @link http://www.georss.org/ GeoRSS\n\t * @return string|null\n\t */\n\tpublic function get_longitude()\n\t{\n\t\tif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))\n\t\t{\n\t\t\treturn (float) $return[0]['data'];\n\t\t}\n\t\telseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\\.[0-9]+)) ((?:-)?[0-9]+(?:\\.[0-9]+))$/', trim($return[0]['data']), $match))\n\t\t{\n\t\t\treturn (float) $match[2];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the feed logo's title\n\t *\n\t * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a \"feed logo\" title.\n\t *\n\t * Uses `<image><title>` or `<image><dc:title>`\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_image_title()\n\t{\n\t\tif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the feed logo's URL\n\t *\n\t * RSS 0.9.0, 2.0, Atom 1.0, and feeds with iTunes RSS tags are allowed to\n\t * have a \"feed logo\" URL. This points directly to the image itself.\n\t *\n\t * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`,\n\t * `<image><title>` or `<image><dc:title>`\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_image_url()\n\t{\n\t\tif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\n\t/**\n\t * Get the feed logo's link\n\t *\n\t * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a \"feed logo\" link. This\n\t * points to a human-readable page that the image should link to.\n\t *\n\t * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`,\n\t * `<image><title>` or `<image><dc:title>`\n\t *\n\t * @return string|null\n\t */\n\tpublic function get_image_link()\n\t{\n\t\tif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))\n\t\t{\n\t\t\treturn $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the feed logo's link\n\t *\n\t * RSS 2.0 feeds are allowed to have a \"feed logo\" width.\n\t *\n\t * Uses `<image><width>` or defaults to 88.0 if no width is specified and\n\t * the feed is an RSS 2.0 feed.\n\t *\n\t * @return int|float|null\n\t */\n\tpublic function get_image_width()\n\t{\n\t\tif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width'))\n\t\t{\n\t\t\treturn round($return[0]['data']);\n\t\t}\n\t\telseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))\n\t\t{\n\t\t\treturn 88.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the feed logo's height\n\t *\n\t * RSS 2.0 feeds are allowed to have a \"feed logo\" height.\n\t *\n\t * Uses `<image><height>` or defaults to 31.0 if no height is specified and\n\t * the feed is an RSS 2.0 feed.\n\t *\n\t * @return int|float|null\n\t */\n\tpublic function get_image_height()\n\t{\n\t\tif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height'))\n\t\t{\n\t\t\treturn round($return[0]['data']);\n\t\t}\n\t\telseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))\n\t\t{\n\t\t\treturn 31.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the number of items in the feed\n\t *\n\t * This is well-suited for {@link http://php.net/for for()} loops with\n\t * {@see get_item()}\n\t *\n\t * @param int $max Maximum value to return. 0 for no limit\n\t * @return int Number of items in the feed\n\t */\n\tpublic function get_item_quantity($max = 0)\n\t{\n\t\t$max = (int) $max;\n\t\t$qty = count($this->get_items());\n\t\tif ($max === 0)\n\t\t{\n\t\t\treturn $qty;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn ($qty > $max) ? $max : $qty;\n\t\t}\n\t}\n\n\t/**\n\t * Get a single item from the feed\n\t *\n\t * This is better suited for {@link http://php.net/for for()} loops, whereas\n\t * {@see get_items()} is better suited for\n\t * {@link http://php.net/foreach foreach()} loops.\n\t *\n\t * @see get_item_quantity()\n\t * @since Beta 2\n\t * @param int $key The item that you want to return.  Remember that arrays begin with 0, not 1\n\t * @return SimplePie_Item|null\n\t */\n\tpublic function get_item($key = 0)\n\t{\n\t\t$items = $this->get_items();\n\t\tif (isset($items[$key]))\n\t\t{\n\t\t\treturn $items[$key];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get all items from the feed\n\t *\n\t * This is better suited for {@link http://php.net/for for()} loops, whereas\n\t * {@see get_items()} is better suited for\n\t * {@link http://php.net/foreach foreach()} loops.\n\t *\n\t * @see get_item_quantity\n\t * @since Beta 2\n\t * @param int $start Index to start at\n\t * @param int $end Number of items to return. 0 for all items after `$start`\n\t * @return array|null List of {@see SimplePie_Item} objects\n\t */\n\tpublic function get_items($start = 0, $end = 0)\n\t{\n\t\tif (!isset($this->data['items']))\n\t\t{\n\t\t\tif (!empty($this->multifeed_objects))\n\t\t\t{\n\t\t\t\t$this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->data['items'] = array();\n\t\t\t\tif ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry'))\n\t\t\t\t{\n\t\t\t\t\t$keys = array_keys($items);\n\t\t\t\t\tforeach ($keys as $key)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry'))\n\t\t\t\t{\n\t\t\t\t\t$keys = array_keys($items);\n\t\t\t\t\tforeach ($keys as $key)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item'))\n\t\t\t\t{\n\t\t\t\t\t$keys = array_keys($items);\n\t\t\t\t\tforeach ($keys as $key)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item'))\n\t\t\t\t{\n\t\t\t\t\t$keys = array_keys($items);\n\t\t\t\t\tforeach ($keys as $key)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item'))\n\t\t\t\t{\n\t\t\t\t\t$keys = array_keys($items);\n\t\t\t\t\tforeach ($keys as $key)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!empty($this->data['items']))\n\t\t{\n\t\t\t// If we want to order it by date, check if all items have a date, and then sort it\n\t\t\tif ($this->order_by_date && empty($this->multifeed_objects))\n\t\t\t{\n\t\t\t\tif (!isset($this->data['ordered_items']))\n\t\t\t\t{\n\t\t\t\t\t$do_sort = true;\n\t\t\t\t\tforeach ($this->data['items'] as $item)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!$item->get_date('U'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$do_sort = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$item = null;\n\t\t\t\t\t$this->data['ordered_items'] = $this->data['items'];\n\t\t\t\t\tif ($do_sort)\n\t\t\t\t\t{\n\t\t\t\t\t\tusort($this->data['ordered_items'], array(get_class($this), 'sort_items'));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$items = $this->data['ordered_items'];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$items = $this->data['items'];\n\t\t\t}\n\n\t\t\t// Slice the data as desired\n\t\t\tif ($end === 0)\n\t\t\t{\n\t\t\t\treturn array_slice($items, $start);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn array_slice($items, $start, $end);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn array();\n\t\t}\n\t}\n\n\t/**\n\t * Set the favicon handler\n\t *\n\t * @deprecated Use your own favicon handling instead\n\t */\n\tpublic function set_favicon_handler($page = false, $qs = 'i')\n\t{\n\t\t$level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;\n\t\ttrigger_error('Favicon handling has been removed, please use your own handling', $level);\n\t\treturn false;\n\t}\n\n\t/**\n\t * Get the favicon for the current feed\n\t *\n\t * @deprecated Use your own favicon handling instead\n\t */\n\tpublic function get_favicon()\n\t{\n\t\t$level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;\n\t\ttrigger_error('Favicon handling has been removed, please use your own handling', $level);\n\n\t\tif (($url = $this->get_link()) !== null)\n\t\t{\n\t\t\treturn 'http://g.etfv.co/' . urlencode($url);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Magic method handler\n\t *\n\t * @param string $method Method name\n\t * @param array $args Arguments to the method\n\t * @return mixed\n\t */\n\tpublic function __call($method, $args)\n\t{\n\t\tif (strpos($method, 'subscribe_') === 0)\n\t\t{\n\t\t\t$level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;\n\t\t\ttrigger_error('subscribe_*() has been deprecated, implement the callback yourself', $level);\n\t\t\treturn '';\n\t\t}\n\t\tif ($method === 'enable_xml_dump')\n\t\t{\n\t\t\t$level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;\n\t\t\ttrigger_error('enable_xml_dump() has been deprecated, use get_raw_data() instead', $level);\n\t\t\treturn false;\n\t\t}\n\n\t\t$class = get_class($this);\n\t\t$trace = debug_backtrace();\n\t\t$file = $trace[0]['file'];\n\t\t$line = $trace[0]['line'];\n\t\ttrigger_error(\"Call to undefined method $class::$method() in $file on line $line\", E_USER_ERROR);\n\t}\n\n\t/**\n\t * Sorting callback for items\n\t *\n\t * @access private\n\t * @param SimplePie $a\n\t * @param SimplePie $b\n\t * @return boolean\n\t */\n\tpublic static function sort_items($a, $b)\n\t{\n\t\treturn $a->get_date('U') <= $b->get_date('U');\n\t}\n\n\t/**\n\t * Merge items from several feeds into one\n\t *\n\t * If you're merging multiple feeds together, they need to all have dates\n\t * for the items or else SimplePie will refuse to sort them.\n\t *\n\t * @link http://simplepie.org/wiki/tutorial/sort_multiple_feeds_by_time_and_date#if_feeds_require_separate_per-feed_settings\n\t * @param array $urls List of SimplePie feed objects to merge\n\t * @param int $start Starting item\n\t * @param int $end Number of items to return\n\t * @param int $limit Maximum number of items per feed\n\t * @return array\n\t */\n\tpublic static function merge_items($urls, $start = 0, $end = 0, $limit = 0)\n\t{\n\t\tif (is_array($urls) && sizeof($urls) > 0)\n\t\t{\n\t\t\t$items = array();\n\t\t\tforeach ($urls as $arg)\n\t\t\t{\n\t\t\t\tif ($arg instanceof SimplePie)\n\t\t\t\t{\n\t\t\t\t\t$items = array_merge($items, $arg->get_items(0, $limit));\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttrigger_error('Arguments must be SimplePie objects', E_USER_WARNING);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$do_sort = true;\n\t\t\tforeach ($items as $item)\n\t\t\t{\n\t\t\t\tif (!$item->get_date('U'))\n\t\t\t\t{\n\t\t\t\t\t$do_sort = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t$item = null;\n\t\t\tif ($do_sort)\n\t\t\t{\n\t\t\t\tusort($items, array(get_class($urls[0]), 'sort_items'));\n\t\t\t}\n\n\t\t\tif ($end === 0)\n\t\t\t{\n\t\t\t\treturn array_slice($items, $start);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn array_slice($items, $start, $end);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttrigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);\n\t\t\treturn array();\n\t\t}\n\t}\n}\nendif;"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-smtp.php",
    "content": "<?php\n/**\n * PHPMailer RFC821 SMTP email transport class.\n * PHP Version 5\n * @package PHPMailer\n * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project\n * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>\n * @author Jim Jagielski (jimjag) <jimjag@gmail.com>\n * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>\n * @author Brent R. Matzelle (original founder)\n * @copyright 2014 Marcus Bointon\n * @copyright 2010 - 2012 Jim Jagielski\n * @copyright 2004 - 2009 Andy Prevost\n * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License\n * @note This program is distributed in the hope that it will be useful - WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * PHPMailer RFC821 SMTP email transport class.\n * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.\n * @package PHPMailer\n * @author Chris Ryan\n * @author Marcus Bointon <phpmailer@synchromedia.co.uk>\n */\nclass SMTP\n{\n    /**\n     * The PHPMailer SMTP version number.\n     * @var string\n     */\n    const VERSION = '5.2.14';\n\n    /**\n     * SMTP line break constant.\n     * @var string\n     */\n    const CRLF = \"\\r\\n\";\n\n    /**\n     * The SMTP port to use if one is not specified.\n     * @var integer\n     */\n    const DEFAULT_SMTP_PORT = 25;\n\n    /**\n     * The maximum line length allowed by RFC 2822 section 2.1.1\n     * @var integer\n     */\n    const MAX_LINE_LENGTH = 998;\n\n    /**\n     * Debug level for no output\n     */\n    const DEBUG_OFF = 0;\n\n    /**\n     * Debug level to show client -> server messages\n     */\n    const DEBUG_CLIENT = 1;\n\n    /**\n     * Debug level to show client -> server and server -> client messages\n     */\n    const DEBUG_SERVER = 2;\n\n    /**\n     * Debug level to show connection status, client -> server and server -> client messages\n     */\n    const DEBUG_CONNECTION = 3;\n\n    /**\n     * Debug level to show all messages\n     */\n    const DEBUG_LOWLEVEL = 4;\n\n    /**\n     * The PHPMailer SMTP Version number.\n     * @var string\n     * @deprecated Use the `VERSION` constant instead\n     * @see SMTP::VERSION\n     */\n    public $Version = '5.2.14';\n\n    /**\n     * SMTP server port number.\n     * @var integer\n     * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead\n     * @see SMTP::DEFAULT_SMTP_PORT\n     */\n    public $SMTP_PORT = 25;\n\n    /**\n     * SMTP reply line ending.\n     * @var string\n     * @deprecated Use the `CRLF` constant instead\n     * @see SMTP::CRLF\n     */\n    public $CRLF = \"\\r\\n\";\n\n    /**\n     * Debug output level.\n     * Options:\n     * * self::DEBUG_OFF (`0`) No debug output, default\n     * * self::DEBUG_CLIENT (`1`) Client commands\n     * * self::DEBUG_SERVER (`2`) Client commands and server responses\n     * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status\n     * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages\n     * @var integer\n     */\n    public $do_debug = self::DEBUG_OFF;\n\n    /**\n     * How to handle debug output.\n     * Options:\n     * * `echo` Output plain-text as-is, appropriate for CLI\n     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output\n     * * `error_log` Output to error log as configured in php.ini\n     *\n     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:\n     * <code>\n     * $smtp->Debugoutput = function($str, $level) {echo \"debug level $level; message: $str\";};\n     * </code>\n     * @var string|callable\n     */\n    public $Debugoutput = 'echo';\n\n    /**\n     * Whether to use VERP.\n     * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path\n     * @link http://www.postfix.org/VERP_README.html Info on VERP\n     * @var boolean\n     */\n    public $do_verp = false;\n\n    /**\n     * The timeout value for connection, in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.\n     * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2\n     * @var integer\n     */\n    public $Timeout = 300;\n\n    /**\n     * How long to wait for commands to complete, in seconds.\n     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2\n     * @var integer\n     */\n    public $Timelimit = 300;\n\n    /**\n     * The socket for the server connection.\n     * @var resource\n     */\n    protected $smtp_conn;\n\n    /**\n     * Error information, if any, for the last SMTP command.\n     * @var array\n     */\n    protected $error = array(\n        'error' => '',\n        'detail' => '',\n        'smtp_code' => '',\n        'smtp_code_ex' => ''\n    );\n\n    /**\n     * The reply the server sent to us for HELO.\n     * If null, no HELO string has yet been received.\n     * @var string|null\n     */\n    protected $helo_rply = null;\n\n    /**\n     * The set of SMTP extensions sent in reply to EHLO command.\n     * Indexes of the array are extension names.\n     * Value at index 'HELO' or 'EHLO' (according to command that was sent)\n     * represents the server name. In case of HELO it is the only element of the array.\n     * Other values can be boolean TRUE or an array containing extension options.\n     * If null, no HELO/EHLO string has yet been received.\n     * @var array|null\n     */\n    protected $server_caps = null;\n\n    /**\n     * The most recent reply received from the server.\n     * @var string\n     */\n    protected $last_reply = '';\n\n    /**\n     * Output debugging info via a user-selected method.\n     * @see SMTP::$Debugoutput\n     * @see SMTP::$do_debug\n     * @param string $str Debug string to output\n     * @param integer $level The debug level of this message; see DEBUG_* constants\n     * @return void\n     */\n    protected function edebug($str, $level = 0)\n    {\n        if ($level > $this->do_debug) {\n            return;\n        }\n        //Avoid clash with built-in function names\n        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {\n            call_user_func($this->Debugoutput, $str, $this->do_debug);\n            return;\n        }\n        switch ($this->Debugoutput) {\n            case 'error_log':\n                //Don't output, just log\n                error_log($str);\n                break;\n            case 'html':\n                //Cleans up output a bit for a better looking, HTML-safe output\n                echo htmlentities(\n                    preg_replace('/[\\r\\n]+/', '', $str),\n                    ENT_QUOTES,\n                    'UTF-8'\n                )\n                . \"<br>\\n\";\n                break;\n            case 'echo':\n            default:\n                //Normalize line breaks\n                $str = preg_replace('/(\\r\\n|\\r|\\n)/ms', \"\\n\", $str);\n                echo gmdate('Y-m-d H:i:s') . \"\\t\" . str_replace(\n                    \"\\n\",\n                    \"\\n                   \\t                  \",\n                    trim($str)\n                ).\"\\n\";\n        }\n    }\n\n    /**\n     * Connect to an SMTP server.\n     * @param string $host SMTP server IP or host name\n     * @param integer $port The port number to connect to\n     * @param integer $timeout How long to wait for the connection to open\n     * @param array $options An array of options for stream_context_create()\n     * @access public\n     * @return boolean\n     */\n    public function connect($host, $port = null, $timeout = 30, $options = array())\n    {\n        static $streamok;\n        //This is enabled by default since 5.0.0 but some providers disable it\n        //Check this once and cache the result\n        if (is_null($streamok)) {\n            $streamok = function_exists('stream_socket_client');\n        }\n        // Clear errors to avoid confusion\n        $this->setError('');\n        // Make sure we are __not__ connected\n        if ($this->connected()) {\n            // Already connected, generate error\n            $this->setError('Already connected to a server');\n            return false;\n        }\n        if (empty($port)) {\n            $port = self::DEFAULT_SMTP_PORT;\n        }\n        // Connect to the SMTP server\n        $this->edebug(\n            \"Connection: opening to $host:$port, timeout=$timeout, options=\".var_export($options, true),\n            self::DEBUG_CONNECTION\n        );\n        $errno = 0;\n        $errstr = '';\n        if ($streamok) {\n            $socket_context = stream_context_create($options);\n            //Suppress errors; connection failures are handled at a higher level\n            $this->smtp_conn = @stream_socket_client(\n                $host . \":\" . $port,\n                $errno,\n                $errstr,\n                $timeout,\n                STREAM_CLIENT_CONNECT,\n                $socket_context\n            );\n        } else {\n            //Fall back to fsockopen which should work in more places, but is missing some features\n            $this->edebug(\n                \"Connection: stream_socket_client not available, falling back to fsockopen\",\n                self::DEBUG_CONNECTION\n            );\n            $this->smtp_conn = fsockopen(\n                $host,\n                $port,\n                $errno,\n                $errstr,\n                $timeout\n            );\n        }\n        // Verify we connected properly\n        if (!is_resource($this->smtp_conn)) {\n            $this->setError(\n                'Failed to connect to server',\n                $errno,\n                $errstr\n            );\n            $this->edebug(\n                'SMTP ERROR: ' . $this->error['error']\n                . \": $errstr ($errno)\",\n                self::DEBUG_CLIENT\n            );\n            return false;\n        }\n        $this->edebug('Connection: opened', self::DEBUG_CONNECTION);\n        // SMTP server can take longer to respond, give longer timeout for first read\n        // Windows does not have support for this timeout function\n        if (substr(PHP_OS, 0, 3) != 'WIN') {\n            $max = ini_get('max_execution_time');\n            // Don't bother if unlimited\n            if ($max != 0 && $timeout > $max) {\n                @set_time_limit($timeout);\n            }\n            stream_set_timeout($this->smtp_conn, $timeout, 0);\n        }\n        // Get any announcement\n        $announce = $this->get_lines();\n        $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);\n        return true;\n    }\n\n    /**\n     * Initiate a TLS (encrypted) session.\n     * @access public\n     * @return boolean\n     */\n    public function startTLS()\n    {\n        if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {\n            return false;\n        }\n        // Begin encrypted connection\n        if (!stream_socket_enable_crypto(\n            $this->smtp_conn,\n            true,\n            STREAM_CRYPTO_METHOD_TLS_CLIENT\n        )) {\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Perform SMTP authentication.\n     * Must be run after hello().\n     * @see hello()\n     * @param string $username The user name\n     * @param string $password The password\n     * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5, XOAUTH2)\n     * @param string $realm The auth realm for NTLM\n     * @param string $workstation The auth workstation for NTLM\n     * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth)\n     * @return bool True if successfully authenticated.* @access public\n     */\n    public function authenticate(\n        $username,\n        $password,\n        $authtype = null,\n        $realm = '',\n        $workstation = '',\n        $OAuth = null\n    ) {\n        if (!$this->server_caps) {\n            $this->setError('Authentication is not allowed before HELO/EHLO');\n            return false;\n        }\n\n        if (array_key_exists('EHLO', $this->server_caps)) {\n        // SMTP extensions are available. Let's try to find a proper authentication method\n\n            if (!array_key_exists('AUTH', $this->server_caps)) {\n                $this->setError('Authentication is not allowed at this stage');\n                // 'at this stage' means that auth may be allowed after the stage changes\n                // e.g. after STARTTLS\n                return false;\n            }\n\n            self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);\n            self::edebug(\n                'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),\n                self::DEBUG_LOWLEVEL\n            );\n\n            if (empty($authtype)) {\n                foreach (array('LOGIN', 'CRAM-MD5', 'PLAIN') as $method) {\n                    if (in_array($method, $this->server_caps['AUTH'])) {\n                        $authtype = $method;\n                        break;\n                    }\n                }\n                if (empty($authtype)) {\n                    $this->setError('No supported authentication methods found');\n                    return false;\n                }\n                self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);\n            }\n\n            if (!in_array($authtype, $this->server_caps['AUTH'])) {\n                $this->setError(\"The requested authentication method \\\"$authtype\\\" is not supported by the server\");\n                return false;\n            }\n        } elseif (empty($authtype)) {\n            $authtype = 'LOGIN';\n        }\n        switch ($authtype) {\n            case 'PLAIN':\n                // Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {\n                    return false;\n                }\n                // Send encoded username and password\n                if (!$this->sendCommand(\n                    'User & Password',\n                    base64_encode(\"\\0\" . $username . \"\\0\" . $password),\n                    235\n                )\n                ) {\n                    return false;\n                }\n                break;\n            case 'LOGIN':\n                // Start authentication\n                if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {\n                    return false;\n                }\n                if (!$this->sendCommand(\"Username\", base64_encode($username), 334)) {\n                    return false;\n                }\n                if (!$this->sendCommand(\"Password\", base64_encode($password), 235)) {\n                    return false;\n                }\n                break;\n            case 'CRAM-MD5':\n                // Start authentication\n                if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {\n                    return false;\n                }\n                // Get the challenge\n                $challenge = base64_decode(substr($this->last_reply, 4));\n\n                // Build the response\n                $response = $username . ' ' . $this->hmac($challenge, $password);\n\n                // send encoded credentials\n                return $this->sendCommand('Username', base64_encode($response), 235);\n            default:\n                $this->setError(\"Authentication method \\\"$authtype\\\" is not supported\");\n                return false;\n        }\n        return true;\n    }\n\n    /**\n     * Calculate an MD5 HMAC hash.\n     * Works like hash_hmac('md5', $data, $key)\n     * in case that function is not available\n     * @param string $data The data to hash\n     * @param string $key  The key to hash with\n     * @access protected\n     * @return string\n     */\n    protected function hmac($data, $key)\n    {\n        if (function_exists('hash_hmac')) {\n            return hash_hmac('md5', $data, $key);\n        }\n\n        // The following borrowed from\n        // http://php.net/manual/en/function.mhash.php#27225\n\n        // RFC 2104 HMAC implementation for php.\n        // Creates an md5 HMAC.\n        // Eliminates the need to install mhash to compute a HMAC\n        // by Lance Rushing\n\n        $bytelen = 64; // byte length for md5\n        if (strlen($key) > $bytelen) {\n            $key = pack('H*', md5($key));\n        }\n        $key = str_pad($key, $bytelen, chr(0x00));\n        $ipad = str_pad('', $bytelen, chr(0x36));\n        $opad = str_pad('', $bytelen, chr(0x5c));\n        $k_ipad = $key ^ $ipad;\n        $k_opad = $key ^ $opad;\n\n        return md5($k_opad . pack('H*', md5($k_ipad . $data)));\n    }\n\n    /**\n     * Check connection state.\n     * @access public\n     * @return boolean True if connected.\n     */\n    public function connected()\n    {\n        if (is_resource($this->smtp_conn)) {\n            $sock_status = stream_get_meta_data($this->smtp_conn);\n            if ($sock_status['eof']) {\n                // The socket is valid but we are not connected\n                $this->edebug(\n                    'SMTP NOTICE: EOF caught while checking if connected',\n                    self::DEBUG_CLIENT\n                );\n                $this->close();\n                return false;\n            }\n            return true; // everything looks good\n        }\n        return false;\n    }\n\n    /**\n     * Close the socket and clean up the state of the class.\n     * Don't use this function without first trying to use QUIT.\n     * @see quit()\n     * @access public\n     * @return void\n     */\n    public function close()\n    {\n        $this->setError('');\n        $this->server_caps = null;\n        $this->helo_rply = null;\n        if (is_resource($this->smtp_conn)) {\n            // close the connection and cleanup\n            fclose($this->smtp_conn);\n            $this->smtp_conn = null; //Makes for cleaner serialization\n            $this->edebug('Connection: closed', self::DEBUG_CONNECTION);\n        }\n    }\n\n    /**\n     * Send an SMTP DATA command.\n     * Issues a data command and sends the msg_data to the server,\n     * finializing the mail transaction. $msg_data is the message\n     * that is to be send with the headers. Each header needs to be\n     * on a single line followed by a <CRLF> with the message headers\n     * and the message body being separated by and additional <CRLF>.\n     * Implements rfc 821: DATA <CRLF>\n     * @param string $msg_data Message data to send\n     * @access public\n     * @return boolean\n     */\n    public function data($msg_data)\n    {\n        //This will use the standard timelimit\n        if (!$this->sendCommand('DATA', 'DATA', 354)) {\n            return false;\n        }\n\n        /* The server is ready to accept data!\n         * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)\n         * so we will break the data up into lines by \\r and/or \\n then if needed we will break each of those into\n         * smaller lines to fit within the limit.\n         * We will also look for lines that start with a '.' and prepend an additional '.'.\n         * NOTE: this does not count towards line-length limit.\n         */\n\n        // Normalize line breaks before exploding\n        $lines = explode(\"\\n\", str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $msg_data));\n\n        /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field\n         * of the first line (':' separated) does not contain a space then it _should_ be a header and we will\n         * process all lines before a blank line as headers.\n         */\n\n        $field = substr($lines[0], 0, strpos($lines[0], ':'));\n        $in_headers = false;\n        if (!empty($field) && strpos($field, ' ') === false) {\n            $in_headers = true;\n        }\n\n        foreach ($lines as $line) {\n            $lines_out = array();\n            if ($in_headers and $line == '') {\n                $in_headers = false;\n            }\n            //Break this line up into several smaller lines if it's too long\n            //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),\n            while (isset($line[self::MAX_LINE_LENGTH])) {\n                //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on\n                //so as to avoid breaking in the middle of a word\n                $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');\n                //Deliberately matches both false and 0\n                if (!$pos) {\n                    //No nice break found, add a hard break\n                    $pos = self::MAX_LINE_LENGTH - 1;\n                    $lines_out[] = substr($line, 0, $pos);\n                    $line = substr($line, $pos);\n                } else {\n                    //Break at the found point\n                    $lines_out[] = substr($line, 0, $pos);\n                    //Move along by the amount we dealt with\n                    $line = substr($line, $pos + 1);\n                }\n                //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1\n                if ($in_headers) {\n                    $line = \"\\t\" . $line;\n                }\n            }\n            $lines_out[] = $line;\n\n            //Send the lines to the server\n            foreach ($lines_out as $line_out) {\n                //RFC2821 section 4.5.2\n                if (!empty($line_out) and $line_out[0] == '.') {\n                    $line_out = '.' . $line_out;\n                }\n                $this->client_send($line_out . self::CRLF);\n            }\n        }\n\n        //Message data has been sent, complete the command\n        //Increase timelimit for end of DATA command\n        $savetimelimit = $this->Timelimit;\n        $this->Timelimit = $this->Timelimit * 2;\n        $result = $this->sendCommand('DATA END', '.', 250);\n        //Restore timelimit\n        $this->Timelimit = $savetimelimit;\n        return $result;\n    }\n\n    /**\n     * Send an SMTP HELO or EHLO command.\n     * Used to identify the sending server to the receiving server.\n     * This makes sure that client and server are in a known state.\n     * Implements RFC 821: HELO <SP> <domain> <CRLF>\n     * and RFC 2821 EHLO.\n     * @param string $host The host name or IP to connect to\n     * @access public\n     * @return boolean\n     */\n    public function hello($host = '')\n    {\n        //Try extended hello first (RFC 2821)\n        return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));\n    }\n\n    /**\n     * Send an SMTP HELO or EHLO command.\n     * Low-level implementation used by hello()\n     * @see hello()\n     * @param string $hello The HELO string\n     * @param string $host The hostname to say we are\n     * @access protected\n     * @return boolean\n     */\n    protected function sendHello($hello, $host)\n    {\n        $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);\n        $this->helo_rply = $this->last_reply;\n        if ($noerror) {\n            $this->parseHelloFields($hello);\n        } else {\n            $this->server_caps = null;\n        }\n        return $noerror;\n    }\n\n    /**\n     * Parse a reply to HELO/EHLO command to discover server extensions.\n     * In case of HELO, the only parameter that can be discovered is a server name.\n     * @access protected\n     * @param string $type - 'HELO' or 'EHLO'\n     */\n    protected function parseHelloFields($type)\n    {\n        $this->server_caps = array();\n        $lines = explode(\"\\n\", $this->last_reply);\n\n        foreach ($lines as $n => $s) {\n            //First 4 chars contain response code followed by - or space\n            $s = trim(substr($s, 4));\n            if (empty($s)) {\n                continue;\n            }\n            $fields = explode(' ', $s);\n            if (!empty($fields)) {\n                if (!$n) {\n                    $name = $type;\n                    $fields = $fields[0];\n                } else {\n                    $name = array_shift($fields);\n                    switch ($name) {\n                        case 'SIZE':\n                            $fields = ($fields ? $fields[0] : 0);\n                            break;\n                        case 'AUTH':\n                            if (!is_array($fields)) {\n                                $fields = array();\n                            }\n                            break;\n                        default:\n                            $fields = true;\n                    }\n                }\n                $this->server_caps[$name] = $fields;\n            }\n        }\n    }\n\n    /**\n     * Send an SMTP MAIL command.\n     * Starts a mail transaction from the email address specified in\n     * $from. Returns true if successful or false otherwise. If True\n     * the mail transaction is started and then one or more recipient\n     * commands may be called followed by a data command.\n     * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>\n     * @param string $from Source address of this message\n     * @access public\n     * @return boolean\n     */\n    public function mail($from)\n    {\n        $useVerp = ($this->do_verp ? ' XVERP' : '');\n        return $this->sendCommand(\n            'MAIL FROM',\n            'MAIL FROM:<' . $from . '>' . $useVerp,\n            250\n        );\n    }\n\n    /**\n     * Send an SMTP QUIT command.\n     * Closes the socket if there is no error or the $close_on_error argument is true.\n     * Implements from rfc 821: QUIT <CRLF>\n     * @param boolean $close_on_error Should the connection close if an error occurs?\n     * @access public\n     * @return boolean\n     */\n    public function quit($close_on_error = true)\n    {\n        $noerror = $this->sendCommand('QUIT', 'QUIT', 221);\n        $err = $this->error; //Save any error\n        if ($noerror or $close_on_error) {\n            $this->close();\n            $this->error = $err; //Restore any error from the quit command\n        }\n        return $noerror;\n    }\n\n    /**\n     * Send an SMTP RCPT command.\n     * Sets the TO argument to $toaddr.\n     * Returns true if the recipient was accepted false if it was rejected.\n     * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>\n     * @param string $address The address the message is being sent to\n     * @access public\n     * @return boolean\n     */\n    public function recipient($address)\n    {\n        return $this->sendCommand(\n            'RCPT TO',\n            'RCPT TO:<' . $address . '>',\n            array(250, 251)\n        );\n    }\n\n    /**\n     * Send an SMTP RSET command.\n     * Abort any transaction that is currently in progress.\n     * Implements rfc 821: RSET <CRLF>\n     * @access public\n     * @return boolean True on success.\n     */\n    public function reset()\n    {\n        return $this->sendCommand('RSET', 'RSET', 250);\n    }\n\n    /**\n     * Send a command to an SMTP server and check its return code.\n     * @param string $command The command name - not sent to the server\n     * @param string $commandstring The actual command to send\n     * @param integer|array $expect One or more expected integer success codes\n     * @access protected\n     * @return boolean True on success.\n     */\n    protected function sendCommand($command, $commandstring, $expect)\n    {\n        if (!$this->connected()) {\n            $this->setError(\"Called $command without being connected\");\n            return false;\n        }\n        //Reject line breaks in all commands\n        if (strpos($commandstring, \"\\n\") !== false or strpos($commandstring, \"\\r\") !== false) {\n            $this->setError(\"Command '$command' contained line breaks\");\n            return false;\n        }\n        $this->client_send($commandstring . self::CRLF);\n\n        $this->last_reply = $this->get_lines();\n        // Fetch SMTP code and possible error code explanation\n        $matches = array();\n        if (preg_match(\"/^([0-9]{3})[ -](?:([0-9]\\\\.[0-9]\\\\.[0-9]) )?/\", $this->last_reply, $matches)) {\n            $code = $matches[1];\n            $code_ex = (count($matches) > 2 ? $matches[2] : null);\n            // Cut off error code from each response line\n            $detail = preg_replace(\n                \"/{$code}[ -]\".($code_ex ? str_replace('.', '\\\\.', $code_ex).' ' : '').\"/m\",\n                '',\n                $this->last_reply\n            );\n        } else {\n            // Fall back to simple parsing if regex fails\n            $code = substr($this->last_reply, 0, 3);\n            $code_ex = null;\n            $detail = substr($this->last_reply, 4);\n        }\n\n        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);\n\n        if (!in_array($code, (array)$expect)) {\n            $this->setError(\n                \"$command command failed\",\n                $detail,\n                $code,\n                $code_ex\n            );\n            $this->edebug(\n                'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,\n                self::DEBUG_CLIENT\n            );\n            return false;\n        }\n\n        $this->setError('');\n        return true;\n    }\n\n    /**\n     * Send an SMTP SAML command.\n     * Starts a mail transaction from the email address specified in $from.\n     * Returns true if successful or false otherwise. If True\n     * the mail transaction is started and then one or more recipient\n     * commands may be called followed by a data command. This command\n     * will send the message to the users terminal if they are logged\n     * in and send them an email.\n     * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>\n     * @param string $from The address the message is from\n     * @access public\n     * @return boolean\n     */\n    public function sendAndMail($from)\n    {\n        return $this->sendCommand('SAML', \"SAML FROM:$from\", 250);\n    }\n\n    /**\n     * Send an SMTP VRFY command.\n     * @param string $name The name to verify\n     * @access public\n     * @return boolean\n     */\n    public function verify($name)\n    {\n        return $this->sendCommand('VRFY', \"VRFY $name\", array(250, 251));\n    }\n\n    /**\n     * Send an SMTP NOOP command.\n     * Used to keep keep-alives alive, doesn't actually do anything\n     * @access public\n     * @return boolean\n     */\n    public function noop()\n    {\n        return $this->sendCommand('NOOP', 'NOOP', 250);\n    }\n\n    /**\n     * Send an SMTP TURN command.\n     * This is an optional command for SMTP that this class does not support.\n     * This method is here to make the RFC821 Definition complete for this class\n     * and _may_ be implemented in future\n     * Implements from rfc 821: TURN <CRLF>\n     * @access public\n     * @return boolean\n     */\n    public function turn()\n    {\n        $this->setError('The SMTP TURN command is not implemented');\n        $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);\n        return false;\n    }\n\n    /**\n     * Send raw data to the server.\n     * @param string $data The data to send\n     * @access public\n     * @return integer|boolean The number of bytes sent to the server or false on error\n     */\n    public function client_send($data)\n    {\n        $this->edebug(\"CLIENT -> SERVER: $data\", self::DEBUG_CLIENT);\n        return fwrite($this->smtp_conn, $data);\n    }\n\n    /**\n     * Get the latest error.\n     * @access public\n     * @return array\n     */\n    public function getError()\n    {\n        return $this->error;\n    }\n\n    /**\n     * Get SMTP extensions available on the server\n     * @access public\n     * @return array|null\n     */\n    public function getServerExtList()\n    {\n        return $this->server_caps;\n    }\n\n    /**\n     * A multipurpose method\n     * The method works in three ways, dependent on argument value and current state\n     *   1. HELO/EHLO was not sent - returns null and set up $this->error\n     *   2. HELO was sent\n     *     $name = 'HELO': returns server name\n     *     $name = 'EHLO': returns boolean false\n     *     $name = any string: returns null and set up $this->error\n     *   3. EHLO was sent\n     *     $name = 'HELO'|'EHLO': returns server name\n     *     $name = any string: if extension $name exists, returns boolean True\n     *       or its options. Otherwise returns boolean False\n     * In other words, one can use this method to detect 3 conditions:\n     *  - null returned: handshake was not or we don't know about ext (refer to $this->error)\n     *  - false returned: the requested feature exactly not exists\n     *  - positive value returned: the requested feature exists\n     * @param string $name Name of SMTP extension or 'HELO'|'EHLO'\n     * @return mixed\n     */\n    public function getServerExt($name)\n    {\n        if (!$this->server_caps) {\n            $this->setError('No HELO/EHLO was sent');\n            return null;\n        }\n\n        // the tight logic knot ;)\n        if (!array_key_exists($name, $this->server_caps)) {\n            if ($name == 'HELO') {\n                return $this->server_caps['EHLO'];\n            }\n            if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {\n                return false;\n            }\n            $this->setError('HELO handshake was used. Client knows nothing about server extensions');\n            return null;\n        }\n\n        return $this->server_caps[$name];\n    }\n\n    /**\n     * Get the last reply from the server.\n     * @access public\n     * @return string\n     */\n    public function getLastReply()\n    {\n        return $this->last_reply;\n    }\n\n    /**\n     * Read the SMTP server's response.\n     * Either before eof or socket timeout occurs on the operation.\n     * With SMTP we can tell if we have more lines to read if the\n     * 4th character is '-' symbol. If it is a space then we don't\n     * need to read anything else.\n     * @access protected\n     * @return string\n     */\n    protected function get_lines()\n    {\n        // If the connection is bad, give up straight away\n        if (!is_resource($this->smtp_conn)) {\n            return '';\n        }\n        $data = '';\n        $endtime = 0;\n        stream_set_timeout($this->smtp_conn, $this->Timeout);\n        if ($this->Timelimit > 0) {\n            $endtime = time() + $this->Timelimit;\n        }\n        while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {\n            $str = @fgets($this->smtp_conn, 515);\n            $this->edebug(\"SMTP -> get_lines(): \\$data is \\\"$data\\\"\", self::DEBUG_LOWLEVEL);\n            $this->edebug(\"SMTP -> get_lines(): \\$str is  \\\"$str\\\"\", self::DEBUG_LOWLEVEL);\n            $data .= $str;\n            // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen\n            if ((isset($str[3]) and $str[3] == ' ')) {\n                break;\n            }\n            // Timed-out? Log and break\n            $info = stream_get_meta_data($this->smtp_conn);\n            if ($info['timed_out']) {\n                $this->edebug(\n                    'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n            // Now check if reads took too long\n            if ($endtime and time() > $endtime) {\n                $this->edebug(\n                    'SMTP -> get_lines(): timelimit reached ('.\n                    $this->Timelimit . ' sec)',\n                    self::DEBUG_LOWLEVEL\n                );\n                break;\n            }\n        }\n        return $data;\n    }\n\n    /**\n     * Enable or disable VERP address generation.\n     * @param boolean $enabled\n     */\n    public function setVerp($enabled = false)\n    {\n        $this->do_verp = $enabled;\n    }\n\n    /**\n     * Get VERP address generation mode.\n     * @return boolean\n     */\n    public function getVerp()\n    {\n        return $this->do_verp;\n    }\n\n    /**\n     * Set error messages and codes.\n     * @param string $message The error message\n     * @param string $detail Further detail on the error\n     * @param string $smtp_code An associated SMTP error code\n     * @param string $smtp_code_ex Extended SMTP code\n     */\n    protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')\n    {\n        $this->error = array(\n            'error' => $message,\n            'detail' => $detail,\n            'smtp_code' => $smtp_code,\n            'smtp_code_ex' => $smtp_code_ex\n        );\n    }\n\n    /**\n     * Set debug output method.\n     * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.\n     */\n    public function setDebugOutput($method = 'echo')\n    {\n        $this->Debugoutput = $method;\n    }\n\n    /**\n     * Get debug output method.\n     * @return string\n     */\n    public function getDebugOutput()\n    {\n        return $this->Debugoutput;\n    }\n\n    /**\n     * Set debug output level.\n     * @param integer $level\n     */\n    public function setDebugLevel($level = 0)\n    {\n        $this->do_debug = $level;\n    }\n\n    /**\n     * Get debug output level.\n     * @return integer\n     */\n    public function getDebugLevel()\n    {\n        return $this->do_debug;\n    }\n\n    /**\n     * Set SMTP timeout.\n     * @param integer $timeout\n     */\n    public function setTimeout($timeout = 0)\n    {\n        $this->Timeout = $timeout;\n    }\n\n    /**\n     * Get SMTP timeout.\n     * @return integer\n     */\n    public function getTimeout()\n    {\n        return $this->Timeout;\n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-snoopy.php",
    "content": "<?php\n\n/**\n * Deprecated. Use WP_HTTP (http.php) instead.\n */\n_deprecated_file( basename( __FILE__ ), '3.0', WPINC . '/http.php' );\n\nif ( ! class_exists( 'Snoopy', false ) ) :\n/*************************************************\n\nSnoopy - the PHP net client\nAuthor: Monte Ohrt <monte@ispi.net>\nCopyright (c): 1999-2008 New Digital Group, all rights reserved\nVersion: 1.2.4\n\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\nYou may contact the author of Snoopy by e-mail at:\nmonte@ohrt.com\n\nThe latest version of Snoopy can be obtained from:\nhttp://snoopy.sourceforge.net/\n\n*************************************************/\n\nclass Snoopy\n{\n\t/**** Public variables ****/\n\n\t/* user definable vars */\n\n\tvar $host\t\t\t=\t\"www.php.net\";\t\t// host name we are connecting to\n\tvar $port\t\t\t=\t80;\t\t\t\t\t// port we are connecting to\n\tvar $proxy_host\t\t=\t\"\";\t\t\t\t\t// proxy host to use\n\tvar $proxy_port\t\t=\t\"\";\t\t\t\t\t// proxy port to use\n\tvar $proxy_user\t\t=\t\"\";\t\t\t\t\t// proxy user to use\n\tvar $proxy_pass\t\t=\t\"\";\t\t\t\t\t// proxy password to use\n\n\tvar $agent\t\t\t=\t\"Snoopy v1.2.4\";\t// agent we masquerade as\n\tvar\t$referer\t\t=\t\"\";\t\t\t\t\t// referer info to pass\n\tvar $cookies\t\t=\tarray();\t\t\t// array of cookies to pass\n\t\t\t\t\t\t\t\t\t\t\t\t// $cookies[\"username\"]=\"joe\";\n\tvar\t$rawheaders\t\t=\tarray();\t\t\t// array of raw headers to send\n\t\t\t\t\t\t\t\t\t\t\t\t// $rawheaders[\"Content-type\"]=\"text/html\";\n\n\tvar $maxredirs\t\t=\t5;\t\t\t\t\t// http redirection depth maximum. 0 = disallow\n\tvar $lastredirectaddr\t=\t\"\";\t\t\t\t// contains address of last redirected address\n\tvar\t$offsiteok\t\t=\ttrue;\t\t\t\t// allows redirection off-site\n\tvar $maxframes\t\t=\t0;\t\t\t\t\t// frame content depth maximum. 0 = disallow\n\tvar $expandlinks\t=\ttrue;\t\t\t\t// expand links to fully qualified URLs.\n\t\t\t\t\t\t\t\t\t\t\t\t// this only applies to fetchlinks()\n\t\t\t\t\t\t\t\t\t\t\t\t// submitlinks(), and submittext()\n\tvar $passcookies\t=\ttrue;\t\t\t\t// pass set cookies back through redirects\n\t\t\t\t\t\t\t\t\t\t\t\t// NOTE: this currently does not respect\n\t\t\t\t\t\t\t\t\t\t\t\t// dates, domains or paths.\n\n\tvar\t$user\t\t\t=\t\"\";\t\t\t\t\t// user for http authentication\n\tvar\t$pass\t\t\t=\t\"\";\t\t\t\t\t// password for http authentication\n\n\t// http accept types\n\tvar $accept\t\t\t=\t\"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\";\n\n\tvar $results\t\t=\t\"\";\t\t\t\t\t// where the content is put\n\n\tvar $error\t\t\t=\t\"\";\t\t\t\t\t// error messages sent here\n\tvar\t$response_code\t=\t\"\";\t\t\t\t\t// response code returned from server\n\tvar\t$headers\t\t=\tarray();\t\t\t// headers returned from server sent here\n\tvar\t$maxlength\t\t=\t500000;\t\t\t\t// max return data length (body)\n\tvar $read_timeout\t=\t0;\t\t\t\t\t// timeout on read operations, in seconds\n\t\t\t\t\t\t\t\t\t\t\t\t// supported only since PHP 4 Beta 4\n\t\t\t\t\t\t\t\t\t\t\t\t// set to 0 to disallow timeouts\n\tvar $timed_out\t\t=\tfalse;\t\t\t\t// if a read operation timed out\n\tvar\t$status\t\t\t=\t0;\t\t\t\t\t// http request status\n\n\tvar $temp_dir\t\t=\t\"/tmp\";\t\t\t\t// temporary directory that the webserver\n\t\t\t\t\t\t\t\t\t\t\t\t// has permission to write to.\n\t\t\t\t\t\t\t\t\t\t\t\t// under Windows, this should be C:\\temp\n\n\tvar\t$curl_path\t\t=\t\"/usr/local/bin/curl\";\n\t\t\t\t\t\t\t\t\t\t\t\t// Snoopy will use cURL for fetching\n\t\t\t\t\t\t\t\t\t\t\t\t// SSL content if a full system path to\n\t\t\t\t\t\t\t\t\t\t\t\t// the cURL binary is supplied here.\n\t\t\t\t\t\t\t\t\t\t\t\t// set to false if you do not have\n\t\t\t\t\t\t\t\t\t\t\t\t// cURL installed. See http://curl.haxx.se\n\t\t\t\t\t\t\t\t\t\t\t\t// for details on installing cURL.\n\t\t\t\t\t\t\t\t\t\t\t\t// Snoopy does *not* use the cURL\n\t\t\t\t\t\t\t\t\t\t\t\t// library functions built into php,\n\t\t\t\t\t\t\t\t\t\t\t\t// as these functions are not stable\n\t\t\t\t\t\t\t\t\t\t\t\t// as of this Snoopy release.\n\n\t/**** Private variables ****/\n\n\tvar\t$_maxlinelen\t=\t4096;\t\t\t\t// max line length (headers)\n\n\tvar $_httpmethod\t=\t\"GET\";\t\t\t\t// default http request method\n\tvar $_httpversion\t=\t\"HTTP/1.0\";\t\t\t// default http request version\n\tvar $_submit_method\t=\t\"POST\";\t\t\t\t// default submit method\n\tvar $_submit_type\t=\t\"application/x-www-form-urlencoded\";\t// default submit type\n\tvar $_mime_boundary\t=   \"\";\t\t\t\t\t// MIME boundary for multipart/form-data submit type\n\tvar $_redirectaddr\t=\tfalse;\t\t\t\t// will be set if page fetched is a redirect\n\tvar $_redirectdepth\t=\t0;\t\t\t\t\t// increments on an http redirect\n\tvar $_frameurls\t\t= \tarray();\t\t\t// frame src urls\n\tvar $_framedepth\t=\t0;\t\t\t\t\t// increments on frame depth\n\n\tvar $_isproxy\t\t=\tfalse;\t\t\t\t// set if using a proxy server\n\tvar $_fp_timeout\t=\t30;\t\t\t\t\t// timeout for socket connection\n\n/*======================================================================*\\\n\tFunction:\tfetch\n\tPurpose:\tfetch the contents of a web page\n\t\t\t\t(and possibly other protocols in the\n\t\t\t\tfuture like ftp, nntp, gopher, etc.)\n\tInput:\t\t$URI\tthe location of the page to fetch\n\tOutput:\t\t$this->results\tthe output text from the fetch\n\\*======================================================================*/\n\n\tfunction fetch($URI)\n\t{\n\n\t\t//preg_match(\"|^([^:]+)://([^:/]+)(:[\\d]+)*(.*)|\",$URI,$URI_PARTS);\n\t\t$URI_PARTS = parse_url($URI);\n\t\tif (!empty($URI_PARTS[\"user\"]))\n\t\t\t$this->user = $URI_PARTS[\"user\"];\n\t\tif (!empty($URI_PARTS[\"pass\"]))\n\t\t\t$this->pass = $URI_PARTS[\"pass\"];\n\t\tif (empty($URI_PARTS[\"query\"]))\n\t\t\t$URI_PARTS[\"query\"] = '';\n\t\tif (empty($URI_PARTS[\"path\"]))\n\t\t\t$URI_PARTS[\"path\"] = '';\n\n\t\tswitch(strtolower($URI_PARTS[\"scheme\"]))\n\t\t{\n\t\t\tcase \"http\":\n\t\t\t\t$this->host = $URI_PARTS[\"host\"];\n\t\t\t\tif(!empty($URI_PARTS[\"port\"]))\n\t\t\t\t\t$this->port = $URI_PARTS[\"port\"];\n\t\t\t\tif($this->_connect($fp))\n\t\t\t\t{\n\t\t\t\t\tif($this->_isproxy)\n\t\t\t\t\t{\n\t\t\t\t\t\t// using proxy, send entire URI\n\t\t\t\t\t\t$this->_httprequest($URI,$fp,$URI,$this->_httpmethod);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$path = $URI_PARTS[\"path\"].($URI_PARTS[\"query\"] ? \"?\".$URI_PARTS[\"query\"] : \"\");\n\t\t\t\t\t\t// no proxy, send only the path\n\t\t\t\t\t\t$this->_httprequest($path, $fp, $URI, $this->_httpmethod);\n\t\t\t\t\t}\n\n\t\t\t\t\t$this->_disconnect($fp);\n\n\t\t\t\t\tif($this->_redirectaddr)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* url was redirected, check if we've hit the max depth */\n\t\t\t\t\t\tif($this->maxredirs > $this->_redirectdepth)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// only follow redirect if it's on this site, or offsiteok is true\n\t\t\t\t\t\t\tif(preg_match(\"|^http://\".preg_quote($this->host).\"|i\",$this->_redirectaddr) || $this->offsiteok)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* follow the redirect */\n\t\t\t\t\t\t\t\t$this->_redirectdepth++;\n\t\t\t\t\t\t\t\t$this->lastredirectaddr=$this->_redirectaddr;\n\t\t\t\t\t\t\t\t$this->fetch($this->_redirectaddr);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t$frameurls = $this->_frameurls;\n\t\t\t\t\t\t$this->_frameurls = array();\n\n\t\t\t\t\t\twhile(list(,$frameurl) = each($frameurls))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif($this->_framedepth < $this->maxframes)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$this->fetch($frameurl);\n\t\t\t\t\t\t\t\t$this->_framedepth++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t\tbreak;\n\t\t\tcase \"https\":\n\t\t\t\tif(!$this->curl_path)\n\t\t\t\t\treturn false;\n\t\t\t\tif(function_exists(\"is_executable\"))\n\t\t\t\t    if (!is_executable($this->curl_path))\n\t\t\t\t        return false;\n\t\t\t\t$this->host = $URI_PARTS[\"host\"];\n\t\t\t\tif(!empty($URI_PARTS[\"port\"]))\n\t\t\t\t\t$this->port = $URI_PARTS[\"port\"];\n\t\t\t\tif($this->_isproxy)\n\t\t\t\t{\n\t\t\t\t\t// using proxy, send entire URI\n\t\t\t\t\t$this->_httpsrequest($URI,$URI,$this->_httpmethod);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$path = $URI_PARTS[\"path\"].($URI_PARTS[\"query\"] ? \"?\".$URI_PARTS[\"query\"] : \"\");\n\t\t\t\t\t// no proxy, send only the path\n\t\t\t\t\t$this->_httpsrequest($path, $URI, $this->_httpmethod);\n\t\t\t\t}\n\n\t\t\t\tif($this->_redirectaddr)\n\t\t\t\t{\n\t\t\t\t\t/* url was redirected, check if we've hit the max depth */\n\t\t\t\t\tif($this->maxredirs > $this->_redirectdepth)\n\t\t\t\t\t{\n\t\t\t\t\t\t// only follow redirect if it's on this site, or offsiteok is true\n\t\t\t\t\t\tif(preg_match(\"|^http://\".preg_quote($this->host).\"|i\",$this->_redirectaddr) || $this->offsiteok)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* follow the redirect */\n\t\t\t\t\t\t\t$this->_redirectdepth++;\n\t\t\t\t\t\t\t$this->lastredirectaddr=$this->_redirectaddr;\n\t\t\t\t\t\t\t$this->fetch($this->_redirectaddr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)\n\t\t\t\t{\n\t\t\t\t\t$frameurls = $this->_frameurls;\n\t\t\t\t\t$this->_frameurls = array();\n\n\t\t\t\t\twhile(list(,$frameurl) = each($frameurls))\n\t\t\t\t\t{\n\t\t\t\t\t\tif($this->_framedepth < $this->maxframes)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->fetch($frameurl);\n\t\t\t\t\t\t\t$this->_framedepth++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// not a valid protocol\n\t\t\t\t$this->error\t=\t'Invalid protocol \"'.$URI_PARTS[\"scheme\"].'\"\\n';\n\t\t\t\treturn false;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn true;\n\t}\n\n/*======================================================================*\\\n\tFunction:\tsubmit\n\tPurpose:\tsubmit an http form\n\tInput:\t\t$URI\tthe location to post the data\n\t\t\t\t$formvars\tthe formvars to use.\n\t\t\t\t\tformat: $formvars[\"var\"] = \"val\";\n\t\t\t\t$formfiles  an array of files to submit\n\t\t\t\t\tformat: $formfiles[\"var\"] = \"/dir/filename.ext\";\n\tOutput:\t\t$this->results\tthe text output from the post\n\\*======================================================================*/\n\n\tfunction submit($URI, $formvars=\"\", $formfiles=\"\")\n\t{\n\t\tunset($postdata);\n\n\t\t$postdata = $this->_prepare_post_body($formvars, $formfiles);\n\n\t\t$URI_PARTS = parse_url($URI);\n\t\tif (!empty($URI_PARTS[\"user\"]))\n\t\t\t$this->user = $URI_PARTS[\"user\"];\n\t\tif (!empty($URI_PARTS[\"pass\"]))\n\t\t\t$this->pass = $URI_PARTS[\"pass\"];\n\t\tif (empty($URI_PARTS[\"query\"]))\n\t\t\t$URI_PARTS[\"query\"] = '';\n\t\tif (empty($URI_PARTS[\"path\"]))\n\t\t\t$URI_PARTS[\"path\"] = '';\n\n\t\tswitch(strtolower($URI_PARTS[\"scheme\"]))\n\t\t{\n\t\t\tcase \"http\":\n\t\t\t\t$this->host = $URI_PARTS[\"host\"];\n\t\t\t\tif(!empty($URI_PARTS[\"port\"]))\n\t\t\t\t\t$this->port = $URI_PARTS[\"port\"];\n\t\t\t\tif($this->_connect($fp))\n\t\t\t\t{\n\t\t\t\t\tif($this->_isproxy)\n\t\t\t\t\t{\n\t\t\t\t\t\t// using proxy, send entire URI\n\t\t\t\t\t\t$this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t$path = $URI_PARTS[\"path\"].($URI_PARTS[\"query\"] ? \"?\".$URI_PARTS[\"query\"] : \"\");\n\t\t\t\t\t\t// no proxy, send only the path\n\t\t\t\t\t\t$this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata);\n\t\t\t\t\t}\n\n\t\t\t\t\t$this->_disconnect($fp);\n\n\t\t\t\t\tif($this->_redirectaddr)\n\t\t\t\t\t{\n\t\t\t\t\t\t/* url was redirected, check if we've hit the max depth */\n\t\t\t\t\t\tif($this->maxredirs > $this->_redirectdepth)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(!preg_match(\"|^\".$URI_PARTS[\"scheme\"].\"://|\", $this->_redirectaddr))\n\t\t\t\t\t\t\t\t$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS[\"scheme\"].\"://\".$URI_PARTS[\"host\"]);\n\n\t\t\t\t\t\t\t// only follow redirect if it's on this site, or offsiteok is true\n\t\t\t\t\t\t\tif(preg_match(\"|^http://\".preg_quote($this->host).\"|i\",$this->_redirectaddr) || $this->offsiteok)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t/* follow the redirect */\n\t\t\t\t\t\t\t\t$this->_redirectdepth++;\n\t\t\t\t\t\t\t\t$this->lastredirectaddr=$this->_redirectaddr;\n\t\t\t\t\t\t\t\tif( strpos( $this->_redirectaddr, \"?\" ) > 0 )\n\t\t\t\t\t\t\t\t\t$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t$this->submit($this->_redirectaddr,$formvars, $formfiles);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t$frameurls = $this->_frameurls;\n\t\t\t\t\t\t$this->_frameurls = array();\n\n\t\t\t\t\t\twhile(list(,$frameurl) = each($frameurls))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif($this->_framedepth < $this->maxframes)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t$this->fetch($frameurl);\n\t\t\t\t\t\t\t\t$this->_framedepth++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t\tbreak;\n\t\t\tcase \"https\":\n\t\t\t\tif(!$this->curl_path)\n\t\t\t\t\treturn false;\n\t\t\t\tif(function_exists(\"is_executable\"))\n\t\t\t\t    if (!is_executable($this->curl_path))\n\t\t\t\t        return false;\n\t\t\t\t$this->host = $URI_PARTS[\"host\"];\n\t\t\t\tif(!empty($URI_PARTS[\"port\"]))\n\t\t\t\t\t$this->port = $URI_PARTS[\"port\"];\n\t\t\t\tif($this->_isproxy)\n\t\t\t\t{\n\t\t\t\t\t// using proxy, send entire URI\n\t\t\t\t\t$this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t$path = $URI_PARTS[\"path\"].($URI_PARTS[\"query\"] ? \"?\".$URI_PARTS[\"query\"] : \"\");\n\t\t\t\t\t// no proxy, send only the path\n\t\t\t\t\t$this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata);\n\t\t\t\t}\n\n\t\t\t\tif($this->_redirectaddr)\n\t\t\t\t{\n\t\t\t\t\t/* url was redirected, check if we've hit the max depth */\n\t\t\t\t\tif($this->maxredirs > $this->_redirectdepth)\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!preg_match(\"|^\".$URI_PARTS[\"scheme\"].\"://|\", $this->_redirectaddr))\n\t\t\t\t\t\t\t$this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS[\"scheme\"].\"://\".$URI_PARTS[\"host\"]);\n\n\t\t\t\t\t\t// only follow redirect if it's on this site, or offsiteok is true\n\t\t\t\t\t\tif(preg_match(\"|^http://\".preg_quote($this->host).\"|i\",$this->_redirectaddr) || $this->offsiteok)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t/* follow the redirect */\n\t\t\t\t\t\t\t$this->_redirectdepth++;\n\t\t\t\t\t\t\t$this->lastredirectaddr=$this->_redirectaddr;\n\t\t\t\t\t\t\tif( strpos( $this->_redirectaddr, \"?\" ) > 0 )\n\t\t\t\t\t\t\t\t$this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t$this->submit($this->_redirectaddr,$formvars, $formfiles);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)\n\t\t\t\t{\n\t\t\t\t\t$frameurls = $this->_frameurls;\n\t\t\t\t\t$this->_frameurls = array();\n\n\t\t\t\t\twhile(list(,$frameurl) = each($frameurls))\n\t\t\t\t\t{\n\t\t\t\t\t\tif($this->_framedepth < $this->maxframes)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t$this->fetch($frameurl);\n\t\t\t\t\t\t\t$this->_framedepth++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// not a valid protocol\n\t\t\t\t$this->error\t=\t'Invalid protocol \"'.$URI_PARTS[\"scheme\"].'\"\\n';\n\t\t\t\treturn false;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn true;\n\t}\n\n/*======================================================================*\\\n\tFunction:\tfetchlinks\n\tPurpose:\tfetch the links from a web page\n\tInput:\t\t$URI\twhere you are fetching from\n\tOutput:\t\t$this->results\tan array of the URLs\n\\*======================================================================*/\n\n\tfunction fetchlinks($URI)\n\t{\n\t\tif ($this->fetch($URI))\n\t\t{\n\t\t\tif($this->lastredirectaddr)\n\t\t\t\t$URI = $this->lastredirectaddr;\n\t\t\tif(is_array($this->results))\n\t\t\t{\n\t\t\t\tfor($x=0;$x<count($this->results);$x++)\n\t\t\t\t\t$this->results[$x] = $this->_striplinks($this->results[$x]);\n\t\t\t}\n\t\t\telse\n\t\t\t\t$this->results = $this->_striplinks($this->results);\n\n\t\t\tif($this->expandlinks)\n\t\t\t\t$this->results = $this->_expandlinks($this->results, $URI);\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\n/*======================================================================*\\\n\tFunction:\tfetchform\n\tPurpose:\tfetch the form elements from a web page\n\tInput:\t\t$URI\twhere you are fetching from\n\tOutput:\t\t$this->results\tthe resulting html form\n\\*======================================================================*/\n\n\tfunction fetchform($URI)\n\t{\n\n\t\tif ($this->fetch($URI))\n\t\t{\n\n\t\t\tif(is_array($this->results))\n\t\t\t{\n\t\t\t\tfor($x=0;$x<count($this->results);$x++)\n\t\t\t\t\t$this->results[$x] = $this->_stripform($this->results[$x]);\n\t\t\t}\n\t\t\telse\n\t\t\t\t$this->results = $this->_stripform($this->results);\n\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\n\n/*======================================================================*\\\n\tFunction:\tfetchtext\n\tPurpose:\tfetch the text from a web page, stripping the links\n\tInput:\t\t$URI\twhere you are fetching from\n\tOutput:\t\t$this->results\tthe text from the web page\n\\*======================================================================*/\n\n\tfunction fetchtext($URI)\n\t{\n\t\tif($this->fetch($URI))\n\t\t{\n\t\t\tif(is_array($this->results))\n\t\t\t{\n\t\t\t\tfor($x=0;$x<count($this->results);$x++)\n\t\t\t\t\t$this->results[$x] = $this->_striptext($this->results[$x]);\n\t\t\t}\n\t\t\telse\n\t\t\t\t$this->results = $this->_striptext($this->results);\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\n/*======================================================================*\\\n\tFunction:\tsubmitlinks\n\tPurpose:\tgrab links from a form submission\n\tInput:\t\t$URI\twhere you are submitting from\n\tOutput:\t\t$this->results\tan array of the links from the post\n\\*======================================================================*/\n\n\tfunction submitlinks($URI, $formvars=\"\", $formfiles=\"\")\n\t{\n\t\tif($this->submit($URI,$formvars, $formfiles))\n\t\t{\n\t\t\tif($this->lastredirectaddr)\n\t\t\t\t$URI = $this->lastredirectaddr;\n\t\t\tif(is_array($this->results))\n\t\t\t{\n\t\t\t\tfor($x=0;$x<count($this->results);$x++)\n\t\t\t\t{\n\t\t\t\t\t$this->results[$x] = $this->_striplinks($this->results[$x]);\n\t\t\t\t\tif($this->expandlinks)\n\t\t\t\t\t\t$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->results = $this->_striplinks($this->results);\n\t\t\t\tif($this->expandlinks)\n\t\t\t\t\t$this->results = $this->_expandlinks($this->results,$URI);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\n/*======================================================================*\\\n\tFunction:\tsubmittext\n\tPurpose:\tgrab text from a form submission\n\tInput:\t\t$URI\twhere you are submitting from\n\tOutput:\t\t$this->results\tthe text from the web page\n\\*======================================================================*/\n\n\tfunction submittext($URI, $formvars = \"\", $formfiles = \"\")\n\t{\n\t\tif($this->submit($URI,$formvars, $formfiles))\n\t\t{\n\t\t\tif($this->lastredirectaddr)\n\t\t\t\t$URI = $this->lastredirectaddr;\n\t\t\tif(is_array($this->results))\n\t\t\t{\n\t\t\t\tfor($x=0;$x<count($this->results);$x++)\n\t\t\t\t{\n\t\t\t\t\t$this->results[$x] = $this->_striptext($this->results[$x]);\n\t\t\t\t\tif($this->expandlinks)\n\t\t\t\t\t\t$this->results[$x] = $this->_expandlinks($this->results[$x],$URI);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$this->results = $this->_striptext($this->results);\n\t\t\t\tif($this->expandlinks)\n\t\t\t\t\t$this->results = $this->_expandlinks($this->results,$URI);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t\treturn false;\n\t}\n\n\n\n/*======================================================================*\\\n\tFunction:\tset_submit_multipart\n\tPurpose:\tSet the form submission content type to\n\t\t\t\tmultipart/form-data\n\\*======================================================================*/\n\tfunction set_submit_multipart()\n\t{\n\t\t$this->_submit_type = \"multipart/form-data\";\n\t}\n\n\n/*======================================================================*\\\n\tFunction:\tset_submit_normal\n\tPurpose:\tSet the form submission content type to\n\t\t\t\tapplication/x-www-form-urlencoded\n\\*======================================================================*/\n\tfunction set_submit_normal()\n\t{\n\t\t$this->_submit_type = \"application/x-www-form-urlencoded\";\n\t}\n\n\n\n\n/*======================================================================*\\\n\tPrivate functions\n\\*======================================================================*/\n\n\n/*======================================================================*\\\n\tFunction:\t_striplinks\n\tPurpose:\tstrip the hyperlinks from an html document\n\tInput:\t\t$document\tdocument to strip.\n\tOutput:\t\t$match\t\tan array of the links\n\\*======================================================================*/\n\n\tfunction _striplinks($document)\n\t{\n\t\tpreg_match_all(\"'<\\s*a\\s.*?href\\s*=\\s*\t\t\t# find <a href=\n\t\t\t\t\t\t([\\\"\\'])?\t\t\t\t\t# find single or double quote\n\t\t\t\t\t\t(?(1) (.*?)\\\\1 | ([^\\s\\>]+))\t\t# if quote found, match up to next matching\n\t\t\t\t\t\t\t\t\t\t\t\t\t# quote, otherwise match up to next space\n\t\t\t\t\t\t'isx\",$document,$links);\n\n\n\t\t// catenate the non-empty matches from the conditional subpattern\n\n\t\twhile(list($key,$val) = each($links[2]))\n\t\t{\n\t\t\tif(!empty($val))\n\t\t\t\t$match[] = $val;\n\t\t}\n\n\t\twhile(list($key,$val) = each($links[3]))\n\t\t{\n\t\t\tif(!empty($val))\n\t\t\t\t$match[] = $val;\n\t\t}\n\n\t\t// return the links\n\t\treturn $match;\n\t}\n\n/*======================================================================*\\\n\tFunction:\t_stripform\n\tPurpose:\tstrip the form elements from an html document\n\tInput:\t\t$document\tdocument to strip.\n\tOutput:\t\t$match\t\tan array of the links\n\\*======================================================================*/\n\n\tfunction _stripform($document)\n\t{\n\t\tpreg_match_all(\"'<\\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\\/?(option|select)[^<>]*>[\\r\\n]*)|(?=[\\r\\n]*))|(?=[\\r\\n]*))'Usi\",$document,$elements);\n\n\t\t// catenate the matches\n\t\t$match = implode(\"\\r\\n\",$elements[0]);\n\n\t\t// return the links\n\t\treturn $match;\n\t}\n\n\n\n/*======================================================================*\\\n\tFunction:\t_striptext\n\tPurpose:\tstrip the text from an html document\n\tInput:\t\t$document\tdocument to strip.\n\tOutput:\t\t$text\t\tthe resulting text\n\\*======================================================================*/\n\n\tfunction _striptext($document)\n\t{\n\n\t\t// I didn't use preg eval (//e) since that is only available in PHP 4.0.\n\t\t// so, list your entities one by one here. I included some of the\n\t\t// more common ones.\n\n\t\t$search = array(\"'<script[^>]*?>.*?</script>'si\",\t// strip out javascript\n\t\t\t\t\t\t\"'<[\\/\\!]*?[^<>]*?>'si\",\t\t\t// strip out html tags\n\t\t\t\t\t\t\"'([\\r\\n])[\\s]+'\",\t\t\t\t\t// strip out white space\n\t\t\t\t\t\t\"'&(quot|#34|#034|#x22);'i\",\t\t// replace html entities\n\t\t\t\t\t\t\"'&(amp|#38|#038|#x26);'i\",\t\t\t// added hexadecimal values\n\t\t\t\t\t\t\"'&(lt|#60|#060|#x3c);'i\",\n\t\t\t\t\t\t\"'&(gt|#62|#062|#x3e);'i\",\n\t\t\t\t\t\t\"'&(nbsp|#160|#xa0);'i\",\n\t\t\t\t\t\t\"'&(iexcl|#161);'i\",\n\t\t\t\t\t\t\"'&(cent|#162);'i\",\n\t\t\t\t\t\t\"'&(pound|#163);'i\",\n\t\t\t\t\t\t\"'&(copy|#169);'i\",\n\t\t\t\t\t\t\"'&(reg|#174);'i\",\n\t\t\t\t\t\t\"'&(deg|#176);'i\",\n\t\t\t\t\t\t\"'&(#39|#039|#x27);'\",\n\t\t\t\t\t\t\"'&(euro|#8364);'i\",\t\t\t\t// europe\n\t\t\t\t\t\t\"'&a(uml|UML);'\",\t\t\t\t\t// german\n\t\t\t\t\t\t\"'&o(uml|UML);'\",\n\t\t\t\t\t\t\"'&u(uml|UML);'\",\n\t\t\t\t\t\t\"'&A(uml|UML);'\",\n\t\t\t\t\t\t\"'&O(uml|UML);'\",\n\t\t\t\t\t\t\"'&U(uml|UML);'\",\n\t\t\t\t\t\t\"'&szlig;'i\",\n\t\t\t\t\t\t);\n\t\t$replace = array(\t\"\",\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\"\\\\1\",\n\t\t\t\t\t\t\t\"\\\"\",\n\t\t\t\t\t\t\t\"&\",\n\t\t\t\t\t\t\t\"<\",\n\t\t\t\t\t\t\t\">\",\n\t\t\t\t\t\t\t\" \",\n\t\t\t\t\t\t\tchr(161),\n\t\t\t\t\t\t\tchr(162),\n\t\t\t\t\t\t\tchr(163),\n\t\t\t\t\t\t\tchr(169),\n\t\t\t\t\t\t\tchr(174),\n\t\t\t\t\t\t\tchr(176),\n\t\t\t\t\t\t\tchr(39),\n\t\t\t\t\t\t\tchr(128),\n\t\t\t\t\t\t\tchr(0xE4), // ANSI &auml;\n\t\t\t\t\t\t\tchr(0xF6), // ANSI &ouml;\n\t\t\t\t\t\t\tchr(0xFC), // ANSI &uuml;\n\t\t\t\t\t\t\tchr(0xC4), // ANSI &Auml;\n\t\t\t\t\t\t\tchr(0xD6), // ANSI &Ouml;\n\t\t\t\t\t\t\tchr(0xDC), // ANSI &Uuml;\n\t\t\t\t\t\t\tchr(0xDF), // ANSI &szlig;\n\t\t\t\t\t\t);\n\n\t\t$text = preg_replace($search,$replace,$document);\n\n\t\treturn $text;\n\t}\n\n/*======================================================================*\\\n\tFunction:\t_expandlinks\n\tPurpose:\texpand each link into a fully qualified URL\n\tInput:\t\t$links\t\t\tthe links to qualify\n\t\t\t\t$URI\t\t\tthe full URI to get the base from\n\tOutput:\t\t$expandedLinks\tthe expanded links\n\\*======================================================================*/\n\n\tfunction _expandlinks($links,$URI)\n\t{\n\n\t\tpreg_match(\"/^[^\\?]+/\",$URI,$match);\n\n\t\t$match = preg_replace(\"|/[^\\/\\.]+\\.[^\\/\\.]+$|\",\"\",$match[0]);\n\t\t$match = preg_replace(\"|/$|\",\"\",$match);\n\t\t$match_part = parse_url($match);\n\t\t$match_root =\n\t\t$match_part[\"scheme\"].\"://\".$match_part[\"host\"];\n\n\t\t$search = array( \t\"|^http://\".preg_quote($this->host).\"|i\",\n\t\t\t\t\t\t\t\"|^(\\/)|i\",\n\t\t\t\t\t\t\t\"|^(?!http://)(?!mailto:)|i\",\n\t\t\t\t\t\t\t\"|/\\./|\",\n\t\t\t\t\t\t\t\"|/[^\\/]+/\\.\\./|\"\n\t\t\t\t\t\t);\n\n\t\t$replace = array(\t\"\",\n\t\t\t\t\t\t\t$match_root.\"/\",\n\t\t\t\t\t\t\t$match.\"/\",\n\t\t\t\t\t\t\t\"/\",\n\t\t\t\t\t\t\t\"/\"\n\t\t\t\t\t\t);\n\n\t\t$expandedLinks = preg_replace($search,$replace,$links);\n\n\t\treturn $expandedLinks;\n\t}\n\n/*======================================================================*\\\n\tFunction:\t_httprequest\n\tPurpose:\tgo get the http data from the server\n\tInput:\t\t$url\t\tthe url to fetch\n\t\t\t\t$fp\t\t\tthe current open file pointer\n\t\t\t\t$URI\t\tthe full URI\n\t\t\t\t$body\t\tbody contents to send if any (POST)\n\tOutput:\n\\*======================================================================*/\n\n\tfunction _httprequest($url,$fp,$URI,$http_method,$content_type=\"\",$body=\"\")\n\t{\n\t\t$cookie_headers = '';\n\t\tif($this->passcookies && $this->_redirectaddr)\n\t\t\t$this->setcookies();\n\n\t\t$URI_PARTS = parse_url($URI);\n\t\tif(empty($url))\n\t\t\t$url = \"/\";\n\t\t$headers = $http_method.\" \".$url.\" \".$this->_httpversion.\"\\r\\n\";\n\t\tif(!empty($this->agent))\n\t\t\t$headers .= \"User-Agent: \".$this->agent.\"\\r\\n\";\n\t\tif(!empty($this->host) && !isset($this->rawheaders['Host'])) {\n\t\t\t$headers .= \"Host: \".$this->host;\n\t\t\tif(!empty($this->port) && $this->port != 80)\n\t\t\t\t$headers .= \":\".$this->port;\n\t\t\t$headers .= \"\\r\\n\";\n\t\t}\n\t\tif(!empty($this->accept))\n\t\t\t$headers .= \"Accept: \".$this->accept.\"\\r\\n\";\n\t\tif(!empty($this->referer))\n\t\t\t$headers .= \"Referer: \".$this->referer.\"\\r\\n\";\n\t\tif(!empty($this->cookies))\n\t\t{\n\t\t\tif(!is_array($this->cookies))\n\t\t\t\t$this->cookies = (array)$this->cookies;\n\n\t\t\treset($this->cookies);\n\t\t\tif ( count($this->cookies) > 0 ) {\n\t\t\t\t$cookie_headers .= 'Cookie: ';\n\t\t\t\tforeach ( $this->cookies as $cookieKey => $cookieVal ) {\n\t\t\t\t$cookie_headers .= $cookieKey.\"=\".urlencode($cookieVal).\"; \";\n\t\t\t\t}\n\t\t\t\t$headers .= substr($cookie_headers,0,-2) . \"\\r\\n\";\n\t\t\t}\n\t\t}\n\t\tif(!empty($this->rawheaders))\n\t\t{\n\t\t\tif(!is_array($this->rawheaders))\n\t\t\t\t$this->rawheaders = (array)$this->rawheaders;\n\t\t\twhile(list($headerKey,$headerVal) = each($this->rawheaders))\n\t\t\t\t$headers .= $headerKey.\": \".$headerVal.\"\\r\\n\";\n\t\t}\n\t\tif(!empty($content_type)) {\n\t\t\t$headers .= \"Content-type: $content_type\";\n\t\t\tif ($content_type == \"multipart/form-data\")\n\t\t\t\t$headers .= \"; boundary=\".$this->_mime_boundary;\n\t\t\t$headers .= \"\\r\\n\";\n\t\t}\n\t\tif(!empty($body))\n\t\t\t$headers .= \"Content-length: \".strlen($body).\"\\r\\n\";\n\t\tif(!empty($this->user) || !empty($this->pass))\n\t\t\t$headers .= \"Authorization: Basic \".base64_encode($this->user.\":\".$this->pass).\"\\r\\n\";\n\n\t\t//add proxy auth headers\n\t\tif(!empty($this->proxy_user))\n\t\t\t$headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass).\"\\r\\n\";\n\n\n\t\t$headers .= \"\\r\\n\";\n\n\t\t// set the read timeout if needed\n\t\tif ($this->read_timeout > 0)\n\t\t\tsocket_set_timeout($fp, $this->read_timeout);\n\t\t$this->timed_out = false;\n\n\t\tfwrite($fp,$headers.$body,strlen($headers.$body));\n\n\t\t$this->_redirectaddr = false;\n\t\tunset($this->headers);\n\n\t\twhile($currentHeader = fgets($fp,$this->_maxlinelen))\n\t\t{\n\t\t\tif ($this->read_timeout > 0 && $this->_check_timeout($fp))\n\t\t\t{\n\t\t\t\t$this->status=-100;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif($currentHeader == \"\\r\\n\")\n\t\t\t\tbreak;\n\n\t\t\t// if a header begins with Location: or URI:, set the redirect\n\t\t\tif(preg_match(\"/^(Location:|URI:)/i\",$currentHeader))\n\t\t\t{\n\t\t\t\t// get URL portion of the redirect\n\t\t\t\tpreg_match(\"/^(Location:|URI:)[ ]+(.*)/i\",chop($currentHeader),$matches);\n\t\t\t\t// look for :// in the Location header to see if hostname is included\n\t\t\t\tif(!preg_match(\"|\\:\\/\\/|\",$matches[2]))\n\t\t\t\t{\n\t\t\t\t\t// no host in the path, so prepend\n\t\t\t\t\t$this->_redirectaddr = $URI_PARTS[\"scheme\"].\"://\".$this->host.\":\".$this->port;\n\t\t\t\t\t// eliminate double slash\n\t\t\t\t\tif(!preg_match(\"|^/|\",$matches[2]))\n\t\t\t\t\t\t\t$this->_redirectaddr .= \"/\".$matches[2];\n\t\t\t\t\telse\n\t\t\t\t\t\t\t$this->_redirectaddr .= $matches[2];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t$this->_redirectaddr = $matches[2];\n\t\t\t}\n\n\t\t\tif(preg_match(\"|^HTTP/|\",$currentHeader))\n\t\t\t{\n                if(preg_match(\"|^HTTP/[^\\s]*\\s(.*?)\\s|\",$currentHeader, $status))\n\t\t\t\t{\n\t\t\t\t\t$this->status= $status[1];\n                }\n\t\t\t\t$this->response_code = $currentHeader;\n\t\t\t}\n\n\t\t\t$this->headers[] = $currentHeader;\n\t\t}\n\n\t\t$results = '';\n\t\tdo {\n    \t\t$_data = fread($fp, $this->maxlength);\n    \t\tif (strlen($_data) == 0) {\n        \t\tbreak;\n    \t\t}\n    \t\t$results .= $_data;\n\t\t} while(true);\n\n\t\tif ($this->read_timeout > 0 && $this->_check_timeout($fp))\n\t\t{\n\t\t\t$this->status=-100;\n\t\t\treturn false;\n\t\t}\n\n\t\t// check if there is a redirect meta tag\n\n\t\tif(preg_match(\"'<meta[\\s]*http-equiv[^>]*?content[\\s]*=[\\s]*[\\\"\\']?\\d+;[\\s]*URL[\\s]*=[\\s]*([^\\\"\\']*?)[\\\"\\']?>'i\",$results,$match))\n\n\t\t{\n\t\t\t$this->_redirectaddr = $this->_expandlinks($match[1],$URI);\n\t\t}\n\n\t\t// have we hit our frame depth and is there frame src to fetch?\n\t\tif(($this->_framedepth < $this->maxframes) && preg_match_all(\"'<frame\\s+.*src[\\s]*=[\\'\\\"]?([^\\'\\\"\\>]+)'i\",$results,$match))\n\t\t{\n\t\t\t$this->results[] = $results;\n\t\t\tfor($x=0; $x<count($match[1]); $x++)\n\t\t\t\t$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS[\"scheme\"].\"://\".$this->host);\n\t\t}\n\t\t// have we already fetched framed content?\n\t\telseif(is_array($this->results))\n\t\t\t$this->results[] = $results;\n\t\t// no framed content\n\t\telse\n\t\t\t$this->results = $results;\n\n\t\treturn true;\n\t}\n\n/*======================================================================*\\\n\tFunction:\t_httpsrequest\n\tPurpose:\tgo get the https data from the server using curl\n\tInput:\t\t$url\t\tthe url to fetch\n\t\t\t\t$URI\t\tthe full URI\n\t\t\t\t$body\t\tbody contents to send if any (POST)\n\tOutput:\n\\*======================================================================*/\n\n\tfunction _httpsrequest($url,$URI,$http_method,$content_type=\"\",$body=\"\")\n\t{\n\t\tif($this->passcookies && $this->_redirectaddr)\n\t\t\t$this->setcookies();\n\n\t\t$headers = array();\n\n\t\t$URI_PARTS = parse_url($URI);\n\t\tif(empty($url))\n\t\t\t$url = \"/\";\n\t\t// GET ... header not needed for curl\n\t\t//$headers[] = $http_method.\" \".$url.\" \".$this->_httpversion;\n\t\tif(!empty($this->agent))\n\t\t\t$headers[] = \"User-Agent: \".$this->agent;\n\t\tif(!empty($this->host))\n\t\t\tif(!empty($this->port))\n\t\t\t\t$headers[] = \"Host: \".$this->host.\":\".$this->port;\n\t\t\telse\n\t\t\t\t$headers[] = \"Host: \".$this->host;\n\t\tif(!empty($this->accept))\n\t\t\t$headers[] = \"Accept: \".$this->accept;\n\t\tif(!empty($this->referer))\n\t\t\t$headers[] = \"Referer: \".$this->referer;\n\t\tif(!empty($this->cookies))\n\t\t{\n\t\t\tif(!is_array($this->cookies))\n\t\t\t\t$this->cookies = (array)$this->cookies;\n\n\t\t\treset($this->cookies);\n\t\t\tif ( count($this->cookies) > 0 ) {\n\t\t\t\t$cookie_str = 'Cookie: ';\n\t\t\t\tforeach ( $this->cookies as $cookieKey => $cookieVal ) {\n\t\t\t\t$cookie_str .= $cookieKey.\"=\".urlencode($cookieVal).\"; \";\n\t\t\t\t}\n\t\t\t\t$headers[] = substr($cookie_str,0,-2);\n\t\t\t}\n\t\t}\n\t\tif(!empty($this->rawheaders))\n\t\t{\n\t\t\tif(!is_array($this->rawheaders))\n\t\t\t\t$this->rawheaders = (array)$this->rawheaders;\n\t\t\twhile(list($headerKey,$headerVal) = each($this->rawheaders))\n\t\t\t\t$headers[] = $headerKey.\": \".$headerVal;\n\t\t}\n\t\tif(!empty($content_type)) {\n\t\t\tif ($content_type == \"multipart/form-data\")\n\t\t\t\t$headers[] = \"Content-type: $content_type; boundary=\".$this->_mime_boundary;\n\t\t\telse\n\t\t\t\t$headers[] = \"Content-type: $content_type\";\n\t\t}\n\t\tif(!empty($body))\n\t\t\t$headers[] = \"Content-length: \".strlen($body);\n\t\tif(!empty($this->user) || !empty($this->pass))\n\t\t\t$headers[] = \"Authorization: BASIC \".base64_encode($this->user.\":\".$this->pass);\n\n\t\tfor($curr_header = 0; $curr_header < count($headers); $curr_header++) {\n\t\t\t$safer_header = strtr( $headers[$curr_header], \"\\\"\", \" \" );\n\t\t\t$cmdline_params .= \" -H \\\"\".$safer_header.\"\\\"\";\n\t\t}\n\n\t\tif(!empty($body))\n\t\t\t$cmdline_params .= \" -d \\\"$body\\\"\";\n\n\t\tif($this->read_timeout > 0)\n\t\t\t$cmdline_params .= \" -m \".$this->read_timeout;\n\n\t\t$headerfile = tempnam($this->temp_dir, \"sno\");\n\n\t\texec($this->curl_path.\" -k -D \\\"$headerfile\\\"\".$cmdline_params.\" \\\"\".escapeshellcmd($URI).\"\\\"\",$results,$return);\n\n\t\tif($return)\n\t\t{\n\t\t\t$this->error = \"Error: cURL could not retrieve the document, error $return.\";\n\t\t\treturn false;\n\t\t}\n\n\n\t\t$results = implode(\"\\r\\n\",$results);\n\n\t\t$result_headers = file(\"$headerfile\");\n\n\t\t$this->_redirectaddr = false;\n\t\tunset($this->headers);\n\n\t\tfor($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++)\n\t\t{\n\n\t\t\t// if a header begins with Location: or URI:, set the redirect\n\t\t\tif(preg_match(\"/^(Location: |URI: )/i\",$result_headers[$currentHeader]))\n\t\t\t{\n\t\t\t\t// get URL portion of the redirect\n\t\t\t\tpreg_match(\"/^(Location: |URI:)\\s+(.*)/\",chop($result_headers[$currentHeader]),$matches);\n\t\t\t\t// look for :// in the Location header to see if hostname is included\n\t\t\t\tif(!preg_match(\"|\\:\\/\\/|\",$matches[2]))\n\t\t\t\t{\n\t\t\t\t\t// no host in the path, so prepend\n\t\t\t\t\t$this->_redirectaddr = $URI_PARTS[\"scheme\"].\"://\".$this->host.\":\".$this->port;\n\t\t\t\t\t// eliminate double slash\n\t\t\t\t\tif(!preg_match(\"|^/|\",$matches[2]))\n\t\t\t\t\t\t\t$this->_redirectaddr .= \"/\".$matches[2];\n\t\t\t\t\telse\n\t\t\t\t\t\t\t$this->_redirectaddr .= $matches[2];\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\t$this->_redirectaddr = $matches[2];\n\t\t\t}\n\n\t\t\tif(preg_match(\"|^HTTP/|\",$result_headers[$currentHeader]))\n\t\t\t\t$this->response_code = $result_headers[$currentHeader];\n\n\t\t\t$this->headers[] = $result_headers[$currentHeader];\n\t\t}\n\n\t\t// check if there is a redirect meta tag\n\n\t\tif(preg_match(\"'<meta[\\s]*http-equiv[^>]*?content[\\s]*=[\\s]*[\\\"\\']?\\d+;[\\s]*URL[\\s]*=[\\s]*([^\\\"\\']*?)[\\\"\\']?>'i\",$results,$match))\n\t\t{\n\t\t\t$this->_redirectaddr = $this->_expandlinks($match[1],$URI);\n\t\t}\n\n\t\t// have we hit our frame depth and is there frame src to fetch?\n\t\tif(($this->_framedepth < $this->maxframes) && preg_match_all(\"'<frame\\s+.*src[\\s]*=[\\'\\\"]?([^\\'\\\"\\>]+)'i\",$results,$match))\n\t\t{\n\t\t\t$this->results[] = $results;\n\t\t\tfor($x=0; $x<count($match[1]); $x++)\n\t\t\t\t$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS[\"scheme\"].\"://\".$this->host);\n\t\t}\n\t\t// have we already fetched framed content?\n\t\telseif(is_array($this->results))\n\t\t\t$this->results[] = $results;\n\t\t// no framed content\n\t\telse\n\t\t\t$this->results = $results;\n\n\t\tunlink(\"$headerfile\");\n\n\t\treturn true;\n\t}\n\n/*======================================================================*\\\n\tFunction:\tsetcookies()\n\tPurpose:\tset cookies for a redirection\n\\*======================================================================*/\n\n\tfunction setcookies()\n\t{\n\t\tfor($x=0; $x<count($this->headers); $x++)\n\t\t{\n\t\tif(preg_match('/^set-cookie:[\\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match))\n\t\t\t$this->cookies[$match[1]] = urldecode($match[2]);\n\t\t}\n\t}\n\n\n/*======================================================================*\\\n\tFunction:\t_check_timeout\n\tPurpose:\tchecks whether timeout has occurred\n\tInput:\t\t$fp\tfile pointer\n\\*======================================================================*/\n\n\tfunction _check_timeout($fp)\n\t{\n\t\tif ($this->read_timeout > 0) {\n\t\t\t$fp_status = socket_get_status($fp);\n\t\t\tif ($fp_status[\"timed_out\"]) {\n\t\t\t\t$this->timed_out = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n/*======================================================================*\\\n\tFunction:\t_connect\n\tPurpose:\tmake a socket connection\n\tInput:\t\t$fp\tfile pointer\n\\*======================================================================*/\n\n\tfunction _connect(&$fp)\n\t{\n\t\tif(!empty($this->proxy_host) && !empty($this->proxy_port))\n\t\t\t{\n\t\t\t\t$this->_isproxy = true;\n\n\t\t\t\t$host = $this->proxy_host;\n\t\t\t\t$port = $this->proxy_port;\n\t\t\t}\n\t\telse\n\t\t{\n\t\t\t$host = $this->host;\n\t\t\t$port = $this->port;\n\t\t}\n\n\t\t$this->status = 0;\n\n\t\tif($fp = fsockopen(\n\t\t\t\t\t$host,\n\t\t\t\t\t$port,\n\t\t\t\t\t$errno,\n\t\t\t\t\t$errstr,\n\t\t\t\t\t$this->_fp_timeout\n\t\t\t\t\t))\n\t\t{\n\t\t\t// socket connection succeeded\n\n\t\t\treturn true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// socket connection failed\n\t\t\t$this->status = $errno;\n\t\t\tswitch($errno)\n\t\t\t{\n\t\t\t\tcase -3:\n\t\t\t\t\t$this->error=\"socket creation failed (-3)\";\n\t\t\t\tcase -4:\n\t\t\t\t\t$this->error=\"dns lookup failure (-4)\";\n\t\t\t\tcase -5:\n\t\t\t\t\t$this->error=\"connection refused or timed out (-5)\";\n\t\t\t\tdefault:\n\t\t\t\t\t$this->error=\"connection failed (\".$errno.\")\";\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n/*======================================================================*\\\n\tFunction:\t_disconnect\n\tPurpose:\tdisconnect a socket connection\n\tInput:\t\t$fp\tfile pointer\n\\*======================================================================*/\n\n\tfunction _disconnect($fp)\n\t{\n\t\treturn(fclose($fp));\n\t}\n\n\n/*======================================================================*\\\n\tFunction:\t_prepare_post_body\n\tPurpose:\tPrepare post body according to encoding type\n\tInput:\t\t$formvars  - form variables\n\t\t\t\t$formfiles - form upload files\n\tOutput:\t\tpost body\n\\*======================================================================*/\n\n\tfunction _prepare_post_body($formvars, $formfiles)\n\t{\n\t\tsettype($formvars, \"array\");\n\t\tsettype($formfiles, \"array\");\n\t\t$postdata = '';\n\n\t\tif (count($formvars) == 0 && count($formfiles) == 0)\n\t\t\treturn;\n\n\t\tswitch ($this->_submit_type) {\n\t\t\tcase \"application/x-www-form-urlencoded\":\n\t\t\t\treset($formvars);\n\t\t\t\twhile(list($key,$val) = each($formvars)) {\n\t\t\t\t\tif (is_array($val) || is_object($val)) {\n\t\t\t\t\t\twhile (list($cur_key, $cur_val) = each($val)) {\n\t\t\t\t\t\t\t$postdata .= urlencode($key).\"[]=\".urlencode($cur_val).\"&\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else\n\t\t\t\t\t\t$postdata .= urlencode($key).\"=\".urlencode($val).\"&\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"multipart/form-data\":\n\t\t\t\t$this->_mime_boundary = \"Snoopy\".md5(uniqid(microtime()));\n\n\t\t\t\treset($formvars);\n\t\t\t\twhile(list($key,$val) = each($formvars)) {\n\t\t\t\t\tif (is_array($val) || is_object($val)) {\n\t\t\t\t\t\twhile (list($cur_key, $cur_val) = each($val)) {\n\t\t\t\t\t\t\t$postdata .= \"--\".$this->_mime_boundary.\"\\r\\n\";\n\t\t\t\t\t\t\t$postdata .= \"Content-Disposition: form-data; name=\\\"$key\\[\\]\\\"\\r\\n\\r\\n\";\n\t\t\t\t\t\t\t$postdata .= \"$cur_val\\r\\n\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$postdata .= \"--\".$this->_mime_boundary.\"\\r\\n\";\n\t\t\t\t\t\t$postdata .= \"Content-Disposition: form-data; name=\\\"$key\\\"\\r\\n\\r\\n\";\n\t\t\t\t\t\t$postdata .= \"$val\\r\\n\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treset($formfiles);\n\t\t\t\twhile (list($field_name, $file_names) = each($formfiles)) {\n\t\t\t\t\tsettype($file_names, \"array\");\n\t\t\t\t\twhile (list(, $file_name) = each($file_names)) {\n\t\t\t\t\t\tif (!is_readable($file_name)) continue;\n\n\t\t\t\t\t\t$fp = fopen($file_name, \"r\");\n\t\t\t\t\t\t$file_content = fread($fp, filesize($file_name));\n\t\t\t\t\t\tfclose($fp);\n\t\t\t\t\t\t$base_name = basename($file_name);\n\n\t\t\t\t\t\t$postdata .= \"--\".$this->_mime_boundary.\"\\r\\n\";\n\t\t\t\t\t\t$postdata .= \"Content-Disposition: form-data; name=\\\"$field_name\\\"; filename=\\\"$base_name\\\"\\r\\n\\r\\n\";\n\t\t\t\t\t\t$postdata .= \"$file_content\\r\\n\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$postdata .= \"--\".$this->_mime_boundary.\"--\\r\\n\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn $postdata;\n\t}\n}\nendif;\n?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-walker-category-dropdown.php",
    "content": "<?php\n/**\n * Taxonomy API: Walker_CategoryDropdown class\n *\n * @package WordPress\n * @subpackage Template\n * @since 4.4.0\n */\n\n/**\n * Core class used to create an HTML dropdown list of Categories.\n *\n * @since 2.1.0\n *\n * @see Walker\n */\nclass Walker_CategoryDropdown extends Walker {\n\t/**\n\t * @see Walker::$tree_type\n\t * @since 2.1.0\n\t * @var string\n\t */\n\tpublic $tree_type = 'category';\n\n\t/**\n\t * @see Walker::$db_fields\n\t * @since 2.1.0\n\t * @todo Decouple this\n\t * @var array\n\t */\n\tpublic $db_fields = array ('parent' => 'parent', 'id' => 'term_id');\n\n\t/**\n\t * Start the element output.\n\t *\n\t * @see Walker::start_el()\n\t * @since 2.1.0\n\t *\n\t * @param string $output   Passed by reference. Used to append additional content.\n\t * @param object $category Category data object.\n\t * @param int    $depth    Depth of category. Used for padding.\n\t * @param array  $args     Uses 'selected', 'show_count', and 'value_field' keys, if they exist.\n\t *                         See {@see wp_dropdown_categories()}.\n\t */\n\tpublic function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {\n\t\t$pad = str_repeat('&nbsp;', $depth * 3);\n\n\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t$cat_name = apply_filters( 'list_cats', $category->name, $category );\n\n\t\tif ( isset( $args['value_field'] ) && isset( $category->{$args['value_field']} ) ) {\n\t\t\t$value_field = $args['value_field'];\n\t\t} else {\n\t\t\t$value_field = 'term_id';\n\t\t}\n\n\t\t$output .= \"\\t<option class=\\\"level-$depth\\\" value=\\\"\" . esc_attr( $category->{$value_field} ) . \"\\\"\";\n\n\t\t// Type-juggling causes false matches, so we force everything to a string.\n\t\tif ( (string) $category->{$value_field} === (string) $args['selected'] )\n\t\t\t$output .= ' selected=\"selected\"';\n\t\t$output .= '>';\n\t\t$output .= $pad.$cat_name;\n\t\tif ( $args['show_count'] )\n\t\t\t$output .= '&nbsp;&nbsp;('. number_format_i18n( $category->count ) .')';\n\t\t$output .= \"</option>\\n\";\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-walker-category.php",
    "content": "<?php\n/**\n * Taxonomy API: Walker_Category class\n *\n * @package WordPress\n * @subpackage Template\n * @since 4.4.0\n */\n\n/**\n * Core class used to create an HTML list of categories.\n *\n * @since 2.1.0\n *\n * @see Walker\n */\nclass Walker_Category extends Walker {\n\t/**\n\t * What the class handles.\n\t *\n\t * @see Walker::$tree_type\n\t * @since 2.1.0\n\t * @var string\n\t */\n\tpublic $tree_type = 'category';\n\n\t/**\n\t * Database fields to use.\n\t *\n\t * @see Walker::$db_fields\n\t * @since 2.1.0\n\t * @todo Decouple this\n\t * @var array\n\t */\n\tpublic $db_fields = array ('parent' => 'parent', 'id' => 'term_id');\n\n\t/**\n\t * Starts the list before the elements are added.\n\t *\n\t * @see Walker::start_lvl()\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of category. Used for tab indentation.\n\t * @param array  $args   An array of arguments. Will only append content if style argument value is 'list'.\n\t *                       @see wp_list_categories()\n\t */\n\tpublic function start_lvl( &$output, $depth = 0, $args = array() ) {\n\t\tif ( 'list' != $args['style'] )\n\t\t\treturn;\n\n\t\t$indent = str_repeat(\"\\t\", $depth);\n\t\t$output .= \"$indent<ul class='children'>\\n\";\n\t}\n\n\t/**\n\t * Ends the list of after the elements are added.\n\t *\n\t * @see Walker::end_lvl()\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of category. Used for tab indentation.\n\t * @param array  $args   An array of arguments. Will only append content if style argument value is 'list'.\n\t *                       @wsee wp_list_categories()\n\t */\n\tpublic function end_lvl( &$output, $depth = 0, $args = array() ) {\n\t\tif ( 'list' != $args['style'] )\n\t\t\treturn;\n\n\t\t$indent = str_repeat(\"\\t\", $depth);\n\t\t$output .= \"$indent</ul>\\n\";\n\t}\n\n\t/**\n\t * Start the element output.\n\t *\n\t * @see Walker::start_el()\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $output   Passed by reference. Used to append additional content.\n\t * @param object $category Category data object.\n\t * @param int    $depth    Depth of category in reference to parents. Default 0.\n\t * @param array  $args     An array of arguments. @see wp_list_categories()\n\t * @param int    $id       ID of the current category.\n\t */\n\tpublic function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {\n\t\t/** This filter is documented in wp-includes/category-template.php */\n\t\t$cat_name = apply_filters(\n\t\t\t'list_cats',\n\t\t\tesc_attr( $category->name ),\n\t\t\t$category\n\t\t);\n\n\t\t// Don't generate an element if the category name is empty.\n\t\tif ( ! $cat_name ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$link = '<a href=\"' . esc_url( get_term_link( $category ) ) . '\" ';\n\t\tif ( $args['use_desc_for_title'] && ! empty( $category->description ) ) {\n\t\t\t/**\n\t\t\t * Filter the category description for display.\n\t\t\t *\n\t\t\t * @since 1.2.0\n\t\t\t *\n\t\t\t * @param string $description Category description.\n\t\t\t * @param object $category    Category object.\n\t\t\t */\n\t\t\t$link .= 'title=\"' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '\"';\n\t\t}\n\n\t\t$link .= '>';\n\t\t$link .= $cat_name . '</a>';\n\n\t\tif ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) {\n\t\t\t$link .= ' ';\n\n\t\t\tif ( empty( $args['feed_image'] ) ) {\n\t\t\t\t$link .= '(';\n\t\t\t}\n\n\t\t\t$link .= '<a href=\"' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $args['feed_type'] ) ) . '\"';\n\n\t\t\tif ( empty( $args['feed'] ) ) {\n\t\t\t\t$alt = ' alt=\"' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '\"';\n\t\t\t} else {\n\t\t\t\t$alt = ' alt=\"' . $args['feed'] . '\"';\n\t\t\t\t$name = $args['feed'];\n\t\t\t\t$link .= empty( $args['title'] ) ? '' : $args['title'];\n\t\t\t}\n\n\t\t\t$link .= '>';\n\n\t\t\tif ( empty( $args['feed_image'] ) ) {\n\t\t\t\t$link .= $name;\n\t\t\t} else {\n\t\t\t\t$link .= \"<img src='\" . $args['feed_image'] . \"'$alt\" . ' />';\n\t\t\t}\n\t\t\t$link .= '</a>';\n\n\t\t\tif ( empty( $args['feed_image'] ) ) {\n\t\t\t\t$link .= ')';\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $args['show_count'] ) ) {\n\t\t\t$link .= ' (' . number_format_i18n( $category->count ) . ')';\n\t\t}\n\t\tif ( 'list' == $args['style'] ) {\n\t\t\t$output .= \"\\t<li\";\n\t\t\t$css_classes = array(\n\t\t\t\t'cat-item',\n\t\t\t\t'cat-item-' . $category->term_id,\n\t\t\t);\n\n\t\t\tif ( ! empty( $args['current_category'] ) ) {\n\t\t\t\t// 'current_category' can be an array, so we use `get_terms()`.\n\t\t\t\t$_current_terms = get_terms( $category->taxonomy, array(\n\t\t\t\t\t'include' => $args['current_category'],\n\t\t\t\t\t'hide_empty' => false,\n\t\t\t\t) );\n\n\t\t\t\tforeach ( $_current_terms as $_current_term ) {\n\t\t\t\t\tif ( $category->term_id == $_current_term->term_id ) {\n\t\t\t\t\t\t$css_classes[] = 'current-cat';\n\t\t\t\t\t} elseif ( $category->term_id == $_current_term->parent ) {\n\t\t\t\t\t\t$css_classes[] = 'current-cat-parent';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter the list of CSS classes to include with each category in the list.\n\t\t\t *\n\t\t\t * @since 4.2.0\n\t\t\t *\n\t\t\t * @see wp_list_categories()\n\t\t\t *\n\t\t\t * @param array  $css_classes An array of CSS classes to be applied to each list item.\n\t\t\t * @param object $category    Category data object.\n\t\t\t * @param int    $depth       Depth of page, used for padding.\n\t\t\t * @param array  $args        An array of wp_list_categories() arguments.\n\t\t\t */\n\t\t\t$css_classes = implode( ' ', apply_filters( 'category_css_class', $css_classes, $category, $depth, $args ) );\n\n\t\t\t$output .=  ' class=\"' . $css_classes . '\"';\n\t\t\t$output .= \">$link\\n\";\n\t\t} elseif ( isset( $args['separator'] ) ) {\n\t\t\t$output .= \"\\t$link\" . $args['separator'] . \"\\n\";\n\t\t} else {\n\t\t\t$output .= \"\\t$link<br />\\n\";\n\t\t}\n\t}\n\n\t/**\n\t * Ends the element output, if needed.\n\t *\n\t * @see Walker::end_el()\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param object $page   Not used.\n\t * @param int    $depth  Depth of category. Not used.\n\t * @param array  $args   An array of arguments. Only uses 'list' for whether should append to output. @see wp_list_categories()\n\t */\n\tpublic function end_el( &$output, $page, $depth = 0, $args = array() ) {\n\t\tif ( 'list' != $args['style'] )\n\t\t\treturn;\n\n\t\t$output .= \"</li>\\n\";\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-walker-comment.php",
    "content": "<?php\n/**\n * Comment API: Walker_Comment class\n *\n * @package WordPress\n * @subpackage Comments\n * @since 4.4.0\n */\n\n/**\n * HTML comment list class.\n *\n * @uses Walker\n * @since 2.7.0\n */\nclass Walker_Comment extends Walker {\n\t/**\n\t * What the class handles.\n\t *\n\t * @see Walker::$tree_type\n\t *\n\t * @since 2.7.0\n\t * @var string\n\t */\n\tpublic $tree_type = 'comment';\n\n\t/**\n\t * DB fields to use.\n\t *\n\t * @see Walker::$db_fields\n\t *\n\t * @since 2.7.0\n\t * @var array\n\t */\n\tpublic $db_fields = array ('parent' => 'comment_parent', 'id' => 'comment_ID');\n\n\t/**\n\t * Start the list before the elements are added.\n\t *\n\t * @see Walker::start_lvl()\n\t *\n\t * @since 2.7.0\n\t *\n\t * @global int $comment_depth\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int $depth Depth of comment.\n\t * @param array $args Uses 'style' argument for type of HTML list.\n\t */\n\tpublic function start_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$GLOBALS['comment_depth'] = $depth + 1;\n\n\t\tswitch ( $args['style'] ) {\n\t\t\tcase 'div':\n\t\t\t\tbreak;\n\t\t\tcase 'ol':\n\t\t\t\t$output .= '<ol class=\"children\">' . \"\\n\";\n\t\t\t\tbreak;\n\t\t\tcase 'ul':\n\t\t\tdefault:\n\t\t\t\t$output .= '<ul class=\"children\">' . \"\\n\";\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * End the list of items after the elements are added.\n\t *\n\t * @see Walker::end_lvl()\n\t *\n\t * @since 2.7.0\n\t *\n\t * @global int $comment_depth\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of comment.\n\t * @param array  $args   Will only append content if style argument value is 'ol' or 'ul'.\n\t */\n\tpublic function end_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$GLOBALS['comment_depth'] = $depth + 1;\n\n\t\tswitch ( $args['style'] ) {\n\t\t\tcase 'div':\n\t\t\t\tbreak;\n\t\t\tcase 'ol':\n\t\t\t\t$output .= \"</ol><!-- .children -->\\n\";\n\t\t\t\tbreak;\n\t\t\tcase 'ul':\n\t\t\tdefault:\n\t\t\t\t$output .= \"</ul><!-- .children -->\\n\";\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Traverse elements to create list from elements.\n\t *\n\t * This function is designed to enhance Walker::display_element() to\n\t * display children of higher nesting levels than selected inline on\n\t * the highest depth level displayed. This prevents them being orphaned\n\t * at the end of the comment list.\n\t *\n\t * Example: max_depth = 2, with 5 levels of nested content.\n\t *     1\n\t *      1.1\n\t *        1.1.1\n\t *        1.1.1.1\n\t *        1.1.1.1.1\n\t *        1.1.2\n\t *        1.1.2.1\n\t *     2\n\t *      2.2\n\t *\n\t * @see Walker::display_element()\n\t * @see wp_list_comments()\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param object $element           Data object.\n\t * @param array  $children_elements List of elements to continue traversing.\n\t * @param int    $max_depth         Max depth to traverse.\n\t * @param int    $depth             Depth of current element.\n\t * @param array  $args              An array of arguments.\n\t * @param string $output            Passed by reference. Used to append additional content.\n\t */\n\tpublic function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {\n\t\tif ( !$element )\n\t\t\treturn;\n\n\t\t$id_field = $this->db_fields['id'];\n\t\t$id = $element->$id_field;\n\n\t\tparent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );\n\n\t\t/*\n\t\t * If we're at the max depth, and the current element still has children,\n\t\t * loop over those and display them at this level. This is to prevent them\n\t\t * being orphaned to the end of the list.\n\t\t */\n\t\tif ( $max_depth <= $depth + 1 && isset( $children_elements[$id]) ) {\n\t\t\tforeach ( $children_elements[ $id ] as $child )\n\t\t\t\t$this->display_element( $child, $children_elements, $max_depth, $depth, $args, $output );\n\n\t\t\tunset( $children_elements[ $id ] );\n\t\t}\n\n\t}\n\n\t/**\n\t * Start the element output.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @see Walker::start_el()\n\t * @see wp_list_comments()\n\t *\n\t * @global int        $comment_depth\n\t * @global WP_Comment $comment\n\t *\n\t * @param string $output  Passed by reference. Used to append additional content.\n\t * @param object $comment Comment data object.\n\t * @param int    $depth   Depth of comment in reference to parents.\n\t * @param array  $args    An array of arguments.\n\t */\n\tpublic function start_el( &$output, $comment, $depth = 0, $args = array(), $id = 0 ) {\n\t\t$depth++;\n\t\t$GLOBALS['comment_depth'] = $depth;\n\t\t$GLOBALS['comment'] = $comment;\n\n\t\tif ( !empty( $args['callback'] ) ) {\n\t\t\tob_start();\n\t\t\tcall_user_func( $args['callback'], $comment, $args, $depth );\n\t\t\t$output .= ob_get_clean();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ( 'pingback' == $comment->comment_type || 'trackback' == $comment->comment_type ) && $args['short_ping'] ) {\n\t\t\tob_start();\n\t\t\t$this->ping( $comment, $depth, $args );\n\t\t\t$output .= ob_get_clean();\n\t\t} elseif ( 'html5' === $args['format'] ) {\n\t\t\tob_start();\n\t\t\t$this->html5_comment( $comment, $depth, $args );\n\t\t\t$output .= ob_get_clean();\n\t\t} else {\n\t\t\tob_start();\n\t\t\t$this->comment( $comment, $depth, $args );\n\t\t\t$output .= ob_get_clean();\n\t\t}\n\t}\n\n\t/**\n\t * Ends the element output, if needed.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @see Walker::end_el()\n\t * @see wp_list_comments()\n\t *\n\t * @param string     $output  Passed by reference. Used to append additional content.\n\t * @param WP_Comment $comment The comment object. Default current comment.\n\t * @param int        $depth   Depth of comment.\n\t * @param array      $args    An array of arguments.\n\t */\n\tpublic function end_el( &$output, $comment, $depth = 0, $args = array() ) {\n\t\tif ( !empty( $args['end-callback'] ) ) {\n\t\t\tob_start();\n\t\t\tcall_user_func( $args['end-callback'], $comment, $args, $depth );\n\t\t\t$output .= ob_get_clean();\n\t\t\treturn;\n\t\t}\n\t\tif ( 'div' == $args['style'] )\n\t\t\t$output .= \"</div><!-- #comment-## -->\\n\";\n\t\telse\n\t\t\t$output .= \"</li><!-- #comment-## -->\\n\";\n\t}\n\n\t/**\n\t * Output a pingback comment.\n\t *\n\t * @access protected\n\t * @since 3.6.0\n\t *\n\t * @see wp_list_comments()\n\t *\n\t * @param WP_Comment $comment The comment object.\n\t * @param int        $depth   Depth of comment.\n\t * @param array      $args    An array of arguments.\n\t */\n\tprotected function ping( $comment, $depth, $args ) {\n\t\t$tag = ( 'div' == $args['style'] ) ? 'div' : 'li';\n?>\n\t\t<<?php echo $tag; ?> id=\"comment-<?php comment_ID(); ?>\" <?php comment_class( '', $comment ); ?>>\n\t\t\t<div class=\"comment-body\">\n\t\t\t\t<?php _e( 'Pingback:' ); ?> <?php comment_author_link( $comment ); ?> <?php edit_comment_link( __( 'Edit' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t\t</div>\n<?php\n\t}\n\n\t/**\n\t * Output a single comment.\n\t *\n\t * @access protected\n\t * @since 3.6.0\n\t *\n\t * @see wp_list_comments()\n\t *\n\t * @param object $comment Comment to display.\n\t * @param int    $depth   Depth of comment.\n\t * @param array  $args    An array of arguments.\n\t */\n\tprotected function comment( $comment, $depth, $args ) {\n\t\tif ( 'div' == $args['style'] ) {\n\t\t\t$tag = 'div';\n\t\t\t$add_below = 'comment';\n\t\t} else {\n\t\t\t$tag = 'li';\n\t\t\t$add_below = 'div-comment';\n\t\t}\n?>\n\t\t<<?php echo $tag; ?> <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?> id=\"comment-<?php comment_ID(); ?>\">\n\t\t<?php if ( 'div' != $args['style'] ) : ?>\n\t\t<div id=\"div-comment-<?php comment_ID(); ?>\" class=\"comment-body\">\n\t\t<?php endif; ?>\n\t\t<div class=\"comment-author vcard\">\n\t\t\t<?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'] ); ?>\n\t\t\t<?php printf( __( '<cite class=\"fn\">%s</cite> <span class=\"says\">says:</span>' ), get_comment_author_link( $comment ) ); ?>\n\t\t</div>\n\t\t<?php if ( '0' == $comment->comment_approved ) : ?>\n\t\t<em class=\"comment-awaiting-moderation\"><?php _e( 'Your comment is awaiting moderation.' ) ?></em>\n\t\t<br />\n\t\t<?php endif; ?>\n\n\t\t<div class=\"comment-meta commentmetadata\"><a href=\"<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>\">\n\t\t\t<?php\n\t\t\t\t/* translators: 1: comment date, 2: comment time */\n\t\t\t\tprintf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ),  get_comment_time() ); ?></a><?php edit_comment_link( __( '(Edit)' ), '&nbsp;&nbsp;', '' );\n\t\t\t?>\n\t\t</div>\n\n\t\t<?php comment_text( get_comment_id(), array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>\n\n\t\t<?php\n\t\tcomment_reply_link( array_merge( $args, array(\n\t\t\t'add_below' => $add_below,\n\t\t\t'depth'     => $depth,\n\t\t\t'max_depth' => $args['max_depth'],\n\t\t\t'before'    => '<div class=\"reply\">',\n\t\t\t'after'     => '</div>'\n\t\t) ) );\n\t\t?>\n\n\t\t<?php if ( 'div' != $args['style'] ) : ?>\n\t\t</div>\n\t\t<?php endif; ?>\n<?php\n\t}\n\n\t/**\n\t * Output a comment in the HTML5 format.\n\t *\n\t * @access protected\n\t * @since 3.6.0\n\t *\n\t * @see wp_list_comments()\n\t *\n\t * @param object $comment Comment to display.\n\t * @param int    $depth   Depth of comment.\n\t * @param array  $args    An array of arguments.\n\t */\n\tprotected function html5_comment( $comment, $depth, $args ) {\n\t\t$tag = ( 'div' === $args['style'] ) ? 'div' : 'li';\n?>\n\t\t<<?php echo $tag; ?> id=\"comment-<?php comment_ID(); ?>\" <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?>>\n\t\t\t<article id=\"div-comment-<?php comment_ID(); ?>\" class=\"comment-body\">\n\t\t\t\t<footer class=\"comment-meta\">\n\t\t\t\t\t<div class=\"comment-author vcard\">\n\t\t\t\t\t\t<?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'] ); ?>\n\t\t\t\t\t\t<?php printf( __( '%s <span class=\"says\">says:</span>' ), sprintf( '<b class=\"fn\">%s</b>', get_comment_author_link( $comment ) ) ); ?>\n\t\t\t\t\t</div><!-- .comment-author -->\n\n\t\t\t\t\t<div class=\"comment-metadata\">\n\t\t\t\t\t\t<a href=\"<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>\">\n\t\t\t\t\t\t\t<time datetime=\"<?php comment_time( 'c' ); ?>\">\n\t\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\t\t/* translators: 1: comment date, 2: comment time */\n\t\t\t\t\t\t\t\t\tprintf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() );\n\t\t\t\t\t\t\t\t?>\n\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<?php edit_comment_link( __( 'Edit' ), '<span class=\"edit-link\">', '</span>' ); ?>\n\t\t\t\t\t</div><!-- .comment-metadata -->\n\n\t\t\t\t\t<?php if ( '0' == $comment->comment_approved ) : ?>\n\t\t\t\t\t<p class=\"comment-awaiting-moderation\"><?php _e( 'Your comment is awaiting moderation.' ); ?></p>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t</footer><!-- .comment-meta -->\n\n\t\t\t\t<div class=\"comment-content\">\n\t\t\t\t\t<?php comment_text(); ?>\n\t\t\t\t</div><!-- .comment-content -->\n\n\t\t\t\t<?php\n\t\t\t\tcomment_reply_link( array_merge( $args, array(\n\t\t\t\t\t'add_below' => 'div-comment',\n\t\t\t\t\t'depth'     => $depth,\n\t\t\t\t\t'max_depth' => $args['max_depth'],\n\t\t\t\t\t'before'    => '<div class=\"reply\">',\n\t\t\t\t\t'after'     => '</div>'\n\t\t\t\t) ) );\n\t\t\t\t?>\n\t\t\t</article><!-- .comment-body -->\n<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-walker-page-dropdown.php",
    "content": "<?php\n/**\n * Post API: Walker_PageDropdown class\n *\n * @package WordPress\n * @subpackage Post\n * @since 4.4.0\n */\n\n/**\n * Core class used to create an HTML drop-down list of pages.\n *\n * @since 2.1.0\n *\n * @see Walker\n */\nclass Walker_PageDropdown extends Walker {\n\t/**\n\t * @see Walker::$tree_type\n\t * @since 2.1.0\n\t * @var string\n\t */\n\tpublic $tree_type = 'page';\n\n\t/**\n\t * @see Walker::$db_fields\n\t * @since 2.1.0\n\t * @todo Decouple this\n\t * @var array\n\t */\n\tpublic $db_fields = array ('parent' => 'post_parent', 'id' => 'ID');\n\n\t/**\n\t * @see Walker::start_el()\n\t * @since 2.1.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param object $page   Page data object.\n\t * @param int    $depth  Depth of page in reference to parent pages. Used for padding.\n\t * @param array  $args   Uses 'selected' argument for selected page to set selected HTML attribute for option\n\t *                       element. Uses 'value_field' argument to fill \"value\" attribute. See {@see wp_dropdown_pages()}.\n\t * @param int    $id\n\t */\n\tpublic function start_el( &$output, $page, $depth = 0, $args = array(), $id = 0 ) {\n\t\t$pad = str_repeat('&nbsp;', $depth * 3);\n\n\t\tif ( ! isset( $args['value_field'] ) || ! isset( $page->{$args['value_field']} ) ) {\n\t\t\t$args['value_field'] = 'ID';\n\t\t}\n\n\t\t$output .= \"\\t<option class=\\\"level-$depth\\\" value=\\\"\" . esc_attr( $page->{$args['value_field']} ) . \"\\\"\";\n\t\tif ( $page->ID == $args['selected'] )\n\t\t\t$output .= ' selected=\"selected\"';\n\t\t$output .= '>';\n\n\t\t$title = $page->post_title;\n\t\tif ( '' === $title ) {\n\t\t\t/* translators: %d: ID of a post */\n\t\t\t$title = sprintf( __( '#%d (no title)' ), $page->ID );\n\t\t}\n\n\t\t/**\n\t\t * Filter the page title when creating an HTML drop-down list of pages.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param string $title Page title.\n\t\t * @param object $page  Page data object.\n\t\t */\n\t\t$title = apply_filters( 'list_pages', $title, $page );\n\t\t$output .= $pad . esc_html( $title );\n\t\t$output .= \"</option>\\n\";\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-walker-page.php",
    "content": "<?php\n/**\n * Post API: Walker_Page class\n *\n * @package WordPress\n * @subpackage Template\n * @since 4.4.0\n */\n\n/**\n * Core walker class used to create an HTML list of pages.\n *\n * @since 2.1.0\n *\n * @see Walker\n */\nclass Walker_Page extends Walker {\n\t/**\n\t * @see Walker::$tree_type\n\t * @since 2.1.0\n\t * @var string\n\t */\n\tpublic $tree_type = 'page';\n\n\t/**\n\t * @see Walker::$db_fields\n\t * @since 2.1.0\n\t * @todo Decouple this.\n\t * @var array\n\t */\n\tpublic $db_fields = array ('parent' => 'post_parent', 'id' => 'ID');\n\n\t/**\n\t * @see Walker::start_lvl()\n\t * @since 2.1.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of page. Used for padding.\n\t * @param array  $args\n\t */\n\tpublic function start_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$indent = str_repeat(\"\\t\", $depth);\n\t\t$output .= \"\\n$indent<ul class='children'>\\n\";\n\t}\n\n\t/**\n\t * @see Walker::end_lvl()\n\t * @since 2.1.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of page. Used for padding.\n\t * @param array  $args\n\t */\n\tpublic function end_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$indent = str_repeat(\"\\t\", $depth);\n\t\t$output .= \"$indent</ul>\\n\";\n\t}\n\n\t/**\n\t * @see Walker::start_el()\n\t * @since 2.1.0\n\t *\n\t * @param string $output       Passed by reference. Used to append additional content.\n\t * @param object $page         Page data object.\n\t * @param int    $depth        Depth of page. Used for padding.\n\t * @param int    $current_page Page ID.\n\t * @param array  $args\n\t */\n\tpublic function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) {\n\t\tif ( $depth ) {\n\t\t\t$indent = str_repeat( \"\\t\", $depth );\n\t\t} else {\n\t\t\t$indent = '';\n\t\t}\n\n\t\t$css_class = array( 'page_item', 'page-item-' . $page->ID );\n\n\t\tif ( isset( $args['pages_with_children'][ $page->ID ] ) ) {\n\t\t\t$css_class[] = 'page_item_has_children';\n\t\t}\n\n\t\tif ( ! empty( $current_page ) ) {\n\t\t\t$_current_page = get_post( $current_page );\n\t\t\tif ( $_current_page && in_array( $page->ID, $_current_page->ancestors ) ) {\n\t\t\t\t$css_class[] = 'current_page_ancestor';\n\t\t\t}\n\t\t\tif ( $page->ID == $current_page ) {\n\t\t\t\t$css_class[] = 'current_page_item';\n\t\t\t} elseif ( $_current_page && $page->ID == $_current_page->post_parent ) {\n\t\t\t\t$css_class[] = 'current_page_parent';\n\t\t\t}\n\t\t} elseif ( $page->ID == get_option('page_for_posts') ) {\n\t\t\t$css_class[] = 'current_page_parent';\n\t\t}\n\n\t\t/**\n\t\t * Filter the list of CSS classes to include with each page item in the list.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @see wp_list_pages()\n\t\t *\n\t\t * @param array   $css_class    An array of CSS classes to be applied\n\t\t *                             to each list item.\n\t\t * @param WP_Post $page         Page data object.\n\t\t * @param int     $depth        Depth of page, used for padding.\n\t\t * @param array   $args         An array of arguments.\n\t\t * @param int     $current_page ID of the current page.\n\t\t */\n\t\t$css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) );\n\n\t\tif ( '' === $page->post_title ) {\n\t\t\t/* translators: %d: ID of a post */\n\t\t\t$page->post_title = sprintf( __( '#%d (no title)' ), $page->ID );\n\t\t}\n\n\t\t$args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before'];\n\t\t$args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after'];\n\n\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t$output .= $indent . sprintf(\n\t\t\t'<li class=\"%s\"><a href=\"%s\">%s%s%s</a>',\n\t\t\t$css_classes,\n\t\t\tget_permalink( $page->ID ),\n\t\t\t$args['link_before'],\n\t\t\tapply_filters( 'the_title', $page->post_title, $page->ID ),\n\t\t\t$args['link_after']\n\t\t);\n\n\t\tif ( ! empty( $args['show_date'] ) ) {\n\t\t\tif ( 'modified' == $args['show_date'] ) {\n\t\t\t\t$time = $page->post_modified;\n\t\t\t} else {\n\t\t\t\t$time = $page->post_date;\n\t\t\t}\n\n\t\t\t$date_format = empty( $args['date_format'] ) ? '' : $args['date_format'];\n\t\t\t$output .= \" \" . mysql2date( $date_format, $time );\n\t\t}\n\t}\n\n\t/**\n\t * @see Walker::end_el()\n\t * @since 2.1.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param object $page Page data object. Not used.\n\t * @param int    $depth Depth of page. Not Used.\n\t * @param array  $args\n\t */\n\tpublic function end_el( &$output, $page, $depth = 0, $args = array() ) {\n\t\t$output .= \"</li>\\n\";\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-admin-bar.php",
    "content": "<?php\n/**\n * Toolbar API: WP_Admin_Bar class\n *\n * @package WordPress\n * @subpackage Toolbar\n * @since 3.1.0\n */\n\n/**\n * Core class used to implement the Toolbar API.\n *\n * @since 3.1.0\n */\nclass WP_Admin_Bar {\n\tprivate $nodes = array();\n\tprivate $bound = false;\n\tpublic $user;\n\n\t/**\n\t * @param string $name\n\t * @return string|array|void\n\t */\n\tpublic function __get( $name ) {\n\t\tswitch ( $name ) {\n\t\t\tcase 'proto' :\n\t\t\t\treturn is_ssl() ? 'https://' : 'http://';\n\n\t\t\tcase 'menu' :\n\t\t\t\t_deprecated_argument( 'WP_Admin_Bar', '3.3', 'Modify admin bar nodes with WP_Admin_Bar::get_node(), WP_Admin_Bar::add_node(), and WP_Admin_Bar::remove_node(), not the <code>menu</code> property.' );\n\t\t\t\treturn array(); // Sorry, folks.\n\t\t}\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function initialize() {\n\t\t$this->user = new stdClass;\n\n\t\tif ( is_user_logged_in() ) {\n\t\t\t/* Populate settings we need for the menu based on the current user. */\n\t\t\t$this->user->blogs = get_blogs_of_user( get_current_user_id() );\n\t\t\tif ( is_multisite() ) {\n\t\t\t\t$this->user->active_blog = get_active_blog_for_user( get_current_user_id() );\n\t\t\t\t$this->user->domain = empty( $this->user->active_blog ) ? user_admin_url() : trailingslashit( get_home_url( $this->user->active_blog->blog_id ) );\n\t\t\t\t$this->user->account_domain = $this->user->domain;\n\t\t\t} else {\n\t\t\t\t$this->user->active_blog = $this->user->blogs[get_current_blog_id()];\n\t\t\t\t$this->user->domain = trailingslashit( home_url() );\n\t\t\t\t$this->user->account_domain = $this->user->domain;\n\t\t\t}\n\t\t}\n\n\t\tadd_action( 'wp_head', 'wp_admin_bar_header' );\n\n\t\tadd_action( 'admin_head', 'wp_admin_bar_header' );\n\n\t\tif ( current_theme_supports( 'admin-bar' ) ) {\n\t\t\t/**\n\t\t\t * To remove the default padding styles from WordPress for the Toolbar, use the following code:\n\t\t\t * add_theme_support( 'admin-bar', array( 'callback' => '__return_false' ) );\n\t\t\t */\n\t\t\t$admin_bar_args = get_theme_support( 'admin-bar' );\n\t\t\t$header_callback = $admin_bar_args[0]['callback'];\n\t\t}\n\n\t\tif ( empty($header_callback) )\n\t\t\t$header_callback = '_admin_bar_bump_cb';\n\n\t\tadd_action('wp_head', $header_callback);\n\n\t\twp_enqueue_script( 'admin-bar' );\n\t\twp_enqueue_style( 'admin-bar' );\n\n\t\t/**\n\t\t * Fires after WP_Admin_Bar is initialized.\n\t\t *\n\t\t * @since 3.1.0\n\t\t */\n\t\tdo_action( 'admin_bar_init' );\n\t}\n\n\t/**\n\t * @param array $node\n\t */\n\tpublic function add_menu( $node ) {\n\t\t$this->add_node( $node );\n\t}\n\n\t/**\n\t * @param string $id\n\t */\n\tpublic function remove_menu( $id ) {\n\t\t$this->remove_node( $id );\n\t}\n\n\t/**\n\t * Add a node to the menu.\n\t *\n\t * @param array $args {\n\t *     Arguments for adding a node.\n\t *\n\t *     @type string $id     ID of the item.\n\t *     @type string $title  Title of the node.\n\t *     @type string $parent Optional. ID of the parent node.\n\t *     @type string $href   Optional. Link for the item.\n\t *     @type bool   $group  Optional. Whether or not the node is a group. Default false.\n\t *     @type array  $meta   Meta data including the following keys: 'html', 'class', 'rel',\n\t *                          'onclick', 'target', 'title', 'tabindex'. Default empty.\n\t * }\n\t */\n\tpublic function add_node( $args ) {\n\t\t// Shim for old method signature: add_node( $parent_id, $menu_obj, $args )\n\t\tif ( func_num_args() >= 3 && is_string( func_get_arg(0) ) )\n\t\t\t$args = array_merge( array( 'parent' => func_get_arg(0) ), func_get_arg(2) );\n\n\t\tif ( is_object( $args ) )\n\t\t\t$args = get_object_vars( $args );\n\n\t\t// Ensure we have a valid title.\n\t\tif ( empty( $args['id'] ) ) {\n\t\t\tif ( empty( $args['title'] ) )\n\t\t\t\treturn;\n\n\t\t\t_doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3' );\n\t\t\t// Deprecated: Generate an ID from the title.\n\t\t\t$args['id'] = esc_attr( sanitize_title( trim( $args['title'] ) ) );\n\t\t}\n\n\t\t$defaults = array(\n\t\t\t'id'     => false,\n\t\t\t'title'  => false,\n\t\t\t'parent' => false,\n\t\t\t'href'   => false,\n\t\t\t'group'  => false,\n\t\t\t'meta'   => array(),\n\t\t);\n\n\t\t// If the node already exists, keep any data that isn't provided.\n\t\tif ( $maybe_defaults = $this->get_node( $args['id'] ) )\n\t\t\t$defaults = get_object_vars( $maybe_defaults );\n\n\t\t// Do the same for 'meta' items.\n\t\tif ( ! empty( $defaults['meta'] ) && ! empty( $args['meta'] ) )\n\t\t\t$args['meta'] = wp_parse_args( $args['meta'], $defaults['meta'] );\n\n\t\t$args = wp_parse_args( $args, $defaults );\n\n\t\t$back_compat_parents = array(\n\t\t\t'my-account-with-avatar' => array( 'my-account', '3.3' ),\n\t\t\t'my-blogs'               => array( 'my-sites',   '3.3' ),\n\t\t);\n\n\t\tif ( isset( $back_compat_parents[ $args['parent'] ] ) ) {\n\t\t\tlist( $new_parent, $version ) = $back_compat_parents[ $args['parent'] ];\n\t\t\t_deprecated_argument( __METHOD__, $version, sprintf( 'Use <code>%s</code> as the parent for the <code>%s</code> admin bar node instead of <code>%s</code>.', $new_parent, $args['id'], $args['parent'] ) );\n\t\t\t$args['parent'] = $new_parent;\n\t\t}\n\n\t\t$this->_set_node( $args );\n\t}\n\n\t/**\n\t * @param array $args\n\t */\n\tfinal protected function _set_node( $args ) {\n\t\t$this->nodes[ $args['id'] ] = (object) $args;\n\t}\n\n\t/**\n\t * Gets a node.\n\t *\n\t * @param string $id\n\t * @return object Node.\n\t */\n\tfinal public function get_node( $id ) {\n\t\tif ( $node = $this->_get_node( $id ) )\n\t\t\treturn clone $node;\n\t}\n\n\t/**\n\t * @param string $id\n\t * @return object|void\n\t */\n\tfinal protected function _get_node( $id ) {\n\t\tif ( $this->bound )\n\t\t\treturn;\n\n\t\tif ( empty( $id ) )\n\t\t\t$id = 'root';\n\n\t\tif ( isset( $this->nodes[ $id ] ) )\n\t\t\treturn $this->nodes[ $id ];\n\t}\n\n\t/**\n\t * @return array|void\n\t */\n\tfinal public function get_nodes() {\n\t\tif ( ! $nodes = $this->_get_nodes() )\n\t\t\treturn;\n\n\t\tforeach ( $nodes as &$node ) {\n\t\t\t$node = clone $node;\n\t\t}\n\t\treturn $nodes;\n\t}\n\n\t/**\n\t * @return array|void\n\t */\n\tfinal protected function _get_nodes() {\n\t\tif ( $this->bound )\n\t\t\treturn;\n\n\t\treturn $this->nodes;\n\t}\n\n\t/**\n\t * Add a group to a menu node.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param array $args {\n\t *     Array of arguments for adding a group.\n\t *\n\t *     @type string $id     ID of the item.\n\t *     @type string $parent Optional. ID of the parent node. Default 'root'.\n\t *     @type array  $meta   Meta data for the group including the following keys:\n\t *                         'class', 'onclick', 'target', and 'title'.\n\t * }\n\t */\n\tfinal public function add_group( $args ) {\n\t\t$args['group'] = true;\n\n\t\t$this->add_node( $args );\n\t}\n\n\t/**\n\t * Remove a node.\n\t *\n\t * @param string $id The ID of the item.\n\t */\n\tpublic function remove_node( $id ) {\n\t\t$this->_unset_node( $id );\n\t}\n\n\t/**\n\t * @param string $id\n\t */\n\tfinal protected function _unset_node( $id ) {\n\t\tunset( $this->nodes[ $id ] );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function render() {\n\t\t$root = $this->_bind();\n\t\tif ( $root )\n\t\t\t$this->_render( $root );\n\t}\n\n\t/**\n\t * @return object|void\n\t */\n\tfinal protected function _bind() {\n\t\tif ( $this->bound )\n\t\t\treturn;\n\n\t\t// Add the root node.\n\t\t// Clear it first, just in case. Don't mess with The Root.\n\t\t$this->remove_node( 'root' );\n\t\t$this->add_node( array(\n\t\t\t'id'    => 'root',\n\t\t\t'group' => false,\n\t\t) );\n\n\t\t// Normalize nodes: define internal 'children' and 'type' properties.\n\t\tforeach ( $this->_get_nodes() as $node ) {\n\t\t\t$node->children = array();\n\t\t\t$node->type = ( $node->group ) ? 'group' : 'item';\n\t\t\tunset( $node->group );\n\n\t\t\t// The Root wants your orphans. No lonely items allowed.\n\t\t\tif ( ! $node->parent )\n\t\t\t\t$node->parent = 'root';\n\t\t}\n\n\t\tforeach ( $this->_get_nodes() as $node ) {\n\t\t\tif ( 'root' == $node->id )\n\t\t\t\tcontinue;\n\n\t\t\t// Fetch the parent node. If it isn't registered, ignore the node.\n\t\t\tif ( ! $parent = $this->_get_node( $node->parent ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Generate the group class (we distinguish between top level and other level groups).\n\t\t\t$group_class = ( $node->parent == 'root' ) ? 'ab-top-menu' : 'ab-submenu';\n\n\t\t\tif ( $node->type == 'group' ) {\n\t\t\t\tif ( empty( $node->meta['class'] ) )\n\t\t\t\t\t$node->meta['class'] = $group_class;\n\t\t\t\telse\n\t\t\t\t\t$node->meta['class'] .= ' ' . $group_class;\n\t\t\t}\n\n\t\t\t// Items in items aren't allowed. Wrap nested items in 'default' groups.\n\t\t\tif ( $parent->type == 'item' && $node->type == 'item' ) {\n\t\t\t\t$default_id = $parent->id . '-default';\n\t\t\t\t$default    = $this->_get_node( $default_id );\n\n\t\t\t\t// The default group is added here to allow groups that are\n\t\t\t\t// added before standard menu items to render first.\n\t\t\t\tif ( ! $default ) {\n\t\t\t\t\t// Use _set_node because add_node can be overloaded.\n\t\t\t\t\t// Make sure to specify default settings for all properties.\n\t\t\t\t\t$this->_set_node( array(\n\t\t\t\t\t\t'id'        => $default_id,\n\t\t\t\t\t\t'parent'    => $parent->id,\n\t\t\t\t\t\t'type'      => 'group',\n\t\t\t\t\t\t'children'  => array(),\n\t\t\t\t\t\t'meta'      => array(\n\t\t\t\t\t\t\t'class'     => $group_class,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'title'     => false,\n\t\t\t\t\t\t'href'      => false,\n\t\t\t\t\t) );\n\t\t\t\t\t$default = $this->_get_node( $default_id );\n\t\t\t\t\t$parent->children[] = $default;\n\t\t\t\t}\n\t\t\t\t$parent = $default;\n\n\t\t\t// Groups in groups aren't allowed. Add a special 'container' node.\n\t\t\t// The container will invisibly wrap both groups.\n\t\t\t} elseif ( $parent->type == 'group' && $node->type == 'group' ) {\n\t\t\t\t$container_id = $parent->id . '-container';\n\t\t\t\t$container    = $this->_get_node( $container_id );\n\n\t\t\t\t// We need to create a container for this group, life is sad.\n\t\t\t\tif ( ! $container ) {\n\t\t\t\t\t// Use _set_node because add_node can be overloaded.\n\t\t\t\t\t// Make sure to specify default settings for all properties.\n\t\t\t\t\t$this->_set_node( array(\n\t\t\t\t\t\t'id'       => $container_id,\n\t\t\t\t\t\t'type'     => 'container',\n\t\t\t\t\t\t'children' => array( $parent ),\n\t\t\t\t\t\t'parent'   => false,\n\t\t\t\t\t\t'title'    => false,\n\t\t\t\t\t\t'href'     => false,\n\t\t\t\t\t\t'meta'     => array(),\n\t\t\t\t\t) );\n\n\t\t\t\t\t$container = $this->_get_node( $container_id );\n\n\t\t\t\t\t// Link the container node if a grandparent node exists.\n\t\t\t\t\t$grandparent = $this->_get_node( $parent->parent );\n\n\t\t\t\t\tif ( $grandparent ) {\n\t\t\t\t\t\t$container->parent = $grandparent->id;\n\n\t\t\t\t\t\t$index = array_search( $parent, $grandparent->children, true );\n\t\t\t\t\t\tif ( $index === false )\n\t\t\t\t\t\t\t$grandparent->children[] = $container;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tarray_splice( $grandparent->children, $index, 1, array( $container ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t$parent->parent = $container->id;\n\t\t\t\t}\n\n\t\t\t\t$parent = $container;\n\t\t\t}\n\n\t\t\t// Update the parent ID (it might have changed).\n\t\t\t$node->parent = $parent->id;\n\n\t\t\t// Add the node to the tree.\n\t\t\t$parent->children[] = $node;\n\t\t}\n\n\t\t$root = $this->_get_node( 'root' );\n\t\t$this->bound = true;\n\t\treturn $root;\n\t}\n\n\t/**\n\t *\n\t * @global bool $is_IE\n\t * @param object $root\n\t */\n\tfinal protected function _render( $root ) {\n\t\tglobal $is_IE;\n\n\t\t// Add browser classes.\n\t\t// We have to do this here since admin bar shows on the front end.\n\t\t$class = 'nojq nojs';\n\t\tif ( $is_IE ) {\n\t\t\tif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 7' ) )\n\t\t\t\t$class .= ' ie7';\n\t\t\telseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 8' ) )\n\t\t\t\t$class .= ' ie8';\n\t\t\telseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 9' ) )\n\t\t\t\t$class .= ' ie9';\n\t\t} elseif ( wp_is_mobile() ) {\n\t\t\t$class .= ' mobile';\n\t\t}\n\n\t\t?>\n\t\t<div id=\"wpadminbar\" class=\"<?php echo $class; ?>\">\n\t\t\t<?php if ( ! is_admin() ) { ?>\n\t\t\t\t<a class=\"screen-reader-shortcut\" href=\"#wp-toolbar\" tabindex=\"1\"><?php _e( 'Skip to toolbar' ); ?></a>\n\t\t\t<?php } ?>\n\t\t\t<div class=\"quicklinks\" id=\"wp-toolbar\" role=\"navigation\" aria-label=\"<?php esc_attr_e( 'Toolbar' ); ?>\" tabindex=\"0\">\n\t\t\t\t<?php foreach ( $root->children as $group ) {\n\t\t\t\t\t$this->_render_group( $group );\n\t\t\t\t} ?>\n\t\t\t</div>\n\t\t\t<?php if ( is_user_logged_in() ) : ?>\n\t\t\t<a class=\"screen-reader-shortcut\" href=\"<?php echo esc_url( wp_logout_url() ); ?>\"><?php _e('Log Out'); ?></a>\n\t\t\t<?php endif; ?>\n\t\t</div>\n\n\t\t<?php\n\t}\n\n\t/**\n\t * @param object $node\n\t */\n\tfinal protected function _render_container( $node ) {\n\t\tif ( $node->type != 'container' || empty( $node->children ) )\n\t\t\treturn;\n\n\t\t?><div id=\"<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>\" class=\"ab-group-container\"><?php\n\t\t\tforeach ( $node->children as $group ) {\n\t\t\t\t$this->_render_group( $group );\n\t\t\t}\n\t\t?></div><?php\n\t}\n\n\t/**\n\t * @param object $node\n\t */\n\tfinal protected function _render_group( $node ) {\n\t\tif ( $node->type == 'container' ) {\n\t\t\t$this->_render_container( $node );\n\t\t\treturn;\n\t\t}\n\t\tif ( $node->type != 'group' || empty( $node->children ) )\n\t\t\treturn;\n\n\t\tif ( ! empty( $node->meta['class'] ) )\n\t\t\t$class = ' class=\"' . esc_attr( trim( $node->meta['class'] ) ) . '\"';\n\t\telse\n\t\t\t$class = '';\n\n\t\t?><ul id=\"<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>\"<?php echo $class; ?>><?php\n\t\t\tforeach ( $node->children as $item ) {\n\t\t\t\t$this->_render_item( $item );\n\t\t\t}\n\t\t?></ul><?php\n\t}\n\n\t/**\n\t * @param object $node\n\t */\n\tfinal protected function _render_item( $node ) {\n\t\tif ( $node->type != 'item' )\n\t\t\treturn;\n\n\t\t$is_parent = ! empty( $node->children );\n\t\t$has_link  = ! empty( $node->href );\n\n\t\t$tabindex = isset( $node->meta['tabindex'] ) ? (int) $node->meta['tabindex'] : '';\n\t\t$aria_attributes = $tabindex ? 'tabindex=\"' . $tabindex . '\"' : '';\n\n\t\t$menuclass = '';\n\n\t\tif ( $is_parent ) {\n\t\t\t$menuclass = 'menupop ';\n\t\t\t$aria_attributes .= ' aria-haspopup=\"true\"';\n\t\t}\n\n\t\tif ( ! empty( $node->meta['class'] ) )\n\t\t\t$menuclass .= $node->meta['class'];\n\n\t\tif ( $menuclass )\n\t\t\t$menuclass = ' class=\"' . esc_attr( trim( $menuclass ) ) . '\"';\n\n\t\t?>\n\n\t\t<li id=\"<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>\"<?php echo $menuclass; ?>><?php\n\t\t\tif ( $has_link ):\n\t\t\t\t?><a class=\"ab-item\" <?php echo $aria_attributes; ?> href=\"<?php echo esc_url( $node->href ) ?>\"<?php\n\t\t\t\t\tif ( ! empty( $node->meta['onclick'] ) ) :\n\t\t\t\t\t\t?> onclick=\"<?php echo esc_js( $node->meta['onclick'] ); ?>\"<?php\n\t\t\t\t\tendif;\n\t\t\t\tif ( ! empty( $node->meta['target'] ) ) :\n\t\t\t\t\t?> target=\"<?php echo esc_attr( $node->meta['target'] ); ?>\"<?php\n\t\t\t\tendif;\n\t\t\t\tif ( ! empty( $node->meta['title'] ) ) :\n\t\t\t\t\t?> title=\"<?php echo esc_attr( $node->meta['title'] ); ?>\"<?php\n\t\t\t\tendif;\n\t\t\t\tif ( ! empty( $node->meta['rel'] ) ) :\n\t\t\t\t\t?> rel=\"<?php echo esc_attr( $node->meta['rel'] ); ?>\"<?php\n\t\t\t\tendif;\n\t\t\t\t?>><?php\n\t\t\telse:\n\t\t\t\t?><div class=\"ab-item ab-empty-item\" <?php echo $aria_attributes;\n\t\t\t\tif ( ! empty( $node->meta['title'] ) ) :\n\t\t\t\t\t?> title=\"<?php echo esc_attr( $node->meta['title'] ); ?>\"<?php\n\t\t\t\tendif;\n\t\t\t\t?>><?php\n\t\t\tendif;\n\n\t\t\techo $node->title;\n\n\t\t\tif ( $has_link ) :\n\t\t\t\t?></a><?php\n\t\t\telse:\n\t\t\t\t?></div><?php\n\t\t\tendif;\n\n\t\t\tif ( $is_parent ) :\n\t\t\t\t?><div class=\"ab-sub-wrapper\"><?php\n\t\t\t\t\tforeach ( $node->children as $group ) {\n\t\t\t\t\t\t$this->_render_group( $group );\n\t\t\t\t\t}\n\t\t\t\t?></div><?php\n\t\t\tendif;\n\n\t\t\tif ( ! empty( $node->meta['html'] ) )\n\t\t\t\techo $node->meta['html'];\n\n\t\t\t?>\n\t\t</li><?php\n\t}\n\n\t/**\n\t * @param string $id    Unused.\n\t * @param object $node\n\t */\n\tpublic function recursive_render( $id, $node ) {\n\t\t_deprecated_function( __METHOD__, '3.3', 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' );\n\t\t$this->_render_item( $node );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function add_menus() {\n\t\t// User related, aligned right.\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_my_account_menu', 0 );\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 4 );\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 7 );\n\n\t\t// Site related.\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_sidebar_toggle', 0 );\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 );\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 );\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_site_menu', 30 );\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 );\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 );\n\n\t\t// Content related.\n\t\tif ( ! is_network_admin() && ! is_user_admin() ) {\n\t\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 );\n\t\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 70 );\n\t\t}\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_edit_menu', 80 );\n\n\t\tadd_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 );\n\n\t\t/**\n\t\t * Fires after menus are added to the menu bar.\n\t\t *\n\t\t * @since 3.1.0\n\t\t */\n\t\tdo_action( 'add_admin_bar_menus' );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-ajax-response.php",
    "content": "<?php\n/**\n * Send XML response back to AJAX request.\n *\n * @package WordPress\n * @since 2.1.0\n */\nclass WP_Ajax_Response {\n\t/**\n\t * Store XML responses to send.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $responses = array();\n\n\t/**\n\t * Constructor - Passes args to {@link WP_Ajax_Response::add()}.\n\t *\n\t * @since 2.1.0\n\t * @see WP_Ajax_Response::add()\n\t *\n\t * @param string|array $args Optional. Will be passed to add() method.\n\t */\n\tpublic function __construct( $args = '' ) {\n\t\tif ( !empty($args) )\n\t\t\t$this->add($args);\n\t}\n\n\t/**\n\t * Append to XML response based on given arguments.\n\t *\n\t * The arguments that can be passed in the $args parameter are below. It is\n\t * also possible to pass a WP_Error object in either the 'id' or 'data'\n\t * argument. The parameter isn't actually optional, content should be given\n\t * in order to send the correct response.\n\t *\n\t * 'what' argument is a string that is the XMLRPC response type.\n\t * 'action' argument is a boolean or string that acts like a nonce.\n\t * 'id' argument can be WP_Error or an integer.\n\t * 'old_id' argument is false by default or an integer of the previous ID.\n\t * 'position' argument is an integer or a string with -1 = top, 1 = bottom,\n\t * html ID = after, -html ID = before.\n\t * 'data' argument is a string with the content or message.\n\t * 'supplemental' argument is an array of strings that will be children of\n\t * the supplemental element.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string|array $args Override defaults.\n\t * @return string XML response.\n\t */\n\tpublic function add( $args = '' ) {\n\t\t$defaults = array(\n\t\t\t'what' => 'object', 'action' => false,\n\t\t\t'id' => '0', 'old_id' => false,\n\t\t\t'position' => 1,\n\t\t\t'data' => '', 'supplemental' => array()\n\t\t);\n\n\t\t$r = wp_parse_args( $args, $defaults );\n\n\t\t$position = preg_replace( '/[^a-z0-9:_-]/i', '', $r['position'] );\n\t\t$id = $r['id'];\n\t\t$what = $r['what'];\n\t\t$action = $r['action'];\n\t\t$old_id = $r['old_id'];\n\t\t$data = $r['data'];\n\n\t\tif ( is_wp_error( $id ) ) {\n\t\t\t$data = $id;\n\t\t\t$id = 0;\n\t\t}\n\n\t\t$response = '';\n\t\tif ( is_wp_error( $data ) ) {\n\t\t\tforeach ( (array) $data->get_error_codes() as $code ) {\n\t\t\t\t$response .= \"<wp_error code='$code'><![CDATA[\" . $data->get_error_message( $code ) . \"]]></wp_error>\";\n\t\t\t\tif ( ! $error_data = $data->get_error_data( $code ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$class = '';\n\t\t\t\tif ( is_object( $error_data ) ) {\n\t\t\t\t\t$class = ' class=\"' . get_class( $error_data ) . '\"';\n\t\t\t\t\t$error_data = get_object_vars( $error_data );\n\t\t\t\t}\n\n\t\t\t\t$response .= \"<wp_error_data code='$code'$class>\";\n\n\t\t\t\tif ( is_scalar( $error_data ) ) {\n\t\t\t\t\t$response .= \"<![CDATA[$error_data]]>\";\n\t\t\t\t} elseif ( is_array( $error_data ) ) {\n\t\t\t\t\tforeach ( $error_data as $k => $v ) {\n\t\t\t\t\t\t$response .= \"<$k><![CDATA[$v]]></$k>\";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$response .= \"</wp_error_data>\";\n\t\t\t}\n\t\t} else {\n\t\t\t$response = \"<response_data><![CDATA[$data]]></response_data>\";\n\t\t}\n\n\t\t$s = '';\n\t\tif ( is_array( $r['supplemental'] ) ) {\n\t\t\tforeach ( $r['supplemental'] as $k => $v ) {\n\t\t\t\t$s .= \"<$k><![CDATA[$v]]></$k>\";\n\t\t\t}\n\t\t\t$s = \"<supplemental>$s</supplemental>\";\n\t\t}\n\n\t\tif ( false === $action ) {\n\t\t\t$action = $_POST['action'];\n\t\t}\n\t\t$x = '';\n\t\t$x .= \"<response action='{$action}_$id'>\"; // The action attribute in the xml output is formatted like a nonce action\n\t\t$x .=\t\"<$what id='$id' \" . ( false === $old_id ? '' : \"old_id='$old_id' \" ) . \"position='$position'>\";\n\t\t$x .=\t\t$response;\n\t\t$x .=\t\t$s;\n\t\t$x .=\t\"</$what>\";\n\t\t$x .= \"</response>\";\n\n\t\t$this->responses[] = $x;\n\t\treturn $x;\n\t}\n\n\t/**\n\t * Display XML formatted responses.\n\t *\n\t * Sets the content type header to text/xml.\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function send() {\n\t\theader( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) );\n\t\techo \"<?xml version='1.0' encoding='\" . get_option( 'blog_charset' ) . \"' standalone='yes'?><wp_ajax>\";\n\t\tforeach ( (array) $this->responses as $response )\n\t\t\techo $response;\n\t\techo '</wp_ajax>';\n\t\tif ( defined( 'DOING_AJAX' ) && DOING_AJAX )\n\t\t\twp_die();\n\t\telse\n\t\t\tdie();\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-comment-query.php",
    "content": "<?php\n/**\n * Comment API: WP_Comment_Query class\n *\n * @package WordPress\n * @subpackage Comments\n * @since 4.4.0\n */\n\n/**\n * Core class used for querying comments.\n *\n * @since 3.1.0\n *\n * @see WP_Comment_Query::__construct() for accepted arguments.\n */\nclass WP_Comment_Query {\n\n\t/**\n\t * SQL for database query.\n\t *\n\t * @since 4.0.1\n\t * @access public\n\t * @var string\n\t */\n\tpublic $request;\n\n\t/**\n\t * Metadata query container\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @var object WP_Meta_Query\n\t */\n\tpublic $meta_query = false;\n\n\t/**\n\t * Metadata query clauses.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $meta_query_clauses;\n\n\t/**\n\t * SQL query clauses.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $sql_clauses = array(\n\t\t'select'  => '',\n\t\t'from'    => '',\n\t\t'where'   => array(),\n\t\t'groupby' => '',\n\t\t'orderby' => '',\n\t\t'limits'  => '',\n\t);\n\n\t/**\n\t * SQL WHERE clause.\n\t *\n\t * Stored after the 'comments_clauses' filter is run on the compiled WHERE sub-clauses.\n\t *\n\t * @since 4.4.2\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $filtered_where_clause;\n\n\t/**\n\t * Date query container\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @var object WP_Date_Query\n\t */\n\tpublic $date_query = false;\n\n\t/**\n\t * Query vars set by the user.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $query_vars;\n\n\t/**\n\t * Default values for query vars.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $query_var_defaults;\n\n\t/**\n\t * List of comments located by the query.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $comments;\n\n\t/**\n\t * The amount of found comments for the current query.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $found_comments = 0;\n\n\t/**\n\t * The number of pages.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $max_num_pages = 0;\n\n\t/**\n\t * Make private/protected methods readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param callable $name      Method to call.\n\t * @param array    $arguments Arguments to pass when calling.\n\t * @return mixed|false Return value of the callback, false otherwise.\n\t */\n\tpublic function __call( $name, $arguments ) {\n\t\tif ( 'get_search_sql' === $name ) {\n\t\t\treturn call_user_func_array( array( $this, $name ), $arguments );\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Constructor.\n\t *\n\t * Sets up the comment query, based on the query vars passed.\n\t *\n\t * @since 4.2.0\n\t * @since 4.4.0 `$parent__in` and `$parent__not_in` were added.\n\t * @since 4.4.0 Order by `comment__in` was added. `$update_comment_meta_cache`, `$no_found_rows`,\n\t *              `$hierarchical`, and `$update_comment_post_cache` were added.\n\t * @access public\n\t *\n\t * @param string|array $query {\n\t *     Optional. Array or query string of comment query parameters. Default empty.\n\t *\n\t *     @type string       $author_email              Comment author email address. Default empty.\n\t *     @type array        $author__in                Array of author IDs to include comments for. Default empty.\n\t *     @type array        $author__not_in            Array of author IDs to exclude comments for. Default empty.\n\t *     @type array        $comment__in               Array of comment IDs to include. Default empty.\n\t *     @type array        $comment__not_in           Array of comment IDs to exclude. Default empty.\n\t *     @type bool         $count                     Whether to return a comment count (true) or array of\n\t *                                                   comment objects (false). Default false.\n\t *     @type array        $date_query                Date query clauses to limit comments by. See WP_Date_Query.\n\t *                                                   Default null.\n\t *     @type string       $fields                    Comment fields to return. Accepts 'ids' for comment IDs\n\t *                                                   only or empty for all fields. Default empty.\n\t *     @type int          $ID                        Currently unused.\n\t *     @type array        $include_unapproved        Array of IDs or email addresses of users whose unapproved\n\t *                                                   comments will be returned by the query regardless of\n\t *                                                   `$status`. Default empty.\n\t *     @type int          $karma                     Karma score to retrieve matching comments for.\n\t *                                                   Default empty.\n\t *     @type string       $meta_key                  Include comments with a matching comment meta key.\n\t *                                                   Default empty.\n\t *     @type string       $meta_value                Include comments with a matching comment meta value.\n\t *                                                   Requires `$meta_key` to be set. Default empty.\n\t *     @type array        $meta_query                Meta query clauses to limit retrieved comments by.\n\t *                                                   See WP_Meta_Query. Default empty.\n\t *     @type int          $number                    Maximum number of comments to retrieve.\n\t *                                                   Default null (no limit).\n\t *     @type int          $offset                    Number of comments to offset the query. Used to build\n\t *                                                   LIMIT clause. Default 0.\n\t *     @type bool         $no_found_rows             Whether to disable the `SQL_CALC_FOUND_ROWS` query.\n\t *                                                   Default: true.\n\t *     @type string|array $orderby                   Comment status or array of statuses. To use 'meta_value'\n\t *                                                   or 'meta_value_num', `$meta_key` must also be defined.\n\t *                                                   To sort by a specific `$meta_query` clause, use that\n\t *                                                   clause's array key. Accepts 'comment_agent',\n\t *                                                   'comment_approved', 'comment_author',\n\t *                                                   'comment_author_email', 'comment_author_IP',\n\t *                                                   'comment_author_url', 'comment_content', 'comment_date',\n\t *                                                   'comment_date_gmt', 'comment_ID', 'comment_karma',\n\t *                                                   'comment_parent', 'comment_post_ID', 'comment_type',\n\t *                                                   'user_id', 'comment__in', 'meta_value', 'meta_value_num',\n\t *                                                   the value of $meta_key, and the array keys of\n\t *                                                   `$meta_query`. Also accepts false, an empty array, or\n\t *                                                   'none' to disable `ORDER BY` clause.\n\t *                                                   Default: 'comment_date_gmt'.\n\t *     @type string       $order                     How to order retrieved comments. Accepts 'ASC', 'DESC'.\n\t *                                                   Default: 'DESC'.\n\t *     @type int          $parent                    Parent ID of comment to retrieve children of.\n\t *                                                   Default empty.\n\t *     @type array        $parent__in                Array of parent IDs of comments to retrieve children for.\n\t *                                                   Default empty.\n\t *     @type array        $parent__not_in            Array of parent IDs of comments *not* to retrieve\n\t *                                                   children for. Default empty.\n\t *     @type array        $post_author__in           Array of author IDs to retrieve comments for.\n\t *                                                   Default empty.\n\t *     @type array        $post_author__not_in       Array of author IDs *not* to retrieve comments for.\n\t *                                                   Default empty.\n\t *     @type int          $post_ID                   Currently unused.\n\t *     @type int          $post_id                   Limit results to those affiliated with a given post ID.\n\t *                                                   Default 0.\n\t *     @type array        $post__in                  Array of post IDs to include affiliated comments for.\n\t *                                                   Default empty.\n\t *     @type array        $post__not_in              Array of post IDs to exclude affiliated comments for.\n\t *                                                   Default empty.\n\t *     @type int          $post_author               Comment author ID to limit results by. Default empty.\n\t *     @type string       $post_status               Post status to retrieve affiliated comments for.\n\t *                                                   Default empty.\n\t *     @type string       $post_type                 Post type to retrieve affiliated comments for.\n\t *                                                   Default empty.\n\t *     @type string       $post_name                 Post name to retrieve affiliated comments for.\n\t *                                                   Default empty.\n\t *     @type int          $post_parent               Post parent ID to retrieve affiliated comments for.\n\t *                                                   Default empty.\n\t *     @type string       $search                    Search term(s) to retrieve matching comments for.\n\t *                                                   Default empty.\n\t *     @type string       $status                    Comment status to limit results by. Accepts 'hold'\n\t *                                                   (`comment_status=0`), 'approve' (`comment_status=1`),\n\t *                                                   'all', or a custom comment status. Default 'all'.\n\t *     @type string|array $type                      Include comments of a given type, or array of types.\n\t *                                                   Accepts 'comment', 'pings' (includes 'pingback' and\n\t *                                                   'trackback'), or anycustom type string. Default empty.\n\t *     @type array        $type__in                  Include comments from a given array of comment types.\n\t *                                                   Default empty.\n\t *     @type array        $type__not_in              Exclude comments from a given array of comment types.\n\t *                                                   Default empty.\n\t *     @type int          $user_id                   Include comments for a specific user ID. Default empty.\n\t *     @type bool|string  $hierarchical              Whether to include comment descendants in the results.\n\t *                                                   'threaded' returns a tree, with each comment's children\n\t *                                                   stored in a `children` property on the `WP_Comment`\n\t *                                                   object. 'flat' returns a flat array of found comments plus\n\t *                                                   their children. Pass `false` to leave out descendants.\n\t *                                                   The parameter is ignored (forced to `false`) when\n\t *                                                   `$fields` is 'ids' or 'counts'. Accepts 'threaded',\n\t *                                                   'flat', or false. Default: false.\n\t *     @type bool         $update_comment_meta_cache Whether to prime the metadata cache for found comments.\n\t *                                                   Default true.\n\t *     @type bool         $update_comment_post_cache Whether to prime the cache for comment posts.\n\t *                                                   Default false.\n\t * }\n\t */\n\tpublic function __construct( $query = '' ) {\n\t\t$this->query_var_defaults = array(\n\t\t\t'author_email' => '',\n\t\t\t'author__in' => '',\n\t\t\t'author__not_in' => '',\n\t\t\t'include_unapproved' => '',\n\t\t\t'fields' => '',\n\t\t\t'ID' => '',\n\t\t\t'comment__in' => '',\n\t\t\t'comment__not_in' => '',\n\t\t\t'karma' => '',\n\t\t\t'number' => '',\n\t\t\t'offset' => '',\n\t\t\t'no_found_rows' => true,\n\t\t\t'orderby' => '',\n\t\t\t'order' => 'DESC',\n\t\t\t'parent' => '',\n\t\t\t'post_author__in' => '',\n\t\t\t'post_author__not_in' => '',\n\t\t\t'post_ID' => '',\n\t\t\t'post_id' => 0,\n\t\t\t'post__in' => '',\n\t\t\t'post__not_in' => '',\n\t\t\t'post_author' => '',\n\t\t\t'post_name' => '',\n\t\t\t'post_parent' => '',\n\t\t\t'post_status' => '',\n\t\t\t'post_type' => '',\n\t\t\t'status' => 'all',\n\t\t\t'type' => '',\n\t\t\t'type__in' => '',\n\t\t\t'type__not_in' => '',\n\t\t\t'user_id' => '',\n\t\t\t'search' => '',\n\t\t\t'count' => false,\n\t\t\t'meta_key' => '',\n\t\t\t'meta_value' => '',\n\t\t\t'meta_query' => '',\n\t\t\t'date_query' => null, // See WP_Date_Query\n\t\t\t'hierarchical' => false,\n\t\t\t'update_comment_meta_cache' => true,\n\t\t\t'update_comment_post_cache' => false,\n\t\t);\n\n\t\tif ( ! empty( $query ) ) {\n\t\t\t$this->query( $query );\n\t\t}\n\t}\n\n\t/**\n\t * Parse arguments passed to the comment query with default query parameters.\n\t *\n\t * @since  4.2.0 Extracted from WP_Comment_Query::query().\n\t *\n\t * @access public\n\t *\n\t * @param string|array $query WP_Comment_Query arguments. See WP_Comment_Query::__construct()\n\t */\n\tpublic function parse_query( $query = '' ) {\n\t\tif ( empty( $query ) ) {\n\t\t\t$query = $this->query_vars;\n\t\t}\n\n\t\t$this->query_vars = wp_parse_args( $query, $this->query_var_defaults );\n\t\tdo_action_ref_array( 'parse_comment_query', array( &$this ) );\n\t}\n\n\t/**\n\t * Sets up the WordPress query for retrieving comments.\n\t *\n\t * @since 3.1.0\n\t * @since 4.1.0 Introduced 'comment__in', 'comment__not_in', 'post_author__in',\n\t *              'post_author__not_in', 'author__in', 'author__not_in', 'post__in',\n\t *              'post__not_in', 'include_unapproved', 'type__in', and 'type__not_in'\n\t *              arguments to $query_vars.\n\t * @since 4.2.0 Moved parsing to WP_Comment_Query::parse_query().\n\t * @access public\n\t *\n\t * @param string|array $query Array or URL query string of parameters.\n\t * @return array|int List of comments, or number of comments when 'count' is passed as a query var.\n\t */\n\tpublic function query( $query ) {\n\t\t$this->query_vars = wp_parse_args( $query );\n\t\treturn $this->get_comments();\n\t}\n\n\t/**\n\t * Get a list of comments matching the query vars.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @return int|array The list of comments.\n\t */\n\tpublic function get_comments() {\n\t\tglobal $wpdb;\n\n\t\t$this->parse_query();\n\n\t\t// Parse meta query\n\t\t$this->meta_query = new WP_Meta_Query();\n\t\t$this->meta_query->parse_query_vars( $this->query_vars );\n\n\t\t/**\n\t\t * Fires before comments are retrieved.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param WP_Comment_Query &$this Current instance of WP_Comment_Query, passed by reference.\n\t\t */\n\t\tdo_action_ref_array( 'pre_get_comments', array( &$this ) );\n\n\t\t// Reparse query vars, in case they were modified in a 'pre_get_comments' callback.\n\t\t$this->meta_query->parse_query_vars( $this->query_vars );\n\t\tif ( ! empty( $this->meta_query->queries ) ) {\n\t\t\t$this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this );\n\t\t}\n\n\t\t// $args can include anything. Only use the args defined in the query_var_defaults to compute the key.\n\t\t$key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) );\n\t\t$last_changed = wp_cache_get( 'last_changed', 'comment' );\n\t\tif ( ! $last_changed ) {\n\t\t\t$last_changed = microtime();\n\t\t\twp_cache_set( 'last_changed', $last_changed, 'comment' );\n\t\t}\n\t\t$cache_key = \"get_comment_ids:$key:$last_changed\";\n\n\t\t$comment_ids = wp_cache_get( $cache_key, 'comment' );\n\t\tif ( false === $comment_ids ) {\n\t\t\t$comment_ids = $this->get_comment_ids();\n\t\t\twp_cache_add( $cache_key, $comment_ids, 'comment' );\n\t\t}\n\n\t\t// If querying for a count only, there's nothing more to do.\n\t\tif ( $this->query_vars['count'] ) {\n\t\t\t// $comment_ids is actually a count in this case.\n\t\t\treturn intval( $comment_ids );\n\t\t}\n\n\t\t$comment_ids = array_map( 'intval', $comment_ids );\n\n\t\t$this->comment_count = count( $this->comments );\n\n\t\tif ( $comment_ids && $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) {\n\t\t\t/**\n\t\t\t * Filter the query used to retrieve found comment count.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param string           $found_comments_query SQL query. Default 'SELECT FOUND_ROWS()'.\n\t\t\t * @param WP_Comment_Query $comment_query        The `WP_Comment_Query` instance.\n\t\t\t */\n\t\t\t$found_comments_query = apply_filters( 'found_comments_query', 'SELECT FOUND_ROWS()', $this );\n\t\t\t$this->found_comments = (int) $wpdb->get_var( $found_comments_query );\n\n\t\t\t$this->max_num_pages = ceil( $this->found_comments / $this->query_vars['number'] );\n\t\t}\n\n\t\tif ( 'ids' == $this->query_vars['fields'] ) {\n\t\t\t$this->comments = $comment_ids;\n\t\t\treturn $this->comments;\n\t\t}\n\n\t\t_prime_comment_caches( $comment_ids, $this->query_vars['update_comment_meta_cache'] );\n\n\t\t// Fetch full comment objects from the primed cache.\n\t\t$_comments = array();\n\t\tforeach ( $comment_ids as $comment_id ) {\n\t\t\tif ( $_comment = get_comment( $comment_id ) ) {\n\t\t\t\t$_comments[] = $_comment;\n\t\t\t}\n\t\t}\n\n\t\t// Prime comment post caches.\n\t\tif ( $this->query_vars['update_comment_post_cache'] ) {\n\t\t\t$comment_post_ids = array();\n\t\t\tforeach ( $_comments as $_comment ) {\n\t\t\t\t$comment_post_ids[] = $_comment->comment_post_ID;\n\t\t\t}\n\n\t\t\t_prime_post_caches( $comment_post_ids, false, false );\n\t\t}\n\n\t\t/**\n\t\t * Filter the comment query results.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array            $results  An array of comments.\n\t\t * @param WP_Comment_Query &$this    Current instance of WP_Comment_Query, passed by reference.\n\t\t */\n\t\t$_comments = apply_filters_ref_array( 'the_comments', array( $_comments, &$this ) );\n\n\t\t// Convert to WP_Comment instances\n\t\t$comments = array_map( 'get_comment', $_comments );\n\n\t\tif ( $this->query_vars['hierarchical'] ) {\n\t\t\t$comments = $this->fill_descendants( $comments );\n\t\t}\n\n\t\t$this->comments = $comments;\n\t\treturn $this->comments;\n\t}\n\n\t/**\n\t * Used internally to get a list of comment IDs matching the query vars.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t */\n\tprotected function get_comment_ids() {\n\t\tglobal $wpdb;\n\n\t\t// Assemble clauses related to 'comment_approved'.\n\t\t$approved_clauses = array();\n\n\t\t// 'status' accepts an array or a comma-separated string.\n\t\t$status_clauses = array();\n\t\t$statuses = $this->query_vars['status'];\n\t\tif ( ! is_array( $statuses ) ) {\n\t\t\t$statuses = preg_split( '/[\\s,]+/', $statuses );\n\t\t}\n\n\t\t// 'any' overrides other statuses.\n\t\tif ( ! in_array( 'any', $statuses ) ) {\n\t\t\tforeach ( $statuses as $status ) {\n\t\t\t\tswitch ( $status ) {\n\t\t\t\t\tcase 'hold' :\n\t\t\t\t\t\t$status_clauses[] = \"comment_approved = '0'\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'approve' :\n\t\t\t\t\t\t$status_clauses[] = \"comment_approved = '1'\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'all' :\n\t\t\t\t\tcase '' :\n\t\t\t\t\t\t$status_clauses[] = \"( comment_approved = '0' OR comment_approved = '1' )\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault :\n\t\t\t\t\t\t$status_clauses[] = $wpdb->prepare( \"comment_approved = %s\", $status );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! empty( $status_clauses ) ) {\n\t\t\t\t$approved_clauses[] = '( ' . implode( ' OR ', $status_clauses ) . ' )';\n\t\t\t}\n\t\t}\n\n\t\t// User IDs or emails whose unapproved comments are included, regardless of $status.\n\t\tif ( ! empty( $this->query_vars['include_unapproved'] ) ) {\n\t\t\t$include_unapproved = $this->query_vars['include_unapproved'];\n\n\t\t\t// Accepts arrays or comma-separated strings.\n\t\t\tif ( ! is_array( $include_unapproved ) ) {\n\t\t\t\t$include_unapproved = preg_split( '/[\\s,]+/', $include_unapproved );\n\t\t\t}\n\n\t\t\t$unapproved_ids = $unapproved_emails = array();\n\t\t\tforeach ( $include_unapproved as $unapproved_identifier ) {\n\t\t\t\t// Numeric values are assumed to be user ids.\n\t\t\t\tif ( is_numeric( $unapproved_identifier ) ) {\n\t\t\t\t\t$approved_clauses[] = $wpdb->prepare( \"( user_id = %d AND comment_approved = '0' )\", $unapproved_identifier );\n\n\t\t\t\t// Otherwise we match against email addresses.\n\t\t\t\t} else {\n\t\t\t\t\t$approved_clauses[] = $wpdb->prepare( \"( comment_author_email = %s AND comment_approved = '0' )\", $unapproved_identifier );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Collapse comment_approved clauses into a single OR-separated clause.\n\t\tif ( ! empty( $approved_clauses ) ) {\n\t\t\tif ( 1 === count( $approved_clauses ) ) {\n\t\t\t\t$this->sql_clauses['where']['approved'] = $approved_clauses[0];\n\t\t\t} else {\n\t\t\t\t$this->sql_clauses['where']['approved'] = '( ' . implode( ' OR ', $approved_clauses ) . ' )';\n\t\t\t}\n\t\t}\n\n\t\t$order = ( 'ASC' == strtoupper( $this->query_vars['order'] ) ) ? 'ASC' : 'DESC';\n\n\t\t// Disable ORDER BY with 'none', an empty array, or boolean false.\n\t\tif ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) {\n\t\t\t$orderby = '';\n\t\t} elseif ( ! empty( $this->query_vars['orderby'] ) ) {\n\t\t\t$ordersby = is_array( $this->query_vars['orderby'] ) ?\n\t\t\t\t$this->query_vars['orderby'] :\n\t\t\t\tpreg_split( '/[,\\s]/', $this->query_vars['orderby'] );\n\n\t\t\t$orderby_array = array();\n\t\t\t$found_orderby_comment_ID = false;\n\t\t\tforeach ( $ordersby as $_key => $_value ) {\n\t\t\t\tif ( ! $_value ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( is_int( $_key ) ) {\n\t\t\t\t\t$_orderby = $_value;\n\t\t\t\t\t$_order = $order;\n\t\t\t\t} else {\n\t\t\t\t\t$_orderby = $_key;\n\t\t\t\t\t$_order = $_value;\n\t\t\t\t}\n\n\t\t\t\tif ( ! $found_orderby_comment_ID && in_array( $_orderby, array( 'comment_ID', 'comment__in' ) ) ) {\n\t\t\t\t\t$found_orderby_comment_ID = true;\n\t\t\t\t}\n\n\t\t\t\t$parsed = $this->parse_orderby( $_orderby );\n\n\t\t\t\tif ( ! $parsed ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( 'comment__in' === $_orderby ) {\n\t\t\t\t\t$orderby_array[] = $parsed;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );\n\t\t\t}\n\n\t\t\t// If no valid clauses were found, order by comment_date_gmt.\n\t\t\tif ( empty( $orderby_array ) ) {\n\t\t\t\t$orderby_array[] = \"$wpdb->comments.comment_date_gmt $order\";\n\t\t\t}\n\n\t\t\t// To ensure determinate sorting, always include a comment_ID clause.\n\t\t\tif ( ! $found_orderby_comment_ID ) {\n\t\t\t\t$comment_ID_order = '';\n\n\t\t\t\t// Inherit order from comment_date or comment_date_gmt, if available.\n\t\t\t\tforeach ( $orderby_array as $orderby_clause ) {\n\t\t\t\t\tif ( preg_match( '/comment_date(?:_gmt)*\\ (ASC|DESC)/', $orderby_clause, $match ) ) {\n\t\t\t\t\t\t$comment_ID_order = $match[1];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If no date-related order is available, use the date from the first available clause.\n\t\t\t\tif ( ! $comment_ID_order ) {\n\t\t\t\t\tforeach ( $orderby_array as $orderby_clause ) {\n\t\t\t\t\t\tif ( false !== strpos( 'ASC', $orderby_clause ) ) {\n\t\t\t\t\t\t\t$comment_ID_order = 'ASC';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$comment_ID_order = 'DESC';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Default to DESC.\n\t\t\t\tif ( ! $comment_ID_order ) {\n\t\t\t\t\t$comment_ID_order = 'DESC';\n\t\t\t\t}\n\n\t\t\t\t$orderby_array[] = \"$wpdb->comments.comment_ID $comment_ID_order\";\n\t\t\t}\n\n\t\t\t$orderby = implode( ', ', $orderby_array );\n\t\t} else {\n\t\t\t$orderby = \"$wpdb->comments.comment_date_gmt $order\";\n\t\t}\n\n\t\t$number = absint( $this->query_vars['number'] );\n\t\t$offset = absint( $this->query_vars['offset'] );\n\n\t\tif ( ! empty( $number ) ) {\n\t\t\tif ( $offset ) {\n\t\t\t\t$limits = 'LIMIT ' . $offset . ',' . $number;\n\t\t\t} else {\n\t\t\t\t$limits = 'LIMIT ' . $number;\n\t\t\t}\n\t\t}\n\n\t\tif ( $this->query_vars['count'] ) {\n\t\t\t$fields = 'COUNT(*)';\n\t\t} else {\n\t\t\t$fields = \"$wpdb->comments.comment_ID\";\n\t\t}\n\n\t\t$post_id = absint( $this->query_vars['post_id'] );\n\t\tif ( ! empty( $post_id ) ) {\n\t\t\t$this->sql_clauses['where']['post_id'] = $wpdb->prepare( 'comment_post_ID = %d', $post_id );\n\t\t}\n\n\t\t// Parse comment IDs for an IN clause.\n\t\tif ( ! empty( $this->query_vars['comment__in'] ) ) {\n\t\t\t$this->sql_clauses['where']['comment__in'] = \"$wpdb->comments.comment_ID IN ( \" . implode( ',', wp_parse_id_list( $this->query_vars['comment__in'] ) ) . ' )';\n\t\t}\n\n\t\t// Parse comment IDs for a NOT IN clause.\n\t\tif ( ! empty( $this->query_vars['comment__not_in'] ) ) {\n\t\t\t$this->sql_clauses['where']['comment__not_in'] = \"$wpdb->comments.comment_ID NOT IN ( \" . implode( ',', wp_parse_id_list( $this->query_vars['comment__not_in'] ) ) . ' )';\n\t\t}\n\n\t\t// Parse comment parent IDs for an IN clause.\n\t\tif ( ! empty( $this->query_vars['parent__in'] ) ) {\n\t\t\t$this->sql_clauses['where']['parent__in'] = 'comment_parent IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__in'] ) ) . ' )';\n\t\t}\n\n\t\t// Parse comment parent IDs for a NOT IN clause.\n\t\tif ( ! empty( $this->query_vars['parent__not_in'] ) ) {\n\t\t\t$this->sql_clauses['where']['parent__not_in'] = 'comment_parent NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__not_in'] ) ) . ' )';\n\t\t}\n\n\t\t// Parse comment post IDs for an IN clause.\n\t\tif ( ! empty( $this->query_vars['post__in'] ) ) {\n\t\t\t$this->sql_clauses['where']['post__in'] = 'comment_post_ID IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__in'] ) ) . ' )';\n\t\t}\n\n\t\t// Parse comment post IDs for a NOT IN clause.\n\t\tif ( ! empty( $this->query_vars['post__not_in'] ) ) {\n\t\t\t$this->sql_clauses['where']['post__not_in'] = 'comment_post_ID NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__not_in'] ) ) . ' )';\n\t\t}\n\n\t\tif ( '' !== $this->query_vars['author_email'] ) {\n\t\t\t$this->sql_clauses['where']['author_email'] = $wpdb->prepare( 'comment_author_email = %s', $this->query_vars['author_email'] );\n\t\t}\n\n\t\tif ( '' !== $this->query_vars['karma'] ) {\n\t\t\t$this->sql_clauses['where']['karma'] = $wpdb->prepare( 'comment_karma = %d', $this->query_vars['karma'] );\n\t\t}\n\n\t\t// Filtering by comment_type: 'type', 'type__in', 'type__not_in'.\n\t\t$raw_types = array(\n\t\t\t'IN' => array_merge( (array) $this->query_vars['type'], (array) $this->query_vars['type__in'] ),\n\t\t\t'NOT IN' => (array) $this->query_vars['type__not_in'],\n\t\t);\n\n\t\t$comment_types = array();\n\t\tforeach ( $raw_types as $operator => $_raw_types ) {\n\t\t\t$_raw_types = array_unique( $_raw_types );\n\n\t\t\tforeach ( $_raw_types as $type ) {\n\t\t\t\tswitch ( $type ) {\n\t\t\t\t\t// An empty translates to 'all', for backward compatibility\n\t\t\t\t\tcase '':\n\t\t\t\t\tcase 'all' :\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'comment':\n\t\t\t\t\tcase 'comments':\n\t\t\t\t\t\t$comment_types[ $operator ][] = \"''\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'pings':\n\t\t\t\t\t\t$comment_types[ $operator ][] = \"'pingback'\";\n\t\t\t\t\t\t$comment_types[ $operator ][] = \"'trackback'\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$comment_types[ $operator ][] = $wpdb->prepare( '%s', $type );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! empty( $comment_types[ $operator ] ) ) {\n\t\t\t\t$types_sql = implode( ', ', $comment_types[ $operator ] );\n\t\t\t\t$this->sql_clauses['where']['comment_type__' . strtolower( str_replace( ' ', '_', $operator ) ) ] = \"comment_type $operator ($types_sql)\";\n\t\t\t}\n\t\t}\n\n\t\tif ( $this->query_vars['hierarchical'] && ! $this->query_vars['parent'] ) {\n\t\t\t$this->query_vars['parent'] = 0;\n\t\t}\n\n\t\tif ( '' !== $this->query_vars['parent'] ) {\n\t\t\t$this->sql_clauses['where']['parent'] = $wpdb->prepare( 'comment_parent = %d', $this->query_vars['parent'] );\n\t\t}\n\n\t\tif ( is_array( $this->query_vars['user_id'] ) ) {\n\t\t\t$this->sql_clauses['where']['user_id'] = 'user_id IN (' . implode( ',', array_map( 'absint', $this->query_vars['user_id'] ) ) . ')';\n\t\t} elseif ( '' !== $this->query_vars['user_id'] ) {\n\t\t\t$this->sql_clauses['where']['user_id'] = $wpdb->prepare( 'user_id = %d', $this->query_vars['user_id'] );\n\t\t}\n\n\t\tif ( '' !== $this->query_vars['search'] ) {\n\t\t\t$search_sql = $this->get_search_sql(\n\t\t\t\t$this->query_vars['search'],\n\t\t\t\tarray( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' )\n\t\t\t);\n\n\t\t\t// Strip leading 'AND'.\n\t\t\t$this->sql_clauses['where']['search'] = preg_replace( '/^\\s*AND\\s*/', '', $search_sql );\n\t\t}\n\n\t\t// If any post-related query vars are passed, join the posts table.\n\t\t$join_posts_table = false;\n\t\t$plucked = wp_array_slice_assoc( $this->query_vars, array( 'post_author', 'post_name', 'post_parent', 'post_status', 'post_type' ) );\n\t\t$post_fields = array_filter( $plucked );\n\n\t\tif ( ! empty( $post_fields ) ) {\n\t\t\t$join_posts_table = true;\n\t\t\tforeach ( $post_fields as $field_name => $field_value ) {\n\t\t\t\t// $field_value may be an array.\n\t\t\t\t$esses = array_fill( 0, count( (array) $field_value ), '%s' );\n\t\t\t\t$this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( \" {$wpdb->posts}.{$field_name} IN (\" . implode( ',', $esses ) . ')', $field_value );\n\t\t\t}\n\t\t}\n\n\t\t// Comment author IDs for an IN clause.\n\t\tif ( ! empty( $this->query_vars['author__in'] ) ) {\n\t\t\t$this->sql_clauses['where']['author__in'] = 'user_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__in'] ) ) . ' )';\n\t\t}\n\n\t\t// Comment author IDs for a NOT IN clause.\n\t\tif ( ! empty( $this->query_vars['author__not_in'] ) ) {\n\t\t\t$this->sql_clauses['where']['author__not_in'] = 'user_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__not_in'] ) ) . ' )';\n\t\t}\n\n\t\t// Post author IDs for an IN clause.\n\t\tif ( ! empty( $this->query_vars['post_author__in'] ) ) {\n\t\t\t$join_posts_table = true;\n\t\t\t$this->sql_clauses['where']['post_author__in'] = 'post_author IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__in'] ) ) . ' )';\n\t\t}\n\n\t\t// Post author IDs for a NOT IN clause.\n\t\tif ( ! empty( $this->query_vars['post_author__not_in'] ) ) {\n\t\t\t$join_posts_table = true;\n\t\t\t$this->sql_clauses['where']['post_author__not_in'] = 'post_author NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__not_in'] ) ) . ' )';\n\t\t}\n\n\t\t$join = '';\n\n\t\tif ( $join_posts_table ) {\n\t\t\t$join .= \"JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID\";\n\t\t}\n\n\t\tif ( ! empty( $this->meta_query_clauses ) ) {\n\t\t\t$join .= $this->meta_query_clauses['join'];\n\n\t\t\t// Strip leading 'AND'.\n\t\t\t$this->sql_clauses['where']['meta_query'] = preg_replace( '/^\\s*AND\\s*/', '', $this->meta_query_clauses['where'] );\n\n\t\t\tif ( ! $this->query_vars['count'] ) {\n\t\t\t\t$groupby = \"{$wpdb->comments}.comment_ID\";\n\t\t\t}\n\t\t}\n\n\t\t$date_query = $this->query_vars['date_query'];\n\t\tif ( ! empty( $date_query ) && is_array( $date_query ) ) {\n\t\t\t$date_query_object = new WP_Date_Query( $date_query, 'comment_date' );\n\t\t\t$this->sql_clauses['where']['date_query'] = preg_replace( '/^\\s*AND\\s*/', '', $date_query_object->get_sql() );\n\t\t}\n\n\t\t$where = implode( ' AND ', $this->sql_clauses['where'] );\n\n\t\t$pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' );\n\t\t/**\n\t\t * Filter the comment query clauses.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array            $pieces A compacted array of comment query clauses.\n\t\t * @param WP_Comment_Query &$this  Current instance of WP_Comment_Query, passed by reference.\n\t\t */\n\t\t$clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) );\n\n\t\t$fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : '';\n\t\t$join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';\n\t\t$where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';\n\t\t$orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : '';\n\t\t$limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : '';\n\t\t$groupby = isset( $clauses[ 'groupby' ] ) ? $clauses[ 'groupby' ] : '';\n\n\t\t$this->filtered_where_clause = $where;\n\n\t\tif ( $where ) {\n\t\t\t$where = 'WHERE ' . $where;\n\t\t}\n\n\t\tif ( $groupby ) {\n\t\t\t$groupby = 'GROUP BY ' . $groupby;\n\t\t}\n\n\t\tif ( $orderby ) {\n\t\t\t$orderby = \"ORDER BY $orderby\";\n\t\t}\n\n\t\t$found_rows = '';\n\t\tif ( ! $this->query_vars['no_found_rows'] ) {\n\t\t\t$found_rows = 'SQL_CALC_FOUND_ROWS';\n\t\t}\n\n\t\t$this->sql_clauses['select']  = \"SELECT $found_rows $fields\";\n\t\t$this->sql_clauses['from']    = \"FROM $wpdb->comments $join\";\n\t\t$this->sql_clauses['groupby'] = $groupby;\n\t\t$this->sql_clauses['orderby'] = $orderby;\n\t\t$this->sql_clauses['limits']  = $limits;\n\n\t\t$this->request = \"{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}\";\n\n\t\tif ( $this->query_vars['count'] ) {\n\t\t\treturn intval( $wpdb->get_var( $this->request ) );\n\t\t} else {\n\t\t\t$comment_ids = $wpdb->get_col( $this->request );\n\t\t\treturn array_map( 'intval', $comment_ids );\n\t\t}\n\t}\n\n\t/**\n\t * Fetch descendants for located comments.\n\t *\n\t * Instead of calling `get_children()` separately on each child comment, we do a single set of queries to fetch\n\t * the descendant trees for all matched top-level comments.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $comments Array of top-level comments whose descendants should be filled in.\n\t * @return array\n\t */\n\tprotected function fill_descendants( $comments ) {\n\t\tglobal $wpdb;\n\n\t\t$levels = array(\n\t\t\t0 => wp_list_pluck( $comments, 'comment_ID' ),\n\t\t);\n\n\t\t/*\n\t\t * The WHERE clause for the descendant query is the same as for the top-level\n\t\t * query, minus the `parent`, `parent__in`, and `parent__not_in` sub-clauses.\n\t\t */\n\t\t$_where = $this->filtered_where_clause;\n\t\t$exclude_keys = array( 'parent', 'parent__in', 'parent__not_in' );\n\t\tforeach ( $exclude_keys as $exclude_key ) {\n\t\t\tif ( isset( $this->sql_clauses['where'][ $exclude_key ] ) ) {\n\t\t\t\t$clause = $this->sql_clauses['where'][ $exclude_key ];\n\n\t\t\t\t// Strip the clause as well as any adjacent ANDs.\n\t\t\t\t$pattern = '|(?:AND)?\\s*' . $clause . '\\s*(?:AND)?|';\n\t\t\t\t$_where_parts = preg_split( $pattern, $_where );\n\n\t\t\t\t// Remove empties.\n\t\t\t\t$_where_parts = array_filter( array_map( 'trim', $_where_parts ) );\n\n\t\t\t\t// Reassemble with an AND.\n\t\t\t\t$_where = implode( ' AND ', $_where_parts );\n\t\t\t}\n\t\t}\n\n\t\t// Fetch an entire level of the descendant tree at a time.\n\t\t$level = 0;\n\t\tdo {\n\t\t\t$parent_ids = $levels[ $level ];\n\t\t\tif ( ! $parent_ids ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$where = 'WHERE ' . $_where . ' AND comment_parent IN (' . implode( ',', array_map( 'intval', $parent_ids ) ) . ')';\n\t\t\t$comment_ids = $wpdb->get_col( \"{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} ORDER BY comment_date_gmt ASC, comment_ID ASC\" );\n\n\t\t\t$level++;\n\t\t\t$levels[ $level ] = $comment_ids;\n\t\t} while ( $comment_ids );\n\n\t\t// Prime comment caches for non-top-level comments.\n\t\t$descendant_ids = array();\n\t\tfor ( $i = 1; $i < count( $levels ); $i++ ) {\n\t\t\t$descendant_ids = array_merge( $descendant_ids, $levels[ $i ] );\n\t\t}\n\n\t\t_prime_comment_caches( $descendant_ids, $this->query_vars['update_comment_meta_cache'] );\n\n\t\t// Assemble a flat array of all comments + descendants.\n\t\t$all_comments = $comments;\n\t\tforeach ( $descendant_ids as $descendant_id ) {\n\t\t\t$all_comments[] = get_comment( $descendant_id );\n\t\t}\n\n\t\t// If a threaded representation was requested, build the tree.\n\t\tif ( 'threaded' === $this->query_vars['hierarchical'] ) {\n\t\t\t$threaded_comments = $ref = array();\n\t\t\tforeach ( $all_comments as $k => $c ) {\n\t\t\t\t$_c = get_comment( $c->comment_ID );\n\n\t\t\t\t// If the comment isn't in the reference array, it goes in the top level of the thread.\n\t\t\t\tif ( ! isset( $ref[ $c->comment_parent ] ) ) {\n\t\t\t\t\t$threaded_comments[ $_c->comment_ID ] = $_c;\n\t\t\t\t\t$ref[ $_c->comment_ID ] = $threaded_comments[ $_c->comment_ID ];\n\n\t\t\t\t// Otherwise, set it as a child of its parent.\n\t\t\t\t} else {\n\n\t\t\t\t\t$ref[ $_c->comment_parent ]->add_child( $_c );\n\t\t\t\t\t$ref[ $_c->comment_ID ] = $ref[ $_c->comment_parent ]->get_child( $_c->comment_ID );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the 'populated_children' flag, to ensure additional database queries aren't run.\n\t\t\tforeach ( $ref as $_ref ) {\n\t\t\t\t$_ref->populated_children( true );\n\t\t\t}\n\n\t\t\t$comments = $threaded_comments;\n\t\t} else {\n\t\t\t$comments = $all_comments;\n\t\t}\n\n\t\treturn $comments;\n\t}\n\n\t/**\n\t * Used internally to generate an SQL string for searching across multiple columns\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $string\n\t * @param array $cols\n\t * @return string\n\t */\n\tprotected function get_search_sql( $string, $cols ) {\n\t\tglobal $wpdb;\n\n\t\t$like = '%' . $wpdb->esc_like( $string ) . '%';\n\n\t\t$searches = array();\n\t\tforeach ( $cols as $col ) {\n\t\t\t$searches[] = $wpdb->prepare( \"$col LIKE %s\", $like );\n\t\t}\n\n\t\treturn ' AND (' . implode(' OR ', $searches) . ')';\n\t}\n\n\t/**\n\t * Parse and sanitize 'orderby' keys passed to the comment query.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $orderby Alias for the field to order by.\n\t * @return string|false Value to used in the ORDER clause. False otherwise.\n\t */\n\tprotected function parse_orderby( $orderby ) {\n\t\tglobal $wpdb;\n\n\t\t$allowed_keys = array(\n\t\t\t'comment_agent',\n\t\t\t'comment_approved',\n\t\t\t'comment_author',\n\t\t\t'comment_author_email',\n\t\t\t'comment_author_IP',\n\t\t\t'comment_author_url',\n\t\t\t'comment_content',\n\t\t\t'comment_date',\n\t\t\t'comment_date_gmt',\n\t\t\t'comment_ID',\n\t\t\t'comment_karma',\n\t\t\t'comment_parent',\n\t\t\t'comment_post_ID',\n\t\t\t'comment_type',\n\t\t\t'user_id',\n\t\t);\n\n\t\tif ( ! empty( $this->query_vars['meta_key'] ) ) {\n\t\t\t$allowed_keys[] = $this->query_vars['meta_key'];\n\t\t\t$allowed_keys[] = 'meta_value';\n\t\t\t$allowed_keys[] = 'meta_value_num';\n\t\t}\n\n\t\t$meta_query_clauses = $this->meta_query->get_clauses();\n\t\tif ( $meta_query_clauses ) {\n\t\t\t$allowed_keys = array_merge( $allowed_keys, array_keys( $meta_query_clauses ) );\n\t\t}\n\n\t\t$parsed = false;\n\t\tif ( $orderby == $this->query_vars['meta_key'] || $orderby == 'meta_value' ) {\n\t\t\t$parsed = \"$wpdb->commentmeta.meta_value\";\n\t\t} elseif ( $orderby == 'meta_value_num' ) {\n\t\t\t$parsed = \"$wpdb->commentmeta.meta_value+0\";\n\t\t} elseif ( $orderby == 'comment__in' ) {\n\t\t\t$comment__in = implode( ',', array_map( 'absint', $this->query_vars['comment__in'] ) );\n\t\t\t$parsed = \"FIELD( {$wpdb->comments}.comment_ID, $comment__in )\";\n\t\t} elseif ( in_array( $orderby, $allowed_keys ) ) {\n\n\t\t\tif ( isset( $meta_query_clauses[ $orderby ] ) ) {\n\t\t\t\t$meta_clause = $meta_query_clauses[ $orderby ];\n\t\t\t\t$parsed = sprintf( \"CAST(%s.meta_value AS %s)\", esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) );\n\t\t\t} else {\n\t\t\t\t$parsed = \"$wpdb->comments.$orderby\";\n\t\t\t}\n\t\t}\n\n\t\treturn $parsed;\n\t}\n\n\t/**\n\t * Parse an 'order' query variable and cast it to ASC or DESC as necessary.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $order The 'order' query variable.\n\t * @return string The sanitized 'order' query variable.\n\t */\n\tprotected function parse_order( $order ) {\n\t\tif ( ! is_string( $order ) || empty( $order ) ) {\n\t\t\treturn 'DESC';\n\t\t}\n\n\t\tif ( 'ASC' === strtoupper( $order ) ) {\n\t\t\treturn 'ASC';\n\t\t} else {\n\t\t\treturn 'DESC';\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-comment.php",
    "content": "<?php\n/**\n * Comment API: WP_Comment class\n *\n * @package WordPress\n * @subpackage Comments\n * @since 4.4.0\n */\n\n/**\n * Core class used to organize comments as instantiated objects with defined members.\n *\n * @since 4.4.0\n */\nfinal class WP_Comment {\n\n\t/**\n\t * Comment ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $comment_ID;\n\n\t/**\n\t * ID of the post the comment is associated with.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $comment_post_ID = 0;\n\n\t/**\n\t * Comment author ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_author = '';\n\n\t/**\n\t * Comment author email address.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_author_email = '';\n\n\t/**\n\t * Comment author URL.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_author_url = '';\n\n\t/**\n\t * Comment author IP address (IPv4 format).\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_author_IP = '';\n\n\t/**\n\t * Comment date in YYYY-MM-DD HH:MM:SS format.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_date = '0000-00-00 00:00:00';\n\n\t/**\n\t * Comment GMT date in YYYY-MM-DD HH::MM:SS format.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_date_gmt = '0000-00-00 00:00:00';\n\n\t/**\n\t * Comment content.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_content;\n\n\t/**\n\t * Comment karma count.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $comment_karma = 0;\n\n\t/**\n\t * Comment approval status.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_approved = '1';\n\n\t/**\n\t * Comment author HTTP user agent.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_agent = '';\n\n\t/**\n\t * Comment type.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comment_type = '';\n\n\t/**\n\t * Parent comment ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $comment_parent = 0;\n\n\t/**\n\t * Comment author ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $user_id = 0;\n\n\t/**\n\t * Comment children.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $children;\n\n\t/**\n\t * Whether children have been populated for this comment object.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $populated_children = false;\n\n\t/**\n\t * Post fields.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $post_fields = array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_content_filtered', 'post_parent', 'guid', 'menu_order', 'post_type', 'post_mime_type', 'comment_count' );\n\n\t/**\n\t * Retrieves a WP_Comment instance.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @static\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param int $id Comment ID.\n\t * @return WP_Comment|false Comment object, otherwise false.\n\t */\n\tpublic static function get_instance( $id ) {\n\t\tglobal $wpdb;\n\n\t\t$comment_id = (int) $id;\n\t\tif ( ! $comment_id ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$_comment = wp_cache_get( $comment_id, 'comment' );\n\n\t\tif ( ! $_comment ) {\n\t\t\t$_comment = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1\", $comment_id ) );\n\n\t\t\tif ( ! $_comment ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\twp_cache_add( $_comment->comment_ID, $_comment, 'comment' );\n\t\t}\n\n\t\treturn new WP_Comment( $_comment );\n\t}\n\n\t/**\n\t * Constructor.\n\t *\n\t * Populates properties with object vars.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_Comment $comment Comment object.\n\t */\n\tpublic function __construct( $comment ) {\n\t\tforeach ( get_object_vars( $comment ) as $key => $value ) {\n\t\t\t$this->$key = $value;\n\t\t}\n\t}\n\n\t/**\n\t * Convert object to array.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Object as array.\n\t */\n\tpublic function to_array() {\n\t\treturn get_object_vars( $this );\n\t}\n\n\t/**\n\t * Get the children of a comment.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $args {\n\t *     Array of arguments used to pass to get_comments() and determine format.\n\t *\n\t *     @type string $format        Return value format. 'tree' for a hierarchical tree, 'flat' for a flattened array.\n\t *                                 Default 'tree'.\n\t *     @type string $status        Comment status to limit results by. Accepts 'hold' (`comment_status=0`),\n\t *                                 'approve' (`comment_status=1`), 'all', or a custom comment status.\n\t *                                 Default 'all'.\n\t *     @type string $hierarchical  Whether to include comment descendants in the results.\n\t *                                 'threaded' returns a tree, with each comment's children\n\t *                                 stored in a `children` property on the `WP_Comment` object.\n\t *                                 'flat' returns a flat array of found comments plus their children.\n\t *                                 Pass `false` to leave out descendants.\n\t *                                 The parameter is ignored (forced to `false`) when `$fields` is 'ids' or 'counts'.\n\t *                                 Accepts 'threaded', 'flat', or false. Default: 'threaded'.\n\t *     @type string|array $orderby Comment status or array of statuses. To use 'meta_value'\n\t *                                 or 'meta_value_num', `$meta_key` must also be defined.\n\t *                                 To sort by a specific `$meta_query` clause, use that\n\t *                                 clause's array key. Accepts 'comment_agent',\n\t *                                 'comment_approved', 'comment_author',\n\t *                                 'comment_author_email', 'comment_author_IP',\n\t *                                 'comment_author_url', 'comment_content', 'comment_date',\n\t *                                 'comment_date_gmt', 'comment_ID', 'comment_karma',\n\t *                                 'comment_parent', 'comment_post_ID', 'comment_type',\n\t *                                 'user_id', 'comment__in', 'meta_value', 'meta_value_num',\n\t *                                 the value of $meta_key, and the array keys of\n\t *                                 `$meta_query`. Also accepts false, an empty array, or\n\t *                                 'none' to disable `ORDER BY` clause.\n\t * }\n\t * @return array Array of `WP_Comment` objects.\n\t */\n\tpublic function get_children( $args = array() ) {\n\t\t$defaults = array(\n\t\t\t'format' => 'tree',\n\t\t\t'status' => 'all',\n\t\t\t'hierarchical' => 'threaded',\n\t\t\t'orderby' => '',\n\t\t);\n\n\t\t$_args = wp_parse_args( $args, $defaults );\n\t\t$_args['parent'] = $this->comment_ID;\n\n\t\tif ( is_null( $this->children ) ) {\n\t\t\tif ( $this->populated_children ) {\n\t\t\t\t$this->children = array();\n\t\t\t} else {\n\t\t\t\t$this->children = get_comments( $_args );\n\t\t\t}\n\t\t}\n\n\t\tif ( 'flat' === $_args['format'] ) {\n\t\t\t$children = array();\n\t\t\tforeach ( $this->children as $child ) {\n\t\t\t\t$child_args = $_args;\n\t\t\t\t$child_args['format'] = 'flat';\n\t\t\t\t// get_children() resets this value automatically.\n\t\t\t\tunset( $child_args['parent'] );\n\n\t\t\t\t$children = array_merge( $children, array( $child ), $child->get_children( $child_args ) );\n\t\t\t}\n\t\t} else {\n\t\t\t$children = $this->children;\n\t\t}\n\n\t\treturn $children;\n\t}\n\n\t/**\n\t * Add a child to the comment.\n\t *\n\t * Used by `WP_Comment_Query` when bulk-filling descendants.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_Comment $child Child comment.\n\t */\n\tpublic function add_child( WP_Comment $child ) {\n\t\t$this->children[ $child->comment_ID ] = $child;\n\t}\n\n\t/**\n\t * Get a child comment by ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param int $child_id ID of the child.\n\t * @return WP_Comment|bool Returns the comment object if found, otherwise false.\n\t */\n\tpublic function get_child( $child_id ) {\n\t\tif ( isset( $this->children[ $child_id ] ) ) {\n\t\t\treturn $this->children[ $child_id ];\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Set the 'populated_children' flag.\n\t *\n\t * This flag is important for ensuring that calling `get_children()` on a childless comment will not trigger\n\t * unneeded database queries.\n\t *\n\t * @since 4.4.0\n\t */\n\tpublic function populated_children( $set ) {\n\t\t$this->populated_children = (bool) $set;\n\t}\n\n\t/**\n\t * Check whether a non-public property is set.\n\t *\n\t * If `$name` matches a post field, the comment post will be loaded and the post's value checked.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $name Property name.\n\t * @return bool\n\t */\n\tpublic function __isset( $name ) {\n\t\tif ( in_array( $name, $this->post_fields ) && 0 !== (int) $this->comment_post_ID ) {\n\t\t\t$post = get_post( $this->comment_post_ID );\n\t\t\treturn property_exists( $post, $name );\n\t\t}\n\t}\n\n\t/**\n\t * Magic getter.\n\t *\n\t * If `$name` matches a post field, the comment post will be loaded and the post's value returned.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $name\n\t * @return mixed\n\t */\n\tpublic function __get( $name ) {\n\t\tif ( in_array( $name, $this->post_fields ) ) {\n\t\t\t$post = get_post( $this->comment_post_ID );\n\t\t\treturn $post->$name;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-customize-control.php",
    "content": "<?php\n/**\n * WordPress Customize Control classes\n *\n * @package WordPress\n * @subpackage Customize\n * @since 3.4.0\n */\n\n/**\n * Customize Control class.\n *\n * @since 3.4.0\n */\nclass WP_Customize_Control {\n\n\t/**\n\t * Incremented with each new class instantiation, then stored in $instance_number.\n\t *\n\t * Used when sorting two instances whose priorities are equal.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @static\n\t * @access protected\n\t * @var int\n\t */\n\tprotected static $instance_count = 0;\n\n\t/**\n\t * Order in which this instance was created in relation to other instances.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $instance_number;\n\n\t/**\n\t * @access public\n\t * @var WP_Customize_Manager\n\t */\n\tpublic $manager;\n\n\t/**\n\t * @access public\n\t * @var string\n\t */\n\tpublic $id;\n\n\t/**\n\t * All settings tied to the control.\n\t *\n\t * @access public\n\t * @var array\n\t */\n\tpublic $settings;\n\n\t/**\n\t * The primary setting for the control (if there is one).\n\t *\n\t * @access public\n\t * @var string\n\t */\n\tpublic $setting = 'default';\n\n\t/**\n\t * @access public\n\t * @var int\n\t */\n\tpublic $priority = 10;\n\n\t/**\n\t * @access public\n\t * @var string\n\t */\n\tpublic $section = '';\n\n\t/**\n\t * @access public\n\t * @var string\n\t */\n\tpublic $label = '';\n\n\t/**\n\t * @access public\n\t * @var string\n\t */\n\tpublic $description = '';\n\n\t/**\n\t * @todo: Remove choices\n\t *\n\t * @access public\n\t * @var array\n\t */\n\tpublic $choices = array();\n\n\t/**\n\t * @access public\n\t * @var array\n\t */\n\tpublic $input_attrs = array();\n\n\t/**\n\t * @deprecated It is better to just call the json() method\n\t * @access public\n\t * @var array\n\t */\n\tpublic $json = array();\n\n\t/**\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'text';\n\n\t/**\n\t * Callback.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Control::active()\n\t *\n\t * @var callable Callback is called with one argument, the instance of\n\t *               WP_Customize_Control, and returns bool to indicate whether\n\t *               the control is active (such as it relates to the URL\n\t *               currently being previewed).\n\t */\n\tpublic $active_callback = '';\n\n\t/**\n\t * Constructor.\n\t *\n\t * Supplied $args override class property defaults.\n\t *\n\t * If $args['settings'] is not defined, use the $id as the setting ID.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t * @param string               $id      Control ID.\n\t * @param array                $args    Optional. Arguments to override class property defaults.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\t$keys = array_keys( get_object_vars( $this ) );\n\t\tforeach ( $keys as $key ) {\n\t\t\tif ( isset( $args[ $key ] ) ) {\n\t\t\t\t$this->$key = $args[ $key ];\n\t\t\t}\n\t\t}\n\n\t\t$this->manager = $manager;\n\t\t$this->id = $id;\n\t\tif ( empty( $this->active_callback ) ) {\n\t\t\t$this->active_callback = array( $this, 'active_callback' );\n\t\t}\n\t\tself::$instance_count += 1;\n\t\t$this->instance_number = self::$instance_count;\n\n\t\t// Process settings.\n\t\tif ( empty( $this->settings ) ) {\n\t\t\t$this->settings = $id;\n\t\t}\n\n\t\t$settings = array();\n\t\tif ( is_array( $this->settings ) ) {\n\t\t\tforeach ( $this->settings as $key => $setting ) {\n\t\t\t\t$settings[ $key ] = $this->manager->get_setting( $setting );\n\t\t\t}\n\t\t} else {\n\t\t\t$this->setting = $this->manager->get_setting( $this->settings );\n\t\t\t$settings['default'] = $this->setting;\n\t\t}\n\t\t$this->settings = $settings;\n\t}\n\n\t/**\n\t * Enqueue control related scripts/styles.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function enqueue() {}\n\n\t/**\n\t * Check whether control is active to current Customizer preview.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @return bool Whether the control is active to the current preview.\n\t */\n\tfinal public function active() {\n\t\t$control = $this;\n\t\t$active = call_user_func( $this->active_callback, $this );\n\n\t\t/**\n\t\t * Filter response of WP_Customize_Control::active().\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @param bool                 $active  Whether the Customizer control is active.\n\t\t * @param WP_Customize_Control $control WP_Customize_Control instance.\n\t\t */\n\t\t$active = apply_filters( 'customize_control_active', $active, $control );\n\n\t\treturn $active;\n\t}\n\n\t/**\n\t * Default callback used when invoking WP_Customize_Control::active().\n\t *\n\t * Subclasses can override this with their specific logic, or they may\n\t * provide an 'active_callback' argument to the constructor.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @return true Always true.\n\t */\n\tpublic function active_callback() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Fetch a setting's value.\n\t * Grabs the main setting by default.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $setting_key\n\t * @return mixed The requested setting's value, if the setting exists.\n\t */\n\tfinal public function value( $setting_key = 'default' ) {\n\t\tif ( isset( $this->settings[ $setting_key ] ) ) {\n\t\t\treturn $this->settings[ $setting_key ]->value();\n\t\t}\n\t}\n\n\t/**\n\t * Refresh the parameters passed to the JavaScript via JSON.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function to_json() {\n\t\t$this->json['settings'] = array();\n\t\tforeach ( $this->settings as $key => $setting ) {\n\t\t\t$this->json['settings'][ $key ] = $setting->id;\n\t\t}\n\n\t\t$this->json['type'] = $this->type;\n\t\t$this->json['priority'] = $this->priority;\n\t\t$this->json['active'] = $this->active();\n\t\t$this->json['section'] = $this->section;\n\t\t$this->json['content'] = $this->get_content();\n\t\t$this->json['label'] = $this->label;\n\t\t$this->json['description'] = $this->description;\n\t\t$this->json['instanceNumber'] = $this->instance_number;\n\t}\n\n\t/**\n\t * Get the data to export to the client via JSON.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @return array Array of parameters passed to the JavaScript.\n\t */\n\tpublic function json() {\n\t\t$this->to_json();\n\t\treturn $this->json;\n\t}\n\n\t/**\n\t * Check if the theme supports the control and check user capabilities.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true.\n\t */\n\tfinal public function check_capabilities() {\n\t\tforeach ( $this->settings as $setting ) {\n\t\t\tif ( ! $setting->check_capabilities() )\n\t\t\t\treturn false;\n\t\t}\n\n\t\t$section = $this->manager->get_section( $this->section );\n\t\tif ( isset( $section ) && ! $section->check_capabilities() )\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get the control's content for insertion into the Customizer pane.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @return string Contents of the control.\n\t */\n\tfinal public function get_content() {\n\t\tob_start();\n\t\t$this->maybe_render();\n\t\treturn trim( ob_get_clean() );\n\t}\n\n\t/**\n\t * Check capabilities and render the control.\n\t *\n\t * @since 3.4.0\n\t * @uses WP_Customize_Control::render()\n\t */\n\tfinal public function maybe_render() {\n\t\tif ( ! $this->check_capabilities() )\n\t\t\treturn;\n\n\t\t/**\n\t\t * Fires just before the current Customizer control is rendered.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Control $this WP_Customize_Control instance.\n\t\t */\n\t\tdo_action( 'customize_render_control', $this );\n\n\t\t/**\n\t\t * Fires just before a specific Customizer control is rendered.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$this->id`, refers to\n\t\t * the control ID.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Control $this {@see WP_Customize_Control} instance.\n\t\t */\n\t\tdo_action( 'customize_render_control_' . $this->id, $this );\n\n\t\t$this->render();\n\t}\n\n\t/**\n\t * Renders the control wrapper and calls $this->render_content() for the internals.\n\t *\n\t * @since 3.4.0\n\t */\n\tprotected function render() {\n\t\t$id    = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id );\n\t\t$class = 'customize-control customize-control-' . $this->type;\n\n\t\t?><li id=\"<?php echo esc_attr( $id ); ?>\" class=\"<?php echo esc_attr( $class ); ?>\">\n\t\t\t<?php $this->render_content(); ?>\n\t\t</li><?php\n\t}\n\n\t/**\n\t * Get the data link attribute for a setting.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $setting_key\n\t * @return string Data link parameter, if $setting_key is a valid setting, empty string otherwise.\n\t */\n\tpublic function get_link( $setting_key = 'default' ) {\n\t\tif ( ! isset( $this->settings[ $setting_key ] ) )\n\t\t\treturn '';\n\n\t\treturn 'data-customize-setting-link=\"' . esc_attr( $this->settings[ $setting_key ]->id ) . '\"';\n\t}\n\n\t/**\n\t * Render the data link attribute for the control's input element.\n\t *\n\t * @since 3.4.0\n\t * @uses WP_Customize_Control::get_link()\n\t *\n\t * @param string $setting_key\n\t */\n\tpublic function link( $setting_key = 'default' ) {\n\t\techo $this->get_link( $setting_key );\n\t}\n\n\t/**\n\t * Render the custom attributes for the control's input element.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t */\n\tpublic function input_attrs() {\n\t\tforeach ( $this->input_attrs as $attr => $value ) {\n\t\t\techo $attr . '=\"' . esc_attr( $value ) . '\" ';\n\t\t}\n\t}\n\n\t/**\n\t * Render the control's content.\n\t *\n\t * Allows the content to be overriden without having to rewrite the wrapper in $this->render().\n\t *\n\t * Supports basic input types `text`, `checkbox`, `textarea`, `radio`, `select` and `dropdown-pages`.\n\t * Additional input types such as `email`, `url`, `number`, `hidden` and `date` are supported implicitly.\n\t *\n\t * Control content can alternately be rendered in JS. See {@see WP_Customize_Control::print_template()}.\n\t *\n\t * @since 3.4.0\n\t */\n\tprotected function render_content() {\n\t\tswitch( $this->type ) {\n\t\t\tcase 'checkbox':\n\t\t\t\t?>\n\t\t\t\t<label>\n\t\t\t\t\t<input type=\"checkbox\" value=\"<?php echo esc_attr( $this->value() ); ?>\" <?php $this->link(); checked( $this->value() ); ?> />\n\t\t\t\t\t<?php echo esc_html( $this->label ); ?>\n\t\t\t\t\t<?php if ( ! empty( $this->description ) ) : ?>\n\t\t\t\t\t\t<span class=\"description customize-control-description\"><?php echo $this->description; ?></span>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t</label>\n\t\t\t\t<?php\n\t\t\t\tbreak;\n\t\t\tcase 'radio':\n\t\t\t\tif ( empty( $this->choices ) )\n\t\t\t\t\treturn;\n\n\t\t\t\t$name = '_customize-radio-' . $this->id;\n\n\t\t\t\tif ( ! empty( $this->label ) ) : ?>\n\t\t\t\t\t<span class=\"customize-control-title\"><?php echo esc_html( $this->label ); ?></span>\n\t\t\t\t<?php endif;\n\t\t\t\tif ( ! empty( $this->description ) ) : ?>\n\t\t\t\t\t<span class=\"description customize-control-description\"><?php echo $this->description ; ?></span>\n\t\t\t\t<?php endif;\n\n\t\t\t\tforeach ( $this->choices as $value => $label ) :\n\t\t\t\t\t?>\n\t\t\t\t\t<label>\n\t\t\t\t\t\t<input type=\"radio\" value=\"<?php echo esc_attr( $value ); ?>\" name=\"<?php echo esc_attr( $name ); ?>\" <?php $this->link(); checked( $this->value(), $value ); ?> />\n\t\t\t\t\t\t<?php echo esc_html( $label ); ?><br/>\n\t\t\t\t\t</label>\n\t\t\t\t\t<?php\n\t\t\t\tendforeach;\n\t\t\t\tbreak;\n\t\t\tcase 'select':\n\t\t\t\tif ( empty( $this->choices ) )\n\t\t\t\t\treturn;\n\n\t\t\t\t?>\n\t\t\t\t<label>\n\t\t\t\t\t<?php if ( ! empty( $this->label ) ) : ?>\n\t\t\t\t\t\t<span class=\"customize-control-title\"><?php echo esc_html( $this->label ); ?></span>\n\t\t\t\t\t<?php endif;\n\t\t\t\t\tif ( ! empty( $this->description ) ) : ?>\n\t\t\t\t\t\t<span class=\"description customize-control-description\"><?php echo $this->description; ?></span>\n\t\t\t\t\t<?php endif; ?>\n\n\t\t\t\t\t<select <?php $this->link(); ?>>\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\tforeach ( $this->choices as $value => $label )\n\t\t\t\t\t\t\techo '<option value=\"' . esc_attr( $value ) . '\"' . selected( $this->value(), $value, false ) . '>' . $label . '</option>';\n\t\t\t\t\t\t?>\n\t\t\t\t\t</select>\n\t\t\t\t</label>\n\t\t\t\t<?php\n\t\t\t\tbreak;\n\t\t\tcase 'textarea':\n\t\t\t\t?>\n\t\t\t\t<label>\n\t\t\t\t\t<?php if ( ! empty( $this->label ) ) : ?>\n\t\t\t\t\t\t<span class=\"customize-control-title\"><?php echo esc_html( $this->label ); ?></span>\n\t\t\t\t\t<?php endif;\n\t\t\t\t\tif ( ! empty( $this->description ) ) : ?>\n\t\t\t\t\t\t<span class=\"description customize-control-description\"><?php echo $this->description; ?></span>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t<textarea rows=\"5\" <?php $this->link(); ?>><?php echo esc_textarea( $this->value() ); ?></textarea>\n\t\t\t\t</label>\n\t\t\t\t<?php\n\t\t\t\tbreak;\n\t\t\tcase 'dropdown-pages':\n\t\t\t\t?>\n\t\t\t\t<label>\n\t\t\t\t<?php if ( ! empty( $this->label ) ) : ?>\n\t\t\t\t\t<span class=\"customize-control-title\"><?php echo esc_html( $this->label ); ?></span>\n\t\t\t\t<?php endif;\n\t\t\t\tif ( ! empty( $this->description ) ) : ?>\n\t\t\t\t\t<span class=\"description customize-control-description\"><?php echo $this->description; ?></span>\n\t\t\t\t<?php endif; ?>\n\n\t\t\t\t<?php $dropdown = wp_dropdown_pages(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'name'              => '_customize-dropdown-pages-' . $this->id,\n\t\t\t\t\t\t'echo'              => 0,\n\t\t\t\t\t\t'show_option_none'  => __( '&mdash; Select &mdash;' ),\n\t\t\t\t\t\t'option_none_value' => '0',\n\t\t\t\t\t\t'selected'          => $this->value(),\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Hackily add in the data link parameter.\n\t\t\t\t$dropdown = str_replace( '<select', '<select ' . $this->get_link(), $dropdown );\n\t\t\t\techo $dropdown;\n\t\t\t\t?>\n\t\t\t\t</label>\n\t\t\t\t<?php\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t?>\n\t\t\t\t<label>\n\t\t\t\t\t<?php if ( ! empty( $this->label ) ) : ?>\n\t\t\t\t\t\t<span class=\"customize-control-title\"><?php echo esc_html( $this->label ); ?></span>\n\t\t\t\t\t<?php endif;\n\t\t\t\t\tif ( ! empty( $this->description ) ) : ?>\n\t\t\t\t\t\t<span class=\"description customize-control-description\"><?php echo $this->description; ?></span>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t\t<input type=\"<?php echo esc_attr( $this->type ); ?>\" <?php $this->input_attrs(); ?> value=\"<?php echo esc_attr( $this->value() ); ?>\" <?php $this->link(); ?> />\n\t\t\t\t</label>\n\t\t\t\t<?php\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Render the control's JS template.\n\t *\n\t * This function is only run for control types that have been registered with\n\t * {@see WP_Customize_Manager::register_control_type()}.\n\t *\n\t * In the future, this will also print the template for the control's container\n\t * element and be override-able.\n\t *\n\t * @since 4.1.0\n\t */\n\tfinal public function print_template() {\n\t\t?>\n\t\t<script type=\"text/html\" id=\"tmpl-customize-control-<?php echo $this->type; ?>-content\">\n\t\t\t<?php $this->content_template(); ?>\n\t\t</script>\n\t\t<?php\n\t}\n\n\t/**\n\t * An Underscore (JS) template for this control's content (but not its container).\n\t *\n\t * Class variables for this control class are available in the `data` JS object;\n\t * export custom variables by overriding {@see WP_Customize_Control::to_json()}.\n\t *\n\t * @see WP_Customize_Control::print_template()\n\t *\n\t * @since 4.1.0\n\t */\n\tprotected function content_template() {}\n\n}\n\n/** WP_Customize_Color_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php' );\n\n/** WP_Customize_Media_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php' );\n\n/** WP_Customize_Upload_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php' );\n\n/** WP_Customize_Image_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php' );\n\n/** WP_Customize_Background_Image_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php' );\n\n/** WP_Customize_Cropped_Image_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php' );\n\n/** WP_Customize_Site_Icon_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php' );\n\n/** WP_Customize_Header_Image_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php' );\n\n/** WP_Customize_Theme_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php' );\n\n/** WP_Widget_Area_Customize_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php' );\n\n/** WP_Widget_Form_Customize_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php' );\n\n/** WP_Customize_Nav_Menu_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php' );\n\n/** WP_Customize_Nav_Menu_Item_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php' );\n\n/** WP_Customize_Nav_Menu_Location_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php' );\n\n/** WP_Customize_Nav_Menu_Name_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php' );\n\n/** WP_Customize_Nav_Menu_Auto_Add_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php' );\n\n/** WP_Customize_New_Menu_Control class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-new-menu-control.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-customize-manager.php",
    "content": "<?php\n/**\n * WordPress Customize Manager classes\n *\n * @package WordPress\n * @subpackage Customize\n * @since 3.4.0\n */\n\n/**\n * Customize Manager class.\n *\n * Bootstraps the Customize experience on the server-side.\n *\n * Sets up the theme-switching process if a theme other than the active one is\n * being previewed and customized.\n *\n * Serves as a factory for Customize Controls and Settings, and\n * instantiates default Customize Controls and Settings.\n *\n * @since 3.4.0\n */\nfinal class WP_Customize_Manager {\n\t/**\n\t * An instance of the theme being previewed.\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t * @var WP_Theme\n\t */\n\tprotected $theme;\n\n\t/**\n\t * The directory name of the previously active theme (within the theme_root).\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $original_stylesheet;\n\n\t/**\n\t * Whether this is a Customizer pageload.\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $previewing = false;\n\n\t/**\n\t * Methods and properties dealing with managing widgets in the Customizer.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t * @var WP_Customize_Widgets\n\t */\n\tpublic $widgets;\n\n\t/**\n\t * Methods and properties dealing with managing nav menus in the Customizer.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var WP_Customize_Nav_Menus\n\t */\n\tpublic $nav_menus;\n\n\t/**\n\t * Registered instances of WP_Customize_Setting.\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $settings = array();\n\n\t/**\n\t * Sorted top-level instances of WP_Customize_Panel and WP_Customize_Section.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $containers = array();\n\n\t/**\n\t * Registered instances of WP_Customize_Panel.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $panels = array();\n\n\t/**\n\t * Registered instances of WP_Customize_Section.\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $sections = array();\n\n\t/**\n\t * Registered instances of WP_Customize_Control.\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $controls = array();\n\n\t/**\n\t * Return value of check_ajax_referer() in customize_preview_init() method.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t * @var false|int\n\t */\n\tprotected $nonce_tick;\n\n\t/**\n\t * Panel types that may be rendered from JS templates.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $registered_panel_types = array();\n\n\t/**\n\t * Section types that may be rendered from JS templates.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $registered_section_types = array();\n\n\t/**\n\t * Control types that may be rendered from JS templates.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $registered_control_types = array();\n\n\t/**\n\t * Initial URL being previewed.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $preview_url;\n\n\t/**\n\t * URL to link the user to when closing the Customizer.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $return_url;\n\n\t/**\n\t * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $autofocus = array();\n\n\t/**\n\t * Unsanitized values for Customize Settings parsed from $_POST['customized'].\n\t *\n\t * @var array\n\t */\n\tprivate $_post_values;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function __construct() {\n\t\trequire_once( ABSPATH . WPINC . '/class-wp-customize-setting.php' );\n\t\trequire_once( ABSPATH . WPINC . '/class-wp-customize-panel.php' );\n\t\trequire_once( ABSPATH . WPINC . '/class-wp-customize-section.php' );\n\t\trequire_once( ABSPATH . WPINC . '/class-wp-customize-control.php' );\n\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-new-menu-control.php' );\n\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php' );\n\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-new-menu-section.php' );\n\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-filter-setting.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-setting.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-setting.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-setting.php' );\n\t\trequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-setting.php' );\n\n\t\t/**\n\t\t * Filter the core Customizer components to load.\n\t\t *\n\t\t * This allows Core components to be excluded from being instantiated by\n\t\t * filtering them out of the array. Note that this filter generally runs\n\t\t * during the <code>plugins_loaded</code> action, so it cannot be added\n\t\t * in a theme.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @see WP_Customize_Manager::__construct()\n\t\t *\n\t\t * @param array                $components List of core components to load.\n\t\t * @param WP_Customize_Manager $this       WP_Customize_Manager instance.\n\t\t */\n\t\t$components = apply_filters( 'customize_loaded_components', array( 'widgets', 'nav_menus' ), $this );\n\n\t\tif ( in_array( 'widgets', $components ) ) {\n\t\t\trequire_once( ABSPATH . WPINC . '/class-wp-customize-widgets.php' );\n\t\t\t$this->widgets = new WP_Customize_Widgets( $this );\n\t\t}\n\t\tif ( in_array( 'nav_menus', $components ) ) {\n\t\t\trequire_once( ABSPATH . WPINC . '/class-wp-customize-nav-menus.php' );\n\t\t\t$this->nav_menus = new WP_Customize_Nav_Menus( $this );\n\t\t}\n\n\t\tadd_filter( 'wp_die_handler', array( $this, 'wp_die_handler' ) );\n\n\t\tadd_action( 'setup_theme', array( $this, 'setup_theme' ) );\n\t\tadd_action( 'wp_loaded',   array( $this, 'wp_loaded' ) );\n\n\t\t// Run wp_redirect_status late to make sure we override the status last.\n\t\tadd_action( 'wp_redirect_status', array( $this, 'wp_redirect_status' ), 1000 );\n\n\t\t// Do not spawn cron (especially the alternate cron) while running the Customizer.\n\t\tremove_action( 'init', 'wp_cron' );\n\n\t\t// Do not run update checks when rendering the controls.\n\t\tremove_action( 'admin_init', '_maybe_update_core' );\n\t\tremove_action( 'admin_init', '_maybe_update_plugins' );\n\t\tremove_action( 'admin_init', '_maybe_update_themes' );\n\n\t\tadd_action( 'wp_ajax_customize_save',           array( $this, 'save' ) );\n\t\tadd_action( 'wp_ajax_customize_refresh_nonces', array( $this, 'refresh_nonces' ) );\n\n\t\tadd_action( 'customize_register',                 array( $this, 'register_controls' ) );\n\t\tadd_action( 'customize_register',                 array( $this, 'register_dynamic_settings' ), 11 ); // allow code to create settings first\n\t\tadd_action( 'customize_controls_init',            array( $this, 'prepare_controls' ) );\n\t\tadd_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_control_scripts' ) );\n\n\t\t// Render Panel, Section, and Control templates.\n\t\tadd_action( 'customize_controls_print_footer_scripts', array( $this, 'render_panel_templates' ), 1 );\n\t\tadd_action( 'customize_controls_print_footer_scripts', array( $this, 'render_section_templates' ), 1 );\n\t\tadd_action( 'customize_controls_print_footer_scripts', array( $this, 'render_control_templates' ), 1 );\n\n\t\t// Export the settings to JS via the _wpCustomizeSettings variable.\n\t\tadd_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_pane_settings' ), 1000 );\n\t}\n\n\t/**\n\t * Return true if it's an AJAX request.\n\t *\n\t * @since 3.4.0\n\t * @since 4.2.0 Added `$action` param.\n\t * @access public\n\t *\n\t * @param string|null $action Whether the supplied AJAX action is being run.\n\t * @return bool True if it's an AJAX request, false otherwise.\n\t */\n\tpublic function doing_ajax( $action = null ) {\n\t\t$doing_ajax = ( defined( 'DOING_AJAX' ) && DOING_AJAX );\n\t\tif ( ! $doing_ajax ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! $action ) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\t/*\n\t\t\t * Note: we can't just use doing_action( \"wp_ajax_{$action}\" ) because we need\n\t\t\t * to check before admin-ajax.php gets to that point.\n\t\t\t */\n\t\t\treturn isset( $_REQUEST['action'] ) && wp_unslash( $_REQUEST['action'] ) === $action;\n\t\t}\n\t}\n\n\t/**\n\t * Custom wp_die wrapper. Returns either the standard message for UI\n\t * or the AJAX message.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param mixed $ajax_message AJAX return\n\t * @param mixed $message UI message\n\t */\n\tprotected function wp_die( $ajax_message, $message = null ) {\n\t\tif ( $this->doing_ajax() || isset( $_POST['customized'] ) ) {\n\t\t\twp_die( $ajax_message );\n\t\t}\n\n\t\tif ( ! $message ) {\n\t\t\t$message = __( 'Cheatin&#8217; uh?' );\n\t\t}\n\n\t\twp_die( $message );\n\t}\n\n\t/**\n\t * Return the AJAX wp_die() handler if it's a customized request.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return string\n\t */\n\tpublic function wp_die_handler() {\n\t\tif ( $this->doing_ajax() || isset( $_POST['customized'] ) ) {\n\t\t\treturn '_ajax_wp_die_handler';\n\t\t}\n\n\t\treturn '_default_wp_die_handler';\n\t}\n\n\t/**\n\t * Start preview and customize theme.\n\t *\n\t * Check if customize query variable exist. Init filters to filter the current theme.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function setup_theme() {\n\t\tsend_origin_headers();\n\n\t\t$doing_ajax_or_is_customized = ( $this->doing_ajax() || isset( $_POST['customized'] ) );\n\t\tif ( is_admin() && ! $doing_ajax_or_is_customized ) {\n\t\t\tauth_redirect();\n\t\t} elseif ( $doing_ajax_or_is_customized && ! is_user_logged_in() ) {\n\t\t\t$this->wp_die( 0, __( 'You must be logged in to complete this action.' ) );\n\t\t}\n\n\t\tshow_admin_bar( false );\n\n\t\tif ( ! current_user_can( 'customize' ) ) {\n\t\t\t$this->wp_die( -1, __( 'You are not allowed to customize the appearance of this site.' ) );\n\t\t}\n\n\t\t$this->original_stylesheet = get_stylesheet();\n\n\t\t$this->theme = wp_get_theme( isset( $_REQUEST['theme'] ) ? $_REQUEST['theme'] : null );\n\n\t\tif ( $this->is_theme_active() ) {\n\t\t\t// Once the theme is loaded, we'll validate it.\n\t\t\tadd_action( 'after_setup_theme', array( $this, 'after_setup_theme' ) );\n\t\t} else {\n\t\t\t// If the requested theme is not the active theme and the user doesn't have the\n\t\t\t// switch_themes cap, bail.\n\t\t\tif ( ! current_user_can( 'switch_themes' ) ) {\n\t\t\t\t$this->wp_die( -1, __( 'You are not allowed to edit theme options on this site.' ) );\n\t\t\t}\n\n\t\t\t// If the theme has errors while loading, bail.\n\t\t\tif ( $this->theme()->errors() ) {\n\t\t\t\t$this->wp_die( -1, $this->theme()->errors()->get_error_message() );\n\t\t\t}\n\n\t\t\t// If the theme isn't allowed per multisite settings, bail.\n\t\t\tif ( ! $this->theme()->is_allowed() ) {\n\t\t\t\t$this->wp_die( -1, __( 'The requested theme does not exist.' ) );\n\t\t\t}\n\t\t}\n\n\t\t$this->start_previewing_theme();\n\t}\n\n\t/**\n\t * Callback to validate a theme once it is loaded\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function after_setup_theme() {\n\t\t$doing_ajax_or_is_customized = ( $this->doing_ajax() || isset( $_SERVER['customized'] ) );\n\t\tif ( ! $doing_ajax_or_is_customized && ! validate_current_theme() ) {\n\t\t\twp_redirect( 'themes.php?broken=true' );\n\t\t\texit;\n\t\t}\n\t}\n\n\t/**\n\t * If the theme to be previewed isn't the active theme, add filter callbacks\n\t * to swap it out at runtime.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function start_previewing_theme() {\n\t\t// Bail if we're already previewing.\n\t\tif ( $this->is_preview() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->previewing = true;\n\n\t\tif ( ! $this->is_theme_active() ) {\n\t\t\tadd_filter( 'template', array( $this, 'get_template' ) );\n\t\t\tadd_filter( 'stylesheet', array( $this, 'get_stylesheet' ) );\n\t\t\tadd_filter( 'pre_option_current_theme', array( $this, 'current_theme' ) );\n\n\t\t\t// @link: https://core.trac.wordpress.org/ticket/20027\n\t\t\tadd_filter( 'pre_option_stylesheet', array( $this, 'get_stylesheet' ) );\n\t\t\tadd_filter( 'pre_option_template', array( $this, 'get_template' ) );\n\n\t\t\t// Handle custom theme roots.\n\t\t\tadd_filter( 'pre_option_stylesheet_root', array( $this, 'get_stylesheet_root' ) );\n\t\t\tadd_filter( 'pre_option_template_root', array( $this, 'get_template_root' ) );\n\t\t}\n\n\t\t/**\n\t\t * Fires once the Customizer theme preview has started.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Manager $this WP_Customize_Manager instance.\n\t\t */\n\t\tdo_action( 'start_previewing_theme', $this );\n\t}\n\n\t/**\n\t * Stop previewing the selected theme.\n\t *\n\t * Removes filters to change the current theme.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function stop_previewing_theme() {\n\t\tif ( ! $this->is_preview() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->previewing = false;\n\n\t\tif ( ! $this->is_theme_active() ) {\n\t\t\tremove_filter( 'template', array( $this, 'get_template' ) );\n\t\t\tremove_filter( 'stylesheet', array( $this, 'get_stylesheet' ) );\n\t\t\tremove_filter( 'pre_option_current_theme', array( $this, 'current_theme' ) );\n\n\t\t\t// @link: https://core.trac.wordpress.org/ticket/20027\n\t\t\tremove_filter( 'pre_option_stylesheet', array( $this, 'get_stylesheet' ) );\n\t\t\tremove_filter( 'pre_option_template', array( $this, 'get_template' ) );\n\n\t\t\t// Handle custom theme roots.\n\t\t\tremove_filter( 'pre_option_stylesheet_root', array( $this, 'get_stylesheet_root' ) );\n\t\t\tremove_filter( 'pre_option_template_root', array( $this, 'get_template_root' ) );\n\t\t}\n\n\t\t/**\n\t\t * Fires once the Customizer theme preview has stopped.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Manager $this WP_Customize_Manager instance.\n\t\t */\n\t\tdo_action( 'stop_previewing_theme', $this );\n\t}\n\n\t/**\n\t * Get the theme being customized.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return WP_Theme\n\t */\n\tpublic function theme() {\n\t\tif ( ! $this->theme ) {\n\t\t\t$this->theme = wp_get_theme();\n\t\t}\n\t\treturn $this->theme;\n\t}\n\n\t/**\n\t * Get the registered settings.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return array\n\t */\n\tpublic function settings() {\n\t\treturn $this->settings;\n\t}\n\n\t/**\n\t * Get the registered controls.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return array\n\t */\n\tpublic function controls() {\n\t\treturn $this->controls;\n\t}\n\n\t/**\n\t * Get the registered containers.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @return array\n\t */\n\tpublic function containers() {\n\t\treturn $this->containers;\n\t}\n\n\t/**\n\t * Get the registered sections.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return array\n\t */\n\tpublic function sections() {\n\t\treturn $this->sections;\n\t}\n\n\t/**\n\t * Get the registered panels.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @return array Panels.\n\t */\n\tpublic function panels() {\n\t\treturn $this->panels;\n\t}\n\n\t/**\n\t * Checks if the current theme is active.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_theme_active() {\n\t\treturn $this->get_stylesheet() == $this->original_stylesheet;\n\t}\n\n\t/**\n\t * Register styles/scripts and initialize the preview of each setting\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function wp_loaded() {\n\n\t\t/**\n\t\t * Fires once WordPress has loaded, allowing scripts and styles to be initialized.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Manager $this WP_Customize_Manager instance.\n\t\t */\n\t\tdo_action( 'customize_register', $this );\n\n\t\tif ( $this->is_preview() && ! is_admin() )\n\t\t\t$this->customize_preview_init();\n\t}\n\n\t/**\n\t * Prevents AJAX requests from following redirects when previewing a theme\n\t * by issuing a 200 response instead of a 30x.\n\t *\n\t * Instead, the JS will sniff out the location header.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param $status\n\t * @return int\n\t */\n\tpublic function wp_redirect_status( $status ) {\n\t\tif ( $this->is_preview() && ! is_admin() )\n\t\t\treturn 200;\n\n\t\treturn $status;\n\t}\n\n\t/**\n\t * Parse the incoming $_POST['customized'] JSON data and store the unsanitized\n\t * settings for subsequent post_value() lookups.\n\t *\n\t * @since 4.1.1\n\t *\n\t * @return array\n\t */\n\tpublic function unsanitized_post_values() {\n\t\tif ( ! isset( $this->_post_values ) ) {\n\t\t\tif ( isset( $_POST['customized'] ) ) {\n\t\t\t\t$this->_post_values = json_decode( wp_unslash( $_POST['customized'] ), true );\n\t\t\t}\n\t\t\tif ( empty( $this->_post_values ) ) { // if not isset or if JSON error\n\t\t\t\t$this->_post_values = array();\n\t\t\t}\n\t\t}\n\t\tif ( empty( $this->_post_values ) ) {\n\t\t\treturn array();\n\t\t} else {\n\t\t\treturn $this->_post_values;\n\t\t}\n\t}\n\n\t/**\n\t * Return the sanitized value for a given setting from the request's POST data.\n\t *\n\t * @since 3.4.0\n\t * @since 4.1.1 Introduced 'default' parameter.\n\t *\n\t * @param WP_Customize_Setting $setting A WP_Customize_Setting derived object\n\t * @param mixed $default value returned $setting has no post value (added in 4.2.0).\n\t * @return string|mixed $post_value Sanitized value or the $default provided\n\t */\n\tpublic function post_value( $setting, $default = null ) {\n\t\t$post_values = $this->unsanitized_post_values();\n\t\tif ( array_key_exists( $setting->id, $post_values ) ) {\n\t\t\treturn $setting->sanitize( $post_values[ $setting->id ] );\n\t\t} else {\n\t\t\treturn $default;\n\t\t}\n\t}\n\n\t/**\n\t * Override a setting's (unsanitized) value as found in any incoming $_POST['customized'].\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param string $setting_id ID for the WP_Customize_Setting instance.\n\t * @param mixed  $value      Post value.\n\t */\n\tpublic function set_post_value( $setting_id, $value ) {\n\t\t$this->unsanitized_post_values();\n\t\t$this->_post_values[ $setting_id ] = $value;\n\n\t\t/**\n\t\t * Announce when a specific setting's unsanitized post value has been set.\n\t\t *\n\t\t * Fires when the {@see WP_Customize_Manager::set_post_value()} method is called.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$setting_id`, refers to the setting ID.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param mixed                $value Unsanitized setting post value.\n\t\t * @param WP_Customize_Manager $this  WP_Customize_Manager instance.\n\t\t */\n\t\tdo_action( \"customize_post_value_set_{$setting_id}\", $value, $this );\n\n\t\t/**\n\t\t * Announce when any setting's unsanitized post value has been set.\n\t\t *\n\t\t * Fires when the {@see WP_Customize_Manager::set_post_value()} method is called.\n\t\t *\n\t\t * This is useful for <code>WP_Customize_Setting</code> instances to watch\n\t\t * in order to update a cached previewed value.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string               $setting_id Setting ID.\n\t\t * @param mixed                $value      Unsanitized setting post value.\n\t\t * @param WP_Customize_Manager $this       WP_Customize_Manager instance.\n\t\t */\n\t\tdo_action( 'customize_post_value_set', $setting_id, $value, $this );\n\t}\n\n\t/**\n\t * Print JavaScript settings.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function customize_preview_init() {\n\t\t$this->nonce_tick = check_ajax_referer( 'preview-customize_' . $this->get_stylesheet(), 'nonce' );\n\n\t\t$this->prepare_controls();\n\n\t\twp_enqueue_script( 'customize-preview' );\n\t\tadd_action( 'wp', array( $this, 'customize_preview_override_404_status' ) );\n\t\tadd_action( 'wp_head', array( $this, 'customize_preview_base' ) );\n\t\tadd_action( 'wp_head', array( $this, 'customize_preview_html5' ) );\n\t\tadd_action( 'wp_head', array( $this, 'customize_preview_loading_style' ) );\n\t\tadd_action( 'wp_footer', array( $this, 'customize_preview_settings' ), 20 );\n\t\tadd_action( 'shutdown', array( $this, 'customize_preview_signature' ), 1000 );\n\t\tadd_filter( 'wp_die_handler', array( $this, 'remove_preview_signature' ) );\n\n\t\tforeach ( $this->settings as $setting ) {\n\t\t\t$setting->preview();\n\t\t}\n\n\t\t/**\n\t\t * Fires once the Customizer preview has initialized and JavaScript\n\t\t * settings have been printed.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Manager $this WP_Customize_Manager instance.\n\t\t */\n\t\tdo_action( 'customize_preview_init', $this );\n\t}\n\n\t/**\n\t * Prevent sending a 404 status when returning the response for the customize\n\t * preview, since it causes the jQuery AJAX to fail. Send 200 instead.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t */\n\tpublic function customize_preview_override_404_status() {\n\t\tif ( is_404() ) {\n\t\t\tstatus_header( 200 );\n\t\t}\n\t}\n\n\t/**\n\t * Print base element for preview frame.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function customize_preview_base() {\n\t\t?><base href=\"<?php echo home_url( '/' ); ?>\" /><?php\n\t}\n\n\t/**\n\t * Print a workaround to handle HTML5 tags in IE < 9.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function customize_preview_html5() { ?>\n\t\t<!--[if lt IE 9]>\n\t\t<script type=\"text/javascript\">\n\t\t\tvar e = [ 'abbr', 'article', 'aside', 'audio', 'canvas', 'datalist', 'details',\n\t\t\t\t'figure', 'footer', 'header', 'hgroup', 'mark', 'menu', 'meter', 'nav',\n\t\t\t\t'output', 'progress', 'section', 'time', 'video' ];\n\t\t\tfor ( var i = 0; i < e.length; i++ ) {\n\t\t\t\tdocument.createElement( e[i] );\n\t\t\t}\n\t\t</script>\n\t\t<![endif]--><?php\n\t}\n\n\t/**\n\t * Print CSS for loading indicators for the Customizer preview.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t */\n\tpublic function customize_preview_loading_style() {\n\t\t?><style>\n\t\t\tbody.wp-customizer-unloading {\n\t\t\t\topacity: 0.25;\n\t\t\t\tcursor: progress !important;\n\t\t\t\t-webkit-transition: opacity 0.5s;\n\t\t\t\ttransition: opacity 0.5s;\n\t\t\t}\n\t\t\tbody.wp-customizer-unloading * {\n\t\t\t\tpointer-events: none !important;\n\t\t\t}\n\t\t</style><?php\n\t}\n\n\t/**\n\t * Print JavaScript settings for preview frame.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function customize_preview_settings() {\n\t\t$settings = array(\n\t\t\t'channel' => wp_unslash( $_POST['customize_messenger_channel'] ),\n\t\t\t'activePanels' => array(),\n\t\t\t'activeSections' => array(),\n\t\t\t'activeControls' => array(),\n\t\t);\n\n\t\tif ( 2 == $this->nonce_tick ) {\n\t\t\t$settings['nonce'] = array(\n\t\t\t\t'save' => wp_create_nonce( 'save-customize_' . $this->get_stylesheet() ),\n\t\t\t\t'preview' => wp_create_nonce( 'preview-customize_' . $this->get_stylesheet() )\n\t\t\t);\n\t\t}\n\n\t\tforeach ( $this->panels as $panel_id => $panel ) {\n\t\t\tif ( $panel->check_capabilities() ) {\n\t\t\t\t$settings['activePanels'][ $panel_id ] = $panel->active();\n\t\t\t\tforeach ( $panel->sections as $section_id => $section ) {\n\t\t\t\t\tif ( $section->check_capabilities() ) {\n\t\t\t\t\t\t$settings['activeSections'][ $section_id ] = $section->active();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tforeach ( $this->sections as $id => $section ) {\n\t\t\tif ( $section->check_capabilities() ) {\n\t\t\t\t$settings['activeSections'][ $id ] = $section->active();\n\t\t\t}\n\t\t}\n\t\tforeach ( $this->controls as $id => $control ) {\n\t\t\tif ( $control->check_capabilities() ) {\n\t\t\t\t$settings['activeControls'][ $id ] = $control->active();\n\t\t\t}\n\t\t}\n\n\t\t?>\n\t\t<script type=\"text/javascript\">\n\t\t\tvar _wpCustomizeSettings = <?php echo wp_json_encode( $settings ); ?>;\n\t\t\t_wpCustomizeSettings.values = {};\n\t\t\t(function( v ) {\n\t\t\t\t<?php\n\t\t\t\t/*\n\t\t\t\t * Serialize settings separately from the initial _wpCustomizeSettings\n\t\t\t\t * serialization in order to avoid a peak memory usage spike.\n\t\t\t\t * @todo We may not even need to export the values at all since the pane syncs them anyway.\n\t\t\t\t */\n\t\t\t\tforeach ( $this->settings as $id => $setting ) {\n\t\t\t\t\tif ( $setting->check_capabilities() ) {\n\t\t\t\t\t\tprintf(\n\t\t\t\t\t\t\t\"v[%s] = %s;\\n\",\n\t\t\t\t\t\t\twp_json_encode( $id ),\n\t\t\t\t\t\t\twp_json_encode( $setting->js_value() )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t?>\n\t\t\t})( _wpCustomizeSettings.values );\n\t\t</script>\n\t\t<?php\n\t}\n\n\t/**\n\t * Prints a signature so we can ensure the Customizer was properly executed.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function customize_preview_signature() {\n\t\techo 'WP_CUSTOMIZER_SIGNATURE';\n\t}\n\n\t/**\n\t * Removes the signature in case we experience a case where the Customizer was not properly executed.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param mixed $return Value passed through for wp_die_handler filter.\n\t * @return mixed Value passed through for wp_die_handler filter.\n\t */\n\tpublic function remove_preview_signature( $return = null ) {\n\t\tremove_action( 'shutdown', array( $this, 'customize_preview_signature' ), 1000 );\n\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Is it a theme preview?\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return bool True if it's a preview, false if not.\n\t */\n\tpublic function is_preview() {\n\t\treturn (bool) $this->previewing;\n\t}\n\n\t/**\n\t * Retrieve the template name of the previewed theme.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return string Template name.\n\t */\n\tpublic function get_template() {\n\t\treturn $this->theme()->get_template();\n\t}\n\n\t/**\n\t * Retrieve the stylesheet name of the previewed theme.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return string Stylesheet name.\n\t */\n\tpublic function get_stylesheet() {\n\t\treturn $this->theme()->get_stylesheet();\n\t}\n\n\t/**\n\t * Retrieve the template root of the previewed theme.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return string Theme root.\n\t */\n\tpublic function get_template_root() {\n\t\treturn get_raw_theme_root( $this->get_template(), true );\n\t}\n\n\t/**\n\t * Retrieve the stylesheet root of the previewed theme.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return string Theme root.\n\t */\n\tpublic function get_stylesheet_root() {\n\t\treturn get_raw_theme_root( $this->get_stylesheet(), true );\n\t}\n\n\t/**\n\t * Filter the current theme and return the name of the previewed theme.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param $current_theme {@internal Parameter is not used}\n\t * @return string Theme name.\n\t */\n\tpublic function current_theme( $current_theme ) {\n\t\treturn $this->theme()->display('Name');\n\t}\n\n\t/**\n\t * Switch the theme and trigger the save() method on each setting.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function save() {\n\t\tif ( ! $this->is_preview() ) {\n\t\t\twp_send_json_error( 'not_preview' );\n\t\t}\n\n\t\t$action = 'save-customize_' . $this->get_stylesheet();\n\t\tif ( ! check_ajax_referer( $action, 'nonce', false ) ) {\n\t\t\twp_send_json_error( 'invalid_nonce' );\n\t\t}\n\n\t\t// Do we have to switch themes?\n\t\tif ( ! $this->is_theme_active() ) {\n\t\t\t// Temporarily stop previewing the theme to allow switch_themes()\n\t\t\t// to operate properly.\n\t\t\t$this->stop_previewing_theme();\n\t\t\tswitch_theme( $this->get_stylesheet() );\n\t\t\tupdate_option( 'theme_switched_via_customizer', true );\n\t\t\t$this->start_previewing_theme();\n\t\t}\n\n\t\t/**\n\t\t * Fires once the theme has switched in the Customizer, but before settings\n\t\t * have been saved.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Manager $this WP_Customize_Manager instance.\n\t\t */\n\t\tdo_action( 'customize_save', $this );\n\n\t\tforeach ( $this->settings as $setting ) {\n\t\t\t$setting->save();\n\t\t}\n\n\t\t/**\n\t\t * Fires after Customize settings have been saved.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param WP_Customize_Manager $this WP_Customize_Manager instance.\n\t\t */\n\t\tdo_action( 'customize_save_after', $this );\n\n\t\t/**\n\t\t * Filter response data for a successful customize_save AJAX request.\n\t\t *\n\t\t * This filter does not apply if there was a nonce or authentication failure.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param array                $data Additional information passed back to the 'saved'\n\t\t *                                   event on `wp.customize`.\n\t\t * @param WP_Customize_Manager $this WP_Customize_Manager instance.\n\t\t */\n\t\t$response = apply_filters( 'customize_save_response', array(), $this );\n\t\twp_send_json_success( $response );\n\t}\n\n\t/**\n\t * Refresh nonces for the current preview.\n\t *\n\t * @since 4.2.0\n\t */\n\tpublic function refresh_nonces() {\n\t\tif ( ! $this->is_preview() ) {\n\t\t\twp_send_json_error( 'not_preview' );\n\t\t}\n\n\t\t$nonces = array(\n\t\t\t'save'    => wp_create_nonce( 'save-customize_' . $this->get_stylesheet() ),\n\t\t\t'preview' => wp_create_nonce( 'preview-customize_' . $this->get_stylesheet() ),\n\t\t);\n\n\t\t/**\n\t\t * Filter nonces for a customize_refresh_nonces AJAX request.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param array                $nonces Array of refreshed nonces for save and\n\t\t *                                     preview actions.\n\t\t * @param WP_Customize_Manager $this   WP_Customize_Manager instance.\n\t\t */\n\t\t$nonces = apply_filters( 'customize_refresh_nonces', $nonces, $this );\n\t\twp_send_json_success( $nonces );\n\t}\n\n\t/**\n\t * Add a customize setting.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param WP_Customize_Setting|string $id Customize Setting object, or ID.\n\t * @param array $args                     Setting arguments; passed to WP_Customize_Setting\n\t *                                        constructor.\n\t */\n\tpublic function add_setting( $id, $args = array() ) {\n\t\tif ( $id instanceof WP_Customize_Setting ) {\n\t\t\t$setting = $id;\n\t\t} else {\n\t\t\t$setting = new WP_Customize_Setting( $this, $id, $args );\n\t\t}\n\t\t$this->settings[ $setting->id ] = $setting;\n\t}\n\n\t/**\n\t * Register any dynamically-created settings, such as those from $_POST['customized']\n\t * that have no corresponding setting created.\n\t *\n\t * This is a mechanism to \"wake up\" settings that have been dynamically created\n\t * on the frontend and have been sent to WordPress in `$_POST['customized']`. When WP\n\t * loads, the dynamically-created settings then will get created and previewed\n\t * even though they are not directly created statically with code.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param array $setting_ids The setting IDs to add.\n\t * @return array The WP_Customize_Setting objects added.\n\t */\n\tpublic function add_dynamic_settings( $setting_ids ) {\n\t\t$new_settings = array();\n\t\tforeach ( $setting_ids as $setting_id ) {\n\t\t\t// Skip settings already created\n\t\t\tif ( $this->get_setting( $setting_id ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$setting_args = false;\n\t\t\t$setting_class = 'WP_Customize_Setting';\n\n\t\t\t/**\n\t\t\t * Filter a dynamic setting's constructor args.\n\t\t\t *\n\t\t\t * For a dynamic setting to be registered, this filter must be employed\n\t\t\t * to override the default false value with an array of args to pass to\n\t\t\t * the WP_Customize_Setting constructor.\n\t\t\t *\n\t\t\t * @since 4.2.0\n\t\t\t *\n\t\t\t * @param false|array $setting_args The arguments to the WP_Customize_Setting constructor.\n\t\t\t * @param string      $setting_id   ID for dynamic setting, usually coming from `$_POST['customized']`.\n\t\t\t */\n\t\t\t$setting_args = apply_filters( 'customize_dynamic_setting_args', $setting_args, $setting_id );\n\t\t\tif ( false === $setting_args ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Allow non-statically created settings to be constructed with custom WP_Customize_Setting subclass.\n\t\t\t *\n\t\t\t * @since 4.2.0\n\t\t\t *\n\t\t\t * @param string $setting_class WP_Customize_Setting or a subclass.\n\t\t\t * @param string $setting_id    ID for dynamic setting, usually coming from `$_POST['customized']`.\n\t\t\t * @param array  $setting_args  WP_Customize_Setting or a subclass.\n\t\t\t */\n\t\t\t$setting_class = apply_filters( 'customize_dynamic_setting_class', $setting_class, $setting_id, $setting_args );\n\n\t\t\t$setting = new $setting_class( $this, $setting_id, $setting_args );\n\n\t\t\t$this->add_setting( $setting );\n\t\t\t$new_settings[] = $setting;\n\t\t}\n\t\treturn $new_settings;\n\t}\n\n\t/**\n\t * Retrieve a customize setting.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $id Customize Setting ID.\n\t * @return WP_Customize_Setting|void The setting, if set.\n\t */\n\tpublic function get_setting( $id ) {\n\t\tif ( isset( $this->settings[ $id ] ) ) {\n\t\t\treturn $this->settings[ $id ];\n\t\t}\n\t}\n\n\t/**\n\t * Remove a customize setting.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $id Customize Setting ID.\n\t */\n\tpublic function remove_setting( $id ) {\n\t\tunset( $this->settings[ $id ] );\n\t}\n\n\t/**\n\t * Add a customize panel.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param WP_Customize_Panel|string $id   Customize Panel object, or Panel ID.\n\t * @param array                     $args Optional. Panel arguments. Default empty array.\n\t */\n\tpublic function add_panel( $id, $args = array() ) {\n\t\tif ( $id instanceof WP_Customize_Panel ) {\n\t\t\t$panel = $id;\n\t\t} else {\n\t\t\t$panel = new WP_Customize_Panel( $this, $id, $args );\n\t\t}\n\n\t\t$this->panels[ $panel->id ] = $panel;\n\t}\n\n\t/**\n\t * Retrieve a customize panel.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $id Panel ID to get.\n\t * @return WP_Customize_Panel|void Requested panel instance, if set.\n\t */\n\tpublic function get_panel( $id ) {\n\t\tif ( isset( $this->panels[ $id ] ) ) {\n\t\t\treturn $this->panels[ $id ];\n\t\t}\n\t}\n\n\t/**\n\t * Remove a customize panel.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $id Panel ID to remove.\n\t */\n\tpublic function remove_panel( $id ) {\n\t\tunset( $this->panels[ $id ] );\n\t}\n\n\t/**\n\t * Register a customize panel type.\n\t *\n\t * Registered types are eligible to be rendered via JS and created dynamically.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Panel\n\t *\n\t * @param string $panel Name of a custom panel which is a subclass of WP_Customize_Panel.\n\t */\n\tpublic function register_panel_type( $panel ) {\n\t\t$this->registered_panel_types[] = $panel;\n\t}\n\n\t/**\n\t * Render JS templates for all registered panel types.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function render_panel_templates() {\n\t\tforeach ( $this->registered_panel_types as $panel_type ) {\n\t\t\t$panel = new $panel_type( $this, 'temp', array() );\n\t\t\t$panel->print_template();\n\t\t}\n\t}\n\n\t/**\n\t * Add a customize section.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param WP_Customize_Section|string $id   Customize Section object, or Section ID.\n\t * @param array                       $args Section arguments.\n\t */\n\tpublic function add_section( $id, $args = array() ) {\n\t\tif ( $id instanceof WP_Customize_Section ) {\n\t\t\t$section = $id;\n\t\t} else {\n\t\t\t$section = new WP_Customize_Section( $this, $id, $args );\n\t\t}\n\t\t$this->sections[ $section->id ] = $section;\n\t}\n\n\t/**\n\t * Retrieve a customize section.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $id Section ID.\n\t * @return WP_Customize_Section|void The section, if set.\n\t */\n\tpublic function get_section( $id ) {\n\t\tif ( isset( $this->sections[ $id ] ) )\n\t\t\treturn $this->sections[ $id ];\n\t}\n\n\t/**\n\t * Remove a customize section.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $id Section ID.\n\t */\n\tpublic function remove_section( $id ) {\n\t\tunset( $this->sections[ $id ] );\n\t}\n\n\t/**\n\t * Register a customize section type.\n\t *\n\t * Registered types are eligible to be rendered via JS and created dynamically.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Section\n\t *\n\t * @param string $section Name of a custom section which is a subclass of WP_Customize_Section.\n\t */\n\tpublic function register_section_type( $section ) {\n\t\t$this->registered_section_types[] = $section;\n\t}\n\n\t/**\n\t * Render JS templates for all registered section types.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function render_section_templates() {\n\t\tforeach ( $this->registered_section_types as $section_type ) {\n\t\t\t$section = new $section_type( $this, 'temp', array() );\n\t\t\t$section->print_template();\n\t\t}\n\t}\n\n\t/**\n\t * Add a customize control.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param WP_Customize_Control|string $id   Customize Control object, or ID.\n\t * @param array                       $args Control arguments; passed to WP_Customize_Control\n\t *                                          constructor.\n\t */\n\tpublic function add_control( $id, $args = array() ) {\n\t\tif ( $id instanceof WP_Customize_Control ) {\n\t\t\t$control = $id;\n\t\t} else {\n\t\t\t$control = new WP_Customize_Control( $this, $id, $args );\n\t\t}\n\t\t$this->controls[ $control->id ] = $control;\n\t}\n\n\t/**\n\t * Retrieve a customize control.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $id ID of the control.\n\t * @return WP_Customize_Control|void The control object, if set.\n\t */\n\tpublic function get_control( $id ) {\n\t\tif ( isset( $this->controls[ $id ] ) )\n\t\t\treturn $this->controls[ $id ];\n\t}\n\n\t/**\n\t * Remove a customize control.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $id ID of the control.\n\t */\n\tpublic function remove_control( $id ) {\n\t\tunset( $this->controls[ $id ] );\n\t}\n\n\t/**\n\t * Register a customize control type.\n\t *\n\t * Registered types are eligible to be rendered via JS and created dynamically.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @param string $control Name of a custom control which is a subclass of\n\t *                        {@see WP_Customize_Control}.\n\t */\n\tpublic function register_control_type( $control ) {\n\t\t$this->registered_control_types[] = $control;\n\t}\n\n\t/**\n\t * Render JS templates for all registered control types.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t */\n\tpublic function render_control_templates() {\n\t\tforeach ( $this->registered_control_types as $control_type ) {\n\t\t\t$control = new $control_type( $this, 'temp', array() );\n\t\t\t$control->print_template();\n\t\t}\n\t}\n\n\t/**\n\t * Helper function to compare two objects by priority, ensuring sort stability via instance_number.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param WP_Customize_Panel|WP_Customize_Section|WP_Customize_Control $a Object A.\n\t * @param WP_Customize_Panel|WP_Customize_Section|WP_Customize_Control $b Object B.\n\t * @return int\n\t */\n\tprotected function _cmp_priority( $a, $b ) {\n\t\tif ( $a->priority === $b->priority ) {\n\t\t\treturn $a->instance_number - $b->instance_number;\n\t\t} else {\n\t\t\treturn $a->priority - $b->priority;\n\t\t}\n\t}\n\n\t/**\n\t * Prepare panels, sections, and controls.\n\t *\n\t * For each, check if required related components exist,\n\t * whether the user has the necessary capabilities,\n\t * and sort by priority.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function prepare_controls() {\n\n\t\t$controls = array();\n\t\tuasort( $this->controls, array( $this, '_cmp_priority' ) );\n\n\t\tforeach ( $this->controls as $id => $control ) {\n\t\t\tif ( ! isset( $this->sections[ $control->section ] ) || ! $control->check_capabilities() ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$this->sections[ $control->section ]->controls[] = $control;\n\t\t\t$controls[ $id ] = $control;\n\t\t}\n\t\t$this->controls = $controls;\n\n\t\t// Prepare sections.\n\t\tuasort( $this->sections, array( $this, '_cmp_priority' ) );\n\t\t$sections = array();\n\n\t\tforeach ( $this->sections as $section ) {\n\t\t\tif ( ! $section->check_capabilities() ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tusort( $section->controls, array( $this, '_cmp_priority' ) );\n\n\t\t\tif ( ! $section->panel ) {\n\t\t\t\t// Top-level section.\n\t\t\t\t$sections[ $section->id ] = $section;\n\t\t\t} else {\n\t\t\t\t// This section belongs to a panel.\n\t\t\t\tif ( isset( $this->panels [ $section->panel ] ) ) {\n\t\t\t\t\t$this->panels[ $section->panel ]->sections[ $section->id ] = $section;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$this->sections = $sections;\n\n\t\t// Prepare panels.\n\t\tuasort( $this->panels, array( $this, '_cmp_priority' ) );\n\t\t$panels = array();\n\n\t\tforeach ( $this->panels as $panel ) {\n\t\t\tif ( ! $panel->check_capabilities() ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tuasort( $panel->sections, array( $this, '_cmp_priority' ) );\n\t\t\t$panels[ $panel->id ] = $panel;\n\t\t}\n\t\t$this->panels = $panels;\n\n\t\t// Sort panels and top-level sections together.\n\t\t$this->containers = array_merge( $this->panels, $this->sections );\n\t\tuasort( $this->containers, array( $this, '_cmp_priority' ) );\n\t}\n\n\t/**\n\t * Enqueue scripts for customize controls.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function enqueue_control_scripts() {\n\t\tforeach ( $this->controls as $control ) {\n\t\t\t$control->enqueue();\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether the user agent is iOS.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return bool Whether the user agent is iOS.\n\t */\n\tpublic function is_ios() {\n\t\treturn wp_is_mobile() && preg_match( '/iPad|iPod|iPhone/', $_SERVER['HTTP_USER_AGENT'] );\n\t}\n\n\t/**\n\t * Get the template string for the Customizer pane document title.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return string The template string for the document title.\n\t */\n\tpublic function get_document_title_template() {\n\t\tif ( $this->is_theme_active() ) {\n\t\t\t/* translators: %s: document title from the preview */\n\t\t\t$document_title_tmpl = __( 'Customize: %s' );\n\t\t} else {\n\t\t\t/* translators: %s: document title from the preview */\n\t\t\t$document_title_tmpl = __( 'Live Preview: %s' );\n\t\t}\n\t\t$document_title_tmpl = html_entity_decode( $document_title_tmpl, ENT_QUOTES, 'UTF-8' ); // Because exported to JS and assigned to document.title.\n\t\treturn $document_title_tmpl;\n\t}\n\n\t/**\n\t * Set the initial URL to be previewed.\n\t *\n\t * URL is validated.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $preview_url URL to be previewed.\n\t */\n\tpublic function set_preview_url( $preview_url ) {\n\t\t$this->preview_url = wp_validate_redirect( $preview_url, home_url( '/' ) );\n\t}\n\n\t/**\n\t * Get the initial URL to be previewed.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return string URL being previewed.\n\t */\n\tpublic function get_preview_url() {\n\t\tif ( empty( $this->preview_url ) ) {\n\t\t\t$preview_url = home_url( '/' );\n\t\t} else {\n\t\t\t$preview_url = $this->preview_url;\n\t\t}\n\t\treturn $preview_url;\n\t}\n\n\t/**\n\t * Set URL to link the user to when closing the Customizer.\n\t *\n\t * URL is validated.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $return_url URL for return link.\n\t */\n\tpublic function set_return_url( $return_url ) {\n\t\t$return_url = remove_query_arg( wp_removable_query_args(), $return_url );\n\t\t$return_url = wp_validate_redirect( $return_url );\n\t\t$this->return_url = $return_url;\n\t}\n\n\t/**\n\t * Get URL to link the user to when closing the Customizer.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return string URL for link to close Customizer.\n\t */\n\tpublic function get_return_url() {\n\t\t$referer = wp_get_referer();\n\t\t$excluded_referer_basenames = array( 'customize.php', 'wp-login.php' );\n\n\t\tif ( $this->return_url ) {\n\t\t\t$return_url = $this->return_url;\n\t\t} else if ( $referer && ! in_array( basename( parse_url( $referer, PHP_URL_PATH ) ), $excluded_referer_basenames, true ) ) {\n\t\t\t$return_url = $referer;\n\t\t} else if ( $this->preview_url ) {\n\t\t\t$return_url = $this->preview_url;\n\t\t} else {\n\t\t\t$return_url = home_url( '/' );\n\t\t}\n\t\treturn $return_url;\n\t}\n\n\t/**\n\t * Set the autofocused constructs.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $autofocus {\n\t *     Mapping of 'panel', 'section', 'control' to the ID which should be autofocused.\n\t *\n\t *     @type string [$control]  ID for control to be autofocused.\n\t *     @type string [$section]  ID for section to be autofocused.\n\t *     @type string [$panel]    ID for panel to be autofocused.\n\t * }\n\t */\n\tpublic function set_autofocus( $autofocus ) {\n\t\t$this->autofocus = array_filter( wp_array_slice_assoc( $autofocus, array( 'panel', 'section', 'control' ) ), 'is_string' );\n\t}\n\n\t/**\n\t * Get the autofocused constructs.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array {\n\t *     Mapping of 'panel', 'section', 'control' to the ID which should be autofocused.\n\t *\n\t *     @type string [$control]  ID for control to be autofocused.\n\t *     @type string [$section]  ID for section to be autofocused.\n\t *     @type string [$panel]    ID for panel to be autofocused.\n\t * }\n\t */\n\tpublic function get_autofocus() {\n\t\treturn $this->autofocus;\n\t}\n\n\t/**\n\t * Print JavaScript settings for parent window.\n\t *\n\t * @since 4.4.0\n\t */\n\tpublic function customize_pane_settings() {\n\t\t/*\n\t\t * If the frontend and the admin are served from the same domain, load the\n\t\t * preview over ssl if the Customizer is being loaded over ssl. This avoids\n\t\t * insecure content warnings. This is not attempted if the admin and frontend\n\t\t * are on different domains to avoid the case where the frontend doesn't have\n\t\t * ssl certs. Domain mapping plugins can allow other urls in these conditions\n\t\t * using the customize_allowed_urls filter.\n\t\t */\n\n\t\t$allowed_urls = array( home_url( '/' ) );\n\t\t$admin_origin = parse_url( admin_url() );\n\t\t$home_origin  = parse_url( home_url() );\n\t\t$cross_domain = ( strtolower( $admin_origin['host'] ) !== strtolower( $home_origin['host'] ) );\n\n\t\tif ( is_ssl() && ! $cross_domain ) {\n\t\t\t$allowed_urls[] = home_url( '/', 'https' );\n\t\t}\n\n\t\t/**\n\t\t * Filter the list of URLs allowed to be clicked and followed in the Customizer preview.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array $allowed_urls An array of allowed URLs.\n\t\t */\n\t\t$allowed_urls = array_unique( apply_filters( 'customize_allowed_urls', $allowed_urls ) );\n\n\t\t$login_url = add_query_arg( array(\n\t\t\t'interim-login' => 1,\n\t\t\t'customize-login' => 1,\n\t\t), wp_login_url() );\n\n\t\t// Prepare Customizer settings to pass to JavaScript.\n\t\t$settings = array(\n\t\t\t'theme'    => array(\n\t\t\t\t'stylesheet' => $this->get_stylesheet(),\n\t\t\t\t'active'     => $this->is_theme_active(),\n\t\t\t),\n\t\t\t'url'      => array(\n\t\t\t\t'preview'       => esc_url_raw( $this->get_preview_url() ),\n\t\t\t\t'parent'        => esc_url_raw( admin_url() ),\n\t\t\t\t'activated'     => esc_url_raw( home_url( '/' ) ),\n\t\t\t\t'ajax'          => esc_url_raw( admin_url( 'admin-ajax.php', 'relative' ) ),\n\t\t\t\t'allowed'       => array_map( 'esc_url_raw', $allowed_urls ),\n\t\t\t\t'isCrossDomain' => $cross_domain,\n\t\t\t\t'home'          => esc_url_raw( home_url( '/' ) ),\n\t\t\t\t'login'         => esc_url_raw( $login_url ),\n\t\t\t),\n\t\t\t'browser'  => array(\n\t\t\t\t'mobile' => wp_is_mobile(),\n\t\t\t\t'ios'    => $this->is_ios(),\n\t\t\t),\n\t\t\t'panels'   => array(),\n\t\t\t'sections' => array(),\n\t\t\t'nonce'    => array(\n\t\t\t\t'save'    => wp_create_nonce( 'save-customize_' . $this->get_stylesheet() ),\n\t\t\t\t'preview' => wp_create_nonce( 'preview-customize_' . $this->get_stylesheet() ),\n\t\t\t),\n\t\t\t'autofocus' => array(),\n\t\t\t'documentTitleTmpl' => $this->get_document_title_template(),\n\t\t);\n\n\t\t// Prepare Customize Section objects to pass to JavaScript.\n\t\tforeach ( $this->sections() as $id => $section ) {\n\t\t\tif ( $section->check_capabilities() ) {\n\t\t\t\t$settings['sections'][ $id ] = $section->json();\n\t\t\t}\n\t\t}\n\n\t\t// Prepare Customize Panel objects to pass to JavaScript.\n\t\tforeach ( $this->panels() as $panel_id => $panel ) {\n\t\t\tif ( $panel->check_capabilities() ) {\n\t\t\t\t$settings['panels'][ $panel_id ] = $panel->json();\n\t\t\t\tforeach ( $panel->sections as $section_id => $section ) {\n\t\t\t\t\tif ( $section->check_capabilities() ) {\n\t\t\t\t\t\t$settings['sections'][ $section_id ] = $section->json();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Pass to frontend the Customizer construct being deeplinked.\n\t\tforeach ( $this->get_autofocus() as $type => $id ) {\n\t\t\t$can_autofocus = (\n\t\t\t\t( 'control' === $type && $this->get_control( $id ) && $this->get_control( $id )->check_capabilities() )\n\t\t\t\t||\n\t\t\t\t( 'section' === $type && isset( $settings['sections'][ $id ] ) )\n\t\t\t\t||\n\t\t\t\t( 'panel' === $type && isset( $settings['panels'][ $id ] ) )\n\t\t\t);\n\t\t\tif ( $can_autofocus ) {\n\t\t\t\t$settings['autofocus'][ $type ] = $id;\n\t\t\t}\n\t\t}\n\n\t\t?>\n\t\t<script type=\"text/javascript\">\n\t\t\tvar _wpCustomizeSettings = <?php echo wp_json_encode( $settings ); ?>;\n\t\t\t_wpCustomizeSettings.controls = {};\n\t\t\t_wpCustomizeSettings.settings = {};\n\t\t\t<?php\n\n\t\t\t// Serialize settings one by one to improve memory usage.\n\t\t\techo \"(function ( s ){\\n\";\n\t\t\tforeach ( $this->settings() as $setting ) {\n\t\t\t\tif ( $setting->check_capabilities() ) {\n\t\t\t\t\tprintf(\n\t\t\t\t\t\t\"s[%s] = %s;\\n\",\n\t\t\t\t\t\twp_json_encode( $setting->id ),\n\t\t\t\t\t\twp_json_encode( array(\n\t\t\t\t\t\t\t'value'     => $setting->js_value(),\n\t\t\t\t\t\t\t'transport' => $setting->transport,\n\t\t\t\t\t\t\t'dirty'     => $setting->dirty,\n\t\t\t\t\t\t) )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\techo \"})( _wpCustomizeSettings.settings );\\n\";\n\n\t\t\t// Serialize controls one by one to improve memory usage.\n\t\t\techo \"(function ( c ){\\n\";\n\t\t\tforeach ( $this->controls() as $control ) {\n\t\t\t\tif ( $control->check_capabilities() ) {\n\t\t\t\t\tprintf(\n\t\t\t\t\t\t\"c[%s] = %s;\\n\",\n\t\t\t\t\t\twp_json_encode( $control->id ),\n\t\t\t\t\t\twp_json_encode( $control->json() )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\techo \"})( _wpCustomizeSettings.controls );\\n\";\n\t\t?>\n\t\t</script>\n\t\t<?php\n\t}\n\n\t/**\n\t * Register some default controls.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function register_controls() {\n\n\t\t/* Panel, Section, and Control Types */\n\t\t$this->register_panel_type( 'WP_Customize_Panel' );\n\t\t$this->register_section_type( 'WP_Customize_Section' );\n\t\t$this->register_section_type( 'WP_Customize_Sidebar_Section' );\n\t\t$this->register_control_type( 'WP_Customize_Color_Control' );\n\t\t$this->register_control_type( 'WP_Customize_Media_Control' );\n\t\t$this->register_control_type( 'WP_Customize_Upload_Control' );\n\t\t$this->register_control_type( 'WP_Customize_Image_Control' );\n\t\t$this->register_control_type( 'WP_Customize_Background_Image_Control' );\n\t\t$this->register_control_type( 'WP_Customize_Cropped_Image_Control' );\n\t\t$this->register_control_type( 'WP_Customize_Site_Icon_Control' );\n\t\t$this->register_control_type( 'WP_Customize_Theme_Control' );\n\n\t\t/* Themes */\n\n\t\t$this->add_section( new WP_Customize_Themes_Section( $this, 'themes', array(\n\t\t\t'title'      => $this->theme()->display( 'Name' ),\n\t\t\t'capability' => 'switch_themes',\n\t\t\t'priority'   => 0,\n\t\t) ) );\n\n\t\t// Themes Setting (unused - the theme is considerably more fundamental to the Customizer experience).\n\t\t$this->add_setting( new WP_Customize_Filter_Setting( $this, 'active_theme', array(\n\t\t\t'capability' => 'switch_themes',\n\t\t) ) );\n\n\t\trequire_once( ABSPATH . 'wp-admin/includes/theme.php' );\n\n\t\t// Theme Controls.\n\n\t\t// Add a control for the active/original theme.\n\t\tif ( ! $this->is_theme_active() ) {\n\t\t\t$themes = wp_prepare_themes_for_js( array( wp_get_theme( $this->original_stylesheet ) ) );\n\t\t\t$active_theme = current( $themes );\n\t\t\t$active_theme['isActiveTheme'] = true;\n\t\t\t$this->add_control( new WP_Customize_Theme_Control( $this, $active_theme['id'], array(\n\t\t\t\t'theme'    => $active_theme,\n\t\t\t\t'section'  => 'themes',\n\t\t\t\t'settings' => 'active_theme',\n\t\t\t) ) );\n\t\t}\n\n\t\t$themes = wp_prepare_themes_for_js();\n\t\tforeach ( $themes as $theme ) {\n\t\t\tif ( $theme['active'] || $theme['id'] === $this->original_stylesheet ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$theme_id = 'theme_' . $theme['id'];\n\t\t\t$theme['isActiveTheme'] = false;\n\t\t\t$this->add_control( new WP_Customize_Theme_Control( $this, $theme_id, array(\n\t\t\t\t'theme'    => $theme,\n\t\t\t\t'section'  => 'themes',\n\t\t\t\t'settings' => 'active_theme',\n\t\t\t) ) );\n\t\t}\n\n\t\t/* Site Identity */\n\n\t\t$this->add_section( 'title_tagline', array(\n\t\t\t'title'    => __( 'Site Identity' ),\n\t\t\t'priority' => 20,\n\t\t) );\n\n\t\t$this->add_setting( 'blogname', array(\n\t\t\t'default'    => get_option( 'blogname' ),\n\t\t\t'type'       => 'option',\n\t\t\t'capability' => 'manage_options',\n\t\t) );\n\n\t\t$this->add_control( 'blogname', array(\n\t\t\t'label'      => __( 'Site Title' ),\n\t\t\t'section'    => 'title_tagline',\n\t\t) );\n\n\t\t$this->add_setting( 'blogdescription', array(\n\t\t\t'default'    => get_option( 'blogdescription' ),\n\t\t\t'type'       => 'option',\n\t\t\t'capability' => 'manage_options',\n\t\t) );\n\n\t\t$this->add_control( 'blogdescription', array(\n\t\t\t'label'      => __( 'Tagline' ),\n\t\t\t'section'    => 'title_tagline',\n\t\t) );\n\n\t\t$this->add_setting( 'site_icon', array(\n\t\t\t'type'       => 'option',\n\t\t\t'capability' => 'manage_options',\n\t\t\t'transport'  => 'postMessage', // Previewed with JS in the Customizer controls window.\n\t\t) );\n\n\t\t$this->add_control( new WP_Customize_Site_Icon_Control( $this, 'site_icon', array(\n\t\t\t'label'       => __( 'Site Icon' ),\n\t\t\t'description' => __( 'The Site Icon is used as a browser and app icon for your site. Icons must be square, and at least 512px wide and tall.' ),\n\t\t\t'section'     => 'title_tagline',\n\t\t\t'priority'    => 60,\n\t\t\t'height'      => 512,\n\t\t\t'width'       => 512,\n\t\t) ) );\n\n\t\t/* Colors */\n\n\t\t$this->add_section( 'colors', array(\n\t\t\t'title'          => __( 'Colors' ),\n\t\t\t'priority'       => 40,\n\t\t) );\n\n\t\t$this->add_setting( 'header_textcolor', array(\n\t\t\t'theme_supports' => array( 'custom-header', 'header-text' ),\n\t\t\t'default'        => get_theme_support( 'custom-header', 'default-text-color' ),\n\n\t\t\t'sanitize_callback'    => array( $this, '_sanitize_header_textcolor' ),\n\t\t\t'sanitize_js_callback' => 'maybe_hash_hex_color',\n\t\t) );\n\n\t\t// Input type: checkbox\n\t\t// With custom value\n\t\t$this->add_control( 'display_header_text', array(\n\t\t\t'settings' => 'header_textcolor',\n\t\t\t'label'    => __( 'Display Header Text' ),\n\t\t\t'section'  => 'title_tagline',\n\t\t\t'type'     => 'checkbox',\n\t\t\t'priority' => 40,\n\t\t) );\n\n\t\t$this->add_control( new WP_Customize_Color_Control( $this, 'header_textcolor', array(\n\t\t\t'label'   => __( 'Header Text Color' ),\n\t\t\t'section' => 'colors',\n\t\t) ) );\n\n\t\t// Input type: Color\n\t\t// With sanitize_callback\n\t\t$this->add_setting( 'background_color', array(\n\t\t\t'default'        => get_theme_support( 'custom-background', 'default-color' ),\n\t\t\t'theme_supports' => 'custom-background',\n\n\t\t\t'sanitize_callback'    => 'sanitize_hex_color_no_hash',\n\t\t\t'sanitize_js_callback' => 'maybe_hash_hex_color',\n\t\t) );\n\n\t\t$this->add_control( new WP_Customize_Color_Control( $this, 'background_color', array(\n\t\t\t'label'   => __( 'Background Color' ),\n\t\t\t'section' => 'colors',\n\t\t) ) );\n\n\n\t\t/* Custom Header */\n\n\t\t$this->add_section( 'header_image', array(\n\t\t\t'title'          => __( 'Header Image' ),\n\t\t\t'theme_supports' => 'custom-header',\n\t\t\t'priority'       => 60,\n\t\t) );\n\n\t\t$this->add_setting( new WP_Customize_Filter_Setting( $this, 'header_image', array(\n\t\t\t'default'        => get_theme_support( 'custom-header', 'default-image' ),\n\t\t\t'theme_supports' => 'custom-header',\n\t\t) ) );\n\n\t\t$this->add_setting( new WP_Customize_Header_Image_Setting( $this, 'header_image_data', array(\n\t\t\t// 'default'        => get_theme_support( 'custom-header', 'default-image' ),\n\t\t\t'theme_supports' => 'custom-header',\n\t\t) ) );\n\n\t\t$this->add_control( new WP_Customize_Header_Image_Control( $this ) );\n\n\t\t/* Custom Background */\n\n\t\t$this->add_section( 'background_image', array(\n\t\t\t'title'          => __( 'Background Image' ),\n\t\t\t'theme_supports' => 'custom-background',\n\t\t\t'priority'       => 80,\n\t\t) );\n\n\t\t$this->add_setting( 'background_image', array(\n\t\t\t'default'        => get_theme_support( 'custom-background', 'default-image' ),\n\t\t\t'theme_supports' => 'custom-background',\n\t\t) );\n\n\t\t$this->add_setting( new WP_Customize_Background_Image_Setting( $this, 'background_image_thumb', array(\n\t\t\t'theme_supports' => 'custom-background',\n\t\t) ) );\n\n\t\t$this->add_control( new WP_Customize_Background_Image_Control( $this ) );\n\n\t\t$this->add_setting( 'background_repeat', array(\n\t\t\t'default'        => get_theme_support( 'custom-background', 'default-repeat' ),\n\t\t\t'theme_supports' => 'custom-background',\n\t\t) );\n\n\t\t$this->add_control( 'background_repeat', array(\n\t\t\t'label'      => __( 'Background Repeat' ),\n\t\t\t'section'    => 'background_image',\n\t\t\t'type'       => 'radio',\n\t\t\t'choices'    => array(\n\t\t\t\t'no-repeat'  => __('No Repeat'),\n\t\t\t\t'repeat'     => __('Tile'),\n\t\t\t\t'repeat-x'   => __('Tile Horizontally'),\n\t\t\t\t'repeat-y'   => __('Tile Vertically'),\n\t\t\t),\n\t\t) );\n\n\t\t$this->add_setting( 'background_position_x', array(\n\t\t\t'default'        => get_theme_support( 'custom-background', 'default-position-x' ),\n\t\t\t'theme_supports' => 'custom-background',\n\t\t) );\n\n\t\t$this->add_control( 'background_position_x', array(\n\t\t\t'label'      => __( 'Background Position' ),\n\t\t\t'section'    => 'background_image',\n\t\t\t'type'       => 'radio',\n\t\t\t'choices'    => array(\n\t\t\t\t'left'       => __('Left'),\n\t\t\t\t'center'     => __('Center'),\n\t\t\t\t'right'      => __('Right'),\n\t\t\t),\n\t\t) );\n\n\t\t$this->add_setting( 'background_attachment', array(\n\t\t\t'default'        => get_theme_support( 'custom-background', 'default-attachment' ),\n\t\t\t'theme_supports' => 'custom-background',\n\t\t) );\n\n\t\t$this->add_control( 'background_attachment', array(\n\t\t\t'label'      => __( 'Background Attachment' ),\n\t\t\t'section'    => 'background_image',\n\t\t\t'type'       => 'radio',\n\t\t\t'choices'    => array(\n\t\t\t\t'scroll'     => __('Scroll'),\n\t\t\t\t'fixed'      => __('Fixed'),\n\t\t\t),\n\t\t) );\n\n\t\t// If the theme is using the default background callback, we can update\n\t\t// the background CSS using postMessage.\n\t\tif ( get_theme_support( 'custom-background', 'wp-head-callback' ) === '_custom_background_cb' ) {\n\t\t\tforeach ( array( 'color', 'image', 'position_x', 'repeat', 'attachment' ) as $prop ) {\n\t\t\t\t$this->get_setting( 'background_' . $prop )->transport = 'postMessage';\n\t\t\t}\n\t\t}\n\n\t\t/* Static Front Page */\n\t\t// #WP19627\n\n\t\t// Replicate behavior from options-reading.php and hide front page options if there are no pages\n\t\tif ( get_pages() ) {\n\t\t\t$this->add_section( 'static_front_page', array(\n\t\t\t\t'title'          => __( 'Static Front Page' ),\n\t\t\t//\t'theme_supports' => 'static-front-page',\n\t\t\t\t'priority'       => 120,\n\t\t\t\t'description'    => __( 'Your theme supports a static front page.' ),\n\t\t\t) );\n\n\t\t\t$this->add_setting( 'show_on_front', array(\n\t\t\t\t'default'        => get_option( 'show_on_front' ),\n\t\t\t\t'capability'     => 'manage_options',\n\t\t\t\t'type'           => 'option',\n\t\t\t//\t'theme_supports' => 'static-front-page',\n\t\t\t) );\n\n\t\t\t$this->add_control( 'show_on_front', array(\n\t\t\t\t'label'   => __( 'Front page displays' ),\n\t\t\t\t'section' => 'static_front_page',\n\t\t\t\t'type'    => 'radio',\n\t\t\t\t'choices' => array(\n\t\t\t\t\t'posts' => __( 'Your latest posts' ),\n\t\t\t\t\t'page'  => __( 'A static page' ),\n\t\t\t\t),\n\t\t\t) );\n\n\t\t\t$this->add_setting( 'page_on_front', array(\n\t\t\t\t'type'       => 'option',\n\t\t\t\t'capability' => 'manage_options',\n\t\t\t//\t'theme_supports' => 'static-front-page',\n\t\t\t) );\n\n\t\t\t$this->add_control( 'page_on_front', array(\n\t\t\t\t'label'      => __( 'Front page' ),\n\t\t\t\t'section'    => 'static_front_page',\n\t\t\t\t'type'       => 'dropdown-pages',\n\t\t\t) );\n\n\t\t\t$this->add_setting( 'page_for_posts', array(\n\t\t\t\t'type'           => 'option',\n\t\t\t\t'capability'     => 'manage_options',\n\t\t\t//\t'theme_supports' => 'static-front-page',\n\t\t\t) );\n\n\t\t\t$this->add_control( 'page_for_posts', array(\n\t\t\t\t'label'      => __( 'Posts page' ),\n\t\t\t\t'section'    => 'static_front_page',\n\t\t\t\t'type'       => 'dropdown-pages',\n\t\t\t) );\n\t\t}\n\t}\n\n\t/**\n\t * Add settings from the POST data that were not added with code, e.g. dynamically-created settings for Widgets\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @see add_dynamic_settings()\n\t */\n\tpublic function register_dynamic_settings() {\n\t\t$this->add_dynamic_settings( array_keys( $this->unsanitized_post_values() ) );\n\t}\n\n\t/**\n\t * Callback for validating the header_textcolor value.\n\t *\n\t * Accepts 'blank', and otherwise uses sanitize_hex_color_no_hash().\n\t * Returns default text color if hex color is empty.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $color\n\t * @return mixed\n\t */\n\tpublic function _sanitize_header_textcolor( $color ) {\n\t\tif ( 'blank' === $color )\n\t\t\treturn 'blank';\n\n\t\t$color = sanitize_hex_color_no_hash( $color );\n\t\tif ( empty( $color ) )\n\t\t\t$color = get_theme_support( 'custom-header', 'default-text-color' );\n\n\t\treturn $color;\n\t}\n}\n\n/**\n * Sanitizes a hex color.\n *\n * Returns either '', a 3 or 6 digit hex color (with #), or nothing.\n * For sanitizing values without a #, see sanitize_hex_color_no_hash().\n *\n * @since 3.4.0\n *\n * @param string $color\n * @return string|void\n */\nfunction sanitize_hex_color( $color ) {\n\tif ( '' === $color )\n\t\treturn '';\n\n\t// 3 or 6 hex digits, or the empty string.\n\tif ( preg_match('|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) )\n\t\treturn $color;\n}\n\n/**\n * Sanitizes a hex color without a hash. Use sanitize_hex_color() when possible.\n *\n * Saving hex colors without a hash puts the burden of adding the hash on the\n * UI, which makes it difficult to use or upgrade to other color types such as\n * rgba, hsl, rgb, and html color names.\n *\n * Returns either '', a 3 or 6 digit hex color (without a #), or null.\n *\n * @since 3.4.0\n *\n * @param string $color\n * @return string|null\n */\nfunction sanitize_hex_color_no_hash( $color ) {\n\t$color = ltrim( $color, '#' );\n\n\tif ( '' === $color )\n\t\treturn '';\n\n\treturn sanitize_hex_color( '#' . $color ) ? $color : null;\n}\n\n/**\n * Ensures that any hex color is properly hashed.\n * Otherwise, returns value untouched.\n *\n * This method should only be necessary if using sanitize_hex_color_no_hash().\n *\n * @since 3.4.0\n *\n * @param string $color\n * @return string\n */\nfunction maybe_hash_hex_color( $color ) {\n\tif ( $unhashed = sanitize_hex_color_no_hash( $color ) )\n\t\treturn '#' . $unhashed;\n\n\treturn $color;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-customize-nav-menus.php",
    "content": "<?php\n/**\n * WordPress Customize Nav Menus classes\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.3.0\n */\n\n/**\n * Customize Nav Menus class.\n *\n * Implements menu management in the Customizer.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Manager\n */\nfinal class WP_Customize_Nav_Menus {\n\n\t/**\n\t * WP_Customize_Manager instance.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var WP_Customize_Manager\n\t */\n\tpublic $manager;\n\n\t/**\n\t * Previewed Menus.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $previewed_menus;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param object $manager An instance of the WP_Customize_Manager class.\n\t */\n\tpublic function __construct( $manager ) {\n\t\t$this->previewed_menus = array();\n\t\t$this->manager         = $manager;\n\n\t\tadd_action( 'wp_ajax_load-available-menu-items-customizer', array( $this, 'ajax_load_available_items' ) );\n\t\tadd_action( 'wp_ajax_search-available-menu-items-customizer', array( $this, 'ajax_search_available_items' ) );\n\t\tadd_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) );\n\n\t\t// Needs to run after core Navigation section is set up.\n\t\tadd_action( 'customize_register', array( $this, 'customize_register' ), 11 );\n\n\t\tadd_filter( 'customize_dynamic_setting_args', array( $this, 'filter_dynamic_setting_args' ), 10, 2 );\n\t\tadd_filter( 'customize_dynamic_setting_class', array( $this, 'filter_dynamic_setting_class' ), 10, 3 );\n\t\tadd_action( 'customize_controls_print_footer_scripts', array( $this, 'print_templates' ) );\n\t\tadd_action( 'customize_controls_print_footer_scripts', array( $this, 'available_items_template' ) );\n\t\tadd_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) );\n\t}\n\n\t/**\n\t * Ajax handler for loading available menu items.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function ajax_load_available_items() {\n\t\tcheck_ajax_referer( 'customize-menus', 'customize-menus-nonce' );\n\n\t\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\t\twp_die( -1 );\n\t\t}\n\n\t\tif ( empty( $_POST['type'] ) || empty( $_POST['object'] ) ) {\n\t\t\twp_send_json_error( 'nav_menus_missing_type_or_object_parameter' );\n\t\t}\n\n\t\t$type = sanitize_key( $_POST['type'] );\n\t\t$object = sanitize_key( $_POST['object'] );\n\t\t$page = empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] );\n\t\t$items = $this->load_available_items_query( $type, $object, $page );\n\n\t\tif ( is_wp_error( $items ) ) {\n\t\t\twp_send_json_error( $items->get_error_code() );\n\t\t} else {\n\t\t\twp_send_json_success( array( 'items' => $items ) );\n\t\t}\n\t}\n\n\t/**\n\t * Performs the post_type and taxonomy queries for loading available menu items.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param string $type   Optional. Accepts any custom object type and has built-in support for\n\t *                         'post_type' and 'taxonomy'. Default is 'post_type'.\n\t * @param string $object Optional. Accepts any registered taxonomy or post type name. Default is 'page'.\n\t * @param int    $page   Optional. The page number used to generate the query offset. Default is '0'.\n\t * @return WP_Error|array Returns either a WP_Error object or an array of menu items.\n\t */\n\tpublic function load_available_items_query( $type = 'post_type', $object = 'page', $page = 0 ) {\n\t\t$items = array();\n\n\t\tif ( 'post_type' === $type ) {\n\t\t\t$post_type = get_post_type_object( $object );\n\t\t\tif ( ! $post_type ) {\n\t\t\t\treturn new WP_Error( 'nav_menus_invalid_post_type' );\n\t\t\t}\n\n\t\t\tif ( 0 === $page && 'page' === $object ) {\n\t\t\t\t// Add \"Home\" link. Treat as a page, but switch to custom on add.\n\t\t\t\t$items[] = array(\n\t\t\t\t\t'id'         => 'home',\n\t\t\t\t\t'title'      => _x( 'Home', 'nav menu home label' ),\n\t\t\t\t\t'type'       => 'custom',\n\t\t\t\t\t'type_label' => __( 'Custom Link' ),\n\t\t\t\t\t'object'     => '',\n\t\t\t\t\t'url'        => home_url(),\n\t\t\t\t);\n\t\t\t} elseif ( 'post' !== $object && 0 === $page && $post_type->has_archive ) {\n\t\t\t\t// Add a post type archive link.\n\t\t\t\t$items[] = array(\n\t\t\t\t\t'id'         => $object . '-archive',\n\t\t\t\t\t'title'      => $post_type->labels->archives,\n\t\t\t\t\t'type'       => 'post_type_archive',\n\t\t\t\t\t'type_label' => __( 'Post Type Archive' ),\n\t\t\t\t\t'object'     => $object,\n\t\t\t\t\t'url'        => get_post_type_archive_link( $object ),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t$posts = get_posts( array(\n\t\t\t\t'numberposts' => 10,\n\t\t\t\t'offset'      => 10 * $page,\n\t\t\t\t'orderby'     => 'date',\n\t\t\t\t'order'       => 'DESC',\n\t\t\t\t'post_type'   => $object,\n\t\t\t) );\n\t\t\tforeach ( $posts as $post ) {\n\t\t\t\t$post_title = $post->post_title;\n\t\t\t\tif ( '' === $post_title ) {\n\t\t\t\t\t/* translators: %d: ID of a post */\n\t\t\t\t\t$post_title = sprintf( __( '#%d (no title)' ), $post->ID );\n\t\t\t\t}\n\t\t\t\t$items[] = array(\n\t\t\t\t\t'id'         => \"post-{$post->ID}\",\n\t\t\t\t\t'title'      => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ),\n\t\t\t\t\t'type'       => 'post_type',\n\t\t\t\t\t'type_label' => get_post_type_object( $post->post_type )->labels->singular_name,\n\t\t\t\t\t'object'     => $post->post_type,\n\t\t\t\t\t'object_id'  => intval( $post->ID ),\n\t\t\t\t\t'url'        => get_permalink( intval( $post->ID ) ),\n\t\t\t\t);\n\t\t\t}\n\t\t} elseif ( 'taxonomy' === $type ) {\n\t\t\t$terms = get_terms( $object, array(\n\t\t\t\t'child_of'     => 0,\n\t\t\t\t'exclude'      => '',\n\t\t\t\t'hide_empty'   => false,\n\t\t\t\t'hierarchical' => 1,\n\t\t\t\t'include'      => '',\n\t\t\t\t'number'       => 10,\n\t\t\t\t'offset'       => 10 * $page,\n\t\t\t\t'order'        => 'DESC',\n\t\t\t\t'orderby'      => 'count',\n\t\t\t\t'pad_counts'   => false,\n\t\t\t) );\n\t\t\tif ( is_wp_error( $terms ) ) {\n\t\t\t\treturn $terms;\n\t\t\t}\n\n\t\t\tforeach ( $terms as $term ) {\n\t\t\t\t$items[] = array(\n\t\t\t\t\t'id'         => \"term-{$term->term_id}\",\n\t\t\t\t\t'title'      => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ),\n\t\t\t\t\t'type'       => 'taxonomy',\n\t\t\t\t\t'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name,\n\t\t\t\t\t'object'     => $term->taxonomy,\n\t\t\t\t\t'object_id'  => intval( $term->term_id ),\n\t\t\t\t\t'url'        => get_term_link( intval( $term->term_id ), $term->taxonomy ),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the available menu items.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @param array  $items  The array of menu items.\n\t\t * @param string $type   The object type.\n\t\t * @param string $object The object name.\n\t\t * @param int    $page   The current page number.\n\t\t */\n\t\t$items = apply_filters( 'customize_nav_menu_available_items', $items, $type, $object, $page );\n\n\t\treturn $items;\n\t}\n\n\t/**\n\t * Ajax handler for searching available menu items.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function ajax_search_available_items() {\n\t\tcheck_ajax_referer( 'customize-menus', 'customize-menus-nonce' );\n\n\t\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\t\twp_die( -1 );\n\t\t}\n\n\t\tif ( empty( $_POST['search'] ) ) {\n\t\t\twp_send_json_error( 'nav_menus_missing_search_parameter' );\n\t\t}\n\n\t\t$p = isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 0;\n\t\tif ( $p < 1 ) {\n\t\t\t$p = 1;\n\t\t}\n\n\t\t$s = sanitize_text_field( wp_unslash( $_POST['search'] ) );\n\t\t$items = $this->search_available_items_query( array( 'pagenum' => $p, 's' => $s ) );\n\n\t\tif ( empty( $items ) ) {\n\t\t\twp_send_json_error( array( 'message' => __( 'No results found.' ) ) );\n\t\t} else {\n\t\t\twp_send_json_success( array( 'items' => $items ) );\n\t\t}\n\t}\n\n\t/**\n\t * Performs post queries for available-item searching.\n\t *\n\t * Based on WP_Editor::wp_link_query().\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments.\n\t * @return array Menu items.\n\t */\n\tpublic function search_available_items_query( $args = array() ) {\n\t\t$items = array();\n\n\t\t$post_type_objects = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );\n\t\t$query = array(\n\t\t\t'post_type'              => array_keys( $post_type_objects ),\n\t\t\t'suppress_filters'       => true,\n\t\t\t'update_post_term_cache' => false,\n\t\t\t'update_post_meta_cache' => false,\n\t\t\t'post_status'            => 'publish',\n\t\t\t'posts_per_page'         => 20,\n\t\t);\n\n\t\t$args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1;\n\t\t$query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0;\n\n\t\tif ( isset( $args['s'] ) ) {\n\t\t\t$query['s'] = $args['s'];\n\t\t}\n\n\t\t// Query posts.\n\t\t$get_posts = new WP_Query( $query );\n\n\t\t// Check if any posts were found.\n\t\tif ( $get_posts->post_count ) {\n\t\t\tforeach ( $get_posts->posts as $post ) {\n\t\t\t\t$post_title = $post->post_title;\n\t\t\t\tif ( '' === $post_title ) {\n\t\t\t\t\t/* translators: %d: ID of a post */\n\t\t\t\t\t$post_title = sprintf( __( '#%d (no title)' ), $post->ID );\n\t\t\t\t}\n\t\t\t\t$items[] = array(\n\t\t\t\t\t'id'         => 'post-' . $post->ID,\n\t\t\t\t\t'title'      => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ),\n\t\t\t\t\t'type'       => 'post_type',\n\t\t\t\t\t'type_label' => $post_type_objects[ $post->post_type ]->labels->singular_name,\n\t\t\t\t\t'object'     => $post->post_type,\n\t\t\t\t\t'object_id'  => intval( $post->ID ),\n\t\t\t\t\t'url'        => get_permalink( intval( $post->ID ) ),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Query taxonomy terms.\n\t\t$taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'names' );\n\t\t$terms = get_terms( $taxonomies, array(\n\t\t\t'name__like' => $args['s'],\n\t\t\t'number'     => 20,\n\t\t\t'offset'     => 20 * ($args['pagenum'] - 1),\n\t\t) );\n\n\t\t// Check if any taxonomies were found.\n\t\tif ( ! empty( $terms ) ) {\n\t\t\tforeach ( $terms as $term ) {\n\t\t\t\t$items[] = array(\n\t\t\t\t\t'id'         => 'term-' . $term->term_id,\n\t\t\t\t\t'title'      => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ),\n\t\t\t\t\t'type'       => 'taxonomy',\n\t\t\t\t\t'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name,\n\t\t\t\t\t'object'     => $term->taxonomy,\n\t\t\t\t\t'object_id'  => intval( $term->term_id ),\n\t\t\t\t\t'url'        => get_term_link( intval( $term->term_id ), $term->taxonomy ),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn $items;\n\t}\n\n\t/**\n\t * Enqueue scripts and styles for Customizer pane.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function enqueue_scripts() {\n\t\twp_enqueue_style( 'customize-nav-menus' );\n\t\twp_enqueue_script( 'customize-nav-menus' );\n\n\t\t$temp_nav_menu_setting      = new WP_Customize_Nav_Menu_Setting( $this->manager, 'nav_menu[-1]' );\n\t\t$temp_nav_menu_item_setting = new WP_Customize_Nav_Menu_Item_Setting( $this->manager, 'nav_menu_item[-1]' );\n\n\t\t// Pass data to JS.\n\t\t$settings = array(\n\t\t\t'nonce'                => wp_create_nonce( 'customize-menus' ),\n\t\t\t'allMenus'             => wp_get_nav_menus(),\n\t\t\t'itemTypes'            => $this->available_item_types(),\n\t\t\t'l10n'                 => array(\n\t\t\t\t'untitled'          => _x( '(no label)', 'missing menu item navigation label' ),\n\t\t\t\t'unnamed'           => _x( '(unnamed)', 'Missing menu name.' ),\n\t\t\t\t'custom_label'      => __( 'Custom Link' ),\n\t\t\t\t/* translators: %s: menu location slug */\n\t\t\t\t'menuLocation'      => _x( '(Currently set to: %s)', 'menu' ),\n\t\t\t\t'menuNameLabel'     => __( 'Menu Name' ),\n\t\t\t\t'itemAdded'         => __( 'Menu item added' ),\n\t\t\t\t'itemDeleted'       => __( 'Menu item deleted' ),\n\t\t\t\t'menuAdded'         => __( 'Menu created' ),\n\t\t\t\t'menuDeleted'       => __( 'Menu deleted' ),\n\t\t\t\t'movedUp'           => __( 'Menu item moved up' ),\n\t\t\t\t'movedDown'         => __( 'Menu item moved down' ),\n\t\t\t\t'movedLeft'         => __( 'Menu item moved out of submenu' ),\n\t\t\t\t'movedRight'        => __( 'Menu item is now a sub-item' ),\n\t\t\t\t/* translators: &#9656; is the unicode right-pointing triangle, and %s is the section title in the Customizer */\n\t\t\t\t'customizingMenus'  => sprintf( __( 'Customizing &#9656; %s' ), esc_html( $this->manager->get_panel( 'nav_menus' )->title ) ),\n\t\t\t\t/* translators: %s: title of menu item which is invalid */\n\t\t\t\t'invalidTitleTpl'   => __( '%s (Invalid)' ),\n\t\t\t\t/* translators: %s: title of menu item in draft status */\n\t\t\t\t'pendingTitleTpl'   => __( '%s (Pending)' ),\n\t\t\t\t'itemsFound'        => __( 'Number of items found: %d' ),\n\t\t\t\t'itemsFoundMore'    => __( 'Additional items found: %d' ),\n\t\t\t\t'itemsLoadingMore'  => __( 'Loading more results... please wait.' ),\n\t\t\t\t'reorderModeOn'     => __( 'Reorder mode enabled' ),\n\t\t\t\t'reorderModeOff'    => __( 'Reorder mode closed' ),\n\t\t\t\t'reorderLabelOn'    => esc_attr__( 'Reorder menu items' ),\n\t\t\t\t'reorderLabelOff'   => esc_attr__( 'Close reorder mode' ),\n\t\t\t),\n\t\t\t'menuItemTransport'    => 'postMessage',\n\t\t\t'phpIntMax'            => PHP_INT_MAX,\n\t\t\t'defaultSettingValues' => array(\n\t\t\t\t'nav_menu'      => $temp_nav_menu_setting->default,\n\t\t\t\t'nav_menu_item' => $temp_nav_menu_item_setting->default,\n\t\t\t),\n\t\t);\n\n\t\t$data = sprintf( 'var _wpCustomizeNavMenusSettings = %s;', wp_json_encode( $settings ) );\n\t\twp_scripts()->add_data( 'customize-nav-menus', 'data', $data );\n\n\t\t// This is copied from nav-menus.php, and it has an unfortunate object name of `menus`.\n\t\t$nav_menus_l10n = array(\n\t\t\t'oneThemeLocationNoMenus' => null,\n\t\t\t'moveUp'       => __( 'Move up one' ),\n\t\t\t'moveDown'     => __( 'Move down one' ),\n\t\t\t'moveToTop'    => __( 'Move to the top' ),\n\t\t\t/* translators: %s: previous item name */\n\t\t\t'moveUnder'    => __( 'Move under %s' ),\n\t\t\t/* translators: %s: previous item name */\n\t\t\t'moveOutFrom'  => __( 'Move out from under %s' ),\n\t\t\t/* translators: %s: previous item name */\n\t\t\t'under'        => __( 'Under %s' ),\n\t\t\t/* translators: %s: previous item name */\n\t\t\t'outFrom'      => __( 'Out from under %s' ),\n\t\t\t/* translators: 1: item name, 2: item position, 3: total number of items */\n\t\t\t'menuFocus'    => __( '%1$s. Menu item %2$d of %3$d.' ),\n\t\t\t/* translators: 1: item name, 2: item position, 3: parent item name */\n\t\t\t'subMenuFocus' => __( '%1$s. Sub item number %2$d under %3$s.' ),\n\t\t);\n\t\twp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n );\n\t}\n\n\t/**\n\t * Filter a dynamic setting's constructor args.\n\t *\n\t * For a dynamic setting to be registered, this filter must be employed\n\t * to override the default false value with an array of args to pass to\n\t * the WP_Customize_Setting constructor.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param false|array $setting_args The arguments to the WP_Customize_Setting constructor.\n\t * @param string      $setting_id   ID for dynamic setting, usually coming from `$_POST['customized']`.\n\t * @return array|false\n\t */\n\tpublic function filter_dynamic_setting_args( $setting_args, $setting_id ) {\n\t\tif ( preg_match( WP_Customize_Nav_Menu_Setting::ID_PATTERN, $setting_id ) ) {\n\t\t\t$setting_args = array(\n\t\t\t\t'type' => WP_Customize_Nav_Menu_Setting::TYPE,\n\t\t\t);\n\t\t} elseif ( preg_match( WP_Customize_Nav_Menu_Item_Setting::ID_PATTERN, $setting_id ) ) {\n\t\t\t$setting_args = array(\n\t\t\t\t'type' => WP_Customize_Nav_Menu_Item_Setting::TYPE,\n\t\t\t);\n\t\t}\n\t\treturn $setting_args;\n\t}\n\n\t/**\n\t * Allow non-statically created settings to be constructed with custom WP_Customize_Setting subclass.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param string $setting_class WP_Customize_Setting or a subclass.\n\t * @param string $setting_id    ID for dynamic setting, usually coming from `$_POST['customized']`.\n\t * @param array  $setting_args  WP_Customize_Setting or a subclass.\n\t * @return string\n\t */\n\tpublic function filter_dynamic_setting_class( $setting_class, $setting_id, $setting_args ) {\n\t\tunset( $setting_id );\n\n\t\tif ( ! empty( $setting_args['type'] ) && WP_Customize_Nav_Menu_Setting::TYPE === $setting_args['type'] ) {\n\t\t\t$setting_class = 'WP_Customize_Nav_Menu_Setting';\n\t\t} elseif ( ! empty( $setting_args['type'] ) && WP_Customize_Nav_Menu_Item_Setting::TYPE === $setting_args['type'] ) {\n\t\t\t$setting_class = 'WP_Customize_Nav_Menu_Item_Setting';\n\t\t}\n\t\treturn $setting_class;\n\t}\n\n\t/**\n\t * Add the customizer settings and controls.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function customize_register() {\n\n\t\t// Require JS-rendered control types.\n\t\t$this->manager->register_panel_type( 'WP_Customize_Nav_Menus_Panel' );\n\t\t$this->manager->register_control_type( 'WP_Customize_Nav_Menu_Control' );\n\t\t$this->manager->register_control_type( 'WP_Customize_Nav_Menu_Name_Control' );\n\t\t$this->manager->register_control_type( 'WP_Customize_Nav_Menu_Auto_Add_Control' );\n\t\t$this->manager->register_control_type( 'WP_Customize_Nav_Menu_Item_Control' );\n\n\t\t// Create a panel for Menus.\n\t\t$description = '<p>' . __( 'This panel is used for managing navigation menus for content you have already published on your site. You can create menus and add items for existing content such as pages, posts, categories, tags, formats, or custom links.' ) . '</p>';\n\t\tif ( current_theme_supports( 'widgets' ) ) {\n\t\t\t$description .= '<p>' . sprintf( __( 'Menus can be displayed in locations defined by your theme or in <a href=\"%s\">widget areas</a> by adding a &#8220;Custom Menu&#8221; widget.' ), \"javascript:wp.customize.panel( 'widgets' ).focus();\" ) . '</p>';\n\t\t} else {\n\t\t\t$description .= '<p>' . __( 'Menus can be displayed in locations defined by your theme.' ) . '</p>';\n\t\t}\n\t\t$this->manager->add_panel( new WP_Customize_Nav_Menus_Panel( $this->manager, 'nav_menus', array(\n\t\t\t'title'       => __( 'Menus' ),\n\t\t\t'description' => $description,\n\t\t\t'priority'    => 100,\n\t\t\t// 'theme_supports' => 'menus|widgets', @todo allow multiple theme supports\n\t\t) ) );\n\t\t$menus = wp_get_nav_menus();\n\n\t\t// Menu locations.\n\t\t$locations     = get_registered_nav_menus();\n\t\t$num_locations = count( array_keys( $locations ) );\n\t\tif ( 1 == $num_locations ) {\n\t\t\t$description = '<p>' . __( 'Your theme supports one menu. Select which menu you would like to use.' );\n\t\t} else {\n\t\t\t$description = '<p>' . sprintf( _n( 'Your theme supports %s menu. Select which menu appears in each location.', 'Your theme supports %s menus. Select which menu appears in each location.', $num_locations ), number_format_i18n( $num_locations ) );\n\t\t}\n\t\t$description  .= '</p><p>' . __( 'You can also place menus in widget areas with the Custom Menu widget.' ) . '</p>';\n\n\t\t$this->manager->add_section( 'menu_locations', array(\n\t\t\t'title'       => __( 'Menu Locations' ),\n\t\t\t'panel'       => 'nav_menus',\n\t\t\t'priority'    => 5,\n\t\t\t'description' => $description,\n\t\t) );\n\n\t\t$choices = array( '0' => __( '&mdash; Select &mdash;' ) );\n\t\tforeach ( $menus as $menu ) {\n\t\t\t$choices[ $menu->term_id ] = wp_html_excerpt( $menu->name, 40, '&hellip;' );\n\t\t}\n\n\t\tforeach ( $locations as $location => $description ) {\n\t\t\t$setting_id = \"nav_menu_locations[{$location}]\";\n\n\t\t\t$setting = $this->manager->get_setting( $setting_id );\n\t\t\tif ( $setting ) {\n\t\t\t\t$setting->transport = 'postMessage';\n\t\t\t\tremove_filter( \"customize_sanitize_{$setting_id}\", 'absint' );\n\t\t\t\tadd_filter( \"customize_sanitize_{$setting_id}\", array( $this, 'intval_base10' ) );\n\t\t\t} else {\n\t\t\t\t$this->manager->add_setting( $setting_id, array(\n\t\t\t\t\t'sanitize_callback' => array( $this, 'intval_base10' ),\n\t\t\t\t\t'theme_supports'    => 'menus',\n\t\t\t\t\t'type'              => 'theme_mod',\n\t\t\t\t\t'transport'         => 'postMessage',\n\t\t\t\t\t'default'           => 0,\n\t\t\t\t) );\n\t\t\t}\n\n\t\t\t$this->manager->add_control( new WP_Customize_Nav_Menu_Location_Control( $this->manager, $setting_id, array(\n\t\t\t\t'label'       => $description,\n\t\t\t\t'location_id' => $location,\n\t\t\t\t'section'     => 'menu_locations',\n\t\t\t\t'choices'     => $choices,\n\t\t\t) ) );\n\t\t}\n\n\t\t// Register each menu as a Customizer section, and add each menu item to each menu.\n\t\tforeach ( $menus as $menu ) {\n\t\t\t$menu_id = $menu->term_id;\n\n\t\t\t// Create a section for each menu.\n\t\t\t$section_id = 'nav_menu[' . $menu_id . ']';\n\t\t\t$this->manager->add_section( new WP_Customize_Nav_Menu_Section( $this->manager, $section_id, array(\n\t\t\t\t'title'     => html_entity_decode( $menu->name, ENT_QUOTES, get_bloginfo( 'charset' ) ),\n\t\t\t\t'priority'  => 10,\n\t\t\t\t'panel'     => 'nav_menus',\n\t\t\t) ) );\n\n\t\t\t$nav_menu_setting_id = 'nav_menu[' . $menu_id . ']';\n\t\t\t$this->manager->add_setting( new WP_Customize_Nav_Menu_Setting( $this->manager, $nav_menu_setting_id ) );\n\n\t\t\t// Add the menu contents.\n\t\t\t$menu_items = (array) wp_get_nav_menu_items( $menu_id );\n\n\t\t\tforeach ( array_values( $menu_items ) as $i => $item ) {\n\n\t\t\t\t// Create a setting for each menu item (which doesn't actually manage data, currently).\n\t\t\t\t$menu_item_setting_id = 'nav_menu_item[' . $item->ID . ']';\n\n\t\t\t\t$value = (array) $item;\n\t\t\t\t$value['nav_menu_term_id'] = $menu_id;\n\t\t\t\t$this->manager->add_setting( new WP_Customize_Nav_Menu_Item_Setting( $this->manager, $menu_item_setting_id, array(\n\t\t\t\t\t'value' => $value,\n\t\t\t\t) ) );\n\n\t\t\t\t// Create a control for each menu item.\n\t\t\t\t$this->manager->add_control( new WP_Customize_Nav_Menu_Item_Control( $this->manager, $menu_item_setting_id, array(\n\t\t\t\t\t'label'    => $item->title,\n\t\t\t\t\t'section'  => $section_id,\n\t\t\t\t\t'priority' => 10 + $i,\n\t\t\t\t) ) );\n\t\t\t}\n\n\t\t\t// Note: other controls inside of this section get added dynamically in JS via the MenuSection.ready() function.\n\t\t}\n\n\t\t// Add the add-new-menu section and controls.\n\t\t$this->manager->add_section( new WP_Customize_New_Menu_Section( $this->manager, 'add_menu', array(\n\t\t\t'title'    => __( 'Add a Menu' ),\n\t\t\t'panel'    => 'nav_menus',\n\t\t\t'priority' => 999,\n\t\t) ) );\n\n\t\t$this->manager->add_setting( 'new_menu_name', array(\n\t\t\t'type'      => 'new_menu',\n\t\t\t'default'   => '',\n\t\t\t'transport' => 'postMessage',\n\t\t) );\n\n\t\t$this->manager->add_control( 'new_menu_name', array(\n\t\t\t'label'       => '',\n\t\t\t'section'     => 'add_menu',\n\t\t\t'type'        => 'text',\n\t\t\t'input_attrs' => array(\n\t\t\t\t'class'       => 'menu-name-field',\n\t\t\t\t'placeholder' => __( 'New menu name' ),\n\t\t\t),\n\t\t) );\n\n\t\t$this->manager->add_setting( 'create_new_menu', array(\n\t\t\t'type' => 'new_menu',\n\t\t) );\n\n\t\t$this->manager->add_control( new WP_Customize_New_Menu_Control( $this->manager, 'create_new_menu', array(\n\t\t\t'section' => 'add_menu',\n\t\t) ) );\n\t}\n\n\t/**\n\t * Get the base10 intval.\n\t *\n\t * This is used as a setting's sanitize_callback; we can't use just plain\n\t * intval because the second argument is not what intval() expects.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param mixed $value Number to convert.\n\t * @return int Integer.\n\t */\n\tpublic function intval_base10( $value ) {\n\t\treturn intval( $value, 10 );\n\t}\n\n\t/**\n\t * Return an array of all the available item types.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @return array The available menu item types.\n\t */\n\tpublic function available_item_types() {\n\t\t$item_types = array();\n\n\t\t$post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );\n\t\tif ( $post_types ) {\n\t\t\tforeach ( $post_types as $slug => $post_type ) {\n\t\t\t\t$item_types[] = array(\n\t\t\t\t\t'title'  => $post_type->labels->name,\n\t\t\t\t\t'type'   => 'post_type',\n\t\t\t\t\t'object' => $post_type->name,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t$taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' );\n\t\tif ( $taxonomies ) {\n\t\t\tforeach ( $taxonomies as $slug => $taxonomy ) {\n\t\t\t\tif ( 'post_format' === $taxonomy && ! current_theme_supports( 'post-formats' ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$item_types[] = array(\n\t\t\t\t\t'title'  => $taxonomy->labels->name,\n\t\t\t\t\t'type'   => 'taxonomy',\n\t\t\t\t\t'object' => $taxonomy->name,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the available menu item types.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @param array $item_types Custom menu item types.\n\t\t */\n\t\t$item_types = apply_filters( 'customize_nav_menu_available_item_types', $item_types );\n\n\t\treturn $item_types;\n\t}\n\n\t/**\n\t * Print the JavaScript templates used to render Menu Customizer components.\n\t *\n\t * Templates are imported into the JS use wp.template.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function print_templates() {\n\t\t?>\n\t\t<script type=\"text/html\" id=\"tmpl-available-menu-item\">\n\t\t\t<li id=\"menu-item-tpl-{{ data.id }}\" class=\"menu-item-tpl\" data-menu-item-id=\"{{ data.id }}\">\n\t\t\t\t<div class=\"menu-item-bar\">\n\t\t\t\t\t<div class=\"menu-item-handle\">\n\t\t\t\t\t\t<span class=\"item-type\" aria-hidden=\"true\">{{ data.type_label }}</span>\n\t\t\t\t\t\t<span class=\"item-title\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t<span class=\"menu-item-title<# if ( ! data.title ) { #> no-title<# } #>\">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<button type=\"button\" class=\"button-link item-add\">\n\t\t\t\t\t\t\t<span class=\"screen-reader-text\"><?php\n\t\t\t\t\t\t\t\t/* translators: 1: Title of a menu item, 2: Type of a menu item */\n\t\t\t\t\t\t\t\tprintf( __( 'Add to menu: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.type_label }}' );\n\t\t\t\t\t\t\t?></span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</li>\n\t\t</script>\n\n\t\t<script type=\"text/html\" id=\"tmpl-menu-item-reorder-nav\">\n\t\t\t<div class=\"menu-item-reorder-nav\">\n\t\t\t\t<?php\n\t\t\t\tprintf(\n\t\t\t\t\t'<button type=\"button\" class=\"menus-move-up\">%1$s</button><button type=\"button\" class=\"menus-move-down\">%2$s</button><button type=\"button\" class=\"menus-move-left\">%3$s</button><button type=\"button\" class=\"menus-move-right\">%4$s</button>',\n\t\t\t\t\t__( 'Move up' ),\n\t\t\t\t\t__( 'Move down' ),\n\t\t\t\t\t__( 'Move one level up' ),\n\t\t\t\t\t__( 'Move one level down' )\n\t\t\t\t);\n\t\t\t\t?>\n\t\t\t</div>\n\t\t</script>\n\t<?php\n\t}\n\n\t/**\n\t * Print the html template used to render the add-menu-item frame.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function available_items_template() {\n\t\t?>\n\t\t<div id=\"available-menu-items\" class=\"accordion-container\">\n\t\t\t<div class=\"customize-section-title\">\n\t\t\t\t<button type=\"button\" class=\"customize-section-back\" tabindex=\"-1\">\n\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Back' ); ?></span>\n\t\t\t\t</button>\n\t\t\t\t<h3>\n\t\t\t\t\t<span class=\"customize-action\">\n\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t/* translators: &#9656; is the unicode right-pointing triangle, and %s is the section title in the Customizer */\n\t\t\t\t\t\t\tprintf( __( 'Customizing &#9656; %s' ), esc_html( $this->manager->get_panel( 'nav_menus' )->title ) );\n\t\t\t\t\t\t?>\n\t\t\t\t\t</span>\n\t\t\t\t\t<?php _e( 'Add Menu Items' ); ?>\n\t\t\t\t</h3>\n\t\t\t</div>\n\t\t\t<div id=\"available-menu-items-search\" class=\"accordion-section cannot-expand\">\n\t\t\t\t<div class=\"accordion-section-title\">\n\t\t\t\t\t<label class=\"screen-reader-text\" for=\"menu-items-search\"><?php _e( 'Search Menu Items' ); ?></label>\n\t\t\t\t\t<input type=\"text\" id=\"menu-items-search\" placeholder=\"<?php esc_attr_e( 'Search menu items&hellip;' ) ?>\" aria-describedby=\"menu-items-search-desc\" />\n\t\t\t\t\t<p class=\"screen-reader-text\" id=\"menu-items-search-desc\"><?php _e( 'The search results will be updated as you type.' ); ?></p>\n\t\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t\t<span class=\"clear-results\"><span class=\"screen-reader-text\"><?php _e( 'Clear Results' ); ?></span></span>\n\t\t\t\t</div>\n\t\t\t\t<ul class=\"accordion-section-content\" data-type=\"search\"></ul>\n\t\t\t</div>\n\t\t\t<div id=\"new-custom-menu-item\" class=\"accordion-section\">\n\t\t\t\t<h4 class=\"accordion-section-title\" role=\"presentation\">\n\t\t\t\t\t<?php _e( 'Custom Links' ); ?>\n\t\t\t\t\t<button type=\"button\" class=\"button-link\" aria-expanded=\"false\">\n\t\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Toggle section: Custom Links' ); ?></span>\n\t\t\t\t\t\t<span class=\"toggle-indicator\" aria-hidden=\"true\"></span>\n\t\t\t\t\t</button>\n\t\t\t\t</h4>\n\t\t\t\t<div class=\"accordion-section-content\">\n\t\t\t\t\t<input type=\"hidden\" value=\"custom\" id=\"custom-menu-item-type\" name=\"menu-item[-1][menu-item-type]\" />\n\t\t\t\t\t<p id=\"menu-item-url-wrap\">\n\t\t\t\t\t\t<label class=\"howto\" for=\"custom-menu-item-url\">\n\t\t\t\t\t\t\t<span><?php _e( 'URL' ); ?></span>\n\t\t\t\t\t\t\t<input id=\"custom-menu-item-url\" name=\"menu-item[-1][menu-item-url]\" type=\"text\" class=\"code menu-item-textbox\" value=\"http://\">\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</p>\n\t\t\t\t\t<p id=\"menu-item-name-wrap\">\n\t\t\t\t\t\t<label class=\"howto\" for=\"custom-menu-item-name\">\n\t\t\t\t\t\t\t<span><?php _e( 'Link Text' ); ?></span>\n\t\t\t\t\t\t\t<input id=\"custom-menu-item-name\" name=\"menu-item[-1][menu-item-title]\" type=\"text\" class=\"regular-text menu-item-textbox\">\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</p>\n\t\t\t\t\t<p class=\"button-controls\">\n\t\t\t\t\t\t<span class=\"add-to-menu\">\n\t\t\t\t\t\t\t<input type=\"submit\" class=\"button-secondary submit-add-to-menu right\" value=\"<?php esc_attr_e( 'Add to Menu' ); ?>\" name=\"add-custom-menu-item\" id=\"custom-menu-item-submit\">\n\t\t\t\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<?php\n\t\t\t// Containers for per-post-type item browsing; items added with JS.\n\t\t\tforeach ( $this->available_item_types() as $available_item_type ) {\n\t\t\t\t$id = sprintf( 'available-menu-items-%s-%s', $available_item_type['type'], $available_item_type['object'] );\n\t\t\t\t?>\n\t\t\t\t<div id=\"<?php echo esc_attr( $id ); ?>\" class=\"accordion-section\">\n\t\t\t\t\t<h4 class=\"accordion-section-title\" role=\"presentation\">\n\t\t\t\t\t\t<?php echo esc_html( $available_item_type['title'] ); ?>\n\t\t\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t\t\t<span class=\"no-items\"><?php _e( 'No items' ); ?></span>\n\t\t\t\t\t\t<button type=\"button\" class=\"button-link\" aria-expanded=\"false\">\n\t\t\t\t\t\t\t<span class=\"screen-reader-text\"><?php\n\t\t\t\t\t\t\t/* translators: %s: Title of a section with menu items */\n\t\t\t\t\t\t\tprintf( __( 'Toggle section: %s' ), esc_html( $available_item_type['title'] ) ); ?></span>\n\t\t\t\t\t\t\t<span class=\"toggle-indicator\" aria-hidden=\"true\"></span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</h4>\n\t\t\t\t\t<ul class=\"accordion-section-content\" data-type=\"<?php echo esc_attr( $available_item_type['type'] ); ?>\" data-object=\"<?php echo esc_attr( $available_item_type['object'] ); ?>\"></ul>\n\t\t\t\t</div>\n\t\t\t\t<?php\n\t\t\t}\n\t\t\t?>\n\t\t</div><!-- #available-menu-items -->\n\t<?php\n\t}\n\n\t// Start functionality specific to partial-refresh of menu changes in Customizer preview.\n\tconst RENDER_AJAX_ACTION = 'customize_render_menu_partial';\n\tconst RENDER_NONCE_POST_KEY = 'render-menu-nonce';\n\tconst RENDER_QUERY_VAR = 'wp_customize_menu_render';\n\n\t/**\n\t * The number of wp_nav_menu() calls which have happened in the preview.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $preview_nav_menu_instance_number = 0;\n\n\t/**\n\t * Nav menu args used for each instance.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $preview_nav_menu_instance_args = array();\n\n\t/**\n\t * Add hooks for the Customizer preview.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function customize_preview_init() {\n\t\tadd_action( 'template_redirect', array( $this, 'render_menu' ) );\n\t\tadd_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue_deps' ) );\n\n\t\tif ( ! isset( $_REQUEST[ self::RENDER_QUERY_VAR ] ) ) {\n\t\t\tadd_filter( 'wp_nav_menu_args', array( $this, 'filter_wp_nav_menu_args' ), 1000 );\n\t\t\tadd_filter( 'wp_nav_menu', array( $this, 'filter_wp_nav_menu' ), 10, 2 );\n\t\t}\n\t}\n\n\t/**\n\t * Keep track of the arguments that are being passed to wp_nav_menu().\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see wp_nav_menu()\n\t *\n\t * @param array $args An array containing wp_nav_menu() arguments.\n\t * @return array Arguments.\n\t */\n\tpublic function filter_wp_nav_menu_args( $args ) {\n\t\t$this->preview_nav_menu_instance_number += 1;\n\t\t$args['instance_number'] = $this->preview_nav_menu_instance_number;\n\n\t\t$can_partial_refresh = (\n\t\t\t! empty( $args['echo'] )\n\t\t\t&&\n\t\t\t( empty( $args['fallback_cb'] ) || is_string( $args['fallback_cb'] ) )\n\t\t\t&&\n\t\t\t( empty( $args['walker'] ) || is_string( $args['walker'] ) )\n\t\t\t&&\n\t\t\t(\n\t\t\t\t! empty( $args['theme_location'] )\n\t\t\t\t||\n\t\t\t\t( ! empty( $args['menu'] ) && ( is_numeric( $args['menu'] ) || is_object( $args['menu'] ) ) )\n\t\t\t)\n\t\t);\n\t\t$args['can_partial_refresh'] = $can_partial_refresh;\n\n\t\t$hashed_args = $args;\n\n\t\tif ( ! $can_partial_refresh ) {\n\t\t\t$hashed_args['fallback_cb'] = '';\n\t\t\t$hashed_args['walker'] = '';\n\t\t}\n\n\t\t// Replace object menu arg with a term_id menu arg, as this exports better to JS and is easier to compare hashes.\n\t\tif ( ! empty( $hashed_args['menu'] ) && is_object( $hashed_args['menu'] ) ) {\n\t\t\t$hashed_args['menu'] = $hashed_args['menu']->term_id;\n\t\t}\n\n\t\tksort( $hashed_args );\n\t\t$hashed_args['args_hash'] = $this->hash_nav_menu_args( $hashed_args );\n\n\t\t$this->preview_nav_menu_instance_args[ $this->preview_nav_menu_instance_number ] = $hashed_args;\n\t\treturn $args;\n\t}\n\n\t/**\n\t * Prepare wp_nav_menu() calls for partial refresh. Wraps output in container for refreshing.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see wp_nav_menu()\n\t *\n\t * @param string $nav_menu_content The HTML content for the navigation menu.\n\t * @param object $args             An object containing wp_nav_menu() arguments.\n\t * @return null\n\t */\n\tpublic function filter_wp_nav_menu( $nav_menu_content, $args ) {\n\t\tif ( ! empty( $args->can_partial_refresh ) && ! empty( $args->instance_number ) ) {\n\t\t\t$nav_menu_content = preg_replace(\n\t\t\t\t'/(?<=class=\")/',\n\t\t\t\tsprintf( 'partial-refreshable-nav-menu partial-refreshable-nav-menu-%1$d ', $args->instance_number ),\n\t\t\t\t$nav_menu_content,\n\t\t\t\t1 // Only update the class on the first element found, the menu container.\n\t\t\t);\n\t\t}\n\t\treturn $nav_menu_content;\n\t}\n\n\t/**\n\t * Hash (hmac) the arguments with the nonce and secret auth key to ensure they\n\t * are not tampered with when submitted in the Ajax request.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $args The arguments to hash.\n\t * @return string\n\t */\n\tpublic function hash_nav_menu_args( $args ) {\n\t\treturn wp_hash( wp_create_nonce( self::RENDER_AJAX_ACTION ) . serialize( $args ) );\n\t}\n\n\t/**\n\t * Enqueue scripts for the Customizer preview.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function customize_preview_enqueue_deps() {\n\t\twp_enqueue_script( 'customize-preview-nav-menus' );\n\t\twp_enqueue_style( 'customize-preview' );\n\n\t\tadd_action( 'wp_print_footer_scripts', array( $this, 'export_preview_data' ) );\n\t}\n\n\t/**\n\t * Export data from PHP to JS.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function export_preview_data() {\n\n\t\t// Why not wp_localize_script? Because we're not localizing, and it forces values into strings.\n\t\t$exports = array(\n\t\t\t'renderQueryVar'        => self::RENDER_QUERY_VAR,\n\t\t\t'renderNonceValue'      => wp_create_nonce( self::RENDER_AJAX_ACTION ),\n\t\t\t'renderNoncePostKey'    => self::RENDER_NONCE_POST_KEY,\n\t\t\t'requestUri'            => empty( $_SERVER['REQUEST_URI'] ) ? home_url( '/' ) : esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ),\n\t\t\t'theme'                 => array(\n\t\t\t\t'stylesheet' => $this->manager->get_stylesheet(),\n\t\t\t\t'active'     => $this->manager->is_theme_active(),\n\t\t\t),\n\t\t\t'previewCustomizeNonce' => wp_create_nonce( 'preview-customize_' . $this->manager->get_stylesheet() ),\n\t\t\t'navMenuInstanceArgs'   => $this->preview_nav_menu_instance_args,\n\t\t);\n\n\t\tprintf( '<script>var _wpCustomizePreviewNavMenusExports = %s;</script>', wp_json_encode( $exports ) );\n\t}\n\n\t/**\n\t * Render a specific menu via wp_nav_menu() using the supplied arguments.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see wp_nav_menu()\n\t */\n\tpublic function render_menu() {\n\t\tif ( empty( $_POST[ self::RENDER_QUERY_VAR ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->manager->remove_preview_signature();\n\n\t\tif ( empty( $_POST[ self::RENDER_NONCE_POST_KEY ] ) ) {\n\t\t\twp_send_json_error( 'missing_nonce_param' );\n\t\t}\n\n\t\tif ( ! is_customize_preview() ) {\n\t\t\twp_send_json_error( 'expected_customize_preview' );\n\t\t}\n\n\t\tif ( ! check_ajax_referer( self::RENDER_AJAX_ACTION, self::RENDER_NONCE_POST_KEY, false ) ) {\n\t\t\twp_send_json_error( 'nonce_check_fail' );\n\t\t}\n\n\t\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\t\twp_send_json_error( 'unauthorized' );\n\t\t}\n\n\t\tif ( ! isset( $_POST['wp_nav_menu_args'] ) ) {\n\t\t\twp_send_json_error( 'missing_param' );\n\t\t}\n\n\t\tif ( ! isset( $_POST['wp_nav_menu_args_hash'] ) ) {\n\t\t\twp_send_json_error( 'missing_param' );\n\t\t}\n\n\t\t$wp_nav_menu_args = json_decode( wp_unslash( $_POST['wp_nav_menu_args'] ), true );\n\t\tif ( ! is_array( $wp_nav_menu_args ) ) {\n\t\t\twp_send_json_error( 'wp_nav_menu_args_not_array' );\n\t\t}\n\n\t\t$wp_nav_menu_args_hash = sanitize_text_field( wp_unslash( $_POST['wp_nav_menu_args_hash'] ) );\n\t\tif ( ! hash_equals( $this->hash_nav_menu_args( $wp_nav_menu_args ), $wp_nav_menu_args_hash ) ) {\n\t\t\twp_send_json_error( 'wp_nav_menu_args_hash_mismatch' );\n\t\t}\n\n\t\t$wp_nav_menu_args['echo'] = false;\n\t\twp_send_json_success( wp_nav_menu( $wp_nav_menu_args ) );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-customize-panel.php",
    "content": "<?php\n/**\n * WordPress Customize Panel classes\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.0.0\n */\n\n/**\n * Customize Panel class.\n *\n * A UI container for sections, managed by the WP_Customize_Manager.\n *\n * @since 4.0.0\n *\n * @see WP_Customize_Manager\n */\nclass WP_Customize_Panel {\n\n\t/**\n\t * Incremented with each new class instantiation, then stored in $instance_number.\n\t *\n\t * Used when sorting two instances whose priorities are equal.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @static\n\t * @access protected\n\t * @static\n\t * @var int\n\t */\n\tprotected static $instance_count = 0;\n\n\t/**\n\t * Order in which this instance was created in relation to other instances.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $instance_number;\n\n\t/**\n\t * WP_Customize_Manager instance.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var WP_Customize_Manager\n\t */\n\tpublic $manager;\n\n\t/**\n\t * Unique identifier.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $id;\n\n\t/**\n\t * Priority of the panel, defining the display order of panels and sections.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var integer\n\t */\n\tpublic $priority = 160;\n\n\t/**\n\t * Capability required for the panel.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $capability = 'edit_theme_options';\n\n\t/**\n\t * Theme feature support for the panel.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var string|array\n\t */\n\tpublic $theme_supports = '';\n\n\t/**\n\t * Title of the panel to show in UI.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $title = '';\n\n\t/**\n\t * Description to show in the UI.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $description = '';\n\n\t/**\n\t * Customizer sections for this panel.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $sections;\n\n\t/**\n\t * Type of this panel.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'default';\n\n\t/**\n\t * Active callback.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Section::active()\n\t *\n\t * @var callable Callback is called with one argument, the instance of\n\t *               {@see WP_Customize_Section}, and returns bool to indicate\n\t *               whether the section is active (such as it relates to the URL\n\t *               currently being previewed).\n\t */\n\tpublic $active_callback = '';\n\n\t/**\n\t * Constructor.\n\t *\n\t * Any supplied $args override class property defaults.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t * @param string               $id      An specific ID for the panel.\n\t * @param array                $args    Panel arguments.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\t$keys = array_keys( get_object_vars( $this ) );\n\t\tforeach ( $keys as $key ) {\n\t\t\tif ( isset( $args[ $key ] ) ) {\n\t\t\t\t$this->$key = $args[ $key ];\n\t\t\t}\n\t\t}\n\n\t\t$this->manager = $manager;\n\t\t$this->id = $id;\n\t\tif ( empty( $this->active_callback ) ) {\n\t\t\t$this->active_callback = array( $this, 'active_callback' );\n\t\t}\n\t\tself::$instance_count += 1;\n\t\t$this->instance_number = self::$instance_count;\n\n\t\t$this->sections = array(); // Users cannot customize the $sections array.\n\t}\n\n\t/**\n\t * Check whether panel is active to current Customizer preview.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @return bool Whether the panel is active to the current preview.\n\t */\n\tfinal public function active() {\n\t\t$panel = $this;\n\t\t$active = call_user_func( $this->active_callback, $this );\n\n\t\t/**\n\t\t * Filter response of WP_Customize_Panel::active().\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param bool               $active  Whether the Customizer panel is active.\n\t\t * @param WP_Customize_Panel $panel   {@see WP_Customize_Panel} instance.\n\t\t */\n\t\t$active = apply_filters( 'customize_panel_active', $active, $panel );\n\n\t\treturn $active;\n\t}\n\n\t/**\n\t * Default callback used when invoking {@see WP_Customize_Panel::active()}.\n\t *\n\t * Subclasses can override this with their specific logic, or they may\n\t * provide an 'active_callback' argument to the constructor.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @return bool Always true.\n\t */\n\tpublic function active_callback() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Gather the parameters passed to client JavaScript via JSON.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @return array The array to be exported to the client as JSON.\n\t */\n\tpublic function json() {\n\t\t$array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'type' ) );\n\t\t$array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) );\n\t\t$array['content'] = $this->get_content();\n\t\t$array['active'] = $this->active();\n\t\t$array['instanceNumber'] = $this->instance_number;\n\t\treturn $array;\n\t}\n\n\t/**\n\t * Checks required user capabilities and whether the theme has the\n\t * feature support required by the panel.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @return bool False if theme doesn't support the panel or the user doesn't have the capability.\n\t */\n\tfinal public function check_capabilities() {\n\t\tif ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get the panel's content template for insertion into the Customizer pane.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @return string Content for the panel.\n\t */\n\tfinal public function get_content() {\n\t\tob_start();\n\t\t$this->maybe_render();\n\t\treturn trim( ob_get_clean() );\n\t}\n\n\t/**\n\t * Check capabilities and render the panel.\n\t *\n\t * @since 4.0.0\n\t */\n\tfinal public function maybe_render() {\n\t\tif ( ! $this->check_capabilities() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Fires before rendering a Customizer panel.\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @param WP_Customize_Panel $this WP_Customize_Panel instance.\n\t\t */\n\t\tdo_action( 'customize_render_panel', $this );\n\n\t\t/**\n\t\t * Fires before rendering a specific Customizer panel.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$this->id`, refers to\n\t\t * the ID of the specific Customizer panel to be rendered.\n\t\t *\n\t\t * @since 4.0.0\n\t\t */\n\t\tdo_action( \"customize_render_panel_{$this->id}\" );\n\n\t\t$this->render();\n\t}\n\n\t/**\n\t * Render the panel container, and then its contents (via `this->render_content()`) in a subclass.\n\t *\n\t * Panel containers are now rendered in JS by default, see {@see WP_Customize_Panel::print_template()}.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t */\n\tprotected function render() {}\n\n\t/**\n\t * Render the panel UI in a subclass.\n\t *\n\t * Panel contents are now rendered in JS by default, see {@see WP_Customize_Panel::print_template()}.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t */\n\tprotected function render_content() {}\n\n\t/**\n\t * Render the panel's JS templates.\n\t *\n\t * This function is only run for panel types that have been registered with\n\t * WP_Customize_Manager::register_panel_type().\n\t *\n\t * @since 4.3.0\n\t *\n\t * @see WP_Customize_Manager::register_panel_type()\n\t */\n\tpublic function print_template() {\n\t\t?>\n\t\t<script type=\"text/html\" id=\"tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>-content\">\n\t\t\t<?php $this->content_template(); ?>\n\t\t</script>\n\t\t<script type=\"text/html\" id=\"tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>\">\n\t\t\t<?php $this->render_template(); ?>\n\t\t</script>\n        <?php\n\t}\n\n\t/**\n\t * An Underscore (JS) template for rendering this panel's container.\n\t *\n\t * Class variables for this panel class are available in the `data` JS object;\n\t * export custom variables by overriding WP_Customize_Panel::json().\n\t *\n\t * @see WP_Customize_Panel::print_template()\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t */\n\tprotected function render_template() {\n\t\t?>\n\t\t<li id=\"accordion-panel-{{ data.id }}\" class=\"accordion-section control-section control-panel control-panel-{{ data.type }}\">\n\t\t\t<h3 class=\"accordion-section-title\" tabindex=\"0\">\n\t\t\t\t{{ data.title }}\n\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Press return or enter to open this panel' ); ?></span>\n\t\t\t</h3>\n\t\t\t<ul class=\"accordion-sub-container control-panel-content\"></ul>\n\t\t</li>\n\t\t<?php\n\t}\n\n\t/**\n\t * An Underscore (JS) template for this panel's content (but not its container).\n\t *\n\t * Class variables for this panel class are available in the `data` JS object;\n\t * export custom variables by overriding WP_Customize_Panel::json().\n\t *\n\t * @see WP_Customize_Panel::print_template()\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t */\n\tprotected function content_template() {\n\t\t?>\n\t\t<li class=\"panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>\">\n\t\t\t<button class=\"customize-panel-back\" tabindex=\"-1\"><span class=\"screen-reader-text\"><?php _e( 'Back' ); ?></span></button>\n\t\t\t<div class=\"accordion-section-title\">\n\t\t\t\t<span class=\"preview-notice\"><?php\n\t\t\t\t\t/* translators: %s is the site/panel title in the Customizer */\n\t\t\t\t\techo sprintf( __( 'You are customizing %s' ), '<strong class=\"panel-title\">{{ data.title }}</strong>' );\n\t\t\t\t?></span>\n\t\t\t\t<button class=\"customize-help-toggle dashicons dashicons-editor-help\" tabindex=\"0\" aria-expanded=\"false\"><span class=\"screen-reader-text\"><?php _e( 'Help' ); ?></span></button>\n\t\t\t</div>\n\t\t\t<# if ( data.description ) { #>\n\t\t\t\t<div class=\"description customize-panel-description\">\n\t\t\t\t\t{{{ data.description }}}\n\t\t\t\t</div>\n\t\t\t<# } #>\n\t\t</li>\n\t\t<?php\n\t}\n}\n\n/** WP_Customize_Nav_Menus_Panel class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-customize-section.php",
    "content": "<?php\n/**\n * WordPress Customize Section classes\n *\n * @package WordPress\n * @subpackage Customize\n * @since 3.4.0\n */\n\n/**\n * Customize Section class.\n *\n * A UI container for controls, managed by the WP_Customize_Manager class.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Manager\n */\nclass WP_Customize_Section {\n\n\t/**\n\t * Incremented with each new class instantiation, then stored in $instance_number.\n\t *\n\t * Used when sorting two instances whose priorities are equal.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @static\n\t * @access protected\n\t * @var int\n\t */\n\tprotected static $instance_count = 0;\n\n\t/**\n\t * Order in which this instance was created in relation to other instances.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $instance_number;\n\n\t/**\n\t * WP_Customize_Manager instance.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t * @var WP_Customize_Manager\n\t */\n\tpublic $manager;\n\n\t/**\n\t * Unique identifier.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $id;\n\n\t/**\n\t * Priority of the section which informs load order of sections.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t * @var integer\n\t */\n\tpublic $priority = 160;\n\n\t/**\n\t * Panel in which to show the section, making it a sub-section.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $panel = '';\n\n\t/**\n\t * Capability required for the section.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $capability = 'edit_theme_options';\n\n\t/**\n\t * Theme feature support for the section.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t * @var string|array\n\t */\n\tpublic $theme_supports = '';\n\n\t/**\n\t * Title of the section to show in UI.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $title = '';\n\n\t/**\n\t * Description to show in the UI.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $description = '';\n\n\t/**\n\t * Customizer controls for this section.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $controls;\n\n\t/**\n\t * Type of this section.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'default';\n\n\t/**\n\t * Active callback.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Section::active()\n\t *\n\t * @var callable Callback is called with one argument, the instance of\n\t *               {@see WP_Customize_Section}, and returns bool to indicate\n\t *               whether the section is active (such as it relates to the URL\n\t *               currently being previewed).\n\t */\n\tpublic $active_callback = '';\n\n\t/**\n\t * Constructor.\n\t *\n\t * Any supplied $args override class property defaults.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t * @param string               $id      An specific ID of the section.\n\t * @param array                $args    Section arguments.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\t$keys = array_keys( get_object_vars( $this ) );\n\t\tforeach ( $keys as $key ) {\n\t\t\tif ( isset( $args[ $key ] ) ) {\n\t\t\t\t$this->$key = $args[ $key ];\n\t\t\t}\n\t\t}\n\n\t\t$this->manager = $manager;\n\t\t$this->id = $id;\n\t\tif ( empty( $this->active_callback ) ) {\n\t\t\t$this->active_callback = array( $this, 'active_callback' );\n\t\t}\n\t\tself::$instance_count += 1;\n\t\t$this->instance_number = self::$instance_count;\n\n\t\t$this->controls = array(); // Users cannot customize the $controls array.\n\t}\n\n\t/**\n\t * Check whether section is active to current Customizer preview.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @return bool Whether the section is active to the current preview.\n\t */\n\tfinal public function active() {\n\t\t$section = $this;\n\t\t$active = call_user_func( $this->active_callback, $this );\n\n\t\t/**\n\t\t * Filter response of {@see WP_Customize_Section::active()}.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param bool                 $active  Whether the Customizer section is active.\n\t\t * @param WP_Customize_Section $section {@see WP_Customize_Section} instance.\n\t\t */\n\t\t$active = apply_filters( 'customize_section_active', $active, $section );\n\n\t\treturn $active;\n\t}\n\n\t/**\n\t * Default callback used when invoking {@see WP_Customize_Section::active()}.\n\t *\n\t * Subclasses can override this with their specific logic, or they may provide\n\t * an 'active_callback' argument to the constructor.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @return true Always true.\n\t */\n\tpublic function active_callback() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Gather the parameters passed to client JavaScript via JSON.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @return array The array to be exported to the client as JSON.\n\t */\n\tpublic function json() {\n\t\t$array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'panel', 'type' ) );\n\t\t$array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) );\n\t\t$array['content'] = $this->get_content();\n\t\t$array['active'] = $this->active();\n\t\t$array['instanceNumber'] = $this->instance_number;\n\n\t\tif ( $this->panel ) {\n\t\t\t/* translators: &#9656; is the unicode right-pointing triangle, and %s is the section title in the Customizer */\n\t\t\t$array['customizeAction'] = sprintf( __( 'Customizing &#9656; %s' ), esc_html( $this->manager->get_panel( $this->panel )->title ) );\n\t\t} else {\n\t\t\t$array['customizeAction'] = __( 'Customizing' );\n\t\t}\n\n\t\treturn $array;\n\t}\n\n\t/**\n\t * Checks required user capabilities and whether the theme has the\n\t * feature support required by the section.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return bool False if theme doesn't support the section or user doesn't have the capability.\n\t */\n\tfinal public function check_capabilities() {\n\t\tif ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get the section's content for insertion into the Customizer pane.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @return string Contents of the section.\n\t */\n\tfinal public function get_content() {\n\t\tob_start();\n\t\t$this->maybe_render();\n\t\treturn trim( ob_get_clean() );\n\t}\n\n\t/**\n\t * Check capabilities and render the section.\n\t *\n\t * @since 3.4.0\n\t */\n\tfinal public function maybe_render() {\n\t\tif ( ! $this->check_capabilities() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Fires before rendering a Customizer section.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Section $this WP_Customize_Section instance.\n\t\t */\n\t\tdo_action( 'customize_render_section', $this );\n\t\t/**\n\t\t * Fires before rendering a specific Customizer section.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$this->id`, refers to the ID\n\t\t * of the specific Customizer section to be rendered.\n\t\t *\n\t\t * @since 3.4.0\n\t\t */\n\t\tdo_action( \"customize_render_section_{$this->id}\" );\n\n\t\t$this->render();\n\t}\n\n\t/**\n\t * Render the section UI in a subclass.\n\t *\n\t * Sections are now rendered in JS by default, see {@see WP_Customize_Section::print_template()}.\n\t *\n\t * @since 3.4.0\n\t */\n\tprotected function render() {}\n\n\t/**\n\t * Render the section's JS template.\n\t *\n\t * This function is only run for section types that have been registered with\n\t * WP_Customize_Manager::register_section_type().\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Manager::render_template()\n\t */\n\tpublic function print_template() {\n        ?>\n\t\t<script type=\"text/html\" id=\"tmpl-customize-section-<?php echo $this->type; ?>\">\n\t\t\t<?php $this->render_template(); ?>\n\t\t</script>\n        <?php\n\t}\n\n\t/**\n\t * An Underscore (JS) template for rendering this section.\n\t *\n\t * Class variables for this section class are available in the `data` JS object;\n\t * export custom variables by overriding WP_Customize_Section::json().\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @see WP_Customize_Section::print_template()\n\t */\n\tprotected function render_template() {\n\t\t?>\n\t\t<li id=\"accordion-section-{{ data.id }}\" class=\"accordion-section control-section control-section-{{ data.type }}\">\n\t\t\t<h3 class=\"accordion-section-title\" tabindex=\"0\">\n\t\t\t\t{{ data.title }}\n\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Press return or enter to open this section' ); ?></span>\n\t\t\t</h3>\n\t\t\t<ul class=\"accordion-section-content\">\n\t\t\t\t<li class=\"customize-section-description-container\">\n\t\t\t\t\t<div class=\"customize-section-title\">\n\t\t\t\t\t\t<button class=\"customize-section-back\" tabindex=\"-1\">\n\t\t\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Back' ); ?></span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<h3>\n\t\t\t\t\t\t\t<span class=\"customize-action\">\n\t\t\t\t\t\t\t\t{{{ data.customizeAction }}}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{{ data.title }}\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t</div>\n\t\t\t\t\t<# if ( data.description ) { #>\n\t\t\t\t\t\t<div class=\"description customize-section-description\">\n\t\t\t\t\t\t\t{{{ data.description }}}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t<# } #>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</li>\n\t\t<?php\n\t}\n}\n\n/** WP_Customize_Themes_Section class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php' );\n\n/** WP_Customize_Sidebar_Section class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php' );\n\n/** WP_Customize_Nav_Menu_Section class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php' );\n\n/** WP_Customize_New_Menu_Section class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-new-menu-section.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-customize-setting.php",
    "content": "<?php\n/**\n * WordPress Customize Setting classes\n *\n * @package WordPress\n * @subpackage Customize\n * @since 3.4.0\n */\n\n/**\n * Customize Setting class.\n *\n * Handles saving and sanitizing of settings.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Manager\n */\nclass WP_Customize_Setting {\n\t/**\n\t * @access public\n\t * @var WP_Customize_Manager\n\t */\n\tpublic $manager;\n\n\t/**\n\t * Unique string identifier for the setting.\n\t *\n\t * @access public\n\t * @var string\n\t */\n\tpublic $id;\n\n\t/**\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'theme_mod';\n\n\t/**\n\t * Capability required to edit this setting.\n\t *\n\t * @var string\n\t */\n\tpublic $capability = 'edit_theme_options';\n\n\t/**\n\t * Feature a theme is required to support to enable this setting.\n\t *\n\t * @access public\n\t * @var string\n\t */\n\tpublic $theme_supports  = '';\n\tpublic $default         = '';\n\tpublic $transport       = 'refresh';\n\n\t/**\n\t * Server-side sanitization callback for the setting's value.\n\t *\n\t * @var callback\n\t */\n\tpublic $sanitize_callback    = '';\n\tpublic $sanitize_js_callback = '';\n\n\t/**\n\t * Whether or not the setting is initially dirty when created.\n\t *\n\t * This is used to ensure that a setting will be sent from the pane to the\n\t * preview when loading the Customizer. Normally a setting only is synced to\n\t * the preview if it has been changed. This allows the setting to be sent\n\t * from the start.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $dirty = false;\n\n\t/**\n\t * @var array\n\t */\n\tprotected $id_data = array();\n\n\t/**\n\t * Whether or not preview() was called.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $is_previewed = false;\n\n\t/**\n\t * Cache of multidimensional values to improve performance.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t * @static\n\t */\n\tprotected static $aggregated_multidimensionals = array();\n\n\t/**\n\t * Whether the multidimensional setting is aggregated.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $is_multidimensional_aggregated = false;\n\n\t/**\n\t * Constructor.\n\t *\n\t * Any supplied $args override class property defaults.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param WP_Customize_Manager $manager\n\t * @param string               $id      An specific ID of the setting. Can be a\n\t *                                      theme mod or option name.\n\t * @param array                $args    Setting arguments.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\t$keys = array_keys( get_object_vars( $this ) );\n\t\tforeach ( $keys as $key ) {\n\t\t\tif ( isset( $args[ $key ] ) ) {\n\t\t\t\t$this->$key = $args[ $key ];\n\t\t\t}\n\t\t}\n\n\t\t$this->manager = $manager;\n\t\t$this->id = $id;\n\n\t\t// Parse the ID for array keys.\n\t\t$this->id_data['keys'] = preg_split( '/\\[/', str_replace( ']', '', $this->id ) );\n\t\t$this->id_data['base'] = array_shift( $this->id_data['keys'] );\n\n\t\t// Rebuild the ID.\n\t\t$this->id = $this->id_data[ 'base' ];\n\t\tif ( ! empty( $this->id_data[ 'keys' ] ) ) {\n\t\t\t$this->id .= '[' . implode( '][', $this->id_data['keys'] ) . ']';\n\t\t}\n\n\t\tif ( $this->sanitize_callback ) {\n\t\t\tadd_filter( \"customize_sanitize_{$this->id}\", $this->sanitize_callback, 10, 2 );\n\t\t}\n\t\tif ( $this->sanitize_js_callback ) {\n\t\t\tadd_filter( \"customize_sanitize_js_{$this->id}\", $this->sanitize_js_callback, 10, 2 );\n\t\t}\n\n\t\tif ( 'option' === $this->type || 'theme_mod' === $this->type ) {\n\t\t\t// Other setting types can opt-in to aggregate multidimensional explicitly.\n\t\t\t$this->aggregate_multidimensional();\n\n\t\t\t// Allow option settings to indicate whether they should be autoloaded.\n\t\t\tif ( 'option' === $this->type && isset( $args['autoload'] ) ) {\n\t\t\t\tself::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] = $args['autoload'];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get parsed ID data for multidimensional setting.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array {\n\t *     ID data for multidimensional setting.\n\t *\n\t *     @type string $base ID base\n\t *     @type array  $keys Keys for multidimensional array.\n\t * }\n\t */\n\tfinal public function id_data() {\n\t\treturn $this->id_data;\n\t}\n\n\t/**\n\t * Set up the setting for aggregated multidimensional values.\n\t *\n\t * When a multidimensional setting gets aggregated, all of its preview and update\n\t * calls get combined into one call, greatly improving performance.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t */\n\tprotected function aggregate_multidimensional() {\n\t\t$id_base = $this->id_data['base'];\n\t\tif ( ! isset( self::$aggregated_multidimensionals[ $this->type ] ) ) {\n\t\t\tself::$aggregated_multidimensionals[ $this->type ] = array();\n\t\t}\n\t\tif ( ! isset( self::$aggregated_multidimensionals[ $this->type ][ $id_base ] ) ) {\n\t\t\tself::$aggregated_multidimensionals[ $this->type ][ $id_base ] = array(\n\t\t\t\t'previewed_instances'       => array(), // Calling preview() will add the $setting to the array.\n\t\t\t\t'preview_applied_instances' => array(), // Flags for which settings have had their values applied.\n\t\t\t\t'root_value'                => $this->get_root_value( array() ), // Root value for initial state, manipulated by preview and update calls.\n\t\t\t);\n\t\t}\n\n\t\tif ( ! empty( $this->id_data['keys'] ) ) {\n\t\t\t// Note the preview-applied flag is cleared at priority 9 to ensure it is cleared before a deferred-preview runs.\n\t\t\tadd_action( \"customize_post_value_set_{$this->id}\", array( $this, '_clear_aggregated_multidimensional_preview_applied_flag' ), 9 );\n\t\t\t$this->is_multidimensional_aggregated = true;\n\t\t}\n\t}\n\n\t/**\n\t * The ID for the current blog when the preview() method was called.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t * @var int\n\t */\n\tprotected $_previewed_blog_id;\n\n\t/**\n\t * Return true if the current blog is not the same as the previewed blog.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @return bool If preview() has been called.\n\t */\n\tpublic function is_current_blog_previewed() {\n\t\tif ( ! isset( $this->_previewed_blog_id ) ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn ( get_current_blog_id() === $this->_previewed_blog_id );\n\t}\n\n\t/**\n\t * Original non-previewed value stored by the preview method.\n\t *\n\t * @see WP_Customize_Setting::preview()\n\t * @since 4.1.1\n\t * @var mixed\n\t */\n\tprotected $_original_value;\n\n\t/**\n\t * Add filters to supply the setting's value when accessed.\n\t *\n\t * If the setting already has a pre-existing value and there is no incoming\n\t * post value for the setting, then this method will short-circuit since\n\t * there is no change to preview.\n\t *\n\t * @since 3.4.0\n\t * @since 4.4.0 Added boolean return value.\n\t * @access public\n\t *\n\t * @return bool False when preview short-circuits due no change needing to be previewed.\n\t */\n\tpublic function preview() {\n\t\tif ( ! isset( $this->_previewed_blog_id ) ) {\n\t\t\t$this->_previewed_blog_id = get_current_blog_id();\n\t\t}\n\n\t\t// Prevent re-previewing an already-previewed setting.\n\t\tif ( $this->is_previewed ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t$id_base = $this->id_data['base'];\n\t\t$is_multidimensional = ! empty( $this->id_data['keys'] );\n\t\t$multidimensional_filter = array( $this, '_multidimensional_preview_filter' );\n\n\t\t/*\n\t\t * Check if the setting has a pre-existing value (an isset check),\n\t\t * and if doesn't have any incoming post value. If both checks are true,\n\t\t * then the preview short-circuits because there is nothing that needs\n\t\t * to be previewed.\n\t\t */\n\t\t$undefined = new stdClass();\n\t\t$needs_preview = ( $undefined !== $this->post_value( $undefined ) );\n\t\t$value = null;\n\n\t\t// Since no post value was defined, check if we have an initial value set.\n\t\tif ( ! $needs_preview ) {\n\t\t\tif ( $this->is_multidimensional_aggregated ) {\n\t\t\t\t$root = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'];\n\t\t\t\t$value = $this->multidimensional_get( $root, $this->id_data['keys'], $undefined );\n\t\t\t} else {\n\t\t\t\t$default = $this->default;\n\t\t\t\t$this->default = $undefined; // Temporarily set default to undefined so we can detect if existing value is set.\n\t\t\t\t$value = $this->value();\n\t\t\t\t$this->default = $default;\n\t\t\t}\n\t\t\t$needs_preview = ( $undefined === $value ); // Because the default needs to be supplied.\n\t\t}\n\n\t\t// If the setting does not need previewing now, defer to when it has a value to preview.\n\t\tif ( ! $needs_preview ) {\n\t\t\tif ( ! has_action( \"customize_post_value_set_{$this->id}\", array( $this, 'preview' ) ) ) {\n\t\t\t\tadd_action( \"customize_post_value_set_{$this->id}\", array( $this, 'preview' ) );\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tswitch ( $this->type ) {\n\t\t\tcase 'theme_mod' :\n\t\t\t\tif ( ! $is_multidimensional ) {\n\t\t\t\t\tadd_filter( \"theme_mod_{$id_base}\", array( $this, '_preview_filter' ) );\n\t\t\t\t} else {\n\t\t\t\t\tif ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) {\n\t\t\t\t\t\t// Only add this filter once for this ID base.\n\t\t\t\t\t\tadd_filter( \"theme_mod_{$id_base}\", $multidimensional_filter );\n\t\t\t\t\t}\n\t\t\t\t\tself::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'][ $this->id ] = $this;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'option' :\n\t\t\t\tif ( ! $is_multidimensional ) {\n\t\t\t\t\tadd_filter( \"pre_option_{$id_base}\", array( $this, '_preview_filter' ) );\n\t\t\t\t} else {\n\t\t\t\t\tif ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) {\n\t\t\t\t\t\t// Only add these filters once for this ID base.\n\t\t\t\t\t\tadd_filter( \"option_{$id_base}\", $multidimensional_filter );\n\t\t\t\t\t\tadd_filter( \"default_option_{$id_base}\", $multidimensional_filter );\n\t\t\t\t\t}\n\t\t\t\t\tself::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'][ $this->id ] = $this;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault :\n\n\t\t\t\t/**\n\t\t\t\t * Fires when the {@see WP_Customize_Setting::preview()} method is called for settings\n\t\t\t\t * not handled as theme_mods or options.\n\t\t\t\t *\n\t\t\t\t * The dynamic portion of the hook name, `$this->id`, refers to the setting ID.\n\t\t\t\t *\n\t\t\t\t * @since 3.4.0\n\t\t\t\t *\n\t\t\t\t * @param WP_Customize_Setting $this {@see WP_Customize_Setting} instance.\n\t\t\t\t */\n\t\t\t\tdo_action( \"customize_preview_{$this->id}\", $this );\n\n\t\t\t\t/**\n\t\t\t\t * Fires when the {@see WP_Customize_Setting::preview()} method is called for settings\n\t\t\t\t * not handled as theme_mods or options.\n\t\t\t\t *\n\t\t\t\t * The dynamic portion of the hook name, `$this->type`, refers to the setting type.\n\t\t\t\t *\n\t\t\t\t * @since 4.1.0\n\t\t\t\t *\n\t\t\t\t * @param WP_Customize_Setting $this {@see WP_Customize_Setting} instance.\n\t\t\t\t */\n\t\t\t\tdo_action( \"customize_preview_{$this->type}\", $this );\n\t\t}\n\n\t\t$this->is_previewed = true;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Clear out the previewed-applied flag for a multidimensional-aggregated value whenever its post value is updated.\n\t *\n\t * This ensures that the new value will get sanitized and used the next time\n\t * that <code>WP_Customize_Setting::_multidimensional_preview_filter()</code>\n\t * is called for this setting.\n\t *\n\t * @since 4.4.0\n\t * @access private\n\t * @see WP_Customize_Manager::set_post_value()\n\t * @see WP_Customize_Setting::_multidimensional_preview_filter()\n\t */\n\tfinal public function _clear_aggregated_multidimensional_preview_applied_flag() {\n\t\tunset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['preview_applied_instances'][ $this->id ] );\n\t}\n\n\t/**\n\t * Callback function to filter non-multidimensional theme mods and options.\n\t *\n\t * If switch_to_blog() was called after the preview() method, and the current\n\t * blog is now not the same blog, then this method does a no-op and returns\n\t * the original value.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param mixed $original Old value.\n\t * @return mixed New or old value.\n\t */\n\tpublic function _preview_filter( $original ) {\n\t\tif ( ! $this->is_current_blog_previewed() ) {\n\t\t\treturn $original;\n\t\t}\n\n\t\t$undefined = new stdClass(); // Symbol hack.\n\t\t$post_value = $this->post_value( $undefined );\n\t\tif ( $undefined !== $post_value ) {\n\t\t\t$value = $post_value;\n\t\t} else {\n\t\t\t/*\n\t\t\t * Note that we don't use $original here because preview() will\n\t\t\t * not add the filter in the first place if it has an initial value\n\t\t\t * and there is no post value.\n\t\t\t */\n\t\t\t$value = $this->default;\n\t\t}\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Callback function to filter multidimensional theme mods and options.\n\t *\n\t * For all multidimensional settings of a given type, the preview filter for\n\t * the first setting previewed will be used to apply the values for the others.\n\t *\n\t * @since 4.4.0\n\t * @access private\n\t *\n\t * @see WP_Customize_Setting::$aggregated_multidimensionals\n\t * @param mixed $original Original root value.\n\t * @return mixed New or old value.\n\t */\n\tfinal public function _multidimensional_preview_filter( $original ) {\n\t\tif ( ! $this->is_current_blog_previewed() ) {\n\t\t\treturn $original;\n\t\t}\n\n\t\t$id_base = $this->id_data['base'];\n\n\t\t// If no settings have been previewed yet (which should not be the case, since $this is), just pass through the original value.\n\t\tif ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) {\n\t\t\treturn $original;\n\t\t}\n\n\t\tforeach ( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] as $previewed_setting ) {\n\t\t\t// Skip applying previewed value for any settings that have already been applied.\n\t\t\tif ( ! empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Do the replacements of the posted/default sub value into the root value.\n\t\t\t$value = $previewed_setting->post_value( $previewed_setting->default );\n\t\t\t$root = self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value'];\n\t\t\t$root = $previewed_setting->multidimensional_replace( $root, $previewed_setting->id_data['keys'], $value );\n\t\t\tself::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value'] = $root;\n\n\t\t\t// Mark this setting having been applied so that it will be skipped when the filter is called again.\n\t\t\tself::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] = true;\n\t\t}\n\n\t\treturn self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'];\n\t}\n\n\t/**\n\t * Check user capabilities and theme supports, and then save\n\t * the value of the setting.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return false|void False if cap check fails or value isn't set.\n\t */\n\tfinal public function save() {\n\t\t$value = $this->post_value();\n\n\t\tif ( ! $this->check_capabilities() || ! isset( $value ) )\n\t\t\treturn false;\n\n\t\t/**\n\t\t * Fires when the WP_Customize_Setting::save() method is called.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$this->id_data['base']` refers to\n\t\t * the base slug of the setting name.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param WP_Customize_Setting $this {@see WP_Customize_Setting} instance.\n\t\t */\n\t\tdo_action( 'customize_save_' . $this->id_data[ 'base' ], $this );\n\n\t\t$this->update( $value );\n\t}\n\n\t/**\n\t * Fetch and sanitize the $_POST value for the setting.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param mixed $default A default value which is used as a fallback. Default is null.\n\t * @return mixed The default value on failure, otherwise the sanitized value.\n\t */\n\tfinal public function post_value( $default = null ) {\n\t\treturn $this->manager->post_value( $this, $default );\n\t}\n\n\t/**\n\t * Sanitize an input.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string|array $value The value to sanitize.\n\t * @return string|array|null Null if an input isn't valid, otherwise the sanitized value.\n\t */\n\tpublic function sanitize( $value ) {\n\t\t$value = wp_unslash( $value );\n\n\t\t/**\n\t\t * Filter a Customize setting value in un-slashed form.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param mixed                $value Value of the setting.\n\t\t * @param WP_Customize_Setting $this  WP_Customize_Setting instance.\n\t\t */\n\t\treturn apply_filters( \"customize_sanitize_{$this->id}\", $value, $this );\n\t}\n\n\t/**\n\t * Get the root value for a setting, especially for multidimensional ones.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @param mixed $default Value to return if root does not exist.\n\t * @return mixed\n\t */\n\tprotected function get_root_value( $default = null ) {\n\t\t$id_base = $this->id_data['base'];\n\t\tif ( 'option' === $this->type ) {\n\t\t\treturn get_option( $id_base, $default );\n\t\t} else if ( 'theme_mod' ) {\n\t\t\treturn get_theme_mod( $id_base, $default );\n\t\t} else {\n\t\t\t/*\n\t\t\t * Any WP_Customize_Setting subclass implementing aggregate multidimensional\n\t\t\t * will need to override this method to obtain the data from the appropriate\n\t\t\t * location.\n\t\t\t */\n\t\t\treturn $default;\n\t\t}\n\t}\n\n\t/**\n\t * Set the root value for a setting, especially for multidimensional ones.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @param mixed $value Value to set as root of multidimensional setting.\n\t * @return bool Whether the multidimensional root was updated successfully.\n\t */\n\tprotected function set_root_value( $value ) {\n\t\t$id_base = $this->id_data['base'];\n\t\tif ( 'option' === $this->type ) {\n\t\t\t$autoload = true;\n\t\t\tif ( isset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] ) ) {\n\t\t\t\t$autoload = self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'];\n\t\t\t}\n\t\t\treturn update_option( $id_base, $value, $autoload );\n\t\t} else if ( 'theme_mod' ) {\n\t\t\tset_theme_mod( $id_base, $value );\n\t\t\treturn true;\n\t\t} else {\n\t\t\t/*\n\t\t\t * Any WP_Customize_Setting subclass implementing aggregate multidimensional\n\t\t\t * will need to override this method to obtain the data from the appropriate\n\t\t\t * location.\n\t\t\t */\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Save the value of the setting, using the related API.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param mixed $value The value to update.\n\t * @return bool The result of saving the value.\n\t */\n\tprotected function update( $value ) {\n\t\t$id_base = $this->id_data['base'];\n\t\tif ( 'option' === $this->type || 'theme_mod' === $this->type ) {\n\t\t\tif ( ! $this->is_multidimensional_aggregated ) {\n\t\t\t\treturn $this->set_root_value( $value );\n\t\t\t} else {\n\t\t\t\t$root = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'];\n\t\t\t\t$root = $this->multidimensional_replace( $root, $this->id_data['keys'], $value );\n\t\t\t\tself::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'] = $root;\n\t\t\t\treturn $this->set_root_value( $root );\n\t\t\t}\n\t\t} else {\n\t\t\t/**\n\t\t\t * Fires when the {@see WP_Customize_Setting::update()} method is called for settings\n\t\t\t * not handled as theme_mods or options.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$this->type`, refers to the type of setting.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param mixed                $value Value of the setting.\n\t\t\t * @param WP_Customize_Setting $this  WP_Customize_Setting instance.\n\t\t\t */\n\t\t\tdo_action( \"customize_update_{$this->type}\", $value, $this );\n\n\t\t\treturn has_action( \"customize_update_{$this->type}\" );\n\t\t}\n\t}\n\n\t/**\n\t * Deprecated method.\n\t *\n\t * @since 3.4.0\n\t * @deprecated 4.4.0 Deprecated in favor of update() method.\n\t */\n\tprotected function _update_theme_mod() {\n\t\t_deprecated_function( __METHOD__, '4.4.0', __CLASS__ . '::update()' );\n\t}\n\n\t/**\n\t * Deprecated method.\n\t *\n\t * @since 3.4.0\n\t * @deprecated 4.4.0 Deprecated in favor of update() method.\n\t */\n\tprotected function _update_option() {\n\t\t_deprecated_function( __METHOD__, '4.4.0', __CLASS__ . '::update()' );\n\t}\n\n\t/**\n\t * Fetch the value of the setting.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return mixed The value.\n\t */\n\tpublic function value() {\n\t\t$id_base = $this->id_data['base'];\n\t\t$is_core_type = ( 'option' === $this->type || 'theme_mod' === $this->type );\n\n\t\tif ( ! $is_core_type && ! $this->is_multidimensional_aggregated ) {\n\t\t\t$value = $this->get_root_value( $this->default );\n\n\t\t\t/**\n\t\t\t * Filter a Customize setting value not handled as a theme_mod or option.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$this->id_date['base']`, refers to\n\t\t\t * the base slug of the setting name.\n\t\t\t *\n\t\t\t * For settings handled as theme_mods or options, see those corresponding\n\t\t\t * functions for available hooks.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param mixed $default The setting default value. Default empty.\n\t\t\t */\n\t\t\t$value = apply_filters( \"customize_value_{$id_base}\", $value );\n\t\t} else if ( $this->is_multidimensional_aggregated ) {\n\t\t\t$root_value = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'];\n\t\t\t$value = $this->multidimensional_get( $root_value, $this->id_data['keys'], $this->default );\n\t\t} else {\n\t\t\t$value = $this->get_root_value( $this->default );\n\t\t}\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Sanitize the setting's value for use in JavaScript.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return mixed The requested escaped value.\n\t */\n\tpublic function js_value() {\n\n\t\t/**\n\t\t * Filter a Customize setting value for use in JavaScript.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$this->id`, refers to the setting ID.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param mixed                $value The setting value.\n\t\t * @param WP_Customize_Setting $this  {@see WP_Customize_Setting} instance.\n\t\t */\n\t\t$value = apply_filters( \"customize_sanitize_js_{$this->id}\", $this->value(), $this );\n\n\t\tif ( is_string( $value ) )\n\t\t\treturn html_entity_decode( $value, ENT_QUOTES, 'UTF-8');\n\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Validate user capabilities whether the theme supports the setting.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @return bool False if theme doesn't support the setting or user can't change setting, otherwise true.\n\t */\n\tfinal public function check_capabilities() {\n\t\tif ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) )\n\t\t\treturn false;\n\n\t\tif ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) )\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Multidimensional helper function.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param $root\n\t * @param $keys\n\t * @param bool $create Default is false.\n\t * @return array|void Keys are 'root', 'node', and 'key'.\n\t */\n\tfinal protected function multidimensional( &$root, $keys, $create = false ) {\n\t\tif ( $create && empty( $root ) )\n\t\t\t$root = array();\n\n\t\tif ( ! isset( $root ) || empty( $keys ) )\n\t\t\treturn;\n\n\t\t$last = array_pop( $keys );\n\t\t$node = &$root;\n\n\t\tforeach ( $keys as $key ) {\n\t\t\tif ( $create && ! isset( $node[ $key ] ) )\n\t\t\t\t$node[ $key ] = array();\n\n\t\t\tif ( ! is_array( $node ) || ! isset( $node[ $key ] ) )\n\t\t\t\treturn;\n\n\t\t\t$node = &$node[ $key ];\n\t\t}\n\n\t\tif ( $create ) {\n\t\t\tif ( ! is_array( $node ) ) {\n\t\t\t\t// account for an array overriding a string or object value\n\t\t\t\t$node = array();\n\t\t\t}\n\t\t\tif ( ! isset( $node[ $last ] ) ) {\n\t\t\t\t$node[ $last ] = array();\n\t\t\t}\n\t\t}\n\n\t\tif ( ! isset( $node[ $last ] ) )\n\t\t\treturn;\n\n\t\treturn array(\n\t\t\t'root' => &$root,\n\t\t\t'node' => &$node,\n\t\t\t'key'  => $last,\n\t\t);\n\t}\n\n\t/**\n\t * Will attempt to replace a specific value in a multidimensional array.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param $root\n\t * @param $keys\n\t * @param mixed $value The value to update.\n\t * @return mixed\n\t */\n\tfinal protected function multidimensional_replace( $root, $keys, $value ) {\n\t\tif ( ! isset( $value ) )\n\t\t\treturn $root;\n\t\telseif ( empty( $keys ) ) // If there are no keys, we're replacing the root.\n\t\t\treturn $value;\n\n\t\t$result = $this->multidimensional( $root, $keys, true );\n\n\t\tif ( isset( $result ) )\n\t\t\t$result['node'][ $result['key'] ] = $value;\n\n\t\treturn $root;\n\t}\n\n\t/**\n\t * Will attempt to fetch a specific value from a multidimensional array.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param $root\n\t * @param $keys\n\t * @param mixed $default A default value which is used as a fallback. Default is null.\n\t * @return mixed The requested value or the default value.\n\t */\n\tfinal protected function multidimensional_get( $root, $keys, $default = null ) {\n\t\tif ( empty( $keys ) ) // If there are no keys, test the root.\n\t\t\treturn isset( $root ) ? $root : $default;\n\n\t\t$result = $this->multidimensional( $root, $keys );\n\t\treturn isset( $result ) ? $result['node'][ $result['key'] ] : $default;\n\t}\n\n\t/**\n\t * Will attempt to check if a specific value in a multidimensional array is set.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param $root\n\t * @param $keys\n\t * @return bool True if value is set, false if not.\n\t */\n\tfinal protected function multidimensional_isset( $root, $keys ) {\n\t\t$result = $this->multidimensional_get( $root, $keys );\n\t\treturn isset( $result );\n\t}\n}\n\n/** WP_Customize_Filter_Setting class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-filter-setting.php' );\n\n/** WP_Customize_Header_Image_Setting class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-setting.php' );\n\n/** WP_Customize_Background_Image_Setting class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-setting.php' );\n\n/** WP_Customize_Nav_Menu_Item_Setting class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-setting.php' );\n\n/** WP_Customize_Nav_Menu_Setting class */\nrequire_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-setting.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-customize-widgets.php",
    "content": "<?php\n/**\n * WordPress Customize Widgets classes\n *\n * @package WordPress\n * @subpackage Customize\n * @since 3.9.0\n */\n\n/**\n * Customize Widgets class.\n *\n * Implements widget management in the Customizer.\n *\n * @since 3.9.0\n *\n * @see WP_Customize_Manager\n */\nfinal class WP_Customize_Widgets {\n\n\t/**\n\t * WP_Customize_Manager instance.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t * @var WP_Customize_Manager\n\t */\n\tpublic $manager;\n\n\t/**\n\t * All id_bases for widgets defined in core.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $core_widget_id_bases = array(\n\t\t'archives', 'calendar', 'categories', 'links', 'meta',\n\t\t'nav_menu', 'pages', 'recent-comments', 'recent-posts',\n\t\t'rss', 'search', 'tag_cloud', 'text',\n\t);\n\n\t/**\n\t * @since 3.9.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $rendered_sidebars = array();\n\n\t/**\n\t * @since 3.9.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $rendered_widgets = array();\n\n\t/**\n\t * @since 3.9.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $old_sidebars_widgets = array();\n\n\t/**\n\t * Mapping of setting type to setting ID pattern.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $setting_id_patterns = array(\n\t\t'widget_instance' => '/^(widget_.+?)(?:\\[(\\d+)\\])?$/',\n\t\t'sidebar_widgets' => '/^sidebars_widgets\\[(.+?)\\]$/',\n\t);\n\n\t/**\n\t * Initial loader.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param WP_Customize_Manager $manager Customize manager bootstrap instance.\n\t */\n\tpublic function __construct( $manager ) {\n\t\t$this->manager = $manager;\n\n\t\tadd_filter( 'customize_dynamic_setting_args',          array( $this, 'filter_customize_dynamic_setting_args' ), 10, 2 );\n\t\tadd_action( 'after_setup_theme',                       array( $this, 'register_settings' ) );\n\t\tadd_action( 'wp_loaded',                               array( $this, 'override_sidebars_widgets_for_theme_switch' ) );\n\t\tadd_action( 'customize_controls_init',                 array( $this, 'customize_controls_init' ) );\n\t\tadd_action( 'customize_register',                      array( $this, 'schedule_customize_register' ), 1 );\n\t\tadd_action( 'customize_controls_enqueue_scripts',      array( $this, 'enqueue_scripts' ) );\n\t\tadd_action( 'customize_controls_print_styles',         array( $this, 'print_styles' ) );\n\t\tadd_action( 'customize_controls_print_scripts',        array( $this, 'print_scripts' ) );\n\t\tadd_action( 'customize_controls_print_footer_scripts', array( $this, 'print_footer_scripts' ) );\n\t\tadd_action( 'customize_controls_print_footer_scripts', array( $this, 'output_widget_control_templates' ) );\n\t\tadd_action( 'customize_preview_init',                  array( $this, 'customize_preview_init' ) );\n\t\tadd_filter( 'customize_refresh_nonces',                array( $this, 'refresh_nonces' ) );\n\n\t\tadd_action( 'dynamic_sidebar',                         array( $this, 'tally_rendered_widgets' ) );\n\t\tadd_filter( 'is_active_sidebar',                       array( $this, 'tally_sidebars_via_is_active_sidebar_calls' ), 10, 2 );\n\t\tadd_filter( 'dynamic_sidebar_has_widgets',             array( $this, 'tally_sidebars_via_dynamic_sidebar_calls' ), 10, 2 );\n\t}\n\n\t/**\n\t * Get the widget setting type given a setting ID.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @staticvar array $cache\n\t *\n\t * @param $setting_id Setting ID.\n\t * @return string|void Setting type.\n\t */\n\tprotected function get_setting_type( $setting_id ) {\n\t\tstatic $cache = array();\n\t\tif ( isset( $cache[ $setting_id ] ) ) {\n\t\t\treturn $cache[ $setting_id ];\n\t\t}\n\t\tforeach ( $this->setting_id_patterns as $type => $pattern ) {\n\t\t\tif ( preg_match( $pattern, $setting_id ) ) {\n\t\t\t\t$cache[ $setting_id ] = $type;\n\t\t\t\treturn $type;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Inspect the incoming customized data for any widget settings, and dynamically add them up-front so widgets will be initialized properly.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t */\n\tpublic function register_settings() {\n\t\t$widget_setting_ids = array();\n\t\t$incoming_setting_ids = array_keys( $this->manager->unsanitized_post_values() );\n\t\tforeach ( $incoming_setting_ids as $setting_id ) {\n\t\t\tif ( ! is_null( $this->get_setting_type( $setting_id ) ) ) {\n\t\t\t\t$widget_setting_ids[] = $setting_id;\n\t\t\t}\n\t\t}\n\t\tif ( $this->manager->doing_ajax( 'update-widget' ) && isset( $_REQUEST['widget-id'] ) ) {\n\t\t\t$widget_setting_ids[] = $this->get_setting_id( wp_unslash( $_REQUEST['widget-id'] ) );\n\t\t}\n\n\t\t$settings = $this->manager->add_dynamic_settings( array_unique( $widget_setting_ids ) );\n\n\t\t/*\n\t\t * Preview settings right away so that widgets and sidebars will get registered properly.\n\t\t * But don't do this if a customize_save because this will cause WP to think there is nothing\n\t\t * changed that needs to be saved.\n\t\t */\n\t\tif ( ! $this->manager->doing_ajax( 'customize_save' ) ) {\n\t\t\tforeach ( $settings as $setting ) {\n\t\t\t\t$setting->preview();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Determine the arguments for a dynamically-created setting.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param false|array $args       The arguments to the WP_Customize_Setting constructor.\n\t * @param string      $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`.\n\t * @return false|array Setting arguments, false otherwise.\n\t */\n\tpublic function filter_customize_dynamic_setting_args( $args, $setting_id ) {\n\t\tif ( $this->get_setting_type( $setting_id ) ) {\n\t\t\t$args = $this->get_setting_args( $setting_id );\n\t\t}\n\t\treturn $args;\n\t}\n\n\t/**\n\t * Get an unslashed post value or return a default.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @access protected\n\t *\n\t * @param string $name    Post value.\n\t * @param mixed  $default Default post value.\n\t * @return mixed Unslashed post value or default value.\n\t */\n\tprotected function get_post_value( $name, $default = null ) {\n\t\tif ( ! isset( $_POST[ $name ] ) ) {\n\t\t\treturn $default;\n\t\t}\n\n\t\treturn wp_unslash( $_POST[ $name ] );\n\t}\n\n\t/**\n\t * Override sidebars_widgets for theme switch.\n\t *\n\t * When switching a theme via the Customizer, supply any previously-configured\n\t * sidebars_widgets from the target theme as the initial sidebars_widgets\n\t * setting. Also store the old theme's existing settings so that they can\n\t * be passed along for storing in the sidebars_widgets theme_mod when the\n\t * theme gets switched.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global array $sidebars_widgets\n\t * @global array $_wp_sidebars_widgets\n\t */\n\tpublic function override_sidebars_widgets_for_theme_switch() {\n\t\tglobal $sidebars_widgets;\n\n\t\tif ( $this->manager->doing_ajax() || $this->manager->is_theme_active() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->old_sidebars_widgets = wp_get_sidebars_widgets();\n\t\tadd_filter( 'customize_value_old_sidebars_widgets_data', array( $this, 'filter_customize_value_old_sidebars_widgets_data' ) );\n\n\t\t// retrieve_widgets() looks at the global $sidebars_widgets\n\t\t$sidebars_widgets = $this->old_sidebars_widgets;\n\t\t$sidebars_widgets = retrieve_widgets( 'customize' );\n\t\tadd_filter( 'option_sidebars_widgets', array( $this, 'filter_option_sidebars_widgets_for_theme_switch' ), 1 );\n\t\t// reset global cache var used by wp_get_sidebars_widgets()\n\t\tunset( $GLOBALS['_wp_sidebars_widgets'] );\n\t}\n\n\t/**\n\t * Filter old_sidebars_widgets_data Customizer setting.\n\t *\n\t * When switching themes, filter the Customizer setting\n\t * old_sidebars_widgets_data to supply initial $sidebars_widgets before they\n\t * were overridden by retrieve_widgets(). The value for\n\t * old_sidebars_widgets_data gets set in the old theme's sidebars_widgets\n\t * theme_mod.\n\t *\n\t * @see WP_Customize_Widgets::handle_theme_switch()\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param array $old_sidebars_widgets\n\t * @return array\n\t */\n\tpublic function filter_customize_value_old_sidebars_widgets_data( $old_sidebars_widgets ) {\n\t\treturn $this->old_sidebars_widgets;\n\t}\n\n\t/**\n\t * Filter sidebars_widgets option for theme switch.\n\t *\n\t * When switching themes, the retrieve_widgets() function is run when the\n\t * Customizer initializes, and then the new sidebars_widgets here get\n\t * supplied as the default value for the sidebars_widgets option.\n\t *\n\t * @see WP_Customize_Widgets::handle_theme_switch()\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global array $sidebars_widgets\n\t *\n\t * @param array $sidebars_widgets\n\t * @return array\n\t */\n\tpublic function filter_option_sidebars_widgets_for_theme_switch( $sidebars_widgets ) {\n\t\t$sidebars_widgets = $GLOBALS['sidebars_widgets'];\n\t\t$sidebars_widgets['array_version'] = 3;\n\t\treturn $sidebars_widgets;\n\t}\n\n\t/**\n\t * Make sure all widgets get loaded into the Customizer.\n\t *\n\t * Note: these actions are also fired in wp_ajax_update_widget().\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function customize_controls_init() {\n\t\t/** This action is documented in wp-admin/includes/ajax-actions.php */\n\t\tdo_action( 'load-widgets.php' );\n\n\t\t/** This action is documented in wp-admin/includes/ajax-actions.php */\n\t\tdo_action( 'widgets.php' );\n\n\t\t/** This action is documented in wp-admin/widgets.php */\n\t\tdo_action( 'sidebar_admin_setup' );\n\t}\n\n\t/**\n\t * Ensure widgets are available for all types of previews.\n\t *\n\t * When in preview, hook to 'customize_register' for settings\n\t * after WordPress is loaded so that all filters have been\n\t * initialized (e.g. Widget Visibility).\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function schedule_customize_register() {\n\t\tif ( is_admin() ) {\n\t\t\t$this->customize_register();\n\t\t} else {\n\t\t\tadd_action( 'wp', array( $this, 'customize_register' ) );\n\t\t}\n\t}\n\n\t/**\n\t * Register Customizer settings and controls for all sidebars and widgets.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global array $wp_registered_widgets\n\t * @global array $wp_registered_widget_controls\n\t * @global array $wp_registered_sidebars\n\t */\n\tpublic function customize_register() {\n\t\tglobal $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_sidebars;\n\n\t\t$sidebars_widgets = array_merge(\n\t\t\tarray( 'wp_inactive_widgets' => array() ),\n\t\t\tarray_fill_keys( array_keys( $wp_registered_sidebars ), array() ),\n\t\t\twp_get_sidebars_widgets()\n\t\t);\n\n\t\t$new_setting_ids = array();\n\n\t\t/*\n\t\t * Register a setting for all widgets, including those which are active,\n\t\t * inactive, and orphaned since a widget may get suppressed from a sidebar\n\t\t * via a plugin (like Widget Visibility).\n\t\t */\n\t\tforeach ( array_keys( $wp_registered_widgets ) as $widget_id ) {\n\t\t\t$setting_id   = $this->get_setting_id( $widget_id );\n\t\t\t$setting_args = $this->get_setting_args( $setting_id );\n\t\t\tif ( ! $this->manager->get_setting( $setting_id ) ) {\n\t\t\t\t$this->manager->add_setting( $setting_id, $setting_args );\n\t\t\t}\n\t\t\t$new_setting_ids[] = $setting_id;\n\t\t}\n\n\t\t/*\n\t\t * Add a setting which will be supplied for the theme's sidebars_widgets\n\t\t * theme_mod when the the theme is switched.\n\t\t */\n\t\tif ( ! $this->manager->is_theme_active() ) {\n\t\t\t$setting_id = 'old_sidebars_widgets_data';\n\t\t\t$setting_args = $this->get_setting_args( $setting_id, array(\n\t\t\t\t'type' => 'global_variable',\n\t\t\t\t'dirty' => true,\n\t\t\t) );\n\t\t\t$this->manager->add_setting( $setting_id, $setting_args );\n\t\t}\n\n\t\t$this->manager->add_panel( 'widgets', array(\n\t\t\t'type'            => 'widgets',\n\t\t\t'title'           => __( 'Widgets' ),\n\t\t\t'description'     => __( 'Widgets are independent sections of content that can be placed into widgetized areas provided by your theme (commonly called sidebars).' ),\n\t\t\t'priority'        => 110,\n\t\t\t'active_callback' => array( $this, 'is_panel_active' ),\n\t\t) );\n\n\t\tforeach ( $sidebars_widgets as $sidebar_id => $sidebar_widget_ids ) {\n\t\t\tif ( empty( $sidebar_widget_ids ) ) {\n\t\t\t\t$sidebar_widget_ids = array();\n\t\t\t}\n\n\t\t\t$is_registered_sidebar = is_registered_sidebar( $sidebar_id );\n\t\t\t$is_inactive_widgets   = ( 'wp_inactive_widgets' === $sidebar_id );\n\t\t\t$is_active_sidebar     = ( $is_registered_sidebar && ! $is_inactive_widgets );\n\n\t\t\t// Add setting for managing the sidebar's widgets.\n\t\t\tif ( $is_registered_sidebar || $is_inactive_widgets ) {\n\t\t\t\t$setting_id   = sprintf( 'sidebars_widgets[%s]', $sidebar_id );\n\t\t\t\t$setting_args = $this->get_setting_args( $setting_id );\n\t\t\t\tif ( ! $this->manager->get_setting( $setting_id ) ) {\n\t\t\t\t\tif ( ! $this->manager->is_theme_active() ) {\n\t\t\t\t\t\t$setting_args['dirty'] = true;\n\t\t\t\t\t}\n\t\t\t\t\t$this->manager->add_setting( $setting_id, $setting_args );\n\t\t\t\t}\n\t\t\t\t$new_setting_ids[] = $setting_id;\n\n\t\t\t\t// Add section to contain controls.\n\t\t\t\t$section_id = sprintf( 'sidebar-widgets-%s', $sidebar_id );\n\t\t\t\tif ( $is_active_sidebar ) {\n\n\t\t\t\t\t$section_args = array(\n\t\t\t\t\t\t'title' => $wp_registered_sidebars[ $sidebar_id ]['name'],\n\t\t\t\t\t\t'description' => $wp_registered_sidebars[ $sidebar_id ]['description'],\n\t\t\t\t\t\t'priority' => array_search( $sidebar_id, array_keys( $wp_registered_sidebars ) ),\n\t\t\t\t\t\t'panel' => 'widgets',\n\t\t\t\t\t\t'sidebar_id' => $sidebar_id,\n\t\t\t\t\t);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter Customizer widget section arguments for a given sidebar.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 3.9.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param array      $section_args Array of Customizer widget section arguments.\n\t\t\t\t\t * @param string     $section_id   Customizer section ID.\n\t\t\t\t\t * @param int|string $sidebar_id   Sidebar ID.\n\t\t\t\t\t */\n\t\t\t\t\t$section_args = apply_filters( 'customizer_widgets_section_args', $section_args, $section_id, $sidebar_id );\n\n\t\t\t\t\t$section = new WP_Customize_Sidebar_Section( $this->manager, $section_id, $section_args );\n\t\t\t\t\t$this->manager->add_section( $section );\n\n\t\t\t\t\t$control = new WP_Widget_Area_Customize_Control( $this->manager, $setting_id, array(\n\t\t\t\t\t\t'section'    => $section_id,\n\t\t\t\t\t\t'sidebar_id' => $sidebar_id,\n\t\t\t\t\t\t'priority'   => count( $sidebar_widget_ids ), // place 'Add Widget' and 'Reorder' buttons at end.\n\t\t\t\t\t) );\n\t\t\t\t\t$new_setting_ids[] = $setting_id;\n\n\t\t\t\t\t$this->manager->add_control( $control );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add a control for each active widget (located in a sidebar).\n\t\t\tforeach ( $sidebar_widget_ids as $i => $widget_id ) {\n\n\t\t\t\t// Skip widgets that may have gone away due to a plugin being deactivated.\n\t\t\t\tif ( ! $is_active_sidebar || ! isset( $wp_registered_widgets[$widget_id] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$registered_widget = $wp_registered_widgets[$widget_id];\n\t\t\t\t$setting_id        = $this->get_setting_id( $widget_id );\n\t\t\t\t$id_base           = $wp_registered_widget_controls[$widget_id]['id_base'];\n\n\t\t\t\t$control = new WP_Widget_Form_Customize_Control( $this->manager, $setting_id, array(\n\t\t\t\t\t'label'          => $registered_widget['name'],\n\t\t\t\t\t'section'        => $section_id,\n\t\t\t\t\t'sidebar_id'     => $sidebar_id,\n\t\t\t\t\t'widget_id'      => $widget_id,\n\t\t\t\t\t'widget_id_base' => $id_base,\n\t\t\t\t\t'priority'       => $i,\n\t\t\t\t\t'width'          => $wp_registered_widget_controls[$widget_id]['width'],\n\t\t\t\t\t'height'         => $wp_registered_widget_controls[$widget_id]['height'],\n\t\t\t\t\t'is_wide'        => $this->is_wide_widget( $widget_id ),\n\t\t\t\t) );\n\t\t\t\t$this->manager->add_control( $control );\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $this->manager->doing_ajax( 'customize_save' ) ) {\n\t\t\tforeach ( $new_setting_ids as $new_setting_id ) {\n\t\t\t\t$this->manager->get_setting( $new_setting_id )->preview();\n\t\t\t}\n\t\t}\n\n\t\tadd_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 );\n\t}\n\n\t/**\n\t * Return whether the widgets panel is active, based on whether there are sidebars registered.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Panel::$active_callback\n\t *\n\t * @global array $wp_registered_sidebars\n\t * @return bool Active.\n\t */\n\tpublic function is_panel_active() {\n\t\tglobal $wp_registered_sidebars;\n\t\treturn ! empty( $wp_registered_sidebars );\n\t}\n\n\t/**\n\t * Covert a widget_id into its corresponding Customizer setting ID (option name).\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param string $widget_id Widget ID.\n\t * @return string Maybe-parsed widget ID.\n\t */\n\tpublic function get_setting_id( $widget_id ) {\n\t\t$parsed_widget_id = $this->parse_widget_id( $widget_id );\n\t\t$setting_id       = sprintf( 'widget_%s', $parsed_widget_id['id_base'] );\n\n\t\tif ( ! is_null( $parsed_widget_id['number'] ) ) {\n\t\t\t$setting_id .= sprintf( '[%d]', $parsed_widget_id['number'] );\n\t\t}\n\t\treturn $setting_id;\n\t}\n\n\t/**\n\t * Determine whether the widget is considered \"wide\".\n\t *\n\t * Core widgets which may have controls wider than 250, but can\n\t * still be shown in the narrow Customizer panel. The RSS and Text\n\t * widgets in Core, for example, have widths of 400 and yet they\n\t * still render fine in the Customizer panel. This method will\n\t * return all Core widgets as being not wide, but this can be\n\t * overridden with the is_wide_widget_in_customizer filter.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global $wp_registered_widget_controls\n\t *\n\t * @param string $widget_id Widget ID.\n\t * @return bool Whether or not the widget is a \"wide\" widget.\n\t */\n\tpublic function is_wide_widget( $widget_id ) {\n\t\tglobal $wp_registered_widget_controls;\n\n\t\t$parsed_widget_id = $this->parse_widget_id( $widget_id );\n\t\t$width            = $wp_registered_widget_controls[$widget_id]['width'];\n\t\t$is_core          = in_array( $parsed_widget_id['id_base'], $this->core_widget_id_bases );\n\t\t$is_wide          = ( $width > 250 && ! $is_core );\n\n\t\t/**\n\t\t * Filter whether the given widget is considered \"wide\".\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param bool   $is_wide   Whether the widget is wide, Default false.\n\t\t * @param string $widget_id Widget ID.\n\t\t */\n\t\treturn apply_filters( 'is_wide_widget_in_customizer', $is_wide, $widget_id );\n\t}\n\n\t/**\n\t * Covert a widget ID into its id_base and number components.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param string $widget_id Widget ID.\n\t * @return array Array containing a widget's id_base and number components.\n\t */\n\tpublic function parse_widget_id( $widget_id ) {\n\t\t$parsed = array(\n\t\t\t'number' => null,\n\t\t\t'id_base' => null,\n\t\t);\n\n\t\tif ( preg_match( '/^(.+)-(\\d+)$/', $widget_id, $matches ) ) {\n\t\t\t$parsed['id_base'] = $matches[1];\n\t\t\t$parsed['number']  = intval( $matches[2] );\n\t\t} else {\n\t\t\t// likely an old single widget\n\t\t\t$parsed['id_base'] = $widget_id;\n\t\t}\n\t\treturn $parsed;\n\t}\n\n\t/**\n\t * Convert a widget setting ID (option path) to its id_base and number components.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param string $setting_id Widget setting ID.\n\t * @return WP_Error|array Array containing a widget's id_base and number components,\n\t *                        or a WP_Error object.\n\t */\n\tpublic function parse_widget_setting_id( $setting_id ) {\n\t\tif ( ! preg_match( '/^(widget_(.+?))(?:\\[(\\d+)\\])?$/', $setting_id, $matches ) ) {\n\t\t\treturn new WP_Error( 'widget_setting_invalid_id' );\n\t\t}\n\n\t\t$id_base = $matches[2];\n\t\t$number  = isset( $matches[3] ) ? intval( $matches[3] ) : null;\n\n\t\treturn compact( 'id_base', 'number' );\n\t}\n\n\t/**\n\t * Call admin_print_styles-widgets.php and admin_print_styles hooks to\n\t * allow custom styles from plugins.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function print_styles() {\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_print_styles-widgets.php' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_print_styles' );\n\t}\n\n\t/**\n\t * Call admin_print_scripts-widgets.php and admin_print_scripts hooks to\n\t * allow custom scripts from plugins.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function print_scripts() {\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_print_scripts-widgets.php' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_print_scripts' );\n\t}\n\n\t/**\n\t * Enqueue scripts and styles for Customizer panel and export data to JavaScript.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global WP_Scripts $wp_scripts\n\t * @global array $wp_registered_sidebars\n\t * @global array $wp_registered_widgets\n\t */\n\tpublic function enqueue_scripts() {\n\t\tglobal $wp_scripts, $wp_registered_sidebars, $wp_registered_widgets;\n\n\t\twp_enqueue_style( 'customize-widgets' );\n\t\twp_enqueue_script( 'customize-widgets' );\n\n\t\t/** This action is documented in wp-admin/admin-header.php */\n\t\tdo_action( 'admin_enqueue_scripts', 'widgets.php' );\n\n\t\t/*\n\t\t * Export available widgets with control_tpl removed from model\n\t\t * since plugins need templates to be in the DOM.\n\t\t */\n\t\t$available_widgets = array();\n\n\t\tforeach ( $this->get_available_widgets() as $available_widget ) {\n\t\t\tunset( $available_widget['control_tpl'] );\n\t\t\t$available_widgets[] = $available_widget;\n\t\t}\n\n\t\t$widget_reorder_nav_tpl = sprintf(\n\t\t\t'<div class=\"widget-reorder-nav\"><span class=\"move-widget\" tabindex=\"0\">%1$s</span><span class=\"move-widget-down\" tabindex=\"0\">%2$s</span><span class=\"move-widget-up\" tabindex=\"0\">%3$s</span></div>',\n\t\t\t__( 'Move to another area&hellip;' ),\n\t\t\t__( 'Move down' ),\n\t\t\t__( 'Move up' )\n\t\t);\n\n\t\t$move_widget_area_tpl = str_replace(\n\t\t\tarray( '{description}', '{btn}' ),\n\t\t\tarray(\n\t\t\t\t__( 'Select an area to move this widget into:' ),\n\t\t\t\t_x( 'Move', 'Move widget' ),\n\t\t\t),\n\t\t\t'<div class=\"move-widget-area\">\n\t\t\t\t<p class=\"description\">{description}</p>\n\t\t\t\t<ul class=\"widget-area-select\">\n\t\t\t\t\t<% _.each( sidebars, function ( sidebar ){ %>\n\t\t\t\t\t\t<li class=\"\" data-id=\"<%- sidebar.id %>\" title=\"<%- sidebar.description %>\" tabindex=\"0\"><%- sidebar.name %></li>\n\t\t\t\t\t<% }); %>\n\t\t\t\t</ul>\n\t\t\t\t<div class=\"move-widget-actions\">\n\t\t\t\t\t<button class=\"move-widget-btn button-secondary\" type=\"button\">{btn}</button>\n\t\t\t\t</div>\n\t\t\t</div>'\n\t\t);\n\n\t\t$settings = array(\n\t\t\t'nonce'                => wp_create_nonce( 'update-widget' ),\n\t\t\t'registeredSidebars'   => array_values( $wp_registered_sidebars ),\n\t\t\t'registeredWidgets'    => $wp_registered_widgets,\n\t\t\t'availableWidgets'     => $available_widgets, // @todo Merge this with registered_widgets\n\t\t\t'l10n' => array(\n\t\t\t\t'saveBtnLabel'     => __( 'Apply' ),\n\t\t\t\t'saveBtnTooltip'   => __( 'Save and preview changes before publishing them.' ),\n\t\t\t\t'removeBtnLabel'   => __( 'Remove' ),\n\t\t\t\t'removeBtnTooltip' => __( 'Trash widget by moving it to the inactive widgets sidebar.' ),\n\t\t\t\t'error'            => __( 'An error has occurred. Please reload the page and try again.' ),\n\t\t\t\t'widgetMovedUp'    => __( 'Widget moved up' ),\n\t\t\t\t'widgetMovedDown'  => __( 'Widget moved down' ),\n\t\t\t\t'noAreasRendered'  => __( 'There are no widget areas currently rendered in the preview. Navigate in the preview to a template that makes use of a widget area in order to access its widgets here.' ),\n\t\t\t\t'reorderModeOn'    => __( 'Reorder mode enabled' ),\n\t\t\t\t'reorderModeOff'   => __( 'Reorder mode closed' ),\n\t\t\t\t'reorderLabelOn'   => esc_attr__( 'Reorder widgets' ),\n\t\t\t\t'reorderLabelOff'  => esc_attr__( 'Close reorder mode' ),\n\t\t\t),\n\t\t\t'tpl' => array(\n\t\t\t\t'widgetReorderNav' => $widget_reorder_nav_tpl,\n\t\t\t\t'moveWidgetArea'   => $move_widget_area_tpl,\n\t\t\t),\n\t\t);\n\n\t\tforeach ( $settings['registeredWidgets'] as &$registered_widget ) {\n\t\t\tunset( $registered_widget['callback'] ); // may not be JSON-serializeable\n\t\t}\n\n\t\t$wp_scripts->add_data(\n\t\t\t'customize-widgets',\n\t\t\t'data',\n\t\t\tsprintf( 'var _wpCustomizeWidgetsSettings = %s;', wp_json_encode( $settings ) )\n\t\t);\n\t}\n\n\t/**\n\t * Render the widget form control templates into the DOM.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function output_widget_control_templates() {\n\t\t?>\n\t\t<div id=\"widgets-left\"><!-- compatibility with JS which looks for widget templates here -->\n\t\t<div id=\"available-widgets\">\n\t\t\t<div class=\"customize-section-title\">\n\t\t\t\t<button class=\"customize-section-back\" tabindex=\"-1\">\n\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Back' ); ?></span>\n\t\t\t\t</button>\n\t\t\t\t<h3>\n\t\t\t\t\t<span class=\"customize-action\"><?php\n\t\t\t\t\t\t/* translators: &#9656; is the unicode right-pointing triangle, and %s is the section title in the Customizer */\n\t\t\t\t\t\techo sprintf( __( 'Customizing &#9656; %s' ), esc_html( $this->manager->get_panel( 'widgets' )->title ) );\n\t\t\t\t\t?></span>\n\t\t\t\t\t<?php _e( 'Add a Widget' ); ?>\n\t\t\t\t</h3>\n\t\t\t</div>\n\t\t\t<div id=\"available-widgets-filter\">\n\t\t\t\t<label class=\"screen-reader-text\" for=\"widgets-search\"><?php _e( 'Search Widgets' ); ?></label>\n\t\t\t\t<input type=\"search\" id=\"widgets-search\" placeholder=\"<?php esc_attr_e( 'Search widgets&hellip;' ) ?>\" />\n\t\t\t</div>\n\t\t\t<div id=\"available-widgets-list\">\n\t\t\t<?php foreach ( $this->get_available_widgets() as $available_widget ): ?>\n\t\t\t\t<div id=\"widget-tpl-<?php echo esc_attr( $available_widget['id'] ) ?>\" data-widget-id=\"<?php echo esc_attr( $available_widget['id'] ) ?>\" class=\"widget-tpl <?php echo esc_attr( $available_widget['id'] ) ?>\" tabindex=\"0\">\n\t\t\t\t\t<?php echo $available_widget['control_tpl']; ?>\n\t\t\t\t</div>\n\t\t\t<?php endforeach; ?>\n\t\t\t</div><!-- #available-widgets-list -->\n\t\t</div><!-- #available-widgets -->\n\t\t</div><!-- #widgets-left -->\n\t\t<?php\n\t}\n\n\t/**\n\t * Call admin_print_footer_scripts and admin_print_scripts hooks to\n\t * allow custom scripts from plugins.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function print_footer_scripts() {\n\t\t/** This action is documented in wp-admin/admin-footer.php */\n\t\tdo_action( 'admin_print_footer_scripts' );\n\n\t\t/** This action is documented in wp-admin/admin-footer.php */\n\t\tdo_action( 'admin_footer-widgets.php' );\n\t}\n\n\t/**\n\t * Get common arguments to supply when constructing a Customizer setting.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param string $id        Widget setting ID.\n\t * @param array  $overrides Array of setting overrides.\n\t * @return array Possibly modified setting arguments.\n\t */\n\tpublic function get_setting_args( $id, $overrides = array() ) {\n\t\t$args = array(\n\t\t\t'type'       => 'option',\n\t\t\t'capability' => 'edit_theme_options',\n\t\t\t'transport'  => 'refresh',\n\t\t\t'default'    => array(),\n\t\t);\n\n\t\tif ( preg_match( $this->setting_id_patterns['sidebar_widgets'], $id, $matches ) ) {\n\t\t\t$args['sanitize_callback'] = array( $this, 'sanitize_sidebar_widgets' );\n\t\t\t$args['sanitize_js_callback'] = array( $this, 'sanitize_sidebar_widgets_js_instance' );\n\t\t} elseif ( preg_match( $this->setting_id_patterns['widget_instance'], $id, $matches ) ) {\n\t\t\t$args['sanitize_callback'] = array( $this, 'sanitize_widget_instance' );\n\t\t\t$args['sanitize_js_callback'] = array( $this, 'sanitize_widget_js_instance' );\n\t\t}\n\n\t\t$args = array_merge( $args, $overrides );\n\n\t\t/**\n\t\t * Filter the common arguments supplied when constructing a Customizer setting.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @see WP_Customize_Setting\n\t\t *\n\t\t * @param array  $args Array of Customizer setting arguments.\n\t\t * @param string $id   Widget setting ID.\n\t\t */\n\t\treturn apply_filters( 'widget_customizer_setting_args', $args, $id );\n\t}\n\n\t/**\n\t * Make sure that sidebar widget arrays only ever contain widget IDS.\n\t *\n\t * Used as the 'sanitize_callback' for each $sidebars_widgets setting.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param array $widget_ids Array of widget IDs.\n\t * @return array Array of sanitized widget IDs.\n\t */\n\tpublic function sanitize_sidebar_widgets( $widget_ids ) {\n\t\t$widget_ids = array_map( 'strval', (array) $widget_ids );\n\t\t$sanitized_widget_ids = array();\n\t\tforeach ( $widget_ids as $widget_id ) {\n\t\t\t$sanitized_widget_ids[] = preg_replace( '/[^a-z0-9_\\-]/', '', $widget_id );\n\t\t}\n\t\treturn $sanitized_widget_ids;\n\t}\n\n\t/**\n\t * Build up an index of all available widgets for use in Backbone models.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global array $wp_registered_widgets\n\t * @global array $wp_registered_widget_controls\n\t * @staticvar array $available_widgets\n\t *\n\t * @see wp_list_widgets()\n\t *\n\t * @return array List of available widgets.\n\t */\n\tpublic function get_available_widgets() {\n\t\tstatic $available_widgets = array();\n\t\tif ( ! empty( $available_widgets ) ) {\n\t\t\treturn $available_widgets;\n\t\t}\n\n\t\tglobal $wp_registered_widgets, $wp_registered_widget_controls;\n\t\trequire_once ABSPATH . '/wp-admin/includes/widgets.php'; // for next_widget_id_number()\n\n\t\t$sort = $wp_registered_widgets;\n\t\tusort( $sort, array( $this, '_sort_name_callback' ) );\n\t\t$done = array();\n\n\t\tforeach ( $sort as $widget ) {\n\t\t\tif ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false );\n\t\t\t$done[]  = $widget['callback'];\n\n\t\t\tif ( ! isset( $widget['params'][0] ) ) {\n\t\t\t\t$widget['params'][0] = array();\n\t\t\t}\n\n\t\t\t$available_widget = $widget;\n\t\t\tunset( $available_widget['callback'] ); // not serializable to JSON\n\n\t\t\t$args = array(\n\t\t\t\t'widget_id'   => $widget['id'],\n\t\t\t\t'widget_name' => $widget['name'],\n\t\t\t\t'_display'    => 'template',\n\t\t\t);\n\n\t\t\t$is_disabled     = false;\n\t\t\t$is_multi_widget = ( isset( $wp_registered_widget_controls[$widget['id']]['id_base'] ) && isset( $widget['params'][0]['number'] ) );\n\t\t\tif ( $is_multi_widget ) {\n\t\t\t\t$id_base            = $wp_registered_widget_controls[$widget['id']]['id_base'];\n\t\t\t\t$args['_temp_id']   = \"$id_base-__i__\";\n\t\t\t\t$args['_multi_num'] = next_widget_id_number( $id_base );\n\t\t\t\t$args['_add']       = 'multi';\n\t\t\t} else {\n\t\t\t\t$args['_add'] = 'single';\n\n\t\t\t\tif ( $sidebar && 'wp_inactive_widgets' !== $sidebar ) {\n\t\t\t\t\t$is_disabled = true;\n\t\t\t\t}\n\t\t\t\t$id_base = $widget['id'];\n\t\t\t}\n\n\t\t\t$list_widget_controls_args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) );\n\t\t\t$control_tpl = $this->get_widget_control( $list_widget_controls_args );\n\n\t\t\t// The properties here are mapped to the Backbone Widget model.\n\t\t\t$available_widget = array_merge( $available_widget, array(\n\t\t\t\t'temp_id'      => isset( $args['_temp_id'] ) ? $args['_temp_id'] : null,\n\t\t\t\t'is_multi'     => $is_multi_widget,\n\t\t\t\t'control_tpl'  => $control_tpl,\n\t\t\t\t'multi_number' => ( $args['_add'] === 'multi' ) ? $args['_multi_num'] : false,\n\t\t\t\t'is_disabled'  => $is_disabled,\n\t\t\t\t'id_base'      => $id_base,\n\t\t\t\t'transport'    => 'refresh',\n\t\t\t\t'width'        => $wp_registered_widget_controls[$widget['id']]['width'],\n\t\t\t\t'height'       => $wp_registered_widget_controls[$widget['id']]['height'],\n\t\t\t\t'is_wide'      => $this->is_wide_widget( $widget['id'] ),\n\t\t\t) );\n\n\t\t\t$available_widgets[] = $available_widget;\n\t\t}\n\n\t\treturn $available_widgets;\n\t}\n\n\t/**\n\t * Naturally order available widgets by name.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t *\n\t * @param array $widget_a The first widget to compare.\n\t * @param array $widget_b The second widget to compare.\n\t * @return int Reorder position for the current widget comparison.\n\t */\n\tprotected function _sort_name_callback( $widget_a, $widget_b ) {\n\t\treturn strnatcasecmp( $widget_a['name'], $widget_b['name'] );\n\t}\n\n\t/**\n\t * Get the widget control markup.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param array $args Widget control arguments.\n\t * @return string Widget control form HTML markup.\n\t */\n\tpublic function get_widget_control( $args ) {\n\t\t$args[0]['before_form'] = '<div class=\"form\">';\n\t\t$args[0]['after_form'] = '</div><!-- .form -->';\n\t\t$args[0]['before_widget_content'] = '<div class=\"widget-content\">';\n\t\t$args[0]['after_widget_content'] = '</div><!-- .widget-content -->';\n\t\tob_start();\n\t\tcall_user_func_array( 'wp_widget_control', $args );\n\t\t$control_tpl = ob_get_clean();\n\t\treturn $control_tpl;\n\t}\n\n\t/**\n\t * Get the widget control markup parts.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $args Widget control arguments.\n\t * @return array {\n\t *     @type string $control  Markup for widget control wrapping form.\n\t *     @type string $content  The contents of the widget form itself.\n\t * }\n\t */\n\tpublic function get_widget_control_parts( $args ) {\n\t\t$args[0]['before_widget_content'] = '<div class=\"widget-content\">';\n\t\t$args[0]['after_widget_content'] = '</div><!-- .widget-content -->';\n\t\t$control_markup = $this->get_widget_control( $args );\n\n\t\t$content_start_pos = strpos( $control_markup, $args[0]['before_widget_content'] );\n\t\t$content_end_pos = strrpos( $control_markup, $args[0]['after_widget_content'] );\n\n\t\t$control = substr( $control_markup, 0, $content_start_pos + strlen( $args[0]['before_widget_content'] ) );\n\t\t$control .= substr( $control_markup, $content_end_pos );\n\t\t$content = trim( substr(\n\t\t\t$control_markup,\n\t\t\t$content_start_pos + strlen( $args[0]['before_widget_content'] ),\n\t\t\t$content_end_pos - $content_start_pos - strlen( $args[0]['before_widget_content'] )\n\t\t) );\n\n\t\treturn compact( 'control', 'content' );\n\t}\n\n\t/**\n\t * Add hooks for the Customizer preview.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function customize_preview_init() {\n\t\tadd_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue' ) );\n\t\tadd_action( 'wp_print_styles',    array( $this, 'print_preview_css' ), 1 );\n\t\tadd_action( 'wp_footer',          array( $this, 'export_preview_data' ), 20 );\n\t}\n\n\t/**\n\t * Refresh nonce for widget updates.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param  array $nonces Array of nonces.\n\t * @return array $nonces Array of nonces.\n\t */\n\tpublic function refresh_nonces( $nonces ) {\n\t\t$nonces['update-widget'] = wp_create_nonce( 'update-widget' );\n\t\treturn $nonces;\n\t}\n\n\t/**\n\t * When previewing, make sure the proper previewing widgets are used.\n\t *\n\t * Because wp_get_sidebars_widgets() gets called early at init\n\t * (via wp_convert_widget_settings()) and can set global variable\n\t * $_wp_sidebars_widgets to the value of get_option( 'sidebars_widgets' )\n\t * before the Customizer preview filter is added, we have to reset\n\t * it after the filter has been added.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param array $sidebars_widgets List of widgets for the current sidebar.\n\t * @return array\n\t */\n\tpublic function preview_sidebars_widgets( $sidebars_widgets ) {\n\t\t$sidebars_widgets = get_option( 'sidebars_widgets' );\n\n\t\tunset( $sidebars_widgets['array_version'] );\n\t\treturn $sidebars_widgets;\n\t}\n\n\t/**\n\t * Enqueue scripts for the Customizer preview.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function customize_preview_enqueue() {\n\t\twp_enqueue_script( 'customize-preview-widgets' );\n\t}\n\n\t/**\n\t * Insert default style for highlighted widget at early point so theme\n\t * stylesheet can override.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @action wp_print_styles\n\t */\n\tpublic function print_preview_css() {\n\t\t?>\n\t\t<style>\n\t\t.widget-customizer-highlighted-widget {\n\t\t\toutline: none;\n\t\t\t-webkit-box-shadow: 0 0 2px rgba(30,140,190,0.8);\n\t\t\tbox-shadow: 0 0 2px rgba(30,140,190,0.8);\n\t\t\tposition: relative;\n\t\t\tz-index: 1;\n\t\t}\n\t\t</style>\n\t\t<?php\n\t}\n\n\t/**\n\t * At the very end of the page, at the very end of the wp_footer,\n\t * communicate the sidebars that appeared on the page.\n\t *\n\t * @since 3.9.0\n\t * @access public\n     *\n\t * @global array $wp_registered_sidebars\n\t * @global array $wp_registered_widgets\n\t */\n\tpublic function export_preview_data() {\n\t\tglobal $wp_registered_sidebars, $wp_registered_widgets;\n\t\t// Prepare Customizer settings to pass to JavaScript.\n\t\t$settings = array(\n\t\t\t'renderedSidebars'   => array_fill_keys( array_unique( $this->rendered_sidebars ), true ),\n\t\t\t'renderedWidgets'    => array_fill_keys( array_keys( $this->rendered_widgets ), true ),\n\t\t\t'registeredSidebars' => array_values( $wp_registered_sidebars ),\n\t\t\t'registeredWidgets'  => $wp_registered_widgets,\n\t\t\t'l10n'               => array(\n\t\t\t\t'widgetTooltip' => __( 'Shift-click to edit this widget.' ),\n\t\t\t),\n\t\t);\n\t\tforeach ( $settings['registeredWidgets'] as &$registered_widget ) {\n\t\t\tunset( $registered_widget['callback'] ); // may not be JSON-serializeable\n\t\t}\n\n\t\t?>\n\t\t<script type=\"text/javascript\">\n\t\t\tvar _wpWidgetCustomizerPreviewSettings = <?php echo wp_json_encode( $settings ); ?>;\n\t\t</script>\n\t\t<?php\n\t}\n\n\t/**\n\t * Keep track of the widgets that were rendered.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param array $widget Rendered widget to tally.\n\t */\n\tpublic function tally_rendered_widgets( $widget ) {\n\t\t$this->rendered_widgets[ $widget['id'] ] = true;\n\t}\n\n\t/**\n\t * Determine if a widget is rendered on the page.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $widget_id Widget ID to check.\n\t * @return bool Whether the widget is rendered.\n\t */\n\tpublic function is_widget_rendered( $widget_id ) {\n\t\treturn in_array( $widget_id, $this->rendered_widgets );\n\t}\n\n\t/**\n\t * Determine if a sidebar is rendered on the page.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $sidebar_id Sidebar ID to check.\n\t * @return bool Whether the sidebar is rendered.\n\t */\n\tpublic function is_sidebar_rendered( $sidebar_id ) {\n\t\treturn in_array( $sidebar_id, $this->rendered_sidebars );\n\t}\n\n\t/**\n\t * Tally the sidebars rendered via is_active_sidebar().\n\t *\n\t * Keep track of the times that is_active_sidebar() is called\n\t * in the template, and assume that this means that the sidebar\n\t * would be rendered on the template if there were widgets\n\t * populating it.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param bool   $is_active  Whether the sidebar is active.\n\t * @param string $sidebar_id Sidebar ID.\n\t * @return bool\n\t */\n\tpublic function tally_sidebars_via_is_active_sidebar_calls( $is_active, $sidebar_id ) {\n\t\tif ( is_registered_sidebar( $sidebar_id ) ) {\n\t\t\t$this->rendered_sidebars[] = $sidebar_id;\n\t\t}\n\t\t/*\n\t\t * We may need to force this to true, and also force-true the value\n\t\t * for 'dynamic_sidebar_has_widgets' if we want to ensure that there\n\t\t * is an area to drop widgets into, if the sidebar is empty.\n\t\t */\n\t\treturn $is_active;\n\t}\n\n\t/**\n\t * Tally the sidebars rendered via dynamic_sidebar().\n\t *\n\t * Keep track of the times that dynamic_sidebar() is called in the template,\n\t * and assume this means the sidebar would be rendered on the template if\n\t * there were widgets populating it.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param bool   $has_widgets Whether the current sidebar has widgets.\n\t * @param string $sidebar_id  Sidebar ID.\n\t * @return bool\n\t */\n\tpublic function tally_sidebars_via_dynamic_sidebar_calls( $has_widgets, $sidebar_id ) {\n\t\tif ( is_registered_sidebar( $sidebar_id ) ) {\n\t\t\t$this->rendered_sidebars[] = $sidebar_id;\n\t\t}\n\n\t\t/*\n\t\t * We may need to force this to true, and also force-true the value\n\t\t * for 'is_active_sidebar' if we want to ensure there is an area to\n\t\t * drop widgets into, if the sidebar is empty.\n\t\t */\n\t\treturn $has_widgets;\n\t}\n\n\t/**\n\t * Get MAC for a serialized widget instance string.\n\t *\n\t * Allows values posted back from JS to be rejected if any tampering of the\n\t * data has occurred.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t *\n\t * @param string $serialized_instance Widget instance.\n\t * @return string MAC for serialized widget instance.\n\t */\n\tprotected function get_instance_hash_key( $serialized_instance ) {\n\t\treturn wp_hash( $serialized_instance );\n\t}\n\n\t/**\n\t * Sanitize a widget instance.\n\t *\n\t * Unserialize the JS-instance for storing in the options. It's important\n\t * that this filter only get applied to an instance once.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param array $value Widget instance to sanitize.\n\t * @return array|void Sanitized widget instance.\n\t */\n\tpublic function sanitize_widget_instance( $value ) {\n\t\tif ( $value === array() ) {\n\t\t\treturn $value;\n\t\t}\n\n\t\tif ( empty( $value['is_widget_customizer_js_value'] )\n\t\t\t|| empty( $value['instance_hash_key'] )\n\t\t\t|| empty( $value['encoded_serialized_instance'] ) )\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\t$decoded = base64_decode( $value['encoded_serialized_instance'], true );\n\t\tif ( false === $decoded ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value['instance_hash_key'] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$instance = unserialize( $decoded );\n\t\tif ( false === $instance ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Convert widget instance into JSON-representable format.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param array $value Widget instance to convert to JSON.\n\t * @return array JSON-converted widget instance.\n\t */\n\tpublic function sanitize_widget_js_instance( $value ) {\n\t\tif ( empty( $value['is_widget_customizer_js_value'] ) ) {\n\t\t\t$serialized = serialize( $value );\n\n\t\t\t$value = array(\n\t\t\t\t'encoded_serialized_instance'   => base64_encode( $serialized ),\n\t\t\t\t'title'                         => empty( $value['title'] ) ? '' : $value['title'],\n\t\t\t\t'is_widget_customizer_js_value' => true,\n\t\t\t\t'instance_hash_key'             => $this->get_instance_hash_key( $serialized ),\n\t\t\t);\n\t\t}\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Strip out widget IDs for widgets which are no longer registered.\n\t *\n\t * One example where this might happen is when a plugin orphans a widget\n\t * in a sidebar upon deactivation.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global array $wp_registered_widgets\n\t *\n\t * @param array $widget_ids List of widget IDs.\n\t * @return array Parsed list of widget IDs.\n\t */\n\tpublic function sanitize_sidebar_widgets_js_instance( $widget_ids ) {\n\t\tglobal $wp_registered_widgets;\n\t\t$widget_ids = array_values( array_intersect( $widget_ids, array_keys( $wp_registered_widgets ) ) );\n\t\treturn $widget_ids;\n\t}\n\n\t/**\n\t * Find and invoke the widget update and control callbacks.\n\t *\n\t * Requires that $_POST be populated with the instance data.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global array $wp_registered_widget_updates\n\t * @global array $wp_registered_widget_controls\n\t *\n\t * @param  string $widget_id Widget ID.\n\t * @return WP_Error|array Array containing the updated widget information.\n\t *                        A WP_Error object, otherwise.\n\t */\n\tpublic function call_widget_update( $widget_id ) {\n\t\tglobal $wp_registered_widget_updates, $wp_registered_widget_controls;\n\n\t\t$setting_id = $this->get_setting_id( $widget_id );\n\n\t\t/*\n\t\t * Make sure that other setting changes have previewed since this widget\n\t\t * may depend on them (e.g. Menus being present for Custom Menu widget).\n\t\t */\n\t\tif ( ! did_action( 'customize_preview_init' ) ) {\n\t\t\tforeach ( $this->manager->settings() as $setting ) {\n\t\t\t\tif ( $setting->id !== $setting_id ) {\n\t\t\t\t\t$setting->preview();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$this->start_capturing_option_updates();\n\t\t$parsed_id   = $this->parse_widget_id( $widget_id );\n\t\t$option_name = 'widget_' . $parsed_id['id_base'];\n\n\t\t/*\n\t\t * If a previously-sanitized instance is provided, populate the input vars\n\t\t * with its values so that the widget update callback will read this instance\n\t\t */\n\t\t$added_input_vars = array();\n\t\tif ( ! empty( $_POST['sanitized_widget_setting'] ) ) {\n\t\t\t$sanitized_widget_setting = json_decode( $this->get_post_value( 'sanitized_widget_setting' ), true );\n\t\t\tif ( false === $sanitized_widget_setting ) {\n\t\t\t\t$this->stop_capturing_option_updates();\n\t\t\t\treturn new WP_Error( 'widget_setting_malformed' );\n\t\t\t}\n\n\t\t\t$instance = $this->sanitize_widget_instance( $sanitized_widget_setting );\n\t\t\tif ( is_null( $instance ) ) {\n\t\t\t\t$this->stop_capturing_option_updates();\n\t\t\t\treturn new WP_Error( 'widget_setting_unsanitized' );\n\t\t\t}\n\n\t\t\tif ( ! is_null( $parsed_id['number'] ) ) {\n\t\t\t\t$value = array();\n\t\t\t\t$value[$parsed_id['number']] = $instance;\n\t\t\t\t$key = 'widget-' . $parsed_id['id_base'];\n\t\t\t\t$_REQUEST[$key] = $_POST[$key] = wp_slash( $value );\n\t\t\t\t$added_input_vars[] = $key;\n\t\t\t} else {\n\t\t\t\tforeach ( $instance as $key => $value ) {\n\t\t\t\t\t$_REQUEST[$key] = $_POST[$key] = wp_slash( $value );\n\t\t\t\t\t$added_input_vars[] = $key;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Invoke the widget update callback.\n\t\tforeach ( (array) $wp_registered_widget_updates as $name => $control ) {\n\t\t\tif ( $name === $parsed_id['id_base'] && is_callable( $control['callback'] ) ) {\n\t\t\t\tob_start();\n\t\t\t\tcall_user_func_array( $control['callback'], $control['params'] );\n\t\t\t\tob_end_clean();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Clean up any input vars that were manually added\n\t\tforeach ( $added_input_vars as $key ) {\n\t\t\tunset( $_POST[ $key ] );\n\t\t\tunset( $_REQUEST[ $key ] );\n\t\t}\n\n\t\t// Make sure the expected option was updated.\n\t\tif ( 0 !== $this->count_captured_options() ) {\n\t\t\tif ( $this->count_captured_options() > 1 ) {\n\t\t\t\t$this->stop_capturing_option_updates();\n\t\t\t\treturn new WP_Error( 'widget_setting_too_many_options' );\n\t\t\t}\n\n\t\t\t$updated_option_name = key( $this->get_captured_options() );\n\t\t\tif ( $updated_option_name !== $option_name ) {\n\t\t\t\t$this->stop_capturing_option_updates();\n\t\t\t\treturn new WP_Error( 'widget_setting_unexpected_option' );\n\t\t\t}\n\t\t}\n\n\t\t// Obtain the widget instance.\n\t\t$option = $this->get_captured_option( $option_name );\n\t\tif ( null !== $parsed_id['number'] ) {\n\t\t\t$instance = $option[ $parsed_id['number'] ];\n\t\t} else {\n\t\t\t$instance = $option;\n\t\t}\n\n\t\t/*\n\t\t * Override the incoming $_POST['customized'] for a newly-created widget's\n\t\t * setting with the new $instance so that the preview filter currently\n\t\t * in place from WP_Customize_Setting::preview() will use this value\n\t\t * instead of the default widget instance value (an empty array).\n\t\t */\n\t\t$this->manager->set_post_value( $setting_id, $this->sanitize_widget_js_instance( $instance ) );\n\n\t\t// Obtain the widget control with the updated instance in place.\n\t\tob_start();\n\t\t$form = $wp_registered_widget_controls[ $widget_id ];\n\t\tif ( $form ) {\n\t\t\tcall_user_func_array( $form['callback'], $form['params'] );\n\t\t}\n\t\t$form = ob_get_clean();\n\n\t\t$this->stop_capturing_option_updates();\n\n\t\treturn compact( 'instance', 'form' );\n\t}\n\n\t/**\n\t * Update widget settings asynchronously.\n\t *\n\t * Allows the Customizer to update a widget using its form, but return the new\n\t * instance info via Ajax instead of saving it to the options table.\n\t *\n\t * Most code here copied from wp_ajax_save_widget()\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @see wp_ajax_save_widget()\n\t *\n\t */\n\tpublic function wp_ajax_update_widget() {\n\n\t\tif ( ! is_user_logged_in() ) {\n\t\t\twp_die( 0 );\n\t\t}\n\n\t\tcheck_ajax_referer( 'update-widget', 'nonce' );\n\n\t\tif ( ! current_user_can( 'edit_theme_options' ) ) {\n\t\t\twp_die( -1 );\n\t\t}\n\n\t\tif ( empty( $_POST['widget-id'] ) ) {\n\t\t\twp_send_json_error( 'missing_widget-id' );\n\t\t}\n\n\t\t/** This action is documented in wp-admin/includes/ajax-actions.php */\n\t\tdo_action( 'load-widgets.php' );\n\n\t\t/** This action is documented in wp-admin/includes/ajax-actions.php */\n\t\tdo_action( 'widgets.php' );\n\n\t\t/** This action is documented in wp-admin/widgets.php */\n\t\tdo_action( 'sidebar_admin_setup' );\n\n\t\t$widget_id = $this->get_post_value( 'widget-id' );\n\t\t$parsed_id = $this->parse_widget_id( $widget_id );\n\t\t$id_base = $parsed_id['id_base'];\n\n\t\t$is_updating_widget_template = (\n\t\t\tisset( $_POST[ 'widget-' . $id_base ] )\n\t\t\t&&\n\t\t\tis_array( $_POST[ 'widget-' . $id_base ] )\n\t\t\t&&\n\t\t\tpreg_match( '/__i__|%i%/', key( $_POST[ 'widget-' . $id_base ] ) )\n\t\t);\n\t\tif ( $is_updating_widget_template ) {\n\t\t\twp_send_json_error( 'template_widget_not_updatable' );\n\t\t}\n\n\t\t$updated_widget = $this->call_widget_update( $widget_id ); // => {instance,form}\n\t\tif ( is_wp_error( $updated_widget ) ) {\n\t\t\twp_send_json_error( $updated_widget->get_error_code() );\n\t\t}\n\n\t\t$form = $updated_widget['form'];\n\t\t$instance = $this->sanitize_widget_js_instance( $updated_widget['instance'] );\n\n\t\twp_send_json_success( compact( 'form', 'instance' ) );\n\t}\n\n\t/***************************************************************************\n\t * Option Update Capturing\n\t ***************************************************************************/\n\n\t/**\n\t * List of captured widget option updates.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t * @var array $_captured_options Values updated while option capture is happening.\n\t */\n\tprotected $_captured_options = array();\n\n\t/**\n\t * Whether option capture is currently happening.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t * @var bool $_is_current Whether option capture is currently happening or not.\n\t */\n\tprotected $_is_capturing_option_updates = false;\n\n\t/**\n\t * Determine whether the captured option update should be ignored.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t *\n\t * @param string $option_name Option name.\n\t * @return bool Whether the option capture is ignored.\n\t */\n\tprotected function is_option_capture_ignored( $option_name ) {\n\t\treturn ( 0 === strpos( $option_name, '_transient_' ) );\n\t}\n\n\t/**\n\t * Retrieve captured widget option updates.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t *\n\t * @return array Array of captured options.\n\t */\n\tprotected function get_captured_options() {\n\t\treturn $this->_captured_options;\n\t}\n\n\t/**\n\t * Get the option that was captured from being saved.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $option_name Option name.\n\t * @param mixed  $default     Optional. Default value to return if the option does not exist.\n\t * @return mixed Value set for the option.\n\t */\n\tprotected function get_captured_option( $option_name, $default = false ) {\n\t\tif ( array_key_exists( $option_name, $this->_captured_options ) ) {\n\t\t\t$value = $this->_captured_options[ $option_name ];\n\t\t} else {\n\t\t\t$value = $default;\n\t\t}\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Get the number of captured widget option updates.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t *\n\t * @return int Number of updated options.\n\t */\n\tprotected function count_captured_options() {\n\t\treturn count( $this->_captured_options );\n\t}\n\n\t/**\n\t * Start keeping track of changes to widget options, caching new values.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t */\n\tprotected function start_capturing_option_updates() {\n\t\tif ( $this->_is_capturing_option_updates ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->_is_capturing_option_updates = true;\n\n\t\tadd_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10, 3 );\n\t}\n\n\t/**\n\t * Pre-filter captured option values before updating.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param mixed  $new_value   The new option value.\n\t * @param string $option_name Name of the option.\n\t * @param mixed  $old_value   The old option value.\n\t * @return mixed Filtered option value.\n\t */\n\tpublic function capture_filter_pre_update_option( $new_value, $option_name, $old_value ) {\n\t\tif ( $this->is_option_capture_ignored( $option_name ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! isset( $this->_captured_options[ $option_name ] ) ) {\n\t\t\tadd_filter( \"pre_option_{$option_name}\", array( $this, 'capture_filter_pre_get_option' ) );\n\t\t}\n\n\t\t$this->_captured_options[ $option_name ] = $new_value;\n\n\t\treturn $old_value;\n\t}\n\n\t/**\n\t * Pre-filter captured option values before retrieving.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @param mixed $value Value to return instead of the option value.\n\t * @return mixed Filtered option value.\n\t */\n\tpublic function capture_filter_pre_get_option( $value ) {\n\t\t$option_name = preg_replace( '/^pre_option_/', '', current_filter() );\n\n\t\tif ( isset( $this->_captured_options[ $option_name ] ) ) {\n\t\t\t$value = $this->_captured_options[ $option_name ];\n\n\t\t\t/** This filter is documented in wp-includes/option.php */\n\t\t\t$value = apply_filters( 'option_' . $option_name, $value );\n\t\t}\n\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Undo any changes to the options since options capture began.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t */\n\tprotected function stop_capturing_option_updates() {\n\t\tif ( ! $this->_is_capturing_option_updates ) {\n\t\t\treturn;\n\t\t}\n\n\t\tremove_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10, 3 );\n\n\t\tforeach ( array_keys( $this->_captured_options ) as $option_name ) {\n\t\t\tremove_filter( \"pre_option_{$option_name}\", array( $this, 'capture_filter_pre_get_option' ) );\n\t\t}\n\n\t\t$this->_captured_options = array();\n\t\t$this->_is_capturing_option_updates = false;\n\t}\n\n\t/**\n\t * @since 3.9.0\n\t * @deprecated 4.2.0 Deprecated in favor of customize_dynamic_setting_args filter.\n\t */\n\tpublic function setup_widget_addition_previews() {\n\t\t_deprecated_function( __METHOD__, '4.2.0' );\n\t}\n\n\t/**\n\t * @since 3.9.0\n\t * @deprecated 4.2.0 Deprecated in favor of customize_dynamic_setting_args filter.\n\t */\n\tpublic function prepreview_added_sidebars_widgets() {\n\t\t_deprecated_function( __METHOD__, '4.2.0' );\n\t}\n\n\t/**\n\t * @since 3.9.0\n\t * @deprecated 4.2.0 Deprecated in favor of customize_dynamic_setting_args filter.\n\t */\n\tpublic function prepreview_added_widget_instance() {\n\t\t_deprecated_function( __METHOD__, '4.2.0' );\n\t}\n\n\t/**\n\t * @since 3.9.0\n\t * @deprecated 4.2.0 Deprecated in favor of customize_dynamic_setting_args filter.\n\t */\n\tpublic function remove_prepreview_filters() {\n\t\t_deprecated_function( __METHOD__, '4.2.0' );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-editor.php",
    "content": "<?php\n/**\n * Facilitates adding of the WordPress editor as used on the Write and Edit screens.\n *\n * @package WordPress\n * @since 3.3.0\n *\n * Private, not included by default. See wp_editor() in wp-includes/general-template.php.\n */\n\nfinal class _WP_Editors {\n\tpublic static $mce_locale;\n\n\tprivate static $mce_settings = array();\n\tprivate static $qt_settings = array();\n\tprivate static $plugins = array();\n\tprivate static $qt_buttons = array();\n\tprivate static $ext_plugins;\n\tprivate static $baseurl;\n\tprivate static $first_init;\n\tprivate static $this_tinymce = false;\n\tprivate static $this_quicktags = false;\n\tprivate static $has_tinymce = false;\n\tprivate static $has_quicktags = false;\n\tprivate static $has_medialib = false;\n\tprivate static $editor_buttons_css = true;\n\tprivate static $drag_drop_upload = false;\n\tprivate static $old_dfw_compat = false;\n\n\tprivate function __construct() {}\n\n\t/**\n\t * Parse default arguments for the editor instance.\n\t *\n\t * @static\n\t * @param string $editor_id ID for the current editor instance.\n\t * @param array  $settings {\n\t *     Array of editor arguments.\n\t *\n\t *     @type bool       $wpautop           Whether to use wpautop(). Default true.\n\t *     @type bool       $media_buttons     Whether to show the Add Media/other media buttons.\n\t *     @type string     $default_editor    When both TinyMCE and Quicktags are used, set which\n\t *                                         editor is shown on page load. Default empty.\n\t *     @type bool       $drag_drop_upload  Whether to enable drag & drop on the editor uploading. Default false.\n\t *                                         Requires the media modal.\n\t *     @type string     $textarea_name     Give the textarea a unique name here. Square brackets\n\t *                                         can be used here. Default $editor_id.\n\t *     @type int        $textarea_rows     Number rows in the editor textarea. Default 20.\n\t *     @type string|int $tabindex          Tabindex value to use. Default empty.\n\t *     @type string     $tabfocus_elements The previous and next element ID to move the focus to\n\t *                                         when pressing the Tab key in TinyMCE. Default ':prev,:next'.\n\t *     @type string     $editor_css        Intended for extra styles for both Visual and Text editors.\n\t *                                         Should include `<style>` tags, and can use \"scoped\". Default empty.\n\t *     @type string     $editor_class      Extra classes to add to the editor textarea element. Default empty.\n\t *     @type bool       $teeny             Whether to output the minimal editor config. Examples include\n\t *                                         Press This and the Comment editor. Default false.\n\t *     @type bool       $dfw               Deprecated in 4.1. Since 4.3 used only to enqueue wp-fullscreen-stub.js for backwards compatibility.\n\t *     @type bool|array $tinymce           Whether to load TinyMCE. Can be used to pass settings directly to\n\t *                                         TinyMCE using an array. Default true.\n\t *     @type bool|array $quicktags         Whether to load Quicktags. Can be used to pass settings directly to\n\t *                                         Quicktags using an array. Default true.\n\t * }\n\t * @return array Parsed arguments array.\n\t */\n\tpublic static function parse_settings( $editor_id, $settings ) {\n\n\t\t/**\n\t\t * Filter the wp_editor() settings.\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @see _WP_Editors()::parse_settings()\n\t\t *\n\t\t * @param array  $settings  Array of editor arguments.\n\t\t * @param string $editor_id ID for the current editor instance.\n\t\t */\n\t\t$settings = apply_filters( 'wp_editor_settings', $settings, $editor_id );\n\n\t\t$set = wp_parse_args( $settings, array(\n\t\t\t'wpautop'             => true,\n\t\t\t'media_buttons'       => true,\n\t\t\t'default_editor'      => '',\n\t\t\t'drag_drop_upload'    => false,\n\t\t\t'textarea_name'       => $editor_id,\n\t\t\t'textarea_rows'       => 20,\n\t\t\t'tabindex'            => '',\n\t\t\t'tabfocus_elements'   => ':prev,:next',\n\t\t\t'editor_css'          => '',\n\t\t\t'editor_class'        => '',\n\t\t\t'teeny'               => false,\n\t\t\t'dfw'                 => false,\n\t\t\t'_content_editor_dfw' => false,\n\t\t\t'tinymce'             => true,\n\t\t\t'quicktags'           => true\n\t\t) );\n\n\t\tself::$this_tinymce = ( $set['tinymce'] && user_can_richedit() );\n\n\t\tif ( self::$this_tinymce ) {\n\t\t\tif ( false !== strpos( $editor_id, '[' ) ) {\n\t\t\t\tself::$this_tinymce = false;\n\t\t\t\t_deprecated_argument( 'wp_editor()', '3.9', 'TinyMCE editor IDs cannot have brackets.' );\n\t\t\t}\n\t\t}\n\n\t\tself::$this_quicktags = (bool) $set['quicktags'];\n\n\t\tif ( self::$this_tinymce )\n\t\t\tself::$has_tinymce = true;\n\n\t\tif ( self::$this_quicktags )\n\t\t\tself::$has_quicktags = true;\n\n\t\tif ( $set['dfw'] ) {\n\t\t\tself::$old_dfw_compat = true;\n\t\t}\n\n\t\tif ( empty( $set['editor_height'] ) )\n\t\t\treturn $set;\n\n\t\tif ( 'content' === $editor_id && empty( $set['tinymce']['wp_autoresize_on'] ) ) {\n\t\t\t// A cookie (set when a user resizes the editor) overrides the height.\n\t\t\t$cookie = (int) get_user_setting( 'ed_size' );\n\n\t\t\tif ( $cookie )\n\t\t\t\t$set['editor_height'] = $cookie;\n\t\t}\n\n\t\tif ( $set['editor_height'] < 50 )\n\t\t\t$set['editor_height'] = 50;\n\t\telseif ( $set['editor_height'] > 5000 )\n\t\t\t$set['editor_height'] = 5000;\n\n\t\treturn $set;\n\t}\n\n\t/**\n\t * Outputs the HTML for a single instance of the editor.\n\t *\n\t * @static\n\t * @param string $content The initial content of the editor.\n\t * @param string $editor_id ID for the textarea and TinyMCE and Quicktags instances (can contain only ASCII letters and numbers).\n\t * @param array $settings See the _parse_settings() method for description.\n\t */\n\tpublic static function editor( $content, $editor_id, $settings = array() ) {\n\t\t$set = self::parse_settings( $editor_id, $settings );\n\t\t$editor_class = ' class=\"' . trim( esc_attr( $set['editor_class'] ) . ' wp-editor-area' ) . '\"';\n\t\t$tabindex = $set['tabindex'] ? ' tabindex=\"' . (int) $set['tabindex'] . '\"' : '';\n\t\t$default_editor = 'html';\n\t\t$buttons = $autocomplete = '';\n\t\t$editor_id_attr = esc_attr( $editor_id );\n\n\t\tif ( $set['drag_drop_upload'] ) {\n\t\t\tself::$drag_drop_upload = true;\n\t\t}\n\n\t\tif ( ! empty( $set['editor_height'] ) ) {\n\t\t\t$height = ' style=\"height: ' . (int) $set['editor_height'] . 'px\"';\n\t\t} else {\n\t\t\t$height = ' rows=\"' . (int) $set['textarea_rows'] . '\"';\n\t\t}\n\n\t\tif ( ! current_user_can( 'upload_files' ) ) {\n\t\t\t$set['media_buttons'] = false;\n\t\t}\n\n\t\tif ( self::$this_tinymce ) {\n\t\t\t$autocomplete = ' autocomplete=\"off\"';\n\n\t\t\tif ( self::$this_quicktags ) {\n\t\t\t\t$default_editor = $set['default_editor'] ? $set['default_editor'] : wp_default_editor();\n\t\t\t\t// 'html' is used for the \"Text\" editor tab.\n\t\t\t\tif ( 'html' !== $default_editor ) {\n\t\t\t\t\t$default_editor = 'tinymce';\n\t\t\t\t}\n\n\t\t\t\t$buttons .= '<button type=\"button\" id=\"' . $editor_id_attr . '-tmce\" class=\"wp-switch-editor switch-tmce\"' .\n\t\t\t\t\t' data-wp-editor-id=\"' . $editor_id_attr . '\">' . __('Visual') . \"</button>\\n\";\n\t\t\t\t$buttons .= '<button type=\"button\" id=\"' . $editor_id_attr . '-html\" class=\"wp-switch-editor switch-html\"' .\n\t\t\t\t\t' data-wp-editor-id=\"' . $editor_id_attr . '\">' . _x( 'Text', 'Name for the Text editor tab (formerly HTML)' ) . \"</button>\\n\";\n\t\t\t} else {\n\t\t\t\t$default_editor = 'tinymce';\n\t\t\t}\n\t\t}\n\n\t\t$switch_class = 'html' === $default_editor ? 'html-active' : 'tmce-active';\n\t\t$wrap_class = 'wp-core-ui wp-editor-wrap ' . $switch_class;\n\n\t\tif ( $set['_content_editor_dfw'] ) {\n\t\t\t$wrap_class .= ' has-dfw';\n\t\t}\n\n\t\techo '<div id=\"wp-' . $editor_id_attr . '-wrap\" class=\"' . $wrap_class . '\">';\n\n\t\tif ( self::$editor_buttons_css ) {\n\t\t\twp_print_styles( 'editor-buttons' );\n\t\t\tself::$editor_buttons_css = false;\n\t\t}\n\n\t\tif ( ! empty( $set['editor_css'] ) ) {\n\t\t\techo $set['editor_css'] . \"\\n\";\n\t\t}\n\n\t\tif ( ! empty( $buttons ) || $set['media_buttons'] ) {\n\t\t\techo '<div id=\"wp-' . $editor_id_attr . '-editor-tools\" class=\"wp-editor-tools hide-if-no-js\">';\n\n\t\t\tif ( $set['media_buttons'] ) {\n\t\t\t\tself::$has_medialib = true;\n\n\t\t\t\tif ( ! function_exists( 'media_buttons' ) )\n\t\t\t\t\tinclude( ABSPATH . 'wp-admin/includes/media.php' );\n\n\t\t\t\techo '<div id=\"wp-' . $editor_id_attr . '-media-buttons\" class=\"wp-media-buttons\">';\n\n\t\t\t\t/**\n\t\t\t\t * Fires after the default media button(s) are displayed.\n\t\t\t\t *\n\t\t\t\t * @since 2.5.0\n\t\t\t\t *\n\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t */\n\t\t\t\tdo_action( 'media_buttons', $editor_id );\n\t\t\t\techo \"</div>\\n\";\n\t\t\t}\n\n\t\t\techo '<div class=\"wp-editor-tabs\">' . $buttons . \"</div>\\n\";\n\t\t\techo \"</div>\\n\";\n\t\t}\n\n\t\t$quicktags_toolbar = '';\n\n\t\tif ( self::$this_quicktags ) {\n\t\t\tif ( 'content' === $editor_id && ! empty( $GLOBALS['current_screen'] ) && $GLOBALS['current_screen']->base === 'post' ) {\n\t\t\t\t$toolbar_id = 'ed_toolbar';\n\t\t\t} else {\n\t\t\t\t$toolbar_id = 'qt_' . $editor_id_attr . '_toolbar';\n\t\t\t}\n\n\t\t\t$quicktags_toolbar = '<div id=\"' . $toolbar_id . '\" class=\"quicktags-toolbar\"></div>';\n\t\t}\n\n\t\t/**\n\t\t * Filter the HTML markup output that displays the editor.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $output Editor's HTML markup.\n\t\t */\n\t\t$the_editor = apply_filters( 'the_editor', '<div id=\"wp-' . $editor_id_attr . '-editor-container\" class=\"wp-editor-container\">' .\n\t\t\t$quicktags_toolbar .\n\t\t\t'<textarea' . $editor_class . $height . $tabindex . $autocomplete . ' cols=\"40\" name=\"' . esc_attr( $set['textarea_name'] ) . '\" ' .\n\t\t\t'id=\"' . $editor_id_attr . '\">%s</textarea></div>' );\n\n\t\t// Prepare the content for the Visual or Text editor\n\t\tif ( self::$this_tinymce ) {\n\t\t\tadd_filter( 'the_editor_content', 'format_for_editor', 10, 2 );\n\t\t}\n\n\t\t/**\n\t\t * Filter the default editor content.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $content Default editor content.\n\t\t */\n\t\t$content = apply_filters( 'the_editor_content', $content, $default_editor );\n\n\t\t// Back-compat for the `htmledit_pre` and `richedit_pre` filters\n\t\tif ( 'html' === $default_editor && has_filter( 'htmledit_pre' ) ) {\n\t\t\t// TODO: needs _deprecated_filter(), use _deprecated_function() as substitute for now\n\t\t\t_deprecated_function( 'add_filter( htmledit_pre )', '4.3.0', 'add_filter( format_for_editor )' );\n\t\t\t$content = apply_filters( 'htmledit_pre', $content );\n\t\t} elseif ( 'tinymce' === $default_editor && has_filter( 'richedit_pre' ) ) {\n\t\t\t_deprecated_function( 'add_filter( richedit_pre )', '4.3.0', 'add_filter( format_for_editor )' );\n\t\t\t$content = apply_filters( 'richedit_pre', $content );\n\t\t}\n\n\t\tif ( false !== stripos( $content, 'textarea' ) ) {\n\t\t\t$content = preg_replace( '%</textarea%i', '&lt;/textarea', $content );\n\t\t}\n\n\t\tprintf( $the_editor, $content );\n\t\techo \"\\n</div>\\n\\n\";\n\n\t\tself::editor_settings( $editor_id, $set );\n\t}\n\n\t/**\n\t * @static\n\t *\n\t * @global string $wp_version\n\t * @global string $tinymce_version\n\t *\n\t * @param string $editor_id\n\t * @param array  $set\n\t */\n\tpublic static function editor_settings($editor_id, $set) {\n\t\tglobal $wp_version, $tinymce_version;\n\n\t\tif ( empty(self::$first_init) ) {\n\t\t\tif ( is_admin() ) {\n\t\t\t\tadd_action( 'admin_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 );\n\t\t\t\tadd_action( 'admin_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 );\n\t\t\t} else {\n\t\t\t\tadd_action( 'wp_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 );\n\t\t\t\tadd_action( 'wp_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 );\n\t\t\t}\n\t\t}\n\n\t\tif ( self::$this_quicktags ) {\n\n\t\t\t$qtInit = array(\n\t\t\t\t'id' => $editor_id,\n\t\t\t\t'buttons' => ''\n\t\t\t);\n\n\t\t\tif ( is_array($set['quicktags']) )\n\t\t\t\t$qtInit = array_merge($qtInit, $set['quicktags']);\n\n\t\t\tif ( empty($qtInit['buttons']) )\n\t\t\t\t$qtInit['buttons'] = 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close';\n\n\t\t\tif ( $set['_content_editor_dfw'] ) {\n\t\t\t\t$qtInit['buttons'] .= ',dfw';\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter the Quicktags settings.\n\t\t\t *\n\t\t\t * @since 3.3.0\n\t\t\t *\n\t\t\t * @param array  $qtInit    Quicktags settings.\n\t\t\t * @param string $editor_id The unique editor ID, e.g. 'content'.\n\t\t\t */\n\t\t\t$qtInit = apply_filters( 'quicktags_settings', $qtInit, $editor_id );\n\n\t\t\tself::$qt_settings[$editor_id] = $qtInit;\n\n\t\t\tself::$qt_buttons = array_merge( self::$qt_buttons, explode(',', $qtInit['buttons']) );\n\t\t}\n\n\t\tif ( self::$this_tinymce ) {\n\n\t\t\tif ( empty( self::$first_init ) ) {\n\t\t\t\tself::$baseurl = includes_url( 'js/tinymce' );\n\n\t\t\t\t$mce_locale = get_locale();\n\t\t\t\tself::$mce_locale = $mce_locale = empty( $mce_locale ) ? 'en' : strtolower( substr( $mce_locale, 0, 2 ) ); // ISO 639-1\n\n\t\t\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\t\t\t$no_captions = (bool) apply_filters( 'disable_captions', '' );\n\t\t\t\t$ext_plugins = '';\n\n\t\t\t\tif ( $set['teeny'] ) {\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the list of teenyMCE plugins.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.7.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param array  $plugins   An array of teenyMCE plugins.\n\t\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t\t */\n\t\t\t\t\tself::$plugins = $plugins = apply_filters( 'teeny_mce_plugins', array( 'colorpicker', 'lists', 'fullscreen', 'image', 'wordpress', 'wpeditimage', 'wplink' ), $editor_id );\n\t\t\t\t} else {\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the list of TinyMCE external plugins.\n\t\t\t\t\t *\n\t\t\t\t\t * The filter takes an associative array of external plugins for\n\t\t\t\t\t * TinyMCE in the form 'plugin_name' => 'url'.\n\t\t\t\t\t *\n\t\t\t\t\t * The url should be absolute, and should include the js filename\n\t\t\t\t\t * to be loaded. For example:\n\t\t\t\t\t * 'myplugin' => 'http://mysite.com/wp-content/plugins/myfolder/mce_plugin.js'.\n\t\t\t\t\t *\n\t\t\t\t\t * If the external plugin adds a button, it should be added with\n\t\t\t\t\t * one of the 'mce_buttons' filters.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.5.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param array $external_plugins An array of external TinyMCE plugins.\n\t\t\t\t\t */\n\t\t\t\t\t$mce_external_plugins = apply_filters( 'mce_external_plugins', array() );\n\n\t\t\t\t\t$plugins = array(\n\t\t\t\t\t\t'charmap',\n\t\t\t\t\t\t'colorpicker',\n\t\t\t\t\t\t'hr',\n\t\t\t\t\t\t'lists',\n\t\t\t\t\t\t'media',\n\t\t\t\t\t\t'paste',\n\t\t\t\t\t\t'tabfocus',\n\t\t\t\t\t\t'textcolor',\n\t\t\t\t\t\t'fullscreen',\n\t\t\t\t\t\t'wordpress',\n\t\t\t\t\t\t'wpautoresize',\n\t\t\t\t\t\t'wpeditimage',\n\t\t\t\t\t\t'wpemoji',\n\t\t\t\t\t\t'wpgallery',\n\t\t\t\t\t\t'wplink',\n\t\t\t\t\t\t'wpdialogs',\n\t\t\t\t\t\t'wptextpattern',\n\t\t\t\t\t\t'wpview',\n\t\t\t\t\t\t'wpembed',\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( ! self::$has_medialib ) {\n\t\t\t\t\t\t$plugins[] = 'image';\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the list of default TinyMCE plugins.\n\t\t\t\t\t *\n\t\t\t\t\t * The filter specifies which of the default plugins included\n\t\t\t\t\t * in WordPress should be added to the TinyMCE instance.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 3.3.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param array $plugins An array of default TinyMCE plugins.\n\t\t\t\t\t */\n\t\t\t\t\t$plugins = array_unique( apply_filters( 'tiny_mce_plugins', $plugins ) );\n\n\t\t\t\t\tif ( ( $key = array_search( 'spellchecker', $plugins ) ) !== false ) {\n\t\t\t\t\t\t// Remove 'spellchecker' from the internal plugins if added with 'tiny_mce_plugins' filter to prevent errors.\n\t\t\t\t\t\t// It can be added with 'mce_external_plugins'.\n\t\t\t\t\t\tunset( $plugins[$key] );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! empty( $mce_external_plugins ) ) {\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Filter the translations loaded for external TinyMCE 3.x plugins.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * The filter takes an associative array ('plugin_name' => 'path')\n\t\t\t\t\t\t * where 'path' is the include path to the file.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * The language file should follow the same format as wp_mce_translation(),\n\t\t\t\t\t\t * and should define a variable ($strings) that holds all translated strings.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @since 2.5.0\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @param array $translations Translations for external TinyMCE plugins.\n\t\t\t\t\t\t */\n\t\t\t\t\t\t$mce_external_languages = apply_filters( 'mce_external_languages', array() );\n\n\t\t\t\t\t\t$loaded_langs = array();\n\t\t\t\t\t\t$strings = '';\n\n\t\t\t\t\t\tif ( ! empty( $mce_external_languages ) ) {\n\t\t\t\t\t\t\tforeach ( $mce_external_languages as $name => $path ) {\n\t\t\t\t\t\t\t\tif ( @is_file( $path ) && @is_readable( $path ) ) {\n\t\t\t\t\t\t\t\t\tinclude_once( $path );\n\t\t\t\t\t\t\t\t\t$ext_plugins .= $strings . \"\\n\";\n\t\t\t\t\t\t\t\t\t$loaded_langs[] = $name;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tforeach ( $mce_external_plugins as $name => $url ) {\n\t\t\t\t\t\t\tif ( in_array( $name, $plugins, true ) ) {\n\t\t\t\t\t\t\t\tunset( $mce_external_plugins[ $name ] );\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$url = set_url_scheme( $url );\n\t\t\t\t\t\t\t$mce_external_plugins[ $name ] = $url;\n\t\t\t\t\t\t\t$plugurl = dirname( $url );\n\t\t\t\t\t\t\t$strings = '';\n\n\t\t\t\t\t\t\t// Try to load langs/[locale].js and langs/[locale]_dlg.js\n\t\t\t\t\t\t\tif ( ! in_array( $name, $loaded_langs, true ) ) {\n\t\t\t\t\t\t\t\t$path = str_replace( content_url(), '', $plugurl );\n\t\t\t\t\t\t\t\t$path = WP_CONTENT_DIR . $path . '/langs/';\n\n\t\t\t\t\t\t\t\tif ( function_exists('realpath') )\n\t\t\t\t\t\t\t\t\t$path = trailingslashit( realpath($path) );\n\n\t\t\t\t\t\t\t\tif ( @is_file( $path . $mce_locale . '.js' ) )\n\t\t\t\t\t\t\t\t\t$strings .= @file_get_contents( $path . $mce_locale . '.js' ) . \"\\n\";\n\n\t\t\t\t\t\t\t\tif ( @is_file( $path . $mce_locale . '_dlg.js' ) )\n\t\t\t\t\t\t\t\t\t$strings .= @file_get_contents( $path . $mce_locale . '_dlg.js' ) . \"\\n\";\n\n\t\t\t\t\t\t\t\tif ( 'en' != $mce_locale && empty( $strings ) ) {\n\t\t\t\t\t\t\t\t\tif ( @is_file( $path . 'en.js' ) ) {\n\t\t\t\t\t\t\t\t\t\t$str1 = @file_get_contents( $path . 'en.js' );\n\t\t\t\t\t\t\t\t\t\t$strings .= preg_replace( '/([\\'\"])en\\./', '$1' . $mce_locale . '.', $str1, 1 ) . \"\\n\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( @is_file( $path . 'en_dlg.js' ) ) {\n\t\t\t\t\t\t\t\t\t\t$str2 = @file_get_contents( $path . 'en_dlg.js' );\n\t\t\t\t\t\t\t\t\t\t$strings .= preg_replace( '/([\\'\"])en\\./', '$1' . $mce_locale . '.', $str2, 1 ) . \"\\n\";\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( ! empty( $strings ) )\n\t\t\t\t\t\t\t\t\t$ext_plugins .= \"\\n\" . $strings . \"\\n\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$ext_plugins .= 'tinyMCEPreInit.load_ext(\"' . $plugurl . '\", \"' . $mce_locale . '\");' . \"\\n\";\n\t\t\t\t\t\t\t$ext_plugins .= 'tinymce.PluginManager.load(\"' . $name . '\", \"' . $url . '\");' . \"\\n\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tself::$plugins = $plugins;\n\t\t\t\tself::$ext_plugins = $ext_plugins;\n\n\t\t\t\tself::$first_init = array(\n\t\t\t\t\t'theme' => 'modern',\n\t\t\t\t\t'skin' => 'lightgray',\n\t\t\t\t\t'language' => self::$mce_locale,\n\t\t\t\t\t'formats' => '{' .\n\t\t\t\t\t\t'alignleft: [' .\n\t\t\t\t\t\t\t'{selector: \"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li\", styles: {textAlign:\"left\"}},' .\n\t\t\t\t\t\t\t'{selector: \"img,table,dl.wp-caption\", classes: \"alignleft\"}' .\n\t\t\t\t\t\t'],' .\n\t\t\t\t\t\t'aligncenter: [' .\n\t\t\t\t\t\t\t'{selector: \"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li\", styles: {textAlign:\"center\"}},' .\n\t\t\t\t\t\t\t'{selector: \"img,table,dl.wp-caption\", classes: \"aligncenter\"}' .\n\t\t\t\t\t\t'],' .\n\t\t\t\t\t\t'alignright: [' .\n\t\t\t\t\t\t\t'{selector: \"p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li\", styles: {textAlign:\"right\"}},' .\n\t\t\t\t\t\t\t'{selector: \"img,table,dl.wp-caption\", classes: \"alignright\"}' .\n\t\t\t\t\t\t'],' .\n\t\t\t\t\t\t'strikethrough: {inline: \"del\"}' .\n\t\t\t\t\t'}',\n\t\t\t\t\t'relative_urls' => false,\n\t\t\t\t\t'remove_script_host' => false,\n\t\t\t\t\t'convert_urls' => false,\n\t\t\t\t\t'browser_spellcheck' => true,\n\t\t\t\t\t'fix_list_elements' => true,\n\t\t\t\t\t'entities' => '38,amp,60,lt,62,gt',\n\t\t\t\t\t'entity_encoding' => 'raw',\n\t\t\t\t\t'keep_styles' => false,\n\t\t\t\t\t'cache_suffix' => 'wp-mce-' . $tinymce_version,\n\n\t\t\t\t\t// Limit the preview styles in the menu/toolbar\n\t\t\t\t\t'preview_styles' => 'font-family font-size font-weight font-style text-decoration text-transform',\n\n\t\t\t\t\t'end_container_on_empty_block' => true,\n\t\t\t\t\t'wpeditimage_disable_captions' => $no_captions,\n\t\t\t\t\t'wpeditimage_html5_captions' => current_theme_supports( 'html5', 'caption' ),\n\t\t\t\t\t'plugins' => implode( ',', $plugins ),\n\t\t\t\t\t'wp_lang_attr' => get_bloginfo( 'language' )\n\t\t\t\t);\n\n\t\t\t\tif ( ! empty( $mce_external_plugins ) ) {\n\t\t\t\t\tself::$first_init['external_plugins'] = wp_json_encode( $mce_external_plugins );\n\t\t\t\t}\n\n\t\t\t\t$suffix = SCRIPT_DEBUG ? '' : '.min';\n\t\t\t\t$version = 'ver=' . $wp_version;\n\t\t\t\t$dashicons = includes_url( \"css/dashicons$suffix.css?$version\" );\n\n\t\t\t\t// WordPress default stylesheet and dashicons\n\t\t\t\t$mce_css = array(\n\t\t\t\t\t$dashicons,\n\t\t\t\t\tself::$baseurl . '/skins/wordpress/wp-content.css?' . $version\n\t\t\t\t);\n\n\t\t\t\t$editor_styles = get_editor_stylesheets();\n\t\t\t\tif ( ! empty( $editor_styles ) ) {\n\t\t\t\t\tforeach ( $editor_styles as $style ) {\n\t\t\t\t\t\t$mce_css[] = $style;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Filter the comma-delimited list of stylesheets to load in TinyMCE.\n\t\t\t\t *\n\t\t\t\t * @since 2.1.0\n\t\t\t\t *\n\t\t\t\t * @param string $stylesheets Comma-delimited list of stylesheets.\n\t\t\t\t */\n\t\t\t\t$mce_css = trim( apply_filters( 'mce_css', implode( ',', $mce_css ) ), ' ,' );\n\n\t\t\t\tif ( ! empty($mce_css) )\n\t\t\t\t\tself::$first_init['content_css'] = $mce_css;\n\t\t\t}\n\n\t\t\tif ( $set['teeny'] ) {\n\n\t\t\t\t/**\n\t\t\t\t * Filter the list of teenyMCE buttons (Text tab).\n\t\t\t\t *\n\t\t\t\t * @since 2.7.0\n\t\t\t\t *\n\t\t\t\t * @param array  $buttons   An array of teenyMCE buttons.\n\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t */\n\t\t\t\t$mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold', 'italic', 'underline', 'blockquote', 'strikethrough', 'bullist', 'numlist', 'alignleft', 'aligncenter', 'alignright', 'undo', 'redo', 'link', 'unlink', 'fullscreen'), $editor_id );\n\t\t\t\t$mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = array();\n\t\t\t} else {\n\t\t\t\t$mce_buttons = array( 'bold', 'italic', 'strikethrough', 'bullist', 'numlist', 'blockquote', 'hr', 'alignleft', 'aligncenter', 'alignright', 'link', 'unlink', 'wp_more', 'spellchecker' );\n\n\t\t\t\tif ( ! wp_is_mobile() ) {\n\t\t\t\t\tif ( $set['_content_editor_dfw'] ) {\n\t\t\t\t\t\t$mce_buttons[] = 'dfw';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$mce_buttons[] = 'fullscreen';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$mce_buttons[] = 'wp_adv';\n\n\t\t\t\t/**\n\t\t\t\t * Filter the first-row list of TinyMCE buttons (Visual tab).\n\t\t\t\t *\n\t\t\t\t * @since 2.0.0\n\t\t\t\t *\n\t\t\t\t * @param array  $buttons   First-row list of buttons.\n\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t */\n\t\t\t\t$mce_buttons = apply_filters( 'mce_buttons', $mce_buttons, $editor_id );\n\n\t\t\t\t$mce_buttons_2 = array( 'formatselect', 'underline', 'alignjustify', 'forecolor', 'pastetext', 'removeformat', 'charmap', 'outdent', 'indent', 'undo', 'redo' );\n\n\t\t\t\tif ( ! wp_is_mobile() ) {\n\t\t\t\t\t$mce_buttons_2[] = 'wp_help';\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Filter the second-row list of TinyMCE buttons (Visual tab).\n\t\t\t\t *\n\t\t\t\t * @since 2.0.0\n\t\t\t\t *\n\t\t\t\t * @param array  $buttons   Second-row list of buttons.\n\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t */\n\t\t\t\t$mce_buttons_2 = apply_filters( 'mce_buttons_2', $mce_buttons_2, $editor_id );\n\n\t\t\t\t/**\n\t\t\t\t * Filter the third-row list of TinyMCE buttons (Visual tab).\n\t\t\t\t *\n\t\t\t\t * @since 2.0.0\n\t\t\t\t *\n\t\t\t\t * @param array  $buttons   Third-row list of buttons.\n\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t */\n\t\t\t\t$mce_buttons_3 = apply_filters( 'mce_buttons_3', array(), $editor_id );\n\n\t\t\t\t/**\n\t\t\t\t * Filter the fourth-row list of TinyMCE buttons (Visual tab).\n\t\t\t\t *\n\t\t\t\t * @since 2.5.0\n\t\t\t\t *\n\t\t\t\t * @param array  $buttons   Fourth-row list of buttons.\n\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t */\n\t\t\t\t$mce_buttons_4 = apply_filters( 'mce_buttons_4', array(), $editor_id );\n\t\t\t}\n\n\t\t\t$body_class = $editor_id;\n\n\t\t\tif ( $post = get_post() ) {\n\t\t\t\t$body_class .= ' post-type-' . sanitize_html_class( $post->post_type ) . ' post-status-' . sanitize_html_class( $post->post_status );\n\t\t\t\tif ( post_type_supports( $post->post_type, 'post-formats' ) ) {\n\t\t\t\t\t$post_format = get_post_format( $post );\n\t\t\t\t\tif ( $post_format && ! is_wp_error( $post_format ) )\n\t\t\t\t\t\t$body_class .= ' post-format-' . sanitize_html_class( $post_format );\n\t\t\t\t\telse\n\t\t\t\t\t\t$body_class .= ' post-format-standard';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );\n\n\t\t\tif ( !empty($set['tinymce']['body_class']) ) {\n\t\t\t\t$body_class .= ' ' . $set['tinymce']['body_class'];\n\t\t\t\tunset($set['tinymce']['body_class']);\n\t\t\t}\n\n\t\t\t$mceInit = array (\n\t\t\t\t'selector' => \"#$editor_id\",\n\t\t\t\t'resize' => 'vertical',\n\t\t\t\t'menubar' => false,\n\t\t\t\t'wpautop' => (bool) $set['wpautop'],\n\t\t\t\t'indent' => ! $set['wpautop'],\n\t\t\t\t'toolbar1' => implode($mce_buttons, ','),\n\t\t\t\t'toolbar2' => implode($mce_buttons_2, ','),\n\t\t\t\t'toolbar3' => implode($mce_buttons_3, ','),\n\t\t\t\t'toolbar4' => implode($mce_buttons_4, ','),\n\t\t\t\t'tabfocus_elements' => $set['tabfocus_elements'],\n\t\t\t\t'body_class' => $body_class\n\t\t\t);\n\n\t\t\t// Merge with the first part of the init array\n\t\t\t$mceInit = array_merge( self::$first_init, $mceInit );\n\n\t\t\tif ( is_array( $set['tinymce'] ) )\n\t\t\t\t$mceInit = array_merge( $mceInit, $set['tinymce'] );\n\n\t\t\t/*\n\t\t\t * For people who really REALLY know what they're doing with TinyMCE\n\t\t\t * You can modify $mceInit to add, remove, change elements of the config\n\t\t\t * before tinyMCE.init. Setting \"valid_elements\", \"invalid_elements\"\n\t\t\t * and \"extended_valid_elements\" can be done through this filter. Best\n\t\t\t * is to use the default cleanup by not specifying valid_elements,\n\t\t\t * as TinyMCE checks against the full set of HTML 5.0 elements and attributes.\n\t\t\t */\n\t\t\tif ( $set['teeny'] ) {\n\n\t\t\t\t/**\n\t\t\t\t * Filter the teenyMCE config before init.\n\t\t\t\t *\n\t\t\t\t * @since 2.7.0\n\t\t\t\t *\n\t\t\t\t * @param array  $mceInit   An array with teenyMCE config.\n\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t */\n\t\t\t\t$mceInit = apply_filters( 'teeny_mce_before_init', $mceInit, $editor_id );\n\t\t\t} else {\n\n\t\t\t\t/**\n\t\t\t\t * Filter the TinyMCE config before init.\n\t\t\t\t *\n\t\t\t\t * @since 2.5.0\n\t\t\t\t *\n\t\t\t\t * @param array  $mceInit   An array with TinyMCE config.\n\t\t\t\t * @param string $editor_id Unique editor identifier, e.g. 'content'.\n\t\t\t\t */\n\t\t\t\t$mceInit = apply_filters( 'tiny_mce_before_init', $mceInit, $editor_id );\n\t\t\t}\n\n\t\t\tif ( empty( $mceInit['toolbar3'] ) && ! empty( $mceInit['toolbar4'] ) ) {\n\t\t\t\t$mceInit['toolbar3'] = $mceInit['toolbar4'];\n\t\t\t\t$mceInit['toolbar4'] = '';\n\t\t\t}\n\n\t\t\tself::$mce_settings[$editor_id] = $mceInit;\n\t\t} // end if self::$this_tinymce\n\t}\n\n\t/**\n\t *\n\t * @static\n\t * @param array $init\n\t * @return string\n\t */\n\tprivate static function _parse_init($init) {\n\t\t$options = '';\n\n\t\tforeach ( $init as $k => $v ) {\n\t\t\tif ( is_bool($v) ) {\n\t\t\t\t$val = $v ? 'true' : 'false';\n\t\t\t\t$options .= $k . ':' . $val . ',';\n\t\t\t\tcontinue;\n\t\t\t} elseif ( !empty($v) && is_string($v) && ( ('{' == $v{0} && '}' == $v{strlen($v) - 1}) || ('[' == $v{0} && ']' == $v{strlen($v) - 1}) || preg_match('/^\\(?function ?\\(/', $v) ) ) {\n\t\t\t\t$options .= $k . ':' . $v . ',';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t$options .= $k . ':\"' . $v . '\",';\n\t\t}\n\n\t\treturn '{' . trim( $options, ' ,' ) . '}';\n\t}\n\n\t/**\n\t *\n\t * @static\n\t */\n\tpublic static function enqueue_scripts() {\n\t\tif ( self::$has_tinymce )\n\t\t\twp_enqueue_script('editor');\n\n\t\tif ( self::$has_quicktags ) {\n\t\t\twp_enqueue_script( 'quicktags' );\n\t\t\twp_enqueue_style( 'buttons' );\n\t\t}\n\n\t\tif ( in_array('wplink', self::$plugins, true) || in_array('link', self::$qt_buttons, true) ) {\n\t\t\twp_enqueue_script('wplink');\n\t\t}\n\n\t\tif ( self::$old_dfw_compat ) {\n\t\t\twp_enqueue_script('wp-fullscreen-stub');\n\t\t}\n\n\t\tif ( self::$has_medialib ) {\n\t\t\tadd_thickbox();\n\t\t\twp_enqueue_script('media-upload');\n\t\t}\n\n\t\t/**\n\t\t * Fires when scripts and styles are enqueued for the editor.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param array $to_load An array containing boolean values whether TinyMCE\n\t\t *                       and Quicktags are being loaded.\n\t\t */\n\t\tdo_action( 'wp_enqueue_editor', array(\n\t\t\t'tinymce'   => self::$has_tinymce,\n\t\t\t'quicktags' => self::$has_quicktags,\n\t\t) );\n\t}\n\n\t/**\n\t * Translates the default TinyMCE strings and returns them as JSON encoded object ready to be loaded with tinymce.addI18n().\n\t * Can be used directly (_WP_Editors::wp_mce_translation()) by passing the same locale as set in the TinyMCE init object.\n\t *\n\t * @static\n\t * @param string $mce_locale The locale used for the editor.\n\t * @param bool $json_only optional Whether to include the JavaScript calls to tinymce.addI18n() and tinymce.ScriptLoader.markDone().\n\t * @return string Translation object, JSON encoded.\n\t */\n\tpublic static function wp_mce_translation( $mce_locale = '', $json_only = false ) {\n\n\t\t$mce_translation = array(\n\t\t\t// Default TinyMCE strings\n\t\t\t'New document' => __( 'New document' ),\n\t\t\t'Formats' => _x( 'Formats', 'TinyMCE' ),\n\n\t\t\t'Headings' => _x( 'Headings', 'TinyMCE' ),\n\t\t\t'Heading 1' => __( 'Heading 1' ),\n\t\t\t'Heading 2' => __( 'Heading 2' ),\n\t\t\t'Heading 3' => __( 'Heading 3' ),\n\t\t\t'Heading 4' => __( 'Heading 4' ),\n\t\t\t'Heading 5' => __( 'Heading 5' ),\n\t\t\t'Heading 6' => __( 'Heading 6' ),\n\n\t\t\t/* translators: block tags */\n\t\t\t'Blocks' => _x( 'Blocks', 'TinyMCE' ),\n\t\t\t'Paragraph' => __( 'Paragraph' ),\n\t\t\t'Blockquote' => __( 'Blockquote' ),\n\t\t\t'Div' => _x( 'Div', 'HTML tag' ),\n\t\t\t'Pre' => _x( 'Pre', 'HTML tag' ),\n\t\t\t'Preformatted' => _x( 'Preformatted', 'HTML tag' ),\n\t\t\t'Address' => _x( 'Address', 'HTML tag' ),\n\n\t\t\t'Inline' => _x( 'Inline', 'HTML elements' ),\n\t\t\t'Underline' => __( 'Underline' ),\n\t\t\t'Strikethrough' => __( 'Strikethrough' ),\n\t\t\t'Subscript' => __( 'Subscript' ),\n\t\t\t'Superscript' => __( 'Superscript' ),\n\t\t\t'Clear formatting' => __( 'Clear formatting' ),\n\t\t\t'Bold' => __( 'Bold' ),\n\t\t\t'Italic' => __( 'Italic' ),\n\t\t\t'Code' => _x( 'Code', 'editor button' ),\n\t\t\t'Source code' => __( 'Source code' ),\n\t\t\t'Font Family' => __( 'Font Family' ),\n\t\t\t'Font Sizes' => __( 'Font Sizes' ),\n\n\t\t\t'Align center' => __( 'Align center' ),\n\t\t\t'Align right' => __( 'Align right' ),\n\t\t\t'Align left' => __( 'Align left' ),\n\t\t\t'Justify' => __( 'Justify' ),\n\t\t\t'Increase indent' => __( 'Increase indent' ),\n\t\t\t'Decrease indent' => __( 'Decrease indent' ),\n\n\t\t\t'Cut' => __( 'Cut' ),\n\t\t\t'Copy' => __( 'Copy' ),\n\t\t\t'Paste' => __( 'Paste' ),\n\t\t\t'Select all' => __( 'Select all' ),\n\t\t\t'Undo' => __( 'Undo' ),\n\t\t\t'Redo' => __( 'Redo' ),\n\n\t\t\t'Ok' => __( 'OK' ),\n\t\t\t'Cancel' => __( 'Cancel' ),\n\t\t\t'Close' => __( 'Close' ),\n\t\t\t'Visual aids' => __( 'Visual aids' ),\n\n\t\t\t'Bullet list' => __( 'Bulleted list' ),\n\t\t\t'Numbered list' => __( 'Numbered list' ),\n\t\t\t'Square' => _x( 'Square', 'list style' ),\n\t\t\t'Default' => _x( 'Default', 'list style' ),\n\t\t\t'Circle' => _x( 'Circle', 'list style' ),\n\t\t\t'Disc' => _x('Disc', 'list style' ),\n\t\t\t'Lower Greek' => _x( 'Lower Greek', 'list style' ),\n\t\t\t'Lower Alpha' => _x( 'Lower Alpha', 'list style' ),\n\t\t\t'Upper Alpha' => _x( 'Upper Alpha', 'list style' ),\n\t\t\t'Upper Roman' => _x( 'Upper Roman', 'list style' ),\n\t\t\t'Lower Roman' => _x( 'Lower Roman', 'list style' ),\n\n\t\t\t// Anchor plugin\n\t\t\t'Name' => _x( 'Name', 'Name of link anchor (TinyMCE)' ),\n\t\t\t'Anchor' => _x( 'Anchor', 'Link anchor (TinyMCE)' ),\n\t\t\t'Anchors' => _x( 'Anchors', 'Link anchors (TinyMCE)' ),\n\n\t\t\t// Fullpage plugin\n\t\t\t'Document properties' => __( 'Document properties' ),\n\t\t\t'Robots' => __( 'Robots' ),\n\t\t\t'Title' => __( 'Title' ),\n\t\t\t'Keywords' => __( 'Keywords' ),\n\t\t\t'Encoding' => __( 'Encoding' ),\n\t\t\t'Description' => __( 'Description' ),\n\t\t\t'Author' => __( 'Author' ),\n\n\t\t\t// Media, image plugins\n\t\t\t'Insert/edit image' => __( 'Insert/edit image' ),\n\t\t\t'General' => __( 'General' ),\n\t\t\t'Advanced' => __( 'Advanced' ),\n\t\t\t'Source' => __( 'Source' ),\n\t\t\t'Border' => __( 'Border' ),\n\t\t\t'Constrain proportions' => __( 'Constrain proportions' ),\n\t\t\t'Vertical space' => __( 'Vertical space' ),\n\t\t\t'Image description' => __( 'Image description' ),\n\t\t\t'Style' => __( 'Style' ),\n\t\t\t'Dimensions' => __( 'Dimensions' ),\n\t\t\t'Insert image' => __( 'Insert image' ),\n\t\t\t'Insert date/time' => __( 'Insert date/time' ),\n\t\t\t'Insert/edit video' => __( 'Insert/edit video' ),\n\t\t\t'Poster' => __( 'Poster' ),\n\t\t\t'Alternative source' => __( 'Alternative source' ),\n\t\t\t'Paste your embed code below:' => __( 'Paste your embed code below:' ),\n\t\t\t'Insert video' => __( 'Insert video' ),\n\t\t\t'Embed' => __( 'Embed' ),\n\n\t\t\t// Each of these have a corresponding plugin\n\t\t\t'Special character' => __( 'Special character' ),\n\t\t\t'Right to left' => _x( 'Right to left', 'editor button' ),\n\t\t\t'Left to right' => _x( 'Left to right', 'editor button' ),\n\t\t\t'Emoticons' => __( 'Emoticons' ),\n\t\t\t'Nonbreaking space' => __( 'Nonbreaking space' ),\n\t\t\t'Page break' => __( 'Page break' ),\n\t\t\t'Paste as text' => __( 'Paste as text' ),\n\t\t\t'Preview' => __( 'Preview' ),\n\t\t\t'Print' => __( 'Print' ),\n\t\t\t'Save' => __( 'Save' ),\n\t\t\t'Fullscreen' => __( 'Fullscreen' ),\n\t\t\t'Horizontal line' => __( 'Horizontal line' ),\n\t\t\t'Horizontal space' => __( 'Horizontal space' ),\n\t\t\t'Restore last draft' => __( 'Restore last draft' ),\n\t\t\t'Insert/edit link' => __( 'Insert/edit link' ),\n\t\t\t'Remove link' => __( 'Remove link' ),\n\n\t\t\t'Color' => __( 'Color' ),\n\t\t\t'Custom color' => __( 'Custom color' ),\n\t\t\t'Custom...' => _x( 'Custom...', 'label for custom color' ), // no ellipsis\n\t\t\t'No color' => __( 'No color' ),\n\n\t\t\t// Spelling, search/replace plugins\n\t\t\t'Could not find the specified string.' => __( 'Could not find the specified string.' ),\n\t\t\t'Replace' => _x( 'Replace', 'find/replace' ),\n\t\t\t'Next' => _x( 'Next', 'find/replace' ),\n\t\t\t/* translators: previous */\n\t\t\t'Prev' => _x( 'Prev', 'find/replace' ),\n\t\t\t'Whole words' => _x( 'Whole words', 'find/replace' ),\n\t\t\t'Find and replace' => __( 'Find and replace' ),\n\t\t\t'Replace with' => _x('Replace with', 'find/replace' ),\n\t\t\t'Find' => _x( 'Find', 'find/replace' ),\n\t\t\t'Replace all' => _x( 'Replace all', 'find/replace' ),\n\t\t\t'Match case' => __( 'Match case' ),\n\t\t\t'Spellcheck' => __( 'Check Spelling' ),\n\t\t\t'Finish' => _x( 'Finish', 'spellcheck' ),\n\t\t\t'Ignore all' => _x( 'Ignore all', 'spellcheck' ),\n\t\t\t'Ignore' => _x( 'Ignore', 'spellcheck' ),\n\t\t\t'Add to Dictionary' => __( 'Add to Dictionary' ),\n\n\t\t\t// TinyMCE tables\n\t\t\t'Insert table' => __( 'Insert table' ),\n\t\t\t'Delete table' => __( 'Delete table' ),\n\t\t\t'Table properties' => __( 'Table properties' ),\n\t\t\t'Row properties' => __( 'Table row properties' ),\n\t\t\t'Cell properties' => __( 'Table cell properties' ),\n\t\t\t'Border color' => __( 'Border color' ),\n\n\t\t\t'Row' => __( 'Row' ),\n\t\t\t'Rows' => __( 'Rows' ),\n\t\t\t'Column' => _x( 'Column', 'table column' ),\n\t\t\t'Cols' => _x( 'Cols', 'table columns' ),\n\t\t\t'Cell' => _x( 'Cell', 'table cell' ),\n\t\t\t'Header cell' => __( 'Header cell' ),\n\t\t\t'Header' => _x( 'Header', 'table header' ),\n\t\t\t'Body' => _x( 'Body', 'table body' ),\n\t\t\t'Footer' => _x( 'Footer', 'table footer' ),\n\n\t\t\t'Insert row before' => __( 'Insert row before' ),\n\t\t\t'Insert row after' => __( 'Insert row after' ),\n\t\t\t'Insert column before' => __( 'Insert column before' ),\n\t\t\t'Insert column after' => __( 'Insert column after' ),\n\t\t\t'Paste row before' => __( 'Paste table row before' ),\n\t\t\t'Paste row after' => __( 'Paste table row after' ),\n\t\t\t'Delete row' => __( 'Delete row' ),\n\t\t\t'Delete column' => __( 'Delete column' ),\n\t\t\t'Cut row' => __( 'Cut table row' ),\n\t\t\t'Copy row' => __( 'Copy table row' ),\n\t\t\t'Merge cells' => __( 'Merge table cells' ),\n\t\t\t'Split cell' => __( 'Split table cell' ),\n\n\t\t\t'Height' => __( 'Height' ),\n\t\t\t'Width' => __( 'Width' ),\n\t\t\t'Caption' => __( 'Caption' ),\n\t\t\t'Alignment' => __( 'Alignment' ),\n\t\t\t'H Align' => _x( 'H Align', 'horizontal table cell alignment' ),\n\t\t\t'Left' => __( 'Left' ),\n\t\t\t'Center' => __( 'Center' ),\n\t\t\t'Right' => __( 'Right' ),\n\t\t\t'None' => _x( 'None', 'table cell alignment attribute' ),\n\t\t\t'V Align' => _x( 'V Align', 'vertical table cell alignment' ),\n\t\t\t'Top' => __( 'Top' ),\n\t\t\t'Middle' => __( 'Middle' ),\n\t\t\t'Bottom' => __( 'Bottom' ),\n\n\t\t\t'Row group' => __( 'Row group' ),\n\t\t\t'Column group' => __( 'Column group' ),\n\t\t\t'Row type' => __( 'Row type' ),\n\t\t\t'Cell type' => __( 'Cell type' ),\n\t\t\t'Cell padding' => __( 'Cell padding' ),\n\t\t\t'Cell spacing' => __( 'Cell spacing' ),\n\t\t\t'Scope' => _x( 'Scope', 'table cell scope attribute' ),\n\n\t\t\t'Insert template' => _x( 'Insert template', 'TinyMCE' ),\n\t\t\t'Templates' => _x( 'Templates', 'TinyMCE' ),\n\n\t\t\t'Background color' => __( 'Background color' ),\n\t\t\t'Text color' => __( 'Text color' ),\n\t\t\t'Show blocks' => _x( 'Show blocks', 'editor button' ),\n\t\t\t'Show invisible characters' => __( 'Show invisible characters' ),\n\n\t\t\t/* translators: word count */\n\t\t\t'Words: {0}' => sprintf( __( 'Words: %s' ), '{0}' ),\n\t\t\t'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.' => __( 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.' ) . \"\\n\\n\" . __( 'If you&#8217;re looking to paste rich content from Microsoft Word, try turning this option off. The editor will clean up text pasted from Word automatically.' ),\n\t\t\t'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help' => __( 'Rich Text Area. Press Alt-Shift-H for help' ),\n\t\t\t'You have unsaved changes are you sure you want to navigate away?' => __( 'The changes you made will be lost if you navigate away from this page.' ),\n\t\t\t'Your browser doesn\\'t support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.' => __( 'Your browser does not support direct access to the clipboard. Please use keyboard shortcuts or your browser&#8217;s edit menu instead.' ),\n\n\t\t\t// TinyMCE menus\n\t\t\t'Insert' => _x( 'Insert', 'TinyMCE menu' ),\n\t\t\t'File' => _x( 'File', 'TinyMCE menu' ),\n\t\t\t'Edit' => _x( 'Edit', 'TinyMCE menu' ),\n\t\t\t'Tools' => _x( 'Tools', 'TinyMCE menu' ),\n\t\t\t'View' => _x( 'View', 'TinyMCE menu' ),\n\t\t\t'Table' => _x( 'Table', 'TinyMCE menu' ),\n\t\t\t'Format' => _x( 'Format', 'TinyMCE menu' ),\n\n\t\t\t// WordPress strings\n\t\t\t'Toolbar Toggle' => __( 'Toolbar Toggle' ),\n\t\t\t'Insert Read More tag' => __( 'Insert Read More tag' ),\n\t\t\t'Insert Page Break tag' => __( 'Insert Page Break tag' ),\n\t\t\t'Read more...' => __( 'Read more...' ), // Title on the placeholder inside the editor (no ellipsis)\n\t\t\t'Distraction-free writing mode' => __( 'Distraction-free writing mode' ),\n\t\t\t'No alignment' => __( 'No alignment' ), // Tooltip for the 'alignnone' button in the image toolbar\n\t\t\t'Remove' => __( 'Remove' ), // Tooltip for the 'remove' button in the image toolbar\n\t\t\t'Edit ' => __( 'Edit' ), // Tooltip for the 'edit' button in the image toolbar\n\n\t\t\t// Shortcuts help modal\n\t\t\t'Keyboard Shortcuts' => __( 'Keyboard Shortcuts' ),\n\t\t\t'Default shortcuts,' => __( 'Default shortcuts,' ),\n\t\t\t'Additional shortcuts,' => __( 'Additional shortcuts,' ),\n\t\t\t'Focus shortcuts:' => __( 'Focus shortcuts:' ),\n\t\t\t'Inline toolbar (when an image, link or preview is selected)' => __( 'Inline toolbar (when an image, link or preview is selected)' ),\n\t\t\t'Editor menu (when enabled)' => __( 'Editor menu (when enabled)' ),\n\t\t\t'Editor toolbar' => __( 'Editor toolbar' ),\n\t\t\t'Elements path' => __( 'Elements path' ),\n\t\t\t'Ctrl + Alt + letter:' => __( 'Ctrl + Alt + letter:' ),\n\t\t\t'Shift + Alt + letter:' => __( 'Shift + Alt + letter:' ),\n\t\t\t'Cmd + letter:' => __( 'Cmd + letter:' ),\n\t\t\t'Ctrl + letter:' => __( 'Ctrl + letter:' ),\n\t\t\t'Letter' => __( 'Letter' ),\n\t\t\t'Action' => __( 'Action' ),\n\t\t\t'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' =>\n\t\t\t\t__( 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' ),\n\t\t\t'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' =>\n\t\t\t\t__( 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' ),\n\t\t\t'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' =>\n\t\t\t\t__( 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' ),\n\t\t);\n\n\t\t/**\n\t\t * Link plugin (not included):\n\t\t *\tInsert link\n\t\t *\tTarget\n\t\t *\tNew window\n\t\t *\tText to display\n\t\t *\tThe URL you entered seems to be an email address. Do you want to add the required mailto: prefix?\n\t\t *\tThe URL you entered seems to be an external link. Do you want to add the required http:\\/\\/ prefix?\n\t\t *\tUrl\n\t\t */\n\n\t\tif ( ! $mce_locale ) {\n\t\t\t$mce_locale = self::$mce_locale;\n\t\t}\n\n\t\t/**\n\t\t * Filter translated strings prepared for TinyMCE.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param array  $mce_translation Key/value pairs of strings.\n\t\t * @param string $mce_locale      Locale.\n\t\t */\n\t\t$mce_translation = apply_filters( 'wp_mce_translation', $mce_translation, $mce_locale );\n\n\t\tforeach ( $mce_translation as $key => $value ) {\n\t\t\t// Remove strings that are not translated.\n\t\t\tif ( $key === $value ) {\n\t\t\t\tunset( $mce_translation[$key] );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( false !== strpos( $value, '&' ) ) {\n\t\t\t\t$mce_translation[$key] = html_entity_decode( $value, ENT_QUOTES, 'UTF-8' );\n\t\t\t}\n\t\t}\n\n\t\t// Set direction\n\t\tif ( is_rtl() ) {\n\t\t\t$mce_translation['_dir'] = 'rtl';\n\t\t}\n\n\t\tif ( $json_only ) {\n\t\t\treturn wp_json_encode( $mce_translation );\n\t\t}\n\n\t\t$baseurl = self::$baseurl ? self::$baseurl : includes_url( 'js/tinymce' );\n\n\t\treturn \"tinymce.addI18n( '$mce_locale', \" . wp_json_encode( $mce_translation ) . \");\\n\" .\n\t\t\t\"tinymce.ScriptLoader.markDone( '$baseurl/langs/$mce_locale.js' );\\n\";\n\t}\n\n\t/**\n\t *\n\t * @static\n\t * @global string $wp_version\n\t * @global string $tinymce_version\n\t * @global bool   $concatenate_scripts\n\t * @global bool   $compress_scripts\n\t */\n\tpublic static function editor_js() {\n\t\tglobal $wp_version, $tinymce_version, $concatenate_scripts, $compress_scripts;\n\n\t\t/**\n\t\t * Filter \"tiny_mce_version\" is deprecated\n\t\t *\n\t\t * The tiny_mce_version filter is not needed since external plugins are loaded directly by TinyMCE.\n\t\t * These plugins can be refreshed by appending query string to the URL passed to \"mce_external_plugins\" filter.\n\t\t * If the plugin has a popup dialog, a query string can be added to the button action that opens it (in the plugin's code).\n\t\t */\n\t\t$version = 'ver=' . $tinymce_version;\n\t\t$tmce_on = !empty(self::$mce_settings);\n\n\t\tif ( ! isset($concatenate_scripts) )\n\t\t\tscript_concat_settings();\n\n\t\t$compressed = $compress_scripts && $concatenate_scripts && isset($_SERVER['HTTP_ACCEPT_ENCODING'])\n\t\t\t&& false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');\n\n\t\t$mceInit = $qtInit = '';\n\t\tif ( $tmce_on ) {\n\t\t\tforeach ( self::$mce_settings as $editor_id => $init ) {\n\t\t\t\t$options = self::_parse_init( $init );\n\t\t\t\t$mceInit .= \"'$editor_id':{$options},\";\n\t\t\t}\n\t\t\t$mceInit = '{' . trim($mceInit, ',') . '}';\n\t\t} else {\n\t\t\t$mceInit = '{}';\n\t\t}\n\n\t\tif ( !empty(self::$qt_settings) ) {\n\t\t\tforeach ( self::$qt_settings as $editor_id => $init ) {\n\t\t\t\t$options = self::_parse_init( $init );\n\t\t\t\t$qtInit .= \"'$editor_id':{$options},\";\n\t\t\t}\n\t\t\t$qtInit = '{' . trim($qtInit, ',') . '}';\n\t\t} else {\n\t\t\t$qtInit = '{}';\n\t\t}\n\n\t\t$ref = array(\n\t\t\t'plugins' => implode( ',', self::$plugins ),\n\t\t\t'theme' => 'modern',\n\t\t\t'language' => self::$mce_locale\n\t\t);\n\n\t\t$suffix = SCRIPT_DEBUG ? '' : '.min';\n\n\t\t/**\n\t\t * Fires immediately before the TinyMCE settings are printed.\n\t\t *\n\t\t * @since 3.2.0\n\t\t *\n\t\t * @param array $mce_settings TinyMCE settings array.\n\t\t */\n\t\tdo_action( 'before_wp_tiny_mce', self::$mce_settings );\n\t\t?>\n\n\t\t<script type=\"text/javascript\">\n\t\ttinyMCEPreInit = {\n\t\t\tbaseURL: \"<?php echo self::$baseurl; ?>\",\n\t\t\tsuffix: \"<?php echo $suffix; ?>\",\n\t\t\t<?php\n\n\t\t\tif ( self::$drag_drop_upload ) {\n\t\t\t\techo 'dragDropUpload: true,';\n\t\t\t}\n\n\t\t\t?>\n\t\t\tmceInit: <?php echo $mceInit; ?>,\n\t\t\tqtInit: <?php echo $qtInit; ?>,\n\t\t\tref: <?php echo self::_parse_init( $ref ); ?>,\n\t\t\tload_ext: function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');}\n\t\t};\n\t\t</script>\n\t\t<?php\n\n\t\t$baseurl = self::$baseurl;\n\t\t// Load tinymce.js when running from /src, else load wp-tinymce.js.gz (production) or tinymce.min.js (SCRIPT_DEBUG)\n\t\t$mce_suffix = false !== strpos( $wp_version, '-src' ) ? '' : '.min';\n\n\t\tif ( $tmce_on ) {\n\t\t\tif ( $compressed ) {\n\t\t\t\techo \"<script type='text/javascript' src='{$baseurl}/wp-tinymce.php?c=1&amp;$version'></script>\\n\";\n\t\t\t} else {\n\t\t\t\techo \"<script type='text/javascript' src='{$baseurl}/tinymce{$mce_suffix}.js?$version'></script>\\n\";\n\t\t\t\techo \"<script type='text/javascript' src='{$baseurl}/plugins/compat3x/plugin{$suffix}.js?$version'></script>\\n\";\n\t\t\t}\n\n\t\t\techo \"<script type='text/javascript'>\\n\" . self::wp_mce_translation() . \"</script>\\n\";\n\n\t\t\tif ( self::$ext_plugins ) {\n\t\t\t\t// Load the old-format English strings to prevent unsightly labels in old style popups\n\t\t\t\techo \"<script type='text/javascript' src='{$baseurl}/langs/wp-langs-en.js?$version'></script>\\n\";\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Fires after tinymce.js is loaded, but before any TinyMCE editor\n\t\t * instances are created.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param array $mce_settings TinyMCE settings array.\n\t\t */\n\t\tdo_action( 'wp_tiny_mce_init', self::$mce_settings );\n\n\t\t?>\n\t\t<script type=\"text/javascript\">\n\t\t<?php\n\n\t\tif ( self::$ext_plugins )\n\t\t\techo self::$ext_plugins . \"\\n\";\n\n\t\tif ( ! is_admin() )\n\t\t\techo 'var ajaxurl = \"' . admin_url( 'admin-ajax.php', 'relative' ) . '\";';\n\n\t\t?>\n\n\t\t( function() {\n\t\t\tvar init, id, $wrap;\n\n\t\t\tif ( typeof tinymce !== 'undefined' ) {\n\t\t\t\tfor ( id in tinyMCEPreInit.mceInit ) {\n\t\t\t\t\tinit = tinyMCEPreInit.mceInit[id];\n\t\t\t\t\t$wrap = tinymce.$( '#wp-' + id + '-wrap' );\n\n\t\t\t\t\tif ( ( $wrap.hasClass( 'tmce-active' ) || ! tinyMCEPreInit.qtInit.hasOwnProperty( id ) ) && ! init.wp_skip_init ) {\n\t\t\t\t\t\ttinymce.init( init );\n\n\t\t\t\t\t\tif ( ! window.wpActiveEditor ) {\n\t\t\t\t\t\t\twindow.wpActiveEditor = id;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( typeof quicktags !== 'undefined' ) {\n\t\t\t\tfor ( id in tinyMCEPreInit.qtInit ) {\n\t\t\t\t\tquicktags( tinyMCEPreInit.qtInit[id] );\n\n\t\t\t\t\tif ( ! window.wpActiveEditor ) {\n\t\t\t\t\t\twindow.wpActiveEditor = id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}());\n\t\t</script>\n\t\t<?php\n\n\t\tif ( in_array( 'wplink', self::$plugins, true ) || in_array( 'link', self::$qt_buttons, true ) )\n\t\t\tself::wp_link_dialog();\n\n\t\t/**\n\t\t * Fires after any core TinyMCE editor instances are created.\n\t\t *\n\t\t * @since 3.2.0\n\t\t *\n\t\t * @param array $mce_settings TinyMCE settings array.\n\t\t */\n\t\tdo_action( 'after_wp_tiny_mce', self::$mce_settings );\n\t}\n\n\t/**\n\t *\n\t * @static\n\t * @global int $content_width\n\t */\n\tpublic static function wp_fullscreen_html() {\n\t\t_deprecated_function( __FUNCTION__, '4.3' );\n\t}\n\n\t/**\n\t * Performs post queries for internal linking.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @static\n\t * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments.\n\t * @return false|array Results.\n\t */\n\tpublic static function wp_link_query( $args = array() ) {\n\t\t$pts = get_post_types( array( 'public' => true ), 'objects' );\n\t\t$pt_names = array_keys( $pts );\n\n\t\t$query = array(\n\t\t\t'post_type' => $pt_names,\n\t\t\t'suppress_filters' => true,\n\t\t\t'update_post_term_cache' => false,\n\t\t\t'update_post_meta_cache' => false,\n\t\t\t'post_status' => 'publish',\n\t\t\t'posts_per_page' => 20,\n\t\t);\n\n\t\t$args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1;\n\n\t\tif ( isset( $args['s'] ) )\n\t\t\t$query['s'] = $args['s'];\n\n\t\t$query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0;\n\n\t\t/**\n\t\t * Filter the link query arguments.\n\t\t *\n\t\t * Allows modification of the link query arguments before querying.\n\t\t *\n\t\t * @see WP_Query for a full list of arguments\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array $query An array of WP_Query arguments.\n\t\t */\n\t\t$query = apply_filters( 'wp_link_query_args', $query );\n\n\t\t// Do main query.\n\t\t$get_posts = new WP_Query;\n\t\t$posts = $get_posts->query( $query );\n\t\t// Check if any posts were found.\n\t\tif ( ! $get_posts->post_count )\n\t\t\treturn false;\n\n\t\t// Build results.\n\t\t$results = array();\n\t\tforeach ( $posts as $post ) {\n\t\t\tif ( 'post' == $post->post_type )\n\t\t\t\t$info = mysql2date( __( 'Y/m/d' ), $post->post_date );\n\t\t\telse\n\t\t\t\t$info = $pts[ $post->post_type ]->labels->singular_name;\n\n\t\t\t$results[] = array(\n\t\t\t\t'ID' => $post->ID,\n\t\t\t\t'title' => trim( esc_html( strip_tags( get_the_title( $post ) ) ) ),\n\t\t\t\t'permalink' => get_permalink( $post->ID ),\n\t\t\t\t'info' => $info,\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Filter the link query results.\n\t\t *\n\t\t * Allows modification of the returned link query results.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @see 'wp_link_query_args' filter\n\t\t *\n\t\t * @param array $results {\n\t\t *     An associative array of query results.\n\t\t *\n\t\t *     @type array {\n\t\t *         @type int    $ID        Post ID.\n\t\t *         @type string $title     The trimmed, escaped post title.\n\t\t *         @type string $permalink Post permalink.\n\t\t *         @type string $info      A 'Y/m/d'-formatted date for 'post' post type,\n\t\t *                                 the 'singular_name' post type label otherwise.\n\t\t *     }\n\t\t * }\n\t\t * @param array $query  An array of WP_Query arguments.\n\t\t */\n\t\treturn apply_filters( 'wp_link_query', $results, $query );\n\t}\n\n\t/**\n\t * Dialog for internal linking.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @static\n\t */\n\tpublic static function wp_link_dialog() {\n\t\t$search_panel_visible = '1' == get_user_setting( 'wplink', '0' ) ? ' search-panel-visible' : '';\n\n\t\t// display: none is required here, see #WP27605\n\t\t?>\n\t\t<div id=\"wp-link-backdrop\" style=\"display: none\"></div>\n\t\t<div id=\"wp-link-wrap\" class=\"wp-core-ui<?php echo $search_panel_visible; ?>\" style=\"display: none\">\n\t\t<form id=\"wp-link\" tabindex=\"-1\">\n\t\t<?php wp_nonce_field( 'internal-linking', '_ajax_linking_nonce', false ); ?>\n\t\t<div id=\"link-modal-title\">\n\t\t\t<?php _e( 'Insert/edit link' ) ?>\n\t\t\t<button type=\"button\" id=\"wp-link-close\"><span class=\"screen-reader-text\"><?php _e( 'Close' ); ?></span></button>\n\t \t</div>\n\t\t<div id=\"link-selector\">\n\t\t\t<div id=\"link-options\">\n\t\t\t\t<p class=\"howto\"><?php _e( 'Enter the destination URL' ); ?></p>\n\t\t\t\t<div>\n\t\t\t\t\t<label><span><?php _e( 'URL' ); ?></span><input id=\"wp-link-url\" type=\"text\" /></label>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"wp-link-text-field\">\n\t\t\t\t\t<label><span><?php _e( 'Link Text' ); ?></span><input id=\"wp-link-text\" type=\"text\" /></label>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"link-target\">\n\t\t\t\t\t<label><span>&nbsp;</span><input type=\"checkbox\" id=\"wp-link-target\" /> <?php _e( 'Open link in a new tab' ); ?></label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<p class=\"howto\"><a href=\"#\" id=\"wp-link-search-toggle\"><?php _e( 'Or link to existing content' ); ?></a></p>\n\t\t\t<div id=\"search-panel\">\n\t\t\t\t<div class=\"link-search-wrapper\">\n\t\t\t\t\t<label>\n\t\t\t\t\t\t<span class=\"search-label\"><?php _e( 'Search' ); ?></span>\n\t\t\t\t\t\t<input type=\"search\" id=\"wp-link-search\" class=\"link-search-field\" autocomplete=\"off\" />\n\t\t\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t\t<div id=\"search-results\" class=\"query-results\" tabindex=\"0\">\n\t\t\t\t\t<ul></ul>\n\t\t\t\t\t<div class=\"river-waiting\">\n\t\t\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div id=\"most-recent-results\" class=\"query-results\" tabindex=\"0\">\n\t\t\t\t\t<div class=\"query-notice\" id=\"query-notice-message\">\n\t\t\t\t\t\t<em class=\"query-notice-default\"><?php _e( 'No search term specified. Showing recent items.' ); ?></em>\n\t\t\t\t\t\t<em class=\"query-notice-hint screen-reader-text\"><?php _e( 'Search or use up and down arrow keys to select an item.' ); ?></em>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ul></ul>\n\t\t\t\t\t<div class=\"river-waiting\">\n\t\t\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"submitbox\">\n\t\t\t<div id=\"wp-link-cancel\">\n\t\t\t\t<a class=\"submitdelete deletion\" href=\"#\"><?php _e( 'Cancel' ); ?></a>\n\t\t\t</div>\n\t\t\t<div id=\"wp-link-update\">\n\t\t\t\t<input type=\"submit\" value=\"<?php esc_attr_e( 'Add Link' ); ?>\" class=\"button button-primary\" id=\"wp-link-submit\" name=\"wp-link-submit\">\n\t\t\t</div>\n\t\t</div>\n\t\t</form>\n\t\t</div>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-embed.php",
    "content": "<?php\n/**\n * API for easily embedding rich media such as videos and images into content.\n *\n * @package WordPress\n * @subpackage Embed\n * @since 2.9.0\n */\nclass WP_Embed {\n\tpublic $handlers = array();\n\tpublic $post_ID;\n\tpublic $usecache = true;\n\tpublic $linkifunknown = true;\n\tpublic $last_attr = array();\n\tpublic $last_url = '';\n\n\t/**\n\t * When an URL cannot be embedded, return false instead of returning a link\n\t * or the URL. Bypasses the 'embed_maybe_make_link' filter.\n\t */\n\tpublic $return_false_on_fail = false;\n\n\t/**\n\t * Constructor\n\t */\n\tpublic function __construct() {\n\t\t// Hack to get the [embed] shortcode to run before wpautop()\n\t\tadd_filter( 'the_content', array( $this, 'run_shortcode' ), 8 );\n\n\t\t// Shortcode placeholder for strip_shortcodes()\n\t\tadd_shortcode( 'embed', '__return_false' );\n\n\t\t// Attempts to embed all URLs in a post\n\t\tadd_filter( 'the_content', array( $this, 'autoembed' ), 8 );\n\n\t\t// After a post is saved, cache oEmbed items via AJAX\n\t\tadd_action( 'edit_form_advanced', array( $this, 'maybe_run_ajax_cache' ) );\n\t\tadd_action( 'edit_page_form', array( $this, 'maybe_run_ajax_cache' ) );\n\t}\n\n\t/**\n\t * Process the [embed] shortcode.\n\t *\n\t * Since the [embed] shortcode needs to be run earlier than other shortcodes,\n\t * this function removes all existing shortcodes, registers the [embed] shortcode,\n\t * calls {@link do_shortcode()}, and then re-registers the old shortcodes.\n\t *\n\t * @global array $shortcode_tags\n\t *\n\t * @param string $content Content to parse\n\t * @return string Content with shortcode parsed\n\t */\n\tpublic function run_shortcode( $content ) {\n\t\tglobal $shortcode_tags;\n\n\t\t// Back up current registered shortcodes and clear them all out\n\t\t$orig_shortcode_tags = $shortcode_tags;\n\t\tremove_all_shortcodes();\n\n\t\tadd_shortcode( 'embed', array( $this, 'shortcode' ) );\n\n\t\t// Do the shortcode (only the [embed] one is registered)\n\t\t$content = do_shortcode( $content, true );\n\n\t\t// Put the original shortcodes back\n\t\t$shortcode_tags = $orig_shortcode_tags;\n\n\t\treturn $content;\n\t}\n\n\t/**\n\t * If a post/page was saved, then output JavaScript to make\n\t * an AJAX request that will call WP_Embed::cache_oembed().\n\t */\n\tpublic function maybe_run_ajax_cache() {\n\t\t$post = get_post();\n\n\t\tif ( ! $post || empty( $_GET['message'] ) )\n\t\t\treturn;\n\n?>\n<script type=\"text/javascript\">\n\tjQuery(document).ready(function($){\n\t\t$.get(\"<?php echo admin_url( 'admin-ajax.php?action=oembed-cache&post=' . $post->ID, 'relative' ); ?>\");\n\t});\n</script>\n<?php\n\t}\n\n\t/**\n\t * Register an embed handler. Do not use this function directly, use {@link wp_embed_register_handler()} instead.\n\t * This function should probably also only be used for sites that do not support oEmbed.\n\t *\n\t * @param string $id An internal ID/name for the handler. Needs to be unique.\n\t * @param string $regex The regex that will be used to see if this handler should be used for a URL.\n\t * @param callable $callback The callback function that will be called if the regex is matched.\n\t * @param int $priority Optional. Used to specify the order in which the registered handlers will be tested (default: 10). Lower numbers correspond with earlier testing, and handlers with the same priority are tested in the order in which they were added to the action.\n\t */\n\tpublic function register_handler( $id, $regex, $callback, $priority = 10 ) {\n\t\t$this->handlers[$priority][$id] = array(\n\t\t\t'regex'    => $regex,\n\t\t\t'callback' => $callback,\n\t\t);\n\t}\n\n\t/**\n\t * Unregister a previously registered embed handler. Do not use this function directly, use {@link wp_embed_unregister_handler()} instead.\n\t *\n\t * @param string $id The handler ID that should be removed.\n\t * @param int $priority Optional. The priority of the handler to be removed (default: 10).\n\t */\n\tpublic function unregister_handler( $id, $priority = 10 ) {\n\t\tunset( $this->handlers[ $priority ][ $id ] );\n\t}\n\n\t/**\n\t * The {@link do_shortcode()} callback function.\n\t *\n\t * Attempts to convert a URL into embed HTML. Starts by checking the URL against the regex of the registered embed handlers.\n\t * If none of the regex matches and it's enabled, then the URL will be given to the {@link WP_oEmbed} class.\n\t *\n\t * @param array $attr {\n\t *     Shortcode attributes. Optional.\n\t *\n\t *     @type int $width  Width of the embed in pixels.\n\t *     @type int $height Height of the embed in pixels.\n\t * }\n\t * @param string $url The URL attempting to be embedded.\n\t * @return string|false The embed HTML on success, otherwise the original URL.\n\t *                      `->maybe_make_link()` can return false on failure.\n\t */\n\tpublic function shortcode( $attr, $url = '' ) {\n\t\t$post = get_post();\n\n\t\tif ( empty( $url ) && ! empty( $attr['src'] ) ) {\n\t\t\t$url = $attr['src'];\n\t\t}\n\n\t\t$this->last_url = $url;\n\n\t\tif ( empty( $url ) ) {\n\t\t\t$this->last_attr = $attr;\n\t\t\treturn '';\n\t\t}\n\n\t\t$rawattr = $attr;\n\t\t$attr = wp_parse_args( $attr, wp_embed_defaults( $url ) );\n\n\t\t$this->last_attr = $attr;\n\n\t\t// kses converts & into &amp; and we need to undo this\n\t\t// See https://core.trac.wordpress.org/ticket/11311\n\t\t$url = str_replace( '&amp;', '&', $url );\n\n\t\t// Look for known internal handlers\n\t\tksort( $this->handlers );\n\t\tforeach ( $this->handlers as $priority => $handlers ) {\n\t\t\tforeach ( $handlers as $id => $handler ) {\n\t\t\t\tif ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) {\n\t\t\t\t\tif ( false !== $return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr ) )\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Filter the returned embed handler.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @since 2.9.0\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @see WP_Embed::shortcode()\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @param mixed  $return The shortcode callback function to call.\n\t\t\t\t\t\t * @param string $url    The attempted embed URL.\n\t\t\t\t\t\t * @param array  $attr   An array of shortcode attributes.\n\t\t\t\t\t\t */\n\t\t\t\t\t\treturn apply_filters( 'embed_handler_html', $return, $url, $attr );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$post_ID = ( ! empty( $post->ID ) ) ? $post->ID : null;\n\t\tif ( ! empty( $this->post_ID ) ) // Potentially set by WP_Embed::cache_oembed()\n\t\t\t$post_ID = $this->post_ID;\n\n\t\t// Unknown URL format. Let oEmbed have a go.\n\t\tif ( $post_ID ) {\n\n\t\t\t// Check for a cached result (stored in the post meta)\n\t\t\t$key_suffix = md5( $url . serialize( $attr ) );\n\t\t\t$cachekey = '_oembed_' . $key_suffix;\n\t\t\t$cachekey_time = '_oembed_time_' . $key_suffix;\n\n\t\t\t/**\n\t\t\t * Filter the oEmbed TTL value (time to live).\n\t\t\t *\n\t\t\t * @since 4.0.0\n\t\t\t *\n\t\t\t * @param int    $time    Time to live (in seconds).\n\t\t\t * @param string $url     The attempted embed URL.\n\t\t\t * @param array  $attr    An array of shortcode attributes.\n\t\t\t * @param int    $post_ID Post ID.\n\t\t\t */\n\t\t\t$ttl = apply_filters( 'oembed_ttl', DAY_IN_SECONDS, $url, $attr, $post_ID );\n\n\t\t\t$cache = get_post_meta( $post_ID, $cachekey, true );\n\t\t\t$cache_time = get_post_meta( $post_ID, $cachekey_time, true );\n\n\t\t\tif ( ! $cache_time ) {\n\t\t\t\t$cache_time = 0;\n\t\t\t}\n\n\t\t\t$cached_recently = ( time() - $cache_time ) < $ttl;\n\n\t\t\tif ( $this->usecache || $cached_recently ) {\n\t\t\t\t// Failures are cached. Serve one if we're using the cache.\n\t\t\t\tif ( '{{unknown}}' === $cache )\n\t\t\t\t\treturn $this->maybe_make_link( $url );\n\n\t\t\t\tif ( ! empty( $cache ) ) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the cached oEmbed HTML.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.9.0\n\t\t\t\t\t *\n\t\t\t\t\t * @see WP_Embed::shortcode()\n\t\t\t\t\t *\n\t\t\t\t\t * @param mixed  $cache   The cached HTML result, stored in post meta.\n\t\t\t\t\t * @param string $url     The attempted embed URL.\n\t\t\t\t\t * @param array  $attr    An array of shortcode attributes.\n\t\t\t\t\t * @param int    $post_ID Post ID.\n\t\t\t\t\t */\n\t\t\t\t\treturn apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter whether to inspect the given URL for discoverable link tags.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t * @since 4.4.0 The default value changed to true.\n\t\t\t *\n\t\t\t * @see WP_oEmbed::discover()\n\t\t\t *\n\t\t\t * @param bool $enable Whether to enable `<link>` tag discovery. Default true.\n\t\t\t */\n\t\t\t$attr['discover'] = ( apply_filters( 'embed_oembed_discover', true ) );\n\n\t\t\t// Use oEmbed to get the HTML\n\t\t\t$html = wp_oembed_get( $url, $attr );\n\n\t\t\t// Maybe cache the result\n\t\t\tif ( $html ) {\n\t\t\t\tupdate_post_meta( $post_ID, $cachekey, $html );\n\t\t\t\tupdate_post_meta( $post_ID, $cachekey_time, time() );\n\t\t\t} elseif ( ! $cache ) {\n\t\t\t\tupdate_post_meta( $post_ID, $cachekey, '{{unknown}}' );\n\t\t\t}\n\n\t\t\t// If there was a result, return it\n\t\t\tif ( $html ) {\n\t\t\t\t/** This filter is documented in wp-includes/class-wp-embed.php */\n\t\t\t\treturn apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID );\n\t\t\t}\n\t\t}\n\n\t\t// Still unknown\n\t\treturn $this->maybe_make_link( $url );\n\t}\n\n\t/**\n\t * Delete all oEmbed caches. Unused by core as of 4.0.0.\n\t *\n\t * @param int $post_ID Post ID to delete the caches for.\n\t */\n\tpublic function delete_oembed_caches( $post_ID ) {\n\t\t$post_metas = get_post_custom_keys( $post_ID );\n\t\tif ( empty($post_metas) )\n\t\t\treturn;\n\n\t\tforeach ( $post_metas as $post_meta_key ) {\n\t\t\tif ( '_oembed_' == substr( $post_meta_key, 0, 8 ) )\n\t\t\t\tdelete_post_meta( $post_ID, $post_meta_key );\n\t\t}\n\t}\n\n\t/**\n\t * Triggers a caching of all oEmbed results.\n\t *\n\t * @param int $post_ID Post ID to do the caching for.\n\t */\n\tpublic function cache_oembed( $post_ID ) {\n\t\t$post = get_post( $post_ID );\n\n\t\t$post_types = get_post_types( array( 'show_ui' => true ) );\n\t\t/**\n\t\t * Filter the array of post types to cache oEmbed results for.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param array $post_types Array of post types to cache oEmbed results for. Defaults to post types with `show_ui` set to true.\n\t\t */\n\t\tif ( empty( $post->ID ) || ! in_array( $post->post_type, apply_filters( 'embed_cache_oembed_types', $post_types ) ) ){\n\t\t\treturn;\n\t\t}\n\n\t\t// Trigger a caching\n\t\tif ( ! empty( $post->post_content ) ) {\n\t\t\t$this->post_ID = $post->ID;\n\t\t\t$this->usecache = false;\n\n\t\t\t$content = $this->run_shortcode( $post->post_content );\n\t\t\t$this->autoembed( $content );\n\n\t\t\t$this->usecache = true;\n\t\t}\n\t}\n\n\t/**\n\t * Passes any unlinked URLs that are on their own line to {@link WP_Embed::shortcode()} for potential embedding.\n\t *\n\t * @uses WP_Embed::autoembed_callback()\n\t *\n\t * @param string $content The content to be searched.\n\t * @return string Potentially modified $content.\n\t */\n\tpublic function autoembed( $content ) {\n\t\t// Replace line breaks from all HTML elements with placeholders.\n\t\t$content = wp_replace_in_html_tags( $content, array( \"\\n\" => '<!-- wp-line-break -->' ) );\n\n\t\t// Find URLs that are on their own line.\n\t\t$content = preg_replace_callback( '|^(\\s*)(https?://[^\\s\"]+)(\\s*)$|im', array( $this, 'autoembed_callback' ), $content );\n\n\t\t// Put the line breaks back.\n\t\treturn str_replace( '<!-- wp-line-break -->', \"\\n\", $content );\n\t}\n\n\t/**\n\t * Callback function for {@link WP_Embed::autoembed()}.\n\t *\n\t * @param array $match A regex match array.\n\t * @return string The embed HTML on success, otherwise the original URL.\n\t */\n\tpublic function autoembed_callback( $match ) {\n\t\t$oldval = $this->linkifunknown;\n\t\t$this->linkifunknown = false;\n\t\t$return = $this->shortcode( array(), $match[2] );\n\t\t$this->linkifunknown = $oldval;\n\n\t\treturn $match[1] . $return . $match[3];\n\t}\n\n\t/**\n\t * Conditionally makes a hyperlink based on an internal class variable.\n\t *\n\t * @param string $url URL to potentially be linked.\n\t * @return false|string Linked URL or the original URL. False if 'return_false_on_fail' is true.\n\t */\n\tpublic function maybe_make_link( $url ) {\n\t\tif ( $this->return_false_on_fail ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$output = ( $this->linkifunknown ) ? '<a href=\"' . esc_url($url) . '\">' . esc_html($url) . '</a>' : $url;\n\n\t\t/**\n\t\t * Filter the returned, maybe-linked embed URL.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param string $output The linked or original URL.\n\t\t * @param string $url    The original URL.\n\t\t */\n\t\treturn apply_filters( 'embed_maybe_make_link', $output, $url );\n\t}\n}\n$GLOBALS['wp_embed'] = new WP_Embed();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-error.php",
    "content": "<?php\n/**\n * WordPress Error API.\n *\n * Contains the WP_Error class and the is_wp_error() function.\n *\n * @package WordPress\n */\n\n/**\n * WordPress Error class.\n *\n * Container for checking for WordPress errors and error messages. Return\n * WP_Error and use {@link is_wp_error()} to check if this class is returned.\n * Many core WordPress functions pass this class in the event of an error and\n * if not handled properly will result in code errors.\n *\n * @package WordPress\n * @since 2.1.0\n */\nclass WP_Error {\n\t/**\n\t * Stores the list of errors.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $errors = array();\n\n\t/**\n\t * Stores the list of data for error codes.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $error_data = array();\n\n\t/**\n\t * Initialize the error.\n\t *\n\t * If `$code` is empty, the other parameters will be ignored.\n\t * When `$code` is not empty, `$message` will be used even if\n\t * it is empty. The `$data` parameter will be used only if it\n\t * is not empty.\n\t *\n\t * Though the class is constructed with a single error code and\n\t * message, multiple codes can be added using the `add()` method.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string|int $code Error code\n\t * @param string $message Error message\n\t * @param mixed $data Optional. Error data.\n\t */\n\tpublic function __construct( $code = '', $message = '', $data = '' ) {\n\t\tif ( empty($code) )\n\t\t\treturn;\n\n\t\t$this->errors[$code][] = $message;\n\n\t\tif ( ! empty($data) )\n\t\t\t$this->error_data[$code] = $data;\n\t}\n\n\t/**\n\t * Retrieve all error codes.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @return array List of error codes, if available.\n\t */\n\tpublic function get_error_codes() {\n\t\tif ( empty($this->errors) )\n\t\t\treturn array();\n\n\t\treturn array_keys($this->errors);\n\t}\n\n\t/**\n\t * Retrieve first error code available.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @return string|int Empty string, if no error codes.\n\t */\n\tpublic function get_error_code() {\n\t\t$codes = $this->get_error_codes();\n\n\t\tif ( empty($codes) )\n\t\t\treturn '';\n\n\t\treturn $codes[0];\n\t}\n\n\t/**\n\t * Retrieve all error messages or error messages matching code.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string|int $code Optional. Retrieve messages matching code, if exists.\n\t * @return array Error strings on success, or empty array on failure (if using code parameter).\n\t */\n\tpublic function get_error_messages($code = '') {\n\t\t// Return all messages if no code specified.\n\t\tif ( empty($code) ) {\n\t\t\t$all_messages = array();\n\t\t\tforeach ( (array) $this->errors as $code => $messages )\n\t\t\t\t$all_messages = array_merge($all_messages, $messages);\n\n\t\t\treturn $all_messages;\n\t\t}\n\n\t\tif ( isset($this->errors[$code]) )\n\t\t\treturn $this->errors[$code];\n\t\telse\n\t\t\treturn array();\n\t}\n\n\t/**\n\t * Get single error message.\n\t *\n\t * This will get the first message available for the code. If no code is\n\t * given then the first code available will be used.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string|int $code Optional. Error code to retrieve message.\n\t * @return string\n\t */\n\tpublic function get_error_message($code = '') {\n\t\tif ( empty($code) )\n\t\t\t$code = $this->get_error_code();\n\t\t$messages = $this->get_error_messages($code);\n\t\tif ( empty($messages) )\n\t\t\treturn '';\n\t\treturn $messages[0];\n\t}\n\n\t/**\n\t * Retrieve error data for error code.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string|int $code Optional. Error code.\n\t * @return mixed Error data, if it exists.\n\t */\n\tpublic function get_error_data($code = '') {\n\t\tif ( empty($code) )\n\t\t\t$code = $this->get_error_code();\n\n\t\tif ( isset($this->error_data[$code]) )\n\t\t\treturn $this->error_data[$code];\n\t}\n\n\t/**\n\t * Add an error or append additional message to an existing error.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param string|int $code Error code.\n\t * @param string $message Error message.\n\t * @param mixed $data Optional. Error data.\n\t */\n\tpublic function add($code, $message, $data = '') {\n\t\t$this->errors[$code][] = $message;\n\t\tif ( ! empty($data) )\n\t\t\t$this->error_data[$code] = $data;\n\t}\n\n\t/**\n\t * Add data for error code.\n\t *\n\t * The error code can only contain one error data.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param mixed $data Error data.\n\t * @param string|int $code Error code.\n\t */\n\tpublic function add_data($data, $code = '') {\n\t\tif ( empty($code) )\n\t\t\t$code = $this->get_error_code();\n\n\t\t$this->error_data[$code] = $data;\n\t}\n\n\t/**\n\t * Removes the specified error.\n\t *\n\t * This function removes all error messages associated with the specified\n\t * error code, along with any error data for that code.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param string|int $code Error code.\n\t */\n\tpublic function remove( $code ) {\n\t\tunset( $this->errors[ $code ] );\n\t\tunset( $this->error_data[ $code ] );\n\t}\n}\n\n/**\n * Check whether variable is a WordPress Error.\n *\n * Returns true if $thing is an object of the WP_Error class.\n *\n * @since 2.1.0\n *\n * @param mixed $thing Check if unknown variable is a WP_Error object.\n * @return bool True, if WP_Error. False, if not WP_Error.\n */\nfunction is_wp_error( $thing ) {\n\treturn ( $thing instanceof WP_Error );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-http-cookie.php",
    "content": "<?php\n/**\n * HTTP API: WP_Http_Cookie class\n *\n * @package WordPress\n * @subpackage HTTP\n * @since 4.4.0\n */\n\n/**\n * Core class used to encapsulate a single cookie object for internal use.\n *\n * Returned cookies are represented using this class, and when cookies are set, if they are not\n * already a WP_Http_Cookie() object, then they are turned into one.\n *\n * @todo The WordPress convention is to use underscores instead of camelCase for function and method\n * names. Need to switch to use underscores instead for the methods.\n *\n * @since 2.8.0\n */\nclass WP_Http_Cookie {\n\n\t/**\n\t * Cookie name.\n\t *\n\t * @since 2.8.0\n\t * @var string\n\t */\n\tpublic $name;\n\n\t/**\n\t * Cookie value.\n\t *\n\t * @since 2.8.0\n\t * @var string\n\t */\n\tpublic $value;\n\n\t/**\n\t * When the cookie expires.\n\t *\n\t * @since 2.8.0\n\t * @var string\n\t */\n\tpublic $expires;\n\n\t/**\n\t * Cookie URL path.\n\t *\n\t * @since 2.8.0\n\t * @var string\n\t */\n\tpublic $path;\n\n\t/**\n\t * Cookie Domain.\n\t *\n\t * @since 2.8.0\n\t * @var string\n\t */\n\tpublic $domain;\n\n\t/**\n\t * Sets up this cookie object.\n\t *\n\t * The parameter $data should be either an associative array containing the indices names below\n\t * or a header string detailing it.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param string|array $data {\n\t *     Raw cookie data as header string or data array.\n\t *\n\t *     @type string     $name    Cookie name.\n\t *     @type mixed      $value   Value. Should NOT already be urlencoded.\n\t *     @type string|int $expires Optional. Unix timestamp or formatted date. Default null.\n\t *     @type string     $path    Optional. Path. Default '/'.\n\t *     @type string     $domain  Optional. Domain. Default host of parsed $requested_url.\n\t *     @type int        $port    Optional. Port. Default null.\n\t * }\n\t * @param string       $requested_url The URL which the cookie was set on, used for default $domain\n\t *                                    and $port values.\n\t */\n\tpublic function __construct( $data, $requested_url = '' ) {\n\t\tif ( $requested_url )\n\t\t\t$arrURL = @parse_url( $requested_url );\n\t\tif ( isset( $arrURL['host'] ) )\n\t\t\t$this->domain = $arrURL['host'];\n\t\t$this->path = isset( $arrURL['path'] ) ? $arrURL['path'] : '/';\n\t\tif (  '/' != substr( $this->path, -1 ) )\n\t\t\t$this->path = dirname( $this->path ) . '/';\n\n\t\tif ( is_string( $data ) ) {\n\t\t\t// Assume it's a header string direct from a previous request.\n\t\t\t$pairs = explode( ';', $data );\n\n\t\t\t// Special handling for first pair; name=value. Also be careful of \"=\" in value.\n\t\t\t$name  = trim( substr( $pairs[0], 0, strpos( $pairs[0], '=' ) ) );\n\t\t\t$value = substr( $pairs[0], strpos( $pairs[0], '=' ) + 1 );\n\t\t\t$this->name  = $name;\n\t\t\t$this->value = urldecode( $value );\n\n\t\t\t// Removes name=value from items.\n\t\t\tarray_shift( $pairs );\n\n\t\t\t// Set everything else as a property.\n\t\t\tforeach ( $pairs as $pair ) {\n\t\t\t\t$pair = rtrim($pair);\n\n\t\t\t\t// Handle the cookie ending in ; which results in a empty final pair.\n\t\t\t\tif ( empty($pair) )\n\t\t\t\t\tcontinue;\n\n\t\t\t\tlist( $key, $val ) = strpos( $pair, '=' ) ? explode( '=', $pair ) : array( $pair, '' );\n\t\t\t\t$key = strtolower( trim( $key ) );\n\t\t\t\tif ( 'expires' == $key )\n\t\t\t\t\t$val = strtotime( $val );\n\t\t\t\t$this->$key = $val;\n\t\t\t}\n\t\t} else {\n\t\t\tif ( !isset( $data['name'] ) )\n\t\t\t\treturn;\n\n\t\t\t// Set properties based directly on parameters.\n\t\t\tforeach ( array( 'name', 'value', 'path', 'domain', 'port' ) as $field ) {\n\t\t\t\tif ( isset( $data[ $field ] ) )\n\t\t\t\t\t$this->$field = $data[ $field ];\n\t\t\t}\n\n\t\t\tif ( isset( $data['expires'] ) )\n\t\t\t\t$this->expires = is_int( $data['expires'] ) ? $data['expires'] : strtotime( $data['expires'] );\n\t\t\telse\n\t\t\t\t$this->expires = null;\n\t\t}\n\t}\n\n\t/**\n\t * Confirms that it's OK to send this cookie to the URL checked against.\n\t *\n\t * Decision is based on RFC 2109/2965, so look there for details on validity.\n\t *\n\t * @access public\n\t * @since 2.8.0\n\t *\n\t * @param string $url URL you intend to send this cookie to\n\t * @return bool true if allowed, false otherwise.\n\t */\n\tpublic function test( $url ) {\n\t\tif ( is_null( $this->name ) )\n\t\t\treturn false;\n\n\t\t// Expires - if expired then nothing else matters.\n\t\tif ( isset( $this->expires ) && time() > $this->expires )\n\t\t\treturn false;\n\n\t\t// Get details on the URL we're thinking about sending to.\n\t\t$url = parse_url( $url );\n\t\t$url['port'] = isset( $url['port'] ) ? $url['port'] : ( 'https' == $url['scheme'] ? 443 : 80 );\n\t\t$url['path'] = isset( $url['path'] ) ? $url['path'] : '/';\n\n\t\t// Values to use for comparison against the URL.\n\t\t$path   = isset( $this->path )   ? $this->path   : '/';\n\t\t$port   = isset( $this->port )   ? $this->port   : null;\n\t\t$domain = isset( $this->domain ) ? strtolower( $this->domain ) : strtolower( $url['host'] );\n\t\tif ( false === stripos( $domain, '.' ) )\n\t\t\t$domain .= '.local';\n\n\t\t// Host - very basic check that the request URL ends with the domain restriction (minus leading dot).\n\t\t$domain = substr( $domain, 0, 1 ) == '.' ? substr( $domain, 1 ) : $domain;\n\t\tif ( substr( $url['host'], -strlen( $domain ) ) != $domain )\n\t\t\treturn false;\n\n\t\t// Port - supports \"port-lists\" in the format: \"80,8000,8080\".\n\t\tif ( !empty( $port ) && !in_array( $url['port'], explode( ',', $port) ) )\n\t\t\treturn false;\n\n\t\t// Path - request path must start with path restriction.\n\t\tif ( substr( $url['path'], 0, strlen( $path ) ) != $path )\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Convert cookie name and value back to header string.\n\t *\n\t * @access public\n\t * @since 2.8.0\n\t *\n\t * @return string Header encoded cookie name and value.\n\t */\n\tpublic function getHeaderValue() {\n\t\tif ( ! isset( $this->name ) || ! isset( $this->value ) )\n\t\t\treturn '';\n\n\t\t/**\n\t\t * Filter the header-encoded cookie value.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param string $value The cookie value.\n\t\t * @param string $name  The cookie name.\n\t\t */\n\t\treturn $this->name . '=' . apply_filters( 'wp_http_cookie_value', $this->value, $this->name );\n\t}\n\n\t/**\n\t * Retrieve cookie header for usage in the rest of the WordPress HTTP API.\n\t *\n\t * @access public\n\t * @since 2.8.0\n\t *\n\t * @return string\n\t */\n\tpublic function getFullHeader() {\n\t\treturn 'Cookie: ' . $this->getHeaderValue();\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-http-curl.php",
    "content": "<?php\n/**\n * HTTP API: WP_Http_Curl class\n *\n * @package WordPress\n * @subpackage HTTP\n * @since 4.4.0\n */\n\n/**\n * Core class used to integrate Curl as an HTTP transport.\n *\n * HTTP request method uses Curl extension to retrieve the url.\n *\n * Requires the Curl extension to be installed.\n *\n * @since 2.7.0\n */\nclass WP_Http_Curl {\n\n\t/**\n\t * Temporary header storage for during requests.\n\t *\n\t * @since 3.2.0\n\t * @access private\n\t * @var string\n\t */\n\tprivate $headers = '';\n\n\t/**\n\t * Temporary body storage for during requests.\n\t *\n\t * @since 3.6.0\n\t * @access private\n\t * @var string\n\t */\n\tprivate $body = '';\n\n\t/**\n\t * The maximum amount of data to receive from the remote server.\n\t *\n\t * @since 3.6.0\n\t * @access private\n\t * @var int\n\t */\n\tprivate $max_body_length = false;\n\n\t/**\n\t * The file resource used for streaming to file.\n\t *\n\t * @since 3.6.0\n\t * @access private\n\t * @var resource\n\t */\n\tprivate $stream_handle = false;\n\n\t/**\n\t * The total bytes written in the current request.\n\t *\n\t * @since 4.1.0\n\t * @access private\n\t * @var int\n\t */\n\tprivate $bytes_written_total = 0;\n\n\t/**\n\t * Send a HTTP request to a URI using cURL extension.\n\t *\n\t * @access public\n\t * @since 2.7.0\n\t *\n\t * @param string $url The request URL.\n\t * @param string|array $args Optional. Override the defaults.\n\t * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error\n\t */\n\tpublic function request($url, $args = array()) {\n\t\t$defaults = array(\n\t\t\t'method' => 'GET', 'timeout' => 5,\n\t\t\t'redirection' => 5, 'httpversion' => '1.0',\n\t\t\t'blocking' => true,\n\t\t\t'headers' => array(), 'body' => null, 'cookies' => array()\n\t\t);\n\n\t\t$r = wp_parse_args( $args, $defaults );\n\n\t\tif ( isset( $r['headers']['User-Agent'] ) ) {\n\t\t\t$r['user-agent'] = $r['headers']['User-Agent'];\n\t\t\tunset( $r['headers']['User-Agent'] );\n\t\t} elseif ( isset( $r['headers']['user-agent'] ) ) {\n\t\t\t$r['user-agent'] = $r['headers']['user-agent'];\n\t\t\tunset( $r['headers']['user-agent'] );\n\t\t}\n\n\t\t// Construct Cookie: header if any cookies are set.\n\t\tWP_Http::buildCookieHeader( $r );\n\n\t\t$handle = curl_init();\n\n\t\t// cURL offers really easy proxy support.\n\t\t$proxy = new WP_HTTP_Proxy();\n\n\t\tif ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) {\n\n\t\t\tcurl_setopt( $handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP );\n\t\t\tcurl_setopt( $handle, CURLOPT_PROXY, $proxy->host() );\n\t\t\tcurl_setopt( $handle, CURLOPT_PROXYPORT, $proxy->port() );\n\n\t\t\tif ( $proxy->use_authentication() ) {\n\t\t\t\tcurl_setopt( $handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY );\n\t\t\t\tcurl_setopt( $handle, CURLOPT_PROXYUSERPWD, $proxy->authentication() );\n\t\t\t}\n\t\t}\n\n\t\t$is_local = isset($r['local']) && $r['local'];\n\t\t$ssl_verify = isset($r['sslverify']) && $r['sslverify'];\n\t\tif ( $is_local ) {\n\t\t\t/** This filter is documented in wp-includes/class-wp-http-streams.php */\n\t\t\t$ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify );\n\t\t} elseif ( ! $is_local ) {\n\t\t\t/** This filter is documented in wp-includes/class-wp-http-streams.php */\n\t\t\t$ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify );\n\t\t}\n\n\t\t/*\n\t\t * CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since.\n\t\t * a value of 0 will allow an unlimited timeout.\n\t\t */\n\t\t$timeout = (int) ceil( $r['timeout'] );\n\t\tcurl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, $timeout );\n\t\tcurl_setopt( $handle, CURLOPT_TIMEOUT, $timeout );\n\n\t\tcurl_setopt( $handle, CURLOPT_URL, $url);\n\t\tcurl_setopt( $handle, CURLOPT_RETURNTRANSFER, true );\n\t\tcurl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, ( $ssl_verify === true ) ? 2 : false );\n\t\tcurl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify );\n\n\t\tif ( $ssl_verify ) {\n\t\t\tcurl_setopt( $handle, CURLOPT_CAINFO, $r['sslcertificates'] );\n\t\t}\n\n\t\tcurl_setopt( $handle, CURLOPT_USERAGENT, $r['user-agent'] );\n\n\t\t/*\n\t\t * The option doesn't work with safe mode or when open_basedir is set, and there's\n\t\t * a bug #17490 with redirected POST requests, so handle redirections outside Curl.\n\t\t */\n\t\tcurl_setopt( $handle, CURLOPT_FOLLOWLOCATION, false );\n\t\tif ( defined( 'CURLOPT_PROTOCOLS' ) ) // PHP 5.2.10 / cURL 7.19.4\n\t\t\tcurl_setopt( $handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS );\n\n\t\tswitch ( $r['method'] ) {\n\t\t\tcase 'HEAD':\n\t\t\t\tcurl_setopt( $handle, CURLOPT_NOBODY, true );\n\t\t\t\tbreak;\n\t\t\tcase 'POST':\n\t\t\t\tcurl_setopt( $handle, CURLOPT_POST, true );\n\t\t\t\tcurl_setopt( $handle, CURLOPT_POSTFIELDS, $r['body'] );\n\t\t\t\tbreak;\n\t\t\tcase 'PUT':\n\t\t\t\tcurl_setopt( $handle, CURLOPT_CUSTOMREQUEST, 'PUT' );\n\t\t\t\tcurl_setopt( $handle, CURLOPT_POSTFIELDS, $r['body'] );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcurl_setopt( $handle, CURLOPT_CUSTOMREQUEST, $r['method'] );\n\t\t\t\tif ( ! is_null( $r['body'] ) )\n\t\t\t\t\tcurl_setopt( $handle, CURLOPT_POSTFIELDS, $r['body'] );\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( true === $r['blocking'] ) {\n\t\t\tcurl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( $this, 'stream_headers' ) );\n\t\t\tcurl_setopt( $handle, CURLOPT_WRITEFUNCTION, array( $this, 'stream_body' ) );\n\t\t}\n\n\t\tcurl_setopt( $handle, CURLOPT_HEADER, false );\n\n\t\tif ( isset( $r['limit_response_size'] ) )\n\t\t\t$this->max_body_length = intval( $r['limit_response_size'] );\n\t\telse\n\t\t\t$this->max_body_length = false;\n\n\t\t// If streaming to a file open a file handle, and setup our curl streaming handler.\n\t\tif ( $r['stream'] ) {\n\t\t\tif ( ! WP_DEBUG )\n\t\t\t\t$this->stream_handle = @fopen( $r['filename'], 'w+' );\n\t\t\telse\n\t\t\t\t$this->stream_handle = fopen( $r['filename'], 'w+' );\n\t\t\tif ( ! $this->stream_handle )\n\t\t\t\treturn new WP_Error( 'http_request_failed', sprintf( __( 'Could not open handle for fopen() to %s' ), $r['filename'] ) );\n\t\t} else {\n\t\t\t$this->stream_handle = false;\n\t\t}\n\n\t\tif ( !empty( $r['headers'] ) ) {\n\t\t\t// cURL expects full header strings in each element.\n\t\t\t$headers = array();\n\t\t\tforeach ( $r['headers'] as $name => $value ) {\n\t\t\t\t$headers[] = \"{$name}: $value\";\n\t\t\t}\n\t\t\tcurl_setopt( $handle, CURLOPT_HTTPHEADER, $headers );\n\t\t}\n\n\t\tif ( $r['httpversion'] == '1.0' )\n\t\t\tcurl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 );\n\t\telse\n\t\t\tcurl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );\n\n\t\t/**\n\t\t * Fires before the cURL request is executed.\n\t\t *\n\t\t * Cookies are not currently handled by the HTTP API. This action allows\n\t\t * plugins to handle cookies themselves.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param resource &$handle The cURL handle returned by curl_init().\n\t\t * @param array    $r       The HTTP request arguments.\n\t\t * @param string   $url     The request URL.\n\t\t */\n\t\tdo_action_ref_array( 'http_api_curl', array( &$handle, $r, $url ) );\n\n\t\t// We don't need to return the body, so don't. Just execute request and return.\n\t\tif ( ! $r['blocking'] ) {\n\t\t\tcurl_exec( $handle );\n\n\t\t\tif ( $curl_error = curl_error( $handle ) ) {\n\t\t\t\tcurl_close( $handle );\n\t\t\t\treturn new WP_Error( 'http_request_failed', $curl_error );\n\t\t\t}\n\t\t\tif ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ) ) ) {\n\t\t\t\tcurl_close( $handle );\n\t\t\t\treturn new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) );\n\t\t\t}\n\n\t\t\tcurl_close( $handle );\n\t\t\treturn array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() );\n\t\t}\n\n\t\tcurl_exec( $handle );\n\t\t$theHeaders = WP_Http::processHeaders( $this->headers, $url );\n\t\t$theBody = $this->body;\n\t\t$bytes_written_total = $this->bytes_written_total;\n\n\t\t$this->headers = '';\n\t\t$this->body = '';\n\t\t$this->bytes_written_total = 0;\n\n\t\t$curl_error = curl_errno( $handle );\n\n\t\t// If an error occurred, or, no response.\n\t\tif ( $curl_error || ( 0 == strlen( $theBody ) && empty( $theHeaders['headers'] ) ) ) {\n\t\t\tif ( CURLE_WRITE_ERROR /* 23 */ == $curl_error ) {\n\t\t\t\tif ( ! $this->max_body_length || $this->max_body_length != $bytes_written_total ) {\n\t\t\t\t\tif ( $r['stream'] ) {\n\t\t\t\t\t\tcurl_close( $handle );\n\t\t\t\t\t\tfclose( $this->stream_handle );\n\t\t\t\t\t\treturn new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurl_close( $handle );\n\t\t\t\t\t\treturn new WP_Error( 'http_request_failed', curl_error( $handle ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( $curl_error = curl_error( $handle ) ) {\n\t\t\t\t\tcurl_close( $handle );\n\t\t\t\t\treturn new WP_Error( 'http_request_failed', $curl_error );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ) ) ) {\n\t\t\t\tcurl_close( $handle );\n\t\t\t\treturn new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) );\n\t\t\t}\n\t\t}\n\n\t\tcurl_close( $handle );\n\n\t\tif ( $r['stream'] )\n\t\t\tfclose( $this->stream_handle );\n\n\t\t$response = array(\n\t\t\t'headers' => $theHeaders['headers'],\n\t\t\t'body' => null,\n\t\t\t'response' => $theHeaders['response'],\n\t\t\t'cookies' => $theHeaders['cookies'],\n\t\t\t'filename' => $r['filename']\n\t\t);\n\n\t\t// Handle redirects.\n\t\tif ( false !== ( $redirect_response = WP_HTTP::handle_redirects( $url, $r, $response ) ) )\n\t\t\treturn $redirect_response;\n\n\t\tif ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($theHeaders['headers']) )\n\t\t\t$theBody = WP_Http_Encoding::decompress( $theBody );\n\n\t\t$response['body'] = $theBody;\n\n\t\treturn $response;\n\t}\n\n\t/**\n\t * Grab the headers of the cURL request\n\t *\n\t * Each header is sent individually to this callback, so we append to the $header property for temporary storage\n\t *\n\t * @since 3.2.0\n\t * @access private\n\t * @return int\n\t */\n\tprivate function stream_headers( $handle, $headers ) {\n\t\t$this->headers .= $headers;\n\t\treturn strlen( $headers );\n\t}\n\n\t/**\n\t * Grab the body of the cURL request\n\t *\n\t * The contents of the document are passed in chunks, so we append to the $body property for temporary storage.\n\t * Returning a length shorter than the length of $data passed in will cause cURL to abort the request with CURLE_WRITE_ERROR\n\t *\n\t * @since 3.6.0\n\t * @access private\n\t * @return int\n\t */\n\tprivate function stream_body( $handle, $data ) {\n\t\t$data_length = strlen( $data );\n\n\t\tif ( $this->max_body_length && ( $this->bytes_written_total + $data_length ) > $this->max_body_length ) {\n\t\t\t$data_length = ( $this->max_body_length - $this->bytes_written_total );\n\t\t\t$data = substr( $data, 0, $data_length );\n\t\t}\n\n\t\tif ( $this->stream_handle ) {\n\t\t\t$bytes_written = fwrite( $this->stream_handle, $data );\n\t\t} else {\n\t\t\t$this->body .= $data;\n\t\t\t$bytes_written = $data_length;\n\t\t}\n\n\t\t$this->bytes_written_total += $bytes_written;\n\n\t\t// Upon event of this function returning less than strlen( $data ) curl will error with CURLE_WRITE_ERROR.\n\t\treturn $bytes_written;\n\t}\n\n\t/**\n\t * Whether this class can be used for retrieving an URL.\n\t *\n\t * @static\n\t * @since 2.7.0\n\t *\n\t * @return bool False means this class can not be used, true means it can.\n\t */\n\tpublic static function test( $args = array() ) {\n\t\tif ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) )\n\t\t\treturn false;\n\n\t\t$is_ssl = isset( $args['ssl'] ) && $args['ssl'];\n\n\t\tif ( $is_ssl ) {\n\t\t\t$curl_version = curl_version();\n\t\t\t// Check whether this cURL version support SSL requests.\n\t\t\tif ( ! (CURL_VERSION_SSL & $curl_version['features']) )\n\t\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Filter whether cURL can be used as a transport for retrieving a URL.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param bool  $use_class Whether the class can be used. Default true.\n\t\t * @param array $args      An array of request arguments.\n\t\t */\n\t\treturn apply_filters( 'use_curl_transport', true, $args );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-http-encoding.php",
    "content": "<?php\n/**\n * HTTP API: WP_Http_Encoding class\n *\n * @package WordPress\n * @subpackage HTTP\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement deflate and gzip transfer encoding support for HTTP requests.\n *\n * Includes RFC 1950, RFC 1951, and RFC 1952.\n *\n * @since 2.8.0\n */\nclass WP_Http_Encoding {\n\n\t/**\n\t * Compress raw string using the deflate format.\n\t *\n\t * Supports the RFC 1951 standard.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @static\n\t *\n\t * @param string $raw String to compress.\n\t * @param int $level Optional, default is 9. Compression level, 9 is highest.\n\t * @param string $supports Optional, not used. When implemented it will choose the right compression based on what the server supports.\n\t * @return string|false False on failure.\n\t */\n\tpublic static function compress( $raw, $level = 9, $supports = null ) {\n\t\treturn gzdeflate( $raw, $level );\n\t}\n\n\t/**\n\t * Decompression of deflated string.\n\t *\n\t * Will attempt to decompress using the RFC 1950 standard, and if that fails\n\t * then the RFC 1951 standard deflate will be attempted. Finally, the RFC\n\t * 1952 standard gzip decode will be attempted. If all fail, then the\n\t * original compressed string will be returned.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @static\n\t *\n\t * @param string $compressed String to decompress.\n\t * @param int $length The optional length of the compressed data.\n\t * @return string|bool False on failure.\n\t */\n\tpublic static function decompress( $compressed, $length = null ) {\n\n\t\tif ( empty($compressed) )\n\t\t\treturn $compressed;\n\n\t\tif ( false !== ( $decompressed = @gzinflate( $compressed ) ) )\n\t\t\treturn $decompressed;\n\n\t\tif ( false !== ( $decompressed = self::compatible_gzinflate( $compressed ) ) )\n\t\t\treturn $decompressed;\n\n\t\tif ( false !== ( $decompressed = @gzuncompress( $compressed ) ) )\n\t\t\treturn $decompressed;\n\n\t\tif ( function_exists('gzdecode') ) {\n\t\t\t$decompressed = @gzdecode( $compressed );\n\n\t\t\tif ( false !== $decompressed )\n\t\t\t\treturn $decompressed;\n\t\t}\n\n\t\treturn $compressed;\n\t}\n\n\t/**\n\t * Decompression of deflated string while staying compatible with the majority of servers.\n\t *\n\t * Certain Servers will return deflated data with headers which PHP's gzinflate()\n\t * function cannot handle out of the box. The following function has been created from\n\t * various snippets on the gzinflate() PHP documentation.\n\t *\n\t * Warning: Magic numbers within. Due to the potential different formats that the compressed\n\t * data may be returned in, some \"magic offsets\" are needed to ensure proper decompression\n\t * takes place. For a simple progmatic way to determine the magic offset in use, see:\n\t * https://core.trac.wordpress.org/ticket/18273\n\t *\n\t * @since 2.8.1\n\t * @link https://core.trac.wordpress.org/ticket/18273\n\t * @link http://au2.php.net/manual/en/function.gzinflate.php#70875\n\t * @link http://au2.php.net/manual/en/function.gzinflate.php#77336\n\t *\n\t * @static\n\t *\n\t * @param string $gzData String to decompress.\n\t * @return string|bool False on failure.\n\t */\n\tpublic static function compatible_gzinflate($gzData) {\n\n\t\t// Compressed data might contain a full header, if so strip it for gzinflate().\n\t\tif ( substr($gzData, 0, 3) == \"\\x1f\\x8b\\x08\" ) {\n\t\t\t$i = 10;\n\t\t\t$flg = ord( substr($gzData, 3, 1) );\n\t\t\tif ( $flg > 0 ) {\n\t\t\t\tif ( $flg & 4 ) {\n\t\t\t\t\tlist($xlen) = unpack('v', substr($gzData, $i, 2) );\n\t\t\t\t\t$i = $i + 2 + $xlen;\n\t\t\t\t}\n\t\t\t\tif ( $flg & 8 )\n\t\t\t\t\t$i = strpos($gzData, \"\\0\", $i) + 1;\n\t\t\t\tif ( $flg & 16 )\n\t\t\t\t\t$i = strpos($gzData, \"\\0\", $i) + 1;\n\t\t\t\tif ( $flg & 2 )\n\t\t\t\t\t$i = $i + 2;\n\t\t\t}\n\t\t\t$decompressed = @gzinflate( substr($gzData, $i, -8) );\n\t\t\tif ( false !== $decompressed )\n\t\t\t\treturn $decompressed;\n\t\t}\n\n\t\t// Compressed data from java.util.zip.Deflater amongst others.\n\t\t$decompressed = @gzinflate( substr($gzData, 2) );\n\t\tif ( false !== $decompressed )\n\t\t\treturn $decompressed;\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * What encoding types to accept and their priority values.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @static\n\t *\n\t * @param string $url\n\t * @param array  $args\n\t * @return string Types of encoding to accept.\n\t */\n\tpublic static function accept_encoding( $url, $args ) {\n\t\t$type = array();\n\t\t$compression_enabled = self::is_available();\n\n\t\tif ( ! $args['decompress'] ) // Decompression specifically disabled.\n\t\t\t$compression_enabled = false;\n\t\telseif ( $args['stream'] ) // Disable when streaming to file.\n\t\t\t$compression_enabled = false;\n\t\telseif ( isset( $args['limit_response_size'] ) ) // If only partial content is being requested, we won't be able to decompress it.\n\t\t\t$compression_enabled = false;\n\n\t\tif ( $compression_enabled ) {\n\t\t\tif ( function_exists( 'gzinflate' ) )\n\t\t\t\t$type[] = 'deflate;q=1.0';\n\n\t\t\tif ( function_exists( 'gzuncompress' ) )\n\t\t\t\t$type[] = 'compress;q=0.5';\n\n\t\t\tif ( function_exists( 'gzdecode' ) )\n\t\t\t\t$type[] = 'gzip;q=0.5';\n\t\t}\n\n\t\t/**\n\t\t * Filter the allowed encoding types.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param array  $type Encoding types allowed. Accepts 'gzinflate',\n\t\t *                     'gzuncompress', 'gzdecode'.\n\t\t * @param string $url  URL of the HTTP request.\n\t\t * @param array  $args HTTP request arguments.\n\t\t */\n\t\t$type = apply_filters( 'wp_http_accept_encoding', $type, $url, $args );\n\n\t\treturn implode(', ', $type);\n\t}\n\n\t/**\n\t * What encoding the content used when it was compressed to send in the headers.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @static\n\t *\n\t * @return string Content-Encoding string to send in the header.\n\t */\n\tpublic static function content_encoding() {\n\t\treturn 'deflate';\n\t}\n\n\t/**\n\t * Whether the content be decoded based on the headers.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @static\n\t *\n\t * @param array|string $headers All of the available headers.\n\t * @return bool\n\t */\n\tpublic static function should_decode($headers) {\n\t\tif ( is_array( $headers ) ) {\n\t\t\tif ( array_key_exists('content-encoding', $headers) && ! empty( $headers['content-encoding'] ) )\n\t\t\t\treturn true;\n\t\t} elseif ( is_string( $headers ) ) {\n\t\t\treturn ( stripos($headers, 'content-encoding:') !== false );\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Whether decompression and compression are supported by the PHP version.\n\t *\n\t * Each function is tested instead of checking for the zlib extension, to\n\t * ensure that the functions all exist in the PHP version and aren't\n\t * disabled.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @static\n\t *\n\t * @return bool\n\t */\n\tpublic static function is_available() {\n\t\treturn ( function_exists('gzuncompress') || function_exists('gzdeflate') || function_exists('gzinflate') );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-http-ixr-client.php",
    "content": "<?php\n/**\n * WP_HTTP_IXR_Client\n *\n * @package WordPress\n * @since 3.1.0\n *\n */\nclass WP_HTTP_IXR_Client extends IXR_Client {\n\tpublic $scheme;\n\t/**\n\t * @var IXR_Error\n\t */\n\tpublic $error;\n\n\t/**\n\t * @param string $server\n\t * @param string|bool $path\n\t * @param int|bool $port\n\t * @param int $timeout\n\t */\n\tpublic function __construct($server, $path = false, $port = false, $timeout = 15) {\n\t\tif ( ! $path ) {\n\t\t\t// Assume we have been given a URL instead\n\t\t\t$bits = parse_url($server);\n\t\t\t$this->scheme = $bits['scheme'];\n\t\t\t$this->server = $bits['host'];\n\t\t\t$this->port = isset($bits['port']) ? $bits['port'] : $port;\n\t\t\t$this->path = !empty($bits['path']) ? $bits['path'] : '/';\n\n\t\t\t// Make absolutely sure we have a path\n\t\t\tif ( ! $this->path ) {\n\t\t\t\t$this->path = '/';\n\t\t\t}\n\n\t\t\tif ( ! empty( $bits['query'] ) ) {\n\t\t\t\t$this->path .= '?' . $bits['query'];\n\t\t\t}\n\t\t} else {\n\t\t\t$this->scheme = 'http';\n\t\t\t$this->server = $server;\n\t\t\t$this->path = $path;\n\t\t\t$this->port = $port;\n\t\t}\n\t\t$this->useragent = 'The Incutio XML-RPC PHP Library';\n\t\t$this->timeout = $timeout;\n\t}\n\n\t/**\n\t * @return bool\n\t */\n\tpublic function query() {\n\t\t$args = func_get_args();\n\t\t$method = array_shift($args);\n\t\t$request = new IXR_Request($method, $args);\n\t\t$xml = $request->getXml();\n\n\t\t$port = $this->port ? \":$this->port\" : '';\n\t\t$url = $this->scheme . '://' . $this->server . $port . $this->path;\n\t\t$args = array(\n\t\t\t'headers'    => array('Content-Type' => 'text/xml'),\n\t\t\t'user-agent' => $this->useragent,\n\t\t\t'body'       => $xml,\n\t\t);\n\n\t\t// Merge Custom headers ala #8145\n\t\tforeach ( $this->headers as $header => $value ) {\n\t\t\t$args['headers'][$header] = $value;\n\t\t}\n\n\t\t/**\n\t\t * Filter the headers collection to be sent to the XML-RPC server.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array $headers Array of headers to be sent.\n\t\t */\n\t\t$args['headers'] = apply_filters( 'wp_http_ixr_client_headers', $args['headers'] );\n\n\t\tif ( $this->timeout !== false ) {\n\t\t\t$args['timeout'] = $this->timeout;\n\t\t}\n\n\t\t// Now send the request\n\t\tif ( $this->debug ) {\n\t\t\techo '<pre class=\"ixr_request\">' . htmlspecialchars($xml) . \"\\n</pre>\\n\\n\";\n\t\t}\n\n\t\t$response = wp_remote_post($url, $args);\n\n\t\tif ( is_wp_error($response) ) {\n\t\t\t$errno    = $response->get_error_code();\n\t\t\t$errorstr = $response->get_error_message();\n\t\t\t$this->error = new IXR_Error(-32300, \"transport error: $errno $errorstr\");\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( 200 != wp_remote_retrieve_response_code( $response ) ) {\n\t\t\t$this->error = new IXR_Error(-32301, 'transport error - HTTP status code was not 200 (' . wp_remote_retrieve_response_code( $response ) . ')');\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( $this->debug ) {\n\t\t\techo '<pre class=\"ixr_response\">' . htmlspecialchars( wp_remote_retrieve_body( $response ) ) . \"\\n</pre>\\n\\n\";\n\t\t}\n\n\t\t// Now parse what we've got back\n\t\t$this->message = new IXR_Message( wp_remote_retrieve_body( $response ) );\n\t\tif ( ! $this->message->parse() ) {\n\t\t\t// XML error\n\t\t\t$this->error = new IXR_Error(-32700, 'parse error. not well formed');\n\t\t\treturn false;\n\t\t}\n\n\t\t// Is the message a fault?\n\t\tif ( $this->message->messageType == 'fault' ) {\n\t\t\t$this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);\n\t\t\treturn false;\n\t\t}\n\n\t\t// Message must be OK\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-http-proxy.php",
    "content": "<?php\n/**\n * HTTP API: WP_HTTP_Proxy class\n *\n * @package WordPress\n * @subpackage HTTP\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement HTTP API proxy support.\n *\n * There are caveats to proxy support. It requires that defines be made in the wp-config.php file to\n * enable proxy support. There are also a few filters that plugins can hook into for some of the\n * constants.\n *\n * Please note that only BASIC authentication is supported by most transports.\n * cURL MAY support more methods (such as NTLM authentication) depending on your environment.\n *\n * The constants are as follows:\n * <ol>\n * <li>WP_PROXY_HOST - Enable proxy support and host for connecting.</li>\n * <li>WP_PROXY_PORT - Proxy port for connection. No default, must be defined.</li>\n * <li>WP_PROXY_USERNAME - Proxy username, if it requires authentication.</li>\n * <li>WP_PROXY_PASSWORD - Proxy password, if it requires authentication.</li>\n * <li>WP_PROXY_BYPASS_HOSTS - Will prevent the hosts in this list from going through the proxy.\n * You do not need to have localhost and the blog host in this list, because they will not be passed\n * through the proxy. The list should be presented in a comma separated list, wildcards using * are supported, eg. *.wordpress.org</li>\n * </ol>\n *\n * An example can be as seen below.\n *\n *     define('WP_PROXY_HOST', '192.168.84.101');\n *     define('WP_PROXY_PORT', '8080');\n *     define('WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com, *.wordpress.org');\n *\n * @link https://core.trac.wordpress.org/ticket/4011 Proxy support ticket in WordPress.\n * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_PROXY_BYPASS_HOSTS\n *\n * @since 2.8.0\n */\nclass WP_HTTP_Proxy {\n\n\t/**\n\t * Whether proxy connection should be used.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @use WP_PROXY_HOST\n\t * @use WP_PROXY_PORT\n\t *\n\t * @return bool\n\t */\n\tpublic function is_enabled() {\n\t\treturn defined('WP_PROXY_HOST') && defined('WP_PROXY_PORT');\n\t}\n\n\t/**\n\t * Whether authentication should be used.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @use WP_PROXY_USERNAME\n\t * @use WP_PROXY_PASSWORD\n\t *\n\t * @return bool\n\t */\n\tpublic function use_authentication() {\n\t\treturn defined('WP_PROXY_USERNAME') && defined('WP_PROXY_PASSWORD');\n\t}\n\n\t/**\n\t * Retrieve the host for the proxy server.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @return string\n\t */\n\tpublic function host() {\n\t\tif ( defined('WP_PROXY_HOST') )\n\t\t\treturn WP_PROXY_HOST;\n\n\t\treturn '';\n\t}\n\n\t/**\n\t * Retrieve the port for the proxy server.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @return string\n\t */\n\tpublic function port() {\n\t\tif ( defined('WP_PROXY_PORT') )\n\t\t\treturn WP_PROXY_PORT;\n\n\t\treturn '';\n\t}\n\n\t/**\n\t * Retrieve the username for proxy authentication.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @return string\n\t */\n\tpublic function username() {\n\t\tif ( defined('WP_PROXY_USERNAME') )\n\t\t\treturn WP_PROXY_USERNAME;\n\n\t\treturn '';\n\t}\n\n\t/**\n\t * Retrieve the password for proxy authentication.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @return string\n\t */\n\tpublic function password() {\n\t\tif ( defined('WP_PROXY_PASSWORD') )\n\t\t\treturn WP_PROXY_PASSWORD;\n\n\t\treturn '';\n\t}\n\n\t/**\n\t * Retrieve authentication string for proxy authentication.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @return string\n\t */\n\tpublic function authentication() {\n\t\treturn $this->username() . ':' . $this->password();\n\t}\n\n\t/**\n\t * Retrieve header string for proxy authentication.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @return string\n\t */\n\tpublic function authentication_header() {\n\t\treturn 'Proxy-Authorization: Basic ' . base64_encode( $this->authentication() );\n\t}\n\n\t/**\n\t * Whether URL should be sent through the proxy server.\n\t *\n\t * We want to keep localhost and the blog URL from being sent through the proxy server, because\n\t * some proxies can not handle this. We also have the constant available for defining other\n\t * hosts that won't be sent through the proxy.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @staticvar array|null $bypass_hosts\n\t * @staticvar array      $wildcard_regex\n\t *\n\t * @param string $uri URI to check.\n\t * @return bool True, to send through the proxy and false if, the proxy should not be used.\n\t */\n\tpublic function send_through_proxy( $uri ) {\n\t\t/*\n\t\t * parse_url() only handles http, https type URLs, and will emit E_WARNING on failure.\n\t\t * This will be displayed on blogs, which is not reasonable.\n\t\t */\n\t\t$check = @parse_url($uri);\n\n\t\t// Malformed URL, can not process, but this could mean ssl, so let through anyway.\n\t\tif ( $check === false )\n\t\t\treturn true;\n\n\t\t$home = parse_url( get_option('siteurl') );\n\n\t\t/**\n\t\t * Filter whether to preempt sending the request through the proxy server.\n\t\t *\n\t\t * Returning false will bypass the proxy; returning true will send\n\t\t * the request through the proxy. Returning null bypasses the filter.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param null   $override Whether to override the request result. Default null.\n\t\t * @param string $uri      URL to check.\n\t\t * @param array  $check    Associative array result of parsing the URI.\n\t\t * @param array  $home     Associative array result of parsing the site URL.\n\t\t */\n\t\t$result = apply_filters( 'pre_http_send_through_proxy', null, $uri, $check, $home );\n\t\tif ( ! is_null( $result ) )\n\t\t\treturn $result;\n\n\t\tif ( 'localhost' == $check['host'] || ( isset( $home['host'] ) && $home['host'] == $check['host'] ) )\n\t\t\treturn false;\n\n\t\tif ( !defined('WP_PROXY_BYPASS_HOSTS') )\n\t\t\treturn true;\n\n\t\tstatic $bypass_hosts = null;\n\t\tstatic $wildcard_regex = array();\n\t\tif ( null === $bypass_hosts ) {\n\t\t\t$bypass_hosts = preg_split('|,\\s*|', WP_PROXY_BYPASS_HOSTS);\n\n\t\t\tif ( false !== strpos(WP_PROXY_BYPASS_HOSTS, '*') ) {\n\t\t\t\t$wildcard_regex = array();\n\t\t\t\tforeach ( $bypass_hosts as $host )\n\t\t\t\t\t$wildcard_regex[] = str_replace( '\\*', '.+', preg_quote( $host, '/' ) );\n\t\t\t\t$wildcard_regex = '/^(' . implode('|', $wildcard_regex) . ')$/i';\n\t\t\t}\n\t\t}\n\n\t\tif ( !empty($wildcard_regex) )\n\t\t\treturn !preg_match($wildcard_regex, $check['host']);\n\t\telse\n\t\t\treturn !in_array( $check['host'], $bypass_hosts );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-http-response.php",
    "content": "<?php\n/**\n * HTTP API: WP_HTTP_Response class\n *\n * @package WordPress\n * @subpackage HTTP\n * @since 4.4.0\n */\n\n/**\n * Core class used to prepare HTTP responses.\n *\n * @since 4.4.0\n */\nclass WP_HTTP_Response {\n\n\t/**\n\t * Response data.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var mixed\n\t */\n\tpublic $data;\n\n\t/**\n\t * Response headers.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $headers;\n\n\t/**\n\t * Response status.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $status;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param mixed $data    Response data. Default null.\n\t * @param int   $status  Optional. HTTP status code. Default 200.\n\t * @param array $headers Optional. HTTP header map. Default empty array.\n\t */\n\tpublic function __construct( $data = null, $status = 200, $headers = array() ) {\n\t\t$this->data = $data;\n\t\t$this->set_status( $status );\n\t\t$this->set_headers( $headers );\n\t}\n\n\t/**\n\t * Retrieves headers associated with the response.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Map of header name to header value.\n\t */\n\tpublic function get_headers() {\n\t\treturn $this->headers;\n\t}\n\n\t/**\n\t * Sets all header values.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $headers Map of header name to header value.\n\t */\n\tpublic function set_headers( $headers ) {\n\t\t$this->headers = $headers;\n\t}\n\n\t/**\n\t * Sets a single HTTP header.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key     Header name.\n\t * @param string $value   Header value.\n\t * @param bool   $replace Optional. Whether to replace an existing header of the same name.\n\t *                        Default true.\n\t */\n\tpublic function header( $key, $value, $replace = true ) {\n\t\tif ( $replace || ! isset( $this->headers[ $key ] ) ) {\n\t\t\t$this->headers[ $key ] = $value;\n\t\t} else {\n\t\t\t$this->headers[ $key ] .= ', ' . $value;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the HTTP return code for the response.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return int The 3-digit HTTP status code.\n\t */\n\tpublic function get_status() {\n\t\treturn $this->status;\n\t}\n\n\t/**\n\t * Sets the 3-digit HTTP status code.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param int $code HTTP status.\n\t */\n\tpublic function set_status( $code ) {\n\t\t$this->status = absint( $code );\n\t}\n\n\t/**\n\t * Retrieves the response data.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return mixed Response data.\n\t */\n\tpublic function get_data() {\n\t\treturn $this->data;\n\t}\n\n\t/**\n\t * Sets the response data.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param mixed $data Response data.\n\t */\n\tpublic function set_data( $data ) {\n\t\t$this->data = $data;\n\t}\n\n\t/**\n\t * Retrieves the response data for JSON serialization.\n\t *\n\t * It is expected that in most implementations, this will return the same as get_data(),\n\t * however this may be different if you want to do custom JSON data handling.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return mixed Any JSON-serializable value.\n\t */\n\tpublic function jsonSerialize() {\n\t\treturn $this->get_data();\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-http-streams.php",
    "content": "<?php\n/**\n * HTTP API: WP_Http_Streams class\n *\n * @package WordPress\n * @subpackage HTTP\n * @since 4.4.0\n */\n\n/**\n * Core class used to integrate PHP Streams as an HTTP transport.\n *\n * @since 2.7.0\n * @since 3.7.0 Combined with the fsockopen transport and switched to `stream_socket_client()`.\n */\nclass WP_Http_Streams {\n\t/**\n\t * Send a HTTP request to a URI using PHP Streams.\n\t *\n\t * @see WP_Http::request For default options descriptions.\n\t *\n\t * @since 2.7.0\n\t * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client().\n\t *\n\t * @access public\n\t * @param string $url The request URL.\n\t * @param string|array $args Optional. Override the defaults.\n\t * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error\n\t */\n\tpublic function request($url, $args = array()) {\n\t\t$defaults = array(\n\t\t\t'method' => 'GET', 'timeout' => 5,\n\t\t\t'redirection' => 5, 'httpversion' => '1.0',\n\t\t\t'blocking' => true,\n\t\t\t'headers' => array(), 'body' => null, 'cookies' => array()\n\t\t);\n\n\t\t$r = wp_parse_args( $args, $defaults );\n\n\t\tif ( isset( $r['headers']['User-Agent'] ) ) {\n\t\t\t$r['user-agent'] = $r['headers']['User-Agent'];\n\t\t\tunset( $r['headers']['User-Agent'] );\n\t\t} elseif ( isset( $r['headers']['user-agent'] ) ) {\n\t\t\t$r['user-agent'] = $r['headers']['user-agent'];\n\t\t\tunset( $r['headers']['user-agent'] );\n\t\t}\n\n\t\t// Construct Cookie: header if any cookies are set.\n\t\tWP_Http::buildCookieHeader( $r );\n\n\t\t$arrURL = parse_url($url);\n\n\t\t$connect_host = $arrURL['host'];\n\n\t\t$secure_transport = ( $arrURL['scheme'] == 'ssl' || $arrURL['scheme'] == 'https' );\n\t\tif ( ! isset( $arrURL['port'] ) ) {\n\t\t\tif ( $arrURL['scheme'] == 'ssl' || $arrURL['scheme'] == 'https' ) {\n\t\t\t\t$arrURL['port'] = 443;\n\t\t\t\t$secure_transport = true;\n\t\t\t} else {\n\t\t\t\t$arrURL['port'] = 80;\n\t\t\t}\n\t\t}\n\n\t\t// Always pass a Path, defaulting to the root in cases such as http://example.com\n\t\tif ( ! isset( $arrURL['path'] ) ) {\n\t\t\t$arrURL['path'] = '/';\n\t\t}\n\n\t\tif ( isset( $r['headers']['Host'] ) || isset( $r['headers']['host'] ) ) {\n\t\t\tif ( isset( $r['headers']['Host'] ) )\n\t\t\t\t$arrURL['host'] = $r['headers']['Host'];\n\t\t\telse\n\t\t\t\t$arrURL['host'] = $r['headers']['host'];\n\t\t\tunset( $r['headers']['Host'], $r['headers']['host'] );\n\t\t}\n\n\t\t/*\n\t\t * Certain versions of PHP have issues with 'localhost' and IPv6, It attempts to connect\n\t\t * to ::1, which fails when the server is not set up for it. For compatibility, always\n\t\t * connect to the IPv4 address.\n\t\t */\n\t\tif ( 'localhost' == strtolower( $connect_host ) )\n\t\t\t$connect_host = '127.0.0.1';\n\n\t\t$connect_host = $secure_transport ? 'ssl://' . $connect_host : 'tcp://' . $connect_host;\n\n\t\t$is_local = isset( $r['local'] ) && $r['local'];\n\t\t$ssl_verify = isset( $r['sslverify'] ) && $r['sslverify'];\n\t\tif ( $is_local ) {\n\t\t\t/**\n\t\t\t * Filter whether SSL should be verified for local requests.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param bool $ssl_verify Whether to verify the SSL connection. Default true.\n\t\t\t */\n\t\t\t$ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify );\n\t\t} elseif ( ! $is_local ) {\n\t\t\t/**\n\t\t\t * Filter whether SSL should be verified for non-local requests.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param bool $ssl_verify Whether to verify the SSL connection. Default true.\n\t\t\t */\n\t\t\t$ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify );\n\t\t}\n\n\t\t$proxy = new WP_HTTP_Proxy();\n\n\t\t$context = stream_context_create( array(\n\t\t\t'ssl' => array(\n\t\t\t\t'verify_peer' => $ssl_verify,\n\t\t\t\t//'CN_match' => $arrURL['host'], // This is handled by self::verify_ssl_certificate()\n\t\t\t\t'capture_peer_cert' => $ssl_verify,\n\t\t\t\t'SNI_enabled' => true,\n\t\t\t\t'cafile' => $r['sslcertificates'],\n\t\t\t\t'allow_self_signed' => ! $ssl_verify,\n\t\t\t)\n\t\t) );\n\n\t\t$timeout = (int) floor( $r['timeout'] );\n\t\t$utimeout = $timeout == $r['timeout'] ? 0 : 1000000 * $r['timeout'] % 1000000;\n\t\t$connect_timeout = max( $timeout, 1 );\n\n\t\t// Store error number.\n\t\t$connection_error = null;\n\n\t\t// Store error string.\n\t\t$connection_error_str = null;\n\n\t\tif ( !WP_DEBUG ) {\n\t\t\t// In the event that the SSL connection fails, silence the many PHP Warnings.\n\t\t\tif ( $secure_transport )\n\t\t\t\t$error_reporting = error_reporting(0);\n\n\t\t\tif ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) )\n\t\t\t\t$handle = @stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context );\n\t\t\telse\n\t\t\t\t$handle = @stream_socket_client( $connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context );\n\n\t\t\tif ( $secure_transport )\n\t\t\t\terror_reporting( $error_reporting );\n\n\t\t} else {\n\t\t\tif ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) )\n\t\t\t\t$handle = stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context );\n\t\t\telse\n\t\t\t\t$handle = stream_socket_client( $connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context );\n\t\t}\n\n\t\tif ( false === $handle ) {\n\t\t\t// SSL connection failed due to expired/invalid cert, or, OpenSSL configuration is broken.\n\t\t\tif ( $secure_transport && 0 === $connection_error && '' === $connection_error_str )\n\t\t\t\treturn new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) );\n\n\t\t\treturn new WP_Error('http_request_failed', $connection_error . ': ' . $connection_error_str );\n\t\t}\n\n\t\t// Verify that the SSL certificate is valid for this request.\n\t\tif ( $secure_transport && $ssl_verify && ! $proxy->is_enabled() ) {\n\t\t\tif ( ! self::verify_ssl_certificate( $handle, $arrURL['host'] ) )\n\t\t\t\treturn new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) );\n\t\t}\n\n\t\tstream_set_timeout( $handle, $timeout, $utimeout );\n\n\t\tif ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) //Some proxies require full URL in this field.\n\t\t\t$requestPath = $url;\n\t\telse\n\t\t\t$requestPath = $arrURL['path'] . ( isset($arrURL['query']) ? '?' . $arrURL['query'] : '' );\n\n\t\t$strHeaders = strtoupper($r['method']) . ' ' . $requestPath . ' HTTP/' . $r['httpversion'] . \"\\r\\n\";\n\n\t\t$include_port_in_host_header = (\n\t\t\t( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) ||\n\t\t\t( 'http'  == $arrURL['scheme'] && 80  != $arrURL['port'] ) ||\n\t\t\t( 'https' == $arrURL['scheme'] && 443 != $arrURL['port'] )\n\t\t);\n\n\t\tif ( $include_port_in_host_header ) {\n\t\t\t$strHeaders .= 'Host: ' . $arrURL['host'] . ':' . $arrURL['port'] . \"\\r\\n\";\n\t\t} else {\n\t\t\t$strHeaders .= 'Host: ' . $arrURL['host'] . \"\\r\\n\";\n\t\t}\n\n\t\tif ( isset($r['user-agent']) )\n\t\t\t$strHeaders .= 'User-agent: ' . $r['user-agent'] . \"\\r\\n\";\n\n\t\tif ( is_array($r['headers']) ) {\n\t\t\tforeach ( (array) $r['headers'] as $header => $headerValue )\n\t\t\t\t$strHeaders .= $header . ': ' . $headerValue . \"\\r\\n\";\n\t\t} else {\n\t\t\t$strHeaders .= $r['headers'];\n\t\t}\n\n\t\tif ( $proxy->use_authentication() )\n\t\t\t$strHeaders .= $proxy->authentication_header() . \"\\r\\n\";\n\n\t\t$strHeaders .= \"\\r\\n\";\n\n\t\tif ( ! is_null($r['body']) )\n\t\t\t$strHeaders .= $r['body'];\n\n\t\tfwrite($handle, $strHeaders);\n\n\t\tif ( ! $r['blocking'] ) {\n\t\t\tstream_set_blocking( $handle, 0 );\n\t\t\tfclose( $handle );\n\t\t\treturn array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() );\n\t\t}\n\n\t\t$strResponse = '';\n\t\t$bodyStarted = false;\n\t\t$keep_reading = true;\n\t\t$block_size = 4096;\n\t\tif ( isset( $r['limit_response_size'] ) )\n\t\t\t$block_size = min( $block_size, $r['limit_response_size'] );\n\n\t\t// If streaming to a file setup the file handle.\n\t\tif ( $r['stream'] ) {\n\t\t\tif ( ! WP_DEBUG )\n\t\t\t\t$stream_handle = @fopen( $r['filename'], 'w+' );\n\t\t\telse\n\t\t\t\t$stream_handle = fopen( $r['filename'], 'w+' );\n\t\t\tif ( ! $stream_handle )\n\t\t\t\treturn new WP_Error( 'http_request_failed', sprintf( __( 'Could not open handle for fopen() to %s' ), $r['filename'] ) );\n\n\t\t\t$bytes_written = 0;\n\t\t\twhile ( ! feof($handle) && $keep_reading ) {\n\t\t\t\t$block = fread( $handle, $block_size );\n\t\t\t\tif ( ! $bodyStarted ) {\n\t\t\t\t\t$strResponse .= $block;\n\t\t\t\t\tif ( strpos( $strResponse, \"\\r\\n\\r\\n\" ) ) {\n\t\t\t\t\t\t$process = WP_Http::processResponse( $strResponse );\n\t\t\t\t\t\t$bodyStarted = true;\n\t\t\t\t\t\t$block = $process['body'];\n\t\t\t\t\t\tunset( $strResponse );\n\t\t\t\t\t\t$process['body'] = '';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$this_block_size = strlen( $block );\n\n\t\t\t\tif ( isset( $r['limit_response_size'] ) && ( $bytes_written + $this_block_size ) > $r['limit_response_size'] ) {\n\t\t\t\t\t$this_block_size = ( $r['limit_response_size'] - $bytes_written );\n\t\t\t\t\t$block = substr( $block, 0, $this_block_size );\n\t\t\t\t}\n\n\t\t\t\t$bytes_written_to_file = fwrite( $stream_handle, $block );\n\n\t\t\t\tif ( $bytes_written_to_file != $this_block_size ) {\n\t\t\t\t\tfclose( $handle );\n\t\t\t\t\tfclose( $stream_handle );\n\t\t\t\t\treturn new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) );\n\t\t\t\t}\n\n\t\t\t\t$bytes_written += $bytes_written_to_file;\n\n\t\t\t\t$keep_reading = !isset( $r['limit_response_size'] ) || $bytes_written < $r['limit_response_size'];\n\t\t\t}\n\n\t\t\tfclose( $stream_handle );\n\n\t\t} else {\n\t\t\t$header_length = 0;\n\t\t\twhile ( ! feof( $handle ) && $keep_reading ) {\n\t\t\t\t$block = fread( $handle, $block_size );\n\t\t\t\t$strResponse .= $block;\n\t\t\t\tif ( ! $bodyStarted && strpos( $strResponse, \"\\r\\n\\r\\n\" ) ) {\n\t\t\t\t\t$header_length = strpos( $strResponse, \"\\r\\n\\r\\n\" ) + 4;\n\t\t\t\t\t$bodyStarted = true;\n\t\t\t\t}\n\t\t\t\t$keep_reading = ( ! $bodyStarted || !isset( $r['limit_response_size'] ) || strlen( $strResponse ) < ( $header_length + $r['limit_response_size'] ) );\n\t\t\t}\n\n\t\t\t$process = WP_Http::processResponse( $strResponse );\n\t\t\tunset( $strResponse );\n\n\t\t}\n\n\t\tfclose( $handle );\n\n\t\t$arrHeaders = WP_Http::processHeaders( $process['headers'], $url );\n\n\t\t$response = array(\n\t\t\t'headers' => $arrHeaders['headers'],\n\t\t\t// Not yet processed.\n\t\t\t'body' => null,\n\t\t\t'response' => $arrHeaders['response'],\n\t\t\t'cookies' => $arrHeaders['cookies'],\n\t\t\t'filename' => $r['filename']\n\t\t);\n\n\t\t// Handle redirects.\n\t\tif ( false !== ( $redirect_response = WP_Http::handle_redirects( $url, $r, $response ) ) )\n\t\t\treturn $redirect_response;\n\n\t\t// If the body was chunk encoded, then decode it.\n\t\tif ( ! empty( $process['body'] ) && isset( $arrHeaders['headers']['transfer-encoding'] ) && 'chunked' == $arrHeaders['headers']['transfer-encoding'] )\n\t\t\t$process['body'] = WP_Http::chunkTransferDecode($process['body']);\n\n\t\tif ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($arrHeaders['headers']) )\n\t\t\t$process['body'] = WP_Http_Encoding::decompress( $process['body'] );\n\n\t\tif ( isset( $r['limit_response_size'] ) && strlen( $process['body'] ) > $r['limit_response_size'] )\n\t\t\t$process['body'] = substr( $process['body'], 0, $r['limit_response_size'] );\n\n\t\t$response['body'] = $process['body'];\n\n\t\treturn $response;\n\t}\n\n\t/**\n\t * Verifies the received SSL certificate against its Common Names and subjectAltName fields.\n\t *\n\t * PHP's SSL verifications only verify that it's a valid Certificate, it doesn't verify if\n\t * the certificate is valid for the hostname which was requested.\n\t * This function verifies the requested hostname against certificate's subjectAltName field,\n\t * if that is empty, or contains no DNS entries, a fallback to the Common Name field is used.\n\t *\n\t * IP Address support is included if the request is being made to an IP address.\n\t *\n\t * @since 3.7.0\n\t * @static\n\t *\n\t * @param stream $stream The PHP Stream which the SSL request is being made over\n\t * @param string $host The hostname being requested\n\t * @return bool If the cerficiate presented in $stream is valid for $host\n\t */\n\tpublic static function verify_ssl_certificate( $stream, $host ) {\n\t\t$context_options = stream_context_get_options( $stream );\n\n\t\tif ( empty( $context_options['ssl']['peer_certificate'] ) )\n\t\t\treturn false;\n\n\t\t$cert = openssl_x509_parse( $context_options['ssl']['peer_certificate'] );\n\t\tif ( ! $cert )\n\t\t\treturn false;\n\n\t\t/*\n\t\t * If the request is being made to an IP address, we'll validate against IP fields\n\t\t * in the cert (if they exist)\n\t\t */\n\t\t$host_type = ( WP_Http::is_ip_address( $host ) ? 'ip' : 'dns' );\n\n\t\t$certificate_hostnames = array();\n\t\tif ( ! empty( $cert['extensions']['subjectAltName'] ) ) {\n\t\t\t$match_against = preg_split( '/,\\s*/', $cert['extensions']['subjectAltName'] );\n\t\t\tforeach ( $match_against as $match ) {\n\t\t\t\tlist( $match_type, $match_host ) = explode( ':', $match );\n\t\t\t\tif ( $host_type == strtolower( trim( $match_type ) ) ) // IP: or DNS:\n\t\t\t\t\t$certificate_hostnames[] = strtolower( trim( $match_host ) );\n\t\t\t}\n\t\t} elseif ( !empty( $cert['subject']['CN'] ) ) {\n\t\t\t// Only use the CN when the certificate includes no subjectAltName extension.\n\t\t\t$certificate_hostnames[] = strtolower( $cert['subject']['CN'] );\n\t\t}\n\n\t\t// Exact hostname/IP matches.\n\t\tif ( in_array( strtolower( $host ), $certificate_hostnames ) )\n\t\t\treturn true;\n\n\t\t// IP's can't be wildcards, Stop processing.\n\t\tif ( 'ip' == $host_type )\n\t\t\treturn false;\n\n\t\t// Test to see if the domain is at least 2 deep for wildcard support.\n\t\tif ( substr_count( $host, '.' ) < 2 )\n\t\t\treturn false;\n\n\t\t// Wildcard subdomains certs (*.example.com) are valid for a.example.com but not a.b.example.com.\n\t\t$wildcard_host = preg_replace( '/^[^.]+\\./', '*.', $host );\n\n\t\treturn in_array( strtolower( $wildcard_host ), $certificate_hostnames );\n\t}\n\n\t/**\n\t * Whether this class can be used for retrieving a URL.\n\t *\n\t * @static\n\t * @access public\n\t * @since 2.7.0\n\t * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client().\n\t *\n\t * @return bool False means this class can not be used, true means it can.\n\t */\n\tpublic static function test( $args = array() ) {\n\t\tif ( ! function_exists( 'stream_socket_client' ) )\n\t\t\treturn false;\n\n\t\t$is_ssl = isset( $args['ssl'] ) && $args['ssl'];\n\n\t\tif ( $is_ssl ) {\n\t\t\tif ( ! extension_loaded( 'openssl' ) )\n\t\t\t\treturn false;\n\t\t\tif ( ! function_exists( 'openssl_x509_parse' ) )\n\t\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Filter whether streams can be used as a transport for retrieving a URL.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param bool  $use_class Whether the class can be used. Default true.\n\t\t * @param array $args      Request arguments.\n\t\t */\n\t\treturn apply_filters( 'use_streams_transport', true, $args );\n\t}\n}\n\n/**\n * Deprecated HTTP Transport method which used fsockopen.\n *\n * This class is not used, and is included for backwards compatibility only.\n * All code should make use of WP_Http directly through its API.\n *\n * @see WP_HTTP::request\n *\n * @since 2.7.0\n * @deprecated 3.7.0 Please use WP_HTTP::request() directly\n */\nclass WP_HTTP_Fsockopen extends WP_HTTP_Streams {\n\t// For backwards compatibility for users who are using the class directly.\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-image-editor-gd.php",
    "content": "<?php\n/**\n * WordPress GD Image Editor\n *\n * @package WordPress\n * @subpackage Image_Editor\n */\n\n/**\n * WordPress Image Editor Class for Image Manipulation through GD\n *\n * @since 3.5.0\n * @package WordPress\n * @subpackage Image_Editor\n * @uses WP_Image_Editor Extends class\n */\nclass WP_Image_Editor_GD extends WP_Image_Editor {\n\t/**\n\t * GD Resource.\n\t *\n\t * @access protected\n\t * @var resource\n\t */\n\tprotected $image;\n\n\tpublic function __destruct() {\n\t\tif ( $this->image ) {\n\t\t\t// we don't need the original in memory anymore\n\t\t\timagedestroy( $this->image );\n\t\t}\n\t}\n\n\t/**\n\t * Checks to see if current environment supports GD.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @param array $args\n\t * @return bool\n\t */\n\tpublic static function test( $args = array() ) {\n\t\tif ( ! extension_loaded('gd') || ! function_exists('gd_info') )\n\t\t\treturn false;\n\n\t\t// On some setups GD library does not provide imagerotate() - Ticket #11536\n\t\tif ( isset( $args['methods'] ) &&\n\t\t\t in_array( 'rotate', $args['methods'] ) &&\n\t\t\t ! function_exists('imagerotate') ){\n\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks to see if editor supports the mime-type specified.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @param string $mime_type\n\t * @return bool\n\t */\n\tpublic static function supports_mime_type( $mime_type ) {\n\t\t$image_types = imagetypes();\n\t\tswitch( $mime_type ) {\n\t\t\tcase 'image/jpeg':\n\t\t\t\treturn ($image_types & IMG_JPG) != 0;\n\t\t\tcase 'image/png':\n\t\t\t\treturn ($image_types & IMG_PNG) != 0;\n\t\t\tcase 'image/gif':\n\t\t\t\treturn ($image_types & IMG_GIF) != 0;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Loads image from $this->file into new GD Resource.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t *\n\t * @return bool|WP_Error True if loaded successfully; WP_Error on failure.\n\t */\n\tpublic function load() {\n\t\tif ( $this->image )\n\t\t\treturn true;\n\n\t\tif ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) )\n\t\t\treturn new WP_Error( 'error_loading_image', __('File doesn&#8217;t exist?'), $this->file );\n\n\t\t/**\n\t\t * Filter the memory limit allocated for image manipulation.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param int|string $limit Maximum memory limit to allocate for images. Default WP_MAX_MEMORY_LIMIT.\n\t\t *                          Accepts an integer (bytes), or a shorthand string notation, such as '256M'.\n\t\t */\n\t\t// Set artificially high because GD uses uncompressed images in memory\n\t\t@ini_set( 'memory_limit', apply_filters( 'image_memory_limit', WP_MAX_MEMORY_LIMIT ) );\n\n\t\t$this->image = @imagecreatefromstring( file_get_contents( $this->file ) );\n\n\t\tif ( ! is_resource( $this->image ) )\n\t\t\treturn new WP_Error( 'invalid_image', __('File is not an image.'), $this->file );\n\n\t\t$size = @getimagesize( $this->file );\n\t\tif ( ! $size )\n\t\t\treturn new WP_Error( 'invalid_image', __('Could not read image size.'), $this->file );\n\n\t\tif ( function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) {\n\t\t\timagealphablending( $this->image, false );\n\t\t\timagesavealpha( $this->image, true );\n\t\t}\n\n\t\t$this->update_size( $size[0], $size[1] );\n\t\t$this->mime_type = $size['mime'];\n\n\t\treturn $this->set_quality();\n\t}\n\n\t/**\n\t * Sets or updates current image size.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t *\n\t * @param int $width\n\t * @param int $height\n\t * @return true\n\t */\n\tprotected function update_size( $width = false, $height = false ) {\n\t\tif ( ! $width )\n\t\t\t$width = imagesx( $this->image );\n\n\t\tif ( ! $height )\n\t\t\t$height = imagesy( $this->image );\n\n\t\treturn parent::update_size( $width, $height );\n\t}\n\n\t/**\n\t * Resizes current image.\n\t * Wraps _resize, since _resize returns a GD Resource.\n\t *\n\t * At minimum, either a height or width must be provided.\n\t * If one of the two is set to null, the resize will\n\t * maintain aspect ratio according to the provided dimension.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param  int|null $max_w Image width.\n\t * @param  int|null $max_h Image height.\n\t * @param  bool     $crop\n\t * @return true|WP_Error\n\t */\n\tpublic function resize( $max_w, $max_h, $crop = false ) {\n\t\tif ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) )\n\t\t\treturn true;\n\n\t\t$resized = $this->_resize( $max_w, $max_h, $crop );\n\n\t\tif ( is_resource( $resized ) ) {\n\t\t\timagedestroy( $this->image );\n\t\t\t$this->image = $resized;\n\t\t\treturn true;\n\n\t\t} elseif ( is_wp_error( $resized ) )\n\t\t\treturn $resized;\n\n\t\treturn new WP_Error( 'image_resize_error', __('Image resize failed.'), $this->file );\n\t}\n\n\t/**\n\t *\n\t * @param int $max_w\n\t * @param int $max_h\n\t * @param bool|array $crop\n\t * @return resource|WP_Error\n\t */\n\tprotected function _resize( $max_w, $max_h, $crop = false ) {\n\t\t$dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop );\n\t\tif ( ! $dims ) {\n\t\t\treturn new WP_Error( 'error_getting_dimensions', __('Could not calculate resized image dimensions'), $this->file );\n\t\t}\n\t\tlist( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims;\n\n\t\t$resized = wp_imagecreatetruecolor( $dst_w, $dst_h );\n\t\timagecopyresampled( $resized, $this->image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h );\n\n\t\tif ( is_resource( $resized ) ) {\n\t\t\t$this->update_size( $dst_w, $dst_h );\n\t\t\treturn $resized;\n\t\t}\n\n\t\treturn new WP_Error( 'image_resize_error', __('Image resize failed.'), $this->file );\n\t}\n\n\t/**\n\t * Resize multiple images from a single source.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param array $sizes {\n\t *     An array of image size arrays. Default sizes are 'small', 'medium', 'medium_large', 'large'.\n\t *\n\t *     Either a height or width must be provided.\n\t *     If one of the two is set to null, the resize will\n\t *     maintain aspect ratio according to the provided dimension.\n\t *\n\t *     @type array $size {\n\t *         Array of height, width values, and whether to crop.\n\t *\n\t *         @type int  $width  Image width. Optional if `$height` is specified.\n\t *         @type int  $height Image height. Optional if `$width` is specified.\n\t *         @type bool $crop   Optional. Whether to crop the image. Default false.\n\t *     }\n\t * }\n\t * @return array An array of resized images' metadata by size.\n\t */\n\tpublic function multi_resize( $sizes ) {\n\t\t$metadata = array();\n\t\t$orig_size = $this->size;\n\n\t\tforeach ( $sizes as $size => $size_data ) {\n\t\t\tif ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( ! isset( $size_data['width'] ) ) {\n\t\t\t\t$size_data['width'] = null;\n\t\t\t}\n\t\t\tif ( ! isset( $size_data['height'] ) ) {\n\t\t\t\t$size_data['height'] = null;\n\t\t\t}\n\n\t\t\tif ( ! isset( $size_data['crop'] ) ) {\n\t\t\t\t$size_data['crop'] = false;\n\t\t\t}\n\n\t\t\t$image = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );\n\t\t\t$duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );\n\n\t\t\tif ( ! is_wp_error( $image ) && ! $duplicate ) {\n\t\t\t\t$resized = $this->_save( $image );\n\n\t\t\t\timagedestroy( $image );\n\n\t\t\t\tif ( ! is_wp_error( $resized ) && $resized ) {\n\t\t\t\t\tunset( $resized['path'] );\n\t\t\t\t\t$metadata[$size] = $resized;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->size = $orig_size;\n\t\t}\n\n\t\treturn $metadata;\n\t}\n\n\t/**\n\t * Crops Image.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param int  $src_x   The start x position to crop from.\n\t * @param int  $src_y   The start y position to crop from.\n\t * @param int  $src_w   The width to crop.\n\t * @param int  $src_h   The height to crop.\n\t * @param int  $dst_w   Optional. The destination width.\n\t * @param int  $dst_h   Optional. The destination height.\n\t * @param bool $src_abs Optional. If the source crop points are absolute.\n\t * @return bool|WP_Error\n\t */\n\tpublic function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) {\n\t\t// If destination width/height isn't specified, use same as\n\t\t// width/height from source.\n\t\tif ( ! $dst_w )\n\t\t\t$dst_w = $src_w;\n\t\tif ( ! $dst_h )\n\t\t\t$dst_h = $src_h;\n\n\t\t$dst = wp_imagecreatetruecolor( $dst_w, $dst_h );\n\n\t\tif ( $src_abs ) {\n\t\t\t$src_w -= $src_x;\n\t\t\t$src_h -= $src_y;\n\t\t}\n\n\t\tif ( function_exists( 'imageantialias' ) )\n\t\t\timageantialias( $dst, true );\n\n\t\timagecopyresampled( $dst, $this->image, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h );\n\n\t\tif ( is_resource( $dst ) ) {\n\t\t\timagedestroy( $this->image );\n\t\t\t$this->image = $dst;\n\t\t\t$this->update_size();\n\t\t\treturn true;\n\t\t}\n\n\t\treturn new WP_Error( 'image_crop_error', __('Image crop failed.'), $this->file );\n\t}\n\n\t/**\n\t * Rotates current image counter-clockwise by $angle.\n\t * Ported from image-edit.php\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param float $angle\n\t * @return true|WP_Error\n\t */\n\tpublic function rotate( $angle ) {\n\t\tif ( function_exists('imagerotate') ) {\n\t\t\t$transparency = imagecolorallocatealpha( $this->image, 255, 255, 255, 127 );\n\t\t\t$rotated = imagerotate( $this->image, $angle, $transparency );\n\n\t\t\tif ( is_resource( $rotated ) ) {\n\t\t\t\timagealphablending( $rotated, true );\n\t\t\t\timagesavealpha( $rotated, true );\n\t\t\t\timagedestroy( $this->image );\n\t\t\t\t$this->image = $rotated;\n\t\t\t\t$this->update_size();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn new WP_Error( 'image_rotate_error', __('Image rotate failed.'), $this->file );\n\t}\n\n\t/**\n\t * Flips current image.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param bool $horz Flip along Horizontal Axis\n\t * @param bool $vert Flip along Vertical Axis\n\t * @return true|WP_Error\n\t */\n\tpublic function flip( $horz, $vert ) {\n\t\t$w = $this->size['width'];\n\t\t$h = $this->size['height'];\n\t\t$dst = wp_imagecreatetruecolor( $w, $h );\n\n\t\tif ( is_resource( $dst ) ) {\n\t\t\t$sx = $vert ? ($w - 1) : 0;\n\t\t\t$sy = $horz ? ($h - 1) : 0;\n\t\t\t$sw = $vert ? -$w : $w;\n\t\t\t$sh = $horz ? -$h : $h;\n\n\t\t\tif ( imagecopyresampled( $dst, $this->image, 0, 0, $sx, $sy, $w, $h, $sw, $sh ) ) {\n\t\t\t\timagedestroy( $this->image );\n\t\t\t\t$this->image = $dst;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn new WP_Error( 'image_flip_error', __('Image flip failed.'), $this->file );\n\t}\n\n\t/**\n\t * Saves current in-memory image to file.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param string|null $filename\n\t * @param string|null $mime_type\n\t * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string}\n\t */\n\tpublic function save( $filename = null, $mime_type = null ) {\n\t\t$saved = $this->_save( $this->image, $filename, $mime_type );\n\n\t\tif ( ! is_wp_error( $saved ) ) {\n\t\t\t$this->file = $saved['path'];\n\t\t\t$this->mime_type = $saved['mime-type'];\n\t\t}\n\n\t\treturn $saved;\n\t}\n\n\t/**\n\t * @param resource $image\n\t * @param string|null $filename\n\t * @param string|null $mime_type\n\t * @return WP_Error|array\n\t */\n\tprotected function _save( $image, $filename = null, $mime_type = null ) {\n\t\tlist( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type );\n\n\t\tif ( ! $filename )\n\t\t\t$filename = $this->generate_filename( null, null, $extension );\n\n\t\tif ( 'image/gif' == $mime_type ) {\n\t\t\tif ( ! $this->make_image( $filename, 'imagegif', array( $image, $filename ) ) )\n\t\t\t\treturn new WP_Error( 'image_save_error', __('Image Editor Save Failed') );\n\t\t}\n\t\telseif ( 'image/png' == $mime_type ) {\n\t\t\t// convert from full colors to index colors, like original PNG.\n\t\t\tif ( function_exists('imageistruecolor') && ! imageistruecolor( $image ) )\n\t\t\t\timagetruecolortopalette( $image, false, imagecolorstotal( $image ) );\n\n\t\t\tif ( ! $this->make_image( $filename, 'imagepng', array( $image, $filename ) ) )\n\t\t\t\treturn new WP_Error( 'image_save_error', __('Image Editor Save Failed') );\n\t\t}\n\t\telseif ( 'image/jpeg' == $mime_type ) {\n\t\t\tif ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) )\n\t\t\t\treturn new WP_Error( 'image_save_error', __('Image Editor Save Failed') );\n\t\t}\n\t\telse {\n\t\t\treturn new WP_Error( 'image_save_error', __('Image Editor Save Failed') );\n\t\t}\n\n\t\t// Set correct file permissions\n\t\t$stat = stat( dirname( $filename ) );\n\t\t$perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits\n\t\t@ chmod( $filename, $perms );\n\n\t\t/**\n\t\t * Filter the name of the saved image file.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param string $filename Name of the file.\n\t\t */\n\t\treturn array(\n\t\t\t'path'      => $filename,\n\t\t\t'file'      => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ),\n\t\t\t'width'     => $this->size['width'],\n\t\t\t'height'    => $this->size['height'],\n\t\t\t'mime-type' => $mime_type,\n\t\t);\n\t}\n\n\t/**\n\t * Returns stream of current image.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param string $mime_type\n\t * @return bool\n\t */\n\tpublic function stream( $mime_type = null ) {\n\t\tlist( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type );\n\n\t\tswitch ( $mime_type ) {\n\t\t\tcase 'image/png':\n\t\t\t\theader( 'Content-Type: image/png' );\n\t\t\t\treturn imagepng( $this->image );\n\t\t\tcase 'image/gif':\n\t\t\t\theader( 'Content-Type: image/gif' );\n\t\t\t\treturn imagegif( $this->image );\n\t\t\tdefault:\n\t\t\t\theader( 'Content-Type: image/jpeg' );\n\t\t\t\treturn imagejpeg( $this->image, null, $this->get_quality() );\n\t\t}\n\t}\n\n\t/**\n\t * Either calls editor's save function or handles file as a stream.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t *\n\t * @param string|stream $filename\n\t * @param callable $function\n\t * @param array $arguments\n\t * @return bool\n\t */\n\tprotected function make_image( $filename, $function, $arguments ) {\n\t\tif ( wp_is_stream( $filename ) )\n\t\t\t$arguments[1] = null;\n\n\t\treturn parent::make_image( $filename, $function, $arguments );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-image-editor-imagick.php",
    "content": "<?php\n/**\n * WordPress Imagick Image Editor\n *\n * @package WordPress\n * @subpackage Image_Editor\n */\n\n/**\n * WordPress Image Editor Class for Image Manipulation through Imagick PHP Module\n *\n * @since 3.5.0\n * @package WordPress\n * @subpackage Image_Editor\n * @uses WP_Image_Editor Extends class\n */\nclass WP_Image_Editor_Imagick extends WP_Image_Editor {\n\t/**\n\t * Imagick object.\n\t *\n\t * @access protected\n\t * @var Imagick\n\t */\n\tprotected $image;\n\n\tpublic function __destruct() {\n\t\tif ( $this->image instanceof Imagick ) {\n\t\t\t// we don't need the original in memory anymore\n\t\t\t$this->image->clear();\n\t\t\t$this->image->destroy();\n\t\t}\n\t}\n\n\t/**\n\t * Checks to see if current environment supports Imagick.\n\t *\n\t * We require Imagick 2.2.0 or greater, based on whether the queryFormats()\n\t * method can be called statically.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @param array $args\n\t * @return bool\n\t */\n\tpublic static function test( $args = array() ) {\n\n\t\t// First, test Imagick's extension and classes.\n\t\tif ( ! extension_loaded( 'imagick' ) || ! class_exists( 'Imagick', false ) || ! class_exists( 'ImagickPixel', false ) )\n\t\t\treturn false;\n\n\t\tif ( version_compare( phpversion( 'imagick' ), '2.2.0', '<' ) )\n\t\t\treturn false;\n\n\t\t$required_methods = array(\n\t\t\t'clear',\n\t\t\t'destroy',\n\t\t\t'valid',\n\t\t\t'getimage',\n\t\t\t'writeimage',\n\t\t\t'getimageblob',\n\t\t\t'getimagegeometry',\n\t\t\t'getimageformat',\n\t\t\t'setimageformat',\n\t\t\t'setimagecompression',\n\t\t\t'setimagecompressionquality',\n\t\t\t'setimagepage',\n\t\t\t'scaleimage',\n\t\t\t'cropimage',\n\t\t\t'rotateimage',\n\t\t\t'flipimage',\n\t\t\t'flopimage',\n\t\t);\n\n\t\t// Now, test for deep requirements within Imagick.\n\t\tif ( ! defined( 'imagick::COMPRESSION_JPEG' ) )\n\t\t\treturn false;\n\n\t\tif ( array_diff( $required_methods, get_class_methods( 'Imagick' ) ) )\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Checks to see if editor supports the mime-type specified.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @param string $mime_type\n\t * @return bool\n\t */\n\tpublic static function supports_mime_type( $mime_type ) {\n\t\t$imagick_extension = strtoupper( self::get_extension( $mime_type ) );\n\n\t\tif ( ! $imagick_extension )\n\t\t\treturn false;\n\n\t\t// setIteratorIndex is optional unless mime is an animated format.\n\t\t// Here, we just say no if you are missing it and aren't loading a jpeg.\n\t\tif ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && $mime_type != 'image/jpeg' )\n\t\t\t\treturn false;\n\n\t\ttry {\n\t\t\treturn ( (bool) @Imagick::queryFormats( $imagick_extension ) );\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Loads image from $this->file into new Imagick Object.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t *\n\t * @return true|WP_Error True if loaded; WP_Error on failure.\n\t */\n\tpublic function load() {\n\t\tif ( $this->image instanceof Imagick )\n\t\t\treturn true;\n\n\t\tif ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) )\n\t\t\treturn new WP_Error( 'error_loading_image', __('File doesn&#8217;t exist?'), $this->file );\n\n\t\t/** This filter is documented in wp-includes/class-wp-image-editor-imagick.php */\n\t\t// Even though Imagick uses less PHP memory than GD, set higher limit for users that have low PHP.ini limits\n\t\t@ini_set( 'memory_limit', apply_filters( 'image_memory_limit', WP_MAX_MEMORY_LIMIT ) );\n\n\t\ttry {\n\t\t\t$this->image = new Imagick( $this->file );\n\n\t\t\tif ( ! $this->image->valid() )\n\t\t\t\treturn new WP_Error( 'invalid_image', __('File is not an image.'), $this->file);\n\n\t\t\t// Select the first frame to handle animated images properly\n\t\t\tif ( is_callable( array( $this->image, 'setIteratorIndex' ) ) )\n\t\t\t\t$this->image->setIteratorIndex(0);\n\n\t\t\t$this->mime_type = $this->get_mime_type( $this->image->getImageFormat() );\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn new WP_Error( 'invalid_image', $e->getMessage(), $this->file );\n\t\t}\n\n\t\t$updated_size = $this->update_size();\n\t\tif ( is_wp_error( $updated_size ) ) {\n\t\t\treturn $updated_size;\n\t\t}\n\n\t\treturn $this->set_quality();\n\t}\n\n\t/**\n\t * Sets Image Compression quality on a 1-100% scale.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param int $quality Compression Quality. Range: [1,100]\n\t * @return true|WP_Error True if set successfully; WP_Error on failure.\n\t */\n\tpublic function set_quality( $quality = null ) {\n\t\t$quality_result = parent::set_quality( $quality );\n\t\tif ( is_wp_error( $quality_result ) ) {\n\t\t\treturn $quality_result;\n\t\t} else {\n\t\t\t$quality = $this->get_quality();\n\t\t}\n\n\t\ttry {\n\t\t\tif ( 'image/jpeg' == $this->mime_type ) {\n\t\t\t\t$this->image->setImageCompressionQuality( $quality );\n\t\t\t\t$this->image->setImageCompression( imagick::COMPRESSION_JPEG );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$this->image->setImageCompressionQuality( $quality );\n\t\t\t}\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn new WP_Error( 'image_quality_error', $e->getMessage() );\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets or updates current image size.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t *\n\t * @param int $width\n\t * @param int $height\n\t *\n\t * @return true|WP_Error\n\t */\n\tprotected function update_size( $width = null, $height = null ) {\n\t\t$size = null;\n\t\tif ( !$width || !$height ) {\n\t\t\ttry {\n\t\t\t\t$size = $this->image->getImageGeometry();\n\t\t\t}\n\t\t\tcatch ( Exception $e ) {\n\t\t\t\treturn new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file );\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $width )\n\t\t\t$width = $size['width'];\n\n\t\tif ( ! $height )\n\t\t\t$height = $size['height'];\n\n\t\treturn parent::update_size( $width, $height );\n\t}\n\n\t/**\n\t * Resizes current image.\n\t *\n\t * At minimum, either a height or width must be provided.\n\t * If one of the two is set to null, the resize will\n\t * maintain aspect ratio according to the provided dimension.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param  int|null $max_w Image width.\n\t * @param  int|null $max_h Image height.\n\t * @param  bool     $crop\n\t * @return bool|WP_Error\n\t */\n\tpublic function resize( $max_w, $max_h, $crop = false ) {\n\t\tif ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) )\n\t\t\treturn true;\n\n\t\t$dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop );\n\t\tif ( ! $dims )\n\t\t\treturn new WP_Error( 'error_getting_dimensions', __('Could not calculate resized image dimensions') );\n\t\tlist( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims;\n\n\t\tif ( $crop ) {\n\t\t\treturn $this->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h );\n\t\t}\n\n\t\ttry {\n\t\t\t/**\n\t\t\t * @TODO: Thumbnail is more efficient, given a newer version of Imagemagick.\n\t\t\t * $this->image->thumbnailImage( $dst_w, $dst_h );\n\t\t\t */\n\t\t\t$this->image->scaleImage( $dst_w, $dst_h );\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn new WP_Error( 'image_resize_error', $e->getMessage() );\n\t\t}\n\n\t\treturn $this->update_size( $dst_w, $dst_h );\n\t}\n\n\t/**\n\t * Resize multiple images from a single source.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param array $sizes {\n\t *     An array of image size arrays. Default sizes are 'small', 'medium', 'medium_large', 'large'.\n\t *\n\t *     Either a height or width must be provided.\n\t *     If one of the two is set to null, the resize will\n\t *     maintain aspect ratio according to the provided dimension.\n\t *\n\t *     @type array $size {\n\t *         Array of height, width values, and whether to crop.\n\t *\n\t *         @type int  $width  Image width. Optional if `$height` is specified.\n\t *         @type int  $height Image height. Optional if `$width` is specified.\n\t *         @type bool $crop   Optional. Whether to crop the image. Default false.\n\t *     }\n\t * }\n\t * @return array An array of resized images' metadata by size.\n\t */\n\tpublic function multi_resize( $sizes ) {\n\t\t$metadata = array();\n\t\t$orig_size = $this->size;\n\t\t$orig_image = $this->image->getImage();\n\n\t\tforeach ( $sizes as $size => $size_data ) {\n\t\t\tif ( ! $this->image )\n\t\t\t\t$this->image = $orig_image->getImage();\n\n\t\t\tif ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( ! isset( $size_data['width'] ) ) {\n\t\t\t\t$size_data['width'] = null;\n\t\t\t}\n\t\t\tif ( ! isset( $size_data['height'] ) ) {\n\t\t\t\t$size_data['height'] = null;\n\t\t\t}\n\n\t\t\tif ( ! isset( $size_data['crop'] ) ) {\n\t\t\t\t$size_data['crop'] = false;\n\t\t\t}\n\n\t\t\t$resize_result = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] );\n\t\t\t$duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );\n\n\t\t\tif ( ! is_wp_error( $resize_result ) && ! $duplicate ) {\n\t\t\t\t$resized = $this->_save( $this->image );\n\n\t\t\t\t$this->image->clear();\n\t\t\t\t$this->image->destroy();\n\t\t\t\t$this->image = null;\n\n\t\t\t\tif ( ! is_wp_error( $resized ) && $resized ) {\n\t\t\t\t\tunset( $resized['path'] );\n\t\t\t\t\t$metadata[$size] = $resized;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$this->size = $orig_size;\n\t\t}\n\n\t\t$this->image = $orig_image;\n\n\t\treturn $metadata;\n\t}\n\n\t/**\n\t * Crops Image.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param int  $src_x The start x position to crop from.\n\t * @param int  $src_y The start y position to crop from.\n\t * @param int  $src_w The width to crop.\n\t * @param int  $src_h The height to crop.\n\t * @param int  $dst_w Optional. The destination width.\n\t * @param int  $dst_h Optional. The destination height.\n\t * @param bool $src_abs Optional. If the source crop points are absolute.\n\t * @return bool|WP_Error\n\t */\n\tpublic function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) {\n\t\tif ( $src_abs ) {\n\t\t\t$src_w -= $src_x;\n\t\t\t$src_h -= $src_y;\n\t\t}\n\n\t\ttry {\n\t\t\t$this->image->cropImage( $src_w, $src_h, $src_x, $src_y );\n\t\t\t$this->image->setImagePage( $src_w, $src_h, 0, 0);\n\n\t\t\tif ( $dst_w || $dst_h ) {\n\t\t\t\t// If destination width/height isn't specified, use same as\n\t\t\t\t// width/height from source.\n\t\t\t\tif ( ! $dst_w )\n\t\t\t\t\t$dst_w = $src_w;\n\t\t\t\tif ( ! $dst_h )\n\t\t\t\t\t$dst_h = $src_h;\n\n\t\t\t\t$this->image->scaleImage( $dst_w, $dst_h );\n\t\t\t\treturn $this->update_size();\n\t\t\t}\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn new WP_Error( 'image_crop_error', $e->getMessage() );\n\t\t}\n\t\treturn $this->update_size();\n\t}\n\n\t/**\n\t * Rotates current image counter-clockwise by $angle.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param float $angle\n\t * @return true|WP_Error\n\t */\n\tpublic function rotate( $angle ) {\n\t\t/**\n\t\t * $angle is 360-$angle because Imagick rotates clockwise\n\t\t * (GD rotates counter-clockwise)\n\t\t */\n\t\ttry {\n\t\t\t$this->image->rotateImage( new ImagickPixel('none'), 360-$angle );\n\n\t\t\t// Since this changes the dimensions of the image, update the size.\n\t\t\t$result = $this->update_size();\n\t\t\tif ( is_wp_error( $result ) )\n\t\t\t\treturn $result;\n\n\t\t\t$this->image->setImagePage( $this->size['width'], $this->size['height'], 0, 0 );\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn new WP_Error( 'image_rotate_error', $e->getMessage() );\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Flips current image.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param bool $horz Flip along Horizontal Axis\n\t * @param bool $vert Flip along Vertical Axis\n\t * @return true|WP_Error\n\t */\n\tpublic function flip( $horz, $vert ) {\n\t\ttry {\n\t\t\tif ( $horz )\n\t\t\t\t$this->image->flipImage();\n\n\t\t\tif ( $vert )\n\t\t\t\t$this->image->flopImage();\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn new WP_Error( 'image_flip_error', $e->getMessage() );\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Saves current image to file.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param string $destfilename\n\t * @param string $mime_type\n\t * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string}\n\t */\n\tpublic function save( $destfilename = null, $mime_type = null ) {\n\t\t$saved = $this->_save( $this->image, $destfilename, $mime_type );\n\n\t\tif ( ! is_wp_error( $saved ) ) {\n\t\t\t$this->file = $saved['path'];\n\t\t\t$this->mime_type = $saved['mime-type'];\n\n\t\t\ttry {\n\t\t\t\t$this->image->setImageFormat( strtoupper( $this->get_extension( $this->mime_type ) ) );\n\t\t\t}\n\t\t\tcatch ( Exception $e ) {\n\t\t\t\treturn new WP_Error( 'image_save_error', $e->getMessage(), $this->file );\n\t\t\t}\n\t\t}\n\n\t\treturn $saved;\n\t}\n\n\t/**\n\t *\n\t * @param Imagick $image\n\t * @param string $filename\n\t * @param string $mime_type\n\t * @return array|WP_Error\n\t */\n\tprotected function _save( $image, $filename = null, $mime_type = null ) {\n\t\tlist( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type );\n\n\t\tif ( ! $filename )\n\t\t\t$filename = $this->generate_filename( null, null, $extension );\n\n\t\ttry {\n\t\t\t// Store initial Format\n\t\t\t$orig_format = $this->image->getImageFormat();\n\n\t\t\t$this->image->setImageFormat( strtoupper( $this->get_extension( $mime_type ) ) );\n\t\t\t$this->make_image( $filename, array( $image, 'writeImage' ), array( $filename ) );\n\n\t\t\t// Reset original Format\n\t\t\t$this->image->setImageFormat( $orig_format );\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn new WP_Error( 'image_save_error', $e->getMessage(), $filename );\n\t\t}\n\n\t\t// Set correct file permissions\n\t\t$stat = stat( dirname( $filename ) );\n\t\t$perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits\n\t\t@ chmod( $filename, $perms );\n\n\t\t/** This filter is documented in wp-includes/class-wp-image-editor-gd.php */\n\t\treturn array(\n\t\t\t'path'      => $filename,\n\t\t\t'file'      => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ),\n\t\t\t'width'     => $this->size['width'],\n\t\t\t'height'    => $this->size['height'],\n\t\t\t'mime-type' => $mime_type,\n\t\t);\n\t}\n\n\t/**\n\t * Streams current image to browser.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param string $mime_type\n\t * @return true|WP_Error\n\t */\n\tpublic function stream( $mime_type = null ) {\n\t\tlist( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type );\n\n\t\ttry {\n\t\t\t// Temporarily change format for stream\n\t\t\t$this->image->setImageFormat( strtoupper( $extension ) );\n\n\t\t\t// Output stream of image content\n\t\t\theader( \"Content-Type: $mime_type\" );\n\t\t\tprint $this->image->getImageBlob();\n\n\t\t\t// Reset Image to original Format\n\t\t\t$this->image->setImageFormat( $this->get_extension( $this->mime_type ) );\n\t\t}\n\t\tcatch ( Exception $e ) {\n\t\t\treturn new WP_Error( 'image_stream_error', $e->getMessage() );\n\t\t}\n\n\t\treturn true;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-image-editor.php",
    "content": "<?php\n/**\n * Base WordPress Image Editor\n *\n * @package WordPress\n * @subpackage Image_Editor\n */\n\n/**\n * Base image editor class from which implementations extend\n *\n * @since 3.5.0\n */\nabstract class WP_Image_Editor {\n\tprotected $file = null;\n\tprotected $size = null;\n\tprotected $mime_type = null;\n\tprotected $default_mime_type = 'image/jpeg';\n\tprotected $quality = false;\n\tprotected $default_quality = 90;\n\n\t/**\n\t * Each instance handles a single file.\n\t */\n\tpublic function __construct( $file ) {\n\t\t$this->file = $file;\n\t}\n\n\t/**\n\t * Checks to see if current environment supports the editor chosen.\n\t * Must be overridden in a sub-class.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @static\n\t * @access public\n\t * @abstract\n\t *\n\t * @param array $args\n\t * @return bool\n\t */\n\tpublic static function test( $args = array() ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Checks to see if editor supports the mime-type specified.\n\t * Must be overridden in a sub-class.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @static\n\t * @access public\n\t * @abstract\n\t *\n\t * @param string $mime_type\n\t * @return bool\n\t */\n\tpublic static function supports_mime_type( $mime_type ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Loads image from $this->file into editor.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t * @abstract\n\t *\n\t * @return bool|WP_Error True if loaded; WP_Error on failure.\n\t */\n\tabstract public function load();\n\n\t/**\n\t * Saves current image to file.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @abstract\n\t *\n\t * @param string $destfilename\n\t * @param string $mime_type\n\t * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string}\n\t */\n\tabstract public function save( $destfilename = null, $mime_type = null );\n\n\t/**\n\t * Resizes current image.\n\t *\n\t * At minimum, either a height or width must be provided.\n\t * If one of the two is set to null, the resize will\n\t * maintain aspect ratio according to the provided dimension.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @abstract\n\t *\n\t * @param  int|null $max_w Image width.\n\t * @param  int|null $max_h Image height.\n\t * @param  bool     $crop\n\t * @return bool|WP_Error\n\t */\n\tabstract public function resize( $max_w, $max_h, $crop = false );\n\n\t/**\n\t * Resize multiple images from a single source.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @abstract\n\t *\n\t * @param array $sizes {\n\t *     An array of image size arrays. Default sizes are 'small', 'medium', 'large'.\n\t *\n\t *     @type array $size {\n\t *         @type int  $width  Image width.\n\t *         @type int  $height Image height.\n\t *         @type bool $crop   Optional. Whether to crop the image. Default false.\n\t *     }\n\t * }\n\t * @return array An array of resized images metadata by size.\n\t */\n\tabstract public function multi_resize( $sizes );\n\n\t/**\n\t * Crops Image.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @abstract\n\t *\n\t * @param int $src_x The start x position to crop from.\n\t * @param int $src_y The start y position to crop from.\n\t * @param int $src_w The width to crop.\n\t * @param int $src_h The height to crop.\n\t * @param int $dst_w Optional. The destination width.\n\t * @param int $dst_h Optional. The destination height.\n\t * @param bool $src_abs Optional. If the source crop points are absolute.\n\t * @return bool|WP_Error\n\t */\n\tabstract public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false );\n\n\t/**\n\t * Rotates current image counter-clockwise by $angle.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @abstract\n\t *\n\t * @param float $angle\n\t * @return bool|WP_Error\n\t */\n\tabstract public function rotate( $angle );\n\n\t/**\n\t * Flips current image.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @abstract\n\t *\n\t * @param bool $horz Flip along Horizontal Axis\n\t * @param bool $vert Flip along Vertical Axis\n\t * @return bool|WP_Error\n\t */\n\tabstract public function flip( $horz, $vert );\n\n\t/**\n\t * Streams current image to browser.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @abstract\n\t *\n\t * @param string $mime_type\n\t * @return bool|WP_Error\n\t */\n\tabstract public function stream( $mime_type = null );\n\n\t/**\n\t * Gets dimensions of image.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @return array {'width'=>int, 'height'=>int}\n\t */\n\tpublic function get_size() {\n\t\treturn $this->size;\n\t}\n\n\t/**\n\t * Sets current image size.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t *\n\t * @param int $width\n\t * @param int $height\n\t * @return true\n\t */\n\tprotected function update_size( $width = null, $height = null ) {\n\t\t$this->size = array(\n\t\t\t'width' => (int) $width,\n\t\t\t'height' => (int) $height\n\t\t);\n\t\treturn true;\n\t}\n\n\t/**\n\t * Gets the Image Compression quality on a 1-100% scale.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @return int $quality Compression Quality. Range: [1,100]\n\t */\n\tpublic function get_quality() {\n\t\tif ( ! $this->quality ) {\n\t\t\t$this->set_quality();\n\t\t}\n\n\t\treturn $this->quality;\n\t}\n\n\t/**\n\t * Sets Image Compression quality on a 1-100% scale.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param int $quality Compression Quality. Range: [1,100]\n\t * @return true|WP_Error True if set successfully; WP_Error on failure.\n\t */\n\tpublic function set_quality( $quality = null ) {\n\t\tif ( null === $quality ) {\n\t\t\t/**\n\t\t\t * Filter the default image compression quality setting.\n\t\t\t *\n\t\t\t * Applies only during initial editor instantiation, or when set_quality() is run\n\t\t\t * manually without the `$quality` argument.\n\t\t\t *\n\t\t\t * set_quality() has priority over the filter.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param int    $quality   Quality level between 1 (low) and 100 (high).\n\t\t\t * @param string $mime_type Image mime type.\n\t\t\t */\n\t\t\t$quality = apply_filters( 'wp_editor_set_quality', $this->default_quality, $this->mime_type );\n\n\t\t\tif ( 'image/jpeg' == $this->mime_type ) {\n\t\t\t\t/**\n\t\t\t\t * Filter the JPEG compression quality for backward-compatibility.\n\t\t\t\t *\n\t\t\t\t * Applies only during initial editor instantiation, or when set_quality() is run\n\t\t\t\t * manually without the `$quality` argument.\n\t\t\t\t *\n\t\t\t\t * set_quality() has priority over the filter.\n\t\t\t\t *\n\t\t\t\t * The filter is evaluated under two contexts: 'image_resize', and 'edit_image',\n\t\t\t\t * (when a JPEG image is saved to file).\n\t\t\t\t *\n\t\t\t\t * @since 2.5.0\n\t\t\t\t *\n\t\t\t\t * @param int    $quality Quality level between 0 (low) and 100 (high) of the JPEG.\n\t\t\t\t * @param string $context Context of the filter.\n\t\t\t\t */\n\t\t\t\t$quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' );\n\t\t\t}\n\n\t\t\tif ( $quality < 0 || $quality > 100 ) {\n\t\t\t\t$quality = $this->default_quality;\n\t\t\t}\n\t\t}\n\n\t\t// Allow 0, but squash to 1 due to identical images in GD, and for backwards compatibility.\n\t\tif ( 0 === $quality ) {\n\t\t\t$quality = 1;\n\t\t}\n\n\t\tif ( ( $quality >= 1 ) && ( $quality <= 100 ) ) {\n\t\t\t$this->quality = $quality;\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn new WP_Error( 'invalid_image_quality', __('Attempted to set image quality outside of the range [1,100].') );\n\t\t}\n\t}\n\n\t/**\n\t * Returns preferred mime-type and extension based on provided\n\t * file's extension and mime, or current file's extension and mime.\n\t *\n\t * Will default to $this->default_mime_type if requested is not supported.\n\t *\n\t * Provides corrected filename only if filename is provided.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t *\n\t * @param string $filename\n\t * @param string $mime_type\n\t * @return array { filename|null, extension, mime-type }\n\t */\n\tprotected function get_output_format( $filename = null, $mime_type = null ) {\n\t\t$new_ext = null;\n\n\t\t// By default, assume specified type takes priority\n\t\tif ( $mime_type ) {\n\t\t\t$new_ext = $this->get_extension( $mime_type );\n\t\t}\n\n\t\tif ( $filename ) {\n\t\t\t$file_ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) );\n\t\t\t$file_mime = $this->get_mime_type( $file_ext );\n\t\t}\n\t\telse {\n\t\t\t// If no file specified, grab editor's current extension and mime-type.\n\t\t\t$file_ext = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) );\n\t\t\t$file_mime = $this->mime_type;\n\t\t}\n\n\t\t// Check to see if specified mime-type is the same as type implied by\n\t\t// file extension.  If so, prefer extension from file.\n\t\tif ( ! $mime_type || ( $file_mime == $mime_type ) ) {\n\t\t\t$mime_type = $file_mime;\n\t\t\t$new_ext = $file_ext;\n\t\t}\n\n\t\t// Double-check that the mime-type selected is supported by the editor.\n\t\t// If not, choose a default instead.\n\t\tif ( ! $this->supports_mime_type( $mime_type ) ) {\n\t\t\t/**\n\t\t\t * Filter default mime type prior to getting the file extension.\n\t\t\t *\n\t\t\t * @see wp_get_mime_types()\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param string $mime_type Mime type string.\n\t\t\t */\n\t\t\t$mime_type = apply_filters( 'image_editor_default_mime_type', $this->default_mime_type );\n\t\t\t$new_ext = $this->get_extension( $mime_type );\n\t\t}\n\n\t\tif ( $filename ) {\n\t\t\t$ext = '';\n\t\t\t$info = pathinfo( $filename );\n\t\t\t$dir  = $info['dirname'];\n\n\t\t\tif ( isset( $info['extension'] ) )\n\t\t\t\t$ext = $info['extension'];\n\n\t\t\t$filename = trailingslashit( $dir ) . wp_basename( $filename, \".$ext\" ) . \".{$new_ext}\";\n\t\t}\n\n\t\treturn array( $filename, $new_ext, $mime_type );\n\t}\n\n\t/**\n\t * Builds an output filename based on current file, and adding proper suffix\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param string $suffix\n\t * @param string $dest_path\n\t * @param string $extension\n\t * @return string filename\n\t */\n\tpublic function generate_filename( $suffix = null, $dest_path = null, $extension = null ) {\n\t\t// $suffix will be appended to the destination filename, just before the extension\n\t\tif ( ! $suffix )\n\t\t\t$suffix = $this->get_suffix();\n\n\t\t$info = pathinfo( $this->file );\n\t\t$dir  = $info['dirname'];\n\t\t$ext  = $info['extension'];\n\n\t\t$name = wp_basename( $this->file, \".$ext\" );\n\t\t$new_ext = strtolower( $extension ? $extension : $ext );\n\n\t\tif ( ! is_null( $dest_path ) && $_dest_path = realpath( $dest_path ) )\n\t\t\t$dir = $_dest_path;\n\n\t\treturn trailingslashit( $dir ) . \"{$name}-{$suffix}.{$new_ext}\";\n\t}\n\n\t/**\n\t * Builds and returns proper suffix for file based on height and width.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @return false|string suffix\n\t */\n\tpublic function get_suffix() {\n\t\tif ( ! $this->get_size() )\n\t\t\treturn false;\n\n\t\treturn \"{$this->size['width']}x{$this->size['height']}\";\n\t}\n\n\t/**\n\t * Either calls editor's save function or handles file as a stream.\n\t *\n\t * @since 3.5.0\n\t * @access protected\n\t *\n\t * @param string|stream $filename\n\t * @param callable $function\n\t * @param array $arguments\n\t * @return bool\n\t */\n\tprotected function make_image( $filename, $function, $arguments ) {\n\t\tif ( $stream = wp_is_stream( $filename ) ) {\n\t\t\tob_start();\n\t\t} else {\n\t\t\t// The directory containing the original file may no longer exist when using a replication plugin.\n\t\t\twp_mkdir_p( dirname( $filename ) );\n\t\t}\n\n\t\t$result = call_user_func_array( $function, $arguments );\n\n\t\tif ( $result && $stream ) {\n\t\t\t$contents = ob_get_contents();\n\n\t\t\t$fp = fopen( $filename, 'w' );\n\n\t\t\tif ( ! $fp )\n\t\t\t\treturn false;\n\n\t\t\tfwrite( $fp, $contents );\n\t\t\tfclose( $fp );\n\t\t}\n\n\t\tif ( $stream ) {\n\t\t\tob_end_clean();\n\t\t}\n\n\t\treturn $result;\n\t}\n\n\t/**\n\t * Returns first matched mime-type from extension,\n\t * as mapped from wp_get_mime_types()\n\t *\n\t * @since 3.5.0\n\t *\n\t * @static\n\t * @access protected\n\t *\n\t * @param string $extension\n\t * @return string|false\n\t */\n\tprotected static function get_mime_type( $extension = null ) {\n\t\tif ( ! $extension )\n\t\t\treturn false;\n\n\t\t$mime_types = wp_get_mime_types();\n\t\t$extensions = array_keys( $mime_types );\n\n\t\tforeach ( $extensions as $_extension ) {\n\t\t\tif ( preg_match( \"/{$extension}/i\", $_extension ) ) {\n\t\t\t\treturn $mime_types[$_extension];\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns first matched extension from Mime-type,\n\t * as mapped from wp_get_mime_types()\n\t *\n\t * @since 3.5.0\n\t *\n\t * @static\n\t * @access protected\n\t *\n\t * @param string $mime_type\n\t * @return string|false\n\t */\n\tprotected static function get_extension( $mime_type = null ) {\n\t\t$extensions = explode( '|', array_search( $mime_type, wp_get_mime_types() ) );\n\n\t\tif ( empty( $extensions[0] ) )\n\t\t\treturn false;\n\n\t\treturn $extensions[0];\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-meta-query.php",
    "content": "<?php\n/**\n * Meta API: WP_Meta_Query class\n *\n * @package WordPress\n * @subpackage Meta\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement meta queries for the Meta API.\n *\n * Used for generating SQL clauses that filter a primary query according to metadata keys and values.\n *\n * `WP_Meta_Query` is a helper that allows primary query classes, such as {@see WP_Query} and {@see WP_User_Query},\n * to filter their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be attached\n * to the primary SQL query string.\n *\n * @since 3.2.0\n * @package WordPress\n * @subpackage Meta\n */\nclass WP_Meta_Query {\n\t/**\n\t * Array of metadata queries.\n\t *\n\t * See {@see WP_Meta_Query::__construct()} for information on meta query arguments.\n\t *\n\t * @since 3.2.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $queries = array();\n\n\t/**\n\t * The relation between the queries. Can be one of 'AND' or 'OR'.\n\t *\n\t * @since 3.2.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $relation;\n\n\t/**\n\t * Database table to query for the metadata.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $meta_table;\n\n\t/**\n\t * Column in meta_table that represents the ID of the object the metadata belongs to.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $meta_id_column;\n\n\t/**\n\t * Database table that where the metadata's objects are stored (eg $wpdb->users).\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $primary_table;\n\n\t/**\n\t * Column in primary_table that represents the ID of the object.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $primary_id_column;\n\n\t/**\n\t * A flat list of table aliases used in JOIN clauses.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $table_aliases = array();\n\n\t/**\n\t * A flat list of clauses, keyed by clause 'name'.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $clauses = array();\n\n\t/**\n\t * Whether the query contains any OR relations.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $has_or_relation = false;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.2.0\n\t * @since 4.2.0 Introduced support for naming query clauses by associative array keys.\n\t *\n\t * @access public\n\t *\n\t * @param array $meta_query {\n\t *     Array of meta query clauses. When first-order clauses use strings as their array keys, they may be\n\t *     referenced in the 'orderby' parameter of the parent query.\n\t *\n\t *     @type string $relation Optional. The MySQL keyword used to join\n\t *                            the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'.\n\t *     @type array {\n\t *         Optional. An array of first-order clause parameters, or another fully-formed meta query.\n\t *\n\t *         @type string $key     Meta key to filter by.\n\t *         @type string $value   Meta value to filter by.\n\t *         @type string $compare MySQL operator used for comparing the $value. Accepts '=',\n\t *                               '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN',\n\t *                               'BETWEEN', 'NOT BETWEEN', 'REGEXP', 'NOT REGEXP', or 'RLIKE'.\n\t *                               Default is 'IN' when `$value` is an array, '=' otherwise.\n\t *         @type string $type    MySQL data type that the meta_value column will be CAST to for\n\t *                               comparisons. Accepts 'NUMERIC', 'BINARY', 'CHAR', 'DATE',\n\t *                               'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', or 'UNSIGNED'.\n\t *                               Default is 'CHAR'.\n\t *     }\n\t * }\n\t */\n\tpublic function __construct( $meta_query = false ) {\n\t\tif ( !$meta_query )\n\t\t\treturn;\n\n\t\tif ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) {\n\t\t\t$this->relation = 'OR';\n\t\t} else {\n\t\t\t$this->relation = 'AND';\n\t\t}\n\n\t\t$this->queries = $this->sanitize_query( $meta_query );\n\t}\n\n\t/**\n\t * Ensure the 'meta_query' argument passed to the class constructor is well-formed.\n\t *\n\t * Eliminates empty items and ensures that a 'relation' is set.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @param array $queries Array of query clauses.\n\t * @return array Sanitized array of query clauses.\n\t */\n\tpublic function sanitize_query( $queries ) {\n\t\t$clean_queries = array();\n\n\t\tif ( ! is_array( $queries ) ) {\n\t\t\treturn $clean_queries;\n\t\t}\n\n\t\tforeach ( $queries as $key => $query ) {\n\t\t\tif ( 'relation' === $key ) {\n\t\t\t\t$relation = $query;\n\n\t\t\t} elseif ( ! is_array( $query ) ) {\n\t\t\t\tcontinue;\n\n\t\t\t// First-order clause.\n\t\t\t} elseif ( $this->is_first_order_clause( $query ) ) {\n\t\t\t\tif ( isset( $query['value'] ) && array() === $query['value'] ) {\n\t\t\t\t\tunset( $query['value'] );\n\t\t\t\t}\n\n\t\t\t\t$clean_queries[ $key ] = $query;\n\n\t\t\t// Otherwise, it's a nested query, so we recurse.\n\t\t\t} else {\n\t\t\t\t$cleaned_query = $this->sanitize_query( $query );\n\n\t\t\t\tif ( ! empty( $cleaned_query ) ) {\n\t\t\t\t\t$clean_queries[ $key ] = $cleaned_query;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $clean_queries ) ) {\n\t\t\treturn $clean_queries;\n\t\t}\n\n\t\t// Sanitize the 'relation' key provided in the query.\n\t\tif ( isset( $relation ) && 'OR' === strtoupper( $relation ) ) {\n\t\t\t$clean_queries['relation'] = 'OR';\n\t\t\t$this->has_or_relation = true;\n\n\t\t/*\n\t\t * If there is only a single clause, call the relation 'OR'.\n\t\t * This value will not actually be used to join clauses, but it\n\t\t * simplifies the logic around combining key-only queries.\n\t\t */\n\t\t} elseif ( 1 === count( $clean_queries ) ) {\n\t\t\t$clean_queries['relation'] = 'OR';\n\n\t\t// Default to AND.\n\t\t} else {\n\t\t\t$clean_queries['relation'] = 'AND';\n\t\t}\n\n\t\treturn $clean_queries;\n\t}\n\n\t/**\n\t * Determine whether a query clause is first-order.\n\t *\n\t * A first-order meta query clause is one that has either a 'key' or\n\t * a 'value' array key.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @param array $query Meta query arguments.\n\t * @return bool Whether the query clause is a first-order clause.\n\t */\n\tprotected function is_first_order_clause( $query ) {\n\t\treturn isset( $query['key'] ) || isset( $query['value'] );\n\t}\n\n\t/**\n\t * Constructs a meta query based on 'meta_*' query vars\n\t *\n\t * @since 3.2.0\n\t * @access public\n\t *\n\t * @param array $qv The query variables\n\t */\n\tpublic function parse_query_vars( $qv ) {\n\t\t$meta_query = array();\n\n\t\t/*\n\t\t * For orderby=meta_value to work correctly, simple query needs to be\n\t\t * first (so that its table join is against an unaliased meta table) and\n\t\t * needs to be its own clause (so it doesn't interfere with the logic of\n\t\t * the rest of the meta_query).\n\t\t */\n\t\t$primary_meta_query = array();\n\t\tforeach ( array( 'key', 'compare', 'type' ) as $key ) {\n\t\t\tif ( ! empty( $qv[ \"meta_$key\" ] ) ) {\n\t\t\t\t$primary_meta_query[ $key ] = $qv[ \"meta_$key\" ];\n\t\t\t}\n\t\t}\n\n\t\t// WP_Query sets 'meta_value' = '' by default.\n\t\tif ( isset( $qv['meta_value'] ) && '' !== $qv['meta_value'] && ( ! is_array( $qv['meta_value'] ) || $qv['meta_value'] ) ) {\n\t\t\t$primary_meta_query['value'] = $qv['meta_value'];\n\t\t}\n\n\t\t$existing_meta_query = isset( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ? $qv['meta_query'] : array();\n\n\t\tif ( ! empty( $primary_meta_query ) && ! empty( $existing_meta_query ) ) {\n\t\t\t$meta_query = array(\n\t\t\t\t'relation' => 'AND',\n\t\t\t\t$primary_meta_query,\n\t\t\t\t$existing_meta_query,\n\t\t\t);\n\t\t} elseif ( ! empty( $primary_meta_query ) ) {\n\t\t\t$meta_query = array(\n\t\t\t\t$primary_meta_query,\n\t\t\t);\n\t\t} elseif ( ! empty( $existing_meta_query ) ) {\n\t\t\t$meta_query = $existing_meta_query;\n\t\t}\n\n\t\t$this->__construct( $meta_query );\n\t}\n\n\t/**\n\t * Return the appropriate alias for the given meta type if applicable.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param string $type MySQL type to cast meta_value.\n\t * @return string MySQL type.\n\t */\n\tpublic function get_cast_for_type( $type = '' ) {\n\t\tif ( empty( $type ) )\n\t\t\treturn 'CHAR';\n\n\t\t$meta_type = strtoupper( $type );\n\n\t\tif ( ! preg_match( '/^(?:BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|NUMERIC(?:\\(\\d+(?:,\\s?\\d+)?\\))?|DECIMAL(?:\\(\\d+(?:,\\s?\\d+)?\\))?)$/', $meta_type ) )\n\t\t\treturn 'CHAR';\n\n\t\tif ( 'NUMERIC' == $meta_type )\n\t\t\t$meta_type = 'SIGNED';\n\n\t\treturn $meta_type;\n\t}\n\n\t/**\n\t * Generates SQL clauses to be appended to a main query.\n\t *\n\t * @since 3.2.0\n\t * @access public\n\t *\n\t * @param string $type              Type of meta, eg 'user', 'post'.\n\t * @param string $primary_table     Database table where the object being filtered is stored (eg wp_users).\n\t * @param string $primary_id_column ID column for the filtered object in $primary_table.\n\t * @param object $context           Optional. The main query object.\n\t * @return false|array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to the main query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tpublic function get_sql( $type, $primary_table, $primary_id_column, $context = null ) {\n\t\tif ( ! $meta_table = _get_meta_table( $type ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->meta_table     = $meta_table;\n\t\t$this->meta_id_column = sanitize_key( $type . '_id' );\n\n\t\t$this->primary_table     = $primary_table;\n\t\t$this->primary_id_column = $primary_id_column;\n\n\t\t$sql = $this->get_sql_clauses();\n\n\t\t/*\n\t\t * If any JOINs are LEFT JOINs (as in the case of NOT EXISTS), then all JOINs should\n\t\t * be LEFT. Otherwise posts with no metadata will be excluded from results.\n\t\t */\n\t\tif ( false !== strpos( $sql['join'], 'LEFT JOIN' ) ) {\n\t\t\t$sql['join'] = str_replace( 'INNER JOIN', 'LEFT JOIN', $sql['join'] );\n\t\t}\n\n\t\t/**\n\t\t * Filter the meta query's generated SQL.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param array $args {\n\t\t *     An array of meta query SQL arguments.\n\t\t *\n\t\t *     @type array  $clauses           Array containing the query's JOIN and WHERE clauses.\n\t\t *     @type array  $queries           Array of meta queries.\n\t\t *     @type string $type              Type of meta.\n\t\t *     @type string $primary_table     Primary table.\n\t\t *     @type string $primary_id_column Primary column ID.\n\t\t *     @type object $context           The main query object.\n\t\t * }\n\t\t */\n\t\treturn apply_filters_ref_array( 'get_meta_sql', array( $sql, $this->queries, $type, $primary_table, $primary_id_column, $context ) );\n\t}\n\n\t/**\n\t * Generate SQL clauses to be appended to a main query.\n\t *\n\t * Called by the public {@see WP_Meta_Query::get_sql()}, this method\n\t * is abstracted out to maintain parity with the other Query classes.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to the main query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tprotected function get_sql_clauses() {\n\t\t/*\n\t\t * $queries are passed by reference to get_sql_for_query() for recursion.\n\t\t * To keep $this->queries unaltered, pass a copy.\n\t\t */\n\t\t$queries = $this->queries;\n\t\t$sql = $this->get_sql_for_query( $queries );\n\n\t\tif ( ! empty( $sql['where'] ) ) {\n\t\t\t$sql['where'] = ' AND ' . $sql['where'];\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t/**\n\t * Generate SQL clauses for a single query array.\n\t *\n\t * If nested subqueries are found, this method recurses the tree to\n\t * produce the properly nested SQL.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @param array $query Query to parse, passed by reference.\n\t * @param int   $depth Optional. Number of tree levels deep we currently are.\n\t *                     Used to calculate indentation. Default 0.\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to a single query array.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tprotected function get_sql_for_query( &$query, $depth = 0 ) {\n\t\t$sql_chunks = array(\n\t\t\t'join'  => array(),\n\t\t\t'where' => array(),\n\t\t);\n\n\t\t$sql = array(\n\t\t\t'join'  => '',\n\t\t\t'where' => '',\n\t\t);\n\n\t\t$indent = '';\n\t\tfor ( $i = 0; $i < $depth; $i++ ) {\n\t\t\t$indent .= \"  \";\n\t\t}\n\n\t\tforeach ( $query as $key => &$clause ) {\n\t\t\tif ( 'relation' === $key ) {\n\t\t\t\t$relation = $query['relation'];\n\t\t\t} elseif ( is_array( $clause ) ) {\n\n\t\t\t\t// This is a first-order clause.\n\t\t\t\tif ( $this->is_first_order_clause( $clause ) ) {\n\t\t\t\t\t$clause_sql = $this->get_sql_for_clause( $clause, $query, $key );\n\n\t\t\t\t\t$where_count = count( $clause_sql['where'] );\n\t\t\t\t\tif ( ! $where_count ) {\n\t\t\t\t\t\t$sql_chunks['where'][] = '';\n\t\t\t\t\t} elseif ( 1 === $where_count ) {\n\t\t\t\t\t\t$sql_chunks['where'][] = $clause_sql['where'][0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )';\n\t\t\t\t\t}\n\n\t\t\t\t\t$sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] );\n\t\t\t\t// This is a subquery, so we recurse.\n\t\t\t\t} else {\n\t\t\t\t\t$clause_sql = $this->get_sql_for_query( $clause, $depth + 1 );\n\n\t\t\t\t\t$sql_chunks['where'][] = $clause_sql['where'];\n\t\t\t\t\t$sql_chunks['join'][]  = $clause_sql['join'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Filter to remove empties.\n\t\t$sql_chunks['join']  = array_filter( $sql_chunks['join'] );\n\t\t$sql_chunks['where'] = array_filter( $sql_chunks['where'] );\n\n\t\tif ( empty( $relation ) ) {\n\t\t\t$relation = 'AND';\n\t\t}\n\n\t\t// Filter duplicate JOIN clauses and combine into a single string.\n\t\tif ( ! empty( $sql_chunks['join'] ) ) {\n\t\t\t$sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) );\n\t\t}\n\n\t\t// Generate a single WHERE clause with proper brackets and indentation.\n\t\tif ( ! empty( $sql_chunks['where'] ) ) {\n\t\t\t$sql['where'] = '( ' . \"\\n  \" . $indent . implode( ' ' . \"\\n  \" . $indent . $relation . ' ' . \"\\n  \" . $indent, $sql_chunks['where'] ) . \"\\n\" . $indent . ')';\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t/**\n\t * Generate SQL JOIN and WHERE clauses for a first-order query clause.\n\t *\n\t * \"First-order\" means that it's an array with a 'key' or 'value'.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param array  $clause       Query clause, passed by reference.\n\t * @param array  $parent_query Parent query array.\n\t * @param string $clause_key   Optional. The array key used to name the clause in the original `$meta_query`\n\t *                             parameters. If not provided, a key will be generated automatically.\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to a first-order query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tpublic function get_sql_for_clause( &$clause, $parent_query, $clause_key = '' ) {\n\t\tglobal $wpdb;\n\n\t\t$sql_chunks = array(\n\t\t\t'where' => array(),\n\t\t\t'join' => array(),\n\t\t);\n\n\t\tif ( isset( $clause['compare'] ) ) {\n\t\t\t$clause['compare'] = strtoupper( $clause['compare'] );\n\t\t} else {\n\t\t\t$clause['compare'] = isset( $clause['value'] ) && is_array( $clause['value'] ) ? 'IN' : '=';\n\t\t}\n\n\t\tif ( ! in_array( $clause['compare'], array(\n\t\t\t'=', '!=', '>', '>=', '<', '<=',\n\t\t\t'LIKE', 'NOT LIKE',\n\t\t\t'IN', 'NOT IN',\n\t\t\t'BETWEEN', 'NOT BETWEEN',\n\t\t\t'EXISTS', 'NOT EXISTS',\n\t\t\t'REGEXP', 'NOT REGEXP', 'RLIKE'\n\t\t) ) ) {\n\t\t\t$clause['compare'] = '=';\n\t\t}\n\n\t\t$meta_compare = $clause['compare'];\n\n\t\t// First build the JOIN clause, if one is required.\n\t\t$join = '';\n\n\t\t// We prefer to avoid joins if possible. Look for an existing join compatible with this clause.\n\t\t$alias = $this->find_compatible_table_alias( $clause, $parent_query );\n\t\tif ( false === $alias ) {\n\t\t\t$i = count( $this->table_aliases );\n\t\t\t$alias = $i ? 'mt' . $i : $this->meta_table;\n\n\t\t\t// JOIN clauses for NOT EXISTS have their own syntax.\n\t\t\tif ( 'NOT EXISTS' === $meta_compare ) {\n\t\t\t\t$join .= \" LEFT JOIN $this->meta_table\";\n\t\t\t\t$join .= $i ? \" AS $alias\" : '';\n\t\t\t\t$join .= $wpdb->prepare( \" ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )\", $clause['key'] );\n\n\t\t\t// All other JOIN clauses.\n\t\t\t} else {\n\t\t\t\t$join .= \" INNER JOIN $this->meta_table\";\n\t\t\t\t$join .= $i ? \" AS $alias\" : '';\n\t\t\t\t$join .= \" ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column )\";\n\t\t\t}\n\n\t\t\t$this->table_aliases[] = $alias;\n\t\t\t$sql_chunks['join'][] = $join;\n\t\t}\n\n\t\t// Save the alias to this clause, for future siblings to find.\n\t\t$clause['alias'] = $alias;\n\n\t\t// Determine the data type.\n\t\t$_meta_type = isset( $clause['type'] ) ? $clause['type'] : '';\n\t\t$meta_type  = $this->get_cast_for_type( $_meta_type );\n\t\t$clause['cast'] = $meta_type;\n\n\t\t// Fallback for clause keys is the table alias. Key must be a string.\n\t\tif ( is_int( $clause_key ) || ! $clause_key ) {\n\t\t\t$clause_key = $clause['alias'];\n\t\t}\n\n\t\t// Ensure unique clause keys, so none are overwritten.\n\t\t$iterator = 1;\n\t\t$clause_key_base = $clause_key;\n\t\twhile ( isset( $this->clauses[ $clause_key ] ) ) {\n\t\t\t$clause_key = $clause_key_base . '-' . $iterator;\n\t\t\t$iterator++;\n\t\t}\n\n\t\t// Store the clause in our flat array.\n\t\t$this->clauses[ $clause_key ] =& $clause;\n\n\t\t// Next, build the WHERE clause.\n\n\t\t// meta_key.\n\t\tif ( array_key_exists( 'key', $clause ) ) {\n\t\t\tif ( 'NOT EXISTS' === $meta_compare ) {\n\t\t\t\t$sql_chunks['where'][] = $alias . '.' . $this->meta_id_column . ' IS NULL';\n\t\t\t} else {\n\t\t\t\t$sql_chunks['where'][] = $wpdb->prepare( \"$alias.meta_key = %s\", trim( $clause['key'] ) );\n\t\t\t}\n\t\t}\n\n\t\t// meta_value.\n\t\tif ( array_key_exists( 'value', $clause ) ) {\n\t\t\t$meta_value = $clause['value'];\n\n\t\t\tif ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) {\n\t\t\t\tif ( ! is_array( $meta_value ) ) {\n\t\t\t\t\t$meta_value = preg_split( '/[,\\s]+/', $meta_value );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$meta_value = trim( $meta_value );\n\t\t\t}\n\n\t\t\tswitch ( $meta_compare ) {\n\t\t\t\tcase 'IN' :\n\t\t\t\tcase 'NOT IN' :\n\t\t\t\t\t$meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')';\n\t\t\t\t\t$where = $wpdb->prepare( $meta_compare_string, $meta_value );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'BETWEEN' :\n\t\t\t\tcase 'NOT BETWEEN' :\n\t\t\t\t\t$meta_value = array_slice( $meta_value, 0, 2 );\n\t\t\t\t\t$where = $wpdb->prepare( '%s AND %s', $meta_value );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'LIKE' :\n\t\t\t\tcase 'NOT LIKE' :\n\t\t\t\t\t$meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%';\n\t\t\t\t\t$where = $wpdb->prepare( '%s', $meta_value );\n\t\t\t\t\tbreak;\n\n\t\t\t\t// EXISTS with a value is interpreted as '='.\n\t\t\t\tcase 'EXISTS' :\n\t\t\t\t\t$meta_compare = '=';\n\t\t\t\t\t$where = $wpdb->prepare( '%s', $meta_value );\n\t\t\t\t\tbreak;\n\n\t\t\t\t// 'value' is ignored for NOT EXISTS.\n\t\t\t\tcase 'NOT EXISTS' :\n\t\t\t\t\t$where = '';\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault :\n\t\t\t\t\t$where = $wpdb->prepare( '%s', $meta_value );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( $where ) {\n\t\t\t\t$sql_chunks['where'][] = \"CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}\";\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Multiple WHERE clauses (for meta_key and meta_value) should\n\t\t * be joined in parentheses.\n\t\t */\n\t\tif ( 1 < count( $sql_chunks['where'] ) ) {\n\t\t\t$sql_chunks['where'] = array( '( ' . implode( ' AND ', $sql_chunks['where'] ) . ' )' );\n\t\t}\n\n\t\treturn $sql_chunks;\n\t}\n\n\t/**\n\t * Get a flattened list of sanitized meta clauses.\n\t *\n\t * This array should be used for clause lookup, as when the table alias and CAST type must be determined for\n\t * a value of 'orderby' corresponding to a meta clause.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @return array Meta clauses.\n\t */\n\tpublic function get_clauses() {\n\t\treturn $this->clauses;\n\t}\n\n\t/**\n\t * Identify an existing table alias that is compatible with the current\n\t * query clause.\n\t *\n\t * We avoid unnecessary table joins by allowing each clause to look for\n\t * an existing table alias that is compatible with the query that it\n\t * needs to perform.\n\t *\n\t * An existing alias is compatible if (a) it is a sibling of `$clause`\n\t * (ie, it's under the scope of the same relation), and (b) the combination\n\t * of operator and relation between the clauses allows for a shared table join.\n\t * In the case of {@see WP_Meta_Query}, this only applies to 'IN' clauses that\n\t * are connected by the relation 'OR'.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @param  array       $clause       Query clause.\n\t * @param  array       $parent_query Parent query of $clause.\n\t * @return string|bool Table alias if found, otherwise false.\n\t */\n\tprotected function find_compatible_table_alias( $clause, $parent_query ) {\n\t\t$alias = false;\n\n\t\tforeach ( $parent_query as $sibling ) {\n\t\t\t// If the sibling has no alias yet, there's nothing to check.\n\t\t\tif ( empty( $sibling['alias'] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We're only interested in siblings that are first-order clauses.\n\t\t\tif ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$compatible_compares = array();\n\n\t\t\t// Clauses connected by OR can share joins as long as they have \"positive\" operators.\n\t\t\tif ( 'OR' === $parent_query['relation'] ) {\n\t\t\t\t$compatible_compares = array( '=', 'IN', 'BETWEEN', 'LIKE', 'REGEXP', 'RLIKE', '>', '>=', '<', '<=' );\n\n\t\t\t// Clauses joined by AND with \"negative\" operators share a join only if they also share a key.\n\t\t\t} elseif ( isset( $sibling['key'] ) && isset( $clause['key'] ) && $sibling['key'] === $clause['key'] ) {\n\t\t\t\t$compatible_compares = array( '!=', 'NOT IN', 'NOT LIKE' );\n\t\t\t}\n\n\t\t\t$clause_compare  = strtoupper( $clause['compare'] );\n\t\t\t$sibling_compare = strtoupper( $sibling['compare'] );\n\t\t\tif ( in_array( $clause_compare, $compatible_compares ) && in_array( $sibling_compare, $compatible_compares ) ) {\n\t\t\t\t$alias = $sibling['alias'];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the table alias identified as compatible with the current clause.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param string|bool $alias        Table alias, or false if none was found.\n\t\t * @param array       $clause       First-order query clause.\n\t\t * @param array       $parent_query Parent of $clause.\n\t\t * @param object      $this         WP_Meta_Query object.\n\t\t */\n\t\treturn apply_filters( 'meta_query_find_compatible_table_alias', $alias, $clause, $parent_query, $this ) ;\n\t}\n\n\t/**\n\t * Checks whether the current query has any OR relations.\n\t *\n\t * In some cases, the presence of an OR relation somewhere in the query will require\n\t * the use of a `DISTINCT` or `GROUP BY` keyword in the `SELECT` clause. The current\n\t * method can be used in these cases to determine whether such a clause is necessary.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @return bool True if the query contains any `OR` relations, otherwise false.\n\t */\n\tpublic function has_or_relation() {\n\t\treturn $this->has_or_relation;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-network.php",
    "content": "<?php\n/**\n * Network API: WP_Network class\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 4.4.0\n */\n\n/**\n * Core class used for interacting with a multisite network.\n *\n * This class is used during load to populate the `$current_site` global and\n * setup the current network.\n *\n * This class is most useful in WordPress multi-network installations where the\n * ability to interact with any network of sites is required.\n *\n * @since 4.4.0\n */\nclass WP_Network {\n\n\t/**\n\t * Network ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $id;\n\n\t/**\n\t * Domain of the network.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $domain = '';\n\n\t/**\n\t * Path of the network.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $path = '';\n\n\t/**\n\t * The ID of the network's main site.\n\t *\n\t * Named \"blog\" vs. \"site\" for legacy reasons. A main site is mapped to\n\t * the network when the network is created.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $blog_id = 0;\n\n\t/**\n\t * Domain used to set cookies for this network.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $cookie_domain = '';\n\n\t/**\n\t * Name of this network.\n\t *\n\t * Named \"site\" vs. \"network\" for legacy reasons.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $site_name = '';\n\n\t/**\n\t * Retrieve a network from the database by its ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param int $network_id The ID of the network to retrieve.\n\t * @return WP_Network|bool The network's object if found. False if not.\n\t */\n\tpublic static function get_instance( $network_id ) {\n\t\tglobal $wpdb;\n\n\t\t$network_id = (int) $network_id;\n\t\tif ( ! $network_id ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$_network = wp_cache_get( $network_id, 'networks' );\n\n\t\tif ( ! $_network ) {\n\t\t\t$_network = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM {$wpdb->site} WHERE id = %d LIMIT 1\", $network_id ) );\n\n\t\t\tif ( empty( $_network ) || is_wp_error( $_network ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\twp_cache_add( $network_id, $_network, 'networks' );\n\t\t}\n\n\t\treturn new WP_Network( $_network );\n\t}\n\n\t/**\n\t * Create a new WP_Network object.\n\t *\n\t * Will populate object properties from the object provided and assign other\n\t * default properties based on that information.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_Network|object $network A network object.\n\t */\n\tpublic function __construct( $network ) {\n\t\tforeach( get_object_vars( $network ) as $key => $value ) {\n\t\t\t$this->$key = $value;\n\t\t}\n\n\t\t$this->_set_site_name();\n\t\t$this->_set_cookie_domain();\n\t}\n\n\t/**\n\t * Set the site name assigned to the network if one has not been populated.\n\t *\n\t * @since 4.4.0\n\t * @access private\n\t */\n\tprivate function _set_site_name() {\n\t\tif ( ! empty( $this->site_name ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$default = ucfirst( $this->domain );\n\t\t$this->site_name = get_network_option( $this->id, 'site_name', $default );\n\t}\n\n\t/**\n\t * Set the cookie domain based on the network domain if one has\n\t * not been populated.\n\t *\n\t * @todo What if the domain of the network doesn't match the current site?\n\t *\n\t * @since 4.4.0\n\t * @access private\n\t */\n\tprivate function _set_cookie_domain() {\n\t\tif ( ! empty( $this->cookie_domain ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->cookie_domain = $this->domain;\n\t\tif ( 'www.' === substr( $this->cookie_domain, 0, 4 ) ) {\n\t\t\t$this->cookie_domain = substr( $this->cookie_domain, 4 );\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve the closest matching network for a domain and path.\n\t *\n\t * This will not necessarily return an exact match for a domain and path. Instead, it\n\t * breaks the domain and path into pieces that are then used to match the closest\n\t * possibility from a query.\n\t *\n\t * The intent of this method is to match a network during bootstrap for a\n\t * requested site address.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @static\n\t *\n\t * @param string   $domain   Domain to check.\n\t * @param string   $path     Path to check.\n\t * @param int|null $segments Path segments to use. Defaults to null, or the full path.\n\t * @return WP_Network|bool Network object if successful. False when no network is found.\n\t */\n\tpublic static function get_by_path( $domain = '', $path = '', $segments = null ) {\n\t\tglobal $wpdb;\n\n\t\t$domains = array( $domain );\n\t\t$pieces  = explode( '.', $domain );\n\n\t\t/*\n\t\t * It's possible one domain to search is 'com', but it might as well\n\t\t * be 'localhost' or some other locally mapped domain.\n\t\t */\n\t\twhile ( array_shift( $pieces ) ) {\n\t\t\tif ( ! empty( $pieces ) ) {\n\t\t\t\t$domains[] = implode( '.', $pieces );\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * If we've gotten to this function during normal execution, there is\n\t\t * more than one network installed. At this point, who knows how many\n\t\t * we have. Attempt to optimize for the situation where networks are\n\t\t * only domains, thus meaning paths never need to be considered.\n\t\t *\n\t\t * This is a very basic optimization; anything further could have\n\t\t * drawbacks depending on the setup, so this is best done per-install.\n\t\t */\n\t\t$using_paths = true;\n\t\tif ( wp_using_ext_object_cache() ) {\n\t\t\t$using_paths = wp_cache_get( 'networks_have_paths', 'site-options' );\n\t\t\tif ( false === $using_paths ) {\n\t\t\t\t$using_paths = (int) $wpdb->get_var( \"SELECT id FROM {$wpdb->site} WHERE path <> '/' LIMIT 1\" );\n\t\t\t\twp_cache_add( 'networks_have_paths', $using_paths, 'site-options'  );\n\t\t\t}\n\t\t}\n\n\t\t$paths = array();\n\t\tif ( $using_paths ) {\n\t\t\t$path_segments = array_filter( explode( '/', trim( $path, '/' ) ) );\n\n\t\t\t/**\n\t\t\t * Filter the number of path segments to consider when searching for a site.\n\t\t\t *\n\t\t\t * @since 3.9.0\n\t\t\t *\n\t\t\t * @param int|null $segments The number of path segments to consider. WordPress by default looks at\n\t\t\t *                           one path segment. The function default of null only makes sense when you\n\t\t\t *                           know the requested path should match a network.\n\t\t\t * @param string   $domain   The requested domain.\n\t\t\t * @param string   $path     The requested path, in full.\n\t\t\t */\n\t\t\t$segments = apply_filters( 'network_by_path_segments_count', $segments, $domain, $path );\n\n\t\t\tif ( ( null !== $segments ) && count( $path_segments ) > $segments ) {\n\t\t\t\t$path_segments = array_slice( $path_segments, 0, $segments );\n\t\t\t}\n\n\t\t\twhile ( count( $path_segments ) ) {\n\t\t\t\t$paths[] = '/' . implode( '/', $path_segments ) . '/';\n\t\t\t\tarray_pop( $path_segments );\n\t\t\t}\n\n\t\t\t$paths[] = '/';\n\t\t}\n\n\t\t/**\n\t\t * Determine a network by its domain and path.\n\t\t *\n\t\t * This allows one to short-circuit the default logic, perhaps by\n\t\t * replacing it with a routine that is more optimal for your setup.\n\t\t *\n\t\t * Return null to avoid the short-circuit. Return false if no network\n\t\t * can be found at the requested domain and path. Otherwise, return\n\t\t * an object from wp_get_network().\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param null|bool|object $network  Network value to return by path.\n\t\t * @param string           $domain   The requested domain.\n\t\t * @param string           $path     The requested path, in full.\n\t\t * @param int|null         $segments The suggested number of paths to consult.\n\t\t *                                   Default null, meaning the entire path was to be consulted.\n\t\t * @param array            $paths    The paths to search for, based on $path and $segments.\n\t\t */\n\t\t$pre = apply_filters( 'pre_get_network_by_path', null, $domain, $path, $segments, $paths );\n\t\tif ( null !== $pre ) {\n\t\t\treturn $pre;\n\t\t}\n\n\t\t// @todo Consider additional optimization routes, perhaps as an opt-in for plugins.\n\t\t// We already have paths covered. What about how far domains should be drilled down (including www)?\n\n\t\t$search_domains = \"'\" . implode( \"', '\", $wpdb->_escape( $domains ) ) . \"'\";\n\n\t\tif ( ! $using_paths ) {\n\t\t\t$network = $wpdb->get_row( \"\n\t\t\t\tSELECT * FROM {$wpdb->site}\n\t\t\t\tWHERE domain IN ({$search_domains})\n\t\t\t\tORDER BY CHAR_LENGTH(domain)\n\t\t\t\tDESC LIMIT 1\n\t\t\t\" );\n\n\t\t\tif ( ! empty( $network ) && ! is_wp_error( $network ) ) {\n\t\t\t\treturn new WP_Network( $network );\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\t$search_paths = \"'\" . implode( \"', '\", $wpdb->_escape( $paths ) ) . \"'\";\n\t\t\t$networks = $wpdb->get_results( \"\n\t\t\t\tSELECT * FROM {$wpdb->site}\n\t\t\t\tWHERE domain IN ({$search_domains})\n\t\t\t\tAND path IN ({$search_paths})\n\t\t\t\tORDER BY CHAR_LENGTH(domain) DESC, CHAR_LENGTH(path) DESC\n\t\t\t\" );\n\t\t}\n\n\t\t/*\n\t\t * Domains are sorted by length of domain, then by length of path.\n\t\t * The domain must match for the path to be considered. Otherwise,\n\t\t * a network with the path of / will suffice.\n\t\t */\n\t\t$found = false;\n\t\tforeach ( $networks as $network ) {\n\t\t\tif ( ( $network->domain === $domain ) || ( \"www.{$network->domain}\" === $domain ) ) {\n\t\t\t\tif ( in_array( $network->path, $paths, true ) ) {\n\t\t\t\t\t$found = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( $network->path === '/' ) {\n\t\t\t\t$found = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( true === $found ) {\n\t\t\treturn new WP_Network( $network );\n\t\t}\n\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-oembed-controller.php",
    "content": "<?php\n/**\n * WP_oEmbed_Controller class, used to provide an oEmbed endpoint.\n *\n * @package WordPress\n * @subpackage Embeds\n * @since 4.4.0\n */\n\n/**\n * oEmbed API endpoint controller.\n *\n * Registers the API route and delivers the response data.\n * The output format (XML or JSON) is handled by the REST API.\n *\n * @since 4.4.0\n */\nfinal class WP_oEmbed_Controller {\n\t/**\n\t * Register the oEmbed REST API route.\n\t *\n\t * @since 4.4.0\n\t */\n\tpublic function register_routes() {\n\t\t/**\n\t\t * Filter the maxwidth oEmbed parameter.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param int $maxwidth Maximum allowed width. Default 600.\n\t\t */\n\t\t$maxwidth = apply_filters( 'oembed_default_width', 600 );\n\n\t\tregister_rest_route( 'oembed/1.0', '/embed', array(\n\t\t\tarray(\n\t\t\t\t'methods'  => WP_REST_Server::READABLE,\n\t\t\t\t'callback' => array( $this, 'get_item' ),\n\t\t\t\t'args'     => array(\n\t\t\t\t\t'url'      => array(\n\t\t\t\t\t\t'required'          => true,\n\t\t\t\t\t\t'sanitize_callback' => 'esc_url_raw',\n\t\t\t\t\t),\n\t\t\t\t\t'format'   => array(\n\t\t\t\t\t\t'default'           => 'json',\n\t\t\t\t\t\t'sanitize_callback' => 'wp_oembed_ensure_format',\n\t\t\t\t\t),\n\t\t\t\t\t'maxwidth' => array(\n\t\t\t\t\t\t'default'           => $maxwidth,\n\t\t\t\t\t\t'sanitize_callback' => 'absint',\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t) );\n\t}\n\n\t/**\n\t * Callback for the API endpoint.\n\t *\n\t * Returns the JSON object for the post.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param WP_REST_Request $request Full data about the request.\n\t * @return WP_Error|array oEmbed response data or WP_Error on failure.\n\t */\n\tpublic function get_item( $request ) {\n\t\t$post_id = url_to_postid( $request['url'] );\n\n\t\t/**\n\t\t * Filter the determined post ID.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param int    $post_id The post ID.\n\t\t * @param string $url     The requested URL.\n\t\t */\n\t\t$post_id = apply_filters( 'oembed_request_post_id', $post_id, $request['url'] );\n\n\t\t$data = get_oembed_response_data( $post_id, $request['maxwidth'] );\n\n\t\tif ( ! $data ) {\n\t\t\treturn new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) );\n\t\t}\n\n\t\treturn $data;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-post.php",
    "content": "<?php\n/**\n * Post API: WP_Post class\n *\n * @package WordPress\n * @subpackage Post\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement the WP_Post object.\n *\n * @since 3.5.0\n *\n * @property string $page_template\n *\n * @property-read array  $ancestors\n * @property-read int    $post_category\n * @property-read string $tag_input\n *\n */\nfinal class WP_Post {\n\n\t/**\n\t * Post ID.\n\t *\n\t * @var int\n\t */\n\tpublic $ID;\n\n\t/**\n\t * ID of post author.\n\t *\n\t * A numeric string, for compatibility reasons.\n\t *\n\t * @var string\n\t */\n\tpublic $post_author = 0;\n\n\t/**\n\t * The post's local publication time.\n\t *\n\t * @var string\n\t */\n\tpublic $post_date = '0000-00-00 00:00:00';\n\n\t/**\n\t * The post's GMT publication time.\n\t *\n\t * @var string\n\t */\n\tpublic $post_date_gmt = '0000-00-00 00:00:00';\n\n\t/**\n\t * The post's content.\n\t *\n\t * @var string\n\t */\n\tpublic $post_content = '';\n\n\t/**\n\t * The post's title.\n\t *\n\t * @var string\n\t */\n\tpublic $post_title = '';\n\n\t/**\n\t * The post's excerpt.\n\t *\n\t * @var string\n\t */\n\tpublic $post_excerpt = '';\n\n\t/**\n\t * The post's status.\n\t *\n\t * @var string\n\t */\n\tpublic $post_status = 'publish';\n\n\t/**\n\t * Whether comments are allowed.\n\t *\n\t * @var string\n\t */\n\tpublic $comment_status = 'open';\n\n\t/**\n\t * Whether pings are allowed.\n\t *\n\t * @var string\n\t */\n\tpublic $ping_status = 'open';\n\n\t/**\n\t * The post's password in plain text.\n\t *\n\t * @var string\n\t */\n\tpublic $post_password = '';\n\n\t/**\n\t * The post's slug.\n\t *\n\t * @var string\n\t */\n\tpublic $post_name = '';\n\n\t/**\n\t * URLs queued to be pinged.\n\t *\n\t * @var string\n\t */\n\tpublic $to_ping = '';\n\n\t/**\n\t * URLs that have been pinged.\n\t *\n\t * @var string\n\t */\n\tpublic $pinged = '';\n\n\t/**\n\t * The post's local modified time.\n\t *\n\t * @var string\n\t */\n\tpublic $post_modified = '0000-00-00 00:00:00';\n\n\t/**\n\t * The post's GMT modified time.\n\t *\n\t * @var string\n\t */\n\tpublic $post_modified_gmt = '0000-00-00 00:00:00';\n\n\t/**\n\t * A utility DB field for post content.\n\t *\n\t *\n\t * @var string\n\t */\n\tpublic $post_content_filtered = '';\n\n\t/**\n\t * ID of a post's parent post.\n\t *\n\t * @var int\n\t */\n\tpublic $post_parent = 0;\n\n\t/**\n\t * The unique identifier for a post, not necessarily a URL, used as the feed GUID.\n\t *\n\t * @var string\n\t */\n\tpublic $guid = '';\n\n\t/**\n\t * A field used for ordering posts.\n\t *\n\t * @var int\n\t */\n\tpublic $menu_order = 0;\n\n\t/**\n\t * The post's type, like post or page.\n\t *\n\t * @var string\n\t */\n\tpublic $post_type = 'post';\n\n\t/**\n\t * An attachment's mime type.\n\t *\n\t * @var string\n\t */\n\tpublic $post_mime_type = '';\n\n\t/**\n\t * Cached comment count.\n\t *\n\t * A numeric string, for compatibility reasons.\n\t *\n\t * @var string\n\t */\n\tpublic $comment_count = 0;\n\n\t/**\n\t * Stores the post object's sanitization level.\n\t *\n\t * Does not correspond to a DB field.\n\t *\n\t * @var string\n\t */\n\tpublic $filter;\n\n\t/**\n\t * Retrieve WP_Post instance.\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param int $post_id Post ID.\n\t * @return WP_Post|false Post object, false otherwise.\n\t */\n\tpublic static function get_instance( $post_id ) {\n\t\tglobal $wpdb;\n\n\t\t$post_id = (int) $post_id;\n\t\tif ( ! $post_id )\n\t\t\treturn false;\n\n\t\t$_post = wp_cache_get( $post_id, 'posts' );\n\n\t\tif ( ! $_post ) {\n\t\t\t$_post = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1\", $post_id ) );\n\n\t\t\tif ( ! $_post )\n\t\t\t\treturn false;\n\n\t\t\t$_post = sanitize_post( $_post, 'raw' );\n\t\t\twp_cache_add( $_post->ID, $_post, 'posts' );\n\t\t} elseif ( empty( $_post->filter ) ) {\n\t\t\t$_post = sanitize_post( $_post, 'raw' );\n\t\t}\n\n\t\treturn new WP_Post( $_post );\n\t}\n\n\t/**\n\t * Constructor.\n\t *\n\t * @param WP_Post|object $post Post object.\n\t */\n\tpublic function __construct( $post ) {\n\t\tforeach ( get_object_vars( $post ) as $key => $value )\n\t\t\t$this->$key = $value;\n\t}\n\n\t/**\n\t * Isset-er.\n\t *\n\t * @param string $key Property to check if set.\n\t * @return bool\n\t */\n\tpublic function __isset( $key ) {\n\t\tif ( 'ancestors' == $key )\n\t\t\treturn true;\n\n\t\tif ( 'page_template' == $key )\n\t\t\treturn ( 'page' == $this->post_type );\n\n\t\tif ( 'post_category' == $key )\n\t\t   return true;\n\n\t\tif ( 'tags_input' == $key )\n\t\t   return true;\n\n\t\treturn metadata_exists( 'post', $this->ID, $key );\n\t}\n\n\t/**\n\t * Getter.\n\t *\n\t * @param string $key Key to get.\n\t * @return mixed\n\t */\n\tpublic function __get( $key ) {\n\t\tif ( 'page_template' == $key && $this->__isset( $key ) ) {\n\t\t\treturn get_post_meta( $this->ID, '_wp_page_template', true );\n\t\t}\n\n\t\tif ( 'post_category' == $key ) {\n\t\t\tif ( is_object_in_taxonomy( $this->post_type, 'category' ) )\n\t\t\t\t$terms = get_the_terms( $this, 'category' );\n\n\t\t\tif ( empty( $terms ) )\n\t\t\t\treturn array();\n\n\t\t\treturn wp_list_pluck( $terms, 'term_id' );\n\t\t}\n\n\t\tif ( 'tags_input' == $key ) {\n\t\t\tif ( is_object_in_taxonomy( $this->post_type, 'post_tag' ) )\n\t\t\t\t$terms = get_the_terms( $this, 'post_tag' );\n\n\t\t\tif ( empty( $terms ) )\n\t\t\t\treturn array();\n\n\t\t\treturn wp_list_pluck( $terms, 'name' );\n\t\t}\n\n\t\t// Rest of the values need filtering.\n\t\tif ( 'ancestors' == $key )\n\t\t\t$value = get_post_ancestors( $this );\n\t\telse\n\t\t\t$value = get_post_meta( $this->ID, $key, true );\n\n\t\tif ( $this->filter )\n\t\t\t$value = sanitize_post_field( $key, $value, $this->ID, $this->filter );\n\n\t\treturn $value;\n\t}\n\n\t/**\n\t * {@Missing Summary}\n\t *\n\t * @param string $filter Filter.\n\t * @return self|array|bool|object|WP_Post\n\t */\n\tpublic function filter( $filter ) {\n\t\tif ( $this->filter == $filter )\n\t\t\treturn $this;\n\n\t\tif ( $filter == 'raw' )\n\t\t\treturn self::get_instance( $this->ID );\n\n\t\treturn sanitize_post( $this, $filter );\n\t}\n\n\t/**\n\t * Convert object to array.\n\t *\n\t * @return array Object as array.\n\t */\n\tpublic function to_array() {\n\t\t$post = get_object_vars( $this );\n\n\t\tforeach ( array( 'ancestors', 'page_template', 'post_category', 'tags_input' ) as $key ) {\n\t\t\tif ( $this->__isset( $key ) )\n\t\t\t\t$post[ $key ] = $this->__get( $key );\n\t\t}\n\n\t\treturn $post;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-rewrite.php",
    "content": "<?php\n/**\n * Rewrite API: WP_Rewrite class\n *\n * @package WordPress\n * @subpackage Rewrite\n * @since 1.5.0\n */\n\n/**\n * Core class used to implement a rewrite component API.\n *\n * The WordPress Rewrite class writes the rewrite module rules to the .htaccess\n * file. It also handles parsing the request to get the correct setup for the\n * WordPress Query class.\n *\n * The Rewrite along with WP class function as a front controller for WordPress.\n * You can add rules to trigger your page view and processing using this\n * component. The full functionality of a front controller does not exist,\n * meaning you can't define how the template files load based on the rewrite\n * rules.\n *\n * @since 1.5.0\n */\nclass WP_Rewrite {\n\t/**\n\t * Permalink structure for posts.\n\t *\n\t * @since 1.5.0\n\t * @var string\n\t */\n\tpublic $permalink_structure;\n\n\t/**\n\t * Whether to add trailing slashes.\n\t *\n\t * @since 2.2.0\n\t * @var bool\n\t */\n\tpublic $use_trailing_slashes;\n\n\t/**\n\t * Base for the author permalink structure (example.com/$author_base/authorname).\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $author_base = 'author';\n\n\t/**\n\t * Permalink structure for author archives.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $author_structure;\n\n\t/**\n\t * Permalink structure for date archives.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $date_structure;\n\n\t/**\n\t * Permalink structure for pages.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $page_structure;\n\n\t/**\n\t * Base of the search permalink structure (example.com/$search_base/query).\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $search_base = 'search';\n\n\t/**\n\t * Permalink structure for searches.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $search_structure;\n\n\t/**\n\t * Comments permalink base.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $comments_base = 'comments';\n\n\t/**\n\t * Pagination permalink base.\n\t *\n\t * @since 3.1.0\n\t * @var string\n\t */\n\tpublic $pagination_base = 'page';\n\n\t/**\n\t * Comments pagination permalink base.\n\t *\n\t * @since 4.2.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $comments_pagination_base = 'comment-page';\n\n\t/**\n\t * Feed permalink base.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $feed_base = 'feed';\n\n\t/**\n\t * Comments feed permalink structure.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $comment_feed_structure;\n\n\t/**\n\t * Feed request permalink structure.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $feed_structure;\n\n\t/**\n\t * The static portion of the post permalink structure.\n\t *\n\t * If the permalink structure is \"/archive/%post_id%\" then the front\n\t * is \"/archive/\". If the permalink structure is \"/%year%/%postname%/\"\n\t * then the front is \"/\".\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t *\n\t * @see WP_Rewrite::init()\n\t */\n\tpublic $front;\n\n\t/**\n\t * The prefix for all permalink structures.\n\t *\n\t * If PATHINFO/index permalinks are in use then the root is the value of\n\t * `WP_Rewrite::$index` with a trailing slash appended. Otherwise the root\n\t * will be empty.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t *\n\t * @see WP_Rewrite::init()\n\t * @see WP_Rewrite::using_index_permalinks()\n\t */\n\tpublic $root = '';\n\n\t/**\n\t * The name of the index file which is the entry point to all requests.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $index = 'index.php';\n\n\t/**\n\t * Variable name to use for regex matches in the rewritten query.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $matches = '';\n\n\t/**\n\t * Rewrite rules to match against the request to find the redirect or query.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $rules;\n\n\t/**\n\t * Additional rules added external to the rewrite class.\n\t *\n\t * Those not generated by the class, see add_rewrite_rule().\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $extra_rules = array();\n\n\t/**\n\t * Additional rules that belong at the beginning to match first.\n\t *\n\t * Those not generated by the class, see add_rewrite_rule().\n\t *\n\t * @since 2.3.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $extra_rules_top = array();\n\n\t/**\n\t * Rules that don't redirect to WordPress' index.php.\n\t *\n\t * These rules are written to the mod_rewrite portion of the .htaccess,\n\t * and are added by add_external_rule().\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $non_wp_rules = array();\n\n\t/**\n\t * Extra permalink structures, e.g. categories, added by add_permastruct().\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $extra_permastructs = array();\n\n\t/**\n\t * Endpoints (like /trackback/) added by add_rewrite_endpoint().\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $endpoints;\n\n\t/**\n\t * Whether to write every mod_rewrite rule for WordPress into the .htaccess file.\n\t *\n\t * This is off by default, turning it on might print a lot of rewrite rules\n\t * to the .htaccess file.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var bool\n\t *\n\t * @see WP_Rewrite::mod_rewrite_rules()\n\t */\n\tpublic $use_verbose_rules = false;\n\n\t/**\n\t * Could post permalinks be confused with those of pages?\n\t *\n\t * If the first rewrite tag in the post permalink structure is one that could\n\t * also match a page name (e.g. %postname% or %author%) then this flag is\n\t * set to true. Prior to WordPress 3.3 this flag indicated that every page\n\t * would have a set of rules added to the top of the rewrite rules array.\n\t * Now it tells WP::parse_request() to check if a URL matching the page\n\t * permastruct is actually a page before accepting it.\n\t *\n\t * @since 2.5.0\n\t * @access public\n\t * @var bool\n\t *\n\t * @see WP_Rewrite::init()\n\t */\n\tpublic $use_verbose_page_rules = true;\n\n\t/**\n\t * Rewrite tags that can be used in permalink structures.\n\t *\n\t * These are translated into the regular expressions stored in\n\t * `WP_Rewrite::$rewritereplace` and are rewritten to the query\n\t * variables listed in WP_Rewrite::$queryreplace.\n\t *\n\t * Additional tags can be added with add_rewrite_tag().\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $rewritecode = array(\n\t\t'%year%',\n\t\t'%monthnum%',\n\t\t'%day%',\n\t\t'%hour%',\n\t\t'%minute%',\n\t\t'%second%',\n\t\t'%postname%',\n\t\t'%post_id%',\n\t\t'%author%',\n\t\t'%pagename%',\n\t\t'%search%'\n\t);\n\n\t/**\n\t * Regular expressions to be substituted into rewrite rules in place\n\t * of rewrite tags, see WP_Rewrite::$rewritecode.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $rewritereplace = array(\n\t\t'([0-9]{4})',\n\t\t'([0-9]{1,2})',\n\t\t'([0-9]{1,2})',\n\t\t'([0-9]{1,2})',\n\t\t'([0-9]{1,2})',\n\t\t'([0-9]{1,2})',\n\t\t'([^/]+)',\n\t\t'([0-9]+)',\n\t\t'([^/]+)',\n\t\t'([^/]+?)',\n\t\t'(.+)'\n\t);\n\n\t/**\n\t * Query variables that rewrite tags map to, see WP_Rewrite::$rewritecode.\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $queryreplace = array(\n\t\t'year=',\n\t\t'monthnum=',\n\t\t'day=',\n\t\t'hour=',\n\t\t'minute=',\n\t\t'second=',\n\t\t'name=',\n\t\t'p=',\n\t\t'author_name=',\n\t\t'pagename=',\n\t\t's='\n\t);\n\n\t/**\n\t * Supported default feeds.\n\t *\n\t * @since 1.5.0\n\t * @var array\n\t */\n\tpublic $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' );\n\n\t/**\n\t * Determines whether permalinks are being used.\n\t *\n\t * This can be either rewrite module or permalink in the HTTP query string.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return bool True, if permalinks are enabled.\n\t */\n\tpublic function using_permalinks() {\n\t\treturn ! empty($this->permalink_structure);\n\t}\n\n\t/**\n\t * Determines whether permalinks are being used and rewrite module is not enabled.\n\t *\n\t * Means that permalink links are enabled and index.php is in the URL.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return bool Whether permalink links are enabled and index.php is in the URL.\n\t */\n\tpublic function using_index_permalinks() {\n\t\tif ( empty( $this->permalink_structure ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the index is not in the permalink, we're using mod_rewrite.\n\t\treturn preg_match( '#^/*' . $this->index . '#', $this->permalink_structure );\n\t}\n\n\t/**\n\t * Determines whether permalinks are being used and rewrite module is enabled.\n\t *\n\t * Using permalinks and index.php is not in the URL.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return bool Whether permalink links are enabled and index.php is NOT in the URL.\n\t */\n\tpublic function using_mod_rewrite_permalinks() {\n\t\treturn $this->using_permalinks() && ! $this->using_index_permalinks();\n\t}\n\n\t/**\n\t * Indexes for matches for usage in preg_*() functions.\n\t *\n\t * The format of the string is, with empty matches property value, '$NUM'.\n\t * The 'NUM' will be replaced with the value in the $number parameter. With\n\t * the matches property not empty, the value of the returned string will\n\t * contain that value of the matches property. The format then will be\n\t * '$MATCHES[NUM]', with MATCHES as the value in the property and NUM the\n\t * value of the $number parameter.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @param int $number Index number.\n\t * @return string\n\t */\n\tpublic function preg_index($number) {\n\t\t$match_prefix = '$';\n\t\t$match_suffix = '';\n\n\t\tif ( ! empty($this->matches) ) {\n\t\t\t$match_prefix = '$' . $this->matches . '[';\n\t\t\t$match_suffix = ']';\n\t\t}\n\n\t\treturn \"$match_prefix$number$match_suffix\";\n\t}\n\n\t/**\n\t * Retrieves all page and attachments for pages URIs.\n\t *\n\t * The attachments are for those that have pages as parents and will be\n\t * retrieved.\n\t *\n\t * @since 2.5.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @return array Array of page URIs as first element and attachment URIs as second element.\n\t */\n\tpublic function page_uri_index() {\n\t\tglobal $wpdb;\n\n\t\t// Get pages in order of hierarchy, i.e. children after parents.\n\t\t$pages = $wpdb->get_results(\"SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page' AND post_status != 'auto-draft'\");\n\t\t$posts = get_page_hierarchy( $pages );\n\n\t\t// If we have no pages get out quick.\n\t\tif ( !$posts )\n\t\t\treturn array( array(), array() );\n\n\t\t// Now reverse it, because we need parents after children for rewrite rules to work properly.\n\t\t$posts = array_reverse($posts, true);\n\n\t\t$page_uris = array();\n\t\t$page_attachment_uris = array();\n\n\t\tforeach ( $posts as $id => $post ) {\n\t\t\t// URL => page name\n\t\t\t$uri = get_page_uri($id);\n\t\t\t$attachments = $wpdb->get_results( $wpdb->prepare( \"SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d\", $id ));\n\t\t\tif ( !empty($attachments) ) {\n\t\t\t\tforeach ( $attachments as $attachment ) {\n\t\t\t\t\t$attach_uri = get_page_uri($attachment->ID);\n\t\t\t\t\t$page_attachment_uris[$attach_uri] = $attachment->ID;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$page_uris[$uri] = $id;\n\t\t}\n\n\t\treturn array( $page_uris, $page_attachment_uris );\n\t}\n\n\t/**\n\t * Retrieves all of the rewrite rules for pages.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return array Page rewrite rules.\n\t */\n\tpublic function page_rewrite_rules() {\n\t\t// The extra .? at the beginning prevents clashes with other regular expressions in the rules array.\n\t\t$this->add_rewrite_tag( '%pagename%', '(.?.+?)', 'pagename=' );\n\n\t\treturn $this->generate_rewrite_rules( $this->get_page_permastruct(), EP_PAGES, true, true, false, false );\n\t}\n\n\t/**\n\t * Retrieves date permalink structure, with year, month, and day.\n\t *\n\t * The permalink structure for the date, if not set already depends on the\n\t * permalink structure. It can be one of three formats. The first is year,\n\t * month, day; the second is day, month, year; and the last format is month,\n\t * day, year. These are matched against the permalink structure for which\n\t * one is used. If none matches, then the default will be used, which is\n\t * year, month, day.\n\t *\n\t * Prevents post ID and date permalinks from overlapping. In the case of\n\t * post_id, the date permalink will be prepended with front permalink with\n\t * 'date/' before the actual permalink to form the complete date permalink\n\t * structure.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string|false False on no permalink structure. Date permalink structure.\n\t */\n\tpublic function get_date_permastruct() {\n\t\tif ( isset($this->date_structure) )\n\t\t\treturn $this->date_structure;\n\n\t\tif ( empty($this->permalink_structure) ) {\n\t\t\t$this->date_structure = '';\n\t\t\treturn false;\n\t\t}\n\n\t\t// The date permalink must have year, month, and day separated by slashes.\n\t\t$endians = array('%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%');\n\n\t\t$this->date_structure = '';\n\t\t$date_endian = '';\n\n\t\tforeach ( $endians as $endian ) {\n\t\t\tif ( false !== strpos($this->permalink_structure, $endian) ) {\n\t\t\t\t$date_endian= $endian;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( empty($date_endian) )\n\t\t\t$date_endian = '%year%/%monthnum%/%day%';\n\n\t\t/*\n\t\t * Do not allow the date tags and %post_id% to overlap in the permalink\n\t\t * structure. If they do, move the date tags to $front/date/.\n\t\t */\n\t\t$front = $this->front;\n\t\tpreg_match_all('/%.+?%/', $this->permalink_structure, $tokens);\n\t\t$tok_index = 1;\n\t\tforeach ( (array) $tokens[0] as $token) {\n\t\t\tif ( '%post_id%' == $token && ($tok_index <= 3) ) {\n\t\t\t\t$front = $front . 'date/';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t$tok_index++;\n\t\t}\n\n\t\t$this->date_structure = $front . $date_endian;\n\n\t\treturn $this->date_structure;\n\t}\n\n\t/**\n\t * Retrieves the year permalink structure without month and day.\n\t *\n\t * Gets the date permalink structure and strips out the month and day\n\t * permalink structures.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return false|string False on failure. Year structure on success.\n\t */\n\tpublic function get_year_permastruct() {\n\t\t$structure = $this->get_date_permastruct();\n\n\t\tif ( empty($structure) )\n\t\t\treturn false;\n\n\t\t$structure = str_replace('%monthnum%', '', $structure);\n\t\t$structure = str_replace('%day%', '', $structure);\n\t\t$structure = preg_replace('#/+#', '/', $structure);\n\n\t\treturn $structure;\n\t}\n\n\t/**\n\t * Retrieves the month permalink structure without day and with year.\n\t *\n\t * Gets the date permalink structure and strips out the day permalink\n\t * structures. Keeps the year permalink structure.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return false|string False on failure. Year/Month structure on success.\n\t */\n\tpublic function get_month_permastruct() {\n\t\t$structure = $this->get_date_permastruct();\n\n\t\tif ( empty($structure) )\n\t\t\treturn false;\n\n\t\t$structure = str_replace('%day%', '', $structure);\n\t\t$structure = preg_replace('#/+#', '/', $structure);\n\n\t\treturn $structure;\n\t}\n\n\t/**\n\t * Retrieves the day permalink structure with month and year.\n\t *\n\t * Keeps date permalink structure with all year, month, and day.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string|false False on failure. Year/Month/Day structure on success.\n\t */\n\tpublic function get_day_permastruct() {\n\t\treturn $this->get_date_permastruct();\n\t}\n\n\t/**\n\t * Retrieves the permalink structure for categories.\n\t *\n\t * If the category_base property has no value, then the category structure\n\t * will have the front property value, followed by 'category', and finally\n\t * '%category%'. If it does, then the root property will be used, along with\n\t * the category_base property value.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string|false False on failure. Category permalink structure.\n\t */\n\tpublic function get_category_permastruct() {\n\t\treturn $this->get_extra_permastruct('category');\n\t}\n\n\t/**\n\t * Retrieve the permalink structure for tags.\n\t *\n\t * If the tag_base property has no value, then the tag structure will have\n\t * the front property value, followed by 'tag', and finally '%tag%'. If it\n\t * does, then the root property will be used, along with the tag_base\n\t * property value.\n\t *\n\t * @since 2.3.0\n\t * @access public\n\t *\n\t * @return string|false False on failure. Tag permalink structure.\n\t */\n\tpublic function get_tag_permastruct() {\n\t\treturn $this->get_extra_permastruct('post_tag');\n\t}\n\n\t/**\n\t * Retrieves an extra permalink structure by name.\n\t *\n\t * @since 2.5.0\n\t * @access public\n\t *\n\t * @param string $name Permalink structure name.\n\t * @return string|false False if not found. Permalink structure string.\n\t */\n\tpublic function get_extra_permastruct($name) {\n\t\tif ( empty($this->permalink_structure) )\n\t\t\treturn false;\n\n\t\tif ( isset($this->extra_permastructs[$name]) )\n\t\t\treturn $this->extra_permastructs[$name]['struct'];\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Retrieves the author permalink structure.\n\t *\n\t * The permalink structure is front property, author base, and finally\n\t * '/%author%'. Will set the author_structure property and then return it\n\t * without attempting to set the value again.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string|false False if not found. Permalink structure string.\n\t */\n\tpublic function get_author_permastruct() {\n\t\tif ( isset($this->author_structure) )\n\t\t\treturn $this->author_structure;\n\n\t\tif ( empty($this->permalink_structure) ) {\n\t\t\t$this->author_structure = '';\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->author_structure = $this->front . $this->author_base . '/%author%';\n\n\t\treturn $this->author_structure;\n\t}\n\n\t/**\n\t * Retrieves the search permalink structure.\n\t *\n\t * The permalink structure is root property, search base, and finally\n\t * '/%search%'. Will set the search_structure property and then return it\n\t * without attempting to set the value again.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string|false False if not found. Permalink structure string.\n\t */\n\tpublic function get_search_permastruct() {\n\t\tif ( isset($this->search_structure) )\n\t\t\treturn $this->search_structure;\n\n\t\tif ( empty($this->permalink_structure) ) {\n\t\t\t$this->search_structure = '';\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->search_structure = $this->root . $this->search_base . '/%search%';\n\n\t\treturn $this->search_structure;\n\t}\n\n\t/**\n\t * Retrieves the page permalink structure.\n\t *\n\t * The permalink structure is root property, and '%pagename%'. Will set the\n\t * page_structure property and then return it without attempting to set the\n\t * value again.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string|false False if not found. Permalink structure string.\n\t */\n\tpublic function get_page_permastruct() {\n\t\tif ( isset($this->page_structure) )\n\t\t\treturn $this->page_structure;\n\n\t\tif (empty($this->permalink_structure)) {\n\t\t\t$this->page_structure = '';\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->page_structure = $this->root . '%pagename%';\n\n\t\treturn $this->page_structure;\n\t}\n\n\t/**\n\t * Retrieves the feed permalink structure.\n\t *\n\t * The permalink structure is root property, feed base, and finally\n\t * '/%feed%'. Will set the feed_structure property and then return it\n\t * without attempting to set the value again.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string|false False if not found. Permalink structure string.\n\t */\n\tpublic function get_feed_permastruct() {\n\t\tif ( isset($this->feed_structure) )\n\t\t\treturn $this->feed_structure;\n\n\t\tif ( empty($this->permalink_structure) ) {\n\t\t\t$this->feed_structure = '';\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->feed_structure = $this->root . $this->feed_base . '/%feed%';\n\n\t\treturn $this->feed_structure;\n\t}\n\n\t/**\n\t * Retrieves the comment feed permalink structure.\n\t *\n\t * The permalink structure is root property, comment base property, feed\n\t * base and finally '/%feed%'. Will set the comment_feed_structure property\n\t * and then return it without attempting to set the value again.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string|false False if not found. Permalink structure string.\n\t */\n\tpublic function get_comment_feed_permastruct() {\n\t\tif ( isset($this->comment_feed_structure) )\n\t\t\treturn $this->comment_feed_structure;\n\n\t\tif (empty($this->permalink_structure)) {\n\t\t\t$this->comment_feed_structure = '';\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->comment_feed_structure = $this->root . $this->comments_base . '/' . $this->feed_base . '/%feed%';\n\n\t\treturn $this->comment_feed_structure;\n\t}\n\n\t/**\n\t * Adds or updates existing rewrite tags (e.g. %postname%).\n\t *\n\t * If the tag already exists, replace the existing pattern and query for\n\t * that tag, otherwise add the new tag.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @see WP_Rewrite::$rewritecode\n\t * @see WP_Rewrite::$rewritereplace\n\t * @see WP_Rewrite::$queryreplace\n\t *\n\t * @param string $tag   Name of the rewrite tag to add or update.\n\t * @param string $regex Regular expression to substitute the tag for in rewrite rules.\n\t * @param string $query String to append to the rewritten query. Must end in '='.\n\t */\n\tpublic function add_rewrite_tag( $tag, $regex, $query ) {\n\t\t$position = array_search( $tag, $this->rewritecode );\n\t\tif ( false !== $position && null !== $position ) {\n\t\t\t$this->rewritereplace[ $position ] = $regex;\n\t\t\t$this->queryreplace[ $position ] = $query;\n\t\t} else {\n\t\t\t$this->rewritecode[] = $tag;\n\t\t\t$this->rewritereplace[] = $regex;\n\t\t\t$this->queryreplace[] = $query;\n\t\t}\n\t}\n\n\t/**\n\t * Generates rewrite rules from a permalink structure.\n\t *\n\t * The main WP_Rewrite function for building the rewrite rule list. The\n\t * contents of the function is a mix of black magic and regular expressions,\n\t * so best just ignore the contents and move to the parameters.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @param string $permalink_structure The permalink structure.\n\t * @param int    $ep_mask             Optional. Endpoint mask defining what endpoints are added to the structure.\n\t *                                    Accepts `EP_NONE`, `EP_PERMALINK`, `EP_ATTACHMENT`, `EP_DATE`, `EP_YEAR`,\n\t *                                    `EP_MONTH`, `EP_DAY`, `EP_ROOT`, `EP_COMMENTS`, `EP_SEARCH`, `EP_CATEGORIES`,\n\t *                                    `EP_TAGS`, `EP_AUTHORS`, `EP_PAGES`, `EP_ALL_ARCHIVES`, and `EP_ALL`.\n\t *                                    Default `EP_NONE`.\n\t * @param bool   $paged               Optional. Whether archive pagination rules should be added for the structure.\n\t *                                    Default true.\n\t * @param bool   $feed                Optional Whether feed rewrite rules should be added for the structure.\n\t *                                    Default true.\n\t * @param bool   $forcomments         Optional. Whether the feed rules should be a query for a comments feed.\n\t *                                    Default false.\n\t * @param bool   $walk_dirs           Optional. Whether the 'directories' making up the structure should be walked\n\t *                                    over and rewrite rules built for each in-turn. Default true.\n\t * @param bool   $endpoints           Optional. Whether endpoints should be applied to the generated rewrite rules.\n\t *                                    Default true.\n\t * @return array Rewrite rule list.\n\t */\n\tpublic function generate_rewrite_rules($permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true) {\n\t\t// Build a regex to match the feed section of URLs, something like (feed|atom|rss|rss2)/?\n\t\t$feedregex2 = '';\n\t\tforeach ( (array) $this->feeds as $feed_name)\n\t\t\t$feedregex2 .= $feed_name . '|';\n\t\t$feedregex2 = '(' . trim($feedregex2, '|') . ')/?$';\n\n\t\t/*\n\t\t * $feedregex is identical but with /feed/ added on as well, so URLs like <permalink>/feed/atom\n\t\t * and <permalink>/atom are both possible\n\t\t */\n\t\t$feedregex = $this->feed_base . '/' . $feedregex2;\n\n\t\t// Build a regex to match the trackback and page/xx parts of URLs.\n\t\t$trackbackregex = 'trackback/?$';\n\t\t$pageregex = $this->pagination_base . '/?([0-9]{1,})/?$';\n\t\t$commentregex = $this->comments_pagination_base . '-([0-9]{1,})/?$';\n\t\t$embedregex = 'embed/?$';\n\n\t\t// Build up an array of endpoint regexes to append => queries to append.\n\t\tif ( $endpoints ) {\n\t\t\t$ep_query_append = array ();\n\t\t\tforeach ( (array) $this->endpoints as $endpoint) {\n\t\t\t\t// Match everything after the endpoint name, but allow for nothing to appear there.\n\t\t\t\t$epmatch = $endpoint[1] . '(/(.*))?/?$';\n\n\t\t\t\t// This will be appended on to the rest of the query for each dir.\n\t\t\t\t$epquery = '&' . $endpoint[2] . '=';\n\t\t\t\t$ep_query_append[$epmatch] = array ( $endpoint[0], $epquery );\n\t\t\t}\n\t\t}\n\n\t\t// Get everything up to the first rewrite tag.\n\t\t$front = substr($permalink_structure, 0, strpos($permalink_structure, '%'));\n\n\t\t// Build an array of the tags (note that said array ends up being in $tokens[0]).\n\t\tpreg_match_all('/%.+?%/', $permalink_structure, $tokens);\n\n\t\t$num_tokens = count($tokens[0]);\n\n\t\t$index = $this->index; //probably 'index.php'\n\t\t$feedindex = $index;\n\t\t$trackbackindex = $index;\n\t\t$embedindex = $index;\n\n\t\t/*\n\t\t * Build a list from the rewritecode and queryreplace arrays, that will look something\n\t\t * like tagname=$matches[i] where i is the current $i.\n\t\t */\n\t\t$queries = array();\n\t\tfor ( $i = 0; $i < $num_tokens; ++$i ) {\n\t\t\tif ( 0 < $i )\n\t\t\t\t$queries[$i] = $queries[$i - 1] . '&';\n\t\t\telse\n\t\t\t\t$queries[$i] = '';\n\n\t\t\t$query_token = str_replace($this->rewritecode, $this->queryreplace, $tokens[0][$i]) . $this->preg_index($i+1);\n\t\t\t$queries[$i] .= $query_token;\n\t\t}\n\n\t\t// Get the structure, minus any cruft (stuff that isn't tags) at the front.\n\t\t$structure = $permalink_structure;\n\t\tif ( $front != '/' )\n\t\t\t$structure = str_replace($front, '', $structure);\n\n\t\t/*\n\t\t * Create a list of dirs to walk over, making rewrite rules for each level\n\t\t * so for example, a $structure of /%year%/%monthnum%/%postname% would create\n\t\t * rewrite rules for /%year%/, /%year%/%monthnum%/ and /%year%/%monthnum%/%postname%\n\t\t */\n\t\t$structure = trim($structure, '/');\n\t\t$dirs = $walk_dirs ? explode('/', $structure) : array( $structure );\n\t\t$num_dirs = count($dirs);\n\n\t\t// Strip slashes from the front of $front.\n\t\t$front = preg_replace('|^/+|', '', $front);\n\n\t\t// The main workhorse loop.\n\t\t$post_rewrite = array();\n\t\t$struct = $front;\n\t\tfor ( $j = 0; $j < $num_dirs; ++$j ) {\n\t\t\t// Get the struct for this dir, and trim slashes off the front.\n\t\t\t$struct .= $dirs[$j] . '/'; // Accumulate. see comment near explode('/', $structure) above.\n\t\t\t$struct = ltrim($struct, '/');\n\n\t\t\t// Replace tags with regexes.\n\t\t\t$match = str_replace($this->rewritecode, $this->rewritereplace, $struct);\n\n\t\t\t// Make a list of tags, and store how many there are in $num_toks.\n\t\t\t$num_toks = preg_match_all('/%.+?%/', $struct, $toks);\n\n\t\t\t// Get the 'tagname=$matches[i]'.\n\t\t\t$query = ( ! empty( $num_toks ) && isset( $queries[$num_toks - 1] ) ) ? $queries[$num_toks - 1] : '';\n\n\t\t\t// Set up $ep_mask_specific which is used to match more specific URL types.\n\t\t\tswitch ( $dirs[$j] ) {\n\t\t\t\tcase '%year%':\n\t\t\t\t\t$ep_mask_specific = EP_YEAR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '%monthnum%':\n\t\t\t\t\t$ep_mask_specific = EP_MONTH;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '%day%':\n\t\t\t\t\t$ep_mask_specific = EP_DAY;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$ep_mask_specific = EP_NONE;\n\t\t\t}\n\n\t\t\t// Create query for /page/xx.\n\t\t\t$pagematch = $match . $pageregex;\n\t\t\t$pagequery = $index . '?' . $query . '&paged=' . $this->preg_index($num_toks + 1);\n\n\t\t\t// Create query for /comment-page-xx.\n\t\t\t$commentmatch = $match . $commentregex;\n\t\t\t$commentquery = $index . '?' . $query . '&cpage=' . $this->preg_index($num_toks + 1);\n\n\t\t\tif ( get_option('page_on_front') ) {\n\t\t\t\t// Create query for Root /comment-page-xx.\n\t\t\t\t$rootcommentmatch = $match . $commentregex;\n\t\t\t\t$rootcommentquery = $index . '?' . $query . '&page_id=' . get_option('page_on_front') . '&cpage=' . $this->preg_index($num_toks + 1);\n\t\t\t}\n\n\t\t\t// Create query for /feed/(feed|atom|rss|rss2|rdf).\n\t\t\t$feedmatch = $match . $feedregex;\n\t\t\t$feedquery = $feedindex . '?' . $query . '&feed=' . $this->preg_index($num_toks + 1);\n\n\t\t\t// Create query for /(feed|atom|rss|rss2|rdf) (see comment near creation of $feedregex).\n\t\t\t$feedmatch2 = $match . $feedregex2;\n\t\t\t$feedquery2 = $feedindex . '?' . $query . '&feed=' . $this->preg_index($num_toks + 1);\n\n\t\t\t// If asked to, turn the feed queries into comment feed ones.\n\t\t\tif ( $forcomments ) {\n\t\t\t\t$feedquery .= '&withcomments=1';\n\t\t\t\t$feedquery2 .= '&withcomments=1';\n\t\t\t}\n\n\t\t\t// Start creating the array of rewrites for this dir.\n\t\t\t$rewrite = array();\n\n\t\t\t// ...adding on /feed/ regexes => queries\n\t\t\tif ( $feed ) {\n\t\t\t\t$rewrite = array( $feedmatch => $feedquery, $feedmatch2 => $feedquery2 );\n\t\t\t}\n\n\t\t\t//...and /page/xx ones\n\t\t\tif ( $paged ) {\n\t\t\t\t$rewrite = array_merge( $rewrite, array( $pagematch => $pagequery ) );\n\t\t\t}\n\n\t\t\t// Only on pages with comments add ../comment-page-xx/.\n\t\t\tif ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask ) {\n\t\t\t\t$rewrite = array_merge($rewrite, array($commentmatch => $commentquery));\n\t\t\t} elseif ( EP_ROOT & $ep_mask && get_option('page_on_front') ) {\n\t\t\t\t$rewrite = array_merge($rewrite, array($rootcommentmatch => $rootcommentquery));\n\t\t\t}\n\n\t\t\t// Do endpoints.\n\t\t\tif ( $endpoints ) {\n\t\t\t\tforeach ( (array) $ep_query_append as $regex => $ep) {\n\t\t\t\t\t// Add the endpoints on if the mask fits.\n\t\t\t\t\tif ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific )\n\t\t\t\t\t\t$rewrite[$match . $regex] = $index . '?' . $query . $ep[1] . $this->preg_index($num_toks + 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we've got some tags in this dir.\n\t\t\tif ( $num_toks ) {\n\t\t\t\t$post = false;\n\t\t\t\t$page = false;\n\n\t\t\t\t/*\n\t\t\t\t * Check to see if this dir is permalink-level: i.e. the structure specifies an\n\t\t\t\t * individual post. Do this by checking it contains at least one of 1) post name,\n\t\t\t\t * 2) post ID, 3) page name, 4) timestamp (year, month, day, hour, second and\n\t\t\t\t * minute all present). Set these flags now as we need them for the endpoints.\n\t\t\t\t */\n\t\t\t\tif ( strpos($struct, '%postname%') !== false\n\t\t\t\t\t\t|| strpos($struct, '%post_id%') !== false\n\t\t\t\t\t\t|| strpos($struct, '%pagename%') !== false\n\t\t\t\t\t\t|| (strpos($struct, '%year%') !== false && strpos($struct, '%monthnum%') !== false && strpos($struct, '%day%') !== false && strpos($struct, '%hour%') !== false && strpos($struct, '%minute%') !== false && strpos($struct, '%second%') !== false)\n\t\t\t\t\t\t) {\n\t\t\t\t\t$post = true;\n\t\t\t\t\tif ( strpos($struct, '%pagename%') !== false )\n\t\t\t\t\t\t$page = true;\n\t\t\t\t}\n\n\t\t\t\tif ( ! $post ) {\n\t\t\t\t\t// For custom post types, we need to add on endpoints as well.\n\t\t\t\t\tforeach ( get_post_types( array('_builtin' => false ) ) as $ptype ) {\n\t\t\t\t\t\tif ( strpos($struct, \"%$ptype%\") !== false ) {\n\t\t\t\t\t\t\t$post = true;\n\n\t\t\t\t\t\t\t// This is for page style attachment URLs.\n\t\t\t\t\t\t\t$page = is_post_type_hierarchical( $ptype );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If creating rules for a permalink, do all the endpoints like attachments etc.\n\t\t\t\tif ( $post ) {\n\t\t\t\t\t// Create query and regex for trackback.\n\t\t\t\t\t$trackbackmatch = $match . $trackbackregex;\n\t\t\t\t\t$trackbackquery = $trackbackindex . '?' . $query . '&tb=1';\n\n\t\t\t\t\t// Create query and regex for embeds.\n\t\t\t\t\t$embedmatch = $match . $embedregex;\n\t\t\t\t\t$embedquery = $embedindex . '?' . $query . '&embed=true';\n\n\t\t\t\t\t// Trim slashes from the end of the regex for this dir.\n\t\t\t\t\t$match = rtrim($match, '/');\n\n\t\t\t\t\t// Get rid of brackets.\n\t\t\t\t\t$submatchbase = str_replace( array('(', ')'), '', $match);\n\n\t\t\t\t\t// Add a rule for at attachments, which take the form of <permalink>/some-text.\n\t\t\t\t\t$sub1 = $submatchbase . '/([^/]+)/';\n\n\t\t\t\t\t// Add trackback regex <permalink>/trackback/...\n\t\t\t\t\t$sub1tb = $sub1 . $trackbackregex;\n\n\t\t\t\t\t// And <permalink>/feed/(atom|...)\n\t\t\t\t\t$sub1feed = $sub1 . $feedregex;\n\n\t\t\t\t\t// And <permalink>/(feed|atom...)\n\t\t\t\t\t$sub1feed2 = $sub1 . $feedregex2;\n\n\t\t\t\t\t// And <permalink>/comment-page-xx\n\t\t\t\t\t$sub1comment = $sub1 . $commentregex;\n\n\t\t\t\t\t// And <permalink>/embed/...\n\t\t\t\t\t$sub1embed = $sub1 . $embedregex;\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Add another rule to match attachments in the explicit form:\n\t\t\t\t\t * <permalink>/attachment/some-text\n\t\t\t\t\t */\n\t\t\t\t\t$sub2 = $submatchbase . '/attachment/([^/]+)/';\n\n\t\t\t\t\t// And add trackbacks <permalink>/attachment/trackback.\n\t\t\t\t\t$sub2tb = $sub2 . $trackbackregex;\n\n\t\t\t\t\t// Feeds, <permalink>/attachment/feed/(atom|...)\n\t\t\t\t\t$sub2feed = $sub2 . $feedregex;\n\n\t\t\t\t\t// And feeds again on to this <permalink>/attachment/(feed|atom...)\n\t\t\t\t\t$sub2feed2 = $sub2 . $feedregex2;\n\n\t\t\t\t\t// And <permalink>/comment-page-xx\n\t\t\t\t\t$sub2comment = $sub2 . $commentregex;\n\n\t\t\t\t\t// And <permalink>/embed/...\n\t\t\t\t\t$sub2embed = $sub2 . $embedregex;\n\n\t\t\t\t\t// Create queries for these extra tag-ons we've just dealt with.\n\t\t\t\t\t$subquery = $index . '?attachment=' . $this->preg_index(1);\n\t\t\t\t\t$subtbquery = $subquery . '&tb=1';\n\t\t\t\t\t$subfeedquery = $subquery . '&feed=' . $this->preg_index(2);\n\t\t\t\t\t$subcommentquery = $subquery . '&cpage=' . $this->preg_index(2);\n\t\t\t\t\t$subembedquery = $subquery . '&embed=true';\n\n\t\t\t\t\t// Do endpoints for attachments.\n\t\t\t\t\tif ( !empty($endpoints) ) {\n\t\t\t\t\t\tforeach ( (array) $ep_query_append as $regex => $ep ) {\n\t\t\t\t\t\t\tif ( $ep[0] & EP_ATTACHMENT ) {\n\t\t\t\t\t\t\t\t$rewrite[$sub1 . $regex] = $subquery . $ep[1] . $this->preg_index(3);\n\t\t\t\t\t\t\t\t$rewrite[$sub2 . $regex] = $subquery . $ep[1] . $this->preg_index(3);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Now we've finished with endpoints, finish off the $sub1 and $sub2 matches\n\t\t\t\t\t * add a ? as we don't have to match that last slash, and finally a $ so we\n\t\t\t\t\t * match to the end of the URL\n\t\t\t\t\t */\n\t\t\t\t\t$sub1 .= '?$';\n\t\t\t\t\t$sub2 .= '?$';\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Post pagination, e.g. <permalink>/2/\n\t\t\t\t\t * Previously: '(/[0-9]+)?/?$', which produced '/2' for page.\n\t\t\t\t\t * When cast to int, returned 0.\n\t\t\t\t\t */\n\t\t\t\t\t$match = $match . '(?:/([0-9]+))?/?$';\n\t\t\t\t\t$query = $index . '?' . $query . '&page=' . $this->preg_index($num_toks + 1);\n\n\t\t\t\t// Not matching a permalink so this is a lot simpler.\n\t\t\t\t} else {\n\t\t\t\t\t// Close the match and finalise the query.\n\t\t\t\t\t$match .= '?$';\n\t\t\t\t\t$query = $index . '?' . $query;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Create the final array for this dir by joining the $rewrite array (which currently\n\t\t\t\t * only contains rules/queries for trackback, pages etc) to the main regex/query for\n\t\t\t\t * this dir\n\t\t\t\t */\n\t\t\t\t$rewrite = array_merge($rewrite, array($match => $query));\n\n\t\t\t\t// If we're matching a permalink, add those extras (attachments etc) on.\n\t\t\t\tif ( $post ) {\n\t\t\t\t\t// Add trackback.\n\t\t\t\t\t$rewrite = array_merge(array($trackbackmatch => $trackbackquery), $rewrite);\n\n\t\t\t\t\t// Add embed.\n\t\t\t\t\t$rewrite = array_merge( array( $embedmatch => $embedquery ), $rewrite );\n\n\t\t\t\t\t// Add regexes/queries for attachments, attachment trackbacks and so on.\n\t\t\t\t\tif ( ! $page ) {\n\t\t\t\t\t\t// Require <permalink>/attachment/stuff form for pages because of confusion with subpages.\n\t\t\t\t\t\t$rewrite = array_merge( $rewrite, array(\n\t\t\t\t\t\t\t$sub1        => $subquery,\n\t\t\t\t\t\t\t$sub1tb      => $subtbquery,\n\t\t\t\t\t\t\t$sub1feed    => $subfeedquery,\n\t\t\t\t\t\t\t$sub1feed2   => $subfeedquery,\n\t\t\t\t\t\t\t$sub1comment => $subcommentquery,\n\t\t\t\t\t\t\t$sub1embed   => $subembedquery\n\t\t\t\t\t\t) );\n\t\t\t\t\t}\n\n\t\t\t\t\t$rewrite = array_merge( array( $sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery, $sub2comment => $subcommentquery, $sub2embed => $subembedquery ), $rewrite );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Add the rules for this dir to the accumulating $post_rewrite.\n\t\t\t$post_rewrite = array_merge($rewrite, $post_rewrite);\n\t\t}\n\n\t\t// The finished rules. phew!\n\t\treturn $post_rewrite;\n\t}\n\n\t/**\n\t * Generates rewrite rules with permalink structure and walking directory only.\n\t *\n\t * Shorten version of WP_Rewrite::generate_rewrite_rules() that allows for shorter\n\t * list of parameters. See the method for longer description of what generating\n\t * rewrite rules does.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @see WP_Rewrite::generate_rewrite_rules() See for long description and rest of parameters.\n\t *\n\t * @param string $permalink_structure The permalink structure to generate rules.\n\t * @param bool   $walk_dirs           Optional, default is false. Whether to create list of directories to walk over.\n\t * @return array\n\t */\n\tpublic function generate_rewrite_rule($permalink_structure, $walk_dirs = false) {\n\t\treturn $this->generate_rewrite_rules($permalink_structure, EP_NONE, false, false, false, $walk_dirs);\n\t}\n\n\t/**\n\t * Constructs rewrite matches and queries from permalink structure.\n\t *\n\t * Runs the action 'generate_rewrite_rules' with the parameter that is an\n\t * reference to the current WP_Rewrite instance to further manipulate the\n\t * permalink structures and rewrite rules. Runs the 'rewrite_rules_array'\n\t * filter on the full rewrite rule array.\n\t *\n\t * There are two ways to manipulate the rewrite rules, one by hooking into\n\t * the 'generate_rewrite_rules' action and gaining full control of the\n\t * object or just manipulating the rewrite rule array before it is passed\n\t * from the function.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return array An associate array of matches and queries.\n\t */\n\tpublic function rewrite_rules() {\n\t\t$rewrite = array();\n\n\t\tif ( empty($this->permalink_structure) )\n\t\t\treturn $rewrite;\n\n\t\t// robots.txt -only if installed at the root\n\t\t$home_path = parse_url( home_url() );\n\t\t$robots_rewrite = ( empty( $home_path['path'] ) || '/' == $home_path['path'] ) ? array( 'robots\\.txt$' => $this->index . '?robots=1' ) : array();\n\n\t\t// Old feed and service files.\n\t\t$deprecated_files = array(\n\t\t\t'.*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$' => $this->index . '?feed=old',\n\t\t\t'.*wp-app\\.php(/.*)?$' => $this->index . '?error=403',\n\t\t);\n\n\t\t// Registration rules.\n\t\t$registration_pages = array();\n\t\tif ( is_multisite() && is_main_site() ) {\n\t\t\t$registration_pages['.*wp-signup.php$'] = $this->index . '?signup=true';\n\t\t\t$registration_pages['.*wp-activate.php$'] = $this->index . '?activate=true';\n\t\t}\n\n\t\t// Deprecated.\n\t\t$registration_pages['.*wp-register.php$'] = $this->index . '?register=true';\n\n\t\t// Post rewrite rules.\n\t\t$post_rewrite = $this->generate_rewrite_rules( $this->permalink_structure, EP_PERMALINK );\n\n\t\t/**\n\t\t * Filter rewrite rules used for \"post\" archives.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $post_rewrite The rewrite rules for posts.\n\t\t */\n\t\t$post_rewrite = apply_filters( 'post_rewrite_rules', $post_rewrite );\n\n\t\t// Date rewrite rules.\n\t\t$date_rewrite = $this->generate_rewrite_rules($this->get_date_permastruct(), EP_DATE);\n\n\t\t/**\n\t\t * Filter rewrite rules used for date archives.\n\t\t *\n\t\t * Likely date archives would include /yyyy/, /yyyy/mm/, and /yyyy/mm/dd/.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $date_rewrite The rewrite rules for date archives.\n\t\t */\n\t\t$date_rewrite = apply_filters( 'date_rewrite_rules', $date_rewrite );\n\n\t\t// Root-level rewrite rules.\n\t\t$root_rewrite = $this->generate_rewrite_rules($this->root . '/', EP_ROOT);\n\n\t\t/**\n\t\t * Filter rewrite rules used for root-level archives.\n\t\t *\n\t\t * Likely root-level archives would include pagination rules for the homepage\n\t\t * as well as site-wide post feeds (e.g. /feed/, and /feed/atom/).\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $root_rewrite The root-level rewrite rules.\n\t\t */\n\t\t$root_rewrite = apply_filters( 'root_rewrite_rules', $root_rewrite );\n\n\t\t// Comments rewrite rules.\n\t\t$comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, EP_COMMENTS, false, true, true, false);\n\n\t\t/**\n\t\t * Filter rewrite rules used for comment feed archives.\n\t\t *\n\t\t * Likely comments feed archives include /comments/feed/, and /comments/feed/atom/.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $comments_rewrite The rewrite rules for the site-wide comments feeds.\n\t\t */\n\t\t$comments_rewrite = apply_filters( 'comments_rewrite_rules', $comments_rewrite );\n\n\t\t// Search rewrite rules.\n\t\t$search_structure = $this->get_search_permastruct();\n\t\t$search_rewrite = $this->generate_rewrite_rules($search_structure, EP_SEARCH);\n\n\t\t/**\n\t\t * Filter rewrite rules used for search archives.\n\t\t *\n\t\t * Likely search-related archives include /search/search+query/ as well as\n\t\t * pagination and feed paths for a search.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $search_rewrite The rewrite rules for search queries.\n\t\t */\n\t\t$search_rewrite = apply_filters( 'search_rewrite_rules', $search_rewrite );\n\n\t\t// Author rewrite rules.\n\t\t$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS);\n\n\t\t/**\n\t\t * Filter rewrite rules used for author archives.\n\t\t *\n\t\t * Likely author archives would include /author/author-name/, as well as\n\t\t * pagination and feed paths for author archives.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $author_rewrite The rewrite rules for author archives.\n\t\t */\n\t\t$author_rewrite = apply_filters( 'author_rewrite_rules', $author_rewrite );\n\n\t\t// Pages rewrite rules.\n\t\t$page_rewrite = $this->page_rewrite_rules();\n\n\t\t/**\n\t\t * Filter rewrite rules used for \"page\" post type archives.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $page_rewrite The rewrite rules for the \"page\" post type.\n\t\t */\n\t\t$page_rewrite = apply_filters( 'page_rewrite_rules', $page_rewrite );\n\n\t\t// Extra permastructs.\n\t\tforeach ( $this->extra_permastructs as $permastructname => $struct ) {\n\t\t\tif ( is_array( $struct ) ) {\n\t\t\t\tif ( count( $struct ) == 2 )\n\t\t\t\t\t$rules = $this->generate_rewrite_rules( $struct[0], $struct[1] );\n\t\t\t\telse\n\t\t\t\t\t$rules = $this->generate_rewrite_rules( $struct['struct'], $struct['ep_mask'], $struct['paged'], $struct['feed'], $struct['forcomments'], $struct['walk_dirs'], $struct['endpoints'] );\n\t\t\t} else {\n\t\t\t\t$rules = $this->generate_rewrite_rules( $struct );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter rewrite rules used for individual permastructs.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$permastructname`, refers\n\t\t\t * to the name of the registered permastruct, e.g. 'post_tag' (tags),\n\t\t\t * 'category' (categories), etc.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param array $rules The rewrite rules generated for the current permastruct.\n\t\t\t */\n\t\t\t$rules = apply_filters( $permastructname . '_rewrite_rules', $rules );\n\t\t\tif ( 'post_tag' == $permastructname ) {\n\n\t\t\t\t/**\n\t\t\t\t * Filter rewrite rules used specifically for Tags.\n\t\t\t\t *\n\t\t\t\t * @since 2.3.0\n\t\t\t\t * @deprecated 3.1.0 Use 'post_tag_rewrite_rules' instead\n\t\t\t\t *\n\t\t\t\t * @param array $rules The rewrite rules generated for tags.\n\t\t\t\t */\n\t\t\t\t$rules = apply_filters( 'tag_rewrite_rules', $rules );\n\t\t\t}\n\n\t\t\t$this->extra_rules_top = array_merge($this->extra_rules_top, $rules);\n\t\t}\n\n\t\t// Put them together.\n\t\tif ( $this->use_verbose_page_rules )\n\t\t\t$this->rules = array_merge($this->extra_rules_top, $robots_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite,  $author_rewrite, $date_rewrite, $page_rewrite, $post_rewrite, $this->extra_rules);\n\t\telse\n\t\t\t$this->rules = array_merge($this->extra_rules_top, $robots_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite,  $author_rewrite, $date_rewrite, $post_rewrite, $page_rewrite, $this->extra_rules);\n\n\t\t/**\n\t\t * Fires after the rewrite rules are generated.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param WP_Rewrite $this Current WP_Rewrite instance, passed by reference.\n\t\t */\n\t\tdo_action_ref_array( 'generate_rewrite_rules', array( &$this ) );\n\n\t\t/**\n\t\t * Filter the full set of generated rewrite rules.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $this->rules The compiled array of rewrite rules.\n\t\t */\n\t\t$this->rules = apply_filters( 'rewrite_rules_array', $this->rules );\n\n\t\treturn $this->rules;\n\t}\n\n\t/**\n\t * Retrieves the rewrite rules.\n\t *\n\t * The difference between this method and WP_Rewrite::rewrite_rules() is that\n\t * this method stores the rewrite rules in the 'rewrite_rules' option and retrieves\n\t * it. This prevents having to process all of the permalinks to get the rewrite rules\n\t * in the form of caching.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return array Rewrite rules.\n\t */\n\tpublic function wp_rewrite_rules() {\n\t\t$this->rules = get_option('rewrite_rules');\n\t\tif ( empty($this->rules) ) {\n\t\t\t$this->matches = 'matches';\n\t\t\t$this->rewrite_rules();\n\t\t\tupdate_option('rewrite_rules', $this->rules);\n\t\t}\n\n\t\treturn $this->rules;\n\t}\n\n\t/**\n\t * Retrieves mod_rewrite-formatted rewrite rules to write to .htaccess.\n\t *\n\t * Does not actually write to the .htaccess file, but creates the rules for\n\t * the process that will.\n\t *\n\t * Will add the non_wp_rules property rules to the .htaccess file before\n\t * the WordPress rewrite rules one.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return string\n\t */\n\tpublic function mod_rewrite_rules() {\n\t\tif ( ! $this->using_permalinks() )\n\t\t\treturn '';\n\n\t\t$site_root = parse_url( site_url() );\n\t\tif ( isset( $site_root['path'] ) )\n\t\t\t$site_root = trailingslashit($site_root['path']);\n\n\t\t$home_root = parse_url(home_url());\n\t\tif ( isset( $home_root['path'] ) )\n\t\t\t$home_root = trailingslashit($home_root['path']);\n\t\telse\n\t\t\t$home_root = '/';\n\n\t\t$rules = \"<IfModule mod_rewrite.c>\\n\";\n\t\t$rules .= \"RewriteEngine On\\n\";\n\t\t$rules .= \"RewriteBase $home_root\\n\";\n\n\t\t// Prevent -f checks on index.php.\n\t\t$rules .= \"RewriteRule ^index\\.php$ - [L]\\n\";\n\n\t\t// Add in the rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all).\n\t\tforeach ( (array) $this->non_wp_rules as $match => $query) {\n\t\t\t// Apache 1.3 does not support the reluctant (non-greedy) modifier.\n\t\t\t$match = str_replace('.+?', '.+', $match);\n\n\t\t\t$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . \" [QSA,L]\\n\";\n\t\t}\n\n\t\tif ( $this->use_verbose_rules ) {\n\t\t\t$this->matches = '';\n\t\t\t$rewrite = $this->rewrite_rules();\n\t\t\t$num_rules = count($rewrite);\n\t\t\t$rules .= \"RewriteCond %{REQUEST_FILENAME} -f [OR]\\n\" .\n\t\t\t\t\"RewriteCond %{REQUEST_FILENAME} -d\\n\" .\n\t\t\t\t\"RewriteRule ^.*$ - [S=$num_rules]\\n\";\n\n\t\t\tforeach ( (array) $rewrite as $match => $query) {\n\t\t\t\t// Apache 1.3 does not support the reluctant (non-greedy) modifier.\n\t\t\t\t$match = str_replace('.+?', '.+', $match);\n\n\t\t\t\tif ( strpos($query, $this->index) !== false )\n\t\t\t\t\t$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . \" [QSA,L]\\n\";\n\t\t\t\telse\n\t\t\t\t\t$rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . \" [QSA,L]\\n\";\n\t\t\t}\n\t\t} else {\n\t\t\t$rules .= \"RewriteCond %{REQUEST_FILENAME} !-f\\n\" .\n\t\t\t\t\"RewriteCond %{REQUEST_FILENAME} !-d\\n\" .\n\t\t\t\t\"RewriteRule . {$home_root}{$this->index} [L]\\n\";\n\t\t}\n\n\t\t$rules .= \"</IfModule>\\n\";\n\n\t\t/**\n\t\t * Filter the list of rewrite rules formatted for output to an .htaccess file.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess.\n\t\t */\n\t\t$rules = apply_filters( 'mod_rewrite_rules', $rules );\n\n\t\t/**\n\t\t * Filter the list of rewrite rules formatted for output to an .htaccess file.\n\t\t *\n\t\t * @since 1.5.0\n\t\t * @deprecated 1.5.0 Use the mod_rewrite_rules filter instead.\n\t\t *\n\t\t * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess.\n\t\t */\n\t\treturn apply_filters( 'rewrite_rules', $rules );\n\t}\n\n\t/**\n\t * Retrieves IIS7 URL Rewrite formatted rewrite rules to write to web.config file.\n\t *\n\t * Does not actually write to the web.config file, but creates the rules for\n\t * the process that will.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @return string\n\t */\n\tpublic function iis7_url_rewrite_rules( $add_parent_tags = false ) {\n\t\tif ( ! $this->using_permalinks() )\n\t\t\treturn '';\n\t\t$rules = '';\n\t\tif ( $add_parent_tags ) {\n\t\t\t$rules .= '<configuration>\n\t<system.webServer>\n\t\t<rewrite>\n\t\t\t<rules>';\n\t\t}\n\n\t\t$rules .= '\n\t\t\t<rule name=\"wordpress\" patternSyntax=\"Wildcard\">\n\t\t\t\t<match url=\"*\" />\n\t\t\t\t\t<conditions>\n\t\t\t\t\t\t<add input=\"{REQUEST_FILENAME}\" matchType=\"IsFile\" negate=\"true\" />\n\t\t\t\t\t\t<add input=\"{REQUEST_FILENAME}\" matchType=\"IsDirectory\" negate=\"true\" />\n\t\t\t\t\t</conditions>\n\t\t\t\t<action type=\"Rewrite\" url=\"index.php\" />\n\t\t\t</rule>';\n\n\t\tif ( $add_parent_tags ) {\n\t\t\t$rules .= '\n\t\t\t</rules>\n\t\t</rewrite>\n\t</system.webServer>\n</configuration>';\n\t\t}\n\n\t\t/**\n\t\t * Filter the list of rewrite rules formatted for output to a web.config.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param string $rules Rewrite rules formatted for IIS web.config.\n\t\t */\n\t\treturn apply_filters( 'iis7_url_rewrite_rules', $rules );\n\t}\n\n\t/**\n\t * Adds a rewrite rule that transforms a URL structure to a set of query vars.\n\t *\n\t * Any value in the $after parameter that isn't 'bottom' will result in the rule\n\t * being placed at the top of the rewrite rules.\n\t *\n\t * @since 2.1.0\n\t * @since 4.4.0 Array support was added to the `$query` parameter.\n\t * @access public\n\t *\n\t * @param string       $regex Regular expression to match request against.\n\t * @param string|array $query The corresponding query vars for this rewrite rule.\n\t * @param string       $after Optional. Priority of the new rule. Accepts 'top'\n\t *                            or 'bottom'. Default 'bottom'.\n\t */\n\tpublic function add_rule( $regex, $query, $after = 'bottom' ) {\n\t\tif ( is_array( $query ) ) {\n\t\t\t$external = false;\n\t\t\t$query = add_query_arg( $query, 'index.php' );\n\t\t} else {\n\t\t\t$index = false === strpos( $query, '?' ) ? strlen( $query ) : strpos( $query, '?' );\n\t\t\t$front = substr( $query, 0, $index );\n\n\t\t\t$external = $front != $this->index;\n\t\t}\n\n\t\t// \"external\" = it doesn't correspond to index.php.\n\t\tif ( $external ) {\n\t\t\t$this->add_external_rule( $regex, $query );\n\t\t} else {\n\t\t\tif ( 'bottom' == $after ) {\n\t\t\t\t$this->extra_rules = array_merge( $this->extra_rules, array( $regex => $query ) );\n\t\t\t} else {\n\t\t\t\t$this->extra_rules_top = array_merge( $this->extra_rules_top, array( $regex => $query ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Adds a rewrite rule that doesn't correspond to index.php.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param string $regex Regular expression to match request against.\n\t * @param string $query The corresponding query vars for this rewrite rule.\n\t */\n\tpublic function add_external_rule( $regex, $query ) {\n\t\t$this->non_wp_rules[ $regex ] = $query;\n\t}\n\n\t/**\n\t * Adds an endpoint, like /trackback/.\n\t *\n\t * @since 2.1.0\n\t * @since 3.9.0 $query_var parameter added.\n\t * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`.\n\t * @access public\n\t *\n\t * @see add_rewrite_endpoint() for full documentation.\n\t * @global WP $wp\n\t *\n\t * @param string      $name      Name of the endpoint.\n\t * @param int         $places    Endpoint mask describing the places the endpoint should be added.\n\t * @param string|bool $query_var Optional. Name of the corresponding query variable. Pass `false` to\n\t *                               skip registering a query_var for this endpoint. Defaults to the\n\t *                               value of `$name`.\n\t */\n\tpublic function add_endpoint( $name, $places, $query_var = true ) {\n\t\tglobal $wp;\n\n\t\t// For backward compatibility, if null has explicitly been passed as `$query_var`, assume `true`.\n\t\tif ( true === $query_var || null === func_get_arg( 2 ) ) {\n\t\t\t$query_var = $name;\n\t\t}\n\t\t$this->endpoints[] = array( $places, $name, $query_var );\n\n\t\tif ( $query_var ) {\n\t\t\t$wp->add_query_var( $query_var );\n\t\t}\n\t}\n\n\t/**\n\t * Adds a new permalink structure.\n\t *\n\t * A permalink structure (permastruct) is an abstract definition of a set of rewrite rules;\n\t * it is an easy way of expressing a set of regular expressions that rewrite to a set of\n\t * query strings. The new permastruct is added to the WP_Rewrite::$extra_permastructs array.\n\t *\n\t * When the rewrite rules are built by WP_Rewrite::rewrite_rules(), all of these extra\n\t * permastructs are passed to WP_Rewrite::generate_rewrite_rules() which transforms them\n\t * into the regular expressions that many love to hate.\n\t *\n\t * The `$args` parameter gives you control over how WP_Rewrite::generate_rewrite_rules()\n\t * works on the new permastruct.\n\t *\n\t * @since 2.5.0\n\t * @access public\n\t *\n\t * @param string $name   Name for permalink structure.\n\t * @param string $struct Permalink structure (e.g. category/%category%)\n\t * @param array  $args   {\n\t *     Optional. Arguments for building rewrite rules based on the permalink structure.\n\t *     Default empty array.\n\t *\n\t *     @type bool $with_front  Whether the structure should be prepended with `WP_Rewrite::$front`.\n\t *                             Default true.\n\t *     @type int  $ep_mask     The endpoint mask defining which endpoints are added to the structure.\n\t *                             Accepts `EP_NONE`, `EP_PERMALINK`, `EP_ATTACHMENT`, `EP_DATE`, `EP_YEAR`,\n\t *                             `EP_MONTH`, `EP_DAY`, `EP_ROOT`, `EP_COMMENTS`, `EP_SEARCH`, `EP_CATEGORIES`,\n\t *                             `EP_TAGS`, `EP_AUTHORS`, `EP_PAGES`, `EP_ALL_ARCHIVES`, and `EP_ALL`.\n\t *                             Default `EP_NONE`.\n\t *     @type bool $paged       Whether archive pagination rules should be added for the structure.\n\t *                             Default true.\n\t *     @type bool $feed        Whether feed rewrite rules should be added for the structure. Default true.\n\t *     @type bool $forcomments Whether the feed rules should be a query for a comments feed. Default false.\n\t *     @type bool $walk_dirs   Whether the 'directories' making up the structure should be walked over\n\t *                             and rewrite rules built for each in-turn. Default true.\n\t *     @type bool $endpoints   Whether endpoints should be applied to the generated rules. Default true.\n\t * }\n\t */\n\tpublic function add_permastruct( $name, $struct, $args = array() ) {\n\t\t// Backwards compatibility for the old parameters: $with_front and $ep_mask.\n\t\tif ( ! is_array( $args ) )\n\t\t\t$args = array( 'with_front' => $args );\n\t\tif ( func_num_args() == 4 )\n\t\t\t$args['ep_mask'] = func_get_arg( 3 );\n\n\t\t$defaults = array(\n\t\t\t'with_front' => true,\n\t\t\t'ep_mask' => EP_NONE,\n\t\t\t'paged' => true,\n\t\t\t'feed' => true,\n\t\t\t'forcomments' => false,\n\t\t\t'walk_dirs' => true,\n\t\t\t'endpoints' => true,\n\t\t);\n\t\t$args = array_intersect_key( $args, $defaults );\n\t\t$args = wp_parse_args( $args, $defaults );\n\n\t\tif ( $args['with_front'] )\n\t\t\t$struct = $this->front . $struct;\n\t\telse\n\t\t\t$struct = $this->root . $struct;\n\t\t$args['struct'] = $struct;\n\n\t\t$this->extra_permastructs[ $name ] = $args;\n\t}\n\n\t/**\n\t * Removes rewrite rules and then recreate rewrite rules.\n\t *\n\t * Calls WP_Rewrite::wp_rewrite_rules() after removing the 'rewrite_rules' option.\n\t * If the function named 'save_mod_rewrite_rules' exists, it will be called.\n\t *\n\t * @since 2.0.1\n\t * @access public\n\t *\n\t * @staticvar bool $do_hard_later\n\t *\n\t * @param bool $hard Whether to update .htaccess (hard flush) or just update rewrite_rules option (soft flush). Default is true (hard).\n\t */\n\tpublic function flush_rules( $hard = true ) {\n\t\tstatic $do_hard_later = null;\n\n\t\t// Prevent this action from running before everyone has registered their rewrites.\n\t\tif ( ! did_action( 'wp_loaded' ) ) {\n\t\t\tadd_action( 'wp_loaded', array( $this, 'flush_rules' ) );\n\t\t\t$do_hard_later = ( isset( $do_hard_later ) ) ? $do_hard_later || $hard : $hard;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isset( $do_hard_later ) ) {\n\t\t\t$hard = $do_hard_later;\n\t\t\tunset( $do_hard_later );\n\t\t}\n\n\t\tdelete_option('rewrite_rules');\n\t\t$this->wp_rewrite_rules();\n\n\t\t/**\n\t\t * Filter whether a \"hard\" rewrite rule flush should be performed when requested.\n\t\t *\n\t\t * A \"hard\" flush updates .htaccess (Apache) or web.config (IIS).\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param bool $hard Whether to flush rewrite rules \"hard\". Default true.\n\t\t */\n\t\tif ( ! $hard || ! apply_filters( 'flush_rewrite_rules_hard', true ) ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( function_exists( 'save_mod_rewrite_rules' ) )\n\t\t\tsave_mod_rewrite_rules();\n\t\tif ( function_exists( 'iis7_save_url_rewrite_rules' ) )\n\t\t\tiis7_save_url_rewrite_rules();\n\t}\n\n\t/**\n\t * Sets up the object's properties.\n\t *\n\t * The 'use_verbose_page_rules' object property will be set to true if the\n\t * permalink structure begins with one of the following: '%postname%', '%category%',\n\t * '%tag%', or '%author%'.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t */\n\tpublic function init() {\n\t\t$this->extra_rules = $this->non_wp_rules = $this->endpoints = array();\n\t\t$this->permalink_structure = get_option('permalink_structure');\n\t\t$this->front = substr($this->permalink_structure, 0, strpos($this->permalink_structure, '%'));\n\t\t$this->root = '';\n\n\t\tif ( $this->using_index_permalinks() )\n\t\t\t$this->root = $this->index . '/';\n\n\t\tunset($this->author_structure);\n\t\tunset($this->date_structure);\n\t\tunset($this->page_structure);\n\t\tunset($this->search_structure);\n\t\tunset($this->feed_structure);\n\t\tunset($this->comment_feed_structure);\n\t\t$this->use_trailing_slashes = ( '/' == substr($this->permalink_structure, -1, 1) );\n\n\t\t// Enable generic rules for pages if permalink structure doesn't begin with a wildcard.\n\t\tif ( preg_match(\"/^[^%]*%(?:postname|category|tag|author)%/\", $this->permalink_structure) )\n\t\t\t $this->use_verbose_page_rules = true;\n\t\telse\n\t\t\t$this->use_verbose_page_rules = false;\n\t}\n\n\t/**\n\t * Sets the main permalink structure for the site.\n\t *\n\t * Will update the 'permalink_structure' option, if there is a difference\n\t * between the current permalink structure and the parameter value. Calls\n\t * WP_Rewrite::init() after the option is updated.\n\t *\n\t * Fires the 'permalink_structure_changed' action once the init call has\n\t * processed passing the old and new values\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @param string $permalink_structure Permalink structure.\n\t */\n\tpublic function set_permalink_structure($permalink_structure) {\n\t\tif ( $permalink_structure != $this->permalink_structure ) {\n\t\t\t$old_permalink_structure = $this->permalink_structure;\n\t\t\tupdate_option('permalink_structure', $permalink_structure);\n\n\t\t\t$this->init();\n\n\t\t\t/**\n\t\t\t * Fires after the permalink structure is updated.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param string $old_permalink_structure The previous permalink structure.\n\t\t\t * @param string $permalink_structure     The new permalink structure.\n\t\t\t */\n\t\t\tdo_action( 'permalink_structure_changed', $old_permalink_structure, $permalink_structure );\n\t\t}\n\t}\n\n\t/**\n\t * Sets the category base for the category permalink.\n\t *\n\t * Will update the 'category_base' option, if there is a difference between\n\t * the current category base and the parameter value. Calls WP_Rewrite::init()\n\t * after the option is updated.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @param string $category_base Category permalink structure base.\n\t */\n\tpublic function set_category_base($category_base) {\n\t\tif ( $category_base != get_option('category_base') ) {\n\t\t\tupdate_option('category_base', $category_base);\n\t\t\t$this->init();\n\t\t}\n\t}\n\n\t/**\n\t * Sets the tag base for the tag permalink.\n\t *\n\t * Will update the 'tag_base' option, if there is a difference between the\n\t * current tag base and the parameter value. Calls WP_Rewrite::init() after\n\t * the option is updated.\n\t *\n\t * @since 2.3.0\n\t * @access public\n\t *\n\t * @param string $tag_base Tag permalink structure base.\n\t */\n\tpublic function set_tag_base( $tag_base ) {\n\t\tif ( $tag_base != get_option( 'tag_base') ) {\n\t\t\tupdate_option( 'tag_base', $tag_base );\n\t\t\t$this->init();\n\t\t}\n\t}\n\n\t/**\n\t * Constructor - Calls init(), which runs setup.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t */\n\tpublic function __construct() {\n\t\t$this->init();\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-role.php",
    "content": "<?php\n/**\n * User API: WP_Role class\n *\n * @package WordPress\n * @subpackage Users\n * @since 4.4.0\n */\n\n/**\n * Core class used to extend the user roles API.\n *\n * @since 2.0.0\n */\nclass WP_Role {\n\t/**\n\t * Role name.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $name;\n\n\t/**\n\t * List of capabilities the role contains.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $capabilities;\n\n\t/**\n\t * Constructor - Set up object properties.\n\t *\n\t * The list of capabilities, must have the key as the name of the capability\n\t * and the value a boolean of whether it is granted to the role.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t * @param array $capabilities List of capabilities.\n\t */\n\tpublic function __construct( $role, $capabilities ) {\n\t\t$this->name = $role;\n\t\t$this->capabilities = $capabilities;\n\t}\n\n\t/**\n\t * Assign role a capability.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $cap Capability name.\n\t * @param bool $grant Whether role has capability privilege.\n\t */\n\tpublic function add_cap( $cap, $grant = true ) {\n\t\t$this->capabilities[$cap] = $grant;\n\t\twp_roles()->add_cap( $this->name, $cap, $grant );\n\t}\n\n\t/**\n\t * Remove capability from role.\n\t *\n\t * This is a container for {@link WP_Roles::remove_cap()} to remove the\n\t * capability from the role. That is to say, that {@link\n\t * WP_Roles::remove_cap()} implements the functionality, but it also makes\n\t * sense to use this class, because you don't need to enter the role name.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $cap Capability name.\n\t */\n\tpublic function remove_cap( $cap ) {\n\t\tunset( $this->capabilities[$cap] );\n\t\twp_roles()->remove_cap( $this->name, $cap );\n\t}\n\n\t/**\n\t * Whether role has capability.\n\t *\n\t * The capabilities is passed through the 'role_has_cap' filter. The first\n\t * parameter for the hook is the list of capabilities the class has\n\t * assigned. The second parameter is the capability name to look for. The\n\t * third and final parameter for the hook is the role name.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $cap Capability name.\n\t * @return bool True, if user has capability. False, if doesn't have capability.\n\t */\n\tpublic function has_cap( $cap ) {\n\t\t/**\n\t\t * Filter which capabilities a role has.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param array  $capabilities Array of role capabilities.\n\t\t * @param string $cap          Capability name.\n\t\t * @param string $name         Role name.\n\t\t */\n\t\t$capabilities = apply_filters( 'role_has_cap', $this->capabilities, $cap, $this->name );\n\t\tif ( !empty( $capabilities[$cap] ) )\n\t\t\treturn $capabilities[$cap];\n\t\telse\n\t\t\treturn false;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-roles.php",
    "content": "<?php\n/**\n * User API: WP_Roles class\n *\n * @package WordPress\n * @subpackage Users\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a user roles API.\n *\n * The role option is simple, the structure is organized by role name that store\n * the name in value of the 'name' key. The capabilities are stored as an array\n * in the value of the 'capability' key.\n *\n *     array (\n *    \t\t'rolename' => array (\n *    \t\t\t'name' => 'rolename',\n *    \t\t\t'capabilities' => array()\n *    \t\t)\n *     )\n *\n * @since 2.0.0\n */\nclass WP_Roles {\n\t/**\n\t * List of roles and capabilities.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $roles;\n\n\t/**\n\t * List of the role objects.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $role_objects = array();\n\n\t/**\n\t * List of role names.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $role_names = array();\n\n\t/**\n\t * Option name for storing role list.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $role_key;\n\n\t/**\n\t * Whether to use the database for retrieval and storage.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $use_db = true;\n\n\t/**\n\t * Constructor\n\t *\n\t * @since 2.0.0\n\t */\n\tpublic function __construct() {\n\t\t$this->_init();\n\t}\n\n\t/**\n\t * Make private/protected methods readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param callable $name      Method to call.\n\t * @param array    $arguments Arguments to pass when calling.\n\t * @return mixed|false Return value of the callback, false otherwise.\n\t */\n\tpublic function __call( $name, $arguments ) {\n\t\tif ( '_init' === $name ) {\n\t\t\treturn call_user_func_array( array( $this, $name ), $arguments );\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Set up the object properties.\n\t *\n\t * The role key is set to the current prefix for the $wpdb object with\n\t * 'user_roles' appended. If the $wp_user_roles global is set, then it will\n\t * be used and the role option will not be updated or used.\n\t *\n\t * @since 2.1.0\n\t * @access protected\n\t *\n\t * @global wpdb  $wpdb          WordPress database abstraction object.\n\t * @global array $wp_user_roles Used to set the 'roles' property value.\n\t */\n\tprotected function _init() {\n\t\tglobal $wpdb, $wp_user_roles;\n\t\t$this->role_key = $wpdb->get_blog_prefix() . 'user_roles';\n\t\tif ( ! empty( $wp_user_roles ) ) {\n\t\t\t$this->roles = $wp_user_roles;\n\t\t\t$this->use_db = false;\n\t\t} else {\n\t\t\t$this->roles = get_option( $this->role_key );\n\t\t}\n\n\t\tif ( empty( $this->roles ) )\n\t\t\treturn;\n\n\t\t$this->role_objects = array();\n\t\t$this->role_names =  array();\n\t\tforeach ( array_keys( $this->roles ) as $role ) {\n\t\t\t$this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] );\n\t\t\t$this->role_names[$role] = $this->roles[$role]['name'];\n\t\t}\n\t}\n\n\t/**\n\t * Reinitialize the object\n\t *\n\t * Recreates the role objects. This is typically called only by switch_to_blog()\n\t * after switching wpdb to a new blog ID.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t */\n\tpublic function reinit() {\n\t\t// There is no need to reinit if using the wp_user_roles global.\n\t\tif ( ! $this->use_db )\n\t\t\treturn;\n\n\t\tglobal $wpdb;\n\n\t\t// Duplicated from _init() to avoid an extra function call.\n\t\t$this->role_key = $wpdb->get_blog_prefix() . 'user_roles';\n\t\t$this->roles = get_option( $this->role_key );\n\t\tif ( empty( $this->roles ) )\n\t\t\treturn;\n\n\t\t$this->role_objects = array();\n\t\t$this->role_names =  array();\n\t\tforeach ( array_keys( $this->roles ) as $role ) {\n\t\t\t$this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] );\n\t\t\t$this->role_names[$role] = $this->roles[$role]['name'];\n\t\t}\n\t}\n\n\t/**\n\t * Add role name with capabilities to list.\n\t *\n\t * Updates the list of roles, if the role doesn't already exist.\n\t *\n\t * The capabilities are defined in the following format `array( 'read' => true );`\n\t * To explicitly deny a role a capability you set the value for that capability to false.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t * @param string $display_name Role display name.\n\t * @param array $capabilities List of role capabilities in the above format.\n\t * @return WP_Role|void WP_Role object, if role is added.\n\t */\n\tpublic function add_role( $role, $display_name, $capabilities = array() ) {\n\t\tif ( empty( $role ) || isset( $this->roles[ $role ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->roles[$role] = array(\n\t\t\t'name' => $display_name,\n\t\t\t'capabilities' => $capabilities\n\t\t\t);\n\t\tif ( $this->use_db )\n\t\t\tupdate_option( $this->role_key, $this->roles );\n\t\t$this->role_objects[$role] = new WP_Role( $role, $capabilities );\n\t\t$this->role_names[$role] = $display_name;\n\t\treturn $this->role_objects[$role];\n\t}\n\n\t/**\n\t * Remove role by name.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t */\n\tpublic function remove_role( $role ) {\n\t\tif ( ! isset( $this->role_objects[$role] ) )\n\t\t\treturn;\n\n\t\tunset( $this->role_objects[$role] );\n\t\tunset( $this->role_names[$role] );\n\t\tunset( $this->roles[$role] );\n\n\t\tif ( $this->use_db )\n\t\t\tupdate_option( $this->role_key, $this->roles );\n\n\t\tif ( get_option( 'default_role' ) == $role )\n\t\t\tupdate_option( 'default_role', 'subscriber' );\n\t}\n\n\t/**\n\t * Add capability to role.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t * @param string $cap Capability name.\n\t * @param bool $grant Optional, default is true. Whether role is capable of performing capability.\n\t */\n\tpublic function add_cap( $role, $cap, $grant = true ) {\n\t\tif ( ! isset( $this->roles[$role] ) )\n\t\t\treturn;\n\n\t\t$this->roles[$role]['capabilities'][$cap] = $grant;\n\t\tif ( $this->use_db )\n\t\t\tupdate_option( $this->role_key, $this->roles );\n\t}\n\n\t/**\n\t * Remove capability from role.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t * @param string $cap Capability name.\n\t */\n\tpublic function remove_cap( $role, $cap ) {\n\t\tif ( ! isset( $this->roles[$role] ) )\n\t\t\treturn;\n\n\t\tunset( $this->roles[$role]['capabilities'][$cap] );\n\t\tif ( $this->use_db )\n\t\t\tupdate_option( $this->role_key, $this->roles );\n\t}\n\n\t/**\n\t * Retrieve role object by name.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t * @return WP_Role|null WP_Role object if found, null if the role does not exist.\n\t */\n\tpublic function get_role( $role ) {\n\t\tif ( isset( $this->role_objects[$role] ) )\n\t\t\treturn $this->role_objects[$role];\n\t\telse\n\t\t\treturn null;\n\t}\n\n\t/**\n\t * Retrieve list of role names.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @return array List of role names.\n\t */\n\tpublic function get_names() {\n\t\treturn $this->role_names;\n\t}\n\n\t/**\n\t * Whether role name is currently in the list of available roles.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name to look up.\n\t * @return bool\n\t */\n\tpublic function is_role( $role ) {\n\t\treturn isset( $this->role_names[$role] );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-tax-query.php",
    "content": "<?php\n/**\n * Taxonomy API: WP_Tax_Query class\n *\n * @package WordPress\n * @subpackage Taxonomy\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement taxonomy queries for the Taxonomy API.\n *\n * Used for generating SQL clauses that filter a primary query according to object\n * taxonomy terms.\n *\n * WP_Tax_Query is a helper that allows primary query classes, such as WP_Query, to filter\n * their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be\n * attached to the primary SQL query string.\n *\n * @since 3.1.0\n */\nclass WP_Tax_Query {\n\n\t/**\n\t * Array of taxonomy queries.\n\t *\n\t * See {@see WP_Tax_Query::__construct()} for information on tax query arguments.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $queries = array();\n\n\t/**\n\t * The relation between the queries. Can be one of 'AND' or 'OR'.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $relation;\n\n\t/**\n\t * Standard response when the query should not return any rows.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @static\n\t * @access private\n\t * @var string\n\t */\n\tprivate static $no_results = array( 'join' => array( '' ), 'where' => array( '0 = 1' ) );\n\n\t/**\n\t * A flat list of table aliases used in the JOIN clauses.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $table_aliases = array();\n\n\t/**\n\t * Terms and taxonomies fetched by this query.\n\t *\n\t * We store this data in a flat array because they are referenced in a\n\t * number of places by WP_Query.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $queried_terms = array();\n\n\t/**\n\t * Database table that where the metadata's objects are stored (eg $wpdb->users).\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $primary_table;\n\n\t/**\n\t * Column in 'primary_table' that represents the ID of the object.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $primary_id_column;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.1.0\n\t * @since 4.1.0 Added support for `$operator` 'NOT EXISTS' and 'EXISTS' values.\n\t * @access public\n\t *\n\t * @param array $tax_query {\n\t *     Array of taxonomy query clauses.\n\t *\n\t *     @type string $relation Optional. The MySQL keyword used to join\n\t *                            the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'.\n\t *     @type array {\n\t *         Optional. An array of first-order clause parameters, or another fully-formed tax query.\n\t *\n\t *         @type string           $taxonomy         Taxonomy being queried. Optional when field=term_taxonomy_id.\n\t *         @type string|int|array $terms            Term or terms to filter by.\n\t *         @type string           $field            Field to match $terms against. Accepts 'term_id', 'slug',\n\t *                                                 'name', or 'term_taxonomy_id'. Default: 'term_id'.\n\t *         @type string           $operator         MySQL operator to be used with $terms in the WHERE clause.\n\t *                                                  Accepts 'AND', 'IN', 'NOT IN', 'EXISTS', 'NOT EXISTS'.\n\t *                                                  Default: 'IN'.\n\t *         @type bool             $include_children Optional. Whether to include child terms.\n\t *                                                  Requires a $taxonomy. Default: true.\n\t *     }\n\t * }\n\t */\n\tpublic function __construct( $tax_query ) {\n\t\tif ( isset( $tax_query['relation'] ) ) {\n\t\t\t$this->relation = $this->sanitize_relation( $tax_query['relation'] );\n\t\t} else {\n\t\t\t$this->relation = 'AND';\n\t\t}\n\n\t\t$this->queries = $this->sanitize_query( $tax_query );\n\t}\n\n\t/**\n\t * Ensure the 'tax_query' argument passed to the class constructor is well-formed.\n\t *\n\t * Ensures that each query-level clause has a 'relation' key, and that\n\t * each first-order clause contains all the necessary keys from `$defaults`.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @param array $queries Array of queries clauses.\n\t * @return array Sanitized array of query clauses.\n\t */\n\tpublic function sanitize_query( $queries ) {\n\t\t$cleaned_query = array();\n\n\t\t$defaults = array(\n\t\t\t'taxonomy' => '',\n\t\t\t'terms' => array(),\n\t\t\t'field' => 'term_id',\n\t\t\t'operator' => 'IN',\n\t\t\t'include_children' => true,\n\t\t);\n\n\t\tforeach ( $queries as $key => $query ) {\n\t\t\tif ( 'relation' === $key ) {\n\t\t\t\t$cleaned_query['relation'] = $this->sanitize_relation( $query );\n\n\t\t\t// First-order clause.\n\t\t\t} elseif ( self::is_first_order_clause( $query ) ) {\n\n\t\t\t\t$cleaned_clause = array_merge( $defaults, $query );\n\t\t\t\t$cleaned_clause['terms'] = (array) $cleaned_clause['terms'];\n\t\t\t\t$cleaned_query[] = $cleaned_clause;\n\n\t\t\t\t/*\n\t\t\t\t * Keep a copy of the clause in the flate\n\t\t\t\t * $queried_terms array, for use in WP_Query.\n\t\t\t\t */\n\t\t\t\tif ( ! empty( $cleaned_clause['taxonomy'] ) && 'NOT IN' !== $cleaned_clause['operator'] ) {\n\t\t\t\t\t$taxonomy = $cleaned_clause['taxonomy'];\n\t\t\t\t\tif ( ! isset( $this->queried_terms[ $taxonomy ] ) ) {\n\t\t\t\t\t\t$this->queried_terms[ $taxonomy ] = array();\n\t\t\t\t\t}\n\n\t\t\t\t\t/*\n\t\t\t\t\t * Backward compatibility: Only store the first\n\t\t\t\t\t * 'terms' and 'field' found for a given taxonomy.\n\t\t\t\t\t */\n\t\t\t\t\tif ( ! empty( $cleaned_clause['terms'] ) && ! isset( $this->queried_terms[ $taxonomy ]['terms'] ) ) {\n\t\t\t\t\t\t$this->queried_terms[ $taxonomy ]['terms'] = $cleaned_clause['terms'];\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! empty( $cleaned_clause['field'] ) && ! isset( $this->queried_terms[ $taxonomy ]['field'] ) ) {\n\t\t\t\t\t\t$this->queried_terms[ $taxonomy ]['field'] = $cleaned_clause['field'];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Otherwise, it's a nested query, so we recurse.\n\t\t\t} elseif ( is_array( $query ) ) {\n\t\t\t\t$cleaned_subquery = $this->sanitize_query( $query );\n\n\t\t\t\tif ( ! empty( $cleaned_subquery ) ) {\n\t\t\t\t\t// All queries with children must have a relation.\n\t\t\t\t\tif ( ! isset( $cleaned_subquery['relation'] ) ) {\n\t\t\t\t\t\t$cleaned_subquery['relation'] = 'AND';\n\t\t\t\t\t}\n\n\t\t\t\t\t$cleaned_query[] = $cleaned_subquery;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $cleaned_query;\n\t}\n\n\t/**\n\t * Sanitize a 'relation' operator.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @param string $relation Raw relation key from the query argument.\n\t * @return string Sanitized relation ('AND' or 'OR').\n\t */\n\tpublic function sanitize_relation( $relation ) {\n\t\tif ( 'OR' === strtoupper( $relation ) ) {\n\t\t\treturn 'OR';\n\t\t} else {\n\t\t\treturn 'AND';\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether a clause is first-order.\n\t *\n\t * A \"first-order\" clause is one that contains any of the first-order\n\t * clause keys ('terms', 'taxonomy', 'include_children', 'field',\n\t * 'operator'). An empty clause also counts as a first-order clause,\n\t * for backward compatibility. Any clause that doesn't meet this is\n\t * determined, by process of elimination, to be a higher-order query.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @static\n\t * @access protected\n\t *\n\t * @param array $query Tax query arguments.\n\t * @return bool Whether the query clause is a first-order clause.\n\t */\n\tprotected static function is_first_order_clause( $query ) {\n\t\treturn is_array( $query ) && ( empty( $query ) || array_key_exists( 'terms', $query ) || array_key_exists( 'taxonomy', $query ) || array_key_exists( 'include_children', $query ) || array_key_exists( 'field', $query ) || array_key_exists( 'operator', $query ) );\n\t}\n\n\t/**\n\t * Generates SQL clauses to be appended to a main query.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @param string $primary_table     Database table where the object being filtered is stored (eg wp_users).\n\t * @param string $primary_id_column ID column for the filtered object in $primary_table.\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to the main query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tpublic function get_sql( $primary_table, $primary_id_column ) {\n\t\t$this->primary_table = $primary_table;\n\t\t$this->primary_id_column = $primary_id_column;\n\n\t\treturn $this->get_sql_clauses();\n\t}\n\n\t/**\n\t * Generate SQL clauses to be appended to a main query.\n\t *\n\t * Called by the public WP_Tax_Query::get_sql(), this method\n\t * is abstracted out to maintain parity with the other Query classes.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to the main query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tprotected function get_sql_clauses() {\n\t\t/*\n\t\t * $queries are passed by reference to get_sql_for_query() for recursion.\n\t\t * To keep $this->queries unaltered, pass a copy.\n\t\t */\n\t\t$queries = $this->queries;\n\t\t$sql = $this->get_sql_for_query( $queries );\n\n\t\tif ( ! empty( $sql['where'] ) ) {\n\t\t\t$sql['where'] = ' AND ' . $sql['where'];\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t/**\n\t * Generate SQL clauses for a single query array.\n\t *\n\t * If nested subqueries are found, this method recurses the tree to\n\t * produce the properly nested SQL.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @param array $query Query to parse, passed by reference.\n\t * @param int   $depth Optional. Number of tree levels deep we currently are.\n\t *                     Used to calculate indentation. Default 0.\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to a single query array.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tprotected function get_sql_for_query( &$query, $depth = 0 ) {\n\t\t$sql_chunks = array(\n\t\t\t'join'  => array(),\n\t\t\t'where' => array(),\n\t\t);\n\n\t\t$sql = array(\n\t\t\t'join'  => '',\n\t\t\t'where' => '',\n\t\t);\n\n\t\t$indent = '';\n\t\tfor ( $i = 0; $i < $depth; $i++ ) {\n\t\t\t$indent .= \"  \";\n\t\t}\n\n\t\tforeach ( $query as $key => &$clause ) {\n\t\t\tif ( 'relation' === $key ) {\n\t\t\t\t$relation = $query['relation'];\n\t\t\t} elseif ( is_array( $clause ) ) {\n\n\t\t\t\t// This is a first-order clause.\n\t\t\t\tif ( $this->is_first_order_clause( $clause ) ) {\n\t\t\t\t\t$clause_sql = $this->get_sql_for_clause( $clause, $query );\n\n\t\t\t\t\t$where_count = count( $clause_sql['where'] );\n\t\t\t\t\tif ( ! $where_count ) {\n\t\t\t\t\t\t$sql_chunks['where'][] = '';\n\t\t\t\t\t} elseif ( 1 === $where_count ) {\n\t\t\t\t\t\t$sql_chunks['where'][] = $clause_sql['where'][0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )';\n\t\t\t\t\t}\n\n\t\t\t\t\t$sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] );\n\t\t\t\t// This is a subquery, so we recurse.\n\t\t\t\t} else {\n\t\t\t\t\t$clause_sql = $this->get_sql_for_query( $clause, $depth + 1 );\n\n\t\t\t\t\t$sql_chunks['where'][] = $clause_sql['where'];\n\t\t\t\t\t$sql_chunks['join'][]  = $clause_sql['join'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Filter to remove empties.\n\t\t$sql_chunks['join']  = array_filter( $sql_chunks['join'] );\n\t\t$sql_chunks['where'] = array_filter( $sql_chunks['where'] );\n\n\t\tif ( empty( $relation ) ) {\n\t\t\t$relation = 'AND';\n\t\t}\n\n\t\t// Filter duplicate JOIN clauses and combine into a single string.\n\t\tif ( ! empty( $sql_chunks['join'] ) ) {\n\t\t\t$sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) );\n\t\t}\n\n\t\t// Generate a single WHERE clause with proper brackets and indentation.\n\t\tif ( ! empty( $sql_chunks['where'] ) ) {\n\t\t\t$sql['where'] = '( ' . \"\\n  \" . $indent . implode( ' ' . \"\\n  \" . $indent . $relation . ' ' . \"\\n  \" . $indent, $sql_chunks['where'] ) . \"\\n\" . $indent . ')';\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t/**\n\t * Generate SQL JOIN and WHERE clauses for a \"first-order\" query clause.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb The WordPress database abstraction object.\n\t *\n\t * @param array $clause       Query clause, passed by reference.\n\t * @param array $parent_query Parent query array.\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to a first-order query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tpublic function get_sql_for_clause( &$clause, $parent_query ) {\n\t\tglobal $wpdb;\n\n\t\t$sql = array(\n\t\t\t'where' => array(),\n\t\t\t'join'  => array(),\n\t\t);\n\n\t\t$join = $where = '';\n\n\t\t$this->clean_query( $clause );\n\n\t\tif ( is_wp_error( $clause ) ) {\n\t\t\treturn self::$no_results;\n\t\t}\n\n\t\t$terms = $clause['terms'];\n\t\t$operator = strtoupper( $clause['operator'] );\n\n\t\tif ( 'IN' == $operator ) {\n\n\t\t\tif ( empty( $terms ) ) {\n\t\t\t\treturn self::$no_results;\n\t\t\t}\n\n\t\t\t$terms = implode( ',', $terms );\n\n\t\t\t/*\n\t\t\t * Before creating another table join, see if this clause has a\n\t\t\t * sibling with an existing join that can be shared.\n\t\t\t */\n\t\t\t$alias = $this->find_compatible_table_alias( $clause, $parent_query );\n\t\t\tif ( false === $alias ) {\n\t\t\t\t$i = count( $this->table_aliases );\n\t\t\t\t$alias = $i ? 'tt' . $i : $wpdb->term_relationships;\n\n\t\t\t\t// Store the alias as part of a flat array to build future iterators.\n\t\t\t\t$this->table_aliases[] = $alias;\n\n\t\t\t\t// Store the alias with this clause, so later siblings can use it.\n\t\t\t\t$clause['alias'] = $alias;\n\n\t\t\t\t$join .= \" INNER JOIN $wpdb->term_relationships\";\n\t\t\t\t$join .= $i ? \" AS $alias\" : '';\n\t\t\t\t$join .= \" ON ($this->primary_table.$this->primary_id_column = $alias.object_id)\";\n\t\t\t}\n\n\n\t\t\t$where = \"$alias.term_taxonomy_id $operator ($terms)\";\n\n\t\t} elseif ( 'NOT IN' == $operator ) {\n\n\t\t\tif ( empty( $terms ) ) {\n\t\t\t\treturn $sql;\n\t\t\t}\n\n\t\t\t$terms = implode( ',', $terms );\n\n\t\t\t$where = \"$this->primary_table.$this->primary_id_column NOT IN (\n\t\t\t\tSELECT object_id\n\t\t\t\tFROM $wpdb->term_relationships\n\t\t\t\tWHERE term_taxonomy_id IN ($terms)\n\t\t\t)\";\n\n\t\t} elseif ( 'AND' == $operator ) {\n\n\t\t\tif ( empty( $terms ) ) {\n\t\t\t\treturn $sql;\n\t\t\t}\n\n\t\t\t$num_terms = count( $terms );\n\n\t\t\t$terms = implode( ',', $terms );\n\n\t\t\t$where = \"(\n\t\t\t\tSELECT COUNT(1)\n\t\t\t\tFROM $wpdb->term_relationships\n\t\t\t\tWHERE term_taxonomy_id IN ($terms)\n\t\t\t\tAND object_id = $this->primary_table.$this->primary_id_column\n\t\t\t) = $num_terms\";\n\n\t\t} elseif ( 'NOT EXISTS' === $operator || 'EXISTS' === $operator ) {\n\n\t\t\t$where = $wpdb->prepare( \"$operator (\n\t\t\t\tSELECT 1\n\t\t\t\tFROM $wpdb->term_relationships\n\t\t\t\tINNER JOIN $wpdb->term_taxonomy\n\t\t\t\tON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id\n\t\t\t\tWHERE $wpdb->term_taxonomy.taxonomy = %s\n\t\t\t\tAND $wpdb->term_relationships.object_id = $this->primary_table.$this->primary_id_column\n\t\t\t)\", $clause['taxonomy'] );\n\n\t\t}\n\n\t\t$sql['join'][]  = $join;\n\t\t$sql['where'][] = $where;\n\t\treturn $sql;\n\t}\n\n\t/**\n\t * Identify an existing table alias that is compatible with the current query clause.\n\t *\n\t * We avoid unnecessary table joins by allowing each clause to look for\n\t * an existing table alias that is compatible with the query that it\n\t * needs to perform.\n\t *\n\t * An existing alias is compatible if (a) it is a sibling of `$clause`\n\t * (ie, it's under the scope of the same relation), and (b) the combination\n\t * of operator and relation between the clauses allows for a shared table\n\t * join. In the case of WP_Tax_Query, this only applies to 'IN'\n\t * clauses that are connected by the relation 'OR'.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @param array       $clause       Query clause.\n\t * @param array       $parent_query Parent query of $clause.\n\t * @return string|false Table alias if found, otherwise false.\n\t */\n\tprotected function find_compatible_table_alias( $clause, $parent_query ) {\n\t\t$alias = false;\n\n\t\t// Sanity check. Only IN queries use the JOIN syntax .\n\t\tif ( ! isset( $clause['operator'] ) || 'IN' !== $clause['operator'] ) {\n\t\t\treturn $alias;\n\t\t}\n\n\t\t// Since we're only checking IN queries, we're only concerned with OR relations.\n\t\tif ( ! isset( $parent_query['relation'] ) || 'OR' !== $parent_query['relation'] ) {\n\t\t\treturn $alias;\n\t\t}\n\n\t\t$compatible_operators = array( 'IN' );\n\n\t\tforeach ( $parent_query as $sibling ) {\n\t\t\tif ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( empty( $sibling['alias'] ) || empty( $sibling['operator'] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// The sibling must both have compatible operator to share its alias.\n\t\t\tif ( in_array( strtoupper( $sibling['operator'] ), $compatible_operators ) ) {\n\t\t\t\t$alias = $sibling['alias'];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn $alias;\n\t}\n\n\t/**\n\t * Validates a single query.\n\t *\n\t * @since 3.2.0\n\t * @access private\n\t *\n\t * @param array &$query The single query.\n\t */\n\tprivate function clean_query( &$query ) {\n\t\tif ( empty( $query['taxonomy'] ) ) {\n\t\t\tif ( 'term_taxonomy_id' !== $query['field'] ) {\n\t\t\t\t$query = new WP_Error( 'Invalid taxonomy' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// so long as there are shared terms, include_children requires that a taxonomy is set\n\t\t\t$query['include_children'] = false;\n\t\t} elseif ( ! taxonomy_exists( $query['taxonomy'] ) ) {\n\t\t\t$query = new WP_Error( 'Invalid taxonomy' );\n\t\t\treturn;\n\t\t}\n\n\t\t$query['terms'] = array_unique( (array) $query['terms'] );\n\n\t\tif ( is_taxonomy_hierarchical( $query['taxonomy'] ) && $query['include_children'] ) {\n\t\t\t$this->transform_query( $query, 'term_id' );\n\n\t\t\tif ( is_wp_error( $query ) )\n\t\t\t\treturn;\n\n\t\t\t$children = array();\n\t\t\tforeach ( $query['terms'] as $term ) {\n\t\t\t\t$children = array_merge( $children, get_term_children( $term, $query['taxonomy'] ) );\n\t\t\t\t$children[] = $term;\n\t\t\t}\n\t\t\t$query['terms'] = $children;\n\t\t}\n\n\t\t$this->transform_query( $query, 'term_taxonomy_id' );\n\t}\n\n\t/**\n\t * Transforms a single query, from one field to another.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @global wpdb $wpdb The WordPress database abstraction object.\n\t *\n\t * @param array  &$query          The single query.\n\t * @param string $resulting_field The resulting field. Accepts 'slug', 'name', 'term_taxonomy_id',\n\t *                                or 'term_id'. Default 'term_id'.\n\t */\n\tpublic function transform_query( &$query, $resulting_field ) {\n\t\tglobal $wpdb;\n\n\t\tif ( empty( $query['terms'] ) )\n\t\t\treturn;\n\n\t\tif ( $query['field'] == $resulting_field )\n\t\t\treturn;\n\n\t\t$resulting_field = sanitize_key( $resulting_field );\n\n\t\tswitch ( $query['field'] ) {\n\t\t\tcase 'slug':\n\t\t\tcase 'name':\n\t\t\t\tforeach ( $query['terms'] as &$term ) {\n\t\t\t\t\t/*\n\t\t\t\t\t * 0 is the $term_id parameter. We don't have a term ID yet, but it doesn't\n\t\t\t\t\t * matter because `sanitize_term_field()` ignores the $term_id param when the\n\t\t\t\t\t * context is 'db'.\n\t\t\t\t\t */\n\t\t\t\t\t$term = \"'\" . esc_sql( sanitize_term_field( $query['field'], $term, 0, $query['taxonomy'], 'db' ) ) . \"'\";\n\t\t\t\t}\n\n\t\t\t\t$terms = implode( \",\", $query['terms'] );\n\n\t\t\t\t$terms = $wpdb->get_col( \"\n\t\t\t\t\tSELECT $wpdb->term_taxonomy.$resulting_field\n\t\t\t\t\tFROM $wpdb->term_taxonomy\n\t\t\t\t\tINNER JOIN $wpdb->terms USING (term_id)\n\t\t\t\t\tWHERE taxonomy = '{$query['taxonomy']}'\n\t\t\t\t\tAND $wpdb->terms.{$query['field']} IN ($terms)\n\t\t\t\t\" );\n\t\t\t\tbreak;\n\t\t\tcase 'term_taxonomy_id':\n\t\t\t\t$terms = implode( ',', array_map( 'intval', $query['terms'] ) );\n\t\t\t\t$terms = $wpdb->get_col( \"\n\t\t\t\t\tSELECT $resulting_field\n\t\t\t\t\tFROM $wpdb->term_taxonomy\n\t\t\t\t\tWHERE term_taxonomy_id IN ($terms)\n\t\t\t\t\" );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$terms = implode( ',', array_map( 'intval', $query['terms'] ) );\n\t\t\t\t$terms = $wpdb->get_col( \"\n\t\t\t\t\tSELECT $resulting_field\n\t\t\t\t\tFROM $wpdb->term_taxonomy\n\t\t\t\t\tWHERE taxonomy = '{$query['taxonomy']}'\n\t\t\t\t\tAND term_id IN ($terms)\n\t\t\t\t\" );\n\t\t}\n\n\t\tif ( 'AND' == $query['operator'] && count( $terms ) < count( $query['terms'] ) ) {\n\t\t\t$query = new WP_Error( 'Inexistent terms' );\n\t\t\treturn;\n\t\t}\n\n\t\t$query['terms'] = $terms;\n\t\t$query['field'] = $resulting_field;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-term.php",
    "content": "<?php\n/**\n * Taxonomy API: WP_Term class\n *\n * @package WordPress\n * @subpackage Taxonomy\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement the WP_Term object.\n *\n * @since 4.4.0\n */\nfinal class WP_Term {\n\n\t/**\n\t * Term ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $term_id;\n\n\t/**\n\t * The term's name.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $name = '';\n\n\t/**\n\t * The term's slug.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $slug = '';\n\n\t/**\n\t * The term's term_group.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $term_group = '';\n\n\t/**\n\t * Term Taxonomy ID.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $term_taxonomy_id = 0;\n\n\t/**\n\t * The term's taxonomy name.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $taxonomy = '';\n\n\t/**\n\t * The term's description.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $description = '';\n\n\t/**\n\t * ID of a term's parent term.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $parent = 0;\n\n\t/**\n\t * Cached object count for this term.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $count = 0;\n\n\t/**\n\t * Stores the term object's sanitization level.\n\t *\n\t * Does not correspond to a database field.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $filter = 'raw';\n\n\t/**\n\t * Retrieve WP_Term instance.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @static\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param int    $term_id  Term ID.\n\t * @param string $taxonomy Optional. Limit matched terms to those matching `$taxonomy`. Only used for\n\t *                         disambiguating potentially shared terms.\n\t * @return WP_Term|WP_Error|false Term object, if found. WP_Error if `$term_id` is shared between taxonomies and\n\t *                                there's insufficient data to distinguish which term is intended.\n\t *                                False for other failures.\n\t */\n\tpublic static function get_instance( $term_id, $taxonomy = null ) {\n\t\tglobal $wpdb;\n\n\t\t$term_id = (int) $term_id;\n\t\tif ( ! $term_id ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$_term = wp_cache_get( $term_id, 'terms' );\n\n\t\t// If there isn't a cached version, hit the database.\n\t\tif ( ! $_term || ( $taxonomy && $taxonomy !== $_term->taxonomy ) ) {\n\t\t\t// Grab all matching terms, in case any are shared between taxonomies.\n\t\t\t$terms = $wpdb->get_results( $wpdb->prepare( \"SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id = %d\", $term_id ) );\n\t\t\tif ( ! $terms ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// If a taxonomy was specified, find a match.\n\t\t\tif ( $taxonomy ) {\n\t\t\t\tforeach ( $terms as $match ) {\n\t\t\t\t\tif ( $taxonomy === $match->taxonomy ) {\n\t\t\t\t\t\t$_term = $match;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// If only one match was found, it's the one we want.\n\t\t\t} elseif ( 1 === count( $terms ) ) {\n\t\t\t\t$_term = reset( $terms );\n\n\t\t\t// Otherwise, the term must be shared between taxonomies.\n\t\t\t} else {\n\t\t\t\t// If the term is shared only with invalid taxonomies, return the one valid term.\n\t\t\t\tforeach ( $terms as $t ) {\n\t\t\t\t\tif ( ! taxonomy_exists( $t->taxonomy ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only hit if we've already identified a term in a valid taxonomy.\n\t\t\t\t\tif ( $_term ) {\n\t\t\t\t\t\treturn new WP_Error( 'ambiguous_term_id', __( 'Term ID is shared between multiple taxonomies' ), $term_id );\n\t\t\t\t\t}\n\n\t\t\t\t\t$_term = $t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! $_term ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Don't return terms from invalid taxonomies.\n\t\t\tif ( ! taxonomy_exists( $_term->taxonomy ) ) {\n\t\t\t\treturn new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );\n\t\t\t}\n\n\t\t\t$_term = sanitize_term( $_term, $_term->taxonomy, 'raw' );\n\n\t\t\t// Don't cache terms that are shared between taxonomies.\n\t\t\tif ( 1 === count( $terms ) ) {\n\t\t\t\twp_cache_add( $term_id, $_term, 'terms' );\n\t\t\t}\n\t\t}\n\n\t\t$term_obj = new WP_Term( $_term );\n\t\t$term_obj->filter( $term_obj->filter );\n\n\t\treturn $term_obj;\n\t}\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_Term|object $term Term object.\n\t */\n\tpublic function __construct( $term ) {\n\t\tforeach ( get_object_vars( $term ) as $key => $value ) {\n\t\t\t$this->$key = $value;\n\t\t}\n\t}\n\n\t/**\n\t * Sanitizes term fields, according to the filter type provided.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $filter Filter context. Accepts 'edit', 'db', 'display', 'attribute', 'js', 'raw'.\n\t */\n\tpublic function filter( $filter ) {\n\t\tsanitize_term( $this, $this->taxonomy, $filter );\n\t}\n\n\t/**\n\t * Converts an object to array.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Object as array.\n\t */\n\tpublic function to_array() {\n\t\treturn get_object_vars( $this );\n\t}\n\n\t/**\n\t * Getter.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return mixed\n\t */\n\tpublic function __get( $key ) {\n\t\tswitch ( $key ) {\n\t\t\tcase 'data' :\n\t\t\t\t$data = new stdClass();\n\t\t\t\t$columns = array( 'term_id', 'name', 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', 'parent', 'count' );\n\t\t\t\tforeach ( $columns as $column ) {\n\t\t\t\t\t$data->{$column} = isset( $this->{$column} ) ? $this->{$column} : null;\n\t\t\t\t}\n\n\t\t\t\treturn sanitize_term( $data, $data->taxonomy, 'raw' );\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-theme.php",
    "content": "<?php\n/**\n * WP_Theme Class\n *\n * @package WordPress\n * @subpackage Theme\n * @since 3.4.0\n */\nfinal class WP_Theme implements ArrayAccess {\n\n\t/**\n\t * Whether the theme has been marked as updateable.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var bool\n\t *\n\t * @see WP_MS_Themes_List_Table\n\t */\n\tpublic $update = false;\n\n\t/**\n\t * Headers for style.css files.\n\t *\n\t * @static\n\t * @access private\n\t * @var array\n\t */\n\tprivate static $file_headers = array(\n\t\t'Name'        => 'Theme Name',\n\t\t'ThemeURI'    => 'Theme URI',\n\t\t'Description' => 'Description',\n\t\t'Author'      => 'Author',\n\t\t'AuthorURI'   => 'Author URI',\n\t\t'Version'     => 'Version',\n\t\t'Template'    => 'Template',\n\t\t'Status'      => 'Status',\n\t\t'Tags'        => 'Tags',\n\t\t'TextDomain'  => 'Text Domain',\n\t\t'DomainPath'  => 'Domain Path',\n\t);\n\n\t/**\n\t * Default themes.\n\t *\n\t * @static\n\t * @access private\n\t * @var array\n\t */\n\tprivate static $default_themes = array(\n\t\t'classic'        => 'WordPress Classic',\n\t\t'default'        => 'WordPress Default',\n\t\t'twentyten'      => 'Twenty Ten',\n\t\t'twentyeleven'   => 'Twenty Eleven',\n\t\t'twentytwelve'   => 'Twenty Twelve',\n\t\t'twentythirteen' => 'Twenty Thirteen',\n\t\t'twentyfourteen' => 'Twenty Fourteen',\n\t\t'twentyfifteen'  => 'Twenty Fifteen',\n\t\t'twentysixteen'  => 'Twenty Sixteen',\n\t);\n\n\t/**\n\t * Renamed theme tags.\n\t *\n\t * @static\n\t * @access private\n\t * @var array\n\t */\n\tprivate static $tag_map = array(\n\t\t'fixed-width'    => 'fixed-layout',\n\t\t'flexible-width' => 'fluid-layout',\n\t);\n\n\t/**\n\t * Absolute path to the theme root, usually wp-content/themes\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tprivate $theme_root;\n\n\t/**\n\t * Header data from the theme's style.css file.\n\t *\n\t * @access private\n\t * @var array\n\t */\n\tprivate $headers = array();\n\n\t/**\n\t * Header data from the theme's style.css file after being sanitized.\n\t *\n\t * @access private\n\t * @var array\n\t */\n\tprivate $headers_sanitized;\n\n\t/**\n\t * Header name from the theme's style.css after being translated.\n\t *\n\t * Cached due to sorting functions running over the translated name.\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tprivate $name_translated;\n\n\t/**\n\t * Errors encountered when initializing the theme.\n\t *\n\t * @access private\n\t * @var WP_Error\n\t */\n\tprivate $errors;\n\n\t/**\n\t * The directory name of the theme's files, inside the theme root.\n\t *\n\t * In the case of a child theme, this is directory name of the child theme.\n\t * Otherwise, 'stylesheet' is the same as 'template'.\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tprivate $stylesheet;\n\n\t/**\n\t * The directory name of the theme's files, inside the theme root.\n\t *\n\t * In the case of a child theme, this is the directory name of the parent theme.\n\t * Otherwise, 'template' is the same as 'stylesheet'.\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tprivate $template;\n\n\t/**\n\t * A reference to the parent theme, in the case of a child theme.\n\t *\n\t * @access private\n\t * @var WP_Theme\n\t */\n\tprivate $parent;\n\n\t/**\n\t * URL to the theme root, usually an absolute URL to wp-content/themes\n\t *\n\t * @access private\n\t * var string\n\t */\n\tprivate $theme_root_uri;\n\n\t/**\n\t * Flag for whether the theme's textdomain is loaded.\n\t *\n\t * @access private\n\t * @var bool\n\t */\n\tprivate $textdomain_loaded;\n\n\t/**\n\t * Stores an md5 hash of the theme root, to function as the cache key.\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tprivate $cache_hash;\n\n\t/**\n\t * Flag for whether the themes cache bucket should be persistently cached.\n\t *\n\t * Default is false. Can be set with the wp_cache_themes_persistently filter.\n\t *\n\t * @static\n\t * @access private\n\t * @var bool\n\t */\n\tprivate static $persistently_cache;\n\n\t/**\n\t * Expiration time for the themes cache bucket.\n\t *\n\t * By default the bucket is not cached, so this value is useless.\n\t *\n\t * @static\n\t * @access private\n\t * @var bool\n\t */\n\tprivate static $cache_expiration = 1800;\n\n\t/**\n\t * Constructor for WP_Theme.\n\t *\n\t * @global array $wp_theme_directories\n\t *\n\t * @param string $theme_dir Directory of the theme within the theme_root.\n\t * @param string $theme_root Theme root.\n\t * @param WP_Error|void $_child If this theme is a parent theme, the child may be passed for validation purposes.\n\t */\n\tpublic function __construct( $theme_dir, $theme_root, $_child = null ) {\n\t\tglobal $wp_theme_directories;\n\n\t\t// Initialize caching on first run.\n\t\tif ( ! isset( self::$persistently_cache ) ) {\n\t\t\t/** This action is documented in wp-includes/theme.php */\n\t\t\tself::$persistently_cache = apply_filters( 'wp_cache_themes_persistently', false, 'WP_Theme' );\n\t\t\tif ( self::$persistently_cache ) {\n\t\t\t\twp_cache_add_global_groups( 'themes' );\n\t\t\t\tif ( is_int( self::$persistently_cache ) )\n\t\t\t\t\tself::$cache_expiration = self::$persistently_cache;\n\t\t\t} else {\n\t\t\t\twp_cache_add_non_persistent_groups( 'themes' );\n\t\t\t}\n\t\t}\n\n\t\t$this->theme_root = $theme_root;\n\t\t$this->stylesheet = $theme_dir;\n\n\t\t// Correct a situation where the theme is 'some-directory/some-theme' but 'some-directory' was passed in as part of the theme root instead.\n\t\tif ( ! in_array( $theme_root, (array) $wp_theme_directories ) && in_array( dirname( $theme_root ), (array) $wp_theme_directories ) ) {\n\t\t\t$this->stylesheet = basename( $this->theme_root ) . '/' . $this->stylesheet;\n\t\t\t$this->theme_root = dirname( $theme_root );\n\t\t}\n\n\t\t$this->cache_hash = md5( $this->theme_root . '/' . $this->stylesheet );\n\t\t$theme_file = $this->stylesheet . '/style.css';\n\n\t\t$cache = $this->cache_get( 'theme' );\n\n\t\tif ( is_array( $cache ) ) {\n\t\t\tforeach ( array( 'errors', 'headers', 'template' ) as $key ) {\n\t\t\t\tif ( isset( $cache[ $key ] ) )\n\t\t\t\t\t$this->$key = $cache[ $key ];\n\t\t\t}\n\t\t\tif ( $this->errors )\n\t\t\t\treturn;\n\t\t\tif ( isset( $cache['theme_root_template'] ) )\n\t\t\t\t$theme_root_template = $cache['theme_root_template'];\n\t\t} elseif ( ! file_exists( $this->theme_root . '/' . $theme_file ) ) {\n\t\t\t$this->headers['Name'] = $this->stylesheet;\n\t\t\tif ( ! file_exists( $this->theme_root . '/' . $this->stylesheet ) )\n\t\t\t\t$this->errors = new WP_Error( 'theme_not_found', sprintf( __( 'The theme directory \"%s\" does not exist.' ), esc_html( $this->stylesheet ) ) );\n\t\t\telse\n\t\t\t\t$this->errors = new WP_Error( 'theme_no_stylesheet', __( 'Stylesheet is missing.' ) );\n\t\t\t$this->template = $this->stylesheet;\n\t\t\t$this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );\n\t\t\tif ( ! file_exists( $this->theme_root ) ) // Don't cache this one.\n\t\t\t\t$this->errors->add( 'theme_root_missing', __( 'ERROR: The themes directory is either empty or doesn&#8217;t exist. Please check your installation.' ) );\n\t\t\treturn;\n\t\t} elseif ( ! is_readable( $this->theme_root . '/' . $theme_file ) ) {\n\t\t\t$this->headers['Name'] = $this->stylesheet;\n\t\t\t$this->errors = new WP_Error( 'theme_stylesheet_not_readable', __( 'Stylesheet is not readable.' ) );\n\t\t\t$this->template = $this->stylesheet;\n\t\t\t$this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );\n\t\t\treturn;\n\t\t} else {\n\t\t\t$this->headers = get_file_data( $this->theme_root . '/' . $theme_file, self::$file_headers, 'theme' );\n\t\t\t// Default themes always trump their pretenders.\n\t\t\t// Properly identify default themes that are inside a directory within wp-content/themes.\n\t\t\tif ( $default_theme_slug = array_search( $this->headers['Name'], self::$default_themes ) ) {\n\t\t\t\tif ( basename( $this->stylesheet ) != $default_theme_slug )\n\t\t\t\t\t$this->headers['Name'] .= '/' . $this->stylesheet;\n\t\t\t}\n\t\t}\n\n\t\t// (If template is set from cache [and there are no errors], we know it's good.)\n\t\tif ( ! $this->template && ! ( $this->template = $this->headers['Template'] ) ) {\n\t\t\t$this->template = $this->stylesheet;\n\t\t\tif ( ! file_exists( $this->theme_root . '/' . $this->stylesheet . '/index.php' ) ) {\n\t\t\t\t$this->errors = new WP_Error( 'theme_no_index', __( 'Template is missing.' ) );\n\t\t\t\t$this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If we got our data from cache, we can assume that 'template' is pointing to the right place.\n\t\tif ( ! is_array( $cache ) && $this->template != $this->stylesheet && ! file_exists( $this->theme_root . '/' . $this->template . '/index.php' ) ) {\n\t\t\t// If we're in a directory of themes inside /themes, look for the parent nearby.\n\t\t\t// wp-content/themes/directory-of-themes/*\n\t\t\t$parent_dir = dirname( $this->stylesheet );\n\t\t\tif ( '.' != $parent_dir && file_exists( $this->theme_root . '/' . $parent_dir . '/' . $this->template . '/index.php' ) ) {\n\t\t\t\t$this->template = $parent_dir . '/' . $this->template;\n\t\t\t} elseif ( ( $directories = search_theme_directories() ) && isset( $directories[ $this->template ] ) ) {\n\t\t\t\t// Look for the template in the search_theme_directories() results, in case it is in another theme root.\n\t\t\t\t// We don't look into directories of themes, just the theme root.\n\t\t\t\t$theme_root_template = $directories[ $this->template ]['theme_root'];\n\t\t\t} else {\n\t\t\t\t// Parent theme is missing.\n\t\t\t\t$this->errors = new WP_Error( 'theme_no_parent', sprintf( __( 'The parent theme is missing. Please install the \"%s\" parent theme.' ), esc_html( $this->template ) ) );\n\t\t\t\t$this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );\n\t\t\t\t$this->parent = new WP_Theme( $this->template, $this->theme_root, $this );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Set the parent, if we're a child theme.\n\t\tif ( $this->template != $this->stylesheet ) {\n\t\t\t// If we are a parent, then there is a problem. Only two generations allowed! Cancel things out.\n\t\t\tif ( $_child instanceof WP_Theme && $_child->template == $this->stylesheet ) {\n\t\t\t\t$_child->parent = null;\n\t\t\t\t$_child->errors = new WP_Error( 'theme_parent_invalid', sprintf( __( 'The \"%s\" theme is not a valid parent theme.' ), esc_html( $_child->template ) ) );\n\t\t\t\t$_child->cache_add( 'theme', array( 'headers' => $_child->headers, 'errors' => $_child->errors, 'stylesheet' => $_child->stylesheet, 'template' => $_child->template ) );\n\t\t\t\t// The two themes actually reference each other with the Template header.\n\t\t\t\tif ( $_child->stylesheet == $this->template ) {\n\t\t\t\t\t$this->errors = new WP_Error( 'theme_parent_invalid', sprintf( __( 'The \"%s\" theme is not a valid parent theme.' ), esc_html( $this->template ) ) );\n\t\t\t\t\t$this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) );\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Set the parent. Pass the current instance so we can do the crazy checks above and assess errors.\n\t\t\t$this->parent = new WP_Theme( $this->template, isset( $theme_root_template ) ? $theme_root_template : $this->theme_root, $this );\n\t\t}\n\n\t\t// We're good. If we didn't retrieve from cache, set it.\n\t\tif ( ! is_array( $cache ) ) {\n\t\t\t$cache = array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template );\n\t\t\t// If the parent theme is in another root, we'll want to cache this. Avoids an entire branch of filesystem calls above.\n\t\t\tif ( isset( $theme_root_template ) )\n\t\t\t\t$cache['theme_root_template'] = $theme_root_template;\n\t\t\t$this->cache_add( 'theme', $cache );\n\t\t}\n\t}\n\n\t/**\n\t * When converting the object to a string, the theme name is returned.\n\t *\n\t * @return string Theme name, ready for display (translated)\n\t */\n\tpublic function __toString() {\n\t\treturn (string) $this->display('Name');\n\t}\n\n\t/**\n\t * __isset() magic method for properties formerly returned by current_theme_info()\n\t *\n\t * @staticvar array $properties\n\t *\n\t * @return bool\n\t */\n\tpublic function __isset( $offset ) {\n\t\tstatic $properties = array(\n\t\t\t'name', 'title', 'version', 'parent_theme', 'template_dir', 'stylesheet_dir', 'template', 'stylesheet',\n\t\t\t'screenshot', 'description', 'author', 'tags', 'theme_root', 'theme_root_uri',\n\t\t);\n\n\t\treturn in_array( $offset, $properties );\n\t}\n\n\t/**\n\t * __get() magic method for properties formerly returned by current_theme_info()\n\t *\n\t * @return mixed\n\t */\n\tpublic function __get( $offset ) {\n\t\tswitch ( $offset ) {\n\t\t\tcase 'name' :\n\t\t\tcase 'title' :\n\t\t\t\treturn $this->get('Name');\n\t\t\tcase 'version' :\n\t\t\t\treturn $this->get('Version');\n\t\t\tcase 'parent_theme' :\n\t\t\t\treturn $this->parent() ? $this->parent()->get('Name') : '';\n\t\t\tcase 'template_dir' :\n\t\t\t\treturn $this->get_template_directory();\n\t\t\tcase 'stylesheet_dir' :\n\t\t\t\treturn $this->get_stylesheet_directory();\n\t\t\tcase 'template' :\n\t\t\t\treturn $this->get_template();\n\t\t\tcase 'stylesheet' :\n\t\t\t\treturn $this->get_stylesheet();\n\t\t\tcase 'screenshot' :\n\t\t\t\treturn $this->get_screenshot( 'relative' );\n\t\t\t// 'author' and 'description' did not previously return translated data.\n\t\t\tcase 'description' :\n\t\t\t\treturn $this->display('Description');\n\t\t\tcase 'author' :\n\t\t\t\treturn $this->display('Author');\n\t\t\tcase 'tags' :\n\t\t\t\treturn $this->get( 'Tags' );\n\t\t\tcase 'theme_root' :\n\t\t\t\treturn $this->get_theme_root();\n\t\t\tcase 'theme_root_uri' :\n\t\t\t\treturn $this->get_theme_root_uri();\n\t\t\t// For cases where the array was converted to an object.\n\t\t\tdefault :\n\t\t\t\treturn $this->offsetGet( $offset );\n\t\t}\n\t}\n\n\t/**\n\t * Method to implement ArrayAccess for keys formerly returned by get_themes()\n\t *\n\t * @param mixed $offset\n\t * @param mixed $value\n\t */\n\tpublic function offsetSet( $offset, $value ) {}\n\n\t/**\n\t * Method to implement ArrayAccess for keys formerly returned by get_themes()\n\t *\n\t * @param mixed $offset\n\t */\n\tpublic function offsetUnset( $offset ) {}\n\n\t/**\n\t * Method to implement ArrayAccess for keys formerly returned by get_themes()\n\t *\n\t * @staticvar array $keys\n\t *\n\t * @param mixed $offset\n\t * @return bool\n\t */\n\tpublic function offsetExists( $offset ) {\n\t\tstatic $keys = array(\n\t\t\t'Name', 'Version', 'Status', 'Title', 'Author', 'Author Name', 'Author URI', 'Description',\n\t\t\t'Template', 'Stylesheet', 'Template Files', 'Stylesheet Files', 'Template Dir', 'Stylesheet Dir',\n\t\t\t'Screenshot', 'Tags', 'Theme Root', 'Theme Root URI', 'Parent Theme',\n\t\t);\n\n\t\treturn in_array( $offset, $keys );\n\t}\n\n\t/**\n\t * Method to implement ArrayAccess for keys formerly returned by get_themes().\n\t *\n\t * Author, Author Name, Author URI, and Description did not previously return\n\t * translated data. We are doing so now as it is safe to do. However, as\n\t * Name and Title could have been used as the key for get_themes(), both remain\n\t * untranslated for back compatibility. This means that ['Name'] is not ideal,\n\t * and care should be taken to use $theme->display('Name') to get a properly\n\t * translated header.\n\t *\n\t * @param mixed $offset\n\t * @return mixed\n\t */\n\tpublic function offsetGet( $offset ) {\n\t\tswitch ( $offset ) {\n\t\t\tcase 'Name' :\n\t\t\tcase 'Title' :\n\t\t\t\t// See note above about using translated data. get() is not ideal.\n\t\t\t\t// It is only for backwards compatibility. Use display().\n\t\t\t\treturn $this->get('Name');\n\t\t\tcase 'Author' :\n\t\t\t\treturn $this->display( 'Author');\n\t\t\tcase 'Author Name' :\n\t\t\t\treturn $this->display( 'Author', false);\n\t\t\tcase 'Author URI' :\n\t\t\t\treturn $this->display('AuthorURI');\n\t\t\tcase 'Description' :\n\t\t\t\treturn $this->display( 'Description');\n\t\t\tcase 'Version' :\n\t\t\tcase 'Status' :\n\t\t\t\treturn $this->get( $offset );\n\t\t\tcase 'Template' :\n\t\t\t\treturn $this->get_template();\n\t\t\tcase 'Stylesheet' :\n\t\t\t\treturn $this->get_stylesheet();\n\t\t\tcase 'Template Files' :\n\t\t\t\treturn $this->get_files( 'php', 1, true );\n\t\t\tcase 'Stylesheet Files' :\n\t\t\t\treturn $this->get_files( 'css', 0, false );\n\t\t\tcase 'Template Dir' :\n\t\t\t\treturn $this->get_template_directory();\n\t\t\tcase 'Stylesheet Dir' :\n\t\t\t\treturn $this->get_stylesheet_directory();\n\t\t\tcase 'Screenshot' :\n\t\t\t\treturn $this->get_screenshot( 'relative' );\n\t\t\tcase 'Tags' :\n\t\t\t\treturn $this->get('Tags');\n\t\t\tcase 'Theme Root' :\n\t\t\t\treturn $this->get_theme_root();\n\t\t\tcase 'Theme Root URI' :\n\t\t\t\treturn $this->get_theme_root_uri();\n\t\t\tcase 'Parent Theme' :\n\t\t\t\treturn $this->parent() ? $this->parent()->get('Name') : '';\n\t\t\tdefault :\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Returns errors property.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return WP_Error|false WP_Error if there are errors, or false.\n\t */\n\tpublic function errors() {\n\t\treturn is_wp_error( $this->errors ) ? $this->errors : false;\n\t}\n\n\t/**\n\t * Whether the theme exists.\n\t *\n\t * A theme with errors exists. A theme with the error of 'theme_not_found',\n\t * meaning that the theme's directory was not found, does not exist.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return bool Whether the theme exists.\n\t */\n\tpublic function exists() {\n\t\treturn ! ( $this->errors() && in_array( 'theme_not_found', $this->errors()->get_error_codes() ) );\n\t}\n\n\t/**\n\t * Returns reference to the parent theme.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return WP_Theme|false Parent theme, or false if the current theme is not a child theme.\n\t */\n\tpublic function parent() {\n\t\treturn isset( $this->parent ) ? $this->parent : false;\n\t}\n\n\t/**\n\t * Adds theme data to cache.\n\t *\n\t * Cache entries keyed by the theme and the type of data.\n\t *\n\t * @since 3.4.0\n\t * @access private\n\t *\n\t * @param string $key Type of data to store (theme, screenshot, headers, page_templates)\n\t * @param string $data Data to store\n\t * @return bool Return value from wp_cache_add()\n\t */\n\tprivate function cache_add( $key, $data ) {\n\t\treturn wp_cache_add( $key . '-' . $this->cache_hash, $data, 'themes', self::$cache_expiration );\n\t}\n\n\t/**\n\t * Gets theme data from cache.\n\t *\n\t * Cache entries are keyed by the theme and the type of data.\n\t *\n\t * @since 3.4.0\n\t * @access private\n\t *\n\t * @param string $key Type of data to retrieve (theme, screenshot, headers, page_templates)\n\t * @return mixed Retrieved data\n\t */\n\tprivate function cache_get( $key ) {\n\t\treturn wp_cache_get( $key . '-' . $this->cache_hash, 'themes' );\n\t}\n\n\t/**\n\t * Clears the cache for the theme.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t */\n\tpublic function cache_delete() {\n\t\tforeach ( array( 'theme', 'screenshot', 'headers', 'page_templates' ) as $key )\n\t\t\twp_cache_delete( $key . '-' . $this->cache_hash, 'themes' );\n\t\t$this->template = $this->textdomain_loaded = $this->theme_root_uri = $this->parent = $this->errors = $this->headers_sanitized = $this->name_translated = null;\n\t\t$this->headers = array();\n\t\t$this->__construct( $this->stylesheet, $this->theme_root );\n\t}\n\n\t/**\n\t * Get a raw, unformatted theme header.\n\t *\n\t * The header is sanitized, but is not translated, and is not marked up for display.\n\t * To get a theme header for display, use the display() method.\n\t *\n\t * Use the get_template() method, not the 'Template' header, for finding the template.\n\t * The 'Template' header is only good for what was written in the style.css, while\n\t * get_template() takes into account where WordPress actually located the theme and\n\t * whether it is actually valid.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.\n\t * @return string|false String on success, false on failure.\n\t */\n\tpublic function get( $header ) {\n\t\tif ( ! isset( $this->headers[ $header ] ) )\n\t\t\treturn false;\n\n\t\tif ( ! isset( $this->headers_sanitized ) ) {\n\t\t\t$this->headers_sanitized = $this->cache_get( 'headers' );\n\t\t\tif ( ! is_array( $this->headers_sanitized ) )\n\t\t\t\t$this->headers_sanitized = array();\n\t\t}\n\n\t\tif ( isset( $this->headers_sanitized[ $header ] ) )\n\t\t\treturn $this->headers_sanitized[ $header ];\n\n\t\t// If themes are a persistent group, sanitize everything and cache it. One cache add is better than many cache sets.\n\t\tif ( self::$persistently_cache ) {\n\t\t\tforeach ( array_keys( $this->headers ) as $_header )\n\t\t\t\t$this->headers_sanitized[ $_header ] = $this->sanitize_header( $_header, $this->headers[ $_header ] );\n\t\t\t$this->cache_add( 'headers', $this->headers_sanitized );\n\t\t} else {\n\t\t\t$this->headers_sanitized[ $header ] = $this->sanitize_header( $header, $this->headers[ $header ] );\n\t\t}\n\n\t\treturn $this->headers_sanitized[ $header ];\n\t}\n\n\t/**\n\t * Gets a theme header, formatted and translated for display.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.\n\t * @param bool $markup Optional. Whether to mark up the header. Defaults to true.\n\t * @param bool $translate Optional. Whether to translate the header. Defaults to true.\n\t * @return string|false Processed header, false on failure.\n\t */\n\tpublic function display( $header, $markup = true, $translate = true ) {\n\t\t$value = $this->get( $header );\n\t\tif ( false === $value ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( $translate && ( empty( $value ) || ! $this->load_textdomain() ) )\n\t\t\t$translate = false;\n\n\t\tif ( $translate )\n\t\t\t$value = $this->translate_header( $header, $value );\n\n\t\tif ( $markup )\n\t\t\t$value = $this->markup_header( $header, $value, $translate );\n\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Sanitize a theme header.\n\t *\n\t * @since 3.4.0\n\t * @access private\n\t *\n\t * @staticvar array $header_tags\n\t * @staticvar array $header_tags_with_a\n\t *\n\t * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.\n\t * @param string $value Value to sanitize.\n\t * @return mixed\n\t */\n\tprivate function sanitize_header( $header, $value ) {\n\t\tswitch ( $header ) {\n\t\t\tcase 'Status' :\n\t\t\t\tif ( ! $value ) {\n\t\t\t\t\t$value = 'publish';\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// Fall through otherwise.\n\t\t\tcase 'Name' :\n\t\t\t\tstatic $header_tags = array(\n\t\t\t\t\t'abbr'    => array( 'title' => true ),\n\t\t\t\t\t'acronym' => array( 'title' => true ),\n\t\t\t\t\t'code'    => true,\n\t\t\t\t\t'em'      => true,\n\t\t\t\t\t'strong'  => true,\n\t\t\t\t);\n\t\t\t\t$value = wp_kses( $value, $header_tags );\n\t\t\t\tbreak;\n\t\t\tcase 'Author' :\n\t\t\t\t// There shouldn't be anchor tags in Author, but some themes like to be challenging.\n\t\t\tcase 'Description' :\n\t\t\t\tstatic $header_tags_with_a = array(\n\t\t\t\t\t'a'       => array( 'href' => true, 'title' => true ),\n\t\t\t\t\t'abbr'    => array( 'title' => true ),\n\t\t\t\t\t'acronym' => array( 'title' => true ),\n\t\t\t\t\t'code'    => true,\n\t\t\t\t\t'em'      => true,\n\t\t\t\t\t'strong'  => true,\n\t\t\t\t);\n\t\t\t\t$value = wp_kses( $value, $header_tags_with_a );\n\t\t\t\tbreak;\n\t\t\tcase 'ThemeURI' :\n\t\t\tcase 'AuthorURI' :\n\t\t\t\t$value = esc_url_raw( $value );\n\t\t\t\tbreak;\n\t\t\tcase 'Tags' :\n\t\t\t\t$value = array_filter( array_map( 'trim', explode( ',', strip_tags( $value ) ) ) );\n\t\t\t\tbreak;\n\t\t\tcase 'Version' :\n\t\t\t\t$value = strip_tags( $value );\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Mark up a theme header.\n\t *\n     * @since 3.4.0\n\t * @access private\n\t *\n\t * @staticvar string $comma\n\t *\n\t * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.\n\t * @param string $value Value to mark up.\n\t * @param string $translate Whether the header has been translated.\n\t * @return string Value, marked up.\n\t */\n\tprivate function markup_header( $header, $value, $translate ) {\n\t\tswitch ( $header ) {\n\t\t\tcase 'Name' :\n\t\t\t\tif ( empty( $value ) )\n\t\t\t\t\t$value = $this->get_stylesheet();\n\t\t\t\tbreak;\n\t\t\tcase 'Description' :\n\t\t\t\t$value = wptexturize( $value );\n\t\t\t\tbreak;\n\t\t\tcase 'Author' :\n\t\t\t\tif ( $this->get('AuthorURI') ) {\n\t\t\t\t\t$value = sprintf( '<a href=\"%1$s\">%2$s</a>', $this->display( 'AuthorURI', true, $translate ), $value );\n\t\t\t\t} elseif ( ! $value ) {\n\t\t\t\t\t$value = __( 'Anonymous' );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'Tags' :\n\t\t\t\tstatic $comma = null;\n\t\t\t\tif ( ! isset( $comma ) ) {\n\t\t\t\t\t/* translators: used between list items, there is a space after the comma */\n\t\t\t\t\t$comma = __( ', ' );\n\t\t\t\t}\n\t\t\t\t$value = implode( $comma, $value );\n\t\t\t\tbreak;\n\t\t\tcase 'ThemeURI' :\n\t\t\tcase 'AuthorURI' :\n\t\t\t\t$value = esc_url( $value );\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Translate a theme header.\n\t *\n\t * @since 3.4.0\n\t * @access private\n\t *\n\t * @staticvar array $tags_list\n\t *\n\t * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags.\n\t * @param string $value Value to translate.\n\t * @return string Translated value.\n\t */\n\tprivate function translate_header( $header, $value ) {\n\t\tswitch ( $header ) {\n\t\t\tcase 'Name' :\n\t\t\t\t// Cached for sorting reasons.\n\t\t\t\tif ( isset( $this->name_translated ) )\n\t\t\t\t\treturn $this->name_translated;\n\t\t\t\t$this->name_translated = translate( $value, $this->get('TextDomain' ) );\n\t\t\t\treturn $this->name_translated;\n\t\t\tcase 'Tags' :\n\t\t\t\tif ( empty( $value ) || ! function_exists( 'get_theme_feature_list' ) )\n\t\t\t\t\treturn $value;\n\n\t\t\t\tstatic $tags_list;\n\t\t\t\tif ( ! isset( $tags_list ) ) {\n\t\t\t\t\t$tags_list = array();\n\t\t\t\t\t$feature_list = get_theme_feature_list( false ); // No API\n\t\t\t\t\tforeach ( $feature_list as $tags )\n\t\t\t\t\t\t$tags_list += $tags;\n\t\t\t\t}\n\n\t\t\t\tforeach ( $value as &$tag ) {\n\t\t\t\t\tif ( isset( $tags_list[ $tag ] ) ) {\n\t\t\t\t\t\t$tag = $tags_list[ $tag ];\n\t\t\t\t\t} elseif ( isset( self::$tag_map[ $tag ] ) ) {\n\t\t\t\t\t\t$tag = $tags_list[ self::$tag_map[ $tag ] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn $value;\n\n\t\t\tdefault :\n\t\t\t\t$value = translate( $value, $this->get('TextDomain') );\n\t\t}\n\t\treturn $value;\n\t}\n\n\t/**\n\t * The directory name of the theme's \"stylesheet\" files, inside the theme root.\n\t *\n\t * In the case of a child theme, this is directory name of the child theme.\n\t * Otherwise, get_stylesheet() is the same as get_template().\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return string Stylesheet\n\t */\n\tpublic function get_stylesheet() {\n\t\treturn $this->stylesheet;\n\t}\n\n\t/**\n\t * The directory name of the theme's \"template\" files, inside the theme root.\n\t *\n\t * In the case of a child theme, this is the directory name of the parent theme.\n\t * Otherwise, the get_template() is the same as get_stylesheet().\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return string Template\n\t */\n\tpublic function get_template() {\n\t\treturn $this->template;\n\t}\n\n\t/**\n\t * Returns the absolute path to the directory of a theme's \"stylesheet\" files.\n\t *\n\t * In the case of a child theme, this is the absolute path to the directory\n\t * of the child theme's files.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return string Absolute path of the stylesheet directory.\n\t */\n\tpublic function get_stylesheet_directory() {\n\t\tif ( $this->errors() && in_array( 'theme_root_missing', $this->errors()->get_error_codes() ) )\n\t\t\treturn '';\n\n\t\treturn $this->theme_root . '/' . $this->stylesheet;\n\t}\n\n\t/**\n\t * Returns the absolute path to the directory of a theme's \"template\" files.\n\t *\n\t * In the case of a child theme, this is the absolute path to the directory\n\t * of the parent theme's files.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return string Absolute path of the template directory.\n\t */\n\tpublic function get_template_directory() {\n\t\tif ( $this->parent() )\n\t\t\t$theme_root = $this->parent()->theme_root;\n\t\telse\n\t\t\t$theme_root = $this->theme_root;\n\n\t\treturn $theme_root . '/' . $this->template;\n\t}\n\n\t/**\n\t * Returns the URL to the directory of a theme's \"stylesheet\" files.\n\t *\n\t * In the case of a child theme, this is the URL to the directory of the\n\t * child theme's files.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return string URL to the stylesheet directory.\n\t */\n\tpublic function get_stylesheet_directory_uri() {\n\t\treturn $this->get_theme_root_uri() . '/' . str_replace( '%2F', '/', rawurlencode( $this->stylesheet ) );\n\t}\n\n\t/**\n\t * Returns the URL to the directory of a theme's \"template\" files.\n\t *\n\t * In the case of a child theme, this is the URL to the directory of the\n\t * parent theme's files.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return string URL to the template directory.\n\t */\n\tpublic function get_template_directory_uri() {\n\t\tif ( $this->parent() )\n\t\t\t$theme_root_uri = $this->parent()->get_theme_root_uri();\n\t\telse\n\t\t\t$theme_root_uri = $this->get_theme_root_uri();\n\n\t\treturn $theme_root_uri . '/' . str_replace( '%2F', '/', rawurlencode( $this->template ) );\n\t}\n\n\t/**\n\t * The absolute path to the directory of the theme root.\n\t *\n\t * This is typically the absolute path to wp-content/themes.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return string Theme root.\n\t */\n\tpublic function get_theme_root() {\n\t\treturn $this->theme_root;\n\t}\n\n\t/**\n\t * Returns the URL to the directory of the theme root.\n\t *\n\t * This is typically the absolute URL to wp-content/themes. This forms the basis\n\t * for all other URLs returned by WP_Theme, so we pass it to the public function\n\t * get_theme_root_uri() and allow it to run the theme_root_uri filter.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return string Theme root URI.\n\t */\n\tpublic function get_theme_root_uri() {\n\t\tif ( ! isset( $this->theme_root_uri ) )\n\t\t\t$this->theme_root_uri = get_theme_root_uri( $this->stylesheet, $this->theme_root );\n\t\treturn $this->theme_root_uri;\n\t}\n\n\t/**\n\t * Returns the main screenshot file for the theme.\n\t *\n\t * The main screenshot is called screenshot.png. gif and jpg extensions are also allowed.\n\t *\n\t * Screenshots for a theme must be in the stylesheet directory. (In the case of child\n\t * themes, parent theme screenshots are not inherited.)\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param string $uri Type of URL to return, either 'relative' or an absolute URI. Defaults to absolute URI.\n\t * @return string|false Screenshot file. False if the theme does not have a screenshot.\n\t */\n\tpublic function get_screenshot( $uri = 'uri' ) {\n\t\t$screenshot = $this->cache_get( 'screenshot' );\n\t\tif ( $screenshot ) {\n\t\t\tif ( 'relative' == $uri )\n\t\t\t\treturn $screenshot;\n\t\t\treturn $this->get_stylesheet_directory_uri() . '/' . $screenshot;\n\t\t} elseif ( 0 === $screenshot ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tforeach ( array( 'png', 'gif', 'jpg', 'jpeg' ) as $ext ) {\n\t\t\tif ( file_exists( $this->get_stylesheet_directory() . \"/screenshot.$ext\" ) ) {\n\t\t\t\t$this->cache_add( 'screenshot', 'screenshot.' . $ext );\n\t\t\t\tif ( 'relative' == $uri )\n\t\t\t\t\treturn 'screenshot.' . $ext;\n\t\t\t\treturn $this->get_stylesheet_directory_uri() . '/' . 'screenshot.' . $ext;\n\t\t\t}\n\t\t}\n\n\t\t$this->cache_add( 'screenshot', 0 );\n\t\treturn false;\n\t}\n\n\t/**\n\t * Return files in the theme's directory.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param mixed $type Optional. Array of extensions to return. Defaults to all files (null).\n\t * @param int $depth Optional. How deep to search for files. Defaults to a flat scan (0 depth). -1 depth is infinite.\n\t * @param bool $search_parent Optional. Whether to return parent files. Defaults to false.\n\t * @return array Array of files, keyed by the path to the file relative to the theme's directory, with the values\n\t * \t             being absolute paths.\n\t */\n\tpublic function get_files( $type = null, $depth = 0, $search_parent = false ) {\n\t\t$files = (array) self::scandir( $this->get_stylesheet_directory(), $type, $depth );\n\n\t\tif ( $search_parent && $this->parent() )\n\t\t\t$files += (array) self::scandir( $this->get_template_directory(), $type, $depth );\n\n\t\treturn $files;\n\t}\n\n\t/**\n\t * Returns the theme's page templates.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param WP_Post|null $post Optional. The post being edited, provided for context.\n\t * @return array Array of page templates, keyed by filename, with the value of the translated header name.\n\t */\n\tpublic function get_page_templates( $post = null ) {\n\t\t// If you screw up your current theme and we invalidate your parent, most things still work. Let it slide.\n\t\tif ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) )\n\t\t\treturn array();\n\n\t\t$page_templates = $this->cache_get( 'page_templates' );\n\n\t\tif ( ! is_array( $page_templates ) ) {\n\t\t\t$page_templates = array();\n\n\t\t\t$files = (array) $this->get_files( 'php', 1 );\n\n\t\t\tforeach ( $files as $file => $full_path ) {\n\t\t\t\tif ( ! preg_match( '|Template Name:(.*)$|mi', file_get_contents( $full_path ), $header ) )\n\t\t\t\t\tcontinue;\n\t\t\t\t$page_templates[ $file ] = _cleanup_header_comment( $header[1] );\n\t\t\t}\n\n\t\t\t$this->cache_add( 'page_templates', $page_templates );\n\t\t}\n\n\t\tif ( $this->load_textdomain() ) {\n\t\t\tforeach ( $page_templates as &$page_template ) {\n\t\t\t\t$page_template = $this->translate_header( 'Template Name', $page_template );\n\t\t\t}\n\t\t}\n\n\t\tif ( $this->parent() )\n\t\t\t$page_templates += $this->parent()->get_page_templates( $post );\n\n\t\t/**\n\t\t * Filter list of page templates for a theme.\n\t\t *\n\t\t * @since 3.9.0\n\t\t * @since 4.4.0 Converted to allow complete control over the `$page_templates` array.\n\t\t *\n\t\t * @param array        $page_templates Array of page templates. Keys are filenames,\n\t\t *                                     values are translated names.\n\t\t * @param WP_Theme     $this           The theme object.\n\t\t * @param WP_Post|null $post           The post being edited, provided for context, or null.\n\t\t */\n\t\treturn (array) apply_filters( 'theme_page_templates', $page_templates, $this, $post );\n\t}\n\n\t/**\n\t * Scans a directory for files of a certain extension.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @static\n\t * @access private\n\t *\n\t * @param string            $path          Absolute path to search.\n\t * @param array|string|null $extensions    Optional. Array of extensions to find, string of a single extension,\n\t *                                         or null for all extensions. Default null.\n\t * @param int               $depth         Optional. How many levels deep to search for files. Accepts 0, 1+, or\n\t *                                         -1 (infinite depth). Default 0.\n\t * @param string            $relative_path Optional. The basename of the absolute path. Used to control the\n\t *                                         returned path for the found files, particularly when this function\n\t *                                         recurses to lower depths. Default empty.\n\t * @return array|false Array of files, keyed by the path to the file relative to the `$path` directory prepended\n\t *                     with `$relative_path`, with the values being absolute paths. False otherwise.\n\t */\n\tprivate static function scandir( $path, $extensions = null, $depth = 0, $relative_path = '' ) {\n\t\tif ( ! is_dir( $path ) )\n\t\t\treturn false;\n\n\t\tif ( $extensions ) {\n\t\t\t$extensions = (array) $extensions;\n\t\t\t$_extensions = implode( '|', $extensions );\n\t\t}\n\n\t\t$relative_path = trailingslashit( $relative_path );\n\t\tif ( '/' == $relative_path )\n\t\t\t$relative_path = '';\n\n\t\t$results = scandir( $path );\n\t\t$files = array();\n\n\t\tforeach ( $results as $result ) {\n\t\t\tif ( '.' == $result[0] )\n\t\t\t\tcontinue;\n\t\t\tif ( is_dir( $path . '/' . $result ) ) {\n\t\t\t\tif ( ! $depth || 'CVS' == $result )\n\t\t\t\t\tcontinue;\n\t\t\t\t$found = self::scandir( $path . '/' . $result, $extensions, $depth - 1 , $relative_path . $result );\n\t\t\t\t$files = array_merge_recursive( $files, $found );\n\t\t\t} elseif ( ! $extensions || preg_match( '~\\.(' . $_extensions . ')$~', $result ) ) {\n\t\t\t\t$files[ $relative_path . $result ] = $path . '/' . $result;\n\t\t\t}\n\t\t}\n\n\t\treturn $files;\n\t}\n\n\t/**\n\t * Loads the theme's textdomain.\n\t *\n\t * Translation files are not inherited from the parent theme. Todo: if this fails for the\n\t * child theme, it should probably try to load the parent theme's translations.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return bool True if the textdomain was successfully loaded or has already been loaded.\n\t * \tFalse if no textdomain was specified in the file headers, or if the domain could not be loaded.\n\t */\n\tpublic function load_textdomain() {\n\t\tif ( isset( $this->textdomain_loaded ) )\n\t\t\treturn $this->textdomain_loaded;\n\n\t\t$textdomain = $this->get('TextDomain');\n\t\tif ( ! $textdomain ) {\n\t\t\t$this->textdomain_loaded = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( is_textdomain_loaded( $textdomain ) ) {\n\t\t\t$this->textdomain_loaded = true;\n\t\t\treturn true;\n\t\t}\n\n\t\t$path = $this->get_stylesheet_directory();\n\t\tif ( $domainpath = $this->get('DomainPath') )\n\t\t\t$path .= $domainpath;\n\t\telse\n\t\t\t$path .= '/languages';\n\n\t\t$this->textdomain_loaded = load_theme_textdomain( $textdomain, $path );\n\t\treturn $this->textdomain_loaded;\n\t}\n\n\t/**\n\t * Whether the theme is allowed (multisite only).\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @param string $check Optional. Whether to check only the 'network'-wide settings, the 'site'\n\t * \tsettings, or 'both'. Defaults to 'both'.\n\t * @param int $blog_id Optional. Ignored if only network-wide settings are checked. Defaults to current blog.\n\t * @return bool Whether the theme is allowed for the network. Returns true in single-site.\n\t */\n\tpublic function is_allowed( $check = 'both', $blog_id = null ) {\n\t\tif ( ! is_multisite() )\n\t\t\treturn true;\n\n\t\tif ( 'both' == $check || 'network' == $check ) {\n\t\t\t$allowed = self::get_allowed_on_network();\n\t\t\tif ( ! empty( $allowed[ $this->get_stylesheet() ] ) )\n\t\t\t\treturn true;\n\t\t}\n\n\t\tif ( 'both' == $check || 'site' == $check ) {\n\t\t\t$allowed = self::get_allowed_on_site( $blog_id );\n\t\t\tif ( ! empty( $allowed[ $this->get_stylesheet() ] ) )\n\t\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determines the latest WordPress default theme that is installed.\n\t *\n\t * This hits the filesystem.\n\t *\n\t * @return WP_Theme|false Object, or false if no theme is installed, which would be bad.\n\t */\n\tpublic static function get_core_default_theme() {\n\t\tforeach ( array_reverse( self::$default_themes ) as $slug => $name ) {\n\t\t\t$theme = wp_get_theme( $slug );\n\t\t\tif ( $theme->exists() ) {\n\t\t\t\treturn $theme;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Returns array of stylesheet names of themes allowed on the site or network.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @param int $blog_id Optional. Defaults to current blog.\n\t * @return array Array of stylesheet names.\n\t */\n\tpublic static function get_allowed( $blog_id = null ) {\n\t\t/**\n\t\t * Filter the array of themes allowed on the site or network.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param array $allowed_themes An array of theme stylesheet names.\n\t\t */\n\t\t$network = (array) apply_filters( 'allowed_themes', self::get_allowed_on_network() );\n\t\treturn $network + self::get_allowed_on_site( $blog_id );\n\t}\n\n\t/**\n\t * Returns array of stylesheet names of themes allowed on the network.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @staticvar array $allowed_themes\n\t *\n\t * @return array Array of stylesheet names.\n\t */\n\tpublic static function get_allowed_on_network() {\n\t\tstatic $allowed_themes;\n\t\tif ( ! isset( $allowed_themes ) )\n\t\t\t$allowed_themes = (array) get_site_option( 'allowedthemes' );\n\t\treturn $allowed_themes;\n\t}\n\n\t/**\n\t * Returns array of stylesheet names of themes allowed on the site.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @staticvar array $allowed_themes\n\t *\n\t * @param int $blog_id Optional. Defaults to current blog.\n\t * @return array Array of stylesheet names.\n\t */\n\tpublic static function get_allowed_on_site( $blog_id = null ) {\n\t\tstatic $allowed_themes = array();\n\n\t\tif ( ! $blog_id || ! is_multisite() )\n\t\t\t$blog_id = get_current_blog_id();\n\n\t\tif ( isset( $allowed_themes[ $blog_id ] ) )\n\t\t\treturn $allowed_themes[ $blog_id ];\n\n\t\t$current = $blog_id == get_current_blog_id();\n\n\t\tif ( $current ) {\n\t\t\t$allowed_themes[ $blog_id ] = get_option( 'allowedthemes' );\n\t\t} else {\n\t\t\tswitch_to_blog( $blog_id );\n\t\t\t$allowed_themes[ $blog_id ] = get_option( 'allowedthemes' );\n\t\t\trestore_current_blog();\n\t\t}\n\n\t\t// This is all super old MU back compat joy.\n\t\t// 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name.\n\t\tif ( false === $allowed_themes[ $blog_id ] ) {\n\t\t\tif ( $current ) {\n\t\t\t\t$allowed_themes[ $blog_id ] = get_option( 'allowed_themes' );\n\t\t\t} else {\n\t\t\t\tswitch_to_blog( $blog_id );\n\t\t\t\t$allowed_themes[ $blog_id ] = get_option( 'allowed_themes' );\n\t\t\t\trestore_current_blog();\n\t\t\t}\n\n\t\t\tif ( ! is_array( $allowed_themes[ $blog_id ] ) || empty( $allowed_themes[ $blog_id ] ) ) {\n\t\t\t\t$allowed_themes[ $blog_id ] = array();\n\t\t\t} else {\n\t\t\t\t$converted = array();\n\t\t\t\t$themes = wp_get_themes();\n\t\t\t\tforeach ( $themes as $stylesheet => $theme_data ) {\n\t\t\t\t\tif ( isset( $allowed_themes[ $blog_id ][ $theme_data->get('Name') ] ) )\n\t\t\t\t\t\t$converted[ $stylesheet ] = true;\n\t\t\t\t}\n\t\t\t\t$allowed_themes[ $blog_id ] = $converted;\n\t\t\t}\n\t\t\t// Set the option so we never have to go through this pain again.\n\t\t\tif ( is_admin() && $allowed_themes[ $blog_id ] ) {\n\t\t\t\tif ( $current ) {\n\t\t\t\t\tupdate_option( 'allowedthemes', $allowed_themes[ $blog_id ] );\n\t\t\t\t\tdelete_option( 'allowed_themes' );\n\t\t\t\t} else {\n\t\t\t\t\tswitch_to_blog( $blog_id );\n\t\t\t\t\tupdate_option( 'allowedthemes', $allowed_themes[ $blog_id ] );\n\t\t\t\t\tdelete_option( 'allowed_themes' );\n\t\t\t\t\trestore_current_blog();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn (array) $allowed_themes[ $blog_id ];\n\t}\n\n\t/**\n\t * Sort themes by name.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @static\n\t * @access public\n\t */\n\tpublic static function sort_by_name( &$themes ) {\n\t\tif ( 0 === strpos( get_locale(), 'en_' ) ) {\n\t\t\tuasort( $themes, array( 'WP_Theme', '_name_sort' ) );\n\t\t} else {\n\t\t\tuasort( $themes, array( 'WP_Theme', '_name_sort_i18n' ) );\n\t\t}\n\t}\n\n\t/**\n\t * Callback function for usort() to naturally sort themes by name.\n\t *\n\t * Accesses the Name header directly from the class for maximum speed.\n\t * Would choke on HTML but we don't care enough to slow it down with strip_tags().\n\t *\n\t * @since 3.4.0\n\t *\n\t * @static\n\t * @access private\n\t *\n\t * @return int\n\t */\n\tprivate static function _name_sort( $a, $b ) {\n\t\treturn strnatcasecmp( $a->headers['Name'], $b->headers['Name'] );\n\t}\n\n\t/**\n\t * Name sort (with translation).\n\t *\n\t * @since 3.4.0\n\t *\n\t * @static\n\t * @access private\n\t *\n\t * @return int\n\t */\n\tprivate static function _name_sort_i18n( $a, $b ) {\n\t\t// Don't mark up; Do translate.\n\t\treturn strnatcasecmp( $a->display( 'Name', false, true ), $b->display( 'Name', false, true ) );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-user-query.php",
    "content": "<?php\n/**\n * User API: WP_User_Query class\n *\n * @package WordPress\n * @subpackage Users\n * @since 4.4.0\n */\n\n/**\n * Core class used for querying users.\n *\n * @since 3.1.0\n *\n * @see WP_User_Query::prepare_query() for information on accepted arguments.\n */\nclass WP_User_Query {\n\n\t/**\n\t * Query vars, after parsing\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $query_vars = array();\n\n\t/**\n\t * List of found user ids\n\t *\n\t * @since 3.1.0\n\t * @access private\n\t * @var array\n\t */\n\tprivate $results;\n\n\t/**\n\t * Total number of found users for the current query\n\t *\n\t * @since 3.1.0\n\t * @access private\n\t * @var int\n\t */\n\tprivate $total_users = 0;\n\n\t/**\n\t * Metadata query container.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var WP_Meta_Query\n\t */\n\tpublic $meta_query = false;\n\n\t/**\n\t * The SQL query used to fetch matching users.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $request;\n\n\tprivate $compat_fields = array( 'results', 'total_users' );\n\n\t// SQL clauses\n\tpublic $query_fields;\n\tpublic $query_from;\n\tpublic $query_where;\n\tpublic $query_orderby;\n\tpublic $query_limit;\n\n\t/**\n\t * PHP5 constructor.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param null|string|array $args Optional. The query variables.\n\t */\n\tpublic function __construct( $query = null ) {\n\t\tif ( ! empty( $query ) ) {\n\t\t\t$this->prepare_query( $query );\n\t\t\t$this->query();\n\t\t}\n\t}\n\n\t/**\n\t * Fills in missing query variables with default values.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $args Query vars, as passed to `WP_User_Query`.\n\t * @return array Complete query variables with undefined ones filled in with defaults.\n\t */\n\tpublic static function fill_query_vars( $args ) {\n\t\t$defaults = array(\n\t\t\t'blog_id' => $GLOBALS['blog_id'],\n\t\t\t'role' => '',\n\t\t\t'role__in' => array(),\n\t\t\t'role__not_in' => array(),\n\t\t\t'meta_key' => '',\n\t\t\t'meta_value' => '',\n\t\t\t'meta_compare' => '',\n\t\t\t'include' => array(),\n\t\t\t'exclude' => array(),\n\t\t\t'search' => '',\n\t\t\t'search_columns' => array(),\n\t\t\t'orderby' => 'login',\n\t\t\t'order' => 'ASC',\n\t\t\t'offset' => '',\n\t\t\t'number' => '',\n\t\t\t'paged' => 1,\n\t\t\t'count_total' => true,\n\t\t\t'fields' => 'all',\n\t\t\t'who' => '',\n\t\t\t'has_published_posts' => null,\n\t\t);\n\n\t\treturn wp_parse_args( $args, $defaults );\n\t}\n\n\t/**\n\t * Prepare the query variables.\n\t *\n\t * @since 3.1.0\n\t * @since 4.1.0 Added the ability to order by the `include` value.\n\t * @since 4.2.0 Added 'meta_value_num' support for `$orderby` parameter. Added multi-dimensional array syntax\n\t *              for `$orderby` parameter.\n\t * @since 4.3.0 Added 'has_published_posts' parameter.\n\t * @since 4.4.0 Added 'paged', 'role__in', and 'role__not_in' parameters. The 'role' parameter was updated to\n\t *              permit an array or comma-separated list of values. The 'number' parameter was updated to support\n\t *              querying for all users with using -1.\n\t *\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t * @global int  $blog_id\n\t *\n\t * @param string|array $query {\n\t *     Optional. Array or string of Query parameters.\n\t *\n\t *     @type int          $blog_id             The site ID. Default is the global blog id.\n\t *     @type string|array $role                An array or a comma-separated list of role names that users must match\n\t *                                             to be included in results. Note that this is an inclusive list: users\n\t *                                             must match *each* role. Default empty.\n\t *     @type array        $role__in            An array of role names. Matched users must have at least one of these\n\t *                                             roles. Default empty array.\n\t *     @type array        $role__not_in        An array of role names to exclude. Users matching one or more of these\n\t *                                             roles will not be included in results. Default empty array.\n\t *     @type string       $meta_key            User meta key. Default empty.\n\t *     @type string       $meta_value          User meta value. Default empty.\n\t *     @type string       $meta_compare        Comparison operator to test the `$meta_value`. Accepts '=', '!=',\n\t *                                             '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN',\n\t *                                             'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP',\n\t *                                             'NOT REGEXP', or 'RLIKE'. Default '='.\n\t *     @type array        $include             An array of user IDs to include. Default empty array.\n\t *     @type array        $exclude             An array of user IDs to exclude. Default empty array.\n\t *     @type string       $search              Search keyword. Searches for possible string matches on columns.\n\t *                                             When `$search_columns` is left empty, it tries to determine which\n\t *                                             column to search in based on search string. Default empty.\n\t *     @type array        $search_columns      Array of column names to be searched. Accepts 'ID', 'login',\n\t *                                             'nicename', 'email', 'url'. Default empty array.\n\t *     @type string|array $orderby             Field(s) to sort the retrieved users by. May be a single value,\n\t *                                             an array of values, or a multi-dimensional array with fields as\n\t *                                             keys and orders ('ASC' or 'DESC') as values. Accepted values are\n\t *                                             'ID', 'display_name' (or 'name'), 'include', 'user_login'\n\t *                                             (or 'login'), 'user_nicename' (or 'nicename'), 'user_email'\n\t *                                             (or 'email'), 'user_url' (or 'url'), 'user_registered'\n\t *                                             or 'registered'), 'post_count', 'meta_value', 'meta_value_num',\n\t *                                             the value of `$meta_key`, or an array key of `$meta_query`. To use\n\t *                                             'meta_value' or 'meta_value_num', `$meta_key` must be also be\n\t *                                             defined. Default 'user_login'.\n\t *     @type string       $order               Designates ascending or descending order of users. Order values\n\t *                                             passed as part of an `$orderby` array take precedence over this\n\t *                                             parameter. Accepts 'ASC', 'DESC'. Default 'ASC'.\n\t *     @type int          $offset              Number of users to offset in retrieved results. Can be used in\n\t *                                             conjunction with pagination. Default 0.\n\t *     @type int          $number              Number of users to limit the query for. Can be used in\n\t *                                             conjunction with pagination. Value -1 (all) is supported, but\n\t *                                             should be used with caution on larger sites.\n\t *                                             Default empty (all users).\n\t *     @type int          $paged               When used with number, defines the page of results to return.\n\t *                                             Default 1.\n\t *     @type bool         $count_total         Whether to count the total number of users found. If pagination\n\t *                                             is not needed, setting this to false can improve performance.\n\t *                                             Default true.\n\t *     @type string|array $fields              Which fields to return. Single or all fields (string), or array\n\t *                                             of fields. Accepts 'ID', 'display_name', 'user_login',\n\t *                                             'user_nicename', 'user_email', 'user_url', 'user_registered'.\n\t *                                             Use 'all' for all fields and 'all_with_meta' to include\n\t *                                             meta fields. Default 'all'.\n\t *     @type string       $who                 Type of users to query. Accepts 'authors'.\n\t *                                             Default empty (all users).\n\t *     @type bool|array   $has_published_posts Pass an array of post types to filter results to users who have\n\t *                                             published posts in those post types. `true` is an alias for all\n\t *                                             public post types.\n\t * }\n\t */\n\tpublic function prepare_query( $query = array() ) {\n\t\tglobal $wpdb;\n\n\t\tif ( empty( $this->query_vars ) || ! empty( $query ) ) {\n\t\t\t$this->query_limit = null;\n\t\t\t$this->query_vars = $this->fill_query_vars( $query );\n\t\t}\n\n\t\t/**\n\t\t * Fires before the WP_User_Query has been parsed.\n\t\t *\n\t\t * The passed WP_User_Query object contains the query variables, not\n\t\t * yet passed into SQL.\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @param WP_User_Query $this The current WP_User_Query instance,\n\t\t *                            passed by reference.\n\t\t */\n\t\tdo_action( 'pre_get_users', $this );\n\n\t\t// Ensure that query vars are filled after 'pre_get_users'.\n\t\t$qv =& $this->query_vars;\n\t\t$qv =  $this->fill_query_vars( $qv );\n\n\t\tif ( is_array( $qv['fields'] ) ) {\n\t\t\t$qv['fields'] = array_unique( $qv['fields'] );\n\n\t\t\t$this->query_fields = array();\n\t\t\tforeach ( $qv['fields'] as $field ) {\n\t\t\t\t$field = 'ID' === $field ? 'ID' : sanitize_key( $field );\n\t\t\t\t$this->query_fields[] = \"$wpdb->users.$field\";\n\t\t\t}\n\t\t\t$this->query_fields = implode( ',', $this->query_fields );\n\t\t} elseif ( 'all' == $qv['fields'] ) {\n\t\t\t$this->query_fields = \"$wpdb->users.*\";\n\t\t} else {\n\t\t\t$this->query_fields = \"$wpdb->users.ID\";\n\t\t}\n\n\t\tif ( isset( $qv['count_total'] ) && $qv['count_total'] )\n\t\t\t$this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields;\n\n\t\t$this->query_from = \"FROM $wpdb->users\";\n\t\t$this->query_where = \"WHERE 1=1\";\n\n\t\t// Parse and sanitize 'include', for use by 'orderby' as well as 'include' below.\n\t\tif ( ! empty( $qv['include'] ) ) {\n\t\t\t$include = wp_parse_id_list( $qv['include'] );\n\t\t} else {\n\t\t\t$include = false;\n\t\t}\n\n\t\t$blog_id = 0;\n\t\tif ( isset( $qv['blog_id'] ) ) {\n\t\t\t$blog_id = absint( $qv['blog_id'] );\n\t\t}\n\n\t\tif ( isset( $qv['who'] ) && 'authors' == $qv['who'] && $blog_id ) {\n\t\t\t$qv['meta_key'] = $wpdb->get_blog_prefix( $blog_id ) . 'user_level';\n\t\t\t$qv['meta_value'] = 0;\n\t\t\t$qv['meta_compare'] = '!=';\n\t\t\t$qv['blog_id'] = $blog_id = 0; // Prevent extra meta query\n\t\t}\n\n\t\tif ( $qv['has_published_posts'] && $blog_id ) {\n\t\t\tif ( true === $qv['has_published_posts'] ) {\n\t\t\t\t$post_types = get_post_types( array( 'public' => true ) );\n\t\t\t} else {\n\t\t\t\t$post_types = (array) $qv['has_published_posts'];\n\t\t\t}\n\n\t\t\tforeach ( $post_types as &$post_type ) {\n\t\t\t\t$post_type = $wpdb->prepare( '%s', $post_type );\n\t\t\t}\n\n\t\t\t$posts_table = $wpdb->get_blog_prefix( $blog_id ) . 'posts';\n\t\t\t$this->query_where .= \" AND $wpdb->users.ID IN ( SELECT DISTINCT $posts_table.post_author FROM $posts_table WHERE $posts_table.post_status = 'publish' AND $posts_table.post_type IN ( \" . join( \", \", $post_types ) . \" ) )\";\n\t\t}\n\n\t\t// Meta query.\n\t\t$this->meta_query = new WP_Meta_Query();\n\t\t$this->meta_query->parse_query_vars( $qv );\n\n\t\t$roles = array();\n\t\tif ( isset( $qv['role'] ) ) {\n\t\t\tif ( is_array( $qv['role'] ) ) {\n\t\t\t\t$roles = $qv['role'];\n\t\t\t} elseif ( is_string( $qv['role'] ) && ! empty( $qv['role'] ) ) {\n\t\t\t\t$roles = array_map( 'trim', explode( ',', $qv['role'] ) );\n\t\t\t}\n\t\t}\n\n\t\t$role__in = array();\n\t\tif ( isset( $qv['role__in'] ) ) {\n\t\t\t$role__in = (array) $qv['role__in'];\n\t\t}\n\n\t\t$role__not_in = array();\n\t\tif ( isset( $qv['role__not_in'] ) ) {\n\t\t\t$role__not_in = (array) $qv['role__not_in'];\n\t\t}\n\n\t\tif ( $blog_id && ( ! empty( $roles ) || ! empty( $role__in ) || ! empty( $role__not_in ) || is_multisite() ) ) {\n\t\t\t$role_queries  = array();\n\n\t\t\t$roles_clauses = array( 'relation' => 'AND' );\n\t\t\tif ( ! empty( $roles ) ) {\n\t\t\t\tforeach ( $roles as $role ) {\n\t\t\t\t\t$roles_clauses[] = array(\n\t\t\t\t\t\t'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',\n\t\t\t\t\t\t'value'   => '\"' . $role . '\"',\n\t\t\t\t\t\t'compare' => 'LIKE',\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t$role_queries[] = $roles_clauses;\n\t\t\t}\n\n\t\t\t$role__in_clauses = array( 'relation' => 'OR' );\n\t\t\tif ( ! empty( $role__in ) ) {\n\t\t\t\tforeach ( $role__in as $role ) {\n\t\t\t\t\t$role__in_clauses[] = array(\n\t\t\t\t\t\t'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',\n\t\t\t\t\t\t'value'   => '\"' . $role . '\"',\n\t\t\t\t\t\t'compare' => 'LIKE',\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t$role_queries[] = $role__in_clauses;\n\t\t\t}\n\n\t\t\t$role__not_in_clauses = array( 'relation' => 'AND' );\n\t\t\tif ( ! empty( $role__not_in ) ) {\n\t\t\t\tforeach ( $role__not_in as $role ) {\n\t\t\t\t\t$role__not_in_clauses[] = array(\n\t\t\t\t\t\t'key'     => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',\n\t\t\t\t\t\t'value'   => '\"' . $role . '\"',\n\t\t\t\t\t\t'compare' => 'NOT LIKE',\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t$role_queries[] = $role__not_in_clauses;\n\t\t\t}\n\n\t\t\t// If there are no specific roles named, make sure the user is a member of the site.\n\t\t\tif ( empty( $role_queries ) ) {\n\t\t\t\t$role_queries[] = array(\n\t\t\t\t\t'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',\n\t\t\t\t\t'compare' => 'EXISTS',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Specify that role queries should be joined with AND.\n\t\t\t$role_queries['relation'] = 'AND';\n\n\t\t\tif ( empty( $this->meta_query->queries ) ) {\n\t\t\t\t$this->meta_query->queries = $role_queries;\n\t\t\t} else {\n\t\t\t\t// Append the cap query to the original queries and reparse the query.\n\t\t\t\t$this->meta_query->queries = array(\n\t\t\t\t\t'relation' => 'AND',\n\t\t\t\t\tarray( $this->meta_query->queries, $role_queries ),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t$this->meta_query->parse_query_vars( $this->meta_query->queries );\n\t\t}\n\n\t\tif ( ! empty( $this->meta_query->queries ) ) {\n\t\t\t$clauses = $this->meta_query->get_sql( 'user', $wpdb->users, 'ID', $this );\n\t\t\t$this->query_from .= $clauses['join'];\n\t\t\t$this->query_where .= $clauses['where'];\n\n\t\t\tif ( $this->meta_query->has_or_relation() ) {\n\t\t\t\t$this->query_fields = 'DISTINCT ' . $this->query_fields;\n\t\t\t}\n\t\t}\n\n\t\t// sorting\n\t\t$qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : '';\n\t\t$order = $this->parse_order( $qv['order'] );\n\n\t\tif ( empty( $qv['orderby'] ) ) {\n\t\t\t// Default order is by 'user_login'.\n\t\t\t$ordersby = array( 'user_login' => $order );\n\t\t} elseif ( is_array( $qv['orderby'] ) ) {\n\t\t\t$ordersby = $qv['orderby'];\n\t\t} else {\n\t\t\t// 'orderby' values may be a comma- or space-separated list.\n\t\t\t$ordersby = preg_split( '/[,\\s]+/', $qv['orderby'] );\n\t\t}\n\n\t\t$orderby_array = array();\n\t\tforeach ( $ordersby as $_key => $_value ) {\n\t\t\tif ( ! $_value ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( is_int( $_key ) ) {\n\t\t\t\t// Integer key means this is a flat array of 'orderby' fields.\n\t\t\t\t$_orderby = $_value;\n\t\t\t\t$_order = $order;\n\t\t\t} else {\n\t\t\t\t// Non-integer key means this the key is the field and the value is ASC/DESC.\n\t\t\t\t$_orderby = $_key;\n\t\t\t\t$_order = $_value;\n\t\t\t}\n\n\t\t\t$parsed = $this->parse_orderby( $_orderby );\n\n\t\t\tif ( ! $parsed ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$orderby_array[] = $parsed . ' ' . $this->parse_order( $_order );\n\t\t}\n\n\t\t// If no valid clauses were found, order by user_login.\n\t\tif ( empty( $orderby_array ) ) {\n\t\t\t$orderby_array[] = \"user_login $order\";\n\t\t}\n\n\t\t$this->query_orderby = 'ORDER BY ' . implode( ', ', $orderby_array );\n\n\t\t// limit\n\t\tif ( isset( $qv['number'] ) && $qv['number'] > 0 ) {\n\t\t\tif ( $qv['offset'] ) {\n\t\t\t\t$this->query_limit = $wpdb->prepare(\"LIMIT %d, %d\", $qv['offset'], $qv['number']);\n\t\t\t} else {\n\t\t\t\t$this->query_limit = $wpdb->prepare( \"LIMIT %d, %d\", $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] );\n\t\t\t}\n\t\t}\n\n\t\t$search = '';\n\t\tif ( isset( $qv['search'] ) )\n\t\t\t$search = trim( $qv['search'] );\n\n\t\tif ( $search ) {\n\t\t\t$leading_wild = ( ltrim($search, '*') != $search );\n\t\t\t$trailing_wild = ( rtrim($search, '*') != $search );\n\t\t\tif ( $leading_wild && $trailing_wild )\n\t\t\t\t$wild = 'both';\n\t\t\telseif ( $leading_wild )\n\t\t\t\t$wild = 'leading';\n\t\t\telseif ( $trailing_wild )\n\t\t\t\t$wild = 'trailing';\n\t\t\telse\n\t\t\t\t$wild = false;\n\t\t\tif ( $wild )\n\t\t\t\t$search = trim($search, '*');\n\n\t\t\t$search_columns = array();\n\t\t\tif ( $qv['search_columns'] )\n\t\t\t\t$search_columns = array_intersect( $qv['search_columns'], array( 'ID', 'user_login', 'user_email', 'user_url', 'user_nicename' ) );\n\t\t\tif ( ! $search_columns ) {\n\t\t\t\tif ( false !== strpos( $search, '@') )\n\t\t\t\t\t$search_columns = array('user_email');\n\t\t\t\telseif ( is_numeric($search) )\n\t\t\t\t\t$search_columns = array('user_login', 'ID');\n\t\t\t\telseif ( preg_match('|^https?://|', $search) && ! ( is_multisite() && wp_is_large_network( 'users' ) ) )\n\t\t\t\t\t$search_columns = array('user_url');\n\t\t\t\telse\n\t\t\t\t\t$search_columns = array('user_login', 'user_url', 'user_email', 'user_nicename', 'display_name');\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter the columns to search in a WP_User_Query search.\n\t\t\t *\n\t\t\t * The default columns depend on the search term, and include 'user_email',\n\t\t\t * 'user_login', 'ID', 'user_url', 'display_name', and 'user_nicename'.\n\t\t\t *\n\t\t\t * @since 3.6.0\n\t\t\t *\n\t\t\t * @param array         $search_columns Array of column names to be searched.\n\t\t\t * @param string        $search         Text being searched.\n\t\t\t * @param WP_User_Query $this           The current WP_User_Query instance.\n\t\t\t */\n\t\t\t$search_columns = apply_filters( 'user_search_columns', $search_columns, $search, $this );\n\n\t\t\t$this->query_where .= $this->get_search_sql( $search, $search_columns, $wild );\n\t\t}\n\n\t\tif ( ! empty( $include ) ) {\n\t\t\t// Sanitized earlier.\n\t\t\t$ids = implode( ',', $include );\n\t\t\t$this->query_where .= \" AND $wpdb->users.ID IN ($ids)\";\n\t\t} elseif ( ! empty( $qv['exclude'] ) ) {\n\t\t\t$ids = implode( ',', wp_parse_id_list( $qv['exclude'] ) );\n\t\t\t$this->query_where .= \" AND $wpdb->users.ID NOT IN ($ids)\";\n\t\t}\n\n\t\t// Date queries are allowed for the user_registered field.\n\t\tif ( ! empty( $qv['date_query'] ) && is_array( $qv['date_query'] ) ) {\n\t\t\t$date_query = new WP_Date_Query( $qv['date_query'], 'user_registered' );\n\t\t\t$this->query_where .= $date_query->get_sql();\n\t\t}\n\n\t\t/**\n\t\t * Fires after the WP_User_Query has been parsed, and before\n\t\t * the query is executed.\n\t\t *\n\t\t * The passed WP_User_Query object contains SQL parts formed\n\t\t * from parsing the given query.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param WP_User_Query $this The current WP_User_Query instance,\n\t\t *                            passed by reference.\n\t\t */\n\t\tdo_action_ref_array( 'pre_user_query', array( &$this ) );\n\t}\n\n\t/**\n\t * Execute the query, with the current variables.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t */\n\tpublic function query() {\n\t\tglobal $wpdb;\n\n\t\t$qv =& $this->query_vars;\n\n\t\t$this->request = \"SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit\";\n\n\t\tif ( is_array( $qv['fields'] ) || 'all' == $qv['fields'] ) {\n\t\t\t$this->results = $wpdb->get_results( $this->request );\n\t\t} else {\n\t\t\t$this->results = $wpdb->get_col( $this->request );\n\t\t}\n\n\t\t/**\n\t\t * Filter SELECT FOUND_ROWS() query for the current WP_User_Query instance.\n\t\t *\n\t\t * @since 3.2.0\n\t\t *\n\t\t * @global wpdb $wpdb WordPress database abstraction object.\n\t\t *\n\t\t * @param string $sql The SELECT FOUND_ROWS() query for the current WP_User_Query.\n\t\t */\n\t\tif ( isset( $qv['count_total'] ) && $qv['count_total'] )\n\t\t\t$this->total_users = $wpdb->get_var( apply_filters( 'found_users_query', 'SELECT FOUND_ROWS()' ) );\n\n\t\tif ( !$this->results )\n\t\t\treturn;\n\n\t\tif ( 'all_with_meta' == $qv['fields'] ) {\n\t\t\tcache_users( $this->results );\n\n\t\t\t$r = array();\n\t\t\tforeach ( $this->results as $userid )\n\t\t\t\t$r[ $userid ] = new WP_User( $userid, '', $qv['blog_id'] );\n\n\t\t\t$this->results = $r;\n\t\t} elseif ( 'all' == $qv['fields'] ) {\n\t\t\tforeach ( $this->results as $key => $user ) {\n\t\t\t\t$this->results[ $key ] = new WP_User( $user, '', $qv['blog_id'] );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve query variable.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param string $query_var Query variable key.\n\t * @return mixed\n\t */\n\tpublic function get( $query_var ) {\n\t\tif ( isset( $this->query_vars[$query_var] ) )\n\t\t\treturn $this->query_vars[$query_var];\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Set query variable.\n\t *\n\t * @since 3.5.0\n\t * @access public\n\t *\n\t * @param string $query_var Query variable key.\n\t * @param mixed $value Query variable value.\n\t */\n\tpublic function set( $query_var, $value ) {\n\t\t$this->query_vars[$query_var] = $value;\n\t}\n\n\t/**\n\t * Used internally to generate an SQL string for searching across multiple columns\n\t *\n\t * @access protected\n\t * @since 3.1.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $string\n\t * @param array  $cols\n\t * @param bool   $wild   Whether to allow wildcard searches. Default is false for Network Admin, true for single site.\n\t *                       Single site allows leading and trailing wildcards, Network Admin only trailing.\n\t * @return string\n\t */\n\tprotected function get_search_sql( $string, $cols, $wild = false ) {\n\t\tglobal $wpdb;\n\n\t\t$searches = array();\n\t\t$leading_wild = ( 'leading' == $wild || 'both' == $wild ) ? '%' : '';\n\t\t$trailing_wild = ( 'trailing' == $wild || 'both' == $wild ) ? '%' : '';\n\t\t$like = $leading_wild . $wpdb->esc_like( $string ) . $trailing_wild;\n\n\t\tforeach ( $cols as $col ) {\n\t\t\tif ( 'ID' == $col ) {\n\t\t\t\t$searches[] = $wpdb->prepare( \"$col = %s\", $string );\n\t\t\t} else {\n\t\t\t\t$searches[] = $wpdb->prepare( \"$col LIKE %s\", $like );\n\t\t\t}\n\t\t}\n\n\t\treturn ' AND (' . implode(' OR ', $searches) . ')';\n\t}\n\n\t/**\n\t * Return the list of users.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @return array Array of results.\n\t */\n\tpublic function get_results() {\n\t\treturn $this->results;\n\t}\n\n\t/**\n\t * Return the total number of users for the current query.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t *\n\t * @return int Number of total users.\n\t */\n\tpublic function get_total() {\n\t\treturn $this->total_users;\n\t}\n\n\t/**\n\t * Parse and sanitize 'orderby' keys passed to the user query.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $orderby Alias for the field to order by.\n\t * @return string Value to used in the ORDER clause, if `$orderby` is valid.\n\t */\n\tprotected function parse_orderby( $orderby ) {\n\t\tglobal $wpdb;\n\n\t\t$meta_query_clauses = $this->meta_query->get_clauses();\n\n\t\t$_orderby = '';\n\t\tif ( in_array( $orderby, array( 'login', 'nicename', 'email', 'url', 'registered' ) ) ) {\n\t\t\t$_orderby = 'user_' . $orderby;\n\t\t} elseif ( in_array( $orderby, array( 'user_login', 'user_nicename', 'user_email', 'user_url', 'user_registered' ) ) ) {\n\t\t\t$_orderby = $orderby;\n\t\t} elseif ( 'name' == $orderby || 'display_name' == $orderby ) {\n\t\t\t$_orderby = 'display_name';\n\t\t} elseif ( 'post_count' == $orderby ) {\n\t\t\t// todo: avoid the JOIN\n\t\t\t$where = get_posts_by_author_sql( 'post' );\n\t\t\t$this->query_from .= \" LEFT OUTER JOIN (\n\t\t\t\tSELECT post_author, COUNT(*) as post_count\n\t\t\t\tFROM $wpdb->posts\n\t\t\t\t$where\n\t\t\t\tGROUP BY post_author\n\t\t\t) p ON ({$wpdb->users}.ID = p.post_author)\n\t\t\t\";\n\t\t\t$_orderby = 'post_count';\n\t\t} elseif ( 'ID' == $orderby || 'id' == $orderby ) {\n\t\t\t$_orderby = 'ID';\n\t\t} elseif ( 'meta_value' == $orderby || $this->get( 'meta_key' ) == $orderby ) {\n\t\t\t$_orderby = \"$wpdb->usermeta.meta_value\";\n\t\t} elseif ( 'meta_value_num' == $orderby ) {\n\t\t\t$_orderby = \"$wpdb->usermeta.meta_value+0\";\n\t\t} elseif ( 'include' === $orderby && ! empty( $this->query_vars['include'] ) ) {\n\t\t\t$include = wp_parse_id_list( $this->query_vars['include'] );\n\t\t\t$include_sql = implode( ',', $include );\n\t\t\t$_orderby = \"FIELD( $wpdb->users.ID, $include_sql )\";\n\t\t} elseif ( isset( $meta_query_clauses[ $orderby ] ) ) {\n\t\t\t$meta_clause = $meta_query_clauses[ $orderby ];\n\t\t\t$_orderby = sprintf( \"CAST(%s.meta_value AS %s)\", esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) );\n\t\t}\n\n\t\treturn $_orderby;\n\t}\n\n\t/**\n\t * Parse an 'order' query variable and cast it to ASC or DESC as necessary.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $order The 'order' query variable.\n\t * @return string The sanitized 'order' query variable.\n\t */\n\tprotected function parse_order( $order ) {\n\t\tif ( ! is_string( $order ) || empty( $order ) ) {\n\t\t\treturn 'DESC';\n\t\t}\n\n\t\tif ( 'ASC' === strtoupper( $order ) ) {\n\t\t\treturn 'ASC';\n\t\t} else {\n\t\t\treturn 'DESC';\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to get.\n\t * @return mixed Property.\n\t */\n\tpublic function __get( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn $this->$name;\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties settable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name  Property to check if set.\n\t * @param mixed  $value Property value.\n\t * @return mixed Newly-set property.\n\t */\n\tpublic function __set( $name, $value ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn $this->$name = $value;\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties checkable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to check if set.\n\t * @return bool Whether the property is set.\n\t */\n\tpublic function __isset( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn isset( $this->$name );\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties un-settable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to unset.\n\t */\n\tpublic function __unset( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\tunset( $this->$name );\n\t\t}\n\t}\n\n\t/**\n\t * Make private/protected methods readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param callable $name      Method to call.\n\t * @param array    $arguments Arguments to pass when calling.\n\t * @return mixed Return value of the callback, false otherwise.\n\t */\n\tpublic function __call( $name, $arguments ) {\n\t\tif ( 'get_search_sql' === $name ) {\n\t\t\treturn call_user_func_array( array( $this, $name ), $arguments );\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-user.php",
    "content": "<?php\n/**\n * User API: WP_User class\n *\n * @package WordPress\n * @subpackage Users\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement the WP_User object.\n *\n * @since 2.0.0\n *\n * @property string $nickname\n * @property string $description\n * @property string $user_description\n * @property string $first_name\n * @property string $user_firstname\n * @property string $last_name\n * @property string $user_lastname\n * @property string $user_login\n * @property string $user_pass\n * @property string $user_nicename\n * @property string $user_email\n * @property string $user_url\n * @property string $user_registered\n * @property string $user_activation_key\n * @property string $user_status\n * @property string $display_name\n * @property string $spam\n * @property string $deleted\n */\nclass WP_User {\n\t/**\n\t * User data container.\n\t *\n\t * @since 2.0.0\n\t * @var object\n\t */\n\tpublic $data;\n\n\t/**\n\t * The user's ID.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $ID = 0;\n\n\t/**\n\t * The individual capabilities the user has been given.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $caps = array();\n\n\t/**\n\t * User metadata option name.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $cap_key;\n\n\t/**\n\t * The roles the user is part of.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $roles = array();\n\n\t/**\n\t * All capabilities the user has, including individual and role based.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $allcaps = array();\n\n\t/**\n\t * The filter context applied to user data fields.\n\t *\n\t * @since 2.9.0\n\t * @access private\n\t * @var string\n\t */\n\tvar $filter = null;\n\n\t/**\n\t * @static\n\t * @access private\n\t * @var array\n\t */\n\tprivate static $back_compat_keys;\n\n\t/**\n\t * Constructor.\n\t *\n\t * Retrieves the userdata and passes it to WP_User::init().\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param int|string|stdClass|WP_User $id User's ID, a WP_User object, or a user object from the DB.\n\t * @param string $name Optional. User's username\n\t * @param int $blog_id Optional Blog ID, defaults to current blog.\n\t */\n\tpublic function __construct( $id = 0, $name = '', $blog_id = '' ) {\n\t\tif ( ! isset( self::$back_compat_keys ) ) {\n\t\t\t$prefix = $GLOBALS['wpdb']->prefix;\n\t\t\tself::$back_compat_keys = array(\n\t\t\t\t'user_firstname' => 'first_name',\n\t\t\t\t'user_lastname' => 'last_name',\n\t\t\t\t'user_description' => 'description',\n\t\t\t\t'user_level' => $prefix . 'user_level',\n\t\t\t\t$prefix . 'usersettings' => $prefix . 'user-settings',\n\t\t\t\t$prefix . 'usersettingstime' => $prefix . 'user-settings-time',\n\t\t\t);\n\t\t}\n\n\t\tif ( $id instanceof WP_User ) {\n\t\t\t$this->init( $id->data, $blog_id );\n\t\t\treturn;\n\t\t} elseif ( is_object( $id ) ) {\n\t\t\t$this->init( $id, $blog_id );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! empty( $id ) && ! is_numeric( $id ) ) {\n\t\t\t$name = $id;\n\t\t\t$id = 0;\n\t\t}\n\n\t\tif ( $id ) {\n\t\t\t$data = self::get_data_by( 'id', $id );\n\t\t} else {\n\t\t\t$data = self::get_data_by( 'login', $name );\n\t\t}\n\n\t\tif ( $data ) {\n\t\t\t$this->init( $data, $blog_id );\n\t\t} else {\n\t\t\t$this->data = new stdClass;\n\t\t}\n\t}\n\n\t/**\n\t * Sets up object properties, including capabilities.\n\t *\n\t * @param object $data User DB row object\n\t * @param int $blog_id Optional. The blog id to initialize for\n\t */\n\tpublic function init( $data, $blog_id = '' ) {\n\t\t$this->data = $data;\n\t\t$this->ID = (int) $data->ID;\n\n\t\t$this->for_blog( $blog_id );\n\t}\n\n\t/**\n\t * Return only the main user fields\n\t *\n\t * @since 3.3.0\n\t * @since 4.4.0 Added 'ID' as an alias of 'id' for the `$field` parameter.\n\t *\n\t * @static\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $field The field to query against: 'id', 'ID', 'slug', 'email' or 'login'.\n\t * @param string|int $value The field value\n\t * @return object|false Raw user object\n\t */\n\tpublic static function get_data_by( $field, $value ) {\n\t\tglobal $wpdb;\n\n\t\t// 'ID' is an alias of 'id'.\n\t\tif ( 'ID' === $field ) {\n\t\t\t$field = 'id';\n\t\t}\n\n\t\tif ( 'id' == $field ) {\n\t\t\t// Make sure the value is numeric to avoid casting objects, for example,\n\t\t\t// to int 1.\n\t\t\tif ( ! is_numeric( $value ) )\n\t\t\t\treturn false;\n\t\t\t$value = intval( $value );\n\t\t\tif ( $value < 1 )\n\t\t\t\treturn false;\n\t\t} else {\n\t\t\t$value = trim( $value );\n\t\t}\n\n\t\tif ( !$value )\n\t\t\treturn false;\n\n\t\tswitch ( $field ) {\n\t\t\tcase 'id':\n\t\t\t\t$user_id = $value;\n\t\t\t\t$db_field = 'ID';\n\t\t\t\tbreak;\n\t\t\tcase 'slug':\n\t\t\t\t$user_id = wp_cache_get($value, 'userslugs');\n\t\t\t\t$db_field = 'user_nicename';\n\t\t\t\tbreak;\n\t\t\tcase 'email':\n\t\t\t\t$user_id = wp_cache_get($value, 'useremail');\n\t\t\t\t$db_field = 'user_email';\n\t\t\t\tbreak;\n\t\t\tcase 'login':\n\t\t\t\t$value = sanitize_user( $value );\n\t\t\t\t$user_id = wp_cache_get($value, 'userlogins');\n\t\t\t\t$db_field = 'user_login';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\n\t\tif ( false !== $user_id ) {\n\t\t\tif ( $user = wp_cache_get( $user_id, 'users' ) )\n\t\t\t\treturn $user;\n\t\t}\n\n\t\tif ( !$user = $wpdb->get_row( $wpdb->prepare(\n\t\t\t\"SELECT * FROM $wpdb->users WHERE $db_field = %s\", $value\n\t\t) ) )\n\t\t\treturn false;\n\n\t\tupdate_user_caches( $user );\n\n\t\treturn $user;\n\t}\n\n\t/**\n\t * Makes private/protected methods readable for backwards compatibility.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param callable $name      Method to call.\n\t * @param array    $arguments Arguments to pass when calling.\n\t * @return mixed|false Return value of the callback, false otherwise.\n\t */\n\tpublic function __call( $name, $arguments ) {\n\t\tif ( '_init_caps' === $name ) {\n\t\t\treturn call_user_func_array( array( $this, $name ), $arguments );\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Magic method for checking the existence of a certain custom field.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t *\n\t * @param string $key User meta key to check if set.\n\t * @return bool Whether the given user meta key is set.\n\t */\n\tpublic function __isset( $key ) {\n\t\tif ( 'id' == $key ) {\n\t\t\t_deprecated_argument( 'WP_User->id', '2.1',\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: WP_User->ID */\n\t\t\t\t\t__( 'Use %s instead.' ),\n\t\t\t\t\t'<code>WP_User->ID</code>'\n\t\t\t\t)\n\t\t\t);\n\t\t\t$key = 'ID';\n\t\t}\n\n\t\tif ( isset( $this->data->$key ) )\n\t\t\treturn true;\n\n\t\tif ( isset( self::$back_compat_keys[ $key ] ) )\n\t\t\t$key = self::$back_compat_keys[ $key ];\n\n\t\treturn metadata_exists( 'user', $this->ID, $key );\n\t}\n\n\t/**\n\t * Magic method for accessing custom fields.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t *\n\t * @param string $key User meta key to retrieve.\n\t * @return mixed Value of the given user meta key (if set). If `$key` is 'id', the user ID.\n\t */\n\tpublic function __get( $key ) {\n\t\tif ( 'id' == $key ) {\n\t\t\t_deprecated_argument( 'WP_User->id', '2.1',\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: WP_User->ID */\n\t\t\t\t\t__( 'Use %s instead.' ),\n\t\t\t\t\t'<code>WP_User->ID</code>'\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn $this->ID;\n\t\t}\n\n\t\tif ( isset( $this->data->$key ) ) {\n\t\t\t$value = $this->data->$key;\n\t\t} else {\n\t\t\tif ( isset( self::$back_compat_keys[ $key ] ) )\n\t\t\t\t$key = self::$back_compat_keys[ $key ];\n\t\t\t$value = get_user_meta( $this->ID, $key, true );\n\t\t}\n\n\t\tif ( $this->filter ) {\n\t\t\t$value = sanitize_user_field( $key, $value, $this->ID, $this->filter );\n\t\t}\n\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Magic method for setting custom user fields.\n\t *\n\t * This method does not update custom fields in the database. It only stores\n\t * the value on the WP_User instance.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t *\n\t * @param string $key   User meta key.\n\t * @param mixed  $value User meta value.\n\t */\n\tpublic function __set( $key, $value ) {\n\t\tif ( 'id' == $key ) {\n\t\t\t_deprecated_argument( 'WP_User->id', '2.1',\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: WP_User->ID */\n\t\t\t\t\t__( 'Use %s instead.' ),\n\t\t\t\t\t'<code>WP_User->ID</code>'\n\t\t\t\t)\n\t\t\t);\n\t\t\t$this->ID = $value;\n\t\t\treturn;\n\t\t}\n\n\t\t$this->data->$key = $value;\n\t}\n\n\t/**\n\t * Magic method for unsetting a certain custom field.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key User meta key to unset.\n\t */\n\tpublic function __unset( $key ) {\n\t\tif ( 'id' == $key ) {\n\t\t\t_deprecated_argument( 'WP_User->id', '2.1',\n\t\t\t\tsprintf(\n\t\t\t\t\t/* translators: %s: WP_User->ID */\n\t\t\t\t\t__( 'Use %s instead.' ),\n\t\t\t\t\t'<code>WP_User->ID</code>'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tif ( isset( $this->data->$key ) ) {\n\t\t\tunset( $this->data->$key );\n\t\t}\n\n\t\tif ( isset( self::$back_compat_keys[ $key ] ) ) {\n\t\t\tunset( self::$back_compat_keys[ $key ] );\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether the user exists in the database.\n\t *\n\t * @since 3.4.0\n\t * @access public\n\t *\n\t * @return bool True if user exists in the database, false if not.\n\t */\n\tpublic function exists() {\n\t\treturn ! empty( $this->ID );\n\t}\n\n\t/**\n\t * Retrieve the value of a property or meta key.\n\t *\n\t * Retrieves from the users and usermeta table.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $key Property\n\t * @return mixed\n\t */\n\tpublic function get( $key ) {\n\t\treturn $this->__get( $key );\n\t}\n\n\t/**\n\t * Determine whether a property or meta key is set\n\t *\n\t * Consults the users and usermeta tables.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $key Property\n\t * @return bool\n\t */\n\tpublic function has_prop( $key ) {\n\t\treturn $this->__isset( $key );\n\t}\n\n\t/**\n\t * Return an array representation.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return array Array representation.\n\t */\n\tpublic function to_array() {\n\t\treturn get_object_vars( $this->data );\n\t}\n\n\t/**\n\t * Set up capability object properties.\n\t *\n\t * Will set the value for the 'cap_key' property to current database table\n\t * prefix, followed by 'capabilities'. Will then check to see if the\n\t * property matching the 'cap_key' exists and is an array. If so, it will be\n\t * used.\n\t *\n\t * @access protected\n\t * @since 2.1.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $cap_key Optional capability key\n\t */\n\tprotected function _init_caps( $cap_key = '' ) {\n\t\tglobal $wpdb;\n\n\t\tif ( empty($cap_key) )\n\t\t\t$this->cap_key = $wpdb->get_blog_prefix() . 'capabilities';\n\t\telse\n\t\t\t$this->cap_key = $cap_key;\n\n\t\t$this->caps = get_user_meta( $this->ID, $this->cap_key, true );\n\n\t\tif ( ! is_array( $this->caps ) )\n\t\t\t$this->caps = array();\n\n\t\t$this->get_role_caps();\n\t}\n\n\t/**\n\t * Retrieve all of the role capabilities and merge with individual capabilities.\n\t *\n\t * All of the capabilities of the roles the user belongs to are merged with\n\t * the users individual roles. This also means that the user can be denied\n\t * specific roles that their role might have, but the specific user isn't\n\t * granted permission to.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @return array List of all capabilities for the user.\n\t */\n\tpublic function get_role_caps() {\n\t\t$wp_roles = wp_roles();\n\n\t\t//Filter out caps that are not role names and assign to $this->roles\n\t\tif ( is_array( $this->caps ) )\n\t\t\t$this->roles = array_filter( array_keys( $this->caps ), array( $wp_roles, 'is_role' ) );\n\n\t\t//Build $allcaps from role caps, overlay user's $caps\n\t\t$this->allcaps = array();\n\t\tforeach ( (array) $this->roles as $role ) {\n\t\t\t$the_role = $wp_roles->get_role( $role );\n\t\t\t$this->allcaps = array_merge( (array) $this->allcaps, (array) $the_role->capabilities );\n\t\t}\n\t\t$this->allcaps = array_merge( (array) $this->allcaps, (array) $this->caps );\n\n\t\treturn $this->allcaps;\n\t}\n\n\t/**\n\t * Add role to user.\n\t *\n\t * Updates the user's meta data option with capabilities and roles.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t */\n\tpublic function add_role( $role ) {\n\t\tif ( empty( $role ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->caps[$role] = true;\n\t\tupdate_user_meta( $this->ID, $this->cap_key, $this->caps );\n\t\t$this->get_role_caps();\n\t\t$this->update_user_level_from_caps();\n\n\t\t/**\n\t\t * Fires immediately after the user has been given a new role.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @param int    $user_id The user ID.\n\t\t * @param string $role    The new role.\n\t\t */\n\t\tdo_action( 'add_user_role', $this->ID, $role );\n\t}\n\n\t/**\n\t * Remove role from user.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t */\n\tpublic function remove_role( $role ) {\n\t\tif ( !in_array($role, $this->roles) )\n\t\t\treturn;\n\t\tunset( $this->caps[$role] );\n\t\tupdate_user_meta( $this->ID, $this->cap_key, $this->caps );\n\t\t$this->get_role_caps();\n\t\t$this->update_user_level_from_caps();\n\n\t\t/**\n\t\t * Fires immediately after a role as been removed from a user.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @param int    $user_id The user ID.\n\t\t * @param string $role    The removed role.\n\t\t */\n\t\tdo_action( 'remove_user_role', $this->ID, $role );\n\t}\n\n\t/**\n\t * Set the role of the user.\n\t *\n\t * This will remove the previous roles of the user and assign the user the\n\t * new one. You can set the role to an empty string and it will remove all\n\t * of the roles from the user.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $role Role name.\n\t */\n\tpublic function set_role( $role ) {\n\t\tif ( 1 == count( $this->roles ) && $role == current( $this->roles ) )\n\t\t\treturn;\n\n\t\tforeach ( (array) $this->roles as $oldrole )\n\t\t\tunset( $this->caps[$oldrole] );\n\n\t\t$old_roles = $this->roles;\n\t\tif ( !empty( $role ) ) {\n\t\t\t$this->caps[$role] = true;\n\t\t\t$this->roles = array( $role => true );\n\t\t} else {\n\t\t\t$this->roles = false;\n\t\t}\n\t\tupdate_user_meta( $this->ID, $this->cap_key, $this->caps );\n\t\t$this->get_role_caps();\n\t\t$this->update_user_level_from_caps();\n\n\t\t/**\n\t\t * Fires after the user's role has changed.\n\t\t *\n\t\t * @since 2.9.0\n\t\t * @since 3.6.0 Added $old_roles to include an array of the user's previous roles.\n\t\t *\n\t\t * @param int    $user_id   The user ID.\n\t\t * @param string $role      The new role.\n\t\t * @param array  $old_roles An array of the user's previous roles.\n\t\t */\n\t\tdo_action( 'set_user_role', $this->ID, $role, $old_roles );\n\t}\n\n\t/**\n\t * Choose the maximum level the user has.\n\t *\n\t * Will compare the level from the $item parameter against the $max\n\t * parameter. If the item is incorrect, then just the $max parameter value\n\t * will be returned.\n\t *\n\t * Used to get the max level based on the capabilities the user has. This\n\t * is also based on roles, so if the user is assigned the Administrator role\n\t * then the capability 'level_10' will exist and the user will get that\n\t * value.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param int $max Max level of user.\n\t * @param string $item Level capability name.\n\t * @return int Max Level.\n\t */\n\tpublic function level_reduction( $max, $item ) {\n\t\tif ( preg_match( '/^level_(10|[0-9])$/i', $item, $matches ) ) {\n\t\t\t$level = intval( $matches[1] );\n\t\t\treturn max( $max, $level );\n\t\t} else {\n\t\t\treturn $max;\n\t\t}\n\t}\n\n\t/**\n\t * Update the maximum user level for the user.\n\t *\n\t * Updates the 'user_level' user metadata (includes prefix that is the\n\t * database table prefix) with the maximum user level. Gets the value from\n\t * the all of the capabilities that the user has.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t */\n\tpublic function update_user_level_from_caps() {\n\t\tglobal $wpdb;\n\t\t$this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 );\n\t\tupdate_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level', $this->user_level );\n\t}\n\n\t/**\n\t * Add capability and grant or deny access to capability.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $cap Capability name.\n\t * @param bool $grant Whether to grant capability to user.\n\t */\n\tpublic function add_cap( $cap, $grant = true ) {\n\t\t$this->caps[$cap] = $grant;\n\t\tupdate_user_meta( $this->ID, $this->cap_key, $this->caps );\n\t\t$this->get_role_caps();\n\t\t$this->update_user_level_from_caps();\n\t}\n\n\t/**\n\t * Remove capability from user.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param string $cap Capability name.\n\t */\n\tpublic function remove_cap( $cap ) {\n\t\tif ( ! isset( $this->caps[ $cap ] ) ) {\n\t\t\treturn;\n\t\t}\n\t\tunset( $this->caps[ $cap ] );\n\t\tupdate_user_meta( $this->ID, $this->cap_key, $this->caps );\n\t\t$this->get_role_caps();\n\t\t$this->update_user_level_from_caps();\n\t}\n\n\t/**\n\t * Remove all of the capabilities of the user.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t */\n\tpublic function remove_all_caps() {\n\t\tglobal $wpdb;\n\t\t$this->caps = array();\n\t\tdelete_user_meta( $this->ID, $this->cap_key );\n\t\tdelete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' );\n\t\t$this->get_role_caps();\n\t}\n\n\t/**\n\t * Whether user has capability or role name.\n\t *\n\t * While checking against particular roles in place of a capability is supported\n\t * in part, this practice is discouraged as it may produce unreliable results.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @see map_meta_cap()\n\t *\n\t * @param string $cap       Capability name.\n\t * @param int    $object_id Optional. ID of the specific object to check against if `$cap` is a \"meta\" cap.\n\t *                          \"Meta\" capabilities, e.g. 'edit_post', 'edit_user', etc., are capabilities used\n\t *                          by map_meta_cap() to map to other \"primitive\" capabilities, e.g. 'edit_posts',\n\t *                          'edit_others_posts', etc. The parameter is accessed via func_get_args() and passed\n\t *                          to map_meta_cap().\n\t * @return bool Whether the current user has the given capability. If `$cap` is a meta cap and `$object_id` is\n\t *              passed, whether the current user has the given meta capability for the given object.\n\t */\n\tpublic function has_cap( $cap ) {\n\t\tif ( is_numeric( $cap ) ) {\n\t\t\t_deprecated_argument( __FUNCTION__, '2.0', __('Usage of user levels by plugins and themes is deprecated. Use roles and capabilities instead.') );\n\t\t\t$cap = $this->translate_level_to_cap( $cap );\n\t\t}\n\n\t\t$args = array_slice( func_get_args(), 1 );\n\t\t$args = array_merge( array( $cap, $this->ID ), $args );\n\t\t$caps = call_user_func_array( 'map_meta_cap', $args );\n\n\t\t// Multisite super admin has all caps by definition, Unless specifically denied.\n\t\tif ( is_multisite() && is_super_admin( $this->ID ) ) {\n\t\t\tif ( in_array('do_not_allow', $caps) )\n\t\t\t\treturn false;\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Dynamically filter a user's capabilities.\n\t\t *\n\t\t * @since 2.0.0\n\t\t * @since 3.7.0 Added the user object.\n\t\t *\n\t\t * @param array   $allcaps An array of all the user's capabilities.\n\t\t * @param array   $caps    Actual capabilities for meta capability.\n\t\t * @param array   $args    Optional parameters passed to has_cap(), typically object ID.\n\t\t * @param WP_User $user    The user object.\n\t\t */\n\t\t$capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this );\n\n\t\t// Everyone is allowed to exist.\n\t\t$capabilities['exist'] = true;\n\n\t\t// Must have ALL requested caps.\n\t\tforeach ( (array) $caps as $cap ) {\n\t\t\tif ( empty( $capabilities[ $cap ] ) )\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Convert numeric level to level capability name.\n\t *\n\t * Prepends 'level_' to level number.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t *\n\t * @param int $level Level number, 1 to 10.\n\t * @return string\n\t */\n\tpublic function translate_level_to_cap( $level ) {\n\t\treturn 'level_' . $level;\n\t}\n\n\t/**\n\t * Set the blog to operate on. Defaults to the current blog.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param int $blog_id Optional Blog ID, defaults to current blog.\n\t */\n\tpublic function for_blog( $blog_id = '' ) {\n\t\tglobal $wpdb;\n\t\tif ( ! empty( $blog_id ) )\n\t\t\t$cap_key = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities';\n\t\telse\n\t\t\t$cap_key = '';\n\t\t$this->_init_caps( $cap_key );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-walker.php",
    "content": "<?php\n/**\n * A class for displaying various tree-like structures.\n *\n * Extend the Walker class to use it, see examples below. Child classes\n * do not need to implement all of the abstract methods in the class. The child\n * only needs to implement the methods that are needed.\n *\n * @since 2.1.0\n *\n * @package WordPress\n * @abstract\n */\nclass Walker {\n\t/**\n\t * What the class handles.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $tree_type;\n\n\t/**\n\t * DB fields to use.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $db_fields;\n\n\t/**\n\t * Max number of pages walked by the paged walker\n\t *\n\t * @since 2.7.0\n\t * @var int\n\t */\n\tpublic $max_pages = 1;\n\n\t/**\n\t * Whether the current element has children or not.\n\t *\n\t * To be used in start_el().\n\t *\n\t * @since 4.0.0\n\t * @var bool\n\t */\n\tpublic $has_children;\n\n\t/**\n\t * Starts the list before the elements are added.\n\t *\n\t * The $args parameter holds additional values that may be used with the child\n\t * class methods. This method is called at the start of the output list.\n\t *\n\t * @since 2.1.0\n\t * @abstract\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of the item.\n\t * @param array  $args   An array of additional arguments.\n\t */\n\tpublic function start_lvl( &$output, $depth = 0, $args = array() ) {}\n\n\t/**\n\t * Ends the list of after the elements are added.\n\t *\n\t * The $args parameter holds additional values that may be used with the child\n\t * class methods. This method finishes the list at the end of output of the elements.\n\t *\n\t * @since 2.1.0\n\t * @abstract\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of the item.\n\t * @param array  $args   An array of additional arguments.\n\t */\n\tpublic function end_lvl( &$output, $depth = 0, $args = array() ) {}\n\n\t/**\n\t * Start the element output.\n\t *\n\t * The $args parameter holds additional values that may be used with the child\n\t * class methods. Includes the element output also.\n\t *\n\t * @since 2.1.0\n\t * @abstract\n\t *\n\t * @param string $output            Passed by reference. Used to append additional content.\n\t * @param object $object            The data object.\n\t * @param int    $depth             Depth of the item.\n\t * @param array  $args              An array of additional arguments.\n\t * @param int    $current_object_id ID of the current item.\n\t */\n\tpublic function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0 ) {}\n\n\t/**\n\t * Ends the element output, if needed.\n\t *\n\t * The $args parameter holds additional values that may be used with the child class methods.\n\t *\n\t * @since 2.1.0\n\t * @abstract\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param object $object The data object.\n\t * @param int    $depth  Depth of the item.\n\t * @param array  $args   An array of additional arguments.\n\t */\n\tpublic function end_el( &$output, $object, $depth = 0, $args = array() ) {}\n\n\t/**\n\t * Traverse elements to create list from elements.\n\t *\n\t * Display one element if the element doesn't have any children otherwise,\n\t * display the element and its children. Will only traverse up to the max\n\t * depth and no ignore elements under that depth. It is possible to set the\n\t * max depth to include all depths, see walk() method.\n\t *\n\t * This method should not be called directly, use the walk() method instead.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param object $element           Data object.\n\t * @param array  $children_elements List of elements to continue traversing.\n\t * @param int    $max_depth         Max depth to traverse.\n\t * @param int    $depth             Depth of current element.\n\t * @param array  $args              An array of arguments.\n\t * @param string $output            Passed by reference. Used to append additional content.\n\t */\n\tpublic function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {\n\t\tif ( ! $element ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$id_field = $this->db_fields['id'];\n\t\t$id       = $element->$id_field;\n\n\t\t//display this element\n\t\t$this->has_children = ! empty( $children_elements[ $id ] );\n\t\tif ( isset( $args[0] ) && is_array( $args[0] ) ) {\n\t\t\t$args[0]['has_children'] = $this->has_children; // Backwards compatibility.\n\t\t}\n\n\t\t$cb_args = array_merge( array(&$output, $element, $depth), $args);\n\t\tcall_user_func_array(array($this, 'start_el'), $cb_args);\n\n\t\t// descend only when the depth is right and there are childrens for this element\n\t\tif ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$id]) ) {\n\n\t\t\tforeach ( $children_elements[ $id ] as $child ){\n\n\t\t\t\tif ( !isset($newlevel) ) {\n\t\t\t\t\t$newlevel = true;\n\t\t\t\t\t//start the child delimiter\n\t\t\t\t\t$cb_args = array_merge( array(&$output, $depth), $args);\n\t\t\t\t\tcall_user_func_array(array($this, 'start_lvl'), $cb_args);\n\t\t\t\t}\n\t\t\t\t$this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );\n\t\t\t}\n\t\t\tunset( $children_elements[ $id ] );\n\t\t}\n\n\t\tif ( isset($newlevel) && $newlevel ){\n\t\t\t//end the child delimiter\n\t\t\t$cb_args = array_merge( array(&$output, $depth), $args);\n\t\t\tcall_user_func_array(array($this, 'end_lvl'), $cb_args);\n\t\t}\n\n\t\t//end this element\n\t\t$cb_args = array_merge( array(&$output, $element, $depth), $args);\n\t\tcall_user_func_array(array($this, 'end_el'), $cb_args);\n\t}\n\n\t/**\n\t * Display array of elements hierarchically.\n\t *\n\t * Does not assume any existing order of elements.\n\t *\n\t * $max_depth = -1 means flatly display every element.\n\t * $max_depth = 0 means display all levels.\n\t * $max_depth > 0 specifies the number of display levels.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array $elements  An array of elements.\n\t * @param int   $max_depth The maximum hierarchical depth.\n\t * @return string The hierarchical item output.\n\t */\n\tpublic function walk( $elements, $max_depth ) {\n\t\t$args = array_slice(func_get_args(), 2);\n\t\t$output = '';\n\n\t\t//invalid parameter or nothing to walk\n\t\tif ( $max_depth < -1 || empty( $elements ) ) {\n\t\t\treturn $output;\n\t\t}\n\n\t\t$parent_field = $this->db_fields['parent'];\n\n\t\t// flat display\n\t\tif ( -1 == $max_depth ) {\n\t\t\t$empty_array = array();\n\t\t\tforeach ( $elements as $e )\n\t\t\t\t$this->display_element( $e, $empty_array, 1, 0, $args, $output );\n\t\t\treturn $output;\n\t\t}\n\n\t\t/*\n\t\t * Need to display in hierarchical order.\n\t\t * Separate elements into two buckets: top level and children elements.\n\t\t * Children_elements is two dimensional array, eg.\n\t\t * Children_elements[10][] contains all sub-elements whose parent is 10.\n\t\t */\n\t\t$top_level_elements = array();\n\t\t$children_elements  = array();\n\t\tforeach ( $elements as $e) {\n\t\t\tif ( empty( $e->$parent_field ) )\n\t\t\t\t$top_level_elements[] = $e;\n\t\t\telse\n\t\t\t\t$children_elements[ $e->$parent_field ][] = $e;\n\t\t}\n\n\t\t/*\n\t\t * When none of the elements is top level.\n\t\t * Assume the first one must be root of the sub elements.\n\t\t */\n\t\tif ( empty($top_level_elements) ) {\n\n\t\t\t$first = array_slice( $elements, 0, 1 );\n\t\t\t$root = $first[0];\n\n\t\t\t$top_level_elements = array();\n\t\t\t$children_elements  = array();\n\t\t\tforeach ( $elements as $e) {\n\t\t\t\tif ( $root->$parent_field == $e->$parent_field )\n\t\t\t\t\t$top_level_elements[] = $e;\n\t\t\t\telse\n\t\t\t\t\t$children_elements[ $e->$parent_field ][] = $e;\n\t\t\t}\n\t\t}\n\n\t\tforeach ( $top_level_elements as $e )\n\t\t\t$this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );\n\n\t\t/*\n\t\t * If we are displaying all levels, and remaining children_elements is not empty,\n\t\t * then we got orphans, which should be displayed regardless.\n\t\t */\n\t\tif ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) {\n\t\t\t$empty_array = array();\n\t\t\tforeach ( $children_elements as $orphans )\n\t\t\t\tforeach ( $orphans as $op )\n\t\t\t\t\t$this->display_element( $op, $empty_array, 1, 0, $args, $output );\n\t\t }\n\n\t\t return $output;\n\t}\n\n\t/**\n \t * paged_walk() - produce a page of nested elements\n \t *\n \t * Given an array of hierarchical elements, the maximum depth, a specific page number,\n \t * and number of elements per page, this function first determines all top level root elements\n \t * belonging to that page, then lists them and all of their children in hierarchical order.\n \t *\n\t * $max_depth = 0 means display all levels.\n\t * $max_depth > 0 specifies the number of display levels.\n\t *\n \t * @since 2.7.0\n\t *\n\t * @param array $elements\n\t * @param int   $max_depth The maximum hierarchical depth.\n\t * @param int   $page_num The specific page number, beginning with 1.\n\t * @param int   $per_page\n\t * @return string XHTML of the specified page of elements\n\t */\n\tpublic function paged_walk( $elements, $max_depth, $page_num, $per_page ) {\n\t\tif ( empty( $elements ) || $max_depth < -1 ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t$args = array_slice( func_get_args(), 4 );\n\t\t$output = '';\n\n\t\t$parent_field = $this->db_fields['parent'];\n\n\t\t$count = -1;\n\t\tif ( -1 == $max_depth )\n\t\t\t$total_top = count( $elements );\n\t\tif ( $page_num < 1 || $per_page < 0  ) {\n\t\t\t// No paging\n\t\t\t$paging = false;\n\t\t\t$start = 0;\n\t\t\tif ( -1 == $max_depth )\n\t\t\t\t$end = $total_top;\n\t\t\t$this->max_pages = 1;\n\t\t} else {\n\t\t\t$paging = true;\n\t\t\t$start = ( (int)$page_num - 1 ) * (int)$per_page;\n\t\t\t$end   = $start + $per_page;\n\t\t\tif ( -1 == $max_depth )\n\t\t\t\t$this->max_pages = ceil($total_top / $per_page);\n\t\t}\n\n\t\t// flat display\n\t\tif ( -1 == $max_depth ) {\n\t\t\tif ( !empty($args[0]['reverse_top_level']) ) {\n\t\t\t\t$elements = array_reverse( $elements );\n\t\t\t\t$oldstart = $start;\n\t\t\t\t$start = $total_top - $end;\n\t\t\t\t$end = $total_top - $oldstart;\n\t\t\t}\n\n\t\t\t$empty_array = array();\n\t\t\tforeach ( $elements as $e ) {\n\t\t\t\t$count++;\n\t\t\t\tif ( $count < $start )\n\t\t\t\t\tcontinue;\n\t\t\t\tif ( $count >= $end )\n\t\t\t\t\tbreak;\n\t\t\t\t$this->display_element( $e, $empty_array, 1, 0, $args, $output );\n\t\t\t}\n\t\t\treturn $output;\n\t\t}\n\n\t\t/*\n\t\t * Separate elements into two buckets: top level and children elements.\n\t\t * Children_elements is two dimensional array, e.g.\n\t\t * $children_elements[10][] contains all sub-elements whose parent is 10.\n\t\t */\n\t\t$top_level_elements = array();\n\t\t$children_elements  = array();\n\t\tforeach ( $elements as $e) {\n\t\t\tif ( 0 == $e->$parent_field )\n\t\t\t\t$top_level_elements[] = $e;\n\t\t\telse\n\t\t\t\t$children_elements[ $e->$parent_field ][] = $e;\n\t\t}\n\n\t\t$total_top = count( $top_level_elements );\n\t\tif ( $paging )\n\t\t\t$this->max_pages = ceil($total_top / $per_page);\n\t\telse\n\t\t\t$end = $total_top;\n\n\t\tif ( !empty($args[0]['reverse_top_level']) ) {\n\t\t\t$top_level_elements = array_reverse( $top_level_elements );\n\t\t\t$oldstart = $start;\n\t\t\t$start = $total_top - $end;\n\t\t\t$end = $total_top - $oldstart;\n\t\t}\n\t\tif ( !empty($args[0]['reverse_children']) ) {\n\t\t\tforeach ( $children_elements as $parent => $children )\n\t\t\t\t$children_elements[$parent] = array_reverse( $children );\n\t\t}\n\n\t\tforeach ( $top_level_elements as $e ) {\n\t\t\t$count++;\n\n\t\t\t// For the last page, need to unset earlier children in order to keep track of orphans.\n\t\t\tif ( $end >= $total_top && $count < $start )\n\t\t\t\t\t$this->unset_children( $e, $children_elements );\n\n\t\t\tif ( $count < $start )\n\t\t\t\tcontinue;\n\n\t\t\tif ( $count >= $end )\n\t\t\t\tbreak;\n\n\t\t\t$this->display_element( $e, $children_elements, $max_depth, 0, $args, $output );\n\t\t}\n\n\t\tif ( $end >= $total_top && count( $children_elements ) > 0 ) {\n\t\t\t$empty_array = array();\n\t\t\tforeach ( $children_elements as $orphans )\n\t\t\t\tforeach ( $orphans as $op )\n\t\t\t\t\t$this->display_element( $op, $empty_array, 1, 0, $args, $output );\n\t\t}\n\n\t\treturn $output;\n\t}\n\n\t/**\n\t * Calculates the total number of root elements.\n\t *\n\t * @since 2.7.0\n\t * @access public\n\t * \n\t * @param array $elements Elements to list.\n\t * @return int Number of root elements.\n\t */\n\tpublic function get_number_of_root_elements( $elements ){\n\t\t$num = 0;\n\t\t$parent_field = $this->db_fields['parent'];\n\n\t\tforeach ( $elements as $e) {\n\t\t\tif ( 0 == $e->$parent_field )\n\t\t\t\t$num++;\n\t\t}\n\t\treturn $num;\n\t}\n\n\t/**\n\t * Unset all the children for a given top level element.\n\t *\n\t * @param object $e\n\t * @param array $children_elements\n\t */\n\tpublic function unset_children( $e, &$children_elements ){\n\t\tif ( ! $e || ! $children_elements ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$id_field = $this->db_fields['id'];\n\t\t$id = $e->$id_field;\n\n\t\tif ( !empty($children_elements[$id]) && is_array($children_elements[$id]) )\n\t\t\tforeach ( (array) $children_elements[$id] as $child )\n\t\t\t\t$this->unset_children( $child, $children_elements );\n\n\t\tunset( $children_elements[ $id ] );\n\t}\n\n} // Walker\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-widget-factory.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Factory class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Singleton that registers and instantiates WP_Widget classes.\n *\n * @since 2.8.0\n * @since 4.4.0 Moved to its own file from wp-includes/widgets.php\n */\nclass WP_Widget_Factory {\n\tpublic $widgets = array();\n\n\t/**\n\t * PHP5 constructor.\n\t */\n\tpublic function __construct() {\n\t\tadd_action( 'widgets_init', array( $this, '_register_widgets' ), 100 );\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function WP_Widget_Factory() {\n\t\t_deprecated_constructor( 'WP_Widget_Factory', '4.2.0' );\n\t\tself::__construct();\n\t}\n\n\t/**\n\t * Register a widget subclass.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param string $widget_class The name of a {@see WP_Widget} subclass.\n\t */\n\tpublic function register( $widget_class ) {\n\t\t$this->widgets[$widget_class] = new $widget_class();\n\t}\n\n\t/**\n\t * Un-register a widget subclass.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param string $widget_class The name of a {@see WP_Widget} subclass.\n\t */\n\tpublic function unregister( $widget_class ) {\n\t\tunset( $this->widgets[ $widget_class ] );\n\t}\n\n\t/**\n\t * Utility method for adding widgets to the registered widgets global.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global array $wp_registered_widgets\n\t */\n\tpublic function _register_widgets() {\n\t\tglobal $wp_registered_widgets;\n\t\t$keys = array_keys($this->widgets);\n\t\t$registered = array_keys($wp_registered_widgets);\n\t\t$registered = array_map('_get_widget_id_base', $registered);\n\n\t\tforeach ( $keys as $key ) {\n\t\t\t// don't register new widget if old widget with the same id is already registered\n\t\t\tif ( in_array($this->widgets[$key]->id_base, $registered, true) ) {\n\t\t\t\tunset($this->widgets[$key]);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$this->widgets[$key]->_register();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-widget.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget base class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core base class extended to register widgets.\n *\n * This class must be extended for each widget and WP_Widget::widget(), WP_Widget::update()\n * and WP_Widget::form() need to be overridden.\n *\n * @since 2.8.0\n * @since 4.4.0 Moved to its own file from wp-includes/widgets.php\n */\nclass WP_Widget {\n\n\t/**\n\t * Root ID for all widgets of this type.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var mixed|string\n\t */\n\tpublic $id_base;\n\n\t/**\n\t * Name for this widget type.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $name;\n\n\t/**\n\t * Option array passed to {@see wp_register_sidebar_widget()}.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $widget_options;\n\n\t/**\n\t * Option array passed to {@see wp_register_widget_control()}.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $control_options;\n\n\t/**\n\t * Unique ID number of the current instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var bool|int\n\t */\n\tpublic $number = false;\n\n\t/**\n\t * Unique ID string of the current instance (id_base-number).\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var bool|string\n\t */\n\tpublic $id = false;\n\n\t/**\n\t * Whether the widget data has been updated.\n\t *\n\t * Set to true when the data is updated after a POST submit - ensures it does\n\t * not happen twice.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $updated = false;\n\n\t// Member functions that you must over-ride.\n\n\t/**\n\t * Echoes the widget content.\n\t *\n\t * Sub-classes should over-ride this function to generate their widget code.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance The settings for the particular instance of the widget.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\tdie('function WP_Widget::widget() must be over-ridden in a sub-class.');\n\t}\n\n\t/**\n\t * Updates a particular instance of a widget.\n\t *\n\t * This function should check that `$new_instance` is set correctly. The newly-calculated\n\t * value of `$instance` should be returned. If false is returned, the instance won't be\n\t * saved/updated.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Settings to save or bool false to cancel saving.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\treturn $new_instance;\n\t}\n\n\t/**\n\t * Outputs the settings update form.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t * @return string Default return is 'noform'.\n\t */\n\tpublic function form( $instance ) {\n\t\techo '<p class=\"no-options-widget\">' . __('There are no options for this widget.') . '</p>';\n\t\treturn 'noform';\n\t}\n\n\t// Functions you'll need to call.\n\n\t/**\n\t * PHP5 constructor.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param string $id_base         Optional Base ID for the widget, lowercase and unique. If left empty,\n\t *                                a portion of the widget's class name will be used Has to be unique.\n\t * @param string $name            Name for the widget displayed on the configuration page.\n\t * @param array  $widget_options  Optional. Widget options. See wp_register_sidebar_widget() for information\n\t *                                on accepted arguments. Default empty array.\n\t * @param array  $control_options Optional. Widget control options. See wp_register_widget_control() for\n\t *                                information on accepted arguments. Default empty array.\n\t */\n\tpublic function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) {\n\t\t$this->id_base = empty($id_base) ? preg_replace( '/(wp_)?widget_/', '', strtolower(get_class($this)) ) : strtolower($id_base);\n\t\t$this->name = $name;\n\t\t$this->option_name = 'widget_' . $this->id_base;\n\t\t$this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) );\n\t\t$this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) );\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t *\n\t * @param string $id_base\n\t * @param string $name\n\t * @param array  $widget_options\n\t * @param array  $control_options\n\t */\n\tpublic function WP_Widget( $id_base, $name, $widget_options = array(), $control_options = array() ) {\n\t\t_deprecated_constructor( 'WP_Widget', '4.3.0' );\n\t\tWP_Widget::__construct( $id_base, $name, $widget_options, $control_options );\n\t}\n\n\t/**\n\t * Constructs name attributes for use in form() fields\n\t *\n\t * This function should be used in form() methods to create name attributes for fields to be saved by update()\n\t *\n\t * @since 2.8.0\n\t * @since 4.4.0 Array format field names are now accepted.\n\t *\n\t * @param string $field_name Field name\n\t * @return string Name attribute for $field_name\n\t */\n\tpublic function get_field_name($field_name) {\n\t\tif ( false === $pos = strpos( $field_name, '[' ) ) {\n\t\t\treturn 'widget-' . $this->id_base . '[' . $this->number . '][' . $field_name . ']';\n\t\t} else {\n\t\t\treturn 'widget-' . $this->id_base . '[' . $this->number . '][' . substr_replace( $field_name, '][', $pos, strlen( '[' ) );\n\t\t}\n\t}\n\n\t/**\n\t * Constructs id attributes for use in {@see WP_Widget::form()} fields.\n\t *\n\t * This function should be used in form() methods to create id attributes\n\t * for fields to be saved by {@see WP_Widget::update()}.\n\t *\n\t * @since 2.8.0\n\t * @since 4.4.0 Array format field IDs are now accepted.\n\t * @access public\n\t *\n\t * @param string $field_name Field name.\n\t * @return string ID attribute for `$field_name`.\n\t */\n\tpublic function get_field_id( $field_name ) {\n\t\treturn 'widget-' . $this->id_base . '-' . $this->number . '-' . trim( str_replace( array( '[]', '[', ']' ), array( '', '-', '' ), $field_name ), '-' );\n\t}\n\n\t/**\n\t * Register all widget instances of this widget class.\n\t *\n\t * @since 2.8.0\n\t * @access private\n\t */\n\tpublic function _register() {\n\t\t$settings = $this->get_settings();\n\t\t$empty = true;\n\n\t\t// When $settings is an array-like object, get an intrinsic array for use with array_keys().\n\t\tif ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) {\n\t\t\t$settings = $settings->getArrayCopy();\n\t\t}\n\n\t\tif ( is_array( $settings ) ) {\n\t\t\tforeach ( array_keys( $settings ) as $number ) {\n\t\t\t\tif ( is_numeric( $number ) ) {\n\t\t\t\t\t$this->_set( $number );\n\t\t\t\t\t$this->_register_one( $number );\n\t\t\t\t\t$empty = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( $empty ) {\n\t\t\t// If there are none, we register the widget's existence with a generic template.\n\t\t\t$this->_set( 1 );\n\t\t\t$this->_register_one();\n\t\t}\n\t}\n\n\t/**\n\t * Set the internal order number for the widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access private\n\t *\n\t * @param int $number The unique order number of this widget instance compared to other\n\t *                    instances of the same class.\n\t */\n\tpublic function _set($number) {\n\t\t$this->number = $number;\n\t\t$this->id = $this->id_base . '-' . $number;\n\t}\n\n\t/**\n\t * @return callback\n\t */\n\tpublic function _get_display_callback() {\n\t\treturn array($this, 'display_callback');\n\t}\n\t/**\n\t * @return callback\n\t */\n\tpublic function _get_update_callback() {\n\t\treturn array($this, 'update_callback');\n\t}\n\t/**\n\t * @return callback\n\t */\n\tpublic function _get_form_callback() {\n\t\treturn array($this, 'form_callback');\n\t}\n\n\t/**\n\t * Determine whether the current request is inside the Customizer preview.\n\t *\n\t * If true -- the current request is inside the Customizer preview, then\n\t * the object cache gets suspended and widgets should check this to decide\n\t * whether they should store anything persistently to the object cache,\n\t * to transients, or anywhere else.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t *\n\t * @global WP_Customize_Manager $wp_customize\n\t *\n\t * @return bool True if within the Customizer preview, false if not.\n\t */\n\tpublic function is_preview() {\n\t\tglobal $wp_customize;\n\t\treturn ( isset( $wp_customize ) && $wp_customize->is_preview() ) ;\n\t}\n\n\t/**\n\t * Generate the actual widget content (Do NOT override).\n\t *\n\t * Finds the instance and calls {@see WP_Widget::widget()}.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array     $args        Display arguments. See {@see WP_Widget::widget()} for information\n\t *                               on accepted arguments.\n\t * @param int|array $widget_args {\n\t *     Optional. Internal order number of the widget instance, or array of multi-widget arguments.\n\t *     Default 1.\n\t *\n\t *     @type int $number Number increment used for multiples of the same widget.\n\t * }\n\t */\n\tpublic function display_callback( $args, $widget_args = 1 ) {\n\t\tif ( is_numeric( $widget_args ) ) {\n\t\t\t$widget_args = array( 'number' => $widget_args );\n\t\t}\n\n\t\t$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );\n\t\t$this->_set( $widget_args['number'] );\n\t\t$instances = $this->get_settings();\n\n\t\tif ( array_key_exists( $this->number, $instances ) ) {\n\t\t\t$instance = $instances[ $this->number ];\n\n\t\t\t/**\n\t\t\t * Filter the settings for a particular widget instance.\n\t\t\t *\n\t\t\t * Returning false will effectively short-circuit display of the widget.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param array     $instance The current widget instance's settings.\n\t\t\t * @param WP_Widget $this     The current widget instance.\n\t\t\t * @param array     $args     An array of default widget arguments.\n\t\t\t */\n\t\t\t$instance = apply_filters( 'widget_display_callback', $instance, $this, $args );\n\n\t\t\tif ( false === $instance ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$was_cache_addition_suspended = wp_suspend_cache_addition();\n\t\t\tif ( $this->is_preview() && ! $was_cache_addition_suspended ) {\n\t\t\t\twp_suspend_cache_addition( true );\n\t\t\t}\n\n\t\t\t$this->widget( $args, $instance );\n\n\t\t\tif ( $this->is_preview() ) {\n\t\t\t\twp_suspend_cache_addition( $was_cache_addition_suspended );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Deal with changed settings (Do NOT override).\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @global array $wp_registered_widgets\n\t *\n\t * @param int $deprecated Not used.\n\t */\n\tpublic function update_callback( $deprecated = 1 ) {\n\t\tglobal $wp_registered_widgets;\n\n\t\t$all_instances = $this->get_settings();\n\n\t\t// We need to update the data\n\t\tif ( $this->updated )\n\t\t\treturn;\n\n\t\tif ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {\n\t\t\t// Delete the settings for this instance of the widget\n\t\t\tif ( isset($_POST['the-widget-id']) )\n\t\t\t\t$del_id = $_POST['the-widget-id'];\n\t\t\telse\n\t\t\t\treturn;\n\n\t\t\tif ( isset($wp_registered_widgets[$del_id]['params'][0]['number']) ) {\n\t\t\t\t$number = $wp_registered_widgets[$del_id]['params'][0]['number'];\n\n\t\t\t\tif ( $this->id_base . '-' . $number == $del_id )\n\t\t\t\t\tunset($all_instances[$number]);\n\t\t\t}\n\t\t} else {\n\t\t\tif ( isset($_POST['widget-' . $this->id_base]) && is_array($_POST['widget-' . $this->id_base]) ) {\n\t\t\t\t$settings = $_POST['widget-' . $this->id_base];\n\t\t\t} elseif ( isset($_POST['id_base']) && $_POST['id_base'] == $this->id_base ) {\n\t\t\t\t$num = $_POST['multi_number'] ? (int) $_POST['multi_number'] : (int) $_POST['widget_number'];\n\t\t\t\t$settings = array( $num => array() );\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tforeach ( $settings as $number => $new_instance ) {\n\t\t\t\t$new_instance = stripslashes_deep($new_instance);\n\t\t\t\t$this->_set($number);\n\n\t\t\t\t$old_instance = isset($all_instances[$number]) ? $all_instances[$number] : array();\n\n\t\t\t\t$was_cache_addition_suspended = wp_suspend_cache_addition();\n\t\t\t\tif ( $this->is_preview() && ! $was_cache_addition_suspended ) {\n\t\t\t\t\twp_suspend_cache_addition( true );\n\t\t\t\t}\n\n\t\t\t\t$instance = $this->update( $new_instance, $old_instance );\n\n\t\t\t\tif ( $this->is_preview() ) {\n\t\t\t\t\twp_suspend_cache_addition( $was_cache_addition_suspended );\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Filter a widget's settings before saving.\n\t\t\t\t *\n\t\t\t\t * Returning false will effectively short-circuit the widget's ability\n\t\t\t\t * to update settings.\n\t\t\t\t *\n\t\t\t\t * @since 2.8.0\n\t\t\t\t *\n\t\t\t\t * @param array     $instance     The current widget instance's settings.\n\t\t\t\t * @param array     $new_instance Array of new widget settings.\n\t\t\t\t * @param array     $old_instance Array of old widget settings.\n\t\t\t\t * @param WP_Widget $this         The current widget instance.\n\t\t\t\t */\n\t\t\t\t$instance = apply_filters( 'widget_update_callback', $instance, $new_instance, $old_instance, $this );\n\t\t\t\tif ( false !== $instance ) {\n\t\t\t\t\t$all_instances[$number] = $instance;\n\t\t\t\t}\n\n\t\t\t\tbreak; // run only once\n\t\t\t}\n\t\t}\n\n\t\t$this->save_settings($all_instances);\n\t\t$this->updated = true;\n\t}\n\n\t/**\n\t * Generate the widget control form (Do NOT override).\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param int|array $widget_args Widget instance number or array of widget arguments.\n\t * @return string|null\n\t */\n\tpublic function form_callback( $widget_args = 1 ) {\n\t\tif ( is_numeric($widget_args) )\n\t\t\t$widget_args = array( 'number' => $widget_args );\n\n\t\t$widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) );\n\t\t$all_instances = $this->get_settings();\n\n\t\tif ( -1 == $widget_args['number'] ) {\n\t\t\t// We echo out a form where 'number' can be set later\n\t\t\t$this->_set('__i__');\n\t\t\t$instance = array();\n\t\t} else {\n\t\t\t$this->_set($widget_args['number']);\n\t\t\t$instance = $all_instances[ $widget_args['number'] ];\n\t\t}\n\n\t\t/**\n\t\t * Filter the widget instance's settings before displaying the control form.\n\t\t *\n\t\t * Returning false effectively short-circuits display of the control form.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array     $instance The current widget instance's settings.\n\t\t * @param WP_Widget $this     The current widget instance.\n\t\t */\n\t\t$instance = apply_filters( 'widget_form_callback', $instance, $this );\n\n\t\t$return = null;\n\t\tif ( false !== $instance ) {\n\t\t\t$return = $this->form($instance);\n\n\t\t\t/**\n\t\t\t * Fires at the end of the widget control form.\n\t\t\t *\n\t\t\t * Use this hook to add extra fields to the widget form. The hook\n\t\t\t * is only fired if the value passed to the 'widget_form_callback'\n\t\t\t * hook is not false.\n\t\t\t *\n\t\t\t * Note: If the widget has no form, the text echoed from the default\n\t\t\t * form method can be hidden using CSS.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param WP_Widget $this     The widget instance, passed by reference.\n\t\t\t * @param null      $return   Return null if new fields are added.\n\t\t\t * @param array     $instance An array of the widget's settings.\n\t\t\t */\n\t\t\tdo_action_ref_array( 'in_widget_form', array( &$this, &$return, $instance ) );\n\t\t}\n\t\treturn $return;\n\t}\n\n\t/**\n\t * Register an instance of the widget class.\n\t *\n\t * @since 2.8.0\n\t * @access private\n\t *\n\t * @param integer $number Optional. The unique order number of this widget instance\n\t *                        compared to other instances of the same class. Default -1.\n\t */\n\tpublic function _register_one( $number = -1 ) {\n\t\twp_register_sidebar_widget(\t$this->id, $this->name,\t$this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) );\n\t\t_register_widget_update_callback( $this->id_base, $this->_get_update_callback(), $this->control_options, array( 'number' => -1 ) );\n\t\t_register_widget_form_callback(\t$this->id, $this->name,\t$this->_get_form_callback(), $this->control_options, array( 'number' => $number ) );\n\t}\n\n\t/**\n\t * Save the settings for all instances of the widget class.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $settings Multi-dimensional array of widget instance settings.\n\t */\n\tpublic function save_settings( $settings ) {\n\t\t$settings['_multiwidget'] = 1;\n\t\tupdate_option( $this->option_name, $settings );\n\t}\n\n\t/**\n\t * Get the settings for all instances of the widget class.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @return array Multi-dimensional array of widget instance settings.\n\t */\n\tpublic function get_settings() {\n\n\t\t$settings = get_option( $this->option_name );\n\n\t\tif ( false === $settings ) {\n\t\t\tif ( isset( $this->alt_option_name ) ) {\n\t\t\t\t$settings = get_option( $this->alt_option_name );\n\t\t\t} else {\n\t\t\t\t// Save an option so it can be autoloaded next time.\n\t\t\t\t$this->save_settings( array() );\n\t\t\t}\n\t\t}\n\n\t\tif ( ! is_array( $settings ) && ! ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) ) {\n\t\t\t$settings = array();\n\t\t}\n\n\t\tif ( ! empty( $settings ) && ! isset( $settings['_multiwidget'] ) ) {\n\t\t\t// Old format, convert if single widget.\n\t\t\t$settings = wp_convert_widget_settings( $this->id_base, $this->option_name, $settings );\n\t\t}\n\n\t\tunset( $settings['_multiwidget'], $settings['__i__'] );\n\t\treturn $settings;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp-xmlrpc-server.php",
    "content": "<?php\n/**\n * XML-RPC protocol support for WordPress\n *\n * @package WordPress\n * @subpackage Publishing\n */\n\n/**\n * WordPress XMLRPC server implementation.\n *\n * Implements compatibility for Blogger API, MetaWeblog API, MovableType, and\n * pingback. Additional WordPress API for managing comments, pages, posts,\n * options, etc.\n *\n * As of WordPress 3.5.0, XML-RPC is enabled by default. It can be disabled\n * via the xmlrpc_enabled filter found in wp_xmlrpc_server::login().\n *\n * @package WordPress\n * @subpackage Publishing\n * @since 1.5.0\n */\nclass wp_xmlrpc_server extends IXR_Server {\n\t/**\n\t * Methods.\n\t *\n\t * @access public\n\t * @var array\n\t */\n\tpublic $methods;\n\n\t/**\n\t * Blog options.\n\t *\n\t * @access public\n\t * @var array\n\t */\n\tpublic $blog_options;\n\n\t/**\n\t * IXR_Error instance.\n\t *\n\t * @access public\n\t * @var IXR_Error\n\t */\n\tpublic $error;\n\n\t/**\n\t * Flags that the user authentication has failed in this instance of wp_xmlrpc_server.\n\t *\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $auth_failed = false;\n\n\t/**\n\t * Register all of the XMLRPC methods that XMLRPC server understands.\n\t *\n\t * Sets up server and method property. Passes XMLRPC\n\t * methods through the 'xmlrpc_methods' filter to allow plugins to extend\n\t * or replace XMLRPC methods.\n\t *\n\t * @since 1.5.0\n\t */\n\tpublic function __construct() {\n\t\t$this->methods = array(\n\t\t\t// WordPress API\n\t\t\t'wp.getUsersBlogs'\t\t=> 'this:wp_getUsersBlogs',\n\t\t\t'wp.newPost'\t\t\t=> 'this:wp_newPost',\n\t\t\t'wp.editPost'\t\t\t=> 'this:wp_editPost',\n\t\t\t'wp.deletePost'\t\t\t=> 'this:wp_deletePost',\n\t\t\t'wp.getPost'\t\t\t=> 'this:wp_getPost',\n\t\t\t'wp.getPosts'\t\t\t=> 'this:wp_getPosts',\n\t\t\t'wp.newTerm'\t\t\t=> 'this:wp_newTerm',\n\t\t\t'wp.editTerm'\t\t\t=> 'this:wp_editTerm',\n\t\t\t'wp.deleteTerm'\t\t\t=> 'this:wp_deleteTerm',\n\t\t\t'wp.getTerm'\t\t\t=> 'this:wp_getTerm',\n\t\t\t'wp.getTerms'\t\t\t=> 'this:wp_getTerms',\n\t\t\t'wp.getTaxonomy'\t\t=> 'this:wp_getTaxonomy',\n\t\t\t'wp.getTaxonomies'\t\t=> 'this:wp_getTaxonomies',\n\t\t\t'wp.getUser'\t\t\t=> 'this:wp_getUser',\n\t\t\t'wp.getUsers'\t\t\t=> 'this:wp_getUsers',\n\t\t\t'wp.getProfile'\t\t\t=> 'this:wp_getProfile',\n\t\t\t'wp.editProfile'\t\t=> 'this:wp_editProfile',\n\t\t\t'wp.getPage'\t\t\t=> 'this:wp_getPage',\n\t\t\t'wp.getPages'\t\t\t=> 'this:wp_getPages',\n\t\t\t'wp.newPage'\t\t\t=> 'this:wp_newPage',\n\t\t\t'wp.deletePage'\t\t\t=> 'this:wp_deletePage',\n\t\t\t'wp.editPage'\t\t\t=> 'this:wp_editPage',\n\t\t\t'wp.getPageList'\t\t=> 'this:wp_getPageList',\n\t\t\t'wp.getAuthors'\t\t\t=> 'this:wp_getAuthors',\n\t\t\t'wp.getCategories'\t\t=> 'this:mw_getCategories',\t\t// Alias\n\t\t\t'wp.getTags'\t\t\t=> 'this:wp_getTags',\n\t\t\t'wp.newCategory'\t\t=> 'this:wp_newCategory',\n\t\t\t'wp.deleteCategory'\t\t=> 'this:wp_deleteCategory',\n\t\t\t'wp.suggestCategories'\t=> 'this:wp_suggestCategories',\n\t\t\t'wp.uploadFile'\t\t\t=> 'this:mw_newMediaObject',\t// Alias\n\t\t\t'wp.deleteFile'\t\t\t=> 'this:wp_deletePost',\t\t// Alias\n\t\t\t'wp.getCommentCount'\t=> 'this:wp_getCommentCount',\n\t\t\t'wp.getPostStatusList'\t=> 'this:wp_getPostStatusList',\n\t\t\t'wp.getPageStatusList'\t=> 'this:wp_getPageStatusList',\n\t\t\t'wp.getPageTemplates'\t=> 'this:wp_getPageTemplates',\n\t\t\t'wp.getOptions'\t\t\t=> 'this:wp_getOptions',\n\t\t\t'wp.setOptions'\t\t\t=> 'this:wp_setOptions',\n\t\t\t'wp.getComment'\t\t\t=> 'this:wp_getComment',\n\t\t\t'wp.getComments'\t\t=> 'this:wp_getComments',\n\t\t\t'wp.deleteComment'\t\t=> 'this:wp_deleteComment',\n\t\t\t'wp.editComment'\t\t=> 'this:wp_editComment',\n\t\t\t'wp.newComment'\t\t\t=> 'this:wp_newComment',\n\t\t\t'wp.getCommentStatusList' => 'this:wp_getCommentStatusList',\n\t\t\t'wp.getMediaItem'\t\t=> 'this:wp_getMediaItem',\n\t\t\t'wp.getMediaLibrary'\t=> 'this:wp_getMediaLibrary',\n\t\t\t'wp.getPostFormats'     => 'this:wp_getPostFormats',\n\t\t\t'wp.getPostType'\t\t=> 'this:wp_getPostType',\n\t\t\t'wp.getPostTypes'\t\t=> 'this:wp_getPostTypes',\n\t\t\t'wp.getRevisions'\t\t=> 'this:wp_getRevisions',\n\t\t\t'wp.restoreRevision'\t=> 'this:wp_restoreRevision',\n\n\t\t\t// Blogger API\n\t\t\t'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs',\n\t\t\t'blogger.getUserInfo' => 'this:blogger_getUserInfo',\n\t\t\t'blogger.getPost' => 'this:blogger_getPost',\n\t\t\t'blogger.getRecentPosts' => 'this:blogger_getRecentPosts',\n\t\t\t'blogger.newPost' => 'this:blogger_newPost',\n\t\t\t'blogger.editPost' => 'this:blogger_editPost',\n\t\t\t'blogger.deletePost' => 'this:blogger_deletePost',\n\n\t\t\t// MetaWeblog API (with MT extensions to structs)\n\t\t\t'metaWeblog.newPost' => 'this:mw_newPost',\n\t\t\t'metaWeblog.editPost' => 'this:mw_editPost',\n\t\t\t'metaWeblog.getPost' => 'this:mw_getPost',\n\t\t\t'metaWeblog.getRecentPosts' => 'this:mw_getRecentPosts',\n\t\t\t'metaWeblog.getCategories' => 'this:mw_getCategories',\n\t\t\t'metaWeblog.newMediaObject' => 'this:mw_newMediaObject',\n\n\t\t\t// MetaWeblog API aliases for Blogger API\n\t\t\t// see http://www.xmlrpc.com/stories/storyReader$2460\n\t\t\t'metaWeblog.deletePost' => 'this:blogger_deletePost',\n\t\t\t'metaWeblog.getUsersBlogs' => 'this:blogger_getUsersBlogs',\n\n\t\t\t// MovableType API\n\t\t\t'mt.getCategoryList' => 'this:mt_getCategoryList',\n\t\t\t'mt.getRecentPostTitles' => 'this:mt_getRecentPostTitles',\n\t\t\t'mt.getPostCategories' => 'this:mt_getPostCategories',\n\t\t\t'mt.setPostCategories' => 'this:mt_setPostCategories',\n\t\t\t'mt.supportedMethods' => 'this:mt_supportedMethods',\n\t\t\t'mt.supportedTextFilters' => 'this:mt_supportedTextFilters',\n\t\t\t'mt.getTrackbackPings' => 'this:mt_getTrackbackPings',\n\t\t\t'mt.publishPost' => 'this:mt_publishPost',\n\n\t\t\t// PingBack\n\t\t\t'pingback.ping' => 'this:pingback_ping',\n\t\t\t'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks',\n\n\t\t\t'demo.sayHello' => 'this:sayHello',\n\t\t\t'demo.addTwoNumbers' => 'this:addTwoNumbers'\n\t\t);\n\n\t\t$this->initialise_blog_option_info();\n\n\t\t/**\n\t\t * Filter the methods exposed by the XML-RPC server.\n\t\t *\n\t\t * This filter can be used to add new methods, and remove built-in methods.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $methods An array of XML-RPC methods.\n\t\t */\n\t\t$this->methods = apply_filters( 'xmlrpc_methods', $this->methods );\n\t}\n\n\t/**\n\t * Make private/protected methods readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param callable $name      Method to call.\n\t * @param array    $arguments Arguments to pass when calling.\n\t * @return array|IXR_Error|false Return value of the callback, false otherwise.\n\t */\n\tpublic function __call( $name, $arguments ) {\n\t\tif ( '_multisite_getUsersBlogs' === $name ) {\n\t\t\treturn call_user_func_array( array( $this, $name ), $arguments );\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function serve_request() {\n\t\t$this->IXR_Server($this->methods);\n\t}\n\n\t/**\n\t * Test XMLRPC API by saying, \"Hello!\" to client.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @return string Hello string response.\n\t */\n\tpublic function sayHello() {\n\t\treturn 'Hello!';\n\t}\n\n\t/**\n\t * Test XMLRPC API by adding two numbers for client.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int $number1 A number to add.\n\t *     @type int $number2 A second number to add.\n\t * }\n\t * @return int Sum of the two given numbers.\n\t */\n\tpublic function addTwoNumbers( $args ) {\n\t\t$number1 = $args[0];\n\t\t$number2 = $args[1];\n\t\treturn $number1 + $number2;\n\t}\n\n\t/**\n\t * Log user in.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $username User's username.\n\t * @param string $password User's password.\n\t * @return WP_User|bool WP_User object if authentication passed, false otherwise\n\t */\n\tpublic function login( $username, $password ) {\n\t\t/*\n\t\t * Respect old get_option() filters left for back-compat when the 'enable_xmlrpc'\n\t\t * option was deprecated in 3.5.0. Use the 'xmlrpc_enabled' hook instead.\n\t\t */\n\t\t$enabled = apply_filters( 'pre_option_enable_xmlrpc', false );\n\t\tif ( false === $enabled ) {\n\t\t\t$enabled = apply_filters( 'option_enable_xmlrpc', true );\n\t\t}\n\n\t\t/**\n\t\t * Filter whether XML-RPC is enabled.\n\t\t *\n\t\t * This is the proper filter for turning off XML-RPC.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param bool $enabled Whether XML-RPC is enabled. Default true.\n\t\t */\n\t\t$enabled = apply_filters( 'xmlrpc_enabled', $enabled );\n\n\t\tif ( ! $enabled ) {\n\t\t\t$this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site.' ) ) );\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( $this->auth_failed ) {\n\t\t\t$user = new WP_Error( 'login_prevented' );\n\t\t} else {\n\t\t\t$user = wp_authenticate( $username, $password );\n\t\t}\n\n\t\tif ( is_wp_error( $user ) ) {\n\t\t\t$this->error = new IXR_Error( 403, __( 'Incorrect username or password.' ) );\n\n\t\t\t// Flag that authentication has failed once on this wp_xmlrpc_server instance\n\t\t\t$this->auth_failed = true;\n\n\t\t\t/**\n\t\t\t * Filter the XML-RPC user login error message.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param string  $error The XML-RPC error message.\n\t\t\t * @param WP_User $user  WP_User object.\n\t\t\t */\n\t\t\t$this->error = apply_filters( 'xmlrpc_login_error', $this->error, $user );\n\t\t\treturn false;\n\t\t}\n\n\t\twp_set_current_user( $user->ID );\n\t\treturn $user;\n\t}\n\n\t/**\n\t * Check user's credentials. Deprecated.\n\t *\n\t * @since 1.5.0\n\t * @deprecated 2.8.0 Use wp_xmlrpc_server::login()\n\t * @see wp_xmlrpc_server::login()\n\t *\n\t * @param string $username User's username.\n\t * @param string $password User's password.\n\t * @return bool Whether authentication passed.\n\t */\n\tpublic function login_pass_ok( $username, $password ) {\n\t\treturn (bool) $this->login( $username, $password );\n\t}\n\n\t/**\n\t * Escape string or array of strings for database.\n\t *\n\t * @since 1.5.2\n\t *\n\t * @param string|array $data Escape single string or array of strings.\n\t * @return string|void Returns with string is passed, alters by-reference\n\t *                     when array is passed.\n\t */\n\tpublic function escape( &$data ) {\n\t\tif ( ! is_array( $data ) )\n\t\t\treturn wp_slash( $data );\n\n\t\tforeach ( $data as &$v ) {\n\t\t\tif ( is_array( $v ) )\n\t\t\t\t$this->escape( $v );\n\t\t\telseif ( ! is_object( $v ) )\n\t\t\t\t$v = wp_slash( $v );\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve custom fields for post.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param int $post_id Post ID.\n\t * @return array Custom fields, if exist.\n\t */\n\tpublic function get_custom_fields($post_id) {\n\t\t$post_id = (int) $post_id;\n\n\t\t$custom_fields = array();\n\n\t\tforeach ( (array) has_meta($post_id) as $meta ) {\n\t\t\t// Don't expose protected fields.\n\t\t\tif ( ! current_user_can( 'edit_post_meta', $post_id , $meta['meta_key'] ) )\n\t\t\t\tcontinue;\n\n\t\t\t$custom_fields[] = array(\n\t\t\t\t\"id\"    => $meta['meta_id'],\n\t\t\t\t\"key\"   => $meta['meta_key'],\n\t\t\t\t\"value\" => $meta['meta_value']\n\t\t\t);\n\t\t}\n\n\t\treturn $custom_fields;\n\t}\n\n\t/**\n\t * Set custom fields for post.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param int $post_id Post ID.\n\t * @param array $fields Custom fields.\n\t */\n\tpublic function set_custom_fields($post_id, $fields) {\n\t\t$post_id = (int) $post_id;\n\n\t\tforeach ( (array) $fields as $meta ) {\n\t\t\tif ( isset($meta['id']) ) {\n\t\t\t\t$meta['id'] = (int) $meta['id'];\n\t\t\t\t$pmeta = get_metadata_by_mid( 'post', $meta['id'] );\n\t\t\t\tif ( isset($meta['key']) ) {\n\t\t\t\t\t$meta['key'] = wp_unslash( $meta['key'] );\n\t\t\t\t\tif ( $meta['key'] !== $pmeta->meta_key )\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t$meta['value'] = wp_unslash( $meta['value'] );\n\t\t\t\t\tif ( current_user_can( 'edit_post_meta', $post_id, $meta['key'] ) )\n\t\t\t\t\t\tupdate_metadata_by_mid( 'post', $meta['id'], $meta['value'] );\n\t\t\t\t} elseif ( current_user_can( 'delete_post_meta', $post_id, $pmeta->meta_key ) ) {\n\t\t\t\t\tdelete_metadata_by_mid( 'post', $meta['id'] );\n\t\t\t\t}\n\t\t\t} elseif ( current_user_can( 'add_post_meta', $post_id, wp_unslash( $meta['key'] ) ) ) {\n\t\t\t\tadd_post_meta( $post_id, $meta['key'], $meta['value'] );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Set up blog options property.\n\t *\n\t * Passes property through {@see 'xmlrpc_blog_options'} filter.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @global string $wp_version\n\t */\n\tpublic function initialise_blog_option_info() {\n\t\tglobal $wp_version;\n\n\t\t$this->blog_options = array(\n\t\t\t// Read only options\n\t\t\t'software_name'     => array(\n\t\t\t\t'desc'          => __( 'Software Name' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'value'         => 'WordPress'\n\t\t\t),\n\t\t\t'software_version'  => array(\n\t\t\t\t'desc'          => __( 'Software Version' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'value'         => $wp_version\n\t\t\t),\n\t\t\t'blog_url'          => array(\n\t\t\t\t'desc'          => __( 'WordPress Address (URL)' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'option'        => 'siteurl'\n\t\t\t),\n\t\t\t'home_url'          => array(\n\t\t\t\t'desc'          => __( 'Site Address (URL)' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'option'        => 'home'\n\t\t\t),\n\t\t\t'login_url'          => array(\n\t\t\t\t'desc'          => __( 'Login Address (URL)' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'value'         => wp_login_url( )\n\t\t\t),\n\t\t\t'admin_url'          => array(\n\t\t\t\t'desc'          => __( 'The URL to the admin area' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'value'         => get_admin_url( )\n\t\t\t),\n\t\t\t'image_default_link_type' => array(\n\t\t\t\t'desc'          => __( 'Image default link type' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'option'        => 'image_default_link_type'\n\t\t\t),\n\t\t\t'image_default_size' => array(\n\t\t\t\t'desc'          => __( 'Image default size' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'option'        => 'image_default_size'\n\t\t\t),\n\t\t\t'image_default_align' => array(\n\t\t\t\t'desc'          => __( 'Image default align' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'option'        => 'image_default_align'\n\t\t\t),\n\t\t\t'template'          => array(\n\t\t\t\t'desc'          => __( 'Template' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'option'        => 'template'\n\t\t\t),\n\t\t\t'stylesheet'        => array(\n\t\t\t\t'desc'          => __( 'Stylesheet' ),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'option'        => 'stylesheet'\n\t\t\t),\n\t\t\t'post_thumbnail'    => array(\n\t\t\t\t'desc'          => __('Post Thumbnail'),\n\t\t\t\t'readonly'      => true,\n\t\t\t\t'value'         => current_theme_supports( 'post-thumbnails' )\n\t\t\t),\n\n\t\t\t// Updatable options\n\t\t\t'time_zone'         => array(\n\t\t\t\t'desc'          => __( 'Time Zone' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'gmt_offset'\n\t\t\t),\n\t\t\t'blog_title'        => array(\n\t\t\t\t'desc'          => __( 'Site Title' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'blogname'\n\t\t\t),\n\t\t\t'blog_tagline'      => array(\n\t\t\t\t'desc'          => __( 'Site Tagline' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'blogdescription'\n\t\t\t),\n\t\t\t'date_format'       => array(\n\t\t\t\t'desc'          => __( 'Date Format' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'date_format'\n\t\t\t),\n\t\t\t'time_format'       => array(\n\t\t\t\t'desc'          => __( 'Time Format' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'time_format'\n\t\t\t),\n\t\t\t'users_can_register' => array(\n\t\t\t\t'desc'          => __( 'Allow new users to sign up' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'users_can_register'\n\t\t\t),\n\t\t\t'thumbnail_size_w'  => array(\n\t\t\t\t'desc'          => __( 'Thumbnail Width' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'thumbnail_size_w'\n\t\t\t),\n\t\t\t'thumbnail_size_h'  => array(\n\t\t\t\t'desc'          => __( 'Thumbnail Height' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'thumbnail_size_h'\n\t\t\t),\n\t\t\t'thumbnail_crop'    => array(\n\t\t\t\t'desc'          => __( 'Crop thumbnail to exact dimensions' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'thumbnail_crop'\n\t\t\t),\n\t\t\t'medium_size_w'     => array(\n\t\t\t\t'desc'          => __( 'Medium size image width' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'medium_size_w'\n\t\t\t),\n\t\t\t'medium_size_h'     => array(\n\t\t\t\t'desc'          => __( 'Medium size image height' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'medium_size_h'\n\t\t\t),\n\t\t\t'medium_large_size_w'   => array(\n\t\t\t\t'desc'          => __( 'Medium-Large size image width' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'medium_large_size_w'\n\t\t\t),\n\t\t\t'medium_large_size_h'   => array(\n\t\t\t\t'desc'          => __( 'Medium-Large size image height' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'medium_large_size_h'\n\t\t\t),\n\t\t\t'large_size_w'      => array(\n\t\t\t\t'desc'          => __( 'Large size image width' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'large_size_w'\n\t\t\t),\n\t\t\t'large_size_h'      => array(\n\t\t\t\t'desc'          => __( 'Large size image height' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'large_size_h'\n\t\t\t),\n\t\t\t'default_comment_status' => array(\n\t\t\t\t'desc'          => __( 'Allow people to post comments on new articles' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'default_comment_status'\n\t\t\t),\n\t\t\t'default_ping_status' => array(\n\t\t\t\t'desc'          => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new articles' ),\n\t\t\t\t'readonly'      => false,\n\t\t\t\t'option'        => 'default_ping_status'\n\t\t\t)\n\t\t);\n\n\t\t/**\n\t\t * Filter the XML-RPC blog options property.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param array $blog_options An array of XML-RPC blog options.\n\t\t */\n\t\t$this->blog_options = apply_filters( 'xmlrpc_blog_options', $this->blog_options );\n\t}\n\n\t/**\n\t * Retrieve the blogs of the user.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param array $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type string $username Username.\n\t *     @type string $password Password.\n\t * }\n\t * @return array|IXR_Error Array contains:\n\t *  - 'isAdmin'\n\t *  - 'isPrimary' - whether the blog is the user's primary blog\n\t *  - 'url'\n\t *  - 'blogid'\n\t *  - 'blogName'\n\t *  - 'xmlrpc' - url of xmlrpc endpoint\n\t */\n\tpublic function wp_getUsersBlogs( $args ) {\n\t\t// If this isn't on WPMU then just use blogger_getUsersBlogs\n\t\tif ( !is_multisite() ) {\n\t\t\tarray_unshift( $args, 1 );\n\t\t\treturn $this->blogger_getUsersBlogs( $args );\n\t\t}\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[0];\n\t\t$password = $args[1];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/**\n\t\t * Fires after the XML-RPC user has been authenticated but before the rest of\n\t\t * the method logic begins.\n\t\t *\n\t\t * All built-in XML-RPC methods use the action xmlrpc_call, with a parameter\n\t\t * equal to the method's name, e.g., wp.getUsersBlogs, wp.newPost, etc.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $name The method name.\n\t\t */\n\t\tdo_action( 'xmlrpc_call', 'wp.getUsersBlogs' );\n\n\t\t$blogs = (array) get_blogs_of_user( $user->ID );\n\t\t$struct = array();\n\t\t$primary_blog_id = 0;\n\t\t$active_blog = get_active_blog_for_user( $user->ID );\n\t\tif ( $active_blog ) {\n\t\t\t$primary_blog_id = (int) $active_blog->blog_id;\n\t\t}\n\n\t\tforeach ( $blogs as $blog ) {\n\t\t\t// Don't include blogs that aren't hosted at this site.\n\t\t\tif ( $blog->site_id != get_current_site()->id )\n\t\t\t\tcontinue;\n\n\t\t\t$blog_id = $blog->userblog_id;\n\n\t\t\tswitch_to_blog( $blog_id );\n\n\t\t\t$is_admin = current_user_can( 'manage_options' );\n\t\t\t$is_primary = ( (int) $blog_id === $primary_blog_id );\n\n\t\t\t$struct[] = array(\n\t\t\t\t'isAdmin'   => $is_admin,\n\t\t\t\t'isPrimary' => $is_primary,\n\t\t\t\t'url'       => home_url( '/' ),\n\t\t\t\t'blogid'    => (string) $blog_id,\n\t\t\t\t'blogName'  => get_option( 'blogname' ),\n\t\t\t\t'xmlrpc'    => site_url( 'xmlrpc.php', 'rpc' ),\n\t\t\t);\n\n\t\t\trestore_current_blog();\n\t\t}\n\n\t\treturn $struct;\n\t}\n\n\t/**\n\t * Checks if the method received at least the minimum number of arguments.\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t *\n\t * @param string|array $args Sanitize single string or array of strings.\n\t * @param int $count         Minimum number of arguments.\n\t * @return bool if `$args` contains at least $count arguments.\n\t */\n\tprotected function minimum_args( $args, $count ) {\n\t\tif ( count( $args ) < $count ) {\n\t\t\t$this->error = new IXR_Error( 400, __( 'Insufficient arguments passed to this XML-RPC method.' ) );\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Prepares taxonomy data for return in an XML-RPC object.\n\t *\n\t * @access protected\n\t *\n\t * @param object $taxonomy The unprepared taxonomy data.\n\t * @param array $fields    The subset of taxonomy fields to return.\n\t * @return array The prepared taxonomy data.\n\t */\n\tprotected function _prepare_taxonomy( $taxonomy, $fields ) {\n\t\t$_taxonomy = array(\n\t\t\t'name' => $taxonomy->name,\n\t\t\t'label' => $taxonomy->label,\n\t\t\t'hierarchical' => (bool) $taxonomy->hierarchical,\n\t\t\t'public' => (bool) $taxonomy->public,\n\t\t\t'show_ui' => (bool) $taxonomy->show_ui,\n\t\t\t'_builtin' => (bool) $taxonomy->_builtin,\n\t\t);\n\n\t\tif ( in_array( 'labels', $fields ) )\n\t\t\t$_taxonomy['labels'] = (array) $taxonomy->labels;\n\n\t\tif ( in_array( 'cap', $fields ) )\n\t\t\t$_taxonomy['cap'] = (array) $taxonomy->cap;\n\n\t\tif ( in_array( 'menu', $fields ) )\n\t\t\t$_taxonomy['show_in_menu'] = (bool) $_taxonomy->show_in_menu;\n\n\t\tif ( in_array( 'object_type', $fields ) )\n\t\t\t$_taxonomy['object_type'] = array_unique( (array) $taxonomy->object_type );\n\n\t\t/**\n\t\t * Filter XML-RPC-prepared data for the given taxonomy.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array  $_taxonomy An array of taxonomy data.\n\t\t * @param object $taxonomy  Taxonomy object.\n\t\t * @param array  $fields    The subset of taxonomy fields to return.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_prepare_taxonomy', $_taxonomy, $taxonomy, $fields );\n\t}\n\n\t/**\n\t * Prepares term data for return in an XML-RPC object.\n\t *\n\t * @access protected\n\t *\n\t * @param array|object $term The unprepared term data.\n\t * @return array The prepared term data.\n\t */\n\tprotected function _prepare_term( $term ) {\n\t\t$_term = $term;\n\t\tif ( ! is_array( $_term ) )\n\t\t\t$_term = get_object_vars( $_term );\n\n\t\t// For integers which may be larger than XML-RPC supports ensure we return strings.\n\t\t$_term['term_id'] = strval( $_term['term_id'] );\n\t\t$_term['term_group'] = strval( $_term['term_group'] );\n\t\t$_term['term_taxonomy_id'] = strval( $_term['term_taxonomy_id'] );\n\t\t$_term['parent'] = strval( $_term['parent'] );\n\n\t\t// Count we are happy to return as an integer because people really shouldn't use terms that much.\n\t\t$_term['count'] = intval( $_term['count'] );\n\n\t\t/**\n\t\t * Filter XML-RPC-prepared data for the given term.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array        $_term An array of term data.\n\t\t * @param array|object $term  Term object or array.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_prepare_term', $_term, $term );\n\t}\n\n\t/**\n\t * Convert a WordPress date string to an IXR_Date object.\n\t *\n\t * @access protected\n\t *\n\t * @param string $date Date string to convert.\n\t * @return IXR_Date IXR_Date object.\n\t */\n\tprotected function _convert_date( $date ) {\n\t\tif ( $date === '0000-00-00 00:00:00' ) {\n\t\t\treturn new IXR_Date( '00000000T00:00:00Z' );\n\t\t}\n\t\treturn new IXR_Date( mysql2date( 'Ymd\\TH:i:s', $date, false ) );\n\t}\n\n\t/**\n\t * Convert a WordPress GMT date string to an IXR_Date object.\n\t *\n\t * @access protected\n\t *\n\t * @param string $date_gmt WordPress GMT date string.\n\t * @param string $date     Date string.\n\t * @return IXR_Date IXR_Date object.\n\t */\n\tprotected function _convert_date_gmt( $date_gmt, $date ) {\n\t\tif ( $date !== '0000-00-00 00:00:00' && $date_gmt === '0000-00-00 00:00:00' ) {\n\t\t\treturn new IXR_Date( get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $date, false ), 'Ymd\\TH:i:s' ) );\n\t\t}\n\t\treturn $this->_convert_date( $date_gmt );\n\t}\n\n\t/**\n\t * Prepares post data for return in an XML-RPC object.\n\t *\n\t * @access protected\n\t *\n\t * @param array $post   The unprepared post data.\n\t * @param array $fields The subset of post type fields to return.\n\t * @return array The prepared post data.\n\t */\n\tprotected function _prepare_post( $post, $fields ) {\n\t\t// Holds the data for this post. built up based on $fields.\n\t\t$_post = array( 'post_id' => strval( $post['ID'] ) );\n\n\t\t// Prepare common post fields.\n\t\t$post_fields = array(\n\t\t\t'post_title'        => $post['post_title'],\n\t\t\t'post_date'         => $this->_convert_date( $post['post_date'] ),\n\t\t\t'post_date_gmt'     => $this->_convert_date_gmt( $post['post_date_gmt'], $post['post_date'] ),\n\t\t\t'post_modified'     => $this->_convert_date( $post['post_modified'] ),\n\t\t\t'post_modified_gmt' => $this->_convert_date_gmt( $post['post_modified_gmt'], $post['post_modified'] ),\n\t\t\t'post_status'       => $post['post_status'],\n\t\t\t'post_type'         => $post['post_type'],\n\t\t\t'post_name'         => $post['post_name'],\n\t\t\t'post_author'       => $post['post_author'],\n\t\t\t'post_password'     => $post['post_password'],\n\t\t\t'post_excerpt'      => $post['post_excerpt'],\n\t\t\t'post_content'      => $post['post_content'],\n\t\t\t'post_parent'       => strval( $post['post_parent'] ),\n\t\t\t'post_mime_type'    => $post['post_mime_type'],\n\t\t\t'link'              => get_permalink( $post['ID'] ),\n\t\t\t'guid'              => $post['guid'],\n\t\t\t'menu_order'        => intval( $post['menu_order'] ),\n\t\t\t'comment_status'    => $post['comment_status'],\n\t\t\t'ping_status'       => $post['ping_status'],\n\t\t\t'sticky'            => ( $post['post_type'] === 'post' && is_sticky( $post['ID'] ) ),\n\t\t);\n\n\t\t// Thumbnail.\n\t\t$post_fields['post_thumbnail'] = array();\n\t\t$thumbnail_id = get_post_thumbnail_id( $post['ID'] );\n\t\tif ( $thumbnail_id ) {\n\t\t\t$thumbnail_size = current_theme_supports('post-thumbnail') ? 'post-thumbnail' : 'thumbnail';\n\t\t\t$post_fields['post_thumbnail'] = $this->_prepare_media_item( get_post( $thumbnail_id ), $thumbnail_size );\n\t\t}\n\n\t\t// Consider future posts as published.\n\t\tif ( $post_fields['post_status'] === 'future' )\n\t\t\t$post_fields['post_status'] = 'publish';\n\n\t\t// Fill in blank post format.\n\t\t$post_fields['post_format'] = get_post_format( $post['ID'] );\n\t\tif ( empty( $post_fields['post_format'] ) )\n\t\t\t$post_fields['post_format'] = 'standard';\n\n\t\t// Merge requested $post_fields fields into $_post.\n\t\tif ( in_array( 'post', $fields ) ) {\n\t\t\t$_post = array_merge( $_post, $post_fields );\n\t\t} else {\n\t\t\t$requested_fields = array_intersect_key( $post_fields, array_flip( $fields ) );\n\t\t\t$_post = array_merge( $_post, $requested_fields );\n\t\t}\n\n\t\t$all_taxonomy_fields = in_array( 'taxonomies', $fields );\n\n\t\tif ( $all_taxonomy_fields || in_array( 'terms', $fields ) ) {\n\t\t\t$post_type_taxonomies = get_object_taxonomies( $post['post_type'], 'names' );\n\t\t\t$terms = wp_get_object_terms( $post['ID'], $post_type_taxonomies );\n\t\t\t$_post['terms'] = array();\n\t\t\tforeach ( $terms as $term ) {\n\t\t\t\t$_post['terms'][] = $this->_prepare_term( $term );\n\t\t\t}\n\t\t}\n\n\t\tif ( in_array( 'custom_fields', $fields ) )\n\t\t\t$_post['custom_fields'] = $this->get_custom_fields( $post['ID'] );\n\n\t\tif ( in_array( 'enclosure', $fields ) ) {\n\t\t\t$_post['enclosure'] = array();\n\t\t\t$enclosures = (array) get_post_meta( $post['ID'], 'enclosure' );\n\t\t\tif ( ! empty( $enclosures ) ) {\n\t\t\t\t$encdata = explode( \"\\n\", $enclosures[0] );\n\t\t\t\t$_post['enclosure']['url'] = trim( htmlspecialchars( $encdata[0] ) );\n\t\t\t\t$_post['enclosure']['length'] = (int) trim( $encdata[1] );\n\t\t\t\t$_post['enclosure']['type'] = trim( $encdata[2] );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter XML-RPC-prepared date for the given post.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array $_post  An array of modified post data.\n\t\t * @param array $post   An array of post data.\n\t\t * @param array $fields An array of post fields.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_prepare_post', $_post, $post, $fields );\n\t}\n\n\t/**\n\t * Prepares post data for return in an XML-RPC object.\n\t *\n\t * @access protected\n\t *\n\t * @param object $post_type Post type object.\n\t * @param array  $fields    The subset of post fields to return.\n\t * @return array The prepared post type data.\n\t */\n\tprotected function _prepare_post_type( $post_type, $fields ) {\n\t\t$_post_type = array(\n\t\t\t'name' => $post_type->name,\n\t\t\t'label' => $post_type->label,\n\t\t\t'hierarchical' => (bool) $post_type->hierarchical,\n\t\t\t'public' => (bool) $post_type->public,\n\t\t\t'show_ui' => (bool) $post_type->show_ui,\n\t\t\t'_builtin' => (bool) $post_type->_builtin,\n\t\t\t'has_archive' => (bool) $post_type->has_archive,\n\t\t\t'supports' => get_all_post_type_supports( $post_type->name ),\n\t\t);\n\n\t\tif ( in_array( 'labels', $fields ) ) {\n\t\t\t$_post_type['labels'] = (array) $post_type->labels;\n\t\t}\n\n\t\tif ( in_array( 'cap', $fields ) ) {\n\t\t\t$_post_type['cap'] = (array) $post_type->cap;\n\t\t\t$_post_type['map_meta_cap'] = (bool) $post_type->map_meta_cap;\n\t\t}\n\n\t\tif ( in_array( 'menu', $fields ) ) {\n\t\t\t$_post_type['menu_position'] = (int) $post_type->menu_position;\n\t\t\t$_post_type['menu_icon'] = $post_type->menu_icon;\n\t\t\t$_post_type['show_in_menu'] = (bool) $post_type->show_in_menu;\n\t\t}\n\n\t\tif ( in_array( 'taxonomies', $fields ) )\n\t\t\t$_post_type['taxonomies'] = get_object_taxonomies( $post_type->name, 'names' );\n\n\t\t/**\n\t\t * Filter XML-RPC-prepared date for the given post type.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array  $_post_type An array of post type data.\n\t\t * @param object $post_type  Post type object.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_prepare_post_type', $_post_type, $post_type );\n\t}\n\n\t/**\n\t * Prepares media item data for return in an XML-RPC object.\n\t *\n\t * @access protected\n\t *\n\t * @param object $media_item     The unprepared media item data.\n\t * @param string $thumbnail_size The image size to use for the thumbnail URL.\n\t * @return array The prepared media item data.\n\t */\n\tprotected function _prepare_media_item( $media_item, $thumbnail_size = 'thumbnail' ) {\n\t\t$_media_item = array(\n\t\t\t'attachment_id'    => strval( $media_item->ID ),\n\t\t\t'date_created_gmt' => $this->_convert_date_gmt( $media_item->post_date_gmt, $media_item->post_date ),\n\t\t\t'parent'           => $media_item->post_parent,\n\t\t\t'link'             => wp_get_attachment_url( $media_item->ID ),\n\t\t\t'title'            => $media_item->post_title,\n\t\t\t'caption'          => $media_item->post_excerpt,\n\t\t\t'description'      => $media_item->post_content,\n\t\t\t'metadata'         => wp_get_attachment_metadata( $media_item->ID ),\n\t\t\t'type'             => $media_item->post_mime_type\n\t\t);\n\n\t\t$thumbnail_src = image_downsize( $media_item->ID, $thumbnail_size );\n\t\tif ( $thumbnail_src )\n\t\t\t$_media_item['thumbnail'] = $thumbnail_src[0];\n\t\telse\n\t\t\t$_media_item['thumbnail'] = $_media_item['link'];\n\n\t\t/**\n\t\t * Filter XML-RPC-prepared data for the given media item.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array  $_media_item    An array of media item data.\n\t\t * @param object $media_item     Media item object.\n\t\t * @param string $thumbnail_size Image size.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_prepare_media_item', $_media_item, $media_item, $thumbnail_size );\n\t}\n\n\t/**\n\t * Prepares page data for return in an XML-RPC object.\n\t *\n\t * @access protected\n\t *\n\t * @param object $page The unprepared page data.\n\t * @return array The prepared page data.\n\t */\n\tprotected function _prepare_page( $page ) {\n\t\t// Get all of the page content and link.\n\t\t$full_page = get_extended( $page->post_content );\n\t\t$link = get_permalink( $page->ID );\n\n\t\t// Get info the page parent if there is one.\n\t\t$parent_title = \"\";\n\t\tif ( ! empty( $page->post_parent ) ) {\n\t\t\t$parent = get_post( $page->post_parent );\n\t\t\t$parent_title = $parent->post_title;\n\t\t}\n\n\t\t// Determine comment and ping settings.\n\t\t$allow_comments = comments_open( $page->ID ) ? 1 : 0;\n\t\t$allow_pings = pings_open( $page->ID ) ? 1 : 0;\n\n\t\t// Format page date.\n\t\t$page_date = $this->_convert_date( $page->post_date );\n\t\t$page_date_gmt = $this->_convert_date_gmt( $page->post_date_gmt, $page->post_date );\n\n\t\t// Pull the categories info together.\n\t\t$categories = array();\n\t\tif ( is_object_in_taxonomy( 'page', 'category' ) ) {\n\t\t\tforeach ( wp_get_post_categories( $page->ID ) as $cat_id ) {\n\t\t\t\t$categories[] = get_cat_name( $cat_id );\n\t\t\t}\n\t\t}\n\n\t\t// Get the author info.\n\t\t$author = get_userdata( $page->post_author );\n\n\t\t$page_template = get_page_template_slug( $page->ID );\n\t\tif ( empty( $page_template ) )\n\t\t\t$page_template = 'default';\n\n\t\t$_page = array(\n\t\t\t'dateCreated'            => $page_date,\n\t\t\t'userid'                 => $page->post_author,\n\t\t\t'page_id'                => $page->ID,\n\t\t\t'page_status'            => $page->post_status,\n\t\t\t'description'            => $full_page['main'],\n\t\t\t'title'                  => $page->post_title,\n\t\t\t'link'                   => $link,\n\t\t\t'permaLink'              => $link,\n\t\t\t'categories'             => $categories,\n\t\t\t'excerpt'                => $page->post_excerpt,\n\t\t\t'text_more'              => $full_page['extended'],\n\t\t\t'mt_allow_comments'      => $allow_comments,\n\t\t\t'mt_allow_pings'         => $allow_pings,\n\t\t\t'wp_slug'                => $page->post_name,\n\t\t\t'wp_password'            => $page->post_password,\n\t\t\t'wp_author'              => $author->display_name,\n\t\t\t'wp_page_parent_id'      => $page->post_parent,\n\t\t\t'wp_page_parent_title'   => $parent_title,\n\t\t\t'wp_page_order'          => $page->menu_order,\n\t\t\t'wp_author_id'           => (string) $author->ID,\n\t\t\t'wp_author_display_name' => $author->display_name,\n\t\t\t'date_created_gmt'       => $page_date_gmt,\n\t\t\t'custom_fields'          => $this->get_custom_fields( $page->ID ),\n\t\t\t'wp_page_template'       => $page_template\n\t\t);\n\n\t\t/**\n\t\t * Filter XML-RPC-prepared data for the given page.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array   $_page An array of page data.\n\t\t * @param WP_Post $page  Page object.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_prepare_page', $_page, $page );\n\t}\n\n\t/**\n\t * Prepares comment data for return in an XML-RPC object.\n\t *\n\t * @access protected\n\t *\n\t * @param object $comment The unprepared comment data.\n\t * @return array The prepared comment data.\n\t */\n\tprotected function _prepare_comment( $comment ) {\n\t\t// Format page date.\n\t\t$comment_date_gmt = $this->_convert_date_gmt( $comment->comment_date_gmt, $comment->comment_date );\n\n\t\tif ( '0' == $comment->comment_approved ) {\n\t\t\t$comment_status = 'hold';\n\t\t} elseif ( 'spam' == $comment->comment_approved ) {\n\t\t\t$comment_status = 'spam';\n\t\t} elseif ( '1' == $comment->comment_approved ) {\n\t\t\t$comment_status = 'approve';\n\t\t} else {\n\t\t\t$comment_status = $comment->comment_approved;\n\t\t}\n\t\t$_comment = array(\n\t\t\t'date_created_gmt' => $comment_date_gmt,\n\t\t\t'user_id'          => $comment->user_id,\n\t\t\t'comment_id'       => $comment->comment_ID,\n\t\t\t'parent'           => $comment->comment_parent,\n\t\t\t'status'           => $comment_status,\n\t\t\t'content'          => $comment->comment_content,\n\t\t\t'link'             => get_comment_link($comment),\n\t\t\t'post_id'          => $comment->comment_post_ID,\n\t\t\t'post_title'       => get_the_title($comment->comment_post_ID),\n\t\t\t'author'           => $comment->comment_author,\n\t\t\t'author_url'       => $comment->comment_author_url,\n\t\t\t'author_email'     => $comment->comment_author_email,\n\t\t\t'author_ip'        => $comment->comment_author_IP,\n\t\t\t'type'             => $comment->comment_type,\n\t\t);\n\n\t\t/**\n\t\t * Filter XML-RPC-prepared data for the given comment.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array      $_comment An array of prepared comment data.\n\t\t * @param WP_Comment $comment  Comment object.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_prepare_comment', $_comment, $comment );\n\t}\n\n\t/**\n\t * Prepares user data for return in an XML-RPC object.\n\t *\n\t * @access protected\n\t *\n\t * @param WP_User $user   The unprepared user object.\n\t * @param array   $fields The subset of user fields to return.\n\t * @return array The prepared user data.\n\t */\n\tprotected function _prepare_user( $user, $fields ) {\n\t\t$_user = array( 'user_id' => strval( $user->ID ) );\n\n\t\t$user_fields = array(\n\t\t\t'username'          => $user->user_login,\n\t\t\t'first_name'        => $user->user_firstname,\n\t\t\t'last_name'         => $user->user_lastname,\n\t\t\t'registered'        => $this->_convert_date( $user->user_registered ),\n\t\t\t'bio'               => $user->user_description,\n\t\t\t'email'             => $user->user_email,\n\t\t\t'nickname'          => $user->nickname,\n\t\t\t'nicename'          => $user->user_nicename,\n\t\t\t'url'               => $user->user_url,\n\t\t\t'display_name'      => $user->display_name,\n\t\t\t'roles'             => $user->roles,\n\t\t);\n\n\t\tif ( in_array( 'all', $fields ) ) {\n\t\t\t$_user = array_merge( $_user, $user_fields );\n\t\t} else {\n\t\t\tif ( in_array( 'basic', $fields ) ) {\n\t\t\t\t$basic_fields = array( 'username', 'email', 'registered', 'display_name', 'nicename' );\n\t\t\t\t$fields = array_merge( $fields, $basic_fields );\n\t\t\t}\n\t\t\t$requested_fields = array_intersect_key( $user_fields, array_flip( $fields ) );\n\t\t\t$_user = array_merge( $_user, $requested_fields );\n\t\t}\n\n\t\t/**\n\t\t * Filter XML-RPC-prepared data for the given user.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param array   $_user  An array of user data.\n\t\t * @param WP_User $user   User object.\n\t\t * @param array   $fields An array of user fields.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_prepare_user', $_user, $user, $fields );\n\t}\n\n\t/**\n\t * Create a new post for any registered post type.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @link http://en.wikipedia.org/wiki/RSS_enclosure for information on RSS enclosures.\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: top-level arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id        Blog ID (unused).\n\t *     @type string $username       Username.\n\t *     @type string $password       Password.\n\t *     @type array  $content_struct {\n\t *         Content struct for adding a new post. See wp_insert_post() for information on\n\t *         additional post fields\n\t *\n\t *         @type string $post_type      Post type. Default 'post'.\n\t *         @type string $post_status    Post status. Default 'draft'\n\t *         @type string $post_title     Post title.\n\t *         @type int    $post_author    Post author ID.\n\t *         @type string $post_excerpt   Post excerpt.\n\t *         @type string $post_content   Post content.\n\t *         @type string $post_date_gmt  Post date in GMT.\n\t *         @type string $post_date      Post date.\n\t *         @type string $post_password  Post password (20-character limit).\n\t *         @type string $comment_status Post comment enabled status. Accepts 'open' or 'closed'.\n\t *         @type string $ping_status    Post ping status. Accepts 'open' or 'closed'.\n\t *         @type bool   $sticky         Whether the post should be sticky. Automatically false if\n\t *                                      `$post_status` is 'private'.\n\t *         @type int    $post_thumbnail ID of an image to use as the post thumbnail/featured image.\n\t *         @type array  $custom_fields  Array of meta key/value pairs to add to the post.\n\t *         @type array  $terms          Associative array with taxonomy names as keys and arrays\n\t *                                      of term IDs as values.\n\t *         @type array  $terms_names    Associative array with taxonomy names as keys and arrays\n\t *                                      of term names as values.\n\t *         @type array  $enclosure      {\n\t *             Array of feed enclosure data to add to post meta.\n\t *\n\t *             @type string $url    URL for the feed enclosure.\n\t *             @type int    $length Size in bytes of the enclosure.\n\t *             @type string $type   Mime-type for the enclosure.\n\t *         }\n\t *     }\n\t * }\n\t * @return int|IXR_Error Post ID on success, IXR_Error instance otherwise.\n\t */\n\tpublic function wp_newPost( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$content_struct = $args[3];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t// convert the date field back to IXR form\n\t\tif ( isset( $content_struct['post_date'] ) && ! ( $content_struct['post_date'] instanceof IXR_Date ) ) {\n\t\t\t$content_struct['post_date'] = $this->_convert_date( $content_struct['post_date'] );\n\t\t}\n\n\t\t// ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct,\n\t\t// since _insert_post will ignore the non-GMT date if the GMT date is set\n\t\tif ( isset( $content_struct['post_date_gmt'] ) && ! ( $content_struct['post_date_gmt'] instanceof IXR_Date ) ) {\n\t\t\tif ( $content_struct['post_date_gmt'] == '0000-00-00 00:00:00' || isset( $content_struct['post_date'] ) ) {\n\t\t\t\tunset( $content_struct['post_date_gmt'] );\n\t\t\t} else {\n\t\t\t\t$content_struct['post_date_gmt'] = $this->_convert_date( $content_struct['post_date_gmt'] );\n\t\t\t}\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.newPost' );\n\n\t\tunset( $content_struct['ID'] );\n\n\t\treturn $this->_insert_post( $user, $content_struct );\n\t}\n\n\t/**\n\t * Helper method for filtering out elements from an array.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param int $count Number to compare to one.\n\t */\n\tprivate function _is_greater_than_one( $count ) {\n\t\treturn $count > 1;\n\t}\n\n\t/**\n\t * Encapsulate the logic for sticking a post\n\t * and determining if the user has permission to do so\n\t *\n\t * @since 4.3.0\n\t * @access private\n\t *\n\t * @param array $post_data\n\t * @param bool  $update\n\t * @return void|IXR_Error\n\t */\n\tprivate function _toggle_sticky( $post_data, $update = false ) {\n\t\t$post_type = get_post_type_object( $post_data['post_type'] );\n\n\t\t// Private and password-protected posts cannot be stickied.\n\t\tif ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) {\n\t\t\t// Error if the client tried to stick the post, otherwise, silently unstick.\n\t\t\tif ( ! empty( $post_data['sticky'] ) ) {\n\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );\n\t\t\t}\n\n\t\t\tif ( $update ) {\n\t\t\t\tunstick_post( $post_data['ID'] );\n\t\t\t}\n\t\t} elseif ( isset( $post_data['sticky'] ) )  {\n\t\t\tif ( ! current_user_can( $post_type->cap->edit_others_posts ) ) {\n\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to stick this post.' ) );\n\t\t\t}\n\n\t\t\t$sticky = wp_validate_boolean( $post_data['sticky'] );\n\t\t\tif ( $sticky ) {\n\t\t\t\tstick_post( $post_data['ID'] );\n\t\t\t} else {\n\t\t\t\tunstick_post( $post_data['ID'] );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Helper method for wp_newPost() and wp_editPost(), containing shared logic.\n\t *\n\t * @since 3.4.0\n\t * @access protected\n\t *\n\t * @see wp_insert_post()\n\t *\n\t * @param WP_User         $user           The post author if post_author isn't set in $content_struct.\n\t * @param array|IXR_Error $content_struct Post data to insert.\n\t * @return IXR_Error|string\n\t */\n\tprotected function _insert_post( $user, $content_struct ) {\n\t\t$defaults = array( 'post_status' => 'draft', 'post_type' => 'post', 'post_author' => 0,\n\t\t\t'post_password' => '', 'post_excerpt' => '', 'post_content' => '', 'post_title' => '' );\n\n\t\t$post_data = wp_parse_args( $content_struct, $defaults );\n\n\t\t$post_type = get_post_type_object( $post_data['post_type'] );\n\t\tif ( ! $post_type )\n\t\t\treturn new IXR_Error( 403, __( 'Invalid post type' ) );\n\n\t\t$update = ! empty( $post_data['ID'] );\n\n\t\tif ( $update ) {\n\t\t\tif ( ! get_post( $post_data['ID'] ) )\n\t\t\t\treturn new IXR_Error( 401, __( 'Invalid post ID.' ) );\n\t\t\tif ( ! current_user_can( 'edit_post', $post_data['ID'] ) )\n\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );\n\t\t\tif ( $post_data['post_type'] != get_post_type( $post_data['ID'] ) )\n\t\t\t\treturn new IXR_Error( 401, __( 'The post type may not be changed.' ) );\n\t\t} else {\n\t\t\tif ( ! current_user_can( $post_type->cap->create_posts ) || ! current_user_can( $post_type->cap->edit_posts ) )\n\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) );\n\t\t}\n\n\t\tswitch ( $post_data['post_status'] ) {\n\t\t\tcase 'draft':\n\t\t\tcase 'pending':\n\t\t\t\tbreak;\n\t\t\tcase 'private':\n\t\t\t\tif ( ! current_user_can( $post_type->cap->publish_posts ) )\n\t\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to create private posts in this post type' ) );\n\t\t\t\tbreak;\n\t\t\tcase 'publish':\n\t\t\tcase 'future':\n\t\t\t\tif ( ! current_user_can( $post_type->cap->publish_posts ) )\n\t\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts in this post type' ) );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif ( ! get_post_status_object( $post_data['post_status'] ) )\n\t\t\t\t\t$post_data['post_status'] = 'draft';\n\t\t\tbreak;\n\t\t}\n\n\t\tif ( ! empty( $post_data['post_password'] ) && ! current_user_can( $post_type->cap->publish_posts ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to create password protected posts in this post type' ) );\n\n\t\t$post_data['post_author'] = absint( $post_data['post_author'] );\n\t\tif ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] != $user->ID ) {\n\t\t\tif ( ! current_user_can( $post_type->cap->edit_others_posts ) )\n\t\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to create posts as this user.' ) );\n\n\t\t\t$author = get_userdata( $post_data['post_author'] );\n\n\t\t\tif ( ! $author )\n\t\t\t\treturn new IXR_Error( 404, __( 'Invalid author ID.' ) );\n\t\t} else {\n\t\t\t$post_data['post_author'] = $user->ID;\n\t\t}\n\n\t\tif ( isset( $post_data['comment_status'] ) && $post_data['comment_status'] != 'open' && $post_data['comment_status'] != 'closed' )\n\t\t\tunset( $post_data['comment_status'] );\n\n\t\tif ( isset( $post_data['ping_status'] ) && $post_data['ping_status'] != 'open' && $post_data['ping_status'] != 'closed' )\n\t\t\tunset( $post_data['ping_status'] );\n\n\t\t// Do some timestamp voodoo.\n\t\tif ( ! empty( $post_data['post_date_gmt'] ) ) {\n\t\t\t// We know this is supposed to be GMT, so we're going to slap that Z on there by force.\n\t\t\t$dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z';\n\t\t} elseif ( ! empty( $post_data['post_date'] ) ) {\n\t\t\t$dateCreated = $post_data['post_date']->getIso();\n\t\t}\n\n\t\tif ( ! empty( $dateCreated ) ) {\n\t\t\t$post_data['post_date'] = get_date_from_gmt( iso8601_to_datetime( $dateCreated ) );\n\t\t\t$post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'GMT' );\n\t\t}\n\n\t\tif ( ! isset( $post_data['ID'] ) )\n\t\t\t$post_data['ID'] = get_default_post_to_edit( $post_data['post_type'], true )->ID;\n\t\t$post_ID = $post_data['ID'];\n\n\t\tif ( $post_data['post_type'] == 'post' ) {\n\t\t\t$error = $this->_toggle_sticky( $post_data, $update );\n\t\t\tif ( $error ) {\n\t\t\t\treturn $error;\n\t\t\t}\n\t\t}\n\n\t\tif ( isset( $post_data['post_thumbnail'] ) ) {\n\t\t\t// empty value deletes, non-empty value adds/updates.\n\t\t\tif ( ! $post_data['post_thumbnail'] )\n\t\t\t\tdelete_post_thumbnail( $post_ID );\n\t\t\telseif ( ! get_post( absint( $post_data['post_thumbnail'] ) ) )\n\t\t\t\treturn new IXR_Error( 404, __( 'Invalid attachment ID.' ) );\n\t\t\tset_post_thumbnail( $post_ID, $post_data['post_thumbnail'] );\n\t\t\tunset( $content_struct['post_thumbnail'] );\n\t\t}\n\n\t\tif ( isset( $post_data['custom_fields'] ) )\n\t\t\t$this->set_custom_fields( $post_ID, $post_data['custom_fields'] );\n\n\t\tif ( isset( $post_data['terms'] ) || isset( $post_data['terms_names'] ) ) {\n\t\t\t$post_type_taxonomies = get_object_taxonomies( $post_data['post_type'], 'objects' );\n\n\t\t\t// Accumulate term IDs from terms and terms_names.\n\t\t\t$terms = array();\n\n\t\t\t// First validate the terms specified by ID.\n\t\t\tif ( isset( $post_data['terms'] ) && is_array( $post_data['terms'] ) ) {\n\t\t\t\t$taxonomies = array_keys( $post_data['terms'] );\n\n\t\t\t\t// Validating term ids.\n\t\t\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\t\t\tif ( ! array_key_exists( $taxonomy , $post_type_taxonomies ) )\n\t\t\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) );\n\n\t\t\t\t\tif ( ! current_user_can( $post_type_taxonomies[$taxonomy]->cap->assign_terms ) )\n\t\t\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) );\n\n\t\t\t\t\t$term_ids = $post_data['terms'][$taxonomy];\n\t\t\t\t\t$terms[ $taxonomy ] = array();\n\t\t\t\t\tforeach ( $term_ids as $term_id ) {\n\t\t\t\t\t\t$term = get_term_by( 'id', $term_id, $taxonomy );\n\n\t\t\t\t\t\tif ( ! $term )\n\t\t\t\t\t\t\treturn new IXR_Error( 403, __( 'Invalid term ID' ) );\n\n\t\t\t\t\t\t$terms[$taxonomy][] = (int) $term_id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Now validate terms specified by name.\n\t\t\tif ( isset( $post_data['terms_names'] ) && is_array( $post_data['terms_names'] ) ) {\n\t\t\t\t$taxonomies = array_keys( $post_data['terms_names'] );\n\n\t\t\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\t\t\tif ( ! array_key_exists( $taxonomy , $post_type_taxonomies ) )\n\t\t\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) );\n\n\t\t\t\t\tif ( ! current_user_can( $post_type_taxonomies[$taxonomy]->cap->assign_terms ) )\n\t\t\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) );\n\n\t\t\t\t\t/*\n\t\t\t\t\t * For hierarchical taxonomies, we can't assign a term when multiple terms\n\t\t\t\t\t * in the hierarchy share the same name.\n\t\t\t\t\t */\n\t\t\t\t\t$ambiguous_terms = array();\n\t\t\t\t\tif ( is_taxonomy_hierarchical( $taxonomy ) ) {\n\t\t\t\t\t\t$tax_term_names = get_terms( $taxonomy, array( 'fields' => 'names', 'hide_empty' => false ) );\n\n\t\t\t\t\t\t// Count the number of terms with the same name.\n\t\t\t\t\t\t$tax_term_names_count = array_count_values( $tax_term_names );\n\n\t\t\t\t\t\t// Filter out non-ambiguous term names.\n\t\t\t\t\t\t$ambiguous_tax_term_counts = array_filter( $tax_term_names_count, array( $this, '_is_greater_than_one') );\n\n\t\t\t\t\t\t$ambiguous_terms = array_keys( $ambiguous_tax_term_counts );\n\t\t\t\t\t}\n\n\t\t\t\t\t$term_names = $post_data['terms_names'][$taxonomy];\n\t\t\t\t\tforeach ( $term_names as $term_name ) {\n\t\t\t\t\t\tif ( in_array( $term_name, $ambiguous_terms ) )\n\t\t\t\t\t\t\treturn new IXR_Error( 401, __( 'Ambiguous term name used in a hierarchical taxonomy. Please use term ID instead.' ) );\n\n\t\t\t\t\t\t$term = get_term_by( 'name', $term_name, $taxonomy );\n\n\t\t\t\t\t\tif ( ! $term ) {\n\t\t\t\t\t\t\t// Term doesn't exist, so check that the user is allowed to create new terms.\n\t\t\t\t\t\t\tif ( ! current_user_can( $post_type_taxonomies[$taxonomy]->cap->edit_terms ) )\n\t\t\t\t\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to add a term to one of the given taxonomies.' ) );\n\n\t\t\t\t\t\t\t// Create the new term.\n\t\t\t\t\t\t\t$term_info = wp_insert_term( $term_name, $taxonomy );\n\t\t\t\t\t\t\tif ( is_wp_error( $term_info ) )\n\t\t\t\t\t\t\t\treturn new IXR_Error( 500, $term_info->get_error_message() );\n\n\t\t\t\t\t\t\t$terms[$taxonomy][] = (int) $term_info['term_id'];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$terms[$taxonomy][] = (int) $term->term_id;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$post_data['tax_input'] = $terms;\n\t\t\tunset( $post_data['terms'], $post_data['terms_names'] );\n\t\t} else {\n\t\t\t// Do not allow direct submission of 'tax_input', clients must use 'terms' and/or 'terms_names'.\n\t\t\tunset( $post_data['tax_input'], $post_data['post_category'], $post_data['tags_input'] );\n\t\t}\n\n\t\tif ( isset( $post_data['post_format'] ) ) {\n\t\t\t$format = set_post_format( $post_ID, $post_data['post_format'] );\n\n\t\t\tif ( is_wp_error( $format ) )\n\t\t\t\treturn new IXR_Error( 500, $format->get_error_message() );\n\n\t\t\tunset( $post_data['post_format'] );\n\t\t}\n\n\t\t// Handle enclosures.\n\t\t$enclosure = isset( $post_data['enclosure'] ) ? $post_data['enclosure'] : null;\n\t\t$this->add_enclosure_if_new( $post_ID, $enclosure );\n\n\t\t$this->attach_uploads( $post_ID, $post_data['post_content'] );\n\n\t\t/**\n\t\t * Filter post data array to be inserted via XML-RPC.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param array $post_data      Parsed array of post data.\n\t\t * @param array $content_struct Post data array.\n\t\t */\n\t\t$post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct );\n\n\t\t$post_ID = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true );\n\t\tif ( is_wp_error( $post_ID ) )\n\t\t\treturn new IXR_Error( 500, $post_ID->get_error_message() );\n\n\t\tif ( ! $post_ID )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, your entry could not be posted. Something wrong happened.' ) );\n\n\t\treturn strval( $post_ID );\n\t}\n\n\t/**\n\t * Edit a post for any registered post type.\n\t *\n\t * The $content_struct parameter only needs to contain fields that\n\t * should be changed. All other fields will retain their existing values.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id        Blog ID (unused).\n\t *     @type string $username       Username.\n\t *     @type string $password       Password.\n\t *     @type int    $post_id        Post ID.\n\t *     @type array  $content_struct Extra content arguments.\n\t * }\n\t * @return true|IXR_Error True on success, IXR_Error on failure.\n\t */\n\tpublic function wp_editPost( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 5 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$post_id        = (int) $args[3];\n\t\t$content_struct = $args[4];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.editPost' );\n\n\t\t$post = get_post( $post_id, ARRAY_A );\n\n\t\tif ( empty( $post['ID'] ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( isset( $content_struct['if_not_modified_since'] ) ) {\n\t\t\t// If the post has been modified since the date provided, return an error.\n\t\t\tif ( mysql2date( 'U', $post['post_modified_gmt'] ) > $content_struct['if_not_modified_since']->getTimestamp() ) {\n\t\t\t\treturn new IXR_Error( 409, __( 'There is a revision of this post that is more recent.' ) );\n\t\t\t}\n\t\t}\n\n\t\t// Convert the date field back to IXR form.\n\t\t$post['post_date'] = $this->_convert_date( $post['post_date'] );\n\n\t\t/*\n\t\t * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct,\n\t\t * since _insert_post() will ignore the non-GMT date if the GMT date is set.\n\t\t */\n\t\tif ( $post['post_date_gmt'] == '0000-00-00 00:00:00' || isset( $content_struct['post_date'] ) )\n\t\t\tunset( $post['post_date_gmt'] );\n\t\telse\n\t\t\t$post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] );\n\n\t\t$this->escape( $post );\n\t\t$merged_content_struct = array_merge( $post, $content_struct );\n\n\t\t$retval = $this->_insert_post( $user, $merged_content_struct );\n\t\tif ( $retval instanceof IXR_Error )\n\t\t\treturn $retval;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Delete a post for any registered post type.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see wp_delete_post()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id  Blog ID (unused).\n\t *     @type string $username Username.\n\t *     @type string $password Password.\n\t *     @type int    $post_id  Post ID.\n\t * }\n\t * @return true|IXR_Error True on success, IXR_Error instance on failure.\n\t */\n\tpublic function wp_deletePost( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username   = $args[1];\n\t\t$password   = $args[2];\n\t\t$post_id    = (int) $args[3];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.deletePost' );\n\n\t\t$post = get_post( $post_id, ARRAY_A );\n\t\tif ( empty( $post['ID'] ) ) {\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\t\t}\n\n\t\tif ( ! current_user_can( 'delete_post', $post_id ) ) {\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to delete this post.' ) );\n\t\t}\n\n\t\t$result = wp_delete_post( $post_id );\n\n\t\tif ( ! $result ) {\n\t\t\treturn new IXR_Error( 500, __( 'The post cannot be deleted.' ) );\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Retrieve a post.\n\t *\n\t * @since 3.4.0\n\t *\n\t * The optional $fields parameter specifies what fields will be included\n\t * in the response array. This should be a list of field names. 'post_id' will\n\t * always be included in the response regardless of the value of $fields.\n\t *\n\t * Instead of, or in addition to, individual field names, conceptual group\n\t * names can be used to specify multiple fields. The available conceptual\n\t * groups are 'post' (all basic fields), 'taxonomies', 'custom_fields',\n\t * and 'enclosure'.\n\t *\n\t * @see get_post()\n\t *\n\t * @param array $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id  Blog ID (unused).\n\t *     @type string $username Username.\n\t *     @type string $password Password.\n\t *     @type int    $post_id  Post ID.\n\t *     @type array  $fields   The subset of post type fields to return.\n\t * }\n\t * @return array|IXR_Error Array contains (based on $fields parameter):\n\t *  - 'post_id'\n\t *  - 'post_title'\n\t *  - 'post_date'\n\t *  - 'post_date_gmt'\n\t *  - 'post_modified'\n\t *  - 'post_modified_gmt'\n\t *  - 'post_status'\n\t *  - 'post_type'\n\t *  - 'post_name'\n\t *  - 'post_author'\n\t *  - 'post_password'\n\t *  - 'post_excerpt'\n\t *  - 'post_content'\n\t *  - 'link'\n\t *  - 'comment_status'\n\t *  - 'ping_status'\n\t *  - 'sticky'\n\t *  - 'custom_fields'\n\t *  - 'terms'\n\t *  - 'categories'\n\t *  - 'tags'\n\t *  - 'enclosure'\n\t */\n\tpublic function wp_getPost( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$post_id  = (int) $args[3];\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/**\n\t\t\t * Filter the list of post query fields used by the given XML-RPC method.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param array  $fields Array of post fields. Default array contains 'post', 'terms', and 'custom_fields'.\n\t\t\t * @param string $method Method name.\n\t\t\t */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPost' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPost' );\n\n\t\t$post = get_post( $post_id, ARRAY_A );\n\n\t\tif ( empty( $post['ID'] ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( ! current_user_can( 'edit_post', $post_id ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );\n\n\t\treturn $this->_prepare_post( $post, $fields );\n\t}\n\n\t/**\n\t * Retrieve posts.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see wp_get_recent_posts()\n\t * @see wp_getPost() for more on `$fields`\n\t * @see get_posts() for more on `$filter` values\n\t *\n\t * @param array $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id  Blog ID (unused).\n\t *     @type string $username Username.\n\t *     @type string $password Password.\n\t *     @type array  $filter   Optional. Modifies the query used to retrieve posts. Accepts 'post_type',\n\t *                            'post_status', 'number', 'offset', 'orderby', 's', and 'order'.\n\t *                            Default empty array.\n\t *     @type array  $fields   Optional. The subset of post type fields to return in the response array.\n\t * }\n\t * @return array|IXR_Error Array contains a collection of posts.\n\t */\n\tpublic function wp_getPosts( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 3 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$filter   = isset( $args[3] ) ? $args[3] : array();\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPosts' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPosts' );\n\n\t\t$query = array();\n\n\t\tif ( isset( $filter['post_type'] ) ) {\n\t\t\t$post_type = get_post_type_object( $filter['post_type'] );\n\t\t\tif ( ! ( (bool) $post_type ) )\n\t\t\t\treturn new IXR_Error( 403, __( 'The post type specified is not valid' ) );\n\t\t} else {\n\t\t\t$post_type = get_post_type_object( 'post' );\n\t\t}\n\n\t\tif ( ! current_user_can( $post_type->cap->edit_posts ) )\n\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to edit posts in this post type.' ));\n\n\t\t$query['post_type'] = $post_type->name;\n\n\t\tif ( isset( $filter['post_status'] ) )\n\t\t\t$query['post_status'] = $filter['post_status'];\n\n\t\tif ( isset( $filter['number'] ) )\n\t\t\t$query['numberposts'] = absint( $filter['number'] );\n\n\t\tif ( isset( $filter['offset'] ) )\n\t\t\t$query['offset'] = absint( $filter['offset'] );\n\n\t\tif ( isset( $filter['orderby'] ) ) {\n\t\t\t$query['orderby'] = $filter['orderby'];\n\n\t\t\tif ( isset( $filter['order'] ) )\n\t\t\t\t$query['order'] = $filter['order'];\n\t\t}\n\n\t\tif ( isset( $filter['s'] ) ) {\n\t\t\t$query['s'] = $filter['s'];\n\t\t}\n\n\t\t$posts_list = wp_get_recent_posts( $query );\n\n\t\tif ( ! $posts_list )\n\t\t\treturn array();\n\n\t\t// Holds all the posts data.\n\t\t$struct = array();\n\n\t\tforeach ( $posts_list as $post ) {\n\t\t\tif ( ! current_user_can( 'edit_post', $post['ID'] ) )\n\t\t\t\tcontinue;\n\n\t\t\t$struct[] = $this->_prepare_post( $post, $fields );\n\t\t}\n\n\t\treturn $struct;\n\t}\n\n\t/**\n\t * Create a new term.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see wp_insert_term()\n\t *\n\t * @param array $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id        Blog ID (unused).\n\t *     @type string $username       Username.\n\t *     @type string $password       Password.\n\t *     @type array  $content_struct Content struct for adding a new term. The struct must contain\n\t *                                  the term 'name' and 'taxonomy'. Optional accepted values include\n\t *                                  'parent', 'description', and 'slug'.\n\t * }\n\t * @return int|IXR_Error The term ID on success, or an IXR_Error object on failure.\n\t */\n\tpublic function wp_newTerm( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$content_struct = $args[3];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.newTerm' );\n\n\t\tif ( ! taxonomy_exists( $content_struct['taxonomy'] ) )\n\t\t\treturn new IXR_Error( 403, __( 'Invalid taxonomy' ) );\n\n\t\t$taxonomy = get_taxonomy( $content_struct['taxonomy'] );\n\n\t\tif ( ! current_user_can( $taxonomy->cap->manage_terms ) )\n\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to create terms in this taxonomy.' ) );\n\n\t\t$taxonomy = (array) $taxonomy;\n\n\t\t// hold the data of the term\n\t\t$term_data = array();\n\n\t\t$term_data['name'] = trim( $content_struct['name'] );\n\t\tif ( empty( $term_data['name'] ) )\n\t\t\treturn new IXR_Error( 403, __( 'The term name cannot be empty.' ) );\n\n\t\tif ( isset( $content_struct['parent'] ) ) {\n\t\t\tif ( ! $taxonomy['hierarchical'] )\n\t\t\t\treturn new IXR_Error( 403, __( 'This taxonomy is not hierarchical.' ) );\n\n\t\t\t$parent_term_id = (int) $content_struct['parent'];\n\t\t\t$parent_term = get_term( $parent_term_id , $taxonomy['name'] );\n\n\t\t\tif ( is_wp_error( $parent_term ) )\n\t\t\t\treturn new IXR_Error( 500, $parent_term->get_error_message() );\n\n\t\t\tif ( ! $parent_term )\n\t\t\t\treturn new IXR_Error( 403, __( 'Parent term does not exist.' ) );\n\n\t\t\t$term_data['parent'] = $content_struct['parent'];\n\t\t}\n\n\t\tif ( isset( $content_struct['description'] ) )\n\t\t\t$term_data['description'] = $content_struct['description'];\n\n\t\tif ( isset( $content_struct['slug'] ) )\n\t\t\t$term_data['slug'] = $content_struct['slug'];\n\n\t\t$term = wp_insert_term( $term_data['name'] , $taxonomy['name'] , $term_data );\n\n\t\tif ( is_wp_error( $term ) )\n\t\t\treturn new IXR_Error( 500, $term->get_error_message() );\n\n\t\tif ( ! $term )\n\t\t\treturn new IXR_Error( 500, __( 'Sorry, your term could not be created. Something wrong happened.' ) );\n\n\t\treturn strval( $term['term_id'] );\n\t}\n\n\t/**\n\t * Edit a term.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see wp_update_term()\n\t *\n\t * @param array $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id        Blog ID (unused).\n\t *     @type string $username       Username.\n\t *     @type string $password       Password.\n\t *     @type int    $term_id        Term ID.\n\t *     @type array  $content_struct Content struct for editing a term. The struct must contain the\n\t *                                  term ''taxonomy'. Optional accepted values include 'name', 'parent',\n\t *                                  'description', and 'slug'.\n\t * }\n\t * @return true|IXR_Error True on success, IXR_Error instance on failure.\n\t */\n\tpublic function wp_editTerm( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 5 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$term_id        = (int) $args[3];\n\t\t$content_struct = $args[4];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.editTerm' );\n\n\t\tif ( ! taxonomy_exists( $content_struct['taxonomy'] ) )\n\t\t\treturn new IXR_Error( 403, __( 'Invalid taxonomy' ) );\n\n\t\t$taxonomy = get_taxonomy( $content_struct['taxonomy'] );\n\n\t\tif ( ! current_user_can( $taxonomy->cap->edit_terms ) )\n\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to edit terms in this taxonomy.' ) );\n\n\t\t$taxonomy = (array) $taxonomy;\n\n\t\t// hold the data of the term\n\t\t$term_data = array();\n\n\t\t$term = get_term( $term_id , $content_struct['taxonomy'] );\n\n\t\tif ( is_wp_error( $term ) )\n\t\t\treturn new IXR_Error( 500, $term->get_error_message() );\n\n\t\tif ( ! $term )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid term ID' ) );\n\n\t\tif ( isset( $content_struct['name'] ) ) {\n\t\t\t$term_data['name'] = trim( $content_struct['name'] );\n\n\t\t\tif ( empty( $term_data['name'] ) )\n\t\t\t\treturn new IXR_Error( 403, __( 'The term name cannot be empty.' ) );\n\t\t}\n\n\t\tif ( ! empty( $content_struct['parent'] ) ) {\n\t\t\tif ( ! $taxonomy['hierarchical'] )\n\t\t\t\treturn new IXR_Error( 403, __( \"This taxonomy is not hierarchical so you can't set a parent.\" ) );\n\n\t\t\t$parent_term_id = (int) $content_struct['parent'];\n\t\t\t$parent_term = get_term( $parent_term_id , $taxonomy['name'] );\n\n\t\t\tif ( is_wp_error( $parent_term ) )\n\t\t\t\treturn new IXR_Error( 500, $parent_term->get_error_message() );\n\n\t\t\tif ( ! $parent_term )\n\t\t\t\treturn new IXR_Error( 403, __( 'Parent term does not exist.' ) );\n\n\t\t\t$term_data['parent'] = $content_struct['parent'];\n\t\t}\n\n\t\tif ( isset( $content_struct['description'] ) )\n\t\t\t$term_data['description'] = $content_struct['description'];\n\n\t\tif ( isset( $content_struct['slug'] ) )\n\t\t\t$term_data['slug'] = $content_struct['slug'];\n\n\t\t$term = wp_update_term( $term_id , $taxonomy['name'] , $term_data );\n\n\t\tif ( is_wp_error( $term ) )\n\t\t\treturn new IXR_Error( 500, $term->get_error_message() );\n\n\t\tif ( ! $term )\n\t\t\treturn new IXR_Error( 500, __( 'Sorry, editing the term failed.' ) );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Delete a term.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see wp_delete_term()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id      Blog ID (unused).\n\t *     @type string $username     Username.\n\t *     @type string $password     Password.\n\t *     @type string $taxnomy_name Taxonomy name.\n\t *     @type int    $term_id      Term ID.\n\t * }\n\t * @return bool|IXR_Error True on success, IXR_Error instance on failure.\n\t */\n\tpublic function wp_deleteTerm( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 5 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username           = $args[1];\n\t\t$password           = $args[2];\n\t\t$taxonomy           = $args[3];\n\t\t$term_id            = (int) $args[4];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.deleteTerm' );\n\n\t\tif ( ! taxonomy_exists( $taxonomy ) )\n\t\t\treturn new IXR_Error( 403, __( 'Invalid taxonomy' ) );\n\n\t\t$taxonomy = get_taxonomy( $taxonomy );\n\n\t\tif ( ! current_user_can( $taxonomy->cap->delete_terms ) )\n\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to delete terms in this taxonomy.' ) );\n\n\t\t$term = get_term( $term_id, $taxonomy->name );\n\n\t\tif ( is_wp_error( $term ) )\n\t\t\treturn new IXR_Error( 500, $term->get_error_message() );\n\n\t\tif ( ! $term )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid term ID' ) );\n\n\t\t$result = wp_delete_term( $term_id, $taxonomy->name );\n\n\t\tif ( is_wp_error( $result ) )\n\t\t\treturn new IXR_Error( 500, $term->get_error_message() );\n\n\t\tif ( ! $result )\n\t\t\treturn new IXR_Error( 500, __( 'Sorry, deleting the term failed.' ) );\n\n\t\treturn $result;\n\t}\n\n\t/**\n\t * Retrieve a term.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see get_term()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id  Blog ID (unused).\n\t *     @type string $username Username.\n\t *     @type string $password Password.\n\t *     @type string $taxnomy  Taxonomy name.\n\t *     @type string $term_id  Term ID.\n\t * }\n\t * @return array|IXR_Error IXR_Error on failure, array on success, containing:\n\t *  - 'term_id'\n\t *  - 'name'\n\t *  - 'slug'\n\t *  - 'term_group'\n\t *  - 'term_taxonomy_id'\n\t *  - 'taxonomy'\n\t *  - 'description'\n\t *  - 'parent'\n\t *  - 'count'\n\t */\n\tpublic function wp_getTerm( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 5 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username           = $args[1];\n\t\t$password           = $args[2];\n\t\t$taxonomy           = $args[3];\n\t\t$term_id            = (int) $args[4];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getTerm' );\n\n\t\tif ( ! taxonomy_exists( $taxonomy ) )\n\t\t\treturn new IXR_Error( 403, __( 'Invalid taxonomy' ) );\n\n\t\t$taxonomy = get_taxonomy( $taxonomy );\n\n\t\tif ( ! current_user_can( $taxonomy->cap->assign_terms ) )\n\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to assign terms in this taxonomy.' ) );\n\n\t\t$term = get_term( $term_id , $taxonomy->name, ARRAY_A );\n\n\t\tif ( is_wp_error( $term ) )\n\t\t\treturn new IXR_Error( 500, $term->get_error_message() );\n\n\t\tif ( ! $term )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid term ID' ) );\n\n\t\treturn $this->_prepare_term( $term );\n\t}\n\n\t/**\n\t * Retrieve all terms for a taxonomy.\n\t *\n\t * @since 3.4.0\n\t *\n\t * The optional $filter parameter modifies the query used to retrieve terms.\n\t * Accepted keys are 'number', 'offset', 'orderby', 'order', 'hide_empty', and 'search'.\n\t *\n\t * @see get_terms()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id  Blog ID (unused).\n\t *     @type string $username Username.\n\t *     @type string $password Password.\n\t *     @type string $taxnomy  Taxonomy name.\n\t *     @type array  $filter   Optional. Modifies the query used to retrieve posts. Accepts 'number',\n\t *                            'offset', 'orderby', 'order', 'hide_empty', and 'search'. Default empty array.\n\t * }\n\t * @return array|IXR_Error An associative array of terms data on success, IXR_Error instance otherwise.\n\t */\n\tpublic function wp_getTerms( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$taxonomy       = $args[3];\n\t\t$filter         = isset( $args[4] ) ? $args[4] : array();\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getTerms' );\n\n\t\tif ( ! taxonomy_exists( $taxonomy ) )\n\t\t\treturn new IXR_Error( 403, __( 'Invalid taxonomy' ) );\n\n\t\t$taxonomy = get_taxonomy( $taxonomy );\n\n\t\tif ( ! current_user_can( $taxonomy->cap->assign_terms ) )\n\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to assign terms in this taxonomy.' ) );\n\n\t\t$query = array();\n\n\t\tif ( isset( $filter['number'] ) )\n\t\t\t$query['number'] = absint( $filter['number'] );\n\n\t\tif ( isset( $filter['offset'] ) )\n\t\t\t$query['offset'] = absint( $filter['offset'] );\n\n\t\tif ( isset( $filter['orderby'] ) ) {\n\t\t\t$query['orderby'] = $filter['orderby'];\n\n\t\t\tif ( isset( $filter['order'] ) )\n\t\t\t\t$query['order'] = $filter['order'];\n\t\t}\n\n\t\tif ( isset( $filter['hide_empty'] ) )\n\t\t\t$query['hide_empty'] = $filter['hide_empty'];\n\t\telse\n\t\t\t$query['get'] = 'all';\n\n\t\tif ( isset( $filter['search'] ) )\n\t\t\t$query['search'] = $filter['search'];\n\n\t\t$terms = get_terms( $taxonomy->name, $query );\n\n\t\tif ( is_wp_error( $terms ) )\n\t\t\treturn new IXR_Error( 500, $terms->get_error_message() );\n\n\t\t$struct = array();\n\n\t\tforeach ( $terms as $term ) {\n\t\t\t$struct[] = $this->_prepare_term( $term );\n\t\t}\n\n\t\treturn $struct;\n\t}\n\n\t/**\n\t * Retrieve a taxonomy.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see get_taxonomy()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id  Blog ID (unused).\n\t *     @type string $username Username.\n\t *     @type string $password Password.\n\t *     @type string $taxnomy  Taxonomy name.\n\t *     @type array  $fields   Optional. Array of taxonomy fields to limit to in the return.\n\t *                            Accepts 'labels', 'cap', 'menu', and 'object_type'.\n\t *                            Default empty array.\n\t * }\n\t * @return array|IXR_Error An array of taxonomy data on success, IXR_Error instance otherwise.\n\t */\n\tpublic function wp_getTaxonomy( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$taxonomy = $args[3];\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/**\n\t\t\t * Filter the taxonomy query fields used by the given XML-RPC method.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param array  $fields An array of taxonomy fields to retrieve.\n\t\t\t * @param string $method The method name.\n\t\t\t */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomy' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getTaxonomy' );\n\n\t\tif ( ! taxonomy_exists( $taxonomy ) )\n\t\t\treturn new IXR_Error( 403, __( 'Invalid taxonomy' ) );\n\n\t\t$taxonomy = get_taxonomy( $taxonomy );\n\n\t\tif ( ! current_user_can( $taxonomy->cap->assign_terms ) )\n\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to assign terms in this taxonomy.' ) );\n\n\t\treturn $this->_prepare_taxonomy( $taxonomy, $fields );\n\t}\n\n\t/**\n\t * Retrieve all taxonomies.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see get_taxonomies()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id  Blog ID (unused).\n\t *     @type string $username Username.\n\t *     @type string $password Password.\n\t *     @type array  $filter   Optional. An array of arguments for retrieving taxonomies.\n\t *     @type array  $fields   Optional. The subset of taxonomy fields to return.\n\t * }\n\t * @return array|IXR_Error An associative array of taxonomy data with returned fields determined\n\t *                         by `$fields`, or an IXR_Error instance on failure.\n\t */\n\tpublic function wp_getTaxonomies( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 3 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$filter   = isset( $args[3] ) ? $args[3] : array( 'public' => true );\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomies' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getTaxonomies' );\n\n\t\t$taxonomies = get_taxonomies( $filter, 'objects' );\n\n\t\t// holds all the taxonomy data\n\t\t$struct = array();\n\n\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\t// capability check for post_types\n\t\t\tif ( ! current_user_can( $taxonomy->cap->assign_terms ) )\n\t\t\t\tcontinue;\n\n\t\t\t$struct[] = $this->_prepare_taxonomy( $taxonomy, $fields );\n\t\t}\n\n\t\treturn $struct;\n\t}\n\n\t/**\n\t * Retrieve a user.\n\t *\n\t * The optional $fields parameter specifies what fields will be included\n\t * in the response array. This should be a list of field names. 'user_id' will\n\t * always be included in the response regardless of the value of $fields.\n\t *\n\t * Instead of, or in addition to, individual field names, conceptual group\n\t * names can be used to specify multiple fields. The available conceptual\n\t * groups are 'basic' and 'all'.\n\t *\n\t * @uses get_userdata()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $user_id\n\t *     @type array  $fields (optional)\n\t * }\n\t * @return array|IXR_Error Array contains (based on $fields parameter):\n\t *  - 'user_id'\n\t *  - 'username'\n\t *  - 'first_name'\n\t *  - 'last_name'\n\t *  - 'registered'\n\t *  - 'bio'\n\t *  - 'email'\n\t *  - 'nickname'\n\t *  - 'nicename'\n\t *  - 'url'\n\t *  - 'display_name'\n\t *  - 'roles'\n\t */\n\tpublic function wp_getUser( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$user_id  = (int) $args[3];\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/**\n\t\t\t * Filter the default user query fields used by the given XML-RPC method.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param array  $fields User query fields for given method. Default 'all'.\n\t\t\t * @param string $method The method name.\n\t\t\t */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUser' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getUser' );\n\n\t\tif ( ! current_user_can( 'edit_user', $user_id ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit users.' ) );\n\n\t\t$user_data = get_userdata( $user_id );\n\n\t\tif ( ! $user_data )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid user ID.' ) );\n\n\t\treturn $this->_prepare_user( $user_data, $fields );\n\t}\n\n\t/**\n\t * Retrieve users.\n\t *\n\t * The optional $filter parameter modifies the query used to retrieve users.\n\t * Accepted keys are 'number' (default: 50), 'offset' (default: 0), 'role',\n\t * 'who', 'orderby', and 'order'.\n\t *\n\t * The optional $fields parameter specifies what fields will be included\n\t * in the response array.\n\t *\n\t * @uses get_users()\n\t * @see wp_getUser() for more on $fields and return values\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $filter (optional)\n\t *     @type array  $fields (optional)\n\t * }\n\t * @return array|IXR_Error users data\n\t */\n\tpublic function wp_getUsers( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 3 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$filter   = isset( $args[3] ) ? $args[3] : array();\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUsers' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getUsers' );\n\n\t\tif ( ! current_user_can( 'list_users' ) )\n\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to browse users.' ) );\n\n\t\t$query = array( 'fields' => 'all_with_meta' );\n\n\t\t$query['number'] = ( isset( $filter['number'] ) ) ? absint( $filter['number'] ) : 50;\n\t\t$query['offset'] = ( isset( $filter['offset'] ) ) ? absint( $filter['offset'] ) : 0;\n\n\t\tif ( isset( $filter['orderby'] ) ) {\n\t\t\t$query['orderby'] = $filter['orderby'];\n\n\t\t\tif ( isset( $filter['order'] ) )\n\t\t\t\t$query['order'] = $filter['order'];\n\t\t}\n\n\t\tif ( isset( $filter['role'] ) ) {\n\t\t\tif ( get_role( $filter['role'] ) === null )\n\t\t\t\treturn new IXR_Error( 403, __( 'The role specified is not valid' ) );\n\n\t\t\t$query['role'] = $filter['role'];\n\t\t}\n\n\t\tif ( isset( $filter['who'] ) ) {\n\t\t\t$query['who'] = $filter['who'];\n\t\t}\n\n\t\t$users = get_users( $query );\n\n\t\t$_users = array();\n\t\tforeach ( $users as $user_data ) {\n\t\t\tif ( current_user_can( 'edit_user', $user_data->ID ) )\n\t\t\t\t$_users[] = $this->_prepare_user( $user_data, $fields );\n\t\t}\n\t\treturn $_users;\n\t}\n\n\t/**\n\t * Retrieve information about the requesting user.\n\t *\n\t * @uses get_userdata()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $fields (optional)\n\t * }\n\t * @return array|IXR_Error (@see wp_getUser)\n\t */\n\tpublic function wp_getProfile( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 3 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( isset( $args[3] ) ) {\n\t\t\t$fields = $args[3];\n\t\t} else {\n\t\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getProfile' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getProfile' );\n\n\t\tif ( ! current_user_can( 'edit_user', $user->ID ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit your profile.' ) );\n\n\t\t$user_data = get_userdata( $user->ID );\n\n\t\treturn $this->_prepare_user( $user_data, $fields );\n\t}\n\n\t/**\n\t * Edit user's profile.\n\t *\n\t * @uses wp_update_user()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $content_struct It can optionally contain:\n\t *      - 'first_name'\n\t *      - 'last_name'\n\t *      - 'website'\n\t *      - 'display_name'\n\t *      - 'nickname'\n\t *      - 'nicename'\n\t *      - 'bio'\n\t * }\n\t * @return true|IXR_Error True, on success.\n\t */\n\tpublic function wp_editProfile( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$content_struct = $args[3];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.editProfile' );\n\n\t\tif ( ! current_user_can( 'edit_user', $user->ID ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit your profile.' ) );\n\n\t\t// holds data of the user\n\t\t$user_data = array();\n\t\t$user_data['ID'] = $user->ID;\n\n\t\t// only set the user details if it was given\n\t\tif ( isset( $content_struct['first_name'] ) )\n\t\t\t$user_data['first_name'] = $content_struct['first_name'];\n\n\t\tif ( isset( $content_struct['last_name'] ) )\n\t\t\t$user_data['last_name'] = $content_struct['last_name'];\n\n\t\tif ( isset( $content_struct['url'] ) )\n\t\t\t$user_data['user_url'] = $content_struct['url'];\n\n\t\tif ( isset( $content_struct['display_name'] ) )\n\t\t\t$user_data['display_name'] = $content_struct['display_name'];\n\n\t\tif ( isset( $content_struct['nickname'] ) )\n\t\t\t$user_data['nickname'] = $content_struct['nickname'];\n\n\t\tif ( isset( $content_struct['nicename'] ) )\n\t\t\t$user_data['user_nicename'] = $content_struct['nicename'];\n\n\t\tif ( isset( $content_struct['bio'] ) )\n\t\t\t$user_data['description'] = $content_struct['bio'];\n\n\t\t$result = wp_update_user( $user_data );\n\n\t\tif ( is_wp_error( $result ) )\n\t\t\treturn new IXR_Error( 500, $result->get_error_message() );\n\n\t\tif ( ! $result )\n\t\t\treturn new IXR_Error( 500, __( 'Sorry, the user cannot be updated.' ) );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Retrieve page.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type int    $page_id\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getPage( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$page_id  = (int) $args[1];\n\t\t$username = $args[2];\n\t\t$password = $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t$page = get_post($page_id);\n\t\tif ( ! $page )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( !current_user_can( 'edit_page', $page_id ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit this page.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPage' );\n\n\t\t// If we found the page then format the data.\n\t\tif ( $page->ID && ($page->post_type == 'page') ) {\n\t\t\treturn $this->_prepare_page( $page );\n\t\t}\n\t\t// If the page doesn't exist indicate that.\n\t\telse {\n\t\t\treturn new IXR_Error( 404, __( 'Sorry, no such page.' ) );\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve Pages.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $num_pages\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getPages( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username  = $args[1];\n\t\t$password  = $args[2];\n\t\t$num_pages = isset($args[3]) ? (int) $args[3] : 10;\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_pages' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit pages.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPages' );\n\n\t\t$pages = get_posts( array('post_type' => 'page', 'post_status' => 'any', 'numberposts' => $num_pages) );\n\t\t$num_pages = count($pages);\n\n\t\t// If we have pages, put together their info.\n\t\tif ( $num_pages >= 1 ) {\n\t\t\t$pages_struct = array();\n\n\t\t\tforeach ($pages as $page) {\n\t\t\t\tif ( current_user_can( 'edit_page', $page->ID ) )\n\t\t\t\t\t$pages_struct[] = $this->_prepare_page( $page );\n\t\t\t}\n\n\t\t\treturn $pages_struct;\n\t\t}\n\n\t\treturn array();\n\t}\n\n\t/**\n\t * Create new page.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @see wp_xmlrpc_server::mw_newPost()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $content_struct\n\t * }\n\t * @return int|IXR_Error\n\t */\n\tpublic function wp_newPage( $args ) {\n\t\t// Items not escaped here will be escaped in newPost.\n\t\t$username = $this->escape( $args[1] );\n\t\t$password = $this->escape( $args[2] );\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.newPage' );\n\n\t\t// Mark this as content for a page.\n\t\t$args[3][\"post_type\"] = 'page';\n\n\t\t// Let mw_newPost do all of the heavy lifting.\n\t\treturn $this->mw_newPost( $args );\n\t}\n\n\t/**\n\t * Delete page.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $page_id\n\t * }\n\t * @return true|IXR_Error True, if success.\n\t */\n\tpublic function wp_deletePage( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$page_id  = (int) $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.deletePage' );\n\n\t\t// Get the current page based on the page_id and\n\t\t// make sure it is a page and not a post.\n\t\t$actual_page = get_post($page_id, ARRAY_A);\n\t\tif ( !$actual_page || ($actual_page['post_type'] != 'page') )\n\t\t\treturn new IXR_Error( 404, __( 'Sorry, no such page.' ) );\n\n\t\t// Make sure the user can delete pages.\n\t\tif ( !current_user_can('delete_page', $page_id) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to delete this page.' ) );\n\n\t\t// Attempt to delete the page.\n\t\t$result = wp_delete_post($page_id);\n\t\tif ( !$result )\n\t\t\treturn new IXR_Error( 500, __( 'Failed to delete the page.' ) );\n\n\t\t/**\n\t\t * Fires after a page has been successfully deleted via XML-RPC.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $page_id ID of the deleted page.\n\t\t * @param array $args    An array of arguments to delete the page.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_wp_deletePage', $page_id, $args );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Edit page.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type int    $page_id\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type string $content\n\t *     @type string $publish\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_editPage( $args ) {\n\t\t// Items will be escaped in mw_editPost.\n\t\t$page_id  = (int) $args[1];\n\t\t$username = $args[2];\n\t\t$password = $args[3];\n\t\t$content  = $args[4];\n\t\t$publish  = $args[5];\n\n\t\t$escaped_username = $this->escape( $username );\n\t\t$escaped_password = $this->escape( $password );\n\n\t\tif ( !$user = $this->login( $escaped_username, $escaped_password ) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.editPage' );\n\n\t\t// Get the page data and make sure it is a page.\n\t\t$actual_page = get_post($page_id, ARRAY_A);\n\t\tif ( !$actual_page || ($actual_page['post_type'] != 'page') )\n\t\t\treturn new IXR_Error( 404, __( 'Sorry, no such page.' ) );\n\n\t\t// Make sure the user is allowed to edit pages.\n\t\tif ( !current_user_can('edit_page', $page_id) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to edit this page.' ) );\n\n\t\t// Mark this as content for a page.\n\t\t$content['post_type'] = 'page';\n\n\t\t// Arrange args in the way mw_editPost understands.\n\t\t$args = array(\n\t\t\t$page_id,\n\t\t\t$username,\n\t\t\t$password,\n\t\t\t$content,\n\t\t\t$publish\n\t\t);\n\n\t\t// Let mw_editPost do all of the heavy lifting.\n\t\treturn $this->mw_editPost( $args );\n\t}\n\n\t/**\n\t * Retrieve page list.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getPageList( $args ) {\n\t\tglobal $wpdb;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_pages' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit pages.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPageList' );\n\n\t\t// Get list of pages ids and titles\n\t\t$page_list = $wpdb->get_results(\"\n\t\t\tSELECT ID page_id,\n\t\t\t\tpost_title page_title,\n\t\t\t\tpost_parent page_parent_id,\n\t\t\t\tpost_date_gmt,\n\t\t\t\tpost_date,\n\t\t\t\tpost_status\n\t\t\tFROM {$wpdb->posts}\n\t\t\tWHERE post_type = 'page'\n\t\t\tORDER BY ID\n\t\t\");\n\n\t\t// The date needs to be formatted properly.\n\t\t$num_pages = count($page_list);\n\t\tfor ( $i = 0; $i < $num_pages; $i++ ) {\n\t\t\t$page_list[$i]->dateCreated = $this->_convert_date(  $page_list[$i]->post_date );\n\t\t\t$page_list[$i]->date_created_gmt = $this->_convert_date_gmt( $page_list[$i]->post_date_gmt, $page_list[$i]->post_date );\n\n\t\t\tunset($page_list[$i]->post_date_gmt);\n\t\t\tunset($page_list[$i]->post_date);\n\t\t\tunset($page_list[$i]->post_status);\n\t\t}\n\n\t\treturn $page_list;\n\t}\n\n\t/**\n\t * Retrieve authors list.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getAuthors( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can('edit_posts') )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit posts on this site.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getAuthors' );\n\n\t\t$authors = array();\n\t\tforeach ( get_users( array( 'fields' => array('ID','user_login','display_name') ) ) as $user ) {\n\t\t\t$authors[] = array(\n\t\t\t\t'user_id'       => $user->ID,\n\t\t\t\t'user_login'    => $user->user_login,\n\t\t\t\t'display_name'  => $user->display_name\n\t\t\t);\n\t\t}\n\n\t\treturn $authors;\n\t}\n\n\t/**\n\t * Get list of all tags\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getTags( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view tags.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getKeywords' );\n\n\t\t$tags = array();\n\n\t\tif ( $all_tags = get_tags() ) {\n\t\t\tforeach ( (array) $all_tags as $tag ) {\n\t\t\t\t$struct = array();\n\t\t\t\t$struct['tag_id']\t\t\t= $tag->term_id;\n\t\t\t\t$struct['name']\t\t\t\t= $tag->name;\n\t\t\t\t$struct['count']\t\t\t= $tag->count;\n\t\t\t\t$struct['slug']\t\t\t\t= $tag->slug;\n\t\t\t\t$struct['html_url']\t\t\t= esc_html( get_tag_link( $tag->term_id ) );\n\t\t\t\t$struct['rss_url']\t\t\t= esc_html( get_tag_feed_link( $tag->term_id ) );\n\n\t\t\t\t$tags[] = $struct;\n\t\t\t}\n\t\t}\n\n\t\treturn $tags;\n\t}\n\n\t/**\n\t * Create new category.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $category\n\t * }\n\t * @return int|IXR_Error Category ID.\n\t */\n\tpublic function wp_newCategory( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$category = $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.newCategory' );\n\n\t\t// Make sure the user is allowed to add a category.\n\t\tif ( !current_user_can('manage_categories') )\n\t\t\treturn new IXR_Error(401, __('Sorry, you do not have the right to add a category.'));\n\n\t\t// If no slug was provided make it empty so that\n\t\t// WordPress will generate one.\n\t\tif ( empty($category['slug']) )\n\t\t\t$category['slug'] = '';\n\n\t\t// If no parent_id was provided make it empty\n\t\t// so that it will be a top level page (no parent).\n\t\tif ( !isset($category['parent_id']) )\n\t\t\t$category['parent_id'] = '';\n\n\t\t// If no description was provided make it empty.\n\t\tif ( empty($category[\"description\"]) )\n\t\t\t$category[\"description\"] = \"\";\n\n\t\t$new_category = array(\n\t\t\t'cat_name'\t\t\t\t=> $category['name'],\n\t\t\t'category_nicename'\t\t=> $category['slug'],\n\t\t\t'category_parent'\t\t=> $category['parent_id'],\n\t\t\t'category_description'\t=> $category['description']\n\t\t);\n\n\t\t$cat_id = wp_insert_category($new_category, true);\n\t\tif ( is_wp_error( $cat_id ) ) {\n\t\t\tif ( 'term_exists' == $cat_id->get_error_code() )\n\t\t\t\treturn (int) $cat_id->get_error_data();\n\t\t\telse\n\t\t\t\treturn new IXR_Error(500, __('Sorry, the new category failed.'));\n\t\t} elseif ( ! $cat_id ) {\n\t\t\treturn new IXR_Error(500, __('Sorry, the new category failed.'));\n\t\t}\n\n\t\t/**\n\t\t * Fires after a new category has been successfully created via XML-RPC.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $cat_id ID of the new category.\n\t\t * @param array $args   An array of new category arguments.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_wp_newCategory', $cat_id, $args );\n\n\t\treturn $cat_id;\n\t}\n\n\t/**\n\t * Remove category.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $category_id\n\t * }\n\t * @return bool|IXR_Error See {@link wp_delete_term()} for return info.\n\t */\n\tpublic function wp_deleteCategory( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username    = $args[1];\n\t\t$password    = $args[2];\n\t\t$category_id = (int) $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.deleteCategory' );\n\n\t\tif ( !current_user_can('manage_categories') )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to delete a category.' ) );\n\n\t\t$status = wp_delete_term( $category_id, 'category' );\n\n\t\tif ( true == $status ) {\n\t\t\t/**\n\t\t\t * Fires after a category has been successfully deleted via XML-RPC.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param int   $category_id ID of the deleted category.\n\t\t\t * @param array $args        An array of arguments to delete the category.\n\t\t\t */\n\t\t\tdo_action( 'xmlrpc_call_success_wp_deleteCategory', $category_id, $args );\n\t\t}\n\n\t\treturn $status;\n\t}\n\n\t/**\n\t * Retrieve category list.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $category\n\t *     @type int    $max_results\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_suggestCategories( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username    = $args[1];\n\t\t$password    = $args[2];\n\t\t$category    = $args[3];\n\t\t$max_results = (int) $args[4];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.suggestCategories' );\n\n\t\t$category_suggestions = array();\n\t\t$args = array('get' => 'all', 'number' => $max_results, 'name__like' => $category);\n\t\tforeach ( (array) get_categories($args) as $cat ) {\n\t\t\t$category_suggestions[] = array(\n\t\t\t\t'category_id'\t=> $cat->term_id,\n\t\t\t\t'category_name'\t=> $cat->name\n\t\t\t);\n\t\t}\n\n\t\treturn $category_suggestions;\n\t}\n\n\t/**\n\t * Retrieve comment.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $comment_id\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getComment($args) {\n\t\t$this->escape($args);\n\n\t\t$username\t= $args[1];\n\t\t$password\t= $args[2];\n\t\t$comment_id\t= (int) $args[3];\n\n\t\tif ( ! $user = $this->login( $username, $password ) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getComment' );\n\n\t\tif ( ! $comment = get_comment( $comment_id ) ) {\n\t\t\treturn new IXR_Error( 404, __( 'Invalid comment ID.' ) );\n\t\t}\n\n\t\tif ( ! current_user_can( 'edit_comment', $comment_id ) ) {\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed to moderate or edit this comment.' ) );\n\t\t}\n\n\t\treturn $this->_prepare_comment( $comment );\n\t}\n\n\t/**\n\t * Retrieve comments.\n\t *\n\t * Besides the common blog_id (unused), username, and password arguments, it takes a filter\n\t * array as last argument.\n\t *\n\t * Accepted 'filter' keys are 'status', 'post_id', 'offset', and 'number'.\n\t *\n\t * The defaults are as follows:\n\t * - 'status' - Default is ''. Filter by status (e.g., 'approve', 'hold')\n\t * - 'post_id' - Default is ''. The post where the comment is posted. Empty string shows all comments.\n\t * - 'number' - Default is 10. Total number of media items to retrieve.\n\t * - 'offset' - Default is 0. See {@link WP_Query::query()} for more.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $struct\n\t * }\n\t * @return array|IXR_Error Contains a collection of comments. See {@link wp_xmlrpc_server::wp_getComment()} for a description of each item contents\n\t */\n\tpublic function wp_getComments( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$struct\t  = isset( $args[3] ) ? $args[3] : array();\n\n\t\tif ( ! $user = $this->login( $username, $password ) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getComments' );\n\n\t\tif ( isset( $struct['status'] ) ) {\n\t\t\t$status = $struct['status'];\n\t\t} else {\n\t\t\t$status = '';\n\t\t}\n\n\t\tif ( ! current_user_can( 'moderate_comments' ) && 'approve' !== $status ) {\n\t\t\treturn new IXR_Error( 401, __( 'Invalid comment status.' ) );\n\t\t}\n\n\t\t$post_id = '';\n\t\tif ( isset( $struct['post_id'] ) ) {\n\t\t\t$post_id = absint( $struct['post_id'] );\n\t\t}\n\n\t\t$post_type = '';\n\t\tif ( isset( $struct['post_type'] ) ) {\n\t\t\t$post_type_object = get_post_type_object( $struct['post_type'] );\n\t\t\tif ( ! $post_type_object || ! post_type_supports( $post_type_object->name, 'comments' ) ) {\n\t\t\t\treturn new IXR_Error( 404, __( 'Invalid post type.' ) );\n\t\t\t}\n\t\t\t$post_type = $struct['post_type'];\n\t\t}\n\n\t\t$offset = 0;\n\t\tif ( isset( $struct['offset'] ) ) {\n\t\t\t$offset = absint( $struct['offset'] );\n\t\t}\n\n\t\t$number = 10;\n\t\tif ( isset( $struct['number'] ) ) {\n\t\t\t$number = absint( $struct['number'] );\n\t\t}\n\n\t\t$comments = get_comments( array(\n\t\t\t'status' => $status,\n\t\t\t'post_id' => $post_id,\n\t\t\t'offset' => $offset,\n\t\t\t'number' => $number,\n\t\t\t'post_type' => $post_type,\n\t\t) );\n\n\t\t$comments_struct = array();\n\t\tif ( is_array( $comments ) ) {\n\t\t\tforeach ( $comments as $comment ) {\n\t\t\t\t$comments_struct[] = $this->_prepare_comment( $comment );\n\t\t\t}\n\t\t}\n\n\t\treturn $comments_struct;\n\t}\n\n\t/**\n\t * Delete a comment.\n\t *\n\t * By default, the comment will be moved to the trash instead of deleted.\n\t * See {@link wp_delete_comment()} for more information on\n\t * this behavior.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $comment_ID\n\t * }\n\t * @return bool|IXR_Error {@link wp_delete_comment()}\n\t */\n\tpublic function wp_deleteComment( $args ) {\n\t\t$this->escape($args);\n\n\t\t$username\t= $args[1];\n\t\t$password\t= $args[2];\n\t\t$comment_ID\t= (int) $args[3];\n\n\t\tif ( ! $user = $this->login( $username, $password ) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\tif ( ! get_comment( $comment_ID ) ) {\n\t\t\treturn new IXR_Error( 404, __( 'Invalid comment ID.' ) );\n\t\t}\n\n\t\tif ( !current_user_can( 'edit_comment', $comment_ID ) ) {\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed to moderate or edit this comment.' ) );\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.deleteComment' );\n\n\t\t$status = wp_delete_comment( $comment_ID );\n\n\t\tif ( $status ) {\n\t\t\t/**\n\t\t\t * Fires after a comment has been successfully deleted via XML-RPC.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param int   $comment_ID ID of the deleted comment.\n\t\t\t * @param array $args       An array of arguments to delete the comment.\n\t\t\t */\n\t\t\tdo_action( 'xmlrpc_call_success_wp_deleteComment', $comment_ID, $args );\n\t\t}\n\n\t\treturn $status;\n\t}\n\n\t/**\n\t * Edit comment.\n\t *\n\t * Besides the common blog_id (unused), username, and password arguments, it takes a\n\t * comment_id integer and a content_struct array as last argument.\n\t *\n\t * The allowed keys in the content_struct array are:\n\t *  - 'author'\n\t *  - 'author_url'\n\t *  - 'author_email'\n\t *  - 'content'\n\t *  - 'date_created_gmt'\n\t *  - 'status'. Common statuses are 'approve', 'hold', 'spam'. See get_comment_statuses() for more details\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $comment_ID\n\t *     @type array  $content_struct\n\t * }\n\t * @return true|IXR_Error True, on success.\n\t */\n\tpublic function wp_editComment( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username\t= $args[1];\n\t\t$password\t= $args[2];\n\t\t$comment_ID\t= (int) $args[3];\n\t\t$content_struct = $args[4];\n\n\t\tif ( !$user = $this->login( $username, $password ) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\tif ( ! get_comment( $comment_ID ) ) {\n\t\t\treturn new IXR_Error( 404, __( 'Invalid comment ID.' ) );\n\t\t}\n\n\t\tif ( ! current_user_can( 'edit_comment', $comment_ID ) ) {\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed to moderate or edit this comment.' ) );\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.editComment' );\n\n\t\tif ( isset($content_struct['status']) ) {\n\t\t\t$statuses = get_comment_statuses();\n\t\t\t$statuses = array_keys($statuses);\n\n\t\t\tif ( ! in_array($content_struct['status'], $statuses) )\n\t\t\t\treturn new IXR_Error( 401, __( 'Invalid comment status.' ) );\n\t\t\t$comment_approved = $content_struct['status'];\n\t\t}\n\n\t\t// Do some timestamp voodoo\n\t\tif ( !empty( $content_struct['date_created_gmt'] ) ) {\n\t\t\t// We know this is supposed to be GMT, so we're going to slap that Z on there by force\n\t\t\t$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';\n\t\t\t$comment_date = get_date_from_gmt(iso8601_to_datetime($dateCreated));\n\t\t\t$comment_date_gmt = iso8601_to_datetime($dateCreated, 'GMT');\n\t\t}\n\n\t\tif ( isset($content_struct['content']) )\n\t\t\t$comment_content = $content_struct['content'];\n\n\t\tif ( isset($content_struct['author']) )\n\t\t\t$comment_author = $content_struct['author'];\n\n\t\tif ( isset($content_struct['author_url']) )\n\t\t\t$comment_author_url = $content_struct['author_url'];\n\n\t\tif ( isset($content_struct['author_email']) )\n\t\t\t$comment_author_email = $content_struct['author_email'];\n\n\t\t// We've got all the data -- post it:\n\t\t$comment = compact('comment_ID', 'comment_content', 'comment_approved', 'comment_date', 'comment_date_gmt', 'comment_author', 'comment_author_email', 'comment_author_url');\n\n\t\t$result = wp_update_comment($comment);\n\t\tif ( is_wp_error( $result ) )\n\t\t\treturn new IXR_Error(500, $result->get_error_message());\n\n\t\tif ( !$result )\n\t\t\treturn new IXR_Error(500, __('Sorry, the comment could not be edited. Something wrong happened.'));\n\n\t\t/**\n\t\t * Fires after a comment has been successfully updated via XML-RPC.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $comment_ID ID of the updated comment.\n\t\t * @param array $args       An array of arguments to update the comment.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_wp_editComment', $comment_ID, $args );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Create new comment.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int        $blog_id (unused)\n\t *     @type string     $username\n\t *     @type string     $password\n\t *     @type string|int $post\n\t *     @type array      $content_struct\n\t * }\n\t * @return int|IXR_Error {@link wp_new_comment()}\n\t */\n\tpublic function wp_newComment($args) {\n\t\t$this->escape($args);\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$post           = $args[3];\n\t\t$content_struct = $args[4];\n\n\t\t/**\n\t\t * Filter whether to allow anonymous comments over XML-RPC.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param bool $allow Whether to allow anonymous commenting via XML-RPC.\n\t\t *                    Default false.\n\t\t */\n\t\t$allow_anon = apply_filters( 'xmlrpc_allow_anonymous_comments', false );\n\n\t\t$user = $this->login($username, $password);\n\n\t\tif ( !$user ) {\n\t\t\t$logged_in = false;\n\t\t\tif ( $allow_anon && get_option('comment_registration') ) {\n\t\t\t\treturn new IXR_Error( 403, __( 'You must be registered to comment' ) );\n\t\t\t} elseif ( ! $allow_anon ) {\n\t\t\t\treturn $this->error;\n\t\t\t}\n\t\t} else {\n\t\t\t$logged_in = true;\n\t\t}\n\n\t\tif ( is_numeric($post) )\n\t\t\t$post_id = absint($post);\n\t\telse\n\t\t\t$post_id = url_to_postid($post);\n\n\t\tif ( ! $post_id ) {\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\t\t}\n\n\t\tif ( ! get_post( $post_id ) ) {\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\t\t}\n\n\t\tif ( ! comments_open( $post_id ) ) {\n\t\t\treturn new IXR_Error( 403, __( 'Sorry, comments are closed for this item.' ) );\n\t\t}\n\n\t\t$comment = array();\n\t\t$comment['comment_post_ID'] = $post_id;\n\n\t\tif ( $logged_in ) {\n\t\t\t$display_name = $user->display_name;\n\t\t\t$user_email = $user->user_email;\n\t\t\t$user_url = $user->user_url;\n\n\t\t\t$comment['comment_author'] = $this->escape( $display_name );\n\t\t\t$comment['comment_author_email'] = $this->escape( $user_email );\n\t\t\t$comment['comment_author_url'] = $this->escape( $user_url );\n\t\t\t$comment['user_ID'] = $user->ID;\n\t\t} else {\n\t\t\t$comment['comment_author'] = '';\n\t\t\tif ( isset($content_struct['author']) )\n\t\t\t\t$comment['comment_author'] = $content_struct['author'];\n\n\t\t\t$comment['comment_author_email'] = '';\n\t\t\tif ( isset($content_struct['author_email']) )\n\t\t\t\t$comment['comment_author_email'] = $content_struct['author_email'];\n\n\t\t\t$comment['comment_author_url'] = '';\n\t\t\tif ( isset($content_struct['author_url']) )\n\t\t\t\t$comment['comment_author_url'] = $content_struct['author_url'];\n\n\t\t\t$comment['user_ID'] = 0;\n\n\t\t\tif ( get_option('require_name_email') ) {\n\t\t\t\tif ( 6 > strlen($comment['comment_author_email']) || '' == $comment['comment_author'] )\n\t\t\t\t\treturn new IXR_Error( 403, __( 'Comment author name and email are required' ) );\n\t\t\t\telseif ( !is_email($comment['comment_author_email']) )\n\t\t\t\t\treturn new IXR_Error( 403, __( 'A valid email address is required' ) );\n\t\t\t}\n\t\t}\n\n\t\t$comment['comment_parent'] = isset($content_struct['comment_parent']) ? absint($content_struct['comment_parent']) : 0;\n\n\t\t$comment['comment_content'] =  isset($content_struct['content']) ? $content_struct['content'] : null;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.newComment' );\n\n\t\t$comment_ID = wp_new_comment( $comment );\n\n\t\t/**\n\t\t * Fires after a new comment has been successfully created via XML-RPC.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $comment_ID ID of the new comment.\n\t\t * @param array $args       An array of new comment arguments.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_wp_newComment', $comment_ID, $args );\n\n\t\treturn $comment_ID;\n\t}\n\n\t/**\n\t * Retrieve all of the comment status.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getCommentStatusList( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( ! $user = $this->login( $username, $password ) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\tif ( ! current_user_can( 'publish_posts' ) ) {\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getCommentStatusList' );\n\n\t\treturn get_comment_statuses();\n\t}\n\n\t/**\n\t * Retrieve comment count.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $post_id\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getCommentCount( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username\t= $args[1];\n\t\t$password\t= $args[2];\n\t\t$post_id\t= (int) $args[3];\n\n\t\tif ( ! $user = $this->login( $username, $password ) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t$post = get_post( $post_id, ARRAY_A );\n\t\tif ( empty( $post['ID'] ) ) {\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\t\t}\n\n\t\tif ( ! current_user_can( 'edit_post', $post_id ) ) {\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed access to details of this post.' ) );\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getCommentCount' );\n\n\t\t$count = wp_count_comments( $post_id );\n\n\t\treturn array(\n\t\t\t'approved' => $count->approved,\n\t\t\t'awaiting_moderation' => $count->moderated,\n\t\t\t'spam' => $count->spam,\n\t\t\t'total_comments' => $count->total_comments\n\t\t);\n\t}\n\n\t/**\n\t * Retrieve post statuses.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getPostStatusList( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPostStatusList' );\n\n\t\treturn get_post_statuses();\n\t}\n\n\t/**\n\t * Retrieve page statuses.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getPageStatusList( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_pages' ) )\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPageStatusList' );\n\n\t\treturn get_page_statuses();\n\t}\n\n\t/**\n\t * Retrieve page templates.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getPageTemplates( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_pages' ) )\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );\n\n\t\t$templates = get_page_templates();\n\t\t$templates['Default'] = 'default';\n\n\t\treturn $templates;\n\t}\n\n\t/**\n\t * Retrieve blog options.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $options\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getOptions( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username\t= $args[1];\n\t\t$password\t= $args[2];\n\t\t$options\t= isset( $args[3] ) ? (array) $args[3] : array();\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t// If no specific options where asked for, return all of them\n\t\tif ( count( $options ) == 0 )\n\t\t\t$options = array_keys($this->blog_options);\n\n\t\treturn $this->_getOptions($options);\n\t}\n\n\t/**\n\t * Retrieve blog options value from list.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param array $options Options to retrieve.\n\t * @return array\n\t */\n\tpublic function _getOptions($options) {\n\t\t$data = array();\n\t\t$can_manage = current_user_can( 'manage_options' );\n\t\tforeach ( $options as $option ) {\n\t\t\tif ( array_key_exists( $option, $this->blog_options ) ) {\n\t\t\t\t$data[$option] = $this->blog_options[$option];\n\t\t\t\t//Is the value static or dynamic?\n\t\t\t\tif ( isset( $data[$option]['option'] ) ) {\n\t\t\t\t\t$data[$option]['value'] = get_option( $data[$option]['option'] );\n\t\t\t\t\tunset($data[$option]['option']);\n\t\t\t\t}\n\n\t\t\t\tif ( ! $can_manage )\n\t\t\t\t\t$data[$option]['readonly'] = true;\n\t\t\t}\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Update blog options.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $options\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_setOptions( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username\t= $args[1];\n\t\t$password\t= $args[2];\n\t\t$options\t= (array) $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'manage_options' ) )\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed to update options.' ) );\n\n\t\t$option_names = array();\n\t\tforeach ( $options as $o_name => $o_value ) {\n\t\t\t$option_names[] = $o_name;\n\t\t\tif ( !array_key_exists( $o_name, $this->blog_options ) )\n\t\t\t\tcontinue;\n\n\t\t\tif ( $this->blog_options[$o_name]['readonly'] == true )\n\t\t\t\tcontinue;\n\n\t\t\tupdate_option( $this->blog_options[$o_name]['option'], wp_unslash( $o_value ) );\n\t\t}\n\n\t\t//Now return the updated values\n\t\treturn $this->_getOptions($option_names);\n\t}\n\n\t/**\n\t * Retrieve a media item by ID\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $attachment_id\n\t * }\n\t * @return array|IXR_Error Associative array contains:\n\t *  - 'date_created_gmt'\n\t *  - 'parent'\n\t *  - 'link'\n\t *  - 'thumbnail'\n\t *  - 'title'\n\t *  - 'caption'\n\t *  - 'description'\n\t *  - 'metadata'\n\t */\n\tpublic function wp_getMediaItem( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username\t\t= $args[1];\n\t\t$password\t\t= $args[2];\n\t\t$attachment_id\t= (int) $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'upload_files' ) )\n\t\t\treturn new IXR_Error( 403, __( 'You do not have permission to upload files.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getMediaItem' );\n\n\t\tif ( ! $attachment = get_post($attachment_id) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid attachment ID.' ) );\n\n\t\treturn $this->_prepare_media_item( $attachment );\n\t}\n\n\t/**\n\t * Retrieves a collection of media library items (or attachments)\n\t *\n\t * Besides the common blog_id (unused), username, and password arguments, it takes a filter\n\t * array as last argument.\n\t *\n\t * Accepted 'filter' keys are 'parent_id', 'mime_type', 'offset', and 'number'.\n\t *\n\t * The defaults are as follows:\n\t * - 'number' - Default is 5. Total number of media items to retrieve.\n\t * - 'offset' - Default is 0. See WP_Query::query() for more.\n\t * - 'parent_id' - Default is ''. The post where the media item is attached. Empty string shows all media items. 0 shows unattached media items.\n\t * - 'mime_type' - Default is ''. Filter by mime type (e.g., 'image/jpeg', 'application/pdf')\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $struct\n\t * }\n\t * @return array|IXR_Error Contains a collection of media items. See wp_xmlrpc_server::wp_getMediaItem() for a description of each item contents\n\t */\n\tpublic function wp_getMediaLibrary($args) {\n\t\t$this->escape($args);\n\n\t\t$username\t= $args[1];\n\t\t$password\t= $args[2];\n\t\t$struct\t\t= isset( $args[3] ) ? $args[3] : array() ;\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'upload_files' ) )\n\t\t\treturn new IXR_Error( 401, __( 'You do not have permission to upload files.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getMediaLibrary' );\n\n\t\t$parent_id = ( isset($struct['parent_id']) ) ? absint($struct['parent_id']) : '' ;\n\t\t$mime_type = ( isset($struct['mime_type']) ) ? $struct['mime_type'] : '' ;\n\t\t$offset = ( isset($struct['offset']) ) ? absint($struct['offset']) : 0 ;\n\t\t$number = ( isset($struct['number']) ) ? absint($struct['number']) : -1 ;\n\n\t\t$attachments = get_posts( array('post_type' => 'attachment', 'post_parent' => $parent_id, 'offset' => $offset, 'numberposts' => $number, 'post_mime_type' => $mime_type ) );\n\n\t\t$attachments_struct = array();\n\n\t\tforeach ($attachments as $attachment )\n\t\t\t$attachments_struct[] = $this->_prepare_media_item( $attachment );\n\n\t\treturn $attachments_struct;\n\t}\n\n\t/**\n\t * Retrieves a list of post formats used by the site.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error List of post formats, otherwise IXR_Error object.\n\t */\n\tpublic function wp_getPostFormats( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPostFormats' );\n\n\t\t$formats = get_post_format_strings();\n\n\t\t// find out if they want a list of currently supports formats\n\t\tif ( isset( $args[3] ) && is_array( $args[3] ) ) {\n\t\t\tif ( $args[3]['show-supported'] ) {\n\t\t\t\tif ( current_theme_supports( 'post-formats' ) ) {\n\t\t\t\t\t$supported = get_theme_support( 'post-formats' );\n\n\t\t\t\t\t$data = array();\n\t\t\t\t\t$data['all'] = $formats;\n\t\t\t\t\t$data['supported'] = $supported[0];\n\n\t\t\t\t\t$formats = $data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $formats;\n\t}\n\n\t/**\n\t * Retrieves a post type\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see get_post_type_object()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type string $post_type_name\n\t *     @type array  $fields (optional)\n\t * }\n\t * @return array|IXR_Error Array contains:\n\t *  - 'labels'\n\t *  - 'description'\n\t *  - 'capability_type'\n\t *  - 'cap'\n\t *  - 'map_meta_cap'\n\t *  - 'hierarchical'\n\t *  - 'menu_position'\n\t *  - 'taxonomies'\n\t *  - 'supports'\n\t */\n\tpublic function wp_getPostType( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$post_type_name = $args[3];\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/**\n\t\t\t * Filter the default query fields used by the given XML-RPC method.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param array  $fields An array of post type query fields for the given method.\n\t\t\t * @param string $method The method name.\n\t\t\t */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostType' );\n\t\t}\n\n\t\tif ( !$user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPostType' );\n\n\t\tif ( ! post_type_exists( $post_type_name ) )\n\t\t\treturn new IXR_Error( 403, __( 'Invalid post type' ) );\n\n\t\t$post_type = get_post_type_object( $post_type_name );\n\n\t\tif ( ! current_user_can( $post_type->cap->edit_posts ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post type.' ) );\n\n\t\treturn $this->_prepare_post_type( $post_type, $fields );\n\t}\n\n\t/**\n\t * Retrieves a post types\n\t *\n\t * @since 3.4.0\n\t *\n\t * @see get_post_types()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $filter (optional)\n\t *     @type array  $fields (optional)\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function wp_getPostTypes( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 3 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$filter   = isset( $args[3] ) ? $args[3] : array( 'public' => true );\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostTypes' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getPostTypes' );\n\n\t\t$post_types = get_post_types( $filter, 'objects' );\n\n\t\t$struct = array();\n\n\t\tforeach ( $post_types as $post_type ) {\n\t\t\tif ( ! current_user_can( $post_type->cap->edit_posts ) )\n\t\t\t\tcontinue;\n\n\t\t\t$struct[$post_type->name] = $this->_prepare_post_type( $post_type, $fields );\n\t\t}\n\n\t\treturn $struct;\n\t}\n\n\t/**\n\t * Retrieve revisions for a specific post.\n\t *\n\t * @since 3.5.0\n\t *\n\t * The optional $fields parameter specifies what fields will be included\n\t * in the response array.\n\t *\n\t * @uses wp_get_post_revisions()\n\t * @see wp_getPost() for more on $fields\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $post_id\n\t *     @type array  $fields (optional)\n\t * }\n\t * @return array|IXR_Error contains a collection of posts.\n\t */\n\tpublic function wp_getRevisions( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 4 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\t$post_id  = (int) $args[3];\n\n\t\tif ( isset( $args[4] ) ) {\n\t\t\t$fields = $args[4];\n\t\t} else {\n\t\t\t/**\n\t\t\t * Filter the default revision query fields used by the given XML-RPC method.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param array  $field  An array of revision query fields.\n\t\t\t * @param string $method The method name.\n\t\t\t */\n\t\t\t$fields = apply_filters( 'xmlrpc_default_revision_fields', array( 'post_date', 'post_date_gmt' ), 'wp.getRevisions' );\n\t\t}\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.getRevisions' );\n\n\t\tif ( ! $post = get_post( $post_id ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( ! current_user_can( 'edit_post', $post_id ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );\n\n\t\t// Check if revisions are enabled.\n\t\tif ( ! wp_revisions_enabled( $post ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) );\n\n\t\t$revisions = wp_get_post_revisions( $post_id );\n\n\t\tif ( ! $revisions )\n\t\t\treturn array();\n\n\t\t$struct = array();\n\n\t\tforeach ( $revisions as $revision ) {\n\t\t\tif ( ! current_user_can( 'read_post', $revision->ID ) )\n\t\t\t\tcontinue;\n\n\t\t\t// Skip autosaves\n\t\t\tif ( wp_is_post_autosave( $revision ) )\n\t\t\t\tcontinue;\n\n\t\t\t$struct[] = $this->_prepare_post( get_object_vars( $revision ), $fields );\n\t\t}\n\n\t\treturn $struct;\n\t}\n\n\t/**\n\t * Restore a post revision\n\t *\n\t * @since 3.5.0\n\t *\n\t * @uses wp_restore_post_revision()\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $revision_id\n\t * }\n\t * @return bool|IXR_Error false if there was an error restoring, true if success.\n\t */\n\tpublic function wp_restoreRevision( $args ) {\n\t\tif ( ! $this->minimum_args( $args, 3 ) )\n\t\t\treturn $this->error;\n\n\t\t$this->escape( $args );\n\n\t\t$username    = $args[1];\n\t\t$password    = $args[2];\n\t\t$revision_id = (int) $args[3];\n\n\t\tif ( ! $user = $this->login( $username, $password ) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'wp.restoreRevision' );\n\n\t\tif ( ! $revision = wp_get_post_revision( $revision_id ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( wp_is_post_autosave( $revision ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( ! $post = get_post( $revision->post_parent ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( ! current_user_can( 'edit_post', $revision->post_parent ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );\n\n\t\t// Check if revisions are disabled.\n\t\tif ( ! wp_revisions_enabled( $post ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) );\n\n\t\t$post = wp_restore_post_revision( $revision_id );\n\n\t\treturn (bool) $post;\n\t}\n\n\t/* Blogger API functions.\n\t * specs on http://plant.blogger.com/api and http://groups.yahoo.com/group/bloggerDev/\n\t */\n\n\t/**\n\t * Retrieve blogs that user owns.\n\t *\n\t * Will make more sense once we support multiple blogs.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function blogger_getUsersBlogs($args) {\n\t\tif ( is_multisite() )\n\t\t\treturn $this->_multisite_getUsersBlogs($args);\n\n\t\t$this->escape($args);\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'blogger.getUsersBlogs' );\n\n\t\t$is_admin = current_user_can('manage_options');\n\n\t\t$struct = array(\n\t\t\t'isAdmin'  => $is_admin,\n\t\t\t'url'      => get_option('home') . '/',\n\t\t\t'blogid'   => '1',\n\t\t\t'blogName' => get_option('blogname'),\n\t\t\t'xmlrpc'   => site_url( 'xmlrpc.php', 'rpc' ),\n\t\t);\n\n\t\treturn array($struct);\n\t}\n\n\t/**\n\t * Private function for retrieving a users blogs for multisite setups\n\t *\n\t * @access protected\n\t *\n\t * @return array|IXR_Error\n\t */\n\tprotected function _multisite_getUsersBlogs($args) {\n\t\t$current_blog = get_blog_details();\n\n\t\t$domain = $current_blog->domain;\n\t\t$path = $current_blog->path . 'xmlrpc.php';\n\n\t\t$rpc = new IXR_Client( set_url_scheme( \"http://{$domain}{$path}\" ) );\n\t\t$rpc->query('wp.getUsersBlogs', $args[1], $args[2]);\n\t\t$blogs = $rpc->getResponse();\n\n\t\tif ( isset($blogs['faultCode']) )\n\t\t\treturn new IXR_Error($blogs['faultCode'], $blogs['faultString']);\n\n\t\tif ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) {\n\t\t\treturn $blogs;\n\t\t} else {\n\t\t\tforeach ( (array) $blogs as $blog ) {\n\t\t\t\tif ( strpos($blog['url'], $_SERVER['HTTP_HOST']) )\n\t\t\t\t\treturn array($blog);\n\t\t\t}\n\t\t\treturn array();\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve user's data.\n\t *\n\t * Gives your client some info about you, so you don't have to.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function blogger_getUserInfo( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have access to user data on this site.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'blogger.getUserInfo' );\n\n\t\t$struct = array(\n\t\t\t'nickname'  => $user->nickname,\n\t\t\t'userid'    => $user->ID,\n\t\t\t'url'       => $user->user_url,\n\t\t\t'lastname'  => $user->last_name,\n\t\t\t'firstname' => $user->first_name\n\t\t);\n\n\t\treturn $struct;\n\t}\n\n\t/**\n\t * Retrieve post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type int    $post_ID\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function blogger_getPost( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$post_ID  = (int) $args[1];\n\t\t$username = $args[2];\n\t\t$password = $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t$post_data = get_post($post_ID, ARRAY_A);\n\t\tif ( ! $post_data )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( !current_user_can( 'edit_post', $post_ID ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'blogger.getPost' );\n\n\t\t$categories = implode(',', wp_get_post_categories($post_ID));\n\n\t\t$content  = '<title>'.wp_unslash($post_data['post_title']).'</title>';\n\t\t$content .= '<category>'.$categories.'</category>';\n\t\t$content .= wp_unslash($post_data['post_content']);\n\n\t\t$struct = array(\n\t\t\t'userid'    => $post_data['post_author'],\n\t\t\t'dateCreated' => $this->_convert_date( $post_data['post_date'] ),\n\t\t\t'content'     => $content,\n\t\t\t'postid'  => (string) $post_data['ID']\n\t\t);\n\n\t\treturn $struct;\n\t}\n\n\t/**\n\t * Retrieve list of recent posts.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type string $appkey (unused)\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $numberposts (optional)\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function blogger_getRecentPosts( $args ) {\n\n\t\t$this->escape($args);\n\n\t\t// $args[0] = appkey - ignored\n\t\t$username = $args[2];\n\t\t$password = $args[3];\n\t\tif ( isset( $args[4] ) )\n\t\t\t$query = array( 'numberposts' => absint( $args[4] ) );\n\t\telse\n\t\t\t$query = array();\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( ! current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit posts on this site.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'blogger.getRecentPosts' );\n\n\t\t$posts_list = wp_get_recent_posts( $query );\n\n\t\tif ( !$posts_list ) {\n\t\t\t$this->error = new IXR_Error(500, __('Either there are no posts, or something went wrong.'));\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t$recent_posts = array();\n\t\tforeach ($posts_list as $entry) {\n\t\t\tif ( !current_user_can( 'edit_post', $entry['ID'] ) )\n\t\t\t\tcontinue;\n\n\t\t\t$post_date  = $this->_convert_date( $entry['post_date'] );\n\t\t\t$categories = implode(',', wp_get_post_categories($entry['ID']));\n\n\t\t\t$content  = '<title>'.wp_unslash($entry['post_title']).'</title>';\n\t\t\t$content .= '<category>'.$categories.'</category>';\n\t\t\t$content .= wp_unslash($entry['post_content']);\n\n\t\t\t$recent_posts[] = array(\n\t\t\t\t'userid' => $entry['post_author'],\n\t\t\t\t'dateCreated' => $post_date,\n\t\t\t\t'content' => $content,\n\t\t\t\t'postid' => (string) $entry['ID'],\n\t\t\t);\n\t\t}\n\n\t\treturn $recent_posts;\n\t}\n\n\t/**\n\t * Deprecated.\n\t *\n\t * @since 1.5.0\n\t * @deprecated 3.5.0\n\t * @return IXR_Error\n\t */\n\tpublic function blogger_getTemplate($args) {\n\t\treturn new IXR_Error( 403, __('Sorry, that file cannot be edited.' ) );\n\t}\n\n\t/**\n\t * Deprecated.\n\t *\n\t * @since 1.5.0\n\t * @deprecated 3.5.0\n\t * @return IXR_Error\n\t */\n\tpublic function blogger_setTemplate($args) {\n\t\treturn new IXR_Error( 403, __('Sorry, that file cannot be edited.' ) );\n\t}\n\n\t/**\n\t * Create new post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type string $appkey (unused)\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type string $content\n\t *     @type string $publish\n\t * }\n\t * @return int|IXR_Error\n\t */\n\tpublic function blogger_newPost( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[2];\n\t\t$password = $args[3];\n\t\t$content  = $args[4];\n\t\t$publish  = $args[5];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'blogger.newPost' );\n\n\t\t$cap = ($publish) ? 'publish_posts' : 'edit_posts';\n\t\tif ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) || !current_user_can($cap) )\n\t\t\treturn new IXR_Error(401, __('Sorry, you are not allowed to post on this site.'));\n\n\t\t$post_status = ($publish) ? 'publish' : 'draft';\n\n\t\t$post_author = $user->ID;\n\n\t\t$post_title = xmlrpc_getposttitle($content);\n\t\t$post_category = xmlrpc_getpostcategory($content);\n\t\t$post_content = xmlrpc_removepostdata($content);\n\n\t\t$post_date = current_time('mysql');\n\t\t$post_date_gmt = current_time('mysql', 1);\n\n\t\t$post_data = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status');\n\n\t\t$post_ID = wp_insert_post($post_data);\n\t\tif ( is_wp_error( $post_ID ) )\n\t\t\treturn new IXR_Error(500, $post_ID->get_error_message());\n\n\t\tif ( !$post_ID )\n\t\t\treturn new IXR_Error(500, __('Sorry, your entry could not be posted. Something wrong happened.'));\n\n\t\t$this->attach_uploads( $post_ID, $post_content );\n\n\t\t/**\n\t\t * Fires after a new post has been successfully created via the XML-RPC Blogger API.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $post_ID ID of the new post.\n\t\t * @param array $args    An array of new post arguments.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_blogger_newPost', $post_ID, $args );\n\n\t\treturn $post_ID;\n\t}\n\n\t/**\n\t * Edit a post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type int    $post_ID\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type string $content\n\t *     @type bool   $publish\n\t * }\n\t * @return true|IXR_Error true when done.\n\t */\n\tpublic function blogger_editPost( $args ) {\n\n\t\t$this->escape($args);\n\n\t\t$post_ID  = (int) $args[1];\n\t\t$username = $args[2];\n\t\t$password = $args[3];\n\t\t$content  = $args[4];\n\t\t$publish  = $args[5];\n\n\t\tif ( ! $user = $this->login( $username, $password ) ) {\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'blogger.editPost' );\n\n\t\t$actual_post = get_post( $post_ID, ARRAY_A );\n\n\t\tif ( ! $actual_post || $actual_post['post_type'] != 'post' ) {\n\t\t\treturn new IXR_Error( 404, __( 'Sorry, no such post.' ) );\n\t\t}\n\n\t\t$this->escape($actual_post);\n\n\t\tif ( ! current_user_can( 'edit_post', $post_ID ) ) {\n\t\t\treturn new IXR_Error(401, __('Sorry, you do not have the right to edit this post.'));\n\t\t}\n\t\tif ( 'publish' == $actual_post['post_status'] && ! current_user_can( 'publish_posts' ) ) {\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this post.' ) );\n\t\t}\n\n\t\t$postdata = array();\n\t\t$postdata['ID'] = $actual_post['ID'];\n\t\t$postdata['post_content'] = xmlrpc_removepostdata( $content );\n\t\t$postdata['post_title'] = xmlrpc_getposttitle( $content );\n\t\t$postdata['post_category'] = xmlrpc_getpostcategory( $content );\n\t\t$postdata['post_status'] = $actual_post['post_status'];\n\t\t$postdata['post_excerpt'] = $actual_post['post_excerpt'];\n\t\t$postdata['post_status'] = $publish ? 'publish' : 'draft';\n\n\t\t$result = wp_update_post( $postdata );\n\n\t\tif ( ! $result ) {\n\t\t\treturn new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be edited.'));\n\t\t}\n\t\t$this->attach_uploads( $actual_post['ID'], $postdata['post_content'] );\n\n\t\t/**\n\t\t * Fires after a post has been successfully updated via the XML-RPC Blogger API.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $post_ID ID of the updated post.\n\t\t * @param array $args    An array of arguments for the post to edit.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_blogger_editPost', $post_ID, $args );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Remove a post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type int    $post_ID\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return true|IXR_Error True when post is deleted.\n\t */\n\tpublic function blogger_deletePost( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$post_ID  = (int) $args[1];\n\t\t$username = $args[2];\n\t\t$password = $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'blogger.deletePost' );\n\n\t\t$actual_post = get_post( $post_ID, ARRAY_A );\n\n\t\tif ( ! $actual_post || $actual_post['post_type'] != 'post' ) {\n\t\t\treturn new IXR_Error( 404, __( 'Sorry, no such post.' ) );\n\t\t}\n\n\t\tif ( ! current_user_can( 'delete_post', $post_ID ) ) {\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to delete this post.' ) );\n\t\t}\n\n\t\t$result = wp_delete_post( $post_ID );\n\n\t\tif ( ! $result ) {\n\t\t\treturn new IXR_Error( 500, __( 'The post cannot be deleted.' ) );\n\t\t}\n\n\t\t/**\n\t\t * Fires after a post has been successfully deleted via the XML-RPC Blogger API.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $post_ID ID of the deleted post.\n\t\t * @param array $args    An array of arguments to delete the post.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_blogger_deletePost', $post_ID, $args );\n\n\t\treturn true;\n\t}\n\n\t/* MetaWeblog API functions\n\t * specs on wherever Dave Winer wants them to be\n\t */\n\n\t/**\n\t * Create a new post.\n\t *\n\t * The 'content_struct' argument must contain:\n\t *  - title\n\t *  - description\n\t *  - mt_excerpt\n\t *  - mt_text_more\n\t *  - mt_keywords\n\t *  - mt_tb_ping_urls\n\t *  - categories\n\t *\n\t * Also, it can optionally contain:\n\t *  - wp_slug\n\t *  - wp_password\n\t *  - wp_page_parent_id\n\t *  - wp_page_order\n\t *  - wp_author_id\n\t *  - post_status | page_status - can be 'draft', 'private', 'publish', or 'pending'\n\t *  - mt_allow_comments - can be 'open' or 'closed'\n\t *  - mt_allow_pings - can be 'open' or 'closed'\n\t *  - date_created_gmt\n\t *  - dateCreated\n\t *  - wp_post_thumbnail\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $content_struct\n\t *     @type int    $publish\n\t * }\n\t * @return int|IXR_Error\n\t */\n\tpublic function mw_newPost($args) {\n\t\t$this->escape($args);\n\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$content_struct = $args[3];\n\t\t$publish        = isset( $args[4] ) ? $args[4] : 0;\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'metaWeblog.newPost' );\n\n\t\t$page_template = '';\n\t\tif ( !empty( $content_struct['post_type'] ) ) {\n\t\t\tif ( $content_struct['post_type'] == 'page' ) {\n\t\t\t\tif ( $publish )\n\t\t\t\t\t$cap  = 'publish_pages';\n\t\t\t\telseif ( isset( $content_struct['page_status'] ) && 'publish' == $content_struct['page_status'] )\n\t\t\t\t\t$cap  = 'publish_pages';\n\t\t\t\telse\n\t\t\t\t\t$cap = 'edit_pages';\n\t\t\t\t$error_message = __( 'Sorry, you are not allowed to publish pages on this site.' );\n\t\t\t\t$post_type = 'page';\n\t\t\t\tif ( !empty( $content_struct['wp_page_template'] ) )\n\t\t\t\t\t$page_template = $content_struct['wp_page_template'];\n\t\t\t} elseif ( $content_struct['post_type'] == 'post' ) {\n\t\t\t\tif ( $publish )\n\t\t\t\t\t$cap  = 'publish_posts';\n\t\t\t\telseif ( isset( $content_struct['post_status'] ) && 'publish' == $content_struct['post_status'] )\n\t\t\t\t\t$cap  = 'publish_posts';\n\t\t\t\telse\n\t\t\t\t\t$cap = 'edit_posts';\n\t\t\t\t$error_message = __( 'Sorry, you are not allowed to publish posts on this site.' );\n\t\t\t\t$post_type = 'post';\n\t\t\t} else {\n\t\t\t\t// No other post_type values are allowed here\n\t\t\t\treturn new IXR_Error( 401, __( 'Invalid post type' ) );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( $publish )\n\t\t\t\t$cap  = 'publish_posts';\n\t\t\telseif ( isset( $content_struct['post_status'] ) && 'publish' == $content_struct['post_status'])\n\t\t\t\t$cap  = 'publish_posts';\n\t\t\telse\n\t\t\t\t$cap = 'edit_posts';\n\t\t\t$error_message = __( 'Sorry, you are not allowed to publish posts on this site.' );\n\t\t\t$post_type = 'post';\n\t\t}\n\n\t\tif ( ! current_user_can( get_post_type_object( $post_type )->cap->create_posts ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts on this site.' ) );\n\t\tif ( !current_user_can( $cap ) )\n\t\t\treturn new IXR_Error( 401, $error_message );\n\n\t\t// Check for a valid post format if one was given\n\t\tif ( isset( $content_struct['wp_post_format'] ) ) {\n\t\t\t$content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] );\n\t\t\tif ( !array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) {\n\t\t\t\treturn new IXR_Error( 404, __( 'Invalid post format' ) );\n\t\t\t}\n\t\t}\n\n\t\t// Let WordPress generate the post_name (slug) unless\n\t\t// one has been provided.\n\t\t$post_name = \"\";\n\t\tif ( isset($content_struct['wp_slug']) )\n\t\t\t$post_name = $content_struct['wp_slug'];\n\n\t\t// Only use a password if one was given.\n\t\tif ( isset($content_struct['wp_password']) )\n\t\t\t$post_password = $content_struct['wp_password'];\n\n\t\t// Only set a post parent if one was provided.\n\t\tif ( isset($content_struct['wp_page_parent_id']) )\n\t\t\t$post_parent = $content_struct['wp_page_parent_id'];\n\n\t\t// Only set the menu_order if it was provided.\n\t\tif ( isset($content_struct['wp_page_order']) )\n\t\t\t$menu_order = $content_struct['wp_page_order'];\n\n\t\t$post_author = $user->ID;\n\n\t\t// If an author id was provided then use it instead.\n\t\tif ( isset( $content_struct['wp_author_id'] ) && ( $user->ID != $content_struct['wp_author_id'] ) ) {\n\t\t\tswitch ( $post_type ) {\n\t\t\t\tcase \"post\":\n\t\t\t\t\tif ( !current_user_can( 'edit_others_posts' ) )\n\t\t\t\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to create posts as this user.' ) );\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"page\":\n\t\t\t\t\tif ( !current_user_can( 'edit_others_pages' ) )\n\t\t\t\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to create pages as this user.' ) );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn new IXR_Error( 401, __( 'Invalid post type' ) );\n\t\t\t}\n\t\t\t$author = get_userdata( $content_struct['wp_author_id'] );\n\t\t\tif ( ! $author )\n\t\t\t\treturn new IXR_Error( 404, __( 'Invalid author ID.' ) );\n\t\t\t$post_author = $content_struct['wp_author_id'];\n\t\t}\n\n\t\t$post_title = isset( $content_struct['title'] ) ? $content_struct['title'] : null;\n\t\t$post_content = isset( $content_struct['description'] ) ? $content_struct['description'] : null;\n\n\t\t$post_status = $publish ? 'publish' : 'draft';\n\n\t\tif ( isset( $content_struct[\"{$post_type}_status\"] ) ) {\n\t\t\tswitch ( $content_struct[\"{$post_type}_status\"] ) {\n\t\t\t\tcase 'draft':\n\t\t\t\tcase 'pending':\n\t\t\t\tcase 'private':\n\t\t\t\tcase 'publish':\n\t\t\t\t\t$post_status = $content_struct[\"{$post_type}_status\"];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$post_status = $publish ? 'publish' : 'draft';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$post_excerpt = isset($content_struct['mt_excerpt']) ? $content_struct['mt_excerpt'] : null;\n\t\t$post_more = isset($content_struct['mt_text_more']) ? $content_struct['mt_text_more'] : null;\n\n\t\t$tags_input = isset($content_struct['mt_keywords']) ? $content_struct['mt_keywords'] : null;\n\n\t\tif ( isset($content_struct['mt_allow_comments']) ) {\n\t\t\tif ( !is_numeric($content_struct['mt_allow_comments']) ) {\n\t\t\t\tswitch ( $content_struct['mt_allow_comments'] ) {\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\t$comment_status = 'closed';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'open':\n\t\t\t\t\t\t$comment_status = 'open';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$comment_status = get_default_comment_status( $post_type );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( (int) $content_struct['mt_allow_comments'] ) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t$comment_status = 'closed';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t$comment_status = 'open';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$comment_status = get_default_comment_status( $post_type );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t$comment_status = get_default_comment_status( $post_type );\n\t\t}\n\n\t\tif ( isset($content_struct['mt_allow_pings']) ) {\n\t\t\tif ( !is_numeric($content_struct['mt_allow_pings']) ) {\n\t\t\t\tswitch ( $content_struct['mt_allow_pings'] ) {\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\t$ping_status = 'closed';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'open':\n\t\t\t\t\t\t$ping_status = 'open';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$ping_status = get_default_comment_status( $post_type, 'pingback' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( (int) $content_struct['mt_allow_pings'] ) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t$ping_status = 'closed';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t$ping_status = 'open';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$ping_status = get_default_comment_status( $post_type, 'pingback' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t$ping_status = get_default_comment_status( $post_type, 'pingback' );\n\t\t}\n\n\t\tif ( $post_more )\n\t\t\t$post_content = $post_content . '<!--more-->' . $post_more;\n\n\t\t$to_ping = null;\n\t\tif ( isset( $content_struct['mt_tb_ping_urls'] ) ) {\n\t\t\t$to_ping = $content_struct['mt_tb_ping_urls'];\n\t\t\tif ( is_array($to_ping) )\n\t\t\t\t$to_ping = implode(' ', $to_ping);\n\t\t}\n\n\t\t// Do some timestamp voodoo\n\t\tif ( !empty( $content_struct['date_created_gmt'] ) )\n\t\t\t// We know this is supposed to be GMT, so we're going to slap that Z on there by force\n\t\t\t$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';\n\t\telseif ( !empty( $content_struct['dateCreated']) )\n\t\t\t$dateCreated = $content_struct['dateCreated']->getIso();\n\n\t\tif ( !empty( $dateCreated ) ) {\n\t\t\t$post_date = get_date_from_gmt(iso8601_to_datetime($dateCreated));\n\t\t\t$post_date_gmt = iso8601_to_datetime($dateCreated, 'GMT');\n\t\t} else {\n\t\t\t$post_date = '';\n\t\t\t$post_date_gmt = '';\n\t\t}\n\n\t\t$post_category = array();\n\t\tif ( isset( $content_struct['categories'] ) ) {\n\t\t\t$catnames = $content_struct['categories'];\n\n\t\t\tif ( is_array($catnames) ) {\n\t\t\t\tforeach ($catnames as $cat) {\n\t\t\t\t\t$post_category[] = get_cat_ID($cat);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order', 'tags_input', 'page_template');\n\n\t\t$post_ID = $postdata['ID'] = get_default_post_to_edit( $post_type, true )->ID;\n\n\t\t// Only posts can be sticky\n\t\tif ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) {\n\t\t\t$data = $postdata;\n\t\t\t$data['sticky'] = $content_struct['sticky'];\n\t\t\t$error = $this->_toggle_sticky( $data );\n\t\t\tif ( $error ) {\n\t\t\t\treturn $error;\n\t\t\t}\n\t\t}\n\n\t\tif ( isset($content_struct['custom_fields']) )\n\t\t\t$this->set_custom_fields($post_ID, $content_struct['custom_fields']);\n\n\t\tif ( isset ( $content_struct['wp_post_thumbnail'] ) ) {\n\t\t\tif ( set_post_thumbnail( $post_ID, $content_struct['wp_post_thumbnail'] ) === false )\n\t\t\t\treturn new IXR_Error( 404, __( 'Invalid attachment ID.' ) );\n\n\t\t\tunset( $content_struct['wp_post_thumbnail'] );\n\t\t}\n\n\t\t// Handle enclosures\n\t\t$thisEnclosure = isset($content_struct['enclosure']) ? $content_struct['enclosure'] : null;\n\t\t$this->add_enclosure_if_new($post_ID, $thisEnclosure);\n\n\t\t$this->attach_uploads( $post_ID, $post_content );\n\n\t\t// Handle post formats if assigned, value is validated earlier\n\t\t// in this function\n\t\tif ( isset( $content_struct['wp_post_format'] ) )\n\t\t\tset_post_format( $post_ID, $content_struct['wp_post_format'] );\n\n\t\t$post_ID = wp_insert_post( $postdata, true );\n\t\tif ( is_wp_error( $post_ID ) )\n\t\t\treturn new IXR_Error(500, $post_ID->get_error_message());\n\n\t\tif ( !$post_ID )\n\t\t\treturn new IXR_Error(500, __('Sorry, your entry could not be posted. Something wrong happened.'));\n\n\t\t/**\n\t\t * Fires after a new post has been successfully created via the XML-RPC MovableType API.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $post_ID ID of the new post.\n\t\t * @param array $args    An array of arguments to create the new post.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_mw_newPost', $post_ID, $args );\n\n\t\treturn strval($post_ID);\n\t}\n\n\t/**\n\t * @param integer $post_ID\n\t * @param array   $enclosure\n\t */\n\tpublic function add_enclosure_if_new( $post_ID, $enclosure ) {\n\t\tif ( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) {\n\t\t\t$encstring = $enclosure['url'] . \"\\n\" . $enclosure['length'] . \"\\n\" . $enclosure['type'] . \"\\n\";\n\t\t\t$found = false;\n\t\t\tif ( $enclosures = get_post_meta( $post_ID, 'enclosure' ) ) {\n\t\t\t\tforeach ( $enclosures as $enc ) {\n\t\t\t\t\t// This method used to omit the trailing new line. #23219\n\t\t\t\t\tif ( rtrim( $enc, \"\\n\" ) == rtrim( $encstring, \"\\n\" ) ) {\n\t\t\t\t\t\t$found = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( ! $found )\n\t\t\t\tadd_post_meta( $post_ID, 'enclosure', $encstring );\n\t\t}\n\t}\n\n\t/**\n\t * Attach upload to a post.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param int $post_ID Post ID.\n\t * @param string $post_content Post Content for attachment.\n\t */\n\tpublic function attach_uploads( $post_ID, $post_content ) {\n\t\tglobal $wpdb;\n\n\t\t// find any unattached files\n\t\t$attachments = $wpdb->get_results( \"SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '0' AND post_type = 'attachment'\" );\n\t\tif ( is_array( $attachments ) ) {\n\t\t\tforeach ( $attachments as $file ) {\n\t\t\t\tif ( ! empty( $file->guid ) && strpos( $post_content, $file->guid ) !== false )\n\t\t\t\t\t$wpdb->update($wpdb->posts, array('post_parent' => $post_ID), array('ID' => $file->ID) );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Edit a post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $content_struct\n\t *     @type int    $publish\n\t * }\n\t * @return bool|IXR_Error True on success.\n\t */\n\tpublic function mw_editPost( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$post_ID        = (int) $args[0];\n\t\t$username       = $args[1];\n\t\t$password       = $args[2];\n\t\t$content_struct = $args[3];\n\t\t$publish        = isset( $args[4] ) ? $args[4] : 0;\n\n\t\tif ( ! $user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'metaWeblog.editPost' );\n\n\t\t$postdata = get_post( $post_ID, ARRAY_A );\n\n\t\t/*\n\t\t * If there is no post data for the give post id, stop now and return an error.\n\t\t * Otherwise a new post will be created (which was the old behavior).\n\t\t */\n\t\tif ( ! $postdata || empty( $postdata[ 'ID' ] ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( ! current_user_can( 'edit_post', $post_ID ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to edit this post.' ) );\n\n\t\t// Use wp.editPost to edit post types other than post and page.\n\t\tif ( ! in_array( $postdata[ 'post_type' ], array( 'post', 'page' ) ) )\n\t\t\treturn new IXR_Error( 401, __( 'Invalid post type' ) );\n\n\t\t// Thwart attempt to change the post type.\n\t\tif ( ! empty( $content_struct[ 'post_type' ] ) && ( $content_struct['post_type'] != $postdata[ 'post_type' ] ) )\n\t\t\treturn new IXR_Error( 401, __( 'The post type may not be changed.' ) );\n\n\t\t// Check for a valid post format if one was given\n\t\tif ( isset( $content_struct['wp_post_format'] ) ) {\n\t\t\t$content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] );\n\t\t\tif ( !array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) {\n\t\t\t\treturn new IXR_Error( 404, __( 'Invalid post format' ) );\n\t\t\t}\n\t\t}\n\n\t\t$this->escape($postdata);\n\n\t\t$ID = $postdata['ID'];\n\t\t$post_content = $postdata['post_content'];\n\t\t$post_title = $postdata['post_title'];\n\t\t$post_excerpt = $postdata['post_excerpt'];\n\t\t$post_password = $postdata['post_password'];\n\t\t$post_parent = $postdata['post_parent'];\n\t\t$post_type = $postdata['post_type'];\n\t\t$menu_order = $postdata['menu_order'];\n\n\t\t// Let WordPress manage slug if none was provided.\n\t\t$post_name = $postdata['post_name'];\n\t\tif ( isset($content_struct['wp_slug']) )\n\t\t\t$post_name = $content_struct['wp_slug'];\n\n\t\t// Only use a password if one was given.\n\t\tif ( isset($content_struct['wp_password']) )\n\t\t\t$post_password = $content_struct['wp_password'];\n\n\t\t// Only set a post parent if one was given.\n\t\tif ( isset($content_struct['wp_page_parent_id']) )\n\t\t\t$post_parent = $content_struct['wp_page_parent_id'];\n\n\t\t// Only set the menu_order if it was given.\n\t\tif ( isset($content_struct['wp_page_order']) )\n\t\t\t$menu_order = $content_struct['wp_page_order'];\n\n\t\t$page_template = null;\n\t\tif ( ! empty( $content_struct['wp_page_template'] ) && 'page' == $post_type )\n\t\t\t$page_template = $content_struct['wp_page_template'];\n\n\t\t$post_author = $postdata['post_author'];\n\n\t\t// Only set the post_author if one is set.\n\t\tif ( isset( $content_struct['wp_author_id'] ) ) {\n\t\t\t// Check permissions if attempting to switch author to or from another user.\n\t\t\tif ( $user->ID != $content_struct['wp_author_id'] || $user->ID != $post_author ) {\n\t\t\t\tswitch ( $post_type ) {\n\t\t\t\t\tcase 'post':\n\t\t\t\t\t\tif ( ! current_user_can( 'edit_others_posts' ) ) {\n\t\t\t\t\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to change the post author as this user.' ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'page':\n\t\t\t\t\t\tif ( ! current_user_can( 'edit_others_pages' ) ) {\n\t\t\t\t\t\t\treturn new IXR_Error( 401, __( 'You are not allowed to change the page author as this user.' ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn new IXR_Error( 401, __( 'Invalid post type' ) );\n\t\t\t\t}\n\t\t\t\t$post_author = $content_struct['wp_author_id'];\n\t\t\t}\n\t\t}\n\n\t\tif ( isset($content_struct['mt_allow_comments']) ) {\n\t\t\tif ( !is_numeric($content_struct['mt_allow_comments']) ) {\n\t\t\t\tswitch ( $content_struct['mt_allow_comments'] ) {\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\t$comment_status = 'closed';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'open':\n\t\t\t\t\t\t$comment_status = 'open';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$comment_status = get_default_comment_status( $post_type );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( (int) $content_struct['mt_allow_comments'] ) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t$comment_status = 'closed';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t$comment_status = 'open';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$comment_status = get_default_comment_status( $post_type );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( isset($content_struct['mt_allow_pings']) ) {\n\t\t\tif ( !is_numeric($content_struct['mt_allow_pings']) ) {\n\t\t\t\tswitch ( $content_struct['mt_allow_pings'] ) {\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\t$ping_status = 'closed';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'open':\n\t\t\t\t\t\t$ping_status = 'open';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$ping_status = get_default_comment_status( $post_type, 'pingback' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( (int) $content_struct[\"mt_allow_pings\"] ) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t$ping_status = 'closed';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t$ping_status = 'open';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$ping_status = get_default_comment_status( $post_type, 'pingback' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( isset( $content_struct['title'] ) )\n\t\t\t$post_title =  $content_struct['title'];\n\n\t\tif ( isset( $content_struct['description'] ) )\n\t\t\t$post_content = $content_struct['description'];\n\n\t\t$post_category = array();\n\t\tif ( isset( $content_struct['categories'] ) ) {\n\t\t\t$catnames = $content_struct['categories'];\n\t\t\tif ( is_array($catnames) ) {\n\t\t\t\tforeach ($catnames as $cat) {\n\t\t\t\t\t$post_category[] = get_cat_ID($cat);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( isset( $content_struct['mt_excerpt'] ) )\n\t\t\t$post_excerpt =  $content_struct['mt_excerpt'];\n\n\t\t$post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : null;\n\n\t\t$post_status = $publish ? 'publish' : 'draft';\n\t\tif ( isset( $content_struct[\"{$post_type}_status\"] ) ) {\n\t\t\tswitch( $content_struct[\"{$post_type}_status\"] ) {\n\t\t\t\tcase 'draft':\n\t\t\t\tcase 'pending':\n\t\t\t\tcase 'private':\n\t\t\t\tcase 'publish':\n\t\t\t\t\t$post_status = $content_struct[\"{$post_type}_status\"];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$post_status = $publish ? 'publish' : 'draft';\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null;\n\n\t\tif ( 'publish' == $post_status || 'private' == $post_status ) {\n\t\t\tif ( 'page' == $post_type && ! current_user_can( 'publish_pages' ) ) {\n\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this page.' ) );\n\t\t\t} elseif ( ! current_user_can( 'publish_posts' ) ) {\n\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this post.' ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( $post_more )\n\t\t\t$post_content = $post_content . \"<!--more-->\" . $post_more;\n\n\t\t$to_ping = null;\n\t\tif ( isset( $content_struct['mt_tb_ping_urls'] ) ) {\n\t\t\t$to_ping = $content_struct['mt_tb_ping_urls'];\n\t\t\tif ( is_array($to_ping) )\n\t\t\t\t$to_ping = implode(' ', $to_ping);\n\t\t}\n\n\t\t// Do some timestamp voodoo.\n\t\tif ( !empty( $content_struct['date_created_gmt'] ) )\n\t\t\t// We know this is supposed to be GMT, so we're going to slap that Z on there by force.\n\t\t\t$dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z';\n\t\telseif ( !empty( $content_struct['dateCreated']) )\n\t\t\t$dateCreated = $content_struct['dateCreated']->getIso();\n\n\t\tif ( !empty( $dateCreated ) ) {\n\t\t\t$post_date = get_date_from_gmt(iso8601_to_datetime($dateCreated));\n\t\t\t$post_date_gmt = iso8601_to_datetime($dateCreated, 'GMT');\n\t\t} else {\n\t\t\t$post_date     = $postdata['post_date'];\n\t\t\t$post_date_gmt = $postdata['post_date_gmt'];\n\t\t}\n\n\t\t// We've got all the data -- post it.\n\t\t$newpost = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template');\n\n\t\t$result = wp_update_post($newpost, true);\n\t\tif ( is_wp_error( $result ) )\n\t\t\treturn new IXR_Error(500, $result->get_error_message());\n\n\t\tif ( !$result )\n\t\t\treturn new IXR_Error(500, __('Sorry, your entry could not be edited. Something wrong happened.'));\n\n\t\t// Only posts can be sticky\n\t\tif ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) {\n\t\t\t$data = $newpost;\n\t\t\t$data['sticky'] = $content_struct['sticky'];\n\t\t\t$data['post_type'] = 'post';\n\t\t\t$error = $this->_toggle_sticky( $data, true );\n\t\t\tif ( $error ) {\n\t\t\t\treturn $error;\n\t\t\t}\n\t\t}\n\n\t\tif ( isset($content_struct['custom_fields']) )\n\t\t\t$this->set_custom_fields($post_ID, $content_struct['custom_fields']);\n\n\t\tif ( isset ( $content_struct['wp_post_thumbnail'] ) ) {\n\n\t\t\t// Empty value deletes, non-empty value adds/updates.\n\t\t\tif ( empty( $content_struct['wp_post_thumbnail'] ) ) {\n\t\t\t\tdelete_post_thumbnail( $post_ID );\n\t\t\t} else {\n\t\t\t\tif ( set_post_thumbnail( $post_ID, $content_struct['wp_post_thumbnail'] ) === false )\n\t\t\t\t\treturn new IXR_Error( 404, __( 'Invalid attachment ID.' ) );\n\t\t\t}\n\t\t\tunset( $content_struct['wp_post_thumbnail'] );\n\t\t}\n\n\t\t// Handle enclosures.\n\t\t$thisEnclosure = isset($content_struct['enclosure']) ? $content_struct['enclosure'] : null;\n\t\t$this->add_enclosure_if_new($post_ID, $thisEnclosure);\n\n\t\t$this->attach_uploads( $ID, $post_content );\n\n\t\t// Handle post formats if assigned, validation is handled earlier in this function.\n\t\tif ( isset( $content_struct['wp_post_format'] ) )\n\t\t\tset_post_format( $post_ID, $content_struct['wp_post_format'] );\n\n\t\t/**\n\t\t * Fires after a post has been successfully updated via the XML-RPC MovableType API.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $post_ID ID of the updated post.\n\t\t * @param array $args    An array of arguments to update the post.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_mw_editPost', $post_ID, $args );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Retrieve post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type int    $post_ID\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function mw_getPost( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$post_ID  = (int) $args[0];\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t$postdata = get_post($post_ID, ARRAY_A);\n\t\tif ( ! $postdata )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( !current_user_can( 'edit_post', $post_ID ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'metaWeblog.getPost' );\n\n\t\tif ($postdata['post_date'] != '') {\n\t\t\t$post_date = $this->_convert_date( $postdata['post_date'] );\n\t\t\t$post_date_gmt = $this->_convert_date_gmt( $postdata['post_date_gmt'],  $postdata['post_date'] );\n\t\t\t$post_modified = $this->_convert_date( $postdata['post_modified'] );\n\t\t\t$post_modified_gmt = $this->_convert_date_gmt( $postdata['post_modified_gmt'], $postdata['post_modified'] );\n\n\t\t\t$categories = array();\n\t\t\t$catids = wp_get_post_categories($post_ID);\n\t\t\tforeach ($catids as $catid)\n\t\t\t\t$categories[] = get_cat_name($catid);\n\n\t\t\t$tagnames = array();\n\t\t\t$tags = wp_get_post_tags( $post_ID );\n\t\t\tif ( !empty( $tags ) ) {\n\t\t\t\tforeach ( $tags as $tag )\n\t\t\t\t\t$tagnames[] = $tag->name;\n\t\t\t\t$tagnames = implode( ', ', $tagnames );\n\t\t\t} else {\n\t\t\t\t$tagnames = '';\n\t\t\t}\n\n\t\t\t$post = get_extended($postdata['post_content']);\n\t\t\t$link = get_permalink($postdata['ID']);\n\n\t\t\t// Get the author info.\n\t\t\t$author = get_userdata($postdata['post_author']);\n\n\t\t\t$allow_comments = ('open' == $postdata['comment_status']) ? 1 : 0;\n\t\t\t$allow_pings = ('open' == $postdata['ping_status']) ? 1 : 0;\n\n\t\t\t// Consider future posts as published\n\t\t\tif ( $postdata['post_status'] === 'future' )\n\t\t\t\t$postdata['post_status'] = 'publish';\n\n\t\t\t// Get post format\n\t\t\t$post_format = get_post_format( $post_ID );\n\t\t\tif ( empty( $post_format ) )\n\t\t\t\t$post_format = 'standard';\n\n\t\t\t$sticky = false;\n\t\t\tif ( is_sticky( $post_ID ) )\n\t\t\t\t$sticky = true;\n\n\t\t\t$enclosure = array();\n\t\t\tforeach ( (array) get_post_custom($post_ID) as $key => $val) {\n\t\t\t\tif ($key == 'enclosure') {\n\t\t\t\t\tforeach ( (array) $val as $enc ) {\n\t\t\t\t\t\t$encdata = explode(\"\\n\", $enc);\n\t\t\t\t\t\t$enclosure['url'] = trim(htmlspecialchars($encdata[0]));\n\t\t\t\t\t\t$enclosure['length'] = (int) trim($encdata[1]);\n\t\t\t\t\t\t$enclosure['type'] = trim($encdata[2]);\n\t\t\t\t\t\tbreak 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$resp = array(\n\t\t\t\t'dateCreated' => $post_date,\n\t\t\t\t'userid' => $postdata['post_author'],\n\t\t\t\t'postid' => $postdata['ID'],\n\t\t\t\t'description' => $post['main'],\n\t\t\t\t'title' => $postdata['post_title'],\n\t\t\t\t'link' => $link,\n\t\t\t\t'permaLink' => $link,\n\t\t\t\t// commented out because no other tool seems to use this\n\t\t\t\t//\t      'content' => $entry['post_content'],\n\t\t\t\t'categories' => $categories,\n\t\t\t\t'mt_excerpt' => $postdata['post_excerpt'],\n\t\t\t\t'mt_text_more' => $post['extended'],\n\t\t\t\t'wp_more_text' => $post['more_text'],\n\t\t\t\t'mt_allow_comments' => $allow_comments,\n\t\t\t\t'mt_allow_pings' => $allow_pings,\n\t\t\t\t'mt_keywords' => $tagnames,\n\t\t\t\t'wp_slug' => $postdata['post_name'],\n\t\t\t\t'wp_password' => $postdata['post_password'],\n\t\t\t\t'wp_author_id' => (string) $author->ID,\n\t\t\t\t'wp_author_display_name' => $author->display_name,\n\t\t\t\t'date_created_gmt' => $post_date_gmt,\n\t\t\t\t'post_status' => $postdata['post_status'],\n\t\t\t\t'custom_fields' => $this->get_custom_fields($post_ID),\n\t\t\t\t'wp_post_format' => $post_format,\n\t\t\t\t'sticky' => $sticky,\n\t\t\t\t'date_modified' => $post_modified,\n\t\t\t\t'date_modified_gmt' => $post_modified_gmt\n\t\t\t);\n\n\t\t\tif ( !empty($enclosure) ) $resp['enclosure'] = $enclosure;\n\n\t\t\t$resp['wp_post_thumbnail'] = get_post_thumbnail_id( $postdata['ID'] );\n\n\t\t\treturn $resp;\n\t\t} else {\n\t\t\treturn new IXR_Error(404, __('Sorry, no such post.'));\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve list of recent posts.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $numberposts\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function mw_getRecentPosts( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\tif ( isset( $args[3] ) )\n\t\t\t$query = array( 'numberposts' => absint( $args[3] ) );\n\t\telse\n\t\t\t$query = array();\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( ! current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit posts on this site.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'metaWeblog.getRecentPosts' );\n\n\t\t$posts_list = wp_get_recent_posts( $query );\n\n\t\tif ( !$posts_list )\n\t\t\treturn array();\n\n\t\t$recent_posts = array();\n\t\tforeach ($posts_list as $entry) {\n\t\t\tif ( !current_user_can( 'edit_post', $entry['ID'] ) )\n\t\t\t\tcontinue;\n\n\t\t\t$post_date = $this->_convert_date( $entry['post_date'] );\n\t\t\t$post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] );\n\t\t\t$post_modified = $this->_convert_date( $entry['post_modified'] );\n\t\t\t$post_modified_gmt = $this->_convert_date_gmt( $entry['post_modified_gmt'], $entry['post_modified'] );\n\n\t\t\t$categories = array();\n\t\t\t$catids = wp_get_post_categories($entry['ID']);\n\t\t\tforeach ( $catids as $catid )\n\t\t\t\t$categories[] = get_cat_name($catid);\n\n\t\t\t$tagnames = array();\n\t\t\t$tags = wp_get_post_tags( $entry['ID'] );\n\t\t\tif ( !empty( $tags ) ) {\n\t\t\t\tforeach ( $tags as $tag ) {\n\t\t\t\t\t$tagnames[] = $tag->name;\n\t\t\t\t}\n\t\t\t\t$tagnames = implode( ', ', $tagnames );\n\t\t\t} else {\n\t\t\t\t$tagnames = '';\n\t\t\t}\n\n\t\t\t$post = get_extended($entry['post_content']);\n\t\t\t$link = get_permalink($entry['ID']);\n\n\t\t\t// Get the post author info.\n\t\t\t$author = get_userdata($entry['post_author']);\n\n\t\t\t$allow_comments = ('open' == $entry['comment_status']) ? 1 : 0;\n\t\t\t$allow_pings = ('open' == $entry['ping_status']) ? 1 : 0;\n\n\t\t\t// Consider future posts as published\n\t\t\tif ( $entry['post_status'] === 'future' )\n\t\t\t\t$entry['post_status'] = 'publish';\n\n\t\t\t// Get post format\n\t\t\t$post_format = get_post_format( $entry['ID'] );\n\t\t\tif ( empty( $post_format ) )\n\t\t\t\t$post_format = 'standard';\n\n\t\t\t$recent_posts[] = array(\n\t\t\t\t'dateCreated' => $post_date,\n\t\t\t\t'userid' => $entry['post_author'],\n\t\t\t\t'postid' => (string) $entry['ID'],\n\t\t\t\t'description' => $post['main'],\n\t\t\t\t'title' => $entry['post_title'],\n\t\t\t\t'link' => $link,\n\t\t\t\t'permaLink' => $link,\n\t\t\t\t// commented out because no other tool seems to use this\n\t\t\t\t// 'content' => $entry['post_content'],\n\t\t\t\t'categories' => $categories,\n\t\t\t\t'mt_excerpt' => $entry['post_excerpt'],\n\t\t\t\t'mt_text_more' => $post['extended'],\n\t\t\t\t'wp_more_text' => $post['more_text'],\n\t\t\t\t'mt_allow_comments' => $allow_comments,\n\t\t\t\t'mt_allow_pings' => $allow_pings,\n\t\t\t\t'mt_keywords' => $tagnames,\n\t\t\t\t'wp_slug' => $entry['post_name'],\n\t\t\t\t'wp_password' => $entry['post_password'],\n\t\t\t\t'wp_author_id' => (string) $author->ID,\n\t\t\t\t'wp_author_display_name' => $author->display_name,\n\t\t\t\t'date_created_gmt' => $post_date_gmt,\n\t\t\t\t'post_status' => $entry['post_status'],\n\t\t\t\t'custom_fields' => $this->get_custom_fields($entry['ID']),\n\t\t\t\t'wp_post_format' => $post_format,\n\t\t\t\t'date_modified' => $post_modified,\n\t\t\t\t'date_modified_gmt' => $post_modified_gmt,\n\t\t\t\t'sticky' => ( $entry['post_type'] === 'post' && is_sticky( $entry['ID'] ) ),\n\t\t\t\t'wp_post_thumbnail' => get_post_thumbnail_id( $entry['ID'] )\n\t\t\t);\n\t\t}\n\n\t\treturn $recent_posts;\n\t}\n\n\t/**\n\t * Retrieve the list of categories on a given blog.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function mw_getCategories( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'metaWeblog.getCategories' );\n\n\t\t$categories_struct = array();\n\n\t\tif ( $cats = get_categories(array('get' => 'all')) ) {\n\t\t\tforeach ( $cats as $cat ) {\n\t\t\t\t$struct = array();\n\t\t\t\t$struct['categoryId'] = $cat->term_id;\n\t\t\t\t$struct['parentId'] = $cat->parent;\n\t\t\t\t$struct['description'] = $cat->name;\n\t\t\t\t$struct['categoryDescription'] = $cat->description;\n\t\t\t\t$struct['categoryName'] = $cat->name;\n\t\t\t\t$struct['htmlUrl'] = esc_html(get_category_link($cat->term_id));\n\t\t\t\t$struct['rssUrl'] = esc_html(get_category_feed_link($cat->term_id, 'rss2'));\n\n\t\t\t\t$categories_struct[] = $struct;\n\t\t\t}\n\t\t}\n\n\t\treturn $categories_struct;\n\t}\n\n\t/**\n\t * Uploads a file, following your settings.\n\t *\n\t * Adapted from a patch by Johann Richard.\n\t *\n\t * @link http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/\n\t *\n\t * @since 1.5.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $data\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function mw_newMediaObject( $args ) {\n\t\tglobal $wpdb;\n\n\t\t$username = $this->escape( $args[1] );\n\t\t$password = $this->escape( $args[2] );\n\t\t$data     = $args[3];\n\n\t\t$name = sanitize_file_name( $data['name'] );\n\t\t$type = $data['type'];\n\t\t$bits = $data['bits'];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'metaWeblog.newMediaObject' );\n\n\t\tif ( !current_user_can('upload_files') ) {\n\t\t\t$this->error = new IXR_Error( 401, __( 'You do not have permission to upload files.' ) );\n\t\t\treturn $this->error;\n\t\t}\n\n\t\tif ( is_multisite() && upload_is_user_over_quota( false ) ) {\n\t\t\t$this->error = new IXR_Error( 401, __( 'Sorry, you have used your space allocation.' ) );\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t/**\n\t\t * Filter whether to preempt the XML-RPC media upload.\n\t\t *\n\t\t * Passing a truthy value will effectively short-circuit the media upload,\n\t\t * returning that value as a 500 error instead.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param bool $error Whether to pre-empt the media upload. Default false.\n\t\t */\n\t\tif ( $upload_err = apply_filters( 'pre_upload_error', false ) ) {\n\t\t\treturn new IXR_Error( 500, $upload_err );\n\t\t}\n\n\t\t$upload = wp_upload_bits($name, null, $bits);\n\t\tif ( ! empty($upload['error']) ) {\n\t\t\t$errorString = sprintf(__('Could not write file %1$s (%2$s)'), $name, $upload['error']);\n\t\t\treturn new IXR_Error(500, $errorString);\n\t\t}\n\t\t// Construct the attachment array\n\t\t$post_id = 0;\n\t\tif ( ! empty( $data['post_id'] ) ) {\n\t\t\t$post_id = (int) $data['post_id'];\n\n\t\t\tif ( ! current_user_can( 'edit_post', $post_id ) )\n\t\t\t\treturn new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );\n\t\t}\n\t\t$attachment = array(\n\t\t\t'post_title' => $name,\n\t\t\t'post_content' => '',\n\t\t\t'post_type' => 'attachment',\n\t\t\t'post_parent' => $post_id,\n\t\t\t'post_mime_type' => $type,\n\t\t\t'guid' => $upload[ 'url' ]\n\t\t);\n\n\t\t// Save the data\n\t\t$id = wp_insert_attachment( $attachment, $upload[ 'file' ], $post_id );\n\t\twp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) );\n\n\t\t/**\n\t\t * Fires after a new attachment has been added via the XML-RPC MovableType API.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param int   $id   ID of the new attachment.\n\t\t * @param array $args An array of arguments to add the attachment.\n\t\t */\n\t\tdo_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args );\n\n\t\t$struct = $this->_prepare_media_item( get_post( $id ) );\n\n\t\t// Deprecated values\n\t\t$struct['id']   = $struct['attachment_id'];\n\t\t$struct['file'] = $struct['title'];\n\t\t$struct['url']  = $struct['link'];\n\n\t\treturn $struct;\n\t}\n\n\t/* MovableType API functions\n\t * specs on http://www.movabletype.org/docs/mtmanual_programmatic.html\n\t */\n\n\t/**\n\t * Retrieve the post titles of recent posts.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type int    $numberposts\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function mt_getRecentPostTitles( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\t\tif ( isset( $args[3] ) )\n\t\t\t$query = array( 'numberposts' => absint( $args[3] ) );\n\t\telse\n\t\t\t$query = array();\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'mt.getRecentPostTitles' );\n\n\t\t$posts_list = wp_get_recent_posts( $query );\n\n\t\tif ( !$posts_list ) {\n\t\t\t$this->error = new IXR_Error(500, __('Either there are no posts, or something went wrong.'));\n\t\t\treturn $this->error;\n\t\t}\n\n\t\t$recent_posts = array();\n\n\t\tforeach ($posts_list as $entry) {\n\t\t\tif ( !current_user_can( 'edit_post', $entry['ID'] ) )\n\t\t\t\tcontinue;\n\n\t\t\t$post_date = $this->_convert_date( $entry['post_date'] );\n\t\t\t$post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] );\n\n\t\t\t$recent_posts[] = array(\n\t\t\t\t'dateCreated' => $post_date,\n\t\t\t\t'userid' => $entry['post_author'],\n\t\t\t\t'postid' => (string) $entry['ID'],\n\t\t\t\t'title' => $entry['post_title'],\n\t\t\t\t'post_status' => $entry['post_status'],\n\t\t\t\t'date_created_gmt' => $post_date_gmt\n\t\t\t);\n\t\t}\n\n\t\treturn $recent_posts;\n\t}\n\n\t/**\n\t * Retrieve list of all categories on blog.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $blog_id (unused)\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function mt_getCategoryList( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( !current_user_can( 'edit_posts' ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'mt.getCategoryList' );\n\n\t\t$categories_struct = array();\n\n\t\tif ( $cats = get_categories(array('hide_empty' => 0, 'hierarchical' => 0)) ) {\n\t\t\tforeach ( $cats as $cat ) {\n\t\t\t\t$struct = array();\n\t\t\t\t$struct['categoryId'] = $cat->term_id;\n\t\t\t\t$struct['categoryName'] = $cat->name;\n\n\t\t\t\t$categories_struct[] = $struct;\n\t\t\t}\n\t\t}\n\n\t\treturn $categories_struct;\n\t}\n\n\t/**\n\t * Retrieve post categories.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $post_ID\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return array|IXR_Error\n\t */\n\tpublic function mt_getPostCategories( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$post_ID  = (int) $args[0];\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\tif ( ! get_post( $post_ID ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( !current_user_can( 'edit_post', $post_ID ) )\n\t\t\treturn new IXR_Error( 401, __( 'Sorry, you can not edit this post.' ) );\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'mt.getPostCategories' );\n\n\t\t$categories = array();\n\t\t$catids = wp_get_post_categories(intval($post_ID));\n\t\t// first listed category will be the primary category\n\t\t$isPrimary = true;\n\t\tforeach ( $catids as $catid ) {\n\t\t\t$categories[] = array(\n\t\t\t\t'categoryName' => get_cat_name($catid),\n\t\t\t\t'categoryId' => (string) $catid,\n\t\t\t\t'isPrimary' => $isPrimary\n\t\t\t);\n\t\t\t$isPrimary = false;\n\t\t}\n\n\t\treturn $categories;\n\t}\n\n\t/**\n\t * Sets categories for a post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $post_ID\n\t *     @type string $username\n\t *     @type string $password\n\t *     @type array  $categories\n\t * }\n\t * @return true|IXR_Error True on success.\n\t */\n\tpublic function mt_setPostCategories( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$post_ID    = (int) $args[0];\n\t\t$username   = $args[1];\n\t\t$password   = $args[2];\n\t\t$categories = $args[3];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'mt.setPostCategories' );\n\n\t\tif ( ! get_post( $post_ID ) )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( !current_user_can('edit_post', $post_ID) )\n\t\t\treturn new IXR_Error(401, __('Sorry, you cannot edit this post.'));\n\n\t\t$catids = array();\n\t\tforeach ( $categories as $cat ) {\n\t\t\t$catids[] = $cat['categoryId'];\n\t\t}\n\n\t\twp_set_post_categories($post_ID, $catids);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Retrieve an array of methods supported by this server.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @return array\n\t */\n\tpublic function mt_supportedMethods() {\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'mt.supportedMethods' );\n\n\t\treturn array_keys( $this->methods );\n\t}\n\n\t/**\n\t * Retrieve an empty array because we don't support per-post text filters.\n\t *\n\t * @since 1.5.0\n\t */\n\tpublic function mt_supportedTextFilters() {\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'mt.supportedTextFilters' );\n\n\t\t/**\n\t\t * Filter the MoveableType text filters list for XML-RPC.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @param array $filters An array of text filters.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_text_filters', array() );\n\t}\n\n\t/**\n\t * Retrieve trackbacks sent to a given post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param int $post_ID\n\t * @return array|IXR_Error\n\t */\n\tpublic function mt_getTrackbackPings( $post_ID ) {\n\t\tglobal $wpdb;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'mt.getTrackbackPings' );\n\n\t\t$actual_post = get_post($post_ID, ARRAY_A);\n\n\t\tif ( !$actual_post )\n\t\t\treturn new IXR_Error(404, __('Sorry, no such post.'));\n\n\t\t$comments = $wpdb->get_results( $wpdb->prepare(\"SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d\", $post_ID) );\n\n\t\tif ( !$comments )\n\t\t\treturn array();\n\n\t\t$trackback_pings = array();\n\t\tforeach ( $comments as $comment ) {\n\t\t\tif ( 'trackback' == $comment->comment_type ) {\n\t\t\t\t$content = $comment->comment_content;\n\t\t\t\t$title = substr($content, 8, (strpos($content, '</strong>') - 8));\n\t\t\t\t$trackback_pings[] = array(\n\t\t\t\t\t'pingTitle' => $title,\n\t\t\t\t\t'pingURL'   => $comment->comment_author_url,\n\t\t\t\t\t'pingIP'    => $comment->comment_author_IP\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn $trackback_pings;\n\t}\n\n\t/**\n\t * Sets a post's publish status to 'publish'.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type int    $post_ID\n\t *     @type string $username\n\t *     @type string $password\n\t * }\n\t * @return int|IXR_Error\n\t */\n\tpublic function mt_publishPost( $args ) {\n\t\t$this->escape( $args );\n\n\t\t$post_ID  = (int) $args[0];\n\t\t$username = $args[1];\n\t\t$password = $args[2];\n\n\t\tif ( !$user = $this->login($username, $password) )\n\t\t\treturn $this->error;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'mt.publishPost' );\n\n\t\t$postdata = get_post($post_ID, ARRAY_A);\n\t\tif ( ! $postdata )\n\t\t\treturn new IXR_Error( 404, __( 'Invalid post ID.' ) );\n\n\t\tif ( !current_user_can('publish_posts') || !current_user_can('edit_post', $post_ID) )\n\t\t\treturn new IXR_Error(401, __('Sorry, you cannot publish this post.'));\n\n\t\t$postdata['post_status'] = 'publish';\n\n\t\t// retain old cats\n\t\t$cats = wp_get_post_categories($post_ID);\n\t\t$postdata['post_category'] = $cats;\n\t\t$this->escape($postdata);\n\n\t\treturn wp_update_post( $postdata );\n\t}\n\n\t/* PingBack functions\n\t * specs on www.hixie.ch/specs/pingback/pingback\n\t */\n\n\t/**\n\t * Retrieves a pingback and registers it.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t * @global string $wp_version\n\t *\n\t * @param array  $args {\n\t *     Method arguments. Note: arguments must be ordered as documented.\n\t *\n\t *     @type string $pagelinkedfrom\n\t *     @type string $pagelinkedto\n\t * }\n\t * @return string|IXR_Error\n\t */\n\tpublic function pingback_ping( $args ) {\n\t\tglobal $wpdb, $wp_version;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'pingback.ping' );\n\n\t\t$this->escape( $args );\n\n\t\t$pagelinkedfrom = str_replace( '&amp;', '&', $args[0] );\n\t\t$pagelinkedto = str_replace( '&amp;', '&', $args[1] );\n\t\t$pagelinkedto = str_replace( '&', '&amp;', $pagelinkedto );\n\n\t\t/**\n\t\t * Filter the pingback source URI.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param string $pagelinkedfrom URI of the page linked from.\n\t\t * @param string $pagelinkedto   URI of the page linked to.\n\t\t */\n\t\t$pagelinkedfrom = apply_filters( 'pingback_ping_source_uri', $pagelinkedfrom, $pagelinkedto );\n\n\t\tif ( ! $pagelinkedfrom )\n\t\t\treturn $this->pingback_error( 0, __( 'A valid URL was not provided.' ) );\n\n\t\t// Check if the page linked to is in our site\n\t\t$pos1 = strpos($pagelinkedto, str_replace(array('http://www.','http://','https://www.','https://'), '', get_option('home')));\n\t\tif ( !$pos1 )\n\t\t\treturn $this->pingback_error( 0, __( 'Is there no link to us?' ) );\n\n\t\t// let's find which post is linked to\n\t\t// FIXME: does url_to_postid() cover all these cases already?\n\t\t//        if so, then let's use it and drop the old code.\n\t\t$urltest = parse_url($pagelinkedto);\n\t\tif ( $post_ID = url_to_postid($pagelinkedto) ) {\n\t\t\t// $way\n\t\t} elseif ( isset( $urltest['path'] ) && preg_match('#p/[0-9]{1,}#', $urltest['path'], $match) ) {\n\t\t\t// the path defines the post_ID (archives/p/XXXX)\n\t\t\t$blah = explode('/', $match[0]);\n\t\t\t$post_ID = (int) $blah[1];\n\t\t} elseif ( isset( $urltest['query'] ) && preg_match('#p=[0-9]{1,}#', $urltest['query'], $match) ) {\n\t\t\t// the querystring defines the post_ID (?p=XXXX)\n\t\t\t$blah = explode('=', $match[0]);\n\t\t\t$post_ID = (int) $blah[1];\n\t\t} elseif ( isset($urltest['fragment']) ) {\n\t\t\t// an #anchor is there, it's either...\n\t\t\tif ( intval($urltest['fragment']) ) {\n\t\t\t\t// ...an integer #XXXX (simplest case)\n\t\t\t\t$post_ID = (int) $urltest['fragment'];\n\t\t\t} elseif ( preg_match('/post-[0-9]+/',$urltest['fragment']) ) {\n\t\t\t\t// ...a post id in the form 'post-###'\n\t\t\t\t$post_ID = preg_replace('/[^0-9]+/', '', $urltest['fragment']);\n\t\t\t} elseif ( is_string($urltest['fragment']) ) {\n\t\t\t\t// ...or a string #title, a little more complicated\n\t\t\t\t$title = preg_replace('/[^a-z0-9]/i', '.', $urltest['fragment']);\n\t\t\t\t$sql = $wpdb->prepare(\"SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s\", $title );\n\t\t\t\tif (! ($post_ID = $wpdb->get_var($sql)) ) {\n\t\t\t\t\t// returning unknown error '0' is better than die()ing\n\t\t\t  \t\treturn $this->pingback_error( 0, '' );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// TODO: Attempt to extract a post ID from the given URL\n\t  \t\treturn $this->pingback_error( 33, __('The specified target URL cannot be used as a target. It either doesn&#8217;t exist, or it is not a pingback-enabled resource.' ) );\n\t\t}\n\t\t$post_ID = (int) $post_ID;\n\n\t\t$post = get_post($post_ID);\n\n\t\tif ( !$post ) // Post_ID not found\n\t  \t\treturn $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn&#8217;t exist, or it is not a pingback-enabled resource.' ) );\n\n\t\tif ( $post_ID == url_to_postid($pagelinkedfrom) )\n\t\t\treturn $this->pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) );\n\n\t\t// Check if pings are on\n\t\tif ( !pings_open($post) )\n\t  \t\treturn $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn&#8217;t exist, or it is not a pingback-enabled resource.' ) );\n\n\t\t// Let's check that the remote site didn't already pingback this entry\n\t\tif ( $wpdb->get_results( $wpdb->prepare(\"SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s\", $post_ID, $pagelinkedfrom) ) )\n\t\t\treturn $this->pingback_error( 48, __( 'The pingback has already been registered.' ) );\n\n\t\t// very stupid, but gives time to the 'from' server to publish !\n\t\tsleep(1);\n\n\t\t$remote_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] );\n\n\t\t/** This filter is documented in wp-includes/class-http.php */\n\t\t$user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' ) );\n\n\t\t// Let's check the remote site\n\t\t$http_api_args = array(\n\t\t\t'timeout' => 10,\n\t\t\t'redirection' => 0,\n\t\t\t'limit_response_size' => 153600, // 150 KB\n\t\t\t'user-agent' => \"$user_agent; verifying pingback from $remote_ip\",\n\t\t\t'headers' => array(\n\t\t\t\t'X-Pingback-Forwarded-For' => $remote_ip,\n\t\t\t),\n\t\t);\n\t\t$request = wp_safe_remote_get( $pagelinkedfrom, $http_api_args );\n\t\t$linea = wp_remote_retrieve_body( $request );\n\n\t\tif ( !$linea )\n\t\t\treturn $this->pingback_error( 16, __( 'The source URL does not exist.' ) );\n\n\t\t/**\n\t\t * Filter the pingback remote source.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $linea        Response object for the page linked from.\n\t\t * @param string $pagelinkedto URL of the page linked to.\n\t\t */\n\t\t$linea = apply_filters( 'pre_remote_source', $linea, $pagelinkedto );\n\n\t\t// Work around bug in strip_tags():\n\t\t$linea = str_replace('<!DOC', '<DOC', $linea);\n\t\t$linea = preg_replace( '/[\\r\\n\\t ]+/', ' ', $linea ); // normalize spaces\n\t\t$linea = preg_replace( \"/<\\/*(h1|h2|h3|h4|h5|h6|p|th|td|li|dt|dd|pre|caption|input|textarea|button|body)[^>]*>/\", \"\\n\\n\", $linea );\n\n\t\tpreg_match('|<title>([^<]*?)</title>|is', $linea, $matchtitle);\n\t\t$title = $matchtitle[1];\n\t\tif ( empty( $title ) )\n\t\t\treturn $this->pingback_error( 32, __('We cannot find a title on that page.' ) );\n\n\t\t$linea = strip_tags( $linea, '<a>' ); // just keep the tag we need\n\n\t\t$p = explode( \"\\n\\n\", $linea );\n\n\t\t$preg_target = preg_quote($pagelinkedto, '|');\n\n\t\tforeach ( $p as $para ) {\n\t\t\tif ( strpos($para, $pagelinkedto) !== false ) { // it exists, but is it a link?\n\t\t\t\tpreg_match(\"|<a[^>]+?\".$preg_target.\"[^>]*>([^>]+?)</a>|\", $para, $context);\n\n\t\t\t\t// If the URL isn't in a link context, keep looking\n\t\t\t\tif ( empty($context) )\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// We're going to use this fake tag to mark the context in a bit\n\t\t\t\t// the marker is needed in case the link text appears more than once in the paragraph\n\t\t\t\t$excerpt = preg_replace('|\\</?wpcontext\\>|', '', $para);\n\n\t\t\t\t// prevent really long link text\n\t\t\t\tif ( strlen($context[1]) > 100 )\n\t\t\t\t\t$context[1] = substr($context[1], 0, 100) . '&#8230;';\n\n\t\t\t\t$marker = '<wpcontext>'.$context[1].'</wpcontext>';    // set up our marker\n\t\t\t\t$excerpt= str_replace($context[0], $marker, $excerpt); // swap out the link for our marker\n\t\t\t\t$excerpt = strip_tags($excerpt, '<wpcontext>');        // strip all tags but our context marker\n\t\t\t\t$excerpt = trim($excerpt);\n\t\t\t\t$preg_marker = preg_quote($marker, '|');\n\t\t\t\t$excerpt = preg_replace(\"|.*?\\s(.{0,100}$preg_marker.{0,100})\\s.*|s\", '$1', $excerpt);\n\t\t\t\t$excerpt = strip_tags($excerpt); // YES, again, to remove the marker wrapper\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( empty($context) ) // Link to target not found\n\t\t\treturn $this->pingback_error( 17, __( 'The source URL does not contain a link to the target URL, and so cannot be used as a source.' ) );\n\n\t\t$pagelinkedfrom = str_replace('&', '&amp;', $pagelinkedfrom);\n\n\t\t$context = '[&#8230;] ' . esc_html( $excerpt ) . ' [&#8230;]';\n\t\t$pagelinkedfrom = $this->escape( $pagelinkedfrom );\n\n\t\t$comment_post_ID = (int) $post_ID;\n\t\t$comment_author = $title;\n\t\t$comment_author_email = '';\n\t\t$this->escape($comment_author);\n\t\t$comment_author_url = $pagelinkedfrom;\n\t\t$comment_content = $context;\n\t\t$this->escape($comment_content);\n\t\t$comment_type = 'pingback';\n\n\t\t$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_content', 'comment_type');\n\n\t\t$comment_ID = wp_new_comment($commentdata);\n\n\t\t/**\n\t\t * Fires after a post pingback has been sent.\n\t\t *\n\t\t * @since 0.71\n\t\t *\n\t\t * @param int $comment_ID Comment ID.\n\t\t */\n\t\tdo_action( 'pingback_post', $comment_ID );\n\n\t\treturn sprintf(__('Pingback from %1$s to %2$s registered. Keep the web talking! :-)'), $pagelinkedfrom, $pagelinkedto);\n\t}\n\n\t/**\n\t * Retrieve array of URLs that pingbacked the given URL.\n\t *\n\t * Specs on http://www.aquarionics.com/misc/archives/blogite/0198.html\n\t *\n\t * @since 1.5.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $url\n\t * @return array|IXR_Error\n\t */\n\tpublic function pingback_extensions_getPingbacks( $url ) {\n\t\tglobal $wpdb;\n\n\t\t/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */\n\t\tdo_action( 'xmlrpc_call', 'pingback.extensions.getPingbacks' );\n\n\t\t$url = $this->escape( $url );\n\n\t\t$post_ID = url_to_postid($url);\n\t\tif ( !$post_ID ) {\n\t\t\t// We aren't sure that the resource is available and/or pingback enabled\n\t  \t\treturn $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn&#8217;t exist, or it is not a pingback-enabled resource.' ) );\n\t\t}\n\n\t\t$actual_post = get_post($post_ID, ARRAY_A);\n\n\t\tif ( !$actual_post ) {\n\t\t\t// No such post = resource not found\n\t  \t\treturn $this->pingback_error( 32, __('The specified target URL does not exist.' ) );\n\t\t}\n\n\t\t$comments = $wpdb->get_results( $wpdb->prepare(\"SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d\", $post_ID) );\n\n\t\tif ( !$comments )\n\t\t\treturn array();\n\n\t\t$pingbacks = array();\n\t\tforeach ( $comments as $comment ) {\n\t\t\tif ( 'pingback' == $comment->comment_type )\n\t\t\t\t$pingbacks[] = $comment->comment_author_url;\n\t\t}\n\n\t\treturn $pingbacks;\n\t}\n\n\t/**\n\t * @param integer $code\n\t * @param string $message\n\t * @return IXR_Error\n\t */\n\tprotected function pingback_error( $code, $message ) {\n\t\t/**\n\t\t * Filter the XML-RPC pingback error return.\n\t\t *\n\t\t * @since 3.5.1\n\t\t *\n\t\t * @param IXR_Error $error An IXR_Error object containing the error code and message.\n\t\t */\n\t\treturn apply_filters( 'xmlrpc_pingback_error', new IXR_Error( $code, $message ) );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class-wp.php",
    "content": "<?php\n/**\n * WordPress environment setup class.\n *\n * @package WordPress\n * @since 2.0.0\n */\nclass WP {\n\t/**\n\t * Public query variables.\n\t *\n\t * Long list of public query variables.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $public_query_vars = array('m', 'p', 'posts', 'w', 'cat', 'withcomments', 'withoutcomments', 's', 'search', 'exact', 'sentence', 'calendar', 'page', 'paged', 'more', 'tb', 'pb', 'author', 'order', 'orderby', 'year', 'monthnum', 'day', 'hour', 'minute', 'second', 'name', 'category_name', 'tag', 'feed', 'author_name', 'static', 'pagename', 'page_id', 'error', 'comments_popup', 'attachment', 'attachment_id', 'subpost', 'subpost_id', 'preview', 'robots', 'taxonomy', 'term', 'cpage', 'post_type', 'embed' );\n\n\t/**\n\t * Private query variables.\n\t *\n\t * Long list of private query variables.\n\t *\n\t * @since 2.0.0\n\t * @var array\n\t */\n\tpublic $private_query_vars = array( 'offset', 'posts_per_page', 'posts_per_archive_page', 'showposts', 'nopaging', 'post_type', 'post_status', 'category__in', 'category__not_in', 'category__and', 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'tag_id', 'post_mime_type', 'perm', 'comments_per_page', 'post__in', 'post__not_in', 'post_parent', 'post_parent__in', 'post_parent__not_in', 'title' );\n\n\t/**\n\t * Extra query variables set by the user.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $extra_query_vars = array();\n\n\t/**\n\t * Query variables for setting up the WordPress Query Loop.\n\t *\n\t * @since 2.0.0\n\t * @var array\n\t */\n\tpublic $query_vars;\n\n\t/**\n\t * String parsed to set the query variables.\n\t *\n\t * @since 2.0.0\n\t * @var string\n\t */\n\tpublic $query_string;\n\n\t/**\n\t * Permalink or requested URI.\n\t *\n\t * @since 2.0.0\n\t * @var string\n\t */\n\tpublic $request;\n\n\t/**\n\t * Rewrite rule the request matched.\n\t *\n\t * @since 2.0.0\n\t * @var string\n\t */\n\tpublic $matched_rule;\n\n\t/**\n\t * Rewrite query the request matched.\n\t *\n\t * @since 2.0.0\n\t * @var string\n\t */\n\tpublic $matched_query;\n\n\t/**\n\t * Whether already did the permalink.\n\t *\n\t * @since 2.0.0\n\t * @var bool\n\t */\n\tpublic $did_permalink = false;\n\n\t/**\n\t * Add name to list of public query variables.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $qv Query variable name.\n\t */\n\tpublic function add_query_var($qv) {\n\t\tif ( !in_array($qv, $this->public_query_vars) )\n\t\t\t$this->public_query_vars[] = $qv;\n\t}\n\n\t/**\n\t * Set the value of a query variable.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $key Query variable name.\n\t * @param mixed $value Query variable value.\n\t */\n\tpublic function set_query_var($key, $value) {\n\t\t$this->query_vars[$key] = $value;\n\t}\n\n\t/**\n\t * Parse request to find correct WordPress query.\n\t *\n\t * Sets up the query variables based on the request. There are also many\n\t * filters and actions that can be used to further manipulate the result.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @global WP_Rewrite $wp_rewrite\n\t *\n\t * @param array|string $extra_query_vars Set the extra query variables.\n\t */\n\tpublic function parse_request($extra_query_vars = '') {\n\t\tglobal $wp_rewrite;\n\n\t\t/**\n\t\t * Filter whether to parse the request.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param bool         $bool             Whether or not to parse the request. Default true.\n\t\t * @param WP           $this             Current WordPress environment instance.\n\t\t * @param array|string $extra_query_vars Extra passed query variables.\n\t\t */\n\t\tif ( ! apply_filters( 'do_parse_request', true, $this, $extra_query_vars ) )\n\t\t\treturn;\n\n\t\t$this->query_vars = array();\n\t\t$post_type_query_vars = array();\n\n\t\tif ( is_array( $extra_query_vars ) ) {\n\t\t\t$this->extra_query_vars = & $extra_query_vars;\n\t\t} elseif ( ! empty( $extra_query_vars ) ) {\n\t\t\tparse_str( $extra_query_vars, $this->extra_query_vars );\n\t\t}\n\t\t// Process PATH_INFO, REQUEST_URI, and 404 for permalinks.\n\n\t\t// Fetch the rewrite rules.\n\t\t$rewrite = $wp_rewrite->wp_rewrite_rules();\n\n\t\tif ( ! empty($rewrite) ) {\n\t\t\t// If we match a rewrite rule, this will be cleared.\n\t\t\t$error = '404';\n\t\t\t$this->did_permalink = true;\n\n\t\t\t$pathinfo = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : '';\n\t\t\tlist( $pathinfo ) = explode( '?', $pathinfo );\n\t\t\t$pathinfo = str_replace( \"%\", \"%25\", $pathinfo );\n\n\t\t\tlist( $req_uri ) = explode( '?', $_SERVER['REQUEST_URI'] );\n\t\t\t$self = $_SERVER['PHP_SELF'];\n\t\t\t$home_path = trim( parse_url( home_url(), PHP_URL_PATH ), '/' );\n\t\t\t$home_path_regex = sprintf( '|^%s|i', preg_quote( $home_path, '|' ) );\n\n\t\t\t// Trim path info from the end and the leading home path from the\n\t\t\t// front. For path info requests, this leaves us with the requesting\n\t\t\t// filename, if any. For 404 requests, this leaves us with the\n\t\t\t// requested permalink.\n\t\t\t$req_uri = str_replace($pathinfo, '', $req_uri);\n\t\t\t$req_uri = trim($req_uri, '/');\n\t\t\t$req_uri = preg_replace( $home_path_regex, '', $req_uri );\n\t\t\t$req_uri = trim($req_uri, '/');\n\t\t\t$pathinfo = trim($pathinfo, '/');\n\t\t\t$pathinfo = preg_replace( $home_path_regex, '', $pathinfo );\n\t\t\t$pathinfo = trim($pathinfo, '/');\n\t\t\t$self = trim($self, '/');\n\t\t\t$self = preg_replace( $home_path_regex, '', $self );\n\t\t\t$self = trim($self, '/');\n\n\t\t\t// The requested permalink is in $pathinfo for path info requests and\n\t\t\t//  $req_uri for other requests.\n\t\t\tif ( ! empty($pathinfo) && !preg_match('|^.*' . $wp_rewrite->index . '$|', $pathinfo) ) {\n\t\t\t\t$request = $pathinfo;\n\t\t\t} else {\n\t\t\t\t// If the request uri is the index, blank it out so that we don't try to match it against a rule.\n\t\t\t\tif ( $req_uri == $wp_rewrite->index )\n\t\t\t\t\t$req_uri = '';\n\t\t\t\t$request = $req_uri;\n\t\t\t}\n\n\t\t\t$this->request = $request;\n\n\t\t\t// Look for matches.\n\t\t\t$request_match = $request;\n\t\t\tif ( empty( $request_match ) ) {\n\t\t\t\t// An empty request could only match against ^$ regex\n\t\t\t\tif ( isset( $rewrite['$'] ) ) {\n\t\t\t\t\t$this->matched_rule = '$';\n\t\t\t\t\t$query = $rewrite['$'];\n\t\t\t\t\t$matches = array('');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tforeach ( (array) $rewrite as $match => $query ) {\n\t\t\t\t\t// If the requesting file is the anchor of the match, prepend it to the path info.\n\t\t\t\t\tif ( ! empty($req_uri) && strpos($match, $req_uri) === 0 && $req_uri != $request )\n\t\t\t\t\t\t$request_match = $req_uri . '/' . $request;\n\n\t\t\t\t\tif ( preg_match(\"#^$match#\", $request_match, $matches) ||\n\t\t\t\t\t\tpreg_match(\"#^$match#\", urldecode($request_match), $matches) ) {\n\n\t\t\t\t\t\tif ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\\$matches\\[([0-9]+)\\]/', $query, $varmatch ) ) {\n\t\t\t\t\t\t\t// This is a verbose page match, let's check to be sure about it.\n\t\t\t\t\t\t\t$page = get_page_by_path( $matches[ $varmatch[1] ] );\n\t\t\t\t\t\t\tif ( ! $page ) {\n\t\t\t\t\t\t \t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$post_status_obj = get_post_status_object( $page->post_status );\n\t\t\t\t\t\t\tif ( ! $post_status_obj->public && ! $post_status_obj->protected\n\t\t\t\t\t\t\t\t&& ! $post_status_obj->private && $post_status_obj->exclude_from_search ) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Got a match.\n\t\t\t\t\t\t$this->matched_rule = $match;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isset( $this->matched_rule ) ) {\n\t\t\t\t// Trim the query of everything up to the '?'.\n\t\t\t\t$query = preg_replace(\"!^.+\\?!\", '', $query);\n\n\t\t\t\t// Substitute the substring matches into the query.\n\t\t\t\t$query = addslashes(WP_MatchesMapRegex::apply($query, $matches));\n\n\t\t\t\t$this->matched_query = $query;\n\n\t\t\t\t// Parse the query.\n\t\t\t\tparse_str($query, $perma_query_vars);\n\n\t\t\t\t// If we're processing a 404 request, clear the error var since we found something.\n\t\t\t\tif ( '404' == $error )\n\t\t\t\t\tunset( $error, $_GET['error'] );\n\t\t\t}\n\n\t\t\t// If req_uri is empty or if it is a request for ourself, unset error.\n\t\t\tif ( empty($request) || $req_uri == $self || strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false ) {\n\t\t\t\tunset( $error, $_GET['error'] );\n\n\t\t\t\tif ( isset($perma_query_vars) && strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false )\n\t\t\t\t\tunset( $perma_query_vars );\n\n\t\t\t\t$this->did_permalink = false;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the query variables whitelist before processing.\n\t\t *\n\t\t * Allows (publicly allowed) query vars to be added, removed, or changed prior\n\t\t * to executing the query. Needed to allow custom rewrite rules using your own arguments\n\t\t * to work, or any other custom query variables you want to be publicly available.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param array $public_query_vars The array of whitelisted query variables.\n\t\t */\n\t\t$this->public_query_vars = apply_filters( 'query_vars', $this->public_query_vars );\n\n\t\tforeach ( get_post_types( array(), 'objects' ) as $post_type => $t ) {\n\t\t\tif ( is_post_type_viewable( $t ) && $t->query_var ) {\n\t\t\t\t$post_type_query_vars[$t->query_var] = $post_type;\n\t\t\t}\n\t\t}\n\n\t\tforeach ( $this->public_query_vars as $wpvar ) {\n\t\t\tif ( isset( $this->extra_query_vars[$wpvar] ) )\n\t\t\t\t$this->query_vars[$wpvar] = $this->extra_query_vars[$wpvar];\n\t\t\telseif ( isset( $_POST[$wpvar] ) )\n\t\t\t\t$this->query_vars[$wpvar] = $_POST[$wpvar];\n\t\t\telseif ( isset( $_GET[$wpvar] ) )\n\t\t\t\t$this->query_vars[$wpvar] = $_GET[$wpvar];\n\t\t\telseif ( isset( $perma_query_vars[$wpvar] ) )\n\t\t\t\t$this->query_vars[$wpvar] = $perma_query_vars[$wpvar];\n\n\t\t\tif ( !empty( $this->query_vars[$wpvar] ) ) {\n\t\t\t\tif ( ! is_array( $this->query_vars[$wpvar] ) ) {\n\t\t\t\t\t$this->query_vars[$wpvar] = (string) $this->query_vars[$wpvar];\n\t\t\t\t} else {\n\t\t\t\t\tforeach ( $this->query_vars[$wpvar] as $vkey => $v ) {\n\t\t\t\t\t\tif ( !is_object( $v ) ) {\n\t\t\t\t\t\t\t$this->query_vars[$wpvar][$vkey] = (string) $v;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( isset($post_type_query_vars[$wpvar] ) ) {\n\t\t\t\t\t$this->query_vars['post_type'] = $post_type_query_vars[$wpvar];\n\t\t\t\t\t$this->query_vars['name'] = $this->query_vars[$wpvar];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Convert urldecoded spaces back into +\n\t\tforeach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t )\n\t\t\tif ( $t->query_var && isset( $this->query_vars[$t->query_var] ) )\n\t\t\t\t$this->query_vars[$t->query_var] = str_replace( ' ', '+', $this->query_vars[$t->query_var] );\n\n\t\t// Don't allow non-public taxonomies to be queried from the front-end.\n\t\tif ( ! is_admin() ) {\n\t\t\tforeach ( get_taxonomies( array( 'public' => false ), 'objects' ) as $taxonomy => $t ) {\n\t\t\t\t/*\n\t\t\t\t * Disallow when set to the 'taxonomy' query var.\n\t\t\t\t * Non-public taxonomies cannot register custom query vars. See register_taxonomy().\n\t\t\t\t */\n\t\t\t\tif ( isset( $this->query_vars['taxonomy'] ) && $taxonomy === $this->query_vars['taxonomy'] ) {\n\t\t\t\t\tunset( $this->query_vars['taxonomy'], $this->query_vars['term'] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Limit publicly queried post_types to those that are publicly_queryable\n\t\tif ( isset( $this->query_vars['post_type']) ) {\n\t\t\t$queryable_post_types = get_post_types( array('publicly_queryable' => true) );\n\t\t\tif ( ! is_array( $this->query_vars['post_type'] ) ) {\n\t\t\t\tif ( ! in_array( $this->query_vars['post_type'], $queryable_post_types ) )\n\t\t\t\t\tunset( $this->query_vars['post_type'] );\n\t\t\t} else {\n\t\t\t\t$this->query_vars['post_type'] = array_intersect( $this->query_vars['post_type'], $queryable_post_types );\n\t\t\t}\n\t\t}\n\n\t\t// Resolve conflicts between posts with numeric slugs and date archive queries.\n\t\t$this->query_vars = wp_resolve_numeric_slug_conflicts( $this->query_vars );\n\n\t\tforeach ( (array) $this->private_query_vars as $var) {\n\t\t\tif ( isset($this->extra_query_vars[$var]) )\n\t\t\t\t$this->query_vars[$var] = $this->extra_query_vars[$var];\n\t\t}\n\n\t\tif ( isset($error) )\n\t\t\t$this->query_vars['error'] = $error;\n\n\t\t/**\n\t\t * Filter the array of parsed query variables.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param array $query_vars The array of requested query variables.\n\t\t */\n\t\t$this->query_vars = apply_filters( 'request', $this->query_vars );\n\n\t\t/**\n\t\t * Fires once all query variables for the current request have been parsed.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param WP &$this Current WordPress environment instance (passed by reference).\n\t\t */\n\t\tdo_action_ref_array( 'parse_request', array( &$this ) );\n\t}\n\n\t/**\n\t * Sends additional HTTP headers for caching, content type, etc.\n\t *\n\t * Sets the Content-Type header. Sets the 'error' status (if passed) and optionally exits.\n\t * If showing a feed, it will also send Last-Modified, ETag, and 304 status if needed.\n\t *\n\t * @since 2.0.0\n\t * @since 4.4.0 `X-Pingback` header is added conditionally after posts have been queried in handle_404().\n\t */\n\tpublic function send_headers() {\n\t\t$headers = array();\n\t\t$status = null;\n\t\t$exit_required = false;\n\n\t\tif ( is_user_logged_in() )\n\t\t\t$headers = array_merge($headers, wp_get_nocache_headers());\n\t\tif ( ! empty( $this->query_vars['error'] ) ) {\n\t\t\t$status = (int) $this->query_vars['error'];\n\t\t\tif ( 404 === $status ) {\n\t\t\t\tif ( ! is_user_logged_in() )\n\t\t\t\t\t$headers = array_merge($headers, wp_get_nocache_headers());\n\t\t\t\t$headers['Content-Type'] = get_option('html_type') . '; charset=' . get_option('blog_charset');\n\t\t\t} elseif ( in_array( $status, array( 403, 500, 502, 503 ) ) ) {\n\t\t\t\t$exit_required = true;\n\t\t\t}\n\t\t} elseif ( empty( $this->query_vars['feed'] ) ) {\n\t\t\t$headers['Content-Type'] = get_option('html_type') . '; charset=' . get_option('blog_charset');\n\t\t} else {\n\t\t\t// Set the correct content type for feeds\n\t\t\t$type = $this->query_vars['feed'];\n\t\t\tif ( 'feed' == $this->query_vars['feed'] ) {\n\t\t\t\t$type = get_default_feed();\n\t\t\t}\n\t\t\t$headers['Content-Type'] = feed_content_type( $type ) . '; charset=' . get_option( 'blog_charset' );\n\n\t\t\t// We're showing a feed, so WP is indeed the only thing that last changed\n\t\t\tif ( !empty($this->query_vars['withcomments'])\n\t\t\t\t|| false !== strpos( $this->query_vars['feed'], 'comments-' )\n\t\t\t\t|| ( empty($this->query_vars['withoutcomments'])\n\t\t\t\t\t&& ( !empty($this->query_vars['p'])\n\t\t\t\t\t\t|| !empty($this->query_vars['name'])\n\t\t\t\t\t\t|| !empty($this->query_vars['page_id'])\n\t\t\t\t\t\t|| !empty($this->query_vars['pagename'])\n\t\t\t\t\t\t|| !empty($this->query_vars['attachment'])\n\t\t\t\t\t\t|| !empty($this->query_vars['attachment_id'])\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t\t\t$wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastcommentmodified('GMT'), 0).' GMT';\n\t\t\telse\n\t\t\t\t$wp_last_modified = mysql2date('D, d M Y H:i:s', get_lastpostmodified('GMT'), 0).' GMT';\n\t\t\t$wp_etag = '\"' . md5($wp_last_modified) . '\"';\n\t\t\t$headers['Last-Modified'] = $wp_last_modified;\n\t\t\t$headers['ETag'] = $wp_etag;\n\n\t\t\t// Support for Conditional GET\n\t\t\tif (isset($_SERVER['HTTP_IF_NONE_MATCH']))\n\t\t\t\t$client_etag = wp_unslash( $_SERVER['HTTP_IF_NONE_MATCH'] );\n\t\t\telse $client_etag = false;\n\n\t\t\t$client_last_modified = empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? '' : trim($_SERVER['HTTP_IF_MODIFIED_SINCE']);\n\t\t\t// If string is empty, return 0. If not, attempt to parse into a timestamp\n\t\t\t$client_modified_timestamp = $client_last_modified ? strtotime($client_last_modified) : 0;\n\n\t\t\t// Make a timestamp for our most recent modification...\n\t\t\t$wp_modified_timestamp = strtotime($wp_last_modified);\n\n\t\t\tif ( ($client_last_modified && $client_etag) ?\n\t\t\t\t\t (($client_modified_timestamp >= $wp_modified_timestamp) && ($client_etag == $wp_etag)) :\n\t\t\t\t\t (($client_modified_timestamp >= $wp_modified_timestamp) || ($client_etag == $wp_etag)) ) {\n\t\t\t\t$status = 304;\n\t\t\t\t$exit_required = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the HTTP headers before they're sent to the browser.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array $headers The list of headers to be sent.\n\t\t * @param WP    $this    Current WordPress environment instance.\n\t\t */\n\t\t$headers = apply_filters( 'wp_headers', $headers, $this );\n\n\t\tif ( ! empty( $status ) )\n\t\t\tstatus_header( $status );\n\n\t\t// If Last-Modified is set to false, it should not be sent (no-cache situation).\n\t\tif ( isset( $headers['Last-Modified'] ) && false === $headers['Last-Modified'] ) {\n\t\t\tunset( $headers['Last-Modified'] );\n\n\t\t\t// In PHP 5.3+, make sure we are not sending a Last-Modified header.\n\t\t\tif ( function_exists( 'header_remove' ) ) {\n\t\t\t\t@header_remove( 'Last-Modified' );\n\t\t\t} else {\n\t\t\t\t// In PHP 5.2, send an empty Last-Modified header, but only as a\n\t\t\t\t// last resort to override a header already sent. #WP23021\n\t\t\t\tforeach ( headers_list() as $header ) {\n\t\t\t\t\tif ( 0 === stripos( $header, 'Last-Modified' ) ) {\n\t\t\t\t\t\t$headers['Last-Modified'] = '';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tforeach ( (array) $headers as $name => $field_value )\n\t\t\t@header(\"{$name}: {$field_value}\");\n\n\t\tif ( $exit_required )\n\t\t\texit();\n\n\t\t/**\n\t\t * Fires once the requested HTTP headers for caching, content type, etc. have been sent.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param WP &$this Current WordPress environment instance (passed by reference).\n\t\t */\n\t\tdo_action_ref_array( 'send_headers', array( &$this ) );\n\t}\n\n\t/**\n\t * Sets the query string property based off of the query variable property.\n\t *\n\t * The 'query_string' filter is deprecated, but still works. Plugins should\n\t * use the 'request' filter instead.\n\t *\n\t * @since 2.0.0\n\t */\n\tpublic function build_query_string() {\n\t\t$this->query_string = '';\n\t\tforeach ( (array) array_keys($this->query_vars) as $wpvar) {\n\t\t\tif ( '' != $this->query_vars[$wpvar] ) {\n\t\t\t\t$this->query_string .= (strlen($this->query_string) < 1) ? '' : '&';\n\t\t\t\tif ( !is_scalar($this->query_vars[$wpvar]) ) // Discard non-scalars.\n\t\t\t\t\tcontinue;\n\t\t\t\t$this->query_string .= $wpvar . '=' . rawurlencode($this->query_vars[$wpvar]);\n\t\t\t}\n\t\t}\n\n\t\tif ( has_filter( 'query_string' ) ) {  // Don't bother filtering and parsing if no plugins are hooked in.\n\t\t\t/**\n\t\t\t * Filter the query string before parsing.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t * @deprecated 2.1.0 Use 'query_vars' or 'request' filters instead.\n\t\t\t *\n\t\t\t * @param string $query_string The query string to modify.\n\t\t\t */\n\t\t\t$this->query_string = apply_filters( 'query_string', $this->query_string );\n\t\t\tparse_str($this->query_string, $this->query_vars);\n\t\t}\n\t}\n\n\t/**\n\t * Set up the WordPress Globals.\n\t *\n\t * The query_vars property will be extracted to the GLOBALS. So care should\n\t * be taken when naming global variables that might interfere with the\n\t * WordPress environment.\n\t *\n\t * @global WP_Query     $wp_query\n\t * @global string       $query_string Query string for the loop.\n\t * @global array        $posts The found posts.\n\t * @global WP_Post|null $post The current post, if available.\n\t * @global string       $request The SQL statement for the request.\n\t * @global int          $more Only set, if single page or post.\n\t * @global int          $single If single page or post. Only set, if single page or post.\n\t * @global WP_User      $authordata Only set, if author archive.\n\t *\n\t * @since 2.0.0\n\t */\n\tpublic function register_globals() {\n\t\tglobal $wp_query;\n\n\t\t// Extract updated query vars back into global namespace.\n\t\tforeach ( (array) $wp_query->query_vars as $key => $value ) {\n\t\t\t$GLOBALS[ $key ] = $value;\n\t\t}\n\n\t\t$GLOBALS['query_string'] = $this->query_string;\n\t\t$GLOBALS['posts'] = & $wp_query->posts;\n\t\t$GLOBALS['post'] = isset( $wp_query->post ) ? $wp_query->post : null;\n\t\t$GLOBALS['request'] = $wp_query->request;\n\n\t\tif ( $wp_query->is_single() || $wp_query->is_page() ) {\n\t\t\t$GLOBALS['more']   = 1;\n\t\t\t$GLOBALS['single'] = 1;\n\t\t}\n\n\t\tif ( $wp_query->is_author() && isset( $wp_query->post ) )\n\t\t\t$GLOBALS['authordata'] = get_userdata( $wp_query->post->post_author );\n\t}\n\n\t/**\n\t * Set up the current user.\n\t *\n\t * @since 2.0.0\n\t */\n\tpublic function init() {\n\t\twp_get_current_user();\n\t}\n\n\t/**\n\t * Set up the Loop based on the query variables.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @global WP_Query $wp_the_query\n\t */\n\tpublic function query_posts() {\n\t\tglobal $wp_the_query;\n\t\t$this->build_query_string();\n\t\t$wp_the_query->query($this->query_vars);\n \t}\n\n \t/**\n\t * Set the Headers for 404, if nothing is found for requested URL.\n\t *\n\t * Issue a 404 if a request doesn't match any posts and doesn't match\n\t * any object (e.g. an existing-but-empty category, tag, author) and a 404 was not already\n\t * issued, and if the request was not a search or the homepage.\n\t *\n\t * Otherwise, issue a 200.\n\t *\n\t * This sets headers after posts have been queried. handle_404() really means \"handle status.\"\n\t * By inspecting the result of querying posts, seemingly successful requests can be switched to\n\t * a 404 so that canonical redirection logic can kick in.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @global WP_Query $wp_query\n \t */\n\tpublic function handle_404() {\n\t\tglobal $wp_query;\n\n\t\t// If we've already issued a 404, bail.\n\t\tif ( is_404() )\n\t\t\treturn;\n\n\t\t// Never 404 for the admin, robots, or if we found posts.\n\t\tif ( is_admin() || is_robots() || $wp_query->posts ) {\n\n\t\t\t$success = true;\n\t\t\tif ( is_singular() ) {\n\t\t\t\t$p = false;\n\n\t\t\t\tif ( $wp_query->post instanceof WP_Post ) {\n\t\t\t\t\t$p = clone $wp_query->post;\n\t\t\t\t}\n\n\t\t\t\t// Only set X-Pingback for single posts that allow pings.\n\t\t\t\tif ( $p && pings_open( $p ) ) {\n\t\t\t\t\t@header( 'X-Pingback: ' . get_bloginfo( 'pingback_url' ) );\n\t\t\t\t}\n\n\t\t\t\t// check for paged content that exceeds the max number of pages\n\t\t\t\t$next = '<!--nextpage-->';\n\t\t\t\tif ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) {\n\t\t\t\t\t$page = trim( $this->query_vars['page'], '/' );\n\t\t\t\t\t$success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $success ) {\n\t\t\t\tstatus_header( 200 );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// We will 404 for paged queries, as no posts were found.\n\t\tif ( ! is_paged() ) {\n\n\t\t\t// Don't 404 for authors without posts as long as they matched an author on this site.\n\t\t\t$author = get_query_var( 'author' );\n\t\t\tif ( is_author() && is_numeric( $author ) && $author > 0 && is_user_member_of_blog( $author ) ) {\n\t\t\t\tstatus_header( 200 );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Don't 404 for these queries if they matched an object.\n\t\t\tif ( ( is_tag() || is_category() || is_tax() || is_post_type_archive() ) && get_queried_object() ) {\n\t\t\t\tstatus_header( 200 );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Don't 404 for these queries either.\n\t\t\tif ( is_home() || is_search() || is_feed() ) {\n\t\t\t\tstatus_header( 200 );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Guess it's time to 404.\n\t\t$wp_query->set_404();\n\t\tstatus_header( 404 );\n\t\tnocache_headers();\n\t}\n\n\t/**\n\t * Sets up all of the variables required by the WordPress environment.\n\t *\n\t * The action 'wp' has one parameter that references the WP object. It\n\t * allows for accessing the properties and methods to further manipulate the\n\t * object.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param string|array $query_args Passed to {@link parse_request()}\n\t */\n\tpublic function main($query_args = '') {\n\t\t$this->init();\n\t\t$this->parse_request($query_args);\n\t\t$this->send_headers();\n\t\t$this->query_posts();\n\t\t$this->handle_404();\n\t\t$this->register_globals();\n\n\t\t/**\n\t\t * Fires once the WordPress environment has been set up.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param WP &$this Current WordPress environment instance (passed by reference).\n\t\t */\n\t\tdo_action_ref_array( 'wp', array( &$this ) );\n\t}\n}\n\n/**\n * Helper class to remove the need to use eval to replace $matches[] in query strings.\n *\n * @since 2.9.0\n */\nclass WP_MatchesMapRegex {\n\t/**\n\t * store for matches\n\t *\n\t * @access private\n\t * @var array\n\t */\n\tprivate $_matches;\n\n\t/**\n\t * store for mapping result\n\t *\n\t * @access public\n\t * @var string\n\t */\n\tpublic $output;\n\n\t/**\n\t * subject to perform mapping on (query string containing $matches[] references\n\t *\n\t * @access private\n\t * @var string\n\t */\n\tprivate $_subject;\n\n\t/**\n\t * regexp pattern to match $matches[] references\n\t *\n\t * @var string\n\t */\n\tpublic $_pattern = '(\\$matches\\[[1-9]+[0-9]*\\])'; // magic number\n\n\t/**\n\t * constructor\n\t *\n\t * @param string $subject subject if regex\n\t * @param array  $matches data to use in map\n\t */\n\tpublic function __construct($subject, $matches) {\n\t\t$this->_subject = $subject;\n\t\t$this->_matches = $matches;\n\t\t$this->output = $this->_map();\n\t}\n\n\t/**\n\t * Substitute substring matches in subject.\n\t *\n\t * static helper function to ease use\n\t *\n\t * @static\n\t * @access public\n\t *\n\t * @param string $subject subject\n\t * @param array  $matches data used for substitution\n\t * @return string\n\t */\n\tpublic static function apply($subject, $matches) {\n\t\t$oSelf = new WP_MatchesMapRegex($subject, $matches);\n\t\treturn $oSelf->output;\n\t}\n\n\t/**\n\t * do the actual mapping\n\t *\n\t * @access private\n\t * @return string\n\t */\n\tprivate function _map() {\n\t\t$callback = array($this, 'callback');\n\t\treturn preg_replace_callback($this->_pattern, $callback, $this->_subject);\n\t}\n\n\t/**\n\t * preg_replace_callback hook\n\t *\n\t * @access public\n\t * @param  array $matches preg_replace regexp matches\n\t * @return string\n\t */\n\tpublic function callback($matches) {\n\t\t$index = intval(substr($matches[0], 9, -1));\n\t\treturn ( isset( $this->_matches[$index] ) ? urlencode($this->_matches[$index]) : '' );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class.wp-dependencies.php",
    "content": "<?php\n/**\n * BackPress Scripts enqueue\n *\n * Classes were refactored from the WP_Scripts and WordPress script enqueue API.\n *\n * @since BackPress r74\n *\n * @package BackPress\n * @uses _WP_Dependency\n * @since r74\n */\nclass WP_Dependencies {\n\t/**\n\t * An array of registered handle objects.\n\t *\n\t * @access public\n\t * @since 2.6.8\n\t * @var array\n\t */\n\tpublic $registered = array();\n\n\t/**\n\t * An array of queued _WP_Dependency handle objects.\n\t *\n\t * @access public\n\t * @since 2.6.8\n\t * @var array\n\t */\n\tpublic $queue = array();\n\n\t/**\n\t * An array of _WP_Dependency handle objects to queue.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var array\n\t */\n\tpublic $to_do = array();\n\n\t/**\n\t * An array of _WP_Dependency handle objects already queued.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var array\n\t */\n\tpublic $done = array();\n\n\t/**\n\t * An array of additional arguments passed when a handle is registered.\n\t *\n\t * Arguments are appended to the item query string.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var array\n\t */\n\tpublic $args = array();\n\n\t/**\n\t * An array of handle groups to enqueue.\n\t *\n\t * @access public\n\t * @since 2.8.0\n\t * @var array\n\t */\n\tpublic $groups = array();\n\n\t/**\n\t * A handle group to enqueue.\n\t *\n\t * @access public\n\t * @since 2.8.0\n\t * @var int\n\t */\n\tpublic $group = 0;\n\n\t/**\n\t * Process the items and dependencies.\n\t *\n\t * Processes the items passed to it or the queue, and their dependencies.\n\t *\n\t * @access public\n\t * @since 2.1.0\n\t *\n\t * @param mixed $handles Optional. Items to be processed: Process queue (false), process item (string), process items (array of strings).\n\t * @param mixed $group   Group level: level (int), no groups (false).\n\t * @return array Handles of items that have been processed.\n\t */\n\tpublic function do_items( $handles = false, $group = false ) {\n\t\t/*\n\t\t * If nothing is passed, print the queue. If a string is passed,\n\t\t * print that item. If an array is passed, print those items.\n\t\t */\n\t\t$handles = false === $handles ? $this->queue : (array) $handles;\n\t\t$this->all_deps( $handles );\n\n\t\tforeach ( $this->to_do as $key => $handle ) {\n\t\t\tif ( !in_array($handle, $this->done, true) && isset($this->registered[$handle]) ) {\n\n\t\t\t\t/*\n\t\t\t\t * A single item may alias a set of items, by having dependencies,\n\t\t\t\t * but no source. Queuing the item queues the dependencies.\n\t\t\t\t *\n\t\t\t\t * Example: The extending class WP_Scripts is used to register 'scriptaculous' as a set of registered handles:\n\t\t\t\t *   <code>add( 'scriptaculous', false, array( 'scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls' ) );</code>\n\t\t\t\t *\n\t\t\t\t * The src property is false.\n\t\t\t\t */\n\t\t\t\tif ( ! $this->registered[$handle]->src ) {\n\t\t\t\t\t$this->done[] = $handle;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Attempt to process the item. If successful,\n\t\t\t\t * add the handle to the done array.\n\t\t\t\t *\n\t\t\t\t * Unset the item from the to_do array.\n\t\t\t\t */\n\t\t\t\tif ( $this->do_item( $handle, $group ) )\n\t\t\t\t\t$this->done[] = $handle;\n\n\t\t\t\tunset( $this->to_do[$key] );\n\t\t\t}\n\t\t}\n\n\t\treturn $this->done;\n\t}\n\n\t/**\n\t * Process a dependency.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t *\n\t * @param string $handle Name of the item. Should be unique.\n\t * @return bool True on success, false if not set.\n\t */\n\tpublic function do_item( $handle ) {\n\t\treturn isset($this->registered[$handle]);\n\t}\n\n\t/**\n\t * Determine dependencies.\n\t *\n\t * Recursively builds an array of items to process taking\n\t * dependencies into account. Does NOT catch infinite loops.\n\t *\n\t * @access public\n\t * @since 2.1.0\n\t *\n\t * @param mixed $handles   Item handle and argument (string) or item handles and arguments (array of strings).\n\t * @param bool  $recursion Internal flag that function is calling itself.\n\t * @param mixed $group     Group level: (int) level, (false) no groups.\n\t * @return bool True on success, false on failure.\n\t */\n\tpublic function all_deps( $handles, $recursion = false, $group = false ) {\n\t\tif ( !$handles = (array) $handles )\n\t\t\treturn false;\n\n\t\tforeach ( $handles as $handle ) {\n\t\t\t$handle_parts = explode('?', $handle);\n\t\t\t$handle = $handle_parts[0];\n\t\t\t$queued = in_array($handle, $this->to_do, true);\n\n\t\t\tif ( in_array($handle, $this->done, true) ) // Already done\n\t\t\t\tcontinue;\n\n\t\t\t$moved = $this->set_group( $handle, $recursion, $group );\n\n\t\t\tif ( $queued && !$moved ) // already queued and in the right group\n\t\t\t\tcontinue;\n\n\t\t\t$keep_going = true;\n\t\t\tif ( !isset($this->registered[$handle]) )\n\t\t\t\t$keep_going = false; // Item doesn't exist.\n\t\t\telseif ( $this->registered[$handle]->deps && array_diff($this->registered[$handle]->deps, array_keys($this->registered)) )\n\t\t\t\t$keep_going = false; // Item requires dependencies that don't exist.\n\t\t\telseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true, $group ) )\n\t\t\t\t$keep_going = false; // Item requires dependencies that don't exist.\n\n\t\t\tif ( ! $keep_going ) { // Either item or its dependencies don't exist.\n\t\t\t\tif ( $recursion )\n\t\t\t\t\treturn false; // Abort this branch.\n\t\t\t\telse\n\t\t\t\t\tcontinue; // We're at the top level. Move on to the next one.\n\t\t\t}\n\n\t\t\tif ( $queued ) // Already grabbed it and its dependencies.\n\t\t\t\tcontinue;\n\n\t\t\tif ( isset($handle_parts[1]) )\n\t\t\t\t$this->args[$handle] = $handle_parts[1];\n\n\t\t\t$this->to_do[] = $handle;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Register an item.\n\t *\n\t * Registers the item if no item of that name already exists.\n\t *\n\t * @access public\n\t * @since 2.1.0\n\t *\n\t * @param string $handle Unique item name.\n\t * @param string $src    The item url.\n\t * @param array  $deps   Optional. An array of item handle strings on which this item depends.\n\t * @param string $ver    Optional. Version (used for cache busting).\n\t * @param mixed  $args   Optional. Custom property of the item. NOT the class property $args. Examples: $media, $in_footer.\n\t * @return bool Whether the item has been registered. True on success, false on failure.\n\t */\n\tpublic function add( $handle, $src, $deps = array(), $ver = false, $args = null ) {\n\t\tif ( isset($this->registered[$handle]) )\n\t\t\treturn false;\n\t\t$this->registered[$handle] = new _WP_Dependency( $handle, $src, $deps, $ver, $args );\n\t\treturn true;\n\t}\n\n\t/**\n\t * Add extra item data.\n\t *\n\t * Adds data to a registered item.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t *\n\t * @param string $handle Name of the item. Should be unique.\n\t * @param string $key    The data key.\n\t * @param mixed  $value  The data value.\n\t * @return bool True on success, false on failure.\n\t */\n\tpublic function add_data( $handle, $key, $value ) {\n\t\tif ( !isset( $this->registered[$handle] ) )\n\t\t\treturn false;\n\n\t\treturn $this->registered[$handle]->add_data( $key, $value );\n\t}\n\n\t/**\n\t * Get extra item data.\n\t *\n\t * Gets data associated with a registered item.\n\t *\n\t * @access public\n\t * @since 3.3.0\n\t *\n\t * @param string $handle Name of the item. Should be unique.\n\t * @param string $key    The data key.\n\t * @return mixed Extra item data (string), false otherwise.\n\t */\n\tpublic function get_data( $handle, $key ) {\n\t\tif ( !isset( $this->registered[$handle] ) )\n\t\t\treturn false;\n\n\t\tif ( !isset( $this->registered[$handle]->extra[$key] ) )\n\t\t\treturn false;\n\n\t\treturn $this->registered[$handle]->extra[$key];\n\t}\n\n\t/**\n\t * Un-register an item or items.\n\t *\n\t * @access public\n\t * @since 2.1.0\n\t *\n\t * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings).\n\t * @return void\n\t */\n\tpublic function remove( $handles ) {\n\t\tforeach ( (array) $handles as $handle )\n\t\t\tunset($this->registered[$handle]);\n\t}\n\n\t/**\n\t * Queue an item or items.\n\t *\n\t * Decodes handles and arguments, then queues handles and stores\n\t * arguments in the class property $args. For example in extending\n\t * classes, $args is appended to the item url as a query string.\n\t * Note $args is NOT the $args property of items in the $registered array.\n\t *\n\t * @access public\n\t * @since 2.1.0\n\t *\n\t * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings).\n\t */\n\tpublic function enqueue( $handles ) {\n\t\tforeach ( (array) $handles as $handle ) {\n\t\t\t$handle = explode('?', $handle);\n\t\t\tif ( !in_array($handle[0], $this->queue) && isset($this->registered[$handle[0]]) ) {\n\t\t\t\t$this->queue[] = $handle[0];\n\t\t\t\tif ( isset($handle[1]) )\n\t\t\t\t\t$this->args[$handle[0]] = $handle[1];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Dequeue an item or items.\n\t *\n\t * Decodes handles and arguments, then dequeues handles\n\t * and removes arguments from the class property $args.\n\t *\n\t * @access public\n\t * @since 2.1.0\n\t *\n\t * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings).\n\t */\n\tpublic function dequeue( $handles ) {\n\t\tforeach ( (array) $handles as $handle ) {\n\t\t\t$handle = explode('?', $handle);\n\t\t\t$key = array_search($handle[0], $this->queue);\n\t\t\tif ( false !== $key ) {\n\t\t\t\tunset($this->queue[$key]);\n\t\t\t\tunset($this->args[$handle[0]]);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Recursively search the passed dependency tree for $handle\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param array  $queue  An array of queued _WP_Dependency handle objects.\n\t * @param string $handle Name of the item. Should be unique.\n\t * @return bool Whether the handle is found after recursively searching the dependency tree.\n\t */\n\tprotected function recurse_deps( $queue, $handle ) {\n\t\tforeach ( $queue as $queued ) {\n\t\t\tif ( ! isset( $this->registered[ $queued ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( in_array( $handle, $this->registered[ $queued ]->deps ) ) {\n\t\t\t\treturn true;\n\t\t\t} elseif ( $this->recurse_deps( $this->registered[ $queued ]->deps, $handle ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Query list for an item.\n\t *\n\t * @access public\n\t * @since 2.1.0\n\t *\n\t * @param string $handle Name of the item. Should be unique.\n\t * @param string $list   Property name of list array.\n\t * @return bool Found, or object Item data.\n\t */\n\tpublic function query( $handle, $list = 'registered' ) {\n\t\tswitch ( $list ) {\n\t\t\tcase 'registered' :\n\t\t\tcase 'scripts': // back compat\n\t\t\t\tif ( isset( $this->registered[ $handle ] ) )\n\t\t\t\t\treturn $this->registered[ $handle ];\n\t\t\t\treturn false;\n\n\t\t\tcase 'enqueued' :\n\t\t\tcase 'queue' :\n\t\t\t\tif ( in_array( $handle, $this->queue ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn $this->recurse_deps( $this->queue, $handle );\n\n\t\t\tcase 'to_do' :\n\t\t\tcase 'to_print': // back compat\n\t\t\t\treturn in_array( $handle, $this->to_do );\n\n\t\t\tcase 'done' :\n\t\t\tcase 'printed': // back compat\n\t\t\t\treturn in_array( $handle, $this->done );\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Set item group, unless already in a lower group.\n\t *\n\t * @access public\n\t * @since 2.8.0\n\t *\n\t * @param string $handle    Name of the item. Should be unique.\n\t * @param bool   $recursion Internal flag that calling function was called recursively.\n\t * @param mixed  $group     Group level.\n\t * @return bool Not already in the group or a lower group\n\t */\n\tpublic function set_group( $handle, $recursion, $group ) {\n\t\t$group = (int) $group;\n\n\t\tif ( $recursion )\n\t\t\t$group = min($this->group, $group);\n\t\telse\n\t\t\t$this->group = $group;\n\n\t\tif ( isset($this->groups[$handle]) && $this->groups[$handle] <= $group )\n\t\t\treturn false;\n\n\t\t$this->groups[$handle] = $group;\n\t\treturn true;\n\t}\n\n} // WP_Dependencies\n\n/**\n * Class _WP_Dependency\n *\n * Helper class to register a handle and associated data.\n *\n * @access private\n * @since 2.6.0\n */\nclass _WP_Dependency {\n\t/**\n\t * The handle name.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var null\n\t */\n\tpublic $handle;\n\n\t/**\n\t * The handle source.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var null\n\t */\n\tpublic $src;\n\n\t/**\n\t * An array of handle dependencies.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var array\n\t */\n\tpublic $deps = array();\n\n\t/**\n\t * The handle version.\n\t *\n\t * Used for cache-busting.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var bool|string\n\t */\n\tpublic $ver = false;\n\n\t/**\n\t * Additional arguments for the handle.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var null\n\t */\n\tpublic $args = null;  // Custom property, such as $in_footer or $media.\n\n\t/**\n\t * Extra data to supply to the handle.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t * @var array\n\t */\n\tpublic $extra = array();\n\n\t/**\n\t * Setup dependencies.\n\t *\n\t * @since 2.6.0\n\t */\n\tpublic function __construct() {\n\t\t@list( $this->handle, $this->src, $this->deps, $this->ver, $this->args ) = func_get_args();\n\t\tif ( ! is_array($this->deps) )\n\t\t\t$this->deps = array();\n\t}\n\n\t/**\n\t * Add handle data.\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t *\n\t * @param string $name The data key to add.\n\t * @param mixed  $data The data value to add.\n\t * @return bool False if not scalar, true otherwise.\n\t */\n\tpublic function add_data( $name, $data ) {\n\t\tif ( !is_scalar($name) )\n\t\t\treturn false;\n\t\t$this->extra[$name] = $data;\n\t\treturn true;\n\t}\n\n} // _WP_Dependencies\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class.wp-scripts.php",
    "content": "<?php\n/**\n * BackPress Scripts enqueue.\n *\n * These classes were refactored from the WordPress WP_Scripts and WordPress\n * script enqueue API.\n *\n * @package BackPress\n * @since r16\n */\n\n/**\n * BackPress Scripts enqueue class.\n *\n * @package BackPress\n * @uses WP_Dependencies\n * @since r16\n */\nclass WP_Scripts extends WP_Dependencies {\n\tpublic $base_url; // Full URL with trailing slash\n\tpublic $content_url;\n\tpublic $default_version;\n\tpublic $in_footer = array();\n\tpublic $concat = '';\n\tpublic $concat_version = '';\n\tpublic $do_concat = false;\n\tpublic $print_html = '';\n\tpublic $print_code = '';\n\tpublic $ext_handles = '';\n\tpublic $ext_version = '';\n\tpublic $default_dirs;\n\n\tpublic function __construct() {\n\t\t$this->init();\n\t\tadd_action( 'init', array( $this, 'init' ), 0 );\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function init() {\n\t\t/**\n\t\t * Fires when the WP_Scripts instance is initialized.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param WP_Scripts &$this WP_Scripts instance, passed by reference.\n\t\t */\n\t\tdo_action_ref_array( 'wp_default_scripts', array(&$this) );\n\t}\n\n\t/**\n\t * Prints scripts.\n\t *\n\t * Prints the scripts passed to it or the print queue. Also prints all necessary dependencies.\n\t *\n\t * @param mixed $handles Optional. Scripts to be printed. (void) prints queue, (string) prints\n\t *                       that script, (array of strings) prints those scripts. Default false.\n\t * @param int   $group   Optional. If scripts were queued in groups prints this group number.\n\t *                       Default false.\n\t * @return array Scripts that have been printed.\n\t */\n\tpublic function print_scripts( $handles = false, $group = false ) {\n\t\treturn $this->do_items( $handles, $group );\n\t}\n\n\t/**\n\t * @deprecated 3.3\n\t * @see print_extra_script()\n\t *\n\t * @param string $handle\n\t * @param bool   $echo\n\t * @return bool|string|void\n\t */\n\tpublic function print_scripts_l10n( $handle, $echo = true ) {\n\t\t_deprecated_function( __FUNCTION__, '3.3', 'print_extra_script()' );\n\t\treturn $this->print_extra_script( $handle, $echo );\n\t}\n\n\t/**\n\t * @param string $handle\n\t * @param bool   $echo\n\t * @return bool|string|void\n\t */\n\tpublic function print_extra_script( $handle, $echo = true ) {\n\t\tif ( !$output = $this->get_data( $handle, 'data' ) )\n\t\t\treturn;\n\n\t\tif ( !$echo )\n\t\t\treturn $output;\n\n\t\techo \"<script type='text/javascript'>\\n\"; // CDATA and type='text/javascript' is not needed for HTML 5\n\t\techo \"/* <![CDATA[ */\\n\";\n\t\techo \"$output\\n\";\n\t\techo \"/* ]]> */\\n\";\n\t\techo \"</script>\\n\";\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param string   $handle Name of the item. Should be unique.\n\t * @param int|bool $group\n\t * @return bool True on success, false if not set.\n\t */\n\tpublic function do_item( $handle, $group = false ) {\n\t\tif ( !parent::do_item($handle) )\n\t\t\treturn false;\n\n\t\tif ( 0 === $group && $this->groups[$handle] > 0 ) {\n\t\t\t$this->in_footer[] = $handle;\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( false === $group && in_array($handle, $this->in_footer, true) )\n\t\t\t$this->in_footer = array_diff( $this->in_footer, (array) $handle );\n\n\t\t$obj = $this->registered[$handle];\n\n\t\tif ( null === $obj->ver ) {\n\t\t\t$ver = '';\n\t\t} else {\n\t\t\t$ver = $obj->ver ? $obj->ver : $this->default_version;\n\t\t}\n\n\t\tif ( isset($this->args[$handle]) )\n\t\t\t$ver = $ver ? $ver . '&amp;' . $this->args[$handle] : $this->args[$handle];\n\n\t\t$src = $obj->src;\n\t\t$cond_before = $cond_after = '';\n\t\t$conditional = isset( $obj->extra['conditional'] ) ? $obj->extra['conditional'] : '';\n\n\t\tif ( $conditional ) {\n\t\t\t$cond_before = \"<!--[if {$conditional}]>\\n\";\n\t\t\t$cond_after = \"<![endif]-->\\n\";\n\t\t}\n\n\t\tif ( $this->do_concat ) {\n\t\t\t/**\n\t\t\t * Filter the script loader source.\n\t\t\t *\n\t\t\t * @since 2.2.0\n\t\t\t *\n\t\t\t * @param string $src    Script loader source path.\n\t\t\t * @param string $handle Script handle.\n\t\t\t */\n\t\t\t$srce = apply_filters( 'script_loader_src', $src, $handle );\n\t\t\tif ( $this->in_default_dir( $srce ) && ! $conditional ) {\n\t\t\t\t$this->print_code .= $this->print_extra_script( $handle, false );\n\t\t\t\t$this->concat .= \"$handle,\";\n\t\t\t\t$this->concat_version .= \"$handle$ver\";\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\t$this->ext_handles .= \"$handle,\";\n\t\t\t\t$this->ext_version .= \"$handle$ver\";\n\t\t\t}\n\t\t}\n\n\t\t$has_conditional_data = $conditional && $this->get_data( $handle, 'data' );\n\n\t\tif ( $has_conditional_data ) {\n\t\t\techo $cond_before;\n\t\t}\n\n\t\t$this->print_extra_script( $handle );\n\n\t\tif ( $has_conditional_data ) {\n\t\t\techo $cond_after;\n\t\t}\n\n\t\tif ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) {\n\t\t\t$src = $this->base_url . $src;\n\t\t}\n\n\t\tif ( ! empty( $ver ) )\n\t\t\t$src = add_query_arg( 'ver', $ver, $src );\n\n\t\t/** This filter is documented in wp-includes/class.wp-scripts.php */\n\t\t$src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) );\n\n\t\tif ( ! $src )\n\t\t\treturn true;\n\n\t\t$tag = \"{$cond_before}<script type='text/javascript' src='$src'></script>\\n{$cond_after}\";\n\n\t\t/**\n\t\t * Filter the HTML script tag of an enqueued script.\n\t\t *\n\t\t * @since 4.1.0\n\t\t *\n\t\t * @param string $tag    The `<script>` tag for the enqueued script.\n\t\t * @param string $handle The script's registered handle.\n\t\t * @param string $src    The script's source URL.\n\t\t */\n\t\t$tag = apply_filters( 'script_loader_tag', $tag, $handle, $src );\n\n\t\tif ( $this->do_concat ) {\n\t\t\t$this->print_html .= $tag;\n\t\t} else {\n\t\t\techo $tag;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Localizes a script, only if the script has already been added\n\t *\n\t * @param string $handle\n\t * @param string $object_name\n\t * @param array $l10n\n\t * @return bool\n\t */\n\tpublic function localize( $handle, $object_name, $l10n ) {\n\t\tif ( $handle === 'jquery' )\n\t\t\t$handle = 'jquery-core';\n\n\t\tif ( is_array($l10n) && isset($l10n['l10n_print_after']) ) { // back compat, preserve the code in 'l10n_print_after' if present\n\t\t\t$after = $l10n['l10n_print_after'];\n\t\t\tunset($l10n['l10n_print_after']);\n\t\t}\n\n\t\tforeach ( (array) $l10n as $key => $value ) {\n\t\t\tif ( !is_scalar($value) )\n\t\t\t\tcontinue;\n\n\t\t\t$l10n[$key] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8');\n\t\t}\n\n\t\t$script = \"var $object_name = \" . wp_json_encode( $l10n ) . ';';\n\n\t\tif ( !empty($after) )\n\t\t\t$script .= \"\\n$after;\";\n\n\t\t$data = $this->get_data( $handle, 'data' );\n\n\t\tif ( !empty( $data ) )\n\t\t\t$script = \"$data\\n$script\";\n\n\t\treturn $this->add_data( $handle, 'data', $script );\n\t}\n\n\t/**\n\t * @param string $handle    Name of the item. Should be unique.\n\t * @param bool   $recursion Internal flag that calling function was called recursively.\n\t * @param mixed  $group     Group level.\n\t * @return bool Not already in the group or a lower group\n\t */\n\tpublic function set_group( $handle, $recursion, $group = false ) {\n\t\tif ( isset( $this->registered[$handle]->args ) && $this->registered[$handle]->args === 1 )\n\t\t\t$grp = 1;\n\t\telse\n\t\t\t$grp = (int) $this->get_data( $handle, 'group' );\n\n\t\tif ( false !== $group && $grp > $group )\n\t\t\t$grp = $group;\n\n\t\treturn parent::set_group( $handle, $recursion, $grp );\n\t}\n\n\t/**\n\t * @param mixed $handles   Item handle and argument (string) or item handles and arguments (array of strings).\n\t * @param bool  $recursion Internal flag that function is calling itself.\n\t * @param mixed $group     Group level: (int) level, (false) no groups.\n\t * @return bool True on success, false on failure.\n\t */\n\tpublic function all_deps( $handles, $recursion = false, $group = false ) {\n\t\t$r = parent::all_deps( $handles, $recursion );\n\t\tif ( ! $recursion ) {\n\t\t\t/**\n\t\t\t * Filter the list of script dependencies left to print.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param array $to_do An array of script dependencies.\n\t\t\t */\n\t\t\t$this->to_do = apply_filters( 'print_scripts_array', $this->to_do );\n\t\t}\n\t\treturn $r;\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tpublic function do_head_items() {\n\t\t$this->do_items(false, 0);\n\t\treturn $this->done;\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tpublic function do_footer_items() {\n\t\t$this->do_items(false, 1);\n\t\treturn $this->done;\n\t}\n\n\t/**\n\t * @param string $src\n\t * @return bool\n\t */\n\tpublic function in_default_dir( $src ) {\n\t\tif ( ! $this->default_dirs ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( 0 === strpos( $src, '/' . WPINC . '/js/l10n' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tforeach ( (array) $this->default_dirs as $test ) {\n\t\t\tif ( 0 === strpos( $src, $test ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function reset() {\n\t\t$this->do_concat = false;\n\t\t$this->print_code = '';\n\t\t$this->concat = '';\n\t\t$this->concat_version = '';\n\t\t$this->print_html = '';\n\t\t$this->ext_version = '';\n\t\t$this->ext_handles = '';\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/class.wp-styles.php",
    "content": "<?php\n/**\n * BackPress Styles enqueue.\n *\n * These classes were refactored from the WordPress WP_Scripts and WordPress\n * script enqueue API.\n *\n * @package BackPress\n * @since r74\n */\n\n/**\n * BackPress Styles enqueue class.\n *\n * @package BackPress\n * @uses WP_Dependencies\n * @since r74\n */\nclass WP_Styles extends WP_Dependencies {\n\tpublic $base_url;\n\tpublic $content_url;\n\tpublic $default_version;\n\tpublic $text_direction = 'ltr';\n\tpublic $concat = '';\n\tpublic $concat_version = '';\n\tpublic $do_concat = false;\n\tpublic $print_html = '';\n\tpublic $print_code = '';\n\tpublic $default_dirs;\n\n\tpublic function __construct() {\n\t\t/**\n\t\t * Fires when the WP_Styles instance is initialized.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param WP_Styles &$this WP_Styles instance, passed by reference.\n\t\t */\n\t\tdo_action_ref_array( 'wp_default_styles', array(&$this) );\n\t}\n\n\t/**\n\t * @param string $handle\n\t * @return bool\n\t */\n\tpublic function do_item( $handle ) {\n\t\tif ( !parent::do_item($handle) )\n\t\t\treturn false;\n\n\t\t$obj = $this->registered[$handle];\n\t\tif ( null === $obj->ver )\n\t\t\t$ver = '';\n\t\telse\n\t\t\t$ver = $obj->ver ? $obj->ver : $this->default_version;\n\n\t\tif ( isset($this->args[$handle]) )\n\t\t\t$ver = $ver ? $ver . '&amp;' . $this->args[$handle] : $this->args[$handle];\n\n\t\tif ( $this->do_concat ) {\n\t\t\tif ( $this->in_default_dir($obj->src) && !isset($obj->extra['conditional']) && !isset($obj->extra['alt']) ) {\n\t\t\t\t$this->concat .= \"$handle,\";\n\t\t\t\t$this->concat_version .= \"$handle$ver\";\n\n\t\t\t\t$this->print_code .= $this->print_inline_style( $handle, false );\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif ( isset($obj->args) )\n\t\t\t$media = esc_attr( $obj->args );\n\t\telse\n\t\t\t$media = 'all';\n\n\t\t$href = $this->_css_href( $obj->src, $ver, $handle );\n\t\tif ( empty( $href ) ) {\n\t\t\t// Turns out there is nothing to print.\n\t\t\treturn true;\n\t\t}\n\t\t$rel = isset($obj->extra['alt']) && $obj->extra['alt'] ? 'alternate stylesheet' : 'stylesheet';\n\t\t$title = isset($obj->extra['title']) ? \"title='\" . esc_attr( $obj->extra['title'] ) . \"'\" : '';\n\n\t\t/**\n\t\t * Filter the HTML link tag of an enqueued style.\n\t\t *\n\t\t * @since 2.6.0\n\t\t * @since 4.3.0 Introduced the `$href` parameter.\n\t\t *\n\t\t * @param string $html   The link tag for the enqueued style.\n\t\t * @param string $handle The style's registered handle.\n\t\t * @param string $href   The stylesheet's source URL.\n\t\t */\n\t\t$tag = apply_filters( 'style_loader_tag', \"<link rel='$rel' id='$handle-css' $title href='$href' type='text/css' media='$media' />\\n\", $handle, $href );\n\t\tif ( 'rtl' === $this->text_direction && isset($obj->extra['rtl']) && $obj->extra['rtl'] ) {\n\t\t\tif ( is_bool( $obj->extra['rtl'] ) || 'replace' === $obj->extra['rtl'] ) {\n\t\t\t\t$suffix = isset( $obj->extra['suffix'] ) ? $obj->extra['suffix'] : '';\n\t\t\t\t$rtl_href = str_replace( \"{$suffix}.css\", \"-rtl{$suffix}.css\", $this->_css_href( $obj->src , $ver, \"$handle-rtl\" ));\n\t\t\t} else {\n\t\t\t\t$rtl_href = $this->_css_href( $obj->extra['rtl'], $ver, \"$handle-rtl\" );\n\t\t\t}\n\n\t\t\t/** This filter is documented in wp-includes/class.wp-styles.php */\n\t\t\t$rtl_tag = apply_filters( 'style_loader_tag', \"<link rel='$rel' id='$handle-rtl-css' $title href='$rtl_href' type='text/css' media='$media' />\\n\", $handle, $rtl_href );\n\n\t\t\tif ( $obj->extra['rtl'] === 'replace' ) {\n\t\t\t\t$tag = $rtl_tag;\n\t\t\t} else {\n\t\t\t\t$tag .= $rtl_tag;\n\t\t\t}\n\t\t}\n\n\t\t$conditional_pre = $conditional_post = '';\n\t\tif ( isset( $obj->extra['conditional'] ) && $obj->extra['conditional'] ) {\n\t\t\t$conditional_pre  = \"<!--[if {$obj->extra['conditional']}]>\\n\";\n\t\t\t$conditional_post = \"<![endif]-->\\n\";\n\t\t}\n\n\t\tif ( $this->do_concat ) {\n\t\t\t$this->print_html .= $conditional_pre;\n\t\t\t$this->print_html .= $tag;\n\t\t\tif ( $inline_style = $this->print_inline_style( $handle, false ) ) {\n\t\t\t\t$this->print_html .= sprintf( \"<style id='%s-inline-css' type='text/css'>\\n%s\\n</style>\\n\", esc_attr( $handle ), $inline_style );\n\t\t\t}\n\t\t\t$this->print_html .= $conditional_post;\n\t\t} else {\n\t\t\techo $conditional_pre;\n\t\t\techo $tag;\n\t\t\t$this->print_inline_style( $handle );\n\t\t\techo $conditional_post;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param string $handle\n\t * @param string $code\n\t */\n\tpublic function add_inline_style( $handle, $code ) {\n\t\tif ( ! $code ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$after = $this->get_data( $handle, 'after' );\n\t\tif ( ! $after ) {\n\t\t\t$after = array();\n\t\t}\n\n\t\t$after[] = $code;\n\n\t\treturn $this->add_data( $handle, 'after', $after );\n\t}\n\n\t/**\n\t * @param string $handle\n\t * @param bool $echo\n\t * @return bool\n\t */\n\tpublic function print_inline_style( $handle, $echo = true ) {\n\t\t$output = $this->get_data( $handle, 'after' );\n\n\t\tif ( empty( $output ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$output = implode( \"\\n\", $output );\n\n\t\tif ( ! $echo ) {\n\t\t\treturn $output;\n\t\t}\n\n\t\tprintf( \"<style id='%s-inline-css' type='text/css'>\\n%s\\n</style>\\n\", esc_attr( $handle ), $output );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param mixed $handles\n\t * @param bool $recursion\n\t * @param mixed $group\n\t * @return bool\n\t */\n\tpublic function all_deps( $handles, $recursion = false, $group = false ) {\n\t\t$r = parent::all_deps( $handles, $recursion );\n\t\tif ( !$recursion ) {\n\t\t\t/**\n\t\t\t * Filter the array of enqueued styles before processing for output.\n\t\t\t *\n\t\t\t * @since 2.6.0\n\t\t\t *\n\t\t\t * @param array $to_do The list of enqueued styles about to be processed.\n\t\t\t */\n\t\t\t$this->to_do = apply_filters( 'print_styles_array', $this->to_do );\n\t\t}\n\t\treturn $r;\n\t}\n\n\t/**\n\t * @param string $src\n\t * @param string $ver\n\t * @param string $handle\n\t * @return string\n\t */\n\tpublic function _css_href( $src, $ver, $handle ) {\n\t\tif ( !is_bool($src) && !preg_match('|^(https?:)?//|', $src) && ! ( $this->content_url && 0 === strpos($src, $this->content_url) ) ) {\n\t\t\t$src = $this->base_url . $src;\n\t\t}\n\n\t\tif ( !empty($ver) )\n\t\t\t$src = add_query_arg('ver', $ver, $src);\n\n\t\t/**\n\t\t * Filter an enqueued style's fully-qualified URL.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param string $src    The source URL of the enqueued style.\n\t\t * @param string $handle The style's registered handle.\n\t\t */\n\t\t$src = apply_filters( 'style_loader_src', $src, $handle );\n\t\treturn esc_url( $src );\n\t}\n\n\t/**\n\t * @param string $src\n\t * @return bool\n\t */\n\tpublic function in_default_dir($src) {\n\t\tif ( ! $this->default_dirs )\n\t\t\treturn true;\n\n\t\tforeach ( (array) $this->default_dirs as $test ) {\n\t\t\tif ( 0 === strpos($src, $test) )\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * @return array\n\t */\n\tpublic function do_footer_items() { // HTML 5 allows styles in the body, grab late enqueued items and output them in the footer.\n\t\t$this->do_items(false, 1);\n\t\treturn $this->done;\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function reset() {\n\t\t$this->do_concat = false;\n\t\t$this->concat = '';\n\t\t$this->concat_version = '';\n\t\t$this->print_html = '';\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/comment-template.php",
    "content": "<?php\n/**\n * Comment template functions\n *\n * These functions are meant to live inside of the WordPress loop.\n *\n * @package WordPress\n * @subpackage Template\n */\n\n/**\n * Retrieve the author of the current comment.\n *\n * If the comment has an empty comment_author field, then 'Anonymous' person is\n * assumed.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to retrieve the author.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n * @return string The comment author\n */\nfunction get_comment_author( $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\n\tif ( empty( $comment->comment_author ) ) {\n\t\tif ( $comment->user_id && $user = get_userdata( $comment->user_id ) )\n\t\t\t$author = $user->display_name;\n\t\telse\n\t\t\t$author = __('Anonymous');\n\t} else {\n\t\t$author = $comment->comment_author;\n\t}\n\n\t/**\n\t * Filter the returned comment author name.\n\t *\n\t * @since 1.5.0\n\t * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.\n\t *\n\t * @param string     $author     The comment author's username.\n\t * @param int        $comment_ID The comment ID.\n\t * @param WP_Comment $comment    The comment object.\n\t */\n\treturn apply_filters( 'get_comment_author', $author, $comment->comment_ID, $comment );\n}\n\n/**\n * Displays the author of the current comment.\n *\n * @since 0.71\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n */\nfunction comment_author( $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\t$author  = get_comment_author( $comment );\n\n\t/**\n\t * Filter the comment author's name for display.\n\t *\n\t * @since 1.2.0\n\t * @since 4.1.0 The `$comment_ID` parameter was added.\n\t *\n\t * @param string $author     The comment author's username.\n\t * @param int    $comment_ID The comment ID.\n\t */\n\techo apply_filters( 'comment_author', $author, $comment->comment_ID );\n}\n\n/**\n * Retrieve the email of the author of the current comment.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's email.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n * @return string The current comment author's email\n */\nfunction get_comment_author_email( $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\n\t/**\n\t * Filter the comment author's returned email address.\n\t *\n\t * @since 1.5.0\n\t * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.\n\t *\n\t * @param string     $comment_author_email The comment author's email address.\n\t * @param int        $comment_ID           The comment ID.\n\t * @param WP_Comment $comment              The comment object.\n\t */\n\treturn apply_filters( 'get_comment_author_email', $comment->comment_author_email, $comment->comment_ID, $comment );\n}\n\n/**\n * Display the email of the author of the current global $comment.\n *\n * Care should be taken to protect the email address and assure that email\n * harvesters do not capture your commentors' email address. Most assume that\n * their email address will not appear in raw form on the blog. Doing so will\n * enable anyone, including those that people don't want to get the email\n * address and use it for their own means good and bad.\n *\n * @since 0.71\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's email.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n */\nfunction comment_author_email( $comment_ID = 0 ) {\n\t$comment      = get_comment( $comment_ID );\n\t$author_email = get_comment_author_email( $comment );\n\n\t/**\n\t * Filter the comment author's email for display.\n\t *\n\t * @since 1.2.0\n\t * @since 4.1.0 The `$comment_ID` parameter was added.\n\t *\n\t * @param string $author_email The comment author's email address.\n\t * @param int    $comment_ID   The comment ID.\n\t */\n\techo apply_filters( 'author_email', $author_email, $comment->comment_ID );\n}\n\n/**\n * Display the html email link to the author of the current comment.\n *\n * Care should be taken to protect the email address and assure that email\n * harvesters do not capture your commentors' email address. Most assume that\n * their email address will not appear in raw form on the blog. Doing so will\n * enable anyone, including those that people don't want to get the email\n * address and use it for their own means good and bad.\n *\n * @since 0.71\n *\n * @param string $linktext Optional. Text to display instead of the comment author's email address.\n *                         Default empty.\n * @param string $before   Optional. Text or HTML to display before the email link. Default empty.\n * @param string $after    Optional. Text or HTML to display after the email link. Default empty.\n */\nfunction comment_author_email_link( $linktext = '', $before = '', $after = '' ) {\n\tif ( $link = get_comment_author_email_link( $linktext, $before, $after ) )\n\t\techo $link;\n}\n\n/**\n * Return the html email link to the author of the current comment.\n *\n * Care should be taken to protect the email address and assure that email\n * harvesters do not capture your commentors' email address. Most assume that\n * their email address will not appear in raw form on the blog. Doing so will\n * enable anyone, including those that people don't want to get the email\n * address and use it for their own means good and bad.\n *\n * @since 2.7.0\n *\n * @param string $linktext Optional. Text to display instead of the comment author's email address.\n *                         Default empty.\n * @param string $before   Optional. Text or HTML to display before the email link. Default empty.\n * @param string $after    Optional. Text or HTML to display after the email link. Default empty.\n * @return string\n */\nfunction get_comment_author_email_link( $linktext = '', $before = '', $after = '' ) {\n\t$comment = get_comment();\n\t/**\n\t * Filter the comment author's email for display.\n\t *\n\t * Care should be taken to protect the email address and assure that email\n\t * harvesters do not capture your commenter's email address.\n\t *\n\t * @since 1.2.0\n\t * @since 4.1.0 The `$comment` parameter was added.\n\t *\n\t * @param string     $comment_author_email The comment author's email address.\n\t * @param WP_Comment $comment              The comment object.\n\t */\n\t$email = apply_filters( 'comment_email', $comment->comment_author_email, $comment );\n\tif ((!empty($email)) && ($email != '@')) {\n\t$display = ($linktext != '') ? $linktext : $email;\n\t\t$return  = $before;\n\t\t$return .= sprintf( '<a href=\"%1$s\">%2$s</a>', esc_url( 'mailto:' . $email ), esc_html( $display ) );\n\t \t$return .= $after;\n\t\treturn $return;\n\t} else {\n\t\treturn '';\n\t}\n}\n\n/**\n * Retrieve the HTML link to the URL of the author of the current comment.\n *\n * Both get_comment_author_url() and get_comment_author() rely on get_comment(),\n * which falls back to the global comment variable if the $comment_ID argument is empty.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's link.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n * @return string The comment author name or HTML link for author's URL.\n */\nfunction get_comment_author_link( $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\t$url     = get_comment_author_url( $comment );\n\t$author  = get_comment_author( $comment );\n\n\tif ( empty( $url ) || 'http://' == $url )\n\t\t$return = $author;\n\telse\n\t\t$return = \"<a href='$url' rel='external nofollow' class='url'>$author</a>\";\n\n\t/**\n\t * Filter the comment author's link for display.\n\t *\n\t * @since 1.5.0\n\t * @since 4.1.0 The `$author` and `$comment_ID` parameters were added.\n\t *\n\t * @param string $return     The HTML-formatted comment author link.\n\t *                           Empty for an invalid URL.\n\t * @param string $author     The comment author's username.\n\t * @param int    $comment_ID The comment ID.\n\t */\n\treturn apply_filters( 'get_comment_author_link', $return, $author, $comment->comment_ID );\n}\n\n/**\n * Display the html link to the url of the author of the current comment.\n *\n * @since 0.71\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's link.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n */\nfunction comment_author_link( $comment_ID = 0 ) {\n\techo get_comment_author_link( $comment_ID );\n}\n\n/**\n * Retrieve the IP address of the author of the current comment.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's IP address.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n * @return string Comment author's IP address.\n */\nfunction get_comment_author_IP( $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\n\t/**\n\t * Filter the comment author's returned IP address.\n\t *\n\t * @since 1.5.0\n\t * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.\n\t *\n\t * @param string     $comment_author_IP The comment author's IP address.\n\t * @param int        $comment_ID        The comment ID.\n\t * @param WP_Comment $comment           The comment object.\n\t */\n\treturn apply_filters( 'get_comment_author_IP', $comment->comment_author_IP, $comment->comment_ID, $comment );\n}\n\n/**\n * Display the IP address of the author of the current comment.\n *\n * @since 0.71\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's IP address.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n */\nfunction comment_author_IP( $comment_ID = 0 ) {\n\techo esc_html( get_comment_author_IP( $comment_ID ) );\n}\n\n/**\n * Retrieve the url of the author of the current comment.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's URL.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n * @return string Comment author URL.\n */\nfunction get_comment_author_url( $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\t$url = ('http://' == $comment->comment_author_url) ? '' : $comment->comment_author_url;\n\t$url = esc_url( $url, array('http', 'https') );\n\n\t/**\n\t * Filter the comment author's URL.\n\t *\n\t * @since 1.5.0\n\t * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.\n\t *\n\t * @param string     $url        The comment author's URL.\n\t * @param int        $comment_ID The comment ID.\n\t * @param WP_Comment $comment    The comment object.\n\t */\n\treturn apply_filters( 'get_comment_author_url', $url, $comment->comment_ID, $comment );\n}\n\n/**\n * Display the url of the author of the current comment.\n *\n * @since 0.71\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's URL.\n *\t\t\t\t\t\t\t\t\t Default current comment.\n */\nfunction comment_author_url( $comment_ID = 0 ) {\n\t$comment    = get_comment( $comment_ID );\n\t$author_url = get_comment_author_url( $comment );\n\n\t/**\n\t * Filter the comment author's URL for display.\n\t *\n\t * @since 1.2.0\n\t * @since 4.1.0 The `$comment_ID` parameter was added.\n\t *\n\t * @param string $author_url The comment author's URL.\n\t * @param int    $comment_ID The comment ID.\n\t */\n\techo apply_filters( 'comment_url', $author_url, $comment->comment_ID );\n}\n\n/**\n * Retrieves the HTML link of the url of the author of the current comment.\n *\n * $linktext parameter is only used if the URL does not exist for the comment\n * author. If the URL does exist then the URL will be used and the $linktext\n * will be ignored.\n *\n * Encapsulate the HTML link between the $before and $after. So it will appear\n * in the order of $before, link, and finally $after.\n *\n * @since 1.5.0\n *\n * @param string $linktext Optional. The text to display instead of the comment\n *                         author's email address. Default empty.\n * @param string $before   Optional. The text or HTML to display before the email link.\n *                         Default empty.\n * @param string $after    Optional. The text or HTML to display after the email link.\n *                         Default empty.\n * @return string The HTML link between the $before and $after parameters.\n */\nfunction get_comment_author_url_link( $linktext = '', $before = '', $after = '' ) {\n\t$url = get_comment_author_url();\n\t$display = ($linktext != '') ? $linktext : $url;\n\t$display = str_replace( 'http://www.', '', $display );\n\t$display = str_replace( 'http://', '', $display );\n\n\tif ( '/' == substr($display, -1) ) {\n\t\t$display = substr($display, 0, -1);\n\t}\n\n\t$return = \"$before<a href='$url' rel='external'>$display</a>$after\";\n\n\t/**\n\t * Filter the comment author's returned URL link.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $return The HTML-formatted comment author URL link.\n\t */\n\treturn apply_filters( 'get_comment_author_url_link', $return );\n}\n\n/**\n * Displays the HTML link of the url of the author of the current comment.\n *\n * @since 0.71\n *\n * @param string $linktext Optional. Text to display instead of the comment author's\n *                         email address. Default empty.\n * @param string $before   Optional. Text or HTML to display before the email link.\n *                         Default empty.\n * @param string $after    Optional. Text or HTML to display after the email link.\n *                         Default empty.\n */\nfunction comment_author_url_link( $linktext = '', $before = '', $after = '' ) {\n\techo get_comment_author_url_link( $linktext, $before, $after );\n}\n\n/**\n * Generates semantic classes for each comment element.\n *\n * @since 2.7.0\n * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object.\n *\n * @param string|array   $class    Optional. One or more classes to add to the class list.\n *                                 Default empty.\n * @param int|WP_Comment $comment  Comment ID or WP_Comment object. Default current comment.\n * @param int|WP_Post    $post_id  Post ID or WP_Post object. Default current post.\n * @param bool           $echo     Optional. Whether to cho or return the output.\n *                                 Default true.\n * @return string If `$echo` is false, the class will be returned. Void otherwise.\n */\nfunction comment_class( $class = '', $comment = null, $post_id = null, $echo = true ) {\n\t// Separates classes with a single space, collates classes for comment DIV\n\t$class = 'class=\"' . join( ' ', get_comment_class( $class, $comment, $post_id ) ) . '\"';\n\tif ( $echo)\n\t\techo $class;\n\telse\n\t\treturn $class;\n}\n\n/**\n * Returns the classes for the comment div as an array.\n *\n * @since 2.7.0\n * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object.\n *\n * @global int $comment_alt\n * @global int $comment_depth\n * @global int $comment_thread_alt\n *\n * @param string|array   $class      Optional. One or more classes to add to the class list. Default empty.\n * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. Default current comment.\n * @param int|WP_Post    $post_id    Post ID or WP_Post object. Default current post.\n * @return array An array of classes.\n */\nfunction get_comment_class( $class = '', $comment_id = null, $post_id = null ) {\n\tglobal $comment_alt, $comment_depth, $comment_thread_alt;\n\n\t$classes = array();\n\n\t$comment = get_comment( $comment_id );\n\tif ( ! $comment ) {\n\t\treturn $classes;\n\t}\n\n\t// Get the comment type (comment, trackback),\n\t$classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type;\n\n\t// Add classes for comment authors that are registered users.\n\tif ( $comment->user_id > 0 && $user = get_userdata( $comment->user_id ) ) {\n\t\t$classes[] = 'byuser';\n\t\t$classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id );\n\t\t// For comment authors who are the author of the post\n\t\tif ( $post = get_post($post_id) ) {\n\t\t\tif ( $comment->user_id === $post->post_author ) {\n\t\t\t\t$classes[] = 'bypostauthor';\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( empty($comment_alt) )\n\t\t$comment_alt = 0;\n\tif ( empty($comment_depth) )\n\t\t$comment_depth = 1;\n\tif ( empty($comment_thread_alt) )\n\t\t$comment_thread_alt = 0;\n\n\tif ( $comment_alt % 2 ) {\n\t\t$classes[] = 'odd';\n\t\t$classes[] = 'alt';\n\t} else {\n\t\t$classes[] = 'even';\n\t}\n\n\t$comment_alt++;\n\n\t// Alt for top-level comments\n\tif ( 1 == $comment_depth ) {\n\t\tif ( $comment_thread_alt % 2 ) {\n\t\t\t$classes[] = 'thread-odd';\n\t\t\t$classes[] = 'thread-alt';\n\t\t} else {\n\t\t\t$classes[] = 'thread-even';\n\t\t}\n\t\t$comment_thread_alt++;\n\t}\n\n\t$classes[] = \"depth-$comment_depth\";\n\n\tif ( !empty($class) ) {\n\t\tif ( !is_array( $class ) )\n\t\t\t$class = preg_split('#\\s+#', $class);\n\t\t$classes = array_merge($classes, $class);\n\t}\n\n\t$classes = array_map('esc_attr', $classes);\n\n\t/**\n\t * Filter the returned CSS classes for the current comment.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array       $classes    An array of comment classes.\n\t * @param string      $class      A comma-separated list of additional classes added to the list.\n\t * @param int         $comment_id The comment id.\n\t * @param WP_Comment  $comment    The comment object.\n\t * @param int|WP_Post $post_id    The post ID or WP_Post object.\n\t */\n\treturn apply_filters( 'comment_class', $classes, $class, $comment->comment_ID, $comment, $post_id );\n}\n\n/**\n * Retrieve the comment date of the current comment.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param string          $d          Optional. The format of the date. Default user's setting.\n * @param int|WP_Comment  $comment_ID WP_Comment or ID of the comment for which to get the date.\n *                                    Default current comment.\n * @return string The comment's date.\n */\nfunction get_comment_date( $d = '', $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\tif ( '' == $d )\n\t\t$date = mysql2date(get_option('date_format'), $comment->comment_date);\n\telse\n\t\t$date = mysql2date($d, $comment->comment_date);\n\t/**\n\t * Filter the returned comment date.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string|int $date    Formatted date string or Unix timestamp.\n\t * @param string     $d       The format of the date.\n\t * @param WP_Comment $comment The comment object.\n\t */\n\treturn apply_filters( 'get_comment_date', $date, $d, $comment );\n}\n\n/**\n * Display the comment date of the current comment.\n *\n * @since 0.71\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param string         $d          Optional. The format of the date. Default user's settings.\n * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the date.\n *                                   Default current comment.\n */\nfunction comment_date( $d = '', $comment_ID = 0 ) {\n\techo get_comment_date( $d, $comment_ID );\n}\n\n/**\n * Retrieve the excerpt of the current comment.\n *\n * Will cut each word and only output the first 20 words with '&hellip;' at the end.\n * If the word count is less than 20, then no truncating is done and no '&hellip;'\n * will appear.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID  WP_Comment or ID of the comment for which to get the excerpt.\n *                                    Default current comment.\n * @return string The maybe truncated comment with 20 words or less.\n */\nfunction get_comment_excerpt( $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\t$comment_text = strip_tags( str_replace( array( \"\\n\", \"\\r\" ), ' ', $comment->comment_content ) );\n\t$words = explode( ' ', $comment_text );\n\n\t/**\n\t * Filter the amount of words used in the comment excerpt.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param int $comment_excerpt_length The amount of words you want to display in the comment excerpt.\n\t */\n\t$comment_excerpt_length = apply_filters( 'comment_excerpt_length', 20 );\n\n\t$use_ellipsis = count( $words ) > $comment_excerpt_length;\n\tif ( $use_ellipsis ) {\n\t\t$words = array_slice( $words, 0, $comment_excerpt_length );\n\t}\n\n\t$excerpt = trim( join( ' ', $words ) );\n\tif ( $use_ellipsis ) {\n\t\t$excerpt .= '&hellip;';\n\t}\n\t/**\n\t * Filter the retrieved comment excerpt.\n\t *\n\t * @since 1.5.0\n\t * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.\n\t *\n\t * @param string     $excerpt    The comment excerpt text.\n\t * @param int        $comment_ID The comment ID.\n\t * @param WP_Comment $comment    The comment object.\n\t */\n\treturn apply_filters( 'get_comment_excerpt', $excerpt, $comment->comment_ID, $comment );\n}\n\n/**\n * Display the excerpt of the current comment.\n *\n * @since 1.2.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID  WP_Comment or ID of the comment for which to print the excerpt.\n *                                    Default current comment.\n */\nfunction comment_excerpt( $comment_ID = 0 ) {\n\t$comment         = get_comment( $comment_ID );\n\t$comment_excerpt = get_comment_excerpt( $comment );\n\n\t/**\n\t * Filter the comment excerpt for display.\n\t *\n\t * @since 1.2.0\n\t * @since 4.1.0 The `$comment_ID` parameter was added.\n\t *\n\t * @param string $comment_excerpt The comment excerpt text.\n\t * @param int    $comment_ID      The comment ID.\n\t */\n\techo apply_filters( 'comment_excerpt', $comment_excerpt, $comment->comment_ID );\n}\n\n/**\n * Retrieve the comment id of the current comment.\n *\n * @since 1.5.0\n *\n * @return int The comment ID.\n */\nfunction get_comment_ID() {\n\t$comment = get_comment();\n\n\t/**\n\t * Filter the returned comment ID.\n\t *\n\t * @since 1.5.0\n\t * @since 4.1.0 The `$comment_ID` parameter was added.\n\t *\n\t * @param int        $comment_ID The current comment ID.\n\t * @param WP_Comment $comment    The comment object.\n\t */\n\treturn apply_filters( 'get_comment_ID', $comment->comment_ID, $comment );\n}\n\n/**\n * Display the comment id of the current comment.\n *\n * @since 0.71\n */\nfunction comment_ID() {\n\techo get_comment_ID();\n}\n\n/**\n * Retrieve the link to a given comment.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. Added `$cpage` argument.\n *\n * @see get_page_of_comment()\n *\n * @global WP_Rewrite $wp_rewrite\n * @global bool       $in_comment_loop\n *\n * @param WP_Comment|int|null $comment Comment to retrieve. Default current comment.\n * @param array               $args {\n *     An array of optional arguments to override the defaults.\n *\n *     @type string     $type      Passed to {@see get_page_of_comment()}.\n *     @type int        $page      Current page of comments, for calculating comment pagination.\n *     @type int        $per_page  Per-page value for comment pagination.\n *     @type int        $max_depth Passed to {@see get_page_of_comment()}.\n *     @type int|string $cpage     Value to use for the comment's \"comment-page\" or \"cpage\" value. If provided, this\n *                                 value overrides any value calculated from `$page` and `$per_page`.\n * }\n * @return string The permalink to the given comment.\n */\nfunction get_comment_link( $comment = null, $args = array() ) {\n\tglobal $wp_rewrite, $in_comment_loop;\n\n\t$comment = get_comment($comment);\n\n\t// Backwards compat\n\tif ( ! is_array( $args ) ) {\n\t\t$args = array( 'page' => $args );\n\t}\n\n\t$defaults = array(\n\t\t'type'      => 'all',\n\t\t'page'      => '',\n\t\t'per_page'  => '',\n\t\t'max_depth' => '',\n\t\t'cpage'     => null,\n\t);\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$link = get_permalink( $comment->comment_post_ID );\n\n\t// The 'cpage' param takes precedence.\n\tif ( ! is_null( $args['cpage'] ) ) {\n\t\t$cpage = $args['cpage'];\n\n\t// No 'cpage' is provided, so we calculate one.\n\t} else {\n\t\tif ( '' === $args['per_page'] && get_option( 'page_comments' ) ) {\n\t\t\t$args['per_page'] = get_option('comments_per_page');\n\t\t}\n\n\t\tif ( empty( $args['per_page'] ) ) {\n\t\t\t$args['per_page'] = 0;\n\t\t\t$args['page'] = 0;\n\t\t}\n\n\t\t$cpage = $args['page'];\n\n\t\tif ( '' == $cpage ) {\n\t\t\tif ( ! empty( $in_comment_loop ) ) {\n\t\t\t\t$cpage = get_query_var( 'cpage' );\n\t\t\t} else {\n\t\t\t\t// Requires a database hit, so we only do it when we can't figure out from context.\n\t\t\t\t$cpage = get_page_of_comment( $comment->comment_ID, $args );\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * If the default page displays the oldest comments, the permalinks for comments on the default page\n\t\t * do not need a 'cpage' query var.\n\t\t */\n\t\t$default_comments_page = get_option( 'default_comments_page' );\n\t\tif ( 'oldest' === get_option( 'default_comments_page' ) && 1 === $cpage ) {\n\t\t\t$cpage = '';\n\t\t}\n\t}\n\n\tif ( $cpage && get_option( 'page_comments' ) ) {\n\t\tif ( $wp_rewrite->using_permalinks() ) {\n\t\t\tif ( $cpage ) {\n\t\t\t\t$link = trailingslashit( $link ) . $wp_rewrite->comments_pagination_base . '-' . $cpage;\n\t\t\t}\n\n\t\t\t$link = user_trailingslashit( $link, 'comment' );\n\t\t} elseif ( $cpage ) {\n\t\t\t$link = add_query_arg( 'cpage', $cpage, $link );\n\t\t}\n\n\t}\n\n\tif ( $wp_rewrite->using_permalinks() ) {\n\t\t$link = user_trailingslashit( $link, 'comment' );\n\t}\n\n\t$link = $link . '#comment-' . $comment->comment_ID;\n\n\t/**\n\t * Filter the returned single comment permalink.\n\t *\n\t * @since 2.8.0\n\t * @since 4.4.0 Added the `$cpage` parameter.\n\t *\n\t * @see get_page_of_comment()\n\t *\n\t * @param string     $link    The comment permalink with '#comment-$id' appended.\n\t * @param WP_Comment $comment The current comment object.\n\t * @param array      $args    An array of arguments to override the defaults.\n\t * @param int        $cpage   The calculated 'cpage' value.\n\t */\n\treturn apply_filters( 'get_comment_link', $link, $comment, $args, $cpage );\n}\n\n/**\n * Retrieves the link to the current post comments.\n *\n * @since 1.5.0\n *\n * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post.\n * @return string The link to the comments.\n */\nfunction get_comments_link( $post_id = 0 ) {\n\t$hash = get_comments_number( $post_id ) ? '#comments' : '#respond';\n\t$comments_link = get_permalink( $post_id ) . $hash;\n\n\t/**\n\t * Filter the returned post comments permalink.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string      $comments_link Post comments permalink with '#comments' appended.\n\t * @param int|WP_Post $post_id       Post ID or WP_Post object.\n\t */\n\treturn apply_filters( 'get_comments_link', $comments_link, $post_id );\n}\n\n/**\n * Display the link to the current post comments.\n *\n * @since 0.71\n *\n * @param string $deprecated   Not Used.\n * @param string $deprecated_2 Not Used.\n */\nfunction comments_link( $deprecated = '', $deprecated_2 = '' ) {\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '0.72' );\n\tif ( !empty( $deprecated_2 ) )\n\t\t_deprecated_argument( __FUNCTION__, '1.3' );\n\techo esc_url( get_comments_link() );\n}\n\n/**\n * Retrieve the amount of comments a post has.\n *\n * @since 1.5.0\n *\n * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post.\n * @return int The number of comments a post has.\n */\nfunction get_comments_number( $post_id = 0 ) {\n\t$post = get_post( $post_id );\n\n\tif ( ! $post ) {\n\t\t$count = 0;\n\t} else {\n\t\t$count = $post->comment_count;\n\t\t$post_id = $post->ID;\n\t}\n\n\t/**\n\t * Filter the returned comment count for a post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param int $count   Number of comments a post has.\n\t * @param int $post_id Post ID.\n\t */\n\treturn apply_filters( 'get_comments_number', $count, $post_id );\n}\n\n/**\n * Display the language string for the number of comments the current post has.\n *\n * @since 0.71\n *\n * @param string $zero       Optional. Text for no comments. Default false.\n * @param string $one        Optional. Text for one comment. Default false.\n * @param string $more       Optional. Text for more than one comment. Default false.\n * @param string $deprecated Not used.\n */\nfunction comments_number( $zero = false, $one = false, $more = false, $deprecated = '' ) {\n\tif ( ! empty( $deprecated ) ) {\n\t\t_deprecated_argument( __FUNCTION__, '1.3' );\n\t}\n\techo get_comments_number_text( $zero, $one, $more );\n}\n\n/**\n * Display the language string for the number of comments the current post has.\n *\n * @since 4.0.0\n *\n * @param string $zero Optional. Text for no comments. Default false.\n * @param string $one  Optional. Text for one comment. Default false.\n * @param string $more Optional. Text for more than one comment. Default false.\n */\nfunction get_comments_number_text( $zero = false, $one = false, $more = false ) {\n\t$number = get_comments_number();\n\n\tif ( $number > 1 ) {\n\t\tif ( false === $more ) {\n\t\t\t/* translators: %s: number of comments */\n\t\t\t$output = sprintf( _n( '%s Comment', '%s Comments', $number ), number_format_i18n( $number ) );\n\t\t} else {\n\t\t\t// % Comments\n\t\t\t$output = str_replace( '%', number_format_i18n( $number ), $more );\n\t\t}\n\t} elseif ( $number == 0 ) {\n\t\t$output = ( false === $zero ) ? __( 'No Comments' ) : $zero;\n\t} else { // must be one\n\t\t$output = ( false === $one ) ? __( '1 Comment' ) : $one;\n\t}\n\t/**\n\t * Filter the comments count for display.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @see _n()\n\t *\n\t * @param string $output A translatable string formatted based on whether the count\n\t *                       is equal to 0, 1, or 1+.\n\t * @param int    $number The number of post comments.\n\t */\n\treturn apply_filters( 'comments_number', $output, $number );\n}\n\n/**\n * Retrieve the text of the current comment.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @see Walker_Comment::comment()\n *\n * @param int|WP_Comment  $comment_ID WP_Comment or ID of the comment for which to get the text.\n *                                    Default current comment.\n * @param array           $args       Optional. An array of arguments. Default empty.\n * @return string The comment content.\n */\nfunction get_comment_text( $comment_ID = 0, $args = array() ) {\n\t$comment = get_comment( $comment_ID );\n\n\t/**\n\t * Filter the text of a comment.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @see Walker_Comment::comment()\n\t *\n\t * @param string     $comment_content Text of the comment.\n\t * @param WP_Comment $comment         The comment object.\n\t * @param array      $args            An array of arguments.\n\t */\n\treturn apply_filters( 'get_comment_text', $comment->comment_content, $comment, $args );\n}\n\n/**\n * Display the text of the current comment.\n *\n * @since 0.71\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @see Walker_Comment::comment()\n *\n * @param int|WP_Comment  $comment_ID WP_Comment or ID of the comment for which to print the text.\n *                                    Default current comment.\n * @param array           $args       Optional. An array of arguments. Default empty array. Default empty.\n */\nfunction comment_text( $comment_ID = 0, $args = array() ) {\n\t$comment = get_comment( $comment_ID );\n\n\t$comment_text = get_comment_text( $comment, $args );\n\t/**\n\t * Filter the text of a comment to be displayed.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @see Walker_Comment::comment()\n\t *\n\t * @param string     $comment_text Text of the current comment.\n\t * @param WP_Comment $comment      The comment object.\n\t * @param array      $args         An array of arguments.\n\t */\n\techo apply_filters( 'comment_text', $comment_text, $comment, $args );\n}\n\n/**\n * Retrieve the comment time of the current comment.\n *\n * @since 1.5.0\n *\n * @param string $d         Optional. The format of the time. Default user's settings.\n * @param bool   $gmt       Optional. Whether to use the GMT date. Default false.\n * @param bool   $translate Optional. Whether to translate the time (for use in feeds).\n *                          Default true.\n * @return string The formatted time.\n */\nfunction get_comment_time( $d = '', $gmt = false, $translate = true ) {\n\t$comment = get_comment();\n\n\t$comment_date = $gmt ? $comment->comment_date_gmt : $comment->comment_date;\n\tif ( '' == $d )\n\t\t$date = mysql2date(get_option('time_format'), $comment_date, $translate);\n\telse\n\t\t$date = mysql2date($d, $comment_date, $translate);\n\n\t/**\n\t * Filter the returned comment time.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string|int $date      The comment time, formatted as a date string or Unix timestamp.\n\t * @param string     $d         Date format.\n\t * @param bool       $gmt       Whether the GMT date is in use.\n\t * @param bool       $translate Whether the time is translated.\n\t * @param WP_Comment $comment   The comment object.\n\t */\n\treturn apply_filters( 'get_comment_time', $date, $d, $gmt, $translate, $comment );\n}\n\n/**\n * Display the comment time of the current comment.\n *\n * @since 0.71\n *\n * @param string $d Optional. The format of the time. Default user's settings.\n */\nfunction comment_time( $d = '' ) {\n\techo get_comment_time($d);\n}\n\n/**\n * Retrieve the comment type of the current comment.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object.\n *\n * @param int|WP_Comment $comment_ID Optional. WP_Comment or ID of the comment for which to get the type.\n *                                   Default current comment.\n * @return string The comment type.\n */\nfunction get_comment_type( $comment_ID = 0 ) {\n\t$comment = get_comment( $comment_ID );\n\tif ( '' == $comment->comment_type )\n\t\t$comment->comment_type = 'comment';\n\n\t/**\n\t * Filter the returned comment type.\n\t *\n\t * @since 1.5.0\n\t * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.\n\t *\n\t * @param string     $comment_type The type of comment, such as 'comment', 'pingback', or 'trackback'.\n\t * @param int \t     $comment_ID   The comment ID.\n\t * @param WP_Comment $comment      The comment object.\n\t */\n\treturn apply_filters( 'get_comment_type', $comment->comment_type, $comment->comment_ID, $comment );\n}\n\n/**\n * Display the comment type of the current comment.\n *\n * @since 0.71\n *\n * @param string $commenttxt   Optional. String to display for comment type. Default false.\n * @param string $trackbacktxt Optional. String to display for trackback type. Default false.\n * @param string $pingbacktxt  Optional. String to display for pingback type. Default false.\n */\nfunction comment_type( $commenttxt = false, $trackbacktxt = false, $pingbacktxt = false ) {\n\tif ( false === $commenttxt ) $commenttxt = _x( 'Comment', 'noun' );\n\tif ( false === $trackbacktxt ) $trackbacktxt = __( 'Trackback' );\n\tif ( false === $pingbacktxt ) $pingbacktxt = __( 'Pingback' );\n\t$type = get_comment_type();\n\tswitch( $type ) {\n\t\tcase 'trackback' :\n\t\t\techo $trackbacktxt;\n\t\t\tbreak;\n\t\tcase 'pingback' :\n\t\t\techo $pingbacktxt;\n\t\t\tbreak;\n\t\tdefault :\n\t\t\techo $commenttxt;\n\t}\n}\n\n/**\n * Retrieve The current post's trackback URL.\n *\n * There is a check to see if permalink's have been enabled and if so, will\n * retrieve the pretty path. If permalinks weren't enabled, the ID of the\n * current post is used and appended to the correct page to go to.\n *\n * @since 1.5.0\n *\n * @return string The trackback URL after being filtered.\n */\nfunction get_trackback_url() {\n\tif ( '' != get_option('permalink_structure') )\n\t\t$tb_url = trailingslashit(get_permalink()) . user_trailingslashit('trackback', 'single_trackback');\n\telse\n\t\t$tb_url = get_option('siteurl') . '/wp-trackback.php?p=' . get_the_ID();\n\n\t/**\n\t * Filter the returned trackback URL.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param string $tb_url The trackback URL.\n\t */\n\treturn apply_filters( 'trackback_url', $tb_url );\n}\n\n/**\n * Display the current post's trackback URL.\n *\n * @since 0.71\n *\n * @param bool $deprecated_echo Not used.\n * @return void|string Should only be used to echo the trackback URL, use get_trackback_url()\n *                     for the result instead.\n */\nfunction trackback_url( $deprecated_echo = true ) {\n\tif ( true !== $deprecated_echo ) {\n\t\t_deprecated_argument( __FUNCTION__, '2.5',\n\t\t\t/* translators: %s: get_trackback_url() */\n\t\t\tsprintf( __( 'Use %s instead if you do not want the value echoed.' ),\n\t\t\t\t'<code>get_trackback_url()</code>'\n\t\t\t)\n\t\t);\n\t}\n\n\tif ( $deprecated_echo ) {\n\t\techo get_trackback_url();\n\t} else {\n\t\treturn get_trackback_url();\n\t}\n}\n\n/**\n * Generate and display the RDF for the trackback information of current post.\n *\n * Deprecated in 3.0.0, and restored in 3.0.1.\n *\n * @since 0.71\n *\n * @param int $deprecated Not used (Was $timezone = 0).\n */\nfunction trackback_rdf( $deprecated = '' ) {\n\tif ( ! empty( $deprecated ) ) {\n\t\t_deprecated_argument( __FUNCTION__, '2.5' );\n\t}\n\n\tif ( isset( $_SERVER['HTTP_USER_AGENT'] ) && false !== stripos( $_SERVER['HTTP_USER_AGENT'], 'W3C_Validator' ) ) {\n\t\treturn;\n\t}\n\n\techo '<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n\t\t\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\t\t\txmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\">\n\t\t<rdf:Description rdf:about=\"';\n\tthe_permalink();\n\techo '\"'.\"\\n\";\n\techo '    dc:identifier=\"';\n\tthe_permalink();\n\techo '\"'.\"\\n\";\n\techo '    dc:title=\"'.str_replace('--', '&#x2d;&#x2d;', wptexturize(strip_tags(get_the_title()))).'\"'.\"\\n\";\n\techo '    trackback:ping=\"'.get_trackback_url().'\"'.\" />\\n\";\n\techo '</rdf:RDF>';\n}\n\n/**\n * Whether the current post is open for comments.\n *\n * @since 1.5.0\n *\n * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post.\n * @return bool True if the comments are open.\n */\nfunction comments_open( $post_id = null ) {\n\n\t$_post = get_post($post_id);\n\n\t$open = ( 'open' == $_post->comment_status );\n\n\t/**\n\t * Filter whether the current post is open for comments.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param bool        $open    Whether the current post is open for comments.\n\t * @param int|WP_Post $post_id The post ID or WP_Post object.\n\t */\n\treturn apply_filters( 'comments_open', $open, $post_id );\n}\n\n/**\n * Whether the current post is open for pings.\n *\n * @since 1.5.0\n *\n * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post.\n * @return bool True if pings are accepted\n */\nfunction pings_open( $post_id = null ) {\n\n\t$_post = get_post($post_id);\n\n\t$open = ( 'open' == $_post->ping_status );\n\n\t/**\n\t * Filter whether the current post is open for pings.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param bool        $open    Whether the current post is open for pings.\n\t * @param int|WP_Post $post_id The post ID or WP_Post object.\n\t */\n\treturn apply_filters( 'pings_open', $open, $post_id );\n}\n\n/**\n * Display form token for unfiltered comments.\n *\n * Will only display nonce token if the current user has permissions for\n * unfiltered html. Won't display the token for other users.\n *\n * The function was backported to 2.0.10 and was added to versions 2.1.3 and\n * above. Does not exist in versions prior to 2.0.10 in the 2.0 branch and in\n * the 2.1 branch, prior to 2.1.3. Technically added in 2.2.0.\n *\n * Backported to 2.0.10.\n *\n * @since 2.1.3\n */\nfunction wp_comment_form_unfiltered_html_nonce() {\n\t$post = get_post();\n\t$post_id = $post ? $post->ID : 0;\n\n\tif ( current_user_can( 'unfiltered_html' ) ) {\n\t\twp_nonce_field( 'unfiltered-html-comment_' . $post_id, '_wp_unfiltered_html_comment_disabled', false );\n\t\techo \"<script>(function(){if(window===window.parent){document.getElementById('_wp_unfiltered_html_comment_disabled').name='_wp_unfiltered_html_comment';}})();</script>\\n\";\n\t}\n}\n\n/**\n * Load the comment template specified in $file.\n *\n * Will not display the comments template if not on single post or page, or if\n * the post does not have comments.\n *\n * Uses the WordPress database object to query for the comments. The comments\n * are passed through the 'comments_array' filter hook with the list of comments\n * and the post ID respectively.\n *\n * The $file path is passed through a filter hook called, 'comments_template'\n * which includes the TEMPLATEPATH and $file combined. Tries the $filtered path\n * first and if it fails it will require the default comment template from the\n * default theme. If either does not exist, then the WordPress process will be\n * halted. It is advised for that reason, that the default theme is not deleted.\n *\n * @uses $withcomments Will not try to get the comments if the post has none.\n *\n * @since 1.5.0\n *\n * @global WP_Query   $wp_query\n * @global WP_Post    $post\n * @global wpdb       $wpdb\n * @global int        $id\n * @global WP_Comment $comment\n * @global string     $user_login\n * @global int        $user_ID\n * @global string     $user_identity\n * @global bool       $overridden_cpage\n *\n * @param string $file              Optional. The file to load. Default '/comments.php'.\n * @param bool   $separate_comments Optional. Whether to separate the comments by comment type.\n *                                  Default false.\n */\nfunction comments_template( $file = '/comments.php', $separate_comments = false ) {\n\tglobal $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity, $overridden_cpage;\n\n\tif ( !(is_single() || is_page() || $withcomments) || empty($post) )\n\t\treturn;\n\n\tif ( empty($file) )\n\t\t$file = '/comments.php';\n\n\t$req = get_option('require_name_email');\n\n\t/*\n\t * Comment author information fetched from the comment cookies.\n\t */\n\t$commenter = wp_get_current_commenter();\n\n\t/*\n\t * The name of the current comment author escaped for use in attributes.\n\t * Escaped by sanitize_comment_cookies().\n\t */\n\t$comment_author = $commenter['comment_author'];\n\n\t/*\n\t * The email address of the current comment author escaped for use in attributes.\n\t * Escaped by sanitize_comment_cookies().\n\t */\n\t$comment_author_email = $commenter['comment_author_email'];\n\n\t/*\n\t * The url of the current comment author escaped for use in attributes.\n\t */\n\t$comment_author_url = esc_url($commenter['comment_author_url']);\n\n\t$comment_args = array(\n\t\t'orderby' => 'comment_date_gmt',\n\t\t'order' => 'ASC',\n\t\t'status'  => 'approve',\n\t\t'post_id' => $post->ID,\n\t\t'no_found_rows' => false,\n\t\t'update_comment_meta_cache' => false, // We lazy-load comment meta for performance.\n\t);\n\n\tif ( get_option('thread_comments') ) {\n\t\t$comment_args['hierarchical'] = 'threaded';\n\t} else {\n\t\t$comment_args['hierarchical'] = false;\n\t}\n\n\tif ( $user_ID ) {\n\t\t$comment_args['include_unapproved'] = array( $user_ID );\n\t} elseif ( ! empty( $comment_author_email ) ) {\n\t\t$comment_args['include_unapproved'] = array( $comment_author_email );\n\t}\n\n\t$per_page = 0;\n\tif ( get_option( 'page_comments' ) ) {\n\t\t$per_page = (int) get_query_var( 'comments_per_page' );\n\t\tif ( 0 === $per_page ) {\n\t\t\t$per_page = (int) get_option( 'comments_per_page' );\n\t\t}\n\n\t\t$comment_args['number'] = $per_page;\n\t\t$page = (int) get_query_var( 'cpage' );\n\n\t\tif ( $page ) {\n\t\t\t$comment_args['offset'] = ( $page - 1 ) * $per_page;\n\t\t} elseif ( 'oldest' === get_option( 'default_comments_page' ) ) {\n\t\t\t$comment_args['offset'] = 0;\n\t\t} else {\n\t\t\t// If fetching the first page of 'newest', we need a top-level comment count.\n\t\t\t$top_level_query = new WP_Comment_Query();\n\t\t\t$top_level_args  = array(\n\t\t\t\t'count'   => true,\n\t\t\t\t'orderby' => false,\n\t\t\t\t'post_id' => $post->ID,\n\t\t\t\t'status'  => 'approve',\n\t\t\t);\n\n\t\t\tif ( $comment_args['hierarchical'] ) {\n\t\t\t\t$top_level_args['parent'] = 0;\n\t\t\t}\n\n\t\t\tif ( isset( $comment_args['include_unapproved'] ) ) {\n\t\t\t\t$top_level_args['include_unapproved'] = $comment_args['include_unapproved'];\n\t\t\t}\n\n\t\t\t$top_level_count = $top_level_query->query( $top_level_args );\n\n\t\t\t$comment_args['offset'] = ( ceil( $top_level_count / $per_page ) - 1 ) * $per_page;\n\t\t}\n\t}\n\n\t$comment_query = new WP_Comment_Query( $comment_args );\n\t$_comments = $comment_query->comments;\n\n\t// Trees must be flattened before they're passed to the walker.\n\tif ( $comment_args['hierarchical'] ) {\n\t\t$comments_flat = array();\n\t\tforeach ( $_comments as $_comment ) {\n\t\t\t$comments_flat[]  = $_comment;\n\t\t\t$comment_children = $_comment->get_children( array(\n\t\t\t\t'format' => 'flat',\n\t\t\t\t'status' => $comment_args['status'],\n\t\t\t\t'orderby' => $comment_args['orderby']\n\t\t\t) );\n\n\t\t\tforeach ( $comment_children as $comment_child ) {\n\t\t\t\t$comments_flat[] = $comment_child;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t$comments_flat = $_comments;\n\t}\n\n\t/**\n\t * Filter the comments array.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array $comments Array of comments supplied to the comments template.\n\t * @param int   $post_ID  Post ID.\n\t */\n\t$wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID );\n\n\t// Set up lazy-loading for comment metadata.\n\tadd_action( 'get_comment_metadata', array( $wp_query, 'lazyload_comment_meta' ), 10, 2 );\n\n\t$comments = &$wp_query->comments;\n\t$wp_query->comment_count = count($wp_query->comments);\n\t$wp_query->max_num_comment_pages = $comment_query->max_num_pages;\n\n\tif ( $separate_comments ) {\n\t\t$wp_query->comments_by_type = separate_comments($comments);\n\t\t$comments_by_type = &$wp_query->comments_by_type;\n\t} else {\n\t\t$wp_query->comments_by_type = array();\n\t}\n\n\t$overridden_cpage = false;\n\tif ( '' == get_query_var( 'cpage' ) && $wp_query->max_num_comment_pages > 1 ) {\n\t\tset_query_var( 'cpage', 'newest' == get_option('default_comments_page') ? get_comment_pages_count() : 1 );\n\t\t$overridden_cpage = true;\n\t}\n\n\tif ( !defined('COMMENTS_TEMPLATE') )\n\t\tdefine('COMMENTS_TEMPLATE', true);\n\n\t$theme_template = STYLESHEETPATH . $file;\n\t/**\n\t * Filter the path to the theme template file used for the comments template.\n\t *\n\t * @since 1.5.1\n\t *\n\t * @param string $theme_template The path to the theme template file.\n\t */\n\t$include = apply_filters( 'comments_template', $theme_template );\n\tif ( file_exists( $include ) )\n\t\trequire( $include );\n\telseif ( file_exists( TEMPLATEPATH . $file ) )\n\t\trequire( TEMPLATEPATH . $file );\n\telse // Backward compat code will be removed in a future release\n\t\trequire( ABSPATH . WPINC . '/theme-compat/comments.php');\n}\n\n/**\n * Display the JS popup script to show a comment.\n *\n * If the $file parameter is empty, then the home page is assumed. The defaults\n * for the window are 400px by 400px.\n *\n * For the comment link popup to work, this function has to be called or the\n * normal comment link will be assumed.\n *\n * @global string $wpcommentspopupfile  The URL to use for the popup window.\n * @global int    $wpcommentsjavascript Whether to use JavaScript. Set when function is called.\n *\n * @since 0.71\n *\n * @param int $width  Optional. The width of the popup window. Default 400.\n * @param int $height Optional. The height of the popup window. Default 400.\n * @param string $file Optional. Sets the location of the popup window.\n */\nfunction comments_popup_script( $width = 400, $height = 400, $file = '' ) {\n\tglobal $wpcommentspopupfile, $wpcommentsjavascript;\n\n\tif (empty ($file)) {\n\t\t$wpcommentspopupfile = '';  // Use the index.\n\t} else {\n\t\t$wpcommentspopupfile = $file;\n\t}\n\n\t$wpcommentsjavascript = 1;\n\t$javascript = \"<script type='text/javascript'>\\nfunction wpopen (macagna) {\\n    window.open(macagna, '_blank', 'width=$width,height=$height,scrollbars=yes,status=yes');\\n}\\n</script>\\n\";\n\techo $javascript;\n}\n\n/**\n * Displays the link to the comments popup window for the current post ID.\n *\n * Is not meant to be displayed on single posts and pages. Should be used\n * on the lists of posts\n *\n * @global string $wpcommentspopupfile  The URL to use for the popup window.\n * @global int    $wpcommentsjavascript Whether to use JavaScript. Set when function is called.\n *\n * @since 0.71\n *\n * @param string $zero      Optional. String to display when no comments. Default false.\n * @param string $one       Optional. String to display when only one comment is available.\n *                          Default false.\n * @param string $more      Optional. String to display when there are more than one comment.\n *                          Default false.\n * @param string $css_class Optional. CSS class to use for comments. Default empty.\n * @param string $none      Optional. String to display when comments have been turned off.\n *                          Default false.\n */\nfunction comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) {\n\tglobal $wpcommentspopupfile, $wpcommentsjavascript;\n\n\t$id = get_the_ID();\n\t$title = get_the_title();\n\t$number = get_comments_number( $id );\n\n\tif ( false === $zero ) {\n\t\t/* translators: %s: post title */\n\t\t$zero = sprintf( __( 'No Comments<span class=\"screen-reader-text\"> on %s</span>' ), $title );\n\t}\n\n\tif ( false === $one ) {\n\t\t/* translators: %s: post title */\n\t\t$one = sprintf( __( '1 Comment<span class=\"screen-reader-text\"> on %s</span>' ), $title );\n\t}\n\n\tif ( false === $more ) {\n\t\t/* translators: 1: Number of comments 2: post title */\n\t\t$more = _n( '%1$s Comment<span class=\"screen-reader-text\"> on %2$s</span>', '%1$s Comments<span class=\"screen-reader-text\"> on %2$s</span>', $number );\n\t\t$more = sprintf( $more, number_format_i18n( $number ), $title );\n\t}\n\n\tif ( false === $none ) {\n\t\t/* translators: %s: post title */\n\t\t$none = sprintf( __( 'Comments Off<span class=\"screen-reader-text\"> on %s</span>' ), $title );\n\t}\n\n\tif ( 0 == $number && !comments_open() && !pings_open() ) {\n\t\techo '<span' . ((!empty($css_class)) ? ' class=\"' . esc_attr( $css_class ) . '\"' : '') . '>' . $none . '</span>';\n\t\treturn;\n\t}\n\n\tif ( post_password_required() ) {\n\t\t_e( 'Enter your password to view comments.' );\n\t\treturn;\n\t}\n\n\techo '<a href=\"';\n\tif ( $wpcommentsjavascript ) {\n\t\tif ( empty( $wpcommentspopupfile ) )\n\t\t\t$home = home_url();\n\t\telse\n\t\t\t$home = get_option('siteurl');\n\t\techo $home . '/' . $wpcommentspopupfile . '?comments_popup=' . $id;\n\t\techo '\" onclick=\"wpopen(this.href); return false\"';\n\t} else {\n\t\t// if comments_popup_script() is not in the template, display simple comment link\n\t\tif ( 0 == $number ) {\n\t\t\t$respond_link = get_permalink() . '#respond';\n\t\t\t/**\n\t\t\t * Filter the respond link when a post has no comments.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param string $respond_link The default response link.\n\t\t\t * @param integer $id The post ID.\n\t\t\t */\n\t\t\techo apply_filters( 'respond_link', $respond_link, $id );\n\t\t} else {\n\t\t\tcomments_link();\n\t\t}\n\t\techo '\"';\n\t}\n\n\tif ( !empty( $css_class ) ) {\n\t\techo ' class=\"'.$css_class.'\" ';\n\t}\n\n\t$attributes = '';\n\t/**\n\t * Filter the comments popup link attributes for display.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $attributes The comments popup link attributes. Default empty.\n\t */\n\techo apply_filters( 'comments_popup_link_attributes', $attributes );\n\n\techo '>';\n\tcomments_number( $zero, $one, $more );\n\techo '</a>';\n}\n\n/**\n * Retrieve HTML content for reply to comment link.\n *\n * @since 2.7.0\n * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object.\n *\n * @param array $args {\n *     Optional. Override default arguments.\n *\n *     @type string $add_below  The first part of the selector used to identify the comment to respond below.\n *                              The resulting value is passed as the first parameter to addComment.moveForm(),\n *                              concatenated as $add_below-$comment->comment_ID. Default 'comment'.\n *     @type string $respond_id The selector identifying the responding comment. Passed as the third parameter\n *                              to addComment.moveForm(), and appended to the link URL as a hash value.\n *                              Default 'respond'.\n *     @type string $reply_text The text of the Reply link. Default 'Reply'.\n *     @type string $login_text The text of the link to reply if logged out. Default 'Log in to Reply'.\n *     @type int    $depth'     The depth of the new comment. Must be greater than 0 and less than the value\n *                              of the 'thread_comments_depth' option set in Settings > Discussion. Default 0.\n *     @type string $before     The text or HTML to add before the reply link. Default empty.\n *     @type string $after      The text or HTML to add after the reply link. Default empty.\n * }\n * @param int|WP_Comment $comment Comment being replied to. Default current comment.\n * @param int|WP_Post    $post    Post ID or WP_Post object the comment is going to be displayed on.\n *                                Default current post.\n * @return void|false|string Link to show comment form, if successful. False, if comments are closed.\n */\nfunction get_comment_reply_link( $args = array(), $comment = null, $post = null ) {\n\t$defaults = array(\n\t\t'add_below'     => 'comment',\n\t\t'respond_id'    => 'respond',\n\t\t'reply_text'    => __( 'Reply' ),\n\t\t'reply_to_text' => __( 'Reply to %s' ),\n\t\t'login_text'    => __( 'Log in to Reply' ),\n\t\t'depth'         => 0,\n\t\t'before'        => '',\n\t\t'after'         => ''\n\t);\n\n\t$args = wp_parse_args( $args, $defaults );\n\n\tif ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) {\n\t\treturn;\n\t}\n\n\t$comment = get_comment( $comment );\n\n\tif ( empty( $post ) ) {\n\t\t$post = $comment->comment_post_ID;\n\t}\n\n\t$post = get_post( $post );\n\n\tif ( ! comments_open( $post->ID ) ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Filter the comment reply link arguments.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param array      $args    Comment reply link arguments. See get_comment_reply_link()\n\t *                            for more information on accepted arguments.\n\t * @param WP_Comment $comment The object of the comment being replied to.\n\t * @param WP_Post    $post    The WP_Post object.\n\t */\n\t$args = apply_filters( 'comment_reply_link_args', $args, $comment, $post );\n\n\tif ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) {\n\t\t$link = sprintf( '<a rel=\"nofollow\" class=\"comment-reply-login\" href=\"%s\">%s</a>',\n\t\t\tesc_url( wp_login_url( get_permalink() ) ),\n\t\t\t$args['login_text']\n\t\t);\n\t} else {\n\t\t$onclick = sprintf( 'return addComment.moveForm( \"%1$s-%2$s\", \"%2$s\", \"%3$s\", \"%4$s\" )',\n\t\t\t$args['add_below'], $comment->comment_ID, $args['respond_id'], $post->ID\n\t\t);\n\n\t\t$link = sprintf( \"<a rel='nofollow' class='comment-reply-link' href='%s' onclick='%s' aria-label='%s'>%s</a>\",\n\t\t\tesc_url( add_query_arg( 'replytocom', $comment->comment_ID, get_permalink( $post->ID ) ) ) . \"#\" . $args['respond_id'],\n\t\t\t$onclick,\n\t\t\tesc_attr( sprintf( $args['reply_to_text'], $comment->comment_author ) ),\n\t\t\t$args['reply_text']\n\t\t);\n\t}\n\n\t/**\n\t * Filter the comment reply link.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string  $link    The HTML markup for the comment reply link.\n\t * @param array   $args    An array of arguments overriding the defaults.\n\t * @param object  $comment The object of the comment being replied.\n\t * @param WP_Post $post    The WP_Post object.\n\t */\n\treturn apply_filters( 'comment_reply_link', $args['before'] . $link . $args['after'], $args, $comment, $post );\n}\n\n/**\n * Displays the HTML content for reply to comment link.\n *\n * @since 2.7.0\n *\n * @see get_comment_reply_link()\n *\n * @param array       $args    Optional. Override default options.\n * @param int         $comment Comment being replied to. Default current comment.\n * @param int|WP_Post $post    Post ID or WP_Post object the comment is going to be displayed on.\n *                             Default current post.\n * @return mixed Link to show comment form, if successful. False, if comments are closed.\n */\nfunction comment_reply_link($args = array(), $comment = null, $post = null) {\n\techo get_comment_reply_link($args, $comment, $post);\n}\n\n/**\n * Retrieve HTML content for reply to post link.\n *\n * @since 2.7.0\n *\n * @param array $args {\n *     Optional. Override default arguments.\n *\n *     @type string $add_below  The first part of the selector used to identify the comment to respond below.\n *                              The resulting value is passed as the first parameter to addComment.moveForm(),\n *                              concatenated as $add_below-$comment->comment_ID. Default is 'post'.\n *     @type string $respond_id The selector identifying the responding comment. Passed as the third parameter\n *                              to addComment.moveForm(), and appended to the link URL as a hash value.\n *                              Default 'respond'.\n *     @type string $reply_text Text of the Reply link. Default is 'Leave a Comment'.\n *     @type string $login_text Text of the link to reply if logged out. Default is 'Log in to leave a Comment'.\n *     @type string $before     Text or HTML to add before the reply link. Default empty.\n *     @type string $after      Text or HTML to add after the reply link. Default empty.\n * }\n * @param int|WP_Post $post    Optional. Post ID or WP_Post object the comment is going to be displayed on.\n *                             Default current post.\n * @return false|null|string Link to show comment form, if successful. False, if comments are closed.\n */\nfunction get_post_reply_link($args = array(), $post = null) {\n\t$defaults = array(\n\t\t'add_below'  => 'post',\n\t\t'respond_id' => 'respond',\n\t\t'reply_text' => __('Leave a Comment'),\n\t\t'login_text' => __('Log in to leave a Comment'),\n\t\t'before'     => '',\n\t\t'after'      => '',\n\t);\n\n\t$args = wp_parse_args($args, $defaults);\n\n\t$post = get_post($post);\n\n\tif ( ! comments_open( $post->ID ) ) {\n\t\treturn false;\n\t}\n\n\tif ( get_option('comment_registration') && ! is_user_logged_in() ) {\n\t\t$link = sprintf( '<a rel=\"nofollow\" class=\"comment-reply-login\" href=\"%s\">%s</a>',\n\t\t\twp_login_url( get_permalink() ),\n\t\t\t$args['login_text']\n\t\t);\n\t} else {\n\t\t$onclick = sprintf( 'return addComment.moveForm( \"%1$s-%2$s\", \"0\", \"%3$s\", \"%2$s\" )',\n\t\t\t$args['add_below'], $post->ID, $args['respond_id']\n\t\t);\n\n\t\t$link = sprintf( \"<a rel='nofollow' class='comment-reply-link' href='%s' onclick='%s'>%s</a>\",\n\t\t\tget_permalink( $post->ID ) . '#' . $args['respond_id'],\n\t\t\t$onclick,\n\t\t\t$args['reply_text']\n\t\t);\n\t}\n\t$formatted_link = $args['before'] . $link . $args['after'];\n\n\t/**\n\t * Filter the formatted post comments link HTML.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string      $formatted The HTML-formatted post comments link.\n\t * @param int|WP_Post $post      The post ID or WP_Post object.\n\t */\n\treturn apply_filters( 'post_comments_link', $formatted_link, $post );\n}\n\n/**\n * Displays the HTML content for reply to post link.\n *\n * @since 2.7.0\n *\n * @see get_post_reply_link()\n *\n * @param array       $args Optional. Override default options,\n * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on.\n *                          Default current post.\n * @return string|bool|null Link to show comment form, if successful. False, if comments are closed.\n */\nfunction post_reply_link($args = array(), $post = null) {\n\techo get_post_reply_link($args, $post);\n}\n\n/**\n * Retrieve HTML content for cancel comment reply link.\n *\n * @since 2.7.0\n *\n * @param string $text Optional. Text to display for cancel reply link. Default empty.\n * @return string\n */\nfunction get_cancel_comment_reply_link( $text = '' ) {\n\tif ( empty($text) )\n\t\t$text = __('Click here to cancel reply.');\n\n\t$style = isset($_GET['replytocom']) ? '' : ' style=\"display:none;\"';\n\t$link = esc_html( remove_query_arg('replytocom') ) . '#respond';\n\n\t$formatted_link = '<a rel=\"nofollow\" id=\"cancel-comment-reply-link\" href=\"' . $link . '\"' . $style . '>' . $text . '</a>';\n\n\t/**\n\t * Filter the cancel comment reply link HTML.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $formatted_link The HTML-formatted cancel comment reply link.\n\t * @param string $link           Cancel comment reply link URL.\n\t * @param string $text           Cancel comment reply link text.\n\t */\n\treturn apply_filters( 'cancel_comment_reply_link', $formatted_link, $link, $text );\n}\n\n/**\n * Display HTML content for cancel comment reply link.\n *\n * @since 2.7.0\n *\n * @param string $text Optional. Text to display for cancel reply link. Default empty.\n */\nfunction cancel_comment_reply_link( $text = '' ) {\n\techo get_cancel_comment_reply_link($text);\n}\n\n/**\n * Retrieve hidden input HTML for replying to comments.\n *\n * @since 3.0.0\n *\n * @param int $id Optional. Post ID. Default current post ID.\n * @return string Hidden input HTML for replying to comments\n */\nfunction get_comment_id_fields( $id = 0 ) {\n\tif ( empty( $id ) )\n\t\t$id = get_the_ID();\n\n\t$replytoid = isset($_GET['replytocom']) ? (int) $_GET['replytocom'] : 0;\n\t$result  = \"<input type='hidden' name='comment_post_ID' value='$id' id='comment_post_ID' />\\n\";\n\t$result .= \"<input type='hidden' name='comment_parent' id='comment_parent' value='$replytoid' />\\n\";\n\n\t/**\n\t * Filter the returned comment id fields.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $result    The HTML-formatted hidden id field comment elements.\n\t * @param int    $id        The post ID.\n\t * @param int    $replytoid The id of the comment being replied to.\n\t */\n\treturn apply_filters( 'comment_id_fields', $result, $id, $replytoid );\n}\n\n/**\n * Output hidden input HTML for replying to comments.\n *\n * @since 2.7.0\n *\n * @param int $id Optional. Post ID. Default current post ID.\n */\nfunction comment_id_fields( $id = 0 ) {\n\techo get_comment_id_fields( $id );\n}\n\n/**\n * Display text based on comment reply status.\n *\n * Only affects users with JavaScript disabled.\n *\n * @since 2.7.0\n *\n * @param string $noreplytext  Optional. Text to display when not replying to a comment.\n *                             Default false.\n * @param string $replytext    Optional. Text to display when replying to a comment.\n *                             Default false. Accepts \"%s\" for the author of the comment\n *                             being replied to.\n * @param string $linktoparent Optional. Boolean to control making the author's name a link\n *                             to their comment. Default true.\n */\nfunction comment_form_title( $noreplytext = false, $replytext = false, $linktoparent = true ) {\n\t$comment = get_comment();\n\n\tif ( false === $noreplytext ) $noreplytext = __( 'Leave a Reply' );\n\tif ( false === $replytext ) $replytext = __( 'Leave a Reply to %s' );\n\n\t$replytoid = isset($_GET['replytocom']) ? (int) $_GET['replytocom'] : 0;\n\n\tif ( 0 == $replytoid )\n\t\techo $noreplytext;\n\telse {\n\t\t$comment = get_comment($replytoid);\n\t\t$author = ( $linktoparent ) ? '<a href=\"#comment-' . get_comment_ID() . '\">' . get_comment_author( $comment ) . '</a>' : get_comment_author( $comment );\n\t\tprintf( $replytext, $author );\n\t}\n}\n\n/**\n * List comments.\n *\n * Used in the comments.php template to list comments for a particular post.\n *\n * @since 2.7.0\n *\n * @see WP_Query->comments\n *\n * @global WP_Query $wp_query\n * @global int      $comment_alt\n * @global int      $comment_depth\n * @global int      $comment_thread_alt\n * @global bool     $overridden_cpage\n * @global bool     $in_comment_loop\n *\n * @param string|array $args {\n *     Optional. Formatting options.\n *\n *     @type object $walker            Instance of a Walker class to list comments. Default null.\n *     @type int    $max_depth         The maximum comments depth. Default empty.\n *     @type string $style             The style of list ordering. Default 'ul'. Accepts 'ul', 'ol'.\n *     @type string $callback          Callback function to use. Default null.\n *     @type string $end-callback      Callback function to use at the end. Default null.\n *     @type string $type              Type of comments to list.\n *                                     Default 'all'. Accepts 'all', 'comment', 'pingback', 'trackback', 'pings'.\n *     @type int    $page              Page ID to list comments for. Default empty.\n *     @type int    $per_page          Number of comments to list per page. Default empty.\n *     @type int    $avatar_size       Height and width dimensions of the avatar size. Default 32.\n *     @type string $reverse_top_level Ordering of the listed comments. Default null. Accepts 'desc', 'asc'.\n *     @type bool   $reverse_children  Whether to reverse child comments in the list. Default null.\n *     @type string $format            How to format the comments list.\n *                                     Default 'html5' if the theme supports it. Accepts 'html5', 'xhtml'.\n *     @type bool   $short_ping        Whether to output short pings. Default false.\n *     @type bool   $echo              Whether to echo the output or return it. Default true.\n * }\n * @param array $comments Optional. Array of WP_Comment objects.\n */\nfunction wp_list_comments( $args = array(), $comments = null ) {\n\tglobal $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop;\n\n\t$in_comment_loop = true;\n\n\t$comment_alt = $comment_thread_alt = 0;\n\t$comment_depth = 1;\n\n\t$defaults = array(\n\t\t'walker'            => null,\n\t\t'max_depth'         => '',\n\t\t'style'             => 'ul',\n\t\t'callback'          => null,\n\t\t'end-callback'      => null,\n\t\t'type'              => 'all',\n\t\t'page'              => '',\n\t\t'per_page'          => '',\n\t\t'avatar_size'       => 32,\n\t\t'reverse_top_level' => null,\n\t\t'reverse_children'  => '',\n\t\t'format'            => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml',\n\t\t'short_ping'        => false,\n\t\t'echo'              => true,\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t/**\n\t * Filter the arguments used in retrieving the comment list.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @see wp_list_comments()\n\t *\n\t * @param array $r An array of arguments for displaying comments.\n\t */\n\t$r = apply_filters( 'wp_list_comments_args', $r );\n\n\t// Figure out what comments we'll be looping through ($_comments)\n\tif ( null !== $comments ) {\n\t\t$comments = (array) $comments;\n\t\tif ( empty($comments) )\n\t\t\treturn;\n\t\tif ( 'all' != $r['type'] ) {\n\t\t\t$comments_by_type = separate_comments($comments);\n\t\t\tif ( empty($comments_by_type[$r['type']]) )\n\t\t\t\treturn;\n\t\t\t$_comments = $comments_by_type[$r['type']];\n\t\t} else {\n\t\t\t$_comments = $comments;\n\t\t}\n\t} else {\n\t\t/*\n\t\t * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query,\n\t\t * perform a separate comment query and allow Walker_Comment to paginate.\n\t\t */\n\t\tif ( $r['page'] || $r['per_page'] ) {\n\t\t\t$current_cpage = get_query_var( 'cpage' );\n\t\t\tif ( ! $current_cpage ) {\n\t\t\t\t$current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages;\n\t\t\t}\n\n\t\t\t$current_per_page = get_query_var( 'comments_per_page' );\n\t\t\tif ( $r['page'] != $current_cpage || $r['per_page'] != $current_per_page ) {\n\n\t\t\t\t$comments = get_comments( array(\n\t\t\t\t\t'post_id' => get_the_ID(),\n\t\t\t\t\t'orderby' => 'comment_date_gmt',\n\t\t\t\t\t'order' => 'ASC',\n\t\t\t\t\t'status' => 'all',\n\t\t\t\t) );\n\n\t\t\t\tif ( 'all' != $r['type'] ) {\n\t\t\t\t\t$comments_by_type = separate_comments( $comments );\n\t\t\t\t\tif ( empty( $comments_by_type[ $r['type'] ] ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t$_comments = $comments_by_type[ $r['type'] ];\n\t\t\t\t} else {\n\t\t\t\t\t$_comments = $comments;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Otherwise, fall back on the comments from `$wp_query->comments`.\n\t\t} else {\n\t\t\tif ( empty($wp_query->comments) )\n\t\t\t\treturn;\n\t\t\tif ( 'all' != $r['type'] ) {\n\t\t\t\tif ( empty($wp_query->comments_by_type) )\n\t\t\t\t\t$wp_query->comments_by_type = separate_comments($wp_query->comments);\n\t\t\t\tif ( empty($wp_query->comments_by_type[$r['type']]) )\n\t\t\t\t\treturn;\n\t\t\t\t$_comments = $wp_query->comments_by_type[$r['type']];\n\t\t\t} else {\n\t\t\t\t$_comments = $wp_query->comments;\n\t\t\t}\n\n\t\t\tif ( $wp_query->max_num_comment_pages ) {\n\t\t\t\t$default_comments_page = get_option( 'default_comments_page' );\n\t\t\t\t$cpage = get_query_var( 'cpage' );\n\t\t\t\tif ( 'newest' === $default_comments_page ) {\n\t\t\t\t\t$r['cpage'] = $cpage;\n\n\t\t\t\t/*\n\t\t\t\t * When first page shows oldest comments, post permalink is the same as\n\t\t\t\t * the comment permalink.\n\t\t\t\t */\n\t\t\t\t} elseif ( $cpage == 1 ) {\n\t\t\t\t\t$r['cpage'] = '';\n\t\t\t\t} else {\n\t\t\t\t\t$r['cpage'] = $cpage;\n\t\t\t\t}\n\n\t\t\t\t$r['page'] = 0;\n\t\t\t\t$r['per_page'] = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( '' === $r['per_page'] && get_option( 'page_comments' ) ) {\n\t\t$r['per_page'] = get_query_var('comments_per_page');\n\t}\n\n\tif ( empty($r['per_page']) ) {\n\t\t$r['per_page'] = 0;\n\t\t$r['page'] = 0;\n\t}\n\n\tif ( '' === $r['max_depth'] ) {\n\t\tif ( get_option('thread_comments') )\n\t\t\t$r['max_depth'] = get_option('thread_comments_depth');\n\t\telse\n\t\t\t$r['max_depth'] = -1;\n\t}\n\n\tif ( '' === $r['page'] ) {\n\t\tif ( empty($overridden_cpage) ) {\n\t\t\t$r['page'] = get_query_var('cpage');\n\t\t} else {\n\t\t\t$threaded = ( -1 != $r['max_depth'] );\n\t\t\t$r['page'] = ( 'newest' == get_option('default_comments_page') ) ? get_comment_pages_count($_comments, $r['per_page'], $threaded) : 1;\n\t\t\tset_query_var( 'cpage', $r['page'] );\n\t\t}\n\t}\n\t// Validation check\n\t$r['page'] = intval($r['page']);\n\tif ( 0 == $r['page'] && 0 != $r['per_page'] )\n\t\t$r['page'] = 1;\n\n\tif ( null === $r['reverse_top_level'] )\n\t\t$r['reverse_top_level'] = ( 'desc' == get_option('comment_order') );\n\n\tif ( empty( $r['walker'] ) ) {\n\t\t$walker = new Walker_Comment;\n\t} else {\n\t\t$walker = $r['walker'];\n\t}\n\n\t$output = $walker->paged_walk( $_comments, $r['max_depth'], $r['page'], $r['per_page'], $r );\n\n\t$in_comment_loop = false;\n\n\tif ( $r['echo'] ) {\n\t\techo $output;\n\t} else {\n\t\treturn $output;\n\t}\n}\n\n/**\n * Output a complete commenting form for use within a template.\n *\n * Most strings and form fields may be controlled through the $args array passed\n * into the function, while you may also choose to use the comment_form_default_fields\n * filter to modify the array of default fields if you'd just like to add a new\n * one or remove a single field. All fields are also individually passed through\n * a filter of the form comment_form_field_$name where $name is the key used\n * in the array of fields.\n *\n * @since 3.0.0\n * @since 4.1.0 Introduced the 'class_submit' argument.\n * @since 4.2.0 Introduced the 'submit_button' and 'submit_fields' arguments.\n * @since 4.4.0 Introduced the 'class_form', 'title_reply_before', 'title_reply_after',\n *              'cancel_reply_before', and 'cancel_reply_after' arguments.\n *\n * @param array       $args {\n *     Optional. Default arguments and form fields to override.\n *\n *     @type array $fields {\n *         Default comment fields, filterable by default via the 'comment_form_default_fields' hook.\n *\n *         @type string $author Comment author field HTML.\n *         @type string $email  Comment author email field HTML.\n *         @type string $url    Comment author URL field HTML.\n *     }\n *     @type string $comment_field        The comment textarea field HTML.\n *     @type string $must_log_in          HTML element for a 'must be logged in to comment' message.\n *     @type string $logged_in_as         HTML element for a 'logged in as [user]' message.\n *     @type string $comment_notes_before HTML element for a message displayed before the comment fields\n *                                        if the user is not logged in.\n *                                        Default 'Your email address will not be published.'.\n *     @type string $comment_notes_after  HTML element for a message displayed after the textarea field.\n *     @type string $id_form              The comment form element id attribute. Default 'commentform'.\n *     @type string $id_submit            The comment submit element id attribute. Default 'submit'.\n *     @type string $class_form           The comment form element class attribute. Default 'comment-form'.\n *     @type string $class_submit         The comment submit element class attribute. Default 'submit'.\n *     @type string $name_submit          The comment submit element name attribute. Default 'submit'.\n *     @type string $title_reply          The translatable 'reply' button label. Default 'Leave a Reply'.\n *     @type string $title_reply_to       The translatable 'reply-to' button label. Default 'Leave a Reply to %s',\n *                                        where %s is the author of the comment being replied to.\n *     @type string $title_reply_before   HTML displayed before the comment form title.\n *                                        Default: '<h3 id=\"reply-title\" class=\"comment-reply-title\">'.\n *     @type string $title_reply_after    HTML displayed after the comment form title.\n *                                        Default: '</h3>'.\n *     @type string $cancel_reply_before  HTML displayed before the cancel reply link.\n *     @type string $cancel_reply_after   HTML displayed after the cancel reply link.\n *     @type string $cancel_reply_link    The translatable 'cancel reply' button label. Default 'Cancel reply'.\n *     @type string $label_submit         The translatable 'submit' button label. Default 'Post a comment'.\n *     @type string $submit_button        HTML format for the Submit button.\n *                                        Default: '<input name=\"%1$s\" type=\"submit\" id=\"%2$s\" class=\"%3$s\" value=\"%4$s\" />'.\n *     @type string $submit_field         HTML format for the markup surrounding the Submit button and comment hidden\n *                                        fields. Default: '<p class=\"form-submit\">%1$s %2$s</a>', where %1$s is the\n *                                        submit button markup and %2$s is the comment hidden fields.\n *     @type string $format               The comment form format. Default 'xhtml'. Accepts 'xhtml', 'html5'.\n * }\n * @param int|WP_Post $post_id Post ID or WP_Post object to generate the form for. Default current post.\n */\nfunction comment_form( $args = array(), $post_id = null ) {\n\tif ( null === $post_id )\n\t\t$post_id = get_the_ID();\n\n\t$commenter = wp_get_current_commenter();\n\t$user = wp_get_current_user();\n\t$user_identity = $user->exists() ? $user->display_name : '';\n\n\t$args = wp_parse_args( $args );\n\tif ( ! isset( $args['format'] ) )\n\t\t$args['format'] = current_theme_supports( 'html5', 'comment-form' ) ? 'html5' : 'xhtml';\n\n\t$req      = get_option( 'require_name_email' );\n\t$aria_req = ( $req ? \" aria-required='true'\" : '' );\n\t$html_req = ( $req ? \" required='required'\" : '' );\n\t$html5    = 'html5' === $args['format'];\n\t$fields   =  array(\n\t\t'author' => '<p class=\"comment-form-author\">' . '<label for=\"author\">' . __( 'Name' ) . ( $req ? ' <span class=\"required\">*</span>' : '' ) . '</label> ' .\n\t\t            '<input id=\"author\" name=\"author\" type=\"text\" value=\"' . esc_attr( $commenter['comment_author'] ) . '\" size=\"30\"' . $aria_req . $html_req . ' /></p>',\n\t\t'email'  => '<p class=\"comment-form-email\"><label for=\"email\">' . __( 'Email' ) . ( $req ? ' <span class=\"required\">*</span>' : '' ) . '</label> ' .\n\t\t            '<input id=\"email\" name=\"email\" ' . ( $html5 ? 'type=\"email\"' : 'type=\"text\"' ) . ' value=\"' . esc_attr(  $commenter['comment_author_email'] ) . '\" size=\"30\" aria-describedby=\"email-notes\"' . $aria_req . $html_req  . ' /></p>',\n\t\t'url'    => '<p class=\"comment-form-url\"><label for=\"url\">' . __( 'Website' ) . '</label> ' .\n\t\t            '<input id=\"url\" name=\"url\" ' . ( $html5 ? 'type=\"url\"' : 'type=\"text\"' ) . ' value=\"' . esc_attr( $commenter['comment_author_url'] ) . '\" size=\"30\" /></p>',\n\t);\n\n\t$required_text = sprintf( ' ' . __('Required fields are marked %s'), '<span class=\"required\">*</span>' );\n\n\t/**\n\t * Filter the default comment form fields.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $fields The default comment fields.\n\t */\n\t$fields = apply_filters( 'comment_form_default_fields', $fields );\n\t$defaults = array(\n\t\t'fields'               => $fields,\n\t\t'comment_field'        => '<p class=\"comment-form-comment\"><label for=\"comment\">' . _x( 'Comment', 'noun' ) . '</label> <textarea id=\"comment\" name=\"comment\" cols=\"45\" rows=\"8\"  aria-required=\"true\" required=\"required\"></textarea></p>',\n\t\t/** This filter is documented in wp-includes/link-template.php */\n\t\t'must_log_in'          => '<p class=\"must-log-in\">' . sprintf( __( 'You must be <a href=\"%s\">logged in</a> to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',\n\t\t/** This filter is documented in wp-includes/link-template.php */\n\t\t'logged_in_as'         => '<p class=\"logged-in-as\">' . sprintf( __( '<a href=\"%1$s\" aria-label=\"Logged in as %2$s. Edit your profile.\">Logged in as %2$s</a>. <a href=\"%3$s\">Log out?</a>' ), get_edit_user_link(), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',\n\t\t'comment_notes_before' => '<p class=\"comment-notes\"><span id=\"email-notes\">' . __( 'Your email address will not be published.' ) . '</span>'. ( $req ? $required_text : '' ) . '</p>',\n\t\t'comment_notes_after'  => '',\n\t\t'id_form'              => 'commentform',\n\t\t'id_submit'            => 'submit',\n\t\t'class_form'           => 'comment-form',\n\t\t'class_submit'         => 'submit',\n\t\t'name_submit'          => 'submit',\n\t\t'title_reply'          => __( 'Leave a Reply' ),\n\t\t'title_reply_to'       => __( 'Leave a Reply to %s' ),\n\t\t'title_reply_before'   => '<h3 id=\"reply-title\" class=\"comment-reply-title\">',\n\t\t'title_reply_after'    => '</h3>',\n\t\t'cancel_reply_before'  => ' <small>',\n\t\t'cancel_reply_after'   => '</small>',\n\t\t'cancel_reply_link'    => __( 'Cancel reply' ),\n\t\t'label_submit'         => __( 'Post Comment' ),\n\t\t'submit_button'        => '<input name=\"%1$s\" type=\"submit\" id=\"%2$s\" class=\"%3$s\" value=\"%4$s\" />',\n\t\t'submit_field'         => '<p class=\"form-submit\">%1$s %2$s</p>',\n\t\t'format'               => 'xhtml',\n\t);\n\n\t/**\n\t * Filter the comment form default arguments.\n\t *\n\t * Use 'comment_form_default_fields' to filter the comment fields.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $defaults The default comment form arguments.\n\t */\n\t$args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) );\n\n\t// Ensure that the filtered args contain all required default values.\n\t$args = array_merge( $defaults, $args );\n\n\tif ( comments_open( $post_id ) ) : ?>\n\t\t<?php\n\t\t/**\n\t\t * Fires before the comment form.\n\t\t *\n\t\t * @since 3.0.0\n\t\t */\n\t\tdo_action( 'comment_form_before' );\n\t\t?>\n\t\t<div id=\"respond\" class=\"comment-respond\">\n\t\t\t<?php\n\t\t\techo $args['title_reply_before'];\n\n\t\t\tcomment_form_title( $args['title_reply'], $args['title_reply_to'] );\n\n\t\t\techo $args['cancel_reply_before'];\n\n\t\t\tcancel_comment_reply_link( $args['cancel_reply_link'] );\n\n\t\t\techo $args['cancel_reply_after'];\n\n\t\t\techo $args['title_reply_after'];\n\n\t\t\tif ( get_option( 'comment_registration' ) && !is_user_logged_in() ) :\n\t\t\t\techo $args['must_log_in'];\n\t\t\t\t/**\n\t\t\t\t * Fires after the HTML-formatted 'must log in after' message in the comment form.\n\t\t\t\t *\n\t\t\t\t * @since 3.0.0\n\t\t\t\t */\n\t\t\t\tdo_action( 'comment_form_must_log_in_after' );\n\t\t\telse : ?>\n\t\t\t\t<form action=\"<?php echo site_url( '/wp-comments-post.php' ); ?>\" method=\"post\" id=\"<?php echo esc_attr( $args['id_form'] ); ?>\" class=\"<?php echo esc_attr( $args['class_form'] ); ?>\"<?php echo $html5 ? ' novalidate' : ''; ?>>\n\t\t\t\t\t<?php\n\t\t\t\t\t/**\n\t\t\t\t\t * Fires at the top of the comment form, inside the form tag.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 3.0.0\n\t\t\t\t\t */\n\t\t\t\t\tdo_action( 'comment_form_top' );\n\n\t\t\t\t\tif ( is_user_logged_in() ) :\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Filter the 'logged in' message for the comment form for display.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @since 3.0.0\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @param string $args_logged_in The logged-in-as HTML-formatted message.\n\t\t\t\t\t\t * @param array  $commenter      An array containing the comment author's\n\t\t\t\t\t\t *                               username, email, and URL.\n\t\t\t\t\t\t * @param string $user_identity  If the commenter is a registered user,\n\t\t\t\t\t\t *                               the display name, blank otherwise.\n\t\t\t\t\t\t */\n\t\t\t\t\t\techo apply_filters( 'comment_form_logged_in', $args['logged_in_as'], $commenter, $user_identity );\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Fires after the is_user_logged_in() check in the comment form.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @since 3.0.0\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @param array  $commenter     An array containing the comment author's\n\t\t\t\t\t\t *                              username, email, and URL.\n\t\t\t\t\t\t * @param string $user_identity If the commenter is a registered user,\n\t\t\t\t\t\t *                              the display name, blank otherwise.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tdo_action( 'comment_form_logged_in_after', $commenter, $user_identity );\n\n\t\t\t\t\telse :\n\n\t\t\t\t\t\techo $args['comment_notes_before'];\n\n\t\t\t\t\tendif;\n\n\t\t\t\t\t// Prepare an array of all fields, including the textarea\n\t\t\t\t\t$comment_fields = array( 'comment' => $args['comment_field'] ) + (array) $args['fields'];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the comment form fields.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 4.4.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param array $comment_fields The comment fields.\n\t\t\t\t\t */\n\t\t\t\t\t$comment_fields = apply_filters( 'comment_form_fields', $comment_fields );\n\n\t\t\t\t\t// Get an array of field names, excluding the textarea\n\t\t\t\t\t$comment_field_keys = array_diff( array_keys( $comment_fields ), array( 'comment' ) );\n\n\t\t\t\t\t// Get the first and the last field name, excluding the textarea\n\t\t\t\t\t$first_field = reset( $comment_field_keys );\n\t\t\t\t\t$last_field  = end( $comment_field_keys );\n\n\t\t\t\t\tforeach ( $comment_fields as $name => $field ) {\n\n\t\t\t\t\t\tif ( 'comment' === $name ) {\n\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * Filter the content of the comment textarea field for display.\n\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t * @since 3.0.0\n\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t * @param string $args_comment_field The content of the comment textarea field.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\techo apply_filters( 'comment_form_field_comment', $field );\n\n\t\t\t\t\t\t\techo $args['comment_notes_after'];\n\n\t\t\t\t\t\t} elseif ( ! is_user_logged_in() ) {\n\n\t\t\t\t\t\t\tif ( $first_field === $name ) {\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Fires before the comment fields in the comment form, excluding the textarea.\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t * @since 3.0.0\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tdo_action( 'comment_form_before_fields' );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * Filter a comment form field for display.\n\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t * The dynamic portion of the filter hook, `$name`, refers to the name\n\t\t\t\t\t\t\t * of the comment form field. Such as 'author', 'email', or 'url'.\n\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t * @since 3.0.0\n\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t * @param string $field The HTML-formatted output of the comment form field.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\techo apply_filters( \"comment_form_field_{$name}\", $field ) . \"\\n\";\n\n\t\t\t\t\t\t\tif ( $last_field === $name ) {\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Fires after the comment fields in the comment form, excluding the textarea.\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t * @since 3.0.0\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tdo_action( 'comment_form_after_fields' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$submit_button = sprintf(\n\t\t\t\t\t\t$args['submit_button'],\n\t\t\t\t\t\tesc_attr( $args['name_submit'] ),\n\t\t\t\t\t\tesc_attr( $args['id_submit'] ),\n\t\t\t\t\t\tesc_attr( $args['class_submit'] ),\n\t\t\t\t\t\tesc_attr( $args['label_submit'] )\n\t\t\t\t\t);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the submit button for the comment form to display.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 4.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param string $submit_button HTML markup for the submit button.\n\t\t\t\t\t * @param array  $args          Arguments passed to `comment_form()`.\n\t\t\t\t\t */\n\t\t\t\t\t$submit_button = apply_filters( 'comment_form_submit_button', $submit_button, $args );\n\n\t\t\t\t\t$submit_field = sprintf(\n\t\t\t\t\t\t$args['submit_field'],\n\t\t\t\t\t\t$submit_button,\n\t\t\t\t\t\tget_comment_id_fields( $post_id )\n\t\t\t\t\t);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the submit field for the comment form to display.\n\t\t\t\t\t *\n\t\t\t\t\t * The submit field includes the submit button, hidden fields for the\n\t\t\t\t\t * comment form, and any wrapper markup.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 4.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param string $submit_field HTML markup for the submit field.\n\t\t\t\t\t * @param array  $args         Arguments passed to comment_form().\n\t\t\t\t\t */\n\t\t\t\t\techo apply_filters( 'comment_form_submit_field', $submit_field, $args );\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Fires at the bottom of the comment form, inside the closing </form> tag.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 1.5.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param int $post_id The post ID.\n\t\t\t\t\t */\n\t\t\t\t\tdo_action( 'comment_form', $post_id );\n\t\t\t\t\t?>\n\t\t\t\t</form>\n\t\t\t<?php endif; ?>\n\t\t</div><!-- #respond -->\n\t\t<?php\n\t\t/**\n\t\t * Fires after the comment form.\n\t\t *\n\t\t * @since 3.0.0\n\t\t */\n\t\tdo_action( 'comment_form_after' );\n\telse :\n\t\t/**\n\t\t * Fires after the comment form if comments are closed.\n\t\t *\n\t\t * @since 3.0.0\n\t\t */\n\t\tdo_action( 'comment_form_comments_closed' );\n\tendif;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/comment.php",
    "content": "<?php\n/**\n * Core Comment API\n *\n * @package WordPress\n * @subpackage Comment\n */\n\n/**\n * Check whether a comment passes internal checks to be allowed to add.\n *\n * If manual comment moderation is set in the administration, then all checks,\n * regardless of their type and whitelist, will fail and the function will\n * return false.\n *\n * If the number of links exceeds the amount in the administration, then the\n * check fails. If any of the parameter contents match the blacklist of words,\n * then the check fails.\n *\n * If the comment author was approved before, then the comment is automatically\n * whitelisted.\n *\n * If all checks pass, the function will return true.\n *\n * @since 1.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $author       Comment author name.\n * @param string $email        Comment author email.\n * @param string $url          Comment author URL.\n * @param string $comment      Content of the comment.\n * @param string $user_ip      Comment author IP address.\n * @param string $user_agent   Comment author User-Agent.\n * @param string $comment_type Comment type, either user-submitted comment,\n *\t\t                       trackback, or pingback.\n * @return bool If all checks pass, true, otherwise false.\n */\nfunction check_comment($author, $email, $url, $comment, $user_ip, $user_agent, $comment_type) {\n\tglobal $wpdb;\n\n\t// If manual moderation is enabled, skip all checks and return false.\n\tif ( 1 == get_option('comment_moderation') )\n\t\treturn false;\n\n\t/** This filter is documented in wp-includes/comment-template.php */\n\t$comment = apply_filters( 'comment_text', $comment );\n\n\t// Check for the number of external links if a max allowed number is set.\n\tif ( $max_links = get_option( 'comment_max_links' ) ) {\n\t\t$num_links = preg_match_all( '/<a [^>]*href/i', $comment, $out );\n\n\t\t/**\n\t\t * Filter the maximum number of links allowed in a comment.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param int    $num_links The number of links allowed.\n\t\t * @param string $url       Comment author's URL. Included in allowed links total.\n\t\t */\n\t\t$num_links = apply_filters( 'comment_max_links_url', $num_links, $url );\n\n\t\t/*\n\t\t * If the number of links in the comment exceeds the allowed amount,\n\t\t * fail the check by returning false.\n\t\t */\n\t\tif ( $num_links >= $max_links )\n\t\t\treturn false;\n\t}\n\n\t$mod_keys = trim(get_option('moderation_keys'));\n\n\t// If moderation 'keys' (keywords) are set, process them.\n\tif ( !empty($mod_keys) ) {\n\t\t$words = explode(\"\\n\", $mod_keys );\n\n\t\tforeach ( (array) $words as $word) {\n\t\t\t$word = trim($word);\n\n\t\t\t// Skip empty lines.\n\t\t\tif ( empty($word) )\n\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t * Do some escaping magic so that '#' (number of) characters in the spam\n\t\t\t * words don't break things:\n\t\t\t */\n\t\t\t$word = preg_quote($word, '#');\n\n\t\t\t/*\n\t\t\t * Check the comment fields for moderation keywords. If any are found,\n\t\t\t * fail the check for the given field by returning false.\n\t\t\t */\n\t\t\t$pattern = \"#$word#i\";\n\t\t\tif ( preg_match($pattern, $author) ) return false;\n\t\t\tif ( preg_match($pattern, $email) ) return false;\n\t\t\tif ( preg_match($pattern, $url) ) return false;\n\t\t\tif ( preg_match($pattern, $comment) ) return false;\n\t\t\tif ( preg_match($pattern, $user_ip) ) return false;\n\t\t\tif ( preg_match($pattern, $user_agent) ) return false;\n\t\t}\n\t}\n\n\t/*\n\t * Check if the option to approve comments by previously-approved authors is enabled.\n\t *\n\t * If it is enabled, check whether the comment author has a previously-approved comment,\n\t * as well as whether there are any moderation keywords (if set) present in the author\n\t * email address. If both checks pass, return true. Otherwise, return false.\n\t */\n\tif ( 1 == get_option('comment_whitelist')) {\n\t\tif ( 'trackback' != $comment_type && 'pingback' != $comment_type && $author != '' && $email != '' ) {\n\t\t\t// expected_slashed ($author, $email)\n\t\t\t$ok_to_comment = $wpdb->get_var(\"SELECT comment_approved FROM $wpdb->comments WHERE comment_author = '$author' AND comment_author_email = '$email' and comment_approved = '1' LIMIT 1\");\n\t\t\tif ( ( 1 == $ok_to_comment ) &&\n\t\t\t\t( empty($mod_keys) || false === strpos( $email, $mod_keys) ) )\n\t\t\t\t\treturn true;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Retrieve the approved comments for post $post_id.\n *\n * @since 2.0.0\n * @since 4.1.0 Refactored to leverage {@see WP_Comment_Query} over a direct query.\n *\n * @param  int   $post_id The ID of the post.\n * @param  array $args    Optional. See {@see WP_Comment_Query::query()} for information\n *                        on accepted arguments.\n * @return int|array $comments The approved comments, or number of comments if `$count`\n *                             argument is true.\n */\nfunction get_approved_comments( $post_id, $args = array() ) {\n\tif ( ! $post_id ) {\n\t\treturn array();\n\t}\n\n\t$defaults = array(\n\t\t'status'  => 1,\n\t\t'post_id' => $post_id,\n\t\t'order'   => 'ASC',\n\t);\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$query = new WP_Comment_Query;\n\treturn $query->query( $r );\n}\n\n/**\n * Retrieves comment data given a comment ID or comment object.\n *\n * If an object is passed then the comment data will be cached and then returned\n * after being passed through a filter. If the comment is empty, then the global\n * comment variable will be used, if it is set.\n *\n * @since 2.0.0\n *\n * @global WP_Comment $comment\n *\n * @param WP_Comment|string|int $comment Comment to retrieve.\n * @param string $output Optional. OBJECT or ARRAY_A or ARRAY_N constants.\n * @return WP_Comment|array|null Depends on $output value.\n */\nfunction get_comment( &$comment = null, $output = OBJECT ) {\n\tif ( empty( $comment ) && isset( $GLOBALS['comment'] ) ) {\n\t\t$comment = $GLOBALS['comment'];\n\t}\n\n\tif ( $comment instanceof WP_Comment ) {\n\t\t$_comment = $comment;\n\t} elseif ( is_object( $comment ) ) {\n\t\t$_comment = new WP_Comment( $comment );\n\t} else {\n\t\t$_comment = WP_Comment::get_instance( $comment );\n\t}\n\n\tif ( ! $_comment ) {\n\t\treturn null;\n\t}\n\n\t/**\n\t * Fires after a comment is retrieved.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param mixed $_comment Comment data.\n\t */\n\t$_comment = apply_filters( 'get_comment', $_comment );\n\n\tif ( $output == OBJECT ) {\n\t\treturn $_comment;\n\t} elseif ( $output == ARRAY_A ) {\n\t\treturn $_comment->to_array();\n\t} elseif ( $output == ARRAY_N ) {\n\t\treturn array_values( $_comment->to_array() );\n\t}\n\treturn $_comment;\n}\n\n/**\n * Retrieve a list of comments.\n *\n * The comment list can be for the blog as a whole or for an individual post.\n *\n * @since 2.7.0\n *\n * @param string|array $args Optional. Array or string of arguments. See {@see WP_Comment_Query::parse_query()}\n *                           for information on accepted arguments. Default empty.\n * @return int|array List of comments or number of found comments if `$count` argument is true.\n */\nfunction get_comments( $args = '' ) {\n\t$query = new WP_Comment_Query;\n\treturn $query->query( $args );\n}\n\n/**\n * Retrieve all of the WordPress supported comment statuses.\n *\n * Comments have a limited set of valid status values, this provides the comment\n * status values and descriptions.\n *\n * @since 2.7.0\n *\n * @return array List of comment statuses.\n */\nfunction get_comment_statuses() {\n\t$status = array(\n\t\t'hold'\t\t=> __('Unapproved'),\n\t\t/* translators: comment status  */\n\t\t'approve'\t=> _x('Approved', 'adjective'),\n\t\t/* translators: comment status */\n\t\t'spam'\t\t=> _x('Spam', 'adjective'),\n\t\t/* translators: comment status */\n\t\t'trash'\t\t=> _x('Trash', 'adjective'),\n\t);\n\n\treturn $status;\n}\n\n/**\n * Gets the default comment status for a post type.\n *\n * @since 4.3.0\n *\n * @param string $post_type    Optional. Post type. Default 'post'.\n * @param string $comment_type Optional. Comment type. Default 'comment'.\n * @return string Expected return value is 'open' or 'closed'.\n */\nfunction get_default_comment_status( $post_type = 'post', $comment_type = 'comment' ) {\n\tswitch ( $comment_type ) {\n\t\tcase 'pingback' :\n\t\tcase 'trackback' :\n\t\t\t$supports = 'trackbacks';\n\t\t\t$option = 'ping';\n\t\t\tbreak;\n\t\tdefault :\n\t\t\t$supports = 'comments';\n\t\t\t$option = 'comment';\n\t}\n\n\t// Set the status.\n\tif ( 'page' === $post_type ) {\n\t\t$status = 'closed';\n\t} elseif ( post_type_supports( $post_type, $supports ) ) {\n\t\t$status = get_option( \"default_{$option}_status\" );\n\t} else {\n\t\t$status = 'closed';\n\t}\n\n\t/**\n\t * Filter the default comment status for the given post type.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param string $status       Default status for the given post type,\n\t *                             either 'open' or 'closed'.\n\t * @param string $post_type    Post type. Default is `post`.\n\t * @param string $comment_type Type of comment. Default is `comment`.\n\t */\n\treturn apply_filters( 'get_default_comment_status' , $status, $post_type, $comment_type );\n}\n\n/**\n * The date the last comment was modified.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @staticvar array $cache_lastcommentmodified\n *\n * @param string $timezone Which timezone to use in reference to 'gmt', 'blog',\n *\t\tor 'server' locations.\n * @return string Last comment modified date.\n */\nfunction get_lastcommentmodified($timezone = 'server') {\n\tglobal $wpdb;\n\tstatic $cache_lastcommentmodified = array();\n\n\tif ( isset($cache_lastcommentmodified[$timezone]) )\n\t\treturn $cache_lastcommentmodified[$timezone];\n\n\t$add_seconds_server = date('Z');\n\n\tswitch ( strtolower($timezone)) {\n\t\tcase 'gmt':\n\t\t\t$lastcommentmodified = $wpdb->get_var(\"SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1\");\n\t\t\tbreak;\n\t\tcase 'blog':\n\t\t\t$lastcommentmodified = $wpdb->get_var(\"SELECT comment_date FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1\");\n\t\t\tbreak;\n\t\tcase 'server':\n\t\t\t$lastcommentmodified = $wpdb->get_var($wpdb->prepare(\"SELECT DATE_ADD(comment_date_gmt, INTERVAL %s SECOND) FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1\", $add_seconds_server));\n\t\t\tbreak;\n\t}\n\n\t$cache_lastcommentmodified[$timezone] = $lastcommentmodified;\n\n\treturn $lastcommentmodified;\n}\n\n/**\n * The amount of comments in a post or total comments.\n *\n * A lot like {@link wp_count_comments()}, in that they both return comment\n * stats (albeit with different types). The {@link wp_count_comments()} actual\n * caches, but this function does not.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $post_id Optional. Comment amount in post if > 0, else total comments blog wide.\n * @return array The amount of spam, approved, awaiting moderation, and total comments.\n */\nfunction get_comment_count( $post_id = 0 ) {\n\tglobal $wpdb;\n\n\t$post_id = (int) $post_id;\n\n\t$where = '';\n\tif ( $post_id > 0 ) {\n\t\t$where = $wpdb->prepare(\"WHERE comment_post_ID = %d\", $post_id);\n\t}\n\n\t$totals = (array) $wpdb->get_results(\"\n\t\tSELECT comment_approved, COUNT( * ) AS total\n\t\tFROM {$wpdb->comments}\n\t\t{$where}\n\t\tGROUP BY comment_approved\n\t\", ARRAY_A);\n\n\t$comment_count = array(\n\t\t'approved'            => 0,\n\t\t'awaiting_moderation' => 0,\n\t\t'spam'                => 0,\n\t\t'trash'               => 0,\n\t\t'post-trashed'        => 0,\n\t\t'total_comments'      => 0,\n\t\t'all'                 => 0,\n\t);\n\n\tforeach ( $totals as $row ) {\n\t\tswitch ( $row['comment_approved'] ) {\n\t\t\tcase 'trash':\n\t\t\t\t$comment_count['trash'] = $row['total'];\n\t\t\t\tbreak;\n\t\t\tcase 'post-trashed':\n\t\t\t\t$comment_count['post-trashed'] = $row['total'];\n\t\t\t\tbreak;\n\t\t\tcase 'spam':\n\t\t\t\t$comment_count['spam'] = $row['total'];\n\t\t\t\t$comment_count['total_comments'] += $row['total'];\n\t\t\t\tbreak;\n\t\t\tcase '1':\n\t\t\t\t$comment_count['approved'] = $row['total'];\n\t\t\t\t$comment_count['total_comments'] += $row['total'];\n\t\t\t\t$comment_count['all'] += $row['total'];\n\t\t\t\tbreak;\n\t\t\tcase '0':\n\t\t\t\t$comment_count['awaiting_moderation'] = $row['total'];\n\t\t\t\t$comment_count['total_comments'] += $row['total'];\n\t\t\t\t$comment_count['all'] += $row['total'];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn $comment_count;\n}\n\n//\n// Comment meta functions\n//\n\n/**\n * Add meta data field to a comment.\n *\n * @since 2.9.0\n * @link https://codex.wordpress.org/Function_Reference/add_comment_meta\n *\n * @param int $comment_id Comment ID.\n * @param string $meta_key Metadata name.\n * @param mixed $meta_value Metadata value.\n * @param bool $unique Optional, default is false. Whether the same key should not be added.\n * @return int|bool Meta ID on success, false on failure.\n */\nfunction add_comment_meta($comment_id, $meta_key, $meta_value, $unique = false) {\n\treturn add_metadata('comment', $comment_id, $meta_key, $meta_value, $unique);\n}\n\n/**\n * Remove metadata matching criteria from a comment.\n *\n * You can match based on the key, or key and value. Removing based on key and\n * value, will keep from removing duplicate metadata with the same key. It also\n * allows removing all metadata matching key, if needed.\n *\n * @since 2.9.0\n * @link https://codex.wordpress.org/Function_Reference/delete_comment_meta\n *\n * @param int $comment_id comment ID\n * @param string $meta_key Metadata name.\n * @param mixed $meta_value Optional. Metadata value.\n * @return bool True on success, false on failure.\n */\nfunction delete_comment_meta($comment_id, $meta_key, $meta_value = '') {\n\treturn delete_metadata('comment', $comment_id, $meta_key, $meta_value);\n}\n\n/**\n * Retrieve comment meta field for a comment.\n *\n * @since 2.9.0\n * @link https://codex.wordpress.org/Function_Reference/get_comment_meta\n *\n * @param int $comment_id Comment ID.\n * @param string $key Optional. The meta key to retrieve. By default, returns data for all keys.\n * @param bool $single Whether to return a single value.\n * @return mixed Will be an array if $single is false. Will be value of meta data field if $single\n *  is true.\n */\nfunction get_comment_meta($comment_id, $key = '', $single = false) {\n\treturn get_metadata('comment', $comment_id, $key, $single);\n}\n\n/**\n * Update comment meta field based on comment ID.\n *\n * Use the $prev_value parameter to differentiate between meta fields with the\n * same key and comment ID.\n *\n * If the meta field for the comment does not exist, it will be added.\n *\n * @since 2.9.0\n * @link https://codex.wordpress.org/Function_Reference/update_comment_meta\n *\n * @param int $comment_id Comment ID.\n * @param string $meta_key Metadata key.\n * @param mixed $meta_value Metadata value.\n * @param mixed $prev_value Optional. Previous value to check before removing.\n * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure.\n */\nfunction update_comment_meta($comment_id, $meta_key, $meta_value, $prev_value = '') {\n\treturn update_metadata('comment', $comment_id, $meta_key, $meta_value, $prev_value);\n}\n\n/**\n * Sets the cookies used to store an unauthenticated commentator's identity. Typically used\n * to recall previous comments by this commentator that are still held in moderation.\n *\n * @param WP_Comment $comment Comment object.\n * @param object     $user    Comment author's object.\n *\n * @since 3.4.0\n */\nfunction wp_set_comment_cookies($comment, $user) {\n\tif ( $user->exists() )\n\t\treturn;\n\n\t/**\n\t * Filter the lifetime of the comment cookie in seconds.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param int $seconds Comment cookie lifetime. Default 30000000.\n\t */\n\t$comment_cookie_lifetime = apply_filters( 'comment_cookie_lifetime', 30000000 );\n\t$secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) );\n\tsetcookie( 'comment_author_' . COOKIEHASH, $comment->comment_author, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure );\n\tsetcookie( 'comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure );\n\tsetcookie( 'comment_author_url_' . COOKIEHASH, esc_url($comment->comment_author_url), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure );\n}\n\n/**\n * Sanitizes the cookies sent to the user already.\n *\n * Will only do anything if the cookies have already been created for the user.\n * Mostly used after cookies had been sent to use elsewhere.\n *\n * @since 2.0.4\n */\nfunction sanitize_comment_cookies() {\n\tif ( isset( $_COOKIE['comment_author_' . COOKIEHASH] ) ) {\n\t\t/**\n\t\t * Filter the comment author's name cookie before it is set.\n\t\t *\n\t\t * When this filter hook is evaluated in wp_filter_comment(),\n\t\t * the comment author's name string is passed.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param string $author_cookie The comment author name cookie.\n\t\t */\n\t\t$comment_author = apply_filters( 'pre_comment_author_name', $_COOKIE['comment_author_' . COOKIEHASH] );\n\t\t$comment_author = wp_unslash($comment_author);\n\t\t$comment_author = esc_attr($comment_author);\n\t\t$_COOKIE['comment_author_' . COOKIEHASH] = $comment_author;\n\t}\n\n\tif ( isset( $_COOKIE['comment_author_email_' . COOKIEHASH] ) ) {\n\t\t/**\n\t\t * Filter the comment author's email cookie before it is set.\n\t\t *\n\t\t * When this filter hook is evaluated in wp_filter_comment(),\n\t\t * the comment author's email string is passed.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param string $author_email_cookie The comment author email cookie.\n\t\t */\n\t\t$comment_author_email = apply_filters( 'pre_comment_author_email', $_COOKIE['comment_author_email_' . COOKIEHASH] );\n\t\t$comment_author_email = wp_unslash($comment_author_email);\n\t\t$comment_author_email = esc_attr($comment_author_email);\n\t\t$_COOKIE['comment_author_email_'.COOKIEHASH] = $comment_author_email;\n\t}\n\n\tif ( isset( $_COOKIE['comment_author_url_' . COOKIEHASH] ) ) {\n\t\t/**\n\t\t * Filter the comment author's URL cookie before it is set.\n\t\t *\n\t\t * When this filter hook is evaluated in wp_filter_comment(),\n\t\t * the comment author's URL string is passed.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param string $author_url_cookie The comment author URL cookie.\n\t\t */\n\t\t$comment_author_url = apply_filters( 'pre_comment_author_url', $_COOKIE['comment_author_url_' . COOKIEHASH] );\n\t\t$comment_author_url = wp_unslash($comment_author_url);\n\t\t$_COOKIE['comment_author_url_'.COOKIEHASH] = $comment_author_url;\n\t}\n}\n\n/**\n * Validates whether this comment is allowed to be made.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $commentdata Contains information on the comment\n * @return int|string Signifies the approval status (0|1|'spam')\n */\nfunction wp_allow_comment( $commentdata ) {\n\tglobal $wpdb;\n\n\t// Simple duplicate check\n\t// expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content)\n\t$dupe = $wpdb->prepare(\n\t\t\"SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s \",\n\t\twp_unslash( $commentdata['comment_post_ID'] ),\n\t\twp_unslash( $commentdata['comment_parent'] ),\n\t\twp_unslash( $commentdata['comment_author'] )\n\t);\n\tif ( $commentdata['comment_author_email'] ) {\n\t\t$dupe .= $wpdb->prepare(\n\t\t\t\"OR comment_author_email = %s \",\n\t\t\twp_unslash( $commentdata['comment_author_email'] )\n\t\t);\n\t}\n\t$dupe .= $wpdb->prepare(\n\t\t\") AND comment_content = %s LIMIT 1\",\n\t\twp_unslash( $commentdata['comment_content'] )\n\t);\n\n\t$dupe_id = $wpdb->get_var( $dupe );\n\n\t/**\n\t * Filters the ID, if any, of the duplicate comment found when creating a new comment.\n\t *\n\t * Return an empty value from this filter to allow what WP considers a duplicate comment.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param int   $dupe_id     ID of the comment identified as a duplicate.\n\t * @param array $commentdata Data for the comment being created.\n\t */\n\t$dupe_id = apply_filters( 'duplicate_comment_id', $dupe_id, $commentdata );\n\n\tif ( $dupe_id ) {\n\t\t/**\n\t\t * Fires immediately after a duplicate comment is detected.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $commentdata Comment data.\n\t\t */\n\t\tdo_action( 'comment_duplicate_trigger', $commentdata );\n\t\tif ( defined( 'DOING_AJAX' ) ) {\n\t\t\tdie( __('Duplicate comment detected; it looks as though you&#8217;ve already said that!') );\n\t\t}\n\t\twp_die( __( 'Duplicate comment detected; it looks as though you&#8217;ve already said that!' ), 409 );\n\t}\n\n\t/**\n\t * Fires immediately before a comment is marked approved.\n\t *\n\t * Allows checking for comment flooding.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $comment_author_IP    Comment author's IP address.\n\t * @param string $comment_author_email Comment author's email.\n\t * @param string $comment_date_gmt     GMT date the comment was posted.\n\t */\n\tdo_action(\n\t\t'check_comment_flood',\n\t\t$commentdata['comment_author_IP'],\n\t\t$commentdata['comment_author_email'],\n\t\t$commentdata['comment_date_gmt']\n\t);\n\n\tif ( ! empty( $commentdata['user_id'] ) ) {\n\t\t$user = get_userdata( $commentdata['user_id'] );\n\t\t$post_author = $wpdb->get_var( $wpdb->prepare(\n\t\t\t\"SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1\",\n\t\t\t$commentdata['comment_post_ID']\n\t\t) );\n\t}\n\n\tif ( isset( $user ) && ( $commentdata['user_id'] == $post_author || $user->has_cap( 'moderate_comments' ) ) ) {\n\t\t// The author and the admins get respect.\n\t\t$approved = 1;\n\t} else {\n\t\t// Everyone else's comments will be checked.\n\t\tif ( check_comment(\n\t\t\t$commentdata['comment_author'],\n\t\t\t$commentdata['comment_author_email'],\n\t\t\t$commentdata['comment_author_url'],\n\t\t\t$commentdata['comment_content'],\n\t\t\t$commentdata['comment_author_IP'],\n\t\t\t$commentdata['comment_agent'],\n\t\t\t$commentdata['comment_type']\n\t\t) ) {\n\t\t\t$approved = 1;\n\t\t} else {\n\t\t\t$approved = 0;\n\t\t}\n\n\t\tif ( wp_blacklist_check(\n\t\t\t$commentdata['comment_author'],\n\t\t\t$commentdata['comment_author_email'],\n\t\t\t$commentdata['comment_author_url'],\n\t\t\t$commentdata['comment_content'],\n\t\t\t$commentdata['comment_author_IP'],\n\t\t\t$commentdata['comment_agent']\n\t\t) ) {\n\t\t\t$approved = EMPTY_TRASH_DAYS ? 'trash' : 'spam';\n\t\t}\n\t}\n\n\t/**\n\t * Filter a comment's approval status before it is set.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param bool|string $approved    The approval status. Accepts 1, 0, or 'spam'.\n\t * @param array       $commentdata Comment data.\n\t */\n\t$approved = apply_filters( 'pre_comment_approved', $approved, $commentdata );\n\treturn $approved;\n}\n\n/**\n * Check whether comment flooding is occurring.\n *\n * Won't run, if current user can manage options, so to not block\n * administrators.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $ip Comment IP.\n * @param string $email Comment author email address.\n * @param string $date MySQL time string.\n */\nfunction check_comment_flood_db( $ip, $email, $date ) {\n\tglobal $wpdb;\n\t// don't throttle admins or moderators\n\tif ( current_user_can( 'manage_options' ) || current_user_can( 'moderate_comments' ) ) {\n\t\treturn;\n\t}\n\t$hour_ago = gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS );\n\n\tif ( is_user_logged_in() ) {\n\t\t$user = get_current_user_id();\n\t\t$check_column = '`user_id`';\n\t} else {\n\t\t$user = $ip;\n\t\t$check_column = '`comment_author_IP`';\n\t}\n\n\t$sql = $wpdb->prepare(\n\t\t\"SELECT `comment_date_gmt` FROM `$wpdb->comments` WHERE `comment_date_gmt` >= %s AND ( $check_column = %s OR `comment_author_email` = %s ) ORDER BY `comment_date_gmt` DESC LIMIT 1\",\n\t\t$hour_ago,\n\t\t$user,\n\t\t$email\n\t);\n\t$lasttime = $wpdb->get_var( $sql );\n\tif ( $lasttime ) {\n\t\t$time_lastcomment = mysql2date('U', $lasttime, false);\n\t\t$time_newcomment  = mysql2date('U', $date, false);\n\t\t/**\n\t\t * Filter the comment flood status.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param bool $bool             Whether a comment flood is occurring. Default false.\n\t\t * @param int  $time_lastcomment Timestamp of when the last comment was posted.\n\t\t * @param int  $time_newcomment  Timestamp of when the new comment was posted.\n\t\t */\n\t\t$flood_die = apply_filters( 'comment_flood_filter', false, $time_lastcomment, $time_newcomment );\n\t\tif ( $flood_die ) {\n\t\t\t/**\n\t\t\t * Fires before the comment flood message is triggered.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t *\n\t\t\t * @param int $time_lastcomment Timestamp of when the last comment was posted.\n\t\t\t * @param int $time_newcomment  Timestamp of when the new comment was posted.\n\t\t\t */\n\t\t\tdo_action( 'comment_flood_trigger', $time_lastcomment, $time_newcomment );\n\n\t\t\tif ( defined('DOING_AJAX') )\n\t\t\t\tdie( __('You are posting comments too quickly. Slow down.') );\n\n\t\t\twp_die( __( 'You are posting comments too quickly. Slow down.' ), 429 );\n\t\t}\n\t}\n}\n\n/**\n * Separates an array of comments into an array keyed by comment_type.\n *\n * @since 2.7.0\n *\n * @param array $comments Array of comments\n * @return array Array of comments keyed by comment_type.\n */\nfunction separate_comments(&$comments) {\n\t$comments_by_type = array('comment' => array(), 'trackback' => array(), 'pingback' => array(), 'pings' => array());\n\t$count = count($comments);\n\tfor ( $i = 0; $i < $count; $i++ ) {\n\t\t$type = $comments[$i]->comment_type;\n\t\tif ( empty($type) )\n\t\t\t$type = 'comment';\n\t\t$comments_by_type[$type][] = &$comments[$i];\n\t\tif ( 'trackback' == $type || 'pingback' == $type )\n\t\t\t$comments_by_type['pings'][] = &$comments[$i];\n\t}\n\n\treturn $comments_by_type;\n}\n\n/**\n * Calculate the total number of comment pages.\n *\n * @since 2.7.0\n *\n * @uses Walker_Comment\n *\n * @global WP_Query $wp_query\n *\n * @param array $comments Optional array of WP_Comment objects. Defaults to $wp_query->comments\n * @param int   $per_page Optional comments per page.\n * @param bool  $threaded Optional control over flat or threaded comments.\n * @return int Number of comment pages.\n */\nfunction get_comment_pages_count( $comments = null, $per_page = null, $threaded = null ) {\n\tglobal $wp_query;\n\n\tif ( null === $comments && null === $per_page && null === $threaded && !empty($wp_query->max_num_comment_pages) )\n\t\treturn $wp_query->max_num_comment_pages;\n\n\tif ( ( ! $comments || ! is_array( $comments ) ) && ! empty( $wp_query->comments )  )\n\t\t$comments = $wp_query->comments;\n\n\tif ( empty($comments) )\n\t\treturn 0;\n\n\tif ( ! get_option( 'page_comments' ) ) {\n\t\treturn 1;\n\t}\n\n\tif ( !isset($per_page) )\n\t\t$per_page = (int) get_query_var('comments_per_page');\n\tif ( 0 === $per_page )\n\t\t$per_page = (int) get_option('comments_per_page');\n\tif ( 0 === $per_page )\n\t\treturn 1;\n\n\tif ( !isset($threaded) )\n\t\t$threaded = get_option('thread_comments');\n\n\tif ( $threaded ) {\n\t\t$walker = new Walker_Comment;\n\t\t$count = ceil( $walker->get_number_of_root_elements( $comments ) / $per_page );\n\t} else {\n\t\t$count = ceil( count( $comments ) / $per_page );\n\t}\n\n\treturn $count;\n}\n\n/**\n * Calculate what page number a comment will appear on for comment paging.\n *\n * @since 2.7.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int   $comment_ID Comment ID.\n * @param array $args {\n *      Array of optional arguments.\n *      @type string     $type      Limit paginated comments to those matching a given type. Accepts 'comment',\n *                                  'trackback', 'pingback', 'pings' (trackbacks and pingbacks), or 'all'.\n *                                  Default is 'all'.\n *      @type int        $per_page  Per-page count to use when calculating pagination. Defaults to the value of the\n *                                  'comments_per_page' option.\n *      @type int|string $max_depth If greater than 1, comment page will be determined for the top-level parent of\n *                                  `$comment_ID`. Defaults to the value of the 'thread_comments_depth' option.\n * } *\n * @return int|null Comment page number or null on error.\n */\nfunction get_page_of_comment( $comment_ID, $args = array() ) {\n\tglobal $wpdb;\n\n\t$page = null;\n\n\tif ( !$comment = get_comment( $comment_ID ) )\n\t\treturn;\n\n\t$defaults = array( 'type' => 'all', 'page' => '', 'per_page' => '', 'max_depth' => '' );\n\t$args = wp_parse_args( $args, $defaults );\n\t$original_args = $args;\n\n\t// Order of precedence: 1. `$args['per_page']`, 2. 'comments_per_page' query_var, 3. 'comments_per_page' option.\n\tif ( get_option( 'page_comments' ) ) {\n\t\tif ( '' === $args['per_page'] ) {\n\t\t\t$args['per_page'] = get_query_var( 'comments_per_page' );\n\t\t}\n\n\t\tif ( '' === $args['per_page'] ) {\n\t\t\t$args['per_page'] = get_option( 'comments_per_page' );\n\t\t}\n\t}\n\n\tif ( empty($args['per_page']) ) {\n\t\t$args['per_page'] = 0;\n\t\t$args['page'] = 0;\n\t}\n\n\tif ( $args['per_page'] < 1 ) {\n\t\t$page = 1;\n\t}\n\n\tif ( null === $page ) {\n\t\tif ( '' === $args['max_depth'] ) {\n\t\t\tif ( get_option('thread_comments') )\n\t\t\t\t$args['max_depth'] = get_option('thread_comments_depth');\n\t\t\telse\n\t\t\t\t$args['max_depth'] = -1;\n\t\t}\n\n\t\t// Find this comment's top level parent if threading is enabled\n\t\tif ( $args['max_depth'] > 1 && 0 != $comment->comment_parent )\n\t\t\treturn get_page_of_comment( $comment->comment_parent, $args );\n\n\t\t$comment_args = array(\n\t\t\t'type'       => $args['type'],\n\t\t\t'post_id'    => $comment->comment_post_ID,\n\t\t\t'fields'     => 'ids',\n\t\t\t'count'      => true,\n\t\t\t'status'     => 'approve',\n\t\t\t'parent'     => 0,\n\t\t\t'date_query' => array(\n\t\t\t\tarray(\n\t\t\t\t\t'column' => \"$wpdb->comments.comment_date_gmt\",\n\t\t\t\t\t'before' => $comment->comment_date_gmt,\n\t\t\t\t)\n\t\t\t),\n\t\t);\n\n\t\t$comment_query = new WP_Comment_Query();\n\t\t$older_comment_count = $comment_query->query( $comment_args );\n\n\t\t// No older comments? Then it's page #1.\n\t\tif ( 0 == $older_comment_count ) {\n\t\t\t$page = 1;\n\n\t\t// Divide comments older than this one by comments per page to get this comment's page number\n\t\t} else {\n\t\t\t$page = ceil( ( $older_comment_count + 1 ) / $args['per_page'] );\n\t\t}\n\t}\n\n\t/**\n\t * Filters the calculated page on which a comment appears.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param int   $page          Comment page.\n\t * @param array $args {\n\t *     Arguments used to calculate pagination. These include arguments auto-detected by the function,\n\t *     based on query vars, system settings, etc. For pristine arguments passed to the function,\n\t *     see `$original_args`.\n\t *\n\t *     @type string $type      Type of comments to count.\n\t *     @type int    $page      Calculated current page.\n\t *     @type int    $per_page  Calculated number of comments per page.\n\t *     @type int    $max_depth Maximum comment threading depth allowed.\n\t * }\n\t * @param array $original_args {\n\t *     Array of arguments passed to the function. Some or all of these may not be set.\n\t *\n\t *     @type string $type      Type of comments to count.\n\t *     @type int    $page      Current comment page.\n\t *     @type int    $per_page  Number of comments per page.\n\t *     @type int    $max_depth Maximum comment threading depth allowed.\n\t * }\n\t */\n\treturn apply_filters( 'get_page_of_comment', (int) $page, $args, $original_args );\n}\n\n/**\n * Does comment contain blacklisted characters or words.\n *\n * @since 1.5.0\n *\n * @param string $author The author of the comment\n * @param string $email The email of the comment\n * @param string $url The url used in the comment\n * @param string $comment The comment content\n * @param string $user_ip The comment author IP address\n * @param string $user_agent The author's browser user agent\n * @return bool True if comment contains blacklisted content, false if comment does not\n */\nfunction wp_blacklist_check($author, $email, $url, $comment, $user_ip, $user_agent) {\n\t/**\n\t * Fires before the comment is tested for blacklisted characters or words.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $author     Comment author.\n\t * @param string $email      Comment author's email.\n\t * @param string $url        Comment author's URL.\n\t * @param string $comment    Comment content.\n\t * @param string $user_ip    Comment author's IP address.\n\t * @param string $user_agent Comment author's browser user agent.\n\t */\n\tdo_action( 'wp_blacklist_check', $author, $email, $url, $comment, $user_ip, $user_agent );\n\n\t$mod_keys = trim( get_option('blacklist_keys') );\n\tif ( '' == $mod_keys )\n\t\treturn false; // If moderation keys are empty\n\t$words = explode(\"\\n\", $mod_keys );\n\n\tforeach ( (array) $words as $word ) {\n\t\t$word = trim($word);\n\n\t\t// Skip empty lines\n\t\tif ( empty($word) ) { continue; }\n\n\t\t// Do some escaping magic so that '#' chars in the\n\t\t// spam words don't break things:\n\t\t$word = preg_quote($word, '#');\n\n\t\t$pattern = \"#$word#i\";\n\t\tif (\n\t\t\t   preg_match($pattern, $author)\n\t\t\t|| preg_match($pattern, $email)\n\t\t\t|| preg_match($pattern, $url)\n\t\t\t|| preg_match($pattern, $comment)\n\t\t\t|| preg_match($pattern, $user_ip)\n\t\t\t|| preg_match($pattern, $user_agent)\n\t\t )\n\t\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Retrieve total comments for blog or single post.\n *\n * The properties of the returned object contain the 'moderated', 'approved',\n * and spam comments for either the entire blog or single post. Those properties\n * contain the amount of comments that match the status. The 'total_comments'\n * property contains the integer of total comments.\n *\n * The comment stats are cached and then retrieved, if they already exist in the\n * cache.\n *\n * @since 2.5.0\n *\n * @param int $post_id Optional. Post ID.\n * @return object|array Comment stats.\n */\nfunction wp_count_comments( $post_id = 0 ) {\n\t$post_id = (int) $post_id;\n\n\t/**\n\t * Filter the comments count for a given post.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array $count   An empty array.\n\t * @param int   $post_id The post ID.\n\t */\n\t$filtered = apply_filters( 'wp_count_comments', array(), $post_id );\n\tif ( ! empty( $filtered ) ) {\n\t\treturn $filtered;\n\t}\n\n\t$count = wp_cache_get( \"comments-{$post_id}\", 'counts' );\n\tif ( false !== $count ) {\n\t\treturn $count;\n\t}\n\n\t$stats = get_comment_count( $post_id );\n\t$stats['moderated'] = $stats['awaiting_moderation'];\n\tunset( $stats['awaiting_moderation'] );\n\n\t$stats_object = (object) $stats;\n\twp_cache_set( \"comments-{$post_id}\", $stats_object, 'counts' );\n\n\treturn $stats_object;\n}\n\n/**\n * Trashes or deletes a comment.\n *\n * The comment is moved to trash instead of permanently deleted unless trash is\n * disabled, item is already in the trash, or $force_delete is true.\n *\n * The post comment count will be updated if the comment was approved and has a\n * post ID available.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|WP_Comment $comment_id   Comment ID or WP_Comment object.\n * @param bool           $force_delete Whether to bypass trash and force deletion. Default is false.\n * @return bool True on success, false on failure.\n */\nfunction wp_delete_comment($comment_id, $force_delete = false) {\n\tglobal $wpdb;\n\tif (!$comment = get_comment($comment_id))\n\t\treturn false;\n\n\tif ( !$force_delete && EMPTY_TRASH_DAYS && !in_array( wp_get_comment_status( $comment ), array( 'trash', 'spam' ) ) )\n\t\treturn wp_trash_comment($comment_id);\n\n\t/**\n\t * Fires immediately before a comment is deleted from the database.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param int $comment_id The comment ID.\n\t */\n\tdo_action( 'delete_comment', $comment->comment_ID );\n\n\t// Move children up a level.\n\t$children = $wpdb->get_col( $wpdb->prepare(\"SELECT comment_ID FROM $wpdb->comments WHERE comment_parent = %d\", $comment->comment_ID) );\n\tif ( !empty($children) ) {\n\t\t$wpdb->update($wpdb->comments, array('comment_parent' => $comment->comment_parent), array('comment_parent' => $comment->comment_ID));\n\t\tclean_comment_cache($children);\n\t}\n\n\t// Delete metadata\n\t$meta_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT meta_id FROM $wpdb->commentmeta WHERE comment_id = %d\", $comment->comment_ID ) );\n\tforeach ( $meta_ids as $mid )\n\t\tdelete_metadata_by_mid( 'comment', $mid );\n\n\tif ( ! $wpdb->delete( $wpdb->comments, array( 'comment_ID' => $comment->comment_ID ) ) )\n\t\treturn false;\n\n\t/**\n\t * Fires immediately after a comment is deleted from the database.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $comment_id The comment ID.\n\t */\n\tdo_action( 'deleted_comment', $comment->comment_ID );\n\n\t$post_id = $comment->comment_post_ID;\n\tif ( $post_id && $comment->comment_approved == 1 )\n\t\twp_update_comment_count($post_id);\n\n\tclean_comment_cache( $comment->comment_ID );\n\n\t/** This action is documented in wp-includes/comment.php */\n\tdo_action( 'wp_set_comment_status', $comment->comment_ID, 'delete' );\n\n\twp_transition_comment_status('delete', $comment->comment_approved, $comment);\n\treturn true;\n}\n\n/**\n * Moves a comment to the Trash\n *\n * If trash is disabled, comment is permanently deleted.\n *\n * @since 2.9.0\n *\n * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.\n * @return bool True on success, false on failure.\n */\nfunction wp_trash_comment($comment_id) {\n\tif ( !EMPTY_TRASH_DAYS )\n\t\treturn wp_delete_comment($comment_id, true);\n\n\tif ( !$comment = get_comment($comment_id) )\n\t\treturn false;\n\n\t/**\n\t * Fires immediately before a comment is sent to the Trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $comment_id The comment ID.\n\t */\n\tdo_action( 'trash_comment', $comment->comment_ID );\n\n\tif ( wp_set_comment_status( $comment, 'trash' ) ) {\n\t\tdelete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' );\n\t\tdelete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' );\n\t\tadd_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved );\n\t\tadd_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() );\n\n\t\t/**\n\t\t * Fires immediately after a comment is sent to Trash.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $comment_id The comment ID.\n\t\t */\n\t\tdo_action( 'trashed_comment', $comment->comment_ID );\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Removes a comment from the Trash\n *\n * @since 2.9.0\n *\n * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.\n * @return bool True on success, false on failure.\n */\nfunction wp_untrash_comment($comment_id) {\n\t$comment = get_comment( $comment_id );\n\tif ( ! $comment ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fires immediately before a comment is restored from the Trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $comment_id The comment ID.\n\t */\n\tdo_action( 'untrash_comment', $comment->comment_ID );\n\n\t$status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true );\n\tif ( empty($status) )\n\t\t$status = '0';\n\n\tif ( wp_set_comment_status( $comment, $status ) ) {\n\t\tdelete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' );\n\t\tdelete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' );\n\t\t/**\n\t\t * Fires immediately after a comment is restored from the Trash.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $comment_id The comment ID.\n\t\t */\n\t\tdo_action( 'untrashed_comment', $comment->comment_ID );\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Marks a comment as Spam\n *\n * @since 2.9.0\n *\n * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.\n * @return bool True on success, false on failure.\n */\nfunction wp_spam_comment( $comment_id ) {\n\t$comment = get_comment( $comment_id );\n\tif ( ! $comment ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fires immediately before a comment is marked as Spam.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $comment_id The comment ID.\n\t */\n\tdo_action( 'spam_comment', $comment->comment_ID );\n\n\tif ( wp_set_comment_status( $comment, 'spam' ) ) {\n\t\tdelete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' );\n\t\tdelete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' );\n\t\tadd_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved );\n\t\tadd_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() );\n\t\t/**\n\t\t * Fires immediately after a comment is marked as Spam.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $comment_id The comment ID.\n\t\t */\n\t\tdo_action( 'spammed_comment', $comment->comment_ID );\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Removes a comment from the Spam\n *\n * @since 2.9.0\n *\n * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.\n * @return bool True on success, false on failure.\n */\nfunction wp_unspam_comment( $comment_id ) {\n\t$comment = get_comment( $comment_id );\n\tif ( ! $comment ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fires immediately before a comment is unmarked as Spam.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $comment_id The comment ID.\n\t */\n\tdo_action( 'unspam_comment', $comment->comment_ID );\n\n\t$status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true );\n\tif ( empty($status) )\n\t\t$status = '0';\n\n\tif ( wp_set_comment_status( $comment, $status ) ) {\n\t\tdelete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' );\n\t\tdelete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' );\n\t\t/**\n\t\t * Fires immediately after a comment is unmarked as Spam.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $comment_id The comment ID.\n\t\t */\n\t\tdo_action( 'unspammed_comment', $comment->comment_ID );\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * The status of a comment by ID.\n *\n * @since 1.0.0\n *\n * @param int|WP_Comment $comment_id Comment ID or WP_Comment object\n * @return false|string Status might be 'trash', 'approved', 'unapproved', 'spam'. False on failure.\n */\nfunction wp_get_comment_status($comment_id) {\n\t$comment = get_comment($comment_id);\n\tif ( !$comment )\n\t\treturn false;\n\n\t$approved = $comment->comment_approved;\n\n\tif ( $approved == null )\n\t\treturn false;\n\telseif ( $approved == '1' )\n\t\treturn 'approved';\n\telseif ( $approved == '0' )\n\t\treturn 'unapproved';\n\telseif ( $approved == 'spam' )\n\t\treturn 'spam';\n\telseif ( $approved == 'trash' )\n\t\treturn 'trash';\n\telse\n\t\treturn false;\n}\n\n/**\n * Call hooks for when a comment status transition occurs.\n *\n * Calls hooks for comment status transitions. If the new comment status is not the same\n * as the previous comment status, then two hooks will be ran, the first is\n * 'transition_comment_status' with new status, old status, and comment data. The\n * next action called is 'comment_OLDSTATUS_to_NEWSTATUS' the NEWSTATUS is the\n * $new_status parameter and the OLDSTATUS is $old_status parameter; it has the\n * comment data.\n *\n * The final action will run whether or not the comment statuses are the same. The\n * action is named 'comment_NEWSTATUS_COMMENTTYPE', NEWSTATUS is from the $new_status\n * parameter and COMMENTTYPE is comment_type comment data.\n *\n * @since 2.7.0\n *\n * @param string $new_status New comment status.\n * @param string $old_status Previous comment status.\n * @param object $comment Comment data.\n */\nfunction wp_transition_comment_status($new_status, $old_status, $comment) {\n\t/*\n\t * Translate raw statuses to human readable formats for the hooks.\n\t * This is not a complete list of comment status, it's only the ones\n\t * that need to be renamed\n\t */\n\t$comment_statuses = array(\n\t\t0         => 'unapproved',\n\t\t'hold'    => 'unapproved', // wp_set_comment_status() uses \"hold\"\n\t\t1         => 'approved',\n\t\t'approve' => 'approved', // wp_set_comment_status() uses \"approve\"\n\t);\n\tif ( isset($comment_statuses[$new_status]) ) $new_status = $comment_statuses[$new_status];\n\tif ( isset($comment_statuses[$old_status]) ) $old_status = $comment_statuses[$old_status];\n\n\t// Call the hooks\n\tif ( $new_status != $old_status ) {\n\t\t/**\n\t\t * Fires when the comment status is in transition.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param int|string $new_status The new comment status.\n\t\t * @param int|string $old_status The old comment status.\n\t\t * @param object     $comment    The comment data.\n\t\t */\n\t\tdo_action( 'transition_comment_status', $new_status, $old_status, $comment );\n\t\t/**\n\t\t * Fires when the comment status is in transition from one specific status to another.\n\t\t *\n\t\t * The dynamic portions of the hook name, `$old_status`, and `$new_status`,\n\t\t * refer to the old and new comment statuses, respectively.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param WP_Comment $comment Comment object.\n\t\t */\n\t\tdo_action( \"comment_{$old_status}_to_{$new_status}\", $comment );\n\t}\n\t/**\n\t * Fires when the status of a specific comment type is in transition.\n\t *\n\t * The dynamic portions of the hook name, `$new_status`, and `$comment->comment_type`,\n\t * refer to the new comment status, and the type of comment, respectively.\n\t *\n\t * Typical comment types include an empty string (standard comment), 'pingback',\n\t * or 'trackback'.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param int        $comment_ID The comment ID.\n\t * @param WP_Comment $comment    Comment object.\n\t */\n\tdo_action( \"comment_{$new_status}_{$comment->comment_type}\", $comment->comment_ID, $comment );\n}\n\n/**\n * Get current commenter's name, email, and URL.\n *\n * Expects cookies content to already be sanitized. User of this function might\n * wish to recheck the returned array for validity.\n *\n * @see sanitize_comment_cookies() Use to sanitize cookies\n *\n * @since 2.0.4\n *\n * @return array Comment author, email, url respectively.\n */\nfunction wp_get_current_commenter() {\n\t// Cookies should already be sanitized.\n\n\t$comment_author = '';\n\tif ( isset($_COOKIE['comment_author_'.COOKIEHASH]) )\n\t\t$comment_author = $_COOKIE['comment_author_'.COOKIEHASH];\n\n\t$comment_author_email = '';\n\tif ( isset($_COOKIE['comment_author_email_'.COOKIEHASH]) )\n\t\t$comment_author_email = $_COOKIE['comment_author_email_'.COOKIEHASH];\n\n\t$comment_author_url = '';\n\tif ( isset($_COOKIE['comment_author_url_'.COOKIEHASH]) )\n\t\t$comment_author_url = $_COOKIE['comment_author_url_'.COOKIEHASH];\n\n\t/**\n\t * Filter the current commenter's name, email, and URL.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array $comment_author_data {\n\t *     An array of current commenter variables.\n\t *\n\t *     @type string $comment_author       The name of the author of the comment. Default empty.\n\t *     @type string $comment_author_email The email address of the `$comment_author`. Default empty.\n\t *     @type string $comment_author_url   The URL address of the `$comment_author`. Default empty.\n\t * }\n\t */\n\treturn apply_filters( 'wp_get_current_commenter', compact('comment_author', 'comment_author_email', 'comment_author_url') );\n}\n\n/**\n * Inserts a comment into the database.\n *\n * @since 2.0.0\n * @since 4.4.0 Introduced `$comment_meta` argument.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $commentdata {\n *     Array of arguments for inserting a new comment.\n *\n *     @type string     $comment_agent        The HTTP user agent of the `$comment_author` when\n *                                            the comment was submitted. Default empty.\n *     @type int|string $comment_approved     Whether the comment has been approved. Default 1.\n *     @type string     $comment_author       The name of the author of the comment. Default empty.\n *     @type string     $comment_author_email The email address of the `$comment_author`. Default empty.\n *     @type string     $comment_author_IP    The IP address of the `$comment_author`. Default empty.\n *     @type string     $comment_author_url   The URL address of the `$comment_author`. Default empty.\n *     @type string     $comment_content      The content of the comment. Default empty.\n *     @type string     $comment_date         The date the comment was submitted. To set the date\n *                                            manually, `$comment_date_gmt` must also be specified.\n *                                            Default is the current time.\n *     @type string     $comment_date_gmt     The date the comment was submitted in the GMT timezone.\n *                                            Default is `$comment_date` in the site's GMT timezone.\n *     @type int        $comment_karma        The karma of the comment. Default 0.\n *     @type int        $comment_parent       ID of this comment's parent, if any. Default 0.\n *     @type int        $comment_post_ID      ID of the post that relates to the comment, if any.\n *                                            Default empty.\n *     @type string     $comment_type         Comment type. Default empty.\n *     @type array      $comment_meta         Optional. Array of key/value pairs to be stored in commentmeta for the\n *                                            new comment.\n *     @type int        $user_id              ID of the user who submitted the comment. Default 0.\n * }\n * @return int|false The new comment's ID on success, false on failure.\n */\nfunction wp_insert_comment( $commentdata ) {\n\tglobal $wpdb;\n\t$data = wp_unslash( $commentdata );\n\n\t$comment_author       = ! isset( $data['comment_author'] )       ? '' : $data['comment_author'];\n\t$comment_author_email = ! isset( $data['comment_author_email'] ) ? '' : $data['comment_author_email'];\n\t$comment_author_url   = ! isset( $data['comment_author_url'] )   ? '' : $data['comment_author_url'];\n\t$comment_author_IP    = ! isset( $data['comment_author_IP'] )    ? '' : $data['comment_author_IP'];\n\n\t$comment_date     = ! isset( $data['comment_date'] )     ? current_time( 'mysql' )            : $data['comment_date'];\n\t$comment_date_gmt = ! isset( $data['comment_date_gmt'] ) ? get_gmt_from_date( $comment_date ) : $data['comment_date_gmt'];\n\n\t$comment_post_ID  = ! isset( $data['comment_post_ID'] )  ? '' : $data['comment_post_ID'];\n\t$comment_content  = ! isset( $data['comment_content'] )  ? '' : $data['comment_content'];\n\t$comment_karma    = ! isset( $data['comment_karma'] )    ? 0  : $data['comment_karma'];\n\t$comment_approved = ! isset( $data['comment_approved'] ) ? 1  : $data['comment_approved'];\n\t$comment_agent    = ! isset( $data['comment_agent'] )    ? '' : $data['comment_agent'];\n\t$comment_type     = ! isset( $data['comment_type'] )     ? '' : $data['comment_type'];\n\t$comment_parent   = ! isset( $data['comment_parent'] )   ? 0  : $data['comment_parent'];\n\n\t$user_id  = ! isset( $data['user_id'] ) ? 0 : $data['user_id'];\n\n\t$compacted = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_date', 'comment_date_gmt', 'comment_content', 'comment_karma', 'comment_approved', 'comment_agent', 'comment_type', 'comment_parent', 'user_id' );\n\tif ( ! $wpdb->insert( $wpdb->comments, $compacted ) ) {\n\t\treturn false;\n\t}\n\n\t$id = (int) $wpdb->insert_id;\n\n\tif ( $comment_approved == 1 ) {\n\t\twp_update_comment_count( $comment_post_ID );\n\t}\n\t$comment = get_comment( $id );\n\n\t// If metadata is provided, store it.\n\tif ( isset( $commentdata['comment_meta'] ) && is_array( $commentdata['comment_meta'] ) ) {\n\t\tforeach ( $commentdata['comment_meta'] as $meta_key => $meta_value ) {\n\t\t\tadd_comment_meta( $comment->comment_ID, $meta_key, $meta_value, true );\n\t\t}\n\t}\n\n\t/**\n\t * Fires immediately after a comment is inserted into the database.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param int        $id      The comment ID.\n\t * @param WP_Comment $comment Comment object.\n\t */\n\tdo_action( 'wp_insert_comment', $id, $comment );\n\n\twp_cache_set( 'last_changed', microtime(), 'comment' );\n\n\treturn $id;\n}\n\n/**\n * Filters and sanitizes comment data.\n *\n * Sets the comment data 'filtered' field to true when finished. This can be\n * checked as to whether the comment should be filtered and to keep from\n * filtering the same comment more than once.\n *\n * @since 2.0.0\n *\n * @param array $commentdata Contains information on the comment.\n * @return array Parsed comment information.\n */\nfunction wp_filter_comment($commentdata) {\n\tif ( isset( $commentdata['user_ID'] ) ) {\n\t\t/**\n\t\t * Filter the comment author's user id before it is set.\n\t\t *\n\t\t * The first time this filter is evaluated, 'user_ID' is checked\n\t\t * (for back-compat), followed by the standard 'user_id' value.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param int $user_ID The comment author's user ID.\n\t\t */\n\t\t$commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_ID'] );\n\t} elseif ( isset( $commentdata['user_id'] ) ) {\n\t\t/** This filter is documented in wp-includes/comment.php */\n\t\t$commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_id'] );\n\t}\n\n\t/**\n\t * Filter the comment author's browser user agent before it is set.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param int $comment_agent The comment author's browser user agent.\n\t */\n\t$commentdata['comment_agent'] = apply_filters( 'pre_comment_user_agent', ( isset( $commentdata['comment_agent'] ) ? $commentdata['comment_agent'] : '' ) );\n\t/** This filter is documented in wp-includes/comment.php */\n\t$commentdata['comment_author'] = apply_filters( 'pre_comment_author_name', $commentdata['comment_author'] );\n\t/**\n\t * Filter the comment content before it is set.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param int $comment_content The comment content.\n\t */\n\t$commentdata['comment_content'] = apply_filters( 'pre_comment_content', $commentdata['comment_content'] );\n\t/**\n\t * Filter the comment author's IP before it is set.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param int $comment_author_ip The comment author's IP.\n\t */\n\t$commentdata['comment_author_IP'] = apply_filters( 'pre_comment_user_ip', $commentdata['comment_author_IP'] );\n\t/** This filter is documented in wp-includes/comment.php */\n\t$commentdata['comment_author_url'] = apply_filters( 'pre_comment_author_url', $commentdata['comment_author_url'] );\n\t/** This filter is documented in wp-includes/comment.php */\n\t$commentdata['comment_author_email'] = apply_filters( 'pre_comment_author_email', $commentdata['comment_author_email'] );\n\t$commentdata['filtered'] = true;\n\treturn $commentdata;\n}\n\n/**\n * Whether a comment should be blocked because of comment flood.\n *\n * @since 2.1.0\n *\n * @param bool $block Whether plugin has already blocked comment.\n * @param int $time_lastcomment Timestamp for last comment.\n * @param int $time_newcomment Timestamp for new comment.\n * @return bool Whether comment should be blocked.\n */\nfunction wp_throttle_comment_flood($block, $time_lastcomment, $time_newcomment) {\n\tif ( $block ) // a plugin has already blocked... we'll let that decision stand\n\t\treturn $block;\n\tif ( ($time_newcomment - $time_lastcomment) < 15 )\n\t\treturn true;\n\treturn false;\n}\n\n/**\n * Adds a new comment to the database.\n *\n * Filters new comment to ensure that the fields are sanitized and valid before\n * inserting comment into database. Calls 'comment_post' action with comment ID\n * and whether comment is approved by WordPress. Also has 'preprocess_comment'\n * filter for processing the comment data before the function handles it.\n *\n * We use REMOTE_ADDR here directly. If you are behind a proxy, you should ensure\n * that it is properly set, such as in wp-config.php, for your environment.\n * See {@link https://core.trac.wordpress.org/ticket/9235}\n *\n * @since 1.5.0\n * @since 4.3.0 'comment_agent' and 'comment_author_IP' can be set via `$commentdata`.\n *\n * @see wp_insert_comment()\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $commentdata {\n *     Comment data.\n *\n *     @type string $comment_author       The name of the comment author.\n *     @type string $comment_author_email The comment author email address.\n *     @type string $comment_author_url   The comment author URL.\n *     @type string $comment_content      The content of the comment.\n *     @type string $comment_date         The date the comment was submitted. Default is the current time.\n *     @type string $comment_date_gmt     The date the comment was submitted in the GMT timezone.\n *                                        Default is `$comment_date` in the GMT timezone.\n *     @type int    $comment_parent       The ID of this comment's parent, if any. Default 0.\n *     @type int    $comment_post_ID      The ID of the post that relates to the comment.\n *     @type int    $user_id              The ID of the user who submitted the comment. Default 0.\n *     @type int    $user_ID              Kept for backward-compatibility. Use `$user_id` instead.\n *     @type string $comment_agent        Comment author user agent. Default is the value of 'HTTP_USER_AGENT'\n *                                        in the `$_SERVER` superglobal sent in the original request.\n *     @type string $comment_author_IP    Comment author IP address in IPv4 format. Default is the value of\n *                                        'REMOTE_ADDR' in the `$_SERVER` superglobal sent in the original request.\n * }\n * @return int|false The ID of the comment on success, false on failure.\n */\nfunction wp_new_comment( $commentdata ) {\n\tglobal $wpdb;\n\n\tif ( isset( $commentdata['user_ID'] ) ) {\n\t\t$commentdata['user_id'] = $commentdata['user_ID'] = (int) $commentdata['user_ID'];\n\t}\n\n\t$prefiltered_user_id = ( isset( $commentdata['user_id'] ) ) ? (int) $commentdata['user_id'] : 0;\n\n\t/**\n\t * Filter a comment's data before it is sanitized and inserted into the database.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param array $commentdata Comment data.\n\t */\n\t$commentdata = apply_filters( 'preprocess_comment', $commentdata );\n\n\t$commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID'];\n\tif ( isset( $commentdata['user_ID'] ) && $prefiltered_user_id !== (int) $commentdata['user_ID'] ) {\n\t\t$commentdata['user_id'] = $commentdata['user_ID'] = (int) $commentdata['user_ID'];\n\t} elseif ( isset( $commentdata['user_id'] ) ) {\n\t\t$commentdata['user_id'] = (int) $commentdata['user_id'];\n\t}\n\n\t$commentdata['comment_parent'] = isset($commentdata['comment_parent']) ? absint($commentdata['comment_parent']) : 0;\n\t$parent_status = ( 0 < $commentdata['comment_parent'] ) ? wp_get_comment_status($commentdata['comment_parent']) : '';\n\t$commentdata['comment_parent'] = ( 'approved' == $parent_status || 'unapproved' == $parent_status ) ? $commentdata['comment_parent'] : 0;\n\n\tif ( ! isset( $commentdata['comment_author_IP'] ) ) {\n\t\t$commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR'];\n\t}\n\t$commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '', $commentdata['comment_author_IP'] );\n\n\tif ( ! isset( $commentdata['comment_agent'] ) ) {\n\t\t$commentdata['comment_agent'] = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT']: '';\n\t}\n\t$commentdata['comment_agent'] = substr( $commentdata['comment_agent'], 0, 254 );\n\n\tif ( empty( $commentdata['comment_date'] ) ) {\n\t\t$commentdata['comment_date'] = current_time('mysql');\n\t}\n\n\tif ( empty( $commentdata['comment_date_gmt'] ) ) {\n\t\t$commentdata['comment_date_gmt'] = current_time( 'mysql', 1 );\n\t}\n\n\t$commentdata = wp_filter_comment($commentdata);\n\n\t$commentdata['comment_approved'] = wp_allow_comment($commentdata);\n\n\t$comment_ID = wp_insert_comment($commentdata);\n\tif ( ! $comment_ID ) {\n\t\t$fields = array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content' );\n\n\t\tforeach ( $fields as $field ) {\n\t\t\tif ( isset( $commentdata[ $field ] ) ) {\n\t\t\t\t$commentdata[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->comments, $field, $commentdata[ $field ] );\n\t\t\t}\n\t\t}\n\n\t\t$commentdata = wp_filter_comment( $commentdata );\n\n\t\t$commentdata['comment_approved'] = wp_allow_comment( $commentdata );\n\n\t\t$comment_ID = wp_insert_comment( $commentdata );\n\t\tif ( ! $comment_ID ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Fires immediately after a comment is inserted into the database.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param int        $comment_ID       The comment ID.\n\t * @param int|string $comment_approved 1 if the comment is approved, 0 if not, 'spam' if spam.\n\t */\n\tdo_action( 'comment_post', $comment_ID, $commentdata['comment_approved'] );\n\n\treturn $comment_ID;\n}\n\n/**\n * Send a comment moderation notification to the comment moderator.\n *\n * @since 4.4.0\n *\n * @param int $comment_ID ID of the comment.\n * @return bool True on success, false on failure.\n */\nfunction wp_new_comment_notify_moderator( $comment_ID ) {\n\t$comment = get_comment( $comment_ID );\n\n\t// Only send notifications for pending comments.\n\t$maybe_notify = ( '0' == $comment->comment_approved );\n\n\t/** This filter is documented in wp-includes/comment.php */\n\t$maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_ID );\n\n\tif ( ! $maybe_notify ) {\n\t\treturn false;\n\t}\n\n\treturn wp_notify_moderator( $comment_ID );\n}\n\n/**\n * Send a notification of a new comment to the post author.\n *\n * @since 4.4.0\n *\n * Uses the {@see 'notify_post_author'} filter to determine whether the post author\n * should be notified when a new comment is added, overriding site setting.\n *\n * @param int $comment_ID Comment ID.\n * @return bool True on success, false on failure.\n */\nfunction wp_new_comment_notify_postauthor( $comment_ID ) {\n\t$comment = get_comment( $comment_ID );\n\n\t$maybe_notify = get_option( 'comments_notify' );\n\n\t/**\n\t * Filter whether to send the post author new comment notification emails,\n\t * overriding the site setting.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param bool $maybe_notify Whether to notify the post author about the new comment.\n\t * @param int  $comment_ID   The ID of the comment for the notification.\n\t */\n\t$maybe_notify = apply_filters( 'notify_post_author', $maybe_notify, $comment_ID );\n\n\t/*\n\t * wp_notify_postauthor() checks if notifying the author of their own comment.\n\t * By default, it won't, but filters can override this.\n\t */\n\tif ( ! $maybe_notify ) {\n\t\treturn false;\n\t}\n\n\t// Only send notifications for approved comments.\n\tif ( ! isset( $comment->comment_approved ) || '1' != $comment->comment_approved ) {\n\t\treturn false;\n\t}\n\n\treturn wp_notify_postauthor( $comment_ID );\n}\n\n/**\n * Sets the status of a comment.\n *\n * The 'wp_set_comment_status' action is called after the comment is handled.\n * If the comment status is not in the list, then false is returned.\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|WP_Comment $comment_id     Comment ID or WP_Comment object.\n * @param string         $comment_status New comment status, either 'hold', 'approve', 'spam', or 'trash'.\n * @param bool           $wp_error       Whether to return a WP_Error object if there is a failure. Default is false.\n * @return bool|WP_Error True on success, false or WP_Error on failure.\n */\nfunction wp_set_comment_status($comment_id, $comment_status, $wp_error = false) {\n\tglobal $wpdb;\n\n\tswitch ( $comment_status ) {\n\t\tcase 'hold':\n\t\tcase '0':\n\t\t\t$status = '0';\n\t\t\tbreak;\n\t\tcase 'approve':\n\t\tcase '1':\n\t\t\t$status = '1';\n\t\t\tadd_action( 'wp_set_comment_status', 'wp_new_comment_notify_postauthor' );\n\t\t\tbreak;\n\t\tcase 'spam':\n\t\t\t$status = 'spam';\n\t\t\tbreak;\n\t\tcase 'trash':\n\t\t\t$status = 'trash';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n\n\t$comment_old = clone get_comment($comment_id);\n\n\tif ( !$wpdb->update( $wpdb->comments, array('comment_approved' => $status), array( 'comment_ID' => $comment_old->comment_ID ) ) ) {\n\t\tif ( $wp_error )\n\t\t\treturn new WP_Error('db_update_error', __('Could not update comment status'), $wpdb->last_error);\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tclean_comment_cache( $comment_old->comment_ID );\n\n\t$comment = get_comment( $comment_old->comment_ID );\n\n\t/**\n\t * Fires immediately before transitioning a comment's status from one to another\n\t * in the database.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param int         $comment_id     Comment ID.\n\t * @param string|bool $comment_status Current comment status. Possible values include\n\t *                                    'hold', 'approve', 'spam', 'trash', or false.\n\t */\n\tdo_action( 'wp_set_comment_status', $comment->comment_ID, $comment_status );\n\n\twp_transition_comment_status($comment_status, $comment_old->comment_approved, $comment);\n\n\twp_update_comment_count($comment->comment_post_ID);\n\n\treturn true;\n}\n\n/**\n * Updates an existing comment in the database.\n *\n * Filters the comment and makes sure certain fields are valid before updating.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $commentarr Contains information on the comment.\n * @return int Comment was updated if value is 1, or was not updated if value is 0.\n */\nfunction wp_update_comment($commentarr) {\n\tglobal $wpdb;\n\n\t// First, get all of the original fields\n\t$comment = get_comment($commentarr['comment_ID'], ARRAY_A);\n\tif ( empty( $comment ) ) {\n\t\treturn 0;\n\t}\n\n\t// Make sure that the comment post ID is valid (if specified).\n\tif ( isset( $commentarr['comment_post_ID'] ) && ! get_post( $commentarr['comment_post_ID'] ) ) {\n\t\treturn 0;\n\t}\n\n\t// Escape data pulled from DB.\n\t$comment = wp_slash($comment);\n\n\t$old_status = $comment['comment_approved'];\n\n\t// Merge old and new fields with new fields overwriting old ones.\n\t$commentarr = array_merge($comment, $commentarr);\n\n\t$commentarr = wp_filter_comment( $commentarr );\n\n\t// Now extract the merged array.\n\t$data = wp_unslash( $commentarr );\n\n\t/**\n\t * Filter the comment content before it is updated in the database.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $comment_content The comment data.\n\t */\n\t$data['comment_content'] = apply_filters( 'comment_save_pre', $data['comment_content'] );\n\n\t$data['comment_date_gmt'] = get_gmt_from_date( $data['comment_date'] );\n\n\tif ( ! isset( $data['comment_approved'] ) ) {\n\t\t$data['comment_approved'] = 1;\n\t} elseif ( 'hold' == $data['comment_approved'] ) {\n\t\t$data['comment_approved'] = 0;\n\t} elseif ( 'approve' == $data['comment_approved'] ) {\n\t\t$data['comment_approved'] = 1;\n\t}\n\n\t$comment_ID = $data['comment_ID'];\n\t$comment_post_ID = $data['comment_post_ID'];\n\t$keys = array( 'comment_post_ID', 'comment_content', 'comment_author', 'comment_author_email', 'comment_approved', 'comment_karma', 'comment_author_url', 'comment_date', 'comment_date_gmt', 'comment_type', 'comment_parent', 'user_id' );\n\t$data = wp_array_slice_assoc( $data, $keys );\n\t$rval = $wpdb->update( $wpdb->comments, $data, compact( 'comment_ID' ) );\n\n\tclean_comment_cache( $comment_ID );\n\twp_update_comment_count( $comment_post_ID );\n\t/**\n\t * Fires immediately after a comment is updated in the database.\n\t *\n\t * The hook also fires immediately before comment status transition hooks are fired.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param int $comment_ID The comment ID.\n\t */\n\tdo_action( 'edit_comment', $comment_ID );\n\t$comment = get_comment($comment_ID);\n\twp_transition_comment_status($comment->comment_approved, $old_status, $comment);\n\treturn $rval;\n}\n\n/**\n * Whether to defer comment counting.\n *\n * When setting $defer to true, all post comment counts will not be updated\n * until $defer is set to false. When $defer is set to false, then all\n * previously deferred updated post comment counts will then be automatically\n * updated without having to call wp_update_comment_count() after.\n *\n * @since 2.5.0\n * @staticvar bool $_defer\n *\n * @param bool $defer\n * @return bool\n */\nfunction wp_defer_comment_counting($defer=null) {\n\tstatic $_defer = false;\n\n\tif ( is_bool($defer) ) {\n\t\t$_defer = $defer;\n\t\t// flush any deferred counts\n\t\tif ( !$defer )\n\t\t\twp_update_comment_count( null, true );\n\t}\n\n\treturn $_defer;\n}\n\n/**\n * Updates the comment count for post(s).\n *\n * When $do_deferred is false (is by default) and the comments have been set to\n * be deferred, the post_id will be added to a queue, which will be updated at a\n * later date and only updated once per post ID.\n *\n * If the comments have not be set up to be deferred, then the post will be\n * updated. When $do_deferred is set to true, then all previous deferred post\n * IDs will be updated along with the current $post_id.\n *\n * @since 2.1.0\n * @see wp_update_comment_count_now() For what could cause a false return value\n *\n * @staticvar array $_deferred\n *\n * @param int $post_id Post ID\n * @param bool $do_deferred Whether to process previously deferred post comment counts\n * @return bool|void True on success, false on failure\n */\nfunction wp_update_comment_count($post_id, $do_deferred=false) {\n\tstatic $_deferred = array();\n\n\tif ( $do_deferred ) {\n\t\t$_deferred = array_unique($_deferred);\n\t\tforeach ( $_deferred as $i => $_post_id ) {\n\t\t\twp_update_comment_count_now($_post_id);\n\t\t\tunset( $_deferred[$i] ); /** @todo Move this outside of the foreach and reset $_deferred to an array instead */\n\t\t}\n\t}\n\n\tif ( wp_defer_comment_counting() ) {\n\t\t$_deferred[] = $post_id;\n\t\treturn true;\n\t}\n\telseif ( $post_id ) {\n\t\treturn wp_update_comment_count_now($post_id);\n\t}\n\n}\n\n/**\n * Updates the comment count for the post.\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $post_id Post ID\n * @return bool True on success, false on '0' $post_id or if post with ID does not exist.\n */\nfunction wp_update_comment_count_now($post_id) {\n\tglobal $wpdb;\n\t$post_id = (int) $post_id;\n\tif ( !$post_id )\n\t\treturn false;\n\n\twp_cache_delete( 'comments-0', 'counts' );\n\twp_cache_delete( \"comments-{$post_id}\", 'counts' );\n\n\tif ( !$post = get_post($post_id) )\n\t\treturn false;\n\n\t$old = (int) $post->comment_count;\n\t$new = (int) $wpdb->get_var( $wpdb->prepare(\"SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1'\", $post_id) );\n\t$wpdb->update( $wpdb->posts, array('comment_count' => $new), array('ID' => $post_id) );\n\n\tclean_post_cache( $post );\n\n\t/**\n\t * Fires immediately after a post's comment count is updated in the database.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int $post_id Post ID.\n\t * @param int $new     The new comment count.\n\t * @param int $old     The old comment count.\n\t */\n\tdo_action( 'wp_update_comment_count', $post_id, $new, $old );\n\t/** This action is documented in wp-includes/post.php */\n\tdo_action( 'edit_post', $post_id, $post );\n\n\treturn true;\n}\n\n//\n// Ping and trackback functions.\n//\n\n/**\n * Finds a pingback server URI based on the given URL.\n *\n * Checks the HTML for the rel=\"pingback\" link and x-pingback headers. It does\n * a check for the x-pingback headers first and returns that, if available. The\n * check for the rel=\"pingback\" has more overhead than just the header.\n *\n * @since 1.5.0\n *\n * @param string $url URL to ping.\n * @param int $deprecated Not Used.\n * @return false|string False on failure, string containing URI on success.\n */\nfunction discover_pingback_server_uri( $url, $deprecated = '' ) {\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.7' );\n\n\t$pingback_str_dquote = 'rel=\"pingback\"';\n\t$pingback_str_squote = 'rel=\\'pingback\\'';\n\n\t/** @todo Should use Filter Extension or custom preg_match instead. */\n\t$parsed_url = parse_url($url);\n\n\tif ( ! isset( $parsed_url['host'] ) ) // Not an URL. This should never happen.\n\t\treturn false;\n\n\t//Do not search for a pingback server on our own uploads\n\t$uploads_dir = wp_upload_dir();\n\tif ( 0 === strpos($url, $uploads_dir['baseurl']) )\n\t\treturn false;\n\n\t$response = wp_safe_remote_head( $url, array( 'timeout' => 2, 'httpversion' => '1.0' ) );\n\n\tif ( is_wp_error( $response ) )\n\t\treturn false;\n\n\tif ( wp_remote_retrieve_header( $response, 'x-pingback' ) )\n\t\treturn wp_remote_retrieve_header( $response, 'x-pingback' );\n\n\t// Not an (x)html, sgml, or xml page, no use going further.\n\tif ( preg_match('#(image|audio|video|model)/#is', wp_remote_retrieve_header( $response, 'content-type' )) )\n\t\treturn false;\n\n\t// Now do a GET since we're going to look in the html headers (and we're sure it's not a binary file)\n\t$response = wp_safe_remote_get( $url, array( 'timeout' => 2, 'httpversion' => '1.0' ) );\n\n\tif ( is_wp_error( $response ) )\n\t\treturn false;\n\n\t$contents = wp_remote_retrieve_body( $response );\n\n\t$pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);\n\t$pingback_link_offset_squote = strpos($contents, $pingback_str_squote);\n\tif ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) {\n\t\t$quote = ($pingback_link_offset_dquote) ? '\"' : '\\'';\n\t\t$pingback_link_offset = ($quote=='\"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote;\n\t\t$pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset);\n\t\t$pingback_href_start = $pingback_href_pos+6;\n\t\t$pingback_href_end = @strpos($contents, $quote, $pingback_href_start);\n\t\t$pingback_server_url_len = $pingback_href_end - $pingback_href_start;\n\t\t$pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len);\n\n\t\t// We may find rel=\"pingback\" but an incomplete pingback URL\n\t\tif ( $pingback_server_url_len > 0 ) { // We got it!\n\t\t\treturn $pingback_server_url;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Perform all pingbacks, enclosures, trackbacks, and send to pingback services.\n *\n * @since 2.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction do_all_pings() {\n\tglobal $wpdb;\n\n\t// Do pingbacks\n\twhile ($ping = $wpdb->get_row(\"SELECT ID, post_content, meta_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_pingme' LIMIT 1\")) {\n\t\tdelete_metadata_by_mid( 'post', $ping->meta_id );\n\t\tpingback( $ping->post_content, $ping->ID );\n\t}\n\n\t// Do Enclosures\n\twhile ($enclosure = $wpdb->get_row(\"SELECT ID, post_content, meta_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_encloseme' LIMIT 1\")) {\n\t\tdelete_metadata_by_mid( 'post', $enclosure->meta_id );\n\t\tdo_enclose( $enclosure->post_content, $enclosure->ID );\n\t}\n\n\t// Do Trackbacks\n\t$trackbacks = $wpdb->get_col(\"SELECT ID FROM $wpdb->posts WHERE to_ping <> '' AND post_status = 'publish'\");\n\tif ( is_array($trackbacks) )\n\t\tforeach ( $trackbacks as $trackback )\n\t\t\tdo_trackbacks($trackback);\n\n\t//Do Update Services/Generic Pings\n\tgeneric_ping();\n}\n\n/**\n * Perform trackbacks.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $post_id Post ID to do trackbacks on.\n */\nfunction do_trackbacks($post_id) {\n\tglobal $wpdb;\n\n\t$post = get_post( $post_id );\n\t$to_ping = get_to_ping($post_id);\n\t$pinged  = get_pung($post_id);\n\tif ( empty($to_ping) ) {\n\t\t$wpdb->update($wpdb->posts, array('to_ping' => ''), array('ID' => $post_id) );\n\t\treturn;\n\t}\n\n\tif ( empty($post->post_excerpt) ) {\n\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t$excerpt = apply_filters( 'the_content', $post->post_content, $post->ID );\n\t} else {\n\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t$excerpt = apply_filters( 'the_excerpt', $post->post_excerpt );\n\t}\n\n\t$excerpt = str_replace(']]>', ']]&gt;', $excerpt);\n\t$excerpt = wp_html_excerpt($excerpt, 252, '&#8230;');\n\n\t/** This filter is documented in wp-includes/post-template.php */\n\t$post_title = apply_filters( 'the_title', $post->post_title, $post->ID );\n\t$post_title = strip_tags($post_title);\n\n\tif ( $to_ping ) {\n\t\tforeach ( (array) $to_ping as $tb_ping ) {\n\t\t\t$tb_ping = trim($tb_ping);\n\t\t\tif ( !in_array($tb_ping, $pinged) ) {\n\t\t\t\ttrackback($tb_ping, $post_title, $excerpt, $post_id);\n\t\t\t\t$pinged[] = $tb_ping;\n\t\t\t} else {\n\t\t\t\t$wpdb->query( $wpdb->prepare(\"UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d\", $tb_ping, $post_id) );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Sends pings to all of the ping site services.\n *\n * @since 1.2.0\n *\n * @param int $post_id Post ID.\n * @return int Same as Post ID from parameter\n */\nfunction generic_ping( $post_id = 0 ) {\n\t$services = get_option('ping_sites');\n\n\t$services = explode(\"\\n\", $services);\n\tforeach ( (array) $services as $service ) {\n\t\t$service = trim($service);\n\t\tif ( '' != $service )\n\t\t\tweblog_ping($service);\n\t}\n\n\treturn $post_id;\n}\n\n/**\n * Pings back the links found in a post.\n *\n * @since 0.71\n *\n * @global string $wp_version\n *\n * @param string $content Post content to check for links.\n * @param int $post_ID Post ID.\n */\nfunction pingback($content, $post_ID) {\n\tglobal $wp_version;\n\tinclude_once(ABSPATH . WPINC . '/class-IXR.php');\n\tinclude_once(ABSPATH . WPINC . '/class-wp-http-ixr-client.php');\n\n\t// original code by Mort (http://mort.mine.nu:8080)\n\t$post_links = array();\n\n\t$pung = get_pung($post_ID);\n\n\t// Step 1\n\t// Parsing the post, external links (if any) are stored in the $post_links array\n\t$post_links_temp = wp_extract_urls( $content );\n\n\t// Step 2.\n\t// Walking thru the links array\n\t// first we get rid of links pointing to sites, not to specific files\n\t// Example:\n\t// http://dummy-weblog.org\n\t// http://dummy-weblog.org/\n\t// http://dummy-weblog.org/post.php\n\t// We don't wanna ping first and second types, even if they have a valid <link/>\n\n\tforeach ( (array) $post_links_temp as $link_test ) :\n\t\tif ( !in_array($link_test, $pung) && (url_to_postid($link_test) != $post_ID) // If we haven't pung it already and it isn't a link to itself\n\t\t\t\t&& !is_local_attachment($link_test) ) : // Also, let's never ping local attachments.\n\t\t\tif ( $test = @parse_url($link_test) ) {\n\t\t\t\tif ( isset($test['query']) )\n\t\t\t\t\t$post_links[] = $link_test;\n\t\t\t\telseif ( isset( $test['path'] ) && ( $test['path'] != '/' ) && ( $test['path'] != '' ) )\n\t\t\t\t\t$post_links[] = $link_test;\n\t\t\t}\n\t\tendif;\n\tendforeach;\n\n\t$post_links = array_unique( $post_links );\n\t/**\n\t * Fires just before pinging back links found in a post.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param array &$post_links An array of post links to be checked, passed by reference.\n\t * @param array &$pung       Whether a link has already been pinged, passed by reference.\n\t * @param int   $post_ID     The post ID.\n\t */\n\tdo_action_ref_array( 'pre_ping', array( &$post_links, &$pung, $post_ID ) );\n\n\tforeach ( (array) $post_links as $pagelinkedto ) {\n\t\t$pingback_server_url = discover_pingback_server_uri( $pagelinkedto );\n\n\t\tif ( $pingback_server_url ) {\n\t\t\t@ set_time_limit( 60 );\n\t\t\t// Now, the RPC call\n\t\t\t$pagelinkedfrom = get_permalink($post_ID);\n\n\t\t\t// using a timeout of 3 seconds should be enough to cover slow servers\n\t\t\t$client = new WP_HTTP_IXR_Client($pingback_server_url);\n\t\t\t$client->timeout = 3;\n\t\t\t/**\n\t\t\t * Filter the user agent sent when pinging-back a URL.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param string $concat_useragent    The user agent concatenated with ' -- WordPress/'\n\t\t\t *                                    and the WordPress version.\n\t\t\t * @param string $useragent           The useragent.\n\t\t\t * @param string $pingback_server_url The server URL being linked to.\n\t\t\t * @param string $pagelinkedto        URL of page linked to.\n\t\t\t * @param string $pagelinkedfrom      URL of page linked from.\n\t\t\t */\n\t\t\t$client->useragent = apply_filters( 'pingback_useragent', $client->useragent . ' -- WordPress/' . $wp_version, $client->useragent, $pingback_server_url, $pagelinkedto, $pagelinkedfrom );\n\t\t\t// when set to true, this outputs debug messages by itself\n\t\t\t$client->debug = false;\n\n\t\t\tif ( $client->query('pingback.ping', $pagelinkedfrom, $pagelinkedto) || ( isset($client->error->code) && 48 == $client->error->code ) ) // Already registered\n\t\t\t\tadd_ping( $post_ID, $pagelinkedto );\n\t\t}\n\t}\n}\n\n/**\n * Check whether blog is public before returning sites.\n *\n * @since 2.1.0\n *\n * @param mixed $sites Will return if blog is public, will not return if not public.\n * @return mixed Empty string if blog is not public, returns $sites, if site is public.\n */\nfunction privacy_ping_filter($sites) {\n\tif ( '0' != get_option('blog_public') )\n\t\treturn $sites;\n\telse\n\t\treturn '';\n}\n\n/**\n * Send a Trackback.\n *\n * Updates database when sending trackback to prevent duplicates.\n *\n * @since 0.71\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $trackback_url URL to send trackbacks.\n * @param string $title Title of post.\n * @param string $excerpt Excerpt of post.\n * @param int $ID Post ID.\n * @return int|false|void Database query from update.\n */\nfunction trackback($trackback_url, $title, $excerpt, $ID) {\n\tglobal $wpdb;\n\n\tif ( empty($trackback_url) )\n\t\treturn;\n\n\t$options = array();\n\t$options['timeout'] = 10;\n\t$options['body'] = array(\n\t\t'title' => $title,\n\t\t'url' => get_permalink($ID),\n\t\t'blog_name' => get_option('blogname'),\n\t\t'excerpt' => $excerpt\n\t);\n\n\t$response = wp_safe_remote_post( $trackback_url, $options );\n\n\tif ( is_wp_error( $response ) )\n\t\treturn;\n\n\t$wpdb->query( $wpdb->prepare(\"UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\\n', %s) WHERE ID = %d\", $trackback_url, $ID) );\n\treturn $wpdb->query( $wpdb->prepare(\"UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d\", $trackback_url, $ID) );\n}\n\n/**\n * Send a pingback.\n *\n * @since 1.2.0\n *\n * @global string $wp_version\n *\n * @param string $server Host of blog to connect to.\n * @param string $path Path to send the ping.\n */\nfunction weblog_ping($server = '', $path = '') {\n\tglobal $wp_version;\n\tinclude_once(ABSPATH . WPINC . '/class-IXR.php');\n\tinclude_once(ABSPATH . WPINC . '/class-wp-http-ixr-client.php');\n\n\t// using a timeout of 3 seconds should be enough to cover slow servers\n\t$client = new WP_HTTP_IXR_Client($server, ((!strlen(trim($path)) || ('/' == $path)) ? false : $path));\n\t$client->timeout = 3;\n\t$client->useragent .= ' -- WordPress/'.$wp_version;\n\n\t// when set to true, this outputs debug messages by itself\n\t$client->debug = false;\n\t$home = trailingslashit( home_url() );\n\tif ( !$client->query('weblogUpdates.extendedPing', get_option('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping\n\t\t$client->query('weblogUpdates.ping', get_option('blogname'), $home);\n}\n\n/**\n * Default filter attached to pingback_ping_source_uri to validate the pingback's Source URI\n *\n * @since 3.5.1\n * @see wp_http_validate_url()\n *\n * @param string $source_uri\n * @return string\n */\nfunction pingback_ping_source_uri( $source_uri ) {\n\treturn (string) wp_http_validate_url( $source_uri );\n}\n\n/**\n * Default filter attached to xmlrpc_pingback_error.\n *\n * Returns a generic pingback error code unless the error code is 48,\n * which reports that the pingback is already registered.\n *\n * @since 3.5.1\n * @link http://www.hixie.ch/specs/pingback/pingback#TOC3\n *\n * @param IXR_Error $ixr_error\n * @return IXR_Error\n */\nfunction xmlrpc_pingback_error( $ixr_error ) {\n\tif ( $ixr_error->code === 48 )\n\t\treturn $ixr_error;\n\treturn new IXR_Error( 0, '' );\n}\n\n//\n// Cache\n//\n\n/**\n * Removes comment ID from the comment cache.\n *\n * @since 2.3.0\n *\n * @param int|array $ids Comment ID or array of comment IDs to remove from cache\n */\nfunction clean_comment_cache($ids) {\n\tforeach ( (array) $ids as $id ) {\n\t\twp_cache_delete( $id, 'comment' );\n\t}\n\n\twp_cache_set( 'last_changed', microtime(), 'comment' );\n}\n\n/**\n * Updates the comment cache of given comments.\n *\n * Will add the comments in $comments to the cache. If comment ID already exists\n * in the comment cache then it will not be updated. The comment is added to the\n * cache using the comment group with the key using the ID of the comments.\n *\n * @since 2.3.0\n * @since 4.4.0 Introduced the `$update_meta_cache` parameter.\n *\n * @param array $comments          Array of comment row objects\n * @param bool  $update_meta_cache Whether to update commentmeta cache. Default true.\n */\nfunction update_comment_cache( $comments, $update_meta_cache = true ) {\n\tforeach ( (array) $comments as $comment )\n\t\twp_cache_add($comment->comment_ID, $comment, 'comment');\n\n\tif ( $update_meta_cache ) {\n\t\t// Avoid `wp_list_pluck()` in case `$comments` is passed by reference.\n\t\t$comment_ids = array();\n\t\tforeach ( $comments as $comment ) {\n\t\t\t$comment_ids[] = $comment->comment_ID;\n\t\t}\n\t\tupdate_meta_cache( 'comment', $comment_ids );\n\t}\n}\n\n/**\n * Adds any comments from the given IDs to the cache that do not already exist in cache.\n *\n * @since 4.4.0\n * @access private\n *\n * @see update_comment_cache()\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $comment_ids       Array of comment IDs.\n * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true.\n */\nfunction _prime_comment_caches( $comment_ids, $update_meta_cache = true ) {\n\tglobal $wpdb;\n\n\t$non_cached_ids = _get_non_cached_ids( $comment_ids, 'comment' );\n\tif ( !empty( $non_cached_ids ) ) {\n\t\t$fresh_comments = $wpdb->get_results( sprintf( \"SELECT $wpdb->comments.* FROM $wpdb->comments WHERE comment_ID IN (%s)\", join( \",\", array_map( 'intval', $non_cached_ids ) ) ) );\n\n\t\tupdate_comment_cache( $fresh_comments, $update_meta_cache );\n\t}\n}\n\n//\n// Internal\n//\n\n/**\n * Close comments on old posts on the fly, without any extra DB queries. Hooked to the_posts.\n *\n * @access private\n * @since 2.7.0\n *\n * @param WP_Post  $posts Post data object.\n * @param WP_Query $query Query object.\n * @return array\n */\nfunction _close_comments_for_old_posts( $posts, $query ) {\n\tif ( empty( $posts ) || ! $query->is_singular() || ! get_option( 'close_comments_for_old_posts' ) )\n\t\treturn $posts;\n\n\t/**\n\t * Filter the list of post types to automatically close comments for.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @param array $post_types An array of registered post types. Default array with 'post'.\n\t */\n\t$post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) );\n\tif ( ! in_array( $posts[0]->post_type, $post_types ) )\n\t\treturn $posts;\n\n\t$days_old = (int) get_option( 'close_comments_days_old' );\n\tif ( ! $days_old )\n\t\treturn $posts;\n\n\tif ( time() - strtotime( $posts[0]->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) {\n\t\t$posts[0]->comment_status = 'closed';\n\t\t$posts[0]->ping_status = 'closed';\n\t}\n\n\treturn $posts;\n}\n\n/**\n * Close comments on an old post. Hooked to comments_open and pings_open.\n *\n * @access private\n * @since 2.7.0\n *\n * @param bool $open Comments open or closed\n * @param int $post_id Post ID\n * @return bool $open\n */\nfunction _close_comments_for_old_post( $open, $post_id ) {\n\tif ( ! $open )\n\t\treturn $open;\n\n\tif ( !get_option('close_comments_for_old_posts') )\n\t\treturn $open;\n\n\t$days_old = (int) get_option('close_comments_days_old');\n\tif ( !$days_old )\n\t\treturn $open;\n\n\t$post = get_post($post_id);\n\n\t/** This filter is documented in wp-includes/comment.php */\n\t$post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) );\n\tif ( ! in_array( $post->post_type, $post_types ) )\n\t\treturn $open;\n\n\t// Undated drafts should not show up as comments closed.\n\tif ( '0000-00-00 00:00:00' === $post->post_date_gmt ) {\n\t\treturn $open;\n\t}\n\n\tif ( time() - strtotime( $post->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) )\n\t\treturn false;\n\n\treturn $open;\n}\n\n/**\n * Handles the submission of a comment, usually posted to wp-comments-post.php via a comment form.\n *\n * This function expects unslashed data, as opposed to functions such as `wp_new_comment()` which\n * expect slashed data.\n *\n * @since 4.4.0\n *\n * @param array $comment_data {\n *     Comment data.\n *\n *     @type string|int $comment_post_ID             The ID of the post that relates to the comment.\n *     @type string     $author                      The name of the comment author.\n *     @type string     $email                       The comment author email address.\n *     @type string     $url                         The comment author URL.\n *     @type string     $comment                     The content of the comment.\n *     @type string|int $comment_parent              The ID of this comment's parent, if any. Default 0.\n *     @type string     $_wp_unfiltered_html_comment The nonce value for allowing unfiltered HTML.\n * }\n * @return WP_Comment|WP_Error A WP_Comment object on success, a WP_Error object on failure.\n */\nfunction wp_handle_comment_submission( $comment_data ) {\n\n\t$comment_post_ID = $comment_parent = 0;\n\t$comment_author = $comment_author_email = $comment_author_url = $comment_content = $_wp_unfiltered_html_comment = null;\n\n\tif ( isset( $comment_data['comment_post_ID'] ) ) {\n\t\t$comment_post_ID = (int) $comment_data['comment_post_ID'];\n\t}\n\tif ( isset( $comment_data['author'] ) && is_string( $comment_data['author'] ) ) {\n\t\t$comment_author = trim( strip_tags( $comment_data['author'] ) );\n\t}\n\tif ( isset( $comment_data['email'] ) && is_string( $comment_data['email'] ) ) {\n\t\t$comment_author_email = trim( $comment_data['email'] );\n\t}\n\tif ( isset( $comment_data['url'] ) && is_string( $comment_data['url'] ) ) {\n\t\t$comment_author_url = trim( $comment_data['url'] );\n\t}\n\tif ( isset( $comment_data['comment'] ) && is_string( $comment_data['comment'] ) ) {\n\t\t$comment_content = trim( $comment_data['comment'] );\n\t}\n\tif ( isset( $comment_data['comment_parent'] ) ) {\n\t\t$comment_parent = absint( $comment_data['comment_parent'] );\n\t}\n\tif ( isset( $comment_data['_wp_unfiltered_html_comment'] ) && is_string( $comment_data['_wp_unfiltered_html_comment'] ) ) {\n\t\t$_wp_unfiltered_html_comment = trim( $comment_data['_wp_unfiltered_html_comment'] );\n\t}\n\n\t$post = get_post( $comment_post_ID );\n\n\tif ( empty( $post->comment_status ) ) {\n\n\t\t/**\n\t\t * Fires when a comment is attempted on a post that does not exist.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param int $comment_post_ID Post ID.\n\t\t */\n\t\tdo_action( 'comment_id_not_found', $comment_post_ID );\n\n\t\treturn new WP_Error( 'comment_id_not_found' );\n\n\t}\n\n\t// get_post_status() will get the parent status for attachments.\n\t$status = get_post_status( $post );\n\n\tif ( ( 'private' == $status ) && ! current_user_can( 'read_post', $comment_post_ID ) ) {\n\t\treturn new WP_Error( 'comment_id_not_found' );\n\t}\n\n\t$status_obj = get_post_status_object( $status );\n\n\tif ( ! comments_open( $comment_post_ID ) ) {\n\n\t\t/**\n\t\t * Fires when a comment is attempted on a post that has comments closed.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param int $comment_post_ID Post ID.\n\t\t */\n\t\tdo_action( 'comment_closed', $comment_post_ID );\n\n\t\treturn new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 );\n\n\t} elseif ( 'trash' == $status ) {\n\n\t\t/**\n\t\t * Fires when a comment is attempted on a trashed post.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $comment_post_ID Post ID.\n\t\t */\n\t\tdo_action( 'comment_on_trash', $comment_post_ID );\n\n\t\treturn new WP_Error( 'comment_on_trash' );\n\n\t} elseif ( ! $status_obj->public && ! $status_obj->private ) {\n\n\t\t/**\n\t\t * Fires when a comment is attempted on a post in draft mode.\n\t\t *\n\t\t * @since 1.5.1\n\t\t *\n\t\t * @param int $comment_post_ID Post ID.\n\t\t */\n\t\tdo_action( 'comment_on_draft', $comment_post_ID );\n\n\t\treturn new WP_Error( 'comment_on_draft' );\n\n\t} elseif ( post_password_required( $comment_post_ID ) ) {\n\n\t\t/**\n\t\t * Fires when a comment is attempted on a password-protected post.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $comment_post_ID Post ID.\n\t\t */\n\t\tdo_action( 'comment_on_password_protected', $comment_post_ID );\n\n\t\treturn new WP_Error( 'comment_on_password_protected' );\n\n\t} else {\n\n\t\t/**\n\t\t * Fires before a comment is posted.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param int $comment_post_ID Post ID.\n\t\t */\n\t\tdo_action( 'pre_comment_on_post', $comment_post_ID );\n\n\t}\n\n\t// If the user is logged in\n\t$user = wp_get_current_user();\n\tif ( $user->exists() ) {\n\t\tif ( empty( $user->display_name ) ) {\n\t\t\t$user->display_name=$user->user_login;\n\t\t}\n\t\t$comment_author       = $user->display_name;\n\t\t$comment_author_email = $user->user_email;\n\t\t$comment_author_url   = $user->user_url;\n\t\t$user_ID              = $user->ID;\n\t\tif ( current_user_can( 'unfiltered_html' ) ) {\n\t\t\tif ( ! isset( $comment_data['_wp_unfiltered_html_comment'] )\n\t\t\t\t|| ! wp_verify_nonce( $comment_data['_wp_unfiltered_html_comment'], 'unfiltered-html-comment_' . $comment_post_ID )\n\t\t\t) {\n\t\t\t\tkses_remove_filters(); // start with a clean slate\n\t\t\t\tkses_init_filters(); // set up the filters\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ( get_option( 'comment_registration' ) ) {\n\t\t\treturn new WP_Error( 'not_logged_in', __( 'Sorry, you must be logged in to post a comment.' ), 403 );\n\t\t}\n\t}\n\n\t$comment_type = '';\n\n\tif ( get_option( 'require_name_email' ) && ! $user->exists() ) {\n\t\tif ( 6 > strlen( $comment_author_email ) || '' == $comment_author ) {\n\t\t\treturn new WP_Error( 'require_name_email', __( '<strong>ERROR</strong>: please fill the required fields (name, email).' ), 200 );\n\t\t} elseif ( ! is_email( $comment_author_email ) ) {\n\t\t\treturn new WP_Error( 'require_valid_email', __( '<strong>ERROR</strong>: please enter a valid email address.' ), 200 );\n\t\t}\n\t}\n\n\tif ( '' == $comment_content ) {\n\t\treturn new WP_Error( 'require_valid_comment', __( '<strong>ERROR</strong>: please type a comment.' ), 200 );\n\t}\n\n\t$commentdata = compact(\n\t\t'comment_post_ID',\n\t\t'comment_author',\n\t\t'comment_author_email',\n\t\t'comment_author_url',\n\t\t'comment_content',\n\t\t'comment_type',\n\t\t'comment_parent',\n\t\t'user_ID'\n\t);\n\n\t$comment_id = wp_new_comment( wp_slash( $commentdata ) );\n\tif ( ! $comment_id ) {\n\t\treturn new WP_Error( 'comment_save_error', __( '<strong>ERROR</strong>: The comment could not be saved. Please try again later.' ), 500 );\n\t}\n\n\treturn get_comment( $comment_id );\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/compat.php",
    "content": "<?php\n/**\n * WordPress implementation for PHP functions either missing from older PHP versions or not included by default.\n *\n * @package PHP\n * @access private\n */\n\n// If gettext isn't available\nif ( !function_exists('_') ) {\n\tfunction _($string) {\n\t\treturn $string;\n\t}\n}\n\n/**\n * Returns whether PCRE/u (PCRE_UTF8 modifier) is available for use.\n *\n * @ignore\n * @since 4.2.2\n * @access private\n *\n * @staticvar string $utf8_pcre\n *\n * @param bool $set - Used for testing only\n *             null   : default - get PCRE/u capability\n *             false  : Used for testing - return false for future calls to this function\n *             'reset': Used for testing - restore default behavior of this function\n */\nfunction _wp_can_use_pcre_u( $set = null ) {\n\tstatic $utf8_pcre = 'reset';\n\n\tif ( null !== $set ) {\n\t\t$utf8_pcre = $set;\n\t}\n\n\tif ( 'reset' === $utf8_pcre ) {\n\t\t$utf8_pcre = @preg_match( '/^./u', 'a' );\n\t}\n\n\treturn $utf8_pcre;\n}\n\nif ( ! function_exists( 'mb_substr' ) ) :\n\tfunction mb_substr( $str, $start, $length = null, $encoding = null ) {\n\t\treturn _mb_substr( $str, $start, $length, $encoding );\n\t}\nendif;\n\n/*\n * Only understands UTF-8 and 8bit.  All other character sets will be treated as 8bit.\n * For $encoding === UTF-8, the $str input is expected to be a valid UTF-8 byte sequence.\n * The behavior of this function for invalid inputs is undefined.\n */\nfunction _mb_substr( $str, $start, $length = null, $encoding = null ) {\n\tif ( null === $encoding ) {\n\t\t$encoding = get_option( 'blog_charset' );\n\t}\n\n\t// The solution below works only for UTF-8,\n\t// so in case of a different charset just use built-in substr()\n\tif ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) ) {\n\t\treturn is_null( $length ) ? substr( $str, $start ) : substr( $str, $start, $length );\n\t}\n\n\tif ( _wp_can_use_pcre_u() ) {\n\t\t// Use the regex unicode support to separate the UTF-8 characters into an array\n\t\tpreg_match_all( '/./us', $str, $match );\n\t\t$chars = is_null( $length ) ? array_slice( $match[0], $start ) : array_slice( $match[0], $start, $length );\n\t\treturn implode( '', $chars );\n\t}\n\n\t$regex = '/(\n\t\t  [\\x00-\\x7F]                  # single-byte sequences   0xxxxxxx\n\t\t| [\\xC2-\\xDF][\\x80-\\xBF]       # double-byte sequences   110xxxxx 10xxxxxx\n\t\t| \\xE0[\\xA0-\\xBF][\\x80-\\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2\n\t\t| [\\xE1-\\xEC][\\x80-\\xBF]{2}\n\t\t| \\xED[\\x80-\\x9F][\\x80-\\xBF]\n\t\t| [\\xEE-\\xEF][\\x80-\\xBF]{2}\n\t\t| \\xF0[\\x90-\\xBF][\\x80-\\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3\n\t\t| [\\xF1-\\xF3][\\x80-\\xBF]{3}\n\t\t| \\xF4[\\x80-\\x8F][\\x80-\\xBF]{2}\n\t)/x';\n\n\t$chars = array( '' ); // Start with 1 element instead of 0 since the first thing we do is pop\n\tdo {\n\t\t// We had some string left over from the last round, but we counted it in that last round.\n\t\tarray_pop( $chars );\n\n\t\t// Split by UTF-8 character, limit to 1000 characters (last array element will contain the rest of the string)\n\t\t$pieces = preg_split( $regex, $str, 1000, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );\n\n\t\t$chars = array_merge( $chars, $pieces );\n\t} while ( count( $pieces ) > 1 && $str = array_pop( $pieces ) ); // If there's anything left over, repeat the loop.\n\n\treturn join( '', array_slice( $chars, $start, $length ) );\n}\n\nif ( ! function_exists( 'mb_strlen' ) ) :\n\tfunction mb_strlen( $str, $encoding = null ) {\n\t\treturn _mb_strlen( $str, $encoding );\n\t}\nendif;\n\n/*\n * Only understands UTF-8 and 8bit.  All other character sets will be treated as 8bit.\n * For $encoding === UTF-8, the $str input is expected to be a valid UTF-8 byte sequence.\n * The behavior of this function for invalid inputs is undefined.\n */\nfunction _mb_strlen( $str, $encoding = null ) {\n\tif ( null === $encoding ) {\n\t\t$encoding = get_option( 'blog_charset' );\n\t}\n\n\t// The solution below works only for UTF-8,\n\t// so in case of a different charset just use built-in strlen()\n\tif ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) ) {\n\t\treturn strlen( $str );\n\t}\n\n\tif ( _wp_can_use_pcre_u() ) {\n\t\t// Use the regex unicode support to separate the UTF-8 characters into an array\n\t\tpreg_match_all( '/./us', $str, $match );\n\t\treturn count( $match[0] );\n\t}\n\n\t$regex = '/(?:\n\t\t  [\\x00-\\x7F]                  # single-byte sequences   0xxxxxxx\n\t\t| [\\xC2-\\xDF][\\x80-\\xBF]       # double-byte sequences   110xxxxx 10xxxxxx\n\t\t| \\xE0[\\xA0-\\xBF][\\x80-\\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2\n\t\t| [\\xE1-\\xEC][\\x80-\\xBF]{2}\n\t\t| \\xED[\\x80-\\x9F][\\x80-\\xBF]\n\t\t| [\\xEE-\\xEF][\\x80-\\xBF]{2}\n\t\t| \\xF0[\\x90-\\xBF][\\x80-\\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3\n\t\t| [\\xF1-\\xF3][\\x80-\\xBF]{3}\n\t\t| \\xF4[\\x80-\\x8F][\\x80-\\xBF]{2}\n\t)/x';\n\n\t$count = 1; // Start at 1 instead of 0 since the first thing we do is decrement\n\tdo {\n\t\t// We had some string left over from the last round, but we counted it in that last round.\n\t\t$count--;\n\n\t\t// Split by UTF-8 character, limit to 1000 characters (last array element will contain the rest of the string)\n\t\t$pieces = preg_split( $regex, $str, 1000 );\n\n\t\t// Increment\n\t\t$count += count( $pieces );\n\t} while ( $str = array_pop( $pieces ) ); // If there's anything left over, repeat the loop.\n\n\t// Fencepost: preg_split() always returns one extra item in the array\n\treturn --$count;\n}\n\nif ( !function_exists('hash_hmac') ):\nfunction hash_hmac($algo, $data, $key, $raw_output = false) {\n\treturn _hash_hmac($algo, $data, $key, $raw_output);\n}\nendif;\n\nfunction _hash_hmac($algo, $data, $key, $raw_output = false) {\n\t$packs = array('md5' => 'H32', 'sha1' => 'H40');\n\n\tif ( !isset($packs[$algo]) )\n\t\treturn false;\n\n\t$pack = $packs[$algo];\n\n\tif (strlen($key) > 64)\n\t\t$key = pack($pack, $algo($key));\n\n\t$key = str_pad($key, 64, chr(0));\n\n\t$ipad = (substr($key, 0, 64) ^ str_repeat(chr(0x36), 64));\n\t$opad = (substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64));\n\n\t$hmac = $algo($opad . pack($pack, $algo($ipad . $data)));\n\n\tif ( $raw_output )\n\t\treturn pack( $pack, $hmac );\n\treturn $hmac;\n}\n\nif ( !function_exists('json_encode') ) {\n\tfunction json_encode( $string ) {\n\t\tglobal $wp_json;\n\n\t\tif ( ! ( $wp_json instanceof Services_JSON ) ) {\n\t\t\trequire_once( ABSPATH . WPINC . '/class-json.php' );\n\t\t\t$wp_json = new Services_JSON();\n\t\t}\n\n\t\treturn $wp_json->encodeUnsafe( $string );\n\t}\n}\n\nif ( !function_exists('json_decode') ) {\n\t/**\n\t * @global Services_JSON $wp_json\n\t * @param string $string\n\t * @param bool   $assoc_array\n\t * @return object|array\n\t */\n\tfunction json_decode( $string, $assoc_array = false ) {\n\t\tglobal $wp_json;\n\n\t\tif ( ! ($wp_json instanceof Services_JSON ) ) {\n\t\t\trequire_once( ABSPATH . WPINC . '/class-json.php' );\n\t\t\t$wp_json = new Services_JSON();\n\t\t}\n\n\t\t$res = $wp_json->decode( $string );\n\t\tif ( $assoc_array )\n\t\t\t$res = _json_decode_object_helper( $res );\n\t\treturn $res;\n\t}\n\n\t/**\n\t * @param object $data\n\t * @return array\n\t */\n\tfunction _json_decode_object_helper($data) {\n\t\tif ( is_object($data) )\n\t\t\t$data = get_object_vars($data);\n\t\treturn is_array($data) ? array_map(__FUNCTION__, $data) : $data;\n\t}\n}\n\nif ( ! function_exists( 'hash_equals' ) ) :\n/**\n * Compare two strings in constant time.\n *\n * This function was added in PHP 5.6.\n * It can leak the length of a string.\n *\n * @since 3.9.2\n *\n * @param string $a Expected string.\n * @param string $b Actual string.\n * @return bool Whether strings are equal.\n */\nfunction hash_equals( $a, $b ) {\n\t$a_length = strlen( $a );\n\tif ( $a_length !== strlen( $b ) ) {\n\t\treturn false;\n\t}\n\t$result = 0;\n\n\t// Do not attempt to \"optimize\" this.\n\tfor ( $i = 0; $i < $a_length; $i++ ) {\n\t\t$result |= ord( $a[ $i ] ) ^ ord( $b[ $i ] );\n\t}\n\n\treturn $result === 0;\n}\nendif;\n\n// JSON_PRETTY_PRINT was introduced in PHP 5.4\n// Defined here to prevent a notice when using it with wp_json_encode()\nif ( ! defined( 'JSON_PRETTY_PRINT' ) ) {\n\tdefine( 'JSON_PRETTY_PRINT', 128 );\n}\n\nif ( ! function_exists( 'json_last_error_msg' ) ) :\n\t/**\n\t * Retrieves the error string of the last json_encode() or json_decode() call.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @internal This is a compatibility function for PHP <5.5\n\t *\n\t * @return bool|string Returns the error message on success, \"No Error\" if no error has occurred,\n\t *                     or false on failure.\n\t */\n\tfunction json_last_error_msg() {\n\t\t// See https://core.trac.wordpress.org/ticket/27799.\n\t\tif ( ! function_exists( 'json_last_error' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$last_error_code = json_last_error();\n\n\t\t// Just in case JSON_ERROR_NONE is not defined.\n\t\t$error_code_none = defined( 'JSON_ERROR_NONE' ) ? JSON_ERROR_NONE : 0;\n\n\t\tswitch ( true ) {\n\t\t\tcase $last_error_code === $error_code_none:\n\t\t\t\treturn 'No error';\n\n\t\t\tcase defined( 'JSON_ERROR_DEPTH' ) && JSON_ERROR_DEPTH === $last_error_code:\n\t\t\t\treturn 'Maximum stack depth exceeded';\n\n\t\t\tcase defined( 'JSON_ERROR_STATE_MISMATCH' ) && JSON_ERROR_STATE_MISMATCH === $last_error_code:\n\t\t\t\treturn 'State mismatch (invalid or malformed JSON)';\n\n\t\t\tcase defined( 'JSON_ERROR_CTRL_CHAR' ) && JSON_ERROR_CTRL_CHAR === $last_error_code:\n\t\t\t\treturn 'Control character error, possibly incorrectly encoded';\n\n\t\t\tcase defined( 'JSON_ERROR_SYNTAX' ) && JSON_ERROR_SYNTAX === $last_error_code:\n\t\t\t\treturn 'Syntax error';\n\n\t\t\tcase defined( 'JSON_ERROR_UTF8' ) && JSON_ERROR_UTF8 === $last_error_code:\n\t\t\t\treturn 'Malformed UTF-8 characters, possibly incorrectly encoded';\n\n\t\t\tcase defined( 'JSON_ERROR_RECURSION' ) && JSON_ERROR_RECURSION === $last_error_code:\n\t\t\t\treturn 'Recursion detected';\n\n\t\t\tcase defined( 'JSON_ERROR_INF_OR_NAN' ) && JSON_ERROR_INF_OR_NAN === $last_error_code:\n\t\t\t\treturn 'Inf and NaN cannot be JSON encoded';\n\n\t\t\tcase defined( 'JSON_ERROR_UNSUPPORTED_TYPE' ) && JSON_ERROR_UNSUPPORTED_TYPE === $last_error_code:\n\t\t\t\treturn 'Type is not supported';\n\n\t\t\tdefault:\n\t\t\t\treturn 'An unknown error occurred';\n\t\t}\n\t}\nendif;\n\nif ( ! interface_exists( 'JsonSerializable' ) ) {\n\tdefine( 'WP_JSON_SERIALIZE_COMPATIBLE', true );\n\t/**\n\t * JsonSerializable interface.\n\t *\n\t * Compatibility shim for PHP <5.4\n\t *\n     * @link http://php.net/jsonserializable\n\t *\n\t * @since 4.4.0\n\t */\n\tinterface JsonSerializable {\n\t\tpublic function jsonSerialize();\n\t}\n}\n\n// random_int was introduced in PHP 7.0\nif ( ! function_exists( 'random_int' ) ) {\n\trequire ABSPATH . WPINC . '/random_compat/random.php';\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/cron.php",
    "content": "<?php\n/**\n * WordPress CRON API\n *\n * @package WordPress\n */\n\n/**\n * Schedules a hook to run only once.\n *\n * Schedules a hook which will be executed once by the WordPress actions core at\n * a time which you specify. The action will fire off when someone visits your\n * WordPress site, if the schedule time has passed.\n *\n * @since 2.1.0\n * @link https://codex.wordpress.org/Function_Reference/wp_schedule_single_event\n *\n * @param int $timestamp Timestamp for when to run the event.\n * @param string $hook Action hook to execute when cron is run.\n * @param array $args Optional. Arguments to pass to the hook's callback function.\n * @return false|void False when an event is not scheduled.\n */\nfunction wp_schedule_single_event( $timestamp, $hook, $args = array()) {\n\t// Make sure timestamp is a positive integer\n\tif ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {\n\t\treturn false;\n\t}\n\n\t// Don't schedule a duplicate if there's already an identical event due within 10 minutes of it\n\t$next = wp_next_scheduled($hook, $args);\n\tif ( $next && abs( $next - $timestamp ) <= 10 * MINUTE_IN_SECONDS ) {\n\t\treturn false;\n\t}\n\n\t$crons = _get_cron_array();\n\t$event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => false, 'args' => $args );\n\t/**\n\t * Filter a single event before it is scheduled.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param object $event An object containing an event's data.\n\t */\n\t$event = apply_filters( 'schedule_event', $event );\n\n\t// A plugin disallowed this event\n\tif ( ! $event )\n\t\treturn false;\n\n\t$key = md5(serialize($event->args));\n\n\t$crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args );\n\tuksort( $crons, \"strnatcasecmp\" );\n\t_set_cron_array( $crons );\n}\n\n/**\n * Schedule a periodic event.\n *\n * Schedules a hook which will be executed by the WordPress actions core on a\n * specific interval, specified by you. The action will trigger when someone\n * visits your WordPress site, if the scheduled time has passed.\n *\n * Valid values for the recurrence are hourly, daily and twicedaily. These can\n * be extended using the cron_schedules filter in wp_get_schedules().\n *\n * Use wp_next_scheduled() to prevent duplicates\n *\n * @since 2.1.0\n *\n * @param int $timestamp Timestamp for when to run the event.\n * @param string $recurrence How often the event should recur.\n * @param string $hook Action hook to execute when cron is run.\n * @param array $args Optional. Arguments to pass to the hook's callback function.\n * @return false|void False when an event is not scheduled.\n */\nfunction wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) {\n\t// Make sure timestamp is a positive integer\n\tif ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {\n\t\treturn false;\n\t}\n\n\t$crons = _get_cron_array();\n\t$schedules = wp_get_schedules();\n\n\tif ( !isset( $schedules[$recurrence] ) )\n\t\treturn false;\n\n\t$event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] );\n\t/** This filter is documented in wp-includes/cron.php */\n\t$event = apply_filters( 'schedule_event', $event );\n\n\t// A plugin disallowed this event\n\tif ( ! $event )\n\t\treturn false;\n\n\t$key = md5(serialize($event->args));\n\n\t$crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval );\n\tuksort( $crons, \"strnatcasecmp\" );\n\t_set_cron_array( $crons );\n}\n\n/**\n * Reschedule a recurring event.\n *\n * @since 2.1.0\n *\n * @param int $timestamp Timestamp for when to run the event.\n * @param string $recurrence How often the event should recur.\n * @param string $hook Action hook to execute when cron is run.\n * @param array $args Optional. Arguments to pass to the hook's callback function.\n * @return false|void False when an event is not scheduled.\n */\nfunction wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array() ) {\n\t// Make sure timestamp is a positive integer\n\tif ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {\n\t\treturn false;\n\t}\n\n\t$crons = _get_cron_array();\n\t$schedules = wp_get_schedules();\n\t$key = md5( serialize( $args ) );\n\t$interval = 0;\n\n\t// First we try to get it from the schedule\n\tif ( isset( $schedules[ $recurrence ] ) ) {\n\t\t$interval = $schedules[ $recurrence ]['interval'];\n\t}\n\t// Now we try to get it from the saved interval in case the schedule disappears\n\tif ( 0 == $interval ) {\n\t\t$interval = $crons[ $timestamp ][ $hook ][ $key ]['interval'];\n\t}\n\t// Now we assume something is wrong and fail to schedule\n\tif ( 0 == $interval ) {\n\t\treturn false;\n\t}\n\n\t$now = time();\n\n\tif ( $timestamp >= $now ) {\n\t\t$timestamp = $now + $interval;\n\t} else {\n\t\t$timestamp = $now + ( $interval - ( ( $now - $timestamp ) % $interval ) );\n\t}\n\n\twp_schedule_event( $timestamp, $recurrence, $hook, $args );\n}\n\n/**\n * Unschedule a previously scheduled cron job.\n *\n * The $timestamp and $hook parameters are required, so that the event can be\n * identified.\n *\n * @since 2.1.0\n *\n * @param int $timestamp Timestamp for when to run the event.\n * @param string $hook Action hook, the execution of which will be unscheduled.\n * @param array $args Arguments to pass to the hook's callback function.\n * Although not passed to a callback function, these arguments are used\n * to uniquely identify the scheduled event, so they should be the same\n * as those used when originally scheduling the event.\n * @return false|void False when an event is not unscheduled.\n */\nfunction wp_unschedule_event( $timestamp, $hook, $args = array() ) {\n\t// Make sure timestamp is a positive integer\n\tif ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) {\n\t\treturn false;\n\t}\n\n\t$crons = _get_cron_array();\n\t$key = md5(serialize($args));\n\tunset( $crons[$timestamp][$hook][$key] );\n\tif ( empty($crons[$timestamp][$hook]) )\n\t\tunset( $crons[$timestamp][$hook] );\n\tif ( empty($crons[$timestamp]) )\n\t\tunset( $crons[$timestamp] );\n\t_set_cron_array( $crons );\n}\n\n/**\n * Unschedule all cron jobs attached to a specific hook.\n *\n * @since 2.1.0\n *\n * @param string $hook Action hook, the execution of which will be unscheduled.\n * @param array $args Optional. Arguments that were to be pass to the hook's callback function.\n */\nfunction wp_clear_scheduled_hook( $hook, $args = array() ) {\n\t// Backward compatibility\n\t// Previously this function took the arguments as discrete vars rather than an array like the rest of the API\n\tif ( !is_array($args) ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.0', __('This argument has changed to an array to match the behavior of the other cron functions.') );\n\t\t$args = array_slice( func_get_args(), 1 );\n\t}\n\n\t// This logic duplicates wp_next_scheduled()\n\t// It's required due to a scenario where wp_unschedule_event() fails due to update_option() failing,\n\t// and, wp_next_scheduled() returns the same schedule in an infinite loop.\n\t$crons = _get_cron_array();\n\tif ( empty( $crons ) )\n\t\treturn;\n\n\t$key = md5( serialize( $args ) );\n\tforeach ( $crons as $timestamp => $cron ) {\n\t\tif ( isset( $cron[ $hook ][ $key ] ) ) {\n\t\t\twp_unschedule_event( $timestamp, $hook, $args );\n\t\t}\n\t}\n}\n\n/**\n * Retrieve the next timestamp for a cron event.\n *\n * @since 2.1.0\n *\n * @param string $hook Action hook to execute when cron is run.\n * @param array $args Optional. Arguments to pass to the hook's callback function.\n * @return false|int The UNIX timestamp of the next time the scheduled event will occur.\n */\nfunction wp_next_scheduled( $hook, $args = array() ) {\n\t$crons = _get_cron_array();\n\t$key = md5(serialize($args));\n\tif ( empty($crons) )\n\t\treturn false;\n\tforeach ( $crons as $timestamp => $cron ) {\n\t\tif ( isset( $cron[$hook][$key] ) )\n\t\t\treturn $timestamp;\n\t}\n\treturn false;\n}\n\n/**\n * Send request to run cron through HTTP request that doesn't halt page loading.\n *\n * @since 2.1.0\n */\nfunction spawn_cron( $gmt_time = 0 ) {\n\tif ( ! $gmt_time )\n\t\t$gmt_time = microtime( true );\n\n\tif ( defined('DOING_CRON') || isset($_GET['doing_wp_cron']) )\n\t\treturn;\n\n\t/*\n\t * Get the cron lock, which is a unix timestamp of when the last cron was spawned\n\t * and has not finished running.\n\t *\n\t * Multiple processes on multiple web servers can run this code concurrently,\n\t * this lock attempts to make spawning as atomic as possible.\n\t */\n\t$lock = get_transient('doing_cron');\n\n\tif ( $lock > $gmt_time + 10 * MINUTE_IN_SECONDS )\n\t\t$lock = 0;\n\n\t// don't run if another process is currently running it or more than once every 60 sec.\n\tif ( $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time )\n\t\treturn;\n\n\t//sanity check\n\t$crons = _get_cron_array();\n\tif ( !is_array($crons) )\n\t\treturn;\n\n\t$keys = array_keys( $crons );\n\tif ( isset($keys[0]) && $keys[0] > $gmt_time )\n\t\treturn;\n\n\tif ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) {\n\t\tif ( 'GET' !== $_SERVER['REQUEST_METHOD'] || defined( 'DOING_AJAX' ) ||  defined( 'XMLRPC_REQUEST' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$doing_wp_cron = sprintf( '%.22F', $gmt_time );\n\t\tset_transient( 'doing_cron', $doing_wp_cron );\n\n\t\tob_start();\n\t\twp_redirect( add_query_arg( 'doing_wp_cron', $doing_wp_cron, wp_unslash( $_SERVER['REQUEST_URI'] ) ) );\n\t\techo ' ';\n\n\t\t// flush any buffers and send the headers\n\t\twhile ( @ob_end_flush() );\n\t\tflush();\n\n\t\tWP_DEBUG ? include_once( ABSPATH . 'wp-cron.php' ) : @include_once( ABSPATH . 'wp-cron.php' );\n\t\treturn;\n\t}\n\n\t// Set the cron lock with the current unix timestamp, when the cron is being spawned.\n\t$doing_wp_cron = sprintf( '%.22F', $gmt_time );\n\tset_transient( 'doing_cron', $doing_wp_cron );\n\n\t/**\n\t * Filter the cron request arguments.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array $cron_request_array {\n\t *     An array of cron request URL arguments.\n\t *\n\t *     @type string $url  The cron request URL.\n\t *     @type int    $key  The 22 digit GMT microtime.\n\t *     @type array  $args {\n\t *         An array of cron request arguments.\n\t *\n\t *         @type int  $timeout   The request timeout in seconds. Default .01 seconds.\n\t *         @type bool $blocking  Whether to set blocking for the request. Default false.\n\t *         @type bool $sslverify Whether SSL should be verified for the request. Default false.\n\t *     }\n\t * }\n\t */\n\t$cron_request = apply_filters( 'cron_request', array(\n\t\t'url'  => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ),\n\t\t'key'  => $doing_wp_cron,\n\t\t'args' => array(\n\t\t\t'timeout'   => 0.01,\n\t\t\t'blocking'  => false,\n\t\t\t/** This filter is documented in wp-includes/class-wp-http-streams.php */\n\t\t\t'sslverify' => apply_filters( 'https_local_ssl_verify', false )\n\t\t)\n\t) );\n\n\twp_remote_post( $cron_request['url'], $cron_request['args'] );\n}\n\n/**\n * Run scheduled callbacks or spawn cron for all scheduled events.\n *\n * @since 2.1.0\n */\nfunction wp_cron() {\n\t// Prevent infinite loops caused by lack of wp-cron.php\n\tif ( strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false || ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) )\n\t\treturn;\n\n\tif ( false === $crons = _get_cron_array() )\n\t\treturn;\n\n\t$gmt_time = microtime( true );\n\t$keys = array_keys( $crons );\n\tif ( isset($keys[0]) && $keys[0] > $gmt_time )\n\t\treturn;\n\n\t$schedules = wp_get_schedules();\n\tforeach ( $crons as $timestamp => $cronhooks ) {\n\t\tif ( $timestamp > $gmt_time ) break;\n\t\tforeach ( (array) $cronhooks as $hook => $args ) {\n\t\t\tif ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) )\n\t\t\t\tcontinue;\n\t\t\tspawn_cron( $gmt_time );\n\t\t\tbreak 2;\n\t\t}\n\t}\n}\n\n/**\n * Retrieve supported and filtered Cron recurrences.\n *\n * The supported recurrences are 'hourly' and 'daily'. A plugin may add more by\n * hooking into the 'cron_schedules' filter. The filter accepts an array of\n * arrays. The outer array has a key that is the name of the schedule or for\n * example 'weekly'. The value is an array with two keys, one is 'interval' and\n * the other is 'display'.\n *\n * The 'interval' is a number in seconds of when the cron job should run. So for\n * 'hourly', the time is 3600 or 60*60. For weekly, the value would be\n * 60*60*24*7 or 604800. The value of 'interval' would then be 604800.\n *\n * The 'display' is the description. For the 'weekly' key, the 'display' would\n * be `__( 'Once Weekly' )`.\n *\n * For your plugin, you will be passed an array. you can easily add your\n * schedule by doing the following.\n *\n *     // Filter parameter variable name is 'array'.\n *     $array['weekly'] = array(\n *         'interval' => 604800,\n *     \t   'display'  => __( 'Once Weekly' )\n *     );\n *\n *\n * @since 2.1.0\n *\n * @return array\n */\nfunction wp_get_schedules() {\n\t$schedules = array(\n\t\t'hourly'     => array( 'interval' => HOUR_IN_SECONDS,      'display' => __( 'Once Hourly' ) ),\n\t\t'twicedaily' => array( 'interval' => 12 * HOUR_IN_SECONDS, 'display' => __( 'Twice Daily' ) ),\n\t\t'daily'      => array( 'interval' => DAY_IN_SECONDS,       'display' => __( 'Once Daily' ) ),\n\t);\n\t/**\n\t * Filter the non-default cron schedules.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array $new_schedules An array of non-default cron schedules. Default empty.\n\t */\n\treturn array_merge( apply_filters( 'cron_schedules', array() ), $schedules );\n}\n\n/**\n * Retrieve Cron schedule for hook with arguments.\n *\n * @since 2.1.0\n *\n * @param string $hook Action hook to execute when cron is run.\n * @param array $args Optional. Arguments to pass to the hook's callback function.\n * @return string|false False, if no schedule. Schedule on success.\n */\nfunction wp_get_schedule($hook, $args = array()) {\n\t$crons = _get_cron_array();\n\t$key = md5(serialize($args));\n\tif ( empty($crons) )\n\t\treturn false;\n\tforeach ( $crons as $timestamp => $cron ) {\n\t\tif ( isset( $cron[$hook][$key] ) )\n\t\t\treturn $cron[$hook][$key]['schedule'];\n\t}\n\treturn false;\n}\n\n//\n// Private functions\n//\n\n/**\n * Retrieve cron info array option.\n *\n * @since 2.1.0\n * @access private\n *\n * @return false|array CRON info array.\n */\nfunction _get_cron_array()  {\n\t$cron = get_option('cron');\n\tif ( ! is_array($cron) )\n\t\treturn false;\n\n\tif ( !isset($cron['version']) )\n\t\t$cron = _upgrade_cron_array($cron);\n\n\tunset($cron['version']);\n\n\treturn $cron;\n}\n\n/**\n * Updates the CRON option with the new CRON array.\n *\n * @since 2.1.0\n * @access private\n *\n * @param array $cron Cron info array from {@link _get_cron_array()}.\n */\nfunction _set_cron_array($cron) {\n\t$cron['version'] = 2;\n\tupdate_option( 'cron', $cron );\n}\n\n/**\n * Upgrade a Cron info array.\n *\n * This function upgrades the Cron info array to version 2.\n *\n * @since 2.1.0\n * @access private\n *\n * @param array $cron Cron info array from {@link _get_cron_array()}.\n * @return array An upgraded Cron info array.\n */\nfunction _upgrade_cron_array($cron) {\n\tif ( isset($cron['version']) && 2 == $cron['version'])\n\t\treturn $cron;\n\n\t$new_cron = array();\n\n\tforeach ( (array) $cron as $timestamp => $hooks) {\n\t\tforeach ( (array) $hooks as $hook => $args ) {\n\t\t\t$key = md5(serialize($args['args']));\n\t\t\t$new_cron[$timestamp][$hook][$key] = $args;\n\t\t}\n\t}\n\n\t$new_cron['version'] = 2;\n\tupdate_option( 'cron', $new_cron );\n\treturn $new_cron;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/admin-bar-rtl.css",
    "content": "#wpadminbar * {\n\theight: auto;\n\twidth: auto;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: static;\n\ttext-shadow: none;\n\ttext-transform: none;\n\tletter-spacing: normal;\n\tfont: normal 13px/32px \"Open Sans\", sans-serif;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\t-webkit-transition: none;\n\ttransition: none;\n\t-webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */\n\t-moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */\n}\n\n.rtl #wpadminbar * {\n\tfont-family: Tahoma, sans-serif;\n}\n\nhtml:lang(he-il) .rtl #wpadminbar *  {\n \tfont-family: Arial, sans-serif;\n}\n\n#wpadminbar .ab-empty-item {\n\tcursor: default;\n}\n\n#wpadminbar .ab-empty-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n\tcolor: #eee;\n}\n\n#wpadminbar #wp-admin-bar-site-name a.ab-item,\n#wpadminbar #wp-admin-bar-my-sites a.ab-item {\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n#wpadminbar ul li:before,\n#wpadminbar ul li:after {\n\tcontent: normal;\n}\n\n#wpadminbar a,\n#wpadminbar a:hover,\n#wpadminbar a img,\n#wpadminbar a img:hover {\n\toutline: none;\n\tborder: none;\n\ttext-decoration: none;\n\tbackground: none;\n}\n\n#wpadminbar a:focus,\n#wpadminbar a:active,\n#wpadminbar input[type=\"text\"],\n#wpadminbar input[type=\"password\"],\n#wpadminbar input[type=\"number\"],\n#wpadminbar input[type=\"search\"],\n#wpadminbar input[type=\"email\"],\n#wpadminbar input[type=\"url\"],\n#wpadminbar select,\n#wpadminbar textarea,\n#wpadminbar div {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n}\n\n#wpadminbar {\n\tdirection: rtl;\n\tcolor: #ccc;\n\tfont: normal 13px/32px \"Open Sans\", sans-serif;\n\theight: 32px;\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n\tmin-width: 600px; /* match the min-width of the body in wp-admin.css */\n\tz-index: 99999;\n\tbackground: #23282d;\n}\n\n#wpadminbar .ab-sub-wrapper,\n#wpadminbar ul,\n#wpadminbar ul li {\n\tbackground: none;\n\tclear: none;\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n\ttext-indent: 0;\n\tz-index: 99999;\n}\n\n#wpadminbar ul#wp-admin-bar-root-default>li {\n\tmargin-left: 0;\n}\n\n#wpadminbar .quicklinks ul {\n\ttext-align: right;\n}\n\n#wpadminbar li {\n\tfloat: right;\n}\n\n#wpadminbar .ab-empty-item {\n\toutline: none;\n}\n\n#wpadminbar .quicklinks .ab-top-secondary > li {\n\tfloat: left;\n}\n\n#wpadminbar .quicklinks a,\n#wpadminbar .quicklinks .ab-empty-item,\n#wpadminbar .shortlink-input {\n\theight: 32px;\n\tdisplay: block;\n\tpadding: 0 10px;\n\tmargin: 0;\n}\n\n#wpadminbar .quicklinks > ul > li > a {\n\tpadding: 0 7px 0 8px;\n}\n\n#wpadminbar .menupop .ab-sub-wrapper,\n#wpadminbar .shortlink-input {\n\tmargin: 0;\n\tpadding: 0;\n\t-webkit-box-shadow: 0 3px 5px rgba(0,0,0,0.2);\n\tbox-shadow: 0 3px 5px rgba(0,0,0,0.2);\n\tbackground: #32373c;\n\tdisplay: none;\n\tposition: absolute;\n\tfloat: none;\n}\n\n#wpadminbar.ie7 .menupop .ab-sub-wrapper,\n#wpadminbar.ie7 .shortlink-input {\n\ttop: 32px;\n\tright: 0;\n}\n\n#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {\n\tmin-width: 100%;\n}\n\n#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper {\n\tleft: 0;\n\tright: auto;\n}\n\n#wpadminbar .ab-submenu {\n\tpadding: 6px 0;\n}\n\n#wpadminbar .selected .shortlink-input {\n\tdisplay: block;\n}\n\n#wpadminbar .quicklinks .menupop ul li {\n\tfloat: none;\n}\n\n#wpadminbar .quicklinks .menupop ul li a strong {\n\tfont-weight: bold;\n}\n\n#wpadminbar .quicklinks .menupop ul li .ab-item,\n#wpadminbar .quicklinks .menupop ul li a strong,\n#wpadminbar .quicklinks .menupop.hover ul li .ab-item,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item,\n#wpadminbar .shortlink-input {\n\tline-height: 26px;\n\theight: 26px;\n\twhite-space: nowrap;\n\tmin-width: 140px;\n}\n\n#wpadminbar .shortlink-input {\n\twidth: 200px;\n}\n\n#wpadminbar.nojs li:hover > .ab-sub-wrapper,\n#wpadminbar li.hover > .ab-sub-wrapper {\n\tdisplay: block;\n}\n\n#wpadminbar .menupop li:hover > .ab-sub-wrapper,\n#wpadminbar .menupop li.hover > .ab-sub-wrapper {\n\tmargin-right: 100%;\n\tmargin-top: -32px;\n}\n\n#wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper,\n#wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper {\n\tmargin-right: 0;\n\tright: inherit;\n\tleft: 100%;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.hover > .ab-item {\n\tbackground: #32373c;\n\tcolor: #00b9eb;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon,\n#wpadminbar .ab-icon,\n#wpadminbar .ab-item:before {\n\tposition: relative;\n\tfloat: right;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tpadding: 4px 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tbackground-image: none !important;\n\tmargin-left: 6px;\n}\n\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar #adminbarsearch:before {\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n}\n\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar #adminbarsearch:before {\n\tposition: relative;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n#wpadminbar .ab-label {\n\tdisplay: inline-block;\n\theight: 32px;\n}\n\n#wpadminbar .ab-submenu .ab-item {\n\tcolor: #b4b9be;\n\tcolor: rgba(240,245,250,0.7);\n}\n\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop ul li a strong,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n\tcolor: #b4b9be;\n\tcolor: rgba(240,245,250,0.7);\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n\tcolor: #b4b9be;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar .menupop .menupop > .ab-item:before,\n#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {\n\tposition: absolute;\n\tfont: normal 17px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#wpadminbar .menupop .menupop > .ab-item {\n\tdisplay: block;\n\tpadding-left: 2em;\n}\n\n#wpadminbar .menupop .menupop > .ab-item:before {\n\ttop: 1px;\n\tleft: 4px;\n\tcontent: \"\\f141\";\n\tcolor: inherit;\n}\n\n#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item {\n\tpadding-right: 2em;\n\tpadding-left: 1em;\n}\n\n#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {\n\ttop: 1px;\n\tright: 6px;\n\tcontent: \"\\f139\";\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary {\n\tdisplay: block;\n\tposition: relative;\n\tleft: auto;\n\tmargin: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n\tbackground: #464b50;\n}\n\n#wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover,\n#wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar .quicklinks a span#ab-updates {\n\tbackground: #eee;\n\tcolor: #32373c;\n\tdisplay: inline;\n\tpadding: 2px 5px;\n\tfont-size: 10px;\n\tfont-weight: bold;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n}\n\n#wpadminbar .quicklinks a:hover span#ab-updates  {\n\tbackground: #fff;\n\tcolor: #000;\n}\n\n#wpadminbar .ab-top-secondary {\n\tfloat: left;\n}\n\n#wpadminbar ul li:last-child,\n#wpadminbar ul li:last-child .ab-item {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n/**\n * My Account\n */\n#wp-admin-bar-my-account > ul {\n\tmin-width: 198px;\n}\n\n#wp-admin-bar-my-account > .ab-item:before {\n\tcontent: \"\\f110\";\n\ttop: 2px;\n\tfloat: left;\n\tmargin-right: 6px;\n\tmargin-left: 0;\n}\n\n#wp-admin-bar-my-account.with-avatar > .ab-item:before {\n\tdisplay: none;\n\tcontent: none;\n}\n\n#wp-admin-bar-my-account.with-avatar > ul {\n\tmin-width: 270px;\n}\n\n#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item {\n\twhite-space: nowrap;\n}\n\n#wpadminbar #wp-admin-bar-user-actions > li {\n\tmargin-right: 16px;\n\tmargin-left: 16px;\n}\n\n#wpadminbar #wp-admin-bar-user-actions.ab-submenu {\n\tpadding: 6px 0 12px;\n}\n\n#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li {\n\tmargin-right: 88px;\n}\n\n#wpadminbar #wp-admin-bar-user-info {\n\tmargin-top: 6px;\n\tmargin-bottom: 15px;\n\theight: auto;\n\tbackground: none;\n}\n\n#wp-admin-bar-user-info .avatar {\n\tposition: absolute;\n\tright: -72px;\n\ttop: 4px;\n\twidth: 64px;\n\theight: 64px;\n}\n\n#wpadminbar #wp-admin-bar-user-info a {\n\tbackground: none;\n\theight: auto;\n}\n\n#wpadminbar #wp-admin-bar-user-info span {\n\tbackground: none;\n\tpadding: 0;\n\theight: 18px;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name,\n#wpadminbar #wp-admin-bar-user-info .username {\n\tdisplay: block;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n\tcolor: #999;\n\tfont-size: 11px;\n}\n\n#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,\n#wpadminbar #wp-admin-bar-my-account.with-avatar > a img {\n\twidth: auto;\n\theight: 16px;\n\tpadding: 0;\n\tborder: 1px solid #82878c;\n\tbackground: #eee;\n\tline-height: 24px;\n\tvertical-align: middle;\n\tmargin: -4px 6px 0 0;\n\tfloat: none;\n\tdisplay: inline;\n}\n\n#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,\n#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > a img {\n\twidth: auto;\n}\n\n/**\n * WP Logo\n */\n#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon {\n\twidth: 15px;\n\theight: 20px;\n\tmargin-left: 0;\n\tpadding: 6px 0 5px;\n}\n\n#wpadminbar #wp-admin-bar-wp-logo > .ab-item {\n\tpadding: 0 7px;\n}\n\n#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before {\n\tcontent: \"\\f120\";\n\ttop: 2px;\n}\n\n/*\n * My Sites & Site Title\n */\n#wpadminbar .quicklinks li .blavatar {\n\tfloat: right;\n\tfont: normal 16px/1 dashicons !important;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcolor: #eee;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar .quicklinks li .blavatar:before {\n\tcontent: \"\\f120\";\n\theight: 16px;\n\twidth: 16px;\n\tdisplay: inline-block;\n\tmargin: 6px -2px 0 8px;\n}\n\n#wpadminbar #wp-admin-bar-appearance {\n\tmargin-top: -12px;\n}\n\n#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,\n#wpadminbar #wp-admin-bar-site-name > .ab-item:before {\n\tcontent: \"\\f112\";\n\ttop: 2px;\n}\n\n#wpadminbar #wp-admin-bar-customize > .ab-item:before {\n\tcontent: \"\\f540\";\n\ttop: 2px;\n}\n\n\n#wpadminbar #wp-admin-bar-edit > .ab-item:before {\n\tcontent: \"\\f464\";\n\ttop: 2px;\n}\n\n#wpadminbar #wp-admin-bar-site-name > .ab-item:before {\n\tcontent: \"\\f226\";\n}\n\n.wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before {\n\tcontent: \"\\f102\";\n}\n\n\n\n/**\n * Comments\n */\n#wpadminbar #wp-admin-bar-comments .ab-icon {\n\tmargin-left: 6px;\n}\n\n#wpadminbar #wp-admin-bar-comments .ab-icon:before {\n\tcontent: \"\\f101\";\n\ttop: 3px;\n}\n\n#wpadminbar #wp-admin-bar-comments .count-0 {\n\topacity: .5;\n}\n\n/**\n * New Content\n */\n#wpadminbar #wp-admin-bar-new-content .ab-icon:before {\n\tcontent: \"\\f132\";\n\ttop: 4px;\n}\n\n/**\n * Updates\n */\n#wpadminbar #wp-admin-bar-updates .ab-icon:before {\n\tcontent: \"\\f463\";\n\ttop: 2px;\n}\n\n/**\n * Search\n */\n#wpadminbar.ie8 #wp-admin-bar-search {\n\tdisplay: block;\n\tmin-width: 32px;\n}\n#wpadminbar #wp-admin-bar-search .ab-item {\n\tpadding: 0;\n\tbackground: transparent;\n}\n\n#wpadminbar #adminbarsearch {\n\tposition: relative;\n\theight: 32px;\n\tpadding: 0 2px;\n\tz-index: 1;\n}\n\n#wpadminbar #adminbarsearch:before {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 5px;\n\tz-index: 20;\n\tfont: normal 20px/1 dashicons !important;\n\tcontent: \"\\f179\";\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input {\n\tposition: relative;\n\tz-index: 30;\n\tfont: 13px/24px \"Open Sans\", sans-serif;\n\theight: 24px;\n\twidth: 24px;\n\tmax-width: none;\n\tpadding: 0 24px 0 3px;\n\tmargin: 0;\n\tcolor: #ccc;\n\tbackground-color: rgba( 255, 255, 255, 0 );\n\tborder: none;\n\toutline: none;\n\tcursor: pointer;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-transition-duration: 400ms;\n\ttransition-duration: 400ms;\n\t-webkit-transition-property: width, background;\n\ttransition-property: width, background;\n\t-webkit-transition-timing-function: ease;\n\ttransition-timing-function: ease;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n\tz-index: 10;\n\tcolor: #000;\n\twidth: 200px;\n\tbackground-color: rgba( 255, 255, 255, 0.9 );\n\tcursor: text;\n\tborder: 0;\n}\n\n#wpadminbar.ie7 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input {\n\tmargin-top: 3px;\n\twidth: 120px;\n}\n\n#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input {\n\t/* IE8 z-index bug with transparent / empty elements - fill in with an encoded transparent GIF */\n\tbackground: transparent 100% 0 repeat scroll url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBR‌​AA7\");\n}\n\n/* IE8 doesn't redraw the pseudo elements unless you make a change to the content */\n#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before {\n\tcontent: \"\\f179 \"; /* extra space */\n}\n\n#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n\tbackground: #fff;\n\tz-index: -1;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n\tcolor: #999;\n}\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n\tcolor: #999;\n}\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n\tcolor: #999;\n}\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n\tcolor: #999;\n}\n\n#wpadminbar #adminbarsearch .adminbar-button {\n\tdisplay: none;\n}\n\n/**\n * Customize support classes\n */\n.no-customize-support .hide-if-no-customize,\n.customize-support .hide-if-customize,\n.no-customize-support #wpadminbar .hide-if-no-customize,\n.no-customize-support.wp-core-ui .hide-if-no-customize,\n.no-customize-support .wp-core-ui .hide-if-no-customize,\n.customize-support #wpadminbar .hide-if-customize,\n.customize-support.wp-core-ui .hide-if-customize,\n.customize-support .wp-core-ui .hide-if-customize {\n\tdisplay: none;\n}\n\n/* Skip link */\n#wpadminbar .screen-reader-text,\n#wpadminbar .screen-reader-text span {\n\tposition: absolute;\n\tright: -1000em;\n\ttop: -1000em;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n}\n\n#wpadminbar .screen-reader-shortcut {\n\tposition: absolute;\n\ttop: -1000em;\n}\n\n#wpadminbar .screen-reader-shortcut:focus {\n\tright: 6px;\n\ttop: 7px;\n\theight: auto;\n\twidth: auto;\n\tdisplay: block;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tpadding: 15px 23px 14px;\n\tbackground: #f1f1f1;\n\tcolor: #0073aa;\n\tz-index: 100000;\n\tline-height: normal;\n\ttext-decoration: none;\n\t-webkit-box-shadow: 0 0 2px 2px rgba(0,0,0,.6);\n\tbox-shadow: 0 0 2px 2px rgba(0,0,0,.6);\n}\n\n/**\n * IE 6-targeted rules\n */\n* html #wpadminbar {\n\toverflow: hidden;\n\tposition: absolute;\n}\n\n* html #wpadminbar .quicklinks ul li a {\n\tfloat: right;\n}\n\n* html #wpadminbar .menupop a span {\n\tbackground-image: none;\n}\n\n/* No @font-face support */\n.no-font-face #wpadminbar ul.ab-top-menu > li > a.ab-item {\n\tdisplay: block;\n\twidth: 45px;\n\ttext-align: center;\n\toverflow: hidden;\n\tmargin: 0 3px;\n}\n\n.no-font-face #wpadminbar #wp-admin-bar-my-sites > .ab-item,\n.no-font-face #wpadminbar #wp-admin-bar-site-name > .ab-item,\n.no-font-face #wpadminbar #wp-admin-bar-edit > .ab-item {\n\ttext-indent: 0;\n}\n\n.no-font-face #wpadminbar .ab-icon,\n.no-font-face #wpadminbar .ab-icon:before,\n.no-font-face #wpadminbar a.ab-item:before,\n.no-font-face #wpadminbar #wp-admin-bar-wp-logo > .ab-item {\n\tdisplay: none !important;\n}\n\n.no-font-face #wpadminbar ul.ab-top-menu > li > a > span.ab-label {\n\tdisplay: inline;\n}\n\n.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon {\n\tdisplay: inline !important;\n}\n\n.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before {\n\tcontent: \"Menu\";\n\tfont: 14px/45px sans-serif !important;\n\tdisplay: inline-block !important;\n\tcolor: #fff;\n}\n\n.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item {\n\tcolor: #fff;\n}\n/* End no @font-face */\n\n@media screen and ( max-width: 782px ) {\n\t/* Toolbar Touchification*/\n\thtml #wpadminbar {\n\t\theight: 46px;\n\t\tmin-width: 300px;\n\n\t/*\tThese rules break dropdown tappability on Chrome/Android.\n\t\t-webkit-transform: translate3d(0, 0, 0);\n\t\t-webkit-backface-visibility: hidden;\n\t\t-webkit-transition: 0;\n\t\ttransform: translate3d(0, 0, 0);\n\t\tbackface-visibility: hidden;\n\t\ttransition: 0;\n\t*/\n\t}\n\n\t#wpadminbar * {\n\t\tfont: normal 14px/32px \"Open Sans\", sans-serif;\n\t}\n\n\t#wpadminbar .quicklinks > ul > li > a,\n\t#wpadminbar .quicklinks .ab-empty-item {\n\t\tpadding: 0;\n\t\theight: 46px;\n\t\tline-height: 46px;\n\t\twidth: auto;\n\t}\n\n\t#wpadminbar .ab-icon {\n\t\tfont: 40px/1 dashicons !important;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\twidth: 52px;\n\t\theight: 46px;\n\t\ttext-align: center;\n\t}\n\n\t#wpadminbar .ab-icon:before {\n\t\ttext-align: center;\n\t}\n\n\t#wpadminbar .ab-submenu {\n\t\tpadding: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-site-name a.ab-item,\n\t#wpadminbar #wp-admin-bar-my-sites a.ab-item,\n\t#wpadminbar #wp-admin-bar-my-account a.ab-item {\n\t\ttext-overflow: clip;\n\t}\n\n\t#wpadminbar .ab-label {\n\t\tdisplay: none;\n\t}\n\n\t#wpadminbar .menupop li:hover > .ab-sub-wrapper,\n\t#wpadminbar .menupop li.hover > .ab-sub-wrapper {\n\t\tmargin-top: -46px;\n\t}\n\n\t#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item {\n\t\tpadding-left: 30px;\n\t}\n\n\t#wpadminbar .menupop .menupop > .ab-item:before {\n\t\ttop: 10px;\n\t\tleft: 6px;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item {\n\t\tfont-size: 16px;\n\t\tpadding: 8px 16px;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* WP logo */\n\t#wpadminbar #wp-admin-bar-wp-logo > .ab-item {\n\t\tpadding: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon {\n\t\tpadding: 0;\n\t\twidth: 52px;\n\t\theight: 46px;\n\t\ttext-align: center;\n\t\tvertical-align: top;\n\t}\n\n\t#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before {\n\t\tfont: 28px/1 dashicons !important;\n\t\ttop: -3px;\n\t}\n\n\t#wpadminbar .ab-icon,\n\t#wpadminbar .ab-item:before {\n\t\tpadding: 0;\n\t}\n\n\t/* My Sites and \"Site Title\" menu */\n\t#wpadminbar #wp-admin-bar-my-sites > .ab-item,\n\t#wpadminbar #wp-admin-bar-site-name > .ab-item,\n\t#wpadminbar #wp-admin-bar-customize > .ab-item,\n\t#wpadminbar #wp-admin-bar-edit > .ab-item,\n\t#wpadminbar #wp-admin-bar-my-account > .ab-item {\n\t\ttext-indent: 100%;\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\twidth: 52px;\n\t\tpadding: 0;\n\t\tcolor: #999;\n\t\tposition: relative;\n\t}\n\n\t#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon,\n\t#wpadminbar .ab-icon,\n\t#wpadminbar .ab-item:before {\n\t\tpadding: 0;\n\t\tmargin-left: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-edit > .ab-item:before,\n\t#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,\n\t#wpadminbar #wp-admin-bar-site-name > .ab-item:before,\n\t#wpadminbar #wp-admin-bar-customize > .ab-item:before,\n\t#wpadminbar #wp-admin-bar-my-account > .ab-item:before {\n\t\tdisplay: block;\n\t\ttext-indent: 0;\n\t\tfont: normal 32px/1 dashicons;\n\t\tspeak: none;\n\t\ttop: 7px;\n\t\twidth: 52px;\n\t\ttext-align: center;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-moz-osx-font-smoothing: grayscale;\n\t}\n\n\t#wpadminbar #wp-admin-bar-appearance {\n\t\tmargin-top: 0;\n\t}\n\n\t#wpadminbar .quicklinks li .blavatar:before {\n\t\tdisplay: none;\n\t}\n\n\t/* Search */\n\t#wpadminbar #wp-admin-bar-search {\n\t\tdisplay: none;\n\t}\n\n\t/* New Content */\n\t#wpadminbar #wp-admin-bar-new-content .ab-icon:before {\n\t\ttop: 0;\n\t\tline-height: 53px;\n\t\theight: 46px !important;\n\t\ttext-align: center;\n\t\twidth: 52px;\n\t\tdisplay: block;\n\t}\n\n\t/* Updates */\n\t#wpadminbar #wp-admin-bar-updates {\n\t\ttext-align: center;\n\t}\n\n\t#wpadminbar #wp-admin-bar-updates .ab-icon:before {\n\t\ttop: 3px;\n\t}\n\n\t/* Comments */\n\t#wpadminbar #wp-admin-bar-comments .ab-icon {\n\t\tmargin: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-comments .ab-icon:before {\n\t\tdisplay: block;\n\t\tfont-size: 34px;\n\t\theight: 46px;\n\t\tline-height: 47px;\n\t\ttop: 0;\n\t}\n\n\t/* My Account */\n\t#wpadminbar #wp-admin-bar-my-account > a {\n\t\tposition: relative;\n\t\twhite-space: nowrap;\n\t\ttext-indent: 150%; /* More than 100% indention is needed since this element has padding */\n\t\twidth: 28px;\n\t\tpadding: 0 10px;\n\t\toverflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */\n\t}\n\n\t#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n\t\tposition: absolute;\n\t\ttop: 13px;\n\t\tleft: 10px;\n\t\twidth: 26px;\n\t\theight: 26px;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-actions.ab-submenu {\n\t\tpadding: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar {\n\t\tdisplay: none;\n\t}\n\n\t#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li {\n\t\tmargin: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-info .display-name {\n\t\theight: auto;\n\t\tfont-size: 16px;\n\t\tline-height: 24px;\n\t\tcolor: #eee;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-info a {\n\t\tpadding-top: 4px;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-info .username {\n\t\tline-height: 0.8 !important;\n\t\tmargin-bottom: -2px;\n\t}\n\n\t/* Show only default top level items */\n\t#wp-toolbar > ul > li {\n\t\tdisplay: none;\n\t}\n\n\t#wpadminbar li#wp-admin-bar-menu-toggle,\n\t#wpadminbar li#wp-admin-bar-wp-logo,\n\t#wpadminbar li#wp-admin-bar-my-sites,\n\t#wpadminbar li#wp-admin-bar-updates,\n\t#wpadminbar li#wp-admin-bar-site-name,\n\t#wpadminbar li#wp-admin-bar-customize,\n\t#wpadminbar li#wp-admin-bar-new-content,\n\t#wpadminbar li#wp-admin-bar-edit,\n\t#wpadminbar li#wp-admin-bar-comments,\n\t#wpadminbar li#wp-admin-bar-my-account {\n\t\tdisplay: block;\n\t}\n\n\t/* Allow dropdown list items to appear normally */\n\t#wpadminbar li:hover ul li,\n\t#wpadminbar li.hover ul li,\n\t#wpadminbar li:hover ul li:hover ul li {\n\t\tdisplay: list-item;\n\t}\n\n\t/* Override default min-width so dropdown lists aren't stretched\n\t\tto 100% viewport width at responsive sizes. */\n\t#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {\n\t\tmin-width: -webkit-fit-content;\n\t\tmin-width: -moz-fit-content;\n\t\tmin-width: fit-content;\n\t}\n\n\t#wpadminbar ul#wp-admin-bar-root-default > li {\n\t\tmargin-left: 0;\n\t}\n\n\t/* Experimental fix for touch toolbar dropdown positioning */\n\t#wpadminbar .ab-top-menu,\n\t#wpadminbar .ab-top-secondary,\n\t#wpadminbar #wp-admin-bar-wp-logo,\n\t#wpadminbar #wp-admin-bar-my-sites,\n\t#wpadminbar #wp-admin-bar-site-name,\n\t#wpadminbar #wp-admin-bar-updates,\n\t#wpadminbar #wp-admin-bar-comments,\n\t#wpadminbar #wp-admin-bar-new-content,\n\t#wpadminbar #wp-admin-bar-edit,\n\t#wpadminbar #wp-admin-bar-my-account {\n\t\tposition: static;\n\t}\n\n\t#wpadminbar #wp-admin-bar-my-account {\n\t\tfloat: left;\n\t}\n\n\t.network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account {\n\t\tmargin-left: 0;\n\t}\n\n\t/* Realign arrows on taller responsive submenus */\n\n\t#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {\n\t\ttop: 10px;\n\t\tright: 0;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t#wpadminbar {\n\t\tposition: absolute;\n\t}\n\n\t#wp-responsive-overlay {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tright: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tz-index: 400;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {\n\t\twidth: 100%;\n\t\tright: 0;\n\t}\n\n\t#wpadminbar .menupop .menupop > .ab-item:before {\n\t\tdisplay: none;\n\t}\n\n\t#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper {\n\t\tmargin-right: 0;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper {\n\t\tmargin: 0;\n\t\twidth: 100%;\n\t\ttop: auto;\n\t\tright: auto;\n\t\tposition: relative;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item {\n\t\tfont-size: 16px;\n\t\tpadding: 6px 30px 19px 15px;\n\t}\n\n\t#wpadminbar li:hover ul li ul li {\n\t\tdisplay: list-item;\n\t}\n\n\t#wpadminbar li#wp-admin-bar-wp-logo,\n\t#wpadminbar li#wp-admin-bar-updates {\n\t\tdisplay: none;\n\t}\n\n\t/* Make submenus full-width at this size */\n\n\t#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper {\n\t\tposition: static;\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t}\n}\n\n/* Very narrow screens */\n@media screen and (max-width: 400px) {\n\t#wpadminbar li#wp-admin-bar-comments {\n\t\tdisplay: none;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/admin-bar.css",
    "content": "#wpadminbar * {\n\theight: auto;\n\twidth: auto;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: static;\n\ttext-shadow: none;\n\ttext-transform: none;\n\tletter-spacing: normal;\n\tfont: normal 13px/32px \"Open Sans\", sans-serif;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\t-webkit-transition: none;\n\ttransition: none;\n\t-webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */\n\t-moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */\n}\n\n.rtl #wpadminbar * {\n\tfont-family: Tahoma, sans-serif;\n}\n\nhtml:lang(he-il) .rtl #wpadminbar *  {\n \tfont-family: Arial, sans-serif;\n}\n\n#wpadminbar .ab-empty-item {\n\tcursor: default;\n}\n\n#wpadminbar .ab-empty-item,\n#wpadminbar a.ab-item,\n#wpadminbar > #wp-toolbar span.ab-label,\n#wpadminbar > #wp-toolbar span.noticon {\n\tcolor: #eee;\n}\n\n#wpadminbar #wp-admin-bar-site-name a.ab-item,\n#wpadminbar #wp-admin-bar-my-sites a.ab-item {\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n#wpadminbar ul li:before,\n#wpadminbar ul li:after {\n\tcontent: normal;\n}\n\n#wpadminbar a,\n#wpadminbar a:hover,\n#wpadminbar a img,\n#wpadminbar a img:hover {\n\toutline: none;\n\tborder: none;\n\ttext-decoration: none;\n\tbackground: none;\n}\n\n#wpadminbar a:focus,\n#wpadminbar a:active,\n#wpadminbar input[type=\"text\"],\n#wpadminbar input[type=\"password\"],\n#wpadminbar input[type=\"number\"],\n#wpadminbar input[type=\"search\"],\n#wpadminbar input[type=\"email\"],\n#wpadminbar input[type=\"url\"],\n#wpadminbar select,\n#wpadminbar textarea,\n#wpadminbar div {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\toutline: none;\n}\n\n#wpadminbar {\n\tdirection: ltr;\n\tcolor: #ccc;\n\tfont: normal 13px/32px \"Open Sans\", sans-serif;\n\theight: 32px;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\tmin-width: 600px; /* match the min-width of the body in wp-admin.css */\n\tz-index: 99999;\n\tbackground: #23282d;\n}\n\n#wpadminbar .ab-sub-wrapper,\n#wpadminbar ul,\n#wpadminbar ul li {\n\tbackground: none;\n\tclear: none;\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative;\n\ttext-indent: 0;\n\tz-index: 99999;\n}\n\n#wpadminbar ul#wp-admin-bar-root-default>li {\n\tmargin-right: 0;\n}\n\n#wpadminbar .quicklinks ul {\n\ttext-align: left;\n}\n\n#wpadminbar li {\n\tfloat: left;\n}\n\n#wpadminbar .ab-empty-item {\n\toutline: none;\n}\n\n#wpadminbar .quicklinks .ab-top-secondary > li {\n\tfloat: right;\n}\n\n#wpadminbar .quicklinks a,\n#wpadminbar .quicklinks .ab-empty-item,\n#wpadminbar .shortlink-input {\n\theight: 32px;\n\tdisplay: block;\n\tpadding: 0 10px;\n\tmargin: 0;\n}\n\n#wpadminbar .quicklinks > ul > li > a {\n\tpadding: 0 8px 0 7px;\n}\n\n#wpadminbar .menupop .ab-sub-wrapper,\n#wpadminbar .shortlink-input {\n\tmargin: 0;\n\tpadding: 0;\n\t-webkit-box-shadow: 0 3px 5px rgba(0,0,0,0.2);\n\tbox-shadow: 0 3px 5px rgba(0,0,0,0.2);\n\tbackground: #32373c;\n\tdisplay: none;\n\tposition: absolute;\n\tfloat: none;\n}\n\n#wpadminbar.ie7 .menupop .ab-sub-wrapper,\n#wpadminbar.ie7 .shortlink-input {\n\ttop: 32px;\n\tleft: 0;\n}\n\n#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {\n\tmin-width: 100%;\n}\n\n#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper {\n\tright: 0;\n\tleft: auto;\n}\n\n#wpadminbar .ab-submenu {\n\tpadding: 6px 0;\n}\n\n#wpadminbar .selected .shortlink-input {\n\tdisplay: block;\n}\n\n#wpadminbar .quicklinks .menupop ul li {\n\tfloat: none;\n}\n\n#wpadminbar .quicklinks .menupop ul li a strong {\n\tfont-weight: bold;\n}\n\n#wpadminbar .quicklinks .menupop ul li .ab-item,\n#wpadminbar .quicklinks .menupop ul li a strong,\n#wpadminbar .quicklinks .menupop.hover ul li .ab-item,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item,\n#wpadminbar .shortlink-input {\n\tline-height: 26px;\n\theight: 26px;\n\twhite-space: nowrap;\n\tmin-width: 140px;\n}\n\n#wpadminbar .shortlink-input {\n\twidth: 200px;\n}\n\n#wpadminbar.nojs li:hover > .ab-sub-wrapper,\n#wpadminbar li.hover > .ab-sub-wrapper {\n\tdisplay: block;\n}\n\n#wpadminbar .menupop li:hover > .ab-sub-wrapper,\n#wpadminbar .menupop li.hover > .ab-sub-wrapper {\n\tmargin-left: 100%;\n\tmargin-top: -32px;\n}\n\n#wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper,\n#wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper {\n\tmargin-left: 0;\n\tleft: inherit;\n\tright: 100%;\n}\n\n#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus,\n#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus,\n#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item,\n#wpadminbar .ab-top-menu > li.hover > .ab-item {\n\tbackground: #32373c;\n\tcolor: #00b9eb;\n}\n\n#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label,\n#wpadminbar > #wp-toolbar li.hover span.ab-label,\n#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon,\n#wpadminbar .ab-icon,\n#wpadminbar .ab-item:before {\n\tposition: relative;\n\tfloat: left;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tpadding: 4px 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tbackground-image: none !important;\n\tmargin-right: 6px;\n}\n\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar #adminbarsearch:before {\n\tcolor: #a0a5aa;\n\tcolor: rgba(240,245,250,0.6);\n}\n\n#wpadminbar .ab-icon:before,\n#wpadminbar .ab-item:before,\n#wpadminbar #adminbarsearch:before {\n\tposition: relative;\n\t-webkit-transition: all .1s ease-in-out;\n\ttransition: all .1s ease-in-out;\n}\n\n#wpadminbar .ab-label {\n\tdisplay: inline-block;\n\theight: 32px;\n}\n\n#wpadminbar .ab-submenu .ab-item {\n\tcolor: #b4b9be;\n\tcolor: rgba(240,245,250,0.7);\n}\n\n#wpadminbar .quicklinks .menupop ul li a,\n#wpadminbar .quicklinks .menupop ul li a strong,\n#wpadminbar .quicklinks .menupop.hover ul li a,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a {\n\tcolor: #b4b9be;\n\tcolor: rgba(240,245,250,0.7);\n}\n\n#wpadminbar .quicklinks .menupop ul li a:hover,\n#wpadminbar .quicklinks .menupop ul li a:focus,\n#wpadminbar .quicklinks .menupop ul li a:hover strong,\n#wpadminbar .quicklinks .menupop ul li a:focus strong,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a,\n#wpadminbar .quicklinks .menupop.hover ul li a:hover,\n#wpadminbar .quicklinks .menupop.hover ul li a:focus,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover,\n#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,\n#wpadminbar li:hover .ab-icon:before,\n#wpadminbar li:hover .ab-item:before,\n#wpadminbar li a:focus .ab-icon:before,\n#wpadminbar li .ab-item:focus:before,\n#wpadminbar li.hover .ab-icon:before,\n#wpadminbar li.hover .ab-item:before,\n#wpadminbar li:hover #adminbarsearch:before,\n#wpadminbar li #adminbarsearch.adminbar-focused:before {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar.mobile .quicklinks .ab-icon:before,\n#wpadminbar.mobile .quicklinks .ab-item:before {\n\tcolor: #b4b9be;\n}\n\n#wpadminbar.mobile .quicklinks .hover .ab-icon:before,\n#wpadminbar.mobile .quicklinks .hover .ab-item:before {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar .menupop .menupop > .ab-item:before,\n#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {\n\tposition: absolute;\n\tfont: normal 17px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#wpadminbar .menupop .menupop > .ab-item {\n\tdisplay: block;\n\tpadding-right: 2em;\n}\n\n#wpadminbar .menupop .menupop > .ab-item:before {\n\ttop: 1px;\n\tright: 4px;\n\tcontent: \"\\f139\";\n\tcolor: inherit;\n}\n\n#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item {\n\tpadding-left: 2em;\n\tpadding-right: 1em;\n}\n\n#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {\n\ttop: 1px;\n\tleft: 6px;\n\tcontent: \"\\f141\";\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary {\n\tdisplay: block;\n\tposition: relative;\n\tright: auto;\n\tmargin: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,\n#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu {\n\tbackground: #464b50;\n}\n\n#wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover,\n#wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar .quicklinks a span#ab-updates {\n\tbackground: #eee;\n\tcolor: #32373c;\n\tdisplay: inline;\n\tpadding: 2px 5px;\n\tfont-size: 10px;\n\tfont-weight: bold;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n}\n\n#wpadminbar .quicklinks a:hover span#ab-updates  {\n\tbackground: #fff;\n\tcolor: #000;\n}\n\n#wpadminbar .ab-top-secondary {\n\tfloat: right;\n}\n\n#wpadminbar ul li:last-child,\n#wpadminbar ul li:last-child .ab-item {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n/**\n * My Account\n */\n#wp-admin-bar-my-account > ul {\n\tmin-width: 198px;\n}\n\n#wp-admin-bar-my-account > .ab-item:before {\n\tcontent: \"\\f110\";\n\ttop: 2px;\n\tfloat: right;\n\tmargin-left: 6px;\n\tmargin-right: 0;\n}\n\n#wp-admin-bar-my-account.with-avatar > .ab-item:before {\n\tdisplay: none;\n\tcontent: none;\n}\n\n#wp-admin-bar-my-account.with-avatar > ul {\n\tmin-width: 270px;\n}\n\n#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item {\n\twhite-space: nowrap;\n}\n\n#wpadminbar #wp-admin-bar-user-actions > li {\n\tmargin-left: 16px;\n\tmargin-right: 16px;\n}\n\n#wpadminbar #wp-admin-bar-user-actions.ab-submenu {\n\tpadding: 6px 0 12px;\n}\n\n#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li {\n\tmargin-left: 88px;\n}\n\n#wpadminbar #wp-admin-bar-user-info {\n\tmargin-top: 6px;\n\tmargin-bottom: 15px;\n\theight: auto;\n\tbackground: none;\n}\n\n#wp-admin-bar-user-info .avatar {\n\tposition: absolute;\n\tleft: -72px;\n\ttop: 4px;\n\twidth: 64px;\n\theight: 64px;\n}\n\n#wpadminbar #wp-admin-bar-user-info a {\n\tbackground: none;\n\theight: auto;\n}\n\n#wpadminbar #wp-admin-bar-user-info span {\n\tbackground: none;\n\tpadding: 0;\n\theight: 18px;\n}\n\n#wpadminbar #wp-admin-bar-user-info .display-name,\n#wpadminbar #wp-admin-bar-user-info .username {\n\tdisplay: block;\n}\n\n#wpadminbar #wp-admin-bar-user-info .username {\n\tcolor: #999;\n\tfont-size: 11px;\n}\n\n#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,\n#wpadminbar #wp-admin-bar-my-account.with-avatar > a img {\n\twidth: auto;\n\theight: 16px;\n\tpadding: 0;\n\tborder: 1px solid #82878c;\n\tbackground: #eee;\n\tline-height: 24px;\n\tvertical-align: middle;\n\tmargin: -4px 0 0 6px;\n\tfloat: none;\n\tdisplay: inline;\n}\n\n#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > .ab-empty-item img,\n#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > a img {\n\twidth: auto;\n}\n\n/**\n * WP Logo\n */\n#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon {\n\twidth: 15px;\n\theight: 20px;\n\tmargin-right: 0;\n\tpadding: 6px 0 5px;\n}\n\n#wpadminbar #wp-admin-bar-wp-logo > .ab-item {\n\tpadding: 0 7px;\n}\n\n#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before {\n\tcontent: \"\\f120\";\n\ttop: 2px;\n}\n\n/*\n * My Sites & Site Title\n */\n#wpadminbar .quicklinks li .blavatar {\n\tfloat: left;\n\tfont: normal 16px/1 dashicons !important;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcolor: #eee;\n}\n\n#wpadminbar .quicklinks li a:hover .blavatar,\n#wpadminbar .quicklinks li a:focus .blavatar,\n#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar {\n\tcolor: #00b9eb;\n}\n\n#wpadminbar .quicklinks li .blavatar:before {\n\tcontent: \"\\f120\";\n\theight: 16px;\n\twidth: 16px;\n\tdisplay: inline-block;\n\tmargin: 6px 8px 0 -2px;\n}\n\n#wpadminbar #wp-admin-bar-appearance {\n\tmargin-top: -12px;\n}\n\n#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,\n#wpadminbar #wp-admin-bar-site-name > .ab-item:before {\n\tcontent: \"\\f112\";\n\ttop: 2px;\n}\n\n#wpadminbar #wp-admin-bar-customize > .ab-item:before {\n\tcontent: \"\\f540\";\n\ttop: 2px;\n}\n\n\n#wpadminbar #wp-admin-bar-edit > .ab-item:before {\n\tcontent: \"\\f464\";\n\ttop: 2px;\n}\n\n#wpadminbar #wp-admin-bar-site-name > .ab-item:before {\n\tcontent: \"\\f226\";\n}\n\n.wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before {\n\tcontent: \"\\f102\";\n}\n\n\n\n/**\n * Comments\n */\n#wpadminbar #wp-admin-bar-comments .ab-icon {\n\tmargin-right: 6px;\n}\n\n#wpadminbar #wp-admin-bar-comments .ab-icon:before {\n\tcontent: \"\\f101\";\n\ttop: 3px;\n}\n\n#wpadminbar #wp-admin-bar-comments .count-0 {\n\topacity: .5;\n}\n\n/**\n * New Content\n */\n#wpadminbar #wp-admin-bar-new-content .ab-icon:before {\n\tcontent: \"\\f132\";\n\ttop: 4px;\n}\n\n/**\n * Updates\n */\n#wpadminbar #wp-admin-bar-updates .ab-icon:before {\n\tcontent: \"\\f463\";\n\ttop: 2px;\n}\n\n/**\n * Search\n */\n#wpadminbar.ie8 #wp-admin-bar-search {\n\tdisplay: block;\n\tmin-width: 32px;\n}\n#wpadminbar #wp-admin-bar-search .ab-item {\n\tpadding: 0;\n\tbackground: transparent;\n}\n\n#wpadminbar #adminbarsearch {\n\tposition: relative;\n\theight: 32px;\n\tpadding: 0 2px;\n\tz-index: 1;\n}\n\n#wpadminbar #adminbarsearch:before {\n\tposition: absolute;\n\ttop: 6px;\n\tleft: 5px;\n\tz-index: 20;\n\tfont: normal 20px/1 dashicons !important;\n\tcontent: \"\\f179\";\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input {\n\tposition: relative;\n\tz-index: 30;\n\tfont: 13px/24px \"Open Sans\", sans-serif;\n\theight: 24px;\n\twidth: 24px;\n\tmax-width: none;\n\tpadding: 0 3px 0 24px;\n\tmargin: 0;\n\tcolor: #ccc;\n\tbackground-color: rgba( 255, 255, 255, 0 );\n\tborder: none;\n\toutline: none;\n\tcursor: pointer;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\t-webkit-transition-duration: 400ms;\n\ttransition-duration: 400ms;\n\t-webkit-transition-property: width, background;\n\ttransition-property: width, background;\n\t-webkit-transition-timing-function: ease;\n\ttransition-timing-function: ease;\n}\n\n#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n\tz-index: 10;\n\tcolor: #000;\n\twidth: 200px;\n\tbackground-color: rgba( 255, 255, 255, 0.9 );\n\tcursor: text;\n\tborder: 0;\n}\n\n#wpadminbar.ie7 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input {\n\tmargin-top: 3px;\n\twidth: 120px;\n}\n\n#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input {\n\t/* IE8 z-index bug with transparent / empty elements - fill in with an encoded transparent GIF */\n\tbackground: transparent 0 0 repeat scroll url(\"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBR‌​AA7\");\n}\n\n/* IE8 doesn't redraw the pseudo elements unless you make a change to the content */\n#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before {\n\tcontent: \"\\f179 \"; /* extra space */\n}\n\n#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus {\n\tbackground: #fff;\n\tz-index: -1;\n}\n\n#wpadminbar #adminbarsearch .adminbar-input::-webkit-input-placeholder {\n\tcolor: #999;\n}\n#wpadminbar #adminbarsearch .adminbar-input:-moz-placeholder {\n\tcolor: #999;\n}\n#wpadminbar #adminbarsearch .adminbar-input::-moz-placeholder {\n\tcolor: #999;\n}\n#wpadminbar #adminbarsearch .adminbar-input:-ms-input-placeholder {\n\tcolor: #999;\n}\n\n#wpadminbar #adminbarsearch .adminbar-button {\n\tdisplay: none;\n}\n\n/**\n * Customize support classes\n */\n.no-customize-support .hide-if-no-customize,\n.customize-support .hide-if-customize,\n.no-customize-support #wpadminbar .hide-if-no-customize,\n.no-customize-support.wp-core-ui .hide-if-no-customize,\n.no-customize-support .wp-core-ui .hide-if-no-customize,\n.customize-support #wpadminbar .hide-if-customize,\n.customize-support.wp-core-ui .hide-if-customize,\n.customize-support .wp-core-ui .hide-if-customize {\n\tdisplay: none;\n}\n\n/* Skip link */\n#wpadminbar .screen-reader-text,\n#wpadminbar .screen-reader-text span {\n\tposition: absolute;\n\tleft: -1000em;\n\ttop: -1000em;\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n}\n\n#wpadminbar .screen-reader-shortcut {\n\tposition: absolute;\n\ttop: -1000em;\n}\n\n#wpadminbar .screen-reader-shortcut:focus {\n\tleft: 6px;\n\ttop: 7px;\n\theight: auto;\n\twidth: auto;\n\tdisplay: block;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\tpadding: 15px 23px 14px;\n\tbackground: #f1f1f1;\n\tcolor: #0073aa;\n\tz-index: 100000;\n\tline-height: normal;\n\ttext-decoration: none;\n\t-webkit-box-shadow: 0 0 2px 2px rgba(0,0,0,.6);\n\tbox-shadow: 0 0 2px 2px rgba(0,0,0,.6);\n}\n\n/**\n * IE 6-targeted rules\n */\n* html #wpadminbar {\n\toverflow: hidden;\n\tposition: absolute;\n}\n\n* html #wpadminbar .quicklinks ul li a {\n\tfloat: left;\n}\n\n* html #wpadminbar .menupop a span {\n\tbackground-image: none;\n}\n\n/* No @font-face support */\n.no-font-face #wpadminbar ul.ab-top-menu > li > a.ab-item {\n\tdisplay: block;\n\twidth: 45px;\n\ttext-align: center;\n\toverflow: hidden;\n\tmargin: 0 3px;\n}\n\n.no-font-face #wpadminbar #wp-admin-bar-my-sites > .ab-item,\n.no-font-face #wpadminbar #wp-admin-bar-site-name > .ab-item,\n.no-font-face #wpadminbar #wp-admin-bar-edit > .ab-item {\n\ttext-indent: 0;\n}\n\n.no-font-face #wpadminbar .ab-icon,\n.no-font-face #wpadminbar .ab-icon:before,\n.no-font-face #wpadminbar a.ab-item:before,\n.no-font-face #wpadminbar #wp-admin-bar-wp-logo > .ab-item {\n\tdisplay: none !important;\n}\n\n.no-font-face #wpadminbar ul.ab-top-menu > li > a > span.ab-label {\n\tdisplay: inline;\n}\n\n.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon {\n\tdisplay: inline !important;\n}\n\n.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before {\n\tcontent: \"Menu\";\n\tfont: 14px/45px sans-serif !important;\n\tdisplay: inline-block !important;\n\tcolor: #fff;\n}\n\n.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item {\n\tcolor: #fff;\n}\n/* End no @font-face */\n\n@media screen and ( max-width: 782px ) {\n\t/* Toolbar Touchification*/\n\thtml #wpadminbar {\n\t\theight: 46px;\n\t\tmin-width: 300px;\n\n\t/*\tThese rules break dropdown tappability on Chrome/Android.\n\t\t-webkit-transform: translate3d(0, 0, 0);\n\t\t-webkit-backface-visibility: hidden;\n\t\t-webkit-transition: 0;\n\t\ttransform: translate3d(0, 0, 0);\n\t\tbackface-visibility: hidden;\n\t\ttransition: 0;\n\t*/\n\t}\n\n\t#wpadminbar * {\n\t\tfont: normal 14px/32px \"Open Sans\", sans-serif;\n\t}\n\n\t#wpadminbar .quicklinks > ul > li > a,\n\t#wpadminbar .quicklinks .ab-empty-item {\n\t\tpadding: 0;\n\t\theight: 46px;\n\t\tline-height: 46px;\n\t\twidth: auto;\n\t}\n\n\t#wpadminbar .ab-icon {\n\t\tfont: 40px/1 dashicons !important;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\twidth: 52px;\n\t\theight: 46px;\n\t\ttext-align: center;\n\t}\n\n\t#wpadminbar .ab-icon:before {\n\t\ttext-align: center;\n\t}\n\n\t#wpadminbar .ab-submenu {\n\t\tpadding: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-site-name a.ab-item,\n\t#wpadminbar #wp-admin-bar-my-sites a.ab-item,\n\t#wpadminbar #wp-admin-bar-my-account a.ab-item {\n\t\ttext-overflow: clip;\n\t}\n\n\t#wpadminbar .ab-label {\n\t\tdisplay: none;\n\t}\n\n\t#wpadminbar .menupop li:hover > .ab-sub-wrapper,\n\t#wpadminbar .menupop li.hover > .ab-sub-wrapper {\n\t\tmargin-top: -46px;\n\t}\n\n\t#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item {\n\t\tpadding-right: 30px;\n\t}\n\n\t#wpadminbar .menupop .menupop > .ab-item:before {\n\t\ttop: 10px;\n\t\tright: 6px;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item {\n\t\tfont-size: 16px;\n\t\tpadding: 8px 16px;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty {\n\t\tdisplay: none;\n\t}\n\n\t/* WP logo */\n\t#wpadminbar #wp-admin-bar-wp-logo > .ab-item {\n\t\tpadding: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon {\n\t\tpadding: 0;\n\t\twidth: 52px;\n\t\theight: 46px;\n\t\ttext-align: center;\n\t\tvertical-align: top;\n\t}\n\n\t#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before {\n\t\tfont: 28px/1 dashicons !important;\n\t\ttop: -3px;\n\t}\n\n\t#wpadminbar .ab-icon,\n\t#wpadminbar .ab-item:before {\n\t\tpadding: 0;\n\t}\n\n\t/* My Sites and \"Site Title\" menu */\n\t#wpadminbar #wp-admin-bar-my-sites > .ab-item,\n\t#wpadminbar #wp-admin-bar-site-name > .ab-item,\n\t#wpadminbar #wp-admin-bar-customize > .ab-item,\n\t#wpadminbar #wp-admin-bar-edit > .ab-item,\n\t#wpadminbar #wp-admin-bar-my-account > .ab-item {\n\t\ttext-indent: 100%;\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\twidth: 52px;\n\t\tpadding: 0;\n\t\tcolor: #999;\n\t\tposition: relative;\n\t}\n\n\t#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon,\n\t#wpadminbar .ab-icon,\n\t#wpadminbar .ab-item:before {\n\t\tpadding: 0;\n\t\tmargin-right: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-edit > .ab-item:before,\n\t#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,\n\t#wpadminbar #wp-admin-bar-site-name > .ab-item:before,\n\t#wpadminbar #wp-admin-bar-customize > .ab-item:before,\n\t#wpadminbar #wp-admin-bar-my-account > .ab-item:before {\n\t\tdisplay: block;\n\t\ttext-indent: 0;\n\t\tfont: normal 32px/1 dashicons;\n\t\tspeak: none;\n\t\ttop: 7px;\n\t\twidth: 52px;\n\t\ttext-align: center;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-moz-osx-font-smoothing: grayscale;\n\t}\n\n\t#wpadminbar #wp-admin-bar-appearance {\n\t\tmargin-top: 0;\n\t}\n\n\t#wpadminbar .quicklinks li .blavatar:before {\n\t\tdisplay: none;\n\t}\n\n\t/* Search */\n\t#wpadminbar #wp-admin-bar-search {\n\t\tdisplay: none;\n\t}\n\n\t/* New Content */\n\t#wpadminbar #wp-admin-bar-new-content .ab-icon:before {\n\t\ttop: 0;\n\t\tline-height: 53px;\n\t\theight: 46px !important;\n\t\ttext-align: center;\n\t\twidth: 52px;\n\t\tdisplay: block;\n\t}\n\n\t/* Updates */\n\t#wpadminbar #wp-admin-bar-updates {\n\t\ttext-align: center;\n\t}\n\n\t#wpadminbar #wp-admin-bar-updates .ab-icon:before {\n\t\ttop: 3px;\n\t}\n\n\t/* Comments */\n\t#wpadminbar #wp-admin-bar-comments .ab-icon {\n\t\tmargin: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-comments .ab-icon:before {\n\t\tdisplay: block;\n\t\tfont-size: 34px;\n\t\theight: 46px;\n\t\tline-height: 47px;\n\t\ttop: 0;\n\t}\n\n\t/* My Account */\n\t#wpadminbar #wp-admin-bar-my-account > a {\n\t\tposition: relative;\n\t\twhite-space: nowrap;\n\t\ttext-indent: 150%; /* More than 100% indention is needed since this element has padding */\n\t\twidth: 28px;\n\t\tpadding: 0 10px;\n\t\toverflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */\n\t}\n\n\t#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img {\n\t\tposition: absolute;\n\t\ttop: 13px;\n\t\tright: 10px;\n\t\twidth: 26px;\n\t\theight: 26px;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-actions.ab-submenu {\n\t\tpadding: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar {\n\t\tdisplay: none;\n\t}\n\n\t#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li {\n\t\tmargin: 0;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-info .display-name {\n\t\theight: auto;\n\t\tfont-size: 16px;\n\t\tline-height: 24px;\n\t\tcolor: #eee;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-info a {\n\t\tpadding-top: 4px;\n\t}\n\n\t#wpadminbar #wp-admin-bar-user-info .username {\n\t\tline-height: 0.8 !important;\n\t\tmargin-bottom: -2px;\n\t}\n\n\t/* Show only default top level items */\n\t#wp-toolbar > ul > li {\n\t\tdisplay: none;\n\t}\n\n\t#wpadminbar li#wp-admin-bar-menu-toggle,\n\t#wpadminbar li#wp-admin-bar-wp-logo,\n\t#wpadminbar li#wp-admin-bar-my-sites,\n\t#wpadminbar li#wp-admin-bar-updates,\n\t#wpadminbar li#wp-admin-bar-site-name,\n\t#wpadminbar li#wp-admin-bar-customize,\n\t#wpadminbar li#wp-admin-bar-new-content,\n\t#wpadminbar li#wp-admin-bar-edit,\n\t#wpadminbar li#wp-admin-bar-comments,\n\t#wpadminbar li#wp-admin-bar-my-account {\n\t\tdisplay: block;\n\t}\n\n\t/* Allow dropdown list items to appear normally */\n\t#wpadminbar li:hover ul li,\n\t#wpadminbar li.hover ul li,\n\t#wpadminbar li:hover ul li:hover ul li {\n\t\tdisplay: list-item;\n\t}\n\n\t/* Override default min-width so dropdown lists aren't stretched\n\t\tto 100% viewport width at responsive sizes. */\n\t#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {\n\t\tmin-width: -webkit-fit-content;\n\t\tmin-width: -moz-fit-content;\n\t\tmin-width: fit-content;\n\t}\n\n\t#wpadminbar ul#wp-admin-bar-root-default > li {\n\t\tmargin-right: 0;\n\t}\n\n\t/* Experimental fix for touch toolbar dropdown positioning */\n\t#wpadminbar .ab-top-menu,\n\t#wpadminbar .ab-top-secondary,\n\t#wpadminbar #wp-admin-bar-wp-logo,\n\t#wpadminbar #wp-admin-bar-my-sites,\n\t#wpadminbar #wp-admin-bar-site-name,\n\t#wpadminbar #wp-admin-bar-updates,\n\t#wpadminbar #wp-admin-bar-comments,\n\t#wpadminbar #wp-admin-bar-new-content,\n\t#wpadminbar #wp-admin-bar-edit,\n\t#wpadminbar #wp-admin-bar-my-account {\n\t\tposition: static;\n\t}\n\n\t#wpadminbar #wp-admin-bar-my-account {\n\t\tfloat: right;\n\t}\n\n\t.network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account {\n\t\tmargin-right: 0;\n\t}\n\n\t/* Realign arrows on taller responsive submenus */\n\n\t#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before {\n\t\ttop: 10px;\n\t\tleft: 0;\n\t}\n}\n\n/* Smartphone */\n@media screen and (max-width: 600px) {\n\t#wpadminbar {\n\t\tposition: absolute;\n\t}\n\n\t#wp-responsive-overlay {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tz-index: 400;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper {\n\t\twidth: 100%;\n\t\tleft: 0;\n\t}\n\n\t#wpadminbar .menupop .menupop > .ab-item:before {\n\t\tdisplay: none;\n\t}\n\n\t#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper {\n\t\tmargin-left: 0;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper {\n\t\tmargin: 0;\n\t\twidth: 100%;\n\t\ttop: auto;\n\t\tleft: auto;\n\t\tposition: relative;\n\t}\n\n\t#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item {\n\t\tfont-size: 16px;\n\t\tpadding: 6px 15px 19px 30px;\n\t}\n\n\t#wpadminbar li:hover ul li ul li {\n\t\tdisplay: list-item;\n\t}\n\n\t#wpadminbar li#wp-admin-bar-wp-logo,\n\t#wpadminbar li#wp-admin-bar-updates {\n\t\tdisplay: none;\n\t}\n\n\t/* Make submenus full-width at this size */\n\n\t#wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper {\n\t\tposition: static;\n\t\t-webkit-box-shadow: none;\n\t\tbox-shadow: none;\n\t}\n}\n\n/* Very narrow screens */\n@media screen and (max-width: 400px) {\n\t#wpadminbar li#wp-admin-bar-comments {\n\t\tdisplay: none;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/buttons-rtl.css",
    "content": "/* ----------------------------------------------------------------------------\n\nNOTE: If you edit this file, you should make sure that the CSS rules for\nbuttons in the following files are updated.\n\n* jquery-ui-dialog.css\n* editor.css\n\nWordPress-style Buttons\n=======================\nCreate a button by adding the `.button` class to an element. For backwards\ncompatibility, we support several other classes (such as `.button-secondary`),\nbut these will *not* work with the stackable classes described below.\n\nButton Styles\n-------------\nTo display a primary button style, add the `.button-primary` class to a button.\n\nButton Sizes\n------------\nAdjust a button's size by adding the `.button-large` or `.button-small` class.\n\nButton States\n-------------\nLock the state of a button by adding the name of the pseudoclass as\nan actual class (e.g. `.hover` for `:hover`).\n\n\nTABLE OF CONTENTS:\n------------------\n 1.0 - Button Layouts\n 2.0 - Default Button Style\n 3.0 - Primary Button Style\n 4.0 - Button Groups\n 5.0 - Responsive Button Styles\n\n---------------------------------------------------------------------------- */\n\n/* ----------------------------------------------------------------------------\n  1.0 - Button Layouts\n---------------------------------------------------------------------------- */\n\n.wp-core-ui .button,\n.wp-core-ui .button-primary,\n.wp-core-ui .button-secondary {\n\tdisplay: inline-block;\n\ttext-decoration: none;\n\tfont-size: 13px;\n\tline-height: 26px;\n\theight: 28px;\n\tmargin: 0;\n\tpadding: 0 10px 1px;\n\tcursor: pointer;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\twhite-space: nowrap;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n/* Remove the dotted border on :focus and the extra padding in Firefox */\n.wp-core-ui button::-moz-focus-inner,\n.wp-core-ui input[type=\"reset\"]::-moz-focus-inner,\n.wp-core-ui input[type=\"button\"]::-moz-focus-inner,\n.wp-core-ui input[type=\"submit\"]::-moz-focus-inner {\n\tborder-width: 0;\n\tborder-style: none;\n\tpadding: 0;\n}\n\n.wp-core-ui .button.button-large,\n.wp-core-ui .button-group.button-large .button {\n\theight: 30px;\n    line-height: 28px;\n    padding: 0 12px 2px;\n}\n\n.wp-core-ui .button.button-small,\n.wp-core-ui .button-group.button-small .button {\n\theight: 24px;\n\tline-height: 22px;\n\tpadding: 0 8px 1px;\n\tfont-size: 11px;\n}\n\n.wp-core-ui .button.button-hero,\n.wp-core-ui .button-group.button-hero .button {\n\tfont-size: 14px;\n\theight: 46px;\n\tline-height: 44px;\n\tpadding: 0 36px;\n}\n\n.wp-core-ui .button:active,\n.wp-core-ui .button:focus {\n\toutline: none;\n}\n\n.wp-core-ui .button.hidden {\n\tdisplay: none;\n}\n\n/* Style Reset buttons as simple text links */\n\n.wp-core-ui input[type=\"reset\"],\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active,\n.wp-core-ui input[type=\"reset\"]:focus {\n\tbackground: none;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tpadding: 0 2px 1px;\n\twidth: auto;\n}\n\n/* ----------------------------------------------------------------------------\n  2.0 - Default Button Style\n---------------------------------------------------------------------------- */\n\n.wp-core-ui .button,\n.wp-core-ui .button-secondary {\n\tcolor: #555;\n\tborder-color: #cccccc;\n\tbackground: #f7f7f7;\n\t-webkit-box-shadow: 0 1px 0 #cccccc;\n\tbox-shadow: 0 1px 0 #cccccc;\n \tvertical-align: top;\n}\n\n.wp-core-ui p .button {\n\tvertical-align: baseline;\n}\n\n.wp-core-ui .button.hover,\n.wp-core-ui .button:hover,\n.wp-core-ui .button-secondary:hover,\n.wp-core-ui .button.focus,\n.wp-core-ui .button:focus,\n.wp-core-ui .button-secondary:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.wp-core-ui .button.focus,\n.wp-core-ui .button:focus,\n.wp-core-ui .button-secondary:focus,\n.wp-core-ui .button-link:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n\tbox-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n}\n\n.wp-core-ui .button.active,\n.wp-core-ui .button.active:hover,\n.wp-core-ui .button:active,\n.wp-core-ui .button-secondary:active {\n\tbackground: #eee;\n\tborder-color: #999;\n \t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n \tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n \t-webkit-transform: translateY(1px);\n \t-ms-transform: translateY(1px);\n \ttransform: translateY(1px);\n}\n\n.wp-core-ui .button.active:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow:\n\t\tinset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ),\n\t\t0 0 3px rgba( 0, 115, 170, .8 );\n\tbox-shadow:\n\t\tinset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ),\n\t\t0 0 3px rgba( 0, 115, 170, .8 );\n}\n\n.wp-core-ui .button[disabled],\n.wp-core-ui .button:disabled,\n.wp-core-ui .button.disabled,\n.wp-core-ui .button-secondary[disabled],\n.wp-core-ui .button-secondary:disabled,\n.wp-core-ui .button-secondary.disabled,\n.wp-core-ui .button-disabled {\n\tcolor: #a0a5aa !important;\n\tborder-color: #ddd !important;\n\tbackground: #f7f7f7 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n\ttext-shadow: 0 1px 0 #fff !important;\n\tcursor: default;\n\t-webkit-transform: none !important;\n\t-ms-transform: none !important;\n\ttransform: none !important;\n}\n\n/* Buttons that look like links, for a cross of good semantics with the visual */\n.wp-core-ui .button-link {\n\tmargin: 0;\n\tpadding: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tbackground: none;\n\toutline: none;\n\tcursor: pointer;\n}\n\n.wp-core-ui .button-link:focus {\n\toutline: #5b9dd9 solid 1px;\n}\n\n/* ----------------------------------------------------------------------------\n  3.0 - Primary Button Style\n---------------------------------------------------------------------------- */\n\n.wp-core-ui .button-primary {\n\tbackground: #0085ba;\n\tborder-color: #0073aa #006799 #006799;\n\t-webkit-box-shadow: 0 1px 0 #006799;\n \tbox-shadow: 0 1px 0 #006799;\n \tcolor: #fff;\n\ttext-decoration: none;\n\ttext-shadow: 0 -1px 1px #006799,\n\t\t-1px 0 1px #006799,\n\t\t0 1px 1px #006799,\n\t\t1px 0 1px #006799;\n}\n\n.wp-core-ui .button-primary.hover,\n.wp-core-ui .button-primary:hover,\n.wp-core-ui .button-primary.focus,\n.wp-core-ui .button-primary:focus {\n\tbackground: #008ec2;\n\tborder-color: #006799;\n\tcolor: #fff;\n}\n\n.wp-core-ui .button-primary.focus,\n.wp-core-ui .button-primary:focus {\n\t-webkit-box-shadow: 0 1px 0 #0073aa,\n\t\t0 0 2px 1px #33b3db;\n\tbox-shadow: 0 1px 0 #0073aa,\n\t\t0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary.active,\n.wp-core-ui .button-primary.active:hover,\n.wp-core-ui .button-primary.active:focus,\n.wp-core-ui .button-primary:active {\n\tbackground: #0073aa;\n\tborder-color: #006799;\n \t-webkit-box-shadow: inset 0 2px 0 #006799;\n \tbox-shadow: inset 0 2px 0 #006799;\n \tvertical-align: top;\n}\n\n.wp-core-ui .button-primary[disabled],\n.wp-core-ui .button-primary:disabled,\n.wp-core-ui .button-primary-disabled,\n.wp-core-ui .button-primary.disabled {\n\tcolor: #66c6e4 !important;\n\tbackground: #008ec2 !important;\n\tborder-color: #007cb2 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n\ttext-shadow: 0 -1px 0 rgba( 0, 0, 0, 0.1 ) !important;\n\tcursor: default;\n}\n\n.wp-core-ui .button.button-primary.button-hero {\n\t-webkit-box-shadow: 0 2px 0 #006799;\n \tbox-shadow: 0 2px 0 #006799;\n}\n\n.wp-core-ui .button.button-primary.button-hero.active,\n.wp-core-ui .button.button-primary.button-hero.active:hover,\n.wp-core-ui .button.button-primary.button-hero.active:focus,\n.wp-core-ui .button.button-primary.button-hero:active {\n\t-webkit-box-shadow: inset 0 3px 0 #006799;\n \tbox-shadow: inset 0 3px 0 #006799;\n}\n\n/* ----------------------------------------------------------------------------\n  4.0 - Button Groups\n---------------------------------------------------------------------------- */\n\n.wp-core-ui .button-group {\n\tposition: relative;\n\tdisplay: inline-block;\n\twhite-space: nowrap;\n\tfont-size: 0;\n\tvertical-align: middle;\n}\n\n.wp-core-ui .button-group > .button {\n\tdisplay: inline-block;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tmargin-left: -1px;\n\tz-index: 10;\n}\n\n.wp-core-ui .button-group > .button-primary {\n\tz-index: 100;\n}\n\n.wp-core-ui .button-group > .button:hover {\n\tz-index: 20;\n}\n\n.wp-core-ui .button-group > .button:first-child {\n\t-webkit-border-radius: 0 3px 3px 0;\n\tborder-radius: 0 3px 3px 0;\n}\n\n.wp-core-ui .button-group > .button:last-child {\n\t-webkit-border-radius: 3px 0 0 3px;\n\tborder-radius: 3px 0 0 3px;\n}\n\n.wp-core-ui .button-group > .button:focus {\n\tposition: relative;\n\tz-index: 1;\n}\n\n/* ----------------------------------------------------------------------------\n  5.0 - Responsive Button Styles\n---------------------------------------------------------------------------- */\n\n@media screen and ( max-width: 782px ) {\n\n\t.wp-core-ui .button,\n\t.wp-core-ui .button.button-large,\n\t.wp-core-ui .button.button-small,\n\tinput#publish,\n\tinput#save-post,\n\ta.preview {\n\t\tpadding: 6px 14px;\n\t\tline-height: normal;\n\t\tfont-size: 14px;\n\t\tvertical-align: middle;\n\t\theight: auto;\n\t\tmargin-bottom: 4px;\n\t}\n\n\t#media-upload.wp-core-ui .button {\n\t\tpadding: 0 10px 1px;\n\t\theight: 24px;\n\t\tline-height: 22px;\n\t\tfont-size: 13px;\n\t}\n\n\t.media-frame.mode-grid .bulk-select .button {\n\t\tmargin-bottom: 0;\n\t}\n\n\t/* Publish Metabox Options */\n\t.wp-core-ui .save-post-status.button {\n\t\tposition: relative;\n\t\tmargin: 0 10px 0 14px; /* 14px right margin to match all other buttons */\n\t}\n\n\t/* Reset responsive styles in Press This, Customizer */\n\n\t.wp-core-ui.wp-customizer .button {\n\t\tpadding: 0 10px 1px;\n\t\tfont-size: 13px;\n\t\tline-height: 26px;\n\t\theight: 28px;\n\t\tmargin: 0;\n\t\tvertical-align: inherit;\n\t}\n\n\t/* Reset responsive styles on Log in button on iframed login form */\n\n\t.interim-login .button.button-large {\n\t\theight: 30px;\n\t\tline-height: 28px;\n\t\tpadding: 0 12px 2px;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/buttons.css",
    "content": "/* ----------------------------------------------------------------------------\n\nNOTE: If you edit this file, you should make sure that the CSS rules for\nbuttons in the following files are updated.\n\n* jquery-ui-dialog.css\n* editor.css\n\nWordPress-style Buttons\n=======================\nCreate a button by adding the `.button` class to an element. For backwards\ncompatibility, we support several other classes (such as `.button-secondary`),\nbut these will *not* work with the stackable classes described below.\n\nButton Styles\n-------------\nTo display a primary button style, add the `.button-primary` class to a button.\n\nButton Sizes\n------------\nAdjust a button's size by adding the `.button-large` or `.button-small` class.\n\nButton States\n-------------\nLock the state of a button by adding the name of the pseudoclass as\nan actual class (e.g. `.hover` for `:hover`).\n\n\nTABLE OF CONTENTS:\n------------------\n 1.0 - Button Layouts\n 2.0 - Default Button Style\n 3.0 - Primary Button Style\n 4.0 - Button Groups\n 5.0 - Responsive Button Styles\n\n---------------------------------------------------------------------------- */\n\n/* ----------------------------------------------------------------------------\n  1.0 - Button Layouts\n---------------------------------------------------------------------------- */\n\n.wp-core-ui .button,\n.wp-core-ui .button-primary,\n.wp-core-ui .button-secondary {\n\tdisplay: inline-block;\n\ttext-decoration: none;\n\tfont-size: 13px;\n\tline-height: 26px;\n\theight: 28px;\n\tmargin: 0;\n\tpadding: 0 10px 1px;\n\tcursor: pointer;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\twhite-space: nowrap;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n/* Remove the dotted border on :focus and the extra padding in Firefox */\n.wp-core-ui button::-moz-focus-inner,\n.wp-core-ui input[type=\"reset\"]::-moz-focus-inner,\n.wp-core-ui input[type=\"button\"]::-moz-focus-inner,\n.wp-core-ui input[type=\"submit\"]::-moz-focus-inner {\n\tborder-width: 0;\n\tborder-style: none;\n\tpadding: 0;\n}\n\n.wp-core-ui .button.button-large,\n.wp-core-ui .button-group.button-large .button {\n\theight: 30px;\n    line-height: 28px;\n    padding: 0 12px 2px;\n}\n\n.wp-core-ui .button.button-small,\n.wp-core-ui .button-group.button-small .button {\n\theight: 24px;\n\tline-height: 22px;\n\tpadding: 0 8px 1px;\n\tfont-size: 11px;\n}\n\n.wp-core-ui .button.button-hero,\n.wp-core-ui .button-group.button-hero .button {\n\tfont-size: 14px;\n\theight: 46px;\n\tline-height: 44px;\n\tpadding: 0 36px;\n}\n\n.wp-core-ui .button:active,\n.wp-core-ui .button:focus {\n\toutline: none;\n}\n\n.wp-core-ui .button.hidden {\n\tdisplay: none;\n}\n\n/* Style Reset buttons as simple text links */\n\n.wp-core-ui input[type=\"reset\"],\n.wp-core-ui input[type=\"reset\"]:hover,\n.wp-core-ui input[type=\"reset\"]:active,\n.wp-core-ui input[type=\"reset\"]:focus {\n\tbackground: none;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tpadding: 0 2px 1px;\n\twidth: auto;\n}\n\n/* ----------------------------------------------------------------------------\n  2.0 - Default Button Style\n---------------------------------------------------------------------------- */\n\n.wp-core-ui .button,\n.wp-core-ui .button-secondary {\n\tcolor: #555;\n\tborder-color: #cccccc;\n\tbackground: #f7f7f7;\n\t-webkit-box-shadow: 0 1px 0 #cccccc;\n\tbox-shadow: 0 1px 0 #cccccc;\n \tvertical-align: top;\n}\n\n.wp-core-ui p .button {\n\tvertical-align: baseline;\n}\n\n.wp-core-ui .button.hover,\n.wp-core-ui .button:hover,\n.wp-core-ui .button-secondary:hover,\n.wp-core-ui .button.focus,\n.wp-core-ui .button:focus,\n.wp-core-ui .button-secondary:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.wp-core-ui .button.focus,\n.wp-core-ui .button:focus,\n.wp-core-ui .button-secondary:focus,\n.wp-core-ui .button-link:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n\tbox-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n}\n\n.wp-core-ui .button.active,\n.wp-core-ui .button.active:hover,\n.wp-core-ui .button:active,\n.wp-core-ui .button-secondary:active {\n\tbackground: #eee;\n\tborder-color: #999;\n \t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n \tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n \t-webkit-transform: translateY(1px);\n \t-ms-transform: translateY(1px);\n \ttransform: translateY(1px);\n}\n\n.wp-core-ui .button.active:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow:\n\t\tinset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ),\n\t\t0 0 3px rgba( 0, 115, 170, .8 );\n\tbox-shadow:\n\t\tinset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ),\n\t\t0 0 3px rgba( 0, 115, 170, .8 );\n}\n\n.wp-core-ui .button[disabled],\n.wp-core-ui .button:disabled,\n.wp-core-ui .button.disabled,\n.wp-core-ui .button-secondary[disabled],\n.wp-core-ui .button-secondary:disabled,\n.wp-core-ui .button-secondary.disabled,\n.wp-core-ui .button-disabled {\n\tcolor: #a0a5aa !important;\n\tborder-color: #ddd !important;\n\tbackground: #f7f7f7 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n\ttext-shadow: 0 1px 0 #fff !important;\n\tcursor: default;\n\t-webkit-transform: none !important;\n\t-ms-transform: none !important;\n\ttransform: none !important;\n}\n\n/* Buttons that look like links, for a cross of good semantics with the visual */\n.wp-core-ui .button-link {\n\tmargin: 0;\n\tpadding: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder: 0;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tbackground: none;\n\toutline: none;\n\tcursor: pointer;\n}\n\n.wp-core-ui .button-link:focus {\n\toutline: #5b9dd9 solid 1px;\n}\n\n/* ----------------------------------------------------------------------------\n  3.0 - Primary Button Style\n---------------------------------------------------------------------------- */\n\n.wp-core-ui .button-primary {\n\tbackground: #0085ba;\n\tborder-color: #0073aa #006799 #006799;\n\t-webkit-box-shadow: 0 1px 0 #006799;\n \tbox-shadow: 0 1px 0 #006799;\n \tcolor: #fff;\n\ttext-decoration: none;\n\ttext-shadow: 0 -1px 1px #006799,\n\t\t1px 0 1px #006799,\n\t\t0 1px 1px #006799,\n\t\t-1px 0 1px #006799;\n}\n\n.wp-core-ui .button-primary.hover,\n.wp-core-ui .button-primary:hover,\n.wp-core-ui .button-primary.focus,\n.wp-core-ui .button-primary:focus {\n\tbackground: #008ec2;\n\tborder-color: #006799;\n\tcolor: #fff;\n}\n\n.wp-core-ui .button-primary.focus,\n.wp-core-ui .button-primary:focus {\n\t-webkit-box-shadow: 0 1px 0 #0073aa,\n\t\t0 0 2px 1px #33b3db;\n\tbox-shadow: 0 1px 0 #0073aa,\n\t\t0 0 2px 1px #33b3db;\n}\n\n.wp-core-ui .button-primary.active,\n.wp-core-ui .button-primary.active:hover,\n.wp-core-ui .button-primary.active:focus,\n.wp-core-ui .button-primary:active {\n\tbackground: #0073aa;\n\tborder-color: #006799;\n \t-webkit-box-shadow: inset 0 2px 0 #006799;\n \tbox-shadow: inset 0 2px 0 #006799;\n \tvertical-align: top;\n}\n\n.wp-core-ui .button-primary[disabled],\n.wp-core-ui .button-primary:disabled,\n.wp-core-ui .button-primary-disabled,\n.wp-core-ui .button-primary.disabled {\n\tcolor: #66c6e4 !important;\n\tbackground: #008ec2 !important;\n\tborder-color: #007cb2 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n\ttext-shadow: 0 -1px 0 rgba( 0, 0, 0, 0.1 ) !important;\n\tcursor: default;\n}\n\n.wp-core-ui .button.button-primary.button-hero {\n\t-webkit-box-shadow: 0 2px 0 #006799;\n \tbox-shadow: 0 2px 0 #006799;\n}\n\n.wp-core-ui .button.button-primary.button-hero.active,\n.wp-core-ui .button.button-primary.button-hero.active:hover,\n.wp-core-ui .button.button-primary.button-hero.active:focus,\n.wp-core-ui .button.button-primary.button-hero:active {\n\t-webkit-box-shadow: inset 0 3px 0 #006799;\n \tbox-shadow: inset 0 3px 0 #006799;\n}\n\n/* ----------------------------------------------------------------------------\n  4.0 - Button Groups\n---------------------------------------------------------------------------- */\n\n.wp-core-ui .button-group {\n\tposition: relative;\n\tdisplay: inline-block;\n\twhite-space: nowrap;\n\tfont-size: 0;\n\tvertical-align: middle;\n}\n\n.wp-core-ui .button-group > .button {\n\tdisplay: inline-block;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\tmargin-right: -1px;\n\tz-index: 10;\n}\n\n.wp-core-ui .button-group > .button-primary {\n\tz-index: 100;\n}\n\n.wp-core-ui .button-group > .button:hover {\n\tz-index: 20;\n}\n\n.wp-core-ui .button-group > .button:first-child {\n\t-webkit-border-radius: 3px 0 0 3px;\n\tborder-radius: 3px 0 0 3px;\n}\n\n.wp-core-ui .button-group > .button:last-child {\n\t-webkit-border-radius: 0 3px 3px 0;\n\tborder-radius: 0 3px 3px 0;\n}\n\n.wp-core-ui .button-group > .button:focus {\n\tposition: relative;\n\tz-index: 1;\n}\n\n/* ----------------------------------------------------------------------------\n  5.0 - Responsive Button Styles\n---------------------------------------------------------------------------- */\n\n@media screen and ( max-width: 782px ) {\n\n\t.wp-core-ui .button,\n\t.wp-core-ui .button.button-large,\n\t.wp-core-ui .button.button-small,\n\tinput#publish,\n\tinput#save-post,\n\ta.preview {\n\t\tpadding: 6px 14px;\n\t\tline-height: normal;\n\t\tfont-size: 14px;\n\t\tvertical-align: middle;\n\t\theight: auto;\n\t\tmargin-bottom: 4px;\n\t}\n\n\t#media-upload.wp-core-ui .button {\n\t\tpadding: 0 10px 1px;\n\t\theight: 24px;\n\t\tline-height: 22px;\n\t\tfont-size: 13px;\n\t}\n\n\t.media-frame.mode-grid .bulk-select .button {\n\t\tmargin-bottom: 0;\n\t}\n\n\t/* Publish Metabox Options */\n\t.wp-core-ui .save-post-status.button {\n\t\tposition: relative;\n\t\tmargin: 0 14px 0 10px; /* 14px right margin to match all other buttons */\n\t}\n\n\t/* Reset responsive styles in Press This, Customizer */\n\n\t.wp-core-ui.wp-customizer .button {\n\t\tpadding: 0 10px 1px;\n\t\tfont-size: 13px;\n\t\tline-height: 26px;\n\t\theight: 28px;\n\t\tmargin: 0;\n\t\tvertical-align: inherit;\n\t}\n\n\t/* Reset responsive styles on Log in button on iframed login form */\n\n\t.interim-login .button.button-large {\n\t\theight: 30px;\n\t\tline-height: 28px;\n\t\tpadding: 0 12px 2px;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/customize-preview.css",
    "content": ".customize-partial-refreshing {\n\topacity: 0.25;\n\t-webkit-transition: opacity 0.25s;\n\ttransition: opacity 0.25s;\n\tcursor: progress;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/dashicons.css",
    "content": "@font-face {\n\tfont-family: dashicons;\n\tsrc: url(../fonts/dashicons.eot);\n}\n\n@font-face {\n\tfont-family: dashicons;\n    src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAGW8AA4AAAAAo7wAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABRAAAABwAAAAcb+kWhkdERUYAAAFgAAAAHwAAACABMQAET1MvMgAAAYAAAABAAAAAYJYFachjbWFwAAABwAAAATwAAAKatulUimdhc3AAAAL8AAAACAAAAAgAAAAQZ2x5ZgAAAwQAAFl6AACLYEUhCQtoZWFkAABcgAAAAC4AAAA2Cpn6WGhoZWEAAFywAAAAGwAAACQPogitaG10eAAAXMwAAAEvAAAEENEK6Wlsb2NhAABd/AAAAgoAAAIKw8CgEm1heHAAAGAIAAAAHwAAACABVwCzbmFtZQAAYCgAAAGdAAADWi+oduNwb3N0AABhyAAAA+oAAAoztf4M13dlYmYAAGW0AAAABgAAAAYlmlWwAAAAAQAAAADMPaLPAAAAANHVnZ0AAAAA0dXWGXjaY2BkYGDgA2IJBhBgYmBkYGRkBpIsYB4DAAR3ADcAeNpjYGY/xTiBgZWBhVWEZQMDA8M0CM20h8GIKQLIB0phB6He4X4MDqp/vjqzXwDxgaQGkGJEUqLAwAgANkAKxHja3ZA7SwNREIXnJmtkuXfHBbFYsViQFNutTxJsVoMmARUxhSSFxEcTq9iI6dJY2FnY+Gvs1EYbUTBYq5U696GNui4JWNjbeGDOcGD4DgwApKE3I8ASB3acJNbNFttPdg0i6IPh7AfZNEgejVJAIU1Tngo0TyWq0gY1qEUHkklbejKQeRnJOWUrTwUqr8q6rNd0Vdd1Q7f0oT4xlrGNZwIzZnKmEMcACRvIpSHyKZuwxylHUcIuUoXqtEW71JYg09KVvgy7bKZc5atQRbqkV7rsTd3UbX1kwGSMa3wTmgkTxXGnf8DCL/zEd3zDV3zBZ3zCR3zAe7zFG7zCC1zGJSziLM7gFE46e07T2XG2nXVRFzVRFRWxKhbFgoh4h9/xa37Jz/kZP+396q/EMvBTwFKJpX4fwL/XN7iViiEAAQAB//8AD3jarL0HfBRl+jg+78zOzG7aZrMtbTfZbEvZ1G0hZRMg9NBCiwpIWXoxijQJqBgRlRIbNsSGiD0qchaOs52uHbmIp4ce6slx6p16x9eDJPv6e553dpMN4n3v+//8s5l533ln5p133vL05xlO5OCPnOYPcQIncRouhdNyXKXOphP0Nr1ZR2zJRKcnp3sepY9HHqU7yNRHI4/yh6JN5EbuZ9r9M6HRj7ifiYfy3M8c4RL+KjmO58JcVH5R6oE6/RynIcEQMZmtxGwVAkENkSVDHjEZ5DRelmBn5UMkGAiG+GCgCsqrguL+aP2urHW31pQ+OKWkblbLiprow9H6py2WpRZLzohFpmF236QKefTiSy/1FXhTm325lilwaopF2MS/tis31e6ybinLzLWlkpTow/xrT7OzUy05gdHplXbfpZcuHi1XTPQVNOlWDs9hdXKEeLiI1CiruQzoE1uVyagzSCWE6OwFLr/OFyCnhY6WNWtaIjQlAqmsXtMSbWpZQ1PI6TUt/KGWNfDaAvdvqOMT6Rj0ZRqrxyxriFtD/F6RQLfiJjXeuTS6Prp+Kf8j6YxE9/OtvZOEfNqm2nTnUv46Vk7bIndFH4k+xk+jWnKapkC9EW6XvFyu4TI5F1cH9ZrStSSNuEkDCfjcrgItIa4A5PM17FiSiWQwmwIyMUlaIuW7XekNJETMrLRK+semTXe2fLmUSM3NDQ0NzzSMp09ahrTccSVZ0Pctb8rLK2jNi36LSRnZY8UTdPeVyi10XmNjwzPSISy5o2WIlYjjm6GCxsZm+uTSL1vu3NQ7Ayq4MC+ft0a/Yemb5F52YtMmsnAT3GKhcxueaWzgOBXMjzC803JOz+VwRThHiM7nKiFum2wvkKD3TV5bVYCrMhmkApdPtOlYGvBWmXU26ND+Q9FQW/TwtbTt2oeLamuLhFNFtdHGIzfffORm4SA5DcnNi805tBv6VMkLHfyhotpIpLYo2gQ38M9i8RFV78nFeI9IzlJ5CX2AHXB8/5wQYEQ5HD7RZrTpvHyrcKr3gJDflxkhp0VDz3fhiGjA8f+GOyn9RTrFqblszo6z3k0COOvFIJHTiN0mY6Mb4EUDGuWETMQ8eugl0pQ90+XO6HvjIuHatVXfzqXt7Z72Vk97vSCRpiw8lU0PSbnKlXq366J32vo2TK0a1u5phQtJx5zTdC+cyYAz2fQlXII8zJk3pKjUxxk5G7RdUrkJPjxIXBnBgMOs4U0SLjQ2f2A1Sh3z6T+uiH419uitY/ltPt/82US1hv6ZZBNrUXXPbutUi9VqmWq1CD/P9/mil4+99egY3noFyZg/u9pD/0xPkrzVP0fzLJbYhZxAPMQjq6W9sP5LuFHK6NptAyNLvDi0JcSIA1lP7DiatdgzsPTiR348ssSvZEPul9W1RT3f4ViLhqLavswwZsOWYkt/hpw+T1mnqgvzvZNw0C21LbW7jBaLcRdkeBfm6AOJZdFPMcfAI9fJPSCPlFthlnIEhtEl4dIzy9CdKuhK4g6aAri6VIaDfPtvJrw6YlyT3vebH+mpAP0o8LafmH+EwqZxI/TSAwej1x706UeMG/HKxIM/0r8F3g6QUrjgn6yw6VWYbwaYb4dgvmVyFfDsgjJVOXGFBG8VTJQ0UXBCaiFpKntBGV8OnRMiXpVp5uSAJ0snCJJU0rAwtGhrWRpR6TJL/JtI+uV/2Kj1P7T3ywULv3jyJrf78g+vUHld9WPG1Ov1wWXzx5WueXSWnDVq6KQh9K8HtxxdcVbUuq2ZZltBSvLZtvc3KzA8LKuhPW6uHN7eLsnw3pJstPldbtkddLntOm8g6A6aA0G/zWgyB82yyezlqgI+V4FkkNWfZgfvOnpX6yLavaj1ru67gpmffmIeAiXTlhMPKxli/qSv6kxX15kuIX/ZdDgDl3yaGYQzrYtI0YJZUBLIiZXMWkCHduG1rF0RuUCeDDAWRoUzZQAWUbkFUbC5lemdURXwszZIDS+PGDGnjb619SX60S7aHRZyRlWumkP48pUTJqycIJe9TCn9eU6bv5E+l0e3RQRyI2lYNWdE9MSE6iBcgc8ihfJymMc6zgF9UKUyy2UwPyXZqyHeQIZDX+BwB60wRwNBu4bY0wTh1F1EN++x0ItL7/mx4BR9gD5wJPNVUvrE3fSH/lIym8w+krHh4PfS3k1tr7XMef022kY695OMPT0dsQLSSds2fXbfLA5hZQTeV1lLWbCai365mrh8lVlS5TvcARV7b1MVAUjlhx9bL1vZelkH6yVIWohvwwb6Ln2SvrthA//Qmr1r1uyF+evp2Uo8Qj6CNry4LxP2wpg9O3bsge0EXrQmuj8cDkN7UrkIrO3lMC+0AL3NMAZ5MENKYI4EuVquAVb7uPOsd5vOpocmeWNbHLIHoZ1OODfoGM6rEo7l5fAODvYOx4tqexwM5BKP8t+7otgCKzyCHca3IsLsiyaUHBp8BelEsBEDIapPoMATYX80xcKuCocBp3vieTgRyyJMBXwQlvYyGsE6mEqwxagEdxAWBqwSWApAMZyKUQy0GzLC3p6ecPwf6Ye+E3H6QchvWdP3ZMJpxCUcjPkReJYMvZyHuERv1wMt4WCjG/AJTpPZZS9QyS6HvUAOBIVTUVNZpOJW4ZRwqm9oSy1AsTBf2pbpLzxEX5k1i75yqNCf2SacIsW9B1Wra7EvwuzVor//823PyS/s3v2C/NxtCs6Th8trgBrUIQUDRBoiPhvQb4jOZOnO7RYLbek9oCo5YJ0S/SuftSN6apTcuh1oLDq5b4h4/ICF9N3MZ+6I/rWbA7oS/uA9jsBMsXOtsHKXcm1QlM6XEUe+Ko3w6RlWAjM3RGAOmzLSeZzGLigNMJrRJUv2AnfA4YWF55KMBqAgTWYTIA2geUIEAS+7wgWAUjLlEb2GhFRuOM9riIv3+4geb5ePLHjhJ/oBfZF+8NMLCyBPKslIUvnTC71vkJVk/I87dvxIn6U302cxR+rpB0sMaXrj1VNt+pVk3vt3EfNy3yyzKVsUqhry8+mPRpdabdAaDJun2pfYHQbITm0jzxNRUJs0ctLsj3qOk01v/49Q/PXqjYsWCSOURy04pwnijEEPHc8a0lsk+NW8t5wkkX2vrpwvjxtrGVpYpFHN2FJ3oqWF/wdRqwQ+6CPJEi8Qf5Co6ZFoLv+CnNXSctWQR//wJ7pNuLn31Hxy3bfP0neiO4utnBibs8thRslcMluxHK5FAhB70OYR1/VsVTX3nQC6hm18a3S/vPzMGXEdrInugQ1g4jTSKYtyGtAWJVCbz10GeDEj6E5TmRESBgPOXxYJ00dXPTEm6/37H5z33J4VVenZXz16+9x5wlPnK+WPbZ7Z4ErfSYZO/kv5lgPvnb3qD32trbvOV4jTS+ynJVVAeaVw6fiOeqC3bQQACdvgBTXEBsgsur93EvGounonqbqi+6P7hXyEGPLy3knR/eJxeME2BACYktMKHTVAp7oQBxZIlgGuwMtAQD8c0JFYuaq5ZfL1tBs5hRa+tWUNbggJusOQiut2jH2edhPPmhZyGstpG2wpAAz6y2DJMByHz9UAvNVBT2dxFi4f3wuf5oSHiIJXb7MLXhLfYJlqeCBYi2rPnKklL0TCAKbDkTDQQ/EdAvnTyrjWFp19mZdCRbVhfOzABnTtqb5MoYO20TZG/yjvH0YYRJwBIMfgVfNd6YwSF3Vp+MrKgS/Av6SaUFj7Hv38vfduGjO+rz0j0nETy1ZLuyNSQ0mk9x9wTAres/OrIn0dVz3O8kJtoT+BH9AyjmBo/E0Nkj0OXOH9uDh284Vkb/+5KqsqD9Z9lZU3fyGl+caM8Z39J+zFf/ds5Q8pCO4BIiYZLWU1LRUKbisaX+OzZ0mSKr26cXHbouHeZHl57DYfVnH2ZVwOQg9DfLRbnd0yafms2cOLGV4s4g95Rk2bNspkSilaNHEolBjjcyXC8KKeUYvntN8LeI7LD6S78qV08ThxeUIhz9l3cU9cQC130ptJ8zff0APfSI0hT+/80qamUtU9nlCk57tvlBP4DAmesaufb7LD+vMCzuUAdlp5QxoPsLOM94X4jBgNpjonjWNZKZYKOeQuUvPWVT7fVW/RN+hC+oaSl9tbW9tb+ezEJCqx5HcMt8jLh6965MUvX3xk1fB4JmpvZRck/Ec3s6StFu8BHruTnGb4M1nhpuI/aS/iSMSFAIUM8RzjfRUeTLnHjHfZ/ciCARPmDxrtRrvf7vcCPSHthcXV165qBpQNSDssGgCvh3scQkeEHUciyJ8jTyLtBTpKgYUwQn4btkPAVIF/XcDTYUY8HunLxJUCnCODMefcG4Ojyv2Y6jDfX4/QgY0ZWFODqmSMP/7/p3p1sbqLSCzP6sXaxHV97UijYI7VyirDimN1/tp7ZiW0D9b4L16TIPknrhPXwUzmNDweAVBcR1fQVRzhD8G546ou5Zx4HEsRhPKtsXOG+H2iAUuBFLuFbGfnDonHgT1m54Acg1K8Prr/P56TFZpXroH+yGO0pZdRlwx3QX8onKGSGm1GJInqCU5xMSGP/efU2WGvbLDqPGdfJsA0t5JO2PW1K8Qdf0hJSSf0cGeEb8V/qRG6Z1041NoaCrN9D/KEg3c9q3CgwygUi28IM/lh/HBpsvhXpH6ImdhJUBTf2RJ9aQs9tIUQ8a+z+14kb2z8QYEZf+T+KJ2RzihYC/iLARrI78twAE4RTt1HCo62tx+ln9OX6edH27vJEnJ39EXpzEBR+1FScN9HZMnR3uWCml6p8P8RxrtpGY90Lm3FAykpa4hZQxiBUnjsyiuP0T8CefJHzAm/w4kLSwpwGE60iMLNJ15CCtltfV48FRl8+SC8qcH30hCRCPAs4iR6keidop44hVO0GxbDPZfiZGkju2ESdn9DPqSvzqAe6plBXyUfysuj+8fRqugSrJW/nbw/jqyjJTV0dzT6zTdAAoVruAQchc9iTwIqkNVPPHwrDbchnr+Uzudbf1kdthPL2RwUcXaRIkKACspECAQtTIHZDOPK+hN54eVcmsIHmtIZZYmTMUT0MX7TaDCjcMCE3CAxia9vOXx4i825FHDqi5oD18665poXr8mhh+3XZghy/tNW0lQhL/8dPX1YvbT3K/H4TXdH/9Qxc1ZHx6xAJVz0eoZqA1yCQI/sJ/ulQqmIrWVFpBjUoDxP/yf6KL31fbKcPvopmUGWv0dv5de8T1bQR9jh+/RWMv1T+gj3v84HLj9E0stIfhpJN51vQpDhJP3kli0n6Q+wP+9E6F225WT/NQiDOmOyMzOs31Jot3cwNmSynnyTUdCxjtMRd4jE+tBklmHh9XOhRWHEfxHAw8TjcJfDui13O1TNMQleEcrziGffN9/sw0nI6KnuaNPHGWM8uGg9YzI+HkwjIh3l5Jq48YPbVE8SaTqEMv20RkjywjADdZGHWaQyAA2x24xS4+sl9fUlPadL6llGTCmp7/lO1dx7gJxmqI/k82pLfmDI+KK+9uoWl4kQIqRm2Ny1BeXjinJF/uVwfUnfVVKjUkd9yetKHfUlvVNVzTTC8CjtTnIsvnjVlCFIk8NL5eWptEWuMpsZCY9oBczWq0rqgUHVJNBQZkYduBncRJ6cCwIP7k/gyTNiFADy2vx/kWd0JRKNsI8wEkBc13vgx/+YC9cWDdwlNTIqoBZY7bb/lEscq4H34JznSjzibYOh4RPyCmWLD8VHn+09T7MSX0USleciyuo7MZDnOIUHx3YcAX7fyGUOplmQhYJ5ABPFjA8Fcrm77wTKFwDoHAK6G2XOwEyQTiEfs5gyIq+NnYs2AXWDZzlOkYUrPHISPCmTy0U+Ayaiv4Az2jXxh4osQVEJf+i1nXecoj88QyRpKk1BakPIB0gKgJimAO1+Sjx+/Z1H6d8+o0/wX/VspSnCKaCDok3AfgBm/ZXnaeCRnN1YZSKxt9OzREDyrPY10kikZ+gPp+7Y2VOEtWGtDCmE8Wn0CTLlM2I+eieR+9oRdCIZhf3Q1x7vSxXryyMwpslMNwIEMzEqqBz3TpsGBVaijchHaDfU3o10Su9J/hB9gD+EiJg+AH02W9UcQeY0gvxphHRG14R7GJsSeyccK6ShlPpjeB9oRXgNu07QCDBQcB+roQrvhFE5RdukvfEHIl7AhwEhmI2SO5TTMZQOOCbCHZWToP1mpn+RnQDx3S782XUwRlUolpBemjiRfhMM+ubN3dixHV/93RcPbr1B+PxFuvjF1R3bd2zeOG+uPwjPepW8So9NHH/DVqXuN6BudazuQBB+XqyzQJbwB0hFdKUTI1x98MV3kTra3tE+b54vGKTfTBQ+hweMn0iKaYiGiCfonztv4+Yd2ztWv0juYPQFdD8QtACH09kMNkiyDoUnujKUruebVEyY5CoQ1z1yTbiq6ppHENZG97OFIK674VhB9C5PODdXKCs4dgPA2Cy2QNjaUNaoul8iacNFqEB3Jr5HOAoUGrHFV6cjlvKtQkccuEcwQzxFtUD2t/W1tzF4JxxX2I5D2AqYbizB+duWwFrEeKHIOXJI+/n5RiZ5REo9lg4GAT1bUZQo5KNoAJLBIlOFmBfywwqj3KakMboDqSLxOOP2rKjKYM/0BYK4A544xDCMQXzv2oPv3dSXedN7XZulmxdXllX97rJ93whfp71xHfLH176uy85dfLN+/rpv9lUofUuuA5rkDwDRzShhAb7fLMHOHRB9OOXS4FFIY3D5jmAZQXEXcOR+XzCNyCb+Vb6Z/OWKK2hu9ADNveIK4X98hbr8yqZmf2ActZFT5O4lI37YveLv9Jm/r9j9w4gl4h/o0TNn6FFSduaM2tOUwvOqMV5/c3P09n8e2vBY0ep7H/773x++d3XRYxsOKXh0gI7QM+6z8ZeyXjcsOpENv13nNeI2MBoc439N+YLZquh+sLsG93gYl2BvUJWd5wnDnyev92SexyO0Im8M03Pf+GATEANNQVyxTJYbuxOu3AgUKO3eCJfn4e1RPsZS84dWZYbrkTioD2eydUEMhEiHpMOch6vGFZ0hK6LF+E+GzpSUBR77SQ63Kz0YcKiEQLrblS9L6WZTvurwja4lQpa6oDykqrdV2h1mk0oYVlFZ5fN5K20evjQ/M9NwF71j8333LSU5JMe+cOEi+vnCRYsWkgKp7Ea6/l7BJOXke4RSWyVSjaUVwwTBZHTZK211QkNZvtUwxXf1/eSt+5aOGxfNXkRsi+CP/nnRIoR5v+Ad+zGUEE87kINjnCEmqmYEH7gp4j3GasE6An4H5vG6BB7UrNTlBNiJiACoNXu/pPC0cKrnuwjAYBSbdyu1wKIGkByOV6qwubhUAKFL/XpULcDlPIbPSxSIobBwXiChq0yirQz6hNjiSzeRc1N1IZDo+Q6BhW7ngZ30auJJnzZvGp2DhGBfO5KAgE3xH+iMojBQj9Mvu2x6yZAh9JEYETmYSVP3z2N85/SYfM0GlCHnjHH08P6Kktnsh0XsjPHk8U1Wo4gIxYh97cSDiqkTKOdDnBLf8CS8N1xnQHKgux0VXZHImhYULwLFg8LGuK42wsZRUvAWMoFGfPwAge4QTu0kwkuXwLgduuQlGqVf0uhLl1zyEhGEU0rJTujzpp3xUgBHcDXHbAcG3jNZebt4v8pq1g78x2Yi2YqjyGgf4N894nGpEXBpLvYKNKcqqOA8P1LqbpdN0AGIQ+Bjl71VRoMslRC4640P1q7z+lZNW7h6FY2u37rC5529eNd9f/RWLdsPLPV34fnPbBrXnKPR7rr88QkTo1Fiy7eNnTTyT/dfVIKQjpB3YU6r4LnI69iJV7YFvcQetIlvfERPdYeis0LHSOZHIf5BFIPAJOzA+dXJ1kEje0M94zjsqD91oXTAgBok/tfyYYZOwgjiD503KxoUERaQTudmmDwOnp3Nxg7ltD6AJYu4ZUxOJZsBkctA2Rhtgt/uDzK87kfBuF1B7GbE86wD8VBLjOxS6Fg4r5wzMgV5/BpgN11uo8nbPwxwjRnfoXXE1YVlKRk8ycUGb3jcW51m1CSlp9XZLSZdljGnNNNozDSnpEpySnL5fLITr7ra6WyYECzM0RuMNZ6KvDxvptlgLM6xZuVUNU0qLsnOqizMMl+tdADpXOR1JmUU039FwtEnRqoqfPpssznXBpskpKSYA/rkpOSUTK02XZdaGa55LUw/KcvKLqzLEOWyvMxhKSmWfK1WLaeONdlstYWZmRKvyc1tCgMMdpBO6VMYNwOjIAaUBjz/S0VCf5nwXH3JrSHjUzfcuPSlW0frTK/ddNXUKYJzoPAWKHwVC/l9l47329KuIBkjXvPufodGtx74eNzYqy8dH8g/t5D7FXh6jpYEV3tcvheTn+Hq6d/+mzpg4p5QNSu6Fkz/v9Qh7QWSpAPxZCw9t47zyxURsvmZYphtzCBpryJVRIk/bN2oI8AhR+5F0YwiJGdEdlwml85ZORdXw40AHrqVm43SEMCYQZcyrxlpEvRLyoQFqiRAvIJd8Aa9et2guYsZu+zvn96iHVYIVCTGS0oIE1NJFQ57tss+4aLpw4YWFGzraB2dX+xyXFBaXlHZ9+TiE0tPLKr5+ugnC6qrrblDq3JzqwMbJ01rsuRZcuvplCcDZo1WrSFb5jcW5OfnhRbTNLTkCiOrJh1KVusmu53OUU0X37Yne2qSRj0k0Lakri7KVCT7yDPR/WWeljq7PUWlsTu9ExyOM/v0GSVlBsPC3UNLfdlZ28zmMm9mZvRFYLHyw8iBIX0Us3sRWa8bGW0o652yrojo3KKeWRGZnYK5iAQFMajjWzd+Qa/fCAiucyO9/ou+N/nW3gMbydovNtI2VdfGL8jajdJePLMRRwGP+84y5S27LXYhBxgsTgsn4vCcfmwbl582xGYBo4VRlj54O/85m19g80U5Rp2gtBflqBFyOuG/85xiYHxTwjjF8QA1b4AdUxQOONL/BwwrTGDEaoCZW/tLu5UU6bTTyL8AjW3ishEjIHXAeAydwSpUhQS/ji2pyLYlS2+LZA2df2/k/vnDsmF1Ho/+fufdu7fx9dHn6tdumFUz5KIr1tZHUcCg6h+j/vWlh5dM/DF8OGjbG4k3CdtETot/Y/gmCaVIiKf0NrdNL5YcpvNhAR5aRh4ooa/cBpwwioI8d5GTA3YcMEYi4Ao72vhomHYyrq1RLODMUBRMsIEjgj0Z9Xs5BP5Vx4gEvLX6NcaICR21RXcFeicF747Tzthz4fCRlyOoCAkDgu8Oh3F5M4au14hWUA1//0coZgkljGGCiBRgs1MwVXSeie3UAu4vTWhnTETn/IU0D62CBKab8eoGN5K/9u4BKv3uINBEfSdgCgy0raYYzxQXY6OKa2qKlUb+PXoNTg9oUswOT+qCOeBmNgkWYpCJVFDOu+qJL0gQjaLpYzlBGESYbWmVeNvK+vrokron6y6BDH973Yzp9ZTnN1ssxywlxZboJsxMk8RL6mZ0z6iLLqmvX8my9fyu+vreCFw41XrMAtdZp8KF2C86Rmc0Ml3Ur6+v4TH7FwZidQzUxlcTSovlWF48J/1P56RGJLMRNiNV1pcZFk6Fw2iNAykQ3f3785XJ6nC4xxEOoxY/zIxbTrNMpH93vjK0h2X4YyXDzApATmODbEPQDQyQDTggnQHgNb4ocKEM1AunDi8Ij7CtmARrfefNw8Y+tA8I1S8eemhM6FZ6M986daV1eHi+eGD58vdevi403xuJLLj2zoMk+e6779lNzzx3x+alkUgwHLr2t+8vW440ejgBh6HUCGGAlStQ8KEIm2z3o3mtMwE12mMpzOk2RI/hCNLiEeFUXzsCGaawAVSXT7ulxjCz8ImgqCcOdpQFxPgWNdN6LP+156PNG/Hi8+2Jz/f2G1QAnkFwx+yOIqhTR+YDwR0U4xJApB1mz/qVBgzS5WlhjtUzyxmHvUAlAVNgUnmrHMSO/R6M49MC2Z1AVAI2FmKiCFZSIO09RA8f7ucSdh4mw+jI3ZmmYfUGQ26ut7Wt8Zqb140eZcmZGkzX3pLj85bn5uTkzBGKSTsZ/tIA4/ESWVFSXeyuKsnNdjiN+iFXja2pmTustLS+0Gyy03eyKqqqgIQsz8qJyQz4A9IfRTPXxE3gLuBmAY0McwrabFSIWnsM3fvtZrvbLtuDdj+QC2ZvjDbQEq8iFKsyyy63QmbApAMmncheN049t+Q0euNdANUYRbfdqBAbUllhga1wZOs1I2s1szOCQ+Z/vH3Wotq/1CyeNeuaWUtnPvP0qlAwR3212uwINc6Y1WzPctsdUyrsGuKkn2jspb0nMxab+GRVCp9Gnlnrzsq1WofTi5/gfyu8vLguP0+QZTl1avbE4W355ZPKSnt6Hn64J3z2bE+RY7zPrglVjLI7XZNTU5JrPcPD44uryZhAvViQUpRUW/ugoNWXF+sz6BlCCL/fnFlVhn2l8KWKniIXoEsBF+CGcHUMb6PVtyS7G3jF6FtwKzbfvBdVa04SNMsxW2+zVjH1DooaQE16DRGZ0Xdpw0ePxG2+m/cOzStDm++eVpQdR5hOmln9nGgce4Ni8n3jtyPuQIPvBuEsiguQsEQhuZAv/YNZgJflDd0bNwBvfuRYg+fOTQinFPshRj9G3xzx7Y2K8fcNYxvvZJdOVOqABdAJD429M+lk+DgV6CXUzpTBW4e4kQhFAzof73Lkw4Q3psdl/qpzJIqamG1wf0E87VfhrFOd6BpQWvH/ZoiJPqYg0YuUo3FkMtp6jGJHqm+VQkUtQTr/RLIejCvFHqR/FT5i5dsVhQH7p+nkzeh+FDFN+zix+GRcZBq3ZWDwRIecuB1orRBw6oGgLo2U8Ug2eaZ0f3KCrpzy3Z9/fjciHu9xoGAll1gsfE7fCbu6IE+twIROxu/26/dRlK5sin4/vkmNESYRi8Sez7dKe5meXkScroOpgWURpHeFr8ktbOBQ3Q/XdhLCcB3S+qgv5FExZxUB4AeCITGIMgBelW9KR2Mg1Y3Qsd/dv+1SldtQaHGmX2uxXJvutBQa3KpLt90ffYnkvv02/cvbsvp++t2DO87OE2wZTkux8cm5c580FlucGTZh3tkdDxLDxXjV2yS3X24hHeNSgDtEa0t9gn4wrrwiTp3oFHVOUS8aVteNufnIzWPqgox3J8PIaJoZ3c1MSR57gn+Sb7GtHrn45psXj1xtI5cxDp6uu7av/Z13UIawPeoa4G8QvyOsR3lQCcxE5OaZFoFJkKEFNp8LiwikdrQysOsc/ZQR8ReUiXCuMwKETqR3Eppzkc7VfT+GhXxIp6DNZ1i4bd9q1Gd2Lnhk3cqV6x5ZENM2d9NuVJyouta0TFkNKwRJMs+U1Wui0zEbxrvhTLQ3YvM3NvptNCUuA4c5lcy0ZWgj5mJWEnajHYkxP7MLi8tCgELTob4Czf/wDU4D5Rzp2RqJiIbeScIxZu0U7j0Qxtb0ZfKHICvt7T0QiSiKF8CdpJMZVEWr4H0QlwFdksKyitwa13Ejs8HLh1kTEwszOhamG5HPERQL+bVFNKWott5NThfxtzC+prao7wRz5cgvqhWfRdF/cQ1icOgYNM3AU9H9sGc2BuS0vBx4gxh3O7hyYLUI9iT66Sg+Oop48pBijcfWKmmmIej3EMrgYrheyzx3zqnLCW1fvqal5zu8UzS0rOk9gLbGioVvXybsDyLIU/REEekYzCEXsxJQ4FLQKdlj3itOF7NZQS7GLSLeEwPio0wyqKFjL+iAXPvmi8hBDUoUIUfHajTk4AVCPjsusJ+cD5n5Jwvs7BbMYBn2xZvcW2zu5jHfAdTz2IjyLHiIGR9NYqRA0GgSdMSkSN+DbmwJkdXeop4css8IK0PsLB0GJPbC2tZQVq5YtJ3+BkvJg4UVmTn0Zem+meN0PV/w9zvdqGDXGRqqNPzVnrGh1iRNsq5nmOrC6LPKKXm0JYkKim5O4U0RliBs55yJqxmpdsBrgYGCOKA/F+DLalIagPnX4KXzfY2hsPlY2up9q/2l9JhkZmC290aF5ehQlMmqd3MuCuAQ1c7NjK50NVXfWeCcsnr1lMCFOdHvxeMMQEevZMmPio0azmENzIM3md4cB9SURhK0AApVFaOtgAzR2QLB/l9cdxBHO6ILnd76f8GES/2BINyLOob4L/4EabrdvHi93VjgyHMWFhdfOLOkqNBpsxWYMnUkJZl6SZJGKK701jUMHTXy9ttHjhraUOetpAeZH1O0GO69okC511Ex4+IKB96bl5WthXvJe/QnXo7d3Dj+9tvHN7KbxW2+9SPNvjxHgTErXS8b9JqM9CyTrcDmKOR5azHxpKtCld7Ckhxran5+qjWnpNBbGT3InKwe9V0xMjN2Z3qSXp+UjnfmOYrseCft5tNit+ak5+en57Bb2VpT8H0K6hkAMKSp5AzAhwQYX1RbqGQbcIcp06+966rrQyYyjzShNV2kxyE8Rf/xMD2q6gKAUMKnuRqWjyWppMJIqgBG3Rc9omquuAPX4FKikxdKh9ERESgmmOlJRFLZ850mbz5TmAFpWEbqYWxQCxo0qcyxlREISnJAXjhuOZnedZo++ho9QqMVhdzPkbUvOVx55ZVXPjxp+rjWqhvI9V8kfXzHfcs3LStZu0zKaJugzb+FfkL/eaT9IfEefsclcmr22x2qEsF7/+zw1EfeSS513/7x5dkNHSOTmd6Q3BDTh+ShlBqBjGzIMFcxSMPgjl8XywGOPfDkBvLtF3ySwGumt7dPj56w8iGWeVVWb5jRd7kkfEh/lkj7kxvcpHzDk+3vz1BsFxT8+T3wLTkIi5w2XxLhPMSuq0oh2US0+XjOAQcqsylD7MdeJrGb+FZ9AO9yP537yVFyAwl9f030BPHtp1/T9cd2kfRlSy+N/q1148auje2RY+QOcgGxv3spPXr1t/RNuuGDP5CrifkherRt8WL6z5uvmDF9w4bpM66I6c8V3OpItIzVeYHWZ65eLmZZDVR7vy+FTdzp9HqddPGRvO+rRl41bN2ORz78MMo7fQAGvM6eNoePX/7jXbW1f9Q8fMczP0Zv9TnETqeX2d+hzvt2eJYB31vn1dvYM3SxZ+i8wgTi/B8nPVnbcvvF7Q+/+dNPEf5TkntwxAju5+TfP3uU/gX7D3CLIiPSME8IRV4KK57r12PTbvF4X3uEpghq5sSEDF1fJqLKdgVgn+EkooGxfkN6DjBiLvDS1dxorhVnpVXwVoV4pg2QRMlKqkLEjfovzHvjB4I+wC4w65mHEYEMIhK34MLZKjmrTLKAFthufQBAR0Cwy6KjYmxRVWuFOTX90uFNbbQlteCCyy4oSE2bc9kcYTEcVA9Rji4es9EZOnjdB68O2aTb2DxuY/SpZUPb/MOHLtEuq9jbVeRKFiq7Hqpcpl0ydLj/kuErUrUuKaPwolnjykcvXVcx+qKLHghuXbhwa7B+woT6/lxvM3ly0zPzPn2etvibmoSKW7rptXlDysiK3c9Lybrnd9NbyobkkfUf35yhldicGM8dlNdKy5htuZmgR5kGxTqE+Sk6HWarxix9s50+tGNqYC71Rv9pmWJdZ7GoxvyVdpHdP2VVub25Pn0wuUYQW3fQx3a0XL0wuoIWWyzr0RX4xE3CxouTcswlpmr98NRxAsCdO0i1dKv0OFfM1TCNfZoAYDmkCiIRbrYSHuGxqgxHJSTrGbx2+xSYbzYJMwx8piM32eIyN4+9qHlSlvui+bPybOmlFz916Woa/emzLq/FmO4ZNWPRyssvedI656KWOUJq9ryZU2fLvLRHthZVBP3VZl1m1fhRw9NM6ekTho8+TqN9p0aNbcyc9fiqYbtu2nXdleGW4tTooqaUlNHTF9jyh+Zbpswenx7TEZKdjLZCSUS/hbDehoYiNtKpMFXAyKExJRo8AmHXO/EtlBfRFKQiFfk9KWF1pALctXHlwFkOZ3Zwg7gsotAMMMXF/hwJOBpIGuFlCfh130C58zy5c5mtQworRFOUlLzuJCM7O62zfuts6GoIUZNSzLcOTknJZyTzAVLEWK6PH6CnhDYmJayp2RNL6THnUyNGNL5C73Y2NISenhcrLj4nVeSZiu0m+gs6mO7Zy0zI0YWyCmkjKzGi5MaHclckTEoIEEAEgAWUSXvDZ18Obzm5dcnFFy/ZenJL76TIQr69SzjV1c4vpN1hIPR7D8Cih1PFxXBZJLJ3axc9FGnv2ro3QvZd2BGJdHAiCXCTpLtkHbO/dEIbKpl/eB6w7Q0w88uJ7JZJgYKHsB/dBXFCUZTd+qCXmIOC204OBwJvbTh5csNbgUCk/eTXG8n8h7/5dt9D33zzcPtTT515uosIVx2JbuvpfWfjR73besR3T37dDpe+1f71yfa3goFINOmbh+Hih/Z9G35qIyMhV54oj75wnDd+4Y3+9jgHcytRX5wExzqAonFJpwsgmAd9QfVo/oaajCBLnG6gj81umRmNFUGJqJwTgm7RrNMSW0QRvQFDYd1Fu9HpBjLk9K5dPbuIJxJtkhqZbCyTpqg2oZvmrl1kNjsnq+Na+55diowa0m7i2bWrahcyKHiGCTB37aJtu+CPeHp2KXKzmN9T3P7UeI43Bg5+vpWIRhvDfcSfQJEaxeP9hH2LYtcabWKcD8kMDINkWADWVyJrgaPPxh4Kep/4JHN+HdKZdfMzP2G8NOCAocyXD9cu4yO9OugjYMR04vrBCxW6QhHEtEZwHeN65hLrkJQ6lHtjqnyUZqJSAsUvEdXTb+FNChiIxAGDgoOZ3qORebMzAxEzNARd2M++zB+CYQiLhr5M0RBBbm7AxgvtMGu5CUz2qAAJlD3mOwLE4Q5wzjTeZJbKVAgj4WdVybwYKBPdIYFYVWmClpSpAIQu3xn3dtu5M+7t1jecbnl0LLmRcLayjGKfvanS76owtJZVPRMaPfe6CcUpRKJtfE5l/bDayuQknWuYsDmv3Jouq0StWi0bQ7XVpUluoZLVtXNQ/T3uwz+Q6uTgjt13ekWTq9gq6kZMbq02pOrKfWNGVNFjj0/fMrWhyFZoLvaOriNvV8yfPnPkZO+wnMxM7wV11Y0F1w/257HFqZYBP/SY2bKStxeUEZhOGp4v5P/KrE36JUAlG46sX39EeIe5mamhQHFeT3BHL+Knrj/y05H1vZNQIsaeu5J7RxZlEeBEFcNTGUi/OlDUGWSIKiSUAd6XzUQwh4hDxRg7vz2HEGfQJU676f2ZplvP0BP08E03vFG1t+DeVZf8dPy3l2WMvudzSIccojr3M2PPEhsZSo9bVGTuXFJOQ3yq1DX2DP0z/R39/L1ZprGj/rJ90brX64boRu2Buw5fBuklc+m7/MiLoHpz335LsSpFIF/QPPpKNy8DjNXA3HoF6CX016jjxmJ/IeGSAcjVa0OxLRzKoi2kqgW22ExgIVYFgvoAI3LZSS2PVwCKIcpFaGfdSQ9bS1S7X3Coh9h41UhZX0ufyy2VyRswMSS9ISf1I2OVNnp/5XjJWRhU7xcLc+hv3Tl0q9mTlDSKjsoqVN2bqlN9RMfymuwsh/ZrQ4FRK4jHy519WfyJpx0FR8wjCqxbVWkF2aaqrN7N4zxuodnuukXrsmjTduSYo/MaZgrL2GmjxZLMJfrEq4B7wVWkIXGHd1UzgrBok+pVJkdB0IUgKiYxQTl43Bc2A6jAadxMtFmFNcXBmuJ4owEdYb1VDs55XsdX1X9yexVDgo+5vcoZxMXpfEEYDnZ/hnzkXnqa7qBL6XZ6eg/zfX3wHXIZSen9hD62OjPdlHnTTKdxPbnxr4+T4BU1yzTqzCS7KjjSbqcfZhbBEVzROdt9ududaUrPnLlJSEtJNsmaJf94+9+9r35Jvx9NJpF/EP7aG9Yvz31EsJBdWPe97JnvPMicXfeQFKdwi1qo9pNk8uIfr2jTTGvJcGeXp9dIc3YN65k5UxhB1CoVH6olKZIgkLoQUdPHyvKtF03c2PTKqf+hF1/O3xZtXkEOEun1B/sWkfuiI0ttU8jfFRvMuJ/0tPP5GKA+5r8qQyM0/yCvTmZ7gzlZzXwRKKM/0Dn0V4/QeZMdk052jLI/IH+K6bHi2tpiUlyMgUd+/QiwiJJTSgG/KHMmzORSZi4b6NaJ3AzFC1UWbIIXZQiJXgt2vXiu8asfXgtpG4AbwClgyBFYdsBNuEJ8A9Ab7hAJyi63FyaWS9V8e9mM7AvpF98/MpbkoEeqgttow9th8hrmYhhPcNPXLqevXaUZ5m+8Ll8Uk0no+ZYphxqISpIE3rZtqHeo5n+asz7MHqsSRIM7j6RFmyLo5arUAcy785VE5ElTln/yyfJh26qzHdnZo01Dq6qGprldtuRkZ3b1tqGvjNzQPkLgER/dxHXKDXJj3J5FQ0ySTEQ9FwyY0JeJdxMxQiYUEWefK9qyU3ikwr6ZfhKddD3/KNXyXR3RibKBPu1Z5+pz7OS7hMcrnSq6KTr+ev6Fvu38s3Aan/E0t1LOEyOAZS2o++SY/Aw5Ry1RNAyJh1w+p3cz01w5g1+yb3Xu6LBnutGYy783kKfX8mXkjQs7muk11EOvae64UIysnuKrMCSJYoUPyYT+fG8OaSLqss/pDyT98zJ6BukYtDU4Lh7vl/UnWhIdR2t/ZQOsPWD9o/DbCs2rV6jd+DSBnIQyTakx0vMdShtRqMswUjNab3S1q7rau3q2ospiwOdJB33BtAyDa9HHkaAJeFMWCAcrxBQq/DHmU+eJJNSJFvzoPNd7APYJOhFYvxbOi7hO5TUkkTQeyAaZ9wOHHNQDNvADDaGzWYU8IpxKKb3lrpNt49tvu63d7dLkzZm5acXKCZVtXz14ja2AnGaw2jDiN7fflktTctu3XlVcLKvVOSP8JSfoZfTvJ2+co9ertKFxHbf/6V9k2NPoQdN3WpUxYeGLbSptaWlDbrRJqSqmez0t7T1/36PdVL+m5Zy+T3in873Rf3yH/621rP6z5Kz4sfgxtknD9zuEiR/TPWTedrqH3ruDzGU7Mk8cC8d7tseP5+6g95K5Ci+oyOoFrgyojOnchdxsbl4sNkBMSNkArKA/4I7rXNkvL1Gi6a1ihL6bnbWQgWJ2fwj1toqXhF2MKeyZ0l6NNjW9L+jT0pJSVaIoETk5pcDuteRka3VJSTzheV4F+Cs5NUWrN5gzhZ9oSvTkDfV+f67FkG0pchcMC/qqhlRUBXLTHXyqOi/f568RtsRNWNCHU9VFa5NT0zOyk1ONmbxESktLAH+nZBgyM3MynJrkNKuQoQdyUK1xodJhSmu+zecLbhTVUpIsy5IkapJkIUnFbwz6/DbbB8wqIhJmPlYD/BH2WyDWbwu5pUzW9H/pu7gRw/+l/8igPuyz/Nd9WKZ0D33yf+lH/nA8FgCaLwOvC/zIx/9dVxKJddJv/nNnLmMXoe0PdujA+i/ipsLsc7viEnIvc6lBjXf/jxkLxH6EGQHFBejxMxgWSek5s6wzB3XuINTCfyoAXWEyWW1VvvpFTSNMplSBJMmpqcYMS1axu7ysqDgrK9OUkiZrhNuqLHKddWVw2sq2BQsuvXC5p62kIads6LTyZyY+PHzhvKaHPpw8R1ynD/qrK6ocbqO5tm7qtFn6JJfNUQADnW3S642WXJfD6c61Re+fdvVZlYbXAUWlTUlJUevV2Un65LNbJq/yW7IfvpZ2L19OPNc+7KtncPAg8Ks5AGttCAe5fFWG0YBAI43Ae8Y8FH0ud5nK78vQwwRA8gQ3gMhAtggTSRURbi+urTMas+wKQWLPUueM9Ht2tfGt+SVZwfJImS+rJF9efjuld/o6VoUtVtvSIiVCVtFSW7J71dLrfHcSvic8Y4a/rizgL69L4Bn3cmrmscWchomsRmYlrDDfbapmZhpwCFhIJWYEsx1fx2wgFfgkrmM2Rni9eBzZXHY1NwhWQv1Ouw5BmUwG1RhBcT8z34/5y5F+PTarH+5IqFQJARSOuWIPbj/0G8JJNxlUpdDBrB+agEaJ1T+4/XBHQqWIj8lpdvkv2g94Fj2qg2RQlYM765fthzsSKk3oqgQ5PvOdMJ/Xczema9KjGOA8nrt8ecyx8rxeu/QNdlLxBon5PEJ/HRnwF+i3CEX7tCNnKuIb+tIz/+3+PVyfGOsHPYPGAo9zqRKdgkCj0zDQTxmG/AmRmBwhheQ7uIz0JDwe9F5igYwOQjKTyohK0CPIERmpAK+vDNhFdxryPrYAEAe/FmWHv41uovf9vGsX9zOZQzaTORzkf45WkQtJ7V+2bPkL/T3dR3+POX73lNFr7g7O3/wYvXP9Y4/98/HHSLl32LxyCy9cZXJW+v2VzuTPurubVo4CaCkgdJ2alFvTPHG48VejC3l3/Uzv+8XzqxKfSmpZS5yluS9vDM8w3bt4/WPhx//52GPrr3iMJtfqL5g/K8/avHHqMEeWWiAtH36octWOmzx5dFCXvnDvgnEFBhKzW4/NQTP0ezmLtmdTIui5mOKD0awsip7Y76XnC+h/kS9hSmEGU1ASCuXiyGgTqnLv1bSGwqFWzb1w0JeSILzYnhAu7EdFO78idu0KOGDeExYjVmG0oEtFTBbcnZDGTzMrGZTVvicvkqcDd50NGLYB3s9VEAtoGSQBc+KBT09QFYNRqVhoQxSXysSH0fHS0FwF3jygamxt90Tf9njKNpTwAc/3no0l/UclDeQBT+vGEjr7aQy3CKdh3/toQWWlTqf1jBs/JD80WqKteHu7x0Pw/lUeOCrZ6PHwxXD/xug2OhtvIg88DRV5eD8GZIx2l64Kt2Zn583/Y+DClRfAutgDdHSV9CU3mbuIm8+t4jZzO7i7ULdsQG2HIU2Sy0S/IlsPMudBFPMAZ6YYDcTDIMZSZaSUC3BgIUfi8e5M8fBgRDJaCb5/EOgHGFHRxyQwsqTYM4hxTSMcm72Yh2sgL33a2nW2tUCfXe6qt9dpksf7xpUVFLSeuaC1deHyreqMjoX+W5w65NswoBpsmNU57qxc2JGh3lqxJLfvVlcIx5ZsUgb4oJ7P1Yf1ubxeqw1riUavTafd6Vq9xUg8Rgt9APcWI+2G/fowZnEnvNN6tqvVN+zyKc2llSa7pK5wTL7wllZfa2vr2dbhDc9/Ve6/5uuW3Bppzd41VXhTlbKHQ6k+q+Xra/zlXz2fOzSDXF5XWMSAn6Lpp7psfU6O3mhK7jEDRtYBg/K1wqXEorxxMTsQ5HlqueFMVouiAWPAq4tFobQo8r96ItnjoStjaYHbGJMGKtrGuFhIyI88f/lFKzD0UwvOf29lrEWVXgzS1tUe4ctjMXUAX6x6Yfp02o1mOISm4nL6NIM5yUaUfcaninwh3N6F2EgxWmB+SHF5dxJnBChQybUi5CW+fmdR50CWWbfEjFvQtiXxCD1MY++BFI1kj70uu9ds5atCKJ3iWCIE4SQCbL/Oit45Qke4sA67HNqnZGgb6mBwI50DucP3AShQ2zTqAjVk7jt8z978OzvaO+7Mf3BPVNx0/e3OpgWjiy0v0d/SDvrbl5zDNs6w3yntnbm88HKPs6GuMJ6JHiGz0XaIPsAsiAby9Sue9/+EQIWUEEI/wtxP/udXrHzKl9Tocg1N8j5FJ7pDSfrKYf5S2r3i+WXLnl9BPDVjxmclhdAekfkcHGc+0zboyaHcCG4MNx5WLxcDLioWZMaZeKDY7ivdiOvOec4xCRplJ2xiLBWWOby+jAw5s67MNf2Z6XzroMPoKzDWbMCLUCPWn0eXN3STiO5XUnGne+mcaVnZSQVzL1junjdu3Lxzjnt/RjuqRJuqWJ6/GiMlMWtvJUV+91XAI2mykTNwuVwhylfS+IIyoJdg05sQ3ugBASN74pYEAC1upnuWTaqx5PWKQ0ePHD1UQV4d8vmun96c51298Dcv08CsUVPe3L1g66xbesbPG99zy4wLGu4Qi/venrOtsXHbHKFq1lIVcWw/PGmhlX5ZRjMeSb/44JToZ+HpXdMXGFdNjvvdR6R7YSyYdAC4AYx7bCcSkMLIapklDCotyXod2gGHCAuVSmSdnkm2Au6ApLlgfH5j7VvT6Zkl9N/TPqxvzJ9wQdM4XmO4d5m15q2Fz+oNo7tOd4026J9d+EGDY8UDBg0/Rry4bP+rF05ZpKap5F8pi2dc+Or+0gIhVHv1T6HpbnoNH8g91dHxl23b/tLRcSo3+jtylW1u/dnNtQ18QpyVVIyrwLGoIUA6hQQgVGW9U3DHou7cuv+rd571B86+bBj13iHhDL2RrC75MrPvlrI3bWQ13V/Ir+W3y+pFt9zi9aF20dD0eEfP48RBMp2byVM+WnNxHj1Fvyohd9C53DnxdrS/jLfzn2Lt/KcgOxizS+iQGlXNjDJE+9JOFjyvOYK4uov7lNmzlnE13EjAbYoXfBqP+hC/zwHgxIvITHKhZBWVrTbZbor5EsCqcZsCzHwbx1BMiObF0Jm7TAKUhaJvk3BP68i6FY8t3nT0SqJ6Ps2XUm9W50q3v3LJb+aT1xd0TjGUXOW3TXy7daFW29mK+5tUk1jYr74HHt8tqlLNGS6jL6W6+po3HhOaQh3zQ6tmBRs2TLzq96R+aEkJEV7dNuPeueEZllDLdfOLq5y5094U9qy67AGBv+uyVfuGKvHDojVXLjNlpefk6i1pDnUGv31OeDvr90lktHyVtJXTKRZ/qgwzRoZVYsS6Aw59QRnvthNThtmuRIk1Syqh7wlS+mrmETT7P1Xw4z1LXww9No/oLtv8/cENGQDUav5W219Mf5C27qH/2I8mkLe9PqfltbZNPS/Puu+zTaRzGD09LFYEa7eKeKU90v3nk40KMdnoCqItINa+P0e7L+fPuC1Lvo9+eAlfTFfwZcuiH0ob6Q/2eXl9n1/Ol/G9hVaBvhn94BLeH/XxFcujR9i7vgnczHLmm6vEtwPgxqyVfBrCLFZgbruAGzeZyTVi6aFDPX84JLTwDxhTDMZRWdE3om9mjTIaUoxS47N9B599Vhj7bN9evkg3xGaVDXQT2QykjG2ILvE5WhZ3+FyjUYQC8HoMEmAcZuD7gUdTwIGGBOTlraGe6xDoi+tDrddoxdQkupRsyTZoXBo67thHdBxkDNlkC12alCpqC4N8G39pkHcJHXhPXzvshfe09swkuo0utRqTeTVZ/dpr9EY1nww01S5yeVKmXVtYTtXkTDlb7ytkjTwb2mpT2iojroS2BqFPYA2W8YAv84jIQWI2yZo1Lb0TUeirenrK6p3RvdFFcoomWWNLSebXkK9yUxxZNuEyYf4Fk23Ubnvywr49F06ykc9sTwhNfReRd0WtRZuejD7fVzi0yalm9N3v5w9NzHbew+QH52pq9ZLsDBEiutx6K4lbA4tOk1koI6IQCIoANM8b32vsbXNL6Y3+wyo9vbF07m0bDlMV0271PUdWs2NhPlxBVvsPn4/7VE2I3/Vm7KrofqYNey1W7b9itZzL6+Yg/vlllCoHHMJ7wQHBKFEkmXgNACHOG7IKX8Bw//30O2abfj9pS9Pw5FX64dy5RHX+EFby/cSQeBNpSxL5btKAak6SzhczmXCcNsBVZvpllEcWbcRG0Gx/ANd+Hd3PXIEGx7nonRQLtZmi2CsoPNx/rndQIHPV6r5MZtN8bsQSBUSzevv71DKgxVbqRS2YEn8BdWKDnxKLrEFTkObIBNIDrbRrxfreScwpHp/HwrcooRYiSuB9xcEKYyD029wAboh7TZ0vXjKG0zezuD8KYmEkMk1hptmqPYj3wiiFxNCOgIX2nvvNhRjhQvpl2eqYZQ/aREmNkd4DeC3ir7522o3a9Vhsuvj1YlyCrgIAgh7QKKfZj+IfZooei3/Yxhxf+Fa0QGd+Mhi7sD+mRRnjtlEIic5wQOvpmOsNBtsKBtB/qf847v0sHo+a2hcvqauvr1uyaGOJJW9SnhV3FivuFhRardY8WV0XWrTozKLFdfXRxwsxsH6Rqgt4FEteIQy9FVPRYM0thuwgGFDAXcwt49ZyHeddPYGMOFwwssaikj0d0TUSSwp6CjBjbH0Ard7SiCkYsDKrOCPTeckZQXYi4CDeAAAzSUb3Mo4FgUWltLdKTMibhJGkKW7BRQ/Rj9laq4Kf8a21a9+i39L36bdvrb2iKLCYPHF9z4Flyw70XP/+/gk3+w3rLtr8Wbblso2lC92L+eTU6scyUnUZgH5VUjJA+CFXly1whwUhObX4+tlEQxdJPk2SmZcX1PKusrVTg026Au2Kuha+3LQOD+za5XUtQbbkB5pRxJrWc+nat4hxoEV3/vml+uolYja0hP4DWnSpqrm+ZmpX+5WPF+eRP6dpVVodb80lRKUzlwVKBPKvWVD+XkZquipZu2ID/Zg3mxenWGnl5ps/oLcc2doy7uHG6d8sVtLNSvzWc32PlVgrsUDFtnNSFPMjkJAaKQtjCDP5BAYWQXdkxT9/YA+cX5jhzb3n9QHvjw0TT/XnPC/u643RD9F2AdehrO49EO47IathAbVhIDGMqB5B10ppb3+ok5T+6MFKW7rDsb9YLCMPw+VxeSI8QR+LP42e5GEl8gi+Gt6KBhN4oxro2Vnye/IbXBZXBDyYnxvC1TNODP1/QwRnJfuCDEH5jyL8McskyNQHZfhVGUmlmOkGRBm/2zB4U+3bVnXLsrXNZq1W2max9C2xTrH0/WSxCHdYpsyoId/XZGoEKVlVsWBMafkyUlxTM7WmJvrhKH7jyL6fRvLto/p+Yvl/j4rnR8mPbJO0WnPz2mW3VG2zQG2LobYkyxSrcLuF1lBdzbhl5aVjFlSokiVBU4j1Ta0ZOjJ6zSjy/ahox0jyfX+e7a8Zpdh8QfcATZ/CuJ9+bSsy7QZONnoHBHhoQc3FjQfxAiWv6lq9b/WalqmXwzB99XEEzSKZ80xR5Bj9Epnxbx/a9w2mGBloyuq1kxH0rp38GX3G8aEiovvQQSZ8hndghEXmdgPtmkqsUrv0Loyom2nIFWcsn6OBqJiNSoU+Q5aQOa6QeTezNHAIjyqxDHky9qGH+FtPtF1Se5FHN3FGS07OnKdLdWpXiU5HG6V3W9svuKCdtltcoip5qGWk0UDfj0Z18sK776mufoU+mp72UPS7adPGcTF7VkVWg7JxnCP1LCYFdy4vHo9AplCSxrg6JZGmhPUQ/3KCI+69YcoPppF8l6prgP/+MeZ2j0Em542gP42Yx2L7tyDqCvds5VuZHImMUSLrv3U7+eb29C/pu1+itJwh1G7Yk2mKN74b4/7bRsybN8KmfA1gDf8oYp8fB7wHa40TJzZjsCcVrOU0+XfyQS6TaYjqOE6P0u8Q4ULQxZyWlKnF/+JzM3rT25e0WcIk9eS3G9KtNPPk1yptVemIQFNxqfg9/f1zpDbrAqcro++zVmH55ZV/mU2vW1+ybnrJ+lr+h9ipbPp78aqMM5evglq0/+y7T6OjN738O0FtyXRmWVPUy+jvD8KVGS7nBb9f0Xfb5MrG9SXT13nWkXWz/06fILXZcKY1i74O45cSiwmI9lD53GhuAtfKzeHauU5uF3cPt497CkZS8CsMhVGApocIkK8kgCyjSpYwXpdDMJnxg0cSIiMt0ZuBo2RGUWboG1k5dKMoQAwE9WWE6FG1iJyDoDeYUWeI1nS1CBGZBNWu88oicpz5eOQ0w4OxHgHtsezMnkr2YT1OxS05aEBMGQQ8mkMMJjNcIB9ZMGGXJXfUxAU91vkTdlWPmrBQeLXAfuPC3fSjakzvJp7ItY2qzFJNklaj1VSPVRemqdOG2FvTUtKAqL0TDuW0arugH9VFd2b5VaNLyW+OVhpUclqe7ZYHeVJXV1lExh3NWDqcnH15CiztJbnk8SUYtI+Prro1maRm6KsnXFOkkdSaWqdWrZ+Y/9jMS8iDj6fk2g/MbVkpyz6BVi2/hJC62nLxID1JckdPmLArl9CTfDYx547afVsuyeu7bflb+5zBHXcvf3ufI7iDX12xgddkZeY2hIpzxiwgdyQLuSptqkPKkdTqB18ndyvHRA7knhkToCmj36Q3Ejk4JCnrwhkzN5AKeljFGzOs9MFxjZMBTRSiGyOpmHTHqjsRpqhS/u4XMglP7vqObBGINk0klq+aR9Li0id/Clnyc1vXfTpvXzkJGbL1OrqL1NAPiUBi3+b5LcmX9dLjLGpWADjdDLcLpT84QWQpw2zihFM/kCWL5uqndn49//DYsYfnf905VT9/AVlC8heQMb/7DWle+ZwsTGxsnCjIz62kB37zO/obwFT3w7w0y/OA+xzO7K2UaHB2/Nn0MNMAfgDPKdjdEtM6o7Y/rvfHZSbYY77oyBJLimGsEFA+XIHHyk0hIpuHNeWtn5CeKaVI6dHWzwVdqpEeNabqhPAVvLPFPjnLlpczkRc6DCqNVp83/tFxzWu/4mvKpudWXVWzueaKiopA7fpNHdb8YY7iFGt1dkNWjSEzO6lM3PS3j+dcbZZ4PvqpTpeertPxLl5ls01YuXLlbAfP56aoJClJbfIPb4pEfWnViyMzl765sboi3fbw7j92t63lv5KSckdPne1xTE5Vm7NqZk65wO5N9I8dTF8wa/AsYtNhRAR9AoVhUyItnn0ZqGb2jxQ0bugKi8HHlNBCjGZgxgkpStw4DBEDlLqqP4awCp6Xo3wFhQVnI4Iurs9g5LUXY5OJOtmIYXTwg2p4fxhoZNqNtHNeIfFAqgQdaQPqqRGfgIFZlLOxq+rIaRSDcuqE5w6O9aE838xIGGY5ThLMWkQWHwqfD4wDC2yCzBC+cNxGS2HVlBaElTiSA6YQcQsTRiPG7K6Ufo5HPk+wPnKK6H+oY7YlSMozixGdM17ACADsogRrJQd6k6NhuaSJ7s9ITs8LTR5SXT1k8pjqag35V3HRzCFDLps86bL09L5qZQziNCZur7cBFZ5J/WlDqlsmVw+pqASC5RK6Vz+kGm65bBL/TFZ6RvSRGB0qn9P+HBYzw3XOG5zL35aScxurfNEnFiy0nSFOMp4+C/Ok7dz2RRIl3NGmWCQNxRzr/xd+L33QnED/ZgOLnJsPPHUh5+EqWOy3OoyGqYmry0VGTtsZaf1/ySuTCHhpplZn7vksmvB/lU2c4dAJ4YHALudNYjHsEtZZRjzGSXytsUDAsjdo9rrjgiNnjG1IXG4sqo9SM40qLjydOMMHpryy6NiHCuCPeJQQCgrDgO1I+tV1x/iX86w9C29jIaucCUvx/EsQPaSYfwV6SjG/kfMvxNgRyw7YKCX2T3+/JL584ismxD5XAU+WHr/DHXRriE0DUF9WbgVwE2FPw7hC6EjUP3jocc9CRrIQyziLhUFtKE0cHfRQU/0CGvihU1xMJoFHg+BiSpKOrsp1pHuGuAsL3UOG5jUSz4whbndhExQMGizKi7qUFH6ULJfSp2R3cSBYWJg9JEia605mD3G3FbrdxeeMG/oMpbJvGZiAc3MpMa6UlorGoFk2OxP2QhXK/8t5pPDi3mN+X2JbaduBdQcO0O6B/a7GizV8VnLym6WyONvS6PE0ehKbXBUJV4XDiXvaNneYblJ+/srXmmsXf1+al19amp8HMOED7gMZCGIlHj5RviHncLt4/H6catDXSTz3tLXds4deSC/cw3JkH9lHf2Ah8lhkb8lzzknM9ZzFUY1fxPxJFb4fZ0QW9gr7XogXNtFmlt12LHAHzcjzIwRCrjqCVkEYlHhV26IIvh9NgRzpFNfSj2C5sQisnxz4fXQ4HEKqxCaLxwuKfclU54aZR2x6HfOsljEkLNwWPbKdn0sXRyIY8TOCsLTvRJj4oh9u5+dhBIpItEnVDLsE+ynsJb1OCAKaF21Os85mFnR6qE922kS3zia5v8BIdBvJWkD3azH3BYas20ivh4ZfDzmxlKzt2Tr4FABbPLWR3TrI38gMOO8XUuz/jtM8v6/Re/8N+3k+ZyLVqf+WJU2N4b0aaH1hDBs0AV/TzE3ipgJvMxO4m/7vlzDZIBO/KlJCm1ERE9YTJYwTfshkoACO+8PyeY12/ISeeE5etPu9bIt95MTDbFY6WdLXrk0rTtNq04ymVC1/KC29MD0tTVusTYt98QT+cWMx1eM5VC/jkdSI2DhcV+bxlNWFY2mPUQsVGHugOm2qqccA1aUbeoz4iB6tItVm0fLCCfvI4O8wJFBV54vYnRjFODFaN38y+rC4HiMas2RwuP++L/rjG/95IL6x2O/HNfAlLU6vDEOMiiRKsDadEENsYRR82QsqaUVlgR0Dd6FZXkRxRZRu6fGL66ZU2AsKCugB9PhGsViM3EB99Q3yCHkLdyHHBU0hKYjsaqDKik7GbuYWhyLUNAkjWSFTYVXJTFzF2PM0FssqIZ9EIrkdXR998lFXR44j66LR+SPqhg4JBaxlpcaUyrIWz5xUR+ucoUS4cUSWx5GTm54lprcEF44lpLCmoSTZNOHeO4aMnLV/u1ZOTnJqb3h8VMM9V2ilpCRn+uq7dt5wT46udvEV2zuuLKu7++6xRnuF352mzdxQmu02ZUgaonEOmVQ8YqNaMJW4h7vGpf55dEnSlGBeQ2VdYIyzboy2oLT9mdnJDm26nDz76SVr9kxR8pPuoCcpqr6BZvIAcbEX+Pv/NSYl+oyS+ASG7b/KY5RxSHWYV76OpExetsEM/l/zyIAgeYCTE787EItIeZ6krx2XAxwo9CTHLWByCxv3/+q6FuA2ijN8e3fS6WHLOr1j6SRZkvWwZVmWLQk/JL9ix07sEOJHnIdNnDqxE5OWJiQ4DpCAg0kIBdMEY8gAtkmYNn0QGmAMhpI+hgooDJQQk2mnDR3SyQCFBsJAY2vp7p5k7EBHo7ud092edNr99398//dfj0YS8e6nnPzp1Tc9d3ENOl2qpAIyB+mwjpS8dnxvsyf2m1hParOuI9WEZ69+glc2tBaMgCslQbfTnGE3C2Xr11ekmxvWpZtFxcyl/Pzld+xrXLxt3CeiXffNlYh8j5zLbC/1Wv1uoz6P9i9ul3ltuO2SUWL9RjG/CsdxHFQAWcRrKSqcEzZE4wztCbBcmGT7AjJe+Th2qEgMOI5A/DIGfDwAcATUQIDZeGhLjeRg9JqjzKXLHw++NrxMVpB3dPrvlwawFJm7IKkuntkcsMeead3cAKfVvkxkK/NetAWx9je6dAaFS88fG2rIU3o1vEJZqtl+9Xa9iWWdBsO7pzbXKXy8Rq5sSmRXrikYf+sTAAZ3nhm6gbNkE5L5udc3N4QMuWBXtcNXPKNFPaP+M6W82gcPlLpMEpdXL2HN7UV1vFyh9PHrZhrDOtaJBDPLmnbX9qOeFT7NYNrGSOOMMVsEzyHpgpZ0su7q5UCPlD22iVgZOCxF6pDCs6P0vQn4Llq9sao/mtydQFZQfiJVEwL8hJNKY8RiATx+OfliHrC/FunbMf86+x7oQ+pBHxwDF6CdPQXt4EIK8yzaO99eW4zZnnAeMA5M4llAfw3H0BVj6Gp0FeoF9bDoWvTPa8VrE8wlQhCGtvh88Y7Xnpu6DyebM5GbXEI/qS99ixQOG6cYYcwzUuCRQpjA4xkbc5huGE/eVAx4nj83gBFX4rnAKtWpJCLOH40XabgkwJBhpdXhFOP0cVY8TCLtRsP8DdgvZUJtVWPE5Yo0VtUKMpnSqZSptQpNeTCeZy1tXOOXadVq92hhuDVbD+RyRybHa6VCpMDhKIgIUi36VW7tg6XW9BdlVjIqf3T9ttGnRretj/pVDGvTumUSmcffvOb2uo3Hb2w0MjK3W508V7+3Lp6JTE07+pxW+SLr+tZFfCoadYc6rRqqpzD0e4TwrJMaaJhSCkd7iM1Jz3+G5aeIxMaRkytpiyGFxUHv+dzSm9As9SHNYwPOR0l5T40p9ynhs8AeVMIWgpEaDIZqYGeBHGemYC4RjPWKanH0DhhEv2h03jEqwhqwuzyGnq+EJE6mi15wb29uHrNYnC7i+WxuWi5YXI7rtzCfH9IYDMGkOngjf0jjD9L/Meg91ckV9GeCKlN5SFEqJHnBrDzEeY1K+oUwdmq2lpYTr6bNE2osYewljS2a2dN+Wwtj8tvmLtj8ktWi17K5acW82xLdqrmpUQC22V+BgcJgAA1c3l8IDxZ18fBTWYCxwc+UFosAD1osSqBBdwUDBvNszIe9keWlrcQduSWj2gdvxvUfn7ZWrwIjNj+8eMbm9+MxuYU6yK3mbkWaeynS5yhAsGcgLrEiASYHVlbKIflNA7RRATQCSYQKwyPjtAediwsyRokIZJ/XZ2dozUCtzFGZMvUaU5YeiYIpvS+cu0SizSlZY/knvNe3qa0pv69308YqK5jara6utRsPd98s2POzTLNafRZPGzLyFEDjK/DpJAM6s9dlBlqlU6VnWIVapYMqMGWp7Ozu3VrQ1NLrht/ASWFNxMrTZlfYrQdTk8ZMv914X/ctNntNNT93t15tWqKyZHoVQO3hnHpRR6OoD7i3CRdaORpJ/dROisI8AwQnKgaCc8B385m+ZbeqBItynzCEH3N9z+c5hRZegk6WpAjR8FDzxAElEl84uLdXvDK88XGv19ew0zSnYOoUgGbQi5YxGXJVpkZj0GvUqgyFHK0dNKAB0nJstqBgNKkywLNlwcLobfuvCxaazRq6yOuwVZTmecvKbMjSVILaHRMTO/pX5YYDOcPQ3zvS2zsiPT67aviVre3q1hpmj8loNsrUnMyoNGSps2RyuUyVocvSIP1GxrESn89tMSuUfFby8I6iTVZb62qrtTBYvEOikkulnATJKSYzg+EmPpxovq629AfW5cg6xLfopVI5lUrpB1Q11UiYdQmQuzhkZXA5Zw4H7YwY4BSg8bNTIGW0RIOGj9tpl+BK8AZjgMGnudJ5H8y6QkfHDeC6RJtvZduyGP/k668Ola340e9cDnlFOdf9WHttzfbRWpjReSxxblvnWvgK/MrSs//w8s6Tpaa1O3ZV/XhDDcijg4QQUfqByjPzQPOYNrRy3w1da9V18bITx1x9v93troEz8K6L4yB0+Y1hZ9bv+ydvDNRVrNoVszg7D84VE9NKzOWkCAbZQZXguuyLq5+S8CWxeOLAjn+kAADxkqe8FkZ9cTgiDczzbpDSrfAsod+oddng6ZzyismK8pycyHiEbVqYPyyWfevpwRwcO2OPHEokPwrGWsrLyspbYsGQ6fx5U2p9NhAuB1zNIkJUbFakJsSJ8zjTCvNRRTBOC6Dlkv1aZc7LzaQFk4XvKAT+gmhPKKSOWOd+eE4AxQZ1ZPZT7LCh5aqV+dza6zc2ZLnj0QIznJyYdMeZAwJ41W/1JH85dxuxP17jbpI+SZmQ5hugakiGhlEMXmOyo0rg9qCJkBMyIlsQ4IcRJQVnAGbVx/hJTpobNRjRLsfhiaJp40KfO9xyPAelU2pBuPqN0CLwgvDEv2/d88Vl4Hn6xKdCa7LDYXtWt8SjKJr7a99r+5u3P7J3D/uvjY92oFPg+fbu/rjqS/Do1qV7aGnyHbSg7NotHeZRP1ehIOD9+MOffzX2cMVnAlydW5zvPq3lGMDCoy8M7O87MH6Lt71jw8a7TqMzNP2Sz1/a08Em/wJGju/aLdZj3ITsrW2YA3K+oqXT4fLkYowJwXBhGWKU8Ebsa5kGDReHhi7CqelPYP8+wLTBByeBfmICfjw5kmx7Pvmzl+8Ed3Hb7v8CPgdH4HNf3D8zNbbz4AmkU1UA/YnhnQ8n6Jcef+oMktN3UNNcG6en5FS2WFHCbRejeQCTlGCi1YgGyWP0YF04pIfEODbBNJKBVGmhj2b/vKzbo/VFp9/seaC9xbf/yDizYwRUtYRBf1f9+JH9vpZ2yd0nPsZR84/gn7x3Hhmv7+oH4RZQNVKPLkw6Wtof6HlzOurTerrrR+CZRZg2LUYIXovKAdoc86JpEPreLK4KJ3zfeT7XlXuvO9ftPvj9WL336OHkIDzljMWdTqejMuZ0/F+8SbrGDXpLFuy/rWqD8R/gikgMv7Cdrh9LIOjiJp0HN4rmfhmJxYXjbHGItaF/CBs9oBCpcH5V0bHH/rHlSdDV2QUzBnsDa/R6qSqRot5YkkhWJ5fJQ4ZlJhO4TPq7QvVIbuW2kup0fC6D8yCRqGRyGB2SjHSYxxSSOCUSqUxDoHMvGOwC8BdgqdtTB0+CzsFBaS8AAELdQ5tCm47qIITfNMOj4KZmgPqmtfjoQ4vqWS2ok0HwKQveuPRegthNHantCIldXcEQGczwj70FGG8HrmC4DswQ8/xo6j7qj1whh6sLYZkjjjikrVJIXSAqQgQdZMWYIdIc3JyPkaqyTTGtZn1yZm+gNbuw5OU/5A+Dwf8eqlmdaysPLn2mshgsbXr3vLRfbm1YYsyQSgrgPfeUvPhyNKBryR+mS66+k7+1u3ODI5RRG/3bsvpKBYVzlkUbzr6gJoUdfSMf8SOnKsEiY0USduq1JJlcQra5IAWl4yUkQuHUS47ANtjWiN2SPbAf7hIhdQnz/FHmifkmjt8g620Ab5HhzJ5KSDCy/XAjeB4u/xD+HKxfDrrg5FsnT8Lt88cb51uJdP09cX81XXuBepHwGh5P1WqSEnWfFSlkkKzUEOgZ0lXwQwaY649+f6Ech2fTcpz56TkBvonkOKtBXV8rxkEXFuNztwmwDIlxupU5QM1z4h9P4Zgw+VIYMzlJj6dKMGOaXLLH9tL/AIxzQ2cAAHjaY2BkYGBgZOzcvTpCNJ7f5isDN/sFoAjDxavXJJFp9gtgcQ4GJhAPAGEpC8MAAHjaY2BkYGC/8P8GiGRgAJOMDCiAkQUAdcoEZAB42mP8wgAGTLMYGBiBbPYLDCnsFxh1gPR3ID6BxH8F4YPZE4C0CEQOjk8gyTOg0aFoatEw4wSIOnTMrMB+gWkPKgbZweQEpG8g3IfsBsYVUHoCmhwDFjZI/zGgeRFY3HUC4kew+08gaBgG6WE8A3U7CKtguh+uHuTHL1BzvqCGFczvsHBGtwfFzAmoZqKHPcNxNLEsoJ4uVDeDzeQE0r5APAPNLjM0d01AsysPiDmRwhCGJwLxRix+g+GfaOLbkMIQyc/ofJj5cP48JDOAdjEeQgtjkHs3AHEAkG0EDY/jaH78ghnGGPGLnjZDoOLCUDftBeKFiHSGEi9IYtgww3k0+1LQ7ETKQ2AMTaPo7oX75QtUXRpCPYrZIFyHFv6weOqB6tkFEmeKYGAAANkHWesAAAAAJgAmACYALgCGAKgA1AE+AZABqAHuAi4CkgLIAxADXAOSA9QEHASYBM4FCgUyBfIGHAZkBpIGzgcSB0YHqAfaCDgIUgh4CJYIwgjsCQgJFgkkCTIJQAlOCawJwgnuCi4KZAqCCpYK1Ar2Cy4LdgvoDEwMkAzEDPwNNg1mDZYNxA3yDh4OYA6gDswPGg9+D+AQBBA0EH4QxBDyEQ4RShFkEaISQBKIEqoSzBLuExgTqhPmFFIUfBScFLgVDBVUFZgWDhZQFpAW0hc0F8oYRBi4GNwY+BkOGU4ZiBniGigaYBqGGqoa5hs0G4ocPBxsHLwc7h02HWwdjh2yHkAeeB7WHvgfdB+2IAogbiC0INYg+CEQIZAhzCImIpoiuCNiI9IkWCSKJNIk7iUQJUIlkCWsJdwl/iaaJ0InxigSKCwoQihcKHIojCiiKLwo0ikKKSgp5CpKKrQriivmLIwtCC1SLaot5i4SLiAuoi7mLxgvTC+iL+IwSDCaMMYw8jEuMWQxfDGeMeQyujLoMzIzTjPQNBw0YDTWNUA2YDaMNxg3UDeMN8w4LDh0OJY5BDlIOZQ5rDnWOiQ6fjq2Ouo7EjtIO6g8Ojx0PKo9MD2cPhI+pj7OPuw/Cj8gPzY/Sj/CP9A/5kCUQQxBukIoQnZCtEMsQ2hDskPyRCZETkSCRLBE9EVaRZhFsEWwAAB42mNgZGBgZGHYwCDIAAJMQMwIhAwMDmA+AwAVeAEMAHjajVLJTgJBEH0zoJHEcPDgwXiY6EVNWMSALFeXRIkhGsXrIMMSEQYYFhOPfoEf4ne4XLx68RuMH2B81dMQwlxMpadfvX5V1V01AKJ4RghGOALgi8vHBlbo+dik5lvjELL41TiMDSOj8QLGxrXGi+Q/NI5gx/jReBlr5rrGL1g1J7GvSJpFjd+wZD5o/I6o+ejjzxBjn3CMEoqwMISDHvpoooM2/RRXh4wFm/499xaRp1RB9YjIQ4OophiPyMEYN/y69Ca6LWo8mos8ErSRsjjqPB1wl4p18i1GSGybNRyuBFmXbIz5bXSplDx3ZDZxpCseBupt44DqPrWSraOynVNRZy15TQ+7zJSkZVDAJU5RxhlRMCo2FxdUWHOKq7kOzVYq4YKMeLNsg0pP5xtOI+LY57fAt9q4ZU7R1MhKhyqcUhxptbLYo5f7x93LqstV3qKneit3ryrUVHOw1JRtVhxppTtVTiZUpl+ZmbV/V2Gr9E5ULfmHUuosx2kLzqsXCy97Wr1H5uXqXjmM60/nabFLXTJNnkn91h+P6YatAAAAeNptlGV0XFUYRbNDocXd3R0y97v3vTc4FFLc3a3QQilFSilW3N3d3a24u7u7u7uXVbLzj/mRs2bl3X0nJ2dPR2fHf68xoztSx/+86DP2R0cnnYxDH8ZlPPrSj/GZgAmZiImZhEmZjMmZgimZiqmZhmmZjumZgRmZiZmZhVmZjdmZgzmZi7mZh3mZj/lZgAVZiIVZhEXpokUiyBQqahraLMbiLMGSLMXSLMOyLEd/lmcFuhnAiqzEyqzCqqzG6qzBmqzF2qzDuqzH+mzAhmzExmzCpmzG5mzBlmzF1mzDtgxkO7ZnEIPZgR0Zwk4MZWeGsQu7shu7M5w9GMGejGQv9mYf9mU/RrE/B3AgB3Ewh3Aoh3E4R3AkR3E0x3Asx3E8J3AiJ3Eyp3Aqp3E6Z3AmZ3E253Au53E+F3AhF3Exl3Apl3E5V3AlV3E113At13E9N3AjN3Ezo7mFW7mN27mDO7mLu7mHe7mP+3mAB3mIh3mER3mMx3mCJ3mKp3mGZ3mO53mBF3mJl3mFV3mN13mDN3mLt3mHd3mP9/mAD/mIj/mET/mMz/mCL/mKr/mGb/mO7/mBH/mJn/mFX/mN3/mDP/mLv/mHMZ1j//2dfYcPHZxKd/+x2d3q6jJbZjLDzGYxK7M2G7Pdky15LXkteS15LTktOS05LTktOUlOkpPkJDlJTpKT5CQ5SU7ICc+H58O/K+SEnPB8eD57Pvs5spwsJ3s+e3/2fPH3xXuKzxXvKT5fep/3vsr7Ku+r5FRyKjmVnEpOJaeSU3u+9vPWcmo5tZxaTi2nllPLafw8jbxGXiOvkdf08JJ7Su4puaPkjlJX73OVWZuN2XNvckfJHSV3lNxRaslzT8k9JfeU3FNyT8k9JfeU3FNyTynJc1fJXSV3ldxVclfJXaWQ576S+0ruK7mv5L5SyHNnyZ0ld5bcV9hfdPW+DzObxazM2mzMHm7YY9hj2GPYY9hj2GPYY9hj2GPYY9hj2GPYY9hj2GPYY9hj2GPYY9hj2GPYY9hj2GPYY9hj2GPYY9hj2GPYY+hr9Papr5Hl6W1kefob+hu5h5d9n3vfly6zZSYzzGwWszJrU46e58rzep71POt51vOs51nPs57nWo6+Z33P+p71Pet71ves71nfs75nfc/6nvU963vW96zvuZHXyGvkNfLa8try2vLa8try2vLa8try2vLaPbzi90vRj6IfRT+KfhS9KHpR9KLoRdGLohdFL4peFL0oelH0ouhF0YuiF0Uvil4UvSh6UfSi6EXRi6IXRS+KXhS9KHpR9KHoQ9GHog9FH4o+FD0oelD0oOToN3TgiAFDRg4b9C8VmLmgAAAAAVWwJZkAAA==) format('woff'),\n\t\turl(../fonts/dashicons.ttf) format(\"truetype\"),\n\t\turl(../fonts/dashicons.svg#dashicons) format(\"svg\");\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\n.dashicons,\n.dashicons-before:before {\n\tdisplay: inline-block;\n\twidth: 20px;\n\theight: 20px;\n\tfont-size: 20px;\n\tline-height: 1;\n\tfont-family: dashicons;\n\ttext-decoration: inherit;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tvertical-align: top;\n\ttext-align: center;\n\t-webkit-transition: color .1s ease-in 0;\n\ttransition: color .1s ease-in 0;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* Admin Menu Icons */\n\n.dashicons-menu:before {\n\tcontent: \"\\f333\";\n}\n\n.dashicons-admin-site:before {\n\tcontent: \"\\f319\";\n}\n\n.dashicons-dashboard:before {\n\tcontent: \"\\f226\";\n}\n\n.dashicons-admin-media:before {\n\tcontent: \"\\f104\";\n}\n\n.dashicons-admin-page:before {\n\tcontent: \"\\f105\";\n}\n\n.dashicons-admin-comments:before {\n\tcontent: \"\\f101\";\n}\n\n.dashicons-admin-appearance:before {\n\tcontent: \"\\f100\";\n}\n\n.dashicons-admin-plugins:before {\n\tcontent: \"\\f106\";\n}\n\n.dashicons-admin-users:before {\n\tcontent: \"\\f110\";\n}\n\n.dashicons-admin-tools:before {\n\tcontent: \"\\f107\";\n}\n\n.dashicons-admin-settings:before {\n\tcontent: \"\\f108\";\n}\n\n.dashicons-admin-network:before {\n\tcontent: \"\\f112\";\n}\n\n.dashicons-admin-generic:before {\n\tcontent: \"\\f111\";\n}\n\n.dashicons-admin-home:before {\n\tcontent: \"\\f102\";\n}\n\n.dashicons-admin-collapse:before {\n\tcontent: \"\\f148\";\n}\n\n.dashicons-filter:before {\n\tcontent: \"\\f536\";\n}\n\n.dashicons-admin-customizer:before {\n\tcontent: \"\\f540\";\n}\n\n.dashicons-admin-multisite:before {\n\tcontent: \"\\f541\";\n}\n\n\n/* Both Admin Menu and Post Formats */\n\n.dashicons-admin-links:before,\n.dashicons-format-links:before {\n\tcontent: \"\\f103\";\n}\n\n.dashicons-admin-post:before,\n.dashicons-format-standard:before {\n\tcontent: \"\\f109\";\n}\n\n\n/* Post Format Icons */\n\n.dashicons-format-image:before {\n\tcontent: \"\\f128\";\n}\n\n.dashicons-format-gallery:before {\n\tcontent: \"\\f161\";\n}\n\n.dashicons-format-audio:before {\n\tcontent: \"\\f127\";\n}\n\n.dashicons-format-video:before {\n\tcontent: \"\\f126\";\n}\n\n.dashicons-format-chat:before {\n\tcontent: \"\\f125\";\n}\n\n.dashicons-format-status:before {\n\tcontent: \"\\f130\";\n}\n\n.dashicons-format-aside:before {\n\tcontent: \"\\f123\";\n}\n\n.dashicons-format-quote:before {\n\tcontent: \"\\f122\";\n}\n\n\n/* Welcome Screen Icons */\n\n.dashicons-welcome-write-blog:before,\n.dashicons-welcome-edit-page:before {\n\tcontent: \"\\f119\";\n}\n\n.dashicons-welcome-add-page:before {\n\tcontent: \"\\f133\";\n}\n\n.dashicons-welcome-view-site:before {\n\tcontent: \"\\f115\";\n}\n\n.dashicons-welcome-widgets-menus:before {\n\tcontent: \"\\f116\";\n}\n\n.dashicons-welcome-comments:before {\n\tcontent: \"\\f117\";\n}\n\n.dashicons-welcome-learn-more:before {\n\tcontent: \"\\f118\";\n}\n\n\n/* Image Editing Icons */\n\n.dashicons-image-crop:before {\n\tcontent: \"\\f165\";\n}\n\n.dashicons-image-rotate:before {\n\tcontent: \"\\f531\";\n}\n\n\n.dashicons-image-rotate-left:before {\n\tcontent: \"\\f166\";\n}\n\n.dashicons-image-rotate-right:before {\n\tcontent: \"\\f167\";\n}\n\n.dashicons-image-flip-vertical:before {\n\tcontent: \"\\f168\";\n}\n\n.dashicons-image-flip-horizontal:before {\n\tcontent: \"\\f169\";\n}\n\n.dashicons-image-filter:before {\n\tcontent: \"\\f533\";\n}\n\n\n/* Both Image Editing and TinyMCE */\n\n.dashicons-undo:before {\n\tcontent: \"\\f171\";\n}\n\n.dashicons-redo:before {\n\tcontent: \"\\f172\";\n}\n\n/* TinyMCE Icons */\n\n.dashicons-editor-bold:before {\n\tcontent: \"\\f200\";\n}\n\n.dashicons-editor-italic:before {\n\tcontent: \"\\f201\";\n}\n\n.dashicons-editor-ul:before {\n\tcontent: \"\\f203\";\n}\n\n.dashicons-editor-ol:before {\n\tcontent: \"\\f204\";\n}\n\n.dashicons-editor-quote:before {\n\tcontent: \"\\f205\";\n}\n\n.dashicons-editor-alignleft:before {\n\tcontent: \"\\f206\";\n}\n\n.dashicons-editor-aligncenter:before {\n\tcontent: \"\\f207\";\n}\n\n.dashicons-editor-alignright:before {\n\tcontent: \"\\f208\";\n}\n\n.dashicons-editor-insertmore:before {\n\tcontent: \"\\f209\";\n}\n\n.dashicons-editor-spellcheck:before {\n\tcontent: \"\\f210\";\n}\n\n.dashicons-editor-distractionfree:before,\n.dashicons-editor-expand:before {\n\tcontent: \"\\f211\";\n}\n\n.dashicons-editor-contract:before {\n\tcontent: \"\\f506\";\n}\n\n.dashicons-editor-kitchensink:before {\n\tcontent: \"\\f212\";\n}\n\n.dashicons-editor-underline:before {\n\tcontent: \"\\f213\";\n}\n\n.dashicons-editor-justify:before {\n\tcontent: \"\\f214\";\n}\n\n.dashicons-editor-textcolor:before {\n\tcontent: \"\\f215\";\n}\n\n.dashicons-editor-paste-word:before {\n\tcontent: \"\\f216\";\n}\n\n.dashicons-editor-paste-text:before {\n\tcontent: \"\\f217\";\n}\n\n.dashicons-editor-removeformatting:before {\n\tcontent: \"\\f218\";\n}\n\n.dashicons-editor-video:before {\n\tcontent: \"\\f219\";\n}\n\n.dashicons-editor-customchar:before {\n\tcontent: \"\\f220\";\n}\n\n.dashicons-editor-outdent:before {\n\tcontent: \"\\f221\";\n}\n\n.dashicons-editor-indent:before {\n\tcontent: \"\\f222\";\n}\n\n.dashicons-editor-help:before {\n\tcontent: \"\\f223\";\n}\n\n.dashicons-editor-strikethrough:before {\n\tcontent: \"\\f224\";\n}\n\n.dashicons-editor-unlink:before {\n\tcontent: \"\\f225\";\n}\n\n.dashicons-editor-rtl:before {\n\tcontent: \"\\f320\";\n}\n\n.dashicons-editor-break:before {\n\tcontent: \"\\f474\";\n}\n\n.dashicons-editor-code:before {\n\tcontent: \"\\f475\";\n}\n\n.dashicons-editor-paragraph:before {\n\tcontent: \"\\f476\";\n}\n\n.dashicons-editor-table:before {\n\tcontent: \"\\f535\";\n}\n\n/* Post Icons */\n\n.dashicons-align-left:before {\n\tcontent: \"\\f135\";\n}\n\n.dashicons-align-right:before {\n\tcontent: \"\\f136\";\n}\n\n.dashicons-align-center:before {\n\tcontent: \"\\f134\";\n}\n\n.dashicons-align-none:before {\n\tcontent: \"\\f138\";\n}\n\n.dashicons-lock:before {\n\tcontent: \"\\f160\";\n}\n\n.dashicons-unlock:before {\n\tcontent: \"\\f528\";\n}\n\n.dashicons-calendar:before {\n\tcontent: \"\\f145\";\n}\n\n.dashicons-calendar-alt:before {\n\tcontent: \"\\f508\";\n}\n\n.dashicons-visibility:before {\n\tcontent: \"\\f177\";\n}\n\n.dashicons-hidden:before {\n\tcontent: \"\\f530\";\n}\n\n.dashicons-post-status:before {\n\tcontent: \"\\f173\";\n}\n\n.dashicons-edit:before {\n\tcontent: \"\\f464\";\n}\n\n.dashicons-post-trash:before,\n.dashicons-trash:before {\n\tcontent: \"\\f182\";\n}\n\n.dashicons-sticky:before {\n\tcontent: \"\\f537\";\n}\n\n\n/* Sorting */\n\n.dashicons-external:before {\n\tcontent: \"\\f504\";\n}\n\n.dashicons-arrow-up:before {\n\tcontent: \"\\f142\";\n}\n\n.dashicons-arrow-down:before {\n\tcontent: \"\\f140\";\n}\n\n.dashicons-arrow-left:before {\n\tcontent: \"\\f141\";\n}\n\n.dashicons-arrow-right:before {\n\tcontent: \"\\f139\";\n}\n\n.dashicons-arrow-up-alt:before {\n\tcontent: \"\\f342\";\n}\n\n.dashicons-arrow-down-alt:before {\n\tcontent: \"\\f346\";\n}\n\n.dashicons-arrow-left-alt:before {\n\tcontent: \"\\f340\";\n}\n\n.dashicons-arrow-right-alt:before {\n\tcontent: \"\\f344\";\n}\n\n.dashicons-arrow-up-alt2:before {\n\tcontent: \"\\f343\";\n}\n\n.dashicons-arrow-down-alt2:before {\n\tcontent: \"\\f347\";\n}\n\n.dashicons-arrow-left-alt2:before {\n\tcontent: \"\\f341\";\n}\n\n.dashicons-arrow-right-alt2:before {\n\tcontent: \"\\f345\";\n}\n\n.dashicons-leftright:before {\n\tcontent: \"\\f229\";\n}\n\n.dashicons-sort:before {\n\tcontent: \"\\f156\";\n}\n\n.dashicons-randomize:before {\n\tcontent: \"\\f503\";\n}\n\n.dashicons-list-view:before {\n\tcontent: \"\\f163\";\n}\n\n.dashicons-exerpt-view:before, /* Misspelled. Use .dashicons-excerpt-view instead. */\n.dashicons-excerpt-view:before {\n\tcontent: \"\\f164\";\n}\n\n.dashicons-grid-view:before {\n\tcontent: \"\\f509\";\n}\n\n\n/* WPorg specific icons: Jobs, Profiles, WordCamps */\n\n.dashicons-hammer:before {\n\tcontent: \"\\f308\";\n}\n\n.dashicons-art:before {\n\tcontent: \"\\f309\";\n}\n\n.dashicons-migrate:before {\n\tcontent: \"\\f310\";\n}\n\n.dashicons-performance:before {\n\tcontent: \"\\f311\";\n}\n\n.dashicons-universal-access:before {\n\tcontent: \"\\f483\";\n}\n\n.dashicons-universal-access-alt:before {\n\tcontent: \"\\f507\";\n}\n\n.dashicons-tickets:before {\n\tcontent: \"\\f486\";\n}\n\n.dashicons-nametag:before {\n\tcontent: \"\\f484\";\n}\n\n.dashicons-clipboard:before {\n\tcontent: \"\\f481\";\n}\n\n.dashicons-heart:before {\n\tcontent: \"\\f487\";\n}\n\n.dashicons-megaphone:before {\n\tcontent: \"\\f488\";\n}\n\n.dashicons-schedule:before {\n\tcontent: \"\\f489\";\n}\n\n\n/* Internal/Products */\n\n.dashicons-wordpress:before {\n\tcontent: \"\\f120\";\n}\n\n.dashicons-wordpress-alt:before {\n\tcontent: \"\\f324\";\n}\n\n.dashicons-pressthis:before {\n\tcontent: \"\\f157\";\n}\n\n.dashicons-update:before {\n\tcontent: \"\\f463\";\n}\n\n.dashicons-screenoptions:before {\n\tcontent: \"\\f180\";\n}\n\n.dashicons-cart:before {\n\tcontent: \"\\f174\";\n}\n\n.dashicons-feedback:before {\n\tcontent: \"\\f175\";\n}\n\n.dashicons-cloud:before {\n\tcontent: \"\\f176\";\n}\n\n.dashicons-translation:before {\n\tcontent: \"\\f326\";\n}\n\n\n/* Taxonomies */\n\n.dashicons-tag:before {\n\tcontent: \"\\f323\";\n}\n\n.dashicons-category:before {\n\tcontent: \"\\f318\";\n}\n\n\n/* Widget icons */\n\n.dashicons-archive:before {\n\tcontent: \"\\f480\";\n}\n\n.dashicons-tagcloud:before {\n\tcontent: \"\\f479\";\n}\n\n.dashicons-text:before {\n\tcontent: \"\\f478\";\n}\n\n\n/* Media icons */\n\n.dashicons-media-archive:before {\n\tcontent: \"\\f501\";\n}\n\n.dashicons-media-audio:before {\n\tcontent: \"\\f500\";\n}\n\n.dashicons-media-code:before {\n\tcontent: \"\\f499\";\n}\n\n.dashicons-media-default:before {\n\tcontent: \"\\f498\";\n}\n\n.dashicons-media-document:before {\n\tcontent: \"\\f497\";\n}\n\n.dashicons-media-interactive:before {\n\tcontent: \"\\f496\";\n}\n\n.dashicons-media-spreadsheet:before {\n\tcontent: \"\\f495\";\n}\n\n.dashicons-media-text:before {\n\tcontent: \"\\f491\";\n}\n\n.dashicons-media-video:before {\n\tcontent: \"\\f490\";\n}\n\n.dashicons-playlist-audio:before {\n\tcontent: \"\\f492\";\n}\n\n.dashicons-playlist-video:before {\n\tcontent: \"\\f493\";\n}\n\n.dashicons-controls-play:before {\n\tcontent: \"\\f522\";\n}\n\n.dashicons-controls-pause:before {\n\tcontent: \"\\f523\";\n}\n\n.dashicons-controls-forward:before {\n\tcontent: \"\\f519\";\n}\n\n.dashicons-controls-skipforward:before {\n\tcontent: \"\\f517\";\n}\n\n.dashicons-controls-back:before {\n\tcontent: \"\\f518\";\n}\n\n.dashicons-controls-skipback:before {\n\tcontent: \"\\f516\";\n}\n\n.dashicons-controls-repeat:before {\n\tcontent: \"\\f515\";\n}\n\n.dashicons-controls-volumeon:before {\n\tcontent: \"\\f521\";\n}\n\n.dashicons-controls-volumeoff:before {\n\tcontent: \"\\f520\";\n}\n\n\n/* Alerts/Notifications/Flags */\n\n.dashicons-yes:before {\n\tcontent: \"\\f147\";\n}\n\n.dashicons-no:before {\n\tcontent: \"\\f158\";\n}\n\n.dashicons-no-alt:before {\n\tcontent: \"\\f335\";\n}\n\n.dashicons-plus:before {\n\tcontent: \"\\f132\";\n}\n\n.dashicons-plus-alt:before {\n\tcontent: \"\\f502\";\n}\n\n.dashicons-plus-alt2:before {\n\tcontent: \"\\f543\";\n}\n\n.dashicons-minus:before {\n\tcontent: \"\\f460\";\n}\n\n.dashicons-dismiss:before {\n\tcontent: \"\\f153\";\n}\n\n.dashicons-marker:before {\n\tcontent: \"\\f159\";\n}\n\n.dashicons-star-filled:before {\n\tcontent: \"\\f155\";\n}\n\n.dashicons-star-half:before {\n\tcontent: \"\\f459\";\n}\n\n.dashicons-star-empty:before {\n\tcontent: \"\\f154\";\n}\n\n.dashicons-flag:before {\n\tcontent: \"\\f227\";\n}\n\n.dashicons-info:before {\n\tcontent: \"\\f348\";\n}\n\n.dashicons-warning:before {\n\tcontent: \"\\f534\";\n}\n\n\n/* Social Icons */\n\n.dashicons-share:before {\n\tcontent: \"\\f237\";\n}\n\n.dashicons-share1:before {\n\tcontent: \"\\f237\";\n}\n\n.dashicons-share-alt:before {\n\tcontent: \"\\f240\";\n}\n\n.dashicons-share-alt2:before {\n\tcontent: \"\\f242\";\n}\n\n.dashicons-twitter:before {\n\tcontent: \"\\f301\";\n}\n\n.dashicons-rss:before {\n\tcontent: \"\\f303\";\n}\n\n.dashicons-email:before {\n\tcontent: \"\\f465\";\n}\n\n.dashicons-email-alt:before {\n\tcontent: \"\\f466\";\n}\n\n.dashicons-facebook:before {\n\tcontent: \"\\f304\";\n}\n\n.dashicons-facebook-alt:before {\n\tcontent: \"\\f305\";\n}\n\n.dashicons-networking:before {\n\tcontent: \"\\f325\";\n}\n\n.dashicons-googleplus:before {\n\tcontent: \"\\f462\";\n}\n\n\n/* Misc/CPT */\n\n.dashicons-location:before {\n\tcontent: \"\\f230\";\n}\n\n.dashicons-location-alt:before {\n\tcontent: \"\\f231\";\n}\n\n.dashicons-camera:before {\n\tcontent: \"\\f306\";\n}\n\n.dashicons-images-alt:before {\n\tcontent: \"\\f232\";\n}\n\n.dashicons-images-alt2:before {\n\tcontent: \"\\f233\";\n}\n\n.dashicons-video-alt:before {\n\tcontent: \"\\f234\";\n}\n\n.dashicons-video-alt2:before {\n\tcontent: \"\\f235\";\n}\n\n.dashicons-video-alt3:before {\n\tcontent: \"\\f236\";\n}\n\n.dashicons-vault:before {\n\tcontent: \"\\f178\";\n}\n\n.dashicons-shield:before {\n\tcontent: \"\\f332\";\n}\n\n.dashicons-shield-alt:before {\n\tcontent: \"\\f334\";\n}\n\n.dashicons-sos:before {\n\tcontent: \"\\f468\";\n}\n\n.dashicons-search:before {\n\tcontent: \"\\f179\";\n}\n\n.dashicons-slides:before {\n\tcontent: \"\\f181\";\n}\n\n.dashicons-analytics:before {\n\tcontent: \"\\f183\";\n}\n\n.dashicons-chart-pie:before {\n\tcontent: \"\\f184\";\n}\n\n.dashicons-chart-bar:before {\n\tcontent: \"\\f185\";\n}\n\n.dashicons-chart-line:before {\n\tcontent: \"\\f238\";\n}\n\n.dashicons-chart-area:before {\n\tcontent: \"\\f239\";\n}\n\n.dashicons-groups:before {\n\tcontent: \"\\f307\";\n}\n\n.dashicons-businessman:before {\n\tcontent: \"\\f338\";\n}\n\n.dashicons-id:before {\n\tcontent: \"\\f336\";\n}\n\n.dashicons-id-alt:before {\n\tcontent: \"\\f337\";\n}\n\n.dashicons-products:before {\n\tcontent: \"\\f312\";\n}\n\n.dashicons-awards:before {\n\tcontent: \"\\f313\";\n}\n\n.dashicons-forms:before {\n\tcontent: \"\\f314\";\n}\n\n.dashicons-testimonial:before {\n\tcontent: \"\\f473\";\n}\n\n.dashicons-portfolio:before {\n\tcontent: \"\\f322\";\n}\n\n.dashicons-book:before {\n\tcontent: \"\\f330\";\n}\n\n.dashicons-book-alt:before {\n\tcontent: \"\\f331\";\n}\n\n.dashicons-download:before {\n\tcontent: \"\\f316\";\n}\n\n.dashicons-upload:before {\n\tcontent: \"\\f317\";\n}\n\n.dashicons-backup:before {\n\tcontent: \"\\f321\";\n}\n\n.dashicons-clock:before {\n\tcontent: \"\\f469\";\n}\n\n.dashicons-lightbulb:before {\n\tcontent: \"\\f339\";\n}\n\n.dashicons-microphone:before {\n\tcontent: \"\\f482\";\n}\n\n.dashicons-desktop:before {\n\tcontent: \"\\f472\";\n}\n\n.dashicons-tablet:before {\n\tcontent: \"\\f471\";\n}\n\n.dashicons-smartphone:before {\n\tcontent: \"\\f470\";\n}\n\n.dashicons-phone:before {\n\tcontent: \"\\f525\";\n}\n\n.dashicons-smiley:before {\n\tcontent: \"\\f328\";\n}\n\n.dashicons-index-card:before {\n\tcontent: \"\\f510\";\n}\n\n.dashicons-carrot:before {\n\tcontent: \"\\f511\";\n}\n\n.dashicons-building:before {\n\tcontent: \"\\f512\";\n}\n\n.dashicons-store:before {\n\tcontent: \"\\f513\";\n}\n\n.dashicons-album:before {\n\tcontent: \"\\f514\";\n}\n\n.dashicons-palmtree:before {\n\tcontent: \"\\f527\";\n}\n\n.dashicons-tickets-alt:before {\n\tcontent: \"\\f524\";\n}\n\n.dashicons-money:before {\n\tcontent: \"\\f526\";\n}\n\n.dashicons-thumbs-up:before {\n\tcontent: \"\\f529\";\n}\n\n.dashicons-thumbs-down:before {\n\tcontent: \"\\f542\";\n}\n\n.dashicons-layout:before {\n\tcontent: \"\\f538\";\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/editor-rtl.css",
    "content": "/*------------------------------------------------------------------------------\n TinyMCE and Quicklinks toolbars\n------------------------------------------------------------------------------*/\n\n/* TinyMCE widgets/containers */\n\n.mce-container,\n.mce-container *,\n.mce-widget,\n.mce-widget * {\n\tcolor: inherit;\n\tfont-family: inherit;\n}\n\n/* TinyMCE windows */\n#mce-modal-block,\n#mce-modal-block.mce-fade {\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n.mce-window {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\t-webkit-font-smoothing: subpixel-antialiased;\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n.mce-window .mce-container-body.mce-abs-layout {\n\toverflow: visible;\n}\n\n.mce-window .mce-window-head {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\tpadding: 0;\n\tmin-height: 36px;\n}\n\n.mce-window .mce-window-head .mce-title {\n\tcolor: #444;\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tline-height: 36px;\n\tmargin: 0;\n\tpadding: 0 16px 0 36px;\n}\n\n.mce-window .mce-window-head .mce-close {\n\tcolor: transparent;\n\ttop: 0;\n\tleft: 0;\n\twidth: 36px;\n\theight: 36px;\n\tline-height: 36px;\n\ttext-align: center;\n}\n\n.mce-window .mce-window-head .mce-close:before {\n\tfont: normal 20px/36px dashicons;\n\ttext-align: center;\n\tcolor: #666;\n\twidth: 36px;\n\theight: 36px;\n\tdisplay: block;\n}\n\n.mce-window .mce-window-head .mce-close:hover:before {\n\tcolor: #00a0d2;\n}\n\n.mce-window .mce-window-head .mce-dragh {\n\twidth: -webkit-calc( 100% - 36px );\n\twidth: calc( 100% - 36px );\n}\n\n.mce-window .mce-foot {\n\tborder-top: 1px solid #dfdfdf;\n}\n\n.mce-textbox,\n.mce-checkbox i.mce-i-checkbox,\n#wp-link .query-results {\n\tborder: 1px solid #ddd;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\t-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.07);\n\tbox-shadow: inset 0 1px 2px rgba(0,0,0,0.07);\n\t-webkit-transition: .05s all ease-in-out;\n\ttransition: .05s all ease-in-out;\n}\n\n.mce-textbox:focus,\n.mce-textbox.mce-focus,\n.mce-checkbox:focus i.mce-i-checkbox,\n#wp-link .query-results:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 2px rgba(30,140,190,0.8);\n\tbox-shadow: 0 0 2px rgba(30,140,190,0.8);\n}\n\n.mce-window .mce-wp-help {\n\theight: 360px;\n\twidth: 460px;\n\toverflow: auto;\n}\n\n.mce-window .mce-wp-help * {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.mce-window .mce-wp-help > .mce-container-body {\n\twidth: auto !important;\n}\n\n.mce-window .wp-editor-help {\n\tpadding: 10px 20px 0 10px;\n}\n\n.mce-window .wp-editor-help h2,\n.mce-window .wp-editor-help p {\n\tmargin: 8px 0;\n\twhite-space: normal;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.mce-window .wp-editor-help table {\n\twidth: 100%;\n\tmargin-bottom: 20px;\n}\n\n.mce-window .wp-editor-help td,\n.mce-window .wp-editor-help th {\n\tfont-size: 13px;\n\tpadding: 5px;\n\tvertical-align: middle;\n\tword-wrap: break-word;\n\twhite-space: normal;\n}\n\n.mce-window .wp-editor-help th {\n\tfont-weight: bold;\n\tpadding-bottom: 0;\n}\n\n.mce-window .wp-editor-help kbd {\n\tfont-family: monospace;\n\tpadding: 2px 7px 3px;\n\tfont-weight: bold;\n\tmargin: 0;\n\tbackground: #eaeaea;\n\tbackground: rgba(0,0,0,0.08);\n}\n\n.mce-window .wp-help-header td {\n\tfont-weight: bold;\n\tpadding: 0 5px;\n}\n\n.mce-window .wp-help-th-center td:nth-child(odd),\n.mce-window .wp-help-th-center th:nth-child(odd) {\n    text-align: center;\n}\n\n/* TinyMCE menus */\n.mce-menu,\n.mce-floatpanel.mce-popover {\n\tborder-color: rgba(0,0,0,0.15);\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\t-webkit-box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 );\n\tbox-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 );\n}\n\n.mce-menu,\n.mce-floatpanel.mce-popover.mce-bottom {\n\tmargin-top: 2px;\n}\n\n.mce-floatpanel .mce-arrow {\n\tdisplay: none;\n}\n\n.mce-menu .mce-container-body {\n\tmin-width: 160px;\n}\n\n.mce-menu-item {\n\tborder: none;\n\tmargin-bottom: 2px;\n}\n\n.mce-menu-has-icons i.mce-ico {\n\tline-height: 20px;\n}\n\n/* TinyMCE panel */\ndiv.mce-panel {\n\tborder: 0;\n\tbackground: #fff;\n}\n\n.mce-panel.mce-menu {\n\tborder: 1px solid #ddd;\n}\n\ndiv.mce-tab {\n\tline-height: 13px;\n}\n\n/* TinyMCE toolbars */\ndiv.mce-toolbar-grp {\n\tborder-bottom: 1px solid #dedede;\n\tbackground: #f5f5f5;\n\tpadding: 0;\n\tposition: relative;\n}\n\ndiv.mce-inline-toolbar-grp {\n\tborder: 1px solid #a0a5aa;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\t-webkit-box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: 0 1px 3px rgba( 0, 0, 0, 0.15 );\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 8px;\n\tposition: absolute;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tmax-width: 98%;\n\tz-index: 100100; /* Same as the other TinyMCE \"panels\" */\n}\n\ndiv.mce-inline-toolbar-grp > div.mce-stack-layout {\n\tpadding: 1px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-up {\n\tmargin-bottom: 0;\n\tmargin-top: 8px;\n}\n\ndiv.mce-inline-toolbar-grp:before,\ndiv.mce-inline-toolbar-grp:after {\n\tposition: absolute;\n\tright: 50%;\n\tdisplay: block;\n\twidth: 0;\n\theight: 0;\n\tborder-style: solid;\n\tborder-color: transparent;\n\tcontent: \"\";\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-up:before {\n\ttop: -9px;\n\tborder-bottom-color: #a0a5aa;\n\tborder-width: 0 9px 9px;\n\tmargin-right: -9px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-down:before {\n\tbottom: -9px;\n\tborder-top-color: #a0a5aa;\n\tborder-width: 9px 9px 0;\n\tmargin-right: -9px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-up:after {\n\ttop: -8px;\n\tborder-bottom-color: #f5f5f5;\n\tborder-width: 0 8px 8px;\n\tmargin-right: -8px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-down:after {\n\tbottom: -8px;\n\tborder-top-color: #f5f5f5;\n\tborder-width: 8px 8px 0;\n\tmargin-right: -8px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-left:before,\ndiv.mce-inline-toolbar-grp.mce-arrow-left:after {\n\tmargin: 0;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-left:before {\n\tright: 20px;\n}\ndiv.mce-inline-toolbar-grp.mce-arrow-left:after {\n\tright: 21px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-right:before,\ndiv.mce-inline-toolbar-grp.mce-arrow-right:after {\n\tright: auto;\n\tmargin: 0;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-right:before {\n\tleft: 20px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-right:after {\n\tleft: 21px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-full {\n\tleft: 0;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-full > div {\n\twidth: 100%;\n\toverflow-x: auto;\n}\n\ndiv.mce-toolbar-grp > div {\n\tpadding: 3px;\n}\n\n.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first {\n\tpadding-left: 32px;\n}\n\n.mce-toolbar .mce-btn-group {\n\tmargin: 0;\n}\n\ndiv.mce-statusbar {\n\tborder-top: 1px solid #e5e5e5;\n}\n\ndiv.mce-path {\n\tpadding: 2px 10px;\n\tmargin: 0;\n}\n\n.mce-path,\n.mce-path-item,\n.mce-path .mce-divider {\n\tfont-size: 12px;\n}\n\n.mce-toolbar .mce-btn,\n.qt-dfw {\n\tborder-color: transparent;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: none;\n\tcursor: pointer;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn,\n.qt-dfw {\n\tborder: 1px solid transparent;\n\tmargin: 2px;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn:hover,\n.mce-toolbar .mce-btn-group .mce-btn:focus,\n.qt-dfw:hover,\n.qt-dfw:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n\t-webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\tbox-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\toutline: none;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-active,\n.mce-toolbar .mce-btn-group .mce-btn:active,\n.qt-dfw.active {\n\tbackground: #ebebeb;\n\tborder-color: #999;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.3 );\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover {\n\tborder-color: #555;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover i.mce-ico {\n\tcolor: #555;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover,\n.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus {\n\tcolor: #a0a5aa;\n\tbackground: none;\n\tborder-color: #ddd;\n\ttext-shadow: 0 1px 0 #fff;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mce-toolbar .mce-btn-group .mce-first,\n.mce-toolbar .mce-btn-group .mce-last {\n\tborder-color: transparent;\n}\n\n.mce-toolbar .mce-btn button,\n.qt-dfw {\n\tpadding: 2px 3px;\n\tline-height: normal;\n}\n\n.mce-toolbar .mce-listbox button {\n\tfont-size: 13px;\n\tline-height: 20px;\n\tpadding-right: 6px;\n\tpadding-left: 20px;\n}\n\n.mce-toolbar .mce-btn i {\n\ttext-shadow: none;\n}\n\n.mce-toolbar .mce-btn-group > div {\n\twhite-space: normal;\n}\n\n.mce-toolbar .mce-colorbutton .mce-open {\n\tborder-left: 0;\n}\n\n.mce-toolbar .mce-colorbutton .mce-preview {\n\tmargin: 0;\n\tpadding: 0;\n\ttop: auto;\n\tbottom: 2px;\n\tright: 3px;\n\theight: 3px;\n\twidth: 20px;\n}\n\n/* mce listbox */\n.mce-toolbar .mce-btn-group .mce-btn.mce-listbox {\n    -webkit-border-radius: 0;\n    border-radius: 0;\n    direction: rtl;\n    background: #fff;\n    border: 1px solid #ddd;\n    -webkit-box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2);\n    box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2);\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover {\n\tborder-color: #b4b9be;\n}\n\n.mce-panel .mce-btn i.mce-caret {\n\tborder-top: 6px solid #777;\n\tmargin-right: 2px;\n\tmargin-left: 2px;\n}\n\n.mce-listbox i.mce-caret {\n\tleft: 4px;\n}\n\n.mce-panel .mce-btn:hover i.mce-caret {\n\tborder-top-color: #32373c;\n}\n\n.mce-panel .mce-active i.mce-caret {\n\tborder-top: 0;\n\tborder-bottom: 6px solid #32373c;\n\tmargin-top: 7px;\n}\n\n.mce-listbox.mce-active i.mce-caret {\n\tmargin-top: -3px;\n}\n\n.mce-toolbar .mce-splitbtn:hover .mce-open {\n\tborder-left-color: transparent;\n}\n\n.mce-toolbar .mce-splitbtn .mce-open.mce-active {\n\tbackground: transparent;\n\toutline: none;\n}\n\n.mce-menu .mce-menu-item:hover,\n.mce-menu .mce-menu-item.mce-selected,\n.mce-menu .mce-menu-item:focus,\n.mce-menu .mce-menu-item-normal.mce-active,\n.mce-menu .mce-menu-item-preview.mce-active {\n\tbackground: #0073aa; /* See color scheme. */\n}\n\n.mce-menu .mce-menu-item-preview.mce-active {\n\tborder-right: none;\n}\n\n.mce-menu .mce-menu-item-preview.mce-active .mce-text {\n\tcolor: #fff;\n}\n\n.mce-menu .mce-menu-item.mce-disabled {\n\tcursor: default;\n}\n\n.mce-menu .mce-menu-item.mce-disabled:hover {\n    background: #ccc;\n}\n\n/* Menubar */\n.mce-menubar {\n\tborder-color: #e5e5e5;\n\tbackground: #fff;\n\tborder-width: 0px 0px 1px;\n}\n\n.mce-menubar .mce-menubtn {\n\tmargin: 2px;\n}\n\n.mce-menubar .mce-menubtn:hover,\n.mce-menubar .mce-menubtn.mce-active,\n.mce-menubar .mce-menubtn:focus {\n\tborder-color: transparent;\n\tbackground: transparent;\n}\n\n.mce-menubar .mce-menubtn:focus {\n\tcolor: #124964;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\ndiv.mce-menu .mce-menu-item-sep,\n.mce-menu-item-sep:hover {\n\tborder-bottom: 1px solid #ddd;\n\theight: 0px;\n\tmargin: 5px 0;\n}\n\n.mce-menubtn span {\n\tmargin-left: 0;\n\tpadding-right: 3px;\n}\n\n.mce-menu-has-icons i.mce-ico:before {\n\tmargin-right: -2px;\n}\n\n/* Buttons in modals */\n.mce-primary button,\n.mce-primary button i {\n\ttext-align: center;\n\tcolor: #fff;\n\ttext-shadow: none;\n\tpadding: 0;\n\tline-height: 26px;\n}\n\n.mce-window .mce-btn {\n\tcolor: #555;\n\tbackground: #f7f7f7;\n\ttext-decoration: none;\n\tfont-size: 13px;\n\tline-height: 26px;\n\theight: 28px;\n\tmargin: 0;\n\tpadding: 0;\n\tcursor: pointer;\n\tborder: 1px solid #ccc;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\twhite-space: nowrap;\n\t-webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\tbox-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n}\n\n/* Remove the dotted border on :focus and the extra padding in Firefox */\n.mce-window .mce-btn::-moz-focus-inner {\n\tborder-width: 1px 0;\n\tborder-style: solid none;\n\tborder-color: transparent;\n\tpadding: 0;\n}\n\n.mce-window .mce-btn:hover,\n.mce-window .mce-btn:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.mce-window .mce-btn:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n}\n\n.mce-window .mce-btn:active {\n\tbackground: #eee;\n\tborder-color: #999;\n\tcolor: #32373c;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n\tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n}\n\n.mce-window .mce-btn.mce-disabled {\n\tcolor: #a0a5aa;\n\tborder-color: #ddd;\n\tbackground: #f7f7f7;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: 0 1px 0 #fff;\n\tcursor: default;\n}\n\n.mce-window .mce-btn.mce-primary {\n\tbackground: #00a0d2;\n\tborder-color: #0073aa;\n\t-webkit-box-shadow: inset 0 1px 0 rgba( 120, 200, 230, 0.5), 0 1px 0 rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: inset 0 1px 0 rgba( 120, 200, 230, 0.5 ), 0 1px 0 rgba( 0, 0, 0, 0.15 );\n\tcolor: #fff;\n\ttext-decoration: none;\n}\n\n.mce-window .mce-btn.mce-primary:hover,\n.mce-window .mce-btn.mce-primary:focus {\n\tbackground: #1e8cbe;\n\tborder-color: #0073aa;\n\t-webkit-box-shadow: inset 0 1px 0 rgba( 120, 200, 230, 0.6 );\n\tbox-shadow: inset 0 1px 0 rgba( 120, 200, 230, 0.6 );\n\tcolor: #fff;\n}\n\n.mce-window .mce-btn.mce-primary:focus {\n\tborder-color: #0e3950;\n\t-webkit-box-shadow:\n\t\tinset 0 1px 0 rgba( 120, 200, 230, 0.6 ),\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow:\n\t\tinset 0 1px 0 rgba( 120, 200, 230, 0.6 ),\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n}\n\n.mce-window .mce-btn.mce-primary:active {\n\tbackground: #1b7aa6;\n\tborder-color: #005684;\n\tcolor: rgba( 255, 255, 255, 0.95 );\n\t-webkit-box-shadow: inset 0 1px 0 rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 1px 0 rgba( 0, 0, 0, 0.1 );\n\tvertical-align: top;\n}\n\n.mce-window .mce-btn.mce-primary.mce-disabled {\n\tcolor: #94cde7;\n\tbackground: #298cba;\n\tborder-color: #1b607f;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: 0 -1px 0 rgba( 0, 0, 0, 0.1 );\n\tcursor: default;\n}\n\n.mce-menubtn.mce-fixed-width button {\n\toverflow-x: hidden;\n\ttext-overflow: ellipsis;\n\twidth: 110px;\n}\n\n/* Charmap modal */\n.mce-charmap {\n\tmargin: 3px;\n}\n\n.mce-charmap td {\n\tpadding: 0;\n\tborder-color: #dfdfdf;\n\tcursor: pointer;\n}\n\n.mce-charmap td:hover {\n\tbackground: #f3f3f3;\n}\n\n.mce-charmap td div {\n\twidth: 18px;\n\theight: 22px;\n\tline-height: 22px;\n}\n\n/* TinyMCE tooltips */\n.mce-tooltip {\n\tmargin-top: 2px;\n}\n\n.mce-tooltip-inner {\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\t-webkit-box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 );\n\tbox-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 );\n\tcolor: #fff;\n\tfont-size: 12px;\n}\n\n/* TinyMCE icons */\n.mce-ico {\n\tfont-family: 'tinymce', Arial;\n}\n\n.mce-btn-small .mce-ico {\n    font-family: 'tinymce-small', Arial;\n}\n\n.mce-toolbar .mce-ico {\n\tcolor: #777;\n\tline-height: 20px;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n\ttext-shadow: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.qt-dfw {\n\tcolor: #777;\n\tline-height: 20px;\n\twidth: 28px;\n\theight: 26px;\n\ttext-align: center;\n\ttext-shadow: none;\n}\n\n.mce-toolbar .mce-btn .mce-open {\n\tline-height: 20px;\n}\n\n.mce-toolbar .mce-btn:hover .mce-open,\n.mce-toolbar .mce-btn:focus .mce-open,\n.mce-toolbar .mce-btn.mce-active .mce-open {\n\tborder-right-color: #999;\n}\n\ni.mce-i-bold,\ni.mce-i-italic,\ni.mce-i-bullist,\ni.mce-i-numlist,\ni.mce-i-blockquote,\ni.mce-i-alignleft,\ni.mce-i-aligncenter,\ni.mce-i-alignright,\ni.mce-i-link,\ni.mce-i-unlink,\ni.mce-i-wp_more,\ni.mce-i-strikethrough,\ni.mce-i-spellchecker,\ni.mce-i-fullscreen,\ni.mce-i-wp_fullscreen,\ni.mce-i-dfw,\ni.mce-i-wp_adv,\ni.mce-i-underline,\ni.mce-i-alignjustify,\ni.mce-i-forecolor,\ni.mce-i-backcolor,\ni.mce-i-pastetext,\ni.mce-i-pasteword,\ni.mce-i-removeformat,\ni.mce-i-charmap,\ni.mce-i-outdent,\ni.mce-i-indent,\ni.mce-i-undo,\ni.mce-i-redo,\ni.mce-i-help,\ni.mce-i-wp_help,\ni.mce-i-wp-media-library,\ni.mce-i-ltr,\ni.mce-i-wp_page,\ni.mce-i-hr,\ni.mce-i-wp_code,\ni.mce-i-dashicon,\n.mce-close {\n\tfont: normal 20px/1 dashicons;\n\tpadding: 0;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tmargin-right: -2px;\n\tpadding-left: 2px;\n}\n\n.qt-dfw {\n\tfont: normal 20px/1 dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\ni.mce-i-bold:before {\n\tcontent: \"\\f200\";\n}\n\ni.mce-i-italic:before {\n\tcontent: \"\\f201\";\n}\n\ni.mce-i-bullist:before {\n\tcontent: \"\\f203\";\n}\n\ni.mce-i-numlist:before {\n\tcontent: \"\\f204\";\n}\n\ni.mce-i-blockquote:before {\n\tcontent: \"\\f205\";\n}\n\ni.mce-i-alignleft:before {\n\tcontent: \"\\f206\";\n}\n\ni.mce-i-aligncenter:before {\n\tcontent: \"\\f207\";\n}\n\ni.mce-i-alignright:before {\n\tcontent: \"\\f208\";\n}\n\ni.mce-i-link:before {\n\tcontent: \"\\f103\";\n}\n\ni.mce-i-unlink:before {\n\tcontent: \"\\f225\";\n}\n\ni.mce-i-wp_more:before {\n\tcontent: \"\\f209\";\n}\n\ni.mce-i-strikethrough:before {\n\tcontent: \"\\f224\";\n}\n\ni.mce-i-spellchecker:before {\n\tcontent: \"\\f210\";\n}\n\ni.mce-i-fullscreen:before,\ni.mce-i-wp_fullscreen:before,\ni.mce-i-dfw:before,\n.qt-dfw:before {\n\tcontent: \"\\f211\";\n}\n\ni.mce-i-wp_adv:before {\n\tcontent: \"\\f212\";\n}\n\ni.mce-i-underline:before {\n\tcontent: \"\\f213\";\n}\n\ni.mce-i-alignjustify:before {\n\tcontent: \"\\f214\";\n}\n\ni.mce-i-forecolor:before,\ni.mce-i-backcolor:before {\n\tcontent: \"\\f215\";\n}\n\ni.mce-i-pastetext:before {\n\tcontent: \"\\f217\";\n}\n\ni.mce-i-removeformat:before {\n\tcontent: \"\\f218\";\n}\n\ni.mce-i-charmap:before {\n\tcontent: \"\\f220\";\n}\n\ni.mce-i-outdent:before {\n\tcontent: \"\\f221\";\n}\n\ni.mce-i-indent:before {\n\tcontent: \"\\f222\";\n}\n\ni.mce-i-undo:before {\n\tcontent: \"\\f171\";\n}\n\ni.mce-i-redo:before {\n\tcontent: \"\\f172\";\n}\n\ni.mce-i-help:before,\ni.mce-i-wp_help:before {\n\tcontent: \"\\f223\";\n}\n\ni.mce-i-wp-media-library:before {\n\tcontent: \"\\f104\";\n}\n\ni.mce-i-ltr:before {\n\tcontent: \"\\f320\";\n}\n\ni.mce-i-wp_page:before {\n\tcontent: \"\\f105\";\n}\n\ni.mce-i-hr:before {\n\tcontent: \"\\f460\";\n}\n\n.mce-close:before {\n\tcontent: \"\\f158\";\n}\n\ni.mce-i-wp_code:before {\n\tcontent: \"\\f475\";\n}\n\n/* RTL button icons */\n.rtl i.mce-i-outdent:before {\n\tcontent: \"\\f222\";\n}\n\n.rtl i.mce-i-indent:before {\n\tcontent: \"\\f221\";\n}\n\n/* Editors */\n.wp-editor-wrap {\n\tposition: relative;\n}\n\n.wp-editor-tools {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.wp-editor-tools:after {\n\tclear: both;\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.wp-editor-container {\n\tclear: both;\n}\n\n.wp-editor-area {\n\tfont-family: Consolas, Monaco, monospace;\n\tfont-size: 13px;\n\tpadding: 10px;\n\tmargin: 1px 0 0;\n\tline-height: 150%;\n\tborder: 0 none;\n\toutline: none;\n\tdisplay: block;\n\tresize: vertical;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.rtl .wp-editor-area {\n\tfont-family: Tahoma, Monaco, monospace;\n}\n\n.locale-he-il .wp-editor-area {\n\tfont-family: Arial, Monaco, monospace;\n}\n\n.wp-editor-container textarea.wp-editor-area {\n\twidth: 100%;\n\tmargin: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-editor-tabs {\n\tfloat: left;\n}\n\n.wp-switch-editor {\n\tfloat: right;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\tposition: relative;\n\ttop: 1px;\n\tbackground: #ebebeb;\n\tcolor: #777;\n\tcursor: pointer;\n\tfont: 13px/19px \"Open Sans\", sans-serif;\n\theight: 20px;\n\tmargin: 5px 5px 0 0;\n\tpadding: 3px 8px 4px;\n\tborder: 1px solid #e5e5e5;\n}\n\n.wp-switch-editor:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\toutline: none;\n\tcolor: #23282d;\n}\n\n.wp-switch-editor:active,\n.html-active .switch-html:focus,\n.tmce-active .switch-tmce:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-switch-editor:active {\n\tbackground-color: #f5f5f5;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.js .tmce-active .wp-editor-area {\n\tcolor: white;\n}\n\n.tmce-active .quicktags-toolbar {\n\t display: none;\n}\n\n.tmce-active .switch-tmce,\n.html-active .switch-html {\n\tbackground: #f5f5f5;\n\tcolor: #555;\n\tborder-bottom-color: #f5f5f5;\n}\n\n.wp-media-buttons {\n\tfloat: right;\n}\n\n.wp-media-buttons .button {\n\tmargin-left: 5px;\n\tmargin-bottom: 4px;\n\tpadding-right: 7px;\n\tpadding-left: 7px;\n}\n\n.wp-media-buttons .button:active {\n\tposition: relative;\n\ttop: 1px;\n\tmargin-top: -1px;\n\tmargin-bottom: 1px;\n}\n\n.wp-media-buttons .insert-media {\n\tpadding-right: 5px;\n}\n\n.wp-media-buttons a {\n\ttext-decoration: none;\n\tcolor: #464646;\n\tfont-size: 12px;\n}\n\n.wp-media-buttons img {\n\tpadding: 0 4px;\n\tvertical-align: middle;\n}\n\n.wp-media-buttons span.wp-media-buttons-icon {\n\tdisplay: inline-block;\n\twidth: 18px;\n\theight: 18px;\n\tvertical-align: text-top;\n\tmargin: 0 2px;\n}\n\n.wp-media-buttons .add_media span.wp-media-buttons-icon {\n\tbackground: none;\n}\n\n.wp-media-buttons .add_media span.wp-media-buttons-icon:before {\n\tfont: normal 18px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.wp-media-buttons .add_media span.wp-media-buttons-icon:before {\n\tcontent: \"\\f104\";\n}\n\n/* Quicktags */\n.quicktags-toolbar {\n\tpadding: 3px;\n\tposition: relative;\n\tborder-bottom: 1px solid #dedede;\n\tbackground: #f5f5f5;\n\tmin-height: 30px;\n}\n\n.has-dfw .quicktags-toolbar {\n\tpadding-left: 35px;\n}\n\n.wp-core-ui .quicktags-toolbar input.button.button-small {\n\tmargin: 2px;\n}\n\n.quicktags-toolbar input[value=\"link\"] {\n\ttext-decoration: underline;\n}\n\n.quicktags-toolbar input[value=\"del\"] {\n\ttext-decoration: line-through;\n}\n\n.quicktags-toolbar input[value=\"i\"] {\n\tfont-style: italic;\n}\n\n.quicktags-toolbar input[value=\"b\"] {\n\tfont-weight: bold;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,\n.qt-dfw {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tmargin: 5px 0 0 5px;\n}\n\n.qt-fullscreen {\n\tposition: static;\n\tmargin: 2px;\n}\n\n@media screen and ( max-width: 782px ) {\n\t.mce-toolbar .mce-btn button,\n\t.qt-dfw {\n\t\tpadding: 6px 7px;\n\t}\n\n\t.mce-toolbar .mce-btn-group .mce-btn {\n\t\tmargin: 1px;\n\t}\n\n\t.qt-dfw {\n\t\twidth: 36px;\n\t\theight: 34px;\n\t}\n\n\t.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw {\n\t\tmargin: 4px 0 0 4px;\n\t}\n\n\t.mce-toolbar .mce-colorbutton .mce-preview {\n\t\tright: 8px;\n\t\tbottom: 6px;\n\t}\n\n\t.mce-window .mce-btn {\n\t\tpadding: 2px 0;\n\t}\n\n\t.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first,\n\t.has-dfw .quicktags-toolbar {\n\t\tpadding-left: 40px;\n\t}\n}\n\n@media screen and ( min-width: 782px ) {\n\t.wp-core-ui .quicktags-toolbar input.button.button-small {\n\t\t/* .button-small is normaly 11px, but a bit too small for these buttons. */\n\t\tfont-size: 12px;\n\t\theight: 26px;\n\t\tline-height: 24px;\n\t}\n}\n\n#wp_editbtns,\n#wp_gallerybtns {\n\tpadding: 2px;\n\tposition: absolute;\n\tdisplay: none;\n\tz-index: 100020;\n}\n\n#wp_editimgbtn,\n#wp_delimgbtn,\n#wp_editgallery,\n#wp_delgallery {\n\tborder-color: #999;\n\tbackground-color: #eee;\n\tmargin: 2px;\n\tpadding: 2px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n}\n\n#wp_editimgbtn:hover,\n#wp_delimgbtn:hover,\n#wp_editgallery:hover,\n#wp_delgallery:hover {\n\tborder-color: #555;\n\tbackground-color: #ccc;\n}\n\n/*------------------------------------------------------------------------------\n wp-link\n------------------------------------------------------------------------------*/\n\n#wp-link-wrap {\n\tdisplay: none;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\twidth: 500px;\n\toverflow: hidden;\n\tmargin-right: -250px;\n\tmargin-top: -125px;\n\tposition: fixed;\n\ttop: 50%;\n\tright: 50%;\n\tz-index: 100105;\n\t-webkit-transition: height 0.2s, margin-top 0.2s;\n\ttransition: height 0.2s, margin-top 0.2s;\n}\n\n#wp-link-backdrop {\n\tdisplay: none;\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tmin-height: 360px;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 100100;\n}\n\n#wp-link {\n\tposition: relative;\n\theight: 100%;\n}\n\n#wp-link-wrap.search-panel-visible {\n\theight: 500px;\n\tmargin-top: -250px;\n}\n\n#wp-link-wrap .wp-link-text-field {\n\tdisplay: none;\n}\n\n#wp-link-wrap.has-text-field .wp-link-text-field {\n\tdisplay: block;\n}\n\n#link-modal-title {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\theight: 36px;\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tline-height: 36px;\n\tpadding: 0 16px 0 36px;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n}\n\n#wp-link-close {\n\tcolor: #666;\n\tpadding: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 36px;\n\theight: 36px;\n\ttext-align: center;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n}\n\n#wp-link-close:before {\n\tfont: normal 20px/36px dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\twidth: 36px;\n\theight: 36px;\n\tcontent: \"\\f158\";\n}\n\n#wp-link-close:hover,\n#wp-link-close:focus {\n\tcolor: #00a0d2;\n}\n\n#wp-link-close:focus {\n\toutline: none;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#link-selector {\n\tpadding: 0 16px 50px;\n}\n\n#wp-link-wrap.search-panel-visible #link-selector {\n\t-webkit-overflow-scrolling: touch;\n\tpadding: 0 16px;\n\tposition: absolute;\n\ttop: 36px;\n\tright: 0;\n\tleft: 0;\n\tbottom: 44px;\n}\n\n#wp-link ol,\n#wp-link ul {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#wp-link-search-toggle:after {\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcontent: \"\\f140\";\n}\n\n.search-panel-visible #wp-link-search-toggle:after {\n\tcontent: \"\\f142\";\n}\n\n#wp-link input[type=\"text\"] {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#wp-link #link-options {\n\tpadding: 8px 0 12px;\n}\n\n#wp-link p.howto {\n\tmargin: 3px 0;\n}\n\n#wp-link p.howto a {\n\ttext-decoration: none;\n\tcolor: inherit;\n}\n\n#wp-link-search-toggle {\n\tcursor: pointer;\n}\n\n#wp-link label input[type=\"text\"] {\n\tmargin-top: 5px;\n\twidth: 70%;\n}\n\n#wp-link #link-options label span,\n#wp-link #search-panel label span.search-label {\n\tdisplay: inline-block;\n\twidth: 80px;\n\ttext-align: left;\n\tpadding-left: 5px;\n\tmax-width: 24%;\n\tvertical-align: middle;\n\tword-wrap: break-word;\n}\n\n#wp-link .link-search-field {\n\tfloat: right;\n\twidth: 250px;\n\tmax-width: 70%;\n}\n\n#wp-link .link-search-wrapper {\n\tmargin: 5px 0 9px;\n\tdisplay: block;\n\toverflow: hidden;\n}\n\n#wp-link .link-search-wrapper span {\n\tfloat: right;\n\tmargin-top: 4px;\n}\n\n#wp-link .link-search-wrapper .spinner {\n\tmargin-top: 5px;\n}\n\n#wp-link .link-target {\n\tpadding: 3px 0 0;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n#wp-link .link-target label {\n\tmax-width: 70%;\n}\n\n#wp-link .query-results {\n\tborder: 1px #dfdfdf solid;\n\tmargin: 0;\n\tbackground: #fff;\n\toverflow: auto;\n\tposition: absolute;\n\tright: 16px;\n\tleft: 16px;\n\tbottom: 16px;\n\ttop: 172px;\n}\n\n.has-text-field #wp-link .query-results {\n\ttop: 205px;\n}\n\n#wp-link li {\n\tclear: both;\n\tmargin-bottom: 0;\n\tborder-bottom: 1px solid #f1f1f1;\n\tcolor: #32373c;\n\tpadding: 4px 10px 4px 6px;\n\tcursor: pointer;\n\tposition: relative;\n}\n\n#wp-link .query-notice {\n\tpadding: 0;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground-color: #f7fcfe;\n\tcolor: #000;\n}\n\n#wp-link .query-notice .query-notice-default,\n#wp-link .query-notice .query-notice-hint {\n\tdisplay: block;\n\tpadding: 6px;\n\tborder-right: 4px solid #00a0d2;\n}\n\n#wp-link .unselectable.no-matches-found {\n\tpadding: 0;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground-color: #fef7f1;\n}\n\n#wp-link .no-matches-found .item-title {\n\tdisplay: block;\n\tpadding: 6px;\n\tborder-right: 4px solid #d54e21;\n}\n\n#wp-link .query-results em {\n\tfont-style: normal;\n}\n\n#wp-link li:hover {\n\tbackground: #eaf2fa;\n\tcolor: #151515;\n}\n\n#wp-link li.unselectable {\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n#wp-link li.unselectable:hover {\n\tbackground: #fff;\n\tcursor: auto;\n\tcolor: #32373c;\n}\n\n#wp-link li.selected {\n\tbackground: #ddd;\n\tcolor: #32373c;\n}\n\n#wp-link li.selected .item-title {\n\tfont-weight: bold;\n}\n\n#wp-link li:last-child {\n\tborder: none;\n}\n\n#wp-link .item-title {\n\tdisplay: inline-block;\n\twidth: 80%;\n\twidth: -webkit-calc(100% - 68px);\n\twidth: calc(100% - 68px);\n\tword-wrap: break-word;\n}\n\n#wp-link .item-info {\n\ttext-transform: uppercase;\n\tcolor: #666;\n\tfont-size: 11px;\n\tposition: absolute;\n\tleft: 5px;\n\ttop: 5px;\n}\n\n#wp-link #search-results,\n#wp-link #search-panel {\n\tdisplay: none;\n}\n\n#wp-link-wrap.search-panel-visible #search-panel {\n\tdisplay: block;\n}\n\n#wp-link .river-waiting {\n\tdisplay: none;\n\tpadding: 10px 0;\n}\n\n#wp-link .submitbox {\n\tpadding: 8px 16px;\n\tbackground: #fcfcfc;\n\tborder-top: 1px solid #dfdfdf;\n\tposition: absolute;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n}\n\n#wp-link-cancel {\n\tline-height: 25px;\n\tfloat: right;\n}\n\n#wp-link-update {\n\tline-height: 23px;\n\tfloat: left;\n}\n\n#wp-link-submit {\n\tfloat: left;\n\tmargin-bottom: 0;\n}\n\n@media screen and ( max-width: 782px ) {\n\t#wp-link-wrap {\n\t\tmargin-top: -140px;\n\t}\n\n\t#wp-link-wrap.search-panel-visible .query-results {\n\t\ttop: 195px;\n\t}\n\n\t#wp-link-wrap.search-panel-visible.has-text-field .query-results {\n\t\ttop: 235px;\n\t}\n\n\t#link-selector {\n\t\tpadding: 0 16px 60px;\n\t}\n\n\t#wp-link-wrap.search-panel-visible #link-selector {\n\t\tbottom: 52px;\n\t}\n\n\t#wp-link-cancel {\n\t\tline-height: 32px;\n\t}\n}\n\n@media screen and ( max-width: 520px ) {\n\t#wp-link-wrap {\n\t\twidth: auto;\n\t\tmargin-right: 0;\n\t\tright: 10px;\n\t\tleft: 10px;\n\t\tmax-width: 500px;\n\t}\n}\n\n@media screen and ( max-height: 520px ) {\n\t#wp-link-wrap {\n\t\t-webkit-transition: none;\n\t\ttransition: none;\n\t}\n\n\t#wp-link-wrap.search-panel-visible {\n\t\theight: auto;\n\t\tmargin-top: 0;\n\t\ttop: 10px;\n\t\tbottom: 10px;\n\t}\n\n\t.search-panel-visible #link-selector {\n\t\toverflow: auto;\n\t}\n\n\t.search-panel-visible #search-panel .query-results {\n\t\tposition: static;\n\t}\n}\n\n@media screen and ( max-height: 290px ) {\n\t#wp-link-wrap {\n\t\theight: auto;\n\t\tmargin-top: 0;\n\t\ttop: 10px;\n\t\tbottom: 10px;\n\t}\n\n\t#link-selector {\n\t\toverflow: auto;\n\t\theight: -webkit-calc(100% - 92px);\n\t\theight: calc(100% - 92px);\n\t\tpadding-bottom: 2px;\n\t}\n\n\t#search-panel .query-results {\n\t\tposition: static;\n\t}\n}\n\ndiv.wp-link-preview {\n\tfloat: right;\n\tmargin: 5px;\n\tmax-width: 694px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\ndiv.wp-link-preview a {\n\tcolor: #0073aa;\n\ttext-decoration: underline;\n\t-webkit-transition-property: border, background, color;\n\ttransition-property: border, background, color;\n\t-webkit-transition-duration: .05s;\n\ttransition-duration: .05s;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n\tcursor: pointer;\n}\n\n@media screen and ( max-width: 782px ) {\n\tdiv.wp-link-preview {\n\t\tmargin: 8px 5px 8px 0;\n\t\tmax-width: 70%;\n\t\tmax-width: -webkit-calc(100% - 86px);\n\t\tmax-width: calc(100% - 86px);\n\t}\n}\n\n/* =Overlay Body\n-------------------------------------------------------------- */\n\n.mce-fullscreen {\n\tz-index: 100010;\n}\n\n/* =Localization\n-------------------------------------------------------------- */\n.rtl .wp-switch-editor,\n.rtl .quicktags-toolbar input {\n\tfont-family: Tahoma, sans-serif;\n}\n\n/* rtl:ignore */\n.mce-rtl .mce-flow-layout .mce-flow-layout-item > div {\n\tdirection: rtl;\n}\n\n/* rtl:ignore */\n.mce-rtl .mce-listbox i.mce-caret {\n\tleft: 6px;\n}\n\nhtml:lang(he-il) .rtl .wp-switch-editor,\nhtml:lang(he-il) .rtl .quicktags-toolbar input  {\n \tfont-family: Arial, sans-serif;\n}\n\n/* HiDPI */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t.wp-media-buttons .add_media span.wp-media-buttons-icon {\n\t\tbackground: none;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/editor.css",
    "content": "/*------------------------------------------------------------------------------\n TinyMCE and Quicklinks toolbars\n------------------------------------------------------------------------------*/\n\n/* TinyMCE widgets/containers */\n\n.mce-container,\n.mce-container *,\n.mce-widget,\n.mce-widget * {\n\tcolor: inherit;\n\tfont-family: inherit;\n}\n\n/* TinyMCE windows */\n#mce-modal-block,\n#mce-modal-block.mce-fade {\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n.mce-window {\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\t-webkit-font-smoothing: subpixel-antialiased;\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n.mce-window .mce-container-body.mce-abs-layout {\n\toverflow: visible;\n}\n\n.mce-window .mce-window-head {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\tpadding: 0;\n\tmin-height: 36px;\n}\n\n.mce-window .mce-window-head .mce-title {\n\tcolor: #444;\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tline-height: 36px;\n\tmargin: 0;\n\tpadding: 0 36px 0 16px;\n}\n\n.mce-window .mce-window-head .mce-close {\n\tcolor: transparent;\n\ttop: 0;\n\tright: 0;\n\twidth: 36px;\n\theight: 36px;\n\tline-height: 36px;\n\ttext-align: center;\n}\n\n.mce-window .mce-window-head .mce-close:before {\n\tfont: normal 20px/36px dashicons;\n\ttext-align: center;\n\tcolor: #666;\n\twidth: 36px;\n\theight: 36px;\n\tdisplay: block;\n}\n\n.mce-window .mce-window-head .mce-close:hover:before {\n\tcolor: #00a0d2;\n}\n\n.mce-window .mce-window-head .mce-dragh {\n\twidth: -webkit-calc( 100% - 36px );\n\twidth: calc( 100% - 36px );\n}\n\n.mce-window .mce-foot {\n\tborder-top: 1px solid #dfdfdf;\n}\n\n.mce-textbox,\n.mce-checkbox i.mce-i-checkbox,\n#wp-link .query-results {\n\tborder: 1px solid #ddd;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\t-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.07);\n\tbox-shadow: inset 0 1px 2px rgba(0,0,0,0.07);\n\t-webkit-transition: .05s all ease-in-out;\n\ttransition: .05s all ease-in-out;\n}\n\n.mce-textbox:focus,\n.mce-textbox.mce-focus,\n.mce-checkbox:focus i.mce-i-checkbox,\n#wp-link .query-results:focus {\n\tborder-color: #5b9dd9;\n\t-webkit-box-shadow: 0 0 2px rgba(30,140,190,0.8);\n\tbox-shadow: 0 0 2px rgba(30,140,190,0.8);\n}\n\n.mce-window .mce-wp-help {\n\theight: 360px;\n\twidth: 460px;\n\toverflow: auto;\n}\n\n.mce-window .mce-wp-help * {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.mce-window .mce-wp-help > .mce-container-body {\n\twidth: auto !important;\n}\n\n.mce-window .wp-editor-help {\n\tpadding: 10px 10px 0 20px;\n}\n\n.mce-window .wp-editor-help h2,\n.mce-window .wp-editor-help p {\n\tmargin: 8px 0;\n\twhite-space: normal;\n\tfont-size: 14px;\n\tfont-weight: normal;\n}\n\n.mce-window .wp-editor-help table {\n\twidth: 100%;\n\tmargin-bottom: 20px;\n}\n\n.mce-window .wp-editor-help td,\n.mce-window .wp-editor-help th {\n\tfont-size: 13px;\n\tpadding: 5px;\n\tvertical-align: middle;\n\tword-wrap: break-word;\n\twhite-space: normal;\n}\n\n.mce-window .wp-editor-help th {\n\tfont-weight: bold;\n\tpadding-bottom: 0;\n}\n\n.mce-window .wp-editor-help kbd {\n\tfont-family: monospace;\n\tpadding: 2px 7px 3px;\n\tfont-weight: bold;\n\tmargin: 0;\n\tbackground: #eaeaea;\n\tbackground: rgba(0,0,0,0.08);\n}\n\n.mce-window .wp-help-header td {\n\tfont-weight: bold;\n\tpadding: 0 5px;\n}\n\n.mce-window .wp-help-th-center td:nth-child(odd),\n.mce-window .wp-help-th-center th:nth-child(odd) {\n    text-align: center;\n}\n\n/* TinyMCE menus */\n.mce-menu,\n.mce-floatpanel.mce-popover {\n\tborder-color: rgba(0,0,0,0.15);\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n\t-webkit-box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 );\n\tbox-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 );\n}\n\n.mce-menu,\n.mce-floatpanel.mce-popover.mce-bottom {\n\tmargin-top: 2px;\n}\n\n.mce-floatpanel .mce-arrow {\n\tdisplay: none;\n}\n\n.mce-menu .mce-container-body {\n\tmin-width: 160px;\n}\n\n.mce-menu-item {\n\tborder: none;\n\tmargin-bottom: 2px;\n}\n\n.mce-menu-has-icons i.mce-ico {\n\tline-height: 20px;\n}\n\n/* TinyMCE panel */\ndiv.mce-panel {\n\tborder: 0;\n\tbackground: #fff;\n}\n\n.mce-panel.mce-menu {\n\tborder: 1px solid #ddd;\n}\n\ndiv.mce-tab {\n\tline-height: 13px;\n}\n\n/* TinyMCE toolbars */\ndiv.mce-toolbar-grp {\n\tborder-bottom: 1px solid #dedede;\n\tbackground: #f5f5f5;\n\tpadding: 0;\n\tposition: relative;\n}\n\ndiv.mce-inline-toolbar-grp {\n\tborder: 1px solid #a0a5aa;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n\t-webkit-box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: 0 1px 3px rgba( 0, 0, 0, 0.15 );\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 8px;\n\tposition: absolute;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tmax-width: 98%;\n\tz-index: 100100; /* Same as the other TinyMCE \"panels\" */\n}\n\ndiv.mce-inline-toolbar-grp > div.mce-stack-layout {\n\tpadding: 1px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-up {\n\tmargin-bottom: 0;\n\tmargin-top: 8px;\n}\n\ndiv.mce-inline-toolbar-grp:before,\ndiv.mce-inline-toolbar-grp:after {\n\tposition: absolute;\n\tleft: 50%;\n\tdisplay: block;\n\twidth: 0;\n\theight: 0;\n\tborder-style: solid;\n\tborder-color: transparent;\n\tcontent: \"\";\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-up:before {\n\ttop: -9px;\n\tborder-bottom-color: #a0a5aa;\n\tborder-width: 0 9px 9px;\n\tmargin-left: -9px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-down:before {\n\tbottom: -9px;\n\tborder-top-color: #a0a5aa;\n\tborder-width: 9px 9px 0;\n\tmargin-left: -9px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-up:after {\n\ttop: -8px;\n\tborder-bottom-color: #f5f5f5;\n\tborder-width: 0 8px 8px;\n\tmargin-left: -8px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-down:after {\n\tbottom: -8px;\n\tborder-top-color: #f5f5f5;\n\tborder-width: 8px 8px 0;\n\tmargin-left: -8px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-left:before,\ndiv.mce-inline-toolbar-grp.mce-arrow-left:after {\n\tmargin: 0;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-left:before {\n\tleft: 20px;\n}\ndiv.mce-inline-toolbar-grp.mce-arrow-left:after {\n\tleft: 21px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-right:before,\ndiv.mce-inline-toolbar-grp.mce-arrow-right:after {\n\tleft: auto;\n\tmargin: 0;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-right:before {\n\tright: 20px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-right:after {\n\tright: 21px;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-full {\n\tright: 0;\n}\n\ndiv.mce-inline-toolbar-grp.mce-arrow-full > div {\n\twidth: 100%;\n\toverflow-x: auto;\n}\n\ndiv.mce-toolbar-grp > div {\n\tpadding: 3px;\n}\n\n.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first {\n\tpadding-right: 32px;\n}\n\n.mce-toolbar .mce-btn-group {\n\tmargin: 0;\n}\n\ndiv.mce-statusbar {\n\tborder-top: 1px solid #e5e5e5;\n}\n\ndiv.mce-path {\n\tpadding: 2px 10px;\n\tmargin: 0;\n}\n\n.mce-path,\n.mce-path-item,\n.mce-path .mce-divider {\n\tfont-size: 12px;\n}\n\n.mce-toolbar .mce-btn,\n.qt-dfw {\n\tborder-color: transparent;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: none;\n\tcursor: pointer;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn,\n.qt-dfw {\n\tborder: 1px solid transparent;\n\tmargin: 2px;\n\t-webkit-border-radius: 2px;\n\tborder-radius: 2px;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn:hover,\n.mce-toolbar .mce-btn-group .mce-btn:focus,\n.qt-dfw:hover,\n.qt-dfw:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n\t-webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\tbox-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\toutline: none;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-active,\n.mce-toolbar .mce-btn-group .mce-btn:active,\n.qt-dfw.active {\n\tbackground: #ebebeb;\n\tborder-color: #999;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.3 );\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover {\n\tborder-color: #555;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover i.mce-ico {\n\tcolor: #555;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover,\n.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus {\n\tcolor: #a0a5aa;\n\tbackground: none;\n\tborder-color: #ddd;\n\ttext-shadow: 0 1px 0 #fff;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mce-toolbar .mce-btn-group .mce-first,\n.mce-toolbar .mce-btn-group .mce-last {\n\tborder-color: transparent;\n}\n\n.mce-toolbar .mce-btn button,\n.qt-dfw {\n\tpadding: 2px 3px;\n\tline-height: normal;\n}\n\n.mce-toolbar .mce-listbox button {\n\tfont-size: 13px;\n\tline-height: 20px;\n\tpadding-left: 6px;\n\tpadding-right: 20px;\n}\n\n.mce-toolbar .mce-btn i {\n\ttext-shadow: none;\n}\n\n.mce-toolbar .mce-btn-group > div {\n\twhite-space: normal;\n}\n\n.mce-toolbar .mce-colorbutton .mce-open {\n\tborder-right: 0;\n}\n\n.mce-toolbar .mce-colorbutton .mce-preview {\n\tmargin: 0;\n\tpadding: 0;\n\ttop: auto;\n\tbottom: 2px;\n\tleft: 3px;\n\theight: 3px;\n\twidth: 20px;\n}\n\n/* mce listbox */\n.mce-toolbar .mce-btn-group .mce-btn.mce-listbox {\n    -webkit-border-radius: 0;\n    border-radius: 0;\n    direction: ltr;\n    background: #fff;\n    border: 1px solid #ddd;\n    -webkit-box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2);\n    box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2);\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover {\n\tborder-color: #b4b9be;\n}\n\n.mce-panel .mce-btn i.mce-caret {\n\tborder-top: 6px solid #777;\n\tmargin-left: 2px;\n\tmargin-right: 2px;\n}\n\n.mce-listbox i.mce-caret {\n\tright: 4px;\n}\n\n.mce-panel .mce-btn:hover i.mce-caret {\n\tborder-top-color: #32373c;\n}\n\n.mce-panel .mce-active i.mce-caret {\n\tborder-top: 0;\n\tborder-bottom: 6px solid #32373c;\n\tmargin-top: 7px;\n}\n\n.mce-listbox.mce-active i.mce-caret {\n\tmargin-top: -3px;\n}\n\n.mce-toolbar .mce-splitbtn:hover .mce-open {\n\tborder-right-color: transparent;\n}\n\n.mce-toolbar .mce-splitbtn .mce-open.mce-active {\n\tbackground: transparent;\n\toutline: none;\n}\n\n.mce-menu .mce-menu-item:hover,\n.mce-menu .mce-menu-item.mce-selected,\n.mce-menu .mce-menu-item:focus,\n.mce-menu .mce-menu-item-normal.mce-active,\n.mce-menu .mce-menu-item-preview.mce-active {\n\tbackground: #0073aa; /* See color scheme. */\n}\n\n.mce-menu .mce-menu-item-preview.mce-active {\n\tborder-left: none;\n}\n\n.mce-menu .mce-menu-item-preview.mce-active .mce-text {\n\tcolor: #fff;\n}\n\n.mce-menu .mce-menu-item.mce-disabled {\n\tcursor: default;\n}\n\n.mce-menu .mce-menu-item.mce-disabled:hover {\n    background: #ccc;\n}\n\n/* Menubar */\n.mce-menubar {\n\tborder-color: #e5e5e5;\n\tbackground: #fff;\n\tborder-width: 0px 0px 1px;\n}\n\n.mce-menubar .mce-menubtn {\n\tmargin: 2px;\n}\n\n.mce-menubar .mce-menubtn:hover,\n.mce-menubar .mce-menubtn.mce-active,\n.mce-menubar .mce-menubtn:focus {\n\tborder-color: transparent;\n\tbackground: transparent;\n}\n\n.mce-menubar .mce-menubtn:focus {\n\tcolor: #124964;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\ndiv.mce-menu .mce-menu-item-sep,\n.mce-menu-item-sep:hover {\n\tborder-bottom: 1px solid #ddd;\n\theight: 0px;\n\tmargin: 5px 0;\n}\n\n.mce-menubtn span {\n\tmargin-right: 0;\n\tpadding-left: 3px;\n}\n\n.mce-menu-has-icons i.mce-ico:before {\n\tmargin-left: -2px;\n}\n\n/* Buttons in modals */\n.mce-primary button,\n.mce-primary button i {\n\ttext-align: center;\n\tcolor: #fff;\n\ttext-shadow: none;\n\tpadding: 0;\n\tline-height: 26px;\n}\n\n.mce-window .mce-btn {\n\tcolor: #555;\n\tbackground: #f7f7f7;\n\ttext-decoration: none;\n\tfont-size: 13px;\n\tline-height: 26px;\n\theight: 28px;\n\tmargin: 0;\n\tpadding: 0;\n\tcursor: pointer;\n\tborder: 1px solid #ccc;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\twhite-space: nowrap;\n\t-webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\tbox-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n}\n\n/* Remove the dotted border on :focus and the extra padding in Firefox */\n.mce-window .mce-btn::-moz-focus-inner {\n\tborder-width: 1px 0;\n\tborder-style: solid none;\n\tborder-color: transparent;\n\tpadding: 0;\n}\n\n.mce-window .mce-btn:hover,\n.mce-window .mce-btn:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.mce-window .mce-btn:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n}\n\n.mce-window .mce-btn:active {\n\tbackground: #eee;\n\tborder-color: #999;\n\tcolor: #32373c;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n\tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n}\n\n.mce-window .mce-btn.mce-disabled {\n\tcolor: #a0a5aa;\n\tborder-color: #ddd;\n\tbackground: #f7f7f7;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: 0 1px 0 #fff;\n\tcursor: default;\n}\n\n.mce-window .mce-btn.mce-primary {\n\tbackground: #00a0d2;\n\tborder-color: #0073aa;\n\t-webkit-box-shadow: inset 0 1px 0 rgba( 120, 200, 230, 0.5), 0 1px 0 rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: inset 0 1px 0 rgba( 120, 200, 230, 0.5 ), 0 1px 0 rgba( 0, 0, 0, 0.15 );\n\tcolor: #fff;\n\ttext-decoration: none;\n}\n\n.mce-window .mce-btn.mce-primary:hover,\n.mce-window .mce-btn.mce-primary:focus {\n\tbackground: #1e8cbe;\n\tborder-color: #0073aa;\n\t-webkit-box-shadow: inset 0 1px 0 rgba( 120, 200, 230, 0.6 );\n\tbox-shadow: inset 0 1px 0 rgba( 120, 200, 230, 0.6 );\n\tcolor: #fff;\n}\n\n.mce-window .mce-btn.mce-primary:focus {\n\tborder-color: #0e3950;\n\t-webkit-box-shadow:\n\t\tinset 0 1px 0 rgba( 120, 200, 230, 0.6 ),\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow:\n\t\tinset 0 1px 0 rgba( 120, 200, 230, 0.6 ),\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n}\n\n.mce-window .mce-btn.mce-primary:active {\n\tbackground: #1b7aa6;\n\tborder-color: #005684;\n\tcolor: rgba( 255, 255, 255, 0.95 );\n\t-webkit-box-shadow: inset 0 1px 0 rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 1px 0 rgba( 0, 0, 0, 0.1 );\n\tvertical-align: top;\n}\n\n.mce-window .mce-btn.mce-primary.mce-disabled {\n\tcolor: #94cde7;\n\tbackground: #298cba;\n\tborder-color: #1b607f;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: 0 -1px 0 rgba( 0, 0, 0, 0.1 );\n\tcursor: default;\n}\n\n.mce-menubtn.mce-fixed-width button {\n\toverflow-x: hidden;\n\ttext-overflow: ellipsis;\n\twidth: 110px;\n}\n\n/* Charmap modal */\n.mce-charmap {\n\tmargin: 3px;\n}\n\n.mce-charmap td {\n\tpadding: 0;\n\tborder-color: #dfdfdf;\n\tcursor: pointer;\n}\n\n.mce-charmap td:hover {\n\tbackground: #f3f3f3;\n}\n\n.mce-charmap td div {\n\twidth: 18px;\n\theight: 22px;\n\tline-height: 22px;\n}\n\n/* TinyMCE tooltips */\n.mce-tooltip {\n\tmargin-top: 2px;\n}\n\n.mce-tooltip-inner {\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\t-webkit-box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 );\n\tbox-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 );\n\tcolor: #fff;\n\tfont-size: 12px;\n}\n\n/* TinyMCE icons */\n.mce-ico {\n\tfont-family: 'tinymce', Arial;\n}\n\n.mce-btn-small .mce-ico {\n    font-family: 'tinymce-small', Arial;\n}\n\n.mce-toolbar .mce-ico {\n\tcolor: #777;\n\tline-height: 20px;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n\ttext-shadow: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.qt-dfw {\n\tcolor: #777;\n\tline-height: 20px;\n\twidth: 28px;\n\theight: 26px;\n\ttext-align: center;\n\ttext-shadow: none;\n}\n\n.mce-toolbar .mce-btn .mce-open {\n\tline-height: 20px;\n}\n\n.mce-toolbar .mce-btn:hover .mce-open,\n.mce-toolbar .mce-btn:focus .mce-open,\n.mce-toolbar .mce-btn.mce-active .mce-open {\n\tborder-left-color: #999;\n}\n\ni.mce-i-bold,\ni.mce-i-italic,\ni.mce-i-bullist,\ni.mce-i-numlist,\ni.mce-i-blockquote,\ni.mce-i-alignleft,\ni.mce-i-aligncenter,\ni.mce-i-alignright,\ni.mce-i-link,\ni.mce-i-unlink,\ni.mce-i-wp_more,\ni.mce-i-strikethrough,\ni.mce-i-spellchecker,\ni.mce-i-fullscreen,\ni.mce-i-wp_fullscreen,\ni.mce-i-dfw,\ni.mce-i-wp_adv,\ni.mce-i-underline,\ni.mce-i-alignjustify,\ni.mce-i-forecolor,\ni.mce-i-backcolor,\ni.mce-i-pastetext,\ni.mce-i-pasteword,\ni.mce-i-removeformat,\ni.mce-i-charmap,\ni.mce-i-outdent,\ni.mce-i-indent,\ni.mce-i-undo,\ni.mce-i-redo,\ni.mce-i-help,\ni.mce-i-wp_help,\ni.mce-i-wp-media-library,\ni.mce-i-ltr,\ni.mce-i-wp_page,\ni.mce-i-hr,\ni.mce-i-wp_code,\ni.mce-i-dashicon,\n.mce-close {\n\tfont: normal 20px/1 dashicons;\n\tpadding: 0;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tmargin-left: -2px;\n\tpadding-right: 2px;\n}\n\n.qt-dfw {\n\tfont: normal 20px/1 dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\ni.mce-i-bold:before {\n\tcontent: \"\\f200\";\n}\n\ni.mce-i-italic:before {\n\tcontent: \"\\f201\";\n}\n\ni.mce-i-bullist:before {\n\tcontent: \"\\f203\";\n}\n\ni.mce-i-numlist:before {\n\tcontent: \"\\f204\";\n}\n\ni.mce-i-blockquote:before {\n\tcontent: \"\\f205\";\n}\n\ni.mce-i-alignleft:before {\n\tcontent: \"\\f206\";\n}\n\ni.mce-i-aligncenter:before {\n\tcontent: \"\\f207\";\n}\n\ni.mce-i-alignright:before {\n\tcontent: \"\\f208\";\n}\n\ni.mce-i-link:before {\n\tcontent: \"\\f103\";\n}\n\ni.mce-i-unlink:before {\n\tcontent: \"\\f225\";\n}\n\ni.mce-i-wp_more:before {\n\tcontent: \"\\f209\";\n}\n\ni.mce-i-strikethrough:before {\n\tcontent: \"\\f224\";\n}\n\ni.mce-i-spellchecker:before {\n\tcontent: \"\\f210\";\n}\n\ni.mce-i-fullscreen:before,\ni.mce-i-wp_fullscreen:before,\ni.mce-i-dfw:before,\n.qt-dfw:before {\n\tcontent: \"\\f211\";\n}\n\ni.mce-i-wp_adv:before {\n\tcontent: \"\\f212\";\n}\n\ni.mce-i-underline:before {\n\tcontent: \"\\f213\";\n}\n\ni.mce-i-alignjustify:before {\n\tcontent: \"\\f214\";\n}\n\ni.mce-i-forecolor:before,\ni.mce-i-backcolor:before {\n\tcontent: \"\\f215\";\n}\n\ni.mce-i-pastetext:before {\n\tcontent: \"\\f217\";\n}\n\ni.mce-i-removeformat:before {\n\tcontent: \"\\f218\";\n}\n\ni.mce-i-charmap:before {\n\tcontent: \"\\f220\";\n}\n\ni.mce-i-outdent:before {\n\tcontent: \"\\f221\";\n}\n\ni.mce-i-indent:before {\n\tcontent: \"\\f222\";\n}\n\ni.mce-i-undo:before {\n\tcontent: \"\\f171\";\n}\n\ni.mce-i-redo:before {\n\tcontent: \"\\f172\";\n}\n\ni.mce-i-help:before,\ni.mce-i-wp_help:before {\n\tcontent: \"\\f223\";\n}\n\ni.mce-i-wp-media-library:before {\n\tcontent: \"\\f104\";\n}\n\ni.mce-i-ltr:before {\n\tcontent: \"\\f320\";\n}\n\ni.mce-i-wp_page:before {\n\tcontent: \"\\f105\";\n}\n\ni.mce-i-hr:before {\n\tcontent: \"\\f460\";\n}\n\n.mce-close:before {\n\tcontent: \"\\f158\";\n}\n\ni.mce-i-wp_code:before {\n\tcontent: \"\\f475\";\n}\n\n/* RTL button icons */\n.rtl i.mce-i-outdent:before {\n\tcontent: \"\\f222\";\n}\n\n.rtl i.mce-i-indent:before {\n\tcontent: \"\\f221\";\n}\n\n/* Editors */\n.wp-editor-wrap {\n\tposition: relative;\n}\n\n.wp-editor-tools {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.wp-editor-tools:after {\n\tclear: both;\n\tcontent: \"\";\n\tdisplay: table;\n}\n\n.wp-editor-container {\n\tclear: both;\n}\n\n.wp-editor-area {\n\tfont-family: Consolas, Monaco, monospace;\n\tfont-size: 13px;\n\tpadding: 10px;\n\tmargin: 1px 0 0;\n\tline-height: 150%;\n\tborder: 0 none;\n\toutline: none;\n\tdisplay: block;\n\tresize: vertical;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.rtl .wp-editor-area {\n\tfont-family: Tahoma, Monaco, monospace;\n}\n\n.locale-he-il .wp-editor-area {\n\tfont-family: Arial, Monaco, monospace;\n}\n\n.wp-editor-container textarea.wp-editor-area {\n\twidth: 100%;\n\tmargin: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-editor-tabs {\n\tfloat: right;\n}\n\n.wp-switch-editor {\n\tfloat: left;\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n\tposition: relative;\n\ttop: 1px;\n\tbackground: #ebebeb;\n\tcolor: #777;\n\tcursor: pointer;\n\tfont: 13px/19px \"Open Sans\", sans-serif;\n\theight: 20px;\n\tmargin: 5px 0 0 5px;\n\tpadding: 3px 8px 4px;\n\tborder: 1px solid #e5e5e5;\n}\n\n.wp-switch-editor:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\toutline: none;\n\tcolor: #23282d;\n}\n\n.wp-switch-editor:active,\n.html-active .switch-html:focus,\n.tmce-active .switch-tmce:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-switch-editor:active {\n\tbackground-color: #f5f5f5;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.js .tmce-active .wp-editor-area {\n\tcolor: white;\n}\n\n.tmce-active .quicktags-toolbar {\n\t display: none;\n}\n\n.tmce-active .switch-tmce,\n.html-active .switch-html {\n\tbackground: #f5f5f5;\n\tcolor: #555;\n\tborder-bottom-color: #f5f5f5;\n}\n\n.wp-media-buttons {\n\tfloat: left;\n}\n\n.wp-media-buttons .button {\n\tmargin-right: 5px;\n\tmargin-bottom: 4px;\n\tpadding-left: 7px;\n\tpadding-right: 7px;\n}\n\n.wp-media-buttons .button:active {\n\tposition: relative;\n\ttop: 1px;\n\tmargin-top: -1px;\n\tmargin-bottom: 1px;\n}\n\n.wp-media-buttons .insert-media {\n\tpadding-left: 5px;\n}\n\n.wp-media-buttons a {\n\ttext-decoration: none;\n\tcolor: #464646;\n\tfont-size: 12px;\n}\n\n.wp-media-buttons img {\n\tpadding: 0 4px;\n\tvertical-align: middle;\n}\n\n.wp-media-buttons span.wp-media-buttons-icon {\n\tdisplay: inline-block;\n\twidth: 18px;\n\theight: 18px;\n\tvertical-align: text-top;\n\tmargin: 0 2px;\n}\n\n.wp-media-buttons .add_media span.wp-media-buttons-icon {\n\tbackground: none;\n}\n\n.wp-media-buttons .add_media span.wp-media-buttons-icon:before {\n\tfont: normal 18px/1 dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.wp-media-buttons .add_media span.wp-media-buttons-icon:before {\n\tcontent: \"\\f104\";\n}\n\n/* Quicktags */\n.quicktags-toolbar {\n\tpadding: 3px;\n\tposition: relative;\n\tborder-bottom: 1px solid #dedede;\n\tbackground: #f5f5f5;\n\tmin-height: 30px;\n}\n\n.has-dfw .quicktags-toolbar {\n\tpadding-right: 35px;\n}\n\n.wp-core-ui .quicktags-toolbar input.button.button-small {\n\tmargin: 2px;\n}\n\n.quicktags-toolbar input[value=\"link\"] {\n\ttext-decoration: underline;\n}\n\n.quicktags-toolbar input[value=\"del\"] {\n\ttext-decoration: line-through;\n}\n\n.quicktags-toolbar input[value=\"i\"] {\n\tfont-style: italic;\n}\n\n.quicktags-toolbar input[value=\"b\"] {\n\tfont-weight: bold;\n}\n\n.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,\n.qt-dfw {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tmargin: 5px 5px 0 0;\n}\n\n.qt-fullscreen {\n\tposition: static;\n\tmargin: 2px;\n}\n\n@media screen and ( max-width: 782px ) {\n\t.mce-toolbar .mce-btn button,\n\t.qt-dfw {\n\t\tpadding: 6px 7px;\n\t}\n\n\t.mce-toolbar .mce-btn-group .mce-btn {\n\t\tmargin: 1px;\n\t}\n\n\t.qt-dfw {\n\t\twidth: 36px;\n\t\theight: 34px;\n\t}\n\n\t.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw {\n\t\tmargin: 4px 4px 0 0;\n\t}\n\n\t.mce-toolbar .mce-colorbutton .mce-preview {\n\t\tleft: 8px;\n\t\tbottom: 6px;\n\t}\n\n\t.mce-window .mce-btn {\n\t\tpadding: 2px 0;\n\t}\n\n\t.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first,\n\t.has-dfw .quicktags-toolbar {\n\t\tpadding-right: 40px;\n\t}\n}\n\n@media screen and ( min-width: 782px ) {\n\t.wp-core-ui .quicktags-toolbar input.button.button-small {\n\t\t/* .button-small is normaly 11px, but a bit too small for these buttons. */\n\t\tfont-size: 12px;\n\t\theight: 26px;\n\t\tline-height: 24px;\n\t}\n}\n\n#wp_editbtns,\n#wp_gallerybtns {\n\tpadding: 2px;\n\tposition: absolute;\n\tdisplay: none;\n\tz-index: 100020;\n}\n\n#wp_editimgbtn,\n#wp_delimgbtn,\n#wp_editgallery,\n#wp_delgallery {\n\tborder-color: #999;\n\tbackground-color: #eee;\n\tmargin: 2px;\n\tpadding: 2px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n}\n\n#wp_editimgbtn:hover,\n#wp_delimgbtn:hover,\n#wp_editgallery:hover,\n#wp_delgallery:hover {\n\tborder-color: #555;\n\tbackground-color: #ccc;\n}\n\n/*------------------------------------------------------------------------------\n wp-link\n------------------------------------------------------------------------------*/\n\n#wp-link-wrap {\n\tdisplay: none;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\twidth: 500px;\n\toverflow: hidden;\n\tmargin-left: -250px;\n\tmargin-top: -125px;\n\tposition: fixed;\n\ttop: 50%;\n\tleft: 50%;\n\tz-index: 100105;\n\t-webkit-transition: height 0.2s, margin-top 0.2s;\n\ttransition: height 0.2s, margin-top 0.2s;\n}\n\n#wp-link-backdrop {\n\tdisplay: none;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tmin-height: 360px;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 100100;\n}\n\n#wp-link {\n\tposition: relative;\n\theight: 100%;\n}\n\n#wp-link-wrap.search-panel-visible {\n\theight: 500px;\n\tmargin-top: -250px;\n}\n\n#wp-link-wrap .wp-link-text-field {\n\tdisplay: none;\n}\n\n#wp-link-wrap.has-text-field .wp-link-text-field {\n\tdisplay: block;\n}\n\n#link-modal-title {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\theight: 36px;\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tline-height: 36px;\n\tpadding: 0 36px 0 16px;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n}\n\n#wp-link-close {\n\tcolor: #666;\n\tpadding: 0;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 36px;\n\theight: 36px;\n\ttext-align: center;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n}\n\n#wp-link-close:before {\n\tfont: normal 20px/36px dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\twidth: 36px;\n\theight: 36px;\n\tcontent: \"\\f158\";\n}\n\n#wp-link-close:hover,\n#wp-link-close:focus {\n\tcolor: #00a0d2;\n}\n\n#wp-link-close:focus {\n\toutline: none;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n#link-selector {\n\tpadding: 0 16px 50px;\n}\n\n#wp-link-wrap.search-panel-visible #link-selector {\n\t-webkit-overflow-scrolling: touch;\n\tpadding: 0 16px;\n\tposition: absolute;\n\ttop: 36px;\n\tleft: 0;\n\tright: 0;\n\tbottom: 44px;\n}\n\n#wp-link ol,\n#wp-link ul {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n#wp-link-search-toggle:after {\n\tdisplay: inline-block;\n\tfont: normal 20px/1 dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcontent: \"\\f140\";\n}\n\n.search-panel-visible #wp-link-search-toggle:after {\n\tcontent: \"\\f142\";\n}\n\n#wp-link input[type=\"text\"] {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n#wp-link #link-options {\n\tpadding: 8px 0 12px;\n}\n\n#wp-link p.howto {\n\tmargin: 3px 0;\n}\n\n#wp-link p.howto a {\n\ttext-decoration: none;\n\tcolor: inherit;\n}\n\n#wp-link-search-toggle {\n\tcursor: pointer;\n}\n\n#wp-link label input[type=\"text\"] {\n\tmargin-top: 5px;\n\twidth: 70%;\n}\n\n#wp-link #link-options label span,\n#wp-link #search-panel label span.search-label {\n\tdisplay: inline-block;\n\twidth: 80px;\n\ttext-align: right;\n\tpadding-right: 5px;\n\tmax-width: 24%;\n\tvertical-align: middle;\n\tword-wrap: break-word;\n}\n\n#wp-link .link-search-field {\n\tfloat: left;\n\twidth: 250px;\n\tmax-width: 70%;\n}\n\n#wp-link .link-search-wrapper {\n\tmargin: 5px 0 9px;\n\tdisplay: block;\n\toverflow: hidden;\n}\n\n#wp-link .link-search-wrapper span {\n\tfloat: left;\n\tmargin-top: 4px;\n}\n\n#wp-link .link-search-wrapper .spinner {\n\tmargin-top: 5px;\n}\n\n#wp-link .link-target {\n\tpadding: 3px 0 0;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n#wp-link .link-target label {\n\tmax-width: 70%;\n}\n\n#wp-link .query-results {\n\tborder: 1px #dfdfdf solid;\n\tmargin: 0;\n\tbackground: #fff;\n\toverflow: auto;\n\tposition: absolute;\n\tleft: 16px;\n\tright: 16px;\n\tbottom: 16px;\n\ttop: 172px;\n}\n\n.has-text-field #wp-link .query-results {\n\ttop: 205px;\n}\n\n#wp-link li {\n\tclear: both;\n\tmargin-bottom: 0;\n\tborder-bottom: 1px solid #f1f1f1;\n\tcolor: #32373c;\n\tpadding: 4px 6px 4px 10px;\n\tcursor: pointer;\n\tposition: relative;\n}\n\n#wp-link .query-notice {\n\tpadding: 0;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground-color: #f7fcfe;\n\tcolor: #000;\n}\n\n#wp-link .query-notice .query-notice-default,\n#wp-link .query-notice .query-notice-hint {\n\tdisplay: block;\n\tpadding: 6px;\n\tborder-left: 4px solid #00a0d2;\n}\n\n#wp-link .unselectable.no-matches-found {\n\tpadding: 0;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground-color: #fef7f1;\n}\n\n#wp-link .no-matches-found .item-title {\n\tdisplay: block;\n\tpadding: 6px;\n\tborder-left: 4px solid #d54e21;\n}\n\n#wp-link .query-results em {\n\tfont-style: normal;\n}\n\n#wp-link li:hover {\n\tbackground: #eaf2fa;\n\tcolor: #151515;\n}\n\n#wp-link li.unselectable {\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n#wp-link li.unselectable:hover {\n\tbackground: #fff;\n\tcursor: auto;\n\tcolor: #32373c;\n}\n\n#wp-link li.selected {\n\tbackground: #ddd;\n\tcolor: #32373c;\n}\n\n#wp-link li.selected .item-title {\n\tfont-weight: bold;\n}\n\n#wp-link li:last-child {\n\tborder: none;\n}\n\n#wp-link .item-title {\n\tdisplay: inline-block;\n\twidth: 80%;\n\twidth: -webkit-calc(100% - 68px);\n\twidth: calc(100% - 68px);\n\tword-wrap: break-word;\n}\n\n#wp-link .item-info {\n\ttext-transform: uppercase;\n\tcolor: #666;\n\tfont-size: 11px;\n\tposition: absolute;\n\tright: 5px;\n\ttop: 5px;\n}\n\n#wp-link #search-results,\n#wp-link #search-panel {\n\tdisplay: none;\n}\n\n#wp-link-wrap.search-panel-visible #search-panel {\n\tdisplay: block;\n}\n\n#wp-link .river-waiting {\n\tdisplay: none;\n\tpadding: 10px 0;\n}\n\n#wp-link .submitbox {\n\tpadding: 8px 16px;\n\tbackground: #fcfcfc;\n\tborder-top: 1px solid #dfdfdf;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n}\n\n#wp-link-cancel {\n\tline-height: 25px;\n\tfloat: left;\n}\n\n#wp-link-update {\n\tline-height: 23px;\n\tfloat: right;\n}\n\n#wp-link-submit {\n\tfloat: right;\n\tmargin-bottom: 0;\n}\n\n@media screen and ( max-width: 782px ) {\n\t#wp-link-wrap {\n\t\tmargin-top: -140px;\n\t}\n\n\t#wp-link-wrap.search-panel-visible .query-results {\n\t\ttop: 195px;\n\t}\n\n\t#wp-link-wrap.search-panel-visible.has-text-field .query-results {\n\t\ttop: 235px;\n\t}\n\n\t#link-selector {\n\t\tpadding: 0 16px 60px;\n\t}\n\n\t#wp-link-wrap.search-panel-visible #link-selector {\n\t\tbottom: 52px;\n\t}\n\n\t#wp-link-cancel {\n\t\tline-height: 32px;\n\t}\n}\n\n@media screen and ( max-width: 520px ) {\n\t#wp-link-wrap {\n\t\twidth: auto;\n\t\tmargin-left: 0;\n\t\tleft: 10px;\n\t\tright: 10px;\n\t\tmax-width: 500px;\n\t}\n}\n\n@media screen and ( max-height: 520px ) {\n\t#wp-link-wrap {\n\t\t-webkit-transition: none;\n\t\ttransition: none;\n\t}\n\n\t#wp-link-wrap.search-panel-visible {\n\t\theight: auto;\n\t\tmargin-top: 0;\n\t\ttop: 10px;\n\t\tbottom: 10px;\n\t}\n\n\t.search-panel-visible #link-selector {\n\t\toverflow: auto;\n\t}\n\n\t.search-panel-visible #search-panel .query-results {\n\t\tposition: static;\n\t}\n}\n\n@media screen and ( max-height: 290px ) {\n\t#wp-link-wrap {\n\t\theight: auto;\n\t\tmargin-top: 0;\n\t\ttop: 10px;\n\t\tbottom: 10px;\n\t}\n\n\t#link-selector {\n\t\toverflow: auto;\n\t\theight: -webkit-calc(100% - 92px);\n\t\theight: calc(100% - 92px);\n\t\tpadding-bottom: 2px;\n\t}\n\n\t#search-panel .query-results {\n\t\tposition: static;\n\t}\n}\n\ndiv.wp-link-preview {\n\tfloat: left;\n\tmargin: 5px;\n\tmax-width: 694px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\ndiv.wp-link-preview a {\n\tcolor: #0073aa;\n\ttext-decoration: underline;\n\t-webkit-transition-property: border, background, color;\n\ttransition-property: border, background, color;\n\t-webkit-transition-duration: .05s;\n\ttransition-duration: .05s;\n\t-webkit-transition-timing-function: ease-in-out;\n\ttransition-timing-function: ease-in-out;\n\tcursor: pointer;\n}\n\n@media screen and ( max-width: 782px ) {\n\tdiv.wp-link-preview {\n\t\tmargin: 8px 0 8px 5px;\n\t\tmax-width: 70%;\n\t\tmax-width: -webkit-calc(100% - 86px);\n\t\tmax-width: calc(100% - 86px);\n\t}\n}\n\n/* =Overlay Body\n-------------------------------------------------------------- */\n\n.mce-fullscreen {\n\tz-index: 100010;\n}\n\n/* =Localization\n-------------------------------------------------------------- */\n.rtl .wp-switch-editor,\n.rtl .quicktags-toolbar input {\n\tfont-family: Tahoma, sans-serif;\n}\n\n/* rtl:ignore */\n.mce-rtl .mce-flow-layout .mce-flow-layout-item > div {\n\tdirection: rtl;\n}\n\n/* rtl:ignore */\n.mce-rtl .mce-listbox i.mce-caret {\n\tleft: 6px;\n}\n\nhtml:lang(he-il) .rtl .wp-switch-editor,\nhtml:lang(he-il) .rtl .quicktags-toolbar input  {\n \tfont-family: Arial, sans-serif;\n}\n\n/* HiDPI */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\t.wp-media-buttons .add_media span.wp-media-buttons-icon {\n\t\tbackground: none;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/jquery-ui-dialog-rtl.css",
    "content": "/*!\n * jQuery UI CSS Framework 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-clearfix {\n\tmin-height: 0; /* support: IE7 */\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tright: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n}\n\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n\n/*!\n * jQuery UI Resizable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tright: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tright: 0;\n}\n/* rtl:ignore */\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n/* rtl:ignore */\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n/* rtl:ignore */\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n/* rtl:ignore */\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n/* rtl:ignore */\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n/* rtl:ignore */\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n\n/* WP buttons: see buttons.css. */\n\n.ui-button {\n\tdisplay: inline-block;\n\ttext-decoration: none;\n\tfont-size: 13px;\n\tline-height: 26px;\n\theight: 28px;\n\tmargin: 0;\n\tpadding: 0 10px 1px;\n\tcursor: pointer;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\twhite-space: nowrap;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tcolor: #555;\n\tborder-color: #cccccc;\n\tbackground: #f7f7f7;\n\t-webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\tbox-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\tvertical-align: top;\n}\n\n.ui-button:active,\n.ui-button:focus {\n\toutline: none;\n}\n\n/* Remove the dotted border on :focus and the extra padding in Firefox */\n.ui-button::-moz-focus-inner {\n\tborder-width: 1px 0;\n\tborder-style: solid none;\n\tborder-color: transparent;\n\tpadding: 0;\n}\n\n.ui-button:hover,\n.ui-button:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.ui-button:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n}\n\n.ui-button:active {\n\tbackground: #eee;\n\tborder-color: #999;\n\tcolor: #32373c;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n\tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n}\n\n.ui-button[disabled],\n.ui-button:disabled {\n\tcolor: #a0a5aa !important;\n\tborder-color: #ddd !important;\n\tbackground: #f7f7f7 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n\ttext-shadow: 0 1px 0 #fff !important;\n\tcursor: default;\n}\n\n@media screen and ( max-width: 782px ) {\n\n\t.ui-button {\n\t\tpadding: 10px 14px;\n\t\tline-height: 1;\n\t\tfont-size: 14px;\n\t\tvertical-align: middle;\n\t\theight: auto;\n\t\tmargin-bottom: 4px;\n\t}\n\n}\n\n/* WP Theme */\n\n.ui-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tz-index: 100102;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n}\n\n.ui-dialog-titlebar {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\theight: 36px;\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tline-height: 36px;\n\tpadding: 0 16px 0 36px;\n}\n\n.ui-button.ui-dialog-titlebar-close {\n\tbackground: none;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcolor: #666;\n\tcursor: pointer;\n\tdisplay: block;\n\tpadding: 0;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 36px;\n\theight: 36px;\n\ttext-align: center;\n}\n\n.ui-dialog-titlebar-close:before {\n\tfont: normal 20px/1 dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tline-height: 36px;\n\twidth: 36px;\n\theight: 36px;\n\tcontent: '\\f158';\n}\n\n.ui-button.ui-dialog-titlebar-close:hover {\n\tcolor: #00a0d2;\n}\n\n.ui-dialog-titlebar-close .ui-button-text {\n\tdisplay: none;\n}\n\n.ui-dialog-content {\n\tpadding: 16px;\n\toverflow: auto;\n}\n\n.ui-dialog-buttonpane {\n\tbackground: #fcfcfc;\n\tborder-top: 1px solid #dfdfdf;\n\tpadding: 16px;\n}\n\n.ui-dialog-buttonpane .ui-button {\n\tmargin-right: 16px;\n}\n\n.ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: left;\n}\n\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tmin-height: 360px;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 100101;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/jquery-ui-dialog.css",
    "content": "/*!\n * jQuery UI CSS Framework 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/theming/\n */\n\n/* Layout helpers\n----------------------------------*/\n.ui-helper-hidden {\n\tdisplay: none;\n}\n.ui-helper-hidden-accessible {\n\tborder: 0;\n\tclip: rect(0 0 0 0);\n\theight: 1px;\n\tmargin: -1px;\n\toverflow: hidden;\n\tpadding: 0;\n\tposition: absolute;\n\twidth: 1px;\n}\n.ui-helper-reset {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\toutline: 0;\n\tline-height: 1.3;\n\ttext-decoration: none;\n\tfont-size: 100%;\n\tlist-style: none;\n}\n.ui-helper-clearfix:before,\n.ui-helper-clearfix:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tborder-collapse: collapse;\n}\n.ui-helper-clearfix:after {\n\tclear: both;\n}\n.ui-helper-clearfix {\n\tmin-height: 0; /* support: IE7 */\n}\n.ui-helper-zfix {\n\twidth: 100%;\n\theight: 100%;\n\ttop: 0;\n\tleft: 0;\n\tposition: absolute;\n\topacity: 0;\n\tfilter:Alpha(Opacity=0); /* support: IE8 */\n}\n\n.ui-front {\n\tz-index: 100;\n}\n\n\n/* Interaction Cues\n----------------------------------*/\n.ui-state-disabled {\n\tcursor: default !important;\n}\n\n\n/* Icons\n----------------------------------*/\n\n/* states and images */\n.ui-icon {\n\tdisplay: block;\n\ttext-indent: -99999px;\n\toverflow: hidden;\n\tbackground-repeat: no-repeat;\n}\n\n\n/* Misc visuals\n----------------------------------*/\n\n/* Overlays */\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n}\n\n/*!\n * jQuery UI Resizable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-resizable {\n\tposition: relative;\n}\n.ui-resizable-handle {\n\tposition: absolute;\n\tfont-size: 0.1px;\n\tdisplay: block;\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n.ui-resizable-disabled .ui-resizable-handle,\n.ui-resizable-autohide .ui-resizable-handle {\n\tdisplay: none;\n}\n.ui-resizable-n {\n\tcursor: n-resize;\n\theight: 7px;\n\twidth: 100%;\n\ttop: -5px;\n\tleft: 0;\n}\n.ui-resizable-s {\n\tcursor: s-resize;\n\theight: 7px;\n\twidth: 100%;\n\tbottom: -5px;\n\tleft: 0;\n}\n/* rtl:ignore */\n.ui-resizable-e {\n\tcursor: e-resize;\n\twidth: 7px;\n\tright: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n/* rtl:ignore */\n.ui-resizable-w {\n\tcursor: w-resize;\n\twidth: 7px;\n\tleft: -5px;\n\ttop: 0;\n\theight: 100%;\n}\n/* rtl:ignore */\n.ui-resizable-se {\n\tcursor: se-resize;\n\twidth: 12px;\n\theight: 12px;\n\tright: 1px;\n\tbottom: 1px;\n}\n/* rtl:ignore */\n.ui-resizable-sw {\n\tcursor: sw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\tbottom: -5px;\n}\n/* rtl:ignore */\n.ui-resizable-nw {\n\tcursor: nw-resize;\n\twidth: 9px;\n\theight: 9px;\n\tleft: -5px;\n\ttop: -5px;\n}\n/* rtl:ignore */\n.ui-resizable-ne {\n\tcursor: ne-resize;\n\twidth: 9px;\n\theight: 9px;\n\tright: -5px;\n\ttop: -5px;\n}\n\n/* WP buttons: see buttons.css. */\n\n.ui-button {\n\tdisplay: inline-block;\n\ttext-decoration: none;\n\tfont-size: 13px;\n\tline-height: 26px;\n\theight: 28px;\n\tmargin: 0;\n\tpadding: 0 10px 1px;\n\tcursor: pointer;\n\tborder-width: 1px;\n\tborder-style: solid;\n\t-webkit-appearance: none;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\twhite-space: nowrap;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tcolor: #555;\n\tborder-color: #cccccc;\n\tbackground: #f7f7f7;\n\t-webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\tbox-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 );\n\tvertical-align: top;\n}\n\n.ui-button:active,\n.ui-button:focus {\n\toutline: none;\n}\n\n/* Remove the dotted border on :focus and the extra padding in Firefox */\n.ui-button::-moz-focus-inner {\n\tborder-width: 1px 0;\n\tborder-style: solid none;\n\tborder-color: transparent;\n\tpadding: 0;\n}\n\n.ui-button:hover,\n.ui-button:focus {\n\tbackground: #fafafa;\n\tborder-color: #999;\n\tcolor: #23282d;\n}\n\n.ui-button:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba( 30, 140, 190, 0.8 );\n}\n\n.ui-button:active {\n\tbackground: #eee;\n\tborder-color: #999;\n\tcolor: #32373c;\n\t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n\tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n}\n\n.ui-button[disabled],\n.ui-button:disabled {\n\tcolor: #a0a5aa !important;\n\tborder-color: #ddd !important;\n\tbackground: #f7f7f7 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n\ttext-shadow: 0 1px 0 #fff !important;\n\tcursor: default;\n}\n\n@media screen and ( max-width: 782px ) {\n\n\t.ui-button {\n\t\tpadding: 10px 14px;\n\t\tline-height: 1;\n\t\tfont-size: 14px;\n\t\tvertical-align: middle;\n\t\theight: auto;\n\t\tmargin-bottom: 4px;\n\t}\n\n}\n\n/* WP Theme */\n\n.ui-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 100102;\n\tbackground-color: #fff;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n}\n\n.ui-dialog-titlebar {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\theight: 36px;\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tline-height: 36px;\n\tpadding: 0 36px 0 16px;\n}\n\n.ui-button.ui-dialog-titlebar-close {\n\tbackground: none;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcolor: #666;\n\tcursor: pointer;\n\tdisplay: block;\n\tpadding: 0;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 36px;\n\theight: 36px;\n\ttext-align: center;\n}\n\n.ui-dialog-titlebar-close:before {\n\tfont: normal 20px/1 dashicons;\n\tvertical-align: top;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tline-height: 36px;\n\twidth: 36px;\n\theight: 36px;\n\tcontent: '\\f158';\n}\n\n.ui-button.ui-dialog-titlebar-close:hover {\n\tcolor: #00a0d2;\n}\n\n.ui-dialog-titlebar-close .ui-button-text {\n\tdisplay: none;\n}\n\n.ui-dialog-content {\n\tpadding: 16px;\n\toverflow: auto;\n}\n\n.ui-dialog-buttonpane {\n\tbackground: #fcfcfc;\n\tborder-top: 1px solid #dfdfdf;\n\tpadding: 16px;\n}\n\n.ui-dialog-buttonpane .ui-button {\n\tmargin-left: 16px;\n}\n\n.ui-dialog-buttonpane .ui-dialog-buttonset {\n\tfloat: right;\n}\n\n.ui-draggable .ui-dialog-titlebar {\n\tcursor: move;\n}\n\n.ui-widget-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tmin-height: 360px;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 100101;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/media-views-rtl.css",
    "content": "/**\n * Base Styles\n */\n.media-modal * {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\n.media-modal input,\n.media-modal select,\n.media-modal textarea {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.media-modal,\n.media-frame {\n\tfont-family: \"Open Sans\", sans-serif;\n\tfont-size: 12px;\n\t-webkit-overflow-scrolling: touch;\n}\n\n.media-frame input,\n.media-frame textarea {\n\tpadding: 6px 8px;\n}\n\n.media-frame select,\n.wp-admin .media-frame select {\n\tline-height: 28px;\n\tmargin-top: 3px;\n}\n\n.media-frame a {\n\tborder-bottom: none;\n\tcolor: #0073aa;\n}\n\n.media-frame a:hover,\n.media-frame a:active {\n\tcolor: #00a0d2;\n}\n\n.media-frame a:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\toutline: none;\n\tcolor: #124964;\n}\n\n.media-frame a.button {\n\tcolor: #32373c;\n}\n\n.media-frame a.button:hover {\n\tcolor: #23282d;\n}\n\n.media-frame a.button-primary,\n.media-frame a.button-primary:hover {\n\tcolor: #fff;\n}\n\n.media-frame input[type=\"text\"],\n.media-frame input[type=\"password\"],\n.media-frame input[type=\"number\"],\n.media-frame input[type=\"search\"],\n.media-frame input[type=\"email\"],\n.media-frame input[type=\"url\"],\n.media-frame textarea,\n.media-frame select {\n\tfont-family: \"Open Sans\", sans-serif;\n\tfont-size: 12px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tborder-color: #dfdfdf;\n}\n\n.media-frame input[type=\"text\"]:focus,\n.media-frame input[type=\"password\"]:focus,\n.media-frame input[type=\"number\"]:focus,\n.media-frame input[type=\"search\"]:focus,\n.media-frame input[type=\"email\"]:focus,\n.media-frame input[type=\"url\"]:focus,\n.media-frame textarea:focus,\n.media-frame select:focus {\n\tborder-color: #5b9dd9;\n}\n\n.media-frame select {\n\theight: 24px;\n\tpadding: 2px;\n}\n\n.media-frame input:disabled,\n.media-frame textarea:disabled,\n.media-frame input[readonly],\n.media-frame textarea[readonly] {\n\tbackground-color: #eee;\n}\n\n.media-frame input[type=\"search\"] {\n\t-webkit-appearance: textfield;\n}\n\n.media-frame :-moz-placeholder {\n   color: #a9a9a9;\n}\n\n.media-frame .hidden {\n\tdisplay: none;\n}\n\n/*!\n * jQuery UI Draggable/Sortable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-draggable-handle,\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n/**\n * Modal\n */\n.media-modal {\n\tposition: fixed;\n\ttop: 30px;\n\tright: 30px;\n\tleft: 30px;\n\tbottom: 30px;\n\tz-index: 160000;\n}\n\n.wp-customizer .media-modal {\n\tz-index: 560000;\n}\n\n.media-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tmin-height: 360px;\n\tbackground: #000;\n\topacity: 0.7;\n\tz-index: 159900;\n}\n\n.wp-customizer .media-modal-backdrop {\n\tz-index: 559900;\n}\n\n.media-modal-close {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 50px;\n\theight: 50px;\n\tpadding: 0;\n\tz-index: 1000;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.media-modal-close:active {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.media-modal-close span.media-modal-icon {\n\tbackground-image: none;\n}\n\n.media-modal-close .media-modal-icon:before {\n\tcontent: \"\\f158\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: middle;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcolor: #666;\n}\n\n.media-modal-close:hover .media-modal-icon:before {\n\tcolor: #00a0d2;\n}\n\n.media-modal-close:active {\n\toutline: 0;\n}\n\n.media-modal-content {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\toverflow: auto;\n\tmin-height: 300px;\n\t-webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.7);\n\tbox-shadow: 0 5px 15px rgba(0,0,0,0.7);\n\tbackground: #fcfcfc;\n\t-webkit-font-smoothing: subpixel-antialiased;\n}\n\n.media-modal-content .media-frame select.attachment-filters {\n\tmargin-top: 11px;\n\tmargin-left: 2%;\n\twidth: 42%;\n\twidth: -webkit-calc(48% - 12px);\n\twidth: calc(48% - 12px);\n}\n\n.media-modal-content .attachments-browser .media-toolbar-secondary {\n\twidth: 66%;\n}\n\n.media-modal-content .media-toolbar-primary.search-form {\n\twidth: 33%;\n}\n\n.media-modal-content .media-toolbar-primary .media-button {\n\tfloat: left;\n}\n\n.media-modal-content .attachments-browser .search {\n\twidth: 100%;\n}\n\n/* higher specificity */\n.wp-core-ui .media-modal-icon {\n\tbackground-image: url(../images/uploader-icons.png);\n\tbackground-repeat: no-repeat;\n}\n\n/**\n * Toolbar\n */\n.media-toolbar {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tz-index: 100;\n\theight: 60px;\n\tpadding: 0 16px;\n\tborder: 0 solid #dfdfdf;\n\toverflow: hidden;\n}\n\n.media-toolbar-primary {\n\tfloat: left;\n\theight: 100%;\n}\n\n.media-toolbar-secondary {\n\tfloat: right;\n\theight: 100%;\n}\n\n.media-toolbar-primary > .media-button,\n.media-toolbar-primary > .media-button-group {\n\tmargin-right: 10px;\n\tfloat: right;\n\tmargin-top: 15px;\n}\n\n.media-toolbar-secondary > .media-button,\n.media-toolbar-secondary > .media-button-group {\n\tmargin-left: 10px;\n\tmargin-top: 15px;\n}\n\n/**\n * Sidebar\n */\n.media-sidebar {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\twidth: 267px;\n\tpadding: 0 16px 24px;\n\tz-index: 75;\n\tbackground: #f3f3f3;\n\tborder-right: 1px solid #ddd;\n\toverflow: auto;\n\t-webkit-overflow-scrolling: touch;\n}\n\n.hide-toolbar .media-sidebar {\n\tbottom: 0;\n}\n\n.media-sidebar .sidebar-title {\n\tfont-size: 20px;\n\tmargin: 0;\n\tpadding: 12px 10px 10px;\n\tline-height: 28px;\n}\n\n.media-sidebar .sidebar-content {\n\tpadding: 0 10px;\n\tmargin-bottom: 130px;\n}\n\n.media-sidebar .search {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n.media-sidebar h3, /* Back-compat for pre-4.4 */\n.image-details h3, /* Back-compat for pre-4.4 */\n.media-sidebar h2,\n.image-details h2 {\n\tposition: relative;\n\tfont-weight: bold;\n\ttext-transform: uppercase;\n\tfont-size: 12px;\n\tcolor: #666;\n\tmargin: 24px 0 8px;\n}\n\n.media-sidebar .setting,\n.attachment-details .setting {\n\tdisplay: block;\n\tfloat: right;\n\twidth: 100%;\n\tmargin: 1px 0;\n}\n\n.media-sidebar .setting label,\n.attachment-details .setting label {\n\tdisplay: block;\n}\n\n.media-sidebar .setting .link-to-custom,\n.attachment-details .setting .link-to-custom {\n\tmargin: 3px 2px 0;\n}\n\n.media-sidebar .setting span,\n.attachment-details .setting span {\n\tmin-width: 30%;\n\tmargin-left: 4%;\n\tfont-size: 12px;\n\ttext-align: left;\n\tword-wrap: break-word;\n}\n\n.media-sidebar .setting .name {\n\tmax-width: 80px;\n}\n\n.media-sidebar .setting select,\n.attachment-details .setting select {\n\tmax-width: 65%;\n}\n\n.media-sidebar .setting input[type=\"checkbox\"],\n.media-sidebar .field input[type=\"checkbox\"],\n.media-sidebar .setting input[type=\"radio\"],\n.media-sidebar .field input[type=\"radio\"],\n.attachment-details .setting input[type=\"checkbox\"],\n.attachment-details .field input[type=\"checkbox\"],\n.attachment-details .setting input[type=\"radio\"],\n.attachment-details .field input[type=\"radio\"] {\n\tfloat: none;\n\tmargin: 8px 3px 0;\n\tpadding: 0;\n}\n\n.media-sidebar .setting span,\n.attachment-details .setting span,\n.compat-item label span {\n\tfloat: right;\n\tmin-height: 22px;\n\tpadding-top: 8px;\n\tline-height: 16px;\n\tfont-weight: normal;\n\tcolor: #666;\n}\n\n.compat-item label span  {\n\ttext-align: left;\n}\n\n.media-sidebar .setting input[type=\"text\"],\n.media-sidebar .setting input[type=\"password\"],\n.media-sidebar .setting input[type=\"email\"],\n.media-sidebar .setting input[type=\"number\"],\n.media-sidebar .setting input[type=\"search\"],\n.media-sidebar .setting input[type=\"tel\"],\n.media-sidebar .setting input[type=\"url\"],\n.media-sidebar .setting textarea,\n.media-sidebar .setting .value,\n.attachment-details .setting input[type=\"text\"],\n.attachment-details .setting input[type=\"password\"],\n.attachment-details .setting input[type=\"email\"],\n.attachment-details .setting input[type=\"number\"],\n.attachment-details .setting input[type=\"search\"],\n.attachment-details .setting input[type=\"tel\"],\n.attachment-details .setting input[type=\"url\"],\n.attachment-details .setting textarea,\n.attachment-details .setting .value {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin: 1px;\n\twidth: 65%;\n\tfloat: left;\n}\n\n.media-sidebar .setting .value,\n.attachment-details .setting .value {\n\tmargin: 0 1px;\n\ttext-align: right;\n}\n\n.media-sidebar .setting textarea,\n.attachment-details .setting textarea,\n.compat-item .field textarea {\n\theight: 62px;\n\tresize: vertical;\n}\n\n.media-sidebar select,\n.attachment-details select {\n\tmargin-top: 3px;\n}\n\n.compat-item {\n\tfloat: right;\n\twidth: 100%;\n\toverflow: hidden;\n}\n\n.compat-item table {\n\twidth: 100%;\n\ttable-layout: fixed;\n\tborder-spacing: 0;\n\tborder: 0;\n}\n\n.compat-item tr {\n\tpadding: 2px 0;\n\tdisplay: block;\n\toverflow: hidden;\n}\n\n.compat-item .label,\n.compat-item .field {\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.compat-item .label {\n\tmin-width: 30%;\n\tmargin-left: 4%;\n\tfloat: right;\n\ttext-align: left;\n}\n\n.compat-item .label span {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n.compat-item .field {\n\tfloat: left;\n\twidth: 65%;\n\tmargin: 1px;\n}\n\n.compat-item .field input[type=\"text\"],\n.compat-item .field input[type=\"password\"],\n.compat-item .field input[type=\"email\"],\n.compat-item .field input[type=\"number\"],\n.compat-item .field input[type=\"search\"],\n.compat-item .field input[type=\"tel\"],\n.compat-item .field input[type=\"url\"],\n.compat-item .field textarea {\n\twidth: 100%;\n\tmargin: 0;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.sidebar-for-errors .attachment-details,\n.sidebar-for-errors .compat-item,\n.sidebar-for-errors .media-sidebar .media-progress-bar,\n.sidebar-for-errors .upload-details {\n\tdisplay: none !important;\n}\n\n/**\n * Menu\n */\n.media-menu {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tmargin: 0;\n\tpadding: 10px 0;\n\tbackground: #f3f3f3;\n\tborder-left-width: 1px;\n\tborder-left-style: solid;\n\tborder-left-color: #ccc;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.media-menu > a {\n\tdisplay: block;\n\tposition: relative;\n\tpadding: 8px 20px;\n\tmargin: 0;\n\tline-height: 18px;\n\tfont-size: 14px;\n\tcolor: #0073aa;\n\ttext-decoration: none;\n}\n\n.media-menu > a:hover {\n\tcolor: #0073aa;\n\tbackground: rgba( 0, 0, 0, 0.04 );\n}\n\n.media-menu > a:active {\n\toutline: none;\n}\n\n.media-menu .active,\n.media-menu .active:hover {\n\tcolor: #23282d;\n\tfont-weight: bold;\n}\n\n.media-menu .separator {\n\theight: 0;\n\tmargin: 12px 20px;\n\tpadding: 0;\n\tborder-top: 1px solid #ddd;\n}\n\n/**\n * Menu\n */\n.media-router {\n\tposition: relative;\n\tpadding: 0 6px;\n\tmargin: 0;\n\tclear: both;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.media-router a {\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n.media-router > a {\n\tposition: relative;\n\tfloat: right;\n\tpadding: 8px 10px 9px;\n\tmargin: 0;\n\theight: 18px;\n\tline-height: 18px;\n\tfont-size: 14px;\n\ttext-decoration: none;\n}\n\n.media-router > a:last-child {\n\tborder-left: 0;\n}\n\n.media-router > a:active {\n\toutline: none;\n}\n\n.media-router .active,\n.media-router .active:hover {\n\tcolor: #32373c;\n}\n\n.media-router .active,\n.media-router > a.active:last-child {\n\tmargin: -1px -1px 0;\n\tbackground: #fff;\n\tborder: 1px solid #ddd;\n\tborder-bottom: none;\n}\n\n.media-router .active:after {\n\tdisplay: none;\n}\n\n/**\n * Frame\n */\n.media-frame {\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.media-frame-menu {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\twidth: 200px;\n\tz-index: 150;\n}\n\n.media-frame-title {\n\tposition: absolute;\n\ttop: 0;\n\tright: 200px;\n\tleft: 0;\n\theight: 50px;\n\tz-index: 200;\n}\n\n.media-frame-router {\n\tposition: absolute;\n\ttop: 50px;\n\tright: 200px;\n\tleft: 0;\n\theight: 36px;\n\tz-index: 200;\n}\n\n.media-frame-content {\n\tposition: absolute;\n\ttop: 84px;\n\tright: 200px;\n\tleft: 0;\n\tbottom: 61px;\n\theight: auto;\n\twidth: auto;\n\tmargin: 0;\n\toverflow: auto;\n\tbackground: #fff;\n\tborder-top: 1px solid #ddd;\n\tborder-bottom: 1px solid #ddd;\n}\n\n.media-frame-toolbar {\n\tposition: absolute;\n\tright: 200px;\n\tleft: 0;\n\tbottom: 0;\n\theight: 60px;\n\tz-index: 100;\n}\n\n.media-frame.hide-menu .media-frame-title,\n.media-frame.hide-menu .media-frame-router,\n.media-frame.hide-menu .media-frame-toolbar,\n.media-frame.hide-menu .media-frame-content {\n\tright: 0;\n}\n\n.media-frame.hide-menu .media-frame-menu {\n\tright: -200px;\n}\n\n.media-frame.hide-toolbar .media-frame-content {\n\tbottom: 0;\n}\n\n.media-frame.hide-toolbar .media-frame-toolbar {\n\tbottom: -61px;\n}\n\n.media-frame.hide-router .media-frame-content {\n\ttop: 50px;\n}\n\n.media-frame.hide-router .media-frame-router {\n\tdisplay: none;\n}\n\n.media-frame.hide-router .media-frame-title {\n\tborder-bottom: 1px solid #dfdfdf;\n\t-webkit-box-shadow: 0 4px 4px -4px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: 0 4px 4px -4px rgba( 0, 0, 0, 0.1 );\n}\n\n.media-frame-title .dashicons {\n\tdisplay: none;\n}\n\n.media-frame-title h1 {\n\tpadding: 0 16px;\n\tfont-size: 22px;\n\tline-height: 50px;\n\tmargin: 0;\n}\n\n.media-frame-title .suggested-dimensions {\n\tfont-size: 14px;\n\tfloat: left;\n\tmargin-left: 20px;\n}\n\n.media-frame-content .crop-content {\n\theight: 100%;\n}\n\n.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon {\n\tmargin-left: 300px;\n}\n\n.media-frame-content .crop-content .crop-image {\n\tdisplay: block;\n\tmargin: auto;\n\tmax-width: 100%;\n\tmax-height: 100%;\n}\n\n.media-frame-content .crop-content .upload-errors\n{\n\tposition: absolute;\n\twidth: 300px;\n\ttop: 50%;\n\tright: 50%;\n\tmargin-right: -150px;\n\tmargin-left: -150px;\n\tz-index: 600000;\n}\n\n/**\n * Iframes\n */\n.media-frame .media-iframe {\n\toverflow: hidden;\n}\n\n.media-frame .media-iframe,\n.media-frame .media-iframe iframe {\n\theight: 100%;\n\twidth: 100%;\n\tborder: 0;\n}\n\n/**\n * Attachment Browser Filters\n */\n.media-frame select.attachment-filters {\n\tmargin-top: 11px;\n\tmargin-left: 2%;\n\tmax-width: 42%;\n\tmax-width: -webkit-calc(48% - 12px);\n\tmax-width: calc(48% - 12px);\n}\n\n.media-frame select.attachment-filters:last-of-type {\n\tmargin-left: 0;\n}\n\n/**\n * Search\n */\n.media-frame .search {\n\tmargin-top: 11px;\n\tpadding: 4px;\n\tfont-size: 13px;\n\tcolor: #464646;\n\tfont-family: \"Open Sans\", sans-serif;\n\t-webkit-appearance: none;\n}\n\n.media-toolbar-primary .search {\n\tmax-width: 100%;\n}\n\n/**\n * Attachments\n */\n.wp-core-ui .attachments {\n\tmargin: 0;\n\t-webkit-overflow-scrolling: touch;\n}\n\n/**\n * Attachment\n */\n.wp-core-ui .attachment {\n\tposition: relative;\n\tfloat: right;\n\tpadding: 8px;\n\tmargin: 0;\n\tcolor: #464646;\n\tcursor: pointer;\n\tlist-style: none;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\twidth: 25%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.wp-core-ui .attachment:focus,\n.wp-core-ui .selected.attachment:focus,\n.wp-core-ui .attachment.details:focus {\n\t-webkit-box-shadow:\n\t\tinset 0 0 2px 3px #fff,\n\t\tinset 0 0 0 7px #5b9dd9;\n\tbox-shadow:\n\t\tinset 0 0 2px 3px #fff,\n\t\tinset 0 0 0 7px #5b9dd9;\n\toutline: none;\n}\n\n.wp-core-ui .selected.attachment {\n\t-webkit-box-shadow:\n\t\tinset 0 0 0 5px #fff,\n\t\tinset 0 0 0 7px #ccc;\n\tbox-shadow:\n\t\tinset 0 0 0 5px #fff,\n\t\tinset 0 0 0 7px #ccc;\n}\n\n.wp-core-ui .attachment.details {\n\t-webkit-box-shadow:\n\t\tinset 0 0 0 3px #fff,\n\t\tinset 0 0 0 7px #0073aa;\n\tbox-shadow:\n\t\tinset 0 0 0 3px #fff,\n\t\tinset 0 0 0 7px #0073aa;\n}\n\n.wp-core-ui .attachment-preview {\n\tposition: relative;\n\t-webkit-box-shadow:\n\t\tinset 0 0 15px rgba( 0, 0, 0, 0.1 ),\n\t\tinset 0 0 0 1px rgba( 0, 0, 0, 0.05 );\n\tbox-shadow:\n\t\tinset 0 0 15px rgba( 0, 0, 0, 0.1 ),\n\t\tinset 0 0 0 1px rgba( 0, 0, 0, 0.05 );\n\tbackground: #eee;\n\tcursor: pointer;\n}\n\n.wp-core-ui .attachment-preview:before {\n\tcontent: \"\";\n\tdisplay: block;\n\tpadding-top: 100%;\n}\n\n.wp-core-ui .attachment .icon {\n\tmargin: 0 auto;\n\toverflow: hidden;\n}\n\n.wp-core-ui .attachment .thumbnail {\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tright: 0;\n\topacity: 1;\n\t-webkit-transition: opacity .1s;\n\ttransition: opacity .1s;\n}\n\n.wp-core-ui .attachment .portrait img {\n\tmax-width: 100%;\n}\n\n.wp-core-ui .attachment .landscape img {\n\tmax-height: 100%;\n}\n\n.wp-core-ui .attachment .thumbnail:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\t-webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );\n\toverflow: hidden;\n}\n\n.wp-core-ui .attachment .thumbnail img {\n\ttop: 0;\n\tright: 0;\n}\n\n.wp-core-ui .attachment .thumbnail .centered {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n\theight: 100%;\n\t-webkit-transform: translate( -50%, 50% );\n\t-ms-transform: translate(-50%,50%); /* Fails with spaces?? Weird! */\n\ttransform: translate( -50%, 50% );\n}\n\n.wp-core-ui .attachment .thumbnail .centered img {\n\t-webkit-transform: translate( 50%, -50% );\n\t-ms-transform: translate(50%,-50%);\n\ttransform: translate( 50%, -50% );\n}\n\n.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon {\n\t-webkit-transform: translate( 50%, -70% );\n\t-ms-transform: translate(50%,-70%);\n\ttransform: translate( 50%, -70% );\n}\n\n.ie8 .wp-core-ui .attachment img.icon {\n\ttop: 20%;\n\tposition: relative;\n}\n\n.wp-core-ui .attachment .filename {\n\tposition: absolute;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tmax-height: 100%;\n\tword-wrap: break-word;\n\ttext-align: center;\n\tfont-weight: bold;\n\tbackground: rgba( 255, 255, 255, 0.8 );\n\t-webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 );\n}\n\n.wp-core-ui .attachment .filename div {\n\tpadding: 5px 10px;\n}\n\n.wp-core-ui .attachment .thumbnail img {\n\tposition: absolute;\n}\n\n.wp-core-ui .attachment-close {\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 5px;\n\tleft: 5px;\n\theight: 22px;\n\twidth: 22px;\n\tpadding: 0;\n\tbackground-color: #fff;\n\tbackground-position: -96px 4px;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\t-webkit-box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 );\n}\n\n.wp-core-ui .attachment-close:hover,\n.wp-core-ui .attachment-close:focus {\n\tbackground-position: -36px 4px;\n}\n\n.wp-core-ui .attachment .check {\n\tdisplay: none;\n\theight: 24px;\n\twidth: 24px;\n\tpadding: 0;\n\tposition: absolute;\n\tz-index: 10;\n\ttop: 0;\n\tleft: 0;\n\toutline: none;\n\tbackground: #eee;\n\t-webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba( 0, 0, 0, 0.15 );\n}\n\n.wp-core-ui .attachment .check .media-modal-icon {\n\tdisplay: block;\n\tbackground-position: -1px 0;\n\theight: 15px;\n\twidth: 15px;\n\tmargin: 5px;\n}\n\n.wp-core-ui .attachment .check:hover .media-modal-icon {\n\tbackground-position: -40px 0;\n}\n\n.wp-core-ui .attachment.selected .check {\n\tdisplay: block;\n}\n\n.wp-core-ui .attachment.details .check,\n.wp-core-ui .attachment.selected .check:focus,\n.wp-core-ui .media-frame.mode-grid .attachment.selected .check {\n\tbackground-color: #0073aa;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 0 2px #0073aa;\n\tbox-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 0 2px #0073aa;\n}\n\n.wp-core-ui .attachment.details .check .media-modal-icon,\n.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon {\n\tbackground-position: -21px 0;\n}\n\n.wp-core-ui .attachment.details .check:hover .media-modal-icon,\n.wp-core-ui .attachment.selected .check:focus .media-modal-icon,\n.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon {\n\tbackground-position: -60px 0;\n}\n\n.wp-core-ui .media-frame .attachment .describe {\n\tposition: relative;\n\tdisplay: block;\n\twidth: 100%;\n\tmargin: 0;\n\tpadding: 8px;\n\tfont-size: 12px;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n\n/**\n * Attachments Browser\n */\n.media-frame .attachments-browser {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n}\n\n.attachments-browser .media-toolbar {\n\tleft: 300px;\n\theight: 50px;\n}\n\n.attachments-browser.hide-sidebar .media-toolbar {\n\tleft: 0;\n}\n\n.attachments-browser .media-toolbar-primary > .media-button,\n.attachments-browser .media-toolbar-primary > .media-button-group,\n.attachments-browser .media-toolbar-secondary > .media-button,\n.attachments-browser .media-toolbar-secondary > .media-button-group {\n\tmargin: 11px 0;\n}\n\n.attachments-browser .attachments {\n\tpadding: 2px 8px 8px;\n}\n\n.attachments-browser .attachments,\n.attachments-browser .uploader-inline {\n\tposition: absolute;\n\ttop: 50px;\n\tright: 0;\n\tleft: 300px;\n\tbottom: 0;\n\toverflow: auto;\n\toutline: none;\n}\n\n.attachments-browser .uploader-inline.hidden {\n\tdisplay: none;\n}\n\n.attachments-browser .media-toolbar-primary {\n\tmax-width: 33%;\n}\n\n.attachments-browser .media-toolbar-secondary {\n\tmax-width: 66%;\n}\n\n.uploader-inline .close {\n\tbackground-color: transparent;\n\tborder: 0;\n\tcursor: pointer;\n\theight: 48px;\n\tposition: absolute;\n\tleft: 0;\n\ttext-align: center;\n\ttop: 0;\n\twidth: 50px;\n\tz-index: 1;\n}\n\n.uploader-inline .close:before {\n\tfont: normal 30px/50px dashicons !important;\n\tcolor: #777;\n\tdisplay: inline-block;\n\tcontent: \"\\f335\";\n\tfont-weight: 300;\n}\n\n.attachments-browser.hide-sidebar .attachments,\n.attachments-browser.hide-sidebar .uploader-inline {\n\tleft: 0;\n\tmargin-left: 0;\n}\n\n.attachments-browser .instructions {\n\tdisplay: inline-block;\n\tmargin-top: 16px;\n\tline-height: 18px;\n\tfont-size: 13px;\n\tcolor: #666;\n\tmargin-left: 0.5em;\n}\n\n.attachments-browser .no-media {\n\tpadding: 2em 2em 0 0;\n}\n\n/**\n * Progress Bar\n */\n.media-progress-bar {\n\tposition: relative;\n\theight: 10px;\n\twidth: 70%;\n\tmargin: 10px auto;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n\tbackground: #dfdfdf;\n\tbackground: rgba( 0, 0, 0, 0.1 );\n}\n\n.media-progress-bar div {\n\theight: 10px;\n\tmin-width: 20px;\n\twidth: 0;\n\tbackground: #0073aa;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n\t-webkit-transition: width 300ms;\n\ttransition: width 300ms;\n}\n\n.media-uploader-status .media-progress-bar {\n\tdisplay: none;\n\twidth: 100%;\n}\n\n.uploading.media-uploader-status .media-progress-bar {\n\tdisplay: block;\n}\n\n.attachment-preview .media-progress-bar {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 15%;\n\twidth: 70%;\n\tmargin: -5px 0 0 0;\n}\n\n.media-uploader-status {\n\tposition: relative;\n\tmargin: 0 auto;\n\tpadding-bottom: 10px;\n\tmax-width: 400px;\n}\n\n.uploader-inline .media-uploader-status h3, /* Back-compat for pre-4.4 */\n.uploader-inline .media-uploader-status h2 {\n\tdisplay: none;\n}\n\n.media-uploader-status .upload-details {\n\tdisplay: none;\n\tfont-size: 12px;\n\tcolor: #666;\n}\n\n.uploading.media-uploader-status .upload-details {\n\tdisplay: block;\n}\n\n.media-uploader-status .upload-detail-separator {\n\tpadding: 0 4px;\n}\n\n.media-uploader-status .upload-count {\n\tcolor: #464646;\n}\n\n.media-uploader-status .upload-dismiss-errors,\n.media-uploader-status .upload-errors {\n\tdisplay: none;\n}\n\n.errors.media-uploader-status .upload-dismiss-errors,\n.errors.media-uploader-status .upload-errors {\n\tdisplay: block;\n}\n\n.media-uploader-status .upload-dismiss-errors {\n\ttext-decoration: none;\n}\n\n.media-sidebar .media-uploader-status .upload-dismiss-errors {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.upload-errors .upload-error {\n\tpadding: 12px;\n\tmargin-bottom: 12px;\n\tbackground: #fff;\n\tborder-right: 4px solid #dc3232;\n\t-webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);\n\tbox-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);\n}\n\n.uploader-inline .upload-errors .upload-error {\n\tbackground-color: #fbeaea;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.upload-errors .upload-error-filename {\n\tfont-weight: bold;\n}\n\n.upload-errors .upload-error-message {\n\tdisplay: block;\n\tpadding-top: 8px;\n\tword-wrap: break-word;\n}\n\n.uploader-window {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tbackground: rgba( 0, 86, 132, 0.9 );\n\tz-index: 250000;\n\tdisplay: none;\n\ttext-align: center;\n\topacity: 0;\n\t-webkit-transition: opacity 250ms;\n\ttransition: opacity 250ms;\n}\n\n.uploader-window-content {\n\tposition: absolute;\n\ttop: 10px;\n\tright: 10px;\n\tleft: 10px;\n\tbottom: 10px;\n\tborder: 1px dashed #fff;\n}\n\n.uploader-window h3, /* Back-compat for pre-4.4 */\n.uploader-window h1 {\n\tmargin: -0.5em 0 0;\n\tposition: absolute;\n\ttop: 50%;\n\tright: 0;\n\tleft: 0;\n\t-webkit-transform: translateY( -50% );\n\t-ms-transform: translateY(-50%);\n\ttransform: translateY( -50% );\n\tfont-size: 40px;\n\tcolor: #fff;\n\tpadding: 0;\n}\n\n.uploader-window .media-progress-bar {\n\tmargin-top: 20px;\n\tmax-width: 300px;\n\tbackground: transparent;\n\tborder-color: #fff;\n\tdisplay: none;\n}\n\n.uploader-window .media-progress-bar div {\n\tbackground: #fff;\n}\n\n.uploading .uploader-window .media-progress-bar {\n\tdisplay: block;\n}\n\n.media-frame .uploader-inline {\n\tmargin-bottom: 20px;\n\tpadding: 0;\n\ttext-align: center;\n}\n\n.uploader-inline-content {\n\tposition: absolute;\n\ttop: 30%;\n\tright: 0;\n\tleft: 0;\n}\n\n.uploader-inline-content .upload-ui {\n\tmargin: 2em 0;\n}\n\n.uploader-inline-content .post-upload-ui {\n\tmargin-bottom: 2em;\n}\n\n.uploader-inline .has-upload-message .upload-ui {\n\tmargin: 0 0 4em;\n}\n\n.uploader-inline h3, /* Back-compat for pre-4.4 */\n.uploader-inline h2 {\n\tfont-size: 20px;\n\tline-height: 28px;\n\tfont-weight: 400;\n\tmargin: 0;\n}\n\n.uploader-inline .has-upload-message .upload-instructions {\n\tfont-size: 14px;\n\tcolor: #464646;\n\tfont-weight: normal;\n}\n\n.uploader-inline .drop-instructions {\n\tdisplay: none;\n}\n\n.supports-drag-drop .uploader-inline .drop-instructions {\n\tdisplay: block;\n}\n\n.uploader-inline p {\n\tfont-size: 12px;\n\tmargin: 0.5em 0;\n}\n\n.uploader-inline .media-progress-bar {\n\tdisplay: none;\n}\n\n.uploading.uploader-inline .media-progress-bar {\n\tdisplay: block;\n}\n\n.uploader-inline .browser {\n\tdisplay: inline-block !important;\n}\n\n/**\n * Selection\n */\n.media-selection {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 350px;\n\theight: 60px;\n\tpadding: 0 16px 0 0;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.media-selection .selection-info {\n\tdisplay: inline-block;\n\tfont-size: 12px;\n\theight: 60px;\n\tmargin-left: 10px;\n\tvertical-align: top;\n}\n\n.media-selection.empty,\n.media-selection.editing {\n\tdisplay: none;\n}\n\n.media-selection.one .edit-selection {\n\tdisplay: none;\n}\n\n.media-selection .count {\n\tdisplay: block;\n\tpadding-top: 12px;\n\tfont-size: 14px;\n\tline-height: 20px;\n\tfont-weight: bold;\n}\n\n.media-selection .button-link {\n\tfloat: right;\n\tpadding: 1px 8px;\n\tmargin: 1px -8px 1px 8px;\n\tline-height: 16px;\n\tborder-left: 1px solid #dfdfdf;\n\tcolor: #0073aa;\n}\n\n.media-selection .button-link:hover,\n.media-selection .button-link:focus {\n\tcolor: #00a0d2;\n}\n\n.media-selection .button-link:last-child {\n\tborder-left: 0;\n\tmargin-left: 0;\n}\n\n.selection-info .clear-selection {\n\tcolor: #bc0b0b;\n}\n\n.selection-info .clear-selection:hover,\n.selection-info .clear-selection:focus {\n\tcolor: red;\n}\n\n.media-selection .selection-view {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.media-selection .attachments {\n\tdisplay: inline-block;\n\theight: 48px;\n\tmargin: 6px;\n\tpadding: 0;\n\toverflow: hidden;\n\tvertical-align: top;\n}\n\n.media-selection .attachment {\n\twidth: 40px;\n\tpadding: 0;\n\tmargin: 4px;\n}\n\n.media-selection .attachment .thumbnail {\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tright: 0;\n}\n\n.media-selection .attachment .icon {\n\twidth: 50%;\n}\n\n.media-selection .attachment-preview {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: none;\n}\n\n.wp-core-ui .media-selection .attachment:focus,\n.wp-core-ui .media-selection .selected.attachment:focus,\n.wp-core-ui .media-selection .attachment.details:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 2px 3px #5b9dd9;\n\tbox-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 2px 3px #5b9dd9;\n}\n\n.wp-core-ui .media-selection .selected.attachment {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-core-ui .media-selection .attachment.details {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 0 3px #0073aa;\n\tbox-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 0 3px #0073aa;\n}\n\n.media-selection:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\twidth: 25px;\n\tbackground-image: -webkit-gradient(linear, left top, right top, from(rgba( 255, 255, 255, 1 )), to(rgba( 255, 255, 255, 0 )));\n\tbackground-image: -webkit-linear-gradient(left, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 ));\n\tbackground-image: linear-gradient(to right, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 ));\n}\n\n.media-selection .attachment .filename {\n\tdisplay: none;\n}\n\n/**\n * Spinner\n */\n.media-frame .spinner {\n\tbackground: url(../images/spinner.gif) no-repeat;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\tfloat: left;\n\tdisplay: inline-block;\n\tvisibility: hidden;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 0;\n\tvertical-align: middle;\n}\n\n.media-frame .spinner.is-active {\n\tvisibility: visible;\n}\n\n.media-toolbar .spinner {\n\tmargin-top: 14px;\n}\n\n/**\n * Attachment Details\n */\n.attachment-details {\n\tposition: relative;\n\toverflow: auto;\n}\n\n.attachment-details .settings-save-status {\n\tfloat: left;\n\ttext-transform: none;\n\tz-index: 10;\n}\n\n.attachment-details .settings-save-status .spinner {\n\tmargin-right: 5px;\n}\n\n.attachment-details .settings-save-status .saved {\n\tfloat: left;\n\tdisplay: none;\n}\n\n.attachment-details.save-waiting .settings-save-status .spinner {\n\tvisibility: visible;\n}\n\n.attachment-details.save-complete .settings-save-status .saved {\n\tdisplay: block;\n}\n\n.attachment-info {\n\toverflow: hidden;\n\tmin-height: 60px;\n\tmargin-bottom: 16px;\n\tline-height: 18px;\n\tcolor: #666;\n\tborder-bottom: 1px solid #ddd;\n\tpadding-bottom: 11px;\n}\n\n.attachment-info .filename {\n\tfont-weight: bold;\n\tcolor: #464646;\n\tword-wrap: break-word;\n}\n\n.attachment-info .thumbnail {\n\tposition: relative;\n\tfloat: right;\n\tmax-width: 120px;\n\tmax-height: 120px;\n\tmargin-top: 5px;\n\tmargin-left: 10px;\n\tmargin-bottom: 5px;\n}\n\n.uploading .attachment-info .thumbnail {\n\twidth: 120px;\n\theight: 80px;\n\t-webkit-box-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.1 );\n}\n\n.uploading .attachment-info .media-progress-bar {\n\tmargin-top: 35px;\n}\n\n.attachment-info .thumbnail-image:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\t-webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 );\n\toverflow: hidden;\n}\n\n.attachment-info .thumbnail img {\n\tdisplay: block;\n\tmax-width: 120px;\n\tmax-height: 120px;\n\tmargin: 0 auto;\n}\n\n.attachment-info .details {\n\tfloat: right;\n\tfont-size: 12px;\n\tmax-width: 100%;\n}\n\n.attachment-info .edit-attachment,\n.attachment-info .delete-attachment,\n.attachment-info .trash-attachment,\n.attachment-info .untrash-attachment {\n\tdisplay: block;\n\ttext-decoration: none;\n\twhite-space: nowrap;\n}\n\n.attachment-details.needs-refresh .attachment-info .edit-attachment {\n\tdisplay: none;\n}\n\n.attachment-info .edit-attachment {\n\tdisplay: block;\n}\n\n.media-modal .delete-attachment,\n.media-modal .trash-attachment,\n.media-modal .untrash-attachment {\n\tdisplay: inline;\n\tpadding: 0;\n\tcolor: #bc0b0b;\n}\n\n.media-modal .delete-attachment:hover,\n.media-modal .delete-attachment:focus,\n.media-modal .trash-attachment:hover,\n.media-modal .trash-attachment:focus,\n.media-modal .untrash-attachment:hover,\n.media-modal .untrash-attachment:focus {\n\tcolor: red;\n}\n\n/**\n * Attachment Display Settings\n */\n.attachment-display-settings {\n\twidth: 100%;\n\tfloat: right;\n\toverflow: hidden;\n}\n\n.attachment-display-settings h4 {\n\tmargin: 1.4em 0 0.4em;\n}\n\n.collection-settings {\n\toverflow: hidden;\n}\n\n.collection-settings .setting input[type=\"checkbox\"] {\n\tfloat: right;\n\tmargin-left: 8px;\n}\n\n.collection-settings .setting span {\n\tmin-width: inherit;\n}\n\n/**\n * Image Editor\n */\n.media-modal .imgedit-wrap {\n\tposition: static;\n}\n\n.media-modal .imgedit-wait {\n\theight: auto !important;\n\tleft: 0;\n\tbottom: 0;\n\tright: 0;\n}\n\n.media-modal .imgedit-wrap .imgedit-panel-content {\n\tpadding: 16px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 282px;\n\tbottom: 0;\n\tright: 0;\n\toverflow: auto;\n}\n\n.media-modal .imgedit-wrap .imgedit-settings {\n\tbackground: #f3f3f3;\n\tborder-right: 1px solid #ddd;\n\tpadding: 0 16px 16px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\twidth: 250px;\n\toverflow: auto;\n}\n\n.media-modal .imgedit-group {\n\tbackground: none;\n\tborder: none;\n\tborder-bottom: 1px solid #ddd;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tmargin: 0;\n\tmargin-bottom: 16px;\n\tpadding: 0;\n\tpadding-bottom: 16px;\n\tposition: relative; /* RTL fix, #WP29352 */\n}\n\n.media-modal .imgedit-group:last-of-type {\n\tborder: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.media-modal .imgedit-group-top h3, /* Back-compat for pre-4.4 */\n.media-modal .imgedit-group-top h2 {\n\ttext-transform: uppercase;\n\tfont-size: 12px;\n\tcolor: #666;\n\tmargin: 0;\n\tmargin-top: 24px;\n}\n\n.media-modal .imgedit-group-top h3 a, /* Back-compat for pre-4.4 */\n.media-modal .imgedit-group-top h2 a {\n\ttext-decoration: none;\n\tcolor: #666;\n}\n\n.media-modal .imgedit-help-toggle {\n\tmargin-top: -2px;\n\tcursor: pointer;\n\tcolor: #666;\n}\n\n.media-modal .imgedit-help-toggled span.dashicons:before {\n\tcontent: \"\\f142\";\n}\n\n.media-modal .imgedit-group img {\n\tmargin-top: 5px;\n}\n\n.media-modal .imgedit-wrap div.updated {\n\tmargin: 0;\n\tmargin-bottom: 16px;\n}\n\n\n/**\n * Embed from URL and Image Details\n */\n.embed-url {\n\tdisplay: block;\n\tposition: relative;\n\tpadding: 16px;\n\tmargin: 0;\n\tz-index: 250;\n\tbackground: #fff;\n\tfont-size: 18px;\n}\n\n.media-frame .embed-url input {\n\tfont-size: 18px;\n\tpadding: 12px 14px;\n\twidth: 100%;\n\tmin-width: 200px;\n\t-webkit-box-shadow: inset -2px 2px 4px -2px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset -2px 2px 4px -2px rgba( 0, 0, 0, 0.1 );\n}\n\n.media-frame .embed-url .spinner {\n\tposition: absolute;\n\ttop: 32px;\n\tleft: 26px;\n}\n\n.media-frame .embed-loading .embed-url .spinner {\n\tvisibility: visible;\n}\n\n.embed-link-settings,\n.embed-media-settings {\n\tposition: absolute;\n\ttop: 70px;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\tpadding: 16px 16px 32px;\n\toverflow: auto;\n}\n\n.media-embed .embed-link-settings {\n\t/* avoid Firefox to give focus to the embed preview container parent */\n\toverflow: visible;\n}\n\n.embed-preview img,\n.embed-preview iframe,\n.embed-preview embed,\n.mejs-container video {\n\tmax-width: 100%;\n\tvertical-align: middle;\n}\n\n.embed-preview a {\n\tdisplay: inline-block;\n}\n\n.embed-preview img {\n\tdisplay: block;\n\theight: auto;\n}\n\n.mejs-container:focus {\n\toutline: 1px solid #5b9dd9;\n\t-webkit-box-shadow: 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.image-details .media-modal {\n\tright: 140px;\n\tleft: 140px;\n}\n\n.image-details .media-frame-title,\n.image-details .media-frame-content,\n.image-details .media-frame-router {\n\tright: 0;\n}\n\n.image-details .embed-media-settings {\n\ttop: 0;\n\toverflow: visible;\n\tpadding: 0;\n}\n\n.image-details .embed-media-settings,\n.image-details .embed-media-settings div {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.image-details .column-settings {\n\tbackground: #f3f3f3;\n\tborder-left: 1px solid #ddd;\n\tmin-height: 100%;\n\twidth: 55%;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n}\n\n.image-details .column-settings h3, /* Back-compat for pre-4.4 */\n.image-details .column-settings h2 {\n\tmargin: 20px;\n\tpadding-top: 20px;\n\tborder-top: 1px solid #ddd;\n\tcolor: #23282d;\n}\n\n.image-details .column-image {\n\twidth: 45%;\n\tposition: absolute;\n\tright: 55%;\n\ttop: 0;\n}\n\n.image-details .image {\n\tmargin: 20px;\n}\n\n.image-details .image img {\n\tmax-width: 100%;\n\tmax-height: 500px;\n}\n\n.image-details .advanced-toggle {\n\tpadding: 0;\n\tcolor: #666;\n\ttext-transform: uppercase;\n}\n\n.image-details .advanced-toggle:after {\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcontent: \"\\f140\";\n\tdisplay: inline-block;\n\tmargin-top: -2px;\n}\n\n.image-details .advanced-visible .advanced-toggle:after {\n\tcontent: \"\\f142\";\n}\n\n.image-details .embed-media-settings .size {\n\tmargin-bottom: 4px;\n}\n\n.image-details .custom-size span {\n\tdisplay: block;\n}\n\n.image-details .custom-size label {\n\tdisplay: block;\n\tfloat: right;\n}\n\n.image-details .custom-size span small {\n\tcolor: #999;\n\tfont-size: inherit;\n}\n\n.image-details .custom-size input {\n\twidth: 5em;\n}\n\n.image-details .custom-size .sep {\n\tfloat: right;\n\tmargin: 26px 6px 0 6px;\n}\n\n.image-details .custom-size:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tclear: both;\n}\n\n.media-embed .thumbnail {\n\tmax-width: 100%;\n\tmax-height: 200px;\n\tposition: relative;\n\tfloat: right;\n}\n\n.media-embed .thumbnail img {\n\tmax-height: 200px;\n\tdisplay: block;\n}\n\n.media-embed .thumbnail:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\tbottom: 0;\n\t-webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );\n\toverflow: hidden;\n}\n\n.media-embed .setting {\n\twidth: 100%;\n\tmargin: 10px 0;\n\tfloat: right;\n\tdisplay: block;\n\tclear: both;\n}\n\n.image-details .embed-media-settings .setting {\n\tfloat: none;\n\twidth: auto;\n}\n\n.image-details .actions {\n\tmargin: 10px 0;\n}\n\n.image-details .hidden {\n\tdisplay: none;\n}\n\n.media-embed .setting input[type=\"text\"],\n.media-embed .setting textarea {\n\tdisplay: block;\n\twidth: 100%;\n\tmax-width: 400px;\n\tmargin: 1px 0;\n}\n\n.image-details .embed-media-settings .setting input[type=\"text\"],\n.image-details .embed-media-settings .setting textarea {\n\tmax-width: inherit;\n\twidth: 70%;\n}\n\n.image-details .embed-media-settings .setting input.link-to-custom,\n.image-details .embed-media-settings .link-target,\n.image-details .embed-media-settings .custom-size {\n\tmargin-right: 27%;\n\twidth: 70%;\n}\n\n.image-details .embed-media-settings .link-target {\n\tmargin-top: 24px;\n}\n\n.media-embed .setting input.hidden,\n.media-embed .setting textarea.hidden {\n\tdisplay: none;\n}\n\n.media-embed .setting span {\n\tdisplay: block;\n\twidth: 200px;\n\tfont-size: 13px;\n\tline-height: 24px;\n\tcolor: #666;\n}\n\n.image-details .embed-media-settings .setting span {\n\tfloat: right;\n\twidth: 25%;\n\ttext-align: left;\n\tmargin: 8px 1% 0 1%;\n\tline-height: 1.1;\n}\n\n.media-embed .setting .button-group {\n\tmargin: 2px 0;\n}\n\n.media-embed-sidebar {\n\tposition: absolute;\n\ttop: 0;\n\tright: 440px;\n}\n\n.advanced-section,\n.link-settings {\n\tmargin-top: 10px;\n}\n\n/* Drag & drop on the editor upload */\n.wp-editor-wrap .uploader-editor {\n\tbackground: rgba( 150, 150, 150, 0.9 );\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 99998; /* under the toolbar */\n\tdisplay: none;\n\ttext-align: center;\n}\n\n.wp-editor-wrap .uploader-editor-content {\n\tborder: 1px dashed #fff;\n\tposition: absolute;\n\ttop: 10px;\n\tright: 10px;\n\tleft: 10px;\n\tbottom: 10px;\n}\n\n.wp-editor-wrap .uploader-editor .uploader-editor-title {\n\tposition: absolute;\n\ttop: 50%;\n\tright: 0;\n\tleft: 0;\n\t-webkit-transform: translateY( -50% );\n\t-ms-transform: translateY(-50%);\n\ttransform: translateY( -50% );\n\tfont-size: 3em;\n\tline-height: 1.3;\n\tfont-weight: bold;\n\tcolor: #fff;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: none;\n}\n\n.wp-editor-wrap .uploader-editor.droppable {\n\tbackground: rgba( 0, 86, 132, 0.9 );\n}\n\n.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title {\n\tdisplay: block;\n}\n\n/**\n * IE7 Fixes\n */\n.ie7 .media-frame .attachments-browser {\n\tposition: static;\n}\n\n.ie7 .media-frame .embed-url input {\n\tmargin-top: 4px;\n\twidth: 90%;\n}\n\n.ie7 .compat-item {\n\twidth: 99%;\n}\n\n.ie7 .attachment-display-settings {\n\twidth: auto;\n}\n\n.ie7 .attachment-preview,\n.ie7 .attachment-preview .thumbnail {\n\twidth: 120px;\n\theight: 120px;\n}\n\n.ie7 .media-frame .attachment .describe {\n\twidth: 102px;\n}\n\n.ie7 .media-sidebar .setting select {\n\tmax-width: 55%;\n}\n\n.ie7 .media-sidebar .setting input[type=\"text\"],\n.ie7 .media-sidebar .setting input[type=\"password\"],\n.ie7 .media-sidebar .setting input[type=\"email\"],\n.ie7 .media-sidebar .setting input[type=\"number\"],\n.ie7 .media-sidebar .setting input[type=\"search\"],\n.ie7 .media-sidebar .setting input[type=\"tel\"],\n.ie7 .media-sidebar .setting input[type=\"url\"],\n.ie7 .media-sidebar .setting textarea {\n\twidth: 55%;\n}\n\n.ie7 .media-sidebar .setting .link-to-custom {\n\tfloat: right;\n}\n\n/**\n * Localization\n */\n.rtl .media-modal,\n.rtl .media-frame,\n.rtl .media-frame .search,\n.rtl .media-frame input[type=\"text\"],\n.rtl .media-frame input[type=\"password\"],\n.rtl .media-frame input[type=\"number\"],\n.rtl .media-frame input[type=\"search\"],\n.rtl .media-frame input[type=\"email\"],\n.rtl .media-frame input[type=\"url\"],\n.rtl .media-frame input[type=\"tel\"],\n.rtl .media-frame textarea,\n.rtl .media-frame select {\n\tfont-family: Tahoma, sans-serif;\n}\n\n:lang(he-il) .rtl .media-modal,\n:lang(he-il) .rtl .media-frame,\n:lang(he-il) .rtl .media-frame .search,\n:lang(he-il) .rtl .media-frame input[type=\"text\"],\n:lang(he-il) .rtl .media-frame input[type=\"password\"],\n:lang(he-il) .rtl .media-frame input[type=\"number\"],\n:lang(he-il) .rtl .media-frame input[type=\"search\"],\n:lang(he-il) .rtl .media-frame input[type=\"email\"],\n:lang(he-il) .rtl .media-frame input[type=\"url\"],\n:lang(he-il) .rtl .media-frame textarea,\n:lang(he-il) .rtl .media-frame select {\n\tfont-family: Arial, sans-serif;\n}\n\n/**\n * Responsive layout\n */\n@media only screen and (max-width: 900px) {\n\n\t/* Drop-down menu */\n\t.media-frame:not(.hide-menu) .media-frame-title,\n\t.media-frame:not(.hide-menu) .media-frame-router,\n\t.media-frame:not(.hide-menu) .media-frame-content,\n\t.media-frame:not(.hide-menu) .media-frame-toolbar {\n\t\tright: 0;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-menu {\n\t\tposition: static;\n\t\twidth: 0;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu {\n\t\twidth: auto;\n\t\tmax-width: 80%;\n\t\toverflow: auto;\n\t\tz-index: 2000;\n\t\ttop: 50px;\n\t\tright: -300px;\n\t\tleft: auto;\n\t\tbottom: auto;\n\t\tpadding: 5px 0;\n\t\tborder: 1px solid #ccc;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu.visible {\n\t\tright: 0;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu > a {\n\t\tpadding: 12px 16px;\n\t\tfont-size: 16px;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu > a.active {\n\t\tdisplay: none;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu .separator {\n\t\tmargin: 5px 10px;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-title {\n\t\tright: 0;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-title .dashicons {\n\t\tdisplay: inline-block;\n\t\tline-height: 50px;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-title h1 {\n\t\tcolor: #0073aa;\n\t\tline-height: 3;\n\t\tfont-size: 18px;\n\t\tfloat: right;\n\t\tcursor: pointer;\n\t}\n\t/* End drop-down menu */\n\n\t.media-sidebar {\n\t\twidth: 230px;\n\t}\n\n\t.attachments-browser .attachments,\n\t.attachments-browser .uploader-inline,\n\t.attachments-browser .media-toolbar {\n\t\tleft: 262px;\n\t}\n\n\t.media-sidebar .setting,\n\t.attachment-details .setting {\n\t\tmargin: 6px 0px;\n\t}\n\n\t.media-sidebar .setting input,\n\t.media-sidebar .setting textarea,\n\t.media-sidebar .setting span,\n\t.attachment-details .setting input,\n\t.attachment-details .setting textarea,\n\t.attachment-details .setting span,\n\t.compat-item label span {\n\t\tfloat: none;\n\t}\n\n\t.media-sidebar .setting span,\n\t.attachment-details .setting span,\n\t.compat-item label span {\n\t\ttext-align: inherit;\n\t\tmin-height: 16px;\n\t\tmargin: 0;\n\t\tpadding: 8px 2px 0;\n\t}\n\n\t.media-sidebar .setting .value,\n\t.attachment-details .setting .value {\n\t\tfloat: none;\n\t\twidth: auto;\n\t}\n\n\t.media-sidebar .setting input[type=\"text\"],\n\t.media-sidebar .setting input[type=\"password\"],\n\t.media-sidebar .setting input[type=\"email\"],\n\t.media-sidebar .setting input[type=\"number\"],\n\t.media-sidebar .setting input[type=\"search\"],\n\t.media-sidebar .setting input[type=\"tel\"],\n\t.media-sidebar .setting input[type=\"url\"],\n\t.media-sidebar .setting textarea,\n\t.media-sidebar .setting select,\n\t.attachment-details .setting input[type=\"text\"],\n\t.attachment-details .setting input[type=\"password\"],\n\t.attachment-details .setting input[type=\"email\"],\n\t.attachment-details .setting input[type=\"number\"],\n\t.attachment-details .setting input[type=\"search\"],\n\t.attachment-details .setting input[type=\"tel\"],\n\t.attachment-details .setting input[type=\"url\"],\n\t.attachment-details .setting textarea,\n\t.attachment-details .setting select {\n\t\tfloat: none;\n\t\twidth: 98%;\n\t\tmax-width: none;\n\t\theight: auto;\n\t}\n\n\t.media-sidebar .setting select.columns,\n\t.attachment-details .setting select.columns {\n\t\twidth: auto;\n\t}\n\n\t.media-frame input,\n\t.media-frame textarea,\n\t.media-frame .search {\n\t\tpadding: 3px 6px;\n\t}\n\n\t.image-details .column-image {\n\t\twidth: 30%;\n\t\tright: 70%;\n\t}\n\n\t.image-details .column-settings {\n\t\twidth: 70%;\n\t}\n\n\t.image-details .media-modal {\n\t\tright: 30px;\n\t\tleft: 30px;\n\t}\n\n\t.image-details .embed-media-settings .setting {\n\t\tmargin: 20px;\n\t}\n\n\t.image-details .embed-media-settings .setting span {\n\t\tfloat: none;\n\t\ttext-align: right;\n\t\twidth: 100%;\n\t\tmargin-bottom: 4px;\n\t}\n\n\t.image-details .embed-media-settings .setting input.link-to-custom,\n\t.image-details .embed-media-settings .setting input[type=\"text\"],\n\t.image-details .embed-media-settings .setting textarea {\n\t\twidth: 100%;\n\t\tmargin-right: 0;\n\t}\n\n\t.image-details .embed-media-settings .custom-size {\n\t\tmargin-right: 20px;\n\t}\n\n\t.collection-settings .setting input[type=\"checkbox\"] {\n\t\tmargin-top: 0;\n\t}\n\n\t.media-selection {\n\t\tmin-width: 120px;\n\t}\n\n\t.media-selection:after {\n\t\tbackground: none;\n\t}\n\n\t.media-selection .attachments {\n\t\tdisplay: none;\n\t}\n\n\t.media-modal .attachments-browser .media-toolbar .search {\n\t\tmax-width: 100%;\n\t\theight: auto;\n\t\tfloat: left;\n\t}\n\n\t.media-modal .attachments-browser .media-toolbar .attachment-filters {\n\t\theight: auto;\n\t}\n\n\t.media-modal .attachments-browser .media-toolbar .spinner {\n\t\tmargin: 14px 2px 0;\n\t}\n\n\t/* Text inputs need to be 16px, or they force zooming on iOS */\n\t.media-frame input[type=\"text\"],\n\t.media-frame input[type=\"password\"],\n\t.media-frame input[type=\"number\"],\n\t.media-frame input[type=\"search\"],\n\t.media-frame input[type=\"email\"],\n\t.media-frame input[type=\"url\"],\n\t.media-frame textarea,\n\t.media-frame select {\n\t\tfont-size: 16px;\n\t}\n}\n\n/* Responsive on portrait and landscape */\n@media only screen and (max-width: 640px), screen and (max-height: 400px) {\n\t/* Full-bleed modal */\n\t.media-modal,\n\t.image-details .media-modal {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tright: 0;\n\t\tleft: 0;\n\t\tbottom: 0;\n\t}\n\n\t.media-modal-backdrop {\n\t\tposition: fixed;\n\t}\n\n\t.media-sidebar {\n\t\tz-index: 1900;\n\t\tmax-width: 70%;\n\t\tbottom: 120%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.media-sidebar.visible {\n\t\tbottom: 0;\n\t}\n\n\t.attachments-browser .attachments,\n\t.attachments-browser .uploader-inline,\n\t.attachments-browser .media-toolbar {\n\t\tleft: 0;\n\t}\n\n\t.image-details .media-frame-title {\n\t\tdisplay: block;\n\t\ttop: 0;\n\t\tfont-size: 14px;\n\t}\n\n\t.image-details .column-image,\n\t.image-details .column-settings {\n\t\twidth: 100%;\n\t\tposition: relative;\n\t\tright: 0;\n\t}\n\n\t.image-details .column-settings {\n\t\tpadding: 4px 0;\n\t}\n\n\t/* Media tabs on the top */\n\t.media-frame-content .media-toolbar .instructions {\n\t\tdisplay: none;\n\t}\n}\n\n/* Landscape specific header override */\n@media screen and (max-height: 400px) {\n\t.media-menu {\n\t\tpadding: 0;\n\t}\n\n\t.media-frame-router {\n\t\ttop: 44px;\n\t}\n\n\t.media-frame-content {\n\t\ttop: 78px;\n\t}\n\n\t.attachments-browser .attachments {\n\t\ttop: 40px;\n\t}\n\n\t/* Prevent unnecessary scrolling on title input */\n\t.embed-link-settings {\n\t\toverflow: visible;\n\t}\n}\n\n@media only screen and (max-width: 480px) {\n\t.media-modal-close {\n\t\ttop: -5px;\n\t}\n\n\t.media-modal .media-frame-title {\n\t\theight: 40px;\n\t}\n\n\t.wp-core-ui.wp-customizer .media-button {\n\t\tmargin-top: 13px;\n\t}\n\n\t.media-modal .media-frame-title h1,\n\t.media-frame:not(.hide-menu) .media-frame-title h1 {\n\t\tfont-size: 18px;\n\t\tline-height: 40px;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-title .dashicons {\n\t\tline-height: 40px;\n\t}\n\n\t.media-frame-router,\n\t.media-frame:not(.hide-menu) .media-menu {\n\t\ttop: 40px;\n\t}\n\n\t.media-frame-content {\n\t\ttop: 74px;\n\t}\n\n\t.media-frame.hide-router .media-frame-content {\n\t\ttop: 40px;\n\t}\n}\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\n\t.media-modal-icon {\n\t\tbackground-image: url(../images/uploader-icons-2x.png);\n\t\t-webkit-background-size: 134px 15px;\n\t\tbackground-size: 134px 15px;\n\t}\n\n\t.media-frame .spinner {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n.media-frame-content[data-columns=\"1\"] .attachment {\n\twidth: 100%;\n}\n\n.media-frame-content[data-columns=\"2\"] .attachment {\n\twidth: 50%;\n}\n\n.media-frame-content[data-columns=\"3\"] .attachment {\n\twidth: 33.33%;\n}\n\n.media-frame-content[data-columns=\"4\"] .attachment {\n\twidth: 25%;\n}\n\n.media-frame-content[data-columns=\"5\"] .attachment {\n\twidth: 20%;\n}\n\n.media-frame-content[data-columns=\"6\"] .attachment {\n\twidth: 16.66%;\n}\n\n.media-frame-content[data-columns=\"7\"] .attachment {\n\twidth: 14.28%;\n}\n\n.media-frame-content[data-columns=\"8\"] .attachment {\n\twidth: 12.5%;\n}\n\n.media-frame-content[data-columns=\"9\"] .attachment {\n\twidth: 11.11%;\n}\n\n.media-frame-content[data-columns=\"10\"] .attachment {\n\twidth: 10%;\n}\n\n.media-frame-content[data-columns=\"11\"] .attachment {\n\twidth: 9.09%;\n}\n\n.media-frame-content[data-columns=\"12\"] .attachment {\n\twidth: 8.33%;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/media-views.css",
    "content": "/**\n * Base Styles\n */\n.media-modal * {\n\t-webkit-box-sizing: content-box;\n\t-moz-box-sizing: content-box;\n\tbox-sizing: content-box;\n}\n\n.media-modal input,\n.media-modal select,\n.media-modal textarea {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.media-modal,\n.media-frame {\n\tfont-family: \"Open Sans\", sans-serif;\n\tfont-size: 12px;\n\t-webkit-overflow-scrolling: touch;\n}\n\n.media-frame input,\n.media-frame textarea {\n\tpadding: 6px 8px;\n}\n\n.media-frame select,\n.wp-admin .media-frame select {\n\tline-height: 28px;\n\tmargin-top: 3px;\n}\n\n.media-frame a {\n\tborder-bottom: none;\n\tcolor: #0073aa;\n}\n\n.media-frame a:hover,\n.media-frame a:active {\n\tcolor: #00a0d2;\n}\n\n.media-frame a:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow:\n\t\t0 0 0 1px #5b9dd9,\n\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\toutline: none;\n\tcolor: #124964;\n}\n\n.media-frame a.button {\n\tcolor: #32373c;\n}\n\n.media-frame a.button:hover {\n\tcolor: #23282d;\n}\n\n.media-frame a.button-primary,\n.media-frame a.button-primary:hover {\n\tcolor: #fff;\n}\n\n.media-frame input[type=\"text\"],\n.media-frame input[type=\"password\"],\n.media-frame input[type=\"number\"],\n.media-frame input[type=\"search\"],\n.media-frame input[type=\"email\"],\n.media-frame input[type=\"url\"],\n.media-frame textarea,\n.media-frame select {\n\tfont-family: \"Open Sans\", sans-serif;\n\tfont-size: 12px;\n\tborder-width: 1px;\n\tborder-style: solid;\n\tborder-color: #dfdfdf;\n}\n\n.media-frame input[type=\"text\"]:focus,\n.media-frame input[type=\"password\"]:focus,\n.media-frame input[type=\"number\"]:focus,\n.media-frame input[type=\"search\"]:focus,\n.media-frame input[type=\"email\"]:focus,\n.media-frame input[type=\"url\"]:focus,\n.media-frame textarea:focus,\n.media-frame select:focus {\n\tborder-color: #5b9dd9;\n}\n\n.media-frame select {\n\theight: 24px;\n\tpadding: 2px;\n}\n\n.media-frame input:disabled,\n.media-frame textarea:disabled,\n.media-frame input[readonly],\n.media-frame textarea[readonly] {\n\tbackground-color: #eee;\n}\n\n.media-frame input[type=\"search\"] {\n\t-webkit-appearance: textfield;\n}\n\n.media-frame :-moz-placeholder {\n   color: #a9a9a9;\n}\n\n.media-frame .hidden {\n\tdisplay: none;\n}\n\n/*!\n * jQuery UI Draggable/Sortable 1.11.4\n * http://jqueryui.com\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n.ui-draggable-handle,\n.ui-sortable-handle {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n}\n\n/**\n * Modal\n */\n.media-modal {\n\tposition: fixed;\n\ttop: 30px;\n\tleft: 30px;\n\tright: 30px;\n\tbottom: 30px;\n\tz-index: 160000;\n}\n\n.wp-customizer .media-modal {\n\tz-index: 560000;\n}\n\n.media-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tmin-height: 360px;\n\tbackground: #000;\n\topacity: 0.7;\n\tz-index: 159900;\n}\n\n.wp-customizer .media-modal-backdrop {\n\tz-index: 559900;\n}\n\n.media-modal-close {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\twidth: 50px;\n\theight: 50px;\n\tpadding: 0;\n\tz-index: 1000;\n\t-webkit-transition: color .1s ease-in-out, background .1s ease-in-out;\n\ttransition: color .1s ease-in-out, background .1s ease-in-out;\n}\n\n.media-modal-close:active {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.media-modal-close span.media-modal-icon {\n\tbackground-image: none;\n}\n\n.media-modal-close .media-modal-icon:before {\n\tcontent: \"\\f158\";\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: middle;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcolor: #666;\n}\n\n.media-modal-close:hover .media-modal-icon:before {\n\tcolor: #00a0d2;\n}\n\n.media-modal-close:active {\n\toutline: 0;\n}\n\n.media-modal-content {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: auto;\n\tmin-height: 300px;\n\t-webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.7);\n\tbox-shadow: 0 5px 15px rgba(0,0,0,0.7);\n\tbackground: #fcfcfc;\n\t-webkit-font-smoothing: subpixel-antialiased;\n}\n\n.media-modal-content .media-frame select.attachment-filters {\n\tmargin-top: 11px;\n\tmargin-right: 2%;\n\twidth: 42%;\n\twidth: -webkit-calc(48% - 12px);\n\twidth: calc(48% - 12px);\n}\n\n.media-modal-content .attachments-browser .media-toolbar-secondary {\n\twidth: 66%;\n}\n\n.media-modal-content .media-toolbar-primary.search-form {\n\twidth: 33%;\n}\n\n.media-modal-content .media-toolbar-primary .media-button {\n\tfloat: right;\n}\n\n.media-modal-content .attachments-browser .search {\n\twidth: 100%;\n}\n\n/* higher specificity */\n.wp-core-ui .media-modal-icon {\n\tbackground-image: url(../images/uploader-icons.png);\n\tbackground-repeat: no-repeat;\n}\n\n/**\n * Toolbar\n */\n.media-toolbar {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tz-index: 100;\n\theight: 60px;\n\tpadding: 0 16px;\n\tborder: 0 solid #dfdfdf;\n\toverflow: hidden;\n}\n\n.media-toolbar-primary {\n\tfloat: right;\n\theight: 100%;\n}\n\n.media-toolbar-secondary {\n\tfloat: left;\n\theight: 100%;\n}\n\n.media-toolbar-primary > .media-button,\n.media-toolbar-primary > .media-button-group {\n\tmargin-left: 10px;\n\tfloat: left;\n\tmargin-top: 15px;\n}\n\n.media-toolbar-secondary > .media-button,\n.media-toolbar-secondary > .media-button-group {\n\tmargin-right: 10px;\n\tmargin-top: 15px;\n}\n\n/**\n * Sidebar\n */\n.media-sidebar {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\twidth: 267px;\n\tpadding: 0 16px 24px;\n\tz-index: 75;\n\tbackground: #f3f3f3;\n\tborder-left: 1px solid #ddd;\n\toverflow: auto;\n\t-webkit-overflow-scrolling: touch;\n}\n\n.hide-toolbar .media-sidebar {\n\tbottom: 0;\n}\n\n.media-sidebar .sidebar-title {\n\tfont-size: 20px;\n\tmargin: 0;\n\tpadding: 12px 10px 10px;\n\tline-height: 28px;\n}\n\n.media-sidebar .sidebar-content {\n\tpadding: 0 10px;\n\tmargin-bottom: 130px;\n}\n\n.media-sidebar .search {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n.media-sidebar h3, /* Back-compat for pre-4.4 */\n.image-details h3, /* Back-compat for pre-4.4 */\n.media-sidebar h2,\n.image-details h2 {\n\tposition: relative;\n\tfont-weight: bold;\n\ttext-transform: uppercase;\n\tfont-size: 12px;\n\tcolor: #666;\n\tmargin: 24px 0 8px;\n}\n\n.media-sidebar .setting,\n.attachment-details .setting {\n\tdisplay: block;\n\tfloat: left;\n\twidth: 100%;\n\tmargin: 1px 0;\n}\n\n.media-sidebar .setting label,\n.attachment-details .setting label {\n\tdisplay: block;\n}\n\n.media-sidebar .setting .link-to-custom,\n.attachment-details .setting .link-to-custom {\n\tmargin: 3px 2px 0;\n}\n\n.media-sidebar .setting span,\n.attachment-details .setting span {\n\tmin-width: 30%;\n\tmargin-right: 4%;\n\tfont-size: 12px;\n\ttext-align: right;\n\tword-wrap: break-word;\n}\n\n.media-sidebar .setting .name {\n\tmax-width: 80px;\n}\n\n.media-sidebar .setting select,\n.attachment-details .setting select {\n\tmax-width: 65%;\n}\n\n.media-sidebar .setting input[type=\"checkbox\"],\n.media-sidebar .field input[type=\"checkbox\"],\n.media-sidebar .setting input[type=\"radio\"],\n.media-sidebar .field input[type=\"radio\"],\n.attachment-details .setting input[type=\"checkbox\"],\n.attachment-details .field input[type=\"checkbox\"],\n.attachment-details .setting input[type=\"radio\"],\n.attachment-details .field input[type=\"radio\"] {\n\tfloat: none;\n\tmargin: 8px 3px 0;\n\tpadding: 0;\n}\n\n.media-sidebar .setting span,\n.attachment-details .setting span,\n.compat-item label span {\n\tfloat: left;\n\tmin-height: 22px;\n\tpadding-top: 8px;\n\tline-height: 16px;\n\tfont-weight: normal;\n\tcolor: #666;\n}\n\n.compat-item label span  {\n\ttext-align: right;\n}\n\n.media-sidebar .setting input[type=\"text\"],\n.media-sidebar .setting input[type=\"password\"],\n.media-sidebar .setting input[type=\"email\"],\n.media-sidebar .setting input[type=\"number\"],\n.media-sidebar .setting input[type=\"search\"],\n.media-sidebar .setting input[type=\"tel\"],\n.media-sidebar .setting input[type=\"url\"],\n.media-sidebar .setting textarea,\n.media-sidebar .setting .value,\n.attachment-details .setting input[type=\"text\"],\n.attachment-details .setting input[type=\"password\"],\n.attachment-details .setting input[type=\"email\"],\n.attachment-details .setting input[type=\"number\"],\n.attachment-details .setting input[type=\"search\"],\n.attachment-details .setting input[type=\"tel\"],\n.attachment-details .setting input[type=\"url\"],\n.attachment-details .setting textarea,\n.attachment-details .setting .value {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin: 1px;\n\twidth: 65%;\n\tfloat: right;\n}\n\n.media-sidebar .setting .value,\n.attachment-details .setting .value {\n\tmargin: 0 1px;\n\ttext-align: left;\n}\n\n.media-sidebar .setting textarea,\n.attachment-details .setting textarea,\n.compat-item .field textarea {\n\theight: 62px;\n\tresize: vertical;\n}\n\n.media-sidebar select,\n.attachment-details select {\n\tmargin-top: 3px;\n}\n\n.compat-item {\n\tfloat: left;\n\twidth: 100%;\n\toverflow: hidden;\n}\n\n.compat-item table {\n\twidth: 100%;\n\ttable-layout: fixed;\n\tborder-spacing: 0;\n\tborder: 0;\n}\n\n.compat-item tr {\n\tpadding: 2px 0;\n\tdisplay: block;\n\toverflow: hidden;\n}\n\n.compat-item .label,\n.compat-item .field {\n\tdisplay: block;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.compat-item .label {\n\tmin-width: 30%;\n\tmargin-right: 4%;\n\tfloat: left;\n\ttext-align: right;\n}\n\n.compat-item .label span {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n.compat-item .field {\n\tfloat: right;\n\twidth: 65%;\n\tmargin: 1px;\n}\n\n.compat-item .field input[type=\"text\"],\n.compat-item .field input[type=\"password\"],\n.compat-item .field input[type=\"email\"],\n.compat-item .field input[type=\"number\"],\n.compat-item .field input[type=\"search\"],\n.compat-item .field input[type=\"tel\"],\n.compat-item .field input[type=\"url\"],\n.compat-item .field textarea {\n\twidth: 100%;\n\tmargin: 0;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.sidebar-for-errors .attachment-details,\n.sidebar-for-errors .compat-item,\n.sidebar-for-errors .media-sidebar .media-progress-bar,\n.sidebar-for-errors .upload-details {\n\tdisplay: none !important;\n}\n\n/**\n * Menu\n */\n.media-menu {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tmargin: 0;\n\tpadding: 10px 0;\n\tbackground: #f3f3f3;\n\tborder-right-width: 1px;\n\tborder-right-style: solid;\n\tborder-right-color: #ccc;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.media-menu > a {\n\tdisplay: block;\n\tposition: relative;\n\tpadding: 8px 20px;\n\tmargin: 0;\n\tline-height: 18px;\n\tfont-size: 14px;\n\tcolor: #0073aa;\n\ttext-decoration: none;\n}\n\n.media-menu > a:hover {\n\tcolor: #0073aa;\n\tbackground: rgba( 0, 0, 0, 0.04 );\n}\n\n.media-menu > a:active {\n\toutline: none;\n}\n\n.media-menu .active,\n.media-menu .active:hover {\n\tcolor: #23282d;\n\tfont-weight: bold;\n}\n\n.media-menu .separator {\n\theight: 0;\n\tmargin: 12px 20px;\n\tpadding: 0;\n\tborder-top: 1px solid #ddd;\n}\n\n/**\n * Menu\n */\n.media-router {\n\tposition: relative;\n\tpadding: 0 6px;\n\tmargin: 0;\n\tclear: both;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.media-router a {\n\t-webkit-transition: none;\n\ttransition: none;\n}\n\n.media-router > a {\n\tposition: relative;\n\tfloat: left;\n\tpadding: 8px 10px 9px;\n\tmargin: 0;\n\theight: 18px;\n\tline-height: 18px;\n\tfont-size: 14px;\n\ttext-decoration: none;\n}\n\n.media-router > a:last-child {\n\tborder-right: 0;\n}\n\n.media-router > a:active {\n\toutline: none;\n}\n\n.media-router .active,\n.media-router .active:hover {\n\tcolor: #32373c;\n}\n\n.media-router .active,\n.media-router > a.active:last-child {\n\tmargin: -1px -1px 0;\n\tbackground: #fff;\n\tborder: 1px solid #ddd;\n\tborder-bottom: none;\n}\n\n.media-router .active:after {\n\tdisplay: none;\n}\n\n/**\n * Frame\n */\n.media-frame {\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n}\n\n.media-frame-menu {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\twidth: 200px;\n\tz-index: 150;\n}\n\n.media-frame-title {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 200px;\n\tright: 0;\n\theight: 50px;\n\tz-index: 200;\n}\n\n.media-frame-router {\n\tposition: absolute;\n\ttop: 50px;\n\tleft: 200px;\n\tright: 0;\n\theight: 36px;\n\tz-index: 200;\n}\n\n.media-frame-content {\n\tposition: absolute;\n\ttop: 84px;\n\tleft: 200px;\n\tright: 0;\n\tbottom: 61px;\n\theight: auto;\n\twidth: auto;\n\tmargin: 0;\n\toverflow: auto;\n\tbackground: #fff;\n\tborder-top: 1px solid #ddd;\n\tborder-bottom: 1px solid #ddd;\n}\n\n.media-frame-toolbar {\n\tposition: absolute;\n\tleft: 200px;\n\tright: 0;\n\tbottom: 0;\n\theight: 60px;\n\tz-index: 100;\n}\n\n.media-frame.hide-menu .media-frame-title,\n.media-frame.hide-menu .media-frame-router,\n.media-frame.hide-menu .media-frame-toolbar,\n.media-frame.hide-menu .media-frame-content {\n\tleft: 0;\n}\n\n.media-frame.hide-menu .media-frame-menu {\n\tleft: -200px;\n}\n\n.media-frame.hide-toolbar .media-frame-content {\n\tbottom: 0;\n}\n\n.media-frame.hide-toolbar .media-frame-toolbar {\n\tbottom: -61px;\n}\n\n.media-frame.hide-router .media-frame-content {\n\ttop: 50px;\n}\n\n.media-frame.hide-router .media-frame-router {\n\tdisplay: none;\n}\n\n.media-frame.hide-router .media-frame-title {\n\tborder-bottom: 1px solid #dfdfdf;\n\t-webkit-box-shadow: 0 4px 4px -4px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: 0 4px 4px -4px rgba( 0, 0, 0, 0.1 );\n}\n\n.media-frame-title .dashicons {\n\tdisplay: none;\n}\n\n.media-frame-title h1 {\n\tpadding: 0 16px;\n\tfont-size: 22px;\n\tline-height: 50px;\n\tmargin: 0;\n}\n\n.media-frame-title .suggested-dimensions {\n\tfont-size: 14px;\n\tfloat: right;\n\tmargin-right: 20px;\n}\n\n.media-frame-content .crop-content {\n\theight: 100%;\n}\n\n.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon {\n\tmargin-right: 300px;\n}\n\n.media-frame-content .crop-content .crop-image {\n\tdisplay: block;\n\tmargin: auto;\n\tmax-width: 100%;\n\tmax-height: 100%;\n}\n\n.media-frame-content .crop-content .upload-errors\n{\n\tposition: absolute;\n\twidth: 300px;\n\ttop: 50%;\n\tleft: 50%;\n\tmargin-left: -150px;\n\tmargin-right: -150px;\n\tz-index: 600000;\n}\n\n/**\n * Iframes\n */\n.media-frame .media-iframe {\n\toverflow: hidden;\n}\n\n.media-frame .media-iframe,\n.media-frame .media-iframe iframe {\n\theight: 100%;\n\twidth: 100%;\n\tborder: 0;\n}\n\n/**\n * Attachment Browser Filters\n */\n.media-frame select.attachment-filters {\n\tmargin-top: 11px;\n\tmargin-right: 2%;\n\tmax-width: 42%;\n\tmax-width: -webkit-calc(48% - 12px);\n\tmax-width: calc(48% - 12px);\n}\n\n.media-frame select.attachment-filters:last-of-type {\n\tmargin-right: 0;\n}\n\n/**\n * Search\n */\n.media-frame .search {\n\tmargin-top: 11px;\n\tpadding: 4px;\n\tfont-size: 13px;\n\tcolor: #464646;\n\tfont-family: \"Open Sans\", sans-serif;\n\t-webkit-appearance: none;\n}\n\n.media-toolbar-primary .search {\n\tmax-width: 100%;\n}\n\n/**\n * Attachments\n */\n.wp-core-ui .attachments {\n\tmargin: 0;\n\t-webkit-overflow-scrolling: touch;\n}\n\n/**\n * Attachment\n */\n.wp-core-ui .attachment {\n\tposition: relative;\n\tfloat: left;\n\tpadding: 8px;\n\tmargin: 0;\n\tcolor: #464646;\n\tcursor: pointer;\n\tlist-style: none;\n\ttext-align: center;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\twidth: 25%;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.wp-core-ui .attachment:focus,\n.wp-core-ui .selected.attachment:focus,\n.wp-core-ui .attachment.details:focus {\n\t-webkit-box-shadow:\n\t\tinset 0 0 2px 3px #fff,\n\t\tinset 0 0 0 7px #5b9dd9;\n\tbox-shadow:\n\t\tinset 0 0 2px 3px #fff,\n\t\tinset 0 0 0 7px #5b9dd9;\n\toutline: none;\n}\n\n.wp-core-ui .selected.attachment {\n\t-webkit-box-shadow:\n\t\tinset 0 0 0 5px #fff,\n\t\tinset 0 0 0 7px #ccc;\n\tbox-shadow:\n\t\tinset 0 0 0 5px #fff,\n\t\tinset 0 0 0 7px #ccc;\n}\n\n.wp-core-ui .attachment.details {\n\t-webkit-box-shadow:\n\t\tinset 0 0 0 3px #fff,\n\t\tinset 0 0 0 7px #0073aa;\n\tbox-shadow:\n\t\tinset 0 0 0 3px #fff,\n\t\tinset 0 0 0 7px #0073aa;\n}\n\n.wp-core-ui .attachment-preview {\n\tposition: relative;\n\t-webkit-box-shadow:\n\t\tinset 0 0 15px rgba( 0, 0, 0, 0.1 ),\n\t\tinset 0 0 0 1px rgba( 0, 0, 0, 0.05 );\n\tbox-shadow:\n\t\tinset 0 0 15px rgba( 0, 0, 0, 0.1 ),\n\t\tinset 0 0 0 1px rgba( 0, 0, 0, 0.05 );\n\tbackground: #eee;\n\tcursor: pointer;\n}\n\n.wp-core-ui .attachment-preview:before {\n\tcontent: \"\";\n\tdisplay: block;\n\tpadding-top: 100%;\n}\n\n.wp-core-ui .attachment .icon {\n\tmargin: 0 auto;\n\toverflow: hidden;\n}\n\n.wp-core-ui .attachment .thumbnail {\n\toverflow: hidden;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\topacity: 1;\n\t-webkit-transition: opacity .1s;\n\ttransition: opacity .1s;\n}\n\n.wp-core-ui .attachment .portrait img {\n\tmax-width: 100%;\n}\n\n.wp-core-ui .attachment .landscape img {\n\tmax-height: 100%;\n}\n\n.wp-core-ui .attachment .thumbnail:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\t-webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );\n\toverflow: hidden;\n}\n\n.wp-core-ui .attachment .thumbnail img {\n\ttop: 0;\n\tleft: 0;\n}\n\n.wp-core-ui .attachment .thumbnail .centered {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\t-webkit-transform: translate( 50%, 50% );\n\t-ms-transform: translate(50%,50%); /* Fails with spaces?? Weird! */\n\ttransform: translate( 50%, 50% );\n}\n\n.wp-core-ui .attachment .thumbnail .centered img {\n\t-webkit-transform: translate( -50%, -50% );\n\t-ms-transform: translate(-50%,-50%);\n\ttransform: translate( -50%, -50% );\n}\n\n.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon {\n\t-webkit-transform: translate( -50%, -70% );\n\t-ms-transform: translate(-50%,-70%);\n\ttransform: translate( -50%, -70% );\n}\n\n.ie8 .wp-core-ui .attachment img.icon {\n\ttop: 20%;\n\tposition: relative;\n}\n\n.wp-core-ui .attachment .filename {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tmax-height: 100%;\n\tword-wrap: break-word;\n\ttext-align: center;\n\tfont-weight: bold;\n\tbackground: rgba( 255, 255, 255, 0.8 );\n\t-webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 );\n}\n\n.wp-core-ui .attachment .filename div {\n\tpadding: 5px 10px;\n}\n\n.wp-core-ui .attachment .thumbnail img {\n\tposition: absolute;\n}\n\n.wp-core-ui .attachment-close {\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 5px;\n\tright: 5px;\n\theight: 22px;\n\twidth: 22px;\n\tpadding: 0;\n\tbackground-color: #fff;\n\tbackground-position: -96px 4px;\n\t-webkit-border-radius: 3px;\n\tborder-radius: 3px;\n\t-webkit-box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 );\n}\n\n.wp-core-ui .attachment-close:hover,\n.wp-core-ui .attachment-close:focus {\n\tbackground-position: -36px 4px;\n}\n\n.wp-core-ui .attachment .check {\n\tdisplay: none;\n\theight: 24px;\n\twidth: 24px;\n\tpadding: 0;\n\tposition: absolute;\n\tz-index: 10;\n\ttop: 0;\n\tright: 0;\n\toutline: none;\n\tbackground: #eee;\n\t-webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba( 0, 0, 0, 0.15 );\n}\n\n.wp-core-ui .attachment .check .media-modal-icon {\n\tdisplay: block;\n\tbackground-position: -1px 0;\n\theight: 15px;\n\twidth: 15px;\n\tmargin: 5px;\n}\n\n.wp-core-ui .attachment .check:hover .media-modal-icon {\n\tbackground-position: -40px 0;\n}\n\n.wp-core-ui .attachment.selected .check {\n\tdisplay: block;\n}\n\n.wp-core-ui .attachment.details .check,\n.wp-core-ui .attachment.selected .check:focus,\n.wp-core-ui .media-frame.mode-grid .attachment.selected .check {\n\tbackground-color: #0073aa;\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 0 2px #0073aa;\n\tbox-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 0 2px #0073aa;\n}\n\n.wp-core-ui .attachment.details .check .media-modal-icon,\n.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon {\n\tbackground-position: -21px 0;\n}\n\n.wp-core-ui .attachment.details .check:hover .media-modal-icon,\n.wp-core-ui .attachment.selected .check:focus .media-modal-icon,\n.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon {\n\tbackground-position: -60px 0;\n}\n\n.wp-core-ui .media-frame .attachment .describe {\n\tposition: relative;\n\tdisplay: block;\n\twidth: 100%;\n\tmargin: 0;\n\tpadding: 8px;\n\tfont-size: 12px;\n\t-webkit-border-radius: 0;\n\tborder-radius: 0;\n}\n\n/**\n * Attachments Browser\n */\n.media-frame .attachments-browser {\n\tposition: relative;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n}\n\n.attachments-browser .media-toolbar {\n\tright: 300px;\n\theight: 50px;\n}\n\n.attachments-browser.hide-sidebar .media-toolbar {\n\tright: 0;\n}\n\n.attachments-browser .media-toolbar-primary > .media-button,\n.attachments-browser .media-toolbar-primary > .media-button-group,\n.attachments-browser .media-toolbar-secondary > .media-button,\n.attachments-browser .media-toolbar-secondary > .media-button-group {\n\tmargin: 11px 0;\n}\n\n.attachments-browser .attachments {\n\tpadding: 2px 8px 8px;\n}\n\n.attachments-browser .attachments,\n.attachments-browser .uploader-inline {\n\tposition: absolute;\n\ttop: 50px;\n\tleft: 0;\n\tright: 300px;\n\tbottom: 0;\n\toverflow: auto;\n\toutline: none;\n}\n\n.attachments-browser .uploader-inline.hidden {\n\tdisplay: none;\n}\n\n.attachments-browser .media-toolbar-primary {\n\tmax-width: 33%;\n}\n\n.attachments-browser .media-toolbar-secondary {\n\tmax-width: 66%;\n}\n\n.uploader-inline .close {\n\tbackground-color: transparent;\n\tborder: 0;\n\tcursor: pointer;\n\theight: 48px;\n\tposition: absolute;\n\tright: 0;\n\ttext-align: center;\n\ttop: 0;\n\twidth: 50px;\n\tz-index: 1;\n}\n\n.uploader-inline .close:before {\n\tfont: normal 30px/50px dashicons !important;\n\tcolor: #777;\n\tdisplay: inline-block;\n\tcontent: \"\\f335\";\n\tfont-weight: 300;\n}\n\n.attachments-browser.hide-sidebar .attachments,\n.attachments-browser.hide-sidebar .uploader-inline {\n\tright: 0;\n\tmargin-right: 0;\n}\n\n.attachments-browser .instructions {\n\tdisplay: inline-block;\n\tmargin-top: 16px;\n\tline-height: 18px;\n\tfont-size: 13px;\n\tcolor: #666;\n\tmargin-right: 0.5em;\n}\n\n.attachments-browser .no-media {\n\tpadding: 2em 0 0 2em;\n}\n\n/**\n * Progress Bar\n */\n.media-progress-bar {\n\tposition: relative;\n\theight: 10px;\n\twidth: 70%;\n\tmargin: 10px auto;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n\tbackground: #dfdfdf;\n\tbackground: rgba( 0, 0, 0, 0.1 );\n}\n\n.media-progress-bar div {\n\theight: 10px;\n\tmin-width: 20px;\n\twidth: 0;\n\tbackground: #0073aa;\n\t-webkit-border-radius: 10px;\n\tborder-radius: 10px;\n\t-webkit-transition: width 300ms;\n\ttransition: width 300ms;\n}\n\n.media-uploader-status .media-progress-bar {\n\tdisplay: none;\n\twidth: 100%;\n}\n\n.uploading.media-uploader-status .media-progress-bar {\n\tdisplay: block;\n}\n\n.attachment-preview .media-progress-bar {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 15%;\n\twidth: 70%;\n\tmargin: -5px 0 0 0;\n}\n\n.media-uploader-status {\n\tposition: relative;\n\tmargin: 0 auto;\n\tpadding-bottom: 10px;\n\tmax-width: 400px;\n}\n\n.uploader-inline .media-uploader-status h3, /* Back-compat for pre-4.4 */\n.uploader-inline .media-uploader-status h2 {\n\tdisplay: none;\n}\n\n.media-uploader-status .upload-details {\n\tdisplay: none;\n\tfont-size: 12px;\n\tcolor: #666;\n}\n\n.uploading.media-uploader-status .upload-details {\n\tdisplay: block;\n}\n\n.media-uploader-status .upload-detail-separator {\n\tpadding: 0 4px;\n}\n\n.media-uploader-status .upload-count {\n\tcolor: #464646;\n}\n\n.media-uploader-status .upload-dismiss-errors,\n.media-uploader-status .upload-errors {\n\tdisplay: none;\n}\n\n.errors.media-uploader-status .upload-dismiss-errors,\n.errors.media-uploader-status .upload-errors {\n\tdisplay: block;\n}\n\n.media-uploader-status .upload-dismiss-errors {\n\ttext-decoration: none;\n}\n\n.media-sidebar .media-uploader-status .upload-dismiss-errors {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n}\n\n.upload-errors .upload-error {\n\tpadding: 12px;\n\tmargin-bottom: 12px;\n\tbackground: #fff;\n\tborder-left: 4px solid #dc3232;\n\t-webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);\n\tbox-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);\n}\n\n.uploader-inline .upload-errors .upload-error {\n\tbackground-color: #fbeaea;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.upload-errors .upload-error-filename {\n\tfont-weight: bold;\n}\n\n.upload-errors .upload-error-message {\n\tdisplay: block;\n\tpadding-top: 8px;\n\tword-wrap: break-word;\n}\n\n.uploader-window {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tbackground: rgba( 0, 86, 132, 0.9 );\n\tz-index: 250000;\n\tdisplay: none;\n\ttext-align: center;\n\topacity: 0;\n\t-webkit-transition: opacity 250ms;\n\ttransition: opacity 250ms;\n}\n\n.uploader-window-content {\n\tposition: absolute;\n\ttop: 10px;\n\tleft: 10px;\n\tright: 10px;\n\tbottom: 10px;\n\tborder: 1px dashed #fff;\n}\n\n.uploader-window h3, /* Back-compat for pre-4.4 */\n.uploader-window h1 {\n\tmargin: -0.5em 0 0;\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translateY( -50% );\n\t-ms-transform: translateY(-50%);\n\ttransform: translateY( -50% );\n\tfont-size: 40px;\n\tcolor: #fff;\n\tpadding: 0;\n}\n\n.uploader-window .media-progress-bar {\n\tmargin-top: 20px;\n\tmax-width: 300px;\n\tbackground: transparent;\n\tborder-color: #fff;\n\tdisplay: none;\n}\n\n.uploader-window .media-progress-bar div {\n\tbackground: #fff;\n}\n\n.uploading .uploader-window .media-progress-bar {\n\tdisplay: block;\n}\n\n.media-frame .uploader-inline {\n\tmargin-bottom: 20px;\n\tpadding: 0;\n\ttext-align: center;\n}\n\n.uploader-inline-content {\n\tposition: absolute;\n\ttop: 30%;\n\tleft: 0;\n\tright: 0;\n}\n\n.uploader-inline-content .upload-ui {\n\tmargin: 2em 0;\n}\n\n.uploader-inline-content .post-upload-ui {\n\tmargin-bottom: 2em;\n}\n\n.uploader-inline .has-upload-message .upload-ui {\n\tmargin: 0 0 4em;\n}\n\n.uploader-inline h3, /* Back-compat for pre-4.4 */\n.uploader-inline h2 {\n\tfont-size: 20px;\n\tline-height: 28px;\n\tfont-weight: 400;\n\tmargin: 0;\n}\n\n.uploader-inline .has-upload-message .upload-instructions {\n\tfont-size: 14px;\n\tcolor: #464646;\n\tfont-weight: normal;\n}\n\n.uploader-inline .drop-instructions {\n\tdisplay: none;\n}\n\n.supports-drag-drop .uploader-inline .drop-instructions {\n\tdisplay: block;\n}\n\n.uploader-inline p {\n\tfont-size: 12px;\n\tmargin: 0.5em 0;\n}\n\n.uploader-inline .media-progress-bar {\n\tdisplay: none;\n}\n\n.uploading.uploader-inline .media-progress-bar {\n\tdisplay: block;\n}\n\n.uploader-inline .browser {\n\tdisplay: inline-block !important;\n}\n\n/**\n * Selection\n */\n.media-selection {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 350px;\n\theight: 60px;\n\tpadding: 0 0 0 16px;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.media-selection .selection-info {\n\tdisplay: inline-block;\n\tfont-size: 12px;\n\theight: 60px;\n\tmargin-right: 10px;\n\tvertical-align: top;\n}\n\n.media-selection.empty,\n.media-selection.editing {\n\tdisplay: none;\n}\n\n.media-selection.one .edit-selection {\n\tdisplay: none;\n}\n\n.media-selection .count {\n\tdisplay: block;\n\tpadding-top: 12px;\n\tfont-size: 14px;\n\tline-height: 20px;\n\tfont-weight: bold;\n}\n\n.media-selection .button-link {\n\tfloat: left;\n\tpadding: 1px 8px;\n\tmargin: 1px 8px 1px -8px;\n\tline-height: 16px;\n\tborder-right: 1px solid #dfdfdf;\n\tcolor: #0073aa;\n}\n\n.media-selection .button-link:hover,\n.media-selection .button-link:focus {\n\tcolor: #00a0d2;\n}\n\n.media-selection .button-link:last-child {\n\tborder-right: 0;\n\tmargin-right: 0;\n}\n\n.selection-info .clear-selection {\n\tcolor: #bc0b0b;\n}\n\n.selection-info .clear-selection:hover,\n.selection-info .clear-selection:focus {\n\tcolor: red;\n}\n\n.media-selection .selection-view {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.media-selection .attachments {\n\tdisplay: inline-block;\n\theight: 48px;\n\tmargin: 6px;\n\tpadding: 0;\n\toverflow: hidden;\n\tvertical-align: top;\n}\n\n.media-selection .attachment {\n\twidth: 40px;\n\tpadding: 0;\n\tmargin: 4px;\n}\n\n.media-selection .attachment .thumbnail {\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.media-selection .attachment .icon {\n\twidth: 50%;\n}\n\n.media-selection .attachment-preview {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: none;\n}\n\n.wp-core-ui .media-selection .attachment:focus,\n.wp-core-ui .media-selection .selected.attachment:focus,\n.wp-core-ui .media-selection .attachment.details:focus {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 2px 3px #5b9dd9;\n\tbox-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 2px 3px #5b9dd9;\n}\n\n.wp-core-ui .media-selection .selected.attachment {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.wp-core-ui .media-selection .attachment.details {\n\t-webkit-box-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 0 3px #0073aa;\n\tbox-shadow:\n\t\t0 0 0 1px #fff,\n\t\t0 0 0 3px #0073aa;\n}\n\n.media-selection:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\twidth: 25px;\n\tbackground-image: -webkit-gradient(linear, right top, left top, from(rgba( 255, 255, 255, 1 )), to(rgba( 255, 255, 255, 0 )));\n\tbackground-image: -webkit-linear-gradient(right, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 ));\n\tbackground-image: linear-gradient(to left, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 ));\n}\n\n.media-selection .attachment .filename {\n\tdisplay: none;\n}\n\n/**\n * Spinner\n */\n.media-frame .spinner {\n\tbackground: url(../images/spinner.gif) no-repeat;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px 20px;\n\tfloat: right;\n\tdisplay: inline-block;\n\tvisibility: hidden;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\twidth: 20px;\n\theight: 20px;\n\tmargin: 0;\n\tvertical-align: middle;\n}\n\n.media-frame .spinner.is-active {\n\tvisibility: visible;\n}\n\n.media-toolbar .spinner {\n\tmargin-top: 14px;\n}\n\n/**\n * Attachment Details\n */\n.attachment-details {\n\tposition: relative;\n\toverflow: auto;\n}\n\n.attachment-details .settings-save-status {\n\tfloat: right;\n\ttext-transform: none;\n\tz-index: 10;\n}\n\n.attachment-details .settings-save-status .spinner {\n\tmargin-left: 5px;\n}\n\n.attachment-details .settings-save-status .saved {\n\tfloat: right;\n\tdisplay: none;\n}\n\n.attachment-details.save-waiting .settings-save-status .spinner {\n\tvisibility: visible;\n}\n\n.attachment-details.save-complete .settings-save-status .saved {\n\tdisplay: block;\n}\n\n.attachment-info {\n\toverflow: hidden;\n\tmin-height: 60px;\n\tmargin-bottom: 16px;\n\tline-height: 18px;\n\tcolor: #666;\n\tborder-bottom: 1px solid #ddd;\n\tpadding-bottom: 11px;\n}\n\n.attachment-info .filename {\n\tfont-weight: bold;\n\tcolor: #464646;\n\tword-wrap: break-word;\n}\n\n.attachment-info .thumbnail {\n\tposition: relative;\n\tfloat: left;\n\tmax-width: 120px;\n\tmax-height: 120px;\n\tmargin-top: 5px;\n\tmargin-right: 10px;\n\tmargin-bottom: 5px;\n}\n\n.uploading .attachment-info .thumbnail {\n\twidth: 120px;\n\theight: 80px;\n\t-webkit-box-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.1 );\n}\n\n.uploading .attachment-info .media-progress-bar {\n\tmargin-top: 35px;\n}\n\n.attachment-info .thumbnail-image:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\t-webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 );\n\tbox-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 );\n\toverflow: hidden;\n}\n\n.attachment-info .thumbnail img {\n\tdisplay: block;\n\tmax-width: 120px;\n\tmax-height: 120px;\n\tmargin: 0 auto;\n}\n\n.attachment-info .details {\n\tfloat: left;\n\tfont-size: 12px;\n\tmax-width: 100%;\n}\n\n.attachment-info .edit-attachment,\n.attachment-info .delete-attachment,\n.attachment-info .trash-attachment,\n.attachment-info .untrash-attachment {\n\tdisplay: block;\n\ttext-decoration: none;\n\twhite-space: nowrap;\n}\n\n.attachment-details.needs-refresh .attachment-info .edit-attachment {\n\tdisplay: none;\n}\n\n.attachment-info .edit-attachment {\n\tdisplay: block;\n}\n\n.media-modal .delete-attachment,\n.media-modal .trash-attachment,\n.media-modal .untrash-attachment {\n\tdisplay: inline;\n\tpadding: 0;\n\tcolor: #bc0b0b;\n}\n\n.media-modal .delete-attachment:hover,\n.media-modal .delete-attachment:focus,\n.media-modal .trash-attachment:hover,\n.media-modal .trash-attachment:focus,\n.media-modal .untrash-attachment:hover,\n.media-modal .untrash-attachment:focus {\n\tcolor: red;\n}\n\n/**\n * Attachment Display Settings\n */\n.attachment-display-settings {\n\twidth: 100%;\n\tfloat: left;\n\toverflow: hidden;\n}\n\n.attachment-display-settings h4 {\n\tmargin: 1.4em 0 0.4em;\n}\n\n.collection-settings {\n\toverflow: hidden;\n}\n\n.collection-settings .setting input[type=\"checkbox\"] {\n\tfloat: left;\n\tmargin-right: 8px;\n}\n\n.collection-settings .setting span {\n\tmin-width: inherit;\n}\n\n/**\n * Image Editor\n */\n.media-modal .imgedit-wrap {\n\tposition: static;\n}\n\n.media-modal .imgedit-wait {\n\theight: auto !important;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.media-modal .imgedit-wrap .imgedit-panel-content {\n\tpadding: 16px;\n\tposition: absolute;\n\ttop: 0;\n\tright: 282px;\n\tbottom: 0;\n\tleft: 0;\n\toverflow: auto;\n}\n\n.media-modal .imgedit-wrap .imgedit-settings {\n\tbackground: #f3f3f3;\n\tborder-left: 1px solid #ddd;\n\tpadding: 0 16px 16px;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\twidth: 250px;\n\toverflow: auto;\n}\n\n.media-modal .imgedit-group {\n\tbackground: none;\n\tborder: none;\n\tborder-bottom: 1px solid #ddd;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tmargin: 0;\n\tmargin-bottom: 16px;\n\tpadding: 0;\n\tpadding-bottom: 16px;\n\tposition: relative; /* RTL fix, #WP29352 */\n}\n\n.media-modal .imgedit-group:last-of-type {\n\tborder: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.media-modal .imgedit-group-top h3, /* Back-compat for pre-4.4 */\n.media-modal .imgedit-group-top h2 {\n\ttext-transform: uppercase;\n\tfont-size: 12px;\n\tcolor: #666;\n\tmargin: 0;\n\tmargin-top: 24px;\n}\n\n.media-modal .imgedit-group-top h3 a, /* Back-compat for pre-4.4 */\n.media-modal .imgedit-group-top h2 a {\n\ttext-decoration: none;\n\tcolor: #666;\n}\n\n.media-modal .imgedit-help-toggle {\n\tmargin-top: -2px;\n\tcursor: pointer;\n\tcolor: #666;\n}\n\n.media-modal .imgedit-help-toggled span.dashicons:before {\n\tcontent: \"\\f142\";\n}\n\n.media-modal .imgedit-group img {\n\tmargin-top: 5px;\n}\n\n.media-modal .imgedit-wrap div.updated {\n\tmargin: 0;\n\tmargin-bottom: 16px;\n}\n\n\n/**\n * Embed from URL and Image Details\n */\n.embed-url {\n\tdisplay: block;\n\tposition: relative;\n\tpadding: 16px;\n\tmargin: 0;\n\tz-index: 250;\n\tbackground: #fff;\n\tfont-size: 18px;\n}\n\n.media-frame .embed-url input {\n\tfont-size: 18px;\n\tpadding: 12px 14px;\n\twidth: 100%;\n\tmin-width: 200px;\n\t-webkit-box-shadow: inset 2px 2px 4px -2px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 2px 2px 4px -2px rgba( 0, 0, 0, 0.1 );\n}\n\n.media-frame .embed-url .spinner {\n\tposition: absolute;\n\ttop: 32px;\n\tright: 26px;\n}\n\n.media-frame .embed-loading .embed-url .spinner {\n\tvisibility: visible;\n}\n\n.embed-link-settings,\n.embed-media-settings {\n\tposition: absolute;\n\ttop: 70px;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tpadding: 16px 16px 32px;\n\toverflow: auto;\n}\n\n.media-embed .embed-link-settings {\n\t/* avoid Firefox to give focus to the embed preview container parent */\n\toverflow: visible;\n}\n\n.embed-preview img,\n.embed-preview iframe,\n.embed-preview embed,\n.mejs-container video {\n\tmax-width: 100%;\n\tvertical-align: middle;\n}\n\n.embed-preview a {\n\tdisplay: inline-block;\n}\n\n.embed-preview img {\n\tdisplay: block;\n\theight: auto;\n}\n\n.mejs-container:focus {\n\toutline: 1px solid #5b9dd9;\n\t-webkit-box-shadow: 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 2px 1px rgba(30, 140, 190, .8);\n}\n\n.image-details .media-modal {\n\tleft: 140px;\n\tright: 140px;\n}\n\n.image-details .media-frame-title,\n.image-details .media-frame-content,\n.image-details .media-frame-router {\n\tleft: 0;\n}\n\n.image-details .embed-media-settings {\n\ttop: 0;\n\toverflow: visible;\n\tpadding: 0;\n}\n\n.image-details .embed-media-settings,\n.image-details .embed-media-settings div {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.image-details .column-settings {\n\tbackground: #f3f3f3;\n\tborder-right: 1px solid #ddd;\n\tmin-height: 100%;\n\twidth: 55%;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.image-details .column-settings h3, /* Back-compat for pre-4.4 */\n.image-details .column-settings h2 {\n\tmargin: 20px;\n\tpadding-top: 20px;\n\tborder-top: 1px solid #ddd;\n\tcolor: #23282d;\n}\n\n.image-details .column-image {\n\twidth: 45%;\n\tposition: absolute;\n\tleft: 55%;\n\ttop: 0;\n}\n\n.image-details .image {\n\tmargin: 20px;\n}\n\n.image-details .image img {\n\tmax-width: 100%;\n\tmax-height: 500px;\n}\n\n.image-details .advanced-toggle {\n\tpadding: 0;\n\tcolor: #666;\n\ttext-transform: uppercase;\n}\n\n.image-details .advanced-toggle:after {\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\tvertical-align: top;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tcontent: \"\\f140\";\n\tdisplay: inline-block;\n\tmargin-top: -2px;\n}\n\n.image-details .advanced-visible .advanced-toggle:after {\n\tcontent: \"\\f142\";\n}\n\n.image-details .embed-media-settings .size {\n\tmargin-bottom: 4px;\n}\n\n.image-details .custom-size span {\n\tdisplay: block;\n}\n\n.image-details .custom-size label {\n\tdisplay: block;\n\tfloat: left;\n}\n\n.image-details .custom-size span small {\n\tcolor: #999;\n\tfont-size: inherit;\n}\n\n.image-details .custom-size input {\n\twidth: 5em;\n}\n\n.image-details .custom-size .sep {\n\tfloat: left;\n\tmargin: 26px 6px 0 6px;\n}\n\n.image-details .custom-size:after {\n\tcontent: \"\";\n\tdisplay: table;\n\tclear: both;\n}\n\n.media-embed .thumbnail {\n\tmax-width: 100%;\n\tmax-height: 200px;\n\tposition: relative;\n\tfloat: left;\n}\n\n.media-embed .thumbnail img {\n\tmax-height: 200px;\n\tdisplay: block;\n}\n\n.media-embed .thumbnail:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\t-webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );\n\tbox-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );\n\toverflow: hidden;\n}\n\n.media-embed .setting {\n\twidth: 100%;\n\tmargin: 10px 0;\n\tfloat: left;\n\tdisplay: block;\n\tclear: both;\n}\n\n.image-details .embed-media-settings .setting {\n\tfloat: none;\n\twidth: auto;\n}\n\n.image-details .actions {\n\tmargin: 10px 0;\n}\n\n.image-details .hidden {\n\tdisplay: none;\n}\n\n.media-embed .setting input[type=\"text\"],\n.media-embed .setting textarea {\n\tdisplay: block;\n\twidth: 100%;\n\tmax-width: 400px;\n\tmargin: 1px 0;\n}\n\n.image-details .embed-media-settings .setting input[type=\"text\"],\n.image-details .embed-media-settings .setting textarea {\n\tmax-width: inherit;\n\twidth: 70%;\n}\n\n.image-details .embed-media-settings .setting input.link-to-custom,\n.image-details .embed-media-settings .link-target,\n.image-details .embed-media-settings .custom-size {\n\tmargin-left: 27%;\n\twidth: 70%;\n}\n\n.image-details .embed-media-settings .link-target {\n\tmargin-top: 24px;\n}\n\n.media-embed .setting input.hidden,\n.media-embed .setting textarea.hidden {\n\tdisplay: none;\n}\n\n.media-embed .setting span {\n\tdisplay: block;\n\twidth: 200px;\n\tfont-size: 13px;\n\tline-height: 24px;\n\tcolor: #666;\n}\n\n.image-details .embed-media-settings .setting span {\n\tfloat: left;\n\twidth: 25%;\n\ttext-align: right;\n\tmargin: 8px 1% 0 1%;\n\tline-height: 1.1;\n}\n\n.media-embed .setting .button-group {\n\tmargin: 2px 0;\n}\n\n.media-embed-sidebar {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 440px;\n}\n\n.advanced-section,\n.link-settings {\n\tmargin-top: 10px;\n}\n\n/* Drag & drop on the editor upload */\n.wp-editor-wrap .uploader-editor {\n\tbackground: rgba( 150, 150, 150, 0.9 );\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 99998; /* under the toolbar */\n\tdisplay: none;\n\ttext-align: center;\n}\n\n.wp-editor-wrap .uploader-editor-content {\n\tborder: 1px dashed #fff;\n\tposition: absolute;\n\ttop: 10px;\n\tleft: 10px;\n\tright: 10px;\n\tbottom: 10px;\n}\n\n.wp-editor-wrap .uploader-editor .uploader-editor-title {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translateY( -50% );\n\t-ms-transform: translateY(-50%);\n\ttransform: translateY( -50% );\n\tfont-size: 3em;\n\tline-height: 1.3;\n\tfont-weight: bold;\n\tcolor: #fff;\n\tpadding: 0;\n\tmargin: 0;\n\tdisplay: none;\n}\n\n.wp-editor-wrap .uploader-editor.droppable {\n\tbackground: rgba( 0, 86, 132, 0.9 );\n}\n\n.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title {\n\tdisplay: block;\n}\n\n/**\n * IE7 Fixes\n */\n.ie7 .media-frame .attachments-browser {\n\tposition: static;\n}\n\n.ie7 .media-frame .embed-url input {\n\tmargin-top: 4px;\n\twidth: 90%;\n}\n\n.ie7 .compat-item {\n\twidth: 99%;\n}\n\n.ie7 .attachment-display-settings {\n\twidth: auto;\n}\n\n.ie7 .attachment-preview,\n.ie7 .attachment-preview .thumbnail {\n\twidth: 120px;\n\theight: 120px;\n}\n\n.ie7 .media-frame .attachment .describe {\n\twidth: 102px;\n}\n\n.ie7 .media-sidebar .setting select {\n\tmax-width: 55%;\n}\n\n.ie7 .media-sidebar .setting input[type=\"text\"],\n.ie7 .media-sidebar .setting input[type=\"password\"],\n.ie7 .media-sidebar .setting input[type=\"email\"],\n.ie7 .media-sidebar .setting input[type=\"number\"],\n.ie7 .media-sidebar .setting input[type=\"search\"],\n.ie7 .media-sidebar .setting input[type=\"tel\"],\n.ie7 .media-sidebar .setting input[type=\"url\"],\n.ie7 .media-sidebar .setting textarea {\n\twidth: 55%;\n}\n\n.ie7 .media-sidebar .setting .link-to-custom {\n\tfloat: left;\n}\n\n/**\n * Localization\n */\n.rtl .media-modal,\n.rtl .media-frame,\n.rtl .media-frame .search,\n.rtl .media-frame input[type=\"text\"],\n.rtl .media-frame input[type=\"password\"],\n.rtl .media-frame input[type=\"number\"],\n.rtl .media-frame input[type=\"search\"],\n.rtl .media-frame input[type=\"email\"],\n.rtl .media-frame input[type=\"url\"],\n.rtl .media-frame input[type=\"tel\"],\n.rtl .media-frame textarea,\n.rtl .media-frame select {\n\tfont-family: Tahoma, sans-serif;\n}\n\n:lang(he-il) .rtl .media-modal,\n:lang(he-il) .rtl .media-frame,\n:lang(he-il) .rtl .media-frame .search,\n:lang(he-il) .rtl .media-frame input[type=\"text\"],\n:lang(he-il) .rtl .media-frame input[type=\"password\"],\n:lang(he-il) .rtl .media-frame input[type=\"number\"],\n:lang(he-il) .rtl .media-frame input[type=\"search\"],\n:lang(he-il) .rtl .media-frame input[type=\"email\"],\n:lang(he-il) .rtl .media-frame input[type=\"url\"],\n:lang(he-il) .rtl .media-frame textarea,\n:lang(he-il) .rtl .media-frame select {\n\tfont-family: Arial, sans-serif;\n}\n\n/**\n * Responsive layout\n */\n@media only screen and (max-width: 900px) {\n\n\t/* Drop-down menu */\n\t.media-frame:not(.hide-menu) .media-frame-title,\n\t.media-frame:not(.hide-menu) .media-frame-router,\n\t.media-frame:not(.hide-menu) .media-frame-content,\n\t.media-frame:not(.hide-menu) .media-frame-toolbar {\n\t\tleft: 0;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-menu {\n\t\tposition: static;\n\t\twidth: 0;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu {\n\t\twidth: auto;\n\t\tmax-width: 80%;\n\t\toverflow: auto;\n\t\tz-index: 2000;\n\t\ttop: 50px;\n\t\tleft: -300px;\n\t\tright: auto;\n\t\tbottom: auto;\n\t\tpadding: 5px 0;\n\t\tborder: 1px solid #ccc;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu.visible {\n\t\tleft: 0;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu > a {\n\t\tpadding: 12px 16px;\n\t\tfont-size: 16px;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu > a.active {\n\t\tdisplay: none;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-menu .separator {\n\t\tmargin: 5px 10px;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-title {\n\t\tleft: 0;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-title .dashicons {\n\t\tdisplay: inline-block;\n\t\tline-height: 50px;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-title h1 {\n\t\tcolor: #0073aa;\n\t\tline-height: 3;\n\t\tfont-size: 18px;\n\t\tfloat: left;\n\t\tcursor: pointer;\n\t}\n\t/* End drop-down menu */\n\n\t.media-sidebar {\n\t\twidth: 230px;\n\t}\n\n\t.attachments-browser .attachments,\n\t.attachments-browser .uploader-inline,\n\t.attachments-browser .media-toolbar {\n\t\tright: 262px;\n\t}\n\n\t.media-sidebar .setting,\n\t.attachment-details .setting {\n\t\tmargin: 6px 0px;\n\t}\n\n\t.media-sidebar .setting input,\n\t.media-sidebar .setting textarea,\n\t.media-sidebar .setting span,\n\t.attachment-details .setting input,\n\t.attachment-details .setting textarea,\n\t.attachment-details .setting span,\n\t.compat-item label span {\n\t\tfloat: none;\n\t}\n\n\t.media-sidebar .setting span,\n\t.attachment-details .setting span,\n\t.compat-item label span {\n\t\ttext-align: inherit;\n\t\tmin-height: 16px;\n\t\tmargin: 0;\n\t\tpadding: 8px 2px 0;\n\t}\n\n\t.media-sidebar .setting .value,\n\t.attachment-details .setting .value {\n\t\tfloat: none;\n\t\twidth: auto;\n\t}\n\n\t.media-sidebar .setting input[type=\"text\"],\n\t.media-sidebar .setting input[type=\"password\"],\n\t.media-sidebar .setting input[type=\"email\"],\n\t.media-sidebar .setting input[type=\"number\"],\n\t.media-sidebar .setting input[type=\"search\"],\n\t.media-sidebar .setting input[type=\"tel\"],\n\t.media-sidebar .setting input[type=\"url\"],\n\t.media-sidebar .setting textarea,\n\t.media-sidebar .setting select,\n\t.attachment-details .setting input[type=\"text\"],\n\t.attachment-details .setting input[type=\"password\"],\n\t.attachment-details .setting input[type=\"email\"],\n\t.attachment-details .setting input[type=\"number\"],\n\t.attachment-details .setting input[type=\"search\"],\n\t.attachment-details .setting input[type=\"tel\"],\n\t.attachment-details .setting input[type=\"url\"],\n\t.attachment-details .setting textarea,\n\t.attachment-details .setting select {\n\t\tfloat: none;\n\t\twidth: 98%;\n\t\tmax-width: none;\n\t\theight: auto;\n\t}\n\n\t.media-sidebar .setting select.columns,\n\t.attachment-details .setting select.columns {\n\t\twidth: auto;\n\t}\n\n\t.media-frame input,\n\t.media-frame textarea,\n\t.media-frame .search {\n\t\tpadding: 3px 6px;\n\t}\n\n\t.image-details .column-image {\n\t\twidth: 30%;\n\t\tleft: 70%;\n\t}\n\n\t.image-details .column-settings {\n\t\twidth: 70%;\n\t}\n\n\t.image-details .media-modal {\n\t\tleft: 30px;\n\t\tright: 30px;\n\t}\n\n\t.image-details .embed-media-settings .setting {\n\t\tmargin: 20px;\n\t}\n\n\t.image-details .embed-media-settings .setting span {\n\t\tfloat: none;\n\t\ttext-align: left;\n\t\twidth: 100%;\n\t\tmargin-bottom: 4px;\n\t}\n\n\t.image-details .embed-media-settings .setting input.link-to-custom,\n\t.image-details .embed-media-settings .setting input[type=\"text\"],\n\t.image-details .embed-media-settings .setting textarea {\n\t\twidth: 100%;\n\t\tmargin-left: 0;\n\t}\n\n\t.image-details .embed-media-settings .custom-size {\n\t\tmargin-left: 20px;\n\t}\n\n\t.collection-settings .setting input[type=\"checkbox\"] {\n\t\tmargin-top: 0;\n\t}\n\n\t.media-selection {\n\t\tmin-width: 120px;\n\t}\n\n\t.media-selection:after {\n\t\tbackground: none;\n\t}\n\n\t.media-selection .attachments {\n\t\tdisplay: none;\n\t}\n\n\t.media-modal .attachments-browser .media-toolbar .search {\n\t\tmax-width: 100%;\n\t\theight: auto;\n\t\tfloat: right;\n\t}\n\n\t.media-modal .attachments-browser .media-toolbar .attachment-filters {\n\t\theight: auto;\n\t}\n\n\t.media-modal .attachments-browser .media-toolbar .spinner {\n\t\tmargin: 14px 2px 0;\n\t}\n\n\t/* Text inputs need to be 16px, or they force zooming on iOS */\n\t.media-frame input[type=\"text\"],\n\t.media-frame input[type=\"password\"],\n\t.media-frame input[type=\"number\"],\n\t.media-frame input[type=\"search\"],\n\t.media-frame input[type=\"email\"],\n\t.media-frame input[type=\"url\"],\n\t.media-frame textarea,\n\t.media-frame select {\n\t\tfont-size: 16px;\n\t}\n}\n\n/* Responsive on portrait and landscape */\n@media only screen and (max-width: 640px), screen and (max-height: 400px) {\n\t/* Full-bleed modal */\n\t.media-modal,\n\t.image-details .media-modal {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tright: 0;\n\t\tbottom: 0;\n\t}\n\n\t.media-modal-backdrop {\n\t\tposition: fixed;\n\t}\n\n\t.media-sidebar {\n\t\tz-index: 1900;\n\t\tmax-width: 70%;\n\t\tbottom: 120%;\n\t\t-webkit-box-sizing: border-box;\n\t\t-moz-box-sizing: border-box;\n\t\tbox-sizing: border-box;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.media-sidebar.visible {\n\t\tbottom: 0;\n\t}\n\n\t.attachments-browser .attachments,\n\t.attachments-browser .uploader-inline,\n\t.attachments-browser .media-toolbar {\n\t\tright: 0;\n\t}\n\n\t.image-details .media-frame-title {\n\t\tdisplay: block;\n\t\ttop: 0;\n\t\tfont-size: 14px;\n\t}\n\n\t.image-details .column-image,\n\t.image-details .column-settings {\n\t\twidth: 100%;\n\t\tposition: relative;\n\t\tleft: 0;\n\t}\n\n\t.image-details .column-settings {\n\t\tpadding: 4px 0;\n\t}\n\n\t/* Media tabs on the top */\n\t.media-frame-content .media-toolbar .instructions {\n\t\tdisplay: none;\n\t}\n}\n\n/* Landscape specific header override */\n@media screen and (max-height: 400px) {\n\t.media-menu {\n\t\tpadding: 0;\n\t}\n\n\t.media-frame-router {\n\t\ttop: 44px;\n\t}\n\n\t.media-frame-content {\n\t\ttop: 78px;\n\t}\n\n\t.attachments-browser .attachments {\n\t\ttop: 40px;\n\t}\n\n\t/* Prevent unnecessary scrolling on title input */\n\t.embed-link-settings {\n\t\toverflow: visible;\n\t}\n}\n\n@media only screen and (max-width: 480px) {\n\t.media-modal-close {\n\t\ttop: -5px;\n\t}\n\n\t.media-modal .media-frame-title {\n\t\theight: 40px;\n\t}\n\n\t.wp-core-ui.wp-customizer .media-button {\n\t\tmargin-top: 13px;\n\t}\n\n\t.media-modal .media-frame-title h1,\n\t.media-frame:not(.hide-menu) .media-frame-title h1 {\n\t\tfont-size: 18px;\n\t\tline-height: 40px;\n\t}\n\n\t.media-frame:not(.hide-menu) .media-frame-title .dashicons {\n\t\tline-height: 40px;\n\t}\n\n\t.media-frame-router,\n\t.media-frame:not(.hide-menu) .media-menu {\n\t\ttop: 40px;\n\t}\n\n\t.media-frame-content {\n\t\ttop: 74px;\n\t}\n\n\t.media-frame.hide-router .media-frame-content {\n\t\ttop: 40px;\n\t}\n}\n\n/**\n * HiDPI Displays\n */\n@media print,\n  (-webkit-min-device-pixel-ratio: 1.25),\n  (min-resolution: 120dpi) {\n\n\t.media-modal-icon {\n\t\tbackground-image: url(../images/uploader-icons-2x.png);\n\t\t-webkit-background-size: 134px 15px;\n\t\tbackground-size: 134px 15px;\n\t}\n\n\t.media-frame .spinner {\n\t\tbackground-image: url(../images/spinner-2x.gif);\n\t}\n}\n\n.media-frame-content[data-columns=\"1\"] .attachment {\n\twidth: 100%;\n}\n\n.media-frame-content[data-columns=\"2\"] .attachment {\n\twidth: 50%;\n}\n\n.media-frame-content[data-columns=\"3\"] .attachment {\n\twidth: 33.33%;\n}\n\n.media-frame-content[data-columns=\"4\"] .attachment {\n\twidth: 25%;\n}\n\n.media-frame-content[data-columns=\"5\"] .attachment {\n\twidth: 20%;\n}\n\n.media-frame-content[data-columns=\"6\"] .attachment {\n\twidth: 16.66%;\n}\n\n.media-frame-content[data-columns=\"7\"] .attachment {\n\twidth: 14.28%;\n}\n\n.media-frame-content[data-columns=\"8\"] .attachment {\n\twidth: 12.5%;\n}\n\n.media-frame-content[data-columns=\"9\"] .attachment {\n\twidth: 11.11%;\n}\n\n.media-frame-content[data-columns=\"10\"] .attachment {\n\twidth: 10%;\n}\n\n.media-frame-content[data-columns=\"11\"] .attachment {\n\twidth: 9.09%;\n}\n\n.media-frame-content[data-columns=\"12\"] .attachment {\n\twidth: 8.33%;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/wp-auth-check-rtl.css",
    "content": "/*------------------------------------------------------------------------------\n Interim login dialog\n------------------------------------------------------------------------------*/\n\n#wp-auth-check-wrap.hidden {\n\tdisplay: none;\n}\n\n#wp-auth-check-wrap #wp-auth-check-bg {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tright: 0;\n\tleft: 0;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 1000010; /* needs to appear above .notification-dialog */\n}\n\n#wp-auth-check-wrap #wp-auth-check {\n\tposition: fixed;\n\tright: 50%;\n\toverflow: hidden;\n\ttop: 40px;\n\tbottom: 20px;\n\tmax-height: 415px;\n\twidth: 380px;\n\tmargin: 0 -190px 0 0;\n\tpadding: 30px 0 0;\n\tbackground-color: #f1f1f1;\n\tz-index: 1000011; /* needs to appear above #wp-auth-check-bg */\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n}\n\n@media screen and ( max-width: 380px ) {\n\t#wp-auth-check-wrap #wp-auth-check {\n\t\tright: 0;\n\t\twidth: 100%;\n\t\tmargin: 0;\n\t}\n}\n\n#wp-auth-check-wrap.fallback #wp-auth-check {\n\tmax-height: 180px;\n\toverflow: auto;\n}\n\n#wp-auth-check-wrap #wp-auth-check-form {\n\tbackground: url(../images/spinner-2x.gif) no-repeat center center;\n\t-webkit-background-size: 16px 16px;\n\tbackground-size: 16px 16px;\n\theight: 100%;\n\toverflow: auto;\n\t-webkit-overflow-scrolling: touch;\n}\n\n#wp-auth-check-wrap #wp-auth-check-form iframe {\n\theight: 98%; /* Scrollbar fix */\n\twidth: 100%;\n}\n\n#wp-auth-check-wrap .wp-auth-check-close {\n\tposition: absolute;\n\ttop: 8px;\n\tleft: 8px;\n\theight: 22px;\n\twidth: 22px;\n\tcursor: pointer;\n}\n\n#wp-auth-check-wrap .wp-auth-check-close:before {\n\tcontent: \"\\f158\";\n\tdisplay: block !important;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\theight: 22px;\n\tmargin: 2px 0;\n\ttext-align: center;\n\twidth: 22px;\n\tcolor: #777;\n\t-webkit-font-smoothing: antialiased !important;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#wp-auth-check-wrap .wp-auth-check-close:hover:before {\n\tcolor: #0073aa;\n}\n\n#wp-auth-check-wrap .wp-auth-check-close:focus {\n\toutline: 1px dotted #82878c;\n}\n\n#wp-auth-check-wrap .wp-auth-fallback-expired {\n\toutline: 0;\n}\n\n#wp-auth-check-wrap .wp-auth-fallback {\n\tfont-size: 14px;\n\tline-height: 21px;\n\tpadding: 0 25px;\n\tdisplay: none;\n}\n\n#wp-auth-check-wrap.fallback .wp-auth-fallback,\n#wp-auth-check-wrap.fallback .wp-auth-check-close {\n\tdisplay: block;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/wp-auth-check.css",
    "content": "/*------------------------------------------------------------------------------\n Interim login dialog\n------------------------------------------------------------------------------*/\n\n#wp-auth-check-wrap.hidden {\n\tdisplay: none;\n}\n\n#wp-auth-check-wrap #wp-auth-check-bg {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tz-index: 1000010; /* needs to appear above .notification-dialog */\n}\n\n#wp-auth-check-wrap #wp-auth-check {\n\tposition: fixed;\n\tleft: 50%;\n\toverflow: hidden;\n\ttop: 40px;\n\tbottom: 20px;\n\tmax-height: 415px;\n\twidth: 380px;\n\tmargin: 0 0 0 -190px;\n\tpadding: 30px 0 0;\n\tbackground-color: #f1f1f1;\n\tz-index: 1000011; /* needs to appear above #wp-auth-check-bg */\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n}\n\n@media screen and ( max-width: 380px ) {\n\t#wp-auth-check-wrap #wp-auth-check {\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\tmargin: 0;\n\t}\n}\n\n#wp-auth-check-wrap.fallback #wp-auth-check {\n\tmax-height: 180px;\n\toverflow: auto;\n}\n\n#wp-auth-check-wrap #wp-auth-check-form {\n\tbackground: url(../images/spinner-2x.gif) no-repeat center center;\n\t-webkit-background-size: 16px 16px;\n\tbackground-size: 16px 16px;\n\theight: 100%;\n\toverflow: auto;\n\t-webkit-overflow-scrolling: touch;\n}\n\n#wp-auth-check-wrap #wp-auth-check-form iframe {\n\theight: 98%; /* Scrollbar fix */\n\twidth: 100%;\n}\n\n#wp-auth-check-wrap .wp-auth-check-close {\n\tposition: absolute;\n\ttop: 8px;\n\tright: 8px;\n\theight: 22px;\n\twidth: 22px;\n\tcursor: pointer;\n}\n\n#wp-auth-check-wrap .wp-auth-check-close:before {\n\tcontent: \"\\f158\";\n\tdisplay: block !important;\n\tfont: normal 20px/1 dashicons;\n\tspeak: none;\n\theight: 22px;\n\tmargin: 2px 0;\n\ttext-align: center;\n\twidth: 22px;\n\tcolor: #777;\n\t-webkit-font-smoothing: antialiased !important;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#wp-auth-check-wrap .wp-auth-check-close:hover:before {\n\tcolor: #0073aa;\n}\n\n#wp-auth-check-wrap .wp-auth-check-close:focus {\n\toutline: 1px dotted #82878c;\n}\n\n#wp-auth-check-wrap .wp-auth-fallback-expired {\n\toutline: 0;\n}\n\n#wp-auth-check-wrap .wp-auth-fallback {\n\tfont-size: 14px;\n\tline-height: 21px;\n\tpadding: 0 25px;\n\tdisplay: none;\n}\n\n#wp-auth-check-wrap.fallback .wp-auth-fallback,\n#wp-auth-check-wrap.fallback .wp-auth-check-close {\n\tdisplay: block;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/wp-embed-template-ie.css",
    "content": ".dashicons-no {\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAAAcElEQVR4AdXRVxmEMBAGwJMQCUhAIhKQECmRsFJwMFfp7HfP/E8pk0173CuKpt/0R+WaBaaZqogLagBMuh+DdoKbyRCwqZ/SnM0R5oQuZ2UHS8Z6k23qPxZCTrV5UlHMi8bsfHVXP7K/GXZHaTO7S54CWLdHlN2YIwAAAABJRU5ErkJggg==);\n}\n\n.dashicons-admin-comments {\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATUlEQVR4AWMYWqCpvUcAiA8A8X9iMFStAD4DG0AKScQNVDZw1MBRAwvIMLCA5jmFlCD4AMQGlOTtBgoNwzQQ3TCKDaTcMMxYN2AYVgAAYPKsEBxN0PIAAAAASUVORK5CYII=);\n}\n\n.wp-embed-comments a:hover .dashicons-admin-comments {\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATElEQVR4AWMYYqB4lQAQHwDi/8RgqFoBfAY2gBSSiBuobOCogaMGFpBhYAEdcwrhIPgAxAaU5O0GCg3DNBDdMIoNpNwwzFg3YBhWAABG71qAFYcFqgAAAABJRU5ErkJggg==);\n}\n\n.dashicons-share {\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYfqCpvccAiBcA8X8gfgDEBZQaeAFkGBoOoMR1/7HgDeQa2ECZgQiDHID4AMwAor0MCmBoQP+HBnwAskFQdgBRkQJViGk7wiAHUr21AYdhDTA1dDOQHl6mPFLokmwoT9j0z3qUFw70L77oDwAiuzCIub1XpQAAAABJRU5ErkJggg==);\n}\n\n.wp-embed-share-dialog-open:hover .dashicons-share {\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYhqB4lQEQLwDi/0D8AIgLKDXwAsgwNBxAiev+Y8EbyDWwgTIDEQY5APEBmAFEexkUwNCA/g8N+ABkg6DsAKIiBaoQ03aEQQ6kemsDDsMaYEroZiA9vEx5pNAl2VCesOmf9SgvHOhffNEfAAAMqPR5IEZH5wAAAABJRU5ErkJggg==);\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/wp-embed-template.css",
    "content": "html, body {\n\tpadding: 0;\n\tmargin: 0;\n}\n\nbody {\n\tfont-family: sans-serif;\n}\n\n/* Text meant only for screen readers */\n.screen-reader-text {\n\tclip: rect(1px, 1px, 1px, 1px);\n\theight: 1px;\n\toverflow: hidden;\n\tposition: absolute !important;\n\twidth: 1px;\n}\n\n/* Dashicons */\n.dashicons {\n\tdisplay: inline-block;\n\twidth: 20px;\n\theight: 20px;\n\tbackground-color: transparent;\n\tbackground-repeat: no-repeat;\n\t-webkit-background-size: 20px 20px;\n\tbackground-size: 20px;\n\tbackground-position: center;\n\t-webkit-transition: background .1s ease-in;\n\ttransition: background .1s ease-in;\n\tposition: relative;\n\ttop: 5px;\n}\n\n.dashicons-no {\n\tbackground-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E\");\n}\n\n.dashicons-admin-comments {\n\tbackground-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E\");\n}\n\n.wp-embed-comments a:hover .dashicons-admin-comments {\n\tbackground-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E\");\n}\n\n.dashicons-share {\n\tbackground-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E\");\n\tdisplay: none;\n}\n\n.js .dashicons-share {\n\tdisplay: inline-block;\n}\n\n.wp-embed-share-dialog-open:hover .dashicons-share {\n\tbackground-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E\");\n}\n\n.wp-embed {\n\tpadding: 25px;\n\tfont: 400 14px/1.5 'Open Sans', sans-serif;\n\tcolor: #82878c;\n\tbackground: white;\n\tborder: 1px solid #e5e5e5;\n\t-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n\tbox-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n\t/* Clearfix */\n\toverflow: auto;\n\tzoom: 1;\n}\n\n.wp-embed a {\n\tcolor: #82878c;\n\ttext-decoration: none;\n}\n\n.wp-embed a:hover {\n\ttext-decoration: underline;\n}\n\n.wp-embed-featured-image {\n\tmargin-bottom: 20px;\n}\n\n.wp-embed-featured-image img {\n\twidth: 100%;\n\theight: auto;\n\tborder: none;\n}\n\n.wp-embed-featured-image.square {\n\tfloat: left;\n\tmax-width: 160px;\n\tmargin-right: 20px;\n}\n\n.wp-embed p {\n\tmargin: 0;\n}\n\np.wp-embed-heading {\n\tmargin: 0 0 15px;\n\tfont-weight: bold;\n\tfont-size: 22px;\n\tline-height: 1.3;\n}\n\n.wp-embed-heading a {\n\tcolor: #32373c;\n}\n\n.wp-embed .wp-embed-more {\n\tcolor: #b4b9be;\n}\n\n.wp-embed-footer {\n\tdisplay: table;\n\twidth: 100%;\n\tmargin-top: 30px;\n}\n\n.wp-embed-site-icon {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 0;\n\t-webkit-transform: translateY(-50%);\n\t-ms-transform: translateY(-50%);\n\ttransform: translateY(-50%);\n\theight: 25px;\n\twidth: 25px;\n\tborder: 0;\n}\n\n.wp-embed-site-title {\n\tfont-weight: bold;\n\tline-height: 25px;\n}\n\n.wp-embed-site-title a {\n\tposition: relative;\n\tdisplay: inline-block;\n\tpadding-left: 35px;\n}\n\n.wp-embed-site-title,\n.wp-embed-meta {\n\tdisplay: table-cell;\n}\n\n.wp-embed-meta {\n\ttext-align: right;\n\twhite-space: nowrap;\n\tvertical-align: middle;\n}\n\n.wp-embed-comments,\n.wp-embed-share {\n\tdisplay: inline;\n}\n\n.wp-embed-meta a:hover {\n\ttext-decoration: none;\n\tcolor: #0073aa;\n}\n\n.wp-embed-comments a {\n\tline-height: 25px;\n\tdisplay: inline-block;\n}\n\n.wp-embed-comments + .wp-embed-share {\n\tmargin-left: 10px;\n}\n\n.wp-embed-share-dialog {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tbackground-color: #222;\n\tbackground-color: rgba(10, 10, 10, 0.9);\n\tcolor: #fff;\n\topacity: 1;\n\t-webkit-transition: opacity .25s ease-in-out;\n\ttransition: opacity .25s ease-in-out;\n}\n\n.wp-embed-share-dialog.hidden {\n\topacity: 0;\n\tvisibility: hidden;\n}\n\n.wp-embed-share-dialog-open,\n.wp-embed-share-dialog-close {\n\tmargin: -8px 0 0;\n\tpadding: 0;\n\tbackground: transparent;\n\tborder: none;\n\tcursor: pointer;\n\toutline: none;\n}\n\n.wp-embed-share-dialog-open .dashicons,\n.wp-embed-share-dialog-close .dashicons {\n\tpadding: 4px;\n}\n\n.wp-embed-share-dialog-open .dashicons {\n\ttop: 8px;\n}\n\n.wp-embed-share-dialog-open:focus .dashicons,\n.wp-embed-share-dialog-close:focus .dashicons {\n\t-webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\tbox-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8);\n\t-webkit-border-radius: 100%;\n\tborder-radius: 100%;\n}\n\n.wp-embed-share-dialog-close {\n\tposition: absolute;\n\ttop: 20px;\n\tright: 20px;\n\tfont-size: 22px;\n}\n\n.wp-embed-share-dialog-close:hover {\n\ttext-decoration: none;\n}\n\n.wp-embed-share-dialog-close .dashicons {\n\theight: 24px;\n\twidth: 24px;\n\t-webkit-background-size: 24px 24px;\n\tbackground-size: 24px;\n}\n\n.wp-embed-share-dialog-content {\n\theight: 100%;\n\t-webkit-transform-style: preserve-3d;\n\ttransform-style: preserve-3d;\n\toverflow: hidden;\n}\n\n.wp-embed-share-dialog-text {\n\tmargin-top: 25px;\n\tpadding: 20px;\n}\n\n.wp-embed-share-tabs {\n\tmargin: 0 0 20px;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.wp-embed-share-tab-button {\n\tdisplay: inline-block;\n}\n\n.wp-embed-share-tab-button button {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: none;\n\tbackground: transparent;\n\tfont-size: 16px;\n\tline-height: 1.3;\n\tcolor: #aaa;\n\tcursor: pointer;\n\t-webkit-transition: color .1s ease-in;\n\ttransition: color .1s ease-in;\n}\n\n.wp-embed-share-tab-button [aria-selected=\"true\"] {\n\tcolor: #fff;\n}\n\n.wp-embed-share-tab-button button:hover {\n\tcolor: #fff;\n}\n\n.wp-embed-share-tab-button + .wp-embed-share-tab-button {\n\tmargin: 0 0 0 10px;\n\tpadding: 0 0 0 11px;\n\tborder-left: 1px solid #aaa;\n}\n\n.wp-embed-share-tab[aria-hidden=\"true\"] {\n\tdisplay: none;\n}\n\np.wp-embed-share-description {\n\tmargin: 0;\n\tfont-size: 14px;\n\tline-height: 1;\n\tfont-style: italic;\n\tcolor: #aaa;\n}\n\n.wp-embed-share-input {\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\twidth: 100%;\n\tborder: none;\n\theight: 28px;\n\tmargin: 0 0 10px 0;\n\tpadding: 0 5px;\n\tfont: 400 14px/1.5 'Open Sans', sans-serif;\n\tresize: none;\n\tcursor: text;\n}\n\ntextarea.wp-embed-share-input {\n\theight: 72px;\n}\n\nhtml[dir=\"rtl\"] .wp-embed-featured-image.square {\n\tfloat: right;\n\tmargin-right: 0;\n\n\tmargin-left: 20px;\n}\n\nhtml[dir=\"rtl\"] .wp-embed-site-title a {\n\tpadding-left: 0;\n\tpadding-right: 35px;\n}\n\nhtml[dir=\"rtl\"] .wp-embed-site-icon {\n\tmargin-right: 0;\n\tmargin-left: 10px;\n\tleft: auto;\n\tright: 0;\n}\n\nhtml[dir=\"rtl\"] .wp-embed-meta {\n\ttext-align: left;\n}\n\nhtml[dir=\"rtl\"] .wp-embed-footer {\n}\n\nhtml[dir=\"rtl\"] .wp-embed-share {\n\tmargin-left: 0;\n\tmargin-right: 10px;\n}\n\nhtml[dir=\"rtl\"] .wp-embed-share-dialog-close {\n\tright: auto;\n\tleft: 20px;\n}\n\nhtml[dir=\"rtl\"] .wp-embed-share-tab-button + .wp-embed-share-tab-button {\n\tmargin: 0 10px 0 0;\n\tpadding: 0 11px 0 0;\n\tborder-left: none;\n\tborder-right: 1px solid #aaa;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/wp-pointer-rtl.css",
    "content": ".wp-pointer-content {\n\tpadding: 0 0 10px;\n\tposition: relative;\n\tfont-size: 13px;\n\tbackground: #fff;\n\tborder: 1px solid #dfdfdf;\n\t-webkit-box-shadow: 0 3px 6px rgba(0,0,0,0.075);\n\tbox-shadow: 0 3px 6px rgba(0,0,0,0.075);\n}\n\n.wp-pointer-content h3 {\n\tposition: relative;\n\tmargin: -1px -1px 5px;\n\tpadding: 15px 60px 14px 18px;\n\tborder: 1px solid #3592b6;\n\tborder-bottom: none;\n\tline-height: 1.4em;\n\tfont-size: 14px;\n\tcolor: #fff;\n\tbackground: #00a0d2;\n}\n\n.wp-pointer-content h3:before {\n\tbackground: #fff;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tcolor: #00a0d2;\n\tcontent: \"\\f227\";\n\tfont: normal 20px/1.6 dashicons;\n\tposition: absolute;\n\ttop: 8px;\n\tright: 15px;\n\tspeak: none;\n\ttext-align: center;\n\twidth: 32px;\n\theight: 32px;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.wp-pointer-content p {\n\tpadding: 0 15px;\n}\n\n.wp-pointer-buttons {\n\tmargin: 0;\n\tpadding: 5px 15px;\n\toverflow: auto;\n}\n\n.wp-pointer-buttons a {\n\tfloat: left;\n\tdisplay: inline-block;\n\ttext-decoration: none;\n}\n\n.wp-pointer-buttons a.close {\n\tpadding-right: 3px;\n\tposition: relative;\n}\n\n.wp-pointer-buttons a.close:before {\n\tbackground: none;\n\tcolor: #b4b9be;\n\tcontent: \"\\f153\";\n\tdisplay: block !important;\n\tfont: normal 16px/1 dashicons;\n\tspeak: none;\n\tmargin: 1px 0;\n\ttext-align: center;\n\t-webkit-font-smoothing: antialiased !important;\n\twidth: 10px;\n\theight: 100%;\n\tposition: absolute;\n\tright: -15px;\n\ttop: 1px;\n}\n\n.wp-pointer-buttons a.close:hover:before {\n\tcolor: #c00;\n}\n\n/* The arrow base class must take up no space, even with transparent borders. */\n.wp-pointer-arrow,\n.wp-pointer-arrow-inner {\n\tposition: absolute;\n\twidth: 0;\n\theight: 0;\n}\n\n.wp-pointer-arrow {\n\tz-index: 10;\n\twidth: 0;\n\theight: 0;\n\tborder: 0 solid transparent;\n}\n\n.wp-pointer-arrow-inner {\n\tz-index: 20;\n}\n\n/* Make Room for the Arrow! */\n.wp-pointer-top,\n.wp-pointer-undefined {\n\tpadding-top: 13px;\n}\n\n.wp-pointer-bottom {\n\tmargin-top: -13px;\n\tpadding-bottom: 13px;\n}\n\n/* rtl:ignore */\n.wp-pointer-left {\n\tpadding-left: 13px;\n}\n/* rtl:ignore */\n.wp-pointer-right {\n\tmargin-left: -13px;\n\tpadding-right: 13px;\n}\n\n/* Base Size & Positioning */\n.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer-bottom .wp-pointer-arrow,\n.wp-pointer-undefined .wp-pointer-arrow {\n\tright: 50px;\n}\n\n.wp-pointer-left .wp-pointer-arrow,\n.wp-pointer-right .wp-pointer-arrow {\n\ttop: 50%;\n\tmargin-top: -15px;\n}\n\n/* Arrow Sprite */\n.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer-undefined .wp-pointer-arrow {\n\ttop: 0;\n\tborder-width: 0 13px 13px 13px;\n\tborder-bottom-color: #3592b6;\n}\n\n.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer-undefined .wp-pointer-arrow-inner {\n\ttop: 1px;\n\tmargin-right: -13px;\n\tmargin-top: -13px;\n\tborder: 13px solid transparent;\n\tborder-bottom-color: #00a0d2;\n\tdisplay: block;\n\tcontent: \" \";\n}\n\n.wp-pointer-bottom .wp-pointer-arrow {\n\tbottom: 0;\n\tborder-width: 13px 13px 0 13px;\n\tborder-top-color: #ccc;\n}\n\n.wp-pointer-bottom .wp-pointer-arrow-inner {\n\tbottom: 1px;\n\tmargin-right: -13px;\n\tmargin-bottom: -13px;\n\tborder: 13px solid transparent;\n\tborder-top-color: #fff;\n\tdisplay: block;\n\tcontent: \" \";\n}\n\n/* rtl:ignore */\n.wp-pointer-left .wp-pointer-arrow {\n\tleft: 0;\n\tborder-width: 13px 13px 13px 0;\n\tborder-right-color: #ccc;\n}\n\n/* rtl:ignore */\n.wp-pointer-left .wp-pointer-arrow-inner {\n\tleft: 1px;\n\tmargin-left: -13px;\n\tmargin-top: -13px;\n\tborder: 13px solid transparent;\n\tborder-right-color: #fff;\n\tdisplay: block;\n\tcontent: \" \";\n}\n\n/* rtl:ignore */\n.wp-pointer-right .wp-pointer-arrow {\n\tright: 0;\n\tborder-width: 13px 0 13px 13px;\n\tborder-left-color: #ccc;\n}\n\n/* rtl:ignore */\n.wp-pointer-right .wp-pointer-arrow-inner {\n\tright: 1px;\n\tmargin-right: -13px;\n\tmargin-top: -13px;\n\tborder: 13px solid transparent;\n\tborder-left-color: #fff;\n\tdisplay: block;\n\tcontent: \" \";\n}\n\n/* Disable pointers at responsive sizes */\n@media screen and ( max-width: 782px ) {\n\t.wp-pointer {\n\t\tdisplay: none;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/css/wp-pointer.css",
    "content": ".wp-pointer-content {\n\tpadding: 0 0 10px;\n\tposition: relative;\n\tfont-size: 13px;\n\tbackground: #fff;\n\tborder: 1px solid #dfdfdf;\n\t-webkit-box-shadow: 0 3px 6px rgba(0,0,0,0.075);\n\tbox-shadow: 0 3px 6px rgba(0,0,0,0.075);\n}\n\n.wp-pointer-content h3 {\n\tposition: relative;\n\tmargin: -1px -1px 5px;\n\tpadding: 15px 18px 14px 60px;\n\tborder: 1px solid #3592b6;\n\tborder-bottom: none;\n\tline-height: 1.4em;\n\tfont-size: 14px;\n\tcolor: #fff;\n\tbackground: #00a0d2;\n}\n\n.wp-pointer-content h3:before {\n\tbackground: #fff;\n\t-webkit-border-radius: 50%;\n\tborder-radius: 50%;\n\tcolor: #00a0d2;\n\tcontent: \"\\f227\";\n\tfont: normal 20px/1.6 dashicons;\n\tposition: absolute;\n\ttop: 8px;\n\tleft: 15px;\n\tspeak: none;\n\ttext-align: center;\n\twidth: 32px;\n\theight: 32px;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.wp-pointer-content p {\n\tpadding: 0 15px;\n}\n\n.wp-pointer-buttons {\n\tmargin: 0;\n\tpadding: 5px 15px;\n\toverflow: auto;\n}\n\n.wp-pointer-buttons a {\n\tfloat: right;\n\tdisplay: inline-block;\n\ttext-decoration: none;\n}\n\n.wp-pointer-buttons a.close {\n\tpadding-left: 3px;\n\tposition: relative;\n}\n\n.wp-pointer-buttons a.close:before {\n\tbackground: none;\n\tcolor: #b4b9be;\n\tcontent: \"\\f153\";\n\tdisplay: block !important;\n\tfont: normal 16px/1 dashicons;\n\tspeak: none;\n\tmargin: 1px 0;\n\ttext-align: center;\n\t-webkit-font-smoothing: antialiased !important;\n\twidth: 10px;\n\theight: 100%;\n\tposition: absolute;\n\tleft: -15px;\n\ttop: 1px;\n}\n\n.wp-pointer-buttons a.close:hover:before {\n\tcolor: #c00;\n}\n\n/* The arrow base class must take up no space, even with transparent borders. */\n.wp-pointer-arrow,\n.wp-pointer-arrow-inner {\n\tposition: absolute;\n\twidth: 0;\n\theight: 0;\n}\n\n.wp-pointer-arrow {\n\tz-index: 10;\n\twidth: 0;\n\theight: 0;\n\tborder: 0 solid transparent;\n}\n\n.wp-pointer-arrow-inner {\n\tz-index: 20;\n}\n\n/* Make Room for the Arrow! */\n.wp-pointer-top,\n.wp-pointer-undefined {\n\tpadding-top: 13px;\n}\n\n.wp-pointer-bottom {\n\tmargin-top: -13px;\n\tpadding-bottom: 13px;\n}\n\n/* rtl:ignore */\n.wp-pointer-left {\n\tpadding-left: 13px;\n}\n/* rtl:ignore */\n.wp-pointer-right {\n\tmargin-left: -13px;\n\tpadding-right: 13px;\n}\n\n/* Base Size & Positioning */\n.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer-bottom .wp-pointer-arrow,\n.wp-pointer-undefined .wp-pointer-arrow {\n\tleft: 50px;\n}\n\n.wp-pointer-left .wp-pointer-arrow,\n.wp-pointer-right .wp-pointer-arrow {\n\ttop: 50%;\n\tmargin-top: -15px;\n}\n\n/* Arrow Sprite */\n.wp-pointer-top .wp-pointer-arrow,\n.wp-pointer-undefined .wp-pointer-arrow {\n\ttop: 0;\n\tborder-width: 0 13px 13px 13px;\n\tborder-bottom-color: #3592b6;\n}\n\n.wp-pointer-top .wp-pointer-arrow-inner,\n.wp-pointer-undefined .wp-pointer-arrow-inner {\n\ttop: 1px;\n\tmargin-left: -13px;\n\tmargin-top: -13px;\n\tborder: 13px solid transparent;\n\tborder-bottom-color: #00a0d2;\n\tdisplay: block;\n\tcontent: \" \";\n}\n\n.wp-pointer-bottom .wp-pointer-arrow {\n\tbottom: 0;\n\tborder-width: 13px 13px 0 13px;\n\tborder-top-color: #ccc;\n}\n\n.wp-pointer-bottom .wp-pointer-arrow-inner {\n\tbottom: 1px;\n\tmargin-left: -13px;\n\tmargin-bottom: -13px;\n\tborder: 13px solid transparent;\n\tborder-top-color: #fff;\n\tdisplay: block;\n\tcontent: \" \";\n}\n\n/* rtl:ignore */\n.wp-pointer-left .wp-pointer-arrow {\n\tleft: 0;\n\tborder-width: 13px 13px 13px 0;\n\tborder-right-color: #ccc;\n}\n\n/* rtl:ignore */\n.wp-pointer-left .wp-pointer-arrow-inner {\n\tleft: 1px;\n\tmargin-left: -13px;\n\tmargin-top: -13px;\n\tborder: 13px solid transparent;\n\tborder-right-color: #fff;\n\tdisplay: block;\n\tcontent: \" \";\n}\n\n/* rtl:ignore */\n.wp-pointer-right .wp-pointer-arrow {\n\tright: 0;\n\tborder-width: 13px 0 13px 13px;\n\tborder-left-color: #ccc;\n}\n\n/* rtl:ignore */\n.wp-pointer-right .wp-pointer-arrow-inner {\n\tright: 1px;\n\tmargin-right: -13px;\n\tmargin-top: -13px;\n\tborder: 13px solid transparent;\n\tborder-left-color: #fff;\n\tdisplay: block;\n\tcontent: \" \";\n}\n\n/* Disable pointers at responsive sizes */\n@media screen and ( max-width: 782px ) {\n\t.wp-pointer {\n\t\tdisplay: none;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-background-image-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Background_Image_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Background Image Control class.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Image_Control\n */\nclass WP_Customize_Background_Image_Control extends WP_Customize_Image_Control {\n\tpublic $type = 'background';\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.4.0\n\t * @uses WP_Customize_Image_Control::__construct()\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t */\n\tpublic function __construct( $manager ) {\n\t\tparent::__construct( $manager, 'background_image', array(\n\t\t\t'label'    => __( 'Background Image' ),\n\t\t\t'section'  => 'background_image',\n\t\t) );\n\t}\n\n\t/**\n\t * Enqueue control related scripts/styles.\n\t *\n\t * @since 4.1.0\n\t */\n\tpublic function enqueue() {\n\t\tparent::enqueue();\n\n\t\twp_localize_script( 'customize-controls', '_wpCustomizeBackground', array(\n\t\t\t'nonces' => array(\n\t\t\t\t'add' => wp_create_nonce( 'background-add' ),\n\t\t\t),\n\t\t) );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-background-image-setting.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Background_Image_Setting class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customizer Background Image Setting class.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Setting\n */\nfinal class WP_Customize_Background_Image_Setting extends WP_Customize_Setting {\n\tpublic $id = 'background_image_thumb';\n\n\t/**\n\t * @since 3.4.0\n\t *\n\t * @param $value\n\t */\n\tpublic function update( $value ) {\n\t\tremove_theme_mod( 'background_image_thumb' );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-color-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Color_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Color Control class.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Customize_Color_Control extends WP_Customize_Control {\n\t/**\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'color';\n\n\t/**\n\t * @access public\n\t * @var array\n\t */\n\tpublic $statuses;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.4.0\n\t * @uses WP_Customize_Control::__construct()\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t * @param string               $id      Control ID.\n\t * @param array                $args    Optional. Arguments to override class property defaults.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\t$this->statuses = array( '' => __('Default') );\n\t\tparent::__construct( $manager, $id, $args );\n\t}\n\n\t/**\n\t * Enqueue scripts/styles for the color picker.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function enqueue() {\n\t\twp_enqueue_script( 'wp-color-picker' );\n\t\twp_enqueue_style( 'wp-color-picker' );\n\t}\n\n\t/**\n\t * Refresh the parameters passed to the JavaScript via JSON.\n\t *\n\t * @since 3.4.0\n\t * @uses WP_Customize_Control::to_json()\n\t */\n\tpublic function to_json() {\n\t\tparent::to_json();\n\t\t$this->json['statuses'] = $this->statuses;\n\t\t$this->json['defaultValue'] = $this->setting->default;\n\t}\n\n\t/**\n\t * Don't render the control content from PHP, as it's rendered via JS on load.\n\t *\n\t * @since 3.4.0\n\t */\n\tpublic function render_content() {}\n\n\t/**\n\t * Render a JS template for the content of the color picker control.\n\t *\n\t * @since 4.1.0\n\t */\n\tpublic function content_template() {\n\t\t?>\n\t\t<# var defaultValue = '';\n\t\tif ( data.defaultValue ) {\n\t\t\tif ( '#' !== data.defaultValue.substring( 0, 1 ) ) {\n\t\t\t\tdefaultValue = '#' + data.defaultValue;\n\t\t\t} else {\n\t\t\t\tdefaultValue = data.defaultValue;\n\t\t\t}\n\t\t\tdefaultValue = ' data-default-color=' + defaultValue; // Quotes added automatically.\n\t\t} #>\n\t\t<label>\n\t\t\t<# if ( data.label ) { #>\n\t\t\t\t<span class=\"customize-control-title\">{{{ data.label }}}</span>\n\t\t\t<# } #>\n\t\t\t<# if ( data.description ) { #>\n\t\t\t\t<span class=\"description customize-control-description\">{{{ data.description }}}</span>\n\t\t\t<# } #>\n\t\t\t<div class=\"customize-control-content\">\n\t\t\t\t<input class=\"color-picker-hex\" type=\"text\" maxlength=\"7\" placeholder=\"<?php esc_attr_e( 'Hex Value' ); ?>\" {{ defaultValue }} />\n\t\t\t</div>\n\t\t</label>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-cropped-image-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Cropped_Image_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Cropped Image Control class.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Image_Control\n */\nclass WP_Customize_Cropped_Image_Control extends WP_Customize_Image_Control {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'cropped_image';\n\n\t/**\n\t * Suggested width for cropped image.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $width = 150;\n\n\t/**\n\t * Suggested height for cropped image.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $height = 150;\n\n\t/**\n\t * Whether the width is flexible.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $flex_width = false;\n\n\t/**\n\t * Whether the height is flexible.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $flex_height = false;\n\n\t/**\n\t * Enqueue control related scripts/styles.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function enqueue() {\n\t\twp_enqueue_script( 'customize-views' );\n\n\t\tparent::enqueue();\n\t}\n\n\t/**\n\t * Refresh the parameters passed to the JavaScript via JSON.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Control::to_json()\n\t */\n\tpublic function to_json() {\n\t\tparent::to_json();\n\n\t\t$this->json['width']       = absint( $this->width );\n\t\t$this->json['height']      = absint( $this->height );\n\t\t$this->json['flex_width']  = absint( $this->flex_width );\n\t\t$this->json['flex_height'] = absint( $this->flex_height );\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-filter-setting.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Filter_Setting class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * A setting that is used to filter a value, but will not save the results.\n *\n * Results should be properly handled using another setting or callback.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Setting\n */\nclass WP_Customize_Filter_Setting extends WP_Customize_Setting {\n\n\t/**\n\t * @since 3.4.0\n\t */\n\tpublic function update( $value ) {}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-header-image-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Header_Image_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Header Image Control class.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Image_Control\n */\nclass WP_Customize_Header_Image_Control extends WP_Customize_Image_Control {\n\tpublic $type = 'header';\n\tpublic $uploaded_headers;\n\tpublic $default_headers;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t */\n\tpublic function __construct( $manager ) {\n\t\tparent::__construct( $manager, 'header_image', array(\n\t\t\t'label'    => __( 'Header Image' ),\n\t\t\t'settings' => array(\n\t\t\t\t'default' => 'header_image',\n\t\t\t\t'data'    => 'header_image_data',\n\t\t\t),\n\t\t\t'section'  => 'header_image',\n\t\t\t'removed'  => 'remove-header',\n\t\t\t'get_url'  => 'get_header_image',\n\t\t) );\n\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function enqueue() {\n\t\twp_enqueue_media();\n\t\twp_enqueue_script( 'customize-views' );\n\n\t\t$this->prepare_control();\n\n\t\twp_localize_script( 'customize-views', '_wpCustomizeHeader', array(\n\t\t\t'data' => array(\n\t\t\t\t'width' => absint( get_theme_support( 'custom-header', 'width' ) ),\n\t\t\t\t'height' => absint( get_theme_support( 'custom-header', 'height' ) ),\n\t\t\t\t'flex-width' => absint( get_theme_support( 'custom-header', 'flex-width' ) ),\n\t\t\t\t'flex-height' => absint( get_theme_support( 'custom-header', 'flex-height' ) ),\n\t\t\t\t'currentImgSrc' => $this->get_current_image_src(),\n\t\t\t),\n\t\t\t'nonces' => array(\n\t\t\t\t'add' => wp_create_nonce( 'header-add' ),\n\t\t\t\t'remove' => wp_create_nonce( 'header-remove' ),\n\t\t\t),\n\t\t\t'uploads' => $this->uploaded_headers,\n\t\t\t'defaults' => $this->default_headers\n\t\t) );\n\n\t\tparent::enqueue();\n\t}\n\n\t/**\n\t *\n\t * @global Custom_Image_Header $custom_image_header\n\t */\n\tpublic function prepare_control() {\n\t\tglobal $custom_image_header;\n\t\tif ( empty( $custom_image_header ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Process default headers and uploaded headers.\n\t\t$custom_image_header->process_default_headers();\n\t\t$this->default_headers = $custom_image_header->get_default_header_images();\n\t\t$this->uploaded_headers = $custom_image_header->get_uploaded_header_images();\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function print_header_image_template() {\n\t\t?>\n\t\t<script type=\"text/template\" id=\"tmpl-header-choice\">\n\t\t\t<# if (data.random) { #>\n\t\t\t<button type=\"button\" class=\"button display-options random\">\n\t\t\t\t<span class=\"dashicons dashicons-randomize dice\"></span>\n\t\t\t\t<# if ( data.type === 'uploaded' ) { #>\n\t\t\t\t\t<?php _e( 'Randomize uploaded headers' ); ?>\n\t\t\t\t<# } else if ( data.type === 'default' ) { #>\n\t\t\t\t\t<?php _e( 'Randomize suggested headers' ); ?>\n\t\t\t\t<# } #>\n\t\t\t</button>\n\n\t\t\t<# } else { #>\n\n\t\t\t<# if (data.type === 'uploaded') { #>\n\t\t\t\t<button type=\"button\" class=\"dashicons dashicons-no close\"><span class=\"screen-reader-text\"><?php _e( 'Remove image' ); ?></span></button>\n\t\t\t<# } #>\n\n\t\t\t<button type=\"button\" class=\"choice thumbnail\"\n\t\t\t\tdata-customize-image-value=\"{{{data.header.url}}}\"\n\t\t\t\tdata-customize-header-image-data=\"{{JSON.stringify(data.header)}}\">\n\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Set image' ); ?></span>\n\t\t\t\t<img src=\"{{{data.header.thumbnail_url}}}\" alt=\"{{{data.header.alt_text || data.header.description}}}\">\n\t\t\t</button>\n\n\t\t\t<# } #>\n\t\t</script>\n\n\t\t<script type=\"text/template\" id=\"tmpl-header-current\">\n\t\t\t<# if (data.choice) { #>\n\t\t\t\t<# if (data.random) { #>\n\n\t\t\t<div class=\"placeholder\">\n\t\t\t\t<div class=\"inner\">\n\t\t\t\t\t<span><span class=\"dashicons dashicons-randomize dice\"></span>\n\t\t\t\t\t<# if ( data.type === 'uploaded' ) { #>\n\t\t\t\t\t\t<?php _e( 'Randomizing uploaded headers' ); ?>\n\t\t\t\t\t<# } else if ( data.type === 'default' ) { #>\n\t\t\t\t\t\t<?php _e( 'Randomizing suggested headers' ); ?>\n\t\t\t\t\t<# } #>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t\t<# } else { #>\n\n\t\t\t<img src=\"{{{data.header.thumbnail_url}}}\" alt=\"{{{data.header.alt_text || data.header.description}}}\" tabindex=\"0\"/>\n\n\t\t\t\t<# } #>\n\t\t\t<# } else { #>\n\n\t\t\t<div class=\"placeholder\">\n\t\t\t\t<div class=\"inner\">\n\t\t\t\t\t<span>\n\t\t\t\t\t\t<?php _e( 'No image set' ); ?>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<# } #>\n\t\t</script>\n\t\t<?php\n\t}\n\n\t/**\n\t * @return string|void\n\t */\n\tpublic function get_current_image_src() {\n\t\t$src = $this->value();\n\t\tif ( isset( $this->get_url ) ) {\n\t\t\t$src = call_user_func( $this->get_url, $src );\n\t\t\treturn $src;\n\t\t}\n\t}\n\n\t/**\n\t * @access public\n\t */\n\tpublic function render_content() {\n\t\t$this->print_header_image_template();\n\t\t$visibility = $this->get_current_image_src() ? '' : ' style=\"display:none\" ';\n\t\t$width = absint( get_theme_support( 'custom-header', 'width' ) );\n\t\t$height = absint( get_theme_support( 'custom-header', 'height' ) );\n\t\t?>\n\t\t<div class=\"customize-control-content\">\n\t\t\t<p class=\"customizer-section-intro\">\n\t\t\t\t<?php\n\t\t\t\tif ( $width && $height ) {\n\t\t\t\t\tprintf( __( 'While you can crop images to your liking after clicking <strong>Add new image</strong>, your theme recommends a header size of <strong>%s &times; %s</strong> pixels.' ), $width, $height );\n\t\t\t\t} elseif ( $width ) {\n\t\t\t\t\tprintf( __( 'While you can crop images to your liking after clicking <strong>Add new image</strong>, your theme recommends a header width of <strong>%s</strong> pixels.' ), $width );\n\t\t\t\t} else {\n\t\t\t\t\tprintf( __( 'While you can crop images to your liking after clicking <strong>Add new image</strong>, your theme recommends a header height of <strong>%s</strong> pixels.' ), $height );\n\t\t\t\t}\n\t\t\t\t?>\n\t\t\t</p>\n\t\t\t<div class=\"current\">\n\t\t\t\t<label for=\"header_image-button\">\n\t\t\t\t\t<span class=\"customize-control-title\">\n\t\t\t\t\t\t<?php _e( 'Current header' ); ?>\n\t\t\t\t\t</span>\n\t\t\t\t</label>\n\t\t\t\t<div class=\"container\">\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"actions\">\n\t\t\t\t<?php if ( current_user_can( 'upload_files' ) ): ?>\n\t\t\t\t<button type=\"button\"<?php echo $visibility; ?> class=\"button remove\" aria-label=\"<?php esc_attr_e( 'Hide header image' ); ?>\"><?php _e( 'Hide image' ); ?></button>\n\t\t\t\t<button type=\"button\" class=\"button new\" id=\"header_image-button\"  aria-label=\"<?php esc_attr_e( 'Add new header image' ); ?>\"><?php _e( 'Add new image' ); ?></button>\n\t\t\t\t<div style=\"clear:both\"></div>\n\t\t\t\t<?php endif; ?>\n\t\t\t</div>\n\t\t\t<div class=\"choices\">\n\t\t\t\t<span class=\"customize-control-title header-previously-uploaded\">\n\t\t\t\t\t<?php _ex( 'Previously uploaded', 'custom headers' ); ?>\n\t\t\t\t</span>\n\t\t\t\t<div class=\"uploaded\">\n\t\t\t\t\t<div class=\"list\">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<span class=\"customize-control-title header-default\">\n\t\t\t\t\t<?php _ex( 'Suggested', 'custom headers' ); ?>\n\t\t\t\t</span>\n\t\t\t\t<div class=\"default\">\n\t\t\t\t\t<div class=\"list\">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-header-image-setting.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Header_Image_Setting class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * A setting that is used to filter a value, but will not save the results.\n *\n * Results should be properly handled using another setting or callback.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Setting\n */\nfinal class WP_Customize_Header_Image_Setting extends WP_Customize_Setting {\n\tpublic $id = 'header_image_data';\n\n\t/**\n\t * @since 3.4.0\n\t *\n\t * @global Custom_Image_Header $custom_image_header\n\t *\n\t * @param $value\n\t */\n\tpublic function update( $value ) {\n\t\tglobal $custom_image_header;\n\n\t\t// If the value doesn't exist (removed or random),\n\t\t// use the header_image value.\n\t\tif ( ! $value )\n\t\t\t$value = $this->manager->get_setting('header_image')->post_value();\n\n\t\tif ( is_array( $value ) && isset( $value['choice'] ) )\n\t\t\t$custom_image_header->set_header_image( $value['choice'] );\n\t\telse\n\t\t\t$custom_image_header->set_header_image( $value );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-image-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Image_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Image Control class.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Upload_Control\n */\nclass WP_Customize_Image_Control extends WP_Customize_Upload_Control {\n\tpublic $type = 'image';\n\tpublic $mime_type = 'image';\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.4.0\n\t * @uses WP_Customize_Upload_Control::__construct()\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t * @param string               $id      Control ID.\n\t * @param array                $args    Optional. Arguments to override class property defaults.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\tparent::__construct( $manager, $id, $args );\n\n\t\t$this->button_labels = array(\n\t\t\t'select'       => __( 'Select Image' ),\n\t\t\t'change'       => __( 'Change Image' ),\n\t\t\t'remove'       => __( 'Remove' ),\n\t\t\t'default'      => __( 'Default' ),\n\t\t\t'placeholder'  => __( 'No image selected' ),\n\t\t\t'frame_title'  => __( 'Select Image' ),\n\t\t\t'frame_button' => __( 'Choose Image' ),\n\t\t);\n\t}\n\n\t/**\n\t * @since 3.4.2\n\t * @deprecated 4.1.0\n\t */\n\tpublic function prepare_control() {}\n\n\t/**\n\t * @since 3.4.0\n\t * @deprecated 4.1.0\n\t *\n\t * @param string $id\n\t * @param string $label\n\t * @param mixed $callback\n\t */\n\tpublic function add_tab( $id, $label, $callback ) {}\n\n\t/**\n\t * @since 3.4.0\n\t * @deprecated 4.1.0\n\t *\n\t * @param string $id\n\t */\n\tpublic function remove_tab( $id ) {}\n\n\t/**\n\t * @since 3.4.0\n\t * @deprecated 4.1.0\n\t *\n\t * @param string $url\n\t * @param string $thumbnail_url\n\t */\n\tpublic function print_tab_image( $url, $thumbnail_url = null ) {}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-media-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Media_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Media Control class.\n *\n * @since 4.2.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Customize_Media_Control extends WP_Customize_Control {\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'media';\n\n\t/**\n\t * Media control mime type.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $mime_type = '';\n\n\t/**\n\t * Button labels.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $button_labels = array();\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 4.1.0\n\t * @since 4.2.0 Moved from WP_Customize_Upload_Control.\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t * @param string               $id      Control ID.\n\t * @param array                $args    Optional. Arguments to override class property defaults.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\tparent::__construct( $manager, $id, $args );\n\n\t\t$this->button_labels = array(\n\t\t\t'select'       => __( 'Select File' ),\n\t\t\t'change'       => __( 'Change File' ),\n\t\t\t'default'      => __( 'Default' ),\n\t\t\t'remove'       => __( 'Remove' ),\n\t\t\t'placeholder'  => __( 'No file selected' ),\n\t\t\t'frame_title'  => __( 'Select File' ),\n\t\t\t'frame_button' => __( 'Choose File' ),\n\t\t);\n\t}\n\n\t/**\n\t * Enqueue control related scripts/styles.\n\t *\n\t * @since 3.4.0\n\t * @since 4.2.0 Moved from WP_Customize_Upload_Control.\n\t */\n\tpublic function enqueue() {\n\t\twp_enqueue_media();\n\t}\n\n\t/**\n\t * Refresh the parameters passed to the JavaScript via JSON.\n\t *\n\t * @since 3.4.0\n\t * @since 4.2.0 Moved from WP_Customize_Upload_Control.\n\t *\n\t * @see WP_Customize_Control::to_json()\n\t */\n\tpublic function to_json() {\n\t\tparent::to_json();\n\t\t$this->json['label'] = html_entity_decode( $this->label, ENT_QUOTES, get_bloginfo( 'charset' ) );\n\t\t$this->json['mime_type'] = $this->mime_type;\n\t\t$this->json['button_labels'] = $this->button_labels;\n\t\t$this->json['canUpload'] = current_user_can( 'upload_files' );\n\n\t\t$value = $this->value();\n\n\t\tif ( is_object( $this->setting ) ) {\n\t\t\tif ( $this->setting->default ) {\n\t\t\t\t// Fake an attachment model - needs all fields used by template.\n\t\t\t\t// Note that the default value must be a URL, NOT an attachment ID.\n\t\t\t\t$type = in_array( substr( $this->setting->default, -3 ), array( 'jpg', 'png', 'gif', 'bmp' ) ) ? 'image' : 'document';\n\t\t\t\t$default_attachment = array(\n\t\t\t\t\t'id' => 1,\n\t\t\t\t\t'url' => $this->setting->default,\n\t\t\t\t\t'type' => $type,\n\t\t\t\t\t'icon' => wp_mime_type_icon( $type ),\n\t\t\t\t\t'title' => basename( $this->setting->default ),\n\t\t\t\t);\n\n\t\t\t\tif ( 'image' === $type ) {\n\t\t\t\t\t$default_attachment['sizes'] = array(\n\t\t\t\t\t\t'full' => array( 'url' => $this->setting->default ),\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t$this->json['defaultAttachment'] = $default_attachment;\n\t\t\t}\n\n\t\t\tif ( $value && $this->setting->default && $value === $this->setting->default ) {\n\t\t\t\t// Set the default as the attachment.\n\t\t\t\t$this->json['attachment'] = $this->json['defaultAttachment'];\n\t\t\t} elseif ( $value ) {\n\t\t\t\t$this->json['attachment'] = wp_prepare_attachment_for_js( $value );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Don't render any content for this control from PHP.\n\t *\n\t * @since 3.4.0\n\t * @since 4.2.0 Moved from WP_Customize_Upload_Control.\n\t *\n\t * @see WP_Customize_Media_Control::content_template()\n\t */\n\tpublic function render_content() {}\n\n\t/**\n\t * Render a JS template for the content of the media control.\n\t *\n\t * @since 4.1.0\n\t * @since 4.2.0 Moved from WP_Customize_Upload_Control.\n\t */\n\tpublic function content_template() {\n\t\t?>\n\t\t<label for=\"{{ data.settings['default'] }}-button\">\n\t\t\t<# if ( data.label ) { #>\n\t\t\t\t<span class=\"customize-control-title\">{{ data.label }}</span>\n\t\t\t<# } #>\n\t\t\t<# if ( data.description ) { #>\n\t\t\t\t<span class=\"description customize-control-description\">{{{ data.description }}}</span>\n\t\t\t<# } #>\n\t\t</label>\n\n\t\t<# if ( data.attachment && data.attachment.id ) { #>\n\t\t\t<div class=\"current\">\n\t\t\t\t<div class=\"container\">\n\t\t\t\t\t<div class=\"attachment-media-view attachment-media-view-{{ data.attachment.type }} {{ data.attachment.orientation }}\">\n\t\t\t\t\t\t<div class=\"thumbnail thumbnail-{{ data.attachment.type }}\">\n\t\t\t\t\t\t\t<# if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.medium ) { #>\n\t\t\t\t\t\t\t\t<img class=\"attachment-thumb\" src=\"{{ data.attachment.sizes.medium.url }}\" draggable=\"false\" alt=\"\" />\n\t\t\t\t\t\t\t<# } else if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.full ) { #>\n\t\t\t\t\t\t\t\t<img class=\"attachment-thumb\" src=\"{{ data.attachment.sizes.full.url }}\" draggable=\"false\" alt=\"\" />\n\t\t\t\t\t\t\t<# } else if ( 'audio' === data.attachment.type ) { #>\n\t\t\t\t\t\t\t\t<# if ( data.attachment.image && data.attachment.image.src && data.attachment.image.src !== data.attachment.icon ) { #>\n\t\t\t\t\t\t\t\t\t<img src=\"{{ data.attachment.image.src }}\" class=\"thumbnail\" draggable=\"false\" alt=\"\" />\n\t\t\t\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t\t\t\t<img src=\"{{ data.attachment.icon }}\" class=\"attachment-thumb type-icon\" draggable=\"false\" alt=\"\" />\n\t\t\t\t\t\t\t\t<# } #>\n\t\t\t\t\t\t\t\t<p class=\"attachment-meta attachment-meta-title\">&#8220;{{ data.attachment.title }}&#8221;</p>\n\t\t\t\t\t\t\t\t<# if ( data.attachment.album || data.attachment.meta.album ) { #>\n\t\t\t\t\t\t\t\t<p class=\"attachment-meta\"><em>{{ data.attachment.album || data.attachment.meta.album }}</em></p>\n\t\t\t\t\t\t\t\t<# } #>\n\t\t\t\t\t\t\t\t<# if ( data.attachment.artist || data.attachment.meta.artist ) { #>\n\t\t\t\t\t\t\t\t<p class=\"attachment-meta\">{{ data.attachment.artist || data.attachment.meta.artist }}</p>\n\t\t\t\t\t\t\t\t<# } #>\n\t\t\t\t\t\t\t\t<audio style=\"visibility: hidden\" controls class=\"wp-audio-shortcode\" width=\"100%\" preload=\"none\">\n\t\t\t\t\t\t\t\t\t<source type=\"{{ data.attachment.mime }}\" src=\"{{ data.attachment.url }}\"/>\n\t\t\t\t\t\t\t\t</audio>\n\t\t\t\t\t\t\t<# } else if ( 'video' === data.attachment.type ) { #>\n\t\t\t\t\t\t\t\t<div class=\"wp-media-wrapper wp-video\">\n\t\t\t\t\t\t\t\t\t<video controls=\"controls\" class=\"wp-video-shortcode\" preload=\"metadata\"\n\t\t\t\t\t\t\t\t\t\t<# if ( data.attachment.image && data.attachment.image.src !== data.attachment.icon ) { #>poster=\"{{ data.attachment.image.src }}\"<# } #>>\n\t\t\t\t\t\t\t\t\t\t<source type=\"{{ data.attachment.mime }}\" src=\"{{ data.attachment.url }}\"/>\n\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t\t\t<img class=\"attachment-thumb type-icon icon\" src=\"{{ data.attachment.icon }}\" draggable=\"false\" alt=\"\" />\n\t\t\t\t\t\t\t\t<p class=\"attachment-title\">{{ data.attachment.title }}</p>\n\t\t\t\t\t\t\t<# } #>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"actions\">\n\t\t\t\t<# if ( data.canUpload ) { #>\n\t\t\t\t<button type=\"button\" class=\"button remove-button\"><?php echo $this->button_labels['remove']; ?></button>\n\t\t\t\t<button type=\"button\" class=\"button upload-button\" id=\"{{ data.settings['default'] }}-button\"><?php echo $this->button_labels['change']; ?></button>\n\t\t\t\t<div style=\"clear:both\"></div>\n\t\t\t\t<# } #>\n\t\t\t</div>\n\t\t<# } else { #>\n\t\t\t<div class=\"current\">\n\t\t\t\t<div class=\"container\">\n\t\t\t\t\t<div class=\"placeholder\">\n\t\t\t\t\t\t<div class=\"inner\">\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<?php echo $this->button_labels['placeholder']; ?>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"actions\">\n\t\t\t\t<# if ( data.defaultAttachment ) { #>\n\t\t\t\t\t<button type=\"button\" class=\"button default-button\"><?php echo $this->button_labels['default']; ?></button>\n\t\t\t\t<# } #>\n\t\t\t\t<# if ( data.canUpload ) { #>\n\t\t\t\t<button type=\"button\" class=\"button upload-button\" id=\"{{ data.settings['default'] }}-button\"><?php echo $this->button_labels['select']; ?></button>\n\t\t\t\t<# } #>\n\t\t\t\t<div style=\"clear:both\"></div>\n\t\t\t</div>\n\t\t<# } #>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menu-auto-add-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menu_Auto_Add_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize control to represent the auto_add field for a given menu.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Customize_Nav_Menu_Auto_Add_Control extends WP_Customize_Control {\n\n\t/**\n\t * Type of control, used by JS.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'nav_menu_auto_add';\n\n\t/**\n\t * No-op since we're using JS template.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t */\n\tprotected function render_content() {}\n\n\t/**\n\t * Render the Underscore template for this control.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t */\n\tprotected function content_template() {\n\t\t?>\n\t\t<span class=\"customize-control-title\"><?php _e( 'Menu options' ); ?></span>\n\t\t<label>\n\t\t\t<input type=\"checkbox\" class=\"auto_add\" />\n\t\t\t<?php _e( 'Automatically add new top-level pages to this menu' ); ?>\n\t\t</label>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menu-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menu_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Nav Menu Control Class.\n *\n * @since 4.3.0\n */\nclass WP_Customize_Nav_Menu_Control extends WP_Customize_Control {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'nav_menu';\n\n\t/**\n\t * The nav menu setting.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var WP_Customize_Nav_Menu_Setting\n\t */\n\tpublic $setting;\n\n\t/**\n\t * Don't render the control's content - it uses a JS template instead.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function render_content() {}\n\n\t/**\n\t * JS/Underscore template for the control UI.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function content_template() {\n\t\t?>\n\t\t<button type=\"button\" class=\"button-secondary add-new-menu-item\" aria-label=\"<?php esc_attr_e( 'Add or remove menu items' ); ?>\" aria-expanded=\"false\" aria-controls=\"available-menu-items\">\n\t\t\t<?php _e( 'Add Items' ); ?>\n\t\t</button>\n\t\t<button type=\"button\" class=\"button-link reorder-toggle\" aria-label=\"<?php esc_attr_e( 'Reorder menu items' ); ?>\" aria-describedby=\"reorder-items-desc-{{ data.menu_id }}\">\n\t\t\t<span class=\"reorder\"><?php _ex( 'Reorder', 'Reorder menu items in Customizer' ); ?></span>\n\t\t\t<span class=\"reorder-done\"><?php _ex( 'Done', 'Cancel reordering menu items in Customizer' ); ?></span>\n\t\t</button>\n\t\t<p class=\"screen-reader-text\" id=\"reorder-items-desc-{{ data.menu_id }}\"><?php _e( 'When in reorder mode, additional controls to reorder menu items will be available in the items list above.' ); ?></p>\n\t\t<span class=\"menu-delete-item\">\n\t\t\t<button type=\"button\" class=\"button-link menu-delete\">\n\t\t\t\t<?php _e( 'Delete Menu' ); ?>\n\t\t\t</button>\n\t\t</span>\n\t\t<?php if ( current_theme_supports( 'menus' ) ) : ?>\n\t\t<ul class=\"menu-settings\">\n\t\t\t<li class=\"customize-control\">\n\t\t\t\t<span class=\"customize-control-title\"><?php _e( 'Menu locations' ); ?></span>\n\t\t\t</li>\n\n\t\t\t<?php foreach ( get_registered_nav_menus() as $location => $description ) : ?>\n\t\t\t<li class=\"customize-control customize-control-checkbox assigned-menu-location\">\n\t\t\t\t<label>\n\t\t\t\t\t<input type=\"checkbox\" data-menu-id=\"{{ data.menu_id }}\" data-location-id=\"<?php echo esc_attr( $location ); ?>\" class=\"menu-location\" /> <?php echo $description; ?>\n\t\t\t\t\t<span class=\"theme-location-set\"><?php\n\t\t\t\t\t\t/* translators: %s: menu name */\n\t\t\t\t\t\tprintf( _x( '(Current: %s)', 'menu location' ),\n\t\t\t\t\t\t\t'<span class=\"current-menu-location-name-' . esc_attr( $location ) . '\"></span>'\n\t\t\t\t\t\t);\n\t\t\t\t\t?></span>\n\t\t\t\t</label>\n\t\t\t</li>\n\t\t\t<?php endforeach; ?>\n\n\t\t</ul>\n\t\t<?php endif;\n\t}\n\n\t/**\n\t * Return parameters for this control.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @return array Exported parameters.\n\t */\n\tpublic function json() {\n\t\t$exported            = parent::json();\n\t\t$exported['menu_id'] = $this->setting->term_id;\n\n\t\treturn $exported;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menu-item-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menu_Item_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize control to represent the name field for a given menu.\n *\n * @since 4.3.0\n */\nclass WP_Customize_Nav_Menu_Item_Control extends WP_Customize_Control {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'nav_menu_item';\n\n\t/**\n\t * The nav menu item setting.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var WP_Customize_Nav_Menu_Item_Setting\n\t */\n\tpublic $setting;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Control::__construct()\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t * @param string               $id      The control ID.\n\t * @param array                $args    Optional. Overrides class property defaults.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\tparent::__construct( $manager, $id, $args );\n\t}\n\n\t/**\n\t * Don't render the control's content - it's rendered with a JS template.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function render_content() {}\n\n\t/**\n\t * JS/Underscore template for the control UI.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function content_template() {\n\t\t?>\n\t\t<div class=\"menu-item-bar\">\n\t\t\t<div class=\"menu-item-handle\">\n\t\t\t\t<span class=\"item-type\" aria-hidden=\"true\">{{ data.item_type_label }}</span>\n\t\t\t\t<span class=\"item-title\" aria-hidden=\"true\">\n\t\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t\t<span class=\"menu-item-title<# if ( ! data.title ) { #> no-title<# } #>\">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span>\n\t\t\t\t</span>\n\t\t\t\t<span class=\"item-controls\">\n\t\t\t\t\t<button type=\"button\" class=\"button-link item-edit\" aria-expanded=\"false\"><span class=\"screen-reader-text\"><?php\n\t\t\t\t\t\t/* translators: 1: Title of a menu item, 2: Type of a menu item */\n\t\t\t\t\t\tprintf( __( 'Edit menu item: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.item_type_label }}' );\n\t\t\t\t\t?></span><span class=\"toggle-indicator\" aria-hidden=\"true\"></span></button>\n\t\t\t\t\t<button type=\"button\" class=\"button-link item-delete submitdelete deletion\"><span class=\"screen-reader-text\"><?php\n\t\t\t\t\t\t/* translators: 1: Title of a menu item, 2: Type of a menu item */\n\t\t\t\t\t\tprintf( __( 'Remove Menu Item: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.item_type_label }}' );\n\t\t\t\t\t?></span></button>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"menu-item-settings\" id=\"menu-item-settings-{{ data.menu_item_id }}\">\n\t\t\t<# if ( 'custom' === data.item_type ) { #>\n\t\t\t<p class=\"field-url description description-thin\">\n\t\t\t\t<label for=\"edit-menu-item-url-{{ data.menu_item_id }}\">\n\t\t\t\t\t<?php _e( 'URL' ); ?><br />\n\t\t\t\t\t<input class=\"widefat code edit-menu-item-url\" type=\"text\" id=\"edit-menu-item-url-{{ data.menu_item_id }}\" name=\"menu-item-url\" />\n\t\t\t\t</label>\n\t\t\t</p>\n\t\t<# } #>\n\t\t\t<p class=\"description description-thin\">\n\t\t\t\t<label for=\"edit-menu-item-title-{{ data.menu_item_id }}\">\n\t\t\t\t\t<?php _e( 'Navigation Label' ); ?><br />\n\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-title-{{ data.menu_item_id }}\" class=\"widefat edit-menu-item-title\" name=\"menu-item-title\" />\n\t\t\t\t</label>\n\t\t\t</p>\n\t\t\t<p class=\"field-link-target description description-thin\">\n\t\t\t\t<label for=\"edit-menu-item-target-{{ data.menu_item_id }}\">\n\t\t\t\t\t<input type=\"checkbox\" id=\"edit-menu-item-target-{{ data.menu_item_id }}\" class=\"edit-menu-item-target\" value=\"_blank\" name=\"menu-item-target\" />\n\t\t\t\t\t<?php _e( 'Open link in a new tab' ); ?>\n\t\t\t\t</label>\n\t\t\t</p>\n\t\t\t<p class=\"field-attr-title description description-thin\">\n\t\t\t\t<label for=\"edit-menu-item-attr-title-{{ data.menu_item_id }}\">\n\t\t\t\t\t<?php _e( 'Title Attribute' ); ?><br />\n\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-attr-title-{{ data.menu_item_id }}\" class=\"widefat edit-menu-item-attr-title\" name=\"menu-item-attr-title\" />\n\t\t\t\t</label>\n\t\t\t</p>\n\t\t\t<p class=\"field-css-classes description description-thin\">\n\t\t\t\t<label for=\"edit-menu-item-classes-{{ data.menu_item_id }}\">\n\t\t\t\t\t<?php _e( 'CSS Classes' ); ?><br />\n\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-classes-{{ data.menu_item_id }}\" class=\"widefat code edit-menu-item-classes\" name=\"menu-item-classes\" />\n\t\t\t\t</label>\n\t\t\t</p>\n\t\t\t<p class=\"field-xfn description description-thin\">\n\t\t\t\t<label for=\"edit-menu-item-xfn-{{ data.menu_item_id }}\">\n\t\t\t\t\t<?php _e( 'Link Relationship (XFN)' ); ?><br />\n\t\t\t\t\t<input type=\"text\" id=\"edit-menu-item-xfn-{{ data.menu_item_id }}\" class=\"widefat code edit-menu-item-xfn\" name=\"menu-item-xfn\" />\n\t\t\t\t</label>\n\t\t\t</p>\n\t\t\t<p class=\"field-description description description-thin\">\n\t\t\t\t<label for=\"edit-menu-item-description-{{ data.menu_item_id }}\">\n\t\t\t\t\t<?php _e( 'Description' ); ?><br />\n\t\t\t\t\t<textarea id=\"edit-menu-item-description-{{ data.menu_item_id }}\" class=\"widefat edit-menu-item-description\" rows=\"3\" cols=\"20\" name=\"menu-item-description\">{{ data.description }}</textarea>\n\t\t\t\t\t<span class=\"description\"><?php _e( 'The description will be displayed in the menu if the current theme supports it.' ); ?></span>\n\t\t\t\t</label>\n\t\t\t</p>\n\n\t\t\t<div class=\"menu-item-actions description-thin submitbox\">\n\t\t\t\t<# if ( ( 'post_type' === data.item_type || 'taxonomy' === data.item_type ) && '' !== data.original_title ) { #>\n\t\t\t\t<p class=\"link-to-original\">\n\t\t\t\t\t<?php printf( __( 'Original: %s' ), '<a class=\"original-link\" href=\"{{ data.url }}\">{{ data.original_title }}</a>' ); ?>\n\t\t\t\t</p>\n\t\t\t\t<# } #>\n\n\t\t\t\t<button type=\"button\" class=\"button-link item-delete submitdelete deletion\"><?php _e( 'Remove' ); ?></button>\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t</div>\n\t\t\t<input type=\"hidden\" name=\"menu-item-db-id[{{ data.menu_item_id }}]\" class=\"menu-item-data-db-id\" value=\"{{ data.menu_item_id }}\" />\n\t\t\t<input type=\"hidden\" name=\"menu-item-parent-id[{{ data.menu_item_id }}]\" class=\"menu-item-data-parent-id\" value=\"{{ data.parent }}\" />\n\t\t</div><!-- .menu-item-settings-->\n\t\t<ul class=\"menu-item-transport\"></ul>\n\t\t<?php\n\t}\n\n\t/**\n\t * Return parameters for this control.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @return array Exported parameters.\n\t */\n\tpublic function json() {\n\t\t$exported                 = parent::json();\n\t\t$exported['menu_item_id'] = $this->setting->post_id;\n\n\t\treturn $exported;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menu_Item_Setting class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Setting to represent a nav_menu.\n *\n * Subclass of WP_Customize_Setting to represent a nav_menu taxonomy term, and\n * the IDs for the nav_menu_items associated with the nav menu.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Setting\n */\nclass WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting {\n\n\tconst ID_PATTERN = '/^nav_menu_item\\[(?P<id>-?\\d+)\\]$/';\n\n\tconst POST_TYPE = 'nav_menu_item';\n\n\tconst TYPE = 'nav_menu_item';\n\n\t/**\n\t * Setting type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = self::TYPE;\n\n\t/**\n\t * Default setting value.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var array\n\t *\n\t * @see wp_setup_nav_menu_item()\n\t */\n\tpublic $default = array(\n\t\t// The $menu_item_data for wp_update_nav_menu_item().\n\t\t'object_id'        => 0,\n\t\t'object'           => '', // Taxonomy name.\n\t\t'menu_item_parent' => 0, // A.K.A. menu-item-parent-id; note that post_parent is different, and not included.\n\t\t'position'         => 0, // A.K.A. menu_order.\n\t\t'type'             => 'custom', // Note that type_label is not included here.\n\t\t'title'            => '',\n\t\t'url'              => '',\n\t\t'target'           => '',\n\t\t'attr_title'       => '',\n\t\t'description'      => '',\n\t\t'classes'          => '',\n\t\t'xfn'              => '',\n\t\t'status'           => 'publish',\n\t\t'original_title'   => '',\n\t\t'nav_menu_term_id' => 0, // This will be supplied as the $menu_id arg for wp_update_nav_menu_item().\n\t\t'_invalid'         => false,\n\t);\n\n\t/**\n\t * Default transport.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $transport = 'postMessage';\n\n\t/**\n\t * The post ID represented by this setting instance. This is the db_id.\n\t *\n\t * A negative value represents a placeholder ID for a new menu not yet saved.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $post_id;\n\n\t/**\n\t * Storage of pre-setup menu item to prevent wasted calls to wp_setup_nav_menu_item().\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $value;\n\n\t/**\n\t * Previous (placeholder) post ID used before creating a new menu item.\n\t *\n\t * This value will be exported to JS via the customize_save_response filter\n\t * so that JavaScript can update the settings to refer to the newly-assigned\n\t * post ID. This value is always negative to indicate it does not refer to\n\t * a real post.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t *\n\t * @see WP_Customize_Nav_Menu_Item_Setting::update()\n\t * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response()\n\t */\n\tpublic $previous_post_id;\n\n\t/**\n\t * When previewing or updating a menu item, this stores the previous nav_menu_term_id\n\t * which ensures that we can apply the proper filters.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $original_nav_menu_term_id;\n\n\t/**\n\t * Whether or not update() was called.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $is_updated = false;\n\n\t/**\n\t * Status for calling the update method, used in customize_save_response filter.\n\t *\n\t * When status is inserted, the placeholder post ID is stored in $previous_post_id.\n\t * When status is error, the error is stored in $update_error.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string updated|inserted|deleted|error\n\t *\n\t * @see WP_Customize_Nav_Menu_Item_Setting::update()\n\t * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response()\n\t */\n\tpublic $update_status;\n\n\t/**\n\t * Any error object returned by wp_update_nav_menu_item() when setting is updated.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var WP_Error\n\t *\n\t * @see WP_Customize_Nav_Menu_Item_Setting::update()\n\t * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response()\n\t */\n\tpublic $update_error;\n\n\t/**\n\t * Constructor.\n\t *\n\t * Any supplied $args override class property defaults.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Customize_Manager $manager Bootstrap Customizer instance.\n\t * @param string               $id      An specific ID of the setting. Can be a\n\t *                                      theme mod or option name.\n\t * @param array                $args    Optional. Setting arguments.\n\t *\n\t * @throws Exception If $id is not valid for this setting type.\n\t */\n\tpublic function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) {\n\t\tif ( empty( $manager->nav_menus ) ) {\n\t\t\tthrow new Exception( 'Expected WP_Customize_Manager::$nav_menus to be set.' );\n\t\t}\n\n\t\tif ( ! preg_match( self::ID_PATTERN, $id, $matches ) ) {\n\t\t\tthrow new Exception( \"Illegal widget setting ID: $id\" );\n\t\t}\n\n\t\t$this->post_id = intval( $matches['id'] );\n\t\tadd_action( 'wp_update_nav_menu_item', array( $this, 'flush_cached_value' ), 10, 2 );\n\n\t\tparent::__construct( $manager, $id, $args );\n\n\t\t// Ensure that an initially-supplied value is valid.\n\t\tif ( isset( $this->value ) ) {\n\t\t\t$this->populate_value();\n\t\t\tforeach ( array_diff( array_keys( $this->default ), array_keys( $this->value ) ) as $missing ) {\n\t\t\t\tthrow new Exception( \"Supplied nav_menu_item value missing property: $missing\" );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Clear the cached value when this nav menu item is updated.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param int $menu_id       The term ID for the menu.\n\t * @param int $menu_item_id  The post ID for the menu item.\n\t */\n\tpublic function flush_cached_value( $menu_id, $menu_item_id ) {\n\t\tunset( $menu_id );\n\t\tif ( $menu_item_id === $this->post_id ) {\n\t\t\t$this->value = null;\n\t\t}\n\t}\n\n\t/**\n\t * Get the instance data for a given nav_menu_item setting.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see wp_setup_nav_menu_item()\n\t *\n\t * @return array|false Instance data array, or false if the item is marked for deletion.\n\t */\n\tpublic function value() {\n\t\tif ( $this->is_previewed && $this->_previewed_blog_id === get_current_blog_id() ) {\n\t\t\t$undefined  = new stdClass(); // Symbol.\n\t\t\t$post_value = $this->post_value( $undefined );\n\n\t\t\tif ( $undefined === $post_value ) {\n\t\t\t\t$value = $this->_original_value;\n\t\t\t} else {\n\t\t\t\t$value = $post_value;\n\t\t\t}\n\t\t} else if ( isset( $this->value ) ) {\n\t\t\t$value = $this->value;\n\t\t} else {\n\t\t\t$value = false;\n\n\t\t\t// Note that a ID of less than one indicates a nav_menu not yet inserted.\n\t\t\tif ( $this->post_id > 0 ) {\n\t\t\t\t$post = get_post( $this->post_id );\n\t\t\t\tif ( $post && self::POST_TYPE === $post->post_type ) {\n\t\t\t\t\t$value = (array) wp_setup_nav_menu_item( $post );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! is_array( $value ) ) {\n\t\t\t\t$value = $this->default;\n\t\t\t}\n\n\t\t\t// Cache the value for future calls to avoid having to re-call wp_setup_nav_menu_item().\n\t\t\t$this->value = $value;\n\t\t\t$this->populate_value();\n\t\t\t$value = $this->value;\n\t\t}\n\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Ensure that the value is fully populated with the necessary properties.\n\t *\n\t * Translates some properties added by wp_setup_nav_menu_item() and removes others.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @see WP_Customize_Nav_Menu_Item_Setting::value()\n\t */\n\tprotected function populate_value() {\n\t\tif ( ! is_array( $this->value ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isset( $this->value['menu_order'] ) ) {\n\t\t\t$this->value['position'] = $this->value['menu_order'];\n\t\t\tunset( $this->value['menu_order'] );\n\t\t}\n\t\tif ( isset( $this->value['post_status'] ) ) {\n\t\t\t$this->value['status'] = $this->value['post_status'];\n\t\t\tunset( $this->value['post_status'] );\n\t\t}\n\n\t\tif ( ! isset( $this->value['original_title'] ) ) {\n\t\t\t$original_title = '';\n\t\t\tif ( 'post_type' === $this->value['type'] ) {\n\t\t\t\t$original_title = get_the_title( $this->value['object_id'] );\n\t\t\t} elseif ( 'taxonomy' === $this->value['type'] ) {\n\t\t\t\t$original_title = get_term_field( 'name', $this->value['object_id'], $this->value['object'], 'raw' );\n\t\t\t\tif ( is_wp_error( $original_title ) ) {\n\t\t\t\t\t$original_title = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\t$this->value['original_title'] = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) );\n\t\t}\n\n\t\tif ( ! isset( $this->value['nav_menu_term_id'] ) && $this->post_id > 0 ) {\n\t\t\t$menus = wp_get_post_terms( $this->post_id, WP_Customize_Nav_Menu_Setting::TAXONOMY, array(\n\t\t\t\t'fields' => 'ids',\n\t\t\t) );\n\t\t\tif ( ! empty( $menus ) ) {\n\t\t\t\t$this->value['nav_menu_term_id'] = array_shift( $menus );\n\t\t\t} else {\n\t\t\t\t$this->value['nav_menu_term_id'] = 0;\n\t\t\t}\n\t\t}\n\n\t\tforeach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) {\n\t\t\tif ( ! is_int( $this->value[ $key ] ) ) {\n\t\t\t\t$this->value[ $key ] = intval( $this->value[ $key ] );\n\t\t\t}\n\t\t}\n\t\tforeach ( array( 'classes', 'xfn' ) as $key ) {\n\t\t\tif ( is_array( $this->value[ $key ] ) ) {\n\t\t\t\t$this->value[ $key ] = implode( ' ', $this->value[ $key ] );\n\t\t\t}\n\t\t}\n\n\t\tif ( ! isset( $this->value['title'] ) ) {\n\t\t\t$this->value['title'] = '';\n\t\t}\n\n\t\tif ( ! isset( $this->value['_invalid'] ) ) {\n\t\t\t$this->value['_invalid'] = false;\n\t\t\t$is_known_invalid = (\n\t\t\t\t( ( 'post_type' === $this->value['type'] || 'post_type_archive' === $this->value['type'] ) && ! post_type_exists( $this->value['object'] ) )\n\t\t\t\t||\n\t\t\t\t( 'taxonomy' === $this->value['type'] && ! taxonomy_exists( $this->value['object'] ) )\n\t\t\t);\n\t\t\tif ( $is_known_invalid ) {\n\t\t\t\t$this->value['_invalid'] = true;\n\t\t\t}\n\t\t}\n\n\t\t// Remove remaining properties available on a setup nav_menu_item post object which aren't relevant to the setting value.\n\t\t$irrelevant_properties = array(\n\t\t\t'ID',\n\t\t\t'comment_count',\n\t\t\t'comment_status',\n\t\t\t'db_id',\n\t\t\t'filter',\n\t\t\t'guid',\n\t\t\t'ping_status',\n\t\t\t'pinged',\n\t\t\t'post_author',\n\t\t\t'post_content',\n\t\t\t'post_content_filtered',\n\t\t\t'post_date',\n\t\t\t'post_date_gmt',\n\t\t\t'post_excerpt',\n\t\t\t'post_mime_type',\n\t\t\t'post_modified',\n\t\t\t'post_modified_gmt',\n\t\t\t'post_name',\n\t\t\t'post_parent',\n\t\t\t'post_password',\n\t\t\t'post_title',\n\t\t\t'post_type',\n\t\t\t'to_ping',\n\t\t);\n\t\tforeach ( $irrelevant_properties as $property ) {\n\t\t\tunset( $this->value[ $property ] );\n\t\t}\n\t}\n\n\t/**\n\t * Handle previewing the setting.\n\t *\n\t * @since 4.3.0\n\t * @since 4.4.0 Added boolean return value.\n\t * @access public\n\t *\n\t * @see WP_Customize_Manager::post_value()\n\t *\n\t * @return bool False if method short-circuited due to no-op.\n\t */\n\tpublic function preview() {\n\t\tif ( $this->is_previewed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$undefined = new stdClass();\n\t\t$is_placeholder = ( $this->post_id < 0 );\n\t\t$is_dirty = ( $undefined !== $this->post_value( $undefined ) );\n\t\tif ( ! $is_placeholder && ! $is_dirty ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->is_previewed              = true;\n\t\t$this->_original_value           = $this->value();\n\t\t$this->original_nav_menu_term_id = $this->_original_value['nav_menu_term_id'];\n\t\t$this->_previewed_blog_id        = get_current_blog_id();\n\n\t\tadd_filter( 'wp_get_nav_menu_items', array( $this, 'filter_wp_get_nav_menu_items' ), 10, 3 );\n\n\t\t$sort_callback = array( __CLASS__, 'sort_wp_get_nav_menu_items' );\n\t\tif ( ! has_filter( 'wp_get_nav_menu_items', $sort_callback ) ) {\n\t\t\tadd_filter( 'wp_get_nav_menu_items', array( __CLASS__, 'sort_wp_get_nav_menu_items' ), 1000, 3 );\n\t\t}\n\n\t\t// @todo Add get_post_metadata filters for plugins to add their data.\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Filter the wp_get_nav_menu_items() result to supply the previewed menu items.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see wp_get_nav_menu_items()\n\t *\n\t * @param array  $items An array of menu item post objects.\n\t * @param object $menu  The menu object.\n\t * @param array  $args  An array of arguments used to retrieve menu item objects.\n\t * @return array Array of menu items,\n\t */\n\tpublic function filter_wp_get_nav_menu_items( $items, $menu, $args ) {\n\t\t$this_item = $this->value();\n\t\t$current_nav_menu_term_id = $this_item['nav_menu_term_id'];\n\t\tunset( $this_item['nav_menu_term_id'] );\n\n\t\t$should_filter = (\n\t\t\t$menu->term_id === $this->original_nav_menu_term_id\n\t\t\t||\n\t\t\t$menu->term_id === $current_nav_menu_term_id\n\t\t);\n\t\tif ( ! $should_filter ) {\n\t\t\treturn $items;\n\t\t}\n\n\t\t// Handle deleted menu item, or menu item moved to another menu.\n\t\t$should_remove = (\n\t\t\tfalse === $this_item\n\t\t\t||\n\t\t\ttrue === $this_item['_invalid']\n\t\t\t||\n\t\t\t(\n\t\t\t\t$this->original_nav_menu_term_id === $menu->term_id\n\t\t\t\t&&\n\t\t\t\t$current_nav_menu_term_id !== $this->original_nav_menu_term_id\n\t\t\t)\n\t\t);\n\t\tif ( $should_remove ) {\n\t\t\t$filtered_items = array();\n\t\t\tforeach ( $items as $item ) {\n\t\t\t\tif ( $item->db_id !== $this->post_id ) {\n\t\t\t\t\t$filtered_items[] = $item;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn $filtered_items;\n\t\t}\n\n\t\t$mutated = false;\n\t\t$should_update = (\n\t\t\tis_array( $this_item )\n\t\t\t&&\n\t\t\t$current_nav_menu_term_id === $menu->term_id\n\t\t);\n\t\tif ( $should_update ) {\n\t\t\tforeach ( $items as $item ) {\n\t\t\t\tif ( $item->db_id === $this->post_id ) {\n\t\t\t\t\tforeach ( get_object_vars( $this->value_as_wp_post_nav_menu_item() ) as $key => $value ) {\n\t\t\t\t\t\t$item->$key = $value;\n\t\t\t\t\t}\n\t\t\t\t\t$mutated = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Not found so we have to append it..\n\t\t\tif ( ! $mutated ) {\n\t\t\t\t$items[] = $this->value_as_wp_post_nav_menu_item();\n\t\t\t}\n\t\t}\n\n\t\treturn $items;\n\t}\n\n\t/**\n\t * Re-apply the tail logic also applied on $items by wp_get_nav_menu_items().\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @static\n\t *\n\t * @see wp_get_nav_menu_items()\n\t *\n\t * @param array  $items An array of menu item post objects.\n\t * @param object $menu  The menu object.\n\t * @param array  $args  An array of arguments used to retrieve menu item objects.\n\t * @return array Array of menu items,\n\t */\n\tpublic static function sort_wp_get_nav_menu_items( $items, $menu, $args ) {\n\t\t// @todo We should probably re-apply some constraints imposed by $args.\n\t\tunset( $args['include'] );\n\n\t\t// Remove invalid items only in frontend.\n\t\tif ( ! is_admin() ) {\n\t\t\t$items = array_filter( $items, '_is_valid_nav_menu_item' );\n\t\t}\n\n\t\tif ( ARRAY_A === $args['output'] ) {\n\t\t\t$GLOBALS['_menu_item_sort_prop'] = $args['output_key'];\n\t\t\tusort( $items, '_sort_nav_menu_items' );\n\t\t\t$i = 1;\n\n\t\t\tforeach ( $items as $k => $item ) {\n\t\t\t\t$items[ $k ]->{$args['output_key']} = $i++;\n\t\t\t}\n\t\t}\n\n\t\treturn $items;\n\t}\n\n\t/**\n\t * Get the value emulated into a WP_Post and set up as a nav_menu_item.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @return WP_Post With wp_setup_nav_menu_item() applied.\n\t */\n\tpublic function value_as_wp_post_nav_menu_item() {\n\t\t$item = (object) $this->value();\n\t\tunset( $item->nav_menu_term_id );\n\n\t\t$item->post_status = $item->status;\n\t\tunset( $item->status );\n\n\t\t$item->post_type = 'nav_menu_item';\n\t\t$item->menu_order = $item->position;\n\t\tunset( $item->position );\n\n\t\tif ( $item->title ) {\n\t\t\t$item->post_title = $item->title;\n\t\t}\n\n\t\t$item->ID = $this->post_id;\n\t\t$item->db_id = $this->post_id;\n\t\t$post = new WP_Post( (object) $item );\n\n\t\tif ( empty( $post->post_author ) ) {\n\t\t\t$post->post_author = get_current_user_id();\n\t\t}\n\n\t\tif ( ! isset( $post->type_label ) ) {\n\t\t\tif ( 'post_type' === $post->type ) {\n\t\t\t\t$object = get_post_type_object( $post->object );\n\t\t\t\tif ( $object ) {\n\t\t\t\t\t$post->type_label = $object->labels->singular_name;\n\t\t\t\t} else {\n\t\t\t\t\t$post->type_label = $post->object;\n\t\t\t\t}\n\t\t\t} elseif ( 'taxonomy' == $post->type ) {\n\t\t\t\t$object = get_taxonomy( $post->object );\n\t\t\t\tif ( $object ) {\n\t\t\t\t\t$post->type_label = $object->labels->singular_name;\n\t\t\t\t} else {\n\t\t\t\t\t$post->type_label = $post->object;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$post->type_label = __( 'Custom Link' );\n\t\t\t}\n\t\t}\n\n\t\t/** This filter is documented in wp-includes/nav-menu.php */\n\t\t$post->attr_title = apply_filters( 'nav_menu_attr_title', $post->attr_title );\n\n\t\t/** This filter is documented in wp-includes/nav-menu.php */\n\t\t$post->description = apply_filters( 'nav_menu_description', wp_trim_words( $post->description, 200 ) );\n\n\t\treturn $post;\n\t}\n\n\t/**\n\t * Sanitize an input.\n\t *\n\t * Note that parent::sanitize() erroneously does wp_unslash() on $value, but\n\t * we remove that in this override.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $menu_item_value The value to sanitize.\n\t * @return array|false|null Null if an input isn't valid. False if it is marked for deletion.\n\t *                          Otherwise the sanitized value.\n\t */\n\tpublic function sanitize( $menu_item_value ) {\n\t\t// Menu is marked for deletion.\n\t\tif ( false === $menu_item_value ) {\n\t\t\treturn $menu_item_value;\n\t\t}\n\n\t\t// Invalid.\n\t\tif ( ! is_array( $menu_item_value ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t$default = array(\n\t\t\t'object_id'        => 0,\n\t\t\t'object'           => '',\n\t\t\t'menu_item_parent' => 0,\n\t\t\t'position'         => 0,\n\t\t\t'type'             => 'custom',\n\t\t\t'title'            => '',\n\t\t\t'url'              => '',\n\t\t\t'target'           => '',\n\t\t\t'attr_title'       => '',\n\t\t\t'description'      => '',\n\t\t\t'classes'          => '',\n\t\t\t'xfn'              => '',\n\t\t\t'status'           => 'publish',\n\t\t\t'original_title'   => '',\n\t\t\t'nav_menu_term_id' => 0,\n\t\t\t'_invalid'         => false,\n\t\t);\n\t\t$menu_item_value = array_merge( $default, $menu_item_value );\n\t\t$menu_item_value = wp_array_slice_assoc( $menu_item_value, array_keys( $default ) );\n\t\t$menu_item_value['position'] = intval( $menu_item_value['position'] );\n\n\t\tforeach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) {\n\t\t\t// Note we need to allow negative-integer IDs for previewed objects not inserted yet.\n\t\t\t$menu_item_value[ $key ] = intval( $menu_item_value[ $key ] );\n\t\t}\n\n\t\tforeach ( array( 'type', 'object', 'target' ) as $key ) {\n\t\t\t$menu_item_value[ $key ] = sanitize_key( $menu_item_value[ $key ] );\n\t\t}\n\n\t\tforeach ( array( 'xfn', 'classes' ) as $key ) {\n\t\t\t$value = $menu_item_value[ $key ];\n\t\t\tif ( ! is_array( $value ) ) {\n\t\t\t\t$value = explode( ' ', $value );\n\t\t\t}\n\t\t\t$menu_item_value[ $key ] = implode( ' ', array_map( 'sanitize_html_class', $value ) );\n\t\t}\n\n\t\t$menu_item_value['original_title'] = sanitize_text_field( $menu_item_value['original_title'] );\n\n\t\t// Apply the same filters as when calling wp_insert_post().\n\t\t$menu_item_value['title'] = apply_filters( 'title_save_pre', $menu_item_value['title'] );\n\t\t$menu_item_value['attr_title'] = apply_filters( 'excerpt_save_pre', $menu_item_value['attr_title'] );\n\t\t$menu_item_value['description'] = apply_filters( 'content_save_pre', $menu_item_value['description'] );\n\n\t\t$menu_item_value['url'] = esc_url_raw( $menu_item_value['url'] );\n\t\tif ( 'publish' !== $menu_item_value['status'] ) {\n\t\t\t$menu_item_value['status'] = 'draft';\n\t\t}\n\n\t\t$menu_item_value['_invalid'] = (bool) $menu_item_value['_invalid'];\n\n\t\t/** This filter is documented in wp-includes/class-wp-customize-setting.php */\n\t\treturn apply_filters( \"customize_sanitize_{$this->id}\", $menu_item_value, $this );\n\t}\n\n\t/**\n\t * Create/update the nav_menu_item post for this setting.\n\t *\n\t * Any created menu items will have their assigned post IDs exported to the client\n\t * via the customize_save_response filter. Likewise, any errors will be exported\n\t * to the client via the customize_save_response() filter.\n\t *\n\t * To delete a menu, the client can send false as the value.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @see wp_update_nav_menu_item()\n\t *\n\t * @param array|false $value The menu item array to update. If false, then the menu item will be deleted\n\t *                           entirely. See WP_Customize_Nav_Menu_Item_Setting::$default for what the value\n\t *                           should consist of.\n\t * @return null|void\n\t */\n\tprotected function update( $value ) {\n\t\tif ( $this->is_updated ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->is_updated = true;\n\t\t$is_placeholder   = ( $this->post_id < 0 );\n\t\t$is_delete        = ( false === $value );\n\n\t\t// Update the cached value.\n\t\t$this->value = $value;\n\n\t\tadd_filter( 'customize_save_response', array( $this, 'amend_customize_save_response' ) );\n\n\t\tif ( $is_delete ) {\n\t\t\t// If the current setting post is a placeholder, a delete request is a no-op.\n\t\t\tif ( $is_placeholder ) {\n\t\t\t\t$this->update_status = 'deleted';\n\t\t\t} else {\n\t\t\t\t$r = wp_delete_post( $this->post_id, true );\n\n\t\t\t\tif ( false === $r ) {\n\t\t\t\t\t$this->update_error  = new WP_Error( 'delete_failure' );\n\t\t\t\t\t$this->update_status = 'error';\n\t\t\t\t} else {\n\t\t\t\t\t$this->update_status = 'deleted';\n\t\t\t\t}\n\t\t\t\t// @todo send back the IDs for all associated nav menu items deleted, so these settings (and controls) can be removed from Customizer?\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Handle saving menu items for menus that are being newly-created.\n\t\t\tif ( $value['nav_menu_term_id'] < 0 ) {\n\t\t\t\t$nav_menu_setting_id = sprintf( 'nav_menu[%s]', $value['nav_menu_term_id'] );\n\t\t\t\t$nav_menu_setting    = $this->manager->get_setting( $nav_menu_setting_id );\n\n\t\t\t\tif ( ! $nav_menu_setting || ! ( $nav_menu_setting instanceof WP_Customize_Nav_Menu_Setting ) ) {\n\t\t\t\t\t$this->update_status = 'error';\n\t\t\t\t\t$this->update_error  = new WP_Error( 'unexpected_nav_menu_setting' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( false === $nav_menu_setting->save() ) {\n\t\t\t\t\t$this->update_status = 'error';\n\t\t\t\t\t$this->update_error  = new WP_Error( 'nav_menu_setting_failure' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( $nav_menu_setting->previous_term_id !== intval( $value['nav_menu_term_id'] ) ) {\n\t\t\t\t\t$this->update_status = 'error';\n\t\t\t\t\t$this->update_error  = new WP_Error( 'unexpected_previous_term_id' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$value['nav_menu_term_id'] = $nav_menu_setting->term_id;\n\t\t\t}\n\n\t\t\t// Handle saving a nav menu item that is a child of a nav menu item being newly-created.\n\t\t\tif ( $value['menu_item_parent'] < 0 ) {\n\t\t\t\t$parent_nav_menu_item_setting_id = sprintf( 'nav_menu_item[%s]', $value['menu_item_parent'] );\n\t\t\t\t$parent_nav_menu_item_setting    = $this->manager->get_setting( $parent_nav_menu_item_setting_id );\n\n\t\t\t\tif ( ! $parent_nav_menu_item_setting || ! ( $parent_nav_menu_item_setting instanceof WP_Customize_Nav_Menu_Item_Setting ) ) {\n\t\t\t\t\t$this->update_status = 'error';\n\t\t\t\t\t$this->update_error  = new WP_Error( 'unexpected_nav_menu_item_setting' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( false === $parent_nav_menu_item_setting->save() ) {\n\t\t\t\t\t$this->update_status = 'error';\n\t\t\t\t\t$this->update_error  = new WP_Error( 'nav_menu_item_setting_failure' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( $parent_nav_menu_item_setting->previous_post_id !== intval( $value['menu_item_parent'] ) ) {\n\t\t\t\t\t$this->update_status = 'error';\n\t\t\t\t\t$this->update_error  = new WP_Error( 'unexpected_previous_post_id' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$value['menu_item_parent'] = $parent_nav_menu_item_setting->post_id;\n\t\t\t}\n\n\t\t\t// Insert or update menu.\n\t\t\t$menu_item_data = array(\n\t\t\t\t'menu-item-object-id'   => $value['object_id'],\n\t\t\t\t'menu-item-object'      => $value['object'],\n\t\t\t\t'menu-item-parent-id'   => $value['menu_item_parent'],\n\t\t\t\t'menu-item-position'    => $value['position'],\n\t\t\t\t'menu-item-type'        => $value['type'],\n\t\t\t\t'menu-item-title'       => $value['title'],\n\t\t\t\t'menu-item-url'         => $value['url'],\n\t\t\t\t'menu-item-description' => $value['description'],\n\t\t\t\t'menu-item-attr-title'  => $value['attr_title'],\n\t\t\t\t'menu-item-target'      => $value['target'],\n\t\t\t\t'menu-item-classes'     => $value['classes'],\n\t\t\t\t'menu-item-xfn'         => $value['xfn'],\n\t\t\t\t'menu-item-status'      => $value['status'],\n\t\t\t);\n\n\t\t\t$r = wp_update_nav_menu_item(\n\t\t\t\t$value['nav_menu_term_id'],\n\t\t\t\t$is_placeholder ? 0 : $this->post_id,\n\t\t\t\t$menu_item_data\n\t\t\t);\n\n\t\t\tif ( is_wp_error( $r ) ) {\n\t\t\t\t$this->update_status = 'error';\n\t\t\t\t$this->update_error = $r;\n\t\t\t} else {\n\t\t\t\tif ( $is_placeholder ) {\n\t\t\t\t\t$this->previous_post_id = $this->post_id;\n\t\t\t\t\t$this->post_id = $r;\n\t\t\t\t\t$this->update_status = 'inserted';\n\t\t\t\t} else {\n\t\t\t\t\t$this->update_status = 'updated';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Export data for the JS client.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Nav_Menu_Item_Setting::update()\n\t *\n\t * @param array $data Additional information passed back to the 'saved' event on `wp.customize`.\n\t * @return array Save response data.\n\t */\n\tpublic function amend_customize_save_response( $data ) {\n\t\tif ( ! isset( $data['nav_menu_item_updates'] ) ) {\n\t\t\t$data['nav_menu_item_updates'] = array();\n\t\t}\n\n\t\t$data['nav_menu_item_updates'][] = array(\n\t\t\t'post_id'          => $this->post_id,\n\t\t\t'previous_post_id' => $this->previous_post_id,\n\t\t\t'error'            => $this->update_error ? $this->update_error->get_error_code() : null,\n\t\t\t'status'           => $this->update_status,\n\t\t);\n\t\treturn $data;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menu-location-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menu_Location_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Menu Location Control Class.\n *\n * This custom control is only needed for JS.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Customize_Nav_Menu_Location_Control extends WP_Customize_Control {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'nav_menu_location';\n\n\t/**\n\t * Location ID.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $location_id = '';\n\n\t/**\n\t * Refresh the parameters passed to JavaScript via JSON.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Control::to_json()\n\t */\n\tpublic function to_json() {\n\t\tparent::to_json();\n\t\t$this->json['locationId'] = $this->location_id;\n\t}\n\n\t/**\n\t * Render content just like a normal select control.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function render_content() {\n\t\tif ( empty( $this->choices ) ) {\n\t\t\treturn;\n\t\t}\n\t\t?>\n\t\t<label>\n\t\t\t<?php if ( ! empty( $this->label ) ) : ?>\n\t\t\t<span class=\"customize-control-title\"><?php echo esc_html( $this->label ); ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<?php if ( ! empty( $this->description ) ) : ?>\n\t\t\t<span class=\"description customize-control-description\"><?php echo $this->description; ?></span>\n\t\t\t<?php endif; ?>\n\n\t\t\t<select <?php $this->link(); ?>>\n\t\t\t\t<?php\n\t\t\t\tforeach ( $this->choices as $value => $label ) :\n\t\t\t\t\techo '<option value=\"' . esc_attr( $value ) . '\"' . selected( $this->value(), $value, false ) . '>' . $label . '</option>';\n\t\t\t\tendforeach;\n\t\t\t\t?>\n\t\t\t</select>\n\t\t</label>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menu-name-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menu_Name_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize control to represent the name field for a given menu.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Customize_Nav_Menu_Name_Control extends WP_Customize_Control {\n\n\t/**\n\t * Type of control, used by JS.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'nav_menu_name';\n\n\t/**\n\t * No-op since we're using JS template.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t */\n\tprotected function render_content() {}\n\n\t/**\n\t * Render the Underscore template for this control.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t */\n\tprotected function content_template() {\n\t\t?>\n\t\t<label>\n\t\t\t<# if ( data.label ) { #>\n\t\t\t\t<span class=\"customize-control-title screen-reader-text\">{{ data.label }}</span>\n\t\t\t<# } #>\n\t\t\t<input type=\"text\" class=\"menu-name-field live-update-section-title\" />\n\t\t</label>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menu-section.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menu_Section class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Menu Section Class\n *\n * Custom section only needed in JS.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Section\n */\nclass WP_Customize_Nav_Menu_Section extends WP_Customize_Section {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'nav_menu';\n\n\t/**\n\t * Get section parameters for JS.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @return array Exported parameters.\n\t */\n\tpublic function json() {\n\t\t$exported = parent::json();\n\t\t$exported['menu_id'] = intval( preg_replace( '/^nav_menu\\[(\\d+)\\]/', '$1', $this->id ) );\n\n\t\treturn $exported;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menu-setting.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menu_Setting class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Setting to represent a nav_menu.\n *\n * Subclass of WP_Customize_Setting to represent a nav_menu taxonomy term, and\n * the IDs for the nav_menu_items associated with the nav menu.\n *\n * @since 4.3.0\n *\n * @see wp_get_nav_menu_object()\n * @see WP_Customize_Setting\n */\nclass WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting {\n\n\tconst ID_PATTERN = '/^nav_menu\\[(?P<id>-?\\d+)\\]$/';\n\n\tconst TAXONOMY = 'nav_menu';\n\n\tconst TYPE = 'nav_menu';\n\n\t/**\n\t * Setting type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = self::TYPE;\n\n\t/**\n\t * Default setting value.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var array\n\t *\n\t * @see wp_get_nav_menu_object()\n\t */\n\tpublic $default = array(\n\t\t'name'        => '',\n\t\t'description' => '',\n\t\t'parent'      => 0,\n\t\t'auto_add'    => false,\n\t);\n\n\t/**\n\t * Default transport.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $transport = 'postMessage';\n\n\t/**\n\t * The term ID represented by this setting instance.\n\t *\n\t * A negative value represents a placeholder ID for a new menu not yet saved.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $term_id;\n\n\t/**\n\t * Previous (placeholder) term ID used before creating a new menu.\n\t *\n\t * This value will be exported to JS via the customize_save_response filter\n\t * so that JavaScript can update the settings to refer to the newly-assigned\n\t * term ID. This value is always negative to indicate it does not refer to\n\t * a real term.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var int\n\t *\n\t * @see WP_Customize_Nav_Menu_Setting::update()\n\t * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response()\n\t */\n\tpublic $previous_term_id;\n\n\t/**\n\t * Whether or not update() was called.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $is_updated = false;\n\n\t/**\n\t * Status for calling the update method, used in customize_save_response filter.\n\t *\n\t * When status is inserted, the placeholder term ID is stored in $previous_term_id.\n\t * When status is error, the error is stored in $update_error.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string updated|inserted|deleted|error\n\t *\n\t * @see WP_Customize_Nav_Menu_Setting::update()\n\t * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response()\n\t */\n\tpublic $update_status;\n\n\t/**\n\t * Any error object returned by wp_update_nav_menu_object() when setting is updated.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var WP_Error\n\t *\n\t * @see WP_Customize_Nav_Menu_Setting::update()\n\t * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response()\n\t */\n\tpublic $update_error;\n\n\t/**\n\t * Constructor.\n\t *\n\t * Any supplied $args override class property defaults.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Customize_Manager $manager Bootstrap Customizer instance.\n\t * @param string               $id      An specific ID of the setting. Can be a\n\t *                                      theme mod or option name.\n\t * @param array                $args    Optional. Setting arguments.\n\t *\n\t * @throws Exception If $id is not valid for this setting type.\n\t */\n\tpublic function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) {\n\t\tif ( empty( $manager->nav_menus ) ) {\n\t\t\tthrow new Exception( 'Expected WP_Customize_Manager::$nav_menus to be set.' );\n\t\t}\n\n\t\tif ( ! preg_match( self::ID_PATTERN, $id, $matches ) ) {\n\t\t\tthrow new Exception( \"Illegal widget setting ID: $id\" );\n\t\t}\n\n\t\t$this->term_id = intval( $matches['id'] );\n\n\t\tparent::__construct( $manager, $id, $args );\n\t}\n\n\t/**\n\t * Get the instance data for a given widget setting.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see wp_get_nav_menu_object()\n\t *\n\t * @return array Instance data.\n\t */\n\tpublic function value() {\n\t\tif ( $this->is_previewed && $this->_previewed_blog_id === get_current_blog_id() ) {\n\t\t\t$undefined  = new stdClass(); // Symbol.\n\t\t\t$post_value = $this->post_value( $undefined );\n\n\t\t\tif ( $undefined === $post_value ) {\n\t\t\t\t$value = $this->_original_value;\n\t\t\t} else {\n\t\t\t\t$value = $post_value;\n\t\t\t}\n\t\t} else {\n\t\t\t$value = false;\n\n\t\t\t// Note that a term_id of less than one indicates a nav_menu not yet inserted.\n\t\t\tif ( $this->term_id > 0 ) {\n\t\t\t\t$term = wp_get_nav_menu_object( $this->term_id );\n\n\t\t\t\tif ( $term ) {\n\t\t\t\t\t$value = wp_array_slice_assoc( (array) $term, array_keys( $this->default ) );\n\n\t\t\t\t\t$nav_menu_options  = (array) get_option( 'nav_menu_options', array() );\n\t\t\t\t\t$value['auto_add'] = false;\n\n\t\t\t\t\tif ( isset( $nav_menu_options['auto_add'] ) && is_array( $nav_menu_options['auto_add'] ) ) {\n\t\t\t\t\t\t$value['auto_add'] = in_array( $term->term_id, $nav_menu_options['auto_add'] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! is_array( $value ) ) {\n\t\t\t\t$value = $this->default;\n\t\t\t}\n\t\t}\n\t\treturn $value;\n\t}\n\n\t/**\n\t * Handle previewing the setting.\n\t *\n\t * @since 4.3.0\n\t * @since 4.4.0 Added boolean return value\n\t * @access public\n\t *\n\t * @see WP_Customize_Manager::post_value()\n\t *\n\t * @return bool False if method short-circuited due to no-op.\n\t */\n\tpublic function preview() {\n\t\tif ( $this->is_previewed ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$undefined = new stdClass();\n\t\t$is_placeholder = ( $this->term_id < 0 );\n\t\t$is_dirty = ( $undefined !== $this->post_value( $undefined ) );\n\t\tif ( ! $is_placeholder && ! $is_dirty ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->is_previewed       = true;\n\t\t$this->_original_value    = $this->value();\n\t\t$this->_previewed_blog_id = get_current_blog_id();\n\n\t\tadd_filter( 'wp_get_nav_menus', array( $this, 'filter_wp_get_nav_menus' ), 10, 2 );\n\t\tadd_filter( 'wp_get_nav_menu_object', array( $this, 'filter_wp_get_nav_menu_object' ), 10, 2 );\n\t\tadd_filter( 'default_option_nav_menu_options', array( $this, 'filter_nav_menu_options' ) );\n\t\tadd_filter( 'option_nav_menu_options', array( $this, 'filter_nav_menu_options' ) );\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Filter the wp_get_nav_menus() result to ensure the inserted menu object is included, and the deleted one is removed.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see wp_get_nav_menus()\n\t *\n\t * @param array $menus An array of menu objects.\n\t * @param array $args  An array of arguments used to retrieve menu objects.\n\t * @return array\n\t */\n\tpublic function filter_wp_get_nav_menus( $menus, $args ) {\n\t\tif ( get_current_blog_id() !== $this->_previewed_blog_id ) {\n\t\t\treturn $menus;\n\t\t}\n\n\t\t$setting_value = $this->value();\n\t\t$is_delete = ( false === $setting_value );\n\t\t$index = -1;\n\n\t\t// Find the existing menu item's position in the list.\n\t\tforeach ( $menus as $i => $menu ) {\n\t\t\tif ( (int) $this->term_id === (int) $menu->term_id || (int) $this->previous_term_id === (int) $menu->term_id ) {\n\t\t\t\t$index = $i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( $is_delete ) {\n\t\t\t// Handle deleted menu by removing it from the list.\n\t\t\tif ( -1 !== $index ) {\n\t\t\t\tarray_splice( $menus, $index, 1 );\n\t\t\t}\n\t\t} else {\n\t\t\t// Handle menus being updated or inserted.\n\t\t\t$menu_obj = (object) array_merge( array(\n\t\t\t\t'term_id'          => $this->term_id,\n\t\t\t\t'term_taxonomy_id' => $this->term_id,\n\t\t\t\t'slug'             => sanitize_title( $setting_value['name'] ),\n\t\t\t\t'count'            => 0,\n\t\t\t\t'term_group'       => 0,\n\t\t\t\t'taxonomy'         => self::TAXONOMY,\n\t\t\t\t'filter'           => 'raw',\n\t\t\t), $setting_value );\n\n\t\t\tarray_splice( $menus, $index, ( -1 === $index ? 0 : 1 ), array( $menu_obj ) );\n\t\t}\n\n\t\t// Make sure the menu objects get re-sorted after an update/insert.\n\t\tif ( ! $is_delete && ! empty( $args['orderby'] ) ) {\n\t\t\t$this->_current_menus_sort_orderby = $args['orderby'];\n\t\t\tusort( $menus, array( $this, '_sort_menus_by_orderby' ) );\n\t\t}\n\t\t// @todo add support for $args['hide_empty'] === true\n\n\t\treturn $menus;\n\t}\n\n\t/**\n\t * Temporary non-closure passing of orderby value to function.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @var string\n\t *\n\t * @see WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus()\n\t * @see WP_Customize_Nav_Menu_Setting::_sort_menus_by_orderby()\n\t */\n\tprotected $_current_menus_sort_orderby;\n\n\t/**\n\t * Sort menu objects by the class-supplied orderby property.\n\t *\n\t * This is a workaround for a lack of closures.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t * @param object $menu1\n\t * @param object $menu2\n\t * @return int\n\t *\n\t * @see WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus()\n\t */\n\tprotected function _sort_menus_by_orderby( $menu1, $menu2 ) {\n\t\t$key = $this->_current_menus_sort_orderby;\n\t\treturn strcmp( $menu1->$key, $menu2->$key );\n\t}\n\n\t/**\n\t * Filter the wp_get_nav_menu_object() result to supply the previewed menu object.\n\t *\n\t * Requesting a nav_menu object by anything but ID is not supported.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see wp_get_nav_menu_object()\n\t *\n\t * @param object|null $menu_obj Object returned by wp_get_nav_menu_object().\n\t * @param string      $menu_id  ID of the nav_menu term. Requests by slug or name will be ignored.\n\t * @return object|null\n\t */\n\tpublic function filter_wp_get_nav_menu_object( $menu_obj, $menu_id ) {\n\t\t$ok = (\n\t\t\tget_current_blog_id() === $this->_previewed_blog_id\n\t\t\t&&\n\t\t\tis_int( $menu_id )\n\t\t\t&&\n\t\t\t$menu_id === $this->term_id\n\t\t);\n\t\tif ( ! $ok ) {\n\t\t\treturn $menu_obj;\n\t\t}\n\n\t\t$setting_value = $this->value();\n\n\t\t// Handle deleted menus.\n\t\tif ( false === $setting_value ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Handle sanitization failure by preventing short-circuiting.\n\t\tif ( null === $setting_value ) {\n\t\t\treturn $menu_obj;\n\t\t}\n\n\t\t$menu_obj = (object) array_merge( array(\n\t\t\t\t'term_id'          => $this->term_id,\n\t\t\t\t'term_taxonomy_id' => $this->term_id,\n\t\t\t\t'slug'             => sanitize_title( $setting_value['name'] ),\n\t\t\t\t'count'            => 0,\n\t\t\t\t'term_group'       => 0,\n\t\t\t\t'taxonomy'         => self::TAXONOMY,\n\t\t\t\t'filter'           => 'raw',\n\t\t\t), $setting_value );\n\n\t\treturn $menu_obj;\n\t}\n\n\t/**\n\t * Filter the nav_menu_options option to include this menu's auto_add preference.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $nav_menu_options Nav menu options including auto_add.\n\t * @return array (Kaybe) modified nav menu options.\n\t */\n\tpublic function filter_nav_menu_options( $nav_menu_options ) {\n\t\tif ( $this->_previewed_blog_id !== get_current_blog_id() ) {\n\t\t\treturn $nav_menu_options;\n\t\t}\n\n\t\t$menu = $this->value();\n\t\t$nav_menu_options = $this->filter_nav_menu_options_value(\n\t\t\t$nav_menu_options,\n\t\t\t$this->term_id,\n\t\t\tfalse === $menu ? false : $menu['auto_add']\n\t\t);\n\n\t\treturn $nav_menu_options;\n\t}\n\n\t/**\n\t * Sanitize an input.\n\t *\n\t * Note that parent::sanitize() erroneously does wp_unslash() on $value, but\n\t * we remove that in this override.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param array $value The value to sanitize.\n\t * @return array|false|null Null if an input isn't valid. False if it is marked for deletion.\n\t *                          Otherwise the sanitized value.\n\t */\n\tpublic function sanitize( $value ) {\n\t\t// Menu is marked for deletion.\n\t\tif ( false === $value ) {\n\t\t\treturn $value;\n\t\t}\n\n\t\t// Invalid.\n\t\tif ( ! is_array( $value ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t$default = array(\n\t\t\t'name'        => '',\n\t\t\t'description' => '',\n\t\t\t'parent'      => 0,\n\t\t\t'auto_add'    => false,\n\t\t);\n\t\t$value = array_merge( $default, $value );\n\t\t$value = wp_array_slice_assoc( $value, array_keys( $default ) );\n\n\t\t$value['name']        = trim( esc_html( $value['name'] ) ); // This sanitization code is used in wp-admin/nav-menus.php.\n\t\t$value['description'] = sanitize_text_field( $value['description'] );\n\t\t$value['parent']      = max( 0, intval( $value['parent'] ) );\n\t\t$value['auto_add']    = ! empty( $value['auto_add'] );\n\n\t\tif ( '' === $value['name'] ) {\n\t\t\t$value['name'] = _x( '(unnamed)', 'Missing menu name.' );\n\t\t}\n\n\t\t/** This filter is documented in wp-includes/class-wp-customize-setting.php */\n\t\treturn apply_filters( \"customize_sanitize_{$this->id}\", $value, $this );\n\t}\n\n\t/**\n\t * Storage for data to be sent back to client in customize_save_response filter.\n\t *\n\t * @access protected\n\t * @since 4.3.0\n\t * @var array\n\t *\n\t * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response()\n\t */\n\tprotected $_widget_nav_menu_updates = array();\n\n\t/**\n\t * Create/update the nav_menu term for this setting.\n\t *\n\t * Any created menus will have their assigned term IDs exported to the client\n\t * via the customize_save_response filter. Likewise, any errors will be exported\n\t * to the client via the customize_save_response() filter.\n\t *\n\t * To delete a menu, the client can send false as the value.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @see wp_update_nav_menu_object()\n\t *\n\t * @param array|false $value {\n\t *     The value to update. Note that slug cannot be updated via wp_update_nav_menu_object().\n\t *     If false, then the menu will be deleted entirely.\n\t *\n\t *     @type string $name        The name of the menu to save.\n\t *     @type string $description The term description. Default empty string.\n\t *     @type int    $parent      The id of the parent term. Default 0.\n\t *     @type bool   $auto_add    Whether pages will auto_add to this menu. Default false.\n\t * }\n\t * @return null|void\n\t */\n\tprotected function update( $value ) {\n\t\tif ( $this->is_updated ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->is_updated = true;\n\t\t$is_placeholder   = ( $this->term_id < 0 );\n\t\t$is_delete        = ( false === $value );\n\n\t\tadd_filter( 'customize_save_response', array( $this, 'amend_customize_save_response' ) );\n\n\t\t$auto_add = null;\n\t\tif ( $is_delete ) {\n\t\t\t// If the current setting term is a placeholder, a delete request is a no-op.\n\t\t\tif ( $is_placeholder ) {\n\t\t\t\t$this->update_status = 'deleted';\n\t\t\t} else {\n\t\t\t\t$r = wp_delete_nav_menu( $this->term_id );\n\n\t\t\t\tif ( is_wp_error( $r ) ) {\n\t\t\t\t\t$this->update_status = 'error';\n\t\t\t\t\t$this->update_error  = $r;\n\t\t\t\t} else {\n\t\t\t\t\t$this->update_status = 'deleted';\n\t\t\t\t\t$auto_add = false;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Insert or update menu.\n\t\t\t$menu_data = wp_array_slice_assoc( $value, array( 'description', 'parent' ) );\n\t\t\t$menu_data['menu-name'] = $value['name'];\n\n\t\t\t$menu_id = $is_placeholder ? 0 : $this->term_id;\n\t\t\t$r = wp_update_nav_menu_object( $menu_id, $menu_data );\n\t\t\t$original_name = $menu_data['menu-name'];\n\t\t\t$name_conflict_suffix = 1;\n\t\t\twhile ( is_wp_error( $r ) && 'menu_exists' === $r->get_error_code() ) {\n\t\t\t\t$name_conflict_suffix += 1;\n\t\t\t\t/* translators: 1: original menu name, 2: duplicate count */\n\t\t\t\t$menu_data['menu-name'] = sprintf( __( '%1$s (%2$d)' ), $original_name, $name_conflict_suffix );\n\t\t\t\t$r = wp_update_nav_menu_object( $menu_id, $menu_data );\n\t\t\t}\n\n\t\t\tif ( is_wp_error( $r ) ) {\n\t\t\t\t$this->update_status = 'error';\n\t\t\t\t$this->update_error  = $r;\n\t\t\t} else {\n\t\t\t\tif ( $is_placeholder ) {\n\t\t\t\t\t$this->previous_term_id = $this->term_id;\n\t\t\t\t\t$this->term_id          = $r;\n\t\t\t\t\t$this->update_status    = 'inserted';\n\t\t\t\t} else {\n\t\t\t\t\t$this->update_status = 'updated';\n\t\t\t\t}\n\n\t\t\t\t$auto_add = $value['auto_add'];\n\t\t\t}\n\t\t}\n\n\t\tif ( null !== $auto_add ) {\n\t\t\t$nav_menu_options = $this->filter_nav_menu_options_value(\n\t\t\t\t(array) get_option( 'nav_menu_options', array() ),\n\t\t\t\t$this->term_id,\n\t\t\t\t$auto_add\n\t\t\t);\n\t\t\tupdate_option( 'nav_menu_options', $nav_menu_options );\n\t\t}\n\n\t\tif ( 'inserted' === $this->update_status ) {\n\t\t\t// Make sure that new menus assigned to nav menu locations use their new IDs.\n\t\t\tforeach ( $this->manager->settings() as $setting ) {\n\t\t\t\tif ( ! preg_match( '/^nav_menu_locations\\[/', $setting->id ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$post_value = $setting->post_value( null );\n\t\t\t\tif ( ! is_null( $post_value ) && $this->previous_term_id === intval( $post_value ) ) {\n\t\t\t\t\t$this->manager->set_post_value( $setting->id, $this->term_id );\n\t\t\t\t\t$setting->save();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Make sure that any nav_menu widgets referencing the placeholder nav menu get updated and sent back to client.\n\t\t\tforeach ( array_keys( $this->manager->unsanitized_post_values() ) as $setting_id ) {\n\t\t\t\t$nav_menu_widget_setting = $this->manager->get_setting( $setting_id );\n\t\t\t\tif ( ! $nav_menu_widget_setting || ! preg_match( '/^widget_nav_menu\\[/', $nav_menu_widget_setting->id ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$widget_instance = $nav_menu_widget_setting->post_value(); // Note that this calls WP_Customize_Widgets::sanitize_widget_instance().\n\t\t\t\tif ( empty( $widget_instance['nav_menu'] ) || intval( $widget_instance['nav_menu'] ) !== $this->previous_term_id ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$widget_instance['nav_menu'] = $this->term_id;\n\t\t\t\t$updated_widget_instance = $this->manager->widgets->sanitize_widget_js_instance( $widget_instance );\n\t\t\t\t$this->manager->set_post_value( $nav_menu_widget_setting->id, $updated_widget_instance );\n\t\t\t\t$nav_menu_widget_setting->save();\n\n\t\t\t\t$this->_widget_nav_menu_updates[ $nav_menu_widget_setting->id ] = $updated_widget_instance;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates a nav_menu_options array.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @see WP_Customize_Nav_Menu_Setting::filter_nav_menu_options()\n\t * @see WP_Customize_Nav_Menu_Setting::update()\n\t *\n\t * @param array $nav_menu_options Array as returned by get_option( 'nav_menu_options' ).\n\t * @param int   $menu_id          The term ID for the given menu.\n\t * @param bool  $auto_add         Whether to auto-add or not.\n\t * @return array (Maybe) modified nav_menu_otions array.\n\t */\n\tprotected function filter_nav_menu_options_value( $nav_menu_options, $menu_id, $auto_add ) {\n\t\t$nav_menu_options = (array) $nav_menu_options;\n\t\tif ( ! isset( $nav_menu_options['auto_add'] ) ) {\n\t\t\t$nav_menu_options['auto_add'] = array();\n\t\t}\n\n\t\t$i = array_search( $menu_id, $nav_menu_options['auto_add'] );\n\t\tif ( $auto_add && false === $i ) {\n\t\t\tarray_push( $nav_menu_options['auto_add'], $this->term_id );\n\t\t} elseif ( ! $auto_add && false !== $i ) {\n\t\t\tarray_splice( $nav_menu_options['auto_add'], $i, 1 );\n\t\t}\n\n\t\treturn $nav_menu_options;\n\t}\n\n\t/**\n\t * Export data for the JS client.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Nav_Menu_Setting::update()\n\t *\n\t * @param array $data Additional information passed back to the 'saved' event on `wp.customize`.\n\t * @return array Export data.\n\t */\n\tpublic function amend_customize_save_response( $data ) {\n\t\tif ( ! isset( $data['nav_menu_updates'] ) ) {\n\t\t\t$data['nav_menu_updates'] = array();\n\t\t}\n\t\tif ( ! isset( $data['widget_nav_menu_updates'] ) ) {\n\t\t\t$data['widget_nav_menu_updates'] = array();\n\t\t}\n\n\t\t$data['nav_menu_updates'][] = array(\n\t\t\t'term_id'          => $this->term_id,\n\t\t\t'previous_term_id' => $this->previous_term_id,\n\t\t\t'error'            => $this->update_error ? $this->update_error->get_error_code() : null,\n\t\t\t'status'           => $this->update_status,\n\t\t\t'saved_value'      => 'deleted' === $this->update_status ? null : $this->value(),\n\t\t);\n\n\t\t$data['widget_nav_menu_updates'] = array_merge(\n\t\t\t$data['widget_nav_menu_updates'],\n\t\t\t$this->_widget_nav_menu_updates\n\t\t);\n\t\t$this->_widget_nav_menu_updates = array();\n\n\t\treturn $data;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-nav-menus-panel.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Nav_Menus_Panel class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Nav Menus Panel Class\n *\n * Needed to add screen options.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Panel\n */\nclass WP_Customize_Nav_Menus_Panel extends WP_Customize_Panel {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'nav_menus';\n\n\t/**\n\t * Render screen options for Menus.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function render_screen_options() {\n\t\t// Essentially adds the screen options.\n\t\tadd_filter( 'manage_nav-menus_columns', array( $this, 'wp_nav_menu_manage_columns' ) );\n\n\t\t// Display screen options.\n\t\t$screen = WP_Screen::get( 'nav-menus.php' );\n\t\t$screen->render_screen_options( array( 'wrap' => false ) );\n\t}\n\n\t/**\n\t * Returns the advanced options for the nav menus page.\n\t *\n\t * Link title attribute added as it's a relatively advanced concept for new users.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @return array The advanced menu properties.\n\t */\n\tpublic function wp_nav_menu_manage_columns() {\n\t\treturn array(\n\t\t\t'_title'      => __( 'Show advanced menu properties' ),\n\t\t\t'cb'          => '<input type=\"checkbox\" />',\n\t\t\t'link-target' => __( 'Link Target' ),\n\t\t\t'attr-title'  => __( 'Title Attribute' ),\n\t\t\t'css-classes' => __( 'CSS Classes' ),\n\t\t\t'xfn'         => __( 'Link Relationship (XFN)' ),\n\t\t\t'description' => __( 'Description' ),\n\t\t);\n\t}\n\n\t/**\n\t * An Underscore (JS) template for this panel's content (but not its container).\n\t *\n\t * Class variables for this panel class are available in the `data` JS object;\n\t * export custom variables by overriding WP_Customize_Panel::json().\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t *\n\t * @see WP_Customize_Panel::print_template()\n\t */\n\tprotected function content_template() {\n\t\t?>\n\t\t<li class=\"panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>\">\n\t\t\t<button type=\"button\" class=\"customize-panel-back\" tabindex=\"-1\">\n\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Back' ); ?></span>\n\t\t\t</button>\n\t\t\t<div class=\"accordion-section-title\">\n\t\t\t\t<span class=\"preview-notice\">\n\t\t\t\t\t<?php\n\t\t\t\t\t/* Translators: %s is the site/panel title in the Customizer. */\n\t\t\t\t\tprintf( __( 'You are customizing %s' ), '<strong class=\"panel-title\">{{ data.title }}</strong>' );\n\t\t\t\t\t?>\n\t\t\t\t</span>\n\t\t\t\t<button type=\"button\" class=\"customize-help-toggle dashicons dashicons-editor-help\" aria-expanded=\"false\">\n\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Help' ); ?></span>\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"customize-screen-options-toggle\" aria-expanded=\"false\">\n\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Menu Options' ); ?></span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<# if ( data.description ) { #>\n\t\t\t<div class=\"description customize-panel-description\">{{{ data.description }}}</div>\n\t\t\t<# } #>\n\t\t\t<div id=\"screen-options-wrap\">\n\t\t\t\t<?php $this->render_screen_options(); ?>\n\t\t\t</div>\n\t\t</li>\n\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-new-menu-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_New_Menu_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize control class for new menus.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Customize_New_Menu_Control extends WP_Customize_Control {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'new_menu';\n\n\t/**\n\t * Render the control's content.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t */\n\tpublic function render_content() {\n\t\t?>\n\t\t<button type=\"button\" class=\"button button-primary\" id=\"create-new-menu-submit\"><?php _e( 'Create Menu' ); ?></button>\n\t\t<span class=\"spinner\"></span>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-new-menu-section.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_New_Menu_Section class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Menu Section Class\n *\n * Implements the new-menu-ui toggle button instead of a regular section.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Section\n */\nclass WP_Customize_New_Menu_Section extends WP_Customize_Section {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'new_menu';\n\n\t/**\n\t * Render the section, and the controls that have been added to it.\n\t *\n\t * @since 4.3.0\n\t * @access protected\n\t */\n\tprotected function render() {\n\t\t?>\n\t\t<li id=\"accordion-section-<?php echo esc_attr( $this->id ); ?>\" class=\"accordion-section-new-menu\">\n\t\t\t<button type=\"button\" class=\"button-secondary add-new-menu-item add-menu-toggle\" aria-expanded=\"false\">\n\t\t\t\t<?php echo esc_html( $this->title ); ?>\n\t\t\t</button>\n\t\t\t<ul class=\"new-menu-section-content\"></ul>\n\t\t</li>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-sidebar-section.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Sidebar_Section class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customizer section representing widget area (sidebar).\n *\n * @since 4.1.0\n *\n * @see WP_Customize_Section\n */\nclass WP_Customize_Sidebar_Section extends WP_Customize_Section {\n\n\t/**\n\t * Type of this section.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'sidebar';\n\n\t/**\n\t * Unique identifier.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $sidebar_id;\n\n\t/**\n\t * Gather the parameters passed to client JavaScript via JSON.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @return array The array to be exported to the client as JSON.\n\t */\n\tpublic function json() {\n\t\t$json = parent::json();\n\t\t$json['sidebarId'] = $this->sidebar_id;\n\t\treturn $json;\n\t}\n\n\t/**\n\t * Whether the current sidebar is rendered on the page.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @return bool Whether sidebar is rendered.\n\t */\n\tpublic function active_callback() {\n\t\treturn $this->manager->widgets->is_sidebar_rendered( $this->sidebar_id );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-site-icon-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Site_Icon_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Site Icon control class.\n *\n * Used only for custom functionality in JavaScript.\n *\n * @since 4.3.0\n *\n * @see WP_Customize_Cropped_Image_Control\n */\nclass WP_Customize_Site_Icon_Control extends WP_Customize_Cropped_Image_Control {\n\n\t/**\n\t * Control type.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'site_icon';\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 4.3.0\n\t * @access public\n\t *\n\t * @param WP_Customize_Manager $manager Customizer bootstrap instance.\n\t * @param string               $id      Control ID.\n\t * @param array                $args    Optional. Arguments to override class property defaults.\n\t */\n\tpublic function __construct( $manager, $id, $args = array() ) {\n\t\tparent::__construct( $manager, $id, $args );\n\t\tadd_action( 'customize_controls_print_styles', 'wp_site_icon', 99 );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-theme-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Theme_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Theme Control class.\n *\n * @since 4.2.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Customize_Theme_Control extends WP_Customize_Control {\n\n\t/**\n\t * Customize control type.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'theme';\n\n\t/**\n\t * Theme object.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var WP_Theme\n\t */\n\tpublic $theme;\n\n\t/**\n\t * Refresh the parameters passed to the JavaScript via JSON.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @see WP_Customize_Control::to_json()\n\t */\n\tpublic function to_json() {\n\t\tparent::to_json();\n\t\t$this->json['theme'] = $this->theme;\n\t}\n\n\t/**\n\t * Don't render the control content from PHP, as it's rendered via JS on load.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t */\n\tpublic function render_content() {}\n\n\t/**\n\t * Render a JS template for theme display.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t */\n\tpublic function content_template() {\n\t\t$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );\n\t\t$active_url  = esc_url( remove_query_arg( 'theme', $current_url ) );\n\t\t$preview_url = esc_url( add_query_arg( 'theme', '__THEME__', $current_url ) ); // Token because esc_url() strips curly braces.\n\t\t$preview_url = str_replace( '__THEME__', '{{ data.theme.id }}', $preview_url );\n\t\t?>\n\t\t<# if ( data.theme.isActiveTheme ) { #>\n\t\t\t<div class=\"theme active\" tabindex=\"0\" data-preview-url=\"<?php echo esc_attr( $active_url ); ?>\" aria-describedby=\"{{ data.theme.id }}-action {{ data.theme.id }}-name\">\n\t\t<# } else { #>\n\t\t\t<div class=\"theme\" tabindex=\"0\" data-preview-url=\"<?php echo esc_attr( $preview_url ); ?>\" aria-describedby=\"{{ data.theme.id }}-action {{ data.theme.id }}-name\">\n\t\t<# } #>\n\n\t\t\t<# if ( data.theme.screenshot[0] ) { #>\n\t\t\t\t<div class=\"theme-screenshot\">\n\t\t\t\t\t<img data-src=\"{{ data.theme.screenshot[0] }}\" alt=\"\" />\n\t\t\t\t</div>\n\t\t\t<# } else { #>\n\t\t\t\t<div class=\"theme-screenshot blank\"></div>\n\t\t\t<# } #>\n\n\t\t\t<# if ( data.theme.isActiveTheme ) { #>\n\t\t\t\t<span class=\"more-details\" id=\"{{ data.theme.id }}-action\"><?php _e( 'Customize' ); ?></span>\n\t\t\t<# } else { #>\n\t\t\t\t<span class=\"more-details\" id=\"{{ data.theme.id }}-action\"><?php _e( 'Live Preview' ); ?></span>\n\t\t\t<# } #>\n\n\t\t\t<div class=\"theme-author\"><?php printf( __( 'By %s' ), '{{ data.theme.author }}' ); ?></div>\n\n\t\t\t<# if ( data.theme.isActiveTheme ) { #>\n\t\t\t\t<h3 class=\"theme-name\" id=\"{{ data.theme.id }}-name\">\n\t\t\t\t\t<?php\n\t\t\t\t\t/* translators: %s: theme name */\n\t\t\t\t\tprintf( __( '<span>Active:</span> %s' ), '{{{ data.theme.name }}}' );\n\t\t\t\t\t?>\n\t\t\t\t</h3>\n\t\t\t<# } else { #>\n\t\t\t\t<h3 class=\"theme-name\" id=\"{{ data.theme.id }}-name\">{{{ data.theme.name }}}</h3>\n\t\t\t\t<div class=\"theme-actions\">\n\t\t\t\t\t<button type=\"button\" class=\"button theme-details\"><?php _e( 'Theme Details' ); ?></button>\n\t\t\t\t</div>\n\t\t\t<# } #>\n\t\t</div>\n\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-themes-section.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Themes_Section class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Themes Section class.\n *\n * A UI container for theme controls, which behaves like a backwards Panel.\n *\n * @since 4.2.0\n *\n * @see WP_Customize_Section\n */\nclass WP_Customize_Themes_Section extends WP_Customize_Section {\n\n\t/**\n\t * Customize section type.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'themes';\n\n\t/**\n\t * Render the themes section, which behaves like a panel.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t */\n\tprotected function render() {\n\t\t$classes = 'accordion-section control-section control-section-' . $this->type;\n\t\t?>\n\t\t<li id=\"accordion-section-<?php echo esc_attr( $this->id ); ?>\" class=\"<?php echo esc_attr( $classes ); ?>\">\n\t\t\t<h3 class=\"accordion-section-title\">\n\t\t\t\t<?php\n\t\t\t\tif ( $this->manager->is_theme_active() ) {\n\t\t\t\t\techo '<span class=\"customize-action\">' . __( 'Active theme' ) . '</span> ' . $this->title;\n\t\t\t\t} else {\n\t\t\t\t\techo '<span class=\"customize-action\">' . __( 'Previewing theme' ) . '</span> ' . $this->title;\n\t\t\t\t}\n\t\t\t\t?>\n\n\t\t\t\t<?php if ( count( $this->controls ) > 0 ) : ?>\n\t\t\t\t\t<button type=\"button\" class=\"button change-theme\" tabindex=\"0\"><?php _ex( 'Change', 'theme' ); ?></button>\n\t\t\t\t<?php endif; ?>\n\t\t\t</h3>\n\t\t\t<div class=\"customize-themes-panel control-panel-content themes-php\">\n\t\t\t\t<h3 class=\"accordion-section-title customize-section-title\">\n\t\t\t\t\t<span class=\"customize-action\"><?php _e( 'Customizing' ); ?></span>\n\t\t\t\t\t<?php _e( 'Themes' ); ?>\n\t\t\t\t\t<span class=\"title-count theme-count\"><?php echo count( $this->controls ) + 1 /* Active theme */; ?></span>\n\t\t\t\t</h3>\n\t\t\t\t<h3 class=\"accordion-section-title customize-section-title\">\n\t\t\t\t\t<?php\n\t\t\t\t\tif ( $this->manager->is_theme_active() ) {\n\t\t\t\t\t\techo '<span class=\"customize-action\">' . __( 'Active theme' ) . '</span> ' . $this->title;\n\t\t\t\t\t} else {\n\t\t\t\t\t\techo '<span class=\"customize-action\">' . __( 'Previewing theme' ) . '</span> ' . $this->title;\n\t\t\t\t\t}\n\t\t\t\t\t?>\n\t\t\t\t\t<button type=\"button\" class=\"button customize-theme\"><?php _e( 'Customize' ); ?></button>\n\t\t\t\t</h3>\n\n\t\t\t\t<div class=\"theme-overlay\" tabindex=\"0\" role=\"dialog\" aria-label=\"<?php esc_attr_e( 'Theme Details' ); ?>\"></div>\n\n\t\t\t\t<div id=\"customize-container\"></div>\n\t\t\t\t<?php if ( count( $this->controls ) > 4 ) : ?>\n\t\t\t\t\t<p><label for=\"themes-filter\">\n\t\t\t\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Search installed themes&hellip;' ); ?></span>\n\t\t\t\t\t\t<input type=\"text\" id=\"themes-filter\" placeholder=\"<?php esc_attr_e( 'Search installed themes&hellip;' ); ?>\" />\n\t\t\t\t\t</label></p>\n\t\t\t\t<?php endif; ?>\n\t\t\t\t<div class=\"theme-browser rendered\">\n\t\t\t\t\t<ul class=\"themes accordion-section-content\">\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</li>\n<?php }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-customize-upload-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Customize_Upload_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Customize Upload Control Class.\n *\n * @since 3.4.0\n *\n * @see WP_Customize_Media_Control\n */\nclass WP_Customize_Upload_Control extends WP_Customize_Media_Control {\n\tpublic $type          = 'upload';\n\tpublic $mime_type     = '';\n\tpublic $button_labels = array();\n\tpublic $removed = ''; // unused\n\tpublic $context; // unused\n\tpublic $extensions = array(); // unused\n\n\t/**\n\t * Refresh the parameters passed to the JavaScript via JSON.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @uses WP_Customize_Media_Control::to_json()\n\t */\n\tpublic function to_json() {\n\t\tparent::to_json();\n\n\t\t$value = $this->value();\n\t\tif ( $value ) {\n\t\t\t// Get the attachment model for the existing file.\n\t\t\t$attachment_id = attachment_url_to_postid( $value );\n\t\t\tif ( $attachment_id ) {\n\t\t\t\t$this->json['attachment'] = wp_prepare_attachment_for_js( $attachment_id );\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-widget-area-customize-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Widget_Area_Customize_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 3.4.0\n */\n\n/**\n * Widget Area Customize Control class.\n *\n * @since 3.9.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Widget_Area_Customize_Control extends WP_Customize_Control {\n\n\t/**\n\t * Customize control type.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $type = 'sidebar_widgets';\n\n\t/**\n\t * Sidebar ID.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t * @var int|string\n\t */\n\tpublic $sidebar_id;\n\n\t/**\n\t * Refreshes the parameters passed to the JavaScript via JSON.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function to_json() {\n\t\tparent::to_json();\n\t\t$exported_properties = array( 'sidebar_id' );\n\t\tforeach ( $exported_properties as $key ) {\n\t\t\t$this->json[ $key ] = $this->$key;\n\t\t}\n\t}\n\n\t/**\n\t * Renders the control's content.\n\t *\n\t * @since 3.9.0\n\t * @access public\n\t */\n\tpublic function render_content() {\n\t\t$id = 'reorder-widgets-desc-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id );\n\t\t?>\n\t\t<button type=\"button\" class=\"button-secondary add-new-widget\" aria-expanded=\"false\" aria-controls=\"available-widgets\">\n\t\t\t<?php _e( 'Add a Widget' ); ?>\n\t\t</button>\n\t\t<button type=\"button\" class=\"button-link reorder-toggle\" aria-label=\"<?php esc_attr_e( 'Reorder widgets' ); ?>\" aria-describedby=\"<?php echo esc_attr( $id ); ?>\">\n\t\t\t<span class=\"reorder\"><?php _ex( 'Reorder', 'Reorder widgets in Customizer' ); ?></span>\n\t\t\t<span class=\"reorder-done\"><?php _ex( 'Done', 'Cancel reordering widgets in Customizer' ); ?></span>\n\t\t</button>\n\t\t<p class=\"screen-reader-text\" id=\"<?php echo esc_attr( $id ); ?>\"><?php _e( 'When in reorder mode, additional controls to reorder widgets will be available in the widgets list above.' ); ?></p>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/customize/class-wp-widget-form-customize-control.php",
    "content": "<?php\n/**\n * Customize API: WP_Widget_Form_Customize_Control class\n *\n * @package WordPress\n * @subpackage Customize\n * @since 4.4.0\n */\n\n/**\n * Widget Form Customize Control class.\n *\n * @since 3.9.0\n *\n * @see WP_Customize_Control\n */\nclass WP_Widget_Form_Customize_Control extends WP_Customize_Control {\n\tpublic $type = 'widget_form';\n\tpublic $widget_id;\n\tpublic $widget_id_base;\n\tpublic $sidebar_id;\n\tpublic $is_new = false;\n\tpublic $width;\n\tpublic $height;\n\tpublic $is_wide = false;\n\n\t/**\n\t * Gather control params for exporting to JavaScript.\n\t *\n\t * @global array $wp_registered_widgets\n\t */\n\tpublic function to_json() {\n\t\tglobal $wp_registered_widgets;\n\n\t\tparent::to_json();\n\t\t$exported_properties = array( 'widget_id', 'widget_id_base', 'sidebar_id', 'width', 'height', 'is_wide' );\n\t\tforeach ( $exported_properties as $key ) {\n\t\t\t$this->json[ $key ] = $this->$key;\n\t\t}\n\n\t\t// Get the widget_control and widget_content.\n\t\trequire_once ABSPATH . '/wp-admin/includes/widgets.php';\n\n\t\t$widget = $wp_registered_widgets[ $this->widget_id ];\n\t\tif ( ! isset( $widget['params'][0] ) ) {\n\t\t\t$widget['params'][0] = array();\n\t\t}\n\n\t\t$args = array(\n\t\t\t'widget_id' => $widget['id'],\n\t\t\t'widget_name' => $widget['name'],\n\t\t);\n\n\t\t$args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) );\n\t\t$widget_control_parts = $this->manager->widgets->get_widget_control_parts( $args );\n\n\t\t$this->json['widget_control'] = $widget_control_parts['control'];\n\t\t$this->json['widget_content'] = $widget_control_parts['content'];\n\t}\n\n\t/**\n\t * Override render_content to be no-op since content is exported via to_json for deferred embedding.\n\t */\n\tpublic function render_content() {}\n\n\t/**\n\t * Whether the current widget is rendered on the page.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @return bool Whether the widget is rendered.\n\t */\n\tpublic function active_callback() {\n\t\treturn $this->manager->widgets->is_widget_rendered( $this->widget_id );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/date.php",
    "content": "<?php\n/**\n * Class for generating SQL clauses that filter a primary query according to date.\n *\n * `WP_Date_Query` is a helper that allows primary query classes, such as {@see WP_Query},\n * to filter their results by date columns, by generating `WHERE` subclauses to be attached\n * to the primary SQL query string.\n *\n * Attempting to filter by an invalid date value (eg month=13) will generate SQL that will\n * return no results. In these cases, a _doing_it_wrong() error notice is also thrown.\n * See {@link WP_Date_Query::validate_date_values()}.\n *\n * @link https://codex.wordpress.org/Function_Reference/WP_Query Codex page.\n *\n * @since 3.7.0\n */\nclass WP_Date_Query {\n\t/**\n\t * Array of date queries.\n\t *\n\t * See {@see WP_Date_Query::__construct()} for information on date query arguments.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $queries = array();\n\n\t/**\n\t * The default relation between top-level queries. Can be either 'AND' or 'OR'.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $relation = 'AND';\n\n\t/**\n\t * The column to query against. Can be changed via the query arguments.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $column = 'post_date';\n\n\t/**\n\t * The value comparison operator. Can be changed via the query arguments.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $compare = '=';\n\n\t/**\n\t * Supported time-related parameter keys.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $time_keys = array( 'after', 'before', 'year', 'month', 'monthnum', 'week', 'w', 'dayofyear', 'day', 'dayofweek', 'dayofweek_iso', 'hour', 'minute', 'second' );\n\n\t/**\n\t * Constructor.\n\t *\n\t * Time-related parameters that normally require integer values ('year', 'month', 'week', 'dayofyear', 'day',\n\t * 'dayofweek', 'dayofweek_iso', 'hour', 'minute', 'second') accept arrays of integers for some values of\n\t * 'compare'. When 'compare' is 'IN' or 'NOT IN', arrays are accepted; when 'compare' is 'BETWEEN' or 'NOT\n\t * BETWEEN', arrays of two valid values are required. See individual argument descriptions for accepted values.\n\t *\n\t * @since 3.7.0\n\t * @since 4.0.0 The $inclusive logic was updated to include all times within the date range.\n\t * @since 4.1.0 Introduced 'dayofweek_iso' time type parameter.\n\t * @access public\n\t *\n\t * @param array $date_query {\n\t *     Array of date query clauses.\n\t *\n\t *     @type array {\n\t *         @type string $column   Optional. The column to query against. If undefined, inherits the value of\n\t *                                the `$default_column` parameter. Accepts 'post_date', 'post_date_gmt',\n\t *                                'post_modified','post_modified_gmt', 'comment_date', 'comment_date_gmt'.\n\t *                                Default 'post_date'.\n\t *         @type string $compare  Optional. The comparison operator. Accepts '=', '!=', '>', '>=', '<', '<=',\n\t *                                'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. Default '='.\n\t *         @type string $relation Optional. The boolean relationship between the date queries. Accepts 'OR' or 'AND'.\n\t *                                Default 'OR'.\n\t *         @type array {\n\t *             Optional. An array of first-order clause parameters, or another fully-formed date query.\n\t *\n\t *             @type string|array $before {\n\t *                 Optional. Date to retrieve posts before. Accepts `strtotime()`-compatible string,\n\t *                 or array of 'year', 'month', 'day' values.\n\t *\n\t *                 @type string $year  The four-digit year. Default empty. Accepts any four-digit year.\n\t *                 @type string $month Optional when passing array.The month of the year.\n\t *                                     Default (string:empty)|(array:1). Accepts numbers 1-12.\n\t *                 @type string $day   Optional when passing array.The day of the month.\n\t *                                     Default (string:empty)|(array:1). Accepts numbers 1-31.\n\t *             }\n\t *             @type string|array $after {\n\t *                 Optional. Date to retrieve posts after. Accepts `strtotime()`-compatible string,\n\t *                 or array of 'year', 'month', 'day' values.\n\t *\n\t *                 @type string $year  The four-digit year. Accepts any four-digit year. Default empty.\n\t *                 @type string $month Optional when passing array. The month of the year. Accepts numbers 1-12.\n\t *                                     Default (string:empty)|(array:12).\n\t *                 @type string $day   Optional when passing array.The day of the month. Accepts numbers 1-31.\n\t *                                     Default (string:empty)|(array:last day of month).\n\t *             }\n\t *             @type string       $column        Optional. Used to add a clause comparing a column other than the\n\t *                                               column specified in the top-level `$column` parameter. Accepts\n\t *                                               'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt',\n\t *                                               'comment_date', 'comment_date_gmt'. Default is the value of\n\t *                                               top-level `$column`.\n\t *             @type string       $compare       Optional. The comparison operator. Accepts '=', '!=', '>', '>=',\n\t *                                               '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. 'IN',\n\t *                                               'NOT IN', 'BETWEEN', and 'NOT BETWEEN'. Comparisons support\n\t *                                               arrays in some time-related parameters. Default '='.\n\t *             @type bool         $inclusive     Optional. Include results from dates specified in 'before' or\n\t *                                               'after'. Default false.\n\t *             @type int|array    $year          Optional. The four-digit year number. Accepts any four-digit year\n\t *                                               or an array of years if `$compare` supports it. Default empty.\n\t *             @type int|array    $month         Optional. The two-digit month number. Accepts numbers 1-12 or an\n\t *                                               array of valid numbers if `$compare` supports it. Default empty.\n\t *             @type int|array    $week          Optional. The week number of the year. Accepts numbers 0-53 or an\n\t *                                               array of valid numbers if `$compare` supports it. Default empty.\n\t *             @type int|array    $dayofyear     Optional. The day number of the year. Accepts numbers 1-366 or an\n\t *                                               array of valid numbers if `$compare` supports it.\n\t *             @type int|array    $day           Optional. The day of the month. Accepts numbers 1-31 or an array\n\t *                                               of valid numbers if `$compare` supports it. Default empty.\n\t *             @type int|array    $dayofweek     Optional. The day number of the week. Accepts numbers 1-7 (1 is\n\t *                                               Sunday) or an array of valid numbers if `$compare` supports it.\n\t *                                               Default empty.\n\t *             @type int|array    $dayofweek_iso Optional. The day number of the week (ISO). Accepts numbers 1-7\n\t *                                               (1 is Monday) or an array of valid numbers if `$compare` supports it.\n\t *                                               Default empty.\n\t *             @type int|array    $hour          Optional. The hour of the day. Accepts numbers 0-23 or an array\n\t *                                               of valid numbers if `$compare` supports it. Default empty.\n\t *             @type int|array    $minute        Optional. The minute of the hour. Accepts numbers 0-60 or an array\n\t *                                               of valid numbers if `$compare` supports it. Default empty.\n\t *             @type int|array    $second        Optional. The second of the minute. Accepts numbers 0-60 or an\n\t *                                               array of valid numbers if `$compare` supports it. Default empty.\n\t *         }\n\t *     }\n\t * }\n\t * @param array $default_column Optional. Default column to query against. Default 'post_date'.\n\t *                              Accepts 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt',\n\t *                              'comment_date', 'comment_date_gmt'.\n\t */\n\tpublic function __construct( $date_query, $default_column = 'post_date' ) {\n\n\t\tif ( isset( $date_query['relation'] ) && 'OR' === strtoupper( $date_query['relation'] ) ) {\n\t\t\t$this->relation = 'OR';\n\t\t} else {\n\t\t\t$this->relation = 'AND';\n\t\t}\n\n\t\tif ( ! is_array( $date_query ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Support for passing time-based keys in the top level of the $date_query array.\n\t\tif ( ! isset( $date_query[0] ) && ! empty( $date_query ) ) {\n\t\t\t$date_query = array( $date_query );\n\t\t}\n\n\t\tif ( empty( $date_query ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! empty( $date_query['column'] ) ) {\n\t\t\t$date_query['column'] = esc_sql( $date_query['column'] );\n\t\t} else {\n\t\t\t$date_query['column'] = esc_sql( $default_column );\n\t\t}\n\n\t\t$this->column = $this->validate_column( $this->column );\n\n\t\t$this->compare = $this->get_compare( $date_query );\n\n\t\t$this->queries = $this->sanitize_query( $date_query );\n\t}\n\n\t/**\n\t * Recursive-friendly query sanitizer.\n\t *\n\t * Ensures that each query-level clause has a 'relation' key, and that\n\t * each first-order clause contains all the necessary keys from\n\t * `$defaults`.\n\t *\n\t * @since 4.1.0\n\t * @access public\n\t *\n\t * @param array $queries\n\t * @param array $parent_query\n\t *\n\t * @return array Sanitized queries.\n\t */\n\tpublic function sanitize_query( $queries, $parent_query = null ) {\n\t\t$cleaned_query = array();\n\n\t\t$defaults = array(\n\t\t\t'column'   => 'post_date',\n\t\t\t'compare'  => '=',\n\t\t\t'relation' => 'AND',\n\t\t);\n\n\t\t// Numeric keys should always have array values.\n\t\tforeach ( $queries as $qkey => $qvalue ) {\n\t\t\tif ( is_numeric( $qkey ) && ! is_array( $qvalue ) ) {\n\t\t\t\tunset( $queries[ $qkey ] );\n\t\t\t}\n\t\t}\n\n\t\t// Each query should have a value for each default key. Inherit from the parent when possible.\n\t\tforeach ( $defaults as $dkey => $dvalue ) {\n\t\t\tif ( isset( $queries[ $dkey ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( isset( $parent_query[ $dkey ] ) ) {\n\t\t\t\t$queries[ $dkey ] = $parent_query[ $dkey ];\n\t\t\t} else {\n\t\t\t\t$queries[ $dkey ] = $dvalue;\n\t\t\t}\n\t\t}\n\n\t\t// Validate the dates passed in the query.\n\t\tif ( $this->is_first_order_clause( $queries ) ) {\n\t\t\t$this->validate_date_values( $queries );\n\t\t}\n\n\t\tforeach ( $queries as $key => $q ) {\n\t\t\tif ( ! is_array( $q ) || in_array( $key, $this->time_keys, true ) ) {\n\t\t\t\t// This is a first-order query. Trust the values and sanitize when building SQL.\n\t\t\t\t$cleaned_query[ $key ] = $q;\n\t\t\t} else {\n\t\t\t\t// Any array without a time key is another query, so we recurse.\n\t\t\t\t$cleaned_query[] = $this->sanitize_query( $q, $queries );\n\t\t\t}\n\t\t}\n\n\t\treturn $cleaned_query;\n\t}\n\n\t/**\n\t * Determine whether this is a first-order clause.\n\t *\n\t * Checks to see if the current clause has any time-related keys.\n\t * If so, it's first-order.\n\t *\n\t * @param  array $query Query clause.\n\t * @return bool True if this is a first-order clause.\n\t */\n\tprotected function is_first_order_clause( $query ) {\n\t\t$time_keys = array_intersect( $this->time_keys, array_keys( $query ) );\n\t\treturn ! empty( $time_keys );\n\t}\n\n\t/**\n\t * Determines and validates what comparison operator to use.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param array $query A date query or a date subquery.\n\t * @return string The comparison operator.\n\t */\n\tpublic function get_compare( $query ) {\n\t\tif ( ! empty( $query['compare'] ) && in_array( $query['compare'], array( '=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) )\n\t\t\treturn strtoupper( $query['compare'] );\n\n\t\treturn $this->compare;\n\t}\n\n\t/**\n\t * Validates the given date_query values and triggers errors if something is not valid.\n\t *\n\t * Note that date queries with invalid date ranges are allowed to\n\t * continue (though of course no items will be found for impossible dates).\n\t * This method only generates debug notices for these cases.\n\t *\n\t * @since  4.1.0\n\t * @access public\n\t *\n\t * @param  array $date_query The date_query array.\n\t * @return bool  True if all values in the query are valid, false if one or more fail.\n\t */\n\tpublic function validate_date_values( $date_query = array() ) {\n\t\tif ( empty( $date_query ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$valid = true;\n\n\t\t/*\n\t\t * Validate 'before' and 'after' up front, then let the\n\t\t * validation routine continue to be sure that all invalid\n\t\t * values generate errors too.\n\t\t */\n\t\tif ( array_key_exists( 'before', $date_query ) && is_array( $date_query['before'] ) ){\n\t\t\t$valid = $this->validate_date_values( $date_query['before'] );\n\t\t}\n\n\t\tif ( array_key_exists( 'after', $date_query ) && is_array( $date_query['after'] ) ){\n\t\t\t$valid = $this->validate_date_values( $date_query['after'] );\n\t\t}\n\n\t\t// Array containing all min-max checks.\n\t\t$min_max_checks = array();\n\n\t\t// Days per year.\n\t\tif ( array_key_exists( 'year', $date_query ) ) {\n\t\t\t/*\n\t\t\t * If a year exists in the date query, we can use it to get the days.\n\t\t\t * If multiple years are provided (as in a BETWEEN), use the first one.\n\t\t\t */\n\t\t\tif ( is_array( $date_query['year'] ) ) {\n\t\t\t\t$_year = reset( $date_query['year'] );\n\t\t\t} else {\n\t\t\t\t$_year = $date_query['year'];\n\t\t\t}\n\n\t\t\t$max_days_of_year = date( 'z', mktime( 0, 0, 0, 12, 31, $_year ) ) + 1;\n\t\t} else {\n\t\t\t// otherwise we use the max of 366 (leap-year)\n\t\t\t$max_days_of_year = 366;\n\t\t}\n\n\t\t$min_max_checks['dayofyear'] = array(\n\t\t\t'min' => 1,\n\t\t\t'max' => $max_days_of_year\n\t\t);\n\n\t\t// Days per week.\n\t\t$min_max_checks['dayofweek'] = array(\n\t\t\t'min' => 1,\n\t\t\t'max' => 7\n\t\t);\n\n\t\t// Days per week.\n\t\t$min_max_checks['dayofweek_iso'] = array(\n\t\t\t'min' => 1,\n\t\t\t'max' => 7\n\t\t);\n\n\t\t// Months per year.\n\t\t$min_max_checks['month'] = array(\n\t\t\t'min' => 1,\n\t\t\t'max' => 12\n\t\t);\n\n\t\t// Weeks per year.\n\t\tif ( isset( $_year ) ) {\n\t\t\t/*\n\t\t\t * If we have a specific year, use it to calculate number of weeks.\n\t\t\t * Note: the number of weeks in a year is the date in which Dec 28 appears.\n\t\t\t */\n\t\t\t$week_count = date( 'W', mktime( 0, 0, 0, 12, 28, $_year ) );\n\n\t\t} else {\n\t\t\t// Otherwise set the week-count to a maximum of 53.\n\t\t\t$week_count = 53;\n\t\t}\n\n\t\t$min_max_checks['week'] = array(\n\t\t\t'min' => 1,\n\t\t\t'max' => $week_count\n\t\t);\n\n\t\t// Days per month.\n\t\t$min_max_checks['day'] = array(\n\t\t\t'min' => 1,\n\t\t\t'max' => 31\n\t\t);\n\n\t\t// Hours per day.\n\t\t$min_max_checks['hour'] = array(\n\t\t\t'min' => 0,\n\t\t\t'max' => 23\n\t\t);\n\n\t\t// Minutes per hour.\n\t\t$min_max_checks['minute'] = array(\n\t\t\t'min' => 0,\n\t\t\t'max' => 59\n\t\t);\n\n\t\t// Seconds per minute.\n\t\t$min_max_checks['second'] = array(\n\t\t\t'min' => 0,\n\t\t\t'max' => 59\n\t\t);\n\n\t\t// Concatenate and throw a notice for each invalid value.\n\t\tforeach ( $min_max_checks as $key => $check ) {\n\t\t\tif ( ! array_key_exists( $key, $date_query ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Throw a notice for each failing value.\n\t\t\tforeach ( (array) $date_query[ $key ] as $_value ) {\n\t\t\t\t$is_between = $_value >= $check['min'] && $_value <= $check['max'];\n\n\t\t\t\tif ( ! is_numeric( $_value ) || ! $is_between ) {\n\t\t\t\t\t$error = sprintf(\n\t\t\t\t\t\t/* translators: Date query invalid date message: 1: invalid value, 2: type of value, 3: minimum valid value, 4: maximum valid value */\n\t\t\t\t\t\t__( 'Invalid value %1$s for %2$s. Expected value should be between %3$s and %4$s.' ),\n\t\t\t\t\t\t'<code>' . esc_html( $_value ) . '</code>',\n\t\t\t\t\t\t'<code>' . esc_html( $key ) . '</code>',\n\t\t\t\t\t\t'<code>' . esc_html( $check['min'] ) . '</code>',\n\t\t\t\t\t\t'<code>' . esc_html( $check['max'] ) . '</code>'\n\t\t\t\t\t);\n\n\t\t\t\t\t_doing_it_wrong( __CLASS__, $error, '4.1.0' );\n\n\t\t\t\t\t$valid = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we already have invalid date messages, don't bother running through checkdate().\n\t\tif ( ! $valid ) {\n\t\t\treturn $valid;\n\t\t}\n\n\t\t$day_month_year_error_msg = '';\n\n\t\t$day_exists   = array_key_exists( 'day', $date_query ) && is_numeric( $date_query['day'] );\n\t\t$month_exists = array_key_exists( 'month', $date_query ) && is_numeric( $date_query['month'] );\n\t\t$year_exists  = array_key_exists( 'year', $date_query ) && is_numeric( $date_query['year'] );\n\n\t\tif ( $day_exists && $month_exists && $year_exists ) {\n\t\t\t// 1. Checking day, month, year combination.\n\t\t\tif ( ! wp_checkdate( $date_query['month'], $date_query['day'], $date_query['year'], sprintf( '%s-%s-%s', $date_query['year'], $date_query['month'], $date_query['day'] ) ) ) {\n\t\t\t\t/* translators: 1: year, 2: month, 3: day of month */\n\t\t\t\t$day_month_year_error_msg = sprintf(\n\t\t\t\t\t__( 'The following values do not describe a valid date: year %1$s, month %2$s, day %3$s.' ),\n\t\t\t\t\t'<code>' . esc_html( $date_query['year'] ) . '</code>',\n\t\t\t\t\t'<code>' . esc_html( $date_query['month'] ) . '</code>',\n\t\t\t\t\t'<code>' . esc_html( $date_query['day'] ) . '</code>'\n\t\t\t\t);\n\n\t\t\t\t$valid = false;\n\t\t\t}\n\n\t\t} elseif ( $day_exists && $month_exists ) {\n\t\t\t/*\n\t\t\t * 2. checking day, month combination\n\t\t\t * We use 2012 because, as a leap year, it's the most permissive.\n\t\t\t */\n\t\t\tif ( ! wp_checkdate( $date_query['month'], $date_query['day'], 2012, sprintf( '2012-%s-%s', $date_query['month'], $date_query['day'] ) ) ) {\n\t\t\t\t/* translators: 1: month, 2: day of month */\n\t\t\t\t$day_month_year_error_msg = sprintf(\n\t\t\t\t\t__( 'The following values do not describe a valid date: month %1$s, day %2$s.' ),\n\t\t\t\t\t'<code>' . esc_html( $date_query['month'] ) . '</code>',\n\t\t\t\t\t'<code>' . esc_html( $date_query['day'] ) . '</code>'\n\t\t\t\t);\n\n\t\t\t\t$valid = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $day_month_year_error_msg ) ) {\n\t\t\t_doing_it_wrong( __CLASS__, $day_month_year_error_msg, '4.1.0' );\n\t\t}\n\n\t\treturn $valid;\n\t}\n\n\t/**\n\t * Validates a column name parameter.\n\t *\n\t * Column names without a table prefix (like 'post_date') are checked against a whitelist of\n\t * known tables, and then, if found, have a table prefix (such as 'wp_posts.') prepended.\n\t * Prefixed column names (such as 'wp_posts.post_date') bypass this whitelist check,\n\t * and are only sanitized to remove illegal characters.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param string $column The user-supplied column name.\n\t * @return string A validated column name value.\n\t */\n\tpublic function validate_column( $column ) {\n\t\tglobal $wpdb;\n\n\t\t$valid_columns = array(\n\t\t\t'post_date', 'post_date_gmt', 'post_modified',\n\t\t\t'post_modified_gmt', 'comment_date', 'comment_date_gmt',\n\t\t\t'user_registered',\n\t\t);\n\n\t\t// Attempt to detect a table prefix.\n\t\tif ( false === strpos( $column, '.' ) ) {\n\t\t\t/**\n\t\t\t * Filter the list of valid date query columns.\n\t\t\t *\n\t\t\t * @since 3.7.0\n\t\t\t * @since 4.1.0 Added 'user_registered' to the default recognized columns.\n\t\t\t *\n\t\t\t * @param array $valid_columns An array of valid date query columns. Defaults\n\t\t\t *                             are 'post_date', 'post_date_gmt', 'post_modified',\n\t\t\t *                             'post_modified_gmt', 'comment_date', 'comment_date_gmt',\n\t\t\t *\t                           'user_registered'\n\t\t\t */\n\t\t\tif ( ! in_array( $column, apply_filters( 'date_query_valid_columns', $valid_columns ) ) ) {\n\t\t\t\t$column = 'post_date';\n\t\t\t}\n\n\t\t\t$known_columns = array(\n\t\t\t\t$wpdb->posts => array(\n\t\t\t\t\t'post_date',\n\t\t\t\t\t'post_date_gmt',\n\t\t\t\t\t'post_modified',\n\t\t\t\t\t'post_modified_gmt',\n\t\t\t\t),\n\t\t\t\t$wpdb->comments => array(\n\t\t\t\t\t'comment_date',\n\t\t\t\t\t'comment_date_gmt',\n\t\t\t\t),\n\t\t\t\t$wpdb->users => array(\n\t\t\t\t\t'user_registered',\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// If it's a known column name, add the appropriate table prefix.\n\t\t\tforeach ( $known_columns as $table_name => $table_columns ) {\n\t\t\t\tif ( in_array( $column, $table_columns ) ) {\n\t\t\t\t\t$column = $table_name . '.' . $column;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// Remove unsafe characters.\n\t\treturn preg_replace( '/[^a-zA-Z0-9_$\\.]/', '', $column );\n\t}\n\n\t/**\n\t * Generate WHERE clause to be appended to a main query.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @return string MySQL WHERE clause.\n\t */\n\tpublic function get_sql() {\n\t\t$sql = $this->get_sql_clauses();\n\n\t\t$where = $sql['where'];\n\n\t\t/**\n\t\t * Filter the date query WHERE clause.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param string        $where WHERE clause of the date query.\n\t\t * @param WP_Date_Query $this  The WP_Date_Query instance.\n\t\t */\n\t\treturn apply_filters( 'get_date_sql', $where, $this );\n\t}\n\n\t/**\n\t * Generate SQL clauses to be appended to a main query.\n\t *\n\t * Called by the public {@see WP_Date_Query::get_sql()}, this method\n\t * is abstracted out to maintain parity with the other Query classes.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to the main query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tprotected function get_sql_clauses() {\n\t\t$sql = $this->get_sql_for_query( $this->queries );\n\n\t\tif ( ! empty( $sql['where'] ) ) {\n\t\t\t$sql['where'] = ' AND ' . $sql['where'];\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t/**\n\t * Generate SQL clauses for a single query array.\n\t *\n\t * If nested subqueries are found, this method recurses the tree to\n\t * produce the properly nested SQL.\n\t *\n\t * @since 4.1.0\n\t * @access protected\n\t *\n\t * @param array $query Query to parse.\n\t * @param int   $depth Optional. Number of tree levels deep we currently are.\n\t *                     Used to calculate indentation. Default 0.\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to a single query array.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tprotected function get_sql_for_query( $query, $depth = 0 ) {\n\t\t$sql_chunks = array(\n\t\t\t'join'  => array(),\n\t\t\t'where' => array(),\n\t\t);\n\n\t\t$sql = array(\n\t\t\t'join'  => '',\n\t\t\t'where' => '',\n\t\t);\n\n\t\t$indent = '';\n\t\tfor ( $i = 0; $i < $depth; $i++ ) {\n\t\t\t$indent .= \"  \";\n\t\t}\n\n\t\tforeach ( $query as $key => $clause ) {\n\t\t\tif ( 'relation' === $key ) {\n\t\t\t\t$relation = $query['relation'];\n\t\t\t} elseif ( is_array( $clause ) ) {\n\n\t\t\t\t// This is a first-order clause.\n\t\t\t\tif ( $this->is_first_order_clause( $clause ) ) {\n\t\t\t\t\t$clause_sql = $this->get_sql_for_clause( $clause, $query );\n\n\t\t\t\t\t$where_count = count( $clause_sql['where'] );\n\t\t\t\t\tif ( ! $where_count ) {\n\t\t\t\t\t\t$sql_chunks['where'][] = '';\n\t\t\t\t\t} elseif ( 1 === $where_count ) {\n\t\t\t\t\t\t$sql_chunks['where'][] = $clause_sql['where'][0];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )';\n\t\t\t\t\t}\n\n\t\t\t\t\t$sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] );\n\t\t\t\t// This is a subquery, so we recurse.\n\t\t\t\t} else {\n\t\t\t\t\t$clause_sql = $this->get_sql_for_query( $clause, $depth + 1 );\n\n\t\t\t\t\t$sql_chunks['where'][] = $clause_sql['where'];\n\t\t\t\t\t$sql_chunks['join'][]  = $clause_sql['join'];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Filter to remove empties.\n\t\t$sql_chunks['join']  = array_filter( $sql_chunks['join'] );\n\t\t$sql_chunks['where'] = array_filter( $sql_chunks['where'] );\n\n\t\tif ( empty( $relation ) ) {\n\t\t\t$relation = 'AND';\n\t\t}\n\n\t\t// Filter duplicate JOIN clauses and combine into a single string.\n\t\tif ( ! empty( $sql_chunks['join'] ) ) {\n\t\t\t$sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) );\n\t\t}\n\n\t\t// Generate a single WHERE clause with proper brackets and indentation.\n\t\tif ( ! empty( $sql_chunks['where'] ) ) {\n\t\t\t$sql['where'] = '( ' . \"\\n  \" . $indent . implode( ' ' . \"\\n  \" . $indent . $relation . ' ' . \"\\n  \" . $indent, $sql_chunks['where'] ) . \"\\n\" . $indent . ')';\n\t\t}\n\n\t\treturn $sql;\n\t}\n\n\t/**\n\t * Turns a single date clause into pieces for a WHERE clause.\n\t *\n\t * A wrapper for get_sql_for_clause(), included here for backward\n\t * compatibility while retaining the naming convention across Query classes.\n\t *\n\t * @since  3.7.0\n\t * @access protected\n\t *\n\t * @param  array $query Date query arguments.\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to the main query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tprotected function get_sql_for_subquery( $query ) {\n\t\treturn $this->get_sql_for_clause( $query, '' );\n\t}\n\n\t/**\n\t * Turns a first-order date query into SQL for a WHERE clause.\n\t *\n\t * @since  4.1.0\n\t * @access protected\n\t *\n\t * @param  array $query        Date query clause.\n\t * @param  array $parent_query Parent query of the current date query.\n\t * @return array {\n\t *     Array containing JOIN and WHERE SQL clauses to append to the main query.\n\t *\n\t *     @type string $join  SQL fragment to append to the main JOIN clause.\n\t *     @type string $where SQL fragment to append to the main WHERE clause.\n\t * }\n\t */\n\tprotected function get_sql_for_clause( $query, $parent_query ) {\n\t\tglobal $wpdb;\n\n\t\t// The sub-parts of a $where part.\n\t\t$where_parts = array();\n\n\t\t$column = ( ! empty( $query['column'] ) ) ? esc_sql( $query['column'] ) : $this->column;\n\n\t\t$column = $this->validate_column( $column );\n\n\t\t$compare = $this->get_compare( $query );\n\n\t\t$inclusive = ! empty( $query['inclusive'] );\n\n\t\t// Assign greater- and less-than values.\n\t\t$lt = '<';\n\t\t$gt = '>';\n\n\t\tif ( $inclusive ) {\n\t\t\t$lt .= '=';\n\t\t\t$gt .= '=';\n\t\t}\n\n\t\t// Range queries.\n\t\tif ( ! empty( $query['after'] ) )\n\t\t\t$where_parts[] = $wpdb->prepare( \"$column $gt %s\", $this->build_mysql_datetime( $query['after'], ! $inclusive ) );\n\n\t\tif ( ! empty( $query['before'] ) )\n\t\t\t$where_parts[] = $wpdb->prepare( \"$column $lt %s\", $this->build_mysql_datetime( $query['before'], $inclusive ) );\n\n\t\t// Specific value queries.\n\n\t\tif ( isset( $query['year'] ) && $value = $this->build_value( $compare, $query['year'] ) )\n\t\t\t$where_parts[] = \"YEAR( $column ) $compare $value\";\n\n\t\tif ( isset( $query['month'] ) && $value = $this->build_value( $compare, $query['month'] ) ) {\n\t\t\t$where_parts[] = \"MONTH( $column ) $compare $value\";\n\t\t} elseif ( isset( $query['monthnum'] ) && $value = $this->build_value( $compare, $query['monthnum'] ) ) {\n\t\t\t$where_parts[] = \"MONTH( $column ) $compare $value\";\n\t\t}\n\t\tif ( isset( $query['week'] ) && false !== ( $value = $this->build_value( $compare, $query['week'] ) ) ) {\n\t\t\t$where_parts[] = _wp_mysql_week( $column ) . \" $compare $value\";\n\t\t} elseif ( isset( $query['w'] ) && false !== ( $value = $this->build_value( $compare, $query['w'] ) ) ) {\n\t\t\t$where_parts[] = _wp_mysql_week( $column ) . \" $compare $value\";\n\t\t}\n\t\tif ( isset( $query['dayofyear'] ) && $value = $this->build_value( $compare, $query['dayofyear'] ) )\n\t\t\t$where_parts[] = \"DAYOFYEAR( $column ) $compare $value\";\n\n\t\tif ( isset( $query['day'] ) && $value = $this->build_value( $compare, $query['day'] ) )\n\t\t\t$where_parts[] = \"DAYOFMONTH( $column ) $compare $value\";\n\n\t\tif ( isset( $query['dayofweek'] ) && $value = $this->build_value( $compare, $query['dayofweek'] ) )\n\t\t\t$where_parts[] = \"DAYOFWEEK( $column ) $compare $value\";\n\n\t\tif ( isset( $query['dayofweek_iso'] ) && $value = $this->build_value( $compare, $query['dayofweek_iso'] ) )\n\t\t\t$where_parts[] = \"WEEKDAY( $column ) + 1 $compare $value\";\n\n\t\tif ( isset( $query['hour'] ) || isset( $query['minute'] ) || isset( $query['second'] ) ) {\n\t\t\t// Avoid notices.\n\t\t\tforeach ( array( 'hour', 'minute', 'second' ) as $unit ) {\n\t\t\t\tif ( ! isset( $query[ $unit ] ) ) {\n\t\t\t\t\t$query[ $unit ] = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $time_query = $this->build_time_query( $column, $compare, $query['hour'], $query['minute'], $query['second'] ) ) {\n\t\t\t\t$where_parts[] = $time_query;\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Return an array of 'join' and 'where' for compatibility\n\t\t * with other query classes.\n\t\t */\n\t\treturn array(\n\t\t\t'where' => $where_parts,\n\t\t\t'join'  => array(),\n\t\t);\n\t}\n\n\t/**\n\t * Builds and validates a value string based on the comparison operator.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param string $compare The compare operator to use\n\t * @param string|array $value The value\n\t * @return string|false|int The value to be used in SQL or false on error.\n\t */\n\tpublic function build_value( $compare, $value ) {\n\t\tif ( ! isset( $value ) )\n\t\t\treturn false;\n\n\t\tswitch ( $compare ) {\n\t\t\tcase 'IN':\n\t\t\tcase 'NOT IN':\n\t\t\t\t$value = (array) $value;\n\n\t\t\t\t// Remove non-numeric values.\n\t\t\t\t$value = array_filter( $value, 'is_numeric' );\n\n\t\t\t\tif ( empty( $value ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn '(' . implode( ',', array_map( 'intval', $value ) ) . ')';\n\n\t\t\tcase 'BETWEEN':\n\t\t\tcase 'NOT BETWEEN':\n\t\t\t\tif ( ! is_array( $value ) || 2 != count( $value ) ) {\n\t\t\t\t\t$value = array( $value, $value );\n\t\t\t\t} else {\n\t\t\t\t\t$value = array_values( $value );\n\t\t\t\t}\n\n\t\t\t\t// If either value is non-numeric, bail.\n\t\t\t\tforeach ( $value as $v ) {\n\t\t\t\t\tif ( ! is_numeric( $v ) ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$value = array_map( 'intval', $value );\n\n\t\t\t\treturn $value[0] . ' AND ' . $value[1];\n\n\t\t\tdefault;\n\t\t\t\tif ( ! is_numeric( $value ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn (int) $value;\n\t\t}\n\t}\n\n\t/**\n\t * Builds a MySQL format date/time based on some query parameters.\n\t *\n\t * You can pass an array of values (year, month, etc.) with missing parameter values being defaulted to\n\t * either the maximum or minimum values (controlled by the $default_to parameter). Alternatively you can\n\t * pass a string that that will be run through strtotime().\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param string|array $datetime       An array of parameters or a strotime() string\n\t * @param bool         $default_to_max Whether to round up incomplete dates. Supported by values\n\t *                                     of $datetime that are arrays, or string values that are a\n\t *                                     subset of MySQL date format ('Y', 'Y-m', 'Y-m-d', 'Y-m-d H:i').\n\t *                                     Default: false.\n\t * @return string|false A MySQL format date/time or false on failure\n\t */\n\tpublic function build_mysql_datetime( $datetime, $default_to_max = false ) {\n\t\t$now = current_time( 'timestamp' );\n\n\t\tif ( ! is_array( $datetime ) ) {\n\n\t\t\t/*\n\t\t\t * Try to parse some common date formats, so we can detect\n\t\t\t * the level of precision and support the 'inclusive' parameter.\n\t\t\t */\n\t\t\tif ( preg_match( '/^(\\d{4})$/', $datetime, $matches ) ) {\n\t\t\t\t// Y\n\t\t\t\t$datetime = array(\n\t\t\t\t\t'year' => intval( $matches[1] ),\n\t\t\t\t);\n\n\t\t\t} elseif ( preg_match( '/^(\\d{4})\\-(\\d{2})$/', $datetime, $matches ) ) {\n\t\t\t\t// Y-m\n\t\t\t\t$datetime = array(\n\t\t\t\t\t'year'  => intval( $matches[1] ),\n\t\t\t\t\t'month' => intval( $matches[2] ),\n\t\t\t\t);\n\n\t\t\t} elseif ( preg_match( '/^(\\d{4})\\-(\\d{2})\\-(\\d{2})$/', $datetime, $matches ) ) {\n\t\t\t\t// Y-m-d\n\t\t\t\t$datetime = array(\n\t\t\t\t\t'year'  => intval( $matches[1] ),\n\t\t\t\t\t'month' => intval( $matches[2] ),\n\t\t\t\t\t'day'   => intval( $matches[3] ),\n\t\t\t\t);\n\n\t\t\t} elseif ( preg_match( '/^(\\d{4})\\-(\\d{2})\\-(\\d{2}) (\\d{2}):(\\d{2})$/', $datetime, $matches ) ) {\n\t\t\t\t// Y-m-d H:i\n\t\t\t\t$datetime = array(\n\t\t\t\t\t'year'   => intval( $matches[1] ),\n\t\t\t\t\t'month'  => intval( $matches[2] ),\n\t\t\t\t\t'day'    => intval( $matches[3] ),\n\t\t\t\t\t'hour'   => intval( $matches[4] ),\n\t\t\t\t\t'minute' => intval( $matches[5] ),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If no match is found, we don't support default_to_max.\n\t\t\tif ( ! is_array( $datetime ) ) {\n\t\t\t\t// @todo Timezone issues here possibly\n\t\t\t\treturn gmdate( 'Y-m-d H:i:s', strtotime( $datetime, $now ) );\n\t\t\t}\n\t\t}\n\n\t\t$datetime = array_map( 'absint', $datetime );\n\n\t\tif ( ! isset( $datetime['year'] ) )\n\t\t\t$datetime['year'] = gmdate( 'Y', $now );\n\n\t\tif ( ! isset( $datetime['month'] ) )\n\t\t\t$datetime['month'] = ( $default_to_max ) ? 12 : 1;\n\n\t\tif ( ! isset( $datetime['day'] ) )\n\t\t\t$datetime['day'] = ( $default_to_max ) ? (int) date( 't', mktime( 0, 0, 0, $datetime['month'], 1, $datetime['year'] ) ) : 1;\n\n\t\tif ( ! isset( $datetime['hour'] ) )\n\t\t\t$datetime['hour'] = ( $default_to_max ) ? 23 : 0;\n\n\t\tif ( ! isset( $datetime['minute'] ) )\n\t\t\t$datetime['minute'] = ( $default_to_max ) ? 59 : 0;\n\n\t\tif ( ! isset( $datetime['second'] ) )\n\t\t\t$datetime['second'] = ( $default_to_max ) ? 59 : 0;\n\n\t\treturn sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $datetime['year'], $datetime['month'], $datetime['day'], $datetime['hour'], $datetime['minute'], $datetime['second'] );\n\t}\n\n\t/**\n\t * Builds a query string for comparing time values (hour, minute, second).\n\t *\n\t * If just hour, minute, or second is set than a normal comparison will be done.\n\t * However if multiple values are passed, a pseudo-decimal time will be created\n\t * in order to be able to accurately compare against.\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t *\n\t * @param string $column The column to query against. Needs to be pre-validated!\n\t * @param string $compare The comparison operator. Needs to be pre-validated!\n\t * @param int|null $hour Optional. An hour value (0-23).\n\t * @param int|null $minute Optional. A minute value (0-59).\n\t * @param int|null $second Optional. A second value (0-59).\n\t * @return string|false A query part or false on failure.\n\t */\n\tpublic function build_time_query( $column, $compare, $hour = null, $minute = null, $second = null ) {\n\t\tglobal $wpdb;\n\n\t\t// Have to have at least one\n\t\tif ( ! isset( $hour ) && ! isset( $minute ) && ! isset( $second ) )\n\t\t\treturn false;\n\n\t\t// Complex combined queries aren't supported for multi-value queries\n\t\tif ( in_array( $compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) {\n\t\t\t$return = array();\n\n\t\t\tif ( isset( $hour ) && false !== ( $value = $this->build_value( $compare, $hour ) ) )\n\t\t\t\t$return[] = \"HOUR( $column ) $compare $value\";\n\n\t\t\tif ( isset( $minute ) && false !== ( $value = $this->build_value( $compare, $minute ) ) )\n\t\t\t\t$return[] = \"MINUTE( $column ) $compare $value\";\n\n\t\t\tif ( isset( $second ) && false !== ( $value = $this->build_value( $compare, $second ) ) )\n\t\t\t\t$return[] = \"SECOND( $column ) $compare $value\";\n\n\t\t\treturn implode( ' AND ', $return );\n\t\t}\n\n\t\t// Cases where just one unit is set\n\t\tif ( isset( $hour ) && ! isset( $minute ) && ! isset( $second ) && false !== ( $value = $this->build_value( $compare, $hour ) ) ) {\n\t\t\treturn \"HOUR( $column ) $compare $value\";\n\t\t} elseif ( ! isset( $hour ) && isset( $minute ) && ! isset( $second ) && false !== ( $value = $this->build_value( $compare, $minute ) ) ) {\n\t\t\treturn \"MINUTE( $column ) $compare $value\";\n\t\t} elseif ( ! isset( $hour ) && ! isset( $minute ) && isset( $second ) && false !== ( $value = $this->build_value( $compare, $second ) ) ) {\n\t\t\treturn \"SECOND( $column ) $compare $value\";\n\t\t}\n\n\t\t// Single units were already handled. Since hour & second isn't allowed, minute must to be set.\n\t\tif ( ! isset( $minute ) )\n\t\t\treturn false;\n\n\t\t$format = $time = '';\n\n\t\t// Hour\n\t\tif ( null !== $hour ) {\n\t\t\t$format .= '%H.';\n\t\t\t$time   .= sprintf( '%02d', $hour ) . '.';\n\t\t} else {\n\t\t\t$format .= '0.';\n\t\t\t$time   .= '0.';\n\t\t}\n\n\t\t// Minute\n\t\t$format .= '%i';\n\t\t$time   .= sprintf( '%02d', $minute );\n\n\t\tif ( isset( $second ) ) {\n\t\t\t$format .= '%s';\n\t\t\t$time   .= sprintf( '%02d', $second );\n\t\t}\n\n\t\treturn $wpdb->prepare( \"DATE_FORMAT( $column, %s ) $compare %f\", $format, $time );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/default-constants.php",
    "content": "<?php\n/**\n * Defines constants and global variables that can be overridden, generally in wp-config.php.\n *\n * @package WordPress\n */\n\n/**\n * Defines initial WordPress constants\n *\n * @see wp_debug_mode()\n *\n * @since 3.0.0\n *\n * @global int $blog_id\n */\nfunction wp_initial_constants() {\n\tglobal $blog_id;\n\n\t// set memory limits\n\tif ( !defined('WP_MEMORY_LIMIT') ) {\n\t\tif ( is_multisite() ) {\n\t\t\tdefine('WP_MEMORY_LIMIT', '64M');\n\t\t} else {\n\t\t\tdefine('WP_MEMORY_LIMIT', '40M');\n\t\t}\n\t}\n\n\tif ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {\n\t\tdefine( 'WP_MAX_MEMORY_LIMIT', '256M' );\n\t}\n\n\tif ( ! isset($blog_id) )\n\t\t$blog_id = 1;\n\n\t// set memory limits.\n\tif ( function_exists( 'memory_get_usage' ) ) {\n\t\t$current_limit = @ini_get( 'memory_limit' );\n\t\t$current_limit_int = intval( $current_limit );\n\t\tif ( false !== strpos( $current_limit, 'G' ) )\n\t\t\t$current_limit_int *= 1024;\n\t\t$wp_limit_int = intval( WP_MEMORY_LIMIT );\n\t\tif ( false !== strpos( WP_MEMORY_LIMIT, 'G' ) )\n\t\t\t$wp_limit_int *= 1024;\n\n\t\tif ( -1 != $current_limit && ( -1 == WP_MEMORY_LIMIT || $current_limit_int < $wp_limit_int ) )\n\t\t\t@ini_set( 'memory_limit', WP_MEMORY_LIMIT );\n\t}\n\n\tif ( !defined('WP_CONTENT_DIR') )\n\t\tdefine( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' ); // no trailing slash, full paths only - WP_CONTENT_URL is defined further down\n\n\t// Add define('WP_DEBUG', true); to wp-config.php to enable display of notices during development.\n\tif ( !defined('WP_DEBUG') )\n\t\tdefine( 'WP_DEBUG', false );\n\n\t// Add define('WP_DEBUG_DISPLAY', null); to wp-config.php use the globally configured setting for\n\t// display_errors and not force errors to be displayed. Use false to force display_errors off.\n\tif ( !defined('WP_DEBUG_DISPLAY') )\n\t\tdefine( 'WP_DEBUG_DISPLAY', true );\n\n\t// Add define('WP_DEBUG_LOG', true); to enable error logging to wp-content/debug.log.\n\tif ( !defined('WP_DEBUG_LOG') )\n\t\tdefine('WP_DEBUG_LOG', false);\n\n\tif ( !defined('WP_CACHE') )\n\t\tdefine('WP_CACHE', false);\n\n\t// Add define('SCRIPT_DEBUG', true); to wp-config.php to enable loading of non-minified,\n\t// non-concatenated scripts and stylesheets.\n\tif ( ! defined( 'SCRIPT_DEBUG' ) ) {\n\t\tif ( ! empty( $GLOBALS['wp_version'] ) ) {\n\t\t\t$develop_src = false !== strpos( $GLOBALS['wp_version'], '-src' );\n\t\t} else {\n\t\t\t$develop_src = false;\n\t\t}\n\n\t\tdefine( 'SCRIPT_DEBUG', $develop_src );\n\t}\n\n\t/**\n\t * Private\n\t */\n\tif ( !defined('MEDIA_TRASH') )\n\t\tdefine('MEDIA_TRASH', false);\n\n\tif ( !defined('SHORTINIT') )\n\t\tdefine('SHORTINIT', false);\n\n\t// Constants for features added to WP that should short-circuit their plugin implementations\n\tdefine( 'WP_FEATURE_BETTER_PASSWORDS', true );\n\n\t/**#@+\n\t * Constants for expressing human-readable intervals\n\t * in their respective number of seconds.\n\t *\n\t * Please note that these values are approximate and are provided for convenience.\n\t * For example, MONTH_IN_SECONDS wrongly assumes every month has 30 days and\n\t * YEAR_IN_SECONDS does not take leap years into account.\n\t *\n\t * If you need more accuracy please consider using the DateTime class (http://php.net/manual/class.datetime.php).\n\t *\n\t * @since 3.5.0\n\t * @since 4.4.0 Introduced `MONTH_IN_SECONDS`.\n\t */\n\tdefine( 'MINUTE_IN_SECONDS', 60 );\n\tdefine( 'HOUR_IN_SECONDS',   60 * MINUTE_IN_SECONDS );\n\tdefine( 'DAY_IN_SECONDS',    24 * HOUR_IN_SECONDS   );\n\tdefine( 'WEEK_IN_SECONDS',    7 * DAY_IN_SECONDS    );\n\tdefine( 'MONTH_IN_SECONDS',  30 * DAY_IN_SECONDS    );\n\tdefine( 'YEAR_IN_SECONDS',  365 * DAY_IN_SECONDS    );\n\t/**#@-*/\n\n\t/**#@+\n\t * Constants for expressing human-readable data sizes in their respective number of bytes.\n\t *\n\t * @since 4.4.0\n\t */\n\tdefine( 'KB_IN_BYTES', 1024 );\n\tdefine( 'MB_IN_BYTES', 1024 * KB_IN_BYTES );\n\tdefine( 'GB_IN_BYTES', 1024 * MB_IN_BYTES );\n\tdefine( 'TB_IN_BYTES', 1024 * GB_IN_BYTES );\n\t/**#@-*/\n}\n\n/**\n * Defines plugin directory WordPress constants\n *\n * Defines must-use plugin directory constants, which may be overridden in the sunrise.php drop-in\n *\n * @since 3.0.0\n */\nfunction wp_plugin_directory_constants() {\n\tif ( !defined('WP_CONTENT_URL') )\n\t\tdefine( 'WP_CONTENT_URL', get_option('siteurl') . '/wp-content'); // full url - WP_CONTENT_DIR is defined further up\n\n\t/**\n\t * Allows for the plugins directory to be moved from the default location.\n\t *\n\t * @since 2.6.0\n\t */\n\tif ( !defined('WP_PLUGIN_DIR') )\n\t\tdefine( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' ); // full path, no trailing slash\n\n\t/**\n\t * Allows for the plugins directory to be moved from the default location.\n\t *\n\t * @since 2.6.0\n\t */\n\tif ( !defined('WP_PLUGIN_URL') )\n\t\tdefine( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' ); // full url, no trailing slash\n\n\t/**\n\t * Allows for the plugins directory to be moved from the default location.\n\t *\n\t * @since 2.1.0\n\t * @deprecated\n\t */\n\tif ( !defined('PLUGINDIR') )\n\t\tdefine( 'PLUGINDIR', 'wp-content/plugins' ); // Relative to ABSPATH. For back compat.\n\n\t/**\n\t * Allows for the mu-plugins directory to be moved from the default location.\n\t *\n\t * @since 2.8.0\n\t */\n\tif ( !defined('WPMU_PLUGIN_DIR') )\n\t\tdefine( 'WPMU_PLUGIN_DIR', WP_CONTENT_DIR . '/mu-plugins' ); // full path, no trailing slash\n\n\t/**\n\t * Allows for the mu-plugins directory to be moved from the default location.\n\t *\n\t * @since 2.8.0\n\t */\n\tif ( !defined('WPMU_PLUGIN_URL') )\n\t\tdefine( 'WPMU_PLUGIN_URL', WP_CONTENT_URL . '/mu-plugins' ); // full url, no trailing slash\n\n\t/**\n\t * Allows for the mu-plugins directory to be moved from the default location.\n\t *\n\t * @since 2.8.0\n\t * @deprecated\n\t */\n\tif ( !defined( 'MUPLUGINDIR' ) )\n\t\tdefine( 'MUPLUGINDIR', 'wp-content/mu-plugins' ); // Relative to ABSPATH. For back compat.\n}\n\n/**\n * Defines cookie related WordPress constants\n *\n * Defines constants after multisite is loaded.\n * @since 3.0.0\n */\nfunction wp_cookie_constants() {\n\t/**\n\t * Used to guarantee unique hash cookies\n\t *\n\t * @since 1.5.0\n\t */\n\tif ( !defined( 'COOKIEHASH' ) ) {\n\t\t$siteurl = get_site_option( 'siteurl' );\n\t\tif ( $siteurl )\n\t\t\tdefine( 'COOKIEHASH', md5( $siteurl ) );\n\t\telse\n\t\t\tdefine( 'COOKIEHASH', '' );\n\t}\n\n\t/**\n\t * @since 2.0.0\n\t */\n\tif ( !defined('USER_COOKIE') )\n\t\tdefine('USER_COOKIE', 'wordpressuser_' . COOKIEHASH);\n\n\t/**\n\t * @since 2.0.0\n\t */\n\tif ( !defined('PASS_COOKIE') )\n\t\tdefine('PASS_COOKIE', 'wordpresspass_' . COOKIEHASH);\n\n\t/**\n\t * @since 2.5.0\n\t */\n\tif ( !defined('AUTH_COOKIE') )\n\t\tdefine('AUTH_COOKIE', 'wordpress_' . COOKIEHASH);\n\n\t/**\n\t * @since 2.6.0\n\t */\n\tif ( !defined('SECURE_AUTH_COOKIE') )\n\t\tdefine('SECURE_AUTH_COOKIE', 'wordpress_sec_' . COOKIEHASH);\n\n\t/**\n\t * @since 2.6.0\n\t */\n\tif ( !defined('LOGGED_IN_COOKIE') )\n\t\tdefine('LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH);\n\n\t/**\n\t * @since 2.3.0\n\t */\n\tif ( !defined('TEST_COOKIE') )\n\t\tdefine('TEST_COOKIE', 'wordpress_test_cookie');\n\n\t/**\n\t * @since 1.2.0\n\t */\n\tif ( !defined('COOKIEPATH') )\n\t\tdefine('COOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('home') . '/' ) );\n\n\t/**\n\t * @since 1.5.0\n\t */\n\tif ( !defined('SITECOOKIEPATH') )\n\t\tdefine('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('siteurl') . '/' ) );\n\n\t/**\n\t * @since 2.6.0\n\t */\n\tif ( !defined('ADMIN_COOKIE_PATH') )\n\t\tdefine( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' );\n\n\t/**\n\t * @since 2.6.0\n\t */\n\tif ( !defined('PLUGINS_COOKIE_PATH') )\n\t\tdefine( 'PLUGINS_COOKIE_PATH', preg_replace('|https?://[^/]+|i', '', WP_PLUGIN_URL)  );\n\n\t/**\n\t * @since 2.0.0\n\t */\n\tif ( !defined('COOKIE_DOMAIN') )\n\t\tdefine('COOKIE_DOMAIN', false);\n}\n\n/**\n * Defines cookie related WordPress constants\n *\n * @since 3.0.0\n */\nfunction wp_ssl_constants() {\n\t/**\n\t * @since 2.6.0\n\t */\n\tif ( !defined( 'FORCE_SSL_ADMIN' ) ) {\n\t\tif ( 'https' === parse_url( get_option( 'siteurl' ), PHP_URL_SCHEME ) ) {\n\t\t\tdefine( 'FORCE_SSL_ADMIN', true );\n\t\t} else {\n\t\t\tdefine( 'FORCE_SSL_ADMIN', false );\n\t\t}\n\t}\n\tforce_ssl_admin( FORCE_SSL_ADMIN );\n\n\t/**\n\t * @since 2.6.0\n\t * @deprecated 4.0.0\n\t */\n\tif ( defined( 'FORCE_SSL_LOGIN' ) && FORCE_SSL_LOGIN ) {\n\t\tforce_ssl_admin( true );\n\t}\n}\n\n/**\n * Defines functionality related WordPress constants\n *\n * @since 3.0.0\n */\nfunction wp_functionality_constants() {\n\t/**\n\t * @since 2.5.0\n\t */\n\tif ( !defined( 'AUTOSAVE_INTERVAL' ) )\n\t\tdefine( 'AUTOSAVE_INTERVAL', 60 );\n\n\t/**\n\t * @since 2.9.0\n\t */\n\tif ( !defined( 'EMPTY_TRASH_DAYS' ) )\n\t\tdefine( 'EMPTY_TRASH_DAYS', 30 );\n\n\tif ( !defined('WP_POST_REVISIONS') )\n\t\tdefine('WP_POST_REVISIONS', true);\n\n\t/**\n\t * @since 3.3.0\n\t */\n\tif ( !defined( 'WP_CRON_LOCK_TIMEOUT' ) )\n\t\tdefine('WP_CRON_LOCK_TIMEOUT', 60);  // In seconds\n}\n\n/**\n * Defines templating related WordPress constants\n *\n * @since 3.0.0\n */\nfunction wp_templating_constants() {\n\t/**\n\t * Filesystem path to the current active template directory\n\t * @since 1.5.0\n\t */\n\tdefine('TEMPLATEPATH', get_template_directory());\n\n\t/**\n\t * Filesystem path to the current active template stylesheet directory\n\t * @since 2.1.0\n\t */\n\tdefine('STYLESHEETPATH', get_stylesheet_directory());\n\n\t/**\n\t * Slug of the default theme for this install.\n\t * Used as the default theme when installing new sites.\n\t * It will be used as the fallback if the current theme doesn't exist.\n\t *\n\t * @since 3.0.0\n\t * @see WP_Theme::get_core_default_theme()\n\t */\n\tif ( !defined('WP_DEFAULT_THEME') )\n\t\tdefine( 'WP_DEFAULT_THEME', 'twentysixteen' );\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/default-filters.php",
    "content": "<?php\n/**\n * Sets up the default filters and actions for most\n * of the WordPress hooks.\n *\n * If you need to remove a default hook, this file will\n * give you the priority for which to use to remove the\n * hook.\n *\n * Not all of the default hooks are found in default-filters.php\n *\n * @package WordPress\n */\n\n// Strip, trim, kses, special chars for string saves\nforeach ( array( 'pre_term_name', 'pre_comment_author_name', 'pre_link_name', 'pre_link_target', 'pre_link_rel', 'pre_user_display_name', 'pre_user_first_name', 'pre_user_last_name', 'pre_user_nickname' ) as $filter ) {\n\tadd_filter( $filter, 'sanitize_text_field'  );\n\tadd_filter( $filter, 'wp_filter_kses'       );\n\tadd_filter( $filter, '_wp_specialchars', 30 );\n}\n\n// Strip, kses, special chars for string display\nforeach ( array( 'term_name', 'comment_author_name', 'link_name', 'link_target', 'link_rel', 'user_display_name', 'user_first_name', 'user_last_name', 'user_nickname' ) as $filter ) {\n\tif ( is_admin() ) {\n\t\t// These are expensive. Run only on admin pages for defense in depth.\n\t\tadd_filter( $filter, 'sanitize_text_field'  );\n\t\tadd_filter( $filter, 'wp_kses_data'       );\n\t}\n\tadd_filter( $filter, '_wp_specialchars', 30 );\n}\n\n// Kses only for textarea saves\nforeach ( array( 'pre_term_description', 'pre_link_description', 'pre_link_notes', 'pre_user_description' ) as $filter ) {\n\tadd_filter( $filter, 'wp_filter_kses' );\n}\n\n// Kses only for textarea admin displays\nif ( is_admin() ) {\n\tforeach ( array( 'term_description', 'link_description', 'link_notes', 'user_description' ) as $filter ) {\n\t\tadd_filter( $filter, 'wp_kses_data' );\n\t}\n\tadd_filter( 'comment_text', 'wp_kses_post' );\n}\n\n// Email saves\nforeach ( array( 'pre_comment_author_email', 'pre_user_email' ) as $filter ) {\n\tadd_filter( $filter, 'trim'           );\n\tadd_filter( $filter, 'sanitize_email' );\n\tadd_filter( $filter, 'wp_filter_kses' );\n}\n\n// Email admin display\nforeach ( array( 'comment_author_email', 'user_email' ) as $filter ) {\n\tadd_filter( $filter, 'sanitize_email' );\n\tif ( is_admin() )\n\t\tadd_filter( $filter, 'wp_kses_data' );\n}\n\n// Save URL\nforeach ( array( 'pre_comment_author_url', 'pre_user_url', 'pre_link_url', 'pre_link_image',\n\t'pre_link_rss', 'pre_post_guid' ) as $filter ) {\n\tadd_filter( $filter, 'wp_strip_all_tags' );\n\tadd_filter( $filter, 'esc_url_raw'       );\n\tadd_filter( $filter, 'wp_filter_kses'    );\n}\n\n// Display URL\nforeach ( array( 'user_url', 'link_url', 'link_image', 'link_rss', 'comment_url', 'post_guid' ) as $filter ) {\n\tif ( is_admin() )\n\t\tadd_filter( $filter, 'wp_strip_all_tags' );\n\tadd_filter( $filter, 'esc_url'           );\n\tif ( is_admin() )\n\t\tadd_filter( $filter, 'wp_kses_data'    );\n}\n\n// Slugs\nadd_filter( 'pre_term_slug', 'sanitize_title' );\n\n// Keys\nforeach ( array( 'pre_post_type', 'pre_post_status', 'pre_post_comment_status', 'pre_post_ping_status' ) as $filter ) {\n\tadd_filter( $filter, 'sanitize_key' );\n}\n\n// Mime types\nadd_filter( 'pre_post_mime_type', 'sanitize_mime_type' );\nadd_filter( 'post_mime_type', 'sanitize_mime_type' );\n\n// Places to balance tags on input\nforeach ( array( 'content_save_pre', 'excerpt_save_pre', 'comment_save_pre', 'pre_comment_content' ) as $filter ) {\n\tadd_filter( $filter, 'convert_invalid_entities' );\n\tadd_filter( $filter, 'balanceTags', 50 );\n}\n\n// Format strings for display.\nforeach ( array( 'comment_author', 'term_name', 'link_name', 'link_description', 'link_notes', 'bloginfo', 'wp_title', 'widget_title' ) as $filter ) {\n\tadd_filter( $filter, 'wptexturize'   );\n\tadd_filter( $filter, 'convert_chars' );\n\tadd_filter( $filter, 'esc_html'      );\n}\n\n// Format WordPress\nforeach ( array( 'the_content', 'the_title', 'wp_title' ) as $filter )\n\tadd_filter( $filter, 'capital_P_dangit', 11 );\nadd_filter( 'comment_text', 'capital_P_dangit', 31 );\n\n// Format titles\nforeach ( array( 'single_post_title', 'single_cat_title', 'single_tag_title', 'single_month_title', 'nav_menu_attr_title', 'nav_menu_description' ) as $filter ) {\n\tadd_filter( $filter, 'wptexturize' );\n\tadd_filter( $filter, 'strip_tags'  );\n}\n\n// Format text area for display.\nforeach ( array( 'term_description' ) as $filter ) {\n\tadd_filter( $filter, 'wptexturize'      );\n\tadd_filter( $filter, 'convert_chars'    );\n\tadd_filter( $filter, 'wpautop'          );\n\tadd_filter( $filter, 'shortcode_unautop');\n}\n\n// Format for RSS\nadd_filter( 'term_name_rss', 'convert_chars' );\n\n// Pre save hierarchy\nadd_filter( 'wp_insert_post_parent', 'wp_check_post_hierarchy_for_loops', 10, 2 );\nadd_filter( 'wp_update_term_parent', 'wp_check_term_hierarchy_for_loops', 10, 3 );\n\n// Display filters\nadd_filter( 'the_title', 'wptexturize'   );\nadd_filter( 'the_title', 'convert_chars' );\nadd_filter( 'the_title', 'trim'          );\n\nadd_filter( 'the_content', 'wptexturize'                       );\nadd_filter( 'the_content', 'convert_smilies'                   );\nadd_filter( 'the_content', 'wpautop'                           );\nadd_filter( 'the_content', 'shortcode_unautop'                 );\nadd_filter( 'the_content', 'prepend_attachment'                );\nadd_filter( 'the_content', 'wp_make_content_images_responsive' );\n\nadd_filter( 'the_excerpt',     'wptexturize'      );\nadd_filter( 'the_excerpt',     'convert_smilies'  );\nadd_filter( 'the_excerpt',     'convert_chars'    );\nadd_filter( 'the_excerpt',     'wpautop'          );\nadd_filter( 'the_excerpt',     'shortcode_unautop');\nadd_filter( 'get_the_excerpt', 'wp_trim_excerpt'  );\n\nadd_filter( 'comment_text', 'wptexturize'            );\nadd_filter( 'comment_text', 'convert_chars'          );\nadd_filter( 'comment_text', 'make_clickable',      9 );\nadd_filter( 'comment_text', 'force_balance_tags', 25 );\nadd_filter( 'comment_text', 'convert_smilies',    20 );\nadd_filter( 'comment_text', 'wpautop',            30 );\n\nadd_filter( 'comment_excerpt', 'convert_chars' );\n\nadd_filter( 'list_cats',         'wptexturize' );\n\nadd_filter( 'wp_sprintf', 'wp_sprintf_l', 10, 2 );\n\nadd_filter( 'widget_text', 'balanceTags' );\n\nadd_filter( 'date_i18n', 'wp_maybe_decline_date' );\n\n// RSS filters\nadd_filter( 'the_title_rss',      'strip_tags'                    );\nadd_filter( 'the_title_rss',      'ent2ncr',                    8 );\nadd_filter( 'the_title_rss',      'esc_html'                      );\nadd_filter( 'the_content_rss',    'ent2ncr',                    8 );\nadd_filter( 'the_content_feed',   'wp_staticize_emoji'            );\nadd_filter( 'the_content_feed',   '_oembed_filter_feed_content'   );\nadd_filter( 'the_excerpt_rss',    'convert_chars'                 );\nadd_filter( 'the_excerpt_rss',    'ent2ncr',                    8 );\nadd_filter( 'comment_author_rss', 'ent2ncr',                    8 );\nadd_filter( 'comment_text_rss',   'ent2ncr',                    8 );\nadd_filter( 'comment_text_rss',   'esc_html'                      );\nadd_filter( 'comment_text_rss',   'wp_staticize_emoji'            );\nadd_filter( 'bloginfo_rss',       'ent2ncr',                    8 );\nadd_filter( 'the_author',         'ent2ncr',                    8 );\nadd_filter( 'the_guid',           'esc_url'                       );\n\n// Email filters\nadd_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );\n\n// Misc filters\nadd_filter( 'option_ping_sites',        'privacy_ping_filter'                 );\nadd_filter( 'option_blog_charset',      '_wp_specialchars'                    ); // IMPORTANT: This must not be wp_specialchars() or esc_html() or it'll cause an infinite loop\nadd_filter( 'option_blog_charset',      '_canonical_charset'                  );\nadd_filter( 'option_home',              '_config_wp_home'                     );\nadd_filter( 'option_siteurl',           '_config_wp_siteurl'                  );\nadd_filter( 'tiny_mce_before_init',     '_mce_set_direction'                  );\nadd_filter( 'teeny_mce_before_init',    '_mce_set_direction'                  );\nadd_filter( 'pre_kses',                 'wp_pre_kses_less_than'               );\nadd_filter( 'sanitize_title',           'sanitize_title_with_dashes',   10, 3 );\nadd_action( 'check_comment_flood',      'check_comment_flood_db',       10, 3 );\nadd_filter( 'comment_flood_filter',     'wp_throttle_comment_flood',    10, 3 );\nadd_filter( 'pre_comment_content',      'wp_rel_nofollow',              15    );\nadd_filter( 'comment_email',            'antispambot'                         );\nadd_filter( 'option_tag_base',          '_wp_filter_taxonomy_base'            );\nadd_filter( 'option_category_base',     '_wp_filter_taxonomy_base'            );\nadd_filter( 'the_posts',                '_close_comments_for_old_posts', 10, 2);\nadd_filter( 'comments_open',            '_close_comments_for_old_post', 10, 2 );\nadd_filter( 'pings_open',               '_close_comments_for_old_post', 10, 2 );\nadd_filter( 'editable_slug',            'urldecode'                           );\nadd_filter( 'editable_slug',            'esc_textarea'                        );\nadd_filter( 'nav_menu_meta_box_object', '_wp_nav_menu_meta_box_object'        );\nadd_filter( 'pingback_ping_source_uri', 'pingback_ping_source_uri'            );\nadd_filter( 'xmlrpc_pingback_error',    'xmlrpc_pingback_error'               );\nadd_filter( 'title_save_pre',           'trim'                                );\n\nadd_filter( 'http_request_host_is_external', 'allowed_http_request_hosts', 10, 2 );\n\n// REST API filters.\nadd_action( 'xmlrpc_rsd_apis',            'rest_output_rsd' );\nadd_action( 'wp_head',                    'rest_output_link_wp_head', 10, 0 );\nadd_action( 'template_redirect',          'rest_output_link_header', 11, 0 );\nadd_action( 'auth_cookie_malformed',      'rest_cookie_collect_status' );\nadd_action( 'auth_cookie_expired',        'rest_cookie_collect_status' );\nadd_action( 'auth_cookie_bad_username',   'rest_cookie_collect_status' );\nadd_action( 'auth_cookie_bad_hash',       'rest_cookie_collect_status' );\nadd_action( 'auth_cookie_valid',          'rest_cookie_collect_status' );\nadd_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );\n\n// Actions\nadd_action( 'wp_head',             '_wp_render_title_tag',            1     );\nadd_action( 'wp_head',             'wp_enqueue_scripts',              1     );\nadd_action( 'wp_head',             'feed_links',                      2     );\nadd_action( 'wp_head',             'feed_links_extra',                3     );\nadd_action( 'wp_head',             'rsd_link'                               );\nadd_action( 'wp_head',             'wlwmanifest_link'                       );\nadd_action( 'wp_head',             'adjacent_posts_rel_link_wp_head', 10, 0 );\nadd_action( 'wp_head',             'locale_stylesheet'                      );\nadd_action( 'publish_future_post', 'check_and_publish_future_post',   10, 1 );\nadd_action( 'wp_head',             'noindex',                          1    );\nadd_action( 'wp_head',             'print_emoji_detection_script',     7    );\nadd_action( 'wp_head',             'wp_print_styles',                  8    );\nadd_action( 'wp_head',             'wp_print_head_scripts',            9    );\nadd_action( 'wp_head',             'wp_generator'                           );\nadd_action( 'wp_head',             'rel_canonical'                          );\nadd_action( 'wp_head',             'wp_shortlink_wp_head',            10, 0 );\nadd_action( 'wp_head',             'wp_site_icon',                    99    );\nadd_action( 'wp_footer',           'wp_print_footer_scripts',         20    );\nadd_action( 'template_redirect',   'wp_shortlink_header',             11, 0 );\nadd_action( 'wp_print_footer_scripts', '_wp_footer_scripts'                 );\nadd_action( 'init',                'check_theme_switched',            99    );\nadd_action( 'after_switch_theme',  '_wp_sidebars_changed'                   );\nadd_action( 'wp_print_styles',     'print_emoji_styles'                     );\n\nif ( isset( $_GET['replytocom'] ) )\n    add_action( 'wp_head', 'wp_no_robots' );\n\n// Login actions\nadd_action( 'login_head',          'wp_print_head_scripts',         9     );\nadd_action( 'login_head',          'wp_site_icon',                  99    );\nadd_action( 'login_footer',        'wp_print_footer_scripts',       20    );\nadd_action( 'login_init',          'send_frame_options_header',     10, 0 );\n\n// Feed Generator Tags\nforeach ( array( 'rss2_head', 'commentsrss2_head', 'rss_head', 'rdf_header', 'atom_head', 'comments_atom_head', 'opml_head', 'app_head' ) as $action ) {\n\tadd_action( $action, 'the_generator' );\n}\n\n// Feed Site Icon\nadd_action( 'atom_head', 'atom_site_icon' );\nadd_action( 'rss2_head', 'rss2_site_icon' );\n\n\n// WP Cron\nif ( !defined( 'DOING_CRON' ) )\n\tadd_action( 'init', 'wp_cron' );\n\n// 2 Actions 2 Furious\nadd_action( 'do_feed_rdf',                'do_feed_rdf',                             10, 1 );\nadd_action( 'do_feed_rss',                'do_feed_rss',                             10, 1 );\nadd_action( 'do_feed_rss2',               'do_feed_rss2',                            10, 1 );\nadd_action( 'do_feed_atom',               'do_feed_atom',                            10, 1 );\nadd_action( 'do_pings',                   'do_all_pings',                            10, 1 );\nadd_action( 'do_robots',                  'do_robots'                                      );\nadd_action( 'set_comment_cookies',        'wp_set_comment_cookies',                  10, 2 );\nadd_action( 'sanitize_comment_cookies',   'sanitize_comment_cookies'                       );\nadd_action( 'admin_print_scripts',        'print_emoji_detection_script'                   );\nadd_action( 'admin_print_scripts',        'print_head_scripts',                      20    );\nadd_action( 'admin_print_footer_scripts', '_wp_footer_scripts'                             );\nadd_action( 'admin_print_styles',         'print_emoji_styles'                             );\nadd_action( 'admin_print_styles',         'print_admin_styles',                      20    );\nadd_action( 'init',                       'smilies_init',                             5    );\nadd_action( 'plugins_loaded',             'wp_maybe_load_widgets',                    0    );\nadd_action( 'plugins_loaded',             'wp_maybe_load_embeds',                     0    );\nadd_action( 'shutdown',                   'wp_ob_end_flush_all',                      1    );\n// Create a revision whenever a post is updated.\nadd_action( 'post_updated',               'wp_save_post_revision',                   10, 1 );\nadd_action( 'publish_post',               '_publish_post_hook',                       5, 1 );\nadd_action( 'transition_post_status',     '_transition_post_status',                  5, 3 );\nadd_action( 'transition_post_status',     '_update_term_count_on_transition_post_status', 10, 3 );\nadd_action( 'comment_form',               'wp_comment_form_unfiltered_html_nonce'          );\nadd_action( 'wp_scheduled_delete',        'wp_scheduled_delete'                            );\nadd_action( 'wp_scheduled_auto_draft_delete', 'wp_delete_auto_drafts'                      );\nadd_action( 'admin_init',                 'send_frame_options_header',               10, 0 );\nadd_action( 'importer_scheduled_cleanup', 'wp_delete_attachment'                           );\nadd_action( 'upgrader_scheduled_cleanup', 'wp_delete_attachment'                           );\nadd_action( 'welcome_panel',              'wp_welcome_panel'                               );\n\n// Navigation menu actions\nadd_action( 'delete_post',                '_wp_delete_post_menu_item'         );\nadd_action( 'delete_term',                '_wp_delete_tax_menu_item',   10, 3 );\nadd_action( 'transition_post_status',     '_wp_auto_add_pages_to_menu', 10, 3 );\n\n// Post Thumbnail CSS class filtering\nadd_action( 'begin_fetch_post_thumbnail_html', '_wp_post_thumbnail_class_filter_add'    );\nadd_action( 'end_fetch_post_thumbnail_html',   '_wp_post_thumbnail_class_filter_remove' );\n\n// Redirect Old Slugs\nadd_action( 'template_redirect',  'wp_old_slug_redirect'              );\nadd_action( 'post_updated',       'wp_check_for_changed_slugs', 12, 3 );\nadd_action( 'attachment_updated', 'wp_check_for_changed_slugs', 12, 3 );\n\n// Nonce check for Post Previews\nadd_action( 'init', '_show_post_preview' );\n\n// Output JS to reset window.name for previews\nadd_action( 'wp_head', 'wp_post_preview_js', 1 );\n\n// Timezone\nadd_filter( 'pre_option_gmt_offset','wp_timezone_override_offset' );\n\n// Admin Color Schemes\nadd_action( 'admin_init', 'register_admin_color_schemes', 1);\nadd_action( 'admin_color_scheme_picker', 'admin_color_scheme_picker' );\n\n// If the upgrade hasn't run yet, assume link manager is used.\nadd_filter( 'default_option_link_manager_enabled', '__return_true' );\n\n// This option no longer exists; tell plugins we always support auto-embedding.\nadd_filter( 'default_option_embed_autourls', '__return_true' );\n\n// Default settings for heartbeat\nadd_filter( 'heartbeat_settings', 'wp_heartbeat_settings' );\n\n// Check if the user is logged out\nadd_action( 'admin_enqueue_scripts', 'wp_auth_check_load' );\nadd_filter( 'heartbeat_send',        'wp_auth_check' );\nadd_filter( 'heartbeat_nopriv_send', 'wp_auth_check' );\n\n// Default authentication filters\nadd_filter( 'authenticate', 'wp_authenticate_username_password',  20, 3 );\nadd_filter( 'authenticate', 'wp_authenticate_spam_check',         99    );\nadd_filter( 'determine_current_user', 'wp_validate_auth_cookie'          );\nadd_filter( 'determine_current_user', 'wp_validate_logged_in_cookie', 20 );\n\n// Split term updates.\nadd_action( 'admin_init',        '_wp_check_for_scheduled_split_terms' );\nadd_action( 'split_shared_term', '_wp_check_split_default_terms',  10, 4 );\nadd_action( 'split_shared_term', '_wp_check_split_terms_in_menus', 10, 4 );\nadd_action( 'split_shared_term', '_wp_check_split_nav_menu_terms', 10, 4 );\nadd_action( 'wp_split_shared_term_batch', '_wp_batch_split_terms' );\n\n// Email notifications.\nadd_action( 'comment_post', 'wp_new_comment_notify_moderator' );\nadd_action( 'comment_post', 'wp_new_comment_notify_postauthor' );\nadd_action( 'after_password_reset', 'wp_password_change_notification' );\nadd_action( 'register_new_user',      'wp_send_new_user_notifications' );\nadd_action( 'edit_user_created_user', 'wp_send_new_user_notifications', 10, 2 );\n\n// REST API actions.\nadd_action( 'init',          'rest_api_init' );\nadd_action( 'rest_api_init', 'rest_api_default_filters', 10, 1 );\nadd_action( 'parse_request', 'rest_api_loaded' );\n\n/**\n * Filters formerly mixed into wp-includes\n */\n// Theme\nadd_action( 'wp_loaded', '_custom_header_background_just_in_time' );\nadd_action( 'plugins_loaded', '_wp_customize_include' );\nadd_action( 'admin_enqueue_scripts', '_wp_customize_loader_settings' );\nadd_action( 'delete_attachment', '_delete_attachment_theme_mod' );\n\n// Calendar widget cache\nadd_action( 'save_post', 'delete_get_calendar_cache' );\nadd_action( 'delete_post', 'delete_get_calendar_cache' );\nadd_action( 'update_option_start_of_week', 'delete_get_calendar_cache' );\nadd_action( 'update_option_gmt_offset', 'delete_get_calendar_cache' );\n\n// Author\nadd_action( 'transition_post_status', '__clear_multi_author_cache' );\n\n// Post\nadd_action( 'init', 'create_initial_post_types', 0 ); // highest priority\nadd_action( 'admin_menu', '_add_post_type_submenus' );\nadd_action( 'before_delete_post', '_reset_front_page_settings_for_post' );\nadd_action( 'wp_trash_post',      '_reset_front_page_settings_for_post' );\n\n// Post Formats\nadd_filter( 'request', '_post_format_request' );\nadd_filter( 'term_link', '_post_format_link', 10, 3 );\nadd_filter( 'get_post_format', '_post_format_get_term' );\nadd_filter( 'get_terms', '_post_format_get_terms', 10, 3 );\nadd_filter( 'wp_get_object_terms', '_post_format_wp_get_object_terms' );\n\n// KSES\nadd_action( 'init', 'kses_init' );\nadd_action( 'set_current_user', 'kses_init' );\n\n// Script Loader\nadd_action( 'wp_default_scripts', 'wp_default_scripts' );\nadd_filter( 'wp_print_scripts', 'wp_just_in_time_script_localization' );\nadd_filter( 'print_scripts_array', 'wp_prototype_before_jquery' );\n\nadd_action( 'wp_default_styles', 'wp_default_styles' );\nadd_filter( 'style_loader_src', 'wp_style_loader_src', 10, 2 );\n\n// Taxonomy\nadd_action( 'init', 'create_initial_taxonomies', 0 ); // highest priority\n\n// Canonical\nadd_action( 'template_redirect', 'redirect_canonical' );\nadd_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );\n\n// Shortcodes\nadd_filter( 'the_content', 'do_shortcode', 11 ); // AFTER wpautop()\n\n// Media\nadd_action( 'wp_playlist_scripts', 'wp_playlist_scripts' );\nadd_action( 'customize_controls_enqueue_scripts', 'wp_plupload_default_settings' );\n\n// Nav menu\nadd_filter( 'nav_menu_item_id', '_nav_menu_item_id_use_once', 10, 2 );\n\n// Widgets\nadd_action( 'init', 'wp_widgets_init', 1 );\n\n// Admin Bar\n// Don't remove. Wrong way to disable.\nadd_action( 'template_redirect', '_wp_admin_bar_init', 0 );\nadd_action( 'admin_init', '_wp_admin_bar_init' );\nadd_action( 'before_signup_header', '_wp_admin_bar_init' );\nadd_action( 'activate_header', '_wp_admin_bar_init' );\nadd_action( 'wp_footer', 'wp_admin_bar_render', 1000 );\nadd_action( 'in_admin_header', 'wp_admin_bar_render', 0 );\n\n// Former admin filters that can also be hooked on the front end\nadd_action( 'media_buttons', 'media_buttons' );\nadd_filter( 'image_send_to_editor', 'image_add_caption', 20, 8 );\nadd_filter( 'media_send_to_editor', 'image_media_send_to_editor', 10, 3 );\n\n// Embeds\nadd_action( 'rest_api_init',          'wp_oembed_register_route'              );\nadd_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );\n\nadd_action( 'wp_head',                'wp_oembed_add_discovery_links'         );\nadd_action( 'wp_head',                'wp_oembed_add_host_js'                 );\n\nadd_action( 'embed_head',             'enqueue_embed_scripts',           1    );\nadd_action( 'embed_head',             'print_emoji_detection_script'          );\nadd_action( 'embed_head',             'print_embed_styles'                    );\nadd_action( 'embed_head',             'wp_print_head_scripts',          20    );\nadd_action( 'embed_head',             'wp_print_styles',                20    );\nadd_action( 'embed_head',             'wp_no_robots'                          );\nadd_action( 'embed_head',             'rel_canonical'                         );\nadd_action( 'embed_head',             'locale_stylesheet'                     );\n\nadd_action( 'embed_content_meta',     'print_embed_comments_button'           );\nadd_action( 'embed_content_meta',     'print_embed_sharing_button'            );\n\nadd_action( 'embed_footer',           'print_embed_sharing_dialog'            );\nadd_action( 'embed_footer',           'print_embed_scripts'                   );\nadd_action( 'embed_footer',           'wp_print_footer_scripts',        20    );\n\nadd_filter( 'excerpt_more',           'wp_embed_excerpt_more',          20    );\nadd_filter( 'the_excerpt_embed',      'wptexturize'                           );\nadd_filter( 'the_excerpt_embed',      'convert_chars'                         );\nadd_filter( 'the_excerpt_embed',      'wpautop'                               );\nadd_filter( 'the_excerpt_embed',      'shortcode_unautop'                     );\nadd_filter( 'the_excerpt_embed',      'wp_embed_excerpt_attachment'           );\n\nadd_filter( 'oembed_dataparse',       'wp_filter_oembed_result',        10, 3 );\nadd_filter( 'oembed_response_data',   'get_oembed_response_data_rich',  10, 4 );\n\nunset( $filter, $action );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/default-widgets.php",
    "content": "<?php\n/**\n * Widget API: Default core widgets\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 2.8.0\n */\n\n/** WP_Widget_Pages class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-pages.php' );\n\n/** WP_Widget_Links class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-links.php' );\n\n/** WP_Widget_Search class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-search.php' );\n\n/** WP_Widget_Archives class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-archives.php' );\n\n/** WP_Widget_Meta class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-meta.php' );\n\n/** WP_Widget_Calendar class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-calendar.php' );\n\n/** WP_Widget_Text class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-text.php' );\n\n/** WP_Widget_Categories class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-categories.php' );\n\n/** WP_Widget_Recent_Posts class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-recent-posts.php' );\n\n/** WP_Widget_Recent_Comments class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-recent-comments.php' );\n\n/** WP_Widget_RSS class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-rss.php' );\n\n/** WP_Widget_Tag_Cloud class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-widget-tag-cloud.php' );\n\n/** WP_Nav_Menu_Widget class */\nrequire_once( ABSPATH . WPINC . '/widgets/class-wp-nav-menu-widget.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/deprecated.php",
    "content": "<?php\n/**\n * Deprecated functions from past WordPress versions. You shouldn't use these\n * functions and look for the alternatives instead. The functions will be\n * removed in a later version.\n *\n * @package WordPress\n * @subpackage Deprecated\n */\n\n/*\n * Deprecated functions come here to die.\n */\n\n/**\n * Entire Post data.\n *\n * @since 0.71\n * @deprecated 1.5.1 Use get_post()\n * @see get_post()\n *\n * @param int $postid\n * @return array\n */\nfunction get_postdata($postid) {\n\t_deprecated_function( __FUNCTION__, '1.5.1', 'get_post()' );\n\n\t$post = get_post($postid);\n\n\t$postdata = array (\n\t\t'ID' => $post->ID,\n\t\t'Author_ID' => $post->post_author,\n\t\t'Date' => $post->post_date,\n\t\t'Content' => $post->post_content,\n\t\t'Excerpt' => $post->post_excerpt,\n\t\t'Title' => $post->post_title,\n\t\t'Category' => $post->post_category,\n\t\t'post_status' => $post->post_status,\n\t\t'comment_status' => $post->comment_status,\n\t\t'ping_status' => $post->ping_status,\n\t\t'post_password' => $post->post_password,\n\t\t'to_ping' => $post->to_ping,\n\t\t'pinged' => $post->pinged,\n\t\t'post_type' => $post->post_type,\n\t\t'post_name' => $post->post_name\n\t);\n\n\treturn $postdata;\n}\n\n/**\n * Sets up the WordPress Loop.\n *\n * Use The Loop instead.\n *\n * @link https://codex.wordpress.org/The_Loop\n *\n * @since 1.0.1\n * @deprecated 1.5.0\n */\nfunction start_wp() {\n\tglobal $wp_query;\n\n\t_deprecated_function( __FUNCTION__, '1.5', __('new WordPress Loop') );\n\n\t// Since the old style loop is being used, advance the query iterator here.\n\t$wp_query->next_post();\n\n\tsetup_postdata( get_post() );\n}\n\n/**\n * Return or Print Category ID.\n *\n * @since 0.71\n * @deprecated 0.71 Use get_the_category()\n * @see get_the_category()\n *\n * @param bool $echo\n * @return null|int\n */\nfunction the_category_ID($echo = true) {\n\t_deprecated_function( __FUNCTION__, '0.71', 'get_the_category()' );\n\n\t// Grab the first cat in the list.\n\t$categories = get_the_category();\n\t$cat = $categories[0]->term_id;\n\n\tif ( $echo )\n\t\techo $cat;\n\n\treturn $cat;\n}\n\n/**\n * Print category with optional text before and after.\n *\n * @since 0.71\n * @deprecated 0.71 Use get_the_category_by_ID()\n * @see get_the_category_by_ID()\n *\n * @param string $before\n * @param string $after\n */\nfunction the_category_head($before='', $after='') {\n\tglobal $currentcat, $previouscat;\n\n\t_deprecated_function( __FUNCTION__, '0.71', 'get_the_category_by_ID()' );\n\n\t// Grab the first cat in the list.\n\t$categories = get_the_category();\n\t$currentcat = $categories[0]->category_id;\n\tif ( $currentcat != $previouscat ) {\n\t\techo $before;\n\t\techo get_the_category_by_ID($currentcat);\n\t\techo $after;\n\t\t$previouscat = $currentcat;\n\t}\n}\n\n/**\n * Prints link to the previous post.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use previous_post_link()\n * @see previous_post_link()\n *\n * @param string $format\n * @param string $previous\n * @param string $title\n * @param string $in_same_cat\n * @param int $limitprev\n * @param string $excluded_categories\n */\nfunction previous_post($format='%', $previous='previous post: ', $title='yes', $in_same_cat='no', $limitprev=1, $excluded_categories='') {\n\n\t_deprecated_function( __FUNCTION__, '2.0', 'previous_post_link()' );\n\n\tif ( empty($in_same_cat) || 'no' == $in_same_cat )\n\t\t$in_same_cat = false;\n\telse\n\t\t$in_same_cat = true;\n\n\t$post = get_previous_post($in_same_cat, $excluded_categories);\n\n\tif ( !$post )\n\t\treturn;\n\n\t$string = '<a href=\"'.get_permalink($post->ID).'\">'.$previous;\n\tif ( 'yes' == $title )\n\t\t$string .= apply_filters('the_title', $post->post_title, $post->ID);\n\t$string .= '</a>';\n\t$format = str_replace('%', $string, $format);\n\techo $format;\n}\n\n/**\n * Prints link to the next post.\n *\n * @since 0.71\n * @deprecated 2.0.0 Use next_post_link()\n * @see next_post_link()\n *\n * @param string $format\n * @param string $next\n * @param string $title\n * @param string $in_same_cat\n * @param int $limitnext\n * @param string $excluded_categories\n */\nfunction next_post($format='%', $next='next post: ', $title='yes', $in_same_cat='no', $limitnext=1, $excluded_categories='') {\n\t_deprecated_function( __FUNCTION__, '2.0', 'next_post_link()' );\n\n\tif ( empty($in_same_cat) || 'no' == $in_same_cat )\n\t\t$in_same_cat = false;\n\telse\n\t\t$in_same_cat = true;\n\n\t$post = get_next_post($in_same_cat, $excluded_categories);\n\n\tif ( !$post\t)\n\t\treturn;\n\n\t$string = '<a href=\"'.get_permalink($post->ID).'\">'.$next;\n\tif ( 'yes' == $title )\n\t\t$string .= apply_filters('the_title', $post->post_title, $post->ID);\n\t$string .= '</a>';\n\t$format = str_replace('%', $string, $format);\n\techo $format;\n}\n\n/**\n * Whether user can create a post.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $blog_id Not Used\n * @param int $category_id Not Used\n * @return bool\n */\nfunction user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t$author_data = get_userdata($user_id);\n\treturn ($author_data->user_level > 1);\n}\n\n/**\n * Whether user can create a post.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $blog_id Not Used\n * @param int $category_id Not Used\n * @return bool\n */\nfunction user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t$author_data = get_userdata($user_id);\n\treturn ($author_data->user_level >= 1);\n}\n\n/**\n * Whether user can edit a post.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $post_id\n * @param int $blog_id Not Used\n * @return bool\n */\nfunction user_can_edit_post($user_id, $post_id, $blog_id = 1) {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t$author_data = get_userdata($user_id);\n\t$post = get_post($post_id);\n\t$post_author_data = get_userdata($post->post_author);\n\n\tif ( (($user_id == $post_author_data->ID) && !($post->post_status == 'publish' && $author_data->user_level < 2))\n\t\t\t || ($author_data->user_level > $post_author_data->user_level)\n\t\t\t || ($author_data->user_level >= 10) ) {\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * Whether user can delete a post.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $post_id\n * @param int $blog_id Not Used\n * @return bool\n */\nfunction user_can_delete_post($user_id, $post_id, $blog_id = 1) {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t// right now if one can edit, one can delete\n\treturn user_can_edit_post($user_id, $post_id, $blog_id);\n}\n\n/**\n * Whether user can set new posts' dates.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $blog_id Not Used\n * @param int $category_id Not Used\n * @return bool\n */\nfunction user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t$author_data = get_userdata($user_id);\n\treturn (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id));\n}\n\n/**\n * Whether user can delete a post.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $post_id\n * @param int $blog_id Not Used\n * @return bool returns true if $user_id can edit $post_id's date\n */\nfunction user_can_edit_post_date($user_id, $post_id, $blog_id = 1) {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t$author_data = get_userdata($user_id);\n\treturn (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id));\n}\n\n/**\n * Whether user can delete a post.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $post_id\n * @param int $blog_id Not Used\n * @return bool returns true if $user_id can edit $post_id's comments\n */\nfunction user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t// right now if one can edit a post, one can edit comments made on it\n\treturn user_can_edit_post($user_id, $post_id, $blog_id);\n}\n\n/**\n * Whether user can delete a post.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $post_id\n * @param int $blog_id Not Used\n * @return bool returns true if $user_id can delete $post_id's comments\n */\nfunction user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t// right now if one can edit comments, one can delete comments\n\treturn user_can_edit_post_comments($user_id, $post_id, $blog_id);\n}\n\n/**\n * Can user can edit other user.\n *\n * @since 1.5.0\n * @deprecated 2.0.0 Use current_user_can()\n * @see current_user_can()\n *\n * @param int $user_id\n * @param int $other_user\n * @return bool\n */\nfunction user_can_edit_user($user_id, $other_user) {\n\t_deprecated_function( __FUNCTION__, '2.0', 'current_user_can()' );\n\n\t$user  = get_userdata($user_id);\n\t$other = get_userdata($other_user);\n\tif ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID )\n\t\treturn true;\n\telse\n\t\treturn false;\n}\n\n/**\n * Gets the links associated with category $cat_name.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use get_bookmarks()\n * @see get_bookmarks()\n *\n * @param string $cat_name Optional. The category name to use. If no match is found uses all.\n * @param string $before Optional. The html to output before the link.\n * @param string $after Optional. The html to output after the link.\n * @param string $between Optional. The html to output between the link/image and its description. Not used if no image or $show_images is true.\n * @param bool $show_images Optional. Whether to show images (if defined).\n * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', 'description' or 'rating'. Or maybe owner.\n *\t\tIf you start the name with an underscore the order will be reversed. You can also specify 'rand' as the order which will return links in a\n *\t\trandom order.\n * @param bool $show_description Optional. Whether to show the description if show_images=false/not defined.\n * @param bool $show_rating Optional. Show rating stars/chars.\n * @param int $limit\t\tOptional. Limit to X entries. If not specified, all entries are shown.\n * @param int $show_updated Optional. Whether to show last updated timestamp\n */\nfunction get_linksbyname($cat_name = \"noname\", $before = '', $after = '<br />', $between = \" \", $show_images = true, $orderby = 'id',\n\t\t\t\t\t\t $show_description = true, $show_rating = false,\n\t\t\t\t\t\t $limit = -1, $show_updated = 0) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_bookmarks()' );\n\n\t$cat_id = -1;\n\t$cat = get_term_by('name', $cat_name, 'link_category');\n\tif ( $cat )\n\t\t$cat_id = $cat->term_id;\n\n\tget_links($cat_id, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated);\n}\n\n/**\n * Gets the links associated with the named category.\n *\n * @since 1.0.1\n * @deprecated 2.1.0 Use wp_list_bookmarks()\n * @see wp_list_bookmarks()\n *\n * @param string $category The category to use.\n * @param string $args\n * @return string|null\n */\nfunction wp_get_linksbyname($category, $args = '') {\n\t_deprecated_function(__FUNCTION__, '2.1', 'wp_list_bookmarks()');\n\n\t$defaults = array(\n\t\t'after' => '<br />',\n\t\t'before' => '',\n\t\t'categorize' => 0,\n\t\t'category_after' => '',\n\t\t'category_before' => '',\n\t\t'category_name' => $category,\n\t\t'show_description' => 1,\n\t\t'title_li' => '',\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\treturn wp_list_bookmarks($r);\n}\n\n/**\n * Gets an array of link objects associated with category $cat_name.\n *\n *     $links = get_linkobjectsbyname( 'fred' );\n *     foreach ( $links as $link ) {\n *      \techo '<li>' . $link->link_name . '</li>';\n *     }\n *\n * @since 1.0.1\n * @deprecated 2.1.0 Use get_bookmarks()\n * @see get_bookmarks()\n *\n * @param string $cat_name The category name to use. If no match is found uses all.\n * @param string $orderby The order to output the links. E.g. 'id', 'name', 'url', 'description', or 'rating'.\n *\t\tOr maybe owner. If you start the name with an underscore the order will be reversed. You can also\n *\t\tspecify 'rand' as the order which will return links in a random order.\n * @param int $limit Limit to X entries. If not specified, all entries are shown.\n * @return array\n */\nfunction get_linkobjectsbyname($cat_name = \"noname\" , $orderby = 'name', $limit = -1) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_bookmarks()' );\n\n\t$cat_id = -1;\n\t$cat = get_term_by('name', $cat_name, 'link_category');\n\tif ( $cat )\n\t\t$cat_id = $cat->term_id;\n\n\treturn get_linkobjects($cat_id, $orderby, $limit);\n}\n\n/**\n * Gets an array of link objects associated with category n.\n *\n * Usage:\n *\n *     $links = get_linkobjects(1);\n *     if ($links) {\n *     \tforeach ($links as $link) {\n *     \t\techo '<li>'.$link->link_name.'<br />'.$link->link_description.'</li>';\n *     \t}\n *     }\n *\n * Fields are:\n *\n * - link_id\n * - link_url\n * - link_name\n * - link_image\n * - link_target\n * - link_category\n * - link_description\n * - link_visible\n * - link_owner\n * - link_rating\n * - link_updated\n * - link_rel\n * - link_notes\n *\n * @since 1.0.1\n * @deprecated 2.1.0 Use get_bookmarks()\n * @see get_bookmarks()\n *\n * @param int $category The category to use. If no category supplied uses all\n * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url',\n *\t\t'description', or 'rating'. Or maybe owner. If you start the name with an\n *\t\tunderscore the order will be reversed. You can also specify 'rand' as the\n *\t\torder which will return links in a random order.\n * @param int $limit Limit to X entries. If not specified, all entries are shown.\n * @return array\n */\nfunction get_linkobjects($category = 0, $orderby = 'name', $limit = 0) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_bookmarks()' );\n\n\t$links = get_bookmarks( array( 'category' => $category, 'orderby' => $orderby, 'limit' => $limit ) ) ;\n\n\t$links_array = array();\n\tforeach ($links as $link)\n\t\t$links_array[] = $link;\n\n\treturn $links_array;\n}\n\n/**\n * Gets the links associated with category 'cat_name' and display rating stars/chars.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use get_bookmarks()\n * @see get_bookmarks()\n *\n * @param string $cat_name The category name to use. If no match is found uses all\n * @param string $before The html to output before the link\n * @param string $after The html to output after the link\n * @param string $between The html to output between the link/image and its description. Not used if no image or show_images is true\n * @param bool $show_images Whether to show images (if defined).\n * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url',\n *\t\t'description', or 'rating'. Or maybe owner. If you start the name with an\n *\t\tunderscore the order will be reversed. You can also specify 'rand' as the\n *\t\torder which will return links in a random order.\n * @param bool $show_description Whether to show the description if show_images=false/not defined\n * @param int $limit Limit to X entries. If not specified, all entries are shown.\n * @param int $show_updated Whether to show last updated timestamp\n */\nfunction get_linksbyname_withrating($cat_name = \"noname\", $before = '', $after = '<br />', $between = \" \",\n\t\t\t\t\t\t\t\t\t$show_images = true, $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_bookmarks()' );\n\n\tget_linksbyname($cat_name, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated);\n}\n\n/**\n * Gets the links associated with category n and display rating stars/chars.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use get_bookmarks()\n * @see get_bookmarks()\n *\n * @param int $category The category to use. If no category supplied uses all\n * @param string $before The html to output before the link\n * @param string $after The html to output after the link\n * @param string $between The html to output between the link/image and its description. Not used if no image or show_images == true\n * @param bool $show_images Whether to show images (if defined).\n * @param string $orderby The order to output the links. E.g. 'id', 'name', 'url',\n *\t\t'description', or 'rating'. Or maybe owner. If you start the name with an\n *\t\tunderscore the order will be reversed. You can also specify 'rand' as the\n *\t\torder which will return links in a random order.\n * @param bool $show_description Whether to show the description if show_images=false/not defined.\n * @param int $limit Limit to X entries. If not specified, all entries are shown.\n * @param int $show_updated Whether to show last updated timestamp\n */\nfunction get_links_withrating($category = -1, $before = '', $after = '<br />', $between = \" \", $show_images = true,\n\t\t\t\t\t\t\t  $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_bookmarks()' );\n\n\tget_links($category, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated);\n}\n\n/**\n * Gets the auto_toggle setting.\n *\n * @since 0.71\n * @deprecated 2.1.0\n *\n * @param int $id The category to get. If no category supplied uses 0\n * @return int Only returns 0.\n */\nfunction get_autotoggle($id = 0) {\n\t_deprecated_function( __FUNCTION__, '2.1' );\n\treturn 0;\n}\n\n/**\n * Lists categories.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use wp_list_categories()\n * @see wp_list_categories()\n *\n * @param int $optionall\n * @param string $all\n * @param string $sort_column\n * @param string $sort_order\n * @param string $file\n * @param bool $list\n * @param int $optiondates\n * @param int $optioncount\n * @param int $hide_empty\n * @param int $use_desc_for_title\n * @param bool $children\n * @param int $child_of\n * @param int $categories\n * @param int $recurse\n * @param string $feed\n * @param string $feed_image\n * @param string $exclude\n * @param bool $hierarchical\n * @return false|null\n */\nfunction list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0,\n\t\t\t\t   $optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=false, $child_of=0, $categories=0,\n\t\t\t\t   $recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=false) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_list_categories()' );\n\n\t$query = compact('optionall', 'all', 'sort_column', 'sort_order', 'file', 'list', 'optiondates', 'optioncount', 'hide_empty', 'use_desc_for_title', 'children',\n\t\t'child_of', 'categories', 'recurse', 'feed', 'feed_image', 'exclude', 'hierarchical');\n\treturn wp_list_cats($query);\n}\n\n/**\n * Lists categories.\n *\n * @since 1.2.0\n * @deprecated 2.1.0 Use wp_list_categories()\n * @see wp_list_categories()\n *\n * @param string|array $args\n * @return false|null|string\n */\nfunction wp_list_cats($args = '') {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_list_categories()' );\n\n\t$r = wp_parse_args( $args );\n\n\t// Map to new names.\n\tif ( isset($r['optionall']) && isset($r['all']))\n\t\t$r['show_option_all'] = $r['all'];\n\tif ( isset($r['sort_column']) )\n\t\t$r['orderby'] = $r['sort_column'];\n\tif ( isset($r['sort_order']) )\n\t\t$r['order'] = $r['sort_order'];\n\tif ( isset($r['optiondates']) )\n\t\t$r['show_last_update'] = $r['optiondates'];\n\tif ( isset($r['optioncount']) )\n\t\t$r['show_count'] = $r['optioncount'];\n\tif ( isset($r['list']) )\n\t\t$r['style'] = $r['list'] ? 'list' : 'break';\n\t$r['title_li'] = '';\n\n\treturn wp_list_categories($r);\n}\n\n/**\n * Deprecated method for generating a drop-down of categories.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use wp_dropdown_categories()\n * @see wp_dropdown_categories()\n *\n * @param int $optionall\n * @param string $all\n * @param string $orderby\n * @param string $order\n * @param int $show_last_update\n * @param int $show_count\n * @param int $hide_empty\n * @param bool $optionnone\n * @param int $selected\n * @param int $exclude\n * @return string\n */\nfunction dropdown_cats($optionall = 1, $all = 'All', $orderby = 'ID', $order = 'asc',\n\t\t$show_last_update = 0, $show_count = 0, $hide_empty = 1, $optionnone = false,\n\t\t$selected = 0, $exclude = 0) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_dropdown_categories()' );\n\n\t$show_option_all = '';\n\tif ( $optionall )\n\t\t$show_option_all = $all;\n\n\t$show_option_none = '';\n\tif ( $optionnone )\n\t\t$show_option_none = __('None');\n\n\t$vars = compact('show_option_all', 'show_option_none', 'orderby', 'order',\n\t\t\t\t\t'show_last_update', 'show_count', 'hide_empty', 'selected', 'exclude');\n\t$query = add_query_arg($vars, '');\n\treturn wp_dropdown_categories($query);\n}\n\n/**\n * Lists authors.\n *\n * @since 1.2.0\n * @deprecated 2.1.0 Use wp_list_authors()\n * @see wp_list_authors()\n *\n * @param bool $optioncount\n * @param bool $exclude_admin\n * @param bool $show_fullname\n * @param bool $hide_empty\n * @param string $feed\n * @param string $feed_image\n * @return null|string\n */\nfunction list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_list_authors()' );\n\n\t$args = compact('optioncount', 'exclude_admin', 'show_fullname', 'hide_empty', 'feed', 'feed_image');\n\treturn wp_list_authors($args);\n}\n\n/**\n * Retrieves a list of post categories.\n *\n * @since 1.0.1\n * @deprecated 2.1.0 Use wp_get_post_categories()\n * @see wp_get_post_categories()\n *\n * @param int $blogid Not Used\n * @param int $post_ID\n * @return array\n */\nfunction wp_get_post_cats($blogid = '1', $post_ID = 0) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_get_post_categories()' );\n\treturn wp_get_post_categories($post_ID);\n}\n\n/**\n * Sets the categories that the post id belongs to.\n *\n * @since 1.0.1\n * @deprecated 2.1.0\n * @deprecated Use wp_set_post_categories()\n * @see wp_set_post_categories()\n *\n * @param int $blogid Not used\n * @param int $post_ID\n * @param array $post_categories\n * @return bool|mixed\n */\nfunction wp_set_post_cats($blogid = '1', $post_ID = 0, $post_categories = array()) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_set_post_categories()' );\n\treturn wp_set_post_categories($post_ID, $post_categories);\n}\n\n/**\n * Retrieves a list of archives.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use wp_get_archives()\n * @see wp_get_archives()\n *\n * @param string $type\n * @param string $limit\n * @param string $format\n * @param string $before\n * @param string $after\n * @param bool $show_post_count\n * @return string|null\n */\nfunction get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_get_archives()' );\n\t$args = compact('type', 'limit', 'format', 'before', 'after', 'show_post_count');\n\treturn wp_get_archives($args);\n}\n\n/**\n * Returns or Prints link to the author's posts.\n *\n * @since 1.2.0\n * @deprecated 2.1.0 Use get_author_posts_url()\n * @see get_author_posts_url()\n *\n * @param bool $echo\n * @param int $author_id\n * @param string $author_nicename Optional.\n * @return string|null\n */\nfunction get_author_link($echo, $author_id, $author_nicename = '') {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_author_posts_url()' );\n\n\t$link = get_author_posts_url($author_id, $author_nicename);\n\n\tif ( $echo )\n\t\techo $link;\n\treturn $link;\n}\n\n/**\n * Print list of pages based on arguments.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use wp_link_pages()\n * @see wp_link_pages()\n *\n * @param string $before\n * @param string $after\n * @param string $next_or_number\n * @param string $nextpagelink\n * @param string $previouspagelink\n * @param string $pagelink\n * @param string $more_file\n * @return string\n */\nfunction link_pages($before='<br />', $after='<br />', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page',\n\t\t\t\t\t$pagelink='%', $more_file='') {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_link_pages()' );\n\n\t$args = compact('before', 'after', 'next_or_number', 'nextpagelink', 'previouspagelink', 'pagelink', 'more_file');\n\treturn wp_link_pages($args);\n}\n\n/**\n * Get value based on option.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use get_option()\n * @see get_option()\n *\n * @param string $option\n * @return string\n */\nfunction get_settings($option) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_option()' );\n\n\treturn get_option($option);\n}\n\n/**\n * Print the permalink of the current post in the loop.\n *\n * @since 0.71\n * @deprecated 1.2.0 Use the_permalink()\n * @see the_permalink()\n */\nfunction permalink_link() {\n\t_deprecated_function( __FUNCTION__, '1.2', 'the_permalink()' );\n\tthe_permalink();\n}\n\n/**\n * Print the permalink to the RSS feed.\n *\n * @since 0.71\n * @deprecated 2.3.0 Use the_permalink_rss()\n * @see the_permalink_rss()\n *\n * @param string $deprecated\n */\nfunction permalink_single_rss($deprecated = '') {\n\t_deprecated_function( __FUNCTION__, '2.3', 'the_permalink_rss()' );\n\tthe_permalink_rss();\n}\n\n/**\n * Gets the links associated with category.\n *\n * @since 1.0.1\n * @deprecated 2.1.0 Use wp_list_bookmarks()\n * @see wp_list_bookmarks()\n *\n * @param string $args a query string\n * @return null|string\n */\nfunction wp_get_links($args = '') {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_list_bookmarks()' );\n\n\tif ( strpos( $args, '=' ) === false ) {\n\t\t$cat_id = $args;\n\t\t$args = add_query_arg( 'category', $cat_id, $args );\n\t}\n\n\t$defaults = array(\n\t\t'after' => '<br />',\n\t\t'before' => '',\n\t\t'between' => ' ',\n\t\t'categorize' => 0,\n\t\t'category' => '',\n\t\t'echo' => true,\n\t\t'limit' => -1,\n\t\t'orderby' => 'name',\n\t\t'show_description' => true,\n\t\t'show_images' => true,\n\t\t'show_rating' => false,\n\t\t'show_updated' => true,\n\t\t'title_li' => '',\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\treturn wp_list_bookmarks($r);\n}\n\n/**\n * Gets the links associated with category by id.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use get_bookmarks()\n * @see get_bookmarks()\n *\n * @param int $category The category to use. If no category supplied uses all\n * @param string $before the html to output before the link\n * @param string $after the html to output after the link\n * @param string $between the html to output between the link/image and its description.\n *\t\tNot used if no image or show_images == true\n * @param bool $show_images whether to show images (if defined).\n * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url',\n *\t\t'description', or 'rating'. Or maybe owner. If you start the name with an\n *\t\tunderscore the order will be reversed. You can also specify 'rand' as the order\n *\t\twhich will return links in a random order.\n * @param bool $show_description whether to show the description if show_images=false/not defined.\n * @param bool $show_rating show rating stars/chars\n * @param int $limit Limit to X entries. If not specified, all entries are shown.\n * @param int $show_updated whether to show last updated timestamp\n * @param bool $echo whether to echo the results, or return them instead\n * @return null|string\n */\nfunction get_links($category = -1, $before = '', $after = '<br />', $between = ' ', $show_images = true, $orderby = 'name',\n\t\t\t$show_description = true, $show_rating = false, $limit = -1, $show_updated = 1, $echo = true) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_bookmarks()' );\n\n\t$order = 'ASC';\n\tif ( substr($orderby, 0, 1) == '_' ) {\n\t\t$order = 'DESC';\n\t\t$orderby = substr($orderby, 1);\n\t}\n\n\tif ( $category == -1 ) //get_bookmarks uses '' to signify all categories\n\t\t$category = '';\n\n\t$results = get_bookmarks(array('category' => $category, 'orderby' => $orderby, 'order' => $order, 'show_updated' => $show_updated, 'limit' => $limit));\n\n\tif ( !$results )\n\t\treturn;\n\n\t$output = '';\n\n\tforeach ( (array) $results as $row ) {\n\t\tif ( !isset($row->recently_updated) )\n\t\t\t$row->recently_updated = false;\n\t\t$output .= $before;\n\t\tif ( $show_updated && $row->recently_updated )\n\t\t\t$output .= get_option('links_recently_updated_prepend');\n\t\t$the_link = '#';\n\t\tif ( !empty($row->link_url) )\n\t\t\t$the_link = esc_url($row->link_url);\n\t\t$rel = $row->link_rel;\n\t\tif ( '' != $rel )\n\t\t\t$rel = ' rel=\"' . $rel . '\"';\n\n\t\t$desc = esc_attr(sanitize_bookmark_field('link_description', $row->link_description, $row->link_id, 'display'));\n\t\t$name = esc_attr(sanitize_bookmark_field('link_name', $row->link_name, $row->link_id, 'display'));\n\t\t$title = $desc;\n\n\t\tif ( $show_updated )\n\t\t\tif (substr($row->link_updated_f, 0, 2) != '00')\n\t\t\t\t$title .= ' ('.__('Last updated') . ' ' . date(get_option('links_updated_date_format'), $row->link_updated_f + (get_option('gmt_offset') * HOUR_IN_SECONDS)) . ')';\n\n\t\tif ( '' != $title )\n\t\t\t$title = ' title=\"' . $title . '\"';\n\n\t\t$alt = ' alt=\"' . $name . '\"';\n\n\t\t$target = $row->link_target;\n\t\tif ( '' != $target )\n\t\t\t$target = ' target=\"' . $target . '\"';\n\n\t\t$output .= '<a href=\"' . $the_link . '\"' . $rel . $title . $target. '>';\n\n\t\tif ( $row->link_image != null && $show_images ) {\n\t\t\tif ( strpos($row->link_image, 'http') !== false )\n\t\t\t\t$output .= \"<img src=\\\"$row->link_image\\\" $alt $title />\";\n\t\t\telse // If it's a relative path\n\t\t\t\t$output .= \"<img src=\\\"\" . get_option('siteurl') . \"$row->link_image\\\" $alt $title />\";\n\t\t} else {\n\t\t\t$output .= $name;\n\t\t}\n\n\t\t$output .= '</a>';\n\n\t\tif ( $show_updated && $row->recently_updated )\n\t\t\t$output .= get_option('links_recently_updated_append');\n\n\t\tif ( $show_description && '' != $desc )\n\t\t\t$output .= $between . $desc;\n\n\t\tif ($show_rating) {\n\t\t\t$output .= $between . get_linkrating($row);\n\t\t}\n\n\t\t$output .= \"$after\\n\";\n\t} // end while\n\n\tif ( !$echo )\n\t\treturn $output;\n\techo $output;\n}\n\n/**\n * Output entire list of links by category.\n *\n * Output a list of all links, listed by category, using the settings in\n * $wpdb->linkcategories and output it as a nested HTML unordered list.\n *\n * @since 1.0.1\n * @deprecated 2.1.0 Use wp_list_bookmarks()\n * @see wp_list_bookmarks()\n *\n * @param string $order Sort link categories by 'name' or 'id'\n */\nfunction get_links_list($order = 'name') {\n\t_deprecated_function( __FUNCTION__, '2.1', 'wp_list_bookmarks()' );\n\n\t$order = strtolower($order);\n\n\t// Handle link category sorting\n\t$direction = 'ASC';\n\tif ( '_' == substr($order,0,1) ) {\n\t\t$direction = 'DESC';\n\t\t$order = substr($order,1);\n\t}\n\n\tif ( !isset($direction) )\n\t\t$direction = '';\n\n\t$cats = get_categories(array('type' => 'link', 'orderby' => $order, 'order' => $direction, 'hierarchical' => 0));\n\n\t// Display each category\n\tif ( $cats ) {\n\t\tforeach ( (array) $cats as $cat ) {\n\t\t\t// Handle each category.\n\n\t\t\t// Display the category name\n\t\t\techo '  <li id=\"linkcat-' . $cat->term_id . '\" class=\"linkcat\"><h2>' . apply_filters('link_category', $cat->name ) . \"</h2>\\n\\t<ul>\\n\";\n\t\t\t// Call get_links() with all the appropriate params\n\t\t\tget_links($cat->term_id, '<li>', \"</li>\", \"\\n\", true, 'name', false);\n\n\t\t\t// Close the last category\n\t\t\techo \"\\n\\t</ul>\\n</li>\\n\";\n\t\t}\n\t}\n}\n\n/**\n * Show the link to the links popup and the number of links.\n *\n * @since 0.71\n * @deprecated 2.1.0\n *\n * @param string $text the text of the link\n * @param int $width the width of the popup window\n * @param int $height the height of the popup window\n * @param string $file the page to open in the popup window\n * @param bool $count the number of links in the db\n */\nfunction links_popup_script($text = 'Links', $width=400, $height=400, $file='links.all.php', $count = true) {\n\t_deprecated_function( __FUNCTION__, '2.1' );\n}\n\n/**\n * @since 1.0.1\n * @deprecated 2.1.0 Use sanitize_bookmark_field()\n * @see sanitize_bookmark_field()\n *\n * @param object $link\n * @return mixed\n */\nfunction get_linkrating($link) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'sanitize_bookmark_field()' );\n\treturn sanitize_bookmark_field('link_rating', $link->link_rating, $link->link_id, 'display');\n}\n\n/**\n * Gets the name of category by id.\n *\n * @since 0.71\n * @deprecated 2.1.0 Use get_category()\n * @see get_category()\n *\n * @param int $id The category to get. If no category supplied uses 0\n * @return string\n */\nfunction get_linkcatname($id = 0) {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_category()' );\n\n\t$id = (int) $id;\n\n\tif ( empty($id) )\n\t\treturn '';\n\n\t$cats = wp_get_link_cats($id);\n\n\tif ( empty($cats) || ! is_array($cats) )\n\t\treturn '';\n\n\t$cat_id = (int) $cats[0]; // Take the first cat.\n\n\t$cat = get_category($cat_id);\n\treturn $cat->name;\n}\n\n/**\n * Print RSS comment feed link.\n *\n * @since 1.0.1\n * @deprecated 2.5.0 Use post_comments_feed_link()\n * @see post_comments_feed_link()\n *\n * @param string $link_text\n */\nfunction comments_rss_link($link_text = 'Comments RSS') {\n\t_deprecated_function( __FUNCTION__, '2.5', 'post_comments_feed_link()' );\n\tpost_comments_feed_link($link_text);\n}\n\n/**\n * Print/Return link to category RSS2 feed.\n *\n * @since 1.2.0\n * @deprecated 2.5.0 Use get_category_feed_link()\n * @see get_category_feed_link()\n *\n * @param bool $echo\n * @param int $cat_ID\n * @return string\n */\nfunction get_category_rss_link($echo = false, $cat_ID = 1) {\n\t_deprecated_function( __FUNCTION__, '2.5', 'get_category_feed_link()' );\n\n\t$link = get_category_feed_link($cat_ID, 'rss2');\n\n\tif ( $echo )\n\t\techo $link;\n\treturn $link;\n}\n\n/**\n * Print/Return link to author RSS feed.\n *\n * @since 1.2.0\n * @deprecated 2.5.0 Use get_author_feed_link()\n * @see get_author_feed_link()\n *\n * @param bool $echo\n * @param int $author_id\n * @return string\n */\nfunction get_author_rss_link($echo = false, $author_id = 1) {\n\t_deprecated_function( __FUNCTION__, '2.5', 'get_author_feed_link()' );\n\n\t$link = get_author_feed_link($author_id);\n\tif ( $echo )\n\t\techo $link;\n\treturn $link;\n}\n\n/**\n * Return link to the post RSS feed.\n *\n * @since 1.5.0\n * @deprecated 2.2.0 Use get_post_comments_feed_link()\n * @see get_post_comments_feed_link()\n *\n * @return string\n */\nfunction comments_rss() {\n\t_deprecated_function( __FUNCTION__, '2.2', 'get_post_comments_feed_link()' );\n\treturn esc_url( get_post_comments_feed_link() );\n}\n\n/**\n * An alias of wp_create_user().\n *\n * @since 2.0.0\n * @deprecated 2.0.0 Use wp_create_user()\n * @see wp_create_user()\n *\n * @param string $username The user's username.\n * @param string $password The user's password.\n * @param string $email    The user's email.\n * @return int The new user's ID.\n */\nfunction create_user($username, $password, $email) {\n\t_deprecated_function( __FUNCTION__, '2.0', 'wp_create_user()' );\n\treturn wp_create_user($username, $password, $email);\n}\n\n/**\n * Unused function.\n *\n * @deprecated 2.5.0\n*/\nfunction gzip_compression() {\n\t_deprecated_function( __FUNCTION__, '2.5' );\n\treturn false;\n}\n\n/**\n * Retrieve an array of comment data about comment $comment_ID.\n *\n * @since 0.71\n * @deprecated 2.7.0 Use get_comment()\n * @see get_comment()\n *\n * @param int $comment_ID The ID of the comment\n * @param int $no_cache Whether to use the cache (cast to bool)\n * @param bool $include_unapproved Whether to include unapproved comments\n * @return array The comment data\n */\nfunction get_commentdata( $comment_ID, $no_cache = 0, $include_unapproved = false ) {\n\t_deprecated_function( __FUNCTION__, '2.7', 'get_comment()' );\n\treturn get_comment($comment_ID, ARRAY_A);\n}\n\n/**\n * Retrieve the category name by the category ID.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use get_cat_name()\n * @see get_cat_name()\n *\n * @param int $cat_ID Category ID\n * @return string category name\n */\nfunction get_catname( $cat_ID ) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_cat_name()' );\n\treturn get_cat_name( $cat_ID );\n}\n\n/**\n * Retrieve category children list separated before and after the term IDs.\n *\n * @since 1.2.0\n * @deprecated 2.8.0 Use get_term_children()\n * @see get_term_children()\n *\n * @param int $id Category ID to retrieve children.\n * @param string $before Optional. Prepend before category term ID.\n * @param string $after Optional, default is empty string. Append after category term ID.\n * @param array $visited Optional. Category Term IDs that have already been added.\n * @return string\n */\nfunction get_category_children( $id, $before = '/', $after = '', $visited = array() ) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_term_children()' );\n\tif ( 0 == $id )\n\t\treturn '';\n\n\t$chain = '';\n\t/** TODO: consult hierarchy */\n\t$cat_ids = get_all_category_ids();\n\tforeach ( (array) $cat_ids as $cat_id ) {\n\t\tif ( $cat_id == $id )\n\t\t\tcontinue;\n\n\t\t$category = get_category( $cat_id );\n\t\tif ( is_wp_error( $category ) )\n\t\t\treturn $category;\n\t\tif ( $category->parent == $id && !in_array( $category->term_id, $visited ) ) {\n\t\t\t$visited[] = $category->term_id;\n\t\t\t$chain .= $before.$category->term_id.$after;\n\t\t\t$chain .= get_category_children( $category->term_id, $before, $after );\n\t\t}\n\t}\n\treturn $chain;\n}\n\n/**\n * Retrieves all category IDs.\n *\n * @since 2.0.0\n * @deprecated 4.0.0 Use get_terms()\n * @see get_terms()\n *\n * @link https://codex.wordpress.org/Function_Reference/get_all_category_ids\n *\n * @return object List of all of the category IDs.\n */\nfunction get_all_category_ids() {\n\t_deprecated_function( __FUNCTION__, '4.0', 'get_terms()' );\n\n\tif ( ! $cat_ids = wp_cache_get( 'all_category_ids', 'category' ) ) {\n\t\t$cat_ids = get_terms( 'category', array('fields' => 'ids', 'get' => 'all') );\n\t\twp_cache_add( 'all_category_ids', $cat_ids, 'category' );\n\t}\n\n\treturn $cat_ids;\n}\n\n/**\n * Retrieve the description of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's description.\n */\nfunction get_the_author_description() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'description\\')' );\n\treturn get_the_author_meta('description');\n}\n\n/**\n * Display the description of the author of the current post.\n *\n * @since 1.0.0\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_description() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'description\\')' );\n\tthe_author_meta('description');\n}\n\n/**\n * Retrieve the login name of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's login name (username).\n */\nfunction get_the_author_login() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'login\\')' );\n\treturn get_the_author_meta('login');\n}\n\n/**\n * Display the login name of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_login() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'login\\')' );\n\tthe_author_meta('login');\n}\n\n/**\n * Retrieve the first name of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's first name.\n */\nfunction get_the_author_firstname() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'first_name\\')' );\n\treturn get_the_author_meta('first_name');\n}\n\n/**\n * Display the first name of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_firstname() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'first_name\\')' );\n\tthe_author_meta('first_name');\n}\n\n/**\n * Retrieve the last name of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's last name.\n */\nfunction get_the_author_lastname() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'last_name\\')' );\n\treturn get_the_author_meta('last_name');\n}\n\n/**\n * Display the last name of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_lastname() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'last_name\\')' );\n\tthe_author_meta('last_name');\n}\n\n/**\n * Retrieve the nickname of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's nickname.\n */\nfunction get_the_author_nickname() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'nickname\\')' );\n\treturn get_the_author_meta('nickname');\n}\n\n/**\n * Display the nickname of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_nickname() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'nickname\\')' );\n\tthe_author_meta('nickname');\n}\n\n/**\n * Retrieve the email of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's username.\n */\nfunction get_the_author_email() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'email\\')' );\n\treturn get_the_author_meta('email');\n}\n\n/**\n * Display the email of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_email() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'email\\')' );\n\tthe_author_meta('email');\n}\n\n/**\n * Retrieve the ICQ number of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's ICQ number.\n */\nfunction get_the_author_icq() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'icq\\')' );\n\treturn get_the_author_meta('icq');\n}\n\n/**\n * Display the ICQ number of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_icq() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'icq\\')' );\n\tthe_author_meta('icq');\n}\n\n/**\n * Retrieve the Yahoo! IM name of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's Yahoo! IM name.\n */\nfunction get_the_author_yim() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'yim\\')' );\n\treturn get_the_author_meta('yim');\n}\n\n/**\n * Display the Yahoo! IM name of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_yim() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'yim\\')' );\n\tthe_author_meta('yim');\n}\n\n/**\n * Retrieve the MSN address of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's MSN address.\n */\nfunction get_the_author_msn() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'msn\\')' );\n\treturn get_the_author_meta('msn');\n}\n\n/**\n * Display the MSN address of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_msn() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'msn\\')' );\n\tthe_author_meta('msn');\n}\n\n/**\n * Retrieve the AIM address of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The author's AIM address.\n */\nfunction get_the_author_aim() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'aim\\')' );\n\treturn get_the_author_meta('aim');\n}\n\n/**\n * Display the AIM address of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta('aim')\n * @see the_author_meta()\n */\nfunction the_author_aim() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'aim\\')' );\n\tthe_author_meta('aim');\n}\n\n/**\n * Retrieve the specified author's preferred display name.\n *\n * @since 1.0.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @param int $auth_id The ID of the author.\n * @return string The author's display name.\n */\nfunction get_author_name( $auth_id = false ) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'display_name\\')' );\n\treturn get_the_author_meta('display_name', $auth_id);\n}\n\n/**\n * Retrieve the URL to the home page of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string The URL to the author's page.\n */\nfunction get_the_author_url() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'url\\')' );\n\treturn get_the_author_meta('url');\n}\n\n/**\n * Display the URL to the home page of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n */\nfunction the_author_url() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'url\\')' );\n\tthe_author_meta('url');\n}\n\n/**\n * Retrieve the ID of the author of the current post.\n *\n * @since 1.5.0\n * @deprecated 2.8.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n *\n * @return string|int The author's ID.\n */\nfunction get_the_author_ID() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'get_the_author_meta(\\'ID\\')' );\n\treturn get_the_author_meta('ID');\n}\n\n/**\n * Display the ID of the author of the current post.\n *\n * @since 0.71\n * @deprecated 2.8.0 Use the_author_meta()\n * @see the_author_meta()\n*/\nfunction the_author_ID() {\n\t_deprecated_function( __FUNCTION__, '2.8', 'the_author_meta(\\'ID\\')' );\n\tthe_author_meta('ID');\n}\n\n/**\n * Display the post content for the feed.\n *\n * For encoding the html or the $encode_html parameter, there are three possible\n * values. '0' will make urls footnotes and use make_url_footnote(). '1' will\n * encode special characters and automatically display all of the content. The\n * value of '2' will strip all HTML tags from the content.\n *\n * Also note that you cannot set the amount of words and not set the html\n * encoding. If that is the case, then the html encoding will default to 2,\n * which will strip all HTML tags.\n *\n * To restrict the amount of words of the content, you can use the cut\n * parameter. If the content is less than the amount, then there won't be any\n * dots added to the end. If there is content left over, then dots will be added\n * and the rest of the content will be removed.\n *\n * @since 0.71\n *\n * @deprecated 2.9.0 Use the_content_feed()\n * @see the_content_feed()\n *\n * @param string $more_link_text Optional. Text to display when more content is available but not displayed.\n * @param int $stripteaser Optional. Default is 0.\n * @param string $more_file Optional.\n * @param int $cut Optional. Amount of words to keep for the content.\n * @param int $encode_html Optional. How to encode the content.\n */\nfunction the_content_rss($more_link_text='(more...)', $stripteaser=0, $more_file='', $cut = 0, $encode_html = 0) {\n\t_deprecated_function( __FUNCTION__, '2.9', 'the_content_feed' );\n\t$content = get_the_content($more_link_text, $stripteaser);\n\t$content = apply_filters('the_content_rss', $content);\n\tif ( $cut && !$encode_html )\n\t\t$encode_html = 2;\n\tif ( 1== $encode_html ) {\n\t\t$content = esc_html($content);\n\t\t$cut = 0;\n\t} elseif ( 0 == $encode_html ) {\n\t\t$content = make_url_footnote($content);\n\t} elseif ( 2 == $encode_html ) {\n\t\t$content = strip_tags($content);\n\t}\n\tif ( $cut ) {\n\t\t$blah = explode(' ', $content);\n\t\tif ( count($blah) > $cut ) {\n\t\t\t$k = $cut;\n\t\t\t$use_dotdotdot = 1;\n\t\t} else {\n\t\t\t$k = count($blah);\n\t\t\t$use_dotdotdot = 0;\n\t\t}\n\n\t\t/** @todo Check performance, might be faster to use array slice instead. */\n\t\tfor ( $i=0; $i<$k; $i++ )\n\t\t\t$excerpt .= $blah[$i].' ';\n\t\t$excerpt .= ($use_dotdotdot) ? '...' : '';\n\t\t$content = $excerpt;\n\t}\n\t$content = str_replace(']]>', ']]&gt;', $content);\n\techo $content;\n}\n\n/**\n * Strip HTML and put links at the bottom of stripped content.\n *\n * Searches for all of the links, strips them out of the content, and places\n * them at the bottom of the content with numbers.\n *\n * @since 0.71\n * @deprecated 2.9.0\n *\n * @param string $content Content to get links\n * @return string HTML stripped out of content with links at the bottom.\n */\nfunction make_url_footnote( $content ) {\n\t_deprecated_function( __FUNCTION__, '2.9', '' );\n\tpreg_match_all( '/<a(.+?)href=\\\"(.+?)\\\"(.*?)>(.+?)<\\/a>/', $content, $matches );\n\t$links_summary = \"\\n\";\n\tfor ( $i = 0, $c = count( $matches[0] ); $i < $c; $i++ ) {\n\t\t$link_match = $matches[0][$i];\n\t\t$link_number = '['.($i+1).']';\n\t\t$link_url = $matches[2][$i];\n\t\t$link_text = $matches[4][$i];\n\t\t$content = str_replace( $link_match, $link_text . ' ' . $link_number, $content );\n\t\t$link_url = ( ( strtolower( substr( $link_url, 0, 7 ) ) != 'http://' ) && ( strtolower( substr( $link_url, 0, 8 ) ) != 'https://' ) ) ? get_option( 'home' ) . $link_url : $link_url;\n\t\t$links_summary .= \"\\n\" . $link_number . ' ' . $link_url;\n\t}\n\t$content  = strip_tags( $content );\n\t$content .= $links_summary;\n\treturn $content;\n}\n\n/**\n * Retrieve translated string with vertical bar context\n *\n * Quite a few times, there will be collisions with similar translatable text\n * found in more than two places but with different translated context.\n *\n * In order to use the separate contexts, the _c() function is used and the\n * translatable string uses a pipe ('|') which has the context the string is in.\n *\n * When the translated string is returned, it is everything before the pipe, not\n * including the pipe character. If there is no pipe in the translated text then\n * everything is returned.\n *\n * @since 2.2.0\n * @deprecated 2.9.0 Use _x()\n * @see _x()\n *\n * @param string $text Text to translate\n * @param string $domain Optional. Domain to retrieve the translated text\n * @return string Translated context string without pipe\n */\nfunction _c( $text, $domain = 'default' ) {\n\t_deprecated_function( __FUNCTION__, '2.9', '_x()' );\n\treturn before_last_bar( translate( $text, $domain ) );\n}\n\n/**\n * Translates $text like translate(), but assumes that the text\n * contains a context after its last vertical bar.\n *\n * @since 2.5.0\n * @deprecated 3.0.0 Use _x()\n * @see _x()\n *\n * @param string $text Text to translate\n * @param string $domain Domain to retrieve the translated text\n * @return string Translated text\n */\nfunction translate_with_context( $text, $domain = 'default' ) {\n\t_deprecated_function( __FUNCTION__, '2.9', '_x()' );\n\treturn before_last_bar( translate( $text, $domain ) );\n}\n\n/**\n * A version of _n(), which supports contexts.\n * Strips everything from the translation after the last bar.\n *\n * @since 2.7.0\n * @deprecated 3.0.0 Use _nx()\n * @see _nx()\n */\nfunction _nc( $single, $plural, $number, $domain = 'default' ) {\n\t_deprecated_function( __FUNCTION__, '2.9', '_nx()' );\n\treturn before_last_bar( _n( $single, $plural, $number, $domain ) );\n}\n\n/**\n * Retrieve the plural or single form based on the amount.\n *\n * @since 1.2.0\n * @deprecated 2.8.0 Use _n()\n * @see _n()\n */\nfunction __ngettext() {\n\t_deprecated_function( __FUNCTION__, '2.8', '_n()' );\n\t$args = func_get_args();\n\treturn call_user_func_array('_n', $args);\n}\n\n/**\n * Register plural strings in POT file, but don't translate them.\n *\n * @since 2.5.0\n * @deprecated 2.8.0 Use _n_noop()\n * @see _n_noop()\n */\nfunction __ngettext_noop() {\n\t_deprecated_function( __FUNCTION__, '2.8', '_n_noop()' );\n\t$args = func_get_args();\n\treturn call_user_func_array('_n_noop', $args);\n\n}\n\n/**\n * Retrieve all autoload options, or all options if no autoloaded ones exist.\n *\n * @since 1.0.0\n * @deprecated 3.0.0 Use wp_load_alloptions())\n * @see wp_load_alloptions()\n *\n * @return array List of all options.\n */\nfunction get_alloptions() {\n\t_deprecated_function( __FUNCTION__, '3.0', 'wp_load_alloptions()' );\n\treturn wp_load_alloptions();\n}\n\n/**\n * Retrieve HTML content of attachment image with link.\n *\n * @since 2.0.0\n * @deprecated 2.5.0 Use wp_get_attachment_link()\n * @see wp_get_attachment_link()\n *\n * @param int $id Optional. Post ID.\n * @param bool $fullsize Optional, default is false. Whether to use full size image.\n * @param array $max_dims Optional. Max image dimensions.\n * @param bool $permalink Optional, default is false. Whether to include permalink to image.\n * @return string\n */\nfunction get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false, $permalink = false) {\n\t_deprecated_function( __FUNCTION__, '2.5', 'wp_get_attachment_link()' );\n\t$id = (int) $id;\n\t$_post = get_post($id);\n\n\tif ( ('attachment' != $_post->post_type) || !$url = wp_get_attachment_url($_post->ID) )\n\t\treturn __('Missing Attachment');\n\n\tif ( $permalink )\n\t\t$url = get_attachment_link($_post->ID);\n\n\t$post_title = esc_attr($_post->post_title);\n\n\t$innerHTML = get_attachment_innerHTML($_post->ID, $fullsize, $max_dims);\n\treturn \"<a href='$url' title='$post_title'>$innerHTML</a>\";\n}\n\n/**\n * Retrieve icon URL and Path.\n *\n * @since 2.1.0\n * @deprecated 2.5.0 Use wp_get_attachment_image_src()\n * @see wp_get_attachment_image_src()\n *\n * @param int $id Optional. Post ID.\n * @param bool $fullsize Optional, default to false. Whether to have full image.\n * @return array Icon URL and full path to file, respectively.\n */\nfunction get_attachment_icon_src( $id = 0, $fullsize = false ) {\n\t_deprecated_function( __FUNCTION__, '2.5', 'wp_get_attachment_image_src()' );\n\t$id = (int) $id;\n\tif ( !$post = get_post($id) )\n\t\treturn false;\n\n\t$file = get_attached_file( $post->ID );\n\n\tif ( !$fullsize && $src = wp_get_attachment_thumb_url( $post->ID ) ) {\n\t\t// We have a thumbnail desired, specified and existing\n\n\t\t$src_file = basename($src);\n\t} elseif ( wp_attachment_is_image( $post->ID ) ) {\n\t\t// We have an image without a thumbnail\n\n\t\t$src = wp_get_attachment_url( $post->ID );\n\t\t$src_file = & $file;\n\t} elseif ( $src = wp_mime_type_icon( $post->ID ) ) {\n\t\t// No thumb, no image. We'll look for a mime-related icon instead.\n\n\t\t$icon_dir = apply_filters( 'icon_dir', get_template_directory() . '/images' );\n\t\t$src_file = $icon_dir . '/' . basename($src);\n\t}\n\n\tif ( !isset($src) || !$src )\n\t\treturn false;\n\n\treturn array($src, $src_file);\n}\n\n/**\n * Retrieve HTML content of icon attachment image element.\n *\n * @since 2.0.0\n * @deprecated 2.5.0 Use wp_get_attachment_image()\n * @see wp_get_attachment_image()\n *\n * @param int $id Optional. Post ID.\n * @param bool $fullsize Optional, default to false. Whether to have full size image.\n * @param array $max_dims Optional. Dimensions of image.\n * @return false|string HTML content.\n */\nfunction get_attachment_icon( $id = 0, $fullsize = false, $max_dims = false ) {\n\t_deprecated_function( __FUNCTION__, '2.5', 'wp_get_attachment_image()' );\n\t$id = (int) $id;\n\tif ( !$post = get_post($id) )\n\t\treturn false;\n\n\tif ( !$src = get_attachment_icon_src( $post->ID, $fullsize ) )\n\t\treturn false;\n\n\tlist($src, $src_file) = $src;\n\n\t// Do we need to constrain the image?\n\tif ( ($max_dims = apply_filters('attachment_max_dims', $max_dims)) && file_exists($src_file) ) {\n\n\t\t$imagesize = getimagesize($src_file);\n\n\t\tif (($imagesize[0] > $max_dims[0]) || $imagesize[1] > $max_dims[1] ) {\n\t\t\t$actual_aspect = $imagesize[0] / $imagesize[1];\n\t\t\t$desired_aspect = $max_dims[0] / $max_dims[1];\n\n\t\t\tif ( $actual_aspect >= $desired_aspect ) {\n\t\t\t\t$height = $actual_aspect * $max_dims[0];\n\t\t\t\t$constraint = \"width='{$max_dims[0]}' \";\n\t\t\t\t$post->iconsize = array($max_dims[0], $height);\n\t\t\t} else {\n\t\t\t\t$width = $max_dims[1] / $actual_aspect;\n\t\t\t\t$constraint = \"height='{$max_dims[1]}' \";\n\t\t\t\t$post->iconsize = array($width, $max_dims[1]);\n\t\t\t}\n\t\t} else {\n\t\t\t$post->iconsize = array($imagesize[0], $imagesize[1]);\n\t\t\t$constraint = '';\n\t\t}\n\t} else {\n\t\t$constraint = '';\n\t}\n\n\t$post_title = esc_attr($post->post_title);\n\n\t$icon = \"<img src='$src' title='$post_title' alt='$post_title' $constraint/>\";\n\n\treturn apply_filters( 'attachment_icon', $icon, $post->ID );\n}\n\n/**\n * Retrieve HTML content of image element.\n *\n * @since 2.0.0\n * @deprecated 2.5.0 Use wp_get_attachment_image()\n * @see wp_get_attachment_image()\n *\n * @param int $id Optional. Post ID.\n * @param bool $fullsize Optional, default to false. Whether to have full size image.\n * @param array $max_dims Optional. Dimensions of image.\n * @return false|string\n */\nfunction get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) {\n\t_deprecated_function( __FUNCTION__, '2.5', 'wp_get_attachment_image()' );\n\t$id = (int) $id;\n\tif ( !$post = get_post($id) )\n\t\treturn false;\n\n\tif ( $innerHTML = get_attachment_icon($post->ID, $fullsize, $max_dims))\n\t\treturn $innerHTML;\n\n\t$innerHTML = esc_attr($post->post_title);\n\n\treturn apply_filters('attachment_innerHTML', $innerHTML, $post->ID);\n}\n\n/**\n * Retrieve bookmark data based on ID.\n *\n * @since 2.0.0\n * @deprecated 2.1.0 Use get_bookmark()\n * @see get_bookmark()\n *\n * @param int $bookmark_id ID of link\n * @param string $output OBJECT, ARRAY_N, or ARRAY_A\n * @return object|array\n */\nfunction get_link($bookmark_id, $output = OBJECT, $filter = 'raw') {\n\t_deprecated_function( __FUNCTION__, '2.1', 'get_bookmark()' );\n\treturn get_bookmark($bookmark_id, $output, $filter);\n}\n\n/**\n * Performs esc_url() for database or redirect usage.\n *\n * @since 2.3.1\n * @deprecated 2.8.0 Use esc_url_raw()\n * @see esc_url_raw()\n *\n * @param string $url The URL to be cleaned.\n * @param array $protocols An array of acceptable protocols.\n * @return string The cleaned URL.\n */\nfunction sanitize_url( $url, $protocols = null ) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'esc_url_raw()' );\n\treturn esc_url_raw( $url, $protocols );\n}\n\n/**\n * Checks and cleans a URL.\n *\n * A number of characters are removed from the URL. If the URL is for displaying\n * (the default behaviour) ampersands are also replaced. The 'clean_url' filter\n * is applied to the returned cleaned URL.\n *\n * @since 1.2.0\n * @deprecated 3.0.0 Use esc_url()\n * @see Alias for esc_url()\n *\n * @param string $url The URL to be cleaned.\n * @param array $protocols Optional. An array of acceptable protocols.\n * @param string $context Optional. How the URL will be used. Default is 'display'.\n * @return string The cleaned $url after the 'clean_url' filter is applied.\n */\nfunction clean_url( $url, $protocols = null, $context = 'display' ) {\n\tif ( $context == 'db' )\n\t\t_deprecated_function( 'clean_url( $context = \\'db\\' )', '3.0', 'esc_url_raw()' );\n\telse\n\t\t_deprecated_function( __FUNCTION__, '3.0', 'esc_url()' );\n\treturn esc_url( $url, $protocols, $context );\n}\n\n/**\n * Escape single quotes, specialchar double quotes, and fix line endings.\n *\n * The filter 'js_escape' is also applied by esc_js()\n *\n * @since 2.0.4\n * @deprecated 2.8.0 Use esc_js()\n * @see esc_js()\n *\n * @param string $text The text to be escaped.\n * @return string Escaped text.\n */\nfunction js_escape( $text ) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'esc_js()' );\n\treturn esc_js( $text );\n}\n\n/**\n * Escaping for HTML blocks.\n *\n * @deprecated 2.8.0 Use esc_html()\n * @see esc_html()\n */\nfunction wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'esc_html()' );\n\tif ( func_num_args() > 1 ) { // Maintain backwards compat for people passing additional args\n\t\t$args = func_get_args();\n\t\treturn call_user_func_array( '_wp_specialchars', $args );\n\t} else {\n\t\treturn esc_html( $string );\n\t}\n}\n\n/**\n * Escaping for HTML attributes.\n *\n * @since 2.0.6\n * @deprecated 2.8.0 Use esc_attr()\n * @see esc_attr()\n *\n * @param string $text\n * @return string\n */\nfunction attribute_escape( $text ) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'esc_attr()' );\n\treturn esc_attr( $text );\n}\n\n/**\n * Register widget for sidebar with backwards compatibility.\n *\n * Allows $name to be an array that accepts either three elements to grab the\n * first element and the third for the name or just uses the first element of\n * the array for the name.\n *\n * Passes to {@link wp_register_sidebar_widget()} after argument list and\n * backwards compatibility is complete.\n *\n * @since 2.2.0\n * @deprecated 2.8.0 Use wp_register_sidebar_widget()\n * @see wp_register_sidebar_widget()\n *\n * @param string|int $name Widget ID.\n * @param callable $output_callback Run when widget is called.\n * @param string $classname Classname widget option.\n * @param mixed $params ,... Widget parameters.\n */\nfunction register_sidebar_widget($name, $output_callback, $classname = '') {\n\t_deprecated_function( __FUNCTION__, '2.8', 'wp_register_sidebar_widget()' );\n\t// Compat\n\tif ( is_array($name) ) {\n\t\tif ( count($name) == 3 )\n\t\t\t$name = sprintf($name[0], $name[2]);\n\t\telse\n\t\t\t$name = $name[0];\n\t}\n\n\t$id = sanitize_title($name);\n\t$options = array();\n\tif ( !empty($classname) && is_string($classname) )\n\t\t$options['classname'] = $classname;\n\t$params = array_slice(func_get_args(), 2);\n\t$args = array($id, $name, $output_callback, $options);\n\tif ( !empty($params) )\n\t\t$args = array_merge($args, $params);\n\n\tcall_user_func_array('wp_register_sidebar_widget', $args);\n}\n\n/**\n * Alias of {@link wp_unregister_sidebar_widget()}.\n *\n * @since 2.2.0\n * @deprecated 2.8.0 Use wp_unregister_sidebar_widget()\n * @see wp_unregister_sidebar_widget()\n *\n * @param int|string $id Widget ID.\n */\nfunction unregister_sidebar_widget($id) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'wp_unregister_sidebar_widget()' );\n\treturn wp_unregister_sidebar_widget($id);\n}\n\n/**\n * Registers widget control callback for customizing options.\n *\n * Allows $name to be an array that accepts either three elements to grab the\n * first element and the third for the name or just uses the first element of\n * the array for the name.\n *\n * Passes to wp_register_widget_control() after the argument list has\n * been compiled.\n *\n * @since 2.2.0\n * @deprecated 2.8.0 Use wp_register_widget_control()\n * @see wp_register_widget_control()\n *\n * @param int|string $name Sidebar ID.\n * @param callable $control_callback Widget control callback to display and process form.\n * @param int $width Widget width.\n * @param int $height Widget height.\n */\nfunction register_widget_control($name, $control_callback, $width = '', $height = '') {\n\t_deprecated_function( __FUNCTION__, '2.8', 'wp_register_widget_control()' );\n\t// Compat\n\tif ( is_array($name) ) {\n\t\tif ( count($name) == 3 )\n\t\t\t$name = sprintf($name[0], $name[2]);\n\t\telse\n\t\t\t$name = $name[0];\n\t}\n\n\t$id = sanitize_title($name);\n\t$options = array();\n\tif ( !empty($width) )\n\t\t$options['width'] = $width;\n\tif ( !empty($height) )\n\t\t$options['height'] = $height;\n\t$params = array_slice(func_get_args(), 4);\n\t$args = array($id, $name, $control_callback, $options);\n\tif ( !empty($params) )\n\t\t$args = array_merge($args, $params);\n\n\tcall_user_func_array('wp_register_widget_control', $args);\n}\n\n/**\n * Alias of wp_unregister_widget_control().\n *\n * @since 2.2.0\n * @deprecated 2.8.0 Use wp_unregister_widget_control()\n * @see wp_unregister_widget_control()\n *\n * @param int|string $id Widget ID.\n */\nfunction unregister_widget_control($id) {\n\t_deprecated_function( __FUNCTION__, '2.8', 'wp_unregister_widget_control()' );\n\treturn wp_unregister_widget_control($id);\n}\n\n/**\n * Remove user meta data.\n *\n * @since 2.0.0\n * @deprecated 3.0.0 Use delete_user_meta()\n * @see delete_user_meta()\n *\n * @param int $user_id User ID.\n * @param string $meta_key Metadata key.\n * @param mixed $meta_value Metadata value.\n * @return bool True deletion completed and false if user_id is not a number.\n */\nfunction delete_usermeta( $user_id, $meta_key, $meta_value = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'delete_user_meta()' );\n\tglobal $wpdb;\n\tif ( !is_numeric( $user_id ) )\n\t\treturn false;\n\t$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);\n\n\tif ( is_array($meta_value) || is_object($meta_value) )\n\t\t$meta_value = serialize($meta_value);\n\t$meta_value = trim( $meta_value );\n\n\t$cur = $wpdb->get_row( $wpdb->prepare(\"SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s\", $user_id, $meta_key) );\n\n\tif ( $cur && $cur->umeta_id )\n\t\tdo_action( 'delete_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );\n\n\tif ( ! empty($meta_value) )\n\t\t$wpdb->query( $wpdb->prepare(\"DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s AND meta_value = %s\", $user_id, $meta_key, $meta_value) );\n\telse\n\t\t$wpdb->query( $wpdb->prepare(\"DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s\", $user_id, $meta_key) );\n\n\tclean_user_cache( $user_id );\n\twp_cache_delete( $user_id, 'user_meta' );\n\n\tif ( $cur && $cur->umeta_id )\n\t\tdo_action( 'deleted_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );\n\n\treturn true;\n}\n\n/**\n * Retrieve user metadata.\n *\n * If $user_id is not a number, then the function will fail over with a 'false'\n * boolean return value. Other returned values depend on whether there is only\n * one item to be returned, which be that single item type. If there is more\n * than one metadata value, then it will be list of metadata values.\n *\n * @since 2.0.0\n * @deprecated 3.0.0 Use get_user_meta()\n * @see get_user_meta()\n *\n * @param int $user_id User ID\n * @param string $meta_key Optional. Metadata key.\n * @return mixed\n */\nfunction get_usermeta( $user_id, $meta_key = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'get_user_meta()' );\n\tglobal $wpdb;\n\t$user_id = (int) $user_id;\n\n\tif ( !$user_id )\n\t\treturn false;\n\n\tif ( !empty($meta_key) ) {\n\t\t$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);\n\t\t$user = wp_cache_get($user_id, 'users');\n\t\t// Check the cached user object\n\t\tif ( false !== $user && isset($user->$meta_key) )\n\t\t\t$metas = array($user->$meta_key);\n\t\telse\n\t\t\t$metas = $wpdb->get_col( $wpdb->prepare(\"SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s\", $user_id, $meta_key) );\n\t} else {\n\t\t$metas = $wpdb->get_col( $wpdb->prepare(\"SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d\", $user_id) );\n\t}\n\n\tif ( empty($metas) ) {\n\t\tif ( empty($meta_key) )\n\t\t\treturn array();\n\t\telse\n\t\t\treturn '';\n\t}\n\n\t$metas = array_map('maybe_unserialize', $metas);\n\n\tif ( count($metas) == 1 )\n\t\treturn $metas[0];\n\telse\n\t\treturn $metas;\n}\n\n/**\n * Update metadata of user.\n *\n * There is no need to serialize values, they will be serialized if it is\n * needed. The metadata key can only be a string with underscores. All else will\n * be removed.\n *\n * Will remove the metadata, if the meta value is empty.\n *\n * @since 2.0.0\n * @deprecated 3.0.0 Use update_user_meta()\n * @see update_user_meta()\n *\n * @param int $user_id User ID\n * @param string $meta_key Metadata key.\n * @param mixed $meta_value Metadata value.\n * @return bool True on successful update, false on failure.\n */\nfunction update_usermeta( $user_id, $meta_key, $meta_value ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'update_user_meta()' );\n\tglobal $wpdb;\n\tif ( !is_numeric( $user_id ) )\n\t\treturn false;\n\t$meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key);\n\n\t/** @todo Might need fix because usermeta data is assumed to be already escaped */\n\tif ( is_string($meta_value) )\n\t\t$meta_value = stripslashes($meta_value);\n\t$meta_value = maybe_serialize($meta_value);\n\n\tif (empty($meta_value)) {\n\t\treturn delete_usermeta($user_id, $meta_key);\n\t}\n\n\t$cur = $wpdb->get_row( $wpdb->prepare(\"SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s\", $user_id, $meta_key) );\n\n\tif ( $cur )\n\t\tdo_action( 'update_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );\n\n\tif ( !$cur )\n\t\t$wpdb->insert($wpdb->usermeta, compact('user_id', 'meta_key', 'meta_value') );\n\telseif ( $cur->meta_value != $meta_value )\n\t\t$wpdb->update($wpdb->usermeta, compact('meta_value'), compact('user_id', 'meta_key') );\n\telse\n\t\treturn false;\n\n\tclean_user_cache( $user_id );\n\twp_cache_delete( $user_id, 'user_meta' );\n\n\tif ( !$cur )\n\t\tdo_action( 'added_usermeta', $wpdb->insert_id, $user_id, $meta_key, $meta_value );\n\telse\n\t\tdo_action( 'updated_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value );\n\n\treturn true;\n}\n\n/**\n * Get users for the blog.\n *\n * For setups that use the multi-blog feature. Can be used outside of the\n * multi-blog feature.\n *\n * @since 2.2.0\n * @deprecated 3.1.0 Use get_users()\n * @see get_users()\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @uses $blog_id The Blog id of the blog for those that use more than one blog\n *\n * @param int $id Blog ID.\n * @return array List of users that are part of that Blog ID\n */\nfunction get_users_of_blog( $id = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.1', 'get_users()' );\n\n\tglobal $wpdb, $blog_id;\n\tif ( empty($id) )\n\t\t$id = (int) $blog_id;\n\t$blog_prefix = $wpdb->get_blog_prefix($id);\n\t$users = $wpdb->get_results( \"SELECT user_id, user_id AS ID, user_login, display_name, user_email, meta_value FROM $wpdb->users, $wpdb->usermeta WHERE {$wpdb->users}.ID = {$wpdb->usermeta}.user_id AND meta_key = '{$blog_prefix}capabilities' ORDER BY {$wpdb->usermeta}.user_id\" );\n\treturn $users;\n}\n\n/**\n * Enable/disable automatic general feed link outputting.\n *\n * @since 2.8.0\n * @deprecated 3.0.0 Use add_theme_support()\n * @see add_theme_support()\n *\n * @param bool $add Optional, default is true. Add or remove links. Defaults to true.\n */\nfunction automatic_feed_links( $add = true ) {\n\t_deprecated_function( __FUNCTION__, '3.0', \"add_theme_support( 'automatic-feed-links' )\" );\n\n\tif ( $add )\n\t\tadd_theme_support( 'automatic-feed-links' );\n\telse\n\t\tremove_action( 'wp_head', 'feed_links_extra', 3 ); // Just do this yourself in 3.0+\n}\n\n/**\n * Retrieve user data based on field.\n *\n * @since 1.5.0\n * @deprecated 3.0.0 Use get_the_author_meta()\n * @see get_the_author_meta()\n */\nfunction get_profile( $field, $user = false ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'get_the_author_meta()' );\n\tif ( $user ) {\n\t\t$user = get_user_by( 'login', $user );\n\t\t$user = $user->ID;\n\t}\n\treturn get_the_author_meta( $field, $user );\n}\n\n/**\n * Number of posts user has written.\n *\n * @since 0.71\n * @deprecated 3.0.0 Use count_user_posts()\n * @see count_user_posts()\n */\nfunction get_usernumposts( $userid ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'count_user_posts()' );\n\treturn count_user_posts( $userid );\n}\n\n/**\n * Callback used to change %uXXXX to &#YYY; syntax\n *\n * @since 2.8.0\n * @access private\n * @deprecated 3.0.0\n *\n * @param array $matches Single Match\n * @return string An HTML entity\n */\nfunction funky_javascript_callback($matches) {\n\treturn \"&#\".base_convert($matches[1],16,10).\";\";\n}\n\n/**\n * Fixes JavaScript bugs in browsers.\n *\n * Converts unicode characters to HTML numbered entities.\n *\n * @since 1.5.0\n * @deprecated 3.0.0\n *\n * @uses $is_macIE\n * @uses $is_winIE\n *\n * @param string $text Text to be made safe.\n * @return string Fixed text.\n */\nfunction funky_javascript_fix($text) {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n\t// Fixes for browsers' JavaScript bugs.\n\tglobal $is_macIE, $is_winIE;\n\n\tif ( $is_winIE || $is_macIE )\n\t\t$text =  preg_replace_callback(\"/\\%u([0-9A-F]{4,4})/\",\n\t\t\t\t\t\"funky_javascript_callback\",\n\t\t\t\t\t$text);\n\n\treturn $text;\n}\n\n/**\n * Checks that the taxonomy name exists.\n *\n * @since 2.3.0\n * @deprecated 3.0.0 Use taxonomy_exists()\n * @see taxonomy_exists()\n *\n * @param string $taxonomy Name of taxonomy object\n * @return bool Whether the taxonomy exists.\n */\nfunction is_taxonomy( $taxonomy ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'taxonomy_exists()' );\n\treturn taxonomy_exists( $taxonomy );\n}\n\n/**\n * Check if Term exists.\n *\n * @since 2.3.0\n * @deprecated 3.0.0 Use term_exists()\n * @see term_exists()\n *\n * @param int|string $term The term to check\n * @param string $taxonomy The taxonomy name to use\n * @param int $parent ID of parent term under which to confine the exists search.\n * @return mixed Get the term id or Term Object, if exists.\n */\nfunction is_term( $term, $taxonomy = '', $parent = 0 ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'term_exists()' );\n\treturn term_exists( $term, $taxonomy, $parent );\n}\n\n/**\n * Is the current admin page generated by a plugin?\n *\n * Use global $plugin_page and/or get_plugin_page_hookname() hooks.\n *\n * @since 1.5.0\n * @deprecated 3.1.0\n *\n * @global $plugin_page\n *\n * @return bool\n */\nfunction is_plugin_page() {\n\t_deprecated_function( __FUNCTION__, '3.1'  );\n\n\tglobal $plugin_page;\n\n\tif ( isset($plugin_page) )\n\t\treturn true;\n\n\treturn false;\n}\n\n/**\n * Update the categories cache.\n *\n * This function does not appear to be used anymore or does not appear to be\n * needed. It might be a legacy function left over from when there was a need\n * for updating the category cache.\n *\n * @since 1.5.0\n * @deprecated 3.1.0\n *\n * @return bool Always return True\n */\nfunction update_category_cache() {\n\t_deprecated_function( __FUNCTION__, '3.1'  );\n\n\treturn true;\n}\n\n/**\n * Check for PHP timezone support\n *\n * @since 2.9.0\n * @deprecated 3.2.0\n *\n * @return bool\n */\nfunction wp_timezone_supported() {\n\t_deprecated_function( __FUNCTION__, '3.2' );\n\n\treturn true;\n}\n\n/**\n * Display editor: TinyMCE, HTML, or both.\n *\n * @since 2.1.0\n * @deprecated 3.3.0 Use wp_editor()\n * @see wp_editor()\n *\n * @param string $content Textarea content.\n * @param string $id Optional, default is 'content'. HTML ID attribute value.\n * @param string $prev_id Optional, not used\n * @param bool $media_buttons Optional, default is true. Whether to display media buttons.\n * @param int $tab_index Optional, not used\n */\nfunction the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) {\n\t_deprecated_function( __FUNCTION__, '3.3', 'wp_editor()' );\n\n\twp_editor( $content, $id, array( 'media_buttons' => $media_buttons ) );\n}\n\n/**\n * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users\n *\n * @since 3.0.0\n * @deprecated 3.3.0\n *\n * @param array $ids User ID numbers list.\n * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays.\n */\nfunction get_user_metavalues($ids) {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\t$objects = array();\n\n\t$ids = array_map('intval', $ids);\n\tforeach ( $ids as $id )\n\t\t$objects[$id] = array();\n\n\t$metas = update_meta_cache('user', $ids);\n\n\tforeach ( $metas as $id => $meta ) {\n\t\tforeach ( $meta as $key => $metavalues ) {\n\t\t\tforeach ( $metavalues as $value ) {\n\t\t\t\t$objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $objects;\n}\n\n/**\n * Sanitize every user field.\n *\n * If the context is 'raw', then the user object or array will get minimal santization of the int fields.\n *\n * @since 2.3.0\n * @deprecated 3.3.0\n *\n * @param object|array $user The User Object or Array\n * @param string $context Optional, default is 'display'. How to sanitize user fields.\n * @return object|array The now sanitized User Object or Array (will be the same type as $user)\n */\nfunction sanitize_user_object($user, $context = 'display') {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\tif ( is_object($user) ) {\n\t\tif ( !isset($user->ID) )\n\t\t\t$user->ID = 0;\n\t\tif ( ! ( $user instanceof WP_User ) ) {\n\t\t\t$vars = get_object_vars($user);\n\t\t\tforeach ( array_keys($vars) as $field ) {\n\t\t\t\tif ( is_string($user->$field) || is_numeric($user->$field) )\n\t\t\t\t\t$user->$field = sanitize_user_field($field, $user->$field, $user->ID, $context);\n\t\t\t}\n\t\t}\n\t\t$user->filter = $context;\n\t} else {\n\t\tif ( !isset($user['ID']) )\n\t\t\t$user['ID'] = 0;\n\t\tforeach ( array_keys($user) as $field )\n\t\t\t$user[$field] = sanitize_user_field($field, $user[$field], $user['ID'], $context);\n\t\t$user['filter'] = $context;\n\t}\n\n\treturn $user;\n}\n\n/**\n * Get boundary post relational link.\n *\n * Can either be start or end post relational link.\n *\n * @since 2.8.0\n * @deprecated 3.3.0\n *\n * @param string $title Optional. Link title format.\n * @param bool $in_same_cat Optional. Whether link should be in a same category.\n * @param string $excluded_categories Optional. Excluded categories IDs.\n * @param bool $start Optional, default is true. Whether to display link to first or last post.\n * @return string\n */\nfunction get_boundary_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '', $start = true) {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\t$posts = get_boundary_post($in_same_cat, $excluded_categories, $start);\n\t// If there is no post stop.\n\tif ( empty($posts) )\n\t\treturn;\n\n\t// Even though we limited get_posts to return only 1 item it still returns an array of objects.\n\t$post = $posts[0];\n\n\tif ( empty($post->post_title) )\n\t\t$post->post_title = $start ? __('First Post') : __('Last Post');\n\n\t$date = mysql2date(get_option('date_format'), $post->post_date);\n\n\t$title = str_replace('%title', $post->post_title, $title);\n\t$title = str_replace('%date', $date, $title);\n\t$title = apply_filters('the_title', $title, $post->ID);\n\n\t$link = $start ? \"<link rel='start' title='\" : \"<link rel='end' title='\";\n\t$link .= esc_attr($title);\n\t$link .= \"' href='\" . get_permalink($post) . \"' />\\n\";\n\n\t$boundary = $start ? 'start' : 'end';\n\treturn apply_filters( \"{$boundary}_post_rel_link\", $link );\n}\n\n/**\n * Display relational link for the first post.\n *\n * @since 2.8.0\n * @deprecated 3.3.0\n *\n * @param string $title Optional. Link title format.\n * @param bool $in_same_cat Optional. Whether link should be in a same category.\n * @param string $excluded_categories Optional. Excluded categories IDs.\n */\nfunction start_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '') {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\techo get_boundary_post_rel_link($title, $in_same_cat, $excluded_categories, true);\n}\n\n/**\n * Get site index relational link.\n *\n * @since 2.8.0\n * @deprecated 3.3.0\n *\n * @return string\n */\nfunction get_index_rel_link() {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\t$link = \"<link rel='index' title='\" . esc_attr( get_bloginfo( 'name', 'display' ) ) . \"' href='\" . esc_url( user_trailingslashit( get_bloginfo( 'url', 'display' ) ) ) . \"' />\\n\";\n\treturn apply_filters( \"index_rel_link\", $link );\n}\n\n/**\n * Display relational link for the site index.\n *\n * @since 2.8.0\n * @deprecated 3.3.0\n */\nfunction index_rel_link() {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\techo get_index_rel_link();\n}\n\n/**\n * Get parent post relational link.\n *\n * @since 2.8.0\n * @deprecated 3.3.0\n *\n * @param string $title Optional. Link title format.\n * @return string\n */\nfunction get_parent_post_rel_link($title = '%title') {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\tif ( ! empty( $GLOBALS['post'] ) && ! empty( $GLOBALS['post']->post_parent ) )\n\t\t$post = get_post($GLOBALS['post']->post_parent);\n\n\tif ( empty($post) )\n\t\treturn;\n\n\t$date = mysql2date(get_option('date_format'), $post->post_date);\n\n\t$title = str_replace('%title', $post->post_title, $title);\n\t$title = str_replace('%date', $date, $title);\n\t$title = apply_filters('the_title', $title, $post->ID);\n\n\t$link = \"<link rel='up' title='\";\n\t$link .= esc_attr( $title );\n\t$link .= \"' href='\" . get_permalink($post) . \"' />\\n\";\n\n\treturn apply_filters( \"parent_post_rel_link\", $link );\n}\n\n/**\n * Display relational link for parent item\n *\n * @since 2.8.0\n * @deprecated 3.3.0\n */\nfunction parent_post_rel_link($title = '%title') {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\techo get_parent_post_rel_link($title);\n}\n\n/**\n * Add the \"Dashboard\"/\"Visit Site\" menu.\n *\n * @since 3.2.0\n * @deprecated 3.3.0\n */\nfunction wp_admin_bar_dashboard_view_site_menu( $wp_admin_bar ) {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\t$user_id = get_current_user_id();\n\n\tif ( 0 != $user_id ) {\n\t\tif ( is_admin() )\n\t\t\t$wp_admin_bar->add_menu( array( 'id' => 'view-site', 'title' => __( 'Visit Site' ), 'href' => home_url() ) );\n\t\telseif ( is_multisite() )\n\t\t\t$wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => get_dashboard_url( $user_id ) ) );\n\t\telse\n\t\t\t$wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => admin_url() ) );\n\t}\n}\n\n/**\n * Checks if the current user belong to a given blog.\n *\n * @since MU\n * @deprecated 3.3.0 Use is_user_member_of_blog()\n * @see is_user_member_of_blog()\n *\n * @param int $blog_id Blog ID\n * @return bool True if the current users belong to $blog_id, false if not.\n */\nfunction is_blog_user( $blog_id = 0 ) {\n\t_deprecated_function( __FUNCTION__, '3.3', 'is_user_member_of_blog()' );\n\n\treturn is_user_member_of_blog( get_current_user_id(), $blog_id );\n}\n\n/**\n * Open the file handle for debugging.\n *\n * @since 0.71\n * @deprecated 3.4.0 Use error_log()\n * @see error_log()\n *\n * @link http://www.php.net/manual/en/function.error-log.php\n */\nfunction debug_fopen( $filename, $mode ) {\n\t_deprecated_function( __FUNCTION__, 'error_log()' );\n\treturn false;\n}\n\n/**\n * Write contents to the file used for debugging.\n *\n * @since 0.71\n * @deprecated 3.4.0 Use error_log()\n * @see error_log()\n *\n * @link http://www.php.net/manual/en/function.error-log.php\n */\nfunction debug_fwrite( $fp, $string ) {\n\t_deprecated_function( __FUNCTION__, 'error_log()' );\n\tif ( ! empty( $GLOBALS['debug'] ) )\n\t\terror_log( $string );\n}\n\n/**\n * Close the debugging file handle.\n *\n * @since 0.71\n * @deprecated 3.4.0 Use error_log()\n * @see error_log()\n *\n * @link http://www.php.net/manual/en/function.error-log.php\n */\nfunction debug_fclose( $fp ) {\n\t_deprecated_function( __FUNCTION__, 'error_log()' );\n}\n\n/**\n * Retrieve list of themes with theme data in theme directory.\n *\n * The theme is broken, if it doesn't have a parent theme and is missing either\n * style.css and, or index.php. If the theme has a parent theme then it is\n * broken, if it is missing style.css; index.php is optional.\n *\n * @since 1.5.0\n * @deprecated 3.4.0 Use wp_get_themes()\n * @see wp_get_themes()\n *\n * @return array Theme list with theme data.\n */\nfunction get_themes() {\n\t_deprecated_function( __FUNCTION__, '3.4', 'wp_get_themes()' );\n\n\tglobal $wp_themes;\n\tif ( isset( $wp_themes ) )\n\t\treturn $wp_themes;\n\n\t$themes = wp_get_themes();\n\t$wp_themes = array();\n\n\tforeach ( $themes as $theme ) {\n\t\t$name = $theme->get('Name');\n\t\tif ( isset( $wp_themes[ $name ] ) )\n\t\t\t$wp_themes[ $name . '/' . $theme->get_stylesheet() ] = $theme;\n\t\telse\n\t\t\t$wp_themes[ $name ] = $theme;\n\t}\n\n\treturn $wp_themes;\n}\n\n/**\n * Retrieve theme data.\n *\n * @since 1.5.0\n * @deprecated 3.4.0 Use wp_get_theme()\n * @see wp_get_theme()\n *\n * @param string $theme Theme name.\n * @return array|null Null, if theme name does not exist. Theme data, if exists.\n */\nfunction get_theme( $theme ) {\n\t_deprecated_function( __FUNCTION__, '3.4', 'wp_get_theme( $stylesheet )' );\n\n\t$themes = get_themes();\n\tif ( is_array( $themes ) && array_key_exists( $theme, $themes ) )\n\t\treturn $themes[ $theme ];\n\treturn null;\n}\n\n/**\n * Retrieve current theme name.\n *\n * @since 1.5.0\n * @deprecated 3.4.0 Use wp_get_theme()\n * @see wp_get_theme()\n *\n * @return string\n */\nfunction get_current_theme() {\n\t_deprecated_function( __FUNCTION__, '3.4', 'wp_get_theme()' );\n\n\tif ( $theme = get_option( 'current_theme' ) )\n\t\treturn $theme;\n\n\treturn wp_get_theme()->get('Name');\n}\n\n/**\n * Accepts matches array from preg_replace_callback in wpautop() or a string.\n *\n * Ensures that the contents of a `<pre>...</pre>` HTML block are not\n * converted into paragraphs or line-breaks.\n *\n * @since 1.2.0\n * @deprecated 3.4.0\n *\n * @param array|string $matches The array or string\n * @return string The pre block without paragraph/line-break conversion.\n */\nfunction clean_pre($matches) {\n\t_deprecated_function( __FUNCTION__, '3.4' );\n\n\tif ( is_array($matches) )\n\t\t$text = $matches[1] . $matches[2] . \"</pre>\";\n\telse\n\t\t$text = $matches;\n\n\t$text = str_replace(array('<br />', '<br/>', '<br>'), array('', '', ''), $text);\n\t$text = str_replace('<p>', \"\\n\", $text);\n\t$text = str_replace('</p>', '', $text);\n\n\treturn $text;\n}\n\n\n/**\n * Add callbacks for image header display.\n *\n * @since 2.1.0\n * @deprecated 3.4.0 Use add_theme_support()\n * @see add_theme_support()\n *\n * @param callable $wp_head_callback Call on 'wp_head' action.\n * @param callable $admin_head_callback Call on custom header administration screen.\n * @param callable $admin_preview_callback Output a custom header image div on the custom header administration screen. Optional.\n */\nfunction add_custom_image_header( $wp_head_callback, $admin_head_callback, $admin_preview_callback = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.4', 'add_theme_support( \\'custom-header\\', $args )' );\n\t$args = array(\n\t\t'wp-head-callback'    => $wp_head_callback,\n\t\t'admin-head-callback' => $admin_head_callback,\n\t);\n\tif ( $admin_preview_callback )\n\t\t$args['admin-preview-callback'] = $admin_preview_callback;\n\treturn add_theme_support( 'custom-header', $args );\n}\n\n/**\n * Remove image header support.\n *\n * @since 3.1.0\n * @deprecated 3.4.0 Use remove_theme_support()\n * @see remove_theme_support()\n *\n * @return null|bool Whether support was removed.\n */\nfunction remove_custom_image_header() {\n\t_deprecated_function( __FUNCTION__, '3.4', 'remove_theme_support( \\'custom-header\\' )' );\n\treturn remove_theme_support( 'custom-header' );\n}\n\n/**\n * Add callbacks for background image display.\n *\n * @since 3.0.0\n * @deprecated 3.4.0 Use add_theme_support()\n * @see add_theme_support()\n *\n * @param callable $wp_head_callback Call on 'wp_head' action.\n * @param callable $admin_head_callback Call on custom background administration screen.\n * @param callable $admin_preview_callback Output a custom background image div on the custom background administration screen. Optional.\n */\nfunction add_custom_background( $wp_head_callback = '', $admin_head_callback = '', $admin_preview_callback = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.4', 'add_theme_support( \\'custom-background\\', $args )' );\n\t$args = array();\n\tif ( $wp_head_callback )\n\t\t$args['wp-head-callback'] = $wp_head_callback;\n\tif ( $admin_head_callback )\n\t\t$args['admin-head-callback'] = $admin_head_callback;\n\tif ( $admin_preview_callback )\n\t\t$args['admin-preview-callback'] = $admin_preview_callback;\n\treturn add_theme_support( 'custom-background', $args );\n}\n\n/**\n * Remove custom background support.\n *\n * @since 3.1.0\n * @deprecated 3.4.0 Use add_custom_background()\n * @see add_custom_background()\n *\n * @return null|bool Whether support was removed.\n */\nfunction remove_custom_background() {\n\t_deprecated_function( __FUNCTION__, '3.4', 'remove_theme_support( \\'custom-background\\' )' );\n\treturn remove_theme_support( 'custom-background' );\n}\n\n/**\n * Retrieve theme data from parsed theme file.\n *\n * @since 1.5.0\n * @deprecated 3.4.0 Use wp_get_theme()\n * @see wp_get_theme()\n *\n * @param string $theme_file Theme file path.\n * @return array Theme data.\n */\nfunction get_theme_data( $theme_file ) {\n\t_deprecated_function( __FUNCTION__, '3.4', 'wp_get_theme()' );\n\t$theme = new WP_Theme( basename( dirname( $theme_file ) ), dirname( dirname( $theme_file ) ) );\n\n\t$theme_data = array(\n\t\t'Name' => $theme->get('Name'),\n\t\t'URI' => $theme->display('ThemeURI', true, false),\n\t\t'Description' => $theme->display('Description', true, false),\n\t\t'Author' => $theme->display('Author', true, false),\n\t\t'AuthorURI' => $theme->display('AuthorURI', true, false),\n\t\t'Version' => $theme->get('Version'),\n\t\t'Template' => $theme->get('Template'),\n\t\t'Status' => $theme->get('Status'),\n\t\t'Tags' => $theme->get('Tags'),\n\t\t'Title' => $theme->get('Name'),\n\t\t'AuthorName' => $theme->get('Author'),\n\t);\n\n\tforeach ( apply_filters( 'extra_theme_headers', array() ) as $extra_header ) {\n\t\tif ( ! isset( $theme_data[ $extra_header ] ) )\n\t\t\t$theme_data[ $extra_header ] = $theme->get( $extra_header );\n\t}\n\n\treturn $theme_data;\n}\n\n/**\n * Alias of update_post_cache().\n *\n * @see update_post_cache() Posts and pages are the same, alias is intentional\n *\n * @since 1.5.1\n * @deprecated 3.4.0 Use update_post_cache()\n * @see update_post_cache()\n *\n * @param array $pages list of page objects\n */\nfunction update_page_cache( &$pages ) {\n\t_deprecated_function( __FUNCTION__, '3.4', 'update_post_cache()' );\n\n\tupdate_post_cache( $pages );\n}\n\n/**\n * Will clean the page in the cache.\n *\n * Clean (read: delete) page from cache that matches $id. Will also clean cache\n * associated with 'all_page_ids' and 'get_pages'.\n *\n * @since 2.0.0\n * @deprecated 3.4.0 Use clean_post_cache\n * @see clean_post_cache()\n *\n * @param int $id Page ID to clean\n */\nfunction clean_page_cache( $id ) {\n\t_deprecated_function( __FUNCTION__, '3.4', 'clean_post_cache()' );\n\n\tclean_post_cache( $id );\n}\n\n/**\n * Retrieve nonce action \"Are you sure\" message.\n *\n * Deprecated in 3.4.1 and 3.5.0. Backported to 3.3.3.\n *\n * @since 2.0.4\n * @deprecated 3.4.1 Use wp_nonce_ays()\n * @see wp_nonce_ays()\n *\n * @param string $action Nonce action.\n * @return string Are you sure message.\n */\nfunction wp_explain_nonce( $action ) {\n\t_deprecated_function( __FUNCTION__, '3.4.1', 'wp_nonce_ays()' );\n\treturn __( 'Are you sure you want to do this?' );\n}\n\n/**\n * Display \"sticky\" CSS class, if a post is sticky.\n *\n * @since 2.7.0\n * @deprecated 3.5.0 Use post_class()\n * @see post_class()\n *\n * @param int $post_id An optional post ID.\n */\nfunction sticky_class( $post_id = null ) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'post_class()' );\n\tif ( is_sticky( $post_id ) )\n\t\techo ' sticky';\n}\n\n/**\n * Retrieve post ancestors.\n *\n * This is no longer needed as WP_Post lazy-loads the ancestors\n * property with get_post_ancestors().\n *\n * @since 2.3.4\n * @deprecated 3.5.0 Use get_post_ancestors()\n * @see get_post_ancestors()\n */\nfunction _get_post_ancestors( &$post ) {\n\t_deprecated_function( __FUNCTION__, '3.5' );\n}\n\n/**\n * Load an image from a string, if PHP supports it.\n *\n * @since 2.1.0\n * @deprecated 3.5.0 Use wp_get_image_editor()\n * @see wp_get_image_editor()\n *\n * @param string $file Filename of the image to load.\n * @return resource The resulting image resource on success, Error string on failure.\n */\nfunction wp_load_image( $file ) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'wp_get_image_editor()' );\n\n\tif ( is_numeric( $file ) )\n\t\t$file = get_attached_file( $file );\n\n\tif ( ! is_file( $file ) )\n\t\treturn sprintf(__('File &#8220;%s&#8221; doesn&#8217;t exist?'), $file);\n\n\tif ( ! function_exists('imagecreatefromstring') )\n\t\treturn __('The GD image library is not installed.');\n\n\t// Set artificially high because GD uses uncompressed images in memory\n\t@ini_set( 'memory_limit', apply_filters( 'image_memory_limit', WP_MAX_MEMORY_LIMIT ) );\n\t$image = imagecreatefromstring( file_get_contents( $file ) );\n\n\tif ( !is_resource( $image ) )\n\t\treturn sprintf(__('File &#8220;%s&#8221; is not an image.'), $file);\n\n\treturn $image;\n}\n\n/**\n * Scale down an image to fit a particular size and save a new copy of the image.\n *\n * The PNG transparency will be preserved using the function, as well as the\n * image type. If the file going in is PNG, then the resized image is going to\n * be PNG. The only supported image types are PNG, GIF, and JPEG.\n *\n * Some functionality requires API to exist, so some PHP version may lose out\n * support. This is not the fault of WordPress (where functionality is\n * downgraded, not actual defects), but of your PHP version.\n *\n * @since 2.5.0\n * @deprecated 3.5.0 Use wp_get_image_editor()\n * @see wp_get_image_editor()\n *\n * @param string $file Image file path.\n * @param int $max_w Maximum width to resize to.\n * @param int $max_h Maximum height to resize to.\n * @param bool $crop Optional. Whether to crop image or resize.\n * @param string $suffix Optional. File suffix.\n * @param string $dest_path Optional. New image file path.\n * @param int $jpeg_quality Optional, default is 90. Image quality percentage.\n * @return mixed WP_Error on failure. String with new destination path.\n */\nfunction image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'wp_get_image_editor()' );\n\n\t$editor = wp_get_image_editor( $file );\n\tif ( is_wp_error( $editor ) )\n\t\treturn $editor;\n\t$editor->set_quality( $jpeg_quality );\n\n\t$resized = $editor->resize( $max_w, $max_h, $crop );\n\tif ( is_wp_error( $resized ) )\n\t\treturn $resized;\n\n\t$dest_file = $editor->generate_filename( $suffix, $dest_path );\n\t$saved = $editor->save( $dest_file );\n\n\tif ( is_wp_error( $saved ) )\n\t\treturn $saved;\n\n\treturn $dest_file;\n}\n\n/**\n * Retrieve a single post, based on post ID.\n *\n * Has categories in 'post_category' property or key. Has tags in 'tags_input'\n * property or key.\n *\n * @since 1.0.0\n * @deprecated 3.5.0 Use get_post()\n * @see get_post()\n *\n * @param int $postid Post ID.\n * @param string $mode How to return result, either OBJECT, ARRAY_N, or ARRAY_A.\n * @return WP_Post|null Post object or array holding post contents and information\n */\nfunction wp_get_single_post( $postid = 0, $mode = OBJECT ) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'get_post()' );\n\treturn get_post( $postid, $mode );\n}\n\n/**\n * Check that the user login name and password is correct.\n *\n * @since 0.71\n * @deprecated 3.5.0 Use wp_authenticate()\n * @see wp_authenticate()\n *\n * @param string $user_login User name.\n * @param string $user_pass User password.\n * @return bool False if does not authenticate, true if username and password authenticates.\n */\nfunction user_pass_ok($user_login, $user_pass) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'wp_authenticate()' );\n\t$user = wp_authenticate( $user_login, $user_pass );\n\tif ( is_wp_error( $user ) )\n\t\treturn false;\n\n\treturn true;\n}\n\n/**\n * Callback formerly fired on the save_post hook. No longer needed.\n *\n * @since 2.3.0\n * @deprecated 3.5.0\n */\nfunction _save_post_hook() {}\n\n/**\n * Check if the installed version of GD supports particular image type\n *\n * @since 2.9.0\n * @deprecated 3.5.0 Use wp_image_editor_supports()\n * @see wp_image_editor_supports()\n *\n * @param string $mime_type\n * @return bool\n */\nfunction gd_edit_image_support($mime_type) {\n\t_deprecated_function( __FUNCTION__, '3.5', 'wp_image_editor_supports()' );\n\n\tif ( function_exists('imagetypes') ) {\n\t\tswitch( $mime_type ) {\n\t\t\tcase 'image/jpeg':\n\t\t\t\treturn (imagetypes() & IMG_JPG) != 0;\n\t\t\tcase 'image/png':\n\t\t\t\treturn (imagetypes() & IMG_PNG) != 0;\n\t\t\tcase 'image/gif':\n\t\t\t\treturn (imagetypes() & IMG_GIF) != 0;\n\t\t}\n\t} else {\n\t\tswitch( $mime_type ) {\n\t\t\tcase 'image/jpeg':\n\t\t\t\treturn function_exists('imagecreatefromjpeg');\n\t\t\tcase 'image/png':\n\t\t\t\treturn function_exists('imagecreatefrompng');\n\t\t\tcase 'image/gif':\n\t\t\t\treturn function_exists('imagecreatefromgif');\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Converts an integer byte value to a shorthand byte value.\n *\n * @since 2.3.0\n * @deprecated 3.6.0 Use size_format()\n * @see size_format()\n *\n * @param int $bytes An integer byte value.\n * @return string A shorthand byte value.\n */\nfunction wp_convert_bytes_to_hr( $bytes ) {\n\t_deprecated_function( __FUNCTION__, '3.6', 'size_format()' );\n\n\t$units = array( 0 => 'B', 1 => 'kB', 2 => 'MB', 3 => 'GB', 4 => 'TB' );\n\t$log   = log( $bytes, KB_IN_BYTES );\n\t$power = (int) $log;\n\t$size  = pow( KB_IN_BYTES, $log - $power );\n\n\tif ( ! is_nan( $size ) && array_key_exists( $power, $units ) ) {\n\t\t$unit = $units[ $power ];\n\t} else {\n\t\t$size = $bytes;\n\t\t$unit = $units[0];\n\t}\n\n\treturn $size . $unit;\n}\n\n/**\n * Formerly used internally to tidy up the search terms.\n *\n * @since 2.9.0\n * @access private\n * @deprecated 3.7.0\n */\nfunction _search_terms_tidy( $t ) {\n\t_deprecated_function( __FUNCTION__, '3.7' );\n\treturn trim( $t, \"\\\"'\\n\\r \" );\n}\n\n/**\n * Determine if TinyMCE is available.\n *\n * Checks to see if the user has deleted the tinymce files to slim down\n * their WordPress install.\n *\n * @since 2.1.0\n * @deprecated 3.9.0\n *\n * @return bool Whether TinyMCE exists.\n */\nfunction rich_edit_exists() {\n\tglobal $wp_rich_edit_exists;\n\t_deprecated_function( __FUNCTION__, '3.9' );\n\n\tif ( ! isset( $wp_rich_edit_exists ) )\n\t\t$wp_rich_edit_exists = file_exists( ABSPATH . WPINC . '/js/tinymce/tinymce.js' );\n\n\treturn $wp_rich_edit_exists;\n}\n\n/**\n * Old callback for tag link tooltips.\n *\n * @since 2.7.0\n * @access private\n * @deprecated 3.9.0\n */\nfunction default_topic_count_text( $count ) {\n\treturn $count;\n}\n\n/**\n * Formerly used to escape strings before inserting into the DB.\n *\n * Has not performed this function for many, many years. Use wpdb::prepare() instead.\n *\n * @since 0.71\n * @deprecated 3.9.0\n *\n * @param string $content The text to format.\n * @return string The very same text.\n */\nfunction format_to_post( $content ) {\n\t_deprecated_function( __FUNCTION__, '3.9' );\n\treturn $content;\n}\n\n/**\n * Formerly used to escape strings before searching the DB. It was poorly documented and never worked as described.\n *\n * @since 2.5.0\n * @deprecated 4.0.0 Use wpdb::esc_like()\n * @see wpdb::esc_like()\n *\n * @param string $text The text to be escaped.\n * @return string text, safe for inclusion in LIKE query.\n */\nfunction like_escape($text) {\n\t_deprecated_function( __FUNCTION__, '4.0', 'wpdb::esc_like()' );\n\treturn str_replace( array( \"%\", \"_\" ), array( \"\\\\%\", \"\\\\_\" ), $text );\n}\n\n/**\n * Determines if the URL can be accessed over SSL.\n *\n * Determines if the URL can be accessed over SSL by using the WordPress HTTP API to access\n * the URL using https as the scheme.\n *\n * @since 2.5.0\n * @deprecated 4.0.0\n *\n * @param string $url The URL to test.\n * @return bool Whether SSL access is available.\n */\nfunction url_is_accessable_via_ssl( $url ) {\n\t_deprecated_function( __FUNCTION__, '4.0' );\n\n\t$response = wp_remote_get( set_url_scheme( $url, 'https' ) );\n\n\tif ( !is_wp_error( $response ) ) {\n\t\t$status = wp_remote_retrieve_response_code( $response );\n\t\tif ( 200 == $status || 401 == $status ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Start preview theme output buffer.\n *\n * Will only perform task if the user has permissions and template and preview\n * query variables exist.\n *\n * @since 2.6.0\n * @deprecated 4.3.0\n */\nfunction preview_theme() {\n\t_deprecated_function( __FUNCTION__, '4.3' );\n}\n\n/**\n * Private function to modify the current template when previewing a theme\n *\n * @since 2.9.0\n * @deprecated 4.3.0\n * @access private\n *\n * @return string\n */\nfunction _preview_theme_template_filter() {\n\t_deprecated_function( __FUNCTION__, '4.3' );\n\treturn '';\n}\n\n/**\n * Private function to modify the current stylesheet when previewing a theme\n *\n * @since 2.9.0\n * @deprecated 4.3.0\n * @access private\n *\n * @return string\n */\nfunction _preview_theme_stylesheet_filter() {\n\t_deprecated_function( __FUNCTION__, '4.3' );\n\treturn '';\n}\n\n/**\n * Callback function for ob_start() to capture all links in the theme.\n *\n * @since 2.6.0\n * @deprecated 4.3.0\n * @access private\n *\n * @param string $content\n * @return string\n */\nfunction preview_theme_ob_filter( $content ) {\n\t_deprecated_function( __FUNCTION__, '4.3' );\n\treturn $content;\n}\n\n/**\n * Manipulates preview theme links in order to control and maintain location.\n *\n * Callback function for preg_replace_callback() to accept and filter matches.\n *\n * @since 2.6.0\n * @deprecated 4.3.0\n * @access private\n *\n * @param array $matches\n * @return string\n */\nfunction preview_theme_ob_filter_callback( $matches ) {\n\t_deprecated_function( __FUNCTION__, '4.3' );\n\treturn '';\n}\n\n/**\n * Formats text for the rich text editor.\n *\n * The filter 'richedit_pre' is applied here. If $text is empty the filter will\n * be applied to an empty string.\n *\n * @since 2.0.0\n * @deprecated 4.3.0\n *\n * @param string $text The text to be formatted.\n * @return string The formatted text after filter is applied.\n */\nfunction wp_richedit_pre($text) {\n\t_deprecated_function( __FUNCTION__, '4.3', 'format_for_editor()' );\n\n\tif ( empty( $text ) ) {\n\t\t/**\n\t\t * Filter text returned for the rich text editor.\n\t\t *\n\t\t * This filter is first evaluated, and the value returned, if an empty string\n\t\t * is passed to wp_richedit_pre(). If an empty string is passed, it results\n\t\t * in a break tag and line feed.\n\t\t *\n\t\t * If a non-empty string is passed, the filter is evaluated on the wp_richedit_pre()\n\t\t * return after being formatted.\n\t\t *\n\t\t * @since 2.0.0\n\t\t * @deprecated 4.3.0\n\t\t *\n\t\t * @param string $output Text for the rich text editor.\n\t\t */\n\t\treturn apply_filters( 'richedit_pre', '' );\n\t}\n\n\t$output = convert_chars($text);\n\t$output = wpautop($output);\n\t$output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) );\n\n\t/** This filter is documented in wp-includes/deprecated.php */\n\treturn apply_filters( 'richedit_pre', $output );\n}\n\n/**\n * Formats text for the HTML editor.\n *\n * Unless $output is empty it will pass through htmlspecialchars before the\n * 'htmledit_pre' filter is applied.\n *\n * @since 2.5.0\n * @deprecated 4.3.0 Use format_for_editor()\n * @see format_for_editor()\n *\n * @param string $output The text to be formatted.\n * @return string Formatted text after filter applied.\n */\nfunction wp_htmledit_pre($output) {\n\t_deprecated_function( __FUNCTION__, '4.3', 'format_for_editor()' );\n\n\tif ( !empty($output) )\n\t\t$output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); // convert only < > &\n\n\t/**\n\t * Filter the text before it is formatted for the HTML editor.\n\t *\n\t * @since 2.5.0\n\t * @deprecated 4.3.0\n\t *\n\t * @param string $output The HTML-formatted text.\n\t */\n\treturn apply_filters( 'htmledit_pre', $output );\n}\n\n/**\n * Retrieve permalink from post ID.\n *\n * @since 1.0.0\n * @deprecated 4.4.0 Use get_permalink()\n * @see get_permalink()\n *\n * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post.\n * @return string|false\n */\nfunction post_permalink( $post_id = 0 ) {\n\t_deprecated_function( __FUNCTION__, '4.4', 'get_permalink()' );\n\n\treturn get_permalink( $post_id );\n}\n\n/**\n * Perform a HTTP HEAD or GET request.\n *\n * If $file_path is a writable filename, this will do a GET request and write\n * the file to that path.\n *\n * @since 2.5.0\n * @deprecated 4.4.0 Use WP_Http\n * @see WP_Http\n *\n * @param string      $url       URL to fetch.\n * @param string|bool $file_path Optional. File path to write request to. Default false.\n * @param int         $red       Optional. The number of Redirects followed, Upon 5 being hit,\n *                               returns false. Default 1.\n * @return bool|string False on failure and string of headers if HEAD request.\n */\nfunction wp_get_http( $url, $file_path = false, $red = 1 ) {\n\t_deprecated_function( __FUNCTION__, '4.4', 'WP_Http' );\n\n\t@set_time_limit( 60 );\n\n\tif ( $red > 5 )\n\t\treturn false;\n\n\t$options = array();\n\t$options['redirection'] = 5;\n\n\tif ( false == $file_path )\n\t\t$options['method'] = 'HEAD';\n\telse\n\t\t$options['method'] = 'GET';\n\n\t$response = wp_safe_remote_request( $url, $options );\n\n\tif ( is_wp_error( $response ) )\n\t\treturn false;\n\n\t$headers = wp_remote_retrieve_headers( $response );\n\t$headers['response'] = wp_remote_retrieve_response_code( $response );\n\n\t// WP_HTTP no longer follows redirects for HEAD requests.\n\tif ( 'HEAD' == $options['method'] && in_array($headers['response'], array(301, 302)) && isset( $headers['location'] ) ) {\n\t\treturn wp_get_http( $headers['location'], $file_path, ++$red );\n\t}\n\n\tif ( false == $file_path )\n\t\treturn $headers;\n\n\t// GET request - write it to the supplied filename\n\t$out_fp = fopen($file_path, 'w');\n\tif ( !$out_fp )\n\t\treturn $headers;\n\n\tfwrite( $out_fp,  wp_remote_retrieve_body( $response ) );\n\tfclose($out_fp);\n\tclearstatcache();\n\n\treturn $headers;\n}\n\n/**\n * Whether SSL login should be forced.\n *\n * @since 2.6.0\n * @deprecated 4.4.0 Use force_ssl_admin()\n * @see force_ssl_admin()\n *\n * @param string|bool $force Optional Whether to force SSL login. Default null.\n * @return bool True if forced, false if not forced.\n */\nfunction force_ssl_login( $force = null ) {\n\t_deprecated_function( __FUNCTION__, '4.4', 'force_ssl_admin()' );\n\treturn force_ssl_admin( $force );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/embed-template.php",
    "content": "<?php\n/**\n * Contains the post embed template.\n *\n * When a post is embedded in an iframe, this file is used to\n * create the output.\n *\n * @package WordPress\n * @subpackage oEmbed\n * @since 4.4.0\n */\n\nif ( ! headers_sent() ) {\n\theader( 'X-WP-embed: true' );\n}\n\n?>\n<!DOCTYPE html>\n<html <?php language_attributes(); ?> class=\"no-js\">\n<head>\n\t<title><?php echo wp_get_document_title(); ?></title>\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n\t<?php\n\t/**\n\t * Print scripts or data in the embed template <head> tag.\n\t *\n\t * @since 4.4.0\n\t */\n\tdo_action( 'embed_head' );\n\t?>\n</head>\n<body <?php body_class(); ?>>\n<?php\nif ( have_posts() ) :\n\twhile ( have_posts() ) : the_post();\n\t\t// Add post thumbnail to response if available.\n\t\t$thumbnail_id = false;\n\n\t\tif ( has_post_thumbnail() ) {\n\t\t\t$thumbnail_id = get_post_thumbnail_id();\n\t\t}\n\n\t\tif ( 'attachment' === get_post_type() && wp_attachment_is_image() ) {\n\t\t\t$thumbnail_id = get_the_ID();\n\t\t}\n\n\t\tif ( $thumbnail_id ) {\n\t\t\t$aspect_ratio = 1;\n\t\t\t$measurements = array( 1, 1 );\n\t\t\t$image_size   = 'full'; // Fallback.\n\n\t\t\t$meta = wp_get_attachment_metadata( $thumbnail_id );\n\t\t\tif ( ! empty( $meta['sizes'] ) ) {\n\t\t\t\tforeach ( $meta['sizes'] as $size => $data ) {\n\t\t\t\t\tif ( $data['width'] / $data['height'] > $aspect_ratio ) {\n\t\t\t\t\t\t$aspect_ratio = $data['width'] / $data['height'];\n\t\t\t\t\t\t$measurements = array( $data['width'], $data['height'] );\n\t\t\t\t\t\t$image_size   = $size;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter the thumbnail image size for use in the embed template.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param string $image_size Thumbnail image size.\n\t\t\t */\n\t\t\t$image_size = apply_filters( 'embed_thumbnail_image_size', $image_size );\n\n\t\t\t$shape = $measurements[0] / $measurements[1] >= 1.75 ? 'rectangular' : 'square';\n\n\t\t\t/**\n\t\t\t * Filter the thumbnail shape for use in the embed template.\n\t\t\t *\n\t\t\t * Rectangular images are shown above the title\n\t\t\t * while square images are shown next to the content.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param string $shape Thumbnail image shape. Either 'rectangular' or 'square'.\n\t\t\t */\n\t\t\t$shape = apply_filters( 'embed_thumbnail_image_shape', $shape );\n\t\t}\n\t\t?>\n\t\t<div <?php post_class( 'wp-embed' ); ?>>\n\t\t\t<?php if ( $thumbnail_id && 'rectangular' === $shape ) : ?>\n\t\t\t\t<div class=\"wp-embed-featured-image rectangular\">\n\t\t\t\t\t<a href=\"<?php the_permalink(); ?>\" target=\"_top\">\n\t\t\t\t\t\t<?php echo wp_get_attachment_image( $thumbnail_id, $image_size ); ?>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t<?php endif; ?>\n\n\t\t\t<p class=\"wp-embed-heading\">\n\t\t\t\t<a href=\"<?php the_permalink(); ?>\" target=\"_top\">\n\t\t\t\t\t<?php the_title(); ?>\n\t\t\t\t</a>\n\t\t\t</p>\n\n\t\t\t<?php if ( $thumbnail_id && 'square' === $shape ) : ?>\n\t\t\t\t<div class=\"wp-embed-featured-image square\">\n\t\t\t\t\t<a href=\"<?php the_permalink(); ?>\" target=\"_top\">\n\t\t\t\t\t\t<?php echo wp_get_attachment_image( $thumbnail_id, $image_size ); ?>\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t<?php endif; ?>\n\n\t\t\t<div class=\"wp-embed-excerpt\"><?php the_excerpt_embed(); ?></div>\n\n\t\t\t<?php\n\t\t\t/**\n\t\t\t * Print additional content after the embed excerpt.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t */\n\t\t\tdo_action( 'embed_content' );\n\t\t\t?>\n\n\t\t\t<div class=\"wp-embed-footer\">\n\t\t\t\t<div class=\"wp-embed-site-title\">\n\t\t\t\t\t<?php\n\t\t\t\t\t$site_title = sprintf(\n\t\t\t\t\t\t'<a href=\"%s\" target=\"_top\"><img src=\"%s\" srcset=\"%s 2x\" width=\"32\" height=\"32\" alt=\"\" class=\"wp-embed-site-icon\"/><span>%s</span></a>',\n\t\t\t\t\t\tesc_url( home_url() ),\n\t\t\t\t\t\tesc_url( get_site_icon_url( 32, admin_url( 'images/w-logo-blue.png' ) ) ),\n\t\t\t\t\t\tesc_url( get_site_icon_url( 64, admin_url( 'images/w-logo-blue.png' ) ) ),\n\t\t\t\t\t\tesc_html( get_bloginfo( 'name' ) )\n\t\t\t\t\t);\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the site title HTML in the embed footer.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 4.4.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param string $site_title The site title HTML.\n\t\t\t\t\t */\n\t\t\t\t\techo apply_filters( 'embed_site_title_html', $site_title );\n\t\t\t\t\t?>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"wp-embed-meta\">\n\t\t\t\t\t<?php\n\t\t\t\t\t/**\n\t\t\t\t\t * Print additional meta content in the embed template.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 4.4.0\n\t\t\t\t\t */\n\t\t\t\t\tdo_action( 'embed_content_meta');\n\t\t\t\t\t?>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<?php\n\tendwhile;\nelse :\n\t?>\n\t<div class=\"wp-embed\">\n\t\t<p class=\"wp-embed-heading\"><?php _e( 'Oops! That embed can&#8217;t be found.' ); ?></p>\n\n\t\t<div class=\"wp-embed-excerpt\">\n\t\t\t<p>\n\t\t\t\t<?php\n\t\t\t\tprintf(\n\t\t\t\t\t/* translators: %s: a link to the embedded site */\n\t\t\t\t\t__( 'It looks like nothing was found at this location. Maybe try visiting %s directly?' ),\n\t\t\t\t\t'<strong><a href=\"' . esc_url( home_url() ) . '\">' . esc_html( get_bloginfo( 'name' ) ) . '</a></strong>'\n\t\t\t\t);\n\t\t\t\t?>\n\t\t\t</p>\n\t\t</div>\n\n\t\t<div class=\"wp-embed-footer\">\n\t\t\t<div class=\"wp-embed-site-title\">\n\t\t\t\t<?php\n\t\t\t\t$site_title = sprintf(\n\t\t\t\t\t'<a href=\"%s\" target=\"_top\"><img src=\"%s\" srcset=\"%s 2x\" width=\"32\" height=\"32\" alt=\"\" class=\"wp-embed-site-icon\"/><span>%s</span></a>',\n\t\t\t\t\tesc_url( home_url() ),\n\t\t\t\t\tesc_url( get_site_icon_url( 32, admin_url( 'images/w-logo-blue.png' ) ) ),\n\t\t\t\t\tesc_url( get_site_icon_url( 64, admin_url( 'images/w-logo-blue.png' ) ) ),\n\t\t\t\t\tesc_html( get_bloginfo( 'name' ) )\n\t\t\t\t);\n\n\t\t\t\t/** This filter is documented in wp-includes/embed-template.php */\n\t\t\t\techo apply_filters( 'embed_site_title_html', $site_title );\n\t\t\t\t?>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<?php\nendif;\n\n/**\n * Print scripts or data before the closing body tag in the embed template.\n *\n * @since 4.4.0\n */\ndo_action( 'embed_footer' );\n?>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/embed.php",
    "content": "<?php\n/**\n * oEmbed API: Top-level oEmbed functionality\n *\n * @package WordPress\n * @subpackage oEmbed\n * @since 4.4.0\n */\n\n/**\n * Registers an embed handler.\n *\n * Should probably only be used for sites that do not support oEmbed.\n *\n * @since 2.9.0\n *\n * @global WP_Embed $wp_embed\n *\n * @param string   $id       An internal ID/name for the handler. Needs to be unique.\n * @param string   $regex    The regex that will be used to see if this handler should be used for a URL.\n * @param callable $callback The callback function that will be called if the regex is matched.\n * @param int      $priority Optional. Used to specify the order in which the registered handlers will\n *                           be tested. Default 10.\n */\nfunction wp_embed_register_handler( $id, $regex, $callback, $priority = 10 ) {\n\tglobal $wp_embed;\n\t$wp_embed->register_handler( $id, $regex, $callback, $priority );\n}\n\n/**\n * Unregisters a previously-registered embed handler.\n *\n * @since 2.9.0\n *\n * @global WP_Embed $wp_embed\n *\n * @param string $id       The handler ID that should be removed.\n * @param int    $priority Optional. The priority of the handler to be removed. Default 10.\n */\nfunction wp_embed_unregister_handler( $id, $priority = 10 ) {\n\tglobal $wp_embed;\n\t$wp_embed->unregister_handler( $id, $priority );\n}\n\n/**\n * Creates default array of embed parameters.\n *\n * The width defaults to the content width as specified by the theme. If the\n * theme does not specify a content width, then 500px is used.\n *\n * The default height is 1.5 times the width, or 1000px, whichever is smaller.\n *\n * The 'embed_defaults' filter can be used to adjust either of these values.\n *\n * @since 2.9.0\n *\n * @global int $content_width\n *\n * @param string $url Optional. The URL that should be embedded. Default empty.\n *\n * @return array Default embed parameters.\n */\nfunction wp_embed_defaults( $url = '' ) {\n\tif ( ! empty( $GLOBALS['content_width'] ) )\n\t\t$width = (int) $GLOBALS['content_width'];\n\n\tif ( empty( $width ) )\n\t\t$width = 500;\n\n\t$height = min( ceil( $width * 1.5 ), 1000 );\n\n\t/**\n\t * Filter the default array of embed dimensions.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param array  $size An array of embed width and height values\n\t *                     in pixels (in that order).\n\t * @param string $url  The URL that should be embedded.\n\t */\n\treturn apply_filters( 'embed_defaults', compact( 'width', 'height' ), $url );\n}\n\n/**\n * Attempts to fetch the embed HTML for a provided URL using oEmbed.\n *\n * @since 2.9.0\n *\n * @see WP_oEmbed\n *\n * @param string $url  The URL that should be embedded.\n * @param array  $args Optional. Additional arguments and parameters for retrieving embed HTML.\n *                     Default empty.\n * @return false|string False on failure or the embed HTML on success.\n */\nfunction wp_oembed_get( $url, $args = '' ) {\n\trequire_once( ABSPATH . WPINC . '/class-oembed.php' );\n\t$oembed = _wp_oembed_get_object();\n\treturn $oembed->get_html( $url, $args );\n}\n\n/**\n * Adds a URL format and oEmbed provider URL pair.\n *\n * @since 2.9.0\n *\n * @see WP_oEmbed\n *\n * @param string  $format   The format of URL that this provider can handle. You can use asterisks\n *                          as wildcards.\n * @param string  $provider The URL to the oEmbed provider.\n * @param boolean $regex    Optional. Whether the `$format` parameter is in a RegEx format. Default false.\n */\nfunction wp_oembed_add_provider( $format, $provider, $regex = false ) {\n\trequire_once( ABSPATH . WPINC . '/class-oembed.php' );\n\n\tif ( did_action( 'plugins_loaded' ) ) {\n\t\t$oembed = _wp_oembed_get_object();\n\t\t$oembed->providers[$format] = array( $provider, $regex );\n\t} else {\n\t\tWP_oEmbed::_add_provider_early( $format, $provider, $regex );\n\t}\n}\n\n/**\n * Removes an oEmbed provider.\n *\n * @since 3.5.0\n *\n * @see WP_oEmbed\n *\n * @param string $format The URL format for the oEmbed provider to remove.\n * @return bool Was the provider removed successfully?\n */\nfunction wp_oembed_remove_provider( $format ) {\n\trequire_once( ABSPATH . WPINC . '/class-oembed.php' );\n\n\tif ( did_action( 'plugins_loaded' ) ) {\n\t\t$oembed = _wp_oembed_get_object();\n\n\t\tif ( isset( $oembed->providers[ $format ] ) ) {\n\t\t\tunset( $oembed->providers[ $format ] );\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\tWP_oEmbed::_remove_provider_early( $format );\n\t}\n\n\treturn false;\n}\n\n/**\n * Determines if default embed handlers should be loaded.\n *\n * Checks to make sure that the embeds library hasn't already been loaded. If\n * it hasn't, then it will load the embeds library.\n *\n * @since 2.9.0\n *\n * @see wp_embed_register_handler()\n */\nfunction wp_maybe_load_embeds() {\n\t/**\n\t * Filter whether to load the default embed handlers.\n\t *\n\t * Returning a falsey value will prevent loading the default embed handlers.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param bool $maybe_load_embeds Whether to load the embeds library. Default true.\n\t */\n\tif ( ! apply_filters( 'load_default_embeds', true ) ) {\n\t\treturn;\n\t}\n\n\twp_embed_register_handler( 'youtube_embed_url', '#https?://(www.)?youtube\\.com/(?:v|embed)/([^/]+)#i', 'wp_embed_handler_youtube' );\n\n\twp_embed_register_handler( 'googlevideo', '#http://video\\.google\\.([A-Za-z.]{2,5})/videoplay\\?docid=([\\d-]+)(.*?)#i', 'wp_embed_handler_googlevideo' );\n\n\t/**\n\t * Filter the audio embed handler callback.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param callable $handler Audio embed handler callback function.\n\t */\n\twp_embed_register_handler( 'audio', '#^https?://.+?\\.(' . join( '|', wp_get_audio_extensions() ) . ')$#i', apply_filters( 'wp_audio_embed_handler', 'wp_embed_handler_audio' ), 9999 );\n\n\t/**\n\t * Filter the video embed handler callback.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param callable $handler Video embed handler callback function.\n\t */\n\twp_embed_register_handler( 'video', '#^https?://.+?\\.(' . join( '|', wp_get_video_extensions() ) . ')$#i', apply_filters( 'wp_video_embed_handler', 'wp_embed_handler_video' ), 9999 );\n}\n\n/**\n * The Google Video embed handler callback.\n *\n * Google Video does not support oEmbed.\n *\n * @see WP_Embed::register_handler()\n * @see WP_Embed::shortcode()\n *\n * @param array  $matches The RegEx matches from the provided regex when calling wp_embed_register_handler().\n * @param array  $attr    Embed attributes.\n * @param string $url     The original URL that was matched by the regex.\n * @param array  $rawattr The original unmodified attributes.\n * @return string The embed HTML.\n */\nfunction wp_embed_handler_googlevideo( $matches, $attr, $url, $rawattr ) {\n\t// If the user supplied a fixed width AND height, use it\n\tif ( !empty($rawattr['width']) && !empty($rawattr['height']) ) {\n\t\t$width  = (int) $rawattr['width'];\n\t\t$height = (int) $rawattr['height'];\n\t} else {\n\t\tlist( $width, $height ) = wp_expand_dimensions( 425, 344, $attr['width'], $attr['height'] );\n\t}\n\n\t/**\n\t * Filter the Google Video embed output.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $html    Google Video HTML embed markup.\n\t * @param array  $matches The RegEx matches from the provided regex.\n\t * @param array  $attr    An array of embed attributes.\n\t * @param string $url     The original URL that was matched by the regex.\n\t * @param array  $rawattr The original unmodified attributes.\n\t */\n\treturn apply_filters( 'embed_googlevideo', '<embed type=\"application/x-shockwave-flash\" src=\"http://video.google.com/googleplayer.swf?docid=' . esc_attr($matches[2]) . '&amp;hl=en&amp;fs=true\" style=\"width:' . esc_attr($width) . 'px;height:' . esc_attr($height) . 'px\" allowFullScreen=\"true\" allowScriptAccess=\"always\" />', $matches, $attr, $url, $rawattr );\n}\n\n/**\n * YouTube iframe embed handler callback.\n *\n * Catches YouTube iframe embed URLs that are not parsable by oEmbed but can be translated into a URL that is.\n *\n * @since 4.0.0\n *\n * @global WP_Embed $wp_embed\n *\n * @param array  $matches The RegEx matches from the provided regex when calling\n *                        wp_embed_register_handler().\n * @param array  $attr    Embed attributes.\n * @param string $url     The original URL that was matched by the regex.\n * @param array  $rawattr The original unmodified attributes.\n * @return string The embed HTML.\n */\nfunction wp_embed_handler_youtube( $matches, $attr, $url, $rawattr ) {\n\tglobal $wp_embed;\n\t$embed = $wp_embed->autoembed( \"https://youtube.com/watch?v={$matches[2]}\" );\n\n\t/**\n\t * Filter the YoutTube embed output.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @see wp_embed_handler_youtube()\n\t *\n\t * @param string $embed   YouTube embed output.\n\t * @param array  $attr    An array of embed attributes.\n\t * @param string $url     The original URL that was matched by the regex.\n\t * @param array  $rawattr The original unmodified attributes.\n\t */\n\treturn apply_filters( 'wp_embed_handler_youtube', $embed, $attr, $url, $rawattr );\n}\n\n/**\n * Audio embed handler callback.\n *\n * @since 3.6.0\n *\n * @param array  $matches The RegEx matches from the provided regex when calling wp_embed_register_handler().\n * @param array  $attr Embed attributes.\n * @param string $url The original URL that was matched by the regex.\n * @param array  $rawattr The original unmodified attributes.\n * @return string The embed HTML.\n */\nfunction wp_embed_handler_audio( $matches, $attr, $url, $rawattr ) {\n\t$audio = sprintf( '[audio src=\"%s\" /]', esc_url( $url ) );\n\n\t/**\n\t * Filter the audio embed output.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $audio   Audio embed output.\n\t * @param array  $attr    An array of embed attributes.\n\t * @param string $url     The original URL that was matched by the regex.\n\t * @param array  $rawattr The original unmodified attributes.\n\t */\n\treturn apply_filters( 'wp_embed_handler_audio', $audio, $attr, $url, $rawattr );\n}\n\n/**\n * Video embed handler callback.\n *\n * @since 3.6.0\n *\n * @param array  $matches The RegEx matches from the provided regex when calling wp_embed_register_handler().\n * @param array  $attr    Embed attributes.\n * @param string $url     The original URL that was matched by the regex.\n * @param array  $rawattr The original unmodified attributes.\n * @return string The embed HTML.\n */\nfunction wp_embed_handler_video( $matches, $attr, $url, $rawattr ) {\n\t$dimensions = '';\n\tif ( ! empty( $rawattr['width'] ) && ! empty( $rawattr['height'] ) ) {\n\t\t$dimensions .= sprintf( 'width=\"%d\" ', (int) $rawattr['width'] );\n\t\t$dimensions .= sprintf( 'height=\"%d\" ', (int) $rawattr['height'] );\n\t}\n\t$video = sprintf( '[video %s src=\"%s\" /]', $dimensions, esc_url( $url ) );\n\n\t/**\n\t * Filter the video embed output.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $video   Video embed output.\n\t * @param array  $attr    An array of embed attributes.\n\t * @param string $url     The original URL that was matched by the regex.\n\t * @param array  $rawattr The original unmodified attributes.\n\t */\n\treturn apply_filters( 'wp_embed_handler_video', $video, $attr, $url, $rawattr );\n}\n\n/**\n * Registers the oEmbed REST API route.\n *\n * @since 4.4.0\n */\nfunction wp_oembed_register_route() {\n\t$controller = new WP_oEmbed_Controller();\n\t$controller->register_routes();\n}\n\n/**\n * Adds oEmbed discovery links in the website <head>.\n *\n * @since 4.4.0\n */\nfunction wp_oembed_add_discovery_links() {\n\t$output = '';\n\n\tif ( is_singular() && ! is_front_page() ) {\n\t\t$output .= '<link rel=\"alternate\" type=\"application/json+oembed\" href=\"' . esc_url( get_oembed_endpoint_url( get_permalink() ) ) . '\" />' . \"\\n\";\n\n\t\tif ( class_exists( 'SimpleXMLElement' ) ) {\n\t\t\t$output .= '<link rel=\"alternate\" type=\"text/xml+oembed\" href=\"' . esc_url( get_oembed_endpoint_url( get_permalink(), 'xml' ) ) . '\" />' . \"\\n\";\n\t\t}\n\t}\n\n\t/**\n\t * Filter the oEmbed discovery links HTML.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $output HTML of the discovery links.\n\t */\n\techo apply_filters( 'oembed_discovery_links', $output );\n}\n\n/**\n * Adds the necessary JavaScript to communicate with the embedded iframes.\n *\n * @since 4.4.0\n */\nfunction wp_oembed_add_host_js() {\n\twp_enqueue_script( 'wp-embed' );\n}\n\n/**\n * Retrieves the URL to embed a specific post in an iframe.\n *\n * @since 4.4.0\n *\n * @param int|WP_Post $post Optional. Post ID or object. Defaults to the current post.\n * @return string|false The post embed URL on success, false if the post doesn't exist.\n */\nfunction get_post_embed_url( $post = null ) {\n\t$post = get_post( $post );\n\n\tif ( ! $post ) {\n\t\treturn false;\n\t}\n\n\tif ( get_option( 'permalink_structure' ) ) {\n\t\t$embed_url = trailingslashit( get_permalink( $post ) ) . user_trailingslashit( 'embed' );\n\t} else {\n\t\t$embed_url = add_query_arg( array( 'embed' => 'true' ), get_permalink( $post ) );\n\t}\n\n\t/**\n\t * Filter the URL to embed a specific post.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string  $embed_url The post embed URL.\n\t * @param WP_Post $post      The corresponding post object.\n\t */\n\treturn esc_url_raw( apply_filters( 'post_embed_url', $embed_url, $post ) );\n}\n\n/**\n * Retrieves the oEmbed endpoint URL for a given permalink.\n *\n * Pass an empty string as the first argument to get the endpoint base URL.\n *\n * @since 4.4.0\n *\n * @param string $permalink Optional. The permalink used for the `url` query arg. Default empty.\n * @param string $format    Optional. The requested response format. Default 'json'.\n * @return string The oEmbed endpoint URL.\n */\nfunction get_oembed_endpoint_url( $permalink = '', $format = 'json' ) {\n\t$url = rest_url( 'oembed/1.0/embed' );\n\n\tif ( 'json' === $format ) {\n\t\t$format = false;\n\t}\n\n\tif ( '' !== $permalink ) {\n\t\t$url = add_query_arg( array(\n\t\t\t'url'    => urlencode( $permalink ),\n\t\t\t'format' => $format,\n\t\t), $url );\n\t}\n\n\t/**\n\t * Filter the oEmbed endpoint URL.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $url       The URL to the oEmbed endpoint.\n\t * @param string $permalink The permalink used for the `url` query arg.\n\t * @param string $format    The requested response format.\n\t */\n\treturn apply_filters( 'oembed_endpoint_url', $url, $permalink, $format );\n}\n\n/**\n * Retrieves the embed code for a specific post.\n *\n * @since 4.4.0\n *\n * @param int         $width  The width for the response.\n * @param int         $height The height for the response.\n * @param int|WP_Post $post   Optional. Post ID or object. Default is global `$post`.\n * @return string|false Embed code on success, false if post doesn't exist.\n */\nfunction get_post_embed_html( $width, $height, $post = null ) {\n\t$post = get_post( $post );\n\n\tif ( ! $post ) {\n\t\treturn false;\n\t}\n\n\t$embed_url = get_post_embed_url( $post );\n\n\t$output = '<blockquote class=\"wp-embedded-content\"><a href=\"' . esc_url( get_permalink( $post ) ) . '\">' . get_the_title( $post ) . \"</a></blockquote>\\n\";\n\n\t$output .= \"<script type='text/javascript'>\\n\";\n\t$output .= \"<!--//--><![CDATA[//><!--\\n\";\n\tif ( SCRIPT_DEBUG ) {\n\t\t$output .= file_get_contents( ABSPATH . WPINC . '/js/wp-embed.js' );\n\t} else {\n\t\t/*\n\t\t * If you're looking at a src version of this file, you'll see an \"include\"\n\t\t * statement below. This is used by the `grunt build` process to directly\n\t\t * include a minified version of wp-embed.js, instead of using the\n\t\t * file_get_contents() method from above.\n\t\t *\n\t\t * If you're looking at a build version of this file, you'll see a string of\n\t\t * minified JavaScript. If you need to debug it, please turn on SCRIPT_DEBUG\n\t\t * and edit wp-embed.js directly.\n\t\t */\n\t\t$output .=<<<JS\n\t\t!function(a,b){\"use strict\";function c(){if(!e){e=!0;var a,c,d,f,g=-1!==navigator.appVersion.indexOf(\"MSIE 10\"),h=!!navigator.userAgent.match(/Trident.*rv:11\\./),i=b.querySelectorAll(\"iframe.wp-embedded-content\"),j=b.querySelectorAll(\"blockquote.wp-embedded-content\");for(c=0;c<j.length;c++)j[c].style.display=\"none\";for(c=0;c<i.length;c++)if(d=i[c],d.style.display=\"\",!d.getAttribute(\"data-secret\")){if(f=Math.random().toString(36).substr(2,10),d.src+=\"#?secret=\"+f,d.setAttribute(\"data-secret\",f),g||h)a=d.cloneNode(!0),a.removeAttribute(\"security\"),d.parentNode.replaceChild(a,d)}else;}}var d=!1,e=!1;if(b.querySelector)if(a.addEventListener)d=!0;if(a.wp=a.wp||{},!a.wp.receiveEmbedMessage)if(a.wp.receiveEmbedMessage=function(c){var d=c.data;if(d.secret||d.message||d.value)if(!/[^a-zA-Z0-9]/.test(d.secret)){var e,f,g,h,i,j=b.querySelectorAll('iframe[data-secret=\"'+d.secret+'\"]'),k=b.querySelectorAll('blockquote[data-secret=\"'+d.secret+'\"]');for(e=0;e<k.length;e++)k[e].style.display=\"none\";for(e=0;e<j.length;e++)if(f=j[e],c.source===f.contentWindow){if(f.style.display=\"\",\"height\"===d.message){if(g=parseInt(d.value,10),g>1e3)g=1e3;else if(200>~~g)g=200;f.height=g}if(\"link\"===d.message)if(h=b.createElement(\"a\"),i=b.createElement(\"a\"),h.href=f.getAttribute(\"src\"),i.href=d.value,i.host===h.host)if(b.activeElement===f)a.top.location.href=d.value}else;}},d)a.addEventListener(\"message\",a.wp.receiveEmbedMessage,!1),b.addEventListener(\"DOMContentLoaded\",c,!1),a.addEventListener(\"load\",c,!1)}(window,document);\nJS;\n\t}\n\t$output .= \"\\n//--><!]]>\";\n\t$output .= \"\\n</script>\";\n\n\t$output .= sprintf(\n\t\t'<iframe sandbox=\"allow-scripts\" security=\"restricted\" src=\"%1$s\" width=\"%2$d\" height=\"%3$d\" title=\"%4$s\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\" class=\"wp-embedded-content\"></iframe>',\n\t\tesc_url( $embed_url ),\n\t\tabsint( $width ),\n\t\tabsint( $height ),\n\t\tesc_attr__( 'Embedded WordPress Post' )\n\t);\n\n\t/**\n\t * Filter the embed HTML output for a given post.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string  $output The default HTML.\n\t * @param WP_Post $post   Current post object.\n\t * @param int     $width  Width of the response.\n\t * @param int     $height Height of the response.\n\t */\n\treturn apply_filters( 'embed_html', $output, $post, $width, $height );\n}\n\n/**\n * Retrieves the oEmbed response data for a given post.\n *\n * @since 4.4.0\n *\n * @param WP_Post|int $post  Post object or ID.\n * @param int         $width The requested width.\n * @return array|false Response data on success, false if post doesn't exist.\n */\nfunction get_oembed_response_data( $post, $width ) {\n\t$post = get_post( $post );\n\n\tif ( ! $post ) {\n\t\treturn false;\n\t}\n\n\tif ( 'publish' !== get_post_status( $post ) ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Filter the allowed minimum and maximum widths for the oEmbed response.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $min_max_width {\n\t *     Minimum and maximum widths for the oEmbed response.\n\t *\n\t *     @type int $min Minimum width. Default 200.\n\t *     @type int $max Maximum width. Default 600.\n\t * }\n\t */\n\t$min_max_width = apply_filters( 'oembed_min_max_width', array(\n\t\t'min' => 200,\n\t\t'max' => 600\n\t) );\n\n\t$width  = min( max( $min_max_width['min'], $width ), $min_max_width['max'] );\n\t$height = max( ceil( $width / 16 * 9 ), 200 );\n\n\t$data = array(\n\t\t'version'       => '1.0',\n\t\t'provider_name' => get_bloginfo( 'name' ),\n\t\t'provider_url'  => get_home_url(),\n\t\t'author_name'   => get_bloginfo( 'name' ),\n\t\t'author_url'    => get_home_url(),\n\t\t'title'         => $post->post_title,\n\t\t'type'          => 'link',\n\t);\n\n\t$author = get_userdata( $post->post_author );\n\n\tif ( $author ) {\n\t\t$data['author_name'] = $author->display_name;\n\t\t$data['author_url']  = get_author_posts_url( $author->ID );\n\t}\n\n\t/**\n\t * Filter the oEmbed response data.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array   $data   The response data.\n\t * @param WP_Post $post   The post object.\n\t * @param int     $width  The requested width.\n\t * @param int     $height The calculated height.\n\t */\n\treturn apply_filters( 'oembed_response_data', $data, $post, $width, $height );\n}\n\n/**\n * Filters the oEmbed response data to return an iframe embed code.\n *\n * @since 4.4.0\n *\n * @param array   $data   The response data.\n * @param WP_Post $post   The post object.\n * @param int     $width  The requested width.\n * @param int     $height The calculated height.\n * @return array The modified response data.\n */\nfunction get_oembed_response_data_rich( $data, $post, $width, $height ) {\n\t$data['width']  = absint( $width );\n\t$data['height'] = absint( $height );\n\t$data['type']   = 'rich';\n\t$data['html']   = get_post_embed_html( $width, $height, $post );\n\n\t// Add post thumbnail to response if available.\n\t$thumbnail_id = false;\n\n\tif ( has_post_thumbnail( $post->ID ) ) {\n\t\t$thumbnail_id = get_post_thumbnail_id( $post->ID );\n\t}\n\n\tif ( 'attachment' === get_post_type( $post ) ) {\n\t\tif ( wp_attachment_is_image( $post ) ) {\n\t\t\t$thumbnail_id = $post->ID;\n\t\t} else if ( wp_attachment_is( 'video', $post ) ) {\n\t\t\t$thumbnail_id = get_post_thumbnail_id( $post );\n\t\t\t$data['type'] = 'video';\n\t\t}\n\t}\n\n\tif ( $thumbnail_id ) {\n\t\tlist( $thumbnail_url, $thumbnail_width, $thumbnail_height ) = wp_get_attachment_image_src( $thumbnail_id, array( $width, 99999 ) );\n\t\t$data['thumbnail_url']    = $thumbnail_url;\n\t\t$data['thumbnail_width']  = $thumbnail_width;\n\t\t$data['thumbnail_height'] = $thumbnail_height;\n\t}\n\n\treturn $data;\n}\n\n/**\n * Ensures that the specified format is either 'json' or 'xml'.\n *\n * @since 4.4.0\n *\n * @param string $format The oEmbed response format. Accepts 'json' or 'xml'.\n * @return string The format, either 'xml' or 'json'. Default 'json'.\n */\nfunction wp_oembed_ensure_format( $format ) {\n\tif ( ! in_array( $format, array( 'json', 'xml' ), true ) ) {\n\t\treturn 'json';\n\t}\n\n\treturn $format;\n}\n\n/**\n * Hooks into the REST API output to print XML instead of JSON.\n *\n * This is only done for the oEmbed API endpoint,\n * which supports both formats.\n *\n * @access private\n * @since 4.4.0\n *\n * @param bool                      $served  Whether the request has already been served.\n * @param WP_HTTP_ResponseInterface $result  Result to send to the client. Usually a WP_REST_Response.\n * @param WP_REST_Request           $request Request used to generate the response.\n * @param WP_REST_Server            $server  Server instance.\n * @return true\n */\nfunction _oembed_rest_pre_serve_request( $served, $result, $request, $server ) {\n\t$params = $request->get_params();\n\n\tif ( '/oembed/1.0/embed' !== $request->get_route() || 'GET' !== $request->get_method() ) {\n\t\treturn $served;\n\t}\n\n\tif ( ! isset( $params['format'] ) || 'xml' !== $params['format'] ) {\n\t\treturn $served;\n\t}\n\n\t// Embed links inside the request.\n\t$data = $server->response_to_data( $result, false );\n\n\tif ( ! class_exists( 'SimpleXMLElement' ) ) {\n\t\tstatus_header( 501 );\n\t\tdie( get_status_header_desc( 501 ) );\n\t}\n\n\t$result = _oembed_create_xml( $data );\n\n\t// Bail if there's no XML.\n\tif ( ! $result ) {\n\t\tstatus_header( 501 );\n\t\treturn get_status_header_desc( 501 );\n\t}\n\n\tif ( ! headers_sent() ) {\n\t\t$server->send_header( 'Content-Type', 'text/xml; charset=' . get_option( 'blog_charset' ) );\n\t}\n\n\techo $result;\n\n\treturn true;\n}\n\n/**\n * Creates an XML string from a given array.\n *\n * @since 4.4.0\n * @access private\n *\n * @param array            $data The original oEmbed response data.\n * @param SimpleXMLElement $node Optional. XML node to append the result to recursively.\n * @return string|false XML string on success, false on error.\n */\nfunction _oembed_create_xml( $data, $node = null ) {\n\tif ( ! is_array( $data ) || empty( $data ) ) {\n\t\treturn false;\n\t}\n\n\tif ( null === $node ) {\n\t\t$node = new SimpleXMLElement( '<oembed></oembed>' );\n\t}\n\n\tforeach ( $data as $key => $value ) {\n\t\tif ( is_numeric( $key ) ) {\n\t\t\t$key = 'oembed';\n\t\t}\n\n\t\tif ( is_array( $value ) ) {\n\t\t\t$item = $node->addChild( $key );\n\t\t\t_oembed_create_xml( $value, $item );\n\t\t} else {\n\t\t\t$node->addChild( $key, esc_html( $value ) );\n\t\t}\n\t}\n\n\treturn $node->asXML();\n}\n\n/**\n * Filters the given oEmbed HTML.\n *\n * If the `$url` isn't on the trusted providers list,\n * we need to filter the HTML heavily for security.\n *\n * Only filters 'rich' and 'html' response types.\n *\n * @since 4.4.0\n *\n * @param string $result The oEmbed HTML result.\n * @param object $data   A data object result from an oEmbed provider.\n * @param string $url    The URL of the content to be embedded.\n * @return string The filtered and sanitized oEmbed result.\n */\nfunction wp_filter_oembed_result( $result, $data, $url ) {\n\tif ( false === $result || ! in_array( $data->type, array( 'rich', 'video' ) ) ) {\n\t\treturn $result;\n\t}\n\n\trequire_once( ABSPATH . WPINC . '/class-oembed.php' );\n\t$wp_oembed = _wp_oembed_get_object();\n\n\t// Don't modify the HTML for trusted providers.\n\tif ( false !== $wp_oembed->get_provider( $url, array( 'discover' => false ) ) ) {\n\t\treturn $result;\n\t}\n\n\t$allowed_html = array(\n\t\t'a'          => array(\n\t\t\t'href'         => true,\n\t\t),\n\t\t'blockquote' => array(),\n\t\t'iframe'     => array(\n\t\t\t'src'          => true,\n\t\t\t'width'        => true,\n\t\t\t'height'       => true,\n\t\t\t'frameborder'  => true,\n\t\t\t'marginwidth'  => true,\n\t\t\t'marginheight' => true,\n\t\t\t'scrolling'    => true,\n\t\t\t'title'        => true,\n\t\t),\n\t);\n\n\t$html = wp_kses( $result, $allowed_html );\n\n\tpreg_match( '|(<blockquote>.*?</blockquote>)?.*(<iframe.*?></iframe>)|ms', $html, $content );\n\t// We require at least the iframe to exist.\n\tif ( empty( $content[2] ) ) {\n\t\treturn false;\n\t}\n\t$html = $content[1] . $content[2];\n\n\tif ( ! empty( $content[1] ) ) {\n\t\t// We have a blockquote to fall back on. Hide the iframe by default.\n\t\t$html = str_replace( '<iframe', '<iframe style=\"display:none;\"', $html );\n\t\t$html = str_replace( '<blockquote', '<blockquote class=\"wp-embedded-content\"', $html );\n\t}\n\n\t$html = str_replace( '<iframe', '<iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\"', $html );\n\n\tpreg_match( '/ src=[\\'\"]([^\\'\"]*)[\\'\"]/', $html, $results );\n\n\tif ( ! empty( $results ) ) {\n\t\t$secret = wp_generate_password( 10, false );\n\n\t\t$url = esc_url( \"{$results[1]}#?secret=$secret\" );\n\n\t\t$html = str_replace( $results[0], \" src=\\\"$url\\\" data-secret=\\\"$secret\\\"\", $html );\n\t\t$html = str_replace( '<blockquote', \"<blockquote data-secret=\\\"$secret\\\"\", $html );\n\t}\n\n\treturn $html;\n}\n\n/**\n * Filters the string in the 'more' link displayed after a trimmed excerpt.\n *\n * Replaces '[...]' (appended to automatically generated excerpts) with an\n * ellipsis and a \"Continue reading\" link in the embed template.\n *\n * @since 4.4.0\n *\n * @param string $more_string Default 'more' string.\n * @return string 'Continue reading' link prepended with an ellipsis.\n */\nfunction wp_embed_excerpt_more( $more_string ) {\n\tif ( ! is_embed() ) {\n\t\treturn $more_string;\n\t}\n\n\t$link = sprintf( '<a href=\"%1$s\" class=\"wp-embed-more\" target=\"_top\">%2$s</a>',\n\t\tesc_url( get_permalink() ),\n\t\t/* translators: %s: Name of current post */\n\t\tsprintf( __( 'Continue reading %s' ), '<span class=\"screen-reader-text\">' . get_the_title() . '</span>' )\n\t);\n\treturn ' &hellip; ' . $link;\n}\n\n/**\n * Displays the post excerpt for the embed template.\n *\n * Intended to be used in 'The Loop'.\n *\n * @since 4.4.0\n */\nfunction the_excerpt_embed() {\n\t$output = get_the_excerpt();\n\n\t/**\n\t * Filter the post excerpt for the embed template.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $output The current post excerpt.\n\t */\n\techo apply_filters( 'the_excerpt_embed', $output );\n}\n\n/**\n * Filters the post excerpt for the embed template.\n *\n * Shows players for video and audio attachments.\n *\n * @since 4.4.0\n *\n * @param string $content The current post excerpt.\n * @return string The modified post excerpt.\n */\nfunction wp_embed_excerpt_attachment( $content ) {\n\tif ( is_attachment() ) {\n\t\treturn prepend_attachment( '' );\n\t}\n\n\treturn $content;\n}\n\n/**\n * Enqueue embed iframe default CSS and JS & fire do_action('enqueue_embed_scripts')\n *\n * Enqueue PNG fallback CSS for embed iframe for legacy versions of IE.\n *\n * Allows plugins to queue scripts for the embed iframe end using wp_enqueue_script().\n * Runs first in oembed_head().\n *\n * @since 4.4.0\n */\nfunction enqueue_embed_scripts() {\n\twp_enqueue_style( 'open-sans' );\n\twp_enqueue_style( 'wp-embed-template-ie' );\n\n\t/**\n\t * Fires when scripts and styles are enqueued for the embed iframe.\n\t *\n\t * @since 4.4.0\n\t */\n\tdo_action( 'enqueue_embed_scripts' );\n}\n\n/**\n * Prints the CSS in the embed iframe header.\n *\n * @since 4.4.0\n */\nfunction print_embed_styles() {\n\t?>\n\t<style type=\"text/css\">\n\t<?php\n\t\tif ( SCRIPT_DEBUG ) {\n\t\t\treadfile( ABSPATH . WPINC . \"/css/wp-embed-template.css\" );\n\t\t} else {\n\t\t\t/*\n\t\t\t * If you're looking at a src version of this file, you'll see an \"include\"\n\t\t\t * statement below. This is used by the `grunt build` process to directly\n\t\t\t * include a minified version of wp-oembed-embed.css, instead of using the\n\t\t\t * readfile() method from above.\n\t\t\t *\n\t\t\t * If you're looking at a build version of this file, you'll see a string of\n\t\t\t * minified CSS. If you need to debug it, please turn on SCRIPT_DEBUG\n\t\t\t * and edit wp-embed-template.css directly.\n\t\t\t */\n\t\t\t?>\n\t\t\tbody,html{padding:0;margin:0}body{font-family:sans-serif}.screen-reader-text{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}.dashicons{display:inline-block;width:20px;height:20px;background-color:transparent;background-repeat:no-repeat;-webkit-background-size:20px 20px;background-size:20px;background-position:center;-webkit-transition:background .1s ease-in;transition:background .1s ease-in;position:relative;top:5px}.dashicons-no{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E\")}.dashicons-admin-comments{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E\")}.wp-embed-comments a:hover .dashicons-admin-comments{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E\")}.dashicons-share{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E\");display:none}.js .dashicons-share{display:inline-block}.wp-embed-share-dialog-open:hover .dashicons-share{background-image:url(\"data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E\")}.wp-embed{padding:25px;font:400 14px/1.5 'Open Sans',sans-serif;color:#82878c;background:#fff;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05);overflow:auto;zoom:1}.wp-embed a{color:#82878c;text-decoration:none}.wp-embed a:hover{text-decoration:underline}.wp-embed-featured-image{margin-bottom:20px}.wp-embed-featured-image img{width:100%;height:auto;border:none}.wp-embed-featured-image.square{float:left;max-width:160px;margin-right:20px}.wp-embed p{margin:0}p.wp-embed-heading{margin:0 0 15px;font-weight:700;font-size:22px;line-height:1.3}.wp-embed-heading a{color:#32373c}.wp-embed .wp-embed-more{color:#b4b9be}.wp-embed-footer{display:table;width:100%;margin-top:30px}.wp-embed-site-icon{position:absolute;top:50%;left:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);height:25px;width:25px;border:0}.wp-embed-site-title{font-weight:700;line-height:25px}.wp-embed-site-title a{position:relative;display:inline-block;padding-left:35px}.wp-embed-meta,.wp-embed-site-title{display:table-cell}.wp-embed-meta{text-align:right;white-space:nowrap;vertical-align:middle}.wp-embed-comments,.wp-embed-share{display:inline}.wp-embed-comments a,.wp-embed-share-tab-button{display:inline-block}.wp-embed-meta a:hover{text-decoration:none;color:#0073aa}.wp-embed-comments a{line-height:25px}.wp-embed-comments+.wp-embed-share{margin-left:10px}.wp-embed-share-dialog{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#222;background-color:rgba(10,10,10,.9);color:#fff;opacity:1;-webkit-transition:opacity .25s ease-in-out;transition:opacity .25s ease-in-out}.wp-embed-share-dialog.hidden{opacity:0;visibility:hidden}.wp-embed-share-dialog-close,.wp-embed-share-dialog-open{margin:-8px 0 0;padding:0;background:0 0;border:none;cursor:pointer;outline:0}.wp-embed-share-dialog-close .dashicons,.wp-embed-share-dialog-open .dashicons{padding:4px}.wp-embed-share-dialog-open .dashicons{top:8px}.wp-embed-share-dialog-close:focus .dashicons,.wp-embed-share-dialog-open:focus .dashicons{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);-webkit-border-radius:100%;border-radius:100%}.wp-embed-share-dialog-close{position:absolute;top:20px;right:20px;font-size:22px}.wp-embed-share-dialog-close:hover{text-decoration:none}.wp-embed-share-dialog-close .dashicons{height:24px;width:24px;-webkit-background-size:24px 24px;background-size:24px}.wp-embed-share-dialog-content{height:100%;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;overflow:hidden}.wp-embed-share-dialog-text{margin-top:25px;padding:20px}.wp-embed-share-tabs{margin:0 0 20px;padding:0;list-style:none}.wp-embed-share-tab-button button{margin:0;padding:0;border:none;background:0 0;font-size:16px;line-height:1.3;color:#aaa;cursor:pointer;-webkit-transition:color .1s ease-in;transition:color .1s ease-in}.wp-embed-share-tab-button [aria-selected=true],.wp-embed-share-tab-button button:hover{color:#fff}.wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 0 0 10px;padding:0 0 0 11px;border-left:1px solid #aaa}.wp-embed-share-tab[aria-hidden=true]{display:none}p.wp-embed-share-description{margin:0;font-size:14px;line-height:1;font-style:italic;color:#aaa}.wp-embed-share-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;border:none;height:28px;margin:0 0 10px;padding:0 5px;font:400 14px/1.5 'Open Sans',sans-serif;resize:none;cursor:text}textarea.wp-embed-share-input{height:72px}html[dir=rtl] .wp-embed-featured-image.square{float:right;margin-right:0;margin-left:20px}html[dir=rtl] .wp-embed-site-title a{padding-left:0;padding-right:35px}html[dir=rtl] .wp-embed-site-icon{margin-right:0;margin-left:10px;left:auto;right:0}html[dir=rtl] .wp-embed-meta{text-align:left}html[dir=rtl] .wp-embed-share{margin-left:0;margin-right:10px}html[dir=rtl] .wp-embed-share-dialog-close{right:auto;left:20px}html[dir=rtl] .wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 10px 0 0;padding:0 11px 0 0;border-left:none;border-right:1px solid #aaa}\n\t\t\t<?php\n\t\t}\n\t?>\n\t</style>\n\t<?php\n}\n\n/**\n * Prints the JavaScript in the embed iframe header.\n *\n * @since 4.4.0\n */\nfunction print_embed_scripts() {\n\t?>\n\t<script type=\"text/javascript\">\n\t<?php\n\t\tif ( SCRIPT_DEBUG ) {\n\t\t\treadfile( ABSPATH . WPINC . \"/js/wp-embed-template.js\" );\n\t\t} else {\n\t\t\t/*\n\t\t\t * If you're looking at a src version of this file, you'll see an \"include\"\n\t\t\t * statement below. This is used by the `grunt build` process to directly\n\t\t\t * include a minified version of wp-embed-template.js, instead of using the\n\t\t\t * readfile() method from above.\n\t\t\t *\n\t\t\t * If you're looking at a build version of this file, you'll see a string of\n\t\t\t * minified JavaScript. If you need to debug it, please turn on SCRIPT_DEBUG\n\t\t\t * and edit wp-embed-template.js directly.\n\t\t\t */\n\t\t\t?>\n\t\t\t!function(a,b){\"use strict\";function c(b,c){a.parent.postMessage({message:b,value:c,secret:g},\"*\")}function d(){function d(){l.className=l.className.replace(\"hidden\",\"\"),b.querySelector('.wp-embed-share-tab-button [aria-selected=\"true\"]').focus()}function e(){l.className+=\" hidden\",b.querySelector(\".wp-embed-share-dialog-open\").focus()}function f(a){var c=b.querySelector('.wp-embed-share-tab-button [aria-selected=\"true\"]');c.setAttribute(\"aria-selected\",\"false\"),b.querySelector(\"#\"+c.getAttribute(\"aria-controls\")).setAttribute(\"aria-hidden\",\"true\"),a.target.setAttribute(\"aria-selected\",\"true\"),b.querySelector(\"#\"+a.target.getAttribute(\"aria-controls\")).setAttribute(\"aria-hidden\",\"false\")}function g(a){var c,d,e=a.target,f=e.parentElement.previousElementSibling,g=e.parentElement.nextElementSibling;if(37===a.keyCode)c=f;else{if(39!==a.keyCode)return!1;c=g}\"rtl\"===b.documentElement.getAttribute(\"dir\")&&(c=c===f?g:f),c&&(d=c.firstElementChild,e.setAttribute(\"tabindex\",\"-1\"),e.setAttribute(\"aria-selected\",!1),b.querySelector(\"#\"+e.getAttribute(\"aria-controls\")).setAttribute(\"aria-hidden\",\"true\"),d.setAttribute(\"tabindex\",\"0\"),d.setAttribute(\"aria-selected\",\"true\"),d.focus(),b.querySelector(\"#\"+d.getAttribute(\"aria-controls\")).setAttribute(\"aria-hidden\",\"false\"))}function h(a){var c=b.querySelector('.wp-embed-share-tab-button [aria-selected=\"true\"]');n!==a.target||a.shiftKey?c===a.target&&a.shiftKey&&(n.focus(),a.preventDefault()):(c.focus(),a.preventDefault())}function i(a){var b,d=a.target;b=d.hasAttribute(\"href\")?d.getAttribute(\"href\"):d.parentElement.getAttribute(\"href\"),c(\"link\",b),a.preventDefault()}if(!k){k=!0;var j,l=b.querySelector(\".wp-embed-share-dialog\"),m=b.querySelector(\".wp-embed-share-dialog-open\"),n=b.querySelector(\".wp-embed-share-dialog-close\"),o=b.querySelectorAll(\".wp-embed-share-input\"),p=b.querySelectorAll(\".wp-embed-share-tab-button button\"),q=b.getElementsByTagName(\"a\");if(o)for(j=0;j<o.length;j++)o[j].addEventListener(\"click\",function(a){a.target.select()});if(m&&m.addEventListener(\"click\",function(){d()}),n&&n.addEventListener(\"click\",function(){e()}),p)for(j=0;j<p.length;j++)p[j].addEventListener(\"click\",f),p[j].addEventListener(\"keydown\",g);if(b.addEventListener(\"keydown\",function(a){27===a.keyCode&&-1===l.className.indexOf(\"hidden\")?e():9===a.keyCode&&h(a)},!1),a.self!==a.top)for(c(\"height\",Math.ceil(b.body.getBoundingClientRect().height)),j=0;j<q.length;j++)q[j].addEventListener(\"click\",i)}}function e(){a.self!==a.top&&(clearTimeout(i),i=setTimeout(function(){c(\"height\",Math.ceil(b.body.getBoundingClientRect().height))},100))}function f(){a.self===a.top||g||(g=a.location.hash.replace(/.*secret=([\\d\\w]{10}).*/,\"$1\"),clearTimeout(h),h=setTimeout(function(){f()},100))}var g,h,i,j=b.querySelector&&a.addEventListener,k=!1;j&&(f(),b.documentElement.className=b.documentElement.className.replace(/\\bno-js\\b/,\"\")+\" js\",b.addEventListener(\"DOMContentLoaded\",d,!1),a.addEventListener(\"load\",d,!1),a.addEventListener(\"resize\",e,!1))}(window,document);\n\t\t\t<?php\n\t\t}\n\t?>\n\t</script>\n\t<?php\n}\n\n/**\n * Prepare the oembed HTML to be displayed in an RSS feed.\n *\n * @since 4.4.0\n * @access private\n *\n * @param string $content The content to filter.\n * @return string The filtered content.\n */\nfunction _oembed_filter_feed_content( $content ) {\n\treturn str_replace( '<iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"display:none;\"', '<iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\"', $content );\n}\n\n/**\n * Prints the necessary markup for the embed comments button.\n *\n * @since 4.4.0\n */\nfunction print_embed_comments_button() {\n\tif ( is_404() || ! ( get_comments_number() || comments_open() ) ) {\n\t\treturn;\n\t}\n\t?>\n\t<div class=\"wp-embed-comments\">\n\t\t<a href=\"<?php comments_link(); ?>\" target=\"_top\">\n\t\t\t<span class=\"dashicons dashicons-admin-comments\"></span>\n\t\t\t<?php\n\t\t\tprintf(\n\t\t\t\t_n(\n\t\t\t\t\t'%s <span class=\"screen-reader-text\">Comment</span>',\n\t\t\t\t\t'%s <span class=\"screen-reader-text\">Comments</span>',\n\t\t\t\t\tget_comments_number()\n\t\t\t\t),\n\t\t\t\tnumber_format_i18n( get_comments_number() )\n\t\t\t);\n\t\t\t?>\n\t\t</a>\n\t</div>\n\t<?php\n}\n\n/**\n * Prints the necessary markup for the embed sharing button.\n *\n * @since 4.4.0\n */\nfunction print_embed_sharing_button() {\n\tif ( is_404() ) {\n\t\treturn;\n\t}\n\t?>\n\t<div class=\"wp-embed-share\">\n\t\t<button type=\"button\" class=\"wp-embed-share-dialog-open\" aria-label=\"<?php esc_attr_e( 'Open sharing dialog' ); ?>\">\n\t\t\t<span class=\"dashicons dashicons-share\"></span>\n\t\t</button>\n\t</div>\n\t<?php\n}\n\n/**\n * Prints the necessary markup for the embed sharing dialog.\n *\n * @since 4.4.0\n */\nfunction print_embed_sharing_dialog() {\n\tif ( is_404() ) {\n\t\treturn;\n\t}\n\t?>\n\t<div class=\"wp-embed-share-dialog hidden\" role=\"dialog\" aria-label=\"<?php esc_attr_e( 'Sharing options' ); ?>\">\n\t\t<div class=\"wp-embed-share-dialog-content\">\n\t\t\t<div class=\"wp-embed-share-dialog-text\">\n\t\t\t\t<ul class=\"wp-embed-share-tabs\" role=\"tablist\">\n\t\t\t\t\t<li class=\"wp-embed-share-tab-button wp-embed-share-tab-button-wordpress\" role=\"presentation\">\n\t\t\t\t\t\t<button type=\"button\" role=\"tab\" aria-controls=\"wp-embed-share-tab-wordpress\" aria-selected=\"true\" tabindex=\"0\"><?php esc_html_e( 'WordPress Embed' ); ?></button>\n\t\t\t\t\t</li>\n\t\t\t\t\t<li class=\"wp-embed-share-tab-button wp-embed-share-tab-button-html\" role=\"presentation\">\n\t\t\t\t\t\t<button type=\"button\" role=\"tab\" aria-controls=\"wp-embed-share-tab-html\" aria-selected=\"false\" tabindex=\"-1\"><?php esc_html_e( 'HTML Embed' ); ?></button>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t\t<div id=\"wp-embed-share-tab-wordpress\" class=\"wp-embed-share-tab\" role=\"tabpanel\" aria-hidden=\"false\">\n\t\t\t\t\t<input type=\"text\" value=\"<?php the_permalink(); ?>\" class=\"wp-embed-share-input\" aria-describedby=\"wp-embed-share-description-wordpress\" tabindex=\"0\" readonly/>\n\n\t\t\t\t\t<p class=\"wp-embed-share-description\" id=\"wp-embed-share-description-wordpress\">\n\t\t\t\t\t\t<?php _e( 'Copy and paste this URL into your WordPress site to embed' ); ?>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t<div id=\"wp-embed-share-tab-html\" class=\"wp-embed-share-tab\" role=\"tabpanel\" aria-hidden=\"true\">\n\t\t\t\t\t<textarea class=\"wp-embed-share-input\" aria-describedby=\"wp-embed-share-description-html\" tabindex=\"0\" readonly><?php echo esc_textarea( get_post_embed_html( 600, 400 ) ); ?></textarea>\n\n\t\t\t\t\t<p class=\"wp-embed-share-description\" id=\"wp-embed-share-description-html\">\n\t\t\t\t\t\t<?php _e( 'Copy and paste this code into your site to embed' ); ?>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<button type=\"button\" class=\"wp-embed-share-dialog-close\" aria-label=\"<?php esc_attr_e( 'Close sharing dialog' ); ?>\">\n\t\t\t\t<span class=\"dashicons dashicons-no\"></span>\n\t\t\t</button>\n\t\t</div>\n\t</div>\n\t<?php\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/feed-atom-comments.php",
    "content": "<?php\n/**\n * Atom Feed Template for displaying Atom Comments feed.\n *\n * @package WordPress\n */\n\nheader('Content-Type: ' . feed_content_type('atom') . '; charset=' . get_option('blog_charset'), true);\necho '<?xml version=\"1.0\" encoding=\"' . get_option('blog_charset') . '\" ?' . '>';\n\n/** This action is documented in wp-includes/feed-rss2.php */\ndo_action( 'rss_tag_pre', 'atom-comments' );\n?>\n<feed\n\txmlns=\"http://www.w3.org/2005/Atom\"\n\txml:lang=\"<?php bloginfo_rss( 'language' ); ?>\"\n\txmlns:thr=\"http://purl.org/syndication/thread/1.0\"\n\t<?php\n\t\t/** This action is documented in wp-includes/feed-atom.php */\n\t\tdo_action( 'atom_ns' );\n\n\t\t/**\n\t\t * Fires inside the feed tag in the Atom comment feed.\n\t\t *\n\t\t * @since 2.8.0\n\t\t */\n\t\tdo_action( 'atom_comments_ns' );\n\t?>\n>\n\t<title type=\"text\"><?php\n\t\tif ( is_singular() )\n\t\t\tprintf( ent2ncr( __( 'Comments on %s' ) ), get_the_title_rss() );\n\t\telseif ( is_search() )\n\t\t\tprintf( ent2ncr( __( 'Comments for %1$s searching on %2$s' ) ), get_bloginfo_rss( 'name' ), get_search_query() );\n\t\telse\n\t\t\tprintf( ent2ncr( __( 'Comments for %s' ) ), get_wp_title_rss() );\n\t?></title>\n\t<subtitle type=\"text\"><?php bloginfo_rss('description'); ?></subtitle>\n\n\t<updated><?php echo mysql2date('Y-m-d\\TH:i:s\\Z', get_lastcommentmodified('GMT'), false); ?></updated>\n\n<?php if ( is_singular() ) { ?>\n\t<link rel=\"alternate\" type=\"<?php bloginfo_rss('html_type'); ?>\" href=\"<?php comments_link_feed(); ?>\" />\n\t<link rel=\"self\" type=\"application/atom+xml\" href=\"<?php echo esc_url( get_post_comments_feed_link('', 'atom') ); ?>\" />\n\t<id><?php echo esc_url( get_post_comments_feed_link('', 'atom') ); ?></id>\n<?php } elseif (is_search()) { ?>\n\t<link rel=\"alternate\" type=\"<?php bloginfo_rss('html_type'); ?>\" href=\"<?php echo home_url() . '?s=' . get_search_query(); ?>\" />\n\t<link rel=\"self\" type=\"application/atom+xml\" href=\"<?php echo get_search_comments_feed_link('', 'atom'); ?>\" />\n\t<id><?php echo get_search_comments_feed_link('', 'atom'); ?></id>\n<?php } else { ?>\n\t<link rel=\"alternate\" type=\"<?php bloginfo_rss('html_type'); ?>\" href=\"<?php bloginfo_rss('url'); ?>\" />\n\t<link rel=\"self\" type=\"application/atom+xml\" href=\"<?php bloginfo_rss('comments_atom_url'); ?>\" />\n\t<id><?php bloginfo_rss('comments_atom_url'); ?></id>\n<?php } ?>\n<?php\n\t/**\n\t * Fires at the end of the Atom comment feed header.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( 'comments_atom_head' );\n?>\n<?php\nif ( have_comments() ) : while ( have_comments() ) : the_comment();\n\t$comment_post = $GLOBALS['post'] = get_post( $comment->comment_post_ID );\n?>\n\t<entry>\n\t\t<title><?php\n\t\t\tif ( !is_singular() ) {\n\t\t\t\t$title = get_the_title($comment_post->ID);\n\t\t\t\t/** This filter is documented in wp-includes/feed.php */\n\t\t\t\t$title = apply_filters( 'the_title_rss', $title );\n\t\t\t\tprintf(ent2ncr(__('Comment on %1$s by %2$s')), $title, get_comment_author_rss());\n\t\t\t} else {\n\t\t\t\tprintf(ent2ncr(__('By: %s')), get_comment_author_rss());\n\t\t\t}\n\t\t?></title>\n\t\t<link rel=\"alternate\" href=\"<?php comment_link(); ?>\" type=\"<?php bloginfo_rss('html_type'); ?>\" />\n\n\t\t<author>\n\t\t\t<name><?php comment_author_rss(); ?></name>\n\t\t\t<?php if (get_comment_author_url()) echo '<uri>' . get_comment_author_url() . '</uri>'; ?>\n\n\t\t</author>\n\n\t\t<id><?php comment_guid(); ?></id>\n\t\t<updated><?php echo mysql2date('Y-m-d\\TH:i:s\\Z', get_comment_time('Y-m-d H:i:s', true, false), false); ?></updated>\n\t\t<published><?php echo mysql2date('Y-m-d\\TH:i:s\\Z', get_comment_time('Y-m-d H:i:s', true, false), false); ?></published>\n<?php if ( post_password_required($comment_post) ) : ?>\n\t\t<content type=\"html\" xml:base=\"<?php comment_link(); ?>\"><![CDATA[<?php echo get_the_password_form(); ?>]]></content>\n<?php else : // post pass ?>\n\t\t<content type=\"html\" xml:base=\"<?php comment_link(); ?>\"><![CDATA[<?php comment_text(); ?>]]></content>\n<?php endif; // post pass\n\t// Return comment threading information (http://www.ietf.org/rfc/rfc4685.txt)\n\tif ( $comment->comment_parent == 0 ) : // This comment is top level ?>\n\t\t<thr:in-reply-to ref=\"<?php the_guid(); ?>\" href=\"<?php the_permalink_rss() ?>\" type=\"<?php bloginfo_rss('html_type'); ?>\" />\n<?php else : // This comment is in reply to another comment\n\t$parent_comment = get_comment($comment->comment_parent);\n\t// The rel attribute below and the id tag above should be GUIDs, but WP doesn't create them for comments (unlike posts). Either way, it's more important that they both use the same system\n?>\n\t\t<thr:in-reply-to ref=\"<?php comment_guid($parent_comment) ?>\" href=\"<?php echo get_comment_link($parent_comment) ?>\" type=\"<?php bloginfo_rss('html_type'); ?>\" />\n<?php endif;\n\t/**\n\t * Fires at the end of each Atom comment feed item.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param int $comment_id      ID of the current comment.\n\t * @param int $comment_post_id ID of the post the current comment is connected to.\n\t */\n\tdo_action( 'comment_atom_entry', $comment->comment_ID, $comment_post->ID );\n?>\n\t</entry>\n<?php endwhile; endif; ?>\n</feed>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/feed-atom.php",
    "content": "<?php\n/**\n * Atom Feed Template for displaying Atom Posts feed.\n *\n * @package WordPress\n */\n\nheader('Content-Type: ' . feed_content_type('atom') . '; charset=' . get_option('blog_charset'), true);\n$more = 1;\n\necho '<?xml version=\"1.0\" encoding=\"'.get_option('blog_charset').'\"?'.'>';\n\n/** This action is documented in wp-includes/feed-rss2.php */\ndo_action( 'rss_tag_pre', 'atom' );\n?>\n<feed\n  xmlns=\"http://www.w3.org/2005/Atom\"\n  xmlns:thr=\"http://purl.org/syndication/thread/1.0\"\n  xml:lang=\"<?php bloginfo_rss( 'language' ); ?>\"\n  xml:base=\"<?php bloginfo_rss('url') ?>/wp-atom.php\"\n  <?php\n  /**\n   * Fires at end of the Atom feed root to add namespaces.\n   *\n   * @since 2.0.0\n   */\n  do_action( 'atom_ns' );\n  ?>\n >\n\t<title type=\"text\"><?php wp_title_rss(); ?></title>\n\t<subtitle type=\"text\"><?php bloginfo_rss(\"description\") ?></subtitle>\n\n\t<updated><?php echo mysql2date('Y-m-d\\TH:i:s\\Z', get_lastpostmodified('GMT'), false); ?></updated>\n\n\t<link rel=\"alternate\" type=\"<?php bloginfo_rss('html_type'); ?>\" href=\"<?php bloginfo_rss('url') ?>\" />\n\t<id><?php bloginfo('atom_url'); ?></id>\n\t<link rel=\"self\" type=\"application/atom+xml\" href=\"<?php self_link(); ?>\" />\n\n\t<?php\n\t/**\n\t * Fires just before the first Atom feed entry.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'atom_head' );\n\n\twhile ( have_posts() ) : the_post();\n\t?>\n\t<entry>\n\t\t<author>\n\t\t\t<name><?php the_author() ?></name>\n\t\t\t<?php $author_url = get_the_author_meta('url'); if ( !empty($author_url) ) : ?>\n\t\t\t<uri><?php the_author_meta('url')?></uri>\n\t\t\t<?php endif;\n\n\t\t\t/**\n\t\t\t * Fires at the end of each Atom feed author entry.\n\t\t\t *\n\t\t\t * @since 3.2.0\n\t\t\t */\n\t\t\tdo_action( 'atom_author' );\n\t\t?>\n\t\t</author>\n\t\t<title type=\"<?php html_type_rss(); ?>\"><![CDATA[<?php the_title_rss() ?>]]></title>\n\t\t<link rel=\"alternate\" type=\"<?php bloginfo_rss('html_type'); ?>\" href=\"<?php the_permalink_rss() ?>\" />\n\t\t<id><?php the_guid() ; ?></id>\n\t\t<updated><?php echo get_post_modified_time('Y-m-d\\TH:i:s\\Z', true); ?></updated>\n\t\t<published><?php echo get_post_time('Y-m-d\\TH:i:s\\Z', true); ?></published>\n\t\t<?php the_category_rss('atom') ?>\n\t\t<summary type=\"<?php html_type_rss(); ?>\"><![CDATA[<?php the_excerpt_rss(); ?>]]></summary>\n<?php if ( !get_option('rss_use_excerpt') ) : ?>\n\t\t<content type=\"<?php html_type_rss(); ?>\" xml:base=\"<?php the_permalink_rss() ?>\"><![CDATA[<?php the_content_feed('atom') ?>]]></content>\n<?php endif; ?>\n\t<?php atom_enclosure();\n\t/**\n\t * Fires at the end of each Atom feed item.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'atom_entry' );\n\n\tif ( get_comments_number() || comments_open() ) :\n\t\t?>\n\t\t<link rel=\"replies\" type=\"<?php bloginfo_rss('html_type'); ?>\" href=\"<?php the_permalink_rss() ?>#comments\" thr:count=\"<?php echo get_comments_number()?>\"/>\n\t\t<link rel=\"replies\" type=\"application/atom+xml\" href=\"<?php echo esc_url( get_post_comments_feed_link(0, 'atom') ); ?>\" thr:count=\"<?php echo get_comments_number()?>\"/>\n\t\t<thr:total><?php echo get_comments_number()?></thr:total>\n\t<?php endif; ?>\n\t</entry>\n\t<?php endwhile ; ?>\n</feed>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/feed-rdf.php",
    "content": "<?php\n/**\n * RSS 1 RDF Feed Template for displaying RSS 1 Posts feed.\n *\n * @package WordPress\n */\n\nheader('Content-Type: ' . feed_content_type('rdf') . '; charset=' . get_option('blog_charset'), true);\n$more = 1;\n\necho '<?xml version=\"1.0\" encoding=\"'.get_option('blog_charset').'\"?'.'>';\n\n/** This action is documented in wp-includes/feed-rss2.php */\ndo_action( 'rss_tag_pre', 'rdf' );\n?>\n<rdf:RDF\n\txmlns=\"http://purl.org/rss/1.0/\"\n\txmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\txmlns:sy=\"http://purl.org/rss/1.0/modules/syndication/\"\n\txmlns:admin=\"http://webns.net/mvcb/\"\n\txmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n\t<?php\n\t/**\n\t * Fires at the end of the feed root to add namespaces.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'rdf_ns' );\n\t?>\n>\n<channel rdf:about=\"<?php bloginfo_rss(\"url\") ?>\">\n\t<title><?php wp_title_rss(); ?></title>\n\t<link><?php bloginfo_rss('url') ?></link>\n\t<description><?php bloginfo_rss('description') ?></description>\n\t<dc:date><?php echo mysql2date('Y-m-d\\TH:i:s\\Z', get_lastpostmodified('GMT'), false); ?></dc:date>\n\t<sy:updatePeriod><?php\n\t\t/** This filter is documented in wp-includes/feed-rss2.php */\n\t\techo apply_filters( 'rss_update_period', 'hourly' );\n\t?></sy:updatePeriod>\n\t<sy:updateFrequency><?php\n\t\t/** This filter is documented in wp-includes/feed-rss2.php */\n\t\techo apply_filters( 'rss_update_frequency', '1' );\n\t?></sy:updateFrequency>\n\t<sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase>\n\t<?php\n\t/**\n\t * Fires at the end of the RDF feed header.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'rdf_header' );\n\t?>\n\t<items>\n\t\t<rdf:Seq>\n\t\t<?php while (have_posts()): the_post(); ?>\n\t\t\t<rdf:li rdf:resource=\"<?php the_permalink_rss() ?>\"/>\n\t\t<?php endwhile; ?>\n\t\t</rdf:Seq>\n\t</items>\n</channel>\n<?php rewind_posts(); while (have_posts()): the_post(); ?>\n<item rdf:about=\"<?php the_permalink_rss() ?>\">\n\t<title><?php the_title_rss() ?></title>\n\t<link><?php the_permalink_rss() ?></link>\n\t<dc:date><?php echo mysql2date('Y-m-d\\TH:i:s\\Z', $post->post_date_gmt, false); ?></dc:date>\n\t<dc:creator><![CDATA[<?php the_author() ?>]]></dc:creator>\n\t<?php the_category_rss('rdf') ?>\n<?php if (get_option('rss_use_excerpt')) : ?>\n\t<description><![CDATA[<?php the_excerpt_rss() ?>]]></description>\n<?php else : ?>\n\t<description><![CDATA[<?php the_excerpt_rss() ?>]]></description>\n\t<content:encoded><![CDATA[<?php the_content_feed('rdf') ?>]]></content:encoded>\n<?php endif; ?>\n\t<?php\n\t/**\n\t * Fires at the end of each RDF feed item.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'rdf_item' );\n\t?>\n</item>\n<?php endwhile;  ?>\n</rdf:RDF>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/feed-rss.php",
    "content": "<?php\n/**\n * RSS 0.92 Feed Template for displaying RSS 0.92 Posts feed.\n *\n * @package WordPress\n */\n\nheader('Content-Type: ' . feed_content_type('rss') . '; charset=' . get_option('blog_charset'), true);\n$more = 1;\n\necho '<?xml version=\"1.0\" encoding=\"'.get_option('blog_charset').'\"?'.'>'; ?>\n<rss version=\"0.92\">\n<channel>\n\t<title><?php wp_title_rss(); ?></title>\n\t<link><?php bloginfo_rss('url') ?></link>\n\t<description><?php bloginfo_rss('description') ?></description>\n\t<lastBuildDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></lastBuildDate>\n\t<docs>http://backend.userland.com/rss092</docs>\n\t<language><?php bloginfo_rss( 'language' ); ?></language>\n\n\t<?php\n\t/**\n\t * Fires at the end of the RSS Feed Header.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'rss_head' );\n\t?>\n\n<?php while (have_posts()) : the_post(); ?>\n\t<item>\n\t\t<title><?php the_title_rss() ?></title>\n\t\t<description><![CDATA[<?php the_excerpt_rss() ?>]]></description>\n\t\t<link><?php the_permalink_rss() ?></link>\n\t\t<?php\n\t\t/**\n\t\t * Fires at the end of each RSS feed item.\n\t\t *\n\t\t * @since 2.0.0\n\t\t */\n\t\tdo_action( 'rss_item' );\n\t\t?>\n\t</item>\n<?php endwhile; ?>\n</channel>\n</rss>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/feed-rss2-comments.php",
    "content": "<?php\n/**\n * RSS2 Feed Template for displaying RSS2 Comments feed.\n *\n * @package WordPress\n */\n\nheader('Content-Type: ' . feed_content_type('rss2') . '; charset=' . get_option('blog_charset'), true);\n\necho '<?xml version=\"1.0\" encoding=\"'.get_option('blog_charset').'\"?'.'>';\n\n/** This action is documented in wp-includes/feed-rss2.php */\ndo_action( 'rss_tag_pre', 'rss2-comments' );\n?>\n<rss version=\"2.0\"\n\txmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\txmlns:atom=\"http://www.w3.org/2005/Atom\"\n\txmlns:sy=\"http://purl.org/rss/1.0/modules/syndication/\"\n\t<?php\n\t/** This action is documented in wp-includes/feed-rss2.php */\n\tdo_action( 'rss2_ns' );\n\t?>\n\n\t<?php\n\t/**\n\t * Fires at the end of the RSS root to add namespaces.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( 'rss2_comments_ns' );\n\t?>\n>\n<channel>\n\t<title><?php\n\t\tif ( is_singular() )\n\t\t\tprintf( ent2ncr( __( 'Comments on: %s' ) ), get_the_title_rss() );\n\t\telseif ( is_search() )\n\t\t\tprintf( ent2ncr( __( 'Comments for %1$s searching on %2$s' ) ), get_bloginfo_rss( 'name' ), get_search_query() );\n\t\telse\n\t\t\tprintf( ent2ncr( __( 'Comments for %s' ) ), get_wp_title_rss() );\n\t?></title>\n\t<atom:link href=\"<?php self_link(); ?>\" rel=\"self\" type=\"application/rss+xml\" />\n\t<link><?php (is_single()) ? the_permalink_rss() : bloginfo_rss(\"url\") ?></link>\n\t<description><?php bloginfo_rss(\"description\") ?></description>\n\t<lastBuildDate><?php echo mysql2date('r', get_lastcommentmodified('GMT')); ?></lastBuildDate>\n\t<sy:updatePeriod><?php\n\t\t/** This filter is documented in wp-includes/feed-rss2.php */\n\t\techo apply_filters( 'rss_update_period', 'hourly' );\n\t?></sy:updatePeriod>\n\t<sy:updateFrequency><?php\n\t\t/** This filter is documented in wp-includes/feed-rss2.php */\n\t\techo apply_filters( 'rss_update_frequency', '1' );\n\t?></sy:updateFrequency>\n\t<?php\n\t/**\n\t * Fires at the end of the RSS2 comment feed header.\n\t *\n\t * @since 2.3.0\n\t */\n\tdo_action( 'commentsrss2_head' );\n\n\tif ( have_comments() ) : while ( have_comments() ) : the_comment();\n\t\t$comment_post = $GLOBALS['post'] = get_post( $comment->comment_post_ID );\n\t?>\n\t<item>\n\t\t<title><?php\n\t\t\tif ( !is_singular() ) {\n\t\t\t\t$title = get_the_title($comment_post->ID);\n\t\t\t\t/** This filter is documented in wp-includes/feed.php */\n\t\t\t\t$title = apply_filters( 'the_title_rss', $title );\n\t\t\t\tprintf(ent2ncr(__('Comment on %1$s by %2$s')), $title, get_comment_author_rss());\n\t\t\t} else {\n\t\t\t\tprintf(ent2ncr(__('By: %s')), get_comment_author_rss());\n\t\t\t}\n\t\t?></title>\n\t\t<link><?php comment_link() ?></link>\n\t\t<dc:creator><![CDATA[<?php echo get_comment_author_rss() ?>]]></dc:creator>\n\t\t<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_comment_time('Y-m-d H:i:s', true, false), false); ?></pubDate>\n\t\t<guid isPermaLink=\"false\"><?php comment_guid() ?></guid>\n<?php if ( post_password_required($comment_post) ) : ?>\n\t\t<description><?php echo ent2ncr(__('Protected Comments: Please enter your password to view comments.')); ?></description>\n\t\t<content:encoded><![CDATA[<?php echo get_the_password_form() ?>]]></content:encoded>\n<?php else : // post pass ?>\n\t\t<description><![CDATA[<?php comment_text_rss() ?>]]></description>\n\t\t<content:encoded><![CDATA[<?php comment_text() ?>]]></content:encoded>\n<?php endif; // post pass\n\t/**\n\t * Fires at the end of each RSS2 comment feed item.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param int $comment->comment_ID The ID of the comment being displayed.\n\t * @param int $comment_post->ID    The ID of the post the comment is connected to.\n\t */\n\tdo_action( 'commentrss2_item', $comment->comment_ID, $comment_post->ID );\n?>\n\t</item>\n<?php endwhile; endif; ?>\n</channel>\n</rss>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/feed-rss2.php",
    "content": "<?php\n/**\n * RSS2 Feed Template for displaying RSS2 Posts feed.\n *\n * @package WordPress\n */\n\nheader('Content-Type: ' . feed_content_type('rss2') . '; charset=' . get_option('blog_charset'), true);\n$more = 1;\n\necho '<?xml version=\"1.0\" encoding=\"'.get_option('blog_charset').'\"?'.'>';\n\n/**\n * Fires between the xml and rss tags in a feed.\n *\n * @since 4.0.0\n *\n * @param string $context Type of feed. Possible values include 'rss2', 'rss2-comments',\n *                        'rdf', 'atom', and 'atom-comments'.\n */\ndo_action( 'rss_tag_pre', 'rss2' );\n?>\n<rss version=\"2.0\"\n\txmlns:content=\"http://purl.org/rss/1.0/modules/content/\"\n\txmlns:wfw=\"http://wellformedweb.org/CommentAPI/\"\n\txmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n\txmlns:atom=\"http://www.w3.org/2005/Atom\"\n\txmlns:sy=\"http://purl.org/rss/1.0/modules/syndication/\"\n\txmlns:slash=\"http://purl.org/rss/1.0/modules/slash/\"\n\t<?php\n\t/**\n\t * Fires at the end of the RSS root to add namespaces.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'rss2_ns' );\n\t?>\n>\n\n<channel>\n\t<title><?php wp_title_rss(); ?></title>\n\t<atom:link href=\"<?php self_link(); ?>\" rel=\"self\" type=\"application/rss+xml\" />\n\t<link><?php bloginfo_rss('url') ?></link>\n\t<description><?php bloginfo_rss(\"description\") ?></description>\n\t<lastBuildDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></lastBuildDate>\n\t<language><?php bloginfo_rss( 'language' ); ?></language>\n\t<sy:updatePeriod><?php\n\t\t$duration = 'hourly';\n\n\t\t/**\n\t\t * Filter how often to update the RSS feed.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $duration The update period. Accepts 'hourly', 'daily', 'weekly', 'monthly',\n\t\t *                         'yearly'. Default 'hourly'.\n\t\t */\n\t\techo apply_filters( 'rss_update_period', $duration );\n\t?></sy:updatePeriod>\n\t<sy:updateFrequency><?php\n\t\t$frequency = '1';\n\n\t\t/**\n\t\t * Filter the RSS update frequency.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $frequency An integer passed as a string representing the frequency\n\t\t *                          of RSS updates within the update period. Default '1'.\n\t\t */\n\t\techo apply_filters( 'rss_update_frequency', $frequency );\n\t?></sy:updateFrequency>\n\t<?php\n\t/**\n\t * Fires at the end of the RSS2 Feed Header.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'rss2_head');\n\n\twhile( have_posts()) : the_post();\n\t?>\n\t<item>\n\t\t<title><?php the_title_rss() ?></title>\n\t\t<link><?php the_permalink_rss() ?></link>\n<?php if ( get_comments_number() || comments_open() ) : ?>\n\t\t<comments><?php comments_link_feed(); ?></comments>\n<?php endif; ?>\n\t\t<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>\n\t\t<dc:creator><![CDATA[<?php the_author() ?>]]></dc:creator>\n\t\t<?php the_category_rss('rss2') ?>\n\n\t\t<guid isPermaLink=\"false\"><?php the_guid(); ?></guid>\n<?php if (get_option('rss_use_excerpt')) : ?>\n\t\t<description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>\n<?php else : ?>\n\t\t<description><![CDATA[<?php the_excerpt_rss(); ?>]]></description>\n\t<?php $content = get_the_content_feed('rss2'); ?>\n\t<?php if ( strlen( $content ) > 0 ) : ?>\n\t\t<content:encoded><![CDATA[<?php echo $content; ?>]]></content:encoded>\n\t<?php else : ?>\n\t\t<content:encoded><![CDATA[<?php the_excerpt_rss(); ?>]]></content:encoded>\n\t<?php endif; ?>\n<?php endif; ?>\n<?php if ( get_comments_number() || comments_open() ) : ?>\n\t\t<wfw:commentRss><?php echo esc_url( get_post_comments_feed_link(null, 'rss2') ); ?></wfw:commentRss>\n\t\t<slash:comments><?php echo get_comments_number(); ?></slash:comments>\n<?php endif; ?>\n<?php rss_enclosure(); ?>\n\t<?php\n\t/**\n\t * Fires at the end of each RSS2 feed item.\n\t *\n\t * @since 2.0.0\n\t */\n\tdo_action( 'rss2_item' );\n\t?>\n\t</item>\n\t<?php endwhile; ?>\n</channel>\n</rss>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/feed.php",
    "content": "<?php\n/**\n * WordPress Feed API\n *\n * Many of the functions used in here belong in The Loop, or The Loop for the\n * Feeds.\n *\n * @package WordPress\n * @subpackage Feed\n */\n\n/**\n * RSS container for the bloginfo function.\n *\n * You can retrieve anything that you can using the get_bloginfo() function.\n * Everything will be stripped of tags and characters converted, when the values\n * are retrieved for use in the feeds.\n *\n * @since 1.5.1\n * @see get_bloginfo() For the list of possible values to display.\n *\n * @param string $show See get_bloginfo() for possible values.\n * @return string\n */\nfunction get_bloginfo_rss($show = '') {\n\t$info = strip_tags(get_bloginfo($show));\n\t/**\n\t * Filter the bloginfo for use in RSS feeds.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @see convert_chars()\n\t * @see get_bloginfo()\n\t *\n\t * @param string $info Converted string value of the blog information.\n\t * @param string $show The type of blog information to retrieve.\n\t */\n\treturn apply_filters( 'get_bloginfo_rss', convert_chars( $info ), $show );\n}\n\n/**\n * Display RSS container for the bloginfo function.\n *\n * You can retrieve anything that you can using the get_bloginfo() function.\n * Everything will be stripped of tags and characters converted, when the values\n * are retrieved for use in the feeds.\n *\n * @since 0.71\n * @see get_bloginfo() For the list of possible values to display.\n *\n * @param string $show See get_bloginfo() for possible values.\n */\nfunction bloginfo_rss($show = '') {\n\t/**\n\t * Filter the bloginfo for display in RSS feeds.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @see get_bloginfo()\n\t *\n\t * @param string $rss_container RSS container for the blog information.\n\t * @param string $show          The type of blog information to retrieve.\n\t */\n\techo apply_filters( 'bloginfo_rss', get_bloginfo_rss( $show ), $show );\n}\n\n/**\n * Retrieve the default feed.\n *\n * The default feed is 'rss2', unless a plugin changes it through the\n * 'default_feed' filter.\n *\n * @since 2.5.0\n *\n * @return string Default feed, or for example 'rss2', 'atom', etc.\n */\nfunction get_default_feed() {\n\t/**\n\t * Filter the default feed type.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $feed_type Type of default feed. Possible values include 'rss2', 'atom'.\n\t *                          Default 'rss2'.\n\t */\n\t$default_feed = apply_filters( 'default_feed', 'rss2' );\n\treturn 'rss' == $default_feed ? 'rss2' : $default_feed;\n}\n\n/**\n * Retrieve the blog title for the feed title.\n *\n * @since 2.2.0\n * @since 4.4.0 The optional `$sep` parameter was deprecated and renamed to `$deprecated`.\n *\n * @param string $deprecated Unused..\n * @return string The document title.\n */\nfunction get_wp_title_rss( $deprecated = '&#8211;' ) {\n\tif ( '&#8211;' !== $deprecated ) {\n\t\t/* translators: %s: 'document_title_separator' filter name */\n\t\t_deprecated_argument( __FUNCTION__, '4.4.0', sprintf( __( 'Use the %s filter instead.' ), '<code>document_title_separator</code>' ) );\n\t}\n\n\t/**\n\t * Filter the blog title for use as the feed title.\n\t *\n\t * @since 2.2.0\n\t * @since 4.4.0 The `$sep` parameter was deprecated and renamed to `$deprecated`.\n\t *\n\t * @param string $title      The current blog title.\n\t * @param string $deprecated Unused.\n\t */\n\treturn apply_filters( 'get_wp_title_rss', wp_get_document_title(), $deprecated );\n}\n\n/**\n * Display the blog title for display of the feed title.\n *\n * @since 2.2.0\n * @since 4.4.0 The optional `$sep` parameter was deprecated and renamed to `$deprecated`.\n *\n * @param string $deprecated Unused.\n */\nfunction wp_title_rss( $deprecated = '&#8211;' ) {\n\tif ( '&#8211;' !== $deprecated ) {\n\t\t/* translators: %s: 'document_title_separator' filter name */\n\t\t_deprecated_argument( __FUNCTION__, '4.4.0', sprintf( __( 'Use the %s filter instead.' ), '<code>document_title_separator</code>' ) );\n\t}\n\n\t/**\n\t * Filter the blog title for display of the feed title.\n\t *\n\t * @since 2.2.0\n\t * @since 4.4.0 The `$sep` parameter was deprecated and renamed to `$deprecated`.\n\t *\n\t * @see get_wp_title_rss()\n\t *\n\t * @param string $wp_title_rss The current blog title.\n\t * @param string $deprecated   Unused.\n\t */\n\techo apply_filters( 'wp_title_rss', get_wp_title_rss(), $deprecated );\n}\n\n/**\n * Retrieve the current post title for the feed.\n *\n * @since 2.0.0\n *\n * @return string Current post title.\n */\nfunction get_the_title_rss() {\n\t$title = get_the_title();\n\n\t/**\n\t * Filter the post title for use in a feed.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param string $title The current post title.\n\t */\n\t$title = apply_filters( 'the_title_rss', $title );\n\treturn $title;\n}\n\n/**\n * Display the post title in the feed.\n *\n * @since 0.71\n */\nfunction the_title_rss() {\n\techo get_the_title_rss();\n}\n\n/**\n * Retrieve the post content for feeds.\n *\n * @since 2.9.0\n * @see get_the_content()\n *\n * @param string $feed_type The type of feed. rss2 | atom | rss | rdf\n * @return string The filtered content.\n */\nfunction get_the_content_feed($feed_type = null) {\n\tif ( !$feed_type )\n\t\t$feed_type = get_default_feed();\n\n\t/** This filter is documented in wp-includes/post-template.php */\n\t$content = apply_filters( 'the_content', get_the_content() );\n\t$content = str_replace(']]>', ']]&gt;', $content);\n\t/**\n\t * Filter the post content for use in feeds.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $content   The current post content.\n\t * @param string $feed_type Type of feed. Possible values include 'rss2', 'atom'.\n\t *                          Default 'rss2'.\n\t */\n\treturn apply_filters( 'the_content_feed', $content, $feed_type );\n}\n\n/**\n * Display the post content for feeds.\n *\n * @since 2.9.0\n *\n * @param string $feed_type The type of feed. rss2 | atom | rss | rdf\n */\nfunction the_content_feed($feed_type = null) {\n\techo get_the_content_feed($feed_type);\n}\n\n/**\n * Display the post excerpt for the feed.\n *\n * @since 0.71\n */\nfunction the_excerpt_rss() {\n\t$output = get_the_excerpt();\n\t/**\n\t * Filter the post excerpt for a feed.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param string $output The current post excerpt.\n\t */\n\techo apply_filters( 'the_excerpt_rss', $output );\n}\n\n/**\n * Display the permalink to the post for use in feeds.\n *\n * @since 2.3.0\n */\nfunction the_permalink_rss() {\n\t/**\n\t * Filter the permalink to the post for use in feeds.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $post_permalink The current post permalink.\n\t */\n\techo esc_url( apply_filters( 'the_permalink_rss', get_permalink() ) );\n}\n\n/**\n * Outputs the link to the comments for the current post in an xml safe way\n *\n * @since 3.0.0\n * @return none\n */\nfunction comments_link_feed() {\n\t/**\n\t * Filter the comments permalink for the current post.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $comment_permalink The current comment permalink with\n\t *                                  '#comments' appended.\n\t */\n\techo esc_url( apply_filters( 'comments_link_feed', get_comments_link() ) );\n}\n\n/**\n * Display the feed GUID for the current comment.\n *\n * @since 2.5.0\n *\n * @param int|WP_Comment $comment_id Optional comment object or id. Defaults to global comment object.\n */\nfunction comment_guid($comment_id = null) {\n\techo esc_url( get_comment_guid($comment_id) );\n}\n\n/**\n * Retrieve the feed GUID for the current comment.\n *\n * @since 2.5.0\n *\n * @param int|WP_Comment $comment_id Optional comment object or id. Defaults to global comment object.\n * @return false|string false on failure or guid for comment on success.\n */\nfunction get_comment_guid($comment_id = null) {\n\t$comment = get_comment($comment_id);\n\n\tif ( !is_object($comment) )\n\t\treturn false;\n\n\treturn get_the_guid($comment->comment_post_ID) . '#comment-' . $comment->comment_ID;\n}\n\n/**\n * Display the link to the comments.\n *\n * @since 1.5.0\n * @since 4.4.0 Introduced the `$comment` argument.\n *\n * @param int|WP_Comment $comment Optional. Comment object or id. Defaults to global comment object.\n */\nfunction comment_link( $comment = null ) {\n\t/**\n\t * Filter the current comment's permalink.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @see get_comment_link()\n\t *\n\t * @param string $comment_permalink The current comment permalink.\n\t */\n\techo esc_url( apply_filters( 'comment_link', get_comment_link( $comment ) ) );\n}\n\n/**\n * Retrieve the current comment author for use in the feeds.\n *\n * @since 2.0.0\n *\n * @return string Comment Author\n */\nfunction get_comment_author_rss() {\n\t/**\n\t * Filter the current comment author for use in a feed.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @see get_comment_author()\n\t *\n\t * @param string $comment_author The current comment author.\n\t */\n\treturn apply_filters( 'comment_author_rss', get_comment_author() );\n}\n\n/**\n * Display the current comment author in the feed.\n *\n * @since 1.0.0\n */\nfunction comment_author_rss() {\n\techo get_comment_author_rss();\n}\n\n/**\n * Display the current comment content for use in the feeds.\n *\n * @since 1.0.0\n */\nfunction comment_text_rss() {\n\t$comment_text = get_comment_text();\n\t/**\n\t * Filter the current comment content for use in a feed.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $comment_text The content of the current comment.\n\t */\n\t$comment_text = apply_filters( 'comment_text_rss', $comment_text );\n\techo $comment_text;\n}\n\n/**\n * Retrieve all of the post categories, formatted for use in feeds.\n *\n * All of the categories for the current post in the feed loop, will be\n * retrieved and have feed markup added, so that they can easily be added to the\n * RSS2, Atom, or RSS1 and RSS0.91 RDF feeds.\n *\n * @since 2.1.0\n *\n * @param string $type Optional, default is the type returned by get_default_feed().\n * @return string All of the post categories for displaying in the feed.\n */\nfunction get_the_category_rss($type = null) {\n\tif ( empty($type) )\n\t\t$type = get_default_feed();\n\t$categories = get_the_category();\n\t$tags = get_the_tags();\n\t$the_list = '';\n\t$cat_names = array();\n\n\t$filter = 'rss';\n\tif ( 'atom' == $type )\n\t\t$filter = 'raw';\n\n\tif ( !empty($categories) ) foreach ( (array) $categories as $category ) {\n\t\t$cat_names[] = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter);\n\t}\n\n\tif ( !empty($tags) ) foreach ( (array) $tags as $tag ) {\n\t\t$cat_names[] = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter);\n\t}\n\n\t$cat_names = array_unique($cat_names);\n\n\tforeach ( $cat_names as $cat_name ) {\n\t\tif ( 'rdf' == $type )\n\t\t\t$the_list .= \"\\t\\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\\n\";\n\t\telseif ( 'atom' == $type )\n\t\t\t$the_list .= sprintf( '<category scheme=\"%1$s\" term=\"%2$s\" />', esc_attr( get_bloginfo_rss( 'url' ) ), esc_attr( $cat_name ) );\n\t\telse\n\t\t\t$the_list .= \"\\t\\t<category><![CDATA[\" . @html_entity_decode( $cat_name, ENT_COMPAT, get_option('blog_charset') ) . \"]]></category>\\n\";\n\t}\n\n\t/**\n\t * Filter all of the post categories for display in a feed.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param string $the_list All of the RSS post categories.\n\t * @param string $type     Type of feed. Possible values include 'rss2', 'atom'.\n\t *                         Default 'rss2'.\n\t */\n\treturn apply_filters( 'the_category_rss', $the_list, $type );\n}\n\n/**\n * Display the post categories in the feed.\n *\n * @since 0.71\n * @see get_the_category_rss() For better explanation.\n *\n * @param string $type Optional, default is the type returned by get_default_feed().\n */\nfunction the_category_rss($type = null) {\n\techo get_the_category_rss($type);\n}\n\n/**\n * Display the HTML type based on the blog setting.\n *\n * The two possible values are either 'xhtml' or 'html'.\n *\n * @since 2.2.0\n */\nfunction html_type_rss() {\n\t$type = get_bloginfo('html_type');\n\tif (strpos($type, 'xhtml') !== false)\n\t\t$type = 'xhtml';\n\telse\n\t\t$type = 'html';\n\techo $type;\n}\n\n/**\n * Display the rss enclosure for the current post.\n *\n * Uses the global $post to check whether the post requires a password and if\n * the user has the password for the post. If not then it will return before\n * displaying.\n *\n * Also uses the function get_post_custom() to get the post's 'enclosure'\n * metadata field and parses the value to display the enclosure(s). The\n * enclosure(s) consist of enclosure HTML tag(s) with a URI and other\n * attributes.\n *\n * @since 1.5.0\n */\nfunction rss_enclosure() {\n\tif ( post_password_required() )\n\t\treturn;\n\n\tforeach ( (array) get_post_custom() as $key => $val) {\n\t\tif ($key == 'enclosure') {\n\t\t\tforeach ( (array) $val as $enc ) {\n\t\t\t\t$enclosure = explode(\"\\n\", $enc);\n\n\t\t\t\t// only get the first element, e.g. audio/mpeg from 'audio/mpeg mpga mp2 mp3'\n\t\t\t\t$t = preg_split('/[ \\t]/', trim($enclosure[2]) );\n\t\t\t\t$type = $t[0];\n\n\t\t\t\t/**\n\t\t\t\t * Filter the RSS enclosure HTML link tag for the current post.\n\t\t\t\t *\n\t\t\t\t * @since 2.2.0\n\t\t\t\t *\n\t\t\t\t * @param string $html_link_tag The HTML link tag with a URI and other attributes.\n\t\t\t\t */\n\t\t\t\techo apply_filters( 'rss_enclosure', '<enclosure url=\"' . trim( htmlspecialchars( $enclosure[0] ) ) . '\" length=\"' . trim( $enclosure[1] ) . '\" type=\"' . $type . '\" />' . \"\\n\" );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Display the atom enclosure for the current post.\n *\n * Uses the global $post to check whether the post requires a password and if\n * the user has the password for the post. If not then it will return before\n * displaying.\n *\n * Also uses the function get_post_custom() to get the post's 'enclosure'\n * metadata field and parses the value to display the enclosure(s). The\n * enclosure(s) consist of link HTML tag(s) with a URI and other attributes.\n *\n * @since 2.2.0\n */\nfunction atom_enclosure() {\n\tif ( post_password_required() )\n\t\treturn;\n\n\tforeach ( (array) get_post_custom() as $key => $val ) {\n\t\tif ($key == 'enclosure') {\n\t\t\tforeach ( (array) $val as $enc ) {\n\t\t\t\t$enclosure = explode(\"\\n\", $enc);\n\t\t\t\t/**\n\t\t\t\t * Filter the atom enclosure HTML link tag for the current post.\n\t\t\t\t *\n\t\t\t\t * @since 2.2.0\n\t\t\t\t *\n\t\t\t\t * @param string $html_link_tag The HTML link tag with a URI and other attributes.\n\t\t\t\t */\n\t\t\t\techo apply_filters( 'atom_enclosure', '<link href=\"' . trim( htmlspecialchars( $enclosure[0] ) ) . '\" rel=\"enclosure\" length=\"' . trim( $enclosure[1] ) . '\" type=\"' . trim( $enclosure[2] ) . '\" />' . \"\\n\" );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Determine the type of a string of data with the data formatted.\n *\n * Tell whether the type is text, html, or xhtml, per RFC 4287 section 3.1.\n *\n * In the case of WordPress, text is defined as containing no markup,\n * xhtml is defined as \"well formed\", and html as tag soup (i.e., the rest).\n *\n * Container div tags are added to xhtml values, per section 3.1.1.3.\n *\n * @link http://www.atomenabled.org/developers/syndication/atom-format-spec.php#rfc.section.3.1\n *\n * @since 2.5.0\n *\n * @param string $data Input string\n * @return array array(type, value)\n */\nfunction prep_atom_text_construct($data) {\n\tif (strpos($data, '<') === false && strpos($data, '&') === false) {\n\t\treturn array('text', $data);\n\t}\n\n\t$parser = xml_parser_create();\n\txml_parse($parser, '<div>' . $data . '</div>', true);\n\t$code = xml_get_error_code($parser);\n\txml_parser_free($parser);\n\n\tif (!$code) {\n\t\tif (strpos($data, '<') === false) {\n\t\t\treturn array('text', $data);\n\t\t} else {\n\t\t\t$data = \"<div xmlns='http://www.w3.org/1999/xhtml'>$data</div>\";\n\t\t\treturn array('xhtml', $data);\n\t\t}\n\t}\n\n\tif (strpos($data, ']]>') === false) {\n\t\treturn array('html', \"<![CDATA[$data]]>\");\n\t} else {\n\t\treturn array('html', htmlspecialchars($data));\n\t}\n}\n\n/**\n * Displays Site Icon in atom feeds.\n *\n * @since 4.3.0\n *\n * @see get_site_icon_url()\n */\nfunction atom_site_icon() {\n\t$url = get_site_icon_url( 32 );\n\tif ( $url ) {\n\t\techo \"<icon>$url</icon>\\n\";\n\t}\n}\n\n/**\n * Displays Site Icon in RSS2.\n *\n * @since 4.3.0\n */\nfunction rss2_site_icon() {\n\t$rss_title = get_wp_title_rss();\n\tif ( empty( $rss_title ) ) {\n\t\t$rss_title = get_bloginfo_rss( 'name' );\n\t}\n\n\t$url = get_site_icon_url( 32 );\n\tif ( $url ) {\n\t\techo '\n<image>\n\t<url>' . convert_chars( $url ) . '</url>\n\t<title>' . $rss_title . '</title>\n\t<link>' . get_bloginfo_rss( 'url' ) . '</link>\n\t<width>32</width>\n\t<height>32</height>\n</image> ' . \"\\n\";\n\t}\n}\n\n/**\n * Display the link for the currently displayed feed in a XSS safe way.\n *\n * Generate a correct link for the atom:self element.\n *\n * @since 2.5.0\n */\nfunction self_link() {\n\t$host = @parse_url(home_url());\n\t/**\n\t * Filter the current feed URL.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @see set_url_scheme()\n\t * @see wp_unslash()\n\t *\n\t * @param string $feed_link The link for the feed with set URL scheme.\n\t */\n\techo esc_url( apply_filters( 'self_link', set_url_scheme( 'http://' . $host['host'] . wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) );\n}\n\n/**\n * Return the content type for specified feed type.\n *\n * @since 2.8.0\n */\nfunction feed_content_type( $type = '' ) {\n\tif ( empty($type) )\n\t\t$type = get_default_feed();\n\n\t$types = array(\n\t\t'rss'  => 'application/rss+xml',\n\t\t'rss2' => 'application/rss+xml',\n\t\t'rss-http'  => 'text/xml',\n\t\t'atom' => 'application/atom+xml',\n\t\t'rdf'  => 'application/rdf+xml'\n\t);\n\n\t$content_type = ( !empty($types[$type]) ) ? $types[$type] : 'application/octet-stream';\n\n\t/**\n\t * Filter the content type for a specific feed type.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $content_type Content type indicating the type of data that a feed contains.\n\t * @param string $type         Type of feed. Possible values include 'rss2', 'atom'.\n\t *                             Default 'rss2'.\n\t */\n\treturn apply_filters( 'feed_content_type', $content_type, $type );\n}\n\n/**\n * Build SimplePie object based on RSS or Atom feed from URL.\n *\n * @since 2.8.0\n *\n * @param mixed $url URL of feed to retrieve. If an array of URLs, the feeds are merged\n * using SimplePie's multifeed feature.\n * See also {@link ​http://simplepie.org/wiki/faq/typical_multifeed_gotchas}\n *\n * @return WP_Error|SimplePie WP_Error object on failure or SimplePie object on success\n */\nfunction fetch_feed( $url ) {\n\trequire_once( ABSPATH . WPINC . '/class-feed.php' );\n\n\t$feed = new SimplePie();\n\n\t$feed->set_sanitize_class( 'WP_SimplePie_Sanitize_KSES' );\n\t// We must manually overwrite $feed->sanitize because SimplePie's\n\t// constructor sets it before we have a chance to set the sanitization class\n\t$feed->sanitize = new WP_SimplePie_Sanitize_KSES();\n\n\t$feed->set_cache_class( 'WP_Feed_Cache' );\n\t$feed->set_file_class( 'WP_SimplePie_File' );\n\n\t$feed->set_feed_url( $url );\n\t/** This filter is documented in wp-includes/class-feed.php */\n\t$feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', 12 * HOUR_IN_SECONDS, $url ) );\n\t/**\n\t * Fires just before processing the SimplePie feed object.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param object &$feed SimplePie feed object, passed by reference.\n\t * @param mixed  $url   URL of feed to retrieve. If an array of URLs, the feeds are merged.\n\t */\n\tdo_action_ref_array( 'wp_feed_options', array( &$feed, $url ) );\n\t$feed->init();\n\t$feed->set_output_encoding( get_option( 'blog_charset' ) );\n\t$feed->handle_content_type();\n\n\tif ( $feed->error() )\n\t\treturn new WP_Error( 'simplepie-error', $feed->error() );\n\n\treturn $feed;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/formatting.php",
    "content": "<?php\n/**\n * Main WordPress Formatting API.\n *\n * Handles many functions for formatting output.\n *\n * @package WordPress\n */\n\n/**\n * Replaces common plain text characters into formatted entities\n *\n * As an example,\n *\n *     'cause today's effort makes it worth tomorrow's \"holiday\" ...\n *\n * Becomes:\n *\n *     &#8217;cause today&#8217;s effort makes it worth tomorrow&#8217;s &#8220;holiday&#8221; &#8230;\n *\n * Code within certain html blocks are skipped.\n *\n * Do not use this function before the 'init' action hook; everything will break.\n *\n * @since 0.71\n *\n * @global array $wp_cockneyreplace Array of formatted entities for certain common phrases\n * @global array $shortcode_tags\n * @staticvar array $static_characters\n * @staticvar array $static_replacements\n * @staticvar array $dynamic_characters\n * @staticvar array $dynamic_replacements\n * @staticvar array $default_no_texturize_tags\n * @staticvar array $default_no_texturize_shortcodes\n * @staticvar bool  $run_texturize\n *\n * @param string $text The text to be formatted\n * @param bool   $reset Set to true for unit testing. Translated patterns will reset.\n * @return string The string replaced with html entities\n */\nfunction wptexturize( $text, $reset = false ) {\n\tglobal $wp_cockneyreplace, $shortcode_tags;\n\tstatic $static_characters = null,\n\t\t$static_replacements = null,\n\t\t$dynamic_characters = null,\n\t\t$dynamic_replacements = null,\n\t\t$default_no_texturize_tags = null,\n\t\t$default_no_texturize_shortcodes = null,\n\t\t$run_texturize = true,\n\t\t$apos = null,\n\t\t$prime = null,\n\t\t$double_prime = null,\n\t\t$opening_quote = null,\n\t\t$closing_quote = null,\n\t\t$opening_single_quote = null,\n\t\t$closing_single_quote = null,\n\t\t$open_q_flag = '<!--oq-->',\n\t\t$open_sq_flag = '<!--osq-->',\n\t\t$apos_flag = '<!--apos-->';\n\n\t// If there's nothing to do, just stop.\n\tif ( empty( $text ) || false === $run_texturize ) {\n\t\treturn $text;\n\t}\n\n\t// Set up static variables. Run once only.\n\tif ( $reset || ! isset( $static_characters ) ) {\n\t\t/**\n\t\t * Filter whether to skip running wptexturize().\n\t\t *\n\t\t * Passing false to the filter will effectively short-circuit wptexturize().\n\t\t * returning the original text passed to the function instead.\n\t\t *\n\t\t * The filter runs only once, the first time wptexturize() is called.\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @see wptexturize()\n\t\t *\n\t\t * @param bool $run_texturize Whether to short-circuit wptexturize().\n\t\t */\n\t\t$run_texturize = apply_filters( 'run_wptexturize', $run_texturize );\n\t\tif ( false === $run_texturize ) {\n\t\t\treturn $text;\n\t\t}\n\n\t\t/* translators: opening curly double quote */\n\t\t$opening_quote = _x( '&#8220;', 'opening curly double quote' );\n\t\t/* translators: closing curly double quote */\n\t\t$closing_quote = _x( '&#8221;', 'closing curly double quote' );\n\n\t\t/* translators: apostrophe, for example in 'cause or can't */\n\t\t$apos = _x( '&#8217;', 'apostrophe' );\n\n\t\t/* translators: prime, for example in 9' (nine feet) */\n\t\t$prime = _x( '&#8242;', 'prime' );\n\t\t/* translators: double prime, for example in 9\" (nine inches) */\n\t\t$double_prime = _x( '&#8243;', 'double prime' );\n\n\t\t/* translators: opening curly single quote */\n\t\t$opening_single_quote = _x( '&#8216;', 'opening curly single quote' );\n\t\t/* translators: closing curly single quote */\n\t\t$closing_single_quote = _x( '&#8217;', 'closing curly single quote' );\n\n\t\t/* translators: en dash */\n\t\t$en_dash = _x( '&#8211;', 'en dash' );\n\t\t/* translators: em dash */\n\t\t$em_dash = _x( '&#8212;', 'em dash' );\n\n\t\t$default_no_texturize_tags = array('pre', 'code', 'kbd', 'style', 'script', 'tt');\n\t\t$default_no_texturize_shortcodes = array('code');\n\n\t\t// if a plugin has provided an autocorrect array, use it\n\t\tif ( isset($wp_cockneyreplace) ) {\n\t\t\t$cockney = array_keys( $wp_cockneyreplace );\n\t\t\t$cockneyreplace = array_values( $wp_cockneyreplace );\n\t\t} else {\n\t\t\t/* translators: This is a comma-separated list of words that defy the syntax of quotations in normal use,\n\t\t\t * for example...  'We do not have enough words yet' ... is a typical quoted phrase.  But when we write\n\t\t\t * lines of code 'til we have enough of 'em, then we need to insert apostrophes instead of quotes.\n\t\t\t */\n\t\t\t$cockney = explode( ',', _x( \"'tain't,'twere,'twas,'tis,'twill,'til,'bout,'nuff,'round,'cause,'em\",\n\t\t\t\t'Comma-separated list of words to texturize in your language' ) );\n\n\t\t\t$cockneyreplace = explode( ',', _x( '&#8217;tain&#8217;t,&#8217;twere,&#8217;twas,&#8217;tis,&#8217;twill,&#8217;til,&#8217;bout,&#8217;nuff,&#8217;round,&#8217;cause,&#8217;em',\n\t\t\t\t'Comma-separated list of replacement words in your language' ) );\n\t\t}\n\n\t\t$static_characters = array_merge( array( '...', '``', '\\'\\'', ' (tm)' ), $cockney );\n\t\t$static_replacements = array_merge( array( '&#8230;', $opening_quote, $closing_quote, ' &#8482;' ), $cockneyreplace );\n\n\n\t\t// Pattern-based replacements of characters.\n\t\t// Sort the remaining patterns into several arrays for performance tuning.\n\t\t$dynamic_characters = array( 'apos' => array(), 'quote' => array(), 'dash' => array() );\n\t\t$dynamic_replacements = array( 'apos' => array(), 'quote' => array(), 'dash' => array() );\n\t\t$dynamic = array();\n\t\t$spaces = wp_spaces_regexp();\n\n\t\t// '99' and '99\" are ambiguous among other patterns; assume it's an abbreviated year at the end of a quotation.\n\t\tif ( \"'\" !== $apos || \"'\" !== $closing_single_quote ) {\n\t\t\t$dynamic[ '/\\'(\\d\\d)\\'(?=\\Z|[.,:;!?)}\\-\\]]|&gt;|' . $spaces . ')/' ] = $apos_flag . '$1' . $closing_single_quote;\n\t\t}\n\t\tif ( \"'\" !== $apos || '\"' !== $closing_quote ) {\n\t\t\t$dynamic[ '/\\'(\\d\\d)\"(?=\\Z|[.,:;!?)}\\-\\]]|&gt;|' . $spaces . ')/' ] = $apos_flag . '$1' . $closing_quote;\n\t\t}\n\n\t\t// '99 '99s '99's (apostrophe)  But never '9 or '99% or '999 or '99.0.\n\t\tif ( \"'\" !== $apos ) {\n\t\t\t$dynamic[ '/\\'(?=\\d\\d(?:\\Z|(?![%\\d]|[.,]\\d)))/' ] = $apos_flag;\n\t\t}\n\n\t\t// Quoted Numbers like '0.42'\n\t\tif ( \"'\" !== $opening_single_quote && \"'\" !== $closing_single_quote ) {\n\t\t\t$dynamic[ '/(?<=\\A|' . $spaces . ')\\'(\\d[.,\\d]*)\\'/' ] = $open_sq_flag . '$1' . $closing_single_quote;\n\t\t}\n\n\t\t// Single quote at start, or preceded by (, {, <, [, \", -, or spaces.\n\t\tif ( \"'\" !== $opening_single_quote ) {\n\t\t\t$dynamic[ '/(?<=\\A|[([{\"\\-]|&lt;|' . $spaces . ')\\'/' ] = $open_sq_flag;\n\t\t}\n\n\t\t// Apostrophe in a word.  No spaces, double apostrophes, or other punctuation.\n\t\tif ( \"'\" !== $apos ) {\n\t\t\t$dynamic[ '/(?<!' . $spaces . ')\\'(?!\\Z|[.,:;!?\"\\'(){}[\\]\\-]|&[lg]t;|' . $spaces . ')/' ] = $apos_flag;\n\t\t}\n\n\t\t$dynamic_characters['apos'] = array_keys( $dynamic );\n\t\t$dynamic_replacements['apos'] = array_values( $dynamic );\n\t\t$dynamic = array();\n\n\t\t// Quoted Numbers like \"42\"\n\t\tif ( '\"' !== $opening_quote && '\"' !== $closing_quote ) {\n\t\t\t$dynamic[ '/(?<=\\A|' . $spaces . ')\"(\\d[.,\\d]*)\"/' ] = $open_q_flag . '$1' . $closing_quote;\n\t\t}\n\n\t\t// Double quote at start, or preceded by (, {, <, [, -, or spaces, and not followed by spaces.\n\t\tif ( '\"' !== $opening_quote ) {\n\t\t\t$dynamic[ '/(?<=\\A|[([{\\-]|&lt;|' . $spaces . ')\"(?!' . $spaces . ')/' ] = $open_q_flag;\n\t\t}\n\n\t\t$dynamic_characters['quote'] = array_keys( $dynamic );\n\t\t$dynamic_replacements['quote'] = array_values( $dynamic );\n\t\t$dynamic = array();\n\n\t\t// Dashes and spaces\n\t\t$dynamic[ '/---/' ] = $em_dash;\n\t\t$dynamic[ '/(?<=^|' . $spaces . ')--(?=$|' . $spaces . ')/' ] = $em_dash;\n\t\t$dynamic[ '/(?<!xn)--/' ] = $en_dash;\n\t\t$dynamic[ '/(?<=^|' . $spaces . ')-(?=$|' . $spaces . ')/' ] = $en_dash;\n\n\t\t$dynamic_characters['dash'] = array_keys( $dynamic );\n\t\t$dynamic_replacements['dash'] = array_values( $dynamic );\n\t}\n\n\t// Must do this every time in case plugins use these filters in a context sensitive manner\n\t/**\n\t * Filter the list of HTML elements not to texturize.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $default_no_texturize_tags An array of HTML element names.\n\t */\n\t$no_texturize_tags = apply_filters( 'no_texturize_tags', $default_no_texturize_tags );\n\t/**\n\t * Filter the list of shortcodes not to texturize.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $default_no_texturize_shortcodes An array of shortcode names.\n\t */\n\t$no_texturize_shortcodes = apply_filters( 'no_texturize_shortcodes', $default_no_texturize_shortcodes );\n\n\t$no_texturize_tags_stack = array();\n\t$no_texturize_shortcodes_stack = array();\n\n\t// Look for shortcodes and HTML elements.\n\n\tpreg_match_all( '@\\[/?([^<>&/\\[\\]\\x00-\\x20=]++)@', $text, $matches );\n\t$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );\n\t$found_shortcodes = ! empty( $tagnames );\n\t$shortcode_regex = $found_shortcodes ? _get_wptexturize_shortcode_regex( $tagnames ) : '';\n\t$regex = _get_wptexturize_split_regex( $shortcode_regex );\n\n\t$textarr = preg_split( $regex, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY );\n\n\tforeach ( $textarr as &$curl ) {\n\t\t// Only call _wptexturize_pushpop_element if $curl is a delimiter.\n\t\t$first = $curl[0];\n\t\tif ( '<' === $first ) {\n\t\t\tif ( '<!--' === substr( $curl, 0, 4 ) ) {\n\t\t\t\t// This is an HTML comment delimiter.\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\t// This is an HTML element delimiter.\n\n\t\t\t\t// Replace each & with &#038; unless it already looks like an entity.\n\t\t\t\t$curl = preg_replace( '/&(?!#(?:\\d+|x[a-f0-9]+);|[a-z1-4]{1,8};)/i', '&#038;', $curl );\n\n\t\t\t\t_wptexturize_pushpop_element( $curl, $no_texturize_tags_stack, $no_texturize_tags );\n\t\t\t}\n\n\t\t} elseif ( '' === trim( $curl ) ) {\n\t\t\t// This is a newline between delimiters.  Performance improves when we check this.\n\t\t\tcontinue;\n\n\t\t} elseif ( '[' === $first && $found_shortcodes && 1 === preg_match( '/^' . $shortcode_regex . '$/', $curl ) ) {\n\t\t\t// This is a shortcode delimiter.\n\n\t\t\tif ( '[[' !== substr( $curl, 0, 2 ) && ']]' !== substr( $curl, -2 ) ) {\n\t\t\t\t// Looks like a normal shortcode.\n\t\t\t\t_wptexturize_pushpop_element( $curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes );\n\t\t\t} else {\n\t\t\t\t// Looks like an escaped shortcode.\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t} elseif ( empty( $no_texturize_shortcodes_stack ) && empty( $no_texturize_tags_stack ) ) {\n\t\t\t// This is neither a delimiter, nor is this content inside of no_texturize pairs.  Do texturize.\n\n\t\t\t$curl = str_replace( $static_characters, $static_replacements, $curl );\n\n\t\t\tif ( false !== strpos( $curl, \"'\" ) ) {\n\t\t\t\t$curl = preg_replace( $dynamic_characters['apos'], $dynamic_replacements['apos'], $curl );\n\t\t\t\t$curl = wptexturize_primes( $curl, \"'\", $prime, $open_sq_flag, $closing_single_quote );\n\t\t\t\t$curl = str_replace( $apos_flag, $apos, $curl );\n\t\t\t\t$curl = str_replace( $open_sq_flag, $opening_single_quote, $curl );\n\t\t\t}\n\t\t\tif ( false !== strpos( $curl, '\"' ) ) {\n\t\t\t\t$curl = preg_replace( $dynamic_characters['quote'], $dynamic_replacements['quote'], $curl );\n\t\t\t\t$curl = wptexturize_primes( $curl, '\"', $double_prime, $open_q_flag, $closing_quote );\n\t\t\t\t$curl = str_replace( $open_q_flag, $opening_quote, $curl );\n\t\t\t}\n\t\t\tif ( false !== strpos( $curl, '-' ) ) {\n\t\t\t\t$curl = preg_replace( $dynamic_characters['dash'], $dynamic_replacements['dash'], $curl );\n\t\t\t}\n\n\t\t\t// 9x9 (times), but never 0x9999\n\t\t\tif ( 1 === preg_match( '/(?<=\\d)x\\d/', $curl ) ) {\n\t\t\t\t// Searching for a digit is 10 times more expensive than for the x, so we avoid doing this one!\n\t\t\t\t$curl = preg_replace( '/\\b(\\d(?(?<=0)[\\d\\.,]+|[\\d\\.,]*))x(\\d[\\d\\.,]*)\\b/', '$1&#215;$2', $curl );\n\t\t\t}\n\n\t\t\t// Replace each & with &#038; unless it already looks like an entity.\n\t\t\t$curl = preg_replace( '/&(?!#(?:\\d+|x[a-f0-9]+);|[a-z1-4]{1,8};)/i', '&#038;', $curl );\n\t\t}\n\t}\n\n\treturn implode( '', $textarr );\n}\n\n/**\n * Implements a logic tree to determine whether or not \"7'.\" represents seven feet,\n * then converts the special char into either a prime char or a closing quote char.\n *\n * @since 4.3.0\n *\n * @param string $haystack    The plain text to be searched.\n * @param string $needle      The character to search for such as ' or \".\n * @param string $prime       The prime char to use for replacement.\n * @param string $open_quote  The opening quote char. Opening quote replacement must be\n *                            accomplished already.\n * @param string $close_quote The closing quote char to use for replacement.\n * @return string The $haystack value after primes and quotes replacements.\n */\nfunction wptexturize_primes( $haystack, $needle, $prime, $open_quote, $close_quote ) {\n\t$spaces = wp_spaces_regexp();\n\t$flag = '<!--wp-prime-or-quote-->';\n\t$quote_pattern = \"/$needle(?=\\\\Z|[.,:;!?)}\\\\-\\\\]]|&gt;|\" . $spaces . \")/\";\n\t$prime_pattern    = \"/(?<=\\\\d)$needle/\";\n\t$flag_after_digit = \"/(?<=\\\\d)$flag/\";\n\t$flag_no_digit    = \"/(?<!\\\\d)$flag/\";\n\n\t$sentences = explode( $open_quote, $haystack );\n\n\tforeach ( $sentences as $key => &$sentence ) {\n\t\tif ( false === strpos( $sentence, $needle ) ) {\n\t\t\tcontinue;\n\t\t} elseif ( 0 !== $key && 0 === substr_count( $sentence, $close_quote ) ) {\n\t\t\t$sentence = preg_replace( $quote_pattern, $flag, $sentence, -1, $count );\n\t\t\tif ( $count > 1 ) {\n\t\t\t\t// This sentence appears to have multiple closing quotes.  Attempt Vulcan logic.\n\t\t\t\t$sentence = preg_replace( $flag_no_digit, $close_quote, $sentence, -1, $count2 );\n\t\t\t\tif ( 0 === $count2 ) {\n\t\t\t\t\t// Try looking for a quote followed by a period.\n\t\t\t\t\t$count2 = substr_count( $sentence, \"$flag.\" );\n\t\t\t\t\tif ( $count2 > 0 ) {\n\t\t\t\t\t\t// Assume the rightmost quote-period match is the end of quotation.\n\t\t\t\t\t\t$pos = strrpos( $sentence, \"$flag.\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// When all else fails, make the rightmost candidate a closing quote.\n\t\t\t\t\t\t// This is most likely to be problematic in the context of bug #18549.\n\t\t\t\t\t\t$pos = strrpos( $sentence, $flag );\n\t\t\t\t\t}\n\t\t\t\t\t$sentence = substr_replace( $sentence, $close_quote, $pos, strlen( $flag ) );\n\t\t\t\t}\n\t\t\t\t// Use conventional replacement on any remaining primes and quotes.\n\t\t\t\t$sentence = preg_replace( $prime_pattern, $prime, $sentence );\n\t\t\t\t$sentence = preg_replace( $flag_after_digit, $prime, $sentence );\n\t\t\t\t$sentence = str_replace( $flag, $close_quote, $sentence );\n\t\t\t} elseif ( 1 == $count ) {\n\t\t\t\t// Found only one closing quote candidate, so give it priority over primes.\n\t\t\t\t$sentence = str_replace( $flag, $close_quote, $sentence );\n\t\t\t\t$sentence = preg_replace( $prime_pattern, $prime, $sentence );\n\t\t\t} else {\n\t\t\t\t// No closing quotes found.  Just run primes pattern.\n\t\t\t\t$sentence = preg_replace( $prime_pattern, $prime, $sentence );\n\t\t\t}\n\t\t} else {\n\t\t\t$sentence = preg_replace( $prime_pattern, $prime, $sentence );\n\t\t\t$sentence = preg_replace( $quote_pattern, $close_quote, $sentence );\n\t\t}\n\t\tif ( '\"' == $needle && false !== strpos( $sentence, '\"' ) ) {\n\t\t\t$sentence = str_replace( '\"', $close_quote, $sentence );\n\t\t}\n\t}\n\n\treturn implode( $open_quote, $sentences );\n}\n\n/**\n * Search for disabled element tags. Push element to stack on tag open and pop\n * on tag close.\n *\n * Assumes first char of $text is tag opening and last char is tag closing.\n * Assumes second char of $text is optionally '/' to indicate closing as in </html>.\n *\n * @since 2.9.0\n * @access private\n *\n * @param string $text Text to check. Must be a tag like `<html>` or `[shortcode]`.\n * @param array  $stack List of open tag elements.\n * @param array  $disabled_elements The tag names to match against. Spaces are not allowed in tag names.\n */\nfunction _wptexturize_pushpop_element( $text, &$stack, $disabled_elements ) {\n\t// Is it an opening tag or closing tag?\n\tif ( '/' !== $text[1] ) {\n\t\t$opening_tag = true;\n\t\t$name_offset = 1;\n\t} elseif ( 0 == count( $stack ) ) {\n\t\t// Stack is empty. Just stop.\n\t\treturn;\n\t} else {\n\t\t$opening_tag = false;\n\t\t$name_offset = 2;\n\t}\n\n\t// Parse out the tag name.\n\t$space = strpos( $text, ' ' );\n\tif ( false === $space ) {\n\t\t$space = -1;\n\t} else {\n\t\t$space -= $name_offset;\n\t}\n\t$tag = substr( $text, $name_offset, $space );\n\n\t// Handle disabled tags.\n\tif ( in_array( $tag, $disabled_elements ) ) {\n\t\tif ( $opening_tag ) {\n\t\t\t/*\n\t\t\t * This disables texturize until we find a closing tag of our type\n\t\t\t * (e.g. <pre>) even if there was invalid nesting before that\n\t\t\t *\n\t\t\t * Example: in the case <pre>sadsadasd</code>\"baba\"</pre>\n\t\t\t *          \"baba\" won't be texturize\n\t\t\t */\n\n\t\t\tarray_push( $stack, $tag );\n\t\t} elseif ( end( $stack ) == $tag ) {\n\t\t\tarray_pop( $stack );\n\t\t}\n\t}\n}\n\n/**\n * Replaces double line-breaks with paragraph elements.\n *\n * A group of regex replaces used to identify text formatted with newlines and\n * replace double line-breaks with HTML paragraph tags. The remaining line-breaks\n * after conversion become <<br />> tags, unless $br is set to '0' or 'false'.\n *\n * @since 0.71\n *\n * @param string $pee The text which has to be formatted.\n * @param bool   $br  Optional. If set, this will convert all remaining line-breaks\n *                    after paragraphing. Default true.\n * @return string Text which has been converted into correct paragraph tags.\n */\nfunction wpautop( $pee, $br = true ) {\n\t$pre_tags = array();\n\n\tif ( trim($pee) === '' )\n\t\treturn '';\n\n\t// Just to make things a little easier, pad the end.\n\t$pee = $pee . \"\\n\";\n\n\t/*\n\t * Pre tags shouldn't be touched by autop.\n\t * Replace pre tags with placeholders and bring them back after autop.\n\t */\n\tif ( strpos($pee, '<pre') !== false ) {\n\t\t$pee_parts = explode( '</pre>', $pee );\n\t\t$last_pee = array_pop($pee_parts);\n\t\t$pee = '';\n\t\t$i = 0;\n\n\t\tforeach ( $pee_parts as $pee_part ) {\n\t\t\t$start = strpos($pee_part, '<pre');\n\n\t\t\t// Malformed html?\n\t\t\tif ( $start === false ) {\n\t\t\t\t$pee .= $pee_part;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$name = \"<pre wp-pre-tag-$i></pre>\";\n\t\t\t$pre_tags[$name] = substr( $pee_part, $start ) . '</pre>';\n\n\t\t\t$pee .= substr( $pee_part, 0, $start ) . $name;\n\t\t\t$i++;\n\t\t}\n\n\t\t$pee .= $last_pee;\n\t}\n\t// Change multiple <br>s into two line breaks, which will turn into paragraphs.\n\t$pee = preg_replace('|<br\\s*/?>\\s*<br\\s*/?>|', \"\\n\\n\", $pee);\n\n\t$allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)';\n\n\t// Add a single line break above block-level opening tags.\n\t$pee = preg_replace('!(<' . $allblocks . '[\\s/>])!', \"\\n$1\", $pee);\n\n\t// Add a double line break below block-level closing tags.\n\t$pee = preg_replace('!(</' . $allblocks . '>)!', \"$1\\n\\n\", $pee);\n\n\t// Standardize newline characters to \"\\n\".\n\t$pee = str_replace(array(\"\\r\\n\", \"\\r\"), \"\\n\", $pee);\n\n\t// Find newlines in all elements and add placeholders.\n\t$pee = wp_replace_in_html_tags( $pee, array( \"\\n\" => \" <!-- wpnl --> \" ) );\n\n\t// Collapse line breaks before and after <option> elements so they don't get autop'd.\n\tif ( strpos( $pee, '<option' ) !== false ) {\n\t\t$pee = preg_replace( '|\\s*<option|', '<option', $pee );\n\t\t$pee = preg_replace( '|</option>\\s*|', '</option>', $pee );\n\t}\n\n\t/*\n\t * Collapse line breaks inside <object> elements, before <param> and <embed> elements\n\t * so they don't get autop'd.\n\t */\n\tif ( strpos( $pee, '</object>' ) !== false ) {\n\t\t$pee = preg_replace( '|(<object[^>]*>)\\s*|', '$1', $pee );\n\t\t$pee = preg_replace( '|\\s*</object>|', '</object>', $pee );\n\t\t$pee = preg_replace( '%\\s*(</?(?:param|embed)[^>]*>)\\s*%', '$1', $pee );\n\t}\n\n\t/*\n\t * Collapse line breaks inside <audio> and <video> elements,\n\t * before and after <source> and <track> elements.\n\t */\n\tif ( strpos( $pee, '<source' ) !== false || strpos( $pee, '<track' ) !== false ) {\n\t\t$pee = preg_replace( '%([<\\[](?:audio|video)[^>\\]]*[>\\]])\\s*%', '$1', $pee );\n\t\t$pee = preg_replace( '%\\s*([<\\[]/(?:audio|video)[>\\]])%', '$1', $pee );\n\t\t$pee = preg_replace( '%\\s*(<(?:source|track)[^>]*>)\\s*%', '$1', $pee );\n\t}\n\n\t// Remove more than two contiguous line breaks.\n\t$pee = preg_replace(\"/\\n\\n+/\", \"\\n\\n\", $pee);\n\n\t// Split up the contents into an array of strings, separated by double line breaks.\n\t$pees = preg_split('/\\n\\s*\\n/', $pee, -1, PREG_SPLIT_NO_EMPTY);\n\n\t// Reset $pee prior to rebuilding.\n\t$pee = '';\n\n\t// Rebuild the content as a string, wrapping every bit with a <p>.\n\tforeach ( $pees as $tinkle ) {\n\t\t$pee .= '<p>' . trim($tinkle, \"\\n\") . \"</p>\\n\";\n\t}\n\n\t// Under certain strange conditions it could create a P of entirely whitespace.\n\t$pee = preg_replace('|<p>\\s*</p>|', '', $pee);\n\n\t// Add a closing <p> inside <div>, <address>, or <form> tag if missing.\n\t$pee = preg_replace('!<p>([^<]+)</(div|address|form)>!', \"<p>$1</p></$2>\", $pee);\n\n\t// If an opening or closing block element tag is wrapped in a <p>, unwrap it.\n\t$pee = preg_replace('!<p>\\s*(</?' . $allblocks . '[^>]*>)\\s*</p>!', \"$1\", $pee);\n\n\t// In some cases <li> may get wrapped in <p>, fix them.\n\t$pee = preg_replace(\"|<p>(<li.+?)</p>|\", \"$1\", $pee);\n\n\t// If a <blockquote> is wrapped with a <p>, move it inside the <blockquote>.\n\t$pee = preg_replace('|<p><blockquote([^>]*)>|i', \"<blockquote$1><p>\", $pee);\n\t$pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);\n\n\t// If an opening or closing block element tag is preceded by an opening <p> tag, remove it.\n\t$pee = preg_replace('!<p>\\s*(</?' . $allblocks . '[^>]*>)!', \"$1\", $pee);\n\n\t// If an opening or closing block element tag is followed by a closing <p> tag, remove it.\n\t$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\\s*</p>!', \"$1\", $pee);\n\n\t// Optionally insert line breaks.\n\tif ( $br ) {\n\t\t// Replace newlines that shouldn't be touched with a placeholder.\n\t\t$pee = preg_replace_callback('/<(script|style).*?<\\/\\\\1>/s', '_autop_newline_preservation_helper', $pee);\n\n\t\t// Normalize <br>\n\t\t$pee = str_replace( array( '<br>', '<br/>' ), '<br />', $pee );\n\n\t\t// Replace any new line characters that aren't preceded by a <br /> with a <br />.\n\t\t$pee = preg_replace('|(?<!<br />)\\s*\\n|', \"<br />\\n\", $pee);\n\n\t\t// Replace newline placeholders with newlines.\n\t\t$pee = str_replace('<WPPreserveNewline />', \"\\n\", $pee);\n\t}\n\n\t// If a <br /> tag is after an opening or closing block tag, remove it.\n\t$pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\\s*<br />!', \"$1\", $pee);\n\n\t// If a <br /> tag is before a subset of opening or closing block tags, remove it.\n\t$pee = preg_replace('!<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee);\n\t$pee = preg_replace( \"|\\n</p>$|\", '</p>', $pee );\n\n\t// Replace placeholder <pre> tags with their original content.\n\tif ( !empty($pre_tags) )\n\t\t$pee = str_replace(array_keys($pre_tags), array_values($pre_tags), $pee);\n\n\t// Restore newlines in all elements.\n\tif ( false !== strpos( $pee, '<!-- wpnl -->' ) ) {\n\t\t$pee = str_replace( array( ' <!-- wpnl --> ', '<!-- wpnl -->' ), \"\\n\", $pee );\n\t}\n\n\treturn $pee;\n}\n\n/**\n * Separate HTML elements and comments from the text.\n *\n * @since 4.2.4\n *\n * @param string $input The text which has to be formatted.\n * @return array The formatted text.\n */\nfunction wp_html_split( $input ) {\n\treturn preg_split( get_html_split_regex(), $input, -1, PREG_SPLIT_DELIM_CAPTURE );\n}\n\n/**\n * Retrieve the regular expression for an HTML element.\n *\n * @since 4.4.0\n *\n * @return string The regular expression\n */\nfunction get_html_split_regex() {\n\tstatic $regex;\n\n\tif ( ! isset( $regex ) ) {\n\t\t$comments =\n\t\t\t  '!'           // Start of comment, after the <.\n\t\t\t. '(?:'         // Unroll the loop: Consume everything until --> is found.\n\t\t\t.     '-(?!->)' // Dash not followed by end of comment.\n\t\t\t.     '[^\\-]*+' // Consume non-dashes.\n\t\t\t. ')*+'         // Loop possessively.\n\t\t\t. '(?:-->)?';   // End of comment. If not found, match all input.\n\n\t\t$cdata =\n\t\t\t  '!\\[CDATA\\['  // Start of comment, after the <.\n\t\t\t. '[^\\]]*+'     // Consume non-].\n\t\t\t. '(?:'         // Unroll the loop: Consume everything until ]]> is found.\n\t\t\t.     '](?!]>)' // One ] not followed by end of comment.\n\t\t\t.     '[^\\]]*+' // Consume non-].\n\t\t\t. ')*+'         // Loop possessively.\n\t\t\t. '(?:]]>)?';   // End of comment. If not found, match all input.\n\n\t\t$escaped =\n\t\t\t  '(?='           // Is the element escaped?\n\t\t\t.    '!--'\n\t\t\t. '|'\n\t\t\t.    '!\\[CDATA\\['\n\t\t\t. ')'\n\t\t\t. '(?(?=!-)'      // If yes, which type?\n\t\t\t.     $comments\n\t\t\t. '|'\n\t\t\t.     $cdata\n\t\t\t. ')';\n\n\t\t$regex =\n\t\t\t  '/('              // Capture the entire match.\n\t\t\t.     '<'           // Find start of element.\n\t\t\t.     '(?'          // Conditional expression follows.\n\t\t\t.         $escaped  // Find end of escaped element.\n\t\t\t.     '|'           // ... else ...\n\t\t\t.         '[^>]*>?' // Find end of normal element.\n\t\t\t.     ')'\n\t\t\t. ')/';\n\t}\n\n\treturn $regex;\n}\n\n/**\n * Retrieve the combined regular expression for HTML and shortcodes.\n *\n * @access private\n * @ignore\n * @internal This function will be removed in 4.5.0 per Shortcode API Roadmap.\n * @since 4.4.0\n *\n * @param string $shortcode_regex The result from _get_wptexturize_shortcode_regex().  Optional.\n * @return string The regular expression\n */\nfunction _get_wptexturize_split_regex( $shortcode_regex = '' ) {\n\tstatic $html_regex;\n\n\tif ( ! isset( $html_regex ) ) {\n\t\t$comment_regex =\n\t\t\t  '!'           // Start of comment, after the <.\n\t\t\t. '(?:'         // Unroll the loop: Consume everything until --> is found.\n\t\t\t.     '-(?!->)' // Dash not followed by end of comment.\n\t\t\t.     '[^\\-]*+' // Consume non-dashes.\n\t\t\t. ')*+'         // Loop possessively.\n\t\t\t. '(?:-->)?';   // End of comment. If not found, match all input.\n\n\t\t$html_regex =\t\t\t // Needs replaced with wp_html_split() per Shortcode API Roadmap.\n\t\t\t  '<'                // Find start of element.\n\t\t\t. '(?(?=!--)'        // Is this a comment?\n\t\t\t.     $comment_regex // Find end of comment.\n\t\t\t. '|'\n\t\t\t.     '[^>]*>?'      // Find end of element. If not found, match all input.\n\t\t\t. ')';\n\t}\n\n\tif ( empty( $shortcode_regex ) ) {\n\t\t$regex = '/(' . $html_regex . ')/';\n\t} else {\n\t\t$regex = '/(' . $html_regex . '|' . $shortcode_regex . ')/';\n\t}\n\n\treturn $regex;\n}\n\n/**\n * Retrieve the regular expression for shortcodes.\n *\n * @access private\n * @ignore\n * @internal This function will be removed in 4.5.0 per Shortcode API Roadmap.\n * @since 4.4.0\n *\n * @param array $tagnames List of shortcodes to find.\n * @return string The regular expression\n */\nfunction _get_wptexturize_shortcode_regex( $tagnames ) {\n\t$tagregexp = join( '|', array_map( 'preg_quote', $tagnames ) );\n\t$tagregexp = \"(?:$tagregexp)(?=[\\\\s\\\\]\\\\/])\"; // Excerpt of get_shortcode_regex().\n\t$regex =\n\t\t  '\\['              // Find start of shortcode.\n\t\t. '[\\/\\[]?'         // Shortcodes may begin with [/ or [[\n\t\t. $tagregexp        // Only match registered shortcodes, because performance.\n\t\t. '(?:'\n\t\t.     '[^\\[\\]<>]+'  // Shortcodes do not contain other shortcodes. Quantifier critical.\n\t\t. '|'\n\t\t.     '<[^\\[\\]>]*>' // HTML elements permitted. Prevents matching ] before >.\n\t\t. ')*+'             // Possessive critical.\n\t\t. '\\]'              // Find end of shortcode.\n\t\t. '\\]?';            // Shortcodes may end with ]]\n\n\treturn $regex;\n}\n\n/**\n * Replace characters or phrases within HTML elements only.\n *\n * @since 4.2.3\n *\n * @param string $haystack The text which has to be formatted.\n * @param array $replace_pairs In the form array('from' => 'to', ...).\n * @return string The formatted text.\n */\nfunction wp_replace_in_html_tags( $haystack, $replace_pairs ) {\n\t// Find all elements.\n\t$textarr = wp_html_split( $haystack );\n\t$changed = false;\n\n\t// Optimize when searching for one item.\n\tif ( 1 === count( $replace_pairs ) ) {\n\t\t// Extract $needle and $replace.\n\t\tforeach ( $replace_pairs as $needle => $replace );\n\n\t\t// Loop through delimiters (elements) only.\n\t\tfor ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {\n\t\t\tif ( false !== strpos( $textarr[$i], $needle ) ) {\n\t\t\t\t$textarr[$i] = str_replace( $needle, $replace, $textarr[$i] );\n\t\t\t\t$changed = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Extract all $needles.\n\t\t$needles = array_keys( $replace_pairs );\n\n\t\t// Loop through delimiters (elements) only.\n\t\tfor ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {\n\t\t\tforeach ( $needles as $needle ) {\n\t\t\t\tif ( false !== strpos( $textarr[$i], $needle ) ) {\n\t\t\t\t\t$textarr[$i] = strtr( $textarr[$i], $replace_pairs );\n\t\t\t\t\t$changed = true;\n\t\t\t\t\t// After one strtr() break out of the foreach loop and look at next element.\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( $changed ) {\n\t\t$haystack = implode( $textarr );\n\t}\n\n\treturn $haystack;\n}\n\n/**\n * Newline preservation help function for wpautop\n *\n * @since 3.1.0\n * @access private\n *\n * @param array $matches preg_replace_callback matches array\n * @return string\n */\nfunction _autop_newline_preservation_helper( $matches ) {\n\treturn str_replace( \"\\n\", \"<WPPreserveNewline />\", $matches[0] );\n}\n\n/**\n * Don't auto-p wrap shortcodes that stand alone\n *\n * Ensures that shortcodes are not wrapped in `<p>...</p>`.\n *\n * @since 2.9.0\n *\n * @global array $shortcode_tags\n *\n * @param string $pee The content.\n * @return string The filtered content.\n */\nfunction shortcode_unautop( $pee ) {\n\tglobal $shortcode_tags;\n\n\tif ( empty( $shortcode_tags ) || !is_array( $shortcode_tags ) ) {\n\t\treturn $pee;\n\t}\n\n\t$tagregexp = join( '|', array_map( 'preg_quote', array_keys( $shortcode_tags ) ) );\n\t$spaces = wp_spaces_regexp();\n\n\t$pattern =\n\t\t  '/'\n\t\t. '<p>'                              // Opening paragraph\n\t\t. '(?:' . $spaces . ')*+'            // Optional leading whitespace\n\t\t. '('                                // 1: The shortcode\n\t\t.     '\\\\['                          // Opening bracket\n\t\t.     \"($tagregexp)\"                 // 2: Shortcode name\n\t\t.     '(?![\\\\w-])'                   // Not followed by word character or hyphen\n\t\t                                     // Unroll the loop: Inside the opening shortcode tag\n\t\t.     '[^\\\\]\\\\/]*'                   // Not a closing bracket or forward slash\n\t\t.     '(?:'\n\t\t.         '\\\\/(?!\\\\])'               // A forward slash not followed by a closing bracket\n\t\t.         '[^\\\\]\\\\/]*'               // Not a closing bracket or forward slash\n\t\t.     ')*?'\n\t\t.     '(?:'\n\t\t.         '\\\\/\\\\]'                   // Self closing tag and closing bracket\n\t\t.     '|'\n\t\t.         '\\\\]'                      // Closing bracket\n\t\t.         '(?:'                      // Unroll the loop: Optionally, anything between the opening and closing shortcode tags\n\t\t.             '[^\\\\[]*+'             // Not an opening bracket\n\t\t.             '(?:'\n\t\t.                 '\\\\[(?!\\\\/\\\\2\\\\])' // An opening bracket not followed by the closing shortcode tag\n\t\t.                 '[^\\\\[]*+'         // Not an opening bracket\n\t\t.             ')*+'\n\t\t.             '\\\\[\\\\/\\\\2\\\\]'         // Closing shortcode tag\n\t\t.         ')?'\n\t\t.     ')'\n\t\t. ')'\n\t\t. '(?:' . $spaces . ')*+'            // optional trailing whitespace\n\t\t. '<\\\\/p>'                           // closing paragraph\n\t\t. '/';\n\n\treturn preg_replace( $pattern, '$1', $pee );\n}\n\n/**\n * Checks to see if a string is utf8 encoded.\n *\n * NOTE: This function checks for 5-Byte sequences, UTF8\n *       has Bytes Sequences with a maximum length of 4.\n *\n * @author bmorel at ssi dot fr (modified)\n * @since 1.2.1\n *\n * @param string $str The string to be checked\n * @return bool True if $str fits a UTF-8 model, false otherwise.\n */\nfunction seems_utf8( $str ) {\n\tmbstring_binary_safe_encoding();\n\t$length = strlen($str);\n\treset_mbstring_encoding();\n\tfor ($i=0; $i < $length; $i++) {\n\t\t$c = ord($str[$i]);\n\t\tif ($c < 0x80) $n = 0; // 0bbbbbbb\n\t\telseif (($c & 0xE0) == 0xC0) $n=1; // 110bbbbb\n\t\telseif (($c & 0xF0) == 0xE0) $n=2; // 1110bbbb\n\t\telseif (($c & 0xF8) == 0xF0) $n=3; // 11110bbb\n\t\telseif (($c & 0xFC) == 0xF8) $n=4; // 111110bb\n\t\telseif (($c & 0xFE) == 0xFC) $n=5; // 1111110b\n\t\telse return false; // Does not match any model\n\t\tfor ($j=0; $j<$n; $j++) { // n bytes matching 10bbbbbb follow ?\n\t\t\tif ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))\n\t\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\n/**\n * Converts a number of special characters into their HTML entities.\n *\n * Specifically deals with: &, <, >, \", and '.\n *\n * $quote_style can be set to ENT_COMPAT to encode \" to\n * &quot;, or ENT_QUOTES to do both. Default is ENT_NOQUOTES where no quotes are encoded.\n *\n * @since 1.2.2\n * @access private\n *\n * @staticvar string $_charset\n *\n * @param string     $string         The text which is to be encoded.\n * @param int|string $quote_style    Optional. Converts double quotes if set to ENT_COMPAT,\n *                                   both single and double if set to ENT_QUOTES or none if set to ENT_NOQUOTES.\n *                                   Also compatible with old values; converting single quotes if set to 'single',\n *                                   double if set to 'double' or both if otherwise set.\n *                                   Default is ENT_NOQUOTES.\n * @param string     $charset        Optional. The character encoding of the string. Default is false.\n * @param bool       $double_encode  Optional. Whether to encode existing html entities. Default is false.\n * @return string The encoded text with HTML entities.\n */\nfunction _wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) {\n\t$string = (string) $string;\n\n\tif ( 0 === strlen( $string ) )\n\t\treturn '';\n\n\t// Don't bother if there are no specialchars - saves some processing\n\tif ( ! preg_match( '/[&<>\"\\']/', $string ) )\n\t\treturn $string;\n\n\t// Account for the previous behaviour of the function when the $quote_style is not an accepted value\n\tif ( empty( $quote_style ) )\n\t\t$quote_style = ENT_NOQUOTES;\n\telseif ( ! in_array( $quote_style, array( 0, 2, 3, 'single', 'double' ), true ) )\n\t\t$quote_style = ENT_QUOTES;\n\n\t// Store the site charset as a static to avoid multiple calls to wp_load_alloptions()\n\tif ( ! $charset ) {\n\t\tstatic $_charset = null;\n\t\tif ( ! isset( $_charset ) ) {\n\t\t\t$alloptions = wp_load_alloptions();\n\t\t\t$_charset = isset( $alloptions['blog_charset'] ) ? $alloptions['blog_charset'] : '';\n\t\t}\n\t\t$charset = $_charset;\n\t}\n\n\tif ( in_array( $charset, array( 'utf8', 'utf-8', 'UTF8' ) ) )\n\t\t$charset = 'UTF-8';\n\n\t$_quote_style = $quote_style;\n\n\tif ( $quote_style === 'double' ) {\n\t\t$quote_style = ENT_COMPAT;\n\t\t$_quote_style = ENT_COMPAT;\n\t} elseif ( $quote_style === 'single' ) {\n\t\t$quote_style = ENT_NOQUOTES;\n\t}\n\n\tif ( ! $double_encode ) {\n\t\t// Guarantee every &entity; is valid, convert &garbage; into &amp;garbage;\n\t\t// This is required for PHP < 5.4.0 because ENT_HTML401 flag is unavailable.\n\t\t$string = wp_kses_normalize_entities( $string );\n\t}\n\n\t$string = @htmlspecialchars( $string, $quote_style, $charset, $double_encode );\n\n\t// Backwards compatibility\n\tif ( 'single' === $_quote_style )\n\t\t$string = str_replace( \"'\", '&#039;', $string );\n\n\treturn $string;\n}\n\n/**\n * Converts a number of HTML entities into their special characters.\n *\n * Specifically deals with: &, <, >, \", and '.\n *\n * $quote_style can be set to ENT_COMPAT to decode \" entities,\n * or ENT_QUOTES to do both \" and '. Default is ENT_NOQUOTES where no quotes are decoded.\n *\n * @since 2.8.0\n *\n * @param string     $string The text which is to be decoded.\n * @param string|int $quote_style Optional. Converts double quotes if set to ENT_COMPAT,\n *                                both single and double if set to ENT_QUOTES or\n *                                none if set to ENT_NOQUOTES.\n *                                Also compatible with old _wp_specialchars() values;\n *                                converting single quotes if set to 'single',\n *                                double if set to 'double' or both if otherwise set.\n *                                Default is ENT_NOQUOTES.\n * @return string The decoded text without HTML entities.\n */\nfunction wp_specialchars_decode( $string, $quote_style = ENT_NOQUOTES ) {\n\t$string = (string) $string;\n\n\tif ( 0 === strlen( $string ) ) {\n\t\treturn '';\n\t}\n\n\t// Don't bother if there are no entities - saves a lot of processing\n\tif ( strpos( $string, '&' ) === false ) {\n\t\treturn $string;\n\t}\n\n\t// Match the previous behaviour of _wp_specialchars() when the $quote_style is not an accepted value\n\tif ( empty( $quote_style ) ) {\n\t\t$quote_style = ENT_NOQUOTES;\n\t} elseif ( !in_array( $quote_style, array( 0, 2, 3, 'single', 'double' ), true ) ) {\n\t\t$quote_style = ENT_QUOTES;\n\t}\n\n\t// More complete than get_html_translation_table( HTML_SPECIALCHARS )\n\t$single = array( '&#039;'  => '\\'', '&#x27;' => '\\'' );\n\t$single_preg = array( '/&#0*39;/'  => '&#039;', '/&#x0*27;/i' => '&#x27;' );\n\t$double = array( '&quot;' => '\"', '&#034;'  => '\"', '&#x22;' => '\"' );\n\t$double_preg = array( '/&#0*34;/'  => '&#034;', '/&#x0*22;/i' => '&#x22;' );\n\t$others = array( '&lt;'   => '<', '&#060;'  => '<', '&gt;'   => '>', '&#062;'  => '>', '&amp;'  => '&', '&#038;'  => '&', '&#x26;' => '&' );\n\t$others_preg = array( '/&#0*60;/'  => '&#060;', '/&#0*62;/'  => '&#062;', '/&#0*38;/'  => '&#038;', '/&#x0*26;/i' => '&#x26;' );\n\n\tif ( $quote_style === ENT_QUOTES ) {\n\t\t$translation = array_merge( $single, $double, $others );\n\t\t$translation_preg = array_merge( $single_preg, $double_preg, $others_preg );\n\t} elseif ( $quote_style === ENT_COMPAT || $quote_style === 'double' ) {\n\t\t$translation = array_merge( $double, $others );\n\t\t$translation_preg = array_merge( $double_preg, $others_preg );\n\t} elseif ( $quote_style === 'single' ) {\n\t\t$translation = array_merge( $single, $others );\n\t\t$translation_preg = array_merge( $single_preg, $others_preg );\n\t} elseif ( $quote_style === ENT_NOQUOTES ) {\n\t\t$translation = $others;\n\t\t$translation_preg = $others_preg;\n\t}\n\n\t// Remove zero padding on numeric entities\n\t$string = preg_replace( array_keys( $translation_preg ), array_values( $translation_preg ), $string );\n\n\t// Replace characters according to translation table\n\treturn strtr( $string, $translation );\n}\n\n/**\n * Checks for invalid UTF8 in a string.\n *\n * @since 2.8.0\n *\n * @staticvar bool $is_utf8\n * @staticvar bool $utf8_pcre\n *\n * @param string  $string The text which is to be checked.\n * @param bool    $strip Optional. Whether to attempt to strip out invalid UTF8. Default is false.\n * @return string The checked text.\n */\nfunction wp_check_invalid_utf8( $string, $strip = false ) {\n\t$string = (string) $string;\n\n\tif ( 0 === strlen( $string ) ) {\n\t\treturn '';\n\t}\n\n\t// Store the site charset as a static to avoid multiple calls to get_option()\n\tstatic $is_utf8 = null;\n\tif ( ! isset( $is_utf8 ) ) {\n\t\t$is_utf8 = in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) );\n\t}\n\tif ( ! $is_utf8 ) {\n\t\treturn $string;\n\t}\n\n\t// Check for support for utf8 in the installed PCRE library once and store the result in a static\n\tstatic $utf8_pcre = null;\n\tif ( ! isset( $utf8_pcre ) ) {\n\t\t$utf8_pcre = @preg_match( '/^./u', 'a' );\n\t}\n\t// We can't demand utf8 in the PCRE installation, so just return the string in those cases\n\tif ( !$utf8_pcre ) {\n\t\treturn $string;\n\t}\n\n\t// preg_match fails when it encounters invalid UTF8 in $string\n\tif ( 1 === @preg_match( '/^./us', $string ) ) {\n\t\treturn $string;\n\t}\n\n\t// Attempt to strip the bad chars if requested (not recommended)\n\tif ( $strip && function_exists( 'iconv' ) ) {\n\t\treturn iconv( 'utf-8', 'utf-8', $string );\n\t}\n\n\treturn '';\n}\n\n/**\n * Encode the Unicode values to be used in the URI.\n *\n * @since 1.5.0\n *\n * @param string $utf8_string\n * @param int    $length Max  length of the string\n * @return string String with Unicode encoded for URI.\n */\nfunction utf8_uri_encode( $utf8_string, $length = 0 ) {\n\t$unicode = '';\n\t$values = array();\n\t$num_octets = 1;\n\t$unicode_length = 0;\n\n\tmbstring_binary_safe_encoding();\n\t$string_length = strlen( $utf8_string );\n\treset_mbstring_encoding();\n\n\tfor ($i = 0; $i < $string_length; $i++ ) {\n\n\t\t$value = ord( $utf8_string[ $i ] );\n\n\t\tif ( $value < 128 ) {\n\t\t\tif ( $length && ( $unicode_length >= $length ) )\n\t\t\t\tbreak;\n\t\t\t$unicode .= chr($value);\n\t\t\t$unicode_length++;\n\t\t} else {\n\t\t\tif ( count( $values ) == 0 ) {\n\t\t\t\tif ( $value < 224 ) {\n\t\t\t\t\t$num_octets = 2;\n\t\t\t\t} elseif ( $value < 240 ) {\n\t\t\t\t\t$num_octets = 3;\n\t\t\t\t} else {\n\t\t\t\t\t$num_octets = 4;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$values[] = $value;\n\n\t\t\tif ( $length && ( $unicode_length + ($num_octets * 3) ) > $length )\n\t\t\t\tbreak;\n\t\t\tif ( count( $values ) == $num_octets ) {\n\t\t\t\tfor ( $j = 0; $j < $num_octets; $j++ ) {\n\t\t\t\t\t$unicode .= '%' . dechex( $values[ $j ] );\n\t\t\t\t}\n\n\t\t\t\t$unicode_length += $num_octets * 3;\n\n\t\t\t\t$values = array();\n\t\t\t\t$num_octets = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $unicode;\n}\n\n/**\n * Converts all accent characters to ASCII characters.\n *\n * If there are no accent characters, then the string given is just returned.\n *\n * @since 1.2.1\n *\n * @param string $string Text that might have accent characters\n * @return string Filtered string with replaced \"nice\" characters.\n */\nfunction remove_accents( $string ) {\n\tif ( !preg_match('/[\\x80-\\xff]/', $string) )\n\t\treturn $string;\n\n\tif (seems_utf8($string)) {\n\t\t$chars = array(\n\t\t// Decompositions for Latin-1 Supplement\n\t\tchr(194).chr(170) => 'a', chr(194).chr(186) => 'o',\n\t\tchr(195).chr(128) => 'A', chr(195).chr(129) => 'A',\n\t\tchr(195).chr(130) => 'A', chr(195).chr(131) => 'A',\n\t\tchr(195).chr(132) => 'A', chr(195).chr(133) => 'A',\n\t\tchr(195).chr(134) => 'AE',chr(195).chr(135) => 'C',\n\t\tchr(195).chr(136) => 'E', chr(195).chr(137) => 'E',\n\t\tchr(195).chr(138) => 'E', chr(195).chr(139) => 'E',\n\t\tchr(195).chr(140) => 'I', chr(195).chr(141) => 'I',\n\t\tchr(195).chr(142) => 'I', chr(195).chr(143) => 'I',\n\t\tchr(195).chr(144) => 'D', chr(195).chr(145) => 'N',\n\t\tchr(195).chr(146) => 'O', chr(195).chr(147) => 'O',\n\t\tchr(195).chr(148) => 'O', chr(195).chr(149) => 'O',\n\t\tchr(195).chr(150) => 'O', chr(195).chr(153) => 'U',\n\t\tchr(195).chr(154) => 'U', chr(195).chr(155) => 'U',\n\t\tchr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',\n\t\tchr(195).chr(158) => 'TH',chr(195).chr(159) => 's',\n\t\tchr(195).chr(160) => 'a', chr(195).chr(161) => 'a',\n\t\tchr(195).chr(162) => 'a', chr(195).chr(163) => 'a',\n\t\tchr(195).chr(164) => 'a', chr(195).chr(165) => 'a',\n\t\tchr(195).chr(166) => 'ae',chr(195).chr(167) => 'c',\n\t\tchr(195).chr(168) => 'e', chr(195).chr(169) => 'e',\n\t\tchr(195).chr(170) => 'e', chr(195).chr(171) => 'e',\n\t\tchr(195).chr(172) => 'i', chr(195).chr(173) => 'i',\n\t\tchr(195).chr(174) => 'i', chr(195).chr(175) => 'i',\n\t\tchr(195).chr(176) => 'd', chr(195).chr(177) => 'n',\n\t\tchr(195).chr(178) => 'o', chr(195).chr(179) => 'o',\n\t\tchr(195).chr(180) => 'o', chr(195).chr(181) => 'o',\n\t\tchr(195).chr(182) => 'o', chr(195).chr(184) => 'o',\n\t\tchr(195).chr(185) => 'u', chr(195).chr(186) => 'u',\n\t\tchr(195).chr(187) => 'u', chr(195).chr(188) => 'u',\n\t\tchr(195).chr(189) => 'y', chr(195).chr(190) => 'th',\n\t\tchr(195).chr(191) => 'y', chr(195).chr(152) => 'O',\n\t\t// Decompositions for Latin Extended-A\n\t\tchr(196).chr(128) => 'A', chr(196).chr(129) => 'a',\n\t\tchr(196).chr(130) => 'A', chr(196).chr(131) => 'a',\n\t\tchr(196).chr(132) => 'A', chr(196).chr(133) => 'a',\n\t\tchr(196).chr(134) => 'C', chr(196).chr(135) => 'c',\n\t\tchr(196).chr(136) => 'C', chr(196).chr(137) => 'c',\n\t\tchr(196).chr(138) => 'C', chr(196).chr(139) => 'c',\n\t\tchr(196).chr(140) => 'C', chr(196).chr(141) => 'c',\n\t\tchr(196).chr(142) => 'D', chr(196).chr(143) => 'd',\n\t\tchr(196).chr(144) => 'D', chr(196).chr(145) => 'd',\n\t\tchr(196).chr(146) => 'E', chr(196).chr(147) => 'e',\n\t\tchr(196).chr(148) => 'E', chr(196).chr(149) => 'e',\n\t\tchr(196).chr(150) => 'E', chr(196).chr(151) => 'e',\n\t\tchr(196).chr(152) => 'E', chr(196).chr(153) => 'e',\n\t\tchr(196).chr(154) => 'E', chr(196).chr(155) => 'e',\n\t\tchr(196).chr(156) => 'G', chr(196).chr(157) => 'g',\n\t\tchr(196).chr(158) => 'G', chr(196).chr(159) => 'g',\n\t\tchr(196).chr(160) => 'G', chr(196).chr(161) => 'g',\n\t\tchr(196).chr(162) => 'G', chr(196).chr(163) => 'g',\n\t\tchr(196).chr(164) => 'H', chr(196).chr(165) => 'h',\n\t\tchr(196).chr(166) => 'H', chr(196).chr(167) => 'h',\n\t\tchr(196).chr(168) => 'I', chr(196).chr(169) => 'i',\n\t\tchr(196).chr(170) => 'I', chr(196).chr(171) => 'i',\n\t\tchr(196).chr(172) => 'I', chr(196).chr(173) => 'i',\n\t\tchr(196).chr(174) => 'I', chr(196).chr(175) => 'i',\n\t\tchr(196).chr(176) => 'I', chr(196).chr(177) => 'i',\n\t\tchr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',\n\t\tchr(196).chr(180) => 'J', chr(196).chr(181) => 'j',\n\t\tchr(196).chr(182) => 'K', chr(196).chr(183) => 'k',\n\t\tchr(196).chr(184) => 'k', chr(196).chr(185) => 'L',\n\t\tchr(196).chr(186) => 'l', chr(196).chr(187) => 'L',\n\t\tchr(196).chr(188) => 'l', chr(196).chr(189) => 'L',\n\t\tchr(196).chr(190) => 'l', chr(196).chr(191) => 'L',\n\t\tchr(197).chr(128) => 'l', chr(197).chr(129) => 'L',\n\t\tchr(197).chr(130) => 'l', chr(197).chr(131) => 'N',\n\t\tchr(197).chr(132) => 'n', chr(197).chr(133) => 'N',\n\t\tchr(197).chr(134) => 'n', chr(197).chr(135) => 'N',\n\t\tchr(197).chr(136) => 'n', chr(197).chr(137) => 'N',\n\t\tchr(197).chr(138) => 'n', chr(197).chr(139) => 'N',\n\t\tchr(197).chr(140) => 'O', chr(197).chr(141) => 'o',\n\t\tchr(197).chr(142) => 'O', chr(197).chr(143) => 'o',\n\t\tchr(197).chr(144) => 'O', chr(197).chr(145) => 'o',\n\t\tchr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',\n\t\tchr(197).chr(148) => 'R',chr(197).chr(149) => 'r',\n\t\tchr(197).chr(150) => 'R',chr(197).chr(151) => 'r',\n\t\tchr(197).chr(152) => 'R',chr(197).chr(153) => 'r',\n\t\tchr(197).chr(154) => 'S',chr(197).chr(155) => 's',\n\t\tchr(197).chr(156) => 'S',chr(197).chr(157) => 's',\n\t\tchr(197).chr(158) => 'S',chr(197).chr(159) => 's',\n\t\tchr(197).chr(160) => 'S', chr(197).chr(161) => 's',\n\t\tchr(197).chr(162) => 'T', chr(197).chr(163) => 't',\n\t\tchr(197).chr(164) => 'T', chr(197).chr(165) => 't',\n\t\tchr(197).chr(166) => 'T', chr(197).chr(167) => 't',\n\t\tchr(197).chr(168) => 'U', chr(197).chr(169) => 'u',\n\t\tchr(197).chr(170) => 'U', chr(197).chr(171) => 'u',\n\t\tchr(197).chr(172) => 'U', chr(197).chr(173) => 'u',\n\t\tchr(197).chr(174) => 'U', chr(197).chr(175) => 'u',\n\t\tchr(197).chr(176) => 'U', chr(197).chr(177) => 'u',\n\t\tchr(197).chr(178) => 'U', chr(197).chr(179) => 'u',\n\t\tchr(197).chr(180) => 'W', chr(197).chr(181) => 'w',\n\t\tchr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',\n\t\tchr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',\n\t\tchr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',\n\t\tchr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',\n\t\tchr(197).chr(190) => 'z', chr(197).chr(191) => 's',\n\t\t// Decompositions for Latin Extended-B\n\t\tchr(200).chr(152) => 'S', chr(200).chr(153) => 's',\n\t\tchr(200).chr(154) => 'T', chr(200).chr(155) => 't',\n\t\t// Euro Sign\n\t\tchr(226).chr(130).chr(172) => 'E',\n\t\t// GBP (Pound) Sign\n\t\tchr(194).chr(163) => '',\n\t\t// Vowels with diacritic (Vietnamese)\n\t\t// unmarked\n\t\tchr(198).chr(160) => 'O', chr(198).chr(161) => 'o',\n\t\tchr(198).chr(175) => 'U', chr(198).chr(176) => 'u',\n\t\t// grave accent\n\t\tchr(225).chr(186).chr(166) => 'A', chr(225).chr(186).chr(167) => 'a',\n\t\tchr(225).chr(186).chr(176) => 'A', chr(225).chr(186).chr(177) => 'a',\n\t\tchr(225).chr(187).chr(128) => 'E', chr(225).chr(187).chr(129) => 'e',\n\t\tchr(225).chr(187).chr(146) => 'O', chr(225).chr(187).chr(147) => 'o',\n\t\tchr(225).chr(187).chr(156) => 'O', chr(225).chr(187).chr(157) => 'o',\n\t\tchr(225).chr(187).chr(170) => 'U', chr(225).chr(187).chr(171) => 'u',\n\t\tchr(225).chr(187).chr(178) => 'Y', chr(225).chr(187).chr(179) => 'y',\n\t\t// hook\n\t\tchr(225).chr(186).chr(162) => 'A', chr(225).chr(186).chr(163) => 'a',\n\t\tchr(225).chr(186).chr(168) => 'A', chr(225).chr(186).chr(169) => 'a',\n\t\tchr(225).chr(186).chr(178) => 'A', chr(225).chr(186).chr(179) => 'a',\n\t\tchr(225).chr(186).chr(186) => 'E', chr(225).chr(186).chr(187) => 'e',\n\t\tchr(225).chr(187).chr(130) => 'E', chr(225).chr(187).chr(131) => 'e',\n\t\tchr(225).chr(187).chr(136) => 'I', chr(225).chr(187).chr(137) => 'i',\n\t\tchr(225).chr(187).chr(142) => 'O', chr(225).chr(187).chr(143) => 'o',\n\t\tchr(225).chr(187).chr(148) => 'O', chr(225).chr(187).chr(149) => 'o',\n\t\tchr(225).chr(187).chr(158) => 'O', chr(225).chr(187).chr(159) => 'o',\n\t\tchr(225).chr(187).chr(166) => 'U', chr(225).chr(187).chr(167) => 'u',\n\t\tchr(225).chr(187).chr(172) => 'U', chr(225).chr(187).chr(173) => 'u',\n\t\tchr(225).chr(187).chr(182) => 'Y', chr(225).chr(187).chr(183) => 'y',\n\t\t// tilde\n\t\tchr(225).chr(186).chr(170) => 'A', chr(225).chr(186).chr(171) => 'a',\n\t\tchr(225).chr(186).chr(180) => 'A', chr(225).chr(186).chr(181) => 'a',\n\t\tchr(225).chr(186).chr(188) => 'E', chr(225).chr(186).chr(189) => 'e',\n\t\tchr(225).chr(187).chr(132) => 'E', chr(225).chr(187).chr(133) => 'e',\n\t\tchr(225).chr(187).chr(150) => 'O', chr(225).chr(187).chr(151) => 'o',\n\t\tchr(225).chr(187).chr(160) => 'O', chr(225).chr(187).chr(161) => 'o',\n\t\tchr(225).chr(187).chr(174) => 'U', chr(225).chr(187).chr(175) => 'u',\n\t\tchr(225).chr(187).chr(184) => 'Y', chr(225).chr(187).chr(185) => 'y',\n\t\t// acute accent\n\t\tchr(225).chr(186).chr(164) => 'A', chr(225).chr(186).chr(165) => 'a',\n\t\tchr(225).chr(186).chr(174) => 'A', chr(225).chr(186).chr(175) => 'a',\n\t\tchr(225).chr(186).chr(190) => 'E', chr(225).chr(186).chr(191) => 'e',\n\t\tchr(225).chr(187).chr(144) => 'O', chr(225).chr(187).chr(145) => 'o',\n\t\tchr(225).chr(187).chr(154) => 'O', chr(225).chr(187).chr(155) => 'o',\n\t\tchr(225).chr(187).chr(168) => 'U', chr(225).chr(187).chr(169) => 'u',\n\t\t// dot below\n\t\tchr(225).chr(186).chr(160) => 'A', chr(225).chr(186).chr(161) => 'a',\n\t\tchr(225).chr(186).chr(172) => 'A', chr(225).chr(186).chr(173) => 'a',\n\t\tchr(225).chr(186).chr(182) => 'A', chr(225).chr(186).chr(183) => 'a',\n\t\tchr(225).chr(186).chr(184) => 'E', chr(225).chr(186).chr(185) => 'e',\n\t\tchr(225).chr(187).chr(134) => 'E', chr(225).chr(187).chr(135) => 'e',\n\t\tchr(225).chr(187).chr(138) => 'I', chr(225).chr(187).chr(139) => 'i',\n\t\tchr(225).chr(187).chr(140) => 'O', chr(225).chr(187).chr(141) => 'o',\n\t\tchr(225).chr(187).chr(152) => 'O', chr(225).chr(187).chr(153) => 'o',\n\t\tchr(225).chr(187).chr(162) => 'O', chr(225).chr(187).chr(163) => 'o',\n\t\tchr(225).chr(187).chr(164) => 'U', chr(225).chr(187).chr(165) => 'u',\n\t\tchr(225).chr(187).chr(176) => 'U', chr(225).chr(187).chr(177) => 'u',\n\t\tchr(225).chr(187).chr(180) => 'Y', chr(225).chr(187).chr(181) => 'y',\n\t\t// Vowels with diacritic (Chinese, Hanyu Pinyin)\n\t\tchr(201).chr(145) => 'a',\n\t\t// macron\n\t\tchr(199).chr(149) => 'U', chr(199).chr(150) => 'u',\n\t\t// acute accent\n\t\tchr(199).chr(151) => 'U', chr(199).chr(152) => 'u',\n\t\t// caron\n\t\tchr(199).chr(141) => 'A', chr(199).chr(142) => 'a',\n\t\tchr(199).chr(143) => 'I', chr(199).chr(144) => 'i',\n\t\tchr(199).chr(145) => 'O', chr(199).chr(146) => 'o',\n\t\tchr(199).chr(147) => 'U', chr(199).chr(148) => 'u',\n\t\tchr(199).chr(153) => 'U', chr(199).chr(154) => 'u',\n\t\t// grave accent\n\t\tchr(199).chr(155) => 'U', chr(199).chr(156) => 'u',\n\t\t);\n\n\t\t// Used for locale-specific rules\n\t\t$locale = get_locale();\n\n\t\tif ( 'de_DE' == $locale || 'de_DE_formal' == $locale ) {\n\t\t\t$chars[ chr(195).chr(132) ] = 'Ae';\n\t\t\t$chars[ chr(195).chr(164) ] = 'ae';\n\t\t\t$chars[ chr(195).chr(150) ] = 'Oe';\n\t\t\t$chars[ chr(195).chr(182) ] = 'oe';\n\t\t\t$chars[ chr(195).chr(156) ] = 'Ue';\n\t\t\t$chars[ chr(195).chr(188) ] = 'ue';\n\t\t\t$chars[ chr(195).chr(159) ] = 'ss';\n\t\t} elseif ( 'da_DK' === $locale ) {\n\t\t\t$chars[ chr(195).chr(134) ] = 'Ae';\n \t\t\t$chars[ chr(195).chr(166) ] = 'ae';\n\t\t\t$chars[ chr(195).chr(152) ] = 'Oe';\n\t\t\t$chars[ chr(195).chr(184) ] = 'oe';\n\t\t\t$chars[ chr(195).chr(133) ] = 'Aa';\n\t\t\t$chars[ chr(195).chr(165) ] = 'aa';\n\t\t}\n\n\t\t$string = strtr($string, $chars);\n\t} else {\n\t\t$chars = array();\n\t\t// Assume ISO-8859-1 if not UTF-8\n\t\t$chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)\n\t\t\t.chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)\n\t\t\t.chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)\n\t\t\t.chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)\n\t\t\t.chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)\n\t\t\t.chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)\n\t\t\t.chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)\n\t\t\t.chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)\n\t\t\t.chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)\n\t\t\t.chr(252).chr(253).chr(255);\n\n\t\t$chars['out'] = \"EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy\";\n\n\t\t$string = strtr($string, $chars['in'], $chars['out']);\n\t\t$double_chars = array();\n\t\t$double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));\n\t\t$double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');\n\t\t$string = str_replace($double_chars['in'], $double_chars['out'], $string);\n\t}\n\n\treturn $string;\n}\n\n/**\n * Sanitizes a filename, replacing whitespace with dashes.\n *\n * Removes special characters that are illegal in filenames on certain\n * operating systems and special characters requiring special escaping\n * to manipulate at the command line. Replaces spaces and consecutive\n * dashes with a single dash. Trims period, dash and underscore from beginning\n * and end of filename.\n *\n * @since 2.1.0\n *\n * @param string $filename The filename to be sanitized\n * @return string The sanitized filename\n */\nfunction sanitize_file_name( $filename ) {\n\t$filename_raw = $filename;\n\t$special_chars = array(\"?\", \"[\", \"]\", \"/\", \"\\\\\", \"=\", \"<\", \">\", \":\", \";\", \",\", \"'\", \"\\\"\", \"&\", \"$\", \"#\", \"*\", \"(\", \")\", \"|\", \"~\", \"`\", \"!\", \"{\", \"}\", \"%\", \"+\", chr(0));\n\t/**\n\t * Filter the list of characters to remove from a filename.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array  $special_chars Characters to remove.\n\t * @param string $filename_raw  Filename as it was passed into sanitize_file_name().\n\t */\n\t$special_chars = apply_filters( 'sanitize_file_name_chars', $special_chars, $filename_raw );\n\t$filename = preg_replace( \"#\\x{00a0}#siu\", ' ', $filename );\n\t$filename = str_replace( $special_chars, '', $filename );\n\t$filename = str_replace( array( '%20', '+' ), '-', $filename );\n\t$filename = preg_replace( '/[\\r\\n\\t -]+/', '-', $filename );\n\t$filename = trim( $filename, '.-_' );\n\n\t// Split the filename into a base and extension[s]\n\t$parts = explode('.', $filename);\n\n\t// Return if only one extension\n\tif ( count( $parts ) <= 2 ) {\n\t\t/**\n\t\t * Filter a sanitized filename string.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param string $filename     Sanitized filename.\n\t\t * @param string $filename_raw The filename prior to sanitization.\n\t\t */\n\t\treturn apply_filters( 'sanitize_file_name', $filename, $filename_raw );\n\t}\n\n\t// Process multiple extensions\n\t$filename = array_shift($parts);\n\t$extension = array_pop($parts);\n\t$mimes = get_allowed_mime_types();\n\n\t/*\n\t * Loop over any intermediate extensions. Postfix them with a trailing underscore\n\t * if they are a 2 - 5 character long alpha string not in the extension whitelist.\n\t */\n\tforeach ( (array) $parts as $part) {\n\t\t$filename .= '.' . $part;\n\n\t\tif ( preg_match(\"/^[a-zA-Z]{2,5}\\d?$/\", $part) ) {\n\t\t\t$allowed = false;\n\t\t\tforeach ( $mimes as $ext_preg => $mime_match ) {\n\t\t\t\t$ext_preg = '!^(' . $ext_preg . ')$!i';\n\t\t\t\tif ( preg_match( $ext_preg, $part ) ) {\n\t\t\t\t\t$allowed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !$allowed )\n\t\t\t\t$filename .= '_';\n\t\t}\n\t}\n\t$filename .= '.' . $extension;\n\t/** This filter is documented in wp-includes/formatting.php */\n\treturn apply_filters('sanitize_file_name', $filename, $filename_raw);\n}\n\n/**\n * Sanitizes a username, stripping out unsafe characters.\n *\n * Removes tags, octets, entities, and if strict is enabled, will only keep\n * alphanumeric, _, space, ., -, @. After sanitizing, it passes the username,\n * raw username (the username in the parameter), and the value of $strict as\n * parameters for the 'sanitize_user' filter.\n *\n * @since 2.0.0\n *\n * @param string $username The username to be sanitized.\n * @param bool   $strict   If set limits $username to specific characters. Default false.\n * @return string The sanitized username, after passing through filters.\n */\nfunction sanitize_user( $username, $strict = false ) {\n\t$raw_username = $username;\n\t$username = wp_strip_all_tags( $username );\n\t$username = remove_accents( $username );\n\t// Kill octets\n\t$username = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '', $username );\n\t$username = preg_replace( '/&.+?;/', '', $username ); // Kill entities\n\n\t// If strict, reduce to ASCII for max portability.\n\tif ( $strict )\n\t\t$username = preg_replace( '|[^a-z0-9 _.\\-@]|i', '', $username );\n\n\t$username = trim( $username );\n\t// Consolidate contiguous whitespace\n\t$username = preg_replace( '|\\s+|', ' ', $username );\n\n\t/**\n\t * Filter a sanitized username string.\n\t *\n\t * @since 2.0.1\n\t *\n\t * @param string $username     Sanitized username.\n\t * @param string $raw_username The username prior to sanitization.\n\t * @param bool   $strict       Whether to limit the sanitization to specific characters. Default false.\n\t */\n\treturn apply_filters( 'sanitize_user', $username, $raw_username, $strict );\n}\n\n/**\n * Sanitizes a string key.\n *\n * Keys are used as internal identifiers. Lowercase alphanumeric characters, dashes and underscores are allowed.\n *\n * @since 3.0.0\n *\n * @param string $key String key\n * @return string Sanitized key\n */\nfunction sanitize_key( $key ) {\n\t$raw_key = $key;\n\t$key = strtolower( $key );\n\t$key = preg_replace( '/[^a-z0-9_\\-]/', '', $key );\n\n\t/**\n\t * Filter a sanitized key string.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $key     Sanitized key.\n\t * @param string $raw_key The key prior to sanitization.\n\t */\n\treturn apply_filters( 'sanitize_key', $key, $raw_key );\n}\n\n/**\n * Sanitizes a title, or returns a fallback title.\n *\n * Specifically, HTML and PHP tags are stripped. Further actions can be added\n * via the plugin API. If $title is empty and $fallback_title is set, the latter\n * will be used.\n *\n * @since 1.0.0\n *\n * @param string $title          The string to be sanitized.\n * @param string $fallback_title Optional. A title to use if $title is empty.\n * @param string $context        Optional. The operation for which the string is sanitized\n * @return string The sanitized string.\n */\nfunction sanitize_title( $title, $fallback_title = '', $context = 'save' ) {\n\t$raw_title = $title;\n\n\tif ( 'save' == $context )\n\t\t$title = remove_accents($title);\n\n\t/**\n\t * Filter a sanitized title string.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param string $title     Sanitized title.\n\t * @param string $raw_title The title prior to sanitization.\n\t * @param string $context   The context for which the title is being sanitized.\n\t */\n\t$title = apply_filters( 'sanitize_title', $title, $raw_title, $context );\n\n\tif ( '' === $title || false === $title )\n\t\t$title = $fallback_title;\n\n\treturn $title;\n}\n\n/**\n * Sanitizes a title with the 'query' context.\n *\n * Used for querying the database for a value from URL.\n *\n * @since 3.1.0\n *\n * @param string $title The string to be sanitized.\n * @return string The sanitized string.\n */\nfunction sanitize_title_for_query( $title ) {\n\treturn sanitize_title( $title, '', 'query' );\n}\n\n/**\n * Sanitizes a title, replacing whitespace and a few other characters with dashes.\n *\n * Limits the output to alphanumeric characters, underscore (_) and dash (-).\n * Whitespace becomes a dash.\n *\n * @since 1.2.0\n *\n * @param string $title     The title to be sanitized.\n * @param string $raw_title Optional. Not used.\n * @param string $context   Optional. The operation for which the string is sanitized.\n * @return string The sanitized title.\n */\nfunction sanitize_title_with_dashes( $title, $raw_title = '', $context = 'display' ) {\n\t$title = strip_tags($title);\n\t// Preserve escaped octets.\n\t$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);\n\t// Remove percent signs that are not part of an octet.\n\t$title = str_replace('%', '', $title);\n\t// Restore octets.\n\t$title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);\n\n\tif (seems_utf8($title)) {\n\t\tif (function_exists('mb_strtolower')) {\n\t\t\t$title = mb_strtolower($title, 'UTF-8');\n\t\t}\n\t\t$title = utf8_uri_encode($title, 200);\n\t}\n\n\t$title = strtolower($title);\n\t$title = preg_replace('/&.+?;/', '', $title); // kill entities\n\t$title = str_replace('.', '-', $title);\n\n\tif ( 'save' == $context ) {\n\t\t// Convert nbsp, ndash and mdash to hyphens\n\t\t$title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );\n\n\t\t// Strip these characters entirely\n\t\t$title = str_replace( array(\n\t\t\t// iexcl and iquest\n\t\t\t'%c2%a1', '%c2%bf',\n\t\t\t// angle quotes\n\t\t\t'%c2%ab', '%c2%bb', '%e2%80%b9', '%e2%80%ba',\n\t\t\t// curly quotes\n\t\t\t'%e2%80%98', '%e2%80%99', '%e2%80%9c', '%e2%80%9d',\n\t\t\t'%e2%80%9a', '%e2%80%9b', '%e2%80%9e', '%e2%80%9f',\n\t\t\t// copy, reg, deg, hellip and trade\n\t\t\t'%c2%a9', '%c2%ae', '%c2%b0', '%e2%80%a6', '%e2%84%a2',\n\t\t\t// acute accents\n\t\t\t'%c2%b4', '%cb%8a', '%cc%81', '%cd%81',\n\t\t\t// grave accent, macron, caron\n\t\t\t'%cc%80', '%cc%84', '%cc%8c',\n\t\t), '', $title );\n\n\t\t// Convert times to x\n\t\t$title = str_replace( '%c3%97', 'x', $title );\n\t}\n\n\t$title = preg_replace('/[^%a-z0-9 _-]/', '', $title);\n\t$title = preg_replace('/\\s+/', '-', $title);\n\t$title = preg_replace('|-+|', '-', $title);\n\t$title = trim($title, '-');\n\n\treturn $title;\n}\n\n/**\n * Ensures a string is a valid SQL 'order by' clause.\n *\n * Accepts one or more columns, with or without a sort order (ASC / DESC).\n * e.g. 'column_1', 'column_1, column_2', 'column_1 ASC, column_2 DESC' etc.\n *\n * Also accepts 'RAND()'.\n *\n * @since 2.5.1\n *\n * @param string $orderby Order by clause to be validated.\n * @return string|false Returns $orderby if valid, false otherwise.\n */\nfunction sanitize_sql_orderby( $orderby ) {\n\tif ( preg_match( '/^\\s*(([a-z0-9_]+|`[a-z0-9_]+`)(\\s+(ASC|DESC))?\\s*(,\\s*(?=[a-z0-9_`])|$))+$/i', $orderby ) || preg_match( '/^\\s*RAND\\(\\s*\\)\\s*$/i', $orderby ) ) {\n\t\treturn $orderby;\n\t}\n\treturn false;\n}\n\n/**\n * Sanitizes an HTML classname to ensure it only contains valid characters.\n *\n * Strips the string down to A-Z,a-z,0-9,_,-. If this results in an empty\n * string then it will return the alternative value supplied.\n *\n * @todo Expand to support the full range of CDATA that a class attribute can contain.\n *\n * @since 2.8.0\n *\n * @param string $class    The classname to be sanitized\n * @param string $fallback Optional. The value to return if the sanitization ends up as an empty string.\n * \tDefaults to an empty string.\n * @return string The sanitized value\n */\nfunction sanitize_html_class( $class, $fallback = '' ) {\n\t//Strip out any % encoded octets\n\t$sanitized = preg_replace( '|%[a-fA-F0-9][a-fA-F0-9]|', '', $class );\n\n\t//Limit to A-Z,a-z,0-9,_,-\n\t$sanitized = preg_replace( '/[^A-Za-z0-9_-]/', '', $sanitized );\n\n\tif ( '' == $sanitized && $fallback ) {\n\t\treturn sanitize_html_class( $fallback );\n\t}\n\t/**\n\t * Filter a sanitized HTML class string.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $sanitized The sanitized HTML class.\n\t * @param string $class     HTML class before sanitization.\n\t * @param string $fallback  The fallback string.\n\t */\n\treturn apply_filters( 'sanitize_html_class', $sanitized, $class, $fallback );\n}\n\n/**\n * Converts lone & characters into `&#038;` (a.k.a. `&amp;`)\n *\n * @since 0.71\n *\n * @param string $content    String of characters to be converted.\n * @param string $deprecated Not used.\n * @return string Converted string.\n */\nfunction convert_chars( $content, $deprecated = '' ) {\n\tif ( ! empty( $deprecated ) ) {\n\t\t_deprecated_argument( __FUNCTION__, '0.71' );\n\t}\n\n\tif ( strpos( $content, '&' ) !== false ) {\n\t\t$content = preg_replace( '/&([^#])(?![a-z1-4]{1,8};)/i', '&#038;$1', $content );\n\t}\n\n\treturn $content;\n}\n\n/**\n * Converts invalid Unicode references range to valid range.\n *\n * @since 4.3.0\n *\n * @param string $content String with entities that need converting.\n * @return string Converted string.\n */\nfunction convert_invalid_entities( $content ) {\n\t$wp_htmltranswinuni = array(\n\t\t'&#128;' => '&#8364;', // the Euro sign\n\t\t'&#129;' => '',\n\t\t'&#130;' => '&#8218;', // these are Windows CP1252 specific characters\n\t\t'&#131;' => '&#402;',  // they would look weird on non-Windows browsers\n\t\t'&#132;' => '&#8222;',\n\t\t'&#133;' => '&#8230;',\n\t\t'&#134;' => '&#8224;',\n\t\t'&#135;' => '&#8225;',\n\t\t'&#136;' => '&#710;',\n\t\t'&#137;' => '&#8240;',\n\t\t'&#138;' => '&#352;',\n\t\t'&#139;' => '&#8249;',\n\t\t'&#140;' => '&#338;',\n\t\t'&#141;' => '',\n\t\t'&#142;' => '&#381;',\n\t\t'&#143;' => '',\n\t\t'&#144;' => '',\n\t\t'&#145;' => '&#8216;',\n\t\t'&#146;' => '&#8217;',\n\t\t'&#147;' => '&#8220;',\n\t\t'&#148;' => '&#8221;',\n\t\t'&#149;' => '&#8226;',\n\t\t'&#150;' => '&#8211;',\n\t\t'&#151;' => '&#8212;',\n\t\t'&#152;' => '&#732;',\n\t\t'&#153;' => '&#8482;',\n\t\t'&#154;' => '&#353;',\n\t\t'&#155;' => '&#8250;',\n\t\t'&#156;' => '&#339;',\n\t\t'&#157;' => '',\n\t\t'&#158;' => '&#382;',\n\t\t'&#159;' => '&#376;'\n\t);\n\n\tif ( strpos( $content, '&#1' ) !== false ) {\n\t\t$content = strtr( $content, $wp_htmltranswinuni );\n\t}\n\n\treturn $content;\n}\n\n/**\n * Balances tags if forced to, or if the 'use_balanceTags' option is set to true.\n *\n * @since 0.71\n *\n * @param string $text  Text to be balanced\n * @param bool   $force If true, forces balancing, ignoring the value of the option. Default false.\n * @return string Balanced text\n */\nfunction balanceTags( $text, $force = false ) {\n\tif ( $force || get_option('use_balanceTags') == 1 ) {\n\t\treturn force_balance_tags( $text );\n\t} else {\n\t\treturn $text;\n\t}\n}\n\n/**\n * Balances tags of string using a modified stack.\n *\n * @since 2.0.4\n *\n * @author Leonard Lin <leonard@acm.org>\n * @license GPL\n * @copyright November 4, 2001\n * @version 1.1\n * @todo Make better - change loop condition to $text in 1.2\n * @internal Modified by Scott Reilly (coffee2code) 02 Aug 2004\n *\t\t1.1  Fixed handling of append/stack pop order of end text\n *\t\t\t Added Cleaning Hooks\n *\t\t1.0  First Version\n *\n * @param string $text Text to be balanced.\n * @return string Balanced text.\n */\nfunction force_balance_tags( $text ) {\n\t$tagstack = array();\n\t$stacksize = 0;\n\t$tagqueue = '';\n\t$newtext = '';\n\t// Known single-entity/self-closing tags\n\t$single_tags = array( 'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param', 'source' );\n\t// Tags that can be immediately nested within themselves\n\t$nestable_tags = array( 'blockquote', 'div', 'object', 'q', 'span' );\n\n\t// WP bug fix for comments - in case you REALLY meant to type '< !--'\n\t$text = str_replace('< !--', '<    !--', $text);\n\t// WP bug fix for LOVE <3 (and other situations with '<' before a number)\n\t$text = preg_replace('#<([0-9]{1})#', '&lt;$1', $text);\n\n\twhile ( preg_match(\"/<(\\/?[\\w:]*)\\s*([^>]*)>/\", $text, $regex) ) {\n\t\t$newtext .= $tagqueue;\n\n\t\t$i = strpos($text, $regex[0]);\n\t\t$l = strlen($regex[0]);\n\n\t\t// clear the shifter\n\t\t$tagqueue = '';\n\t\t// Pop or Push\n\t\tif ( isset($regex[1][0]) && '/' == $regex[1][0] ) { // End Tag\n\t\t\t$tag = strtolower(substr($regex[1],1));\n\t\t\t// if too many closing tags\n\t\t\tif ( $stacksize <= 0 ) {\n\t\t\t\t$tag = '';\n\t\t\t\t// or close to be safe $tag = '/' . $tag;\n\t\t\t}\n\t\t\t// if stacktop value = tag close value then pop\n\t\t\telseif ( $tagstack[$stacksize - 1] == $tag ) { // found closing tag\n\t\t\t\t$tag = '</' . $tag . '>'; // Close Tag\n\t\t\t\t// Pop\n\t\t\t\tarray_pop( $tagstack );\n\t\t\t\t$stacksize--;\n\t\t\t} else { // closing tag not at top, search for it\n\t\t\t\tfor ( $j = $stacksize-1; $j >= 0; $j-- ) {\n\t\t\t\t\tif ( $tagstack[$j] == $tag ) {\n\t\t\t\t\t// add tag to tagqueue\n\t\t\t\t\t\tfor ( $k = $stacksize-1; $k >= $j; $k--) {\n\t\t\t\t\t\t\t$tagqueue .= '</' . array_pop( $tagstack ) . '>';\n\t\t\t\t\t\t\t$stacksize--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$tag = '';\n\t\t\t}\n\t\t} else { // Begin Tag\n\t\t\t$tag = strtolower($regex[1]);\n\n\t\t\t// Tag Cleaning\n\n\t\t\t// If it's an empty tag \"< >\", do nothing\n\t\t\tif ( '' == $tag ) {\n\t\t\t\t// do nothing\n\t\t\t}\n\t\t\t// ElseIf it presents itself as a self-closing tag...\n\t\t\telseif ( substr( $regex[2], -1 ) == '/' ) {\n\t\t\t\t// ...but it isn't a known single-entity self-closing tag, then don't let it be treated as such and\n\t\t\t\t// immediately close it with a closing tag (the tag will encapsulate no text as a result)\n\t\t\t\tif ( ! in_array( $tag, $single_tags ) )\n\t\t\t\t\t$regex[2] = trim( substr( $regex[2], 0, -1 ) ) . \"></$tag\";\n\t\t\t}\n\t\t\t// ElseIf it's a known single-entity tag but it doesn't close itself, do so\n\t\t\telseif ( in_array($tag, $single_tags) ) {\n\t\t\t\t$regex[2] .= '/';\n\t\t\t}\n\t\t\t// Else it's not a single-entity tag\n\t\t\telse {\n\t\t\t\t// If the top of the stack is the same as the tag we want to push, close previous tag\n\t\t\t\tif ( $stacksize > 0 && !in_array($tag, $nestable_tags) && $tagstack[$stacksize - 1] == $tag ) {\n\t\t\t\t\t$tagqueue = '</' . array_pop( $tagstack ) . '>';\n\t\t\t\t\t$stacksize--;\n\t\t\t\t}\n\t\t\t\t$stacksize = array_push( $tagstack, $tag );\n\t\t\t}\n\n\t\t\t// Attributes\n\t\t\t$attributes = $regex[2];\n\t\t\tif ( ! empty( $attributes ) && $attributes[0] != '>' )\n\t\t\t\t$attributes = ' ' . $attributes;\n\n\t\t\t$tag = '<' . $tag . $attributes . '>';\n\t\t\t//If already queuing a close tag, then put this tag on, too\n\t\t\tif ( !empty($tagqueue) ) {\n\t\t\t\t$tagqueue .= $tag;\n\t\t\t\t$tag = '';\n\t\t\t}\n\t\t}\n\t\t$newtext .= substr($text, 0, $i) . $tag;\n\t\t$text = substr($text, $i + $l);\n\t}\n\n\t// Clear Tag Queue\n\t$newtext .= $tagqueue;\n\n\t// Add Remaining text\n\t$newtext .= $text;\n\n\t// Empty Stack\n\twhile( $x = array_pop($tagstack) )\n\t\t$newtext .= '</' . $x . '>'; // Add remaining tags to close\n\n\t// WP fix for the bug with HTML comments\n\t$newtext = str_replace(\"< !--\",\"<!--\",$newtext);\n\t$newtext = str_replace(\"<    !--\",\"< !--\",$newtext);\n\n\treturn $newtext;\n}\n\n/**\n * Acts on text which is about to be edited.\n *\n * The $content is run through esc_textarea(), which uses htmlspecialchars()\n * to convert special characters to HTML entities. If $richedit is set to true,\n * it is simply a holder for the 'format_to_edit' filter.\n *\n * @since 0.71\n * @since 4.4.0 The `$richedit` parameter was renamed to `$rich_text` for clarity.\n *\n * @param string $content   The text about to be edited.\n * @param bool   $rich_text Optional. Whether `$content` should be considered rich text,\n *                          in which case it would not be passed through esc_textarea().\n *                          Default false.\n * @return string The text after the filter (and possibly htmlspecialchars()) has been run.\n */\nfunction format_to_edit( $content, $rich_text = false ) {\n\t/**\n\t * Filter the text to be formatted for editing.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param string $content The text, prior to formatting for editing.\n\t */\n\t$content = apply_filters( 'format_to_edit', $content );\n\tif ( ! $rich_text )\n\t\t$content = esc_textarea( $content );\n\treturn $content;\n}\n\n/**\n * Add leading zeros when necessary.\n *\n * If you set the threshold to '4' and the number is '10', then you will get\n * back '0010'. If you set the threshold to '4' and the number is '5000', then you\n * will get back '5000'.\n *\n * Uses sprintf to append the amount of zeros based on the $threshold parameter\n * and the size of the number. If the number is large enough, then no zeros will\n * be appended.\n *\n * @since 0.71\n *\n * @param int $number     Number to append zeros to if not greater than threshold.\n * @param int $threshold  Digit places number needs to be to not have zeros added.\n * @return string Adds leading zeros to number if needed.\n */\nfunction zeroise( $number, $threshold ) {\n\treturn sprintf( '%0' . $threshold . 's', $number );\n}\n\n/**\n * Adds backslashes before letters and before a number at the start of a string.\n *\n * @since 0.71\n *\n * @param string $string Value to which backslashes will be added.\n * @return string String with backslashes inserted.\n */\nfunction backslashit( $string ) {\n\tif ( isset( $string[0] ) && $string[0] >= '0' && $string[0] <= '9' )\n\t\t$string = '\\\\\\\\' . $string;\n\treturn addcslashes( $string, 'A..Za..z' );\n}\n\n/**\n * Appends a trailing slash.\n *\n * Will remove trailing forward and backslashes if it exists already before adding\n * a trailing forward slash. This prevents double slashing a string or path.\n *\n * The primary use of this is for paths and thus should be used for paths. It is\n * not restricted to paths and offers no specific path support.\n *\n * @since 1.2.0\n *\n * @param string $string What to add the trailing slash to.\n * @return string String with trailing slash added.\n */\nfunction trailingslashit( $string ) {\n\treturn untrailingslashit( $string ) . '/';\n}\n\n/**\n * Removes trailing forward slashes and backslashes if they exist.\n *\n * The primary use of this is for paths and thus should be used for paths. It is\n * not restricted to paths and offers no specific path support.\n *\n * @since 2.2.0\n *\n * @param string $string What to remove the trailing slashes from.\n * @return string String without the trailing slashes.\n */\nfunction untrailingslashit( $string ) {\n\treturn rtrim( $string, '/\\\\' );\n}\n\n/**\n * Adds slashes to escape strings.\n *\n * Slashes will first be removed if magic_quotes_gpc is set, see {@link\n * http://www.php.net/magic_quotes} for more details.\n *\n * @since 0.71\n *\n * @param string $gpc The string returned from HTTP request data.\n * @return string Returns a string escaped with slashes.\n */\nfunction addslashes_gpc($gpc) {\n\tif ( get_magic_quotes_gpc() )\n\t\t$gpc = stripslashes($gpc);\n\n\treturn wp_slash($gpc);\n}\n\n/**\n * Navigates through an array, object, or scalar, and removes slashes from the values.\n *\n * @since 2.0.0\n *\n * @param mixed $value The value to be stripped.\n * @return mixed Stripped value.\n */\nfunction stripslashes_deep( $value ) {\n\treturn map_deep( $value, 'stripslashes_from_strings_only' );\n}\n\n/**\n * Callback function for `stripslashes_deep()` which strips slashes from strings.\n *\n * @since 4.4.0\n *\n * @param mixed $value The array or string to be stripped.\n * @return mixed $value The stripped value.\n */\nfunction stripslashes_from_strings_only( $value ) {\n\treturn is_string( $value ) ? stripslashes( $value ) : $value;\n}\n\n/**\n * Navigates through an array, object, or scalar, and encodes the values to be used in a URL.\n *\n * @since 2.2.0\n *\n * @param mixed $value The array or string to be encoded.\n * @return mixed $value The encoded value.\n */\nfunction urlencode_deep( $value ) {\n\treturn map_deep( $value, 'urlencode' );\n}\n\n/**\n * Navigates through an array, object, or scalar, and raw-encodes the values to be used in a URL.\n *\n * @since 3.4.0\n *\n * @param mixed $value The array or string to be encoded.\n * @return mixed $value The encoded value.\n */\nfunction rawurlencode_deep( $value ) {\n\treturn map_deep( $value, 'rawurlencode' );\n}\n\n/**\n * Navigates through an array, object, or scalar, and decodes URL-encoded values\n *\n * @since 4.4.0\n *\n * @param mixed $value The array or string to be decoded.\n * @return mixed $value The decoded value.\n */\nfunction urldecode_deep( $value ) {\n\treturn map_deep( $value, 'urldecode' );\n}\n\n/**\n * Converts email addresses characters to HTML entities to block spam bots.\n *\n * @since 0.71\n *\n * @param string $email_address Email address.\n * @param int    $hex_encoding  Optional. Set to 1 to enable hex encoding.\n * @return string Converted email address.\n */\nfunction antispambot( $email_address, $hex_encoding = 0 ) {\n\t$email_no_spam_address = '';\n\tfor ( $i = 0, $len = strlen( $email_address ); $i < $len; $i++ ) {\n\t\t$j = rand( 0, 1 + $hex_encoding );\n\t\tif ( $j == 0 ) {\n\t\t\t$email_no_spam_address .= '&#' . ord( $email_address[$i] ) . ';';\n\t\t} elseif ( $j == 1 ) {\n\t\t\t$email_no_spam_address .= $email_address[$i];\n\t\t} elseif ( $j == 2 ) {\n\t\t\t$email_no_spam_address .= '%' . zeroise( dechex( ord( $email_address[$i] ) ), 2 );\n\t\t}\n\t}\n\n\treturn str_replace( '@', '&#64;', $email_no_spam_address );\n}\n\n/**\n * Callback to convert URI match to HTML A element.\n *\n * This function was backported from 2.5.0 to 2.3.2. Regex callback for {@link\n * make_clickable()}.\n *\n * @since 2.3.2\n * @access private\n *\n * @param array $matches Single Regex Match.\n * @return string HTML A element with URI address.\n */\nfunction _make_url_clickable_cb( $matches ) {\n\t$url = $matches[2];\n\n\tif ( ')' == $matches[3] && strpos( $url, '(' ) ) {\n\t\t// If the trailing character is a closing parethesis, and the URL has an opening parenthesis in it, add the closing parenthesis to the URL.\n\t\t// Then we can let the parenthesis balancer do its thing below.\n\t\t$url .= $matches[3];\n\t\t$suffix = '';\n\t} else {\n\t\t$suffix = $matches[3];\n\t}\n\n\t// Include parentheses in the URL only if paired\n\twhile ( substr_count( $url, '(' ) < substr_count( $url, ')' ) ) {\n\t\t$suffix = strrchr( $url, ')' ) . $suffix;\n\t\t$url = substr( $url, 0, strrpos( $url, ')' ) );\n\t}\n\n\t$url = esc_url($url);\n\tif ( empty($url) )\n\t\treturn $matches[0];\n\n\treturn $matches[1] . \"<a href=\\\"$url\\\" rel=\\\"nofollow\\\">$url</a>\" . $suffix;\n}\n\n/**\n * Callback to convert URL match to HTML A element.\n *\n * This function was backported from 2.5.0 to 2.3.2. Regex callback for {@link\n * make_clickable()}.\n *\n * @since 2.3.2\n * @access private\n *\n * @param array $matches Single Regex Match.\n * @return string HTML A element with URL address.\n */\nfunction _make_web_ftp_clickable_cb( $matches ) {\n\t$ret = '';\n\t$dest = $matches[2];\n\t$dest = 'http://' . $dest;\n\n\t// removed trailing [.,;:)] from URL\n\tif ( in_array( substr($dest, -1), array('.', ',', ';', ':', ')') ) === true ) {\n\t\t$ret = substr($dest, -1);\n\t\t$dest = substr($dest, 0, strlen($dest)-1);\n\t}\n\n\t$dest = esc_url($dest);\n\tif ( empty($dest) )\n\t\treturn $matches[0];\n\n\treturn $matches[1] . \"<a href=\\\"$dest\\\" rel=\\\"nofollow\\\">$dest</a>$ret\";\n}\n\n/**\n * Callback to convert email address match to HTML A element.\n *\n * This function was backported from 2.5.0 to 2.3.2. Regex callback for {@link\n * make_clickable()}.\n *\n * @since 2.3.2\n * @access private\n *\n * @param array $matches Single Regex Match.\n * @return string HTML A element with email address.\n */\nfunction _make_email_clickable_cb( $matches ) {\n\t$email = $matches[2] . '@' . $matches[3];\n\treturn $matches[1] . \"<a href=\\\"mailto:$email\\\">$email</a>\";\n}\n\n/**\n * Convert plaintext URI to HTML links.\n *\n * Converts URI, www and ftp, and email addresses. Finishes by fixing links\n * within links.\n *\n * @since 0.71\n *\n * @param string $text Content to convert URIs.\n * @return string Content with converted URIs.\n */\nfunction make_clickable( $text ) {\n\t$r = '';\n\t$textarr = preg_split( '/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // split out HTML tags\n\t$nested_code_pre = 0; // Keep track of how many levels link is nested inside <pre> or <code>\n\tforeach ( $textarr as $piece ) {\n\n\t\tif ( preg_match( '|^<code[\\s>]|i', $piece ) || preg_match( '|^<pre[\\s>]|i', $piece ) )\n\t\t\t$nested_code_pre++;\n\t\telseif ( ( '</code>' === strtolower( $piece ) || '</pre>' === strtolower( $piece ) ) && $nested_code_pre )\n\t\t\t$nested_code_pre--;\n\n\t\tif ( $nested_code_pre || empty( $piece ) || ( $piece[0] === '<' && ! preg_match( '|^<\\s*[\\w]{1,20}+://|', $piece ) ) ) {\n\t\t\t$r .= $piece;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Long strings might contain expensive edge cases ...\n\t\tif ( 10000 < strlen( $piece ) ) {\n\t\t\t// ... break it up\n\t\t\tforeach ( _split_str_by_whitespace( $piece, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing paretheses\n\t\t\t\tif ( 2101 < strlen( $chunk ) ) {\n\t\t\t\t\t$r .= $chunk; // Too big, no whitespace: bail.\n\t\t\t\t} else {\n\t\t\t\t\t$r .= make_clickable( $chunk );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t$ret = \" $piece \"; // Pad with whitespace to simplify the regexes\n\n\t\t\t$url_clickable = '~\n\t\t\t\t([\\\\s(<.,;:!?])                                        # 1: Leading whitespace, or punctuation\n\t\t\t\t(                                                      # 2: URL\n\t\t\t\t\t[\\\\w]{1,20}+://                                # Scheme and hier-part prefix\n\t\t\t\t\t(?=\\S{1,2000}\\s)                               # Limit to URLs less than about 2000 characters long\n\t\t\t\t\t[\\\\w\\\\x80-\\\\xff#%\\\\~/@\\\\[\\\\]*(+=&$-]*+         # Non-punctuation URL character\n\t\t\t\t\t(?:                                            # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character\n\t\t\t\t\t\t[\\'.,;:!?)]                            # Punctuation URL character\n\t\t\t\t\t\t[\\\\w\\\\x80-\\\\xff#%\\\\~/@\\\\[\\\\]*(+=&$-]++ # Non-punctuation URL character\n\t\t\t\t\t)*\n\t\t\t\t)\n\t\t\t\t(\\)?)                                                  # 3: Trailing closing parenthesis (for parethesis balancing post processing)\n\t\t\t~xS'; // The regex is a non-anchored pattern and does not have a single fixed starting character.\n\t\t\t      // Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times.\n\n\t\t\t$ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret );\n\n\t\t\t$ret = preg_replace_callback( '#([\\s>])((www|ftp)\\.[\\w\\\\x80-\\\\xff\\#$%&~/.\\-;:=,?@\\[\\]+]+)#is', '_make_web_ftp_clickable_cb', $ret );\n\t\t\t$ret = preg_replace_callback( '#([\\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret );\n\n\t\t\t$ret = substr( $ret, 1, -1 ); // Remove our whitespace padding.\n\t\t\t$r .= $ret;\n\t\t}\n\t}\n\n\t// Cleanup of accidental links within links\n\treturn preg_replace( '#(<a([ \\r\\n\\t]+[^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', \"$1$3</a>\", $r );\n}\n\n/**\n * Breaks a string into chunks by splitting at whitespace characters.\n * The length of each returned chunk is as close to the specified length goal as possible,\n * with the caveat that each chunk includes its trailing delimiter.\n * Chunks longer than the goal are guaranteed to not have any inner whitespace.\n *\n * Joining the returned chunks with empty delimiters reconstructs the input string losslessly.\n *\n * Input string must have no null characters (or eventual transformations on output chunks must not care about null characters)\n *\n *     _split_str_by_whitespace( \"1234 67890 1234 67890a cd 1234   890 123456789 1234567890a    45678   1 3 5 7 90 \", 10 ) ==\n *     array (\n *         0 => '1234 67890 ',  // 11 characters: Perfect split\n *         1 => '1234 ',        //  5 characters: '1234 67890a' was too long\n *         2 => '67890a cd ',   // 10 characters: '67890a cd 1234' was too long\n *         3 => '1234   890 ',  // 11 characters: Perfect split\n *         4 => '123456789 ',   // 10 characters: '123456789 1234567890a' was too long\n *         5 => '1234567890a ', // 12 characters: Too long, but no inner whitespace on which to split\n *         6 => '   45678   ',  // 11 characters: Perfect split\n *         7 => '1 3 5 7 90 ',  // 11 characters: End of $string\n *     );\n *\n * @since 3.4.0\n * @access private\n *\n * @param string $string The string to split.\n * @param int    $goal   The desired chunk length.\n * @return array Numeric array of chunks.\n */\nfunction _split_str_by_whitespace( $string, $goal ) {\n\t$chunks = array();\n\n\t$string_nullspace = strtr( $string, \"\\r\\n\\t\\v\\f \", \"\\000\\000\\000\\000\\000\\000\" );\n\n\twhile ( $goal < strlen( $string_nullspace ) ) {\n\t\t$pos = strrpos( substr( $string_nullspace, 0, $goal + 1 ), \"\\000\" );\n\n\t\tif ( false === $pos ) {\n\t\t\t$pos = strpos( $string_nullspace, \"\\000\", $goal + 1 );\n\t\t\tif ( false === $pos ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$chunks[] = substr( $string, 0, $pos + 1 );\n\t\t$string = substr( $string, $pos + 1 );\n\t\t$string_nullspace = substr( $string_nullspace, $pos + 1 );\n\t}\n\n\tif ( $string ) {\n\t\t$chunks[] = $string;\n\t}\n\n\treturn $chunks;\n}\n\n/**\n * Adds rel nofollow string to all HTML A elements in content.\n *\n * @since 1.5.0\n *\n * @param string $text Content that may contain HTML A elements.\n * @return string Converted content.\n */\nfunction wp_rel_nofollow( $text ) {\n\t// This is a pre save filter, so text is already escaped.\n\t$text = stripslashes($text);\n\t$text = preg_replace_callback('|<a (.+?)>|i', 'wp_rel_nofollow_callback', $text);\n\treturn wp_slash( $text );\n}\n\n/**\n * Callback to add rel=nofollow string to HTML A element.\n *\n * Will remove already existing rel=\"nofollow\" and rel='nofollow' from the\n * string to prevent from invalidating (X)HTML.\n *\n * @since 2.3.0\n *\n * @param array $matches Single Match\n * @return string HTML A Element with rel nofollow.\n */\nfunction wp_rel_nofollow_callback( $matches ) {\n\t$text = $matches[1];\n\t$atts = shortcode_parse_atts( $matches[1] );\n\t$rel = 'nofollow';\n\tif ( ! empty( $atts['rel'] ) ) {\n\t\t$parts = array_map( 'trim', explode( ' ', $atts['rel'] ) );\n\t\tif ( false === array_search( 'nofollow', $parts ) ) {\n\t\t\t$parts[] = 'nofollow';\n\t\t}\n\t\t$rel = implode( ' ', $parts );\n\t\tunset( $atts['rel'] );\n\n\t\t$html = '';\n\t\tforeach ( $atts as $name => $value ) {\n\t\t\t$html .= \"{$name}=\\\"$value\\\" \";\n\t\t}\n\t\t$text = trim( $html );\n\t}\n\treturn \"<a $text rel=\\\"$rel\\\">\";\n}\n\n/**\n * Convert one smiley code to the icon graphic file equivalent.\n *\n * Callback handler for {@link convert_smilies()}.\n * Looks up one smiley code in the $wpsmiliestrans global array and returns an\n * `<img>` string for that smiley.\n *\n * @since 2.8.0\n *\n * @global array $wpsmiliestrans\n *\n * @param array $matches Single match. Smiley code to convert to image.\n * @return string Image string for smiley.\n */\nfunction translate_smiley( $matches ) {\n\tglobal $wpsmiliestrans;\n\n\tif ( count( $matches ) == 0 )\n\t\treturn '';\n\n\t$smiley = trim( reset( $matches ) );\n\t$img = $wpsmiliestrans[ $smiley ];\n\n\t$matches = array();\n\t$ext = preg_match( '/\\.([^.]+)$/', $img, $matches ) ? strtolower( $matches[1] ) : false;\n\t$image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );\n\n\t// Don't convert smilies that aren't images - they're probably emoji.\n\tif ( ! in_array( $ext, $image_exts ) ) {\n\t\treturn $img;\n\t}\n\n\t/**\n\t * Filter the Smiley image URL before it's used in the image element.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $smiley_url URL for the smiley image.\n\t * @param string $img        Filename for the smiley image.\n\t * @param string $site_url   Site URL, as returned by site_url().\n\t */\n\t$src_url = apply_filters( 'smilies_src', includes_url( \"images/smilies/$img\" ), $img, site_url() );\n\n\treturn sprintf( '<img src=\"%s\" alt=\"%s\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" />', esc_url( $src_url ), esc_attr( $smiley ) );\n}\n\n/**\n * Convert text equivalent of smilies to images.\n *\n * Will only convert smilies if the option 'use_smilies' is true and the global\n * used in the function isn't empty.\n *\n * @since 0.71\n *\n * @global string|array $wp_smiliessearch\n *\n * @param string $text Content to convert smilies from text.\n * @return string Converted content with text smilies replaced with images.\n */\nfunction convert_smilies( $text ) {\n\tglobal $wp_smiliessearch;\n\t$output = '';\n\tif ( get_option( 'use_smilies' ) && ! empty( $wp_smiliessearch ) ) {\n\t\t// HTML loop taken from texturize function, could possible be consolidated\n\t\t$textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // capture the tags as well as in between\n\t\t$stop = count( $textarr );// loop stuff\n\n\t\t// Ignore proessing of specific tags\n\t\t$tags_to_ignore = 'code|pre|style|script|textarea';\n\t\t$ignore_block_element = '';\n\n\t\tfor ( $i = 0; $i < $stop; $i++ ) {\n\t\t\t$content = $textarr[$i];\n\n\t\t\t// If we're in an ignore block, wait until we find its closing tag\n\t\t\tif ( '' == $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')>/', $content, $matches ) )  {\n\t\t\t\t$ignore_block_element = $matches[1];\n\t\t\t}\n\n\t\t\t// If it's not a tag and not in ignore block\n\t\t\tif ( '' ==  $ignore_block_element && strlen( $content ) > 0 && '<' != $content[0] ) {\n\t\t\t\t$content = preg_replace_callback( $wp_smiliessearch, 'translate_smiley', $content );\n\t\t\t}\n\n\t\t\t// did we exit ignore block\n\t\t\tif ( '' != $ignore_block_element && '</' . $ignore_block_element . '>' == $content )  {\n\t\t\t\t$ignore_block_element = '';\n\t\t\t}\n\n\t\t\t$output .= $content;\n\t\t}\n\t} else {\n\t\t// return default text.\n\t\t$output = $text;\n\t}\n\treturn $output;\n}\n\n/**\n * Verifies that an email is valid.\n *\n * Does not grok i18n domains. Not RFC compliant.\n *\n * @since 0.71\n *\n * @param string $email      Email address to verify.\n * @param bool   $deprecated Deprecated.\n * @return string|bool Either false or the valid email address.\n */\nfunction is_email( $email, $deprecated = false ) {\n\tif ( ! empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '3.0' );\n\n\t// Test for the minimum length the email can be\n\tif ( strlen( $email ) < 3 ) {\n\t\t/**\n\t\t * Filter whether an email address is valid.\n\t\t *\n\t\t * This filter is evaluated under several different contexts, such as 'email_too_short',\n\t\t * 'email_no_at', 'local_invalid_chars', 'domain_period_sequence', 'domain_period_limits',\n\t\t * 'domain_no_periods', 'sub_hyphen_limits', 'sub_invalid_chars', or no specific context.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param bool   $is_email Whether the email address has passed the is_email() checks. Default false.\n\t\t * @param string $email    The email address being checked.\n\t\t * @param string $context  Context under which the email was tested.\n\t\t */\n\t\treturn apply_filters( 'is_email', false, $email, 'email_too_short' );\n\t}\n\n\t// Test for an @ character after the first position\n\tif ( strpos( $email, '@', 1 ) === false ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'is_email', false, $email, 'email_no_at' );\n\t}\n\n\t// Split out the local and domain parts\n\tlist( $local, $domain ) = explode( '@', $email, 2 );\n\n\t// LOCAL PART\n\t// Test for invalid characters\n\tif ( !preg_match( '/^[a-zA-Z0-9!#$%&\\'*+\\/=?^_`{|}~\\.-]+$/', $local ) ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'is_email', false, $email, 'local_invalid_chars' );\n\t}\n\n\t// DOMAIN PART\n\t// Test for sequences of periods\n\tif ( preg_match( '/\\.{2,}/', $domain ) ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'is_email', false, $email, 'domain_period_sequence' );\n\t}\n\n\t// Test for leading and trailing periods and whitespace\n\tif ( trim( $domain, \" \\t\\n\\r\\0\\x0B.\" ) !== $domain ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'is_email', false, $email, 'domain_period_limits' );\n\t}\n\n\t// Split the domain into subs\n\t$subs = explode( '.', $domain );\n\n\t// Assume the domain will have at least two subs\n\tif ( 2 > count( $subs ) ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'is_email', false, $email, 'domain_no_periods' );\n\t}\n\n\t// Loop through each sub\n\tforeach ( $subs as $sub ) {\n\t\t// Test for leading and trailing hyphens and whitespace\n\t\tif ( trim( $sub, \" \\t\\n\\r\\0\\x0B-\" ) !== $sub ) {\n\t\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\t\treturn apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );\n\t\t}\n\n\t\t// Test for invalid characters\n\t\tif ( !preg_match('/^[a-z0-9-]+$/i', $sub ) ) {\n\t\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\t\treturn apply_filters( 'is_email', false, $email, 'sub_invalid_chars' );\n\t\t}\n\t}\n\n\t// Congratulations your email made it!\n\t/** This filter is documented in wp-includes/formatting.php */\n\treturn apply_filters( 'is_email', $email, $email, null );\n}\n\n/**\n * Convert to ASCII from email subjects.\n *\n * @since 1.2.0\n *\n * @param string $string Subject line\n * @return string Converted string to ASCII\n */\nfunction wp_iso_descrambler( $string ) {\n\t/* this may only work with iso-8859-1, I'm afraid */\n\tif (!preg_match('#\\=\\?(.+)\\?Q\\?(.+)\\?\\=#i', $string, $matches)) {\n\t\treturn $string;\n\t} else {\n\t\t$subject = str_replace('_', ' ', $matches[2]);\n\t\treturn preg_replace_callback( '#\\=([0-9a-f]{2})#i', '_wp_iso_convert', $subject );\n\t}\n}\n\n/**\n * Helper function to convert hex encoded chars to ASCII\n *\n * @since 3.1.0\n * @access private\n *\n * @param array $match The preg_replace_callback matches array\n * @return string Converted chars\n */\nfunction _wp_iso_convert( $match ) {\n\treturn chr( hexdec( strtolower( $match[1] ) ) );\n}\n\n/**\n * Returns a date in the GMT equivalent.\n *\n * Requires and returns a date in the Y-m-d H:i:s format. If there is a\n * timezone_string available, the date is assumed to be in that timezone,\n * otherwise it simply subtracts the value of the 'gmt_offset' option. Return\n * format can be overridden using the $format parameter.\n *\n * @since 1.2.0\n *\n * @param string $string The date to be converted.\n * @param string $format The format string for the returned date (default is Y-m-d H:i:s)\n * @return string GMT version of the date provided.\n */\nfunction get_gmt_from_date( $string, $format = 'Y-m-d H:i:s' ) {\n\t$tz = get_option( 'timezone_string' );\n\tif ( $tz ) {\n\t\t$datetime = date_create( $string, new DateTimeZone( $tz ) );\n\t\tif ( ! $datetime ) {\n\t\t\treturn gmdate( $format, 0 );\n\t\t}\n\t\t$datetime->setTimezone( new DateTimeZone( 'UTC' ) );\n\t\t$string_gmt = $datetime->format( $format );\n\t} else {\n\t\tif ( ! preg_match( '#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#', $string, $matches ) ) {\n\t\t\t$datetime = strtotime( $string );\n\t\t\tif ( false === $datetime ) {\n\t\t\t\treturn gmdate( $format, 0 );\n\t\t\t}\n\t\t\treturn gmdate( $format, $datetime );\n\t\t}\n\t\t$string_time = gmmktime( $matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1] );\n\t\t$string_gmt = gmdate( $format, $string_time - get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );\n\t}\n\treturn $string_gmt;\n}\n\n/**\n * Converts a GMT date into the correct format for the blog.\n *\n * Requires and returns a date in the Y-m-d H:i:s format. If there is a\n * timezone_string available, the returned date is in that timezone, otherwise\n * it simply adds the value of gmt_offset. Return format can be overridden\n * using the $format parameter\n *\n * @since 1.2.0\n *\n * @param string $string The date to be converted.\n * @param string $format The format string for the returned date (default is Y-m-d H:i:s)\n * @return string Formatted date relative to the timezone / GMT offset.\n */\nfunction get_date_from_gmt( $string, $format = 'Y-m-d H:i:s' ) {\n\t$tz = get_option( 'timezone_string' );\n\tif ( $tz ) {\n\t\t$datetime = date_create( $string, new DateTimeZone( 'UTC' ) );\n\t\tif ( ! $datetime )\n\t\t\treturn date( $format, 0 );\n\t\t$datetime->setTimezone( new DateTimeZone( $tz ) );\n\t\t$string_localtime = $datetime->format( $format );\n\t} else {\n\t\tif ( ! preg_match('#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#', $string, $matches) )\n\t\t\treturn date( $format, 0 );\n\t\t$string_time = gmmktime( $matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1] );\n\t\t$string_localtime = gmdate( $format, $string_time + get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );\n\t}\n\treturn $string_localtime;\n}\n\n/**\n * Computes an offset in seconds from an iso8601 timezone.\n *\n * @since 1.5.0\n *\n * @param string $timezone Either 'Z' for 0 offset or '±hhmm'.\n * @return int|float The offset in seconds.\n */\nfunction iso8601_timezone_to_offset( $timezone ) {\n\t// $timezone is either 'Z' or '[+|-]hhmm'\n\tif ($timezone == 'Z') {\n\t\t$offset = 0;\n\t} else {\n\t\t$sign    = (substr($timezone, 0, 1) == '+') ? 1 : -1;\n\t\t$hours   = intval(substr($timezone, 1, 2));\n\t\t$minutes = intval(substr($timezone, 3, 4)) / 60;\n\t\t$offset  = $sign * HOUR_IN_SECONDS * ($hours + $minutes);\n\t}\n\treturn $offset;\n}\n\n/**\n * Converts an iso8601 date to MySQL DateTime format used by post_date[_gmt].\n *\n * @since 1.5.0\n *\n * @param string $date_string Date and time in ISO 8601 format {@link http://en.wikipedia.org/wiki/ISO_8601}.\n * @param string $timezone    Optional. If set to GMT returns the time minus gmt_offset. Default is 'user'.\n * @return string The date and time in MySQL DateTime format - Y-m-d H:i:s.\n */\nfunction iso8601_to_datetime( $date_string, $timezone = 'user' ) {\n\t$timezone = strtolower($timezone);\n\n\tif ($timezone == 'gmt') {\n\n\t\tpreg_match('#([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[\\+|\\-][0-9]{2,4}){0,1}#', $date_string, $date_bits);\n\n\t\tif (!empty($date_bits[7])) { // we have a timezone, so let's compute an offset\n\t\t\t$offset = iso8601_timezone_to_offset($date_bits[7]);\n\t\t} else { // we don't have a timezone, so we assume user local timezone (not server's!)\n\t\t\t$offset = HOUR_IN_SECONDS * get_option('gmt_offset');\n\t\t}\n\n\t\t$timestamp = gmmktime($date_bits[4], $date_bits[5], $date_bits[6], $date_bits[2], $date_bits[3], $date_bits[1]);\n\t\t$timestamp -= $offset;\n\n\t\treturn gmdate('Y-m-d H:i:s', $timestamp);\n\n\t} elseif ($timezone == 'user') {\n\t\treturn preg_replace('#([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[\\+|\\-][0-9]{2,4}){0,1}#', '$1-$2-$3 $4:$5:$6', $date_string);\n\t}\n}\n\n/**\n * Adds a element attributes to open links in new windows.\n *\n * Comment text in popup windows should be filtered through this. Right now it's\n * a moderately dumb function, ideally it would detect whether a target or rel\n * attribute was already there and adjust its actions accordingly.\n *\n * @since 0.71\n *\n * @param string $text Content to replace links to open in a new window.\n * @return string Content that has filtered links.\n */\nfunction popuplinks( $text ) {\n\t$text = preg_replace('/<a (.+?)>/i', \"<a $1 target='_blank' rel='external'>\", $text);\n\treturn $text;\n}\n\n/**\n * Strips out all characters that are not allowable in an email.\n *\n * @since 1.5.0\n *\n * @param string $email Email address to filter.\n * @return string Filtered email address.\n */\nfunction sanitize_email( $email ) {\n\t// Test for the minimum length the email can be\n\tif ( strlen( $email ) < 3 ) {\n\t\t/**\n\t\t * Filter a sanitized email address.\n\t\t *\n\t\t * This filter is evaluated under several contexts, including 'email_too_short',\n\t\t * 'email_no_at', 'local_invalid_chars', 'domain_period_sequence', 'domain_period_limits',\n\t\t * 'domain_no_periods', 'domain_no_valid_subs', or no context.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param string $email   The sanitized email address.\n\t\t * @param string $email   The email address, as provided to sanitize_email().\n\t\t * @param string $message A message to pass to the user.\n\t\t */\n\t\treturn apply_filters( 'sanitize_email', '', $email, 'email_too_short' );\n\t}\n\n\t// Test for an @ character after the first position\n\tif ( strpos( $email, '@', 1 ) === false ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'sanitize_email', '', $email, 'email_no_at' );\n\t}\n\n\t// Split out the local and domain parts\n\tlist( $local, $domain ) = explode( '@', $email, 2 );\n\n\t// LOCAL PART\n\t// Test for invalid characters\n\t$local = preg_replace( '/[^a-zA-Z0-9!#$%&\\'*+\\/=?^_`{|}~\\.-]/', '', $local );\n\tif ( '' === $local ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'sanitize_email', '', $email, 'local_invalid_chars' );\n\t}\n\n\t// DOMAIN PART\n\t// Test for sequences of periods\n\t$domain = preg_replace( '/\\.{2,}/', '', $domain );\n\tif ( '' === $domain ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'sanitize_email', '', $email, 'domain_period_sequence' );\n\t}\n\n\t// Test for leading and trailing periods and whitespace\n\t$domain = trim( $domain, \" \\t\\n\\r\\0\\x0B.\" );\n\tif ( '' === $domain ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'sanitize_email', '', $email, 'domain_period_limits' );\n\t}\n\n\t// Split the domain into subs\n\t$subs = explode( '.', $domain );\n\n\t// Assume the domain will have at least two subs\n\tif ( 2 > count( $subs ) ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'sanitize_email', '', $email, 'domain_no_periods' );\n\t}\n\n\t// Create an array that will contain valid subs\n\t$new_subs = array();\n\n\t// Loop through each sub\n\tforeach ( $subs as $sub ) {\n\t\t// Test for leading and trailing hyphens\n\t\t$sub = trim( $sub, \" \\t\\n\\r\\0\\x0B-\" );\n\n\t\t// Test for invalid characters\n\t\t$sub = preg_replace( '/[^a-z0-9-]+/i', '', $sub );\n\n\t\t// If there's anything left, add it to the valid subs\n\t\tif ( '' !== $sub ) {\n\t\t\t$new_subs[] = $sub;\n\t\t}\n\t}\n\n\t// If there aren't 2 or more valid subs\n\tif ( 2 > count( $new_subs ) ) {\n\t\t/** This filter is documented in wp-includes/formatting.php */\n\t\treturn apply_filters( 'sanitize_email', '', $email, 'domain_no_valid_subs' );\n\t}\n\n\t// Join valid subs into the new domain\n\t$domain = join( '.', $new_subs );\n\n\t// Put the email back together\n\t$email = $local . '@' . $domain;\n\n\t// Congratulations your email made it!\n\t/** This filter is documented in wp-includes/formatting.php */\n\treturn apply_filters( 'sanitize_email', $email, $email, null );\n}\n\n/**\n * Determines the difference between two timestamps.\n *\n * The difference is returned in a human readable format such as \"1 hour\",\n * \"5 mins\", \"2 days\".\n *\n * @since 1.5.0\n *\n * @param int $from Unix timestamp from which the difference begins.\n * @param int $to   Optional. Unix timestamp to end the time difference. Default becomes time() if not set.\n * @return string Human readable time difference.\n */\nfunction human_time_diff( $from, $to = '' ) {\n\tif ( empty( $to ) ) {\n\t\t$to = time();\n\t}\n\n\t$diff = (int) abs( $to - $from );\n\n\tif ( $diff < HOUR_IN_SECONDS ) {\n\t\t$mins = round( $diff / MINUTE_IN_SECONDS );\n\t\tif ( $mins <= 1 )\n\t\t\t$mins = 1;\n\t\t/* translators: min=minute */\n\t\t$since = sprintf( _n( '%s min', '%s mins', $mins ), $mins );\n\t} elseif ( $diff < DAY_IN_SECONDS && $diff >= HOUR_IN_SECONDS ) {\n\t\t$hours = round( $diff / HOUR_IN_SECONDS );\n\t\tif ( $hours <= 1 )\n\t\t\t$hours = 1;\n\t\t$since = sprintf( _n( '%s hour', '%s hours', $hours ), $hours );\n\t} elseif ( $diff < WEEK_IN_SECONDS && $diff >= DAY_IN_SECONDS ) {\n\t\t$days = round( $diff / DAY_IN_SECONDS );\n\t\tif ( $days <= 1 )\n\t\t\t$days = 1;\n\t\t$since = sprintf( _n( '%s day', '%s days', $days ), $days );\n\t} elseif ( $diff < MONTH_IN_SECONDS && $diff >= WEEK_IN_SECONDS ) {\n\t\t$weeks = round( $diff / WEEK_IN_SECONDS );\n\t\tif ( $weeks <= 1 )\n\t\t\t$weeks = 1;\n\t\t$since = sprintf( _n( '%s week', '%s weeks', $weeks ), $weeks );\n\t} elseif ( $diff < YEAR_IN_SECONDS && $diff >= MONTH_IN_SECONDS ) {\n\t\t$months = round( $diff / MONTH_IN_SECONDS );\n\t\tif ( $months <= 1 )\n\t\t\t$months = 1;\n\t\t$since = sprintf( _n( '%s month', '%s months', $months ), $months );\n\t} elseif ( $diff >= YEAR_IN_SECONDS ) {\n\t\t$years = round( $diff / YEAR_IN_SECONDS );\n\t\tif ( $years <= 1 )\n\t\t\t$years = 1;\n\t\t$since = sprintf( _n( '%s year', '%s years', $years ), $years );\n\t}\n\n\t/**\n\t * Filter the human readable difference between two timestamps.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param string $since The difference in human readable text.\n\t * @param int    $diff  The difference in seconds.\n\t * @param int    $from  Unix timestamp from which the difference begins.\n\t * @param int    $to    Unix timestamp to end the time difference.\n\t */\n\treturn apply_filters( 'human_time_diff', $since, $diff, $from, $to );\n}\n\n/**\n * Generates an excerpt from the content, if needed.\n *\n * The excerpt word amount will be 55 words and if the amount is greater than\n * that, then the string ' [&hellip;]' will be appended to the excerpt. If the string\n * is less than 55 words, then the content will be returned as is.\n *\n * The 55 word limit can be modified by plugins/themes using the excerpt_length filter\n * The ' [&hellip;]' string can be modified by plugins/themes using the excerpt_more filter\n *\n * @since 1.5.0\n *\n * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.\n * @return string The excerpt.\n */\nfunction wp_trim_excerpt( $text = '' ) {\n\t$raw_excerpt = $text;\n\tif ( '' == $text ) {\n\t\t$text = get_the_content('');\n\n\t\t$text = strip_shortcodes( $text );\n\n\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t$text = apply_filters( 'the_content', $text );\n\t\t$text = str_replace(']]>', ']]&gt;', $text);\n\n\t\t/**\n\t\t * Filter the number of words in an excerpt.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param int $number The number of words. Default 55.\n\t\t */\n\t\t$excerpt_length = apply_filters( 'excerpt_length', 55 );\n\t\t/**\n\t\t * Filter the string in the \"more\" link displayed after a trimmed excerpt.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param string $more_string The string shown within the more link.\n\t\t */\n\t\t$excerpt_more = apply_filters( 'excerpt_more', ' ' . '[&hellip;]' );\n\t\t$text = wp_trim_words( $text, $excerpt_length, $excerpt_more );\n\t}\n\t/**\n\t * Filter the trimmed excerpt string.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $text        The trimmed text.\n\t * @param string $raw_excerpt The text prior to trimming.\n\t */\n\treturn apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt );\n}\n\n/**\n * Trims text to a certain number of words.\n *\n * This function is localized. For languages that count 'words' by the individual\n * character (such as East Asian languages), the $num_words argument will apply\n * to the number of individual characters.\n *\n * @since 3.3.0\n *\n * @param string $text      Text to trim.\n * @param int    $num_words Number of words. Default 55.\n * @param string $more      Optional. What to append if $text needs to be trimmed. Default '&hellip;'.\n * @return string Trimmed text.\n */\nfunction wp_trim_words( $text, $num_words = 55, $more = null ) {\n\tif ( null === $more ) {\n\t\t$more = __( '&hellip;' );\n\t}\n\n\t$original_text = $text;\n\t$text = wp_strip_all_tags( $text );\n\n\t/*\n\t * translators: If your word count is based on single characters (e.g. East Asian characters),\n\t * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'.\n\t * Do not translate into your own language.\n\t */\n\tif ( strpos( _x( 'words', 'Word count type. Do not translate!' ), 'characters' ) === 0 && preg_match( '/^utf\\-?8$/i', get_option( 'blog_charset' ) ) ) {\n\t\t$text = trim( preg_replace( \"/[\\n\\r\\t ]+/\", ' ', $text ), ' ' );\n\t\tpreg_match_all( '/./u', $text, $words_array );\n\t\t$words_array = array_slice( $words_array[0], 0, $num_words + 1 );\n\t\t$sep = '';\n\t} else {\n\t\t$words_array = preg_split( \"/[\\n\\r\\t ]+/\", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY );\n\t\t$sep = ' ';\n\t}\n\n\tif ( count( $words_array ) > $num_words ) {\n\t\tarray_pop( $words_array );\n\t\t$text = implode( $sep, $words_array );\n\t\t$text = $text . $more;\n\t} else {\n\t\t$text = implode( $sep, $words_array );\n\t}\n\n\t/**\n\t * Filter the text content after words have been trimmed.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $text          The trimmed text.\n\t * @param int    $num_words     The number of words to trim the text to. Default 5.\n\t * @param string $more          An optional string to append to the end of the trimmed text, e.g. &hellip;.\n\t * @param string $original_text The text before it was trimmed.\n\t */\n\treturn apply_filters( 'wp_trim_words', $text, $num_words, $more, $original_text );\n}\n\n/**\n * Converts named entities into numbered entities.\n *\n * @since 1.5.1\n *\n * @param string $text The text within which entities will be converted.\n * @return string Text with converted entities.\n */\nfunction ent2ncr( $text ) {\n\n\t/**\n\t * Filter text before named entities are converted into numbered entities.\n\t *\n\t * A non-null string must be returned for the filter to be evaluated.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param null   $converted_text The text to be converted. Default null.\n\t * @param string $text           The text prior to entity conversion.\n\t */\n\t$filtered = apply_filters( 'pre_ent2ncr', null, $text );\n\tif ( null !== $filtered )\n\t\treturn $filtered;\n\n\t$to_ncr = array(\n\t\t'&quot;' => '&#34;',\n\t\t'&amp;' => '&#38;',\n\t\t'&lt;' => '&#60;',\n\t\t'&gt;' => '&#62;',\n\t\t'|' => '&#124;',\n\t\t'&nbsp;' => '&#160;',\n\t\t'&iexcl;' => '&#161;',\n\t\t'&cent;' => '&#162;',\n\t\t'&pound;' => '&#163;',\n\t\t'&curren;' => '&#164;',\n\t\t'&yen;' => '&#165;',\n\t\t'&brvbar;' => '&#166;',\n\t\t'&brkbar;' => '&#166;',\n\t\t'&sect;' => '&#167;',\n\t\t'&uml;' => '&#168;',\n\t\t'&die;' => '&#168;',\n\t\t'&copy;' => '&#169;',\n\t\t'&ordf;' => '&#170;',\n\t\t'&laquo;' => '&#171;',\n\t\t'&not;' => '&#172;',\n\t\t'&shy;' => '&#173;',\n\t\t'&reg;' => '&#174;',\n\t\t'&macr;' => '&#175;',\n\t\t'&hibar;' => '&#175;',\n\t\t'&deg;' => '&#176;',\n\t\t'&plusmn;' => '&#177;',\n\t\t'&sup2;' => '&#178;',\n\t\t'&sup3;' => '&#179;',\n\t\t'&acute;' => '&#180;',\n\t\t'&micro;' => '&#181;',\n\t\t'&para;' => '&#182;',\n\t\t'&middot;' => '&#183;',\n\t\t'&cedil;' => '&#184;',\n\t\t'&sup1;' => '&#185;',\n\t\t'&ordm;' => '&#186;',\n\t\t'&raquo;' => '&#187;',\n\t\t'&frac14;' => '&#188;',\n\t\t'&frac12;' => '&#189;',\n\t\t'&frac34;' => '&#190;',\n\t\t'&iquest;' => '&#191;',\n\t\t'&Agrave;' => '&#192;',\n\t\t'&Aacute;' => '&#193;',\n\t\t'&Acirc;' => '&#194;',\n\t\t'&Atilde;' => '&#195;',\n\t\t'&Auml;' => '&#196;',\n\t\t'&Aring;' => '&#197;',\n\t\t'&AElig;' => '&#198;',\n\t\t'&Ccedil;' => '&#199;',\n\t\t'&Egrave;' => '&#200;',\n\t\t'&Eacute;' => '&#201;',\n\t\t'&Ecirc;' => '&#202;',\n\t\t'&Euml;' => '&#203;',\n\t\t'&Igrave;' => '&#204;',\n\t\t'&Iacute;' => '&#205;',\n\t\t'&Icirc;' => '&#206;',\n\t\t'&Iuml;' => '&#207;',\n\t\t'&ETH;' => '&#208;',\n\t\t'&Ntilde;' => '&#209;',\n\t\t'&Ograve;' => '&#210;',\n\t\t'&Oacute;' => '&#211;',\n\t\t'&Ocirc;' => '&#212;',\n\t\t'&Otilde;' => '&#213;',\n\t\t'&Ouml;' => '&#214;',\n\t\t'&times;' => '&#215;',\n\t\t'&Oslash;' => '&#216;',\n\t\t'&Ugrave;' => '&#217;',\n\t\t'&Uacute;' => '&#218;',\n\t\t'&Ucirc;' => '&#219;',\n\t\t'&Uuml;' => '&#220;',\n\t\t'&Yacute;' => '&#221;',\n\t\t'&THORN;' => '&#222;',\n\t\t'&szlig;' => '&#223;',\n\t\t'&agrave;' => '&#224;',\n\t\t'&aacute;' => '&#225;',\n\t\t'&acirc;' => '&#226;',\n\t\t'&atilde;' => '&#227;',\n\t\t'&auml;' => '&#228;',\n\t\t'&aring;' => '&#229;',\n\t\t'&aelig;' => '&#230;',\n\t\t'&ccedil;' => '&#231;',\n\t\t'&egrave;' => '&#232;',\n\t\t'&eacute;' => '&#233;',\n\t\t'&ecirc;' => '&#234;',\n\t\t'&euml;' => '&#235;',\n\t\t'&igrave;' => '&#236;',\n\t\t'&iacute;' => '&#237;',\n\t\t'&icirc;' => '&#238;',\n\t\t'&iuml;' => '&#239;',\n\t\t'&eth;' => '&#240;',\n\t\t'&ntilde;' => '&#241;',\n\t\t'&ograve;' => '&#242;',\n\t\t'&oacute;' => '&#243;',\n\t\t'&ocirc;' => '&#244;',\n\t\t'&otilde;' => '&#245;',\n\t\t'&ouml;' => '&#246;',\n\t\t'&divide;' => '&#247;',\n\t\t'&oslash;' => '&#248;',\n\t\t'&ugrave;' => '&#249;',\n\t\t'&uacute;' => '&#250;',\n\t\t'&ucirc;' => '&#251;',\n\t\t'&uuml;' => '&#252;',\n\t\t'&yacute;' => '&#253;',\n\t\t'&thorn;' => '&#254;',\n\t\t'&yuml;' => '&#255;',\n\t\t'&OElig;' => '&#338;',\n\t\t'&oelig;' => '&#339;',\n\t\t'&Scaron;' => '&#352;',\n\t\t'&scaron;' => '&#353;',\n\t\t'&Yuml;' => '&#376;',\n\t\t'&fnof;' => '&#402;',\n\t\t'&circ;' => '&#710;',\n\t\t'&tilde;' => '&#732;',\n\t\t'&Alpha;' => '&#913;',\n\t\t'&Beta;' => '&#914;',\n\t\t'&Gamma;' => '&#915;',\n\t\t'&Delta;' => '&#916;',\n\t\t'&Epsilon;' => '&#917;',\n\t\t'&Zeta;' => '&#918;',\n\t\t'&Eta;' => '&#919;',\n\t\t'&Theta;' => '&#920;',\n\t\t'&Iota;' => '&#921;',\n\t\t'&Kappa;' => '&#922;',\n\t\t'&Lambda;' => '&#923;',\n\t\t'&Mu;' => '&#924;',\n\t\t'&Nu;' => '&#925;',\n\t\t'&Xi;' => '&#926;',\n\t\t'&Omicron;' => '&#927;',\n\t\t'&Pi;' => '&#928;',\n\t\t'&Rho;' => '&#929;',\n\t\t'&Sigma;' => '&#931;',\n\t\t'&Tau;' => '&#932;',\n\t\t'&Upsilon;' => '&#933;',\n\t\t'&Phi;' => '&#934;',\n\t\t'&Chi;' => '&#935;',\n\t\t'&Psi;' => '&#936;',\n\t\t'&Omega;' => '&#937;',\n\t\t'&alpha;' => '&#945;',\n\t\t'&beta;' => '&#946;',\n\t\t'&gamma;' => '&#947;',\n\t\t'&delta;' => '&#948;',\n\t\t'&epsilon;' => '&#949;',\n\t\t'&zeta;' => '&#950;',\n\t\t'&eta;' => '&#951;',\n\t\t'&theta;' => '&#952;',\n\t\t'&iota;' => '&#953;',\n\t\t'&kappa;' => '&#954;',\n\t\t'&lambda;' => '&#955;',\n\t\t'&mu;' => '&#956;',\n\t\t'&nu;' => '&#957;',\n\t\t'&xi;' => '&#958;',\n\t\t'&omicron;' => '&#959;',\n\t\t'&pi;' => '&#960;',\n\t\t'&rho;' => '&#961;',\n\t\t'&sigmaf;' => '&#962;',\n\t\t'&sigma;' => '&#963;',\n\t\t'&tau;' => '&#964;',\n\t\t'&upsilon;' => '&#965;',\n\t\t'&phi;' => '&#966;',\n\t\t'&chi;' => '&#967;',\n\t\t'&psi;' => '&#968;',\n\t\t'&omega;' => '&#969;',\n\t\t'&thetasym;' => '&#977;',\n\t\t'&upsih;' => '&#978;',\n\t\t'&piv;' => '&#982;',\n\t\t'&ensp;' => '&#8194;',\n\t\t'&emsp;' => '&#8195;',\n\t\t'&thinsp;' => '&#8201;',\n\t\t'&zwnj;' => '&#8204;',\n\t\t'&zwj;' => '&#8205;',\n\t\t'&lrm;' => '&#8206;',\n\t\t'&rlm;' => '&#8207;',\n\t\t'&ndash;' => '&#8211;',\n\t\t'&mdash;' => '&#8212;',\n\t\t'&lsquo;' => '&#8216;',\n\t\t'&rsquo;' => '&#8217;',\n\t\t'&sbquo;' => '&#8218;',\n\t\t'&ldquo;' => '&#8220;',\n\t\t'&rdquo;' => '&#8221;',\n\t\t'&bdquo;' => '&#8222;',\n\t\t'&dagger;' => '&#8224;',\n\t\t'&Dagger;' => '&#8225;',\n\t\t'&bull;' => '&#8226;',\n\t\t'&hellip;' => '&#8230;',\n\t\t'&permil;' => '&#8240;',\n\t\t'&prime;' => '&#8242;',\n\t\t'&Prime;' => '&#8243;',\n\t\t'&lsaquo;' => '&#8249;',\n\t\t'&rsaquo;' => '&#8250;',\n\t\t'&oline;' => '&#8254;',\n\t\t'&frasl;' => '&#8260;',\n\t\t'&euro;' => '&#8364;',\n\t\t'&image;' => '&#8465;',\n\t\t'&weierp;' => '&#8472;',\n\t\t'&real;' => '&#8476;',\n\t\t'&trade;' => '&#8482;',\n\t\t'&alefsym;' => '&#8501;',\n\t\t'&crarr;' => '&#8629;',\n\t\t'&lArr;' => '&#8656;',\n\t\t'&uArr;' => '&#8657;',\n\t\t'&rArr;' => '&#8658;',\n\t\t'&dArr;' => '&#8659;',\n\t\t'&hArr;' => '&#8660;',\n\t\t'&forall;' => '&#8704;',\n\t\t'&part;' => '&#8706;',\n\t\t'&exist;' => '&#8707;',\n\t\t'&empty;' => '&#8709;',\n\t\t'&nabla;' => '&#8711;',\n\t\t'&isin;' => '&#8712;',\n\t\t'&notin;' => '&#8713;',\n\t\t'&ni;' => '&#8715;',\n\t\t'&prod;' => '&#8719;',\n\t\t'&sum;' => '&#8721;',\n\t\t'&minus;' => '&#8722;',\n\t\t'&lowast;' => '&#8727;',\n\t\t'&radic;' => '&#8730;',\n\t\t'&prop;' => '&#8733;',\n\t\t'&infin;' => '&#8734;',\n\t\t'&ang;' => '&#8736;',\n\t\t'&and;' => '&#8743;',\n\t\t'&or;' => '&#8744;',\n\t\t'&cap;' => '&#8745;',\n\t\t'&cup;' => '&#8746;',\n\t\t'&int;' => '&#8747;',\n\t\t'&there4;' => '&#8756;',\n\t\t'&sim;' => '&#8764;',\n\t\t'&cong;' => '&#8773;',\n\t\t'&asymp;' => '&#8776;',\n\t\t'&ne;' => '&#8800;',\n\t\t'&equiv;' => '&#8801;',\n\t\t'&le;' => '&#8804;',\n\t\t'&ge;' => '&#8805;',\n\t\t'&sub;' => '&#8834;',\n\t\t'&sup;' => '&#8835;',\n\t\t'&nsub;' => '&#8836;',\n\t\t'&sube;' => '&#8838;',\n\t\t'&supe;' => '&#8839;',\n\t\t'&oplus;' => '&#8853;',\n\t\t'&otimes;' => '&#8855;',\n\t\t'&perp;' => '&#8869;',\n\t\t'&sdot;' => '&#8901;',\n\t\t'&lceil;' => '&#8968;',\n\t\t'&rceil;' => '&#8969;',\n\t\t'&lfloor;' => '&#8970;',\n\t\t'&rfloor;' => '&#8971;',\n\t\t'&lang;' => '&#9001;',\n\t\t'&rang;' => '&#9002;',\n\t\t'&larr;' => '&#8592;',\n\t\t'&uarr;' => '&#8593;',\n\t\t'&rarr;' => '&#8594;',\n\t\t'&darr;' => '&#8595;',\n\t\t'&harr;' => '&#8596;',\n\t\t'&loz;' => '&#9674;',\n\t\t'&spades;' => '&#9824;',\n\t\t'&clubs;' => '&#9827;',\n\t\t'&hearts;' => '&#9829;',\n\t\t'&diams;' => '&#9830;'\n\t);\n\n\treturn str_replace( array_keys($to_ncr), array_values($to_ncr), $text );\n}\n\n/**\n * Formats text for the editor.\n *\n * Generally the browsers treat everything inside a textarea as text, but\n * it is still a good idea to HTML entity encode `<`, `>` and `&` in the content.\n *\n * The filter {@see 'format_for_editor'} is applied here. If `$text` is empty the\n * filter will be applied to an empty string.\n *\n * @since 4.3.0\n *\n * @param string $text The text to be formatted.\n * @return string The formatted text after filter is applied.\n */\nfunction format_for_editor( $text, $default_editor = null ) {\n\tif ( $text ) {\n\t\t$text = htmlspecialchars( $text, ENT_NOQUOTES, get_option( 'blog_charset' ) );\n\t}\n\n\t/**\n\t * Filter the text after it is formatted for the editor.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param string $text The formatted text.\n\t */\n\treturn apply_filters( 'format_for_editor', $text, $default_editor );\n}\n\n/**\n * Perform a deep string replace operation to ensure the values in $search are no longer present\n *\n * Repeats the replacement operation until it no longer replaces anything so as to remove \"nested\" values\n * e.g. $subject = '%0%0%0DDD', $search ='%0D', $result ='' rather than the '%0%0DD' that\n * str_replace would return\n *\n * @since 2.8.1\n * @access private\n *\n * @param string|array $search  The value being searched for, otherwise known as the needle.\n *                              An array may be used to designate multiple needles.\n * @param string       $subject The string being searched and replaced on, otherwise known as the haystack.\n * @return string The string with the replaced svalues.\n */\nfunction _deep_replace( $search, $subject ) {\n\t$subject = (string) $subject;\n\n\t$count = 1;\n\twhile ( $count ) {\n\t\t$subject = str_replace( $search, '', $subject, $count );\n\t}\n\n\treturn $subject;\n}\n\n/**\n * Escapes data for use in a MySQL query.\n *\n * Usually you should prepare queries using wpdb::prepare().\n * Sometimes, spot-escaping is required or useful. One example\n * is preparing an array for use in an IN clause.\n *\n * @since 2.8.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string|array $data Unescaped data\n * @return string|array Escaped data\n */\nfunction esc_sql( $data ) {\n\tglobal $wpdb;\n\treturn $wpdb->_escape( $data );\n}\n\n/**\n * Checks and cleans a URL.\n *\n * A number of characters are removed from the URL. If the URL is for displaying\n * (the default behaviour) ampersands are also replaced. The 'clean_url' filter\n * is applied to the returned cleaned URL.\n *\n * @since 2.8.0\n *\n * @param string $url       The URL to be cleaned.\n * @param array  $protocols Optional. An array of acceptable protocols.\n *\t\t                    Defaults to return value of wp_allowed_protocols()\n * @param string $_context  Private. Use esc_url_raw() for database usage.\n * @return string The cleaned $url after the 'clean_url' filter is applied.\n */\nfunction esc_url( $url, $protocols = null, $_context = 'display' ) {\n\t$original_url = $url;\n\n\tif ( '' == $url )\n\t\treturn $url;\n\n\t$url = str_replace( ' ', '%20', $url );\n\t$url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\\|*\\'()\\[\\]\\\\x80-\\\\xff]|i', '', $url);\n\n\tif ( '' === $url ) {\n\t\treturn $url;\n\t}\n\n\tif ( 0 !== stripos( $url, 'mailto:' ) ) {\n\t\t$strip = array('%0d', '%0a', '%0D', '%0A');\n\t\t$url = _deep_replace($strip, $url);\n\t}\n\n\t$url = str_replace(';//', '://', $url);\n\t/* If the URL doesn't appear to contain a scheme, we\n\t * presume it needs http:// prepended (unless a relative\n\t * link starting with /, # or ? or a php file).\n\t */\n\tif ( strpos($url, ':') === false && ! in_array( $url[0], array( '/', '#', '?' ) ) &&\n\t\t! preg_match('/^[a-z0-9-]+?\\.php/i', $url) )\n\t\t$url = 'http://' . $url;\n\n\t// Replace ampersands and single quotes only when displaying.\n\tif ( 'display' == $_context ) {\n\t\t$url = wp_kses_normalize_entities( $url );\n\t\t$url = str_replace( '&amp;', '&#038;', $url );\n\t\t$url = str_replace( \"'\", '&#039;', $url );\n\t}\n\n\tif ( ( false !== strpos( $url, '[' ) ) || ( false !== strpos( $url, ']' ) ) ) {\n\n\t\t$parsed = wp_parse_url( $url );\n\t\t$front  = '';\n\n\t\tif ( isset( $parsed['scheme'] ) ) {\n\t\t\t$front .= $parsed['scheme'] . '://';\n\t\t} elseif ( '/' === $url[0] ) {\n\t\t\t$front .= '//';\n\t\t}\n\n\t\tif ( isset( $parsed['user'] ) ) {\n\t\t\t$front .= $parsed['user'];\n\t\t}\n\n\t\tif ( isset( $parsed['pass'] ) ) {\n\t\t\t$front .= ':' . $parsed['pass'];\n\t\t}\n\n\t\tif ( isset( $parsed['user'] ) || isset( $parsed['pass'] ) ) {\n\t\t\t$front .= '@';\n\t\t}\n\n\t\tif ( isset( $parsed['host'] ) ) {\n\t\t\t$front .= $parsed['host'];\n\t\t}\n\n\t\tif ( isset( $parsed['port'] ) ) {\n\t\t\t$front .= ':' . $parsed['port'];\n\t\t}\n\n\t\t$end_dirty = str_replace( $front, '', $url );\n\t\t$end_clean = str_replace( array( '[', ']' ), array( '%5B', '%5D' ), $end_dirty );\n\t\t$url       = str_replace( $end_dirty, $end_clean, $url );\n\n\t}\n\n\tif ( '/' === $url[0] ) {\n\t\t$good_protocol_url = $url;\n\t} else {\n\t\tif ( ! is_array( $protocols ) )\n\t\t\t$protocols = wp_allowed_protocols();\n\t\t$good_protocol_url = wp_kses_bad_protocol( $url, $protocols );\n\t\tif ( strtolower( $good_protocol_url ) != strtolower( $url ) )\n\t\t\treturn '';\n\t}\n\n\t/**\n\t * Filter a string cleaned and escaped for output as a URL.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $good_protocol_url The cleaned URL to be returned.\n\t * @param string $original_url      The URL prior to cleaning.\n\t * @param string $_context          If 'display', replace ampersands and single quotes only.\n\t */\n\treturn apply_filters( 'clean_url', $good_protocol_url, $original_url, $_context );\n}\n\n/**\n * Performs esc_url() for database usage.\n *\n * @since 2.8.0\n *\n * @param string $url       The URL to be cleaned.\n * @param array  $protocols An array of acceptable protocols.\n * @return string The cleaned URL.\n */\nfunction esc_url_raw( $url, $protocols = null ) {\n\treturn esc_url( $url, $protocols, 'db' );\n}\n\n/**\n * Convert entities, while preserving already-encoded entities.\n *\n * @link http://www.php.net/htmlentities Borrowed from the PHP Manual user notes.\n *\n * @since 1.2.2\n *\n * @param string $myHTML The text to be converted.\n * @return string Converted text.\n */\nfunction htmlentities2( $myHTML ) {\n\t$translation_table = get_html_translation_table( HTML_ENTITIES, ENT_QUOTES );\n\t$translation_table[chr(38)] = '&';\n\treturn preg_replace( \"/&(?![A-Za-z]{0,4}\\w{2,3};|#[0-9]{2,3};)/\", \"&amp;\", strtr($myHTML, $translation_table) );\n}\n\n/**\n * Escape single quotes, htmlspecialchar \" < > &, and fix line endings.\n *\n * Escapes text strings for echoing in JS. It is intended to be used for inline JS\n * (in a tag attribute, for example onclick=\"...\"). Note that the strings have to\n * be in single quotes. The filter 'js_escape' is also applied here.\n *\n * @since 2.8.0\n *\n * @param string $text The text to be escaped.\n * @return string Escaped text.\n */\nfunction esc_js( $text ) {\n\t$safe_text = wp_check_invalid_utf8( $text );\n\t$safe_text = _wp_specialchars( $safe_text, ENT_COMPAT );\n\t$safe_text = preg_replace( '/&#(x)?0*(?(1)27|39);?/i', \"'\", stripslashes( $safe_text ) );\n\t$safe_text = str_replace( \"\\r\", '', $safe_text );\n\t$safe_text = str_replace( \"\\n\", '\\\\n', addslashes( $safe_text ) );\n\t/**\n\t * Filter a string cleaned and escaped for output in JavaScript.\n\t *\n\t * Text passed to esc_js() is stripped of invalid or special characters,\n\t * and properly slashed for output.\n\t *\n\t * @since 2.0.6\n\t *\n\t * @param string $safe_text The text after it has been escaped.\n \t * @param string $text      The text prior to being escaped.\n\t */\n\treturn apply_filters( 'js_escape', $safe_text, $text );\n}\n\n/**\n * Escaping for HTML blocks.\n *\n * @since 2.8.0\n *\n * @param string $text\n * @return string\n */\nfunction esc_html( $text ) {\n\t$safe_text = wp_check_invalid_utf8( $text );\n\t$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );\n\t/**\n\t * Filter a string cleaned and escaped for output in HTML.\n\t *\n\t * Text passed to esc_html() is stripped of invalid or special characters\n\t * before output.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $safe_text The text after it has been escaped.\n \t * @param string $text      The text prior to being escaped.\n\t */\n\treturn apply_filters( 'esc_html', $safe_text, $text );\n}\n\n/**\n * Escaping for HTML attributes.\n *\n * @since 2.8.0\n *\n * @param string $text\n * @return string\n */\nfunction esc_attr( $text ) {\n\t$safe_text = wp_check_invalid_utf8( $text );\n\t$safe_text = _wp_specialchars( $safe_text, ENT_QUOTES );\n\t/**\n\t * Filter a string cleaned and escaped for output in an HTML attribute.\n\t *\n\t * Text passed to esc_attr() is stripped of invalid or special characters\n\t * before output.\n\t *\n\t * @since 2.0.6\n\t *\n\t * @param string $safe_text The text after it has been escaped.\n \t * @param string $text      The text prior to being escaped.\n\t */\n\treturn apply_filters( 'attribute_escape', $safe_text, $text );\n}\n\n/**\n * Escaping for textarea values.\n *\n * @since 3.1.0\n *\n * @param string $text\n * @return string\n */\nfunction esc_textarea( $text ) {\n\t$safe_text = htmlspecialchars( $text, ENT_QUOTES, get_option( 'blog_charset' ) );\n\t/**\n\t * Filter a string cleaned and escaped for output in a textarea element.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $safe_text The text after it has been escaped.\n \t * @param string $text      The text prior to being escaped.\n\t */\n\treturn apply_filters( 'esc_textarea', $safe_text, $text );\n}\n\n/**\n * Escape an HTML tag name.\n *\n * @since 2.5.0\n *\n * @param string $tag_name\n * @return string\n */\nfunction tag_escape( $tag_name ) {\n\t$safe_tag = strtolower( preg_replace('/[^a-zA-Z0-9_:]/', '', $tag_name) );\n\t/**\n\t * Filter a string cleaned and escaped for output as an HTML tag.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $safe_tag The tag name after it has been escaped.\n \t * @param string $tag_name The text before it was escaped.\n\t */\n\treturn apply_filters( 'tag_escape', $safe_tag, $tag_name );\n}\n\n/**\n * Convert full URL paths to absolute paths.\n *\n * Removes the http or https protocols and the domain. Keeps the path '/' at the\n * beginning, so it isn't a true relative link, but from the web root base.\n *\n * @since 2.1.0\n * @since 4.1.0 Support was added for relative URLs.\n *\n * @param string $link Full URL path.\n * @return string Absolute path.\n */\nfunction wp_make_link_relative( $link ) {\n\treturn preg_replace( '|^(https?:)?//[^/]+(/?.*)|i', '$2', $link );\n}\n\n/**\n * Sanitises various option values based on the nature of the option.\n *\n * This is basically a switch statement which will pass $value through a number\n * of functions depending on the $option.\n *\n * @since 2.0.5\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $option The name of the option.\n * @param string $value  The unsanitised value.\n * @return string Sanitized value.\n */\nfunction sanitize_option( $option, $value ) {\n\tglobal $wpdb;\n\n\t$original_value = $value;\n\t$error = '';\n\n\tswitch ( $option ) {\n\t\tcase 'admin_email' :\n\t\tcase 'new_admin_email' :\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\t$value = sanitize_email( $value );\n\t\t\t\tif ( ! is_email( $value ) ) {\n\t\t\t\t\t$error = __( 'The email address entered did not appear to be a valid email address. Please enter a valid email address.' );\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'thumbnail_size_w':\n\t\tcase 'thumbnail_size_h':\n\t\tcase 'medium_size_w':\n\t\tcase 'medium_size_h':\n\t\tcase 'medium_large_size_w':\n\t\tcase 'medium_large_size_h':\n\t\tcase 'large_size_w':\n\t\tcase 'large_size_h':\n\t\tcase 'mailserver_port':\n\t\tcase 'comment_max_links':\n\t\tcase 'page_on_front':\n\t\tcase 'page_for_posts':\n\t\tcase 'rss_excerpt_length':\n\t\tcase 'default_category':\n\t\tcase 'default_email_category':\n\t\tcase 'default_link_category':\n\t\tcase 'close_comments_days_old':\n\t\tcase 'comments_per_page':\n\t\tcase 'thread_comments_depth':\n\t\tcase 'users_can_register':\n\t\tcase 'start_of_week':\n\t\tcase 'site_icon':\n\t\t\t$value = absint( $value );\n\t\t\tbreak;\n\n\t\tcase 'posts_per_page':\n\t\tcase 'posts_per_rss':\n\t\t\t$value = (int) $value;\n\t\t\tif ( empty($value) )\n\t\t\t\t$value = 1;\n\t\t\tif ( $value < -1 )\n\t\t\t\t$value = abs($value);\n\t\t\tbreak;\n\n\t\tcase 'default_ping_status':\n\t\tcase 'default_comment_status':\n\t\t\t// Options that if not there have 0 value but need to be something like \"closed\"\n\t\t\tif ( $value == '0' || $value == '')\n\t\t\t\t$value = 'closed';\n\t\t\tbreak;\n\n\t\tcase 'blogdescription':\n\t\tcase 'blogname':\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\t$value = wp_kses_post( $value );\n\t\t\t\t$value = esc_html( $value );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'blog_charset':\n\t\t\t$value = preg_replace('/[^a-zA-Z0-9_-]/', '', $value); // strips slashes\n\t\t\tbreak;\n\n\t\tcase 'blog_public':\n\t\t\t// This is the value if the settings checkbox is not checked on POST. Don't rely on this.\n\t\t\tif ( null === $value )\n\t\t\t\t$value = 1;\n\t\t\telse\n\t\t\t\t$value = intval( $value );\n\t\t\tbreak;\n\n\t\tcase 'date_format':\n\t\tcase 'time_format':\n\t\tcase 'mailserver_url':\n\t\tcase 'mailserver_login':\n\t\tcase 'mailserver_pass':\n\t\tcase 'upload_path':\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\t$value = strip_tags( $value );\n\t\t\t\t$value = wp_kses_data( $value );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'ping_sites':\n\t\t\t$value = explode( \"\\n\", $value );\n\t\t\t$value = array_filter( array_map( 'trim', $value ) );\n\t\t\t$value = array_filter( array_map( 'esc_url_raw', $value ) );\n\t\t\t$value = implode( \"\\n\", $value );\n\t\t\tbreak;\n\n\t\tcase 'gmt_offset':\n\t\t\t$value = preg_replace('/[^0-9:.-]/', '', $value); // strips slashes\n\t\t\tbreak;\n\n\t\tcase 'siteurl':\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\tif ( preg_match( '#http(s?)://(.+)#i', $value ) ) {\n\t\t\t\t\t$value = esc_url_raw( $value );\n\t\t\t\t} else {\n\t\t\t\t\t$error = __( 'The WordPress address you entered did not appear to be a valid URL. Please enter a valid URL.' );\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'home':\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\tif ( preg_match( '#http(s?)://(.+)#i', $value ) ) {\n\t\t\t\t\t$value = esc_url_raw( $value );\n\t\t\t\t} else {\n\t\t\t\t\t$error = __( 'The Site address you entered did not appear to be a valid URL. Please enter a valid URL.' );\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'WPLANG':\n\t\t\t$allowed = get_available_languages();\n\t\t\tif ( ! is_multisite() && defined( 'WPLANG' ) && '' !== WPLANG && 'en_US' !== WPLANG ) {\n\t\t\t\t$allowed[] = WPLANG;\n\t\t\t}\n\t\t\tif ( ! in_array( $value, $allowed ) && ! empty( $value ) ) {\n\t\t\t\t$value = get_option( $option );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'illegal_names':\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\tif ( ! is_array( $value ) )\n\t\t\t\t\t$value = explode( ' ', $value );\n\n\t\t\t\t$value = array_values( array_filter( array_map( 'trim', $value ) ) );\n\n\t\t\t\tif ( ! $value )\n\t\t\t\t\t$value = '';\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'limited_email_domains':\n\t\tcase 'banned_email_domains':\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\tif ( ! is_array( $value ) )\n\t\t\t\t\t$value = explode( \"\\n\", $value );\n\n\t\t\t\t$domains = array_values( array_filter( array_map( 'trim', $value ) ) );\n\t\t\t\t$value = array();\n\n\t\t\t\tforeach ( $domains as $domain ) {\n\t\t\t\t\tif ( ! preg_match( '/(--|\\.\\.)/', $domain ) && preg_match( '|^([a-zA-Z0-9-\\.])+$|', $domain ) ) {\n\t\t\t\t\t\t$value[] = $domain;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( ! $value )\n\t\t\t\t\t$value = '';\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'timezone_string':\n\t\t\t$allowed_zones = timezone_identifiers_list();\n\t\t\tif ( ! in_array( $value, $allowed_zones ) && ! empty( $value ) ) {\n\t\t\t\t$error = __( 'The timezone you have entered is not valid. Please select a valid timezone.' );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'permalink_structure':\n\t\tcase 'category_base':\n\t\tcase 'tag_base':\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\t$value = esc_url_raw( $value );\n\t\t\t\t$value = str_replace( 'http://', '', $value );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'default_role' :\n\t\t\tif ( ! get_role( $value ) && get_role( 'subscriber' ) )\n\t\t\t\t$value = 'subscriber';\n\t\t\tbreak;\n\n\t\tcase 'moderation_keys':\n\t\tcase 'blacklist_keys':\n\t\t\t$value = $wpdb->strip_invalid_text_for_column( $wpdb->options, 'option_value', $value );\n\t\t\tif ( is_wp_error( $value ) ) {\n\t\t\t\t$error = $value->get_error_message();\n\t\t\t} else {\n\t\t\t\t$value = explode( \"\\n\", $value );\n\t\t\t\t$value = array_filter( array_map( 'trim', $value ) );\n\t\t\t\t$value = array_unique( $value );\n\t\t\t\t$value = implode( \"\\n\", $value );\n\t\t\t}\n\t\t\tbreak;\n\t}\n\n\tif ( ! empty( $error ) ) {\n\t\t$value = get_option( $option );\n\t\tif ( function_exists( 'add_settings_error' ) ) {\n\t\t\tadd_settings_error( $option, \"invalid_{$option}\", $error );\n\t\t}\n\t}\n\n\t/**\n\t * Filter an option value following sanitization.\n\t *\n\t * @since 2.3.0\n\t * @since 4.3.0 Added the `$original_value` parameter.\n\t *\n\t * @param string $value          The sanitized option value.\n\t * @param string $option         The option name.\n\t * @param string $original_value The original value passed to the function.\n\t */\n\treturn apply_filters( \"sanitize_option_{$option}\", $value, $option, $original_value );\n}\n\n/**\n * Maps a function to all non-iterable elements of an array or an object.\n *\n * This is similar to `array_walk_recursive()` but acts upon objects too.\n *\n * @since 4.4.0\n *\n * @param mixed    $value    The array, object, or scalar.\n * @param callable $callback The function to map onto $value.\n * @return The value with the callback applied to all non-arrays and non-objects inside it.\n */\nfunction map_deep( $value, $callback ) {\n\tif ( is_array( $value ) ) {\n\t\tforeach ( $value as $index => $item ) {\n\t\t\t$value[ $index ] = map_deep( $item, $callback );\n\t\t}\n\t} elseif ( is_object( $value ) ) {\n\t\t$object_vars = get_object_vars( $value );\n\t\tforeach ( $object_vars as $property_name => $property_value ) {\n\t\t\t$value->$property_name = map_deep( $property_value, $callback );\n\t\t}\n\t} else {\n\t\t$value = call_user_func( $callback, $value );\n\t}\n\n\treturn $value;\n}\n\n/**\n * Parses a string into variables to be stored in an array.\n *\n * Uses {@link http://www.php.net/parse_str parse_str()} and stripslashes if\n * {@link http://www.php.net/magic_quotes magic_quotes_gpc} is on.\n *\n * @since 2.2.1\n *\n * @param string $string The string to be parsed.\n * @param array  $array  Variables will be stored in this array.\n */\nfunction wp_parse_str( $string, &$array ) {\n\tparse_str( $string, $array );\n\tif ( get_magic_quotes_gpc() )\n\t\t$array = stripslashes_deep( $array );\n\t/**\n\t * Filter the array of variables derived from a parsed string.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param array $array The array populated with variables.\n\t */\n\t$array = apply_filters( 'wp_parse_str', $array );\n}\n\n/**\n * Convert lone less than signs.\n *\n * KSES already converts lone greater than signs.\n *\n * @since 2.3.0\n *\n * @param string $text Text to be converted.\n * @return string Converted text.\n */\nfunction wp_pre_kses_less_than( $text ) {\n\treturn preg_replace_callback('%<[^>]*?((?=<)|>|$)%', 'wp_pre_kses_less_than_callback', $text);\n}\n\n/**\n * Callback function used by preg_replace.\n *\n * @since 2.3.0\n *\n * @param array $matches Populated by matches to preg_replace.\n * @return string The text returned after esc_html if needed.\n */\nfunction wp_pre_kses_less_than_callback( $matches ) {\n\tif ( false === strpos($matches[0], '>') )\n\t\treturn esc_html($matches[0]);\n\treturn $matches[0];\n}\n\n/**\n * WordPress implementation of PHP sprintf() with filters.\n *\n * @since 2.5.0\n * @link http://www.php.net/sprintf\n *\n * @param string $pattern   The string which formatted args are inserted.\n * @param mixed  $args ,... Arguments to be formatted into the $pattern string.\n * @return string The formatted string.\n */\nfunction wp_sprintf( $pattern ) {\n\t$args = func_get_args();\n\t$len = strlen($pattern);\n\t$start = 0;\n\t$result = '';\n\t$arg_index = 0;\n\twhile ( $len > $start ) {\n\t\t// Last character: append and break\n\t\tif ( strlen($pattern) - 1 == $start ) {\n\t\t\t$result .= substr($pattern, -1);\n\t\t\tbreak;\n\t\t}\n\n\t\t// Literal %: append and continue\n\t\tif ( substr($pattern, $start, 2) == '%%' ) {\n\t\t\t$start += 2;\n\t\t\t$result .= '%';\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Get fragment before next %\n\t\t$end = strpos($pattern, '%', $start + 1);\n\t\tif ( false === $end )\n\t\t\t$end = $len;\n\t\t$fragment = substr($pattern, $start, $end - $start);\n\n\t\t// Fragment has a specifier\n\t\tif ( $pattern[$start] == '%' ) {\n\t\t\t// Find numbered arguments or take the next one in order\n\t\t\tif ( preg_match('/^%(\\d+)\\$/', $fragment, $matches) ) {\n\t\t\t\t$arg = isset($args[$matches[1]]) ? $args[$matches[1]] : '';\n\t\t\t\t$fragment = str_replace(\"%{$matches[1]}$\", '%', $fragment);\n\t\t\t} else {\n\t\t\t\t++$arg_index;\n\t\t\t\t$arg = isset($args[$arg_index]) ? $args[$arg_index] : '';\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter a fragment from the pattern passed to wp_sprintf().\n\t\t\t *\n\t\t\t * If the fragment is unchanged, then sprintf() will be run on the fragment.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string $fragment A fragment from the pattern.\n\t\t\t * @param string $arg      The argument.\n\t\t\t */\n\t\t\t$_fragment = apply_filters( 'wp_sprintf', $fragment, $arg );\n\t\t\tif ( $_fragment != $fragment )\n\t\t\t\t$fragment = $_fragment;\n\t\t\telse\n\t\t\t\t$fragment = sprintf($fragment, strval($arg) );\n\t\t}\n\n\t\t// Append to result and move to next fragment\n\t\t$result .= $fragment;\n\t\t$start = $end;\n\t}\n\treturn $result;\n}\n\n/**\n * Localize list items before the rest of the content.\n *\n * The '%l' must be at the first characters can then contain the rest of the\n * content. The list items will have ', ', ', and', and ' and ' added depending\n * on the amount of list items in the $args parameter.\n *\n * @since 2.5.0\n *\n * @param string $pattern Content containing '%l' at the beginning.\n * @param array  $args    List items to prepend to the content and replace '%l'.\n * @return string Localized list items and rest of the content.\n */\nfunction wp_sprintf_l( $pattern, $args ) {\n\t// Not a match\n\tif ( substr($pattern, 0, 2) != '%l' )\n\t\treturn $pattern;\n\n\t// Nothing to work with\n\tif ( empty($args) )\n\t\treturn '';\n\n\t/**\n\t * Filter the translated delimiters used by wp_sprintf_l().\n\t * Placeholders (%s) are included to assist translators and then\n\t * removed before the array of strings reaches the filter.\n\t *\n\t * Please note: Ampersands and entities should be avoided here.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array $delimiters An array of translated delimiters.\n\t */\n\t$l = apply_filters( 'wp_sprintf_l', array(\n\t\t/* translators: used to join items in a list with more than 2 items */\n\t\t'between'          => sprintf( __('%s, %s'), '', '' ),\n\t\t/* translators: used to join last two items in a list with more than 2 times */\n\t\t'between_last_two' => sprintf( __('%s, and %s'), '', '' ),\n\t\t/* translators: used to join items in a list with only 2 items */\n\t\t'between_only_two' => sprintf( __('%s and %s'), '', '' ),\n\t) );\n\n\t$args = (array) $args;\n\t$result = array_shift($args);\n\tif ( count($args) == 1 )\n\t\t$result .= $l['between_only_two'] . array_shift($args);\n\t// Loop when more than two args\n\t$i = count($args);\n\twhile ( $i ) {\n\t\t$arg = array_shift($args);\n\t\t$i--;\n\t\tif ( 0 == $i )\n\t\t\t$result .= $l['between_last_two'] . $arg;\n\t\telse\n\t\t\t$result .= $l['between'] . $arg;\n\t}\n\treturn $result . substr($pattern, 2);\n}\n\n/**\n * Safely extracts not more than the first $count characters from html string.\n *\n * UTF-8, tags and entities safe prefix extraction. Entities inside will *NOT*\n * be counted as one character. For example &amp; will be counted as 4, &lt; as\n * 3, etc.\n *\n * @since 2.5.0\n *\n * @param string $str   String to get the excerpt from.\n * @param int    $count Maximum number of characters to take.\n * @param string $more  Optional. What to append if $str needs to be trimmed. Defaults to empty string.\n * @return string The excerpt.\n */\nfunction wp_html_excerpt( $str, $count, $more = null ) {\n\tif ( null === $more )\n\t\t$more = '';\n\t$str = wp_strip_all_tags( $str, true );\n\t$excerpt = mb_substr( $str, 0, $count );\n\t// remove part of an entity at the end\n\t$excerpt = preg_replace( '/&[^;\\s]{0,6}$/', '', $excerpt );\n\tif ( $str != $excerpt )\n\t\t$excerpt = trim( $excerpt ) . $more;\n\treturn $excerpt;\n}\n\n/**\n * Add a Base url to relative links in passed content.\n *\n * By default it supports the 'src' and 'href' attributes. However this can be\n * changed via the 3rd param.\n *\n * @since 2.7.0\n *\n * @global string $_links_add_base\n *\n * @param string $content String to search for links in.\n * @param string $base    The base URL to prefix to links.\n * @param array  $attrs   The attributes which should be processed.\n * @return string The processed content.\n */\nfunction links_add_base_url( $content, $base, $attrs = array('src', 'href') ) {\n\tglobal $_links_add_base;\n\t$_links_add_base = $base;\n\t$attrs = implode('|', (array)$attrs);\n\treturn preg_replace_callback( \"!($attrs)=(['\\\"])(.+?)\\\\2!i\", '_links_add_base', $content );\n}\n\n/**\n * Callback to add a base url to relative links in passed content.\n *\n * @since 2.7.0\n * @access private\n *\n * @global string $_links_add_base\n *\n * @param string $m The matched link.\n * @return string The processed link.\n */\nfunction _links_add_base( $m ) {\n\tglobal $_links_add_base;\n\t//1 = attribute name  2 = quotation mark  3 = URL\n\treturn $m[1] . '=' . $m[2] .\n\t\t( preg_match( '#^(\\w{1,20}):#', $m[3], $protocol ) && in_array( $protocol[1], wp_allowed_protocols() ) ?\n\t\t\t$m[3] :\n\t\t\tWP_Http::make_absolute_url( $m[3], $_links_add_base )\n\t\t)\n\t\t. $m[2];\n}\n\n/**\n * Adds a Target attribute to all links in passed content.\n *\n * This function by default only applies to `<a>` tags, however this can be\n * modified by the 3rd param.\n *\n * *NOTE:* Any current target attributed will be stripped and replaced.\n *\n * @since 2.7.0\n *\n * @global string $_links_add_target\n *\n * @param string $content String to search for links in.\n * @param string $target  The Target to add to the links.\n * @param array  $tags    An array of tags to apply to.\n * @return string The processed content.\n */\nfunction links_add_target( $content, $target = '_blank', $tags = array('a') ) {\n\tglobal $_links_add_target;\n\t$_links_add_target = $target;\n\t$tags = implode('|', (array)$tags);\n\treturn preg_replace_callback( \"!<($tags)([^>]*)>!i\", '_links_add_target', $content );\n}\n\n/**\n * Callback to add a target attribute to all links in passed content.\n *\n * @since 2.7.0\n * @access private\n *\n * @global string $_links_add_target\n *\n * @param string $m The matched link.\n * @return string The processed link.\n */\nfunction _links_add_target( $m ) {\n\tglobal $_links_add_target;\n\t$tag = $m[1];\n\t$link = preg_replace('|( target=([\\'\"])(.*?)\\2)|i', '', $m[2]);\n\treturn '<' . $tag . $link . ' target=\"' . esc_attr( $_links_add_target ) . '\">';\n}\n\n/**\n * Normalize EOL characters and strip duplicate whitespace.\n *\n * @since 2.7.0\n *\n * @param string $str The string to normalize.\n * @return string The normalized string.\n */\nfunction normalize_whitespace( $str ) {\n\t$str  = trim( $str );\n\t$str  = str_replace( \"\\r\", \"\\n\", $str );\n\t$str  = preg_replace( array( '/\\n+/', '/[ \\t]+/' ), array( \"\\n\", ' ' ), $str );\n\treturn $str;\n}\n\n/**\n * Properly strip all HTML tags including script and style\n *\n * This differs from strip_tags() because it removes the contents of\n * the `<script>` and `<style>` tags. E.g. `strip_tags( '<script>something</script>' )`\n * will return 'something'. wp_strip_all_tags will return ''\n *\n * @since 2.9.0\n *\n * @param string $string        String containing HTML tags\n * @param bool   $remove_breaks Optional. Whether to remove left over line breaks and white space chars\n * @return string The processed string.\n */\nfunction wp_strip_all_tags($string, $remove_breaks = false) {\n\t$string = preg_replace( '@<(script|style)[^>]*?>.*?</\\\\1>@si', '', $string );\n\t$string = strip_tags($string);\n\n\tif ( $remove_breaks )\n\t\t$string = preg_replace('/[\\r\\n\\t ]+/', ' ', $string);\n\n\treturn trim( $string );\n}\n\n/**\n * Sanitize a string from user input or from the db\n *\n * check for invalid UTF-8,\n * Convert single < characters to entity,\n * strip all tags,\n * remove line breaks, tabs and extra white space,\n * strip octets.\n *\n * @since 2.9.0\n *\n * @param string $str\n * @return string\n */\nfunction sanitize_text_field( $str ) {\n\t$filtered = wp_check_invalid_utf8( $str );\n\n\tif ( strpos($filtered, '<') !== false ) {\n\t\t$filtered = wp_pre_kses_less_than( $filtered );\n\t\t// This will strip extra whitespace for us.\n\t\t$filtered = wp_strip_all_tags( $filtered, true );\n\t} else {\n\t\t$filtered = trim( preg_replace('/[\\r\\n\\t ]+/', ' ', $filtered) );\n\t}\n\n\t$found = false;\n\twhile ( preg_match('/%[a-f0-9]{2}/i', $filtered, $match) ) {\n\t\t$filtered = str_replace($match[0], '', $filtered);\n\t\t$found = true;\n\t}\n\n\tif ( $found ) {\n\t\t// Strip out the whitespace that may now exist after removing the octets.\n\t\t$filtered = trim( preg_replace('/ +/', ' ', $filtered) );\n\t}\n\n\t/**\n\t * Filter a sanitized text field string.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $filtered The sanitized string.\n\t * @param string $str      The string prior to being sanitized.\n\t */\n\treturn apply_filters( 'sanitize_text_field', $filtered, $str );\n}\n\n/**\n * i18n friendly version of basename()\n *\n * @since 3.1.0\n *\n * @param string $path   A path.\n * @param string $suffix If the filename ends in suffix this will also be cut off.\n * @return string\n */\nfunction wp_basename( $path, $suffix = '' ) {\n\treturn urldecode( basename( str_replace( array( '%2F', '%5C' ), '/', urlencode( $path ) ), $suffix ) );\n}\n\n/**\n * Forever eliminate \"Wordpress\" from the planet (or at least the little bit we can influence).\n *\n * Violating our coding standards for a good function name.\n *\n * @since 3.0.0\n *\n * @staticvar string|false $dblq\n */\nfunction capital_P_dangit( $text ) {\n\t// Simple replacement for titles\n\t$current_filter = current_filter();\n\tif ( 'the_title' === $current_filter || 'wp_title' === $current_filter )\n\t\treturn str_replace( 'Wordpress', 'WordPress', $text );\n\t// Still here? Use the more judicious replacement\n\tstatic $dblq = false;\n\tif ( false === $dblq ) {\n\t\t$dblq = _x( '&#8220;', 'opening curly double quote' );\n\t}\n\treturn str_replace(\n\t\tarray( ' Wordpress', '&#8216;Wordpress', $dblq . 'Wordpress', '>Wordpress', '(Wordpress' ),\n\t\tarray( ' WordPress', '&#8216;WordPress', $dblq . 'WordPress', '>WordPress', '(WordPress' ),\n\t$text );\n}\n\n/**\n * Sanitize a mime type\n *\n * @since 3.1.3\n *\n * @param string $mime_type Mime type\n * @return string Sanitized mime type\n */\nfunction sanitize_mime_type( $mime_type ) {\n\t$sani_mime_type = preg_replace( '/[^-+*.a-zA-Z0-9\\/]/', '', $mime_type );\n\t/**\n\t * Filter a mime type following sanitization.\n\t *\n\t * @since 3.1.3\n\t *\n\t * @param string $sani_mime_type The sanitized mime type.\n\t * @param string $mime_type      The mime type prior to sanitization.\n\t */\n\treturn apply_filters( 'sanitize_mime_type', $sani_mime_type, $mime_type );\n}\n\n/**\n * Sanitize space or carriage return separated URLs that are used to send trackbacks.\n *\n * @since 3.4.0\n *\n * @param string $to_ping Space or carriage return separated URLs\n * @return string URLs starting with the http or https protocol, separated by a carriage return.\n */\nfunction sanitize_trackback_urls( $to_ping ) {\n\t$urls_to_ping = preg_split( '/[\\r\\n\\t ]/', trim( $to_ping ), -1, PREG_SPLIT_NO_EMPTY );\n\tforeach ( $urls_to_ping as $k => $url ) {\n\t\tif ( !preg_match( '#^https?://.#i', $url ) )\n\t\t\tunset( $urls_to_ping[$k] );\n\t}\n\t$urls_to_ping = array_map( 'esc_url_raw', $urls_to_ping );\n\t$urls_to_ping = implode( \"\\n\", $urls_to_ping );\n\t/**\n\t * Filter a list of trackback URLs following sanitization.\n\t *\n\t * The string returned here consists of a space or carriage return-delimited list\n\t * of trackback URLs.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $urls_to_ping Sanitized space or carriage return separated URLs.\n\t * @param string $to_ping      Space or carriage return separated URLs before sanitization.\n\t */\n\treturn apply_filters( 'sanitize_trackback_urls', $urls_to_ping, $to_ping );\n}\n\n/**\n * Add slashes to a string or array of strings.\n *\n * This should be used when preparing data for core API that expects slashed data.\n * This should not be used to escape data going directly into an SQL query.\n *\n * @since 3.6.0\n *\n * @param string|array $value String or array of strings to slash.\n * @return string|array Slashed $value\n */\nfunction wp_slash( $value ) {\n\tif ( is_array( $value ) ) {\n\t\tforeach ( $value as $k => $v ) {\n\t\t\tif ( is_array( $v ) ) {\n\t\t\t\t$value[$k] = wp_slash( $v );\n\t\t\t} else {\n\t\t\t\t$value[$k] = addslashes( $v );\n\t\t\t}\n\t\t}\n\t} else {\n\t\t$value = addslashes( $value );\n\t}\n\n\treturn $value;\n}\n\n/**\n * Remove slashes from a string or array of strings.\n *\n * This should be used to remove slashes from data passed to core API that\n * expects data to be unslashed.\n *\n * @since 3.6.0\n *\n * @param string|array $value String or array of strings to unslash.\n * @return string|array Unslashed $value\n */\nfunction wp_unslash( $value ) {\n\treturn stripslashes_deep( $value );\n}\n\n/**\n * Extract and return the first URL from passed content.\n *\n * @since 3.6.0\n *\n * @param string $content A string which might contain a URL.\n * @return string|false The found URL.\n */\nfunction get_url_in_content( $content ) {\n\tif ( empty( $content ) ) {\n\t\treturn false;\n\t}\n\n\tif ( preg_match( '/<a\\s[^>]*?href=([\\'\"])(.+?)\\1/is', $content, $matches ) ) {\n\t\treturn esc_url_raw( $matches[2] );\n\t}\n\n\treturn false;\n}\n\n/**\n * Returns the regexp for common whitespace characters.\n *\n * By default, spaces include new lines, tabs, nbsp entities, and the UTF-8 nbsp.\n * This is designed to replace the PCRE \\s sequence.  In ticket #22692, that\n * sequence was found to be unreliable due to random inclusion of the A0 byte.\n *\n * @since 4.0.0\n *\n * @staticvar string $spaces\n *\n * @return string The spaces regexp.\n */\nfunction wp_spaces_regexp() {\n\tstatic $spaces = '';\n\n\tif ( empty( $spaces ) ) {\n\t\t/**\n\t\t * Filter the regexp for common whitespace characters.\n\t\t *\n\t\t * This string is substituted for the \\s sequence as needed in regular\n\t\t * expressions. For websites not written in English, different characters\n\t\t * may represent whitespace. For websites not encoded in UTF-8, the 0xC2 0xA0\n\t\t * sequence may not be in use.\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @param string $spaces Regexp pattern for matching common whitespace characters.\n\t\t */\n\t\t$spaces = apply_filters( 'wp_spaces_regexp', '[\\r\\n\\t ]|\\xC2\\xA0|&nbsp;' );\n\t}\n\n\treturn $spaces;\n}\n\n/**\n * Print the important emoji-related styles.\n *\n * @since 4.2.0\n *\n * @staticvar bool $printed\n */\nfunction print_emoji_styles() {\n\tstatic $printed = false;\n\n\tif ( $printed ) {\n\t\treturn;\n\t}\n\n\t$printed = true;\n?>\n<style type=\"text/css\">\nimg.wp-smiley,\nimg.emoji {\n\tdisplay: inline !important;\n\tborder: none !important;\n\tbox-shadow: none !important;\n\theight: 1em !important;\n\twidth: 1em !important;\n\tmargin: 0 .07em !important;\n\tvertical-align: -0.1em !important;\n\tbackground: none !important;\n\tpadding: 0 !important;\n}\n</style>\n<?php\n}\n\n/**\n *\n * @global string $wp_version\n * @staticvar bool $printed\n */\nfunction print_emoji_detection_script() {\n\tglobal $wp_version;\n\tstatic $printed = false;\n\n\tif ( $printed ) {\n\t\treturn;\n\t}\n\n\t$printed = true;\n\n\t$settings = array(\n\t\t/**\n\t\t * Filter the URL where emoji images are hosted.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param string The emoji base URL.\n\t\t */\n\t\t'baseUrl' => apply_filters( 'emoji_url', 'https://s.w.org/images/core/emoji/72x72/' ),\n\n\t\t/**\n\t\t * Filter the extension of the emoji files.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param string The emoji extension. Default .png.\n\t\t */\n\t\t'ext' => apply_filters( 'emoji_ext', '.png' ),\n\t);\n\n\t$version = 'ver=' . $wp_version;\n\n\tif ( SCRIPT_DEBUG ) {\n\t\t$settings['source'] = array(\n\t\t\t/** This filter is documented in wp-includes/class.wp-scripts.php */\n\t\t\t'wpemoji' => apply_filters( 'script_loader_src', includes_url( \"js/wp-emoji.js?$version\" ), 'wpemoji' ),\n\t\t\t/** This filter is documented in wp-includes/class.wp-scripts.php */\n\t\t\t'twemoji' => apply_filters( 'script_loader_src', includes_url( \"js/twemoji.js?$version\" ), 'twemoji' ),\n\t\t);\n\n\t\t?>\n\t\t<script type=\"text/javascript\">\n\t\t\twindow._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;\n\t\t\t<?php readfile( ABSPATH . WPINC . \"/js/wp-emoji-loader.js\" ); ?>\n\t\t</script>\n\t\t<?php\n\t} else {\n\t\t$settings['source'] = array(\n\t\t\t/** This filter is documented in wp-includes/class.wp-scripts.php */\n\t\t\t'concatemoji' => apply_filters( 'script_loader_src', includes_url( \"js/wp-emoji-release.min.js?$version\" ), 'concatemoji' ),\n\t\t);\n\n\t\t/*\n\t\t * If you're looking at a src version of this file, you'll see an \"include\"\n\t\t * statement below. This is used by the `grunt build` process to directly\n\t\t * include a minified version of wp-emoji-loader.js, instead of using the\n\t\t * readfile() method from above.\n\t\t *\n\t\t * If you're looking at a build version of this file, you'll see a string of\n\t\t * minified JavaScript. If you need to debug it, please turn on SCRIPT_DEBUG\n\t\t * and edit wp-emoji-loader.js directly.\n\t\t */\n\t\t?>\n\t\t<script type=\"text/javascript\">\n\t\t\twindow._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;\n\t\t\t!function(a,b,c){function d(a){var c,d=b.createElement(\"canvas\"),e=d.getContext&&d.getContext(\"2d\"),f=String.fromCharCode;return e&&e.fillText?(e.textBaseline=\"top\",e.font=\"600 32px Arial\",\"flag\"===a?(e.fillText(f(55356,56806,55356,56826),0,0),d.toDataURL().length>3e3):\"diversity\"===a?(e.fillText(f(55356,57221),0,0),c=e.getImageData(16,16,1,1).data.toString(),e.fillText(f(55356,57221,55356,57343),0,0),c!==e.getImageData(16,16,1,1).data.toString()):(\"simple\"===a?e.fillText(f(55357,56835),0,0):e.fillText(f(55356,57135),0,0),0!==e.getImageData(16,16,1,1).data[0])):!1}function e(a){var c=b.createElement(\"script\");c.src=a,c.type=\"text/javascript\",b.getElementsByTagName(\"head\")[0].appendChild(c)}var f,g;c.supports={simple:d(\"simple\"),flag:d(\"flag\"),unicode8:d(\"unicode8\"),diversity:d(\"diversity\")},c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.simple&&c.supports.flag&&c.supports.unicode8&&c.supports.diversity||(g=function(){c.readyCallback()},b.addEventListener?(b.addEventListener(\"DOMContentLoaded\",g,!1),a.addEventListener(\"load\",g,!1)):(a.attachEvent(\"onload\",g),b.attachEvent(\"onreadystatechange\",function(){\"complete\"===b.readyState&&c.readyCallback()})),f=c.source||{},f.concatemoji?e(f.concatemoji):f.wpemoji&&f.twemoji&&(e(f.twemoji),e(f.wpemoji)))}(window,document,window._wpemojiSettings);\n\t\t</script>\n\t\t<?php\n\t}\n}\n\n/**\n * Convert any 4 byte emoji in a string to their equivalent HTML entity.\n *\n * Currently, only Unicode 7 emoji are supported. Skin tone modifiers are allowed,\n * all other Unicode 8 emoji will be added when the spec is finalised.\n *\n * This allows us to store emoji in a DB using the utf8 character set.\n *\n * @since 4.2.0\n *\n * @param string $content The content to encode.\n * @return string The encoded content.\n */\nfunction wp_encode_emoji( $content ) {\n\tif ( function_exists( 'mb_convert_encoding' ) ) {\n\t\t$regex = '/(\n\t\t     \\x23\\xE2\\x83\\xA3               # Digits\n\t\t     [\\x30-\\x39]\\xE2\\x83\\xA3\n\t\t   | \\xF0\\x9F[\\x85-\\x88][\\xA6-\\xBF] # Enclosed characters\n\t\t   | \\xF0\\x9F[\\x8C-\\x97][\\x80-\\xBF] # Misc\n\t\t   | \\xF0\\x9F\\x98[\\x80-\\xBF]        # Smilies\n\t\t   | \\xF0\\x9F\\x99[\\x80-\\x8F]\n\t\t   | \\xF0\\x9F\\x9A[\\x80-\\xBF]        # Transport and map symbols\n\t\t)/x';\n\n\t\t$matches = array();\n\t\tif ( preg_match_all( $regex, $content, $matches ) ) {\n\t\t\tif ( ! empty( $matches[1] ) ) {\n\t\t\t\tforeach ( $matches[1] as $emoji ) {\n\t\t\t\t\t/*\n\t\t\t\t\t * UTF-32's hex encoding is the same as HTML's hex encoding.\n\t\t\t\t\t * So, by converting the emoji from UTF-8 to UTF-32, we magically\n\t\t\t\t\t * get the correct hex encoding.\n\t\t\t\t\t */\n\t\t\t\t\t$unpacked = unpack( 'H*', mb_convert_encoding( $emoji, 'UTF-32', 'UTF-8' ) );\n\t\t\t\t\tif ( isset( $unpacked[1] ) ) {\n\t\t\t\t\t\t$entity = '&#x' . ltrim( $unpacked[1], '0' ) . ';';\n\t\t\t\t\t\t$content = str_replace( $emoji, $entity, $content );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $content;\n}\n\n/**\n * Convert emoji to a static img element.\n *\n * @since 4.2.0\n *\n * @param string $text The content to encode.\n * @return string The encoded content.\n */\nfunction wp_staticize_emoji( $text ) {\n\t$text = wp_encode_emoji( $text );\n\n\t/** This filter is documented in wp-includes/formatting.php */\n\t$cdn_url = apply_filters( 'emoji_url', 'https://s.w.org/images/core/emoji/72x72/' );\n\n\t/** This filter is documented in wp-includes/formatting.php */\n\t$ext = apply_filters( 'emoji_ext', '.png' );\n\n\t$output = '';\n\t/*\n\t * HTML loop taken from smiley function, which was taken from texturize function.\n\t * It'll never be consolidated.\n\t *\n\t * First, capture the tags as well as in between.\n\t */\n\t$textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE );\n\t$stop = count( $textarr );\n\n\t// Ignore processing of specific tags.\n\t$tags_to_ignore = 'code|pre|style|script|textarea';\n\t$ignore_block_element = '';\n\n\tfor ( $i = 0; $i < $stop; $i++ ) {\n\t\t$content = $textarr[$i];\n\n\t\t// If we're in an ignore block, wait until we find its closing tag.\n\t\tif ( '' == $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')>/', $content, $matches ) )  {\n\t\t\t$ignore_block_element = $matches[1];\n\t\t}\n\n\t\t// If it's not a tag and not in ignore block.\n\t\tif ( '' ==  $ignore_block_element && strlen( $content ) > 0 && '<' != $content[0] ) {\n\t\t\t$matches = array();\n\t\t\tif ( preg_match_all( '/(&#x1f1(e[6-9a-f]|f[0-9a-f]);){2}/', $content, $matches ) ) {\n\t\t\t\tif ( ! empty( $matches[0] ) ) {\n\t\t\t\t\tforeach ( $matches[0] as $flag ) {\n\t\t\t\t\t\t$chars = str_replace( array( '&#x', ';'), '', $flag );\n\n\t\t\t\t\t\tlist( $char1, $char2 ) = str_split( $chars, 5 );\n\t\t\t\t\t\t$entity = sprintf( '<img src=\"%s\" alt=\"%s\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" />', $cdn_url . $char1 . '-' . $char2 . $ext, html_entity_decode( $flag ) );\n\n\t\t\t\t\t\t$content = str_replace( $flag, $entity, $content );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Loosely match the Emoji Unicode range.\n\t\t\t$regex = '/(&#x[2-3][0-9a-f]{3};|&#x1f[1-6][0-9a-f]{2};)/';\n\n\t\t\t$matches = array();\n\t\t\tif ( preg_match_all( $regex, $content, $matches ) ) {\n\t\t\t\tif ( ! empty( $matches[1] ) ) {\n\t\t\t\t\tforeach ( $matches[1] as $emoji ) {\n\t\t\t\t\t\t$char = str_replace( array( '&#x', ';'), '', $emoji );\n\t\t\t\t\t\t$entity = sprintf( '<img src=\"%s\" alt=\"%s\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" />', $cdn_url . $char . $ext, html_entity_decode( $emoji ) );\n\n\t\t\t\t\t\t$content = str_replace( $emoji, $entity, $content );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Did we exit ignore block.\n\t\tif ( '' != $ignore_block_element && '</' . $ignore_block_element . '>' == $content )  {\n\t\t\t$ignore_block_element = '';\n\t\t}\n\n\t\t$output .= $content;\n\t}\n\n\treturn $output;\n}\n\n/**\n * Convert emoji in emails into static images.\n *\n * @since 4.2.0\n *\n * @param array $mail The email data array.\n * @return array The email data array, with emoji in the message staticized.\n */\nfunction wp_staticize_emoji_for_email( $mail ) {\n\tif ( ! isset( $mail['message'] ) ) {\n\t\treturn $mail;\n\t}\n\n\t/*\n\t * We can only transform the emoji into images if it's a text/html email.\n\t * To do that, here's a cut down version of the same process that happens\n\t * in wp_mail() - get the Content-Type from the headers, if there is one,\n\t * then pass it through the wp_mail_content_type filter, in case a plugin\n\t * is handling changing the Content-Type.\n\t */\n\t$headers = array();\n\tif ( isset( $mail['headers'] ) ) {\n\t\tif ( is_array( $mail['headers'] ) ) {\n\t\t\t$headers = $mail['headers'];\n\t\t} else {\n\t\t\t$headers = explode( \"\\n\", str_replace( \"\\r\\n\", \"\\n\", $mail['headers'] ) );\n\t\t}\n\t}\n\n\tforeach ( $headers as $header ) {\n\t\tif ( strpos($header, ':') === false ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Explode them out.\n\t\tlist( $name, $content ) = explode( ':', trim( $header ), 2 );\n\n\t\t// Cleanup crew.\n\t\t$name    = trim( $name    );\n\t\t$content = trim( $content );\n\n\t\tif ( 'content-type' === strtolower( $name ) ) {\n\t\t\tif ( strpos( $content, ';' ) !== false ) {\n\t\t\t\tlist( $type, $charset ) = explode( ';', $content );\n\t\t\t\t$content_type = trim( $type );\n\t\t\t} else {\n\t\t\t\t$content_type = trim( $content );\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Set Content-Type if we don't have a content-type from the input headers.\n\tif ( ! isset( $content_type ) ) {\n\t\t$content_type = 'text/plain';\n\t}\n\n\t/** This filter is documented in wp-includes/pluggable.php */\n\t$content_type = apply_filters( 'wp_mail_content_type', $content_type );\n\n\tif ( 'text/html' === $content_type ) {\n\t\t$mail['message'] = wp_staticize_emoji( $mail['message'] );\n\t}\n\n\treturn $mail;\n}\n\n/**\n * Shorten an URL, to be used as link text.\n *\n * @since 1.2.0\n * @since 4.4.0 Moved to wp-includes/formatting.php from wp-admin/includes/misc.php and added $length param.\n *\n * @param string $url    URL to shorten.\n * @param int    $length Optional. Maximum length of the shortened URL. Default 35 characters.\n * @return string Shortened URL.\n */\nfunction url_shorten( $url, $length = 35 ) {\n\t$stripped = str_replace( array( 'https://', 'http://', 'www.' ), '', $url );\n\t$short_url = untrailingslashit( $stripped );\n\n\tif ( strlen( $short_url ) > $length ) {\n\t\t$short_url = substr( $short_url, 0, $length - 3 ) . '&hellip;';\n\t}\n\treturn $short_url;\n}\n\n/**\n * 4.4.x hotfix for hidden configure links on admin dashboard.\n *\n * @ignore\n */\nfunction _wp_441_dashboard_display_configure_links_css() { \n\techo '<style type=\"text/css\">\n\t\t.postbox .button-link .edit-box { display: none; }\n\t\t.wp-admin .edit-box { display: block; opacity: 0; }\n\t\t.hndle:hover .edit-box, .edit-box:focus { opacity: 1; }\n\t\t#dashboard-widgets h2 a { text-decoration: underline; }\n\t\t#dashboard-widgets .hndle .postbox-title-action { float: right; line-height: 1.2; }\n\t</style>';\n}\nadd_action( 'admin_print_styles-index.php', '_wp_441_dashboard_display_configure_links_css' );"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/functions.php",
    "content": "<?php\n/**\n * Main WordPress API\n *\n * @package WordPress\n */\n\nrequire( ABSPATH . WPINC . '/option.php' );\n\n/**\n * Convert given date string into a different format.\n *\n * $format should be either a PHP date format string, e.g. 'U' for a Unix\n * timestamp, or 'G' for a Unix timestamp assuming that $date is GMT.\n *\n * If $translate is true then the given date and format string will\n * be passed to date_i18n() for translation.\n *\n * @since 0.71\n *\n * @param string $format    Format of the date to return.\n * @param string $date      Date string to convert.\n * @param bool   $translate Whether the return date should be translated. Default true.\n * @return string|int|bool Formatted date string or Unix timestamp. False if $date is empty.\n */\nfunction mysql2date( $format, $date, $translate = true ) {\n\tif ( empty( $date ) )\n\t\treturn false;\n\n\tif ( 'G' == $format )\n\t\treturn strtotime( $date . ' +0000' );\n\n\t$i = strtotime( $date );\n\n\tif ( 'U' == $format )\n\t\treturn $i;\n\n\tif ( $translate )\n\t\treturn date_i18n( $format, $i );\n\telse\n\t\treturn date( $format, $i );\n}\n\n/**\n * Retrieve the current time based on specified type.\n *\n * The 'mysql' type will return the time in the format for MySQL DATETIME field.\n * The 'timestamp' type will return the current timestamp.\n * Other strings will be interpreted as PHP date formats (e.g. 'Y-m-d').\n *\n * If $gmt is set to either '1' or 'true', then both types will use GMT time.\n * if $gmt is false, the output is adjusted with the GMT offset in the WordPress option.\n *\n * @since 1.0.0\n *\n * @param string   $type Type of time to retrieve. Accepts 'mysql', 'timestamp', or PHP date\n *                       format string (e.g. 'Y-m-d').\n * @param int|bool $gmt  Optional. Whether to use GMT timezone. Default false.\n * @return int|string Integer if $type is 'timestamp', string otherwise.\n */\nfunction current_time( $type, $gmt = 0 ) {\n\tswitch ( $type ) {\n\t\tcase 'mysql':\n\t\t\treturn ( $gmt ) ? gmdate( 'Y-m-d H:i:s' ) : gmdate( 'Y-m-d H:i:s', ( time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) ) );\n\t\tcase 'timestamp':\n\t\t\treturn ( $gmt ) ? time() : time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );\n\t\tdefault:\n\t\t\treturn ( $gmt ) ? date( $type ) : date( $type, time() + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) );\n\t}\n}\n\n/**\n * Retrieve the date in localized format, based on timestamp.\n *\n * If the locale specifies the locale month and weekday, then the locale will\n * take over the format for the date. If it isn't, then the date format string\n * will be used instead.\n *\n * @since 0.71\n *\n * @global WP_Locale $wp_locale\n *\n * @param string   $dateformatstring Format to display the date.\n * @param bool|int $unixtimestamp    Optional. Unix timestamp. Default false.\n * @param bool     $gmt              Optional. Whether to use GMT timezone. Default false.\n *\n * @return string The date, translated if locale specifies it.\n */\nfunction date_i18n( $dateformatstring, $unixtimestamp = false, $gmt = false ) {\n\tglobal $wp_locale;\n\t$i = $unixtimestamp;\n\n\tif ( false === $i ) {\n\t\tif ( ! $gmt )\n\t\t\t$i = current_time( 'timestamp' );\n\t\telse\n\t\t\t$i = time();\n\t\t// we should not let date() interfere with our\n\t\t// specially computed timestamp\n\t\t$gmt = true;\n\t}\n\n\t/*\n\t * Store original value for language with untypical grammars.\n\t * See https://core.trac.wordpress.org/ticket/9396\n\t */\n\t$req_format = $dateformatstring;\n\n\t$datefunc = $gmt? 'gmdate' : 'date';\n\n\tif ( ( !empty( $wp_locale->month ) ) && ( !empty( $wp_locale->weekday ) ) ) {\n\t\t$datemonth = $wp_locale->get_month( $datefunc( 'm', $i ) );\n\t\t$datemonth_abbrev = $wp_locale->get_month_abbrev( $datemonth );\n\t\t$dateweekday = $wp_locale->get_weekday( $datefunc( 'w', $i ) );\n\t\t$dateweekday_abbrev = $wp_locale->get_weekday_abbrev( $dateweekday );\n\t\t$datemeridiem = $wp_locale->get_meridiem( $datefunc( 'a', $i ) );\n\t\t$datemeridiem_capital = $wp_locale->get_meridiem( $datefunc( 'A', $i ) );\n\t\t$dateformatstring = ' '.$dateformatstring;\n\t\t$dateformatstring = preg_replace( \"/([^\\\\\\])D/\", \"\\\\1\" . backslashit( $dateweekday_abbrev ), $dateformatstring );\n\t\t$dateformatstring = preg_replace( \"/([^\\\\\\])F/\", \"\\\\1\" . backslashit( $datemonth ), $dateformatstring );\n\t\t$dateformatstring = preg_replace( \"/([^\\\\\\])l/\", \"\\\\1\" . backslashit( $dateweekday ), $dateformatstring );\n\t\t$dateformatstring = preg_replace( \"/([^\\\\\\])M/\", \"\\\\1\" . backslashit( $datemonth_abbrev ), $dateformatstring );\n\t\t$dateformatstring = preg_replace( \"/([^\\\\\\])a/\", \"\\\\1\" . backslashit( $datemeridiem ), $dateformatstring );\n\t\t$dateformatstring = preg_replace( \"/([^\\\\\\])A/\", \"\\\\1\" . backslashit( $datemeridiem_capital ), $dateformatstring );\n\n\t\t$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 );\n\t}\n\t$timezone_formats = array( 'P', 'I', 'O', 'T', 'Z', 'e' );\n\t$timezone_formats_re = implode( '|', $timezone_formats );\n\tif ( preg_match( \"/$timezone_formats_re/\", $dateformatstring ) ) {\n\t\t$timezone_string = get_option( 'timezone_string' );\n\t\tif ( $timezone_string ) {\n\t\t\t$timezone_object = timezone_open( $timezone_string );\n\t\t\t$date_object = date_create( null, $timezone_object );\n\t\t\tforeach ( $timezone_formats as $timezone_format ) {\n\t\t\t\tif ( false !== strpos( $dateformatstring, $timezone_format ) ) {\n\t\t\t\t\t$formatted = date_format( $date_object, $timezone_format );\n\t\t\t\t\t$dateformatstring = ' '.$dateformatstring;\n\t\t\t\t\t$dateformatstring = preg_replace( \"/([^\\\\\\])$timezone_format/\", \"\\\\1\" . backslashit( $formatted ), $dateformatstring );\n\t\t\t\t\t$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) -1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t$j = @$datefunc( $dateformatstring, $i );\n\n\t/**\n\t * Filter the date formatted based on the locale.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $j          Formatted date string.\n\t * @param string $req_format Format to display the date.\n\t * @param int    $i          Unix timestamp.\n\t * @param bool   $gmt        Whether to convert to GMT for time. Default false.\n\t */\n\t$j = apply_filters( 'date_i18n', $j, $req_format, $i, $gmt );\n\treturn $j;\n}\n\n/**\n * Determines if the date should be declined.\n *\n * If the locale specifies that month names require a genitive case in certain\n * formats (like 'j F Y'), the month name will be replaced with a correct form.\n *\n * @since 4.4.0\n *\n * @param string $date Formatted date string.\n * @return string The date, declined if locale specifies it.\n */\nfunction wp_maybe_decline_date( $date ) {\n\tglobal $wp_locale;\n\n\t// i18n functions are not available in SHORTINIT mode\n\tif ( ! function_exists( '_x' ) ) {\n\t\treturn $date;\n\t}\n\n\t/* translators: If months in your language require a genitive case,\n\t * translate this to 'on'. Do not translate into your own language.\n\t */\n\tif ( 'on' === _x( 'off', 'decline months names: on or off' ) ) {\n\t\t// Match a format like 'j F Y' or 'j. F'\n\t\tif ( @preg_match( '#^\\d{1,2}\\.? \\w+#u', $date ) ) {\n\t\t\t$months = $wp_locale->month;\n\n\t\t\tforeach ( $months as $key => $month ) {\n\t\t\t\t$months[ $key ] = '#' . $month . '#';\n\t\t\t}\n\n\t\t\t$date = preg_replace( $months, $wp_locale->month_genitive, $date );\n\t\t}\n\t}\n\n\t// Used for locale-specific rules\n\t$locale = get_locale();\n\n\tif ( 'ca' === $locale ) {\n\t\t// \" de abril| de agost| de octubre...\" -> \" d'abril| d'agost| d'octubre...\"\n\t\t$date = preg_replace( '# de ([ao])#i', \" d'\\\\1\", $date );\n\t}\n\n\treturn $date;\n}\n\n/**\n * Convert integer number to format based on the locale.\n *\n * @since 2.3.0\n *\n * @global WP_Locale $wp_locale\n *\n * @param int $number   The number to convert based on locale.\n * @param int $decimals Optional. Precision of the number of decimal places. Default 0.\n * @return string Converted number in string format.\n */\nfunction number_format_i18n( $number, $decimals = 0 ) {\n\tglobal $wp_locale;\n\n\tif ( isset( $wp_locale ) ) {\n\t\t$formatted = number_format( $number, absint( $decimals ), $wp_locale->number_format['decimal_point'], $wp_locale->number_format['thousands_sep'] );\n\t} else {\n\t\t$formatted = number_format( $number, absint( $decimals ) );\n\t}\n\n\t/**\n\t * Filter the number formatted based on the locale.\n\t *\n\t * @since  2.8.0\n\t *\n\t * @param string $formatted Converted number in string format.\n\t */\n\treturn apply_filters( 'number_format_i18n', $formatted );\n}\n\n/**\n * Convert number of bytes largest unit bytes will fit into.\n *\n * It is easier to read 1 kB than 1024 bytes and 1 MB than 1048576 bytes. Converts\n * number of bytes to human readable number by taking the number of that unit\n * that the bytes will go into it. Supports TB value.\n *\n * Please note that integers in PHP are limited to 32 bits, unless they are on\n * 64 bit architecture, then they have 64 bit size. If you need to place the\n * larger size then what PHP integer type will hold, then use a string. It will\n * be converted to a double, which should always have 64 bit length.\n *\n * Technically the correct unit names for powers of 1024 are KiB, MiB etc.\n *\n * @since 2.3.0\n *\n * @param int|string $bytes    Number of bytes. Note max integer size for integers.\n * @param int        $decimals Optional. Precision of number of decimal places. Default 0.\n * @return string|false False on failure. Number string on success.\n */\nfunction size_format( $bytes, $decimals = 0 ) {\n\t$quant = array(\n\t\t'TB' => TB_IN_BYTES,\n\t\t'GB' => GB_IN_BYTES,\n\t\t'MB' => MB_IN_BYTES,\n\t\t'kB' => KB_IN_BYTES,\n\t\t'B'  => 1,\n\t);\n\n\tforeach ( $quant as $unit => $mag ) {\n\t\tif ( doubleval( $bytes ) >= $mag ) {\n\t\t\treturn number_format_i18n( $bytes / $mag, $decimals ) . ' ' . $unit;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Get the week start and end from the datetime or date string from MySQL.\n *\n * @since 0.71\n *\n * @param string     $mysqlstring   Date or datetime field type from MySQL.\n * @param int|string $start_of_week Optional. Start of the week as an integer. Default empty string.\n * @return array Keys are 'start' and 'end'.\n */\nfunction get_weekstartend( $mysqlstring, $start_of_week = '' ) {\n\t// MySQL string year.\n\t$my = substr( $mysqlstring, 0, 4 );\n\n\t// MySQL string month.\n\t$mm = substr( $mysqlstring, 8, 2 );\n\n\t// MySQL string day.\n\t$md = substr( $mysqlstring, 5, 2 );\n\n\t// The timestamp for MySQL string day.\n\t$day = mktime( 0, 0, 0, $md, $mm, $my );\n\n\t// The day of the week from the timestamp.\n\t$weekday = date( 'w', $day );\n\n\tif ( !is_numeric($start_of_week) )\n\t\t$start_of_week = get_option( 'start_of_week' );\n\n\tif ( $weekday < $start_of_week )\n\t\t$weekday += 7;\n\n\t// The most recent week start day on or before $day.\n\t$start = $day - DAY_IN_SECONDS * ( $weekday - $start_of_week );\n\n\t// $start + 1 week - 1 second.\n\t$end = $start + WEEK_IN_SECONDS - 1;\n\treturn compact( 'start', 'end' );\n}\n\n/**\n * Unserialize value only if it was serialized.\n *\n * @since 2.0.0\n *\n * @param string $original Maybe unserialized original, if is needed.\n * @return mixed Unserialized data can be any type.\n */\nfunction maybe_unserialize( $original ) {\n\tif ( is_serialized( $original ) ) // don't attempt to unserialize data that wasn't serialized going in\n\t\treturn @unserialize( $original );\n\treturn $original;\n}\n\n/**\n * Check value to find if it was serialized.\n *\n * If $data is not an string, then returned value will always be false.\n * Serialized data is always a string.\n *\n * @since 2.0.5\n *\n * @param string $data   Value to check to see if was serialized.\n * @param bool   $strict Optional. Whether to be strict about the end of the string. Default true.\n * @return bool False if not serialized and true if it was.\n */\nfunction is_serialized( $data, $strict = true ) {\n\t// if it isn't a string, it isn't serialized.\n\tif ( ! is_string( $data ) ) {\n\t\treturn false;\n\t}\n\t$data = trim( $data );\n \tif ( 'N;' == $data ) {\n\t\treturn true;\n\t}\n\tif ( strlen( $data ) < 4 ) {\n\t\treturn false;\n\t}\n\tif ( ':' !== $data[1] ) {\n\t\treturn false;\n\t}\n\tif ( $strict ) {\n\t\t$lastc = substr( $data, -1 );\n\t\tif ( ';' !== $lastc && '}' !== $lastc ) {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\t$semicolon = strpos( $data, ';' );\n\t\t$brace     = strpos( $data, '}' );\n\t\t// Either ; or } must exist.\n\t\tif ( false === $semicolon && false === $brace )\n\t\t\treturn false;\n\t\t// But neither must be in the first X characters.\n\t\tif ( false !== $semicolon && $semicolon < 3 )\n\t\t\treturn false;\n\t\tif ( false !== $brace && $brace < 4 )\n\t\t\treturn false;\n\t}\n\t$token = $data[0];\n\tswitch ( $token ) {\n\t\tcase 's' :\n\t\t\tif ( $strict ) {\n\t\t\t\tif ( '\"' !== substr( $data, -2, 1 ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} elseif ( false === strpos( $data, '\"' ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// or else fall through\n\t\tcase 'a' :\n\t\tcase 'O' :\n\t\t\treturn (bool) preg_match( \"/^{$token}:[0-9]+:/s\", $data );\n\t\tcase 'b' :\n\t\tcase 'i' :\n\t\tcase 'd' :\n\t\t\t$end = $strict ? '$' : '';\n\t\t\treturn (bool) preg_match( \"/^{$token}:[0-9.E-]+;$end/\", $data );\n\t}\n\treturn false;\n}\n\n/**\n * Check whether serialized data is of string type.\n *\n * @since 2.0.5\n *\n * @param string $data Serialized data.\n * @return bool False if not a serialized string, true if it is.\n */\nfunction is_serialized_string( $data ) {\n\t// if it isn't a string, it isn't a serialized string.\n\tif ( ! is_string( $data ) ) {\n\t\treturn false;\n\t}\n\t$data = trim( $data );\n\tif ( strlen( $data ) < 4 ) {\n\t\treturn false;\n\t} elseif ( ':' !== $data[1] ) {\n\t\treturn false;\n\t} elseif ( ';' !== substr( $data, -1 ) ) {\n\t\treturn false;\n\t} elseif ( $data[0] !== 's' ) {\n\t\treturn false;\n\t} elseif ( '\"' !== substr( $data, -2, 1 ) ) {\n\t\treturn false;\n\t} else {\n\t\treturn true;\n\t}\n}\n\n/**\n * Serialize data, if needed.\n *\n * @since 2.0.5\n *\n * @param string|array|object $data Data that might be serialized.\n * @return mixed A scalar data\n */\nfunction maybe_serialize( $data ) {\n\tif ( is_array( $data ) || is_object( $data ) )\n\t\treturn serialize( $data );\n\n\t// Double serialization is required for backward compatibility.\n\t// See https://core.trac.wordpress.org/ticket/12930\n\t// Also the world will end. See WP 3.6.1.\n\tif ( is_serialized( $data, false ) )\n\t\treturn serialize( $data );\n\n\treturn $data;\n}\n\n/**\n * Retrieve post title from XMLRPC XML.\n *\n * If the title element is not part of the XML, then the default post title from\n * the $post_default_title will be used instead.\n *\n * @since 0.71\n *\n * @global string $post_default_title Default XML-RPC post title.\n *\n * @param string $content XMLRPC XML Request content\n * @return string Post title\n */\nfunction xmlrpc_getposttitle( $content ) {\n\tglobal $post_default_title;\n\tif ( preg_match( '/<title>(.+?)<\\/title>/is', $content, $matchtitle ) ) {\n\t\t$post_title = $matchtitle[1];\n\t} else {\n\t\t$post_title = $post_default_title;\n\t}\n\treturn $post_title;\n}\n\n/**\n * Retrieve the post category or categories from XMLRPC XML.\n *\n * If the category element is not found, then the default post category will be\n * used. The return type then would be what $post_default_category. If the\n * category is found, then it will always be an array.\n *\n * @since 0.71\n *\n * @global string $post_default_category Default XML-RPC post category.\n *\n * @param string $content XMLRPC XML Request content\n * @return string|array List of categories or category name.\n */\nfunction xmlrpc_getpostcategory( $content ) {\n\tglobal $post_default_category;\n\tif ( preg_match( '/<category>(.+?)<\\/category>/is', $content, $matchcat ) ) {\n\t\t$post_category = trim( $matchcat[1], ',' );\n\t\t$post_category = explode( ',', $post_category );\n\t} else {\n\t\t$post_category = $post_default_category;\n\t}\n\treturn $post_category;\n}\n\n/**\n * XMLRPC XML content without title and category elements.\n *\n * @since 0.71\n *\n * @param string $content XML-RPC XML Request content.\n * @return string XMLRPC XML Request content without title and category elements.\n */\nfunction xmlrpc_removepostdata( $content ) {\n\t$content = preg_replace( '/<title>(.+?)<\\/title>/si', '', $content );\n\t$content = preg_replace( '/<category>(.+?)<\\/category>/si', '', $content );\n\t$content = trim( $content );\n\treturn $content;\n}\n\n/**\n * Use RegEx to extract URLs from arbitrary content.\n *\n * @since 3.7.0\n *\n * @param string $content Content to extract URLs from.\n * @return array URLs found in passed string.\n */\nfunction wp_extract_urls( $content ) {\n\tpreg_match_all(\n\t\t\"#([\\\"']?)(\"\n\t\t\t. \"(?:([\\w-]+:)?//?)\"\n\t\t\t. \"[^\\s()<>]+\"\n\t\t\t. \"[.]\"\n\t\t\t. \"(?:\"\n\t\t\t\t. \"\\([\\w\\d]+\\)|\"\n\t\t\t\t. \"(?:\"\n\t\t\t\t\t. \"[^`!()\\[\\]{};:'\\\".,<>«»“”‘’\\s]|\"\n\t\t\t\t\t. \"(?:[:]\\d+)?/?\"\n\t\t\t\t. \")+\"\n\t\t\t. \")\"\n\t\t. \")\\\\1#\",\n\t\t$content,\n\t\t$post_links\n\t);\n\n\t$post_links = array_unique( array_map( 'html_entity_decode', $post_links[2] ) );\n\n\treturn array_values( $post_links );\n}\n\n/**\n * Check content for video and audio links to add as enclosures.\n *\n * Will not add enclosures that have already been added and will\n * remove enclosures that are no longer in the post. This is called as\n * pingbacks and trackbacks.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $content Post Content.\n * @param int    $post_ID Post ID.\n */\nfunction do_enclose( $content, $post_ID ) {\n\tglobal $wpdb;\n\n\t//TODO: Tidy this ghetto code up and make the debug code optional\n\tinclude_once( ABSPATH . WPINC . '/class-IXR.php' );\n\n\t$post_links = array();\n\n\t$pung = get_enclosed( $post_ID );\n\n\t$post_links_temp = wp_extract_urls( $content );\n\n\tforeach ( $pung as $link_test ) {\n\t\tif ( ! in_array( $link_test, $post_links_temp ) ) { // link no longer in post\n\t\t\t$mids = $wpdb->get_col( $wpdb->prepare(\"SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s\", $post_ID, $wpdb->esc_like( $link_test ) . '%') );\n\t\t\tforeach ( $mids as $mid )\n\t\t\t\tdelete_metadata_by_mid( 'post', $mid );\n\t\t}\n\t}\n\n\tforeach ( (array) $post_links_temp as $link_test ) {\n\t\tif ( !in_array( $link_test, $pung ) ) { // If we haven't pung it already\n\t\t\t$test = @parse_url( $link_test );\n\t\t\tif ( false === $test )\n\t\t\t\tcontinue;\n\t\t\tif ( isset( $test['query'] ) )\n\t\t\t\t$post_links[] = $link_test;\n\t\t\telseif ( isset($test['path']) && ( $test['path'] != '/' ) &&  ($test['path'] != '' ) )\n\t\t\t\t$post_links[] = $link_test;\n\t\t}\n\t}\n\n\t/**\n\t * Filter the list of enclosure links before querying the database.\n\t *\n\t * Allows for the addition and/or removal of potential enclosures to save\n\t * to postmeta before checking the database for existing enclosures.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $post_links An array of enclosure links.\n\t * @param int   $post_ID    Post ID.\n\t */\n\t$post_links = apply_filters( 'enclosure_links', $post_links, $post_ID );\n\n\tforeach ( (array) $post_links as $url ) {\n\t\tif ( $url != '' && !$wpdb->get_var( $wpdb->prepare( \"SELECT post_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s\", $post_ID, $wpdb->esc_like( $url ) . '%' ) ) ) {\n\n\t\t\tif ( $headers = wp_get_http_headers( $url) ) {\n\t\t\t\t$len = isset( $headers['content-length'] ) ? (int) $headers['content-length'] : 0;\n\t\t\t\t$type = isset( $headers['content-type'] ) ? $headers['content-type'] : '';\n\t\t\t\t$allowed_types = array( 'video', 'audio' );\n\n\t\t\t\t// Check to see if we can figure out the mime type from\n\t\t\t\t// the extension\n\t\t\t\t$url_parts = @parse_url( $url );\n\t\t\t\tif ( false !== $url_parts ) {\n\t\t\t\t\t$extension = pathinfo( $url_parts['path'], PATHINFO_EXTENSION );\n\t\t\t\t\tif ( !empty( $extension ) ) {\n\t\t\t\t\t\tforeach ( wp_get_mime_types() as $exts => $mime ) {\n\t\t\t\t\t\t\tif ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) {\n\t\t\t\t\t\t\t\t$type = $mime;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( in_array( substr( $type, 0, strpos( $type, \"/\" ) ), $allowed_types ) ) {\n\t\t\t\t\tadd_post_meta( $post_ID, 'enclosure', \"$url\\n$len\\n$mime\\n\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Retrieve HTTP Headers from URL.\n *\n * @since 1.5.1\n *\n * @param string $url        URL to retrieve HTTP headers from.\n * @param bool   $deprecated Not Used.\n * @return bool|string False on failure, headers on success.\n */\nfunction wp_get_http_headers( $url, $deprecated = false ) {\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.7' );\n\n\t$response = wp_safe_remote_head( $url );\n\n\tif ( is_wp_error( $response ) )\n\t\treturn false;\n\n\treturn wp_remote_retrieve_headers( $response );\n}\n\n/**\n * Whether the publish date of the current post in the loop is different from the\n * publish date of the previous post in the loop.\n *\n * @since 0.71\n *\n * @global string $currentday  The day of the current post in the loop.\n * @global string $previousday The day of the previous post in the loop.\n *\n * @return int 1 when new day, 0 if not a new day.\n */\nfunction is_new_day() {\n\tglobal $currentday, $previousday;\n\tif ( $currentday != $previousday )\n\t\treturn 1;\n\telse\n\t\treturn 0;\n}\n\n/**\n * Build URL query based on an associative and, or indexed array.\n *\n * This is a convenient function for easily building url queries. It sets the\n * separator to '&' and uses _http_build_query() function.\n *\n * @since 2.3.0\n *\n * @see _http_build_query() Used to build the query\n * @see http://us2.php.net/manual/en/function.http-build-query.php for more on what\n *\t\thttp_build_query() does.\n *\n * @param array $data URL-encode key/value pairs.\n * @return string URL-encoded string.\n */\nfunction build_query( $data ) {\n\treturn _http_build_query( $data, null, '&', '', false );\n}\n\n/**\n * From php.net (modified by Mark Jaquith to behave like the native PHP5 function).\n *\n * @since 3.2.0\n * @access private\n *\n * @see http://us1.php.net/manual/en/function.http-build-query.php\n *\n * @param array|object  $data       An array or object of data. Converted to array.\n * @param string        $prefix     Optional. Numeric index. If set, start parameter numbering with it.\n *                                  Default null.\n * @param string        $sep        Optional. Argument separator; defaults to 'arg_separator.output'.\n *                                  Default null.\n * @param string        $key        Optional. Used to prefix key name. Default empty.\n * @param bool          $urlencode  Optional. Whether to use urlencode() in the result. Default true.\n *\n * @return string The query string.\n */\nfunction _http_build_query( $data, $prefix = null, $sep = null, $key = '', $urlencode = true ) {\n\t$ret = array();\n\n\tforeach ( (array) $data as $k => $v ) {\n\t\tif ( $urlencode)\n\t\t\t$k = urlencode($k);\n\t\tif ( is_int($k) && $prefix != null )\n\t\t\t$k = $prefix.$k;\n\t\tif ( !empty($key) )\n\t\t\t$k = $key . '%5B' . $k . '%5D';\n\t\tif ( $v === null )\n\t\t\tcontinue;\n\t\telseif ( $v === false )\n\t\t\t$v = '0';\n\n\t\tif ( is_array($v) || is_object($v) )\n\t\t\tarray_push($ret,_http_build_query($v, '', $sep, $k, $urlencode));\n\t\telseif ( $urlencode )\n\t\t\tarray_push($ret, $k.'='.urlencode($v));\n\t\telse\n\t\t\tarray_push($ret, $k.'='.$v);\n\t}\n\n\tif ( null === $sep )\n\t\t$sep = ini_get('arg_separator.output');\n\n\treturn implode($sep, $ret);\n}\n\n/**\n * Retrieves a modified URL query string.\n *\n * You can rebuild the URL and append query variables to the URL query by using this function.\n * There are two ways to use this function; either a single key and value, or an associative array.\n *\n * Using a single key and value:\n *\n *     add_query_arg( 'key', 'value', 'http://example.com' );\n *\n * Using an associative array:\n *\n *     add_query_arg( array(\n *         'key1' => 'value1',\n *         'key2' => 'value2',\n *     ), 'http://example.com' );\n *\n * Omitting the URL from either use results in the current URL being used\n * (the value of `$_SERVER['REQUEST_URI']`).\n *\n * Values are expected to be encoded appropriately with urlencode() or rawurlencode().\n *\n * Setting any query variable's value to boolean false removes the key (see remove_query_arg()).\n *\n * Important: The return value of add_query_arg() is not escaped by default. Output should be\n * late-escaped with esc_url() or similar to help prevent vulnerability to cross-site scripting\n * (XSS) attacks.\n *\n * @since 1.5.0\n *\n * @param string|array $key   Either a query variable key, or an associative array of query variables.\n * @param string       $value Optional. Either a query variable value, or a URL to act upon.\n * @param string       $url   Optional. A URL to act upon.\n * @return string New URL query string (unescaped).\n */\nfunction add_query_arg() {\n\t$args = func_get_args();\n\tif ( is_array( $args[0] ) ) {\n\t\tif ( count( $args ) < 2 || false === $args[1] )\n\t\t\t$uri = $_SERVER['REQUEST_URI'];\n\t\telse\n\t\t\t$uri = $args[1];\n\t} else {\n\t\tif ( count( $args ) < 3 || false === $args[2] )\n\t\t\t$uri = $_SERVER['REQUEST_URI'];\n\t\telse\n\t\t\t$uri = $args[2];\n\t}\n\n\tif ( $frag = strstr( $uri, '#' ) )\n\t\t$uri = substr( $uri, 0, -strlen( $frag ) );\n\telse\n\t\t$frag = '';\n\n\tif ( 0 === stripos( $uri, 'http://' ) ) {\n\t\t$protocol = 'http://';\n\t\t$uri = substr( $uri, 7 );\n\t} elseif ( 0 === stripos( $uri, 'https://' ) ) {\n\t\t$protocol = 'https://';\n\t\t$uri = substr( $uri, 8 );\n\t} else {\n\t\t$protocol = '';\n\t}\n\n\tif ( strpos( $uri, '?' ) !== false ) {\n\t\tlist( $base, $query ) = explode( '?', $uri, 2 );\n\t\t$base .= '?';\n\t} elseif ( $protocol || strpos( $uri, '=' ) === false ) {\n\t\t$base = $uri . '?';\n\t\t$query = '';\n\t} else {\n\t\t$base = '';\n\t\t$query = $uri;\n\t}\n\n\twp_parse_str( $query, $qs );\n\t$qs = urlencode_deep( $qs ); // this re-URL-encodes things that were already in the query string\n\tif ( is_array( $args[0] ) ) {\n\t\tforeach ( $args[0] as $k => $v ) {\n\t\t\t$qs[ $k ] = $v;\n\t\t}\n\t} else {\n\t\t$qs[ $args[0] ] = $args[1];\n\t}\n\n\tforeach ( $qs as $k => $v ) {\n\t\tif ( $v === false )\n\t\t\tunset( $qs[$k] );\n\t}\n\n\t$ret = build_query( $qs );\n\t$ret = trim( $ret, '?' );\n\t$ret = preg_replace( '#=(&|$)#', '$1', $ret );\n\t$ret = $protocol . $base . $ret . $frag;\n\t$ret = rtrim( $ret, '?' );\n\treturn $ret;\n}\n\n/**\n * Removes an item or items from a query string.\n *\n * @since 1.5.0\n *\n * @param string|array $key   Query key or keys to remove.\n * @param bool|string  $query Optional. When false uses the current URL. Default false.\n * @return string New URL query string.\n */\nfunction remove_query_arg( $key, $query = false ) {\n\tif ( is_array( $key ) ) { // removing multiple keys\n\t\tforeach ( $key as $k )\n\t\t\t$query = add_query_arg( $k, false, $query );\n\t\treturn $query;\n\t}\n\treturn add_query_arg( $key, false, $query );\n}\n\n/**\n * Returns an array of single-use query variable names that can be removed from a URL.\n *\n * @since 4.4.0\n *\n * @return array An array of parameters to remove from the URL.\n */\nfunction wp_removable_query_args() {\n\t$removable_query_args = array(\n\t\t'activate',\n\t\t'activated',\n\t\t'approved',\n\t\t'deactivate',\n\t\t'deleted',\n\t\t'disabled',\n\t\t'enabled',\n\t\t'error',\n\t\t'locked',\n\t\t'message',\n\t\t'same',\n\t\t'saved',\n\t\t'settings-updated',\n\t\t'skipped',\n\t\t'spammed',\n\t\t'trashed',\n\t\t'unspammed',\n\t\t'untrashed',\n\t\t'update',\n\t\t'updated',\n\t\t'wp-post-new-reload',\n\t);\n\n\t/**\n\t * Filter the list of query variables to remove.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param array $removable_query_args An array of query variables to remove from a URL.\n\t */\n\treturn apply_filters( 'removable_query_args', $removable_query_args );\n}\n\n/**\n * Walks the array while sanitizing the contents.\n *\n * @since 0.71\n *\n * @param array $array Array to walk while sanitizing contents.\n * @return array Sanitized $array.\n */\nfunction add_magic_quotes( $array ) {\n\tforeach ( (array) $array as $k => $v ) {\n\t\tif ( is_array( $v ) ) {\n\t\t\t$array[$k] = add_magic_quotes( $v );\n\t\t} else {\n\t\t\t$array[$k] = addslashes( $v );\n\t\t}\n\t}\n\treturn $array;\n}\n\n/**\n * HTTP request for URI to retrieve content.\n *\n * @since 1.5.1\n *\n * @see wp_safe_remote_get()\n *\n * @param string $uri URI/URL of web page to retrieve.\n * @return false|string HTTP content. False on failure.\n */\nfunction wp_remote_fopen( $uri ) {\n\t$parsed_url = @parse_url( $uri );\n\n\tif ( !$parsed_url || !is_array( $parsed_url ) )\n\t\treturn false;\n\n\t$options = array();\n\t$options['timeout'] = 10;\n\n\t$response = wp_safe_remote_get( $uri, $options );\n\n\tif ( is_wp_error( $response ) )\n\t\treturn false;\n\n\treturn wp_remote_retrieve_body( $response );\n}\n\n/**\n * Set up the WordPress query.\n *\n * @since 2.0.0\n *\n * @global WP       $wp_locale\n * @global WP_Query $wp_query\n * @global WP_Query $wp_the_query\n *\n * @param string|array $query_vars Default WP_Query arguments.\n */\nfunction wp( $query_vars = '' ) {\n\tglobal $wp, $wp_query, $wp_the_query;\n\t$wp->main( $query_vars );\n\n\tif ( !isset($wp_the_query) )\n\t\t$wp_the_query = $wp_query;\n}\n\n/**\n * Retrieve the description for the HTTP status.\n *\n * @since 2.3.0\n *\n * @global array $wp_header_to_desc\n *\n * @param int $code HTTP status code.\n * @return string Empty string if not found, or description if found.\n */\nfunction get_status_header_desc( $code ) {\n\tglobal $wp_header_to_desc;\n\n\t$code = absint( $code );\n\n\tif ( !isset( $wp_header_to_desc ) ) {\n\t\t$wp_header_to_desc = array(\n\t\t\t100 => 'Continue',\n\t\t\t101 => 'Switching Protocols',\n\t\t\t102 => 'Processing',\n\n\t\t\t200 => 'OK',\n\t\t\t201 => 'Created',\n\t\t\t202 => 'Accepted',\n\t\t\t203 => 'Non-Authoritative Information',\n\t\t\t204 => 'No Content',\n\t\t\t205 => 'Reset Content',\n\t\t\t206 => 'Partial Content',\n\t\t\t207 => 'Multi-Status',\n\t\t\t226 => 'IM Used',\n\n\t\t\t300 => 'Multiple Choices',\n\t\t\t301 => 'Moved Permanently',\n\t\t\t302 => 'Found',\n\t\t\t303 => 'See Other',\n\t\t\t304 => 'Not Modified',\n\t\t\t305 => 'Use Proxy',\n\t\t\t306 => 'Reserved',\n\t\t\t307 => 'Temporary Redirect',\n\n\t\t\t400 => 'Bad Request',\n\t\t\t401 => 'Unauthorized',\n\t\t\t402 => 'Payment Required',\n\t\t\t403 => 'Forbidden',\n\t\t\t404 => 'Not Found',\n\t\t\t405 => 'Method Not Allowed',\n\t\t\t406 => 'Not Acceptable',\n\t\t\t407 => 'Proxy Authentication Required',\n\t\t\t408 => 'Request Timeout',\n\t\t\t409 => 'Conflict',\n\t\t\t410 => 'Gone',\n\t\t\t411 => 'Length Required',\n\t\t\t412 => 'Precondition Failed',\n\t\t\t413 => 'Request Entity Too Large',\n\t\t\t414 => 'Request-URI Too Long',\n\t\t\t415 => 'Unsupported Media Type',\n\t\t\t416 => 'Requested Range Not Satisfiable',\n\t\t\t417 => 'Expectation Failed',\n\t\t\t418 => 'I\\'m a teapot',\n\t\t\t422 => 'Unprocessable Entity',\n\t\t\t423 => 'Locked',\n\t\t\t424 => 'Failed Dependency',\n\t\t\t426 => 'Upgrade Required',\n\t\t\t428 => 'Precondition Required',\n\t\t\t429 => 'Too Many Requests',\n\t\t\t431 => 'Request Header Fields Too Large',\n\n\t\t\t500 => 'Internal Server Error',\n\t\t\t501 => 'Not Implemented',\n\t\t\t502 => 'Bad Gateway',\n\t\t\t503 => 'Service Unavailable',\n\t\t\t504 => 'Gateway Timeout',\n\t\t\t505 => 'HTTP Version Not Supported',\n\t\t\t506 => 'Variant Also Negotiates',\n\t\t\t507 => 'Insufficient Storage',\n\t\t\t510 => 'Not Extended',\n\t\t\t511 => 'Network Authentication Required',\n\t\t);\n\t}\n\n\tif ( isset( $wp_header_to_desc[$code] ) )\n\t\treturn $wp_header_to_desc[$code];\n\telse\n\t\treturn '';\n}\n\n/**\n * Set HTTP status header.\n *\n * @since 2.0.0\n * @since 4.4.0 Added the `$description` parameter.\n *\n * @see get_status_header_desc()\n *\n * @param int    $code        HTTP status code.\n * @param string $description Optional. A custom description for the HTTP status.\n */\nfunction status_header( $code, $description = '' ) {\n\tif ( ! $description ) {\n\t\t$description = get_status_header_desc( $code );\n\t}\n\n\tif ( empty( $description ) ) {\n\t\treturn;\n\t}\n\n\t$protocol = wp_get_server_protocol();\n\t$status_header = \"$protocol $code $description\";\n\tif ( function_exists( 'apply_filters' ) )\n\n\t\t/**\n\t\t * Filter an HTTP status header.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @param string $status_header HTTP status header.\n\t\t * @param int    $code          HTTP status code.\n\t\t * @param string $description   Description for the status code.\n\t\t * @param string $protocol      Server protocol.\n\t\t */\n\t\t$status_header = apply_filters( 'status_header', $status_header, $code, $description, $protocol );\n\n\t@header( $status_header, true, $code );\n}\n\n/**\n * Get the header information to prevent caching.\n *\n * The several different headers cover the different ways cache prevention\n * is handled by different browsers\n *\n * @since 2.8.0\n *\n * @return array The associative array of header names and field values.\n */\nfunction wp_get_nocache_headers() {\n\t$headers = array(\n\t\t'Expires' => 'Wed, 11 Jan 1984 05:00:00 GMT',\n\t\t'Cache-Control' => 'no-cache, must-revalidate, max-age=0',\n\t\t'Pragma' => 'no-cache',\n\t);\n\n\tif ( function_exists('apply_filters') ) {\n\t\t/**\n\t\t * Filter the cache-controlling headers.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @see wp_get_nocache_headers()\n\t\t *\n\t\t * @param array $headers {\n\t\t *     Header names and field values.\n\t\t *\n\t\t *     @type string $Expires       Expires header.\n\t\t *     @type string $Cache-Control Cache-Control header.\n\t\t *     @type string $Pragma        Pragma header.\n\t\t * }\n\t\t */\n\t\t$headers = (array) apply_filters( 'nocache_headers', $headers );\n\t}\n\t$headers['Last-Modified'] = false;\n\treturn $headers;\n}\n\n/**\n * Set the headers to prevent caching for the different browsers.\n *\n * Different browsers support different nocache headers, so several\n * headers must be sent so that all of them get the point that no\n * caching should occur.\n *\n * @since 2.0.0\n *\n * @see wp_get_nocache_headers()\n */\nfunction nocache_headers() {\n\t$headers = wp_get_nocache_headers();\n\n\tunset( $headers['Last-Modified'] );\n\n\t// In PHP 5.3+, make sure we are not sending a Last-Modified header.\n\tif ( function_exists( 'header_remove' ) ) {\n\t\t@header_remove( 'Last-Modified' );\n\t} else {\n\t\t// In PHP 5.2, send an empty Last-Modified header, but only as a\n\t\t// last resort to override a header already sent. #WP23021\n\t\tforeach ( headers_list() as $header ) {\n\t\t\tif ( 0 === stripos( $header, 'Last-Modified' ) ) {\n\t\t\t\t$headers['Last-Modified'] = '';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tforeach ( $headers as $name => $field_value )\n\t\t@header(\"{$name}: {$field_value}\");\n}\n\n/**\n * Set the headers for caching for 10 days with JavaScript content type.\n *\n * @since 2.1.0\n */\nfunction cache_javascript_headers() {\n\t$expiresOffset = 10 * DAY_IN_SECONDS;\n\n\theader( \"Content-Type: text/javascript; charset=\" . get_bloginfo( 'charset' ) );\n\theader( \"Vary: Accept-Encoding\" ); // Handle proxies\n\theader( \"Expires: \" . gmdate( \"D, d M Y H:i:s\", time() + $expiresOffset ) . \" GMT\" );\n}\n\n/**\n * Retrieve the number of database queries during the WordPress execution.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return int Number of database queries.\n */\nfunction get_num_queries() {\n\tglobal $wpdb;\n\treturn $wpdb->num_queries;\n}\n\n/**\n * Whether input is yes or no.\n *\n * Must be 'y' to be true.\n *\n * @since 1.0.0\n *\n * @param string $yn Character string containing either 'y' (yes) or 'n' (no).\n * @return bool True if yes, false on anything else.\n */\nfunction bool_from_yn( $yn ) {\n\treturn ( strtolower( $yn ) == 'y' );\n}\n\n/**\n * Load the feed template from the use of an action hook.\n *\n * If the feed action does not have a hook, then the function will die with a\n * message telling the visitor that the feed is not valid.\n *\n * It is better to only have one hook for each feed.\n *\n * @since 2.1.0\n *\n * @global WP_Query $wp_query Used to tell if the use a comment feed.\n */\nfunction do_feed() {\n\tglobal $wp_query;\n\n\t$feed = get_query_var( 'feed' );\n\n\t// Remove the pad, if present.\n\t$feed = preg_replace( '/^_+/', '', $feed );\n\n\tif ( $feed == '' || $feed == 'feed' )\n\t\t$feed = get_default_feed();\n\n\tif ( ! has_action( \"do_feed_{$feed}\" ) ) {\n\t\twp_die( __( 'ERROR: This is not a valid feed template.' ), '', array( 'response' => 404 ) );\n\t}\n\n\t/**\n\t * Fires once the given feed is loaded.\n\t *\n\t * The dynamic portion of the hook name, `$feed`, refers to the feed template name.\n\t * Possible values include: 'rdf', 'rss', 'rss2', and 'atom'.\n\t *\n\t * @since 2.1.0\n\t * @since 4.4.0 The `$feed` parameter was added.\n\t *\n\t * @param bool   $is_comment_feed Whether the feed is a comment feed.\n\t * @param string $feed            The feed name.\n\t */\n\tdo_action( \"do_feed_{$feed}\", $wp_query->is_comment_feed, $feed );\n}\n\n/**\n * Load the RDF RSS 0.91 Feed template.\n *\n * @since 2.1.0\n *\n * @see load_template()\n */\nfunction do_feed_rdf() {\n\tload_template( ABSPATH . WPINC . '/feed-rdf.php' );\n}\n\n/**\n * Load the RSS 1.0 Feed Template.\n *\n * @since 2.1.0\n *\n * @see load_template()\n */\nfunction do_feed_rss() {\n\tload_template( ABSPATH . WPINC . '/feed-rss.php' );\n}\n\n/**\n * Load either the RSS2 comment feed or the RSS2 posts feed.\n *\n * @since 2.1.0\n *\n * @see load_template()\n *\n * @param bool $for_comments True for the comment feed, false for normal feed.\n */\nfunction do_feed_rss2( $for_comments ) {\n\tif ( $for_comments )\n\t\tload_template( ABSPATH . WPINC . '/feed-rss2-comments.php' );\n\telse\n\t\tload_template( ABSPATH . WPINC . '/feed-rss2.php' );\n}\n\n/**\n * Load either Atom comment feed or Atom posts feed.\n *\n * @since 2.1.0\n *\n * @see load_template()\n *\n * @param bool $for_comments True for the comment feed, false for normal feed.\n */\nfunction do_feed_atom( $for_comments ) {\n\tif ($for_comments)\n\t\tload_template( ABSPATH . WPINC . '/feed-atom-comments.php');\n\telse\n\t\tload_template( ABSPATH . WPINC . '/feed-atom.php' );\n}\n\n/**\n * Display the robots.txt file content.\n *\n * The echo content should be with usage of the permalinks or for creating the\n * robots.txt file.\n *\n * @since 2.1.0\n */\nfunction do_robots() {\n\theader( 'Content-Type: text/plain; charset=utf-8' );\n\n\t/**\n\t * Fires when displaying the robots.txt file.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'do_robotstxt' );\n\n\t$output = \"User-agent: *\\n\";\n\t$public = get_option( 'blog_public' );\n\tif ( '0' == $public ) {\n\t\t$output .= \"Disallow: /\\n\";\n\t} else {\n\t\t$site_url = parse_url( site_url() );\n\t\t$path = ( !empty( $site_url['path'] ) ) ? $site_url['path'] : '';\n\t\t$output .= \"Disallow: $path/wp-admin/\\n\";\n\t\t$output .= \"Allow: $path/wp-admin/admin-ajax.php\\n\";\n\t}\n\n\t/**\n\t * Filter the robots.txt output.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $output Robots.txt output.\n\t * @param bool   $public Whether the site is considered \"public\".\n\t */\n\techo apply_filters( 'robots_txt', $output, $public );\n}\n\n/**\n * Test whether blog is already installed.\n *\n * The cache will be checked first. If you have a cache plugin, which saves\n * the cache values, then this will work. If you use the default WordPress\n * cache, and the database goes away, then you might have problems.\n *\n * Checks for the 'siteurl' option for whether WordPress is installed.\n *\n * @since 2.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return bool Whether the blog is already installed.\n */\nfunction is_blog_installed() {\n\tglobal $wpdb;\n\n\t/*\n\t * Check cache first. If options table goes away and we have true\n\t * cached, oh well.\n\t */\n\tif ( wp_cache_get( 'is_blog_installed' ) )\n\t\treturn true;\n\n\t$suppress = $wpdb->suppress_errors();\n\tif ( ! wp_installing() ) {\n\t\t$alloptions = wp_load_alloptions();\n\t}\n\t// If siteurl is not set to autoload, check it specifically\n\tif ( !isset( $alloptions['siteurl'] ) )\n\t\t$installed = $wpdb->get_var( \"SELECT option_value FROM $wpdb->options WHERE option_name = 'siteurl'\" );\n\telse\n\t\t$installed = $alloptions['siteurl'];\n\t$wpdb->suppress_errors( $suppress );\n\n\t$installed = !empty( $installed );\n\twp_cache_set( 'is_blog_installed', $installed );\n\n\tif ( $installed )\n\t\treturn true;\n\n\t// If visiting repair.php, return true and let it take over.\n\tif ( defined( 'WP_REPAIRING' ) )\n\t\treturn true;\n\n\t$suppress = $wpdb->suppress_errors();\n\n\t/*\n\t * Loop over the WP tables. If none exist, then scratch install is allowed.\n\t * If one or more exist, suggest table repair since we got here because the\n\t * options table could not be accessed.\n\t */\n\t$wp_tables = $wpdb->tables();\n\tforeach ( $wp_tables as $table ) {\n\t\t// The existence of custom user tables shouldn't suggest an insane state or prevent a clean install.\n\t\tif ( defined( 'CUSTOM_USER_TABLE' ) && CUSTOM_USER_TABLE == $table )\n\t\t\tcontinue;\n\t\tif ( defined( 'CUSTOM_USER_META_TABLE' ) && CUSTOM_USER_META_TABLE == $table )\n\t\t\tcontinue;\n\n\t\tif ( ! $wpdb->get_results( \"DESCRIBE $table;\" ) )\n\t\t\tcontinue;\n\n\t\t// One or more tables exist. We are insane.\n\n\t\twp_load_translations_early();\n\n\t\t// Die with a DB error.\n\t\t$wpdb->error = sprintf( __( 'One or more database tables are unavailable. The database may need to be <a href=\"%s\">repaired</a>.' ), 'maint/repair.php?referrer=is_blog_installed' );\n\t\tdead_db();\n\t}\n\n\t$wpdb->suppress_errors( $suppress );\n\n\twp_cache_set( 'is_blog_installed', false );\n\n\treturn false;\n}\n\n/**\n * Retrieve URL with nonce added to URL query.\n *\n * @since 2.0.4\n *\n * @param string     $actionurl URL to add nonce action.\n * @param int|string $action    Optional. Nonce action name. Default -1.\n * @param string     $name      Optional. Nonce name. Default '_wpnonce'.\n * @return string Escaped URL with nonce action added.\n */\nfunction wp_nonce_url( $actionurl, $action = -1, $name = '_wpnonce' ) {\n\t$actionurl = str_replace( '&amp;', '&', $actionurl );\n\treturn esc_html( add_query_arg( $name, wp_create_nonce( $action ), $actionurl ) );\n}\n\n/**\n * Retrieve or display nonce hidden field for forms.\n *\n * The nonce field is used to validate that the contents of the form came from\n * the location on the current site and not somewhere else. The nonce does not\n * offer absolute protection, but should protect against most cases. It is very\n * important to use nonce field in forms.\n *\n * The $action and $name are optional, but if you want to have better security,\n * it is strongly suggested to set those two parameters. It is easier to just\n * call the function without any parameters, because validation of the nonce\n * doesn't require any parameters, but since crackers know what the default is\n * it won't be difficult for them to find a way around your nonce and cause\n * damage.\n *\n * The input name will be whatever $name value you gave. The input value will be\n * the nonce creation value.\n *\n * @since 2.0.4\n *\n * @param int|string $action  Optional. Action name. Default -1.\n * @param string     $name    Optional. Nonce name. Default '_wpnonce'.\n * @param bool       $referer Optional. Whether to set the referer field for validation. Default true.\n * @param bool       $echo    Optional. Whether to display or return hidden form field. Default true.\n * @return string Nonce field HTML markup.\n */\nfunction wp_nonce_field( $action = -1, $name = \"_wpnonce\", $referer = true , $echo = true ) {\n\t$name = esc_attr( $name );\n\t$nonce_field = '<input type=\"hidden\" id=\"' . $name . '\" name=\"' . $name . '\" value=\"' . wp_create_nonce( $action ) . '\" />';\n\n\tif ( $referer )\n\t\t$nonce_field .= wp_referer_field( false );\n\n\tif ( $echo )\n\t\techo $nonce_field;\n\n\treturn $nonce_field;\n}\n\n/**\n * Retrieve or display referer hidden field for forms.\n *\n * The referer link is the current Request URI from the server super global. The\n * input name is '_wp_http_referer', in case you wanted to check manually.\n *\n * @since 2.0.4\n *\n * @param bool $echo Optional. Whether to echo or return the referer field. Default true.\n * @return string Referer field HTML markup.\n */\nfunction wp_referer_field( $echo = true ) {\n\t$referer_field = '<input type=\"hidden\" name=\"_wp_http_referer\" value=\"'. esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) ) . '\" />';\n\n\tif ( $echo )\n\t\techo $referer_field;\n\treturn $referer_field;\n}\n\n/**\n * Retrieve or display original referer hidden field for forms.\n *\n * The input name is '_wp_original_http_referer' and will be either the same\n * value of wp_referer_field(), if that was posted already or it will be the\n * current page, if it doesn't exist.\n *\n * @since 2.0.4\n *\n * @param bool   $echo         Optional. Whether to echo the original http referer. Default true.\n * @param string $jump_back_to Optional. Can be 'previous' or page you want to jump back to.\n *                             Default 'current'.\n * @return string Original referer field.\n */\nfunction wp_original_referer_field( $echo = true, $jump_back_to = 'current' ) {\n\tif ( ! $ref = wp_get_original_referer() ) {\n\t\t$ref = 'previous' == $jump_back_to ? wp_get_referer() : wp_unslash( $_SERVER['REQUEST_URI'] );\n\t}\n\t$orig_referer_field = '<input type=\"hidden\" name=\"_wp_original_http_referer\" value=\"' . esc_attr( $ref ) . '\" />';\n\tif ( $echo )\n\t\techo $orig_referer_field;\n\treturn $orig_referer_field;\n}\n\n/**\n * Retrieve referer from '_wp_http_referer' or HTTP referer.\n *\n * If it's the same as the current request URL, will return false.\n *\n * @since 2.0.4\n *\n * @return false|string False on failure. Referer URL on success.\n */\nfunction wp_get_referer() {\n\tif ( ! function_exists( 'wp_validate_redirect' ) )\n\t\treturn false;\n\t$ref = false;\n\tif ( ! empty( $_REQUEST['_wp_http_referer'] ) )\n\t\t$ref = wp_unslash( $_REQUEST['_wp_http_referer'] );\n\telseif ( ! empty( $_SERVER['HTTP_REFERER'] ) )\n\t\t$ref = wp_unslash( $_SERVER['HTTP_REFERER'] );\n\n\tif ( $ref && $ref !== wp_unslash( $_SERVER['REQUEST_URI'] ) )\n\t\treturn wp_validate_redirect( $ref, false );\n\treturn false;\n}\n\n/**\n * Retrieve original referer that was posted, if it exists.\n *\n * @since 2.0.4\n *\n * @return string|false False if no original referer or original referer if set.\n */\nfunction wp_get_original_referer() {\n\tif ( ! empty( $_REQUEST['_wp_original_http_referer'] ) && function_exists( 'wp_validate_redirect' ) )\n\t\treturn wp_validate_redirect( wp_unslash( $_REQUEST['_wp_original_http_referer'] ), false );\n\treturn false;\n}\n\n/**\n * Recursive directory creation based on full path.\n *\n * Will attempt to set permissions on folders.\n *\n * @since 2.0.1\n *\n * @param string $target Full path to attempt to create.\n * @return bool Whether the path was created. True if path already exists.\n */\nfunction wp_mkdir_p( $target ) {\n\t$wrapper = null;\n\n\t// Strip the protocol.\n\tif ( wp_is_stream( $target ) ) {\n\t\tlist( $wrapper, $target ) = explode( '://', $target, 2 );\n\t}\n\n\t// From php.net/mkdir user contributed notes.\n\t$target = str_replace( '//', '/', $target );\n\n\t// Put the wrapper back on the target.\n\tif ( $wrapper !== null ) {\n\t\t$target = $wrapper . '://' . $target;\n\t}\n\n\t/*\n\t * Safe mode fails with a trailing slash under certain PHP versions.\n\t * Use rtrim() instead of untrailingslashit to avoid formatting.php dependency.\n\t */\n\t$target = rtrim($target, '/');\n\tif ( empty($target) )\n\t\t$target = '/';\n\n\tif ( file_exists( $target ) )\n\t\treturn @is_dir( $target );\n\n\t// We need to find the permissions of the parent folder that exists and inherit that.\n\t$target_parent = dirname( $target );\n\twhile ( '.' != $target_parent && ! is_dir( $target_parent ) ) {\n\t\t$target_parent = dirname( $target_parent );\n\t}\n\n\t// Get the permission bits.\n\tif ( $stat = @stat( $target_parent ) ) {\n\t\t$dir_perms = $stat['mode'] & 0007777;\n\t} else {\n\t\t$dir_perms = 0777;\n\t}\n\n\tif ( @mkdir( $target, $dir_perms, true ) ) {\n\n\t\t/*\n\t\t * If a umask is set that modifies $dir_perms, we'll have to re-set\n\t\t * the $dir_perms correctly with chmod()\n\t\t */\n\t\tif ( $dir_perms != ( $dir_perms & ~umask() ) ) {\n\t\t\t$folder_parts = explode( '/', substr( $target, strlen( $target_parent ) + 1 ) );\n\t\t\tfor ( $i = 1, $c = count( $folder_parts ); $i <= $c; $i++ ) {\n\t\t\t\t@chmod( $target_parent . '/' . implode( '/', array_slice( $folder_parts, 0, $i ) ), $dir_perms );\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Test if a give filesystem path is absolute.\n *\n * For example, '/foo/bar', or 'c:\\windows'.\n *\n * @since 2.5.0\n *\n * @param string $path File path.\n * @return bool True if path is absolute, false is not absolute.\n */\nfunction path_is_absolute( $path ) {\n\t/*\n\t * This is definitive if true but fails if $path does not exist or contains\n\t * a symbolic link.\n\t */\n\tif ( realpath($path) == $path )\n\t\treturn true;\n\n\tif ( strlen($path) == 0 || $path[0] == '.' )\n\t\treturn false;\n\n\t// Windows allows absolute paths like this.\n\tif ( preg_match('#^[a-zA-Z]:\\\\\\\\#', $path) )\n\t\treturn true;\n\n\t// A path starting with / or \\ is absolute; anything else is relative.\n\treturn ( $path[0] == '/' || $path[0] == '\\\\' );\n}\n\n/**\n * Join two filesystem paths together.\n *\n * For example, 'give me $path relative to $base'. If the $path is absolute,\n * then it the full path is returned.\n *\n * @since 2.5.0\n *\n * @param string $base Base path.\n * @param string $path Path relative to $base.\n * @return string The path with the base or absolute path.\n */\nfunction path_join( $base, $path ) {\n\tif ( path_is_absolute($path) )\n\t\treturn $path;\n\n\treturn rtrim($base, '/') . '/' . ltrim($path, '/');\n}\n\n/**\n * Normalize a filesystem path.\n *\n * On windows systems, replaces backslashes with forward slashes\n * and forces upper-case drive letters.\n * Ensures that no duplicate slashes exist.\n *\n * @since 3.9.0\n * @since 4.4.0 Ensures upper-case drive letters on Windows systems.\n *\n * @param string $path Path to normalize.\n * @return string Normalized path.\n */\nfunction wp_normalize_path( $path ) {\n\t$path = str_replace( '\\\\', '/', $path );\n\t$path = preg_replace( '|/+|','/', $path );\n\tif ( ':' === substr( $path, 1, 1 ) ) {\n\t\t$path = ucfirst( $path );\n\t}\n\treturn $path;\n}\n\n/**\n * Determine a writable directory for temporary files.\n *\n * Function's preference is the return value of sys_get_temp_dir(),\n * followed by your PHP temporary upload directory, followed by WP_CONTENT_DIR,\n * before finally defaulting to /tmp/\n *\n * In the event that this function does not find a writable location,\n * It may be overridden by the WP_TEMP_DIR constant in your wp-config.php file.\n *\n * @since 2.5.0\n *\n * @staticvar string $temp\n *\n * @return string Writable temporary directory.\n */\nfunction get_temp_dir() {\n\tstatic $temp = '';\n\tif ( defined('WP_TEMP_DIR') )\n\t\treturn trailingslashit(WP_TEMP_DIR);\n\n\tif ( $temp )\n\t\treturn trailingslashit( $temp );\n\n\tif ( function_exists('sys_get_temp_dir') ) {\n\t\t$temp = sys_get_temp_dir();\n\t\tif ( @is_dir( $temp ) && wp_is_writable( $temp ) )\n\t\t\treturn trailingslashit( $temp );\n\t}\n\n\t$temp = ini_get('upload_tmp_dir');\n\tif ( @is_dir( $temp ) && wp_is_writable( $temp ) )\n\t\treturn trailingslashit( $temp );\n\n\t$temp = WP_CONTENT_DIR . '/';\n\tif ( is_dir( $temp ) && wp_is_writable( $temp ) )\n\t\treturn $temp;\n\n\treturn '/tmp/';\n}\n\n/**\n * Determine if a directory is writable.\n *\n * This function is used to work around certain ACL issues in PHP primarily\n * affecting Windows Servers.\n *\n * @since 3.6.0\n *\n * @see win_is_writable()\n *\n * @param string $path Path to check for write-ability.\n * @return bool Whether the path is writable.\n */\nfunction wp_is_writable( $path ) {\n\tif ( 'WIN' === strtoupper( substr( PHP_OS, 0, 3 ) ) )\n\t\treturn win_is_writable( $path );\n\telse\n\t\treturn @is_writable( $path );\n}\n\n/**\n * Workaround for Windows bug in is_writable() function\n *\n * PHP has issues with Windows ACL's for determine if a\n * directory is writable or not, this works around them by\n * checking the ability to open files rather than relying\n * upon PHP to interprate the OS ACL.\n *\n * @since 2.8.0\n *\n * @see http://bugs.php.net/bug.php?id=27609\n * @see http://bugs.php.net/bug.php?id=30931\n *\n * @param string $path Windows path to check for write-ability.\n * @return bool Whether the path is writable.\n */\nfunction win_is_writable( $path ) {\n\n\tif ( $path[strlen( $path ) - 1] == '/' ) { // if it looks like a directory, check a random file within the directory\n\t\treturn win_is_writable( $path . uniqid( mt_rand() ) . '.tmp');\n\t} elseif ( is_dir( $path ) ) { // If it's a directory (and not a file) check a random file within the directory\n\t\treturn win_is_writable( $path . '/' . uniqid( mt_rand() ) . '.tmp' );\n\t}\n\t// check tmp file for read/write capabilities\n\t$should_delete_tmp_file = !file_exists( $path );\n\t$f = @fopen( $path, 'a' );\n\tif ( $f === false )\n\t\treturn false;\n\tfclose( $f );\n\tif ( $should_delete_tmp_file )\n\t\tunlink( $path );\n\treturn true;\n}\n\n/**\n * Get an array containing the current upload directory's path and url.\n *\n * Checks the 'upload_path' option, which should be from the web root folder,\n * and if it isn't empty it will be used. If it is empty, then the path will be\n * 'WP_CONTENT_DIR/uploads'. If the 'UPLOADS' constant is defined, then it will\n * override the 'upload_path' option and 'WP_CONTENT_DIR/uploads' path.\n *\n * The upload URL path is set either by the 'upload_url_path' option or by using\n * the 'WP_CONTENT_URL' constant and appending '/uploads' to the path.\n *\n * If the 'uploads_use_yearmonth_folders' is set to true (checkbox if checked in\n * the administration settings panel), then the time will be used. The format\n * will be year first and then month.\n *\n * If the path couldn't be created, then an error will be returned with the key\n * 'error' containing the error message. The error suggests that the parent\n * directory is not writable by the server.\n *\n * On success, the returned array will have many indices:\n * 'path' - base directory and sub directory or full path to upload directory.\n * 'url' - base url and sub directory or absolute URL to upload directory.\n * 'subdir' - sub directory if uploads use year/month folders option is on.\n * 'basedir' - path without subdir.\n * 'baseurl' - URL path without subdir.\n * 'error' - set to false.\n *\n * @since 2.0.0\n *\n * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null.\n * @return array See above for description.\n */\nfunction wp_upload_dir( $time = null ) {\n\t$siteurl = get_option( 'siteurl' );\n\t$upload_path = trim( get_option( 'upload_path' ) );\n\n\tif ( empty( $upload_path ) || 'wp-content/uploads' == $upload_path ) {\n\t\t$dir = WP_CONTENT_DIR . '/uploads';\n\t} elseif ( 0 !== strpos( $upload_path, ABSPATH ) ) {\n\t\t// $dir is absolute, $upload_path is (maybe) relative to ABSPATH\n\t\t$dir = path_join( ABSPATH, $upload_path );\n\t} else {\n\t\t$dir = $upload_path;\n\t}\n\n\tif ( !$url = get_option( 'upload_url_path' ) ) {\n\t\tif ( empty($upload_path) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) )\n\t\t\t$url = WP_CONTENT_URL . '/uploads';\n\t\telse\n\t\t\t$url = trailingslashit( $siteurl ) . $upload_path;\n\t}\n\n\t/*\n\t * Honor the value of UPLOADS. This happens as long as ms-files rewriting is disabled.\n\t * We also sometimes obey UPLOADS when rewriting is enabled -- see the next block.\n\t */\n\tif ( defined( 'UPLOADS' ) && ! ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) ) {\n\t\t$dir = ABSPATH . UPLOADS;\n\t\t$url = trailingslashit( $siteurl ) . UPLOADS;\n\t}\n\n\t// If multisite (and if not the main site in a post-MU network)\n\tif ( is_multisite() && ! ( is_main_network() && is_main_site() && defined( 'MULTISITE' ) ) ) {\n\n\t\tif ( ! get_site_option( 'ms_files_rewriting' ) ) {\n\t\t\t/*\n\t\t\t * If ms-files rewriting is disabled (networks created post-3.5), it is fairly\n\t\t\t * straightforward: Append sites/%d if we're not on the main site (for post-MU\n\t\t\t * networks). (The extra directory prevents a four-digit ID from conflicting with\n\t\t\t * a year-based directory for the main site. But if a MU-era network has disabled\n\t\t\t * ms-files rewriting manually, they don't need the extra directory, as they never\n\t\t\t * had wp-content/uploads for the main site.)\n\t\t\t */\n\n\t\t\tif ( defined( 'MULTISITE' ) )\n\t\t\t\t$ms_dir = '/sites/' . get_current_blog_id();\n\t\t\telse\n\t\t\t\t$ms_dir = '/' . get_current_blog_id();\n\n\t\t\t$dir .= $ms_dir;\n\t\t\t$url .= $ms_dir;\n\n\t\t} elseif ( defined( 'UPLOADS' ) && ! ms_is_switched() ) {\n\t\t\t/*\n\t\t\t * Handle the old-form ms-files.php rewriting if the network still has that enabled.\n\t\t\t * When ms-files rewriting is enabled, then we only listen to UPLOADS when:\n\t\t\t * 1) We are not on the main site in a post-MU network, as wp-content/uploads is used\n\t\t\t *    there, and\n\t\t\t * 2) We are not switched, as ms_upload_constants() hardcodes these constants to reflect\n\t\t\t *    the original blog ID.\n\t\t\t *\n\t\t\t * Rather than UPLOADS, we actually use BLOGUPLOADDIR if it is set, as it is absolute.\n\t\t\t * (And it will be set, see ms_upload_constants().) Otherwise, UPLOADS can be used, as\n\t\t\t * as it is relative to ABSPATH. For the final piece: when UPLOADS is used with ms-files\n\t\t\t * rewriting in multisite, the resulting URL is /files. (#WP22702 for background.)\n\t\t\t */\n\n\t\t\tif ( defined( 'BLOGUPLOADDIR' ) )\n\t\t\t\t$dir = untrailingslashit( BLOGUPLOADDIR );\n\t\t\telse\n\t\t\t\t$dir = ABSPATH . UPLOADS;\n\t\t\t$url = trailingslashit( $siteurl ) . 'files';\n\t\t}\n\t}\n\n\t$basedir = $dir;\n\t$baseurl = $url;\n\n\t$subdir = '';\n\tif ( get_option( 'uploads_use_yearmonth_folders' ) ) {\n\t\t// Generate the yearly and monthly dirs\n\t\tif ( !$time )\n\t\t\t$time = current_time( 'mysql' );\n\t\t$y = substr( $time, 0, 4 );\n\t\t$m = substr( $time, 5, 2 );\n\t\t$subdir = \"/$y/$m\";\n\t}\n\n\t$dir .= $subdir;\n\t$url .= $subdir;\n\n\t/**\n\t * Filter the uploads directory data.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param array $uploads Array of upload directory data with keys of 'path',\n\t *                       'url', 'subdir, 'basedir', and 'error'.\n\t */\n\t$uploads = apply_filters( 'upload_dir',\n\t\tarray(\n\t\t\t'path'    => $dir,\n\t\t\t'url'     => $url,\n\t\t\t'subdir'  => $subdir,\n\t\t\t'basedir' => $basedir,\n\t\t\t'baseurl' => $baseurl,\n\t\t\t'error'   => false,\n\t\t) );\n\n\t// Make sure we have an uploads directory.\n\tif ( ! wp_mkdir_p( $uploads['path'] ) ) {\n\t\tif ( 0 === strpos( $uploads['basedir'], ABSPATH ) )\n\t\t\t$error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir'];\n\t\telse\n\t\t\t$error_path = basename( $uploads['basedir'] ) . $uploads['subdir'];\n\n\t\t$message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $error_path );\n\t\t$uploads['error'] = $message;\n\t}\n\n\treturn $uploads;\n}\n\n/**\n * Get a filename that is sanitized and unique for the given directory.\n *\n * If the filename is not unique, then a number will be added to the filename\n * before the extension, and will continue adding numbers until the filename is\n * unique.\n *\n * The callback is passed three parameters, the first one is the directory, the\n * second is the filename, and the third is the extension.\n *\n * @since 2.5.0\n *\n * @param string   $dir                      Directory.\n * @param string   $filename                 File name.\n * @param callable $unique_filename_callback Callback. Default null.\n * @return string New filename, if given wasn't unique.\n */\nfunction wp_unique_filename( $dir, $filename, $unique_filename_callback = null ) {\n\t// Sanitize the file name before we begin processing.\n\t$filename = sanitize_file_name($filename);\n\n\t// Separate the filename into a name and extension.\n\t$info = pathinfo($filename);\n\t$ext = !empty($info['extension']) ? '.' . $info['extension'] : '';\n\t$name = basename($filename, $ext);\n\n\t// Edge case: if file is named '.ext', treat as an empty name.\n\tif ( $name === $ext )\n\t\t$name = '';\n\n\t/*\n\t * Increment the file number until we have a unique file to save in $dir.\n\t * Use callback if supplied.\n\t */\n\tif ( $unique_filename_callback && is_callable( $unique_filename_callback ) ) {\n\t\t$filename = call_user_func( $unique_filename_callback, $dir, $name, $ext );\n\t} else {\n\t\t$number = '';\n\n\t\t// Change '.ext' to lower case.\n\t\tif ( $ext && strtolower($ext) != $ext ) {\n\t\t\t$ext2 = strtolower($ext);\n\t\t\t$filename2 = preg_replace( '|' . preg_quote($ext) . '$|', $ext2, $filename );\n\n\t\t\t// Check for both lower and upper case extension or image sub-sizes may be overwritten.\n\t\t\twhile ( file_exists($dir . \"/$filename\") || file_exists($dir . \"/$filename2\") ) {\n\t\t\t\t$new_number = $number + 1;\n\t\t\t\t$filename = str_replace( array( \"-$number$ext\", \"$number$ext\" ), \"-$new_number$ext\", $filename );\n\t\t\t\t$filename2 = str_replace( array( \"-$number$ext2\", \"$number$ext2\" ), \"-$new_number$ext2\", $filename2 );\n\t\t\t\t$number = $new_number;\n\t\t\t}\n\t\t\treturn $filename2;\n\t\t}\n\n\t\twhile ( file_exists( $dir . \"/$filename\" ) ) {\n\t\t\tif ( '' == \"$number$ext\" ) {\n\t\t\t\t$filename = \"$filename-\" . ++$number;\n\t\t\t} else {\n\t\t\t\t$filename = str_replace( array( \"-$number$ext\", \"$number$ext\" ), \"-\" . ++$number . $ext, $filename );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $filename;\n}\n\n/**\n * Create a file in the upload folder with given content.\n *\n * If there is an error, then the key 'error' will exist with the error message.\n * If success, then the key 'file' will have the unique file path, the 'url' key\n * will have the link to the new file. and the 'error' key will be set to false.\n *\n * This function will not move an uploaded file to the upload folder. It will\n * create a new file with the content in $bits parameter. If you move the upload\n * file, read the content of the uploaded file, and then you can give the\n * filename and content to this function, which will add it to the upload\n * folder.\n *\n * The permissions will be set on the new file automatically by this function.\n *\n * @since 2.0.0\n *\n * @param string       $name       Filename.\n * @param null|string  $deprecated Never used. Set to null.\n * @param mixed        $bits       File content\n * @param string       $time       Optional. Time formatted in 'yyyy/mm'. Default null.\n * @return array\n */\nfunction wp_upload_bits( $name, $deprecated, $bits, $time = null ) {\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.0' );\n\n\tif ( empty( $name ) )\n\t\treturn array( 'error' => __( 'Empty filename' ) );\n\n\t$wp_filetype = wp_check_filetype( $name );\n\tif ( ! $wp_filetype['ext'] && ! current_user_can( 'unfiltered_upload' ) )\n\t\treturn array( 'error' => __( 'Invalid file type' ) );\n\n\t$upload = wp_upload_dir( $time );\n\n\tif ( $upload['error'] !== false )\n\t\treturn $upload;\n\n\t/**\n\t * Filter whether to treat the upload bits as an error.\n\t *\n\t * Passing a non-array to the filter will effectively short-circuit preparing\n\t * the upload bits, returning that value instead.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param mixed $upload_bits_error An array of upload bits data, or a non-array error to return.\n\t */\n\t$upload_bits_error = apply_filters( 'wp_upload_bits', array( 'name' => $name, 'bits' => $bits, 'time' => $time ) );\n\tif ( !is_array( $upload_bits_error ) ) {\n\t\t$upload[ 'error' ] = $upload_bits_error;\n\t\treturn $upload;\n\t}\n\n\t$filename = wp_unique_filename( $upload['path'], $name );\n\n\t$new_file = $upload['path'] . \"/$filename\";\n\tif ( ! wp_mkdir_p( dirname( $new_file ) ) ) {\n\t\tif ( 0 === strpos( $upload['basedir'], ABSPATH ) )\n\t\t\t$error_path = str_replace( ABSPATH, '', $upload['basedir'] ) . $upload['subdir'];\n\t\telse\n\t\t\t$error_path = basename( $upload['basedir'] ) . $upload['subdir'];\n\n\t\t$message = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), $error_path );\n\t\treturn array( 'error' => $message );\n\t}\n\n\t$ifp = @ fopen( $new_file, 'wb' );\n\tif ( ! $ifp )\n\t\treturn array( 'error' => sprintf( __( 'Could not write file %s' ), $new_file ) );\n\n\t@fwrite( $ifp, $bits );\n\tfclose( $ifp );\n\tclearstatcache();\n\n\t// Set correct file permissions\n\t$stat = @ stat( dirname( $new_file ) );\n\t$perms = $stat['mode'] & 0007777;\n\t$perms = $perms & 0000666;\n\t@ chmod( $new_file, $perms );\n\tclearstatcache();\n\n\t// Compute the URL\n\t$url = $upload['url'] . \"/$filename\";\n\n\t/** This filter is documented in wp-admin/includes/file.php */\n\treturn apply_filters( 'wp_handle_upload', array( 'file' => $new_file, 'url' => $url, 'type' => $wp_filetype['type'], 'error' => false ), 'sideload' );\n}\n\n/**\n * Retrieve the file type based on the extension name.\n *\n * @since 2.5.0\n *\n * @param string $ext The extension to search.\n * @return string|void The file type, example: audio, video, document, spreadsheet, etc.\n */\nfunction wp_ext2type( $ext ) {\n\t$ext = strtolower( $ext );\n\n\t/**\n\t * Filter file type based on the extension name.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @see wp_ext2type()\n\t *\n\t * @param array $ext2type Multi-dimensional array with extensions for a default set\n\t *                        of file types.\n\t */\n\t$ext2type = apply_filters( 'ext2type', array(\n\t\t'image'       => array( 'jpg', 'jpeg', 'jpe',  'gif',  'png',  'bmp',   'tif',  'tiff', 'ico' ),\n\t\t'audio'       => array( 'aac', 'ac3',  'aif',  'aiff', 'm3a',  'm4a',   'm4b',  'mka',  'mp1',  'mp2',  'mp3', 'ogg', 'oga', 'ram', 'wav', 'wma' ),\n\t\t'video'       => array( '3g2',  '3gp', '3gpp', 'asf', 'avi',  'divx', 'dv',   'flv',  'm4v',   'mkv',  'mov',  'mp4',  'mpeg', 'mpg', 'mpv', 'ogm', 'ogv', 'qt',  'rm', 'vob', 'wmv' ),\n\t\t'document'    => array( 'doc', 'docx', 'docm', 'dotm', 'odt',  'pages', 'pdf',  'xps',  'oxps', 'rtf',  'wp', 'wpd', 'psd', 'xcf' ),\n\t\t'spreadsheet' => array( 'numbers',     'ods',  'xls',  'xlsx', 'xlsm',  'xlsb' ),\n\t\t'interactive' => array( 'swf', 'key',  'ppt',  'pptx', 'pptm', 'pps',   'ppsx', 'ppsm', 'sldx', 'sldm', 'odp' ),\n\t\t'text'        => array( 'asc', 'csv',  'tsv',  'txt' ),\n\t\t'archive'     => array( 'bz2', 'cab',  'dmg',  'gz',   'rar',  'sea',   'sit',  'sqx',  'tar',  'tgz',  'zip', '7z' ),\n\t\t'code'        => array( 'css', 'htm',  'html', 'php',  'js' ),\n\t) );\n\n\tforeach ( $ext2type as $type => $exts )\n\t\tif ( in_array( $ext, $exts ) )\n\t\t\treturn $type;\n}\n\n/**\n * Retrieve the file type from the file name.\n *\n * You can optionally define the mime array, if needed.\n *\n * @since 2.0.4\n *\n * @param string $filename File name or path.\n * @param array  $mimes    Optional. Key is the file extension with value as the mime type.\n * @return array Values with extension first and mime type.\n */\nfunction wp_check_filetype( $filename, $mimes = null ) {\n\tif ( empty($mimes) )\n\t\t$mimes = get_allowed_mime_types();\n\t$type = false;\n\t$ext = false;\n\n\tforeach ( $mimes as $ext_preg => $mime_match ) {\n\t\t$ext_preg = '!\\.(' . $ext_preg . ')$!i';\n\t\tif ( preg_match( $ext_preg, $filename, $ext_matches ) ) {\n\t\t\t$type = $mime_match;\n\t\t\t$ext = $ext_matches[1];\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn compact( 'ext', 'type' );\n}\n\n/**\n * Attempt to determine the real file type of a file.\n *\n * If unable to, the file name extension will be used to determine type.\n *\n * If it's determined that the extension does not match the file's real type,\n * then the \"proper_filename\" value will be set with a proper filename and extension.\n *\n * Currently this function only supports validating images known to getimagesize().\n *\n * @since 3.0.0\n *\n * @param string $file     Full path to the file.\n * @param string $filename The name of the file (may differ from $file due to $file being\n *                         in a tmp directory).\n * @param array   $mimes   Optional. Key is the file extension with value as the mime type.\n * @return array Values for the extension, MIME, and either a corrected filename or false\n *               if original $filename is valid.\n */\nfunction wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {\n\t$proper_filename = false;\n\n\t// Do basic extension validation and MIME mapping\n\t$wp_filetype = wp_check_filetype( $filename, $mimes );\n\t$ext = $wp_filetype['ext'];\n\t$type = $wp_filetype['type'];\n\n\t// We can't do any further validation without a file to work with\n\tif ( ! file_exists( $file ) ) {\n\t\treturn compact( 'ext', 'type', 'proper_filename' );\n\t}\n\n\t// We're able to validate images using GD\n\tif ( $type && 0 === strpos( $type, 'image/' ) && function_exists('getimagesize') ) {\n\n\t\t// Attempt to figure out what type of image it actually is\n\t\t$imgstats = @getimagesize( $file );\n\n\t\t// If getimagesize() knows what kind of image it really is and if the real MIME doesn't match the claimed MIME\n\t\tif ( !empty($imgstats['mime']) && $imgstats['mime'] != $type ) {\n\t\t\t/**\n\t\t\t * Filter the list mapping image mime types to their respective extensions.\n\t\t\t *\n\t\t\t * @since 3.0.0\n\t\t\t *\n\t\t\t * @param  array $mime_to_ext Array of image mime types and their matching extensions.\n\t\t\t */\n\t\t\t$mime_to_ext = apply_filters( 'getimagesize_mimes_to_exts', array(\n\t\t\t\t'image/jpeg' => 'jpg',\n\t\t\t\t'image/png'  => 'png',\n\t\t\t\t'image/gif'  => 'gif',\n\t\t\t\t'image/bmp'  => 'bmp',\n\t\t\t\t'image/tiff' => 'tif',\n\t\t\t) );\n\n\t\t\t// Replace whatever is after the last period in the filename with the correct extension\n\t\t\tif ( ! empty( $mime_to_ext[ $imgstats['mime'] ] ) ) {\n\t\t\t\t$filename_parts = explode( '.', $filename );\n\t\t\t\tarray_pop( $filename_parts );\n\t\t\t\t$filename_parts[] = $mime_to_ext[ $imgstats['mime'] ];\n\t\t\t\t$new_filename = implode( '.', $filename_parts );\n\n\t\t\t\tif ( $new_filename != $filename ) {\n\t\t\t\t\t$proper_filename = $new_filename; // Mark that it changed\n\t\t\t\t}\n\t\t\t\t// Redefine the extension / MIME\n\t\t\t\t$wp_filetype = wp_check_filetype( $new_filename, $mimes );\n\t\t\t\t$ext = $wp_filetype['ext'];\n\t\t\t\t$type = $wp_filetype['type'];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter the \"real\" file type of the given file.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array  $wp_check_filetype_and_ext File data array containing 'ext', 'type', and\n\t *                                          'proper_filename' keys.\n\t * @param string $file                      Full path to the file.\n\t * @param string $filename                  The name of the file (may differ from $file due to\n\t *                                          $file being in a tmp directory).\n\t * @param array  $mimes                     Key is the file extension with value as the mime type.\n\t */\n\treturn apply_filters( 'wp_check_filetype_and_ext', compact( 'ext', 'type', 'proper_filename' ), $file, $filename, $mimes );\n}\n\n/**\n * Retrieve list of mime types and file extensions.\n *\n * @since 3.5.0\n * @since 4.2.0 Support was added for GIMP (xcf) files.\n *\n * @return array Array of mime types keyed by the file extension regex corresponding to those types.\n */\nfunction wp_get_mime_types() {\n\t/**\n\t * Filter the list of mime types and file extensions.\n\t *\n\t * This filter should be used to add, not remove, mime types. To remove\n\t * mime types, use the 'upload_mimes' filter.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array $wp_get_mime_types Mime types keyed by the file extension regex\n\t *                                 corresponding to those types.\n\t */\n\treturn apply_filters( 'mime_types', array(\n\t// Image formats.\n\t'jpg|jpeg|jpe' => 'image/jpeg',\n\t'gif' => 'image/gif',\n\t'png' => 'image/png',\n\t'bmp' => 'image/bmp',\n\t'tiff|tif' => 'image/tiff',\n\t'ico' => 'image/x-icon',\n\t// Video formats.\n\t'asf|asx' => 'video/x-ms-asf',\n\t'wmv' => 'video/x-ms-wmv',\n\t'wmx' => 'video/x-ms-wmx',\n\t'wm' => 'video/x-ms-wm',\n\t'avi' => 'video/avi',\n\t'divx' => 'video/divx',\n\t'flv' => 'video/x-flv',\n\t'mov|qt' => 'video/quicktime',\n\t'mpeg|mpg|mpe' => 'video/mpeg',\n\t'mp4|m4v' => 'video/mp4',\n\t'ogv' => 'video/ogg',\n\t'webm' => 'video/webm',\n\t'mkv' => 'video/x-matroska',\n\t'3gp|3gpp' => 'video/3gpp', // Can also be audio\n\t'3g2|3gp2' => 'video/3gpp2', // Can also be audio\n\t// Text formats.\n\t'txt|asc|c|cc|h|srt' => 'text/plain',\n\t'csv' => 'text/csv',\n\t'tsv' => 'text/tab-separated-values',\n\t'ics' => 'text/calendar',\n\t'rtx' => 'text/richtext',\n\t'css' => 'text/css',\n\t'htm|html' => 'text/html',\n\t'vtt' => 'text/vtt',\n\t'dfxp' => 'application/ttaf+xml',\n\t// Audio formats.\n\t'mp3|m4a|m4b' => 'audio/mpeg',\n\t'ra|ram' => 'audio/x-realaudio',\n\t'wav' => 'audio/wav',\n\t'ogg|oga' => 'audio/ogg',\n\t'mid|midi' => 'audio/midi',\n\t'wma' => 'audio/x-ms-wma',\n\t'wax' => 'audio/x-ms-wax',\n\t'mka' => 'audio/x-matroska',\n\t// Misc application formats.\n\t'rtf' => 'application/rtf',\n\t'js' => 'application/javascript',\n\t'pdf' => 'application/pdf',\n\t'swf' => 'application/x-shockwave-flash',\n\t'class' => 'application/java',\n\t'tar' => 'application/x-tar',\n\t'zip' => 'application/zip',\n\t'gz|gzip' => 'application/x-gzip',\n\t'rar' => 'application/rar',\n\t'7z' => 'application/x-7z-compressed',\n\t'exe' => 'application/x-msdownload',\n\t'psd' => 'application/octet-stream',\n\t'xcf' => 'application/octet-stream',\n\t// MS Office formats.\n\t'doc' => 'application/msword',\n\t'pot|pps|ppt' => 'application/vnd.ms-powerpoint',\n\t'wri' => 'application/vnd.ms-write',\n\t'xla|xls|xlt|xlw' => 'application/vnd.ms-excel',\n\t'mdb' => 'application/vnd.ms-access',\n\t'mpp' => 'application/vnd.ms-project',\n\t'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n\t'docm' => 'application/vnd.ms-word.document.macroEnabled.12',\n\t'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\n\t'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',\n\t'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n\t'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',\n\t'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n\t'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n\t'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',\n\t'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',\n\t'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\t'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\n\t'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n\t'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\n\t'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',\n\t'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12',\n\t'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',\n\t'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',\n\t'sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12',\n\t'onetoc|onetoc2|onetmp|onepkg' => 'application/onenote',\n\t'oxps' => 'application/oxps',\n\t'xps' => 'application/vnd.ms-xpsdocument',\n\t// OpenOffice formats.\n\t'odt' => 'application/vnd.oasis.opendocument.text',\n\t'odp' => 'application/vnd.oasis.opendocument.presentation',\n\t'ods' => 'application/vnd.oasis.opendocument.spreadsheet',\n\t'odg' => 'application/vnd.oasis.opendocument.graphics',\n\t'odc' => 'application/vnd.oasis.opendocument.chart',\n\t'odb' => 'application/vnd.oasis.opendocument.database',\n\t'odf' => 'application/vnd.oasis.opendocument.formula',\n\t// WordPerfect formats.\n\t'wp|wpd' => 'application/wordperfect',\n\t// iWork formats.\n\t'key' => 'application/vnd.apple.keynote',\n\t'numbers' => 'application/vnd.apple.numbers',\n\t'pages' => 'application/vnd.apple.pages',\n\t) );\n}\n/**\n * Retrieve list of allowed mime types and file extensions.\n *\n * @since 2.8.6\n *\n * @param int|WP_User $user Optional. User to check. Defaults to current user.\n * @return array Array of mime types keyed by the file extension regex corresponding\n *               to those types.\n */\nfunction get_allowed_mime_types( $user = null ) {\n\t$t = wp_get_mime_types();\n\n\tunset( $t['swf'], $t['exe'] );\n\tif ( function_exists( 'current_user_can' ) )\n\t\t$unfiltered = $user ? user_can( $user, 'unfiltered_html' ) : current_user_can( 'unfiltered_html' );\n\n\tif ( empty( $unfiltered ) )\n\t\tunset( $t['htm|html'] );\n\n\t/**\n\t * Filter list of allowed mime types and file extensions.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param array            $t    Mime types keyed by the file extension regex corresponding to\n\t *                               those types. 'swf' and 'exe' removed from full list. 'htm|html' also\n\t *                               removed depending on '$user' capabilities.\n\t * @param int|WP_User|null $user User ID, User object or null if not provided (indicates current user).\n\t */\n\treturn apply_filters( 'upload_mimes', $t, $user );\n}\n\n/**\n * Display \"Are You Sure\" message to confirm the action being taken.\n *\n * If the action has the nonce explain message, then it will be displayed\n * along with the \"Are you sure?\" message.\n *\n * @since 2.0.4\n *\n * @param string $action The nonce action.\n */\nfunction wp_nonce_ays( $action ) {\n\tif ( 'log-out' == $action ) {\n\t\t$html = sprintf( __( 'You are attempting to log out of %s' ), get_bloginfo( 'name' ) ) . '</p><p>';\n\t\t$redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';\n\t\t$html .= sprintf( __( \"Do you really want to <a href='%s'>log out</a>?\"), wp_logout_url( $redirect_to ) );\n\t} else {\n\t\t$html = __( 'Are you sure you want to do this?' );\n\t\tif ( wp_get_referer() )\n\t\t\t$html .= \"</p><p><a href='\" . esc_url( remove_query_arg( 'updated', wp_get_referer() ) ) . \"'>\" . __( 'Please try again.' ) . \"</a>\";\n\t}\n\n\twp_die( $html, __( 'WordPress Failure Notice' ), 403 );\n}\n\n/**\n * Kill WordPress execution and display HTML message with error message.\n *\n * This function complements the `die()` PHP function. The difference is that\n * HTML will be displayed to the user. It is recommended to use this function\n * only when the execution should not continue any further. It is not recommended\n * to call this function very often, and try to handle as many errors as possible\n * silently or more gracefully.\n *\n * As a shorthand, the desired HTTP response code may be passed as an integer to\n * the `$title` parameter (the default title would apply) or the `$args` parameter.\n *\n * @since 2.0.4\n * @since 4.1.0 The `$title` and `$args` parameters were changed to optionally accept\n *              an integer to be used as the response code.\n *\n * @param string|WP_Error  $message Optional. Error message. If this is a {@see WP_Error} object,\n *                                  the error's messages are used. Default empty.\n * @param string|int       $title   Optional. Error title. If `$message` is a `WP_Error` object,\n *                                  error data with the key 'title' may be used to specify the title.\n *                                  If `$title` is an integer, then it is treated as the response\n *                                  code. Default empty.\n * @param string|array|int $args {\n *     Optional. Arguments to control behavior. If `$args` is an integer, then it is treated\n *     as the response code. Default empty array.\n *\n *     @type int    $response       The HTTP response code. Default 500.\n *     @type bool   $back_link      Whether to include a link to go back. Default false.\n *     @type string $text_direction The text direction. This is only useful internally, when WordPress\n *                                  is still loading and the site's locale is not set up yet. Accepts 'rtl'.\n *                                  Default is the value of {@see is_rtl()}.\n * }\n */\nfunction wp_die( $message = '', $title = '', $args = array() ) {\n\n\tif ( is_int( $args ) ) {\n\t\t$args = array( 'response' => $args );\n\t} elseif ( is_int( $title ) ) {\n\t\t$args  = array( 'response' => $title );\n\t\t$title = '';\n\t}\n\n\tif ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {\n\t\t/**\n\t\t * Filter callback for killing WordPress execution for AJAX requests.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param callable $function Callback function name.\n\t\t */\n\t\t$function = apply_filters( 'wp_die_ajax_handler', '_ajax_wp_die_handler' );\n\t} elseif ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) {\n\t\t/**\n\t\t * Filter callback for killing WordPress execution for XML-RPC requests.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param callable $function Callback function name.\n\t\t */\n\t\t$function = apply_filters( 'wp_die_xmlrpc_handler', '_xmlrpc_wp_die_handler' );\n\t} else {\n\t\t/**\n\t\t * Filter callback for killing WordPress execution for all non-AJAX, non-XML-RPC requests.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param callable $function Callback function name.\n\t\t */\n\t\t$function = apply_filters( 'wp_die_handler', '_default_wp_die_handler' );\n\t}\n\n\tcall_user_func( $function, $message, $title, $args );\n}\n\n/**\n * Kill WordPress execution and display HTML message with error message.\n *\n * This is the default handler for wp_die if you want a custom one for your\n * site then you can overload using the wp_die_handler filter in wp_die\n *\n * @since 3.0.0\n * @access private\n *\n * @param string       $message Error message.\n * @param string       $title   Optional. Error title. Default empty.\n * @param string|array $args    Optional. Arguments to control behavior. Default empty array.\n */\nfunction _default_wp_die_handler( $message, $title = '', $args = array() ) {\n\t$defaults = array( 'response' => 500 );\n\t$r = wp_parse_args($args, $defaults);\n\n\t$have_gettext = function_exists('__');\n\n\tif ( function_exists( 'is_wp_error' ) && is_wp_error( $message ) ) {\n\t\tif ( empty( $title ) ) {\n\t\t\t$error_data = $message->get_error_data();\n\t\t\tif ( is_array( $error_data ) && isset( $error_data['title'] ) )\n\t\t\t\t$title = $error_data['title'];\n\t\t}\n\t\t$errors = $message->get_error_messages();\n\t\tswitch ( count( $errors ) ) {\n\t\tcase 0 :\n\t\t\t$message = '';\n\t\t\tbreak;\n\t\tcase 1 :\n\t\t\t$message = \"<p>{$errors[0]}</p>\";\n\t\t\tbreak;\n\t\tdefault :\n\t\t\t$message = \"<ul>\\n\\t\\t<li>\" . join( \"</li>\\n\\t\\t<li>\", $errors ) . \"</li>\\n\\t</ul>\";\n\t\t\tbreak;\n\t\t}\n\t} elseif ( is_string( $message ) ) {\n\t\t$message = \"<p>$message</p>\";\n\t}\n\n\tif ( isset( $r['back_link'] ) && $r['back_link'] ) {\n\t\t$back_text = $have_gettext? __('&laquo; Back') : '&laquo; Back';\n\t\t$message .= \"\\n<p><a href='javascript:history.back()'>$back_text</a></p>\";\n\t}\n\n\tif ( ! did_action( 'admin_head' ) ) :\n\t\tif ( !headers_sent() ) {\n\t\t\tstatus_header( $r['response'] );\n\t\t\tnocache_headers();\n\t\t\theader( 'Content-Type: text/html; charset=utf-8' );\n\t\t}\n\n\t\tif ( empty($title) )\n\t\t\t$title = $have_gettext ? __('WordPress &rsaquo; Error') : 'WordPress &rsaquo; Error';\n\n\t\t$text_direction = 'ltr';\n\t\tif ( isset($r['text_direction']) && 'rtl' == $r['text_direction'] )\n\t\t\t$text_direction = 'rtl';\n\t\telseif ( function_exists( 'is_rtl' ) && is_rtl() )\n\t\t\t$text_direction = 'rtl';\n?>\n<!DOCTYPE html>\n<!-- Ticket #11289, IE bug fix: always pad the error page with enough characters such that it is greater than 512 bytes, even after gzip compression abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono\n-->\n<html xmlns=\"http://www.w3.org/1999/xhtml\" <?php if ( function_exists( 'language_attributes' ) && function_exists( 'is_rtl' ) ) language_attributes(); else echo \"dir='$text_direction'\"; ?>>\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<meta name=\"viewport\" content=\"width=device-width\">\n\t<title><?php echo $title ?></title>\n\t<style type=\"text/css\">\n\t\thtml {\n\t\t\tbackground: #f1f1f1;\n\t\t}\n\t\tbody {\n\t\t\tbackground: #fff;\n\t\t\tcolor: #444;\n\t\t\tfont-family: \"Open Sans\", sans-serif;\n\t\t\tmargin: 2em auto;\n\t\t\tpadding: 1em 2em;\n\t\t\tmax-width: 700px;\n\t\t\t-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.13);\n\t\t\tbox-shadow: 0 1px 3px rgba(0,0,0,0.13);\n\t\t}\n\t\th1 {\n\t\t\tborder-bottom: 1px solid #dadada;\n\t\t\tclear: both;\n\t\t\tcolor: #666;\n\t\t\tfont: 24px \"Open Sans\", sans-serif;\n\t\t\tmargin: 30px 0 0 0;\n\t\t\tpadding: 0;\n\t\t\tpadding-bottom: 7px;\n\t\t}\n\t\t#error-page {\n\t\t\tmargin-top: 50px;\n\t\t}\n\t\t#error-page p {\n\t\t\tfont-size: 14px;\n\t\t\tline-height: 1.5;\n\t\t\tmargin: 25px 0 20px;\n\t\t}\n\t\t#error-page code {\n\t\t\tfont-family: Consolas, Monaco, monospace;\n\t\t}\n\t\tul li {\n\t\t\tmargin-bottom: 10px;\n\t\t\tfont-size: 14px ;\n\t\t}\n\t\ta {\n\t\t\tcolor: #0073aa;\n\t\t}\n\t\ta:hover,\n\t\ta:active {\n\t\t\tcolor: #00a0d2;\n\t\t}\n\t\ta:focus {\n\t\t\tcolor: #124964;\n\t\t    -webkit-box-shadow:\n\t\t    \t0 0 0 1px #5b9dd9,\n\t\t\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\t\t    box-shadow:\n\t\t    \t0 0 0 1px #5b9dd9,\n\t\t\t\t0 0 2px 1px rgba(30, 140, 190, .8);\n\t\t\toutline: none;\n\t\t}\n\t\t.button {\n\t\t\tbackground: #f7f7f7;\n\t\t\tborder: 1px solid #ccc;\n\t\t\tcolor: #555;\n\t\t\tdisplay: inline-block;\n\t\t\ttext-decoration: none;\n\t\t\tfont-size: 13px;\n\t\t\tline-height: 26px;\n\t\t\theight: 28px;\n\t\t\tmargin: 0;\n\t\t\tpadding: 0 10px 1px;\n\t\t\tcursor: pointer;\n\t\t\t-webkit-border-radius: 3px;\n\t\t\t-webkit-appearance: none;\n\t\t\tborder-radius: 3px;\n\t\t\twhite-space: nowrap;\n\t\t\t-webkit-box-sizing: border-box;\n\t\t\t-moz-box-sizing:    border-box;\n\t\t\tbox-sizing:         border-box;\n\n\t\t\t-webkit-box-shadow: 0 1px 0 #ccc;\n\t\t\tbox-shadow: 0 1px 0 #ccc;\n\t\t \tvertical-align: top;\n\t\t}\n\n\t\t.button.button-large {\n\t\t\theight: 30px;\n\t\t\tline-height: 28px;\n\t\t\tpadding: 0 12px 2px;\n\t\t}\n\n\t\t.button:hover,\n\t\t.button:focus {\n\t\t\tbackground: #fafafa;\n\t\t\tborder-color: #999;\n\t\t\tcolor: #23282d;\n\t\t}\n\n\t\t.button:focus  {\n\t\t\tborder-color: #5b9dd9;\n\t\t\t-webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n\t\t\tbox-shadow: 0 0 3px rgba( 0, 115, 170, .8 );\n\t\t\toutline: none;\n\t\t}\n\n\t\t.button:active {\n\t\t\tbackground: #eee;\n\t\t\tborder-color: #999;\n\t\t \t-webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n\t\t \tbox-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 );\n\t\t \t-webkit-transform: translateY(1px);\n\t\t \t-ms-transform: translateY(1px);\n\t\t \ttransform: translateY(1px);\n\t\t}\n\n\t\t<?php\n\t\tif ( 'rtl' == $text_direction ) {\n\t\t\techo 'body { font-family: Tahoma, Arial; }';\n\t\t}\n\t\t?>\n\t</style>\n</head>\n<body id=\"error-page\">\n<?php endif; // ! did_action( 'admin_head' ) ?>\n\t<?php echo $message; ?>\n</body>\n</html>\n<?php\n\tdie();\n}\n\n/**\n * Kill WordPress execution and display XML message with error message.\n *\n * This is the handler for wp_die when processing XMLRPC requests.\n *\n * @since 3.2.0\n * @access private\n *\n * @global wp_xmlrpc_server $wp_xmlrpc_server\n *\n * @param string       $message Error message.\n * @param string       $title   Optional. Error title. Default empty.\n * @param string|array $args    Optional. Arguments to control behavior. Default empty array.\n */\nfunction _xmlrpc_wp_die_handler( $message, $title = '', $args = array() ) {\n\tglobal $wp_xmlrpc_server;\n\t$defaults = array( 'response' => 500 );\n\n\t$r = wp_parse_args($args, $defaults);\n\n\tif ( $wp_xmlrpc_server ) {\n\t\t$error = new IXR_Error( $r['response'] , $message);\n\t\t$wp_xmlrpc_server->output( $error->getXml() );\n\t}\n\tdie();\n}\n\n/**\n * Kill WordPress ajax execution.\n *\n * This is the handler for wp_die when processing Ajax requests.\n *\n * @since 3.4.0\n * @access private\n *\n * @param string $message Optional. Response to print. Default empty.\n */\nfunction _ajax_wp_die_handler( $message = '' ) {\n\tif ( is_scalar( $message ) )\n\t\tdie( (string) $message );\n\tdie( '0' );\n}\n\n/**\n * Kill WordPress execution.\n *\n * This is the handler for wp_die when processing APP requests.\n *\n * @since 3.4.0\n * @access private\n *\n * @param string $message Optional. Response to print. Default empty.\n */\nfunction _scalar_wp_die_handler( $message = '' ) {\n\tif ( is_scalar( $message ) )\n\t\tdie( (string) $message );\n\tdie();\n}\n\n/**\n * Encode a variable into JSON, with some sanity checks.\n *\n * @since 4.1.0\n *\n * @param mixed $data    Variable (usually an array or object) to encode as JSON.\n * @param int   $options Optional. Options to be passed to json_encode(). Default 0.\n * @param int   $depth   Optional. Maximum depth to walk through $data. Must be\n *                       greater than 0. Default 512.\n * @return string|false The JSON encoded string, or false if it cannot be encoded.\n */\nfunction wp_json_encode( $data, $options = 0, $depth = 512 ) {\n\t/*\n\t * json_encode() has had extra params added over the years.\n\t * $options was added in 5.3, and $depth in 5.5.\n\t * We need to make sure we call it with the correct arguments.\n\t */\n\tif ( version_compare( PHP_VERSION, '5.5', '>=' ) ) {\n\t\t$args = array( $data, $options, $depth );\n\t} elseif ( version_compare( PHP_VERSION, '5.3', '>=' ) ) {\n\t\t$args = array( $data, $options );\n\t} else {\n\t\t$args = array( $data );\n\t}\n\n\t// Prepare the data for JSON serialization.\n\t$data = _wp_json_prepare_data( $data );\n\n\t$json = @call_user_func_array( 'json_encode', $args );\n\n\t// If json_encode() was successful, no need to do more sanity checking.\n\t// ... unless we're in an old version of PHP, and json_encode() returned\n\t// a string containing 'null'. Then we need to do more sanity checking.\n\tif ( false !== $json && ( version_compare( PHP_VERSION, '5.5', '>=' ) || false === strpos( $json, 'null' ) ) )  {\n\t\treturn $json;\n\t}\n\n\ttry {\n\t\t$args[0] = _wp_json_sanity_check( $data, $depth );\n\t} catch ( Exception $e ) {\n\t\treturn false;\n\t}\n\n\treturn call_user_func_array( 'json_encode', $args );\n}\n\n/**\n * Perform sanity checks on data that shall be encoded to JSON.\n *\n * @ignore\n * @since 4.1.0\n * @access private\n *\n * @see wp_json_encode()\n *\n * @param mixed $data  Variable (usually an array or object) to encode as JSON.\n * @param int   $depth Maximum depth to walk through $data. Must be greater than 0.\n * @return mixed The sanitized data that shall be encoded to JSON.\n */\nfunction _wp_json_sanity_check( $data, $depth ) {\n\tif ( $depth < 0 ) {\n\t\tthrow new Exception( 'Reached depth limit' );\n\t}\n\n\tif ( is_array( $data ) ) {\n\t\t$output = array();\n\t\tforeach ( $data as $id => $el ) {\n\t\t\t// Don't forget to sanitize the ID!\n\t\t\tif ( is_string( $id ) ) {\n\t\t\t\t$clean_id = _wp_json_convert_string( $id );\n\t\t\t} else {\n\t\t\t\t$clean_id = $id;\n\t\t\t}\n\n\t\t\t// Check the element type, so that we're only recursing if we really have to.\n\t\t\tif ( is_array( $el ) || is_object( $el ) ) {\n\t\t\t\t$output[ $clean_id ] = _wp_json_sanity_check( $el, $depth - 1 );\n\t\t\t} elseif ( is_string( $el ) ) {\n\t\t\t\t$output[ $clean_id ] = _wp_json_convert_string( $el );\n\t\t\t} else {\n\t\t\t\t$output[ $clean_id ] = $el;\n\t\t\t}\n\t\t}\n\t} elseif ( is_object( $data ) ) {\n\t\t$output = new stdClass;\n\t\tforeach ( $data as $id => $el ) {\n\t\t\tif ( is_string( $id ) ) {\n\t\t\t\t$clean_id = _wp_json_convert_string( $id );\n\t\t\t} else {\n\t\t\t\t$clean_id = $id;\n\t\t\t}\n\n\t\t\tif ( is_array( $el ) || is_object( $el ) ) {\n\t\t\t\t$output->$clean_id = _wp_json_sanity_check( $el, $depth - 1 );\n\t\t\t} elseif ( is_string( $el ) ) {\n\t\t\t\t$output->$clean_id = _wp_json_convert_string( $el );\n\t\t\t} else {\n\t\t\t\t$output->$clean_id = $el;\n\t\t\t}\n\t\t}\n\t} elseif ( is_string( $data ) ) {\n\t\treturn _wp_json_convert_string( $data );\n\t} else {\n\t\treturn $data;\n\t}\n\n\treturn $output;\n}\n\n/**\n * Convert a string to UTF-8, so that it can be safely encoded to JSON.\n *\n * @ignore\n * @since 4.1.0\n * @access private\n *\n * @see _wp_json_sanity_check()\n *\n * @staticvar bool $use_mb\n *\n * @param string $string The string which is to be converted.\n * @return string The checked string.\n */\nfunction _wp_json_convert_string( $string ) {\n\tstatic $use_mb = null;\n\tif ( is_null( $use_mb ) ) {\n\t\t$use_mb = function_exists( 'mb_convert_encoding' );\n\t}\n\n\tif ( $use_mb ) {\n\t\t$encoding = mb_detect_encoding( $string, mb_detect_order(), true );\n\t\tif ( $encoding ) {\n\t\t\treturn mb_convert_encoding( $string, 'UTF-8', $encoding );\n\t\t} else {\n\t\t\treturn mb_convert_encoding( $string, 'UTF-8', 'UTF-8' );\n\t\t}\n\t} else {\n\t\treturn wp_check_invalid_utf8( $string, true );\n\t}\n}\n\n/**\n * Prepares response data to be serialized to JSON.\n *\n * This supports the JsonSerializable interface for PHP 5.2-5.3 as well.\n *\n * @ignore\n * @since 4.4.0\n * @access private\n *\n * @param mixed $data Native representation.\n * @return bool|int|float|null|string|array Data ready for `json_encode()`.\n */\nfunction _wp_json_prepare_data( $data ) {\n\tif ( ! defined( 'WP_JSON_SERIALIZE_COMPATIBLE' ) || WP_JSON_SERIALIZE_COMPATIBLE === false ) {\n\t\treturn $data;\n\t}\n\n\tswitch ( gettype( $data ) ) {\n\t\tcase 'boolean':\n\t\tcase 'integer':\n\t\tcase 'double':\n\t\tcase 'string':\n\t\tcase 'NULL':\n\t\t\t// These values can be passed through.\n\t\t\treturn $data;\n\n\t\tcase 'array':\n\t\t\t// Arrays must be mapped in case they also return objects.\n\t\t\treturn array_map( '_wp_json_prepare_data', $data );\n\n\t\tcase 'object':\n\t\t\t// If this is an incomplete object (__PHP_Incomplete_Class), bail.\n\t\t\tif ( ! is_object( $data ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( $data instanceof JsonSerializable ) {\n\t\t\t\t$data = $data->jsonSerialize();\n\t\t\t} else {\n\t\t\t\t$data = get_object_vars( $data );\n\t\t\t}\n\n\t\t\t// Now, pass the array (or whatever was returned from jsonSerialize through).\n\t\t\treturn _wp_json_prepare_data( $data );\n\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Send a JSON response back to an Ajax request.\n *\n * @since 3.5.0\n *\n * @param mixed $response Variable (usually an array or object) to encode as JSON,\n *                        then print and die.\n */\nfunction wp_send_json( $response ) {\n\t@header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );\n\techo wp_json_encode( $response );\n\tif ( defined( 'DOING_AJAX' ) && DOING_AJAX )\n\t\twp_die();\n\telse\n\t\tdie;\n}\n\n/**\n * Send a JSON response back to an Ajax request, indicating success.\n *\n * @since 3.5.0\n *\n * @param mixed $data Data to encode as JSON, then print and die.\n */\nfunction wp_send_json_success( $data = null ) {\n\t$response = array( 'success' => true );\n\n\tif ( isset( $data ) )\n\t\t$response['data'] = $data;\n\n\twp_send_json( $response );\n}\n\n/**\n * Send a JSON response back to an Ajax request, indicating failure.\n *\n * If the `$data` parameter is a {@see WP_Error} object, the errors\n * within the object are processed and output as an array of error\n * codes and corresponding messages. All other types are output\n * without further processing.\n *\n * @since 3.5.0\n * @since 4.1.0 The `$data` parameter is now processed if a {@see WP_Error}\n *              object is passed in.\n *\n * @param mixed $data Data to encode as JSON, then print and die.\n */\nfunction wp_send_json_error( $data = null ) {\n\t$response = array( 'success' => false );\n\n\tif ( isset( $data ) ) {\n\t\tif ( is_wp_error( $data ) ) {\n\t\t\t$result = array();\n\t\t\tforeach ( $data->errors as $code => $messages ) {\n\t\t\t\tforeach ( $messages as $message ) {\n\t\t\t\t\t$result[] = array( 'code' => $code, 'message' => $message );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$response['data'] = $result;\n\t\t} else {\n\t\t\t$response['data'] = $data;\n\t\t}\n\t}\n\n\twp_send_json( $response );\n}\n\n/**\n * Retrieve the WordPress home page URL.\n *\n * If the constant named 'WP_HOME' exists, then it will be used and returned\n * by the function. This can be used to counter the redirection on your local\n * development environment.\n *\n * @since 2.2.0\n * @access private\n *\n * @see WP_HOME\n *\n * @param string $url URL for the home location.\n * @return string Homepage location.\n */\nfunction _config_wp_home( $url = '' ) {\n\tif ( defined( 'WP_HOME' ) )\n\t\treturn untrailingslashit( WP_HOME );\n\treturn $url;\n}\n\n/**\n * Retrieve the WordPress site URL.\n *\n * If the constant named 'WP_SITEURL' is defined, then the value in that\n * constant will always be returned. This can be used for debugging a site\n * on your localhost while not having to change the database to your URL.\n *\n * @since 2.2.0\n * @access private\n *\n * @see WP_SITEURL\n *\n * @param string $url URL to set the WordPress site location.\n * @return string The WordPress Site URL.\n */\nfunction _config_wp_siteurl( $url = '' ) {\n\tif ( defined( 'WP_SITEURL' ) )\n\t\treturn untrailingslashit( WP_SITEURL );\n\treturn $url;\n}\n\n/**\n * Set the localized direction for MCE plugin.\n *\n * Will only set the direction to 'rtl', if the WordPress locale has\n * the text direction set to 'rtl'.\n *\n * Fills in the 'directionality' setting, enables the 'directionality'\n * plugin, and adds the 'ltr' button to 'toolbar1', formerly\n * 'theme_advanced_buttons1' array keys. These keys are then returned\n * in the $input (TinyMCE settings) array.\n *\n * @since 2.1.0\n * @access private\n *\n * @param array $input MCE settings array.\n * @return array Direction set for 'rtl', if needed by locale.\n */\nfunction _mce_set_direction( $input ) {\n\tif ( is_rtl() ) {\n\t\t$input['directionality'] = 'rtl';\n\n\t\tif ( ! empty( $input['plugins'] ) && strpos( $input['plugins'], 'directionality' ) === false ) {\n\t\t\t$input['plugins'] .= ',directionality';\n\t\t}\n\n\t\tif ( ! empty( $input['toolbar1'] ) && ! preg_match( '/\\bltr\\b/', $input['toolbar1'] ) ) {\n\t\t\t$input['toolbar1'] .= ',ltr';\n\t\t}\n\t}\n\n\treturn $input;\n}\n\n\n/**\n * Convert smiley code to the icon graphic file equivalent.\n *\n * You can turn off smilies, by going to the write setting screen and unchecking\n * the box, or by setting 'use_smilies' option to false or removing the option.\n *\n * Plugins may override the default smiley list by setting the $wpsmiliestrans\n * to an array, with the key the code the blogger types in and the value the\n * image file.\n *\n * The $wp_smiliessearch global is for the regular expression and is set each\n * time the function is called.\n *\n * The full list of smilies can be found in the function and won't be listed in\n * the description. Probably should create a Codex page for it, so that it is\n * available.\n *\n * @global array $wpsmiliestrans\n * @global array $wp_smiliessearch\n *\n * @since 2.2.0\n */\nfunction smilies_init() {\n\tglobal $wpsmiliestrans, $wp_smiliessearch;\n\n\t// don't bother setting up smilies if they are disabled\n\tif ( !get_option( 'use_smilies' ) )\n\t\treturn;\n\n\tif ( !isset( $wpsmiliestrans ) ) {\n\t\t$wpsmiliestrans = array(\n\t\t':mrgreen:' => 'mrgreen.png',\n\t\t':neutral:' => \"\\xf0\\x9f\\x98\\x90\",\n\t\t':twisted:' => \"\\xf0\\x9f\\x98\\x88\",\n\t\t  ':arrow:' => \"\\xe2\\x9e\\xa1\",\n\t\t  ':shock:' => \"\\xf0\\x9f\\x98\\xaf\",\n\t\t  ':smile:' => 'simple-smile.png',\n\t\t    ':???:' => \"\\xf0\\x9f\\x98\\x95\",\n\t\t   ':cool:' => \"\\xf0\\x9f\\x98\\x8e\",\n\t\t   ':evil:' => \"\\xf0\\x9f\\x91\\xbf\",\n\t\t   ':grin:' => \"\\xf0\\x9f\\x98\\x80\",\n\t\t   ':idea:' => \"\\xf0\\x9f\\x92\\xa1\",\n\t\t   ':oops:' => \"\\xf0\\x9f\\x98\\xb3\",\n\t\t   ':razz:' => \"\\xf0\\x9f\\x98\\x9b\",\n\t\t   ':roll:' => 'rolleyes.png',\n\t\t   ':wink:' => \"\\xf0\\x9f\\x98\\x89\",\n\t\t    ':cry:' => \"\\xf0\\x9f\\x98\\xa5\",\n\t\t    ':eek:' => \"\\xf0\\x9f\\x98\\xae\",\n\t\t    ':lol:' => \"\\xf0\\x9f\\x98\\x86\",\n\t\t    ':mad:' => \"\\xf0\\x9f\\x98\\xa1\",\n\t\t    ':sad:' => 'frownie.png',\n\t\t      '8-)' => \"\\xf0\\x9f\\x98\\x8e\",\n\t\t      '8-O' => \"\\xf0\\x9f\\x98\\xaf\",\n\t\t      ':-(' => 'frownie.png',\n\t\t      ':-)' => 'simple-smile.png',\n\t\t      ':-?' => \"\\xf0\\x9f\\x98\\x95\",\n\t\t      ':-D' => \"\\xf0\\x9f\\x98\\x80\",\n\t\t      ':-P' => \"\\xf0\\x9f\\x98\\x9b\",\n\t\t      ':-o' => \"\\xf0\\x9f\\x98\\xae\",\n\t\t      ':-x' => \"\\xf0\\x9f\\x98\\xa1\",\n\t\t      ':-|' => \"\\xf0\\x9f\\x98\\x90\",\n\t\t      ';-)' => \"\\xf0\\x9f\\x98\\x89\",\n\t\t// This one transformation breaks regular text with frequency.\n\t\t//     '8)' => \"\\xf0\\x9f\\x98\\x8e\",\n\t\t       '8O' => \"\\xf0\\x9f\\x98\\xaf\",\n\t\t       ':(' => 'frownie.png',\n\t\t       ':)' => 'simple-smile.png',\n\t\t       ':?' => \"\\xf0\\x9f\\x98\\x95\",\n\t\t       ':D' => \"\\xf0\\x9f\\x98\\x80\",\n\t\t       ':P' => \"\\xf0\\x9f\\x98\\x9b\",\n\t\t       ':o' => \"\\xf0\\x9f\\x98\\xae\",\n\t\t       ':x' => \"\\xf0\\x9f\\x98\\xa1\",\n\t\t       ':|' => \"\\xf0\\x9f\\x98\\x90\",\n\t\t       ';)' => \"\\xf0\\x9f\\x98\\x89\",\n\t\t      ':!:' => \"\\xe2\\x9d\\x97\",\n\t\t      ':?:' => \"\\xe2\\x9d\\x93\",\n\t\t);\n\t}\n\n\tif (count($wpsmiliestrans) == 0) {\n\t\treturn;\n\t}\n\n\t/*\n\t * NOTE: we sort the smilies in reverse key order. This is to make sure\n\t * we match the longest possible smilie (:???: vs :?) as the regular\n\t * expression used below is first-match\n\t */\n\tkrsort($wpsmiliestrans);\n\n\t$spaces = wp_spaces_regexp();\n\n\t// Begin first \"subpattern\"\n\t$wp_smiliessearch = '/(?<=' . $spaces . '|^)';\n\n\t$subchar = '';\n\tforeach ( (array) $wpsmiliestrans as $smiley => $img ) {\n\t\t$firstchar = substr($smiley, 0, 1);\n\t\t$rest = substr($smiley, 1);\n\n\t\t// new subpattern?\n\t\tif ($firstchar != $subchar) {\n\t\t\tif ($subchar != '') {\n\t\t\t\t$wp_smiliessearch .= ')(?=' . $spaces . '|$)';  // End previous \"subpattern\"\n\t\t\t\t$wp_smiliessearch .= '|(?<=' . $spaces . '|^)'; // Begin another \"subpattern\"\n\t\t\t}\n\t\t\t$subchar = $firstchar;\n\t\t\t$wp_smiliessearch .= preg_quote($firstchar, '/') . '(?:';\n\t\t} else {\n\t\t\t$wp_smiliessearch .= '|';\n\t\t}\n\t\t$wp_smiliessearch .= preg_quote($rest, '/');\n\t}\n\n\t$wp_smiliessearch .= ')(?=' . $spaces . '|$)/m';\n\n}\n\n/**\n * Merge user defined arguments into defaults array.\n *\n * This function is used throughout WordPress to allow for both string or array\n * to be merged into another array.\n *\n * @since 2.2.0\n *\n * @param string|array $args     Value to merge with $defaults\n * @param array        $defaults Optional. Array that serves as the defaults. Default empty.\n * @return array Merged user defined values with defaults.\n */\nfunction wp_parse_args( $args, $defaults = '' ) {\n\tif ( is_object( $args ) )\n\t\t$r = get_object_vars( $args );\n\telseif ( is_array( $args ) )\n\t\t$r =& $args;\n\telse\n\t\twp_parse_str( $args, $r );\n\n\tif ( is_array( $defaults ) )\n\t\treturn array_merge( $defaults, $r );\n\treturn $r;\n}\n\n/**\n * Clean up an array, comma- or space-separated list of IDs.\n *\n * @since 3.0.0\n *\n * @param array|string $list List of ids.\n * @return array Sanitized array of IDs.\n */\nfunction wp_parse_id_list( $list ) {\n\tif ( !is_array($list) )\n\t\t$list = preg_split('/[\\s,]+/', $list);\n\n\treturn array_unique(array_map('absint', $list));\n}\n\n/**\n * Extract a slice of an array, given a list of keys.\n *\n * @since 3.1.0\n *\n * @param array $array The original array.\n * @param array $keys  The list of keys.\n * @return array The array slice.\n */\nfunction wp_array_slice_assoc( $array, $keys ) {\n\t$slice = array();\n\tforeach ( $keys as $key )\n\t\tif ( isset( $array[ $key ] ) )\n\t\t\t$slice[ $key ] = $array[ $key ];\n\n\treturn $slice;\n}\n\n/**\n * Determines if the variable is a numeric-indexed array.\n *\n * @since 4.4.0\n *\n * @param mixed $data Variable to check.\n * @return bool Whether the variable is a list.\n */\nfunction wp_is_numeric_array( $data ) {\n\tif ( ! is_array( $data ) ) {\n\t\treturn false;\n\t}\n\n\t$keys = array_keys( $data );\n\t$string_keys = array_filter( $keys, 'is_string' );\n\treturn count( $string_keys ) === 0;\n}\n\n/**\n * Filters a list of objects, based on a set of key => value arguments.\n *\n * @since 3.0.0\n *\n * @param array       $list     An array of objects to filter\n * @param array       $args     Optional. An array of key => value arguments to match\n *                              against each object. Default empty array.\n * @param string      $operator Optional. The logical operation to perform. 'or' means\n *                              only one element from the array needs to match; 'and'\n *                              means all elements must match. Default 'and'.\n * @param bool|string $field    A field from the object to place instead of the entire object.\n *                              Default false.\n * @return array A list of objects or object fields.\n */\nfunction wp_filter_object_list( $list, $args = array(), $operator = 'and', $field = false ) {\n\tif ( ! is_array( $list ) )\n\t\treturn array();\n\n\t$list = wp_list_filter( $list, $args, $operator );\n\n\tif ( $field )\n\t\t$list = wp_list_pluck( $list, $field );\n\n\treturn $list;\n}\n\n/**\n * Filters a list of objects, based on a set of key => value arguments.\n *\n * @since 3.1.0\n *\n * @param array  $list     An array of objects to filter.\n * @param array  $args     Optional. An array of key => value arguments to match\n *                         against each object. Default empty array.\n * @param string $operator Optional. The logical operation to perform. 'AND' means\n *                         all elements from the array must match. 'OR' means only\n *                         one element needs to match. 'NOT' means no elements may\n *                         match. Default 'AND'.\n * @return array Array of found values.\n */\nfunction wp_list_filter( $list, $args = array(), $operator = 'AND' ) {\n\tif ( ! is_array( $list ) )\n\t\treturn array();\n\n\tif ( empty( $args ) )\n\t\treturn $list;\n\n\t$operator = strtoupper( $operator );\n\t$count = count( $args );\n\t$filtered = array();\n\n\tforeach ( $list as $key => $obj ) {\n\t\t$to_match = (array) $obj;\n\n\t\t$matched = 0;\n\t\tforeach ( $args as $m_key => $m_value ) {\n\t\t\tif ( array_key_exists( $m_key, $to_match ) && $m_value == $to_match[ $m_key ] )\n\t\t\t\t$matched++;\n\t\t}\n\n\t\tif ( ( 'AND' == $operator && $matched == $count )\n\t\t  || ( 'OR' == $operator && $matched > 0 )\n\t\t  || ( 'NOT' == $operator && 0 == $matched ) ) {\n\t\t\t$filtered[$key] = $obj;\n\t\t}\n\t}\n\n\treturn $filtered;\n}\n\n/**\n * Pluck a certain field out of each object in a list.\n *\n * This has the same functionality and prototype of\n * array_column() (PHP 5.5) but also supports objects.\n *\n * @since 3.1.0\n * @since 4.0.0 $index_key parameter added.\n *\n * @param array      $list      List of objects or arrays\n * @param int|string $field     Field from the object to place instead of the entire object\n * @param int|string $index_key Optional. Field from the object to use as keys for the new array.\n *                              Default null.\n * @return array Array of found values. If `$index_key` is set, an array of found values with keys\n *               corresponding to `$index_key`. If `$index_key` is null, array keys from the original\n *               `$list` will be preserved in the results.\n */\nfunction wp_list_pluck( $list, $field, $index_key = null ) {\n\tif ( ! $index_key ) {\n\t\t/*\n\t\t * This is simple. Could at some point wrap array_column()\n\t\t * if we knew we had an array of arrays.\n\t\t */\n\t\tforeach ( $list as $key => $value ) {\n\t\t\tif ( is_object( $value ) ) {\n\t\t\t\t$list[ $key ] = $value->$field;\n\t\t\t} else {\n\t\t\t\t$list[ $key ] = $value[ $field ];\n\t\t\t}\n\t\t}\n\t\treturn $list;\n\t}\n\n\t/*\n\t * When index_key is not set for a particular item, push the value\n\t * to the end of the stack. This is how array_column() behaves.\n\t */\n\t$newlist = array();\n\tforeach ( $list as $value ) {\n\t\tif ( is_object( $value ) ) {\n\t\t\tif ( isset( $value->$index_key ) ) {\n\t\t\t\t$newlist[ $value->$index_key ] = $value->$field;\n\t\t\t} else {\n\t\t\t\t$newlist[] = $value->$field;\n\t\t\t}\n\t\t} else {\n\t\t\tif ( isset( $value[ $index_key ] ) ) {\n\t\t\t\t$newlist[ $value[ $index_key ] ] = $value[ $field ];\n\t\t\t} else {\n\t\t\t\t$newlist[] = $value[ $field ];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $newlist;\n}\n\n/**\n * Determines if Widgets library should be loaded.\n *\n * Checks to make sure that the widgets library hasn't already been loaded.\n * If it hasn't, then it will load the widgets library and run an action hook.\n *\n * @since 2.2.0\n */\nfunction wp_maybe_load_widgets() {\n\t/**\n\t * Filter whether to load the Widgets library.\n\t *\n\t * Passing a falsey value to the filter will effectively short-circuit\n\t * the Widgets library from loading.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param bool $wp_maybe_load_widgets Whether to load the Widgets library.\n\t *                                    Default true.\n\t */\n\tif ( ! apply_filters( 'load_default_widgets', true ) ) {\n\t\treturn;\n\t}\n\n\trequire_once( ABSPATH . WPINC . '/default-widgets.php' );\n\n\tadd_action( '_admin_menu', 'wp_widgets_add_menu' );\n}\n\n/**\n * Append the Widgets menu to the themes main menu.\n *\n * @since 2.2.0\n *\n * @global array $submenu\n */\nfunction wp_widgets_add_menu() {\n\tglobal $submenu;\n\n\tif ( ! current_theme_supports( 'widgets' ) )\n\t\treturn;\n\n\t$submenu['themes.php'][7] = array( __( 'Widgets' ), 'edit_theme_options', 'widgets.php' );\n\tksort( $submenu['themes.php'], SORT_NUMERIC );\n}\n\n/**\n * Flush all output buffers for PHP 5.2.\n *\n * Make sure all output buffers are flushed before our singletons are destroyed.\n *\n * @since 2.2.0\n */\nfunction wp_ob_end_flush_all() {\n\t$levels = ob_get_level();\n\tfor ($i=0; $i<$levels; $i++)\n\t\tob_end_flush();\n}\n\n/**\n * Load custom DB error or display WordPress DB error.\n *\n * If a file exists in the wp-content directory named db-error.php, then it will\n * be loaded instead of displaying the WordPress DB error. If it is not found,\n * then the WordPress DB error will be displayed instead.\n *\n * The WordPress DB error sets the HTTP status header to 500 to try to prevent\n * search engines from caching the message. Custom DB messages should do the\n * same.\n *\n * This function was backported to WordPress 2.3.2, but originally was added\n * in WordPress 2.5.0.\n *\n * @since 2.3.2\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction dead_db() {\n\tglobal $wpdb;\n\n\twp_load_translations_early();\n\n\t// Load custom DB error template, if present.\n\tif ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) {\n\t\trequire_once( WP_CONTENT_DIR . '/db-error.php' );\n\t\tdie();\n\t}\n\n\t// If installing or in the admin, provide the verbose message.\n\tif ( wp_installing() || defined( 'WP_ADMIN' ) )\n\t\twp_die($wpdb->error);\n\n\t// Otherwise, be terse.\n\tstatus_header( 500 );\n\tnocache_headers();\n\theader( 'Content-Type: text/html; charset=utf-8' );\n?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\"<?php if ( is_rtl() ) echo ' dir=\"rtl\"'; ?>>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t<title><?php _e( 'Database Error' ); ?></title>\n\n</head>\n<body>\n\t<h1><?php _e( 'Error establishing a database connection' ); ?></h1>\n</body>\n</html>\n<?php\n\tdie();\n}\n\n/**\n * Convert a value to non-negative integer.\n *\n * @since 2.5.0\n *\n * @param mixed $maybeint Data you wish to have converted to a non-negative integer.\n * @return int A non-negative integer.\n */\nfunction absint( $maybeint ) {\n\treturn abs( intval( $maybeint ) );\n}\n\n/**\n * Mark a function as deprecated and inform when it has been used.\n *\n * There is a hook deprecated_function_run that will be called that can be used\n * to get the backtrace up to what file and function called the deprecated\n * function.\n *\n * The current behavior is to trigger a user error if WP_DEBUG is true.\n *\n * This function is to be used in every function that is deprecated.\n *\n * @since 2.5.0\n * @access private\n *\n * @param string $function    The function that was called.\n * @param string $version     The version of WordPress that deprecated the function.\n * @param string $replacement Optional. The function that should have been called. Default null.\n */\nfunction _deprecated_function( $function, $version, $replacement = null ) {\n\n\t/**\n\t * Fires when a deprecated function is called.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $function    The function that was called.\n\t * @param string $replacement The function that should have been called.\n\t * @param string $version     The version of WordPress that deprecated the function.\n\t */\n\tdo_action( 'deprecated_function_run', $function, $replacement, $version );\n\n\t/**\n\t * Filter whether to trigger an error for deprecated functions.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param bool $trigger Whether to trigger the error for deprecated functions. Default true.\n\t */\n\tif ( WP_DEBUG && apply_filters( 'deprecated_function_trigger_error', true ) ) {\n\t\tif ( function_exists( '__' ) ) {\n\t\t\tif ( ! is_null( $replacement ) )\n\t\t\t\ttrigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.'), $function, $version, $replacement ) );\n\t\t\telse\n\t\t\t\ttrigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.'), $function, $version ) );\n\t\t} else {\n\t\t\tif ( ! is_null( $replacement ) )\n\t\t\t\ttrigger_error( sprintf( '%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.', $function, $version, $replacement ) );\n\t\t\telse\n\t\t\t\ttrigger_error( sprintf( '%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.', $function, $version ) );\n\t\t}\n\t}\n}\n\n/**\n * Marks a constructor as deprecated and informs when it has been used.\n *\n * Similar to _deprecated_function(), but with different strings. Used to\n * remove PHP4 style constructors.\n *\n * The current behavior is to trigger a user error if `WP_DEBUG` is true.\n *\n * This function is to be used in every PHP4 style constructor method that is deprecated.\n *\n * @since 4.3.0\n * @access private\n *\n * @param string $class   The class containing the deprecated constructor.\n * @param string $version The version of WordPress that deprecated the function.\n */\nfunction _deprecated_constructor( $class, $version ) {\n\n\t/**\n\t * Fires when a deprecated constructor is called.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param string $class   The class containing the deprecated constructor.\n\t * @param string $version The version of WordPress that deprecated the function.\n\t */\n\tdo_action( 'deprecated_constructor_run', $class, $version );\n\n\t/**\n\t * Filter whether to trigger an error for deprecated functions.\n\t *\n\t * `WP_DEBUG` must be true in addition to the filter evaluating to true.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param bool $trigger Whether to trigger the error for deprecated functions. Default true.\n\t */\n\tif ( WP_DEBUG && apply_filters( 'deprecated_constructor_trigger_error', true ) ) {\n\t\tif ( function_exists( '__' ) ) {\n\t\t\ttrigger_error( sprintf( __( 'The called constructor method for %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ), $class, $version, '<pre>__construct()</pre>' ) );\n\t\t} else {\n\t\t\ttrigger_error( sprintf( 'The called constructor method for %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.', $class, $version, '<pre>__construct()</pre>' ) );\n\t\t}\n\t}\n\n}\n\n/**\n * Mark a file as deprecated and inform when it has been used.\n *\n * There is a hook deprecated_file_included that will be called that can be used\n * to get the backtrace up to what file and function included the deprecated\n * file.\n *\n * The current behavior is to trigger a user error if WP_DEBUG is true.\n *\n * This function is to be used in every file that is deprecated.\n *\n * @since 2.5.0\n * @access private\n *\n * @param string $file        The file that was included.\n * @param string $version     The version of WordPress that deprecated the file.\n * @param string $replacement Optional. The file that should have been included based on ABSPATH.\n *                            Default null.\n * @param string $message     Optional. A message regarding the change. Default empty.\n */\nfunction _deprecated_file( $file, $version, $replacement = null, $message = '' ) {\n\n\t/**\n\t * Fires when a deprecated file is called.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $file        The file that was called.\n\t * @param string $replacement The file that should have been included based on ABSPATH.\n\t * @param string $version     The version of WordPress that deprecated the file.\n\t * @param string $message     A message regarding the change.\n\t */\n\tdo_action( 'deprecated_file_included', $file, $replacement, $version, $message );\n\n\t/**\n\t * Filter whether to trigger an error for deprecated files.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param bool $trigger Whether to trigger the error for deprecated files. Default true.\n\t */\n\tif ( WP_DEBUG && apply_filters( 'deprecated_file_trigger_error', true ) ) {\n\t\t$message = empty( $message ) ? '' : ' ' . $message;\n\t\tif ( function_exists( '__' ) ) {\n\t\t\tif ( ! is_null( $replacement ) )\n\t\t\t\ttrigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.'), $file, $version, $replacement ) . $message );\n\t\t\telse\n\t\t\t\ttrigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.'), $file, $version ) . $message );\n\t\t} else {\n\t\t\tif ( ! is_null( $replacement ) )\n\t\t\t\ttrigger_error( sprintf( '%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.', $file, $version, $replacement ) . $message );\n\t\t\telse\n\t\t\t\ttrigger_error( sprintf( '%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.', $file, $version ) . $message );\n\t\t}\n\t}\n}\n/**\n * Mark a function argument as deprecated and inform when it has been used.\n *\n * This function is to be used whenever a deprecated function argument is used.\n * Before this function is called, the argument must be checked for whether it was\n * used by comparing it to its default value or evaluating whether it is empty.\n * For example:\n *\n *     if ( ! empty( $deprecated ) ) {\n *         _deprecated_argument( __FUNCTION__, '3.0' );\n *     }\n *\n *\n * There is a hook deprecated_argument_run that will be called that can be used\n * to get the backtrace up to what file and function used the deprecated\n * argument.\n *\n * The current behavior is to trigger a user error if WP_DEBUG is true.\n *\n * @since 3.0.0\n * @access private\n *\n * @param string $function The function that was called.\n * @param string $version  The version of WordPress that deprecated the argument used.\n * @param string $message  Optional. A message regarding the change. Default null.\n */\nfunction _deprecated_argument( $function, $version, $message = null ) {\n\n\t/**\n\t * Fires when a deprecated argument is called.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $function The function that was called.\n\t * @param string $message  A message regarding the change.\n\t * @param string $version  The version of WordPress that deprecated the argument used.\n\t */\n\tdo_action( 'deprecated_argument_run', $function, $message, $version );\n\n\t/**\n\t * Filter whether to trigger an error for deprecated arguments.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param bool $trigger Whether to trigger the error for deprecated arguments. Default true.\n\t */\n\tif ( WP_DEBUG && apply_filters( 'deprecated_argument_trigger_error', true ) ) {\n\t\tif ( function_exists( '__' ) ) {\n\t\t\tif ( ! is_null( $message ) )\n\t\t\t\ttrigger_error( sprintf( __('%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s'), $function, $version, $message ) );\n\t\t\telse\n\t\t\t\ttrigger_error( sprintf( __('%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.'), $function, $version ) );\n\t\t} else {\n\t\t\tif ( ! is_null( $message ) )\n\t\t\t\ttrigger_error( sprintf( '%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s', $function, $version, $message ) );\n\t\t\telse\n\t\t\t\ttrigger_error( sprintf( '%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.', $function, $version ) );\n\t\t}\n\t}\n}\n\n/**\n * Mark something as being incorrectly called.\n *\n * There is a hook doing_it_wrong_run that will be called that can be used\n * to get the backtrace up to what file and function called the deprecated\n * function.\n *\n * The current behavior is to trigger a user error if WP_DEBUG is true.\n *\n * @since 3.1.0\n * @access private\n *\n * @param string $function The function that was called.\n * @param string $message  A message explaining what has been done incorrectly.\n * @param string $version  The version of WordPress where the message was added.\n */\nfunction _doing_it_wrong( $function, $message, $version ) {\n\n\t/**\n\t * Fires when the given function is being used incorrectly.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $function The function that was called.\n\t * @param string $message  A message explaining what has been done incorrectly.\n\t * @param string $version  The version of WordPress where the message was added.\n\t */\n\tdo_action( 'doing_it_wrong_run', $function, $message, $version );\n\n\t/**\n\t * Filter whether to trigger an error for _doing_it_wrong() calls.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool $trigger Whether to trigger the error for _doing_it_wrong() calls. Default true.\n\t */\n\tif ( WP_DEBUG && apply_filters( 'doing_it_wrong_trigger_error', true ) ) {\n\t\tif ( function_exists( '__' ) ) {\n\t\t\t$version = is_null( $version ) ? '' : sprintf( __( '(This message was added in version %s.)' ), $version );\n\t\t\t/* translators: %s: Codex URL */\n\t\t\t$message .= ' ' . sprintf( __( 'Please see <a href=\"%s\">Debugging in WordPress</a> for more information.' ),\n\t\t\t\t__( 'https://codex.wordpress.org/Debugging_in_WordPress' )\n\t\t\t);\n\t\t\ttrigger_error( sprintf( __( '%1$s was called <strong>incorrectly</strong>. %2$s %3$s' ), $function, $message, $version ) );\n\t\t} else {\n\t\t\t$version = is_null( $version ) ? '' : sprintf( '(This message was added in version %s.)', $version );\n\t\t\t$message .= sprintf( ' Please see <a href=\"%s\">Debugging in WordPress</a> for more information.',\n\t\t\t\t'https://codex.wordpress.org/Debugging_in_WordPress'\n\t\t\t);\n\t\t\ttrigger_error( sprintf( '%1$s was called <strong>incorrectly</strong>. %2$s %3$s', $function, $message, $version ) );\n\t\t}\n\t}\n}\n\n/**\n * Is the server running earlier than 1.5.0 version of lighttpd?\n *\n * @since 2.5.0\n *\n * @return bool Whether the server is running lighttpd < 1.5.0.\n */\nfunction is_lighttpd_before_150() {\n\t$server_parts = explode( '/', isset( $_SERVER['SERVER_SOFTWARE'] )? $_SERVER['SERVER_SOFTWARE'] : '' );\n\t$server_parts[1] = isset( $server_parts[1] )? $server_parts[1] : '';\n\treturn  'lighttpd' == $server_parts[0] && -1 == version_compare( $server_parts[1], '1.5.0' );\n}\n\n/**\n * Does the specified module exist in the Apache config?\n *\n * @since 2.5.0\n *\n * @global bool $is_apache\n *\n * @param string $mod     The module, e.g. mod_rewrite.\n * @param bool   $default Optional. The default return value if the module is not found. Default false.\n * @return bool Whether the specified module is loaded.\n */\nfunction apache_mod_loaded($mod, $default = false) {\n\tglobal $is_apache;\n\n\tif ( !$is_apache )\n\t\treturn false;\n\n\tif ( function_exists( 'apache_get_modules' ) ) {\n\t\t$mods = apache_get_modules();\n\t\tif ( in_array($mod, $mods) )\n\t\t\treturn true;\n\t} elseif ( function_exists( 'phpinfo' ) && false === strpos( ini_get( 'disable_functions' ), 'phpinfo' ) ) {\n\t\t\tob_start();\n\t\t\tphpinfo(8);\n\t\t\t$phpinfo = ob_get_clean();\n\t\t\tif ( false !== strpos($phpinfo, $mod) )\n\t\t\t\treturn true;\n\t}\n\treturn $default;\n}\n\n/**\n * Check if IIS 7+ supports pretty permalinks.\n *\n * @since 2.8.0\n *\n * @global bool $is_iis7\n *\n * @return bool Whether IIS7 supports permalinks.\n */\nfunction iis7_supports_permalinks() {\n\tglobal $is_iis7;\n\n\t$supports_permalinks = false;\n\tif ( $is_iis7 ) {\n\t\t/* First we check if the DOMDocument class exists. If it does not exist, then we cannot\n\t\t * easily update the xml configuration file, hence we just bail out and tell user that\n\t\t * pretty permalinks cannot be used.\n\t\t *\n\t\t * Next we check if the URL Rewrite Module 1.1 is loaded and enabled for the web site. When\n\t\t * URL Rewrite 1.1 is loaded it always sets a server variable called 'IIS_UrlRewriteModule'.\n\t\t * Lastly we make sure that PHP is running via FastCGI. This is important because if it runs\n\t\t * via ISAPI then pretty permalinks will not work.\n\t\t */\n\t\t$supports_permalinks = class_exists( 'DOMDocument', false ) && isset($_SERVER['IIS_UrlRewriteModule']) && ( PHP_SAPI == 'cgi-fcgi' );\n\t}\n\n\t/**\n\t * Filter whether IIS 7+ supports pretty permalinks.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param bool $supports_permalinks Whether IIS7 supports permalinks. Default false.\n\t */\n\treturn apply_filters( 'iis7_supports_permalinks', $supports_permalinks );\n}\n\n/**\n * File validates against allowed set of defined rules.\n *\n * A return value of '1' means that the $file contains either '..' or './'. A\n * return value of '2' means that the $file contains ':' after the first\n * character. A return value of '3' means that the file is not in the allowed\n * files list.\n *\n * @since 1.2.0\n *\n * @param string $file File path.\n * @param array  $allowed_files List of allowed files.\n * @return int 0 means nothing is wrong, greater than 0 means something was wrong.\n */\nfunction validate_file( $file, $allowed_files = '' ) {\n\tif ( false !== strpos( $file, '..' ) )\n\t\treturn 1;\n\n\tif ( false !== strpos( $file, './' ) )\n\t\treturn 1;\n\n\tif ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files ) )\n\t\treturn 3;\n\n\tif (':' == substr( $file, 1, 1 ) )\n\t\treturn 2;\n\n\treturn 0;\n}\n\n/**\n * Determine if SSL is used.\n *\n * @since 2.6.0\n *\n * @return bool True if SSL, false if not used.\n */\nfunction is_ssl() {\n\tif ( isset($_SERVER['HTTPS']) ) {\n\t\tif ( 'on' == strtolower($_SERVER['HTTPS']) )\n\t\t\treturn true;\n\t\tif ( '1' == $_SERVER['HTTPS'] )\n\t\t\treturn true;\n\t} elseif ( isset($_SERVER['SERVER_PORT']) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Whether to force SSL used for the Administration Screens.\n *\n * @since 2.6.0\n *\n * @staticvar bool $forced\n *\n * @param string|bool $force Optional. Whether to force SSL in admin screens. Default null.\n * @return bool True if forced, false if not forced.\n */\nfunction force_ssl_admin( $force = null ) {\n\tstatic $forced = false;\n\n\tif ( !is_null( $force ) ) {\n\t\t$old_forced = $forced;\n\t\t$forced = $force;\n\t\treturn $old_forced;\n\t}\n\n\treturn $forced;\n}\n\n/**\n * Guess the URL for the site.\n *\n * Will remove wp-admin links to retrieve only return URLs not in the wp-admin\n * directory.\n *\n * @since 2.6.0\n *\n * @return string The guessed URL.\n */\nfunction wp_guess_url() {\n\tif ( defined('WP_SITEURL') && '' != WP_SITEURL ) {\n\t\t$url = WP_SITEURL;\n\t} else {\n\t\t$abspath_fix = str_replace( '\\\\', '/', ABSPATH );\n\t\t$script_filename_dir = dirname( $_SERVER['SCRIPT_FILENAME'] );\n\n\t\t// The request is for the admin\n\t\tif ( strpos( $_SERVER['REQUEST_URI'], 'wp-admin' ) !== false || strpos( $_SERVER['REQUEST_URI'], 'wp-login.php' ) !== false ) {\n\t\t\t$path = preg_replace( '#/(wp-admin/.*|wp-login.php)#i', '', $_SERVER['REQUEST_URI'] );\n\n\t\t// The request is for a file in ABSPATH\n\t\t} elseif ( $script_filename_dir . '/' == $abspath_fix ) {\n\t\t\t// Strip off any file/query params in the path\n\t\t\t$path = preg_replace( '#/[^/]*$#i', '', $_SERVER['PHP_SELF'] );\n\n\t\t} else {\n\t\t\tif ( false !== strpos( $_SERVER['SCRIPT_FILENAME'], $abspath_fix ) ) {\n\t\t\t\t// Request is hitting a file inside ABSPATH\n\t\t\t\t$directory = str_replace( ABSPATH, '', $script_filename_dir );\n\t\t\t\t// Strip off the sub directory, and any file/query params\n\t\t\t\t$path = preg_replace( '#/' . preg_quote( $directory, '#' ) . '/[^/]*$#i', '' , $_SERVER['REQUEST_URI'] );\n\t\t\t} elseif ( false !== strpos( $abspath_fix, $script_filename_dir ) ) {\n\t\t\t\t// Request is hitting a file above ABSPATH\n\t\t\t\t$subdirectory = substr( $abspath_fix, strpos( $abspath_fix, $script_filename_dir ) + strlen( $script_filename_dir ) );\n\t\t\t\t// Strip off any file/query params from the path, appending the sub directory to the install\n\t\t\t\t$path = preg_replace( '#/[^/]*$#i', '' , $_SERVER['REQUEST_URI'] ) . $subdirectory;\n\t\t\t} else {\n\t\t\t\t$path = $_SERVER['REQUEST_URI'];\n\t\t\t}\n\t\t}\n\n\t\t$schema = is_ssl() ? 'https://' : 'http://'; // set_url_scheme() is not defined yet\n\t\t$url = $schema . $_SERVER['HTTP_HOST'] . $path;\n\t}\n\n\treturn rtrim($url, '/');\n}\n\n/**\n * Temporarily suspend cache additions.\n *\n * Stops more data being added to the cache, but still allows cache retrieval.\n * This is useful for actions, such as imports, when a lot of data would otherwise\n * be almost uselessly added to the cache.\n *\n * Suspension lasts for a single page load at most. Remember to call this\n * function again if you wish to re-enable cache adds earlier.\n *\n * @since 3.3.0\n *\n * @staticvar bool $_suspend\n *\n * @param bool $suspend Optional. Suspends additions if true, re-enables them if false.\n * @return bool The current suspend setting\n */\nfunction wp_suspend_cache_addition( $suspend = null ) {\n\tstatic $_suspend = false;\n\n\tif ( is_bool( $suspend ) )\n\t\t$_suspend = $suspend;\n\n\treturn $_suspend;\n}\n\n/**\n * Suspend cache invalidation.\n *\n * Turns cache invalidation on and off. Useful during imports where you don't wont to do\n * invalidations every time a post is inserted. Callers must be sure that what they are\n * doing won't lead to an inconsistent cache when invalidation is suspended.\n *\n * @since 2.7.0\n *\n * @global bool $_wp_suspend_cache_invalidation\n *\n * @param bool $suspend Optional. Whether to suspend or enable cache invalidation. Default true.\n * @return bool The current suspend setting.\n */\nfunction wp_suspend_cache_invalidation( $suspend = true ) {\n\tglobal $_wp_suspend_cache_invalidation;\n\n\t$current_suspend = $_wp_suspend_cache_invalidation;\n\t$_wp_suspend_cache_invalidation = $suspend;\n\treturn $current_suspend;\n}\n\n/**\n * Determine whether a site is the main site of the current network.\n *\n * @since 3.0.0\n *\n * @global object $current_site\n *\n * @param int $site_id Optional. Site ID to test. Defaults to current site.\n *                     Defaults to current site.\n * @return bool True if $site_id is the main site of the network, or if not\n *              running Multisite.\n */\nfunction is_main_site( $site_id = null ) {\n\t// This is the current network's information; 'site' is old terminology.\n\tglobal $current_site;\n\n\tif ( ! is_multisite() )\n\t\treturn true;\n\n\tif ( ! $site_id )\n\t\t$site_id = get_current_blog_id();\n\n\treturn (int) $site_id === (int) $current_site->blog_id;\n}\n\n/**\n * Determine whether a network is the main network of the Multisite install.\n *\n * @since 3.7.0\n *\n * @param int $network_id Optional. Network ID to test. Defaults to current network.\n * @return bool True if $network_id is the main network, or if not running Multisite.\n */\nfunction is_main_network( $network_id = null ) {\n\tif ( ! is_multisite() ) {\n\t\treturn true;\n\t}\n\n\t$current_network_id = (int) get_current_site()->id;\n\n\tif ( null === $network_id ) {\n\t\t$network_id = $current_network_id;\n\t}\n\n\t$network_id = (int) $network_id;\n\n\treturn ( $network_id === get_main_network_id() );\n}\n\n/**\n * Get the main network ID.\n *\n * @since 4.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return int The ID of the main network.\n */\nfunction get_main_network_id() {\n\tglobal $wpdb;\n\n\tif ( ! is_multisite() ) {\n\t\treturn 1;\n\t}\n\n\tif ( defined( 'PRIMARY_NETWORK_ID' ) ) {\n\t\t$main_network_id = PRIMARY_NETWORK_ID;\n\t} elseif ( 1 === (int) get_current_site()->id ) {\n\t\t// If the current network has an ID of 1, assume it is the main network.\n\t\t$main_network_id = 1;\n\t} else {\n\t\t$main_network_id = wp_cache_get( 'primary_network_id', 'site-options' );\n\n\t\tif ( false === $main_network_id ) {\n\t\t\t$main_network_id = (int) $wpdb->get_var( \"SELECT id FROM {$wpdb->site} ORDER BY id LIMIT 1\" );\n\t\t\twp_cache_add( 'primary_network_id', $main_network_id, 'site-options' );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the main network ID.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param int $main_network_id The ID of the main network.\n\t */\n\treturn (int) apply_filters( 'get_main_network_id', $main_network_id );\n}\n\n/**\n * Determine whether global terms are enabled.\n *\n * @since 3.0.0\n *\n * @staticvar bool $global_terms\n *\n * @return bool True if multisite and global terms enabled.\n */\nfunction global_terms_enabled() {\n\tif ( ! is_multisite() )\n\t\treturn false;\n\n\tstatic $global_terms = null;\n\tif ( is_null( $global_terms ) ) {\n\n\t\t/**\n\t\t * Filter whether global terms are enabled.\n\t\t *\n\t\t * Passing a non-null value to the filter will effectively short-circuit the function,\n\t\t * returning the value of the 'global_terms_enabled' site option instead.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param null $enabled Whether global terms are enabled.\n\t\t */\n\t\t$filter = apply_filters( 'global_terms_enabled', null );\n\t\tif ( ! is_null( $filter ) )\n\t\t\t$global_terms = (bool) $filter;\n\t\telse\n\t\t\t$global_terms = (bool) get_site_option( 'global_terms_enabled', false );\n\t}\n\treturn $global_terms;\n}\n\n/**\n * gmt_offset modification for smart timezone handling.\n *\n * Overrides the gmt_offset option if we have a timezone_string available.\n *\n * @since 2.8.0\n *\n * @return float|false Timezone GMT offset, false otherwise.\n */\nfunction wp_timezone_override_offset() {\n\tif ( !$timezone_string = get_option( 'timezone_string' ) ) {\n\t\treturn false;\n\t}\n\n\t$timezone_object = timezone_open( $timezone_string );\n\t$datetime_object = date_create();\n\tif ( false === $timezone_object || false === $datetime_object ) {\n\t\treturn false;\n\t}\n\treturn round( timezone_offset_get( $timezone_object, $datetime_object ) / HOUR_IN_SECONDS, 2 );\n}\n\n/**\n * Sort-helper for timezones.\n *\n * @since 2.9.0\n * @access private\n *\n * @param array $a\n * @param array $b\n * @return int\n */\nfunction _wp_timezone_choice_usort_callback( $a, $b ) {\n\t// Don't use translated versions of Etc\n\tif ( 'Etc' === $a['continent'] && 'Etc' === $b['continent'] ) {\n\t\t// Make the order of these more like the old dropdown\n\t\tif ( 'GMT+' === substr( $a['city'], 0, 4 ) && 'GMT+' === substr( $b['city'], 0, 4 ) ) {\n\t\t\treturn -1 * ( strnatcasecmp( $a['city'], $b['city'] ) );\n\t\t}\n\t\tif ( 'UTC' === $a['city'] ) {\n\t\t\tif ( 'GMT+' === substr( $b['city'], 0, 4 ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn -1;\n\t\t}\n\t\tif ( 'UTC' === $b['city'] ) {\n\t\t\tif ( 'GMT+' === substr( $a['city'], 0, 4 ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn 1;\n\t\t}\n\t\treturn strnatcasecmp( $a['city'], $b['city'] );\n\t}\n\tif ( $a['t_continent'] == $b['t_continent'] ) {\n\t\tif ( $a['t_city'] == $b['t_city'] ) {\n\t\t\treturn strnatcasecmp( $a['t_subcity'], $b['t_subcity'] );\n\t\t}\n\t\treturn strnatcasecmp( $a['t_city'], $b['t_city'] );\n\t} else {\n\t\t// Force Etc to the bottom of the list\n\t\tif ( 'Etc' === $a['continent'] ) {\n\t\t\treturn 1;\n\t\t}\n\t\tif ( 'Etc' === $b['continent'] ) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn strnatcasecmp( $a['t_continent'], $b['t_continent'] );\n\t}\n}\n\n/**\n * Gives a nicely-formatted list of timezone strings.\n *\n * @since 2.9.0\n *\n * @staticvar bool $mo_loaded\n *\n * @param string $selected_zone Selected timezone.\n * @return string\n */\nfunction wp_timezone_choice( $selected_zone ) {\n\tstatic $mo_loaded = false;\n\n\t$continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific');\n\n\t// Load translations for continents and cities\n\tif ( !$mo_loaded ) {\n\t\t$locale = get_locale();\n\t\t$mofile = WP_LANG_DIR . '/continents-cities-' . $locale . '.mo';\n\t\tload_textdomain( 'continents-cities', $mofile );\n\t\t$mo_loaded = true;\n\t}\n\n\t$zonen = array();\n\tforeach ( timezone_identifiers_list() as $zone ) {\n\t\t$zone = explode( '/', $zone );\n\t\tif ( !in_array( $zone[0], $continents ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This determines what gets set and translated - we don't translate Etc/* strings here, they are done later\n\t\t$exists = array(\n\t\t\t0 => ( isset( $zone[0] ) && $zone[0] ),\n\t\t\t1 => ( isset( $zone[1] ) && $zone[1] ),\n\t\t\t2 => ( isset( $zone[2] ) && $zone[2] ),\n\t\t);\n\t\t$exists[3] = ( $exists[0] && 'Etc' !== $zone[0] );\n\t\t$exists[4] = ( $exists[1] && $exists[3] );\n\t\t$exists[5] = ( $exists[2] && $exists[3] );\n\n\t\t$zonen[] = array(\n\t\t\t'continent'   => ( $exists[0] ? $zone[0] : '' ),\n\t\t\t'city'        => ( $exists[1] ? $zone[1] : '' ),\n\t\t\t'subcity'     => ( $exists[2] ? $zone[2] : '' ),\n\t\t\t't_continent' => ( $exists[3] ? translate( str_replace( '_', ' ', $zone[0] ), 'continents-cities' ) : '' ),\n\t\t\t't_city'      => ( $exists[4] ? translate( str_replace( '_', ' ', $zone[1] ), 'continents-cities' ) : '' ),\n\t\t\t't_subcity'   => ( $exists[5] ? translate( str_replace( '_', ' ', $zone[2] ), 'continents-cities' ) : '' )\n\t\t);\n\t}\n\tusort( $zonen, '_wp_timezone_choice_usort_callback' );\n\n\t$structure = array();\n\n\tif ( empty( $selected_zone ) ) {\n\t\t$structure[] = '<option selected=\"selected\" value=\"\">' . __( 'Select a city' ) . '</option>';\n\t}\n\n\tforeach ( $zonen as $key => $zone ) {\n\t\t// Build value in an array to join later\n\t\t$value = array( $zone['continent'] );\n\n\t\tif ( empty( $zone['city'] ) ) {\n\t\t\t// It's at the continent level (generally won't happen)\n\t\t\t$display = $zone['t_continent'];\n\t\t} else {\n\t\t\t// It's inside a continent group\n\n\t\t\t// Continent optgroup\n\t\t\tif ( !isset( $zonen[$key - 1] ) || $zonen[$key - 1]['continent'] !== $zone['continent'] ) {\n\t\t\t\t$label = $zone['t_continent'];\n\t\t\t\t$structure[] = '<optgroup label=\"'. esc_attr( $label ) .'\">';\n\t\t\t}\n\n\t\t\t// Add the city to the value\n\t\t\t$value[] = $zone['city'];\n\n\t\t\t$display = $zone['t_city'];\n\t\t\tif ( !empty( $zone['subcity'] ) ) {\n\t\t\t\t// Add the subcity to the value\n\t\t\t\t$value[] = $zone['subcity'];\n\t\t\t\t$display .= ' - ' . $zone['t_subcity'];\n\t\t\t}\n\t\t}\n\n\t\t// Build the value\n\t\t$value = join( '/', $value );\n\t\t$selected = '';\n\t\tif ( $value === $selected_zone ) {\n\t\t\t$selected = 'selected=\"selected\" ';\n\t\t}\n\t\t$structure[] = '<option ' . $selected . 'value=\"' . esc_attr( $value ) . '\">' . esc_html( $display ) . \"</option>\";\n\n\t\t// Close continent optgroup\n\t\tif ( !empty( $zone['city'] ) && ( !isset($zonen[$key + 1]) || (isset( $zonen[$key + 1] ) && $zonen[$key + 1]['continent'] !== $zone['continent']) ) ) {\n\t\t\t$structure[] = '</optgroup>';\n\t\t}\n\t}\n\n\t// Do UTC\n\t$structure[] = '<optgroup label=\"'. esc_attr__( 'UTC' ) .'\">';\n\t$selected = '';\n\tif ( 'UTC' === $selected_zone )\n\t\t$selected = 'selected=\"selected\" ';\n\t$structure[] = '<option ' . $selected . 'value=\"' . esc_attr( 'UTC' ) . '\">' . __('UTC') . '</option>';\n\t$structure[] = '</optgroup>';\n\n\t// Do manual UTC offsets\n\t$structure[] = '<optgroup label=\"'. esc_attr__( 'Manual Offsets' ) .'\">';\n\t$offset_range = array (-12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5, -7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5,\n\t\t0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 5.75, 6, 6.5, 7, 7.5, 8, 8.5, 8.75, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 13.75, 14);\n\tforeach ( $offset_range as $offset ) {\n\t\tif ( 0 <= $offset )\n\t\t\t$offset_name = '+' . $offset;\n\t\telse\n\t\t\t$offset_name = (string) $offset;\n\n\t\t$offset_value = $offset_name;\n\t\t$offset_name = str_replace(array('.25','.5','.75'), array(':15',':30',':45'), $offset_name);\n\t\t$offset_name = 'UTC' . $offset_name;\n\t\t$offset_value = 'UTC' . $offset_value;\n\t\t$selected = '';\n\t\tif ( $offset_value === $selected_zone )\n\t\t\t$selected = 'selected=\"selected\" ';\n\t\t$structure[] = '<option ' . $selected . 'value=\"' . esc_attr( $offset_value ) . '\">' . esc_html( $offset_name ) . \"</option>\";\n\n\t}\n\t$structure[] = '</optgroup>';\n\n\treturn join( \"\\n\", $structure );\n}\n\n/**\n * Strip close comment and close php tags from file headers used by WP.\n *\n * @since 2.8.0\n * @access private\n *\n * @see https://core.trac.wordpress.org/ticket/8497\n *\n * @param string $str Header comment to clean up.\n * @return string\n */\nfunction _cleanup_header_comment( $str ) {\n\treturn trim(preg_replace(\"/\\s*(?:\\*\\/|\\?>).*/\", '', $str));\n}\n\n/**\n * Permanently delete comments or posts of any type that have held a status\n * of 'trash' for the number of days defined in EMPTY_TRASH_DAYS.\n *\n * The default value of `EMPTY_TRASH_DAYS` is 30 (days).\n *\n * @since 2.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction wp_scheduled_delete() {\n\tglobal $wpdb;\n\n\t$delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS );\n\n\t$posts_to_delete = $wpdb->get_results($wpdb->prepare(\"SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < '%d'\", $delete_timestamp), ARRAY_A);\n\n\tforeach ( (array) $posts_to_delete as $post ) {\n\t\t$post_id = (int) $post['post_id'];\n\t\tif ( !$post_id )\n\t\t\tcontinue;\n\n\t\t$del_post = get_post($post_id);\n\n\t\tif ( !$del_post || 'trash' != $del_post->post_status ) {\n\t\t\tdelete_post_meta($post_id, '_wp_trash_meta_status');\n\t\t\tdelete_post_meta($post_id, '_wp_trash_meta_time');\n\t\t} else {\n\t\t\twp_delete_post($post_id);\n\t\t}\n\t}\n\n\t$comments_to_delete = $wpdb->get_results($wpdb->prepare(\"SELECT comment_id FROM $wpdb->commentmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < '%d'\", $delete_timestamp), ARRAY_A);\n\n\tforeach ( (array) $comments_to_delete as $comment ) {\n\t\t$comment_id = (int) $comment['comment_id'];\n\t\tif ( !$comment_id )\n\t\t\tcontinue;\n\n\t\t$del_comment = get_comment($comment_id);\n\n\t\tif ( !$del_comment || 'trash' != $del_comment->comment_approved ) {\n\t\t\tdelete_comment_meta($comment_id, '_wp_trash_meta_time');\n\t\t\tdelete_comment_meta($comment_id, '_wp_trash_meta_status');\n\t\t} else {\n\t\t\twp_delete_comment( $del_comment );\n\t\t}\n\t}\n}\n\n/**\n * Retrieve metadata from a file.\n *\n * Searches for metadata in the first 8kiB of a file, such as a plugin or theme.\n * Each piece of metadata must be on its own line. Fields can not span multiple\n * lines, the value will get cut at the end of the first line.\n *\n * If the file data is not within that first 8kiB, then the author should correct\n * their plugin file and move the data headers to the top.\n *\n * @link https://codex.wordpress.org/File_Header\n *\n * @since 2.9.0\n *\n * @param string $file            Path to the file.\n * @param array  $default_headers List of headers, in the format array('HeaderKey' => 'Header Name').\n * @param string $context         Optional. If specified adds filter hook \"extra_{$context}_headers\".\n *                                Default empty.\n * @return array Array of file headers in `HeaderKey => Header Value` format.\n */\nfunction get_file_data( $file, $default_headers, $context = '' ) {\n\t// We don't need to write to the file, so just open for reading.\n\t$fp = fopen( $file, 'r' );\n\n\t// Pull only the first 8kiB of the file in.\n\t$file_data = fread( $fp, 8192 );\n\n\t// PHP will close file handle, but we are good citizens.\n\tfclose( $fp );\n\n\t// Make sure we catch CR-only line endings.\n\t$file_data = str_replace( \"\\r\", \"\\n\", $file_data );\n\n\t/**\n\t * Filter extra file headers by context.\n\t *\n\t * The dynamic portion of the hook name, `$context`, refers to\n\t * the context where extra headers might be loaded.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param array $extra_context_headers Empty array by default.\n\t */\n\tif ( $context && $extra_headers = apply_filters( \"extra_{$context}_headers\", array() ) ) {\n\t\t$extra_headers = array_combine( $extra_headers, $extra_headers ); // keys equal values\n\t\t$all_headers = array_merge( $extra_headers, (array) $default_headers );\n\t} else {\n\t\t$all_headers = $default_headers;\n\t}\n\n\tforeach ( $all_headers as $field => $regex ) {\n\t\tif ( preg_match( '/^[ \\t\\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, $match ) && $match[1] )\n\t\t\t$all_headers[ $field ] = _cleanup_header_comment( $match[1] );\n\t\telse\n\t\t\t$all_headers[ $field ] = '';\n\t}\n\n\treturn $all_headers;\n}\n\n/**\n * Returns true.\n *\n * Useful for returning true to filters easily.\n *\n * @since 3.0.0\n *\n * @see __return_false()\n *\n * @return true True.\n */\nfunction __return_true() {\n\treturn true;\n}\n\n/**\n * Returns false.\n *\n * Useful for returning false to filters easily.\n *\n * @since 3.0.0\n *\n * @see __return_true()\n *\n * @return false False.\n */\nfunction __return_false() {\n\treturn false;\n}\n\n/**\n * Returns 0.\n *\n * Useful for returning 0 to filters easily.\n *\n * @since 3.0.0\n *\n * @return int 0.\n */\nfunction __return_zero() {\n\treturn 0;\n}\n\n/**\n * Returns an empty array.\n *\n * Useful for returning an empty array to filters easily.\n *\n * @since 3.0.0\n *\n * @return array Empty array.\n */\nfunction __return_empty_array() {\n\treturn array();\n}\n\n/**\n * Returns null.\n *\n * Useful for returning null to filters easily.\n *\n * @since 3.4.0\n *\n * @return null Null value.\n */\nfunction __return_null() {\n\treturn null;\n}\n\n/**\n * Returns an empty string.\n *\n * Useful for returning an empty string to filters easily.\n *\n * @since 3.7.0\n *\n * @see __return_null()\n *\n * @return string Empty string.\n */\nfunction __return_empty_string() {\n\treturn '';\n}\n\n/**\n * Send a HTTP header to disable content type sniffing in browsers which support it.\n *\n * @since 3.0.0\n *\n * @see http://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx\n * @see http://src.chromium.org/viewvc/chrome?view=rev&revision=6985\n */\nfunction send_nosniff_header() {\n\t@header( 'X-Content-Type-Options: nosniff' );\n}\n\n/**\n * Return a MySQL expression for selecting the week number based on the start_of_week option.\n *\n * @ignore\n * @since 3.0.0\n *\n * @param string $column Database column.\n * @return string SQL clause.\n */\nfunction _wp_mysql_week( $column ) {\n\tswitch ( $start_of_week = (int) get_option( 'start_of_week' ) ) {\n\tcase 1 :\n\t\treturn \"WEEK( $column, 1 )\";\n\tcase 2 :\n\tcase 3 :\n\tcase 4 :\n\tcase 5 :\n\tcase 6 :\n\t\treturn \"WEEK( DATE_SUB( $column, INTERVAL $start_of_week DAY ), 0 )\";\n\tcase 0 :\n\tdefault :\n\t\treturn \"WEEK( $column, 0 )\";\n\t}\n}\n\n/**\n * Find hierarchy loops using a callback function that maps object IDs to parent IDs.\n *\n * @since 3.1.0\n * @access private\n *\n * @param callable $callback      Function that accepts ( ID, $callback_args ) and outputs parent_ID.\n * @param int      $start         The ID to start the loop check at.\n * @param int      $start_parent  The parent_ID of $start to use instead of calling $callback( $start ).\n *                                Use null to always use $callback\n * @param array    $callback_args Optional. Additional arguments to send to $callback.\n * @return array IDs of all members of loop.\n */\nfunction wp_find_hierarchy_loop( $callback, $start, $start_parent, $callback_args = array() ) {\n\t$override = is_null( $start_parent ) ? array() : array( $start => $start_parent );\n\n\tif ( !$arbitrary_loop_member = wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override, $callback_args ) )\n\t\treturn array();\n\n\treturn wp_find_hierarchy_loop_tortoise_hare( $callback, $arbitrary_loop_member, $override, $callback_args, true );\n}\n\n/**\n * Use the \"The Tortoise and the Hare\" algorithm to detect loops.\n *\n * For every step of the algorithm, the hare takes two steps and the tortoise one.\n * If the hare ever laps the tortoise, there must be a loop.\n *\n * @since 3.1.0\n * @access private\n *\n * @param callable $callback      Function that accepts ( ID, callback_arg, ... ) and outputs parent_ID.\n * @param int      $start         The ID to start the loop check at.\n * @param array    $override      Optional. An array of ( ID => parent_ID, ... ) to use instead of $callback.\n *                                Default empty array.\n * @param array    $callback_args Optional. Additional arguments to send to $callback. Default empty array.\n * @param bool     $_return_loop  Optional. Return loop members or just detect presence of loop? Only set\n *                                to true if you already know the given $start is part of a loop (otherwise\n *                                the returned array might include branches). Default false.\n * @return mixed Scalar ID of some arbitrary member of the loop, or array of IDs of all members of loop if\n *               $_return_loop\n */\nfunction wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override = array(), $callback_args = array(), $_return_loop = false ) {\n\t$tortoise = $hare = $evanescent_hare = $start;\n\t$return = array();\n\n\t// Set evanescent_hare to one past hare\n\t// Increment hare two steps\n\twhile (\n\t\t$tortoise\n\t&&\n\t\t( $evanescent_hare = isset( $override[$hare] ) ? $override[$hare] : call_user_func_array( $callback, array_merge( array( $hare ), $callback_args ) ) )\n\t&&\n\t\t( $hare = isset( $override[$evanescent_hare] ) ? $override[$evanescent_hare] : call_user_func_array( $callback, array_merge( array( $evanescent_hare ), $callback_args ) ) )\n\t) {\n\t\tif ( $_return_loop )\n\t\t\t$return[$tortoise] = $return[$evanescent_hare] = $return[$hare] = true;\n\n\t\t// tortoise got lapped - must be a loop\n\t\tif ( $tortoise == $evanescent_hare || $tortoise == $hare )\n\t\t\treturn $_return_loop ? $return : $tortoise;\n\n\t\t// Increment tortoise by one step\n\t\t$tortoise = isset( $override[$tortoise] ) ? $override[$tortoise] : call_user_func_array( $callback, array_merge( array( $tortoise ), $callback_args ) );\n\t}\n\n\treturn false;\n}\n\n/**\n * Send a HTTP header to limit rendering of pages to same origin iframes.\n *\n * @since 3.1.3\n *\n * @see https://developer.mozilla.org/en/the_x-frame-options_response_header\n */\nfunction send_frame_options_header() {\n\t@header( 'X-Frame-Options: SAMEORIGIN' );\n}\n\n/**\n * Retrieve a list of protocols to allow in HTML attributes.\n *\n * @since 3.3.0\n * @since 4.3.0 Added 'webcal' to the protocols array.\n *\n * @see wp_kses()\n * @see esc_url()\n *\n * @staticvar array $protocols\n *\n * @return array Array of allowed protocols. Defaults to an array containing 'http', 'https',\n *               'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet',\n *               'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', and 'webcal'.\n */\nfunction wp_allowed_protocols() {\n\tstatic $protocols = array();\n\n\tif ( empty( $protocols ) ) {\n\t\t$protocols = array( 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal' );\n\n\t\t/**\n\t\t * Filter the list of protocols allowed in HTML attributes.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $protocols Array of allowed protocols e.g. 'http', 'ftp', 'tel', and more.\n\t\t */\n\t\t$protocols = apply_filters( 'kses_allowed_protocols', $protocols );\n\t}\n\n\treturn $protocols;\n}\n\n/**\n * Return a comma-separated string of functions that have been called to get\n * to the current point in code.\n *\n * @since 3.4.0\n *\n * @see https://core.trac.wordpress.org/ticket/19589\n *\n * @param string $ignore_class Optional. A class to ignore all function calls within - useful\n *                             when you want to just give info about the callee. Default null.\n * @param int    $skip_frames  Optional. A number of stack frames to skip - useful for unwinding\n *                             back to the source of the issue. Default 0.\n * @param bool   $pretty       Optional. Whether or not you want a comma separated string or raw\n *                             array returned. Default true.\n * @return string|array Either a string containing a reversed comma separated trace or an array\n *                      of individual calls.\n */\nfunction wp_debug_backtrace_summary( $ignore_class = null, $skip_frames = 0, $pretty = true ) {\n\tif ( version_compare( PHP_VERSION, '5.2.5', '>=' ) )\n\t\t$trace = debug_backtrace( false );\n\telse\n\t\t$trace = debug_backtrace();\n\n\t$caller = array();\n\t$check_class = ! is_null( $ignore_class );\n\t$skip_frames++; // skip this function\n\n\tforeach ( $trace as $call ) {\n\t\tif ( $skip_frames > 0 ) {\n\t\t\t$skip_frames--;\n\t\t} elseif ( isset( $call['class'] ) ) {\n\t\t\tif ( $check_class && $ignore_class == $call['class'] )\n\t\t\t\tcontinue; // Filter out calls\n\n\t\t\t$caller[] = \"{$call['class']}{$call['type']}{$call['function']}\";\n\t\t} else {\n\t\t\tif ( in_array( $call['function'], array( 'do_action', 'apply_filters' ) ) ) {\n\t\t\t\t$caller[] = \"{$call['function']}('{$call['args'][0]}')\";\n\t\t\t} elseif ( in_array( $call['function'], array( 'include', 'include_once', 'require', 'require_once' ) ) ) {\n\t\t\t\t$caller[] = $call['function'] . \"('\" . str_replace( array( WP_CONTENT_DIR, ABSPATH ) , '', $call['args'][0] ) . \"')\";\n\t\t\t} else {\n\t\t\t\t$caller[] = $call['function'];\n\t\t\t}\n\t\t}\n\t}\n\tif ( $pretty )\n\t\treturn join( ', ', array_reverse( $caller ) );\n\telse\n\t\treturn $caller;\n}\n\n/**\n * Retrieve ids that are not already present in the cache.\n *\n * @since 3.4.0\n * @access private\n *\n * @param array  $object_ids ID list.\n * @param string $cache_key  The cache bucket to check against.\n *\n * @return array List of ids not present in the cache.\n */\nfunction _get_non_cached_ids( $object_ids, $cache_key ) {\n\t$clean = array();\n\tforeach ( $object_ids as $id ) {\n\t\t$id = (int) $id;\n\t\tif ( !wp_cache_get( $id, $cache_key ) ) {\n\t\t\t$clean[] = $id;\n\t\t}\n\t}\n\n\treturn $clean;\n}\n\n/**\n * Test if the current device has the capability to upload files.\n *\n * @since 3.4.0\n * @access private\n *\n * @return bool Whether the device is able to upload files.\n */\nfunction _device_can_upload() {\n\tif ( ! wp_is_mobile() )\n\t\treturn true;\n\n\t$ua = $_SERVER['HTTP_USER_AGENT'];\n\n\tif ( strpos($ua, 'iPhone') !== false\n\t\t|| strpos($ua, 'iPad') !== false\n\t\t|| strpos($ua, 'iPod') !== false ) {\n\t\t\treturn preg_match( '#OS ([\\d_]+) like Mac OS X#', $ua, $version ) && version_compare( $version[1], '6', '>=' );\n\t}\n\n\treturn true;\n}\n\n/**\n * Test if a given path is a stream URL\n *\n * @param string $path The resource path or URL.\n * @return bool True if the path is a stream URL.\n */\nfunction wp_is_stream( $path ) {\n\t$wrappers = stream_get_wrappers();\n\t$wrappers_re = '(' . join('|', $wrappers) . ')';\n\n\treturn preg_match( \"!^$wrappers_re://!\", $path ) === 1;\n}\n\n/**\n * Test if the supplied date is valid for the Gregorian calendar.\n *\n * @since 3.5.0\n *\n * @see checkdate()\n *\n * @param  int    $month       Month number.\n * @param  int    $day         Day number.\n * @param  int    $year        Year number.\n * @param  string $source_date The date to filter.\n * @return bool True if valid date, false if not valid date.\n */\nfunction wp_checkdate( $month, $day, $year, $source_date ) {\n\t/**\n\t * Filter whether the given date is valid for the Gregorian calendar.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param bool   $checkdate   Whether the given date is valid.\n\t * @param string $source_date Date to check.\n\t */\n\treturn apply_filters( 'wp_checkdate', checkdate( $month, $day, $year ), $source_date );\n}\n\n/**\n * Load the auth check for monitoring whether the user is still logged in.\n *\n * Can be disabled with remove_action( 'admin_enqueue_scripts', 'wp_auth_check_load' );\n *\n * This is disabled for certain screens where a login screen could cause an\n * inconvenient interruption. A filter called wp_auth_check_load can be used\n * for fine-grained control.\n *\n * @since 3.6.0\n */\nfunction wp_auth_check_load() {\n\tif ( ! is_admin() && ! is_user_logged_in() )\n\t\treturn;\n\n\tif ( defined( 'IFRAME_REQUEST' ) )\n\t\treturn;\n\n\t$screen = get_current_screen();\n\t$hidden = array( 'update', 'update-network', 'update-core', 'update-core-network', 'upgrade', 'upgrade-network', 'network' );\n\t$show = ! in_array( $screen->id, $hidden );\n\n\t/**\n\t * Filter whether to load the authentication check.\n\t *\n\t * Passing a falsey value to the filter will effectively short-circuit\n\t * loading the authentication check.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param bool      $show   Whether to load the authentication check.\n\t * @param WP_Screen $screen The current screen object.\n\t */\n\tif ( apply_filters( 'wp_auth_check_load', $show, $screen ) ) {\n\t\twp_enqueue_style( 'wp-auth-check' );\n\t\twp_enqueue_script( 'wp-auth-check' );\n\n\t\tadd_action( 'admin_print_footer_scripts', 'wp_auth_check_html', 5 );\n\t\tadd_action( 'wp_print_footer_scripts', 'wp_auth_check_html', 5 );\n\t}\n}\n\n/**\n * Output the HTML that shows the wp-login dialog when the user is no longer logged in.\n *\n * @since 3.6.0\n */\nfunction wp_auth_check_html() {\n\t$login_url = wp_login_url();\n\t$current_domain = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'];\n\t$same_domain = ( strpos( $login_url, $current_domain ) === 0 );\n\n\t/**\n\t * Filter whether the authentication check originated at the same domain.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param bool $same_domain Whether the authentication check originated at the same domain.\n\t */\n\t$same_domain = apply_filters( 'wp_auth_check_same_domain', $same_domain );\n\t$wrap_class = $same_domain ? 'hidden' : 'hidden fallback';\n\n\t?>\n\t<div id=\"wp-auth-check-wrap\" class=\"<?php echo $wrap_class; ?>\">\n\t<div id=\"wp-auth-check-bg\"></div>\n\t<div id=\"wp-auth-check\">\n\t<div class=\"wp-auth-check-close\" tabindex=\"0\" title=\"<?php esc_attr_e('Close'); ?>\"></div>\n\t<?php\n\n\tif ( $same_domain ) {\n\t\t?>\n\t\t<div id=\"wp-auth-check-form\" data-src=\"<?php echo esc_url( add_query_arg( array( 'interim-login' => 1 ), $login_url ) ); ?>\"></div>\n\t\t<?php\n\t}\n\n\t?>\n\t<div class=\"wp-auth-fallback\">\n\t\t<p><b class=\"wp-auth-fallback-expired\" tabindex=\"0\"><?php _e('Session expired'); ?></b></p>\n\t\t<p><a href=\"<?php echo esc_url( $login_url ); ?>\" target=\"_blank\"><?php _e('Please log in again.'); ?></a>\n\t\t<?php _e('The login page will open in a new window. After logging in you can close it and return to this page.'); ?></p>\n\t</div>\n\t</div>\n\t</div>\n\t<?php\n}\n\n/**\n * Check whether a user is still logged in, for the heartbeat.\n *\n * Send a result that shows a log-in box if the user is no longer logged in,\n * or if their cookie is within the grace period.\n *\n * @since 3.6.0\n *\n * @global int $login_grace_period\n *\n * @param array $response  The Heartbeat response.\n * @return array $response The Heartbeat response with 'wp-auth-check' value set.\n */\nfunction wp_auth_check( $response ) {\n\t$response['wp-auth-check'] = is_user_logged_in() && empty( $GLOBALS['login_grace_period'] );\n\treturn $response;\n}\n\n/**\n * Return RegEx body to liberally match an opening HTML tag.\n *\n * Matches an opening HTML tag that:\n * 1. Is self-closing or\n * 2. Has no body but has a closing tag of the same name or\n * 3. Contains a body and a closing tag of the same name\n *\n * Note: this RegEx does not balance inner tags and does not attempt\n * to produce valid HTML\n *\n * @since 3.6.0\n *\n * @param string $tag An HTML tag name. Example: 'video'.\n * @return string Tag RegEx.\n */\nfunction get_tag_regex( $tag ) {\n\tif ( empty( $tag ) )\n\t\treturn;\n\treturn sprintf( '<%1$s[^<]*(?:>[\\s\\S]*<\\/%1$s>|\\s*\\/>)', tag_escape( $tag ) );\n}\n\n/**\n * Retrieve a canonical form of the provided charset appropriate for passing to PHP\n * functions such as htmlspecialchars() and charset html attributes.\n *\n * @since 3.6.0\n * @access private\n *\n * @see https://core.trac.wordpress.org/ticket/23688\n *\n * @param string $charset A charset name.\n * @return string The canonical form of the charset.\n */\nfunction _canonical_charset( $charset ) {\n\tif ( 'UTF-8' === $charset || 'utf-8' === $charset || 'utf8' === $charset ||\n\t\t'UTF8' === $charset )\n\t\treturn 'UTF-8';\n\n\tif ( 'ISO-8859-1' === $charset || 'iso-8859-1' === $charset ||\n\t\t'iso8859-1' === $charset || 'ISO8859-1' === $charset )\n\t\treturn 'ISO-8859-1';\n\n\treturn $charset;\n}\n\n/**\n * Set the mbstring internal encoding to a binary safe encoding when func_overload\n * is enabled.\n *\n * When mbstring.func_overload is in use for multi-byte encodings, the results from\n * strlen() and similar functions respect the utf8 characters, causing binary data\n * to return incorrect lengths.\n *\n * This function overrides the mbstring encoding to a binary-safe encoding, and\n * resets it to the users expected encoding afterwards through the\n * `reset_mbstring_encoding` function.\n *\n * It is safe to recursively call this function, however each\n * `mbstring_binary_safe_encoding()` call must be followed up with an equal number\n * of `reset_mbstring_encoding()` calls.\n *\n * @since 3.7.0\n *\n * @see reset_mbstring_encoding()\n *\n * @staticvar array $encodings\n * @staticvar bool  $overloaded\n *\n * @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding.\n *                    Default false.\n */\nfunction mbstring_binary_safe_encoding( $reset = false ) {\n\tstatic $encodings = array();\n\tstatic $overloaded = null;\n\n\tif ( is_null( $overloaded ) )\n\t\t$overloaded = function_exists( 'mb_internal_encoding' ) && ( ini_get( 'mbstring.func_overload' ) & 2 );\n\n\tif ( false === $overloaded )\n\t\treturn;\n\n\tif ( ! $reset ) {\n\t\t$encoding = mb_internal_encoding();\n\t\tarray_push( $encodings, $encoding );\n\t\tmb_internal_encoding( 'ISO-8859-1' );\n\t}\n\n\tif ( $reset && $encodings ) {\n\t\t$encoding = array_pop( $encodings );\n\t\tmb_internal_encoding( $encoding );\n\t}\n}\n\n/**\n * Reset the mbstring internal encoding to a users previously set encoding.\n *\n * @see mbstring_binary_safe_encoding()\n *\n * @since 3.7.0\n */\nfunction reset_mbstring_encoding() {\n\tmbstring_binary_safe_encoding( true );\n}\n\n/**\n * Filter/validate a variable as a boolean.\n *\n * Alternative to `filter_var( $var, FILTER_VALIDATE_BOOLEAN )`.\n *\n * @since 4.0.0\n *\n * @param mixed $var Boolean value to validate.\n * @return bool Whether the value is validated.\n */\nfunction wp_validate_boolean( $var ) {\n\tif ( is_bool( $var ) ) {\n\t\treturn $var;\n\t}\n\n\tif ( is_string( $var ) && 'false' === strtolower( $var ) ) {\n\t\treturn false;\n\t}\n\n\treturn (bool) $var;\n}\n\n/**\n * Delete a file\n *\n * @since 4.2.0\n *\n * @param string $file The path to the file to delete.\n */\nfunction wp_delete_file( $file ) {\n\t/**\n\t * Filter the path of the file to delete.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $medium Path to the file to delete.\n\t */\n\t$delete = apply_filters( 'wp_delete_file', $file );\n\tif ( ! empty( $delete ) ) {\n\t\t@unlink( $delete );\n\t}\n}\n\n/**\n * Outputs a small JS snippet on preview tabs/windows to remove `window.name` on unload.\n *\n * This prevents reusing the same tab for a preview when the user has navigated away.\n *\n * @since 4.3.0\n */\nfunction wp_post_preview_js() {\n\tglobal $post;\n\n\tif ( ! is_preview() || empty( $post ) ) {\n\t\treturn;\n\t}\n\n\t// Has to match the window name used in post_submit_meta_box()\n\t$name = 'wp-preview-' . (int) $post->ID;\n\n\t?>\n\t<script>\n\t( function() {\n\t\tvar query = document.location.search;\n\n\t\tif ( query && query.indexOf( 'preview=true' ) !== -1 ) {\n\t\t\twindow.name = '<?php echo $name; ?>';\n\t\t}\n\n\t\tif ( window.addEventListener ) {\n\t\t\twindow.addEventListener( 'unload', function() { window.name = ''; }, false );\n\t\t}\n\t}());\n\t</script>\n\t<?php\n}\n\n/**\n * Parses and formats a MySQL datetime (Y-m-d H:i:s) for ISO8601/RFC3339.\n *\n * Explicitly strips timezones, as datetimes are not saved with any timezone\n * information. Including any information on the offset could be misleading.\n *\n * @since 4.4.0\n *\n * @param string $date_string Date string to parse and format.\n * @return string Date formatted for ISO8601/RFC3339.\n */\nfunction mysql_to_rfc3339( $date_string ) {\n\t$formatted = mysql2date( 'c', $date_string, false );\n\n\t// Strip timezone information\n\treturn preg_replace( '/(?:Z|[+-]\\d{2}(?::\\d{2})?)$/', '', $formatted );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/functions.wp-scripts.php",
    "content": "<?php\n/**\n * BackPress Scripts Procedural API\n *\n * @since 2.6.0\n *\n * @package WordPress\n * @subpackage BackPress\n */\n\n/**\n * Initialize $wp_scripts if it has not been set.\n *\n * @global WP_Scripts $wp_scripts\n *\n * @since 4.2.0\n *\n * @return WP_Scripts WP_Scripts instance.\n */\nfunction wp_scripts() {\n\tglobal $wp_scripts;\n\tif ( ! ( $wp_scripts instanceof WP_Scripts ) ) {\n\t\t$wp_scripts = new WP_Scripts();\n\t}\n\treturn $wp_scripts;\n}\n\n/**\n * Helper function to output a _doing_it_wrong message when applicable.\n *\n * @ignore\n * @since 4.2.0\n *\n * @param string $function Function name.\n */\nfunction _wp_scripts_maybe_doing_it_wrong( $function ) {\n\tif ( did_action( 'init' ) ) {\n\t\treturn;\n\t}\n\n\t_doing_it_wrong( $function, sprintf(\n\t\t__( 'Scripts and styles should not be registered or enqueued until the %1$s, %2$s, or %3$s hooks.' ),\n\t\t'<code>wp_enqueue_scripts</code>',\n\t\t'<code>admin_enqueue_scripts</code>',\n\t\t'<code>login_enqueue_scripts</code>'\n\t), '3.3' );\n}\n\n/**\n * Print scripts in document head that are in the $handles queue.\n *\n * Called by admin-header.php and wp_head hook. Since it is called by wp_head on every page load,\n * the function does not instantiate the WP_Scripts object unless script names are explicitly passed.\n * Makes use of already-instantiated $wp_scripts global if present. Use provided wp_print_scripts\n * hook to register/enqueue new scripts.\n *\n * @see WP_Scripts::do_items()\n * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts.\n *\n * @since 2.6.0\n *\n * @param string|bool|array $handles Optional. Scripts to be printed. Default 'false'.\n * @return array On success, a processed array of WP_Dependencies items; otherwise, an empty array.\n */\nfunction wp_print_scripts( $handles = false ) {\n\t/**\n\t * Fires before scripts in the $handles queue are printed.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'wp_print_scripts' );\n\tif ( '' === $handles ) { // for wp_head\n\t\t$handles = false;\n\t}\n\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\tglobal $wp_scripts;\n\tif ( ! ( $wp_scripts instanceof WP_Scripts ) ) {\n\t\tif ( ! $handles ) {\n\t\t\treturn array(); // No need to instantiate if nothing is there.\n\t\t}\n\t}\n\n\treturn wp_scripts()->do_items( $handles );\n}\n\n/**\n * Register a new script.\n *\n * Registers a script to be linked later using the wp_enqueue_script() function.\n *\n * @see WP_Dependencies::add(), WP_Dependencies::add_data()\n *\n * @since 2.6.0\n * @since 4.3.0 A return value was added.\n *\n * @param string      $handle    Name of the script. Should be unique.\n * @param string      $src       Path to the script from the WordPress root directory. Example: '/js/myscript.js'.\n * @param array       $deps      Optional. An array of registered script handles this script depends on. Set to false if there\n *                               are no dependencies. Default empty array.\n * @param string|bool $ver       Optional. String specifying script version number, if it has one, which is concatenated\n *                               to end of path as a query string. If no version is specified or set to false, a version\n *                               number is automatically added equal to current installed WordPress version.\n *                               If set to null, no version is added. Default 'false'. Accepts 'false', 'null', or 'string'.\n * @param bool        $in_footer Optional. Whether to enqueue the script before </head> or before </body>.\n *                               Default 'false'. Accepts 'false' or 'true'.\n * @return bool Whether the script has been registered. True on success, false on failure.\n */\nfunction wp_register_script( $handle, $src, $deps = array(), $ver = false, $in_footer = false ) {\n\t$wp_scripts = wp_scripts();\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\t$registered = $wp_scripts->add( $handle, $src, $deps, $ver );\n\tif ( $in_footer ) {\n\t\t$wp_scripts->add_data( $handle, 'group', 1 );\n\t}\n\n\treturn $registered;\n}\n\n/**\n * Localize a script.\n *\n * Works only if the script has already been added.\n *\n * Accepts an associative array $l10n and creates a JavaScript object:\n *\n *     \"$object_name\" = {\n *         key: value,\n *         key: value,\n *         ...\n *     }\n *\n *\n * @see WP_Dependencies::localize()\n * @link https://core.trac.wordpress.org/ticket/11520\n * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts.\n *\n * @since 2.6.0\n *\n * @todo Documentation cleanup\n *\n * @param string $handle      Script handle the data will be attached to.\n * @param string $object_name Name for the JavaScript object. Passed directly, so it should be qualified JS variable.\n *                            Example: '/[a-zA-Z0-9_]+/'.\n * @param array $l10n         The data itself. The data can be either a single or multi-dimensional array.\n * @return bool True if the script was successfully localized, false otherwise.\n */\nfunction wp_localize_script( $handle, $object_name, $l10n ) {\n\tglobal $wp_scripts;\n\tif ( ! ( $wp_scripts instanceof WP_Scripts ) ) {\n\t\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\t\treturn false;\n\t}\n\n\treturn $wp_scripts->localize( $handle, $object_name, $l10n );\n}\n\n/**\n * Remove a registered script.\n *\n * Note: there are intentional safeguards in place to prevent critical admin scripts,\n * such as jQuery core, from being unregistered.\n *\n * @see WP_Dependencies::remove()\n *\n * @since 2.6.0\n *\n * @param string $handle Name of the script to be removed.\n */\nfunction wp_deregister_script( $handle ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\t/**\n\t * Do not allow accidental or negligent de-registering of critical scripts in the admin.\n\t * Show minimal remorse if the correct hook is used.\n\t */\n\t$current_filter = current_filter();\n\tif ( ( is_admin() && 'admin_enqueue_scripts' !== $current_filter ) ||\n\t\t( 'wp-login.php' === $GLOBALS['pagenow'] && 'login_enqueue_scripts' !== $current_filter )\n\t) {\n\t\t$no = array(\n\t\t\t'jquery', 'jquery-core', 'jquery-migrate', 'jquery-ui-core', 'jquery-ui-accordion',\n\t\t\t'jquery-ui-autocomplete', 'jquery-ui-button', 'jquery-ui-datepicker', 'jquery-ui-dialog',\n\t\t\t'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-menu', 'jquery-ui-mouse',\n\t\t\t'jquery-ui-position', 'jquery-ui-progressbar', 'jquery-ui-resizable', 'jquery-ui-selectable',\n\t\t\t'jquery-ui-slider', 'jquery-ui-sortable', 'jquery-ui-spinner', 'jquery-ui-tabs',\n\t\t\t'jquery-ui-tooltip', 'jquery-ui-widget', 'underscore', 'backbone',\n\t\t);\n\n\t\tif ( in_array( $handle, $no ) ) {\n\t\t\t$message = sprintf( __( 'Do not deregister the %1$s script in the administration area. To target the frontend theme, use the %2$s hook.' ),\n\t\t\t\t\"<code>$handle</code>\", '<code>wp_enqueue_scripts</code>' );\n\t\t\t_doing_it_wrong( __FUNCTION__, $message, '3.6' );\n\t\t\treturn;\n\t\t}\n\t}\n\n\twp_scripts()->remove( $handle );\n}\n\n/**\n * Enqueue a script.\n *\n * Registers the script if $src provided (does NOT overwrite), and enqueues it.\n *\n * @see WP_Dependencies::add(), WP_Dependencies::add_data(), WP_Dependencies::enqueue()\n *\n * @since 2.6.0\n *\n * @param string      $handle    Name of the script.\n * @param string|bool $src       Path to the script from the root directory of WordPress. Example: '/js/myscript.js'.\n * @param array       $deps      An array of registered handles this script depends on. Default empty array.\n * @param string|bool $ver       Optional. String specifying the script version number, if it has one. This parameter\n *                               is used to ensure that the correct version is sent to the client regardless of caching,\n *                               and so should be included if a version number is available and makes sense for the script.\n * @param bool        $in_footer Optional. Whether to enqueue the script before </head> or before </body>.\n *                               Default 'false'. Accepts 'false' or 'true'.\n */\nfunction wp_enqueue_script( $handle, $src = false, $deps = array(), $ver = false, $in_footer = false ) {\n\t$wp_scripts = wp_scripts();\n\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\n\tif ( $src || $in_footer ) {\n\t\t$_handle = explode( '?', $handle );\n\n\t\tif ( $src ) {\n\t\t\t$wp_scripts->add( $_handle[0], $src, $deps, $ver );\n\t\t}\n\n\t\tif ( $in_footer ) {\n\t\t\t$wp_scripts->add_data( $_handle[0], 'group', 1 );\n\t\t}\n\t}\n\n\t$wp_scripts->enqueue( $handle );\n}\n\n/**\n * Remove a previously enqueued script.\n *\n * @see WP_Dependencies::dequeue()\n *\n * @since 3.1.0\n *\n * @param string $handle Name of the script to be removed.\n */\nfunction wp_dequeue_script( $handle ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\twp_scripts()->dequeue( $handle );\n}\n\n/**\n * Check whether a script has been added to the queue.\n *\n * @since 2.8.0\n * @since 3.5.0 'enqueued' added as an alias of the 'queue' list.\n *\n * @param string $handle Name of the script.\n * @param string $list   Optional. Status of the script to check. Default 'enqueued'.\n *                       Accepts 'enqueued', 'registered', 'queue', 'to_do', and 'done'.\n * @return bool Whether the script script is queued.\n */\nfunction wp_script_is( $handle, $list = 'enqueued' ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\treturn (bool) wp_scripts()->query( $handle, $list );\n}\n\n/**\n * Add metadata to a script.\n *\n * Works only if the script has already been added.\n *\n * Possible values for $key and $value:\n * 'conditional' string Comments for IE 6, lte IE 7, etc.\n *\n * @since 4.2.0\n *\n * @see WP_Dependency::add_data()\n *\n * @param string $handle Name of the script.\n * @param string $key    Name of data point for which we're storing a value.\n * @param mixed  $value  String containing the data to be added.\n * @return bool True on success, false on failure.\n */\nfunction wp_script_add_data( $handle, $key, $value ){\n\treturn wp_scripts()->add_data( $handle, $key, $value );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/functions.wp-styles.php",
    "content": "<?php\n/**\n * BackPress Styles Procedural API\n *\n * @since 2.6.0\n *\n * @package WordPress\n * @subpackage BackPress\n */\n\n/**\n * Initialize $wp_styles if it has not been set.\n *\n * @global WP_Styles $wp_styles\n *\n * @since 4.2.0\n *\n * @return WP_Styles WP_Styles instance.\n */\nfunction wp_styles() {\n\tglobal $wp_styles;\n\tif ( ! ( $wp_styles instanceof WP_Styles ) ) {\n\t\t$wp_styles = new WP_Styles();\n\t}\n\treturn $wp_styles;\n}\n\n/**\n * Display styles that are in the $handles queue.\n *\n * Passing an empty array to $handles prints the queue,\n * passing an array with one string prints that style,\n * and passing an array of strings prints those styles.\n *\n * @global WP_Styles $wp_styles The WP_Styles object for printing styles.\n *\n * @since 2.6.0\n *\n * @param string|bool|array $handles Styles to be printed. Default 'false'.\n * @return array On success, a processed array of WP_Dependencies items; otherwise, an empty array.\n */\nfunction wp_print_styles( $handles = false ) {\n\tif ( '' === $handles ) { // for wp_head\n\t\t$handles = false;\n\t}\n\t/**\n\t * Fires before styles in the $handles queue are printed.\n\t *\n\t * @since 2.6.0\n\t */\n\tif ( ! $handles ) {\n\t\tdo_action( 'wp_print_styles' );\n\t}\n\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\tglobal $wp_styles;\n\tif ( ! ( $wp_styles instanceof WP_Styles ) ) {\n\t\tif ( ! $handles ) {\n\t\t\treturn array(); // No need to instantiate if nothing is there.\n\t\t}\n\t}\n\n\treturn wp_styles()->do_items( $handles );\n}\n\n/**\n * Add extra CSS styles to a registered stylesheet.\n *\n * Styles will only be added if the stylesheet in already in the queue.\n * Accepts a string $data containing the CSS. If two or more CSS code blocks\n * are added to the same stylesheet $handle, they will be printed in the order\n * they were added, i.e. the latter added styles can redeclare the previous.\n *\n * @see WP_Styles::add_inline_style()\n *\n * @since 3.3.0\n *\n * @param string $handle Name of the stylesheet to add the extra styles to. Must be lowercase.\n * @param string $data   String containing the CSS styles to be added.\n * @return bool True on success, false on failure.\n */\nfunction wp_add_inline_style( $handle, $data ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\tif ( false !== stripos( $data, '</style>' ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Do not pass style tags to wp_add_inline_style().' ), '3.7' );\n\t\t$data = trim( preg_replace( '#<style[^>]*>(.*)</style>#is', '$1', $data ) );\n\t}\n\n\treturn wp_styles()->add_inline_style( $handle, $data );\n}\n\n/**\n * Register a CSS stylesheet.\n *\n * @see WP_Dependencies::add()\n * @link http://www.w3.org/TR/CSS2/media.html#media-types List of CSS media types.\n *\n * @since 2.6.0\n * @since 4.3.0 A return value was added.\n *\n * @param string      $handle Name of the stylesheet.\n * @param string|bool $src    Path to the stylesheet from the WordPress root directory. Example: '/css/mystyle.css'.\n * @param array       $deps   An array of registered style handles this stylesheet depends on. Default empty array.\n * @param string|bool $ver    String specifying the stylesheet version number. Used to ensure that the correct version\n *                            is sent to the client regardless of caching. Default 'false'. Accepts 'false', 'null', or 'string'.\n * @param string      $media  Optional. The media for which this stylesheet has been defined.\n *                            Default 'all'. Accepts 'all', 'aural', 'braille', 'handheld', 'projection', 'print',\n *                            'screen', 'tty', or 'tv'.\n * @return bool Whether the style has been registered. True on success, false on failure.\n */\nfunction wp_register_style( $handle, $src, $deps = array(), $ver = false, $media = 'all' ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\treturn wp_styles()->add( $handle, $src, $deps, $ver, $media );\n}\n\n/**\n * Remove a registered stylesheet.\n *\n * @see WP_Dependencies::remove()\n *\n * @since 2.1.0\n *\n * @param string $handle Name of the stylesheet to be removed.\n */\nfunction wp_deregister_style( $handle ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\twp_styles()->remove( $handle );\n}\n\n/**\n * Enqueue a CSS stylesheet.\n *\n * Registers the style if source provided (does NOT overwrite) and enqueues.\n *\n * @see WP_Dependencies::add(), WP_Dependencies::enqueue()\n * @link http://www.w3.org/TR/CSS2/media.html#media-types List of CSS media types.\n *\n * @since 2.6.0\n *\n * @param string      $handle Name of the stylesheet.\n * @param string|bool $src    Path to the stylesheet from the root directory of WordPress. Example: '/css/mystyle.css'.\n * @param array       $deps   An array of registered style handles this stylesheet depends on. Default empty array.\n * @param string|bool $ver    String specifying the stylesheet version number, if it has one. This parameter is used\n *                            to ensure that the correct version is sent to the client regardless of caching, and so\n *                            should be included if a version number is available and makes sense for the stylesheet.\n * @param string      $media  Optional. The media for which this stylesheet has been defined.\n *                            Default 'all'. Accepts 'all', 'aural', 'braille', 'handheld', 'projection', 'print',\n *                            'screen', 'tty', or 'tv'.\n */\nfunction wp_enqueue_style( $handle, $src = false, $deps = array(), $ver = false, $media = 'all' ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\t$wp_styles = wp_styles();\n\n\tif ( $src ) {\n\t\t$_handle = explode('?', $handle);\n\t\t$wp_styles->add( $_handle[0], $src, $deps, $ver, $media );\n\t}\n\t$wp_styles->enqueue( $handle );\n}\n\n/**\n * Remove a previously enqueued CSS stylesheet.\n *\n * @see WP_Dependencies::dequeue()\n *\n * @since 3.1.0\n *\n * @param string $handle Name of the stylesheet to be removed.\n */\nfunction wp_dequeue_style( $handle ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\twp_styles()->dequeue( $handle );\n}\n\n/**\n * Check whether a CSS stylesheet has been added to the queue.\n *\n * @since 2.8.0\n *\n * @param string $handle Name of the stylesheet.\n * @param string $list   Optional. Status of the stylesheet to check. Default 'enqueued'.\n *                       Accepts 'enqueued', 'registered', 'queue', 'to_do', and 'done'.\n * @return bool Whether style is queued.\n */\nfunction wp_style_is( $handle, $list = 'enqueued' ) {\n\t_wp_scripts_maybe_doing_it_wrong( __FUNCTION__ );\n\n\treturn (bool) wp_styles()->query( $handle, $list );\n}\n\n/**\n * Add metadata to a CSS stylesheet.\n *\n * Works only if the stylesheet has already been added.\n *\n * Possible values for $key and $value:\n * 'conditional' string      Comments for IE 6, lte IE 7 etc.\n * 'rtl'         bool|string To declare an RTL stylesheet.\n * 'suffix'      string      Optional suffix, used in combination with RTL.\n * 'alt'         bool        For rel=\"alternate stylesheet\".\n * 'title'       string      For preferred/alternate stylesheets.\n *\n * @see WP_Dependency::add_data()\n *\n * @since 3.6.0\n *\n * @param string $handle Name of the stylesheet.\n * @param string $key    Name of data point for which we're storing a value.\n *                       Accepts 'conditional', 'rtl' and 'suffix', 'alt' and 'title'.\n * @param mixed  $value  String containing the CSS data to be added.\n * @return bool True on success, false on failure.\n */\nfunction wp_style_add_data( $handle, $key, $value ) {\n\treturn wp_styles()->add_data( $handle, $key, $value );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/general-template.php",
    "content": "<?php\n/**\n * General template tags that can go anywhere in a template.\n *\n * @package WordPress\n * @subpackage Template\n */\n\n/**\n * Load header template.\n *\n * Includes the header template for a theme or if a name is specified then a\n * specialised header will be included.\n *\n * For the parameter, if the file is called \"header-special.php\" then specify\n * \"special\".\n *\n * @since 1.5.0\n *\n * @param string $name The name of the specialised header.\n */\nfunction get_header( $name = null ) {\n\t/**\n\t * Fires before the header template file is loaded.\n\t *\n\t * The hook allows a specific header template file to be used in place of the\n\t * default header template file. If your file is called header-new.php,\n\t * you would specify the filename in the hook as get_header( 'new' ).\n\t *\n\t * @since 2.1.0\n\t * @since 2.8.0 $name parameter added.\n\t *\n\t * @param string $name Name of the specific header file to use.\n\t */\n\tdo_action( 'get_header', $name );\n\n\t$templates = array();\n\t$name = (string) $name;\n\tif ( '' !== $name )\n\t\t$templates[] = \"header-{$name}.php\";\n\n\t$templates[] = 'header.php';\n\n\t// Backward compat code will be removed in a future release\n\tif ('' == locate_template($templates, true))\n\t\tload_template( ABSPATH . WPINC . '/theme-compat/header.php');\n}\n\n/**\n * Load footer template.\n *\n * Includes the footer template for a theme or if a name is specified then a\n * specialised footer will be included.\n *\n * For the parameter, if the file is called \"footer-special.php\" then specify\n * \"special\".\n *\n * @since 1.5.0\n *\n * @param string $name The name of the specialised footer.\n */\nfunction get_footer( $name = null ) {\n\t/**\n\t * Fires before the footer template file is loaded.\n\t *\n\t * The hook allows a specific footer template file to be used in place of the\n\t * default footer template file. If your file is called footer-new.php,\n\t * you would specify the filename in the hook as get_footer( 'new' ).\n\t *\n\t * @since 2.1.0\n\t * @since 2.8.0 $name parameter added.\n\t *\n\t * @param string $name Name of the specific footer file to use.\n\t */\n\tdo_action( 'get_footer', $name );\n\n\t$templates = array();\n\t$name = (string) $name;\n\tif ( '' !== $name )\n\t\t$templates[] = \"footer-{$name}.php\";\n\n\t$templates[] = 'footer.php';\n\n\t// Backward compat code will be removed in a future release\n\tif ('' == locate_template($templates, true))\n\t\tload_template( ABSPATH . WPINC . '/theme-compat/footer.php');\n}\n\n/**\n * Load sidebar template.\n *\n * Includes the sidebar template for a theme or if a name is specified then a\n * specialised sidebar will be included.\n *\n * For the parameter, if the file is called \"sidebar-special.php\" then specify\n * \"special\".\n *\n * @since 1.5.0\n *\n * @param string $name The name of the specialised sidebar.\n */\nfunction get_sidebar( $name = null ) {\n\t/**\n\t * Fires before the sidebar template file is loaded.\n\t *\n\t * The hook allows a specific sidebar template file to be used in place of the\n\t * default sidebar template file. If your file is called sidebar-new.php,\n\t * you would specify the filename in the hook as get_sidebar( 'new' ).\n\t *\n\t * @since 2.2.0\n\t * @since 2.8.0 $name parameter added.\n\t *\n\t * @param string $name Name of the specific sidebar file to use.\n\t */\n\tdo_action( 'get_sidebar', $name );\n\n\t$templates = array();\n\t$name = (string) $name;\n\tif ( '' !== $name )\n\t\t$templates[] = \"sidebar-{$name}.php\";\n\n\t$templates[] = 'sidebar.php';\n\n\t// Backward compat code will be removed in a future release\n\tif ('' == locate_template($templates, true))\n\t\tload_template( ABSPATH . WPINC . '/theme-compat/sidebar.php');\n}\n\n/**\n * Load a template part into a template\n *\n * Makes it easy for a theme to reuse sections of code in a easy to overload way\n * for child themes.\n *\n * Includes the named template part for a theme or if a name is specified then a\n * specialised part will be included. If the theme contains no {slug}.php file\n * then no template will be included.\n *\n * The template is included using require, not require_once, so you may include the\n * same template part multiple times.\n *\n * For the $name parameter, if the file is called \"{slug}-special.php\" then specify\n * \"special\".\n *\n * @since 3.0.0\n *\n * @param string $slug The slug name for the generic template.\n * @param string $name The name of the specialised template.\n */\nfunction get_template_part( $slug, $name = null ) {\n\t/**\n\t * Fires before the specified template part file is loaded.\n\t *\n\t * The dynamic portion of the hook name, `$slug`, refers to the slug name\n\t * for the generic template part.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $slug The slug name for the generic template.\n\t * @param string $name The name of the specialized template.\n\t */\n\tdo_action( \"get_template_part_{$slug}\", $slug, $name );\n\n\t$templates = array();\n\t$name = (string) $name;\n\tif ( '' !== $name )\n\t\t$templates[] = \"{$slug}-{$name}.php\";\n\n\t$templates[] = \"{$slug}.php\";\n\n\tlocate_template($templates, true, false);\n}\n\n/**\n * Display search form.\n *\n * Will first attempt to locate the searchform.php file in either the child or\n * the parent, then load it. If it doesn't exist, then the default search form\n * will be displayed. The default search form is HTML, which will be displayed.\n * There is a filter applied to the search form HTML in order to edit or replace\n * it. The filter is 'get_search_form'.\n *\n * This function is primarily used by themes which want to hardcode the search\n * form into the sidebar and also by the search widget in WordPress.\n *\n * There is also an action that is called whenever the function is run called,\n * 'pre_get_search_form'. This can be useful for outputting JavaScript that the\n * search relies on or various formatting that applies to the beginning of the\n * search. To give a few examples of what it can be used for.\n *\n * @since 2.7.0\n *\n * @param bool $echo Default to echo and not return the form.\n * @return string|void String when $echo is false.\n */\nfunction get_search_form( $echo = true ) {\n\t/**\n\t * Fires before the search form is retrieved, at the start of get_search_form().\n\t *\n\t * @since 2.7.0 as 'get_search_form' action.\n\t * @since 3.6.0\n\t *\n\t * @link https://core.trac.wordpress.org/ticket/19321\n\t */\n\tdo_action( 'pre_get_search_form' );\n\n\t$format = current_theme_supports( 'html5', 'search-form' ) ? 'html5' : 'xhtml';\n\n\t/**\n\t * Filter the HTML format of the search form.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $format The type of markup to use in the search form.\n\t *                       Accepts 'html5', 'xhtml'.\n\t */\n\t$format = apply_filters( 'search_form_format', $format );\n\n\t$search_form_template = locate_template( 'searchform.php' );\n\tif ( '' != $search_form_template ) {\n\t\tob_start();\n\t\trequire( $search_form_template );\n\t\t$form = ob_get_clean();\n\t} else {\n\t\tif ( 'html5' == $format ) {\n\t\t\t$form = '<form role=\"search\" method=\"get\" class=\"search-form\" action=\"' . esc_url( home_url( '/' ) ) . '\">\n\t\t\t\t<label>\n\t\t\t\t\t<span class=\"screen-reader-text\">' . _x( 'Search for:', 'label' ) . '</span>\n\t\t\t\t\t<input type=\"search\" class=\"search-field\" placeholder=\"' . esc_attr_x( 'Search &hellip;', 'placeholder' ) . '\" value=\"' . get_search_query() . '\" name=\"s\" title=\"' . esc_attr_x( 'Search for:', 'label' ) . '\" />\n\t\t\t\t</label>\n\t\t\t\t<input type=\"submit\" class=\"search-submit\" value=\"'. esc_attr_x( 'Search', 'submit button' ) .'\" />\n\t\t\t</form>';\n\t\t} else {\n\t\t\t$form = '<form role=\"search\" method=\"get\" id=\"searchform\" class=\"searchform\" action=\"' . esc_url( home_url( '/' ) ) . '\">\n\t\t\t\t<div>\n\t\t\t\t\t<label class=\"screen-reader-text\" for=\"s\">' . _x( 'Search for:', 'label' ) . '</label>\n\t\t\t\t\t<input type=\"text\" value=\"' . get_search_query() . '\" name=\"s\" id=\"s\" />\n\t\t\t\t\t<input type=\"submit\" id=\"searchsubmit\" value=\"'. esc_attr_x( 'Search', 'submit button' ) .'\" />\n\t\t\t\t</div>\n\t\t\t</form>';\n\t\t}\n\t}\n\n\t/**\n\t * Filter the HTML output of the search form.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $form The search form HTML output.\n\t */\n\t$result = apply_filters( 'get_search_form', $form );\n\n\tif ( null === $result )\n\t\t$result = $form;\n\n\tif ( $echo )\n\t\techo $result;\n\telse\n\t\treturn $result;\n}\n\n/**\n * Display the Log In/Out link.\n *\n * Displays a link, which allows users to navigate to the Log In page to log in\n * or log out depending on whether they are currently logged in.\n *\n * @since 1.5.0\n *\n * @param string $redirect Optional path to redirect to on login/logout.\n * @param bool   $echo     Default to echo and not return the link.\n * @return string|void String when retrieving.\n */\nfunction wp_loginout($redirect = '', $echo = true) {\n\tif ( ! is_user_logged_in() )\n\t\t$link = '<a href=\"' . esc_url( wp_login_url($redirect) ) . '\">' . __('Log in') . '</a>';\n\telse\n\t\t$link = '<a href=\"' . esc_url( wp_logout_url($redirect) ) . '\">' . __('Log out') . '</a>';\n\n\tif ( $echo ) {\n\t\t/**\n\t\t * Filter the HTML output for the Log In/Log Out link.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param string $link The HTML link content.\n\t\t */\n\t\techo apply_filters( 'loginout', $link );\n\t} else {\n\t\t/** This filter is documented in wp-includes/general-template.php */\n\t\treturn apply_filters( 'loginout', $link );\n\t}\n}\n\n/**\n * Returns the Log Out URL.\n *\n * Returns the URL that allows the user to log out of the site.\n *\n * @since 2.7.0\n *\n * @param string $redirect Path to redirect to on logout.\n * @return string A log out URL.\n */\nfunction wp_logout_url($redirect = '') {\n\t$args = array( 'action' => 'logout' );\n\tif ( !empty($redirect) ) {\n\t\t$args['redirect_to'] = urlencode( $redirect );\n\t}\n\n\t$logout_url = add_query_arg($args, site_url('wp-login.php', 'login'));\n\t$logout_url = wp_nonce_url( $logout_url, 'log-out' );\n\n\t/**\n\t * Filter the logout URL.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $logout_url The Log Out URL.\n\t * @param string $redirect   Path to redirect to on logout.\n\t */\n\treturn apply_filters( 'logout_url', $logout_url, $redirect );\n}\n\n/**\n * Returns the URL that allows the user to log in to the site.\n *\n * @since 2.7.0\n *\n * @param string $redirect     Path to redirect to on login.\n * @param bool   $force_reauth Whether to force reauthorization, even if a cookie is present. Default is false.\n * @return string A log in URL.\n */\nfunction wp_login_url($redirect = '', $force_reauth = false) {\n\t$login_url = site_url('wp-login.php', 'login');\n\n\tif ( !empty($redirect) )\n\t\t$login_url = add_query_arg('redirect_to', urlencode($redirect), $login_url);\n\n\tif ( $force_reauth )\n\t\t$login_url = add_query_arg('reauth', '1', $login_url);\n\n\t/**\n\t * Filter the login URL.\n\t *\n\t * @since 2.8.0\n\t * @since 4.2.0 The `$force_reauth` parameter was added.\n\t *\n\t * @param string $login_url    The login URL.\n\t * @param string $redirect     The path to redirect to on login, if supplied.\n\t * @param bool   $force_reauth Whether to force reauthorization, even if a cookie is present.\n\t */\n\treturn apply_filters( 'login_url', $login_url, $redirect, $force_reauth );\n}\n\n/**\n * Returns the URL that allows the user to register on the site.\n *\n * @since 3.6.0\n *\n * @return string User registration URL.\n */\nfunction wp_registration_url() {\n\t/**\n\t * Filter the user registration URL.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $register The user registration URL.\n\t */\n\treturn apply_filters( 'register_url', site_url( 'wp-login.php?action=register', 'login' ) );\n}\n\n/**\n * Provides a simple login form for use anywhere within WordPress.\n *\n * The login format HTML is echoed by default. Pass a false value for `$echo` to return it instead.\n *\n * @since 3.0.0\n *\n * @param array $args {\n *     Optional. Array of options to control the form output. Default empty array.\n *\n *     @type bool   $echo           Whether to display the login form or return the form HTML code.\n *                                  Default true (echo).\n *     @type string $redirect       URL to redirect to. Must be absolute, as in \"https://example.com/mypage/\".\n *                                  Default is to redirect back to the request URI.\n *     @type string $form_id        ID attribute value for the form. Default 'loginform'.\n *     @type string $label_username Label for the username field. Default 'Username'.\n *     @type string $label_password Label for the password field. Default 'Password'.\n *     @type string $label_remember Label for the remember field. Default 'Remember Me'.\n *     @type string $label_log_in   Label for the submit button. Default 'Log In'.\n *     @type string $id_username    ID attribute value for the username field. Default 'user_login'.\n *     @type string $id_password    ID attribute value for the password field. Default 'user_pass'.\n *     @type string $id_remember    ID attribute value for the remember field. Default 'rememberme'.\n *     @type string $id_submit      ID attribute value for the submit button. Default 'wp-submit'.\n *     @type bool   $remember       Whether to display the \"rememberme\" checkbox in the form.\n *     @type string $value_username Default value for the username field. Default empty.\n *     @type bool   $value_remember Whether the \"Remember Me\" checkbox should be checked by default.\n *                                  Default false (unchecked).\n *\n * }\n * @return string|void String when retrieving.\n */\nfunction wp_login_form( $args = array() ) {\n\t$defaults = array(\n\t\t'echo' => true,\n\t\t// Default 'redirect' value takes the user back to the request URI.\n\t\t'redirect' => ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],\n\t\t'form_id' => 'loginform',\n\t\t'label_username' => __( 'Username' ),\n\t\t'label_password' => __( 'Password' ),\n\t\t'label_remember' => __( 'Remember Me' ),\n\t\t'label_log_in' => __( 'Log In' ),\n\t\t'id_username' => 'user_login',\n\t\t'id_password' => 'user_pass',\n\t\t'id_remember' => 'rememberme',\n\t\t'id_submit' => 'wp-submit',\n\t\t'remember' => true,\n\t\t'value_username' => '',\n\t\t// Set 'value_remember' to true to default the \"Remember me\" checkbox to checked.\n\t\t'value_remember' => false,\n\t);\n\n\t/**\n\t * Filter the default login form output arguments.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @see wp_login_form()\n\t *\n\t * @param array $defaults An array of default login form arguments.\n\t */\n\t$args = wp_parse_args( $args, apply_filters( 'login_form_defaults', $defaults ) );\n\n\t/**\n\t * Filter content to display at the top of the login form.\n\t *\n\t * The filter evaluates just following the opening form tag element.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $content Content to display. Default empty.\n\t * @param array  $args    Array of login form arguments.\n\t */\n\t$login_form_top = apply_filters( 'login_form_top', '', $args );\n\n\t/**\n\t * Filter content to display in the middle of the login form.\n\t *\n\t * The filter evaluates just following the location where the 'login-password'\n\t * field is displayed.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $content Content to display. Default empty.\n\t * @param array  $args    Array of login form arguments.\n\t */\n\t$login_form_middle = apply_filters( 'login_form_middle', '', $args );\n\n\t/**\n\t * Filter content to display at the bottom of the login form.\n\t *\n\t * The filter evaluates just preceding the closing form tag element.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $content Content to display. Default empty.\n\t * @param array  $args    Array of login form arguments.\n\t */\n\t$login_form_bottom = apply_filters( 'login_form_bottom', '', $args );\n\n\t$form = '\n\t\t<form name=\"' . $args['form_id'] . '\" id=\"' . $args['form_id'] . '\" action=\"' . esc_url( site_url( 'wp-login.php', 'login_post' ) ) . '\" method=\"post\">\n\t\t\t' . $login_form_top . '\n\t\t\t<p class=\"login-username\">\n\t\t\t\t<label for=\"' . esc_attr( $args['id_username'] ) . '\">' . esc_html( $args['label_username'] ) . '</label>\n\t\t\t\t<input type=\"text\" name=\"log\" id=\"' . esc_attr( $args['id_username'] ) . '\" class=\"input\" value=\"' . esc_attr( $args['value_username'] ) . '\" size=\"20\" />\n\t\t\t</p>\n\t\t\t<p class=\"login-password\">\n\t\t\t\t<label for=\"' . esc_attr( $args['id_password'] ) . '\">' . esc_html( $args['label_password'] ) . '</label>\n\t\t\t\t<input type=\"password\" name=\"pwd\" id=\"' . esc_attr( $args['id_password'] ) . '\" class=\"input\" value=\"\" size=\"20\" />\n\t\t\t</p>\n\t\t\t' . $login_form_middle . '\n\t\t\t' . ( $args['remember'] ? '<p class=\"login-remember\"><label><input name=\"rememberme\" type=\"checkbox\" id=\"' . esc_attr( $args['id_remember'] ) . '\" value=\"forever\"' . ( $args['value_remember'] ? ' checked=\"checked\"' : '' ) . ' /> ' . esc_html( $args['label_remember'] ) . '</label></p>' : '' ) . '\n\t\t\t<p class=\"login-submit\">\n\t\t\t\t<input type=\"submit\" name=\"wp-submit\" id=\"' . esc_attr( $args['id_submit'] ) . '\" class=\"button-primary\" value=\"' . esc_attr( $args['label_log_in'] ) . '\" />\n\t\t\t\t<input type=\"hidden\" name=\"redirect_to\" value=\"' . esc_url( $args['redirect'] ) . '\" />\n\t\t\t</p>\n\t\t\t' . $login_form_bottom . '\n\t\t</form>';\n\n\tif ( $args['echo'] )\n\t\techo $form;\n\telse\n\t\treturn $form;\n}\n\n/**\n * Returns the URL that allows the user to retrieve the lost password\n *\n * @since 2.8.0\n *\n * @param string $redirect Path to redirect to on login.\n * @return string Lost password URL.\n */\nfunction wp_lostpassword_url( $redirect = '' ) {\n\t$args = array( 'action' => 'lostpassword' );\n\tif ( !empty($redirect) ) {\n\t\t$args['redirect_to'] = $redirect;\n\t}\n\n\t$lostpassword_url = add_query_arg( $args, network_site_url('wp-login.php', 'login') );\n\n\t/**\n\t * Filter the Lost Password URL.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $lostpassword_url The lost password page URL.\n\t * @param string $redirect         The path to redirect to on login.\n\t */\n\treturn apply_filters( 'lostpassword_url', $lostpassword_url, $redirect );\n}\n\n/**\n * Display the Registration or Admin link.\n *\n * Display a link which allows the user to navigate to the registration page if\n * not logged in and registration is enabled or to the dashboard if logged in.\n *\n * @since 1.5.0\n *\n * @param string $before Text to output before the link. Default `<li>`.\n * @param string $after  Text to output after the link. Default `</li>`.\n * @param bool   $echo   Default to echo and not return the link.\n * @return string|void String when retrieving.\n */\nfunction wp_register( $before = '<li>', $after = '</li>', $echo = true ) {\n\tif ( ! is_user_logged_in() ) {\n\t\tif ( get_option('users_can_register') )\n\t\t\t$link = $before . '<a href=\"' . esc_url( wp_registration_url() ) . '\">' . __('Register') . '</a>' . $after;\n\t\telse\n\t\t\t$link = '';\n\t} elseif ( current_user_can( 'read' ) ) {\n\t\t$link = $before . '<a href=\"' . admin_url() . '\">' . __('Site Admin') . '</a>' . $after;\n\t} else {\n\t\t$link = '';\n\t}\n\n\t/**\n\t * Filter the HTML link to the Registration or Admin page.\n\t *\n\t * Users are sent to the admin page if logged-in, or the registration page\n\t * if enabled and logged-out.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $link The HTML code for the link to the Registration or Admin page.\n\t */\n\t$link = apply_filters( 'register', $link );\n\n\tif ( $echo ) {\n\t\techo $link;\n\t} else {\n\t\treturn $link;\n\t}\n}\n\n/**\n * Theme container function for the 'wp_meta' action.\n *\n * The 'wp_meta' action can have several purposes, depending on how you use it,\n * but one purpose might have been to allow for theme switching.\n *\n * @since 1.5.0\n *\n * @link https://core.trac.wordpress.org/ticket/1458 Explanation of 'wp_meta' action.\n */\nfunction wp_meta() {\n\t/**\n\t * Fires before displaying echoed content in the sidebar.\n\t *\n\t * @since 1.5.0\n\t */\n\tdo_action( 'wp_meta' );\n}\n\n/**\n * Display information about the blog.\n *\n * @see get_bloginfo() For possible values for the parameter.\n * @since 0.71\n *\n * @param string $show What to display.\n */\nfunction bloginfo( $show='' ) {\n\techo get_bloginfo( $show, 'display' );\n}\n\n/**\n * Retrieve information about the blog.\n *\n * Some show parameter values are deprecated and will be removed in future\n * versions. These options will trigger the {@see _deprecated_argument()}\n * function. The deprecated blog info options are listed in the function\n * contents.\n *\n * The possible values for the 'show' parameter are listed below.\n *\n * 1. url - Blog URI to homepage.\n * 2. wpurl - Blog URI path to WordPress.\n * 3. description - Secondary title\n *\n * The feed URL options can be retrieved from 'rdf_url' (RSS 0.91),\n * 'rss_url' (RSS 1.0), 'rss2_url' (RSS 2.0), or 'atom_url' (Atom feed). The\n * comment feeds can be retrieved from the 'comments_atom_url' (Atom comment\n * feed) or 'comments_rss2_url' (RSS 2.0 comment feed).\n *\n * @since 0.71\n *\n * @global string $wp_version\n *\n * @param string $show   Blog info to retrieve.\n * @param string $filter How to filter what is retrieved.\n * @return string Mostly string values, might be empty.\n */\nfunction get_bloginfo( $show = '', $filter = 'raw' ) {\n\tswitch( $show ) {\n\t\tcase 'home' : // DEPRECATED\n\t\tcase 'siteurl' : // DEPRECATED\n\t\t\t_deprecated_argument( __FUNCTION__, '2.2', sprintf(\n\t\t\t\t/* translators: 1: 'siteurl'/'home' argument, 2: bloginfo() function name, 3: 'url' argument */\n\t\t\t\t__( 'The %1$s option is deprecated for the family of %2$s functions. Use the %3$s option instead.' ),\n\t\t\t\t'<code>' . $show . '</code>',\n\t\t\t\t'<code>bloginfo()</code>',\n\t\t\t\t'<code>url</code>'\n\t\t\t) );\n\t\tcase 'url' :\n\t\t\t$output = home_url();\n\t\t\tbreak;\n\t\tcase 'wpurl' :\n\t\t\t$output = site_url();\n\t\t\tbreak;\n\t\tcase 'description':\n\t\t\t$output = get_option('blogdescription');\n\t\t\tbreak;\n\t\tcase 'rdf_url':\n\t\t\t$output = get_feed_link('rdf');\n\t\t\tbreak;\n\t\tcase 'rss_url':\n\t\t\t$output = get_feed_link('rss');\n\t\t\tbreak;\n\t\tcase 'rss2_url':\n\t\t\t$output = get_feed_link('rss2');\n\t\t\tbreak;\n\t\tcase 'atom_url':\n\t\t\t$output = get_feed_link('atom');\n\t\t\tbreak;\n\t\tcase 'comments_atom_url':\n\t\t\t$output = get_feed_link('comments_atom');\n\t\t\tbreak;\n\t\tcase 'comments_rss2_url':\n\t\t\t$output = get_feed_link('comments_rss2');\n\t\t\tbreak;\n\t\tcase 'pingback_url':\n\t\t\t$output = site_url( 'xmlrpc.php' );\n\t\t\tbreak;\n\t\tcase 'stylesheet_url':\n\t\t\t$output = get_stylesheet_uri();\n\t\t\tbreak;\n\t\tcase 'stylesheet_directory':\n\t\t\t$output = get_stylesheet_directory_uri();\n\t\t\tbreak;\n\t\tcase 'template_directory':\n\t\tcase 'template_url':\n\t\t\t$output = get_template_directory_uri();\n\t\t\tbreak;\n\t\tcase 'admin_email':\n\t\t\t$output = get_option('admin_email');\n\t\t\tbreak;\n\t\tcase 'charset':\n\t\t\t$output = get_option('blog_charset');\n\t\t\tif ('' == $output) $output = 'UTF-8';\n\t\t\tbreak;\n\t\tcase 'html_type' :\n\t\t\t$output = get_option('html_type');\n\t\t\tbreak;\n\t\tcase 'version':\n\t\t\tglobal $wp_version;\n\t\t\t$output = $wp_version;\n\t\t\tbreak;\n\t\tcase 'language':\n\t\t\t$output = get_locale();\n\t\t\t$output = str_replace('_', '-', $output);\n\t\t\tbreak;\n\t\tcase 'text_direction':\n\t\t\t_deprecated_argument( __FUNCTION__, '2.2', sprintf(\n\t\t\t\t/* translators: 1: 'text_direction' argument, 2: bloginfo() function name, 3: is_rtl() function name */\n\t\t\t\t__( 'The %1$s option is deprecated for the family of %2$s functions. Use the %3$s function instead.' ),\n\t\t\t\t'<code>' . $show . '</code>',\n\t\t\t\t'<code>bloginfo()</code>',\n\t\t\t\t'<code>is_rtl()</code>'\n\t\t\t) );\n\t\t\tif ( function_exists( 'is_rtl' ) ) {\n\t\t\t\t$output = is_rtl() ? 'rtl' : 'ltr';\n\t\t\t} else {\n\t\t\t\t$output = 'ltr';\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'name':\n\t\tdefault:\n\t\t\t$output = get_option('blogname');\n\t\t\tbreak;\n\t}\n\n\t$url = true;\n\tif (strpos($show, 'url') === false &&\n\t\tstrpos($show, 'directory') === false &&\n\t\tstrpos($show, 'home') === false)\n\t\t$url = false;\n\n\tif ( 'display' == $filter ) {\n\t\tif ( $url ) {\n\t\t\t/**\n\t\t\t * Filter the URL returned by get_bloginfo().\n\t\t\t *\n\t\t\t * @since 2.0.5\n\t\t\t *\n\t\t\t * @param mixed $output The URL returned by bloginfo().\n\t\t\t * @param mixed $show   Type of information requested.\n\t\t\t */\n\t\t\t$output = apply_filters( 'bloginfo_url', $output, $show );\n\t\t} else {\n\t\t\t/**\n\t\t\t * Filter the site information returned by get_bloginfo().\n\t\t\t *\n\t\t\t * @since 0.71\n\t\t\t *\n\t\t\t * @param mixed $output The requested non-URL site information.\n\t\t\t * @param mixed $show   Type of information requested.\n\t\t\t */\n\t\t\t$output = apply_filters( 'bloginfo', $output, $show );\n\t\t}\n\t}\n\n\treturn $output;\n}\n\n/**\n * Returns the Site Icon URL.\n *\n * @since 4.3.0\n *\n * @param int    $size    Optional. Size of the site icon. Default 512 (pixels).\n * @param string $url     Optional. Fallback url if no site icon is found. Default empty.\n * @param int    $blog_id Optional. ID of the blog to get the site icon for. Default current blog.\n * @return string Site Icon URL.\n */\nfunction get_site_icon_url( $size = 512, $url = '', $blog_id = 0 ) {\n\tif ( is_multisite() && (int) $blog_id !== get_current_blog_id() ) {\n\t\tswitch_to_blog( $blog_id );\n\t}\n\n\t$site_icon_id = get_option( 'site_icon' );\n\n\tif ( $site_icon_id ) {\n\t\tif ( $size >= 512 ) {\n\t\t\t$size_data = 'full';\n\t\t} else {\n\t\t\t$size_data = array( $size, $size );\n\t\t}\n\t\t$url = wp_get_attachment_image_url( $site_icon_id, $size_data );\n\t}\n\n\tif ( is_multisite() && ms_is_switched() ) {\n\t\trestore_current_blog();\n\t}\n\n\t/**\n\t * Filter the site icon URL.\n\t *\n\t * @site 4.4.0\n\t *\n\t * @param string $url     Site icon URL.\n\t * @param int    $size    Size of the site icon.\n\t * @param int    $blog_id ID of the blog to get the site icon for.\n\t */\n\treturn apply_filters( 'get_site_icon_url', $url, $size, $blog_id );\n}\n\n/**\n * Displays the Site Icon URL.\n *\n * @since 4.3.0\n *\n * @param int    $size    Optional. Size of the site icon. Default 512 (pixels).\n * @param string $url     Optional. Fallback url if no site icon is found. Default empty.\n * @param int    $blog_id Optional. ID of the blog to get the site icon for. Default current blog.\n */\nfunction site_icon_url( $size = 512, $url = '', $blog_id = 0 ) {\n\techo esc_url( get_site_icon_url( $size, $url, $blog_id ) );\n}\n\n/**\n * Whether the site has a Site Icon.\n *\n * @since 4.3.0\n *\n * @param int $blog_id Optional. ID of the blog in question. Default current blog.\n * @return bool Whether the site has a site icon or not.\n */\nfunction has_site_icon( $blog_id = 0 ) {\n\treturn (bool) get_site_icon_url( 512, '', $blog_id );\n}\n\n/**\n * Returns document title for the current page.\n *\n * @since 4.4.0\n *\n * @global int $page  Page number of a single post.\n * @global int $paged Page number of a list of posts.\n *\n * @return string Tag with the document title.\n */\nfunction wp_get_document_title() {\n\n\t/**\n\t * Filter the document title before it is generated.\n\t *\n\t * Passing a non-empty value will short-circuit wp_get_document_title(),\n\t * returning that value instead.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $title The document title. Default empty string.\n\t */\n\t$title = apply_filters( 'pre_get_document_title', '' );\n\tif ( ! empty( $title ) ) {\n\t\treturn $title;\n\t}\n\n\tglobal $page, $paged;\n\n\t$title = array(\n\t\t'title' => '',\n\t);\n\n\t// If it's a 404 page, use a \"Page not found\" title.\n\tif ( is_404() ) {\n\t\t$title['title'] = __( 'Page not found' );\n\n\t// If it's a search, use a dynamic search results title.\n\t} elseif ( is_search() ) {\n\t\t/* translators: %s: search phrase */\n\t\t$title['title'] = sprintf( __( 'Search Results for &#8220;%s&#8221;' ), get_search_query() );\n\n\t// If on the front page, use the site title.\n\t} elseif ( is_front_page() ) {\n\t\t$title['title'] = get_bloginfo( 'name', 'display' );\n\n\t// If on a post type archive, use the post type archive title.\n\t} elseif ( is_post_type_archive() ) {\n\t\t$title['title'] = post_type_archive_title( '', false );\n\n\t// If on a taxonomy archive, use the term title.\n\t} elseif ( is_tax() ) {\n\t\t$title['title'] = single_term_title( '', false );\n\n\t/*\n\t * If we're on the blog page that is not the homepage or\n\t * a single post of any post type, use the post title.\n\t */\n\t} elseif ( is_home() || is_singular() ) {\n\t\t$title['title'] = single_post_title( '', false );\n\n\t// If on a category or tag archive, use the term title.\n\t} elseif ( is_category() || is_tag() ) {\n\t\t$title['title'] = single_term_title( '', false );\n\n\t// If on an author archive, use the author's display name.\n\t} elseif ( is_author() && $author = get_queried_object() ) {\n\t\t$title['title'] = $author->display_name;\n\n\t// If it's a date archive, use the date as the title.\n\t} elseif ( is_year() ) {\n\t\t$title['title'] = get_the_date( _x( 'Y', 'yearly archives date format' ) );\n\n\t} elseif ( is_month() ) {\n\t\t$title['title'] = get_the_date( _x( 'F Y', 'monthly archives date format' ) );\n\n\t} elseif ( is_day() ) {\n\t\t$title['title'] = get_the_date();\n\t}\n\n\t// Add a page number if necessary.\n\tif ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) {\n\t\t$title['page'] = sprintf( __( 'Page %s' ), max( $paged, $page ) );\n\t}\n\n\t// Append the description or site title to give context.\n\tif ( is_front_page() ) {\n\t\t$title['tagline'] = get_bloginfo( 'description', 'display' );\n\t} else {\n\t\t$title['site'] = get_bloginfo( 'name', 'display' );\n\t}\n\n\t/**\n\t * Filter the separator for the document title.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $sep Document title separator. Default '-'.\n\t */\n\t$sep = apply_filters( 'document_title_separator', '-' );\n\n\t/**\n\t * Filter the parts of the document title.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $title {\n\t *     The document title parts.\n\t *\n\t *     @type string $title   Title of the viewed page.\n\t *     @type string $page    Optional. Page number if paginated.\n\t *     @type string $tagline Optional. Site description when on home page.\n\t *     @type string $site    Optional. Site title when not on home page.\n\t * }\n\t */\n\t$title = apply_filters( 'document_title_parts', $title );\n\n\t$title = implode( \" $sep \", array_filter( $title ) );\n\t$title = wptexturize( $title );\n\t$title = convert_chars( $title );\n\t$title = esc_html( $title );\n\t$title = capital_P_dangit( $title );\n\n\treturn $title;\n}\n\n/**\n * Displays title tag with content.\n *\n * @ignore\n * @since 4.1.0\n * @since 4.4.0 Improved title output replaced `wp_title()`.\n * @access private\n */\nfunction _wp_render_title_tag() {\n\tif ( ! current_theme_supports( 'title-tag' ) ) {\n\t\treturn;\n\t}\n\n\techo '<title>' . wp_get_document_title() . '</title>' . \"\\n\";\n}\n\n/**\n * Display or retrieve page title for all areas of blog.\n *\n * By default, the page title will display the separator before the page title,\n * so that the blog title will be before the page title. This is not good for\n * title display, since the blog title shows up on most tabs and not what is\n * important, which is the page that the user is looking at.\n *\n * There are also SEO benefits to having the blog title after or to the 'right'\n * or the page title. However, it is mostly common sense to have the blog title\n * to the right with most browsers supporting tabs. You can achieve this by\n * using the seplocation parameter and setting the value to 'right'. This change\n * was introduced around 2.5.0, in case backwards compatibility of themes is\n * important.\n *\n * @since 1.0.0\n *\n * @global WP_Locale $wp_locale\n *\n * @param string $sep         Optional, default is '&raquo;'. How to separate the various items\n *                            within the page title.\n * @param bool   $display     Optional, default is true. Whether to display or retrieve title.\n * @param string $seplocation Optional. Direction to display title, 'right'.\n * @return string|null String on retrieve, null when displaying.\n */\nfunction wp_title( $sep = '&raquo;', $display = true, $seplocation = '' ) {\n\tglobal $wp_locale;\n\n\t$m        = get_query_var( 'm' );\n\t$year     = get_query_var( 'year' );\n\t$monthnum = get_query_var( 'monthnum' );\n\t$day      = get_query_var( 'day' );\n\t$search   = get_query_var( 's' );\n\t$title    = '';\n\n\t$t_sep = '%WP_TITILE_SEP%'; // Temporary separator, for accurate flipping, if necessary\n\n\t// If there is a post\n\tif ( is_single() || ( is_home() && ! is_front_page() ) || ( is_page() && ! is_front_page() ) ) {\n\t\t$title = single_post_title( '', false );\n\t}\n\n\t// If there's a post type archive\n\tif ( is_post_type_archive() ) {\n\t\t$post_type = get_query_var( 'post_type' );\n\t\tif ( is_array( $post_type ) ) {\n\t\t\t$post_type = reset( $post_type );\n\t\t}\n\t\t$post_type_object = get_post_type_object( $post_type );\n\t\tif ( ! $post_type_object->has_archive ) {\n\t\t\t$title = post_type_archive_title( '', false );\n\t\t}\n\t}\n\n\t// If there's a category or tag\n\tif ( is_category() || is_tag() ) {\n\t\t$title = single_term_title( '', false );\n\t}\n\n\t// If there's a taxonomy\n\tif ( is_tax() ) {\n\t\t$term = get_queried_object();\n\t\tif ( $term ) {\n\t\t\t$tax   = get_taxonomy( $term->taxonomy );\n\t\t\t$title = single_term_title( $tax->labels->name . $t_sep, false );\n\t\t}\n\t}\n\n\t// If there's an author\n\tif ( is_author() && ! is_post_type_archive() ) {\n\t\t$author = get_queried_object();\n\t\tif ( $author ) {\n\t\t\t$title = $author->display_name;\n\t\t}\n\t}\n\n\t// Post type archives with has_archive should override terms.\n\tif ( is_post_type_archive() && $post_type_object->has_archive ) {\n\t\t$title = post_type_archive_title( '', false );\n\t}\n\n\t// If there's a month\n\tif ( is_archive() && ! empty( $m ) ) {\n\t\t$my_year  = substr( $m, 0, 4 );\n\t\t$my_month = $wp_locale->get_month( substr( $m, 4, 2 ) );\n\t\t$my_day   = intval( substr( $m, 6, 2 ) );\n\t\t$title    = $my_year . ( $my_month ? $t_sep . $my_month : '' ) . ( $my_day ? $t_sep . $my_day : '' );\n\t}\n\n\t// If there's a year\n\tif ( is_archive() && ! empty( $year ) ) {\n\t\t$title = $year;\n\t\tif ( ! empty( $monthnum ) ) {\n\t\t\t$title .= $t_sep . $wp_locale->get_month( $monthnum );\n\t\t}\n\t\tif ( ! empty( $day ) ) {\n\t\t\t$title .= $t_sep . zeroise( $day, 2 );\n\t\t}\n\t}\n\n\t// If it's a search\n\tif ( is_search() ) {\n\t\t/* translators: 1: separator, 2: search phrase */\n\t\t$title = sprintf( __( 'Search Results %1$s %2$s' ), $t_sep, strip_tags( $search ) );\n\t}\n\n\t// If it's a 404 page\n\tif ( is_404() ) {\n\t\t$title = __( 'Page not found' );\n\t}\n\n\t$prefix = '';\n\tif ( ! empty( $title ) ) {\n\t\t$prefix = \" $sep \";\n\t}\n\n\t/**\n\t * Filter the parts of the page title.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param array $title_array Parts of the page title.\n\t */\n\t$title_array = apply_filters( 'wp_title_parts', explode( $t_sep, $title ) );\n\n\t// Determines position of the separator and direction of the breadcrumb\n\tif ( 'right' == $seplocation ) { // sep on right, so reverse the order\n\t\t$title_array = array_reverse( $title_array );\n\t\t$title       = implode( \" $sep \", $title_array ) . $prefix;\n\t} else {\n\t\t$title = $prefix . implode( \" $sep \", $title_array );\n\t}\n\n\t/**\n\t * Filter the text of the page title.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param string $title Page title.\n\t * @param string $sep Title separator.\n\t * @param string $seplocation Location of the separator (left or right).\n\t */\n\t$title = apply_filters( 'wp_title', $title, $sep, $seplocation );\n\n\t// Send it out\n\tif ( $display ) {\n\t\techo $title;\n\t} else {\n\t\treturn $title;\n\t}\n}\n\n/**\n * Display or retrieve page title for post.\n *\n * This is optimized for single.php template file for displaying the post title.\n *\n * It does not support placing the separator after the title, but by leaving the\n * prefix parameter empty, you can set the title separator manually. The prefix\n * does not automatically place a space between the prefix, so if there should\n * be a space, the parameter value will need to have it at the end.\n *\n * @since 0.71\n *\n * @param string $prefix  Optional. What to display before the title.\n * @param bool   $display Optional, default is true. Whether to display or retrieve title.\n * @return string|void Title when retrieving.\n */\nfunction single_post_title( $prefix = '', $display = true ) {\n\t$_post = get_queried_object();\n\n\tif ( !isset($_post->post_title) )\n\t\treturn;\n\n\t/**\n\t * Filter the page title for a single post.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $_post_title The single post page title.\n\t * @param object $_post       The current queried object as returned by get_queried_object().\n\t */\n\t$title = apply_filters( 'single_post_title', $_post->post_title, $_post );\n\tif ( $display )\n\t\techo $prefix . $title;\n\telse\n\t\treturn $prefix . $title;\n}\n\n/**\n * Display or retrieve title for a post type archive.\n *\n * This is optimized for archive.php and archive-{$post_type}.php template files\n * for displaying the title of the post type.\n *\n * @since 3.1.0\n *\n * @param string $prefix  Optional. What to display before the title.\n * @param bool   $display Optional, default is true. Whether to display or retrieve title.\n * @return string|void Title when retrieving, null when displaying or failure.\n */\nfunction post_type_archive_title( $prefix = '', $display = true ) {\n\tif ( ! is_post_type_archive() )\n\t\treturn;\n\n\t$post_type = get_query_var( 'post_type' );\n\tif ( is_array( $post_type ) )\n\t\t$post_type = reset( $post_type );\n\n\t$post_type_obj = get_post_type_object( $post_type );\n\n\t/**\n\t * Filter the post type archive title.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $post_type_name Post type 'name' label.\n\t * @param string $post_type      Post type.\n\t */\n\t$title = apply_filters( 'post_type_archive_title', $post_type_obj->labels->name, $post_type );\n\n\tif ( $display )\n\t\techo $prefix . $title;\n\telse\n\t\treturn $prefix . $title;\n}\n\n/**\n * Display or retrieve page title for category archive.\n *\n * Useful for category template files for displaying the category page title.\n * The prefix does not automatically place a space between the prefix, so if\n * there should be a space, the parameter value will need to have it at the end.\n *\n * @since 0.71\n *\n * @param string $prefix  Optional. What to display before the title.\n * @param bool   $display Optional, default is true. Whether to display or retrieve title.\n * @return string|void Title when retrieving.\n */\nfunction single_cat_title( $prefix = '', $display = true ) {\n\treturn single_term_title( $prefix, $display );\n}\n\n/**\n * Display or retrieve page title for tag post archive.\n *\n * Useful for tag template files for displaying the tag page title. The prefix\n * does not automatically place a space between the prefix, so if there should\n * be a space, the parameter value will need to have it at the end.\n *\n * @since 2.3.0\n *\n * @param string $prefix  Optional. What to display before the title.\n * @param bool   $display Optional, default is true. Whether to display or retrieve title.\n * @return string|void Title when retrieving.\n */\nfunction single_tag_title( $prefix = '', $display = true ) {\n\treturn single_term_title( $prefix, $display );\n}\n\n/**\n * Display or retrieve page title for taxonomy term archive.\n *\n * Useful for taxonomy term template files for displaying the taxonomy term page title.\n * The prefix does not automatically place a space between the prefix, so if there should\n * be a space, the parameter value will need to have it at the end.\n *\n * @since 3.1.0\n *\n * @param string $prefix  Optional. What to display before the title.\n * @param bool   $display Optional, default is true. Whether to display or retrieve title.\n * @return string|void Title when retrieving.\n */\nfunction single_term_title( $prefix = '', $display = true ) {\n\t$term = get_queried_object();\n\n\tif ( !$term )\n\t\treturn;\n\n\tif ( is_category() ) {\n\t\t/**\n\t\t * Filter the category archive page title.\n\t\t *\n\t\t * @since 2.0.10\n\t\t *\n\t\t * @param string $term_name Category name for archive being displayed.\n\t\t */\n\t\t$term_name = apply_filters( 'single_cat_title', $term->name );\n\t} elseif ( is_tag() ) {\n\t\t/**\n\t\t * Filter the tag archive page title.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param string $term_name Tag name for archive being displayed.\n\t\t */\n\t\t$term_name = apply_filters( 'single_tag_title', $term->name );\n\t} elseif ( is_tax() ) {\n\t\t/**\n\t\t * Filter the custom taxonomy archive page title.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param string $term_name Term name for archive being displayed.\n\t\t */\n\t\t$term_name = apply_filters( 'single_term_title', $term->name );\n\t} else {\n\t\treturn;\n\t}\n\n\tif ( empty( $term_name ) )\n\t\treturn;\n\n\tif ( $display )\n\t\techo $prefix . $term_name;\n\telse\n\t\treturn $prefix . $term_name;\n}\n\n/**\n * Display or retrieve page title for post archive based on date.\n *\n * Useful for when the template only needs to display the month and year,\n * if either are available. The prefix does not automatically place a space\n * between the prefix, so if there should be a space, the parameter value\n * will need to have it at the end.\n *\n * @since 0.71\n *\n * @global WP_Locale $wp_locale\n *\n * @param string $prefix  Optional. What to display before the title.\n * @param bool   $display Optional, default is true. Whether to display or retrieve title.\n * @return string|void Title when retrieving.\n */\nfunction single_month_title($prefix = '', $display = true ) {\n\tglobal $wp_locale;\n\n\t$m = get_query_var('m');\n\t$year = get_query_var('year');\n\t$monthnum = get_query_var('monthnum');\n\n\tif ( !empty($monthnum) && !empty($year) ) {\n\t\t$my_year = $year;\n\t\t$my_month = $wp_locale->get_month($monthnum);\n\t} elseif ( !empty($m) ) {\n\t\t$my_year = substr($m, 0, 4);\n\t\t$my_month = $wp_locale->get_month(substr($m, 4, 2));\n\t}\n\n\tif ( empty($my_month) )\n\t\treturn false;\n\n\t$result = $prefix . $my_month . $prefix . $my_year;\n\n\tif ( !$display )\n\t\treturn $result;\n\techo $result;\n}\n\n/**\n * Display the archive title based on the queried object.\n *\n * @since 4.1.0\n *\n * @see get_the_archive_title()\n *\n * @param string $before Optional. Content to prepend to the title. Default empty.\n * @param string $after  Optional. Content to append to the title. Default empty.\n */\nfunction the_archive_title( $before = '', $after = '' ) {\n\t$title = get_the_archive_title();\n\n\tif ( ! empty( $title ) ) {\n\t\techo $before . $title . $after;\n\t}\n}\n\n/**\n * Retrieve the archive title based on the queried object.\n *\n * @since 4.1.0\n *\n * @return string Archive title.\n */\nfunction get_the_archive_title() {\n\tif ( is_category() ) {\n\t\t$title = sprintf( __( 'Category: %s' ), single_cat_title( '', false ) );\n\t} elseif ( is_tag() ) {\n\t\t$title = sprintf( __( 'Tag: %s' ), single_tag_title( '', false ) );\n\t} elseif ( is_author() ) {\n\t\t$title = sprintf( __( 'Author: %s' ), '<span class=\"vcard\">' . get_the_author() . '</span>' );\n\t} elseif ( is_year() ) {\n\t\t$title = sprintf( __( 'Year: %s' ), get_the_date( _x( 'Y', 'yearly archives date format' ) ) );\n\t} elseif ( is_month() ) {\n\t\t$title = sprintf( __( 'Month: %s' ), get_the_date( _x( 'F Y', 'monthly archives date format' ) ) );\n\t} elseif ( is_day() ) {\n\t\t$title = sprintf( __( 'Day: %s' ), get_the_date( _x( 'F j, Y', 'daily archives date format' ) ) );\n\t} elseif ( is_tax( 'post_format' ) ) {\n\t\tif ( is_tax( 'post_format', 'post-format-aside' ) ) {\n\t\t\t$title = _x( 'Asides', 'post format archive title' );\n\t\t} elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) {\n\t\t\t$title = _x( 'Galleries', 'post format archive title' );\n\t\t} elseif ( is_tax( 'post_format', 'post-format-image' ) ) {\n\t\t\t$title = _x( 'Images', 'post format archive title' );\n\t\t} elseif ( is_tax( 'post_format', 'post-format-video' ) ) {\n\t\t\t$title = _x( 'Videos', 'post format archive title' );\n\t\t} elseif ( is_tax( 'post_format', 'post-format-quote' ) ) {\n\t\t\t$title = _x( 'Quotes', 'post format archive title' );\n\t\t} elseif ( is_tax( 'post_format', 'post-format-link' ) ) {\n\t\t\t$title = _x( 'Links', 'post format archive title' );\n\t\t} elseif ( is_tax( 'post_format', 'post-format-status' ) ) {\n\t\t\t$title = _x( 'Statuses', 'post format archive title' );\n\t\t} elseif ( is_tax( 'post_format', 'post-format-audio' ) ) {\n\t\t\t$title = _x( 'Audio', 'post format archive title' );\n\t\t} elseif ( is_tax( 'post_format', 'post-format-chat' ) ) {\n\t\t\t$title = _x( 'Chats', 'post format archive title' );\n\t\t}\n\t} elseif ( is_post_type_archive() ) {\n\t\t$title = sprintf( __( 'Archives: %s' ), post_type_archive_title( '', false ) );\n\t} elseif ( is_tax() ) {\n\t\t$tax = get_taxonomy( get_queried_object()->taxonomy );\n\t\t/* translators: 1: Taxonomy singular name, 2: Current taxonomy term */\n\t\t$title = sprintf( __( '%1$s: %2$s' ), $tax->labels->singular_name, single_term_title( '', false ) );\n\t} else {\n\t\t$title = __( 'Archives' );\n\t}\n\n\t/**\n\t * Filter the archive title.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param string $title Archive title to be displayed.\n\t */\n\treturn apply_filters( 'get_the_archive_title', $title );\n}\n\n/**\n * Display category, tag, or term description.\n *\n * @since 4.1.0\n *\n * @see get_the_archive_description()\n *\n * @param string $before Optional. Content to prepend to the description. Default empty.\n * @param string $after  Optional. Content to append to the description. Default empty.\n */\nfunction the_archive_description( $before = '', $after = '' ) {\n\t$description = get_the_archive_description();\n\tif ( $description ) {\n\t\techo $before . $description . $after;\n\t}\n}\n\n/**\n * Retrieve category, tag, or term description.\n *\n * @since 4.1.0\n *\n * @return string Archive description.\n */\nfunction get_the_archive_description() {\n\t/**\n\t * Filter the archive description.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @see term_description()\n\t *\n\t * @param string $description Archive description to be displayed.\n\t */\n\treturn apply_filters( 'get_the_archive_description', term_description() );\n}\n\n/**\n * Retrieve archive link content based on predefined or custom code.\n *\n * The format can be one of four styles. The 'link' for head element, 'option'\n * for use in the select element, 'html' for use in list (either ol or ul HTML\n * elements). Custom content is also supported using the before and after\n * parameters.\n *\n * The 'link' format uses the `<link>` HTML element with the **archives**\n * relationship. The before and after parameters are not used. The text\n * parameter is used to describe the link.\n *\n * The 'option' format uses the option HTML element for use in select element.\n * The value is the url parameter and the before and after parameters are used\n * between the text description.\n *\n * The 'html' format, which is the default, uses the li HTML element for use in\n * the list HTML elements. The before parameter is before the link and the after\n * parameter is after the closing link.\n *\n * The custom format uses the before parameter before the link ('a' HTML\n * element) and the after parameter after the closing link tag. If the above\n * three values for the format are not used, then custom format is assumed.\n *\n * @since 1.0.0\n *\n * @todo Properly document optional arguments as such\n *\n * @param string $url    URL to archive.\n * @param string $text   Archive text description.\n * @param string $format Optional, default is 'html'. Can be 'link', 'option', 'html', or custom.\n * @param string $before Optional.\n * @param string $after  Optional.\n * @return string HTML link content for archive.\n */\nfunction get_archives_link($url, $text, $format = 'html', $before = '', $after = '') {\n\t$text = wptexturize($text);\n\t$url = esc_url($url);\n\n\tif ('link' == $format)\n\t\t$link_html = \"\\t<link rel='archives' title='\" . esc_attr( $text ) . \"' href='$url' />\\n\";\n\telseif ('option' == $format)\n\t\t$link_html = \"\\t<option value='$url'>$before $text $after</option>\\n\";\n\telseif ('html' == $format)\n\t\t$link_html = \"\\t<li>$before<a href='$url'>$text</a>$after</li>\\n\";\n\telse // custom\n\t\t$link_html = \"\\t$before<a href='$url'>$text</a>$after\\n\";\n\n\t/**\n\t * Filter the archive link content.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string $link_html The archive HTML link content.\n\t */\n\treturn apply_filters( 'get_archives_link', $link_html );\n}\n\n/**\n * Display archive links based on type and format.\n *\n * @since 1.2.0\n * @since 4.4.0 $post_type arg was added.\n *\n * @see get_archives_link()\n *\n * @global wpdb      $wpdb\n * @global WP_Locale $wp_locale\n *\n * @param string|array $args {\n *     Default archive links arguments. Optional.\n *\n *     @type string     $type            Type of archive to retrieve. Accepts 'daily', 'weekly', 'monthly',\n *                                       'yearly', 'postbypost', or 'alpha'. Both 'postbypost' and 'alpha'\n *                                       display the same archive link list as well as post titles instead\n *                                       of displaying dates. The difference between the two is that 'alpha'\n *                                       will order by post title and 'postbypost' will order by post date.\n *                                       Default 'monthly'.\n *     @type string|int $limit           Number of links to limit the query to. Default empty (no limit).\n *     @type string     $format          Format each link should take using the $before and $after args.\n *                                       Accepts 'link' (`<link>` tag), 'option' (`<option>` tag), 'html'\n *                                       (`<li>` tag), or a custom format, which generates a link anchor\n *                                       with $before preceding and $after succeeding. Default 'html'.\n *     @type string     $before          Markup to prepend to the beginning of each link. Default empty.\n *     @type string     $after           Markup to append to the end of each link. Default empty.\n *     @type bool       $show_post_count Whether to display the post count alongside the link. Default false.\n *     @type bool|int   $echo            Whether to echo or return the links list. Default 1|true to echo.\n *     @type string     $order           Whether to use ascending or descending order. Accepts 'ASC', or 'DESC'.\n *                                       Default 'DESC'.\n *     @type string     $post_type       Post type. Default 'post'.\n * }\n * @return string|void String when retrieving.\n */\nfunction wp_get_archives( $args = '' ) {\n\tglobal $wpdb, $wp_locale;\n\n\t$defaults = array(\n\t\t'type' => 'monthly', 'limit' => '',\n\t\t'format' => 'html', 'before' => '',\n\t\t'after' => '', 'show_post_count' => false,\n\t\t'echo' => 1, 'order' => 'DESC',\n\t\t'post_type' => 'post'\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$post_type_object = get_post_type_object( $r['post_type'] );\n\tif ( ! is_post_type_viewable( $post_type_object ) ) {\n\t\treturn;\n\t}\n\t$r['post_type'] = $post_type_object->name;\n\n\tif ( '' == $r['type'] ) {\n\t\t$r['type'] = 'monthly';\n\t}\n\n\tif ( ! empty( $r['limit'] ) ) {\n\t\t$r['limit'] = absint( $r['limit'] );\n\t\t$r['limit'] = ' LIMIT ' . $r['limit'];\n\t}\n\n\t$order = strtoupper( $r['order'] );\n\tif ( $order !== 'ASC' ) {\n\t\t$order = 'DESC';\n\t}\n\n\t// this is what will separate dates on weekly archive links\n\t$archive_week_separator = '&#8211;';\n\n\t// over-ride general date format ? 0 = no: use the date format set in Options, 1 = yes: over-ride\n\t$archive_date_format_over_ride = 0;\n\n\t// options for daily archive (only if you over-ride the general date format)\n\t$archive_day_date_format = 'Y/m/d';\n\n\t// options for weekly archive (only if you over-ride the general date format)\n\t$archive_week_start_date_format = 'Y/m/d';\n\t$archive_week_end_date_format\t= 'Y/m/d';\n\n\tif ( ! $archive_date_format_over_ride ) {\n\t\t$archive_day_date_format = get_option( 'date_format' );\n\t\t$archive_week_start_date_format = get_option( 'date_format' );\n\t\t$archive_week_end_date_format = get_option( 'date_format' );\n\t}\n\n\t$sql_where = $wpdb->prepare( \"WHERE post_type = %s AND post_status = 'publish'\", $r['post_type'] );\n\n\t/**\n\t * Filter the SQL WHERE clause for retrieving archives.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param string $sql_where Portion of SQL query containing the WHERE clause.\n\t * @param array  $r         An array of default arguments.\n\t */\n\t$where = apply_filters( 'getarchives_where', $sql_where, $r );\n\n\t/**\n\t * Filter the SQL JOIN clause for retrieving archives.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param string $sql_join Portion of SQL query containing JOIN clause.\n\t * @param array  $r        An array of default arguments.\n\t */\n\t$join = apply_filters( 'getarchives_join', '', $r );\n\n\t$output = '';\n\n\t$last_changed = wp_cache_get( 'last_changed', 'posts' );\n\tif ( ! $last_changed ) {\n\t\t$last_changed = microtime();\n\t\twp_cache_set( 'last_changed', $last_changed, 'posts' );\n\t}\n\n\t$limit = $r['limit'];\n\n\tif ( 'monthly' == $r['type'] ) {\n\t\t$query = \"SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date $order $limit\";\n\t\t$key = md5( $query );\n\t\t$key = \"wp_get_archives:$key:$last_changed\";\n\t\tif ( ! $results = wp_cache_get( $key, 'posts' ) ) {\n\t\t\t$results = $wpdb->get_results( $query );\n\t\t\twp_cache_set( $key, $results, 'posts' );\n\t\t}\n\t\tif ( $results ) {\n\t\t\t$after = $r['after'];\n\t\t\tforeach ( (array) $results as $result ) {\n\t\t\t\t$url = get_month_link( $result->year, $result->month );\n\t\t\t\tif ( 'post' !== $r['post_type'] ) {\n\t\t\t\t\t$url = add_query_arg( 'post_type', $r['post_type'], $url );\n\t\t\t\t}\n\t\t\t\t/* translators: 1: month name, 2: 4-digit year */\n\t\t\t\t$text = sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $result->month ), $result->year );\n\t\t\t\tif ( $r['show_post_count'] ) {\n\t\t\t\t\t$r['after'] = '&nbsp;(' . $result->posts . ')' . $after;\n\t\t\t\t}\n\t\t\t\t$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] );\n\t\t\t}\n\t\t}\n\t} elseif ( 'yearly' == $r['type'] ) {\n\t\t$query = \"SELECT YEAR(post_date) AS `year`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date) ORDER BY post_date $order $limit\";\n\t\t$key = md5( $query );\n\t\t$key = \"wp_get_archives:$key:$last_changed\";\n\t\tif ( ! $results = wp_cache_get( $key, 'posts' ) ) {\n\t\t\t$results = $wpdb->get_results( $query );\n\t\t\twp_cache_set( $key, $results, 'posts' );\n\t\t}\n\t\tif ( $results ) {\n\t\t\t$after = $r['after'];\n\t\t\tforeach ( (array) $results as $result) {\n\t\t\t\t$url = get_year_link( $result->year );\n\t\t\t\tif ( 'post' !== $r['post_type'] ) {\n\t\t\t\t\t$url = add_query_arg( 'post_type', $r['post_type'], $url );\n\t\t\t\t}\n\t\t\t\t$text = sprintf( '%d', $result->year );\n\t\t\t\tif ( $r['show_post_count'] ) {\n\t\t\t\t\t$r['after'] = '&nbsp;(' . $result->posts . ')' . $after;\n\t\t\t\t}\n\t\t\t\t$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] );\n\t\t\t}\n\t\t}\n\t} elseif ( 'daily' == $r['type'] ) {\n\t\t$query = \"SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, DAYOFMONTH(post_date) AS `dayofmonth`, count(ID) as posts FROM $wpdb->posts $join $where GROUP BY YEAR(post_date), MONTH(post_date), DAYOFMONTH(post_date) ORDER BY post_date $order $limit\";\n\t\t$key = md5( $query );\n\t\t$key = \"wp_get_archives:$key:$last_changed\";\n\t\tif ( ! $results = wp_cache_get( $key, 'posts' ) ) {\n\t\t\t$results = $wpdb->get_results( $query );\n\t\t\twp_cache_set( $key, $results, 'posts' );\n\t\t}\n\t\tif ( $results ) {\n\t\t\t$after = $r['after'];\n\t\t\tforeach ( (array) $results as $result ) {\n\t\t\t\t$url  = get_day_link( $result->year, $result->month, $result->dayofmonth );\n\t\t\t\tif ( 'post' !== $r['post_type'] ) {\n\t\t\t\t\t$url = add_query_arg( 'post_type', $r['post_type'], $url );\n\t\t\t\t}\n\t\t\t\t$date = sprintf( '%1$d-%2$02d-%3$02d 00:00:00', $result->year, $result->month, $result->dayofmonth );\n\t\t\t\t$text = mysql2date( $archive_day_date_format, $date );\n\t\t\t\tif ( $r['show_post_count'] ) {\n\t\t\t\t\t$r['after'] = '&nbsp;(' . $result->posts . ')' . $after;\n\t\t\t\t}\n\t\t\t\t$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] );\n\t\t\t}\n\t\t}\n\t} elseif ( 'weekly' == $r['type'] ) {\n\t\t$week = _wp_mysql_week( '`post_date`' );\n\t\t$query = \"SELECT DISTINCT $week AS `week`, YEAR( `post_date` ) AS `yr`, DATE_FORMAT( `post_date`, '%Y-%m-%d' ) AS `yyyymmdd`, count( `ID` ) AS `posts` FROM `$wpdb->posts` $join $where GROUP BY $week, YEAR( `post_date` ) ORDER BY `post_date` $order $limit\";\n\t\t$key = md5( $query );\n\t\t$key = \"wp_get_archives:$key:$last_changed\";\n\t\tif ( ! $results = wp_cache_get( $key, 'posts' ) ) {\n\t\t\t$results = $wpdb->get_results( $query );\n\t\t\twp_cache_set( $key, $results, 'posts' );\n\t\t}\n\t\t$arc_w_last = '';\n\t\tif ( $results ) {\n\t\t\t$after = $r['after'];\n\t\t\tforeach ( (array) $results as $result ) {\n\t\t\t\tif ( $result->week != $arc_w_last ) {\n\t\t\t\t\t$arc_year       = $result->yr;\n\t\t\t\t\t$arc_w_last     = $result->week;\n\t\t\t\t\t$arc_week       = get_weekstartend( $result->yyyymmdd, get_option( 'start_of_week' ) );\n\t\t\t\t\t$arc_week_start = date_i18n( $archive_week_start_date_format, $arc_week['start'] );\n\t\t\t\t\t$arc_week_end   = date_i18n( $archive_week_end_date_format, $arc_week['end'] );\n\t\t\t\t\t$url            = sprintf( '%1$s/%2$s%3$sm%4$s%5$s%6$sw%7$s%8$d', home_url(), '', '?', '=', $arc_year, '&amp;', '=', $result->week );\n\t\t\t\t\tif ( 'post' !== $r['post_type'] ) {\n\t\t\t\t\t\t$url = add_query_arg( 'post_type', $r['post_type'], $url );\n\t\t\t\t\t}\n\t\t\t\t\t$text           = $arc_week_start . $archive_week_separator . $arc_week_end;\n\t\t\t\t\tif ( $r['show_post_count'] ) {\n\t\t\t\t\t\t$r['after'] = '&nbsp;(' . $result->posts . ')' . $after;\n\t\t\t\t\t}\n\t\t\t\t\t$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} elseif ( ( 'postbypost' == $r['type'] ) || ('alpha' == $r['type'] ) ) {\n\t\t$orderby = ( 'alpha' == $r['type'] ) ? 'post_title ASC ' : 'post_date DESC, ID DESC ';\n\t\t$query = \"SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit\";\n\t\t$key = md5( $query );\n\t\t$key = \"wp_get_archives:$key:$last_changed\";\n\t\tif ( ! $results = wp_cache_get( $key, 'posts' ) ) {\n\t\t\t$results = $wpdb->get_results( $query );\n\t\t\twp_cache_set( $key, $results, 'posts' );\n\t\t}\n\t\tif ( $results ) {\n\t\t\tforeach ( (array) $results as $result ) {\n\t\t\t\tif ( $result->post_date != '0000-00-00 00:00:00' ) {\n\t\t\t\t\t$url = get_permalink( $result );\n\t\t\t\t\tif ( $result->post_title ) {\n\t\t\t\t\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t\t\t\t\t$text = strip_tags( apply_filters( 'the_title', $result->post_title, $result->ID ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$text = $result->ID;\n\t\t\t\t\t}\n\t\t\t\t\t$output .= get_archives_link( $url, $text, $r['format'], $r['before'], $r['after'] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif ( $r['echo'] ) {\n\t\techo $output;\n\t} else {\n\t\treturn $output;\n\t}\n}\n\n/**\n * Get number of days since the start of the week.\n *\n * @since 1.5.0\n *\n * @param int $num Number of day.\n * @return int Days since the start of the week.\n */\nfunction calendar_week_mod($num) {\n\t$base = 7;\n\treturn ($num - $base*floor($num/$base));\n}\n\n/**\n * Display calendar with days that have posts as links.\n *\n * The calendar is cached, which will be retrieved, if it exists. If there are\n * no posts for the month, then it will not be displayed.\n *\n * @since 1.0.0\n *\n * @global wpdb      $wpdb\n * @global int       $m\n * @global int       $monthnum\n * @global int       $year\n * @global WP_Locale $wp_locale\n * @global array     $posts\n *\n * @param bool $initial Optional, default is true. Use initial calendar names.\n * @param bool $echo    Optional, default is true. Set to false for return.\n * @return string|void String when retrieving.\n */\nfunction get_calendar( $initial = true, $echo = true ) {\n\tglobal $wpdb, $m, $monthnum, $year, $wp_locale, $posts;\n\n\t$key = md5( $m . $monthnum . $year );\n\t$cache = wp_cache_get( 'get_calendar', 'calendar' );\n\n\tif ( $cache && is_array( $cache ) && isset( $cache[ $key ] ) ) {\n\t\t/** This filter is documented in wp-includes/general-template.php */\n\t\t$output = apply_filters( 'get_calendar', $cache[ $key ] );\n\n\t\tif ( $echo ) {\n\t\t\techo $output;\n\t\t\treturn;\n\t\t}\n\n\t\treturn $output;\n\t}\n\n\tif ( ! is_array( $cache ) ) {\n\t\t$cache = array();\n\t}\n\n\t// Quick check. If we have no posts at all, abort!\n\tif ( ! $posts ) {\n\t\t$gotsome = $wpdb->get_var(\"SELECT 1 as test FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1\");\n\t\tif ( ! $gotsome ) {\n\t\t\t$cache[ $key ] = '';\n\t\t\twp_cache_set( 'get_calendar', $cache, 'calendar' );\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif ( isset( $_GET['w'] ) ) {\n\t\t$w = (int) $_GET['w'];\n\t}\n\t// week_begins = 0 stands for Sunday\n\t$week_begins = (int) get_option( 'start_of_week' );\n\t$ts = current_time( 'timestamp' );\n\n\t// Let's figure out when we are\n\tif ( ! empty( $monthnum ) && ! empty( $year ) ) {\n\t\t$thismonth = zeroise( intval( $monthnum ), 2 );\n\t\t$thisyear = (int) $year;\n\t} elseif ( ! empty( $w ) ) {\n\t\t// We need to get the month from MySQL\n\t\t$thisyear = (int) substr( $m, 0, 4 );\n\t\t//it seems MySQL's weeks disagree with PHP's\n\t\t$d = ( ( $w - 1 ) * 7 ) + 6;\n\t\t$thismonth = $wpdb->get_var(\"SELECT DATE_FORMAT((DATE_ADD('{$thisyear}0101', INTERVAL $d DAY) ), '%m')\");\n\t} elseif ( ! empty( $m ) ) {\n\t\t$thisyear = (int) substr( $m, 0, 4 );\n\t\tif ( strlen( $m ) < 6 ) {\n\t\t\t$thismonth = '01';\n\t\t} else {\n\t\t\t$thismonth = zeroise( (int) substr( $m, 4, 2 ), 2 );\n\t\t}\n\t} else {\n\t\t$thisyear = gmdate( 'Y', $ts );\n\t\t$thismonth = gmdate( 'm', $ts );\n\t}\n\n\t$unixmonth = mktime( 0, 0 , 0, $thismonth, 1, $thisyear );\n\t$last_day = date( 't', $unixmonth );\n\n\t// Get the next and previous month and year with at least one post\n\t$previous = $wpdb->get_row(\"SELECT MONTH(post_date) AS month, YEAR(post_date) AS year\n\t\tFROM $wpdb->posts\n\t\tWHERE post_date < '$thisyear-$thismonth-01'\n\t\tAND post_type = 'post' AND post_status = 'publish'\n\t\t\tORDER BY post_date DESC\n\t\t\tLIMIT 1\");\n\t$next = $wpdb->get_row(\"SELECT MONTH(post_date) AS month, YEAR(post_date) AS year\n\t\tFROM $wpdb->posts\n\t\tWHERE post_date > '$thisyear-$thismonth-{$last_day} 23:59:59'\n\t\tAND post_type = 'post' AND post_status = 'publish'\n\t\t\tORDER BY post_date ASC\n\t\t\tLIMIT 1\");\n\n\t/* translators: Calendar caption: 1: month name, 2: 4-digit year */\n\t$calendar_caption = _x('%1$s %2$s', 'calendar caption');\n\t$calendar_output = '<table id=\"wp-calendar\">\n\t<caption>' . sprintf(\n\t\t$calendar_caption,\n\t\t$wp_locale->get_month( $thismonth ),\n\t\tdate( 'Y', $unixmonth )\n\t) . '</caption>\n\t<thead>\n\t<tr>';\n\n\t$myweek = array();\n\n\tfor ( $wdcount = 0; $wdcount <= 6; $wdcount++ ) {\n\t\t$myweek[] = $wp_locale->get_weekday( ( $wdcount + $week_begins ) % 7 );\n\t}\n\n\tforeach ( $myweek as $wd ) {\n\t\t$day_name = $initial ? $wp_locale->get_weekday_initial( $wd ) : $wp_locale->get_weekday_abbrev( $wd );\n\t\t$wd = esc_attr( $wd );\n\t\t$calendar_output .= \"\\n\\t\\t<th scope=\\\"col\\\" title=\\\"$wd\\\">$day_name</th>\";\n\t}\n\n\t$calendar_output .= '\n\t</tr>\n\t</thead>\n\n\t<tfoot>\n\t<tr>';\n\n\tif ( $previous ) {\n\t\t$calendar_output .= \"\\n\\t\\t\".'<td colspan=\"3\" id=\"prev\"><a href=\"' . get_month_link( $previous->year, $previous->month ) . '\">&laquo; ' .\n\t\t\t$wp_locale->get_month_abbrev( $wp_locale->get_month( $previous->month ) ) .\n\t\t'</a></td>';\n\t} else {\n\t\t$calendar_output .= \"\\n\\t\\t\".'<td colspan=\"3\" id=\"prev\" class=\"pad\">&nbsp;</td>';\n\t}\n\n\t$calendar_output .= \"\\n\\t\\t\".'<td class=\"pad\">&nbsp;</td>';\n\n\tif ( $next ) {\n\t\t$calendar_output .= \"\\n\\t\\t\".'<td colspan=\"3\" id=\"next\"><a href=\"' . get_month_link( $next->year, $next->month ) . '\">' .\n\t\t\t$wp_locale->get_month_abbrev( $wp_locale->get_month( $next->month ) ) .\n\t\t' &raquo;</a></td>';\n\t} else {\n\t\t$calendar_output .= \"\\n\\t\\t\".'<td colspan=\"3\" id=\"next\" class=\"pad\">&nbsp;</td>';\n\t}\n\n\t$calendar_output .= '\n\t</tr>\n\t</tfoot>\n\n\t<tbody>\n\t<tr>';\n\n\t$daywithpost = array();\n\n\t// Get days with posts\n\t$dayswithposts = $wpdb->get_results(\"SELECT DISTINCT DAYOFMONTH(post_date)\n\t\tFROM $wpdb->posts WHERE post_date >= '{$thisyear}-{$thismonth}-01 00:00:00'\n\t\tAND post_type = 'post' AND post_status = 'publish'\n\t\tAND post_date <= '{$thisyear}-{$thismonth}-{$last_day} 23:59:59'\", ARRAY_N);\n\tif ( $dayswithposts ) {\n\t\tforeach ( (array) $dayswithposts as $daywith ) {\n\t\t\t$daywithpost[] = $daywith[0];\n\t\t}\n\t}\n\n\t// See how much we should pad in the beginning\n\t$pad = calendar_week_mod( date( 'w', $unixmonth ) - $week_begins );\n\tif ( 0 != $pad ) {\n\t\t$calendar_output .= \"\\n\\t\\t\".'<td colspan=\"'. esc_attr( $pad ) .'\" class=\"pad\">&nbsp;</td>';\n\t}\n\n\t$newrow = false;\n\t$daysinmonth = (int) date( 't', $unixmonth );\n\n\tfor ( $day = 1; $day <= $daysinmonth; ++$day ) {\n\t\tif ( isset($newrow) && $newrow ) {\n\t\t\t$calendar_output .= \"\\n\\t</tr>\\n\\t<tr>\\n\\t\\t\";\n\t\t}\n\t\t$newrow = false;\n\n\t\tif ( $day == gmdate( 'j', $ts ) &&\n\t\t\t$thismonth == gmdate( 'm', $ts ) &&\n\t\t\t$thisyear == gmdate( 'Y', $ts ) ) {\n\t\t\t$calendar_output .= '<td id=\"today\">';\n\t\t} else {\n\t\t\t$calendar_output .= '<td>';\n\t\t}\n\n\t\tif ( in_array( $day, $daywithpost ) ) {\n\t\t\t// any posts today?\n\t\t\t$date_format = date( _x( 'F j, Y', 'daily archives date format' ), strtotime( \"{$thisyear}-{$thismonth}-{$day}\" ) );\n\t\t\t$label = sprintf( __( 'Posts published on %s' ), $date_format );\n\t\t\t$calendar_output .= sprintf(\n\t\t\t\t'<a href=\"%s\" aria-label=\"%s\">%s</a>',\n\t\t\t\tget_day_link( $thisyear, $thismonth, $day ),\n\t\t\t\tesc_attr( $label ),\n\t\t\t\t$day\n\t\t\t);\n\t\t} else {\n\t\t\t$calendar_output .= $day;\n\t\t}\n\t\t$calendar_output .= '</td>';\n\n\t\tif ( 6 == calendar_week_mod( date( 'w', mktime(0, 0 , 0, $thismonth, $day, $thisyear ) ) - $week_begins ) ) {\n\t\t\t$newrow = true;\n\t\t}\n\t}\n\n\t$pad = 7 - calendar_week_mod( date( 'w', mktime( 0, 0 , 0, $thismonth, $day, $thisyear ) ) - $week_begins );\n\tif ( $pad != 0 && $pad != 7 ) {\n\t\t$calendar_output .= \"\\n\\t\\t\".'<td class=\"pad\" colspan=\"'. esc_attr( $pad ) .'\">&nbsp;</td>';\n\t}\n\t$calendar_output .= \"\\n\\t</tr>\\n\\t</tbody>\\n\\t</table>\";\n\n\t$cache[ $key ] = $calendar_output;\n\twp_cache_set( 'get_calendar', $cache, 'calendar' );\n\n\tif ( $echo ) {\n\t\t/**\n\t\t * Filter the HTML calendar output.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $calendar_output HTML output of the calendar.\n\t\t */\n\t\techo apply_filters( 'get_calendar', $calendar_output );\n\t\treturn;\n\t}\n\t/** This filter is documented in wp-includes/general-template.php */\n\treturn apply_filters( 'get_calendar', $calendar_output );\n}\n\n/**\n * Purge the cached results of get_calendar.\n *\n * @see get_calendar\n * @since 2.1.0\n */\nfunction delete_get_calendar_cache() {\n\twp_cache_delete( 'get_calendar', 'calendar' );\n}\n\n/**\n * Display all of the allowed tags in HTML format with attributes.\n *\n * This is useful for displaying in the comment area, which elements and\n * attributes are supported. As well as any plugins which want to display it.\n *\n * @since 1.0.1\n *\n * @global array $allowedtags\n *\n * @return string HTML allowed tags entity encoded.\n */\nfunction allowed_tags() {\n\tglobal $allowedtags;\n\t$allowed = '';\n\tforeach ( (array) $allowedtags as $tag => $attributes ) {\n\t\t$allowed .= '<'.$tag;\n\t\tif ( 0 < count($attributes) ) {\n\t\t\tforeach ( $attributes as $attribute => $limits ) {\n\t\t\t\t$allowed .= ' '.$attribute.'=\"\"';\n\t\t\t}\n\t\t}\n\t\t$allowed .= '> ';\n\t}\n\treturn htmlentities( $allowed );\n}\n\n/***** Date/Time tags *****/\n\n/**\n * Outputs the date in iso8601 format for xml files.\n *\n * @since 1.0.0\n */\nfunction the_date_xml() {\n\techo mysql2date( 'Y-m-d', get_post()->post_date, false );\n}\n\n/**\n * Display or Retrieve the date the current post was written (once per date)\n *\n * Will only output the date if the current post's date is different from the\n * previous one output.\n *\n * i.e. Only one date listing will show per day worth of posts shown in the loop, even if the\n * function is called several times for each post.\n *\n * HTML output can be filtered with 'the_date'.\n * Date string output can be filtered with 'get_the_date'.\n *\n * @since 0.71\n *\n * @global string|int|bool $currentday\n * @global string|int|bool $previousday\n *\n * @param string $d      Optional. PHP date format defaults to the date_format option if not specified.\n * @param string $before Optional. Output before the date.\n * @param string $after  Optional. Output after the date.\n * @param bool   $echo   Optional, default is display. Whether to echo the date or return it.\n * @return string|void String if retrieving.\n */\nfunction the_date( $d = '', $before = '', $after = '', $echo = true ) {\n\tglobal $currentday, $previousday;\n\n\tif ( is_new_day() ) {\n\t\t$the_date = $before . get_the_date( $d ) . $after;\n\t\t$previousday = $currentday;\n\n\t\t/**\n\t\t * Filter the date a post was published for display.\n\t\t *\n\t\t * @since 0.71\n\t\t *\n\t\t * @param string $the_date The formatted date string.\n\t\t * @param string $d        PHP date format. Defaults to 'date_format' option\n\t\t *                         if not specified.\n\t\t * @param string $before   HTML output before the date.\n\t\t * @param string $after    HTML output after the date.\n\t\t */\n\t\t$the_date = apply_filters( 'the_date', $the_date, $d, $before, $after );\n\n\t\tif ( $echo )\n\t\t\techo $the_date;\n\t\telse\n\t\t\treturn $the_date;\n\t}\n}\n\n/**\n * Retrieve the date on which the post was written.\n *\n * Unlike the_date() this function will always return the date.\n * Modify output with 'get_the_date' filter.\n *\n * @since 3.0.0\n *\n * @param  string      $d    Optional. PHP date format defaults to the date_format option if not specified.\n * @param  int|WP_Post $post Optional. Post ID or WP_Post object. Default current post.\n * @return false|string Date the current post was written. False on failure.\n */\nfunction get_the_date( $d = '', $post = null ) {\n\t$post = get_post( $post );\n\n\tif ( ! $post ) {\n\t\treturn false;\n\t}\n\n\tif ( '' == $d ) {\n\t\t$the_date = mysql2date( get_option( 'date_format' ), $post->post_date );\n\t} else {\n\t\t$the_date = mysql2date( $d, $post->post_date );\n\t}\n\n\t/**\n\t * Filter the date a post was published.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string      $the_date The formatted date.\n\t * @param string      $d        PHP date format. Defaults to 'date_format' option\n\t *                              if not specified.\n\t * @param int|WP_Post $post     The post object or ID.\n\t */\n\treturn apply_filters( 'get_the_date', $the_date, $d, $post );\n}\n\n/**\n * Display the date on which the post was last modified.\n *\n * @since 2.1.0\n *\n * @param string $d      Optional. PHP date format defaults to the date_format option if not specified.\n * @param string $before Optional. Output before the date.\n * @param string $after  Optional. Output after the date.\n * @param bool   $echo   Optional, default is display. Whether to echo the date or return it.\n * @return string|void String if retrieving.\n */\nfunction the_modified_date( $d = '', $before = '', $after = '', $echo = true ) {\n\t$the_modified_date = $before . get_the_modified_date($d) . $after;\n\n\t/**\n\t * Filter the date a post was last modified for display.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $the_modified_date The last modified date.\n\t * @param string $d                 PHP date format. Defaults to 'date_format' option\n\t *                                  if not specified.\n\t * @param string $before            HTML output before the date.\n\t * @param string $after             HTML output after the date.\n\t */\n\t$the_modified_date = apply_filters( 'the_modified_date', $the_modified_date, $d, $before, $after );\n\n\tif ( $echo )\n\t\techo $the_modified_date;\n\telse\n\t\treturn $the_modified_date;\n\n}\n\n/**\n * Retrieve the date on which the post was last modified.\n *\n * @since 2.1.0\n *\n * @param string $d Optional. PHP date format. Defaults to the \"date_format\" option\n * @return string\n */\nfunction get_the_modified_date($d = '') {\n\tif ( '' == $d )\n\t\t$the_time = get_post_modified_time(get_option('date_format'), null, null, true);\n\telse\n\t\t$the_time = get_post_modified_time($d, null, null, true);\n\n\t/**\n\t * Filter the date a post was last modified.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $the_time The formatted date.\n\t * @param string $d        PHP date format. Defaults to value specified in\n\t *                         'date_format' option.\n\t */\n\treturn apply_filters( 'get_the_modified_date', $the_time, $d );\n}\n\n/**\n * Display the time at which the post was written.\n *\n * @since 0.71\n *\n * @param string $d Either 'G', 'U', or php date format.\n */\nfunction the_time( $d = '' ) {\n\t/**\n\t * Filter the time a post was written for display.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $get_the_time The formatted time.\n\t * @param string $d            The time format. Accepts 'G', 'U',\n\t *                             or php date format.\n\t */\n\techo apply_filters( 'the_time', get_the_time( $d ), $d );\n}\n\n/**\n * Retrieve the time at which the post was written.\n *\n * @since 1.5.0\n *\n * @param string      $d    Optional. Format to use for retrieving the time the post\n *                          was written. Either 'G', 'U', or php date format defaults\n *                          to the value specified in the time_format option. Default empty.\n * @param int|WP_Post $post WP_Post object or ID. Default is global $post object.\n * @return false|string Formatted date string or Unix timestamp. False on failure.\n */\nfunction get_the_time( $d = '', $post = null ) {\n\t$post = get_post($post);\n\n\tif ( ! $post ) {\n\t\treturn false;\n\t}\n\n\tif ( '' == $d )\n\t\t$the_time = get_post_time(get_option('time_format'), false, $post, true);\n\telse\n\t\t$the_time = get_post_time($d, false, $post, true);\n\n\t/**\n\t * Filter the time a post was written.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string      $the_time The formatted time.\n\t * @param string      $d        Format to use for retrieving the time the post was written.\n\t *                              Accepts 'G', 'U', or php date format value specified\n\t *                              in 'time_format' option. Default empty.\n\t * @param int|WP_Post $post     WP_Post object or ID.\n\t */\n\treturn apply_filters( 'get_the_time', $the_time, $d, $post );\n}\n\n/**\n * Retrieve the time at which the post was written.\n *\n * @since 2.0.0\n *\n * @param string      $d         Optional. Format to use for retrieving the time the post\n *                               was written. Either 'G', 'U', or php date format. Default 'U'.\n * @param bool        $gmt       Optional. Whether to retrieve the GMT time. Default false.\n * @param int|WP_Post $post      WP_Post object or ID. Default is global $post object.\n * @param bool        $translate Whether to translate the time string. Default false.\n * @return false|string|int Formatted date string or Unix timestamp. False on failure.\n */\nfunction get_post_time( $d = 'U', $gmt = false, $post = null, $translate = false ) {\n\t$post = get_post($post);\n\n\tif ( ! $post ) {\n\t\treturn false;\n\t}\n\n\tif ( $gmt )\n\t\t$time = $post->post_date_gmt;\n\telse\n\t\t$time = $post->post_date;\n\n\t$time = mysql2date($d, $time, $translate);\n\n\t/**\n\t * Filter the localized time a post was written.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string $time The formatted time.\n\t * @param string $d    Format to use for retrieving the time the post was written.\n\t *                     Accepts 'G', 'U', or php date format. Default 'U'.\n\t * @param bool   $gmt  Whether to retrieve the GMT time. Default false.\n\t */\n\treturn apply_filters( 'get_post_time', $time, $d, $gmt );\n}\n\n/**\n * Display the time at which the post was last modified.\n *\n * @since 2.0.0\n *\n * @param string $d Optional Either 'G', 'U', or php date format defaults to the value specified in the time_format option.\n */\nfunction the_modified_time($d = '') {\n\t/**\n\t * Filter the localized time a post was last modified, for display.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param string $get_the_modified_time The formatted time.\n\t * @param string $d                     The time format. Accepts 'G', 'U',\n\t *                                      or php date format. Defaults to value\n\t *                                      specified in 'time_format' option.\n\t */\n\techo apply_filters( 'the_modified_time', get_the_modified_time($d), $d );\n}\n\n/**\n * Retrieve the time at which the post was last modified.\n *\n * @since 2.0.0\n *\n * @param string $d Optional Either 'G', 'U', or php date format defaults to the value specified in the time_format option.\n * @return string\n */\nfunction get_the_modified_time($d = '') {\n\tif ( '' == $d )\n\t\t$the_time = get_post_modified_time(get_option('time_format'), null, null, true);\n\telse\n\t\t$the_time = get_post_modified_time($d, null, null, true);\n\n\t/**\n\t * Filter the localized time a post was last modified.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param string $the_time The formatted time.\n\t * @param string $d        Format to use for retrieving the time the post was\n\t *                         written. Accepts 'G', 'U', or php date format. Defaults\n\t *                         to value specified in 'time_format' option.\n\t */\n\treturn apply_filters( 'get_the_modified_time', $the_time, $d );\n}\n\n/**\n * Retrieve the time at which the post was last modified.\n *\n * @since 2.0.0\n *\n * @param string      $d         Optional. Format to use for retrieving the time the post\n *                               was modified. Either 'G', 'U', or php date format. Default 'U'.\n * @param bool        $gmt       Optional. Whether to retrieve the GMT time. Default false.\n * @param int|WP_Post $post      WP_Post object or ID. Default is global $post object.\n * @param bool        $translate Whether to translate the time string. Default false.\n * @return false|string Formatted date string or Unix timestamp. False on failure.\n */\nfunction get_post_modified_time( $d = 'U', $gmt = false, $post = null, $translate = false ) {\n\t$post = get_post($post);\n\n\tif ( ! $post ) {\n\t\treturn false;\n\t}\n\n\tif ( $gmt )\n\t\t$time = $post->post_modified_gmt;\n\telse\n\t\t$time = $post->post_modified;\n\t$time = mysql2date($d, $time, $translate);\n\n\t/**\n\t * Filter the localized time a post was last modified.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $time The formatted time.\n\t * @param string $d    The date format. Accepts 'G', 'U', or php date format. Default 'U'.\n\t * @param bool   $gmt  Whether to return the GMT time. Default false.\n\t */\n\treturn apply_filters( 'get_post_modified_time', $time, $d, $gmt );\n}\n\n/**\n * Display the weekday on which the post was written.\n *\n * @since 0.71\n *\n * @global WP_Locale $wp_locale\n */\nfunction the_weekday() {\n\tglobal $wp_locale;\n\t$the_weekday = $wp_locale->get_weekday( mysql2date( 'w', get_post()->post_date, false ) );\n\n\t/**\n\t * Filter the weekday on which the post was written, for display.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $the_weekday\n\t */\n\techo apply_filters( 'the_weekday', $the_weekday );\n}\n\n/**\n * Display the weekday on which the post was written.\n *\n * Will only output the weekday if the current post's weekday is different from\n * the previous one output.\n *\n * @since 0.71\n *\n * @global WP_Locale       $wp_locale\n * @global string|int|bool $currentday\n * @global string|int|bool $previousweekday\n *\n * @param string $before Optional Output before the date.\n * @param string $after Optional Output after the date.\n */\nfunction the_weekday_date($before='',$after='') {\n\tglobal $wp_locale, $currentday, $previousweekday;\n\t$the_weekday_date = '';\n\tif ( $currentday != $previousweekday ) {\n\t\t$the_weekday_date .= $before;\n\t\t$the_weekday_date .= $wp_locale->get_weekday( mysql2date( 'w', get_post()->post_date, false ) );\n\t\t$the_weekday_date .= $after;\n\t\t$previousweekday = $currentday;\n\t}\n\n\t/**\n\t * Filter the localized date on which the post was written, for display.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $the_weekday_date\n\t * @param string $before           The HTML to output before the date.\n\t * @param string $after            The HTML to output after the date.\n\t */\n\t$the_weekday_date = apply_filters( 'the_weekday_date', $the_weekday_date, $before, $after );\n\techo $the_weekday_date;\n}\n\n/**\n * Fire the wp_head action\n *\n * @since 1.2.0\n */\nfunction wp_head() {\n\t/**\n\t * Print scripts or data in the head tag on the front end.\n\t *\n\t * @since 1.5.0\n\t */\n\tdo_action( 'wp_head' );\n}\n\n/**\n * Fire the wp_footer action\n *\n * @since 1.5.1\n */\nfunction wp_footer() {\n\t/**\n\t * Print scripts or data before the closing body tag on the front end.\n\t *\n\t * @since 1.5.1\n\t */\n\tdo_action( 'wp_footer' );\n}\n\n/**\n * Display the links to the general feeds.\n *\n * @since 2.8.0\n *\n * @param array $args Optional arguments.\n */\nfunction feed_links( $args = array() ) {\n\tif ( !current_theme_supports('automatic-feed-links') )\n\t\treturn;\n\n\t$defaults = array(\n\t\t/* translators: Separator between blog name and feed type in feed links */\n\t\t'separator'\t=> _x('&raquo;', 'feed link'),\n\t\t/* translators: 1: blog title, 2: separator (raquo) */\n\t\t'feedtitle'\t=> __('%1$s %2$s Feed'),\n\t\t/* translators: 1: blog title, 2: separator (raquo) */\n\t\t'comstitle'\t=> __('%1$s %2$s Comments Feed'),\n\t);\n\n\t$args = wp_parse_args( $args, $defaults );\n\n\t/**\n\t * Filter whether to display the posts feed link.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param bool $show Whether to display the posts feed link. Default true.\n\t */\n\tif ( apply_filters( 'feed_links_show_posts_feed', true ) ) {\n\t\techo '<link rel=\"alternate\" type=\"' . feed_content_type() . '\" title=\"' . esc_attr( sprintf( $args['feedtitle'], get_bloginfo( 'name' ), $args['separator'] ) ) . '\" href=\"' . esc_url( get_feed_link() ) . \"\\\" />\\n\";\n\t}\n\n\t/**\n\t * Filter whether to display the comments feed link.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param bool $show Whether to display the comments feed link. Default true.\n\t */\n\tif ( apply_filters( 'feed_links_show_comments_feed', true ) ) {\n\t\techo '<link rel=\"alternate\" type=\"' . feed_content_type() . '\" title=\"' . esc_attr( sprintf( $args['comstitle'], get_bloginfo( 'name' ), $args['separator'] ) ) . '\" href=\"' . esc_url( get_feed_link( 'comments_' . get_default_feed() ) ) . \"\\\" />\\n\";\n\t}\n}\n\n/**\n * Display the links to the extra feeds such as category feeds.\n *\n * @since 2.8.0\n *\n * @param array $args Optional arguments.\n */\nfunction feed_links_extra( $args = array() ) {\n\t$defaults = array(\n\t\t/* translators: Separator between blog name and feed type in feed links */\n\t\t'separator'   => _x('&raquo;', 'feed link'),\n\t\t/* translators: 1: blog name, 2: separator(raquo), 3: post title */\n\t\t'singletitle' => __('%1$s %2$s %3$s Comments Feed'),\n\t\t/* translators: 1: blog name, 2: separator(raquo), 3: category name */\n\t\t'cattitle'    => __('%1$s %2$s %3$s Category Feed'),\n\t\t/* translators: 1: blog name, 2: separator(raquo), 3: tag name */\n\t\t'tagtitle'    => __('%1$s %2$s %3$s Tag Feed'),\n\t\t/* translators: 1: blog name, 2: separator(raquo), 3: author name  */\n\t\t'authortitle' => __('%1$s %2$s Posts by %3$s Feed'),\n\t\t/* translators: 1: blog name, 2: separator(raquo), 3: search phrase */\n\t\t'searchtitle' => __('%1$s %2$s Search Results for &#8220;%3$s&#8221; Feed'),\n\t\t/* translators: 1: blog name, 2: separator(raquo), 3: post type name */\n\t\t'posttypetitle' => __('%1$s %2$s %3$s Feed'),\n\t);\n\n\t$args = wp_parse_args( $args, $defaults );\n\n\tif ( is_singular() ) {\n\t\t$id = 0;\n\t\t$post = get_post( $id );\n\n\t\tif ( comments_open() || pings_open() || $post->comment_count > 0 ) {\n\t\t\t$title = sprintf( $args['singletitle'], get_bloginfo('name'), $args['separator'], the_title_attribute( array( 'echo' => false ) ) );\n\t\t\t$href = get_post_comments_feed_link( $post->ID );\n\t\t}\n\t} elseif ( is_post_type_archive() ) {\n\t\t$post_type = get_query_var( 'post_type' );\n\t\tif ( is_array( $post_type ) )\n\t\t\t$post_type = reset( $post_type );\n\n\t\t$post_type_obj = get_post_type_object( $post_type );\n\t\t$title = sprintf( $args['posttypetitle'], get_bloginfo( 'name' ), $args['separator'], $post_type_obj->labels->name );\n\t\t$href = get_post_type_archive_feed_link( $post_type_obj->name );\n\t} elseif ( is_category() ) {\n\t\t$term = get_queried_object();\n\n\t\tif ( $term ) {\n\t\t\t$title = sprintf( $args['cattitle'], get_bloginfo('name'), $args['separator'], $term->name );\n\t\t\t$href = get_category_feed_link( $term->term_id );\n\t\t}\n\t} elseif ( is_tag() ) {\n\t\t$term = get_queried_object();\n\n\t\tif ( $term ) {\n\t\t\t$title = sprintf( $args['tagtitle'], get_bloginfo('name'), $args['separator'], $term->name );\n\t\t\t$href = get_tag_feed_link( $term->term_id );\n\t\t}\n\t} elseif ( is_author() ) {\n\t\t$author_id = intval( get_query_var('author') );\n\n\t\t$title = sprintf( $args['authortitle'], get_bloginfo('name'), $args['separator'], get_the_author_meta( 'display_name', $author_id ) );\n\t\t$href = get_author_feed_link( $author_id );\n\t} elseif ( is_search() ) {\n\t\t$title = sprintf( $args['searchtitle'], get_bloginfo('name'), $args['separator'], get_search_query( false ) );\n\t\t$href = get_search_feed_link();\n\t} elseif ( is_post_type_archive() ) {\n\t\t$title = sprintf( $args['posttypetitle'], get_bloginfo('name'), $args['separator'], post_type_archive_title( '', false ) );\n\t\t$post_type_obj = get_queried_object();\n\t\tif ( $post_type_obj )\n\t\t\t$href = get_post_type_archive_feed_link( $post_type_obj->name );\n\t}\n\n\tif ( isset($title) && isset($href) )\n\t\techo '<link rel=\"alternate\" type=\"' . feed_content_type() . '\" title=\"' . esc_attr( $title ) . '\" href=\"' . esc_url( $href ) . '\" />' . \"\\n\";\n}\n\n/**\n * Display the link to the Really Simple Discovery service endpoint.\n *\n * @link http://archipelago.phrasewise.com/rsd\n * @since 2.0.0\n */\nfunction rsd_link() {\n\techo '<link rel=\"EditURI\" type=\"application/rsd+xml\" title=\"RSD\" href=\"' . esc_url( site_url( 'xmlrpc.php?rsd', 'rpc' ) ) . '\" />' . \"\\n\";\n}\n\n/**\n * Display the link to the Windows Live Writer manifest file.\n *\n * @link http://msdn.microsoft.com/en-us/library/bb463265.aspx\n * @since 2.3.1\n */\nfunction wlwmanifest_link() {\n\techo '<link rel=\"wlwmanifest\" type=\"application/wlwmanifest+xml\" href=\"',\n\t\tincludes_url( 'wlwmanifest.xml' ), '\" /> ', \"\\n\";\n}\n\n/**\n * Display a noindex meta tag if required by the blog configuration.\n *\n * If a blog is marked as not being public then the noindex meta tag will be\n * output to tell web robots not to index the page content. Add this to the wp_head action.\n * Typical usage is as a wp_head callback. add_action( 'wp_head', 'noindex' );\n *\n * @see wp_no_robots\n *\n * @since 2.1.0\n */\nfunction noindex() {\n\t// If the blog is not public, tell robots to go away.\n\tif ( '0' == get_option('blog_public') )\n\t\twp_no_robots();\n}\n\n/**\n * Display a noindex meta tag.\n *\n * Outputs a noindex meta tag that tells web robots not to index the page content.\n * Typical usage is as a wp_head callback. add_action( 'wp_head', 'wp_no_robots' );\n *\n * @since 3.3.0\n */\nfunction wp_no_robots() {\n\techo \"<meta name='robots' content='noindex,follow' />\\n\";\n}\n\n/**\n * Display site icon meta tags.\n *\n * @since 4.3.0\n *\n * @link http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#rel-icon HTML5 specification link icon.\n */\nfunction wp_site_icon() {\n\tif ( ! has_site_icon() && ! is_customize_preview() ) {\n\t\treturn;\n\t}\n\n\t$meta_tags = array(\n\t\tsprintf( '<link rel=\"icon\" href=\"%s\" sizes=\"32x32\" />', esc_url( get_site_icon_url( 32 ) ) ),\n\t\tsprintf( '<link rel=\"icon\" href=\"%s\" sizes=\"192x192\" />', esc_url( get_site_icon_url( 192 ) ) ),\n\t\tsprintf( '<link rel=\"apple-touch-icon-precomposed\" href=\"%s\" />', esc_url( get_site_icon_url( 180 ) ) ),\n\t\tsprintf( '<meta name=\"msapplication-TileImage\" content=\"%s\" />', esc_url( get_site_icon_url( 270 ) ) ),\n\t);\n\n\t/**\n\t * Filter the site icon meta tags, so Plugins can add their own.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param array $meta_tags Site Icon meta elements.\n\t */\n\t$meta_tags = apply_filters( 'site_icon_meta_tags', $meta_tags );\n\t$meta_tags = array_filter( $meta_tags );\n\n\tforeach ( $meta_tags as $meta_tag ) {\n\t\techo \"$meta_tag\\n\";\n\t}\n}\n\n/**\n * Whether the user should have a WYSIWIG editor.\n *\n * Checks that the user requires a WYSIWIG editor and that the editor is\n * supported in the users browser.\n *\n * @since 2.0.0\n *\n * @global bool $wp_rich_edit\n * @global bool $is_gecko\n * @global bool $is_opera\n * @global bool $is_safari\n * @global bool $is_chrome\n * @global bool $is_IE\n *\n * @return bool\n */\nfunction user_can_richedit() {\n\tglobal $wp_rich_edit, $is_gecko, $is_opera, $is_safari, $is_chrome, $is_IE, $is_edge;\n\n\tif ( !isset($wp_rich_edit) ) {\n\t\t$wp_rich_edit = false;\n\n\t\tif ( get_user_option( 'rich_editing' ) == 'true' || ! is_user_logged_in() ) { // default to 'true' for logged out users\n\t\t\tif ( $is_safari ) {\n\t\t\t\t$wp_rich_edit = ! wp_is_mobile() || ( preg_match( '!AppleWebKit/(\\d+)!', $_SERVER['HTTP_USER_AGENT'], $match ) && intval( $match[1] ) >= 534 );\n\t\t\t} elseif ( $is_gecko || $is_chrome || $is_IE || $is_edge || ( $is_opera && !wp_is_mobile() ) ) {\n\t\t\t\t$wp_rich_edit = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter whether the user can access the rich (Visual) editor.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param bool $wp_rich_edit Whether the user can access to the rich (Visual) editor.\n\t */\n\treturn apply_filters( 'user_can_richedit', $wp_rich_edit );\n}\n\n/**\n * Find out which editor should be displayed by default.\n *\n * Works out which of the two editors to display as the current editor for a\n * user. The 'html' setting is for the \"Text\" editor tab.\n *\n * @since 2.5.0\n *\n * @return string Either 'tinymce', or 'html', or 'test'\n */\nfunction wp_default_editor() {\n\t$r = user_can_richedit() ? 'tinymce' : 'html'; // defaults\n\tif ( wp_get_current_user() ) { // look for cookie\n\t\t$ed = get_user_setting('editor', 'tinymce');\n\t\t$r = ( in_array($ed, array('tinymce', 'html', 'test') ) ) ? $ed : $r;\n\t}\n\n\t/**\n\t * Filter which editor should be displayed by default.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array $r An array of editors. Accepts 'tinymce', 'html', 'test'.\n\t */\n\treturn apply_filters( 'wp_default_editor', $r );\n}\n\n/**\n * Renders an editor.\n *\n * Using this function is the proper way to output all needed components for both TinyMCE and Quicktags.\n * _WP_Editors should not be used directly. See https://core.trac.wordpress.org/ticket/17144.\n *\n * NOTE: Once initialized the TinyMCE editor cannot be safely moved in the DOM. For that reason\n * running wp_editor() inside of a metabox is not a good idea unless only Quicktags is used.\n * On the post edit screen several actions can be used to include additional editors\n * containing TinyMCE: 'edit_page_form', 'edit_form_advanced' and 'dbx_post_sidebar'.\n * See https://core.trac.wordpress.org/ticket/19173 for more information.\n *\n * @see wp-includes/class-wp-editor.php\n * @since 3.3.0\n *\n * @param string $content   Initial content for the editor.\n * @param string $editor_id HTML ID attribute value for the textarea and TinyMCE. Can only be /[a-z]+/.\n * @param array  $settings  See _WP_Editors::editor().\n */\nfunction wp_editor( $content, $editor_id, $settings = array() ) {\n\tif ( ! class_exists( '_WP_Editors', false ) )\n\t\trequire( ABSPATH . WPINC . '/class-wp-editor.php' );\n\n\t_WP_Editors::editor($content, $editor_id, $settings);\n}\n\n/**\n * Retrieve the contents of the search WordPress query variable.\n *\n * The search query string is passed through {@link esc_attr()}\n * to ensure that it is safe for placing in an html attribute.\n *\n * @since 2.3.0\n *\n * @param bool $escaped Whether the result is escaped. Default true.\n * \t                    Only use when you are later escaping it. Do not use unescaped.\n * @return string\n */\nfunction get_search_query( $escaped = true ) {\n\t/**\n\t * Filter the contents of the search query variable.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param mixed $search Contents of the search query variable.\n\t */\n\t$query = apply_filters( 'get_search_query', get_query_var( 's' ) );\n\n\tif ( $escaped )\n\t\t$query = esc_attr( $query );\n\treturn $query;\n}\n\n/**\n * Display the contents of the search query variable.\n *\n * The search query string is passed through {@link esc_attr()}\n * to ensure that it is safe for placing in an html attribute.\n *\n * @since 2.1.0\n */\nfunction the_search_query() {\n\t/**\n\t * Filter the contents of the search query variable for display.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param mixed $search Contents of the search query variable.\n\t */\n\techo esc_attr( apply_filters( 'the_search_query', get_search_query( false ) ) );\n}\n\n/**\n * Gets the language attributes for the html tag.\n *\n * Builds up a set of html attributes containing the text direction and language\n * information for the page.\n *\n * @since 4.3.0\n *\n * @param string $doctype Optional. The type of html document. Accepts 'xhtml' or 'html'. Default 'html'.\n */\nfunction get_language_attributes( $doctype = 'html' ) {\n\t$attributes = array();\n\n\tif ( function_exists( 'is_rtl' ) && is_rtl() )\n\t\t$attributes[] = 'dir=\"rtl\"';\n\n\tif ( $lang = get_bloginfo('language') ) {\n\t\tif ( get_option('html_type') == 'text/html' || $doctype == 'html' )\n\t\t\t$attributes[] = \"lang=\\\"$lang\\\"\";\n\n\t\tif ( get_option('html_type') != 'text/html' || $doctype == 'xhtml' )\n\t\t\t$attributes[] = \"xml:lang=\\\"$lang\\\"\";\n\t}\n\n\t$output = implode(' ', $attributes);\n\n\t/**\n\t * Filter the language attributes for display in the html tag.\n\t *\n\t * @since 2.5.0\n\t * @since 4.3.0 Added the `$doctype` parameter.\n\t *\n\t * @param string $output A space-separated list of language attributes.\n\t * @param string $doctype The type of html document (xhtml|html).\n\t */\n\treturn apply_filters( 'language_attributes', $output, $doctype );\n}\n\n/**\n * Displays the language attributes for the html tag.\n *\n * Builds up a set of html attributes containing the text direction and language\n * information for the page.\n *\n * @since 2.1.0\n * @since 4.3.0 Converted into a wrapper for get_language_attributes().\n *\n * @param string $doctype Optional. The type of html document. Accepts 'xhtml' or 'html'. Default 'html'.\n */\nfunction language_attributes( $doctype = 'html' ) {\n\techo get_language_attributes( $doctype );\n}\n\n/**\n * Retrieve paginated link for archive post pages.\n *\n * Technically, the function can be used to create paginated link list for any\n * area. The 'base' argument is used to reference the url, which will be used to\n * create the paginated links. The 'format' argument is then used for replacing\n * the page number. It is however, most likely and by default, to be used on the\n * archive post pages.\n *\n * The 'type' argument controls format of the returned value. The default is\n * 'plain', which is just a string with the links separated by a newline\n * character. The other possible values are either 'array' or 'list'. The\n * 'array' value will return an array of the paginated link list to offer full\n * control of display. The 'list' value will place all of the paginated links in\n * an unordered HTML list.\n *\n * The 'total' argument is the total amount of pages and is an integer. The\n * 'current' argument is the current page number and is also an integer.\n *\n * An example of the 'base' argument is \"http://example.com/all_posts.php%_%\"\n * and the '%_%' is required. The '%_%' will be replaced by the contents of in\n * the 'format' argument. An example for the 'format' argument is \"?page=%#%\"\n * and the '%#%' is also required. The '%#%' will be replaced with the page\n * number.\n *\n * You can include the previous and next links in the list by setting the\n * 'prev_next' argument to true, which it is by default. You can set the\n * previous text, by using the 'prev_text' argument. You can set the next text\n * by setting the 'next_text' argument.\n *\n * If the 'show_all' argument is set to true, then it will show all of the pages\n * instead of a short list of the pages near the current page. By default, the\n * 'show_all' is set to false and controlled by the 'end_size' and 'mid_size'\n * arguments. The 'end_size' argument is how many numbers on either the start\n * and the end list edges, by default is 1. The 'mid_size' argument is how many\n * numbers to either side of current page, but not including current page.\n *\n * It is possible to add query vars to the link by using the 'add_args' argument\n * and see {@link add_query_arg()} for more information.\n *\n * The 'before_page_number' and 'after_page_number' arguments allow users to\n * augment the links themselves. Typically this might be to add context to the\n * numbered links so that screen reader users understand what the links are for.\n * The text strings are added before and after the page number - within the\n * anchor tag.\n *\n * @since 2.1.0\n *\n * @global WP_Query   $wp_query\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string|array $args {\n *     Optional. Array or string of arguments for generating paginated links for archives.\n *\n *     @type string $base               Base of the paginated url. Default empty.\n *     @type string $format             Format for the pagination structure. Default empty.\n *     @type int    $total              The total amount of pages. Default is the value WP_Query's\n *                                      `max_num_pages` or 1.\n *     @type int    $current            The current page number. Default is 'paged' query var or 1.\n *     @type bool   $show_all           Whether to show all pages. Default false.\n *     @type int    $end_size           How many numbers on either the start and the end list edges.\n *                                      Default 1.\n *     @type int    $mid_size           How many numbers to either side of the current pages. Default 2.\n *     @type bool   $prev_next          Whether to include the previous and next links in the list. Default true.\n *     @type bool   $prev_text          The previous page text. Default '« Previous'.\n *     @type bool   $next_text          The next page text. Default '« Previous'.\n *     @type string $type               Controls format of the returned value. Possible values are 'plain',\n *                                      'array' and 'list'. Default is 'plain'.\n *     @type array  $add_args           An array of query args to add. Default false.\n *     @type string $add_fragment       A string to append to each link. Default empty.\n *     @type string $before_page_number A string to appear before the page number. Default empty.\n *     @type string $after_page_number  A string to append after the page number. Default empty.\n * }\n * @return array|string|void String of page links or array of page links.\n */\nfunction paginate_links( $args = '' ) {\n\tglobal $wp_query, $wp_rewrite;\n\n\t// Setting up default values based on the current URL.\n\t$pagenum_link = html_entity_decode( get_pagenum_link() );\n\t$url_parts    = explode( '?', $pagenum_link );\n\n\t// Get max pages and current page out of the current query, if available.\n\t$total   = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;\n\t$current = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1;\n\n\t// Append the format placeholder to the base URL.\n\t$pagenum_link = trailingslashit( $url_parts[0] ) . '%_%';\n\n\t// URL base depends on permalink settings.\n\t$format  = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : '';\n\t$format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%';\n\n\t$defaults = array(\n\t\t'base' => $pagenum_link, // http://example.com/all_posts.php%_% : %_% is replaced by format (below)\n\t\t'format' => $format, // ?page=%#% : %#% is replaced by the page number\n\t\t'total' => $total,\n\t\t'current' => $current,\n\t\t'show_all' => false,\n\t\t'prev_next' => true,\n\t\t'prev_text' => __('&laquo; Previous'),\n\t\t'next_text' => __('Next &raquo;'),\n\t\t'end_size' => 1,\n\t\t'mid_size' => 2,\n\t\t'type' => 'plain',\n\t\t'add_args' => array(), // array of query args to add\n\t\t'add_fragment' => '',\n\t\t'before_page_number' => '',\n\t\t'after_page_number' => ''\n\t);\n\n\t$args = wp_parse_args( $args, $defaults );\n\n\tif ( ! is_array( $args['add_args'] ) ) {\n\t\t$args['add_args'] = array();\n\t}\n\n\t// Merge additional query vars found in the original URL into 'add_args' array.\n\tif ( isset( $url_parts[1] ) ) {\n\t\t// Find the format argument.\n\t\t$format = explode( '?', str_replace( '%_%', $args['format'], $args['base'] ) );\n\t\t$format_query = isset( $format[1] ) ? $format[1] : '';\n\t\twp_parse_str( $format_query, $format_args );\n\n\t\t// Find the query args of the requested URL.\n\t\twp_parse_str( $url_parts[1], $url_query_args );\n\n\t\t// Remove the format argument from the array of query arguments, to avoid overwriting custom format.\n\t\tforeach ( $format_args as $format_arg => $format_arg_value ) {\n\t\t\tunset( $url_query_args[ $format_arg ] );\n\t\t}\n\n\t\t$args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $url_query_args ) );\n\t}\n\n\t// Who knows what else people pass in $args\n\t$total = (int) $args['total'];\n\tif ( $total < 2 ) {\n\t\treturn;\n\t}\n\t$current  = (int) $args['current'];\n\t$end_size = (int) $args['end_size']; // Out of bounds?  Make it the default.\n\tif ( $end_size < 1 ) {\n\t\t$end_size = 1;\n\t}\n\t$mid_size = (int) $args['mid_size'];\n\tif ( $mid_size < 0 ) {\n\t\t$mid_size = 2;\n\t}\n\t$add_args = $args['add_args'];\n\t$r = '';\n\t$page_links = array();\n\t$dots = false;\n\n\tif ( $args['prev_next'] && $current && 1 < $current ) :\n\t\t$link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] );\n\t\t$link = str_replace( '%#%', $current - 1, $link );\n\t\tif ( $add_args )\n\t\t\t$link = add_query_arg( $add_args, $link );\n\t\t$link .= $args['add_fragment'];\n\n\t\t/**\n\t\t * Filter the paginated links for the given archive pages.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $link The paginated link URL.\n\t\t */\n\t\t$page_links[] = '<a class=\"prev page-numbers\" href=\"' . esc_url( apply_filters( 'paginate_links', $link ) ) . '\">' . $args['prev_text'] . '</a>';\n\tendif;\n\tfor ( $n = 1; $n <= $total; $n++ ) :\n\t\tif ( $n == $current ) :\n\t\t\t$page_links[] = \"<span class='page-numbers current'>\" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . \"</span>\";\n\t\t\t$dots = true;\n\t\telse :\n\t\t\tif ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :\n\t\t\t\t$link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] );\n\t\t\t\t$link = str_replace( '%#%', $n, $link );\n\t\t\t\tif ( $add_args )\n\t\t\t\t\t$link = add_query_arg( $add_args, $link );\n\t\t\t\t$link .= $args['add_fragment'];\n\n\t\t\t\t/** This filter is documented in wp-includes/general-template.php */\n\t\t\t\t$page_links[] = \"<a class='page-numbers' href='\" . esc_url( apply_filters( 'paginate_links', $link ) ) . \"'>\" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . \"</a>\";\n\t\t\t\t$dots = true;\n\t\t\telseif ( $dots && ! $args['show_all'] ) :\n\t\t\t\t$page_links[] = '<span class=\"page-numbers dots\">' . __( '&hellip;' ) . '</span>';\n\t\t\t\t$dots = false;\n\t\t\tendif;\n\t\tendif;\n\tendfor;\n\tif ( $args['prev_next'] && $current && ( $current < $total || -1 == $total ) ) :\n\t\t$link = str_replace( '%_%', $args['format'], $args['base'] );\n\t\t$link = str_replace( '%#%', $current + 1, $link );\n\t\tif ( $add_args )\n\t\t\t$link = add_query_arg( $add_args, $link );\n\t\t$link .= $args['add_fragment'];\n\n\t\t/** This filter is documented in wp-includes/general-template.php */\n\t\t$page_links[] = '<a class=\"next page-numbers\" href=\"' . esc_url( apply_filters( 'paginate_links', $link ) ) . '\">' . $args['next_text'] . '</a>';\n\tendif;\n\tswitch ( $args['type'] ) {\n\t\tcase 'array' :\n\t\t\treturn $page_links;\n\n\t\tcase 'list' :\n\t\t\t$r .= \"<ul class='page-numbers'>\\n\\t<li>\";\n\t\t\t$r .= join(\"</li>\\n\\t<li>\", $page_links);\n\t\t\t$r .= \"</li>\\n</ul>\\n\";\n\t\t\tbreak;\n\n\t\tdefault :\n\t\t\t$r = join(\"\\n\", $page_links);\n\t\t\tbreak;\n\t}\n\treturn $r;\n}\n\n/**\n * Registers an admin colour scheme css file.\n *\n * Allows a plugin to register a new admin colour scheme. For example:\n *\n *     wp_admin_css_color( 'classic', __( 'Classic' ), admin_url( \"css/colors-classic.css\" ), array(\n *         '#07273E', '#14568A', '#D54E21', '#2683AE'\n *     ) );\n *\n * @since 2.5.0\n *\n * @todo Properly document optional arguments as such\n *\n * @global array $_wp_admin_css_colors\n *\n * @param string $key    The unique key for this theme.\n * @param string $name   The name of the theme.\n * @param string $url    The url of the css file containing the colour scheme.\n * @param array  $colors Optional An array of CSS color definitions which are used to give the user a feel for the theme.\n * @param array  $icons  Optional An array of CSS color definitions used to color any SVG icons\n */\nfunction wp_admin_css_color( $key, $name, $url, $colors = array(), $icons = array() ) {\n\tglobal $_wp_admin_css_colors;\n\n\tif ( !isset($_wp_admin_css_colors) )\n\t\t$_wp_admin_css_colors = array();\n\n\t$_wp_admin_css_colors[$key] = (object) array(\n\t\t'name' => $name,\n\t\t'url' => $url,\n\t\t'colors' => $colors,\n\t\t'icon_colors' => $icons,\n\t);\n}\n\n/**\n * Registers the default Admin color schemes\n *\n * @since 3.0.0\n *\n * @global string $wp_version\n */\nfunction register_admin_color_schemes() {\n\t$suffix = is_rtl() ? '-rtl' : '';\n\t$suffix .= SCRIPT_DEBUG ? '' : '.min';\n\n\twp_admin_css_color( 'fresh', _x( 'Default', 'admin color scheme' ),\n\t\tfalse,\n\t\tarray( '#222', '#333', '#0073aa', '#00a0d2' ),\n\t\tarray( 'base' => '#999', 'focus' => '#00a0d2', 'current' => '#fff' )\n\t);\n\n\t// Other color schemes are not available when running out of src\n\tif ( false !== strpos( $GLOBALS['wp_version'], '-src' ) )\n\t\treturn;\n\n\twp_admin_css_color( 'light', _x( 'Light', 'admin color scheme' ),\n\t\tadmin_url( \"css/colors/light/colors$suffix.css\" ),\n\t\tarray( '#e5e5e5', '#999', '#d64e07', '#04a4cc' ),\n\t\tarray( 'base' => '#999', 'focus' => '#ccc', 'current' => '#ccc' )\n\t);\n\n\twp_admin_css_color( 'blue', _x( 'Blue', 'admin color scheme' ),\n\t\tadmin_url( \"css/colors/blue/colors$suffix.css\" ),\n\t\tarray( '#096484', '#4796b3', '#52accc', '#74B6CE' ),\n\t\tarray( 'base' => '#e5f8ff', 'focus' => '#fff', 'current' => '#fff' )\n\t);\n\n\twp_admin_css_color( 'midnight', _x( 'Midnight', 'admin color scheme' ),\n\t\tadmin_url( \"css/colors/midnight/colors$suffix.css\" ),\n\t\tarray( '#25282b', '#363b3f', '#69a8bb', '#e14d43' ),\n\t\tarray( 'base' => '#f1f2f3', 'focus' => '#fff', 'current' => '#fff' )\n\t);\n\n\twp_admin_css_color( 'sunrise', _x( 'Sunrise', 'admin color scheme' ),\n\t\tadmin_url( \"css/colors/sunrise/colors$suffix.css\" ),\n\t\tarray( '#b43c38', '#cf4944', '#dd823b', '#ccaf0b' ),\n\t\tarray( 'base' => '#f3f1f1', 'focus' => '#fff', 'current' => '#fff' )\n\t);\n\n\twp_admin_css_color( 'ectoplasm', _x( 'Ectoplasm', 'admin color scheme' ),\n\t\tadmin_url( \"css/colors/ectoplasm/colors$suffix.css\" ),\n\t\tarray( '#413256', '#523f6d', '#a3b745', '#d46f15' ),\n\t\tarray( 'base' => '#ece6f6', 'focus' => '#fff', 'current' => '#fff' )\n\t);\n\n\twp_admin_css_color( 'ocean', _x( 'Ocean', 'admin color scheme' ),\n\t\tadmin_url( \"css/colors/ocean/colors$suffix.css\" ),\n\t\tarray( '#627c83', '#738e96', '#9ebaa0', '#aa9d88' ),\n\t\tarray( 'base' => '#f2fcff', 'focus' => '#fff', 'current' => '#fff' )\n\t);\n\n\twp_admin_css_color( 'coffee', _x( 'Coffee', 'admin color scheme' ),\n\t\tadmin_url( \"css/colors/coffee/colors$suffix.css\" ),\n\t\tarray( '#46403c', '#59524c', '#c7a589', '#9ea476' ),\n\t\tarray( 'base' => '#f3f2f1', 'focus' => '#fff', 'current' => '#fff' )\n\t);\n\n}\n\n/**\n * Display the URL of a WordPress admin CSS file.\n *\n * @see WP_Styles::_css_href and its style_loader_src filter.\n *\n * @since 2.3.0\n *\n * @param string $file file relative to wp-admin/ without its \".css\" extension.\n * @return string\n */\nfunction wp_admin_css_uri( $file = 'wp-admin' ) {\n\tif ( defined('WP_INSTALLING') ) {\n\t\t$_file = \"./$file.css\";\n\t} else {\n\t\t$_file = admin_url(\"$file.css\");\n\t}\n\t$_file = add_query_arg( 'version', get_bloginfo( 'version' ),  $_file );\n\n\t/**\n\t * Filter the URI of a WordPress admin CSS file.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $_file Relative path to the file with query arguments attached.\n\t * @param string $file  Relative path to the file, minus its \".css\" extension.\n\t */\n\treturn apply_filters( 'wp_admin_css_uri', $_file, $file );\n}\n\n/**\n * Enqueues or directly prints a stylesheet link to the specified CSS file.\n *\n * \"Intelligently\" decides to enqueue or to print the CSS file. If the\n * 'wp_print_styles' action has *not* yet been called, the CSS file will be\n * enqueued. If the wp_print_styles action *has* been called, the CSS link will\n * be printed. Printing may be forced by passing true as the $force_echo\n * (second) parameter.\n *\n * For backward compatibility with WordPress 2.3 calling method: If the $file\n * (first) parameter does not correspond to a registered CSS file, we assume\n * $file is a file relative to wp-admin/ without its \".css\" extension. A\n * stylesheet link to that generated URL is printed.\n *\n * @since 2.3.0\n *\n * @param string $file       Optional. Style handle name or file name (without \".css\" extension) relative\n * \t                         to wp-admin/. Defaults to 'wp-admin'.\n * @param bool   $force_echo Optional. Force the stylesheet link to be printed rather than enqueued.\n */\nfunction wp_admin_css( $file = 'wp-admin', $force_echo = false ) {\n\t// For backward compatibility\n\t$handle = 0 === strpos( $file, 'css/' ) ? substr( $file, 4 ) : $file;\n\n\tif ( wp_styles()->query( $handle ) ) {\n\t\tif ( $force_echo || did_action( 'wp_print_styles' ) ) // we already printed the style queue. Print this one immediately\n\t\t\twp_print_styles( $handle );\n\t\telse // Add to style queue\n\t\t\twp_enqueue_style( $handle );\n\t\treturn;\n\t}\n\n\t/**\n\t * Filter the stylesheet link to the specified CSS file.\n\t *\n\t * If the site is set to display right-to-left, the RTL stylesheet link\n\t * will be used instead.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $file Style handle name or filename (without \".css\" extension)\n\t *                     relative to wp-admin/. Defaults to 'wp-admin'.\n\t */\n\techo apply_filters( 'wp_admin_css', \"<link rel='stylesheet' href='\" . esc_url( wp_admin_css_uri( $file ) ) . \"' type='text/css' />\\n\", $file );\n\n\tif ( function_exists( 'is_rtl' ) && is_rtl() ) {\n\t\t/** This filter is documented in wp-includes/general-template.php */\n\t\techo apply_filters( 'wp_admin_css', \"<link rel='stylesheet' href='\" . esc_url( wp_admin_css_uri( \"$file-rtl\" ) ) . \"' type='text/css' />\\n\", \"$file-rtl\" );\n\t}\n}\n\n/**\n * Enqueues the default ThickBox js and css.\n *\n * If any of the settings need to be changed, this can be done with another js\n * file similar to media-upload.js. That file should\n * require array('thickbox') to ensure it is loaded after.\n *\n * @since 2.5.0\n */\nfunction add_thickbox() {\n\twp_enqueue_script( 'thickbox' );\n\twp_enqueue_style( 'thickbox' );\n\n\tif ( is_network_admin() )\n\t\tadd_action( 'admin_head', '_thickbox_path_admin_subfolder' );\n}\n\n/**\n * Display the XHTML generator that is generated on the wp_head hook.\n *\n * @since 2.5.0\n */\nfunction wp_generator() {\n\t/**\n\t * Filter the output of the XHTML generator tag.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $generator_type The XHTML generator.\n\t */\n\tthe_generator( apply_filters( 'wp_generator_type', 'xhtml' ) );\n}\n\n/**\n * Display the generator XML or Comment for RSS, ATOM, etc.\n *\n * Returns the correct generator type for the requested output format. Allows\n * for a plugin to filter generators overall the the_generator filter.\n *\n * @since 2.5.0\n *\n * @param string $type The type of generator to output - (html|xhtml|atom|rss2|rdf|comment|export).\n */\nfunction the_generator( $type ) {\n\t/**\n\t * Filter the output of the XHTML generator tag for display.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $generator_type The generator output.\n\t * @param string $type           The type of generator to output. Accepts 'html',\n\t *                               'xhtml', 'atom', 'rss2', 'rdf', 'comment', 'export'.\n\t */\n\techo apply_filters( 'the_generator', get_the_generator($type), $type ) . \"\\n\";\n}\n\n/**\n * Creates the generator XML or Comment for RSS, ATOM, etc.\n *\n * Returns the correct generator type for the requested output format. Allows\n * for a plugin to filter generators on an individual basis using the\n * 'get_the_generator_{$type}' filter.\n *\n * @since 2.5.0\n *\n * @param string $type The type of generator to return - (html|xhtml|atom|rss2|rdf|comment|export).\n * @return string|void The HTML content for the generator.\n */\nfunction get_the_generator( $type = '' ) {\n\tif ( empty( $type ) ) {\n\n\t\t$current_filter = current_filter();\n\t\tif ( empty( $current_filter ) )\n\t\t\treturn;\n\n\t\tswitch ( $current_filter ) {\n\t\t\tcase 'rss2_head' :\n\t\t\tcase 'commentsrss2_head' :\n\t\t\t\t$type = 'rss2';\n\t\t\t\tbreak;\n\t\t\tcase 'rss_head' :\n\t\t\tcase 'opml_head' :\n\t\t\t\t$type = 'comment';\n\t\t\t\tbreak;\n\t\t\tcase 'rdf_header' :\n\t\t\t\t$type = 'rdf';\n\t\t\t\tbreak;\n\t\t\tcase 'atom_head' :\n\t\t\tcase 'comments_atom_head' :\n\t\t\tcase 'app_head' :\n\t\t\t\t$type = 'atom';\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tswitch ( $type ) {\n\t\tcase 'html':\n\t\t\t$gen = '<meta name=\"generator\" content=\"WordPress ' . get_bloginfo( 'version' ) . '\">';\n\t\t\tbreak;\n\t\tcase 'xhtml':\n\t\t\t$gen = '<meta name=\"generator\" content=\"WordPress ' . get_bloginfo( 'version' ) . '\" />';\n\t\t\tbreak;\n\t\tcase 'atom':\n\t\t\t$gen = '<generator uri=\"https://wordpress.org/\" version=\"' . get_bloginfo_rss( 'version' ) . '\">WordPress</generator>';\n\t\t\tbreak;\n\t\tcase 'rss2':\n\t\t\t$gen = '<generator>https://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . '</generator>';\n\t\t\tbreak;\n\t\tcase 'rdf':\n\t\t\t$gen = '<admin:generatorAgent rdf:resource=\"https://wordpress.org/?v=' . get_bloginfo_rss( 'version' ) . '\" />';\n\t\t\tbreak;\n\t\tcase 'comment':\n\t\t\t$gen = '<!-- generator=\"WordPress/' . get_bloginfo( 'version' ) . '\" -->';\n\t\t\tbreak;\n\t\tcase 'export':\n\t\t\t$gen = '<!-- generator=\"WordPress/' . get_bloginfo_rss('version') . '\" created=\"'. date('Y-m-d H:i') . '\" -->';\n\t\t\tbreak;\n\t}\n\n\t/**\n\t * Filter the HTML for the retrieved generator type.\n\t *\n\t * The dynamic portion of the hook name, `$type`, refers to the generator type.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $gen  The HTML markup output to {@see wp_head()}.\n\t * @param string $type The type of generator. Accepts 'html', 'xhtml', 'atom',\n\t *                     'rss2', 'rdf', 'comment', 'export'.\n\t */\n\treturn apply_filters( \"get_the_generator_{$type}\", $gen, $type );\n}\n\n/**\n * Outputs the html checked attribute.\n *\n * Compares the first two arguments and if identical marks as checked\n *\n * @since 1.0.0\n *\n * @param mixed $checked One of the values to compare\n * @param mixed $current (true) The other value to compare if not just true\n * @param bool  $echo    Whether to echo or just return the string\n * @return string html attribute or empty string\n */\nfunction checked( $checked, $current = true, $echo = true ) {\n\treturn __checked_selected_helper( $checked, $current, $echo, 'checked' );\n}\n\n/**\n * Outputs the html selected attribute.\n *\n * Compares the first two arguments and if identical marks as selected\n *\n * @since 1.0.0\n *\n * @param mixed $selected One of the values to compare\n * @param mixed $current  (true) The other value to compare if not just true\n * @param bool  $echo     Whether to echo or just return the string\n * @return string html attribute or empty string\n */\nfunction selected( $selected, $current = true, $echo = true ) {\n\treturn __checked_selected_helper( $selected, $current, $echo, 'selected' );\n}\n\n/**\n * Outputs the html disabled attribute.\n *\n * Compares the first two arguments and if identical marks as disabled\n *\n * @since 3.0.0\n *\n * @param mixed $disabled One of the values to compare\n * @param mixed $current  (true) The other value to compare if not just true\n * @param bool  $echo     Whether to echo or just return the string\n * @return string html attribute or empty string\n */\nfunction disabled( $disabled, $current = true, $echo = true ) {\n\treturn __checked_selected_helper( $disabled, $current, $echo, 'disabled' );\n}\n\n/**\n * Private helper function for checked, selected, and disabled.\n *\n * Compares the first two arguments and if identical marks as $type\n *\n * @since 2.8.0\n * @access private\n *\n * @param mixed  $helper  One of the values to compare\n * @param mixed  $current (true) The other value to compare if not just true\n * @param bool   $echo    Whether to echo or just return the string\n * @param string $type    The type of checked|selected|disabled we are doing\n * @return string html attribute or empty string\n */\nfunction __checked_selected_helper( $helper, $current, $echo, $type ) {\n\tif ( (string) $helper === (string) $current )\n\t\t$result = \" $type='$type'\";\n\telse\n\t\t$result = '';\n\n\tif ( $echo )\n\t\techo $result;\n\n\treturn $result;\n}\n\n/**\n * Default settings for heartbeat\n *\n * Outputs the nonce used in the heartbeat XHR\n *\n * @since 3.6.0\n *\n * @param array $settings\n * @return array $settings\n */\nfunction wp_heartbeat_settings( $settings ) {\n\tif ( ! is_admin() )\n\t\t$settings['ajaxurl'] = admin_url( 'admin-ajax.php', 'relative' );\n\n\tif ( is_user_logged_in() )\n\t\t$settings['nonce'] = wp_create_nonce( 'heartbeat-nonce' );\n\n\treturn $settings;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/http.php",
    "content": "<?php\n/**\n * Core HTTP Request API\n *\n * Standardizes the HTTP requests for WordPress. Handles cookies, gzip encoding and decoding, chunk\n * decoding, if HTTP 1.1 and various other difficult HTTP protocol implementations.\n *\n * @package WordPress\n * @subpackage HTTP\n */\n\n/**\n * Returns the initialized WP_Http Object\n *\n * @since 2.7.0\n * @access private\n *\n * @staticvar WP_Http $http\n *\n * @return WP_Http HTTP Transport object.\n */\nfunction _wp_http_get_object() {\n\tstatic $http = null;\n\n\tif ( is_null( $http ) ) {\n\t\t$http = new WP_Http();\n\t}\n\treturn $http;\n}\n\n/**\n * Retrieve the raw response from a safe HTTP request.\n *\n * This function is ideal when the HTTP request is being made to an arbitrary\n * URL. The URL is validated to avoid redirection and request forgery attacks.\n *\n * @since 3.6.0\n *\n * @see wp_remote_request() For more information on the response array format.\n * @see WP_Http::request() For default arguments information.\n *\n * @param string $url  Site URL to retrieve.\n * @param array  $args Optional. Request arguments. Default empty array.\n * @return WP_Error|array The response or WP_Error on failure.\n */\nfunction wp_safe_remote_request( $url, $args = array() ) {\n\t$args['reject_unsafe_urls'] = true;\n\t$http = _wp_http_get_object();\n\treturn $http->request( $url, $args );\n}\n\n/**\n * Retrieve the raw response from a safe HTTP request using the GET method.\n *\n * This function is ideal when the HTTP request is being made to an arbitrary\n * URL. The URL is validated to avoid redirection and request forgery attacks.\n *\n * @since 3.6.0\n *\n * @see wp_remote_request() For more information on the response array format.\n * @see WP_Http::request() For default arguments information.\n *\n * @param string $url  Site URL to retrieve.\n * @param array  $args Optional. Request arguments. Default empty array.\n * @return WP_Error|array The response or WP_Error on failure.\n */\nfunction wp_safe_remote_get( $url, $args = array() ) {\n\t$args['reject_unsafe_urls'] = true;\n\t$http = _wp_http_get_object();\n\treturn $http->get( $url, $args );\n}\n\n/**\n * Retrieve the raw response from a safe HTTP request using the POST method.\n *\n * This function is ideal when the HTTP request is being made to an arbitrary\n * URL. The URL is validated to avoid redirection and request forgery attacks.\n *\n * @since 3.6.0\n *\n * @see wp_remote_request() For more information on the response array format.\n * @see WP_Http::request() For default arguments information.\n *\n * @param string $url  Site URL to retrieve.\n * @param array  $args Optional. Request arguments. Default empty array.\n * @return WP_Error|array The response or WP_Error on failure.\n */\nfunction wp_safe_remote_post( $url, $args = array() ) {\n\t$args['reject_unsafe_urls'] = true;\n\t$http = _wp_http_get_object();\n\treturn $http->post( $url, $args );\n}\n\n/**\n * Retrieve the raw response from a safe HTTP request using the HEAD method.\n *\n * This function is ideal when the HTTP request is being made to an arbitrary\n * URL. The URL is validated to avoid redirection and request forgery attacks.\n *\n * @since 3.6.0\n *\n * @see wp_remote_request() For more information on the response array format.\n * @see WP_Http::request() For default arguments information.\n *\n * @param string $url Site URL to retrieve.\n * @param array $args Optional. Request arguments. Default empty array.\n * @return WP_Error|array The response or WP_Error on failure.\n */\nfunction wp_safe_remote_head( $url, $args = array() ) {\n\t$args['reject_unsafe_urls'] = true;\n\t$http = _wp_http_get_object();\n\treturn $http->head( $url, $args );\n}\n\n/**\n * Retrieve the raw response from the HTTP request.\n *\n * The array structure is a little complex:\n *\n *     $res = array(\n *         'headers'  => array(),\n *         'response' => array(\n *             'code'    => int,\n *             'message' => string\n *         )\n *     );\n *\n * All of the headers in $res['headers'] are with the name as the key and the\n * value as the value. So to get the User-Agent, you would do the following.\n *\n *     $user_agent = $res['headers']['user-agent'];\n *\n * The body is the raw response content and can be retrieved from $res['body'].\n *\n * This function is called first to make the request and there are other API\n * functions to abstract out the above convoluted setup.\n *\n * Request method defaults for helper functions:\n *  - Default 'GET'  for wp_remote_get()\n *  - Default 'POST' for wp_remote_post()\n *  - Default 'HEAD' for wp_remote_head()\n *\n * @since 2.7.0\n *\n * @see WP_Http::request() For additional information on default arguments.\n *\n * @param string $url  Site URL to retrieve.\n * @param array  $args Optional. Request arguments. Default empty array.\n * @return WP_Error|array The response or WP_Error on failure.\n */\nfunction wp_remote_request($url, $args = array()) {\n\t$http = _wp_http_get_object();\n\treturn $http->request( $url, $args );\n}\n\n/**\n * Retrieve the raw response from the HTTP request using the GET method.\n *\n * @since 2.7.0\n *\n * @see wp_remote_request() For more information on the response array format.\n * @see WP_Http::request() For default arguments information.\n *\n * @param string $url  Site URL to retrieve.\n * @param array  $args Optional. Request arguments. Default empty array.\n * @return WP_Error|array The response or WP_Error on failure.\n */\nfunction wp_remote_get($url, $args = array()) {\n\t$http = _wp_http_get_object();\n\treturn $http->get( $url, $args );\n}\n\n/**\n * Retrieve the raw response from the HTTP request using the POST method.\n *\n * @since 2.7.0\n *\n * @see wp_remote_request() For more information on the response array format.\n * @see WP_Http::request() For default arguments information.\n *\n * @param string $url  Site URL to retrieve.\n * @param array  $args Optional. Request arguments. Default empty array.\n * @return WP_Error|array The response or WP_Error on failure.\n */\nfunction wp_remote_post($url, $args = array()) {\n\t$http = _wp_http_get_object();\n\treturn $http->post( $url, $args );\n}\n\n/**\n * Retrieve the raw response from the HTTP request using the HEAD method.\n *\n * @since 2.7.0\n *\n * @see wp_remote_request() For more information on the response array format.\n * @see WP_Http::request() For default arguments information.\n *\n * @param string $url  Site URL to retrieve.\n * @param array  $args Optional. Request arguments. Default empty array.\n * @return WP_Error|array The response or WP_Error on failure.\n */\nfunction wp_remote_head($url, $args = array()) {\n\t$http = _wp_http_get_object();\n\treturn $http->head( $url, $args );\n}\n\n/**\n * Retrieve only the headers from the raw response.\n *\n * @since 2.7.0\n *\n * @param array $response HTTP response.\n * @return array The headers of the response. Empty array if incorrect parameter given.\n */\nfunction wp_remote_retrieve_headers( $response ) {\n\tif ( is_wp_error($response) || ! isset($response['headers']) || ! is_array($response['headers']))\n\t\treturn array();\n\n\treturn $response['headers'];\n}\n\n/**\n * Retrieve a single header by name from the raw response.\n *\n * @since 2.7.0\n *\n * @param array  $response\n * @param string $header Header name to retrieve value from.\n * @return string The header value. Empty string on if incorrect parameter given, or if the header doesn't exist.\n */\nfunction wp_remote_retrieve_header( $response, $header ) {\n\tif ( is_wp_error($response) || ! isset($response['headers']) || ! is_array($response['headers']))\n\t\treturn '';\n\n\tif ( array_key_exists($header, $response['headers']) )\n\t\treturn $response['headers'][$header];\n\n\treturn '';\n}\n\n/**\n * Retrieve only the response code from the raw response.\n *\n * Will return an empty array if incorrect parameter value is given.\n *\n * @since 2.7.0\n *\n * @param array $response HTTP response.\n * @return int|string The response code as an integer. Empty string on incorrect parameter given.\n */\nfunction wp_remote_retrieve_response_code( $response ) {\n\tif ( is_wp_error($response) || ! isset($response['response']) || ! is_array($response['response']))\n\t\treturn '';\n\n\treturn $response['response']['code'];\n}\n\n/**\n * Retrieve only the response message from the raw response.\n *\n * Will return an empty array if incorrect parameter value is given.\n *\n * @since 2.7.0\n *\n * @param array $response HTTP response.\n * @return string The response message. Empty string on incorrect parameter given.\n */\nfunction wp_remote_retrieve_response_message( $response ) {\n\tif ( is_wp_error($response) || ! isset($response['response']) || ! is_array($response['response']))\n\t\treturn '';\n\n\treturn $response['response']['message'];\n}\n\n/**\n * Retrieve only the body from the raw response.\n *\n * @since 2.7.0\n *\n * @param array $response HTTP response.\n * @return string The body of the response. Empty string if no body or incorrect parameter given.\n */\nfunction wp_remote_retrieve_body( $response ) {\n\tif ( is_wp_error($response) || ! isset($response['body']) )\n\t\treturn '';\n\n\treturn $response['body'];\n}\n\n/**\n * Retrieve only the body from the raw response.\n *\n * @since 4.4.0\n *\n * @param array $response HTTP response.\n * @return array An array of `WP_Http_Cookie` objects from the response. Empty array if there are none, or the response is a WP_Error.\n */\nfunction wp_remote_retrieve_cookies( $response ) {\n\tif ( is_wp_error( $response ) || empty( $response['cookies'] ) ) {\n\t\treturn array();\n\t}\n\n\treturn $response['cookies'];\n}\n\n/**\n * Retrieve a single cookie by name from the raw response.\n *\n * @since 4.4.0\n *\n * @param array  $response HTTP response.\n * @param string $name     The name of the cookie to retrieve.\n * @return WP_Http_Cookie|string The `WP_Http_Cookie` object. Empty string if the cookie isn't present in the response.\n */\nfunction wp_remote_retrieve_cookie( $response, $name ) {\n\t$cookies = wp_remote_retrieve_cookies( $response );\n\n\tif ( empty( $cookies ) ) {\n\t\treturn '';\n\t}\n\n\tforeach ( $cookies as $cookie ) {\n\t\tif ( $cookie->name === $name ) {\n\t\t\treturn $cookie;\n\t\t}\n\t}\n\n\treturn '';\n}\n\n/**\n * Retrieve a single cookie's value by name from the raw response.\n *\n * @since 4.4.0\n *\n * @param array  $response HTTP response.\n * @param string $name     The name of the cookie to retrieve.\n * @return string The value of the cookie. Empty string if the cookie isn't present in the response.\n */\nfunction wp_remote_retrieve_cookie_value( $response, $name ) {\n\t$cookie = wp_remote_retrieve_cookie( $response, $name );\n\n\tif ( ! is_a( $cookie, 'WP_Http_Cookie' ) ) {\n\t\treturn '';\n\t}\n\n\treturn $cookie->value;\n}\n\n/**\n * Determines if there is an HTTP Transport that can process this request.\n *\n * @since 3.2.0\n *\n * @param array  $capabilities Array of capabilities to test or a wp_remote_request() $args array.\n * @param string $url          Optional. If given, will check if the URL requires SSL and adds\n *                             that requirement to the capabilities array.\n *\n * @return bool\n */\nfunction wp_http_supports( $capabilities = array(), $url = null ) {\n\t$http = _wp_http_get_object();\n\n\t$capabilities = wp_parse_args( $capabilities );\n\n\t$count = count( $capabilities );\n\n\t// If we have a numeric $capabilities array, spoof a wp_remote_request() associative $args array\n\tif ( $count && count( array_filter( array_keys( $capabilities ), 'is_numeric' ) ) == $count ) {\n\t\t$capabilities = array_combine( array_values( $capabilities ), array_fill( 0, $count, true ) );\n\t}\n\n\tif ( $url && !isset( $capabilities['ssl'] ) ) {\n\t\t$scheme = parse_url( $url, PHP_URL_SCHEME );\n\t\tif ( 'https' == $scheme || 'ssl' == $scheme ) {\n\t\t\t$capabilities['ssl'] = true;\n\t\t}\n\t}\n\n\treturn (bool) $http->_get_first_available_transport( $capabilities );\n}\n\n/**\n * Get the HTTP Origin of the current request.\n *\n * @since 3.4.0\n *\n * @return string URL of the origin. Empty string if no origin.\n */\nfunction get_http_origin() {\n\t$origin = '';\n\tif ( ! empty ( $_SERVER[ 'HTTP_ORIGIN' ] ) )\n\t\t$origin = $_SERVER[ 'HTTP_ORIGIN' ];\n\n\t/**\n\t * Change the origin of an HTTP request.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $origin The original origin for the request.\n\t */\n\treturn apply_filters( 'http_origin', $origin );\n}\n\n/**\n * Retrieve list of allowed HTTP origins.\n *\n * @since 3.4.0\n *\n * @return array Array of origin URLs.\n */\nfunction get_allowed_http_origins() {\n\t$admin_origin = parse_url( admin_url() );\n\t$home_origin = parse_url( home_url() );\n\n\t// @todo preserve port?\n\t$allowed_origins = array_unique( array(\n\t\t'http://' . $admin_origin[ 'host' ],\n\t\t'https://' . $admin_origin[ 'host' ],\n\t\t'http://' . $home_origin[ 'host' ],\n\t\t'https://' . $home_origin[ 'host' ],\n\t) );\n\n\t/**\n\t * Change the origin types allowed for HTTP requests.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param array $allowed_origins {\n\t *     Default allowed HTTP origins.\n\t *     @type string Non-secure URL for admin origin.\n\t *     @type string Secure URL for admin origin.\n\t *     @type string Non-secure URL for home origin.\n\t *     @type string Secure URL for home origin.\n\t * }\n\t */\n\treturn apply_filters( 'allowed_http_origins' , $allowed_origins );\n}\n\n/**\n * Determines if the HTTP origin is an authorized one.\n *\n * @since 3.4.0\n *\n * @param null|string $origin Origin URL. If not provided, the value of get_http_origin() is used.\n * @return string True if the origin is allowed. False otherwise.\n */\nfunction is_allowed_http_origin( $origin = null ) {\n\t$origin_arg = $origin;\n\n\tif ( null === $origin )\n\t\t$origin = get_http_origin();\n\n\tif ( $origin && ! in_array( $origin, get_allowed_http_origins() ) )\n\t\t$origin = '';\n\n\t/**\n\t * Change the allowed HTTP origin result.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $origin     Result of check for allowed origin.\n\t * @param string $origin_arg Original origin string passed into is_allowed_http_origin function.\n\t */\n\treturn apply_filters( 'allowed_http_origin', $origin, $origin_arg );\n}\n\n/**\n * Send Access-Control-Allow-Origin and related headers if the current request\n * is from an allowed origin.\n *\n * If the request is an OPTIONS request, the script exits with either access\n * control headers sent, or a 403 response if the origin is not allowed. For\n * other request methods, you will receive a return value.\n *\n * @since 3.4.0\n *\n * @return string|false Returns the origin URL if headers are sent. Returns false\n *                      if headers are not sent.\n */\nfunction send_origin_headers() {\n\t$origin = get_http_origin();\n\n\tif ( is_allowed_http_origin( $origin ) ) {\n\t\t@header( 'Access-Control-Allow-Origin: ' .  $origin );\n\t\t@header( 'Access-Control-Allow-Credentials: true' );\n\t\tif ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] )\n\t\t\texit;\n\t\treturn $origin;\n\t}\n\n\tif ( 'OPTIONS' === $_SERVER['REQUEST_METHOD'] ) {\n\t\tstatus_header( 403 );\n\t\texit;\n\t}\n\n\treturn false;\n}\n\n/**\n * Validate a URL for safe use in the HTTP API.\n *\n * @since 3.5.2\n *\n * @param string $url\n * @return false|string URL or false on failure.\n */\nfunction wp_http_validate_url( $url ) {\n\t$original_url = $url;\n\t$url = wp_kses_bad_protocol( $url, array( 'http', 'https' ) );\n\tif ( ! $url || strtolower( $url ) !== strtolower( $original_url ) )\n\t\treturn false;\n\n\t$parsed_url = @parse_url( $url );\n\tif ( ! $parsed_url || empty( $parsed_url['host'] ) )\n\t\treturn false;\n\n\tif ( isset( $parsed_url['user'] ) || isset( $parsed_url['pass'] ) )\n\t\treturn false;\n\n\tif ( false !== strpbrk( $parsed_url['host'], ':#?[]' ) )\n\t\treturn false;\n\n\t$parsed_home = @parse_url( get_option( 'home' ) );\n\n\t$same_host = strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );\n\n\tif ( ! $same_host ) {\n\t\t$host = trim( $parsed_url['host'], '.' );\n\t\tif ( preg_match( '#^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$#', $host ) ) {\n\t\t\t$ip = $host;\n\t\t} else {\n\t\t\t$ip = gethostbyname( $host );\n\t\t\tif ( $ip === $host ) // Error condition for gethostbyname()\n\t\t\t\t$ip = false;\n\t\t}\n\t\tif ( $ip ) {\n\t\t\t$parts = array_map( 'intval', explode( '.', $ip ) );\n\t\t\tif ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]\n\t\t\t\t|| ( 172 === $parts[0] && 16 <= $parts[1] && 31 >= $parts[1] )\n\t\t\t\t|| ( 192 === $parts[0] && 168 === $parts[1] )\n\t\t\t) {\n\t\t\t\t// If host appears local, reject unless specifically allowed.\n\t\t\t\t/**\n\t\t\t\t * Check if HTTP request is external or not.\n\t\t\t\t *\n\t\t\t\t * Allows to change and allow external requests for the HTTP request.\n\t\t\t\t *\n\t\t\t\t * @since 3.6.0\n\t\t\t\t *\n\t\t\t\t * @param bool   false Whether HTTP request is external or not.\n\t\t\t\t * @param string $host IP of the requested host.\n\t\t\t\t * @param string $url  URL of the requested host.\n\t\t\t\t */\n\t\t\t\tif ( ! apply_filters( 'http_request_host_is_external', false, $host, $url ) )\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( empty( $parsed_url['port'] ) )\n\t\treturn $url;\n\n\t$port = $parsed_url['port'];\n\tif ( 80 === $port || 443 === $port || 8080 === $port )\n\t\treturn $url;\n\n\tif ( $parsed_home && $same_host && isset( $parsed_home['port'] ) && $parsed_home['port'] === $port )\n\t\treturn $url;\n\n\treturn false;\n}\n\n/**\n * Whitelists allowed redirect hosts for safe HTTP requests as well.\n *\n * Attached to the http_request_host_is_external filter.\n *\n * @since 3.6.0\n *\n * @param bool   $is_external\n * @param string $host\n * @return bool\n */\nfunction allowed_http_request_hosts( $is_external, $host ) {\n\tif ( ! $is_external && wp_validate_redirect( 'http://' . $host ) )\n\t\t$is_external = true;\n\treturn $is_external;\n}\n\n/**\n * Whitelists any domain in a multisite installation for safe HTTP requests.\n *\n * Attached to the http_request_host_is_external filter.\n *\n * @since 3.6.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @staticvar array $queried\n *\n * @param bool   $is_external\n * @param string $host\n * @return bool\n */\nfunction ms_allowed_http_request_hosts( $is_external, $host ) {\n\tglobal $wpdb;\n\tstatic $queried = array();\n\tif ( $is_external )\n\t\treturn $is_external;\n\tif ( $host === get_current_site()->domain )\n\t\treturn true;\n\tif ( isset( $queried[ $host ] ) )\n\t\treturn $queried[ $host ];\n\t$queried[ $host ] = (bool) $wpdb->get_var( $wpdb->prepare( \"SELECT domain FROM $wpdb->blogs WHERE domain = %s LIMIT 1\", $host ) );\n\treturn $queried[ $host ];\n}\n\n/**\n * A wrapper for PHP's parse_url() function that handles edgecases in < PHP 5.4.7\n *\n * PHP 5.4.7 expanded parse_url()'s ability to handle non-absolute url's, including\n * schemeless and relative url's with :// in the path, this works around those\n * limitations providing a standard output on PHP 5.2~5.4+.\n *\n * Error suppression is used as prior to PHP 5.3.3, an E_WARNING would be generated\n * when URL parsing failed.\n *\n * @since 4.4.0\n *\n * @param string $url The URL to parse.\n * @return bool|array False on failure; Array of URL components on success;\n *                    See parse_url()'s return values.\n */\nfunction wp_parse_url( $url ) {\n\t$parts = @parse_url( $url );\n\tif ( ! $parts ) {\n\t\t// < PHP 5.4.7 compat, trouble with relative paths including a scheme break in the path\n\t\tif ( '/' == $url[0] && false !== strpos( $url, '://' ) ) {\n\t\t\t// Since we know it's a relative path, prefix with a scheme/host placeholder and try again\n\t\t\tif ( ! $parts = @parse_url( 'placeholder://placeholder' . $url ) ) {\n\t\t\t\treturn $parts;\n\t\t\t}\n\t\t\t// Remove the placeholder values\n\t\t\tunset( $parts['scheme'], $parts['host'] );\n\t\t} else {\n\t\t\treturn $parts;\n\t\t}\n\t}\n\n\t// < PHP 5.4.7 compat, doesn't detect schemeless URL's host field\n\tif ( '//' == substr( $url, 0, 2 ) && ! isset( $parts['host'] ) ) {\n\t\t$path_parts = explode( '/', substr( $parts['path'], 2 ), 2 );\n\t\t$parts['host'] = $path_parts[0];\n\t\tif ( isset( $path_parts[1] ) ) {\n\t\t\t$parts['path'] = '/' . $path_parts[1];\n\t\t} else {\n\t\t\tunset( $parts['path'] );\n\t\t}\n\t}\n\n\treturn $parts;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/images/crystal/license.txt",
    "content": "Crystal Project Icons\r\nby Everaldo Coelho\r\nhttp://everaldo.com\r\n\r\nReleased under LGPL\r\n\r\nModified February 2008\r\nfor WordPress\r\nhttps://wordpress.org"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/admin-bar.js",
    "content": "/* jshint loopfunc: true */\n// use jQuery and hoverIntent if loaded\nif ( typeof(jQuery) != 'undefined' ) {\n\tif ( typeof(jQuery.fn.hoverIntent) == 'undefined' ) {\n\t\t/* jshint ignore:start */\n\t\t// hoverIntent v1.8.1 - Copy of wp-includes/js/hoverIntent.min.js\n\t\t!function(a){a.fn.hoverIntent=function(b,c,d){var e={interval:100,sensitivity:6,timeout:0};e=\"object\"==typeof b?a.extend(e,b):a.isFunction(c)?a.extend(e,{over:b,out:c,selector:d}):a.extend(e,{over:b,out:b,selector:c});var f,g,h,i,j=function(a){f=a.pageX,g=a.pageY},k=function(b,c){return c.hoverIntent_t=clearTimeout(c.hoverIntent_t),Math.sqrt((h-f)*(h-f)+(i-g)*(i-g))<e.sensitivity?(a(c).off(\"mousemove.hoverIntent\",j),c.hoverIntent_s=!0,e.over.apply(c,[b])):(h=f,i=g,c.hoverIntent_t=setTimeout(function(){k(b,c)},e.interval),void 0)},l=function(a,b){return b.hoverIntent_t=clearTimeout(b.hoverIntent_t),b.hoverIntent_s=!1,e.out.apply(b,[a])},m=function(b){var c=a.extend({},b),d=this;d.hoverIntent_t&&(d.hoverIntent_t=clearTimeout(d.hoverIntent_t)),\"mouseenter\"===b.type?(h=c.pageX,i=c.pageY,a(d).on(\"mousemove.hoverIntent\",j),d.hoverIntent_s||(d.hoverIntent_t=setTimeout(function(){k(c,d)},e.interval))):(a(d).off(\"mousemove.hoverIntent\",j),d.hoverIntent_s&&(d.hoverIntent_t=setTimeout(function(){l(c,d)},e.timeout)))};return this.on({\"mouseenter.hoverIntent\":m,\"mouseleave.hoverIntent\":m},e.selector)}}(jQuery);\n\t\t/* jshint ignore:end */\n\t}\n\tjQuery(document).ready(function($){\n\t\tvar adminbar = $('#wpadminbar'), refresh, touchOpen, touchClose, disableHoverIntent = false;\n\n\t\trefresh = function(i, el){ // force the browser to refresh the tabbing index\n\t\t\tvar node = $(el), tab = node.attr('tabindex');\n\t\t\tif ( tab )\n\t\t\t\tnode.attr('tabindex', '0').attr('tabindex', tab);\n\t\t};\n\n\t\ttouchOpen = function(unbind) {\n\t\t\tadminbar.find('li.menupop').on('click.wp-mobile-hover', function(e) {\n\t\t\t\tvar el = $(this);\n\n\t\t\t\tif ( el.parent().is('#wp-admin-bar-root-default') && !el.hasClass('hover') ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tadminbar.find('li.menupop.hover').removeClass('hover');\n\t\t\t\t\tel.addClass('hover');\n\t\t\t\t} else if ( !el.hasClass('hover') ) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tel.addClass('hover');\n\t\t\t\t} else if ( ! $( e.target ).closest( 'div' ).hasClass( 'ab-sub-wrapper' ) ) {\n\t\t\t\t\t// We're dealing with an already-touch-opened menu genericon (we know el.hasClass('hover')),\n\t\t\t\t\t// so close it on a second tap and prevent propag and defaults. See #29906\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tel.removeClass('hover');\n\t\t\t\t}\n\n\t\t\t\tif ( unbind ) {\n\t\t\t\t\t$('li.menupop').off('click.wp-mobile-hover');\n\t\t\t\t\tdisableHoverIntent = false;\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\ttouchClose = function() {\n\t\t\tvar mobileEvent = /Mobile\\/.+Safari/.test(navigator.userAgent) ? 'touchstart' : 'click';\n\t\t\t// close any open drop-downs when the click/touch is not on the toolbar\n\t\t\t$(document.body).on( mobileEvent+'.wp-mobile-hover', function(e) {\n\t\t\t\tif ( !$(e.target).closest('#wpadminbar').length )\n\t\t\t\t\tadminbar.find('li.menupop.hover').removeClass('hover');\n\t\t\t});\n\t\t};\n\n\t\tadminbar.removeClass('nojq').removeClass('nojs');\n\n\t\tif ( 'ontouchstart' in window ) {\n\t\t\tadminbar.on('touchstart', function(){\n\t\t\t\ttouchOpen(true);\n\t\t\t\tdisableHoverIntent = true;\n\t\t\t});\n\t\t\ttouchClose();\n\t\t} else if ( /IEMobile\\/[1-9]/.test(navigator.userAgent) ) {\n\t\t\ttouchOpen();\n\t\t\ttouchClose();\n\t\t}\n\n\t\tadminbar.find('li.menupop').hoverIntent({\n\t\t\tover: function() {\n\t\t\t\tif ( disableHoverIntent )\n\t\t\t\t\treturn;\n\n\t\t\t\t$(this).addClass('hover');\n\t\t\t},\n\t\t\tout: function() {\n\t\t\t\tif ( disableHoverIntent )\n\t\t\t\t\treturn;\n\n\t\t\t\t$(this).removeClass('hover');\n\t\t\t},\n\t\t\ttimeout: 180,\n\t\t\tsensitivity: 7,\n\t\t\tinterval: 100\n\t\t});\n\n\t\tif ( window.location.hash )\n\t\t\twindow.scrollBy( 0, -32 );\n\n\t\t$('#wp-admin-bar-get-shortlink').click(function(e){\n\t\t\te.preventDefault();\n\t\t\t$(this).addClass('selected').children('.shortlink-input').blur(function(){\n\t\t\t\t$(this).parents('#wp-admin-bar-get-shortlink').removeClass('selected');\n\t\t\t}).focus().select();\n\t\t});\n\n\t\t$('#wpadminbar li.menupop > .ab-item').bind('keydown.adminbar', function(e){\n\t\t\tif ( e.which != 13 )\n\t\t\t\treturn;\n\n\t\t\tvar target = $(e.target),\n\t\t\t\twrap = target.closest('.ab-sub-wrapper'),\n\t\t\t\tparentHasHover = target.parent().hasClass('hover');\n\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\n\t\t\tif ( !wrap.length )\n\t\t\t\twrap = $('#wpadminbar .quicklinks');\n\n\t\t\twrap.find('.menupop').removeClass('hover');\n\n\t\t\tif ( ! parentHasHover ) {\n\t\t\t\ttarget.parent().toggleClass('hover');\n\t\t\t}\n\n\t\t\ttarget.siblings('.ab-sub-wrapper').find('.ab-item').each(refresh);\n\t\t}).each(refresh);\n\n\t\t$('#wpadminbar .ab-item').bind('keydown.adminbar', function(e){\n\t\t\tif ( e.which != 27 )\n\t\t\t\treturn;\n\n\t\t\tvar target = $(e.target);\n\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\n\t\t\ttarget.closest('.hover').removeClass('hover').children('.ab-item').focus();\n\t\t\ttarget.siblings('.ab-sub-wrapper').find('.ab-item').each(refresh);\n\t\t});\n\n\t\tadminbar.click( function(e) {\n\t\t\tif ( e.target.id != 'wpadminbar' && e.target.id != 'wp-admin-bar-top-secondary' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tadminbar.find( 'li.menupop.hover' ).removeClass( 'hover' );\n\t\t\t$( 'html, body' ).animate( { scrollTop: 0 }, 'fast' );\n\t\t\te.preventDefault();\n\t\t});\n\n\t\t// fix focus bug in WebKit\n\t\t$('.screen-reader-shortcut').keydown( function(e) {\n\t\t\tvar id, ua;\n\n\t\t\tif ( 13 != e.which )\n\t\t\t\treturn;\n\n\t\t\tid = $( this ).attr( 'href' );\n\n\t\t\tua = navigator.userAgent.toLowerCase();\n\n\t\t\tif ( ua.indexOf('applewebkit') != -1 && id && id.charAt(0) == '#' ) {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t$(id).focus();\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t});\n\n\t\t$( '#adminbar-search' ).on({\n\t\t\tfocus: function() {\n\t\t\t\t$( '#adminbarsearch' ).addClass( 'adminbar-focused' );\n\t\t\t}, blur: function() {\n\t\t\t\t$( '#adminbarsearch' ).removeClass( 'adminbar-focused' );\n\t\t\t}\n\t\t} );\n\n\t\t// Empty sessionStorage on logging out\n\t\tif ( 'sessionStorage' in window ) {\n\t\t\t$('#wp-admin-bar-logout a').click( function() {\n\t\t\t\ttry {\n\t\t\t\t\tfor ( var key in sessionStorage ) {\n\t\t\t\t\t\tif ( key.indexOf('wp-autosave-') != -1 )\n\t\t\t\t\t\t\tsessionStorage.removeItem(key);\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {}\n\t\t\t});\n\t\t}\n\n\t\tif ( navigator.userAgent && document.body.className.indexOf( 'no-font-face' ) === -1 &&\n\t\t\t/Android (1.0|1.1|1.5|1.6|2.0|2.1)|Nokia|Opera Mini|w(eb)?OSBrowser|webOS|UCWEB|Windows Phone OS 7|XBLWP7|ZuneWP7|MSIE 7/.test( navigator.userAgent ) ) {\n\n\t\t\tdocument.body.className += ' no-font-face';\n\t\t}\n\t});\n} else {\n\t(function(d, w) {\n\t\tvar addEvent = function( obj, type, fn ) {\n\t\t\tif ( obj.addEventListener )\n\t\t\t\tobj.addEventListener(type, fn, false);\n\t\t\telse if ( obj.attachEvent )\n\t\t\t\tobj.attachEvent('on' + type, function() { return fn.call(obj, window.event);});\n\t\t},\n\n\t\taB, hc = new RegExp('\\\\bhover\\\\b', 'g'), q = [],\n\t\trselected = new RegExp('\\\\bselected\\\\b', 'g'),\n\n\t\t/**\n\t\t * Get the timeout ID of the given element\n\t\t */\n\t\tgetTOID = function(el) {\n\t\t\tvar i = q.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( q[i] && el == q[i][1] )\n\t\t\t\t\treturn q[i][0];\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\taddHoverClass = function(t) {\n\t\t\tvar i, id, inA, hovering, ul, li,\n\t\t\t\tancestors = [],\n\t\t\t\tancestorLength = 0;\n\n\t\t\twhile ( t && t != aB && t != d ) {\n\t\t\t\tif ( 'LI' == t.nodeName.toUpperCase() ) {\n\t\t\t\t\tancestors[ ancestors.length ] = t;\n\t\t\t\t\tid = getTOID(t);\n\t\t\t\t\tif ( id )\n\t\t\t\t\t\tclearTimeout( id );\n\t\t\t\t\tt.className = t.className ? ( t.className.replace(hc, '') + ' hover' ) : 'hover';\n\t\t\t\t\thovering = t;\n\t\t\t\t}\n\t\t\t\tt = t.parentNode;\n\t\t\t}\n\n\t\t\t// Remove any selected classes.\n\t\t\tif ( hovering && hovering.parentNode ) {\n\t\t\t\tul = hovering.parentNode;\n\t\t\t\tif ( ul && 'UL' == ul.nodeName.toUpperCase() ) {\n\t\t\t\t\ti = ul.childNodes.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tli = ul.childNodes[i];\n\t\t\t\t\t\tif ( li != hovering )\n\t\t\t\t\t\t\tli.className = li.className ? li.className.replace( rselected, '' ) : '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* remove the hover class for any objects not in the immediate element's ancestry */\n\t\t\ti = q.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tinA = false;\n\t\t\t\tancestorLength = ancestors.length;\n\t\t\t\twhile( ancestorLength-- ) {\n\t\t\t\t\tif ( ancestors[ ancestorLength ] == q[i][1] )\n\t\t\t\t\t\tinA = true;\n\t\t\t\t}\n\n\t\t\t\tif ( ! inA )\n\t\t\t\t\tq[i][1].className = q[i][1].className ? q[i][1].className.replace(hc, '') : '';\n\t\t\t}\n\t\t},\n\n\t\tremoveHoverClass = function(t) {\n\t\t\twhile ( t && t != aB && t != d ) {\n\t\t\t\tif ( 'LI' == t.nodeName.toUpperCase() ) {\n\t\t\t\t\t(function(t) {\n\t\t\t\t\t\tvar to = setTimeout(function() {\n\t\t\t\t\t\t\tt.className = t.className ? t.className.replace(hc, '') : '';\n\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\tq[q.length] = [to, t];\n\t\t\t\t\t})(t);\n\t\t\t\t}\n\t\t\t\tt = t.parentNode;\n\t\t\t}\n\t\t},\n\n\t\tclickShortlink = function(e) {\n\t\t\tvar i, l, node,\n\t\t\t\tt = e.target || e.srcElement;\n\n\t\t\t// Make t the shortlink menu item, or return.\n\t\t\twhile ( true ) {\n\t\t\t\t// Check if we've gone past the shortlink node,\n\t\t\t\t// or if the user is clicking on the input.\n\t\t\t\tif ( ! t || t == d || t == aB )\n\t\t\t\t\treturn;\n\t\t\t\t// Check if we've found the shortlink node.\n\t\t\t\tif ( t.id && t.id == 'wp-admin-bar-get-shortlink' )\n\t\t\t\t\tbreak;\n\t\t\t\tt = t.parentNode;\n\t\t\t}\n\n\t\t\t// IE doesn't support preventDefault, and does support returnValue\n\t\t\tif ( e.preventDefault )\n\t\t\t\te.preventDefault();\n\t\t\te.returnValue = false;\n\n\t\t\tif ( -1 == t.className.indexOf('selected') )\n\t\t\t\tt.className += ' selected';\n\n\t\t\tfor ( i = 0, l = t.childNodes.length; i < l; i++ ) {\n\t\t\t\tnode = t.childNodes[i];\n\t\t\t\tif ( node.className && -1 != node.className.indexOf('shortlink-input') ) {\n\t\t\t\t\tnode.focus();\n\t\t\t\t\tnode.select();\n\t\t\t\t\tnode.onblur = function() {\n\t\t\t\t\t\tt.className = t.className ? t.className.replace( rselected, '' ) : '';\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\n\t\tscrollToTop = function(t) {\n\t\t\tvar distance, speed, step, steps, timer, speed_step;\n\n\t\t\t// Ensure that the #wpadminbar was the target of the click.\n\t\t\tif ( t.id != 'wpadminbar' && t.id != 'wp-admin-bar-top-secondary' )\n\t\t\t\treturn;\n\n\t\t\tdistance    = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n\n\t\t\tif ( distance < 1 )\n\t\t\t\treturn;\n\n\t\t\tspeed_step = distance > 800 ? 130 : 100;\n\t\t\tspeed     = Math.min( 12, Math.round( distance / speed_step ) );\n\t\t\tstep      = distance > 800 ? Math.round( distance / 30  ) : Math.round( distance / 20  );\n\t\t\tsteps     = [];\n\t\t\ttimer     = 0;\n\n\t\t\t// Animate scrolling to the top of the page by generating steps to\n\t\t\t// the top of the page and shifting to each step at a set interval.\n\t\t\twhile ( distance ) {\n\t\t\t\tdistance -= step;\n\t\t\t\tif ( distance < 0 )\n\t\t\t\t\tdistance = 0;\n\t\t\t\tsteps.push( distance );\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\twindow.scrollTo( 0, steps.shift() );\n\t\t\t\t}, timer * speed );\n\n\t\t\t\ttimer++;\n\t\t\t}\n\t\t};\n\n\t\taddEvent(w, 'load', function() {\n\t\t\taB = d.getElementById('wpadminbar');\n\n\t\t\tif ( d.body && aB ) {\n\t\t\t\td.body.appendChild( aB );\n\n\t\t\t\tif ( aB.className )\n\t\t\t\t\taB.className = aB.className.replace(/nojs/, '');\n\n\t\t\t\taddEvent(aB, 'mouseover', function(e) {\n\t\t\t\t\taddHoverClass( e.target || e.srcElement );\n\t\t\t\t});\n\n\t\t\t\taddEvent(aB, 'mouseout', function(e) {\n\t\t\t\t\tremoveHoverClass( e.target || e.srcElement );\n\t\t\t\t});\n\n\t\t\t\taddEvent(aB, 'click', clickShortlink );\n\n\t\t\t\taddEvent(aB, 'click', function(e) {\n\t\t\t\t\tscrollToTop( e.target || e.srcElement );\n\t\t\t\t});\n\n\t\t\t\taddEvent( document.getElementById('wp-admin-bar-logout'), 'click', function() {\n\t\t\t\t\tif ( 'sessionStorage' in window ) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tfor ( var key in sessionStorage ) {\n\t\t\t\t\t\t\t\tif ( key.indexOf('wp-autosave-') != -1 )\n\t\t\t\t\t\t\t\t\tsessionStorage.removeItem(key);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch(e) {}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( w.location.hash )\n\t\t\t\tw.scrollBy(0,-32);\n\n\t\t\tif ( navigator.userAgent && document.body.className.indexOf( 'no-font-face' ) === -1 &&\n\t\t\t\t/Android (1.0|1.1|1.5|1.6|2.0|2.1)|Nokia|Opera Mini|w(eb)?OSBrowser|webOS|UCWEB|Windows Phone OS 7|XBLWP7|ZuneWP7|MSIE 7/.test( navigator.userAgent ) ) {\n\n\t\t\t\tdocument.body.className += ' no-font-face';\n\t\t\t}\n\t\t});\n\t})(document, window);\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/autosave.js",
    "content": "/* global tinymce, wpCookies, autosaveL10n, switchEditors */\n// Back-compat\nwindow.autosave = function() {\n\treturn true;\n};\n\n( function( $, window ) {\n\tfunction autosave() {\n\t\tvar initialCompareString,\n\t\tlastTriggerSave = 0,\n\t\t$document = $(document);\n\n\t\t/**\n\t\t * Returns the data saved in both local and remote autosave\n\t\t *\n\t\t * @return object Object containing the post data\n\t\t */\n\t\tfunction getPostData( type ) {\n\t\t\tvar post_name, parent_id, data,\n\t\t\t\ttime = ( new Date() ).getTime(),\n\t\t\t\tcats = [],\n\t\t\t\teditor = typeof tinymce !== 'undefined' && tinymce.get('content');\n\n\t\t\t// Don't run editor.save() more often than every 3 sec.\n\t\t\t// It is resource intensive and might slow down typing in long posts on slow devices.\n\t\t\tif ( editor && ! editor.isHidden() && time - 3000 > lastTriggerSave ) {\n\t\t\t\teditor.save();\n\t\t\t\tlastTriggerSave = time;\n\t\t\t}\n\n\t\t\tdata = {\n\t\t\t\tpost_id: $( '#post_ID' ).val() || 0,\n\t\t\t\tpost_type: $( '#post_type' ).val() || '',\n\t\t\t\tpost_author: $( '#post_author' ).val() || '',\n\t\t\t\tpost_title: $( '#title' ).val() || '',\n\t\t\t\tcontent: $( '#content' ).val() || '',\n\t\t\t\texcerpt: $( '#excerpt' ).val() || ''\n\t\t\t};\n\n\t\t\tif ( type === 'local' ) {\n\t\t\t\treturn data;\n\t\t\t}\n\n\t\t\t$( 'input[id^=\"in-category-\"]:checked' ).each( function() {\n\t\t\t\tcats.push( this.value );\n\t\t\t});\n\t\t\tdata.catslist = cats.join(',');\n\n\t\t\tif ( post_name = $( '#post_name' ).val() ) {\n\t\t\t\tdata.post_name = post_name;\n\t\t\t}\n\n\t\t\tif ( parent_id = $( '#parent_id' ).val() ) {\n\t\t\t\tdata.parent_id = parent_id;\n\t\t\t}\n\n\t\t\tif ( $( '#comment_status' ).prop( 'checked' ) ) {\n\t\t\t\tdata.comment_status = 'open';\n\t\t\t}\n\n\t\t\tif ( $( '#ping_status' ).prop( 'checked' ) ) {\n\t\t\t\tdata.ping_status = 'open';\n\t\t\t}\n\n\t\t\tif ( $( '#auto_draft' ).val() === '1' ) {\n\t\t\t\tdata.auto_draft = '1';\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Concatenate title, content and excerpt. Used to track changes when auto-saving.\n\t\tfunction getCompareString( postData ) {\n\t\t\tif ( typeof postData === 'object' ) {\n\t\t\t\treturn ( postData.post_title || '' ) + '::' + ( postData.content || '' ) + '::' + ( postData.excerpt || '' );\n\t\t\t}\n\n\t\t\treturn ( $('#title').val() || '' ) + '::' + ( $('#content').val() || '' ) + '::' + ( $('#excerpt').val() || '' );\n\t\t}\n\n\t\tfunction disableButtons() {\n\t\t\t$document.trigger('autosave-disable-buttons');\n\t\t\t// Re-enable 5 sec later. Just gives autosave a head start to avoid collisions.\n\t\t\tsetTimeout( enableButtons, 5000 );\n\t\t}\n\n\t\tfunction enableButtons() {\n\t\t\t$document.trigger( 'autosave-enable-buttons' );\n\t\t}\n\n\t\t// Autosave in localStorage\n\t\tfunction autosaveLocal() {\n\t\t\tvar restorePostData, undoPostData, blog_id, post_id, hasStorage, intervalTimer,\n\t\t\t\tlastCompareString,\n\t\t\t\tisSuspended = false;\n\n\t\t\t// Check if the browser supports sessionStorage and it's not disabled\n\t\t\tfunction checkStorage() {\n\t\t\t\tvar test = Math.random().toString(),\n\t\t\t\t\tresult = false;\n\n\t\t\t\ttry {\n\t\t\t\t\twindow.sessionStorage.setItem( 'wp-test', test );\n\t\t\t\t\tresult = window.sessionStorage.getItem( 'wp-test' ) === test;\n\t\t\t\t\twindow.sessionStorage.removeItem( 'wp-test' );\n\t\t\t\t} catch(e) {}\n\n\t\t\t\thasStorage = result;\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Initialize the local storage\n\t\t\t *\n\t\t\t * @return mixed False if no sessionStorage in the browser or an Object containing all postData for this blog\n\t\t\t */\n\t\t\tfunction getStorage() {\n\t\t\t\tvar stored_obj = false;\n\t\t\t\t// Separate local storage containers for each blog_id\n\t\t\t\tif ( hasStorage && blog_id ) {\n\t\t\t\t\tstored_obj = sessionStorage.getItem( 'wp-autosave-' + blog_id );\n\n\t\t\t\t\tif ( stored_obj ) {\n\t\t\t\t\t\tstored_obj = JSON.parse( stored_obj );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstored_obj = {};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn stored_obj;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Set the storage for this blog\n\t\t\t *\n\t\t\t * Confirms that the data was saved successfully.\n\t\t\t *\n\t\t\t * @return bool\n\t\t\t */\n\t\t\tfunction setStorage( stored_obj ) {\n\t\t\t\tvar key;\n\n\t\t\t\tif ( hasStorage && blog_id ) {\n\t\t\t\t\tkey = 'wp-autosave-' + blog_id;\n\t\t\t\t\tsessionStorage.setItem( key, JSON.stringify( stored_obj ) );\n\t\t\t\t\treturn sessionStorage.getItem( key ) !== null;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Get the saved post data for the current post\n\t\t\t *\n\t\t\t * @return mixed False if no storage or no data or the postData as an Object\n\t\t\t */\n\t\t\tfunction getSavedPostData() {\n\t\t\t\tvar stored = getStorage();\n\n\t\t\t\tif ( ! stored || ! post_id ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn stored[ 'post_' + post_id ] || false;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Set (save or delete) post data in the storage.\n\t\t\t *\n\t\t\t * If stored_data evaluates to 'false' the storage key for the current post will be removed\n\t\t\t *\n\t\t\t * $param stored_data The post data to store or null/false/empty to delete the key\n\t\t\t * @return bool\n\t\t\t */\n\t\t\tfunction setData( stored_data ) {\n\t\t\t\tvar stored = getStorage();\n\n\t\t\t\tif ( ! stored || ! post_id ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( stored_data ) {\n\t\t\t\t\tstored[ 'post_' + post_id ] = stored_data;\n\t\t\t\t} else if ( stored.hasOwnProperty( 'post_' + post_id ) ) {\n\t\t\t\t\tdelete stored[ 'post_' + post_id ];\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn setStorage( stored );\n\t\t\t}\n\n\t\t\tfunction suspend() {\n\t\t\t\tisSuspended = true;\n\t\t\t}\n\n\t\t\tfunction resume() {\n\t\t\t\tisSuspended = false;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Save post data for the current post\n\t\t\t *\n\t\t\t * Runs on a 15 sec. interval, saves when there are differences in the post title or content.\n\t\t\t * When the optional data is provided, updates the last saved post data.\n\t\t\t *\n\t\t\t * $param data optional Object The post data for saving, minimum 'post_title' and 'content'\n\t\t\t * @return bool\n\t\t\t */\n\t\t\tfunction save( data ) {\n\t\t\t\tvar postData, compareString,\n\t\t\t\t\tresult = false;\n\n\t\t\t\tif ( isSuspended || ! hasStorage ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tpostData = getSavedPostData() || {};\n\t\t\t\t\t$.extend( postData, data );\n\t\t\t\t} else {\n\t\t\t\t\tpostData = getPostData('local');\n\t\t\t\t}\n\n\t\t\t\tcompareString = getCompareString( postData );\n\n\t\t\t\tif ( typeof lastCompareString === 'undefined' ) {\n\t\t\t\t\tlastCompareString = initialCompareString;\n\t\t\t\t}\n\n\t\t\t\t// If the content, title and excerpt did not change since the last save, don't save again\n\t\t\t\tif ( compareString === lastCompareString ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tpostData.save_time = ( new Date() ).getTime();\n\t\t\t\tpostData.status = $( '#post_status' ).val() || '';\n\t\t\t\tresult = setData( postData );\n\n\t\t\t\tif ( result ) {\n\t\t\t\t\tlastCompareString = compareString;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t// Run on DOM ready\n\t\t\tfunction run() {\n\t\t\t\tpost_id = $('#post_ID').val() || 0;\n\n\t\t\t\t// Check if the local post data is different than the loaded post data.\n\t\t\t\tif ( $( '#wp-content-wrap' ).hasClass( 'tmce-active' ) ) {\n\t\t\t\t\t// If TinyMCE loads first, check the post 1.5 sec. after it is ready.\n\t\t\t\t\t// By this time the content has been loaded in the editor and 'saved' to the textarea.\n\t\t\t\t\t// This prevents false positives.\n\t\t\t\t\t$document.on( 'tinymce-editor-init.autosave', function() {\n\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\tcheckPost();\n\t\t\t\t\t\t}, 1500 );\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tcheckPost();\n\t\t\t\t}\n\n\t\t\t\t// Save every 15 sec.\n\t\t\t\tintervalTimer = window.setInterval( save, 15000 );\n\n\t\t\t\t$( 'form#post' ).on( 'submit.autosave-local', function() {\n\t\t\t\t\tvar editor = typeof tinymce !== 'undefined' && tinymce.get('content'),\n\t\t\t\t\t\tpost_id = $('#post_ID').val() || 0;\n\n\t\t\t\t\tif ( editor && ! editor.isHidden() ) {\n\t\t\t\t\t\t// Last onSubmit event in the editor, needs to run after the content has been moved to the textarea.\n\t\t\t\t\t\teditor.on( 'submit', function() {\n\t\t\t\t\t\t\tsave({\n\t\t\t\t\t\t\t\tpost_title: $( '#title' ).val() || '',\n\t\t\t\t\t\t\t\tcontent: $( '#content' ).val() || '',\n\t\t\t\t\t\t\t\texcerpt: $( '#excerpt' ).val() || ''\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsave({\n\t\t\t\t\t\t\tpost_title: $( '#title' ).val() || '',\n\t\t\t\t\t\t\tcontent: $( '#content' ).val() || '',\n\t\t\t\t\t\t\texcerpt: $( '#excerpt' ).val() || ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tvar secure = ( 'https:' === window.location.protocol );\n\t\t\t\t\twpCookies.set( 'wp-saving-post', post_id + '-check', 24 * 60 * 60, false, false, secure );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Strip whitespace and compare two strings\n\t\t\tfunction compare( str1, str2 ) {\n\t\t\t\tfunction removeSpaces( string ) {\n\t\t\t\t\treturn string.toString().replace(/[\\x20\\t\\r\\n\\f]+/g, '');\n\t\t\t\t}\n\n\t\t\t\treturn ( removeSpaces( str1 || '' ) === removeSpaces( str2 || '' ) );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Check if the saved data for the current post (if any) is different than the loaded post data on the screen\n\t\t\t *\n\t\t\t * Shows a standard message letting the user restore the post data if different.\n\t\t\t *\n\t\t\t * @return void\n\t\t\t */\n\t\t\tfunction checkPost() {\n\t\t\t\tvar content, post_title, excerpt, $notice,\n\t\t\t\t\tpostData = getSavedPostData(),\n\t\t\t\t\tcookie = wpCookies.get( 'wp-saving-post' );\n\n\t\t\t\tif ( cookie === post_id + '-saved' ) {\n\t\t\t\t\twpCookies.remove( 'wp-saving-post' );\n\t\t\t\t\t// The post was saved properly, remove old data and bail\n\t\t\t\t\tsetData( false );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( ! postData ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// There is a newer autosave. Don't show two \"restore\" notices at the same time.\n\t\t\t\tif ( $( '#has-newer-autosave' ).length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcontent = $( '#content' ).val() || '';\n\t\t\t\tpost_title = $( '#title' ).val() || '';\n\t\t\t\texcerpt = $( '#excerpt' ).val() || '';\n\n\t\t\t\tif ( compare( content, postData.content ) && compare( post_title, postData.post_title ) &&\n\t\t\t\t\tcompare( excerpt, postData.excerpt ) ) {\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\trestorePostData = postData;\n\t\t\t\tundoPostData = {\n\t\t\t\t\tcontent: content,\n\t\t\t\t\tpost_title: post_title,\n\t\t\t\t\texcerpt: excerpt\n\t\t\t\t};\n\n\t\t\t\t$notice = $( '#local-storage-notice' )\n\t\t\t\t\t.insertAfter( $( '.wrap h1, .wrap h2' ).first() )\n\t\t\t\t\t.addClass( 'notice-warning' )\n\t\t\t\t\t.show();\n\n\t\t\t\t$notice.on( 'click.autosave-local', function( event ) {\n\t\t\t\t\tvar $target = $( event.target );\n\n\t\t\t\t\tif ( $target.hasClass( 'restore-backup' ) ) {\n\t\t\t\t\t\trestorePost( restorePostData );\n\t\t\t\t\t\t$target.parent().hide();\n\t\t\t\t\t\t$(this).find( 'p.undo-restore' ).show();\n\t\t\t\t\t\t$notice.removeClass( 'notice-warning' ).addClass( 'notice-success' );\n\t\t\t\t\t} else if ( $target.hasClass( 'undo-restore-backup' ) ) {\n\t\t\t\t\t\trestorePost( undoPostData );\n\t\t\t\t\t\t$target.parent().hide();\n\t\t\t\t\t\t$(this).find( 'p.local-restore' ).show();\n\t\t\t\t\t\t$notice.removeClass( 'notice-success' ).addClass( 'notice-warning' );\n\t\t\t\t\t}\n\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Restore the current title, content and excerpt from postData.\n\t\t\tfunction restorePost( postData ) {\n\t\t\t\tvar editor;\n\n\t\t\t\tif ( postData ) {\n\t\t\t\t\t// Set the last saved data\n\t\t\t\t\tlastCompareString = getCompareString( postData );\n\n\t\t\t\t\tif ( $( '#title' ).val() !== postData.post_title ) {\n\t\t\t\t\t\t$( '#title' ).focus().val( postData.post_title || '' );\n\t\t\t\t\t}\n\n\t\t\t\t\t$( '#excerpt' ).val( postData.excerpt || '' );\n\t\t\t\t\teditor = typeof tinymce !== 'undefined' && tinymce.get('content');\n\n\t\t\t\t\tif ( editor && ! editor.isHidden() && typeof switchEditors !== 'undefined' ) {\n\t\t\t\t\t\t// Make sure there's an undo level in the editor\n\t\t\t\t\t\teditor.undoManager.add();\n\t\t\t\t\t\teditor.setContent( postData.content ? switchEditors.wpautop( postData.content ) : '' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Make sure the Text editor is selected\n\t\t\t\t\t\t$( '#content-html' ).click();\n\t\t\t\t\t\t$( '#content' ).val( postData.content );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tblog_id = typeof window.autosaveL10n !== 'undefined' && window.autosaveL10n.blog_id;\n\n\t\t\t// Check if the browser supports sessionStorage and it's not disabled,\n\t\t\t// then initialize and run checkPost().\n\t\t\t// Don't run if the post type supports neither 'editor' (textarea#content) nor 'excerpt'.\n\t\t\tif ( checkStorage() && blog_id && ( $('#content').length || $('#excerpt').length ) ) {\n\t\t\t\t$document.ready( run );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\thasStorage: hasStorage,\n\t\t\t\tgetSavedPostData: getSavedPostData,\n\t\t\t\tsave: save,\n\t\t\t\tsuspend: suspend,\n\t\t\t\tresume: resume\n\t\t\t};\n\t\t}\n\n\t\t// Autosave on the server\n\t\tfunction autosaveServer() {\n\t\t\tvar _blockSave, _blockSaveTimer, previousCompareString, lastCompareString,\n\t\t\t\tnextRun = 0,\n\t\t\t\tisSuspended = false;\n\n\t\t\t// Block saving for the next 10 sec.\n\t\t\tfunction tempBlockSave() {\n\t\t\t\t_blockSave = true;\n\t\t\t\twindow.clearTimeout( _blockSaveTimer );\n\n\t\t\t\t_blockSaveTimer = window.setTimeout( function() {\n\t\t\t\t\t_blockSave = false;\n\t\t\t\t}, 10000 );\n\t\t\t}\n\n\t\t\tfunction suspend() {\n\t\t\t\tisSuspended = true;\n\t\t\t}\n\n\t\t\tfunction resume() {\n\t\t\t\tisSuspended = false;\n\t\t\t}\n\n\t\t\t// Runs on heartbeat-response\n\t\t\tfunction response( data ) {\n\t\t\t\t_schedule();\n\t\t\t\t_blockSave = false;\n\t\t\t\tlastCompareString = previousCompareString;\n\t\t\t\tpreviousCompareString = '';\n\n\t\t\t\t$document.trigger( 'after-autosave', [data] );\n\t\t\t\tenableButtons();\n\n\t\t\t\tif ( data.success ) {\n\t\t\t\t\t// No longer an auto-draft\n\t\t\t\t\t$( '#auto_draft' ).val('');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Save immediately\n\t\t\t *\n\t\t\t * Resets the timing and tells heartbeat to connect now\n\t\t\t *\n\t\t\t * @return void\n\t\t\t */\n\t\t\tfunction triggerSave() {\n\t\t\t\tnextRun = 0;\n\t\t\t\twp.heartbeat.connectNow();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Checks if the post content in the textarea has changed since page load.\n\t\t\t *\n\t\t\t * This also happens when TinyMCE is active and editor.save() is triggered by\n\t\t\t * wp.autosave.getPostData().\n\t\t\t *\n\t\t\t * @return bool\n\t\t\t */\n\t\t\tfunction postChanged() {\n\t\t\t\treturn getCompareString() !== initialCompareString;\n\t\t\t}\n\n\t\t\t// Runs on 'heartbeat-send'\n\t\t\tfunction save() {\n\t\t\t\tvar postData, compareString;\n\n\t\t\t\t// window.autosave() used for back-compat\n\t\t\t\tif ( isSuspended || _blockSave || ! window.autosave() ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( ( new Date() ).getTime() < nextRun ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tpostData = getPostData();\n\t\t\t\tcompareString = getCompareString( postData );\n\n\t\t\t\t// First check\n\t\t\t\tif ( typeof lastCompareString === 'undefined' ) {\n\t\t\t\t\tlastCompareString = initialCompareString;\n\t\t\t\t}\n\n\t\t\t\t// No change\n\t\t\t\tif ( compareString === lastCompareString ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tpreviousCompareString = compareString;\n\t\t\t\ttempBlockSave();\n\t\t\t\tdisableButtons();\n\n\t\t\t\t$document.trigger( 'wpcountwords', [ postData.content ] )\n\t\t\t\t\t.trigger( 'before-autosave', [ postData ] );\n\n\t\t\t\tpostData._wpnonce = $( '#_wpnonce' ).val() || '';\n\n\t\t\t\treturn postData;\n\t\t\t}\n\n\t\t\tfunction _schedule() {\n\t\t\t\tnextRun = ( new Date() ).getTime() + ( autosaveL10n.autosaveInterval * 1000 ) || 60000;\n\t\t\t}\n\n\t\t\t$document.on( 'heartbeat-send.autosave', function( event, data ) {\n\t\t\t\tvar autosaveData = save();\n\n\t\t\t\tif ( autosaveData ) {\n\t\t\t\t\tdata.wp_autosave = autosaveData;\n\t\t\t\t}\n\t\t\t}).on( 'heartbeat-tick.autosave', function( event, data ) {\n\t\t\t\tif ( data.wp_autosave ) {\n\t\t\t\t\tresponse( data.wp_autosave );\n\t\t\t\t}\n\t\t\t}).on( 'heartbeat-connection-lost.autosave', function( event, error, status ) {\n\t\t\t\t// When connection is lost, keep user from submitting changes.\n\t\t\t\tif ( 'timeout' === error || 603 === status ) {\n\t\t\t\t\tvar $notice = $('#lost-connection-notice');\n\n\t\t\t\t\tif ( ! wp.autosave.local.hasStorage ) {\n\t\t\t\t\t\t$notice.find('.hide-if-no-sessionstorage').hide();\n\t\t\t\t\t}\n\n\t\t\t\t\t$notice.show();\n\t\t\t\t\tdisableButtons();\n\t\t\t\t}\n\t\t\t}).on( 'heartbeat-connection-restored.autosave', function() {\n\t\t\t\t$('#lost-connection-notice').hide();\n\t\t\t\tenableButtons();\n\t\t\t}).ready( function() {\n\t\t\t\t_schedule();\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\ttempBlockSave: tempBlockSave,\n\t\t\t\ttriggerSave: triggerSave,\n\t\t\t\tpostChanged: postChanged,\n\t\t\t\tsuspend: suspend,\n\t\t\t\tresume: resume\n\t\t\t};\n\t\t}\n\n\t\t// Wait for TinyMCE to initialize plus 1 sec. for any external css to finish loading,\n\t\t// then 'save' to the textarea before setting initialCompareString.\n\t\t// This avoids any insignificant differences between the initial textarea content and the content\n\t\t// extracted from the editor.\n\t\t$document.on( 'tinymce-editor-init.autosave', function( event, editor ) {\n\t\t\tif ( editor.id === 'content' ) {\n\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\teditor.save();\n\t\t\t\t\tinitialCompareString = getCompareString();\n\t\t\t\t}, 1000 );\n\t\t\t}\n\t\t}).ready( function() {\n\t\t\t// Set the initial compare string in case TinyMCE is not used or not loaded first\n\t\t\tinitialCompareString = getCompareString();\n\t\t});\n\n\t\treturn {\n\t\t\tgetPostData: getPostData,\n\t\t\tgetCompareString: getCompareString,\n\t\t\tdisableButtons: disableButtons,\n\t\t\tenableButtons: enableButtons,\n\t\t\tlocal: autosaveLocal(),\n\t\t\tserver: autosaveServer()\n\t\t};\n\t}\n\n\twindow.wp = window.wp || {};\n\twindow.wp.autosave = autosave();\n\n}( jQuery, window ));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/colorpicker.js",
    "content": "// ===================================================================\n// Author: Matt Kruse <matt@mattkruse.com>\n// WWW: http://www.mattkruse.com/\n//\n// NOTICE: You may use this code for any purpose, commercial or\n// private, without any further permission from the author. You may\n// remove this notice from your final code if you wish, however it is\n// appreciated by the author if at least my web site address is kept.\n//\n// You may *NOT* re-distribute this code in any way except through its\n// use. That means, you can include it in your product, or your web\n// site, or any other form where the code is actually being used. You\n// may not put the plain javascript up on your site for download or\n// include it in your javascript libraries for download.\n// If you wish to share this code with others, please just point them\n// to the URL instead.\n// Please DO NOT link directly to my .js files from your site. Copy\n// the files to your server and use them there. Thank you.\n// ===================================================================\n\n\n/* SOURCE FILE: AnchorPosition.js */\n\n/*\nAnchorPosition.js\nAuthor: Matt Kruse\nLast modified: 10/11/02\n\nDESCRIPTION: These functions find the position of an <A> tag in a document,\nso other elements can be positioned relative to it.\n\nCOMPATABILITY: Netscape 4.x,6.x,Mozilla, IE 5.x,6.x on Windows. Some small\npositioning errors - usually with Window positioning - occur on the\nMacintosh platform.\n\nFUNCTIONS:\ngetAnchorPosition(anchorname)\n  Returns an Object() having .x and .y properties of the pixel coordinates\n  of the upper-left corner of the anchor. Position is relative to the PAGE.\n\ngetAnchorWindowPosition(anchorname)\n  Returns an Object() having .x and .y properties of the pixel coordinates\n  of the upper-left corner of the anchor, relative to the WHOLE SCREEN.\n\nNOTES:\n\n1) For popping up separate browser windows, use getAnchorWindowPosition.\n   Otherwise, use getAnchorPosition\n\n2) Your anchor tag MUST contain both NAME and ID attributes which are the\n   same. For example:\n   <A NAME=\"test\" ID=\"test\"> </A>\n\n3) There must be at least a space between <A> </A> for IE5.5 to see the\n   anchor tag correctly. Do not do <A></A> with no space.\n*/\n\n// getAnchorPosition(anchorname)\n//   This function returns an object having .x and .y properties which are the coordinates\n//   of the named anchor, relative to the page.\nfunction getAnchorPosition(anchorname) {\n\t// This function will return an Object with x and y properties\n\tvar useWindow=false;\n\tvar coordinates=new Object();\n\tvar x=0,y=0;\n\t// Browser capability sniffing\n\tvar use_gebi=false, use_css=false, use_layers=false;\n\tif (document.getElementById) { use_gebi=true; }\n\telse if (document.all) { use_css=true; }\n\telse if (document.layers) { use_layers=true; }\n\t// Logic to find position\n \tif (use_gebi && document.all) {\n\t\tx=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);\n\t\ty=AnchorPosition_getPageOffsetTop(document.all[anchorname]);\n\t\t}\n\telse if (use_gebi) {\n\t\tvar o=document.getElementById(anchorname);\n\t\tx=AnchorPosition_getPageOffsetLeft(o);\n\t\ty=AnchorPosition_getPageOffsetTop(o);\n\t\t}\n \telse if (use_css) {\n\t\tx=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);\n\t\ty=AnchorPosition_getPageOffsetTop(document.all[anchorname]);\n\t\t}\n\telse if (use_layers) {\n\t\tvar found=0;\n\t\tfor (var i=0; i<document.anchors.length; i++) {\n\t\t\tif (document.anchors[i].name==anchorname) { found=1; break; }\n\t\t\t}\n\t\tif (found==0) {\n\t\t\tcoordinates.x=0; coordinates.y=0; return coordinates;\n\t\t\t}\n\t\tx=document.anchors[i].x;\n\t\ty=document.anchors[i].y;\n\t\t}\n\telse {\n\t\tcoordinates.x=0; coordinates.y=0; return coordinates;\n\t\t}\n\tcoordinates.x=x;\n\tcoordinates.y=y;\n\treturn coordinates;\n\t}\n\n// getAnchorWindowPosition(anchorname)\n//   This function returns an object having .x and .y properties which are the coordinates\n//   of the named anchor, relative to the window\nfunction getAnchorWindowPosition(anchorname) {\n\tvar coordinates=getAnchorPosition(anchorname);\n\tvar x=0;\n\tvar y=0;\n\tif (document.getElementById) {\n\t\tif (isNaN(window.screenX)) {\n\t\t\tx=coordinates.x-document.body.scrollLeft+window.screenLeft;\n\t\t\ty=coordinates.y-document.body.scrollTop+window.screenTop;\n\t\t\t}\n\t\telse {\n\t\t\tx=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;\n\t\t\ty=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;\n\t\t\t}\n\t\t}\n\telse if (document.all) {\n\t\tx=coordinates.x-document.body.scrollLeft+window.screenLeft;\n\t\ty=coordinates.y-document.body.scrollTop+window.screenTop;\n\t\t}\n\telse if (document.layers) {\n\t\tx=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;\n\t\ty=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;\n\t\t}\n\tcoordinates.x=x;\n\tcoordinates.y=y;\n\treturn coordinates;\n\t}\n\n// Functions for IE to get position of an object\nfunction AnchorPosition_getPageOffsetLeft (el) {\n\tvar ol=el.offsetLeft;\n\twhile ((el=el.offsetParent) != null) { ol += el.offsetLeft; }\n\treturn ol;\n\t}\nfunction AnchorPosition_getWindowOffsetLeft (el) {\n\treturn AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft;\n\t}\nfunction AnchorPosition_getPageOffsetTop (el) {\n\tvar ot=el.offsetTop;\n\twhile((el=el.offsetParent) != null) { ot += el.offsetTop; }\n\treturn ot;\n\t}\nfunction AnchorPosition_getWindowOffsetTop (el) {\n\treturn AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop;\n\t}\n\n/* SOURCE FILE: PopupWindow.js */\n\n/*\nPopupWindow.js\nAuthor: Matt Kruse\nLast modified: 02/16/04\n\nDESCRIPTION: This object allows you to easily and quickly popup a window\nin a certain place. The window can either be a DIV or a separate browser\nwindow.\n\nCOMPATABILITY: Works with Netscape 4.x, 6.x, IE 5.x on Windows. Some small\npositioning errors - usually with Window positioning - occur on the\nMacintosh platform. Due to bugs in Netscape 4.x, populating the popup\nwindow with <STYLE> tags may cause errors.\n\nUSAGE:\n// Create an object for a WINDOW popup\nvar win = new PopupWindow();\n\n// Create an object for a DIV window using the DIV named 'mydiv'\nvar win = new PopupWindow('mydiv');\n\n// Set the window to automatically hide itself when the user clicks\n// anywhere else on the page except the popup\nwin.autoHide();\n\n// Show the window relative to the anchor name passed in\nwin.showPopup(anchorname);\n\n// Hide the popup\nwin.hidePopup();\n\n// Set the size of the popup window (only applies to WINDOW popups\nwin.setSize(width,height);\n\n// Populate the contents of the popup window that will be shown. If you\n// change the contents while it is displayed, you will need to refresh()\nwin.populate(string);\n\n// set the URL of the window, rather than populating its contents\n// manually\nwin.setUrl(\"http://www.site.com/\");\n\n// Refresh the contents of the popup\nwin.refresh();\n\n// Specify how many pixels to the right of the anchor the popup will appear\nwin.offsetX = 50;\n\n// Specify how many pixels below the anchor the popup will appear\nwin.offsetY = 100;\n\nNOTES:\n1) Requires the functions in AnchorPosition.js\n\n2) Your anchor tag MUST contain both NAME and ID attributes which are the\n   same. For example:\n   <A NAME=\"test\" ID=\"test\"> </A>\n\n3) There must be at least a space between <A> </A> for IE5.5 to see the\n   anchor tag correctly. Do not do <A></A> with no space.\n\n4) When a PopupWindow object is created, a handler for 'onmouseup' is\n   attached to any event handler you may have already defined. Do NOT define\n   an event handler for 'onmouseup' after you define a PopupWindow object or\n   the autoHide() will not work correctly.\n*/\n\n// Set the position of the popup window based on the anchor\nfunction PopupWindow_getXYPosition(anchorname) {\n\tvar coordinates;\n\tif (this.type == \"WINDOW\") {\n\t\tcoordinates = getAnchorWindowPosition(anchorname);\n\t\t}\n\telse {\n\t\tcoordinates = getAnchorPosition(anchorname);\n\t\t}\n\tthis.x = coordinates.x;\n\tthis.y = coordinates.y;\n\t}\n// Set width/height of DIV/popup window\nfunction PopupWindow_setSize(width,height) {\n\tthis.width = width;\n\tthis.height = height;\n\t}\n// Fill the window with contents\nfunction PopupWindow_populate(contents) {\n\tthis.contents = contents;\n\tthis.populated = false;\n\t}\n// Set the URL to go to\nfunction PopupWindow_setUrl(url) {\n\tthis.url = url;\n\t}\n// Set the window popup properties\nfunction PopupWindow_setWindowProperties(props) {\n\tthis.windowProperties = props;\n\t}\n// Refresh the displayed contents of the popup\nfunction PopupWindow_refresh() {\n\tif (this.divName != null) {\n\t\t// refresh the DIV object\n\t\tif (this.use_gebi) {\n\t\t\tdocument.getElementById(this.divName).innerHTML = this.contents;\n\t\t\t}\n\t\telse if (this.use_css) {\n\t\t\tdocument.all[this.divName].innerHTML = this.contents;\n\t\t\t}\n\t\telse if (this.use_layers) {\n\t\t\tvar d = document.layers[this.divName];\n\t\t\td.document.open();\n\t\t\td.document.writeln(this.contents);\n\t\t\td.document.close();\n\t\t\t}\n\t\t}\n\telse {\n\t\tif (this.popupWindow != null && !this.popupWindow.closed) {\n\t\t\tif (this.url!=\"\") {\n\t\t\t\tthis.popupWindow.location.href=this.url;\n\t\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.popupWindow.document.open();\n\t\t\t\tthis.popupWindow.document.writeln(this.contents);\n\t\t\t\tthis.popupWindow.document.close();\n\t\t\t}\n\t\t\tthis.popupWindow.focus();\n\t\t\t}\n\t\t}\n\t}\n// Position and show the popup, relative to an anchor object\nfunction PopupWindow_showPopup(anchorname) {\n\tthis.getXYPosition(anchorname);\n\tthis.x += this.offsetX;\n\tthis.y += this.offsetY;\n\tif (!this.populated && (this.contents != \"\")) {\n\t\tthis.populated = true;\n\t\tthis.refresh();\n\t\t}\n\tif (this.divName != null) {\n\t\t// Show the DIV object\n\t\tif (this.use_gebi) {\n\t\t\tdocument.getElementById(this.divName).style.left = this.x + \"px\";\n\t\t\tdocument.getElementById(this.divName).style.top = this.y;\n\t\t\tdocument.getElementById(this.divName).style.visibility = \"visible\";\n\t\t\t}\n\t\telse if (this.use_css) {\n\t\t\tdocument.all[this.divName].style.left = this.x;\n\t\t\tdocument.all[this.divName].style.top = this.y;\n\t\t\tdocument.all[this.divName].style.visibility = \"visible\";\n\t\t\t}\n\t\telse if (this.use_layers) {\n\t\t\tdocument.layers[this.divName].left = this.x;\n\t\t\tdocument.layers[this.divName].top = this.y;\n\t\t\tdocument.layers[this.divName].visibility = \"visible\";\n\t\t\t}\n\t\t}\n\telse {\n\t\tif (this.popupWindow == null || this.popupWindow.closed) {\n\t\t\t// If the popup window will go off-screen, move it so it doesn't\n\t\t\tif (this.x<0) { this.x=0; }\n\t\t\tif (this.y<0) { this.y=0; }\n\t\t\tif (screen && screen.availHeight) {\n\t\t\t\tif ((this.y + this.height) > screen.availHeight) {\n\t\t\t\t\tthis.y = screen.availHeight - this.height;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tif (screen && screen.availWidth) {\n\t\t\t\tif ((this.x + this.width) > screen.availWidth) {\n\t\t\t\t\tthis.x = screen.availWidth - this.width;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tvar avoidAboutBlank = window.opera || ( document.layers && !navigator.mimeTypes['*'] ) || navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled );\n\t\t\tthis.popupWindow = window.open(avoidAboutBlank?\"\":\"about:blank\",\"window_\"+anchorname,this.windowProperties+\",width=\"+this.width+\",height=\"+this.height+\",screenX=\"+this.x+\",left=\"+this.x+\",screenY=\"+this.y+\",top=\"+this.y+\"\");\n\t\t\t}\n\t\tthis.refresh();\n\t\t}\n\t}\n// Hide the popup\nfunction PopupWindow_hidePopup() {\n\tif (this.divName != null) {\n\t\tif (this.use_gebi) {\n\t\t\tdocument.getElementById(this.divName).style.visibility = \"hidden\";\n\t\t\t}\n\t\telse if (this.use_css) {\n\t\t\tdocument.all[this.divName].style.visibility = \"hidden\";\n\t\t\t}\n\t\telse if (this.use_layers) {\n\t\t\tdocument.layers[this.divName].visibility = \"hidden\";\n\t\t\t}\n\t\t}\n\telse {\n\t\tif (this.popupWindow && !this.popupWindow.closed) {\n\t\t\tthis.popupWindow.close();\n\t\t\tthis.popupWindow = null;\n\t\t\t}\n\t\t}\n\t}\n// Pass an event and return whether or not it was the popup DIV that was clicked\nfunction PopupWindow_isClicked(e) {\n\tif (this.divName != null) {\n\t\tif (this.use_layers) {\n\t\t\tvar clickX = e.pageX;\n\t\t\tvar clickY = e.pageY;\n\t\t\tvar t = document.layers[this.divName];\n\t\t\tif ((clickX > t.left) && (clickX < t.left+t.clip.width) && (clickY > t.top) && (clickY < t.top+t.clip.height)) {\n\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\telse { return false; }\n\t\t\t}\n\t\telse if (document.all) { // Need to hard-code this to trap IE for error-handling\n\t\t\tvar t = window.event.srcElement;\n\t\t\twhile (t.parentElement != null) {\n\t\t\t\tif (t.id==this.divName) {\n\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\tt = t.parentElement;\n\t\t\t\t}\n\t\t\treturn false;\n\t\t\t}\n\t\telse if (this.use_gebi && e) {\n\t\t\tvar t = e.originalTarget;\n\t\t\twhile (t.parentNode != null) {\n\t\t\t\tif (t.id==this.divName) {\n\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\tt = t.parentNode;\n\t\t\t\t}\n\t\t\treturn false;\n\t\t\t}\n\t\treturn false;\n\t\t}\n\treturn false;\n\t}\n\n// Check an onMouseDown event to see if we should hide\nfunction PopupWindow_hideIfNotClicked(e) {\n\tif (this.autoHideEnabled && !this.isClicked(e)) {\n\t\tthis.hidePopup();\n\t\t}\n\t}\n// Call this to make the DIV disable automatically when mouse is clicked outside it\nfunction PopupWindow_autoHide() {\n\tthis.autoHideEnabled = true;\n\t}\n// This global function checks all PopupWindow objects onmouseup to see if they should be hidden\nfunction PopupWindow_hidePopupWindows(e) {\n\tfor (var i=0; i<popupWindowObjects.length; i++) {\n\t\tif (popupWindowObjects[i] != null) {\n\t\t\tvar p = popupWindowObjects[i];\n\t\t\tp.hideIfNotClicked(e);\n\t\t\t}\n\t\t}\n\t}\n// Run this immediately to attach the event listener\nfunction PopupWindow_attachListener() {\n\tif (document.layers) {\n\t\tdocument.captureEvents(Event.MOUSEUP);\n\t\t}\n\twindow.popupWindowOldEventListener = document.onmouseup;\n\tif (window.popupWindowOldEventListener != null) {\n\t\tdocument.onmouseup = new Function(\"window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();\");\n\t\t}\n\telse {\n\t\tdocument.onmouseup = PopupWindow_hidePopupWindows;\n\t\t}\n\t}\n// CONSTRUCTOR for the PopupWindow object\n// Pass it a DIV name to use a DHTML popup, otherwise will default to window popup\nfunction PopupWindow() {\n\tif (!window.popupWindowIndex) { window.popupWindowIndex = 0; }\n\tif (!window.popupWindowObjects) { window.popupWindowObjects = new Array(); }\n\tif (!window.listenerAttached) {\n\t\twindow.listenerAttached = true;\n\t\tPopupWindow_attachListener();\n\t\t}\n\tthis.index = popupWindowIndex++;\n\tpopupWindowObjects[this.index] = this;\n\tthis.divName = null;\n\tthis.popupWindow = null;\n\tthis.width=0;\n\tthis.height=0;\n\tthis.populated = false;\n\tthis.visible = false;\n\tthis.autoHideEnabled = false;\n\n\tthis.contents = \"\";\n\tthis.url=\"\";\n\tthis.windowProperties=\"toolbar=no,location=no,status=no,menubar=no,scrollbars=auto,resizable,alwaysRaised,dependent,titlebar=no\";\n\tif (arguments.length>0) {\n\t\tthis.type=\"DIV\";\n\t\tthis.divName = arguments[0];\n\t\t}\n\telse {\n\t\tthis.type=\"WINDOW\";\n\t\t}\n\tthis.use_gebi = false;\n\tthis.use_css = false;\n\tthis.use_layers = false;\n\tif (document.getElementById) { this.use_gebi = true; }\n\telse if (document.all) { this.use_css = true; }\n\telse if (document.layers) { this.use_layers = true; }\n\telse { this.type = \"WINDOW\"; }\n\tthis.offsetX = 0;\n\tthis.offsetY = 0;\n\t// Method mappings\n\tthis.getXYPosition = PopupWindow_getXYPosition;\n\tthis.populate = PopupWindow_populate;\n\tthis.setUrl = PopupWindow_setUrl;\n\tthis.setWindowProperties = PopupWindow_setWindowProperties;\n\tthis.refresh = PopupWindow_refresh;\n\tthis.showPopup = PopupWindow_showPopup;\n\tthis.hidePopup = PopupWindow_hidePopup;\n\tthis.setSize = PopupWindow_setSize;\n\tthis.isClicked = PopupWindow_isClicked;\n\tthis.autoHide = PopupWindow_autoHide;\n\tthis.hideIfNotClicked = PopupWindow_hideIfNotClicked;\n\t}\n\n/* SOURCE FILE: ColorPicker2.js */\n\n/*\nLast modified: 02/24/2003\n\nDESCRIPTION: This widget is used to select a color, in hexadecimal #RRGGBB\nform. It uses a color \"swatch\" to display the standard 216-color web-safe\npalette. The user can then click on a color to select it.\n\nCOMPATABILITY: See notes in AnchorPosition.js and PopupWindow.js.\nOnly the latest DHTML-capable browsers will show the color and hex values\nat the bottom as your mouse goes over them.\n\nUSAGE:\n// Create a new ColorPicker object using DHTML popup\nvar cp = new ColorPicker();\n\n// Create a new ColorPicker object using Window Popup\nvar cp = new ColorPicker('window');\n\n// Add a link in your page to trigger the popup. For example:\n<A HREF=\"#\" onClick=\"cp.show('pick');return false;\" NAME=\"pick\" ID=\"pick\">Pick</A>\n\n// Or use the built-in \"select\" function to do the dirty work for you:\n<A HREF=\"#\" onClick=\"cp.select(document.forms[0].color,'pick');return false;\" NAME=\"pick\" ID=\"pick\">Pick</A>\n\n// If using DHTML popup, write out the required DIV tag near the bottom\n// of your page.\n<SCRIPT LANGUAGE=\"JavaScript\">cp.writeDiv()</SCRIPT>\n\n// Write the 'pickColor' function that will be called when the user clicks\n// a color and do something with the value. This is only required if you\n// want to do something other than simply populate a form field, which is\n// what the 'select' function will give you.\nfunction pickColor(color) {\n\tfield.value = color;\n\t}\n\nNOTES:\n1) Requires the functions in AnchorPosition.js and PopupWindow.js\n\n2) Your anchor tag MUST contain both NAME and ID attributes which are the\n   same. For example:\n   <A NAME=\"test\" ID=\"test\"> </A>\n\n3) There must be at least a space between <A> </A> for IE5.5 to see the\n   anchor tag correctly. Do not do <A></A> with no space.\n\n4) When a ColorPicker object is created, a handler for 'onmouseup' is\n   attached to any event handler you may have already defined. Do NOT define\n   an event handler for 'onmouseup' after you define a ColorPicker object or\n   the color picker will not hide itself correctly.\n*/\nColorPicker_targetInput = null;\nfunction ColorPicker_writeDiv() {\n\tdocument.writeln(\"<DIV ID=\\\"colorPickerDiv\\\" STYLE=\\\"position:absolute;visibility:hidden;\\\"> </DIV>\");\n\t}\n\nfunction ColorPicker_show(anchorname) {\n\tthis.showPopup(anchorname);\n\t}\n\nfunction ColorPicker_pickColor(color,obj) {\n\tobj.hidePopup();\n\tpickColor(color);\n\t}\n\n// A Default \"pickColor\" function to accept the color passed back from popup.\n// User can over-ride this with their own function.\nfunction pickColor(color) {\n\tif (ColorPicker_targetInput==null) {\n\t\talert(\"Target Input is null, which means you either didn't use the 'select' function or you have no defined your own 'pickColor' function to handle the picked color!\");\n\t\treturn;\n\t\t}\n\tColorPicker_targetInput.value = color;\n\t}\n\n// This function is the easiest way to popup the window, select a color, and\n// have the value populate a form field, which is what most people want to do.\nfunction ColorPicker_select(inputobj,linkname) {\n\tif (inputobj.type!=\"text\" && inputobj.type!=\"hidden\" && inputobj.type!=\"textarea\") {\n\t\talert(\"colorpicker.select: Input object passed is not a valid form input object\");\n\t\twindow.ColorPicker_targetInput=null;\n\t\treturn;\n\t\t}\n\twindow.ColorPicker_targetInput = inputobj;\n\tthis.show(linkname);\n\t}\n\n// This function runs when you move your mouse over a color block, if you have a newer browser\nfunction ColorPicker_highlightColor(c) {\n\tvar thedoc = (arguments.length>1)?arguments[1]:window.document;\n\tvar d = thedoc.getElementById(\"colorPickerSelectedColor\");\n\td.style.backgroundColor = c;\n\td = thedoc.getElementById(\"colorPickerSelectedColorValue\");\n\td.innerHTML = c;\n\t}\n\nfunction ColorPicker() {\n\tvar windowMode = false;\n\t// Create a new PopupWindow object\n\tif (arguments.length==0) {\n\t\tvar divname = \"colorPickerDiv\";\n\t\t}\n\telse if (arguments[0] == \"window\") {\n\t\tvar divname = '';\n\t\twindowMode = true;\n\t\t}\n\telse {\n\t\tvar divname = arguments[0];\n\t\t}\n\n\tif (divname != \"\") {\n\t\tvar cp = new PopupWindow(divname);\n\t\t}\n\telse {\n\t\tvar cp = new PopupWindow();\n\t\tcp.setSize(225,250);\n\t\t}\n\n\t// Object variables\n\tcp.currentValue = \"#FFFFFF\";\n\n\t// Method Mappings\n\tcp.writeDiv = ColorPicker_writeDiv;\n\tcp.highlightColor = ColorPicker_highlightColor;\n\tcp.show = ColorPicker_show;\n\tcp.select = ColorPicker_select;\n\n\t// Code to populate color picker window\n\tvar colors = new Array(\t\"#4180B6\",\"#69AEE7\",\"#000000\",\"#000033\",\"#000066\",\"#000099\",\"#0000CC\",\"#0000FF\",\"#330000\",\"#330033\",\"#330066\",\"#330099\",\n\t\t\t\t\t\t\t\"#3300CC\",\"#3300FF\",\"#660000\",\"#660033\",\"#660066\",\"#660099\",\"#6600CC\",\"#6600FF\",\"#990000\",\"#990033\",\"#990066\",\"#990099\",\n\t\t\t\t\t\t\t\"#9900CC\",\"#9900FF\",\"#CC0000\",\"#CC0033\",\"#CC0066\",\"#CC0099\",\"#CC00CC\",\"#CC00FF\",\"#FF0000\",\"#FF0033\",\"#FF0066\",\"#FF0099\",\n\t\t\t\t\t\t\t\"#FF00CC\",\"#FF00FF\",\"#7FFFFF\",\"#7FFFFF\",\"#7FF7F7\",\"#7FEFEF\",\"#7FE7E7\",\"#7FDFDF\",\"#7FD7D7\",\"#7FCFCF\",\"#7FC7C7\",\"#7FBFBF\",\n\t\t\t\t\t\t\t\"#7FB7B7\",\"#7FAFAF\",\"#7FA7A7\",\"#7F9F9F\",\"#7F9797\",\"#7F8F8F\",\"#7F8787\",\"#7F7F7F\",\"#7F7777\",\"#7F6F6F\",\"#7F6767\",\"#7F5F5F\",\n\t\t\t\t\t\t\t\"#7F5757\",\"#7F4F4F\",\"#7F4747\",\"#7F3F3F\",\"#7F3737\",\"#7F2F2F\",\"#7F2727\",\"#7F1F1F\",\"#7F1717\",\"#7F0F0F\",\"#7F0707\",\"#7F0000\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#003300\",\"#003333\",\"#003366\",\"#003399\",\"#0033CC\",\"#0033FF\",\"#333300\",\"#333333\",\"#333366\",\"#333399\",\n\t\t\t\t\t\t\t\"#3333CC\",\"#3333FF\",\"#663300\",\"#663333\",\"#663366\",\"#663399\",\"#6633CC\",\"#6633FF\",\"#993300\",\"#993333\",\"#993366\",\"#993399\",\n\t\t\t\t\t\t\t\"#9933CC\",\"#9933FF\",\"#CC3300\",\"#CC3333\",\"#CC3366\",\"#CC3399\",\"#CC33CC\",\"#CC33FF\",\"#FF3300\",\"#FF3333\",\"#FF3366\",\"#FF3399\",\n\t\t\t\t\t\t\t\"#FF33CC\",\"#FF33FF\",\"#FF7FFF\",\"#FF7FFF\",\"#F77FF7\",\"#EF7FEF\",\"#E77FE7\",\"#DF7FDF\",\"#D77FD7\",\"#CF7FCF\",\"#C77FC7\",\"#BF7FBF\",\n\t\t\t\t\t\t\t\"#B77FB7\",\"#AF7FAF\",\"#A77FA7\",\"#9F7F9F\",\"#977F97\",\"#8F7F8F\",\"#877F87\",\"#7F7F7F\",\"#777F77\",\"#6F7F6F\",\"#677F67\",\"#5F7F5F\",\n\t\t\t\t\t\t\t\"#577F57\",\"#4F7F4F\",\"#477F47\",\"#3F7F3F\",\"#377F37\",\"#2F7F2F\",\"#277F27\",\"#1F7F1F\",\"#177F17\",\"#0F7F0F\",\"#077F07\",\"#007F00\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#006600\",\"#006633\",\"#006666\",\"#006699\",\"#0066CC\",\"#0066FF\",\"#336600\",\"#336633\",\"#336666\",\"#336699\",\n\t\t\t\t\t\t\t\"#3366CC\",\"#3366FF\",\"#666600\",\"#666633\",\"#666666\",\"#666699\",\"#6666CC\",\"#6666FF\",\"#996600\",\"#996633\",\"#996666\",\"#996699\",\n\t\t\t\t\t\t\t\"#9966CC\",\"#9966FF\",\"#CC6600\",\"#CC6633\",\"#CC6666\",\"#CC6699\",\"#CC66CC\",\"#CC66FF\",\"#FF6600\",\"#FF6633\",\"#FF6666\",\"#FF6699\",\n\t\t\t\t\t\t\t\"#FF66CC\",\"#FF66FF\",\"#FFFF7F\",\"#FFFF7F\",\"#F7F77F\",\"#EFEF7F\",\"#E7E77F\",\"#DFDF7F\",\"#D7D77F\",\"#CFCF7F\",\"#C7C77F\",\"#BFBF7F\",\n\t\t\t\t\t\t\t\"#B7B77F\",\"#AFAF7F\",\"#A7A77F\",\"#9F9F7F\",\"#97977F\",\"#8F8F7F\",\"#87877F\",\"#7F7F7F\",\"#77777F\",\"#6F6F7F\",\"#67677F\",\"#5F5F7F\",\n\t\t\t\t\t\t\t\"#57577F\",\"#4F4F7F\",\"#47477F\",\"#3F3F7F\",\"#37377F\",\"#2F2F7F\",\"#27277F\",\"#1F1F7F\",\"#17177F\",\"#0F0F7F\",\"#07077F\",\"#00007F\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#009900\",\"#009933\",\"#009966\",\"#009999\",\"#0099CC\",\"#0099FF\",\"#339900\",\"#339933\",\"#339966\",\"#339999\",\n\t\t\t\t\t\t\t\"#3399CC\",\"#3399FF\",\"#669900\",\"#669933\",\"#669966\",\"#669999\",\"#6699CC\",\"#6699FF\",\"#999900\",\"#999933\",\"#999966\",\"#999999\",\n\t\t\t\t\t\t\t\"#9999CC\",\"#9999FF\",\"#CC9900\",\"#CC9933\",\"#CC9966\",\"#CC9999\",\"#CC99CC\",\"#CC99FF\",\"#FF9900\",\"#FF9933\",\"#FF9966\",\"#FF9999\",\n\t\t\t\t\t\t\t\"#FF99CC\",\"#FF99FF\",\"#3FFFFF\",\"#3FFFFF\",\"#3FF7F7\",\"#3FEFEF\",\"#3FE7E7\",\"#3FDFDF\",\"#3FD7D7\",\"#3FCFCF\",\"#3FC7C7\",\"#3FBFBF\",\n\t\t\t\t\t\t\t\"#3FB7B7\",\"#3FAFAF\",\"#3FA7A7\",\"#3F9F9F\",\"#3F9797\",\"#3F8F8F\",\"#3F8787\",\"#3F7F7F\",\"#3F7777\",\"#3F6F6F\",\"#3F6767\",\"#3F5F5F\",\n\t\t\t\t\t\t\t\"#3F5757\",\"#3F4F4F\",\"#3F4747\",\"#3F3F3F\",\"#3F3737\",\"#3F2F2F\",\"#3F2727\",\"#3F1F1F\",\"#3F1717\",\"#3F0F0F\",\"#3F0707\",\"#3F0000\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#00CC00\",\"#00CC33\",\"#00CC66\",\"#00CC99\",\"#00CCCC\",\"#00CCFF\",\"#33CC00\",\"#33CC33\",\"#33CC66\",\"#33CC99\",\n\t\t\t\t\t\t\t\"#33CCCC\",\"#33CCFF\",\"#66CC00\",\"#66CC33\",\"#66CC66\",\"#66CC99\",\"#66CCCC\",\"#66CCFF\",\"#99CC00\",\"#99CC33\",\"#99CC66\",\"#99CC99\",\n\t\t\t\t\t\t\t\"#99CCCC\",\"#99CCFF\",\"#CCCC00\",\"#CCCC33\",\"#CCCC66\",\"#CCCC99\",\"#CCCCCC\",\"#CCCCFF\",\"#FFCC00\",\"#FFCC33\",\"#FFCC66\",\"#FFCC99\",\n\t\t\t\t\t\t\t\"#FFCCCC\",\"#FFCCFF\",\"#FF3FFF\",\"#FF3FFF\",\"#F73FF7\",\"#EF3FEF\",\"#E73FE7\",\"#DF3FDF\",\"#D73FD7\",\"#CF3FCF\",\"#C73FC7\",\"#BF3FBF\",\n\t\t\t\t\t\t\t\"#B73FB7\",\"#AF3FAF\",\"#A73FA7\",\"#9F3F9F\",\"#973F97\",\"#8F3F8F\",\"#873F87\",\"#7F3F7F\",\"#773F77\",\"#6F3F6F\",\"#673F67\",\"#5F3F5F\",\n\t\t\t\t\t\t\t\"#573F57\",\"#4F3F4F\",\"#473F47\",\"#3F3F3F\",\"#373F37\",\"#2F3F2F\",\"#273F27\",\"#1F3F1F\",\"#173F17\",\"#0F3F0F\",\"#073F07\",\"#003F00\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#00FF00\",\"#00FF33\",\"#00FF66\",\"#00FF99\",\"#00FFCC\",\"#00FFFF\",\"#33FF00\",\"#33FF33\",\"#33FF66\",\"#33FF99\",\n\t\t\t\t\t\t\t\"#33FFCC\",\"#33FFFF\",\"#66FF00\",\"#66FF33\",\"#66FF66\",\"#66FF99\",\"#66FFCC\",\"#66FFFF\",\"#99FF00\",\"#99FF33\",\"#99FF66\",\"#99FF99\",\n\t\t\t\t\t\t\t\"#99FFCC\",\"#99FFFF\",\"#CCFF00\",\"#CCFF33\",\"#CCFF66\",\"#CCFF99\",\"#CCFFCC\",\"#CCFFFF\",\"#FFFF00\",\"#FFFF33\",\"#FFFF66\",\"#FFFF99\",\n\t\t\t\t\t\t\t\"#FFFFCC\",\"#FFFFFF\",\"#FFFF3F\",\"#FFFF3F\",\"#F7F73F\",\"#EFEF3F\",\"#E7E73F\",\"#DFDF3F\",\"#D7D73F\",\"#CFCF3F\",\"#C7C73F\",\"#BFBF3F\",\n\t\t\t\t\t\t\t\"#B7B73F\",\"#AFAF3F\",\"#A7A73F\",\"#9F9F3F\",\"#97973F\",\"#8F8F3F\",\"#87873F\",\"#7F7F3F\",\"#77773F\",\"#6F6F3F\",\"#67673F\",\"#5F5F3F\",\n\t\t\t\t\t\t\t\"#57573F\",\"#4F4F3F\",\"#47473F\",\"#3F3F3F\",\"#37373F\",\"#2F2F3F\",\"#27273F\",\"#1F1F3F\",\"#17173F\",\"#0F0F3F\",\"#07073F\",\"#00003F\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#FFFFFF\",\"#FFEEEE\",\"#FFDDDD\",\"#FFCCCC\",\"#FFBBBB\",\"#FFAAAA\",\"#FF9999\",\"#FF8888\",\"#FF7777\",\"#FF6666\",\n\t\t\t\t\t\t\t\"#FF5555\",\"#FF4444\",\"#FF3333\",\"#FF2222\",\"#FF1111\",\"#FF0000\",\"#FF0000\",\"#FF0000\",\"#FF0000\",\"#EE0000\",\"#DD0000\",\"#CC0000\",\n\t\t\t\t\t\t\t\"#BB0000\",\"#AA0000\",\"#990000\",\"#880000\",\"#770000\",\"#660000\",\"#550000\",\"#440000\",\"#330000\",\"#220000\",\"#110000\",\"#000000\",\n\t\t\t\t\t\t\t\"#000000\",\"#000000\",\"#000000\",\"#001111\",\"#002222\",\"#003333\",\"#004444\",\"#005555\",\"#006666\",\"#007777\",\"#008888\",\"#009999\",\n\t\t\t\t\t\t\t\"#00AAAA\",\"#00BBBB\",\"#00CCCC\",\"#00DDDD\",\"#00EEEE\",\"#00FFFF\",\"#00FFFF\",\"#00FFFF\",\"#00FFFF\",\"#11FFFF\",\"#22FFFF\",\"#33FFFF\",\n\t\t\t\t\t\t\t\"#44FFFF\",\"#55FFFF\",\"#66FFFF\",\"#77FFFF\",\"#88FFFF\",\"#99FFFF\",\"#AAFFFF\",\"#BBFFFF\",\"#CCFFFF\",\"#DDFFFF\",\"#EEFFFF\",\"#FFFFFF\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#FFFFFF\",\"#EEFFEE\",\"#DDFFDD\",\"#CCFFCC\",\"#BBFFBB\",\"#AAFFAA\",\"#99FF99\",\"#88FF88\",\"#77FF77\",\"#66FF66\",\n\t\t\t\t\t\t\t\"#55FF55\",\"#44FF44\",\"#33FF33\",\"#22FF22\",\"#11FF11\",\"#00FF00\",\"#00FF00\",\"#00FF00\",\"#00FF00\",\"#00EE00\",\"#00DD00\",\"#00CC00\",\n\t\t\t\t\t\t\t\"#00BB00\",\"#00AA00\",\"#009900\",\"#008800\",\"#007700\",\"#006600\",\"#005500\",\"#004400\",\"#003300\",\"#002200\",\"#001100\",\"#000000\",\n\t\t\t\t\t\t\t\"#000000\",\"#000000\",\"#000000\",\"#110011\",\"#220022\",\"#330033\",\"#440044\",\"#550055\",\"#660066\",\"#770077\",\"#880088\",\"#990099\",\n\t\t\t\t\t\t\t\"#AA00AA\",\"#BB00BB\",\"#CC00CC\",\"#DD00DD\",\"#EE00EE\",\"#FF00FF\",\"#FF00FF\",\"#FF00FF\",\"#FF00FF\",\"#FF11FF\",\"#FF22FF\",\"#FF33FF\",\n\t\t\t\t\t\t\t\"#FF44FF\",\"#FF55FF\",\"#FF66FF\",\"#FF77FF\",\"#FF88FF\",\"#FF99FF\",\"#FFAAFF\",\"#FFBBFF\",\"#FFCCFF\",\"#FFDDFF\",\"#FFEEFF\",\"#FFFFFF\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#FFFFFF\",\"#EEEEFF\",\"#DDDDFF\",\"#CCCCFF\",\"#BBBBFF\",\"#AAAAFF\",\"#9999FF\",\"#8888FF\",\"#7777FF\",\"#6666FF\",\n\t\t\t\t\t\t\t\"#5555FF\",\"#4444FF\",\"#3333FF\",\"#2222FF\",\"#1111FF\",\"#0000FF\",\"#0000FF\",\"#0000FF\",\"#0000FF\",\"#0000EE\",\"#0000DD\",\"#0000CC\",\n\t\t\t\t\t\t\t\"#0000BB\",\"#0000AA\",\"#000099\",\"#000088\",\"#000077\",\"#000066\",\"#000055\",\"#000044\",\"#000033\",\"#000022\",\"#000011\",\"#000000\",\n\t\t\t\t\t\t\t\"#000000\",\"#000000\",\"#000000\",\"#111100\",\"#222200\",\"#333300\",\"#444400\",\"#555500\",\"#666600\",\"#777700\",\"#888800\",\"#999900\",\n\t\t\t\t\t\t\t\"#AAAA00\",\"#BBBB00\",\"#CCCC00\",\"#DDDD00\",\"#EEEE00\",\"#FFFF00\",\"#FFFF00\",\"#FFFF00\",\"#FFFF00\",\"#FFFF11\",\"#FFFF22\",\"#FFFF33\",\n\t\t\t\t\t\t\t\"#FFFF44\",\"#FFFF55\",\"#FFFF66\",\"#FFFF77\",\"#FFFF88\",\"#FFFF99\",\"#FFFFAA\",\"#FFFFBB\",\"#FFFFCC\",\"#FFFFDD\",\"#FFFFEE\",\"#FFFFFF\",\n\n\t\t\t\t\t\t\t\"#4180B6\",\"#69AEE7\",\"#FFFFFF\",\"#FFFFFF\",\"#FBFBFB\",\"#F7F7F7\",\"#F3F3F3\",\"#EFEFEF\",\"#EBEBEB\",\"#E7E7E7\",\"#E3E3E3\",\"#DFDFDF\",\n\t\t\t\t\t\t\t\"#DBDBDB\",\"#D7D7D7\",\"#D3D3D3\",\"#CFCFCF\",\"#CBCBCB\",\"#C7C7C7\",\"#C3C3C3\",\"#BFBFBF\",\"#BBBBBB\",\"#B7B7B7\",\"#B3B3B3\",\"#AFAFAF\",\n\t\t\t\t\t\t\t\"#ABABAB\",\"#A7A7A7\",\"#A3A3A3\",\"#9F9F9F\",\"#9B9B9B\",\"#979797\",\"#939393\",\"#8F8F8F\",\"#8B8B8B\",\"#878787\",\"#838383\",\"#7F7F7F\",\n\t\t\t\t\t\t\t\"#7B7B7B\",\"#777777\",\"#737373\",\"#6F6F6F\",\"#6B6B6B\",\"#676767\",\"#636363\",\"#5F5F5F\",\"#5B5B5B\",\"#575757\",\"#535353\",\"#4F4F4F\",\n\t\t\t\t\t\t\t\"#4B4B4B\",\"#474747\",\"#434343\",\"#3F3F3F\",\"#3B3B3B\",\"#373737\",\"#333333\",\"#2F2F2F\",\"#2B2B2B\",\"#272727\",\"#232323\",\"#1F1F1F\",\n\t\t\t\t\t\t\t\"#1B1B1B\",\"#171717\",\"#131313\",\"#0F0F0F\",\"#0B0B0B\",\"#070707\",\"#030303\",\"#000000\",\"#000000\",\"#000000\",\"#000000\",\"#000000\");\n\tvar total = colors.length;\n\tvar width = 72;\n\tvar cp_contents = \"\";\n\tvar windowRef = (windowMode)?\"window.opener.\":\"\";\n\tif (windowMode) {\n\t\tcp_contents += \"<html><head><title>Select Color</title></head>\";\n\t\tcp_contents += \"<body marginwidth=0 marginheight=0 leftmargin=0 topmargin=0><span style='text-align: center;'>\";\n\t\t}\n\tcp_contents += \"<table style='border: none;' cellspacing=0 cellpadding=0>\";\n\tvar use_highlight = (document.getElementById || document.all)?true:false;\n\tfor (var i=0; i<total; i++) {\n\t\tif ((i % width) == 0) { cp_contents += \"<tr>\"; }\n\t\tif (use_highlight) { var mo = 'onMouseOver=\"'+windowRef+'ColorPicker_highlightColor(\\''+colors[i]+'\\',window.document)\"'; }\n\t\telse { mo = \"\"; }\n\t\tcp_contents += '<td style=\"background-color: '+colors[i]+';\"><a href=\"javascript:void()\" onclick=\"'+windowRef+'ColorPicker_pickColor(\\''+colors[i]+'\\','+windowRef+'window.popupWindowObjects['+cp.index+']);return false;\" '+mo+'>&nbsp;</a></td>';\n\t\tif ( ((i+1)>=total) || (((i+1) % width) == 0)) {\n\t\t\tcp_contents += \"</tr>\";\n\t\t\t}\n\t\t}\n\t// If the browser supports dynamically changing TD cells, add the fancy stuff\n\tif (document.getElementById) {\n\t\tvar width1 = Math.floor(width/2);\n\t\tvar width2 = width = width1;\n\t\tcp_contents += \"<tr><td colspan='\"+width1+\"' style='background-color: #FFF;' ID='colorPickerSelectedColor'>&nbsp;</td><td colspan='\"+width2+\"' style='text-align: center;' id='colorPickerSelectedColorValue'>#FFFFFF</td></tr>\";\n\t\t}\n\tcp_contents += \"</table>\";\n\tif (windowMode) {\n\t\tcp_contents += \"</span></body></html>\";\n\t\t}\n\t// end populate code\n\n\t// Write the contents to the popup object\n\tcp.populate(cp_contents+\"\\n\");\n\t// Move the table down a bit so you can see it\n\tcp.offsetY = 25;\n\tcp.autoHide();\n\treturn cp;\n\t}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/comment-reply.js",
    "content": "var addComment = {\n\tmoveForm: function( commId, parentId, respondId, postId ) {\n\t\tvar div, element, style, cssHidden,\n\t\t\tt           = this,\n\t\t\tcomm        = t.I( commId ),\n\t\t\trespond     = t.I( respondId ),\n\t\t\tcancel      = t.I( 'cancel-comment-reply-link' ),\n\t\t\tparent      = t.I( 'comment_parent' ),\n\t\t\tpost        = t.I( 'comment_post_ID' ),\n\t\t\tcommentForm = respond.getElementsByTagName( 'form' )[0];\n\n\t\tif ( ! comm || ! respond || ! cancel || ! parent || ! commentForm ) {\n\t\t\treturn;\n\t\t}\n\n\t\tt.respondId = respondId;\n\t\tpostId = postId || false;\n\n\t\tif ( ! t.I( 'wp-temp-form-div' ) ) {\n\t\t\tdiv = document.createElement( 'div' );\n\t\t\tdiv.id = 'wp-temp-form-div';\n\t\t\tdiv.style.display = 'none';\n\t\t\trespond.parentNode.insertBefore( div, respond );\n\t\t}\n\n\t\tcomm.parentNode.insertBefore( respond, comm.nextSibling );\n\t\tif ( post && postId ) {\n\t\t\tpost.value = postId;\n\t\t}\n\t\tparent.value = parentId;\n\t\tcancel.style.display = '';\n\n\t\tcancel.onclick = function() {\n\t\t\tvar t       = addComment,\n\t\t\t\ttemp    = t.I( 'wp-temp-form-div' ),\n\t\t\t\trespond = t.I( t.respondId );\n\n\t\t\tif ( ! temp || ! respond ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tt.I( 'comment_parent' ).value = '0';\n\t\t\ttemp.parentNode.insertBefore( respond, temp );\n\t\t\ttemp.parentNode.removeChild( temp );\n\t\t\tthis.style.display = 'none';\n\t\t\tthis.onclick = null;\n\t\t\treturn false;\n\t\t};\n\n\t\t/*\n\t\t * Set initial focus to the first form focusable element.\n\t\t * Try/catch used just to avoid errors in IE 7- which return visibility\n\t\t * 'inherit' when the visibility value is inherited from an ancestor.\n\t\t */\n\t\ttry {\n\t\t\tfor ( var i = 0; i < commentForm.elements.length; i++ ) {\n\t\t\t\telement = commentForm.elements[i];\n\t\t\t\tcssHidden = false;\n\n\t\t\t\t// Modern browsers.\n\t\t\t\tif ( 'getComputedStyle' in window ) {\n\t\t\t\t\tstyle = window.getComputedStyle( element );\n\t\t\t\t// IE 8.\n\t\t\t\t} else if ( document.documentElement.currentStyle ) {\n\t\t\t\t\tstyle = element.currentStyle;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * For display none, do the same thing jQuery does. For visibility,\n\t\t\t\t * check the element computed style since browsers are already doing\n\t\t\t\t * the job for us. In fact, the visibility computed style is the actual\n\t\t\t\t * computed value and already takes into account the element ancestors.\n\t\t\t\t */\n\t\t\t\tif ( ( element.offsetWidth <= 0 && element.offsetHeight <= 0 ) || style.visibility === 'hidden' ) {\n\t\t\t\t\tcssHidden = true;\n\t\t\t\t}\n\n\t\t\t\t// Skip form elements that are hidden or disabled.\n\t\t\t\tif ( 'hidden' === element.type || element.disabled || cssHidden ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\telement.focus();\n\t\t\t\t// Stop after the first focusable element.\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t} catch( er ) {}\n\n\t\treturn false;\n\t},\n\n\tI: function( id ) {\n\t\treturn document.getElementById( id );\n\t}\n};\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/crop/cropper.css",
    "content": ".imgCrop_wrap {\n\t/* width: 500px;   @done_in_js */\n\t/* height: 375px;  @done_in_js */\n\tposition: relative;\n\tcursor: crosshair;\n}\n\n/* an extra classname is applied for Opera < 9.0 to fix its lack of opacity support */\n.imgCrop_wrap.opera8 .imgCrop_overlay,\n.imgCrop_wrap.opera8 .imgCrop_clickArea { \n\tbackground-color: transparent;\n}\n\n/* fix for IE displaying all boxes at line-height by default, although they are still 1 pixel high until we combine them with the pointless span */\n.imgCrop_wrap,\n.imgCrop_wrap * {\n\tfont-size: 0;\n}\n\n.imgCrop_overlay {\n\tbackground-color: #000;\n\topacity: 0.5;\n\tfilter:alpha(opacity=50);\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.imgCrop_selArea {\n\tposition: absolute;\n\t/* @done_in_js \n\ttop: 20px;\n\tleft: 20px;\n\twidth: 200px;\n\theight: 200px;\n\tbackground: transparent url(castle.jpg) no-repeat  -210px -110px;\n\t*/\n\tcursor: move;\n\tz-index: 2;\n}\n\n/* clickArea is all a fix for IE 5.5 & 6 to allow the user to click on the given area */\n.imgCrop_clickArea {\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: #FFF;\n\topacity: 0.01;\n\tfilter:alpha(opacity=01);\n}\n\n.imgCrop_marqueeHoriz {\n\tposition: absolute;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: transparent url(marqueeHoriz.gif) repeat-x 0 0;\n\tz-index: 3;\n}\n\n.imgCrop_marqueeVert {\n\tposition: absolute;\n\theight: 100%;\n\twidth: 1px;\n\tbackground: transparent url(marqueeVert.gif) repeat-y 0 0;\n\tz-index: 3;\n}\n\n.imgCrop_marqueeNorth { top: 0; left: 0; }\n.imgCrop_marqueeEast  { top: 0; right: 0; }\n.imgCrop_marqueeSouth { bottom: 0px; left: 0; }\n.imgCrop_marqueeWest  { top: 0; left: 0; }\n\n\n.imgCrop_handle {\n\tposition: absolute;\n\tborder: 1px solid #333;\n\twidth: 6px;\n\theight: 6px;\n\tbackground: #FFF;\n\topacity: 0.5;\n\tfilter:alpha(opacity=50);\n\tz-index: 4;\n}\n\n/* fix IE 5 box model */\n* html .imgCrop_handle {\n\twidth: 8px;\n\theight: 8px;\n\twid\\th: 6px;\n\thei\\ght: 6px;\n}\n\n.imgCrop_handleN {\n\ttop: -3px;\n\tleft: 0;\n\t/* margin-left: 49%;    @done_in_js */\n\tcursor: n-resize;\n}\n\n.imgCrop_handleNE { \n\ttop: -3px;\n\tright: -3px;\n\tcursor: ne-resize;\n}\n\n.imgCrop_handleE {\n\ttop: 0;\n\tright: -3px;\n\t/* margin-top: 49%;    @done_in_js */\n\tcursor: e-resize;\n}\n\n.imgCrop_handleSE {\n\tright: -3px;\n\tbottom: -3px;\n\tcursor: se-resize;\n}\n\n.imgCrop_handleS {\n\tright: 0;\n\tbottom: -3px;\n\t/* margin-right: 49%; @done_in_js */\n\tcursor: s-resize;\n}\n\n.imgCrop_handleSW {\n\tleft: -3px;\n\tbottom: -3px;\n\tcursor: sw-resize;\n}\n\n.imgCrop_handleW {\n\ttop: 0;\n\tleft: -3px;\n\t/* margin-top: 49%;  @done_in_js */\n\tcursor: e-resize;\n}\n\n.imgCrop_handleNW {\n\ttop: -3px;\n\tleft: -3px;\n\tcursor: nw-resize;\n}\n\n/**\n * Create an area to click & drag around on as the default browser behaviour is to let you drag the image \n */\n.imgCrop_dragArea {\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 200;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.imgCrop_previewWrap {\n\t/* width: 200px;  @done_in_js */\n\t/* height: 200px; @done_in_js */\n\toverflow: hidden;\n\tposition: relative;\n}\n\n.imgCrop_previewWrap img {\n\tposition: absolute;\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/crop/cropper.js",
    "content": "/**\n * Copyright (c) 2006, David Spurr (http://www.defusion.org.uk/)\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n *\n *     * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n *     * 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.\n *     * Neither the name of the David Spurr nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n *\n * 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.\n *\n * http://www.opensource.org/licenses/bsd-license.php\n *\n * See scriptaculous.js for full scriptaculous licence\n */\n\nvar CropDraggable=Class.create();\nObject.extend(Object.extend(CropDraggable.prototype,Draggable.prototype),{initialize:function(_1){\nthis.options=Object.extend({drawMethod:function(){\n}},arguments[1]||{});\nthis.element=$(_1);\nthis.handle=this.element;\nthis.delta=this.currentDelta();\nthis.dragging=false;\nthis.eventMouseDown=this.initDrag.bindAsEventListener(this);\nEvent.observe(this.handle,\"mousedown\",this.eventMouseDown);\nDraggables.register(this);\n},draw:function(_2){\nvar _3=Position.cumulativeOffset(this.element);\nvar d=this.currentDelta();\n_3[0]-=d[0];\n_3[1]-=d[1];\nvar p=[0,1].map(function(i){\nreturn (_2[i]-_3[i]-this.offset[i]);\n}.bind(this));\nthis.options.drawMethod(p);\n}});\nvar Cropper={};\nCropper.Img=Class.create();\nCropper.Img.prototype={initialize:function(_7,_8){\nthis.options=Object.extend({ratioDim:{x:0,y:0},minWidth:0,minHeight:0,displayOnInit:false,onEndCrop:Prototype.emptyFunction,captureKeys:true},_8||{});\nif(this.options.minWidth>0&&this.options.minHeight>0){\nthis.options.ratioDim.x=this.options.minWidth;\nthis.options.ratioDim.y=this.options.minHeight;\n}\nthis.img=$(_7);\nthis.clickCoords={x:0,y:0};\nthis.dragging=false;\nthis.resizing=false;\nthis.isWebKit=/Konqueror|Safari|KHTML/.test(navigator.userAgent);\nthis.isIE=/MSIE/.test(navigator.userAgent);\nthis.isOpera8=/Opera\\s[1-8]/.test(navigator.userAgent);\nthis.ratioX=0;\nthis.ratioY=0;\nthis.attached=false;\n$A(document.getElementsByTagName(\"script\")).each(function(s){\nif(s.src.match(/cropper\\.js/)){\nvar _a=s.src.replace(/cropper\\.js(.*)?/,\"\");\nvar _b=document.createElement(\"link\");\n_b.rel=\"stylesheet\";\n_b.type=\"text/css\";\n_b.href=_a+\"cropper.css\";\n_b.media=\"screen\";\ndocument.getElementsByTagName(\"head\")[0].appendChild(_b);\n}\n});\nif(this.options.ratioDim.x>0&&this.options.ratioDim.y>0){\nvar _c=this.getGCD(this.options.ratioDim.x,this.options.ratioDim.y);\nthis.ratioX=this.options.ratioDim.x/_c;\nthis.ratioY=this.options.ratioDim.y/_c;\n}\nthis.subInitialize();\nif(this.img.complete||this.isWebKit){\nthis.onLoad();\n}else{\nEvent.observe(this.img,\"load\",this.onLoad.bindAsEventListener(this));\n}\n},getGCD:function(a,b){return 1;\nif(b==0){\nreturn a;\n}\nreturn this.getGCD(b,a%b);\n},onLoad:function(){\nvar _f=\"imgCrop_\";\nvar _10=this.img.parentNode;\nvar _11=\"\";\nif(this.isOpera8){\n_11=\" opera8\";\n}\nthis.imgWrap=Builder.node(\"div\",{\"class\":_f+\"wrap\"+_11});\nif(this.isIE){\nthis.north=Builder.node(\"div\",{\"class\":_f+\"overlay \"+_f+\"north\"},[Builder.node(\"span\")]);\nthis.east=Builder.node(\"div\",{\"class\":_f+\"overlay \"+_f+\"east\"},[Builder.node(\"span\")]);\nthis.south=Builder.node(\"div\",{\"class\":_f+\"overlay \"+_f+\"south\"},[Builder.node(\"span\")]);\nthis.west=Builder.node(\"div\",{\"class\":_f+\"overlay \"+_f+\"west\"},[Builder.node(\"span\")]);\nvar _12=[this.north,this.east,this.south,this.west];\n}else{\nthis.overlay=Builder.node(\"div\",{\"class\":_f+\"overlay\"});\nvar _12=[this.overlay];\n}\nthis.dragArea=Builder.node(\"div\",{\"class\":_f+\"dragArea\"},_12);\nthis.handleN=Builder.node(\"div\",{\"class\":_f+\"handle \"+_f+\"handleN\"});\nthis.handleNE=Builder.node(\"div\",{\"class\":_f+\"handle \"+_f+\"handleNE\"});\nthis.handleE=Builder.node(\"div\",{\"class\":_f+\"handle \"+_f+\"handleE\"});\nthis.handleSE=Builder.node(\"div\",{\"class\":_f+\"handle \"+_f+\"handleSE\"});\nthis.handleS=Builder.node(\"div\",{\"class\":_f+\"handle \"+_f+\"handleS\"});\nthis.handleSW=Builder.node(\"div\",{\"class\":_f+\"handle \"+_f+\"handleSW\"});\nthis.handleW=Builder.node(\"div\",{\"class\":_f+\"handle \"+_f+\"handleW\"});\nthis.handleNW=Builder.node(\"div\",{\"class\":_f+\"handle \"+_f+\"handleNW\"});\nthis.selArea=Builder.node(\"div\",{\"class\":_f+\"selArea\"},[Builder.node(\"div\",{\"class\":_f+\"marqueeHoriz \"+_f+\"marqueeNorth\"},[Builder.node(\"span\")]),Builder.node(\"div\",{\"class\":_f+\"marqueeVert \"+_f+\"marqueeEast\"},[Builder.node(\"span\")]),Builder.node(\"div\",{\"class\":_f+\"marqueeHoriz \"+_f+\"marqueeSouth\"},[Builder.node(\"span\")]),Builder.node(\"div\",{\"class\":_f+\"marqueeVert \"+_f+\"marqueeWest\"},[Builder.node(\"span\")]),this.handleN,this.handleNE,this.handleE,this.handleSE,this.handleS,this.handleSW,this.handleW,this.handleNW,Builder.node(\"div\",{\"class\":_f+\"clickArea\"})]);\nElement.setStyle($(this.selArea),{backgroundColor:\"transparent\",backgroundRepeat:\"no-repeat\",backgroundPosition:\"0 0\"});\nthis.imgWrap.appendChild(this.img);\nthis.imgWrap.appendChild(this.dragArea);\nthis.dragArea.appendChild(this.selArea);\nthis.dragArea.appendChild(Builder.node(\"div\",{\"class\":_f+\"clickArea\"}));\n_10.appendChild(this.imgWrap);\nEvent.observe(this.dragArea,\"mousedown\",this.startDrag.bindAsEventListener(this));\nEvent.observe(document,\"mousemove\",this.onDrag.bindAsEventListener(this));\nEvent.observe(document,\"mouseup\",this.endCrop.bindAsEventListener(this));\nvar _13=[this.handleN,this.handleNE,this.handleE,this.handleSE,this.handleS,this.handleSW,this.handleW,this.handleNW];\nfor(var i=0;i<_13.length;i++){\nEvent.observe(_13[i],\"mousedown\",this.startResize.bindAsEventListener(this));\n}\nif(this.options.captureKeys){\nEvent.observe(document,\"keydown\",this.handleKeys.bindAsEventListener(this));\n}\nnew CropDraggable(this.selArea,{drawMethod:this.moveArea.bindAsEventListener(this)});\nthis.setParams();\n},setParams:function(){\nthis.imgW=this.img.width;\nthis.imgH=this.img.height;\nif(!this.isIE){\nElement.setStyle($(this.overlay),{width:this.imgW+\"px\",height:this.imgH+\"px\"});\nElement.hide($(this.overlay));\nElement.setStyle($(this.selArea),{backgroundImage:\"url(\"+this.img.src+\")\"});\n}else{\nElement.setStyle($(this.north),{height:0});\nElement.setStyle($(this.east),{width:0,height:0});\nElement.setStyle($(this.south),{height:0});\nElement.setStyle($(this.west),{width:0,height:0});\n}\nElement.setStyle($(this.imgWrap),{\"width\":this.imgW+\"px\",\"height\":this.imgH+\"px\"});\nElement.hide($(this.selArea));\nvar _15=Position.positionedOffset(this.imgWrap);\nthis.wrapOffsets={\"top\":_15[1],\"left\":_15[0]};\nvar _16={x1:0,y1:0,x2:0,y2:0};\nthis.setAreaCoords(_16);\nif(this.options.ratioDim.x>0&&this.options.ratioDim.y>0&&this.options.displayOnInit){\n_16.x1=Math.ceil((this.imgW-this.options.ratioDim.x)/2);\n_16.y1=Math.ceil((this.imgH-this.options.ratioDim.y)/2);\n_16.x2=_16.x1+this.options.ratioDim.x;\n_16.y2=_16.y1+this.options.ratioDim.y;\nElement.show(this.selArea);\nthis.drawArea();\nthis.endCrop();\n}\nthis.attached=true;\n},remove:function(){\nthis.attached=false;\nthis.imgWrap.parentNode.insertBefore(this.img,this.imgWrap);\nthis.imgWrap.parentNode.removeChild(this.imgWrap);\nEvent.stopObserving(this.dragArea,\"mousedown\",this.startDrag.bindAsEventListener(this));\nEvent.stopObserving(document,\"mousemove\",this.onDrag.bindAsEventListener(this));\nEvent.stopObserving(document,\"mouseup\",this.endCrop.bindAsEventListener(this));\nvar _17=[this.handleN,this.handleNE,this.handleE,this.handleSE,this.handleS,this.handleSW,this.handleW,this.handleNW];\nfor(var i=0;i<_17.length;i++){\nEvent.stopObserving(_17[i],\"mousedown\",this.startResize.bindAsEventListener(this));\n}\nif(this.options.captureKeys){\nEvent.stopObserving(document,\"keydown\",this.handleKeys.bindAsEventListener(this));\n}\n},reset:function(){\nif(!this.attached){\nthis.onLoad();\n}else{\nthis.setParams();\n}\nthis.endCrop();\n},handleKeys:function(e){\nvar dir={x:0,y:0};\nif(!this.dragging){\nswitch(e.keyCode){\ncase (37):\ndir.x=-1;\nbreak;\ncase (38):\ndir.y=-1;\nbreak;\ncase (39):\ndir.x=1;\nbreak;\ncase (40):\ndir.y=1;\nbreak;\n}\nif(dir.x!=0||dir.y!=0){\nif(e.shiftKey){\ndir.x*=10;\ndir.y*=10;\n}\nthis.moveArea([this.areaCoords.x1+dir.x,this.areaCoords.y1+dir.y]);\nEvent.stop(e);\n}\n}\n},calcW:function(){\nreturn (this.areaCoords.x2-this.areaCoords.x1);\n},calcH:function(){\nreturn (this.areaCoords.y2-this.areaCoords.y1);\n},moveArea:function(_1b){\nthis.setAreaCoords({x1:_1b[0],y1:_1b[1],x2:_1b[0]+this.calcW(),y2:_1b[1]+this.calcH()},true);\nthis.drawArea();\n},cloneCoords:function(_1c){\nreturn {x1:_1c.x1,y1:_1c.y1,x2:_1c.x2,y2:_1c.y2};\n},setAreaCoords:function(_1d,_1e,_1f,_20,_21){\nvar _22=typeof _1e!=\"undefined\"?_1e:false;\nvar _23=typeof _1f!=\"undefined\"?_1f:false;\nif(_1e){\nvar _24=_1d.x2-_1d.x1;\nvar _25=_1d.y2-_1d.y1;\nif(_1d.x1<0){\n_1d.x1=0;\n_1d.x2=_24;\n}\nif(_1d.y1<0){\n_1d.y1=0;\n_1d.y2=_25;\n}\nif(_1d.x2>this.imgW){\n_1d.x2=this.imgW;\n_1d.x1=this.imgW-_24;\n}\nif(_1d.y2>this.imgH){\n_1d.y2=this.imgH;\n_1d.y1=this.imgH-_25;\n}\n}else{\nif(_1d.x1<0){\n_1d.x1=0;\n}\nif(_1d.y1<0){\n_1d.y1=0;\n}\nif(_1d.x2>this.imgW){\n_1d.x2=this.imgW;\n}\nif(_1d.y2>this.imgH){\n_1d.y2=this.imgH;\n}\nif(typeof (_20)!=\"undefined\"){\nif(this.ratioX>0){\nthis.applyRatio(_1d,{x:this.ratioX,y:this.ratioY},_20,_21);\n}else{\nif(_23){\nthis.applyRatio(_1d,{x:1,y:1},_20,_21);\n}\n}\nvar _26={a1:_1d.x1,a2:_1d.x2};\nvar _27={a1:_1d.y1,a2:_1d.y2};\nvar _28=this.options.minWidth;\nvar _29=this.options.minHeight;\nif((_28==0||_29==0)&&_23){\nif(_28>0){\n_29=_28;\n}else{\nif(_29>0){\n_28=_29;\n}\n}\n}\nthis.applyMinDimension(_26,_28,_20.x,{min:0,max:this.imgW});\nthis.applyMinDimension(_27,_29,_20.y,{min:0,max:this.imgH});\n_1d={x1:_26.a1,y1:_27.a1,x2:_26.a2,y2:_27.a2};\n}\n}\nthis.areaCoords=_1d;\n},applyMinDimension:function(_2a,_2b,_2c,_2d){\nif((_2a.a2-_2a.a1)<_2b){\nif(_2c==1){\n_2a.a2=_2a.a1+_2b;\n}else{\n_2a.a1=_2a.a2-_2b;\n}\nif(_2a.a1<_2d.min){\n_2a.a1=_2d.min;\n_2a.a2=_2b;\n}else{\nif(_2a.a2>_2d.max){\n_2a.a1=_2d.max-_2b;\n_2a.a2=_2d.max;\n}\n}\n}\n},applyRatio:function(_2e,_2f,_30,_31){\nvar _32;\nif(_31==\"N\"||_31==\"S\"){\n_32=this.applyRatioToAxis({a1:_2e.y1,b1:_2e.x1,a2:_2e.y2,b2:_2e.x2},{a:_2f.y,b:_2f.x},{a:_30.y,b:_30.x},{min:0,max:this.imgW});\n_2e.x1=_32.b1;\n_2e.y1=_32.a1;\n_2e.x2=_32.b2;\n_2e.y2=_32.a2;\n}else{\n_32=this.applyRatioToAxis({a1:_2e.x1,b1:_2e.y1,a2:_2e.x2,b2:_2e.y2},{a:_2f.x,b:_2f.y},{a:_30.x,b:_30.y},{min:0,max:this.imgH});\n_2e.x1=_32.a1;\n_2e.y1=_32.b1;\n_2e.x2=_32.a2;\n_2e.y2=_32.b2;\n}\n},applyRatioToAxis:function(_33,_34,_35,_36){\nvar _37=Object.extend(_33,{});\nvar _38=_37.a2-_37.a1;\nvar _3a=Math.floor(_38*_34.b/_34.a);\nvar _3b;\nvar _3c;\nvar _3d=null;\nif(_35.b==1){\n_3b=_37.b1+_3a;\nif(_3b>_36.max){\n_3b=_36.max;\n_3d=_3b-_37.b1;\n}\n_37.b2=_3b;\n}else{\n_3b=_37.b2-_3a;\nif(_3b<_36.min){\n_3b=_36.min;\n_3d=_3b+_37.b2;\n}\n_37.b1=_3b;\n}\nif(_3d!=null){\n_3c=Math.floor(_3d*_34.a/_34.b);\nif(_35.a==1){\n_37.a2=_37.a1+_3c;\n}else{\n_37.a1=_37.a1=_37.a2-_3c;\n}\n}\nreturn _37;\n},drawArea:function(){\nif(!this.isIE){\nElement.show($(this.overlay));\n}\nvar _3e=this.calcW();\nvar _3f=this.calcH();\nvar _40=this.areaCoords.x2;\nvar _41=this.areaCoords.y2;\nvar _42=this.selArea.style;\n_42.left=this.areaCoords.x1+\"px\";\n_42.top=this.areaCoords.y1+\"px\";\n_42.width=_3e+\"px\";\n_42.height=_3f+\"px\";\nvar _43=Math.ceil((_3e-6)/2)+\"px\";\nvar _44=Math.ceil((_3f-6)/2)+\"px\";\nthis.handleN.style.left=_43;\nthis.handleE.style.top=_44;\nthis.handleS.style.left=_43;\nthis.handleW.style.top=_44;\nif(this.isIE){\nthis.north.style.height=this.areaCoords.y1+\"px\";\nvar _45=this.east.style;\n_45.top=this.areaCoords.y1+\"px\";\n_45.height=_3f+\"px\";\n_45.left=_40+\"px\";\n_45.width=(this.img.width-_40)+\"px\";\nvar _46=this.south.style;\n_46.top=_41+\"px\";\n_46.height=(this.img.height-_41)+\"px\";\nvar _47=this.west.style;\n_47.top=this.areaCoords.y1+\"px\";\n_47.height=_3f+\"px\";\n_47.width=this.areaCoords.x1+\"px\";\n}else{\n_42.backgroundPosition=\"-\"+this.areaCoords.x1+\"px \"+\"-\"+this.areaCoords.y1+\"px\";\n}\nthis.subDrawArea();\nthis.forceReRender();\n},forceReRender:function(){\nif(this.isIE||this.isWebKit){\nvar n=document.createTextNode(\" \");\nvar d,el,fixEL,i;\nif(this.isIE){\nfixEl=this.selArea;\n}else{\nif(this.isWebKit){\nfixEl=document.getElementsByClassName(\"imgCrop_marqueeSouth\",this.imgWrap)[0];\nd=Builder.node(\"div\",\"\");\nd.style.visibility=\"hidden\";\nvar _4a=[\"SE\",\"S\",\"SW\"];\nfor(i=0;i<_4a.length;i++){\nel=document.getElementsByClassName(\"imgCrop_handle\"+_4a[i],this.selArea)[0];\nif(el.childNodes.length){\nel.removeChild(el.childNodes[0]);\n}\nel.appendChild(d);\n}\n}\n}\nfixEl.appendChild(n);\nfixEl.removeChild(n);\n}\n},startResize:function(e){\nthis.startCoords=this.cloneCoords(this.areaCoords);\nthis.resizing=true;\nthis.resizeHandle=Element.classNames(Event.element(e)).toString().replace(/([^N|NE|E|SE|S|SW|W|NW])+/,\"\");\nEvent.stop(e);\n},startDrag:function(e){\nElement.show(this.selArea);\nthis.clickCoords=this.getCurPos(e);\nthis.setAreaCoords({x1:this.clickCoords.x,y1:this.clickCoords.y,x2:this.clickCoords.x,y2:this.clickCoords.y});\nthis.dragging=true;\nthis.onDrag(e);\nEvent.stop(e);\n},getCurPos:function(e){\nreturn curPos={x:Event.pointerX(e)-this.wrapOffsets.left,y:Event.pointerY(e)-this.wrapOffsets.top};\n},onDrag:function(e){\nvar _4f=null;\nif(this.dragging||this.resizing){\nvar _50=this.getCurPos(e);\nvar _51=this.cloneCoords(this.areaCoords);\nvar _52={x:1,y:1};\n}\nif(this.dragging){\nif(_50.x<this.clickCoords.x){\n_52.x=-1;\n}\nif(_50.y<this.clickCoords.y){\n_52.y=-1;\n}\nthis.transformCoords(_50.x,this.clickCoords.x,_51,\"x\");\nthis.transformCoords(_50.y,this.clickCoords.y,_51,\"y\");\n}else{\nif(this.resizing){\n_4f=this.resizeHandle;\nif(_4f.match(/E/)){\nthis.transformCoords(_50.x,this.startCoords.x1,_51,\"x\");\nif(_50.x<this.startCoords.x1){\n_52.x=-1;\n}\n}else{\nif(_4f.match(/W/)){\nthis.transformCoords(_50.x,this.startCoords.x2,_51,\"x\");\nif(_50.x<this.startCoords.x2){\n_52.x=-1;\n}\n}\n}\nif(_4f.match(/N/)){\nthis.transformCoords(_50.y,this.startCoords.y2,_51,\"y\");\nif(_50.y<this.startCoords.y2){\n_52.y=-1;\n}\n}else{\nif(_4f.match(/S/)){\nthis.transformCoords(_50.y,this.startCoords.y1,_51,\"y\");\nif(_50.y<this.startCoords.y1){\n_52.y=-1;\n}\n}\n}\n}\n}\nif(this.dragging||this.resizing){\nthis.setAreaCoords(_51,false,e.shiftKey,_52,_4f);\nthis.drawArea();\nEvent.stop(e);\n}\n},transformCoords:function(_53,_54,_55,_56){\nvar _57=new Array();\nif(_53<_54){\n_57[0]=_53;\n_57[1]=_54;\n}else{\n_57[0]=_54;\n_57[1]=_53;\n}\nif(_56==\"x\"){\n_55.x1=_57[0];\n_55.x2=_57[1];\n}else{\n_55.y1=_57[0];\n_55.y2=_57[1];\n}\n},endCrop:function(){\nthis.dragging=false;\nthis.resizing=false;\nthis.options.onEndCrop(this.areaCoords,{width:this.calcW(),height:this.calcH()});\n},subInitialize:function(){\n},subDrawArea:function(){\n}};\nCropper.ImgWithPreview=Class.create();\nObject.extend(Object.extend(Cropper.ImgWithPreview.prototype,Cropper.Img.prototype),{subInitialize:function(){\nthis.hasPreviewImg=false;\nif(typeof (this.options.previewWrap)!=\"undefined\"&&this.options.minWidth>0&&this.options.minHeight>0){\nthis.previewWrap=$(this.options.previewWrap);\nthis.previewImg=this.img.cloneNode(false);\nthis.options.displayOnInit=true;\nthis.hasPreviewImg=true;\nElement.addClassName(this.previewWrap,\"imgCrop_previewWrap\");\nElement.setStyle(this.previewWrap,{width:this.options.minWidth+\"px\",height:this.options.minHeight+\"px\"});\nthis.previewWrap.appendChild(this.previewImg);\n}\n},subDrawArea:function(){\nif(this.hasPreviewImg){\nvar _58=this.calcW();\nvar _59=this.calcH();\nvar _5a={x:this.imgW/_58,y:this.imgH/_59};\nvar _5b={x:_58/this.options.minWidth,y:_59/this.options.minHeight};\nvar _5c={w:Math.ceil(this.options.minWidth*_5a.x)+\"px\",h:Math.ceil(this.options.minHeight*_5a.y)+\"px\",x:\"-\"+Math.ceil(this.areaCoords.x1/_5b.x)+\"px\",y:\"-\"+Math.ceil(this.areaCoords.y1/_5b.y)+\"px\"};\nvar _5d=this.previewImg.style;\n_5d.width=_5c.w;\n_5d.height=_5c.h;\n_5d.left=_5c.x;\n_5d.top=_5c.y;\n}\n}});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/customize-base.js",
    "content": "window.wp = window.wp || {};\n\n(function( exports, $ ){\n\tvar api = {}, ctor, inherits,\n\t\tslice = Array.prototype.slice;\n\n\t// Shared empty constructor function to aid in prototype-chain creation.\n\tctor = function() {};\n\n\t/**\n\t * Helper function to correctly set up the prototype chain, for subclasses.\n\t * Similar to `goog.inherits`, but uses a hash of prototype properties and\n\t * class properties to be extended.\n\t *\n\t * @param  object parent      Parent class constructor to inherit from.\n\t * @param  object protoProps  Properties to apply to the prototype for use as class instance properties.\n\t * @param  object staticProps Properties to apply directly to the class constructor.\n\t * @return child              The subclassed constructor.\n\t */\n\tinherits = function( parent, protoProps, staticProps ) {\n\t\tvar child;\n\n\t\t// The constructor function for the new subclass is either defined by you\n\t\t// (the \"constructor\" property in your `extend` definition), or defaulted\n\t\t// by us to simply call `super()`.\n\t\tif ( protoProps && protoProps.hasOwnProperty( 'constructor' ) ) {\n\t\t\tchild = protoProps.constructor;\n\t\t} else {\n\t\t\tchild = function() {\n\t\t\t\t// Storing the result `super()` before returning the value\n\t\t\t\t// prevents a bug in Opera where, if the constructor returns\n\t\t\t\t// a function, Opera will reject the return value in favor of\n\t\t\t\t// the original object. This causes all sorts of trouble.\n\t\t\t\tvar result = parent.apply( this, arguments );\n\t\t\t\treturn result;\n\t\t\t};\n\t\t}\n\n\t\t// Inherit class (static) properties from parent.\n\t\t$.extend( child, parent );\n\n\t\t// Set the prototype chain to inherit from `parent`, without calling\n\t\t// `parent`'s constructor function.\n\t\tctor.prototype  = parent.prototype;\n\t\tchild.prototype = new ctor();\n\n\t\t// Add prototype properties (instance properties) to the subclass,\n\t\t// if supplied.\n\t\tif ( protoProps )\n\t\t\t$.extend( child.prototype, protoProps );\n\n\t\t// Add static properties to the constructor function, if supplied.\n\t\tif ( staticProps )\n\t\t\t$.extend( child, staticProps );\n\n\t\t// Correctly set child's `prototype.constructor`.\n\t\tchild.prototype.constructor = child;\n\n\t\t// Set a convenience property in case the parent's prototype is needed later.\n\t\tchild.__super__ = parent.prototype;\n\n\t\treturn child;\n\t};\n\n\t/**\n\t * Base class for object inheritance.\n\t */\n\tapi.Class = function( applicator, argsArray, options ) {\n\t\tvar magic, args = arguments;\n\n\t\tif ( applicator && argsArray && api.Class.applicator === applicator ) {\n\t\t\targs = argsArray;\n\t\t\t$.extend( this, options || {} );\n\t\t}\n\n\t\tmagic = this;\n\n\t\t/*\n\t\t * If the class has a method called \"instance\",\n\t\t * the return value from the class' constructor will be a function that\n\t\t * calls the \"instance\" method.\n\t\t *\n\t\t * It is also an object that has properties and methods inside it.\n\t\t */\n\t\tif ( this.instance ) {\n\t\t\tmagic = function() {\n\t\t\t\treturn magic.instance.apply( magic, arguments );\n\t\t\t};\n\n\t\t\t$.extend( magic, this );\n\t\t}\n\n\t\tmagic.initialize.apply( magic, args );\n\t\treturn magic;\n\t};\n\n\t/**\n\t * Creates a subclass of the class.\n\t *\n\t * @param  object protoProps  Properties to apply to the prototype.\n\t * @param  object staticProps Properties to apply directly to the class.\n\t * @return child              The subclass.\n\t */\n\tapi.Class.extend = function( protoProps, classProps ) {\n\t\tvar child = inherits( this, protoProps, classProps );\n\t\tchild.extend = this.extend;\n\t\treturn child;\n\t};\n\n\tapi.Class.applicator = {};\n\n\t/**\n\t * Initialize a class instance.\n\t *\n\t * Override this function in a subclass as needed.\n\t */\n\tapi.Class.prototype.initialize = function() {};\n\n\t/*\n\t * Checks whether a given instance extended a constructor.\n\t *\n\t * The magic surrounding the instance parameter causes the instanceof\n\t * keyword to return inaccurate results; it defaults to the function's\n\t * prototype instead of the constructor chain. Hence this function.\n\t */\n\tapi.Class.prototype.extended = function( constructor ) {\n\t\tvar proto = this;\n\n\t\twhile ( typeof proto.constructor !== 'undefined' ) {\n\t\t\tif ( proto.constructor === constructor )\n\t\t\t\treturn true;\n\t\t\tif ( typeof proto.constructor.__super__ === 'undefined' )\n\t\t\t\treturn false;\n\t\t\tproto = proto.constructor.__super__;\n\t\t}\n\t\treturn false;\n\t};\n\n\t/**\n\t * An events manager object, offering the ability to bind to and trigger events.\n\t *\n\t * Used as a mixin.\n\t */\n\tapi.Events = {\n\t\ttrigger: function( id ) {\n\t\t\tif ( this.topics && this.topics[ id ] )\n\t\t\t\tthis.topics[ id ].fireWith( this, slice.call( arguments, 1 ) );\n\t\t\treturn this;\n\t\t},\n\n\t\tbind: function( id ) {\n\t\t\tthis.topics = this.topics || {};\n\t\t\tthis.topics[ id ] = this.topics[ id ] || $.Callbacks();\n\t\t\tthis.topics[ id ].add.apply( this.topics[ id ], slice.call( arguments, 1 ) );\n\t\t\treturn this;\n\t\t},\n\n\t\tunbind: function( id ) {\n\t\t\tif ( this.topics && this.topics[ id ] )\n\t\t\t\tthis.topics[ id ].remove.apply( this.topics[ id ], slice.call( arguments, 1 ) );\n\t\t\treturn this;\n\t\t}\n\t};\n\n\t/**\n\t * Observable values that support two-way binding.\n\t *\n\t * @constuctor\n\t */\n\tapi.Value = api.Class.extend({\n\t\t/**\n\t\t * @param {mixed}  initial The initial value.\n\t\t * @param {object} options\n\t\t */\n\t\tinitialize: function( initial, options ) {\n\t\t\tthis._value = initial; // @todo: potentially change this to a this.set() call.\n\t\t\tthis.callbacks = $.Callbacks();\n\t\t\tthis._dirty = false;\n\n\t\t\t$.extend( this, options || {} );\n\n\t\t\tthis.set = $.proxy( this.set, this );\n\t\t},\n\n\t\t/*\n\t\t * Magic. Returns a function that will become the instance.\n\t\t * Set to null to prevent the instance from extending a function.\n\t\t */\n\t\tinstance: function() {\n\t\t\treturn arguments.length ? this.set.apply( this, arguments ) : this.get();\n\t\t},\n\n\t\t/**\n\t\t * Get the value.\n\t\t *\n\t\t * @return {mixed}\n\t\t */\n\t\tget: function() {\n\t\t\treturn this._value;\n\t\t},\n\n\t\t/**\n\t\t * Set the value and trigger all bound callbacks.\n\t\t *\n\t\t * @param {object} to New value.\n\t\t */\n\t\tset: function( to ) {\n\t\t\tvar from = this._value;\n\n\t\t\tto = this._setter.apply( this, arguments );\n\t\t\tto = this.validate( to );\n\n\t\t\t// Bail if the sanitized value is null or unchanged.\n\t\t\tif ( null === to || _.isEqual( from, to ) ) {\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tthis._value = to;\n\t\t\tthis._dirty = true;\n\n\t\t\tthis.callbacks.fireWith( this, [ to, from ] );\n\n\t\t\treturn this;\n\t\t},\n\n\t\t_setter: function( to ) {\n\t\t\treturn to;\n\t\t},\n\n\t\tsetter: function( callback ) {\n\t\t\tvar from = this.get();\n\t\t\tthis._setter = callback;\n\t\t\t// Temporarily clear value so setter can decide if it's valid.\n\t\t\tthis._value = null;\n\t\t\tthis.set( from );\n\t\t\treturn this;\n\t\t},\n\n\t\tresetSetter: function() {\n\t\t\tthis._setter = this.constructor.prototype._setter;\n\t\t\tthis.set( this.get() );\n\t\t\treturn this;\n\t\t},\n\n\t\tvalidate: function( value ) {\n\t\t\treturn value;\n\t\t},\n\n\t\t/**\n\t\t * Bind a function to be invoked whenever the value changes.\n\t\t *\n\t\t * @param {...Function} A function, or multiple functions, to add to the callback stack.\n\t\t */\n\t\tbind: function() {\n\t\t\tthis.callbacks.add.apply( this.callbacks, arguments );\n\t\t\treturn this;\n\t\t},\n\n\t\t/**\n\t\t * Unbind a previously bound function.\n\t\t *\n\t\t * @param {...Function} A function, or multiple functions, to remove from the callback stack.\n\t\t */\n\t\tunbind: function() {\n\t\t\tthis.callbacks.remove.apply( this.callbacks, arguments );\n\t\t\treturn this;\n\t\t},\n\n\t\tlink: function() { // values*\n\t\t\tvar set = this.set;\n\t\t\t$.each( arguments, function() {\n\t\t\t\tthis.bind( set );\n\t\t\t});\n\t\t\treturn this;\n\t\t},\n\n\t\tunlink: function() { // values*\n\t\t\tvar set = this.set;\n\t\t\t$.each( arguments, function() {\n\t\t\t\tthis.unbind( set );\n\t\t\t});\n\t\t\treturn this;\n\t\t},\n\n\t\tsync: function() { // values*\n\t\t\tvar that = this;\n\t\t\t$.each( arguments, function() {\n\t\t\t\tthat.link( this );\n\t\t\t\tthis.link( that );\n\t\t\t});\n\t\t\treturn this;\n\t\t},\n\n\t\tunsync: function() { // values*\n\t\t\tvar that = this;\n\t\t\t$.each( arguments, function() {\n\t\t\t\tthat.unlink( this );\n\t\t\t\tthis.unlink( that );\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\t});\n\n\t/**\n\t * A collection of observable values.\n\t *\n\t * @constuctor\n\t * @augments wp.customize.Class\n\t * @mixes wp.customize.Events\n\t */\n\tapi.Values = api.Class.extend({\n\n\t\t/**\n\t\t * The default constructor for items of the collection.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tdefaultConstructor: api.Value,\n\n\t\tinitialize: function( options ) {\n\t\t\t$.extend( this, options || {} );\n\n\t\t\tthis._value = {};\n\t\t\tthis._deferreds = {};\n\t\t},\n\n\t\t/**\n\t\t * Get the instance of an item from the collection if only ID is specified.\n\t\t *\n\t\t * If more than one argument is supplied, all are expected to be IDs and\n\t\t * the last to be a function callback that will be invoked when the requested\n\t\t * items are available.\n\t\t *\n\t\t * @see {api.Values.when}\n\t\t *\n\t\t * @param  {string}   id ID of the item.\n\t\t * @param  {...}         Zero or more IDs of items to wait for and a callback\n\t\t *                       function to invoke when they're available. Optional.\n\t\t * @return {mixed}    The item instance if only one ID was supplied.\n\t\t *                    A Deferred Promise object if a callback function is supplied.\n\t\t */\n\t\tinstance: function( id ) {\n\t\t\tif ( arguments.length === 1 )\n\t\t\t\treturn this.value( id );\n\n\t\t\treturn this.when.apply( this, arguments );\n\t\t},\n\n\t\t/**\n\t\t * Get the instance of an item.\n\t\t *\n\t\t * @param  {string} id The ID of the item.\n\t\t * @return {[type]}    [description]\n\t\t */\n\t\tvalue: function( id ) {\n\t\t\treturn this._value[ id ];\n\t\t},\n\n\t\t/**\n\t\t * Whether the collection has an item with the given ID.\n\t\t *\n\t\t * @param  {string}  id The ID of the item to look for.\n\t\t * @return {Boolean}\n\t\t */\n\t\thas: function( id ) {\n\t\t\treturn typeof this._value[ id ] !== 'undefined';\n\t\t},\n\n\t\t/**\n\t\t * Add an item to the collection.\n\t\t *\n\t\t * @param {string} id    The ID of the item.\n\t\t * @param {mixed}  value The item instance.\n\t\t * @return {mixed} The new item's instance.\n\t\t */\n\t\tadd: function( id, value ) {\n\t\t\tif ( this.has( id ) )\n\t\t\t\treturn this.value( id );\n\n\t\t\tthis._value[ id ] = value;\n\t\t\tvalue.parent = this;\n\n\t\t\t// Propagate a 'change' event on an item up to the collection.\n\t\t\tif ( value.extended( api.Value ) )\n\t\t\t\tvalue.bind( this._change );\n\n\t\t\tthis.trigger( 'add', value );\n\n\t\t\t// If a deferred object exists for this item,\n\t\t\t// resolve it.\n\t\t\tif ( this._deferreds[ id ] )\n\t\t\t\tthis._deferreds[ id ].resolve();\n\n\t\t\treturn this._value[ id ];\n\t\t},\n\n\t\t/**\n\t\t * Create a new item of the collection using the collection's default constructor\n\t\t * and store it in the collection.\n\t\t *\n\t\t * @param  {string} id    The ID of the item.\n\t\t * @param  {mixed}  value Any extra arguments are passed into the item's initialize method.\n\t\t * @return {mixed}  The new item's instance.\n\t\t */\n\t\tcreate: function( id ) {\n\t\t\treturn this.add( id, new this.defaultConstructor( api.Class.applicator, slice.call( arguments, 1 ) ) );\n\t\t},\n\n\t\t/**\n\t\t * Iterate over all items in the collection invoking the provided callback.\n\t\t *\n\t\t * @param  {Function} callback Function to invoke.\n\t\t * @param  {object}   context  Object context to invoke the function with. Optional.\n\t\t */\n\t\teach: function( callback, context ) {\n\t\t\tcontext = typeof context === 'undefined' ? this : context;\n\n\t\t\t$.each( this._value, function( key, obj ) {\n\t\t\t\tcallback.call( context, obj, key );\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Remove an item from the collection.\n\t\t *\n\t\t * @param  {string} id The ID of the item to remove.\n\t\t */\n\t\tremove: function( id ) {\n\t\t\tvar value;\n\n\t\t\tif ( this.has( id ) ) {\n\t\t\t\tvalue = this.value( id );\n\t\t\t\tthis.trigger( 'remove', value );\n\t\t\t\tif ( value.extended( api.Value ) )\n\t\t\t\t\tvalue.unbind( this._change );\n\t\t\t\tdelete value.parent;\n\t\t\t}\n\n\t\t\tdelete this._value[ id ];\n\t\t\tdelete this._deferreds[ id ];\n\t\t},\n\n\t\t/**\n\t\t * Runs a callback once all requested values exist.\n\t\t *\n\t\t * when( ids*, [callback] );\n\t\t *\n\t\t * For example:\n\t\t *     when( id1, id2, id3, function( value1, value2, value3 ) {} );\n\t\t *\n\t\t * @returns $.Deferred.promise();\n\t\t */\n\t\twhen: function() {\n\t\t\tvar self = this,\n\t\t\t\tids  = slice.call( arguments ),\n\t\t\t\tdfd  = $.Deferred();\n\n\t\t\t// If the last argument is a callback, bind it to .done()\n\t\t\tif ( $.isFunction( ids[ ids.length - 1 ] ) )\n\t\t\t\tdfd.done( ids.pop() );\n\n\t\t\t/*\n\t\t\t * Create a stack of deferred objects for each item that is not\n\t\t\t * yet available, and invoke the supplied callback when they are.\n\t\t\t */\n\t\t\t$.when.apply( $, $.map( ids, function( id ) {\n\t\t\t\tif ( self.has( id ) )\n\t\t\t\t\treturn;\n\n\t\t\t\t/*\n\t\t\t\t * The requested item is not available yet, create a deferred\n\t\t\t\t * object to resolve when it becomes available.\n\t\t\t\t */\n\t\t\t\treturn self._deferreds[ id ] = self._deferreds[ id ] || $.Deferred();\n\t\t\t})).done( function() {\n\t\t\t\tvar values = $.map( ids, function( id ) {\n\t\t\t\t\t\treturn self( id );\n\t\t\t\t\t});\n\n\t\t\t\t// If a value is missing, we've used at least one expired deferred.\n\t\t\t\t// Call Values.when again to generate a new deferred.\n\t\t\t\tif ( values.length !== ids.length ) {\n\t\t\t\t\t// ids.push( callback );\n\t\t\t\t\tself.when.apply( self, ids ).done( function() {\n\t\t\t\t\t\tdfd.resolveWith( self, values );\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdfd.resolveWith( self, values );\n\t\t\t});\n\n\t\t\treturn dfd.promise();\n\t\t},\n\n\t\t/**\n\t\t * A helper function to propagate a 'change' event from an item\n\t\t * to the collection itself.\n\t\t */\n\t\t_change: function() {\n\t\t\tthis.parent.trigger( 'change', this );\n\t\t}\n\t});\n\n\t// Create a global events bus on the Customizer.\n\t$.extend( api.Values.prototype, api.Events );\n\n\n\t/**\n\t * Cast a string to a jQuery collection if it isn't already.\n\t *\n\t * @param {string|jQuery collection} element\n\t */\n\tapi.ensure = function( element ) {\n\t\treturn typeof element == 'string' ? $( element ) : element;\n\t};\n\n\t/**\n\t * An observable value that syncs with an element.\n\t *\n\t * Handles inputs, selects, and textareas by default.\n\t *\n\t * @constuctor\n\t * @augments wp.customize.Value\n\t * @augments wp.customize.Class\n\t */\n\tapi.Element = api.Value.extend({\n\t\tinitialize: function( element, options ) {\n\t\t\tvar self = this,\n\t\t\t\tsynchronizer = api.Element.synchronizer.html,\n\t\t\t\ttype, update, refresh;\n\n\t\t\tthis.element = api.ensure( element );\n\t\t\tthis.events = '';\n\n\t\t\tif ( this.element.is('input, select, textarea') ) {\n\t\t\t\tthis.events += 'change';\n\t\t\t\tsynchronizer = api.Element.synchronizer.val;\n\n\t\t\t\tif ( this.element.is('input') ) {\n\t\t\t\t\ttype = this.element.prop('type');\n\t\t\t\t\tif ( api.Element.synchronizer[ type ] ) {\n\t\t\t\t\t\tsynchronizer = api.Element.synchronizer[ type ];\n\t\t\t\t\t}\n\t\t\t\t\tif ( 'text' === type || 'password' === type ) {\n\t\t\t\t\t\tthis.events += ' keyup';\n\t\t\t\t\t} else if ( 'range' === type ) {\n\t\t\t\t\t\tthis.events += ' input propertychange';\n\t\t\t\t\t}\n\t\t\t\t} else if ( this.element.is('textarea') ) {\n\t\t\t\t\tthis.events += ' keyup';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tapi.Value.prototype.initialize.call( this, null, $.extend( options || {}, synchronizer ) );\n\t\t\tthis._value = this.get();\n\n\t\t\tupdate  = this.update;\n\t\t\trefresh = this.refresh;\n\n\t\t\tthis.update = function( to ) {\n\t\t\t\tif ( to !== refresh.call( self ) )\n\t\t\t\t\tupdate.apply( this, arguments );\n\t\t\t};\n\t\t\tthis.refresh = function() {\n\t\t\t\tself.set( refresh.call( self ) );\n\t\t\t};\n\n\t\t\tthis.bind( this.update );\n\t\t\tthis.element.bind( this.events, this.refresh );\n\t\t},\n\n\t\tfind: function( selector ) {\n\t\t\treturn $( selector, this.element );\n\t\t},\n\n\t\trefresh: function() {},\n\n\t\tupdate: function() {}\n\t});\n\n\tapi.Element.synchronizer = {};\n\n\t$.each( [ 'html', 'val' ], function( index, method ) {\n\t\tapi.Element.synchronizer[ method ] = {\n\t\t\tupdate: function( to ) {\n\t\t\t\tthis.element[ method ]( to );\n\t\t\t},\n\t\t\trefresh: function() {\n\t\t\t\treturn this.element[ method ]();\n\t\t\t}\n\t\t};\n\t});\n\n\tapi.Element.synchronizer.checkbox = {\n\t\tupdate: function( to ) {\n\t\t\tthis.element.prop( 'checked', to );\n\t\t},\n\t\trefresh: function() {\n\t\t\treturn this.element.prop( 'checked' );\n\t\t}\n\t};\n\n\tapi.Element.synchronizer.radio = {\n\t\tupdate: function( to ) {\n\t\t\tthis.element.filter( function() {\n\t\t\t\treturn this.value === to;\n\t\t\t}).prop( 'checked', true );\n\t\t},\n\t\trefresh: function() {\n\t\t\treturn this.element.filter( ':checked' ).val();\n\t\t}\n\t};\n\n\t$.support.postMessage = !! window.postMessage;\n\n\t/**\n\t * A communicator for sending data from one window to another over postMessage.\n\t *\n\t * @constuctor\n\t * @augments wp.customize.Class\n\t * @mixes wp.customize.Events\n\t */\n\tapi.Messenger = api.Class.extend({\n\t\t/**\n\t\t * Create a new Value.\n\t\t *\n\t\t * @param  {string} key     Unique identifier.\n\t\t * @param  {mixed}  initial Initial value.\n\t\t * @param  {mixed}  options Options hash. Optional.\n\t\t * @return {Value}          Class instance of the Value.\n\t\t */\n\t\tadd: function( key, initial, options ) {\n\t\t\treturn this[ key ] = new api.Value( initial, options );\n\t\t},\n\n\t\t/**\n\t\t * Initialize Messenger.\n\t\t *\n\t\t * @param  {object} params        Parameters to configure the messenger.\n\t\t *         {string} .url          The URL to communicate with.\n\t\t *         {window} .targetWindow The window instance to communicate with. Default window.parent.\n\t\t *         {string} .channel      If provided, will send the channel with each message and only accept messages a matching channel.\n\t\t * @param  {object} options       Extend any instance parameter or method with this object.\n\t\t */\n\t\tinitialize: function( params, options ) {\n\t\t\t// Target the parent frame by default, but only if a parent frame exists.\n\t\t\tvar defaultTarget = window.parent == window ? null : window.parent;\n\n\t\t\t$.extend( this, options || {} );\n\n\t\t\tthis.add( 'channel', params.channel );\n\t\t\tthis.add( 'url', params.url || '' );\n\t\t\tthis.add( 'origin', this.url() ).link( this.url ).setter( function( to ) {\n\t\t\t\treturn to.replace( /([^:]+:\\/\\/[^\\/]+).*/, '$1' );\n\t\t\t});\n\n\t\t\t// first add with no value\n\t\t\tthis.add( 'targetWindow', null );\n\t\t\t// This avoids SecurityErrors when setting a window object in x-origin iframe'd scenarios.\n\t\t\tthis.targetWindow.set = function( to ) {\n\t\t\t\tvar from = this._value;\n\n\t\t\t\tto = this._setter.apply( this, arguments );\n\t\t\t\tto = this.validate( to );\n\n\t\t\t\tif ( null === to || from === to ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t\tthis._value = to;\n\t\t\t\tthis._dirty = true;\n\n\t\t\t\tthis.callbacks.fireWith( this, [ to, from ] );\n\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\t// now set it\n\t\t\tthis.targetWindow( params.targetWindow || defaultTarget );\n\n\n\t\t\t// Since we want jQuery to treat the receive function as unique\n\t\t\t// to this instance, we give the function a new guid.\n\t\t\t//\n\t\t\t// This will prevent every Messenger's receive function from being\n\t\t\t// unbound when calling $.off( 'message', this.receive );\n\t\t\tthis.receive = $.proxy( this.receive, this );\n\t\t\tthis.receive.guid = $.guid++;\n\n\t\t\t$( window ).on( 'message', this.receive );\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\t$( window ).off( 'message', this.receive );\n\t\t},\n\n\t\t/**\n\t\t * Receive data from the other window.\n\t\t *\n\t\t * @param  {jQuery.Event} event Event with embedded data.\n\t\t */\n\t\treceive: function( event ) {\n\t\t\tvar message;\n\n\t\t\tevent = event.originalEvent;\n\n\t\t\tif ( ! this.targetWindow() )\n\t\t\t\treturn;\n\n\t\t\t// Check to make sure the origin is valid.\n\t\t\tif ( this.origin() && event.origin !== this.origin() )\n\t\t\t\treturn;\n\n\t\t\t// Ensure we have a string that's JSON.parse-able\n\t\t\tif ( typeof event.data !== 'string' || event.data[0] !== '{' ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmessage = JSON.parse( event.data );\n\n\t\t\t// Check required message properties.\n\t\t\tif ( ! message || ! message.id || typeof message.data === 'undefined' )\n\t\t\t\treturn;\n\n\t\t\t// Check if channel names match.\n\t\t\tif ( ( message.channel || this.channel() ) && this.channel() !== message.channel )\n\t\t\t\treturn;\n\n\t\t\tthis.trigger( message.id, message.data );\n\t\t},\n\n\t\t/**\n\t\t * Send data to the other window.\n\t\t *\n\t\t * @param  {string} id   The event name.\n\t\t * @param  {object} data Data.\n\t\t */\n\t\tsend: function( id, data ) {\n\t\t\tvar message;\n\n\t\t\tdata = typeof data === 'undefined' ? null : data;\n\n\t\t\tif ( ! this.url() || ! this.targetWindow() )\n\t\t\t\treturn;\n\n\t\t\tmessage = { id: id, data: data };\n\t\t\tif ( this.channel() )\n\t\t\t\tmessage.channel = this.channel();\n\n\t\t\tthis.targetWindow().postMessage( JSON.stringify( message ), this.origin() );\n\t\t}\n\t});\n\n\t// Add the Events mixin to api.Messenger.\n\t$.extend( api.Messenger.prototype, api.Events );\n\n\t// The main API object is also a collection of all customizer settings.\n\tapi = $.extend( new api.Values(), api );\n\n\t/**\n\t * Get all customize settings.\n\t *\n\t * @return {object}\n\t */\n\tapi.get = function() {\n\t\tvar result = {};\n\n\t\tthis.each( function( obj, key ) {\n\t\t\tresult[ key ] = obj.get();\n\t\t});\n\n\t\treturn result;\n\t};\n\n\t// Expose the API publicly on window.wp.customize\n\texports.customize = api;\n})( wp, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/customize-loader.js",
    "content": "/* global _wpCustomizeLoaderSettings, confirm */\n/*\n * Expose a public API that allows the customizer to be\n * loaded on any page.\n */\nwindow.wp = window.wp || {};\n\n(function( exports, $ ){\n\tvar api = wp.customize,\n\t\tLoader;\n\n\t$.extend( $.support, {\n\t\thistory: !! ( window.history && history.pushState ),\n\t\thashchange: ('onhashchange' in window) && (document.documentMode === undefined || document.documentMode > 7)\n\t});\n\n\t/**\n\t * Allows the Customizer to be overlayed on any page.\n\t *\n\t * By default, any element in the body with the load-customize class will open\n\t * an iframe overlay with the URL specified.\n\t *\n\t *     e.g. <a class=\"load-customize\" href=\"<?php echo wp_customize_url(); ?>\">Open Customizer</a>\n\t *\n\t * @augments wp.customize.Events\n\t */\n\tLoader = $.extend( {}, api.Events, {\n\t\t/**\n\t\t * Setup the Loader; triggered on document#ready.\n\t\t */\n\t\tinitialize: function() {\n\t\t\tthis.body = $( document.body );\n\n\t\t\t// Ensure the loader is supported.\n\t\t\t// Check for settings, postMessage support, and whether we require CORS support.\n\t\t\tif ( ! Loader.settings || ! $.support.postMessage || ( ! $.support.cors && Loader.settings.isCrossDomain ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.window  = $( window );\n\t\t\tthis.element = $( '<div id=\"customize-container\" />' ).appendTo( this.body );\n\n\t\t\t// Bind events for opening and closing the overlay.\n\t\t\tthis.bind( 'open', this.overlay.show );\n\t\t\tthis.bind( 'close', this.overlay.hide );\n\n\t\t\t// Any element in the body with the `load-customize` class opens\n\t\t\t// the Customizer.\n\t\t\t$('#wpbody').on( 'click', '.load-customize', function( event ) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// Store a reference to the link that opened the Customizer.\n\t\t\t\tLoader.link = $(this);\n\t\t\t\t// Load the theme.\n\t\t\t\tLoader.open( Loader.link.attr('href') );\n\t\t\t});\n\n\t\t\t// Add navigation listeners.\n\t\t\tif ( $.support.history ) {\n\t\t\t\tthis.window.on( 'popstate', Loader.popstate );\n\t\t\t}\n\n\t\t\tif ( $.support.hashchange ) {\n\t\t\t\tthis.window.on( 'hashchange', Loader.hashchange );\n\t\t\t\tthis.window.triggerHandler( 'hashchange' );\n\t\t\t}\n\t\t},\n\n\t\tpopstate: function( e ) {\n\t\t\tvar state = e.originalEvent.state;\n\t\t\tif ( state && state.customize ) {\n\t\t\t\tLoader.open( state.customize );\n\t\t\t} else if ( Loader.active ) {\n\t\t\t\tLoader.close();\n\t\t\t}\n\t\t},\n\n\t\thashchange: function() {\n\t\t\tvar hash = window.location.toString().split('#')[1];\n\n\t\t\tif ( hash && 0 === hash.indexOf( 'wp_customize=on' ) ) {\n\t\t\t\tLoader.open( Loader.settings.url + '?' + hash );\n\t\t\t}\n\n\t\t\tif ( ! hash && ! $.support.history ) {\n\t\t\t\tLoader.close();\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: function () {\n\t\t\tif ( ! Loader.saved() ) {\n\t\t\t\treturn Loader.settings.l10n.saveAlert;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Open the Customizer overlay for a specific URL.\n\t\t *\n\t\t * @param  string src URL to load in the Customizer.\n\t\t */\n\t\topen: function( src ) {\n\n\t\t\tif ( this.active ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Load the full page on mobile devices.\n\t\t\tif ( Loader.settings.browser.mobile ) {\n\t\t\t\treturn window.location = src;\n\t\t\t}\n\n\t\t\t// Store the document title prior to opening the Live Preview\n\t\t\tthis.originalDocumentTitle = document.title;\n\n\t\t\tthis.active = true;\n\t\t\tthis.body.addClass('customize-loading');\n\n\t\t\t/*\n\t\t\t * Track the dirtiness state (whether the drafted changes have been published)\n\t\t\t * of the Customizer in the iframe. This is used to decide whether to display\n\t\t\t * an AYS alert if the user tries to close the window before saving changes.\n\t\t\t */\n\t\t\tthis.saved = new api.Value( true );\n\n\t\t\tthis.iframe = $( '<iframe />', { 'src': src, 'title': Loader.settings.l10n.mainIframeTitle } ).appendTo( this.element );\n\t\t\tthis.iframe.one( 'load', this.loaded );\n\n\t\t\t// Create a postMessage connection with the iframe.\n\t\t\tthis.messenger = new api.Messenger({\n\t\t\t\turl: src,\n\t\t\t\tchannel: 'loader',\n\t\t\t\ttargetWindow: this.iframe[0].contentWindow\n\t\t\t});\n\n\t\t\t// Wait for the connection from the iframe before sending any postMessage events.\n\t\t\tthis.messenger.bind( 'ready', function() {\n\t\t\t\tLoader.messenger.send( 'back' );\n\t\t\t});\n\n\t\t\tthis.messenger.bind( 'close', function() {\n\t\t\t\tif ( $.support.history ) {\n\t\t\t\t\thistory.back();\n\t\t\t\t} else if ( $.support.hashchange ) {\n\t\t\t\t\twindow.location.hash = '';\n\t\t\t\t} else {\n\t\t\t\t\tLoader.close();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Prompt AYS dialog when navigating away\n\t\t\t$( window ).on( 'beforeunload', this.beforeunload );\n\n\t\t\tthis.messenger.bind( 'activated', function( location ) {\n\t\t\t\tif ( location ) {\n\t\t\t\t\twindow.location = location;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.messenger.bind( 'saved', function () {\n\t\t\t\tLoader.saved( true );\n\t\t\t} );\n\t\t\tthis.messenger.bind( 'change', function () {\n\t\t\t\tLoader.saved( false );\n\t\t\t} );\n\n\t\t\tthis.messenger.bind( 'title', function( newTitle ){\n\t\t\t\twindow.document.title = newTitle;\n\t\t\t});\n\n\t\t\tthis.pushState( src );\n\n\t\t\tthis.trigger( 'open' );\n\t\t},\n\n\t\tpushState: function ( src ) {\n\t\t\tvar hash = src.split( '?' )[1];\n\n\t\t\t// Ensure we don't call pushState if the user hit the forward button.\n\t\t\tif ( $.support.history && window.location.href !== src ) {\n\t\t\t\thistory.pushState( { customize: src }, '', src );\n\t\t\t} else if ( ! $.support.history && $.support.hashchange && hash ) {\n\t\t\t\twindow.location.hash = 'wp_customize=on&' + hash;\n\t\t\t}\n\n\t\t\tthis.trigger( 'open' );\n\t\t},\n\n\t\t/**\n\t\t * Callback after the Customizer has been opened.\n\t\t */\n\t\topened: function() {\n\t\t\tLoader.body.addClass( 'customize-active full-overlay-active' );\n\t\t},\n\n\t\t/**\n\t\t * Close the Customizer overlay and return focus to the link that opened it.\n\t\t */\n\t\tclose: function() {\n\t\t\tif ( ! this.active ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Display AYS dialog if Customizer is dirty\n\t\t\tif ( ! this.saved() && ! confirm( Loader.settings.l10n.saveAlert ) ) {\n\t\t\t\t// Go forward since Customizer is exited by history.back()\n\t\t\t\thistory.forward();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.active = false;\n\n\t\t\tthis.trigger( 'close' );\n\n\t\t\t// Restore document title prior to opening the Live Preview\n\t\t\tif ( this.originalDocumentTitle ) {\n\t\t\t\tdocument.title = this.originalDocumentTitle;\n\t\t\t}\n\n\t\t\t// Return focus to link that was originally clicked.\n\t\t\tif ( this.link ) {\n\t\t\t\tthis.link.focus();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Callback after the Customizer has been closed.\n\t\t */\n\t\tclosed: function() {\n\t\t\tLoader.iframe.remove();\n\t\t\tLoader.messenger.destroy();\n\t\t\tLoader.iframe    = null;\n\t\t\tLoader.messenger = null;\n\t\t\tLoader.saved     = null;\n\t\t\tLoader.body.removeClass( 'customize-active full-overlay-active' ).removeClass( 'customize-loading' );\n\t\t\t$( window ).off( 'beforeunload', Loader.beforeunload );\n\t\t},\n\n\t\t/**\n\t\t * Callback for the `load` event on the Customizer iframe.\n\t\t */\n\t\tloaded: function() {\n\t\t\tLoader.body.removeClass('customize-loading');\n\t\t},\n\n\t\t/**\n\t\t * Overlay hide/show utility methods.\n\t\t */\n\t\toverlay: {\n\t\t\tshow: function() {\n\t\t\t\tthis.element.fadeIn( 200, Loader.opened );\n\t\t\t},\n\n\t\t\thide: function() {\n\t\t\t\tthis.element.fadeOut( 200, Loader.closed );\n\t\t\t}\n\t\t}\n\t});\n\n\t// Bootstrap the Loader on document#ready.\n\t$( function() {\n\t\tLoader.settings = _wpCustomizeLoaderSettings;\n\t\tLoader.initialize();\n\t});\n\n\t// Expose the API publicly on window.wp.customize.Loader\n\tapi.Loader = Loader;\n})( wp, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/customize-models.js",
    "content": "/* global _wpCustomizeHeader */\n(function( $, wp ) {\n\tvar api = wp.customize;\n\tapi.HeaderTool = {};\n\n\n\t/**\n\t * wp.customize.HeaderTool.ImageModel\n\t *\n\t * A header image. This is where saves via the Customizer API are\n\t * abstracted away, plus our own AJAX calls to add images to and remove\n\t * images from the user's recently uploaded images setting on the server.\n\t * These calls are made regardless of whether the user actually saves new\n\t * Customizer settings.\n\t *\n\t * @constructor\n\t * @augments Backbone.Model\n\t */\n\tapi.HeaderTool.ImageModel = Backbone.Model.extend({\n\t\tdefaults: function() {\n\t\t\treturn {\n\t\t\t\theader: {\n\t\t\t\t\tattachment_id: 0,\n\t\t\t\t\turl: '',\n\t\t\t\t\ttimestamp: _.now(),\n\t\t\t\t\tthumbnail_url: ''\n\t\t\t\t},\n\t\t\t\tchoice: '',\n\t\t\t\tselected: false,\n\t\t\t\trandom: false\n\t\t\t};\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tthis.on('hide', this.hide, this);\n\t\t},\n\n\t\thide: function() {\n\t\t\tthis.set('choice', '');\n\t\t\tapi('header_image').set('remove-header');\n\t\t\tapi('header_image_data').set('remove-header');\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tvar data = this.get('header'),\n\t\t\t\tcurr = api.HeaderTool.currentHeader.get('header').attachment_id;\n\n\t\t\t// If the image we're removing is also the current header, unset\n\t\t\t// the latter\n\t\t\tif (curr && data.attachment_id === curr) {\n\t\t\t\tapi.HeaderTool.currentHeader.trigger('hide');\n\t\t\t}\n\n\t\t\twp.ajax.post( 'custom-header-remove', {\n\t\t\t\tnonce: _wpCustomizeHeader.nonces.remove,\n\t\t\t\twp_customize: 'on',\n\t\t\t\ttheme: api.settings.theme.stylesheet,\n\t\t\t\tattachment_id: data.attachment_id\n\t\t\t});\n\n\t\t\tthis.trigger('destroy', this, this.collection);\n\t\t},\n\n\t\tsave: function() {\n\t\t\tif (this.get('random')) {\n\t\t\t\tapi('header_image').set(this.get('header').random);\n\t\t\t\tapi('header_image_data').set(this.get('header').random);\n\t\t\t} else {\n\t\t\t\tif (this.get('header').defaultName) {\n\t\t\t\t\tapi('header_image').set(this.get('header').url);\n\t\t\t\t\tapi('header_image_data').set(this.get('header').defaultName);\n\t\t\t\t} else {\n\t\t\t\t\tapi('header_image').set(this.get('header').url);\n\t\t\t\t\tapi('header_image_data').set(this.get('header'));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tapi.HeaderTool.combinedList.trigger('control:setImage', this);\n\t\t},\n\n\t\timportImage: function() {\n\t\t\tvar data = this.get('header');\n\t\t\tif (data.attachment_id === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twp.ajax.post( 'custom-header-add', {\n\t\t\t\tnonce: _wpCustomizeHeader.nonces.add,\n\t\t\t\twp_customize: 'on',\n\t\t\t\ttheme: api.settings.theme.stylesheet,\n\t\t\t\tattachment_id: data.attachment_id\n\t\t\t} );\n\t\t},\n\n\t\tshouldBeCropped: function() {\n\t\t\tif (this.get('themeFlexWidth') === true &&\n\t\t\t\t\t\tthis.get('themeFlexHeight') === true) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (this.get('themeFlexWidth') === true &&\n\t\t\t\tthis.get('themeHeight') === this.get('imageHeight')) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (this.get('themeFlexHeight') === true &&\n\t\t\t\tthis.get('themeWidth') === this.get('imageWidth')) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (this.get('themeWidth') === this.get('imageWidth') &&\n\t\t\t\tthis.get('themeHeight') === this.get('imageHeight')) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (this.get('imageWidth') <= this.get('themeWidth')) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t});\n\n\n\t/**\n\t * wp.customize.HeaderTool.ChoiceList\n\t *\n\t * @constructor\n\t * @augments Backbone.Collection\n\t */\n\tapi.HeaderTool.ChoiceList = Backbone.Collection.extend({\n\t\tmodel: api.HeaderTool.ImageModel,\n\n\t\t// Ordered from most recently used to least\n\t\tcomparator: function(model) {\n\t\t\treturn -model.get('header').timestamp;\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tvar current = api.HeaderTool.currentHeader.get('choice').replace(/^https?:\\/\\//, ''),\n\t\t\t\tisRandom = this.isRandomChoice(api.get().header_image);\n\n\t\t\t// Overridable by an extending class\n\t\t\tif (!this.type) {\n\t\t\t\tthis.type = 'uploaded';\n\t\t\t}\n\n\t\t\t// Overridable by an extending class\n\t\t\tif (typeof this.data === 'undefined') {\n\t\t\t\tthis.data = _wpCustomizeHeader.uploads;\n\t\t\t}\n\n\t\t\tif (isRandom) {\n\t\t\t\t// So that when adding data we don't hide regular images\n\t\t\t\tcurrent = api.get().header_image;\n\t\t\t}\n\n\t\t\tthis.on('control:setImage', this.setImage, this);\n\t\t\tthis.on('control:removeImage', this.removeImage, this);\n\t\t\tthis.on('add', this.maybeAddRandomChoice, this);\n\n\t\t\t_.each(this.data, function(elt, index) {\n\t\t\t\tif (!elt.attachment_id) {\n\t\t\t\t\telt.defaultName = index;\n\t\t\t\t}\n\n\t\t\t\tif (typeof elt.timestamp === 'undefined') {\n\t\t\t\t\telt.timestamp = 0;\n\t\t\t\t}\n\n\t\t\t\tthis.add({\n\t\t\t\t\theader: elt,\n\t\t\t\t\tchoice: elt.url.split('/').pop(),\n\t\t\t\t\tselected: current === elt.url.replace(/^https?:\\/\\//, '')\n\t\t\t\t}, { silent: true });\n\t\t\t}, this);\n\n\t\t\tif (this.size() > 0) {\n\t\t\t\tthis.addRandomChoice(current);\n\t\t\t}\n\t\t},\n\n\t\tmaybeAddRandomChoice: function() {\n\t\t\tif (this.size() === 1) {\n\t\t\t\tthis.addRandomChoice();\n\t\t\t}\n\t\t},\n\n\t\taddRandomChoice: function(initialChoice) {\n\t\t\tvar isRandomSameType = RegExp(this.type).test(initialChoice),\n\t\t\t\trandomChoice = 'random-' + this.type + '-image';\n\n\t\t\tthis.add({\n\t\t\t\theader: {\n\t\t\t\t\ttimestamp: 0,\n\t\t\t\t\trandom: randomChoice,\n\t\t\t\t\twidth: 245,\n\t\t\t\t\theight: 41\n\t\t\t\t},\n\t\t\t\tchoice: randomChoice,\n\t\t\t\trandom: true,\n\t\t\t\tselected: isRandomSameType\n\t\t\t});\n\t\t},\n\n\t\tisRandomChoice: function(choice) {\n\t\t\treturn (/^random-(uploaded|default)-image$/).test(choice);\n\t\t},\n\n\t\tshouldHideTitle: function() {\n\t\t\treturn this.size() < 2;\n\t\t},\n\n\t\tsetImage: function(model) {\n\t\t\tthis.each(function(m) {\n\t\t\t\tm.set('selected', false);\n\t\t\t});\n\n\t\t\tif (model) {\n\t\t\t\tmodel.set('selected', true);\n\t\t\t}\n\t\t},\n\n\t\tremoveImage: function() {\n\t\t\tthis.each(function(m) {\n\t\t\t\tm.set('selected', false);\n\t\t\t});\n\t\t}\n\t});\n\n\n\t/**\n\t * wp.customize.HeaderTool.DefaultsList\n\t *\n\t * @constructor\n\t * @augments wp.customize.HeaderTool.ChoiceList\n\t * @augments Backbone.Collection\n\t */\n\tapi.HeaderTool.DefaultsList = api.HeaderTool.ChoiceList.extend({\n\t\tinitialize: function() {\n\t\t\tthis.type = 'default';\n\t\t\tthis.data = _wpCustomizeHeader.defaults;\n\t\t\tapi.HeaderTool.ChoiceList.prototype.initialize.apply(this);\n\t\t}\n\t});\n\n})( jQuery, window.wp );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/customize-preview-nav-menus.js",
    "content": "/* global JSON, _wpCustomizePreviewNavMenusExports */\n\n( function( $, _, wp ) {\n\t'use strict';\n\n\tif ( ! wp || ! wp.customize ) { return; }\n\n\tvar api = wp.customize,\n\t\tcurrentRefreshDebounced = {},\n\t\trefreshDebounceDelay = 200,\n\t\tsettings = {},\n\t\tdefaultSettings = {\n\t\t\trenderQueryVar: null,\n\t\t\trenderNonceValue: null,\n\t\t\trenderNoncePostKey: null,\n\t\t\tpreviewCustomizeNonce: null,\n\t\t\trequestUri: '/',\n\t\t\ttheme: {\n\t\t\t\tactive: false,\n\t\t\t\tstylesheet: ''\n\t\t\t},\n\t\t\tnavMenuInstanceArgs: {}\n\t\t};\n\n\tapi.MenusCustomizerPreview = {\n\t\t/**\n\t\t * Bootstrap functionality.\n\t\t */\n\t\tinit : function() {\n\t\t\tvar self = this, initializedSettings = {};\n\n\t\t\tsettings = _.extend( {}, defaultSettings );\n\t\t\tif ( 'undefined' !== typeof _wpCustomizePreviewNavMenusExports ) {\n\t\t\t\t_.extend( settings, _wpCustomizePreviewNavMenusExports );\n\t\t\t}\n\n\t\t\tapi.each( function( setting, id ) {\n\t\t\t\tsetting.id = id;\n\t\t\t\tinitializedSettings[ setting.id ] = true;\n\t\t\t\tself.bindListener( setting );\n\t\t\t} );\n\n\t\t\tapi.preview.bind( 'setting', function( args ) {\n\t\t\t\tvar id, value, setting;\n\t\t\t\targs = args.slice();\n\t\t\t\tid = args.shift();\n\t\t\t\tvalue = args.shift();\n\n\t\t\t\tsetting = api( id );\n\t\t\t\tif ( ! setting ) {\n\t\t\t\t\t// Currently customize-preview.js is not creating settings for dynamically-created settings in the pane, so we have to do it.\n\t\t\t\t\tsetting = api.create( id, value ); // @todo This should be in core\n\t\t\t\t}\n\t\t\t\tif ( ! setting.id ) {\n\t\t\t\t\t// Currently customize-preview.js doesn't set the id property for each setting, like customize-controls.js does.\n\t\t\t\t\tsetting.id = id;\n\t\t\t\t}\n\n\t\t\t\tif ( ! initializedSettings[ setting.id ] ) {\n\t\t\t\t\tinitializedSettings[ setting.id ] = true;\n\t\t\t\t\tif ( self.bindListener( setting ) ) {\n\t\t\t\t\t\tsetting.callbacks.fireWith( setting, [ setting(), null ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t *\n\t\t * @param {wp.customize.Value} setting\n\t\t * @returns {boolean} Whether the setting was bound.\n\t\t */\n\t\tbindListener : function( setting ) {\n\t\t\tvar matches, themeLocation;\n\n\t\t\tmatches = setting.id.match( /^nav_menu\\[(-?\\d+)]$/ );\n\t\t\tif ( matches ) {\n\t\t\t\tsetting.navMenuId = parseInt( matches[1], 10 );\n\t\t\t\tsetting.bind( this.onChangeNavMenuSetting );\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tmatches = setting.id.match( /^nav_menu_item\\[(-?\\d+)]$/ );\n\t\t\tif ( matches ) {\n\t\t\t\tsetting.navMenuItemId = parseInt( matches[1], 10 );\n\t\t\t\tsetting.bind( this.onChangeNavMenuItemSetting );\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tmatches = setting.id.match( /^nav_menu_locations\\[(.+?)]/ );\n\t\t\tif ( matches ) {\n\t\t\t\tthemeLocation = matches[1];\n\t\t\t\tsetting.bind( _.bind( function() {\n\t\t\t\t\tthis.refreshMenuLocation( themeLocation );\n\t\t\t\t}, this ) );\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * Handle changing of a nav_menu setting.\n\t\t *\n\t\t * @this {wp.customize.Setting}\n\t\t */\n\t\tonChangeNavMenuSetting : function() {\n\t\t\tvar setting = this;\n\t\t\tif ( ! setting.navMenuId ) {\n\t\t\t\tthrow new Error( 'Expected navMenuId property to be set.' );\n\t\t\t}\n\t\t\tapi.MenusCustomizerPreview.refreshMenu( setting.navMenuId );\n\t\t},\n\n\t\t/**\n\t\t * Handle changing of a nav_menu_item setting.\n\t\t *\n\t\t * @this {wp.customize.Setting}\n\t\t * @param {object} to\n\t\t * @param {object} from\n\t\t */\n\t\tonChangeNavMenuItemSetting : function( to, from ) {\n\t\t\tif ( from && from.nav_menu_term_id && ( ! to || from.nav_menu_term_id !== to.nav_menu_term_id ) ) {\n\t\t\t\tapi.MenusCustomizerPreview.refreshMenu( from.nav_menu_term_id );\n\t\t\t}\n\t\t\tif ( to && to.nav_menu_term_id ) {\n\t\t\t\tapi.MenusCustomizerPreview.refreshMenu( to.nav_menu_term_id );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Update a given menu rendered in the preview.\n\t\t *\n\t\t * @param {int} menuId\n\t\t */\n\t\trefreshMenu : function( menuId ) {\n\t\t\tvar assignedLocations = [];\n\n\t\t\tapi.each(function( setting, id ) {\n\t\t\t\tvar matches = id.match( /^nav_menu_locations\\[(.+?)]/ );\n\t\t\t\tif ( matches && menuId === setting() ) {\n\t\t\t\t\tassignedLocations.push( matches[1] );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_.each( settings.navMenuInstanceArgs, function( navMenuArgs, instanceNumber ) {\n\t\t\t\tif ( menuId === navMenuArgs.menu || -1 !== _.indexOf( assignedLocations, navMenuArgs.theme_location ) ) {\n\t\t\t\t\tthis.refreshMenuInstanceDebounced( instanceNumber );\n\t\t\t\t}\n\t\t\t}, this );\n\t\t},\n\n\t\t/**\n\t\t * Refresh the menu(s) associated with a given nav menu location.\n\t\t *\n\t\t * @param {string} location\n\t\t */\n\t\trefreshMenuLocation : function( location ) {\n\t\t\tvar foundInstance = false;\n\t\t\t_.each( settings.navMenuInstanceArgs, function( navMenuArgs, instanceNumber ) {\n\t\t\t\tif ( location === navMenuArgs.theme_location ) {\n\t\t\t\t\tthis.refreshMenuInstanceDebounced( instanceNumber );\n\t\t\t\t\tfoundInstance = true;\n\t\t\t\t}\n\t\t\t}, this );\n\t\t\tif ( ! foundInstance ) {\n\t\t\t\tapi.preview.send( 'refresh' );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Update a specific instance of a given menu on the page.\n\t\t *\n\t\t * @param {int} instanceNumber\n\t\t */\n\t\trefreshMenuInstance : function( instanceNumber ) {\n\t\t\tvar data, menuId, customized, container, request, wpNavMenuArgs, instance, containerInstanceClassName;\n\n\t\t\tif ( ! settings.navMenuInstanceArgs[ instanceNumber ] ) {\n\t\t\t\tthrow new Error( 'unknown_instance_number' );\n\t\t\t}\n\t\t\tinstance = settings.navMenuInstanceArgs[ instanceNumber ];\n\n\t\t\tcontainerInstanceClassName = 'partial-refreshable-nav-menu-' + String( instanceNumber );\n\t\t\tcontainer = $( '.' + containerInstanceClassName );\n\n\t\t\tif ( _.isNumber( instance.menu ) ) {\n\t\t\t\tmenuId = instance.menu;\n\t\t\t} else if ( instance.theme_location && api.has( 'nav_menu_locations[' + instance.theme_location + ']' ) ) {\n\t\t\t\tmenuId = api( 'nav_menu_locations[' + instance.theme_location + ']' ).get();\n\t\t\t}\n\n\t\t\tif ( ! menuId || ! instance.can_partial_refresh || 0 === container.length ) {\n\t\t\t\tapi.preview.send( 'refresh' );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmenuId = parseInt( menuId, 10 );\n\n\t\t\tdata = {\n\t\t\t\tnonce: settings.previewCustomizeNonce, // for Customize Preview\n\t\t\t\twp_customize: 'on'\n\t\t\t};\n\t\t\tif ( ! settings.theme.active ) {\n\t\t\t\tdata.theme = settings.theme.stylesheet;\n\t\t\t}\n\t\t\tdata[ settings.renderQueryVar ] = '1';\n\n\t\t\t// Gather settings to send in partial refresh request.\n\t\t\tcustomized = {};\n\t\t\tapi.each( function( setting, id ) {\n\t\t\t\tvar value = setting.get(), shouldSend = false;\n\t\t\t\t// @todo Core should propagate the dirty state into the Preview as well so we can use that here.\n\n\t\t\t\t// Send setting if it is a nav_menu_locations[] setting.\n\t\t\t\tshouldSend = shouldSend || /^nav_menu_locations\\[/.test( id );\n\n\t\t\t\t// Send setting if it is the setting for this menu.\n\t\t\t\tshouldSend = shouldSend || id === 'nav_menu[' + String( menuId ) + ']';\n\n\t\t\t\t// Send setting if it is one that is associated with this menu, or it is deleted.\n\t\t\t\tshouldSend = shouldSend || ( /^nav_menu_item\\[/.test( id ) && ( false === value || menuId === value.nav_menu_term_id ) );\n\n\t\t\t\tif ( shouldSend ) {\n\t\t\t\t\tcustomized[ id ] = value;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tdata.customized = JSON.stringify( customized );\n\t\t\tdata[ settings.renderNoncePostKey ] = settings.renderNonceValue;\n\n\t\t\twpNavMenuArgs = $.extend( {}, instance );\n\t\t\tdata.wp_nav_menu_args_hash = wpNavMenuArgs.args_hash;\n\t\t\tdelete wpNavMenuArgs.args_hash;\n\t\t\tdata.wp_nav_menu_args = JSON.stringify( wpNavMenuArgs );\n\n\t\t\tcontainer.addClass( 'customize-partial-refreshing' );\n\n\t\t\trequest = wp.ajax.send( null, {\n\t\t\t\tdata: data,\n\t\t\t\turl: settings.requestUri\n\t\t\t} );\n\t\t\trequest.done( function( data ) {\n\t\t\t\t// If the menu is now not visible, refresh since the page layout may have changed.\n\t\t\t\tif ( false === data ) {\n\t\t\t\t\tapi.preview.send( 'refresh' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar eventParam, previousContainer = container;\n\t\t\t\tcontainer = $( data );\n\t\t\t\tcontainer.addClass( containerInstanceClassName );\n\t\t\t\tcontainer.addClass( 'partial-refreshable-nav-menu customize-partial-refreshing' );\n\t\t\t\tpreviousContainer.replaceWith( container );\n\t\t\t\teventParam = {\n\t\t\t\t\tinstanceNumber: instanceNumber,\n\t\t\t\t\twpNavArgs: wpNavMenuArgs, // @deprecated\n\t\t\t\t\twpNavMenuArgs: wpNavMenuArgs,\n\t\t\t\t\toldContainer: previousContainer,\n\t\t\t\t\tnewContainer: container\n\t\t\t\t};\n\t\t\t\tcontainer.removeClass( 'customize-partial-refreshing' );\n\t\t\t\t$( document ).trigger( 'customize-preview-menu-refreshed', [ eventParam ] );\n\t\t\t} );\n\t\t},\n\n\t\trefreshMenuInstanceDebounced : function( instanceNumber ) {\n\t\t\tif ( currentRefreshDebounced[ instanceNumber ] ) {\n\t\t\t\tclearTimeout( currentRefreshDebounced[ instanceNumber ] );\n\t\t\t}\n\t\t\tcurrentRefreshDebounced[ instanceNumber ] = setTimeout(\n\t\t\t\t_.bind( function() {\n\t\t\t\t\tthis.refreshMenuInstance( instanceNumber );\n\t\t\t\t}, this ),\n\t\t\t\trefreshDebounceDelay\n\t\t\t);\n\t\t}\n\t};\n\n\tapi.bind( 'preview-ready', function() {\n\t\tapi.preview.bind( 'active', function() {\n\t\t\tapi.MenusCustomizerPreview.init();\n\t\t} );\n\t} );\n\n}( jQuery, _, wp ) );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/customize-preview-widgets.js",
    "content": "(function( wp, $ ){\n\n\tif ( ! wp || ! wp.customize ) { return; }\n\n\tvar api = wp.customize,\n\t\tOldPreview;\n\n\t/**\n\t * wp.customize.WidgetCustomizerPreview\n\t *\n\t */\n\tapi.WidgetCustomizerPreview = {\n\t\trenderedSidebars: {}, // @todo Make rendered a property of the Backbone model\n\t\trenderedWidgets: {}, // @todo Make rendered a property of the Backbone model\n\t\tregisteredSidebars: [], // @todo Make a Backbone collection\n\t\tregisteredWidgets: {}, // @todo Make array, Backbone collection\n\t\twidgetSelectors: [],\n\t\tpreview: null,\n\t\tl10n: {},\n\n\t\tinit: function () {\n\t\t\tvar self = this;\n\t\t\tthis.buildWidgetSelectors();\n\t\t\tthis.highlightControls();\n\n\t\t\tthis.preview.bind( 'highlight-widget', self.highlightWidget );\n\t\t},\n\n\t\t/**\n\t\t * Calculate the selector for the sidebar's widgets based on the registered sidebar's info\n\t\t */\n\t\tbuildWidgetSelectors: function () {\n\t\t\tvar self = this;\n\n\t\t\t$.each( this.registeredSidebars, function ( i, sidebar ) {\n\t\t\t\tvar widgetTpl = [\n\t\t\t\t\t\tsidebar.before_widget.replace('%1$s', '').replace('%2$s', ''),\n\t\t\t\t\t\tsidebar.before_title,\n\t\t\t\t\t\tsidebar.after_title,\n\t\t\t\t\t\tsidebar.after_widget\n\t\t\t\t\t].join(''),\n\t\t\t\t\temptyWidget,\n\t\t\t\t\twidgetSelector,\n\t\t\t\t\twidgetClasses;\n\n\t\t\t\temptyWidget = $(widgetTpl);\n\t\t\t\twidgetSelector = emptyWidget.prop('tagName');\n\t\t\t\twidgetClasses = emptyWidget.prop('className');\n\n\t\t\t\t// Prevent a rare case when before_widget, before_title, after_title and after_widget is empty.\n\t\t\t\tif ( ! widgetClasses ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\twidgetClasses = widgetClasses.replace(/^\\s+|\\s+$/g, '');\n\n\t\t\t\tif ( widgetClasses ) {\n\t\t\t\t\twidgetSelector += '.' + widgetClasses.split(/\\s+/).join('.');\n\t\t\t\t}\n\t\t\t\tself.widgetSelectors.push(widgetSelector);\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Highlight the widget on widget updates or widget control mouse overs.\n\t\t *\n\t\t * @param  {string} widgetId ID of the widget.\n\t\t */\n\t\thighlightWidget: function( widgetId ) {\n\t\t\tvar $body = $( document.body ),\n\t\t\t\t$widget = $( '#' + widgetId );\n\n\t\t\t$body.find( '.widget-customizer-highlighted-widget' ).removeClass( 'widget-customizer-highlighted-widget' );\n\n\t\t\t$widget.addClass( 'widget-customizer-highlighted-widget' );\n\t\t\tsetTimeout( function () {\n\t\t\t\t$widget.removeClass( 'widget-customizer-highlighted-widget' );\n\t\t\t}, 500 );\n\t\t},\n\n\t\t/**\n\t\t * Show a title and highlight widgets on hover. On shift+clicking\n\t\t * focus the widget control.\n\t\t */\n\t\thighlightControls: function() {\n\t\t\tvar self = this,\n\t\t\t\tselector = this.widgetSelectors.join(',');\n\n\t\t\t$(selector).attr( 'title', this.l10n.widgetTooltip );\n\n\t\t\t$(document).on( 'mouseenter', selector, function () {\n\t\t\t\tself.preview.send( 'highlight-widget-control', $( this ).prop( 'id' ) );\n\t\t\t});\n\n\t\t\t// Open expand the widget control when shift+clicking the widget element\n\t\t\t$(document).on( 'click', selector, function ( e ) {\n\t\t\t\tif ( ! e.shiftKey ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\n\t\t\t\tself.preview.send( 'focus-widget-control', $( this ).prop( 'id' ) );\n\t\t\t});\n\t\t}\n\t};\n\n\t/**\n\t * Capture the instance of the Preview since it is private\n\t */\n\tOldPreview = api.Preview;\n\tapi.Preview = OldPreview.extend( {\n\t\tinitialize: function( params, options ) {\n\t\t\tapi.WidgetCustomizerPreview.preview = this;\n\t\t\tOldPreview.prototype.initialize.call( this, params, options );\n\t\t}\n\t} );\n\n\t$(function () {\n\t\tvar settings = window._wpWidgetCustomizerPreviewSettings;\n\t\tif ( ! settings ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$.extend( api.WidgetCustomizerPreview, settings );\n\n\t\tapi.WidgetCustomizerPreview.init();\n\t});\n\n})( window.wp, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/customize-preview.js",
    "content": "/*\n * Script run inside a Customizer preview frame.\n */\n(function( exports, $ ){\n\tvar api = wp.customize,\n\t\tdebounce;\n\n\t/**\n\t * Returns a debounced version of the function.\n\t *\n\t * @todo Require Underscore.js for this file and retire this.\n\t */\n\tdebounce = function( fn, delay, context ) {\n\t\tvar timeout;\n\t\treturn function() {\n\t\t\tvar args = arguments;\n\n\t\t\tcontext = context || this;\n\n\t\t\tclearTimeout( timeout );\n\t\t\ttimeout = setTimeout( function() {\n\t\t\t\ttimeout = null;\n\t\t\t\tfn.apply( context, args );\n\t\t\t}, delay );\n\t\t};\n\t};\n\n\t/**\n\t * @constructor\n\t * @augments wp.customize.Messenger\n\t * @augments wp.customize.Class\n\t * @mixes wp.customize.Events\n\t */\n\tapi.Preview = api.Messenger.extend({\n\t\t/**\n\t\t * @param {string} url The URL of preview frame\n\t\t */\n\t\tinitialize: function( params, options ) {\n\t\t\tvar self = this;\n\n\t\t\tapi.Messenger.prototype.initialize.call( this, params, options );\n\n\t\t\tthis.body = $( document.body );\n\t\t\tthis.body.on( 'click.preview', 'a', function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tself.send( 'scroll', 0 );\n\t\t\t\tself.send( 'url', $(this).prop('href') );\n\t\t\t});\n\n\t\t\t// You cannot submit forms.\n\t\t\t// @todo: Allow form submissions by mixing $_POST data with the customize setting $_POST data.\n\t\t\tthis.body.on( 'submit.preview', 'form', function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\n\t\t\tthis.window = $( window );\n\t\t\tthis.window.on( 'scroll.preview', debounce( function() {\n\t\t\t\tself.send( 'scroll', self.window.scrollTop() );\n\t\t\t}, 200 ));\n\n\t\t\tthis.bind( 'scroll', function( distance ) {\n\t\t\t\tself.window.scrollTop( distance );\n\t\t\t});\n\t\t}\n\t});\n\n\t$( function() {\n\t\tapi.settings = window._wpCustomizeSettings;\n\t\tif ( ! api.settings )\n\t\t\treturn;\n\n\t\tvar bg;\n\n\t\tapi.preview = new api.Preview({\n\t\t\turl: window.location.href,\n\t\t\tchannel: api.settings.channel\n\t\t});\n\n\t\tapi.preview.bind( 'settings', function( values ) {\n\t\t\t$.each( values, function( id, value ) {\n\t\t\t\tif ( api.has( id ) )\n\t\t\t\t\tapi( id ).set( value );\n\t\t\t\telse\n\t\t\t\t\tapi.create( id, value );\n\t\t\t});\n\t\t});\n\n\t\tapi.preview.trigger( 'settings', api.settings.values );\n\n\t\tapi.preview.bind( 'setting', function( args ) {\n\t\t\tvar value;\n\n\t\t\targs = args.slice();\n\n\t\t\tif ( value = api( args.shift() ) )\n\t\t\t\tvalue.set.apply( value, args );\n\t\t});\n\n\t\tapi.preview.bind( 'sync', function( events ) {\n\t\t\t$.each( events, function( event, args ) {\n\t\t\t\tapi.preview.trigger( event, args );\n\t\t\t});\n\t\t\tapi.preview.send( 'synced' );\n\t\t});\n\n\t\tapi.preview.bind( 'active', function() {\n\t\t\tif ( api.settings.nonce ) {\n\t\t\t\tapi.preview.send( 'nonce', api.settings.nonce );\n\t\t\t}\n\n\t\t\tapi.preview.send( 'documentTitle', document.title );\n\t\t});\n\n\t\t/*\n\t\t * Send a message to the parent customize frame with a list of which\n\t\t * containers and controls are active.\n\t\t */\n\t\tapi.preview.send( 'ready', {\n\t\t\tactivePanels: api.settings.activePanels,\n\t\t\tactiveSections: api.settings.activeSections,\n\t\t\tactiveControls: api.settings.activeControls\n\t\t} );\n\n\t\t// Display a loading indicator when preview is reloading, and remove on failure.\n\t\tapi.preview.bind( 'loading-initiated', function () {\n\t\t\t$( 'body' ).addClass( 'wp-customizer-unloading' );\n\t\t});\n\t\tapi.preview.bind( 'loading-failed', function () {\n\t\t\t$( 'body' ).removeClass( 'wp-customizer-unloading' );\n\t\t});\n\n\t\t/* Custom Backgrounds */\n\t\tbg = $.map(['color', 'image', 'position_x', 'repeat', 'attachment'], function( prop ) {\n\t\t\treturn 'background_' + prop;\n\t\t});\n\n\t\tapi.when.apply( api, bg ).done( function( color, image, position_x, repeat, attachment ) {\n\t\t\tvar body = $(document.body),\n\t\t\t\thead = $('head'),\n\t\t\t\tstyle = $('#custom-background-css'),\n\t\t\t\tupdate;\n\n\t\t\tupdate = function() {\n\t\t\t\tvar css = '';\n\n\t\t\t\t// The body will support custom backgrounds if either\n\t\t\t\t// the color or image are set.\n\t\t\t\t//\n\t\t\t\t// See get_body_class() in /wp-includes/post-template.php\n\t\t\t\tbody.toggleClass( 'custom-background', !! ( color() || image() ) );\n\n\t\t\t\tif ( color() )\n\t\t\t\t\tcss += 'background-color: ' + color() + ';';\n\n\t\t\t\tif ( image() ) {\n\t\t\t\t\tcss += 'background-image: url(\"' + image() + '\");';\n\t\t\t\t\tcss += 'background-position: top ' + position_x() + ';';\n\t\t\t\t\tcss += 'background-repeat: ' + repeat() + ';';\n\t\t\t\t\tcss += 'background-attachment: ' + attachment() + ';';\n\t\t\t\t}\n\n\t\t\t\t// Refresh the stylesheet by removing and recreating it.\n\t\t\t\tstyle.remove();\n\t\t\t\tstyle = $('<style type=\"text/css\" id=\"custom-background-css\">body.custom-background { ' + css + ' }</style>').appendTo( head );\n\t\t\t};\n\n\t\t\t$.each( arguments, function() {\n\t\t\t\tthis.bind( update );\n\t\t\t});\n\t\t});\n\n\t\tapi.trigger( 'preview-ready' );\n\t});\n\n})( wp, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/customize-views.js",
    "content": "(function( $, wp, _ ) {\n\n\tif ( ! wp || ! wp.customize ) { return; }\n\tvar api = wp.customize;\n\n\t/**\n\t * wp.customize.HeaderTool.CurrentView\n\t *\n\t * Displays the currently selected header image, or a placeholder in lack\n\t * thereof.\n\t *\n\t * Instantiate with model wp.customize.HeaderTool.currentHeader.\n\t *\n\t * @constructor\n\t * @augments wp.Backbone.View\n\t */\n\tapi.HeaderTool.CurrentView = wp.Backbone.View.extend({\n\t\ttemplate: wp.template('header-current'),\n\n\t\tinitialize: function() {\n\t\t\tthis.listenTo(this.model, 'change', this.render);\n\t\t\tthis.render();\n\t\t},\n\n\t\trender: function() {\n\t\t\tthis.$el.html(this.template(this.model.toJSON()));\n\t\t\tthis.setPlaceholder();\n\t\t\tthis.setButtons();\n\t\t\treturn this;\n\t\t},\n\n\t\tgetHeight: function() {\n\t\t\tvar image = this.$el.find('img'),\n\t\t\t\tsaved, height, headerImageData;\n\n\t\t\tif (image.length) {\n\t\t\t\tthis.$el.find('.inner').hide();\n\t\t\t} else {\n\t\t\t\tthis.$el.find('.inner').show();\n\t\t\t\treturn 40;\n\t\t\t}\n\n\t\t\tsaved = this.model.get('savedHeight');\n\t\t\theight = image.height() || saved;\n\n\t\t\t// happens at ready\n\t\t\tif (!height) {\n\t\t\t\theaderImageData = api.get().header_image_data;\n\n\t\t\t\tif (headerImageData && headerImageData.width && headerImageData.height) {\n\t\t\t\t\t// hardcoded container width\n\t\t\t\t\theight = 260 / headerImageData.width * headerImageData.height;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// fallback for when no image is set\n\t\t\t\t\theight = 40;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn height;\n\t\t},\n\n\t\tsetPlaceholder: function(_height) {\n\t\t\tvar height = _height || this.getHeight();\n\t\t\tthis.model.set('savedHeight', height);\n\t\t\tthis.$el\n\t\t\t\t.add(this.$el.find('.placeholder'))\n\t\t\t\t.height(height);\n\t\t},\n\n\t\tsetButtons: function() {\n\t\t\tvar elements = $('#customize-control-header_image .actions .remove');\n\t\t\tif (this.model.get('choice')) {\n\t\t\t\telements.show();\n\t\t\t} else {\n\t\t\t\telements.hide();\n\t\t\t}\n\t\t}\n\t});\n\n\n\t/**\n\t * wp.customize.HeaderTool.ChoiceView\n\t *\n\t * Represents a choosable header image, be it user-uploaded,\n\t * theme-suggested or a special Randomize choice.\n\t *\n\t * Takes a wp.customize.HeaderTool.ImageModel.\n\t *\n\t * Manually changes model wp.customize.HeaderTool.currentHeader via the\n\t * `select` method.\n\t *\n\t * @constructor\n\t * @augments wp.Backbone.View\n\t */\n\tapi.HeaderTool.ChoiceView = wp.Backbone.View.extend({\n\t\ttemplate: wp.template('header-choice'),\n\n\t\tclassName: 'header-view',\n\n\t\tevents: {\n\t\t\t'click .choice,.random': 'select',\n\t\t\t'click .close': 'removeImage'\n\t\t},\n\n\t\tinitialize: function() {\n\t\t\tvar properties = [\n\t\t\t\tthis.model.get('header').url,\n\t\t\t\tthis.model.get('choice')\n\t\t\t];\n\n\t\t\tthis.listenTo(this.model, 'change:selected', this.toggleSelected);\n\n\t\t\tif (_.contains(properties, api.get().header_image)) {\n\t\t\t\tapi.HeaderTool.currentHeader.set(this.extendedModel());\n\t\t\t}\n\t\t},\n\n\t\trender: function() {\n\t\t\tthis.$el.html(this.template(this.extendedModel()));\n\n\t\t\tthis.toggleSelected();\n\t\t\treturn this;\n\t\t},\n\n\t\ttoggleSelected: function() {\n\t\t\tthis.$el.toggleClass('selected', this.model.get('selected'));\n\t\t},\n\n\t\textendedModel: function() {\n\t\t\tvar c = this.model.get('collection');\n\t\t\treturn _.extend(this.model.toJSON(), {\n\t\t\t\ttype: c.type\n\t\t\t});\n\t\t},\n\n\t\tgetHeight: api.HeaderTool.CurrentView.prototype.getHeight,\n\n\t\tsetPlaceholder: api.HeaderTool.CurrentView.prototype.setPlaceholder,\n\n\t\tselect: function() {\n\t\t\tthis.preventJump();\n\t\t\tthis.model.save();\n\t\t\tapi.HeaderTool.currentHeader.set(this.extendedModel());\n\t\t},\n\n\t\tpreventJump: function() {\n\t\t\tvar container = $('.wp-full-overlay-sidebar-content'),\n\t\t\t\tscroll = container.scrollTop();\n\n\t\t\t_.defer(function() {\n\t\t\t\tcontainer.scrollTop(scroll);\n\t\t\t});\n\t\t},\n\n\t\tremoveImage: function(e) {\n\t\t\te.stopPropagation();\n\t\t\tthis.model.destroy();\n\t\t\tthis.remove();\n\t\t}\n\t});\n\n\n\t/**\n\t * wp.customize.HeaderTool.ChoiceListView\n\t *\n\t * A container for ChoiceViews. These choices should be of one same type:\n\t * user-uploaded headers or theme-defined ones.\n\t *\n\t * Takes a wp.customize.HeaderTool.ChoiceList.\n\t *\n\t * @constructor\n\t * @augments wp.Backbone.View\n\t */\n\tapi.HeaderTool.ChoiceListView = wp.Backbone.View.extend({\n\t\tinitialize: function() {\n\t\t\tthis.listenTo(this.collection, 'add', this.addOne);\n\t\t\tthis.listenTo(this.collection, 'remove', this.render);\n\t\t\tthis.listenTo(this.collection, 'sort', this.render);\n\t\t\tthis.listenTo(this.collection, 'change', this.toggleList);\n\t\t\tthis.render();\n\t\t},\n\n\t\trender: function() {\n\t\t\tthis.$el.empty();\n\t\t\tthis.collection.each(this.addOne, this);\n\t\t\tthis.toggleList();\n\t\t},\n\n\t\taddOne: function(choice) {\n\t\t\tvar view;\n\t\t\tchoice.set({ collection: this.collection });\n\t\t\tview = new api.HeaderTool.ChoiceView({ model: choice });\n\t\t\tthis.$el.append(view.render().el);\n\t\t},\n\n\t\ttoggleList: function() {\n\t\t\tvar title = this.$el.parents().prev('.customize-control-title'),\n\t\t\t\trandomButton = this.$el.find('.random').parent();\n\t\t\tif (this.collection.shouldHideTitle()) {\n\t\t\t\ttitle.add(randomButton).hide();\n\t\t\t} else {\n\t\t\t\ttitle.add(randomButton).show();\n\t\t\t}\n\t\t}\n\t});\n\n\n\t/**\n\t * wp.customize.HeaderTool.CombinedList\n\t *\n\t * Aggregates wp.customize.HeaderTool.ChoiceList collections (or any\n\t * Backbone object, really) and acts as a bus to feed them events.\n\t *\n\t * @constructor\n\t * @augments wp.Backbone.View\n\t */\n\tapi.HeaderTool.CombinedList = wp.Backbone.View.extend({\n\t\tinitialize: function(collections) {\n\t\t\tthis.collections = collections;\n\t\t\tthis.on('all', this.propagate, this);\n\t\t},\n\t\tpropagate: function(event, arg) {\n\t\t\t_.each(this.collections, function(collection) {\n\t\t\t\tcollection.trigger(event, arg);\n\t\t\t});\n\t\t}\n\t});\n\n})( jQuery, window.wp, _ );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/heartbeat.js",
    "content": "/**\n * Heartbeat API\n *\n * Heartbeat is a simple server polling API that sends XHR requests to\n * the server every 15 - 60 seconds and triggers events (or callbacks) upon\n * receiving data. Currently these 'ticks' handle transports for post locking,\n * login-expiration warnings, autosave, and related tasks while a user is logged in.\n *\n * Available PHP filters (in ajax-actions.php):\n * - heartbeat_received\n * - heartbeat_send\n * - heartbeat_tick\n * - heartbeat_nopriv_received\n * - heartbeat_nopriv_send\n * - heartbeat_nopriv_tick\n * @see wp_ajax_nopriv_heartbeat(), wp_ajax_heartbeat()\n *\n * Custom jQuery events:\n * - heartbeat-send\n * - heartbeat-tick\n * - heartbeat-error\n * - heartbeat-connection-lost\n * - heartbeat-connection-restored\n * - heartbeat-nonces-expired\n *\n * @since 3.6.0\n */\n\n( function( $, window, undefined ) {\n\tvar Heartbeat = function() {\n\t\tvar $document = $(document),\n\t\t\tsettings = {\n\t\t\t\t// Suspend/resume\n\t\t\t\tsuspend: false,\n\n\t\t\t\t// Whether suspending is enabled\n\t\t\t\tsuspendEnabled: true,\n\n\t\t\t\t// Current screen id, defaults to the JS global 'pagenow' when present (in the admin) or 'front'\n\t\t\t\tscreenId: '',\n\n\t\t\t\t// XHR request URL, defaults to the JS global 'ajaxurl' when present\n\t\t\t\turl: '',\n\n\t\t\t\t// Timestamp, start of the last connection request\n\t\t\t\tlastTick: 0,\n\n\t\t\t\t// Container for the enqueued items\n\t\t\t\tqueue: {},\n\n\t\t\t\t// Connect interval (in seconds)\n\t\t\t\tmainInterval: 60,\n\n\t\t\t\t// Used when the interval is set to 5 sec. temporarily\n\t\t\t\ttempInterval: 0,\n\n\t\t\t\t// Used when the interval is reset\n\t\t\t\toriginalInterval: 0,\n\n\t\t\t\t// Used to limit the number of AJAX requests.\n\t\t\t\tminimalInterval: 0,\n\n\t\t\t\t// Used together with tempInterval\n\t\t\t\tcountdown: 0,\n\n\t\t\t\t// Whether a connection is currently in progress\n\t\t\t\tconnecting: false,\n\n\t\t\t\t// Whether a connection error occurred\n\t\t\t\tconnectionError: false,\n\n\t\t\t\t// Used to track non-critical errors\n\t\t\t\terrorcount: 0,\n\n\t\t\t\t// Whether at least one connection has completed successfully\n\t\t\t\thasConnected: false,\n\n\t\t\t\t// Whether the current browser window is in focus and the user is active\n\t\t\t\thasFocus: true,\n\n\t\t\t\t// Timestamp, last time the user was active. Checked every 30 sec.\n\t\t\t\tuserActivity: 0,\n\n\t\t\t\t// Flags whether events tracking user activity were set\n\t\t\t\tuserActivityEvents: false,\n\n\t\t\t\tcheckFocusTimer: 0,\n\t\t\t\tbeatTimer: 0\n\t\t\t};\n\n\t\t/**\n\t\t * Set local vars and events, then start\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction initialize() {\n\t\t\tvar options, hidden, visibilityState, visibilitychange;\n\n\t\t\tif ( typeof window.pagenow === 'string' ) {\n\t\t\t\tsettings.screenId = window.pagenow;\n\t\t\t}\n\n\t\t\tif ( typeof window.ajaxurl === 'string' ) {\n\t\t\t\tsettings.url = window.ajaxurl;\n\t\t\t}\n\n\t\t\t// Pull in options passed from PHP\n\t\t\tif ( typeof window.heartbeatSettings === 'object' ) {\n\t\t\t\toptions = window.heartbeatSettings;\n\n\t\t\t\t// The XHR URL can be passed as option when window.ajaxurl is not set\n\t\t\t\tif ( ! settings.url && options.ajaxurl ) {\n\t\t\t\t\tsettings.url = options.ajaxurl;\n\t\t\t\t}\n\n\t\t\t\t// The interval can be from 15 to 120 sec. and can be set temporarily to 5 sec.\n\t\t\t\t// It can be set in the initial options or changed later from JS and/or from PHP.\n\t\t\t\tif ( options.interval ) {\n\t\t\t\t\tsettings.mainInterval = options.interval;\n\n\t\t\t\t\tif ( settings.mainInterval < 15 ) {\n\t\t\t\t\t\tsettings.mainInterval = 15;\n\t\t\t\t\t} else if ( settings.mainInterval > 120 ) {\n\t\t\t\t\t\tsettings.mainInterval = 120;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Used to limit the number of AJAX requests. Overrides all other intervals if they are shorter.\n\t\t\t\t// Needed for some hosts that cannot handle frequent requests and the user may exceed the allocated server CPU time, etc.\n\t\t\t\t// The minimal interval can be up to 600 sec. however setting it to longer than 120 sec. will limit or disable\n\t\t\t\t// some of the functionality (like post locks).\n\t\t\t\t// Once set at initialization, minimalInterval cannot be changed/overriden.\n\t\t\t\tif ( options.minimalInterval ) {\n\t\t\t\t\toptions.minimalInterval = parseInt( options.minimalInterval, 10 );\n\t\t\t\t\tsettings.minimalInterval = options.minimalInterval > 0 && options.minimalInterval <= 600 ? options.minimalInterval * 1000 : 0;\n\t\t\t\t}\n\n\t\t\t\tif ( settings.minimalInterval && settings.mainInterval < settings.minimalInterval ) {\n\t\t\t\t\tsettings.mainInterval = settings.minimalInterval;\n\t\t\t\t}\n\n\t\t\t\t// 'screenId' can be added from settings on the front-end where the JS global 'pagenow' is not set\n\t\t\t\tif ( ! settings.screenId ) {\n\t\t\t\t\tsettings.screenId = options.screenId || 'front';\n\t\t\t\t}\n\n\t\t\t\tif ( options.suspension === 'disable' ) {\n\t\t\t\t\tsettings.suspendEnabled = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Convert to milliseconds\n\t\t\tsettings.mainInterval = settings.mainInterval * 1000;\n\t\t\tsettings.originalInterval = settings.mainInterval;\n\n\t\t\t// Switch the interval to 120 sec. by using the Page Visibility API.\n\t\t\t// If the browser doesn't support it (Safari < 7, Android < 4.4, IE < 10), the interval\n\t\t\t// will be increased to 120 sec. after 5 min. of mouse and keyboard inactivity.\n\t\t\tif ( typeof document.hidden !== 'undefined' ) {\n\t\t\t\thidden = 'hidden';\n\t\t\t\tvisibilitychange = 'visibilitychange';\n\t\t\t\tvisibilityState = 'visibilityState';\n\t\t\t} else if ( typeof document.msHidden !== 'undefined' ) { // IE10\n\t\t\t\thidden = 'msHidden';\n\t\t\t\tvisibilitychange = 'msvisibilitychange';\n\t\t\t\tvisibilityState = 'msVisibilityState';\n\t\t\t} else if ( typeof document.webkitHidden !== 'undefined' ) { // Android\n\t\t\t\thidden = 'webkitHidden';\n\t\t\t\tvisibilitychange = 'webkitvisibilitychange';\n\t\t\t\tvisibilityState = 'webkitVisibilityState';\n\t\t\t}\n\n\t\t\tif ( hidden ) {\n\t\t\t\tif ( document[hidden] ) {\n\t\t\t\t\tsettings.hasFocus = false;\n\t\t\t\t}\n\n\t\t\t\t$document.on( visibilitychange + '.wp-heartbeat', function() {\n\t\t\t\t\tif ( document[visibilityState] === 'hidden' ) {\n\t\t\t\t\t\tblurred();\n\t\t\t\t\t\twindow.clearInterval( settings.checkFocusTimer );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfocused();\n\t\t\t\t\t\tif ( document.hasFocus ) {\n\t\t\t\t\t\t\tsettings.checkFocusTimer = window.setInterval( checkFocus, 10000 );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Use document.hasFocus() if available.\n\t\t\tif ( document.hasFocus ) {\n\t\t\t\tsettings.checkFocusTimer = window.setInterval( checkFocus, 10000 );\n\t\t\t}\n\n\t\t\t$(window).on( 'unload.wp-heartbeat', function() {\n\t\t\t\t// Don't connect any more\n\t\t\t\tsettings.suspend = true;\n\n\t\t\t\t// Abort the last request if not completed\n\t\t\t\tif ( settings.xhr && settings.xhr.readyState !== 4 ) {\n\t\t\t\t\tsettings.xhr.abort();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Check for user activity every 30 seconds.\n\t\t\twindow.setInterval( checkUserActivity, 30000 );\n\n\t\t\t// Start one tick after DOM ready\n\t\t\t$document.ready( function() {\n\t\t\t\tsettings.lastTick = time();\n\t\t\t\tscheduleNextTick();\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Return the current time according to the browser\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return int\n\t\t */\n\t\tfunction time() {\n\t\t\treturn (new Date()).getTime();\n\t\t}\n\n\t\t/**\n\t\t * Check if the iframe is from the same origin\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return bool\n\t\t */\n\t\tfunction isLocalFrame( frame ) {\n\t\t\tvar origin, src = frame.src;\n\n\t\t\t// Need to compare strings as WebKit doesn't throw JS errors when iframes have different origin.\n\t\t\t// It throws uncatchable exceptions.\n\t\t\tif ( src && /^https?:\\/\\//.test( src ) ) {\n\t\t\t\torigin = window.location.origin ? window.location.origin : window.location.protocol + '//' + window.location.host;\n\n\t\t\t\tif ( src.indexOf( origin ) !== 0 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tif ( frame.contentWindow.document ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch(e) {}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Check if the document's focus has changed\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction checkFocus() {\n\t\t\tif ( settings.hasFocus && ! document.hasFocus() ) {\n\t\t\t\tblurred();\n\t\t\t} else if ( ! settings.hasFocus && document.hasFocus() ) {\n\t\t\t\tfocused();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Set error state and fire an event on XHR errors or timeout\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @param string error The error type passed from the XHR\n\t\t * @param int status The HTTP status code passed from jqXHR (200, 404, 500, etc.)\n\t\t * @return void\n\t\t */\n\t\tfunction setErrorState( error, status ) {\n\t\t\tvar trigger;\n\n\t\t\tif ( error ) {\n\t\t\t\tswitch ( error ) {\n\t\t\t\t\tcase 'abort':\n\t\t\t\t\t\t// do nothing\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'timeout':\n\t\t\t\t\t\t// no response for 30 sec.\n\t\t\t\t\t\ttrigger = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\tif ( 503 === status && settings.hasConnected ) {\n\t\t\t\t\t\t\ttrigger = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tcase 'parsererror':\n\t\t\t\t\tcase 'empty':\n\t\t\t\t\tcase 'unknown':\n\t\t\t\t\t\tsettings.errorcount++;\n\n\t\t\t\t\t\tif ( settings.errorcount > 2 && settings.hasConnected ) {\n\t\t\t\t\t\t\ttrigger = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( trigger && ! hasConnectionError() ) {\n\t\t\t\t\tsettings.connectionError = true;\n\t\t\t\t\t$document.trigger( 'heartbeat-connection-lost', [error, status] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Clear the error state and fire an event\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction clearErrorState() {\n\t\t\t// Has connected successfully\n\t\t\tsettings.hasConnected = true;\n\n\t\t\tif ( hasConnectionError() ) {\n\t\t\t\tsettings.errorcount = 0;\n\t\t\t\tsettings.connectionError = false;\n\t\t\t\t$document.trigger( 'heartbeat-connection-restored' );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Gather the data and connect to the server\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction connect() {\n\t\t\tvar ajaxData, heartbeatData;\n\n\t\t\t// If the connection to the server is slower than the interval,\n\t\t\t// heartbeat connects as soon as the previous connection's response is received.\n\t\t\tif ( settings.connecting || settings.suspend ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsettings.lastTick = time();\n\n\t\t\theartbeatData = $.extend( {}, settings.queue );\n\t\t\t// Clear the data queue, anything added after this point will be send on the next tick\n\t\t\tsettings.queue = {};\n\n\t\t\t$document.trigger( 'heartbeat-send', [ heartbeatData ] );\n\n\t\t\tajaxData = {\n\t\t\t\tdata: heartbeatData,\n\t\t\t\tinterval: settings.tempInterval ? settings.tempInterval / 1000 : settings.mainInterval / 1000,\n\t\t\t\t_nonce: typeof window.heartbeatSettings === 'object' ? window.heartbeatSettings.nonce : '',\n\t\t\t\taction: 'heartbeat',\n\t\t\t\tscreen_id: settings.screenId,\n\t\t\t\thas_focus: settings.hasFocus\n\t\t\t};\n\n\t\t\tsettings.connecting = true;\n\t\t\tsettings.xhr = $.ajax({\n\t\t\t\turl: settings.url,\n\t\t\t\ttype: 'post',\n\t\t\t\ttimeout: 30000, // throw an error if not completed after 30 sec.\n\t\t\t\tdata: ajaxData,\n\t\t\t\tdataType: 'json'\n\t\t\t}).always( function() {\n\t\t\t\tsettings.connecting = false;\n\t\t\t\tscheduleNextTick();\n\t\t\t}).done( function( response, textStatus, jqXHR ) {\n\t\t\t\tvar newInterval;\n\n\t\t\t\tif ( ! response ) {\n\t\t\t\t\tsetErrorState( 'empty' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tclearErrorState();\n\n\t\t\t\tif ( response.nonces_expired ) {\n\t\t\t\t\t$document.trigger( 'heartbeat-nonces-expired' );\n\t\t\t\t}\n\n\t\t\t\t// Change the interval from PHP\n\t\t\t\tif ( response.heartbeat_interval ) {\n\t\t\t\t\tnewInterval = response.heartbeat_interval;\n\t\t\t\t\tdelete response.heartbeat_interval;\n\t\t\t\t}\n\n\t\t\t\t$document.trigger( 'heartbeat-tick', [response, textStatus, jqXHR] );\n\n\t\t\t\t// Do this last, can trigger the next XHR if connection time > 5 sec. and newInterval == 'fast'\n\t\t\t\tif ( newInterval ) {\n\t\t\t\t\tinterval( newInterval );\n\t\t\t\t}\n\t\t\t}).fail( function( jqXHR, textStatus, error ) {\n\t\t\t\tsetErrorState( textStatus || 'unknown', jqXHR.status );\n\t\t\t\t$document.trigger( 'heartbeat-error', [jqXHR, textStatus, error] );\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Schedule the next connection\n\t\t *\n\t\t * Fires immediately if the connection time is longer than the interval.\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction scheduleNextTick() {\n\t\t\tvar delta = time() - settings.lastTick,\n\t\t\t\tinterval = settings.mainInterval;\n\n\t\t\tif ( settings.suspend ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! settings.hasFocus ) {\n\t\t\t\tinterval = 120000; // 120 sec. Post locks expire after 150 sec.\n\t\t\t} else if ( settings.countdown > 0 && settings.tempInterval ) {\n\t\t\t\tinterval = settings.tempInterval;\n\t\t\t\tsettings.countdown--;\n\n\t\t\t\tif ( settings.countdown < 1 ) {\n\t\t\t\t\tsettings.tempInterval = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( settings.minimalInterval && interval < settings.minimalInterval ) {\n\t\t\t\tinterval = settings.minimalInterval;\n\t\t\t}\n\n\t\t\twindow.clearTimeout( settings.beatTimer );\n\n\t\t\tif ( delta < interval ) {\n\t\t\t\tsettings.beatTimer = window.setTimeout(\n\t\t\t\t\tfunction() {\n\t\t\t\t\t\tconnect();\n\t\t\t\t\t},\n\t\t\t\t\tinterval - delta\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconnect();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Set the internal state when the browser window becomes hidden or loses focus\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction blurred() {\n\t\t\tsettings.hasFocus = false;\n\t\t}\n\n\t\t/**\n\t\t * Set the internal state when the browser window becomes visible or is in focus\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction focused() {\n\t\t\tsettings.userActivity = time();\n\n\t\t\t// Resume if suspended\n\t\t\tsettings.suspend = false;\n\n\t\t\tif ( ! settings.hasFocus ) {\n\t\t\t\tsettings.hasFocus = true;\n\t\t\t\tscheduleNextTick();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Runs when the user becomes active after a period of inactivity\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction userIsActive() {\n\t\t\tsettings.userActivityEvents = false;\n\t\t\t$document.off( '.wp-heartbeat-active' );\n\n\t\t\t$('iframe').each( function( i, frame ) {\n\t\t\t\tif ( isLocalFrame( frame ) ) {\n\t\t\t\t\t$( frame.contentWindow ).off( '.wp-heartbeat-active' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfocused();\n\t\t}\n\n\t\t/**\n\t\t * Check for user activity\n\t\t *\n\t\t * Runs every 30 sec.\n\t\t * Sets 'hasFocus = true' if user is active and the window is in the background.\n\t\t * Set 'hasFocus = false' if the user has been inactive (no mouse or keyboard activity)\n\t\t * for 5 min. even when the window has focus.\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction checkUserActivity() {\n\t\t\tvar lastActive = settings.userActivity ? time() - settings.userActivity : 0;\n\n\t\t\t// Throttle down when no mouse or keyboard activity for 5 min.\n\t\t\tif ( lastActive > 300000 && settings.hasFocus ) {\n\t\t\t\tblurred();\n\t\t\t}\n\n\t\t\t// Suspend after 10 min. of inactivity when suspending is enabled.\n\t\t\t// Always suspend after 60 min. of inactivity. This will release the post lock, etc.\n\t\t\tif ( ( settings.suspendEnabled && lastActive > 600000 ) || lastActive > 3600000 ) {\n\t\t\t\tsettings.suspend = true;\n\t\t\t}\n\n\t\t\tif ( ! settings.userActivityEvents ) {\n\t\t\t\t$document.on( 'mouseover.wp-heartbeat-active keyup.wp-heartbeat-active touchend.wp-heartbeat-active', function() {\n\t\t\t\t\tuserIsActive();\n\t\t\t\t});\n\n\t\t\t\t$('iframe').each( function( i, frame ) {\n\t\t\t\t\tif ( isLocalFrame( frame ) ) {\n\t\t\t\t\t\t$( frame.contentWindow ).on( 'mouseover.wp-heartbeat-active keyup.wp-heartbeat-active touchend.wp-heartbeat-active', function() {\n\t\t\t\t\t\t\tuserIsActive();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tsettings.userActivityEvents = true;\n\t\t\t}\n\t\t}\n\n\t\t// Public methods\n\n\t\t/**\n\t\t * Whether the window (or any local iframe in it) has focus, or the user is active\n\t\t *\n\t\t * @return bool\n\t\t */\n\t\tfunction hasFocus() {\n\t\t\treturn settings.hasFocus;\n\t\t}\n\n\t\t/**\n\t\t * Whether there is a connection error\n\t\t *\n\t\t * @return bool\n\t\t */\n\t\tfunction hasConnectionError() {\n\t\t\treturn settings.connectionError;\n\t\t}\n\n\t\t/**\n\t\t * Connect asap regardless of 'hasFocus'\n\t\t *\n\t\t * Will not open two concurrent connections. If a connection is in progress,\n\t\t * will connect again immediately after the current connection completes.\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction connectNow() {\n\t\t\tsettings.lastTick = 0;\n\t\t\tscheduleNextTick();\n\t\t}\n\n\t\t/**\n\t\t * Disable suspending\n\t\t *\n\t\t * Should be used only when Heartbeat is performing critical tasks like autosave, post-locking, etc.\n\t\t * Using this on many screens may overload the user's hosting account if several\n\t\t * browser windows/tabs are left open for a long time.\n\t\t *\n\t\t * @return void\n\t\t */\n\t\tfunction disableSuspend() {\n\t\t\tsettings.suspendEnabled = false;\n\t\t}\n\n\t\t/**\n\t\t * Get/Set the interval\n\t\t *\n\t\t * When setting to 'fast' or 5, by default interval is 5 sec. for the next 30 ticks (for 2 min and 30 sec).\n\t\t * In this case the number of 'ticks' can be passed as second argument.\n\t\t * If the window doesn't have focus, the interval slows down to 2 min.\n\t\t *\n\t\t * @param mixed speed Interval: 'fast' or 5, 15, 30, 60, 120\n\t\t * @param string ticks Used with speed = 'fast' or 5, how many ticks before the interval reverts back\n\t\t * @return int Current interval in seconds\n\t\t */\n\t\tfunction interval( speed, ticks ) {\n\t\t\tvar newInterval,\n\t\t\t\toldInterval = settings.tempInterval ? settings.tempInterval : settings.mainInterval;\n\n\t\t\tif ( speed ) {\n\t\t\t\tswitch ( speed ) {\n\t\t\t\t\tcase 'fast':\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\tnewInterval = 5000;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 15:\n\t\t\t\t\t\tnewInterval = 15000;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 30:\n\t\t\t\t\t\tnewInterval = 30000;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 60:\n\t\t\t\t\t\tnewInterval = 60000;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 120:\n\t\t\t\t\t\tnewInterval = 120000;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'long-polling':\n\t\t\t\t\t\t// Allow long polling, (experimental)\n\t\t\t\t\t\tsettings.mainInterval = 0;\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tnewInterval = settings.originalInterval;\n\t\t\t\t}\n\n\t\t\t\tif ( settings.minimalInterval && newInterval < settings.minimalInterval ) {\n\t\t\t\t\tnewInterval = settings.minimalInterval;\n\t\t\t\t}\n\n\t\t\t\tif ( 5000 === newInterval ) {\n\t\t\t\t\tticks = parseInt( ticks, 10 ) || 30;\n\t\t\t\t\tticks = ticks < 1 || ticks > 30 ? 30 : ticks;\n\n\t\t\t\t\tsettings.countdown = ticks;\n\t\t\t\t\tsettings.tempInterval = newInterval;\n\t\t\t\t} else {\n\t\t\t\t\tsettings.countdown = 0;\n\t\t\t\t\tsettings.tempInterval = 0;\n\t\t\t\t\tsettings.mainInterval = newInterval;\n\t\t\t\t}\n\n\t\t\t\t// Change the next connection time if new interval has been set.\n\t\t\t\t// Will connect immediately if the time since the last connection\n\t\t\t\t// is greater than the new interval.\n\t\t\t\tif ( newInterval !== oldInterval ) {\n\t\t\t\t\tscheduleNextTick();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn settings.tempInterval ? settings.tempInterval / 1000 : settings.mainInterval / 1000;\n\t\t}\n\n\t\t/**\n\t\t * Enqueue data to send with the next XHR\n\t\t *\n\t\t * As the data is send asynchronously, this function doesn't return the XHR response.\n\t\t * To see the response, use the custom jQuery event 'heartbeat-tick' on the document, example:\n\t\t *\t\t$(document).on( 'heartbeat-tick.myname', function( event, data, textStatus, jqXHR ) {\n\t\t *\t\t\t// code\n\t\t *\t\t});\n\t\t * If the same 'handle' is used more than once, the data is not overwritten when the third argument is 'true'.\n\t\t * Use wp.heartbeat.isQueued('handle') to see if any data is already queued for that handle.\n\t\t *\n\t\t * $param string handle Unique handle for the data. The handle is used in PHP to receive the data.\n\t\t * $param mixed data The data to send.\n\t\t * $param bool noOverwrite Whether to overwrite existing data in the queue.\n\t\t * $return bool Whether the data was queued or not.\n\t\t */\n\t\tfunction enqueue( handle, data, noOverwrite ) {\n\t\t\tif ( handle ) {\n\t\t\t\tif ( noOverwrite && this.isQueued( handle ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tsettings.queue[handle] = data;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Check if data with a particular handle is queued\n\t\t *\n\t\t * $param string handle The handle for the data\n\t\t * $return bool Whether some data is queued with this handle\n\t\t */\n\t\tfunction isQueued( handle ) {\n\t\t\tif ( handle ) {\n\t\t\t\treturn settings.queue.hasOwnProperty( handle );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Remove data with a particular handle from the queue\n\t\t *\n\t\t * $param string handle The handle for the data\n\t\t * $return void\n\t\t */\n\t\tfunction dequeue( handle ) {\n\t\t\tif ( handle ) {\n\t\t\t\tdelete settings.queue[handle];\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Get data that was enqueued with a particular handle\n\t\t *\n\t\t * $param string handle The handle for the data\n\t\t * $return mixed The data or undefined\n\t\t */\n\t\tfunction getQueuedItem( handle ) {\n\t\t\tif ( handle ) {\n\t\t\t\treturn this.isQueued( handle ) ? settings.queue[handle] : undefined;\n\t\t\t}\n\t\t}\n\n\t\tinitialize();\n\n\t\t// Expose public methods\n\t\treturn {\n\t\t\thasFocus: hasFocus,\n\t\t\tconnectNow: connectNow,\n\t\t\tdisableSuspend: disableSuspend,\n\t\t\tinterval: interval,\n\t\t\thasConnectionError: hasConnectionError,\n\t\t\tenqueue: enqueue,\n\t\t\tdequeue: dequeue,\n\t\t\tisQueued: isQueued,\n\t\t\tgetQueuedItem: getQueuedItem\n\t\t};\n\t};\n\n\t// Ensure the global `wp` object exists.\n\twindow.wp = window.wp || {};\n\twindow.wp.heartbeat = new Heartbeat();\n\n}( jQuery, window ));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/hoverIntent.js",
    "content": "/*!\n * hoverIntent v1.8.1 // 2014.08.11 // jQuery v1.9.1+\n * http://cherne.net/brian/resources/jquery.hoverIntent.html\n *\n * You may use hoverIntent under the terms of the MIT license. Basically that\n * means you are free to use hoverIntent as long as this header is left intact.\n * Copyright 2007, 2014 Brian Cherne\n */\n\n/* hoverIntent is similar to jQuery's built-in \"hover\" method except that\n * instead of firing the handlerIn function immediately, hoverIntent checks\n * to see if the user's mouse has slowed down (beneath the sensitivity\n * threshold) before firing the event. The handlerOut function is only\n * called after a matching handlerIn.\n *\n * // basic usage ... just like .hover()\n * .hoverIntent( handlerIn, handlerOut )\n * .hoverIntent( handlerInOut )\n *\n * // basic usage ... with event delegation!\n * .hoverIntent( handlerIn, handlerOut, selector )\n * .hoverIntent( handlerInOut, selector )\n *\n * // using a basic configuration object\n * .hoverIntent( config )\n *\n * @param  handlerIn   function OR configuration object\n * @param  handlerOut  function OR selector for delegation OR undefined\n * @param  selector    selector OR undefined\n * @author Brian Cherne <brian(at)cherne(dot)net>\n */\n(function($) {\n    $.fn.hoverIntent = function(handlerIn,handlerOut,selector) {\n\n        // default configuration values\n        var cfg = {\n            interval: 100,\n            sensitivity: 6,\n            timeout: 0\n        };\n\n        if ( typeof handlerIn === \"object\" ) {\n            cfg = $.extend(cfg, handlerIn );\n        } else if ($.isFunction(handlerOut)) {\n            cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector } );\n        } else {\n            cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut } );\n        }\n\n        // instantiate variables\n        // cX, cY = current X and Y position of mouse, updated by mousemove event\n        // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval\n        var cX, cY, pX, pY;\n\n        // A private function for getting mouse position\n        var track = function(ev) {\n            cX = ev.pageX;\n            cY = ev.pageY;\n        };\n\n        // A private function for comparing current and previous mouse position\n        var compare = function(ev,ob) {\n            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);\n            // compare mouse positions to see if they've crossed the threshold\n            if ( Math.sqrt( (pX-cX)*(pX-cX) + (pY-cY)*(pY-cY) ) < cfg.sensitivity ) {\n                $(ob).off(\"mousemove.hoverIntent\",track);\n                // set hoverIntent state to true (so mouseOut can be called)\n                ob.hoverIntent_s = true;\n                return cfg.over.apply(ob,[ev]);\n            } else {\n                // set previous coordinates for next time\n                pX = cX; pY = cY;\n                // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)\n                ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );\n            }\n        };\n\n        // A private function for delaying the mouseOut function\n        var delay = function(ev,ob) {\n            ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);\n            ob.hoverIntent_s = false;\n            return cfg.out.apply(ob,[ev]);\n        };\n\n        // A private function for handling mouse 'hovering'\n        var handleHover = function(e) {\n            // copy objects to be passed into t (required for event object to be passed in IE)\n            var ev = $.extend({},e);\n            var ob = this;\n\n            // cancel hoverIntent timer if it exists\n            if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }\n\n            // if e.type === \"mouseenter\"\n            if (e.type === \"mouseenter\") {\n                // set \"previous\" X and Y position based on initial entry point\n                pX = ev.pageX; pY = ev.pageY;\n                // update \"current\" X and Y position based on mousemove\n                $(ob).on(\"mousemove.hoverIntent\",track);\n                // start polling interval (self-calling timeout) to compare mouse coordinates over time\n                if (!ob.hoverIntent_s) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}\n\n                // else e.type == \"mouseleave\"\n            } else {\n                // unbind expensive mousemove event\n                $(ob).off(\"mousemove.hoverIntent\",track);\n                // if hoverIntent state is true, then call the mouseOut function after the specified delay\n                if (ob.hoverIntent_s) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}\n            }\n        };\n\n        // listen for mouseenter and mouseleave\n        return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector);\n    };\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/imgareaselect/imgareaselect.css",
    "content": "/*\n * imgAreaSelect animated border style\n */\n\n.imgareaselect-border1 {\n\tbackground: url(border-anim-v.gif) repeat-y left top;\n}\n\n.imgareaselect-border2 {\n    background: url(border-anim-h.gif) repeat-x left top;\n}\n\n.imgareaselect-border3 {\n    background: url(border-anim-v.gif) repeat-y right top;\n}\n\n.imgareaselect-border4 {\n    background: url(border-anim-h.gif) repeat-x left bottom;\n}\n\n.imgareaselect-border1, .imgareaselect-border2,\n.imgareaselect-border3, .imgareaselect-border4 {\n    filter: alpha(opacity=50);\n\topacity: 0.5;\n}\n\n.imgareaselect-handle {\n    background-color: #fff;\n\tborder: solid 1px #000;\n    filter: alpha(opacity=50);\n\topacity: 0.5;\n}\n\n.imgareaselect-outer {\n\tbackground-color: #000;\n    filter: alpha(opacity=50);\n\topacity: 0.5;\n}\n\n.imgareaselect-selection {\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/imgareaselect/jquery.imgareaselect.js",
    "content": "/*\n * imgAreaSelect jQuery plugin\n * version 0.9.10-monkey\n *\n * Copyright (c) 2008-2013 Michal Wojciechowski (odyniec.net)\n *\n * Dual licensed under the MIT (MIT-LICENSE.txt)\n * and GPL (GPL-LICENSE.txt) licenses.\n *\n * http://odyniec.net/projects/imgareaselect/\n *\n */\n\n(function($) {\n\n/*\n * Math functions will be used extensively, so it's convenient to make a few\n * shortcuts\n */\nvar abs = Math.abs,\n    max = Math.max,\n    min = Math.min,\n    round = Math.round;\n\n/**\n * Create a new HTML div element\n *\n * @return A jQuery object representing the new element\n */\nfunction div() {\n    return $('<div/>');\n}\n\n/**\n * imgAreaSelect initialization\n *\n * @param img\n *            A HTML image element to attach the plugin to\n * @param options\n *            An options object\n */\n$.imgAreaSelect = function (img, options) {\n    var\n        /* jQuery object representing the image */\n        $img = $(img),\n\n        /* Has the image finished loading? */\n        imgLoaded,\n\n        /* Plugin elements */\n\n        /* Container box */\n        $box = div(),\n        /* Selection area */\n        $area = div(),\n        /* Border (four divs) */\n        $border = div().add(div()).add(div()).add(div()),\n        /* Outer area (four divs) */\n        $outer = div().add(div()).add(div()).add(div()),\n        /* Handles (empty by default, initialized in setOptions()) */\n        $handles = $([]),\n\n        /*\n         * Additional element to work around a cursor problem in Opera\n         * (explained later)\n         */\n        $areaOpera,\n\n        /* Image position (relative to viewport) */\n        left, top,\n\n        /* Image offset (as returned by .offset()) */\n        imgOfs = { left: 0, top: 0 },\n\n        /* Image dimensions (as returned by .width() and .height()) */\n        imgWidth, imgHeight,\n\n        /*\n         * jQuery object representing the parent element that the plugin\n         * elements are appended to\n         */\n        $parent,\n\n        /* Parent element offset (as returned by .offset()) */\n        parOfs = { left: 0, top: 0 },\n\n        /* Base z-index for plugin elements */\n        zIndex = 0,\n\n        /* Plugin elements position */\n        position = 'absolute',\n\n        /* X/Y coordinates of the starting point for move/resize operations */\n        startX, startY,\n\n        /* Horizontal and vertical scaling factors */\n        scaleX, scaleY,\n\n        /* Current resize mode (\"nw\", \"se\", etc.) */\n        resize,\n\n        /* Selection area constraints */\n        minWidth, minHeight, maxWidth, maxHeight,\n\n        /* Aspect ratio to maintain (floating point number) */\n        aspectRatio,\n\n        /* Are the plugin elements currently displayed? */\n        shown,\n\n        /* Current selection (relative to parent element) */\n        x1, y1, x2, y2,\n\n        /* Current selection (relative to scaled image) */\n        selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 },\n\n        /* Document element */\n        docElem = document.documentElement,\n\n        /* User agent */\n        ua = navigator.userAgent,\n\n        /* Various helper variables used throughout the code */\n        $p, d, i, o, w, h, adjusted;\n\n    /*\n     * Translate selection coordinates (relative to scaled image) to viewport\n     * coordinates (relative to parent element)\n     */\n\n    /**\n     * Translate selection X to viewport X\n     *\n     * @param x\n     *            Selection X\n     * @return Viewport X\n     */\n    function viewX(x) {\n        return x + imgOfs.left - parOfs.left;\n    }\n\n    /**\n     * Translate selection Y to viewport Y\n     *\n     * @param y\n     *            Selection Y\n     * @return Viewport Y\n     */\n    function viewY(y) {\n        return y + imgOfs.top - parOfs.top;\n    }\n\n    /*\n     * Translate viewport coordinates to selection coordinates\n     */\n\n    /**\n     * Translate viewport X to selection X\n     *\n     * @param x\n     *            Viewport X\n     * @return Selection X\n     */\n    function selX(x) {\n        return x - imgOfs.left + parOfs.left;\n    }\n\n    /**\n     * Translate viewport Y to selection Y\n     *\n     * @param y\n     *            Viewport Y\n     * @return Selection Y\n     */\n    function selY(y) {\n        return y - imgOfs.top + parOfs.top;\n    }\n\n    /*\n     * Translate event coordinates (relative to document) to viewport\n     * coordinates\n     */\n\n    /**\n     * Get event X and translate it to viewport X\n     *\n     * @param event\n     *            The event object\n     * @return Viewport X\n     */\n    function evX(event) {\n        return max(event.pageX || 0, touchCoords(event).x) - parOfs.left;\n    }\n\n    /**\n     * Get event Y and translate it to viewport Y\n     *\n     * @param event\n     *            The event object\n     * @return Viewport Y\n     */\n    function evY(event) {\n        return max(event.pageY || 0, touchCoords(event).y) - parOfs.top;\n    }\n\n    /**\n     * Get X and Y coordinates of a touch event\n     *\n     * @param event\n     *            The event object\n     * @return Coordinates object\n     */\n    function touchCoords(event) {\n        var oev = event.originalEvent || {};\n\n        if (oev.touches && oev.touches.length)\n            return { x: oev.touches[0].pageX, y: oev.touches[0].pageY };\n        else\n            return { x: 0, y: 0 };\n    }\n\n    /**\n     * Get the current selection\n     *\n     * @param noScale\n     *            If set to <code>true</code>, scaling is not applied to the\n     *            returned selection\n     * @return Selection object\n     */\n    function getSelection(noScale) {\n        var sx = noScale || scaleX, sy = noScale || scaleY;\n\n        return { x1: round(selection.x1 * sx),\n            y1: round(selection.y1 * sy),\n            x2: round(selection.x2 * sx),\n            y2: round(selection.y2 * sy),\n            width: round(selection.x2 * sx) - round(selection.x1 * sx),\n            height: round(selection.y2 * sy) - round(selection.y1 * sy) };\n    }\n\n    /**\n     * Set the current selection\n     *\n     * @param x1\n     *            X coordinate of the upper left corner of the selection area\n     * @param y1\n     *            Y coordinate of the upper left corner of the selection area\n     * @param x2\n     *            X coordinate of the lower right corner of the selection area\n     * @param y2\n     *            Y coordinate of the lower right corner of the selection area\n     * @param noScale\n     *            If set to <code>true</code>, scaling is not applied to the\n     *            new selection\n     */\n    function setSelection(x1, y1, x2, y2, noScale) {\n        var sx = noScale || scaleX, sy = noScale || scaleY;\n\n        selection = {\n            x1: round(x1 / sx || 0),\n            y1: round(y1 / sy || 0),\n            x2: round(x2 / sx || 0),\n            y2: round(y2 / sy || 0)\n        };\n\n        selection.width = selection.x2 - selection.x1;\n        selection.height = selection.y2 - selection.y1;\n    }\n\n    /**\n     * Recalculate image and parent offsets\n     */\n    function adjust() {\n        /*\n         * Do not adjust if image has not yet loaded or if width is not a\n         * positive number. The latter might happen when imgAreaSelect is put\n         * on a parent element which is then hidden.\n         */\n        if (!imgLoaded || !$img.width())\n            return;\n\n        /*\n         * Get image offset. The .offset() method returns float values, so they\n         * need to be rounded.\n         */\n        imgOfs = { left: round($img.offset().left), top: round($img.offset().top) };\n\n        /* Get image dimensions */\n        imgWidth = $img.innerWidth();\n        imgHeight = $img.innerHeight();\n\n        imgOfs.top += ($img.outerHeight() - imgHeight) >> 1;\n        imgOfs.left += ($img.outerWidth() - imgWidth) >> 1;\n\n        /* Set minimum and maximum selection area dimensions */\n        minWidth = round(options.minWidth / scaleX) || 0;\n        minHeight = round(options.minHeight / scaleY) || 0;\n        maxWidth = round(min(options.maxWidth / scaleX || 1<<24, imgWidth));\n        maxHeight = round(min(options.maxHeight / scaleY || 1<<24, imgHeight));\n\n        /*\n         * Workaround for jQuery 1.3.2 incorrect offset calculation, originally\n         * observed in Safari 3. Firefox 2 is also affected.\n         */\n        if ($().jquery == '1.3.2' && position == 'fixed' &&\n            !docElem['getBoundingClientRect'])\n        {\n            imgOfs.top += max(document.body.scrollTop, docElem.scrollTop);\n            imgOfs.left += max(document.body.scrollLeft, docElem.scrollLeft);\n        }\n\n        /* Determine parent element offset */\n        parOfs = /absolute|relative/.test($parent.css('position')) ?\n            { left: round($parent.offset().left) - $parent.scrollLeft(),\n                top: round($parent.offset().top) - $parent.scrollTop() } :\n            position == 'fixed' ?\n                { left: $(document).scrollLeft(), top: $(document).scrollTop() } :\n                { left: 0, top: 0 };\n\n        left = viewX(0);\n        top = viewY(0);\n\n        /*\n         * Check if selection area is within image boundaries, adjust if\n         * necessary\n         */\n        if (selection.x2 > imgWidth || selection.y2 > imgHeight)\n            doResize();\n    }\n\n    /**\n     * Update plugin elements\n     *\n     * @param resetKeyPress\n     *            If set to <code>false</code>, this instance's keypress\n     *            event handler is not activated\n     */\n    function update(resetKeyPress) {\n        /* If plugin elements are hidden, do nothing */\n        if (!shown) return;\n\n        /*\n         * Set the position and size of the container box and the selection area\n         * inside it\n         */\n        $box.css({ left: viewX(selection.x1), top: viewY(selection.y1) })\n            .add($area).width(w = selection.width).height(h = selection.height);\n\n        /*\n         * Reset the position of selection area, borders, and handles (IE6/IE7\n         * position them incorrectly if we don't do this)\n         */\n        $area.add($border).add($handles).css({ left: 0, top: 0 });\n\n        /* Set border dimensions */\n        $border\n            .width(max(w - $border.outerWidth() + $border.innerWidth(), 0))\n            .height(max(h - $border.outerHeight() + $border.innerHeight(), 0));\n\n        /* Arrange the outer area elements */\n        $($outer[0]).css({ left: left, top: top,\n            width: selection.x1, height: imgHeight });\n        $($outer[1]).css({ left: left + selection.x1, top: top,\n            width: w, height: selection.y1 });\n        $($outer[2]).css({ left: left + selection.x2, top: top,\n            width: imgWidth - selection.x2, height: imgHeight });\n        $($outer[3]).css({ left: left + selection.x1, top: top + selection.y2,\n            width: w, height: imgHeight - selection.y2 });\n\n        w -= $handles.outerWidth();\n        h -= $handles.outerHeight();\n\n        /* Arrange handles */\n        switch ($handles.length) {\n        case 8:\n            $($handles[4]).css({ left: w >> 1 });\n            $($handles[5]).css({ left: w, top: h >> 1 });\n            $($handles[6]).css({ left: w >> 1, top: h });\n            $($handles[7]).css({ top: h >> 1 });\n        case 4:\n            $handles.slice(1,3).css({ left: w });\n            $handles.slice(2,4).css({ top: h });\n        }\n\n        if (resetKeyPress !== false) {\n            /*\n             * Need to reset the document keypress event handler -- unbind the\n             * current handler\n             */\n            if ($.imgAreaSelect.onKeyPress != docKeyPress)\n                $(document).unbind($.imgAreaSelect.keyPress,\n                    $.imgAreaSelect.onKeyPress);\n\n            if (options.keys)\n                /*\n                 * Set the document keypress event handler to this instance's\n                 * docKeyPress() function\n                 */\n                $(document)[$.imgAreaSelect.keyPress](\n                    $.imgAreaSelect.onKeyPress = docKeyPress);\n        }\n\n        /*\n         * Internet Explorer displays 1px-wide dashed borders incorrectly by\n         * filling the spaces between dashes with white. Toggling the margin\n         * property between 0 and \"auto\" fixes this in IE6 and IE7 (IE8 is still\n         * broken). This workaround is not perfect, as it requires setTimeout()\n         * and thus causes the border to flicker a bit, but I haven't found a\n         * better solution.\n         *\n         * Note: This only happens with CSS borders, set with the borderWidth,\n         * borderOpacity, borderColor1, and borderColor2 options (which are now\n         * deprecated). Borders created with GIF background images are fine.\n         */\n        if (msie && $border.outerWidth() - $border.innerWidth() == 2) {\n            $border.css('margin', 0);\n            setTimeout(function () { $border.css('margin', 'auto'); }, 0);\n        }\n    }\n\n    /**\n     * Do the complete update sequence: recalculate offsets, update the\n     * elements, and set the correct values of x1, y1, x2, and y2.\n     *\n     * @param resetKeyPress\n     *            If set to <code>false</code>, this instance's keypress\n     *            event handler is not activated\n     */\n    function doUpdate(resetKeyPress) {\n        adjust();\n        update(resetKeyPress);\n        x1 = viewX(selection.x1); y1 = viewY(selection.y1);\n        x2 = viewX(selection.x2); y2 = viewY(selection.y2);\n    }\n\n    /**\n     * Hide or fade out an element (or multiple elements)\n     *\n     * @param $elem\n     *            A jQuery object containing the element(s) to hide/fade out\n     * @param fn\n     *            Callback function to be called when fadeOut() completes\n     */\n    function hide($elem, fn) {\n        options.fadeSpeed ? $elem.fadeOut(options.fadeSpeed, fn) : $elem.hide();\n    }\n\n    /**\n     * Selection area mousemove event handler\n     *\n     * @param event\n     *            The event object\n     */\n    function areaMouseMove(event) {\n        var x = selX(evX(event)) - selection.x1,\n            y = selY(evY(event)) - selection.y1;\n\n        if (!adjusted) {\n            adjust();\n            adjusted = true;\n\n            $box.one('mouseout', function () { adjusted = false; });\n        }\n\n        /* Clear the resize mode */\n        resize = '';\n\n        if (options.resizable) {\n            /*\n             * Check if the mouse pointer is over the resize margin area and set\n             * the resize mode accordingly\n             */\n            if (y <= options.resizeMargin)\n                resize = 'n';\n            else if (y >= selection.height - options.resizeMargin)\n                resize = 's';\n            if (x <= options.resizeMargin)\n                resize += 'w';\n            else if (x >= selection.width - options.resizeMargin)\n                resize += 'e';\n        }\n\n        $box.css('cursor', resize ? resize + '-resize' :\n            options.movable ? 'move' : '');\n        if ($areaOpera)\n            $areaOpera.toggle();\n    }\n\n    /**\n     * Document mouseup event handler\n     *\n     * @param event\n     *            The event object\n     */\n    function docMouseUp(event) {\n        /* Set back the default cursor */\n        $('body').css('cursor', '');\n        /*\n         * If autoHide is enabled, or if the selection has zero width/height,\n         * hide the selection and the outer area\n         */\n        if (options.autoHide || selection.width * selection.height == 0)\n            hide($box.add($outer), function () { $(this).hide(); });\n\n        $(document).off('mousemove touchmove', selectingMouseMove);\n        $box.on('mousemove touchmove', areaMouseMove);\n\n        options.onSelectEnd(img, getSelection());\n    }\n\n    /**\n     * Selection area mousedown event handler\n     *\n     * @param event\n     *            The event object\n     * @return false\n     */\n    function areaMouseDown(event) {\n        if (event.type == 'mousedown' && event.which != 1) return false;\n\n    \t/*\n    \t * With mobile browsers, there is no \"moving the pointer over\" action,\n    \t * so we need to simulate one mousemove event happening prior to\n    \t * mousedown/touchstart.\n    \t */\n    \tareaMouseMove(event);\n\n        adjust();\n\n        if (resize) {\n            /* Resize mode is in effect */\n            $('body').css('cursor', resize + '-resize');\n\n            x1 = viewX(selection[/w/.test(resize) ? 'x2' : 'x1']);\n            y1 = viewY(selection[/n/.test(resize) ? 'y2' : 'y1']);\n\n            $(document).on('mousemove touchmove', selectingMouseMove)\n                .one('mouseup touchend', docMouseUp);\n            $box.off('mousemove touchmove', areaMouseMove);\n        }\n        else if (options.movable) {\n            startX = left + selection.x1 - evX(event);\n            startY = top + selection.y1 - evY(event);\n\n            $box.off('mousemove touchmove', areaMouseMove);\n\n            $(document).on('mousemove touchmove', movingMouseMove)\n                .one('mouseup touchend', function () {\n                    options.onSelectEnd(img, getSelection());\n\n                    $(document).off('mousemove touchmove', movingMouseMove);\n                    $box.on('mousemove touchmove', areaMouseMove);\n                });\n        }\n        else\n            $img.mousedown(event);\n\n        return false;\n    }\n\n    /**\n     * Adjust the x2/y2 coordinates to maintain aspect ratio (if defined)\n     *\n     * @param xFirst\n     *            If set to <code>true</code>, calculate x2 first. Otherwise,\n     *            calculate y2 first.\n     */\n    function fixAspectRatio(xFirst) {\n        if (aspectRatio)\n            if (xFirst) {\n                x2 = max(left, min(left + imgWidth,\n                    x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1)));\n                y2 = round(max(top, min(top + imgHeight,\n                    y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1))));\n                x2 = round(x2);\n            }\n            else {\n                y2 = max(top, min(top + imgHeight,\n                    y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1)));\n                x2 = round(max(left, min(left + imgWidth,\n                    x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1))));\n                y2 = round(y2);\n            }\n    }\n\n    /**\n     * Resize the selection area respecting the minimum/maximum dimensions and\n     * aspect ratio\n     */\n    function doResize() {\n        /*\n         * Make sure the top left corner of the selection area stays within\n         * image boundaries (it might not if the image source was dynamically\n         * changed).\n         */\n        x1 = min(x1, left + imgWidth);\n        y1 = min(y1, top + imgHeight);\n\n        if (abs(x2 - x1) < minWidth) {\n            /* Selection width is smaller than minWidth */\n            x2 = x1 - minWidth * (x2 < x1 || -1);\n\n            if (x2 < left)\n                x1 = left + minWidth;\n            else if (x2 > left + imgWidth)\n                x1 = left + imgWidth - minWidth;\n        }\n\n        if (abs(y2 - y1) < minHeight) {\n            /* Selection height is smaller than minHeight */\n            y2 = y1 - minHeight * (y2 < y1 || -1);\n\n            if (y2 < top)\n                y1 = top + minHeight;\n            else if (y2 > top + imgHeight)\n                y1 = top + imgHeight - minHeight;\n        }\n\n        x2 = max(left, min(x2, left + imgWidth));\n        y2 = max(top, min(y2, top + imgHeight));\n\n        fixAspectRatio(abs(x2 - x1) < abs(y2 - y1) * aspectRatio);\n\n        if (abs(x2 - x1) > maxWidth) {\n            /* Selection width is greater than maxWidth */\n            x2 = x1 - maxWidth * (x2 < x1 || -1);\n            fixAspectRatio();\n        }\n\n        if (abs(y2 - y1) > maxHeight) {\n            /* Selection height is greater than maxHeight */\n            y2 = y1 - maxHeight * (y2 < y1 || -1);\n            fixAspectRatio(true);\n        }\n\n        selection = { x1: selX(min(x1, x2)), x2: selX(max(x1, x2)),\n            y1: selY(min(y1, y2)), y2: selY(max(y1, y2)),\n            width: abs(x2 - x1), height: abs(y2 - y1) };\n\n        update();\n\n        options.onSelectChange(img, getSelection());\n    }\n\n    /**\n     * Mousemove event handler triggered when the user is selecting an area\n     *\n     * @param event\n     *            The event object\n     * @return false\n     */\n    function selectingMouseMove(event) {\n        x2 = /w|e|^$/.test(resize) || aspectRatio ? evX(event) : viewX(selection.x2);\n        y2 = /n|s|^$/.test(resize) || aspectRatio ? evY(event) : viewY(selection.y2);\n\n        doResize();\n\n        return false;\n    }\n\n    /**\n     * Move the selection area\n     *\n     * @param newX1\n     *            New viewport X1\n     * @param newY1\n     *            New viewport Y1\n     */\n    function doMove(newX1, newY1) {\n        x2 = (x1 = newX1) + selection.width;\n        y2 = (y1 = newY1) + selection.height;\n\n        $.extend(selection, { x1: selX(x1), y1: selY(y1), x2: selX(x2),\n            y2: selY(y2) });\n\n        update();\n\n        options.onSelectChange(img, getSelection());\n    }\n\n    /**\n     * Mousemove event handler triggered when the selection area is being moved\n     *\n     * @param event\n     *            The event object\n     * @return false\n     */\n    function movingMouseMove(event) {\n        x1 = max(left, min(startX + evX(event), left + imgWidth - selection.width));\n        y1 = max(top, min(startY + evY(event), top + imgHeight - selection.height));\n\n        doMove(x1, y1);\n\n        event.preventDefault();\n        return false;\n    }\n\n    /**\n     * Start selection\n     */\n    function startSelection() {\n        $(document).off('mousemove touchmove', startSelection);\n        adjust();\n\n        x2 = x1;\n        y2 = y1;\n        doResize();\n\n        resize = '';\n\n        if (!$outer.is(':visible'))\n            /* Show the plugin elements */\n            $box.add($outer).hide().fadeIn(options.fadeSpeed||0);\n\n        shown = true;\n\n        $(document).off('mouseup touchend', cancelSelection)\n            .on('mousemove touchmove', selectingMouseMove)\n            .one('mouseup touchend', docMouseUp);\n        $box.off('mousemove touchmove', areaMouseMove);\n\n        options.onSelectStart(img, getSelection());\n    }\n\n    /**\n     * Cancel selection\n     */\n    function cancelSelection() {\n        $(document).off('mousemove touchmove', startSelection)\n            .off('mouseup touchend', cancelSelection);\n        hide($box.add($outer));\n\n        setSelection(selX(x1), selY(y1), selX(x1), selY(y1));\n\n        /* If this is an API call, callback functions should not be triggered */\n        if (!(this instanceof $.imgAreaSelect)) {\n            options.onSelectChange(img, getSelection());\n            options.onSelectEnd(img, getSelection());\n        }\n    }\n\n    /**\n     * Image mousedown event handler\n     *\n     * @param event\n     *            The event object\n     * @return false\n     */\n    function imgMouseDown(event) {\n        /* Ignore the event if animation is in progress */\n        if (event.which != 1 || $outer.is(':animated')) return false;\n\n        adjust();\n        startX = x1 = evX(event);\n        startY = y1 = evY(event);\n\n        /* Selection will start when the mouse is moved */\n        $(document).on({ 'mousemove touchmove': startSelection,\n            'mouseup touchend': cancelSelection });\n\n        return false;\n    }\n\n    /**\n     * Window resize event handler\n     */\n    function windowResize() {\n        doUpdate(false);\n    }\n\n    /**\n     * Image load event handler. This is the final part of the initialization\n     * process.\n     */\n    function imgLoad() {\n        imgLoaded = true;\n\n        /* Set options */\n        setOptions(options = $.extend({\n            classPrefix: 'imgareaselect',\n            movable: true,\n            parent: 'body',\n            resizable: true,\n            resizeMargin: 10,\n            onInit: function () {},\n            onSelectStart: function () {},\n            onSelectChange: function () {},\n            onSelectEnd: function () {}\n        }, options));\n\n        $box.add($outer).css({ visibility: '' });\n\n        if (options.show) {\n            shown = true;\n            adjust();\n            update();\n            $box.add($outer).hide().fadeIn(options.fadeSpeed||0);\n        }\n\n        /*\n         * Call the onInit callback. The setTimeout() call is used to ensure\n         * that the plugin has been fully initialized and the object instance is\n         * available (so that it can be obtained in the callback).\n         */\n        setTimeout(function () { options.onInit(img, getSelection()); }, 0);\n    }\n\n    /**\n     * Document keypress event handler\n     *\n     * @param event\n     *            The event object\n     * @return false\n     */\n    var docKeyPress = function(event) {\n        var k = options.keys, d, t, key = event.keyCode;\n\n        d = !isNaN(k.alt) && (event.altKey || event.originalEvent.altKey) ? k.alt :\n            !isNaN(k.ctrl) && event.ctrlKey ? k.ctrl :\n            !isNaN(k.shift) && event.shiftKey ? k.shift :\n            !isNaN(k.arrows) ? k.arrows : 10;\n\n        if (k.arrows == 'resize' || (k.shift == 'resize' && event.shiftKey) ||\n            (k.ctrl == 'resize' && event.ctrlKey) ||\n            (k.alt == 'resize' && (event.altKey || event.originalEvent.altKey)))\n        {\n            /* Resize selection */\n\n            switch (key) {\n            case 37:\n                /* Left */\n                d = -d;\n            case 39:\n                /* Right */\n                t = max(x1, x2);\n                x1 = min(x1, x2);\n                x2 = max(t + d, x1);\n                fixAspectRatio();\n                break;\n            case 38:\n                /* Up */\n                d = -d;\n            case 40:\n                /* Down */\n                t = max(y1, y2);\n                y1 = min(y1, y2);\n                y2 = max(t + d, y1);\n                fixAspectRatio(true);\n                break;\n            default:\n                return;\n            }\n\n            doResize();\n        }\n        else {\n            /* Move selection */\n\n            x1 = min(x1, x2);\n            y1 = min(y1, y2);\n\n            switch (key) {\n            case 37:\n                /* Left */\n                doMove(max(x1 - d, left), y1);\n                break;\n            case 38:\n                /* Up */\n                doMove(x1, max(y1 - d, top));\n                break;\n            case 39:\n                /* Right */\n                doMove(x1 + min(d, imgWidth - selX(x2)), y1);\n                break;\n            case 40:\n                /* Down */\n                doMove(x1, y1 + min(d, imgHeight - selY(y2)));\n                break;\n            default:\n                return;\n            }\n        }\n\n        return false;\n    };\n\n    /**\n     * Apply style options to plugin element (or multiple elements)\n     *\n     * @param $elem\n     *            A jQuery object representing the element(s) to style\n     * @param props\n     *            An object that maps option names to corresponding CSS\n     *            properties\n     */\n    function styleOptions($elem, props) {\n        for (var option in props)\n            if (options[option] !== undefined)\n                $elem.css(props[option], options[option]);\n    }\n\n    /**\n     * Set plugin options\n     *\n     * @param newOptions\n     *            The new options object\n     */\n    function setOptions(newOptions) {\n        if (newOptions.parent)\n            ($parent = $(newOptions.parent)).append($box.add($outer));\n\n        /* Merge the new options with the existing ones */\n        $.extend(options, newOptions);\n\n        adjust();\n\n        if (newOptions.handles != null) {\n            /* Recreate selection area handles */\n            $handles.remove();\n            $handles = $([]);\n\n            i = newOptions.handles ? newOptions.handles == 'corners' ? 4 : 8 : 0;\n\n            while (i--)\n                $handles = $handles.add(div());\n\n            /* Add a class to handles and set the CSS properties */\n            $handles.addClass(options.classPrefix + '-handle').css({\n                position: 'absolute',\n                /*\n                 * The font-size property needs to be set to zero, otherwise\n                 * Internet Explorer makes the handles too large\n                 */\n                fontSize: 0,\n                zIndex: zIndex + 1 || 1\n            });\n\n            /*\n             * If handle width/height has not been set with CSS rules, set the\n             * default 5px\n             */\n            if (!parseInt($handles.css('width')) >= 0)\n                $handles.width(5).height(5);\n\n            /*\n             * If the borderWidth option is in use, add a solid border to\n             * handles\n             */\n            if (o = options.borderWidth)\n                $handles.css({ borderWidth: o, borderStyle: 'solid' });\n\n            /* Apply other style options */\n            styleOptions($handles, { borderColor1: 'border-color',\n                borderColor2: 'background-color',\n                borderOpacity: 'opacity' });\n        }\n\n        /* Calculate scale factors */\n        scaleX = options.imageWidth / imgWidth || 1;\n        scaleY = options.imageHeight / imgHeight || 1;\n\n        /* Set selection */\n        if (newOptions.x1 != null) {\n            setSelection(newOptions.x1, newOptions.y1, newOptions.x2,\n                newOptions.y2);\n            newOptions.show = !newOptions.hide;\n        }\n\n        if (newOptions.keys)\n            /* Enable keyboard support */\n            options.keys = $.extend({ shift: 1, ctrl: 'resize' },\n                newOptions.keys);\n\n        /* Add classes to plugin elements */\n        $outer.addClass(options.classPrefix + '-outer');\n        $area.addClass(options.classPrefix + '-selection');\n        for (i = 0; i++ < 4;)\n            $($border[i-1]).addClass(options.classPrefix + '-border' + i);\n\n        /* Apply style options */\n        styleOptions($area, { selectionColor: 'background-color',\n            selectionOpacity: 'opacity' });\n        styleOptions($border, { borderOpacity: 'opacity',\n            borderWidth: 'border-width' });\n        styleOptions($outer, { outerColor: 'background-color',\n            outerOpacity: 'opacity' });\n        if (o = options.borderColor1)\n            $($border[0]).css({ borderStyle: 'solid', borderColor: o });\n        if (o = options.borderColor2)\n            $($border[1]).css({ borderStyle: 'dashed', borderColor: o });\n\n        /* Append all the selection area elements to the container box */\n        $box.append($area.add($border).add($areaOpera)).append($handles);\n\n        if (msie) {\n            if (o = ($outer.css('filter')||'').match(/opacity=(\\d+)/))\n                $outer.css('opacity', o[1]/100);\n            if (o = ($border.css('filter')||'').match(/opacity=(\\d+)/))\n                $border.css('opacity', o[1]/100);\n        }\n\n        if (newOptions.hide)\n            hide($box.add($outer));\n        else if (newOptions.show && imgLoaded) {\n            shown = true;\n            $box.add($outer).fadeIn(options.fadeSpeed||0);\n            doUpdate();\n        }\n\n        /* Calculate the aspect ratio factor */\n        aspectRatio = (d = (options.aspectRatio || '').split(/:/))[0] / d[1];\n\n        $img.add($outer).unbind('mousedown', imgMouseDown);\n\n        if (options.disable || options.enable === false) {\n            /* Disable the plugin */\n            $box.off({ 'mousemove touchmove': areaMouseMove,\n                'mousedown touchstart': areaMouseDown });\n            $(window).off('resize', windowResize);\n        }\n        else {\n            if (options.enable || options.disable === false) {\n                /* Enable the plugin */\n                if (options.resizable || options.movable)\n                    $box.on({ 'mousemove touchmove': areaMouseMove,\n                        'mousedown touchstart': areaMouseDown });\n\n                $(window).resize(windowResize);\n            }\n\n            if (!options.persistent)\n                $img.add($outer).on('mousedown touchstart', imgMouseDown);\n        }\n\n        options.enable = options.disable = undefined;\n    }\n\n    /**\n     * Remove plugin completely\n     */\n    this.remove = function () {\n        /*\n         * Call setOptions with { disable: true } to unbind the event handlers\n         */\n        setOptions({ disable: true });\n        $box.add($outer).remove();\n    };\n\n    /*\n     * Public API\n     */\n\n    /**\n     * Get current options\n     *\n     * @return An object containing the set of options currently in use\n     */\n    this.getOptions = function () { return options; };\n\n    /**\n     * Set plugin options\n     *\n     * @param newOptions\n     *            The new options object\n     */\n    this.setOptions = setOptions;\n\n    /**\n     * Get the current selection\n     *\n     * @param noScale\n     *            If set to <code>true</code>, scaling is not applied to the\n     *            returned selection\n     * @return Selection object\n     */\n    this.getSelection = getSelection;\n\n    /**\n     * Set the current selection\n     *\n     * @param x1\n     *            X coordinate of the upper left corner of the selection area\n     * @param y1\n     *            Y coordinate of the upper left corner of the selection area\n     * @param x2\n     *            X coordinate of the lower right corner of the selection area\n     * @param y2\n     *            Y coordinate of the lower right corner of the selection area\n     * @param noScale\n     *            If set to <code>true</code>, scaling is not applied to the\n     *            new selection\n     */\n    this.setSelection = setSelection;\n\n    /**\n     * Cancel selection\n     */\n    this.cancelSelection = cancelSelection;\n\n    /**\n     * Update plugin elements\n     *\n     * @param resetKeyPress\n     *            If set to <code>false</code>, this instance's keypress\n     *            event handler is not activated\n     */\n    this.update = doUpdate;\n\n    /* Do the dreaded browser detection */\n    var msie = (/msie ([\\w.]+)/i.exec(ua)||[])[1],\n        opera = /opera/i.test(ua),\n        safari = /webkit/i.test(ua) && !/chrome/i.test(ua);\n\n    /*\n     * Traverse the image's parent elements (up to <body>) and find the\n     * highest z-index\n     */\n    $p = $img;\n\n    while ($p.length) {\n        zIndex = max(zIndex,\n            !isNaN($p.css('z-index')) ? $p.css('z-index') : zIndex);\n        /* Also check if any of the ancestor elements has fixed position */\n        if ($p.css('position') == 'fixed')\n            position = 'fixed';\n\n        $p = $p.parent(':not(body)');\n    }\n\n    /*\n     * If z-index is given as an option, it overrides the one found by the\n     * above loop\n     */\n    zIndex = options.zIndex || zIndex;\n\n    if (msie)\n        $img.attr('unselectable', 'on');\n\n    /*\n     * In MSIE and WebKit, we need to use the keydown event instead of keypress\n     */\n    $.imgAreaSelect.keyPress = msie || safari ? 'keydown' : 'keypress';\n\n    /*\n     * There is a bug affecting the CSS cursor property in Opera (observed in\n     * versions up to 10.00) that prevents the cursor from being updated unless\n     * the mouse leaves and enters the element again. To trigger the mouseover\n     * event, we're adding an additional div to $box and we're going to toggle\n     * it when mouse moves inside the selection area.\n     */\n    if (opera)\n        $areaOpera = div().css({ width: '100%', height: '100%',\n            position: 'absolute', zIndex: zIndex + 2 || 2 });\n\n    /*\n     * We initially set visibility to \"hidden\" as a workaround for a weird\n     * behaviour observed in Google Chrome 1.0.154.53 (on Windows XP). Normally\n     * we would just set display to \"none\", but, for some reason, if we do so\n     * then Chrome refuses to later display the element with .show() or\n     * .fadeIn().\n     */\n    $box.add($outer).css({ visibility: 'hidden', position: position,\n        overflow: 'hidden', zIndex: zIndex || '0' });\n    $box.css({ zIndex: zIndex + 2 || 2 });\n    $area.add($border).css({ position: 'absolute', fontSize: 0 });\n\n    /*\n     * If the image has been fully loaded, or if it is not really an image (eg.\n     * a div), call imgLoad() immediately; otherwise, bind it to be called once\n     * on image load event.\n     */\n    img.complete || img.readyState == 'complete' || !$img.is('img') ?\n        imgLoad() : $img.one('load', imgLoad);\n\n    /*\n     * MSIE 9.0 doesn't always fire the image load event -- resetting the src\n     * attribute seems to trigger it. The check is for version 7 and above to\n     * accommodate for MSIE 9 running in compatibility mode.\n     */\n    if (!imgLoaded && msie && msie >= 7)\n        img.src = img.src;\n};\n\n/**\n * Invoke imgAreaSelect on a jQuery object containing the image(s)\n *\n * @param options\n *            Options object\n * @return The jQuery object or a reference to imgAreaSelect instance (if the\n *         <code>instance</code> option was specified)\n */\n$.fn.imgAreaSelect = function (options) {\n    options = options || {};\n\n    this.each(function () {\n        /* Is there already an imgAreaSelect instance bound to this element? */\n        if ($(this).data('imgAreaSelect')) {\n            /* Yes there is -- is it supposed to be removed? */\n            if (options.remove) {\n                /* Remove the plugin */\n                $(this).data('imgAreaSelect').remove();\n                $(this).removeData('imgAreaSelect');\n            }\n            else\n                /* Reset options */\n                $(this).data('imgAreaSelect').setOptions(options);\n        }\n        else if (!options.remove) {\n            /* No exising instance -- create a new one */\n\n            /*\n             * If neither the \"enable\" nor the \"disable\" option is present, add\n             * \"enable\" as the default\n             */\n            if (options.enable === undefined && options.disable === undefined)\n                options.enable = true;\n\n            $(this).data('imgAreaSelect', new $.imgAreaSelect(this, options));\n        }\n    });\n\n    if (options.instance)\n        /*\n         * Return the imgAreaSelect instance bound to the first element in the\n         * set\n         */\n        return $(this).data('imgAreaSelect');\n\n    return this;\n};\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery-migrate.js",
    "content": "/*!\r\n * jQuery Migrate - v1.2.1 - 2013-05-08\r\n * https://github.com/jquery/jquery-migrate\r\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT\r\n */\r\n(function( jQuery, window, undefined ) {\r\n// See http://bugs.jquery.com/ticket/13335\r\n// \"use strict\";\r\n\r\n\r\nvar warnedAbout = {};\r\n\r\n// List of warnings already given; public read only\r\njQuery.migrateWarnings = [];\r\n\r\n// Set to true to prevent console output; migrateWarnings still maintained\r\n// jQuery.migrateMute = false;\r\n\r\n// Show a message on the console so devs know we're active\r\nif ( !jQuery.migrateMute && window.console && window.console.log ) {\r\n\twindow.console.log(\"JQMIGRATE: Logging is active\");\r\n}\r\n\r\n// Set to false to disable traces that appear with warnings\r\nif ( jQuery.migrateTrace === undefined ) {\r\n\tjQuery.migrateTrace = true;\r\n}\r\n\r\n// Forget any warnings we've already given; public\r\njQuery.migrateReset = function() {\r\n\twarnedAbout = {};\r\n\tjQuery.migrateWarnings.length = 0;\r\n};\r\n\r\nfunction migrateWarn( msg) {\r\n\tvar console = window.console;\r\n\tif ( !warnedAbout[ msg ] ) {\r\n\t\twarnedAbout[ msg ] = true;\r\n\t\tjQuery.migrateWarnings.push( msg );\r\n\t\tif ( console && console.warn && !jQuery.migrateMute ) {\r\n\t\t\tconsole.warn( \"JQMIGRATE: \" + msg );\r\n\t\t\tif ( jQuery.migrateTrace && console.trace ) {\r\n\t\t\t\tconsole.trace();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction migrateWarnProp( obj, prop, value, msg ) {\r\n\tif ( Object.defineProperty ) {\r\n\t\t// On ES5 browsers (non-oldIE), warn if the code tries to get prop;\r\n\t\t// allow property to be overwritten in case some other plugin wants it\r\n\t\ttry {\r\n\t\t\tObject.defineProperty( obj, prop, {\r\n\t\t\t\tconfigurable: true,\r\n\t\t\t\tenumerable: true,\r\n\t\t\t\tget: function() {\r\n\t\t\t\t\tmigrateWarn( msg );\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t},\r\n\t\t\t\tset: function( newValue ) {\r\n\t\t\t\t\tmigrateWarn( msg );\r\n\t\t\t\t\tvalue = newValue;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t} catch( err ) {\r\n\t\t\t// IE8 is a dope about Object.defineProperty, can't warn there\r\n\t\t}\r\n\t}\r\n\r\n\t// Non-ES5 (or broken) browser; just set the property\r\n\tjQuery._definePropertyBroken = true;\r\n\tobj[ prop ] = value;\r\n}\r\n\r\nif ( document.compatMode === \"BackCompat\" ) {\r\n\t// jQuery has never supported or tested Quirks Mode\r\n\tmigrateWarn( \"jQuery is not compatible with Quirks Mode\" );\r\n}\r\n\r\n\r\nvar attrFn = jQuery( \"<input/>\", { size: 1 } ).attr(\"size\") && jQuery.attrFn,\r\n\toldAttr = jQuery.attr,\r\n\tvalueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||\r\n\t\tfunction() { return null; },\r\n\tvalueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||\r\n\t\tfunction() { return undefined; },\r\n\trnoType = /^(?:input|button)$/i,\r\n\trnoAttrNodeType = /^[238]$/,\r\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\r\n\truseDefault = /^(?:checked|selected)$/i;\r\n\r\n// jQuery.attrFn\r\nmigrateWarnProp( jQuery, \"attrFn\", attrFn || {}, \"jQuery.attrFn is deprecated\" );\r\n\r\njQuery.attr = function( elem, name, value, pass ) {\r\n\tvar lowerName = name.toLowerCase(),\r\n\t\tnType = elem && elem.nodeType;\r\n\r\n\tif ( pass ) {\r\n\t\t// Since pass is used internally, we only warn for new jQuery\r\n\t\t// versions where there isn't a pass arg in the formal params\r\n\t\tif ( oldAttr.length < 4 ) {\r\n\t\t\tmigrateWarn(\"jQuery.fn.attr( props, pass ) is deprecated\");\r\n\t\t}\r\n\t\tif ( elem && !rnoAttrNodeType.test( nType ) &&\r\n\t\t\t(attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {\r\n\t\t\treturn jQuery( elem )[ name ]( value );\r\n\t\t}\r\n\t}\r\n\r\n\t// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking\r\n\t// for disconnected elements we don't warn on $( \"<button>\", { type: \"button\" } ).\r\n\tif ( name === \"type\" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {\r\n\t\tmigrateWarn(\"Can't change the 'type' of an input or button in IE 6/7/8\");\r\n\t}\r\n\r\n\t// Restore boolHook for boolean property/attribute synchronization\r\n\tif ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {\r\n\t\tjQuery.attrHooks[ lowerName ] = {\r\n\t\t\tget: function( elem, name ) {\r\n\t\t\t\t// Align boolean attributes with corresponding properties\r\n\t\t\t\t// Fall back to attribute presence where some booleans are not supported\r\n\t\t\t\tvar attrNode,\r\n\t\t\t\t\tproperty = jQuery.prop( elem, name );\r\n\t\t\t\treturn property === true || typeof property !== \"boolean\" &&\r\n\t\t\t\t\t( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\r\n\r\n\t\t\t\t\tname.toLowerCase() :\r\n\t\t\t\t\tundefined;\r\n\t\t\t},\r\n\t\t\tset: function( elem, value, name ) {\r\n\t\t\t\tvar propName;\r\n\t\t\t\tif ( value === false ) {\r\n\t\t\t\t\t// Remove boolean attributes when set to false\r\n\t\t\t\t\tjQuery.removeAttr( elem, name );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// value is true since we know at this point it's type boolean and not false\r\n\t\t\t\t\t// Set boolean attributes to the same name and set the DOM property\r\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\r\n\t\t\t\t\tif ( propName in elem ) {\r\n\t\t\t\t\t\t// Only set the IDL specifically if it already exists on the element\r\n\t\t\t\t\t\telem[ propName ] = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\telem.setAttribute( name, name.toLowerCase() );\r\n\t\t\t\t}\r\n\t\t\t\treturn name;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Warn only for attributes that can remain distinct from their properties post-1.9\r\n\t\tif ( ruseDefault.test( lowerName ) ) {\r\n\t\t\tmigrateWarn( \"jQuery.fn.attr('\" + lowerName + \"') may use property instead of attribute\" );\r\n\t\t}\r\n\t}\r\n\r\n\treturn oldAttr.call( jQuery, elem, name, value );\r\n};\r\n\r\n// attrHooks: value\r\njQuery.attrHooks.value = {\r\n\tget: function( elem, name ) {\r\n\t\tvar nodeName = ( elem.nodeName || \"\" ).toLowerCase();\r\n\t\tif ( nodeName === \"button\" ) {\r\n\t\t\treturn valueAttrGet.apply( this, arguments );\r\n\t\t}\r\n\t\tif ( nodeName !== \"input\" && nodeName !== \"option\" ) {\r\n\t\t\tmigrateWarn(\"jQuery.fn.attr('value') no longer gets properties\");\r\n\t\t}\r\n\t\treturn name in elem ?\r\n\t\t\telem.value :\r\n\t\t\tnull;\r\n\t},\r\n\tset: function( elem, value ) {\r\n\t\tvar nodeName = ( elem.nodeName || \"\" ).toLowerCase();\r\n\t\tif ( nodeName === \"button\" ) {\r\n\t\t\treturn valueAttrSet.apply( this, arguments );\r\n\t\t}\r\n\t\tif ( nodeName !== \"input\" && nodeName !== \"option\" ) {\r\n\t\t\tmigrateWarn(\"jQuery.fn.attr('value', val) no longer sets properties\");\r\n\t\t}\r\n\t\t// Does not return so that setAttribute is also used\r\n\t\telem.value = value;\r\n\t}\r\n};\r\n\r\n\r\nvar matched, browser,\r\n\toldInit = jQuery.fn.init,\r\n\toldParseJSON = jQuery.parseJSON,\r\n\t// Note: XSS check is done below after string is trimmed\r\n\trquickExpr = /^([^<]*)(<[\\w\\W]+>)([^>]*)$/;\r\n\r\n// $(html) \"looks like html\" rule change\r\njQuery.fn.init = function( selector, context, rootjQuery ) {\r\n\tvar match;\r\n\r\n\tif ( selector && typeof selector === \"string\" && !jQuery.isPlainObject( context ) &&\r\n\t\t\t(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {\r\n\t\t// This is an HTML string according to the \"old\" rules; is it still?\r\n\t\tif ( selector.charAt( 0 ) !== \"<\" ) {\r\n\t\t\tmigrateWarn(\"$(html) HTML strings must start with '<' character\");\r\n\t\t}\r\n\t\tif ( match[ 3 ] ) {\r\n\t\t\tmigrateWarn(\"$(html) HTML text after last tag is ignored\");\r\n\t\t}\r\n\t\t// Consistently reject any HTML-like string starting with a hash (#9521)\r\n\t\t// Note that this may break jQuery 1.6.x code that otherwise would work.\r\n\t\tif ( match[ 0 ].charAt( 0 ) === \"#\" ) {\r\n\t\t\tmigrateWarn(\"HTML string cannot start with a '#' character\");\r\n\t\t\tjQuery.error(\"JQMIGRATE: Invalid selector string (XSS)\");\r\n\t\t}\r\n\t\t// Now process using loose rules; let pre-1.8 play too\r\n\t\tif ( context && context.context ) {\r\n\t\t\t// jQuery object as context; parseHTML expects a DOM object\r\n\t\t\tcontext = context.context;\r\n\t\t}\r\n\t\tif ( jQuery.parseHTML ) {\r\n\t\t\treturn oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),\r\n\t\t\t\t\tcontext, rootjQuery );\r\n\t\t}\r\n\t}\r\n\treturn oldInit.apply( this, arguments );\r\n};\r\njQuery.fn.init.prototype = jQuery.fn;\r\n\r\n// Let $.parseJSON(falsy_value) return null\r\njQuery.parseJSON = function( json ) {\r\n\tif ( !json && json !== null ) {\r\n\t\tmigrateWarn(\"jQuery.parseJSON requires a valid JSON string\");\r\n\t\treturn null;\r\n\t}\r\n\treturn oldParseJSON.apply( this, arguments );\r\n};\r\n\r\njQuery.uaMatch = function( ua ) {\r\n\tua = ua.toLowerCase();\r\n\r\n\tvar match = /(chrome)[ \\/]([\\w.]+)/.exec( ua ) ||\r\n\t\t/(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\r\n\t\t/(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec( ua ) ||\r\n\t\t/(msie) ([\\w.]+)/.exec( ua ) ||\r\n\t\tua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec( ua ) ||\r\n\t\t[];\r\n\r\n\treturn {\r\n\t\tbrowser: match[ 1 ] || \"\",\r\n\t\tversion: match[ 2 ] || \"0\"\r\n\t};\r\n};\r\n\r\n// Don't clobber any existing jQuery.browser in case it's different\r\nif ( !jQuery.browser ) {\r\n\tmatched = jQuery.uaMatch( navigator.userAgent );\r\n\tbrowser = {};\r\n\r\n\tif ( matched.browser ) {\r\n\t\tbrowser[ matched.browser ] = true;\r\n\t\tbrowser.version = matched.version;\r\n\t}\r\n\r\n\t// Chrome is Webkit, but Webkit is also Safari.\r\n\tif ( browser.chrome ) {\r\n\t\tbrowser.webkit = true;\r\n\t} else if ( browser.webkit ) {\r\n\t\tbrowser.safari = true;\r\n\t}\r\n\r\n\tjQuery.browser = browser;\r\n}\r\n\r\n// Warn if the code tries to get jQuery.browser\r\nmigrateWarnProp( jQuery, \"browser\", jQuery.browser, \"jQuery.browser is deprecated\" );\r\n\r\njQuery.sub = function() {\r\n\tfunction jQuerySub( selector, context ) {\r\n\t\treturn new jQuerySub.fn.init( selector, context );\r\n\t}\r\n\tjQuery.extend( true, jQuerySub, this );\r\n\tjQuerySub.superclass = this;\r\n\tjQuerySub.fn = jQuerySub.prototype = this();\r\n\tjQuerySub.fn.constructor = jQuerySub;\r\n\tjQuerySub.sub = this.sub;\r\n\tjQuerySub.fn.init = function init( selector, context ) {\r\n\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\r\n\t\t\tcontext = jQuerySub( context );\r\n\t\t}\r\n\r\n\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\r\n\t};\r\n\tjQuerySub.fn.init.prototype = jQuerySub.fn;\r\n\tvar rootjQuerySub = jQuerySub(document);\r\n\tmigrateWarn( \"jQuery.sub() is deprecated\" );\r\n\treturn jQuerySub;\r\n};\r\n\r\n\r\n// Ensure that $.ajax gets the new parseJSON defined in core.js\r\njQuery.ajaxSetup({\r\n\tconverters: {\r\n\t\t\"text json\": jQuery.parseJSON\r\n\t}\r\n});\r\n\r\n\r\nvar oldFnData = jQuery.fn.data;\r\n\r\njQuery.fn.data = function( name ) {\r\n\tvar ret, evt,\r\n\t\telem = this[0];\r\n\r\n\t// Handles 1.7 which has this behavior and 1.8 which doesn't\r\n\tif ( elem && name === \"events\" && arguments.length === 1 ) {\r\n\t\tret = jQuery.data( elem, name );\r\n\t\tevt = jQuery._data( elem, name );\r\n\t\tif ( ( ret === undefined || ret === evt ) && evt !== undefined ) {\r\n\t\t\tmigrateWarn(\"Use of jQuery.fn.data('events') is deprecated\");\r\n\t\t\treturn evt;\r\n\t\t}\r\n\t}\r\n\treturn oldFnData.apply( this, arguments );\r\n};\r\n\r\n\r\nvar rscriptType = /\\/(java|ecma)script/i,\r\n\toldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;\r\n\r\njQuery.fn.andSelf = function() {\r\n\tmigrateWarn(\"jQuery.fn.andSelf() replaced by jQuery.fn.addBack()\");\r\n\treturn oldSelf.apply( this, arguments );\r\n};\r\n\r\n// Since jQuery.clean is used internally on older versions, we only shim if it's missing\r\nif ( !jQuery.clean ) {\r\n\tjQuery.clean = function( elems, context, fragment, scripts ) {\r\n\t\t// Set context per 1.8 logic\r\n\t\tcontext = context || document;\r\n\t\tcontext = !context.nodeType && context[0] || context;\r\n\t\tcontext = context.ownerDocument || context;\r\n\r\n\t\tmigrateWarn(\"jQuery.clean() is deprecated\");\r\n\r\n\t\tvar i, elem, handleScript, jsTags,\r\n\t\t\tret = [];\r\n\r\n\t\tjQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );\r\n\r\n\t\t// Complex logic lifted directly from jQuery 1.8\r\n\t\tif ( fragment ) {\r\n\t\t\t// Special handling of each script element\r\n\t\t\thandleScript = function( elem ) {\r\n\t\t\t\t// Check if we consider it executable\r\n\t\t\t\tif ( !elem.type || rscriptType.test( elem.type ) ) {\r\n\t\t\t\t\t// Detach the script and store it in the scripts array (if provided) or the fragment\r\n\t\t\t\t\t// Return truthy to indicate that it has been handled\r\n\t\t\t\t\treturn scripts ?\r\n\t\t\t\t\t\tscripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :\r\n\t\t\t\t\t\tfragment.appendChild( elem );\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tfor ( i = 0; (elem = ret[i]) != null; i++ ) {\r\n\t\t\t\t// Check if we're done after handling an executable script\r\n\t\t\t\tif ( !( jQuery.nodeName( elem, \"script\" ) && handleScript( elem ) ) ) {\r\n\t\t\t\t\t// Append to fragment and handle embedded scripts\r\n\t\t\t\t\tfragment.appendChild( elem );\r\n\t\t\t\t\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\r\n\t\t\t\t\t\t// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration\r\n\t\t\t\t\t\tjsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName(\"script\") ), handleScript );\r\n\r\n\t\t\t\t\t\t// Splice the scripts into ret after their former ancestor and advance our index beyond them\r\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\r\n\t\t\t\t\t\ti += jsTags.length;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t};\r\n}\r\n\r\nvar eventAdd = jQuery.event.add,\r\n\teventRemove = jQuery.event.remove,\r\n\teventTrigger = jQuery.event.trigger,\r\n\toldToggle = jQuery.fn.toggle,\r\n\toldLive = jQuery.fn.live,\r\n\toldDie = jQuery.fn.die,\r\n\tajaxEvents = \"ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess\",\r\n\trajaxEvent = new RegExp( \"\\\\b(?:\" + ajaxEvents + \")\\\\b\" ),\r\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+|)\\b/,\r\n\thoverHack = function( events ) {\r\n\t\tif ( typeof( events ) !== \"string\" || jQuery.event.special.hover ) {\r\n\t\t\treturn events;\r\n\t\t}\r\n\t\tif ( rhoverHack.test( events ) ) {\r\n\t\t\tmigrateWarn(\"'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'\");\r\n\t\t}\r\n\t\treturn events && events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\r\n\t};\r\n\r\n// Event props removed in 1.9, put them back if needed; no practical way to warn them\r\nif ( jQuery.event.props && jQuery.event.props[ 0 ] !== \"attrChange\" ) {\r\n\tjQuery.event.props.unshift( \"attrChange\", \"attrName\", \"relatedNode\", \"srcElement\" );\r\n}\r\n\r\n// Undocumented jQuery.event.handle was \"deprecated\" in jQuery 1.7\r\nif ( jQuery.event.dispatch ) {\r\n\tmigrateWarnProp( jQuery.event, \"handle\", jQuery.event.dispatch, \"jQuery.event.handle is undocumented and deprecated\" );\r\n}\r\n\r\n// Support for 'hover' pseudo-event and ajax event warnings\r\njQuery.event.add = function( elem, types, handler, data, selector ){\r\n\tif ( elem !== document && rajaxEvent.test( types ) ) {\r\n\t\tmigrateWarn( \"AJAX events should be attached to document: \" + types );\r\n\t}\r\n\teventAdd.call( this, elem, hoverHack( types || \"\" ), handler, data, selector );\r\n};\r\njQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){\r\n\teventRemove.call( this, elem, hoverHack( types ) || \"\", handler, selector, mappedTypes );\r\n};\r\n\r\njQuery.fn.error = function() {\r\n\tvar args = Array.prototype.slice.call( arguments, 0);\r\n\tmigrateWarn(\"jQuery.fn.error() is deprecated\");\r\n\targs.splice( 0, 0, \"error\" );\r\n\tif ( arguments.length ) {\r\n\t\treturn this.bind.apply( this, args );\r\n\t}\r\n\t// error event should not bubble to window, although it does pre-1.7\r\n\tthis.triggerHandler.apply( this, args );\r\n\treturn this;\r\n};\r\n\r\njQuery.fn.toggle = function( fn, fn2 ) {\r\n\r\n\t// Don't mess with animation or css toggles\r\n\tif ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {\r\n\t\treturn oldToggle.apply( this, arguments );\r\n\t}\r\n\tmigrateWarn(\"jQuery.fn.toggle(handler, handler...) is deprecated\");\r\n\r\n\t// Save reference to arguments for access in closure\r\n\tvar args = arguments,\r\n\t\tguid = fn.guid || jQuery.guid++,\r\n\t\ti = 0,\r\n\t\ttoggler = function( event ) {\r\n\t\t\t// Figure out which function to execute\r\n\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\r\n\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\r\n\r\n\t\t\t// Make sure that clicks stop\r\n\t\t\tevent.preventDefault();\r\n\r\n\t\t\t// and execute the function\r\n\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\r\n\t\t};\r\n\r\n\t// link all the functions, so any of them can unbind this click handler\r\n\ttoggler.guid = guid;\r\n\twhile ( i < args.length ) {\r\n\t\targs[ i++ ].guid = guid;\r\n\t}\r\n\r\n\treturn this.click( toggler );\r\n};\r\n\r\njQuery.fn.live = function( types, data, fn ) {\r\n\tmigrateWarn(\"jQuery.fn.live() is deprecated\");\r\n\tif ( oldLive ) {\r\n\t\treturn oldLive.apply( this, arguments );\r\n\t}\r\n\tjQuery( this.context ).on( types, this.selector, data, fn );\r\n\treturn this;\r\n};\r\n\r\njQuery.fn.die = function( types, fn ) {\r\n\tmigrateWarn(\"jQuery.fn.die() is deprecated\");\r\n\tif ( oldDie ) {\r\n\t\treturn oldDie.apply( this, arguments );\r\n\t}\r\n\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\r\n\treturn this;\r\n};\r\n\r\n// Turn global events into document-triggered events\r\njQuery.event.trigger = function( event, data, elem, onlyHandlers  ){\r\n\tif ( !elem && !rajaxEvent.test( event ) ) {\r\n\t\tmigrateWarn( \"Global events are undocumented and deprecated\" );\r\n\t}\r\n\treturn eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );\r\n};\r\njQuery.each( ajaxEvents.split(\"|\"),\r\n\tfunction( _, name ) {\r\n\t\tjQuery.event.special[ name ] = {\r\n\t\t\tsetup: function() {\r\n\t\t\t\tvar elem = this;\r\n\r\n\t\t\t\t// The document needs no shimming; must be !== for oldIE\r\n\t\t\t\tif ( elem !== document ) {\r\n\t\t\t\t\tjQuery.event.add( document, name + \".\" + jQuery.guid, function() {\r\n\t\t\t\t\t\tjQuery.event.trigger( name, null, elem, true );\r\n\t\t\t\t\t});\r\n\t\t\t\t\tjQuery._data( this, name, jQuery.guid++ );\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t},\r\n\t\t\tteardown: function() {\r\n\t\t\t\tif ( this !== document ) {\r\n\t\t\t\t\tjQuery.event.remove( document, name + \".\" + jQuery._data( this, name ) );\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n);\r\n\r\n\r\n})( jQuery, window );\r\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery.form.js",
    "content": "/*!\n * jQuery Form Plugin\n * version: 3.37.0-2013.07.11\n * @requires jQuery v1.5 or later\n * Copyright (c) 2013 M. Alsup\n * Examples and documentation at: http://malsup.com/jquery/form/\n * Project repository: https://github.com/malsup/form\n * Dual licensed under the MIT and GPL licenses.\n * https://github.com/malsup/form#copyright-and-license\n */\n/*global ActiveXObject */\n;(function($) {\n\"use strict\";\n\n/*\n    Usage Note:\n    -----------\n    Do not use both ajaxSubmit and ajaxForm on the same form.  These\n    functions are mutually exclusive.  Use ajaxSubmit if you want\n    to bind your own submit handler to the form.  For example,\n\n    $(document).ready(function() {\n        $('#myForm').on('submit', function(e) {\n            e.preventDefault(); // <-- important\n            $(this).ajaxSubmit({\n                target: '#output'\n            });\n        });\n    });\n\n    Use ajaxForm when you want the plugin to manage all the event binding\n    for you.  For example,\n\n    $(document).ready(function() {\n        $('#myForm').ajaxForm({\n            target: '#output'\n        });\n    });\n\n    You can also use ajaxForm with delegation (requires jQuery v1.7+), so the\n    form does not have to exist when you invoke ajaxForm:\n\n    $('#myForm').ajaxForm({\n        delegation: true,\n        target: '#output'\n    });\n\n    When using ajaxForm, the ajaxSubmit function will be invoked for you\n    at the appropriate time.\n*/\n\n/**\n * Feature detection\n */\nvar feature = {};\nfeature.fileapi = $(\"<input type='file'/>\").get(0).files !== undefined;\nfeature.formdata = window.FormData !== undefined;\n\nvar hasProp = !!$.fn.prop;\n\n// attr2 uses prop when it can but checks the return type for\n// an expected string.  this accounts for the case where a form \n// contains inputs with names like \"action\" or \"method\"; in those\n// cases \"prop\" returns the element\n$.fn.attr2 = function() {\n    if ( ! hasProp )\n        return this.attr.apply(this, arguments);\n    var val = this.prop.apply(this, arguments);\n    if ( ( val && val.jquery ) || typeof val === 'string' )\n        return val;\n    return this.attr.apply(this, arguments);\n};\n\n/**\n * ajaxSubmit() provides a mechanism for immediately submitting\n * an HTML form using AJAX.\n */\n$.fn.ajaxSubmit = function(options) {\n    /*jshint scripturl:true */\n\n    // fast fail if nothing selected (http://dev.jquery.com/ticket/2752)\n    if (!this.length) {\n        log('ajaxSubmit: skipping submit process - no element selected');\n        return this;\n    }\n\n    var method, action, url, $form = this;\n\n    if (typeof options == 'function') {\n        options = { success: options };\n    }\n    else if ( options === undefined ) {\n        options = {};\n    }\n\n    method = options.type || this.attr2('method');\n    action = options.url  || this.attr2('action');\n\n    url = (typeof action === 'string') ? $.trim(action) : '';\n    url = url || window.location.href || '';\n    if (url) {\n        // clean url (don't include hash vaue)\n        url = (url.match(/^([^#]+)/)||[])[1];\n    }\n\n    options = $.extend(true, {\n        url:  url,\n        success: $.ajaxSettings.success,\n        type: method || 'GET',\n        iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'\n    }, options);\n\n    // hook for manipulating the form data before it is extracted;\n    // convenient for use with rich editors like tinyMCE or FCKEditor\n    var veto = {};\n    this.trigger('form-pre-serialize', [this, options, veto]);\n    if (veto.veto) {\n        log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');\n        return this;\n    }\n\n    // provide opportunity to alter form data before it is serialized\n    if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {\n        log('ajaxSubmit: submit aborted via beforeSerialize callback');\n        return this;\n    }\n\n    var traditional = options.traditional;\n    if ( traditional === undefined ) {\n        traditional = $.ajaxSettings.traditional;\n    }\n\n    var elements = [];\n    var qx, a = this.formToArray(options.semantic, elements);\n    if (options.data) {\n        options.extraData = options.data;\n        qx = $.param(options.data, traditional);\n    }\n\n    // give pre-submit callback an opportunity to abort the submit\n    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {\n        log('ajaxSubmit: submit aborted via beforeSubmit callback');\n        return this;\n    }\n\n    // fire vetoable 'validate' event\n    this.trigger('form-submit-validate', [a, this, options, veto]);\n    if (veto.veto) {\n        log('ajaxSubmit: submit vetoed via form-submit-validate trigger');\n        return this;\n    }\n\n    var q = $.param(a, traditional);\n    if (qx) {\n        q = ( q ? (q + '&' + qx) : qx );\n    }\n    if (options.type.toUpperCase() == 'GET') {\n        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;\n        options.data = null;  // data is null for 'get'\n    }\n    else {\n        options.data = q; // data is the query string for 'post'\n    }\n\n    var callbacks = [];\n    if (options.resetForm) {\n        callbacks.push(function() { $form.resetForm(); });\n    }\n    if (options.clearForm) {\n        callbacks.push(function() { $form.clearForm(options.includeHidden); });\n    }\n\n    // perform a load on the target only if dataType is not provided\n    if (!options.dataType && options.target) {\n        var oldSuccess = options.success || function(){};\n        callbacks.push(function(data) {\n            var fn = options.replaceTarget ? 'replaceWith' : 'html';\n            $(options.target)[fn](data).each(oldSuccess, arguments);\n        });\n    }\n    else if (options.success) {\n        callbacks.push(options.success);\n    }\n\n    options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg\n        var context = options.context || this ;    // jQuery 1.4+ supports scope context\n        for (var i=0, max=callbacks.length; i < max; i++) {\n            callbacks[i].apply(context, [data, status, xhr || $form, $form]);\n        }\n    };\n\n    if (options.error) {\n        var oldError = options.error;\n        options.error = function(xhr, status, error) {\n            var context = options.context || this;\n            oldError.apply(context, [xhr, status, error, $form]);\n        };\n    }\n\n     if (options.complete) {\n        var oldComplete = options.complete;\n        options.complete = function(xhr, status) {\n            var context = options.context || this;\n            oldComplete.apply(context, [xhr, status, $form]);\n        };\n    }\n\n    // are there files to upload?\n\n    // [value] (issue #113), also see comment:\n    // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219\n    var fileInputs = $('input[type=file]:enabled[value!=\"\"]', this);\n\n    var hasFileInputs = fileInputs.length > 0;\n    var mp = 'multipart/form-data';\n    var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);\n\n    var fileAPI = feature.fileapi && feature.formdata;\n    log(\"fileAPI :\" + fileAPI);\n    var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI;\n\n    var jqxhr;\n\n    // options.iframe allows user to force iframe mode\n    // 06-NOV-09: now defaulting to iframe mode if file input is detected\n    if (options.iframe !== false && (options.iframe || shouldUseFrame)) {\n        // hack to fix Safari hang (thanks to Tim Molendijk for this)\n        // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d\n        if (options.closeKeepAlive) {\n            $.get(options.closeKeepAlive, function() {\n                jqxhr = fileUploadIframe(a);\n            });\n        }\n        else {\n            jqxhr = fileUploadIframe(a);\n        }\n    }\n    else if ((hasFileInputs || multipart) && fileAPI) {\n        jqxhr = fileUploadXhr(a);\n    }\n    else {\n        jqxhr = $.ajax(options);\n    }\n\n    $form.removeData('jqxhr').data('jqxhr', jqxhr);\n\n    // clear element array\n    for (var k=0; k < elements.length; k++)\n        elements[k] = null;\n\n    // fire 'notify' event\n    this.trigger('form-submit-notify', [this, options]);\n    return this;\n\n    // utility fn for deep serialization\n    function deepSerialize(extraData){\n        var serialized = $.param(extraData, options.traditional).split('&');\n        var len = serialized.length;\n        var result = [];\n        var i, part;\n        for (i=0; i < len; i++) {\n            // #252; undo param space replacement\n            serialized[i] = serialized[i].replace(/\\+/g,' ');\n            part = serialized[i].split('=');\n            // #278; use array instead of object storage, favoring array serializations\n            result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]);\n        }\n        return result;\n    }\n\n     // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz)\n    function fileUploadXhr(a) {\n        var formdata = new FormData();\n\n        for (var i=0; i < a.length; i++) {\n            formdata.append(a[i].name, a[i].value);\n        }\n\n        if (options.extraData) {\n            var serializedData = deepSerialize(options.extraData);\n            for (i=0; i < serializedData.length; i++)\n                if (serializedData[i])\n                    formdata.append(serializedData[i][0], serializedData[i][1]);\n        }\n\n        options.data = null;\n\n        var s = $.extend(true, {}, $.ajaxSettings, options, {\n            contentType: false,\n            processData: false,\n            cache: false,\n            type: method || 'POST'\n        });\n\n        if (options.uploadProgress) {\n            // workaround because jqXHR does not expose upload property\n            s.xhr = function() {\n                var xhr = $.ajaxSettings.xhr();\n                if (xhr.upload) {\n                    xhr.upload.addEventListener('progress', function(event) {\n                        var percent = 0;\n                        var position = event.loaded || event.position; /*event.position is deprecated*/\n                        var total = event.total;\n                        if (event.lengthComputable) {\n                            percent = Math.ceil(position / total * 100);\n                        }\n                        options.uploadProgress(event, position, total, percent);\n                    }, false);\n                }\n                return xhr;\n            };\n        }\n\n        s.data = null;\n            var beforeSend = s.beforeSend;\n            s.beforeSend = function(xhr, o) {\n                o.data = formdata;\n                if(beforeSend)\n                    beforeSend.call(this, xhr, o);\n        };\n        return $.ajax(s);\n    }\n\n    // private function for handling file uploads (hat tip to YAHOO!)\n    function fileUploadIframe(a) {\n        var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;\n        var deferred = $.Deferred();\n\n        if (a) {\n            // ensure that every serialized input is still enabled\n            for (i=0; i < elements.length; i++) {\n                el = $(elements[i]);\n                if ( hasProp )\n                    el.prop('disabled', false);\n                else\n                    el.removeAttr('disabled');\n            }\n        }\n\n        s = $.extend(true, {}, $.ajaxSettings, options);\n        s.context = s.context || s;\n        id = 'jqFormIO' + (new Date().getTime());\n        if (s.iframeTarget) {\n            $io = $(s.iframeTarget);\n            n = $io.attr2('name');\n            if (!n)\n                 $io.attr2('name', id);\n            else\n                id = n;\n        }\n        else {\n            $io = $('<iframe name=\"' + id + '\" src=\"'+ s.iframeSrc +'\" />');\n            $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });\n        }\n        io = $io[0];\n\n\n        xhr = { // mock object\n            aborted: 0,\n            responseText: null,\n            responseXML: null,\n            status: 0,\n            statusText: 'n/a',\n            getAllResponseHeaders: function() {},\n            getResponseHeader: function() {},\n            setRequestHeader: function() {},\n            abort: function(status) {\n                var e = (status === 'timeout' ? 'timeout' : 'aborted');\n                log('aborting upload... ' + e);\n                this.aborted = 1;\n\n                try { // #214, #257\n                    if (io.contentWindow.document.execCommand) {\n                        io.contentWindow.document.execCommand('Stop');\n                    }\n                }\n                catch(ignore) {}\n\n                $io.attr('src', s.iframeSrc); // abort op in progress\n                xhr.error = e;\n                if (s.error)\n                    s.error.call(s.context, xhr, e, status);\n                if (g)\n                    $.event.trigger(\"ajaxError\", [xhr, s, e]);\n                if (s.complete)\n                    s.complete.call(s.context, xhr, e);\n            }\n        };\n\n        g = s.global;\n        // trigger ajax global events so that activity/block indicators work like normal\n        if (g && 0 === $.active++) {\n            $.event.trigger(\"ajaxStart\");\n        }\n        if (g) {\n            $.event.trigger(\"ajaxSend\", [xhr, s]);\n        }\n\n        if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {\n            if (s.global) {\n                $.active--;\n            }\n            deferred.reject();\n            return deferred;\n        }\n        if (xhr.aborted) {\n            deferred.reject();\n            return deferred;\n        }\n\n        // add submitting element to data if we know it\n        sub = form.clk;\n        if (sub) {\n            n = sub.name;\n            if (n && !sub.disabled) {\n                s.extraData = s.extraData || {};\n                s.extraData[n] = sub.value;\n                if (sub.type == \"image\") {\n                    s.extraData[n+'.x'] = form.clk_x;\n                    s.extraData[n+'.y'] = form.clk_y;\n                }\n            }\n        }\n\n        var CLIENT_TIMEOUT_ABORT = 1;\n        var SERVER_ABORT = 2;\n                \n        function getDoc(frame) {\n            /* it looks like contentWindow or contentDocument do not\n             * carry the protocol property in ie8, when running under ssl\n             * frame.document is the only valid response document, since\n             * the protocol is know but not on the other two objects. strange?\n             * \"Same origin policy\" http://en.wikipedia.org/wiki/Same_origin_policy\n             */\n            \n            var doc = null;\n            \n            // IE8 cascading access check\n            try {\n                if (frame.contentWindow) {\n                    doc = frame.contentWindow.document;\n                }\n            } catch(err) {\n                // IE8 access denied under ssl & missing protocol\n                log('cannot get iframe.contentWindow document: ' + err);\n            }\n\n            if (doc) { // successful getting content\n                return doc;\n            }\n\n            try { // simply checking may throw in ie8 under ssl or mismatched protocol\n                doc = frame.contentDocument ? frame.contentDocument : frame.document;\n            } catch(err) {\n                // last attempt\n                log('cannot get iframe.contentDocument: ' + err);\n                doc = frame.document;\n            }\n            return doc;\n        }\n\n        // Rails CSRF hack (thanks to Yvan Barthelemy)\n        var csrf_token = $('meta[name=csrf-token]').attr('content');\n        var csrf_param = $('meta[name=csrf-param]').attr('content');\n        if (csrf_param && csrf_token) {\n            s.extraData = s.extraData || {};\n            s.extraData[csrf_param] = csrf_token;\n        }\n\n        // take a breath so that pending repaints get some cpu time before the upload starts\n        function doSubmit() {\n            // make sure form attrs are set\n            var t = $form.attr2('target'), a = $form.attr2('action');\n\n            // update form attrs in IE friendly way\n            form.setAttribute('target',id);\n            if (!method) {\n                form.setAttribute('method', 'POST');\n            }\n            if (a != s.url) {\n                form.setAttribute('action', s.url);\n            }\n\n            // ie borks in some cases when setting encoding\n            if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {\n                $form.attr({\n                    encoding: 'multipart/form-data',\n                    enctype:  'multipart/form-data'\n                });\n            }\n\n            // support timout\n            if (s.timeout) {\n                timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);\n            }\n\n            // look for server aborts\n            function checkState() {\n                try {\n                    var state = getDoc(io).readyState;\n                    log('state = ' + state);\n                    if (state && state.toLowerCase() == 'uninitialized')\n                        setTimeout(checkState,50);\n                }\n                catch(e) {\n                    log('Server abort: ' , e, ' (', e.name, ')');\n                    cb(SERVER_ABORT);\n                    if (timeoutHandle)\n                        clearTimeout(timeoutHandle);\n                    timeoutHandle = undefined;\n                }\n            }\n\n            // add \"extra\" data to form if provided in options\n            var extraInputs = [];\n            try {\n                if (s.extraData) {\n                    for (var n in s.extraData) {\n                        if (s.extraData.hasOwnProperty(n)) {\n                           // if using the $.param format that allows for multiple values with the same name\n                           if($.isPlainObject(s.extraData[n]) && s.extraData[n].hasOwnProperty('name') && s.extraData[n].hasOwnProperty('value')) {\n                               extraInputs.push(\n                               $('<input type=\"hidden\" name=\"'+s.extraData[n].name+'\">').val(s.extraData[n].value)\n                                   .appendTo(form)[0]);\n                           } else {\n                               extraInputs.push(\n                               $('<input type=\"hidden\" name=\"'+n+'\">').val(s.extraData[n])\n                                   .appendTo(form)[0]);\n                           }\n                        }\n                    }\n                }\n\n                if (!s.iframeTarget) {\n                    // add iframe to doc and submit the form\n                    $io.appendTo('body');\n                    if (io.attachEvent)\n                        io.attachEvent('onload', cb);\n                    else\n                        io.addEventListener('load', cb, false);\n                }\n                setTimeout(checkState,15);\n\n                try {\n                    form.submit();\n                } catch(err) {\n                    // just in case form has element with name/id of 'submit'\n                    var submitFn = document.createElement('form').submit;\n                    submitFn.apply(form);\n                }\n            }\n            finally {\n                // reset attrs and remove \"extra\" input elements\n                form.setAttribute('action',a);\n                if(t) {\n                    form.setAttribute('target', t);\n                } else {\n                    $form.removeAttr('target');\n                }\n                $(extraInputs).remove();\n            }\n        }\n\n        if (s.forceSync) {\n            doSubmit();\n        }\n        else {\n            setTimeout(doSubmit, 10); // this lets dom updates render\n        }\n\n        var data, doc, domCheckCount = 50, callbackProcessed;\n\n        function cb(e) {\n            if (xhr.aborted || callbackProcessed) {\n                return;\n            }\n            \n            doc = getDoc(io);\n            if(!doc) {\n                log('cannot access response document');\n                e = SERVER_ABORT;\n            }\n            if (e === CLIENT_TIMEOUT_ABORT && xhr) {\n                xhr.abort('timeout');\n                deferred.reject(xhr, 'timeout');\n                return;\n            }\n            else if (e == SERVER_ABORT && xhr) {\n                xhr.abort('server abort');\n                deferred.reject(xhr, 'error', 'server abort');\n                return;\n            }\n\n            if (!doc || doc.location.href == s.iframeSrc) {\n                // response not received yet\n                if (!timedOut)\n                    return;\n            }\n            if (io.detachEvent)\n                io.detachEvent('onload', cb);\n            else\n                io.removeEventListener('load', cb, false);\n\n            var status = 'success', errMsg;\n            try {\n                if (timedOut) {\n                    throw 'timeout';\n                }\n\n                var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);\n                log('isXml='+isXml);\n                if (!isXml && window.opera && (doc.body === null || !doc.body.innerHTML)) {\n                    if (--domCheckCount) {\n                        // in some browsers (Opera) the iframe DOM is not always traversable when\n                        // the onload callback fires, so we loop a bit to accommodate\n                        log('requeing onLoad callback, DOM not available');\n                        setTimeout(cb, 250);\n                        return;\n                    }\n                    // let this fall through because server response could be an empty document\n                    //log('Could not access iframe DOM after mutiple tries.');\n                    //throw 'DOMException: not available';\n                }\n\n                //log('response detected');\n                var docRoot = doc.body ? doc.body : doc.documentElement;\n                xhr.responseText = docRoot ? docRoot.innerHTML : null;\n                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;\n                if (isXml)\n                    s.dataType = 'xml';\n                xhr.getResponseHeader = function(header){\n                    var headers = {'content-type': s.dataType};\n                    return headers[header];\n                };\n                // support for XHR 'status' & 'statusText' emulation :\n                if (docRoot) {\n                    xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;\n                    xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;\n                }\n\n                var dt = (s.dataType || '').toLowerCase();\n                var scr = /(json|script|text)/.test(dt);\n                if (scr || s.textarea) {\n                    // see if user embedded response in textarea\n                    var ta = doc.getElementsByTagName('textarea')[0];\n                    if (ta) {\n                        xhr.responseText = ta.value;\n                        // support for XHR 'status' & 'statusText' emulation :\n                        xhr.status = Number( ta.getAttribute('status') ) || xhr.status;\n                        xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;\n                    }\n                    else if (scr) {\n                        // account for browsers injecting pre around json response\n                        var pre = doc.getElementsByTagName('pre')[0];\n                        var b = doc.getElementsByTagName('body')[0];\n                        if (pre) {\n                            xhr.responseText = pre.textContent ? pre.textContent : pre.innerText;\n                        }\n                        else if (b) {\n                            xhr.responseText = b.textContent ? b.textContent : b.innerText;\n                        }\n                    }\n                }\n                else if (dt == 'xml' && !xhr.responseXML && xhr.responseText) {\n                    xhr.responseXML = toXml(xhr.responseText);\n                }\n\n                try {\n                    data = httpData(xhr, dt, s);\n                }\n                catch (err) {\n                    status = 'parsererror';\n                    xhr.error = errMsg = (err || status);\n                }\n            }\n            catch (err) {\n                log('error caught: ',err);\n                status = 'error';\n                xhr.error = errMsg = (err || status);\n            }\n\n            if (xhr.aborted) {\n                log('upload aborted');\n                status = null;\n            }\n\n            if (xhr.status) { // we've set xhr.status\n                status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';\n            }\n\n            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it\n            if (status === 'success') {\n                if (s.success)\n                    s.success.call(s.context, data, 'success', xhr);\n                deferred.resolve(xhr.responseText, 'success', xhr);\n                if (g)\n                    $.event.trigger(\"ajaxSuccess\", [xhr, s]);\n            }\n            else if (status) {\n                if (errMsg === undefined)\n                    errMsg = xhr.statusText;\n                if (s.error)\n                    s.error.call(s.context, xhr, status, errMsg);\n                deferred.reject(xhr, 'error', errMsg);\n                if (g)\n                    $.event.trigger(\"ajaxError\", [xhr, s, errMsg]);\n            }\n\n            if (g)\n                $.event.trigger(\"ajaxComplete\", [xhr, s]);\n\n            if (g && ! --$.active) {\n                $.event.trigger(\"ajaxStop\");\n            }\n\n            if (s.complete)\n                s.complete.call(s.context, xhr, status);\n\n            callbackProcessed = true;\n            if (s.timeout)\n                clearTimeout(timeoutHandle);\n\n            // clean up\n            setTimeout(function() {\n                if (!s.iframeTarget)\n                    $io.remove();\n                xhr.responseXML = null;\n            }, 100);\n        }\n\n        var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)\n            if (window.ActiveXObject) {\n                doc = new ActiveXObject('Microsoft.XMLDOM');\n                doc.async = 'false';\n                doc.loadXML(s);\n            }\n            else {\n                doc = (new DOMParser()).parseFromString(s, 'text/xml');\n            }\n            return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;\n        };\n        var parseJSON = $.parseJSON || function(s) {\n            /*jslint evil:true */\n            return window['eval']('(' + s + ')');\n        };\n\n        var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4\n\n            var ct = xhr.getResponseHeader('content-type') || '',\n                xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,\n                data = xml ? xhr.responseXML : xhr.responseText;\n\n            if (xml && data.documentElement.nodeName === 'parsererror') {\n                if ($.error)\n                    $.error('parsererror');\n            }\n            if (s && s.dataFilter) {\n                data = s.dataFilter(data, type);\n            }\n            if (typeof data === 'string') {\n                if (type === 'json' || !type && ct.indexOf('json') >= 0) {\n                    data = parseJSON(data);\n                } else if (type === \"script\" || !type && ct.indexOf(\"javascript\") >= 0) {\n                    $.globalEval(data);\n                }\n            }\n            return data;\n        };\n\n        return deferred;\n    }\n};\n\n/**\n * ajaxForm() provides a mechanism for fully automating form submission.\n *\n * The advantages of using this method instead of ajaxSubmit() are:\n *\n * 1: This method will include coordinates for <input type=\"image\" /> elements (if the element\n *    is used to submit the form).\n * 2. This method will include the submit element's name/value data (for the element that was\n *    used to submit the form).\n * 3. This method binds the submit() method to the form for you.\n *\n * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely\n * passes the options argument along after properly binding events for submit elements and\n * the form itself.\n */\n$.fn.ajaxForm = function(options) {\n    options = options || {};\n    options.delegation = options.delegation && $.isFunction($.fn.on);\n\n    // in jQuery 1.3+ we can fix mistakes with the ready state\n    if (!options.delegation && this.length === 0) {\n        var o = { s: this.selector, c: this.context };\n        if (!$.isReady && o.s) {\n            log('DOM not ready, queuing ajaxForm');\n            $(function() {\n                $(o.s,o.c).ajaxForm(options);\n            });\n            return this;\n        }\n        // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()\n        log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));\n        return this;\n    }\n\n    if ( options.delegation ) {\n        $(document)\n            .off('submit.form-plugin', this.selector, doAjaxSubmit)\n            .off('click.form-plugin', this.selector, captureSubmittingElement)\n            .on('submit.form-plugin', this.selector, options, doAjaxSubmit)\n            .on('click.form-plugin', this.selector, options, captureSubmittingElement);\n        return this;\n    }\n\n    return this.ajaxFormUnbind()\n        .bind('submit.form-plugin', options, doAjaxSubmit)\n        .bind('click.form-plugin', options, captureSubmittingElement);\n};\n\n// private event handlers\nfunction doAjaxSubmit(e) {\n    /*jshint validthis:true */\n    var options = e.data;\n    if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed\n        e.preventDefault();\n        $(this).ajaxSubmit(options);\n    }\n}\n\nfunction captureSubmittingElement(e) {\n    /*jshint validthis:true */\n    var target = e.target;\n    var $el = $(target);\n    if (!($el.is(\"[type=submit],[type=image]\"))) {\n        // is this a child element of the submit el?  (ex: a span within a button)\n        var t = $el.closest('[type=submit]');\n        if (t.length === 0) {\n            return;\n        }\n        target = t[0];\n    }\n    var form = this;\n    form.clk = target;\n    if (target.type == 'image') {\n        if (e.offsetX !== undefined) {\n            form.clk_x = e.offsetX;\n            form.clk_y = e.offsetY;\n        } else if (typeof $.fn.offset == 'function') {\n            var offset = $el.offset();\n            form.clk_x = e.pageX - offset.left;\n            form.clk_y = e.pageY - offset.top;\n        } else {\n            form.clk_x = e.pageX - target.offsetLeft;\n            form.clk_y = e.pageY - target.offsetTop;\n        }\n    }\n    // clear form vars\n    setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);\n}\n\n\n// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm\n$.fn.ajaxFormUnbind = function() {\n    return this.unbind('submit.form-plugin click.form-plugin');\n};\n\n/**\n * formToArray() gathers form element data into an array of objects that can\n * be passed to any of the following ajax functions: $.get, $.post, or load.\n * Each object in the array has both a 'name' and 'value' property.  An example of\n * an array for a simple login form might be:\n *\n * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]\n *\n * It is this array that is passed to pre-submit callback functions provided to the\n * ajaxSubmit() and ajaxForm() methods.\n */\n$.fn.formToArray = function(semantic, elements) {\n    var a = [];\n    if (this.length === 0) {\n        return a;\n    }\n\n    var form = this[0];\n    var els = semantic ? form.getElementsByTagName('*') : form.elements;\n    if (!els) {\n        return a;\n    }\n\n    var i,j,n,v,el,max,jmax;\n    for(i=0, max=els.length; i < max; i++) {\n        el = els[i];\n        n = el.name;\n        if (!n || el.disabled) {\n            continue;\n        }\n\n        if (semantic && form.clk && el.type == \"image\") {\n            // handle image inputs on the fly when semantic == true\n            if(form.clk == el) {\n                a.push({name: n, value: $(el).val(), type: el.type });\n                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});\n            }\n            continue;\n        }\n\n        v = $.fieldValue(el, true);\n        if (v && v.constructor == Array) {\n            if (elements)\n                elements.push(el);\n            for(j=0, jmax=v.length; j < jmax; j++) {\n                a.push({name: n, value: v[j]});\n            }\n        }\n        else if (feature.fileapi && el.type == 'file') {\n            if (elements)\n                elements.push(el);\n            var files = el.files;\n            if (files.length) {\n                for (j=0; j < files.length; j++) {\n                    a.push({name: n, value: files[j], type: el.type});\n                }\n            }\n            else {\n                // #180\n                a.push({ name: n, value: '', type: el.type });\n            }\n        }\n        else if (v !== null && typeof v != 'undefined') {\n            if (elements)\n                elements.push(el);\n            a.push({name: n, value: v, type: el.type, required: el.required});\n        }\n    }\n\n    if (!semantic && form.clk) {\n        // input type=='image' are not found in elements array! handle it here\n        var $input = $(form.clk), input = $input[0];\n        n = input.name;\n        if (n && !input.disabled && input.type == 'image') {\n            a.push({name: n, value: $input.val()});\n            a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});\n        }\n    }\n    return a;\n};\n\n/**\n * Serializes form data into a 'submittable' string. This method will return a string\n * in the format: name1=value1&amp;name2=value2\n */\n$.fn.formSerialize = function(semantic) {\n    //hand off to jQuery.param for proper encoding\n    return $.param(this.formToArray(semantic));\n};\n\n/**\n * Serializes all field elements in the jQuery object into a query string.\n * This method will return a string in the format: name1=value1&amp;name2=value2\n */\n$.fn.fieldSerialize = function(successful) {\n    var a = [];\n    this.each(function() {\n        var n = this.name;\n        if (!n) {\n            return;\n        }\n        var v = $.fieldValue(this, successful);\n        if (v && v.constructor == Array) {\n            for (var i=0,max=v.length; i < max; i++) {\n                a.push({name: n, value: v[i]});\n            }\n        }\n        else if (v !== null && typeof v != 'undefined') {\n            a.push({name: this.name, value: v});\n        }\n    });\n    //hand off to jQuery.param for proper encoding\n    return $.param(a);\n};\n\n/**\n * Returns the value(s) of the element in the matched set.  For example, consider the following form:\n *\n *  <form><fieldset>\n *      <input name=\"A\" type=\"text\" />\n *      <input name=\"A\" type=\"text\" />\n *      <input name=\"B\" type=\"checkbox\" value=\"B1\" />\n *      <input name=\"B\" type=\"checkbox\" value=\"B2\"/>\n *      <input name=\"C\" type=\"radio\" value=\"C1\" />\n *      <input name=\"C\" type=\"radio\" value=\"C2\" />\n *  </fieldset></form>\n *\n *  var v = $('input[type=text]').fieldValue();\n *  // if no values are entered into the text inputs\n *  v == ['','']\n *  // if values entered into the text inputs are 'foo' and 'bar'\n *  v == ['foo','bar']\n *\n *  var v = $('input[type=checkbox]').fieldValue();\n *  // if neither checkbox is checked\n *  v === undefined\n *  // if both checkboxes are checked\n *  v == ['B1', 'B2']\n *\n *  var v = $('input[type=radio]').fieldValue();\n *  // if neither radio is checked\n *  v === undefined\n *  // if first radio is checked\n *  v == ['C1']\n *\n * The successful argument controls whether or not the field element must be 'successful'\n * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).\n * The default value of the successful argument is true.  If this value is false the value(s)\n * for each element is returned.\n *\n * Note: This method *always* returns an array.  If no valid value can be determined the\n *    array will be empty, otherwise it will contain one or more values.\n */\n$.fn.fieldValue = function(successful) {\n    for (var val=[], i=0, max=this.length; i < max; i++) {\n        var el = this[i];\n        var v = $.fieldValue(el, successful);\n        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {\n            continue;\n        }\n        if (v.constructor == Array)\n            $.merge(val, v);\n        else\n            val.push(v);\n    }\n    return val;\n};\n\n/**\n * Returns the value of the field element.\n */\n$.fieldValue = function(el, successful) {\n    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();\n    if (successful === undefined) {\n        successful = true;\n    }\n\n    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||\n        (t == 'checkbox' || t == 'radio') && !el.checked ||\n        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||\n        tag == 'select' && el.selectedIndex == -1)) {\n            return null;\n    }\n\n    if (tag == 'select') {\n        var index = el.selectedIndex;\n        if (index < 0) {\n            return null;\n        }\n        var a = [], ops = el.options;\n        var one = (t == 'select-one');\n        var max = (one ? index+1 : ops.length);\n        for(var i=(one ? index : 0); i < max; i++) {\n            var op = ops[i];\n            if (op.selected) {\n                var v = op.value;\n                if (!v) { // extra pain for IE...\n                    v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;\n                }\n                if (one) {\n                    return v;\n                }\n                a.push(v);\n            }\n        }\n        return a;\n    }\n    return $(el).val();\n};\n\n/**\n * Clears the form data.  Takes the following actions on the form's input fields:\n *  - input text fields will have their 'value' property set to the empty string\n *  - select elements will have their 'selectedIndex' property set to -1\n *  - checkbox and radio inputs will have their 'checked' property set to false\n *  - inputs of type submit, button, reset, and hidden will *not* be effected\n *  - button elements will *not* be effected\n */\n$.fn.clearForm = function(includeHidden) {\n    return this.each(function() {\n        $('input,select,textarea', this).clearFields(includeHidden);\n    });\n};\n\n/**\n * Clears the selected form elements.\n */\n$.fn.clearFields = $.fn.clearInputs = function(includeHidden) {\n    var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list\n    return this.each(function() {\n        var t = this.type, tag = this.tagName.toLowerCase();\n        if (re.test(t) || tag == 'textarea') {\n            this.value = '';\n        }\n        else if (t == 'checkbox' || t == 'radio') {\n            this.checked = false;\n        }\n        else if (tag == 'select') {\n            this.selectedIndex = -1;\n        }\n\t\telse if (t == \"file\") {\n\t\t\tif (/MSIE/.test(navigator.userAgent)) {\n\t\t\t\t$(this).replaceWith($(this).clone(true));\n\t\t\t} else {\n\t\t\t\t$(this).val('');\n\t\t\t}\n\t\t}\n        else if (includeHidden) {\n            // includeHidden can be the value true, or it can be a selector string\n            // indicating a special test; for example:\n            //  $('#myForm').clearForm('.special:hidden')\n            // the above would clean hidden inputs that have the class of 'special'\n            if ( (includeHidden === true && /hidden/.test(t)) ||\n                 (typeof includeHidden == 'string' && $(this).is(includeHidden)) )\n                this.value = '';\n        }\n    });\n};\n\n/**\n * Resets the form data.  Causes all form elements to be reset to their original value.\n */\n$.fn.resetForm = function() {\n    return this.each(function() {\n        // guard against an input with the name of 'reset'\n        // note that IE reports the reset function as an 'object'\n        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {\n            this.reset();\n        }\n    });\n};\n\n/**\n * Enables or disables any matching elements.\n */\n$.fn.enable = function(b) {\n    if (b === undefined) {\n        b = true;\n    }\n    return this.each(function() {\n        this.disabled = !b;\n    });\n};\n\n/**\n * Checks/unchecks any matching checkboxes or radio buttons and\n * selects/deselects and matching option elements.\n */\n$.fn.selected = function(select) {\n    if (select === undefined) {\n        select = true;\n    }\n    return this.each(function() {\n        var t = this.type;\n        if (t == 'checkbox' || t == 'radio') {\n            this.checked = select;\n        }\n        else if (this.tagName.toLowerCase() == 'option') {\n            var $sel = $(this).parent('select');\n            if (select && $sel[0] && $sel[0].type == 'select-one') {\n                // deselect all other options\n                $sel.find('option').selected(false);\n            }\n            this.selected = select;\n        }\n    });\n};\n\n// expose debug var\n$.fn.ajaxSubmit.debug = false;\n\n// helper fn for console logging\nfunction log() {\n    if (!$.fn.ajaxSubmit.debug)\n        return;\n    var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');\n    if (window.console && window.console.log) {\n        window.console.log(msg);\n    }\n    else if (window.opera && window.opera.postError) {\n        window.opera.postError(msg);\n    }\n}\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery.hotkeys.js",
    "content": "/******************************************************************************************************************************\n\n * @ Original idea by by Binny V A, Original version: 2.00.A\n * @ http://www.openjs.com/scripts/events/keyboard_shortcuts/\n * @ Original License : BSD\n\n * @ jQuery Plugin by Tzury Bar Yochay\n        mail: tzury.by@gmail.com\n        blog: evalinux.wordpress.com\n        face: facebook.com/profile.php?id=513676303\n\n        (c) Copyrights 2007\n\n * @ jQuery Plugin version Beta (0.0.2)\n * @ License: jQuery-License.\n\nTODO:\n    add queue support (as in gmail) e.g. 'x' then 'y', etc.\n    add mouse + mouse wheel events.\n\nUSAGE:\n    $.hotkeys.add('Ctrl+c', function(){ alert('copy anyone?');});\n    $.hotkeys.add('Ctrl+c', {target:'div#editor', type:'keyup', propagate: true},function(){ alert('copy anyone?');});>\n    $.hotkeys.remove('Ctrl+c');\n    $.hotkeys.remove('Ctrl+c', {target:'div#editor', type:'keypress'});\n\n******************************************************************************************************************************/\n(function (jQuery){\n    this.version = '(beta)(0.0.3)';\n\tthis.all = {};\n    this.special_keys = {\n        27: 'esc', 9: 'tab', 32:'space', 13: 'return', 8:'backspace', 145: 'scroll', 20: 'capslock',\n        144: 'numlock', 19:'pause', 45:'insert', 36:'home', 46:'del',35:'end', 33: 'pageup',\n        34:'pagedown', 37:'left', 38:'up', 39:'right',40:'down', 112:'f1',113:'f2', 114:'f3',\n        115:'f4', 116:'f5', 117:'f6', 118:'f7', 119:'f8', 120:'f9', 121:'f10', 122:'f11', 123:'f12'};\n\n    this.shift_nums = { \"`\":\"~\", \"1\":\"!\", \"2\":\"@\", \"3\":\"#\", \"4\":\"$\", \"5\":\"%\", \"6\":\"^\", \"7\":\"&\",\n        \"8\":\"*\", \"9\":\"(\", \"0\":\")\", \"-\":\"_\", \"=\":\"+\", \";\":\":\", \"'\":\"\\\"\", \",\":\"<\",\n        \".\":\">\",  \"/\":\"?\",  \"\\\\\":\"|\" };\n\n    this.add = function(combi, options, callback) {\n        if (jQuery.isFunction(options)){\n            callback = options;\n            options = {};\n        }\n        var opt = {},\n            defaults = {type: 'keydown', propagate: false, disableInInput: false, target: jQuery('html')[0]},\n            that = this;\n        opt = jQuery.extend( opt , defaults, options || {} );\n        combi = combi.toLowerCase();\n\n        // inspect if keystroke matches\n        var inspector = function(event) {\n            // WP: not needed with newer jQuery\n            // event = jQuery.event.fix(event); // jQuery event normalization.\n            var element = event.target;\n            // @ TextNode -> nodeType == 3\n            // WP: not needed with newer jQuery\n            // element = (element.nodeType==3) ? element.parentNode : element;\n\n            if ( opt['disableInInput'] ) { // Disable shortcut keys in Input, Textarea fields\n                var target = jQuery(element);\n\n\t\t\t\tif ( ( target.is('input') || target.is('textarea') ) &&\n\t\t\t\t\t( ! opt.noDisable || ! target.is( opt.noDisable ) ) ) {\n\n\t\t\t\t\treturn;\n                }\n            }\n            var code = event.which,\n                type = event.type,\n                character = String.fromCharCode(code).toLowerCase(),\n                special = that.special_keys[code],\n                shift = event.shiftKey,\n                ctrl = event.ctrlKey,\n                alt= event.altKey,\n                meta = event.metaKey,\n                propagate = true, // default behaivour\n                mapPoint = null;\n\n            // in opera + safari, the event.target is unpredictable.\n            // for example: 'keydown' might be associated with HtmlBodyElement\n            // or the element where you last clicked with your mouse.\n            // WP: needed for all browsers\n            // if (jQuery.browser.opera || jQuery.browser.safari){\n                while (!that.all[element] && element.parentNode){\n                    element = element.parentNode;\n                }\n            // }\n            var cbMap = that.all[element].events[type].callbackMap;\n            if(!shift && !ctrl && !alt && !meta) { // No Modifiers\n                mapPoint = cbMap[special] ||  cbMap[character]\n\t\t\t}\n            // deals with combinaitons (alt|ctrl|shift+anything)\n            else{\n                var modif = '';\n                if(alt) modif +='alt+';\n                if(ctrl) modif+= 'ctrl+';\n                if(shift) modif += 'shift+';\n                if(meta) modif += 'meta+';\n                // modifiers + special keys or modifiers + characters or modifiers + shift characters\n                mapPoint = cbMap[modif+special] || cbMap[modif+character] || cbMap[modif+that.shift_nums[character]]\n            }\n            if (mapPoint){\n                mapPoint.cb(event);\n                if(!mapPoint.propagate) {\n                    event.stopPropagation();\n                    event.preventDefault();\n                    return false;\n                }\n            }\n\t\t};\n        // first hook for this element\n        if (!this.all[opt.target]){\n            this.all[opt.target] = {events:{}};\n        }\n        if (!this.all[opt.target].events[opt.type]){\n            this.all[opt.target].events[opt.type] = {callbackMap: {}}\n            jQuery.event.add(opt.target, opt.type, inspector);\n        }\n        this.all[opt.target].events[opt.type].callbackMap[combi] =  {cb: callback, propagate:opt.propagate};\n        return jQuery;\n\t};\n    this.remove = function(exp, opt) {\n        opt = opt || {};\n        target = opt.target || jQuery('html')[0];\n        type = opt.type || 'keydown';\n\t\texp = exp.toLowerCase();\n        delete this.all[target].events[type].callbackMap[exp]\n        return jQuery;\n\t};\n    jQuery.hotkeys = this;\n    return jQuery;\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery.js",
    "content": "/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */\n!function(a,b){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error(\"jQuery requires a window with a document\");return b(a)}:b(a)}(\"undefined\"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=\"1.11.3\",m=function(a,b){return new m.fn.init(a,b)},n=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,o=/^-ms-/,p=/-([\\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:\"\",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for(\"boolean\"==typeof g&&(j=g,g=arguments[h]||{},h++),\"object\"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:\"jQuery\"+(l+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return\"function\"===m.type(a)},isArray:Array.isArray||function(a){return\"array\"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||\"object\"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,\"constructor\")&&!j.call(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?h[i.call(a)]||\"object\":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,\"ms-\").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?\"\":(a+\"\").replace(n,\"\")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,\"string\"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return\"string\"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(a,b){h[\"[object \"+b+\"]\"]=b.toLowerCase()});function r(a){var b=\"length\"in a&&a.length,c=m.type(a);return\"function\"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:\"array\"===c||0===b||\"number\"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u=\"sizzle\"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",L=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",M=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",N=M.replace(\"w\",\"w#\"),O=\"\\\\[\"+L+\"*(\"+M+\")(?:\"+L+\"*([*^$|!~]?=)\"+L+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+N+\"))|)\"+L+\"*\\\\]\",P=\":(\"+M+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+O+\")*)|.*)\\\\)|)\",Q=new RegExp(L+\"+\",\"g\"),R=new RegExp(\"^\"+L+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+L+\"+$\",\"g\"),S=new RegExp(\"^\"+L+\"*,\"+L+\"*\"),T=new RegExp(\"^\"+L+\"*([>+~]|\"+L+\")\"+L+\"*\"),U=new RegExp(\"=\"+L+\"*([^\\\\]'\\\"]*?)\"+L+\"*\\\\]\",\"g\"),V=new RegExp(P),W=new RegExp(\"^\"+N+\"$\"),X={ID:new RegExp(\"^#(\"+M+\")\"),CLASS:new RegExp(\"^\\\\.(\"+M+\")\"),TAG:new RegExp(\"^(\"+M.replace(\"w\",\"w*\")+\")\"),ATTR:new RegExp(\"^\"+O),PSEUDO:new RegExp(\"^\"+P),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+L+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+L+\"*(?:([+-]|)\"+L+\"*(\\\\d+)|))\"+L+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+K+\")$\",\"i\"),needsContext:new RegExp(\"^\"+L+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+L+\"*((?:-\\\\d)?\\\\d*)\"+L+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\\d$/i,$=/^[^{]+\\{\\s*\\[native \\w/,_=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,aa=/[+~]/,ba=/'|\\\\/g,ca=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+L+\"?|(\"+L+\")|.)\",\"ig\"),da=function(a,b,c){var d=\"0x\"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,\"string\"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&\"object\"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute(\"id\"))?s=r.replace(ba,\"\\\\$&\"):b.setAttribute(\"id\",s),s=\"[id='\"+s+\"'] \",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(\",\")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute(\"id\")}}}return i(a.replace(R,\"$1\"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+\" \")>d.cacheLength&&delete b[a.shift()],b[c+\" \"]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement(\"div\");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split(\"|\"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return\"input\"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return(\"input\"===c||\"button\"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&\"undefined\"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?\"HTML\"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener(\"unload\",ea,!1):e.attachEvent&&e.attachEvent(\"onunload\",ea)),p=!f(g),c.attributes=ja(function(a){return a.className=\"i\",!a.getAttribute(\"className\")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment(\"\")),!a.getElementsByTagName(\"*\").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(\"undefined\"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute(\"id\")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c=\"undefined\"!=typeof a.getAttributeNode&&a.getAttributeNode(\"id\");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return\"undefined\"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if(\"*\"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=\"<a id='\"+u+\"'></a><select id='\"+u+\"-\\f]' msallowcapture=''><option selected=''></option></select>\",a.querySelectorAll(\"[msallowcapture^='']\").length&&q.push(\"[*^$]=\"+L+\"*(?:''|\\\"\\\")\"),a.querySelectorAll(\"[selected]\").length||q.push(\"\\\\[\"+L+\"*(?:value|\"+K+\")\"),a.querySelectorAll(\"[id~=\"+u+\"-]\").length||q.push(\"~=\"),a.querySelectorAll(\":checked\").length||q.push(\":checked\"),a.querySelectorAll(\"a#\"+u+\"+*\").length||q.push(\".#.+[+~]\")}),ja(function(a){var b=g.createElement(\"input\");b.setAttribute(\"type\",\"hidden\"),a.appendChild(b).setAttribute(\"name\",\"D\"),a.querySelectorAll(\"[name=d]\").length&&q.push(\"name\"+L+\"*[*^$|!~]?=\"),a.querySelectorAll(\":enabled\").length||q.push(\":enabled\",\":disabled\"),a.querySelectorAll(\"*,:x\"),q.push(\",.*:\")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,\"div\"),s.call(a,\"[s!='']:x\"),r.push(\"!=\",P)}),q=q.length&&new RegExp(q.join(\"|\")),r=r.length&&new RegExp(r.join(\"|\")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,\"='$1']\"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c=\"\",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if(\"string\"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||\"\").replace(ca,da),\"~=\"===a[2]&&(a[3]=\" \"+a[3]+\" \"),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),\"nth\"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*(\"even\"===a[3]||\"odd\"===a[3])),a[5]=+(a[7]+a[8]||\"odd\"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||\"\":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(\")\",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return\"*\"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+\" \"];return b||(b=new RegExp(\"(^|\"+L+\")\"+a+\"(\"+L+\"|$)\"))&&y(a,function(a){return b.test(\"string\"==typeof a.className&&a.className||\"undefined\"!=typeof a.getAttribute&&a.getAttribute(\"class\")||\"\")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?\"!=\"===b:b?(e+=\"\",\"=\"===b?e===c:\"!=\"===b?e!==c:\"^=\"===b?c&&0===e.indexOf(c):\"*=\"===b?c&&e.indexOf(c)>-1:\"$=\"===b?c&&e.slice(-c.length)===c:\"~=\"===b?(\" \"+e.replace(Q,\" \")+\" \").indexOf(c)>-1:\"|=\"===b?e===c||e.slice(0,c.length+1)===c+\"-\":!1):!0}},CHILD:function(a,b,c,d,e){var f=\"nth\"!==a.slice(0,3),g=\"last\"!==a.slice(-4),h=\"of-type\"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?\"nextSibling\":\"previousSibling\",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p=\"only\"===a&&!o&&\"nextSibling\"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error(\"unsupported pseudo: \"+a);return e[u]?e(b):e.length>1?(c=[a,a,\"\",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,\"$1\"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||\"\")||ga.error(\"unsupported lang: \"+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute(\"xml:lang\")||b.getAttribute(\"lang\"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+\"-\");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&!!a.checked||\"option\"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&\"button\"===a.type||\"button\"===b},text:function(a){var b;return\"input\"===a.nodeName.toLowerCase()&&\"text\"===a.type&&(null==(b=a.getAttribute(\"type\"))||\"text\"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+\" \"];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R,\" \")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d=\"\";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&\"parentNode\"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||\"*\",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[\" \"],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:\" \"===a[i-2].type?\"*\":\"\"})).replace(R,\"$1\"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q=\"0\",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG(\"*\",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+\" \"];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n=\"function\"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&\"ID\"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split(\"\").sort(B).join(\"\")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement(\"div\"))}),ja(function(a){return a.innerHTML=\"<a href='#'></a>\",\"#\"===a.firstChild.getAttribute(\"href\")})||ka(\"type|href|height|width\",function(a,b,c){return c?void 0:a.getAttribute(b,\"type\"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=\"<input/>\",a.firstChild.setAttribute(\"value\",\"\"),\"\"===a.firstChild.getAttribute(\"value\")})||ka(\"value\",function(a,b,c){return c||\"input\"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute(\"disabled\")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[\":\"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,v=/^.[^:#\\[\\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if(\"string\"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=\":not(\"+a+\")\"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if(\"string\"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+\" \"+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,\"string\"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if(\"string\"==typeof a){if(c=\"<\"===a.charAt(0)&&\">\"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?\"undefined\"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||\"string\"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?\"string\"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return m.dir(a,\"parentNode\",c)},next:function(a){return D(a,\"nextSibling\")},prev:function(a){return D(a,\"previousSibling\")},nextAll:function(a){return m.dir(a,\"nextSibling\")},prevAll:function(a){return m.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return m.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return m.dir(a,\"previousSibling\",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,\"iframe\")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return\"Until\"!==a.slice(-5)&&(d=c),d&&\"string\"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a=\"string\"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);\"function\"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&\"string\"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[[\"resolve\",\"done\",m.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",m.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",m.Callbacks(\"memory\")]],c=\"pending\",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+\"With\"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+\"With\"](this===e?d:this,arguments),this},e[f[0]+\"With\"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler(\"ready\"),m(y).off(\"ready\")))}}});function I(){y.addEventListener?(y.removeEventListener(\"DOMContentLoaded\",J,!1),a.removeEventListener(\"load\",J,!1)):(y.detachEvent(\"onreadystatechange\",J),a.detachEvent(\"onload\",J))}function J(){(y.addEventListener||\"load\"===event.type||\"complete\"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),\"complete\"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener(\"DOMContentLoaded\",J,!1),a.addEventListener(\"load\",J,!1);else{y.attachEvent(\"onreadystatechange\",J),a.attachEvent(\"onload\",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll(\"left\")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K=\"undefined\",L;for(L in m(k))break;k.ownLast=\"0\"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName(\"body\")[0],c&&c.style&&(b=y.createElement(\"div\"),d=y.createElement(\"div\"),d.style.cssText=\"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText=\"display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1\",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement(\"div\");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+\" \").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute(\"classid\")===b};var M=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d=\"data-\"+b.replace(N,\"-$1\").toLowerCase();if(c=a.getAttribute(d),\"string\"==typeof c){try{c=\"true\"===c?!0:\"false\"===c?!1:\"null\"===c?null:+c+\"\"===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if((\"data\"!==b||!m.isEmptyObject(a[b]))&&\"toJSON\"!==b)return!1;\n\nreturn!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||\"string\"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),(\"object\"==typeof b||\"function\"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),\"string\"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(\" \")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{\"applet \":!0,\"embed \":!0,\"object \":\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,\"parsedAttrs\"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf(\"data-\")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,\"parsedAttrs\",!0)}return e}return\"object\"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||\"fx\")+\"queue\",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||\"fx\";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};\"inprogress\"===e&&(e=c.shift(),d--),e&&(\"fx\"===b&&c.unshift(\"inprogress\"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+\"queueHooks\";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks(\"once memory\").add(function(){m._removeData(a,b+\"queue\"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return\"string\"!=typeof a&&(b=a,a=\"fx\",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),\"fx\"===a&&\"inprogress\"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};\"string\"!=typeof a&&(b=a,a=void 0),a=a||\"fx\";while(g--)c=m._data(f[g],a+\"queueHooks\"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,T=[\"Top\",\"Right\",\"Bottom\",\"Left\"],U=function(a,b){return a=b||a,\"none\"===m.css(a,\"display\")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if(\"object\"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement(\"input\"),b=y.createElement(\"div\"),c=y.createDocumentFragment();if(b.innerHTML=\"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName(\"tbody\").length,k.htmlSerialize=!!b.getElementsByTagName(\"link\").length,k.html5Clone=\"<:nav></:nav>\"!==y.createElement(\"nav\").cloneNode(!0).outerHTML,a.type=\"checkbox\",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML=\"<textarea>x</textarea>\",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML=\"<input type='radio' checked='checked' name='t'/>\",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent(\"onclick\",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement(\"div\");for(b in{submit:!0,change:!0,focusin:!0})c=\"on\"+b,(k[b+\"Bubbles\"]=c in a)||(d.setAttribute(c,\"t\"),k[b+\"Bubbles\"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||\"\").match(E)||[\"\"],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||\"\").split(\".\").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(\".\")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent(\"on\"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||\"\").match(E)||[\"\"],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||\"\").split(\".\").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp(\"(^|\\\\.)\"+p.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&(\"**\"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,\"events\"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,\"type\")?b.type:b,q=j.call(b,\"namespace\")?b.namespace.split(\".\"):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(\".\")>=0&&(q=p.split(\".\"),p=q.shift(),q.sort()),g=p.indexOf(\":\")<0&&\"on\"+p,b=b[m.expando]?b:new m.Event(p,\"object\"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join(\".\"),b.namespace_re=b.namespace?new RegExp(\"(^|\\\\.)\"+q.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,\"events\")||{})[b.type]&&m._data(h,\"handle\"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,\"events\")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||\"click\"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||\"click\"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+\" \",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:\"focusin\"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:\"focusout\"},click:{trigger:function(){return m.nodeName(this,\"input\")&&\"checkbox\"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,\"a\")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d=\"on\"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,\"form\")?!1:void m.event.add(this,\"click._submit keypress._submit\",function(a){var b=a.target,c=m.nodeName(b,\"input\")||m.nodeName(b,\"button\")?b.form:void 0;c&&!m._data(c,\"submitBubbles\")&&(m.event.add(c,\"submit._submit\",function(a){a._submit_bubble=!0}),m._data(c,\"submitBubbles\",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate(\"submit\",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,\"form\")?!1:void m.event.remove(this,\"._submit\")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?((\"checkbox\"===this.type||\"radio\"===this.type)&&(m.event.add(this,\"propertychange._change\",function(a){\"checked\"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,\"click._change\",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate(\"change\",this,a,!0)})),!1):void m.event.add(this,\"beforeactivate._change\",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,\"changeBubbles\")&&(m.event.add(b,\"change._change\",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate(\"change\",this.parentNode,a,!0)}),m._data(b,\"changeBubbles\",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||\"radio\"!==b.type&&\"checkbox\"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,\"._change\"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if(\"object\"==typeof a){\"string\"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&(\"string\"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+\".\"+d.namespace:d.origType,d.selector,d.handler),this;if(\"object\"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||\"function\"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split(\"|\"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea=\"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",fa=/ jQuery\\d+=\"(?:null|\\d+)\"/g,ga=new RegExp(\"<(?:\"+ea+\")[\\\\s/>]\",\"i\"),ha=/^\\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,ja=/<([\\w:]+)/,ka=/<tbody/i,la=/<|&#?\\w+;/,ma=/<(?:script|style|link)/i,na=/checked\\s*(?:[^=]|=\\s*.checked.)/i,oa=/^$|\\/(?:java|ecma)script/i,pa=/^true\\/(.*)/,qa=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,ra={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],area:[1,\"<map>\",\"</map>\"],param:[1,\"<object>\",\"</object>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:k.htmlSerialize?[0,\"\",\"\"]:[1,\"X<div>\",\"</div>\"]},sa=da(y),ta=sa.appendChild(y.createElement(\"div\"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||\"*\"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||\"*\"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,\"table\")&&m.nodeName(11!==b.nodeType?b:b.firstChild,\"tr\")?a.getElementsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\")):a}function xa(a){return a.type=(null!==m.find.attr(a,\"type\"))+\"/\"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute(\"type\"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,\"globalEval\",!b||m._data(b[d],\"globalEval\"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}\"script\"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):\"object\"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):\"input\"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):\"option\"===c?b.defaultSelected=b.selected=a.defaultSelected:(\"input\"===c||\"textarea\"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test(\"<\"+a.nodeName+\">\")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,\"script\"),d.length>0&&za(d,!i&&ua(a,\"script\")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if(\"object\"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement(\"div\")),i=(ja.exec(f)||[\"\",\"\"])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,\"<$1></$2>\")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f=\"table\"!==i||ka.test(f)?\"<table>\"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],\"tbody\")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent=\"\";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,\"input\"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),\"script\"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||\"\")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,\"script\")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,\"select\")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,\"\"):void 0;if(!(\"string\"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||[\"\",\"\"])[1].toLowerCase()])){a=a.replace(ia,\"<$1></$2>\");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&\"string\"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,\"script\"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,\"script\"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||\"\")&&!m._data(d,\"globalEval\")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||\"\").replace(qa,\"\")));i=c=null}return this}}),m.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],\"display\");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),\"none\"!==c&&c||(Ca=(Ca||m(\"<iframe frameborder='0' width='0' height='0'/>\")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName(\"body\")[0],c&&c.style?(b=y.createElement(\"div\"),d=y.createElement(\"div\"),d.style.cssText=\"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText=\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1\",b.appendChild(y.createElement(\"div\")).style.width=\"5px\",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp(\"^(\"+S+\")(?!px)[a-z%]+$\",\"i\"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(\"\"!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+\"\"}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left=\"fontSize\"===b?\"1em\":g,g=h.pixelLeft+\"px\",h.left=d,f&&(e.left=f)),void 0===g?g:g+\"\"||\"auto\"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement(\"div\"),b.innerHTML=\"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\",d=b.getElementsByTagName(\"a\")[0],c=d&&d.style){c.cssText=\"float:left;opacity:.5\",k.opacity=\"0.5\"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip=\"content-box\",b.cloneNode(!0).style.backgroundClip=\"\",k.clearCloneStyle=\"content-box\"===b.style.backgroundClip,k.boxSizing=\"\"===c.boxSizing||\"\"===c.MozBoxSizing||\"\"===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName(\"body\")[0],c&&c.style&&(b=y.createElement(\"div\"),d=y.createElement(\"div\"),d.style.cssText=\"position:absolute;border:0;width:0;height:0;top:0;left:-9999px\",c.appendChild(d).appendChild(b),b.style.cssText=\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute\",e=f=!1,h=!0,a.getComputedStyle&&(e=\"1%\"!==(a.getComputedStyle(b,null)||{}).top,f=\"4px\"===(a.getComputedStyle(b,null)||{width:\"4px\"}).width,i=b.appendChild(y.createElement(\"div\")),i.style.cssText=b.style.cssText=\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0\",i.style.marginRight=i.style.width=\"0\",b.style.width=\"1px\",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML=\"<table><tr><td></td><td>t</td></tr></table>\",i=b.getElementsByTagName(\"td\"),i[0].style.cssText=\"margin:0;border:0;padding:0;display:none\",g=0===i[0].offsetHeight,g&&(i[0].style.display=\"\",i[1].style.display=\"none\",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Ma=/alpha\\([^)]*\\)/i,Na=/opacity\\s*=\\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp(\"^(\"+S+\")(.*)$\",\"i\"),Qa=new RegExp(\"^([+-])=(\"+S+\")\",\"i\"),Ra={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Sa={letterSpacing:\"0\",fontWeight:\"400\"},Ta=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,\"olddisplay\"),c=d.style.display,b?(f[g]||\"none\"!==c||(d.style.display=\"\"),\"\"===d.style.display&&U(d)&&(f[g]=m._data(d,\"olddisplay\",Fa(d.nodeName)))):(e=U(d),(c&&\"none\"!==c||!e)&&m._data(d,\"olddisplay\",e?c:m.css(d,\"display\"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&\"none\"!==d.style.display&&\"\"!==d.style.display||(d.style.display=b?f[g]||\"\":\"none\"));return a}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||\"px\"):b}function Xa(a,b,c,d,e){for(var f=c===(d?\"border\":\"content\")?4:\"width\"===b?1:0,g=0;4>f;f+=2)\"margin\"===c&&(g+=m.css(a,c+T[f],!0,e)),d?(\"content\"===c&&(g-=m.css(a,\"padding\"+T[f],!0,e)),\"margin\"!==c&&(g-=m.css(a,\"border\"+T[f]+\"Width\",!0,e))):(g+=m.css(a,\"padding\"+T[f],!0,e),\"padding\"!==c&&(g+=m.css(a,\"border\"+T[f]+\"Width\",!0,e)));return g}function Ya(a,b,c){var d=!0,e=\"width\"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&\"border-box\"===m.css(a,\"boxSizing\",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?\"border\":\"content\"),d,f)+\"px\"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(a,\"opacity\");return\"\"===c?\"1\":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":k.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&\"get\"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,\"string\"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f=\"number\"),null!=c&&c===c&&(\"number\"!==f||m.cssNumber[h]||(c+=\"px\"),k.clearCloneStyle||\"\"!==c||0!==b.indexOf(\"background\")||(i[b]=\"inherit\"),!(g&&\"set\"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&\"get\"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),\"normal\"===f&&b in Sa&&(f=Sa[b]),\"\"===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each([\"height\",\"width\"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,\"display\"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&\"border-box\"===m.css(a,\"boxSizing\",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\")?.01*parseFloat(RegExp.$1)+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?\"alpha(opacity=\"+100*b+\")\":\"\",f=d&&d.filter||c.filter||\"\";c.zoom=1,(b>=1||\"\"===b)&&\"\"===m.trim(f.replace(Ma,\"\"))&&c.removeAttribute&&(c.removeAttribute(\"filter\"),\"\"===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+\" \"+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:\"inline-block\"},Ja,[a,\"marginRight\"]):void 0}),m.each({margin:\"\",padding:\"\",border:\"Width\"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f=\"string\"==typeof c?c.split(\" \"):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return\"boolean\"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){\nreturn new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||\"swing\",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?\"\":\"px\")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,\"\"),b&&\"auto\"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp(\"^(?:([+-])=|)(\"+S+\")([a-z%]*)$\",\"i\"),cb=/queueHooks$/,db=[ib],eb={\"*\":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?\"\":\"px\"),g=(m.cssNumber[a]||\"px\"!==f&&+d)&&bb.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||\".5\",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d[\"margin\"+c]=d[\"padding\"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb[\"*\"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,\"fxshow\");c.queue||(h=m._queueHooks(a,\"fx\"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,\"fx\").length||h.empty.fire()})})),1===a.nodeType&&(\"height\"in b||\"width\"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,\"display\"),l=\"none\"===j?m._data(a,\"olddisplay\")||Fa(a.nodeName):j,\"inline\"===l&&\"none\"===m.css(a,\"float\")&&(k.inlineBlockNeedsLayout&&\"inline\"!==Fa(a.nodeName)?p.zoom=1:p.display=\"inline-block\")),c.overflow&&(p.overflow=\"hidden\",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||\"toggle\"===e,e===(q?\"hide\":\"show\")){if(\"show\"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))\"inline\"===(\"none\"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?\"hidden\"in r&&(q=r.hidden):r=m._data(a,\"fxshow\",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,\"fxshow\");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start=\"width\"===d||\"height\"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&\"expand\"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=[\"*\"]):a=a.split(\" \");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&\"object\"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:\"number\"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue=\"fx\"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(this,\"finish\"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return\"string\"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||\"fx\",[]),this.each(function(){var b=!0,e=null!=a&&a+\"queueHooks\",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||\"fx\"),this.each(function(){var b,c=m._data(this),d=c[a+\"queue\"],e=c[a+\"queueHooks\"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each([\"toggle\",\"show\",\"hide\"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||\"boolean\"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb(\"show\"),slideUp:gb(\"hide\"),slideToggle:gb(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||\"fx\",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement(\"div\"),b.setAttribute(\"className\",\"t\"),b.innerHTML=\"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\",d=b.getElementsByTagName(\"a\")[0],c=y.createElement(\"select\"),e=c.appendChild(y.createElement(\"option\")),a=b.getElementsByTagName(\"input\")[0],d.style.cssText=\"top:1px\",k.getSetAttribute=\"t\"!==b.className,k.style=/top/.test(d.getAttribute(\"style\")),k.hrefNormalized=\"/a\"===d.getAttribute(\"href\"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement(\"form\").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement(\"input\"),a.setAttribute(\"value\",\"\"),k.input=\"\"===a.getAttribute(\"value\"),a.value=\"t\",a.setAttribute(\"type\",\"radio\"),k.radioValue=\"t\"===a.value}();var lb=/\\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e=\"\":\"number\"==typeof e?e+=\"\":m.isArray(e)&&(e=m.map(e,function(a){return null==a?\"\":a+\"\"})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&\"set\"in b&&void 0!==b.set(this,e,\"value\")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&\"get\"in b&&void 0!==(c=b.get(e,\"value\"))?c:(c=e.value,\"string\"==typeof c?c.replace(lb,\"\"):null==c?\"\":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,\"value\");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f=\"select-one\"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute(\"disabled\"))||c.parentNode.disabled&&m.nodeName(c.parentNode,\"optgroup\"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each([\"radio\",\"checkbox\"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute(\"value\")?\"on\":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&\"get\"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&\"set\"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+\"\"),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase(\"default-\"+c)]=a[d]=!1:m.attr(a,c,\"\"),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&\"radio\"===b&&m.nodeName(a,\"input\")){var c=a.value;return a.setAttribute(\"type\",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase(\"default-\"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase(\"default-\"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,\"input\")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+=\"\",\"value\"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&\"\"!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,\"\"===b?!1:b,c)}},m.each([\"width\",\"height\"],function(a,b){m.attrHooks[b]={set:function(a,c){return\"\"===c?(a.setAttribute(b,\"auto\"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+\"\"}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&\"set\"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&\"get\"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,\"tabindex\");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each([\"href\",\"src\"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype=\"encoding\");var ub=/[\\t\\r\\n\\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=\"string\"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||\"\").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ub,\" \"):\" \")){f=0;while(e=b[f++])d.indexOf(\" \"+e+\" \")<0&&(d+=e+\" \");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||\"string\"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||\"\").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ub,\" \"):\"\")){f=0;while(e=b[f++])while(d.indexOf(\" \"+e+\" \")>=0)d=d.replace(\" \"+e+\" \",\" \");g=a?m.trim(d):\"\",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return\"boolean\"==typeof b&&\"string\"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if(\"string\"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||\"boolean\"===c)&&(this.className&&m._data(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":m._data(this,\"__className__\")||\"\")})},hasClass:function(a){for(var b=\" \"+a+\" \",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(\" \"+this[c].className+\" \").replace(ub,\" \").indexOf(b)>=0)return!0;return!1}}),m.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,\"**\"):this.off(b,a||\"**\",c)}});var vb=m.now(),wb=/\\?/,xb=/(,)|(\\[|{)|(}|])|\"(?:[^\"\\\\\\r\\n]|\\\\[\"\\\\\\/bfnrt]|\\\\u[\\da-fA-F]{4})*\"\\s*:?|true|false|null|-?(?!0\\d)\\d+(?:\\.\\d+|)(?:[eE][+-]?\\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+\"\");var c,d=null,e=m.trim(b+\"\");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,\"\")}))?Function(\"return \"+e)():m.error(\"Invalid JSON: \"+b)},m.parseXML=function(b){var c,d;if(!b||\"string\"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,\"text/xml\")):(c=new ActiveXObject(\"Microsoft.XMLDOM\"),c.async=\"false\",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName(\"parsererror\").length||m.error(\"Invalid XML: \"+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\\/\\//,Gb=/^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,Hb={},Ib={},Jb=\"*/\".concat(\"*\");try{zb=location.href}catch(Kb){zb=y.createElement(\"a\"),zb.href=\"\",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){\"string\"!=typeof b&&(c=b,b=\"*\");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])\"+\"===d.charAt(0)?(d=d.slice(1)||\"*\",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return\"string\"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e[\"*\"]&&g(\"*\")}function Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while(\"*\"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader(\"Content-Type\"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+\" \"+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if(\"*\"===f)f=i;else if(\"*\"!==i&&i!==f){if(g=j[i+\" \"+f]||j[\"* \"+f],!g)for(e in j)if(h=e.split(\" \"),h[1]===f&&(g=j[i+\" \"+h[0]]||j[\"* \"+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a[\"throws\"])b=g(b);else try{b=g(b)}catch(l){return{state:\"parsererror\",error:g?l:\"No conversion from \"+i+\" to \"+f}}}return{state:\"success\",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:\"GET\",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Jb,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":m.parseJSON,\"text xml\":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){\"object\"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks(\"once memory\"),q=k.statusCode||{},r={},s={},t=0,u=\"canceled\",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zb)+\"\").replace(Ab,\"\").replace(Fb,yb[1]+\"//\"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||\"*\").toLowerCase().match(E)||[\"\"],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||(\"http:\"===c[1]?\"80\":\"443\"))===(yb[3]||(\"http:\"===yb[1]?\"80\":\"443\")))),k.data&&k.processData&&\"string\"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger(\"ajaxStart\"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?\"&\":\"?\")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,\"$1_=\"+vb++):e+(wb.test(e)?\"&\":\"?\")+\"_=\"+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader(\"If-Modified-Since\",m.lastModified[e]),m.etag[e]&&v.setRequestHeader(\"If-None-Match\",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader(\"Content-Type\",k.contentType),v.setRequestHeader(\"Accept\",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+(\"*\"!==k.dataTypes[0]?\", \"+Jb+\"; q=0.01\":\"\"):k.accepts[\"*\"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u=\"abort\";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger(\"ajaxSend\",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort(\"timeout\")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,\"No Transport\");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||\"\",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader(\"Last-Modified\"),w&&(m.lastModified[e]=w),w=v.getResponseHeader(\"etag\"),w&&(m.etag[e]=w)),204===a||\"HEAD\"===k.type?x=\"nocontent\":304===a?x=\"notmodified\":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x=\"error\",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+\"\",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?\"ajaxSuccess\":\"ajaxError\",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger(\"ajaxComplete\",[v,k]),--m.active||m.event.trigger(\"ajaxStop\")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,\"json\")},getScript:function(a,b){return m.get(a,void 0,b,\"script\")}}),m.each([\"get\",\"post\"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,\"body\")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&\"none\"===(a.style&&a.style.display||m.css(a,\"display\"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\\[\\]$/,Sb=/\\r?\\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+\"[\"+(\"object\"==typeof e?b:\"\")+\"]\",e,c,d)});else if(c||\"object\"!==m.type(b))d(a,b);else for(e in b)Vb(a+\"[\"+e+\"]\",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?\"\":b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join(\"&\").replace(Qb,\"+\")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,\"elements\");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(\":disabled\")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,\"\\r\\n\")}}):{name:b.name,value:c.replace(Sb,\"\\r\\n\")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent(\"onunload\",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&\"withCredentials\"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c[\"X-Requested-With\"]||(c[\"X-Requested-With\"]=\"XMLHttpRequest\");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+\"\");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,\"string\"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=\"\"}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(b){}}m.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter(\"script\",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\",a.global=!1)}),m.ajaxTransport(\"script\",function(a){if(a.crossDomain){var b,c=y.head||m(\"head\")[0]||y.documentElement;return{send:function(d,e){b=y.createElement(\"script\"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,\"success\"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\\?(?=&|$)|\\?\\?/;m.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var a=_b.pop()||m.expando+\"_\"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?\"url\":\"string\"==typeof b.data&&!(b.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&ac.test(b.data)&&\"data\");return h||\"jsonp\"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,\"$1\"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?\"&\":\"?\")+b.jsonp+\"=\"+e),b.converters[\"script json\"]=function(){return g||m.error(e+\" was not called\"),g[0]},b.dataTypes[0]=\"json\",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),\"script\"):void 0}),m.parseHTML=function(a,b,c){if(!a||\"string\"!=typeof a)return null;\"boolean\"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if(\"string\"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(\" \");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&\"object\"==typeof b&&(f=\"POST\"),g.length>0&&m.ajax({url:a,type:f,dataType:\"html\",data:b}).done(function(a){e=arguments,g.html(d?m(\"<div>\").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,\"position\"),l=m(a),n={};\"static\"===k&&(a.style.position=\"relative\"),h=l.offset(),f=m.css(a,\"top\"),i=m.css(a,\"left\"),j=(\"absolute\"===k||\"fixed\"===k)&&m.inArray(\"auto\",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),\"using\"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return\"fixed\"===m.css(d,\"position\")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],\"html\")||(c=a.offset()),c.top+=m.css(a[0],\"borderTopWidth\",!0),c.left+=m.css(a[0],\"borderLeftWidth\",!0)),{top:b.top-c.top-m.css(d,\"marginTop\",!0),left:b.left-c.left-m.css(d,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,\"html\")&&\"static\"===m.css(a,\"position\"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each([\"top\",\"left\"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+\"px\":c):void 0})}),m.each({Height:\"height\",Width:\"width\"},function(a,b){m.each({padding:\"inner\"+a,content:b,\"\":\"outer\"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||\"boolean\"!=typeof d),g=c||(d===!0||e===!0?\"margin\":\"border\");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement[\"client\"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body[\"scroll\"+a],e[\"scroll\"+a],b.body[\"offset\"+a],e[\"offset\"+a],e[\"client\"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m});\njQuery.noConflict();"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery.query.js",
    "content": "/**\n * jQuery.query - Query String Modification and Creation for jQuery\n * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)\n * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).\n * Date: 2009/8/13\n *\n * @author Blair Mitchelmore\n * @version 2.1.7\n *\n **/\nnew function(e){var d=e.separator||\"&\";var c=e.spaces===false?false:true;var a=e.suffix===false?\"\":\"[]\";var g=e.prefix===false?false:true;var b=g?e.hash===true?\"#\":\"?\":\"\";var f=e.numbers===false?false:true;jQuery.query=new function(){var h=function(m,l){return m!=undefined&&m!==null&&(!!l?m.constructor==l:true)};var i=function(r){var l,q=/\\[([^[]*)\\]/g,n=/^([^[]+)(\\[.*\\])?$/.exec(r),o=n[1],p=[];while(l=q.exec(n[2])){p.push(l[1])}return[o,p]};var k=function(s,r,q){var t,p=r.shift();if(typeof s!=\"object\"){s=null}if(p===\"\"){if(!s){s=[]}if(h(s,Array)){s.push(r.length==0?q:k(null,r.slice(0),q))}else{if(h(s,Object)){var n=0;while(s[n++]!=null){}s[--n]=r.length==0?q:k(s[n],r.slice(0),q)}else{s=[];s.push(r.length==0?q:k(null,r.slice(0),q))}}}else{if(p&&p.match(/^\\s*[0-9]+\\s*$/)){var m=parseInt(p,10);if(!s){s=[]}s[m]=r.length==0?q:k(s[m],r.slice(0),q)}else{if(p){var m=p.replace(/^\\s*|\\s*$/g,\"\");if(!s){s={}}if(h(s,Array)){var l={};for(var n=0;n<s.length;++n){l[n]=s[n]}s=l}s[m]=r.length==0?q:k(s[m],r.slice(0),q)}else{return q}}}return s};var j=function(l){var m=this;m.keys={};if(l.queryObject){jQuery.each(l.get(),function(n,o){m.SET(n,o)})}else{jQuery.each(arguments,function(){var n=\"\"+this;n=n.replace(/^[?#]/,\"\");n=n.replace(/[;&]$/,\"\");if(c){n=n.replace(/[+]/g,\" \")}jQuery.each(n.split(/[&;]/),function(){var o=decodeURIComponent(this.split(\"=\")[0]||\"\");var p=decodeURIComponent(this.split(\"=\")[1]||\"\");if(!o){return}if(f){if(/^[+-]?[0-9]+\\.[0-9]*$/.test(p)){p=parseFloat(p)}else{if(/^[+-]?[0-9]+$/.test(p)){p=parseInt(p,10)}}}p=(!p&&p!==0)?true:p;if(p!==false&&p!==true&&typeof p!=\"number\"){p=p}m.SET(o,p)})})}return m};j.prototype={queryObject:true,has:function(l,m){var n=this.get(l);return h(n,m)},GET:function(m){if(!h(m)){return this.keys}var l=i(m),n=l[0],p=l[1];var o=this.keys[n];while(o!=null&&p.length!=0){o=o[p.shift()]}return typeof o==\"number\"?o:o||\"\"},get:function(l){var m=this.GET(l);if(h(m,Object)){return jQuery.extend(true,{},m)}else{if(h(m,Array)){return m.slice(0)}}return m},SET:function(m,r){var o=!h(r)?null:r;var l=i(m),n=l[0],q=l[1];var p=this.keys[n];this.keys[n]=k(p,q.slice(0),o);return this},set:function(l,m){return this.copy().SET(l,m)},REMOVE:function(l){return this.SET(l,null).COMPACT()},remove:function(l){return this.copy().REMOVE(l)},EMPTY:function(){var l=this;jQuery.each(l.keys,function(m,n){delete l.keys[m]});return l},load:function(l){var n=l.replace(/^.*?[#](.+?)(?:\\?.+)?$/,\"$1\");var m=l.replace(/^.*?[?](.+?)(?:#.+)?$/,\"$1\");return new j(l.length==m.length?\"\":m,l.length==n.length?\"\":n)},empty:function(){return this.copy().EMPTY()},copy:function(){return new j(this)},COMPACT:function(){function l(o){var n=typeof o==\"object\"?h(o,Array)?[]:{}:o;if(typeof o==\"object\"){function m(r,p,q){if(h(r,Array)){r.push(q)}else{r[p]=q}}jQuery.each(o,function(p,q){if(!h(q)){return true}m(n,p,l(q))})}return n}this.keys=l(this.keys);return this},compact:function(){return this.copy().COMPACT()},toString:function(){var n=0,r=[],q=[],m=this;var o=function(s){s=s+\"\";if(c){s=s.replace(/ /g,\"+\")}return encodeURIComponent(s)};var l=function(s,t,u){if(!h(u)||u===false){return}var v=[o(t)];if(u!==true){v.push(\"=\");v.push(o(u))}s.push(v.join(\"\"))};var p=function(t,s){var u=function(v){return !s||s==\"\"?[v].join(\"\"):[s,\"[\",v,\"]\"].join(\"\")};jQuery.each(t,function(v,w){if(typeof w==\"object\"){p(w,u(v))}else{l(q,u(v),w)}})};p(this.keys);if(q.length>0){r.push(b)}r.push(q.join(d));return r.join(\"\")}};return new j(location.search,location.hash)}}(jQuery.query||{});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery.schedule.js",
    "content": "\n(function($){$.scheduler=function(){this.bucket={};return;};$.scheduler.prototype={schedule:function(){var ctx={\"id\":null,\"time\":1000,\"repeat\":false,\"protect\":false,\"obj\":null,\"func\":function(){},\"args\":[]};function _isfn(fn){return(!!fn&&typeof fn!=\"string\"&&typeof fn[0]==\"undefined\"&&RegExp(\"function\",\"i\").test(fn+\"\"));};var i=0;var override=false;if(typeof arguments[i]==\"object\"&&arguments.length>1){override=true;i++;}\nif(typeof arguments[i]==\"object\"){for(var option in arguments[i])\nif(typeof ctx[option]!=\"undefined\")\nctx[option]=arguments[i][option];i++;}\nif(typeof arguments[i]==\"number\"||(typeof arguments[i]==\"string\"&&arguments[i].match(RegExp(\"^[0-9]+[smhdw]$\"))))\nctx[\"time\"]=arguments[i++];if(typeof arguments[i]==\"boolean\")\nctx[\"repeat\"]=arguments[i++];if(typeof arguments[i]==\"boolean\")\nctx[\"protect\"]=arguments[i++];if(typeof arguments[i]==\"object\"&&typeof arguments[i+1]==\"string\"&&_isfn(arguments[i][arguments[i+1]])){ctx[\"obj\"]=arguments[i++];ctx[\"func\"]=arguments[i++];}\nelse if(typeof arguments[i]!=\"undefined\"&&(_isfn(arguments[i])||typeof arguments[i]==\"string\"))\nctx[\"func\"]=arguments[i++];while(typeof arguments[i]!=\"undefined\")\nctx[\"args\"].push(arguments[i++]);if(override){if(typeof arguments[1]==\"object\"){for(var option in arguments[0])\nif(typeof ctx[option]!=\"undefined\"&&typeof arguments[1][option]==\"undefined\")\nctx[option]=arguments[0][option];}\nelse{for(var option in arguments[0])\nif(typeof ctx[option]!=\"undefined\")\nctx[option]=arguments[0][option];}\ni++;}\nctx[\"_scheduler\"]=this;ctx[\"_handle\"]=null;var match=String(ctx[\"time\"]).match(RegExp(\"^([0-9]+)([smhdw])$\"));if(match&&match[0]!=\"undefined\"&&match[1]!=\"undefined\")\nctx[\"time\"]=String(parseInt(match[1])*{s:1000,m:1000*60,h:1000*60*60,d:1000*60*60*24,w:1000*60*60*24*7}[match[2]]);if(ctx[\"id\"]==null)\nctx[\"id\"]=(String(ctx[\"repeat\"])+\":\"\n+String(ctx[\"protect\"])+\":\"\n+String(ctx[\"time\"])+\":\"\n+String(ctx[\"obj\"])+\":\"\n+String(ctx[\"func\"])+\":\"\n+String(ctx[\"args\"]));if(ctx[\"protect\"])\nif(typeof this.bucket[ctx[\"id\"]]!=\"undefined\")\nreturn this.bucket[ctx[\"id\"]];if(!_isfn(ctx[\"func\"])){if(ctx[\"obj\"]!=null&&typeof ctx[\"obj\"]==\"object\"&&typeof ctx[\"func\"]==\"string\"&&_isfn(ctx[\"obj\"][ctx[\"func\"]]))\nctx[\"func\"]=ctx[\"obj\"][ctx[\"func\"]];else\nctx[\"func\"]=eval(\"function () { \"+ctx[\"func\"]+\" }\");}\nctx[\"_handle\"]=this._schedule(ctx);this.bucket[ctx[\"id\"]]=ctx;return ctx;},reschedule:function(ctx){if(typeof ctx==\"string\")\nctx=this.bucket[ctx];ctx[\"_handle\"]=this._schedule(ctx);return ctx;},_schedule:function(ctx){var trampoline=function(){var obj=(ctx[\"obj\"]!=null?ctx[\"obj\"]:ctx);(ctx[\"func\"]).apply(obj,ctx[\"args\"]);if(typeof(ctx[\"_scheduler\"]).bucket[ctx[\"id\"]]!=\"undefined\"&&ctx[\"repeat\"])\n(ctx[\"_scheduler\"])._schedule(ctx);else\ndelete(ctx[\"_scheduler\"]).bucket[ctx[\"id\"]];};return setTimeout(trampoline,ctx[\"time\"]);},cancel:function(ctx){if(typeof ctx==\"string\")\nctx=this.bucket[ctx];if(typeof ctx==\"object\"){clearTimeout(ctx[\"_handle\"]);delete this.bucket[ctx[\"id\"]];}}};$.extend({scheduler$:new $.scheduler(),schedule:function(){return $.scheduler$.schedule.apply($.scheduler$,arguments)},reschedule:function(){return $.scheduler$.reschedule.apply($.scheduler$,arguments)},cancel:function(){return $.scheduler$.cancel.apply($.scheduler$,arguments)}});$.fn.extend({schedule:function(){var a=[{}];for(var i=0;i<arguments.length;i++)\na.push(arguments[i]);return this.each(function(){a[0]={\"id\":this,\"obj\":this};return $.schedule.apply($,a);});}});})(jQuery);"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery.serialize-object.js",
    "content": "/*!\n * jQuery serializeObject - v0.2 - 1/20/2010\n * http://benalman.com/projects/jquery-misc-plugins/\n * \n * Copyright (c) 2010 \"Cowboy\" Ben Alman\n * Dual licensed under the MIT and GPL licenses.\n * http://benalman.com/about/license/\n */\n\n// Whereas .serializeArray() serializes a form into an array, .serializeObject()\n// serializes a form into an (arguably more useful) object.\n\n(function($,undefined){\n  '$:nomunge'; // Used by YUI compressor.\n  \n  $.fn.serializeObject = function(){\n    var obj = {};\n    \n    $.each( this.serializeArray(), function(i,o){\n      var n = o.name,\n        v = o.value;\n        \n        obj[n] = obj[n] === undefined ? v\n          : $.isArray( obj[n] ) ? obj[n].concat( v )\n          : [ obj[n], v ];\n    });\n    \n    return obj;\n  };\n  \n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery.table-hotkeys.js",
    "content": "(function($){\n\t$.fn.filter_visible = function(depth) {\n\t\tdepth = depth || 3;\n\t\tvar is_visible = function() {\n\t\t\tvar p = $(this), i;\n\t\t\tfor(i=0; i<depth-1; ++i) {\n\t\t\t\tif (!p.is(':visible')) return false;\n\t\t\t\tp = p.parent();\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\t\treturn this.filter(is_visible);\n\t};\n\t$.table_hotkeys = function(table, keys, opts) {\n\t\topts = $.extend($.table_hotkeys.defaults, opts);\n\t\tvar selected_class, destructive_class, set_current_row, adjacent_row_callback, get_adjacent_row, adjacent_row, prev_row, next_row, check, get_first_row, get_last_row, make_key_callback, first_row;\n\t\t\n\t\tselected_class = opts.class_prefix + opts.selected_suffix;\n\t\tdestructive_class = opts.class_prefix + opts.destructive_suffix;\n\t\tset_current_row = function (tr) {\n\t\t\tif ($.table_hotkeys.current_row) $.table_hotkeys.current_row.removeClass(selected_class);\n\t\t\ttr.addClass(selected_class);\n\t\t\ttr[0].scrollIntoView(false);\n\t\t\t$.table_hotkeys.current_row = tr;\n\t\t};\n\t\tadjacent_row_callback = function(which) {\n\t\t\tif (!adjacent_row(which) && $.isFunction(opts[which+'_page_link_cb'])) {\n\t\t\t\topts[which+'_page_link_cb']();\n\t\t\t}\n\t\t};\n\t\tget_adjacent_row = function(which) {\n\t\t\tvar first_row, method;\n\t\t\t\n\t\t\tif (!$.table_hotkeys.current_row) {\n\t\t\t\tfirst_row = get_first_row();\n\t\t\t\t$.table_hotkeys.current_row = first_row;\n\t\t\t\treturn first_row[0];\n\t\t\t}\n\t\t\tmethod = 'prev' == which? $.fn.prevAll : $.fn.nextAll;\n\t\t\treturn method.call($.table_hotkeys.current_row, opts.cycle_expr).filter_visible()[0];\n\t\t};\n\t\tadjacent_row = function(which) {\n\t\t\tvar adj = get_adjacent_row(which);\n\t\t\tif (!adj) return false;\n\t\t\tset_current_row($(adj));\n\t\t\treturn true;\n\t\t};\n\t\tprev_row = function() { return adjacent_row('prev'); };\n\t\tnext_row = function() { return adjacent_row('next'); };\n\t\tcheck = function() {\n\t\t\t$(opts.checkbox_expr, $.table_hotkeys.current_row).each(function() {\n\t\t\t\tthis.checked = !this.checked;\n\t\t\t});\n\t\t};\n\t\tget_first_row = function() {\n\t\t\treturn $(opts.cycle_expr, table).filter_visible().eq(opts.start_row_index);\n\t\t};\n\t\tget_last_row = function() {\n\t\t\tvar rows = $(opts.cycle_expr, table).filter_visible();\n\t\t\treturn rows.eq(rows.length-1);\n\t\t};\n\t\tmake_key_callback = function(expr) {\n\t\t\treturn function() {\n\t\t\t\tif ( null == $.table_hotkeys.current_row ) return false;\n\t\t\t\tvar clickable = $(expr, $.table_hotkeys.current_row);\n\t\t\t\tif (!clickable.length) return false;\n\t\t\t\tif (clickable.is('.'+destructive_class)) next_row() || prev_row();\n\t\t\t\tclickable.click();\n\t\t\t};\n\t\t};\n\t\tfirst_row = get_first_row();\n\t\tif (!first_row.length) return;\n\t\tif (opts.highlight_first)\n\t\t\tset_current_row(first_row);\n\t\telse if (opts.highlight_last)\n\t\t\tset_current_row(get_last_row());\n\t\t$.hotkeys.add(opts.prev_key, opts.hotkeys_opts, function() {return adjacent_row_callback('prev');});\n\t\t$.hotkeys.add(opts.next_key, opts.hotkeys_opts, function() {return adjacent_row_callback('next');});\n\t\t$.hotkeys.add(opts.mark_key, opts.hotkeys_opts, check);\n\t\t$.each(keys, function() {\n\t\t\tvar callback, key;\n\t\t\t\n\t\t\tif ($.isFunction(this[1])) {\n\t\t\t\tcallback = this[1];\n\t\t\t\tkey = this[0];\n\t\t\t\t$.hotkeys.add(key, opts.hotkeys_opts, function(event) { return callback(event, $.table_hotkeys.current_row); });\n\t\t\t} else {\n\t\t\t\tkey = this;\n\t\t\t\t$.hotkeys.add(key, opts.hotkeys_opts, make_key_callback('.'+opts.class_prefix+key));\n\t\t\t}\n\t\t});\n\n\t};\n\t$.table_hotkeys.current_row = null;\n\t$.table_hotkeys.defaults = {cycle_expr: 'tr', class_prefix: 'vim-', selected_suffix: 'current',\n\t\tdestructive_suffix: 'destructive', hotkeys_opts: {disableInInput: true, type: 'keypress'},\n\t\tcheckbox_expr: ':checkbox', next_key: 'j', prev_key: 'k', mark_key: 'x',\n\t\tstart_row_index: 2, highlight_first: false, highlight_last: false, next_page_link_cb: false, prev_page_link_cb: false};\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/jquery.ui.touch-punch.js",
    "content": "/*!\n * jQuery UI Touch Punch 0.2.2\n *\n * Copyright 2011, Dave Furfero\n * Dual licensed under the MIT or GPL Version 2 licenses.\n *\n * Depends:\n *  jquery.ui.widget.js\n *  jquery.ui.mouse.js\n */\n(function(b){b.support.touch=\"ontouchend\" in document;if(!b.support.touch){return}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent(\"MouseEvents\");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f)}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return}a=true;f._touchMoved=false;d(g,\"mouseover\");d(g,\"mousemove\");d(g,\"mousedown\")};c._touchMove=function(f){if(!a){return}this._touchMoved=true;d(f,\"mousemove\")};c._touchEnd=function(f){if(!a){return}d(f,\"mouseup\");d(f,\"mouseout\");if(!this._touchMoved){d(f,\"click\")}a=false};c._mouseInit=function(){var f=this;f.element.bind(\"touchstart\",b.proxy(f,\"_touchStart\")).bind(\"touchmove\",b.proxy(f,\"_touchMove\")).bind(\"touchend\",b.proxy(f,\"_touchEnd\"));e.call(f)}})(jQuery);"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/jquery/suggest.js",
    "content": "/*\n *\tjquery.suggest 1.1b - 2007-08-06\n * Patched by Mark Jaquith with Alexander Dick's \"multiple items\" patch to allow for auto-suggesting of more than one tag before submitting\n * See: http://www.vulgarisoip.com/2007/06/29/jquerysuggest-an-alternative-jquery-based-autocomplete-library/#comment-7228\n *\n *\tUses code and techniques from following libraries:\n *\t1. http://www.dyve.net/jquery/?autocomplete\n *\t2. http://dev.jquery.com/browser/trunk/plugins/interface/iautocompleter.js\n *\n *\tAll the new stuff written by Peter Vulgaris (www.vulgarisoip.com)\n *\tFeel free to do whatever you want with this file\n *\n */\n\n(function($) {\n\n\t$.suggest = function(input, options) {\n\t\tvar $input, $results, timeout, prevLength, cache, cacheSize;\n\n\t\t$input = $(input).attr(\"autocomplete\", \"off\");\n\t\t$results = $(\"<ul/>\");\n\n\t\ttimeout = false;\t\t// hold timeout ID for suggestion results to appear\n\t\tprevLength = 0;\t\t\t// last recorded length of $input.val()\n\t\tcache = [];\t\t\t\t// cache MRU list\n\t\tcacheSize = 0;\t\t\t// size of cache in chars (bytes?)\n\n\t\t$results.addClass(options.resultsClass).appendTo('body');\n\n\n\t\tresetPosition();\n\t\t$(window)\n\t\t\t.load(resetPosition)\t\t// just in case user is changing size of page while loading\n\t\t\t.resize(resetPosition);\n\n\t\t$input.blur(function() {\n\t\t\tsetTimeout(function() { $results.hide() }, 200);\n\t\t});\n\n\t\t$input.keydown(processKey);\n\n\t\tfunction resetPosition() {\n\t\t\t// requires jquery.dimension plugin\n\t\t\tvar offset = $input.offset();\n\t\t\t$results.css({\n\t\t\t\ttop: (offset.top + input.offsetHeight) + 'px',\n\t\t\t\tleft: offset.left + 'px'\n\t\t\t});\n\t\t}\n\n\n\t\tfunction processKey(e) {\n\n\t\t\t// handling up/down/escape requires results to be visible\n\t\t\t// handling enter/tab requires that AND a result to be selected\n\t\t\tif ((/27$|38$|40$/.test(e.keyCode) && $results.is(':visible')) ||\n\t\t\t\t(/^13$|^9$/.test(e.keyCode) && getCurrentResult())) {\n\n\t\t\t\tif (e.preventDefault)\n\t\t\t\t\te.preventDefault();\n\t\t\t\tif (e.stopPropagation)\n\t\t\t\t\te.stopPropagation();\n\n\t\t\t\te.cancelBubble = true;\n\t\t\t\te.returnValue = false;\n\n\t\t\t\tswitch(e.keyCode) {\n\n\t\t\t\t\tcase 38: // up\n\t\t\t\t\t\tprevResult();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 40: // down\n\t\t\t\t\t\tnextResult();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 9:  // tab\n\t\t\t\t\tcase 13: // return\n\t\t\t\t\t\tselectCurrentResult();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 27: //\tescape\n\t\t\t\t\t\t$results.hide();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ($input.val().length != prevLength) {\n\n\t\t\t\tif (timeout)\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\ttimeout = setTimeout(suggest, options.delay);\n\t\t\t\tprevLength = $input.val().length;\n\n\t\t\t}\n\n\n\t\t}\n\n\n\t\tfunction suggest() {\n\n\t\t\tvar q = $.trim($input.val()), multipleSepPos, items;\n\n\t\t\tif ( options.multiple ) {\n\t\t\t\tmultipleSepPos = q.lastIndexOf(options.multipleSep);\n\t\t\t\tif ( multipleSepPos != -1 ) {\n\t\t\t\t\tq = $.trim(q.substr(multipleSepPos + options.multipleSep.length));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (q.length >= options.minchars) {\n\n\t\t\t\tcached = checkCache(q);\n\n\t\t\t\tif (cached) {\n\n\t\t\t\t\tdisplayItems(cached['items']);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t$.get(options.source, {q: q}, function(txt) {\n\n\t\t\t\t\t\t$results.hide();\n\n\t\t\t\t\t\titems = parseTxt(txt, q);\n\n\t\t\t\t\t\tdisplayItems(items);\n\t\t\t\t\t\taddToCache(q, items, txt.length);\n\n\t\t\t\t\t});\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t$results.hide();\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction checkCache(q) {\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < cache.length; i++)\n\t\t\t\tif (cache[i]['q'] == q) {\n\t\t\t\t\tcache.unshift(cache.splice(i, 1)[0]);\n\t\t\t\t\treturn cache[0];\n\t\t\t\t}\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfunction addToCache(q, items, size) {\n\t\t\tvar cached;\n\t\t\twhile (cache.length && (cacheSize + size > options.maxCacheSize)) {\n\t\t\t\tcached = cache.pop();\n\t\t\t\tcacheSize -= cached['size'];\n\t\t\t}\n\n\t\t\tcache.push({\n\t\t\t\tq: q,\n\t\t\t\tsize: size,\n\t\t\t\titems: items\n\t\t\t\t});\n\n\t\t\tcacheSize += size;\n\n\t\t}\n\n\t\tfunction displayItems(items) {\n\t\t\tvar html = '', i;\n\t\t\tif (!items)\n\t\t\t\treturn;\n\n\t\t\tif (!items.length) {\n\t\t\t\t$results.hide();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresetPosition(); // when the form moves after the page has loaded\n\n\t\t\tfor (i = 0; i < items.length; i++)\n\t\t\t\thtml += '<li>' + items[i] + '</li>';\n\n\t\t\t$results.html(html).show();\n\n\t\t\t$results\n\t\t\t\t.children('li')\n\t\t\t\t.mouseover(function() {\n\t\t\t\t\t$results.children('li').removeClass(options.selectClass);\n\t\t\t\t\t$(this).addClass(options.selectClass);\n\t\t\t\t})\n\t\t\t\t.click(function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tselectCurrentResult();\n\t\t\t\t});\n\n\t\t}\n\n\t\tfunction parseTxt(txt, q) {\n\n\t\t\tvar items = [], tokens = txt.split(options.delimiter), i, token;\n\n\t\t\t// parse returned data for non-empty items\n\t\t\tfor (i = 0; i < tokens.length; i++) {\n\t\t\t\ttoken = $.trim(tokens[i]);\n\t\t\t\tif (token) {\n\t\t\t\t\ttoken = token.replace(\n\t\t\t\t\t\tnew RegExp(q, 'ig'),\n\t\t\t\t\t\tfunction(q) { return '<span class=\"' + options.matchClass + '\">' + q + '</span>' }\n\t\t\t\t\t\t);\n\t\t\t\t\titems[items.length] = token;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn items;\n\t\t}\n\n\t\tfunction getCurrentResult() {\n\t\t\tvar $currentResult;\n\t\t\tif (!$results.is(':visible'))\n\t\t\t\treturn false;\n\n\t\t\t$currentResult = $results.children('li.' + options.selectClass);\n\n\t\t\tif (!$currentResult.length)\n\t\t\t\t$currentResult = false;\n\n\t\t\treturn $currentResult;\n\n\t\t}\n\n\t\tfunction selectCurrentResult() {\n\n\t\t\t$currentResult = getCurrentResult();\n\n\t\t\tif ($currentResult) {\n\t\t\t\tif ( options.multiple ) {\n\t\t\t\t\tif ( $input.val().indexOf(options.multipleSep) != -1 ) {\n\t\t\t\t\t\t$currentVal = $input.val().substr( 0, ( $input.val().lastIndexOf(options.multipleSep) + options.multipleSep.length ) ) + ' ';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$currentVal = \"\";\n\t\t\t\t\t}\n\t\t\t\t\t$input.val( $currentVal + $currentResult.text() + options.multipleSep + ' ' );\n\t\t\t\t\t$input.focus();\n\t\t\t\t} else {\n\t\t\t\t\t$input.val($currentResult.text());\n\t\t\t\t}\n\t\t\t\t$results.hide();\n\t\t\t\t$input.trigger('change');\n\n\t\t\t\tif (options.onSelect)\n\t\t\t\t\toptions.onSelect.apply($input[0]);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction nextResult() {\n\n\t\t\t$currentResult = getCurrentResult();\n\n\t\t\tif ($currentResult)\n\t\t\t\t$currentResult\n\t\t\t\t\t.removeClass(options.selectClass)\n\t\t\t\t\t.next()\n\t\t\t\t\t\t.addClass(options.selectClass);\n\t\t\telse\n\t\t\t\t$results.children('li:first-child').addClass(options.selectClass);\n\n\t\t}\n\n\t\tfunction prevResult() {\n\t\t\tvar $currentResult = getCurrentResult();\n\n\t\t\tif ($currentResult)\n\t\t\t\t$currentResult\n\t\t\t\t\t.removeClass(options.selectClass)\n\t\t\t\t\t.prev()\n\t\t\t\t\t\t.addClass(options.selectClass);\n\t\t\telse\n\t\t\t\t$results.children('li:last-child').addClass(options.selectClass);\n\n\t\t}\n\t}\n\n\t$.fn.suggest = function(source, options) {\n\n\t\tif (!source)\n\t\t\treturn;\n\n\t\toptions = options || {};\n\t\toptions.multiple = options.multiple || false;\n\t\toptions.multipleSep = options.multipleSep || \",\";\n\t\toptions.source = source;\n\t\toptions.delay = options.delay || 100;\n\t\toptions.resultsClass = options.resultsClass || 'ac_results';\n\t\toptions.selectClass = options.selectClass || 'ac_over';\n\t\toptions.matchClass = options.matchClass || 'ac_match';\n\t\toptions.minchars = options.minchars || 2;\n\t\toptions.delimiter = options.delimiter || '\\n';\n\t\toptions.onSelect = options.onSelect || false;\n\t\toptions.maxCacheSize = options.maxCacheSize || 65536;\n\n\t\tthis.each(function() {\n\t\t\tnew $.suggest(this, options);\n\t\t});\n\n\t\treturn this;\n\n\t};\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/json2.js",
    "content": "/*\n    json2.js\n    2015-05-03\n\n    Public Domain.\n\n    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\n    See http://www.JSON.org/js.html\n\n\n    This code should be minified before deployment.\n    See http://javascript.crockford.com/jsmin.html\n\n    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO\n    NOT CONTROL.\n\n\n    This file creates a global JSON object containing two methods: stringify\n    and parse. This file is provides the ES5 JSON capability to ES3 systems.\n    If a project might run on IE8 or earlier, then this file should be included.\n    This file does nothing on ES5 systems.\n\n        JSON.stringify(value, replacer, space)\n            value       any JavaScript value, usually an object or array.\n\n            replacer    an optional parameter that determines how object\n                        values are stringified for objects. It can be a\n                        function or an array of strings.\n\n            space       an optional parameter that specifies the indentation\n                        of nested structures. If it is omitted, the text will\n                        be packed without extra whitespace. If it is a number,\n                        it will specify the number of spaces to indent at each\n                        level. If it is a string (such as '\\t' or '&nbsp;'),\n                        it contains the characters used to indent at each level.\n\n            This method produces a JSON text from a JavaScript value.\n\n            When an object value is found, if the object contains a toJSON\n            method, its toJSON method will be called and the result will be\n            stringified. A toJSON method does not serialize: it returns the\n            value represented by the name/value pair that should be serialized,\n            or undefined if nothing should be serialized. The toJSON method\n            will be passed the key associated with the value, and this will be\n            bound to the value\n\n            For example, this would serialize Dates as ISO strings.\n\n                Date.prototype.toJSON = function (key) {\n                    function f(n) {\n                        // Format integers to have at least two digits.\n                        return n < 10 \n                            ? '0' + n \n                            : n;\n                    }\n\n                    return this.getUTCFullYear()   + '-' +\n                         f(this.getUTCMonth() + 1) + '-' +\n                         f(this.getUTCDate())      + 'T' +\n                         f(this.getUTCHours())     + ':' +\n                         f(this.getUTCMinutes())   + ':' +\n                         f(this.getUTCSeconds())   + 'Z';\n                };\n\n            You can provide an optional replacer method. It will be passed the\n            key and value of each member, with this bound to the containing\n            object. The value that is returned from your method will be\n            serialized. If your method returns undefined, then the member will\n            be excluded from the serialization.\n\n            If the replacer parameter is an array of strings, then it will be\n            used to select the members to be serialized. It filters the results\n            such that only members with keys listed in the replacer array are\n            stringified.\n\n            Values that do not have JSON representations, such as undefined or\n            functions, will not be serialized. Such values in objects will be\n            dropped; in arrays they will be replaced with null. You can use\n            a replacer function to replace those with JSON values.\n            JSON.stringify(undefined) returns undefined.\n\n            The optional space parameter produces a stringification of the\n            value that is filled with line breaks and indentation to make it\n            easier to read.\n\n            If the space parameter is a non-empty string, then that string will\n            be used for indentation. If the space parameter is a number, then\n            the indentation will be that many spaces.\n\n            Example:\n\n            text = JSON.stringify(['e', {pluribus: 'unum'}]);\n            // text is '[\"e\",{\"pluribus\":\"unum\"}]'\n\n\n            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\\t');\n            // text is '[\\n\\t\"e\",\\n\\t{\\n\\t\\t\"pluribus\": \"unum\"\\n\\t}\\n]'\n\n            text = JSON.stringify([new Date()], function (key, value) {\n                return this[key] instanceof Date \n                    ? 'Date(' + this[key] + ')' \n                    : value;\n            });\n            // text is '[\"Date(---current time---)\"]'\n\n\n        JSON.parse(text, reviver)\n            This method parses a JSON text to produce an object or array.\n            It can throw a SyntaxError exception.\n\n            The optional reviver parameter is a function that can filter and\n            transform the results. It receives each of the keys and values,\n            and its return value is used instead of the original value.\n            If it returns what it received, then the structure is not modified.\n            If it returns undefined then the member is deleted.\n\n            Example:\n\n            // Parse the text. Values that look like ISO date strings will\n            // be converted to Date objects.\n\n            myData = JSON.parse(text, function (key, value) {\n                var a;\n                if (typeof value === 'string') {\n                    a =\n/^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z$/.exec(value);\n                    if (a) {\n                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],\n                            +a[5], +a[6]));\n                    }\n                }\n                return value;\n            });\n\n            myData = JSON.parse('[\"Date(09/09/2001)\"]', function (key, value) {\n                var d;\n                if (typeof value === 'string' &&\n                        value.slice(0, 5) === 'Date(' &&\n                        value.slice(-1) === ')') {\n                    d = new Date(value.slice(5, -1));\n                    if (d) {\n                        return d;\n                    }\n                }\n                return value;\n            });\n\n\n    This is a reference implementation. You are free to copy, modify, or\n    redistribute.\n*/\n\n/*jslint \n    eval, for, this \n*/\n\n/*property\n    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,\n    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,\n    lastIndex, length, parse, prototype, push, replace, slice, stringify,\n    test, toJSON, toString, valueOf\n*/\n\n\n// Create a JSON object only if one does not already exist. We create the\n// methods in a closure to avoid creating global variables.\n\nif (typeof JSON !== 'object') {\n    JSON = {};\n}\n\n(function () {\n    'use strict';\n    \n    var rx_one = /^[\\],:{}\\s]*$/,\n        rx_two = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\n        rx_three = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\n        rx_four = /(?:^|:|,)(?:\\s*\\[)+/g,\n        rx_escapable = /[\\\\\\\"\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n        rx_dangerous = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n    function f(n) {\n        // Format integers to have at least two digits.\n        return n < 10 \n            ? '0' + n \n            : n;\n    }\n    \n    function this_value() {\n        return this.valueOf();\n    }\n\n    if (typeof Date.prototype.toJSON !== 'function') {\n\n        Date.prototype.toJSON = function () {\n\n            return isFinite(this.valueOf())\n                ? this.getUTCFullYear() + '-' +\n                        f(this.getUTCMonth() + 1) + '-' +\n                        f(this.getUTCDate()) + 'T' +\n                        f(this.getUTCHours()) + ':' +\n                        f(this.getUTCMinutes()) + ':' +\n                        f(this.getUTCSeconds()) + 'Z'\n                : null;\n        };\n\n        Boolean.prototype.toJSON = this_value;\n        Number.prototype.toJSON = this_value;\n        String.prototype.toJSON = this_value;\n    }\n\n    var gap,\n        indent,\n        meta,\n        rep;\n\n\n    function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n        rx_escapable.lastIndex = 0;\n        return rx_escapable.test(string) \n            ? '\"' + string.replace(rx_escapable, function (a) {\n                var c = meta[a];\n                return typeof c === 'string'\n                    ? c\n                    : '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n            }) + '\"' \n            : '\"' + string + '\"';\n    }\n\n\n    function str(key, holder) {\n\n// Produce a string from holder[key].\n\n        var i,          // The loop counter.\n            k,          // The member key.\n            v,          // The member value.\n            length,\n            mind = gap,\n            partial,\n            value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n        if (value && typeof value === 'object' &&\n                typeof value.toJSON === 'function') {\n            value = value.toJSON(key);\n        }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n        if (typeof rep === 'function') {\n            value = rep.call(holder, key, value);\n        }\n\n// What happens next depends on the value's type.\n\n        switch (typeof value) {\n        case 'string':\n            return quote(value);\n\n        case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n            return isFinite(value) \n                ? String(value) \n                : 'null';\n\n        case 'boolean':\n        case 'null':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n            return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n        case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n            if (!value) {\n                return 'null';\n            }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n            gap += indent;\n            partial = [];\n\n// Is the value an array?\n\n            if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n                length = value.length;\n                for (i = 0; i < length; i += 1) {\n                    partial[i] = str(i, value) || 'null';\n                }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n                v = partial.length === 0\n                    ? '[]'\n                    : gap\n                        ? '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']'\n                        : '[' + partial.join(',') + ']';\n                gap = mind;\n                return v;\n            }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n            if (rep && typeof rep === 'object') {\n                length = rep.length;\n                for (i = 0; i < length; i += 1) {\n                    if (typeof rep[i] === 'string') {\n                        k = rep[i];\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (\n                                gap \n                                    ? ': ' \n                                    : ':'\n                            ) + v);\n                        }\n                    }\n                }\n            } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n                for (k in value) {\n                    if (Object.prototype.hasOwnProperty.call(value, k)) {\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (\n                                gap \n                                    ? ': ' \n                                    : ':'\n                            ) + v);\n                        }\n                    }\n                }\n            }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n            v = partial.length === 0\n                ? '{}'\n                : gap\n                    ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}'\n                    : '{' + partial.join(',') + '}';\n            gap = mind;\n            return v;\n        }\n    }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n    if (typeof JSON.stringify !== 'function') {\n        meta = {    // table of character substitutions\n            '\\b': '\\\\b',\n            '\\t': '\\\\t',\n            '\\n': '\\\\n',\n            '\\f': '\\\\f',\n            '\\r': '\\\\r',\n            '\"': '\\\\\"',\n            '\\\\': '\\\\\\\\'\n        };\n        JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n            var i;\n            gap = '';\n            indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n            if (typeof space === 'number') {\n                for (i = 0; i < space; i += 1) {\n                    indent += ' ';\n                }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n            } else if (typeof space === 'string') {\n                indent = space;\n            }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n            rep = replacer;\n            if (replacer && typeof replacer !== 'function' &&\n                    (typeof replacer !== 'object' ||\n                    typeof replacer.length !== 'number')) {\n                throw new Error('JSON.stringify');\n            }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n            return str('', {'': value});\n        };\n    }\n\n\n// If the JSON object does not yet have a parse method, give it one.\n\n    if (typeof JSON.parse !== 'function') {\n        JSON.parse = function (text, reviver) {\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n            var j;\n\n            function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n                var k, v, value = holder[key];\n                if (value && typeof value === 'object') {\n                    for (k in value) {\n                        if (Object.prototype.hasOwnProperty.call(value, k)) {\n                            v = walk(value, k);\n                            if (v !== undefined) {\n                                value[k] = v;\n                            } else {\n                                delete value[k];\n                            }\n                        }\n                    }\n                }\n                return reviver.call(holder, key, value);\n            }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n            text = String(text);\n            rx_dangerous.lastIndex = 0;\n            if (rx_dangerous.test(text)) {\n                text = text.replace(rx_dangerous, function (a) {\n                    return '\\\\u' +\n                            ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n                });\n            }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with '()' and 'new'\n// because they can cause invocation, and '=' because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n// replace all simple value tokens with ']' characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or ']' or\n// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n            if (\n                rx_one.test(\n                    text\n                        .replace(rx_two, '@')\n                        .replace(rx_three, ']')\n                        .replace(rx_four, '')\n                )\n            ) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n                j = eval('(' + text + ')');\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n                return typeof reviver === 'function'\n                    ? walk({'': j}, '')\n                    : j;\n            }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n            throw new SyntaxError('JSON.parse');\n        };\n    }\n}());"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/mce-view.js",
    "content": "/* global tinymce */\n\n/*\n * The TinyMCE view API.\n *\n * Note: this API is \"experimental\" meaning that it will probably change\n * in the next few releases based on feedback from 3.9.0.\n * If you decide to use it, please follow the development closely.\n *\n * Diagram\n *\n * |- registered view constructor (type)\n * |  |- view instance (unique text)\n * |  |  |- editor 1\n * |  |  |  |- view node\n * |  |  |  |- view node\n * |  |  |  |- ...\n * |  |  |- editor 2\n * |  |  |  |- ...\n * |  |- view instance\n * |  |  |- ...\n * |- registered view\n * |  |- ...\n */\n( function( window, wp, shortcode, $ ) {\n\t'use strict';\n\n\tvar views = {},\n\t\tinstances = {};\n\n\twp.mce = wp.mce || {};\n\n\t/**\n\t * wp.mce.views\n\t *\n\t * A set of utilities that simplifies adding custom UI within a TinyMCE editor.\n\t * At its core, it serves as a series of converters, transforming text to a\n\t * custom UI, and back again.\n\t */\n\twp.mce.views = {\n\n\t\t/**\n\t\t * Registers a new view type.\n\t\t *\n\t\t * @param {String} type   The view type.\n\t\t * @param {Object} extend An object to extend wp.mce.View.prototype with.\n\t\t */\n\t\tregister: function( type, extend ) {\n\t\t\tviews[ type ] = wp.mce.View.extend( _.extend( extend, { type: type } ) );\n\t\t},\n\n\t\t/**\n\t\t * Unregisters a view type.\n\t\t *\n\t\t * @param {String} type The view type.\n\t\t */\n\t\tunregister: function( type ) {\n\t\t\tdelete views[ type ];\n\t\t},\n\n\t\t/**\n\t\t * Returns the settings of a view type.\n\t\t *\n\t\t * @param {String} type The view type.\n\t\t *\n\t\t * @return {Function} The view constructor.\n\t\t */\n\t\tget: function( type ) {\n\t\t\treturn views[ type ];\n\t\t},\n\n\t\t/**\n\t\t * Unbinds all view nodes.\n\t\t * Runs before removing all view nodes from the DOM.\n\t\t */\n\t\tunbind: function() {\n\t\t\t_.each( instances, function( instance ) {\n\t\t\t\tinstance.unbind();\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Scans a given string for each view's pattern,\n\t\t * replacing any matches with markers,\n\t\t * and creates a new instance for every match.\n\t\t *\n\t\t * @param {String} content The string to scan.\n\t\t *\n\t\t * @return {String} The string with markers.\n\t\t */\n\t\tsetMarkers: function( content ) {\n\t\t\tvar pieces = [ { content: content } ],\n\t\t\t\tself = this,\n\t\t\t\tinstance, current;\n\n\t\t\t_.each( views, function( view, type ) {\n\t\t\t\tcurrent = pieces.slice();\n\t\t\t\tpieces  = [];\n\n\t\t\t\t_.each( current, function( piece ) {\n\t\t\t\t\tvar remaining = piece.content,\n\t\t\t\t\t\tresult, text;\n\n\t\t\t\t\t// Ignore processed pieces, but retain their location.\n\t\t\t\t\tif ( piece.processed ) {\n\t\t\t\t\t\tpieces.push( piece );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Iterate through the string progressively matching views\n\t\t\t\t\t// and slicing the string as we go.\n\t\t\t\t\twhile ( remaining && ( result = view.prototype.match( remaining ) ) ) {\n\t\t\t\t\t\t// Any text before the match becomes an unprocessed piece.\n\t\t\t\t\t\tif ( result.index ) {\n\t\t\t\t\t\t\tpieces.push( { content: remaining.substring( 0, result.index ) } );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinstance = self.createInstance( type, result.content, result.options );\n\t\t\t\t\t\ttext = instance.loader ? '.' : instance.text;\n\n\t\t\t\t\t\t// Add the processed piece for the match.\n\t\t\t\t\t\tpieces.push( {\n\t\t\t\t\t\t\tcontent: instance.ignore ? text : '<p data-wpview-marker=\"' + instance.encodedText + '\">' + text + '</p>',\n\t\t\t\t\t\t\tprocessed: true\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t// Update the remaining content.\n\t\t\t\t\t\tremaining = remaining.slice( result.index + result.content.length );\n\t\t\t\t\t}\n\n\t\t\t\t\t// There are no additional matches.\n\t\t\t\t\t// If any content remains, add it as an unprocessed piece.\n\t\t\t\t\tif ( remaining ) {\n\t\t\t\t\t\tpieces.push( { content: remaining } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tcontent = _.pluck( pieces, 'content' ).join( '' );\n\t\t\treturn content.replace( /<p>\\s*<p data-wpview-marker=/g, '<p data-wpview-marker=' ).replace( /<\\/p>\\s*<\\/p>/g, '</p>' );\n\t\t},\n\n\t\t/**\n\t\t * Create a view instance.\n\t\t *\n\t\t * @param {String}  type    The view type.\n\t\t * @param {String}  text    The textual representation of the view.\n\t\t * @param {Object}  options Options.\n\t\t * @param {Boolean} force   Recreate the instance. Optional.\n\t\t *\n\t\t * @return {wp.mce.View} The view instance.\n\t\t */\n\t\tcreateInstance: function( type, text, options, force ) {\n\t\t\tvar View = this.get( type ),\n\t\t\t\tencodedText,\n\t\t\t\tinstance;\n\n\t\t\ttext = tinymce.DOM.decode( text );\n\n\t\t\tif ( ! force ) {\n\t\t\t\tinstance = this.getInstance( text );\n\n\t\t\t\tif ( instance ) {\n\t\t\t\t\treturn instance;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tencodedText = encodeURIComponent( text );\n\n\t\t\toptions = _.extend( options || {}, {\n\t\t\t\ttext: text,\n\t\t\t\tencodedText: encodedText\n\t\t\t} );\n\n\t\t\treturn instances[ encodedText ] = new View( options );\n\t\t},\n\n\t\t/**\n\t\t * Get a view instance.\n\t\t *\n\t\t * @param {(String|HTMLElement)} object The textual representation of the view or the view node.\n\t\t *\n\t\t * @return {wp.mce.View} The view instance or undefined.\n\t\t */\n\t\tgetInstance: function( object ) {\n\t\t\tif ( typeof object === 'string' ) {\n\t\t\t\treturn instances[ encodeURIComponent( object ) ];\n\t\t\t}\n\n\t\t\treturn instances[ $( object ).attr( 'data-wpview-text' ) ];\n\t\t},\n\n\t\t/**\n\t\t * Given a view node, get the view's text.\n\t\t *\n\t\t * @param {HTMLElement} node The view node.\n\t\t *\n\t\t * @return {String} The textual representation of the view.\n\t\t */\n\t\tgetText: function( node ) {\n\t\t\treturn decodeURIComponent( $( node ).attr( 'data-wpview-text' ) || '' );\n\t\t},\n\n\t\t/**\n\t\t * Renders all view nodes that are not yet rendered.\n\t\t *\n\t\t * @param {Boolean} force Rerender all view nodes.\n\t\t */\n\t\trender: function( force ) {\n\t\t\t_.each( instances, function( instance ) {\n\t\t\t\tinstance.render( force );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Update the text of a given view node.\n\t\t *\n\t\t * @param {String}         text   The new text.\n\t\t * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in.\n\t\t * @param {HTMLElement}    node   The view node to update.\n\t\t * @param {Boolean}        force  Recreate the instance. Optional.\n\t\t */\n\t\tupdate: function( text, editor, node, force ) {\n\t\t\tvar instance = this.getInstance( node );\n\n\t\t\tif ( instance ) {\n\t\t\t\tinstance.update( text, editor, node, force );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Renders any editing interface based on the view type.\n\t\t *\n\t\t * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in.\n\t\t * @param {HTMLElement}    node   The view node to edit.\n\t\t */\n\t\tedit: function( editor, node ) {\n\t\t\tvar instance = this.getInstance( node );\n\n\t\t\tif ( instance && instance.edit ) {\n\t\t\t\tinstance.edit( instance.text, function( text, force ) {\n\t\t\t\t\tinstance.update( text, editor, node, force );\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove a given view node from the DOM.\n\t\t *\n\t\t * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in.\n\t\t * @param {HTMLElement}    node   The view node to remove.\n\t\t */\n\t\tremove: function( editor, node ) {\n\t\t\tvar instance = this.getInstance( node );\n\n\t\t\tif ( instance ) {\n\t\t\t\tinstance.remove( editor, node );\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * A Backbone-like View constructor intended for use when rendering a TinyMCE View.\n\t * The main difference is that the TinyMCE View is not tied to a particular DOM node.\n\t *\n\t * @param {Object} options Options.\n\t */\n\twp.mce.View = function( options ) {\n\t\t_.extend( this, options );\n\t\tthis.initialize();\n\t};\n\n\twp.mce.View.extend = Backbone.View.extend;\n\n\t_.extend( wp.mce.View.prototype, {\n\n\t\t/**\n\t\t * The content.\n\t\t *\n\t\t * @type {*}\n\t\t */\n\t\tcontent: null,\n\n\t\t/**\n\t\t * Whether or not to display a loader.\n\t\t *\n\t\t * @type {Boolean}\n\t\t */\n\t\tloader: true,\n\n\t\t/**\n\t\t * Runs after the view instance is created.\n\t\t */\n\t\tinitialize: function() {},\n\n\t\t/**\n\t\t * Retuns the content to render in the view node.\n\t\t *\n\t\t * @return {*}\n\t\t */\n\t\tgetContent: function() {\n\t\t\treturn this.content;\n\t\t},\n\n\t\t/**\n\t\t * Renders all view nodes tied to this view instance that are not yet rendered.\n\t\t *\n\t\t * @param {String}  content The content to render. Optional.\n\t\t * @param {Boolean} force   Rerender all view nodes tied to this view instance. Optional.\n\t\t */\n\t\trender: function( content, force ) {\n\t\t\tif ( content != null ) {\n\t\t\t\tthis.content = content;\n\t\t\t}\n\n\t\t\tcontent = this.getContent();\n\n\t\t\t// If there's nothing to render an no loader needs to be shown, stop.\n\t\t\tif ( ! this.loader && ! content ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// We're about to rerender all views of this instance, so unbind rendered views.\n\t\t\tforce && this.unbind();\n\n\t\t\t// Replace any left over markers.\n\t\t\tthis.replaceMarkers();\n\n\t\t\tif ( content ) {\n\t\t\t\tthis.setContent( content, function( editor, node, contentNode ) {\n\t\t\t\t\t$( node ).data( 'rendered', true );\n\t\t\t\t\tthis.bindNode.call( this, editor, node, contentNode );\n\t\t\t\t}, force ? null : false );\n\t\t\t} else {\n\t\t\t\tthis.setLoader();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Binds a given node after its content is added to the DOM.\n\t\t */\n\t\tbindNode: function() {},\n\n\t\t/**\n\t\t * Unbinds a given node before its content is removed from the DOM.\n\t\t */\n\t\tunbindNode: function() {},\n\n\t\t/**\n\t\t * Unbinds all view nodes tied to this view instance.\n\t\t * Runs before their content is removed from the DOM.\n\t\t */\n\t\tunbind: function() {\n\t\t\tthis.getNodes( function( editor, node, contentNode ) {\n\t\t\t\tthis.unbindNode.call( this, editor, node, contentNode );\n\t\t\t\t$( node ).trigger( 'wp-mce-view-unbind' );\n\t\t\t}, true );\n\t\t},\n\n\t\t/**\n\t\t * Gets all the TinyMCE editor instances that support views.\n\t\t *\n\t\t * @param {Function} callback A callback.\n\t\t */\n\t\tgetEditors: function( callback ) {\n\t\t\t_.each( tinymce.editors, function( editor ) {\n\t\t\t\tif ( editor.plugins.wpview ) {\n\t\t\t\t\tcallback.call( this, editor );\n\t\t\t\t}\n\t\t\t}, this );\n\t\t},\n\n\t\t/**\n\t\t * Gets all view nodes tied to this view instance.\n\t\t *\n\t\t * @param {Function} callback A callback.\n\t\t * @param {Boolean}  rendered Get (un)rendered view nodes. Optional.\n\t\t */\n\t\tgetNodes: function( callback, rendered ) {\n\t\t\tthis.getEditors( function( editor ) {\n\t\t\t\tvar self = this;\n\n\t\t\t\t$( editor.getBody() )\n\t\t\t\t\t.find( '[data-wpview-text=\"' + self.encodedText + '\"]' )\n\t\t\t\t\t.filter( function() {\n\t\t\t\t\t\tvar data;\n\n\t\t\t\t\t\tif ( rendered == null ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = $( this ).data( 'rendered' ) === true;\n\n\t\t\t\t\t\treturn rendered ? data : ! data;\n\t\t\t\t\t} )\n\t\t\t\t\t.each( function() {\n\t\t\t\t\t\tcallback.call( self, editor, this, $( this ).find( '.wpview-content' ).get( 0 ) );\n\t\t\t\t\t} );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Gets all marker nodes tied to this view instance.\n\t\t *\n\t\t * @param {Function} callback A callback.\n\t\t */\n\t\tgetMarkers: function( callback ) {\n\t\t\tthis.getEditors( function( editor ) {\n\t\t\t\tvar self = this;\n\n\t\t\t\t$( editor.getBody() )\n\t\t\t\t\t.find( '[data-wpview-marker=\"' + this.encodedText + '\"]' )\n\t\t\t\t\t.each( function() {\n\t\t\t\t\t\tcallback.call( self, editor, this );\n\t\t\t\t\t} );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Replaces all marker nodes tied to this view instance.\n\t\t */\n\t\treplaceMarkers: function() {\n\t\t\tthis.getMarkers( function( editor, node ) {\n\t\t\t\tvar selected = node === editor.selection.getNode(),\n\t\t\t\t\t$viewNode;\n\n\t\t\t\tif ( ! this.loader && $( node ).text() !== this.text ) {\n\t\t\t\t\teditor.dom.setAttrib( node, 'data-wpview-marker', null );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$viewNode = editor.$(\n\t\t\t\t\t'<div class=\"wpview-wrap\" data-wpview-text=\"' + this.encodedText + '\" data-wpview-type=\"' + this.type + '\">' +\n\t\t\t\t\t\t'<p class=\"wpview-selection-before\">\\u00a0</p>' +\n\t\t\t\t\t\t'<div class=\"wpview-body\" contenteditable=\"false\">' +\n\t\t\t\t\t\t\t'<div class=\"wpview-content wpview-type-' + this.type + '\"></div>' +\n\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t\t'<p class=\"wpview-selection-after\">\\u00a0</p>' +\n\t\t\t\t\t'</div>'\n\t\t\t\t);\n\n\t\t\t\teditor.$( node ).replaceWith( $viewNode );\n\n\t\t\t\tif ( selected ) {\n\t\t\t\t\teditor.wp.setViewCursor( false, $viewNode[0] );\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Removes all marker nodes tied to this view instance.\n\t\t */\n\t\tremoveMarkers: function() {\n\t\t\tthis.getMarkers( function( editor, node ) {\n\t\t\t\teditor.dom.setAttrib( node, 'data-wpview-marker', null );\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Sets the content for all view nodes tied to this view instance.\n\t\t *\n\t\t * @param {*}        content  The content to set.\n\t\t * @param {Function} callback A callback. Optional.\n\t\t * @param {Boolean}  rendered Only set for (un)rendered nodes. Optional.\n\t\t */\n\t\tsetContent: function( content, callback, rendered ) {\n\t\t\tif ( _.isObject( content ) && content.body.indexOf( '<script' ) !== -1 ) {\n\t\t\t\tthis.setIframes( content.head || '', content.body, callback, rendered );\n\t\t\t} else if ( _.isString( content ) && content.indexOf( '<script' ) !== -1 ) {\n\t\t\t\tthis.setIframes( '', content, callback, rendered );\n\t\t\t} else {\n\t\t\t\tthis.getNodes( function( editor, node, contentNode ) {\n\t\t\t\t\tcontent = content.body || content;\n\n\t\t\t\t\tif ( content.indexOf( '<iframe' ) !== -1 ) {\n\t\t\t\t\t\tcontent += '<div class=\"wpview-overlay\"></div>';\n\t\t\t\t\t}\n\n\t\t\t\t\tcontentNode.innerHTML = '';\n\t\t\t\t\tcontentNode.appendChild( _.isString( content ) ? editor.dom.createFragment( content ) : content );\n\n\t\t\t\t\tcallback && callback.call( this, editor, node, contentNode );\n\t\t\t\t}, rendered );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Sets the content in an iframe for all view nodes tied to this view instance.\n\t\t *\n\t\t * @param {String}   head     HTML string to be added to the head of the document.\n\t\t * @param {String}   body     HTML string to be added to the body of the document.\n\t\t * @param {Function} callback A callback. Optional.\n\t\t * @param {Boolean}  rendered Only set for (un)rendered nodes. Optional.\n\t\t */\n\t\tsetIframes: function( head, body, callback, rendered ) {\n\t\t\tvar MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,\n\t\t\t\tself = this;\n\n\t\t\tthis.getNodes( function( editor, node, contentNode ) {\n\t\t\t\tvar dom = editor.dom,\n\t\t\t\t\tstyles = '',\n\t\t\t\t\tbodyClasses = editor.getBody().className || '',\n\t\t\t\t\teditorHead = editor.getDoc().getElementsByTagName( 'head' )[0];\n\n\t\t\t\ttinymce.each( dom.$( 'link[rel=\"stylesheet\"]', editorHead ), function( link ) {\n\t\t\t\t\tif ( link.href && link.href.indexOf( 'skins/lightgray/content.min.css' ) === -1 &&\n\t\t\t\t\t\tlink.href.indexOf( 'skins/wordpress/wp-content.css' ) === -1 ) {\n\n\t\t\t\t\t\tstyles += dom.getOuterHTML( link );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( self.iframeHeight ) {\n\t\t\t\t\tdom.add( contentNode, 'div', { style: {\n\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\theight: self.iframeHeight\n\t\t\t\t\t} } );\n\t\t\t\t}\n\n\t\t\t\t// Seems the browsers need a bit of time to insert/set the view nodes,\n\t\t\t\t// or the iframe will fail especially when switching Text => Visual.\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tvar iframe, iframeDoc, observer, i, block;\n\n\t\t\t\t\tcontentNode.innerHTML = '';\n\n\t\t\t\t\tiframe = dom.add( contentNode, 'iframe', {\n\t\t\t\t\t\t/* jshint scripturl: true */\n\t\t\t\t\t\tsrc: tinymce.Env.ie ? 'javascript:\"\"' : '',\n\t\t\t\t\t\tframeBorder: '0',\n\t\t\t\t\t\tallowTransparency: 'true',\n\t\t\t\t\t\tscrolling: 'no',\n\t\t\t\t\t\t'class': 'wpview-sandbox',\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\tdisplay: 'block'\n\t\t\t\t\t\t},\n\t\t\t\t\t\theight: self.iframeHeight\n\t\t\t\t\t} );\n\n\t\t\t\t\tdom.add( contentNode, 'div', { 'class': 'wpview-overlay' } );\n\n\t\t\t\t\tiframeDoc = iframe.contentWindow.document;\n\n\t\t\t\t\tiframeDoc.open();\n\n\t\t\t\t\tiframeDoc.write(\n\t\t\t\t\t\t'<!DOCTYPE html>' +\n\t\t\t\t\t\t'<html>' +\n\t\t\t\t\t\t\t'<head>' +\n\t\t\t\t\t\t\t\t'<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />' +\n\t\t\t\t\t\t\t\thead +\n\t\t\t\t\t\t\t\tstyles +\n\t\t\t\t\t\t\t\t'<style>' +\n\t\t\t\t\t\t\t\t\t'html {' +\n\t\t\t\t\t\t\t\t\t\t'background: transparent;' +\n\t\t\t\t\t\t\t\t\t\t'padding: 0;' +\n\t\t\t\t\t\t\t\t\t\t'margin: 0;' +\n\t\t\t\t\t\t\t\t\t'}' +\n\t\t\t\t\t\t\t\t\t'body#wpview-iframe-sandbox {' +\n\t\t\t\t\t\t\t\t\t\t'background: transparent;' +\n\t\t\t\t\t\t\t\t\t\t'padding: 1px 0 !important;' +\n\t\t\t\t\t\t\t\t\t\t'margin: -1px 0 0 !important;' +\n\t\t\t\t\t\t\t\t\t'}' +\n\t\t\t\t\t\t\t\t\t'body#wpview-iframe-sandbox:before,' +\n\t\t\t\t\t\t\t\t\t'body#wpview-iframe-sandbox:after {' +\n\t\t\t\t\t\t\t\t\t\t'display: none;' +\n\t\t\t\t\t\t\t\t\t\t'content: \"\";' +\n\t\t\t\t\t\t\t\t\t'}' +\n\t\t\t\t\t\t\t\t'</style>' +\n\t\t\t\t\t\t\t'</head>' +\n\t\t\t\t\t\t\t'<body id=\"wpview-iframe-sandbox\" class=\"' + bodyClasses + '\">' +\n\t\t\t\t\t\t\t\tbody +\n\t\t\t\t\t\t\t'</body>' +\n\t\t\t\t\t\t'</html>'\n\t\t\t\t\t);\n\n\t\t\t\t\tiframeDoc.close();\n\n\t\t\t\t\tfunction resize() {\n\t\t\t\t\t\tvar $iframe;\n\n\t\t\t\t\t\tif ( block ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Make sure the iframe still exists.\n\t\t\t\t\t\tif ( iframe.contentWindow ) {\n\t\t\t\t\t\t\t$iframe = $( iframe );\n\t\t\t\t\t\t\tself.iframeHeight = $( iframeDoc.body ).height();\n\n\t\t\t\t\t\t\tif ( $iframe.height() !== self.iframeHeight ) {\n\t\t\t\t\t\t\t\t$iframe.height( self.iframeHeight );\n\t\t\t\t\t\t\t\teditor.nodeChanged();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( self.iframeHeight ) {\n\t\t\t\t\t\tblock = true;\n\n\t\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t\tblock = false;\n\t\t\t\t\t\t\tresize();\n\t\t\t\t\t\t}, 3000 );\n\t\t\t\t\t}\n\n\t\t\t\t\t$( iframe.contentWindow ).on( 'load', resize );\n\n\t\t\t\t\tif ( MutationObserver ) {\n\t\t\t\t\t\tobserver = new MutationObserver( _.debounce( resize, 100 ) );\n\n\t\t\t\t\t\tobserver.observe( iframeDoc.body, {\n\t\t\t\t\t\t\tattributes: true,\n\t\t\t\t\t\t\tchildList: true,\n\t\t\t\t\t\t\tsubtree: true\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t$( node ).one( 'wp-mce-view-unbind', function() {\n\t\t\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor ( i = 1; i < 6; i++ ) {\n\t\t\t\t\t\t\tsetTimeout( resize, i * 700 );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction classChange() {\n\t\t\t\t\t\tiframeDoc.body.className = editor.getBody().className;\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.on( 'wp-body-class-change', classChange );\n\n\t\t\t\t\t$( node ).one( 'wp-mce-view-unbind', function() {\n\t\t\t\t\t\teditor.off( 'wp-body-class-change', classChange );\n\t\t\t\t\t} );\n\n\t\t\t\t\tcallback && callback.call( self, editor, node, contentNode );\n\t\t\t\t}, 50 );\n\t\t\t}, rendered );\n\t\t},\n\n\t\t/**\n\t\t * Sets a loader for all view nodes tied to this view instance.\n\t\t */\n\t\tsetLoader: function() {\n\t\t\tthis.setContent(\n\t\t\t\t'<div class=\"loading-placeholder\">' +\n\t\t\t\t\t'<div class=\"dashicons dashicons-admin-media\"></div>' +\n\t\t\t\t\t'<div class=\"wpview-loading\"><ins></ins></div>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Sets an error for all view nodes tied to this view instance.\n\t\t *\n\t\t * @param {String} message  The error message to set.\n\t\t * @param {String} dashicon A dashicon ID. Optional. {@link https://developer.wordpress.org/resource/dashicons/}\n\t\t */\n\t\tsetError: function( message, dashicon ) {\n\t\t\tthis.setContent(\n\t\t\t\t'<div class=\"wpview-error\">' +\n\t\t\t\t\t'<div class=\"dashicons dashicons-' + ( dashicon || 'no' ) + '\"></div>' +\n\t\t\t\t\t'<p>' + message + '</p>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Tries to find a text match in a given string.\n\t\t *\n\t\t * @param {String} content The string to scan.\n\t\t *\n\t\t * @return {Object}\n\t\t */\n\t\tmatch: function( content ) {\n\t\t\tvar match = shortcode.next( this.type, content );\n\n\t\t\tif ( match ) {\n\t\t\t\treturn {\n\t\t\t\t\tindex: match.index,\n\t\t\t\t\tcontent: match.content,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tshortcode: match.shortcode\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Update the text of a given view node.\n\t\t *\n\t\t * @param {String}         text   The new text.\n\t\t * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in.\n\t\t * @param {HTMLElement}    node   The view node to update.\n\t\t * @param {Boolean}        force  Recreate the instance. Optional.\n\t\t */\n\t\tupdate: function( text, editor, node, force ) {\n\t\t\t_.find( views, function( view, type ) {\n\t\t\t\tvar match = view.prototype.match( text );\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\t$( node ).data( 'rendered', false );\n\t\t\t\t\teditor.dom.setAttrib( node, 'data-wpview-text', encodeURIComponent( text ) );\n\t\t\t\t\twp.mce.views.createInstance( type, text, match.options, force ).render();\n\t\t\t\t\teditor.focus();\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} );\n\t\t},\n\n\t\t/**\n\t\t * Remove a given view node from the DOM.\n\t\t *\n\t\t * @param {tinymce.Editor} editor The TinyMCE editor instance the view node is in.\n\t\t * @param {HTMLElement}    node   The view node to remove.\n\t\t */\n\t\tremove: function( editor, node ) {\n\t\t\tthis.unbindNode.call( this, editor, node, $( node ).find( '.wpview-content' ).get( 0 ) );\n\t\t\t$( node ).trigger( 'wp-mce-view-unbind' );\n\t\t\teditor.dom.remove( node );\n\t\t\teditor.focus();\n\t\t}\n\t} );\n} )( window, window.wp, window.wp.shortcode, window.jQuery );\n\n/*\n * The WordPress core TinyMCE views.\n * Views for the gallery, audio, video, playlist and embed shortcodes,\n * and a view for embeddable URLs.\n */\n( function( window, views, media, $ ) {\n\tvar base, gallery, av, embed,\n\t\tschema, parser, serializer;\n\n\tfunction verifyHTML( string ) {\n\t\tvar settings = {};\n\n\t\tif ( ! window.tinymce ) {\n\t\t\treturn string.replace( /<[^>]+>/g, '' );\n\t\t}\n\n\t\tif ( ! string || ( string.indexOf( '<' ) === -1 && string.indexOf( '>' ) === -1 ) ) {\n\t\t\treturn string;\n\t\t}\n\n\t\tschema = schema || new window.tinymce.html.Schema( settings );\n\t\tparser = parser || new window.tinymce.html.DomParser( settings, schema );\n\t\tserializer = serializer || new window.tinymce.html.Serializer( settings, schema );\n\n\t\treturn serializer.serialize( parser.parse( string, { forced_root_block: false } ) );\n\t}\n\n\tbase = {\n\t\tstate: [],\n\n\t\tedit: function( text, update ) {\n\t\t\tvar type = this.type,\n\t\t\t\tframe = media[ type ].edit( text );\n\n\t\t\tthis.pausePlayers && this.pausePlayers();\n\n\t\t\t_.each( this.state, function( state ) {\n\t\t\t\tframe.state( state ).on( 'update', function( selection ) {\n\t\t\t\t\tupdate( media[ type ].shortcode( selection ).string(), type === 'gallery' );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\tframe.on( 'close', function() {\n\t\t\t\tframe.detach();\n\t\t\t} );\n\n\t\t\tframe.open();\n\t\t}\n\t};\n\n\tgallery = _.extend( {}, base, {\n\t\tstate: [ 'gallery-edit' ],\n\t\ttemplate: media.template( 'editor-gallery' ),\n\n\t\tinitialize: function() {\n\t\t\tvar attachments = media.gallery.attachments( this.shortcode, media.view.settings.post.id ),\n\t\t\t\tattrs = this.shortcode.attrs.named,\n\t\t\t\tself = this;\n\n\t\t\tattachments.more()\n\t\t\t.done( function() {\n\t\t\t\tattachments = attachments.toJSON();\n\n\t\t\t\t_.each( attachments, function( attachment ) {\n\t\t\t\t\tif ( attachment.sizes ) {\n\t\t\t\t\t\tif ( attrs.size && attachment.sizes[ attrs.size ] ) {\n\t\t\t\t\t\t\tattachment.thumbnail = attachment.sizes[ attrs.size ];\n\t\t\t\t\t\t} else if ( attachment.sizes.thumbnail ) {\n\t\t\t\t\t\t\tattachment.thumbnail = attachment.sizes.thumbnail;\n\t\t\t\t\t\t} else if ( attachment.sizes.full ) {\n\t\t\t\t\t\t\tattachment.thumbnail = attachment.sizes.full;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tself.render( self.template( {\n\t\t\t\t\tverifyHTML: verifyHTML,\n\t\t\t\t\tattachments: attachments,\n\t\t\t\t\tcolumns: attrs.columns ? parseInt( attrs.columns, 10 ) : media.galleryDefaults.columns\n\t\t\t\t} ) );\n\t\t\t} )\n\t\t\t.fail( function( jqXHR, textStatus ) {\n\t\t\t\tself.setError( textStatus );\n\t\t\t} );\n\t\t}\n\t} );\n\n\tav = _.extend( {}, base, {\n\t\taction: 'parse-media-shortcode',\n\n\t\tinitialize: function() {\n\t\t\tvar self = this;\n\n\t\t\tif ( this.url ) {\n\t\t\t\tthis.loader = false;\n\t\t\t\tthis.shortcode = media.embed.shortcode( {\n\t\t\t\t\turl: this.text\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\twp.ajax.post( this.action, {\n\t\t\t\tpost_ID: media.view.settings.post.id,\n\t\t\t\ttype: this.shortcode.tag,\n\t\t\t\tshortcode: this.shortcode.string()\n\t\t\t} )\n\t\t\t.done( function( response ) {\n\t\t\t\tself.render( response );\n\t\t\t} )\n\t\t\t.fail( function( response ) {\n\t\t\t\tif ( self.url ) {\n\t\t\t\t\tself.ignore = true;\n\t\t\t\t\tself.removeMarkers();\n\t\t\t\t} else {\n\t\t\t\t\tself.setError( response.message || response.statusText, 'admin-media' );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.getEditors( function( editor ) {\n\t\t\t\teditor.on( 'wpview-selected', function() {\n\t\t\t\t\tself.pausePlayers();\n\t\t\t\t} );\n\t\t\t} );\n\t\t},\n\n\t\tpausePlayers: function() {\n\t\t\tthis.getNodes( function( editor, node, content ) {\n\t\t\t\tvar win = $( 'iframe.wpview-sandbox', content ).get( 0 );\n\n\t\t\t\tif ( win && ( win = win.contentWindow ) && win.mejs ) {\n\t\t\t\t\t_.each( win.mejs.players, function( player ) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tplayer.pause();\n\t\t\t\t\t\t} catch ( e ) {}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t} );\n\n\tembed = _.extend( {}, av, {\n\t\taction: 'parse-embed',\n\n\t\tedit: function( text, update ) {\n\t\t\tvar frame = media.embed.edit( text, this.url ),\n\t\t\t\tself = this;\n\n\t\t\tthis.pausePlayers();\n\n\t\t\tframe.state( 'embed' ).props.on( 'change:url', function( model, url ) {\n\t\t\t\tif ( url && model.get( 'url' ) ) {\n\t\t\t\t\tframe.state( 'embed' ).metadata = model.toJSON();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tframe.state( 'embed' ).on( 'select', function() {\n\t\t\t\tvar data = frame.state( 'embed' ).metadata;\n\n\t\t\t\tif ( self.url ) {\n\t\t\t\t\tupdate( data.url );\n\t\t\t\t} else {\n\t\t\t\t\tupdate( media.embed.shortcode( data ).string() );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tframe.on( 'close', function() {\n\t\t\t\tframe.detach();\n\t\t\t} );\n\n\t\t\tframe.open();\n\t\t}\n\t} );\n\n\tviews.register( 'gallery', _.extend( {}, gallery ) );\n\n\tviews.register( 'audio', _.extend( {}, av, {\n\t\tstate: [ 'audio-details' ]\n\t} ) );\n\n\tviews.register( 'video', _.extend( {}, av, {\n\t\tstate: [ 'video-details' ]\n\t} ) );\n\n\tviews.register( 'playlist', _.extend( {}, av, {\n\t\tstate: [ 'playlist-edit', 'video-playlist-edit' ]\n\t} ) );\n\n\tviews.register( 'embed', _.extend( {}, embed ) );\n\n\tviews.register( 'embedURL', _.extend( {}, embed, {\n\t\tmatch: function( content ) {\n\t\t\tvar re = /(^|<p>)(https?:\\/\\/[^\\s\"]+?)(<\\/p>\\s*|$)/gi,\n\t\t\t\tmatch = re.exec( content );\n\n\t\t\tif ( match ) {\n\t\t\t\treturn {\n\t\t\t\t\tindex: match.index + match[1].length,\n\t\t\t\t\tcontent: match[2],\n\t\t\t\t\toptions: {\n\t\t\t\t\t\turl: true\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t} ) );\n} )( window, window.wp.mce.views, window.wp.media, window.jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/media-audiovideo.js",
    "content": "(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(require,module,exports){\nvar media = wp.media,\n\tbaseSettings = window._wpmejsSettings || {},\n\tl10n = window._wpMediaViewsL10n || {};\n\n/**\n * @mixin\n */\nwp.media.mixin = {\n\tmejsSettings: baseSettings,\n\n\tremoveAllPlayers: function() {\n\t\tvar p;\n\n\t\tif ( window.mejs && window.mejs.players ) {\n\t\t\tfor ( p in window.mejs.players ) {\n\t\t\t\twindow.mejs.players[p].pause();\n\t\t\t\tthis.removePlayer( window.mejs.players[p] );\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Override the MediaElement method for removing a player.\n\t *\tMediaElement tries to pull the audio/video tag out of\n\t *\tits container and re-add it to the DOM.\n\t */\n\tremovePlayer: function(t) {\n\t\tvar featureIndex, feature;\n\n\t\tif ( ! t.options ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// invoke features cleanup\n\t\tfor ( featureIndex in t.options.features ) {\n\t\t\tfeature = t.options.features[featureIndex];\n\t\t\tif ( t['clean' + feature] ) {\n\t\t\t\ttry {\n\t\t\t\t\tt['clean' + feature](t);\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! t.isDynamic ) {\n\t\t\tt.$node.remove();\n\t\t}\n\n\t\tif ( 'native' !== t.media.pluginType ) {\n\t\t\tt.$media.remove();\n\t\t}\n\n\t\tdelete window.mejs.players[t.id];\n\n\t\tt.container.remove();\n\t\tt.globalUnbind();\n\t\tdelete t.node.player;\n\t},\n\n\t/**\n\t * Allows any class that has set 'player' to a MediaElementPlayer\n\t *  instance to remove the player when listening to events.\n\t *\n\t *  Examples: modal closes, shortcode properties are removed, etc.\n\t */\n\tunsetPlayers : function() {\n\t\tif ( this.players && this.players.length ) {\n\t\t\t_.each( this.players, function (player) {\n\t\t\t\tplayer.pause();\n\t\t\t\twp.media.mixin.removePlayer( player );\n\t\t\t} );\n\t\t\tthis.players = [];\n\t\t}\n\t}\n};\n\n/**\n * Autowire \"collection\"-type shortcodes\n */\nwp.media.playlist = new wp.media.collection({\n\ttag: 'playlist',\n\teditTitle : l10n.editPlaylistTitle,\n\tdefaults : {\n\t\tid: wp.media.view.settings.post.id,\n\t\tstyle: 'light',\n\t\ttracklist: true,\n\t\ttracknumbers: true,\n\t\timages: true,\n\t\tartists: true,\n\t\ttype: 'audio'\n\t}\n});\n\n/**\n * Shortcode modeling for audio\n *  `edit()` prepares the shortcode for the media modal\n *  `shortcode()` builds the new shortcode after update\n *\n * @namespace\n */\nwp.media.audio = {\n\tcoerce : wp.media.coerce,\n\n\tdefaults : {\n\t\tid : wp.media.view.settings.post.id,\n\t\tsrc : '',\n\t\tloop : false,\n\t\tautoplay : false,\n\t\tpreload : 'none',\n\t\twidth : 400\n\t},\n\n\tedit : function( data ) {\n\t\tvar frame, shortcode = wp.shortcode.next( 'audio', data ).shortcode;\n\n\t\tframe = wp.media({\n\t\t\tframe: 'audio',\n\t\t\tstate: 'audio-details',\n\t\t\tmetadata: _.defaults( shortcode.attrs.named, this.defaults )\n\t\t});\n\n\t\treturn frame;\n\t},\n\n\tshortcode : function( model ) {\n\t\tvar content;\n\n\t\t_.each( this.defaults, function( value, key ) {\n\t\t\tmodel[ key ] = this.coerce( model, key );\n\n\t\t\tif ( value === model[ key ] ) {\n\t\t\t\tdelete model[ key ];\n\t\t\t}\n\t\t}, this );\n\n\t\tcontent = model.content;\n\t\tdelete model.content;\n\n\t\treturn new wp.shortcode({\n\t\t\ttag: 'audio',\n\t\t\tattrs: model,\n\t\t\tcontent: content\n\t\t});\n\t}\n};\n\n/**\n * Shortcode modeling for video\n *  `edit()` prepares the shortcode for the media modal\n *  `shortcode()` builds the new shortcode after update\n *\n * @namespace\n */\nwp.media.video = {\n\tcoerce : wp.media.coerce,\n\n\tdefaults : {\n\t\tid : wp.media.view.settings.post.id,\n\t\tsrc : '',\n\t\tposter : '',\n\t\tloop : false,\n\t\tautoplay : false,\n\t\tpreload : 'metadata',\n\t\tcontent : '',\n\t\twidth : 640,\n\t\theight : 360\n\t},\n\n\tedit : function( data ) {\n\t\tvar frame,\n\t\t\tshortcode = wp.shortcode.next( 'video', data ).shortcode,\n\t\t\tattrs;\n\n\t\tattrs = shortcode.attrs.named;\n\t\tattrs.content = shortcode.content;\n\n\t\tframe = wp.media({\n\t\t\tframe: 'video',\n\t\t\tstate: 'video-details',\n\t\t\tmetadata: _.defaults( attrs, this.defaults )\n\t\t});\n\n\t\treturn frame;\n\t},\n\n\tshortcode : function( model ) {\n\t\tvar content;\n\n\t\t_.each( this.defaults, function( value, key ) {\n\t\t\tmodel[ key ] = this.coerce( model, key );\n\n\t\t\tif ( value === model[ key ] ) {\n\t\t\t\tdelete model[ key ];\n\t\t\t}\n\t\t}, this );\n\n\t\tcontent = model.content;\n\t\tdelete model.content;\n\n\t\treturn new wp.shortcode({\n\t\t\ttag: 'video',\n\t\t\tattrs: model,\n\t\t\tcontent: content\n\t\t});\n\t}\n};\n\nmedia.model.PostMedia = require( './models/post-media.js' );\nmedia.controller.AudioDetails = require( './controllers/audio-details.js' );\nmedia.controller.VideoDetails = require( './controllers/video-details.js' );\nmedia.view.MediaFrame.MediaDetails = require( './views/frame/media-details.js' );\nmedia.view.MediaFrame.AudioDetails = require( './views/frame/audio-details.js' );\nmedia.view.MediaFrame.VideoDetails = require( './views/frame/video-details.js' );\nmedia.view.MediaDetails = require( './views/media-details.js' );\nmedia.view.AudioDetails = require( './views/audio-details.js' );\nmedia.view.VideoDetails = require( './views/video-details.js' );\n\n},{\"./controllers/audio-details.js\":2,\"./controllers/video-details.js\":3,\"./models/post-media.js\":4,\"./views/audio-details.js\":5,\"./views/frame/audio-details.js\":6,\"./views/frame/media-details.js\":7,\"./views/frame/video-details.js\":8,\"./views/media-details.js\":9,\"./views/video-details.js\":10}],2:[function(require,module,exports){\n/**\n * wp.media.controller.AudioDetails\n *\n * The controller for the Audio Details state\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nvar State = wp.media.controller.State,\n\tl10n = wp.media.view.l10n,\n\tAudioDetails;\n\nAudioDetails = State.extend({\n\tdefaults: {\n\t\tid: 'audio-details',\n\t\ttoolbar: 'audio-details',\n\t\ttitle: l10n.audioDetailsTitle,\n\t\tcontent: 'audio-details',\n\t\tmenu: 'audio-details',\n\t\trouter: false,\n\t\tpriority: 60\n\t},\n\n\tinitialize: function( options ) {\n\t\tthis.media = options.media;\n\t\tState.prototype.initialize.apply( this, arguments );\n\t}\n});\n\nmodule.exports = AudioDetails;\n\n},{}],3:[function(require,module,exports){\n/**\n * wp.media.controller.VideoDetails\n *\n * The controller for the Video Details state\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nvar State = wp.media.controller.State,\n\tl10n = wp.media.view.l10n,\n\tVideoDetails;\n\nVideoDetails = State.extend({\n\tdefaults: {\n\t\tid: 'video-details',\n\t\ttoolbar: 'video-details',\n\t\ttitle: l10n.videoDetailsTitle,\n\t\tcontent: 'video-details',\n\t\tmenu: 'video-details',\n\t\trouter: false,\n\t\tpriority: 60\n\t},\n\n\tinitialize: function( options ) {\n\t\tthis.media = options.media;\n\t\tState.prototype.initialize.apply( this, arguments );\n\t}\n});\n\nmodule.exports = VideoDetails;\n\n},{}],4:[function(require,module,exports){\n/**\n * wp.media.model.PostMedia\n *\n * Shared model class for audio and video. Updates the model after\n *   \"Add Audio|Video Source\" and \"Replace Audio|Video\" states return\n *\n * @class\n * @augments Backbone.Model\n */\nvar PostMedia = Backbone.Model.extend({\n\tinitialize: function() {\n\t\tthis.attachment = false;\n\t},\n\n\tsetSource: function( attachment ) {\n\t\tthis.attachment = attachment;\n\t\tthis.extension = attachment.get( 'filename' ).split('.').pop();\n\n\t\tif ( this.get( 'src' ) && this.extension === this.get( 'src' ).split('.').pop() ) {\n\t\t\tthis.unset( 'src' );\n\t\t}\n\n\t\tif ( _.contains( wp.media.view.settings.embedExts, this.extension ) ) {\n\t\t\tthis.set( this.extension, this.attachment.get( 'url' ) );\n\t\t} else {\n\t\t\tthis.unset( this.extension );\n\t\t}\n\t},\n\n\tchangeAttachment: function( attachment ) {\n\t\tthis.setSource( attachment );\n\n\t\tthis.unset( 'src' );\n\t\t_.each( _.without( wp.media.view.settings.embedExts, this.extension ), function( ext ) {\n\t\t\tthis.unset( ext );\n\t\t}, this );\n\t}\n});\n\nmodule.exports = PostMedia;\n\n},{}],5:[function(require,module,exports){\n/**\n * wp.media.view.AudioDetails\n *\n * @class\n * @augments wp.media.view.MediaDetails\n * @augments wp.media.view.Settings.AttachmentDisplay\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar MediaDetails = wp.media.view.MediaDetails,\n\tAudioDetails;\n\nAudioDetails = MediaDetails.extend({\n\tclassName: 'audio-details',\n\ttemplate:  wp.template('audio-details'),\n\n\tsetMedia: function() {\n\t\tvar audio = this.$('.wp-audio-shortcode');\n\n\t\tif ( audio.find( 'source' ).length ) {\n\t\t\tif ( audio.is(':hidden') ) {\n\t\t\t\taudio.show();\n\t\t\t}\n\t\t\tthis.media = MediaDetails.prepareSrc( audio.get(0) );\n\t\t} else {\n\t\t\taudio.hide();\n\t\t\tthis.media = false;\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nmodule.exports = AudioDetails;\n\n},{}],6:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.AudioDetails\n *\n * @class\n * @augments wp.media.view.MediaFrame.MediaDetails\n * @augments wp.media.view.MediaFrame.Select\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar MediaDetails = wp.media.view.MediaFrame.MediaDetails,\n\tMediaLibrary = wp.media.controller.MediaLibrary,\n\n\tl10n = wp.media.view.l10n,\n\tAudioDetails;\n\nAudioDetails = MediaDetails.extend({\n\tdefaults: {\n\t\tid:      'audio',\n\t\turl:     '',\n\t\tmenu:    'audio-details',\n\t\tcontent: 'audio-details',\n\t\ttoolbar: 'audio-details',\n\t\ttype:    'link',\n\t\ttitle:    l10n.audioDetailsTitle,\n\t\tpriority: 120\n\t},\n\n\tinitialize: function( options ) {\n\t\toptions.DetailsView = wp.media.view.AudioDetails;\n\t\toptions.cancelText = l10n.audioDetailsCancel;\n\t\toptions.addText = l10n.audioAddSourceTitle;\n\n\t\tMediaDetails.prototype.initialize.call( this, options );\n\t},\n\n\tbindHandlers: function() {\n\t\tMediaDetails.prototype.bindHandlers.apply( this, arguments );\n\n\t\tthis.on( 'toolbar:render:replace-audio', this.renderReplaceToolbar, this );\n\t\tthis.on( 'toolbar:render:add-audio-source', this.renderAddSourceToolbar, this );\n\t},\n\n\tcreateStates: function() {\n\t\tthis.states.add([\n\t\t\tnew wp.media.controller.AudioDetails( {\n\t\t\t\tmedia: this.media\n\t\t\t} ),\n\n\t\t\tnew MediaLibrary( {\n\t\t\t\ttype: 'audio',\n\t\t\t\tid: 'replace-audio',\n\t\t\t\ttitle: l10n.audioReplaceTitle,\n\t\t\t\ttoolbar: 'replace-audio',\n\t\t\t\tmedia: this.media,\n\t\t\t\tmenu: 'audio-details'\n\t\t\t} ),\n\n\t\t\tnew MediaLibrary( {\n\t\t\t\ttype: 'audio',\n\t\t\t\tid: 'add-audio-source',\n\t\t\t\ttitle: l10n.audioAddSourceTitle,\n\t\t\t\ttoolbar: 'add-audio-source',\n\t\t\t\tmedia: this.media,\n\t\t\t\tmenu: false\n\t\t\t} )\n\t\t]);\n\t}\n});\n\nmodule.exports = AudioDetails;\n\n},{}],7:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.MediaDetails\n *\n * @class\n * @augments wp.media.view.MediaFrame.Select\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar Select = wp.media.view.MediaFrame.Select,\n\tl10n = wp.media.view.l10n,\n\tMediaDetails;\n\nMediaDetails = Select.extend({\n\tdefaults: {\n\t\tid:      'media',\n\t\turl:     '',\n\t\tmenu:    'media-details',\n\t\tcontent: 'media-details',\n\t\ttoolbar: 'media-details',\n\t\ttype:    'link',\n\t\tpriority: 120\n\t},\n\n\tinitialize: function( options ) {\n\t\tthis.DetailsView = options.DetailsView;\n\t\tthis.cancelText = options.cancelText;\n\t\tthis.addText = options.addText;\n\n\t\tthis.media = new wp.media.model.PostMedia( options.metadata );\n\t\tthis.options.selection = new wp.media.model.Selection( this.media.attachment, { multiple: false } );\n\t\tSelect.prototype.initialize.apply( this, arguments );\n\t},\n\n\tbindHandlers: function() {\n\t\tvar menu = this.defaults.menu;\n\n\t\tSelect.prototype.bindHandlers.apply( this, arguments );\n\n\t\tthis.on( 'menu:create:' + menu, this.createMenu, this );\n\t\tthis.on( 'content:render:' + menu, this.renderDetailsContent, this );\n\t\tthis.on( 'menu:render:' + menu, this.renderMenu, this );\n\t\tthis.on( 'toolbar:render:' + menu, this.renderDetailsToolbar, this );\n\t},\n\n\trenderDetailsContent: function() {\n\t\tvar view = new this.DetailsView({\n\t\t\tcontroller: this,\n\t\t\tmodel: this.state().media,\n\t\t\tattachment: this.state().media.attachment\n\t\t}).render();\n\n\t\tthis.content.set( view );\n\t},\n\n\trenderMenu: function( view ) {\n\t\tvar lastState = this.lastState(),\n\t\t\tprevious = lastState && lastState.id,\n\t\t\tframe = this;\n\n\t\tview.set({\n\t\t\tcancel: {\n\t\t\t\ttext:     this.cancelText,\n\t\t\t\tpriority: 20,\n\t\t\t\tclick:    function() {\n\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframe.close();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tseparateCancel: new wp.media.View({\n\t\t\t\tclassName: 'separator',\n\t\t\t\tpriority: 40\n\t\t\t})\n\t\t});\n\n\t},\n\n\tsetPrimaryButton: function(text, handler) {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tbutton: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     text,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\tclick:    function() {\n\t\t\t\t\t\tvar controller = this.controller;\n\t\t\t\t\t\thandler.call( this, controller, controller.state() );\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\trenderDetailsToolbar: function() {\n\t\tthis.setPrimaryButton( l10n.update, function( controller, state ) {\n\t\t\tcontroller.close();\n\t\t\tstate.trigger( 'update', controller.media.toJSON() );\n\t\t} );\n\t},\n\n\trenderReplaceToolbar: function() {\n\t\tthis.setPrimaryButton( l10n.replace, function( controller, state ) {\n\t\t\tvar attachment = state.get( 'selection' ).single();\n\t\t\tcontroller.media.changeAttachment( attachment );\n\t\t\tstate.trigger( 'replace', controller.media.toJSON() );\n\t\t} );\n\t},\n\n\trenderAddSourceToolbar: function() {\n\t\tthis.setPrimaryButton( this.addText, function( controller, state ) {\n\t\t\tvar attachment = state.get( 'selection' ).single();\n\t\t\tcontroller.media.setSource( attachment );\n\t\t\tstate.trigger( 'add-source', controller.media.toJSON() );\n\t\t} );\n\t}\n});\n\nmodule.exports = MediaDetails;\n\n},{}],8:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.VideoDetails\n *\n * @class\n * @augments wp.media.view.MediaFrame.MediaDetails\n * @augments wp.media.view.MediaFrame.Select\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar MediaDetails = wp.media.view.MediaFrame.MediaDetails,\n\tMediaLibrary = wp.media.controller.MediaLibrary,\n\tl10n = wp.media.view.l10n,\n\tVideoDetails;\n\nVideoDetails = MediaDetails.extend({\n\tdefaults: {\n\t\tid:      'video',\n\t\turl:     '',\n\t\tmenu:    'video-details',\n\t\tcontent: 'video-details',\n\t\ttoolbar: 'video-details',\n\t\ttype:    'link',\n\t\ttitle:    l10n.videoDetailsTitle,\n\t\tpriority: 120\n\t},\n\n\tinitialize: function( options ) {\n\t\toptions.DetailsView = wp.media.view.VideoDetails;\n\t\toptions.cancelText = l10n.videoDetailsCancel;\n\t\toptions.addText = l10n.videoAddSourceTitle;\n\n\t\tMediaDetails.prototype.initialize.call( this, options );\n\t},\n\n\tbindHandlers: function() {\n\t\tMediaDetails.prototype.bindHandlers.apply( this, arguments );\n\n\t\tthis.on( 'toolbar:render:replace-video', this.renderReplaceToolbar, this );\n\t\tthis.on( 'toolbar:render:add-video-source', this.renderAddSourceToolbar, this );\n\t\tthis.on( 'toolbar:render:select-poster-image', this.renderSelectPosterImageToolbar, this );\n\t\tthis.on( 'toolbar:render:add-track', this.renderAddTrackToolbar, this );\n\t},\n\n\tcreateStates: function() {\n\t\tthis.states.add([\n\t\t\tnew wp.media.controller.VideoDetails({\n\t\t\t\tmedia: this.media\n\t\t\t}),\n\n\t\t\tnew MediaLibrary( {\n\t\t\t\ttype: 'video',\n\t\t\t\tid: 'replace-video',\n\t\t\t\ttitle: l10n.videoReplaceTitle,\n\t\t\t\ttoolbar: 'replace-video',\n\t\t\t\tmedia: this.media,\n\t\t\t\tmenu: 'video-details'\n\t\t\t} ),\n\n\t\t\tnew MediaLibrary( {\n\t\t\t\ttype: 'video',\n\t\t\t\tid: 'add-video-source',\n\t\t\t\ttitle: l10n.videoAddSourceTitle,\n\t\t\t\ttoolbar: 'add-video-source',\n\t\t\t\tmedia: this.media,\n\t\t\t\tmenu: false\n\t\t\t} ),\n\n\t\t\tnew MediaLibrary( {\n\t\t\t\ttype: 'image',\n\t\t\t\tid: 'select-poster-image',\n\t\t\t\ttitle: l10n.videoSelectPosterImageTitle,\n\t\t\t\ttoolbar: 'select-poster-image',\n\t\t\t\tmedia: this.media,\n\t\t\t\tmenu: 'video-details'\n\t\t\t} ),\n\n\t\t\tnew MediaLibrary( {\n\t\t\t\ttype: 'text',\n\t\t\t\tid: 'add-track',\n\t\t\t\ttitle: l10n.videoAddTrackTitle,\n\t\t\t\ttoolbar: 'add-track',\n\t\t\t\tmedia: this.media,\n\t\t\t\tmenu: 'video-details'\n\t\t\t} )\n\t\t]);\n\t},\n\n\trenderSelectPosterImageToolbar: function() {\n\t\tthis.setPrimaryButton( l10n.videoSelectPosterImageTitle, function( controller, state ) {\n\t\t\tvar urls = [], attachment = state.get( 'selection' ).single();\n\n\t\t\tcontroller.media.set( 'poster', attachment.get( 'url' ) );\n\t\t\tstate.trigger( 'set-poster-image', controller.media.toJSON() );\n\n\t\t\t_.each( wp.media.view.settings.embedExts, function (ext) {\n\t\t\t\tif ( controller.media.get( ext ) ) {\n\t\t\t\t\turls.push( controller.media.get( ext ) );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\twp.ajax.send( 'set-attachment-thumbnail', {\n\t\t\t\tdata : {\n\t\t\t\t\turls: urls,\n\t\t\t\t\tthumbnail_id: attachment.get( 'id' )\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t},\n\n\trenderAddTrackToolbar: function() {\n\t\tthis.setPrimaryButton( l10n.videoAddTrackTitle, function( controller, state ) {\n\t\t\tvar attachment = state.get( 'selection' ).single(),\n\t\t\t\tcontent = controller.media.get( 'content' );\n\n\t\t\tif ( -1 === content.indexOf( attachment.get( 'url' ) ) ) {\n\t\t\t\tcontent += [\n\t\t\t\t\t'<track srclang=\"en\" label=\"English\" kind=\"subtitles\" src=\"',\n\t\t\t\t\tattachment.get( 'url' ),\n\t\t\t\t\t'\" />'\n\t\t\t\t].join('');\n\n\t\t\t\tcontroller.media.set( 'content', content );\n\t\t\t}\n\t\t\tstate.trigger( 'add-track', controller.media.toJSON() );\n\t\t} );\n\t}\n});\n\nmodule.exports = VideoDetails;\n\n},{}],9:[function(require,module,exports){\n/* global MediaElementPlayer */\n\n/**\n * wp.media.view.MediaDetails\n *\n * @class\n * @augments wp.media.view.Settings.AttachmentDisplay\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar AttachmentDisplay = wp.media.view.Settings.AttachmentDisplay,\n\t$ = jQuery,\n\tMediaDetails;\n\nMediaDetails = AttachmentDisplay.extend({\n\tinitialize: function() {\n\t\t_.bindAll(this, 'success');\n\t\tthis.players = [];\n\t\tthis.listenTo( this.controller, 'close', wp.media.mixin.unsetPlayers );\n\t\tthis.on( 'ready', this.setPlayer );\n\t\tthis.on( 'media:setting:remove', wp.media.mixin.unsetPlayers, this );\n\t\tthis.on( 'media:setting:remove', this.render );\n\t\tthis.on( 'media:setting:remove', this.setPlayer );\n\t\tthis.events = _.extend( this.events, {\n\t\t\t'click .remove-setting' : 'removeSetting',\n\t\t\t'change .content-track' : 'setTracks',\n\t\t\t'click .remove-track' : 'setTracks',\n\t\t\t'click .add-media-source' : 'addSource'\n\t\t} );\n\n\t\tAttachmentDisplay.prototype.initialize.apply( this, arguments );\n\t},\n\n\tprepare: function() {\n\t\treturn _.defaults({\n\t\t\tmodel: this.model.toJSON()\n\t\t}, this.options );\n\t},\n\n\t/**\n\t * Remove a setting's UI when the model unsets it\n\t *\n\t * @fires wp.media.view.MediaDetails#media:setting:remove\n\t *\n\t * @param {Event} e\n\t */\n\tremoveSetting : function(e) {\n\t\tvar wrap = $( e.currentTarget ).parent(), setting;\n\t\tsetting = wrap.find( 'input' ).data( 'setting' );\n\n\t\tif ( setting ) {\n\t\t\tthis.model.unset( setting );\n\t\t\tthis.trigger( 'media:setting:remove', this );\n\t\t}\n\n\t\twrap.remove();\n\t},\n\n\t/**\n\t *\n\t * @fires wp.media.view.MediaDetails#media:setting:remove\n\t */\n\tsetTracks : function() {\n\t\tvar tracks = '';\n\n\t\t_.each( this.$('.content-track'), function(track) {\n\t\t\ttracks += $( track ).val();\n\t\t} );\n\n\t\tthis.model.set( 'content', tracks );\n\t\tthis.trigger( 'media:setting:remove', this );\n\t},\n\n\taddSource : function( e ) {\n\t\tthis.controller.lastMime = $( e.currentTarget ).data( 'mime' );\n\t\tthis.controller.setState( 'add-' + this.controller.defaults.id + '-source' );\n\t},\n\n\tloadPlayer: function () {\n\t\tthis.players.push( new MediaElementPlayer( this.media, this.settings ) );\n\t\tthis.scriptXhr = false;\n\t},\n\n\t/**\n\t * @global MediaElementPlayer\n\t */\n\tsetPlayer : function() {\n\t\tvar baseSettings;\n\n\t\tif ( this.players.length || ! this.media || this.scriptXhr ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.model.get( 'src' ).indexOf( 'vimeo' ) > -1 && ! ( 'Froogaloop' in window ) ) {\n\t\t\tbaseSettings = wp.media.mixin.mejsSettings;\n\t\t\tthis.scriptXhr = $.getScript( baseSettings.pluginPath + 'froogaloop.min.js', _.bind( this.loadPlayer, this ) );\n\t\t} else {\n\t\t\tthis.loadPlayer();\n\t\t}\n\t},\n\n\t/**\n\t * @abstract\n\t */\n\tsetMedia : function() {\n\t\treturn this;\n\t},\n\n\tsuccess : function(mejs) {\n\t\tvar autoplay = mejs.attributes.autoplay && 'false' !== mejs.attributes.autoplay;\n\n\t\tif ( 'flash' === mejs.pluginType && autoplay ) {\n\t\t\tmejs.addEventListener( 'canplay', function() {\n\t\t\t\tmejs.play();\n\t\t\t}, false );\n\t\t}\n\n\t\tthis.mejs = mejs;\n\t},\n\n\t/**\n\t * @returns {media.view.MediaDetails} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tAttachmentDisplay.prototype.render.apply( this, arguments );\n\n\t\tsetTimeout( _.bind( function() {\n\t\t\tthis.resetFocus();\n\t\t}, this ), 10 );\n\n\t\tthis.settings = _.defaults( {\n\t\t\tsuccess : this.success\n\t\t}, wp.media.mixin.mejsSettings );\n\n\t\treturn this.setMedia();\n\t},\n\n\tresetFocus: function() {\n\t\tthis.$( '.embed-media-settings' ).scrollTop( 0 );\n\t}\n}, {\n\tinstances : 0,\n\t/**\n\t * When multiple players in the DOM contain the same src, things get weird.\n\t *\n\t * @param {HTMLElement} elem\n\t * @returns {HTMLElement}\n\t */\n\tprepareSrc : function( elem ) {\n\t\tvar i = MediaDetails.instances++;\n\t\t_.each( $( elem ).find( 'source' ), function( source ) {\n\t\t\tsource.src = [\n\t\t\t\tsource.src,\n\t\t\t\tsource.src.indexOf('?') > -1 ? '&' : '?',\n\t\t\t\t'_=',\n\t\t\t\ti\n\t\t\t].join('');\n\t\t} );\n\n\t\treturn elem;\n\t}\n});\n\nmodule.exports = MediaDetails;\n\n},{}],10:[function(require,module,exports){\n/**\n * wp.media.view.VideoDetails\n *\n * @class\n * @augments wp.media.view.MediaDetails\n * @augments wp.media.view.Settings.AttachmentDisplay\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar MediaDetails = wp.media.view.MediaDetails,\n\tVideoDetails;\n\nVideoDetails = MediaDetails.extend({\n\tclassName: 'video-details',\n\ttemplate:  wp.template('video-details'),\n\n\tsetMedia: function() {\n\t\tvar video = this.$('.wp-video-shortcode');\n\n\t\tif ( video.find( 'source' ).length ) {\n\t\t\tif ( video.is(':hidden') ) {\n\t\t\t\tvideo.show();\n\t\t\t}\n\n\t\t\tif ( ! video.hasClass( 'youtube-video' ) && ! video.hasClass( 'vimeo-video' ) ) {\n\t\t\t\tthis.media = MediaDetails.prepareSrc( video.get(0) );\n\t\t\t} else {\n\t\t\t\tthis.media = video.get(0);\n\t\t\t}\n\t\t} else {\n\t\t\tvideo.hide();\n\t\t\tthis.media = false;\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nmodule.exports = VideoDetails;\n\n},{}]},{},[1]);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/media-editor.js",
    "content": "/* global getUserSetting, tinymce, QTags */\n\n// WordPress, TinyMCE, and Media\n// -----------------------------\n(function($, _){\n\t/**\n\t * Stores the editors' `wp.media.controller.Frame` instances.\n\t *\n\t * @static\n\t */\n\tvar workflows = {};\n\n\t/**\n\t * A helper mixin function to avoid truthy and falsey values being\n\t *   passed as an input that expects booleans. If key is undefined in the map,\n\t *   but has a default value, set it.\n\t *\n\t * @param {object} attrs Map of props from a shortcode or settings.\n\t * @param {string} key The key within the passed map to check for a value.\n\t * @returns {mixed|undefined} The original or coerced value of key within attrs\n\t */\n\twp.media.coerce = function ( attrs, key ) {\n\t\tif ( _.isUndefined( attrs[ key ] ) && ! _.isUndefined( this.defaults[ key ] ) ) {\n\t\t\tattrs[ key ] = this.defaults[ key ];\n\t\t} else if ( 'true' === attrs[ key ] ) {\n\t\t\tattrs[ key ] = true;\n\t\t} else if ( 'false' === attrs[ key ] ) {\n\t\t\tattrs[ key ] = false;\n\t\t}\n\t\treturn attrs[ key ];\n\t};\n\n\t/**\n\t * wp.media.string\n\t * @namespace\n\t */\n\twp.media.string = {\n\t\t/**\n\t\t * Joins the `props` and `attachment` objects,\n\t\t * outputting the proper object format based on the\n\t\t * attachment's type.\n\t\t *\n\t\t * @global wp.media.view.settings\n\t\t * @global getUserSetting()\n\t\t *\n\t\t * @param {Object} [props={}] Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @returns {Object} Joined props\n\t\t */\n\t\tprops: function( props, attachment ) {\n\t\t\tvar link, linkUrl, size, sizes, fallbacks,\n\t\t\t\tdefaultProps = wp.media.view.settings.defaultProps;\n\n\t\t\t// Final fallbacks run after all processing has been completed.\n\t\t\tfallbacks = function( props ) {\n\t\t\t\t// Generate alt fallbacks and strip tags.\n\t\t\t\tif ( 'image' === props.type && ! props.alt ) {\n\t\t\t\t\tprops.alt = props.caption || props.title || '';\n\t\t\t\t\tprops.alt = props.alt.replace( /<\\/?[^>]+>/g, '' );\n\t\t\t\t\tprops.alt = props.alt.replace( /[\\r\\n]+/g, ' ' );\n\t\t\t\t}\n\n\t\t\t\treturn props;\n\t\t\t};\n\n\t\t\tprops = props ? _.clone( props ) : {};\n\n\t\t\tif ( attachment && attachment.type ) {\n\t\t\t\tprops.type = attachment.type;\n\t\t\t}\n\n\t\t\tif ( 'image' === props.type ) {\n\t\t\t\tprops = _.defaults( props || {}, {\n\t\t\t\t\talign:   defaultProps.align || getUserSetting( 'align', 'none' ),\n\t\t\t\t\tsize:    defaultProps.size  || getUserSetting( 'imgsize', 'medium' ),\n\t\t\t\t\turl:     '',\n\t\t\t\t\tclasses: []\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// All attachment-specific settings follow.\n\t\t\tif ( ! attachment ) {\n\t\t\t\treturn fallbacks( props );\n\t\t\t}\n\n\t\t\tprops.title = props.title || attachment.title;\n\n\t\t\tlink = props.link || defaultProps.link || getUserSetting( 'urlbutton', 'file' );\n\t\t\tif ( 'file' === link || 'embed' === link ) {\n\t\t\t\tlinkUrl = attachment.url;\n\t\t\t} else if ( 'post' === link ) {\n\t\t\t\tlinkUrl = attachment.link;\n\t\t\t} else if ( 'custom' === link ) {\n\t\t\t\tlinkUrl = props.linkUrl;\n\t\t\t}\n\t\t\tprops.linkUrl = linkUrl || '';\n\n\t\t\t// Format properties for images.\n\t\t\tif ( 'image' === attachment.type ) {\n\t\t\t\tprops.classes.push( 'wp-image-' + attachment.id );\n\n\t\t\t\tsizes = attachment.sizes;\n\t\t\t\tsize = sizes && sizes[ props.size ] ? sizes[ props.size ] : attachment;\n\n\t\t\t\t_.extend( props, _.pick( attachment, 'align', 'caption', 'alt' ), {\n\t\t\t\t\twidth:     size.width,\n\t\t\t\t\theight:    size.height,\n\t\t\t\t\tsrc:       size.url,\n\t\t\t\t\tcaptionId: 'attachment_' + attachment.id\n\t\t\t\t});\n\t\t\t} else if ( 'video' === attachment.type || 'audio' === attachment.type ) {\n\t\t\t\t_.extend( props, _.pick( attachment, 'title', 'type', 'icon', 'mime' ) );\n\t\t\t// Format properties for non-images.\n\t\t\t} else {\n\t\t\t\tprops.title = props.title || attachment.filename;\n\t\t\t\tprops.rel = props.rel || 'attachment wp-att-' + attachment.id;\n\t\t\t}\n\n\t\t\treturn fallbacks( props );\n\t\t},\n\t\t/**\n\t\t * Create link markup that is suitable for passing to the editor\n\t\t *\n\t\t * @global wp.html.string\n\t\t *\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @returns {string} The link markup\n\t\t */\n\t\tlink: function( props, attachment ) {\n\t\t\tvar options;\n\n\t\t\tprops = wp.media.string.props( props, attachment );\n\n\t\t\toptions = {\n\t\t\t\ttag:     'a',\n\t\t\t\tcontent: props.title,\n\t\t\t\tattrs:   {\n\t\t\t\t\thref: props.linkUrl\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif ( props.rel ) {\n\t\t\t\toptions.attrs.rel = props.rel;\n\t\t\t}\n\n\t\t\treturn wp.html.string( options );\n\t\t},\n\t\t/**\n\t\t * Create an Audio shortcode string that is suitable for passing to the editor\n\t\t *\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @returns {string} The audio shortcode\n\t\t */\n\t\taudio: function( props, attachment ) {\n\t\t\treturn wp.media.string._audioVideo( 'audio', props, attachment );\n\t\t},\n\t\t/**\n\t\t * Create a Video shortcode string that is suitable for passing to the editor\n\t\t *\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @returns {string} The video shortcode\n\t\t */\n\t\tvideo: function( props, attachment ) {\n\t\t\treturn wp.media.string._audioVideo( 'video', props, attachment );\n\t\t},\n\t\t/**\n\t\t * Helper function to create a media shortcode string\n\t\t *\n\t\t * @access private\n\t\t *\n\t\t * @global wp.shortcode\n\t\t * @global wp.media.view.settings\n\t\t *\n\t\t * @param {string} type The shortcode tag name: 'audio' or 'video'.\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @returns {string} The media shortcode\n\t\t */\n\t\t_audioVideo: function( type, props, attachment ) {\n\t\t\tvar shortcode, html, extension;\n\n\t\t\tprops = wp.media.string.props( props, attachment );\n\t\t\tif ( props.link !== 'embed' )\n\t\t\t\treturn wp.media.string.link( props );\n\n\t\t\tshortcode = {};\n\n\t\t\tif ( 'video' === type ) {\n\t\t\t\tif ( attachment.image && -1 === attachment.image.src.indexOf( attachment.icon ) ) {\n\t\t\t\t\tshortcode.poster = attachment.image.src;\n\t\t\t\t}\n\n\t\t\t\tif ( attachment.width ) {\n\t\t\t\t\tshortcode.width = attachment.width;\n\t\t\t\t}\n\n\t\t\t\tif ( attachment.height ) {\n\t\t\t\t\tshortcode.height = attachment.height;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\textension = attachment.filename.split('.').pop();\n\n\t\t\tif ( _.contains( wp.media.view.settings.embedExts, extension ) ) {\n\t\t\t\tshortcode[extension] = attachment.url;\n\t\t\t} else {\n\t\t\t\t// Render unsupported audio and video files as links.\n\t\t\t\treturn wp.media.string.link( props );\n\t\t\t}\n\n\t\t\thtml = wp.shortcode.string({\n\t\t\t\ttag:     type,\n\t\t\t\tattrs:   shortcode\n\t\t\t});\n\n\t\t\treturn html;\n\t\t},\n\t\t/**\n\t\t * Create image markup, optionally with a link and/or wrapped in a caption shortcode,\n\t\t *  that is suitable for passing to the editor\n\t\t *\n\t\t * @global wp.html\n\t\t * @global wp.shortcode\n\t\t *\n\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t * @returns {string}\n\t\t */\n\t\timage: function( props, attachment ) {\n\t\t\tvar img = {},\n\t\t\t\toptions, classes, shortcode, html;\n\n\t\t\tprops = wp.media.string.props( props, attachment );\n\t\t\tclasses = props.classes || [];\n\n\t\t\timg.src = ! _.isUndefined( attachment ) ? attachment.url : props.url;\n\t\t\t_.extend( img, _.pick( props, 'width', 'height', 'alt' ) );\n\n\t\t\t// Only assign the align class to the image if we're not printing\n\t\t\t// a caption, since the alignment is sent to the shortcode.\n\t\t\tif ( props.align && ! props.caption ) {\n\t\t\t\tclasses.push( 'align' + props.align );\n\t\t\t}\n\n\t\t\tif ( props.size ) {\n\t\t\t\tclasses.push( 'size-' + props.size );\n\t\t\t}\n\n\t\t\timg['class'] = _.compact( classes ).join(' ');\n\n\t\t\t// Generate `img` tag options.\n\t\t\toptions = {\n\t\t\t\ttag:    'img',\n\t\t\t\tattrs:  img,\n\t\t\t\tsingle: true\n\t\t\t};\n\n\t\t\t// Generate the `a` element options, if they exist.\n\t\t\tif ( props.linkUrl ) {\n\t\t\t\toptions = {\n\t\t\t\t\ttag:   'a',\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\thref: props.linkUrl\n\t\t\t\t\t},\n\t\t\t\t\tcontent: options\n\t\t\t\t};\n\t\t\t}\n\n\t\t\thtml = wp.html.string( options );\n\n\t\t\t// Generate the caption shortcode.\n\t\t\tif ( props.caption ) {\n\t\t\t\tshortcode = {};\n\n\t\t\t\tif ( img.width ) {\n\t\t\t\t\tshortcode.width = img.width;\n\t\t\t\t}\n\n\t\t\t\tif ( props.captionId ) {\n\t\t\t\t\tshortcode.id = props.captionId;\n\t\t\t\t}\n\n\t\t\t\tif ( props.align ) {\n\t\t\t\t\tshortcode.align = 'align' + props.align;\n\t\t\t\t}\n\n\t\t\t\thtml = wp.shortcode.string({\n\t\t\t\t\ttag:     'caption',\n\t\t\t\t\tattrs:   shortcode,\n\t\t\t\t\tcontent: html + ' ' + props.caption\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn html;\n\t\t}\n\t};\n\n\twp.media.embed = {\n\t\tcoerce : wp.media.coerce,\n\n\t\tdefaults : {\n\t\t\turl : '',\n\t\t\twidth: '',\n\t\t\theight: ''\n\t\t},\n\n\t\tedit : function( data, isURL ) {\n\t\t\tvar frame, props = {}, shortcode;\n\n\t\t\tif ( isURL ) {\n\t\t\t\tprops.url = data.replace(/<[^>]+>/g, '');\n\t\t\t} else {\n\t\t\t\tshortcode = wp.shortcode.next( 'embed', data ).shortcode;\n\n\t\t\t\tprops = _.defaults( shortcode.attrs.named, this.defaults );\n\t\t\t\tif ( shortcode.content ) {\n\t\t\t\t\tprops.url = shortcode.content;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tframe = wp.media({\n\t\t\t\tframe: 'post',\n\t\t\t\tstate: 'embed',\n\t\t\t\tmetadata: props\n\t\t\t});\n\n\t\t\treturn frame;\n\t\t},\n\n\t\tshortcode : function( model ) {\n\t\t\tvar self = this, content;\n\n\t\t\t_.each( this.defaults, function( value, key ) {\n\t\t\t\tmodel[ key ] = self.coerce( model, key );\n\n\t\t\t\tif ( value === model[ key ] ) {\n\t\t\t\t\tdelete model[ key ];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcontent = model.url;\n\t\t\tdelete model.url;\n\n\t\t\treturn new wp.shortcode({\n\t\t\t\ttag: 'embed',\n\t\t\t\tattrs: model,\n\t\t\t\tcontent: content\n\t\t\t});\n\t\t}\n\t};\n\n\twp.media.collection = function(attributes) {\n\t\tvar collections = {};\n\n\t\treturn _.extend( {\n\t\t\tcoerce : wp.media.coerce,\n\t\t\t/**\n\t\t\t * Retrieve attachments based on the properties of the passed shortcode\n\t\t\t *\n\t\t\t * @global wp.media.query\n\t\t\t *\n\t\t\t * @param {wp.shortcode} shortcode An instance of wp.shortcode().\n\t\t\t * @returns {wp.media.model.Attachments} A Backbone.Collection containing\n\t\t\t *      the media items belonging to a collection.\n\t\t\t *      The query[ this.tag ] property is a Backbone.Model\n\t\t\t *          containing the 'props' for the collection.\n\t\t\t */\n\t\t\tattachments: function( shortcode ) {\n\t\t\t\tvar shortcodeString = shortcode.string(),\n\t\t\t\t\tresult = collections[ shortcodeString ],\n\t\t\t\t\tattrs, args, query, others, self = this;\n\n\t\t\t\tdelete collections[ shortcodeString ];\n\t\t\t\tif ( result ) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\t// Fill the default shortcode attributes.\n\t\t\t\tattrs = _.defaults( shortcode.attrs.named, this.defaults );\n\t\t\t\targs  = _.pick( attrs, 'orderby', 'order' );\n\n\t\t\t\targs.type    = this.type;\n\t\t\t\targs.perPage = -1;\n\n\t\t\t\t// Mark the `orderby` override attribute.\n\t\t\t\tif ( undefined !== attrs.orderby ) {\n\t\t\t\t\tattrs._orderByField = attrs.orderby;\n\t\t\t\t}\n\n\t\t\t\tif ( 'rand' === attrs.orderby ) {\n\t\t\t\t\tattrs._orderbyRandom = true;\n\t\t\t\t}\n\n\t\t\t\t// Map the `orderby` attribute to the corresponding model property.\n\t\t\t\tif ( ! attrs.orderby || /^menu_order(?: ID)?$/i.test( attrs.orderby ) ) {\n\t\t\t\t\targs.orderby = 'menuOrder';\n\t\t\t\t}\n\n\t\t\t\t// Map the `ids` param to the correct query args.\n\t\t\t\tif ( attrs.ids ) {\n\t\t\t\t\targs.post__in = attrs.ids.split(',');\n\t\t\t\t\targs.orderby  = 'post__in';\n\t\t\t\t} else if ( attrs.include ) {\n\t\t\t\t\targs.post__in = attrs.include.split(',');\n\t\t\t\t}\n\n\t\t\t\tif ( attrs.exclude ) {\n\t\t\t\t\targs.post__not_in = attrs.exclude.split(',');\n\t\t\t\t}\n\n\t\t\t\tif ( ! args.post__in ) {\n\t\t\t\t\targs.uploadedTo = attrs.id;\n\t\t\t\t}\n\n\t\t\t\t// Collect the attributes that were not included in `args`.\n\t\t\t\tothers = _.omit( attrs, 'id', 'ids', 'include', 'exclude', 'orderby', 'order' );\n\n\t\t\t\t_.each( this.defaults, function( value, key ) {\n\t\t\t\t\tothers[ key ] = self.coerce( others, key );\n\t\t\t\t});\n\n\t\t\t\tquery = wp.media.query( args );\n\t\t\t\tquery[ this.tag ] = new Backbone.Model( others );\n\t\t\t\treturn query;\n\t\t\t},\n\t\t\t/**\n\t\t\t * Triggered when clicking 'Insert {label}' or 'Update {label}'\n\t\t\t *\n\t\t\t * @global wp.shortcode\n\t\t\t * @global wp.media.model.Attachments\n\t\t\t *\n\t\t\t * @param {wp.media.model.Attachments} attachments A Backbone.Collection containing\n\t\t\t *      the media items belonging to a collection.\n\t\t\t *      The query[ this.tag ] property is a Backbone.Model\n\t\t\t *          containing the 'props' for the collection.\n\t\t\t * @returns {wp.shortcode}\n\t\t\t */\n\t\t\tshortcode: function( attachments ) {\n\t\t\t\tvar props = attachments.props.toJSON(),\n\t\t\t\t\tattrs = _.pick( props, 'orderby', 'order' ),\n\t\t\t\t\tshortcode, clone;\n\n\t\t\t\tif ( attachments.type ) {\n\t\t\t\t\tattrs.type = attachments.type;\n\t\t\t\t\tdelete attachments.type;\n\t\t\t\t}\n\n\t\t\t\tif ( attachments[this.tag] ) {\n\t\t\t\t\t_.extend( attrs, attachments[this.tag].toJSON() );\n\t\t\t\t}\n\n\t\t\t\t// Convert all gallery shortcodes to use the `ids` property.\n\t\t\t\t// Ignore `post__in` and `post__not_in`; the attachments in\n\t\t\t\t// the collection will already reflect those properties.\n\t\t\t\tattrs.ids = attachments.pluck('id');\n\n\t\t\t\t// Copy the `uploadedTo` post ID.\n\t\t\t\tif ( props.uploadedTo ) {\n\t\t\t\t\tattrs.id = props.uploadedTo;\n\t\t\t\t}\n\t\t\t\t// Check if the gallery is randomly ordered.\n\t\t\t\tdelete attrs.orderby;\n\n\t\t\t\tif ( attrs._orderbyRandom ) {\n\t\t\t\t\tattrs.orderby = 'rand';\n\t\t\t\t} else if ( attrs._orderByField && attrs._orderByField != 'rand' ) {\n\t\t\t\t\tattrs.orderby = attrs._orderByField;\n\t\t\t\t}\n\n\t\t\t\tdelete attrs._orderbyRandom;\n\t\t\t\tdelete attrs._orderByField;\n\n\t\t\t\t// If the `ids` attribute is set and `orderby` attribute\n\t\t\t\t// is the default value, clear it for cleaner output.\n\t\t\t\tif ( attrs.ids && 'post__in' === attrs.orderby ) {\n\t\t\t\t\tdelete attrs.orderby;\n\t\t\t\t}\n\n\t\t\t\tattrs = this.setDefaults( attrs );\n\n\t\t\t\tshortcode = new wp.shortcode({\n\t\t\t\t\ttag:    this.tag,\n\t\t\t\t\tattrs:  attrs,\n\t\t\t\t\ttype:   'single'\n\t\t\t\t});\n\n\t\t\t\t// Use a cloned version of the gallery.\n\t\t\t\tclone = new wp.media.model.Attachments( attachments.models, {\n\t\t\t\t\tprops: props\n\t\t\t\t});\n\t\t\t\tclone[ this.tag ] = attachments[ this.tag ];\n\t\t\t\tcollections[ shortcode.string() ] = clone;\n\n\t\t\t\treturn shortcode;\n\t\t\t},\n\t\t\t/**\n\t\t\t * Triggered when double-clicking a collection shortcode placeholder\n\t\t\t *   in the editor\n\t\t\t *\n\t\t\t * @global wp.shortcode\n\t\t\t * @global wp.media.model.Selection\n\t\t\t * @global wp.media.view.l10n\n\t\t\t *\n\t\t\t * @param {string} content Content that is searched for possible\n\t\t\t *    shortcode markup matching the passed tag name,\n\t\t\t *\n\t\t\t * @this wp.media.{prop}\n\t\t\t *\n\t\t\t * @returns {wp.media.view.MediaFrame.Select} A media workflow.\n\t\t\t */\n\t\t\tedit: function( content ) {\n\t\t\t\tvar shortcode = wp.shortcode.next( this.tag, content ),\n\t\t\t\t\tdefaultPostId = this.defaults.id,\n\t\t\t\t\tattachments, selection, state;\n\n\t\t\t\t// Bail if we didn't match the shortcode or all of the content.\n\t\t\t\tif ( ! shortcode || shortcode.content !== content ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Ignore the rest of the match object.\n\t\t\t\tshortcode = shortcode.shortcode;\n\n\t\t\t\tif ( _.isUndefined( shortcode.get('id') ) && ! _.isUndefined( defaultPostId ) ) {\n\t\t\t\t\tshortcode.set( 'id', defaultPostId );\n\t\t\t\t}\n\n\t\t\t\tattachments = this.attachments( shortcode );\n\n\t\t\t\tselection = new wp.media.model.Selection( attachments.models, {\n\t\t\t\t\tprops:    attachments.props.toJSON(),\n\t\t\t\t\tmultiple: true\n\t\t\t\t});\n\n\t\t\t\tselection[ this.tag ] = attachments[ this.tag ];\n\n\t\t\t\t// Fetch the query's attachments, and then break ties from the\n\t\t\t\t// query to allow for sorting.\n\t\t\t\tselection.more().done( function() {\n\t\t\t\t\t// Break ties with the query.\n\t\t\t\t\tselection.props.set({ query: false });\n\t\t\t\t\tselection.unmirror();\n\t\t\t\t\tselection.props.unset('orderby');\n\t\t\t\t});\n\n\t\t\t\t// Destroy the previous gallery frame.\n\t\t\t\tif ( this.frame ) {\n\t\t\t\t\tthis.frame.dispose();\n\t\t\t\t}\n\n\t\t\t\tif ( shortcode.attrs.named.type && 'video' === shortcode.attrs.named.type ) {\n\t\t\t\t\tstate = 'video-' + this.tag + '-edit';\n\t\t\t\t} else {\n\t\t\t\t\tstate = this.tag + '-edit';\n\t\t\t\t}\n\n\t\t\t\t// Store the current frame.\n\t\t\t\tthis.frame = wp.media({\n\t\t\t\t\tframe:     'post',\n\t\t\t\t\tstate:     state,\n\t\t\t\t\ttitle:     this.editTitle,\n\t\t\t\t\tediting:   true,\n\t\t\t\t\tmultiple:  true,\n\t\t\t\t\tselection: selection\n\t\t\t\t}).open();\n\n\t\t\t\treturn this.frame;\n\t\t\t},\n\n\t\t\tsetDefaults: function( attrs ) {\n\t\t\t\tvar self = this;\n\t\t\t\t// Remove default attributes from the shortcode.\n\t\t\t\t_.each( this.defaults, function( value, key ) {\n\t\t\t\t\tattrs[ key ] = self.coerce( attrs, key );\n\t\t\t\t\tif ( value === attrs[ key ] ) {\n\t\t\t\t\t\tdelete attrs[ key ];\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn attrs;\n\t\t\t}\n\t\t}, attributes );\n\t};\n\n\twp.media._galleryDefaults = {\n\t\titemtag: 'dl',\n\t\ticontag: 'dt',\n\t\tcaptiontag: 'dd',\n\t\tcolumns: '3',\n\t\tlink: 'post',\n\t\tsize: 'thumbnail',\n\t\torder: 'ASC',\n\t\tid: wp.media.view.settings.post && wp.media.view.settings.post.id,\n\t\torderby : 'menu_order ID'\n\t};\n\n\tif ( wp.media.view.settings.galleryDefaults ) {\n\t\twp.media.galleryDefaults = _.extend( {}, wp.media._galleryDefaults, wp.media.view.settings.galleryDefaults );\n\t} else {\n\t\twp.media.galleryDefaults = wp.media._galleryDefaults;\n\t}\n\n\twp.media.gallery = new wp.media.collection({\n\t\ttag: 'gallery',\n\t\ttype : 'image',\n\t\teditTitle : wp.media.view.l10n.editGalleryTitle,\n\t\tdefaults : wp.media.galleryDefaults,\n\n\t\tsetDefaults: function( attrs ) {\n\t\t\tvar self = this, changed = ! _.isEqual( wp.media.galleryDefaults, wp.media._galleryDefaults );\n\t\t\t_.each( this.defaults, function( value, key ) {\n\t\t\t\tattrs[ key ] = self.coerce( attrs, key );\n\t\t\t\tif ( value === attrs[ key ] && ( ! changed || value === wp.media._galleryDefaults[ key ] ) ) {\n\t\t\t\t\tdelete attrs[ key ];\n\t\t\t\t}\n\t\t\t} );\n\t\t\treturn attrs;\n\t\t}\n\t});\n\n\t/**\n\t * wp.media.featuredImage\n\t * @namespace\n\t */\n\twp.media.featuredImage = {\n\t\t/**\n\t\t * Get the featured image post ID\n\t\t *\n\t\t * @global wp.media.view.settings\n\t\t *\n\t\t * @returns {wp.media.view.settings.post.featuredImageId|number}\n\t\t */\n\t\tget: function() {\n\t\t\treturn wp.media.view.settings.post.featuredImageId;\n\t\t},\n\t\t/**\n\t\t * Set the featured image id, save the post thumbnail data and\n\t\t * set the HTML in the post meta box to the new featured image.\n\t\t *\n\t\t * @global wp.media.view.settings\n\t\t * @global wp.media.post\n\t\t *\n\t\t * @param {number} id The post ID of the featured image, or -1 to unset it.\n\t\t */\n\t\tset: function( id ) {\n\t\t\tvar settings = wp.media.view.settings;\n\n\t\t\tsettings.post.featuredImageId = id;\n\n\t\t\twp.media.post( 'set-post-thumbnail', {\n\t\t\t\tjson:         true,\n\t\t\t\tpost_id:      settings.post.id,\n\t\t\t\tthumbnail_id: settings.post.featuredImageId,\n\t\t\t\t_wpnonce:     settings.post.nonce\n\t\t\t}).done( function( html ) {\n\t\t\t\t$( '.inside', '#postimagediv' ).html( html );\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * The Featured Image workflow\n\t\t *\n\t\t * @global wp.media.controller.FeaturedImage\n\t\t * @global wp.media.view.l10n\n\t\t *\n\t\t * @this wp.media.featuredImage\n\t\t *\n\t\t * @returns {wp.media.view.MediaFrame.Select} A media workflow.\n\t\t */\n\t\tframe: function() {\n\t\t\tif ( this._frame ) {\n\t\t\t\twp.media.frame = this._frame;\n\t\t\t\treturn this._frame;\n\t\t\t}\n\n\t\t\tthis._frame = wp.media({\n\t\t\t\tstate: 'featured-image',\n\t\t\t\tstates: [ new wp.media.controller.FeaturedImage() , new wp.media.controller.EditImage() ]\n\t\t\t});\n\n\t\t\tthis._frame.on( 'toolbar:create:featured-image', function( toolbar ) {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.view.MediaFrame.Select\n\t\t\t\t */\n\t\t\t\tthis.createSelectToolbar( toolbar, {\n\t\t\t\t\ttext: wp.media.view.l10n.setFeaturedImage\n\t\t\t\t});\n\t\t\t}, this._frame );\n\n\t\t\tthis._frame.on( 'content:render:edit-image', function() {\n\t\t\t\tvar selection = this.state('featured-image').get('selection'),\n\t\t\t\t\tview = new wp.media.view.EditImage( { model: selection.single(), controller: this } ).render();\n\n\t\t\t\tthis.content.set( view );\n\n\t\t\t\t// after bringing in the frame, load the actual editor via an ajax call\n\t\t\t\tview.loadEditor();\n\n\t\t\t}, this._frame );\n\n\t\t\tthis._frame.state('featured-image').on( 'select', this.select );\n\t\t\treturn this._frame;\n\t\t},\n\t\t/**\n\t\t * 'select' callback for Featured Image workflow, triggered when\n\t\t *  the 'Set Featured Image' button is clicked in the media modal.\n\t\t *\n\t\t * @global wp.media.view.settings\n\t\t *\n\t\t * @this wp.media.controller.FeaturedImage\n\t\t */\n\t\tselect: function() {\n\t\t\tvar selection = this.get('selection').single();\n\n\t\t\tif ( ! wp.media.view.settings.post.featuredImageId ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twp.media.featuredImage.set( selection ? selection.id : -1 );\n\t\t},\n\t\t/**\n\t\t * Open the content media manager to the 'featured image' tab when\n\t\t * the post thumbnail is clicked.\n\t\t *\n\t\t * Update the featured image id when the 'remove' link is clicked.\n\t\t *\n\t\t * @global wp.media.view.settings\n\t\t */\n\t\tinit: function() {\n\t\t\t$('#postimagediv').on( 'click', '#set-post-thumbnail', function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t// Stop propagation to prevent thickbox from activating.\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\twp.media.featuredImage.frame().open();\n\t\t\t}).on( 'click', '#remove-post-thumbnail', function() {\n\t\t\t\twp.media.view.settings.post.featuredImageId = -1;\n\t\t\t});\n\t\t}\n\t};\n\n\t$( wp.media.featuredImage.init );\n\n\t/**\n\t * wp.media.editor\n\t * @namespace\n\t */\n\twp.media.editor = {\n\t\t/**\n\t\t * Send content to the editor\n\t\t *\n\t\t * @global tinymce\n\t\t * @global QTags\n\t\t * @global wpActiveEditor\n\t\t * @global tb_remove() - Possibly overloaded by legacy plugins\n\t\t *\n\t\t * @param {string} html Content to send to the editor\n\t\t */\n\t\tinsert: function( html ) {\n\t\t\tvar editor, wpActiveEditor,\n\t\t\t\thasTinymce = ! _.isUndefined( window.tinymce ),\n\t\t\t\thasQuicktags = ! _.isUndefined( window.QTags );\n\n\t\t\tif ( this.activeEditor ) {\n\t\t\t\twpActiveEditor = window.wpActiveEditor = this.activeEditor;\n\t\t\t} else {\n\t\t\t\twpActiveEditor = window.wpActiveEditor;\n\t\t\t}\n\n\t\t\t// Delegate to the global `send_to_editor` if it exists.\n\t\t\t// This attempts to play nice with any themes/plugins that have\n\t\t\t// overridden the insert functionality.\n\t\t\tif ( window.send_to_editor ) {\n\t\t\t\treturn window.send_to_editor.apply( this, arguments );\n\t\t\t}\n\n\t\t\tif ( ! wpActiveEditor ) {\n\t\t\t\tif ( hasTinymce && tinymce.activeEditor ) {\n\t\t\t\t\teditor = tinymce.activeEditor;\n\t\t\t\t\twpActiveEditor = window.wpActiveEditor = editor.id;\n\t\t\t\t} else if ( ! hasQuicktags ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if ( hasTinymce ) {\n\t\t\t\teditor = tinymce.get( wpActiveEditor );\n\t\t\t}\n\n\t\t\tif ( editor && ! editor.isHidden() ) {\n\t\t\t\teditor.execCommand( 'mceInsertContent', false, html );\n\t\t\t} else if ( hasQuicktags ) {\n\t\t\t\tQTags.insertContent( html );\n\t\t\t} else {\n\t\t\t\tdocument.getElementById( wpActiveEditor ).value += html;\n\t\t\t}\n\n\t\t\t// If the old thickbox remove function exists, call it in case\n\t\t\t// a theme/plugin overloaded it.\n\t\t\tif ( window.tb_remove ) {\n\t\t\t\ttry { window.tb_remove(); } catch( e ) {}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Setup 'workflow' and add to the 'workflows' cache. 'open' can\n\t\t *  subsequently be called upon it.\n\t\t *\n\t\t * @global wp.media.view.l10n\n\t\t *\n\t\t * @param {string} id A slug used to identify the workflow.\n\t\t * @param {Object} [options={}]\n\t\t *\n\t\t * @this wp.media.editor\n\t\t *\n\t\t * @returns {wp.media.view.MediaFrame.Select} A media workflow.\n\t\t */\n\t\tadd: function( id, options ) {\n\t\t\tvar workflow = this.get( id );\n\n\t\t\t// only add once: if exists return existing\n\t\t\tif ( workflow ) {\n\t\t\t\treturn workflow;\n\t\t\t}\n\n\t\t\tworkflow = workflows[ id ] = wp.media( _.defaults( options || {}, {\n\t\t\t\tframe:    'post',\n\t\t\t\tstate:    'insert',\n\t\t\t\ttitle:    wp.media.view.l10n.addMedia,\n\t\t\t\tmultiple: true\n\t\t\t} ) );\n\n\t\t\tworkflow.on( 'insert', function( selection ) {\n\t\t\t\tvar state = workflow.state();\n\n\t\t\t\tselection = selection || state.get('selection');\n\n\t\t\t\tif ( ! selection )\n\t\t\t\t\treturn;\n\n\t\t\t\t$.when.apply( $, selection.map( function( attachment ) {\n\t\t\t\t\tvar display = state.display( attachment ).toJSON();\n\t\t\t\t\t/**\n\t\t\t\t\t * @this wp.media.editor\n\t\t\t\t\t */\n\t\t\t\t\treturn this.send.attachment( display, attachment.toJSON() );\n\t\t\t\t}, this ) ).done( function() {\n\t\t\t\t\twp.media.editor.insert( _.toArray( arguments ).join('\\n\\n') );\n\t\t\t\t});\n\t\t\t}, this );\n\n\t\t\tworkflow.state('gallery-edit').on( 'update', function( selection ) {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.editor\n\t\t\t\t */\n\t\t\t\tthis.insert( wp.media.gallery.shortcode( selection ).string() );\n\t\t\t}, this );\n\n\t\t\tworkflow.state('playlist-edit').on( 'update', function( selection ) {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.editor\n\t\t\t\t */\n\t\t\t\tthis.insert( wp.media.playlist.shortcode( selection ).string() );\n\t\t\t}, this );\n\n\t\t\tworkflow.state('video-playlist-edit').on( 'update', function( selection ) {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.editor\n\t\t\t\t */\n\t\t\t\tthis.insert( wp.media.playlist.shortcode( selection ).string() );\n\t\t\t}, this );\n\n\t\t\tworkflow.state('embed').on( 'select', function() {\n\t\t\t\t/**\n\t\t\t\t * @this wp.media.editor\n\t\t\t\t */\n\t\t\t\tvar state = workflow.state(),\n\t\t\t\t\ttype = state.get('type'),\n\t\t\t\t\tembed = state.props.toJSON();\n\n\t\t\t\tembed.url = embed.url || '';\n\n\t\t\t\tif ( 'link' === type ) {\n\t\t\t\t\t_.defaults( embed, {\n\t\t\t\t\t\tlinkText: embed.url,\n\t\t\t\t\t\tlinkUrl: embed.url\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.send.link( embed ).done( function( resp ) {\n\t\t\t\t\t\twp.media.editor.insert( resp );\n\t\t\t\t\t});\n\n\t\t\t\t} else if ( 'image' === type ) {\n\t\t\t\t\t_.defaults( embed, {\n\t\t\t\t\t\ttitle:   embed.url,\n\t\t\t\t\t\tlinkUrl: '',\n\t\t\t\t\t\talign:   'none',\n\t\t\t\t\t\tlink:    'none'\n\t\t\t\t\t});\n\n\t\t\t\t\tif ( 'none' === embed.link ) {\n\t\t\t\t\t\tembed.linkUrl = '';\n\t\t\t\t\t} else if ( 'file' === embed.link ) {\n\t\t\t\t\t\tembed.linkUrl = embed.url;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.insert( wp.media.string.image( embed ) );\n\t\t\t\t}\n\t\t\t}, this );\n\n\t\t\tworkflow.state('featured-image').on( 'select', wp.media.featuredImage.select );\n\t\t\tworkflow.setState( workflow.options.state );\n\t\t\treturn workflow;\n\t\t},\n\t\t/**\n\t\t * Determines the proper current workflow id\n\t\t *\n\t\t * @global wpActiveEditor\n\t\t * @global tinymce\n\t\t *\n\t\t * @param {string} [id=''] A slug used to identify the workflow.\n\t\t *\n\t\t * @returns {wpActiveEditor|string|tinymce.activeEditor.id}\n\t\t */\n\t\tid: function( id ) {\n\t\t\tif ( id ) {\n\t\t\t\treturn id;\n\t\t\t}\n\n\t\t\t// If an empty `id` is provided, default to `wpActiveEditor`.\n\t\t\tid = window.wpActiveEditor;\n\n\t\t\t// If that doesn't work, fall back to `tinymce.activeEditor.id`.\n\t\t\tif ( ! id && ! _.isUndefined( window.tinymce ) && tinymce.activeEditor ) {\n\t\t\t\tid = tinymce.activeEditor.id;\n\t\t\t}\n\n\t\t\t// Last but not least, fall back to the empty string.\n\t\t\tid = id || '';\n\t\t\treturn id;\n\t\t},\n\t\t/**\n\t\t * Return the workflow specified by id\n\t\t *\n\t\t * @param {string} id A slug used to identify the workflow.\n\t\t *\n\t\t * @this wp.media.editor\n\t\t *\n\t\t * @returns {wp.media.view.MediaFrame} A media workflow.\n\t\t */\n\t\tget: function( id ) {\n\t\t\tid = this.id( id );\n\t\t\treturn workflows[ id ];\n\t\t},\n\t\t/**\n\t\t * Remove the workflow represented by id from the workflow cache\n\t\t *\n\t\t * @param {string} id A slug used to identify the workflow.\n\t\t *\n\t\t * @this wp.media.editor\n\t\t */\n\t\tremove: function( id ) {\n\t\t\tid = this.id( id );\n\t\t\tdelete workflows[ id ];\n\t\t},\n\t\t/**\n\t\t * @namespace\n\t\t */\n\t\tsend: {\n\t\t\t/**\n\t\t\t * Called when sending an attachment to the editor\n\t\t\t *   from the medial modal.\n\t\t\t *\n\t\t\t * @global wp.media.view.settings\n\t\t\t * @global wp.media.post\n\t\t\t *\n\t\t\t * @param {Object} props Attachment details (align, link, size, etc).\n\t\t\t * @param {Object} attachment The attachment object, media version of Post.\n\t\t\t * @returns {Promise}\n\t\t\t */\n\t\t\tattachment: function( props, attachment ) {\n\t\t\t\tvar caption = attachment.caption,\n\t\t\t\t\toptions, html;\n\n\t\t\t\t// If captions are disabled, clear the caption.\n\t\t\t\tif ( ! wp.media.view.settings.captions ) {\n\t\t\t\t\tdelete attachment.caption;\n\t\t\t\t}\n\n\t\t\t\tprops = wp.media.string.props( props, attachment );\n\n\t\t\t\toptions = {\n\t\t\t\t\tid:           attachment.id,\n\t\t\t\t\tpost_content: attachment.description,\n\t\t\t\t\tpost_excerpt: caption\n\t\t\t\t};\n\n\t\t\t\tif ( props.linkUrl ) {\n\t\t\t\t\toptions.url = props.linkUrl;\n\t\t\t\t}\n\n\t\t\t\tif ( 'image' === attachment.type ) {\n\t\t\t\t\thtml = wp.media.string.image( props );\n\n\t\t\t\t\t_.each({\n\t\t\t\t\t\talign: 'align',\n\t\t\t\t\t\tsize:  'image-size',\n\t\t\t\t\t\talt:   'image_alt'\n\t\t\t\t\t}, function( option, prop ) {\n\t\t\t\t\t\tif ( props[ prop ] )\n\t\t\t\t\t\t\toptions[ option ] = props[ prop ];\n\t\t\t\t\t});\n\t\t\t\t} else if ( 'video' === attachment.type ) {\n\t\t\t\t\thtml = wp.media.string.video( props, attachment );\n\t\t\t\t} else if ( 'audio' === attachment.type ) {\n\t\t\t\t\thtml = wp.media.string.audio( props, attachment );\n\t\t\t\t} else {\n\t\t\t\t\thtml = wp.media.string.link( props );\n\t\t\t\t\toptions.post_title = props.title;\n\t\t\t\t}\n\n\t\t\t\treturn wp.media.post( 'send-attachment-to-editor', {\n\t\t\t\t\tnonce:      wp.media.view.settings.nonce.sendToEditor,\n\t\t\t\t\tattachment: options,\n\t\t\t\t\thtml:       html,\n\t\t\t\t\tpost_id:    wp.media.view.settings.post.id\n\t\t\t\t});\n\t\t\t},\n\t\t\t/**\n\t\t\t * Called when 'Insert From URL' source is not an image. Example: YouTube url.\n\t\t\t *\n\t\t\t * @global wp.media.view.settings\n\t\t\t *\n\t\t\t * @param {Object} embed\n\t\t\t * @returns {Promise}\n\t\t\t */\n\t\t\tlink: function( embed ) {\n\t\t\t\treturn wp.media.post( 'send-link-to-editor', {\n\t\t\t\t\tnonce:     wp.media.view.settings.nonce.sendToEditor,\n\t\t\t\t\tsrc:       embed.linkUrl,\n\t\t\t\t\tlink_text: embed.linkText,\n\t\t\t\t\thtml:      wp.media.string.link( embed ),\n\t\t\t\t\tpost_id:   wp.media.view.settings.post.id\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Open a workflow\n\t\t *\n\t\t * @param {string} [id=undefined] Optional. A slug used to identify the workflow.\n\t\t * @param {Object} [options={}]\n\t\t *\n\t\t * @this wp.media.editor\n\t\t *\n\t\t * @returns {wp.media.view.MediaFrame}\n\t\t */\n\t\topen: function( id, options ) {\n\t\t\tvar workflow;\n\n\t\t\toptions = options || {};\n\n\t\t\tid = this.id( id );\n\t\t\tthis.activeEditor = id;\n\n\t\t\tworkflow = this.get( id );\n\n\t\t\t// Redo workflow if state has changed\n\t\t\tif ( ! workflow || ( workflow.options && options.state !== workflow.options.state ) ) {\n\t\t\t\tworkflow = this.add( id, options );\n\t\t\t}\n\n\t\t\twp.media.frame = workflow;\n\n\t\t\treturn workflow.open();\n\t\t},\n\n\t\t/**\n\t\t * Bind click event for .insert-media using event delegation\n\t\t *\n\t\t * @global wp.media.view.l10n\n\t\t */\n\t\tinit: function() {\n\t\t\t$(document.body)\n\t\t\t\t.on( 'click.add-media-button', '.insert-media', function( event ) {\n\t\t\t\t\tvar elem = $( event.currentTarget ),\n\t\t\t\t\t\teditor = elem.data('editor'),\n\t\t\t\t\t\toptions = {\n\t\t\t\t\t\t\tframe:    'post',\n\t\t\t\t\t\t\tstate:    'insert',\n\t\t\t\t\t\t\ttitle:    wp.media.view.l10n.addMedia,\n\t\t\t\t\t\t\tmultiple: true\n\t\t\t\t\t\t};\n\n\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t// Remove focus from the `.insert-media` button.\n\t\t\t\t\t// Prevents Opera from showing the outline of the button\n\t\t\t\t\t// above the modal.\n\t\t\t\t\t//\n\t\t\t\t\t// See: https://core.trac.wordpress.org/ticket/22445\n\t\t\t\t\telem.blur();\n\n\t\t\t\t\tif ( elem.hasClass( 'gallery' ) ) {\n\t\t\t\t\t\toptions.state = 'gallery';\n\t\t\t\t\t\toptions.title = wp.media.view.l10n.createGalleryTitle;\n\t\t\t\t\t}\n\n\t\t\t\t\twp.media.editor.open( editor, options );\n\t\t\t\t});\n\n\t\t\t// Initialize and render the Editor drag-and-drop uploader.\n\t\t\tnew wp.media.view.EditorUploader().render();\n\t\t}\n\t};\n\n\t_.bindAll( wp.media.editor, 'open' );\n\t$( wp.media.editor.init );\n}(jQuery, _));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/media-grid.js",
    "content": "(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(require,module,exports){\n/**\n * wp.media.controller.EditAttachmentMetadata\n *\n * A state for editing an attachment's metadata.\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nvar l10n = wp.media.view.l10n,\n\tEditAttachmentMetadata;\n\nEditAttachmentMetadata = wp.media.controller.State.extend({\n\tdefaults: {\n\t\tid:      'edit-attachment',\n\t\t// Title string passed to the frame's title region view.\n\t\ttitle:   l10n.attachmentDetails,\n\t\t// Region mode defaults.\n\t\tcontent: 'edit-metadata',\n\t\tmenu:    false,\n\t\ttoolbar: false,\n\t\trouter:  false\n\t}\n});\n\nmodule.exports = EditAttachmentMetadata;\n\n},{}],2:[function(require,module,exports){\nvar media = wp.media;\n\nmedia.controller.EditAttachmentMetadata = require( './controllers/edit-attachment-metadata.js' );\nmedia.view.MediaFrame.Manage = require( './views/frame/manage.js' );\nmedia.view.Attachment.Details.TwoColumn = require( './views/attachment/details-two-column.js' );\nmedia.view.MediaFrame.Manage.Router = require( './routers/manage.js' );\nmedia.view.EditImage.Details = require( './views/edit-image-details.js' );\nmedia.view.MediaFrame.EditAttachments = require( './views/frame/edit-attachments.js' );\nmedia.view.SelectModeToggleButton = require( './views/button/select-mode-toggle.js' );\nmedia.view.DeleteSelectedButton = require( './views/button/delete-selected.js' );\nmedia.view.DeleteSelectedPermanentlyButton = require( './views/button/delete-selected-permanently.js' );\n\n},{\"./controllers/edit-attachment-metadata.js\":1,\"./routers/manage.js\":3,\"./views/attachment/details-two-column.js\":4,\"./views/button/delete-selected-permanently.js\":5,\"./views/button/delete-selected.js\":6,\"./views/button/select-mode-toggle.js\":7,\"./views/edit-image-details.js\":8,\"./views/frame/edit-attachments.js\":9,\"./views/frame/manage.js\":10}],3:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.Manage.Router\n *\n * A router for handling the browser history and application state.\n *\n * @class\n * @augments Backbone.Router\n */\nvar Router = Backbone.Router.extend({\n\troutes: {\n\t\t'upload.php?item=:slug':    'showItem',\n\t\t'upload.php?search=:query': 'search'\n\t},\n\n\t// Map routes against the page URL\n\tbaseUrl: function( url ) {\n\t\treturn 'upload.php' + url;\n\t},\n\n\t// Respond to the search route by filling the search field and trigggering the input event\n\tsearch: function( query ) {\n\t\tjQuery( '#media-search-input' ).val( query ).trigger( 'input' );\n\t},\n\n\t// Show the modal with a specific item\n\tshowItem: function( query ) {\n\t\tvar media = wp.media,\n\t\t\tlibrary = media.frame.state().get('library'),\n\t\t\titem;\n\n\t\t// Trigger the media frame to open the correct item\n\t\titem = library.findWhere( { id: parseInt( query, 10 ) } );\n\t\tif ( item ) {\n\t\t\tmedia.frame.trigger( 'edit:attachment', item );\n\t\t} else {\n\t\t\titem = media.attachment( query );\n\t\t\tmedia.frame.listenTo( item, 'change', function( model ) {\n\t\t\t\tmedia.frame.stopListening( item );\n\t\t\t\tmedia.frame.trigger( 'edit:attachment', model );\n\t\t\t} );\n\t\t\titem.fetch();\n\t\t}\n\t}\n});\n\nmodule.exports = Router;\n\n},{}],4:[function(require,module,exports){\n/**\n * wp.media.view.Attachment.Details.TwoColumn\n *\n * A similar view to media.view.Attachment.Details\n * for use in the Edit Attachment modal.\n *\n * @class\n * @augments wp.media.view.Attachment.Details\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Details = wp.media.view.Attachment.Details,\n\tTwoColumn;\n\nTwoColumn = Details.extend({\n\ttemplate: wp.template( 'attachment-details-two-column' ),\n\n\teditAttachment: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.controller.content.mode( 'edit-image' );\n\t},\n\n\t/**\n\t * Noop this from parent class, doesn't apply here.\n\t */\n\ttoggleSelectionHandler: function() {},\n\n\trender: function() {\n\t\tDetails.prototype.render.apply( this, arguments );\n\n\t\twp.media.mixin.removeAllPlayers();\n\t\tthis.$( 'audio, video' ).each( function (i, elem) {\n\t\t\tvar el = wp.media.view.MediaDetails.prepareSrc( elem );\n\t\t\tnew window.MediaElementPlayer( el, wp.media.mixin.mejsSettings );\n\t\t} );\n\t}\n});\n\nmodule.exports = TwoColumn;\n\n},{}],5:[function(require,module,exports){\n/**\n * wp.media.view.DeleteSelectedPermanentlyButton\n *\n * When MEDIA_TRASH is true, a button that handles bulk Delete Permanently logic\n *\n * @class\n * @augments wp.media.view.DeleteSelectedButton\n * @augments wp.media.view.Button\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Button = wp.media.view.Button,\n\tDeleteSelected = wp.media.view.DeleteSelectedButton,\n\tDeleteSelectedPermanently;\n\nDeleteSelectedPermanently = DeleteSelected.extend({\n\tinitialize: function() {\n\t\tDeleteSelected.prototype.initialize.apply( this, arguments );\n\t\tthis.listenTo( this.controller, 'select:activate', this.selectActivate );\n\t\tthis.listenTo( this.controller, 'select:deactivate', this.selectDeactivate );\n\t},\n\n\tfilterChange: function( model ) {\n\t\tthis.canShow = ( 'trash' === model.get( 'status' ) );\n\t},\n\n\tselectActivate: function() {\n\t\tthis.toggleDisabled();\n\t\tthis.$el.toggleClass( 'hidden', ! this.canShow );\n\t},\n\n\tselectDeactivate: function() {\n\t\tthis.toggleDisabled();\n\t\tthis.$el.addClass( 'hidden' );\n\t},\n\n\trender: function() {\n\t\tButton.prototype.render.apply( this, arguments );\n\t\tthis.selectActivate();\n\t\treturn this;\n\t}\n});\n\nmodule.exports = DeleteSelectedPermanently;\n\n},{}],6:[function(require,module,exports){\n/**\n * wp.media.view.DeleteSelectedButton\n *\n * A button that handles bulk Delete/Trash logic\n *\n * @class\n * @augments wp.media.view.Button\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Button = wp.media.view.Button,\n\tl10n = wp.media.view.l10n,\n\tDeleteSelected;\n\nDeleteSelected = Button.extend({\n\tinitialize: function() {\n\t\tButton.prototype.initialize.apply( this, arguments );\n\t\tif ( this.options.filters ) {\n\t\t\tthis.listenTo( this.options.filters.model, 'change', this.filterChange );\n\t\t}\n\t\tthis.listenTo( this.controller, 'selection:toggle', this.toggleDisabled );\n\t},\n\n\tfilterChange: function( model ) {\n\t\tif ( 'trash' === model.get( 'status' ) ) {\n\t\t\tthis.model.set( 'text', l10n.untrashSelected );\n\t\t} else if ( wp.media.view.settings.mediaTrash ) {\n\t\t\tthis.model.set( 'text', l10n.trashSelected );\n\t\t} else {\n\t\t\tthis.model.set( 'text', l10n.deleteSelected );\n\t\t}\n\t},\n\n\ttoggleDisabled: function() {\n\t\tthis.model.set( 'disabled', ! this.controller.state().get( 'selection' ).length );\n\t},\n\n\trender: function() {\n\t\tButton.prototype.render.apply( this, arguments );\n\t\tif ( this.controller.isModeActive( 'select' ) ) {\n\t\t\tthis.$el.addClass( 'delete-selected-button' );\n\t\t} else {\n\t\t\tthis.$el.addClass( 'delete-selected-button hidden' );\n\t\t}\n\t\tthis.toggleDisabled();\n\t\treturn this;\n\t}\n});\n\nmodule.exports = DeleteSelected;\n\n},{}],7:[function(require,module,exports){\n/**\n * wp.media.view.SelectModeToggleButton\n *\n * @class\n * @augments wp.media.view.Button\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Button = wp.media.view.Button,\n\tl10n = wp.media.view.l10n,\n\tSelectModeToggle;\n\nSelectModeToggle = Button.extend({\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tsize : ''\n\t\t} );\n\n\t\tButton.prototype.initialize.apply( this, arguments );\n\t\tthis.listenTo( this.controller, 'select:activate select:deactivate', this.toggleBulkEditHandler );\n\t\tthis.listenTo( this.controller, 'selection:action:done', this.back );\n\t},\n\n\tback: function () {\n\t\tthis.controller.deactivateMode( 'select' ).activateMode( 'edit' );\n\t},\n\n\tclick: function() {\n\t\tButton.prototype.click.apply( this, arguments );\n\t\tif ( this.controller.isModeActive( 'select' ) ) {\n\t\t\tthis.back();\n\t\t} else {\n\t\t\tthis.controller.deactivateMode( 'edit' ).activateMode( 'select' );\n\t\t}\n\t},\n\n\trender: function() {\n\t\tButton.prototype.render.apply( this, arguments );\n\t\tthis.$el.addClass( 'select-mode-toggle-button' );\n\t\treturn this;\n\t},\n\n\ttoggleBulkEditHandler: function() {\n\t\tvar toolbar = this.controller.content.get().toolbar, children;\n\n\t\tchildren = toolbar.$( '.media-toolbar-secondary > *, .media-toolbar-primary > *' );\n\n\t\t// TODO: the Frame should be doing all of this.\n\t\tif ( this.controller.isModeActive( 'select' ) ) {\n\t\t\tthis.model.set( {\n\t\t\t\tsize: 'large',\n\t\t\t\ttext: l10n.cancelSelection\n\t\t\t} );\n\t\t\tchildren.not( '.spinner, .media-button' ).hide();\n\t\t\tthis.$el.show();\n\t\t\ttoolbar.$( '.delete-selected-button' ).removeClass( 'hidden' );\n\t\t} else {\n\t\t\tthis.model.set( {\n\t\t\t\tsize: '',\n\t\t\t\ttext: l10n.bulkSelect\n\t\t\t} );\n\t\t\tthis.controller.content.get().$el.removeClass( 'fixed' );\n\t\t\ttoolbar.$el.css( 'width', '' );\n\t\t\ttoolbar.$( '.delete-selected-button' ).addClass( 'hidden' );\n\t\t\tchildren.not( '.media-button' ).show();\n\t\t\tthis.controller.state().get( 'selection' ).reset();\n\t\t}\n\t}\n});\n\nmodule.exports = SelectModeToggle;\n\n},{}],8:[function(require,module,exports){\n/**\n * wp.media.view.EditImage.Details\n *\n * @class\n * @augments wp.media.view.EditImage\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\tEditImage = wp.media.view.EditImage,\n\tDetails;\n\nDetails = EditImage.extend({\n\tinitialize: function( options ) {\n\t\tthis.editor = window.imageEdit;\n\t\tthis.frame = options.frame;\n\t\tthis.controller = options.controller;\n\t\tView.prototype.initialize.apply( this, arguments );\n\t},\n\n\tback: function() {\n\t\tthis.frame.content.mode( 'edit-metadata' );\n\t},\n\n\tsave: function() {\n\t\tthis.model.fetch().done( _.bind( function() {\n\t\t\tthis.frame.content.mode( 'edit-metadata' );\n\t\t}, this ) );\n\t}\n});\n\nmodule.exports = Details;\n\n},{}],9:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.EditAttachments\n *\n * A frame for editing the details of a specific media item.\n *\n * Opens in a modal by default.\n *\n * Requires an attachment model to be passed in the options hash under `model`.\n *\n * @class\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar Frame = wp.media.view.Frame,\n\tMediaFrame = wp.media.view.MediaFrame,\n\n\t$ = jQuery,\n\tEditAttachments;\n\nEditAttachments = MediaFrame.extend({\n\n\tclassName: 'edit-attachment-frame',\n\ttemplate:  wp.template( 'edit-attachment-frame' ),\n\tregions:   [ 'title', 'content' ],\n\n\tevents: {\n\t\t'click .left':  'previousMediaItem',\n\t\t'click .right': 'nextMediaItem'\n\t},\n\n\tinitialize: function() {\n\t\tFrame.prototype.initialize.apply( this, arguments );\n\n\t\t_.defaults( this.options, {\n\t\t\tmodal: true,\n\t\t\tstate: 'edit-attachment'\n\t\t});\n\n\t\tthis.controller = this.options.controller;\n\t\tthis.gridRouter = this.controller.gridRouter;\n\t\tthis.library = this.options.library;\n\n\t\tif ( this.options.model ) {\n\t\t\tthis.model = this.options.model;\n\t\t}\n\n\t\tthis.bindHandlers();\n\t\tthis.createStates();\n\t\tthis.createModal();\n\n\t\tthis.title.mode( 'default' );\n\t\tthis.toggleNav();\n\t},\n\n\tbindHandlers: function() {\n\t\t// Bind default title creation.\n\t\tthis.on( 'title:create:default', this.createTitle, this );\n\n\t\t// Close the modal if the attachment is deleted.\n\t\tthis.listenTo( this.model, 'change:status destroy', this.close, this );\n\n\t\tthis.on( 'content:create:edit-metadata', this.editMetadataMode, this );\n\t\tthis.on( 'content:create:edit-image', this.editImageMode, this );\n\t\tthis.on( 'content:render:edit-image', this.editImageModeRender, this );\n\t\tthis.on( 'close', this.detach );\n\t},\n\n\tcreateModal: function() {\n\t\t// Initialize modal container view.\n\t\tif ( this.options.modal ) {\n\t\t\tthis.modal = new wp.media.view.Modal({\n\t\t\t\tcontroller: this,\n\t\t\t\ttitle:      this.options.title\n\t\t\t});\n\n\t\t\tthis.modal.on( 'open', _.bind( function () {\n\t\t\t\t$( 'body' ).on( 'keydown.media-modal', _.bind( this.keyEvent, this ) );\n\t\t\t}, this ) );\n\n\t\t\t// Completely destroy the modal DOM element when closing it.\n\t\t\tthis.modal.on( 'close', _.bind( function() {\n\t\t\t\tthis.modal.remove();\n\t\t\t\t$( 'body' ).off( 'keydown.media-modal' ); /* remove the keydown event */\n\t\t\t\t// Restore the original focus item if possible\n\t\t\t\t$( 'li.attachment[data-id=\"' + this.model.get( 'id' ) +'\"]' ).focus();\n\t\t\t\tthis.resetRoute();\n\t\t\t}, this ) );\n\n\t\t\t// Set this frame as the modal's content.\n\t\t\tthis.modal.content( this );\n\t\t\tthis.modal.open();\n\t\t}\n\t},\n\n\t/**\n\t * Add the default states to the frame.\n\t */\n\tcreateStates: function() {\n\t\tthis.states.add([\n\t\t\tnew wp.media.controller.EditAttachmentMetadata( { model: this.model } )\n\t\t]);\n\t},\n\n\t/**\n\t * Content region rendering callback for the `edit-metadata` mode.\n\t *\n\t * @param {Object} contentRegion Basic object with a `view` property, which\n\t *                               should be set with the proper region view.\n\t */\n\teditMetadataMode: function( contentRegion ) {\n\t\tcontentRegion.view = new wp.media.view.Attachment.Details.TwoColumn({\n\t\t\tcontroller: this,\n\t\t\tmodel:      this.model\n\t\t});\n\n\t\t/**\n\t\t * Attach a subview to display fields added via the\n\t\t * `attachment_fields_to_edit` filter.\n\t\t */\n\t\tcontentRegion.view.views.set( '.attachment-compat', new wp.media.view.AttachmentCompat({\n\t\t\tcontroller: this,\n\t\t\tmodel:      this.model\n\t\t}) );\n\n\t\t// Update browser url when navigating media details\n\t\tif ( this.model ) {\n\t\t\tthis.gridRouter.navigate( this.gridRouter.baseUrl( '?item=' + this.model.id ) );\n\t\t}\n\t},\n\n\t/**\n\t * Render the EditImage view into the frame's content region.\n\t *\n\t * @param {Object} contentRegion Basic object with a `view` property, which\n\t *                               should be set with the proper region view.\n\t */\n\teditImageMode: function( contentRegion ) {\n\t\tvar editImageController = new wp.media.controller.EditImage( {\n\t\t\tmodel: this.model,\n\t\t\tframe: this\n\t\t} );\n\t\t// Noop some methods.\n\t\teditImageController._toolbar = function() {};\n\t\teditImageController._router = function() {};\n\t\teditImageController._menu = function() {};\n\n\t\tcontentRegion.view = new wp.media.view.EditImage.Details( {\n\t\t\tmodel: this.model,\n\t\t\tframe: this,\n\t\t\tcontroller: editImageController\n\t\t} );\n\t},\n\n\teditImageModeRender: function( view ) {\n\t\tview.on( 'ready', view.loadEditor );\n\t},\n\n\ttoggleNav: function() {\n\t\tthis.$('.left').toggleClass( 'disabled', ! this.hasPrevious() );\n\t\tthis.$('.right').toggleClass( 'disabled', ! this.hasNext() );\n\t},\n\n\t/**\n\t * Rerender the view.\n\t */\n\trerender: function() {\n\t\t// Only rerender the `content` region.\n\t\tif ( this.content.mode() !== 'edit-metadata' ) {\n\t\t\tthis.content.mode( 'edit-metadata' );\n\t\t} else {\n\t\t\tthis.content.render();\n\t\t}\n\n\t\tthis.toggleNav();\n\t},\n\n\t/**\n\t * Click handler to switch to the previous media item.\n\t */\n\tpreviousMediaItem: function() {\n\t\tif ( ! this.hasPrevious() ) {\n\t\t\tthis.$( '.left' ).blur();\n\t\t\treturn;\n\t\t}\n\t\tthis.model = this.library.at( this.getCurrentIndex() - 1 );\n\t\tthis.rerender();\n\t\tthis.$( '.left' ).focus();\n\t},\n\n\t/**\n\t * Click handler to switch to the next media item.\n\t */\n\tnextMediaItem: function() {\n\t\tif ( ! this.hasNext() ) {\n\t\t\tthis.$( '.right' ).blur();\n\t\t\treturn;\n\t\t}\n\t\tthis.model = this.library.at( this.getCurrentIndex() + 1 );\n\t\tthis.rerender();\n\t\tthis.$( '.right' ).focus();\n\t},\n\n\tgetCurrentIndex: function() {\n\t\treturn this.library.indexOf( this.model );\n\t},\n\n\thasNext: function() {\n\t\treturn ( this.getCurrentIndex() + 1 ) < this.library.length;\n\t},\n\n\thasPrevious: function() {\n\t\treturn ( this.getCurrentIndex() - 1 ) > -1;\n\t},\n\t/**\n\t * Respond to the keyboard events: right arrow, left arrow, except when\n\t * focus is in a textarea or input field.\n\t */\n\tkeyEvent: function( event ) {\n\t\tif ( ( 'INPUT' === event.target.nodeName || 'TEXTAREA' === event.target.nodeName ) && ! ( event.target.readOnly || event.target.disabled ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// The right arrow key\n\t\tif ( 39 === event.keyCode ) {\n\t\t\tthis.nextMediaItem();\n\t\t}\n\t\t// The left arrow key\n\t\tif ( 37 === event.keyCode ) {\n\t\t\tthis.previousMediaItem();\n\t\t}\n\t},\n\n\tresetRoute: function() {\n\t\tthis.gridRouter.navigate( this.gridRouter.baseUrl( '' ) );\n\t}\n});\n\nmodule.exports = EditAttachments;\n\n},{}],10:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.Manage\n *\n * A generic management frame workflow.\n *\n * Used in the media grid view.\n *\n * @class\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar MediaFrame = wp.media.view.MediaFrame,\n\tLibrary = wp.media.controller.Library,\n\n\t$ = Backbone.$,\n\tManage;\n\nManage = MediaFrame.extend({\n\t/**\n\t * @global wp.Uploader\n\t */\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\ttitle:     '',\n\t\t\tmodal:     false,\n\t\t\tselection: [],\n\t\t\tlibrary:   {}, // Options hash for the query to the media library.\n\t\t\tmultiple:  'add',\n\t\t\tstate:     'library',\n\t\t\tuploader:  true,\n\t\t\tmode:      [ 'grid', 'edit' ]\n\t\t});\n\n\t\tthis.$body = $( document.body );\n\t\tthis.$window = $( window );\n\t\tthis.$adminBar = $( '#wpadminbar' );\n\t\tthis.$window.on( 'scroll resize', _.debounce( _.bind( this.fixPosition, this ), 15 ) );\n\t\t$( document ).on( 'click', '.page-title-action', _.bind( this.addNewClickHandler, this ) );\n\n\t\t// Ensure core and media grid view UI is enabled.\n\t\tthis.$el.addClass('wp-core-ui');\n\n\t\t// Force the uploader off if the upload limit has been exceeded or\n\t\t// if the browser isn't supported.\n\t\tif ( wp.Uploader.limitExceeded || ! wp.Uploader.browser.supported ) {\n\t\t\tthis.options.uploader = false;\n\t\t}\n\n\t\t// Initialize a window-wide uploader.\n\t\tif ( this.options.uploader ) {\n\t\t\tthis.uploader = new wp.media.view.UploaderWindow({\n\t\t\t\tcontroller: this,\n\t\t\t\tuploader: {\n\t\t\t\t\tdropzone:  document.body,\n\t\t\t\t\tcontainer: document.body\n\t\t\t\t}\n\t\t\t}).render();\n\t\t\tthis.uploader.ready();\n\t\t\t$('body').append( this.uploader.el );\n\n\t\t\tthis.options.uploader = false;\n\t\t}\n\n\t\tthis.gridRouter = new wp.media.view.MediaFrame.Manage.Router();\n\n\t\t// Call 'initialize' directly on the parent class.\n\t\tMediaFrame.prototype.initialize.apply( this, arguments );\n\n\t\t// Append the frame view directly the supplied container.\n\t\tthis.$el.appendTo( this.options.container );\n\n\t\tthis.createStates();\n\t\tthis.bindRegionModeHandlers();\n\t\tthis.render();\n\t\tthis.bindSearchHandler();\n\t},\n\n\tbindSearchHandler: function() {\n\t\tvar search = this.$( '#media-search-input' ),\n\t\t\tcurrentSearch = this.options.container.data( 'search' ),\n\t\t\tsearchView = this.browserView.toolbar.get( 'search' ).$el,\n\t\t\tlistMode = this.$( '.view-list' ),\n\n\t\t\tinput  = _.debounce( function (e) {\n\t\t\t\tvar val = $( e.currentTarget ).val(),\n\t\t\t\t\turl = '';\n\n\t\t\t\tif ( val ) {\n\t\t\t\t\turl += '?search=' + val;\n\t\t\t\t}\n\t\t\t\tthis.gridRouter.navigate( this.gridRouter.baseUrl( url ) );\n\t\t\t}, 1000 );\n\n\t\t// Update the URL when entering search string (at most once per second)\n\t\tsearch.on( 'input', _.bind( input, this ) );\n\t\tsearchView.val( currentSearch ).trigger( 'input' );\n\n\t\tthis.gridRouter.on( 'route:search', function () {\n\t\t\tvar href = window.location.href;\n\t\t\tif ( href.indexOf( 'mode=' ) > -1 ) {\n\t\t\t\thref = href.replace( /mode=[^&]+/g, 'mode=list' );\n\t\t\t} else {\n\t\t\t\thref += href.indexOf( '?' ) > -1 ? '&mode=list' : '?mode=list';\n\t\t\t}\n\t\t\thref = href.replace( 'search=', 's=' );\n\t\t\tlistMode.prop( 'href', href );\n\t\t} );\n\t},\n\n\t/**\n\t * Create the default states for the frame.\n\t */\n\tcreateStates: function() {\n\t\tvar options = this.options;\n\n\t\tif ( this.options.states ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add the default states.\n\t\tthis.states.add([\n\t\t\tnew Library({\n\t\t\t\tlibrary:            wp.media.query( options.library ),\n\t\t\t\tmultiple:           options.multiple,\n\t\t\t\ttitle:              options.title,\n\t\t\t\tcontent:            'browse',\n\t\t\t\ttoolbar:            'select',\n\t\t\t\tcontentUserSetting: false,\n\t\t\t\tfilterable:         'all',\n\t\t\t\tautoSelect:         false\n\t\t\t})\n\t\t]);\n\t},\n\n\t/**\n\t * Bind region mode activation events to proper handlers.\n\t */\n\tbindRegionModeHandlers: function() {\n\t\tthis.on( 'content:create:browse', this.browseContent, this );\n\n\t\t// Handle a frame-level event for editing an attachment.\n\t\tthis.on( 'edit:attachment', this.openEditAttachmentModal, this );\n\n\t\tthis.on( 'select:activate', this.bindKeydown, this );\n\t\tthis.on( 'select:deactivate', this.unbindKeydown, this );\n\t},\n\n\thandleKeydown: function( e ) {\n\t\tif ( 27 === e.which ) {\n\t\t\te.preventDefault();\n\t\t\tthis.deactivateMode( 'select' ).activateMode( 'edit' );\n\t\t}\n\t},\n\n\tbindKeydown: function() {\n\t\tthis.$body.on( 'keydown.select', _.bind( this.handleKeydown, this ) );\n\t},\n\n\tunbindKeydown: function() {\n\t\tthis.$body.off( 'keydown.select' );\n\t},\n\n\tfixPosition: function() {\n\t\tvar $browser, $toolbar;\n\t\tif ( ! this.isModeActive( 'select' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$browser = this.$('.attachments-browser');\n\t\t$toolbar = $browser.find('.media-toolbar');\n\n\t\t// Offset doesn't appear to take top margin into account, hence +16\n\t\tif ( ( $browser.offset().top + 16 ) < this.$window.scrollTop() + this.$adminBar.height() ) {\n\t\t\t$browser.addClass( 'fixed' );\n\t\t\t$toolbar.css('width', $browser.width() + 'px');\n\t\t} else {\n\t\t\t$browser.removeClass( 'fixed' );\n\t\t\t$toolbar.css('width', '');\n\t\t}\n\t},\n\n\t/**\n\t * Click handler for the `Add New` button.\n\t */\n\taddNewClickHandler: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.trigger( 'toggle:upload:attachment' );\n\t},\n\n\t/**\n\t * Open the Edit Attachment modal.\n\t */\n\topenEditAttachmentModal: function( model ) {\n\t\t// Create a new EditAttachment frame, passing along the library and the attachment model.\n\t\twp.media( {\n\t\t\tframe:       'edit-attachments',\n\t\t\tcontroller:  this,\n\t\t\tlibrary:     this.state().get('library'),\n\t\t\tmodel:       model\n\t\t} );\n\t},\n\n\t/**\n\t * Create an attachments browser view within the content region.\n\t *\n\t * @param {Object} contentRegion Basic object with a `view` property, which\n\t *                               should be set with the proper region view.\n\t * @this wp.media.controller.Region\n\t */\n\tbrowseContent: function( contentRegion ) {\n\t\tvar state = this.state();\n\n\t\t// Browse our library of attachments.\n\t\tthis.browserView = contentRegion.view = new wp.media.view.AttachmentsBrowser({\n\t\t\tcontroller: this,\n\t\t\tcollection: state.get('library'),\n\t\t\tselection:  state.get('selection'),\n\t\t\tmodel:      state,\n\t\t\tsortable:   state.get('sortable'),\n\t\t\tsearch:     state.get('searchable'),\n\t\t\tfilters:    state.get('filterable'),\n\t\t\tdate:       state.get('date'),\n\t\t\tdisplay:    state.get('displaySettings'),\n\t\t\tdragInfo:   state.get('dragInfo'),\n\t\t\tsidebar:    'errors',\n\n\t\t\tsuggestedWidth:  state.get('suggestedWidth'),\n\t\t\tsuggestedHeight: state.get('suggestedHeight'),\n\n\t\t\tAttachmentView: state.get('AttachmentView'),\n\n\t\t\tscrollElement: document\n\t\t});\n\t\tthis.browserView.on( 'ready', _.bind( this.bindDeferred, this ) );\n\n\t\tthis.errors = wp.Uploader.errors;\n\t\tthis.errors.on( 'add remove reset', this.sidebarVisibility, this );\n\t},\n\n\tsidebarVisibility: function() {\n\t\tthis.browserView.$( '.media-sidebar' ).toggle( !! this.errors.length );\n\t},\n\n\tbindDeferred: function() {\n\t\tif ( ! this.browserView.dfd ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.browserView.dfd.done( _.bind( this.startHistory, this ) );\n\t},\n\n\tstartHistory: function() {\n\t\t// Verify pushState support and activate\n\t\tif ( window.history && window.history.pushState ) {\n\t\t\tBackbone.history.start( {\n\t\t\t\troot: window._wpMediaGridSettings.adminUrl,\n\t\t\t\tpushState: true\n\t\t\t} );\n\t\t}\n\t}\n});\n\nmodule.exports = Manage;\n\n},{}]},{},[2]);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/media-models.js",
    "content": "(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(require,module,exports){\nvar $ = jQuery,\n\tAttachment, Attachments, l10n, media;\n\nwindow.wp = window.wp || {};\n\n/**\n * Create and return a media frame.\n *\n * Handles the default media experience.\n *\n * @param  {object} attributes The properties passed to the main media controller.\n * @return {wp.media.view.MediaFrame} A media workflow.\n */\nmedia = wp.media = function( attributes ) {\n\tvar MediaFrame = media.view.MediaFrame,\n\t\tframe;\n\n\tif ( ! MediaFrame ) {\n\t\treturn;\n\t}\n\n\tattributes = _.defaults( attributes || {}, {\n\t\tframe: 'select'\n\t});\n\n\tif ( 'select' === attributes.frame && MediaFrame.Select ) {\n\t\tframe = new MediaFrame.Select( attributes );\n\t} else if ( 'post' === attributes.frame && MediaFrame.Post ) {\n\t\tframe = new MediaFrame.Post( attributes );\n\t} else if ( 'manage' === attributes.frame && MediaFrame.Manage ) {\n\t\tframe = new MediaFrame.Manage( attributes );\n\t} else if ( 'image' === attributes.frame && MediaFrame.ImageDetails ) {\n\t\tframe = new MediaFrame.ImageDetails( attributes );\n\t} else if ( 'audio' === attributes.frame && MediaFrame.AudioDetails ) {\n\t\tframe = new MediaFrame.AudioDetails( attributes );\n\t} else if ( 'video' === attributes.frame && MediaFrame.VideoDetails ) {\n\t\tframe = new MediaFrame.VideoDetails( attributes );\n\t} else if ( 'edit-attachments' === attributes.frame && MediaFrame.EditAttachments ) {\n\t\tframe = new MediaFrame.EditAttachments( attributes );\n\t}\n\n\tdelete attributes.frame;\n\n\tmedia.frame = frame;\n\n\treturn frame;\n};\n\n_.extend( media, { model: {}, view: {}, controller: {}, frames: {} });\n\n// Link any localized strings.\nl10n = media.model.l10n = window._wpMediaModelsL10n || {};\n\n// Link any settings.\nmedia.model.settings = l10n.settings || {};\ndelete l10n.settings;\n\nAttachment = media.model.Attachment = require( './models/attachment.js' );\nAttachments = media.model.Attachments = require( './models/attachments.js' );\n\nmedia.model.Query = require( './models/query.js' );\nmedia.model.PostImage = require( './models/post-image.js' );\nmedia.model.Selection = require( './models/selection.js' );\n\n/**\n * ========================================================================\n * UTILITIES\n * ========================================================================\n */\n\n/**\n * A basic equality comparator for Backbone models.\n *\n * Used to order models within a collection - @see wp.media.model.Attachments.comparator().\n *\n * @param  {mixed}  a  The primary parameter to compare.\n * @param  {mixed}  b  The primary parameter to compare.\n * @param  {string} ac The fallback parameter to compare, a's cid.\n * @param  {string} bc The fallback parameter to compare, b's cid.\n * @return {number}    -1: a should come before b.\n *                      0: a and b are of the same rank.\n *                      1: b should come before a.\n */\nmedia.compare = function( a, b, ac, bc ) {\n\tif ( _.isEqual( a, b ) ) {\n\t\treturn ac === bc ? 0 : (ac > bc ? -1 : 1);\n\t} else {\n\t\treturn a > b ? -1 : 1;\n\t}\n};\n\n_.extend( media, {\n\t/**\n\t * media.template( id )\n\t *\n\t * Fetch a JavaScript template for an id, and return a templating function for it.\n\t *\n\t * See wp.template() in `wp-includes/js/wp-util.js`.\n\t *\n\t * @borrows wp.template as template\n\t */\n\ttemplate: wp.template,\n\n\t/**\n\t * media.post( [action], [data] )\n\t *\n\t * Sends a POST request to WordPress.\n\t * See wp.ajax.post() in `wp-includes/js/wp-util.js`.\n\t *\n\t * @borrows wp.ajax.post as post\n\t */\n\tpost: wp.ajax.post,\n\n\t/**\n\t * media.ajax( [action], [options] )\n\t *\n\t * Sends an XHR request to WordPress.\n\t * See wp.ajax.send() in `wp-includes/js/wp-util.js`.\n\t *\n\t * @borrows wp.ajax.send as ajax\n\t */\n\tajax: wp.ajax.send,\n\n\t/**\n\t * Scales a set of dimensions to fit within bounding dimensions.\n\t *\n\t * @param {Object} dimensions\n\t * @returns {Object}\n\t */\n\tfit: function( dimensions ) {\n\t\tvar width     = dimensions.width,\n\t\t\theight    = dimensions.height,\n\t\t\tmaxWidth  = dimensions.maxWidth,\n\t\t\tmaxHeight = dimensions.maxHeight,\n\t\t\tconstraint;\n\n\t\t// Compare ratios between the two values to determine which\n\t\t// max to constrain by. If a max value doesn't exist, then the\n\t\t// opposite side is the constraint.\n\t\tif ( ! _.isUndefined( maxWidth ) && ! _.isUndefined( maxHeight ) ) {\n\t\t\tconstraint = ( width / height > maxWidth / maxHeight ) ? 'width' : 'height';\n\t\t} else if ( _.isUndefined( maxHeight ) ) {\n\t\t\tconstraint = 'width';\n\t\t} else if (  _.isUndefined( maxWidth ) && height > maxHeight ) {\n\t\t\tconstraint = 'height';\n\t\t}\n\n\t\t// If the value of the constrained side is larger than the max,\n\t\t// then scale the values. Otherwise return the originals; they fit.\n\t\tif ( 'width' === constraint && width > maxWidth ) {\n\t\t\treturn {\n\t\t\t\twidth : maxWidth,\n\t\t\t\theight: Math.round( maxWidth * height / width )\n\t\t\t};\n\t\t} else if ( 'height' === constraint && height > maxHeight ) {\n\t\t\treturn {\n\t\t\t\twidth : Math.round( maxHeight * width / height ),\n\t\t\t\theight: maxHeight\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\twidth : width,\n\t\t\t\theight: height\n\t\t\t};\n\t\t}\n\t},\n\t/**\n\t * Truncates a string by injecting an ellipsis into the middle.\n\t * Useful for filenames.\n\t *\n\t * @param {String} string\n\t * @param {Number} [length=30]\n\t * @param {String} [replacement=&hellip;]\n\t * @returns {String} The string, unless length is greater than string.length.\n\t */\n\ttruncate: function( string, length, replacement ) {\n\t\tlength = length || 30;\n\t\treplacement = replacement || '&hellip;';\n\n\t\tif ( string.length <= length ) {\n\t\t\treturn string;\n\t\t}\n\n\t\treturn string.substr( 0, length / 2 ) + replacement + string.substr( -1 * length / 2 );\n\t}\n});\n\n/**\n * ========================================================================\n * MODELS\n * ========================================================================\n */\n/**\n * wp.media.attachment\n *\n * @static\n * @param {String} id A string used to identify a model.\n * @returns {wp.media.model.Attachment}\n */\nmedia.attachment = function( id ) {\n\treturn Attachment.get( id );\n};\n\n/**\n * A collection of all attachments that have been fetched from the server.\n *\n * @static\n * @member {wp.media.model.Attachments}\n */\nAttachments.all = new Attachments();\n\n/**\n * wp.media.query\n *\n * Shorthand for creating a new Attachments Query.\n *\n * @param {object} [props]\n * @returns {wp.media.model.Attachments}\n */\nmedia.query = function( props ) {\n\treturn new Attachments( null, {\n\t\tprops: _.extend( _.defaults( props || {}, { orderby: 'date' } ), { query: true } )\n\t});\n};\n\n// Clean up. Prevents mobile browsers caching\n$(window).on('unload', function(){\n\twindow.wp = null;\n});\n\n},{\"./models/attachment.js\":2,\"./models/attachments.js\":3,\"./models/post-image.js\":4,\"./models/query.js\":5,\"./models/selection.js\":6}],2:[function(require,module,exports){\n/**\n * wp.media.model.Attachment\n *\n * @class\n * @augments Backbone.Model\n */\nvar $ = Backbone.$,\n\tAttachment;\n\nAttachment = Backbone.Model.extend({\n\t/**\n\t * Triggered when attachment details change\n\t * Overrides Backbone.Model.sync\n\t *\n\t * @param {string} method\n\t * @param {wp.media.model.Attachment} model\n\t * @param {Object} [options={}]\n\t *\n\t * @returns {Promise}\n\t */\n\tsync: function( method, model, options ) {\n\t\t// If the attachment does not yet have an `id`, return an instantly\n\t\t// rejected promise. Otherwise, all of our requests will fail.\n\t\tif ( _.isUndefined( this.id ) ) {\n\t\t\treturn $.Deferred().rejectWith( this ).promise();\n\t\t}\n\n\t\t// Overload the `read` request so Attachment.fetch() functions correctly.\n\t\tif ( 'read' === method ) {\n\t\t\toptions = options || {};\n\t\t\toptions.context = this;\n\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\taction: 'get-attachment',\n\t\t\t\tid: this.id\n\t\t\t});\n\t\t\treturn wp.media.ajax( options );\n\n\t\t// Overload the `update` request so properties can be saved.\n\t\t} else if ( 'update' === method ) {\n\t\t\t// If we do not have the necessary nonce, fail immeditately.\n\t\t\tif ( ! this.get('nonces') || ! this.get('nonces').update ) {\n\t\t\t\treturn $.Deferred().rejectWith( this ).promise();\n\t\t\t}\n\n\t\t\toptions = options || {};\n\t\t\toptions.context = this;\n\n\t\t\t// Set the action and ID.\n\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\taction:  'save-attachment',\n\t\t\t\tid:      this.id,\n\t\t\t\tnonce:   this.get('nonces').update,\n\t\t\t\tpost_id: wp.media.model.settings.post.id\n\t\t\t});\n\n\t\t\t// Record the values of the changed attributes.\n\t\t\tif ( model.hasChanged() ) {\n\t\t\t\toptions.data.changes = {};\n\n\t\t\t\t_.each( model.changed, function( value, key ) {\n\t\t\t\t\toptions.data.changes[ key ] = this.get( key );\n\t\t\t\t}, this );\n\t\t\t}\n\n\t\t\treturn wp.media.ajax( options );\n\n\t\t// Overload the `delete` request so attachments can be removed.\n\t\t// This will permanently delete an attachment.\n\t\t} else if ( 'delete' === method ) {\n\t\t\toptions = options || {};\n\n\t\t\tif ( ! options.wait ) {\n\t\t\t\tthis.destroyed = true;\n\t\t\t}\n\n\t\t\toptions.context = this;\n\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\taction:   'delete-post',\n\t\t\t\tid:       this.id,\n\t\t\t\t_wpnonce: this.get('nonces')['delete']\n\t\t\t});\n\n\t\t\treturn wp.media.ajax( options ).done( function() {\n\t\t\t\tthis.destroyed = true;\n\t\t\t}).fail( function() {\n\t\t\t\tthis.destroyed = false;\n\t\t\t});\n\n\t\t// Otherwise, fall back to `Backbone.sync()`.\n\t\t} else {\n\t\t\t/**\n\t\t\t * Call `sync` directly on Backbone.Model\n\t\t\t */\n\t\t\treturn Backbone.Model.prototype.sync.apply( this, arguments );\n\t\t}\n\t},\n\t/**\n\t * Convert date strings into Date objects.\n\t *\n\t * @param {Object} resp The raw response object, typically returned by fetch()\n\t * @returns {Object} The modified response object, which is the attributes hash\n\t *    to be set on the model.\n\t */\n\tparse: function( resp ) {\n\t\tif ( ! resp ) {\n\t\t\treturn resp;\n\t\t}\n\n\t\tresp.date = new Date( resp.date );\n\t\tresp.modified = new Date( resp.modified );\n\t\treturn resp;\n\t},\n\t/**\n\t * @param {Object} data The properties to be saved.\n\t * @param {Object} options Sync options. e.g. patch, wait, success, error.\n\t *\n\t * @this Backbone.Model\n\t *\n\t * @returns {Promise}\n\t */\n\tsaveCompat: function( data, options ) {\n\t\tvar model = this;\n\n\t\t// If we do not have the necessary nonce, fail immeditately.\n\t\tif ( ! this.get('nonces') || ! this.get('nonces').update ) {\n\t\t\treturn $.Deferred().rejectWith( this ).promise();\n\t\t}\n\n\t\treturn wp.media.post( 'save-attachment-compat', _.defaults({\n\t\t\tid:      this.id,\n\t\t\tnonce:   this.get('nonces').update,\n\t\t\tpost_id: wp.media.model.settings.post.id\n\t\t}, data ) ).done( function( resp, status, xhr ) {\n\t\t\tmodel.set( model.parse( resp, xhr ), options );\n\t\t});\n\t}\n}, {\n\t/**\n\t * Create a new model on the static 'all' attachments collection and return it.\n\t *\n\t * @static\n\t * @param {Object} attrs\n\t * @returns {wp.media.model.Attachment}\n\t */\n\tcreate: function( attrs ) {\n\t\tvar Attachments = wp.media.model.Attachments;\n\t\treturn Attachments.all.push( attrs );\n\t},\n\t/**\n\t * Create a new model on the static 'all' attachments collection and return it.\n\t *\n\t * If this function has already been called for the id,\n\t * it returns the specified attachment.\n\t *\n\t * @static\n\t * @param {string} id A string used to identify a model.\n\t * @param {Backbone.Model|undefined} attachment\n\t * @returns {wp.media.model.Attachment}\n\t */\n\tget: _.memoize( function( id, attachment ) {\n\t\tvar Attachments = wp.media.model.Attachments;\n\t\treturn Attachments.all.push( attachment || { id: id } );\n\t})\n});\n\nmodule.exports = Attachment;\n\n},{}],3:[function(require,module,exports){\n/**\n * wp.media.model.Attachments\n *\n * A collection of attachments.\n *\n * This collection has no persistence with the server without supplying\n * 'options.props.query = true', which will mirror the collection\n * to an Attachments Query collection - @see wp.media.model.Attachments.mirror().\n *\n * @class\n * @augments Backbone.Collection\n *\n * @param {array}  [models]                Models to initialize with the collection.\n * @param {object} [options]               Options hash for the collection.\n * @param {string} [options.props]         Options hash for the initial query properties.\n * @param {string} [options.props.order]   Initial order (ASC or DESC) for the collection.\n * @param {string} [options.props.orderby] Initial attribute key to order the collection by.\n * @param {string} [options.props.query]   Whether the collection is linked to an attachments query.\n * @param {string} [options.observe]\n * @param {string} [options.filters]\n *\n */\nvar Attachments = Backbone.Collection.extend({\n\t/**\n\t * @type {wp.media.model.Attachment}\n\t */\n\tmodel: wp.media.model.Attachment,\n\t/**\n\t * @param {Array} [models=[]] Array of models used to populate the collection.\n\t * @param {Object} [options={}]\n\t */\n\tinitialize: function( models, options ) {\n\t\toptions = options || {};\n\n\t\tthis.props   = new Backbone.Model();\n\t\tthis.filters = options.filters || {};\n\n\t\t// Bind default `change` events to the `props` model.\n\t\tthis.props.on( 'change', this._changeFilteredProps, this );\n\n\t\tthis.props.on( 'change:order',   this._changeOrder,   this );\n\t\tthis.props.on( 'change:orderby', this._changeOrderby, this );\n\t\tthis.props.on( 'change:query',   this._changeQuery,   this );\n\n\t\tthis.props.set( _.defaults( options.props || {} ) );\n\n\t\tif ( options.observe ) {\n\t\t\tthis.observe( options.observe );\n\t\t}\n\t},\n\t/**\n\t * Sort the collection when the order attribute changes.\n\t *\n\t * @access private\n\t */\n\t_changeOrder: function() {\n\t\tif ( this.comparator ) {\n\t\t\tthis.sort();\n\t\t}\n\t},\n\t/**\n\t * Set the default comparator only when the `orderby` property is set.\n\t *\n\t * @access private\n\t *\n\t * @param {Backbone.Model} model\n\t * @param {string} orderby\n\t */\n\t_changeOrderby: function( model, orderby ) {\n\t\t// If a different comparator is defined, bail.\n\t\tif ( this.comparator && this.comparator !== Attachments.comparator ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( orderby && 'post__in' !== orderby ) {\n\t\t\tthis.comparator = Attachments.comparator;\n\t\t} else {\n\t\t\tdelete this.comparator;\n\t\t}\n\t},\n\t/**\n\t * If the `query` property is set to true, query the server using\n\t * the `props` values, and sync the results to this collection.\n\t *\n\t * @access private\n\t *\n\t * @param {Backbone.Model} model\n\t * @param {Boolean} query\n\t */\n\t_changeQuery: function( model, query ) {\n\t\tif ( query ) {\n\t\t\tthis.props.on( 'change', this._requery, this );\n\t\t\tthis._requery();\n\t\t} else {\n\t\t\tthis.props.off( 'change', this._requery, this );\n\t\t}\n\t},\n\t/**\n\t * @access private\n\t *\n\t * @param {Backbone.Model} model\n\t */\n\t_changeFilteredProps: function( model ) {\n\t\t// If this is a query, updating the collection will be handled by\n\t\t// `this._requery()`.\n\t\tif ( this.props.get('query') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar changed = _.chain( model.changed ).map( function( t, prop ) {\n\t\t\tvar filter = Attachments.filters[ prop ],\n\t\t\t\tterm = model.get( prop );\n\n\t\t\tif ( ! filter ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( term && ! this.filters[ prop ] ) {\n\t\t\t\tthis.filters[ prop ] = filter;\n\t\t\t} else if ( ! term && this.filters[ prop ] === filter ) {\n\t\t\t\tdelete this.filters[ prop ];\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Record the change.\n\t\t\treturn true;\n\t\t}, this ).any().value();\n\n\t\tif ( ! changed ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If no `Attachments` model is provided to source the searches\n\t\t// from, then automatically generate a source from the existing\n\t\t// models.\n\t\tif ( ! this._source ) {\n\t\t\tthis._source = new Attachments( this.models );\n\t\t}\n\n\t\tthis.reset( this._source.filter( this.validator, this ) );\n\t},\n\n\tvalidateDestroyed: false,\n\t/**\n\t * Checks whether an attachment is valid.\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @returns {Boolean}\n\t */\n\tvalidator: function( attachment ) {\n\t\tif ( ! this.validateDestroyed && attachment.destroyed ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn _.all( this.filters, function( filter ) {\n\t\t\treturn !! filter.call( this, attachment );\n\t\t}, this );\n\t},\n\t/**\n\t * Add or remove an attachment to the collection depending on its validity.\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @param {Object} options\n\t * @returns {wp.media.model.Attachments} Returns itself to allow chaining\n\t */\n\tvalidate: function( attachment, options ) {\n\t\tvar valid = this.validator( attachment ),\n\t\t\thasAttachment = !! this.get( attachment.cid );\n\n\t\tif ( ! valid && hasAttachment ) {\n\t\t\tthis.remove( attachment, options );\n\t\t} else if ( valid && ! hasAttachment ) {\n\t\t\tthis.add( attachment, options );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t/**\n\t * Add or remove all attachments from another collection depending on each one's validity.\n\t *\n\t * @param {wp.media.model.Attachments} attachments\n\t * @param {object} [options={}]\n\t *\n\t * @fires wp.media.model.Attachments#reset\n\t *\n\t * @returns {wp.media.model.Attachments} Returns itself to allow chaining\n\t */\n\tvalidateAll: function( attachments, options ) {\n\t\toptions = options || {};\n\n\t\t_.each( attachments.models, function( attachment ) {\n\t\t\tthis.validate( attachment, { silent: true });\n\t\t}, this );\n\n\t\tif ( ! options.silent ) {\n\t\t\tthis.trigger( 'reset', this, options );\n\t\t}\n\t\treturn this;\n\t},\n\t/**\n\t * Start observing another attachments collection change events\n\t * and replicate them on this collection.\n\t *\n\t * @param {wp.media.model.Attachments} The attachments collection to observe.\n\t * @returns {wp.media.model.Attachments} Returns itself to allow chaining.\n\t */\n\tobserve: function( attachments ) {\n\t\tthis.observers = this.observers || [];\n\t\tthis.observers.push( attachments );\n\n\t\tattachments.on( 'add change remove', this._validateHandler, this );\n\t\tattachments.on( 'reset', this._validateAllHandler, this );\n\t\tthis.validateAll( attachments );\n\t\treturn this;\n\t},\n\t/**\n\t * Stop replicating collection change events from another attachments collection.\n\t *\n\t * @param {wp.media.model.Attachments} The attachments collection to stop observing.\n\t * @returns {wp.media.model.Attachments} Returns itself to allow chaining\n\t */\n\tunobserve: function( attachments ) {\n\t\tif ( attachments ) {\n\t\t\tattachments.off( null, null, this );\n\t\t\tthis.observers = _.without( this.observers, attachments );\n\n\t\t} else {\n\t\t\t_.each( this.observers, function( attachments ) {\n\t\t\t\tattachments.off( null, null, this );\n\t\t\t}, this );\n\t\t\tdelete this.observers;\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @access private\n\t *\n\t * @param {wp.media.model.Attachments} attachment\n\t * @param {wp.media.model.Attachments} attachments\n\t * @param {Object} options\n\t *\n\t * @returns {wp.media.model.Attachments} Returns itself to allow chaining\n\t */\n\t_validateHandler: function( attachment, attachments, options ) {\n\t\t// If we're not mirroring this `attachments` collection,\n\t\t// only retain the `silent` option.\n\t\toptions = attachments === this.mirroring ? options : {\n\t\t\tsilent: options && options.silent\n\t\t};\n\n\t\treturn this.validate( attachment, options );\n\t},\n\t/**\n\t * @access private\n\t *\n\t * @param {wp.media.model.Attachments} attachments\n\t * @param {Object} options\n\t * @returns {wp.media.model.Attachments} Returns itself to allow chaining\n\t */\n\t_validateAllHandler: function( attachments, options ) {\n\t\treturn this.validateAll( attachments, options );\n\t},\n\t/**\n\t * Start mirroring another attachments collection, clearing out any models already\n\t * in the collection.\n\t *\n\t * @param {wp.media.model.Attachments} The attachments collection to mirror.\n\t * @returns {wp.media.model.Attachments} Returns itself to allow chaining\n\t */\n\tmirror: function( attachments ) {\n\t\tif ( this.mirroring && this.mirroring === attachments ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.unmirror();\n\t\tthis.mirroring = attachments;\n\n\t\t// Clear the collection silently. A `reset` event will be fired\n\t\t// when `observe()` calls `validateAll()`.\n\t\tthis.reset( [], { silent: true } );\n\t\tthis.observe( attachments );\n\n\t\treturn this;\n\t},\n\t/**\n\t * Stop mirroring another attachments collection.\n\t */\n\tunmirror: function() {\n\t\tif ( ! this.mirroring ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.unobserve( this.mirroring );\n\t\tdelete this.mirroring;\n\t},\n\t/**\n\t * Retrive more attachments from the server for the collection.\n\t *\n\t * Only works if the collection is mirroring a Query Attachments collection,\n\t * and forwards to its `more` method. This collection class doesn't have\n\t * server persistence by itself.\n\t *\n\t * @param {object} options\n\t * @returns {Promise}\n\t */\n\tmore: function( options ) {\n\t\tvar deferred = jQuery.Deferred(),\n\t\t\tmirroring = this.mirroring,\n\t\t\tattachments = this;\n\n\t\tif ( ! mirroring || ! mirroring.more ) {\n\t\t\treturn deferred.resolveWith( this ).promise();\n\t\t}\n\t\t// If we're mirroring another collection, forward `more` to\n\t\t// the mirrored collection. Account for a race condition by\n\t\t// checking if we're still mirroring that collection when\n\t\t// the request resolves.\n\t\tmirroring.more( options ).done( function() {\n\t\t\tif ( this === attachments.mirroring ) {\n\t\t\t\tdeferred.resolveWith( this );\n\t\t\t}\n\t\t});\n\n\t\treturn deferred.promise();\n\t},\n\t/**\n\t * Whether there are more attachments that haven't been sync'd from the server\n\t * that match the collection's query.\n\t *\n\t * Only works if the collection is mirroring a Query Attachments collection,\n\t * and forwards to its `hasMore` method. This collection class doesn't have\n\t * server persistence by itself.\n\t *\n\t * @returns {boolean}\n\t */\n\thasMore: function() {\n\t\treturn this.mirroring ? this.mirroring.hasMore() : false;\n\t},\n\t/**\n\t * A custom AJAX-response parser.\n\t *\n\t * See trac ticket #24753\n\t *\n\t * @param {Object|Array} resp The raw response Object/Array.\n\t * @param {Object} xhr\n\t * @returns {Array} The array of model attributes to be added to the collection\n\t */\n\tparse: function( resp, xhr ) {\n\t\tif ( ! _.isArray( resp ) ) {\n\t\t\tresp = [resp];\n\t\t}\n\n\t\treturn _.map( resp, function( attrs ) {\n\t\t\tvar id, attachment, newAttributes;\n\n\t\t\tif ( attrs instanceof Backbone.Model ) {\n\t\t\t\tid = attrs.get( 'id' );\n\t\t\t\tattrs = attrs.attributes;\n\t\t\t} else {\n\t\t\t\tid = attrs.id;\n\t\t\t}\n\n\t\t\tattachment = wp.media.model.Attachment.get( id );\n\t\t\tnewAttributes = attachment.parse( attrs, xhr );\n\n\t\t\tif ( ! _.isEqual( attachment.attributes, newAttributes ) ) {\n\t\t\t\tattachment.set( newAttributes );\n\t\t\t}\n\n\t\t\treturn attachment;\n\t\t});\n\t},\n\t/**\n\t * If the collection is a query, create and mirror an Attachments Query collection.\n\t *\n\t * @access private\n\t */\n\t_requery: function( refresh ) {\n\t\tvar props;\n\t\tif ( this.props.get('query') ) {\n\t\t\tprops = this.props.toJSON();\n\t\t\tprops.cache = ( true !== refresh );\n\t\t\tthis.mirror( wp.media.model.Query.get( props ) );\n\t\t}\n\t},\n\t/**\n\t * If this collection is sorted by `menuOrder`, recalculates and saves\n\t * the menu order to the database.\n\t *\n\t * @returns {undefined|Promise}\n\t */\n\tsaveMenuOrder: function() {\n\t\tif ( 'menuOrder' !== this.props.get('orderby') ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Removes any uploading attachments, updates each attachment's\n\t\t// menu order, and returns an object with an { id: menuOrder }\n\t\t// mapping to pass to the request.\n\t\tvar attachments = this.chain().filter( function( attachment ) {\n\t\t\treturn ! _.isUndefined( attachment.id );\n\t\t}).map( function( attachment, index ) {\n\t\t\t// Indices start at 1.\n\t\t\tindex = index + 1;\n\t\t\tattachment.set( 'menuOrder', index );\n\t\t\treturn [ attachment.id, index ];\n\t\t}).object().value();\n\n\t\tif ( _.isEmpty( attachments ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn wp.media.post( 'save-attachment-order', {\n\t\t\tnonce:       wp.media.model.settings.post.nonce,\n\t\t\tpost_id:     wp.media.model.settings.post.id,\n\t\t\tattachments: attachments\n\t\t});\n\t}\n}, {\n\t/**\n\t * A function to compare two attachment models in an attachments collection.\n\t *\n\t * Used as the default comparator for instances of wp.media.model.Attachments\n\t * and its subclasses. @see wp.media.model.Attachments._changeOrderby().\n\t *\n\t * @static\n\t *\n\t * @param {Backbone.Model} a\n\t * @param {Backbone.Model} b\n\t * @param {Object} options\n\t * @returns {Number} -1 if the first model should come before the second,\n\t *    0 if they are of the same rank and\n\t *    1 if the first model should come after.\n\t */\n\tcomparator: function( a, b, options ) {\n\t\tvar key   = this.props.get('orderby'),\n\t\t\torder = this.props.get('order') || 'DESC',\n\t\t\tac    = a.cid,\n\t\t\tbc    = b.cid;\n\n\t\ta = a.get( key );\n\t\tb = b.get( key );\n\n\t\tif ( 'date' === key || 'modified' === key ) {\n\t\t\ta = a || new Date();\n\t\t\tb = b || new Date();\n\t\t}\n\n\t\t// If `options.ties` is set, don't enforce the `cid` tiebreaker.\n\t\tif ( options && options.ties ) {\n\t\t\tac = bc = null;\n\t\t}\n\n\t\treturn ( 'DESC' === order ) ? wp.media.compare( a, b, ac, bc ) : wp.media.compare( b, a, bc, ac );\n\t},\n\t/**\n\t * @namespace\n\t */\n\tfilters: {\n\t\t/**\n\t\t * @static\n\t\t * Note that this client-side searching is *not* equivalent\n\t\t * to our server-side searching.\n\t\t *\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t *\n\t\t * @this wp.media.model.Attachments\n\t\t *\n\t\t * @returns {Boolean}\n\t\t */\n\t\tsearch: function( attachment ) {\n\t\t\tif ( ! this.props.get('search') ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn _.any(['title','filename','description','caption','name'], function( key ) {\n\t\t\t\tvar value = attachment.get( key );\n\t\t\t\treturn value && -1 !== value.search( this.props.get('search') );\n\t\t\t}, this );\n\t\t},\n\t\t/**\n\t\t * @static\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t *\n\t\t * @this wp.media.model.Attachments\n\t\t *\n\t\t * @returns {Boolean}\n\t\t */\n\t\ttype: function( attachment ) {\n\t\t\tvar type = this.props.get('type'), atts = attachment.toJSON(), mime, found;\n\n\t\t\tif ( ! type || ( _.isArray( type ) && ! type.length ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tmime = atts.mime || ( atts.file && atts.file.type ) || '';\n\n\t\t\tif ( _.isArray( type ) ) {\n\t\t\t\tfound = _.find( type, function (t) {\n\t\t\t\t\treturn -1 !== mime.indexOf( t );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tfound = -1 !== mime.indexOf( type );\n\t\t\t}\n\n\t\t\treturn found;\n\t\t},\n\t\t/**\n\t\t * @static\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t *\n\t\t * @this wp.media.model.Attachments\n\t\t *\n\t\t * @returns {Boolean}\n\t\t */\n\t\tuploadedTo: function( attachment ) {\n\t\t\tvar uploadedTo = this.props.get('uploadedTo');\n\t\t\tif ( _.isUndefined( uploadedTo ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn uploadedTo === attachment.get('uploadedTo');\n\t\t},\n\t\t/**\n\t\t * @static\n\t\t * @param {wp.media.model.Attachment} attachment\n\t\t *\n\t\t * @this wp.media.model.Attachments\n\t\t *\n\t\t * @returns {Boolean}\n\t\t */\n\t\tstatus: function( attachment ) {\n\t\t\tvar status = this.props.get('status');\n\t\t\tif ( _.isUndefined( status ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn status === attachment.get('status');\n\t\t}\n\t}\n});\n\nmodule.exports = Attachments;\n\n},{}],4:[function(require,module,exports){\n/**\n * wp.media.model.PostImage\n *\n * An instance of an image that's been embedded into a post.\n *\n * Used in the embedded image attachment display settings modal - @see wp.media.view.MediaFrame.ImageDetails.\n *\n * @class\n * @augments Backbone.Model\n *\n * @param {int} [attributes]               Initial model attributes.\n * @param {int} [attributes.attachment_id] ID of the attachment.\n **/\nvar PostImage = Backbone.Model.extend({\n\n\tinitialize: function( attributes ) {\n\t\tvar Attachment = wp.media.model.Attachment;\n\t\tthis.attachment = false;\n\n\t\tif ( attributes.attachment_id ) {\n\t\t\tthis.attachment = Attachment.get( attributes.attachment_id );\n\t\t\tif ( this.attachment.get( 'url' ) ) {\n\t\t\t\tthis.dfd = jQuery.Deferred();\n\t\t\t\tthis.dfd.resolve();\n\t\t\t} else {\n\t\t\t\tthis.dfd = this.attachment.fetch();\n\t\t\t}\n\t\t\tthis.bindAttachmentListeners();\n\t\t}\n\n\t\t// keep url in sync with changes to the type of link\n\t\tthis.on( 'change:link', this.updateLinkUrl, this );\n\t\tthis.on( 'change:size', this.updateSize, this );\n\n\t\tthis.setLinkTypeFromUrl();\n\t\tthis.setAspectRatio();\n\n\t\tthis.set( 'originalUrl', attributes.url );\n\t},\n\n\tbindAttachmentListeners: function() {\n\t\tthis.listenTo( this.attachment, 'sync', this.setLinkTypeFromUrl );\n\t\tthis.listenTo( this.attachment, 'sync', this.setAspectRatio );\n\t\tthis.listenTo( this.attachment, 'change', this.updateSize );\n\t},\n\n\tchangeAttachment: function( attachment, props ) {\n\t\tthis.stopListening( this.attachment );\n\t\tthis.attachment = attachment;\n\t\tthis.bindAttachmentListeners();\n\n\t\tthis.set( 'attachment_id', this.attachment.get( 'id' ) );\n\t\tthis.set( 'caption', this.attachment.get( 'caption' ) );\n\t\tthis.set( 'alt', this.attachment.get( 'alt' ) );\n\t\tthis.set( 'size', props.get( 'size' ) );\n\t\tthis.set( 'align', props.get( 'align' ) );\n\t\tthis.set( 'link', props.get( 'link' ) );\n\t\tthis.updateLinkUrl();\n\t\tthis.updateSize();\n\t},\n\n\tsetLinkTypeFromUrl: function() {\n\t\tvar linkUrl = this.get( 'linkUrl' ),\n\t\t\ttype;\n\n\t\tif ( ! linkUrl ) {\n\t\t\tthis.set( 'link', 'none' );\n\t\t\treturn;\n\t\t}\n\n\t\t// default to custom if there is a linkUrl\n\t\ttype = 'custom';\n\n\t\tif ( this.attachment ) {\n\t\t\tif ( this.attachment.get( 'url' ) === linkUrl ) {\n\t\t\t\ttype = 'file';\n\t\t\t} else if ( this.attachment.get( 'link' ) === linkUrl ) {\n\t\t\t\ttype = 'post';\n\t\t\t}\n\t\t} else {\n\t\t\tif ( this.get( 'url' ) === linkUrl ) {\n\t\t\t\ttype = 'file';\n\t\t\t}\n\t\t}\n\n\t\tthis.set( 'link', type );\n\t},\n\n\tupdateLinkUrl: function() {\n\t\tvar link = this.get( 'link' ),\n\t\t\turl;\n\n\t\tswitch( link ) {\n\t\t\tcase 'file':\n\t\t\t\tif ( this.attachment ) {\n\t\t\t\t\turl = this.attachment.get( 'url' );\n\t\t\t\t} else {\n\t\t\t\t\turl = this.get( 'url' );\n\t\t\t\t}\n\t\t\t\tthis.set( 'linkUrl', url );\n\t\t\t\tbreak;\n\t\t\tcase 'post':\n\t\t\t\tthis.set( 'linkUrl', this.attachment.get( 'link' ) );\n\t\t\t\tbreak;\n\t\t\tcase 'none':\n\t\t\t\tthis.set( 'linkUrl', '' );\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\tupdateSize: function() {\n\t\tvar size;\n\n\t\tif ( ! this.attachment ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.get( 'size' ) === 'custom' ) {\n\t\t\tthis.set( 'width', this.get( 'customWidth' ) );\n\t\t\tthis.set( 'height', this.get( 'customHeight' ) );\n\t\t\tthis.set( 'url', this.get( 'originalUrl' ) );\n\t\t\treturn;\n\t\t}\n\n\t\tsize = this.attachment.get( 'sizes' )[ this.get( 'size' ) ];\n\n\t\tif ( ! size ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.set( 'url', size.url );\n\t\tthis.set( 'width', size.width );\n\t\tthis.set( 'height', size.height );\n\t},\n\n\tsetAspectRatio: function() {\n\t\tvar full;\n\n\t\tif ( this.attachment && this.attachment.get( 'sizes' ) ) {\n\t\t\tfull = this.attachment.get( 'sizes' ).full;\n\n\t\t\tif ( full ) {\n\t\t\t\tthis.set( 'aspectRatio', full.width / full.height );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.set( 'aspectRatio', this.get( 'customWidth' ) / this.get( 'customHeight' ) );\n\t}\n});\n\nmodule.exports = PostImage;\n\n},{}],5:[function(require,module,exports){\n/**\n * wp.media.model.Query\n *\n * A collection of attachments that match the supplied query arguments.\n *\n * Note: Do NOT change this.args after the query has been initialized.\n *       Things will break.\n *\n * @class\n * @augments wp.media.model.Attachments\n * @augments Backbone.Collection\n *\n * @param {array}  [models]                      Models to initialize with the collection.\n * @param {object} [options]                     Options hash.\n * @param {object} [options.args]                Attachments query arguments.\n * @param {object} [options.args.posts_per_page]\n */\nvar Attachments = wp.media.model.Attachments,\n\tQuery;\n\nQuery = Attachments.extend({\n\t/**\n\t * @global wp.Uploader\n\t *\n\t * @param {array}  [models=[]]  Array of initial models to populate the collection.\n\t * @param {object} [options={}]\n\t */\n\tinitialize: function( models, options ) {\n\t\tvar allowed;\n\n\t\toptions = options || {};\n\t\tAttachments.prototype.initialize.apply( this, arguments );\n\n\t\tthis.args     = options.args;\n\t\tthis._hasMore = true;\n\t\tthis.created  = new Date();\n\n\t\tthis.filters.order = function( attachment ) {\n\t\t\tvar orderby = this.props.get('orderby'),\n\t\t\t\torder = this.props.get('order');\n\n\t\t\tif ( ! this.comparator ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// We want any items that can be placed before the last\n\t\t\t// item in the set. If we add any items after the last\n\t\t\t// item, then we can't guarantee the set is complete.\n\t\t\tif ( this.length ) {\n\t\t\t\treturn 1 !== this.comparator( attachment, this.last(), { ties: true });\n\n\t\t\t// Handle the case where there are no items yet and\n\t\t\t// we're sorting for recent items. In that case, we want\n\t\t\t// changes that occurred after we created the query.\n\t\t\t} else if ( 'DESC' === order && ( 'date' === orderby || 'modified' === orderby ) ) {\n\t\t\t\treturn attachment.get( orderby ) >= this.created;\n\n\t\t\t// If we're sorting by menu order and we have no items,\n\t\t\t// accept any items that have the default menu order (0).\n\t\t\t} else if ( 'ASC' === order && 'menuOrder' === orderby ) {\n\t\t\t\treturn attachment.get( orderby ) === 0;\n\t\t\t}\n\n\t\t\t// Otherwise, we don't want any items yet.\n\t\t\treturn false;\n\t\t};\n\n\t\t// Observe the central `wp.Uploader.queue` collection to watch for\n\t\t// new matches for the query.\n\t\t//\n\t\t// Only observe when a limited number of query args are set. There\n\t\t// are no filters for other properties, so observing will result in\n\t\t// false positives in those queries.\n\t\tallowed = [ 's', 'order', 'orderby', 'posts_per_page', 'post_mime_type', 'post_parent' ];\n\t\tif ( wp.Uploader && _( this.args ).chain().keys().difference( allowed ).isEmpty().value() ) {\n\t\t\tthis.observe( wp.Uploader.queue );\n\t\t}\n\t},\n\t/**\n\t * Whether there are more attachments that haven't been sync'd from the server\n\t * that match the collection's query.\n\t *\n\t * @returns {boolean}\n\t */\n\thasMore: function() {\n\t\treturn this._hasMore;\n\t},\n\t/**\n\t * Fetch more attachments from the server for the collection.\n\t *\n\t * @param   {object}  [options={}]\n\t * @returns {Promise}\n\t */\n\tmore: function( options ) {\n\t\tvar query = this;\n\n\t\t// If there is already a request pending, return early with the Deferred object.\n\t\tif ( this._more && 'pending' === this._more.state() ) {\n\t\t\treturn this._more;\n\t\t}\n\n\t\tif ( ! this.hasMore() ) {\n\t\t\treturn jQuery.Deferred().resolveWith( this ).promise();\n\t\t}\n\n\t\toptions = options || {};\n\t\toptions.remove = false;\n\n\t\treturn this._more = this.fetch( options ).done( function( resp ) {\n\t\t\tif ( _.isEmpty( resp ) || -1 === this.args.posts_per_page || resp.length < this.args.posts_per_page ) {\n\t\t\t\tquery._hasMore = false;\n\t\t\t}\n\t\t});\n\t},\n\t/**\n\t * Overrides Backbone.Collection.sync\n\t * Overrides wp.media.model.Attachments.sync\n\t *\n\t * @param {String} method\n\t * @param {Backbone.Model} model\n\t * @param {Object} [options={}]\n\t * @returns {Promise}\n\t */\n\tsync: function( method, model, options ) {\n\t\tvar args, fallback;\n\n\t\t// Overload the read method so Attachment.fetch() functions correctly.\n\t\tif ( 'read' === method ) {\n\t\t\toptions = options || {};\n\t\t\toptions.context = this;\n\t\t\toptions.data = _.extend( options.data || {}, {\n\t\t\t\taction:  'query-attachments',\n\t\t\t\tpost_id: wp.media.model.settings.post.id\n\t\t\t});\n\n\t\t\t// Clone the args so manipulation is non-destructive.\n\t\t\targs = _.clone( this.args );\n\n\t\t\t// Determine which page to query.\n\t\t\tif ( -1 !== args.posts_per_page ) {\n\t\t\t\targs.paged = Math.round( this.length / args.posts_per_page ) + 1;\n\t\t\t}\n\n\t\t\toptions.data.query = args;\n\t\t\treturn wp.media.ajax( options );\n\n\t\t// Otherwise, fall back to Backbone.sync()\n\t\t} else {\n\t\t\t/**\n\t\t\t * Call wp.media.model.Attachments.sync or Backbone.sync\n\t\t\t */\n\t\t\tfallback = Attachments.prototype.sync ? Attachments.prototype : Backbone;\n\t\t\treturn fallback.sync.apply( this, arguments );\n\t\t}\n\t}\n}, {\n\t/**\n\t * @readonly\n\t */\n\tdefaultProps: {\n\t\torderby: 'date',\n\t\torder:   'DESC'\n\t},\n\t/**\n\t * @readonly\n\t */\n\tdefaultArgs: {\n\t\tposts_per_page: 40\n\t},\n\t/**\n\t * @readonly\n\t */\n\torderby: {\n\t\tallowed:  [ 'name', 'author', 'date', 'title', 'modified', 'uploadedTo', 'id', 'post__in', 'menuOrder' ],\n\t\t/**\n\t\t * A map of JavaScript orderby values to their WP_Query equivalents.\n\t\t * @type {Object}\n\t\t */\n\t\tvaluemap: {\n\t\t\t'id':         'ID',\n\t\t\t'uploadedTo': 'parent',\n\t\t\t'menuOrder':  'menu_order ID'\n\t\t}\n\t},\n\t/**\n\t * A map of JavaScript query properties to their WP_Query equivalents.\n\t *\n\t * @readonly\n\t */\n\tpropmap: {\n\t\t'search':    's',\n\t\t'type':      'post_mime_type',\n\t\t'perPage':   'posts_per_page',\n\t\t'menuOrder': 'menu_order',\n\t\t'uploadedTo': 'post_parent',\n\t\t'status':     'post_status',\n\t\t'include':    'post__in',\n\t\t'exclude':    'post__not_in'\n\t},\n\t/**\n\t * Creates and returns an Attachments Query collection given the properties.\n\t *\n\t * Caches query objects and reuses where possible.\n\t *\n\t * @static\n\t * @method\n\t *\n\t * @param {object} [props]\n\t * @param {Object} [props.cache=true]   Whether to use the query cache or not.\n\t * @param {Object} [props.order]\n\t * @param {Object} [props.orderby]\n\t * @param {Object} [props.include]\n\t * @param {Object} [props.exclude]\n\t * @param {Object} [props.s]\n\t * @param {Object} [props.post_mime_type]\n\t * @param {Object} [props.posts_per_page]\n\t * @param {Object} [props.menu_order]\n\t * @param {Object} [props.post_parent]\n\t * @param {Object} [props.post_status]\n\t * @param {Object} [options]\n\t *\n\t * @returns {wp.media.model.Query} A new Attachments Query collection.\n\t */\n\tget: (function(){\n\t\t/**\n\t\t * @static\n\t\t * @type Array\n\t\t */\n\t\tvar queries = [];\n\n\t\t/**\n\t\t * @returns {Query}\n\t\t */\n\t\treturn function( props, options ) {\n\t\t\tvar args     = {},\n\t\t\t\torderby  = Query.orderby,\n\t\t\t\tdefaults = Query.defaultProps,\n\t\t\t\tquery,\n\t\t\t\tcache    = !! props.cache || _.isUndefined( props.cache );\n\n\t\t\t// Remove the `query` property. This isn't linked to a query,\n\t\t\t// this *is* the query.\n\t\t\tdelete props.query;\n\t\t\tdelete props.cache;\n\n\t\t\t// Fill default args.\n\t\t\t_.defaults( props, defaults );\n\n\t\t\t// Normalize the order.\n\t\t\tprops.order = props.order.toUpperCase();\n\t\t\tif ( 'DESC' !== props.order && 'ASC' !== props.order ) {\n\t\t\t\tprops.order = defaults.order.toUpperCase();\n\t\t\t}\n\n\t\t\t// Ensure we have a valid orderby value.\n\t\t\tif ( ! _.contains( orderby.allowed, props.orderby ) ) {\n\t\t\t\tprops.orderby = defaults.orderby;\n\t\t\t}\n\n\t\t\t_.each( [ 'include', 'exclude' ], function( prop ) {\n\t\t\t\tif ( props[ prop ] && ! _.isArray( props[ prop ] ) ) {\n\t\t\t\t\tprops[ prop ] = [ props[ prop ] ];\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Generate the query `args` object.\n\t\t\t// Correct any differing property names.\n\t\t\t_.each( props, function( value, prop ) {\n\t\t\t\tif ( _.isNull( value ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\targs[ Query.propmap[ prop ] || prop ] = value;\n\t\t\t});\n\n\t\t\t// Fill any other default query args.\n\t\t\t_.defaults( args, Query.defaultArgs );\n\n\t\t\t// `props.orderby` does not always map directly to `args.orderby`.\n\t\t\t// Substitute exceptions specified in orderby.keymap.\n\t\t\targs.orderby = orderby.valuemap[ props.orderby ] || props.orderby;\n\n\t\t\t// Search the query cache for a matching query.\n\t\t\tif ( cache ) {\n\t\t\t\tquery = _.find( queries, function( query ) {\n\t\t\t\t\treturn _.isEqual( query.args, args );\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tqueries = [];\n\t\t\t}\n\n\t\t\t// Otherwise, create a new query and add it to the cache.\n\t\t\tif ( ! query ) {\n\t\t\t\tquery = new Query( [], _.extend( options || {}, {\n\t\t\t\t\tprops: props,\n\t\t\t\t\targs:  args\n\t\t\t\t} ) );\n\t\t\t\tqueries.push( query );\n\t\t\t}\n\n\t\t\treturn query;\n\t\t};\n\t}())\n});\n\nmodule.exports = Query;\n\n},{}],6:[function(require,module,exports){\n/**\n * wp.media.model.Selection\n *\n * A selection of attachments.\n *\n * @class\n * @augments wp.media.model.Attachments\n * @augments Backbone.Collection\n */\nvar Attachments = wp.media.model.Attachments,\n\tSelection;\n\nSelection = Attachments.extend({\n\t/**\n\t * Refresh the `single` model whenever the selection changes.\n\t * Binds `single` instead of using the context argument to ensure\n\t * it receives no parameters.\n\t *\n\t * @param {Array} [models=[]] Array of models used to populate the collection.\n\t * @param {Object} [options={}]\n\t */\n\tinitialize: function( models, options ) {\n\t\t/**\n\t\t * call 'initialize' directly on the parent class\n\t\t */\n\t\tAttachments.prototype.initialize.apply( this, arguments );\n\t\tthis.multiple = options && options.multiple;\n\n\t\tthis.on( 'add remove reset', _.bind( this.single, this, false ) );\n\t},\n\n\t/**\n\t * If the workflow does not support multi-select, clear out the selection\n\t * before adding a new attachment to it.\n\t *\n\t * @param {Array} models\n\t * @param {Object} options\n\t * @returns {wp.media.model.Attachment[]}\n\t */\n\tadd: function( models, options ) {\n\t\tif ( ! this.multiple ) {\n\t\t\tthis.remove( this.models );\n\t\t}\n\t\t/**\n\t\t * call 'add' directly on the parent class\n\t\t */\n\t\treturn Attachments.prototype.add.call( this, models, options );\n\t},\n\n\t/**\n\t * Fired when toggling (clicking on) an attachment in the modal.\n\t *\n\t * @param {undefined|boolean|wp.media.model.Attachment} model\n\t *\n\t * @fires wp.media.model.Selection#selection:single\n\t * @fires wp.media.model.Selection#selection:unsingle\n\t *\n\t * @returns {Backbone.Model}\n\t */\n\tsingle: function( model ) {\n\t\tvar previous = this._single;\n\n\t\t// If a `model` is provided, use it as the single model.\n\t\tif ( model ) {\n\t\t\tthis._single = model;\n\t\t}\n\t\t// If the single model isn't in the selection, remove it.\n\t\tif ( this._single && ! this.get( this._single.cid ) ) {\n\t\t\tdelete this._single;\n\t\t}\n\n\t\tthis._single = this._single || this.last();\n\n\t\t// If single has changed, fire an event.\n\t\tif ( this._single !== previous ) {\n\t\t\tif ( previous ) {\n\t\t\t\tprevious.trigger( 'selection:unsingle', previous, this );\n\n\t\t\t\t// If the model was already removed, trigger the collection\n\t\t\t\t// event manually.\n\t\t\t\tif ( ! this.get( previous.cid ) ) {\n\t\t\t\t\tthis.trigger( 'selection:unsingle', previous, this );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this._single ) {\n\t\t\t\tthis._single.trigger( 'selection:single', this._single, this );\n\t\t\t}\n\t\t}\n\n\t\t// Return the single model, or the last model as a fallback.\n\t\treturn this._single;\n\t}\n});\n\nmodule.exports = Selection;\n\n},{}]},{},[1]);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/media-views.js",
    "content": "(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(require,module,exports){\n/**\n * wp.media.controller.CollectionAdd\n *\n * A state for adding attachments to a collection (e.g. video playlist).\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                         The attributes hash passed to the state.\n * @param {string}                     [attributes.id=library]      Unique identifier.\n * @param {string}                     attributes.title                    Title for the state. Displays in the frame's title region.\n * @param {boolean}                    [attributes.multiple=add]            Whether multi-select is enabled. @todo 'add' doesn't seem do anything special, and gets used as a boolean.\n * @param {wp.media.model.Attachments} [attributes.library]                 The attachments collection to browse.\n *                                                                          If one is not supplied, a collection of attachments of the specified type will be created.\n * @param {boolean|string}             [attributes.filterable=uploaded]     Whether the library is filterable, and if so what filters should be shown.\n *                                                                          Accepts 'all', 'uploaded', or 'unattached'.\n * @param {string}                     [attributes.menu=gallery]            Initial mode for the menu region.\n * @param {string}                     [attributes.content=upload]          Initial mode for the content region.\n *                                                                          Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                     [attributes.router=browse]           Initial mode for the router region.\n * @param {string}                     [attributes.toolbar=gallery-add]     Initial mode for the toolbar region.\n * @param {boolean}                    [attributes.searchable=true]         Whether the library is searchable.\n * @param {boolean}                    [attributes.sortable=true]           Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.autoSelect=true]         Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                    [attributes.contentUserSetting=true] Whether the content region's mode should be set and persisted per user.\n * @param {int}                        [attributes.priority=100]            The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.syncSelection=false]     Whether the Attachments selection should be persisted from the last state.\n *                                                                          Defaults to false because for this state, because the library of the Edit Gallery state is the selection.\n * @param {string}                     attributes.type                   The collection's media type. (e.g. 'video').\n * @param {string}                     attributes.collectionType         The collection type. (e.g. 'playlist').\n */\nvar Selection = wp.media.model.Selection,\n\tLibrary = wp.media.controller.Library,\n\tCollectionAdd;\n\nCollectionAdd = Library.extend({\n\tdefaults: _.defaults( {\n\t\t// Selection defaults. @see media.model.Selection\n\t\tmultiple:      'add',\n\t\t// Attachments browser defaults. @see media.view.AttachmentsBrowser\n\t\tfilterable:    'uploaded',\n\n\t\tpriority:      100,\n\t\tsyncSelection: false\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tinitialize: function() {\n\t\tvar collectionType = this.get('collectionType');\n\n\t\tif ( 'video' === this.get( 'type' ) ) {\n\t\t\tcollectionType = 'video-' + collectionType;\n\t\t}\n\n\t\tthis.set( 'id', collectionType + '-library' );\n\t\tthis.set( 'toolbar', collectionType + '-add' );\n\t\tthis.set( 'menu', collectionType );\n\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: this.get('type') }) );\n\t\t}\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tvar library = this.get('library'),\n\t\t\teditLibrary = this.get('editLibrary'),\n\t\t\tedit = this.frame.state( this.get('collectionType') + '-edit' ).get('library');\n\n\t\tif ( editLibrary && editLibrary !== edit ) {\n\t\t\tlibrary.unobserve( editLibrary );\n\t\t}\n\n\t\t// Accepts attachments that exist in the original library and\n\t\t// that do not exist in gallery's library.\n\t\tlibrary.validator = function( attachment ) {\n\t\t\treturn !! this.mirroring.get( attachment.cid ) && ! edit.get( attachment.cid ) && Selection.prototype.validator.apply( this, arguments );\n\t\t};\n\n\t\t// Reset the library to ensure that all attachments are re-added\n\t\t// to the collection. Do so silently, as calling `observe` will\n\t\t// trigger the `reset` event.\n\t\tlibrary.reset( library.mirroring.models, { silent: true });\n\t\tlibrary.observe( edit );\n\t\tthis.set('editLibrary', edit);\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t}\n});\n\nmodule.exports = CollectionAdd;\n\n},{}],2:[function(require,module,exports){\n/**\n * wp.media.controller.CollectionEdit\n *\n * A state for editing a collection, which is used by audio and video playlists,\n * and can be used for other collections.\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                      The attributes hash passed to the state.\n * @param {string}                     attributes.title                  Title for the state. Displays in the media menu and the frame's title region.\n * @param {wp.media.model.Attachments} [attributes.library]              The attachments collection to edit.\n *                                                                       If one is not supplied, an empty media.model.Selection collection is created.\n * @param {boolean}                    [attributes.multiple=false]       Whether multi-select is enabled.\n * @param {string}                     [attributes.content=browse]       Initial mode for the content region.\n * @param {string}                     attributes.menu                   Initial mode for the menu region. @todo this needs a better explanation.\n * @param {boolean}                    [attributes.searchable=false]     Whether the library is searchable.\n * @param {boolean}                    [attributes.sortable=true]        Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.date=true]            Whether to show the date filter in the browser's toolbar.\n * @param {boolean}                    [attributes.describe=true]        Whether to offer UI to describe the attachments - e.g. captioning images in a gallery.\n * @param {boolean}                    [attributes.dragInfo=true]        Whether to show instructional text about the attachments being sortable.\n * @param {boolean}                    [attributes.dragInfoText]         Instructional text about the attachments being sortable.\n * @param {int}                        [attributes.idealColumnWidth=170] The ideal column width in pixels for attachments.\n * @param {boolean}                    [attributes.editing=false]        Whether the gallery is being created, or editing an existing instance.\n * @param {int}                        [attributes.priority=60]          The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.syncSelection=false]  Whether the Attachments selection should be persisted from the last state.\n *                                                                       Defaults to false for this state, because the library passed in  *is* the selection.\n * @param {view}                       [attributes.SettingsView]         The view to edit the collection instance settings (e.g. Playlist settings with \"Show tracklist\" checkbox).\n * @param {view}                       [attributes.AttachmentView]       The single `Attachment` view to be used in the `Attachments`.\n *                                                                       If none supplied, defaults to wp.media.view.Attachment.EditLibrary.\n * @param {string}                     attributes.type                   The collection's media type. (e.g. 'video').\n * @param {string}                     attributes.collectionType         The collection type. (e.g. 'playlist').\n */\nvar Library = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tCollectionEdit;\n\nCollectionEdit = Library.extend({\n\tdefaults: {\n\t\tmultiple:         false,\n\t\tsortable:         true,\n\t\tdate:             false,\n\t\tsearchable:       false,\n\t\tcontent:          'browse',\n\t\tdescribe:         true,\n\t\tdragInfo:         true,\n\t\tidealColumnWidth: 170,\n\t\tediting:          false,\n\t\tpriority:         60,\n\t\tSettingsView:     false,\n\t\tsyncSelection:    false\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tinitialize: function() {\n\t\tvar collectionType = this.get('collectionType');\n\n\t\tif ( 'video' === this.get( 'type' ) ) {\n\t\t\tcollectionType = 'video-' + collectionType;\n\t\t}\n\n\t\tthis.set( 'id', collectionType + '-edit' );\n\t\tthis.set( 'toolbar', collectionType + '-edit' );\n\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', new wp.media.model.Selection() );\n\t\t}\n\t\t// The single `Attachment` view to be used in the `Attachments` view.\n\t\tif ( ! this.get('AttachmentView') ) {\n\t\t\tthis.set( 'AttachmentView', wp.media.view.Attachment.EditLibrary );\n\t\t}\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tvar library = this.get('library');\n\n\t\t// Limit the library to images only.\n\t\tlibrary.props.set( 'type', this.get( 'type' ) );\n\n\t\t// Watch for uploaded attachments.\n\t\tthis.get('library').observe( wp.Uploader.queue );\n\n\t\tthis.frame.on( 'content:render:browse', this.renderSettings, this );\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tdeactivate: function() {\n\t\t// Stop watching for uploaded attachments.\n\t\tthis.get('library').unobserve( wp.Uploader.queue );\n\n\t\tthis.frame.off( 'content:render:browse', this.renderSettings, this );\n\n\t\tLibrary.prototype.deactivate.apply( this, arguments );\n\t},\n\n\t/**\n\t * Render the collection embed settings view in the browser sidebar.\n\t *\n\t * @todo This is against the pattern elsewhere in media. Typically the frame\n\t *       is responsible for adding region mode callbacks. Explain.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param {wp.media.view.attachmentsBrowser} The attachments browser view.\n\t */\n\trenderSettings: function( attachmentsBrowserView ) {\n\t\tvar library = this.get('library'),\n\t\t\tcollectionType = this.get('collectionType'),\n\t\t\tdragInfoText = this.get('dragInfoText'),\n\t\t\tSettingsView = this.get('SettingsView'),\n\t\t\tobj = {};\n\n\t\tif ( ! library || ! attachmentsBrowserView ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlibrary[ collectionType ] = library[ collectionType ] || new Backbone.Model();\n\n\t\tobj[ collectionType ] = new SettingsView({\n\t\t\tcontroller: this,\n\t\t\tmodel:      library[ collectionType ],\n\t\t\tpriority:   40\n\t\t});\n\n\t\tattachmentsBrowserView.sidebar.set( obj );\n\n\t\tif ( dragInfoText ) {\n\t\t\tattachmentsBrowserView.toolbar.set( 'dragInfo', new wp.media.View({\n\t\t\t\tel: $( '<div class=\"instructions\">' + dragInfoText + '</div>' )[0],\n\t\t\t\tpriority: -40\n\t\t\t}) );\n\t\t}\n\n\t\t// Add the 'Reverse order' button to the toolbar.\n\t\tattachmentsBrowserView.toolbar.set( 'reverse', {\n\t\t\ttext:     l10n.reverseOrder,\n\t\t\tpriority: 80,\n\n\t\t\tclick: function() {\n\t\t\t\tlibrary.reset( library.toArray().reverse() );\n\t\t\t}\n\t\t});\n\t}\n});\n\nmodule.exports = CollectionEdit;\n\n},{}],3:[function(require,module,exports){\n/**\n * wp.media.controller.Cropper\n *\n * A state for cropping an image.\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nvar l10n = wp.media.view.l10n,\n\tCropper;\n\nCropper = wp.media.controller.State.extend({\n\tdefaults: {\n\t\tid:          'cropper',\n\t\ttitle:       l10n.cropImage,\n\t\t// Region mode defaults.\n\t\ttoolbar:     'crop',\n\t\tcontent:     'crop',\n\t\trouter:      false,\n\n\t\tcanSkipCrop: false\n\t},\n\n\tactivate: function() {\n\t\tthis.frame.on( 'content:create:crop', this.createCropContent, this );\n\t\tthis.frame.on( 'close', this.removeCropper, this );\n\t\tthis.set('selection', new Backbone.Collection(this.frame._selection.single));\n\t},\n\n\tdeactivate: function() {\n\t\tthis.frame.toolbar.mode('browse');\n\t},\n\n\tcreateCropContent: function() {\n\t\tthis.cropperView = new wp.media.view.Cropper({\n\t\t\tcontroller: this,\n\t\t\tattachment: this.get('selection').first()\n\t\t});\n\t\tthis.cropperView.on('image-loaded', this.createCropToolbar, this);\n\t\tthis.frame.content.set(this.cropperView);\n\n\t},\n\tremoveCropper: function() {\n\t\tthis.imgSelect.cancelSelection();\n\t\tthis.imgSelect.setOptions({remove: true});\n\t\tthis.imgSelect.update();\n\t\tthis.cropperView.remove();\n\t},\n\tcreateCropToolbar: function() {\n\t\tvar canSkipCrop, toolbarOptions;\n\n\t\tcanSkipCrop = this.get('canSkipCrop') || false;\n\n\t\ttoolbarOptions = {\n\t\t\tcontroller: this.frame,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.cropImage,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { library: false, selection: false },\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tselection;\n\n\t\t\t\t\t\tselection = controller.state().get('selection').first();\n\t\t\t\t\t\tselection.set({cropDetails: controller.state().imgSelect.getSelection()});\n\n\t\t\t\t\t\tthis.$el.text(l10n.cropping);\n\t\t\t\t\t\tthis.$el.attr('disabled', true);\n\n\t\t\t\t\t\tcontroller.state().doCrop( selection ).done( function( croppedImage ) {\n\t\t\t\t\t\t\tcontroller.trigger('cropped', croppedImage );\n\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t}).fail( function() {\n\t\t\t\t\t\t\tcontroller.trigger('content:error:crop');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif ( canSkipCrop ) {\n\t\t\t_.extend( toolbarOptions.items, {\n\t\t\t\tskip: {\n\t\t\t\t\tstyle:      'secondary',\n\t\t\t\t\ttext:       l10n.skipCropping,\n\t\t\t\t\tpriority:   70,\n\t\t\t\t\trequires:   { library: false, selection: false },\n\t\t\t\t\tclick:      function() {\n\t\t\t\t\t\tvar selection = this.controller.state().get('selection').first();\n\t\t\t\t\t\tthis.controller.state().cropperView.remove();\n\t\t\t\t\t\tthis.controller.trigger('skippedcrop', selection);\n\t\t\t\t\t\tthis.controller.close();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.frame.toolbar.set( new wp.media.view.Toolbar(toolbarOptions) );\n\t},\n\n\tdoCrop: function( attachment ) {\n\t\treturn wp.ajax.post( 'custom-header-crop', {\n\t\t\tnonce: attachment.get('nonces').edit,\n\t\t\tid: attachment.get('id'),\n\t\t\tcropDetails: attachment.get('cropDetails')\n\t\t} );\n\t}\n});\n\nmodule.exports = Cropper;\n\n},{}],4:[function(require,module,exports){\n/**\n * wp.media.controller.CustomizeImageCropper\n *\n * A state for cropping an image.\n *\n * @class\n * @augments wp.media.controller.Cropper\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nvar Controller = wp.media.controller,\n\tCustomizeImageCropper;\n\nCustomizeImageCropper = Controller.Cropper.extend({\n\tdoCrop: function( attachment ) {\n\t\tvar cropDetails = attachment.get( 'cropDetails' ),\n\t\t\tcontrol = this.get( 'control' );\n\n\t\tcropDetails.dst_width  = control.params.width;\n\t\tcropDetails.dst_height = control.params.height;\n\n\t\treturn wp.ajax.post( 'crop-image', {\n\t\t\twp_customize: 'on',\n\t\t\tnonce: attachment.get( 'nonces' ).edit,\n\t\t\tid: attachment.get( 'id' ),\n\t\t\tcontext: control.id,\n\t\t\tcropDetails: cropDetails\n\t\t} );\n\t}\n});\n\nmodule.exports = CustomizeImageCropper;\n\n},{}],5:[function(require,module,exports){\n/**\n * wp.media.controller.EditImage\n *\n * A state for editing (cropping, etc.) an image.\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                    attributes                      The attributes hash passed to the state.\n * @param {wp.media.model.Attachment} attributes.model                The attachment.\n * @param {string}                    [attributes.id=edit-image]      Unique identifier.\n * @param {string}                    [attributes.title=Edit Image]   Title for the state. Displays in the media menu and the frame's title region.\n * @param {string}                    [attributes.content=edit-image] Initial mode for the content region.\n * @param {string}                    [attributes.toolbar=edit-image] Initial mode for the toolbar region.\n * @param {string}                    [attributes.menu=false]         Initial mode for the menu region.\n * @param {string}                    [attributes.url]                Unused. @todo Consider removal.\n */\nvar l10n = wp.media.view.l10n,\n\tEditImage;\n\nEditImage = wp.media.controller.State.extend({\n\tdefaults: {\n\t\tid:      'edit-image',\n\t\ttitle:   l10n.editImage,\n\t\tmenu:    false,\n\t\ttoolbar: 'edit-image',\n\t\tcontent: 'edit-image',\n\t\turl:     ''\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tthis.listenTo( this.frame, 'toolbar:render:edit-image', this.toolbar );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tdeactivate: function() {\n\t\tthis.stopListening( this.frame );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\ttoolbar: function() {\n\t\tvar frame = this.frame,\n\t\t\tlastState = frame.lastState(),\n\t\t\tprevious = lastState && lastState.id;\n\n\t\tframe.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: frame,\n\t\t\titems: {\n\t\t\t\tback: {\n\t\t\t\t\tstyle: 'primary',\n\t\t\t\t\ttext:     l10n.back,\n\t\t\t\t\tpriority: 20,\n\t\t\t\t\tclick:    function() {\n\t\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tframe.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t}\n});\n\nmodule.exports = EditImage;\n\n},{}],6:[function(require,module,exports){\n/**\n * wp.media.controller.Embed\n *\n * A state for embedding media from a URL.\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object} attributes                         The attributes hash passed to the state.\n * @param {string} [attributes.id=embed]              Unique identifier.\n * @param {string} [attributes.title=Insert From URL] Title for the state. Displays in the media menu and the frame's title region.\n * @param {string} [attributes.content=embed]         Initial mode for the content region.\n * @param {string} [attributes.menu=default]          Initial mode for the menu region.\n * @param {string} [attributes.toolbar=main-embed]    Initial mode for the toolbar region.\n * @param {string} [attributes.menu=false]            Initial mode for the menu region.\n * @param {int}    [attributes.priority=120]          The priority for the state link in the media menu.\n * @param {string} [attributes.type=link]             The type of embed. Currently only link is supported.\n * @param {string} [attributes.url]                   The embed URL.\n * @param {object} [attributes.metadata={}]           Properties of the embed, which will override attributes.url if set.\n */\nvar l10n = wp.media.view.l10n,\n\t$ = Backbone.$,\n\tEmbed;\n\nEmbed = wp.media.controller.State.extend({\n\tdefaults: {\n\t\tid:       'embed',\n\t\ttitle:    l10n.insertFromUrlTitle,\n\t\tcontent:  'embed',\n\t\tmenu:     'default',\n\t\ttoolbar:  'main-embed',\n\t\tpriority: 120,\n\t\ttype:     'link',\n\t\turl:      '',\n\t\tmetadata: {}\n\t},\n\n\t// The amount of time used when debouncing the scan.\n\tsensitivity: 400,\n\n\tinitialize: function(options) {\n\t\tthis.metadata = options.metadata;\n\t\tthis.debouncedScan = _.debounce( _.bind( this.scan, this ), this.sensitivity );\n\t\tthis.props = new Backbone.Model( this.metadata || { url: '' });\n\t\tthis.props.on( 'change:url', this.debouncedScan, this );\n\t\tthis.props.on( 'change:url', this.refresh, this );\n\t\tthis.on( 'scan', this.scanImage, this );\n\t},\n\n\t/**\n\t * Trigger a scan of the embedded URL's content for metadata required to embed.\n\t *\n\t * @fires wp.media.controller.Embed#scan\n\t */\n\tscan: function() {\n\t\tvar scanners,\n\t\t\tembed = this,\n\t\t\tattributes = {\n\t\t\t\ttype: 'link',\n\t\t\t\tscanners: []\n\t\t\t};\n\n\t\t// Scan is triggered with the list of `attributes` to set on the\n\t\t// state, useful for the 'type' attribute and 'scanners' attribute,\n\t\t// an array of promise objects for asynchronous scan operations.\n\t\tif ( this.props.get('url') ) {\n\t\t\tthis.trigger( 'scan', attributes );\n\t\t}\n\n\t\tif ( attributes.scanners.length ) {\n\t\t\tscanners = attributes.scanners = $.when.apply( $, attributes.scanners );\n\t\t\tscanners.always( function() {\n\t\t\t\tif ( embed.get('scanners') === scanners ) {\n\t\t\t\t\tembed.set( 'loading', false );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tattributes.scanners = null;\n\t\t}\n\n\t\tattributes.loading = !! attributes.scanners;\n\t\tthis.set( attributes );\n\t},\n\t/**\n\t * Try scanning the embed as an image to discover its dimensions.\n\t *\n\t * @param {Object} attributes\n\t */\n\tscanImage: function( attributes ) {\n\t\tvar frame = this.frame,\n\t\t\tstate = this,\n\t\t\turl = this.props.get('url'),\n\t\t\timage = new Image(),\n\t\t\tdeferred = $.Deferred();\n\n\t\tattributes.scanners.push( deferred.promise() );\n\n\t\t// Try to load the image and find its width/height.\n\t\timage.onload = function() {\n\t\t\tdeferred.resolve();\n\n\t\t\tif ( state !== frame.state() || url !== state.props.get('url') ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstate.set({\n\t\t\t\ttype: 'image'\n\t\t\t});\n\n\t\t\tstate.props.set({\n\t\t\t\twidth:  image.width,\n\t\t\t\theight: image.height\n\t\t\t});\n\t\t};\n\n\t\timage.onerror = deferred.reject;\n\t\timage.src = url;\n\t},\n\n\trefresh: function() {\n\t\tthis.frame.toolbar.get().refresh();\n\t},\n\n\treset: function() {\n\t\tthis.props.clear().set({ url: '' });\n\n\t\tif ( this.active ) {\n\t\t\tthis.refresh();\n\t\t}\n\t}\n});\n\nmodule.exports = Embed;\n\n},{}],7:[function(require,module,exports){\n/**\n * wp.media.controller.FeaturedImage\n *\n * A state for selecting a featured image for a post.\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                          The attributes hash passed to the state.\n * @param {string}                     [attributes.id=featured-image]        Unique identifier.\n * @param {string}                     [attributes.title=Set Featured Image] Title for the state. Displays in the media menu and the frame's title region.\n * @param {wp.media.model.Attachments} [attributes.library]                  The attachments collection to browse.\n *                                                                           If one is not supplied, a collection of all images will be created.\n * @param {boolean}                    [attributes.multiple=false]           Whether multi-select is enabled.\n * @param {string}                     [attributes.content=upload]           Initial mode for the content region.\n *                                                                           Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                     [attributes.menu=default]             Initial mode for the menu region.\n * @param {string}                     [attributes.router=browse]            Initial mode for the router region.\n * @param {string}                     [attributes.toolbar=featured-image]   Initial mode for the toolbar region.\n * @param {int}                        [attributes.priority=60]              The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.searchable=true]          Whether the library is searchable.\n * @param {boolean|string}             [attributes.filterable=false]         Whether the library is filterable, and if so what filters should be shown.\n *                                                                           Accepts 'all', 'uploaded', or 'unattached'.\n * @param {boolean}                    [attributes.sortable=true]            Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.autoSelect=true]          Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                    [attributes.describe=false]           Whether to offer UI to describe attachments - e.g. captioning images in a gallery.\n * @param {boolean}                    [attributes.contentUserSetting=true]  Whether the content region's mode should be set and persisted per user.\n * @param {boolean}                    [attributes.syncSelection=true]       Whether the Attachments selection should be persisted from the last state.\n */\nvar Attachment = wp.media.model.Attachment,\n\tLibrary = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tFeaturedImage;\n\nFeaturedImage = Library.extend({\n\tdefaults: _.defaults({\n\t\tid:            'featured-image',\n\t\ttitle:         l10n.setFeaturedImageTitle,\n\t\tmultiple:      false,\n\t\tfilterable:    'uploaded',\n\t\ttoolbar:       'featured-image',\n\t\tpriority:      60,\n\t\tsyncSelection: true\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tinitialize: function() {\n\t\tvar library, comparator;\n\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: 'image' }) );\n\t\t}\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\n\t\tlibrary    = this.get('library');\n\t\tcomparator = library.comparator;\n\n\t\t// Overload the library's comparator to push items that are not in\n\t\t// the mirrored query to the front of the aggregate collection.\n\t\tlibrary.comparator = function( a, b ) {\n\t\t\tvar aInQuery = !! this.mirroring.get( a.cid ),\n\t\t\t\tbInQuery = !! this.mirroring.get( b.cid );\n\n\t\t\tif ( ! aInQuery && bInQuery ) {\n\t\t\t\treturn -1;\n\t\t\t} else if ( aInQuery && ! bInQuery ) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn comparator.apply( this, arguments );\n\t\t\t}\n\t\t};\n\n\t\t// Add all items in the selection to the library, so any featured\n\t\t// images that are not initially loaded still appear.\n\t\tlibrary.observe( this.get('selection') );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tactivate: function() {\n\t\tthis.updateSelection();\n\t\tthis.frame.on( 'open', this.updateSelection, this );\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tdeactivate: function() {\n\t\tthis.frame.off( 'open', this.updateSelection, this );\n\n\t\tLibrary.prototype.deactivate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tupdateSelection: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tid = wp.media.view.settings.post.featuredImageId,\n\t\t\tattachment;\n\n\t\tif ( '' !== id && -1 !== id ) {\n\t\t\tattachment = Attachment.get( id );\n\t\t\tattachment.fetch();\n\t\t}\n\n\t\tselection.reset( attachment ? [ attachment ] : [] );\n\t}\n});\n\nmodule.exports = FeaturedImage;\n\n},{}],8:[function(require,module,exports){\n/**\n * wp.media.controller.GalleryAdd\n *\n * A state for selecting more images to add to a gallery.\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                         The attributes hash passed to the state.\n * @param {string}                     [attributes.id=gallery-library]      Unique identifier.\n * @param {string}                     [attributes.title=Add to Gallery]    Title for the state. Displays in the frame's title region.\n * @param {boolean}                    [attributes.multiple=add]            Whether multi-select is enabled. @todo 'add' doesn't seem do anything special, and gets used as a boolean.\n * @param {wp.media.model.Attachments} [attributes.library]                 The attachments collection to browse.\n *                                                                          If one is not supplied, a collection of all images will be created.\n * @param {boolean|string}             [attributes.filterable=uploaded]     Whether the library is filterable, and if so what filters should be shown.\n *                                                                          Accepts 'all', 'uploaded', or 'unattached'.\n * @param {string}                     [attributes.menu=gallery]            Initial mode for the menu region.\n * @param {string}                     [attributes.content=upload]          Initial mode for the content region.\n *                                                                          Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                     [attributes.router=browse]           Initial mode for the router region.\n * @param {string}                     [attributes.toolbar=gallery-add]     Initial mode for the toolbar region.\n * @param {boolean}                    [attributes.searchable=true]         Whether the library is searchable.\n * @param {boolean}                    [attributes.sortable=true]           Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.autoSelect=true]         Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                    [attributes.contentUserSetting=true] Whether the content region's mode should be set and persisted per user.\n * @param {int}                        [attributes.priority=100]            The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.syncSelection=false]     Whether the Attachments selection should be persisted from the last state.\n *                                                                          Defaults to false because for this state, because the library of the Edit Gallery state is the selection.\n */\nvar Selection = wp.media.model.Selection,\n\tLibrary = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tGalleryAdd;\n\nGalleryAdd = Library.extend({\n\tdefaults: _.defaults({\n\t\tid:            'gallery-library',\n\t\ttitle:         l10n.addToGalleryTitle,\n\t\tmultiple:      'add',\n\t\tfilterable:    'uploaded',\n\t\tmenu:          'gallery',\n\t\ttoolbar:       'gallery-add',\n\t\tpriority:      100,\n\t\tsyncSelection: false\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tinitialize: function() {\n\t\t// If a library wasn't supplied, create a library of images.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: 'image' }) );\n\t\t}\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tactivate: function() {\n\t\tvar library = this.get('library'),\n\t\t\tedit    = this.frame.state('gallery-edit').get('library');\n\n\t\tif ( this.editLibrary && this.editLibrary !== edit ) {\n\t\t\tlibrary.unobserve( this.editLibrary );\n\t\t}\n\n\t\t// Accepts attachments that exist in the original library and\n\t\t// that do not exist in gallery's library.\n\t\tlibrary.validator = function( attachment ) {\n\t\t\treturn !! this.mirroring.get( attachment.cid ) && ! edit.get( attachment.cid ) && Selection.prototype.validator.apply( this, arguments );\n\t\t};\n\n\t\t// Reset the library to ensure that all attachments are re-added\n\t\t// to the collection. Do so silently, as calling `observe` will\n\t\t// trigger the `reset` event.\n\t\tlibrary.reset( library.mirroring.models, { silent: true });\n\t\tlibrary.observe( edit );\n\t\tthis.editLibrary = edit;\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t}\n});\n\nmodule.exports = GalleryAdd;\n\n},{}],9:[function(require,module,exports){\n/**\n * wp.media.controller.GalleryEdit\n *\n * A state for editing a gallery's images and settings.\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                       The attributes hash passed to the state.\n * @param {string}                     [attributes.id=gallery-edit]       Unique identifier.\n * @param {string}                     [attributes.title=Edit Gallery]    Title for the state. Displays in the frame's title region.\n * @param {wp.media.model.Attachments} [attributes.library]               The collection of attachments in the gallery.\n *                                                                        If one is not supplied, an empty media.model.Selection collection is created.\n * @param {boolean}                    [attributes.multiple=false]        Whether multi-select is enabled.\n * @param {boolean}                    [attributes.searchable=false]      Whether the library is searchable.\n * @param {boolean}                    [attributes.sortable=true]         Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.date=true]             Whether to show the date filter in the browser's toolbar.\n * @param {string|false}               [attributes.content=browse]        Initial mode for the content region.\n * @param {string|false}               [attributes.toolbar=image-details] Initial mode for the toolbar region.\n * @param {boolean}                    [attributes.describe=true]         Whether to offer UI to describe attachments - e.g. captioning images in a gallery.\n * @param {boolean}                    [attributes.displaySettings=true]  Whether to show the attachment display settings interface.\n * @param {boolean}                    [attributes.dragInfo=true]         Whether to show instructional text about the attachments being sortable.\n * @param {int}                        [attributes.idealColumnWidth=170]  The ideal column width in pixels for attachments.\n * @param {boolean}                    [attributes.editing=false]         Whether the gallery is being created, or editing an existing instance.\n * @param {int}                        [attributes.priority=60]           The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.syncSelection=false]   Whether the Attachments selection should be persisted from the last state.\n *                                                                        Defaults to false for this state, because the library passed in  *is* the selection.\n * @param {view}                       [attributes.AttachmentView]        The single `Attachment` view to be used in the `Attachments`.\n *                                                                        If none supplied, defaults to wp.media.view.Attachment.EditLibrary.\n */\nvar Library = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tGalleryEdit;\n\nGalleryEdit = Library.extend({\n\tdefaults: {\n\t\tid:               'gallery-edit',\n\t\ttitle:            l10n.editGalleryTitle,\n\t\tmultiple:         false,\n\t\tsearchable:       false,\n\t\tsortable:         true,\n\t\tdate:             false,\n\t\tdisplay:          false,\n\t\tcontent:          'browse',\n\t\ttoolbar:          'gallery-edit',\n\t\tdescribe:         true,\n\t\tdisplaySettings:  true,\n\t\tdragInfo:         true,\n\t\tidealColumnWidth: 170,\n\t\tediting:          false,\n\t\tpriority:         60,\n\t\tsyncSelection:    false\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tinitialize: function() {\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', new wp.media.model.Selection() );\n\t\t}\n\n\t\t// The single `Attachment` view to be used in the `Attachments` view.\n\t\tif ( ! this.get('AttachmentView') ) {\n\t\t\tthis.set( 'AttachmentView', wp.media.view.Attachment.EditLibrary );\n\t\t}\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tactivate: function() {\n\t\tvar library = this.get('library');\n\n\t\t// Limit the library to images only.\n\t\tlibrary.props.set( 'type', 'image' );\n\n\t\t// Watch for uploaded attachments.\n\t\tthis.get('library').observe( wp.Uploader.queue );\n\n\t\tthis.frame.on( 'content:render:browse', this.gallerySettings, this );\n\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tdeactivate: function() {\n\t\t// Stop watching for uploaded attachments.\n\t\tthis.get('library').unobserve( wp.Uploader.queue );\n\n\t\tthis.frame.off( 'content:render:browse', this.gallerySettings, this );\n\n\t\tLibrary.prototype.deactivate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t *\n\t * @param browser\n\t */\n\tgallerySettings: function( browser ) {\n\t\tif ( ! this.get('displaySettings') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar library = this.get('library');\n\n\t\tif ( ! library || ! browser ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlibrary.gallery = library.gallery || new Backbone.Model();\n\n\t\tbrowser.sidebar.set({\n\t\t\tgallery: new wp.media.view.Settings.Gallery({\n\t\t\t\tcontroller: this,\n\t\t\t\tmodel:      library.gallery,\n\t\t\t\tpriority:   40\n\t\t\t})\n\t\t});\n\n\t\tbrowser.toolbar.set( 'reverse', {\n\t\t\ttext:     l10n.reverseOrder,\n\t\t\tpriority: 80,\n\n\t\t\tclick: function() {\n\t\t\t\tlibrary.reset( library.toArray().reverse() );\n\t\t\t}\n\t\t});\n\t}\n});\n\nmodule.exports = GalleryEdit;\n\n},{}],10:[function(require,module,exports){\n/**\n * wp.media.controller.ImageDetails\n *\n * A state for editing the attachment display settings of an image that's been\n * inserted into the editor.\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                    [attributes]                       The attributes hash passed to the state.\n * @param {string}                    [attributes.id=image-details]      Unique identifier.\n * @param {string}                    [attributes.title=Image Details]   Title for the state. Displays in the frame's title region.\n * @param {wp.media.model.Attachment} attributes.image                   The image's model.\n * @param {string|false}              [attributes.content=image-details] Initial mode for the content region.\n * @param {string|false}              [attributes.menu=false]            Initial mode for the menu region.\n * @param {string|false}              [attributes.router=false]          Initial mode for the router region.\n * @param {string|false}              [attributes.toolbar=image-details] Initial mode for the toolbar region.\n * @param {boolean}                   [attributes.editing=false]         Unused.\n * @param {int}                       [attributes.priority=60]           Unused.\n *\n * @todo This state inherits some defaults from media.controller.Library.prototype.defaults,\n *       however this may not do anything.\n */\nvar State = wp.media.controller.State,\n\tLibrary = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tImageDetails;\n\nImageDetails = State.extend({\n\tdefaults: _.defaults({\n\t\tid:       'image-details',\n\t\ttitle:    l10n.imageDetailsTitle,\n\t\tcontent:  'image-details',\n\t\tmenu:     false,\n\t\trouter:   false,\n\t\ttoolbar:  'image-details',\n\t\tediting:  false,\n\t\tpriority: 60\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.9.0\n\t *\n\t * @param options Attributes\n\t */\n\tinitialize: function( options ) {\n\t\tthis.image = options.image;\n\t\tState.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tthis.frame.modal.$el.addClass('image-details');\n\t}\n});\n\nmodule.exports = ImageDetails;\n\n},{}],11:[function(require,module,exports){\n/**\n * wp.media.controller.Library\n *\n * A state for choosing an attachment or group of attachments from the media library.\n *\n * @class\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n * @mixes media.selectionSync\n *\n * @param {object}                          [attributes]                         The attributes hash passed to the state.\n * @param {string}                          [attributes.id=library]              Unique identifier.\n * @param {string}                          [attributes.title=Media library]     Title for the state. Displays in the media menu and the frame's title region.\n * @param {wp.media.model.Attachments}      [attributes.library]                 The attachments collection to browse.\n *                                                                               If one is not supplied, a collection of all attachments will be created.\n * @param {wp.media.model.Selection|object} [attributes.selection]               A collection to contain attachment selections within the state.\n *                                                                               If the 'selection' attribute is a plain JS object,\n *                                                                               a Selection will be created using its values as the selection instance's `props` model.\n *                                                                               Otherwise, it will copy the library's `props` model.\n * @param {boolean}                         [attributes.multiple=false]          Whether multi-select is enabled.\n * @param {string}                          [attributes.content=upload]          Initial mode for the content region.\n *                                                                               Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                          [attributes.menu=default]            Initial mode for the menu region.\n * @param {string}                          [attributes.router=browse]           Initial mode for the router region.\n * @param {string}                          [attributes.toolbar=select]          Initial mode for the toolbar region.\n * @param {boolean}                         [attributes.searchable=true]         Whether the library is searchable.\n * @param {boolean|string}                  [attributes.filterable=false]        Whether the library is filterable, and if so what filters should be shown.\n *                                                                               Accepts 'all', 'uploaded', or 'unattached'.\n * @param {boolean}                         [attributes.sortable=true]           Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                         [attributes.autoSelect=true]         Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                         [attributes.describe=false]          Whether to offer UI to describe attachments - e.g. captioning images in a gallery.\n * @param {boolean}                         [attributes.contentUserSetting=true] Whether the content region's mode should be set and persisted per user.\n * @param {boolean}                         [attributes.syncSelection=true]      Whether the Attachments selection should be persisted from the last state.\n */\nvar l10n = wp.media.view.l10n,\n\tgetUserSetting = window.getUserSetting,\n\tsetUserSetting = window.setUserSetting,\n\tLibrary;\n\nLibrary = wp.media.controller.State.extend({\n\tdefaults: {\n\t\tid:                 'library',\n\t\ttitle:              l10n.mediaLibraryTitle,\n\t\tmultiple:           false,\n\t\tcontent:            'upload',\n\t\tmenu:               'default',\n\t\trouter:             'browse',\n\t\ttoolbar:            'select',\n\t\tsearchable:         true,\n\t\tfilterable:         false,\n\t\tsortable:           true,\n\t\tautoSelect:         true,\n\t\tdescribe:           false,\n\t\tcontentUserSetting: true,\n\t\tsyncSelection:      true\n\t},\n\n\t/**\n\t * If a library isn't provided, query all media items.\n\t * If a selection instance isn't provided, create one.\n\t *\n\t * @since 3.5.0\n\t */\n\tinitialize: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tprops;\n\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query() );\n\t\t}\n\n\t\tif ( ! ( selection instanceof wp.media.model.Selection ) ) {\n\t\t\tprops = selection;\n\n\t\t\tif ( ! props ) {\n\t\t\t\tprops = this.get('library').props.toJSON();\n\t\t\t\tprops = _.omit( props, 'orderby', 'query' );\n\t\t\t}\n\n\t\t\tthis.set( 'selection', new wp.media.model.Selection( null, {\n\t\t\t\tmultiple: this.get('multiple'),\n\t\t\t\tprops: props\n\t\t\t}) );\n\t\t}\n\n\t\tthis.resetDisplays();\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tactivate: function() {\n\t\tthis.syncSelection();\n\n\t\twp.Uploader.queue.on( 'add', this.uploading, this );\n\n\t\tthis.get('selection').on( 'add remove reset', this.refreshContent, this );\n\n\t\tif ( this.get( 'router' ) && this.get('contentUserSetting') ) {\n\t\t\tthis.frame.on( 'content:activate', this.saveContentMode, this );\n\t\t\tthis.set( 'content', getUserSetting( 'libraryContent', this.get('content') ) );\n\t\t}\n\t},\n\n\t/**\n\t * @since 3.5.0\n\t */\n\tdeactivate: function() {\n\t\tthis.recordSelection();\n\n\t\tthis.frame.off( 'content:activate', this.saveContentMode, this );\n\n\t\t// Unbind all event handlers that use this state as the context\n\t\t// from the selection.\n\t\tthis.get('selection').off( null, null, this );\n\n\t\twp.Uploader.queue.off( null, null, this );\n\t},\n\n\t/**\n\t * Reset the library to its initial state.\n\t *\n\t * @since 3.5.0\n\t */\n\treset: function() {\n\t\tthis.get('selection').reset();\n\t\tthis.resetDisplays();\n\t\tthis.refreshContent();\n\t},\n\n\t/**\n\t * Reset the attachment display settings defaults to the site options.\n\t *\n\t * If site options don't define them, fall back to a persistent user setting.\n\t *\n\t * @since 3.5.0\n\t */\n\tresetDisplays: function() {\n\t\tvar defaultProps = wp.media.view.settings.defaultProps;\n\t\tthis._displays = [];\n\t\tthis._defaultDisplaySettings = {\n\t\t\talign: getUserSetting( 'align', defaultProps.align ) || 'none',\n\t\t\tsize:  getUserSetting( 'imgsize', defaultProps.size ) || 'medium',\n\t\t\tlink:  getUserSetting( 'urlbutton', defaultProps.link ) || 'none'\n\t\t};\n\t},\n\n\t/**\n\t * Create a model to represent display settings (alignment, etc.) for an attachment.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @returns {Backbone.Model}\n\t */\n\tdisplay: function( attachment ) {\n\t\tvar displays = this._displays;\n\n\t\tif ( ! displays[ attachment.cid ] ) {\n\t\t\tdisplays[ attachment.cid ] = new Backbone.Model( this.defaultDisplaySettings( attachment ) );\n\t\t}\n\t\treturn displays[ attachment.cid ];\n\t},\n\n\t/**\n\t * Given an attachment, create attachment display settings properties.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @returns {Object}\n\t */\n\tdefaultDisplaySettings: function( attachment ) {\n\t\tvar settings = _.clone( this._defaultDisplaySettings );\n\n\t\tif ( settings.canEmbed = this.canEmbed( attachment ) ) {\n\t\t\tsettings.link = 'embed';\n\t\t} else if ( ! this.isImageAttachment( attachment ) && settings.link === 'none' ) {\n\t\t\tsettings.link = 'file';\n\t\t}\n\n\t\treturn settings;\n\t},\n\n\t/**\n\t * Whether an attachment is image.\n\t *\n\t * @since 4.4.1\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @returns {Boolean}\n\t */\n\tisImageAttachment: function( attachment ) {\n\t\t// If uploading, we know the filename but not the mime type.\n\t\tif ( attachment.get('uploading') ) {\n\t\t\treturn /\\.(jpe?g|png|gif)$/i.test( attachment.get('filename') );\n\t\t}\n\n\t\treturn attachment.get('type') === 'image';\n\t},\n\n\t/**\n\t * Whether an attachment can be embedded (audio or video).\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t * @returns {Boolean}\n\t */\n\tcanEmbed: function( attachment ) {\n\t\t// If uploading, we know the filename but not the mime type.\n\t\tif ( ! attachment.get('uploading') ) {\n\t\t\tvar type = attachment.get('type');\n\t\t\tif ( type !== 'audio' && type !== 'video' ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn _.contains( wp.media.view.settings.embedExts, attachment.get('filename').split('.').pop() );\n\t},\n\n\n\t/**\n\t * If the state is active, no items are selected, and the current\n\t * content mode is not an option in the state's router (provided\n\t * the state has a router), reset the content mode to the default.\n\t *\n\t * @since 3.5.0\n\t */\n\trefreshContent: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tframe = this.frame,\n\t\t\trouter = frame.router.get(),\n\t\t\tmode = frame.content.mode();\n\n\t\tif ( this.active && ! selection.length && router && ! router.get( mode ) ) {\n\t\t\tthis.frame.content.render( this.get('content') );\n\t\t}\n\t},\n\n\t/**\n\t * Callback handler when an attachment is uploaded.\n\t *\n\t * Switch to the Media Library if uploaded from the 'Upload Files' tab.\n\t *\n\t * Adds any uploading attachments to the selection.\n\t *\n\t * If the state only supports one attachment to be selected and multiple\n\t * attachments are uploaded, the last attachment in the upload queue will\n\t * be selected.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {wp.media.model.Attachment} attachment\n\t */\n\tuploading: function( attachment ) {\n\t\tvar content = this.frame.content;\n\n\t\tif ( 'upload' === content.mode() ) {\n\t\t\tthis.frame.content.mode('browse');\n\t\t}\n\n\t\tif ( this.get( 'autoSelect' ) ) {\n\t\t\tthis.get('selection').add( attachment );\n\t\t\tthis.frame.trigger( 'library:selection:add' );\n\t\t}\n\t},\n\n\t/**\n\t * Persist the mode of the content region as a user setting.\n\t *\n\t * @since 3.5.0\n\t */\n\tsaveContentMode: function() {\n\t\tif ( 'browse' !== this.get('router') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar mode = this.frame.content.mode(),\n\t\t\tview = this.frame.router.get();\n\n\t\tif ( view && view.get( mode ) ) {\n\t\t\tsetUserSetting( 'libraryContent', mode );\n\t\t}\n\t}\n});\n\n// Make selectionSync available on any Media Library state.\n_.extend( Library.prototype, wp.media.selectionSync );\n\nmodule.exports = Library;\n\n},{}],12:[function(require,module,exports){\n/**\n * wp.media.controller.MediaLibrary\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nvar Library = wp.media.controller.Library,\n\tMediaLibrary;\n\nMediaLibrary = Library.extend({\n\tdefaults: _.defaults({\n\t\t// Attachments browser defaults. @see media.view.AttachmentsBrowser\n\t\tfilterable:      'uploaded',\n\n\t\tdisplaySettings: false,\n\t\tpriority:        80,\n\t\tsyncSelection:   false\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.9.0\n\t *\n\t * @param options\n\t */\n\tinitialize: function( options ) {\n\t\tthis.media = options.media;\n\t\tthis.type = options.type;\n\t\tthis.set( 'library', wp.media.query({ type: this.type }) );\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\t// @todo this should use this.frame.\n\t\tif ( wp.media.frame.lastMime ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: wp.media.frame.lastMime }) );\n\t\t\tdelete wp.media.frame.lastMime;\n\t\t}\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t}\n});\n\nmodule.exports = MediaLibrary;\n\n},{}],13:[function(require,module,exports){\n/**\n * wp.media.controller.Region\n *\n * A region is a persistent application layout area.\n *\n * A region assumes one mode at any time, and can be switched to another.\n *\n * When mode changes, events are triggered on the region's parent view.\n * The parent view will listen to specific events and fill the region with an\n * appropriate view depending on mode. For example, a frame listens for the\n * 'browse' mode t be activated on the 'content' view and then fills the region\n * with an AttachmentsBrowser view.\n *\n * @class\n *\n * @param {object}        options          Options hash for the region.\n * @param {string}        options.id       Unique identifier for the region.\n * @param {Backbone.View} options.view     A parent view the region exists within.\n * @param {string}        options.selector jQuery selector for the region within the parent view.\n */\nvar Region = function( options ) {\n\t_.extend( this, _.pick( options || {}, 'id', 'view', 'selector' ) );\n};\n\n// Use Backbone's self-propagating `extend` inheritance method.\nRegion.extend = Backbone.Model.extend;\n\n_.extend( Region.prototype, {\n\t/**\n\t * Activate a mode.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} mode\n\t *\n\t * @fires this.view#{this.id}:activate:{this._mode}\n\t * @fires this.view#{this.id}:activate\n\t * @fires this.view#{this.id}:deactivate:{this._mode}\n\t * @fires this.view#{this.id}:deactivate\n\t *\n\t * @returns {wp.media.controller.Region} Returns itself to allow chaining.\n\t */\n\tmode: function( mode ) {\n\t\tif ( ! mode ) {\n\t\t\treturn this._mode;\n\t\t}\n\t\t// Bail if we're trying to change to the current mode.\n\t\tif ( mode === this._mode ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t/**\n\t\t * Region mode deactivation event.\n\t\t *\n\t\t * @event this.view#{this.id}:deactivate:{this._mode}\n\t\t * @event this.view#{this.id}:deactivate\n\t\t */\n\t\tthis.trigger('deactivate');\n\n\t\tthis._mode = mode;\n\t\tthis.render( mode );\n\n\t\t/**\n\t\t * Region mode activation event.\n\t\t *\n\t\t * @event this.view#{this.id}:activate:{this._mode}\n\t\t * @event this.view#{this.id}:activate\n\t\t */\n\t\tthis.trigger('activate');\n\t\treturn this;\n\t},\n\t/**\n\t * Render a mode.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} mode\n\t *\n\t * @fires this.view#{this.id}:create:{this._mode}\n\t * @fires this.view#{this.id}:create\n\t * @fires this.view#{this.id}:render:{this._mode}\n\t * @fires this.view#{this.id}:render\n\t *\n\t * @returns {wp.media.controller.Region} Returns itself to allow chaining\n\t */\n\trender: function( mode ) {\n\t\t// If the mode isn't active, activate it.\n\t\tif ( mode && mode !== this._mode ) {\n\t\t\treturn this.mode( mode );\n\t\t}\n\n\t\tvar set = { view: null },\n\t\t\tview;\n\n\t\t/**\n\t\t * Create region view event.\n\t\t *\n\t\t * Region view creation takes place in an event callback on the frame.\n\t\t *\n\t\t * @event this.view#{this.id}:create:{this._mode}\n\t\t * @event this.view#{this.id}:create\n\t\t */\n\t\tthis.trigger( 'create', set );\n\t\tview = set.view;\n\n\t\t/**\n\t\t * Render region view event.\n\t\t *\n\t\t * Region view creation takes place in an event callback on the frame.\n\t\t *\n\t\t * @event this.view#{this.id}:create:{this._mode}\n\t\t * @event this.view#{this.id}:create\n\t\t */\n\t\tthis.trigger( 'render', view );\n\t\tif ( view ) {\n\t\t\tthis.set( view );\n\t\t}\n\t\treturn this;\n\t},\n\n\t/**\n\t * Get the region's view.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @returns {wp.media.View}\n\t */\n\tget: function() {\n\t\treturn this.view.views.first( this.selector );\n\t},\n\n\t/**\n\t * Set the region's view as a subview of the frame.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {Array|Object} views\n\t * @param {Object} [options={}]\n\t * @returns {wp.Backbone.Subviews} Subviews is returned to allow chaining\n\t */\n\tset: function( views, options ) {\n\t\tif ( options ) {\n\t\t\toptions.add = false;\n\t\t}\n\t\treturn this.view.views.set( this.selector, views, options );\n\t},\n\n\t/**\n\t * Trigger regional view events on the frame.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} event\n\t * @returns {undefined|wp.media.controller.Region} Returns itself to allow chaining.\n\t */\n\ttrigger: function( event ) {\n\t\tvar base, args;\n\n\t\tif ( ! this._mode ) {\n\t\t\treturn;\n\t\t}\n\n\t\targs = _.toArray( arguments );\n\t\tbase = this.id + ':' + event;\n\n\t\t// Trigger `{this.id}:{event}:{this._mode}` event on the frame.\n\t\targs[0] = base + ':' + this._mode;\n\t\tthis.view.trigger.apply( this.view, args );\n\n\t\t// Trigger `{this.id}:{event}` event on the frame.\n\t\targs[0] = base;\n\t\tthis.view.trigger.apply( this.view, args );\n\t\treturn this;\n\t}\n});\n\nmodule.exports = Region;\n\n},{}],14:[function(require,module,exports){\n/**\n * wp.media.controller.ReplaceImage\n *\n * A state for replacing an image.\n *\n * @class\n * @augments wp.media.controller.Library\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n *\n * @param {object}                     [attributes]                         The attributes hash passed to the state.\n * @param {string}                     [attributes.id=replace-image]        Unique identifier.\n * @param {string}                     [attributes.title=Replace Image]     Title for the state. Displays in the media menu and the frame's title region.\n * @param {wp.media.model.Attachments} [attributes.library]                 The attachments collection to browse.\n *                                                                          If one is not supplied, a collection of all images will be created.\n * @param {boolean}                    [attributes.multiple=false]          Whether multi-select is enabled.\n * @param {string}                     [attributes.content=upload]          Initial mode for the content region.\n *                                                                          Overridden by persistent user setting if 'contentUserSetting' is true.\n * @param {string}                     [attributes.menu=default]            Initial mode for the menu region.\n * @param {string}                     [attributes.router=browse]           Initial mode for the router region.\n * @param {string}                     [attributes.toolbar=replace]         Initial mode for the toolbar region.\n * @param {int}                        [attributes.priority=60]             The priority for the state link in the media menu.\n * @param {boolean}                    [attributes.searchable=true]         Whether the library is searchable.\n * @param {boolean|string}             [attributes.filterable=uploaded]     Whether the library is filterable, and if so what filters should be shown.\n *                                                                          Accepts 'all', 'uploaded', or 'unattached'.\n * @param {boolean}                    [attributes.sortable=true]           Whether the Attachments should be sortable. Depends on the orderby property being set to menuOrder on the attachments collection.\n * @param {boolean}                    [attributes.autoSelect=true]         Whether an uploaded attachment should be automatically added to the selection.\n * @param {boolean}                    [attributes.describe=false]          Whether to offer UI to describe attachments - e.g. captioning images in a gallery.\n * @param {boolean}                    [attributes.contentUserSetting=true] Whether the content region's mode should be set and persisted per user.\n * @param {boolean}                    [attributes.syncSelection=true]      Whether the Attachments selection should be persisted from the last state.\n */\nvar Library = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tReplaceImage;\n\nReplaceImage = Library.extend({\n\tdefaults: _.defaults({\n\t\tid:            'replace-image',\n\t\ttitle:         l10n.replaceImageTitle,\n\t\tmultiple:      false,\n\t\tfilterable:    'uploaded',\n\t\ttoolbar:       'replace',\n\t\tmenu:          false,\n\t\tpriority:      60,\n\t\tsyncSelection: true\n\t}, Library.prototype.defaults ),\n\n\t/**\n\t * @since 3.9.0\n\t *\n\t * @param options\n\t */\n\tinitialize: function( options ) {\n\t\tvar library, comparator;\n\n\t\tthis.image = options.image;\n\t\t// If we haven't been provided a `library`, create a `Selection`.\n\t\tif ( ! this.get('library') ) {\n\t\t\tthis.set( 'library', wp.media.query({ type: 'image' }) );\n\t\t}\n\n\t\tLibrary.prototype.initialize.apply( this, arguments );\n\n\t\tlibrary    = this.get('library');\n\t\tcomparator = library.comparator;\n\n\t\t// Overload the library's comparator to push items that are not in\n\t\t// the mirrored query to the front of the aggregate collection.\n\t\tlibrary.comparator = function( a, b ) {\n\t\t\tvar aInQuery = !! this.mirroring.get( a.cid ),\n\t\t\t\tbInQuery = !! this.mirroring.get( b.cid );\n\n\t\t\tif ( ! aInQuery && bInQuery ) {\n\t\t\t\treturn -1;\n\t\t\t} else if ( aInQuery && ! bInQuery ) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn comparator.apply( this, arguments );\n\t\t\t}\n\t\t};\n\n\t\t// Add all items in the selection to the library, so any featured\n\t\t// images that are not initially loaded still appear.\n\t\tlibrary.observe( this.get('selection') );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tactivate: function() {\n\t\tthis.updateSelection();\n\t\tLibrary.prototype.activate.apply( this, arguments );\n\t},\n\n\t/**\n\t * @since 3.9.0\n\t */\n\tupdateSelection: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tattachment = this.image.attachment;\n\n\t\tselection.reset( attachment ? [ attachment ] : [] );\n\t}\n});\n\nmodule.exports = ReplaceImage;\n\n},{}],15:[function(require,module,exports){\n/**\n * wp.media.controller.SiteIconCropper\n *\n * A state for cropping a Site Icon.\n *\n * @class\n * @augments wp.media.controller.Cropper\n * @augments wp.media.controller.State\n * @augments Backbone.Model\n */\nvar Controller = wp.media.controller,\n\tSiteIconCropper;\n\nSiteIconCropper = Controller.Cropper.extend({\n\tactivate: function() {\n\t\tthis.frame.on( 'content:create:crop', this.createCropContent, this );\n\t\tthis.frame.on( 'close', this.removeCropper, this );\n\t\tthis.set('selection', new Backbone.Collection(this.frame._selection.single));\n\t},\n\n\tcreateCropContent: function() {\n\t\tthis.cropperView = new wp.media.view.SiteIconCropper({\n\t\t\tcontroller: this,\n\t\t\tattachment: this.get('selection').first()\n\t\t});\n\t\tthis.cropperView.on('image-loaded', this.createCropToolbar, this);\n\t\tthis.frame.content.set(this.cropperView);\n\n\t},\n\n\tdoCrop: function( attachment ) {\n\t\tvar cropDetails = attachment.get( 'cropDetails' ),\n\t\t\tcontrol = this.get( 'control' );\n\n\t\tcropDetails.dst_width  = control.params.width;\n\t\tcropDetails.dst_height = control.params.height;\n\n\t\treturn wp.ajax.post( 'crop-image', {\n\t\t\tnonce: attachment.get( 'nonces' ).edit,\n\t\t\tid: attachment.get( 'id' ),\n\t\t\tcontext: 'site-icon',\n\t\t\tcropDetails: cropDetails\n\t\t} );\n\t}\n});\n\nmodule.exports = SiteIconCropper;\n\n},{}],16:[function(require,module,exports){\n/**\n * wp.media.controller.StateMachine\n *\n * A state machine keeps track of state. It is in one state at a time,\n * and can change from one state to another.\n *\n * States are stored as models in a Backbone collection.\n *\n * @since 3.5.0\n *\n * @class\n * @augments Backbone.Model\n * @mixin\n * @mixes Backbone.Events\n *\n * @param {Array} states\n */\nvar StateMachine = function( states ) {\n\t// @todo This is dead code. The states collection gets created in media.view.Frame._createStates.\n\tthis.states = new Backbone.Collection( states );\n};\n\n// Use Backbone's self-propagating `extend` inheritance method.\nStateMachine.extend = Backbone.Model.extend;\n\n_.extend( StateMachine.prototype, Backbone.Events, {\n\t/**\n\t * Fetch a state.\n\t *\n\t * If no `id` is provided, returns the active state.\n\t *\n\t * Implicitly creates states.\n\t *\n\t * Ensure that the `states` collection exists so the `StateMachine`\n\t *   can be used as a mixin.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} id\n\t * @returns {wp.media.controller.State} Returns a State model\n\t *   from the StateMachine collection\n\t */\n\tstate: function( id ) {\n\t\tthis.states = this.states || new Backbone.Collection();\n\n\t\t// Default to the active state.\n\t\tid = id || this._state;\n\n\t\tif ( id && ! this.states.get( id ) ) {\n\t\t\tthis.states.add({ id: id });\n\t\t}\n\t\treturn this.states.get( id );\n\t},\n\n\t/**\n\t * Sets the active state.\n\t *\n\t * Bail if we're trying to select the current state, if we haven't\n\t * created the `states` collection, or are trying to select a state\n\t * that does not exist.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param {string} id\n\t *\n\t * @fires wp.media.controller.State#deactivate\n\t * @fires wp.media.controller.State#activate\n\t *\n\t * @returns {wp.media.controller.StateMachine} Returns itself to allow chaining\n\t */\n\tsetState: function( id ) {\n\t\tvar previous = this.state();\n\n\t\tif ( ( previous && id === previous.id ) || ! this.states || ! this.states.get( id ) ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( previous ) {\n\t\t\tprevious.trigger('deactivate');\n\t\t\tthis._lastState = previous.id;\n\t\t}\n\n\t\tthis._state = id;\n\t\tthis.state().trigger('activate');\n\n\t\treturn this;\n\t},\n\n\t/**\n\t * Returns the previous active state.\n\t *\n\t * Call the `state()` method with no parameters to retrieve the current\n\t * active state.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @returns {wp.media.controller.State} Returns a State model\n\t *    from the StateMachine collection\n\t */\n\tlastState: function() {\n\t\tif ( this._lastState ) {\n\t\t\treturn this.state( this._lastState );\n\t\t}\n\t}\n});\n\n// Map all event binding and triggering on a StateMachine to its `states` collection.\n_.each([ 'on', 'off', 'trigger' ], function( method ) {\n\t/**\n\t * @returns {wp.media.controller.StateMachine} Returns itself to allow chaining.\n\t */\n\tStateMachine.prototype[ method ] = function() {\n\t\t// Ensure that the `states` collection exists so the `StateMachine`\n\t\t// can be used as a mixin.\n\t\tthis.states = this.states || new Backbone.Collection();\n\t\t// Forward the method to the `states` collection.\n\t\tthis.states[ method ].apply( this.states, arguments );\n\t\treturn this;\n\t};\n});\n\nmodule.exports = StateMachine;\n\n},{}],17:[function(require,module,exports){\n/**\n * wp.media.controller.State\n *\n * A state is a step in a workflow that when set will trigger the controllers\n * for the regions to be updated as specified in the frame.\n *\n * A state has an event-driven lifecycle:\n *\n *     'ready'      triggers when a state is added to a state machine's collection.\n *     'activate'   triggers when a state is activated by a state machine.\n *     'deactivate' triggers when a state is deactivated by a state machine.\n *     'reset'      is not triggered automatically. It should be invoked by the\n *                  proper controller to reset the state to its default.\n *\n * @class\n * @augments Backbone.Model\n */\nvar State = Backbone.Model.extend({\n\t/**\n\t * Constructor.\n\t *\n\t * @since 3.5.0\n\t */\n\tconstructor: function() {\n\t\tthis.on( 'activate', this._preActivate, this );\n\t\tthis.on( 'activate', this.activate, this );\n\t\tthis.on( 'activate', this._postActivate, this );\n\t\tthis.on( 'deactivate', this._deactivate, this );\n\t\tthis.on( 'deactivate', this.deactivate, this );\n\t\tthis.on( 'reset', this.reset, this );\n\t\tthis.on( 'ready', this._ready, this );\n\t\tthis.on( 'ready', this.ready, this );\n\t\t/**\n\t\t * Call parent constructor with passed arguments\n\t\t */\n\t\tBackbone.Model.apply( this, arguments );\n\t\tthis.on( 'change:menu', this._updateMenu, this );\n\t},\n\t/**\n\t * Ready event callback.\n\t *\n\t * @abstract\n\t * @since 3.5.0\n\t */\n\tready: function() {},\n\n\t/**\n\t * Activate event callback.\n\t *\n\t * @abstract\n\t * @since 3.5.0\n\t */\n\tactivate: function() {},\n\n\t/**\n\t * Deactivate event callback.\n\t *\n\t * @abstract\n\t * @since 3.5.0\n\t */\n\tdeactivate: function() {},\n\n\t/**\n\t * Reset event callback.\n\t *\n\t * @abstract\n\t * @since 3.5.0\n\t */\n\treset: function() {},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t */\n\t_ready: function() {\n\t\tthis._updateMenu();\n\t},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t*/\n\t_preActivate: function() {\n\t\tthis.active = true;\n\t},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t */\n\t_postActivate: function() {\n\t\tthis.on( 'change:menu', this._menu, this );\n\t\tthis.on( 'change:titleMode', this._title, this );\n\t\tthis.on( 'change:content', this._content, this );\n\t\tthis.on( 'change:toolbar', this._toolbar, this );\n\n\t\tthis.frame.on( 'title:render:default', this._renderTitle, this );\n\n\t\tthis._title();\n\t\tthis._menu();\n\t\tthis._toolbar();\n\t\tthis._content();\n\t\tthis._router();\n\t},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t */\n\t_deactivate: function() {\n\t\tthis.active = false;\n\n\t\tthis.frame.off( 'title:render:default', this._renderTitle, this );\n\n\t\tthis.off( 'change:menu', this._menu, this );\n\t\tthis.off( 'change:titleMode', this._title, this );\n\t\tthis.off( 'change:content', this._content, this );\n\t\tthis.off( 'change:toolbar', this._toolbar, this );\n\t},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t */\n\t_title: function() {\n\t\tthis.frame.title.render( this.get('titleMode') || 'default' );\n\t},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t */\n\t_renderTitle: function( view ) {\n\t\tview.$el.text( this.get('title') || '' );\n\t},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t */\n\t_router: function() {\n\t\tvar router = this.frame.router,\n\t\t\tmode = this.get('router'),\n\t\t\tview;\n\n\t\tthis.frame.$el.toggleClass( 'hide-router', ! mode );\n\t\tif ( ! mode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.frame.router.render( mode );\n\n\t\tview = router.get();\n\t\tif ( view && view.select ) {\n\t\t\tview.select( this.frame.content.mode() );\n\t\t}\n\t},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t */\n\t_menu: function() {\n\t\tvar menu = this.frame.menu,\n\t\t\tmode = this.get('menu'),\n\t\t\tview;\n\n\t\tthis.frame.$el.toggleClass( 'hide-menu', ! mode );\n\t\tif ( ! mode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tmenu.mode( mode );\n\n\t\tview = menu.get();\n\t\tif ( view && view.select ) {\n\t\t\tview.select( this.id );\n\t\t}\n\t},\n\n\t/**\n\t * @access private\n\t * @since 3.5.0\n\t */\n\t_updateMenu: function() {\n\t\tvar previous = this.previous('menu'),\n\t\t\tmenu = this.get('menu');\n\n\t\tif ( previous ) {\n\t\t\tthis.frame.off( 'menu:render:' + previous, this._renderMenu, this );\n\t\t}\n\n\t\tif ( menu ) {\n\t\t\tthis.frame.on( 'menu:render:' + menu, this._renderMenu, this );\n\t\t}\n\t},\n\n\t/**\n\t * Create a view in the media menu for the state.\n\t *\n\t * @access private\n\t * @since 3.5.0\n\t *\n\t * @param {media.view.Menu} view The menu view.\n\t */\n\t_renderMenu: function( view ) {\n\t\tvar menuItem = this.get('menuItem'),\n\t\t\ttitle = this.get('title'),\n\t\t\tpriority = this.get('priority');\n\n\t\tif ( ! menuItem && title ) {\n\t\t\tmenuItem = { text: title };\n\n\t\t\tif ( priority ) {\n\t\t\t\tmenuItem.priority = priority;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! menuItem ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview.set( this.id, menuItem );\n\t}\n});\n\n_.each(['toolbar','content'], function( region ) {\n\t/**\n\t * @access private\n\t */\n\tState.prototype[ '_' + region ] = function() {\n\t\tvar mode = this.get( region );\n\t\tif ( mode ) {\n\t\t\tthis.frame[ region ].render( mode );\n\t\t}\n\t};\n});\n\nmodule.exports = State;\n\n},{}],18:[function(require,module,exports){\n/**\n * wp.media.selectionSync\n *\n * Sync an attachments selection in a state with another state.\n *\n * Allows for selecting multiple images in the Insert Media workflow, and then\n * switching to the Insert Gallery workflow while preserving the attachments selection.\n *\n * @mixin\n */\nvar selectionSync = {\n\t/**\n\t * @since 3.5.0\n\t */\n\tsyncSelection: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tmanager = this.frame._selection;\n\n\t\tif ( ! this.get('syncSelection') || ! manager || ! selection ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the selection supports multiple items, validate the stored\n\t\t// attachments based on the new selection's conditions. Record\n\t\t// the attachments that are not included; we'll maintain a\n\t\t// reference to those. Other attachments are considered in flux.\n\t\tif ( selection.multiple ) {\n\t\t\tselection.reset( [], { silent: true });\n\t\t\tselection.validateAll( manager.attachments );\n\t\t\tmanager.difference = _.difference( manager.attachments.models, selection.models );\n\t\t}\n\n\t\t// Sync the selection's single item with the master.\n\t\tselection.single( manager.single );\n\t},\n\n\t/**\n\t * Record the currently active attachments, which is a combination\n\t * of the selection's attachments and the set of selected\n\t * attachments that this specific selection considered invalid.\n\t * Reset the difference and record the single attachment.\n\t *\n\t * @since 3.5.0\n\t */\n\trecordSelection: function() {\n\t\tvar selection = this.get('selection'),\n\t\t\tmanager = this.frame._selection;\n\n\t\tif ( ! this.get('syncSelection') || ! manager || ! selection ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( selection.multiple ) {\n\t\t\tmanager.attachments.reset( selection.toArray().concat( manager.difference ) );\n\t\t\tmanager.difference = [];\n\t\t} else {\n\t\t\tmanager.attachments.add( selection.toArray() );\n\t\t}\n\n\t\tmanager.single = selection._single;\n\t}\n};\n\nmodule.exports = selectionSync;\n\n},{}],19:[function(require,module,exports){\nvar media = wp.media,\n\t$ = jQuery,\n\tl10n;\n\nmedia.isTouchDevice = ( 'ontouchend' in document );\n\n// Link any localized strings.\nl10n = media.view.l10n = window._wpMediaViewsL10n || {};\n\n// Link any settings.\nmedia.view.settings = l10n.settings || {};\ndelete l10n.settings;\n\n// Copy the `post` setting over to the model settings.\nmedia.model.settings.post = media.view.settings.post;\n\n// Check if the browser supports CSS 3.0 transitions\n$.support.transition = (function(){\n\tvar style = document.documentElement.style,\n\t\ttransitions = {\n\t\t\tWebkitTransition: 'webkitTransitionEnd',\n\t\t\tMozTransition:    'transitionend',\n\t\t\tOTransition:      'oTransitionEnd otransitionend',\n\t\t\ttransition:       'transitionend'\n\t\t}, transition;\n\n\ttransition = _.find( _.keys( transitions ), function( transition ) {\n\t\treturn ! _.isUndefined( style[ transition ] );\n\t});\n\n\treturn transition && {\n\t\tend: transitions[ transition ]\n\t};\n}());\n\n/**\n * A shared event bus used to provide events into\n * the media workflows that 3rd-party devs can use to hook\n * in.\n */\nmedia.events = _.extend( {}, Backbone.Events );\n\n/**\n * Makes it easier to bind events using transitions.\n *\n * @param {string} selector\n * @param {Number} sensitivity\n * @returns {Promise}\n */\nmedia.transition = function( selector, sensitivity ) {\n\tvar deferred = $.Deferred();\n\n\tsensitivity = sensitivity || 2000;\n\n\tif ( $.support.transition ) {\n\t\tif ( ! (selector instanceof $) ) {\n\t\t\tselector = $( selector );\n\t\t}\n\n\t\t// Resolve the deferred when the first element finishes animating.\n\t\tselector.first().one( $.support.transition.end, deferred.resolve );\n\n\t\t// Just in case the event doesn't trigger, fire a callback.\n\t\t_.delay( deferred.resolve, sensitivity );\n\n\t// Otherwise, execute on the spot.\n\t} else {\n\t\tdeferred.resolve();\n\t}\n\n\treturn deferred.promise();\n};\n\nmedia.controller.Region = require( './controllers/region.js' );\nmedia.controller.StateMachine = require( './controllers/state-machine.js' );\nmedia.controller.State = require( './controllers/state.js' );\n\nmedia.selectionSync = require( './utils/selection-sync.js' );\nmedia.controller.Library = require( './controllers/library.js' );\nmedia.controller.ImageDetails = require( './controllers/image-details.js' );\nmedia.controller.GalleryEdit = require( './controllers/gallery-edit.js' );\nmedia.controller.GalleryAdd = require( './controllers/gallery-add.js' );\nmedia.controller.CollectionEdit = require( './controllers/collection-edit.js' );\nmedia.controller.CollectionAdd = require( './controllers/collection-add.js' );\nmedia.controller.FeaturedImage = require( './controllers/featured-image.js' );\nmedia.controller.ReplaceImage = require( './controllers/replace-image.js' );\nmedia.controller.EditImage = require( './controllers/edit-image.js' );\nmedia.controller.MediaLibrary = require( './controllers/media-library.js' );\nmedia.controller.Embed = require( './controllers/embed.js' );\nmedia.controller.Cropper = require( './controllers/cropper.js' );\nmedia.controller.CustomizeImageCropper = require( './controllers/customize-image-cropper.js' );\nmedia.controller.SiteIconCropper = require( './controllers/site-icon-cropper.js' );\n\nmedia.View = require( './views/view.js' );\nmedia.view.Frame = require( './views/frame.js' );\nmedia.view.MediaFrame = require( './views/media-frame.js' );\nmedia.view.MediaFrame.Select = require( './views/frame/select.js' );\nmedia.view.MediaFrame.Post = require( './views/frame/post.js' );\nmedia.view.MediaFrame.ImageDetails = require( './views/frame/image-details.js' );\nmedia.view.Modal = require( './views/modal.js' );\nmedia.view.FocusManager = require( './views/focus-manager.js' );\nmedia.view.UploaderWindow = require( './views/uploader/window.js' );\nmedia.view.EditorUploader = require( './views/uploader/editor.js' );\nmedia.view.UploaderInline = require( './views/uploader/inline.js' );\nmedia.view.UploaderStatus = require( './views/uploader/status.js' );\nmedia.view.UploaderStatusError = require( './views/uploader/status-error.js' );\nmedia.view.Toolbar = require( './views/toolbar.js' );\nmedia.view.Toolbar.Select = require( './views/toolbar/select.js' );\nmedia.view.Toolbar.Embed = require( './views/toolbar/embed.js' );\nmedia.view.Button = require( './views/button.js' );\nmedia.view.ButtonGroup = require( './views/button-group.js' );\nmedia.view.PriorityList = require( './views/priority-list.js' );\nmedia.view.MenuItem = require( './views/menu-item.js' );\nmedia.view.Menu = require( './views/menu.js' );\nmedia.view.RouterItem = require( './views/router-item.js' );\nmedia.view.Router = require( './views/router.js' );\nmedia.view.Sidebar = require( './views/sidebar.js' );\nmedia.view.Attachment = require( './views/attachment.js' );\nmedia.view.Attachment.Library = require( './views/attachment/library.js' );\nmedia.view.Attachment.EditLibrary = require( './views/attachment/edit-library.js' );\nmedia.view.Attachments = require( './views/attachments.js' );\nmedia.view.Search = require( './views/search.js' );\nmedia.view.AttachmentFilters = require( './views/attachment-filters.js' );\nmedia.view.DateFilter = require( './views/attachment-filters/date.js' );\nmedia.view.AttachmentFilters.Uploaded = require( './views/attachment-filters/uploaded.js' );\nmedia.view.AttachmentFilters.All = require( './views/attachment-filters/all.js' );\nmedia.view.AttachmentsBrowser = require( './views/attachments/browser.js' );\nmedia.view.Selection = require( './views/selection.js' );\nmedia.view.Attachment.Selection = require( './views/attachment/selection.js' );\nmedia.view.Attachments.Selection = require( './views/attachments/selection.js' );\nmedia.view.Attachment.EditSelection = require( './views/attachment/edit-selection.js' );\nmedia.view.Settings = require( './views/settings.js' );\nmedia.view.Settings.AttachmentDisplay = require( './views/settings/attachment-display.js' );\nmedia.view.Settings.Gallery = require( './views/settings/gallery.js' );\nmedia.view.Settings.Playlist = require( './views/settings/playlist.js' );\nmedia.view.Attachment.Details = require( './views/attachment/details.js' );\nmedia.view.AttachmentCompat = require( './views/attachment-compat.js' );\nmedia.view.Iframe = require( './views/iframe.js' );\nmedia.view.Embed = require( './views/embed.js' );\nmedia.view.Label = require( './views/label.js' );\nmedia.view.EmbedUrl = require( './views/embed/url.js' );\nmedia.view.EmbedLink = require( './views/embed/link.js' );\nmedia.view.EmbedImage = require( './views/embed/image.js' );\nmedia.view.ImageDetails = require( './views/image-details.js' );\nmedia.view.Cropper = require( './views/cropper.js' );\nmedia.view.SiteIconCropper = require( './views/site-icon-cropper.js' );\nmedia.view.SiteIconPreview = require( './views/site-icon-preview.js' );\nmedia.view.EditImage = require( './views/edit-image.js' );\nmedia.view.Spinner = require( './views/spinner.js' );\n\n},{\"./controllers/collection-add.js\":1,\"./controllers/collection-edit.js\":2,\"./controllers/cropper.js\":3,\"./controllers/customize-image-cropper.js\":4,\"./controllers/edit-image.js\":5,\"./controllers/embed.js\":6,\"./controllers/featured-image.js\":7,\"./controllers/gallery-add.js\":8,\"./controllers/gallery-edit.js\":9,\"./controllers/image-details.js\":10,\"./controllers/library.js\":11,\"./controllers/media-library.js\":12,\"./controllers/region.js\":13,\"./controllers/replace-image.js\":14,\"./controllers/site-icon-cropper.js\":15,\"./controllers/state-machine.js\":16,\"./controllers/state.js\":17,\"./utils/selection-sync.js\":18,\"./views/attachment-compat.js\":20,\"./views/attachment-filters.js\":21,\"./views/attachment-filters/all.js\":22,\"./views/attachment-filters/date.js\":23,\"./views/attachment-filters/uploaded.js\":24,\"./views/attachment.js\":25,\"./views/attachment/details.js\":26,\"./views/attachment/edit-library.js\":27,\"./views/attachment/edit-selection.js\":28,\"./views/attachment/library.js\":29,\"./views/attachment/selection.js\":30,\"./views/attachments.js\":31,\"./views/attachments/browser.js\":32,\"./views/attachments/selection.js\":33,\"./views/button-group.js\":34,\"./views/button.js\":35,\"./views/cropper.js\":36,\"./views/edit-image.js\":37,\"./views/embed.js\":38,\"./views/embed/image.js\":39,\"./views/embed/link.js\":40,\"./views/embed/url.js\":41,\"./views/focus-manager.js\":42,\"./views/frame.js\":43,\"./views/frame/image-details.js\":44,\"./views/frame/post.js\":45,\"./views/frame/select.js\":46,\"./views/iframe.js\":47,\"./views/image-details.js\":48,\"./views/label.js\":49,\"./views/media-frame.js\":50,\"./views/menu-item.js\":51,\"./views/menu.js\":52,\"./views/modal.js\":53,\"./views/priority-list.js\":54,\"./views/router-item.js\":55,\"./views/router.js\":56,\"./views/search.js\":57,\"./views/selection.js\":58,\"./views/settings.js\":59,\"./views/settings/attachment-display.js\":60,\"./views/settings/gallery.js\":61,\"./views/settings/playlist.js\":62,\"./views/sidebar.js\":63,\"./views/site-icon-cropper.js\":64,\"./views/site-icon-preview.js\":65,\"./views/spinner.js\":66,\"./views/toolbar.js\":67,\"./views/toolbar/embed.js\":68,\"./views/toolbar/select.js\":69,\"./views/uploader/editor.js\":70,\"./views/uploader/inline.js\":71,\"./views/uploader/status-error.js\":72,\"./views/uploader/status.js\":73,\"./views/uploader/window.js\":74,\"./views/view.js\":75}],20:[function(require,module,exports){\n/**\n * wp.media.view.AttachmentCompat\n *\n * A view to display fields added via the `attachment_fields_to_edit` filter.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\tAttachmentCompat;\n\nAttachmentCompat = View.extend({\n\ttagName:   'form',\n\tclassName: 'compat-item',\n\n\tevents: {\n\t\t'submit':          'preventDefault',\n\t\t'change input':    'save',\n\t\t'change select':   'save',\n\t\t'change textarea': 'save'\n\t},\n\n\tinitialize: function() {\n\t\tthis.listenTo( this.model, 'change:compat', this.render );\n\t},\n\t/**\n\t * @returns {wp.media.view.AttachmentCompat} Returns itself to allow chaining\n\t */\n\tdispose: function() {\n\t\tif ( this.$(':focus').length ) {\n\t\t\tthis.save();\n\t\t}\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\treturn View.prototype.dispose.apply( this, arguments );\n\t},\n\t/**\n\t * @returns {wp.media.view.AttachmentCompat} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tvar compat = this.model.get('compat');\n\t\tif ( ! compat || ! compat.item ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.views.detach();\n\t\tthis.$el.html( compat.item );\n\t\tthis.views.render();\n\t\treturn this;\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tpreventDefault: function( event ) {\n\t\tevent.preventDefault();\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tsave: function( event ) {\n\t\tvar data = {};\n\n\t\tif ( event ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\t_.each( this.$el.serializeArray(), function( pair ) {\n\t\t\tdata[ pair.name ] = pair.value;\n\t\t});\n\n\t\tthis.controller.trigger( 'attachment:compat:waiting', ['waiting'] );\n\t\tthis.model.saveCompat( data ).always( _.bind( this.postSave, this ) );\n\t},\n\n\tpostSave: function() {\n\t\tthis.controller.trigger( 'attachment:compat:ready', ['ready'] );\n\t}\n});\n\nmodule.exports = AttachmentCompat;\n\n},{}],21:[function(require,module,exports){\n/**\n * wp.media.view.AttachmentFilters\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar $ = jQuery,\n\tAttachmentFilters;\n\nAttachmentFilters = wp.media.View.extend({\n\ttagName:   'select',\n\tclassName: 'attachment-filters',\n\tid:        'media-attachment-filters',\n\n\tevents: {\n\t\tchange: 'change'\n\t},\n\n\tkeys: [],\n\n\tinitialize: function() {\n\t\tthis.createFilters();\n\t\t_.extend( this.filters, this.options.filters );\n\n\t\t// Build `<option>` elements.\n\t\tthis.$el.html( _.chain( this.filters ).map( function( filter, value ) {\n\t\t\treturn {\n\t\t\t\tel: $( '<option></option>' ).val( value ).html( filter.text )[0],\n\t\t\t\tpriority: filter.priority || 50\n\t\t\t};\n\t\t}, this ).sortBy('priority').pluck('el').value() );\n\n\t\tthis.listenTo( this.model, 'change', this.select );\n\t\tthis.select();\n\t},\n\n\t/**\n\t * @abstract\n\t */\n\tcreateFilters: function() {\n\t\tthis.filters = {};\n\t},\n\n\t/**\n\t * When the selected filter changes, update the Attachment Query properties to match.\n\t */\n\tchange: function() {\n\t\tvar filter = this.filters[ this.el.value ];\n\t\tif ( filter ) {\n\t\t\tthis.model.set( filter.props );\n\t\t}\n\t},\n\n\tselect: function() {\n\t\tvar model = this.model,\n\t\t\tvalue = 'all',\n\t\t\tprops = model.toJSON();\n\n\t\t_.find( this.filters, function( filter, id ) {\n\t\t\tvar equal = _.all( filter.props, function( prop, key ) {\n\t\t\t\treturn prop === ( _.isUndefined( props[ key ] ) ? null : props[ key ] );\n\t\t\t});\n\n\t\t\tif ( equal ) {\n\t\t\t\treturn value = id;\n\t\t\t}\n\t\t});\n\n\t\tthis.$el.val( value );\n\t}\n});\n\nmodule.exports = AttachmentFilters;\n\n},{}],22:[function(require,module,exports){\n/**\n * wp.media.view.AttachmentFilters.All\n *\n * @class\n * @augments wp.media.view.AttachmentFilters\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar l10n = wp.media.view.l10n,\n\tAll;\n\nAll = wp.media.view.AttachmentFilters.extend({\n\tcreateFilters: function() {\n\t\tvar filters = {};\n\n\t\t_.each( wp.media.view.settings.mimeTypes || {}, function( text, key ) {\n\t\t\tfilters[ key ] = {\n\t\t\t\ttext: text,\n\t\t\t\tprops: {\n\t\t\t\t\tstatus:  null,\n\t\t\t\t\ttype:    key,\n\t\t\t\t\tuploadedTo: null,\n\t\t\t\t\torderby: 'date',\n\t\t\t\t\torder:   'DESC'\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\n\t\tfilters.all = {\n\t\t\ttext:  l10n.allMediaItems,\n\t\t\tprops: {\n\t\t\t\tstatus:  null,\n\t\t\t\ttype:    null,\n\t\t\t\tuploadedTo: null,\n\t\t\t\torderby: 'date',\n\t\t\t\torder:   'DESC'\n\t\t\t},\n\t\t\tpriority: 10\n\t\t};\n\n\t\tif ( wp.media.view.settings.post.id ) {\n\t\t\tfilters.uploaded = {\n\t\t\t\ttext:  l10n.uploadedToThisPost,\n\t\t\t\tprops: {\n\t\t\t\t\tstatus:  null,\n\t\t\t\t\ttype:    null,\n\t\t\t\t\tuploadedTo: wp.media.view.settings.post.id,\n\t\t\t\t\torderby: 'menuOrder',\n\t\t\t\t\torder:   'ASC'\n\t\t\t\t},\n\t\t\t\tpriority: 20\n\t\t\t};\n\t\t}\n\n\t\tfilters.unattached = {\n\t\t\ttext:  l10n.unattached,\n\t\t\tprops: {\n\t\t\t\tstatus:     null,\n\t\t\t\tuploadedTo: 0,\n\t\t\t\ttype:       null,\n\t\t\t\torderby:    'menuOrder',\n\t\t\t\torder:      'ASC'\n\t\t\t},\n\t\t\tpriority: 50\n\t\t};\n\n\t\tif ( wp.media.view.settings.mediaTrash &&\n\t\t\tthis.controller.isModeActive( 'grid' ) ) {\n\n\t\t\tfilters.trash = {\n\t\t\t\ttext:  l10n.trash,\n\t\t\t\tprops: {\n\t\t\t\t\tuploadedTo: null,\n\t\t\t\t\tstatus:     'trash',\n\t\t\t\t\ttype:       null,\n\t\t\t\t\torderby:    'date',\n\t\t\t\t\torder:      'DESC'\n\t\t\t\t},\n\t\t\t\tpriority: 50\n\t\t\t};\n\t\t}\n\n\t\tthis.filters = filters;\n\t}\n});\n\nmodule.exports = All;\n\n},{}],23:[function(require,module,exports){\n/**\n * A filter dropdown for month/dates.\n *\n * @class\n * @augments wp.media.view.AttachmentFilters\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar l10n = wp.media.view.l10n,\n\tDateFilter;\n\nDateFilter = wp.media.view.AttachmentFilters.extend({\n\tid: 'media-attachment-date-filters',\n\n\tcreateFilters: function() {\n\t\tvar filters = {};\n\t\t_.each( wp.media.view.settings.months || {}, function( value, index ) {\n\t\t\tfilters[ index ] = {\n\t\t\t\ttext: value.text,\n\t\t\t\tprops: {\n\t\t\t\t\tyear: value.year,\n\t\t\t\t\tmonthnum: value.month\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t\tfilters.all = {\n\t\t\ttext:  l10n.allDates,\n\t\t\tprops: {\n\t\t\t\tmonthnum: false,\n\t\t\t\tyear:  false\n\t\t\t},\n\t\t\tpriority: 10\n\t\t};\n\t\tthis.filters = filters;\n\t}\n});\n\nmodule.exports = DateFilter;\n\n},{}],24:[function(require,module,exports){\n/**\n * wp.media.view.AttachmentFilters.Uploaded\n *\n * @class\n * @augments wp.media.view.AttachmentFilters\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar l10n = wp.media.view.l10n,\n\tUploaded;\n\nUploaded = wp.media.view.AttachmentFilters.extend({\n\tcreateFilters: function() {\n\t\tvar type = this.model.get('type'),\n\t\t\ttypes = wp.media.view.settings.mimeTypes,\n\t\t\ttext;\n\n\t\tif ( types && type ) {\n\t\t\ttext = types[ type ];\n\t\t}\n\n\t\tthis.filters = {\n\t\t\tall: {\n\t\t\t\ttext:  text || l10n.allMediaItems,\n\t\t\t\tprops: {\n\t\t\t\t\tuploadedTo: null,\n\t\t\t\t\torderby: 'date',\n\t\t\t\t\torder:   'DESC'\n\t\t\t\t},\n\t\t\t\tpriority: 10\n\t\t\t},\n\n\t\t\tuploaded: {\n\t\t\t\ttext:  l10n.uploadedToThisPost,\n\t\t\t\tprops: {\n\t\t\t\t\tuploadedTo: wp.media.view.settings.post.id,\n\t\t\t\t\torderby: 'menuOrder',\n\t\t\t\t\torder:   'ASC'\n\t\t\t\t},\n\t\t\t\tpriority: 20\n\t\t\t},\n\n\t\t\tunattached: {\n\t\t\t\ttext:  l10n.unattached,\n\t\t\t\tprops: {\n\t\t\t\t\tuploadedTo: 0,\n\t\t\t\t\torderby: 'menuOrder',\n\t\t\t\t\torder:   'ASC'\n\t\t\t\t},\n\t\t\t\tpriority: 50\n\t\t\t}\n\t\t};\n\t}\n});\n\nmodule.exports = Uploaded;\n\n},{}],25:[function(require,module,exports){\n/**\n * wp.media.view.Attachment\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\t$ = jQuery,\n\tAttachment;\n\nAttachment = View.extend({\n\ttagName:   'li',\n\tclassName: 'attachment',\n\ttemplate:  wp.template('attachment'),\n\n\tattributes: function() {\n\t\treturn {\n\t\t\t'tabIndex':     0,\n\t\t\t'role':         'checkbox',\n\t\t\t'aria-label':   this.model.get( 'title' ),\n\t\t\t'aria-checked': false,\n\t\t\t'data-id':      this.model.get( 'id' )\n\t\t};\n\t},\n\n\tevents: {\n\t\t'click .js--select-attachment':   'toggleSelectionHandler',\n\t\t'change [data-setting]':          'updateSetting',\n\t\t'change [data-setting] input':    'updateSetting',\n\t\t'change [data-setting] select':   'updateSetting',\n\t\t'change [data-setting] textarea': 'updateSetting',\n\t\t'click .attachment-close':        'removeFromLibrary',\n\t\t'click .check':                   'checkClickHandler',\n\t\t'keydown':                        'toggleSelectionHandler'\n\t},\n\n\tbuttons: {},\n\n\tinitialize: function() {\n\t\tvar selection = this.options.selection,\n\t\t\toptions = _.defaults( this.options, {\n\t\t\t\trerenderOnModelChange: true\n\t\t\t} );\n\n\t\tif ( options.rerenderOnModelChange ) {\n\t\t\tthis.listenTo( this.model, 'change', this.render );\n\t\t} else {\n\t\t\tthis.listenTo( this.model, 'change:percent', this.progress );\n\t\t}\n\t\tthis.listenTo( this.model, 'change:title', this._syncTitle );\n\t\tthis.listenTo( this.model, 'change:caption', this._syncCaption );\n\t\tthis.listenTo( this.model, 'change:artist', this._syncArtist );\n\t\tthis.listenTo( this.model, 'change:album', this._syncAlbum );\n\n\t\t// Update the selection.\n\t\tthis.listenTo( this.model, 'add', this.select );\n\t\tthis.listenTo( this.model, 'remove', this.deselect );\n\t\tif ( selection ) {\n\t\t\tselection.on( 'reset', this.updateSelect, this );\n\t\t\t// Update the model's details view.\n\t\t\tthis.listenTo( this.model, 'selection:single selection:unsingle', this.details );\n\t\t\tthis.details( this.model, this.controller.state().get('selection') );\n\t\t}\n\n\t\tthis.listenTo( this.controller, 'attachment:compat:waiting attachment:compat:ready', this.updateSave );\n\t},\n\t/**\n\t * @returns {wp.media.view.Attachment} Returns itself to allow chaining\n\t */\n\tdispose: function() {\n\t\tvar selection = this.options.selection;\n\n\t\t// Make sure all settings are saved before removing the view.\n\t\tthis.updateAll();\n\n\t\tif ( selection ) {\n\t\t\tselection.off( null, null, this );\n\t\t}\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\tView.prototype.dispose.apply( this, arguments );\n\t\treturn this;\n\t},\n\t/**\n\t * @returns {wp.media.view.Attachment} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tvar options = _.defaults( this.model.toJSON(), {\n\t\t\t\torientation:   'landscape',\n\t\t\t\tuploading:     false,\n\t\t\t\ttype:          '',\n\t\t\t\tsubtype:       '',\n\t\t\t\ticon:          '',\n\t\t\t\tfilename:      '',\n\t\t\t\tcaption:       '',\n\t\t\t\ttitle:         '',\n\t\t\t\tdateFormatted: '',\n\t\t\t\twidth:         '',\n\t\t\t\theight:        '',\n\t\t\t\tcompat:        false,\n\t\t\t\talt:           '',\n\t\t\t\tdescription:   ''\n\t\t\t}, this.options );\n\n\t\toptions.buttons  = this.buttons;\n\t\toptions.describe = this.controller.state().get('describe');\n\n\t\tif ( 'image' === options.type ) {\n\t\t\toptions.size = this.imageSize();\n\t\t}\n\n\t\toptions.can = {};\n\t\tif ( options.nonces ) {\n\t\t\toptions.can.remove = !! options.nonces['delete'];\n\t\t\toptions.can.save = !! options.nonces.update;\n\t\t}\n\n\t\tif ( this.controller.state().get('allowLocalEdits') ) {\n\t\t\toptions.allowLocalEdits = true;\n\t\t}\n\n\t\tif ( options.uploading && ! options.percent ) {\n\t\t\toptions.percent = 0;\n\t\t}\n\n\t\tthis.views.detach();\n\t\tthis.$el.html( this.template( options ) );\n\n\t\tthis.$el.toggleClass( 'uploading', options.uploading );\n\n\t\tif ( options.uploading ) {\n\t\t\tthis.$bar = this.$('.media-progress-bar div');\n\t\t} else {\n\t\t\tdelete this.$bar;\n\t\t}\n\n\t\t// Check if the model is selected.\n\t\tthis.updateSelect();\n\n\t\t// Update the save status.\n\t\tthis.updateSave();\n\n\t\tthis.views.render();\n\n\t\treturn this;\n\t},\n\n\tprogress: function() {\n\t\tif ( this.$bar && this.$bar.length ) {\n\t\t\tthis.$bar.width( this.model.get('percent') + '%' );\n\t\t}\n\t},\n\n\t/**\n\t * @param {Object} event\n\t */\n\ttoggleSelectionHandler: function( event ) {\n\t\tvar method;\n\n\t\t// Don't do anything inside inputs and on the attachment check and remove buttons.\n\t\tif ( 'INPUT' === event.target.nodeName || 'BUTTON' === event.target.nodeName ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Catch arrow events\n\t\tif ( 37 === event.keyCode || 38 === event.keyCode || 39 === event.keyCode || 40 === event.keyCode ) {\n\t\t\tthis.controller.trigger( 'attachment:keydown:arrow', event );\n\t\t\treturn;\n\t\t}\n\n\t\t// Catch enter and space events\n\t\tif ( 'keydown' === event.type && 13 !== event.keyCode && 32 !== event.keyCode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\t// In the grid view, bubble up an edit:attachment event to the controller.\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\tif ( this.controller.isModeActive( 'edit' ) ) {\n\t\t\t\t// Pass the current target to restore focus when closing\n\t\t\t\tthis.controller.trigger( 'edit:attachment', this.model, event.currentTarget );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.controller.isModeActive( 'select' ) ) {\n\t\t\t\tmethod = 'toggle';\n\t\t\t}\n\t\t}\n\n\t\tif ( event.shiftKey ) {\n\t\t\tmethod = 'between';\n\t\t} else if ( event.ctrlKey || event.metaKey ) {\n\t\t\tmethod = 'toggle';\n\t\t}\n\n\t\tthis.toggleSelection({\n\t\t\tmethod: method\n\t\t});\n\n\t\tthis.controller.trigger( 'selection:toggle' );\n\t},\n\t/**\n\t * @param {Object} options\n\t */\n\ttoggleSelection: function( options ) {\n\t\tvar collection = this.collection,\n\t\t\tselection = this.options.selection,\n\t\t\tmodel = this.model,\n\t\t\tmethod = options && options.method,\n\t\t\tsingle, models, singleIndex, modelIndex;\n\n\t\tif ( ! selection ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsingle = selection.single();\n\t\tmethod = _.isUndefined( method ) ? selection.multiple : method;\n\n\t\t// If the `method` is set to `between`, select all models that\n\t\t// exist between the current and the selected model.\n\t\tif ( 'between' === method && single && selection.multiple ) {\n\t\t\t// If the models are the same, short-circuit.\n\t\t\tif ( single === model ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsingleIndex = collection.indexOf( single );\n\t\t\tmodelIndex  = collection.indexOf( this.model );\n\n\t\t\tif ( singleIndex < modelIndex ) {\n\t\t\t\tmodels = collection.models.slice( singleIndex, modelIndex + 1 );\n\t\t\t} else {\n\t\t\t\tmodels = collection.models.slice( modelIndex, singleIndex + 1 );\n\t\t\t}\n\n\t\t\tselection.add( models );\n\t\t\tselection.single( model );\n\t\t\treturn;\n\n\t\t// If the `method` is set to `toggle`, just flip the selection\n\t\t// status, regardless of whether the model is the single model.\n\t\t} else if ( 'toggle' === method ) {\n\t\t\tselection[ this.selected() ? 'remove' : 'add' ]( model );\n\t\t\tselection.single( model );\n\t\t\treturn;\n\t\t} else if ( 'add' === method ) {\n\t\t\tselection.add( model );\n\t\t\tselection.single( model );\n\t\t\treturn;\n\t\t}\n\n\t\t// Fixes bug that loses focus when selecting a featured image\n\t\tif ( ! method ) {\n\t\t\tmethod = 'add';\n\t\t}\n\n\t\tif ( method !== 'add' ) {\n\t\t\tmethod = 'reset';\n\t\t}\n\n\t\tif ( this.selected() ) {\n\t\t\t// If the model is the single model, remove it.\n\t\t\t// If it is not the same as the single model,\n\t\t\t// it now becomes the single model.\n\t\t\tselection[ single === model ? 'remove' : 'single' ]( model );\n\t\t} else {\n\t\t\t// If the model is not selected, run the `method` on the\n\t\t\t// selection. By default, we `reset` the selection, but the\n\t\t\t// `method` can be set to `add` the model to the selection.\n\t\t\tselection[ method ]( model );\n\t\t\tselection.single( model );\n\t\t}\n\t},\n\n\tupdateSelect: function() {\n\t\tthis[ this.selected() ? 'select' : 'deselect' ]();\n\t},\n\t/**\n\t * @returns {unresolved|Boolean}\n\t */\n\tselected: function() {\n\t\tvar selection = this.options.selection;\n\t\tif ( selection ) {\n\t\t\treturn !! selection.get( this.model.cid );\n\t\t}\n\t},\n\t/**\n\t * @param {Backbone.Model} model\n\t * @param {Backbone.Collection} collection\n\t */\n\tselect: function( model, collection ) {\n\t\tvar selection = this.options.selection,\n\t\t\tcontroller = this.controller;\n\n\t\t// Check if a selection exists and if it's the collection provided.\n\t\t// If they're not the same collection, bail; we're in another\n\t\t// selection's event loop.\n\t\tif ( ! selection || ( collection && collection !== selection ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Bail if the model is already selected.\n\t\tif ( this.$el.hasClass( 'selected' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add 'selected' class to model, set aria-checked to true.\n\t\tthis.$el.addClass( 'selected' ).attr( 'aria-checked', true );\n\t\t//  Make the checkbox tabable, except in media grid (bulk select mode).\n\t\tif ( ! ( controller.isModeActive( 'grid' ) && controller.isModeActive( 'select' ) ) ) {\n\t\t\tthis.$( '.check' ).attr( 'tabindex', '0' );\n\t\t}\n\t},\n\t/**\n\t * @param {Backbone.Model} model\n\t * @param {Backbone.Collection} collection\n\t */\n\tdeselect: function( model, collection ) {\n\t\tvar selection = this.options.selection;\n\n\t\t// Check if a selection exists and if it's the collection provided.\n\t\t// If they're not the same collection, bail; we're in another\n\t\t// selection's event loop.\n\t\tif ( ! selection || ( collection && collection !== selection ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.$el.removeClass( 'selected' ).attr( 'aria-checked', false )\n\t\t\t.find( '.check' ).attr( 'tabindex', '-1' );\n\t},\n\t/**\n\t * @param {Backbone.Model} model\n\t * @param {Backbone.Collection} collection\n\t */\n\tdetails: function( model, collection ) {\n\t\tvar selection = this.options.selection,\n\t\t\tdetails;\n\n\t\tif ( selection !== collection ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdetails = selection.single();\n\t\tthis.$el.toggleClass( 'details', details === this.model );\n\t},\n\t/**\n\t * @param {string} size\n\t * @returns {Object}\n\t */\n\timageSize: function( size ) {\n\t\tvar sizes = this.model.get('sizes'), matched = false;\n\n\t\tsize = size || 'medium';\n\n\t\t// Use the provided image size if possible.\n\t\tif ( sizes ) {\n\t\t\tif ( sizes[ size ] ) {\n\t\t\t\tmatched = sizes[ size ];\n\t\t\t} else if ( sizes.large ) {\n\t\t\t\tmatched = sizes.large;\n\t\t\t} else if ( sizes.thumbnail ) {\n\t\t\t\tmatched = sizes.thumbnail;\n\t\t\t} else if ( sizes.full ) {\n\t\t\t\tmatched = sizes.full;\n\t\t\t}\n\n\t\t\tif ( matched ) {\n\t\t\t\treturn _.clone( matched );\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\turl:         this.model.get('url'),\n\t\t\twidth:       this.model.get('width'),\n\t\t\theight:      this.model.get('height'),\n\t\t\torientation: this.model.get('orientation')\n\t\t};\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tupdateSetting: function( event ) {\n\t\tvar $setting = $( event.target ).closest('[data-setting]'),\n\t\t\tsetting, value;\n\n\t\tif ( ! $setting.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetting = $setting.data('setting');\n\t\tvalue   = event.target.value;\n\n\t\tif ( this.model.get( setting ) !== value ) {\n\t\t\tthis.save( setting, value );\n\t\t}\n\t},\n\n\t/**\n\t * Pass all the arguments to the model's save method.\n\t *\n\t * Records the aggregate status of all save requests and updates the\n\t * view's classes accordingly.\n\t */\n\tsave: function() {\n\t\tvar view = this,\n\t\t\tsave = this._save = this._save || { status: 'ready' },\n\t\t\trequest = this.model.save.apply( this.model, arguments ),\n\t\t\trequests = save.requests ? $.when( request, save.requests ) : request;\n\n\t\t// If we're waiting to remove 'Saved.', stop.\n\t\tif ( save.savedTimer ) {\n\t\t\tclearTimeout( save.savedTimer );\n\t\t}\n\n\t\tthis.updateSave('waiting');\n\t\tsave.requests = requests;\n\t\trequests.always( function() {\n\t\t\t// If we've performed another request since this one, bail.\n\t\t\tif ( save.requests !== requests ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tview.updateSave( requests.state() === 'resolved' ? 'complete' : 'error' );\n\t\t\tsave.savedTimer = setTimeout( function() {\n\t\t\t\tview.updateSave('ready');\n\t\t\t\tdelete save.savedTimer;\n\t\t\t}, 2000 );\n\t\t});\n\t},\n\t/**\n\t * @param {string} status\n\t * @returns {wp.media.view.Attachment} Returns itself to allow chaining\n\t */\n\tupdateSave: function( status ) {\n\t\tvar save = this._save = this._save || { status: 'ready' };\n\n\t\tif ( status && status !== save.status ) {\n\t\t\tthis.$el.removeClass( 'save-' + save.status );\n\t\t\tsave.status = status;\n\t\t}\n\n\t\tthis.$el.addClass( 'save-' + save.status );\n\t\treturn this;\n\t},\n\n\tupdateAll: function() {\n\t\tvar $settings = this.$('[data-setting]'),\n\t\t\tmodel = this.model,\n\t\t\tchanged;\n\n\t\tchanged = _.chain( $settings ).map( function( el ) {\n\t\t\tvar $input = $('input, textarea, select, [value]', el ),\n\t\t\t\tsetting, value;\n\n\t\t\tif ( ! $input.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetting = $(el).data('setting');\n\t\t\tvalue = $input.val();\n\n\t\t\t// Record the value if it changed.\n\t\t\tif ( model.get( setting ) !== value ) {\n\t\t\t\treturn [ setting, value ];\n\t\t\t}\n\t\t}).compact().object().value();\n\n\t\tif ( ! _.isEmpty( changed ) ) {\n\t\t\tmodel.save( changed );\n\t\t}\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tremoveFromLibrary: function( event ) {\n\t\t// Catch enter and space events\n\t\tif ( 'keydown' === event.type && 13 !== event.keyCode && 32 !== event.keyCode ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Stop propagation so the model isn't selected.\n\t\tevent.stopPropagation();\n\n\t\tthis.collection.remove( this.model );\n\t},\n\n\t/**\n\t * Add the model if it isn't in the selection, if it is in the selection,\n\t * remove it.\n\t *\n\t * @param  {[type]} event [description]\n\t * @return {[type]}       [description]\n\t */\n\tcheckClickHandler: function ( event ) {\n\t\tvar selection = this.options.selection;\n\t\tif ( ! selection ) {\n\t\t\treturn;\n\t\t}\n\t\tevent.stopPropagation();\n\t\tif ( selection.where( { id: this.model.get( 'id' ) } ).length ) {\n\t\t\tselection.remove( this.model );\n\t\t\t// Move focus back to the attachment tile (from the check).\n\t\t\tthis.$el.focus();\n\t\t} else {\n\t\t\tselection.add( this.model );\n\t\t}\n\t}\n});\n\n// Ensure settings remain in sync between attachment views.\n_.each({\n\tcaption: '_syncCaption',\n\ttitle:   '_syncTitle',\n\tartist:  '_syncArtist',\n\talbum:   '_syncAlbum'\n}, function( method, setting ) {\n\t/**\n\t * @param {Backbone.Model} model\n\t * @param {string} value\n\t * @returns {wp.media.view.Attachment} Returns itself to allow chaining\n\t */\n\tAttachment.prototype[ method ] = function( model, value ) {\n\t\tvar $setting = this.$('[data-setting=\"' + setting + '\"]');\n\n\t\tif ( ! $setting.length ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// If the updated value is in sync with the value in the DOM, there\n\t\t// is no need to re-render. If we're currently editing the value,\n\t\t// it will automatically be in sync, suppressing the re-render for\n\t\t// the view we're editing, while updating any others.\n\t\tif ( value === $setting.find('input, textarea, select, [value]').val() ) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn this.render();\n\t};\n});\n\nmodule.exports = Attachment;\n\n},{}],26:[function(require,module,exports){\n/**\n * wp.media.view.Attachment.Details\n *\n * @class\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Attachment = wp.media.view.Attachment,\n\tl10n = wp.media.view.l10n,\n\tDetails;\n\nDetails = Attachment.extend({\n\ttagName:   'div',\n\tclassName: 'attachment-details',\n\ttemplate:  wp.template('attachment-details'),\n\n\tattributes: function() {\n\t\treturn {\n\t\t\t'tabIndex':     0,\n\t\t\t'data-id':      this.model.get( 'id' )\n\t\t};\n\t},\n\n\tevents: {\n\t\t'change [data-setting]':          'updateSetting',\n\t\t'change [data-setting] input':    'updateSetting',\n\t\t'change [data-setting] select':   'updateSetting',\n\t\t'change [data-setting] textarea': 'updateSetting',\n\t\t'click .delete-attachment':       'deleteAttachment',\n\t\t'click .trash-attachment':        'trashAttachment',\n\t\t'click .untrash-attachment':      'untrashAttachment',\n\t\t'click .edit-attachment':         'editAttachment',\n\t\t'keydown':                        'toggleSelectionHandler'\n\t},\n\n\tinitialize: function() {\n\t\tthis.options = _.defaults( this.options, {\n\t\t\trerenderOnModelChange: false\n\t\t});\n\n\t\tthis.on( 'ready', this.initialFocus );\n\t\t// Call 'initialize' directly on the parent class.\n\t\tAttachment.prototype.initialize.apply( this, arguments );\n\t},\n\n\tinitialFocus: function() {\n\t\tif ( ! wp.media.isTouchDevice ) {\n\t\t\t/*\n\t\t\tPreviously focused the first ':input' (the readonly URL text field).\n\t\t\tSince the first ':input' is now a button (delete/trash): when pressing\n\t\t\tspacebar on an attachment, Firefox fires deleteAttachment/trashAttachment\n\t\t\tas soon as focus is moved. Explicitly target the first text field for now.\n\t\t\t@todo change initial focus logic, also for accessibility.\n\t\t\t*/\n\t\t\tthis.$( 'input[type=\"text\"]' ).eq( 0 ).focus();\n\t\t}\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tdeleteAttachment: function( event ) {\n\t\tevent.preventDefault();\n\n\t\tif ( window.confirm( l10n.warnDelete ) ) {\n\t\t\tthis.model.destroy();\n\t\t\t// Keep focus inside media modal\n\t\t\t// after image is deleted\n\t\t\tthis.controller.modal.focusManager.focus();\n\t\t}\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\ttrashAttachment: function( event ) {\n\t\tvar library = this.controller.library;\n\t\tevent.preventDefault();\n\n\t\tif ( wp.media.view.settings.mediaTrash &&\n\t\t\t'edit-metadata' === this.controller.content.mode() ) {\n\n\t\t\tthis.model.set( 'status', 'trash' );\n\t\t\tthis.model.save().done( function() {\n\t\t\t\tlibrary._requery( true );\n\t\t\t} );\n\t\t}  else {\n\t\t\tthis.model.destroy();\n\t\t}\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tuntrashAttachment: function( event ) {\n\t\tvar library = this.controller.library;\n\t\tevent.preventDefault();\n\n\t\tthis.model.set( 'status', 'inherit' );\n\t\tthis.model.save().done( function() {\n\t\t\tlibrary._requery( true );\n\t\t} );\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\teditAttachment: function( event ) {\n\t\tvar editState = this.controller.states.get( 'edit-image' );\n\t\tif ( window.imageEdit && editState ) {\n\t\t\tevent.preventDefault();\n\n\t\t\teditState.set( 'image', this.model );\n\t\t\tthis.controller.setState( 'edit-image' );\n\t\t} else {\n\t\t\tthis.$el.addClass('needs-refresh');\n\t\t}\n\t},\n\t/**\n\t * When reverse tabbing(shift+tab) out of the right details panel, deliver\n\t * the focus to the item in the list that was being edited.\n\t *\n\t * @param {Object} event\n\t */\n\ttoggleSelectionHandler: function( event ) {\n\t\tif ( 'keydown' === event.type && 9 === event.keyCode && event.shiftKey && event.target === this.$( ':tabbable' ).get( 0 ) ) {\n\t\t\tthis.controller.trigger( 'attachment:details:shift-tab', event );\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( 37 === event.keyCode || 38 === event.keyCode || 39 === event.keyCode || 40 === event.keyCode ) {\n\t\t\tthis.controller.trigger( 'attachment:keydown:arrow', event );\n\t\t\treturn;\n\t\t}\n\t}\n});\n\nmodule.exports = Details;\n\n},{}],27:[function(require,module,exports){\n/**\n * wp.media.view.Attachment.EditLibrary\n *\n * @class\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar EditLibrary = wp.media.view.Attachment.extend({\n\tbuttons: {\n\t\tclose: true\n\t}\n});\n\nmodule.exports = EditLibrary;\n\n},{}],28:[function(require,module,exports){\n/**\n * wp.media.view.Attachments.EditSelection\n *\n * @class\n * @augments wp.media.view.Attachment.Selection\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar EditSelection = wp.media.view.Attachment.Selection.extend({\n\tbuttons: {\n\t\tclose: true\n\t}\n});\n\nmodule.exports = EditSelection;\n\n},{}],29:[function(require,module,exports){\n/**\n * wp.media.view.Attachment.Library\n *\n * @class\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Library = wp.media.view.Attachment.extend({\n\tbuttons: {\n\t\tcheck: true\n\t}\n});\n\nmodule.exports = Library;\n\n},{}],30:[function(require,module,exports){\n/**\n * wp.media.view.Attachment.Selection\n *\n * @class\n * @augments wp.media.view.Attachment\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Selection = wp.media.view.Attachment.extend({\n\tclassName: 'attachment selection',\n\n\t// On click, just select the model, instead of removing the model from\n\t// the selection.\n\ttoggleSelection: function() {\n\t\tthis.options.selection.single( this.model );\n\t}\n});\n\nmodule.exports = Selection;\n\n},{}],31:[function(require,module,exports){\n/**\n * wp.media.view.Attachments\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\t$ = jQuery,\n\tAttachments;\n\nAttachments = View.extend({\n\ttagName:   'ul',\n\tclassName: 'attachments',\n\n\tattributes: {\n\t\ttabIndex: -1\n\t},\n\n\tinitialize: function() {\n\t\tthis.el.id = _.uniqueId('__attachments-view-');\n\n\t\t_.defaults( this.options, {\n\t\t\trefreshSensitivity: wp.media.isTouchDevice ? 300 : 200,\n\t\t\trefreshThreshold:   3,\n\t\t\tAttachmentView:     wp.media.view.Attachment,\n\t\t\tsortable:           false,\n\t\t\tresize:             true,\n\t\t\tidealColumnWidth:   $( window ).width() < 640 ? 135 : 150\n\t\t});\n\n\t\tthis._viewsByCid = {};\n\t\tthis.$window = $( window );\n\t\tthis.resizeEvent = 'resize.media-modal-columns';\n\n\t\tthis.collection.on( 'add', function( attachment ) {\n\t\t\tthis.views.add( this.createAttachmentView( attachment ), {\n\t\t\t\tat: this.collection.indexOf( attachment )\n\t\t\t});\n\t\t}, this );\n\n\t\tthis.collection.on( 'remove', function( attachment ) {\n\t\t\tvar view = this._viewsByCid[ attachment.cid ];\n\t\t\tdelete this._viewsByCid[ attachment.cid ];\n\n\t\t\tif ( view ) {\n\t\t\t\tview.remove();\n\t\t\t}\n\t\t}, this );\n\n\t\tthis.collection.on( 'reset', this.render, this );\n\n\t\tthis.listenTo( this.controller, 'library:selection:add',    this.attachmentFocus );\n\n\t\t// Throttle the scroll handler and bind this.\n\t\tthis.scroll = _.chain( this.scroll ).bind( this ).throttle( this.options.refreshSensitivity ).value();\n\n\t\tthis.options.scrollElement = this.options.scrollElement || this.el;\n\t\t$( this.options.scrollElement ).on( 'scroll', this.scroll );\n\n\t\tthis.initSortable();\n\n\t\t_.bindAll( this, 'setColumns' );\n\n\t\tif ( this.options.resize ) {\n\t\t\tthis.on( 'ready', this.bindEvents );\n\t\t\tthis.controller.on( 'open', this.setColumns );\n\n\t\t\t// Call this.setColumns() after this view has been rendered in the DOM so\n\t\t\t// attachments get proper width applied.\n\t\t\t_.defer( this.setColumns, this );\n\t\t}\n\t},\n\n\tbindEvents: function() {\n\t\tthis.$window.off( this.resizeEvent ).on( this.resizeEvent, _.debounce( this.setColumns, 50 ) );\n\t},\n\n\tattachmentFocus: function() {\n\t\tthis.$( 'li:first' ).focus();\n\t},\n\n\trestoreFocus: function() {\n\t\tthis.$( 'li.selected:first' ).focus();\n\t},\n\n\tarrowEvent: function( event ) {\n\t\tvar attachments = this.$el.children( 'li' ),\n\t\t\tperRow = this.columns,\n\t\t\tindex = attachments.filter( ':focus' ).index(),\n\t\t\trow = ( index + 1 ) <= perRow ? 1 : Math.ceil( ( index + 1 ) / perRow );\n\n\t\tif ( index === -1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Left arrow\n\t\tif ( 37 === event.keyCode ) {\n\t\t\tif ( 0 === index ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattachments.eq( index - 1 ).focus();\n\t\t}\n\n\t\t// Up arrow\n\t\tif ( 38 === event.keyCode ) {\n\t\t\tif ( 1 === row ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattachments.eq( index - perRow ).focus();\n\t\t}\n\n\t\t// Right arrow\n\t\tif ( 39 === event.keyCode ) {\n\t\t\tif ( attachments.length === index ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattachments.eq( index + 1 ).focus();\n\t\t}\n\n\t\t// Down arrow\n\t\tif ( 40 === event.keyCode ) {\n\t\t\tif ( Math.ceil( attachments.length / perRow ) === row ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattachments.eq( index + perRow ).focus();\n\t\t}\n\t},\n\n\tdispose: function() {\n\t\tthis.collection.props.off( null, null, this );\n\t\tif ( this.options.resize ) {\n\t\t\tthis.$window.off( this.resizeEvent );\n\t\t}\n\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\tView.prototype.dispose.apply( this, arguments );\n\t},\n\n\tsetColumns: function() {\n\t\tvar prev = this.columns,\n\t\t\twidth = this.$el.width();\n\n\t\tif ( width ) {\n\t\t\tthis.columns = Math.min( Math.round( width / this.options.idealColumnWidth ), 12 ) || 1;\n\n\t\t\tif ( ! prev || prev !== this.columns ) {\n\t\t\t\tthis.$el.closest( '.media-frame-content' ).attr( 'data-columns', this.columns );\n\t\t\t}\n\t\t}\n\t},\n\n\tinitSortable: function() {\n\t\tvar collection = this.collection;\n\n\t\tif ( wp.media.isTouchDevice || ! this.options.sortable || ! $.fn.sortable ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.$el.sortable( _.extend({\n\t\t\t// If the `collection` has a `comparator`, disable sorting.\n\t\t\tdisabled: !! collection.comparator,\n\n\t\t\t// Change the position of the attachment as soon as the\n\t\t\t// mouse pointer overlaps a thumbnail.\n\t\t\ttolerance: 'pointer',\n\n\t\t\t// Record the initial `index` of the dragged model.\n\t\t\tstart: function( event, ui ) {\n\t\t\t\tui.item.data('sortableIndexStart', ui.item.index());\n\t\t\t},\n\n\t\t\t// Update the model's index in the collection.\n\t\t\t// Do so silently, as the view is already accurate.\n\t\t\tupdate: function( event, ui ) {\n\t\t\t\tvar model = collection.at( ui.item.data('sortableIndexStart') ),\n\t\t\t\t\tcomparator = collection.comparator;\n\n\t\t\t\t// Temporarily disable the comparator to prevent `add`\n\t\t\t\t// from re-sorting.\n\t\t\t\tdelete collection.comparator;\n\n\t\t\t\t// Silently shift the model to its new index.\n\t\t\t\tcollection.remove( model, {\n\t\t\t\t\tsilent: true\n\t\t\t\t});\n\t\t\t\tcollection.add( model, {\n\t\t\t\t\tsilent: true,\n\t\t\t\t\tat:     ui.item.index()\n\t\t\t\t});\n\n\t\t\t\t// Restore the comparator.\n\t\t\t\tcollection.comparator = comparator;\n\n\t\t\t\t// Fire the `reset` event to ensure other collections sync.\n\t\t\t\tcollection.trigger( 'reset', collection );\n\n\t\t\t\t// If the collection is sorted by menu order,\n\t\t\t\t// update the menu order.\n\t\t\t\tcollection.saveMenuOrder();\n\t\t\t}\n\t\t}, this.options.sortable ) );\n\n\t\t// If the `orderby` property is changed on the `collection`,\n\t\t// check to see if we have a `comparator`. If so, disable sorting.\n\t\tcollection.props.on( 'change:orderby', function() {\n\t\t\tthis.$el.sortable( 'option', 'disabled', !! collection.comparator );\n\t\t}, this );\n\n\t\tthis.collection.props.on( 'change:orderby', this.refreshSortable, this );\n\t\tthis.refreshSortable();\n\t},\n\n\trefreshSortable: function() {\n\t\tif ( wp.media.isTouchDevice || ! this.options.sortable || ! $.fn.sortable ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the `collection` has a `comparator`, disable sorting.\n\t\tvar collection = this.collection,\n\t\t\torderby = collection.props.get('orderby'),\n\t\t\tenabled = 'menuOrder' === orderby || ! collection.comparator;\n\n\t\tthis.$el.sortable( 'option', 'disabled', ! enabled );\n\t},\n\n\t/**\n\t * @param {wp.media.model.Attachment} attachment\n\t * @returns {wp.media.View}\n\t */\n\tcreateAttachmentView: function( attachment ) {\n\t\tvar view = new this.options.AttachmentView({\n\t\t\tcontroller:           this.controller,\n\t\t\tmodel:                attachment,\n\t\t\tcollection:           this.collection,\n\t\t\tselection:            this.options.selection\n\t\t});\n\n\t\treturn this._viewsByCid[ attachment.cid ] = view;\n\t},\n\n\tprepare: function() {\n\t\t// Create all of the Attachment views, and replace\n\t\t// the list in a single DOM operation.\n\t\tif ( this.collection.length ) {\n\t\t\tthis.views.set( this.collection.map( this.createAttachmentView, this ) );\n\n\t\t// If there are no elements, clear the views and load some.\n\t\t} else {\n\t\t\tthis.views.unset();\n\t\t\tthis.collection.more().done( this.scroll );\n\t\t}\n\t},\n\n\tready: function() {\n\t\t// Trigger the scroll event to check if we're within the\n\t\t// threshold to query for additional attachments.\n\t\tthis.scroll();\n\t},\n\n\tscroll: function() {\n\t\tvar view = this,\n\t\t\tel = this.options.scrollElement,\n\t\t\tscrollTop = el.scrollTop,\n\t\t\ttoolbar;\n\n\t\t// The scroll event occurs on the document, but the element\n\t\t// that should be checked is the document body.\n\t\tif ( el === document ) {\n\t\t\tel = document.body;\n\t\t\tscrollTop = $(document).scrollTop();\n\t\t}\n\n\t\tif ( ! $(el).is(':visible') || ! this.collection.hasMore() ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttoolbar = this.views.parent.toolbar;\n\n\t\t// Show the spinner only if we are close to the bottom.\n\t\tif ( el.scrollHeight - ( scrollTop + el.clientHeight ) < el.clientHeight / 3 ) {\n\t\t\ttoolbar.get('spinner').show();\n\t\t}\n\n\t\tif ( el.scrollHeight < scrollTop + ( el.clientHeight * this.options.refreshThreshold ) ) {\n\t\t\tthis.collection.more().done(function() {\n\t\t\t\tview.scroll();\n\t\t\t\ttoolbar.get('spinner').hide();\n\t\t\t});\n\t\t}\n\t}\n});\n\nmodule.exports = Attachments;\n\n},{}],32:[function(require,module,exports){\n/**\n * wp.media.view.AttachmentsBrowser\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n *\n * @param {object}         [options]               The options hash passed to the view.\n * @param {boolean|string} [options.filters=false] Which filters to show in the browser's toolbar.\n *                                                 Accepts 'uploaded' and 'all'.\n * @param {boolean}        [options.search=true]   Whether to show the search interface in the\n *                                                 browser's toolbar.\n * @param {boolean}        [options.date=true]     Whether to show the date filter in the\n *                                                 browser's toolbar.\n * @param {boolean}        [options.display=false] Whether to show the attachments display settings\n *                                                 view in the sidebar.\n * @param {boolean|string} [options.sidebar=true]  Whether to create a sidebar for the browser.\n *                                                 Accepts true, false, and 'errors'.\n */\nvar View = wp.media.View,\n\tmediaTrash = wp.media.view.settings.mediaTrash,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tAttachmentsBrowser;\n\nAttachmentsBrowser = View.extend({\n\ttagName:   'div',\n\tclassName: 'attachments-browser',\n\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tfilters: false,\n\t\t\tsearch:  true,\n\t\t\tdate:    true,\n\t\t\tdisplay: false,\n\t\t\tsidebar: true,\n\t\t\tAttachmentView: wp.media.view.Attachment.Library\n\t\t});\n\n\t\tthis.listenTo( this.controller, 'toggle:upload:attachment', _.bind( this.toggleUploader, this ) );\n\t\tthis.controller.on( 'edit:selection', this.editSelection );\n\t\tthis.createToolbar();\n\t\tif ( this.options.sidebar ) {\n\t\t\tthis.createSidebar();\n\t\t}\n\t\tthis.createUploader();\n\t\tthis.createAttachments();\n\t\tthis.updateContent();\n\n\t\tif ( ! this.options.sidebar || 'errors' === this.options.sidebar ) {\n\t\t\tthis.$el.addClass( 'hide-sidebar' );\n\n\t\t\tif ( 'errors' === this.options.sidebar ) {\n\t\t\t\tthis.$el.addClass( 'sidebar-for-errors' );\n\t\t\t}\n\t\t}\n\n\t\tthis.collection.on( 'add remove reset', this.updateContent, this );\n\t},\n\n\teditSelection: function( modal ) {\n\t\tmodal.$( '.media-button-backToLibrary' ).focus();\n\t},\n\n\t/**\n\t * @returns {wp.media.view.AttachmentsBrowser} Returns itself to allow chaining\n\t */\n\tdispose: function() {\n\t\tthis.options.selection.off( null, null, this );\n\t\tView.prototype.dispose.apply( this, arguments );\n\t\treturn this;\n\t},\n\n\tcreateToolbar: function() {\n\t\tvar LibraryViewSwitcher, Filters, toolbarOptions;\n\n\t\ttoolbarOptions = {\n\t\t\tcontroller: this.controller\n\t\t};\n\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\ttoolbarOptions.className = 'media-toolbar wp-filter';\n\t\t}\n\n\t\t/**\n\t\t* @member {wp.media.view.Toolbar}\n\t\t*/\n\t\tthis.toolbar = new wp.media.view.Toolbar( toolbarOptions );\n\n\t\tthis.views.add( this.toolbar );\n\n\t\tthis.toolbar.set( 'spinner', new wp.media.view.Spinner({\n\t\t\tpriority: -60\n\t\t}) );\n\n\t\tif ( -1 !== $.inArray( this.options.filters, [ 'uploaded', 'all' ] ) ) {\n\t\t\t// \"Filters\" will return a <select>, need to render\n\t\t\t// screen reader text before\n\t\t\tthis.toolbar.set( 'filtersLabel', new wp.media.view.Label({\n\t\t\t\tvalue: l10n.filterByType,\n\t\t\t\tattributes: {\n\t\t\t\t\t'for':  'media-attachment-filters'\n\t\t\t\t},\n\t\t\t\tpriority:   -80\n\t\t\t}).render() );\n\n\t\t\tif ( 'uploaded' === this.options.filters ) {\n\t\t\t\tthis.toolbar.set( 'filters', new wp.media.view.AttachmentFilters.Uploaded({\n\t\t\t\t\tcontroller: this.controller,\n\t\t\t\t\tmodel:      this.collection.props,\n\t\t\t\t\tpriority:   -80\n\t\t\t\t}).render() );\n\t\t\t} else {\n\t\t\t\tFilters = new wp.media.view.AttachmentFilters.All({\n\t\t\t\t\tcontroller: this.controller,\n\t\t\t\t\tmodel:      this.collection.props,\n\t\t\t\t\tpriority:   -80\n\t\t\t\t});\n\n\t\t\t\tthis.toolbar.set( 'filters', Filters.render() );\n\t\t\t}\n\t\t}\n\n\t\t// Feels odd to bring the global media library switcher into the Attachment\n\t\t// browser view. Is this a use case for doAction( 'add:toolbar-items:attachments-browser', this.toolbar );\n\t\t// which the controller can tap into and add this view?\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\tLibraryViewSwitcher = View.extend({\n\t\t\t\tclassName: 'view-switch media-grid-view-switch',\n\t\t\t\ttemplate: wp.template( 'media-library-view-switcher')\n\t\t\t});\n\n\t\t\tthis.toolbar.set( 'libraryViewSwitcher', new LibraryViewSwitcher({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tpriority: -90\n\t\t\t}).render() );\n\n\t\t\t// DateFilter is a <select>, screen reader text needs to be rendered before\n\t\t\tthis.toolbar.set( 'dateFilterLabel', new wp.media.view.Label({\n\t\t\t\tvalue: l10n.filterByDate,\n\t\t\t\tattributes: {\n\t\t\t\t\t'for': 'media-attachment-date-filters'\n\t\t\t\t},\n\t\t\t\tpriority: -75\n\t\t\t}).render() );\n\t\t\tthis.toolbar.set( 'dateFilter', new wp.media.view.DateFilter({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tmodel:      this.collection.props,\n\t\t\t\tpriority: -75\n\t\t\t}).render() );\n\n\t\t\t// BulkSelection is a <div> with subviews, including screen reader text\n\t\t\tthis.toolbar.set( 'selectModeToggleButton', new wp.media.view.SelectModeToggleButton({\n\t\t\t\ttext: l10n.bulkSelect,\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tpriority: -70\n\t\t\t}).render() );\n\n\t\t\tthis.toolbar.set( 'deleteSelectedButton', new wp.media.view.DeleteSelectedButton({\n\t\t\t\tfilters: Filters,\n\t\t\t\tstyle: 'primary',\n\t\t\t\tdisabled: true,\n\t\t\t\ttext: mediaTrash ? l10n.trashSelected : l10n.deleteSelected,\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tpriority: -60,\n\t\t\t\tclick: function() {\n\t\t\t\t\tvar changed = [], removed = [],\n\t\t\t\t\t\tselection = this.controller.state().get( 'selection' ),\n\t\t\t\t\t\tlibrary = this.controller.state().get( 'library' );\n\n\t\t\t\t\tif ( ! selection.length ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! mediaTrash && ! window.confirm( l10n.warnBulkDelete ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( mediaTrash &&\n\t\t\t\t\t\t'trash' !== selection.at( 0 ).get( 'status' ) &&\n\t\t\t\t\t\t! window.confirm( l10n.warnBulkTrash ) ) {\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tselection.each( function( model ) {\n\t\t\t\t\t\tif ( ! model.get( 'nonces' )['delete'] ) {\n\t\t\t\t\t\t\tremoved.push( model );\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( mediaTrash && 'trash' === model.get( 'status' ) ) {\n\t\t\t\t\t\t\tmodel.set( 'status', 'inherit' );\n\t\t\t\t\t\t\tchanged.push( model.save() );\n\t\t\t\t\t\t\tremoved.push( model );\n\t\t\t\t\t\t} else if ( mediaTrash ) {\n\t\t\t\t\t\t\tmodel.set( 'status', 'trash' );\n\t\t\t\t\t\t\tchanged.push( model.save() );\n\t\t\t\t\t\t\tremoved.push( model );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmodel.destroy({wait: true});\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( changed.length ) {\n\t\t\t\t\t\tselection.remove( removed );\n\n\t\t\t\t\t\t$.when.apply( null, changed ).then( _.bind( function() {\n\t\t\t\t\t\t\tlibrary._requery( true );\n\t\t\t\t\t\t\tthis.controller.trigger( 'selection:action:done' );\n\t\t\t\t\t\t}, this ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.controller.trigger( 'selection:action:done' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}).render() );\n\n\t\t\tif ( mediaTrash ) {\n\t\t\t\tthis.toolbar.set( 'deleteSelectedPermanentlyButton', new wp.media.view.DeleteSelectedPermanentlyButton({\n\t\t\t\t\tfilters: Filters,\n\t\t\t\t\tstyle: 'primary',\n\t\t\t\t\tdisabled: true,\n\t\t\t\t\ttext: l10n.deleteSelected,\n\t\t\t\t\tcontroller: this.controller,\n\t\t\t\t\tpriority: -55,\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar removed = [], selection = this.controller.state().get( 'selection' );\n\n\t\t\t\t\t\tif ( ! selection.length || ! window.confirm( l10n.warnBulkDelete ) ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tselection.each( function( model ) {\n\t\t\t\t\t\t\tif ( ! model.get( 'nonces' )['delete'] ) {\n\t\t\t\t\t\t\t\tremoved.push( model );\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tmodel.destroy();\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tselection.remove( removed );\n\t\t\t\t\t\tthis.controller.trigger( 'selection:action:done' );\n\t\t\t\t\t}\n\t\t\t\t}).render() );\n\t\t\t}\n\n\t\t} else if ( this.options.date ) {\n\t\t\t// DateFilter is a <select>, screen reader text needs to be rendered before\n\t\t\tthis.toolbar.set( 'dateFilterLabel', new wp.media.view.Label({\n\t\t\t\tvalue: l10n.filterByDate,\n\t\t\t\tattributes: {\n\t\t\t\t\t'for': 'media-attachment-date-filters'\n\t\t\t\t},\n\t\t\t\tpriority: -75\n\t\t\t}).render() );\n\t\t\tthis.toolbar.set( 'dateFilter', new wp.media.view.DateFilter({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tmodel:      this.collection.props,\n\t\t\t\tpriority: -75\n\t\t\t}).render() );\n\t\t}\n\n\t\tif ( this.options.search ) {\n\t\t\t// Search is an input, screen reader text needs to be rendered before\n\t\t\tthis.toolbar.set( 'searchLabel', new wp.media.view.Label({\n\t\t\t\tvalue: l10n.searchMediaLabel,\n\t\t\t\tattributes: {\n\t\t\t\t\t'for': 'media-search-input'\n\t\t\t\t},\n\t\t\t\tpriority:   60\n\t\t\t}).render() );\n\t\t\tthis.toolbar.set( 'search', new wp.media.view.Search({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tmodel:      this.collection.props,\n\t\t\t\tpriority:   60\n\t\t\t}).render() );\n\t\t}\n\n\t\tif ( this.options.dragInfo ) {\n\t\t\tthis.toolbar.set( 'dragInfo', new View({\n\t\t\t\tel: $( '<div class=\"instructions\">' + l10n.dragInfo + '</div>' )[0],\n\t\t\t\tpriority: -40\n\t\t\t}) );\n\t\t}\n\n\t\tif ( this.options.suggestedWidth && this.options.suggestedHeight ) {\n\t\t\tthis.toolbar.set( 'suggestedDimensions', new View({\n\t\t\t\tel: $( '<div class=\"instructions\">' + l10n.suggestedDimensions + ' ' + this.options.suggestedWidth + ' &times; ' + this.options.suggestedHeight + '</div>' )[0],\n\t\t\t\tpriority: -40\n\t\t\t}) );\n\t\t}\n\t},\n\n\tupdateContent: function() {\n\t\tvar view = this,\n\t\t\tnoItemsView;\n\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\tnoItemsView = view.attachmentsNoResults;\n\t\t} else {\n\t\t\tnoItemsView = view.uploader;\n\t\t}\n\n\t\tif ( ! this.collection.length ) {\n\t\t\tthis.toolbar.get( 'spinner' ).show();\n\t\t\tthis.dfd = this.collection.more().done( function() {\n\t\t\t\tif ( ! view.collection.length ) {\n\t\t\t\t\tnoItemsView.$el.removeClass( 'hidden' );\n\t\t\t\t} else {\n\t\t\t\t\tnoItemsView.$el.addClass( 'hidden' );\n\t\t\t\t}\n\t\t\t\tview.toolbar.get( 'spinner' ).hide();\n\t\t\t} );\n\t\t} else {\n\t\t\tnoItemsView.$el.addClass( 'hidden' );\n\t\t\tview.toolbar.get( 'spinner' ).hide();\n\t\t}\n\t},\n\n\tcreateUploader: function() {\n\t\tthis.uploader = new wp.media.view.UploaderInline({\n\t\t\tcontroller: this.controller,\n\t\t\tstatus:     false,\n\t\t\tmessage:    this.controller.isModeActive( 'grid' ) ? '' : l10n.noItemsFound,\n\t\t\tcanClose:   this.controller.isModeActive( 'grid' )\n\t\t});\n\n\t\tthis.uploader.hide();\n\t\tthis.views.add( this.uploader );\n\t},\n\n\ttoggleUploader: function() {\n\t\tif ( this.uploader.$el.hasClass( 'hidden' ) ) {\n\t\t\tthis.uploader.show();\n\t\t} else {\n\t\t\tthis.uploader.hide();\n\t\t}\n\t},\n\n\tcreateAttachments: function() {\n\t\tthis.attachments = new wp.media.view.Attachments({\n\t\t\tcontroller:           this.controller,\n\t\t\tcollection:           this.collection,\n\t\t\tselection:            this.options.selection,\n\t\t\tmodel:                this.model,\n\t\t\tsortable:             this.options.sortable,\n\t\t\tscrollElement:        this.options.scrollElement,\n\t\t\tidealColumnWidth:     this.options.idealColumnWidth,\n\n\t\t\t// The single `Attachment` view to be used in the `Attachments` view.\n\t\t\tAttachmentView: this.options.AttachmentView\n\t\t});\n\n\t\t// Add keydown listener to the instance of the Attachments view\n\t\tthis.attachments.listenTo( this.controller, 'attachment:keydown:arrow',     this.attachments.arrowEvent );\n\t\tthis.attachments.listenTo( this.controller, 'attachment:details:shift-tab', this.attachments.restoreFocus );\n\n\t\tthis.views.add( this.attachments );\n\n\n\t\tif ( this.controller.isModeActive( 'grid' ) ) {\n\t\t\tthis.attachmentsNoResults = new View({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\ttagName: 'p'\n\t\t\t});\n\n\t\t\tthis.attachmentsNoResults.$el.addClass( 'hidden no-media' );\n\t\t\tthis.attachmentsNoResults.$el.html( l10n.noMedia );\n\n\t\t\tthis.views.add( this.attachmentsNoResults );\n\t\t}\n\t},\n\n\tcreateSidebar: function() {\n\t\tvar options = this.options,\n\t\t\tselection = options.selection,\n\t\t\tsidebar = this.sidebar = new wp.media.view.Sidebar({\n\t\t\t\tcontroller: this.controller\n\t\t\t});\n\n\t\tthis.views.add( sidebar );\n\n\t\tif ( this.controller.uploader ) {\n\t\t\tsidebar.set( 'uploads', new wp.media.view.UploaderStatus({\n\t\t\t\tcontroller: this.controller,\n\t\t\t\tpriority:   40\n\t\t\t}) );\n\t\t}\n\n\t\tselection.on( 'selection:single', this.createSingle, this );\n\t\tselection.on( 'selection:unsingle', this.disposeSingle, this );\n\n\t\tif ( selection.single() ) {\n\t\t\tthis.createSingle();\n\t\t}\n\t},\n\n\tcreateSingle: function() {\n\t\tvar sidebar = this.sidebar,\n\t\t\tsingle = this.options.selection.single();\n\n\t\tsidebar.set( 'details', new wp.media.view.Attachment.Details({\n\t\t\tcontroller: this.controller,\n\t\t\tmodel:      single,\n\t\t\tpriority:   80\n\t\t}) );\n\n\t\tsidebar.set( 'compat', new wp.media.view.AttachmentCompat({\n\t\t\tcontroller: this.controller,\n\t\t\tmodel:      single,\n\t\t\tpriority:   120\n\t\t}) );\n\n\t\tif ( this.options.display ) {\n\t\t\tsidebar.set( 'display', new wp.media.view.Settings.AttachmentDisplay({\n\t\t\t\tcontroller:   this.controller,\n\t\t\t\tmodel:        this.model.display( single ),\n\t\t\t\tattachment:   single,\n\t\t\t\tpriority:     160,\n\t\t\t\tuserSettings: this.model.get('displayUserSettings')\n\t\t\t}) );\n\t\t}\n\n\t\t// Show the sidebar on mobile\n\t\tif ( this.model.id === 'insert' ) {\n\t\t\tsidebar.$el.addClass( 'visible' );\n\t\t}\n\t},\n\n\tdisposeSingle: function() {\n\t\tvar sidebar = this.sidebar;\n\t\tsidebar.unset('details');\n\t\tsidebar.unset('compat');\n\t\tsidebar.unset('display');\n\t\t// Hide the sidebar on mobile\n\t\tsidebar.$el.removeClass( 'visible' );\n\t}\n});\n\nmodule.exports = AttachmentsBrowser;\n\n},{}],33:[function(require,module,exports){\n/**\n * wp.media.view.Attachments.Selection\n *\n * @class\n * @augments wp.media.view.Attachments\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Attachments = wp.media.view.Attachments,\n\tSelection;\n\nSelection = Attachments.extend({\n\tevents: {},\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tsortable:   false,\n\t\t\tresize:     false,\n\n\t\t\t// The single `Attachment` view to be used in the `Attachments` view.\n\t\t\tAttachmentView: wp.media.view.Attachment.Selection\n\t\t});\n\t\t// Call 'initialize' directly on the parent class.\n\t\treturn Attachments.prototype.initialize.apply( this, arguments );\n\t}\n});\n\nmodule.exports = Selection;\n\n},{}],34:[function(require,module,exports){\n/**\n * wp.media.view.ButtonGroup\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar $ = Backbone.$,\n\tButtonGroup;\n\nButtonGroup = wp.media.View.extend({\n\ttagName:   'div',\n\tclassName: 'button-group button-large media-button-group',\n\n\tinitialize: function() {\n\t\t/**\n\t\t * @member {wp.media.view.Button[]}\n\t\t */\n\t\tthis.buttons = _.map( this.options.buttons || [], function( button ) {\n\t\t\tif ( button instanceof Backbone.View ) {\n\t\t\t\treturn button;\n\t\t\t} else {\n\t\t\t\treturn new wp.media.view.Button( button ).render();\n\t\t\t}\n\t\t});\n\n\t\tdelete this.options.buttons;\n\n\t\tif ( this.options.classes ) {\n\t\t\tthis.$el.addClass( this.options.classes );\n\t\t}\n\t},\n\n\t/**\n\t * @returns {wp.media.view.ButtonGroup}\n\t */\n\trender: function() {\n\t\tthis.$el.html( $( _.pluck( this.buttons, 'el' ) ).detach() );\n\t\treturn this;\n\t}\n});\n\nmodule.exports = ButtonGroup;\n\n},{}],35:[function(require,module,exports){\n/**\n * wp.media.view.Button\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Button = wp.media.View.extend({\n\ttagName:    'button',\n\tclassName:  'media-button',\n\tattributes: { type: 'button' },\n\n\tevents: {\n\t\t'click': 'click'\n\t},\n\n\tdefaults: {\n\t\ttext:     '',\n\t\tstyle:    '',\n\t\tsize:     'large',\n\t\tdisabled: false\n\t},\n\n\tinitialize: function() {\n\t\t/**\n\t\t * Create a model with the provided `defaults`.\n\t\t *\n\t\t * @member {Backbone.Model}\n\t\t */\n\t\tthis.model = new Backbone.Model( this.defaults );\n\n\t\t// If any of the `options` have a key from `defaults`, apply its\n\t\t// value to the `model` and remove it from the `options object.\n\t\t_.each( this.defaults, function( def, key ) {\n\t\t\tvar value = this.options[ key ];\n\t\t\tif ( _.isUndefined( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.model.set( key, value );\n\t\t\tdelete this.options[ key ];\n\t\t}, this );\n\n\t\tthis.listenTo( this.model, 'change', this.render );\n\t},\n\t/**\n\t * @returns {wp.media.view.Button} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tvar classes = [ 'button', this.className ],\n\t\t\tmodel = this.model.toJSON();\n\n\t\tif ( model.style ) {\n\t\t\tclasses.push( 'button-' + model.style );\n\t\t}\n\n\t\tif ( model.size ) {\n\t\t\tclasses.push( 'button-' + model.size );\n\t\t}\n\n\t\tclasses = _.uniq( classes.concat( this.options.classes ) );\n\t\tthis.el.className = classes.join(' ');\n\n\t\tthis.$el.attr( 'disabled', model.disabled );\n\t\tthis.$el.text( this.model.get('text') );\n\n\t\treturn this;\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tclick: function( event ) {\n\t\tif ( '#' === this.attributes.href ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tif ( this.options.click && ! this.model.get('disabled') ) {\n\t\t\tthis.options.click.apply( this, arguments );\n\t\t}\n\t}\n});\n\nmodule.exports = Button;\n\n},{}],36:[function(require,module,exports){\n/**\n * wp.media.view.Cropper\n *\n * Uses the imgAreaSelect plugin to allow a user to crop an image.\n *\n * Takes imgAreaSelect options from\n * wp.customize.HeaderControl.calculateImageSelectOptions via\n * wp.customize.HeaderControl.openMM.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\tUploaderStatus = wp.media.view.UploaderStatus,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tCropper;\n\nCropper = View.extend({\n\tclassName: 'crop-content',\n\ttemplate: wp.template('crop-content'),\n\tinitialize: function() {\n\t\t_.bindAll(this, 'onImageLoad');\n\t},\n\tready: function() {\n\t\tthis.controller.frame.on('content:error:crop', this.onError, this);\n\t\tthis.$image = this.$el.find('.crop-image');\n\t\tthis.$image.on('load', this.onImageLoad);\n\t\t$(window).on('resize.cropper', _.debounce(this.onImageLoad, 250));\n\t},\n\tremove: function() {\n\t\t$(window).off('resize.cropper');\n\t\tthis.$el.remove();\n\t\tthis.$el.off();\n\t\tView.prototype.remove.apply(this, arguments);\n\t},\n\tprepare: function() {\n\t\treturn {\n\t\t\ttitle: l10n.cropYourImage,\n\t\t\turl: this.options.attachment.get('url')\n\t\t};\n\t},\n\tonImageLoad: function() {\n\t\tvar imgOptions = this.controller.get('imgSelectOptions');\n\t\tif (typeof imgOptions === 'function') {\n\t\t\timgOptions = imgOptions(this.options.attachment, this.controller);\n\t\t}\n\n\t\timgOptions = _.extend(imgOptions, {parent: this.$el});\n\t\tthis.trigger('image-loaded');\n\t\tthis.controller.imgSelect = this.$image.imgAreaSelect(imgOptions);\n\t},\n\tonError: function() {\n\t\tvar filename = this.options.attachment.get('filename');\n\n\t\tthis.views.add( '.upload-errors', new wp.media.view.UploaderStatusError({\n\t\t\tfilename: UploaderStatus.prototype.filename(filename),\n\t\t\tmessage: window._wpMediaViewsL10n.cropError\n\t\t}), { at: 0 });\n\t}\n});\n\nmodule.exports = Cropper;\n\n},{}],37:[function(require,module,exports){\n/**\n * wp.media.view.EditImage\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\tEditImage;\n\nEditImage = View.extend({\n\tclassName: 'image-editor',\n\ttemplate: wp.template('image-editor'),\n\n\tinitialize: function( options ) {\n\t\tthis.editor = window.imageEdit;\n\t\tthis.controller = options.controller;\n\t\tView.prototype.initialize.apply( this, arguments );\n\t},\n\n\tprepare: function() {\n\t\treturn this.model.toJSON();\n\t},\n\n\tloadEditor: function() {\n\t\tvar dfd = this.editor.open( this.model.get('id'), this.model.get('nonces').edit, this );\n\t\tdfd.done( _.bind( this.focus, this ) );\n\t},\n\n\tfocus: function() {\n\t\tthis.$( '.imgedit-submit .button' ).eq( 0 ).focus();\n\t},\n\n\tback: function() {\n\t\tvar lastState = this.controller.lastState();\n\t\tthis.controller.setState( lastState );\n\t},\n\n\trefresh: function() {\n\t\tthis.model.fetch();\n\t},\n\n\tsave: function() {\n\t\tvar lastState = this.controller.lastState();\n\n\t\tthis.model.fetch().done( _.bind( function() {\n\t\t\tthis.controller.setState( lastState );\n\t\t}, this ) );\n\t}\n\n});\n\nmodule.exports = EditImage;\n\n},{}],38:[function(require,module,exports){\n/**\n * wp.media.view.Embed\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Embed = wp.media.View.extend({\n\tclassName: 'media-embed',\n\n\tinitialize: function() {\n\t\t/**\n\t\t * @member {wp.media.view.EmbedUrl}\n\t\t */\n\t\tthis.url = new wp.media.view.EmbedUrl({\n\t\t\tcontroller: this.controller,\n\t\t\tmodel:      this.model.props\n\t\t}).render();\n\n\t\tthis.views.set([ this.url ]);\n\t\tthis.refresh();\n\t\tthis.listenTo( this.model, 'change:type', this.refresh );\n\t\tthis.listenTo( this.model, 'change:loading', this.loading );\n\t},\n\n\t/**\n\t * @param {Object} view\n\t */\n\tsettings: function( view ) {\n\t\tif ( this._settings ) {\n\t\t\tthis._settings.remove();\n\t\t}\n\t\tthis._settings = view;\n\t\tthis.views.add( view );\n\t},\n\n\trefresh: function() {\n\t\tvar type = this.model.get('type'),\n\t\t\tconstructor;\n\n\t\tif ( 'image' === type ) {\n\t\t\tconstructor = wp.media.view.EmbedImage;\n\t\t} else if ( 'link' === type ) {\n\t\t\tconstructor = wp.media.view.EmbedLink;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.settings( new constructor({\n\t\t\tcontroller: this.controller,\n\t\t\tmodel:      this.model.props,\n\t\t\tpriority:   40\n\t\t}) );\n\t},\n\n\tloading: function() {\n\t\tthis.$el.toggleClass( 'embed-loading', this.model.get('loading') );\n\t}\n});\n\nmodule.exports = Embed;\n\n},{}],39:[function(require,module,exports){\n/**\n * wp.media.view.EmbedImage\n *\n * @class\n * @augments wp.media.view.Settings.AttachmentDisplay\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar AttachmentDisplay = wp.media.view.Settings.AttachmentDisplay,\n\tEmbedImage;\n\nEmbedImage = AttachmentDisplay.extend({\n\tclassName: 'embed-media-settings',\n\ttemplate:  wp.template('embed-image-settings'),\n\n\tinitialize: function() {\n\t\t/**\n\t\t * Call `initialize` directly on parent class with passed arguments\n\t\t */\n\t\tAttachmentDisplay.prototype.initialize.apply( this, arguments );\n\t\tthis.listenTo( this.model, 'change:url', this.updateImage );\n\t},\n\n\tupdateImage: function() {\n\t\tthis.$('img').attr( 'src', this.model.get('url') );\n\t}\n});\n\nmodule.exports = EmbedImage;\n\n},{}],40:[function(require,module,exports){\n/**\n * wp.media.view.EmbedLink\n *\n * @class\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar $ = jQuery,\n\tEmbedLink;\n\nEmbedLink = wp.media.view.Settings.extend({\n\tclassName: 'embed-link-settings',\n\ttemplate:  wp.template('embed-link-settings'),\n\n\tinitialize: function() {\n\t\tthis.listenTo( this.model, 'change:url', this.updateoEmbed );\n\t},\n\n\tupdateoEmbed: _.debounce( function() {\n\t\tvar url = this.model.get( 'url' );\n\n\t\t// clear out previous results\n\t\tthis.$('.embed-container').hide().find('.embed-preview').empty();\n\t\tthis.$( '.setting' ).hide();\n\n\t\t// only proceed with embed if the field contains more than 11 characters\n\t\t// Example: http://a.io is 11 chars\n\t\tif ( url && ( url.length < 11 || ! url.match(/^http(s)?:\\/\\//) ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.fetch();\n\t}, wp.media.controller.Embed.sensitivity ),\n\n\tfetch: function() {\n\t\tvar embed;\n\n\t\t// check if they haven't typed in 500 ms\n\t\tif ( $('#embed-url-field').val() !== this.model.get('url') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this.dfd && 'pending' === this.dfd.state() ) {\n\t\t\tthis.dfd.abort();\n\t\t}\n\n\t\tembed = new wp.shortcode({\n\t\t\ttag: 'embed',\n\t\t\tattrs: _.pick( this.model.attributes, [ 'width', 'height', 'src' ] ),\n\t\t\tcontent: this.model.get('url')\n\t\t});\n\n\t\tthis.dfd = $.ajax({\n\t\t\ttype:    'POST',\n\t\t\turl:     wp.ajax.settings.url,\n\t\t\tcontext: this,\n\t\t\tdata:    {\n\t\t\t\taction: 'parse-embed',\n\t\t\t\tpost_ID: wp.media.view.settings.post.id,\n\t\t\t\tshortcode: embed.string()\n\t\t\t}\n\t\t})\n\t\t\t.done( this.renderoEmbed )\n\t\t\t.fail( this.renderFail );\n\t},\n\n\trenderFail: function ( response, status ) {\n\t\tif ( 'abort' === status ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.$( '.link-text' ).show();\n\t},\n\n\trenderoEmbed: function( response ) {\n\t\tvar html = ( response && response.data && response.data.body ) || '';\n\n\t\tif ( html ) {\n\t\t\tthis.$('.embed-container').show().find('.embed-preview').html( html );\n\t\t} else {\n\t\t\tthis.renderFail();\n\t\t}\n\t}\n});\n\nmodule.exports = EmbedLink;\n\n},{}],41:[function(require,module,exports){\n/**\n * wp.media.view.EmbedUrl\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\t$ = jQuery,\n\tEmbedUrl;\n\nEmbedUrl = View.extend({\n\ttagName:   'label',\n\tclassName: 'embed-url',\n\n\tevents: {\n\t\t'input':  'url',\n\t\t'keyup':  'url',\n\t\t'change': 'url'\n\t},\n\n\tinitialize: function() {\n\t\tthis.$input = $('<input id=\"embed-url-field\" type=\"url\" />').val( this.model.get('url') );\n\t\tthis.input = this.$input[0];\n\n\t\tthis.spinner = $('<span class=\"spinner\" />')[0];\n\t\tthis.$el.append([ this.input, this.spinner ]);\n\n\t\tthis.listenTo( this.model, 'change:url', this.render );\n\n\t\tif ( this.model.get( 'url' ) ) {\n\t\t\t_.delay( _.bind( function () {\n\t\t\t\tthis.model.trigger( 'change:url' );\n\t\t\t}, this ), 500 );\n\t\t}\n\t},\n\t/**\n\t * @returns {wp.media.view.EmbedUrl} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tvar $input = this.$input;\n\n\t\tif ( $input.is(':focus') ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.input.value = this.model.get('url') || 'http://';\n\t\t/**\n\t\t * Call `render` directly on parent class with passed arguments\n\t\t */\n\t\tView.prototype.render.apply( this, arguments );\n\t\treturn this;\n\t},\n\n\tready: function() {\n\t\tif ( ! wp.media.isTouchDevice ) {\n\t\t\tthis.focus();\n\t\t}\n\t},\n\n\turl: function( event ) {\n\t\tthis.model.set( 'url', event.target.value );\n\t},\n\n\t/**\n\t * If the input is visible, focus and select its contents.\n\t */\n\tfocus: function() {\n\t\tvar $input = this.$input;\n\t\tif ( $input.is(':visible') ) {\n\t\t\t$input.focus()[0].select();\n\t\t}\n\t}\n});\n\nmodule.exports = EmbedUrl;\n\n},{}],42:[function(require,module,exports){\n/**\n * wp.media.view.FocusManager\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar FocusManager = wp.media.View.extend({\n\n\tevents: {\n\t\t'keydown': 'constrainTabbing'\n\t},\n\n\tfocus: function() { // Reset focus on first left menu item\n\t\tthis.$('.media-menu-item').first().focus();\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tconstrainTabbing: function( event ) {\n\t\tvar tabbables;\n\n\t\t// Look for the tab key.\n\t\tif ( 9 !== event.keyCode ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Skip the file input added by Plupload.\n\t\ttabbables = this.$( ':tabbable' ).not( '.moxie-shim input[type=\"file\"]' );\n\n\t\t// Keep tab focus within media modal while it's open\n\t\tif ( tabbables.last()[0] === event.target && ! event.shiftKey ) {\n\t\t\ttabbables.first().focus();\n\t\t\treturn false;\n\t\t} else if ( tabbables.first()[0] === event.target && event.shiftKey ) {\n\t\t\ttabbables.last().focus();\n\t\t\treturn false;\n\t\t}\n\t}\n\n});\n\nmodule.exports = FocusManager;\n\n},{}],43:[function(require,module,exports){\n/**\n * wp.media.view.Frame\n *\n * A frame is a composite view consisting of one or more regions and one or more\n * states.\n *\n * @see wp.media.controller.State\n * @see wp.media.controller.Region\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar Frame = wp.media.View.extend({\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tmode: [ 'select' ]\n\t\t});\n\t\tthis._createRegions();\n\t\tthis._createStates();\n\t\tthis._createModes();\n\t},\n\n\t_createRegions: function() {\n\t\t// Clone the regions array.\n\t\tthis.regions = this.regions ? this.regions.slice() : [];\n\n\t\t// Initialize regions.\n\t\t_.each( this.regions, function( region ) {\n\t\t\tthis[ region ] = new wp.media.controller.Region({\n\t\t\t\tview:     this,\n\t\t\t\tid:       region,\n\t\t\t\tselector: '.media-frame-' + region\n\t\t\t});\n\t\t}, this );\n\t},\n\t/**\n\t * Create the frame's states.\n\t *\n\t * @see wp.media.controller.State\n\t * @see wp.media.controller.StateMachine\n\t *\n\t * @fires wp.media.controller.State#ready\n\t */\n\t_createStates: function() {\n\t\t// Create the default `states` collection.\n\t\tthis.states = new Backbone.Collection( null, {\n\t\t\tmodel: wp.media.controller.State\n\t\t});\n\n\t\t// Ensure states have a reference to the frame.\n\t\tthis.states.on( 'add', function( model ) {\n\t\t\tmodel.frame = this;\n\t\t\tmodel.trigger('ready');\n\t\t}, this );\n\n\t\tif ( this.options.states ) {\n\t\t\tthis.states.add( this.options.states );\n\t\t}\n\t},\n\n\t/**\n\t * A frame can be in a mode or multiple modes at one time.\n\t *\n\t * For example, the manage media frame can be in the `Bulk Select` or `Edit` mode.\n\t */\n\t_createModes: function() {\n\t\t// Store active \"modes\" that the frame is in. Unrelated to region modes.\n\t\tthis.activeModes = new Backbone.Collection();\n\t\tthis.activeModes.on( 'add remove reset', _.bind( this.triggerModeEvents, this ) );\n\n\t\t_.each( this.options.mode, function( mode ) {\n\t\t\tthis.activateMode( mode );\n\t\t}, this );\n\t},\n\t/**\n\t * Reset all states on the frame to their defaults.\n\t *\n\t * @returns {wp.media.view.Frame} Returns itself to allow chaining\n\t */\n\treset: function() {\n\t\tthis.states.invoke( 'trigger', 'reset' );\n\t\treturn this;\n\t},\n\t/**\n\t * Map activeMode collection events to the frame.\n\t */\n\ttriggerModeEvents: function( model, collection, options ) {\n\t\tvar collectionEvent,\n\t\t\tmodeEventMap = {\n\t\t\t\tadd: 'activate',\n\t\t\t\tremove: 'deactivate'\n\t\t\t},\n\t\t\teventToTrigger;\n\t\t// Probably a better way to do this.\n\t\t_.each( options, function( value, key ) {\n\t\t\tif ( value ) {\n\t\t\t\tcollectionEvent = key;\n\t\t\t}\n\t\t} );\n\n\t\tif ( ! _.has( modeEventMap, collectionEvent ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\teventToTrigger = model.get('id') + ':' + modeEventMap[collectionEvent];\n\t\tthis.trigger( eventToTrigger );\n\t},\n\t/**\n\t * Activate a mode on the frame.\n\t *\n\t * @param string mode Mode ID.\n\t * @returns {this} Returns itself to allow chaining.\n\t */\n\tactivateMode: function( mode ) {\n\t\t// Bail if the mode is already active.\n\t\tif ( this.isModeActive( mode ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.activeModes.add( [ { id: mode } ] );\n\t\t// Add a CSS class to the frame so elements can be styled for the mode.\n\t\tthis.$el.addClass( 'mode-' + mode );\n\n\t\treturn this;\n\t},\n\t/**\n\t * Deactivate a mode on the frame.\n\t *\n\t * @param string mode Mode ID.\n\t * @returns {this} Returns itself to allow chaining.\n\t */\n\tdeactivateMode: function( mode ) {\n\t\t// Bail if the mode isn't active.\n\t\tif ( ! this.isModeActive( mode ) ) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.activeModes.remove( this.activeModes.where( { id: mode } ) );\n\t\tthis.$el.removeClass( 'mode-' + mode );\n\t\t/**\n\t\t * Frame mode deactivation event.\n\t\t *\n\t\t * @event this#{mode}:deactivate\n\t\t */\n\t\tthis.trigger( mode + ':deactivate' );\n\n\t\treturn this;\n\t},\n\t/**\n\t * Check if a mode is enabled on the frame.\n\t *\n\t * @param  string mode Mode ID.\n\t * @return bool\n\t */\n\tisModeActive: function( mode ) {\n\t\treturn Boolean( this.activeModes.where( { id: mode } ).length );\n\t}\n});\n\n// Make the `Frame` a `StateMachine`.\n_.extend( Frame.prototype, wp.media.controller.StateMachine.prototype );\n\nmodule.exports = Frame;\n\n},{}],44:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.ImageDetails\n *\n * A media frame for manipulating an image that's already been inserted\n * into a post.\n *\n * @class\n * @augments wp.media.view.MediaFrame.Select\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar Select = wp.media.view.MediaFrame.Select,\n\tl10n = wp.media.view.l10n,\n\tImageDetails;\n\nImageDetails = Select.extend({\n\tdefaults: {\n\t\tid:      'image',\n\t\turl:     '',\n\t\tmenu:    'image-details',\n\t\tcontent: 'image-details',\n\t\ttoolbar: 'image-details',\n\t\ttype:    'link',\n\t\ttitle:    l10n.imageDetailsTitle,\n\t\tpriority: 120\n\t},\n\n\tinitialize: function( options ) {\n\t\tthis.image = new wp.media.model.PostImage( options.metadata );\n\t\tthis.options.selection = new wp.media.model.Selection( this.image.attachment, { multiple: false } );\n\t\tSelect.prototype.initialize.apply( this, arguments );\n\t},\n\n\tbindHandlers: function() {\n\t\tSelect.prototype.bindHandlers.apply( this, arguments );\n\t\tthis.on( 'menu:create:image-details', this.createMenu, this );\n\t\tthis.on( 'content:create:image-details', this.imageDetailsContent, this );\n\t\tthis.on( 'content:render:edit-image', this.editImageContent, this );\n\t\tthis.on( 'toolbar:render:image-details', this.renderImageDetailsToolbar, this );\n\t\t// override the select toolbar\n\t\tthis.on( 'toolbar:render:replace', this.renderReplaceImageToolbar, this );\n\t},\n\n\tcreateStates: function() {\n\t\tthis.states.add([\n\t\t\tnew wp.media.controller.ImageDetails({\n\t\t\t\timage: this.image,\n\t\t\t\teditable: false\n\t\t\t}),\n\t\t\tnew wp.media.controller.ReplaceImage({\n\t\t\t\tid: 'replace-image',\n\t\t\t\tlibrary: wp.media.query( { type: 'image' } ),\n\t\t\t\timage: this.image,\n\t\t\t\tmultiple:  false,\n\t\t\t\ttitle:     l10n.imageReplaceTitle,\n\t\t\t\ttoolbar: 'replace',\n\t\t\t\tpriority:  80,\n\t\t\t\tdisplaySettings: true\n\t\t\t}),\n\t\t\tnew wp.media.controller.EditImage( {\n\t\t\t\timage: this.image,\n\t\t\t\tselection: this.options.selection\n\t\t\t} )\n\t\t]);\n\t},\n\n\timageDetailsContent: function( options ) {\n\t\toptions.view = new wp.media.view.ImageDetails({\n\t\t\tcontroller: this,\n\t\t\tmodel: this.state().image,\n\t\t\tattachment: this.state().image.attachment\n\t\t});\n\t},\n\n\teditImageContent: function() {\n\t\tvar state = this.state(),\n\t\t\tmodel = state.get('image'),\n\t\t\tview;\n\n\t\tif ( ! model ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview = new wp.media.view.EditImage( { model: model, controller: this } ).render();\n\n\t\tthis.content.set( view );\n\n\t\t// after bringing in the frame, load the actual editor via an ajax call\n\t\tview.loadEditor();\n\n\t},\n\n\trenderImageDetailsToolbar: function() {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tselect: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.update,\n\t\t\t\t\tpriority: 80,\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state();\n\n\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t// not sure if we want to use wp.media.string.image which will create a shortcode or\n\t\t\t\t\t\t// perhaps wp.html.string to at least to build the <img />\n\t\t\t\t\t\tstate.trigger( 'update', controller.image.toJSON() );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\trenderReplaceImageToolbar: function() {\n\t\tvar frame = this,\n\t\t\tlastState = frame.lastState(),\n\t\t\tprevious = lastState && lastState.id;\n\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tback: {\n\t\t\t\t\ttext:     l10n.back,\n\t\t\t\t\tpriority: 20,\n\t\t\t\t\tclick:    function() {\n\t\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tframe.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\treplace: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.replace,\n\t\t\t\t\tpriority: 80,\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tselection = state.get( 'selection' ),\n\t\t\t\t\t\t\tattachment = selection.single();\n\n\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\tcontroller.image.changeAttachment( attachment, state.display( attachment ) );\n\n\t\t\t\t\t\t// not sure if we want to use wp.media.string.image which will create a shortcode or\n\t\t\t\t\t\t// perhaps wp.html.string to at least to build the <img />\n\t\t\t\t\t\tstate.trigger( 'replace', controller.image.toJSON() );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t}\n\n});\n\nmodule.exports = ImageDetails;\n\n},{}],45:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.Post\n *\n * The frame for manipulating media on the Edit Post page.\n *\n * @class\n * @augments wp.media.view.MediaFrame.Select\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar Select = wp.media.view.MediaFrame.Select,\n\tLibrary = wp.media.controller.Library,\n\tl10n = wp.media.view.l10n,\n\tPost;\n\nPost = Select.extend({\n\tinitialize: function() {\n\t\tthis.counts = {\n\t\t\taudio: {\n\t\t\t\tcount: wp.media.view.settings.attachmentCounts.audio,\n\t\t\t\tstate: 'playlist'\n\t\t\t},\n\t\t\tvideo: {\n\t\t\t\tcount: wp.media.view.settings.attachmentCounts.video,\n\t\t\t\tstate: 'video-playlist'\n\t\t\t}\n\t\t};\n\n\t\t_.defaults( this.options, {\n\t\t\tmultiple:  true,\n\t\t\tediting:   false,\n\t\t\tstate:    'insert',\n\t\t\tmetadata:  {}\n\t\t});\n\n\t\t// Call 'initialize' directly on the parent class.\n\t\tSelect.prototype.initialize.apply( this, arguments );\n\t\tthis.createIframeStates();\n\n\t},\n\n\t/**\n\t * Create the default states.\n\t */\n\tcreateStates: function() {\n\t\tvar options = this.options;\n\n\t\tthis.states.add([\n\t\t\t// Main states.\n\t\t\tnew Library({\n\t\t\t\tid:         'insert',\n\t\t\t\ttitle:      l10n.insertMediaTitle,\n\t\t\t\tpriority:   20,\n\t\t\t\ttoolbar:    'main-insert',\n\t\t\t\tfilterable: 'all',\n\t\t\t\tlibrary:    wp.media.query( options.library ),\n\t\t\t\tmultiple:   options.multiple ? 'reset' : false,\n\t\t\t\teditable:   true,\n\n\t\t\t\t// If the user isn't allowed to edit fields,\n\t\t\t\t// can they still edit it locally?\n\t\t\t\tallowLocalEdits: true,\n\n\t\t\t\t// Show the attachment display settings.\n\t\t\t\tdisplaySettings: true,\n\t\t\t\t// Update user settings when users adjust the\n\t\t\t\t// attachment display settings.\n\t\t\t\tdisplayUserSettings: true\n\t\t\t}),\n\n\t\t\tnew Library({\n\t\t\t\tid:         'gallery',\n\t\t\t\ttitle:      l10n.createGalleryTitle,\n\t\t\t\tpriority:   40,\n\t\t\t\ttoolbar:    'main-gallery',\n\t\t\t\tfilterable: 'uploaded',\n\t\t\t\tmultiple:   'add',\n\t\t\t\teditable:   false,\n\n\t\t\t\tlibrary:  wp.media.query( _.defaults({\n\t\t\t\t\ttype: 'image'\n\t\t\t\t}, options.library ) )\n\t\t\t}),\n\n\t\t\t// Embed states.\n\t\t\tnew wp.media.controller.Embed( { metadata: options.metadata } ),\n\n\t\t\tnew wp.media.controller.EditImage( { model: options.editImage } ),\n\n\t\t\t// Gallery states.\n\t\t\tnew wp.media.controller.GalleryEdit({\n\t\t\t\tlibrary: options.selection,\n\t\t\t\tediting: options.editing,\n\t\t\t\tmenu:    'gallery'\n\t\t\t}),\n\n\t\t\tnew wp.media.controller.GalleryAdd(),\n\n\t\t\tnew Library({\n\t\t\t\tid:         'playlist',\n\t\t\t\ttitle:      l10n.createPlaylistTitle,\n\t\t\t\tpriority:   60,\n\t\t\t\ttoolbar:    'main-playlist',\n\t\t\t\tfilterable: 'uploaded',\n\t\t\t\tmultiple:   'add',\n\t\t\t\teditable:   false,\n\n\t\t\t\tlibrary:  wp.media.query( _.defaults({\n\t\t\t\t\ttype: 'audio'\n\t\t\t\t}, options.library ) )\n\t\t\t}),\n\n\t\t\t// Playlist states.\n\t\t\tnew wp.media.controller.CollectionEdit({\n\t\t\t\ttype: 'audio',\n\t\t\t\tcollectionType: 'playlist',\n\t\t\t\ttitle:          l10n.editPlaylistTitle,\n\t\t\t\tSettingsView:   wp.media.view.Settings.Playlist,\n\t\t\t\tlibrary:        options.selection,\n\t\t\t\tediting:        options.editing,\n\t\t\t\tmenu:           'playlist',\n\t\t\t\tdragInfoText:   l10n.playlistDragInfo,\n\t\t\t\tdragInfo:       false\n\t\t\t}),\n\n\t\t\tnew wp.media.controller.CollectionAdd({\n\t\t\t\ttype: 'audio',\n\t\t\t\tcollectionType: 'playlist',\n\t\t\t\ttitle: l10n.addToPlaylistTitle\n\t\t\t}),\n\n\t\t\tnew Library({\n\t\t\t\tid:         'video-playlist',\n\t\t\t\ttitle:      l10n.createVideoPlaylistTitle,\n\t\t\t\tpriority:   60,\n\t\t\t\ttoolbar:    'main-video-playlist',\n\t\t\t\tfilterable: 'uploaded',\n\t\t\t\tmultiple:   'add',\n\t\t\t\teditable:   false,\n\n\t\t\t\tlibrary:  wp.media.query( _.defaults({\n\t\t\t\t\ttype: 'video'\n\t\t\t\t}, options.library ) )\n\t\t\t}),\n\n\t\t\tnew wp.media.controller.CollectionEdit({\n\t\t\t\ttype: 'video',\n\t\t\t\tcollectionType: 'playlist',\n\t\t\t\ttitle:          l10n.editVideoPlaylistTitle,\n\t\t\t\tSettingsView:   wp.media.view.Settings.Playlist,\n\t\t\t\tlibrary:        options.selection,\n\t\t\t\tediting:        options.editing,\n\t\t\t\tmenu:           'video-playlist',\n\t\t\t\tdragInfoText:   l10n.videoPlaylistDragInfo,\n\t\t\t\tdragInfo:       false\n\t\t\t}),\n\n\t\t\tnew wp.media.controller.CollectionAdd({\n\t\t\t\ttype: 'video',\n\t\t\t\tcollectionType: 'playlist',\n\t\t\t\ttitle: l10n.addToVideoPlaylistTitle\n\t\t\t})\n\t\t]);\n\n\t\tif ( wp.media.view.settings.post.featuredImageId ) {\n\t\t\tthis.states.add( new wp.media.controller.FeaturedImage() );\n\t\t}\n\t},\n\n\tbindHandlers: function() {\n\t\tvar handlers, checkCounts;\n\n\t\tSelect.prototype.bindHandlers.apply( this, arguments );\n\n\t\tthis.on( 'activate', this.activate, this );\n\n\t\t// Only bother checking media type counts if one of the counts is zero\n\t\tcheckCounts = _.find( this.counts, function( type ) {\n\t\t\treturn type.count === 0;\n\t\t} );\n\n\t\tif ( typeof checkCounts !== 'undefined' ) {\n\t\t\tthis.listenTo( wp.media.model.Attachments.all, 'change:type', this.mediaTypeCounts );\n\t\t}\n\n\t\tthis.on( 'menu:create:gallery', this.createMenu, this );\n\t\tthis.on( 'menu:create:playlist', this.createMenu, this );\n\t\tthis.on( 'menu:create:video-playlist', this.createMenu, this );\n\t\tthis.on( 'toolbar:create:main-insert', this.createToolbar, this );\n\t\tthis.on( 'toolbar:create:main-gallery', this.createToolbar, this );\n\t\tthis.on( 'toolbar:create:main-playlist', this.createToolbar, this );\n\t\tthis.on( 'toolbar:create:main-video-playlist', this.createToolbar, this );\n\t\tthis.on( 'toolbar:create:featured-image', this.featuredImageToolbar, this );\n\t\tthis.on( 'toolbar:create:main-embed', this.mainEmbedToolbar, this );\n\n\t\thandlers = {\n\t\t\tmenu: {\n\t\t\t\t'default': 'mainMenu',\n\t\t\t\t'gallery': 'galleryMenu',\n\t\t\t\t'playlist': 'playlistMenu',\n\t\t\t\t'video-playlist': 'videoPlaylistMenu'\n\t\t\t},\n\n\t\t\tcontent: {\n\t\t\t\t'embed':          'embedContent',\n\t\t\t\t'edit-image':     'editImageContent',\n\t\t\t\t'edit-selection': 'editSelectionContent'\n\t\t\t},\n\n\t\t\ttoolbar: {\n\t\t\t\t'main-insert':      'mainInsertToolbar',\n\t\t\t\t'main-gallery':     'mainGalleryToolbar',\n\t\t\t\t'gallery-edit':     'galleryEditToolbar',\n\t\t\t\t'gallery-add':      'galleryAddToolbar',\n\t\t\t\t'main-playlist':\t'mainPlaylistToolbar',\n\t\t\t\t'playlist-edit':\t'playlistEditToolbar',\n\t\t\t\t'playlist-add':\t\t'playlistAddToolbar',\n\t\t\t\t'main-video-playlist': 'mainVideoPlaylistToolbar',\n\t\t\t\t'video-playlist-edit': 'videoPlaylistEditToolbar',\n\t\t\t\t'video-playlist-add': 'videoPlaylistAddToolbar'\n\t\t\t}\n\t\t};\n\n\t\t_.each( handlers, function( regionHandlers, region ) {\n\t\t\t_.each( regionHandlers, function( callback, handler ) {\n\t\t\t\tthis.on( region + ':render:' + handler, this[ callback ], this );\n\t\t\t}, this );\n\t\t}, this );\n\t},\n\n\tactivate: function() {\n\t\t// Hide menu items for states tied to particular media types if there are no items\n\t\t_.each( this.counts, function( type ) {\n\t\t\tif ( type.count < 1 ) {\n\t\t\t\tthis.menuItemVisibility( type.state, 'hide' );\n\t\t\t}\n\t\t}, this );\n\t},\n\n\tmediaTypeCounts: function( model, attr ) {\n\t\tif ( typeof this.counts[ attr ] !== 'undefined' && this.counts[ attr ].count < 1 ) {\n\t\t\tthis.counts[ attr ].count++;\n\t\t\tthis.menuItemVisibility( this.counts[ attr ].state, 'show' );\n\t\t}\n\t},\n\n\t// Menus\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tmainMenu: function( view ) {\n\t\tview.set({\n\t\t\t'library-separator': new wp.media.View({\n\t\t\t\tclassName: 'separator',\n\t\t\t\tpriority: 100\n\t\t\t})\n\t\t});\n\t},\n\n\tmenuItemVisibility: function( state, visibility ) {\n\t\tvar menu = this.menu.get();\n\t\tif ( visibility === 'hide' ) {\n\t\t\tmenu.hide( state );\n\t\t} else if ( visibility === 'show' ) {\n\t\t\tmenu.show( state );\n\t\t}\n\t},\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tgalleryMenu: function( view ) {\n\t\tvar lastState = this.lastState(),\n\t\t\tprevious = lastState && lastState.id,\n\t\t\tframe = this;\n\n\t\tview.set({\n\t\t\tcancel: {\n\t\t\t\ttext:     l10n.cancelGalleryTitle,\n\t\t\t\tpriority: 20,\n\t\t\t\tclick:    function() {\n\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframe.close();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Keep focus inside media modal\n\t\t\t\t\t// after canceling a gallery\n\t\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t\t}\n\t\t\t},\n\t\t\tseparateCancel: new wp.media.View({\n\t\t\t\tclassName: 'separator',\n\t\t\t\tpriority: 40\n\t\t\t})\n\t\t});\n\t},\n\n\tplaylistMenu: function( view ) {\n\t\tvar lastState = this.lastState(),\n\t\t\tprevious = lastState && lastState.id,\n\t\t\tframe = this;\n\n\t\tview.set({\n\t\t\tcancel: {\n\t\t\t\ttext:     l10n.cancelPlaylistTitle,\n\t\t\t\tpriority: 20,\n\t\t\t\tclick:    function() {\n\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframe.close();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tseparateCancel: new wp.media.View({\n\t\t\t\tclassName: 'separator',\n\t\t\t\tpriority: 40\n\t\t\t})\n\t\t});\n\t},\n\n\tvideoPlaylistMenu: function( view ) {\n\t\tvar lastState = this.lastState(),\n\t\t\tprevious = lastState && lastState.id,\n\t\t\tframe = this;\n\n\t\tview.set({\n\t\t\tcancel: {\n\t\t\t\ttext:     l10n.cancelVideoPlaylistTitle,\n\t\t\t\tpriority: 20,\n\t\t\t\tclick:    function() {\n\t\t\t\t\tif ( previous ) {\n\t\t\t\t\t\tframe.setState( previous );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tframe.close();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tseparateCancel: new wp.media.View({\n\t\t\t\tclassName: 'separator',\n\t\t\t\tpriority: 40\n\t\t\t})\n\t\t});\n\t},\n\n\t// Content\n\tembedContent: function() {\n\t\tvar view = new wp.media.view.Embed({\n\t\t\tcontroller: this,\n\t\t\tmodel:      this.state()\n\t\t}).render();\n\n\t\tthis.content.set( view );\n\n\t\tif ( ! wp.media.isTouchDevice ) {\n\t\t\tview.url.focus();\n\t\t}\n\t},\n\n\teditSelectionContent: function() {\n\t\tvar state = this.state(),\n\t\t\tselection = state.get('selection'),\n\t\t\tview;\n\n\t\tview = new wp.media.view.AttachmentsBrowser({\n\t\t\tcontroller: this,\n\t\t\tcollection: selection,\n\t\t\tselection:  selection,\n\t\t\tmodel:      state,\n\t\t\tsortable:   true,\n\t\t\tsearch:     false,\n\t\t\tdate:       false,\n\t\t\tdragInfo:   true,\n\n\t\t\tAttachmentView: wp.media.view.Attachments.EditSelection\n\t\t}).render();\n\n\t\tview.toolbar.set( 'backToLibrary', {\n\t\t\ttext:     l10n.returnToLibrary,\n\t\t\tpriority: -100,\n\n\t\t\tclick: function() {\n\t\t\t\tthis.controller.content.mode('browse');\n\t\t\t}\n\t\t});\n\n\t\t// Browse our library of attachments.\n\t\tthis.content.set( view );\n\n\t\t// Trigger the controller to set focus\n\t\tthis.trigger( 'edit:selection', this );\n\t},\n\n\teditImageContent: function() {\n\t\tvar image = this.state().get('image'),\n\t\t\tview = new wp.media.view.EditImage( { model: image, controller: this } ).render();\n\n\t\tthis.content.set( view );\n\n\t\t// after creating the wrapper view, load the actual editor via an ajax call\n\t\tview.loadEditor();\n\n\t},\n\n\t// Toolbars\n\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tselectionStatusToolbar: function( view ) {\n\t\tvar editable = this.state().get('editable');\n\n\t\tview.set( 'selection', new wp.media.view.Selection({\n\t\t\tcontroller: this,\n\t\t\tcollection: this.state().get('selection'),\n\t\t\tpriority:   -40,\n\n\t\t\t// If the selection is editable, pass the callback to\n\t\t\t// switch the content mode.\n\t\t\teditable: editable && function() {\n\t\t\t\tthis.controller.content.mode('edit-selection');\n\t\t\t}\n\t\t}).render() );\n\t},\n\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tmainInsertToolbar: function( view ) {\n\t\tvar controller = this;\n\n\t\tthis.selectionStatusToolbar( view );\n\n\t\tview.set( 'insert', {\n\t\t\tstyle:    'primary',\n\t\t\tpriority: 80,\n\t\t\ttext:     l10n.insertIntoPost,\n\t\t\trequires: { selection: true },\n\n\t\t\t/**\n\t\t\t * @fires wp.media.controller.State#insert\n\t\t\t */\n\t\t\tclick: function() {\n\t\t\t\tvar state = controller.state(),\n\t\t\t\t\tselection = state.get('selection');\n\n\t\t\t\tcontroller.close();\n\t\t\t\tstate.trigger( 'insert', selection ).reset();\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * @param {wp.Backbone.View} view\n\t */\n\tmainGalleryToolbar: function( view ) {\n\t\tvar controller = this;\n\n\t\tthis.selectionStatusToolbar( view );\n\n\t\tview.set( 'gallery', {\n\t\t\tstyle:    'primary',\n\t\t\ttext:     l10n.createNewGallery,\n\t\t\tpriority: 60,\n\t\t\trequires: { selection: true },\n\n\t\t\tclick: function() {\n\t\t\t\tvar selection = controller.state().get('selection'),\n\t\t\t\t\tedit = controller.state('gallery-edit'),\n\t\t\t\t\tmodels = selection.where({ type: 'image' });\n\n\t\t\t\tedit.set( 'library', new wp.media.model.Selection( models, {\n\t\t\t\t\tprops:    selection.props.toJSON(),\n\t\t\t\t\tmultiple: true\n\t\t\t\t}) );\n\n\t\t\t\tthis.controller.setState('gallery-edit');\n\n\t\t\t\t// Keep focus inside media modal\n\t\t\t\t// after jumping to gallery view\n\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t}\n\t\t});\n\t},\n\n\tmainPlaylistToolbar: function( view ) {\n\t\tvar controller = this;\n\n\t\tthis.selectionStatusToolbar( view );\n\n\t\tview.set( 'playlist', {\n\t\t\tstyle:    'primary',\n\t\t\ttext:     l10n.createNewPlaylist,\n\t\t\tpriority: 100,\n\t\t\trequires: { selection: true },\n\n\t\t\tclick: function() {\n\t\t\t\tvar selection = controller.state().get('selection'),\n\t\t\t\t\tedit = controller.state('playlist-edit'),\n\t\t\t\t\tmodels = selection.where({ type: 'audio' });\n\n\t\t\t\tedit.set( 'library', new wp.media.model.Selection( models, {\n\t\t\t\t\tprops:    selection.props.toJSON(),\n\t\t\t\t\tmultiple: true\n\t\t\t\t}) );\n\n\t\t\t\tthis.controller.setState('playlist-edit');\n\n\t\t\t\t// Keep focus inside media modal\n\t\t\t\t// after jumping to playlist view\n\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t}\n\t\t});\n\t},\n\n\tmainVideoPlaylistToolbar: function( view ) {\n\t\tvar controller = this;\n\n\t\tthis.selectionStatusToolbar( view );\n\n\t\tview.set( 'video-playlist', {\n\t\t\tstyle:    'primary',\n\t\t\ttext:     l10n.createNewVideoPlaylist,\n\t\t\tpriority: 100,\n\t\t\trequires: { selection: true },\n\n\t\t\tclick: function() {\n\t\t\t\tvar selection = controller.state().get('selection'),\n\t\t\t\t\tedit = controller.state('video-playlist-edit'),\n\t\t\t\t\tmodels = selection.where({ type: 'video' });\n\n\t\t\t\tedit.set( 'library', new wp.media.model.Selection( models, {\n\t\t\t\t\tprops:    selection.props.toJSON(),\n\t\t\t\t\tmultiple: true\n\t\t\t\t}) );\n\n\t\t\t\tthis.controller.setState('video-playlist-edit');\n\n\t\t\t\t// Keep focus inside media modal\n\t\t\t\t// after jumping to video playlist view\n\t\t\t\tthis.controller.modal.focusManager.focus();\n\t\t\t}\n\t\t});\n\t},\n\n\tfeaturedImageToolbar: function( toolbar ) {\n\t\tthis.createSelectToolbar( toolbar, {\n\t\t\ttext:  l10n.setFeaturedImage,\n\t\t\tstate: this.options.state\n\t\t});\n\t},\n\n\tmainEmbedToolbar: function( toolbar ) {\n\t\ttoolbar.view = new wp.media.view.Toolbar.Embed({\n\t\t\tcontroller: this\n\t\t});\n\t},\n\n\tgalleryEditToolbar: function() {\n\t\tvar editing = this.state().get('editing');\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     editing ? l10n.updateGallery : l10n.insertGallery,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { library: true },\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @fires wp.media.controller.State#update\n\t\t\t\t\t */\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state();\n\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\tstate.trigger( 'update', state.get('library') );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tgalleryAddToolbar: function() {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.addToGallery,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { selection: true },\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @fires wp.media.controller.State#reset\n\t\t\t\t\t */\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tedit = controller.state('gallery-edit');\n\n\t\t\t\t\t\tedit.get('library').add( state.get('selection').models );\n\t\t\t\t\t\tstate.trigger('reset');\n\t\t\t\t\t\tcontroller.setState('gallery-edit');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tplaylistEditToolbar: function() {\n\t\tvar editing = this.state().get('editing');\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     editing ? l10n.updatePlaylist : l10n.insertPlaylist,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { library: true },\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @fires wp.media.controller.State#update\n\t\t\t\t\t */\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state();\n\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\tstate.trigger( 'update', state.get('library') );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tplaylistAddToolbar: function() {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.addToPlaylist,\n\t\t\t\t\tpriority: 80,\n\t\t\t\t\trequires: { selection: true },\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @fires wp.media.controller.State#reset\n\t\t\t\t\t */\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tedit = controller.state('playlist-edit');\n\n\t\t\t\t\t\tedit.get('library').add( state.get('selection').models );\n\t\t\t\t\t\tstate.trigger('reset');\n\t\t\t\t\t\tcontroller.setState('playlist-edit');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tvideoPlaylistEditToolbar: function() {\n\t\tvar editing = this.state().get('editing');\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     editing ? l10n.updateVideoPlaylist : l10n.insertVideoPlaylist,\n\t\t\t\t\tpriority: 140,\n\t\t\t\t\trequires: { library: true },\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tlibrary = state.get('library');\n\n\t\t\t\t\t\tlibrary.type = 'video';\n\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\tstate.trigger( 'update', library );\n\n\t\t\t\t\t\t// Restore and reset the default state.\n\t\t\t\t\t\tcontroller.setState( controller.options.state );\n\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t},\n\n\tvideoPlaylistAddToolbar: function() {\n\t\tthis.toolbar.set( new wp.media.view.Toolbar({\n\t\t\tcontroller: this,\n\t\t\titems: {\n\t\t\t\tinsert: {\n\t\t\t\t\tstyle:    'primary',\n\t\t\t\t\ttext:     l10n.addToVideoPlaylist,\n\t\t\t\t\tpriority: 140,\n\t\t\t\t\trequires: { selection: true },\n\n\t\t\t\t\tclick: function() {\n\t\t\t\t\t\tvar controller = this.controller,\n\t\t\t\t\t\t\tstate = controller.state(),\n\t\t\t\t\t\t\tedit = controller.state('video-playlist-edit');\n\n\t\t\t\t\t\tedit.get('library').add( state.get('selection').models );\n\t\t\t\t\t\tstate.trigger('reset');\n\t\t\t\t\t\tcontroller.setState('video-playlist-edit');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}) );\n\t}\n});\n\nmodule.exports = Post;\n\n},{}],46:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame.Select\n *\n * A frame for selecting an item or items from the media library.\n *\n * @class\n * @augments wp.media.view.MediaFrame\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\n\nvar MediaFrame = wp.media.view.MediaFrame,\n\tl10n = wp.media.view.l10n,\n\tSelect;\n\nSelect = MediaFrame.extend({\n\tinitialize: function() {\n\t\t// Call 'initialize' directly on the parent class.\n\t\tMediaFrame.prototype.initialize.apply( this, arguments );\n\n\t\t_.defaults( this.options, {\n\t\t\tselection: [],\n\t\t\tlibrary:   {},\n\t\t\tmultiple:  false,\n\t\t\tstate:    'library'\n\t\t});\n\n\t\tthis.createSelection();\n\t\tthis.createStates();\n\t\tthis.bindHandlers();\n\t},\n\n\t/**\n\t * Attach a selection collection to the frame.\n\t *\n\t * A selection is a collection of attachments used for a specific purpose\n\t * by a media frame. e.g. Selecting an attachment (or many) to insert into\n\t * post content.\n\t *\n\t * @see media.model.Selection\n\t */\n\tcreateSelection: function() {\n\t\tvar selection = this.options.selection;\n\n\t\tif ( ! (selection instanceof wp.media.model.Selection) ) {\n\t\t\tthis.options.selection = new wp.media.model.Selection( selection, {\n\t\t\t\tmultiple: this.options.multiple\n\t\t\t});\n\t\t}\n\n\t\tthis._selection = {\n\t\t\tattachments: new wp.media.model.Attachments(),\n\t\t\tdifference: []\n\t\t};\n\t},\n\n\t/**\n\t * Create the default states on the frame.\n\t */\n\tcreateStates: function() {\n\t\tvar options = this.options;\n\n\t\tif ( this.options.states ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add the default states.\n\t\tthis.states.add([\n\t\t\t// Main states.\n\t\t\tnew wp.media.controller.Library({\n\t\t\t\tlibrary:   wp.media.query( options.library ),\n\t\t\t\tmultiple:  options.multiple,\n\t\t\t\ttitle:     options.title,\n\t\t\t\tpriority:  20\n\t\t\t})\n\t\t]);\n\t},\n\n\t/**\n\t * Bind region mode event callbacks.\n\t *\n\t * @see media.controller.Region.render\n\t */\n\tbindHandlers: function() {\n\t\tthis.on( 'router:create:browse', this.createRouter, this );\n\t\tthis.on( 'router:render:browse', this.browseRouter, this );\n\t\tthis.on( 'content:create:browse', this.browseContent, this );\n\t\tthis.on( 'content:render:upload', this.uploadContent, this );\n\t\tthis.on( 'toolbar:create:select', this.createSelectToolbar, this );\n\t},\n\n\t/**\n\t * Render callback for the router region in the `browse` mode.\n\t *\n\t * @param {wp.media.view.Router} routerView\n\t */\n\tbrowseRouter: function( routerView ) {\n\t\trouterView.set({\n\t\t\tupload: {\n\t\t\t\ttext:     l10n.uploadFilesTitle,\n\t\t\t\tpriority: 20\n\t\t\t},\n\t\t\tbrowse: {\n\t\t\t\ttext:     l10n.mediaLibraryTitle,\n\t\t\t\tpriority: 40\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * Render callback for the content region in the `browse` mode.\n\t *\n\t * @param {wp.media.controller.Region} contentRegion\n\t */\n\tbrowseContent: function( contentRegion ) {\n\t\tvar state = this.state();\n\n\t\tthis.$el.removeClass('hide-toolbar');\n\n\t\t// Browse our library of attachments.\n\t\tcontentRegion.view = new wp.media.view.AttachmentsBrowser({\n\t\t\tcontroller: this,\n\t\t\tcollection: state.get('library'),\n\t\t\tselection:  state.get('selection'),\n\t\t\tmodel:      state,\n\t\t\tsortable:   state.get('sortable'),\n\t\t\tsearch:     state.get('searchable'),\n\t\t\tfilters:    state.get('filterable'),\n\t\t\tdate:       state.get('date'),\n\t\t\tdisplay:    state.has('display') ? state.get('display') : state.get('displaySettings'),\n\t\t\tdragInfo:   state.get('dragInfo'),\n\n\t\t\tidealColumnWidth: state.get('idealColumnWidth'),\n\t\t\tsuggestedWidth:   state.get('suggestedWidth'),\n\t\t\tsuggestedHeight:  state.get('suggestedHeight'),\n\n\t\t\tAttachmentView: state.get('AttachmentView')\n\t\t});\n\t},\n\n\t/**\n\t * Render callback for the content region in the `upload` mode.\n\t */\n\tuploadContent: function() {\n\t\tthis.$el.removeClass( 'hide-toolbar' );\n\t\tthis.content.set( new wp.media.view.UploaderInline({\n\t\t\tcontroller: this\n\t\t}) );\n\t},\n\n\t/**\n\t * Toolbars\n\t *\n\t * @param {Object} toolbar\n\t * @param {Object} [options={}]\n\t * @this wp.media.controller.Region\n\t */\n\tcreateSelectToolbar: function( toolbar, options ) {\n\t\toptions = options || this.options.button || {};\n\t\toptions.controller = this;\n\n\t\ttoolbar.view = new wp.media.view.Toolbar.Select( options );\n\t}\n});\n\nmodule.exports = Select;\n\n},{}],47:[function(require,module,exports){\n/**\n * wp.media.view.Iframe\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Iframe = wp.media.View.extend({\n\tclassName: 'media-iframe',\n\t/**\n\t * @returns {wp.media.view.Iframe} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tthis.views.detach();\n\t\tthis.$el.html( '<iframe src=\"' + this.controller.state().get('src') + '\" />' );\n\t\tthis.views.render();\n\t\treturn this;\n\t}\n});\n\nmodule.exports = Iframe;\n\n},{}],48:[function(require,module,exports){\n/**\n * wp.media.view.ImageDetails\n *\n * @class\n * @augments wp.media.view.Settings.AttachmentDisplay\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar AttachmentDisplay = wp.media.view.Settings.AttachmentDisplay,\n\t$ = jQuery,\n\tImageDetails;\n\nImageDetails = AttachmentDisplay.extend({\n\tclassName: 'image-details',\n\ttemplate:  wp.template('image-details'),\n\tevents: _.defaults( AttachmentDisplay.prototype.events, {\n\t\t'click .edit-attachment': 'editAttachment',\n\t\t'click .replace-attachment': 'replaceAttachment',\n\t\t'click .advanced-toggle': 'onToggleAdvanced',\n\t\t'change [data-setting=\"customWidth\"]': 'onCustomSize',\n\t\t'change [data-setting=\"customHeight\"]': 'onCustomSize',\n\t\t'keyup [data-setting=\"customWidth\"]': 'onCustomSize',\n\t\t'keyup [data-setting=\"customHeight\"]': 'onCustomSize'\n\t} ),\n\tinitialize: function() {\n\t\t// used in AttachmentDisplay.prototype.updateLinkTo\n\t\tthis.options.attachment = this.model.attachment;\n\t\tthis.listenTo( this.model, 'change:url', this.updateUrl );\n\t\tthis.listenTo( this.model, 'change:link', this.toggleLinkSettings );\n\t\tthis.listenTo( this.model, 'change:size', this.toggleCustomSize );\n\n\t\tAttachmentDisplay.prototype.initialize.apply( this, arguments );\n\t},\n\n\tprepare: function() {\n\t\tvar attachment = false;\n\n\t\tif ( this.model.attachment ) {\n\t\t\tattachment = this.model.attachment.toJSON();\n\t\t}\n\t\treturn _.defaults({\n\t\t\tmodel: this.model.toJSON(),\n\t\t\tattachment: attachment\n\t\t}, this.options );\n\t},\n\n\trender: function() {\n\t\tvar args = arguments;\n\n\t\tif ( this.model.attachment && 'pending' === this.model.dfd.state() ) {\n\t\t\tthis.model.dfd\n\t\t\t\t.done( _.bind( function() {\n\t\t\t\t\tAttachmentDisplay.prototype.render.apply( this, args );\n\t\t\t\t\tthis.postRender();\n\t\t\t\t}, this ) )\n\t\t\t\t.fail( _.bind( function() {\n\t\t\t\t\tthis.model.attachment = false;\n\t\t\t\t\tAttachmentDisplay.prototype.render.apply( this, args );\n\t\t\t\t\tthis.postRender();\n\t\t\t\t}, this ) );\n\t\t} else {\n\t\t\tAttachmentDisplay.prototype.render.apply( this, arguments );\n\t\t\tthis.postRender();\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tpostRender: function() {\n\t\tsetTimeout( _.bind( this.resetFocus, this ), 10 );\n\t\tthis.toggleLinkSettings();\n\t\tif ( window.getUserSetting( 'advImgDetails' ) === 'show' ) {\n\t\t\tthis.toggleAdvanced( true );\n\t\t}\n\t\tthis.trigger( 'post-render' );\n\t},\n\n\tresetFocus: function() {\n\t\tthis.$( '.link-to-custom' ).blur();\n\t\tthis.$( '.embed-media-settings' ).scrollTop( 0 );\n\t},\n\n\tupdateUrl: function() {\n\t\tthis.$( '.image img' ).attr( 'src', this.model.get( 'url' ) );\n\t\tthis.$( '.url' ).val( this.model.get( 'url' ) );\n\t},\n\n\ttoggleLinkSettings: function() {\n\t\tif ( this.model.get( 'link' ) === 'none' ) {\n\t\t\tthis.$( '.link-settings' ).addClass('hidden');\n\t\t} else {\n\t\t\tthis.$( '.link-settings' ).removeClass('hidden');\n\t\t}\n\t},\n\n\ttoggleCustomSize: function() {\n\t\tif ( this.model.get( 'size' ) !== 'custom' ) {\n\t\t\tthis.$( '.custom-size' ).addClass('hidden');\n\t\t} else {\n\t\t\tthis.$( '.custom-size' ).removeClass('hidden');\n\t\t}\n\t},\n\n\tonCustomSize: function( event ) {\n\t\tvar dimension = $( event.target ).data('setting'),\n\t\t\tnum = $( event.target ).val(),\n\t\t\tvalue;\n\n\t\t// Ignore bogus input\n\t\tif ( ! /^\\d+/.test( num ) || parseInt( num, 10 ) < 1 ) {\n\t\t\tevent.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( dimension === 'customWidth' ) {\n\t\t\tvalue = Math.round( 1 / this.model.get( 'aspectRatio' ) * num );\n\t\t\tthis.model.set( 'customHeight', value, { silent: true } );\n\t\t\tthis.$( '[data-setting=\"customHeight\"]' ).val( value );\n\t\t} else {\n\t\t\tvalue = Math.round( this.model.get( 'aspectRatio' ) * num );\n\t\t\tthis.model.set( 'customWidth', value, { silent: true  } );\n\t\t\tthis.$( '[data-setting=\"customWidth\"]' ).val( value );\n\t\t}\n\t},\n\n\tonToggleAdvanced: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.toggleAdvanced();\n\t},\n\n\ttoggleAdvanced: function( show ) {\n\t\tvar $advanced = this.$el.find( '.advanced-section' ),\n\t\t\tmode;\n\n\t\tif ( $advanced.hasClass('advanced-visible') || show === false ) {\n\t\t\t$advanced.removeClass('advanced-visible');\n\t\t\t$advanced.find('.advanced-settings').addClass('hidden');\n\t\t\tmode = 'hide';\n\t\t} else {\n\t\t\t$advanced.addClass('advanced-visible');\n\t\t\t$advanced.find('.advanced-settings').removeClass('hidden');\n\t\t\tmode = 'show';\n\t\t}\n\n\t\twindow.setUserSetting( 'advImgDetails', mode );\n\t},\n\n\teditAttachment: function( event ) {\n\t\tvar editState = this.controller.states.get( 'edit-image' );\n\n\t\tif ( window.imageEdit && editState ) {\n\t\t\tevent.preventDefault();\n\t\t\teditState.set( 'image', this.model.attachment );\n\t\t\tthis.controller.setState( 'edit-image' );\n\t\t}\n\t},\n\n\treplaceAttachment: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.controller.setState( 'replace-image' );\n\t}\n});\n\nmodule.exports = ImageDetails;\n\n},{}],49:[function(require,module,exports){\n/**\n * wp.media.view.Label\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Label = wp.media.View.extend({\n\ttagName: 'label',\n\tclassName: 'screen-reader-text',\n\n\tinitialize: function() {\n\t\tthis.value = this.options.value;\n\t},\n\n\trender: function() {\n\t\tthis.$el.html( this.value );\n\n\t\treturn this;\n\t}\n});\n\nmodule.exports = Label;\n\n},{}],50:[function(require,module,exports){\n/**\n * wp.media.view.MediaFrame\n *\n * The frame used to create the media modal.\n *\n * @class\n * @augments wp.media.view.Frame\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n * @mixes wp.media.controller.StateMachine\n */\nvar Frame = wp.media.view.Frame,\n\t$ = jQuery,\n\tMediaFrame;\n\nMediaFrame = Frame.extend({\n\tclassName: 'media-frame',\n\ttemplate:  wp.template('media-frame'),\n\tregions:   ['menu','title','content','toolbar','router'],\n\n\tevents: {\n\t\t'click div.media-frame-title h1': 'toggleMenu'\n\t},\n\n\t/**\n\t * @global wp.Uploader\n\t */\n\tinitialize: function() {\n\t\tFrame.prototype.initialize.apply( this, arguments );\n\n\t\t_.defaults( this.options, {\n\t\t\ttitle:    '',\n\t\t\tmodal:    true,\n\t\t\tuploader: true\n\t\t});\n\n\t\t// Ensure core UI is enabled.\n\t\tthis.$el.addClass('wp-core-ui');\n\n\t\t// Initialize modal container view.\n\t\tif ( this.options.modal ) {\n\t\t\tthis.modal = new wp.media.view.Modal({\n\t\t\t\tcontroller: this,\n\t\t\t\ttitle:      this.options.title\n\t\t\t});\n\n\t\t\tthis.modal.content( this );\n\t\t}\n\n\t\t// Force the uploader off if the upload limit has been exceeded or\n\t\t// if the browser isn't supported.\n\t\tif ( wp.Uploader.limitExceeded || ! wp.Uploader.browser.supported ) {\n\t\t\tthis.options.uploader = false;\n\t\t}\n\n\t\t// Initialize window-wide uploader.\n\t\tif ( this.options.uploader ) {\n\t\t\tthis.uploader = new wp.media.view.UploaderWindow({\n\t\t\t\tcontroller: this,\n\t\t\t\tuploader: {\n\t\t\t\t\tdropzone:  this.modal ? this.modal.$el : this.$el,\n\t\t\t\t\tcontainer: this.$el\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.views.set( '.media-frame-uploader', this.uploader );\n\t\t}\n\n\t\tthis.on( 'attach', _.bind( this.views.ready, this.views ), this );\n\n\t\t// Bind default title creation.\n\t\tthis.on( 'title:create:default', this.createTitle, this );\n\t\tthis.title.mode('default');\n\n\t\tthis.on( 'title:render', function( view ) {\n\t\t\tview.$el.append( '<span class=\"dashicons dashicons-arrow-down\"></span>' );\n\t\t});\n\n\t\t// Bind default menu.\n\t\tthis.on( 'menu:create:default', this.createMenu, this );\n\t},\n\t/**\n\t * @returns {wp.media.view.MediaFrame} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\t// Activate the default state if no active state exists.\n\t\tif ( ! this.state() && this.options.state ) {\n\t\t\tthis.setState( this.options.state );\n\t\t}\n\t\t/**\n\t\t * call 'render' directly on the parent class\n\t\t */\n\t\treturn Frame.prototype.render.apply( this, arguments );\n\t},\n\t/**\n\t * @param {Object} title\n\t * @this wp.media.controller.Region\n\t */\n\tcreateTitle: function( title ) {\n\t\ttitle.view = new wp.media.View({\n\t\t\tcontroller: this,\n\t\t\ttagName: 'h1'\n\t\t});\n\t},\n\t/**\n\t * @param {Object} menu\n\t * @this wp.media.controller.Region\n\t */\n\tcreateMenu: function( menu ) {\n\t\tmenu.view = new wp.media.view.Menu({\n\t\t\tcontroller: this\n\t\t});\n\t},\n\n\ttoggleMenu: function() {\n\t\tthis.$el.find( '.media-menu' ).toggleClass( 'visible' );\n\t},\n\n\t/**\n\t * @param {Object} toolbar\n\t * @this wp.media.controller.Region\n\t */\n\tcreateToolbar: function( toolbar ) {\n\t\ttoolbar.view = new wp.media.view.Toolbar({\n\t\t\tcontroller: this\n\t\t});\n\t},\n\t/**\n\t * @param {Object} router\n\t * @this wp.media.controller.Region\n\t */\n\tcreateRouter: function( router ) {\n\t\trouter.view = new wp.media.view.Router({\n\t\t\tcontroller: this\n\t\t});\n\t},\n\t/**\n\t * @param {Object} options\n\t */\n\tcreateIframeStates: function( options ) {\n\t\tvar settings = wp.media.view.settings,\n\t\t\ttabs = settings.tabs,\n\t\t\ttabUrl = settings.tabUrl,\n\t\t\t$postId;\n\n\t\tif ( ! tabs || ! tabUrl ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add the post ID to the tab URL if it exists.\n\t\t$postId = $('#post_ID');\n\t\tif ( $postId.length ) {\n\t\t\ttabUrl += '&post_id=' + $postId.val();\n\t\t}\n\n\t\t// Generate the tab states.\n\t\t_.each( tabs, function( title, id ) {\n\t\t\tthis.state( 'iframe:' + id ).set( _.defaults({\n\t\t\t\ttab:     id,\n\t\t\t\tsrc:     tabUrl + '&tab=' + id,\n\t\t\t\ttitle:   title,\n\t\t\t\tcontent: 'iframe',\n\t\t\t\tmenu:    'default'\n\t\t\t}, options ) );\n\t\t}, this );\n\n\t\tthis.on( 'content:create:iframe', this.iframeContent, this );\n\t\tthis.on( 'content:deactivate:iframe', this.iframeContentCleanup, this );\n\t\tthis.on( 'menu:render:default', this.iframeMenu, this );\n\t\tthis.on( 'open', this.hijackThickbox, this );\n\t\tthis.on( 'close', this.restoreThickbox, this );\n\t},\n\n\t/**\n\t * @param {Object} content\n\t * @this wp.media.controller.Region\n\t */\n\tiframeContent: function( content ) {\n\t\tthis.$el.addClass('hide-toolbar');\n\t\tcontent.view = new wp.media.view.Iframe({\n\t\t\tcontroller: this\n\t\t});\n\t},\n\n\tiframeContentCleanup: function() {\n\t\tthis.$el.removeClass('hide-toolbar');\n\t},\n\n\tiframeMenu: function( view ) {\n\t\tvar views = {};\n\n\t\tif ( ! view ) {\n\t\t\treturn;\n\t\t}\n\n\t\t_.each( wp.media.view.settings.tabs, function( title, id ) {\n\t\t\tviews[ 'iframe:' + id ] = {\n\t\t\t\ttext: this.state( 'iframe:' + id ).get('title'),\n\t\t\t\tpriority: 200\n\t\t\t};\n\t\t}, this );\n\n\t\tview.set( views );\n\t},\n\n\thijackThickbox: function() {\n\t\tvar frame = this;\n\n\t\tif ( ! window.tb_remove || this._tb_remove ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._tb_remove = window.tb_remove;\n\t\twindow.tb_remove = function() {\n\t\t\tframe.close();\n\t\t\tframe.reset();\n\t\t\tframe.setState( frame.options.state );\n\t\t\tframe._tb_remove.call( window );\n\t\t};\n\t},\n\n\trestoreThickbox: function() {\n\t\tif ( ! this._tb_remove ) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.tb_remove = this._tb_remove;\n\t\tdelete this._tb_remove;\n\t}\n});\n\n// Map some of the modal's methods to the frame.\n_.each(['open','close','attach','detach','escape'], function( method ) {\n\t/**\n\t * @returns {wp.media.view.MediaFrame} Returns itself to allow chaining\n\t */\n\tMediaFrame.prototype[ method ] = function() {\n\t\tif ( this.modal ) {\n\t\t\tthis.modal[ method ].apply( this.modal, arguments );\n\t\t}\n\t\treturn this;\n\t};\n});\n\nmodule.exports = MediaFrame;\n\n},{}],51:[function(require,module,exports){\n/**\n * wp.media.view.MenuItem\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar $ = jQuery,\n\tMenuItem;\n\nMenuItem = wp.media.View.extend({\n\ttagName:   'a',\n\tclassName: 'media-menu-item',\n\n\tattributes: {\n\t\thref: '#'\n\t},\n\n\tevents: {\n\t\t'click': '_click'\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\t_click: function( event ) {\n\t\tvar clickOverride = this.options.click;\n\n\t\tif ( event ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t\tif ( clickOverride ) {\n\t\t\tclickOverride.call( this );\n\t\t} else {\n\t\t\tthis.click();\n\t\t}\n\n\t\t// When selecting a tab along the left side,\n\t\t// focus should be transferred into the main panel\n\t\tif ( ! wp.media.isTouchDevice ) {\n\t\t\t$('.media-frame-content input').first().focus();\n\t\t}\n\t},\n\n\tclick: function() {\n\t\tvar state = this.options.state;\n\n\t\tif ( state ) {\n\t\t\tthis.controller.setState( state );\n\t\t\tthis.views.parent.$el.removeClass( 'visible' ); // TODO: or hide on any click, see below\n\t\t}\n\t},\n\t/**\n\t * @returns {wp.media.view.MenuItem} returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tvar options = this.options;\n\n\t\tif ( options.text ) {\n\t\t\tthis.$el.text( options.text );\n\t\t} else if ( options.html ) {\n\t\t\tthis.$el.html( options.html );\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nmodule.exports = MenuItem;\n\n},{}],52:[function(require,module,exports){\n/**\n * wp.media.view.Menu\n *\n * @class\n * @augments wp.media.view.PriorityList\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar MenuItem = wp.media.view.MenuItem,\n\tPriorityList = wp.media.view.PriorityList,\n\tMenu;\n\nMenu = PriorityList.extend({\n\ttagName:   'div',\n\tclassName: 'media-menu',\n\tproperty:  'state',\n\tItemView:  MenuItem,\n\tregion:    'menu',\n\n\t/* TODO: alternatively hide on any click anywhere\n\tevents: {\n\t\t'click': 'click'\n\t},\n\n\tclick: function() {\n\t\tthis.$el.removeClass( 'visible' );\n\t},\n\t*/\n\n\t/**\n\t * @param {Object} options\n\t * @param {string} id\n\t * @returns {wp.media.View}\n\t */\n\ttoView: function( options, id ) {\n\t\toptions = options || {};\n\t\toptions[ this.property ] = options[ this.property ] || id;\n\t\treturn new this.ItemView( options ).render();\n\t},\n\n\tready: function() {\n\t\t/**\n\t\t * call 'ready' directly on the parent class\n\t\t */\n\t\tPriorityList.prototype.ready.apply( this, arguments );\n\t\tthis.visibility();\n\t},\n\n\tset: function() {\n\t\t/**\n\t\t * call 'set' directly on the parent class\n\t\t */\n\t\tPriorityList.prototype.set.apply( this, arguments );\n\t\tthis.visibility();\n\t},\n\n\tunset: function() {\n\t\t/**\n\t\t * call 'unset' directly on the parent class\n\t\t */\n\t\tPriorityList.prototype.unset.apply( this, arguments );\n\t\tthis.visibility();\n\t},\n\n\tvisibility: function() {\n\t\tvar region = this.region,\n\t\t\tview = this.controller[ region ].get(),\n\t\t\tviews = this.views.get(),\n\t\t\thide = ! views || views.length < 2;\n\n\t\tif ( this === view ) {\n\t\t\tthis.controller.$el.toggleClass( 'hide-' + region, hide );\n\t\t}\n\t},\n\t/**\n\t * @param {string} id\n\t */\n\tselect: function( id ) {\n\t\tvar view = this.get( id );\n\n\t\tif ( ! view ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.deselect();\n\t\tview.$el.addClass('active');\n\t},\n\n\tdeselect: function() {\n\t\tthis.$el.children().removeClass('active');\n\t},\n\n\thide: function( id ) {\n\t\tvar view = this.get( id );\n\n\t\tif ( ! view ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview.$el.addClass('hidden');\n\t},\n\n\tshow: function( id ) {\n\t\tvar view = this.get( id );\n\n\t\tif ( ! view ) {\n\t\t\treturn;\n\t\t}\n\n\t\tview.$el.removeClass('hidden');\n\t}\n});\n\nmodule.exports = Menu;\n\n},{}],53:[function(require,module,exports){\n/**\n * wp.media.view.Modal\n *\n * A modal view, which the media modal uses as its default container.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar $ = jQuery,\n\tModal;\n\nModal = wp.media.View.extend({\n\ttagName:  'div',\n\ttemplate: wp.template('media-modal'),\n\n\tattributes: {\n\t\ttabindex: 0\n\t},\n\n\tevents: {\n\t\t'click .media-modal-backdrop, .media-modal-close': 'escapeHandler',\n\t\t'keydown': 'keydown'\n\t},\n\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tcontainer: document.body,\n\t\t\ttitle:     '',\n\t\t\tpropagate: true,\n\t\t\tfreeze:    true\n\t\t});\n\n\t\tthis.focusManager = new wp.media.view.FocusManager({\n\t\t\tel: this.el\n\t\t});\n\t},\n\t/**\n\t * @returns {Object}\n\t */\n\tprepare: function() {\n\t\treturn {\n\t\t\ttitle: this.options.title\n\t\t};\n\t},\n\n\t/**\n\t * @returns {wp.media.view.Modal} Returns itself to allow chaining\n\t */\n\tattach: function() {\n\t\tif ( this.views.attached ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( ! this.views.rendered ) {\n\t\t\tthis.render();\n\t\t}\n\n\t\tthis.$el.appendTo( this.options.container );\n\n\t\t// Manually mark the view as attached and trigger ready.\n\t\tthis.views.attached = true;\n\t\tthis.views.ready();\n\n\t\treturn this.propagate('attach');\n\t},\n\n\t/**\n\t * @returns {wp.media.view.Modal} Returns itself to allow chaining\n\t */\n\tdetach: function() {\n\t\tif ( this.$el.is(':visible') ) {\n\t\t\tthis.close();\n\t\t}\n\n\t\tthis.$el.detach();\n\t\tthis.views.attached = false;\n\t\treturn this.propagate('detach');\n\t},\n\n\t/**\n\t * @returns {wp.media.view.Modal} Returns itself to allow chaining\n\t */\n\topen: function() {\n\t\tvar $el = this.$el,\n\t\t\toptions = this.options,\n\t\t\tmceEditor;\n\n\t\tif ( $el.is(':visible') ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( ! this.views.attached ) {\n\t\t\tthis.attach();\n\t\t}\n\n\t\t// If the `freeze` option is set, record the window's scroll position.\n\t\tif ( options.freeze ) {\n\t\t\tthis._freeze = {\n\t\t\t\tscrollTop: $( window ).scrollTop()\n\t\t\t};\n\t\t}\n\n\t\t// Disable page scrolling.\n\t\t$( 'body' ).addClass( 'modal-open' );\n\n\t\t$el.show();\n\n\t\t// Try to close the onscreen keyboard\n\t\tif ( 'ontouchend' in document ) {\n\t\t\tif ( ( mceEditor = window.tinymce && window.tinymce.activeEditor )  && ! mceEditor.isHidden() && mceEditor.iframeElement ) {\n\t\t\t\tmceEditor.iframeElement.focus();\n\t\t\t\tmceEditor.iframeElement.blur();\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tmceEditor.iframeElement.blur();\n\t\t\t\t}, 100 );\n\t\t\t}\n\t\t}\n\n\t\tthis.$el.focus();\n\n\t\treturn this.propagate('open');\n\t},\n\n\t/**\n\t * @param {Object} options\n\t * @returns {wp.media.view.Modal} Returns itself to allow chaining\n\t */\n\tclose: function( options ) {\n\t\tvar freeze = this._freeze;\n\n\t\tif ( ! this.views.attached || ! this.$el.is(':visible') ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Enable page scrolling.\n\t\t$( 'body' ).removeClass( 'modal-open' );\n\n\t\t// Hide modal and remove restricted media modal tab focus once it's closed\n\t\tthis.$el.hide().undelegate( 'keydown' );\n\n\t\t// Put focus back in useful location once modal is closed\n\t\t$('#wpbody-content').focus();\n\n\t\tthis.propagate('close');\n\n\t\t// If the `freeze` option is set, restore the container's scroll position.\n\t\tif ( freeze ) {\n\t\t\t$( window ).scrollTop( freeze.scrollTop );\n\t\t}\n\n\t\tif ( options && options.escape ) {\n\t\t\tthis.propagate('escape');\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @returns {wp.media.view.Modal} Returns itself to allow chaining\n\t */\n\tescape: function() {\n\t\treturn this.close({ escape: true });\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tescapeHandler: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.escape();\n\t},\n\n\t/**\n\t * @param {Array|Object} content Views to register to '.media-modal-content'\n\t * @returns {wp.media.view.Modal} Returns itself to allow chaining\n\t */\n\tcontent: function( content ) {\n\t\tthis.views.set( '.media-modal-content', content );\n\t\treturn this;\n\t},\n\n\t/**\n\t * Triggers a modal event and if the `propagate` option is set,\n\t * forwards events to the modal's controller.\n\t *\n\t * @param {string} id\n\t * @returns {wp.media.view.Modal} Returns itself to allow chaining\n\t */\n\tpropagate: function( id ) {\n\t\tthis.trigger( id );\n\n\t\tif ( this.options.propagate ) {\n\t\t\tthis.controller.trigger( id );\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tkeydown: function( event ) {\n\t\t// Close the modal when escape is pressed.\n\t\tif ( 27 === event.which && this.$el.is(':visible') ) {\n\t\t\tthis.escape();\n\t\t\tevent.stopImmediatePropagation();\n\t\t}\n\t}\n});\n\nmodule.exports = Modal;\n\n},{}],54:[function(require,module,exports){\n/**\n * wp.media.view.PriorityList\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar PriorityList = wp.media.View.extend({\n\ttagName:   'div',\n\n\tinitialize: function() {\n\t\tthis._views = {};\n\n\t\tthis.set( _.extend( {}, this._views, this.options.views ), { silent: true });\n\t\tdelete this.options.views;\n\n\t\tif ( ! this.options.silent ) {\n\t\t\tthis.render();\n\t\t}\n\t},\n\t/**\n\t * @param {string} id\n\t * @param {wp.media.View|Object} view\n\t * @param {Object} options\n\t * @returns {wp.media.view.PriorityList} Returns itself to allow chaining\n\t */\n\tset: function( id, view, options ) {\n\t\tvar priority, views, index;\n\n\t\toptions = options || {};\n\n\t\t// Accept an object with an `id` : `view` mapping.\n\t\tif ( _.isObject( id ) ) {\n\t\t\t_.each( id, function( view, id ) {\n\t\t\t\tthis.set( id, view );\n\t\t\t}, this );\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( ! (view instanceof Backbone.View) ) {\n\t\t\tview = this.toView( view, id, options );\n\t\t}\n\t\tview.controller = view.controller || this.controller;\n\n\t\tthis.unset( id );\n\n\t\tpriority = view.options.priority || 10;\n\t\tviews = this.views.get() || [];\n\n\t\t_.find( views, function( existing, i ) {\n\t\t\tif ( existing.options.priority > priority ) {\n\t\t\t\tindex = i;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\n\t\tthis._views[ id ] = view;\n\t\tthis.views.add( view, {\n\t\t\tat: _.isNumber( index ) ? index : views.length || 0\n\t\t});\n\n\t\treturn this;\n\t},\n\t/**\n\t * @param {string} id\n\t * @returns {wp.media.View}\n\t */\n\tget: function( id ) {\n\t\treturn this._views[ id ];\n\t},\n\t/**\n\t * @param {string} id\n\t * @returns {wp.media.view.PriorityList}\n\t */\n\tunset: function( id ) {\n\t\tvar view = this.get( id );\n\n\t\tif ( view ) {\n\t\t\tview.remove();\n\t\t}\n\n\t\tdelete this._views[ id ];\n\t\treturn this;\n\t},\n\t/**\n\t * @param {Object} options\n\t * @returns {wp.media.View}\n\t */\n\ttoView: function( options ) {\n\t\treturn new wp.media.View( options );\n\t}\n});\n\nmodule.exports = PriorityList;\n\n},{}],55:[function(require,module,exports){\n/**\n * wp.media.view.RouterItem\n *\n * @class\n * @augments wp.media.view.MenuItem\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar RouterItem = wp.media.view.MenuItem.extend({\n\t/**\n\t * On click handler to activate the content region's corresponding mode.\n\t */\n\tclick: function() {\n\t\tvar contentMode = this.options.contentMode;\n\t\tif ( contentMode ) {\n\t\t\tthis.controller.content.mode( contentMode );\n\t\t}\n\t}\n});\n\nmodule.exports = RouterItem;\n\n},{}],56:[function(require,module,exports){\n/**\n * wp.media.view.Router\n *\n * @class\n * @augments wp.media.view.Menu\n * @augments wp.media.view.PriorityList\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Menu = wp.media.view.Menu,\n\tRouter;\n\nRouter = Menu.extend({\n\ttagName:   'div',\n\tclassName: 'media-router',\n\tproperty:  'contentMode',\n\tItemView:  wp.media.view.RouterItem,\n\tregion:    'router',\n\n\tinitialize: function() {\n\t\tthis.controller.on( 'content:render', this.update, this );\n\t\t// Call 'initialize' directly on the parent class.\n\t\tMenu.prototype.initialize.apply( this, arguments );\n\t},\n\n\tupdate: function() {\n\t\tvar mode = this.controller.content.mode();\n\t\tif ( mode ) {\n\t\t\tthis.select( mode );\n\t\t}\n\t}\n});\n\nmodule.exports = Router;\n\n},{}],57:[function(require,module,exports){\n/**\n * wp.media.view.Search\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar l10n = wp.media.view.l10n,\n\tSearch;\n\nSearch = wp.media.View.extend({\n\ttagName:   'input',\n\tclassName: 'search',\n\tid:        'media-search-input',\n\n\tattributes: {\n\t\ttype:        'search',\n\t\tplaceholder: l10n.search\n\t},\n\n\tevents: {\n\t\t'input':  'search',\n\t\t'keyup':  'search',\n\t\t'change': 'search',\n\t\t'search': 'search'\n\t},\n\n\t/**\n\t * @returns {wp.media.view.Search} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tthis.el.value = this.model.escape('search');\n\t\treturn this;\n\t},\n\n\tsearch: function( event ) {\n\t\tif ( event.target.value ) {\n\t\t\tthis.model.set( 'search', event.target.value );\n\t\t} else {\n\t\t\tthis.model.unset('search');\n\t\t}\n\t}\n});\n\nmodule.exports = Search;\n\n},{}],58:[function(require,module,exports){\n/**\n * wp.media.view.Selection\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar l10n = wp.media.view.l10n,\n\tSelection;\n\nSelection = wp.media.View.extend({\n\ttagName:   'div',\n\tclassName: 'media-selection',\n\ttemplate:  wp.template('media-selection'),\n\n\tevents: {\n\t\t'click .edit-selection':  'edit',\n\t\t'click .clear-selection': 'clear'\n\t},\n\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\teditable:  false,\n\t\t\tclearable: true\n\t\t});\n\n\t\t/**\n\t\t * @member {wp.media.view.Attachments.Selection}\n\t\t */\n\t\tthis.attachments = new wp.media.view.Attachments.Selection({\n\t\t\tcontroller: this.controller,\n\t\t\tcollection: this.collection,\n\t\t\tselection:  this.collection,\n\t\t\tmodel:      new Backbone.Model()\n\t\t});\n\n\t\tthis.views.set( '.selection-view', this.attachments );\n\t\tthis.collection.on( 'add remove reset', this.refresh, this );\n\t\tthis.controller.on( 'content:activate', this.refresh, this );\n\t},\n\n\tready: function() {\n\t\tthis.refresh();\n\t},\n\n\trefresh: function() {\n\t\t// If the selection hasn't been rendered, bail.\n\t\tif ( ! this.$el.children().length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar collection = this.collection,\n\t\t\tediting = 'edit-selection' === this.controller.content.mode();\n\n\t\t// If nothing is selected, display nothing.\n\t\tthis.$el.toggleClass( 'empty', ! collection.length );\n\t\tthis.$el.toggleClass( 'one', 1 === collection.length );\n\t\tthis.$el.toggleClass( 'editing', editing );\n\n\t\tthis.$('.count').text( l10n.selected.replace('%d', collection.length) );\n\t},\n\n\tedit: function( event ) {\n\t\tevent.preventDefault();\n\t\tif ( this.options.editable ) {\n\t\t\tthis.options.editable.call( this, this.collection );\n\t\t}\n\t},\n\n\tclear: function( event ) {\n\t\tevent.preventDefault();\n\t\tthis.collection.reset();\n\n\t\t// Keep focus inside media modal\n\t\t// after clear link is selected\n\t\tthis.controller.modal.focusManager.focus();\n\t}\n});\n\nmodule.exports = Selection;\n\n},{}],59:[function(require,module,exports){\n/**\n * wp.media.view.Settings\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\t$ = Backbone.$,\n\tSettings;\n\nSettings = View.extend({\n\tevents: {\n\t\t'click button':    'updateHandler',\n\t\t'change input':    'updateHandler',\n\t\t'change select':   'updateHandler',\n\t\t'change textarea': 'updateHandler'\n\t},\n\n\tinitialize: function() {\n\t\tthis.model = this.model || new Backbone.Model();\n\t\tthis.listenTo( this.model, 'change', this.updateChanges );\n\t},\n\n\tprepare: function() {\n\t\treturn _.defaults({\n\t\t\tmodel: this.model.toJSON()\n\t\t}, this.options );\n\t},\n\t/**\n\t * @returns {wp.media.view.Settings} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tView.prototype.render.apply( this, arguments );\n\t\t// Select the correct values.\n\t\t_( this.model.attributes ).chain().keys().each( this.update, this );\n\t\treturn this;\n\t},\n\t/**\n\t * @param {string} key\n\t */\n\tupdate: function( key ) {\n\t\tvar value = this.model.get( key ),\n\t\t\t$setting = this.$('[data-setting=\"' + key + '\"]'),\n\t\t\t$buttons, $value;\n\n\t\t// Bail if we didn't find a matching setting.\n\t\tif ( ! $setting.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Attempt to determine how the setting is rendered and update\n\t\t// the selected value.\n\n\t\t// Handle dropdowns.\n\t\tif ( $setting.is('select') ) {\n\t\t\t$value = $setting.find('[value=\"' + value + '\"]');\n\n\t\t\tif ( $value.length ) {\n\t\t\t\t$setting.find('option').prop( 'selected', false );\n\t\t\t\t$value.prop( 'selected', true );\n\t\t\t} else {\n\t\t\t\t// If we can't find the desired value, record what *is* selected.\n\t\t\t\tthis.model.set( key, $setting.find(':selected').val() );\n\t\t\t}\n\n\t\t// Handle button groups.\n\t\t} else if ( $setting.hasClass('button-group') ) {\n\t\t\t$buttons = $setting.find('button').removeClass('active');\n\t\t\t$buttons.filter( '[value=\"' + value + '\"]' ).addClass('active');\n\n\t\t// Handle text inputs and textareas.\n\t\t} else if ( $setting.is('input[type=\"text\"], textarea') ) {\n\t\t\tif ( ! $setting.is(':focus') ) {\n\t\t\t\t$setting.val( value );\n\t\t\t}\n\t\t// Handle checkboxes.\n\t\t} else if ( $setting.is('input[type=\"checkbox\"]') ) {\n\t\t\t$setting.prop( 'checked', !! value && 'false' !== value );\n\t\t}\n\t},\n\t/**\n\t * @param {Object} event\n\t */\n\tupdateHandler: function( event ) {\n\t\tvar $setting = $( event.target ).closest('[data-setting]'),\n\t\t\tvalue = event.target.value,\n\t\t\tuserSetting;\n\n\t\tevent.preventDefault();\n\n\t\tif ( ! $setting.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Use the correct value for checkboxes.\n\t\tif ( $setting.is('input[type=\"checkbox\"]') ) {\n\t\t\tvalue = $setting[0].checked;\n\t\t}\n\n\t\t// Update the corresponding setting.\n\t\tthis.model.set( $setting.data('setting'), value );\n\n\t\t// If the setting has a corresponding user setting,\n\t\t// update that as well.\n\t\tif ( userSetting = $setting.data('userSetting') ) {\n\t\t\twindow.setUserSetting( userSetting, value );\n\t\t}\n\t},\n\n\tupdateChanges: function( model ) {\n\t\tif ( model.hasChanged() ) {\n\t\t\t_( model.changed ).chain().keys().each( this.update, this );\n\t\t}\n\t}\n});\n\nmodule.exports = Settings;\n\n},{}],60:[function(require,module,exports){\n/**\n * wp.media.view.Settings.AttachmentDisplay\n *\n * @class\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Settings = wp.media.view.Settings,\n\tAttachmentDisplay;\n\nAttachmentDisplay = Settings.extend({\n\tclassName: 'attachment-display-settings',\n\ttemplate:  wp.template('attachment-display-settings'),\n\n\tinitialize: function() {\n\t\tvar attachment = this.options.attachment;\n\n\t\t_.defaults( this.options, {\n\t\t\tuserSettings: false\n\t\t});\n\t\t// Call 'initialize' directly on the parent class.\n\t\tSettings.prototype.initialize.apply( this, arguments );\n\t\tthis.listenTo( this.model, 'change:link', this.updateLinkTo );\n\n\t\tif ( attachment ) {\n\t\t\tattachment.on( 'change:uploading', this.render, this );\n\t\t}\n\t},\n\n\tdispose: function() {\n\t\tvar attachment = this.options.attachment;\n\t\tif ( attachment ) {\n\t\t\tattachment.off( null, null, this );\n\t\t}\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\tSettings.prototype.dispose.apply( this, arguments );\n\t},\n\t/**\n\t * @returns {wp.media.view.AttachmentDisplay} Returns itself to allow chaining\n\t */\n\trender: function() {\n\t\tvar attachment = this.options.attachment;\n\t\tif ( attachment ) {\n\t\t\t_.extend( this.options, {\n\t\t\t\tsizes: attachment.get('sizes'),\n\t\t\t\ttype:  attachment.get('type')\n\t\t\t});\n\t\t}\n\t\t/**\n\t\t * call 'render' directly on the parent class\n\t\t */\n\t\tSettings.prototype.render.call( this );\n\t\tthis.updateLinkTo();\n\t\treturn this;\n\t},\n\n\tupdateLinkTo: function() {\n\t\tvar linkTo = this.model.get('link'),\n\t\t\t$input = this.$('.link-to-custom'),\n\t\t\tattachment = this.options.attachment;\n\n\t\tif ( 'none' === linkTo || 'embed' === linkTo || ( ! attachment && 'custom' !== linkTo ) ) {\n\t\t\t$input.addClass( 'hidden' );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( attachment ) {\n\t\t\tif ( 'post' === linkTo ) {\n\t\t\t\t$input.val( attachment.get('link') );\n\t\t\t} else if ( 'file' === linkTo ) {\n\t\t\t\t$input.val( attachment.get('url') );\n\t\t\t} else if ( ! this.model.get('linkUrl') ) {\n\t\t\t\t$input.val('http://');\n\t\t\t}\n\n\t\t\t$input.prop( 'readonly', 'custom' !== linkTo );\n\t\t}\n\n\t\t$input.removeClass( 'hidden' );\n\n\t\t// If the input is visible, focus and select its contents.\n\t\tif ( ! wp.media.isTouchDevice && $input.is(':visible') ) {\n\t\t\t$input.focus()[0].select();\n\t\t}\n\t}\n});\n\nmodule.exports = AttachmentDisplay;\n\n},{}],61:[function(require,module,exports){\n/**\n * wp.media.view.Settings.Gallery\n *\n * @class\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Gallery = wp.media.view.Settings.extend({\n\tclassName: 'collection-settings gallery-settings',\n\ttemplate:  wp.template('gallery-settings')\n});\n\nmodule.exports = Gallery;\n\n},{}],62:[function(require,module,exports){\n/**\n * wp.media.view.Settings.Playlist\n *\n * @class\n * @augments wp.media.view.Settings\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Playlist = wp.media.view.Settings.extend({\n\tclassName: 'collection-settings playlist-settings',\n\ttemplate:  wp.template('playlist-settings')\n});\n\nmodule.exports = Playlist;\n\n},{}],63:[function(require,module,exports){\n/**\n * wp.media.view.Sidebar\n *\n * @class\n * @augments wp.media.view.PriorityList\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Sidebar = wp.media.view.PriorityList.extend({\n\tclassName: 'media-sidebar'\n});\n\nmodule.exports = Sidebar;\n\n},{}],64:[function(require,module,exports){\n/**\n * wp.media.view.SiteIconCropper\n *\n * Uses the imgAreaSelect plugin to allow a user to crop a Site Icon.\n *\n * Takes imgAreaSelect options from\n * wp.customize.SiteIconControl.calculateImageSelectOptions.\n *\n * @class\n * @augments wp.media.view.Cropper\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.view,\n\tSiteIconCropper;\n\nSiteIconCropper = View.Cropper.extend({\n\tclassName: 'crop-content site-icon',\n\n\tready: function () {\n\t\tView.Cropper.prototype.ready.apply( this, arguments );\n\n\t\tthis.$( '.crop-image' ).on( 'load', _.bind( this.addSidebar, this ) );\n\t},\n\n\taddSidebar: function() {\n\t\tthis.sidebar = new wp.media.view.Sidebar({\n\t\t\tcontroller: this.controller\n\t\t});\n\n\t\tthis.sidebar.set( 'preview', new wp.media.view.SiteIconPreview({\n\t\t\tcontroller: this.controller,\n\t\t\tattachment: this.options.attachment\n\t\t}) );\n\n\t\tthis.controller.cropperView.views.add( this.sidebar );\n\t}\n});\n\nmodule.exports = SiteIconCropper;\n\n},{}],65:[function(require,module,exports){\n/**\n * wp.media.view.SiteIconPreview\n *\n * Shows a preview of the Site Icon as a favicon and app icon while cropping.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\t$ = jQuery,\n\tSiteIconPreview;\n\nSiteIconPreview = View.extend({\n\tclassName: 'site-icon-preview',\n\ttemplate: wp.template( 'site-icon-preview' ),\n\n\tready: function() {\n\t\tthis.controller.imgSelect.setOptions({\n\t\t\tonInit: this.updatePreview,\n\t\t\tonSelectChange: this.updatePreview\n\t\t});\n\t},\n\n\tprepare: function() {\n\t\treturn {\n\t\t\turl: this.options.attachment.get( 'url' )\n\t\t};\n\t},\n\n\tupdatePreview: function( img, coords ) {\n\t\tvar rx = 64 / coords.width,\n\t\t\try = 64 / coords.height,\n\t\t\tpreview_rx = 16 / coords.width,\n\t\t\tpreview_ry = 16 / coords.height;\n\n\t\t$( '#preview-app-icon' ).css({\n\t\t\twidth: Math.round(rx * this.imageWidth ) + 'px',\n\t\t\theight: Math.round(ry * this.imageHeight ) + 'px',\n\t\t\tmarginLeft: '-' + Math.round(rx * coords.x1) + 'px',\n\t\t\tmarginTop: '-' + Math.round(ry * coords.y1) + 'px'\n\t\t});\n\n\t\t$( '#preview-favicon' ).css({\n\t\t\twidth: Math.round( preview_rx * this.imageWidth ) + 'px',\n\t\t\theight: Math.round( preview_ry * this.imageHeight ) + 'px',\n\t\t\tmarginLeft: '-' + Math.round( preview_rx * coords.x1 ) + 'px',\n\t\t\tmarginTop: '-' + Math.floor( preview_ry* coords.y1 ) + 'px'\n\t\t});\n\t}\n});\n\nmodule.exports = SiteIconPreview;\n\n},{}],66:[function(require,module,exports){\n/**\n * wp.media.view.Spinner\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Spinner = wp.media.View.extend({\n\ttagName:   'span',\n\tclassName: 'spinner',\n\tspinnerTimeout: false,\n\tdelay: 400,\n\n\tshow: function() {\n\t\tif ( ! this.spinnerTimeout ) {\n\t\t\tthis.spinnerTimeout = _.delay(function( $el ) {\n\t\t\t\t$el.addClass( 'is-active' );\n\t\t\t}, this.delay, this.$el );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\thide: function() {\n\t\tthis.$el.removeClass( 'is-active' );\n\t\tthis.spinnerTimeout = clearTimeout( this.spinnerTimeout );\n\n\t\treturn this;\n\t}\n});\n\nmodule.exports = Spinner;\n\n},{}],67:[function(require,module,exports){\n/**\n * wp.media.view.Toolbar\n *\n * A toolbar which consists of a primary and a secondary section. Each sections\n * can be filled with views.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\tToolbar;\n\nToolbar = View.extend({\n\ttagName:   'div',\n\tclassName: 'media-toolbar',\n\n\tinitialize: function() {\n\t\tvar state = this.controller.state(),\n\t\t\tselection = this.selection = state.get('selection'),\n\t\t\tlibrary = this.library = state.get('library');\n\n\t\tthis._views = {};\n\n\t\t// The toolbar is composed of two `PriorityList` views.\n\t\tthis.primary   = new wp.media.view.PriorityList();\n\t\tthis.secondary = new wp.media.view.PriorityList();\n\t\tthis.primary.$el.addClass('media-toolbar-primary search-form');\n\t\tthis.secondary.$el.addClass('media-toolbar-secondary');\n\n\t\tthis.views.set([ this.secondary, this.primary ]);\n\n\t\tif ( this.options.items ) {\n\t\t\tthis.set( this.options.items, { silent: true });\n\t\t}\n\n\t\tif ( ! this.options.silent ) {\n\t\t\tthis.render();\n\t\t}\n\n\t\tif ( selection ) {\n\t\t\tselection.on( 'add remove reset', this.refresh, this );\n\t\t}\n\n\t\tif ( library ) {\n\t\t\tlibrary.on( 'add remove reset', this.refresh, this );\n\t\t}\n\t},\n\t/**\n\t * @returns {wp.media.view.Toolbar} Returns itsef to allow chaining\n\t */\n\tdispose: function() {\n\t\tif ( this.selection ) {\n\t\t\tthis.selection.off( null, null, this );\n\t\t}\n\n\t\tif ( this.library ) {\n\t\t\tthis.library.off( null, null, this );\n\t\t}\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\treturn View.prototype.dispose.apply( this, arguments );\n\t},\n\n\tready: function() {\n\t\tthis.refresh();\n\t},\n\n\t/**\n\t * @param {string} id\n\t * @param {Backbone.View|Object} view\n\t * @param {Object} [options={}]\n\t * @returns {wp.media.view.Toolbar} Returns itself to allow chaining\n\t */\n\tset: function( id, view, options ) {\n\t\tvar list;\n\t\toptions = options || {};\n\n\t\t// Accept an object with an `id` : `view` mapping.\n\t\tif ( _.isObject( id ) ) {\n\t\t\t_.each( id, function( view, id ) {\n\t\t\t\tthis.set( id, view, { silent: true });\n\t\t\t}, this );\n\n\t\t} else {\n\t\t\tif ( ! ( view instanceof Backbone.View ) ) {\n\t\t\t\tview.classes = [ 'media-button-' + id ].concat( view.classes || [] );\n\t\t\t\tview = new wp.media.view.Button( view ).render();\n\t\t\t}\n\n\t\t\tview.controller = view.controller || this.controller;\n\n\t\t\tthis._views[ id ] = view;\n\n\t\t\tlist = view.options.priority < 0 ? 'secondary' : 'primary';\n\t\t\tthis[ list ].set( id, view, options );\n\t\t}\n\n\t\tif ( ! options.silent ) {\n\t\t\tthis.refresh();\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @param {string} id\n\t * @returns {wp.media.view.Button}\n\t */\n\tget: function( id ) {\n\t\treturn this._views[ id ];\n\t},\n\t/**\n\t * @param {string} id\n\t * @param {Object} options\n\t * @returns {wp.media.view.Toolbar} Returns itself to allow chaining\n\t */\n\tunset: function( id, options ) {\n\t\tdelete this._views[ id ];\n\t\tthis.primary.unset( id, options );\n\t\tthis.secondary.unset( id, options );\n\n\t\tif ( ! options || ! options.silent ) {\n\t\t\tthis.refresh();\n\t\t}\n\t\treturn this;\n\t},\n\n\trefresh: function() {\n\t\tvar state = this.controller.state(),\n\t\t\tlibrary = state.get('library'),\n\t\t\tselection = state.get('selection');\n\n\t\t_.each( this._views, function( button ) {\n\t\t\tif ( ! button.model || ! button.options || ! button.options.requires ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar requires = button.options.requires,\n\t\t\t\tdisabled = false;\n\n\t\t\t// Prevent insertion of attachments if any of them are still uploading\n\t\t\tdisabled = _.some( selection.models, function( attachment ) {\n\t\t\t\treturn attachment.get('uploading') === true;\n\t\t\t});\n\n\t\t\tif ( requires.selection && selection && ! selection.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t} else if ( requires.library && library && ! library.length ) {\n\t\t\t\tdisabled = true;\n\t\t\t}\n\t\t\tbutton.model.set( 'disabled', disabled );\n\t\t});\n\t}\n});\n\nmodule.exports = Toolbar;\n\n},{}],68:[function(require,module,exports){\n/**\n * wp.media.view.Toolbar.Embed\n *\n * @class\n * @augments wp.media.view.Toolbar.Select\n * @augments wp.media.view.Toolbar\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Select = wp.media.view.Toolbar.Select,\n\tl10n = wp.media.view.l10n,\n\tEmbed;\n\nEmbed = Select.extend({\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\ttext: l10n.insertIntoPost,\n\t\t\trequires: false\n\t\t});\n\t\t// Call 'initialize' directly on the parent class.\n\t\tSelect.prototype.initialize.apply( this, arguments );\n\t},\n\n\trefresh: function() {\n\t\tvar url = this.controller.state().props.get('url');\n\t\tthis.get('select').model.set( 'disabled', ! url || url === 'http://' );\n\t\t/**\n\t\t * call 'refresh' directly on the parent class\n\t\t */\n\t\tSelect.prototype.refresh.apply( this, arguments );\n\t}\n});\n\nmodule.exports = Embed;\n\n},{}],69:[function(require,module,exports){\n/**\n * wp.media.view.Toolbar.Select\n *\n * @class\n * @augments wp.media.view.Toolbar\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar Toolbar = wp.media.view.Toolbar,\n\tl10n = wp.media.view.l10n,\n\tSelect;\n\nSelect = Toolbar.extend({\n\tinitialize: function() {\n\t\tvar options = this.options;\n\n\t\t_.bindAll( this, 'clickSelect' );\n\n\t\t_.defaults( options, {\n\t\t\tevent: 'select',\n\t\t\tstate: false,\n\t\t\treset: true,\n\t\t\tclose: true,\n\t\t\ttext:  l10n.select,\n\n\t\t\t// Does the button rely on the selection?\n\t\t\trequires: {\n\t\t\t\tselection: true\n\t\t\t}\n\t\t});\n\n\t\toptions.items = _.defaults( options.items || {}, {\n\t\t\tselect: {\n\t\t\t\tstyle:    'primary',\n\t\t\t\ttext:     options.text,\n\t\t\t\tpriority: 80,\n\t\t\t\tclick:    this.clickSelect,\n\t\t\t\trequires: options.requires\n\t\t\t}\n\t\t});\n\t\t// Call 'initialize' directly on the parent class.\n\t\tToolbar.prototype.initialize.apply( this, arguments );\n\t},\n\n\tclickSelect: function() {\n\t\tvar options = this.options,\n\t\t\tcontroller = this.controller;\n\n\t\tif ( options.close ) {\n\t\t\tcontroller.close();\n\t\t}\n\n\t\tif ( options.event ) {\n\t\t\tcontroller.state().trigger( options.event );\n\t\t}\n\n\t\tif ( options.state ) {\n\t\t\tcontroller.setState( options.state );\n\t\t}\n\n\t\tif ( options.reset ) {\n\t\t\tcontroller.reset();\n\t\t}\n\t}\n});\n\nmodule.exports = Select;\n\n},{}],70:[function(require,module,exports){\n/**\n * Creates a dropzone on WP editor instances (elements with .wp-editor-wrap)\n * and relays drag'n'dropped files to a media workflow.\n *\n * wp.media.view.EditorUploader\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\tl10n = wp.media.view.l10n,\n\t$ = jQuery,\n\tEditorUploader;\n\nEditorUploader = View.extend({\n\ttagName:   'div',\n\tclassName: 'uploader-editor',\n\ttemplate:  wp.template( 'uploader-editor' ),\n\n\tlocalDrag: false,\n\toverContainer: false,\n\toverDropzone: false,\n\tdraggingFile: null,\n\n\t/**\n\t * Bind drag'n'drop events to callbacks.\n\t */\n\tinitialize: function() {\n\t\tthis.initialized = false;\n\n\t\t// Bail if not enabled or UA does not support drag'n'drop or File API.\n\t\tif ( ! window.tinyMCEPreInit || ! window.tinyMCEPreInit.dragDropUpload || ! this.browserSupport() ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.$document = $(document);\n\t\tthis.dropzones = [];\n\t\tthis.files = [];\n\n\t\tthis.$document.on( 'drop', '.uploader-editor', _.bind( this.drop, this ) );\n\t\tthis.$document.on( 'dragover', '.uploader-editor', _.bind( this.dropzoneDragover, this ) );\n\t\tthis.$document.on( 'dragleave', '.uploader-editor', _.bind( this.dropzoneDragleave, this ) );\n\t\tthis.$document.on( 'click', '.uploader-editor', _.bind( this.click, this ) );\n\n\t\tthis.$document.on( 'dragover', _.bind( this.containerDragover, this ) );\n\t\tthis.$document.on( 'dragleave', _.bind( this.containerDragleave, this ) );\n\n\t\tthis.$document.on( 'dragstart dragend drop', _.bind( function( event ) {\n\t\t\tthis.localDrag = event.type === 'dragstart';\n\n\t\t\tif ( event.type === 'drop' ) {\n\t\t\t\tthis.containerDragleave();\n\t\t\t}\n\t\t}, this ) );\n\n\t\tthis.initialized = true;\n\t\treturn this;\n\t},\n\n\t/**\n\t * Check browser support for drag'n'drop.\n\t *\n\t * @return Boolean\n\t */\n\tbrowserSupport: function() {\n\t\tvar supports = false, div = document.createElement('div');\n\n\t\tsupports = ( 'draggable' in div ) || ( 'ondragstart' in div && 'ondrop' in div );\n\t\tsupports = supports && !! ( window.File && window.FileList && window.FileReader );\n\t\treturn supports;\n\t},\n\n\tisDraggingFile: function( event ) {\n\t\tif ( this.draggingFile !== null ) {\n\t\t\treturn this.draggingFile;\n\t\t}\n\n\t\tif ( _.isUndefined( event.originalEvent ) || _.isUndefined( event.originalEvent.dataTransfer ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.draggingFile = _.indexOf( event.originalEvent.dataTransfer.types, 'Files' ) > -1 &&\n\t\t\t_.indexOf( event.originalEvent.dataTransfer.types, 'text/plain' ) === -1;\n\n\t\treturn this.draggingFile;\n\t},\n\n\trefresh: function( e ) {\n\t\tvar dropzone_id;\n\t\tfor ( dropzone_id in this.dropzones ) {\n\t\t\t// Hide the dropzones only if dragging has left the screen.\n\t\t\tthis.dropzones[ dropzone_id ].toggle( this.overContainer || this.overDropzone );\n\t\t}\n\n\t\tif ( ! _.isUndefined( e ) ) {\n\t\t\t$( e.target ).closest( '.uploader-editor' ).toggleClass( 'droppable', this.overDropzone );\n\t\t}\n\n\t\tif ( ! this.overContainer && ! this.overDropzone ) {\n\t\t\tthis.draggingFile = null;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\trender: function() {\n\t\tif ( ! this.initialized ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tView.prototype.render.apply( this, arguments );\n\t\t$( '.wp-editor-wrap' ).each( _.bind( this.attach, this ) );\n\t\treturn this;\n\t},\n\n\tattach: function( index, editor ) {\n\t\t// Attach a dropzone to an editor.\n\t\tvar dropzone = this.$el.clone();\n\t\tthis.dropzones.push( dropzone );\n\t\t$( editor ).append( dropzone );\n\t\treturn this;\n\t},\n\n\t/**\n\t * When a file is dropped on the editor uploader, open up an editor media workflow\n\t * and upload the file immediately.\n\t *\n\t * @param  {jQuery.Event} event The 'drop' event.\n\t */\n\tdrop: function( event ) {\n\t\tvar $wrap, uploadView;\n\n\t\tthis.containerDragleave( event );\n\t\tthis.dropzoneDragleave( event );\n\n\t\tthis.files = event.originalEvent.dataTransfer.files;\n\t\tif ( this.files.length < 1 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the active editor to the drop target.\n\t\t$wrap = $( event.target ).parents( '.wp-editor-wrap' );\n\t\tif ( $wrap.length > 0 && $wrap[0].id ) {\n\t\t\twindow.wpActiveEditor = $wrap[0].id.slice( 3, -5 );\n\t\t}\n\n\t\tif ( ! this.workflow ) {\n\t\t\tthis.workflow = wp.media.editor.open( window.wpActiveEditor, {\n\t\t\t\tframe:    'post',\n\t\t\t\tstate:    'insert',\n\t\t\t\ttitle:    l10n.addMedia,\n\t\t\t\tmultiple: true\n\t\t\t});\n\n\t\t\tuploadView = this.workflow.uploader;\n\n\t\t\tif ( uploadView.uploader && uploadView.uploader.ready ) {\n\t\t\t\tthis.addFiles.apply( this );\n\t\t\t} else {\n\t\t\t\tthis.workflow.on( 'uploader:ready', this.addFiles, this );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.workflow.state().reset();\n\t\t\tthis.addFiles.apply( this );\n\t\t\tthis.workflow.open();\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t/**\n\t * Add the files to the uploader.\n\t */\n\taddFiles: function() {\n\t\tif ( this.files.length ) {\n\t\t\tthis.workflow.uploader.uploader.uploader.addFile( _.toArray( this.files ) );\n\t\t\tthis.files = [];\n\t\t}\n\t\treturn this;\n\t},\n\n\tcontainerDragover: function( event ) {\n\t\tif ( this.localDrag || ! this.isDraggingFile( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.overContainer = true;\n\t\tthis.refresh();\n\t},\n\n\tcontainerDragleave: function() {\n\t\tthis.overContainer = false;\n\n\t\t// Throttle dragleave because it's called when bouncing from some elements to others.\n\t\t_.delay( _.bind( this.refresh, this ), 50 );\n\t},\n\n\tdropzoneDragover: function( event ) {\n\t\tif ( this.localDrag || ! this.isDraggingFile( event ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.overDropzone = true;\n\t\tthis.refresh( event );\n\t\treturn false;\n\t},\n\n\tdropzoneDragleave: function( e ) {\n\t\tthis.overDropzone = false;\n\t\t_.delay( _.bind( this.refresh, this, e ), 50 );\n\t},\n\n\tclick: function( e ) {\n\t\t// In the rare case where the dropzone gets stuck, hide it on click.\n\t\tthis.containerDragleave( e );\n\t\tthis.dropzoneDragleave( e );\n\t\tthis.localDrag = false;\n\t}\n});\n\nmodule.exports = EditorUploader;\n\n},{}],71:[function(require,module,exports){\n/**\n * wp.media.view.UploaderInline\n *\n * The inline uploader that shows up in the 'Upload Files' tab.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\tUploaderInline;\n\nUploaderInline = View.extend({\n\ttagName:   'div',\n\tclassName: 'uploader-inline',\n\ttemplate:  wp.template('uploader-inline'),\n\n\tevents: {\n\t\t'click .close': 'hide'\n\t},\n\n\tinitialize: function() {\n\t\t_.defaults( this.options, {\n\t\t\tmessage: '',\n\t\t\tstatus:  true,\n\t\t\tcanClose: false\n\t\t});\n\n\t\tif ( ! this.options.$browser && this.controller.uploader ) {\n\t\t\tthis.options.$browser = this.controller.uploader.$browser;\n\t\t}\n\n\t\tif ( _.isUndefined( this.options.postId ) ) {\n\t\t\tthis.options.postId = wp.media.view.settings.post.id;\n\t\t}\n\n\t\tif ( this.options.status ) {\n\t\t\tthis.views.set( '.upload-inline-status', new wp.media.view.UploaderStatus({\n\t\t\t\tcontroller: this.controller\n\t\t\t}) );\n\t\t}\n\t},\n\n\tprepare: function() {\n\t\tvar suggestedWidth = this.controller.state().get('suggestedWidth'),\n\t\t\tsuggestedHeight = this.controller.state().get('suggestedHeight'),\n\t\t\tdata = {};\n\n\t\tdata.message = this.options.message;\n\t\tdata.canClose = this.options.canClose;\n\n\t\tif ( suggestedWidth && suggestedHeight ) {\n\t\t\tdata.suggestedWidth = suggestedWidth;\n\t\t\tdata.suggestedHeight = suggestedHeight;\n\t\t}\n\n\t\treturn data;\n\t},\n\t/**\n\t * @returns {wp.media.view.UploaderInline} Returns itself to allow chaining\n\t */\n\tdispose: function() {\n\t\tif ( this.disposing ) {\n\t\t\t/**\n\t\t\t * call 'dispose' directly on the parent class\n\t\t\t */\n\t\t\treturn View.prototype.dispose.apply( this, arguments );\n\t\t}\n\n\t\t// Run remove on `dispose`, so we can be sure to refresh the\n\t\t// uploader with a view-less DOM. Track whether we're disposing\n\t\t// so we don't trigger an infinite loop.\n\t\tthis.disposing = true;\n\t\treturn this.remove();\n\t},\n\t/**\n\t * @returns {wp.media.view.UploaderInline} Returns itself to allow chaining\n\t */\n\tremove: function() {\n\t\t/**\n\t\t * call 'remove' directly on the parent class\n\t\t */\n\t\tvar result = View.prototype.remove.apply( this, arguments );\n\n\t\t_.defer( _.bind( this.refresh, this ) );\n\t\treturn result;\n\t},\n\n\trefresh: function() {\n\t\tvar uploader = this.controller.uploader;\n\n\t\tif ( uploader ) {\n\t\t\tuploader.refresh();\n\t\t}\n\t},\n\t/**\n\t * @returns {wp.media.view.UploaderInline}\n\t */\n\tready: function() {\n\t\tvar $browser = this.options.$browser,\n\t\t\t$placeholder;\n\n\t\tif ( this.controller.uploader ) {\n\t\t\t$placeholder = this.$('.browser');\n\n\t\t\t// Check if we've already replaced the placeholder.\n\t\t\tif ( $placeholder[0] === $browser[0] ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$browser.detach().text( $placeholder.text() );\n\t\t\t$browser[0].className = $placeholder[0].className;\n\t\t\t$placeholder.replaceWith( $browser.show() );\n\t\t}\n\n\t\tthis.refresh();\n\t\treturn this;\n\t},\n\tshow: function() {\n\t\tthis.$el.removeClass( 'hidden' );\n\t},\n\thide: function() {\n\t\tthis.$el.addClass( 'hidden' );\n\t}\n\n});\n\nmodule.exports = UploaderInline;\n\n},{}],72:[function(require,module,exports){\n/**\n * wp.media.view.UploaderStatusError\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar UploaderStatusError = wp.media.View.extend({\n\tclassName: 'upload-error',\n\ttemplate:  wp.template('uploader-status-error')\n});\n\nmodule.exports = UploaderStatusError;\n\n},{}],73:[function(require,module,exports){\n/**\n * wp.media.view.UploaderStatus\n *\n * An uploader status for on-going uploads.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.media.View,\n\tUploaderStatus;\n\nUploaderStatus = View.extend({\n\tclassName: 'media-uploader-status',\n\ttemplate:  wp.template('uploader-status'),\n\n\tevents: {\n\t\t'click .upload-dismiss-errors': 'dismiss'\n\t},\n\n\tinitialize: function() {\n\t\tthis.queue = wp.Uploader.queue;\n\t\tthis.queue.on( 'add remove reset', this.visibility, this );\n\t\tthis.queue.on( 'add remove reset change:percent', this.progress, this );\n\t\tthis.queue.on( 'add remove reset change:uploading', this.info, this );\n\n\t\tthis.errors = wp.Uploader.errors;\n\t\tthis.errors.reset();\n\t\tthis.errors.on( 'add remove reset', this.visibility, this );\n\t\tthis.errors.on( 'add', this.error, this );\n\t},\n\t/**\n\t * @global wp.Uploader\n\t * @returns {wp.media.view.UploaderStatus}\n\t */\n\tdispose: function() {\n\t\twp.Uploader.queue.off( null, null, this );\n\t\t/**\n\t\t * call 'dispose' directly on the parent class\n\t\t */\n\t\tView.prototype.dispose.apply( this, arguments );\n\t\treturn this;\n\t},\n\n\tvisibility: function() {\n\t\tthis.$el.toggleClass( 'uploading', !! this.queue.length );\n\t\tthis.$el.toggleClass( 'errors', !! this.errors.length );\n\t\tthis.$el.toggle( !! this.queue.length || !! this.errors.length );\n\t},\n\n\tready: function() {\n\t\t_.each({\n\t\t\t'$bar':      '.media-progress-bar div',\n\t\t\t'$index':    '.upload-index',\n\t\t\t'$total':    '.upload-total',\n\t\t\t'$filename': '.upload-filename'\n\t\t}, function( selector, key ) {\n\t\t\tthis[ key ] = this.$( selector );\n\t\t}, this );\n\n\t\tthis.visibility();\n\t\tthis.progress();\n\t\tthis.info();\n\t},\n\n\tprogress: function() {\n\t\tvar queue = this.queue,\n\t\t\t$bar = this.$bar;\n\n\t\tif ( ! $bar || ! queue.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$bar.width( ( queue.reduce( function( memo, attachment ) {\n\t\t\tif ( ! attachment.get('uploading') ) {\n\t\t\t\treturn memo + 100;\n\t\t\t}\n\n\t\t\tvar percent = attachment.get('percent');\n\t\t\treturn memo + ( _.isNumber( percent ) ? percent : 100 );\n\t\t}, 0 ) / queue.length ) + '%' );\n\t},\n\n\tinfo: function() {\n\t\tvar queue = this.queue,\n\t\t\tindex = 0, active;\n\n\t\tif ( ! queue.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tactive = this.queue.find( function( attachment, i ) {\n\t\t\tindex = i;\n\t\t\treturn attachment.get('uploading');\n\t\t});\n\n\t\tthis.$index.text( index + 1 );\n\t\tthis.$total.text( queue.length );\n\t\tthis.$filename.html( active ? this.filename( active.get('filename') ) : '' );\n\t},\n\t/**\n\t * @param {string} filename\n\t * @returns {string}\n\t */\n\tfilename: function( filename ) {\n\t\treturn _.escape( filename );\n\t},\n\t/**\n\t * @param {Backbone.Model} error\n\t */\n\terror: function( error ) {\n\t\tthis.views.add( '.upload-errors', new wp.media.view.UploaderStatusError({\n\t\t\tfilename: this.filename( error.get('file').name ),\n\t\t\tmessage:  error.get('message')\n\t\t}), { at: 0 });\n\t},\n\n\t/**\n\t * @global wp.Uploader\n\t *\n\t * @param {Object} event\n\t */\n\tdismiss: function( event ) {\n\t\tvar errors = this.views.get('.upload-errors');\n\n\t\tevent.preventDefault();\n\n\t\tif ( errors ) {\n\t\t\t_.invoke( errors, 'remove' );\n\t\t}\n\t\twp.Uploader.errors.reset();\n\t}\n});\n\nmodule.exports = UploaderStatus;\n\n},{}],74:[function(require,module,exports){\n/**\n * wp.media.view.UploaderWindow\n *\n * An uploader window that allows for dragging and dropping media.\n *\n * @class\n * @augments wp.media.View\n * @augments wp.Backbone.View\n * @augments Backbone.View\n *\n * @param {object} [options]                   Options hash passed to the view.\n * @param {object} [options.uploader]          Uploader properties.\n * @param {jQuery} [options.uploader.browser]\n * @param {jQuery} [options.uploader.dropzone] jQuery collection of the dropzone.\n * @param {object} [options.uploader.params]\n */\nvar $ = jQuery,\n\tUploaderWindow;\n\nUploaderWindow = wp.media.View.extend({\n\ttagName:   'div',\n\tclassName: 'uploader-window',\n\ttemplate:  wp.template('uploader-window'),\n\n\tinitialize: function() {\n\t\tvar uploader;\n\n\t\tthis.$browser = $('<a href=\"#\" class=\"browser\" />').hide().appendTo('body');\n\n\t\tuploader = this.options.uploader = _.defaults( this.options.uploader || {}, {\n\t\t\tdropzone:  this.$el,\n\t\t\tbrowser:   this.$browser,\n\t\t\tparams:    {}\n\t\t});\n\n\t\t// Ensure the dropzone is a jQuery collection.\n\t\tif ( uploader.dropzone && ! (uploader.dropzone instanceof $) ) {\n\t\t\tuploader.dropzone = $( uploader.dropzone );\n\t\t}\n\n\t\tthis.controller.on( 'activate', this.refresh, this );\n\n\t\tthis.controller.on( 'detach', function() {\n\t\t\tthis.$browser.remove();\n\t\t}, this );\n\t},\n\n\trefresh: function() {\n\t\tif ( this.uploader ) {\n\t\t\tthis.uploader.refresh();\n\t\t}\n\t},\n\n\tready: function() {\n\t\tvar postId = wp.media.view.settings.post.id,\n\t\t\tdropzone;\n\n\t\t// If the uploader already exists, bail.\n\t\tif ( this.uploader ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( postId ) {\n\t\t\tthis.options.uploader.params.post_id = postId;\n\t\t}\n\t\tthis.uploader = new wp.Uploader( this.options.uploader );\n\n\t\tdropzone = this.uploader.dropzone;\n\t\tdropzone.on( 'dropzone:enter', _.bind( this.show, this ) );\n\t\tdropzone.on( 'dropzone:leave', _.bind( this.hide, this ) );\n\n\t\t$( this.uploader ).on( 'uploader:ready', _.bind( this._ready, this ) );\n\t},\n\n\t_ready: function() {\n\t\tthis.controller.trigger( 'uploader:ready' );\n\t},\n\n\tshow: function() {\n\t\tvar $el = this.$el.show();\n\n\t\t// Ensure that the animation is triggered by waiting until\n\t\t// the transparent element is painted into the DOM.\n\t\t_.defer( function() {\n\t\t\t$el.css({ opacity: 1 });\n\t\t});\n\t},\n\n\thide: function() {\n\t\tvar $el = this.$el.css({ opacity: 0 });\n\n\t\twp.media.transition( $el ).done( function() {\n\t\t\t// Transition end events are subject to race conditions.\n\t\t\t// Make sure that the value is set as intended.\n\t\t\tif ( '0' === $el.css('opacity') ) {\n\t\t\t\t$el.hide();\n\t\t\t}\n\t\t});\n\n\t\t// https://core.trac.wordpress.org/ticket/27341\n\t\t_.delay( function() {\n\t\t\tif ( '0' === $el.css('opacity') && $el.is(':visible') ) {\n\t\t\t\t$el.hide();\n\t\t\t}\n\t\t}, 500 );\n\t}\n});\n\nmodule.exports = UploaderWindow;\n\n},{}],75:[function(require,module,exports){\n/**\n * wp.media.View\n *\n * The base view class for media.\n *\n * Undelegating events, removing events from the model, and\n * removing events from the controller mirror the code for\n * `Backbone.View.dispose` in Backbone 0.9.8 development.\n *\n * This behavior has since been removed, and should not be used\n * outside of the media manager.\n *\n * @class\n * @augments wp.Backbone.View\n * @augments Backbone.View\n */\nvar View = wp.Backbone.View.extend({\n\tconstructor: function( options ) {\n\t\tif ( options && options.controller ) {\n\t\t\tthis.controller = options.controller;\n\t\t}\n\t\twp.Backbone.View.apply( this, arguments );\n\t},\n\t/**\n\t * @todo The internal comment mentions this might have been a stop-gap\n\t *       before Backbone 0.9.8 came out. Figure out if Backbone core takes\n\t *       care of this in Backbone.View now.\n\t *\n\t * @returns {wp.media.View} Returns itself to allow chaining\n\t */\n\tdispose: function() {\n\t\t// Undelegating events, removing events from the model, and\n\t\t// removing events from the controller mirror the code for\n\t\t// `Backbone.View.dispose` in Backbone 0.9.8 development.\n\t\tthis.undelegateEvents();\n\n\t\tif ( this.model && this.model.off ) {\n\t\t\tthis.model.off( null, null, this );\n\t\t}\n\n\t\tif ( this.collection && this.collection.off ) {\n\t\t\tthis.collection.off( null, null, this );\n\t\t}\n\n\t\t// Unbind controller events.\n\t\tif ( this.controller && this.controller.off ) {\n\t\t\tthis.controller.off( null, null, this );\n\t\t}\n\n\t\treturn this;\n\t},\n\t/**\n\t * @returns {wp.media.View} Returns itself to allow chaining\n\t */\n\tremove: function() {\n\t\tthis.dispose();\n\t\t/**\n\t\t * call 'remove' directly on the parent class\n\t\t */\n\t\treturn wp.Backbone.View.prototype.remove.apply( this, arguments );\n\t}\n});\n\nmodule.exports = View;\n\n},{}]},{},[19]);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/mediaelement/wp-mediaelement.css",
    "content": ".mejs-container {\n\tclear: both;\n}\n\n.mejs-container * {\n\tfont-family: Helvetica, Arial;\n}\n\n.mejs-container,\n.mejs-embed,\n.mejs-embed body,\n.mejs-container .mejs-controls {\n\tbackground: #222;\n}\n\n.mejs-controls a.mejs-horizontal-volume-slider {\n\tdisplay: table;\n}\n\n.mejs-controls .mejs-time-rail .mejs-time-loaded,\n.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {\n\tbackground: #fff;\n}\n\n.mejs-controls .mejs-time-rail .mejs-time-current {\n\tbackground: #0073aa;\n}\n\n.mejs-controls .mejs-time-rail .mejs-time-total,\n.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total {\n\tbackground: rgba(255, 255, 255, .33);\n}\n\n.mejs-controls .mejs-time-rail span,\n.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total,\n.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {\n\tborder-radius: 0;\n}\n\n.mejs-controls .mejs-offscreen {\n\tclip: rect(1px, 1px, 1px, 1px);\n\tposition: absolute;\n}\n\n.mejs-controls a:focus > .mejs-offscreen {\n\tbackground-color: #f1f1f1;\n\tborder-radius: 3px;\n\tbox-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);\n\tclip: auto;\n\tcolor: #0073aa;\n\tdisplay: block;\n\tfont-size: 14px;\n\tfont-weight: bold;\n\theight: auto;\n\tline-height: normal;\n\tpadding: 15px 23px 14px;\n\tposition: absolute;\n\tleft: 0;\n\ttop: 15px;\n\ttext-decoration: none;\n\ttext-transform: none;\n\twidth: auto;\n}\n\n.mejs-overlay-loading {\n\tbackground: transparent;\n}\n\n/* Override theme styles that may conflict with controls. */\n.mejs-controls button:hover {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.me-cannotplay {\n\twidth: auto !important;\n}\n\n.media-embed-details .wp-audio-shortcode {\n\tdisplay: inline-block;\n\tmax-width: 400px;\n}\n\n.audio-details .embed-media-settings {\n\toverflow: visible;\n}\n\n.media-embed-details .embed-media-settings .setting span {\n\tmax-width: 400px;\n\twidth: auto;\n}\n\n.media-embed-details .embed-media-settings .checkbox-setting span {\n\tdisplay: inline-block;\n}\n\n.media-embed-details .embed-media-settings {\n\tpadding-top: 0;\n\ttop: 28px;\n}\n\n.media-embed-details .instructions {\n\tpadding: 16px 0;\n\tmax-width: 600px;\n}\n\n.media-embed-details .setting p,\n.media-embed-details .setting .remove-setting {\n\tcolor: #a00;\n\tfont-size: 10px;\n\ttext-transform: uppercase;\n}\n\n.media-embed-details .setting .remove-setting {\n\tpadding: 0;\n}\n\n.media-embed-details .setting a:hover {\n\tcolor: #f00;\n}\n\n.media-embed-details .embed-media-settings .checkbox-setting {\n\tfloat: none;\n\tmargin: 0 0 10px;\n}\n\n.wp-video {\n\tmax-width: 100%;\n\theight: auto;\n}\n\n.wp_attachment_holder .wp-video,\n.wp_attachment_holder .wp-audio-shortcode {\n\tmargin-top: 18px;\n}\n\nvideo.wp-video-shortcode,\n.wp-video-shortcode video {\n\tmax-width: 100%;\n\tdisplay: inline-block;\n}\n\n.video-details .wp-video-holder {\n\twidth: 100%;\n\tmax-width: 640px;\n}\n\n.wp-playlist {\n\tborder: 1px solid #ccc;\n\tpadding: 10px;\n\tmargin: 12px 0 18px;\n\tfont-size: 14px;\n\tline-height: 1.5;\n}\n\n.wp-admin .wp-playlist {\n\tmargin: 0 0 18px;\n}\n\n.wp-playlist video {\n\tdisplay: inline-block;\n\tmax-width: 100%;\n}\n\n.wp-playlist audio {\n\tdisplay: none;\n\tmax-width: 100%;\n\twidth: 400px;\n}\n\n.wp-playlist .mejs-container {\n\tmargin: 0;\n\twidth: 100%;\n}\n\n.wp-playlist .mejs-controls .mejs-button button {\n\toutline: 0;\n}\n\n.wp-playlist-light {\n\tbackground: #fff;\n\tcolor: #000;\n}\n\n.wp-playlist-dark {\n\tcolor: #fff;\n\tbackground: #000;\n}\n\n.wp-playlist-caption {\n\tdisplay: block;\n\tmax-width: 88%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tfont-size: 14px;\n\tline-height: 1.5;\n}\n\n.wp-playlist-item .wp-playlist-caption {\n\ttext-decoration: none;\n\tcolor: #000;\n\tmax-width: -webkit-calc(100% - 40px);\n\tmax-width: calc(100% - 40px);\n}\n\n.wp-playlist-item-meta {\n\tdisplay: block;\n\tfont-size: 14px;\n\tline-height: 1.5;\n}\n\n.wp-playlist-item-title {\n\tfont-size: 14px;\n\tline-height: 1.5;\n}\n\n.wp-playlist-item-album {\n\tfont-style: italic;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.wp-playlist-item-artist {\n\tfont-size: 12px;\n\ttext-transform: uppercase;\n}\n\n.wp-playlist-item-length {\n\tposition: absolute;\n\tright: 3px;\n\ttop: 0;\n\tfont-size: 14px;\n\tline-height: 1.5;\n}\n\n.rtl .wp-playlist-item-length {\n\tleft: 3px;\n\tright: auto;\n}\n\n.wp-playlist-tracks {\n\tmargin-top: 10px;\n}\n\n.wp-playlist-item {\n\tposition: relative;\n\tcursor: pointer;\n\tpadding: 0 3px;\n\tborder-bottom: 1px solid #ccc;\n}\n\n.wp-playlist-item:last-child {\n\tborder-bottom: 0;\n}\n\n.wp-playlist-light .wp-playlist-caption {\n\tcolor: #333;\n}\n\n.wp-playlist-dark .wp-playlist-caption {\n\tcolor: #dedede;\n}\n\n.wp-playlist-playing {\n\tfont-weight: bold;\n\tbackground: #f7f7f7;\n}\n\n.wp-playlist-light .wp-playlist-playing {\n\tbackground: #fff;\n\tcolor: #000;\n}\n\n.wp-playlist-dark .wp-playlist-playing {\n\tbackground: #000;\n\tcolor: #fff;\n}\n\n.wp-playlist-current-item {\n\toverflow: hidden;\n\tmargin-bottom: 10px;\n\theight: 60px;\n}\n\n.wp-playlist .wp-playlist-current-item img {\n\tfloat: left;\n\tmax-width: 60px;\n\theight: auto;\n\tmargin-right: 10px;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.rtl .wp-playlist .wp-playlist-current-item img {\n\tfloat: right;\n\tmargin-left: 10px;\n\tmargin-right: 0;\n}\n\n.wp-playlist-current-item .wp-playlist-item-title,\n.wp-playlist-current-item .wp-playlist-item-artist {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.wp-audio-playlist .me-cannotplay span {\n\tpadding: 5px 15px;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/mediaelement/wp-mediaelement.js",
    "content": "/* global mejs, _wpmejsSettings */\n(function( window, $ ) {\n\n\twindow.wp = window.wp || {};\n\n\t// add mime-type aliases to MediaElement plugin support\n\tmejs.plugins.silverlight[0].types.push('video/x-ms-wmv');\n\tmejs.plugins.silverlight[0].types.push('audio/x-ms-wma');\n\n\tfunction wpMediaElement() {\n\t\tvar settings = {};\n\n\t\t/**\n\t\t * Initialize media elements.\n\t\t *\n\t\t * Ensures media elements that have already been initialized won't be\n\t\t * processed again.\n\t\t *\n\t\t * @since 4.4.0\n\t\t */\n\t\tfunction initialize() {\n\t\t\tif ( typeof _wpmejsSettings !== 'undefined' ) {\n\t\t\t\tsettings = _wpmejsSettings;\n\t\t\t}\n\n\t\t\tsettings.success = settings.success || function (mejs) {\n\t\t\t\tvar autoplay, loop;\n\n\t\t\t\tif ( 'flash' === mejs.pluginType ) {\n\t\t\t\t\tautoplay = mejs.attributes.autoplay && 'false' !== mejs.attributes.autoplay;\n\t\t\t\t\tloop = mejs.attributes.loop && 'false' !== mejs.attributes.loop;\n\n\t\t\t\t\tautoplay && mejs.addEventListener( 'canplay', function () {\n\t\t\t\t\t\tmejs.play();\n\t\t\t\t\t}, false );\n\n\t\t\t\t\tloop && mejs.addEventListener( 'ended', function () {\n\t\t\t\t\t\tmejs.play();\n\t\t\t\t\t}, false );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Only initialize new media elements.\n\t\t\t$( '.wp-audio-shortcode, .wp-video-shortcode' )\n\t\t\t\t.not( '.mejs-container' )\n\t\t\t\t.filter(function () {\n\t\t\t\t\treturn ! $( this ).parent().hasClass( '.mejs-mediaelement' );\n\t\t\t\t})\n\t\t\t\t.mediaelementplayer( settings );\n\t\t}\n\n\t\treturn {\n\t\t\tinitialize: initialize\n\t\t};\n\t}\n\n\twindow.wp.mediaelement = new wpMediaElement();\n\n\t$( document ).on( 'ready', window.wp.mediaelement.initialize );\n\n})( window, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/mediaelement/wp-playlist.js",
    "content": "/*globals window, document, jQuery, _, Backbone, _wpmejsSettings */\n\n(function ($, _, Backbone) {\n\t\"use strict\";\n\n\tvar WPPlaylistView = Backbone.View.extend({\n\t\tinitialize : function (options) {\n\t\t\tthis.index = 0;\n\t\t\tthis.settings = {};\n\t\t\tthis.data = options.metadata || $.parseJSON( this.$('script.wp-playlist-script').html() );\n\t\t\tthis.playerNode = this.$( this.data.type );\n\n\t\t\tthis.tracks = new Backbone.Collection( this.data.tracks );\n\t\t\tthis.current = this.tracks.first();\n\n\t\t\tif ( 'audio' === this.data.type ) {\n\t\t\t\tthis.currentTemplate = wp.template( 'wp-playlist-current-item' );\n\t\t\t\tthis.currentNode = this.$( '.wp-playlist-current-item' );\n\t\t\t}\n\n\t\t\tthis.renderCurrent();\n\n\t\t\tif ( this.data.tracklist ) {\n\t\t\t\tthis.itemTemplate = wp.template( 'wp-playlist-item' );\n\t\t\t\tthis.playingClass = 'wp-playlist-playing';\n\t\t\t\tthis.renderTracks();\n\t\t\t}\n\n\t\t\tthis.playerNode.attr( 'src', this.current.get( 'src' ) );\n\n\t\t\t_.bindAll( this, 'bindPlayer', 'bindResetPlayer', 'setPlayer', 'ended', 'clickTrack' );\n\n\t\t\tif ( ! _.isUndefined( window._wpmejsSettings ) ) {\n\t\t\t\tthis.settings = _wpmejsSettings;\n\t\t\t}\n\t\t\tthis.settings.success = this.bindPlayer;\n\t\t\tthis.setPlayer();\n\t\t},\n\n\t\tbindPlayer : function (mejs) {\n\t\t\tthis.mejs = mejs;\n\t\t\tthis.mejs.addEventListener( 'ended', this.ended );\n\t\t},\n\n\t\tbindResetPlayer : function (mejs) {\n\t\t\tthis.bindPlayer( mejs );\n\t\t\tthis.playCurrentSrc();\n\t\t},\n\n\t\tsetPlayer: function (force) {\n\t\t\tif ( this.player ) {\n\t\t\t\tthis.player.pause();\n\t\t\t\tthis.player.remove();\n\t\t\t\tthis.playerNode = this.$( this.data.type );\n\t\t\t}\n\n\t\t\tif (force) {\n\t\t\t\tthis.playerNode.attr( 'src', this.current.get( 'src' ) );\n\t\t\t\tthis.settings.success = this.bindResetPlayer;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * This is also our bridge to the outside world\n\t\t\t */\n\t\t\tthis.player = new MediaElementPlayer( this.playerNode.get(0), this.settings );\n\t\t},\n\n\t\tplayCurrentSrc : function () {\n\t\t\tthis.renderCurrent();\n\t\t\tthis.mejs.setSrc( this.playerNode.attr( 'src' ) );\n\t\t\tthis.mejs.load();\n\t\t\tthis.mejs.play();\n\t\t},\n\n\t\trenderCurrent : function () {\n\t\t\tvar dimensions, defaultImage = 'wp-includes/images/media/video.png';\n\t\t\tif ( 'video' === this.data.type ) {\n\t\t\t\tif ( this.data.images && this.current.get( 'image' ) && -1 === this.current.get( 'image' ).src.indexOf( defaultImage ) ) {\n\t\t\t\t\tthis.playerNode.attr( 'poster', this.current.get( 'image' ).src );\n\t\t\t\t}\n\t\t\t\tdimensions = this.current.get( 'dimensions' ).resized;\n\t\t\t\tthis.playerNode.attr( dimensions );\n\t\t\t} else {\n\t\t\t\tif ( ! this.data.images ) {\n\t\t\t\t\tthis.current.set( 'image', false );\n\t\t\t\t}\n\t\t\t\tthis.currentNode.html( this.currentTemplate( this.current.toJSON() ) );\n\t\t\t}\n\t\t},\n\n\t\trenderTracks : function () {\n\t\t\tvar self = this, i = 1, tracklist = $( '<div class=\"wp-playlist-tracks\"></div>' );\n\t\t\tthis.tracks.each(function (model) {\n\t\t\t\tif ( ! self.data.images ) {\n\t\t\t\t\tmodel.set( 'image', false );\n\t\t\t\t}\n\t\t\t\tmodel.set( 'artists', self.data.artists );\n\t\t\t\tmodel.set( 'index', self.data.tracknumbers ? i : false );\n\t\t\t\ttracklist.append( self.itemTemplate( model.toJSON() ) );\n\t\t\t\ti += 1;\n\t\t\t});\n\t\t\tthis.$el.append( tracklist );\n\n\t\t\tthis.$( '.wp-playlist-item' ).eq(0).addClass( this.playingClass );\n\t\t},\n\n\t\tevents : {\n\t\t\t'click .wp-playlist-item' : 'clickTrack',\n\t\t\t'click .wp-playlist-next' : 'next',\n\t\t\t'click .wp-playlist-prev' : 'prev'\n\t\t},\n\n\t\tclickTrack : function (e) {\n\t\t\te.preventDefault();\n\n\t\t\tthis.index = this.$( '.wp-playlist-item' ).index( e.currentTarget );\n\t\t\tthis.setCurrent();\n\t\t},\n\n\t\tended : function () {\n\t\t\tif ( this.index + 1 < this.tracks.length ) {\n\t\t\t\tthis.next();\n\t\t\t} else {\n\t\t\t\tthis.index = 0;\n\t\t\t\tthis.setCurrent();\n\t\t\t}\n\t\t},\n\n\t\tnext : function () {\n\t\t\tthis.index = this.index + 1 >= this.tracks.length ? 0 : this.index + 1;\n\t\t\tthis.setCurrent();\n\t\t},\n\n\t\tprev : function () {\n\t\t\tthis.index = this.index - 1 < 0 ? this.tracks.length - 1 : this.index - 1;\n\t\t\tthis.setCurrent();\n\t\t},\n\n\t\tloadCurrent : function () {\n\t\t\tvar last = this.playerNode.attr( 'src' ) && this.playerNode.attr( 'src' ).split('.').pop(),\n\t\t\t\tcurrent = this.current.get( 'src' ).split('.').pop();\n\n\t\t\tthis.mejs && this.mejs.pause();\n\n\t\t\tif ( last !== current ) {\n\t\t\t\tthis.setPlayer( true );\n\t\t\t} else {\n\t\t\t\tthis.playerNode.attr( 'src', this.current.get( 'src' ) );\n\t\t\t\tthis.playCurrentSrc();\n\t\t\t}\n\t\t},\n\n\t\tsetCurrent : function () {\n\t\t\tthis.current = this.tracks.at( this.index );\n\n\t\t\tif ( this.data.tracklist ) {\n\t\t\t\tthis.$( '.wp-playlist-item' )\n\t\t\t\t\t.removeClass( this.playingClass )\n\t\t\t\t\t.eq( this.index )\n\t\t\t\t\t\t.addClass( this.playingClass );\n\t\t\t}\n\n\t\t\tthis.loadCurrent();\n\t\t}\n\t});\n\n    $(document).ready(function () {\n\t\t$('.wp-playlist').each( function() {\n\t\t\treturn new WPPlaylistView({ el: this });\n\t\t} );\n    });\n\n\twindow.WPPlaylistView = WPPlaylistView;\n\n}(jQuery, _, Backbone));"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/plupload/handlers.js",
    "content": "/* global plupload, pluploadL10n, ajaxurl, post_id, wpUploaderInit, deleteUserSetting, setUserSetting, getUserSetting, shortform */\nvar topWin = window.dialogArguments || opener || parent || top, uploader, uploader_init;\n\n// progress and success handlers for media multi uploads\nfunction fileQueued(fileObj) {\n\t// Get rid of unused form\n\tjQuery('.media-blank').remove();\n\n\tvar items = jQuery('#media-items').children(), postid = post_id || 0;\n\n\t// Collapse a single item\n\tif ( items.length == 1 ) {\n\t\titems.removeClass('open').find('.slidetoggle').slideUp(200);\n\t}\n\t// Create a progress bar containing the filename\n\tjQuery('<div class=\"media-item\">')\n\t\t.attr( 'id', 'media-item-' + fileObj.id )\n\t\t.addClass('child-of-' + postid)\n\t\t.append('<div class=\"progress\"><div class=\"percent\">0%</div><div class=\"bar\"></div></div>',\n\t\t\tjQuery('<div class=\"filename original\">').text( ' ' + fileObj.name ))\n\t\t.appendTo( jQuery('#media-items' ) );\n\n\t// Disable submit\n\tjQuery('#insert-gallery').prop('disabled', true);\n}\n\nfunction uploadStart() {\n\ttry {\n\t\tif ( typeof topWin.tb_remove != 'undefined' )\n\t\t\ttopWin.jQuery('#TB_overlay').unbind('click', topWin.tb_remove);\n\t} catch(e){}\n\n\treturn true;\n}\n\nfunction uploadProgress(up, file) {\n\tvar item = jQuery('#media-item-' + file.id);\n\n\tjQuery('.bar', item).width( (200 * file.loaded) / file.size );\n\tjQuery('.percent', item).html( file.percent + '%' );\n}\n\n// check to see if a large file failed to upload\nfunction fileUploading( up, file ) {\n\tvar hundredmb = 100 * 1024 * 1024,\n\t\tmax = parseInt( up.settings.max_file_size, 10 );\n\n\tif ( max > hundredmb && file.size > hundredmb ) {\n\t\tsetTimeout( function() {\n\t\t\tif ( file.status < 3 && file.loaded === 0 ) { // not uploading\n\t\t\t\twpFileError( file, pluploadL10n.big_upload_failed.replace( '%1$s', '<a class=\"uploader-html\" href=\"#\">' ).replace( '%2$s', '</a>' ) );\n\t\t\t\tup.stop(); // stops the whole queue\n\t\t\t\tup.removeFile( file );\n\t\t\t\tup.start(); // restart the queue\n\t\t\t}\n\t\t}, 10000 ); // wait for 10 sec. for the file to start uploading\n\t}\n}\n\nfunction updateMediaForm() {\n\tvar items = jQuery('#media-items').children();\n\n\t// Just one file, no need for collapsible part\n\tif ( items.length == 1 ) {\n\t\titems.addClass('open').find('.slidetoggle').show();\n\t\tjQuery('.insert-gallery').hide();\n\t} else if ( items.length > 1 ) {\n\t\titems.removeClass('open');\n\t\t// Only show Gallery/Playlist buttons when there are at least two files.\n\t\tjQuery('.insert-gallery').show();\n\t}\n\n\t// Only show Save buttons when there is at least one file.\n\tif ( items.not('.media-blank').length > 0 )\n\t\tjQuery('.savebutton').show();\n\telse\n\t\tjQuery('.savebutton').hide();\n}\n\nfunction uploadSuccess(fileObj, serverData) {\n\tvar item = jQuery('#media-item-' + fileObj.id);\n\n\t// on success serverData should be numeric, fix bug in html4 runtime returning the serverData wrapped in a <pre> tag\n\tserverData = serverData.replace(/^<pre>(\\d+)<\\/pre>$/, '$1');\n\n\t// if async-upload returned an error message, place it in the media item div and return\n\tif ( serverData.match(/media-upload-error|error-div/) ) {\n\t\titem.html(serverData);\n\t\treturn;\n\t} else {\n\t\tjQuery('.percent', item).html( pluploadL10n.crunching );\n\t}\n\n\tprepareMediaItem(fileObj, serverData);\n\tupdateMediaForm();\n\n\t// Increment the counter.\n\tif ( post_id && item.hasClass('child-of-' + post_id) )\n\t\tjQuery('#attachments-count').text(1 * jQuery('#attachments-count').text() + 1);\n}\n\nfunction setResize( arg ) {\n\tif ( arg ) {\n\t\tif ( window.resize_width && window.resize_height ) {\n\t\t\tuploader.settings.resize = {\n\t\t\t\tenabled: true,\n\t\t\t\twidth: window.resize_width,\n\t\t\t\theight: window.resize_height,\n\t\t\t\tquality: 100\n\t\t\t};\n\t\t} else {\n\t\t\tuploader.settings.multipart_params.image_resize = true;\n\t\t}\n\t} else {\n\t\tdelete( uploader.settings.multipart_params.image_resize );\n\t}\n}\n\nfunction prepareMediaItem(fileObj, serverData) {\n\tvar f = ( typeof shortform == 'undefined' ) ? 1 : 2, item = jQuery('#media-item-' + fileObj.id);\n\tif ( f == 2 && shortform > 2 )\n\t\tf = shortform;\n\n\ttry {\n\t\tif ( typeof topWin.tb_remove != 'undefined' )\n\t\t\ttopWin.jQuery('#TB_overlay').click(topWin.tb_remove);\n\t} catch(e){}\n\n\tif ( isNaN(serverData) || !serverData ) { // Old style: Append the HTML returned by the server -- thumbnail and form inputs\n\t\titem.append(serverData);\n\t\tprepareMediaItemInit(fileObj);\n\t} else { // New style: server data is just the attachment ID, fetch the thumbnail and form html from the server\n\t\titem.load('async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit(fileObj);updateMediaForm();});\n\t}\n}\n\nfunction prepareMediaItemInit(fileObj) {\n\tvar item = jQuery('#media-item-' + fileObj.id);\n\t// Clone the thumbnail as a \"pinkynail\" -- a tiny image to the left of the filename\n\tjQuery('.thumbnail', item).clone().attr('class', 'pinkynail toggle').prependTo(item);\n\n\t// Replace the original filename with the new (unique) one assigned during upload\n\tjQuery('.filename.original', item).replaceWith( jQuery('.filename.new', item) );\n\n\t// Bind AJAX to the new Delete button\n\tjQuery('a.delete', item).click(function(){\n\t\t// Tell the server to delete it. TODO: handle exceptions\n\t\tjQuery.ajax({\n\t\t\turl: ajaxurl,\n\t\t\ttype: 'post',\n\t\t\tsuccess: deleteSuccess,\n\t\t\terror: deleteError,\n\t\t\tid: fileObj.id,\n\t\t\tdata: {\n\t\t\t\tid : this.id.replace(/[^0-9]/g, ''),\n\t\t\t\taction : 'trash-post',\n\t\t\t\t_ajax_nonce : this.href.replace(/^.*wpnonce=/,'')\n\t\t\t}\n\t\t});\n\t\treturn false;\n\t});\n\n\t// Bind AJAX to the new Undo button\n\tjQuery('a.undo', item).click(function(){\n\t\t// Tell the server to untrash it. TODO: handle exceptions\n\t\tjQuery.ajax({\n\t\t\turl: ajaxurl,\n\t\t\ttype: 'post',\n\t\t\tid: fileObj.id,\n\t\t\tdata: {\n\t\t\t\tid : this.id.replace(/[^0-9]/g,''),\n\t\t\t\taction: 'untrash-post',\n\t\t\t\t_ajax_nonce: this.href.replace(/^.*wpnonce=/,'')\n\t\t\t},\n\t\t\tsuccess: function( ){\n\t\t\t\tvar type,\n\t\t\t\t\titem = jQuery('#media-item-' + fileObj.id);\n\n\t\t\t\tif ( type = jQuery('#type-of-' + fileObj.id).val() )\n\t\t\t\t\tjQuery('#' + type + '-counter').text(jQuery('#' + type + '-counter').text()-0+1);\n\n\t\t\t\tif ( post_id && item.hasClass('child-of-'+post_id) )\n\t\t\t\t\tjQuery('#attachments-count').text(jQuery('#attachments-count').text()-0+1);\n\n\t\t\t\tjQuery('.filename .trashnotice', item).remove();\n\t\t\t\tjQuery('.filename .title', item).css('font-weight','normal');\n\t\t\t\tjQuery('a.undo', item).addClass('hidden');\n\t\t\t\tjQuery('.menu_order_input', item).show();\n\t\t\t\titem.css( {backgroundColor:'#ceb'} ).animate( {backgroundColor: '#fff'}, { queue: false, duration: 500, complete: function(){ jQuery(this).css({backgroundColor:''}); } }).removeClass('undo');\n\t\t\t}\n\t\t});\n\t\treturn false;\n\t});\n\n\t// Open this item if it says to start open (e.g. to display an error)\n\tjQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').addClass('open').find('slidetoggle').fadeIn();\n}\n\n// generic error message\nfunction wpQueueError(message) {\n\tjQuery('#media-upload-error').show().html( '<div class=\"error\"><p>' + message + '</p></div>' );\n}\n\n// file-specific error messages\nfunction wpFileError(fileObj, message) {\n\titemAjaxError(fileObj.id, message);\n}\n\nfunction itemAjaxError(id, message) {\n\tvar item = jQuery('#media-item-' + id), filename = item.find('.filename').text(), last_err = item.data('last-err');\n\n\tif ( last_err == id ) // prevent firing an error for the same file twice\n\t\treturn;\n\n\titem.html('<div class=\"error-div\">' +\n\t\t\t\t'<a class=\"dismiss\" href=\"#\">' + pluploadL10n.dismiss + '</a>' +\n\t\t\t\t'<strong>' + pluploadL10n.error_uploading.replace('%s', jQuery.trim(filename)) + '</strong> ' +\n\t\t\t\tmessage +\n\t\t\t\t'</div>').data('last-err', id);\n}\n\nfunction deleteSuccess(data) {\n\tvar type, id, item;\n\tif ( data == '-1' )\n\t\treturn itemAjaxError(this.id, 'You do not have permission. Has your session expired?');\n\n\tif ( data == '0' )\n\t\treturn itemAjaxError(this.id, 'Could not be deleted. Has it been deleted already?');\n\n\tid = this.id;\n\titem = jQuery('#media-item-' + id);\n\n\t// Decrement the counters.\n\tif ( type = jQuery('#type-of-' + id).val() )\n\t\tjQuery('#' + type + '-counter').text( jQuery('#' + type + '-counter').text() - 1 );\n\n\tif ( post_id && item.hasClass('child-of-'+post_id) )\n\t\tjQuery('#attachments-count').text( jQuery('#attachments-count').text() - 1 );\n\n\tif ( jQuery('form.type-form #media-items').children().length == 1 && jQuery('.hidden', '#media-items').length > 0 ) {\n\t\tjQuery('.toggle').toggle();\n\t\tjQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden');\n\t}\n\n\t// Vanish it.\n\tjQuery('.toggle', item).toggle();\n\tjQuery('.slidetoggle', item).slideUp(200).siblings().removeClass('hidden');\n\titem.css( {backgroundColor:'#faa'} ).animate( {backgroundColor:'#f4f4f4'}, {queue:false, duration:500} ).addClass('undo');\n\n\tjQuery('.filename:empty', item).remove();\n\tjQuery('.filename .title', item).css('font-weight','bold');\n\tjQuery('.filename', item).append('<span class=\"trashnotice\"> ' + pluploadL10n.deleted + ' </span>').siblings('a.toggle').hide();\n\tjQuery('.filename', item).append( jQuery('a.undo', item).removeClass('hidden') );\n\tjQuery('.menu_order_input', item).hide();\n\n\treturn;\n}\n\nfunction deleteError() {\n\t// TODO\n}\n\nfunction uploadComplete() {\n\tjQuery('#insert-gallery').prop('disabled', false);\n}\n\nfunction switchUploader(s) {\n\tif ( s ) {\n\t\tdeleteUserSetting('uploader');\n\t\tjQuery('.media-upload-form').removeClass('html-uploader');\n\n\t\tif ( typeof(uploader) == 'object' )\n\t\t\tuploader.refresh();\n\t} else {\n\t\tsetUserSetting('uploader', '1'); // 1 == html uploader\n\t\tjQuery('.media-upload-form').addClass('html-uploader');\n\t}\n}\n\nfunction uploadError(fileObj, errorCode, message, uploader) {\n\tvar hundredmb = 100 * 1024 * 1024, max;\n\n\tswitch (errorCode) {\n\t\tcase plupload.FAILED:\n\t\t\twpFileError(fileObj, pluploadL10n.upload_failed);\n\t\t\tbreak;\n\t\tcase plupload.FILE_EXTENSION_ERROR:\n\t\t\twpFileError(fileObj, pluploadL10n.invalid_filetype);\n\t\t\tbreak;\n\t\tcase plupload.FILE_SIZE_ERROR:\n\t\t\tuploadSizeError(uploader, fileObj);\n\t\t\tbreak;\n\t\tcase plupload.IMAGE_FORMAT_ERROR:\n\t\t\twpFileError(fileObj, pluploadL10n.not_an_image);\n\t\t\tbreak;\n\t\tcase plupload.IMAGE_MEMORY_ERROR:\n\t\t\twpFileError(fileObj, pluploadL10n.image_memory_exceeded);\n\t\t\tbreak;\n\t\tcase plupload.IMAGE_DIMENSIONS_ERROR:\n\t\t\twpFileError(fileObj, pluploadL10n.image_dimensions_exceeded);\n\t\t\tbreak;\n\t\tcase plupload.GENERIC_ERROR:\n\t\t\twpQueueError(pluploadL10n.upload_failed);\n\t\t\tbreak;\n\t\tcase plupload.IO_ERROR:\n\t\t\tmax = parseInt( uploader.settings.filters.max_file_size, 10 );\n\n\t\t\tif ( max > hundredmb && fileObj.size > hundredmb )\n\t\t\t\twpFileError( fileObj, pluploadL10n.big_upload_failed.replace('%1$s', '<a class=\"uploader-html\" href=\"#\">').replace('%2$s', '</a>') );\n\t\t\telse\n\t\t\t\twpQueueError(pluploadL10n.io_error);\n\t\t\tbreak;\n\t\tcase plupload.HTTP_ERROR:\n\t\t\twpQueueError(pluploadL10n.http_error);\n\t\t\tbreak;\n\t\tcase plupload.INIT_ERROR:\n\t\t\tjQuery('.media-upload-form').addClass('html-uploader');\n\t\t\tbreak;\n\t\tcase plupload.SECURITY_ERROR:\n\t\t\twpQueueError(pluploadL10n.security_error);\n\t\t\tbreak;\n/*\t\tcase plupload.UPLOAD_ERROR.UPLOAD_STOPPED:\n\t\tcase plupload.UPLOAD_ERROR.FILE_CANCELLED:\n\t\t\tjQuery('#media-item-' + fileObj.id).remove();\n\t\t\tbreak;*/\n\t\tdefault:\n\t\t\twpFileError(fileObj, pluploadL10n.default_error);\n\t}\n}\n\nfunction uploadSizeError( up, file, over100mb ) {\n\tvar message;\n\n\tif ( over100mb )\n\t\tmessage = pluploadL10n.big_upload_queued.replace('%s', file.name) + ' ' + pluploadL10n.big_upload_failed.replace('%1$s', '<a class=\"uploader-html\" href=\"#\">').replace('%2$s', '</a>');\n\telse\n\t\tmessage = pluploadL10n.file_exceeds_size_limit.replace('%s', file.name);\n\n\tjQuery('#media-items').append('<div id=\"media-item-' + file.id + '\" class=\"media-item error\"><p>' + message + '</p></div>');\n\tup.removeFile(file);\n}\n\njQuery(document).ready(function($){\n\t$('.media-upload-form').bind('click.uploader', function(e) {\n\t\tvar target = $(e.target), tr, c;\n\n\t\tif ( target.is('input[type=\"radio\"]') ) { // remember the last used image size and alignment\n\t\t\ttr = target.closest('tr');\n\n\t\t\tif ( tr.hasClass('align') )\n\t\t\t\tsetUserSetting('align', target.val());\n\t\t\telse if ( tr.hasClass('image-size') )\n\t\t\t\tsetUserSetting('imgsize', target.val());\n\n\t\t} else if ( target.is('button.button') ) { // remember the last used image link url\n\t\t\tc = e.target.className || '';\n\t\t\tc = c.match(/url([^ '\"]+)/);\n\n\t\t\tif ( c && c[1] ) {\n\t\t\t\tsetUserSetting('urlbutton', c[1]);\n\t\t\t\ttarget.siblings('.urlfield').val( target.data('link-url') );\n\t\t\t}\n\t\t} else if ( target.is('a.dismiss') ) {\n\t\t\ttarget.parents('.media-item').fadeOut(200, function(){\n\t\t\t\t$(this).remove();\n\t\t\t});\n\t\t} else if ( target.is('.upload-flash-bypass a') || target.is('a.uploader-html') ) { // switch uploader to html4\n\t\t\t$('#media-items, p.submit, span.big-file-warning').css('display', 'none');\n\t\t\tswitchUploader(0);\n\t\t\te.preventDefault();\n\t\t} else if ( target.is('.upload-html-bypass a') ) { // switch uploader to multi-file\n\t\t\t$('#media-items, p.submit, span.big-file-warning').css('display', '');\n\t\t\tswitchUploader(1);\n\t\t\te.preventDefault();\n\t\t} else if ( target.is('a.describe-toggle-on') ) { // Show\n\t\t\ttarget.parent().addClass('open');\n\t\t\ttarget.siblings('.slidetoggle').fadeIn(250, function(){\n\t\t\t\tvar S = $(window).scrollTop(), H = $(window).height(), top = $(this).offset().top, h = $(this).height(), b, B;\n\n\t\t\t\tif ( H && top && h ) {\n\t\t\t\t\tb = top + h;\n\t\t\t\t\tB = S + H;\n\n\t\t\t\t\tif ( b > B ) {\n\t\t\t\t\t\tif ( b - B < top - S )\n\t\t\t\t\t\t\twindow.scrollBy(0, (b - B) + 10);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twindow.scrollBy(0, top - S - 40);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\te.preventDefault();\n\t\t} else if ( target.is('a.describe-toggle-off') ) { // Hide\n\t\t\ttarget.siblings('.slidetoggle').fadeOut(250, function(){\n\t\t\t\ttarget.parent().removeClass('open');\n\t\t\t});\n\t\t\te.preventDefault();\n\t\t}\n\t});\n\n\t// init and set the uploader\n\tuploader_init = function() {\n\t\tvar isIE = navigator.userAgent.indexOf('Trident/') != -1 || navigator.userAgent.indexOf('MSIE ') != -1;\n\n\t\t// Make sure flash sends cookies (seems in IE it does whitout switching to urlstream mode)\n\t\tif ( ! isIE && 'flash' === plupload.predictRuntime( wpUploaderInit ) &&\n\t\t\t( ! wpUploaderInit.required_features || ! wpUploaderInit.required_features.hasOwnProperty( 'send_binary_string' ) ) ) {\n\n\t\t\twpUploaderInit.required_features = wpUploaderInit.required_features || {};\n\t\t\twpUploaderInit.required_features.send_binary_string = true;\n\t\t}\n\n\t\tuploader = new plupload.Uploader(wpUploaderInit);\n\n\t\t$('#image_resize').bind('change', function() {\n\t\t\tvar arg = $(this).prop('checked');\n\n\t\t\tsetResize( arg );\n\n\t\t\tif ( arg )\n\t\t\t\tsetUserSetting('upload_resize', '1');\n\t\t\telse\n\t\t\t\tdeleteUserSetting('upload_resize');\n\t\t});\n\n\t\tuploader.bind('Init', function(up) {\n\t\t\tvar uploaddiv = $('#plupload-upload-ui');\n\n\t\t\tsetResize( getUserSetting('upload_resize', false) );\n\n\t\t\tif ( up.features.dragdrop && ! $(document.body).hasClass('mobile') ) {\n\t\t\t\tuploaddiv.addClass('drag-drop');\n\t\t\t\t$('#drag-drop-area').bind('dragover.wp-uploader', function(){ // dragenter doesn't fire right :(\n\t\t\t\t\tuploaddiv.addClass('drag-over');\n\t\t\t\t}).bind('dragleave.wp-uploader, drop.wp-uploader', function(){\n\t\t\t\t\tuploaddiv.removeClass('drag-over');\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tuploaddiv.removeClass('drag-drop');\n\t\t\t\t$('#drag-drop-area').unbind('.wp-uploader');\n\t\t\t}\n\n\t\t\tif ( up.runtime === 'html4' ) {\n\t\t\t\t$('.upload-flash-bypass').hide();\n\t\t\t}\n\t\t});\n\n\t\tuploader.init();\n\n\t\tuploader.bind('FilesAdded', function( up, files ) {\n\t\t\t$('#media-upload-error').empty();\n\t\t\tuploadStart();\n\n\t\t\tplupload.each( files, function( file ) {\n\t\t\t\tfileQueued( file );\n\t\t\t});\n\n\t\t\tup.refresh();\n\t\t\tup.start();\n\t\t});\n\n\t\tuploader.bind('UploadFile', function(up, file) {\n\t\t\tfileUploading(up, file);\n\t\t});\n\n\t\tuploader.bind('UploadProgress', function(up, file) {\n\t\t\tuploadProgress(up, file);\n\t\t});\n\n\t\tuploader.bind('Error', function(up, err) {\n\t\t\tuploadError(err.file, err.code, err.message, up);\n\t\t\tup.refresh();\n\t\t});\n\n\t\tuploader.bind('FileUploaded', function(up, file, response) {\n\t\t\tuploadSuccess(file, response.response);\n\t\t});\n\n\t\tuploader.bind('UploadComplete', function() {\n\t\t\tuploadComplete();\n\t\t});\n\t};\n\n\tif ( typeof(wpUploaderInit) == 'object' ) {\n\t\tuploader_init();\n\t}\n\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/plupload/license.txt",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/plupload/wp-plupload.js",
    "content": "/* global pluploadL10n, plupload, _wpPluploadSettings */\n\nwindow.wp = window.wp || {};\n\n( function( exports, $ ) {\n\tvar Uploader;\n\n\tif ( typeof _wpPluploadSettings === 'undefined' ) {\n\t\treturn;\n\t}\n\n\t/**\n\t * A WordPress uploader.\n\t *\n\t * The Plupload library provides cross-browser uploader UI integration.\n\t * This object bridges the Plupload API to integrate uploads into the\n\t * WordPress back-end and the WordPress media experience.\n\t *\n\t * @param {object} options           The options passed to the new plupload instance.\n\t * @param {object} options.container The id of uploader container.\n\t * @param {object} options.browser   The id of button to trigger the file select.\n\t * @param {object} options.dropzone  The id of file drop target.\n\t * @param {object} options.plupload  An object of parameters to pass to the plupload instance.\n\t * @param {object} options.params    An object of parameters to pass to $_POST when uploading the file.\n\t *                                   Extends this.plupload.multipart_params under the hood.\n\t */\n\tUploader = function( options ) {\n\t\tvar self = this,\n\t\t\tisIE = navigator.userAgent.indexOf('Trident/') != -1 || navigator.userAgent.indexOf('MSIE ') != -1,\n\t\t\telements = {\n\t\t\t\tcontainer: 'container',\n\t\t\t\tbrowser:   'browse_button',\n\t\t\t\tdropzone:  'drop_element'\n\t\t\t},\n\t\t\tkey, error;\n\n\t\tthis.supports = {\n\t\t\tupload: Uploader.browser.supported\n\t\t};\n\n\t\tthis.supported = this.supports.upload;\n\n\t\tif ( ! this.supported ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Arguments to send to pluplad.Uploader().\n\t\t// Use deep extend to ensure that multipart_params and other objects are cloned.\n\t\tthis.plupload = $.extend( true, { multipart_params: {} }, Uploader.defaults );\n\t\tthis.container = document.body; // Set default container.\n\n\t\t// Extend the instance with options.\n\t\t//\n\t\t// Use deep extend to allow options.plupload to override individual\n\t\t// default plupload keys.\n\t\t$.extend( true, this, options );\n\n\t\t// Proxy all methods so this always refers to the current instance.\n\t\tfor ( key in this ) {\n\t\t\tif ( $.isFunction( this[ key ] ) ) {\n\t\t\t\tthis[ key ] = $.proxy( this[ key ], this );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure all elements are jQuery elements and have id attributes,\n\t\t// then set the proper plupload arguments to the ids.\n\t\tfor ( key in elements ) {\n\t\t\tif ( ! this[ key ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis[ key ] = $( this[ key ] ).first();\n\n\t\t\tif ( ! this[ key ].length ) {\n\t\t\t\tdelete this[ key ];\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( ! this[ key ].prop('id') ) {\n\t\t\t\tthis[ key ].prop( 'id', '__wp-uploader-id-' + Uploader.uuid++ );\n\t\t\t}\n\n\t\t\tthis.plupload[ elements[ key ] ] = this[ key ].prop('id');\n\t\t}\n\n\t\t// If the uploader has neither a browse button nor a dropzone, bail.\n\t\tif ( ! ( this.browser && this.browser.length ) && ! ( this.dropzone && this.dropzone.length ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure flash sends cookies (seems in IE it does without switching to urlstream mode)\n\t\tif ( ! isIE && 'flash' === plupload.predictRuntime( this.plupload ) &&\n\t\t\t( ! this.plupload.required_features || ! this.plupload.required_features.hasOwnProperty( 'send_binary_string' ) ) ) {\n\n\t\t\tthis.plupload.required_features = this.plupload.required_features || {};\n\t\t\tthis.plupload.required_features.send_binary_string = true;\n\t\t}\n\n\t\t// Initialize the plupload instance.\n\t\tthis.uploader = new plupload.Uploader( this.plupload );\n\t\tdelete this.plupload;\n\n\t\t// Set default params and remove this.params alias.\n\t\tthis.param( this.params || {} );\n\t\tdelete this.params;\n\n\t\t/**\n\t\t * Custom error callback.\n\t\t *\n\t\t * Add a new error to the errors collection, so other modules can track\n\t\t * and display errors. @see wp.Uploader.errors.\n\t\t *\n\t\t * @param  {string}        message\n\t\t * @param  {object}        data\n\t\t * @param  {plupload.File} file     File that was uploaded.\n\t\t */\n\t\terror = function( message, data, file ) {\n\t\t\tif ( file.attachment ) {\n\t\t\t\tfile.attachment.destroy();\n\t\t\t}\n\n\t\t\tUploader.errors.unshift({\n\t\t\t\tmessage: message || pluploadL10n.default_error,\n\t\t\t\tdata:    data,\n\t\t\t\tfile:    file\n\t\t\t});\n\n\t\t\tself.error( message, data, file );\n\t\t};\n\n\t\t/**\n\t\t * After the Uploader has been initialized, initialize some behaviors for the dropzone.\n\t\t *\n\t\t * @param {plupload.Uploader} uploader Uploader instance.\n\t\t */\n\t\tthis.uploader.bind( 'init', function( uploader ) {\n\t\t\tvar timer, active, dragdrop,\n\t\t\t\tdropzone = self.dropzone;\n\n\t\t\tdragdrop = self.supports.dragdrop = uploader.features.dragdrop && ! Uploader.browser.mobile;\n\n\t\t\t// Generate drag/drop helper classes.\n\t\t\tif ( ! dropzone ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdropzone.toggleClass( 'supports-drag-drop', !! dragdrop );\n\n\t\t\tif ( ! dragdrop ) {\n\t\t\t\treturn dropzone.unbind('.wp-uploader');\n\t\t\t}\n\n\t\t\t// 'dragenter' doesn't fire correctly, simulate it with a limited 'dragover'.\n\t\t\tdropzone.bind( 'dragover.wp-uploader', function() {\n\t\t\t\tif ( timer ) {\n\t\t\t\t\tclearTimeout( timer );\n\t\t\t\t}\n\n\t\t\t\tif ( active ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdropzone.trigger('dropzone:enter').addClass('drag-over');\n\t\t\t\tactive = true;\n\t\t\t});\n\n\t\t\tdropzone.bind('dragleave.wp-uploader, drop.wp-uploader', function() {\n\t\t\t\t// Using an instant timer prevents the drag-over class from\n\t\t\t\t// being quickly removed and re-added when elements inside the\n\t\t\t\t// dropzone are repositioned.\n\t\t\t\t//\n\t\t\t\t// @see https://core.trac.wordpress.org/ticket/21705\n\t\t\t\ttimer = setTimeout( function() {\n\t\t\t\t\tactive = false;\n\t\t\t\t\tdropzone.trigger('dropzone:leave').removeClass('drag-over');\n\t\t\t\t}, 0 );\n\t\t\t});\n\n\t\t\tself.ready = true;\n\t\t\t$(self).trigger( 'uploader:ready' );\n\t\t});\n\n\t\tthis.uploader.init();\n\n\t\tif ( this.browser ) {\n\t\t\tthis.browser.on( 'mouseenter', this.refresh );\n\t\t} else {\n\t\t\tthis.uploader.disableBrowse( true );\n\t\t\t// If HTML5 mode, hide the auto-created file container.\n\t\t\t$('#' + this.uploader.id + '_html5_container').hide();\n\t\t}\n\n\t\t/**\n\t\t * After files were filtered and added to the queue, create a model for each.\n\t\t *\n\t\t * @event FilesAdded\n\t\t * @param {plupload.Uploader} uploader Uploader instance.\n\t\t * @param {Array}             files    Array of file objects that were added to queue by the user.\n\t\t */\n\t\tthis.uploader.bind( 'FilesAdded', function( up, files ) {\n\t\t\t_.each( files, function( file ) {\n\t\t\t\tvar attributes, image;\n\n\t\t\t\t// Ignore failed uploads.\n\t\t\t\tif ( plupload.FAILED === file.status ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Generate attributes for a new `Attachment` model.\n\t\t\t\tattributes = _.extend({\n\t\t\t\t\tfile:      file,\n\t\t\t\t\tuploading: true,\n\t\t\t\t\tdate:      new Date(),\n\t\t\t\t\tfilename:  file.name,\n\t\t\t\t\tmenuOrder: 0,\n\t\t\t\t\tuploadedTo: wp.media.model.settings.post.id\n\t\t\t\t}, _.pick( file, 'loaded', 'size', 'percent' ) );\n\n\t\t\t\t// Handle early mime type scanning for images.\n\t\t\t\timage = /(?:jpe?g|png|gif)$/i.exec( file.name );\n\n\t\t\t\t// For images set the model's type and subtype attributes.\n\t\t\t\tif ( image ) {\n\t\t\t\t\tattributes.type = 'image';\n\n\t\t\t\t\t// `jpeg`, `png` and `gif` are valid subtypes.\n\t\t\t\t\t// `jpg` is not, so map it to `jpeg`.\n\t\t\t\t\tattributes.subtype = ( 'jpg' === image[0] ) ? 'jpeg' : image[0];\n\t\t\t\t}\n\n\t\t\t\t// Create a model for the attachment, and add it to the Upload queue collection\n\t\t\t\t// so listeners to the upload queue can track and display upload progress.\n\t\t\t\tfile.attachment = wp.media.model.Attachment.create( attributes );\n\t\t\t\tUploader.queue.add( file.attachment );\n\n\t\t\t\tself.added( file.attachment );\n\t\t\t});\n\n\t\t\tup.refresh();\n\t\t\tup.start();\n\t\t});\n\n\t\tthis.uploader.bind( 'UploadProgress', function( up, file ) {\n\t\t\tfile.attachment.set( _.pick( file, 'loaded', 'percent' ) );\n\t\t\tself.progress( file.attachment );\n\t\t});\n\n\t\t/**\n\t\t * After a file is successfully uploaded, update its model.\n\t\t *\n\t\t * @param {plupload.Uploader} uploader Uploader instance.\n\t\t * @param {plupload.File}     file     File that was uploaded.\n\t\t * @param {Object}            response Object with response properties.\n\t\t * @return {mixed}\n\t\t */\n\t\tthis.uploader.bind( 'FileUploaded', function( up, file, response ) {\n\t\t\tvar complete;\n\n\t\t\ttry {\n\t\t\t\tresponse = JSON.parse( response.response );\n\t\t\t} catch ( e ) {\n\t\t\t\treturn error( pluploadL10n.default_error, e, file );\n\t\t\t}\n\n\t\t\tif ( ! _.isObject( response ) || _.isUndefined( response.success ) )\n\t\t\t\treturn error( pluploadL10n.default_error, null, file );\n\t\t\telse if ( ! response.success )\n\t\t\t\treturn error( response.data && response.data.message, response.data, file );\n\n\t\t\t_.each(['file','loaded','size','percent'], function( key ) {\n\t\t\t\tfile.attachment.unset( key );\n\t\t\t});\n\n\t\t\tfile.attachment.set( _.extend( response.data, { uploading: false }) );\n\t\t\twp.media.model.Attachment.get( response.data.id, file.attachment );\n\n\t\t\tcomplete = Uploader.queue.all( function( attachment ) {\n\t\t\t\treturn ! attachment.get('uploading');\n\t\t\t});\n\n\t\t\tif ( complete )\n\t\t\t\tUploader.queue.reset();\n\n\t\t\tself.success( file.attachment );\n\t\t});\n\n\t\t/**\n\t\t * When plupload surfaces an error, send it to the error handler.\n\t\t *\n\t\t * @param {plupload.Uploader} uploader Uploader instance.\n\t\t * @param {Object}            error    Contains code, message and sometimes file and other details.\n\t\t */\n\t\tthis.uploader.bind( 'Error', function( up, pluploadError ) {\n\t\t\tvar message = pluploadL10n.default_error,\n\t\t\t\tkey;\n\n\t\t\t// Check for plupload errors.\n\t\t\tfor ( key in Uploader.errorMap ) {\n\t\t\t\tif ( pluploadError.code === plupload[ key ] ) {\n\t\t\t\t\tmessage = Uploader.errorMap[ key ];\n\n\t\t\t\t\tif ( _.isFunction( message ) ) {\n\t\t\t\t\t\tmessage = message( pluploadError.file, pluploadError );\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\terror( message, pluploadError, pluploadError.file );\n\t\t\tup.refresh();\n\t\t});\n\n\t\tthis.uploader.bind( 'PostInit', function() {\n\t\t\tself.init();\n\t\t});\n\t};\n\n\t// Adds the 'defaults' and 'browser' properties.\n\t$.extend( Uploader, _wpPluploadSettings );\n\n\tUploader.uuid = 0;\n\n\t// Map Plupload error codes to user friendly error messages.\n\tUploader.errorMap = {\n\t\t'FAILED':                 pluploadL10n.upload_failed,\n\t\t'FILE_EXTENSION_ERROR':   pluploadL10n.invalid_filetype,\n\t\t'IMAGE_FORMAT_ERROR':     pluploadL10n.not_an_image,\n\t\t'IMAGE_MEMORY_ERROR':     pluploadL10n.image_memory_exceeded,\n\t\t'IMAGE_DIMENSIONS_ERROR': pluploadL10n.image_dimensions_exceeded,\n\t\t'GENERIC_ERROR':          pluploadL10n.upload_failed,\n\t\t'IO_ERROR':               pluploadL10n.io_error,\n\t\t'HTTP_ERROR':             pluploadL10n.http_error,\n\t\t'SECURITY_ERROR':         pluploadL10n.security_error,\n\n\t\t'FILE_SIZE_ERROR': function( file ) {\n\t\t\treturn pluploadL10n.file_exceeds_size_limit.replace('%s', file.name);\n\t\t}\n\t};\n\n\t$.extend( Uploader.prototype, {\n\t\t/**\n\t\t * Acts as a shortcut to extending the uploader's multipart_params object.\n\t\t *\n\t\t * param( key )\n\t\t *    Returns the value of the key.\n\t\t *\n\t\t * param( key, value )\n\t\t *    Sets the value of a key.\n\t\t *\n\t\t * param( map )\n\t\t *    Sets values for a map of data.\n\t\t */\n\t\tparam: function( key, value ) {\n\t\t\tif ( arguments.length === 1 && typeof key === 'string' ) {\n\t\t\t\treturn this.uploader.settings.multipart_params[ key ];\n\t\t\t}\n\n\t\t\tif ( arguments.length > 1 ) {\n\t\t\t\tthis.uploader.settings.multipart_params[ key ] = value;\n\t\t\t} else {\n\t\t\t\t$.extend( this.uploader.settings.multipart_params, key );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Make a few internal event callbacks available on the wp.Uploader object\n\t\t * to change the Uploader internals if absolutely necessary.\n\t\t */\n\t\tinit:     function() {},\n\t\terror:    function() {},\n\t\tsuccess:  function() {},\n\t\tadded:    function() {},\n\t\tprogress: function() {},\n\t\tcomplete: function() {},\n\t\trefresh:  function() {\n\t\t\tvar node, attached, container, id;\n\n\t\t\tif ( this.browser ) {\n\t\t\t\tnode = this.browser[0];\n\n\t\t\t\t// Check if the browser node is in the DOM.\n\t\t\t\twhile ( node ) {\n\t\t\t\t\tif ( node === document.body ) {\n\t\t\t\t\t\tattached = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.parentNode;\n\t\t\t\t}\n\n\t\t\t\t// If the browser node is not attached to the DOM, use a\n\t\t\t\t// temporary container to house it, as the browser button\n\t\t\t\t// shims require the button to exist in the DOM at all times.\n\t\t\t\tif ( ! attached ) {\n\t\t\t\t\tid = 'wp-uploader-browser-' + this.uploader.id;\n\n\t\t\t\t\tcontainer = $( '#' + id );\n\t\t\t\t\tif ( ! container.length ) {\n\t\t\t\t\t\tcontainer = $('<div class=\"wp-uploader-browser\" />').css({\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\ttop: '-1000px',\n\t\t\t\t\t\t\tleft: '-1000px',\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\twidth: 0\n\t\t\t\t\t\t}).attr( 'id', 'wp-uploader-browser-' + this.uploader.id ).appendTo('body');\n\t\t\t\t\t}\n\n\t\t\t\t\tcontainer.append( this.browser );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.uploader.refresh();\n\t\t}\n\t});\n\n\t// Create a collection of attachments in the upload queue,\n\t// so that other modules can track and display upload progress.\n\tUploader.queue = new wp.media.model.Attachments( [], { query: false });\n\n\t// Create a collection to collect errors incurred while attempting upload.\n\tUploader.errors = new Backbone.Collection();\n\n\texports.Uploader = Uploader;\n})( wp, jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/quicktags.js",
    "content": "/* global adminpage, wpActiveEditor, quicktagsL10n, wpLink, prompt */\n/*\n * Quicktags\n *\n * This is the HTML editor in WordPress. It can be attached to any textarea and will\n * append a toolbar above it. This script is self-contained (does not require external libraries).\n *\n * Run quicktags(settings) to initialize it, where settings is an object containing up to 3 properties:\n * settings = {\n *   id : 'my_id',          the HTML ID of the textarea, required\n *   buttons: ''            Comma separated list of the names of the default buttons to show. Optional.\n *                          Current list of default button names: 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close';\n * }\n *\n * The settings can also be a string quicktags_id.\n *\n * quicktags_id string The ID of the textarea that will be the editor canvas\n * buttons string Comma separated list of the default buttons names that will be shown in that instance.\n */\n\n// new edit toolbar used with permission\n// by Alex King\n// http://www.alexking.org/\n\nvar QTags, edCanvas,\n\tedButtons = [];\n\n/* jshint ignore:start */\n\n/**\n * Back-compat\n *\n * Define all former global functions so plugins that hack quicktags.js directly don't cause fatal errors.\n */\nvar edAddTag = function(){},\nedCheckOpenTags = function(){},\nedCloseAllTags = function(){},\nedInsertImage = function(){},\nedInsertLink = function(){},\nedInsertTag = function(){},\nedLink = function(){},\nedQuickLink = function(){},\nedRemoveTag = function(){},\nedShowButton = function(){},\nedShowLinks = function(){},\nedSpell = function(){},\nedToolbar = function(){};\n\n/**\n * Initialize new instance of the Quicktags editor\n */\nfunction quicktags(settings) {\n\treturn new QTags(settings);\n}\n\n/**\n * Inserts content at the caret in the active editor (textarea)\n *\n * Added for back compatibility\n * @see QTags.insertContent()\n */\nfunction edInsertContent(bah, txt) {\n\treturn QTags.insertContent(txt);\n}\n\n/**\n * Adds a button to all instances of the editor\n *\n * Added for back compatibility, use QTags.addButton() as it gives more flexibility like type of button, button placement, etc.\n * @see QTags.addButton()\n */\nfunction edButton(id, display, tagStart, tagEnd, access) {\n\treturn QTags.addButton( id, display, tagStart, tagEnd, access, '', -1 );\n}\n\n/* jshint ignore:end */\n\n(function(){\n\t// private stuff is prefixed with an underscore\n\tvar _domReady = function(func) {\n\t\tvar t, i, DOMContentLoaded, _tryReady;\n\n\t\tif ( typeof jQuery !== 'undefined' ) {\n\t\t\tjQuery(document).ready(func);\n\t\t} else {\n\t\t\tt = _domReady;\n\t\t\tt.funcs = [];\n\n\t\t\tt.ready = function() {\n\t\t\t\tif ( ! t.isReady ) {\n\t\t\t\t\tt.isReady = true;\n\t\t\t\t\tfor ( i = 0; i < t.funcs.length; i++ ) {\n\t\t\t\t\t\tt.funcs[i]();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif ( t.isReady ) {\n\t\t\t\tfunc();\n\t\t\t} else {\n\t\t\t\tt.funcs.push(func);\n\t\t\t}\n\n\t\t\tif ( ! t.eventAttached ) {\n\t\t\t\tif ( document.addEventListener ) {\n\t\t\t\t\tDOMContentLoaded = function(){document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false);t.ready();};\n\t\t\t\t\tdocument.addEventListener('DOMContentLoaded', DOMContentLoaded, false);\n\t\t\t\t\twindow.addEventListener('load', t.ready, false);\n\t\t\t\t} else if ( document.attachEvent ) {\n\t\t\t\t\tDOMContentLoaded = function(){if (document.readyState === 'complete'){ document.detachEvent('onreadystatechange', DOMContentLoaded);t.ready();}};\n\t\t\t\t\tdocument.attachEvent('onreadystatechange', DOMContentLoaded);\n\t\t\t\t\twindow.attachEvent('onload', t.ready);\n\n\t\t\t\t\t_tryReady = function() {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdocument.documentElement.doScroll('left');\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\tsetTimeout(_tryReady, 50);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tt.ready();\n\t\t\t\t\t};\n\t\t\t\t\t_tryReady();\n\t\t\t\t}\n\n\t\t\t\tt.eventAttached = true;\n\t\t\t}\n\t\t}\n\t},\n\n\t_datetime = (function() {\n\t\tvar now = new Date(), zeroise;\n\n\t\tzeroise = function(number) {\n\t\t\tvar str = number.toString();\n\n\t\t\tif ( str.length < 2 ) {\n\t\t\t\tstr = '0' + str;\n\t\t\t}\n\n\t\t\treturn str;\n\t\t};\n\n\t\treturn now.getUTCFullYear() + '-' +\n\t\t\tzeroise( now.getUTCMonth() + 1 ) + '-' +\n\t\t\tzeroise( now.getUTCDate() ) + 'T' +\n\t\t\tzeroise( now.getUTCHours() ) + ':' +\n\t\t\tzeroise( now.getUTCMinutes() ) + ':' +\n\t\t\tzeroise( now.getUTCSeconds() ) +\n\t\t\t'+00:00';\n\t})(),\n\tqt;\n\n\tqt = QTags = function(settings) {\n\t\tif ( typeof(settings) === 'string' ) {\n\t\t\tsettings = {id: settings};\n\t\t} else if ( typeof(settings) !== 'object' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar t = this,\n\t\t\tid = settings.id,\n\t\t\tcanvas = document.getElementById(id),\n\t\t\tname = 'qt_' + id,\n\t\t\ttb, onclick, toolbar_id, wrap, setActiveEditor;\n\n\t\tif ( !id || !canvas ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tt.name = name;\n\t\tt.id = id;\n\t\tt.canvas = canvas;\n\t\tt.settings = settings;\n\n\t\tif ( id === 'content' && typeof(adminpage) === 'string' && ( adminpage === 'post-new-php' || adminpage === 'post-php' ) ) {\n\t\t\t// back compat hack :-(\n\t\t\tedCanvas = canvas;\n\t\t\ttoolbar_id = 'ed_toolbar';\n\t\t} else {\n\t\t\ttoolbar_id = name + '_toolbar';\n\t\t}\n\n\t\ttb = document.getElementById( toolbar_id );\n\n\t\tif ( ! tb ) {\n\t\t\ttb = document.createElement('div');\n\t\t\ttb.id = toolbar_id;\n\t\t\ttb.className = 'quicktags-toolbar';\n\t\t}\n\n\t\tcanvas.parentNode.insertBefore(tb, canvas);\n\t\tt.toolbar = tb;\n\n\t\t// listen for click events\n\t\tonclick = function(e) {\n\t\t\te = e || window.event;\n\t\t\tvar target = e.target || e.srcElement, visible = target.clientWidth || target.offsetWidth, i;\n\n\t\t\t// don't call the callback on pressing the accesskey when the button is not visible\n\t\t\tif ( !visible ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// as long as it has the class ed_button, execute the callback\n\t\t\tif ( / ed_button /.test(' ' + target.className + ' ') ) {\n\t\t\t\t// we have to reassign canvas here\n\t\t\t\tt.canvas = canvas = document.getElementById(id);\n\t\t\t\ti = target.id.replace(name + '_', '');\n\n\t\t\t\tif ( t.theButtons[i] ) {\n\t\t\t\t\tt.theButtons[i].callback.call(t.theButtons[i], target, canvas, t);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tsetActiveEditor = function() {\n\t\t\twindow.wpActiveEditor = id;\n\t\t};\n\n\t\twrap = document.getElementById( 'wp-' + id + '-wrap' );\n\n\t\tif ( tb.addEventListener ) {\n\t\t\ttb.addEventListener( 'click', onclick, false );\n\t\t\t\n\t\t\tif ( wrap ) {\n\t\t\t\twrap.addEventListener( 'click', setActiveEditor, false );\n\t\t\t}\n\t\t} else if ( tb.attachEvent ) {\n\t\t\ttb.attachEvent( 'onclick', onclick );\n\n\t\t\tif ( wrap ) {\n\t\t\t\twrap.attachEvent( 'onclick', setActiveEditor );\n\t\t\t}\n\t\t}\n\n\t\tt.getButton = function(id) {\n\t\t\treturn t.theButtons[id];\n\t\t};\n\n\t\tt.getButtonElement = function(id) {\n\t\t\treturn document.getElementById(name + '_' + id);\n\t\t};\n\n\t\tqt.instances[id] = t;\n\n\t\tif ( ! qt.instances['0'] ) {\n\t\t\tqt.instances['0'] = qt.instances[id];\n\t\t\t_domReady( function(){ qt._buttonsInit(); } );\n\t\t}\n\t};\n\n\tfunction _escape( text ) {\n\t\ttext = text || '';\n\t\ttext = text.replace( /&([^#])(?![a-z1-4]{1,8};)/gi, '&#038;$1' );\n\t\treturn text.replace( /</g, '&lt;' ).replace( />/g, '&gt;' ).replace( /\"/g, '&quot;' ).replace( /'/g, '&#039;' );\n\t}\n\n\tqt.instances = {};\n\n\tqt.getInstance = function(id) {\n\t\treturn qt.instances[id];\n\t};\n\n\tqt._buttonsInit = function() {\n\t\tvar t = this, canvas, name, settings, theButtons, html, inst, ed, id, i, use,\n\t\t\tdefaults = ',strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,';\n\n\t\tfor ( inst in t.instances ) {\n\t\t\tif ( '0' === inst ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ted = t.instances[inst];\n\t\t\tcanvas = ed.canvas;\n\t\t\tname = ed.name;\n\t\t\tsettings = ed.settings;\n\t\t\thtml = '';\n\t\t\ttheButtons = {};\n\t\t\tuse = '';\n\n\t\t\t// set buttons\n\t\t\tif ( settings.buttons ) {\n\t\t\t\tuse = ','+settings.buttons+',';\n\t\t\t}\n\n\t\t\tfor ( i in edButtons ) {\n\t\t\t\tif ( !edButtons[i] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tid = edButtons[i].id;\n\t\t\t\tif ( use && defaults.indexOf( ',' + id + ',' ) !== -1 && use.indexOf( ',' + id + ',' ) === -1 ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( !edButtons[i].instance || edButtons[i].instance === inst ) {\n\t\t\t\t\ttheButtons[id] = edButtons[i];\n\n\t\t\t\t\tif ( edButtons[i].html ) {\n\t\t\t\t\t\thtml += edButtons[i].html(name + '_');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( use && use.indexOf(',dfw,') !== -1 ) {\n\t\t\t\ttheButtons.dfw = new qt.DFWButton();\n\t\t\t\thtml += theButtons.dfw.html( name + '_' );\n\t\t\t}\n\n\t\t\tif ( 'rtl' === document.getElementsByTagName('html')[0].dir ) {\n\t\t\t\ttheButtons.textdirection = new qt.TextDirectionButton();\n\t\t\t\thtml += theButtons.textdirection.html(name + '_');\n\t\t\t}\n\n\t\t\ted.toolbar.innerHTML = html;\n\t\t\ted.theButtons = theButtons;\n\n\t\t\tif ( typeof jQuery !== 'undefined' ) {\n\t\t\t\tjQuery( document ).triggerHandler( 'quicktags-init', [ ed ] );\n\t\t\t}\n\t\t}\n\t\tt.buttonsInitDone = true;\n\t};\n\n\t/**\n\t * Main API function for adding a button to Quicktags\n\t *\n\t * Adds qt.Button or qt.TagButton depending on the args. The first three args are always required.\n\t * To be able to add button(s) to Quicktags, your script should be enqueued as dependent\n\t * on \"quicktags\" and outputted in the footer. If you are echoing JS directly from PHP,\n\t * use add_action( 'admin_print_footer_scripts', 'output_my_js', 100 ) or add_action( 'wp_footer', 'output_my_js', 100 )\n\t *\n\t * Minimum required to add a button that calls an external function:\n\t *     QTags.addButton( 'my_id', 'my button', my_callback );\n\t *     function my_callback() { alert('yeah!'); }\n\t *\n\t * Minimum required to add a button that inserts a tag:\n\t *     QTags.addButton( 'my_id', 'my button', '<span>', '</span>' );\n\t *     QTags.addButton( 'my_id2', 'my button', '<br />' );\n\t *\n\t * @param string id Required. Button HTML ID\n\t * @param string display Required. Button's value=\"...\"\n\t * @param string|function arg1 Required. Either a starting tag to be inserted like \"<span>\" or a callback that is executed when the button is clicked.\n\t * @param string arg2 Optional. Ending tag like \"</span>\"\n\t * @param string access_key Deprecated Not used\n\t * @param string title Optional. Button's title=\"...\"\n\t * @param int priority Optional. Number representing the desired position of the button in the toolbar. 1 - 9 = first, 11 - 19 = second, 21 - 29 = third, etc.\n\t * @param string instance Optional. Limit the button to a specific instance of Quicktags, add to all instances if not present.\n\t * @param attr object Optional. Used to pass additional attributes. Currently supports `ariaLabel` and `ariaLabelClose` (for \"close tag\" state)\n\t * @return mixed null or the button object that is needed for back-compat.\n\t */\n\tqt.addButton = function( id, display, arg1, arg2, access_key, title, priority, instance, attr ) {\n\t\tvar btn;\n\n\t\tif ( !id || !display ) {\n\t\t\treturn;\n\t\t}\n\n\t\tpriority = priority || 0;\n\t\targ2 = arg2 || '';\n\t\tattr = attr || {};\n\n\t\tif ( typeof(arg1) === 'function' ) {\n\t\t\tbtn = new qt.Button( id, display, access_key, title, instance, attr );\n\t\t\tbtn.callback = arg1;\n\t\t} else if ( typeof(arg1) === 'string' ) {\n\t\t\tbtn = new qt.TagButton( id, display, arg1, arg2, access_key, title, instance, attr );\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( priority === -1 ) { // back-compat\n\t\t\treturn btn;\n\t\t}\n\n\t\tif ( priority > 0 ) {\n\t\t\twhile ( typeof(edButtons[priority]) !== 'undefined' ) {\n\t\t\t\tpriority++;\n\t\t\t}\n\n\t\t\tedButtons[priority] = btn;\n\t\t} else {\n\t\t\tedButtons[edButtons.length] = btn;\n\t\t}\n\n\t\tif ( this.buttonsInitDone ) {\n\t\t\tthis._buttonsInit(); // add the button HTML to all instances toolbars if addButton() was called too late\n\t\t}\n\t};\n\n\tqt.insertContent = function(content) {\n\t\tvar sel, startPos, endPos, scrollTop, text, canvas = document.getElementById(wpActiveEditor);\n\n\t\tif ( !canvas ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( document.selection ) { //IE\n\t\t\tcanvas.focus();\n\t\t\tsel = document.selection.createRange();\n\t\t\tsel.text = content;\n\t\t\tcanvas.focus();\n\t\t} else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera\n\t\t\ttext = canvas.value;\n\t\t\tstartPos = canvas.selectionStart;\n\t\t\tendPos = canvas.selectionEnd;\n\t\t\tscrollTop = canvas.scrollTop;\n\n\t\t\tcanvas.value = text.substring(0, startPos) + content + text.substring(endPos, text.length);\n\n\t\t\tcanvas.selectionStart = startPos + content.length;\n\t\t\tcanvas.selectionEnd = startPos + content.length;\n\t\t\tcanvas.scrollTop = scrollTop;\n\t\t\tcanvas.focus();\n\t\t} else {\n\t\t\tcanvas.value += content;\n\t\t\tcanvas.focus();\n\t\t}\n\t\treturn true;\n\t};\n\n\t// a plain, dumb button\n\tqt.Button = function( id, display, access, title, instance, attr ) {\n\t\tthis.id = id;\n\t\tthis.display = display;\n\t\tthis.access = '';\n\t\tthis.title = title || '';\n\t\tthis.instance = instance || '';\n\t\tthis.attr = attr || {};\n\t};\n\tqt.Button.prototype.html = function(idPrefix) {\n\t\tvar active, on, wp,\n\t\t\ttitle = this.title ? ' title=\"' + _escape( this.title ) + '\"' : '',\n\t\t\tariaLabel = this.attr && this.attr.ariaLabel ? ' aria-label=\"' + _escape( this.attr.ariaLabel ) + '\"' : '',\n\t\t\tval = this.display ? ' value=\"' + _escape( this.display ) + '\"' : '',\n\t\t\tid = this.id ? ' id=\"' + _escape( idPrefix + this.id ) + '\"' : '',\n\t\t\tdfw = ( wp = window.wp ) && wp.editor && wp.editor.dfw;\n\n\t\tif ( this.id === 'fullscreen' ) {\n\t\t\treturn '<button type=\"button\"' + id + ' class=\"ed_button qt-dfw qt-fullscreen\"' + title + ariaLabel + '></button>';\n\t\t} else if ( this.id === 'dfw' ) {\n\t\t\tactive = dfw && dfw.isActive() ? '' : ' disabled=\"disabled\"';\n\t\t\ton = dfw && dfw.isOn() ? ' active' : '';\n\n\t\t\treturn '<button type=\"button\"' + id + ' class=\"ed_button qt-dfw' + on + '\"' + title + ariaLabel + active + '></button>';\n\t\t}\n\n\t\treturn '<input type=\"button\"' + id + ' class=\"ed_button button button-small\"' + title + ariaLabel + val + ' />';\n\t};\n\tqt.Button.prototype.callback = function(){};\n\n\t// a button that inserts HTML tag\n\tqt.TagButton = function( id, display, tagStart, tagEnd, access, title, instance, attr ) {\n\t\tvar t = this;\n\t\tqt.Button.call( t, id, display, access, title, instance, attr );\n\t\tt.tagStart = tagStart;\n\t\tt.tagEnd = tagEnd;\n\t};\n\tqt.TagButton.prototype = new qt.Button();\n\tqt.TagButton.prototype.openTag = function( element, ed ) {\n\t\tif ( ! ed.openTags ) {\n\t\t\ted.openTags = [];\n\t\t}\n\n\t\tif ( this.tagEnd ) {\n\t\t\ted.openTags.push( this.id );\n\t\t\telement.value = '/' + element.value;\n\n\t\t\tif ( this.attr.ariaLabelClose ) {\n\t\t\t\telement.setAttribute( 'aria-label', this.attr.ariaLabelClose );\n\t\t\t}\n\t\t}\n\t};\n\tqt.TagButton.prototype.closeTag = function( element, ed ) {\n\t\tvar i = this.isOpen(ed);\n\n\t\tif ( i !== false ) {\n\t\t\ted.openTags.splice( i, 1 );\n\t\t}\n\n\t\telement.value = this.display;\n\n\t\tif ( this.attr.ariaLabel ) {\n\t\t\telement.setAttribute( 'aria-label', this.attr.ariaLabel );\n\t\t}\n\t};\n\t// whether a tag is open or not. Returns false if not open, or current open depth of the tag\n\tqt.TagButton.prototype.isOpen = function (ed) {\n\t\tvar t = this, i = 0, ret = false;\n\t\tif ( ed.openTags ) {\n\t\t\twhile ( ret === false && i < ed.openTags.length ) {\n\t\t\t\tret = ed.openTags[i] === t.id ? i : false;\n\t\t\t\ti ++;\n\t\t\t}\n\t\t} else {\n\t\t\tret = false;\n\t\t}\n\t\treturn ret;\n\t};\n\tqt.TagButton.prototype.callback = function(element, canvas, ed) {\n\t\tvar t = this, startPos, endPos, cursorPos, scrollTop, v = canvas.value, l, r, i, sel, endTag = v ? t.tagEnd : '';\n\n\t\tif ( document.selection ) { // IE\n\t\t\tcanvas.focus();\n\t\t\tsel = document.selection.createRange();\n\t\t\tif ( sel.text.length > 0 ) {\n\t\t\t\tif ( !t.tagEnd ) {\n\t\t\t\t\tsel.text = sel.text + t.tagStart;\n\t\t\t\t} else {\n\t\t\t\t\tsel.text = t.tagStart + sel.text + endTag;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( !t.tagEnd ) {\n\t\t\t\t\tsel.text = t.tagStart;\n\t\t\t\t} else if ( t.isOpen(ed) === false ) {\n\t\t\t\t\tsel.text = t.tagStart;\n\t\t\t\t\tt.openTag(element, ed);\n\t\t\t\t} else {\n\t\t\t\t\tsel.text = endTag;\n\t\t\t\t\tt.closeTag(element, ed);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcanvas.focus();\n\t\t} else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera\n\t\t\tstartPos = canvas.selectionStart;\n\t\t\tendPos = canvas.selectionEnd;\n\t\t\tcursorPos = endPos;\n\t\t\tscrollTop = canvas.scrollTop;\n\t\t\tl = v.substring(0, startPos); // left of the selection\n\t\t\tr = v.substring(endPos, v.length); // right of the selection\n\t\t\ti = v.substring(startPos, endPos); // inside the selection\n\t\t\tif ( startPos !== endPos ) {\n\t\t\t\tif ( !t.tagEnd ) {\n\t\t\t\t\tcanvas.value = l + i + t.tagStart + r; // insert self closing tags after the selection\n\t\t\t\t\tcursorPos += t.tagStart.length;\n\t\t\t\t} else {\n\t\t\t\t\tcanvas.value = l + t.tagStart + i + endTag + r;\n\t\t\t\t\tcursorPos += t.tagStart.length + endTag.length;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( !t.tagEnd ) {\n\t\t\t\t\tcanvas.value = l + t.tagStart + r;\n\t\t\t\t\tcursorPos = startPos + t.tagStart.length;\n\t\t\t\t} else if ( t.isOpen(ed) === false ) {\n\t\t\t\t\tcanvas.value = l + t.tagStart + r;\n\t\t\t\t\tt.openTag(element, ed);\n\t\t\t\t\tcursorPos = startPos + t.tagStart.length;\n\t\t\t\t} else {\n\t\t\t\t\tcanvas.value = l + endTag + r;\n\t\t\t\t\tcursorPos = startPos + endTag.length;\n\t\t\t\t\tt.closeTag(element, ed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcanvas.selectionStart = cursorPos;\n\t\t\tcanvas.selectionEnd = cursorPos;\n\t\t\tcanvas.scrollTop = scrollTop;\n\t\t\tcanvas.focus();\n\t\t} else { // other browsers?\n\t\t\tif ( !endTag ) {\n\t\t\t\tcanvas.value += t.tagStart;\n\t\t\t} else if ( t.isOpen(ed) !== false ) {\n\t\t\t\tcanvas.value += t.tagStart;\n\t\t\t\tt.openTag(element, ed);\n\t\t\t} else {\n\t\t\t\tcanvas.value += endTag;\n\t\t\t\tt.closeTag(element, ed);\n\t\t\t}\n\t\t\tcanvas.focus();\n\t\t}\n\t};\n\n\t// removed\n\tqt.SpellButton = function() {};\n\n\t// the close tags button\n\tqt.CloseButton = function() {\n\t\tqt.Button.call( this, 'close', quicktagsL10n.closeTags, '', quicktagsL10n.closeAllOpenTags );\n\t};\n\n\tqt.CloseButton.prototype = new qt.Button();\n\n\tqt._close = function(e, c, ed) {\n\t\tvar button, element, tbo = ed.openTags;\n\n\t\tif ( tbo ) {\n\t\t\twhile ( tbo.length > 0 ) {\n\t\t\t\tbutton = ed.getButton(tbo[tbo.length - 1]);\n\t\t\t\telement = document.getElementById(ed.name + '_' + button.id);\n\n\t\t\t\tif ( e ) {\n\t\t\t\t\tbutton.callback.call(button, element, c, ed);\n\t\t\t\t} else {\n\t\t\t\t\tbutton.closeTag(element, ed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tqt.CloseButton.prototype.callback = qt._close;\n\n\tqt.closeAllTags = function(editor_id) {\n\t\tvar ed = this.getInstance(editor_id);\n\t\tqt._close('', ed.canvas, ed);\n\t};\n\n\t// the link button\n\tqt.LinkButton = function() {\n\t\tvar attr = {\n\t\t\tariaLabel: quicktagsL10n.link\n\t\t};\n\n\t\tqt.TagButton.call( this, 'link', 'link', '', '</a>', '', '', '', attr );\n\t};\n\tqt.LinkButton.prototype = new qt.TagButton();\n\tqt.LinkButton.prototype.callback = function(e, c, ed, defaultValue) {\n\t\tvar URL, t = this;\n\n\t\tif ( typeof wpLink !== 'undefined' ) {\n\t\t\twpLink.open( ed.id );\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! defaultValue ) {\n\t\t\tdefaultValue = 'http://';\n\t\t}\n\n\t\tif ( t.isOpen(ed) === false ) {\n\t\t\tURL = prompt( quicktagsL10n.enterURL, defaultValue );\n\t\t\tif ( URL ) {\n\t\t\t\tt.tagStart = '<a href=\"' + URL + '\">';\n\t\t\t\tqt.TagButton.prototype.callback.call(t, e, c, ed);\n\t\t\t}\n\t\t} else {\n\t\t\tqt.TagButton.prototype.callback.call(t, e, c, ed);\n\t\t}\n\t};\n\n\t// the img button\n\tqt.ImgButton = function() {\n\t\tvar attr = {\n\t\t\tariaLabel: quicktagsL10n.image\n\t\t};\n\n\t\tqt.TagButton.call( this, 'img', 'img', '', '', '', '', '', attr );\n\t};\n\tqt.ImgButton.prototype = new qt.TagButton();\n\tqt.ImgButton.prototype.callback = function(e, c, ed, defaultValue) {\n\t\tif ( ! defaultValue ) {\n\t\t\tdefaultValue = 'http://';\n\t\t}\n\t\tvar src = prompt(quicktagsL10n.enterImageURL, defaultValue), alt;\n\t\tif ( src ) {\n\t\t\talt = prompt(quicktagsL10n.enterImageDescription, '');\n\t\t\tthis.tagStart = '<img src=\"' + src + '\" alt=\"' + alt + '\" />';\n\t\t\tqt.TagButton.prototype.callback.call(this, e, c, ed);\n\t\t}\n\t};\n\n\tqt.DFWButton = function() {\n\t\tqt.Button.call( this, 'dfw', '', 'f', quicktagsL10n.dfw );\n\t};\n\tqt.DFWButton.prototype = new qt.Button();\n\tqt.DFWButton.prototype.callback = function() {\n\t\tvar wp;\n\n\t\tif ( ! ( wp = window.wp ) || ! wp.editor || ! wp.editor.dfw ) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.wp.editor.dfw.toggle();\n\t};\n\n\tqt.TextDirectionButton = function() {\n\t\tqt.Button.call( this, 'textdirection', quicktagsL10n.textdirection, '', quicktagsL10n.toggleTextdirection );\n\t};\n\tqt.TextDirectionButton.prototype = new qt.Button();\n\tqt.TextDirectionButton.prototype.callback = function(e, c) {\n\t\tvar isRTL = ( 'rtl' === document.getElementsByTagName('html')[0].dir ),\n\t\t\tcurrentDirection = c.style.direction;\n\n\t\tif ( ! currentDirection ) {\n\t\t\tcurrentDirection = ( isRTL ) ? 'rtl' : 'ltr';\n\t\t}\n\n\t\tc.style.direction = ( 'rtl' === currentDirection ) ? 'ltr' : 'rtl';\n\t\tc.focus();\n\t};\n\n\t// ensure backward compatibility\n\tedButtons[10]  = new qt.TagButton( 'strong', 'b', '<strong>', '</strong>', '', '', '', { ariaLabel: quicktagsL10n.strong, ariaLabelClose: quicktagsL10n.strongClose } );\n\tedButtons[20]  = new qt.TagButton( 'em', 'i', '<em>', '</em>', '', '', '', { ariaLabel: quicktagsL10n.em, ariaLabelClose: quicktagsL10n.emClose } );\n\tedButtons[30]  = new qt.LinkButton(); // special case\n\tedButtons[40]  = new qt.TagButton( 'block', 'b-quote', '\\n\\n<blockquote>', '</blockquote>\\n\\n', '', '', '', { ariaLabel: quicktagsL10n.blockquote, ariaLabelClose: quicktagsL10n.blockquoteClose } );\n\tedButtons[50]  = new qt.TagButton( 'del', 'del', '<del datetime=\"' + _datetime + '\">', '</del>', '', '', '', { ariaLabel: quicktagsL10n.del, ariaLabelClose: quicktagsL10n.delClose } );\n\tedButtons[60]  = new qt.TagButton( 'ins', 'ins', '<ins datetime=\"' + _datetime + '\">', '</ins>', '', '', '', { ariaLabel: quicktagsL10n.ins, ariaLabelClose: quicktagsL10n.insClose } );\n\tedButtons[70]  = new qt.ImgButton(); // special case\n\tedButtons[80]  = new qt.TagButton( 'ul', 'ul', '<ul>\\n', '</ul>\\n\\n', '', '', '', { ariaLabel: quicktagsL10n.ul, ariaLabelClose: quicktagsL10n.ulClose } );\n\tedButtons[90]  = new qt.TagButton( 'ol', 'ol', '<ol>\\n', '</ol>\\n\\n', '', '', '', { ariaLabel: quicktagsL10n.ol, ariaLabelClose: quicktagsL10n.olClose } );\n\tedButtons[100] = new qt.TagButton( 'li', 'li', '\\t<li>', '</li>\\n', '', '', '', { ariaLabel: quicktagsL10n.li, ariaLabelClose: quicktagsL10n.liClose } );\n\tedButtons[110] = new qt.TagButton( 'code', 'code', '<code>', '</code>', '', '', '', { ariaLabel: quicktagsL10n.code, ariaLabelClose: quicktagsL10n.codeClose } );\n\tedButtons[120] = new qt.TagButton( 'more', 'more', '<!--more-->\\n\\n', '', '', '', '', { ariaLabel: quicktagsL10n.more } );\n\tedButtons[140] = new qt.CloseButton();\n\n})();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/shortcode.js",
    "content": "// Utility functions for parsing and handling shortcodes in JavaScript.\n\n// Ensure the global `wp` object exists.\nwindow.wp = window.wp || {};\n\n(function(){\n\twp.shortcode = {\n\t\t// ### Find the next matching shortcode\n\t\t//\n\t\t// Given a shortcode `tag`, a block of `text`, and an optional starting\n\t\t// `index`, returns the next matching shortcode or `undefined`.\n\t\t//\n\t\t// Shortcodes are formatted as an object that contains the match\n\t\t// `content`, the matching `index`, and the parsed `shortcode` object.\n\t\tnext: function( tag, text, index ) {\n\t\t\tvar re = wp.shortcode.regexp( tag ),\n\t\t\t\tmatch, result;\n\n\t\t\tre.lastIndex = index || 0;\n\t\t\tmatch = re.exec( text );\n\n\t\t\tif ( ! match ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If we matched an escaped shortcode, try again.\n\t\t\tif ( '[' === match[1] && ']' === match[7] ) {\n\t\t\t\treturn wp.shortcode.next( tag, text, re.lastIndex );\n\t\t\t}\n\n\t\t\tresult = {\n\t\t\t\tindex:     match.index,\n\t\t\t\tcontent:   match[0],\n\t\t\t\tshortcode: wp.shortcode.fromMatch( match )\n\t\t\t};\n\n\t\t\t// If we matched a leading `[`, strip it from the match\n\t\t\t// and increment the index accordingly.\n\t\t\tif ( match[1] ) {\n\t\t\t\tresult.content = result.content.slice( 1 );\n\t\t\t\tresult.index++;\n\t\t\t}\n\n\t\t\t// If we matched a trailing `]`, strip it from the match.\n\t\t\tif ( match[7] ) {\n\t\t\t\tresult.content = result.content.slice( 0, -1 );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// ### Replace matching shortcodes in a block of text\n\t\t//\n\t\t// Accepts a shortcode `tag`, content `text` to scan, and a `callback`\n\t\t// to process the shortcode matches and return a replacement string.\n\t\t// Returns the `text` with all shortcodes replaced.\n\t\t//\n\t\t// Shortcode matches are objects that contain the shortcode `tag`,\n\t\t// a shortcode `attrs` object, the `content` between shortcode tags,\n\t\t// and a boolean flag to indicate if the match was a `single` tag.\n\t\treplace: function( tag, text, callback ) {\n\t\t\treturn text.replace( wp.shortcode.regexp( tag ), function( match, left, tag, attrs, slash, content, closing, right ) {\n\t\t\t\t// If both extra brackets exist, the shortcode has been\n\t\t\t\t// properly escaped.\n\t\t\t\tif ( left === '[' && right === ']' ) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\n\t\t\t\t// Create the match object and pass it through the callback.\n\t\t\t\tvar result = callback( wp.shortcode.fromMatch( arguments ) );\n\n\t\t\t\t// Make sure to return any of the extra brackets if they\n\t\t\t\t// weren't used to escape the shortcode.\n\t\t\t\treturn result ? left + result + right : match;\n\t\t\t});\n\t\t},\n\n\t\t// ### Generate a string from shortcode parameters\n\t\t//\n\t\t// Creates a `wp.shortcode` instance and returns a string.\n\t\t//\n\t\t// Accepts the same `options` as the `wp.shortcode()` constructor,\n\t\t// containing a `tag` string, a string or object of `attrs`, a boolean\n\t\t// indicating whether to format the shortcode using a `single` tag, and a\n\t\t// `content` string.\n\t\tstring: function( options ) {\n\t\t\treturn new wp.shortcode( options ).string();\n\t\t},\n\n\t\t// ### Generate a RegExp to identify a shortcode\n\t\t//\n\t\t// The base regex is functionally equivalent to the one found in\n\t\t// `get_shortcode_regex()` in `wp-includes/shortcodes.php`.\n\t\t//\n\t\t// Capture groups:\n\t\t//\n\t\t// 1. An extra `[` to allow for escaping shortcodes with double `[[]]`\n\t\t// 2. The shortcode name\n\t\t// 3. The shortcode argument list\n\t\t// 4. The self closing `/`\n\t\t// 5. The content of a shortcode when it wraps some content.\n\t\t// 6. The closing tag.\n\t\t// 7. An extra `]` to allow for escaping shortcodes with double `[[]]`\n\t\tregexp: _.memoize( function( tag ) {\n\t\t\treturn new RegExp( '\\\\[(\\\\[?)(' + tag + ')(?![\\\\w-])([^\\\\]\\\\/]*(?:\\\\/(?!\\\\])[^\\\\]\\\\/]*)*?)(?:(\\\\/)\\\\]|\\\\](?:([^\\\\[]*(?:\\\\[(?!\\\\/\\\\2\\\\])[^\\\\[]*)*)(\\\\[\\\\/\\\\2\\\\]))?)(\\\\]?)', 'g' );\n\t\t}),\n\n\n\t\t// ### Parse shortcode attributes\n\t\t//\n\t\t// Shortcodes accept many types of attributes. These can chiefly be\n\t\t// divided into named and numeric attributes:\n\t\t//\n\t\t// Named attributes are assigned on a key/value basis, while numeric\n\t\t// attributes are treated as an array.\n\t\t//\n\t\t// Named attributes can be formatted as either `name=\"value\"`,\n\t\t// `name='value'`, or `name=value`. Numeric attributes can be formatted\n\t\t// as `\"value\"` or just `value`.\n\t\tattrs: _.memoize( function( text ) {\n\t\t\tvar named   = {},\n\t\t\t\tnumeric = [],\n\t\t\t\tpattern, match;\n\n\t\t\t// This regular expression is reused from `shortcode_parse_atts()`\n\t\t\t// in `wp-includes/shortcodes.php`.\n\t\t\t//\n\t\t\t// Capture groups:\n\t\t\t//\n\t\t\t// 1. An attribute name, that corresponds to...\n\t\t\t// 2. a value in double quotes.\n\t\t\t// 3. An attribute name, that corresponds to...\n\t\t\t// 4. a value in single quotes.\n\t\t\t// 5. An attribute name, that corresponds to...\n\t\t\t// 6. an unquoted value.\n\t\t\t// 7. A numeric attribute in double quotes.\n\t\t\t// 8. An unquoted numeric attribute.\n\t\t\tpattern = /([\\w-]+)\\s*=\\s*\"([^\"]*)\"(?:\\s|$)|([\\w-]+)\\s*=\\s*'([^']*)'(?:\\s|$)|([\\w-]+)\\s*=\\s*([^\\s'\"]+)(?:\\s|$)|\"([^\"]*)\"(?:\\s|$)|(\\S+)(?:\\s|$)/g;\n\n\t\t\t// Map zero-width spaces to actual spaces.\n\t\t\ttext = text.replace( /[\\u00a0\\u200b]/g, ' ' );\n\n\t\t\t// Match and normalize attributes.\n\t\t\twhile ( (match = pattern.exec( text )) ) {\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tnamed[ match[1].toLowerCase() ] = match[2];\n\t\t\t\t} else if ( match[3] ) {\n\t\t\t\t\tnamed[ match[3].toLowerCase() ] = match[4];\n\t\t\t\t} else if ( match[5] ) {\n\t\t\t\t\tnamed[ match[5].toLowerCase() ] = match[6];\n\t\t\t\t} else if ( match[7] ) {\n\t\t\t\t\tnumeric.push( match[7] );\n\t\t\t\t} else if ( match[8] ) {\n\t\t\t\t\tnumeric.push( match[8] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tnamed:   named,\n\t\t\t\tnumeric: numeric\n\t\t\t};\n\t\t}),\n\n\t\t// ### Generate a Shortcode Object from a RegExp match\n\t\t// Accepts a `match` object from calling `regexp.exec()` on a `RegExp`\n\t\t// generated by `wp.shortcode.regexp()`. `match` can also be set to the\n\t\t// `arguments` from a callback passed to `regexp.replace()`.\n\t\tfromMatch: function( match ) {\n\t\t\tvar type;\n\n\t\t\tif ( match[4] ) {\n\t\t\t\ttype = 'self-closing';\n\t\t\t} else if ( match[6] ) {\n\t\t\t\ttype = 'closed';\n\t\t\t} else {\n\t\t\t\ttype = 'single';\n\t\t\t}\n\n\t\t\treturn new wp.shortcode({\n\t\t\t\ttag:     match[2],\n\t\t\t\tattrs:   match[3],\n\t\t\t\ttype:    type,\n\t\t\t\tcontent: match[5]\n\t\t\t});\n\t\t}\n\t};\n\n\n\t// Shortcode Objects\n\t// -----------------\n\t//\n\t// Shortcode objects are generated automatically when using the main\n\t// `wp.shortcode` methods: `next()`, `replace()`, and `string()`.\n\t//\n\t// To access a raw representation of a shortcode, pass an `options` object,\n\t// containing a `tag` string, a string or object of `attrs`, a string\n\t// indicating the `type` of the shortcode ('single', 'self-closing', or\n\t// 'closed'), and a `content` string.\n\twp.shortcode = _.extend( function( options ) {\n\t\t_.extend( this, _.pick( options || {}, 'tag', 'attrs', 'type', 'content' ) );\n\n\t\tvar attrs = this.attrs;\n\n\t\t// Ensure we have a correctly formatted `attrs` object.\n\t\tthis.attrs = {\n\t\t\tnamed:   {},\n\t\t\tnumeric: []\n\t\t};\n\n\t\tif ( ! attrs ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse a string of attributes.\n\t\tif ( _.isString( attrs ) ) {\n\t\t\tthis.attrs = wp.shortcode.attrs( attrs );\n\n\t\t// Identify a correctly formatted `attrs` object.\n\t\t} else if ( _.isEqual( _.keys( attrs ), [ 'named', 'numeric' ] ) ) {\n\t\t\tthis.attrs = attrs;\n\n\t\t// Handle a flat object of attributes.\n\t\t} else {\n\t\t\t_.each( options.attrs, function( value, key ) {\n\t\t\t\tthis.set( key, value );\n\t\t\t}, this );\n\t\t}\n\t}, wp.shortcode );\n\n\t_.extend( wp.shortcode.prototype, {\n\t\t// ### Get a shortcode attribute\n\t\t//\n\t\t// Automatically detects whether `attr` is named or numeric and routes\n\t\t// it accordingly.\n\t\tget: function( attr ) {\n\t\t\treturn this.attrs[ _.isNumber( attr ) ? 'numeric' : 'named' ][ attr ];\n\t\t},\n\n\t\t// ### Set a shortcode attribute\n\t\t//\n\t\t// Automatically detects whether `attr` is named or numeric and routes\n\t\t// it accordingly.\n\t\tset: function( attr, value ) {\n\t\t\tthis.attrs[ _.isNumber( attr ) ? 'numeric' : 'named' ][ attr ] = value;\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### Transform the shortcode match into a string\n\t\tstring: function() {\n\t\t\tvar text    = '[' + this.tag;\n\n\t\t\t_.each( this.attrs.numeric, function( value ) {\n\t\t\t\tif ( /\\s/.test( value ) ) {\n\t\t\t\t\ttext += ' \"' + value + '\"';\n\t\t\t\t} else {\n\t\t\t\t\ttext += ' ' + value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_.each( this.attrs.named, function( value, name ) {\n\t\t\t\ttext += ' ' + name + '=\"' + value + '\"';\n\t\t\t});\n\n\t\t\t// If the tag is marked as `single` or `self-closing`, close the\n\t\t\t// tag and ignore any additional content.\n\t\t\tif ( 'single' === this.type ) {\n\t\t\t\treturn text + ']';\n\t\t\t} else if ( 'self-closing' === this.type ) {\n\t\t\t\treturn text + ' /]';\n\t\t\t}\n\n\t\t\t// Complete the opening tag.\n\t\t\ttext += ']';\n\n\t\t\tif ( this.content ) {\n\t\t\t\ttext += this.content;\n\t\t\t}\n\n\t\t\t// Add the closing tag.\n\t\t\treturn text + '[/' + this.tag + ']';\n\t\t}\n\t});\n}());\n\n// HTML utility functions\n// ----------------------\n//\n// Experimental. These functions may change or be removed in the future.\n(function(){\n\twp.html = _.extend( wp.html || {}, {\n\t\t// ### Parse HTML attributes.\n\t\t//\n\t\t// Converts `content` to a set of parsed HTML attributes.\n\t\t// Utilizes `wp.shortcode.attrs( content )`, which is a valid superset of\n\t\t// the HTML attribute specification. Reformats the attributes into an\n\t\t// object that contains the `attrs` with `key:value` mapping, and a record\n\t\t// of the attributes that were entered using `empty` attribute syntax (i.e.\n\t\t// with no value).\n\t\tattrs: function( content ) {\n\t\t\tvar result, attrs;\n\n\t\t\t// If `content` ends in a slash, strip it.\n\t\t\tif ( '/' === content[ content.length - 1 ] ) {\n\t\t\t\tcontent = content.slice( 0, -1 );\n\t\t\t}\n\n\t\t\tresult = wp.shortcode.attrs( content );\n\t\t\tattrs  = result.named;\n\n\t\t\t_.each( result.numeric, function( key ) {\n\t\t\t\tif ( /\\s/.test( key ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tattrs[ key ] = '';\n\t\t\t});\n\n\t\t\treturn attrs;\n\t\t},\n\n\t\t// ### Convert an HTML-representation of an object to a string.\n\t\tstring: function( options ) {\n\t\t\tvar text = '<' + options.tag,\n\t\t\t\tcontent = options.content || '';\n\n\t\t\t_.each( options.attrs, function( value, attr ) {\n\t\t\t\ttext += ' ' + attr;\n\n\t\t\t\t// Use empty attribute notation where possible.\n\t\t\t\tif ( '' === value ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Convert boolean values to strings.\n\t\t\t\tif ( _.isBoolean( value ) ) {\n\t\t\t\t\tvalue = value ? 'true' : 'false';\n\t\t\t\t}\n\n\t\t\t\ttext += '=\"' + value + '\"';\n\t\t\t});\n\n\t\t\t// Return the result if it is a self-closing tag.\n\t\t\tif ( options.single ) {\n\t\t\t\treturn text + ' />';\n\t\t\t}\n\n\t\t\t// Complete the opening tag.\n\t\t\ttext += '>';\n\n\t\t\t// If `content` is an object, recursively call this function.\n\t\t\ttext += _.isObject( content ) ? wp.html.string( content ) : content;\n\n\t\t\treturn text + '</' + options.tag + '>';\n\t\t}\n\t});\n}());\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/swfobject.js",
    "content": "/*\tSWFObject v2.2 <http://code.google.com/p/swfobject/> \n\tis released under the MIT License <http://www.opensource.org/licenses/mit-license.php> \n*/\nvar swfobject=function(){var D=\"undefined\",r=\"object\",S=\"Shockwave Flash\",W=\"ShockwaveFlash.ShockwaveFlash\",q=\"application/x-shockwave-flash\",R=\"SWFObjectExprInst\",x=\"onreadystatechange\",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/,\"$1\")):false,X=!+\"\\v1\",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\\s+(\\S+\\s+\\S+$)/,\"$1\");ag[0]=parseInt(ab.replace(/^(.*)\\..*$/,\"$1\"),10);ag[1]=parseInt(ab.replace(/^.*\\.(.*)\\s.*$/,\"$1\"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,\"$1\"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable(\"$version\");if(ab){X=true;ab=ab.split(\" \")[1].split(\",\");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState==\"complete\")||(typeof j.readyState==D&&(j.getElementsByTagName(\"body\")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener(\"DOMContentLoaded\",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState==\"complete\"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll(\"left\")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName(\"body\")[0].appendChild(C(\"span\"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener(\"load\",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener(\"load\",Y,false)}else{if(typeof O.attachEvent!=D){i(O,\"onload\",Y)}else{if(typeof O.onload==\"function\"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName(\"body\")[0];var aa=C(r);aa.setAttribute(\"type\",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable(\"$version\");if(ab){ab=ab.split(\" \")[1].split(\",\");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute(\"width\")||\"0\";ai.height=ae.getAttribute(\"height\")||\"0\";if(ae.getAttribute(\"class\")){ai.styleclass=ae.getAttribute(\"class\")}if(ae.getAttribute(\"align\")){ai.align=ae.getAttribute(\"align\")}var ah={};var X=ae.getElementsByTagName(\"param\");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute(\"name\").toLowerCase()!=\"movie\"){ah[X[ad].getAttribute(\"name\")]=X[ad].getAttribute(\"value\")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName==\"OBJECT\"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F(\"6.0.65\")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName==\"OBJECT\"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width=\"310\"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height=\"137\"}j.title=j.title.slice(0,47)+\" - Flash Player Installation\";var ad=M.ie&&M.win?\"ActiveX\":\"PlugIn\",ac=\"MMredirectURL=\"+encodeURI(O.location).toString().replace(/&/g,\"%26\")+\"&MMplayerType=\"+ad+\"&MMdoctitle=\"+j.title;if(typeof ab.flashvars!=D){ab.flashvars+=\"&\"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C(\"div\");X+=\"SWFObjectNew\";Y.setAttribute(\"id\",X);ae.parentNode.insertBefore(Y,ae);ae.style.display=\"none\";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C(\"div\");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display=\"none\";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C(\"div\");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName==\"PARAM\")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah=\"\";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()==\"data\"){ag.movie=ai[ae]}else{if(ae.toLowerCase()==\"styleclass\"){ah+=' class=\"'+ai[ae]+'\"'}else{if(ae.toLowerCase()!=\"classid\"){ah+=\" \"+ae+'=\"'+ai[ae]+'\"'}}}}}var af=\"\";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name=\"'+ad+'\" value=\"'+ag[ad]+'\" />'}}aa.outerHTML='<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"'+ah+\">\"+af+\"</object>\";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute(\"type\",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()==\"styleclass\"){Z.setAttribute(\"class\",ai[ac])}else{if(ac.toLowerCase()!=\"classid\"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!=\"movie\"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C(\"param\");aa.setAttribute(\"name\",X);aa.setAttribute(\"value\",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName==\"OBJECT\"){if(M.ie&&M.win){X.style.display=\"none\";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]==\"function\"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(\".\");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName(\"head\")[0];if(!aa){return}var X=(ad&&typeof ad==\"string\")?ad:\"screen\";if(ab){n=null;G=null}if(!n||G!=X){var Z=C(\"style\");Z.setAttribute(\"type\",\"text/css\");Z.setAttribute(\"media\",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+\" {\"+Y+\"}\"))}}}function w(Z,X){if(!m){return}var Y=X?\"visible\":\"hidden\";if(J&&c(Z)){c(Z).style.visibility=Y}else{v(\"#\"+Z,\"visibility:\"+Y)}}function L(Y){var Z=/[\\\\\\\"<>\\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent(\"onunload\",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+=\"\";ag+=\"\";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+=\"&\"+ai+\"=\"+Z[ai]}else{am.flashvars=ai+\"=\"+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\\?/.test(Z)){Z=Z.split(\"?\")[1]}if(aa==null){return L(Z)}var Y=Z.split(\"&\");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf(\"=\"))==aa){return L(Y[X].substring((Y[X].indexOf(\"=\")+1)))}}}return\"\"},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display=\"block\"}}if(E){E(B)}}a=false}}}}();"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/swfupload/handlers.js",
    "content": "var topWin = window.dialogArguments || opener || parent || top;\n\nfunction fileDialogStart() {\n\tjQuery(\"#media-upload-error\").empty();\n}\n\n// progress and success handlers for media multi uploads\nfunction fileQueued(fileObj) {\n\t// Get rid of unused form\n\tjQuery('.media-blank').remove();\n\t// Collapse a single item\n\tif ( jQuery('form.type-form #media-items').children().length == 1 && jQuery('.hidden', '#media-items').length > 0 ) {\n\t\tjQuery('.describe-toggle-on').show();\n\t\tjQuery('.describe-toggle-off').hide();\n\t\tjQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden');\n\t}\n\t// Create a progress bar containing the filename\n\tjQuery('<div class=\"media-item\">')\n\t\t.attr( 'id', 'media-item-' + fileObj.id )\n\t\t.addClass('child-of-' + post_id)\n\t\t.append('<div class=\"progress\"><div class=\"bar\"></div></div>',\n\t\t\tjQuery('<div class=\"filename original\"><span class=\"percent\"></span>').text( ' ' + fileObj.name ))\n\t\t.appendTo( jQuery('#media-items' ) );\n\t// Display the progress div\n\tjQuery('.progress', '#media-item-' + fileObj.id).show();\n\n\t// Disable submit and enable cancel\n\tjQuery('#insert-gallery').prop('disabled', true);\n\tjQuery('#cancel-upload').prop('disabled', false);\n}\n\nfunction uploadStart(fileObj) {\n\ttry {\n\t\tif ( typeof topWin.tb_remove != 'undefined' )\n\t\t\ttopWin.jQuery('#TB_overlay').unbind('click', topWin.tb_remove);\n\t} catch(e){}\n\n\treturn true;\n}\n\nfunction uploadProgress(fileObj, bytesDone, bytesTotal) {\n\t// Lengthen the progress bar\n\tvar w = jQuery('#media-items').width() - 2, item = jQuery('#media-item-' + fileObj.id);\n\tjQuery('.bar', item).width( w * bytesDone / bytesTotal );\n\tjQuery('.percent', item).html( Math.ceil(bytesDone / bytesTotal * 100) + '%' );\n\n\tif ( bytesDone == bytesTotal )\n\t\tjQuery('.bar', item).html('<strong class=\"crunching\">' + swfuploadL10n.crunching + '</strong>');\n}\n\nfunction prepareMediaItem(fileObj, serverData) {\n\tvar f = ( typeof shortform == 'undefined' ) ? 1 : 2, item = jQuery('#media-item-' + fileObj.id);\n\t// Move the progress bar to 100%\n\tjQuery('.bar', item).remove();\n\tjQuery('.progress', item).hide();\n\n\ttry {\n\t\tif ( typeof topWin.tb_remove != 'undefined' )\n\t\t\ttopWin.jQuery('#TB_overlay').click(topWin.tb_remove);\n\t} catch(e){}\n\n\t// Old style: Append the HTML returned by the server -- thumbnail and form inputs\n\tif ( isNaN(serverData) || !serverData ) {\n\t\titem.append(serverData);\n\t\tprepareMediaItemInit(fileObj);\n\t}\n\t// New style: server data is just the attachment ID, fetch the thumbnail and form html from the server\n\telse {\n\t\titem.load('async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit(fileObj);updateMediaForm()});\n\t}\n}\n\nfunction prepareMediaItemInit(fileObj) {\n\tvar item = jQuery('#media-item-' + fileObj.id);\n\t// Clone the thumbnail as a \"pinkynail\" -- a tiny image to the left of the filename\n\tjQuery('.thumbnail', item).clone().attr('class', 'pinkynail toggle').prependTo(item);\n\n\t// Replace the original filename with the new (unique) one assigned during upload\n\tjQuery('.filename.original', item).replaceWith( jQuery('.filename.new', item) );\n\n\t// Also bind toggle to the links\n\tjQuery('a.toggle', item).click(function(){\n\t\tjQuery(this).siblings('.slidetoggle').slideToggle(350, function(){\n\t\t\tvar w = jQuery(window).height(), t = jQuery(this).offset().top, h = jQuery(this).height(), b;\n\n\t\t\tif ( w && t && h ) {\n                b = t + h;\n\n                if ( b > w && (h + 48) < w )\n                    window.scrollBy(0, b - w + 13);\n                else if ( b > w )\n                    window.scrollTo(0, t - 36);\n            }\n\t\t});\n\t\tjQuery(this).siblings('.toggle').andSelf().toggle();\n\t\tjQuery(this).siblings('a.toggle').focus();\n\t\treturn false;\n\t});\n\n\t// Bind AJAX to the new Delete button\n\tjQuery('a.delete', item).click(function(){\n\t\t// Tell the server to delete it. TODO: handle exceptions\n\t\tjQuery.ajax({\n\t\t\turl: ajaxurl,\n\t\t\ttype: 'post',\n\t\t\tsuccess: deleteSuccess,\n\t\t\terror: deleteError,\n\t\t\tid: fileObj.id,\n\t\t\tdata: {\n\t\t\t\tid : this.id.replace(/[^0-9]/g, ''),\n\t\t\t\taction : 'trash-post',\n\t\t\t\t_ajax_nonce : this.href.replace(/^.*wpnonce=/,'')\n\t\t\t}\n\t\t});\n\t\treturn false;\n\t});\n\n\t// Bind AJAX to the new Undo button\n\tjQuery('a.undo', item).click(function(){\n\t\t// Tell the server to untrash it. TODO: handle exceptions\n\t\tjQuery.ajax({\n\t\t\turl: ajaxurl,\n\t\t\ttype: 'post',\n\t\t\tid: fileObj.id,\n\t\t\tdata: {\n\t\t\t\tid : this.id.replace(/[^0-9]/g,''),\n\t\t\t\taction: 'untrash-post',\n\t\t\t\t_ajax_nonce: this.href.replace(/^.*wpnonce=/,'')\n\t\t\t},\n\t\t\tsuccess: function(data, textStatus){\n\t\t\t\tvar item = jQuery('#media-item-' + fileObj.id);\n\n\t\t\t\tif ( type = jQuery('#type-of-' + fileObj.id).val() )\n\t\t\t\t\tjQuery('#' + type + '-counter').text(jQuery('#' + type + '-counter').text()-0+1);\n\t\t\t\tif ( item.hasClass('child-of-'+post_id) )\n\t\t\t\t\tjQuery('#attachments-count').text(jQuery('#attachments-count').text()-0+1);\n\n\t\t\t\tjQuery('.filename .trashnotice', item).remove();\n\t\t\t\tjQuery('.filename .title', item).css('font-weight','normal');\n\t\t\t\tjQuery('a.undo', item).addClass('hidden');\n\t\t\t\tjQuery('a.describe-toggle-on, .menu_order_input', item).show();\n\t\t\t\titem.css( {backgroundColor:'#ceb'} ).animate( {backgroundColor: '#fff'}, { queue: false, duration: 500, complete: function(){ jQuery(this).css({backgroundColor:''}); } }).removeClass('undo');\n\t\t\t}\n\t\t});\n\t\treturn false;\n\t});\n\n\t// Open this item if it says to start open (e.g. to display an error)\n\tjQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').slideToggle(500).siblings('.toggle').toggle();\n}\n\nfunction itemAjaxError(id, html) {\n\tvar item = jQuery('#media-item-' + id);\n\tvar filename = jQuery('.filename', item).text();\n\n\titem.html('<div class=\"error-div\">'\n\t\t\t\t+ '<a class=\"dismiss\" href=\"#\">' + swfuploadL10n.dismiss + '</a>'\n\t\t\t\t+ '<strong>' + swfuploadL10n.error_uploading.replace('%s', filename) + '</strong><br />'\n\t\t\t\t+ html\n\t\t\t\t+ '</div>');\n\titem.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})});\n}\n\nfunction deleteSuccess(data, textStatus) {\n\tif ( data == '-1' )\n\t\treturn itemAjaxError(this.id, 'You do not have permission. Has your session expired?');\n\tif ( data == '0' )\n\t\treturn itemAjaxError(this.id, 'Could not be deleted. Has it been deleted already?');\n\n\tvar id = this.id, item = jQuery('#media-item-' + id);\n\n\t// Decrement the counters.\n\tif ( type = jQuery('#type-of-' + id).val() )\n\t\tjQuery('#' + type + '-counter').text( jQuery('#' + type + '-counter').text() - 1 );\n\tif ( item.hasClass('child-of-'+post_id) )\n\t\tjQuery('#attachments-count').text( jQuery('#attachments-count').text() - 1 );\n\n\tif ( jQuery('form.type-form #media-items').children().length == 1 && jQuery('.hidden', '#media-items').length > 0 ) {\n\t\tjQuery('.toggle').toggle();\n\t\tjQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden');\n\t}\n\n\t// Vanish it.\n\tjQuery('.toggle', item).toggle();\n\tjQuery('.slidetoggle', item).slideUp(200).siblings().removeClass('hidden');\n\titem.css( {backgroundColor:'#faa'} ).animate( {backgroundColor:'#f4f4f4'}, {queue:false, duration:500} ).addClass('undo');\n\n\tjQuery('.filename:empty', item).remove();\n\tjQuery('.filename .title', item).css('font-weight','bold');\n\tjQuery('.filename', item).append('<span class=\"trashnotice\"> ' + swfuploadL10n.deleted + ' </span>').siblings('a.toggle').hide();\n\tjQuery('.filename', item).append( jQuery('a.undo', item).removeClass('hidden') );\n\tjQuery('.menu_order_input', item).hide();\n\n\treturn;\n}\n\nfunction deleteError(X, textStatus, errorThrown) {\n\t// TODO\n}\n\nfunction updateMediaForm() {\n\tvar one = jQuery('form.type-form #media-items').children(), items = jQuery('#media-items').children();\n\n\t// Just one file, no need for collapsible part\n\tif ( one.length == 1 ) {\n\t\tjQuery('.slidetoggle', one).slideDown(500).siblings().addClass('hidden').filter('.toggle').toggle();\n\t}\n\n\t// Only show Save buttons when there is at least one file.\n\tif ( items.not('.media-blank').length > 0 )\n\t\tjQuery('.savebutton').show();\n\telse\n\t\tjQuery('.savebutton').hide();\n\n\t// Only show Gallery buttons when there are at least two files.\n\tif ( items.length > 1 ) {\n\t\tjQuery('.insert-gallery').show();\n\t} else {\n\t\tjQuery('.insert-gallery').hide();\n\t}\n}\n\nfunction uploadSuccess(fileObj, serverData) {\n\t// if async-upload returned an error message, place it in the media item div and return\n\tif ( serverData.match('media-upload-error') ) {\n\t\tjQuery('#media-item-' + fileObj.id).html(serverData);\n\t\treturn;\n\t}\n\n\tprepareMediaItem(fileObj, serverData);\n\tupdateMediaForm();\n\n\t// Increment the counter.\n\tif ( jQuery('#media-item-' + fileObj.id).hasClass('child-of-' + post_id) )\n\t\tjQuery('#attachments-count').text(1 * jQuery('#attachments-count').text() + 1);\n}\n\nfunction uploadComplete(fileObj) {\n\t// If no more uploads queued, enable the submit button\n\tif ( swfu.getStats().files_queued == 0 ) {\n\t\tjQuery('#cancel-upload').prop('disabled', true);\n\t\tjQuery('#insert-gallery').prop('disabled', false);\n\t}\n}\n\n\n// wp-specific error handlers\n\n// generic message\nfunction wpQueueError(message) {\n\tjQuery('#media-upload-error').show().text(message);\n}\n\n// file-specific message\nfunction wpFileError(fileObj, message) {\n\tvar item = jQuery('#media-item-' + fileObj.id);\n\tvar filename = jQuery('.filename', item).text();\n\n\titem.html('<div class=\"error-div\">'\n\t\t\t\t+ '<a class=\"dismiss\" href=\"#\">' + swfuploadL10n.dismiss + '</a>'\n\t\t\t\t+ '<strong>' + swfuploadL10n.error_uploading.replace('%s', filename) + '</strong><br />'\n\t\t\t\t+ message\n\t\t\t\t+ '</div>');\n\titem.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})});\n}\n\nfunction fileQueueError(fileObj, error_code, message)  {\n\t// Handle this error separately because we don't want to create a FileProgress element for it.\n\tif ( error_code == SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED ) {\n\t\twpQueueError(swfuploadL10n.queue_limit_exceeded);\n\t}\n\telse if ( error_code == SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT ) {\n\t\tfileQueued(fileObj);\n\t\twpFileError(fileObj, swfuploadL10n.file_exceeds_size_limit);\n\t}\n\telse if ( error_code == SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE ) {\n\t\tfileQueued(fileObj);\n\t\twpFileError(fileObj, swfuploadL10n.zero_byte_file);\n\t}\n\telse if ( error_code == SWFUpload.QUEUE_ERROR.INVALID_FILETYPE ) {\n\t\tfileQueued(fileObj);\n\t\twpFileError(fileObj, swfuploadL10n.invalid_filetype);\n\t}\n\telse {\n\t\twpQueueError(swfuploadL10n.default_error);\n\t}\n}\n\nfunction fileDialogComplete(num_files_queued) {\n\ttry {\n\t\tif (num_files_queued > 0) {\n\t\t\tthis.startUpload();\n\t\t}\n\t} catch (ex) {\n\t\tthis.debug(ex);\n\t}\n}\n\nfunction switchUploader(s) {\n\tvar f = document.getElementById(swfu.customSettings.swfupload_element_id), h = document.getElementById(swfu.customSettings.degraded_element_id);\n\tif ( s ) {\n\t\tf.style.display = 'block';\n\t\th.style.display = 'none';\n\t} else {\n\t\tf.style.display = 'none';\n\t\th.style.display = 'block';\n\t}\n}\n\nfunction swfuploadPreLoad() {\n\tif ( !uploaderMode ) {\n\t\tswitchUploader(1);\n\t} else {\n\t\tswitchUploader(0);\n\t}\n}\n\nfunction swfuploadLoadFailed() {\n\tswitchUploader(0);\n\tjQuery('.upload-html-bypass').hide();\n}\n\nfunction uploadError(fileObj, errorCode, message) {\n\n\tswitch (errorCode) {\n\t\tcase SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:\n\t\t\twpFileError(fileObj, swfuploadL10n.missing_upload_url);\n\t\t\tbreak;\n\t\tcase SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:\n\t\t\twpFileError(fileObj, swfuploadL10n.upload_limit_exceeded);\n\t\t\tbreak;\n\t\tcase SWFUpload.UPLOAD_ERROR.HTTP_ERROR:\n\t\t\twpQueueError(swfuploadL10n.http_error);\n\t\t\tbreak;\n\t\tcase SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:\n\t\t\twpQueueError(swfuploadL10n.upload_failed);\n\t\t\tbreak;\n\t\tcase SWFUpload.UPLOAD_ERROR.IO_ERROR:\n\t\t\twpQueueError(swfuploadL10n.io_error);\n\t\t\tbreak;\n\t\tcase SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:\n\t\t\twpQueueError(swfuploadL10n.security_error);\n\t\t\tbreak;\n\t\tcase SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:\n\t\tcase SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:\n\t\t\tjQuery('#media-item-' + fileObj.id).remove();\n\t\t\tbreak;\n\t\tdefault:\n\t\t\twpFileError(fileObj, swfuploadL10n.default_error);\n\t}\n}\n\nfunction cancelUpload() {\n\tswfu.cancelQueue();\n}\n\n// remember the last used image size, alignment and url\njQuery(document).ready(function($){\n\t$('input[type=\"radio\"]', '#media-items').live('click', function(){\n\t\tvar tr = $(this).closest('tr');\n\n\t\tif ( $(tr).hasClass('align') )\n\t\t\tsetUserSetting('align', $(this).val());\n\t\telse if ( $(tr).hasClass('image-size') )\n\t\t\tsetUserSetting('imgsize', $(this).val());\n\t});\n\n\t$('button.button', '#media-items').live('click', function(){\n\t\tvar c = this.className || '';\n\t\tc = c.match(/url([^ '\"]+)/);\n\t\tif ( c && c[1] ) {\n\t\t\tsetUserSetting('urlbutton', c[1]);\n\t\t\t$(this).siblings('.urlfield').val( $(this).attr('title') );\n\t\t}\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/swfupload/license.txt",
    "content": "/**\n * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com\n *\n * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/\n *\n * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:\n * http://www.opensource.org/licenses/mit-license.php\n *\n * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:\n * http://www.opensource.org/licenses/mit-license.php\n *\n */\n\nThe MIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/swfupload/plugins/swfupload.cookies.js",
    "content": "/*\n\tCookie Plug-in\n\t\n\tThis plug in automatically gets all the cookies for this site and adds them to the post_params.\n\tCookies are loaded only on initialization.  The refreshCookies function can be called to update the post_params.\n\tThe cookies will override any other post params with the same name.\n*/\n\nvar SWFUpload;\nif (typeof(SWFUpload) === \"function\") {\n\tSWFUpload.prototype.initSettings = function (oldInitSettings) {\n\t\treturn function () {\n\t\t\tif (typeof(oldInitSettings) === \"function\") {\n\t\t\t\toldInitSettings.call(this);\n\t\t\t}\n\t\t\t\n\t\t\tthis.refreshCookies(false);\t// The false parameter must be sent since SWFUpload has not initialzed at this point\n\t\t};\n\t}(SWFUpload.prototype.initSettings);\n\t\n\t// refreshes the post_params and updates SWFUpload.  The sendToFlash parameters is optional and defaults to True\n\tSWFUpload.prototype.refreshCookies = function (sendToFlash) {\n\t\tif (sendToFlash === undefined) {\n\t\t\tsendToFlash = true;\n\t\t}\n\t\tsendToFlash = !!sendToFlash;\n\t\t\n\t\t// Get the post_params object\n\t\tvar postParams = this.settings.post_params;\n\t\t\n\t\t// Get the cookies\n\t\tvar i, cookieArray = document.cookie.split(';'), caLength = cookieArray.length, c, eqIndex, name, value;\n\t\tfor (i = 0; i < caLength; i++) {\n\t\t\tc = cookieArray[i];\n\t\t\t\n\t\t\t// Left Trim spaces\n\t\t\twhile (c.charAt(0) === \" \") {\n\t\t\t\tc = c.substring(1, c.length);\n\t\t\t}\n\t\t\teqIndex = c.indexOf(\"=\");\n\t\t\tif (eqIndex > 0) {\n\t\t\t\tname = c.substring(0, eqIndex);\n\t\t\t\tvalue = c.substring(eqIndex + 1);\n\t\t\t\tpostParams[name] = value;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (sendToFlash) {\n\t\t\tthis.setPostParams(postParams);\n\t\t}\n\t};\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/swfupload/plugins/swfupload.queue.js",
    "content": "/*\n\tQueue Plug-in\n\t\n\tFeatures:\n\t\t*Adds a cancelQueue() method for cancelling the entire queue.\n\t\t*All queued files are uploaded when startUpload() is called.\n\t\t*If false is returned from uploadComplete then the queue upload is stopped.\n\t\t If false is not returned (strict comparison) then the queue upload is continued.\n\t\t*Adds a QueueComplete event that is fired when all the queued files have finished uploading.\n\t\t Set the event handler with the queue_complete_handler setting.\n\t\t\n\t*/\n\nvar SWFUpload;\nif (typeof(SWFUpload) === \"function\") {\n\tSWFUpload.queue = {};\n\t\n\tSWFUpload.prototype.initSettings = (function (oldInitSettings) {\n\t\treturn function () {\n\t\t\tif (typeof(oldInitSettings) === \"function\") {\n\t\t\t\toldInitSettings.call(this);\n\t\t\t}\n\t\t\t\n\t\t\tthis.queueSettings = {};\n\t\t\t\n\t\t\tthis.queueSettings.queue_cancelled_flag = false;\n\t\t\tthis.queueSettings.queue_upload_count = 0;\n\t\t\t\n\t\t\tthis.queueSettings.user_upload_complete_handler = this.settings.upload_complete_handler;\n\t\t\tthis.queueSettings.user_upload_start_handler = this.settings.upload_start_handler;\n\t\t\tthis.settings.upload_complete_handler = SWFUpload.queue.uploadCompleteHandler;\n\t\t\tthis.settings.upload_start_handler = SWFUpload.queue.uploadStartHandler;\n\t\t\t\n\t\t\tthis.settings.queue_complete_handler = this.settings.queue_complete_handler || null;\n\t\t};\n\t})(SWFUpload.prototype.initSettings);\n\n\tSWFUpload.prototype.startUpload = function (fileID) {\n\t\tthis.queueSettings.queue_cancelled_flag = false;\n\t\tthis.callFlash(\"StartUpload\", [fileID]);\n\t};\n\n\tSWFUpload.prototype.cancelQueue = function () {\n\t\tthis.queueSettings.queue_cancelled_flag = true;\n\t\tthis.stopUpload();\n\t\t\n\t\tvar stats = this.getStats();\n\t\twhile (stats.files_queued > 0) {\n\t\t\tthis.cancelUpload();\n\t\t\tstats = this.getStats();\n\t\t}\n\t};\n\t\n\tSWFUpload.queue.uploadStartHandler = function (file) {\n\t\tvar returnValue;\n\t\tif (typeof(this.queueSettings.user_upload_start_handler) === \"function\") {\n\t\t\treturnValue = this.queueSettings.user_upload_start_handler.call(this, file);\n\t\t}\n\t\t\n\t\t// To prevent upload a real \"FALSE\" value must be returned, otherwise default to a real \"TRUE\" value.\n\t\treturnValue = (returnValue === false) ? false : true;\n\t\t\n\t\tthis.queueSettings.queue_cancelled_flag = !returnValue;\n\n\t\treturn returnValue;\n\t};\n\t\n\tSWFUpload.queue.uploadCompleteHandler = function (file) {\n\t\tvar user_upload_complete_handler = this.queueSettings.user_upload_complete_handler;\n\t\tvar continueUpload;\n\t\t\n\t\tif (file.filestatus === SWFUpload.FILE_STATUS.COMPLETE) {\n\t\t\tthis.queueSettings.queue_upload_count++;\n\t\t}\n\n\t\tif (typeof(user_upload_complete_handler) === \"function\") {\n\t\t\tcontinueUpload = (user_upload_complete_handler.call(this, file) === false) ? false : true;\n\t\t} else if (file.filestatus === SWFUpload.FILE_STATUS.QUEUED) {\n\t\t\t// If the file was stopped and re-queued don't restart the upload\n\t\t\tcontinueUpload = false;\n\t\t} else {\n\t\t\tcontinueUpload = true;\n\t\t}\n\t\t\n\t\tif (continueUpload) {\n\t\t\tvar stats = this.getStats();\n\t\t\tif (stats.files_queued > 0 && this.queueSettings.queue_cancelled_flag === false) {\n\t\t\t\tthis.startUpload();\n\t\t\t} else if (this.queueSettings.queue_cancelled_flag === false) {\n\t\t\t\tthis.queueEvent(\"queue_complete_handler\", [this.queueSettings.queue_upload_count]);\n\t\t\t\tthis.queueSettings.queue_upload_count = 0;\n\t\t\t} else {\n\t\t\t\tthis.queueSettings.queue_cancelled_flag = false;\n\t\t\t\tthis.queueSettings.queue_upload_count = 0;\n\t\t\t}\n\t\t}\n\t};\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/swfupload/plugins/swfupload.speed.js",
    "content": "/*\n\tSpeed Plug-in\n\t\n\tFeatures:\n\t\t*Adds several properties to the 'file' object indicated upload speed, time left, upload time, etc.\n\t\t\t- currentSpeed -- String indicating the upload speed, bytes per second\n\t\t\t- averageSpeed -- Overall average upload speed, bytes per second\n\t\t\t- movingAverageSpeed -- Speed over averaged over the last several measurements, bytes per second\n\t\t\t- timeRemaining -- Estimated remaining upload time in seconds\n\t\t\t- timeElapsed -- Number of seconds passed for this upload\n\t\t\t- percentUploaded -- Percentage of the file uploaded (0 to 100)\n\t\t\t- sizeUploaded -- Formatted size uploaded so far, bytes\n\t\t\n\t\t*Adds setting 'moving_average_history_size' for defining the window size used to calculate the moving average speed.\n\t\t\n\t\t*Adds several Formatting functions for formatting that values provided on the file object.\n\t\t\t- SWFUpload.speed.formatBPS(bps) -- outputs string formatted in the best units (Gbps, Mbps, Kbps, bps)\n\t\t\t- SWFUpload.speed.formatTime(seconds) -- outputs string formatted in the best units (x Hr y M z S)\n\t\t\t- SWFUpload.speed.formatSize(bytes) -- outputs string formatted in the best units (w GB x MB y KB z B )\n\t\t\t- SWFUpload.speed.formatPercent(percent) -- outputs string formatted with a percent sign (x.xx %)\n\t\t\t- SWFUpload.speed.formatUnits(baseNumber, divisionArray, unitLabelArray, fractionalBoolean)\n\t\t\t\t- Formats a number using the division array to determine how to apply the labels in the Label Array\n\t\t\t\t- factionalBoolean indicates whether the number should be returned as a single fractional number with a unit (speed)\n\t\t\t\t    or as several numbers labeled with units (time)\n\t*/\n\nvar SWFUpload;\nif (typeof(SWFUpload) === \"function\") {\n\tSWFUpload.speed = {};\n\t\n\tSWFUpload.prototype.initSettings = (function (oldInitSettings) {\n\t\treturn function () {\n\t\t\tif (typeof(oldInitSettings) === \"function\") {\n\t\t\t\toldInitSettings.call(this);\n\t\t\t}\n\t\t\t\n\t\t\tthis.ensureDefault = function (settingName, defaultValue) {\n\t\t\t\tthis.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];\n\t\t\t};\n\n\t\t\t// List used to keep the speed stats for the files we are tracking\n\t\t\tthis.fileSpeedStats = {};\n\t\t\tthis.speedSettings = {};\n\n\t\t\tthis.ensureDefault(\"moving_average_history_size\", \"10\");\n\t\t\t\n\t\t\tthis.speedSettings.user_file_queued_handler = this.settings.file_queued_handler;\n\t\t\tthis.speedSettings.user_file_queue_error_handler = this.settings.file_queue_error_handler;\n\t\t\tthis.speedSettings.user_upload_start_handler = this.settings.upload_start_handler;\n\t\t\tthis.speedSettings.user_upload_error_handler = this.settings.upload_error_handler;\n\t\t\tthis.speedSettings.user_upload_progress_handler = this.settings.upload_progress_handler;\n\t\t\tthis.speedSettings.user_upload_success_handler = this.settings.upload_success_handler;\n\t\t\tthis.speedSettings.user_upload_complete_handler = this.settings.upload_complete_handler;\n\t\t\t\n\t\t\tthis.settings.file_queued_handler = SWFUpload.speed.fileQueuedHandler;\n\t\t\tthis.settings.file_queue_error_handler = SWFUpload.speed.fileQueueErrorHandler;\n\t\t\tthis.settings.upload_start_handler = SWFUpload.speed.uploadStartHandler;\n\t\t\tthis.settings.upload_error_handler = SWFUpload.speed.uploadErrorHandler;\n\t\t\tthis.settings.upload_progress_handler = SWFUpload.speed.uploadProgressHandler;\n\t\t\tthis.settings.upload_success_handler = SWFUpload.speed.uploadSuccessHandler;\n\t\t\tthis.settings.upload_complete_handler = SWFUpload.speed.uploadCompleteHandler;\n\t\t\t\n\t\t\tdelete this.ensureDefault;\n\t\t};\n\t})(SWFUpload.prototype.initSettings);\n\n\t\n\tSWFUpload.speed.fileQueuedHandler = function (file) {\n\t\tif (typeof this.speedSettings.user_file_queued_handler === \"function\") {\n\t\t\tfile = SWFUpload.speed.extendFile(file);\n\t\t\t\n\t\t\treturn this.speedSettings.user_file_queued_handler.call(this, file);\n\t\t}\n\t};\n\t\n\tSWFUpload.speed.fileQueueErrorHandler = function (file, errorCode, message) {\n\t\tif (typeof this.speedSettings.user_file_queue_error_handler === \"function\") {\n\t\t\tfile = SWFUpload.speed.extendFile(file);\n\t\t\t\n\t\t\treturn this.speedSettings.user_file_queue_error_handler.call(this, file, errorCode, message);\n\t\t}\n\t};\n\n\tSWFUpload.speed.uploadStartHandler = function (file) {\n\t\tif (typeof this.speedSettings.user_upload_start_handler === \"function\") {\n\t\t\tfile = SWFUpload.speed.extendFile(file, this.fileSpeedStats);\n\t\t\treturn this.speedSettings.user_upload_start_handler.call(this, file);\n\t\t}\n\t};\n\t\n\tSWFUpload.speed.uploadErrorHandler = function (file, errorCode, message) {\n\t\tfile = SWFUpload.speed.extendFile(file, this.fileSpeedStats);\n\t\tSWFUpload.speed.removeTracking(file, this.fileSpeedStats);\n\n\t\tif (typeof this.speedSettings.user_upload_error_handler === \"function\") {\n\t\t\treturn this.speedSettings.user_upload_error_handler.call(this, file, errorCode, message);\n\t\t}\n\t};\n\tSWFUpload.speed.uploadProgressHandler = function (file, bytesComplete, bytesTotal) {\n\t\tthis.updateTracking(file, bytesComplete);\n\t\tfile = SWFUpload.speed.extendFile(file, this.fileSpeedStats);\n\n\t\tif (typeof this.speedSettings.user_upload_progress_handler === \"function\") {\n\t\t\treturn this.speedSettings.user_upload_progress_handler.call(this, file, bytesComplete, bytesTotal);\n\t\t}\n\t};\n\t\n\tSWFUpload.speed.uploadSuccessHandler = function (file, serverData) {\n\t\tif (typeof this.speedSettings.user_upload_success_handler === \"function\") {\n\t\t\tfile = SWFUpload.speed.extendFile(file, this.fileSpeedStats);\n\t\t\treturn this.speedSettings.user_upload_success_handler.call(this, file, serverData);\n\t\t}\n\t};\n\tSWFUpload.speed.uploadCompleteHandler = function (file) {\n\t\tfile = SWFUpload.speed.extendFile(file, this.fileSpeedStats);\n\t\tSWFUpload.speed.removeTracking(file, this.fileSpeedStats);\n\n\t\tif (typeof this.speedSettings.user_upload_complete_handler === \"function\") {\n\t\t\treturn this.speedSettings.user_upload_complete_handler.call(this, file);\n\t\t}\n\t};\n\t\n\t// Private: extends the file object with the speed plugin values\n\tSWFUpload.speed.extendFile = function (file, trackingList) {\n\t\tvar tracking;\n\t\t\n\t\tif (trackingList) {\n\t\t\ttracking = trackingList[file.id];\n\t\t}\n\t\t\n\t\tif (tracking) {\n\t\t\tfile.currentSpeed = tracking.currentSpeed;\n\t\t\tfile.averageSpeed = tracking.averageSpeed;\n\t\t\tfile.movingAverageSpeed = tracking.movingAverageSpeed;\n\t\t\tfile.timeRemaining = tracking.timeRemaining;\n\t\t\tfile.timeElapsed = tracking.timeElapsed;\n\t\t\tfile.percentUploaded = tracking.percentUploaded;\n\t\t\tfile.sizeUploaded = tracking.bytesUploaded;\n\n\t\t} else {\n\t\t\tfile.currentSpeed = 0;\n\t\t\tfile.averageSpeed = 0;\n\t\t\tfile.movingAverageSpeed = 0;\n\t\t\tfile.timeRemaining = 0;\n\t\t\tfile.timeElapsed = 0;\n\t\t\tfile.percentUploaded = 0;\n\t\t\tfile.sizeUploaded = 0;\n\t\t}\n\t\t\n\t\treturn file;\n\t};\n\t\n\t// Private: Updates the speed tracking object, or creates it if necessary\n\tSWFUpload.prototype.updateTracking = function (file, bytesUploaded) {\n\t\tvar tracking = this.fileSpeedStats[file.id];\n\t\tif (!tracking) {\n\t\t\tthis.fileSpeedStats[file.id] = tracking = {};\n\t\t}\n\t\t\n\t\t// Sanity check inputs\n\t\tbytesUploaded = bytesUploaded || tracking.bytesUploaded || 0;\n\t\tif (bytesUploaded < 0) {\n\t\t\tbytesUploaded = 0;\n\t\t}\n\t\tif (bytesUploaded > file.size) {\n\t\t\tbytesUploaded = file.size;\n\t\t}\n\t\t\n\t\tvar tickTime = (new Date()).getTime();\n\t\tif (!tracking.startTime) {\n\t\t\ttracking.startTime = (new Date()).getTime();\n\t\t\ttracking.lastTime = tracking.startTime;\n\t\t\ttracking.currentSpeed = 0;\n\t\t\ttracking.averageSpeed = 0;\n\t\t\ttracking.movingAverageSpeed = 0;\n\t\t\ttracking.movingAverageHistory = [];\n\t\t\ttracking.timeRemaining = 0;\n\t\t\ttracking.timeElapsed = 0;\n\t\t\ttracking.percentUploaded = bytesUploaded / file.size;\n\t\t\ttracking.bytesUploaded = bytesUploaded;\n\t\t} else if (tracking.startTime > tickTime) {\n\t\t\tthis.debug(\"When backwards in time\");\n\t\t} else {\n\t\t\t// Get time and deltas\n\t\t\tvar now = (new Date()).getTime();\n\t\t\tvar lastTime = tracking.lastTime;\n\t\t\tvar deltaTime = now - lastTime;\n\t\t\tvar deltaBytes = bytesUploaded - tracking.bytesUploaded;\n\t\t\t\n\t\t\tif (deltaBytes === 0 || deltaTime === 0) {\n\t\t\t\treturn tracking;\n\t\t\t}\n\t\t\t\n\t\t\t// Update tracking object\n\t\t\ttracking.lastTime = now;\n\t\t\ttracking.bytesUploaded = bytesUploaded;\n\t\t\t\n\t\t\t// Calculate speeds\n\t\t\ttracking.currentSpeed = (deltaBytes * 8 ) / (deltaTime / 1000);\n\t\t\ttracking.averageSpeed = (tracking.bytesUploaded * 8) / ((now - tracking.startTime) / 1000);\n\n\t\t\t// Calculate moving average\n\t\t\ttracking.movingAverageHistory.push(tracking.currentSpeed);\n\t\t\tif (tracking.movingAverageHistory.length > this.settings.moving_average_history_size) {\n\t\t\t\ttracking.movingAverageHistory.shift();\n\t\t\t}\n\t\t\t\n\t\t\ttracking.movingAverageSpeed = SWFUpload.speed.calculateMovingAverage(tracking.movingAverageHistory);\n\t\t\t\n\t\t\t// Update times\n\t\t\ttracking.timeRemaining = (file.size - tracking.bytesUploaded) * 8 / tracking.movingAverageSpeed;\n\t\t\ttracking.timeElapsed = (now - tracking.startTime) / 1000;\n\t\t\t\n\t\t\t// Update percent\n\t\t\ttracking.percentUploaded = (tracking.bytesUploaded / file.size * 100);\n\t\t}\n\t\t\n\t\treturn tracking;\n\t};\n\tSWFUpload.speed.removeTracking = function (file, trackingList) {\n\t\ttry {\n\t\t\ttrackingList[file.id] = null;\n\t\t\tdelete trackingList[file.id];\n\t\t} catch (ex) {\n\t\t}\n\t};\n\t\n\tSWFUpload.speed.formatUnits = function (baseNumber, unitDivisors, unitLabels, singleFractional) {\n\t\tvar i, unit, unitDivisor, unitLabel;\n\n\t\tif (baseNumber === 0) {\n\t\t\treturn \"0 \" + unitLabels[unitLabels.length - 1];\n\t\t}\n\t\t\n\t\tif (singleFractional) {\n\t\t\tunit = baseNumber;\n\t\t\tunitLabel = unitLabels.length >= unitDivisors.length ? unitLabels[unitDivisors.length - 1] : \"\";\n\t\t\tfor (i = 0; i < unitDivisors.length; i++) {\n\t\t\t\tif (baseNumber >= unitDivisors[i]) {\n\t\t\t\t\tunit = (baseNumber / unitDivisors[i]).toFixed(2);\n\t\t\t\t\tunitLabel = unitLabels.length >= i ? \" \" + unitLabels[i] : \"\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn unit + unitLabel;\n\t\t} else {\n\t\t\tvar formattedStrings = [];\n\t\t\tvar remainder = baseNumber;\n\t\t\t\n\t\t\tfor (i = 0; i < unitDivisors.length; i++) {\n\t\t\t\tunitDivisor = unitDivisors[i];\n\t\t\t\tunitLabel = unitLabels.length > i ? \" \" + unitLabels[i] : \"\";\n\t\t\t\t\n\t\t\t\tunit = remainder / unitDivisor;\n\t\t\t\tif (i < unitDivisors.length -1) {\n\t\t\t\t\tunit = Math.floor(unit);\n\t\t\t\t} else {\n\t\t\t\t\tunit = unit.toFixed(2);\n\t\t\t\t}\n\t\t\t\tif (unit > 0) {\n\t\t\t\t\tremainder = remainder % unitDivisor;\n\t\t\t\t\t\n\t\t\t\t\tformattedStrings.push(unit + unitLabel);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn formattedStrings.join(\" \");\n\t\t}\n\t};\n\t\n\tSWFUpload.speed.formatBPS = function (baseNumber) {\n\t\tvar bpsUnits = [1073741824, 1048576, 1024, 1], bpsUnitLabels = [\"Gbps\", \"Mbps\", \"Kbps\", \"bps\"];\n\t\treturn SWFUpload.speed.formatUnits(baseNumber, bpsUnits, bpsUnitLabels, true);\n\t\n\t};\n\tSWFUpload.speed.formatTime = function (baseNumber) {\n\t\tvar timeUnits = [86400, 3600, 60, 1], timeUnitLabels = [\"d\", \"h\", \"m\", \"s\"];\n\t\treturn SWFUpload.speed.formatUnits(baseNumber, timeUnits, timeUnitLabels, false);\n\t\n\t};\n\tSWFUpload.speed.formatBytes = function (baseNumber) {\n\t\tvar sizeUnits = [1073741824, 1048576, 1024, 1], sizeUnitLabels = [\"GB\", \"MB\", \"KB\", \"bytes\"];\n\t\treturn SWFUpload.speed.formatUnits(baseNumber, sizeUnits, sizeUnitLabels, true);\n\t\n\t};\n\tSWFUpload.speed.formatPercent = function (baseNumber) {\n\t\treturn baseNumber.toFixed(2) + \" %\";\n\t};\n\t\n\tSWFUpload.speed.calculateMovingAverage = function (history) {\n\t\tvar vals = [], size, sum = 0.0, mean = 0.0, varianceTemp = 0.0, variance = 0.0, standardDev = 0.0;\n\t\tvar i;\n\t\tvar mSum = 0, mCount = 0;\n\t\t\n\t\tsize = history.length;\n\t\t\n\t\t// Check for sufficient data\n\t\tif (size >= 8) {\n\t\t\t// Clone the array and Calculate sum of the values \n\t\t\tfor (i = 0; i < size; i++) {\n\t\t\t\tvals[i] = history[i];\n\t\t\t\tsum += vals[i];\n\t\t\t}\n\n\t\t\tmean = sum / size;\n\n\t\t\t// Calculate variance for the set\n\t\t\tfor (i = 0; i < size; i++) {\n\t\t\t\tvarianceTemp += Math.pow((vals[i] - mean), 2);\n\t\t\t}\n\n\t\t\tvariance = varianceTemp / size;\n\t\t\tstandardDev = Math.sqrt(variance);\n\t\t\t\n\t\t\t//Standardize the Data\n\t\t\tfor (i = 0; i < size; i++) {\n\t\t\t\tvals[i] = (vals[i] - mean) / standardDev;\n\t\t\t}\n\n\t\t\t// Calculate the average excluding outliers\n\t\t\tvar deviationRange = 2.0;\n\t\t\tfor (i = 0; i < size; i++) {\n\t\t\t\t\n\t\t\t\tif (vals[i] <= deviationRange && vals[i] >= -deviationRange) {\n\t\t\t\t\tmCount++;\n\t\t\t\t\tmSum += history[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t} else {\n\t\t\t// Calculate the average (not enough data points to remove outliers)\n\t\t\tmCount = size;\n\t\t\tfor (i = 0; i < size; i++) {\n\t\t\t\tmSum += history[i];\n\t\t\t}\n\t\t}\n\n\t\treturn mSum / mCount;\n\t};\n\t\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/swfupload/plugins/swfupload.swfobject.js",
    "content": "/*\n\tSWFUpload.SWFObject Plugin\n\n\tSummary:\n\t\tThis plugin uses SWFObject to embed SWFUpload dynamically in the page.  SWFObject provides accurate Flash Player detection and DOM Ready loading.\n\t\tThis plugin replaces the Graceful Degradation plugin.\n\n\tFeatures:\n\t\t* swfupload_load_failed_hander event\n\t\t* swfupload_pre_load_handler event\n\t\t* minimum_flash_version setting (default: \"9.0.28\")\n\t\t* SWFUpload.onload event for early loading\n\n\tUsage:\n\t\tProvide handlers and settings as needed.  When using the SWFUpload.SWFObject plugin you should initialize SWFUploading\n\t\tin SWFUpload.onload rather than in window.onload.  When initialized this way SWFUpload can load earlier preventing the UI flicker\n\t\tthat was seen using the Graceful Degradation plugin.\n\n\t\t<script type=\"text/javascript\">\n\t\t\tvar swfu;\n\t\t\tSWFUpload.onload = function () {\n\t\t\t\tswfu = new SWFUpload({\n\t\t\t\t\tminimum_flash_version: \"9.0.28\",\n\t\t\t\t\tswfupload_pre_load_handler: swfuploadPreLoad,\n\t\t\t\t\tswfupload_load_failed_handler: swfuploadLoadFailed\n\t\t\t\t});\n\t\t\t};\n\t\t</script>\n\t\t\n\tNotes:\n\t\tYou must provide set minimum_flash_version setting to \"8\" if you are using SWFUpload for Flash Player 8.\n\t\tThe swfuploadLoadFailed event is only fired if the minimum version of Flash Player is not met.  Other issues such as missing SWF files, browser bugs\n\t\t or corrupt Flash Player installations will not trigger this event.\n\t\tThe swfuploadPreLoad event is fired as soon as the minimum version of Flash Player is found.  It does not wait for SWFUpload to load and can\n\t\t be used to prepare the SWFUploadUI and hide alternate content.\n\t\tswfobject's onDomReady event is cross-browser safe but will default to the window.onload event when DOMReady is not supported by the browser.\n\t\t Early DOM Loading is supported in major modern browsers but cannot be guaranteed for every browser ever made.\n*/\n\n\n// SWFObject v2.1 must be loaded\n\t\nvar SWFUpload;\nif (typeof(SWFUpload) === \"function\") {\n\tSWFUpload.onload = function () {};\n\n\tswfobject.addDomLoadEvent(function () {\n\t\tif (typeof(SWFUpload.onload) === \"function\") {\n\t\t\tsetTimeout(function(){SWFUpload.onload.call(window);}, 200);\n\t\t}\n\t});\n\n\tSWFUpload.prototype.initSettings = (function (oldInitSettings) {\n\t\treturn function () {\n\t\t\tif (typeof(oldInitSettings) === \"function\") {\n\t\t\t\toldInitSettings.call(this);\n\t\t\t}\n\n\t\t\tthis.ensureDefault = function (settingName, defaultValue) {\n\t\t\t\tthis.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];\n\t\t\t};\n\n\t\t\tthis.ensureDefault(\"minimum_flash_version\", \"9.0.28\");\n\t\t\tthis.ensureDefault(\"swfupload_pre_load_handler\", null);\n\t\t\tthis.ensureDefault(\"swfupload_load_failed_handler\", null);\n\n\t\t\tdelete this.ensureDefault;\n\n\t\t};\n\t})(SWFUpload.prototype.initSettings);\n\n\n\tSWFUpload.prototype.loadFlash = function (oldLoadFlash) {\n\t\treturn function () {\n\t\t\tvar hasFlash = swfobject.hasFlashPlayerVersion(this.settings.minimum_flash_version);\n\t\t\t\n\t\t\tif (hasFlash) {\n\t\t\t\tthis.queueEvent(\"swfupload_pre_load_handler\");\n\t\t\t\tif (typeof(oldLoadFlash) === \"function\") {\n\t\t\t\t\toldLoadFlash.call(this);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.queueEvent(\"swfupload_load_failed_handler\");\n\t\t\t}\n\t\t};\n\t\t\n\t}(SWFUpload.prototype.loadFlash);\n\t\t\t\n\tSWFUpload.prototype.displayDebugInfo = function (oldDisplayDebugInfo) {\n\t\treturn function () {\n\t\t\tif (typeof(oldDisplayDebugInfo) === \"function\") {\n\t\t\t\toldDisplayDebugInfo.call(this);\n\t\t\t}\n\t\t\t\n\t\t\tthis.debug(\n\t\t\t\t[\n\t\t\t\t\t\"SWFUpload.SWFObject Plugin settings:\", \"\\n\",\n\t\t\t\t\t\"\\t\", \"minimum_flash_version:                      \", this.settings.minimum_flash_version, \"\\n\",\n\t\t\t\t\t\"\\t\", \"swfupload_pre_load_handler assigned:     \", (typeof(this.settings.swfupload_pre_load_handler) === \"function\").toString(), \"\\n\",\n\t\t\t\t\t\"\\t\", \"swfupload_load_failed_handler assigned:     \", (typeof(this.settings.swfupload_load_failed_handler) === \"function\").toString(), \"\\n\",\n\t\t\t\t].join(\"\")\n\t\t\t);\n\t\t};\t\n\t}(SWFUpload.prototype.displayDebugInfo);\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/swfupload/swfupload.js",
    "content": "/**\n * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com\n *\n * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/\n *\n * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz�n and Mammon Media and is released under the MIT License:\n * http://www.opensource.org/licenses/mit-license.php\n *\n * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:\n * http://www.opensource.org/licenses/mit-license.php\n *\n */\n\n\n/* ******************* */\n/* Constructor & Init  */\n/* ******************* */\nvar SWFUpload;\n\nif (SWFUpload == undefined) {\n\tSWFUpload = function (settings) {\n\t\tthis.initSWFUpload(settings);\n\t};\n}\n\nSWFUpload.prototype.initSWFUpload = function (settings) {\n\ttry {\n\t\tthis.customSettings = {};\t// A container where developers can place their own settings associated with this instance.\n\t\tthis.settings = settings;\n\t\tthis.eventQueue = [];\n\t\tthis.movieName = \"SWFUpload_\" + SWFUpload.movieCount++;\n\t\tthis.movieElement = null;\n\n\n\t\t// Setup global control tracking\n\t\tSWFUpload.instances[this.movieName] = this;\n\n\t\t// Load the settings.  Load the Flash movie.\n\t\tthis.initSettings();\n\t\tthis.loadFlash();\n\t\tthis.displayDebugInfo();\n\t} catch (ex) {\n\t\tdelete SWFUpload.instances[this.movieName];\n\t\tthrow ex;\n\t}\n};\n\n/* *************** */\n/* Static Members  */\n/* *************** */\nSWFUpload.instances = {};\nSWFUpload.movieCount = 0;\nSWFUpload.version = \"2.2.0 2009-03-25\";\nSWFUpload.QUEUE_ERROR = {\n\tQUEUE_LIMIT_EXCEEDED\t  \t\t: -100,\n\tFILE_EXCEEDS_SIZE_LIMIT  \t\t: -110,\n\tZERO_BYTE_FILE\t\t\t  \t\t: -120,\n\tINVALID_FILETYPE\t\t  \t\t: -130\n};\nSWFUpload.UPLOAD_ERROR = {\n\tHTTP_ERROR\t\t\t\t  \t\t: -200,\n\tMISSING_UPLOAD_URL\t      \t\t: -210,\n\tIO_ERROR\t\t\t\t  \t\t: -220,\n\tSECURITY_ERROR\t\t\t  \t\t: -230,\n\tUPLOAD_LIMIT_EXCEEDED\t  \t\t: -240,\n\tUPLOAD_FAILED\t\t\t  \t\t: -250,\n\tSPECIFIED_FILE_ID_NOT_FOUND\t\t: -260,\n\tFILE_VALIDATION_FAILED\t  \t\t: -270,\n\tFILE_CANCELLED\t\t\t  \t\t: -280,\n\tUPLOAD_STOPPED\t\t\t\t\t: -290\n};\nSWFUpload.FILE_STATUS = {\n\tQUEUED\t\t : -1,\n\tIN_PROGRESS\t : -2,\n\tERROR\t\t : -3,\n\tCOMPLETE\t : -4,\n\tCANCELLED\t : -5\n};\nSWFUpload.BUTTON_ACTION = {\n\tSELECT_FILE  : -100,\n\tSELECT_FILES : -110,\n\tSTART_UPLOAD : -120\n};\nSWFUpload.CURSOR = {\n\tARROW : -1,\n\tHAND : -2\n};\nSWFUpload.WINDOW_MODE = {\n\tWINDOW : \"window\",\n\tTRANSPARENT : \"transparent\",\n\tOPAQUE : \"opaque\"\n};\n\n// Private: takes a URL, determines if it is relative and converts to an absolute URL\n// using the current site. Only processes the URL if it can, otherwise returns the URL untouched\nSWFUpload.completeURL = function(url) {\n\tif (typeof(url) !== \"string\" || url.match(/^https?:\\/\\//i) || url.match(/^\\//)) {\n\t\treturn url;\n\t}\n\t\n\tvar currentURL = window.location.protocol + \"//\" + window.location.hostname + (window.location.port ? \":\" + window.location.port : \"\");\n\t\n\tvar indexSlash = window.location.pathname.lastIndexOf(\"/\");\n\tif (indexSlash <= 0) {\n\t\tpath = \"/\";\n\t} else {\n\t\tpath = window.location.pathname.substr(0, indexSlash) + \"/\";\n\t}\n\t\n\treturn /*currentURL +*/ path + url;\n\t\n};\n\n\n/* ******************** */\n/* Instance Members  */\n/* ******************** */\n\n// Private: initSettings ensures that all the\n// settings are set, getting a default value if one was not assigned.\nSWFUpload.prototype.initSettings = function () {\n\tthis.ensureDefault = function (settingName, defaultValue) {\n\t\tthis.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];\n\t};\n\t\n\t// Upload backend settings\n\tthis.ensureDefault(\"upload_url\", \"\");\n\tthis.ensureDefault(\"preserve_relative_urls\", false);\n\tthis.ensureDefault(\"file_post_name\", \"Filedata\");\n\tthis.ensureDefault(\"post_params\", {});\n\tthis.ensureDefault(\"use_query_string\", false);\n\tthis.ensureDefault(\"requeue_on_error\", false);\n\tthis.ensureDefault(\"http_success\", []);\n\tthis.ensureDefault(\"assume_success_timeout\", 0);\n\t\n\t// File Settings\n\tthis.ensureDefault(\"file_types\", \"*.*\");\n\tthis.ensureDefault(\"file_types_description\", \"All Files\");\n\tthis.ensureDefault(\"file_size_limit\", 0);\t// Default zero means \"unlimited\"\n\tthis.ensureDefault(\"file_upload_limit\", 0);\n\tthis.ensureDefault(\"file_queue_limit\", 0);\n\n\t// Flash Settings\n\tthis.ensureDefault(\"flash_url\", \"swfupload.swf\");\n\tthis.ensureDefault(\"prevent_swf_caching\", true);\n\t\n\t// Button Settings\n\tthis.ensureDefault(\"button_image_url\", \"\");\n\tthis.ensureDefault(\"button_width\", 1);\n\tthis.ensureDefault(\"button_height\", 1);\n\tthis.ensureDefault(\"button_text\", \"\");\n\tthis.ensureDefault(\"button_text_style\", \"color: #000000; font-size: 16pt;\");\n\tthis.ensureDefault(\"button_text_top_padding\", 0);\n\tthis.ensureDefault(\"button_text_left_padding\", 0);\n\tthis.ensureDefault(\"button_action\", SWFUpload.BUTTON_ACTION.SELECT_FILES);\n\tthis.ensureDefault(\"button_disabled\", false);\n\tthis.ensureDefault(\"button_placeholder_id\", \"\");\n\tthis.ensureDefault(\"button_placeholder\", null);\n\tthis.ensureDefault(\"button_cursor\", SWFUpload.CURSOR.ARROW);\n\tthis.ensureDefault(\"button_window_mode\", SWFUpload.WINDOW_MODE.WINDOW);\n\t\n\t// Debug Settings\n\tthis.ensureDefault(\"debug\", false);\n\tthis.settings.debug_enabled = this.settings.debug;\t// Here to maintain v2 API\n\t\n\t// Event Handlers\n\tthis.settings.return_upload_start_handler = this.returnUploadStart;\n\tthis.ensureDefault(\"swfupload_loaded_handler\", null);\n\tthis.ensureDefault(\"file_dialog_start_handler\", null);\n\tthis.ensureDefault(\"file_queued_handler\", null);\n\tthis.ensureDefault(\"file_queue_error_handler\", null);\n\tthis.ensureDefault(\"file_dialog_complete_handler\", null);\n\t\n\tthis.ensureDefault(\"upload_start_handler\", null);\n\tthis.ensureDefault(\"upload_progress_handler\", null);\n\tthis.ensureDefault(\"upload_error_handler\", null);\n\tthis.ensureDefault(\"upload_success_handler\", null);\n\tthis.ensureDefault(\"upload_complete_handler\", null);\n\t\n\tthis.ensureDefault(\"debug_handler\", this.debugMessage);\n\n\tthis.ensureDefault(\"custom_settings\", {});\n\n\t// Other settings\n\tthis.customSettings = this.settings.custom_settings;\n\t\n\t// Update the flash url if needed\n\tif (!!this.settings.prevent_swf_caching) {\n\t\tthis.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + \"preventswfcaching=\" + new Date().getTime();\n\t}\n\t\n\tif (!this.settings.preserve_relative_urls) {\n\t\t//this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url);\t// Don't need to do this one since flash doesn't look at it\n\t\tthis.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);\n\t\tthis.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);\n\t}\n\t\n\tdelete this.ensureDefault;\n};\n\n// Private: loadFlash replaces the button_placeholder element with the flash movie.\nSWFUpload.prototype.loadFlash = function () {\n\tvar targetElement, tempParent;\n\n\t// Make sure an element with the ID we are going to use doesn't already exist\n\tif (document.getElementById(this.movieName) !== null) {\n\t\tthrow \"ID \" + this.movieName + \" is already in use. The Flash Object could not be added\";\n\t}\n\n\t// Get the element where we will be placing the flash movie\n\ttargetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;\n\n\tif (targetElement == undefined) {\n\t\tthrow \"Could not find the placeholder element: \" + this.settings.button_placeholder_id;\n\t}\n\n\t// Append the container and load the flash\n\ttempParent = document.createElement(\"div\");\n\ttempParent.innerHTML = this.getFlashHTML();\t// Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)\n\ttargetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);\n\n\t// Fix IE Flash/Form bug\n\tif (window[this.movieName] == undefined) {\n\t\twindow[this.movieName] = this.getMovieElement();\n\t}\n\t\n};\n\n// Private: getFlashHTML generates the object tag needed to embed the flash in to the document\nSWFUpload.prototype.getFlashHTML = function () {\n\t// Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay\n\treturn ['<object id=\"', this.movieName, '\" type=\"application/x-shockwave-flash\" data=\"', this.settings.flash_url, '\" width=\"', this.settings.button_width, '\" height=\"', this.settings.button_height, '\" class=\"swfupload\">',\n\t\t\t\t'<param name=\"wmode\" value=\"', this.settings.button_window_mode, '\" />',\n\t\t\t\t'<param name=\"movie\" value=\"', this.settings.flash_url, '\" />',\n\t\t\t\t'<param name=\"quality\" value=\"high\" />',\n\t\t\t\t'<param name=\"menu\" value=\"false\" />',\n\t\t\t\t'<param name=\"allowScriptAccess\" value=\"always\" />',\n\t\t\t\t'<param name=\"flashvars\" value=\"' + this.getFlashVars() + '\" />',\n\t\t\t\t'</object>'].join(\"\");\n};\n\n// Private: getFlashVars builds the parameter string that will be passed\n// to flash in the flashvars param.\nSWFUpload.prototype.getFlashVars = function () {\n\t// Build a string from the post param object\n\tvar paramString = this.buildParamString();\n\tvar httpSuccessString = this.settings.http_success.join(\",\");\n\t\n\t// Build the parameter string\n\treturn [\"movieName=\", encodeURIComponent(this.movieName),\n\t\t\t\"&amp;uploadURL=\", encodeURIComponent(this.settings.upload_url),\n\t\t\t\"&amp;useQueryString=\", encodeURIComponent(this.settings.use_query_string),\n\t\t\t\"&amp;requeueOnError=\", encodeURIComponent(this.settings.requeue_on_error),\n\t\t\t\"&amp;httpSuccess=\", encodeURIComponent(httpSuccessString),\n\t\t\t\"&amp;assumeSuccessTimeout=\", encodeURIComponent(this.settings.assume_success_timeout),\n\t\t\t\"&amp;params=\", encodeURIComponent(paramString),\n\t\t\t\"&amp;filePostName=\", encodeURIComponent(this.settings.file_post_name),\n\t\t\t\"&amp;fileTypes=\", encodeURIComponent(this.settings.file_types),\n\t\t\t\"&amp;fileTypesDescription=\", encodeURIComponent(this.settings.file_types_description),\n\t\t\t\"&amp;fileSizeLimit=\", encodeURIComponent(this.settings.file_size_limit),\n\t\t\t\"&amp;fileUploadLimit=\", encodeURIComponent(this.settings.file_upload_limit),\n\t\t\t\"&amp;fileQueueLimit=\", encodeURIComponent(this.settings.file_queue_limit),\n\t\t\t\"&amp;debugEnabled=\", encodeURIComponent(this.settings.debug_enabled),\n\t\t\t\"&amp;buttonImageURL=\", encodeURIComponent(this.settings.button_image_url),\n\t\t\t\"&amp;buttonWidth=\", encodeURIComponent(this.settings.button_width),\n\t\t\t\"&amp;buttonHeight=\", encodeURIComponent(this.settings.button_height),\n\t\t\t\"&amp;buttonText=\", encodeURIComponent(this.settings.button_text),\n\t\t\t\"&amp;buttonTextTopPadding=\", encodeURIComponent(this.settings.button_text_top_padding),\n\t\t\t\"&amp;buttonTextLeftPadding=\", encodeURIComponent(this.settings.button_text_left_padding),\n\t\t\t\"&amp;buttonTextStyle=\", encodeURIComponent(this.settings.button_text_style),\n\t\t\t\"&amp;buttonAction=\", encodeURIComponent(this.settings.button_action),\n\t\t\t\"&amp;buttonDisabled=\", encodeURIComponent(this.settings.button_disabled),\n\t\t\t\"&amp;buttonCursor=\", encodeURIComponent(this.settings.button_cursor)\n\t\t].join(\"\");\n};\n\n// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload\n// The element is cached after the first lookup\nSWFUpload.prototype.getMovieElement = function () {\n\tif (this.movieElement == undefined) {\n\t\tthis.movieElement = document.getElementById(this.movieName);\n\t}\n\n\tif (this.movieElement === null) {\n\t\tthrow \"Could not find Flash element\";\n\t}\n\t\n\treturn this.movieElement;\n};\n\n// Private: buildParamString takes the name/value pairs in the post_params setting object\n// and joins them up in to a string formatted \"name=value&amp;name=value\"\nSWFUpload.prototype.buildParamString = function () {\n\tvar postParams = this.settings.post_params; \n\tvar paramStringPairs = [];\n\n\tif (typeof(postParams) === \"object\") {\n\t\tfor (var name in postParams) {\n\t\t\tif (postParams.hasOwnProperty(name)) {\n\t\t\t\tparamStringPairs.push(encodeURIComponent(name.toString()) + \"=\" + encodeURIComponent(postParams[name].toString()));\n\t\t\t}\n\t\t}\n\t}\n\n\treturn paramStringPairs.join(\"&amp;\");\n};\n\n// Public: Used to remove a SWFUpload instance from the page. This method strives to remove\n// all references to the SWF, and other objects so memory is properly freed.\n// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state.\n// Credits: Major improvements provided by steffen\nSWFUpload.prototype.destroy = function () {\n\ttry {\n\t\t// Make sure Flash is done before we try to remove it\n\t\tthis.cancelUpload(null, false);\n\t\t\n\n\t\t// Remove the SWFUpload DOM nodes\n\t\tvar movieElement = null;\n\t\tmovieElement = this.getMovieElement();\n\t\t\n\t\tif (movieElement && typeof(movieElement.CallFunction) === \"unknown\") { // We only want to do this in IE\n\t\t\t// Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround)\n\t\t\tfor (var i in movieElement) {\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof(movieElement[i]) === \"function\") {\n\t\t\t\t\t\tmovieElement[i] = null;\n\t\t\t\t\t}\n\t\t\t\t} catch (ex1) {}\n\t\t\t}\n\n\t\t\t// Remove the Movie Element from the page\n\t\t\ttry {\n\t\t\t\tmovieElement.parentNode.removeChild(movieElement);\n\t\t\t} catch (ex) {}\n\t\t}\n\t\t\n\t\t// Remove IE form fix reference\n\t\twindow[this.movieName] = null;\n\n\t\t// Destroy other references\n\t\tSWFUpload.instances[this.movieName] = null;\n\t\tdelete SWFUpload.instances[this.movieName];\n\n\t\tthis.movieElement = null;\n\t\tthis.settings = null;\n\t\tthis.customSettings = null;\n\t\tthis.eventQueue = null;\n\t\tthis.movieName = null;\n\t\t\n\t\t\n\t\treturn true;\n\t} catch (ex2) {\n\t\treturn false;\n\t}\n};\n\n\n// Public: displayDebugInfo prints out settings and configuration\n// information about this SWFUpload instance.\n// This function (and any references to it) can be deleted when placing\n// SWFUpload in production.\nSWFUpload.prototype.displayDebugInfo = function () {\n\tthis.debug(\n\t\t[\n\t\t\t\"---SWFUpload Instance Info---\\n\",\n\t\t\t\"Version: \", SWFUpload.version, \"\\n\",\n\t\t\t\"Movie Name: \", this.movieName, \"\\n\",\n\t\t\t\"Settings:\\n\",\n\t\t\t\"\\t\", \"upload_url:               \", this.settings.upload_url, \"\\n\",\n\t\t\t\"\\t\", \"flash_url:                \", this.settings.flash_url, \"\\n\",\n\t\t\t\"\\t\", \"use_query_string:         \", this.settings.use_query_string.toString(), \"\\n\",\n\t\t\t\"\\t\", \"requeue_on_error:         \", this.settings.requeue_on_error.toString(), \"\\n\",\n\t\t\t\"\\t\", \"http_success:             \", this.settings.http_success.join(\", \"), \"\\n\",\n\t\t\t\"\\t\", \"assume_success_timeout:   \", this.settings.assume_success_timeout, \"\\n\",\n\t\t\t\"\\t\", \"file_post_name:           \", this.settings.file_post_name, \"\\n\",\n\t\t\t\"\\t\", \"post_params:              \", this.settings.post_params.toString(), \"\\n\",\n\t\t\t\"\\t\", \"file_types:               \", this.settings.file_types, \"\\n\",\n\t\t\t\"\\t\", \"file_types_description:   \", this.settings.file_types_description, \"\\n\",\n\t\t\t\"\\t\", \"file_size_limit:          \", this.settings.file_size_limit, \"\\n\",\n\t\t\t\"\\t\", \"file_upload_limit:        \", this.settings.file_upload_limit, \"\\n\",\n\t\t\t\"\\t\", \"file_queue_limit:         \", this.settings.file_queue_limit, \"\\n\",\n\t\t\t\"\\t\", \"debug:                    \", this.settings.debug.toString(), \"\\n\",\n\n\t\t\t\"\\t\", \"prevent_swf_caching:      \", this.settings.prevent_swf_caching.toString(), \"\\n\",\n\n\t\t\t\"\\t\", \"button_placeholder_id:    \", this.settings.button_placeholder_id.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_placeholder:       \", (this.settings.button_placeholder ? \"Set\" : \"Not Set\"), \"\\n\",\n\t\t\t\"\\t\", \"button_image_url:         \", this.settings.button_image_url.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_width:             \", this.settings.button_width.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_height:            \", this.settings.button_height.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_text:              \", this.settings.button_text.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_text_style:        \", this.settings.button_text_style.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_text_top_padding:  \", this.settings.button_text_top_padding.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_text_left_padding: \", this.settings.button_text_left_padding.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_action:            \", this.settings.button_action.toString(), \"\\n\",\n\t\t\t\"\\t\", \"button_disabled:          \", this.settings.button_disabled.toString(), \"\\n\",\n\n\t\t\t\"\\t\", \"custom_settings:          \", this.settings.custom_settings.toString(), \"\\n\",\n\t\t\t\"Event Handlers:\\n\",\n\t\t\t\"\\t\", \"swfupload_loaded_handler assigned:  \", (typeof this.settings.swfupload_loaded_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"file_dialog_start_handler assigned: \", (typeof this.settings.file_dialog_start_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"file_queued_handler assigned:       \", (typeof this.settings.file_queued_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"file_queue_error_handler assigned:  \", (typeof this.settings.file_queue_error_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"upload_start_handler assigned:      \", (typeof this.settings.upload_start_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"upload_progress_handler assigned:   \", (typeof this.settings.upload_progress_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"upload_error_handler assigned:      \", (typeof this.settings.upload_error_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"upload_success_handler assigned:    \", (typeof this.settings.upload_success_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"upload_complete_handler assigned:   \", (typeof this.settings.upload_complete_handler === \"function\").toString(), \"\\n\",\n\t\t\t\"\\t\", \"debug_handler assigned:             \", (typeof this.settings.debug_handler === \"function\").toString(), \"\\n\"\n\t\t].join(\"\")\n\t);\n};\n\n/* Note: addSetting and getSetting are no longer used by SWFUpload but are included\n\tthe maintain v2 API compatibility\n*/\n// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used.\nSWFUpload.prototype.addSetting = function (name, value, default_value) {\n    if (value == undefined) {\n        return (this.settings[name] = default_value);\n    } else {\n        return (this.settings[name] = value);\n\t}\n};\n\n// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found.\nSWFUpload.prototype.getSetting = function (name) {\n    if (this.settings[name] != undefined) {\n        return this.settings[name];\n\t}\n\n    return \"\";\n};\n\n\n\n// Private: callFlash handles function calls made to the Flash element.\n// Calls are made with a setTimeout for some functions to work around\n// bugs in the ExternalInterface library.\nSWFUpload.prototype.callFlash = function (functionName, argumentArray) {\n\targumentArray = argumentArray || [];\n\t\n\tvar movieElement = this.getMovieElement();\n\tvar returnValue, returnString;\n\n\t// Flash's method if calling ExternalInterface methods (code adapted from MooTools).\n\ttry {\n\t\treturnString = movieElement.CallFunction('<invoke name=\"' + functionName + '\" returntype=\"javascript\">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>');\n\t\treturnValue = eval(returnString);\n\t} catch (ex) {\n\t\tthrow \"Call to \" + functionName + \" failed\";\n\t}\n\t\n\t// Unescape file post param values\n\tif (returnValue != undefined && typeof returnValue.post === \"object\") {\n\t\treturnValue = this.unescapeFilePostParams(returnValue);\n\t}\n\n\treturn returnValue;\n};\n\n/* *****************************\n\t-- Flash control methods --\n\tYour UI should use these\n\tto operate SWFUpload\n   ***************************** */\n\n// WARNING: this function does not work in Flash Player 10\n// Public: selectFile causes a File Selection Dialog window to appear.  This\n// dialog only allows 1 file to be selected.\nSWFUpload.prototype.selectFile = function () {\n\tthis.callFlash(\"SelectFile\");\n};\n\n// WARNING: this function does not work in Flash Player 10\n// Public: selectFiles causes a File Selection Dialog window to appear/ This\n// dialog allows the user to select any number of files\n// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names.\n// If the selection name length is too long the dialog will fail in an unpredictable manner.  There is no work-around\n// for this bug.\nSWFUpload.prototype.selectFiles = function () {\n\tthis.callFlash(\"SelectFiles\");\n};\n\n\n// Public: startUpload starts uploading the first file in the queue unless\n// the optional parameter 'fileID' specifies the ID \nSWFUpload.prototype.startUpload = function (fileID) {\n\tthis.callFlash(\"StartUpload\", [fileID]);\n};\n\n// Public: cancelUpload cancels any queued file.  The fileID parameter may be the file ID or index.\n// If you do not specify a fileID the current uploading file or first file in the queue is cancelled.\n// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter.\nSWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) {\n\tif (triggerErrorEvent !== false) {\n\t\ttriggerErrorEvent = true;\n\t}\n\tthis.callFlash(\"CancelUpload\", [fileID, triggerErrorEvent]);\n};\n\n// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.\n// If nothing is currently uploading then nothing happens.\nSWFUpload.prototype.stopUpload = function () {\n\tthis.callFlash(\"StopUpload\");\n};\n\n/* ************************\n * Settings methods\n *   These methods change the SWFUpload settings.\n *   SWFUpload settings should not be changed directly on the settings object\n *   since many of the settings need to be passed to Flash in order to take\n *   effect.\n * *********************** */\n\n// Public: getStats gets the file statistics object.\nSWFUpload.prototype.getStats = function () {\n\treturn this.callFlash(\"GetStats\");\n};\n\n// Public: setStats changes the SWFUpload statistics.  You shouldn't need to \n// change the statistics but you can.  Changing the statistics does not\n// affect SWFUpload accept for the successful_uploads count which is used\n// by the upload_limit setting to determine how many files the user may upload.\nSWFUpload.prototype.setStats = function (statsObject) {\n\tthis.callFlash(\"SetStats\", [statsObject]);\n};\n\n// Public: getFile retrieves a File object by ID or Index.  If the file is\n// not found then 'null' is returned.\nSWFUpload.prototype.getFile = function (fileID) {\n\tif (typeof(fileID) === \"number\") {\n\t\treturn this.callFlash(\"GetFileByIndex\", [fileID]);\n\t} else {\n\t\treturn this.callFlash(\"GetFile\", [fileID]);\n\t}\n};\n\n// Public: addFileParam sets a name/value pair that will be posted with the\n// file specified by the Files ID.  If the name already exists then the\n// exiting value will be overwritten.\nSWFUpload.prototype.addFileParam = function (fileID, name, value) {\n\treturn this.callFlash(\"AddFileParam\", [fileID, name, value]);\n};\n\n// Public: removeFileParam removes a previously set (by addFileParam) name/value\n// pair from the specified file.\nSWFUpload.prototype.removeFileParam = function (fileID, name) {\n\tthis.callFlash(\"RemoveFileParam\", [fileID, name]);\n};\n\n// Public: setUploadUrl changes the upload_url setting.\nSWFUpload.prototype.setUploadURL = function (url) {\n\tthis.settings.upload_url = url.toString();\n\tthis.callFlash(\"SetUploadURL\", [url]);\n};\n\n// Public: setPostParams changes the post_params setting\nSWFUpload.prototype.setPostParams = function (paramsObject) {\n\tthis.settings.post_params = paramsObject;\n\tthis.callFlash(\"SetPostParams\", [paramsObject]);\n};\n\n// Public: addPostParam adds post name/value pair.  Each name can have only one value.\nSWFUpload.prototype.addPostParam = function (name, value) {\n\tthis.settings.post_params[name] = value;\n\tthis.callFlash(\"SetPostParams\", [this.settings.post_params]);\n};\n\n// Public: removePostParam deletes post name/value pair.\nSWFUpload.prototype.removePostParam = function (name) {\n\tdelete this.settings.post_params[name];\n\tthis.callFlash(\"SetPostParams\", [this.settings.post_params]);\n};\n\n// Public: setFileTypes changes the file_types setting and the file_types_description setting\nSWFUpload.prototype.setFileTypes = function (types, description) {\n\tthis.settings.file_types = types;\n\tthis.settings.file_types_description = description;\n\tthis.callFlash(\"SetFileTypes\", [types, description]);\n};\n\n// Public: setFileSizeLimit changes the file_size_limit setting\nSWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) {\n\tthis.settings.file_size_limit = fileSizeLimit;\n\tthis.callFlash(\"SetFileSizeLimit\", [fileSizeLimit]);\n};\n\n// Public: setFileUploadLimit changes the file_upload_limit setting\nSWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) {\n\tthis.settings.file_upload_limit = fileUploadLimit;\n\tthis.callFlash(\"SetFileUploadLimit\", [fileUploadLimit]);\n};\n\n// Public: setFileQueueLimit changes the file_queue_limit setting\nSWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) {\n\tthis.settings.file_queue_limit = fileQueueLimit;\n\tthis.callFlash(\"SetFileQueueLimit\", [fileQueueLimit]);\n};\n\n// Public: setFilePostName changes the file_post_name setting\nSWFUpload.prototype.setFilePostName = function (filePostName) {\n\tthis.settings.file_post_name = filePostName;\n\tthis.callFlash(\"SetFilePostName\", [filePostName]);\n};\n\n// Public: setUseQueryString changes the use_query_string setting\nSWFUpload.prototype.setUseQueryString = function (useQueryString) {\n\tthis.settings.use_query_string = useQueryString;\n\tthis.callFlash(\"SetUseQueryString\", [useQueryString]);\n};\n\n// Public: setRequeueOnError changes the requeue_on_error setting\nSWFUpload.prototype.setRequeueOnError = function (requeueOnError) {\n\tthis.settings.requeue_on_error = requeueOnError;\n\tthis.callFlash(\"SetRequeueOnError\", [requeueOnError]);\n};\n\n// Public: setHTTPSuccess changes the http_success setting\nSWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {\n\tif (typeof http_status_codes === \"string\") {\n\t\thttp_status_codes = http_status_codes.replace(\" \", \"\").split(\",\");\n\t}\n\t\n\tthis.settings.http_success = http_status_codes;\n\tthis.callFlash(\"SetHTTPSuccess\", [http_status_codes]);\n};\n\n// Public: setHTTPSuccess changes the http_success setting\nSWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) {\n\tthis.settings.assume_success_timeout = timeout_seconds;\n\tthis.callFlash(\"SetAssumeSuccessTimeout\", [timeout_seconds]);\n};\n\n// Public: setDebugEnabled changes the debug_enabled setting\nSWFUpload.prototype.setDebugEnabled = function (debugEnabled) {\n\tthis.settings.debug_enabled = debugEnabled;\n\tthis.callFlash(\"SetDebugEnabled\", [debugEnabled]);\n};\n\n// Public: setButtonImageURL loads a button image sprite\nSWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {\n\tif (buttonImageURL == undefined) {\n\t\tbuttonImageURL = \"\";\n\t}\n\t\n\tthis.settings.button_image_url = buttonImageURL;\n\tthis.callFlash(\"SetButtonImageURL\", [buttonImageURL]);\n};\n\n// Public: setButtonDimensions resizes the Flash Movie and button\nSWFUpload.prototype.setButtonDimensions = function (width, height) {\n\tthis.settings.button_width = width;\n\tthis.settings.button_height = height;\n\t\n\tvar movie = this.getMovieElement();\n\tif (movie != undefined) {\n\t\tmovie.style.width = width + \"px\";\n\t\tmovie.style.height = height + \"px\";\n\t}\n\t\n\tthis.callFlash(\"SetButtonDimensions\", [width, height]);\n};\n// Public: setButtonText Changes the text overlaid on the button\nSWFUpload.prototype.setButtonText = function (html) {\n\tthis.settings.button_text = html;\n\tthis.callFlash(\"SetButtonText\", [html]);\n};\n// Public: setButtonTextPadding changes the top and left padding of the text overlay\nSWFUpload.prototype.setButtonTextPadding = function (left, top) {\n\tthis.settings.button_text_top_padding = top;\n\tthis.settings.button_text_left_padding = left;\n\tthis.callFlash(\"SetButtonTextPadding\", [left, top]);\n};\n\n// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button\nSWFUpload.prototype.setButtonTextStyle = function (css) {\n\tthis.settings.button_text_style = css;\n\tthis.callFlash(\"SetButtonTextStyle\", [css]);\n};\n// Public: setButtonDisabled disables/enables the button\nSWFUpload.prototype.setButtonDisabled = function (isDisabled) {\n\tthis.settings.button_disabled = isDisabled;\n\tthis.callFlash(\"SetButtonDisabled\", [isDisabled]);\n};\n// Public: setButtonAction sets the action that occurs when the button is clicked\nSWFUpload.prototype.setButtonAction = function (buttonAction) {\n\tthis.settings.button_action = buttonAction;\n\tthis.callFlash(\"SetButtonAction\", [buttonAction]);\n};\n\n// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button\nSWFUpload.prototype.setButtonCursor = function (cursor) {\n\tthis.settings.button_cursor = cursor;\n\tthis.callFlash(\"SetButtonCursor\", [cursor]);\n};\n\n/* *******************************\n\tFlash Event Interfaces\n\tThese functions are used by Flash to trigger the various\n\tevents.\n\t\n\tAll these functions a Private.\n\t\n\tBecause the ExternalInterface library is buggy the event calls\n\tare added to a queue and the queue then executed by a setTimeout.\n\tThis ensures that events are executed in a determinate order and that\n\tthe ExternalInterface bugs are avoided.\n******************************* */\n\nSWFUpload.prototype.queueEvent = function (handlerName, argumentArray) {\n\t// Warning: Don't call this.debug inside here or you'll create an infinite loop\n\t\n\tif (argumentArray == undefined) {\n\t\targumentArray = [];\n\t} else if (!(argumentArray instanceof Array)) {\n\t\targumentArray = [argumentArray];\n\t}\n\t\n\tvar self = this;\n\tif (typeof this.settings[handlerName] === \"function\") {\n\t\t// Queue the event\n\t\tthis.eventQueue.push(function () {\n\t\t\tthis.settings[handlerName].apply(this, argumentArray);\n\t\t});\n\t\t\n\t\t// Execute the next queued event\n\t\tsetTimeout(function () {\n\t\t\tself.executeNextEvent();\n\t\t}, 0);\n\t\t\n\t} else if (this.settings[handlerName] !== null) {\n\t\tthrow \"Event handler \" + handlerName + \" is unknown or is not a function\";\n\t}\n};\n\n// Private: Causes the next event in the queue to be executed.  Since events are queued using a setTimeout\n// we must queue them in order to garentee that they are executed in order.\nSWFUpload.prototype.executeNextEvent = function () {\n\t// Warning: Don't call this.debug inside here or you'll create an infinite loop\n\n\tvar  f = this.eventQueue ? this.eventQueue.shift() : null;\n\tif (typeof(f) === \"function\") {\n\t\tf.apply(this);\n\t}\n};\n\n// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have\n// properties that contain characters that are not valid for JavaScript identifiers. To work around this\n// the Flash Component escapes the parameter names and we must unescape again before passing them along.\nSWFUpload.prototype.unescapeFilePostParams = function (file) {\n\tvar reg = /[$]([0-9a-f]{4})/i;\n\tvar unescapedPost = {};\n\tvar uk;\n\n\tif (file != undefined) {\n\t\tfor (var k in file.post) {\n\t\t\tif (file.post.hasOwnProperty(k)) {\n\t\t\t\tuk = k;\n\t\t\t\tvar match;\n\t\t\t\twhile ((match = reg.exec(uk)) !== null) {\n\t\t\t\t\tuk = uk.replace(match[0], String.fromCharCode(parseInt(\"0x\" + match[1], 16)));\n\t\t\t\t}\n\t\t\t\tunescapedPost[uk] = file.post[k];\n\t\t\t}\n\t\t}\n\n\t\tfile.post = unescapedPost;\n\t}\n\n\treturn file;\n};\n\n// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working)\nSWFUpload.prototype.testExternalInterface = function () {\n\ttry {\n\t\treturn this.callFlash(\"TestExternalInterface\");\n\t} catch (ex) {\n\t\treturn false;\n\t}\n};\n\n// Private: This event is called by Flash when it has finished loading. Don't modify this.\n// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded.\nSWFUpload.prototype.flashReady = function () {\n\t// Check that the movie element is loaded correctly with its ExternalInterface methods defined\n\tvar movieElement = this.getMovieElement();\n\n\tif (!movieElement) {\n\t\tthis.debug(\"Flash called back ready but the flash movie can't be found.\");\n\t\treturn;\n\t}\n\n\tthis.cleanUp(movieElement);\n\t\n\tthis.queueEvent(\"swfupload_loaded_handler\");\n};\n\n// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE.\n// This function is called by Flash each time the ExternalInterface functions are created.\nSWFUpload.prototype.cleanUp = function (movieElement) {\n\t// Pro-actively unhook all the Flash functions\n\ttry {\n\t\tif (this.movieElement && typeof(movieElement.CallFunction) === \"unknown\") { // We only want to do this in IE\n\t\t\tthis.debug(\"Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)\");\n\t\t\tfor (var key in movieElement) {\n\t\t\t\ttry {\n\t\t\t\t\tif (typeof(movieElement[key]) === \"function\") {\n\t\t\t\t\t\tmovieElement[key] = null;\n\t\t\t\t\t}\n\t\t\t\t} catch (ex) {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (ex1) {\n\t\n\t}\n\n\t// Fix Flashes own cleanup code so if the SWFMovie was removed from the page\n\t// it doesn't display errors.\n\twindow[\"__flash__removeCallback\"] = function (instance, name) {\n\t\ttry {\n\t\t\tif (instance) {\n\t\t\t\tinstance[name] = null;\n\t\t\t}\n\t\t} catch (flashEx) {\n\t\t\n\t\t}\n\t};\n\n};\n\n\n/* This is a chance to do something before the browse window opens */\nSWFUpload.prototype.fileDialogStart = function () {\n\tthis.queueEvent(\"file_dialog_start_handler\");\n};\n\n\n/* Called when a file is successfully added to the queue. */\nSWFUpload.prototype.fileQueued = function (file) {\n\tfile = this.unescapeFilePostParams(file);\n\tthis.queueEvent(\"file_queued_handler\", file);\n};\n\n\n/* Handle errors that occur when an attempt to queue a file fails. */\nSWFUpload.prototype.fileQueueError = function (file, errorCode, message) {\n\tfile = this.unescapeFilePostParams(file);\n\tthis.queueEvent(\"file_queue_error_handler\", [file, errorCode, message]);\n};\n\n/* Called after the file dialog has closed and the selected files have been queued.\n\tYou could call startUpload here if you want the queued files to begin uploading immediately. */\nSWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) {\n\tthis.queueEvent(\"file_dialog_complete_handler\", [numFilesSelected, numFilesQueued, numFilesInQueue]);\n};\n\nSWFUpload.prototype.uploadStart = function (file) {\n\tfile = this.unescapeFilePostParams(file);\n\tthis.queueEvent(\"return_upload_start_handler\", file);\n};\n\nSWFUpload.prototype.returnUploadStart = function (file) {\n\tvar returnValue;\n\tif (typeof this.settings.upload_start_handler === \"function\") {\n\t\tfile = this.unescapeFilePostParams(file);\n\t\treturnValue = this.settings.upload_start_handler.call(this, file);\n\t} else if (this.settings.upload_start_handler != undefined) {\n\t\tthrow \"upload_start_handler must be a function\";\n\t}\n\n\t// Convert undefined to true so if nothing is returned from the upload_start_handler it is\n\t// interpretted as 'true'.\n\tif (returnValue === undefined) {\n\t\treturnValue = true;\n\t}\n\t\n\treturnValue = !!returnValue;\n\t\n\tthis.callFlash(\"ReturnUploadStart\", [returnValue]);\n};\n\n\n\nSWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) {\n\tfile = this.unescapeFilePostParams(file);\n\tthis.queueEvent(\"upload_progress_handler\", [file, bytesComplete, bytesTotal]);\n};\n\nSWFUpload.prototype.uploadError = function (file, errorCode, message) {\n\tfile = this.unescapeFilePostParams(file);\n\tthis.queueEvent(\"upload_error_handler\", [file, errorCode, message]);\n};\n\nSWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) {\n\tfile = this.unescapeFilePostParams(file);\n\tthis.queueEvent(\"upload_success_handler\", [file, serverData, responseReceived]);\n};\n\nSWFUpload.prototype.uploadComplete = function (file) {\n\tfile = this.unescapeFilePostParams(file);\n\tthis.queueEvent(\"upload_complete_handler\", file);\n};\n\n/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the\n   internal debug console.  You can override this event and have messages written where you want. */\nSWFUpload.prototype.debug = function (message) {\n\tthis.queueEvent(\"debug_handler\", message);\n};\n\n\n/* **********************************\n\tDebug Console\n\tThe debug console is a self contained, in page location\n\tfor debug message to be sent.  The Debug Console adds\n\titself to the body if necessary.\n\n\tThe console is automatically scrolled as messages appear.\n\t\n\tIf you are using your own debug handler or when you deploy to production and\n\thave debug disabled you can remove these functions to reduce the file size\n\tand complexity.\n********************************** */\n   \n// Private: debugMessage is the default debug_handler.  If you want to print debug messages\n// call the debug() function.  When overriding the function your own function should\n// check to see if the debug setting is true before outputting debug information.\nSWFUpload.prototype.debugMessage = function (message) {\n\tif (this.settings.debug) {\n\t\tvar exceptionMessage, exceptionValues = [];\n\n\t\t// Check for an exception object and print it nicely\n\t\tif (typeof message === \"object\" && typeof message.name === \"string\" && typeof message.message === \"string\") {\n\t\t\tfor (var key in message) {\n\t\t\t\tif (message.hasOwnProperty(key)) {\n\t\t\t\t\texceptionValues.push(key + \": \" + message[key]);\n\t\t\t\t}\n\t\t\t}\n\t\t\texceptionMessage = exceptionValues.join(\"\\n\") || \"\";\n\t\t\texceptionValues = exceptionMessage.split(\"\\n\");\n\t\t\texceptionMessage = \"EXCEPTION: \" + exceptionValues.join(\"\\nEXCEPTION: \");\n\t\t\tSWFUpload.Console.writeLine(exceptionMessage);\n\t\t} else {\n\t\t\tSWFUpload.Console.writeLine(message);\n\t\t}\n\t}\n};\n\nSWFUpload.Console = {};\nSWFUpload.Console.writeLine = function (message) {\n\tvar console, documentForm;\n\n\ttry {\n\t\tconsole = document.getElementById(\"SWFUpload_Console\");\n\n\t\tif (!console) {\n\t\t\tdocumentForm = document.createElement(\"form\");\n\t\t\tdocument.getElementsByTagName(\"body\")[0].appendChild(documentForm);\n\n\t\t\tconsole = document.createElement(\"textarea\");\n\t\t\tconsole.id = \"SWFUpload_Console\";\n\t\t\tconsole.style.fontFamily = \"monospace\";\n\t\t\tconsole.setAttribute(\"wrap\", \"off\");\n\t\t\tconsole.wrap = \"off\";\n\t\t\tconsole.style.overflow = \"auto\";\n\t\t\tconsole.style.width = \"700px\";\n\t\t\tconsole.style.height = \"350px\";\n\t\t\tconsole.style.margin = \"5px\";\n\t\t\tdocumentForm.appendChild(console);\n\t\t}\n\n\t\tconsole.value += message + \"\\n\";\n\n\t\tconsole.scrollTop = console.scrollHeight - console.clientHeight;\n\t} catch (ex) {\n\t\talert(\"Exception: \" + ex.name + \" Message: \" + ex.message);\n\t}\n};\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/thickbox/thickbox.css",
    "content": "#TB_overlay {\n\tbackground: #000;\n\topacity: 0.7;\n\tfilter: alpha(opacity=70);\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 100050; /* Above DFW. */\n}\n\n#TB_window {\n\tposition: fixed;\n\tbackground-color: #fff;\n\tz-index: 100050; /* Above DFW. */\n\tvisibility: hidden;\n\ttext-align: left;\n\ttop: 50%;\n\tleft: 50%;\n\t-webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n\tbox-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 );\n}\n\n#TB_window img#TB_Image {\n\tdisplay: block;\n\tmargin: 15px 0 0 15px;\n\tborder-right: 1px solid #ccc;\n\tborder-bottom: 1px solid #ccc;\n\tborder-top: 1px solid #666;\n\tborder-left: 1px solid #666;\n}\n\n#TB_caption{\n\theight: 25px;\n\tpadding: 7px 30px 10px 25px;\n\tfloat: left;\n}\n\n#TB_closeWindow {\n\theight: 25px;\n\tpadding: 11px 25px 10px 0;\n\tfloat: right;\n}\n\n#TB_closeAjaxWindow {\n\tfloat: right;\n}\n\n#TB_closeAjaxWindow a {\n\ttext-decoration: none;\n}\n\n#TB_ajaxWindowTitle {\n\tfloat: left;\n\tfont-weight: 600;\n\tline-height: 29px;\n\toverflow: hidden;\n\tpadding: 0 29px 0 10px;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\twidth: calc( 100% - 39px );\n}\n\n#TB_title {\n\tbackground: #fcfcfc;\n\tborder-bottom: 1px solid #dfdfdf;\n\theight: 29px;\n}\n\n#TB_ajaxContent {\n\tclear: both;\n\tpadding: 2px 15px 15px 15px;\n\toverflow: auto;\n\ttext-align: left;\n\tline-height: 1.4em;\n}\n\n#TB_ajaxContent.TB_modal {\n\tpadding: 15px;\n}\n\n#TB_ajaxContent p {\n\tpadding: 5px 0px 5px 0px;\n}\n\n#TB_load {\n\tposition: fixed;\n\tdisplay: none;\n\tz-index: 103;\n\ttop: 50%;\n\tleft: 50%;\n\tbackground-color: #E8E8E8;\n\tborder: 1px solid #555;\n\tmargin: -45px 0 0 -125px;\n\tpadding: 40px 15px 15px;\n}\n\n#TB_HideSelect {\n\tz-index: 99;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tbackground-color: #fff;\n\tborder: none;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\theight: 100%;\n\twidth: 100%;\n}\n\n#TB_iframeContent {\n\tclear: both;\n\tborder: none;\n}\n\n.tb-close-icon {\n\tcolor: #666;\n\ttext-align: center;\n\tline-height: 29px;\n\twidth: 29px;\n\theight: 29px;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n}\n\n.tb-close-icon:before {\n\tcontent: \"\\f158\";\n\tfont: normal 20px/29px dashicons;\n\tspeak: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.tb-close-icon:hover {\n\tcolor: #00a0d2;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/thickbox/thickbox.js",
    "content": "/*\n * Thickbox 3.1 - One Box To Rule Them All.\n * By Cody Lindley (http://www.codylindley.com)\n * Copyright (c) 2007 cody lindley\n * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php\n*/\n\nif ( typeof tb_pathToImage != 'string' ) {\n\tvar tb_pathToImage = thickboxL10n.loadingAnimation;\n}\n\n/*!!!!!!!!!!!!!!!!! edit below this line at your own risk !!!!!!!!!!!!!!!!!!!!!!!*/\n\n//on page load call tb_init\njQuery(document).ready(function(){\n\ttb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox\n\timgLoader = new Image();// preload image\n\timgLoader.src = tb_pathToImage;\n});\n\n/*\n * Add thickbox to href & area elements that have a class of .thickbox.\n * Remove the loading indicator when content in an iframe has loaded.\n */\nfunction tb_init(domChunk){\n\tjQuery( 'body' )\n\t\t.on( 'click', domChunk, tb_click )\n\t\t.on( 'thickbox:iframe:loaded', function() {\n\t\t\tjQuery( '#TB_window' ).removeClass( 'thickbox-loading' );\n\t\t});\n}\n\nfunction tb_click(){\n\tvar t = this.title || this.name || null;\n\tvar a = this.href || this.alt;\n\tvar g = this.rel || false;\n\ttb_show(t,a,g);\n\tthis.blur();\n\treturn false;\n}\n\nfunction tb_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link\n\n\ttry {\n\t\tif (typeof document.body.style.maxHeight === \"undefined\") {//if IE 6\n\t\t\tjQuery(\"body\",\"html\").css({height: \"100%\", width: \"100%\"});\n\t\t\tjQuery(\"html\").css(\"overflow\",\"hidden\");\n\t\t\tif (document.getElementById(\"TB_HideSelect\") === null) {//iframe to hide select elements in ie6\n\t\t\t\tjQuery(\"body\").append(\"<iframe id='TB_HideSelect'>\"+thickboxL10n.noiframes+\"</iframe><div id='TB_overlay'></div><div id='TB_window' class='thickbox-loading'></div>\");\n\t\t\t\tjQuery(\"#TB_overlay\").click(tb_remove);\n\t\t\t}\n\t\t}else{//all others\n\t\t\tif(document.getElementById(\"TB_overlay\") === null){\n\t\t\t\tjQuery(\"body\").append(\"<div id='TB_overlay'></div><div id='TB_window' class='thickbox-loading'></div>\");\n\t\t\t\tjQuery(\"#TB_overlay\").click(tb_remove);\n\t\t\t\tjQuery( 'body' ).addClass( 'modal-open' );\n\t\t\t}\n\t\t}\n\n\t\tif(tb_detectMacXFF()){\n\t\t\tjQuery(\"#TB_overlay\").addClass(\"TB_overlayMacFFBGHack\");//use png overlay so hide flash\n\t\t}else{\n\t\t\tjQuery(\"#TB_overlay\").addClass(\"TB_overlayBG\");//use background and opacity\n\t\t}\n\n\t\tif(caption===null){caption=\"\";}\n\t\tjQuery(\"body\").append(\"<div id='TB_load'><img src='\"+imgLoader.src+\"' width='208' /></div>\");//add loader to the page\n\t\tjQuery('#TB_load').show();//show loader\n\n\t\tvar baseURL;\n\t   if(url.indexOf(\"?\")!==-1){ //ff there is a query string involved\n\t\t\tbaseURL = url.substr(0, url.indexOf(\"?\"));\n\t   }else{\n\t   \t\tbaseURL = url;\n\t   }\n\n\t   var urlString = /\\.jpg$|\\.jpeg$|\\.png$|\\.gif$|\\.bmp$/;\n\t   var urlType = baseURL.toLowerCase().match(urlString);\n\n\t\tif(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp'){//code to show images\n\n\t\t\tTB_PrevCaption = \"\";\n\t\t\tTB_PrevURL = \"\";\n\t\t\tTB_PrevHTML = \"\";\n\t\t\tTB_NextCaption = \"\";\n\t\t\tTB_NextURL = \"\";\n\t\t\tTB_NextHTML = \"\";\n\t\t\tTB_imageCount = \"\";\n\t\t\tTB_FoundURL = false;\n\t\t\tif(imageGroup){\n\t\t\t\tTB_TempArray = jQuery(\"a[rel=\"+imageGroup+\"]\").get();\n\t\t\t\tfor (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML === \"\")); TB_Counter++) {\n\t\t\t\t\tvar urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString);\n\t\t\t\t\t\tif (!(TB_TempArray[TB_Counter].href == url)) {\n\t\t\t\t\t\t\tif (TB_FoundURL) {\n\t\t\t\t\t\t\t\tTB_NextCaption = TB_TempArray[TB_Counter].title;\n\t\t\t\t\t\t\t\tTB_NextURL = TB_TempArray[TB_Counter].href;\n\t\t\t\t\t\t\t\tTB_NextHTML = \"<span id='TB_next'>&nbsp;&nbsp;<a href='#'>\"+thickboxL10n.next+\"</a></span>\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tTB_PrevCaption = TB_TempArray[TB_Counter].title;\n\t\t\t\t\t\t\t\tTB_PrevURL = TB_TempArray[TB_Counter].href;\n\t\t\t\t\t\t\t\tTB_PrevHTML = \"<span id='TB_prev'>&nbsp;&nbsp;<a href='#'>\"+thickboxL10n.prev+\"</a></span>\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tTB_FoundURL = true;\n\t\t\t\t\t\t\tTB_imageCount = thickboxL10n.image + ' ' + (TB_Counter + 1) + ' ' + thickboxL10n.of + ' ' + (TB_TempArray.length);\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\timgPreloader = new Image();\n\t\t\timgPreloader.onload = function(){\n\t\t\timgPreloader.onload = null;\n\n\t\t\t// Resizing large images - original by Christian Montoya edited by me.\n\t\t\tvar pagesize = tb_getPageSize();\n\t\t\tvar x = pagesize[0] - 150;\n\t\t\tvar y = pagesize[1] - 150;\n\t\t\tvar imageWidth = imgPreloader.width;\n\t\t\tvar imageHeight = imgPreloader.height;\n\t\t\tif (imageWidth > x) {\n\t\t\t\timageHeight = imageHeight * (x / imageWidth);\n\t\t\t\timageWidth = x;\n\t\t\t\tif (imageHeight > y) {\n\t\t\t\t\timageWidth = imageWidth * (y / imageHeight);\n\t\t\t\t\timageHeight = y;\n\t\t\t\t}\n\t\t\t} else if (imageHeight > y) {\n\t\t\t\timageWidth = imageWidth * (y / imageHeight);\n\t\t\t\timageHeight = y;\n\t\t\t\tif (imageWidth > x) {\n\t\t\t\t\timageHeight = imageHeight * (x / imageWidth);\n\t\t\t\t\timageWidth = x;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// End Resizing\n\n\t\t\tTB_WIDTH = imageWidth + 30;\n\t\t\tTB_HEIGHT = imageHeight + 60;\n\t\t\tjQuery(\"#TB_window\").append(\"<a href='' id='TB_ImageOff'><span class='screen-reader-text'>\"+thickboxL10n.close+\"</span><img id='TB_Image' src='\"+url+\"' width='\"+imageWidth+\"' height='\"+imageHeight+\"' alt='\"+caption+\"'/></a>\" + \"<div id='TB_caption'>\"+caption+\"<div id='TB_secondLine'>\" + TB_imageCount + TB_PrevHTML + TB_NextHTML + \"</div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton'><span class='screen-reader-text'>\"+thickboxL10n.close+\"</span><div class='tb-close-icon'></div></a></div>\");\n\n\t\t\tjQuery(\"#TB_closeWindowButton\").click(tb_remove);\n\n\t\t\tif (!(TB_PrevHTML === \"\")) {\n\t\t\t\tfunction goPrev(){\n\t\t\t\t\tif(jQuery(document).unbind(\"click\",goPrev)){jQuery(document).unbind(\"click\",goPrev);}\n\t\t\t\t\tjQuery(\"#TB_window\").remove();\n\t\t\t\t\tjQuery(\"body\").append(\"<div id='TB_window'></div>\");\n\t\t\t\t\ttb_show(TB_PrevCaption, TB_PrevURL, imageGroup);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tjQuery(\"#TB_prev\").click(goPrev);\n\t\t\t}\n\n\t\t\tif (!(TB_NextHTML === \"\")) {\n\t\t\t\tfunction goNext(){\n\t\t\t\t\tjQuery(\"#TB_window\").remove();\n\t\t\t\t\tjQuery(\"body\").append(\"<div id='TB_window'></div>\");\n\t\t\t\t\ttb_show(TB_NextCaption, TB_NextURL, imageGroup);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tjQuery(\"#TB_next\").click(goNext);\n\n\t\t\t}\n\n\t\t\tjQuery(document).bind('keydown.thickbox', function(e){\n\t\t\t\tif ( e.which == 27 ){ // close\n\t\t\t\t\ttb_remove();\n\n\t\t\t\t} else if ( e.which == 190 ){ // display previous image\n\t\t\t\t\tif(!(TB_NextHTML == \"\")){\n\t\t\t\t\t\tjQuery(document).unbind('thickbox');\n\t\t\t\t\t\tgoNext();\n\t\t\t\t\t}\n\t\t\t\t} else if ( e.which == 188 ){ // display next image\n\t\t\t\t\tif(!(TB_PrevHTML == \"\")){\n\t\t\t\t\t\tjQuery(document).unbind('thickbox');\n\t\t\t\t\t\tgoPrev();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\ttb_position();\n\t\t\tjQuery(\"#TB_load\").remove();\n\t\t\tjQuery(\"#TB_ImageOff\").click(tb_remove);\n\t\t\tjQuery(\"#TB_window\").css({'visibility':'visible'}); //for safari using css instead of show\n\t\t\t};\n\n\t\t\timgPreloader.src = url;\n\t\t}else{//code to show html\n\n\t\t\tvar queryString = url.replace(/^[^\\?]+\\??/,'');\n\t\t\tvar params = tb_parseQuery( queryString );\n\n\t\t\tTB_WIDTH = (params['width']*1) + 30 || 630; //defaults to 630 if no parameters were added to URL\n\t\t\tTB_HEIGHT = (params['height']*1) + 40 || 440; //defaults to 440 if no parameters were added to URL\n\t\t\tajaxContentW = TB_WIDTH - 30;\n\t\t\tajaxContentH = TB_HEIGHT - 45;\n\n\t\t\tif(url.indexOf('TB_iframe') != -1){// either iframe or ajax window\n\t\t\t\t\turlNoQuery = url.split('TB_');\n\t\t\t\t\tjQuery(\"#TB_iframeContent\").remove();\n\t\t\t\t\tif(params['modal'] != \"true\"){//iframe no modal\n\t\t\t\t\t\tjQuery(\"#TB_window\").append(\"<div id='TB_title'><div id='TB_ajaxWindowTitle'>\"+caption+\"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'><span class='screen-reader-text'>\"+thickboxL10n.close+\"</span><div class='tb-close-icon'></div></a></div></div><iframe frameborder='0' hspace='0' allowTransparency='true' src='\"+urlNoQuery[0]+\"' id='TB_iframeContent' name='TB_iframeContent\"+Math.round(Math.random()*1000)+\"' onload='tb_showIframe()' style='width:\"+(ajaxContentW + 29)+\"px;height:\"+(ajaxContentH + 17)+\"px;' >\"+thickboxL10n.noiframes+\"</iframe>\");\n\t\t\t\t\t}else{//iframe modal\n\t\t\t\t\tjQuery(\"#TB_overlay\").unbind();\n\t\t\t\t\t\tjQuery(\"#TB_window\").append(\"<iframe frameborder='0' hspace='0' allowTransparency='true' src='\"+urlNoQuery[0]+\"' id='TB_iframeContent' name='TB_iframeContent\"+Math.round(Math.random()*1000)+\"' onload='tb_showIframe()' style='width:\"+(ajaxContentW + 29)+\"px;height:\"+(ajaxContentH + 17)+\"px;'>\"+thickboxL10n.noiframes+\"</iframe>\");\n\t\t\t\t\t}\n\t\t\t}else{// not an iframe, ajax\n\t\t\t\t\tif(jQuery(\"#TB_window\").css(\"visibility\") != \"visible\"){\n\t\t\t\t\t\tif(params['modal'] != \"true\"){//ajax no modal\n\t\t\t\t\t\tjQuery(\"#TB_window\").append(\"<div id='TB_title'><div id='TB_ajaxWindowTitle'>\"+caption+\"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'><div class='tb-close-icon'></div></a></div></div><div id='TB_ajaxContent' style='width:\"+ajaxContentW+\"px;height:\"+ajaxContentH+\"px'></div>\");\n\t\t\t\t\t\t}else{//ajax modal\n\t\t\t\t\t\tjQuery(\"#TB_overlay\").unbind();\n\t\t\t\t\t\tjQuery(\"#TB_window\").append(\"<div id='TB_ajaxContent' class='TB_modal' style='width:\"+ajaxContentW+\"px;height:\"+ajaxContentH+\"px;'></div>\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}else{//this means the window is already up, we are just loading new content via ajax\n\t\t\t\t\t\tjQuery(\"#TB_ajaxContent\")[0].style.width = ajaxContentW +\"px\";\n\t\t\t\t\t\tjQuery(\"#TB_ajaxContent\")[0].style.height = ajaxContentH +\"px\";\n\t\t\t\t\t\tjQuery(\"#TB_ajaxContent\")[0].scrollTop = 0;\n\t\t\t\t\t\tjQuery(\"#TB_ajaxWindowTitle\").html(caption);\n\t\t\t\t\t}\n\t\t\t}\n\n\t\t\tjQuery(\"#TB_closeWindowButton\").click(tb_remove);\n\n\t\t\t\tif(url.indexOf('TB_inline') != -1){\n\t\t\t\t\tjQuery(\"#TB_ajaxContent\").append(jQuery('#' + params['inlineId']).children());\n\t\t\t\t\tjQuery(\"#TB_window\").bind('tb_unload', function () {\n\t\t\t\t\t\tjQuery('#' + params['inlineId']).append( jQuery(\"#TB_ajaxContent\").children() ); // move elements back when you're finished\n\t\t\t\t\t});\n\t\t\t\t\ttb_position();\n\t\t\t\t\tjQuery(\"#TB_load\").remove();\n\t\t\t\t\tjQuery(\"#TB_window\").css({'visibility':'visible'});\n\t\t\t\t}else if(url.indexOf('TB_iframe') != -1){\n\t\t\t\t\ttb_position();\n\t\t\t\t\tjQuery(\"#TB_load\").remove();\n\t\t\t\t\tjQuery(\"#TB_window\").css({'visibility':'visible'});\n\t\t\t\t}else{\n\t\t\t\t\tvar load_url = url;\n\t\t\t\t\tload_url += -1 === url.indexOf('?') ? '?' : '&';\n\t\t\t\t\tjQuery(\"#TB_ajaxContent\").load(load_url += \"random=\" + (new Date().getTime()),function(){//to do a post change this load method\n\t\t\t\t\t\ttb_position();\n\t\t\t\t\t\tjQuery(\"#TB_load\").remove();\n\t\t\t\t\t\ttb_init(\"#TB_ajaxContent a.thickbox\");\n\t\t\t\t\t\tjQuery(\"#TB_window\").css({'visibility':'visible'});\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t}\n\n\t\tif(!params['modal']){\n\t\t\tjQuery(document).bind('keydown.thickbox', function(e){\n\t\t\t\tif ( e.which == 27 ){ // close\n\t\t\t\t\ttb_remove();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t} catch(e) {\n\t\t//nothing here\n\t}\n}\n\n//helper functions below\nfunction tb_showIframe(){\n\tjQuery(\"#TB_load\").remove();\n\tjQuery(\"#TB_window\").css({'visibility':'visible'}).trigger( 'thickbox:iframe:loaded' );\n}\n\nfunction tb_remove() {\n \tjQuery(\"#TB_imageOff\").unbind(\"click\");\n\tjQuery(\"#TB_closeWindowButton\").unbind(\"click\");\n\tjQuery(\"#TB_window\").fadeOut(\"fast\",function(){jQuery('#TB_window,#TB_overlay,#TB_HideSelect').trigger(\"tb_unload\").unbind().remove();});\n\tjQuery( 'body' ).removeClass( 'modal-open' );\n\tjQuery(\"#TB_load\").remove();\n\tif (typeof document.body.style.maxHeight == \"undefined\") {//if IE 6\n\t\tjQuery(\"body\",\"html\").css({height: \"auto\", width: \"auto\"});\n\t\tjQuery(\"html\").css(\"overflow\",\"\");\n\t}\n\tjQuery(document).unbind('.thickbox');\n\treturn false;\n}\n\nfunction tb_position() {\nvar isIE6 = typeof document.body.style.maxHeight === \"undefined\";\njQuery(\"#TB_window\").css({marginLeft: '-' + parseInt((TB_WIDTH / 2),10) + 'px', width: TB_WIDTH + 'px'});\n\tif ( ! isIE6 ) { // take away IE6\n\t\tjQuery(\"#TB_window\").css({marginTop: '-' + parseInt((TB_HEIGHT / 2),10) + 'px'});\n\t}\n}\n\nfunction tb_parseQuery ( query ) {\n   var Params = {};\n   if ( ! query ) {return Params;}// return empty object\n   var Pairs = query.split(/[;&]/);\n   for ( var i = 0; i < Pairs.length; i++ ) {\n      var KeyVal = Pairs[i].split('=');\n      if ( ! KeyVal || KeyVal.length != 2 ) {continue;}\n      var key = unescape( KeyVal[0] );\n      var val = unescape( KeyVal[1] );\n      val = val.replace(/\\+/g, ' ');\n      Params[key] = val;\n   }\n   return Params;\n}\n\nfunction tb_getPageSize(){\n\tvar de = document.documentElement;\n\tvar w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;\n\tvar h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;\n\tarrayPageSize = [w,h];\n\treturn arrayPageSize;\n}\n\nfunction tb_detectMacXFF() {\n  var userAgent = navigator.userAgent.toLowerCase();\n  if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox')!=-1) {\n    return true;\n  }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/langs/wp-langs-en.js",
    "content": "/**\n * TinyMCE 3.x language strings\n *\n * Loaded only when external plugins are added to TinyMCE.\n */\n( function() {\n\tvar main = {}, lang = 'en';\n\n\tif ( typeof tinyMCEPreInit !== 'undefined' && tinyMCEPreInit.ref.language !== 'en' ) {\n\t\tlang = tinyMCEPreInit.ref.language;\n\t}\n\n\tmain[lang] = {\n\t\tcommon: {\n\t\t\tedit_confirm: \"Do you want to use the WYSIWYG mode for this textarea?\",\n\t\t\tapply: \"Apply\",\n\t\t\tinsert: \"Insert\",\n\t\t\tupdate: \"Update\",\n\t\t\tcancel: \"Cancel\",\n\t\t\tclose: \"Close\",\n\t\t\tbrowse: \"Browse\",\n\t\t\tclass_name: \"Class\",\n\t\t\tnot_set: \"-- Not set --\",\n\t\t\tclipboard_msg: \"Copy/Cut/Paste is not available in Mozilla and Firefox.\",\n\t\t\tclipboard_no_support: \"Currently not supported by your browser, use keyboard shortcuts instead.\",\n\t\t\tpopup_blocked: \"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.\",\n\t\t\tinvalid_data: \"ERROR: Invalid values entered, these are marked in red.\",\n\t\t\tinvalid_data_number: \"{#field} must be a number\",\n\t\t\tinvalid_data_min: \"{#field} must be a number greater than {#min}\",\n\t\t\tinvalid_data_size: \"{#field} must be a number or percentage\",\n\t\t\tmore_colors: \"More colors\"\n\t\t},\n\t\tcolors: {\n\t\t\t\"000000\": \"Black\",\n\t\t\t\"993300\": \"Burnt orange\",\n\t\t\t\"333300\": \"Dark olive\",\n\t\t\t\"003300\": \"Dark green\",\n\t\t\t\"003366\": \"Dark azure\",\n\t\t\t\"000080\": \"Navy Blue\",\n\t\t\t\"333399\": \"Indigo\",\n\t\t\t\"333333\": \"Very dark gray\",\n\t\t\t\"800000\": \"Maroon\",\n\t\t\t\"FF6600\": \"Orange\",\n\t\t\t\"808000\": \"Olive\",\n\t\t\t\"008000\": \"Green\",\n\t\t\t\"008080\": \"Teal\",\n\t\t\t\"0000FF\": \"Blue\",\n\t\t\t\"666699\": \"Grayish blue\",\n\t\t\t\"808080\": \"Gray\",\n\t\t\t\"FF0000\": \"Red\",\n\t\t\t\"FF9900\": \"Amber\",\n\t\t\t\"99CC00\": \"Yellow green\",\n\t\t\t\"339966\": \"Sea green\",\n\t\t\t\"33CCCC\": \"Turquoise\",\n\t\t\t\"3366FF\": \"Royal blue\",\n\t\t\t\"800080\": \"Purple\",\n\t\t\t\"999999\": \"Medium gray\",\n\t\t\t\"FF00FF\": \"Magenta\",\n\t\t\t\"FFCC00\": \"Gold\",\n\t\t\t\"FFFF00\": \"Yellow\",\n\t\t\t\"00FF00\": \"Lime\",\n\t\t\t\"00FFFF\": \"Aqua\",\n\t\t\t\"00CCFF\": \"Sky blue\",\n\t\t\t\"993366\": \"Brown\",\n\t\t\t\"C0C0C0\": \"Silver\",\n\t\t\t\"FF99CC\": \"Pink\",\n\t\t\t\"FFCC99\": \"Peach\",\n\t\t\t\"FFFF99\": \"Light yellow\",\n\t\t\t\"CCFFCC\": \"Pale green\",\n\t\t\t\"CCFFFF\": \"Pale cyan\",\n\t\t\t\"99CCFF\": \"Light sky blue\",\n\t\t\t\"CC99FF\": \"Plum\",\n\t\t\t\"FFFFFF\": \"White\"\n\t\t},\n\t\tcontextmenu: {\n\t\t\talign: \"Alignment\",\n\t\t\tleft: \"Left\",\n\t\t\tcenter: \"Center\",\n\t\t\tright: \"Right\",\n\t\t\tfull: \"Full\"\n\t\t},\n\t\tinsertdatetime: {\n\t\t\tdate_fmt: \"%Y-%m-%d\",\n\t\t\ttime_fmt: \"%H:%M:%S\",\n\t\t\tinsertdate_desc: \"Insert date\",\n\t\t\tinserttime_desc: \"Insert time\",\n\t\t\tmonths_long: \"January,February,March,April,May,June,July,August,September,October,November,December\",\n\t\t\tmonths_short: \"Jan_January_abbreviation,Feb_February_abbreviation,Mar_March_abbreviation,Apr_April_abbreviation,May_May_abbreviation,Jun_June_abbreviation,Jul_July_abbreviation,Aug_August_abbreviation,Sep_September_abbreviation,Oct_October_abbreviation,Nov_November_abbreviation,Dec_December_abbreviation\",\n\t\t\tday_long: \"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday\",\n\t\t\tday_short: \"Sun,Mon,Tue,Wed,Thu,Fri,Sat\"\n\t\t},\n\t\tprint: {\n\t\t\tprint_desc: \"Print\"\n\t\t},\n\t\tpreview: {\n\t\t\tpreview_desc: \"Preview\"\n\t\t},\n\t\tdirectionality: {\n\t\t\tltr_desc: \"Direction left to right\",\n\t\t\trtl_desc: \"Direction right to left\"\n\t\t},\n\t\tlayer: {\n\t\t\tinsertlayer_desc: \"Insert new layer\",\n\t\t\tforward_desc: \"Move forward\",\n\t\t\tbackward_desc: \"Move backward\",\n\t\t\tabsolute_desc: \"Toggle absolute positioning\",\n\t\t\tcontent: \"New layer...\"\n\t\t},\n\t\tsave: {\n\t\t\tsave_desc: \"Save\",\n\t\t\tcancel_desc: \"Cancel all changes\"\n\t\t},\n\t\tnonbreaking: {\n\t\t\tnonbreaking_desc: \"Insert non-breaking space character\"\n\t\t},\n\t\tiespell: {\n\t\t\tiespell_desc: \"Run spell checking\",\n\t\t\tdownload: \"ieSpell not detected. Do you want to install it now?\"\n\t\t},\n\t\tadvhr: {\n\t\t\tadvhr_desc: \"Horizontal rule\"\n\t\t},\n\t\temotions: {\n\t\t\temotions_desc: \"Emotions\"\n\t\t},\n\t\tsearchreplace: {\n\t\t\tsearch_desc: \"Find\",\n\t\t\treplace_desc: \"Find/Replace\"\n\t\t},\n\t\tadvimage: {\n\t\t\timage_desc: \"Insert/edit image\"\n\t\t},\n\t\tadvlink: {\n\t\t\tlink_desc: \"Insert/edit link\"\n\t\t},\n\t\txhtmlxtras: {\n\t\t\tcite_desc: \"Citation\",\n\t\t\tabbr_desc: \"Abbreviation\",\n\t\t\tacronym_desc: \"Acronym\",\n\t\t\tdel_desc: \"Deletion\",\n\t\t\tins_desc: \"Insertion\",\n\t\t\tattribs_desc: \"Insert/Edit Attributes\"\n\t\t},\n\t\tstyle: {\n\t\t\tdesc: \"Edit CSS Style\"\n\t\t},\n\t\tpaste: {\n\t\t\tpaste_text_desc: \"Paste as Plain Text\",\n\t\t\tpaste_word_desc: \"Paste from Word\",\n\t\t\tselectall_desc: \"Select All\",\n\t\t\tplaintext_mode_sticky: \"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.\",\n\t\t\tplaintext_mode: \"Paste is now in plain text mode. Click again to toggle back to regular paste mode.\"\n\t\t},\n\t\tpaste_dlg: {\n\t\t\ttext_title: \"Use CTRL + V on your keyboard to paste the text into the window.\",\n\t\t\ttext_linebreaks: \"Keep linebreaks\",\n\t\t\tword_title: \"Use CTRL + V on your keyboard to paste the text into the window.\"\n\t\t},\n\t\ttable: {\n\t\t\tdesc: \"Inserts a new table\",\n\t\t\trow_before_desc: \"Insert row before\",\n\t\t\trow_after_desc: \"Insert row after\",\n\t\t\tdelete_row_desc: \"Delete row\",\n\t\t\tcol_before_desc: \"Insert column before\",\n\t\t\tcol_after_desc: \"Insert column after\",\n\t\t\tdelete_col_desc: \"Remove column\",\n\t\t\tsplit_cells_desc: \"Split merged table cells\",\n\t\t\tmerge_cells_desc: \"Merge table cells\",\n\t\t\trow_desc: \"Table row properties\",\n\t\t\tcell_desc: \"Table cell properties\",\n\t\t\tprops_desc: \"Table properties\",\n\t\t\tpaste_row_before_desc: \"Paste table row before\",\n\t\t\tpaste_row_after_desc: \"Paste table row after\",\n\t\t\tcut_row_desc: \"Cut table row\",\n\t\t\tcopy_row_desc: \"Copy table row\",\n\t\t\tdel: \"Delete table\",\n\t\t\trow: \"Row\",\n\t\t\tcol: \"Column\",\n\t\t\tcell: \"Cell\"\n\t\t},\n\t\tautosave: {\n\t\t\tunload_msg: \"The changes you made will be lost if you navigate away from this page.\"\n\t\t},\n\t\tfullscreen: {\n\t\t\tdesc: \"Toggle fullscreen mode (Alt + Shift + G)\"\n\t\t},\n\t\tmedia: {\n\t\t\tdesc: \"Insert / edit embedded media\",\n\t\t\tedit: \"Edit embedded media\"\n\t\t},\n\t\tfullpage: {\n\t\t\tdesc: \"Document properties\"\n\t\t},\n\t\ttemplate: {\n\t\t\tdesc: \"Insert predefined template content\"\n\t\t},\n\t\tvisualchars: {\n\t\t\tdesc: \"Visual control characters on/off.\"\n\t\t},\n\t\tspellchecker: {\n\t\t\tdesc: \"Toggle spellchecker (Alt + Shift + N)\",\n\t\t\tmenu: \"Spellchecker settings\",\n\t\t\tignore_word: \"Ignore word\",\n\t\t\tignore_words: \"Ignore all\",\n\t\t\tlangs: \"Languages\",\n\t\t\twait: \"Please wait...\",\n\t\t\tsug: \"Suggestions\",\n\t\t\tno_sug: \"No suggestions\",\n\t\t\tno_mpell: \"No misspellings found.\",\n\t\t\tlearn_word: \"Learn word\"\n\t\t},\n\t\tpagebreak: {\n\t\t\tdesc: \"Insert Page Break\"\n\t\t},\n\t\tadvlist:{\n\t\t\ttypes: \"Types\",\n\t\t\tdef: \"Default\",\n\t\t\tlower_alpha: \"Lower alpha\",\n\t\t\tlower_greek: \"Lower greek\",\n\t\t\tlower_roman: \"Lower roman\",\n\t\t\tupper_alpha: \"Upper alpha\",\n\t\t\tupper_roman: \"Upper roman\",\n\t\t\tcircle: \"Circle\",\n\t\t\tdisc: \"Disc\",\n\t\t\tsquare: \"Square\"\n\t\t},\n\t\taria: {\n\t\t\trich_text_area: \"Rich Text Area\"\n\t\t},\n\t\twordcount:{\n\t\t\twords: \"Words: \"\n\t\t}\n\t};\n\n\ttinyMCE.addI18n( main );\n\n\ttinyMCE.addI18n( lang + \".advanced\", {\n\t\tstyle_select: \"Styles\",\n\t\tfont_size: \"Font size\",\n\t\tfontdefault: \"Font family\",\n\t\tblock: \"Format\",\n\t\tparagraph: \"Paragraph\",\n\t\tdiv: \"Div\",\n\t\taddress: \"Address\",\n\t\tpre: \"Preformatted\",\n\t\th1: \"Heading 1\",\n\t\th2: \"Heading 2\",\n\t\th3: \"Heading 3\",\n\t\th4: \"Heading 4\",\n\t\th5: \"Heading 5\",\n\t\th6: \"Heading 6\",\n\t\tblockquote: \"Blockquote\",\n\t\tcode: \"Code\",\n\t\tsamp: \"Code sample\",\n\t\tdt: \"Definition term \",\n\t\tdd: \"Definition description\",\n\t\tbold_desc: \"Bold (Ctrl + B)\",\n\t\titalic_desc: \"Italic (Ctrl + I)\",\n\t\tunderline_desc: \"Underline\",\n\t\tstriketrough_desc: \"Strikethrough (Alt + Shift + D)\",\n\t\tjustifyleft_desc: \"Align Left (Alt + Shift + L)\",\n\t\tjustifycenter_desc: \"Align Center (Alt + Shift + C)\",\n\t\tjustifyright_desc: \"Align Right (Alt + Shift + R)\",\n\t\tjustifyfull_desc: \"Align Full (Alt + Shift + J)\",\n\t\tbullist_desc: \"Unordered list (Alt + Shift + U)\",\n\t\tnumlist_desc: \"Ordered list (Alt + Shift + O)\",\n\t\toutdent_desc: \"Outdent\",\n\t\tindent_desc: \"Indent\",\n\t\tundo_desc: \"Undo (Ctrl + Z)\",\n\t\tredo_desc: \"Redo (Ctrl + Y)\",\n\t\tlink_desc: \"Insert/edit link (Alt + Shift + A)\",\n\t\tunlink_desc: \"Unlink (Alt + Shift + S)\",\n\t\timage_desc: \"Insert/edit image (Alt + Shift + M)\",\n\t\tcleanup_desc: \"Cleanup messy code\",\n\t\tcode_desc: \"Edit HTML Source\",\n\t\tsub_desc: \"Subscript\",\n\t\tsup_desc: \"Superscript\",\n\t\thr_desc: \"Insert horizontal ruler\",\n\t\tremoveformat_desc: \"Remove formatting\",\n\t\tforecolor_desc: \"Select text color\",\n\t\tbackcolor_desc: \"Select background color\",\n\t\tcharmap_desc: \"Insert custom character\",\n\t\tvisualaid_desc: \"Toggle guidelines/invisible elements\",\n\t\tanchor_desc: \"Insert/edit anchor\",\n\t\tcut_desc: \"Cut\",\n\t\tcopy_desc: \"Copy\",\n\t\tpaste_desc: \"Paste\",\n\t\timage_props_desc: \"Image properties\",\n\t\tnewdocument_desc: \"New document\",\n\t\thelp_desc: \"Help\",\n\t\tblockquote_desc: \"Blockquote (Alt + Shift + Q)\",\n\t\tclipboard_msg: \"Copy/Cut/Paste is not available in Mozilla and Firefox.\",\n\t\tpath: \"Path\",\n\t\tnewdocument: \"Are you sure you want to clear all contents?\",\n\t\ttoolbar_focus: \"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X\",\n\t\tmore_colors: \"More colors\",\n\t\tshortcuts_desc: \"Accessibility Help\",\n\t\thelp_shortcut: \" Press ALT F10 for toolbar. Press ALT 0 for help.\",\n\t\trich_text_area: \"Rich Text Area\",\n\t\ttoolbar: \"Toolbar\"\n\t});\n\n\ttinyMCE.addI18n( lang + \".advanced_dlg\", {\n\t\tabout_title: \"About TinyMCE\",\n\t\tabout_general: \"About\",\n\t\tabout_help: \"Help\",\n\t\tabout_license: \"License\",\n\t\tabout_plugins: \"Plugins\",\n\t\tabout_plugin: \"Plugin\",\n\t\tabout_author: \"Author\",\n\t\tabout_version: \"Version\",\n\t\tabout_loaded: \"Loaded plugins\",\n\t\tanchor_title: \"Insert/edit anchor\",\n\t\tanchor_name: \"Anchor name\",\n\t\tcode_title: \"HTML Source Editor\",\n\t\tcode_wordwrap: \"Word wrap\",\n\t\tcolorpicker_title: \"Select a color\",\n\t\tcolorpicker_picker_tab: \"Picker\",\n\t\tcolorpicker_picker_title: \"Color picker\",\n\t\tcolorpicker_palette_tab: \"Palette\",\n\t\tcolorpicker_palette_title: \"Palette colors\",\n\t\tcolorpicker_named_tab: \"Named\",\n\t\tcolorpicker_named_title: \"Named colors\",\n\t\tcolorpicker_color: \"Color: \",\n\t\tcolorpicker_name: \"Name: \",\n\t\tcharmap_title: \"Select custom character\",\n\t\tcharmap_usage: \"Use left and right arrows to navigate.\",\n\t\timage_title: \"Insert/edit image\",\n\t\timage_src: \"Image URL\",\n\t\timage_alt: \"Image description\",\n\t\timage_list: \"Image list\",\n\t\timage_border: \"Border\",\n\t\timage_dimensions: \"Dimensions\",\n\t\timage_vspace: \"Vertical space\",\n\t\timage_hspace: \"Horizontal space\",\n\t\timage_align: \"Alignment\",\n\t\timage_align_baseline: \"Baseline\",\n\t\timage_align_top: \"Top\",\n\t\timage_align_middle: \"Middle\",\n\t\timage_align_bottom: \"Bottom\",\n\t\timage_align_texttop: \"Text top\",\n\t\timage_align_textbottom: \"Text bottom\",\n\t\timage_align_left: \"Left\",\n\t\timage_align_right: \"Right\",\n\t\tlink_title: \"Insert/edit link\",\n\t\tlink_url: \"Link URL\",\n\t\tlink_target: \"Target\",\n\t\tlink_target_same: \"Open link in the same window\",\n\t\tlink_target_blank: \"Open link in a new window\",\n\t\tlink_titlefield: \"Title\",\n\t\tlink_is_email: \"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?\",\n\t\tlink_is_external: \"The URL you entered seems to be an external link, do you want to add the required http:// prefix?\",\n\t\tlink_list: \"Link list\",\n\t\taccessibility_help: \"Accessibility Help\",\n\t\taccessibility_usage_title: \"General Usage\"\n\t});\n\n\ttinyMCE.addI18n( lang + \".media_dlg\", {\n\t\ttitle: \"Insert / edit embedded media\",\n\t\tgeneral: \"General\",\n\t\tadvanced: \"Advanced\",\n\t\tfile: \"File/URL\",\n\t\tlist: \"List\",\n\t\tsize: \"Dimensions\",\n\t\tpreview: \"Preview\",\n\t\tconstrain_proportions: \"Constrain proportions\",\n\t\ttype: \"Type\",\n\t\tid: \"Id\",\n\t\tname: \"Name\",\n\t\tclass_name: \"Class\",\n\t\tvspace: \"V-Space\",\n\t\thspace: \"H-Space\",\n\t\tplay: \"Auto play\",\n\t\tloop: \"Loop\",\n\t\tmenu: \"Show menu\",\n\t\tquality: \"Quality\",\n\t\tscale: \"Scale\",\n\t\talign: \"Align\",\n\t\tsalign: \"SAlign\",\n\t\twmode: \"WMode\",\n\t\tbgcolor: \"Background\",\n\t\tbase: \"Base\",\n\t\tflashvars: \"Flashvars\",\n\t\tliveconnect: \"SWLiveConnect\",\n\t\tautohref: \"AutoHREF\",\n\t\tcache: \"Cache\",\n\t\thidden: \"Hidden\",\n\t\tcontroller: \"Controller\",\n\t\tkioskmode: \"Kiosk mode\",\n\t\tplayeveryframe: \"Play every frame\",\n\t\ttargetcache: \"Target cache\",\n\t\tcorrection: \"No correction\",\n\t\tenablejavascript: \"Enable JavaScript\",\n\t\tstarttime: \"Start time\",\n\t\tendtime: \"End time\",\n\t\thref: \"href\",\n\t\tqtsrcchokespeed: \"Choke speed\",\n\t\ttarget: \"Target\",\n\t\tvolume: \"Volume\",\n\t\tautostart: \"Auto start\",\n\t\tenabled: \"Enabled\",\n\t\tfullscreen: \"Fullscreen\",\n\t\tinvokeurls: \"Invoke URLs\",\n\t\tmute: \"Mute\",\n\t\tstretchtofit: \"Stretch to fit\",\n\t\twindowlessvideo: \"Windowless video\",\n\t\tbalance: \"Balance\",\n\t\tbaseurl: \"Base URL\",\n\t\tcaptioningid: \"Captioning id\",\n\t\tcurrentmarker: \"Current marker\",\n\t\tcurrentposition: \"Current position\",\n\t\tdefaultframe: \"Default frame\",\n\t\tplaycount: \"Play count\",\n\t\trate: \"Rate\",\n\t\tuimode: \"UI Mode\",\n\t\tflash_options: \"Flash options\",\n\t\tqt_options: \"QuickTime options\",\n\t\twmp_options: \"Windows media player options\",\n\t\trmp_options: \"Real media player options\",\n\t\tshockwave_options: \"Shockwave options\",\n\t\tautogotourl: \"Auto goto URL\",\n\t\tcenter: \"Center\",\n\t\timagestatus: \"Image status\",\n\t\tmaintainaspect: \"Maintain aspect\",\n\t\tnojava: \"No java\",\n\t\tprefetch: \"Prefetch\",\n\t\tshuffle: \"Shuffle\",\n\t\tconsole: \"Console\",\n\t\tnumloop: \"Num loops\",\n\t\tcontrols: \"Controls\",\n\t\tscriptcallbacks: \"Script callbacks\",\n\t\tswstretchstyle: \"Stretch style\",\n\t\tswstretchhalign: \"Stretch H-Align\",\n\t\tswstretchvalign: \"Stretch V-Align\",\n\t\tsound: \"Sound\",\n\t\tprogress: \"Progress\",\n\t\tqtsrc: \"QT Src\",\n\t\tqt_stream_warn: \"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\",\n\t\talign_top: \"Top\",\n\t\talign_right: \"Right\",\n\t\talign_bottom: \"Bottom\",\n\t\talign_left: \"Left\",\n\t\talign_center: \"Center\",\n\t\talign_top_left: \"Top left\",\n\t\talign_top_right: \"Top right\",\n\t\talign_bottom_left: \"Bottom left\",\n\t\talign_bottom_right: \"Bottom right\",\n\t\tflv_options: \"Flash video options\",\n\t\tflv_scalemode: \"Scale mode\",\n\t\tflv_buffer: \"Buffer\",\n\t\tflv_startimage: \"Start image\",\n\t\tflv_starttime: \"Start time\",\n\t\tflv_defaultvolume: \"Default volume\",\n\t\tflv_hiddengui: \"Hidden GUI\",\n\t\tflv_autostart: \"Auto start\",\n\t\tflv_loop: \"Loop\",\n\t\tflv_showscalemodes: \"Show scale modes\",\n\t\tflv_smoothvideo: \"Smooth video\",\n\t\tflv_jscallback: \"JS Callback\",\n\t\thtml5_video_options: \"HTML5 Video Options\",\n\t\taltsource1: \"Alternative source 1\",\n\t\taltsource2: \"Alternative source 2\",\n\t\tpreload: \"Preload\",\n\t\tposter: \"Poster\",\n\t\tsource: \"Source\"\n\t});\n\n\ttinyMCE.addI18n( lang + \".wordpress\", {\n\t\twp_adv_desc: \"Show/Hide Kitchen Sink (Alt + Shift + Z)\",\n\t\twp_more_desc: \"Insert More Tag (Alt + Shift + T)\",\n\t\twp_page_desc: \"Insert Page break (Alt + Shift + P)\",\n\t\twp_help_desc: \"Help (Alt + Shift + H)\",\n\t\twp_more_alt: \"More...\",\n\t\twp_page_alt: \"Next page...\",\n\t\tadd_media: \"Add Media\",\n\t\tadd_image: \"Add an Image\",\n\t\tadd_video: \"Add Video\",\n\t\tadd_audio: \"Add Audio\",\n\t\teditgallery: \"Edit Gallery\",\n\t\tdelgallery: \"Delete Gallery\",\n\t\twp_fullscreen_desc: \"Distraction-free writing mode (Alt + Shift + W)\"\n\t});\n\n\ttinyMCE.addI18n( lang + \".wpeditimage\", {\n\t\tedit_img: \"Edit Image\",\n\t\tdel_img: \"Delete Image\",\n\t\tadv_settings: \"Advanced Settings\",\n\t\tnone: \"None\",\n\t\tsize: \"Size\",\n\t\tthumbnail: \"Thumbnail\",\n\t\tmedium: \"Medium\",\n\t\tfull_size: \"Full Size\",\n\t\tcurrent_link: \"Current Link\",\n\t\tlink_to_img: \"Link to Image\",\n\t\tlink_help: \"Enter a link URL or click above for presets.\",\n\t\tadv_img_settings: \"Advanced Image Settings\",\n\t\tsource: \"Source\",\n\t\twidth: \"Width\",\n\t\theight: \"Height\",\n\t\torig_size: \"Original Size\",\n\t\tcss: \"CSS Class\",\n\t\tadv_link_settings: \"Advanced Link Settings\",\n\t\tlink_rel: \"Link Rel\",\n\t\theight: \"Height\",\n\t\torig_size: \"Original Size\",\n\t\tcss: \"CSS Class\",\n\t\ts60: \"60%\",\n\t\ts70: \"70%\",\n\t\ts80: \"80%\",\n\t\ts90: \"90%\",\n\t\ts100: \"100%\",\n\t\ts110: \"110%\",\n\t\ts120: \"120%\",\n\t\ts130: \"130%\",\n\t\timg_title: \"Title\",\n\t\tcaption: \"Caption\",\n\t\talt: \"Alternative Text\"\n\t});\n}());\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/license.txt",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/charmap/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.PluginManager.add('charmap', function(editor) {\n\tvar charmap = [\n\t\t['160', 'no-break space'],\n\t\t['173', 'soft hyphen'],\n\t\t['34', 'quotation mark'],\n\t// finance\n\t\t['162', 'cent sign'],\n\t\t['8364', 'euro sign'],\n\t\t['163', 'pound sign'],\n\t\t['165', 'yen sign'],\n\t// signs\n\t\t['169', 'copyright sign'],\n\t\t['174', 'registered sign'],\n\t\t['8482', 'trade mark sign'],\n\t\t['8240', 'per mille sign'],\n\t\t['181', 'micro sign'],\n\t\t['183', 'middle dot'],\n\t\t['8226', 'bullet'],\n\t\t['8230', 'three dot leader'],\n\t\t['8242', 'minutes / feet'],\n\t\t['8243', 'seconds / inches'],\n\t\t['167', 'section sign'],\n\t\t['182', 'paragraph sign'],\n\t\t['223', 'sharp s / ess-zed'],\n\t// quotations\n\t\t['8249', 'single left-pointing angle quotation mark'],\n\t\t['8250', 'single right-pointing angle quotation mark'],\n\t\t['171', 'left pointing guillemet'],\n\t\t['187', 'right pointing guillemet'],\n\t\t['8216', 'left single quotation mark'],\n\t\t['8217', 'right single quotation mark'],\n\t\t['8220', 'left double quotation mark'],\n\t\t['8221', 'right double quotation mark'],\n\t\t['8218', 'single low-9 quotation mark'],\n\t\t['8222', 'double low-9 quotation mark'],\n\t\t['60', 'less-than sign'],\n\t\t['62', 'greater-than sign'],\n\t\t['8804', 'less-than or equal to'],\n\t\t['8805', 'greater-than or equal to'],\n\t\t['8211', 'en dash'],\n\t\t['8212', 'em dash'],\n\t\t['175', 'macron'],\n\t\t['8254', 'overline'],\n\t\t['164', 'currency sign'],\n\t\t['166', 'broken bar'],\n\t\t['168', 'diaeresis'],\n\t\t['161', 'inverted exclamation mark'],\n\t\t['191', 'turned question mark'],\n\t\t['710', 'circumflex accent'],\n\t\t['732', 'small tilde'],\n\t\t['176', 'degree sign'],\n\t\t['8722', 'minus sign'],\n\t\t['177', 'plus-minus sign'],\n\t\t['247', 'division sign'],\n\t\t['8260', 'fraction slash'],\n\t\t['215', 'multiplication sign'],\n\t\t['185', 'superscript one'],\n\t\t['178', 'superscript two'],\n\t\t['179', 'superscript three'],\n\t\t['188', 'fraction one quarter'],\n\t\t['189', 'fraction one half'],\n\t\t['190', 'fraction three quarters'],\n\t// math / logical\n\t\t['402', 'function / florin'],\n\t\t['8747', 'integral'],\n\t\t['8721', 'n-ary sumation'],\n\t\t['8734', 'infinity'],\n\t\t['8730', 'square root'],\n\t\t['8764', 'similar to'],\n\t\t['8773', 'approximately equal to'],\n\t\t['8776', 'almost equal to'],\n\t\t['8800', 'not equal to'],\n\t\t['8801', 'identical to'],\n\t\t['8712', 'element of'],\n\t\t['8713', 'not an element of'],\n\t\t['8715', 'contains as member'],\n\t\t['8719', 'n-ary product'],\n\t\t['8743', 'logical and'],\n\t\t['8744', 'logical or'],\n\t\t['172', 'not sign'],\n\t\t['8745', 'intersection'],\n\t\t['8746', 'union'],\n\t\t['8706', 'partial differential'],\n\t\t['8704', 'for all'],\n\t\t['8707', 'there exists'],\n\t\t['8709', 'diameter'],\n\t\t['8711', 'backward difference'],\n\t\t['8727', 'asterisk operator'],\n\t\t['8733', 'proportional to'],\n\t\t['8736', 'angle'],\n\t// undefined\n\t\t['180', 'acute accent'],\n\t\t['184', 'cedilla'],\n\t\t['170', 'feminine ordinal indicator'],\n\t\t['186', 'masculine ordinal indicator'],\n\t\t['8224', 'dagger'],\n\t\t['8225', 'double dagger'],\n\t// alphabetical special chars\n\t\t['192', 'A - grave'],\n\t\t['193', 'A - acute'],\n\t\t['194', 'A - circumflex'],\n\t\t['195', 'A - tilde'],\n\t\t['196', 'A - diaeresis'],\n\t\t['197', 'A - ring above'],\n\t\t['198', 'ligature AE'],\n\t\t['199', 'C - cedilla'],\n\t\t['200', 'E - grave'],\n\t\t['201', 'E - acute'],\n\t\t['202', 'E - circumflex'],\n\t\t['203', 'E - diaeresis'],\n\t\t['204', 'I - grave'],\n\t\t['205', 'I - acute'],\n\t\t['206', 'I - circumflex'],\n\t\t['207', 'I - diaeresis'],\n\t\t['208', 'ETH'],\n\t\t['209', 'N - tilde'],\n\t\t['210', 'O - grave'],\n\t\t['211', 'O - acute'],\n\t\t['212', 'O - circumflex'],\n\t\t['213', 'O - tilde'],\n\t\t['214', 'O - diaeresis'],\n\t\t['216', 'O - slash'],\n\t\t['338', 'ligature OE'],\n\t\t['352', 'S - caron'],\n\t\t['217', 'U - grave'],\n\t\t['218', 'U - acute'],\n\t\t['219', 'U - circumflex'],\n\t\t['220', 'U - diaeresis'],\n\t\t['221', 'Y - acute'],\n\t\t['376', 'Y - diaeresis'],\n\t\t['222', 'THORN'],\n\t\t['224', 'a - grave'],\n\t\t['225', 'a - acute'],\n\t\t['226', 'a - circumflex'],\n\t\t['227', 'a - tilde'],\n\t\t['228', 'a - diaeresis'],\n\t\t['229', 'a - ring above'],\n\t\t['230', 'ligature ae'],\n\t\t['231', 'c - cedilla'],\n\t\t['232', 'e - grave'],\n\t\t['233', 'e - acute'],\n\t\t['234', 'e - circumflex'],\n\t\t['235', 'e - diaeresis'],\n\t\t['236', 'i - grave'],\n\t\t['237', 'i - acute'],\n\t\t['238', 'i - circumflex'],\n\t\t['239', 'i - diaeresis'],\n\t\t['240', 'eth'],\n\t\t['241', 'n - tilde'],\n\t\t['242', 'o - grave'],\n\t\t['243', 'o - acute'],\n\t\t['244', 'o - circumflex'],\n\t\t['245', 'o - tilde'],\n\t\t['246', 'o - diaeresis'],\n\t\t['248', 'o slash'],\n\t\t['339', 'ligature oe'],\n\t\t['353', 's - caron'],\n\t\t['249', 'u - grave'],\n\t\t['250', 'u - acute'],\n\t\t['251', 'u - circumflex'],\n\t\t['252', 'u - diaeresis'],\n\t\t['253', 'y - acute'],\n\t\t['254', 'thorn'],\n\t\t['255', 'y - diaeresis'],\n\t\t['913', 'Alpha'],\n\t\t['914', 'Beta'],\n\t\t['915', 'Gamma'],\n\t\t['916', 'Delta'],\n\t\t['917', 'Epsilon'],\n\t\t['918', 'Zeta'],\n\t\t['919', 'Eta'],\n\t\t['920', 'Theta'],\n\t\t['921', 'Iota'],\n\t\t['922', 'Kappa'],\n\t\t['923', 'Lambda'],\n\t\t['924', 'Mu'],\n\t\t['925', 'Nu'],\n\t\t['926', 'Xi'],\n\t\t['927', 'Omicron'],\n\t\t['928', 'Pi'],\n\t\t['929', 'Rho'],\n\t\t['931', 'Sigma'],\n\t\t['932', 'Tau'],\n\t\t['933', 'Upsilon'],\n\t\t['934', 'Phi'],\n\t\t['935', 'Chi'],\n\t\t['936', 'Psi'],\n\t\t['937', 'Omega'],\n\t\t['945', 'alpha'],\n\t\t['946', 'beta'],\n\t\t['947', 'gamma'],\n\t\t['948', 'delta'],\n\t\t['949', 'epsilon'],\n\t\t['950', 'zeta'],\n\t\t['951', 'eta'],\n\t\t['952', 'theta'],\n\t\t['953', 'iota'],\n\t\t['954', 'kappa'],\n\t\t['955', 'lambda'],\n\t\t['956', 'mu'],\n\t\t['957', 'nu'],\n\t\t['958', 'xi'],\n\t\t['959', 'omicron'],\n\t\t['960', 'pi'],\n\t\t['961', 'rho'],\n\t\t['962', 'final sigma'],\n\t\t['963', 'sigma'],\n\t\t['964', 'tau'],\n\t\t['965', 'upsilon'],\n\t\t['966', 'phi'],\n\t\t['967', 'chi'],\n\t\t['968', 'psi'],\n\t\t['969', 'omega'],\n\t// symbols\n\t\t['8501', 'alef symbol'],\n\t\t['982', 'pi symbol'],\n\t\t['8476', 'real part symbol'],\n\t\t['978', 'upsilon - hook symbol'],\n\t\t['8472', 'Weierstrass p'],\n\t\t['8465', 'imaginary part'],\n\t// arrows\n\t\t['8592', 'leftwards arrow'],\n\t\t['8593', 'upwards arrow'],\n\t\t['8594', 'rightwards arrow'],\n\t\t['8595', 'downwards arrow'],\n\t\t['8596', 'left right arrow'],\n\t\t['8629', 'carriage return'],\n\t\t['8656', 'leftwards double arrow'],\n\t\t['8657', 'upwards double arrow'],\n\t\t['8658', 'rightwards double arrow'],\n\t\t['8659', 'downwards double arrow'],\n\t\t['8660', 'left right double arrow'],\n\t\t['8756', 'therefore'],\n\t\t['8834', 'subset of'],\n\t\t['8835', 'superset of'],\n\t\t['8836', 'not a subset of'],\n\t\t['8838', 'subset of or equal to'],\n\t\t['8839', 'superset of or equal to'],\n\t\t['8853', 'circled plus'],\n\t\t['8855', 'circled times'],\n\t\t['8869', 'perpendicular'],\n\t\t['8901', 'dot operator'],\n\t\t['8968', 'left ceiling'],\n\t\t['8969', 'right ceiling'],\n\t\t['8970', 'left floor'],\n\t\t['8971', 'right floor'],\n\t\t['9001', 'left-pointing angle bracket'],\n\t\t['9002', 'right-pointing angle bracket'],\n\t\t['9674', 'lozenge'],\n\t\t['9824', 'black spade suit'],\n\t\t['9827', 'black club suit'],\n\t\t['9829', 'black heart suit'],\n\t\t['9830', 'black diamond suit'],\n\t\t['8194', 'en space'],\n\t\t['8195', 'em space'],\n\t\t['8201', 'thin space'],\n\t\t['8204', 'zero width non-joiner'],\n\t\t['8205', 'zero width joiner'],\n\t\t['8206', 'left-to-right mark'],\n\t\t['8207', 'right-to-left mark']\n\t];\n\n\tfunction showDialog() {\n\t\tvar gridHtml, x, y, win;\n\n\t\tfunction getParentTd(elm) {\n\t\t\twhile (elm) {\n\t\t\t\tif (elm.nodeName == 'TD') {\n\t\t\t\t\treturn elm;\n\t\t\t\t}\n\n\t\t\t\telm = elm.parentNode;\n\t\t\t}\n\t\t}\n\n\t\tgridHtml = '<table role=\"presentation\" cellspacing=\"0\" class=\"mce-charmap\"><tbody>';\n\n\t\tvar width = 25;\n\t\tvar height = Math.ceil(charmap.length / width);\n\t\tfor (y = 0; y < height; y++) {\n\t\t\tgridHtml += '<tr>';\n\n\t\t\tfor (x = 0; x < width; x++) {\n\t\t\t\tvar index = y * width + x;\n\t\t\t\tif (index < charmap.length) {\n\t\t\t\t\tvar chr = charmap[index];\n\n\t\t\t\t\tgridHtml += '<td title=\"' + chr[1] + '\"><div tabindex=\"-1\" title=\"' + chr[1] + '\" role=\"button\">' +\n\t\t\t\t\t\t(chr ? String.fromCharCode(parseInt(chr[0], 10)) : '&nbsp;') + '</div></td>';\n\t\t\t\t} else {\n\t\t\t\t\tgridHtml += '<td />';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgridHtml += '</tr>';\n\t\t}\n\n\t\tgridHtml += '</tbody></table>';\n\n\t\tvar charMapPanel = {\n\t\t\ttype: 'container',\n\t\t\thtml: gridHtml,\n\t\t\tonclick: function(e) {\n\t\t\t\tvar target = e.target;\n\t\t\t\tif (/^(TD|DIV)$/.test(target.nodeName)) {\n\t\t\t\t\tif (getParentTd(target).firstChild) {\n\t\t\t\t\t\teditor.execCommand('mceInsertContent', false, tinymce.trim(target.innerText || target.textContent));\n\n\t\t\t\t\t\tif (!e.ctrlKey) {\n\t\t\t\t\t\t\twin.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonmouseover: function(e) {\n\t\t\t\tvar td = getParentTd(e.target);\n\n\t\t\t\tif (td && td.firstChild) {\n\t\t\t\t\twin.find('#preview').text(td.firstChild.firstChild.data);\n\t\t\t\t\twin.find('#previewTitle').text(td.title);\n\t\t\t\t} else {\n\t\t\t\t\twin.find('#preview').text(' ');\n\t\t\t\t\twin.find('#previewTitle').text(' ');\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\twin = editor.windowManager.open({\n\t\t\ttitle: \"Special character\",\n\t\t\tspacing: 10,\n\t\t\tpadding: 10,\n\t\t\titems: [\n\t\t\t\tcharMapPanel,\n\t\t\t\t{\n\t\t\t\t\ttype: 'container',\n\t\t\t\t\tlayout: 'flex',\n\t\t\t\t\tdirection: 'column',\n\t\t\t\t\talign: 'center',\n\t\t\t\t\tspacing: 5,\n\t\t\t\t\tminWidth: 160,\n\t\t\t\t\tminHeight: 160,\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'label',\n\t\t\t\t\t\t\tname: 'preview',\n\t\t\t\t\t\t\ttext: ' ',\n\t\t\t\t\t\t\tstyle: 'font-size: 40px; text-align: center',\n\t\t\t\t\t\t\tborder: 1,\n\t\t\t\t\t\t\tminWidth: 140,\n\t\t\t\t\t\t\tminHeight: 80\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'label',\n\t\t\t\t\t\t\tname: 'previewTitle',\n\t\t\t\t\t\t\ttext: ' ',\n\t\t\t\t\t\t\tstyle: 'text-align: center',\n\t\t\t\t\t\t\tborder: 1,\n\t\t\t\t\t\t\tminWidth: 140,\n\t\t\t\t\t\t\tminHeight: 80\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t],\n\t\t\tbuttons: [\n\t\t\t\t{text: \"Close\", onclick: function() {\n\t\t\t\t\twin.close();\n\t\t\t\t}}\n\t\t\t]\n\t\t});\n\t}\n\n\teditor.addCommand('mceShowCharmap', showDialog);\n\n\teditor.addButton('charmap', {\n\t\ticon: 'charmap',\n\t\ttooltip: 'Special character',\n\t\tcmd: 'mceShowCharmap'\n\t});\n\n\teditor.addMenuItem('charmap', {\n\t\ticon: 'charmap',\n\t\ttext: 'Special character',\n\t\tcmd: 'mceShowCharmap',\n\t\tcontext: 'insert'\n\t});\n});"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/colorpicker/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.PluginManager.add('colorpicker', function(editor) {\n\tfunction colorPickerCallback(callback, value) {\n\t\tfunction setColor(value) {\n\t\t\tvar color = new tinymce.util.Color(value), rgb = color.toRgb();\n\n\t\t\twin.fromJSON({\n\t\t\t\tr: rgb.r,\n\t\t\t\tg: rgb.g,\n\t\t\t\tb: rgb.b,\n\t\t\t\thex: color.toHex().substr(1)\n\t\t\t});\n\n\t\t\tshowPreview(color.toHex());\n\t\t}\n\n\t\tfunction showPreview(hexColor) {\n\t\t\twin.find('#preview')[0].getEl().style.background = hexColor;\n\t\t}\n\n\t\tvar win = editor.windowManager.open({\n\t\t\ttitle: 'Color',\n\t\t\titems: {\n\t\t\t\ttype: 'container',\n\t\t\t\tlayout: 'flex',\n\t\t\t\tdirection: 'row',\n\t\t\t\talign: 'stretch',\n\t\t\t\tpadding: 5,\n\t\t\t\tspacing: 10,\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'colorpicker',\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\t\tvar rgb = this.rgb();\n\n\t\t\t\t\t\t\tif (win) {\n\t\t\t\t\t\t\t\twin.find('#r').value(rgb.r);\n\t\t\t\t\t\t\t\twin.find('#g').value(rgb.g);\n\t\t\t\t\t\t\t\twin.find('#b').value(rgb.b);\n\t\t\t\t\t\t\t\twin.find('#hex').value(this.value().substr(1));\n\t\t\t\t\t\t\t\tshowPreview(this.value());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'form',\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tlabelGap: 5,\n\t\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t\ttype: 'textbox',\n\t\t\t\t\t\t\tsize: 7,\n\t\t\t\t\t\t\tvalue: '0',\n\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\tspellcheck: false,\n\t\t\t\t\t\t\tonchange: function() {\n\t\t\t\t\t\t\t\tvar colorPickerCtrl = win.find('colorpicker')[0];\n\t\t\t\t\t\t\t\tvar name, value;\n\n\t\t\t\t\t\t\t\tname = this.name();\n\t\t\t\t\t\t\t\tvalue = this.value();\n\n\t\t\t\t\t\t\t\tif (name == \"hex\") {\n\t\t\t\t\t\t\t\t\tvalue = '#' + value;\n\t\t\t\t\t\t\t\t\tsetColor(value);\n\t\t\t\t\t\t\t\t\tcolorPickerCtrl.value(value);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvalue = {\n\t\t\t\t\t\t\t\t\tr: win.find('#r').value(),\n\t\t\t\t\t\t\t\t\tg: win.find('#g').value(),\n\t\t\t\t\t\t\t\t\tb: win.find('#b').value()\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tcolorPickerCtrl.value(value);\n\t\t\t\t\t\t\t\tsetColor(value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{name: 'r', label: 'R', autofocus: 1},\n\t\t\t\t\t\t\t{name: 'g', label: 'G'},\n\t\t\t\t\t\t\t{name: 'b', label: 'B'},\n\t\t\t\t\t\t\t{name: 'hex', label: '#', value: '000000'},\n\t\t\t\t\t\t\t{name: 'preview', type: 'container', border: 1}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\tonSubmit: function() {\n\t\t\t\tcallback('#' + this.toJSON().hex);\n\t\t\t}\n\t\t});\n\n\t\tsetColor(value);\n\t}\n\n\tif (!editor.settings.color_picker_callback) {\n\t\teditor.settings.color_picker_callback = colorPickerCallback;\n\t}\n});"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/compat3x/css/dialog.css",
    "content": "@import url(\"https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,300,400,600&subset=latin-ext,latin\");\n\n/* Generic */\nbody {\nfont-family: \"Open Sans\", sans-serif;\nfont-size:13px;\nbackground:#fcfcfc;\npadding:0;\nmargin:8px 8px 0 8px;\n}\n\ntextarea {resize:none;outline:none;}\n\na:link, a:hover {\n\tcolor: #2B6FB6;\n}\n\na:visited {\n\tcolor: #3C2BB6;\n}\n\n.nowrap {white-space: nowrap}\n\n/* Forms */\nform {margin: 0;}\nfieldset {margin:0; padding:4px; border:1px solid #dfdfdf; font-family:Verdana, Arial; font-size:10px;}\nlegend {color:#2B6FB6; font-weight:bold;}\nlabel.msg {display:none;}\nlabel.invalid {color:#EE0000; display:inline;}\ninput.invalid {border:1px solid #EE0000;}\ninput {background:#FFF; border:1px solid #dfdfdf;}\ninput, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}\ninput, select, textarea {border:1px solid #dfdfdf;}\ninput.radio {border:1px none #000000; background:transparent; vertical-align:middle;}\ninput.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}\n.input_noborder {border:0;}\n\n/* Buttons */\n#insert,\n#cancel,\n#apply,\n.mceActionPanel .button,\ninput.mceButton,\n.updateButton {\n\tdisplay: inline-block;\n\ttext-decoration: none;\n\tborder: 1px solid #adadad;\n\tmargin: 0;\n\tpadding: 0 10px 1px;\n\tfont-size: 13px;\n\theight: 24px;\n\tline-height: 22px;\n\tcolor: #333;\n\tcursor: pointer;\n\t-webkit-border-radius: 3px;\n\t-webkit-appearance: none;\n\tborder-radius: 3px;\n\twhite-space: nowrap;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tbackground: #fafafa;\n\tbackground-image: -webkit-gradient(linear, left top, left bottom, from(#fafafa), to(#e9e9e9));\n\tbackground-image: -webkit-linear-gradient(top, #fafafa, #e9e9e9);\n\tbackground-image: -moz-linear-gradient(top, #fafafa, #e9e9e9);\n\tbackground-image: -o-linear-gradient(top, #fafafa, #e9e9e9);\n\tbackground-image: linear-gradient(to bottom, #fafafa, #e9e9e9);\n\t\n\ttext-shadow: 0 1px 0 #fff;\n\t-webkit-box-shadow: inset 0 1px 0 #fff;\n\t-moz-box-shadow: inset 0 1px 0 #fff;\n\tbox-shadow: inset 0 1px 0 #fff;\n}\n\n#insert {\n\tbackground: #2ea2cc;\n\tbackground: -webkit-gradient(linear, left top, left bottom, from(#2ea2cc), to(#1e8cbe));\n\tbackground: -webkit-linear-gradient(top, #2ea2cc 0%,#1e8cbe 100%);\n\tbackground: linear-gradient(top, #2ea2cc 0%,#1e8cbe 100%);\n\tfilter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2ea2cc', endColorstr='#1e8cbe',GradientType=0 );\n\tborder-color: #0074a2;\n\t-webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.5);\n\tbox-shadow: inset 0 1px 0 rgba(120,200,230,0.5);\n\tcolor: #fff;\n\ttext-decoration: none;\n\ttext-shadow: 0 1px 0 rgba(0,86,132,0.7);\n}\n\n#cancel:hover,\ninput.mceButton:hover,\n.updateButton:hover,\n#cancel:focus,\ninput.mceButton:focus,\n.updateButton:focus {\n\tbackground: #f3f3f3;\n\tbackground-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f3f3f3));\n\tbackground-image: -webkit-linear-gradient(top, #fff, #f3f3f3);\n\tbackground-image: -moz-linear-gradient(top, #fff, #f3f3f3);\n\tbackground-image: -ms-linear-gradient(top, #fff, #f3f3f3);\n\tbackground-image: -o-linear-gradient(top, #fff, #f3f3f3);\n\tbackground-image: linear-gradient(to bottom, #fff, #f3f3f3);\n\tborder-color: #999;\n\tcolor: #222;\n}\n\n#insert:hover,\n#insert:focus {\n\tbackground: #1e8cbe;\n\tbackground: -webkit-gradient(linear, left top, left bottom, from(#1e8cbe), to(#0074a2));\n\tbackground: -webkit-linear-gradient(top, #1e8cbe 0%,#0074a2 100%);\n\tbackground: linear-gradient(top, #1e8cbe 0%,#0074a2 100%);\n\tfilter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e8cbe', endColorstr='#0074a2',GradientType=0 );\n\tborder-color: #0074a2;\n\t-webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.6);\n\tbox-shadow: inset 0 1px 0 rgba(120,200,230,0.6);\n\tcolor: #fff;\n}\n\n.mceActionPanel #insert {\n\tfloat: right;\n}\n\n/* Browse */\na.pickcolor, a.browse {text-decoration:none}\na.browse span {display:block; width:20px; height:18px; border:1px solid #FFF; margin-left:1px;}\n.mceOldBoxModel a.browse span {width:22px; height:20px;}\na.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}\na.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30);}\na.browse:hover span.disabled {border:1px solid white; background-color:transparent;}\na.pickcolor span {display:block; width:20px; height:16px; margin-left:2px;}\n.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}\na.pickcolor:hover span {background-color:#B2BBD0;}\ndiv.iframecontainer {background: #fff;}\n\n/* Charmap */\ntable.charmap {border:1px solid #AAA; text-align:center}\ntd.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}\n#charmap a {display:block; color:#000; text-decoration:none; border:0}\n#charmap a:hover {background:#CCC;color:#2B6FB6}\n#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}\n#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}\n#charmap #charmapView {background-color:#fff;}\n\n/* Source */\n.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}\n.mceActionPanel {margin-top:5px;}\n\n/* Tabs classes */\n.tabs {width:100%; height:19px; line-height:normal; border-bottom: 1px solid #aaa;}\n.tabs ul {margin:0; padding:0; list-style:none;}\n.tabs li {float:left; border: 1px solid #aaa; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}\n.tabs li.current {border-bottom: 1px solid #fff; margin-right:2px;}\n.tabs span {float:left; display:block; padding:0px 10px 0 0;}\n.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}\n.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}\n\n.wp-core-ui #tabs {\n\tpadding-bottom: 5px;\n\tbackground-color: transparent;\n}\n\n.wp-core-ui #tabs a {\n\tpadding: 6px 10px;\n\tmargin: 0 2px;\n}\n\n/* Panels */\n.panel_wrapper div.panel {display:none;}\n.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}\n.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}\n\n/* Columns */\n.column {float:left;}\n.properties {width:100%;}\n.properties .column1 {}\n.properties .column2 {text-align:left;}\n\n/* Titles */\nh1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}\nh3 {font-size:14px;}\n.title {font-size:12px; font-weight:bold; color:#2B6FB6;}\n\n/* Dialog specific */\n#link .panel_wrapper, #link div.current {height:125px;}\n#image .panel_wrapper, #image div.current {height:200px;}\n#plugintable thead {font-weight:bold; background:#DDD;}\n#plugintable, #about #plugintable td {border:1px solid #919B9C;}\n#plugintable {width:96%; margin-top:10px;}\n#pluginscontainer {height:290px; overflow:auto;}\n#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px}\n#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline}\n#colorpicker #preview_wrapper {text-align:center; padding-top:4px; white-space: nowrap; float: right;}\n#colorpicker #insert, #colorpicker #cancel {width: 90px}\n#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}\n#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}\n#colorpicker #light div {overflow:hidden;}\n#colorpicker .panel_wrapper div.current {height:175px;}\n#colorpicker #namedcolors {width:150px;}\n#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}\n#colorpicker #colornamecontainer {margin-top:5px;}\n#colorpicker #picker_panel fieldset {margin:auto;width:325px;}\n\n\n/* Localization */ \n\nbody[dir=\"rtl\"],\nbody[dir=\"rtl\"] fieldset,\nbody[dir=\"rtl\"] input, body[dir=\"rtl\"] select, body[dir=\"rtl\"]  textarea,\nbody[dir=\"rtl\"]  #charmap #codeN,\nbody[dir=\"rtl\"] .tabs a {\n\tfont-family: Tahoma, sans-serif;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/compat3x/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true, console:true */\n/*eslint no-console:0, new-cap:0 */\n\n/**\n * This plugin adds missing events form the 4.x API back. Not every event is\n * properly supported but most things should work.\n *\n * Unsupported things:\n *  - No editor.onEvent\n *  - Can't cancel execCommands with beforeExecCommand\n */\n(function(tinymce) {\n\tvar reported;\n\n\tfunction noop() {\n\t}\n\n\tfunction log(apiCall) {\n\t\tif (!reported && window && window.console) {\n\t\t\treported = true;\n\t\t\tconsole.log(\"Deprecated TinyMCE API call: \" + apiCall);\n\t\t}\n\t}\n\n\tfunction Dispatcher(target, newEventName, argsMap, defaultScope) {\n\t\ttarget = target || this;\n\n\t\tif (!newEventName) {\n\t\t\tthis.add = this.addToTop = this.remove = this.dispatch = noop;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.add = function(callback, scope, prepend) {\n\t\t\tlog('<target>.on' + newEventName + \".add(..)\");\n\n\t\t\t// Convert callback({arg1:x, arg2:x}) -> callback(arg1, arg2)\n\t\t\tfunction patchedEventCallback(e) {\n\t\t\t\tvar callbackArgs = [];\n\n\t\t\t\tif (typeof argsMap == \"string\") {\n\t\t\t\t\targsMap = argsMap.split(\" \");\n\t\t\t\t}\n\n\t\t\t\tif (argsMap && typeof argsMap != \"function\") {\n\t\t\t\t\tfor (var i = 0; i < argsMap.length; i++) {\n\t\t\t\t\t\tcallbackArgs.push(e[argsMap[i]]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (typeof argsMap == \"function\") {\n\t\t\t\t\tcallbackArgs = argsMap(newEventName, e, target);\n\t\t\t\t\tif (!callbackArgs) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!argsMap) {\n\t\t\t\t\tcallbackArgs = [e];\n\t\t\t\t}\n\n\t\t\t\tcallbackArgs.unshift(defaultScope || target);\n\n\t\t\t\tif (callback.apply(scope || defaultScope || target, callbackArgs) === false) {\n\t\t\t\t\te.stopImmediatePropagation();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttarget.on(newEventName, patchedEventCallback, prepend);\n\n\t\t\treturn patchedEventCallback;\n\t\t};\n\n\t\tthis.addToTop = function(callback, scope) {\n\t\t\tthis.add(callback, scope, true);\n\t\t};\n\n\t\tthis.remove = function(callback) {\n\t\t\treturn target.off(newEventName, callback);\n\t\t};\n\n\t\tthis.dispatch = function() {\n\t\t\ttarget.fire(newEventName);\n\n\t\t\treturn true;\n\t\t};\n\t}\n\n\ttinymce.util.Dispatcher = Dispatcher;\n\ttinymce.onBeforeUnload = new Dispatcher(tinymce, \"BeforeUnload\");\n\ttinymce.onAddEditor = new Dispatcher(tinymce, \"AddEditor\", \"editor\");\n\ttinymce.onRemoveEditor = new Dispatcher(tinymce, \"RemoveEditor\", \"editor\");\n\n\ttinymce.util.Cookie = {\n\t\tget: noop, getHash: noop, remove: noop, set: noop, setHash: noop\n\t};\n\n\tfunction patchEditor(editor) {\n\t\tfunction patchEditorEvents(oldEventNames, argsMap) {\n\t\t\ttinymce.each(oldEventNames.split(\" \"), function(oldName) {\n\t\t\t\teditor[\"on\" + oldName] = new Dispatcher(editor, oldName, argsMap);\n\t\t\t});\n\t\t}\n\n\t\tfunction convertUndoEventArgs(type, event, target) {\n\t\t\treturn [\n\t\t\t\tevent.level,\n\t\t\t\ttarget\n\t\t\t];\n\t\t}\n\n\t\tfunction filterSelectionEvents(needsSelection) {\n\t\t\treturn function(type, e) {\n\t\t\t\tif ((!e.selection && !needsSelection) || e.selection == needsSelection) {\n\t\t\t\t\treturn [e];\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tif (editor.controlManager) {\n\t\t\treturn;\n\t\t}\n\n\t\tfunction cmNoop() {\n\t\t\tvar obj = {}, methods = 'add addMenu addSeparator collapse createMenu destroy displayColor expand focus ' +\n\t\t\t\t'getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark ' +\n\t\t\t\t'postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex ' +\n\t\t\t\t'setActive setAriaProperty setColor setDisabled setSelected setState showMenu update';\n\n\t\t\tlog('editor.controlManager.*');\n\n\t\t\tfunction _noop() {\n\t\t\t\treturn cmNoop();\n\t\t\t}\n\n\t\t\ttinymce.each(methods.split(' '), function(method) {\n\t\t\t\tobj[method] = _noop;\n\t\t\t});\n\n\t\t\treturn obj;\n\t\t}\n\n\t\teditor.controlManager = {\n\t\t\tbuttons: {},\n\n\t\t\tsetDisabled: function(name, state) {\n\t\t\t\tlog(\"controlManager.setDisabled(..)\");\n\n\t\t\t\tif (this.buttons[name]) {\n\t\t\t\t\tthis.buttons[name].disabled(state);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tsetActive: function(name, state) {\n\t\t\t\tlog(\"controlManager.setActive(..)\");\n\n\t\t\t\tif (this.buttons[name]) {\n\t\t\t\t\tthis.buttons[name].active(state);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonAdd: new Dispatcher(),\n\t\t\tonPostRender: new Dispatcher(),\n\n\t\t\tadd: function(obj) {\n\t\t\t\treturn obj;\n\t\t\t},\n\t\t\tcreateButton: cmNoop,\n\t\t\tcreateColorSplitButton: cmNoop,\n\t\t\tcreateControl: cmNoop,\n\t\t\tcreateDropMenu: cmNoop,\n\t\t\tcreateListBox: cmNoop,\n\t\t\tcreateMenuButton: cmNoop,\n\t\t\tcreateSeparator: cmNoop,\n\t\t\tcreateSplitButton: cmNoop,\n\t\t\tcreateToolbar: cmNoop,\n\t\t\tcreateToolbarGroup: cmNoop,\n\t\t\tdestroy: noop,\n\t\t\tget: noop,\n\t\t\tsetControlType: cmNoop\n\t\t};\n\n\t\tpatchEditorEvents(\"PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate\", \"editor\");\n\t\tpatchEditorEvents(\"Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset\");\n\t\tpatchEditorEvents(\"BeforeExecCommand ExecCommand\", \"command ui value args\"); // args.terminate not supported\n\t\tpatchEditorEvents(\"PreProcess PostProcess LoadContent SaveContent Change\");\n\t\tpatchEditorEvents(\"BeforeSetContent BeforeGetContent SetContent GetContent\", filterSelectionEvents(false));\n\t\tpatchEditorEvents(\"SetProgressState\", \"state time\");\n\t\tpatchEditorEvents(\"VisualAid\", \"element hasVisual\");\n\t\tpatchEditorEvents(\"Undo Redo\", convertUndoEventArgs);\n\n\t\tpatchEditorEvents(\"NodeChange\", function(type, e) {\n\t\t\treturn [\n\t\t\t\teditor.controlManager,\n\t\t\t\te.element,\n\t\t\t\teditor.selection.isCollapsed(),\n\t\t\t\te\n\t\t\t];\n\t\t});\n\n\t\tvar originalAddButton = editor.addButton;\n\t\teditor.addButton = function(name, settings) {\n\t\t\tvar originalOnPostRender, string, translated;\n\n\t\t\tfunction patchedPostRender() {\n\t\t\t\teditor.controlManager.buttons[name] = this;\n\n\t\t\t\tif (originalOnPostRender) {\n\t\t\t\t\treturn originalOnPostRender.call(this);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (var key in settings) {\n\t\t\t\tif (key.toLowerCase() === \"onpostrender\") {\n\t\t\t\t\toriginalOnPostRender = settings[key];\n\t\t\t\t\tsettings.onPostRender = patchedPostRender;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!originalOnPostRender) {\n\t\t\t\tsettings.onPostRender = patchedPostRender;\n\t\t\t}\n\n\t\t\tif ( settings.title ) {\n\t\t\t\t// WP\n\t\t\t\tstring = (editor.settings.language || \"en\") + \".\" + settings.title;\n\t\t\t\ttranslated = tinymce.i18n.translate(string);\n\n\t\t\t\tif ( string !== translated ) {\n\t\t\t\t\tsettings.title = translated;\n\t\t\t\t}\n\t\t\t\t// WP end\n\t\t\t}\n\n\t\t\treturn originalAddButton.call(this, name, settings);\n\t\t};\n\n\t\teditor.on('init', function() {\n\t\t\tvar undoManager = editor.undoManager, selection = editor.selection;\n\n\t\t\tundoManager.onUndo = new Dispatcher(editor, \"Undo\", convertUndoEventArgs, null, undoManager);\n\t\t\tundoManager.onRedo = new Dispatcher(editor, \"Redo\", convertUndoEventArgs, null, undoManager);\n\t\t\tundoManager.onBeforeAdd = new Dispatcher(editor, \"BeforeAddUndo\", null, undoManager);\n\t\t\tundoManager.onAdd = new Dispatcher(editor, \"AddUndo\", null, undoManager);\n\n\t\t\tselection.onBeforeGetContent = new Dispatcher(editor, \"BeforeGetContent\", filterSelectionEvents(true), selection);\n\t\t\tselection.onGetContent = new Dispatcher(editor, \"GetContent\", filterSelectionEvents(true), selection);\n\t\t\tselection.onBeforeSetContent = new Dispatcher(editor, \"BeforeSetContent\", filterSelectionEvents(true), selection);\n\t\t\tselection.onSetContent = new Dispatcher(editor, \"SetContent\", filterSelectionEvents(true), selection);\n\t\t});\n\n\t\teditor.on('BeforeRenderUI', function() {\n\t\t\tvar windowManager = editor.windowManager;\n\n\t\t\twindowManager.onOpen = new Dispatcher();\n\t\t\twindowManager.onClose = new Dispatcher();\n\t\t\twindowManager.createInstance = function(className, a, b, c, d, e) {\n\t\t\t\tlog(\"windowManager.createInstance(..)\");\n\n\t\t\t\tvar constr = tinymce.resolve(className);\n\t\t\t\treturn new constr(a, b, c, d, e);\n\t\t\t};\n\t\t});\n\t}\n\n\ttinymce.on('SetupEditor', patchEditor);\n\ttinymce.PluginManager.add(\"compat3x\", patchEditor);\n\n\ttinymce.addI18n = function(prefix, o) {\n\t\tvar I18n = tinymce.util.I18n, each = tinymce.each;\n\n\t\tif (typeof prefix == \"string\" && prefix.indexOf('.') === -1) {\n\t\t\tI18n.add(prefix, o);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!tinymce.is(prefix, 'string')) {\n\t\t\teach(prefix, function(o, lc) {\n\t\t\t\teach(o, function(o, g) {\n\t\t\t\t\teach(o, function(o, k) {\n\t\t\t\t\t\tif (g === 'common') {\n\t\t\t\t\t\t\tI18n.data[lc + '.' + k] = o;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tI18n.data[lc + '.' + g + '.' + k] = o;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\teach(o, function(o, k) {\n\t\t\t\tI18n.data[prefix + '.' + k] = o;\n\t\t\t});\n\t\t}\n\t};\n})(tinymce);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/directionality/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.PluginManager.add('directionality', function(editor) {\n\tfunction setDir(dir) {\n\t\tvar dom = editor.dom, curDir, blocks = editor.selection.getSelectedBlocks();\n\n\t\tif (blocks.length) {\n\t\t\tcurDir = dom.getAttrib(blocks[0], \"dir\");\n\n\t\t\ttinymce.each(blocks, function(block) {\n\t\t\t\t// Add dir to block if the parent block doesn't already have that dir\n\t\t\t\tif (!dom.getParent(block.parentNode, \"*[dir='\" + dir + \"']\", dom.getRoot())) {\n\t\t\t\t\tif (curDir != dir) {\n\t\t\t\t\t\tdom.setAttrib(block, \"dir\", dir);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdom.setAttrib(block, \"dir\", null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teditor.nodeChanged();\n\t\t}\n\t}\n\n\tfunction generateSelector(dir) {\n\t\tvar selector = [];\n\n\t\ttinymce.each('h1 h2 h3 h4 h5 h6 div p'.split(' '), function(name) {\n\t\t\tselector.push(name + '[dir=' + dir + ']');\n\t\t});\n\n\t\treturn selector.join(',');\n\t}\n\n\teditor.addCommand('mceDirectionLTR', function() {\n\t\tsetDir(\"ltr\");\n\t});\n\n\teditor.addCommand('mceDirectionRTL', function() {\n\t\tsetDir(\"rtl\");\n\t});\n\n\teditor.addButton('ltr', {\n\t\ttitle: 'Left to right',\n\t\tcmd: 'mceDirectionLTR',\n\t\tstateSelector: generateSelector('ltr')\n\t});\n\n\teditor.addButton('rtl', {\n\t\ttitle: 'Right to left',\n\t\tcmd: 'mceDirectionRTL',\n\t\tstateSelector: generateSelector('rtl')\n\t});\n});"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/fullscreen/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.PluginManager.add('fullscreen', function(editor) {\n\tvar fullscreenState = false, DOM = tinymce.DOM, iframeWidth, iframeHeight, resizeHandler;\n\tvar containerWidth, containerHeight;\n\n\tif (editor.settings.inline) {\n\t\treturn;\n\t}\n\n\tfunction getWindowSize() {\n\t\tvar w, h, win = window, doc = document;\n\t\tvar body = doc.body;\n\n\t\t// Old IE\n\t\tif (body.offsetWidth) {\n\t\t\tw = body.offsetWidth;\n\t\t\th = body.offsetHeight;\n\t\t}\n\n\t\t// Modern browsers\n\t\tif (win.innerWidth && win.innerHeight) {\n\t\t\tw = win.innerWidth;\n\t\t\th = win.innerHeight;\n\t\t}\n\n\t\treturn {w: w, h: h};\n\t}\n\n\tfunction toggleFullscreen() {\n\t\tvar body = document.body, documentElement = document.documentElement, editorContainerStyle;\n\t\tvar editorContainer, iframe, iframeStyle;\n\n\t\tfunction resize() {\n\t\t\tDOM.setStyle(iframe, 'height', getWindowSize().h - (editorContainer.clientHeight - iframe.clientHeight));\n\t\t}\n\n\t\tfullscreenState = !fullscreenState;\n\n\t\teditorContainer = editor.getContainer();\n\t\teditorContainerStyle = editorContainer.style;\n\t\tiframe = editor.getContentAreaContainer().firstChild;\n\t\tiframeStyle = iframe.style;\n\n\t\tif (fullscreenState) {\n\t\t\tiframeWidth = iframeStyle.width;\n\t\t\tiframeHeight = iframeStyle.height;\n\t\t\tiframeStyle.width = iframeStyle.height = '100%';\n\t\t\tcontainerWidth = editorContainerStyle.width;\n\t\t\tcontainerHeight = editorContainerStyle.height;\n\t\t\teditorContainerStyle.width = editorContainerStyle.height = '';\n\n\t\t\tDOM.addClass(body, 'mce-fullscreen');\n\t\t\tDOM.addClass(documentElement, 'mce-fullscreen');\n\t\t\tDOM.addClass(editorContainer, 'mce-fullscreen');\n\n\t\t\tDOM.bind(window, 'resize', resize);\n\t\t\tresize();\n\t\t\tresizeHandler = resize;\n\t\t} else {\n\t\t\tiframeStyle.width = iframeWidth;\n\t\t\tiframeStyle.height = iframeHeight;\n\n\t\t\tif (containerWidth) {\n\t\t\t\teditorContainerStyle.width = containerWidth;\n\t\t\t}\n\n\t\t\tif (containerHeight) {\n\t\t\t\teditorContainerStyle.height = containerHeight;\n\t\t\t}\n\n\t\t\tDOM.removeClass(body, 'mce-fullscreen');\n\t\t\tDOM.removeClass(documentElement, 'mce-fullscreen');\n\t\t\tDOM.removeClass(editorContainer, 'mce-fullscreen');\n\t\t\tDOM.unbind(window, 'resize', resizeHandler);\n\t\t}\n\n\t\teditor.fire('FullscreenStateChanged', {state: fullscreenState});\n\t}\n\n\teditor.on('init', function() {\n\t\teditor.addShortcut('Meta+Alt+F', '', toggleFullscreen);\n\t});\n\n\teditor.on('remove', function() {\n\t\tif (resizeHandler) {\n\t\t\tDOM.unbind(window, 'resize', resizeHandler);\n\t\t}\n\t});\n\n\teditor.addCommand('mceFullScreen', toggleFullscreen);\n\n\teditor.addMenuItem('fullscreen', {\n\t\ttext: 'Fullscreen',\n\t\tshortcut: 'Meta+Alt+F',\n\t\tselectable: true,\n\t\tonClick: toggleFullscreen,\n\t\tonPostRender: function() {\n\t\t\tvar self = this;\n\n\t\t\teditor.on('FullscreenStateChanged', function(e) {\n\t\t\t\tself.active(e.state);\n\t\t\t});\n\t\t},\n\t\tcontext: 'view'\n\t});\n\n\teditor.addButton('fullscreen', {\n\t\ttooltip: 'Fullscreen',\n\t\tshortcut: 'Meta+Alt+F',\n\t\tonClick: toggleFullscreen,\n\t\tonPostRender: function() {\n\t\t\tvar self = this;\n\n\t\t\teditor.on('FullscreenStateChanged', function(e) {\n\t\t\t\tself.active(e.state);\n\t\t\t});\n\t\t}\n\t});\n\n\treturn {\n\t\tisFullscreen: function() {\n\t\t\treturn fullscreenState;\n\t\t}\n\t};\n});"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/hr/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.PluginManager.add('hr', function(editor) {\n\teditor.addCommand('InsertHorizontalRule', function() {\n\t\teditor.execCommand('mceInsertContent', false, '<hr />');\n\t});\n\n\teditor.addButton('hr', {\n\t\ticon: 'hr',\n\t\ttooltip: 'Horizontal line',\n\t\tcmd: 'InsertHorizontalRule'\n\t});\n\n\teditor.addMenuItem('hr', {\n\t\ticon: 'hr',\n\t\ttext: 'Horizontal line',\n\t\tcmd: 'InsertHorizontalRule',\n\t\tcontext: 'insert'\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/image/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.PluginManager.add('image', function(editor) {\n\tfunction getImageSize(url, callback) {\n\t\tvar img = document.createElement('img');\n\n\t\tfunction done(width, height) {\n\t\t\tif (img.parentNode) {\n\t\t\t\timg.parentNode.removeChild(img);\n\t\t\t}\n\n\t\t\tcallback({width: width, height: height});\n\t\t}\n\n\t\timg.onload = function() {\n\t\t\tdone(Math.max(img.width, img.clientWidth), Math.max(img.height, img.clientHeight));\n\t\t};\n\n\t\timg.onerror = function() {\n\t\t\tdone();\n\t\t};\n\n\t\tvar style = img.style;\n\t\tstyle.visibility = 'hidden';\n\t\tstyle.position = 'fixed';\n\t\tstyle.bottom = style.left = 0;\n\t\tstyle.width = style.height = 'auto';\n\n\t\tdocument.body.appendChild(img);\n\t\timg.src = url;\n\t}\n\n\tfunction buildListItems(inputList, itemCallback, startItems) {\n\t\tfunction appendItems(values, output) {\n\t\t\toutput = output || [];\n\n\t\t\ttinymce.each(values, function(item) {\n\t\t\t\tvar menuItem = {text: item.text || item.title};\n\n\t\t\t\tif (item.menu) {\n\t\t\t\t\tmenuItem.menu = appendItems(item.menu);\n\t\t\t\t} else {\n\t\t\t\t\tmenuItem.value = item.value;\n\t\t\t\t\titemCallback(menuItem);\n\t\t\t\t}\n\n\t\t\t\toutput.push(menuItem);\n\t\t\t});\n\n\t\t\treturn output;\n\t\t}\n\n\t\treturn appendItems(inputList, startItems || []);\n\t}\n\n\tfunction createImageList(callback) {\n\t\treturn function() {\n\t\t\tvar imageList = editor.settings.image_list;\n\n\t\t\tif (typeof imageList == \"string\") {\n\t\t\t\ttinymce.util.XHR.send({\n\t\t\t\t\turl: imageList,\n\t\t\t\t\tsuccess: function(text) {\n\t\t\t\t\t\tcallback(tinymce.util.JSON.parse(text));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (typeof imageList == \"function\") {\n\t\t\t\timageList(callback);\n\t\t\t} else {\n\t\t\t\tcallback(imageList);\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction showDialog(imageList) {\n\t\tvar win, data = {}, dom = editor.dom, imgElm = editor.selection.getNode();\n\t\tvar width, height, imageListCtrl, classListCtrl, imageDimensions = editor.settings.image_dimensions !== false;\n\n\t\tfunction recalcSize() {\n\t\t\tvar widthCtrl, heightCtrl, newWidth, newHeight;\n\n\t\t\twidthCtrl = win.find('#width')[0];\n\t\t\theightCtrl = win.find('#height')[0];\n\n\t\t\tif (!widthCtrl || !heightCtrl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnewWidth = widthCtrl.value();\n\t\t\tnewHeight = heightCtrl.value();\n\n\t\t\tif (win.find('#constrain')[0].checked() && width && height && newWidth && newHeight) {\n\t\t\t\tif (width != newWidth) {\n\t\t\t\t\tnewHeight = Math.round((newWidth / width) * newHeight);\n\n\t\t\t\t\tif (!isNaN(newHeight)) {\n\t\t\t\t\t\theightCtrl.value(newHeight);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnewWidth = Math.round((newHeight / height) * newWidth);\n\n\t\t\t\t\tif (!isNaN(newWidth)) {\n\t\t\t\t\t\twidthCtrl.value(newWidth);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twidth = newWidth;\n\t\t\theight = newHeight;\n\t\t}\n\n\t\tfunction onSubmitForm() {\n\t\t\tfunction waitLoad(imgElm) {\n\t\t\t\tfunction selectImage() {\n\t\t\t\t\timgElm.onload = imgElm.onerror = null;\n\n\t\t\t\t\tif (editor.selection) {\n\t\t\t\t\t\teditor.selection.select(imgElm);\n\t\t\t\t\t\teditor.nodeChanged();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\timgElm.onload = function() {\n\t\t\t\t\tif (!data.width && !data.height && imageDimensions) {\n\t\t\t\t\t\tdom.setAttribs(imgElm, {\n\t\t\t\t\t\t\twidth: imgElm.clientWidth,\n\t\t\t\t\t\t\theight: imgElm.clientHeight\n\t\t\t\t\t\t});\n\t\t\t\t\t\t//WP\n\t\t\t\t\t\teditor.fire( 'wpNewImageRefresh', { node: imgElm } );\n\t\t\t\t\t}\n\n\t\t\t\t\tselectImage();\n\t\t\t\t};\n\n\t\t\t\timgElm.onerror = selectImage;\n\t\t\t}\n\n\t\t\tupdateStyle();\n\t\t\trecalcSize();\n\n\t\t\tdata = tinymce.extend(data, win.toJSON());\n\t\t\tvar caption = data.caption; // WP\n\n\t\t\tif (!data.alt) {\n\t\t\t\tdata.alt = '';\n\t\t\t}\n\n\t\t\tif (!data.title) {\n\t\t\t\tdata.title = '';\n\t\t\t}\n\n\t\t\tif (data.width === '') {\n\t\t\t\tdata.width = null;\n\t\t\t}\n\n\t\t\tif (data.height === '') {\n\t\t\t\tdata.height = null;\n\t\t\t}\n\n\t\t\tif (!data.style) {\n\t\t\t\tdata.style = null;\n\t\t\t}\n\n\t\t\t// Setup new data excluding style properties\n\t\t\t/*eslint dot-notation: 0*/\n\t\t\tdata = {\n\t\t\t\tsrc: data.src,\n\t\t\t\talt: data.alt,\n\t\t\t\ttitle: data.title,\n\t\t\t\twidth: data.width,\n\t\t\t\theight: data.height,\n\t\t\t\tstyle: data.style,\n\t\t\t\t\"class\": data[\"class\"]\n\t\t\t};\n\n\t\t\teditor.undoManager.transact(function() {\n\t\t\t\t// WP\n\t\t\t\tvar eventData = { node: imgElm, data: data, caption: caption };\n\n\t\t\t\teditor.fire( 'wpImageFormSubmit', { imgData: eventData } );\n\n\t\t\t\tif ( eventData.cancel ) {\n\t\t\t\t\twaitLoad( eventData.node );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// WP end\n\n\t\t\t\tif (!data.src) {\n\t\t\t\t\tif (imgElm) {\n\t\t\t\t\t\tdom.remove(imgElm);\n\t\t\t\t\t\teditor.focus();\n\t\t\t\t\t\teditor.nodeChanged();\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (data.title === \"\") {\n\t\t\t\t\tdata.title = null;\n\t\t\t\t}\n\n\t\t\t\tif (!imgElm) {\n\t\t\t\t\tdata.id = '__mcenew';\n\t\t\t\t\teditor.focus();\n\t\t\t\t\teditor.selection.setContent(dom.createHTML('img', data));\n\t\t\t\t\timgElm = dom.get('__mcenew');\n\t\t\t\t\tdom.setAttrib(imgElm, 'id', null);\n\t\t\t\t} else {\n\t\t\t\t\tdom.setAttribs(imgElm, data);\n\t\t\t\t\teditor.editorUpload.uploadImagesAuto();\n\t\t\t\t}\n\n\t\t\t\twaitLoad(imgElm);\n\t\t\t});\n\t\t}\n\n\t\tfunction removePixelSuffix(value) {\n\t\t\tif (value) {\n\t\t\t\tvalue = value.replace(/px$/, '');\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\n\t\tfunction srcChange(e) {\n\t\t\tvar srcURL, prependURL, absoluteURLPattern, meta = e.meta || {};\n\n\t\t\tif (imageListCtrl) {\n\t\t\t\timageListCtrl.value(editor.convertURL(this.value(), 'src'));\n\t\t\t}\n\n\t\t\ttinymce.each(meta, function(value, key) {\n\t\t\t\twin.find('#' + key).value(value);\n\t\t\t});\n\n\t\t\tif (!meta.width && !meta.height) {\n\t\t\t\tsrcURL = editor.convertURL(this.value(), 'src');\n\n\t\t\t\t// Pattern test the src url and make sure we haven't already prepended the url\n\t\t\t\tprependURL = editor.settings.image_prepend_url;\n\t\t\t\tabsoluteURLPattern = new RegExp('^(?:[a-z]+:)?//', 'i');\n\t\t\t\tif (prependURL && !absoluteURLPattern.test(srcURL) && srcURL.substring(0, prependURL.length) !== prependURL) {\n\t\t\t\t\tsrcURL = prependURL + srcURL;\n\t\t\t\t}\n\n\t\t\t\tthis.value(srcURL);\n\n\t\t\t\tgetImageSize(editor.documentBaseURI.toAbsolute(this.value()), function(data) {\n\t\t\t\t\tif (data.width && data.height && imageDimensions) {\n\t\t\t\t\t\twidth = data.width;\n\t\t\t\t\t\theight = data.height;\n\n\t\t\t\t\t\twin.find('#width').value(width);\n\t\t\t\t\t\twin.find('#height').value(height);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\twidth = dom.getAttrib(imgElm, 'width');\n\t\theight = dom.getAttrib(imgElm, 'height');\n\n\t\tif (imgElm.nodeName == 'IMG' && !imgElm.getAttribute('data-mce-object') && !imgElm.getAttribute('data-mce-placeholder')) {\n\t\t\tdata = {\n\t\t\t\tsrc: dom.getAttrib(imgElm, 'src'),\n\t\t\t\talt: dom.getAttrib(imgElm, 'alt'),\n\t\t\t\ttitle: dom.getAttrib(imgElm, 'title'),\n\t\t\t\t\"class\": dom.getAttrib(imgElm, 'class'),\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\t// WP\n\t\t\teditor.fire( 'wpLoadImageData', { imgData: { data: data, node: imgElm } } );\n\t\t} else {\n\t\t\timgElm = null;\n\t\t}\n\n\t\tif (imageList) {\n\t\t\timageListCtrl = {\n\t\t\t\ttype: 'listbox',\n\t\t\t\tlabel: 'Image list',\n\t\t\t\tvalues: buildListItems(\n\t\t\t\t\timageList,\n\t\t\t\t\tfunction(item) {\n\t\t\t\t\t\titem.value = editor.convertURL(item.value || item.url, 'src');\n\t\t\t\t\t},\n\t\t\t\t\t[{text: 'None', value: ''}]\n\t\t\t\t),\n\t\t\t\tvalue: data.src && editor.convertURL(data.src, 'src'),\n\t\t\t\tonselect: function(e) {\n\t\t\t\t\tvar altCtrl = win.find('#alt');\n\n\t\t\t\t\tif (!altCtrl.value() || (e.lastControl && altCtrl.value() == e.lastControl.text())) {\n\t\t\t\t\t\taltCtrl.value(e.control.text());\n\t\t\t\t\t}\n\n\t\t\t\t\twin.find('#src').value(e.control.value()).fire('change');\n\t\t\t\t},\n\t\t\t\tonPostRender: function() {\n\t\t\t\t\t/*eslint consistent-this: 0*/\n\t\t\t\t\timageListCtrl = this;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tif (editor.settings.image_class_list) {\n\t\t\tclassListCtrl = {\n\t\t\t\tname: 'class',\n\t\t\t\ttype: 'listbox',\n\t\t\t\tlabel: 'Class',\n\t\t\t\tvalues: buildListItems(\n\t\t\t\t\teditor.settings.image_class_list,\n\t\t\t\t\tfunction(item) {\n\t\t\t\t\t\tif (item.value) {\n\t\t\t\t\t\t\titem.textStyle = function() {\n\t\t\t\t\t\t\t\treturn editor.formatter.getCssText({inline: 'img', classes: [item.value]});\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t};\n\t\t}\n\n\t\t// General settings shared between simple and advanced dialogs\n\t\tvar generalFormItems = [\n\t\t\t{\n\t\t\t\tname: 'src',\n\t\t\t\ttype: 'filepicker',\n\t\t\t\tfiletype: 'image',\n\t\t\t\tlabel: 'Source',\n\t\t\t\tautofocus: true,\n\t\t\t\tonchange: srcChange\n\t\t\t},\n\t\t\timageListCtrl\n\t\t];\n\n\t\tif (editor.settings.image_description !== false) {\n\t\t\tgeneralFormItems.push({name: 'alt', type: 'textbox', label: 'Image description'});\n\t\t}\n\n\t\tif (editor.settings.image_title) {\n\t\t\tgeneralFormItems.push({name: 'title', type: 'textbox', label: 'Image Title'});\n\t\t}\n\n\t\tif (imageDimensions) {\n\t\t\tgeneralFormItems.push({\n\t\t\t\ttype: 'container',\n\t\t\t\tlabel: 'Dimensions',\n\t\t\t\tlayout: 'flex',\n\t\t\t\tdirection: 'row',\n\t\t\t\talign: 'center',\n\t\t\t\tspacing: 5,\n\t\t\t\titems: [\n\t\t\t\t\t{name: 'width', type: 'textbox', maxLength: 5, size: 3, onchange: recalcSize, ariaLabel: 'Width'},\n\t\t\t\t\t{type: 'label', text: 'x'},\n\t\t\t\t\t{name: 'height', type: 'textbox', maxLength: 5, size: 3, onchange: recalcSize, ariaLabel: 'Height'},\n\t\t\t\t\t{name: 'constrain', type: 'checkbox', checked: true, text: 'Constrain proportions'}\n\t\t\t\t]\n\t\t\t});\n\t\t}\n\n\t\tgeneralFormItems.push(classListCtrl);\n\n\t\t// WP\n\t\teditor.fire( 'wpLoadImageForm', { data: generalFormItems } );\n\n\t\tfunction mergeMargins(css) {\n\t\t\tif (css.margin) {\n\n\t\t\t\tvar splitMargin = css.margin.split(\" \");\n\n\t\t\t\tswitch (splitMargin.length) {\n\t\t\t\t\tcase 1: //margin: toprightbottomleft;\n\t\t\t\t\t\tcss['margin-top'] = css['margin-top'] || splitMargin[0];\n\t\t\t\t\t\tcss['margin-right'] = css['margin-right'] || splitMargin[0];\n\t\t\t\t\t\tcss['margin-bottom'] = css['margin-bottom'] || splitMargin[0];\n\t\t\t\t\t\tcss['margin-left'] = css['margin-left'] || splitMargin[0];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2: //margin: topbottom rightleft;\n\t\t\t\t\t\tcss['margin-top'] = css['margin-top'] || splitMargin[0];\n\t\t\t\t\t\tcss['margin-right'] = css['margin-right'] || splitMargin[1];\n\t\t\t\t\t\tcss['margin-bottom'] = css['margin-bottom'] || splitMargin[0];\n\t\t\t\t\t\tcss['margin-left'] = css['margin-left'] || splitMargin[1];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3: //margin: top rightleft bottom;\n\t\t\t\t\t\tcss['margin-top'] = css['margin-top'] || splitMargin[0];\n\t\t\t\t\t\tcss['margin-right'] = css['margin-right'] || splitMargin[1];\n\t\t\t\t\t\tcss['margin-bottom'] = css['margin-bottom'] || splitMargin[2];\n\t\t\t\t\t\tcss['margin-left'] = css['margin-left'] || splitMargin[1];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4: //margin: top right bottom left;\n\t\t\t\t\t\tcss['margin-top'] = css['margin-top'] || splitMargin[0];\n\t\t\t\t\t\tcss['margin-right'] = css['margin-right'] || splitMargin[1];\n\t\t\t\t\t\tcss['margin-bottom'] = css['margin-bottom'] || splitMargin[2];\n\t\t\t\t\t\tcss['margin-left'] = css['margin-left'] || splitMargin[3];\n\t\t\t\t}\n\t\t\t\tdelete css.margin;\n\t\t\t}\n\t\t\treturn css;\n\t\t}\n\n\t\tfunction updateStyle() {\n\t\t\tfunction addPixelSuffix(value) {\n\t\t\t\tif (value.length > 0 && /^[0-9]+$/.test(value)) {\n\t\t\t\t\tvalue += 'px';\n\t\t\t\t}\n\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tif (!editor.settings.image_advtab) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar data = win.toJSON(),\n\t\t\t\tcss = dom.parseStyle(data.style);\n\n\t\t\tcss = mergeMargins(css);\n\n\t\t\tif (data.vspace) {\n\t\t\t\tcss['margin-top'] = css['margin-bottom'] = addPixelSuffix(data.vspace);\n\t\t\t}\n\t\t\tif (data.hspace) {\n\t\t\t\tcss['margin-left'] = css['margin-right'] = addPixelSuffix(data.hspace);\n\t\t\t}\n\t\t\tif (data.border) {\n\t\t\t\tcss['border-width'] = addPixelSuffix(data.border);\n\t\t\t}\n\n\t\t\twin.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css))));\n\t\t}\n\n\t\tfunction updateVSpaceHSpaceBorder() {\n\t\t\tif (!editor.settings.image_advtab) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar data = win.toJSON(),\n\t\t\t\tcss = dom.parseStyle(data.style);\n\n\t\t\twin.find('#vspace').value(\"\");\n\t\t\twin.find('#hspace').value(\"\");\n\n\t\t\tcss = mergeMargins(css);\n\n\t\t\t//Move opposite equal margins to vspace/hspace field\n\t\t\tif ((css['margin-top'] && css['margin-bottom']) || (css['margin-right'] && css['margin-left'])) {\n\t\t\t\tif (css['margin-top'] === css['margin-bottom']) {\n\t\t\t\t\twin.find('#vspace').value(removePixelSuffix(css['margin-top']));\n\t\t\t\t} else {\n\t\t\t\t\twin.find('#vspace').value('');\n\t\t\t\t}\n\t\t\t\tif (css['margin-right'] === css['margin-left']) {\n\t\t\t\t\twin.find('#hspace').value(removePixelSuffix(css['margin-right']));\n\t\t\t\t} else {\n\t\t\t\t\twin.find('#hspace').value('');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Move border-width\n\t\t\tif (css['border-width']) {\n\t\t\t\twin.find('#border').value(removePixelSuffix(css['border-width']));\n\t\t\t}\n\n\t\t\twin.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css))));\n\n\t\t}\n\n\t\tif (editor.settings.image_advtab) {\n\t\t\t// Parse styles from img\n\t\t\tif (imgElm) {\n\t\t\t\tif (imgElm.style.marginLeft && imgElm.style.marginRight && imgElm.style.marginLeft === imgElm.style.marginRight) {\n\t\t\t\t\tdata.hspace = removePixelSuffix(imgElm.style.marginLeft);\n\t\t\t\t}\n\t\t\t\tif (imgElm.style.marginTop && imgElm.style.marginBottom && imgElm.style.marginTop === imgElm.style.marginBottom) {\n\t\t\t\t\tdata.vspace = removePixelSuffix(imgElm.style.marginTop);\n\t\t\t\t}\n\t\t\t\tif (imgElm.style.borderWidth) {\n\t\t\t\t\tdata.border = removePixelSuffix(imgElm.style.borderWidth);\n\t\t\t\t}\n\n\t\t\t\tdata.style = editor.dom.serializeStyle(editor.dom.parseStyle(editor.dom.getAttrib(imgElm, 'style')));\n\t\t\t}\n\n\t\t\t// Advanced dialog shows general+advanced tabs\n\t\t\twin = editor.windowManager.open({\n\t\t\t\ttitle: 'Insert/edit image',\n\t\t\t\tdata: data,\n\t\t\t\tbodyType: 'tabpanel',\n\t\t\t\tbody: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: 'General',\n\t\t\t\t\t\ttype: 'form',\n\t\t\t\t\t\titems: generalFormItems\n\t\t\t\t\t},\n\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: 'Advanced',\n\t\t\t\t\t\ttype: 'form',\n\t\t\t\t\t\tpack: 'start',\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Style',\n\t\t\t\t\t\t\t\tname: 'style',\n\t\t\t\t\t\t\t\ttype: 'textbox',\n\t\t\t\t\t\t\t\tonchange: updateVSpaceHSpaceBorder\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: 'form',\n\t\t\t\t\t\t\t\tlayout: 'grid',\n\t\t\t\t\t\t\t\tpackV: 'start',\n\t\t\t\t\t\t\t\tcolumns: 2,\n\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\talignH: ['left', 'right'],\n\t\t\t\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t\t\t\ttype: 'textbox',\n\t\t\t\t\t\t\t\t\tmaxWidth: 50,\n\t\t\t\t\t\t\t\t\tonchange: updateStyle\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t\t{label: 'Vertical space', name: 'vspace'},\n\t\t\t\t\t\t\t\t\t{label: 'Horizontal space', name: 'hspace'},\n\t\t\t\t\t\t\t\t\t{label: 'Border', name: 'border'}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tonSubmit: onSubmitForm\n\t\t\t});\n\t\t} else {\n\t\t\t// Simple default dialog\n\t\t\twin = editor.windowManager.open({\n\t\t\t\ttitle: 'Insert/edit image',\n\t\t\t\tdata: data,\n\t\t\t\tbody: generalFormItems,\n\t\t\t\tonSubmit: onSubmitForm\n\t\t\t});\n\t\t}\n\t}\n\n\teditor.addButton('image', {\n\t\ticon: 'image',\n\t\ttooltip: 'Insert/edit image',\n\t\tonclick: createImageList(showDialog),\n\t\tstateSelector: 'img:not([data-mce-object],[data-mce-placeholder])'\n\t});\n\n\teditor.addMenuItem('image', {\n\t\ticon: 'image',\n\t\ttext: 'Insert/edit image',\n\t\tonclick: createImageList(showDialog),\n\t\tcontext: 'insert',\n\t\tprependToContext: true\n\t});\n\n\teditor.addCommand('mceImage', createImageList(showDialog));\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/lists/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n/*eslint consistent-this:0 */\n\ntinymce.PluginManager.add('lists', function(editor) {\n\tvar self = this;\n\n\tfunction isListNode(node) {\n\t\treturn node && (/^(OL|UL|DL)$/).test(node.nodeName);\n\t}\n\n\tfunction isFirstChild(node) {\n\t\treturn node.parentNode.firstChild == node;\n\t}\n\n\tfunction isLastChild(node) {\n\t\treturn node.parentNode.lastChild == node;\n\t}\n\n\tfunction isTextBlock(node) {\n\t\treturn node && !!editor.schema.getTextBlockElements()[node.nodeName];\n\t}\n\n\tfunction isEditorBody(elm) {\n\t\treturn elm === editor.getBody();\n\t}\n\n\teditor.on('init', function() {\n\t\tvar dom = editor.dom, selection = editor.selection;\n\n\t\tfunction isEmpty(elm, keepBookmarks) {\n\t\t\tvar empty = dom.isEmpty(elm);\n\n\t\t\tif (keepBookmarks && dom.select('span[data-mce-type=bookmark]').length > 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn empty;\n\t\t}\n\n\t\t/**\n\t\t * Returns a range bookmark. This will convert indexed bookmarks into temporary span elements with\n\t\t * index 0 so that they can be restored properly after the DOM has been modified. Text bookmarks will not have spans\n\t\t * added to them since they can be restored after a dom operation.\n\t\t *\n\t\t * So this: <p><b>|</b><b>|</b></p>\n\t\t * becomes: <p><b><span data-mce-type=\"bookmark\">|</span></b><b data-mce-type=\"bookmark\">|</span></b></p>\n\t\t *\n\t\t * @param  {DOMRange} rng DOM Range to get bookmark on.\n\t\t * @return {Object} Bookmark object.\n\t\t */\n\t\tfunction createBookmark(rng) {\n\t\t\tvar bookmark = {};\n\n\t\t\tfunction setupEndPoint(start) {\n\t\t\t\tvar offsetNode, container, offset;\n\n\t\t\t\tcontainer = rng[start ? 'startContainer' : 'endContainer'];\n\t\t\t\toffset = rng[start ? 'startOffset' : 'endOffset'];\n\n\t\t\t\tif (container.nodeType == 1) {\n\t\t\t\t\toffsetNode = dom.create('span', {'data-mce-type': 'bookmark'});\n\n\t\t\t\t\tif (container.hasChildNodes()) {\n\t\t\t\t\t\toffset = Math.min(offset, container.childNodes.length - 1);\n\n\t\t\t\t\t\tif (start) {\n\t\t\t\t\t\t\tcontainer.insertBefore(offsetNode, container.childNodes[offset]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdom.insertAfter(offsetNode, container.childNodes[offset]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontainer.appendChild(offsetNode);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontainer = offsetNode;\n\t\t\t\t\toffset = 0;\n\t\t\t\t}\n\n\t\t\t\tbookmark[start ? 'startContainer' : 'endContainer'] = container;\n\t\t\t\tbookmark[start ? 'startOffset' : 'endOffset'] = offset;\n\t\t\t}\n\n\t\t\tsetupEndPoint(true);\n\n\t\t\tif (!rng.collapsed) {\n\t\t\t\tsetupEndPoint();\n\t\t\t}\n\n\t\t\treturn bookmark;\n\t\t}\n\n\t\t/**\n\t\t * Moves the selection to the current bookmark and removes any selection container wrappers.\n\t\t *\n\t\t * @param {Object} bookmark Bookmark object to move selection to.\n\t\t */\n\t\tfunction moveToBookmark(bookmark) {\n\t\t\tfunction restoreEndPoint(start) {\n\t\t\t\tvar container, offset, node;\n\n\t\t\t\tfunction nodeIndex(container) {\n\t\t\t\t\tvar node = container.parentNode.firstChild, idx = 0;\n\n\t\t\t\t\twhile (node) {\n\t\t\t\t\t\tif (node == container) {\n\t\t\t\t\t\t\treturn idx;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Skip data-mce-type=bookmark nodes\n\t\t\t\t\t\tif (node.nodeType != 1 || node.getAttribute('data-mce-type') != 'bookmark') {\n\t\t\t\t\t\t\tidx++;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\n\t\t\t\tcontainer = node = bookmark[start ? 'startContainer' : 'endContainer'];\n\t\t\t\toffset = bookmark[start ? 'startOffset' : 'endOffset'];\n\n\t\t\t\tif (!container) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (container.nodeType == 1) {\n\t\t\t\t\toffset = nodeIndex(container);\n\t\t\t\t\tcontainer = container.parentNode;\n\t\t\t\t\tdom.remove(node);\n\t\t\t\t}\n\n\t\t\t\tbookmark[start ? 'startContainer' : 'endContainer'] = container;\n\t\t\t\tbookmark[start ? 'startOffset' : 'endOffset'] = offset;\n\t\t\t}\n\n\t\t\trestoreEndPoint(true);\n\t\t\trestoreEndPoint();\n\n\t\t\tvar rng = dom.createRng();\n\n\t\t\trng.setStart(bookmark.startContainer, bookmark.startOffset);\n\n\t\t\tif (bookmark.endContainer) {\n\t\t\t\trng.setEnd(bookmark.endContainer, bookmark.endOffset);\n\t\t\t}\n\n\t\t\tselection.setRng(rng);\n\t\t}\n\n\t\tfunction createNewTextBlock(contentNode, blockName) {\n\t\t\tvar node, textBlock, fragment = dom.createFragment(), hasContentNode;\n\t\t\tvar blockElements = editor.schema.getBlockElements();\n\n\t\t\tif (editor.settings.forced_root_block) {\n\t\t\t\tblockName = blockName || editor.settings.forced_root_block;\n\t\t\t}\n\n\t\t\tif (blockName) {\n\t\t\t\ttextBlock = dom.create(blockName);\n\n\t\t\t\tif (textBlock.tagName === editor.settings.forced_root_block) {\n\t\t\t\t\tdom.setAttribs(textBlock, editor.settings.forced_root_block_attrs);\n\t\t\t\t}\n\n\t\t\t\tfragment.appendChild(textBlock);\n\t\t\t}\n\n\t\t\tif (contentNode) {\n\t\t\t\twhile ((node = contentNode.firstChild)) {\n\t\t\t\t\tvar nodeName = node.nodeName;\n\n\t\t\t\t\tif (!hasContentNode && (nodeName != 'SPAN' || node.getAttribute('data-mce-type') != 'bookmark')) {\n\t\t\t\t\t\thasContentNode = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (blockElements[nodeName]) {\n\t\t\t\t\t\tfragment.appendChild(node);\n\t\t\t\t\t\ttextBlock = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (blockName) {\n\t\t\t\t\t\t\tif (!textBlock) {\n\t\t\t\t\t\t\t\ttextBlock = dom.create(blockName);\n\t\t\t\t\t\t\t\tfragment.appendChild(textBlock);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttextBlock.appendChild(node);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfragment.appendChild(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!editor.settings.forced_root_block) {\n\t\t\t\tfragment.appendChild(dom.create('br'));\n\t\t\t} else {\n\t\t\t\t// BR is needed in empty blocks on non IE browsers\n\t\t\t\tif (!hasContentNode && (!tinymce.Env.ie || tinymce.Env.ie > 10)) {\n\t\t\t\t\ttextBlock.appendChild(dom.create('br', {'data-mce-bogus': '1'}));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn fragment;\n\t\t}\n\n\t\tfunction getSelectedListItems() {\n\t\t\treturn tinymce.grep(selection.getSelectedBlocks(), function(block) {\n\t\t\t\treturn /^(LI|DT|DD)$/.test(block.nodeName);\n\t\t\t});\n\t\t}\n\n\t\tfunction splitList(ul, li, newBlock) {\n\t\t\tvar tmpRng, fragment, bookmarks, node;\n\n\t\t\tfunction removeAndKeepBookmarks(targetNode) {\n\t\t\t\ttinymce.each(bookmarks, function(node) {\n\t\t\t\t\ttargetNode.parentNode.insertBefore(node, li.parentNode);\n\t\t\t\t});\n\n\t\t\t\tdom.remove(targetNode);\n\t\t\t}\n\n\t\t\tbookmarks = dom.select('span[data-mce-type=\"bookmark\"]', ul);\n\t\t\tnewBlock = newBlock || createNewTextBlock(li);\n\t\t\ttmpRng = dom.createRng();\n\t\t\ttmpRng.setStartAfter(li);\n\t\t\ttmpRng.setEndAfter(ul);\n\t\t\tfragment = tmpRng.extractContents();\n\n\t\t\tfor (node = fragment.firstChild; node; node = node.firstChild) {\n\t\t\t\tif (node.nodeName == 'LI' && dom.isEmpty(node)) {\n\t\t\t\t\tdom.remove(node);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!dom.isEmpty(fragment)) {\n\t\t\t\tdom.insertAfter(fragment, ul);\n\t\t\t}\n\n\t\t\tdom.insertAfter(newBlock, ul);\n\n\t\t\tif (isEmpty(li.parentNode)) {\n\t\t\t\tremoveAndKeepBookmarks(li.parentNode);\n\t\t\t}\n\n\t\t\tdom.remove(li);\n\n\t\t\tif (isEmpty(ul)) {\n\t\t\t\tdom.remove(ul);\n\t\t\t}\n\t\t}\n\n\t\tfunction mergeWithAdjacentLists(listBlock) {\n\t\t\tvar sibling, node;\n\n\t\t\tsibling = listBlock.nextSibling;\n\t\t\tif (sibling && isListNode(sibling) && sibling.nodeName == listBlock.nodeName) {\n\t\t\t\twhile ((node = sibling.firstChild)) {\n\t\t\t\t\tlistBlock.appendChild(node);\n\t\t\t\t}\n\n\t\t\t\tdom.remove(sibling);\n\t\t\t}\n\n\t\t\tsibling = listBlock.previousSibling;\n\t\t\tif (sibling && isListNode(sibling) && sibling.nodeName == listBlock.nodeName) {\n\t\t\t\twhile ((node = sibling.firstChild)) {\n\t\t\t\t\tlistBlock.insertBefore(node, listBlock.firstChild);\n\t\t\t\t}\n\n\t\t\t\tdom.remove(sibling);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Normalizes the all lists in the specified element.\n\t\t */\n\t\tfunction normalizeList(element) {\n\t\t\ttinymce.each(tinymce.grep(dom.select('ol,ul', element)), function(ul) {\n\t\t\t\tvar sibling, parentNode = ul.parentNode;\n\n\t\t\t\t// Move UL/OL to previous LI if it's the only child of a LI\n\t\t\t\tif (parentNode.nodeName == 'LI' && parentNode.firstChild == ul) {\n\t\t\t\t\tsibling = parentNode.previousSibling;\n\t\t\t\t\tif (sibling && sibling.nodeName == 'LI') {\n\t\t\t\t\t\tsibling.appendChild(ul);\n\n\t\t\t\t\t\tif (isEmpty(parentNode)) {\n\t\t\t\t\t\t\tdom.remove(parentNode);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Append OL/UL to previous LI if it's in a parent OL/UL i.e. old HTML4\n\t\t\t\tif (isListNode(parentNode)) {\n\t\t\t\t\tsibling = parentNode.previousSibling;\n\t\t\t\t\tif (sibling && sibling.nodeName == 'LI') {\n\t\t\t\t\t\tsibling.appendChild(ul);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction outdent(li) {\n\t\t\tvar ul = li.parentNode, ulParent = ul.parentNode, newBlock;\n\n\t\t\tfunction removeEmptyLi(li) {\n\t\t\t\tif (isEmpty(li)) {\n\t\t\t\t\tdom.remove(li);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isEditorBody(ul)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (li.nodeName == 'DD') {\n\t\t\t\tdom.rename(li, 'DT');\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (isFirstChild(li) && isLastChild(li)) {\n\t\t\t\tif (ulParent.nodeName == \"LI\") {\n\t\t\t\t\tdom.insertAfter(li, ulParent);\n\t\t\t\t\tremoveEmptyLi(ulParent);\n\t\t\t\t\tdom.remove(ul);\n\t\t\t\t} else if (isListNode(ulParent)) {\n\t\t\t\t\tdom.remove(ul, true);\n\t\t\t\t} else {\n\t\t\t\t\tulParent.insertBefore(createNewTextBlock(li), ul);\n\t\t\t\t\tdom.remove(ul);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} else if (isFirstChild(li)) {\n\t\t\t\tif (ulParent.nodeName == \"LI\") {\n\t\t\t\t\tdom.insertAfter(li, ulParent);\n\t\t\t\t\tli.appendChild(ul);\n\t\t\t\t\tremoveEmptyLi(ulParent);\n\t\t\t\t} else if (isListNode(ulParent)) {\n\t\t\t\t\tulParent.insertBefore(li, ul);\n\t\t\t\t} else {\n\t\t\t\t\tulParent.insertBefore(createNewTextBlock(li), ul);\n\t\t\t\t\tdom.remove(li);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} else if (isLastChild(li)) {\n\t\t\t\tif (ulParent.nodeName == \"LI\") {\n\t\t\t\t\tdom.insertAfter(li, ulParent);\n\t\t\t\t} else if (isListNode(ulParent)) {\n\t\t\t\t\tdom.insertAfter(li, ul);\n\t\t\t\t} else {\n\t\t\t\t\tdom.insertAfter(createNewTextBlock(li), ul);\n\t\t\t\t\tdom.remove(li);\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (ulParent.nodeName == 'LI') {\n\t\t\t\tul = ulParent;\n\t\t\t\tnewBlock = createNewTextBlock(li, 'LI');\n\t\t\t} else if (isListNode(ulParent)) {\n\t\t\t\tnewBlock = createNewTextBlock(li, 'LI');\n\t\t\t} else {\n\t\t\t\tnewBlock = createNewTextBlock(li);\n\t\t\t}\n\n\t\t\tsplitList(ul, li, newBlock);\n\t\t\tnormalizeList(ul.parentNode);\n\n\t\t\treturn true;\n\t\t}\n\n\t\tfunction indent(li) {\n\t\t\tvar sibling, newList;\n\n\t\t\tfunction mergeLists(from, to) {\n\t\t\t\tvar node;\n\n\t\t\t\tif (isListNode(from)) {\n\t\t\t\t\twhile ((node = li.lastChild.firstChild)) {\n\t\t\t\t\t\tto.appendChild(node);\n\t\t\t\t\t}\n\n\t\t\t\t\tdom.remove(from);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (li.nodeName == 'DT') {\n\t\t\t\tdom.rename(li, 'DD');\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tsibling = li.previousSibling;\n\n\t\t\tif (sibling && isListNode(sibling)) {\n\t\t\t\tsibling.appendChild(li);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (sibling && sibling.nodeName == 'LI' && isListNode(sibling.lastChild)) {\n\t\t\t\tsibling.lastChild.appendChild(li);\n\t\t\t\tmergeLists(li.lastChild, sibling.lastChild);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tsibling = li.nextSibling;\n\n\t\t\tif (sibling && isListNode(sibling)) {\n\t\t\t\tsibling.insertBefore(li, sibling.firstChild);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (sibling && sibling.nodeName == 'LI' && isListNode(li.lastChild)) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tsibling = li.previousSibling;\n\t\t\tif (sibling && sibling.nodeName == 'LI') {\n\t\t\t\tnewList = dom.create(li.parentNode.nodeName);\n\t\t\t\tsibling.appendChild(newList);\n\t\t\t\tnewList.appendChild(li);\n\t\t\t\tmergeLists(li.lastChild, newList);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction indentSelection() {\n\t\t\tvar listElements = getSelectedListItems();\n\n\t\t\tif (listElements.length) {\n\t\t\t\tvar bookmark = createBookmark(selection.getRng(true));\n\n\t\t\t\tfor (var i = 0; i < listElements.length; i++) {\n\t\t\t\t\tif (!indent(listElements[i]) && i === 0) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmoveToBookmark(bookmark);\n\t\t\t\teditor.nodeChanged();\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tfunction outdentSelection() {\n\t\t\tvar listElements = getSelectedListItems();\n\n\t\t\tif (listElements.length) {\n\t\t\t\tvar bookmark = createBookmark(selection.getRng(true));\n\t\t\t\tvar i, y, root = editor.getBody();\n\n\t\t\t\ti = listElements.length;\n\t\t\t\twhile (i--) {\n\t\t\t\t\tvar node = listElements[i].parentNode;\n\n\t\t\t\t\twhile (node && node != root) {\n\t\t\t\t\t\ty = listElements.length;\n\t\t\t\t\t\twhile (y--) {\n\t\t\t\t\t\t\tif (listElements[y] === node) {\n\t\t\t\t\t\t\t\tlistElements.splice(i, 1);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnode = node.parentNode;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0; i < listElements.length; i++) {\n\t\t\t\t\tif (!outdent(listElements[i]) && i === 0) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmoveToBookmark(bookmark);\n\t\t\t\teditor.nodeChanged();\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tfunction applyList(listName) {\n\t\t\tvar rng = selection.getRng(true), bookmark = createBookmark(rng), listItemName = 'LI';\n\n\t\t\tlistName = listName.toUpperCase();\n\n\t\t\tif (listName == 'DL') {\n\t\t\t\tlistItemName = 'DT';\n\t\t\t}\n\n\t\t\tfunction getSelectedTextBlocks() {\n\t\t\t\tvar textBlocks = [], root = editor.getBody();\n\n\t\t\t\tfunction getEndPointNode(start) {\n\t\t\t\t\tvar container, offset;\n\n\t\t\t\t\tcontainer = rng[start ? 'startContainer' : 'endContainer'];\n\t\t\t\t\toffset = rng[start ? 'startOffset' : 'endOffset'];\n\n\t\t\t\t\t// Resolve node index\n\t\t\t\t\tif (container.nodeType == 1) {\n\t\t\t\t\t\tcontainer = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;\n\t\t\t\t\t}\n\n\t\t\t\t\twhile (container.parentNode != root) {\n\t\t\t\t\t\tif (isTextBlock(container)) {\n\t\t\t\t\t\t\treturn container;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (/^(TD|TH)$/.test(container.parentNode.nodeName)) {\n\t\t\t\t\t\t\treturn container;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontainer = container.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn container;\n\t\t\t\t}\n\n\t\t\t\tvar startNode = getEndPointNode(true);\n\t\t\t\tvar endNode = getEndPointNode();\n\t\t\t\tvar block, siblings = [];\n\n\t\t\t\tfor (var node = startNode; node; node = node.nextSibling) {\n\t\t\t\t\tsiblings.push(node);\n\n\t\t\t\t\tif (node == endNode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttinymce.each(siblings, function(node) {\n\t\t\t\t\tif (isTextBlock(node)) {\n\t\t\t\t\t\ttextBlocks.push(node);\n\t\t\t\t\t\tblock = null;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (dom.isBlock(node) || node.nodeName == 'BR') {\n\t\t\t\t\t\tif (node.nodeName == 'BR') {\n\t\t\t\t\t\t\tdom.remove(node);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tblock = null;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar nextSibling = node.nextSibling;\n\t\t\t\t\tif (tinymce.dom.BookmarkManager.isBookmarkNode(node)) {\n\t\t\t\t\t\tif (isTextBlock(nextSibling) || (!nextSibling && node.parentNode == root)) {\n\t\t\t\t\t\t\tblock = null;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!block) {\n\t\t\t\t\t\tblock = dom.create('p');\n\t\t\t\t\t\tnode.parentNode.insertBefore(block, node);\n\t\t\t\t\t\ttextBlocks.push(block);\n\t\t\t\t\t}\n\n\t\t\t\t\tblock.appendChild(node);\n\t\t\t\t});\n\n\t\t\t\treturn textBlocks;\n\t\t\t}\n\n\t\t\ttinymce.each(getSelectedTextBlocks(), function(block) {\n\t\t\t\tvar listBlock, sibling;\n\n\t\t\t\tsibling = block.previousSibling;\n\t\t\t\tif (sibling && isListNode(sibling) && sibling.nodeName == listName) {\n\t\t\t\t\tlistBlock = sibling;\n\t\t\t\t\tblock = dom.rename(block, listItemName);\n\t\t\t\t\tsibling.appendChild(block);\n\t\t\t\t} else {\n\t\t\t\t\tlistBlock = dom.create(listName);\n\t\t\t\t\tblock.parentNode.insertBefore(listBlock, block);\n\t\t\t\t\tlistBlock.appendChild(block);\n\t\t\t\t\tblock = dom.rename(block, listItemName);\n\t\t\t\t}\n\n\t\t\t\tmergeWithAdjacentLists(listBlock);\n\t\t\t});\n\n\t\t\tmoveToBookmark(bookmark);\n\t\t}\n\n\t\tfunction removeList() {\n\t\t\tvar bookmark = createBookmark(selection.getRng(true)), root = editor.getBody();\n\n\t\t\ttinymce.each(getSelectedListItems(), function(li) {\n\t\t\t\tvar node, rootList;\n\n\t\t\t\tif (isEditorBody(li.parentNode)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (isEmpty(li)) {\n\t\t\t\t\toutdent(li);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (node = li; node && node != root; node = node.parentNode) {\n\t\t\t\t\tif (isListNode(node)) {\n\t\t\t\t\t\trootList = node;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsplitList(rootList, li);\n\t\t\t});\n\n\t\t\tmoveToBookmark(bookmark);\n\t\t}\n\n\t\tfunction toggleList(listName) {\n\t\t\tvar parentList = dom.getParent(selection.getStart(), 'OL,UL,DL');\n\n\t\t\tif (isEditorBody(parentList)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (parentList) {\n\t\t\t\tif (parentList.nodeName == listName) {\n\t\t\t\t\tremoveList(listName);\n\t\t\t\t} else {\n\t\t\t\t\tvar bookmark = createBookmark(selection.getRng(true));\n\t\t\t\t\tmergeWithAdjacentLists(dom.rename(parentList, listName));\n\t\t\t\t\tmoveToBookmark(bookmark);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tapplyList(listName);\n\t\t\t}\n\t\t}\n\n\t\tfunction queryListCommandState(listName) {\n\t\t\treturn function() {\n\t\t\t\tvar parentList = dom.getParent(editor.selection.getStart(), 'UL,OL,DL');\n\n\t\t\t\treturn parentList && parentList.nodeName == listName;\n\t\t\t};\n\t\t}\n\n\t\tself.backspaceDelete = function(isForward) {\n\t\t\tfunction findNextCaretContainer(rng, isForward) {\n\t\t\t\tvar node = rng.startContainer, offset = rng.startOffset;\n\t\t\t\tvar nonEmptyBlocks, walker;\n\n\t\t\t\tif (node.nodeType == 3 && (isForward ? offset < node.data.length : offset > 0)) {\n\t\t\t\t\treturn node;\n\t\t\t\t}\n\n\t\t\t\tnonEmptyBlocks = editor.schema.getNonEmptyElements();\n\t\t\t\twalker = new tinymce.dom.TreeWalker(rng.startContainer);\n\n\t\t\t\twhile ((node = walker[isForward ? 'next' : 'prev']())) {\n\t\t\t\t\tif (node.nodeName == 'LI' && !node.hasChildNodes()) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nonEmptyBlocks[node.nodeName]) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (node.nodeType == 3 && node.data.length > 0) {\n\t\t\t\t\t\treturn node;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction mergeLiElements(fromElm, toElm) {\n\t\t\t\tvar node, listNode, ul = fromElm.parentNode;\n\n\t\t\t\tif (isListNode(toElm.lastChild)) {\n\t\t\t\t\tlistNode = toElm.lastChild;\n\t\t\t\t}\n\n\t\t\t\tnode = toElm.lastChild;\n\t\t\t\tif (node && node.nodeName == 'BR' && fromElm.hasChildNodes()) {\n\t\t\t\t\tdom.remove(node);\n\t\t\t\t}\n\n\t\t\t\tif (isEmpty(toElm, true)) {\n\t\t\t\t\tdom.$(toElm).empty();\n\t\t\t\t}\n\n\t\t\t\tif (!isEmpty(fromElm, true)) {\n\t\t\t\t\twhile ((node = fromElm.firstChild)) {\n\t\t\t\t\t\ttoElm.appendChild(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (listNode) {\n\t\t\t\t\ttoElm.appendChild(listNode);\n\t\t\t\t}\n\n\t\t\t\tdom.remove(fromElm);\n\n\t\t\t\tif (isEmpty(ul) && !isEditorBody(ul)) {\n\t\t\t\t\tdom.remove(ul);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (selection.isCollapsed()) {\n\t\t\t\tvar li = dom.getParent(selection.getStart(), 'LI'), ul, rng, otherLi;\n\n\t\t\t\tif (li) {\n\t\t\t\t\tul = li.parentNode;\n\t\t\t\t\tif (isEditorBody(ul) && dom.isEmpty(ul)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\trng = selection.getRng(true);\n\t\t\t\t\totherLi = dom.getParent(findNextCaretContainer(rng, isForward), 'LI');\n\n\t\t\t\t\tif (otherLi && otherLi != li) {\n\t\t\t\t\t\tvar bookmark = createBookmark(rng);\n\n\t\t\t\t\t\tif (isForward) {\n\t\t\t\t\t\t\tmergeLiElements(otherLi, li);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tmergeLiElements(li, otherLi);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmoveToBookmark(bookmark);\n\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t} else if (!otherLi) {\n\t\t\t\t\t\tif (!isForward && removeList(ul.nodeName)) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\teditor.on('BeforeExecCommand', function(e) {\n\t\t\tvar cmd = e.command.toLowerCase(), isHandled;\n\n\t\t\tif (cmd == \"indent\") {\n\t\t\t\tif (indentSelection()) {\n\t\t\t\t\tisHandled = true;\n\t\t\t\t}\n\t\t\t} else if (cmd == \"outdent\") {\n\t\t\t\tif (outdentSelection()) {\n\t\t\t\t\tisHandled = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isHandled) {\n\t\t\t\teditor.fire('ExecCommand', {command: e.command});\n\t\t\t\te.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\n\t\teditor.addCommand('InsertUnorderedList', function() {\n\t\t\ttoggleList('UL');\n\t\t});\n\n\t\teditor.addCommand('InsertOrderedList', function() {\n\t\t\ttoggleList('OL');\n\t\t});\n\n\t\teditor.addCommand('InsertDefinitionList', function() {\n\t\t\ttoggleList('DL');\n\t\t});\n\n\t\teditor.addQueryStateHandler('InsertUnorderedList', queryListCommandState('UL'));\n\t\teditor.addQueryStateHandler('InsertOrderedList', queryListCommandState('OL'));\n\t\teditor.addQueryStateHandler('InsertDefinitionList', queryListCommandState('DL'));\n\n\t\teditor.on('keydown', function(e) {\n\t\t\t// Check for tab but not ctrl/cmd+tab since it switches browser tabs\n\t\t\tif (e.keyCode != 9 || tinymce.util.VK.metaKeyPressed(e)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (editor.dom.getParent(editor.selection.getStart(), 'LI,DT,DD')) {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\toutdentSelection();\n\t\t\t\t} else {\n\t\t\t\t\tindentSelection();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\teditor.addButton('indent', {\n\t\ticon: 'indent',\n\t\ttitle: 'Increase indent',\n\t\tcmd: 'Indent',\n\t\tonPostRender: function() {\n\t\t\tvar ctrl = this;\n\n\t\t\teditor.on('nodechange', function() {\n\t\t\t\tvar blocks = editor.selection.getSelectedBlocks();\n\t\t\t\tvar disable = false;\n\n\t\t\t\tfor (var i = 0, l = blocks.length; !disable && i < l; i++) {\n\t\t\t\t\tvar tag = blocks[i].nodeName;\n\n\t\t\t\t\tdisable = (tag == 'LI' && isFirstChild(blocks[i]) || tag == 'UL' || tag == 'OL' || tag == 'DD');\n\t\t\t\t}\n\n\t\t\t\tctrl.disabled(disable);\n\t\t\t});\n\t\t}\n\t});\n\n\teditor.on('keydown', function(e) {\n\t\tif (e.keyCode == tinymce.util.VK.BACKSPACE) {\n\t\t\tif (self.backspaceDelete()) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t} else if (e.keyCode == tinymce.util.VK.DELETE) {\n\t\t\tif (self.backspaceDelete(true)) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t}\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/media/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*jshint maxlen:255 */\n/*eslint max-len:0 */\n/*global tinymce:true */\n\ntinymce.PluginManager.add('media', function(editor, url) {\n\tvar urlPatterns = [\n\t\t{regex: /youtu\\.be\\/([\\w\\-.]+)/, type: 'iframe', w: 425, h: 350, url: '//www.youtube.com/embed/$1', allowFullscreen: true},\n\t\t{regex: /youtube\\.com(.+)v=([^&]+)/, type: 'iframe', w: 425, h: 350, url: '//www.youtube.com/embed/$2', allowFullscreen: true},\n\t\t{regex: /vimeo\\.com\\/([0-9]+)/, type: 'iframe', w: 425, h: 350, url: '//player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc', allowfullscreen: true},\n\t\t{regex: /vimeo\\.com\\/(.*)\\/([0-9]+)/, type: \"iframe\", w: 425, h: 350, url: \"//player.vimeo.com/video/$2?title=0&amp;byline=0\", allowfullscreen: true},\n\t\t{regex: /maps\\.google\\.([a-z]{2,3})\\/maps\\/(.+)msid=(.+)/, type: 'iframe', w: 425, h: 350, url: '//maps.google.com/maps/ms?msid=$2&output=embed\"', allowFullscreen: false}\n\t];\n\n\tvar embedChange = (tinymce.Env.ie && tinymce.Env.ie <= 8) ? 'onChange' : 'onInput';\n\n\tfunction guessMime(url) {\n\t\turl = url.toLowerCase();\n\n\t\tif (url.indexOf('.mp3') != -1) {\n\t\t\treturn 'audio/mpeg';\n\t\t}\n\n\t\tif (url.indexOf('.wav') != -1) {\n\t\t\treturn 'audio/wav';\n\t\t}\n\n\t\tif (url.indexOf('.mp4') != -1) {\n\t\t\treturn 'video/mp4';\n\t\t}\n\n\t\tif (url.indexOf('.webm') != -1) {\n\t\t\treturn 'video/webm';\n\t\t}\n\n\t\tif (url.indexOf('.ogg') != -1) {\n\t\t\treturn 'video/ogg';\n\t\t}\n\n\t\tif (url.indexOf('.swf') != -1) {\n\t\t\treturn 'application/x-shockwave-flash';\n\t\t}\n\n\t\treturn '';\n\t}\n\n\tfunction getVideoScriptMatch(src) {\n\t\tvar prefixes = editor.settings.media_scripts;\n\n\t\tif (prefixes) {\n\t\t\tfor (var i = 0; i < prefixes.length; i++) {\n\t\t\t\tif (src.indexOf(prefixes[i].filter) !== -1) {\n\t\t\t\t\treturn prefixes[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction showDialog() {\n\t\tvar win, width, height, data;\n\n\t\tvar generalFormItems = [\n\t\t\t{\n\t\t\t\tname: 'source1',\n\t\t\t\ttype: 'filepicker',\n\t\t\t\tfiletype: 'media',\n\t\t\t\tsize: 40,\n\t\t\t\tautofocus: true,\n\t\t\t\tlabel: 'Source',\n\t\t\t\tonchange: function(e) {\n\t\t\t\t\ttinymce.each(e.meta, function(value, key) {\n\t\t\t\t\t\twin.find('#' + key).value(value);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t];\n\n\t\tfunction recalcSize(e) {\n\t\t\tvar widthCtrl, heightCtrl, newWidth, newHeight;\n\n\t\t\twidthCtrl = win.find('#width')[0];\n\t\t\theightCtrl = win.find('#height')[0];\n\n\t\t\tnewWidth = widthCtrl.value();\n\t\t\tnewHeight = heightCtrl.value();\n\n\t\t\tif (win.find('#constrain')[0].checked() && width && height && newWidth && newHeight) {\n\t\t\t\tif (e.control == widthCtrl) {\n\t\t\t\t\tnewHeight = Math.round((newWidth / width) * newHeight);\n\n\t\t\t\t\tif (!isNaN(newHeight)) {\n\t\t\t\t\t\theightCtrl.value(newHeight);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnewWidth = Math.round((newHeight / height) * newWidth);\n\n\t\t\t\t\tif (!isNaN(newWidth)) {\n\t\t\t\t\t\twidthCtrl.value(newWidth);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\twidth = newWidth;\n\t\t\theight = newHeight;\n\t\t}\n\n\t\tif (editor.settings.media_alt_source !== false) {\n\t\t\tgeneralFormItems.push({name: 'source2', type: 'filepicker', filetype: 'media', size: 40, label: 'Alternative source'});\n\t\t}\n\n\t\tif (editor.settings.media_poster !== false) {\n\t\t\tgeneralFormItems.push({name: 'poster', type: 'filepicker', filetype: 'image', size: 40, label: 'Poster'});\n\t\t}\n\n\t\tif (editor.settings.media_dimensions !== false) {\n\t\t\tgeneralFormItems.push({\n\t\t\t\ttype: 'container',\n\t\t\t\tlabel: 'Dimensions',\n\t\t\t\tlayout: 'flex',\n\t\t\t\talign: 'center',\n\t\t\t\tspacing: 5,\n\t\t\t\titems: [\n\t\t\t\t\t{name: 'width', type: 'textbox', maxLength: 5, size: 3, onchange: recalcSize, ariaLabel: 'Width'},\n\t\t\t\t\t{type: 'label', text: 'x'},\n\t\t\t\t\t{name: 'height', type: 'textbox', maxLength: 5, size: 3, onchange: recalcSize, ariaLabel: 'Height'},\n\t\t\t\t\t{name: 'constrain', type: 'checkbox', checked: true, text: 'Constrain proportions'}\n\t\t\t\t]\n\t\t\t});\n\t\t}\n\n\t\tdata = getData(editor.selection.getNode());\n\t\twidth = data.width;\n\t\theight = data.height;\n\n\t\tvar embedTextBox = {\n\t\t\tid: 'mcemediasource',\n\t\t\ttype: 'textbox',\n\t\t\tflex: 1,\n\t\t\tname: 'embed',\n\t\t\tvalue: getSource(),\n\t\t\tmultiline: true,\n\t\t\tlabel: 'Source'\n\t\t};\n\n\t\tfunction updateValueOnChange() {\n\t\t\tdata = htmlToData(this.value());\n\t\t\tthis.parent().parent().fromJSON(data);\n\t\t}\n\n\t\tembedTextBox[embedChange] = updateValueOnChange;\n\n\t\twin = editor.windowManager.open({\n\t\t\ttitle: 'Insert/edit video',\n\t\t\tdata: data,\n\t\t\tbodyType: 'tabpanel',\n\t\t\tbody: [\n\t\t\t\t{\n\t\t\t\t\ttitle: 'General',\n\t\t\t\t\ttype: \"form\",\n\t\t\t\t\tonShowTab: function() {\n\t\t\t\t\t\tdata = htmlToData(this.next().find('#embed').value());\n\t\t\t\t\t\tthis.fromJSON(data);\n\t\t\t\t\t},\n\t\t\t\t\titems: generalFormItems\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\ttitle: 'Embed',\n\t\t\t\t\ttype: \"container\",\n\t\t\t\t\tlayout: 'flex',\n\t\t\t\t\tdirection: 'column',\n\t\t\t\t\talign: 'stretch',\n\t\t\t\t\tpadding: 10,\n\t\t\t\t\tspacing: 10,\n\t\t\t\t\tonShowTab: function() {\n\t\t\t\t\t\tthis.find('#embed').value(dataToHtml(this.parent().toJSON()));\n\t\t\t\t\t},\n\t\t\t\t\titems: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'label',\n\t\t\t\t\t\t\ttext: 'Paste your embed code below:',\n\t\t\t\t\t\t\tforId: 'mcemediasource'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tembedTextBox\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t],\n\t\t\tonSubmit: function() {\n\t\t\t\tvar beforeObjects, afterObjects, i, y;\n\n\t\t\t\tbeforeObjects = editor.dom.select('img[data-mce-object]');\n\t\t\t\teditor.insertContent(dataToHtml(this.toJSON()));\n\t\t\t\tafterObjects = editor.dom.select('img[data-mce-object]');\n\n\t\t\t\t// Find new image placeholder so we can select it\n\t\t\t\tfor (i = 0; i < beforeObjects.length; i++) {\n\t\t\t\t\tfor (y = afterObjects.length - 1; y >= 0; y--) {\n\t\t\t\t\t\tif (beforeObjects[i] == afterObjects[y]) {\n\t\t\t\t\t\t\tafterObjects.splice(y, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\teditor.selection.select(afterObjects[0]);\n\t\t\t\teditor.nodeChanged();\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction getSource() {\n\t\tvar elm = editor.selection.getNode();\n\n\t\tif (elm.getAttribute('data-mce-object')) {\n\t\t\treturn editor.selection.getContent();\n\t\t}\n\t}\n\n\tfunction dataToHtml(data) {\n\t\tvar html = '';\n\n\t\tif (!data.source1) {\n\t\t\ttinymce.extend(data, htmlToData(data.embed));\n\t\t\tif (!data.source1) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\n\t\tif (!data.source2) {\n\t\t\tdata.source2 = '';\n\t\t}\n\n\t\tif (!data.poster) {\n\t\t\tdata.poster = '';\n\t\t}\n\n\t\tdata.source1 = editor.convertURL(data.source1, \"source\");\n\t\tdata.source2 = editor.convertURL(data.source2, \"source\");\n\t\tdata.source1mime = guessMime(data.source1);\n\t\tdata.source2mime = guessMime(data.source2);\n\t\tdata.poster = editor.convertURL(data.poster, \"poster\");\n\t\tdata.flashPlayerUrl = editor.convertURL(url + '/moxieplayer.swf', \"movie\");\n\n\t\ttinymce.each(urlPatterns, function(pattern) {\n\t\t\tvar match, i, url;\n\n\t\t\tif ((match = pattern.regex.exec(data.source1))) {\n\t\t\t\turl = pattern.url;\n\n\t\t\t\tfor (i = 0; match[i]; i++) {\n\t\t\t\t\t/*jshint loopfunc:true*/\n\t\t\t\t\t/*eslint no-loop-func:0 */\n\t\t\t\t\turl = url.replace('$' + i, function() {\n\t\t\t\t\t\treturn match[i];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdata.source1 = url;\n\t\t\t\tdata.type = pattern.type;\n\t\t\t\tdata.allowFullscreen = pattern.allowFullscreen;\n\t\t\t\tdata.width = data.width || pattern.w;\n\t\t\t\tdata.height = data.height || pattern.h;\n\t\t\t}\n\t\t});\n\n\t\tif (data.embed) {\n\t\t\thtml = updateHtml(data.embed, data, true);\n\t\t} else {\n\t\t\tvar videoScript = getVideoScriptMatch(data.source1);\n\t\t\tif (videoScript) {\n\t\t\t\tdata.type = 'script';\n\t\t\t\tdata.width = videoScript.width;\n\t\t\t\tdata.height = videoScript.height;\n\t\t\t}\n\n\t\t\tdata.width = data.width || 300;\n\t\t\tdata.height = data.height || 150;\n\n\t\t\ttinymce.each(data, function(value, key) {\n\t\t\t\tdata[key] = editor.dom.encode(value);\n\t\t\t});\n\n\t\t\tif (data.type == \"iframe\") {\n\t\t\t\tvar allowFullscreen = data.allowFullscreen ? ' allowFullscreen=\"1\"' : '';\n\t\t\t\thtml += '<iframe src=\"' + data.source1 + '\" width=\"' + data.width + '\" height=\"' + data.height + '\"' + allowFullscreen + '></iframe>';\n\t\t\t} else if (data.source1mime == \"application/x-shockwave-flash\") {\n\t\t\t\thtml += '<object data=\"' + data.source1 + '\" width=\"' + data.width + '\" height=\"' + data.height + '\" type=\"application/x-shockwave-flash\">';\n\n\t\t\t\tif (data.poster) {\n\t\t\t\t\thtml += '<img src=\"' + data.poster + '\" width=\"' + data.width + '\" height=\"' + data.height + '\" />';\n\t\t\t\t}\n\n\t\t\t\thtml += '</object>';\n\t\t\t} else if (data.source1mime.indexOf('audio') != -1) {\n\t\t\t\tif (editor.settings.audio_template_callback) {\n\t\t\t\t\thtml = editor.settings.audio_template_callback(data);\n\t\t\t\t} else {\n\t\t\t\t\thtml += (\n\t\t\t\t\t\t'<audio controls=\"controls\" src=\"' + data.source1 + '\">' +\n\t\t\t\t\t\t\t(data.source2 ? '\\n<source src=\"' + data.source2 + '\"' + (data.source2mime ? ' type=\"' + data.source2mime + '\"' : '') + ' />\\n' : '') +\n\t\t\t\t\t\t'</audio>'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (data.type == \"script\") {\n\t\t\t\thtml += '<script src=\"' + data.source1 + '\"></script>';\n\t\t\t} else {\n\t\t\t\tif (editor.settings.video_template_callback) {\n\t\t\t\t\thtml = editor.settings.video_template_callback(data);\n\t\t\t\t} else {\n\t\t\t\t\thtml = (\n\t\t\t\t\t\t'<video width=\"' + data.width + '\" height=\"' + data.height + '\"' + (data.poster ? ' poster=\"' + data.poster + '\"' : '') + ' controls=\"controls\">\\n' +\n\t\t\t\t\t\t\t'<source src=\"' + data.source1 + '\"' + (data.source1mime ? ' type=\"' + data.source1mime + '\"' : '') + ' />\\n' +\n\t\t\t\t\t\t\t(data.source2 ? '<source src=\"' + data.source2 + '\"' + (data.source2mime ? ' type=\"' + data.source2mime + '\"' : '') + ' />\\n' : '') +\n\t\t\t\t\t\t'</video>'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn html;\n\t}\n\n\tfunction htmlToData(html) {\n\t\tvar data = {};\n\n\t\tnew tinymce.html.SaxParser({\n\t\t\tvalidate: false,\n\t\t\tallow_conditional_comments: true,\n\t\t\tspecial: 'script,noscript',\n\t\t\tstart: function(name, attrs) {\n\t\t\t\tif (!data.source1 && name == \"param\") {\n\t\t\t\t\tdata.source1 = attrs.map.movie;\n\t\t\t\t}\n\n\t\t\t\tif (name == \"iframe\" || name == \"object\" || name == \"embed\" || name == \"video\" || name == \"audio\") {\n\t\t\t\t\tif (!data.type) {\n\t\t\t\t\t\tdata.type = name;\n\t\t\t\t\t}\n\n\t\t\t\t\tdata = tinymce.extend(attrs.map, data);\n\t\t\t\t}\n\n\t\t\t\tif (name == \"script\") {\n\t\t\t\t\tvar videoScript = getVideoScriptMatch(attrs.map.src);\n\t\t\t\t\tif (!videoScript) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tdata = {\n\t\t\t\t\t\ttype: \"script\",\n\t\t\t\t\t\tsource1: attrs.map.src,\n\t\t\t\t\t\twidth: videoScript.width,\n\t\t\t\t\t\theight: videoScript.height\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (name == \"source\") {\n\t\t\t\t\tif (!data.source1) {\n\t\t\t\t\t\tdata.source1 = attrs.map.src;\n\t\t\t\t\t} else if (!data.source2) {\n\t\t\t\t\t\tdata.source2 = attrs.map.src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (name == \"img\" && !data.poster) {\n\t\t\t\t\tdata.poster = attrs.map.src;\n\t\t\t\t}\n\t\t\t}\n\t\t}).parse(html);\n\n\t\tdata.source1 = data.source1 || data.src || data.data;\n\t\tdata.source2 = data.source2 || '';\n\t\tdata.poster = data.poster || '';\n\n\t\treturn data;\n\t}\n\n\tfunction getData(element) {\n\t\tif (element.getAttribute('data-mce-object')) {\n\t\t\treturn htmlToData(editor.serializer.serialize(element, {selection: true}));\n\t\t}\n\n\t\treturn {};\n\t}\n\n\tfunction sanitize(html) {\n\t\tif (editor.settings.media_filter_html === false) {\n\t\t\treturn html;\n\t\t}\n\n\t\tvar writer = new tinymce.html.Writer(), blocked;\n\n\t\tnew tinymce.html.SaxParser({\n\t\t\tvalidate: false,\n\t\t\tallow_conditional_comments: false,\n\t\t\tspecial: 'script,noscript',\n\n\t\t\tcomment: function(text) {\n\t\t\t\twriter.comment(text);\n\t\t\t},\n\n\t\t\tcdata: function(text) {\n\t\t\t\twriter.cdata(text);\n\t\t\t},\n\n\t\t\ttext: function(text, raw) {\n\t\t\t\twriter.text(text, raw);\n\t\t\t},\n\n\t\t\tstart: function(name, attrs, empty) {\n\t\t\t\tblocked = true;\n\n\t\t\t\tif (name == 'script' || name == 'noscript') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0; i < attrs.length; i++) {\n\t\t\t\t\tif (attrs[i].name.indexOf('on') === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attrs[i].name == 'style') {\n\t\t\t\t\t\tattrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twriter.start(name, attrs, empty);\n\t\t\t\tblocked = false;\n\t\t\t},\n\n\t\t\tend: function(name) {\n\t\t\t\tif (blocked) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\twriter.end(name);\n\t\t\t}\n\t\t}, new tinymce.html.Schema({})).parse(html);\n\n\t\treturn writer.getContent();\n\t}\n\n\tfunction updateHtml(html, data, updateAll) {\n\t\tvar writer = new tinymce.html.Writer();\n\t\tvar sourceCount = 0, hasImage;\n\n\t\tfunction setAttributes(attrs, updatedAttrs) {\n\t\t\tvar name, i, value, attr;\n\n\t\t\tfor (name in updatedAttrs) {\n\t\t\t\tvalue = \"\" + updatedAttrs[name];\n\n\t\t\t\tif (attrs.map[name]) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\tattr = attrs[i];\n\n\t\t\t\t\t\tif (attr.name == name) {\n\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\tattrs.map[name] = value;\n\t\t\t\t\t\t\t\tattr.value = value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdelete attrs.map[name];\n\t\t\t\t\t\t\t\tattrs.splice(i, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (value) {\n\t\t\t\t\tattrs.push({\n\t\t\t\t\t\tname: name,\n\t\t\t\t\t\tvalue: value\n\t\t\t\t\t});\n\n\t\t\t\t\tattrs.map[name] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tnew tinymce.html.SaxParser({\n\t\t\tvalidate: false,\n\t\t\tallow_conditional_comments: true,\n\t\t\tspecial: 'script,noscript',\n\n\t\t\tcomment: function(text) {\n\t\t\t\twriter.comment(text);\n\t\t\t},\n\n\t\t\tcdata: function(text) {\n\t\t\t\twriter.cdata(text);\n\t\t\t},\n\n\t\t\ttext: function(text, raw) {\n\t\t\t\twriter.text(text, raw);\n\t\t\t},\n\n\t\t\tstart: function(name, attrs, empty) {\n\t\t\t\tswitch (name) {\n\t\t\t\t\tcase \"video\":\n\t\t\t\t\tcase \"object\":\n\t\t\t\t\tcase \"embed\":\n\t\t\t\t\tcase \"img\":\n\t\t\t\t\tcase \"iframe\":\n\t\t\t\t\t\tsetAttributes(attrs, {\n\t\t\t\t\t\t\twidth: data.width,\n\t\t\t\t\t\t\theight: data.height\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (updateAll) {\n\t\t\t\t\tswitch (name) {\n\t\t\t\t\t\tcase \"video\":\n\t\t\t\t\t\t\tsetAttributes(attrs, {\n\t\t\t\t\t\t\t\tposter: data.poster,\n\t\t\t\t\t\t\t\tsrc: \"\"\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (data.source2) {\n\t\t\t\t\t\t\t\tsetAttributes(attrs, {\n\t\t\t\t\t\t\t\t\tsrc: \"\"\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"iframe\":\n\t\t\t\t\t\t\tsetAttributes(attrs, {\n\t\t\t\t\t\t\t\tsrc: data.source1\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"source\":\n\t\t\t\t\t\t\tsourceCount++;\n\n\t\t\t\t\t\t\tif (sourceCount <= 2) {\n\t\t\t\t\t\t\t\tsetAttributes(attrs, {\n\t\t\t\t\t\t\t\t\tsrc: data[\"source\" + sourceCount],\n\t\t\t\t\t\t\t\t\ttype: data[\"source\" + sourceCount + \"mime\"]\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (!data[\"source\" + sourceCount]) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"img\":\n\t\t\t\t\t\t\tif (!data.poster) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\thasImage = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twriter.start(name, attrs, empty);\n\t\t\t},\n\n\t\t\tend: function(name) {\n\t\t\t\tif (name == \"video\" && updateAll) {\n\t\t\t\t\tfor (var index = 1; index <= 2; index++) {\n\t\t\t\t\t\tif (data[\"source\" + index]) {\n\t\t\t\t\t\t\tvar attrs = [];\n\t\t\t\t\t\t\tattrs.map = {};\n\n\t\t\t\t\t\t\tif (sourceCount < index) {\n\t\t\t\t\t\t\t\tsetAttributes(attrs, {\n\t\t\t\t\t\t\t\t\tsrc: data[\"source\" + index],\n\t\t\t\t\t\t\t\t\ttype: data[\"source\" + index + \"mime\"]\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\twriter.start(\"source\", attrs, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (data.poster && name == \"object\" && updateAll && !hasImage) {\n\t\t\t\t\tvar imgAttrs = [];\n\t\t\t\t\timgAttrs.map = {};\n\n\t\t\t\t\tsetAttributes(imgAttrs, {\n\t\t\t\t\t\tsrc: data.poster,\n\t\t\t\t\t\twidth: data.width,\n\t\t\t\t\t\theight: data.height\n\t\t\t\t\t});\n\n\t\t\t\t\twriter.start(\"img\", imgAttrs, true);\n\t\t\t\t}\n\n\t\t\t\twriter.end(name);\n\t\t\t}\n\t\t}, new tinymce.html.Schema({})).parse(html);\n\n\t\treturn writer.getContent();\n\t}\n\n\teditor.on('ResolveName', function(e) {\n\t\tvar name;\n\n\t\tif (e.target.nodeType == 1 && (name = e.target.getAttribute(\"data-mce-object\"))) {\n\t\t\te.name = name;\n\t\t}\n\t});\n\n\teditor.on('preInit', function() {\n\t\t// Make sure that any messy HTML is retained inside these\n\t\tvar specialElements = editor.schema.getSpecialElements();\n\t\ttinymce.each('video audio iframe object'.split(' '), function(name) {\n\t\t\tspecialElements[name] = new RegExp('<\\/' + name + '[^>]*>', 'gi');\n\t\t});\n\n\t\t// Allow elements\n\t\t//editor.schema.addValidElements('object[id|style|width|height|classid|codebase|*],embed[id|style|width|height|type|src|*],video[*],audio[*]');\n\n\t\t// Set allowFullscreen attribs as boolean\n\t\tvar boolAttrs = editor.schema.getBoolAttrs();\n\t\ttinymce.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function(name) {\n\t\t\tboolAttrs[name] = {};\n\t\t});\n\n\t\t// Converts iframe, video etc into placeholder images\n\t\teditor.parser.addNodeFilter('iframe,video,audio,object,embed,script', function(nodes, name) {\n\t\t\tvar i = nodes.length, ai, node, placeHolder, attrName, attrValue, attribs, innerHtml;\n\t\t\tvar videoScript;\n\n\t\t\twhile (i--) {\n\t\t\t\tnode = nodes[i];\n\t\t\t\tif (!node.parent) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (node.name == 'script') {\n\t\t\t\t\tvideoScript = getVideoScriptMatch(node.attr('src'));\n\t\t\t\t\tif (!videoScript) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tplaceHolder = new tinymce.html.Node('img', 1);\n\t\t\t\tplaceHolder.shortEnded = true;\n\n\t\t\t\tif (videoScript) {\n\t\t\t\t\tif (videoScript.width) {\n\t\t\t\t\t\tnode.attr('width', videoScript.width.toString());\n\t\t\t\t\t}\n\n\t\t\t\t\tif (videoScript.height) {\n\t\t\t\t\t\tnode.attr('height', videoScript.height.toString());\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Prefix all attributes except width, height and style since we\n\t\t\t\t// will add these to the placeholder\n\t\t\t\tattribs = node.attributes;\n\t\t\t\tai = attribs.length;\n\t\t\t\twhile (ai--) {\n\t\t\t\t\tattrName = attribs[ai].name;\n\t\t\t\t\tattrValue = attribs[ai].value;\n\n\t\t\t\t\tif (attrName !== \"width\" && attrName !== \"height\" && attrName !== \"style\") {\n\t\t\t\t\t\tif (attrName == \"data\" || attrName == \"src\") {\n\t\t\t\t\t\t\tattrValue = editor.convertURL(attrValue, attrName);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplaceHolder.attr('data-mce-p-' + attrName, attrValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Place the inner HTML contents inside an escaped attribute\n\t\t\t\t// This enables us to copy/paste the fake object\n\t\t\t\tinnerHtml = node.firstChild && node.firstChild.value;\n\t\t\t\tif (innerHtml) {\n\t\t\t\t\tplaceHolder.attr(\"data-mce-html\", escape(innerHtml));\n\t\t\t\t\tplaceHolder.firstChild = null;\n\t\t\t\t}\n\n\t\t\t\tplaceHolder.attr({\n\t\t\t\t\twidth: node.attr('width') || \"300\",\n\t\t\t\t\theight: node.attr('height') || (name == \"audio\" ? \"30\" : \"150\"),\n\t\t\t\t\tstyle: node.attr('style'),\n\t\t\t\t\tsrc: tinymce.Env.transparentSrc,\n\t\t\t\t\t\"data-mce-object\": name,\n\t\t\t\t\t\"class\": \"mce-object mce-object-\" + name\n\t\t\t\t});\n\n\t\t\t\tnode.replace(placeHolder);\n\t\t\t}\n\t\t});\n\n\t\t// Replaces placeholder images with real elements for video, object, iframe etc\n\t\teditor.serializer.addAttributeFilter('data-mce-object', function(nodes, name) {\n\t\t\tvar i = nodes.length, node, realElm, ai, attribs, innerHtml, innerNode, realElmName;\n\n\t\t\twhile (i--) {\n\t\t\t\tnode = nodes[i];\n\t\t\t\tif (!node.parent) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\trealElmName = node.attr(name);\n\t\t\t\trealElm = new tinymce.html.Node(realElmName, 1);\n\n\t\t\t\t// Add width/height to everything but audio\n\t\t\t\tif (realElmName != \"audio\" && realElmName != \"script\") {\n\t\t\t\t\trealElm.attr({\n\t\t\t\t\t\twidth: node.attr('width'),\n\t\t\t\t\t\theight: node.attr('height')\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\trealElm.attr({\n\t\t\t\t\tstyle: node.attr('style')\n\t\t\t\t});\n\n\t\t\t\t// Unprefix all placeholder attributes\n\t\t\t\tattribs = node.attributes;\n\t\t\t\tai = attribs.length;\n\t\t\t\twhile (ai--) {\n\t\t\t\t\tvar attrName = attribs[ai].name;\n\n\t\t\t\t\tif (attrName.indexOf('data-mce-p-') === 0) {\n\t\t\t\t\t\trealElm.attr(attrName.substr(11), attribs[ai].value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (realElmName == \"script\") {\n\t\t\t\t\trealElm.attr('type', 'text/javascript');\n\t\t\t\t}\n\n\t\t\t\t// Inject innerhtml\n\t\t\t\tinnerHtml = node.attr('data-mce-html');\n\t\t\t\tif (innerHtml) {\n\t\t\t\t\tinnerNode = new tinymce.html.Node('#text', 3);\n\t\t\t\t\tinnerNode.raw = true;\n\t\t\t\t\tinnerNode.value = sanitize(unescape(innerHtml));\n\t\t\t\t\trealElm.append(innerNode);\n\t\t\t\t}\n\n\t\t\t\tnode.replace(realElm);\n\t\t\t}\n\t\t});\n\t});\n\n\teditor.on('ObjectSelected', function(e) {\n\t\tvar objectType = e.target.getAttribute('data-mce-object');\n\n\t\tif (objectType == \"audio\" || objectType == \"script\") {\n\t\t\te.preventDefault();\n\t\t}\n\t});\n\n\teditor.on('objectResized', function(e) {\n\t\tvar target = e.target, html;\n\n\t\tif (target.getAttribute('data-mce-object')) {\n\t\t\thtml = target.getAttribute('data-mce-html');\n\t\t\tif (html) {\n\t\t\t\thtml = unescape(html);\n\t\t\t\ttarget.setAttribute('data-mce-html', escape(\n\t\t\t\t\tupdateHtml(html, {\n\t\t\t\t\t\twidth: e.width,\n\t\t\t\t\t\theight: e.height\n\t\t\t\t\t})\n\t\t\t\t));\n\t\t\t}\n\t\t}\n\t});\n\n\teditor.addButton('media', {\n\t\ttooltip: 'Insert/edit video',\n\t\tonclick: showDialog,\n\t\tstateSelector: ['img[data-mce-object=video]', 'img[data-mce-object=iframe]']\n\t});\n\n\teditor.addMenuItem('media', {\n\t\ticon: 'media',\n\t\ttext: 'Insert/edit video',\n\t\tonclick: showDialog,\n\t\tcontext: 'insert',\n\t\tprependToContext: true\n\t});\n\n\teditor.addCommand('mceMedia', showDialog);\n\n\tthis.showDialog = showDialog;\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/paste/plugin.js",
    "content": "/**\n * Compiled inline version. (Library mode)\n */\n\n/*jshint smarttabs:true, undef:true, latedef:true, curly:true, bitwise:true, camelcase:true */\n/*globals $code */\n\n(function(exports, undefined) {\n\t\"use strict\";\n\n\tvar modules = {};\n\n\tfunction require(ids, callback) {\n\t\tvar module, defs = [];\n\n\t\tfor (var i = 0; i < ids.length; ++i) {\n\t\t\tmodule = modules[ids[i]] || resolve(ids[i]);\n\t\t\tif (!module) {\n\t\t\t\tthrow 'module definition dependecy not found: ' + ids[i];\n\t\t\t}\n\n\t\t\tdefs.push(module);\n\t\t}\n\n\t\tcallback.apply(null, defs);\n\t}\n\n\tfunction define(id, dependencies, definition) {\n\t\tif (typeof id !== 'string') {\n\t\t\tthrow 'invalid module definition, module id must be defined and be a string';\n\t\t}\n\n\t\tif (dependencies === undefined) {\n\t\t\tthrow 'invalid module definition, dependencies must be specified';\n\t\t}\n\n\t\tif (definition === undefined) {\n\t\t\tthrow 'invalid module definition, definition function must be specified';\n\t\t}\n\n\t\trequire(dependencies, function() {\n\t\t\tmodules[id] = definition.apply(null, arguments);\n\t\t});\n\t}\n\n\tfunction defined(id) {\n\t\treturn !!modules[id];\n\t}\n\n\tfunction resolve(id) {\n\t\tvar target = exports;\n\t\tvar fragments = id.split(/[.\\/]/);\n\n\t\tfor (var fi = 0; fi < fragments.length; ++fi) {\n\t\t\tif (!target[fragments[fi]]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttarget = target[fragments[fi]];\n\t\t}\n\n\t\treturn target;\n\t}\n\n\tfunction expose(ids) {\n\t\tvar i, target, id, fragments, privateModules;\n\n\t\tfor (i = 0; i < ids.length; i++) {\n\t\t\ttarget = exports;\n\t\t\tid = ids[i];\n\t\t\tfragments = id.split(/[.\\/]/);\n\n\t\t\tfor (var fi = 0; fi < fragments.length - 1; ++fi) {\n\t\t\t\tif (target[fragments[fi]] === undefined) {\n\t\t\t\t\ttarget[fragments[fi]] = {};\n\t\t\t\t}\n\n\t\t\t\ttarget = target[fragments[fi]];\n\t\t\t}\n\n\t\t\ttarget[fragments[fragments.length - 1]] = modules[id];\n\t\t}\n\t\t\n\t\t// Expose private modules for unit tests\n\t\tif (exports.AMDLC_TESTS) {\n\t\t\tprivateModules = exports.privateModules || {};\n\n\t\t\tfor (id in modules) {\n\t\t\t\tprivateModules[id] = modules[id];\n\t\t\t}\n\n\t\t\tfor (i = 0; i < ids.length; i++) {\n\t\t\t\tdelete privateModules[ids[i]];\n\t\t\t}\n\n\t\t\texports.privateModules = privateModules;\n\t\t}\n\t}\n\n// Included from: js/tinymce/plugins/paste/classes/Utils.js\n\n/**\n * Utils.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/**\n * This class contails various utility functions for the paste plugin.\n *\n * @class tinymce.pasteplugin.Utils\n */\ndefine(\"tinymce/pasteplugin/Utils\", [\n\t\"tinymce/util/Tools\",\n\t\"tinymce/html/DomParser\",\n\t\"tinymce/html/Schema\"\n], function(Tools, DomParser, Schema) {\n\tfunction filter(content, items) {\n\t\tTools.each(items, function(v) {\n\t\t\tif (v.constructor == RegExp) {\n\t\t\t\tcontent = content.replace(v, '');\n\t\t\t} else {\n\t\t\t\tcontent = content.replace(v[0], v[1]);\n\t\t\t}\n\t\t});\n\n\t\treturn content;\n\t}\n\n\t/**\n\t * Gets the innerText of the specified element. It will handle edge cases\n\t * and works better than textContent on Gecko.\n\t *\n\t * @param {String} html HTML string to get text from.\n\t * @return {String} String of text with line feeds.\n\t */\n\tfunction innerText(html) {\n\t\tvar schema = new Schema(), domParser = new DomParser({}, schema), text = '';\n\t\tvar shortEndedElements = schema.getShortEndedElements();\n\t\tvar ignoreElements = Tools.makeMap('script noscript style textarea video audio iframe object', ' ');\n\t\tvar blockElements = schema.getBlockElements();\n\n\t\tfunction walk(node) {\n\t\t\tvar name = node.name, currentNode = node;\n\n\t\t\tif (name === 'br') {\n\t\t\t\ttext += '\\n';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// img/input/hr\n\t\t\tif (shortEndedElements[name]) {\n\t\t\t\ttext += ' ';\n\t\t\t}\n\n\t\t\t// Ingore script, video contents\n\t\t\tif (ignoreElements[name]) {\n\t\t\t\ttext += ' ';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (node.type == 3) {\n\t\t\t\ttext += node.value;\n\t\t\t}\n\n\t\t\t// Walk all children\n\t\t\tif (!node.shortEnded) {\n\t\t\t\tif ((node = node.firstChild)) {\n\t\t\t\t\tdo {\n\t\t\t\t\t\twalk(node);\n\t\t\t\t\t} while ((node = node.next));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add \\n or \\n\\n for blocks or P\n\t\t\tif (blockElements[name] && currentNode.next) {\n\t\t\t\ttext += '\\n';\n\n\t\t\t\tif (name == 'p') {\n\t\t\t\t\ttext += '\\n';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\thtml = filter(html, [\n\t\t\t/<!\\[[^\\]]+\\]>/g // Conditional comments\n\t\t]);\n\n\t\twalk(domParser.parse(html));\n\n\t\treturn text;\n\t}\n\n\t/**\n\t * Trims the specified HTML by removing all WebKit fragments, all elements wrapping the body trailing BR elements etc.\n\t *\n\t * @param {String} html Html string to trim contents on.\n\t * @return {String} Html contents that got trimmed.\n\t */\n\tfunction trimHtml(html) {\n\t\tfunction trimSpaces(all, s1, s2) {\n\t\t\t// WebKit &nbsp; meant to preserve multiple spaces but instead inserted around all inline tags,\n\t\t\t// including the spans with inline styles created on paste\n\t\t\tif (!s1 && !s2) {\n\t\t\t\treturn ' ';\n\t\t\t}\n\n\t\t\treturn '\\u00a0';\n\t\t}\n\n\t\thtml = filter(html, [\n\t\t\t/^[\\s\\S]*<body[^>]*>\\s*|\\s*<\\/body[^>]*>[\\s\\S]*$/g, // Remove anything but the contents within the BODY element\n\t\t\t/<!--StartFragment-->|<!--EndFragment-->/g, // Inner fragments (tables from excel on mac)\n\t\t\t[/( ?)<span class=\"Apple-converted-space\">\\u00a0<\\/span>( ?)/g, trimSpaces],\n\t\t\t/<br>$/i // Trailing BR elements\n\t\t]);\n\n\t\treturn html;\n\t}\n\n\treturn {\n\t\tfilter: filter,\n\t\tinnerText: innerText,\n\t\ttrimHtml: trimHtml\n\t};\n});\n\n// Included from: js/tinymce/plugins/paste/classes/Clipboard.js\n\n/**\n * Clipboard.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/**\n * This class contains logic for getting HTML contents out of the clipboard.\n *\n * We need to make a lot of ugly hacks to get the contents out of the clipboard since\n * the W3C Clipboard API is broken in all browsers that have it: Gecko/WebKit/Blink.\n * We might rewrite this the way those API:s stabilize. Browsers doesn't handle pasting\n * from applications like Word the same way as it does when pasting into a contentEditable area\n * so we need to do lots of extra work to try to get to this clipboard data.\n *\n * Current implementation steps:\n *  1. On keydown with paste keys Ctrl+V or Shift+Insert create\n *     a paste bin element and move focus to that element.\n *  2. Wait for the browser to fire a \"paste\" event and get the contents out of the paste bin.\n *  3. Check if the paste was successful if true, process the HTML.\n *  (4). If the paste was unsuccessful use IE execCommand, Clipboard API, document.dataTransfer old WebKit API etc.\n *\n * @class tinymce.pasteplugin.Clipboard\n * @private\n */\ndefine(\"tinymce/pasteplugin/Clipboard\", [\n\t\"tinymce/Env\",\n\t\"tinymce/dom/RangeUtils\",\n\t\"tinymce/util/VK\",\n\t\"tinymce/pasteplugin/Utils\"\n], function(Env, RangeUtils, VK, Utils) {\n\treturn function(editor) {\n\t\tvar self = this, pasteBinElm, lastRng, keyboardPasteTimeStamp = 0, draggingInternally = false;\n\t\tvar pasteBinDefaultContent = '%MCEPASTEBIN%', keyboardPastePlainTextState;\n\t\tvar mceInternalUrlPrefix = 'data:text/mce-internal,';\n\n\t\t/**\n\t\t * Pastes the specified HTML. This means that the HTML is filtered and then\n\t\t * inserted at the current selection in the editor. It will also fire paste events\n\t\t * for custom user filtering.\n\t\t *\n\t\t * @param {String} html HTML code to paste into the current selection.\n\t\t */\n\t\tfunction pasteHtml(html) {\n\t\t\tvar args, dom = editor.dom;\n\n\t\t\targs = editor.fire('BeforePastePreProcess', {content: html}); // Internal event used by Quirks\n\t\t\targs = editor.fire('PastePreProcess', args);\n\t\t\thtml = args.content;\n\n\t\t\tif (!args.isDefaultPrevented()) {\n\t\t\t\t// User has bound PastePostProcess events then we need to pass it through a DOM node\n\t\t\t\t// This is not ideal but we don't want to let the browser mess up the HTML for example\n\t\t\t\t// some browsers add &nbsp; to P tags etc\n\t\t\t\tif (editor.hasEventListeners('PastePostProcess') && !args.isDefaultPrevented()) {\n\t\t\t\t\t// We need to attach the element to the DOM so Sizzle selectors work on the contents\n\t\t\t\t\tvar tempBody = dom.add(editor.getBody(), 'div', {style: 'display:none'}, html);\n\t\t\t\t\targs = editor.fire('PastePostProcess', {node: tempBody});\n\t\t\t\t\tdom.remove(tempBody);\n\t\t\t\t\thtml = args.node.innerHTML;\n\t\t\t\t}\n\n\t\t\t\tif (!args.isDefaultPrevented()) {\n\t\t\t\t\teditor.insertContent(html, {merge: editor.settings.paste_merge_formats !== false, data: {paste: true}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Pastes the specified text. This means that the plain text is processed\n\t\t * and converted into BR and P elements. It will fire paste events for custom filtering.\n\t\t *\n\t\t * @param {String} text Text to paste as the current selection location.\n\t\t */\n\t\tfunction pasteText(text) {\n\t\t\ttext = editor.dom.encode(text).replace(/\\r\\n/g, '\\n');\n\n\t\t\tvar startBlock = editor.dom.getParent(editor.selection.getStart(), editor.dom.isBlock);\n\n\t\t\t// Create start block html for example <p attr=\"value\">\n\t\t\tvar forcedRootBlockName = editor.settings.forced_root_block;\n\t\t\tvar forcedRootBlockStartHtml;\n\t\t\tif (forcedRootBlockName) {\n\t\t\t\tforcedRootBlockStartHtml = editor.dom.createHTML(forcedRootBlockName, editor.settings.forced_root_block_attrs);\n\t\t\t\tforcedRootBlockStartHtml = forcedRootBlockStartHtml.substr(0, forcedRootBlockStartHtml.length - 3) + '>';\n\t\t\t}\n\n\t\t\tif ((startBlock && /^(PRE|DIV)$/.test(startBlock.nodeName)) || !forcedRootBlockName) {\n\t\t\t\ttext = Utils.filter(text, [\n\t\t\t\t\t[/\\n/g, \"<br>\"]\n\t\t\t\t]);\n\t\t\t} else {\n\t\t\t\ttext = Utils.filter(text, [\n\t\t\t\t\t[/\\n\\n/g, \"</p>\" + forcedRootBlockStartHtml],\n\t\t\t\t\t[/^(.*<\\/p>)(<p>)$/, forcedRootBlockStartHtml + '$1'],\n\t\t\t\t\t[/\\n/g, \"<br />\"]\n\t\t\t\t]);\n\n\t\t\t\tif (text.indexOf('<p>') != -1) {\n\t\t\t\t\ttext = forcedRootBlockStartHtml + text;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpasteHtml(text);\n\t\t}\n\n\t\t/**\n\t\t * Creates a paste bin element as close as possible to the current caret location and places the focus inside that element\n\t\t * so that when the real paste event occurs the contents gets inserted into this element\n\t\t * instead of the current editor selection element.\n\t\t */\n\t\tfunction createPasteBin() {\n\t\t\tvar dom = editor.dom, body = editor.getBody();\n\t\t\tvar viewport = editor.dom.getViewPort(editor.getWin()), scrollTop = viewport.y, top = 20;\n\t\t\tvar scrollContainer;\n\n\t\t\tlastRng = editor.selection.getRng();\n\n\t\t\tif (editor.inline) {\n\t\t\t\tscrollContainer = editor.selection.getScrollContainer();\n\n\t\t\t\t// Can't always rely on scrollTop returning a useful value.\n\t\t\t\t// It returns 0 if the browser doesn't support scrollTop for the element or is non-scrollable\n\t\t\t\tif (scrollContainer && scrollContainer.scrollTop > 0) {\n\t\t\t\t\tscrollTop = scrollContainer.scrollTop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Returns the rect of the current caret if the caret is in an empty block before a\n\t\t\t * BR we insert a temporary invisible character that we get the rect this way we always get a proper rect.\n\t\t\t *\n\t\t\t * TODO: This might be useful in core.\n\t\t\t */\n\t\t\tfunction getCaretRect(rng) {\n\t\t\t\tvar rects, textNode, node, container = rng.startContainer;\n\n\t\t\t\trects = rng.getClientRects();\n\t\t\t\tif (rects.length) {\n\t\t\t\t\treturn rects[0];\n\t\t\t\t}\n\n\t\t\t\tif (!rng.collapsed || container.nodeType != 1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnode = container.childNodes[lastRng.startOffset];\n\n\t\t\t\t// Skip empty whitespace nodes\n\t\t\t\twhile (node && node.nodeType == 3 && !node.data.length) {\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t}\n\n\t\t\t\tif (!node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Check if the location is |<br>\n\t\t\t\t// TODO: Might need to expand this to say |<table>\n\t\t\t\tif (node.tagName == 'BR') {\n\t\t\t\t\ttextNode = dom.doc.createTextNode('\\uFEFF');\n\t\t\t\t\tnode.parentNode.insertBefore(textNode, node);\n\n\t\t\t\t\trng = dom.createRng();\n\t\t\t\t\trng.setStartBefore(textNode);\n\t\t\t\t\trng.setEndAfter(textNode);\n\n\t\t\t\t\trects = rng.getClientRects();\n\t\t\t\t\tdom.remove(textNode);\n\t\t\t\t}\n\n\t\t\t\tif (rects.length) {\n\t\t\t\t\treturn rects[0];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Calculate top cordinate this is needed to avoid scrolling to top of document\n\t\t\t// We want the paste bin to be as close to the caret as possible to avoid scrolling\n\t\t\tif (lastRng.getClientRects) {\n\t\t\t\tvar rect = getCaretRect(lastRng);\n\n\t\t\t\tif (rect) {\n\t\t\t\t\t// Client rects gets us closes to the actual\n\t\t\t\t\t// caret location in for example a wrapped paragraph block\n\t\t\t\t\ttop = scrollTop + (rect.top - dom.getPos(body).y);\n\t\t\t\t} else {\n\t\t\t\t\ttop = scrollTop;\n\n\t\t\t\t\t// Check if we can find a closer location by checking the range element\n\t\t\t\t\tvar container = lastRng.startContainer;\n\t\t\t\t\tif (container) {\n\t\t\t\t\t\tif (container.nodeType == 3 && container.parentNode != body) {\n\t\t\t\t\t\t\tcontainer = container.parentNode;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (container.nodeType == 1) {\n\t\t\t\t\t\t\ttop = dom.getPos(container, scrollContainer || body).y;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create a pastebin\n\t\t\tpasteBinElm = dom.add(editor.getBody(), 'div', {\n\t\t\t\tid: \"mcepastebin\",\n\t\t\t\tcontentEditable: true,\n\t\t\t\t\"data-mce-bogus\": \"all\",\n\t\t\t\tstyle: 'position: absolute; top: ' + top + 'px;' +\n\t\t\t\t\t'width: 10px; height: 10px; overflow: hidden; opacity: 0'\n\t\t\t}, pasteBinDefaultContent);\n\n\t\t\t// Move paste bin out of sight since the controlSelection rect gets displayed otherwise on IE and Gecko\n\t\t\tif (Env.ie || Env.gecko) {\n\t\t\t\tdom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) == 'rtl' ? 0xFFFF : -0xFFFF);\n\t\t\t}\n\n\t\t\t// Prevent focus events from bubbeling fixed FocusManager issues\n\t\t\tdom.bind(pasteBinElm, 'beforedeactivate focusin focusout', function(e) {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\n\t\t\tpasteBinElm.focus();\n\t\t\teditor.selection.select(pasteBinElm, true);\n\t\t}\n\n\t\t/**\n\t\t * Removes the paste bin if it exists.\n\t\t */\n\t\tfunction removePasteBin() {\n\t\t\tif (pasteBinElm) {\n\t\t\t\tvar pasteBinClone;\n\n\t\t\t\t// WebKit/Blink might clone the div so\n\t\t\t\t// lets make sure we remove all clones\n\t\t\t\t// TODO: Man o man is this ugly. WebKit is the new IE! Remove this if they ever fix it!\n\t\t\t\twhile ((pasteBinClone = editor.dom.get('mcepastebin'))) {\n\t\t\t\t\teditor.dom.remove(pasteBinClone);\n\t\t\t\t\teditor.dom.unbind(pasteBinClone);\n\t\t\t\t}\n\n\t\t\t\tif (lastRng) {\n\t\t\t\t\teditor.selection.setRng(lastRng);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpasteBinElm = lastRng = null;\n\t\t}\n\n\t\t/**\n\t\t * Returns the contents of the paste bin as a HTML string.\n\t\t *\n\t\t * @return {String} Get the contents of the paste bin.\n\t\t */\n\t\tfunction getPasteBinHtml() {\n\t\t\tvar html = '', pasteBinClones, i, clone, cloneHtml;\n\n\t\t\t// Since WebKit/Chrome might clone the paste bin when pasting\n\t\t\t// for example: <img style=\"float: right\"> we need to check if any of them contains some useful html.\n\t\t\t// TODO: Man o man is this ugly. WebKit is the new IE! Remove this if they ever fix it!\n\t\t\tpasteBinClones = editor.dom.select('div[id=mcepastebin]');\n\t\t\tfor (i = 0; i < pasteBinClones.length; i++) {\n\t\t\t\tclone = pasteBinClones[i];\n\n\t\t\t\t// Pasting plain text produces pastebins in pastebinds makes sence right!?\n\t\t\t\tif (clone.firstChild && clone.firstChild.id == 'mcepastebin') {\n\t\t\t\t\tclone = clone.firstChild;\n\t\t\t\t}\n\n\t\t\t\tcloneHtml = clone.innerHTML;\n\t\t\t\tif (html != pasteBinDefaultContent) {\n\t\t\t\t\thtml += cloneHtml;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn html;\n\t\t}\n\n\t\t/**\n\t\t * Some Windows 10/Edge versions will return a double encoded string. This checks if the\n\t\t * content has this odd encoding and decodes it.\n\t\t */\n\t\tfunction decodeEdgeData(data) {\n\t\t\tvar i, out, fingerprint, code;\n\n\t\t\t// Check if data is encoded\n\t\t\tfingerprint = [25942, 29554, 28521, 14958];\n\t\t\tfor (i = 0; i < fingerprint.length; i++) {\n\t\t\t\tif (data.charCodeAt(i) != fingerprint[i]) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Decode UTF-16 to UTF-8\n\t\t\tout = '';\n\t\t\tfor (i = 0; i < data.length; i++) {\n\t\t\t\tcode = data.charCodeAt(i);\n\n\t\t\t\t/*eslint no-bitwise:0*/\n\t\t\t\tout += String.fromCharCode((code & 0x00FF));\n\t\t\t\tout += String.fromCharCode((code & 0xFF00) >> 8);\n\t\t\t}\n\n\t\t\t// Decode UTF-8\n\t\t\treturn decodeURIComponent(escape(out));\n\t\t}\n\n\t\t/**\n\t\t * Extracts HTML contents from within a fragment.\n\t\t */\n\t\tfunction extractFragment(data) {\n\t\t\tvar idx, startFragment, endFragment;\n\n\t\t\tstartFragment = '<!--StartFragment-->';\n\t\t\tidx = data.indexOf(startFragment);\n\t\t\tif (idx !== -1) {\n\t\t\t\tdata = data.substr(idx + startFragment.length);\n\t\t\t}\n\n\t\t\tendFragment = '<!--EndFragment-->';\n\t\t\tidx = data.indexOf(endFragment);\n\t\t\tif (idx !== -1) {\n\t\t\t\tdata = data.substr(0, idx);\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t/**\n\t\t * Gets various content types out of a datatransfer object.\n\t\t *\n\t\t * @param {DataTransfer} dataTransfer Event fired on paste.\n\t\t * @return {Object} Object with mime types and data for those mime types.\n\t\t */\n\t\tfunction getDataTransferItems(dataTransfer) {\n\t\t\tvar items = {};\n\n\t\t\tif (dataTransfer) {\n\t\t\t\t// Use old WebKit/IE API\n\t\t\t\tif (dataTransfer.getData) {\n\t\t\t\t\tvar legacyText = dataTransfer.getData('Text');\n\t\t\t\t\tif (legacyText && legacyText.length > 0) {\n\t\t\t\t\t\tif (legacyText.indexOf(mceInternalUrlPrefix) == -1) {\n\t\t\t\t\t\t\titems['text/plain'] = legacyText;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (dataTransfer.types) {\n\t\t\t\t\tfor (var i = 0; i < dataTransfer.types.length; i++) {\n\t\t\t\t\t\tvar contentType = dataTransfer.types[i],\n\t\t\t\t\t\t\tdata = dataTransfer.getData(contentType);\n\n\t\t\t\t\t\tif (contentType == 'text/html') {\n\t\t\t\t\t\t\tdata = extractFragment(decodeEdgeData(data));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titems[contentType] = data;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn items;\n\t\t}\n\n\t\t/**\n\t\t * Gets various content types out of the Clipboard API. It will also get the\n\t\t * plain text using older IE and WebKit API:s.\n\t\t *\n\t\t * @param {ClipboardEvent} clipboardEvent Event fired on paste.\n\t\t * @return {Object} Object with mime types and data for those mime types.\n\t\t */\n\t\tfunction getClipboardContent(clipboardEvent) {\n\t\t\treturn getDataTransferItems(clipboardEvent.clipboardData || editor.getDoc().dataTransfer);\n\t\t}\n\n\t\t/**\n\t\t * Checks if the clipboard contains image data if it does it will take that data\n\t\t * and convert it into a data url image and paste that image at the caret location.\n\t\t *\n\t\t * @param  {ClipboardEvent} e Paste/drop event object.\n\t\t * @param  {DOMRange} rng Optional rng object to move selection to.\n\t\t * @return {Boolean} true/false if the image data was found or not.\n\t\t */\n\t\tfunction pasteImageData(e, rng) {\n\t\t\tvar dataTransfer = e.clipboardData || e.dataTransfer;\n\n\t\t\tfunction processItems(items) {\n\t\t\t\tvar i, item, reader, hadImage = false;\n\n\t\t\t\tfunction pasteImage(reader) {\n\t\t\t\t\tif (rng) {\n\t\t\t\t\t\teditor.selection.setRng(rng);\n\t\t\t\t\t\trng = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tpasteHtml('<img src=\"' + reader.result + '\">');\n\t\t\t\t}\n\n\t\t\t\tif (items) {\n\t\t\t\t\tfor (i = 0; i < items.length; i++) {\n\t\t\t\t\t\titem = items[i];\n\n\t\t\t\t\t\tif (/^image\\/(jpeg|png|gif|bmp)$/.test(item.type)) {\n\t\t\t\t\t\t\treader = new FileReader();\n\t\t\t\t\t\t\treader.onload = pasteImage.bind(null, reader);\n\t\t\t\t\t\t\treader.readAsDataURL(item.getAsFile ? item.getAsFile() : item);\n\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thadImage = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn hadImage;\n\t\t\t}\n\n\t\t\tif (editor.settings.paste_data_images && dataTransfer) {\n\t\t\t\treturn processItems(dataTransfer.items) || processItems(dataTransfer.files);\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Chrome on Android doesn't support proper clipboard access so we have no choice but to allow the browser default behavior.\n\t\t *\n\t\t * @param {Event} e Paste event object to check if it contains any data.\n\t\t * @return {Boolean} true/false if the clipboard is empty or not.\n\t\t */\n\t\tfunction isBrokenAndroidClipboardEvent(e) {\n\t\t\tvar clipboardData = e.clipboardData;\n\n\t\t\treturn navigator.userAgent.indexOf('Android') != -1 && clipboardData && clipboardData.items && clipboardData.items.length === 0;\n\t\t}\n\n\t\tfunction getCaretRangeFromEvent(e) {\n\t\t\treturn RangeUtils.getCaretRangeFromPoint(e.clientX, e.clientY, editor.getDoc());\n\t\t}\n\n\t\tfunction hasContentType(clipboardContent, mimeType) {\n\t\t\treturn mimeType in clipboardContent && clipboardContent[mimeType].length > 0;\n\t\t}\n\n\t\tfunction isKeyboardPasteEvent(e) {\n\t\t\treturn (VK.metaKeyPressed(e) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45);\n\t\t}\n\n\t\tfunction registerEventHandlers() {\n\t\t\teditor.on('keydown', function(e) {\n\t\t\t\tfunction removePasteBinOnKeyUp(e) {\n\t\t\t\t\t// Ctrl+V or Shift+Insert\n\t\t\t\t\tif (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {\n\t\t\t\t\t\tremovePasteBin();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Ctrl+V or Shift+Insert\n\t\t\t\tif (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) {\n\t\t\t\t\tkeyboardPastePlainTextState = e.shiftKey && e.keyCode == 86;\n\n\t\t\t\t\t// Edge case on Safari on Mac where it doesn't handle Cmd+Shift+V correctly\n\t\t\t\t\t// it fires the keydown but no paste or keyup so we are left with a paste bin\n\t\t\t\t\tif (keyboardPastePlainTextState && Env.webkit && navigator.userAgent.indexOf('Version/') != -1) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent undoManager keydown handler from making an undo level with the pastebin in it\n\t\t\t\t\te.stopImmediatePropagation();\n\n\t\t\t\t\tkeyboardPasteTimeStamp = new Date().getTime();\n\n\t\t\t\t\t// IE doesn't support Ctrl+Shift+V and it doesn't even produce a paste event\n\t\t\t\t\t// so lets fake a paste event and let IE use the execCommand/dataTransfer methods\n\t\t\t\t\tif (Env.ie && keyboardPastePlainTextState) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\teditor.fire('paste', {ieFake: true});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tremovePasteBin();\n\t\t\t\t\tcreatePasteBin();\n\n\t\t\t\t\t// Remove pastebin if we get a keyup and no paste event\n\t\t\t\t\t// For example pasting a file in IE 11 will not produce a paste event\n\t\t\t\t\teditor.once('keyup', removePasteBinOnKeyUp);\n\t\t\t\t\teditor.once('paste', function() {\n\t\t\t\t\t\teditor.off('keyup', removePasteBinOnKeyUp);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teditor.on('paste', function(e) {\n\t\t\t\t// Getting content from the Clipboard can take some time\n\t\t\t\tvar clipboardTimer = new Date().getTime();\n\t\t\t\tvar clipboardContent = getClipboardContent(e);\n\t\t\t\tvar clipboardDelay = new Date().getTime() - clipboardTimer;\n\n\t\t\t\tvar isKeyBoardPaste = (new Date().getTime() - keyboardPasteTimeStamp - clipboardDelay) < 1000;\n\t\t\t\tvar plainTextMode = self.pasteFormat == \"text\" || keyboardPastePlainTextState;\n\n\t\t\t\tkeyboardPastePlainTextState = false;\n\n\t\t\t\tif (e.isDefaultPrevented() || isBrokenAndroidClipboardEvent(e)) {\n\t\t\t\t\tremovePasteBin();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (pasteImageData(e)) {\n\t\t\t\t\tremovePasteBin();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Not a keyboard paste prevent default paste and try to grab the clipboard contents using different APIs\n\t\t\t\tif (!isKeyBoardPaste) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\n\t\t\t\t// Try IE only method if paste isn't a keyboard paste\n\t\t\t\tif (Env.ie && (!isKeyBoardPaste || e.ieFake)) {\n\t\t\t\t\tcreatePasteBin();\n\n\t\t\t\t\teditor.dom.bind(pasteBinElm, 'paste', function(e) {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t});\n\n\t\t\t\t\teditor.getDoc().execCommand('Paste', false, null);\n\t\t\t\t\tclipboardContent[\"text/html\"] = getPasteBinHtml();\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tvar content;\n\n\t\t\t\t\t// Grab HTML from Clipboard API or paste bin as a fallback\n\t\t\t\t\tif (hasContentType(clipboardContent, 'text/html')) {\n\t\t\t\t\t\tcontent = clipboardContent['text/html'];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontent = getPasteBinHtml();\n\n\t\t\t\t\t\t// If paste bin is empty try using plain text mode\n\t\t\t\t\t\t// since that is better than nothing right\n\t\t\t\t\t\tif (content == pasteBinDefaultContent) {\n\t\t\t\t\t\t\tplainTextMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcontent = Utils.trimHtml(content);\n\n\t\t\t\t\t// WebKit has a nice bug where it clones the paste bin if you paste from for example notepad\n\t\t\t\t\t// so we need to force plain text mode in this case\n\t\t\t\t\tif (pasteBinElm && pasteBinElm.firstChild && pasteBinElm.firstChild.id === 'mcepastebin') {\n\t\t\t\t\t\tplainTextMode = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tremovePasteBin();\n\n\t\t\t\t\t// If we got nothing from clipboard API and pastebin then we could try the last resort: plain/text\n\t\t\t\t\tif (!content.length) {\n\t\t\t\t\t\tplainTextMode = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Grab plain text from Clipboard API or convert existing HTML to plain text\n\t\t\t\t\tif (plainTextMode) {\n\t\t\t\t\t\t// Use plain text contents from Clipboard API unless the HTML contains paragraphs then\n\t\t\t\t\t\t// we should convert the HTML to plain text since works better when pasting HTML/Word contents as plain text\n\t\t\t\t\t\tif (hasContentType(clipboardContent, 'text/plain') && content.indexOf('</p>') == -1) {\n\t\t\t\t\t\t\tcontent = clipboardContent['text/plain'];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontent = Utils.innerText(content);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the content is the paste bin default HTML then it was\n\t\t\t\t\t// impossible to get the cliboard data out.\n\t\t\t\t\tif (content == pasteBinDefaultContent) {\n\t\t\t\t\t\tif (!isKeyBoardPaste) {\n\t\t\t\t\t\t\teditor.windowManager.alert('Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (plainTextMode) {\n\t\t\t\t\t\tpasteText(content);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpasteHtml(content);\n\t\t\t\t\t}\n\t\t\t\t}, 0);\n\t\t\t});\n\n\t\t\teditor.on('dragstart dragend', function(e) {\n\t\t\t\tdraggingInternally = e.type == 'dragstart';\n\t\t\t});\n\n\t\t\teditor.on('drop', function(e) {\n\t\t\t\tvar rng = getCaretRangeFromEvent(e);\n\n\t\t\t\tif (e.isDefaultPrevented() || draggingInternally) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (pasteImageData(e, rng)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (rng && editor.settings.paste_filter_drop !== false) {\n\t\t\t\t\tvar dropContent = getDataTransferItems(e.dataTransfer);\n\t\t\t\t\tvar content = dropContent['mce-internal'] || dropContent['text/html'] || dropContent['text/plain'];\n\n\t\t\t\t\tif (content) {\n\t\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\t\teditor.undoManager.transact(function() {\n\t\t\t\t\t\t\tif (dropContent['mce-internal']) {\n\t\t\t\t\t\t\t\teditor.execCommand('Delete');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\teditor.selection.setRng(rng);\n\n\t\t\t\t\t\t\tcontent = Utils.trimHtml(content);\n\n\t\t\t\t\t\t\tif (!dropContent['text/html']) {\n\t\t\t\t\t\t\t\tpasteText(content);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpasteHtml(content);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teditor.on('dragover dragend', function(e) {\n\t\t\t\tif (editor.settings.paste_data_images) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tself.pasteHtml = pasteHtml;\n\t\tself.pasteText = pasteText;\n\n\t\teditor.on('preInit', function() {\n\t\t\tregisterEventHandlers();\n\n\t\t\t// Remove all data images from paste for example from Gecko\n\t\t\t// except internal images like video elements\n\t\t\teditor.parser.addNodeFilter('img', function(nodes, name, args) {\n\t\t\t\tfunction isPasteInsert(args) {\n\t\t\t\t\treturn args.data && args.data.paste === true;\n\t\t\t\t}\n\n\t\t\t\tfunction remove(node) {\n\t\t\t\t\tif (!node.attr('data-mce-object') && src !== Env.transparentSrc) {\n\t\t\t\t\t\tnode.remove();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction isWebKitFakeUrl(src) {\n\t\t\t\t\treturn src.indexOf(\"webkit-fake-url\") === 0;\n\t\t\t\t}\n\n\t\t\t\tfunction isDataUri(src) {\n\t\t\t\t\treturn src.indexOf(\"data:\") === 0;\n\t\t\t\t}\n\n\t\t\t\tif (!editor.settings.paste_data_images && isPasteInsert(args)) {\n\t\t\t\t\tvar i = nodes.length;\n\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\tvar src = nodes[i].attributes.map.src;\n\n\t\t\t\t\t\tif (!src) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Safari on Mac produces webkit-fake-url see: https://bugs.webkit.org/show_bug.cgi?id=49141\n\t\t\t\t\t\tif (isWebKitFakeUrl(src)) {\n\t\t\t\t\t\t\tremove(nodes[i]);\n\t\t\t\t\t\t} else if (!editor.settings.allow_html_data_urls && isDataUri(src)) {\n\t\t\t\t\t\t\tremove(nodes[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t};\n});\n\n// Included from: js/tinymce/plugins/paste/classes/WordFilter.js\n\n/**\n * WordFilter.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/**\n * This class parses word HTML into proper TinyMCE markup.\n *\n * @class tinymce.pasteplugin.WordFilter\n * @private\n */\ndefine(\"tinymce/pasteplugin/WordFilter\", [\n\t\"tinymce/util/Tools\",\n\t\"tinymce/html/DomParser\",\n\t\"tinymce/html/Schema\",\n\t\"tinymce/html/Serializer\",\n\t\"tinymce/html/Node\",\n\t\"tinymce/pasteplugin/Utils\"\n], function(Tools, DomParser, Schema, Serializer, Node, Utils) {\n\t/**\n\t * Checks if the specified content is from any of the following sources: MS Word/Office 365/Google docs.\n\t */\n\tfunction isWordContent(content) {\n\t\treturn (\n\t\t\t(/<font face=\"Times New Roman\"|class=\"?Mso|style=\"[^\"]*\\bmso-|style='[^'']*\\bmso-|w:WordDocument/i).test(content) ||\n\t\t\t(/class=\"OutlineElement/).test(content) ||\n\t\t\t(/id=\"?docs\\-internal\\-guid\\-/.test(content))\n\t\t);\n\t}\n\n\t/**\n\t * Checks if the specified text starts with \"1. \" or \"a. \" etc.\n\t */\n\tfunction isNumericList(text) {\n\t\tvar found, patterns;\n\n\t\tpatterns = [\n\t\t\t/^[IVXLMCD]{1,2}\\.[ \\u00a0]/,  // Roman upper case\n\t\t\t/^[ivxlmcd]{1,2}\\.[ \\u00a0]/,  // Roman lower case\n\t\t\t/^[a-z]{1,2}[\\.\\)][ \\u00a0]/,  // Alphabetical a-z\n\t\t\t/^[A-Z]{1,2}[\\.\\)][ \\u00a0]/,  // Alphabetical A-Z\n\t\t\t/^[0-9]+\\.[ \\u00a0]/,          // Numeric lists\n\t\t\t/^[\\u3007\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d]+\\.[ \\u00a0]/, // Japanese\n\t\t\t/^[\\u58f1\\u5f10\\u53c2\\u56db\\u4f0d\\u516d\\u4e03\\u516b\\u4e5d\\u62fe]+\\.[ \\u00a0]/  // Chinese\n\t\t];\n\n\t\ttext = text.replace(/^[\\u00a0 ]+/, '');\n\n\t\tTools.each(patterns, function(pattern) {\n\t\t\tif (pattern.test(text)) {\n\t\t\t\tfound = true;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\treturn found;\n\t}\n\n\tfunction isBulletList(text) {\n\t\treturn /^[\\s\\u00a0]*[\\u2022\\u00b7\\u00a7\\u25CF]\\s*/.test(text);\n\t}\n\n\tfunction WordFilter(editor) {\n\t\tvar settings = editor.settings;\n\n\t\teditor.on('BeforePastePreProcess', function(e) {\n\t\t\tvar content = e.content, retainStyleProperties, validStyles;\n\n\t\t\t// Remove google docs internal guid markers\n\t\t\tcontent = content.replace(/<b[^>]+id=\"?docs-internal-[^>]*>/gi, '');\n\t\t\tcontent = content.replace(/<br class=\"?Apple-interchange-newline\"?>/gi, '');\n\n\t\t\tretainStyleProperties = settings.paste_retain_style_properties;\n\t\t\tif (retainStyleProperties) {\n\t\t\t\tvalidStyles = Tools.makeMap(retainStyleProperties.split(/[, ]/));\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Converts fake bullet and numbered lists to real semantic OL/UL.\n\t\t\t *\n\t\t\t * @param {tinymce.html.Node} node Root node to convert children of.\n\t\t\t */\n\t\t\tfunction convertFakeListsToProperLists(node) {\n\t\t\t\tvar currentListNode, prevListNode, lastLevel = 1;\n\n\t\t\t\tfunction getText(node) {\n\t\t\t\t\tvar txt = '';\n\n\t\t\t\t\tif (node.type === 3) {\n\t\t\t\t\t\treturn node.value;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((node = node.firstChild)) {\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\ttxt += getText(node);\n\t\t\t\t\t\t} while ((node = node.next));\n\t\t\t\t\t}\n\n\t\t\t\t\treturn txt;\n\t\t\t\t}\n\n\t\t\t\tfunction trimListStart(node, regExp) {\n\t\t\t\t\tif (node.type === 3) {\n\t\t\t\t\t\tif (regExp.test(node.value)) {\n\t\t\t\t\t\t\tnode.value = node.value.replace(regExp, '');\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((node = node.firstChild)) {\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\tif (!trimListStart(node, regExp)) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} while ((node = node.next));\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tfunction removeIgnoredNodes(node) {\n\t\t\t\t\tif (node._listIgnore) {\n\t\t\t\t\t\tnode.remove();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ((node = node.firstChild)) {\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\tremoveIgnoredNodes(node);\n\t\t\t\t\t\t} while ((node = node.next));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction convertParagraphToLi(paragraphNode, listName, start) {\n\t\t\t\t\tvar level = paragraphNode._listLevel || lastLevel;\n\n\t\t\t\t\t// Handle list nesting\n\t\t\t\t\tif (level != lastLevel) {\n\t\t\t\t\t\tif (level < lastLevel) {\n\t\t\t\t\t\t\t// Move to parent list\n\t\t\t\t\t\t\tif (currentListNode) {\n\t\t\t\t\t\t\t\tcurrentListNode = currentListNode.parent.parent;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Create new list\n\t\t\t\t\t\t\tprevListNode = currentListNode;\n\t\t\t\t\t\t\tcurrentListNode = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!currentListNode || currentListNode.name != listName) {\n\t\t\t\t\t\tprevListNode = prevListNode || currentListNode;\n\t\t\t\t\t\tcurrentListNode = new Node(listName, 1);\n\n\t\t\t\t\t\tif (start > 1) {\n\t\t\t\t\t\t\tcurrentListNode.attr('start', '' + start);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparagraphNode.wrap(currentListNode);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrentListNode.append(paragraphNode);\n\t\t\t\t\t}\n\n\t\t\t\t\tparagraphNode.name = 'li';\n\n\t\t\t\t\t// Append list to previous list if it exists\n\t\t\t\t\tif (level > lastLevel && prevListNode) {\n\t\t\t\t\t\tprevListNode.lastChild.append(currentListNode);\n\t\t\t\t\t}\n\n\t\t\t\t\tlastLevel = level;\n\n\t\t\t\t\t// Remove start of list item \"1. \" or \"&middot; \" etc\n\t\t\t\t\tremoveIgnoredNodes(paragraphNode);\n\t\t\t\t\ttrimListStart(paragraphNode, /^\\u00a0+/);\n\t\t\t\t\ttrimListStart(paragraphNode, /^\\s*([\\u2022\\u00b7\\u00a7\\u25CF]|\\w+\\.)/);\n\t\t\t\t\ttrimListStart(paragraphNode, /^\\u00a0+/);\n\t\t\t\t}\n\n\t\t\t\t// Build a list of all root level elements before we start\n\t\t\t\t// altering them in the loop below.\n\t\t\t\tvar elements = [], child = node.firstChild;\n\t\t\t\twhile (typeof child !== 'undefined' && child !== null) {\n\t\t\t\t\telements.push(child);\n\n\t\t\t\t\tchild = child.walk();\n\t\t\t\t\tif (child !== null) {\n\t\t\t\t\t\twhile (typeof child !== 'undefined' && child.parent !== node) {\n\t\t\t\t\t\t\tchild = child.walk();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0; i < elements.length; i++) {\n\t\t\t\t\tnode = elements[i];\n\n\t\t\t\t\tif (node.name == 'p' && node.firstChild) {\n\t\t\t\t\t\t// Find first text node in paragraph\n\t\t\t\t\t\tvar nodeText = getText(node);\n\n\t\t\t\t\t\t// Detect unordered lists look for bullets\n\t\t\t\t\t\tif (isBulletList(nodeText)) {\n\t\t\t\t\t\t\tconvertParagraphToLi(node, 'ul');\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Detect ordered lists 1., a. or ixv.\n\t\t\t\t\t\tif (isNumericList(nodeText)) {\n\t\t\t\t\t\t\t// Parse OL start number\n\t\t\t\t\t\t\tvar matches = /([0-9]+)\\./.exec(nodeText);\n\t\t\t\t\t\t\tvar start = 1;\n\t\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\t\tstart = parseInt(matches[1], 10);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconvertParagraphToLi(node, 'ol', start);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Convert paragraphs marked as lists but doesn't look like anything\n\t\t\t\t\t\tif (node._listLevel) {\n\t\t\t\t\t\t\tconvertParagraphToLi(node, 'ul', 1);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentListNode = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If the root level element isn't a p tag which can be\n\t\t\t\t\t\t// processed by convertParagraphToLi, it interrupts the\n\t\t\t\t\t\t// lists, causing a new list to start instead of having\n\t\t\t\t\t\t// elements from the next list inserted above this tag.\n\t\t\t\t\t\tprevListNode = currentListNode;\n\t\t\t\t\t\tcurrentListNode = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction filterStyles(node, styleValue) {\n\t\t\t\tvar outputStyles = {}, matches, styles = editor.dom.parseStyle(styleValue);\n\n\t\t\t\tTools.each(styles, function(value, name) {\n\t\t\t\t\t// Convert various MS styles to W3C styles\n\t\t\t\t\tswitch (name) {\n\t\t\t\t\t\tcase 'mso-list':\n\t\t\t\t\t\t\t// Parse out list indent level for lists\n\t\t\t\t\t\t\tmatches = /\\w+ \\w+([0-9]+)/i.exec(styleValue);\n\t\t\t\t\t\t\tif (matches) {\n\t\t\t\t\t\t\t\tnode._listLevel = parseInt(matches[1], 10);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Remove these nodes <span style=\"mso-list:Ignore\">o</span>\n\t\t\t\t\t\t\t// Since the span gets removed we mark the text node and the span\n\t\t\t\t\t\t\tif (/Ignore/i.test(value) && node.firstChild) {\n\t\t\t\t\t\t\t\tnode._listIgnore = true;\n\t\t\t\t\t\t\t\tnode.firstChild._listIgnore = true;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"horiz-align\":\n\t\t\t\t\t\t\tname = \"text-align\";\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"vert-align\":\n\t\t\t\t\t\t\tname = \"vertical-align\";\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"font-color\":\n\t\t\t\t\t\tcase \"mso-foreground\":\n\t\t\t\t\t\t\tname = \"color\";\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"mso-background\":\n\t\t\t\t\t\tcase \"mso-highlight\":\n\t\t\t\t\t\t\tname = \"background\";\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"font-weight\":\n\t\t\t\t\t\tcase \"font-style\":\n\t\t\t\t\t\t\tif (value != \"normal\") {\n\t\t\t\t\t\t\t\toutputStyles[name] = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\tcase \"mso-element\":\n\t\t\t\t\t\t\t// Remove track changes code\n\t\t\t\t\t\t\tif (/^(comment|comment-list)$/i.test(value)) {\n\t\t\t\t\t\t\t\tnode.remove();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (name.indexOf('mso-comment') === 0) {\n\t\t\t\t\t\tnode.remove();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never allow mso- prefixed names\n\t\t\t\t\tif (name.indexOf('mso-') === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Output only valid styles\n\t\t\t\t\tif (retainStyleProperties == \"all\" || (validStyles && validStyles[name])) {\n\t\t\t\t\t\toutputStyles[name] = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Convert bold style to \"b\" element\n\t\t\t\tif (/(bold)/i.test(outputStyles[\"font-weight\"])) {\n\t\t\t\t\tdelete outputStyles[\"font-weight\"];\n\t\t\t\t\tnode.wrap(new Node(\"b\", 1));\n\t\t\t\t}\n\n\t\t\t\t// Convert italic style to \"i\" element\n\t\t\t\tif (/(italic)/i.test(outputStyles[\"font-style\"])) {\n\t\t\t\t\tdelete outputStyles[\"font-style\"];\n\t\t\t\t\tnode.wrap(new Node(\"i\", 1));\n\t\t\t\t}\n\n\t\t\t\t// Serialize the styles and see if there is something left to keep\n\t\t\t\toutputStyles = editor.dom.serializeStyle(outputStyles, node.name);\n\t\t\t\tif (outputStyles) {\n\t\t\t\t\treturn outputStyles;\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (settings.paste_enable_default_filters === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Detect is the contents is Word junk HTML\n\t\t\tif (isWordContent(e.content)) {\n\t\t\t\te.wordContent = true; // Mark it for other processors\n\n\t\t\t\t// Remove basic Word junk\n\t\t\t\tcontent = Utils.filter(content, [\n\t\t\t\t\t// Word comments like conditional comments etc\n\t\t\t\t\t/<!--[\\s\\S]+?-->/gi,\n\n\t\t\t\t\t// Remove comments, scripts (e.g., msoShowComment), XML tag, VML content,\n\t\t\t\t\t// MS Office namespaced tags, and a few other tags\n\t\t\t\t\t/<(!|script[^>]*>.*?<\\/script(?=[>\\s])|\\/?(\\?xml(:\\w+)?|img|meta|link|style|\\w:\\w+)(?=[\\s\\/>]))[^>]*>/gi,\n\n\t\t\t\t\t// Convert <s> into <strike> for line-though\n\t\t\t\t\t[/<(\\/?)s>/gi, \"<$1strike>\"],\n\n\t\t\t\t\t// Replace nsbp entites to char since it's easier to handle\n\t\t\t\t\t[/&nbsp;/gi, \"\\u00a0\"],\n\n\t\t\t\t\t// Convert <span style=\"mso-spacerun:yes\">___</span> to string of alternating\n\t\t\t\t\t// breaking/non-breaking spaces of same length\n\t\t\t\t\t[/<span\\s+style\\s*=\\s*\"\\s*mso-spacerun\\s*:\\s*yes\\s*;?\\s*\"\\s*>([\\s\\u00a0]*)<\\/span>/gi,\n\t\t\t\t\t\tfunction(str, spaces) {\n\t\t\t\t\t\t\treturn (spaces.length > 0) ?\n\t\t\t\t\t\t\t\tspaces.replace(/./, \" \").slice(Math.floor(spaces.length / 2)).split(\"\").join(\"\\u00a0\") : \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t]);\n\n\t\t\t\tvar validElements = settings.paste_word_valid_elements;\n\t\t\t\tif (!validElements) {\n\t\t\t\t\tvalidElements = (\n\t\t\t\t\t\t'-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,' +\n\t\t\t\t\t\t'-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,' +\n\t\t\t\t\t\t'td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody'\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Setup strict schema\n\t\t\t\tvar schema = new Schema({\n\t\t\t\t\tvalid_elements: validElements,\n\t\t\t\t\tvalid_children: '-li[p]'\n\t\t\t\t});\n\n\t\t\t\t// Add style/class attribute to all element rules since the user might have removed them from\n\t\t\t\t// paste_word_valid_elements config option and we need to check them for properties\n\t\t\t\tTools.each(schema.elements, function(rule) {\n\t\t\t\t\t/*eslint dot-notation:0*/\n\t\t\t\t\tif (!rule.attributes[\"class\"]) {\n\t\t\t\t\t\trule.attributes[\"class\"] = {};\n\t\t\t\t\t\trule.attributesOrder.push(\"class\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!rule.attributes.style) {\n\t\t\t\t\t\trule.attributes.style = {};\n\t\t\t\t\t\trule.attributesOrder.push(\"style\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Parse HTML into DOM structure\n\t\t\t\tvar domParser = new DomParser({}, schema);\n\n\t\t\t\t// Filter styles to remove \"mso\" specific styles and convert some of them\n\t\t\t\tdomParser.addAttributeFilter('style', function(nodes) {\n\t\t\t\t\tvar i = nodes.length, node;\n\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\tnode = nodes[i];\n\t\t\t\t\t\tnode.attr('style', filterStyles(node, node.attr('style')));\n\n\t\t\t\t\t\t// Remove pointess spans\n\t\t\t\t\t\tif (node.name == 'span' && node.parent && !node.attributes.length) {\n\t\t\t\t\t\t\tnode.unwrap();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Check the class attribute for comments or del items and remove those\n\t\t\t\tdomParser.addAttributeFilter('class', function(nodes) {\n\t\t\t\t\tvar i = nodes.length, node, className;\n\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\tnode = nodes[i];\n\n\t\t\t\t\t\tclassName = node.attr('class');\n\t\t\t\t\t\tif (/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(className)) {\n\t\t\t\t\t\t\tnode.remove();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnode.attr('class', null);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Remove all del elements since we don't want the track changes code in the editor\n\t\t\t\tdomParser.addNodeFilter('del', function(nodes) {\n\t\t\t\t\tvar i = nodes.length;\n\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\tnodes[i].remove();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Keep some of the links and anchors\n\t\t\t\tdomParser.addNodeFilter('a', function(nodes) {\n\t\t\t\t\tvar i = nodes.length, node, href, name;\n\n\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\tnode = nodes[i];\n\t\t\t\t\t\thref = node.attr('href');\n\t\t\t\t\t\tname = node.attr('name');\n\n\t\t\t\t\t\tif (href && href.indexOf('#_msocom_') != -1) {\n\t\t\t\t\t\t\tnode.remove();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (href && href.indexOf('file://') === 0) {\n\t\t\t\t\t\t\thref = href.split('#')[1];\n\t\t\t\t\t\t\tif (href) {\n\t\t\t\t\t\t\t\thref = '#' + href;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!href && !name) {\n\t\t\t\t\t\t\tnode.unwrap();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Remove all named anchors that aren't specific to TOC, Footnotes or Endnotes\n\t\t\t\t\t\t\tif (name && !/^_?(?:toc|edn|ftn)/i.test(name)) {\n\t\t\t\t\t\t\t\tnode.unwrap();\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tnode.attr({\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tname: name\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Parse into DOM structure\n\t\t\t\tvar rootNode = domParser.parse(content);\n\n\t\t\t\t// Process DOM\n\t\t\t\tif (settings.paste_convert_word_fake_lists !== false) {\n\t\t\t\t\tconvertFakeListsToProperLists(rootNode);\n\t\t\t\t}\n\n\t\t\t\t// Serialize DOM back to HTML\n\t\t\t\te.content = new Serializer({\n\t\t\t\t\tvalidate: settings.validate\n\t\t\t\t}, schema).serialize(rootNode);\n\t\t\t}\n\t\t});\n\t}\n\n\tWordFilter.isWordContent = isWordContent;\n\n\treturn WordFilter;\n});\n\n// Included from: js/tinymce/plugins/paste/classes/Quirks.js\n\n/**\n * Quirks.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/**\n * This class contains various fixes for browsers. These issues can not be feature\n * detected since we have no direct control over the clipboard. However we might be able\n * to remove some of these fixes once the browsers gets updated/fixed.\n *\n * @class tinymce.pasteplugin.Quirks\n * @private\n */\ndefine(\"tinymce/pasteplugin/Quirks\", [\n\t\"tinymce/Env\",\n\t\"tinymce/util/Tools\",\n\t\"tinymce/pasteplugin/WordFilter\",\n\t\"tinymce/pasteplugin/Utils\"\n], function(Env, Tools, WordFilter, Utils) {\n\t\"use strict\";\n\n\treturn function(editor) {\n\t\tfunction addPreProcessFilter(filterFunc) {\n\t\t\teditor.on('BeforePastePreProcess', function(e) {\n\t\t\t\te.content = filterFunc(e.content);\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Removes BR elements after block elements. IE9 has a nasty bug where it puts a BR element after each\n\t\t * block element when pasting from word. This removes those elements.\n\t\t *\n\t\t * This:\n\t\t *  <p>a</p><br><p>b</p>\n\t\t *\n\t\t * Becomes:\n\t\t *  <p>a</p><p>b</p>\n\t\t */\n\t\tfunction removeExplorerBrElementsAfterBlocks(html) {\n\t\t\t// Only filter word specific content\n\t\t\tif (!WordFilter.isWordContent(html)) {\n\t\t\t\treturn html;\n\t\t\t}\n\n\t\t\t// Produce block regexp based on the block elements in schema\n\t\t\tvar blockElements = [];\n\n\t\t\tTools.each(editor.schema.getBlockElements(), function(block, blockName) {\n\t\t\t\tblockElements.push(blockName);\n\t\t\t});\n\n\t\t\tvar explorerBlocksRegExp = new RegExp(\n\t\t\t\t'(?:<br>&nbsp;[\\\\s\\\\r\\\\n]+|<br>)*(<\\\\/?(' + blockElements.join('|') + ')[^>]*>)(?:<br>&nbsp;[\\\\s\\\\r\\\\n]+|<br>)*',\n\t\t\t\t'g'\n\t\t\t);\n\n\t\t\t// Remove BR:s from: <BLOCK>X</BLOCK><BR>\n\t\t\thtml = Utils.filter(html, [\n\t\t\t\t[explorerBlocksRegExp, '$1']\n\t\t\t]);\n\n\t\t\t// IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break\n\t\t\thtml = Utils.filter(html, [\n\t\t\t\t[/<br><br>/g, '<BR><BR>'], // Replace multiple BR elements with uppercase BR to keep them intact\n\t\t\t\t[/<br>/g, ' '],            // Replace single br elements with space since they are word wrap BR:s\n\t\t\t\t[/<BR><BR>/g, '<br>']      // Replace back the double brs but into a single BR\n\t\t\t]);\n\n\t\t\treturn html;\n\t\t}\n\n\t\t/**\n\t\t * WebKit has a nasty bug where the all computed styles gets added to style attributes when copy/pasting contents.\n\t\t * This fix solves that by simply removing the whole style attribute.\n\t\t *\n\t\t * The paste_webkit_styles option can be set to specify what to keep:\n\t\t *  paste_webkit_styles: \"none\" // Keep no styles\n\t\t *  paste_webkit_styles: \"all\", // Keep all of them\n\t\t *  paste_webkit_styles: \"font-weight color\" // Keep specific ones\n\t\t *\n\t\t * @param {String} content Content that needs to be processed.\n\t\t * @return {String} Processed contents.\n\t\t */\n\t\tfunction removeWebKitStyles(content) {\n\t\t\t// Passthrough all styles from Word and let the WordFilter handle that junk\n\t\t\tif (WordFilter.isWordContent(content)) {\n\t\t\t\treturn content;\n\t\t\t}\n\n\t\t\t// Filter away styles that isn't matching the target node\n\t\t\tvar webKitStyles = editor.settings.paste_webkit_styles;\n\n\t\t\tif (editor.settings.paste_remove_styles_if_webkit === false || webKitStyles == \"all\") {\n\t\t\t\treturn content;\n\t\t\t}\n\n\t\t\tif (webKitStyles) {\n\t\t\t\twebKitStyles = webKitStyles.split(/[, ]/);\n\t\t\t}\n\n\t\t\t// Keep specific styles that doesn't match the current node computed style\n\t\t\tif (webKitStyles) {\n\t\t\t\tvar dom = editor.dom, node = editor.selection.getNode();\n\n\t\t\t\tcontent = content.replace(/(<[^>]+) style=\"([^\"]*)\"([^>]*>)/gi, function(all, before, value, after) {\n\t\t\t\t\tvar inputStyles = dom.parseStyle(value, 'span'), outputStyles = {};\n\n\t\t\t\t\tif (webKitStyles === \"none\") {\n\t\t\t\t\t\treturn before + after;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (var i = 0; i < webKitStyles.length; i++) {\n\t\t\t\t\t\tvar inputValue = inputStyles[webKitStyles[i]], currentValue = dom.getStyle(node, webKitStyles[i], true);\n\n\t\t\t\t\t\tif (/color/.test(webKitStyles[i])) {\n\t\t\t\t\t\t\tinputValue = dom.toHex(inputValue);\n\t\t\t\t\t\t\tcurrentValue = dom.toHex(currentValue);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (currentValue != inputValue) {\n\t\t\t\t\t\t\toutputStyles[webKitStyles[i]] = inputValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\toutputStyles = dom.serializeStyle(outputStyles, 'span');\n\t\t\t\t\tif (outputStyles) {\n\t\t\t\t\t\treturn before + ' style=\"' + outputStyles + '\"' + after;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn before + after;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Remove all external styles\n\t\t\t\tcontent = content.replace(/(<[^>]+) style=\"([^\"]*)\"([^>]*>)/gi, '$1$3');\n\t\t\t}\n\n\t\t\t// Keep internal styles\n\t\t\tcontent = content.replace(/(<[^>]+) data-mce-style=\"([^\"]+)\"([^>]*>)/gi, function(all, before, value, after) {\n\t\t\t\treturn before + ' style=\"' + value + '\"' + after;\n\t\t\t});\n\n\t\t\treturn content;\n\t\t}\n\n\t\t// Sniff browsers and apply fixes since we can't feature detect\n\t\tif (Env.webkit) {\n\t\t\taddPreProcessFilter(removeWebKitStyles);\n\t\t}\n\n\t\tif (Env.ie) {\n\t\t\taddPreProcessFilter(removeExplorerBrElementsAfterBlocks);\n\t\t}\n\t};\n});\n\n// Included from: js/tinymce/plugins/paste/classes/Plugin.js\n\n/**\n * Plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/**\n * This class contains the tinymce plugin logic for the paste plugin.\n *\n * @class tinymce.pasteplugin.Plugin\n * @private\n */\ndefine(\"tinymce/pasteplugin/Plugin\", [\n\t\"tinymce/PluginManager\",\n\t\"tinymce/pasteplugin/Clipboard\",\n\t\"tinymce/pasteplugin/WordFilter\",\n\t\"tinymce/pasteplugin/Quirks\"\n], function(PluginManager, Clipboard, WordFilter, Quirks) {\n\tvar userIsInformed;\n\n\tPluginManager.add('paste', function(editor) {\n\t\tvar self = this, clipboard, settings = editor.settings;\n\n\t\tfunction togglePlainTextPaste() {\n\t\t\tif (clipboard.pasteFormat == \"text\") {\n\t\t\t\tthis.active(false);\n\t\t\t\tclipboard.pasteFormat = \"html\";\n\t\t\t} else {\n\t\t\t\tclipboard.pasteFormat = \"text\";\n\t\t\t\tthis.active(true);\n\n\t\t\t\tif (!userIsInformed) {\n\t\t\t\t\teditor.windowManager.alert(\n\t\t\t\t\t\t'Paste is now in plain text mode. Contents will now ' +\n\t\t\t\t\t\t'be pasted as plain text until you toggle this option off.'\n\t\t\t\t\t);\n\n\t\t\t\t\tuserIsInformed = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tself.clipboard = clipboard = new Clipboard(editor);\n\t\tself.quirks = new Quirks(editor);\n\t\tself.wordFilter = new WordFilter(editor);\n\n\t\tif (editor.settings.paste_as_text) {\n\t\t\tself.clipboard.pasteFormat = \"text\";\n\t\t}\n\n\t\tif (settings.paste_preprocess) {\n\t\t\teditor.on('PastePreProcess', function(e) {\n\t\t\t\tsettings.paste_preprocess.call(self, self, e);\n\t\t\t});\n\t\t}\n\n\t\tif (settings.paste_postprocess) {\n\t\t\teditor.on('PastePostProcess', function(e) {\n\t\t\t\tsettings.paste_postprocess.call(self, self, e);\n\t\t\t});\n\t\t}\n\n\t\teditor.addCommand('mceInsertClipboardContent', function(ui, value) {\n\t\t\tif (value.content) {\n\t\t\t\tself.clipboard.pasteHtml(value.content);\n\t\t\t}\n\n\t\t\tif (value.text) {\n\t\t\t\tself.clipboard.pasteText(value.text);\n\t\t\t}\n\t\t});\n\n\t\t// Block all drag/drop events\n\t\tif (editor.paste_block_drop) {\n\t\t\teditor.on('dragend dragover draggesture dragdrop drop drag', function(e) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t}\n\n\t\t// Prevent users from dropping data images on Gecko\n\t\tif (!editor.settings.paste_data_images) {\n\t\t\teditor.on('drop', function(e) {\n\t\t\t\tvar dataTransfer = e.dataTransfer;\n\n\t\t\t\tif (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\teditor.addButton('pastetext', {\n\t\t\ticon: 'pastetext',\n\t\t\ttooltip: 'Paste as text',\n\t\t\tonclick: togglePlainTextPaste,\n\t\t\tactive: self.clipboard.pasteFormat == \"text\"\n\t\t});\n\n\t\teditor.addMenuItem('pastetext', {\n\t\t\ttext: 'Paste as text',\n\t\t\tselectable: true,\n\t\t\tactive: clipboard.pasteFormat,\n\t\t\tonclick: togglePlainTextPaste\n\t\t});\n\t});\n});\n\nexpose([\"tinymce/pasteplugin/Utils\"]);\n})(this);"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/tabfocus/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.PluginManager.add('tabfocus', function(editor) {\n\tvar DOM = tinymce.DOM, each = tinymce.each, explode = tinymce.explode;\n\n\tfunction tabCancel(e) {\n\t\tif (e.keyCode === 9 && !e.ctrlKey && !e.altKey && !e.metaKey) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tfunction tabHandler(e) {\n\t\tvar x, el, v, i;\n\n\t\tif (e.keyCode !== 9 || e.ctrlKey || e.altKey || e.metaKey || e.isDefaultPrevented()) {\n\t\t\treturn;\n\t\t}\n\n\t\tfunction find(direction) {\n\t\t\tel = DOM.select(':input:enabled,*[tabindex]:not(iframe)');\n\n\t\t\tfunction canSelectRecursive(e) {\n\t\t\t\treturn e.nodeName === \"BODY\" || (e.type != 'hidden' &&\n\t\t\t\t\te.style.display != \"none\" &&\n\t\t\t\t\te.style.visibility != \"hidden\" && canSelectRecursive(e.parentNode));\n\t\t\t}\n\n\t\t\tfunction canSelect(el) {\n\t\t\t\treturn /INPUT|TEXTAREA|BUTTON/.test(el.tagName) && tinymce.get(e.id) && el.tabIndex != -1 && canSelectRecursive(el);\n\t\t\t}\n\n\t\t\teach(el, function(e, i) {\n\t\t\t\tif (e.id == editor.id) {\n\t\t\t\t\tx = i;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (direction > 0) {\n\t\t\t\tfor (i = x + 1; i < el.length; i++) {\n\t\t\t\t\tif (canSelect(el[i])) {\n\t\t\t\t\t\treturn el[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (i = x - 1; i >= 0; i--) {\n\t\t\t\t\tif (canSelect(el[i])) {\n\t\t\t\t\t\treturn el[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\tv = explode(editor.getParam('tab_focus', editor.getParam('tabfocus_elements', ':prev,:next')));\n\n\t\tif (v.length == 1) {\n\t\t\tv[1] = v[0];\n\t\t\tv[0] = ':prev';\n\t\t}\n\n\t\t// Find element to focus\n\t\tif (e.shiftKey) {\n\t\t\tif (v[0] == ':prev') {\n\t\t\t\tel = find(-1);\n\t\t\t} else {\n\t\t\t\tel = DOM.get(v[0]);\n\t\t\t}\n\t\t} else {\n\t\t\tif (v[1] == ':next') {\n\t\t\t\tel = find(1);\n\t\t\t} else {\n\t\t\t\tel = DOM.get(v[1]);\n\t\t\t}\n\t\t}\n\n\t\tif (el) {\n\t\t\tvar focusEditor = tinymce.get(el.id || el.name);\n\n\t\t\tif (el.id && focusEditor) {\n\t\t\t\tfocusEditor.focus();\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(function() {\n\t\t\t\t\tif (!tinymce.Env.webkit) {\n\t\t\t\t\t\twindow.focus();\n\t\t\t\t\t}\n\n\t\t\t\t\tel.focus();\n\t\t\t\t}, 10);\n\t\t\t}\n\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\teditor.on('init', function() {\n\t\tif (editor.inline) {\n\t\t\t// Remove default tabIndex in inline mode\n\t\t\ttinymce.DOM.setAttrib(editor.getBody(), 'tabIndex', null);\n\t\t}\n\n\t\teditor.on('keyup', tabCancel);\n\n\t\tif (tinymce.Env.gecko) {\n\t\t\teditor.on('keypress keydown', tabHandler);\n\t\t} else {\n\t\t\teditor.on('keydown', tabHandler);\n\t\t}\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/textcolor/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n/*eslint consistent-this:0 */\n\ntinymce.PluginManager.add('textcolor', function(editor) {\n\tvar cols, rows;\n\n\trows = editor.settings.textcolor_rows || 5;\n\tcols = editor.settings.textcolor_cols || 8;\n\n\tfunction getCurrentColor(format) {\n\t\tvar color;\n\n\t\teditor.dom.getParents(editor.selection.getStart(), function(elm) {\n\t\t\tvar value;\n\n\t\t\tif ((value = elm.style[format == 'forecolor' ? 'color' : 'background-color'])) {\n\t\t\t\tcolor = value;\n\t\t\t}\n\t\t});\n\n\t\treturn color;\n\t}\n\n\tfunction mapColors() {\n\t\tvar i, colors = [], colorMap;\n\n\t\tcolorMap = editor.settings.textcolor_map || [\n\t\t\t\"000000\", \"Black\",\n\t\t\t\"993300\", \"Burnt orange\",\n\t\t\t\"333300\", \"Dark olive\",\n\t\t\t\"003300\", \"Dark green\",\n\t\t\t\"003366\", \"Dark azure\",\n\t\t\t\"000080\", \"Navy Blue\",\n\t\t\t\"333399\", \"Indigo\",\n\t\t\t\"333333\", \"Very dark gray\",\n\t\t\t\"800000\", \"Maroon\",\n\t\t\t\"FF6600\", \"Orange\",\n\t\t\t\"808000\", \"Olive\",\n\t\t\t\"008000\", \"Green\",\n\t\t\t\"008080\", \"Teal\",\n\t\t\t\"0000FF\", \"Blue\",\n\t\t\t\"666699\", \"Grayish blue\",\n\t\t\t\"808080\", \"Gray\",\n\t\t\t\"FF0000\", \"Red\",\n\t\t\t\"FF9900\", \"Amber\",\n\t\t\t\"99CC00\", \"Yellow green\",\n\t\t\t\"339966\", \"Sea green\",\n\t\t\t\"33CCCC\", \"Turquoise\",\n\t\t\t\"3366FF\", \"Royal blue\",\n\t\t\t\"800080\", \"Purple\",\n\t\t\t\"999999\", \"Medium gray\",\n\t\t\t\"FF00FF\", \"Magenta\",\n\t\t\t\"FFCC00\", \"Gold\",\n\t\t\t\"FFFF00\", \"Yellow\",\n\t\t\t\"00FF00\", \"Lime\",\n\t\t\t\"00FFFF\", \"Aqua\",\n\t\t\t\"00CCFF\", \"Sky blue\",\n\t\t\t\"993366\", \"Red violet\",\n\t\t\t\"FFFFFF\", \"White\",\n\t\t\t\"FF99CC\", \"Pink\",\n\t\t\t\"FFCC99\", \"Peach\",\n\t\t\t\"FFFF99\", \"Light yellow\",\n\t\t\t\"CCFFCC\", \"Pale green\",\n\t\t\t\"CCFFFF\", \"Pale cyan\",\n\t\t\t\"99CCFF\", \"Light sky blue\",\n\t\t\t\"CC99FF\", \"Plum\"\n\t\t];\n\n\t\tfor (i = 0; i < colorMap.length; i += 2) {\n\t\t\tcolors.push({\n\t\t\t\ttext: colorMap[i + 1],\n\t\t\t\tcolor: '#' + colorMap[i]\n\t\t\t});\n\t\t}\n\n\t\treturn colors;\n\t}\n\n\tfunction renderColorPicker() {\n\t\tvar ctrl = this, colors, color, html, last, x, y, i, id = ctrl._id, count = 0;\n\n\t\tfunction getColorCellHtml(color, title) {\n\t\t\tvar isNoColor = color == 'transparent';\n\n\t\t\treturn (\n\t\t\t\t'<td class=\"mce-grid-cell' + (isNoColor ? ' mce-colorbtn-trans' : '') + '\">' +\n\t\t\t\t\t'<div id=\"' + id + '-' + (count++) + '\"' +\n\t\t\t\t\t\t' data-mce-color=\"' + (color ? color : '') + '\"' +\n\t\t\t\t\t\t' role=\"option\"' +\n\t\t\t\t\t\t' tabIndex=\"-1\"' +\n\t\t\t\t\t\t' style=\"' + (color ? 'background-color: ' + color : '') + '\"' +\n\t\t\t\t\t\t' title=\"' + tinymce.translate(title) + '\">' +\n\t\t\t\t\t\t(isNoColor ? '&#215;' : '') +\n\t\t\t\t\t'</div>' +\n\t\t\t\t'</td>'\n\t\t\t);\n\t\t}\n\n\t\tcolors = mapColors();\n\t\tcolors.push({\n\t\t\ttext: tinymce.translate(\"No color\"),\n\t\t\tcolor: \"transparent\"\n\t\t});\n\n\t\thtml = '<table class=\"mce-grid mce-grid-border mce-colorbutton-grid\" role=\"list\" cellspacing=\"0\"><tbody>';\n\t\tlast = colors.length - 1;\n\n\t\tfor (y = 0; y < rows; y++) {\n\t\t\thtml += '<tr>';\n\n\t\t\tfor (x = 0; x < cols; x++) {\n\t\t\t\ti = y * cols + x;\n\n\t\t\t\tif (i > last) {\n\t\t\t\t\thtml += '<td></td>';\n\t\t\t\t} else {\n\t\t\t\t\tcolor = colors[i];\n\t\t\t\t\thtml += getColorCellHtml(color.color, color.text);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thtml += '</tr>';\n\t\t}\n\n\t\tif (editor.settings.color_picker_callback) {\n\t\t\thtml += (\n\t\t\t\t'<tr>' +\n\t\t\t\t\t'<td colspan=\"' + cols + '\" class=\"mce-custom-color-btn\">' +\n\t\t\t\t\t\t'<div id=\"' + id + '-c\" class=\"mce-widget mce-btn mce-btn-small mce-btn-flat\" ' +\n\t\t\t\t\t\t\t'role=\"button\" tabindex=\"-1\" aria-labelledby=\"' + id + '-c\" style=\"width: 100%\">' +\n\t\t\t\t\t\t\t'<button type=\"button\" role=\"presentation\" tabindex=\"-1\">' + tinymce.translate('Custom...') + '</button>' +\n\t\t\t\t\t\t'</div>' +\n\t\t\t\t\t'</td>' +\n\t\t\t\t'</tr>'\n\t\t\t);\n\n\t\t\thtml += '<tr>';\n\n\t\t\tfor (x = 0; x < cols; x++) {\n\t\t\t\thtml += getColorCellHtml('', 'Custom color');\n\t\t\t}\n\n\t\t\thtml += '</tr>';\n\t\t}\n\n\t\thtml += '</tbody></table>';\n\n\t\treturn html;\n\t}\n\n\tfunction applyFormat(format, value) {\n\t\teditor.undoManager.transact(function() {\n\t\t\teditor.focus();\n\t\t\teditor.formatter.apply(format, {value: value});\n\t\t\teditor.nodeChanged();\n\t\t});\n\t}\n\n\tfunction removeFormat(format) {\n\t\teditor.undoManager.transact(function() {\n\t\t\teditor.focus();\n\t\t\teditor.formatter.remove(format, {value: null}, null, true);\n\t\t\teditor.nodeChanged();\n\t\t});\n\t}\n\n\tfunction onPanelClick(e) {\n\t\tvar buttonCtrl = this.parent(), value;\n\n\t\tfunction selectColor(value) {\n\t\t\tbuttonCtrl.hidePanel();\n\t\t\tbuttonCtrl.color(value);\n\t\t\tapplyFormat(buttonCtrl.settings.format, value);\n\t\t}\n\n\t\tfunction resetColor() {\n\t\t\tbuttonCtrl.hidePanel();\n\t\t\tbuttonCtrl.resetColor();\n\t\t\tremoveFormat(buttonCtrl.settings.format);\n\t\t}\n\n\t\tfunction setDivColor(div, value) {\n\t\t\tdiv.style.background = value;\n\t\t\tdiv.setAttribute('data-mce-color', value);\n\t\t}\n\n\t\tif (tinymce.DOM.getParent(e.target, '.mce-custom-color-btn')) {\n\t\t\tbuttonCtrl.hidePanel();\n\n\t\t\teditor.settings.color_picker_callback.call(editor, function(value) {\n\t\t\t\tvar tableElm = buttonCtrl.panel.getEl().getElementsByTagName('table')[0];\n\t\t\t\tvar customColorCells, div, i;\n\n\t\t\t\tcustomColorCells = tinymce.map(tableElm.rows[tableElm.rows.length - 1].childNodes, function(elm) {\n\t\t\t\t\treturn elm.firstChild;\n\t\t\t\t});\n\n\t\t\t\tfor (i = 0; i < customColorCells.length; i++) {\n\t\t\t\t\tdiv = customColorCells[i];\n\t\t\t\t\tif (!div.getAttribute('data-mce-color')) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Shift colors to the right\n\t\t\t\t// TODO: Might need to be the left on RTL\n\t\t\t\tif (i == cols) {\n\t\t\t\t\tfor (i = 0; i < cols - 1; i++) {\n\t\t\t\t\t\tsetDivColor(customColorCells[i], customColorCells[i + 1].getAttribute('data-mce-color'));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsetDivColor(div, value);\n\t\t\t\tselectColor(value);\n\t\t\t}, getCurrentColor(buttonCtrl.settings.format));\n\t\t}\n\n\t\tvalue = e.target.getAttribute('data-mce-color');\n\t\tif (value) {\n\t\t\tif (this.lastId) {\n\t\t\t\tdocument.getElementById(this.lastId).setAttribute('aria-selected', false);\n\t\t\t}\n\n\t\t\te.target.setAttribute('aria-selected', true);\n\t\t\tthis.lastId = e.target.id;\n\n\t\t\tif (value == 'transparent') {\n\t\t\t\tresetColor();\n\t\t\t} else {\n\t\t\t\tselectColor(value);\n\t\t\t}\n\t\t} else if (value !== null) {\n\t\t\tbuttonCtrl.hidePanel();\n\t\t}\n\t}\n\n\tfunction onButtonClick() {\n\t\tvar self = this;\n\n\t\tif (self._color) {\n\t\t\tapplyFormat(self.settings.format, self._color);\n\t\t} else {\n\t\t\tremoveFormat(self.settings.format);\n\t\t}\n\t}\n\n\teditor.addButton('forecolor', {\n\t\ttype: 'colorbutton',\n\t\ttooltip: 'Text color',\n\t\tformat: 'forecolor',\n\t\tpanel: {\n\t\t\trole: 'application',\n\t\t\tariaRemember: true,\n\t\t\thtml: renderColorPicker,\n\t\t\tonclick: onPanelClick\n\t\t},\n\t\tonclick: onButtonClick\n\t});\n\n\teditor.addButton('backcolor', {\n\t\ttype: 'colorbutton',\n\t\ttooltip: 'Background color',\n\t\tformat: 'hilitecolor',\n\t\tpanel: {\n\t\t\trole: 'application',\n\t\t\tariaRemember: true,\n\t\t\thtml: renderColorPicker,\n\t\t\tonclick: onPanelClick\n\t\t},\n\t\tonclick: onButtonClick\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wordpress/plugin.js",
    "content": "/* global getUserSetting, setUserSetting */\n( function( tinymce ) {\n// Set the minimum value for the modals z-index higher than #wpadminbar (100000)\ntinymce.ui.FloatPanel.zIndex = 100100;\n\ntinymce.PluginManager.add( 'wordpress', function( editor ) {\n\tvar wpAdvButton, style,\n\t\tDOM = tinymce.DOM,\n\t\teach = tinymce.each,\n\t\t__ = editor.editorManager.i18n.translate,\n\t\t$ = window.jQuery,\n\t\twp = window.wp,\n\t\thasWpautop = ( wp && wp.editor && wp.editor.autop && editor.getParam( 'wpautop', true ) );\n\n\tif ( $ ) {\n\t\t$( document ).triggerHandler( 'tinymce-editor-setup', [ editor ] );\n\t}\n\n\tfunction toggleToolbars( state ) {\n\t\tvar iframe, initial, toolbars,\n\t\t\tpixels = 0;\n\n\t\tinitial = ( state === 'hide' );\n\n\t\tif ( editor.theme.panel ) {\n\t\t\ttoolbars = editor.theme.panel.find('.toolbar:not(.menubar)');\n\t\t}\n\n\t\tif ( ! toolbars || toolbars.length < 2 || ( state === 'hide' && ! toolbars[1].visible() ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! state && toolbars[1].visible() ) {\n\t\t\tstate = 'hide';\n\t\t}\n\n\t\teach( toolbars, function( toolbar, i ) {\n\t\t\tif ( i > 0 ) {\n\t\t\t\tif ( state === 'hide' ) {\n\t\t\t\t\ttoolbar.hide();\n\t\t\t\t\tpixels += 30;\n\t\t\t\t} else {\n\t\t\t\t\ttoolbar.show();\n\t\t\t\t\tpixels -= 30;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif ( pixels && ! initial ) {\n\t\t\t// Resize iframe, not needed in iOS\n\t\t\tif ( ! tinymce.Env.iOS ) {\n\t\t\t\tiframe = editor.getContentAreaContainer().firstChild;\n\t\t\t\tDOM.setStyle( iframe, 'height', iframe.clientHeight + pixels );\n\t\t\t}\n\n\t\t\tif ( state === 'hide' ) {\n\t\t\t\tsetUserSetting('hidetb', '0');\n\t\t\t\twpAdvButton && wpAdvButton.active( false );\n\t\t\t} else {\n\t\t\t\tsetUserSetting('hidetb', '1');\n\t\t\t\twpAdvButton && wpAdvButton.active( true );\n\t\t\t}\n\t\t}\n\n\t\teditor.fire( 'wp-toolbar-toggle' );\n\t}\n\n\t// Add the kitchen sink button :)\n\teditor.addButton( 'wp_adv', {\n\t\ttooltip: 'Toolbar Toggle',\n\t\tcmd: 'WP_Adv',\n\t\tonPostRender: function() {\n\t\t\twpAdvButton = this;\n\t\t\twpAdvButton.active( getUserSetting( 'hidetb' ) === '1' ? true : false );\n\t\t}\n\t});\n\n\t// Hide the toolbars after loading\n\teditor.on( 'PostRender', function() {\n\t\tif ( editor.getParam( 'wordpress_adv_hidden', true ) && getUserSetting( 'hidetb', '0' ) === '0' ) {\n\t\t\ttoggleToolbars( 'hide' );\n\t\t}\n\t});\n\n\teditor.addCommand( 'WP_Adv', function() {\n\t\ttoggleToolbars();\n\t});\n\n\teditor.on( 'focus', function() {\n        window.wpActiveEditor = editor.id;\n    });\n\n\t// Replace Read More/Next Page tags with images\n\teditor.on( 'BeforeSetContent', function( event ) {\n\t\tvar title;\n\n\t\tif ( event.content ) {\n\t\t\tif ( event.content.indexOf( '<!--more' ) !== -1 ) {\n\t\t\t\ttitle = __( 'Read more...' );\n\n\t\t\t\tevent.content = event.content.replace( /<!--more(.*?)-->/g, function( match, moretext ) {\n\t\t\t\t\treturn '<img src=\"' + tinymce.Env.transparentSrc + '\" data-wp-more=\"more\" data-wp-more-text=\"' + moretext + '\" ' +\n\t\t\t\t\t\t'class=\"wp-more-tag mce-wp-more\" alt=\"\" title=\"' + title + '\" data-mce-resize=\"false\" data-mce-placeholder=\"1\" />';\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( event.content.indexOf( '<!--nextpage-->' ) !== -1 ) {\n\t\t\t\ttitle = __( 'Page break' );\n\n\t\t\t\tevent.content = event.content.replace( /<!--nextpage-->/g,\n\t\t\t\t\t'<img src=\"' + tinymce.Env.transparentSrc + '\" data-wp-more=\"nextpage\" class=\"wp-more-tag mce-wp-nextpage\" ' +\n\t\t\t\t\t\t'alt=\"\" title=\"' + title + '\" data-mce-resize=\"false\" data-mce-placeholder=\"1\" />' );\n\t\t\t}\n\n\t\t\tif ( event.load && event.format !== 'raw' && hasWpautop ) {\n\t\t\t\tevent.content = wp.editor.autop( event.content );\n\t\t\t}\n\n\t\t\t// Remove spaces from empty paragraphs.\n\t\t\tevent.content = event.content.replace( /<p>(?:&nbsp;|\\u00a0|\\uFEFF|\\s)+<\\/p>/gi, '<p><br /></p>' );\n\t\t}\n\t});\n\n\t// Replace images with tags\n\teditor.on( 'PostProcess', function( e ) {\n\t\tif ( e.get ) {\n\t\t\te.content = e.content.replace(/<img[^>]+>/g, function( image ) {\n\t\t\t\tvar match, moretext = '';\n\n\t\t\t\tif ( image.indexOf( 'data-wp-more=\"more\"' ) !== -1 ) {\n\t\t\t\t\tif ( match = image.match( /data-wp-more-text=\"([^\"]+)\"/ ) ) {\n\t\t\t\t\t\tmoretext = match[1];\n\t\t\t\t\t}\n\n\t\t\t\t\timage = '<!--more' + moretext + '-->';\n\t\t\t\t} else if ( image.indexOf( 'data-wp-more=\"nextpage\"' ) !== -1 ) {\n\t\t\t\t\timage = '<!--nextpage-->';\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\t\t\t});\n\t\t}\n\t});\n\n\t// Display the tag name instead of img in element path\n\teditor.on( 'ResolveName', function( event ) {\n\t\tvar attr;\n\n\t\tif ( event.target.nodeName === 'IMG' && ( attr = editor.dom.getAttrib( event.target, 'data-wp-more' ) ) ) {\n\t\t\tevent.name = attr;\n\t\t}\n\t});\n\n\t// Register commands\n\teditor.addCommand( 'WP_More', function( tag ) {\n\t\tvar parent, html, title,\n\t\t\tclassname = 'wp-more-tag',\n\t\t\tdom = editor.dom,\n\t\t\tnode = editor.selection.getNode();\n\n\t\ttag = tag || 'more';\n\t\tclassname += ' mce-wp-' + tag;\n\t\ttitle = tag === 'more' ? 'Read more...' : 'Next page';\n\t\ttitle = __( title );\n\t\thtml = '<img src=\"' + tinymce.Env.transparentSrc + '\" alt=\"\" title=\"' + title + '\" class=\"' + classname + '\" ' +\n\t\t\t'data-wp-more=\"' + tag + '\" data-mce-resize=\"false\" data-mce-placeholder=\"1\" />';\n\n\t\t// Most common case\n\t\tif ( node.nodeName === 'BODY' || ( node.nodeName === 'P' && node.parentNode.nodeName === 'BODY' ) ) {\n\t\t\teditor.insertContent( html );\n\t\t\treturn;\n\t\t}\n\n\t\t// Get the top level parent node\n\t\tparent = dom.getParent( node, function( found ) {\n\t\t\tif ( found.parentNode && found.parentNode.nodeName === 'BODY' ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}, editor.getBody() );\n\n\t\tif ( parent ) {\n\t\t\tif ( parent.nodeName === 'P' ) {\n\t\t\t\tparent.appendChild( dom.create( 'p', null, html ).firstChild );\n\t\t\t} else {\n\t\t\t\tdom.insertAfter( dom.create( 'p', null, html ), parent );\n\t\t\t}\n\n\t\t\teditor.nodeChanged();\n\t\t}\n\t});\n\n\teditor.addCommand( 'WP_Code', function() {\n\t\teditor.formatter.toggle('code');\n\t});\n\n\teditor.addCommand( 'WP_Page', function() {\n\t\teditor.execCommand( 'WP_More', 'nextpage' );\n\t});\n\n\teditor.addCommand( 'WP_Help', function() {\n\t\tvar access = tinymce.Env.mac ? __( 'Ctrl + Alt + letter:' ) : __( 'Shift + Alt + letter:' ),\n\t\t\tmeta = tinymce.Env.mac ? __( 'Cmd + letter:' ) : __( 'Ctrl + letter:' ),\n\t\t\ttable1 = [],\n\t\t\ttable2 = [],\n\t\t\theader, html, dialog, $wrap;\n\n\t\teach( [\n\t\t\t{ c: 'Copy',      x: 'Cut'              },\n\t\t\t{ v: 'Paste',     a: 'Select all'       },\n\t\t\t{ z: 'Undo',      y: 'Redo'             },\n\t\t\t{ b: 'Bold',      i: 'Italic'           },\n\t\t\t{ u: 'Underline', k: 'Insert/edit link' }\n\t\t], function( row ) {\n\t\t\ttable1.push( tr( row ) );\n\t\t} );\n\n\t\teach( [\n\t\t\t{ 1: 'Heading 1',             2: 'Heading 2'                     },\n\t\t\t{ 3: 'Heading 3',             4: 'Heading 4'                     },\n\t\t\t{ 5: 'Heading 5',             6: 'Heading 6'                     },\n\t\t\t{ l: 'Align left',            c: 'Align center'                  },\n\t\t\t{ r: 'Align right',           j: 'Justify'                       },\n\t\t\t{ d: 'Strikethrough',         q: 'Blockquote'                    },\n\t\t\t{ u: 'Bullet list',           o: 'Numbered list'                 },\n\t\t\t{ a: 'Insert/edit link',      s: 'Remove link'                   },\n\t\t\t{ m: 'Insert/edit image',     t: 'Insert Read More tag'          },\n\t\t\t{ h: 'Keyboard Shortcuts',    x: 'Code'                          },\n\t\t\t{ p: 'Insert Page Break tag', w: 'Distraction-free writing mode' }\n\t\t], function( row ) {\n\t\t\ttable2.push( tr( row ) );\n\t\t} );\n\n\t\tfunction tr( row ) {\n\t\t\tvar out = '<tr>';\n\n\t\t\teach( row, function( text, key ) {\n\t\t\t\tif ( ! text ) {\n\t\t\t\t\tout += '<td></td><td></td>';\n\t\t\t\t} else {\n\t\t\t\t\tout += '<td><kbd>' + key + '</kbd></td><td>' + __( text ) + '</td>';\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn out + '</tr>';\n\t\t}\n\n\t\theader = [ __( 'Letter' ), __( 'Action' ), __( 'Letter' ), __( 'Action' ) ];\n\t\theader = '<tr><th>' + header.join( '</th><th>' ) + '</th></tr>';\n\n\t\thtml = '<div class=\"wp-editor-help\">';\n\n\t\t// Main section, default and additional shortcuts\n\t\thtml = html +\n\t\t\t'<h2>' + __( 'Default shortcuts,' ) + ' ' + meta + '</h2>' +\n\t\t\t'<table class=\"wp-help-th-center\">' +\n\t\t\t\theader +\n\t\t\t\ttable1.join('') +\n\t\t\t'</table>' +\n\t\t\t'<h2>' + __( 'Additional shortcuts,' ) + ' ' + access + '</h2>' +\n\t\t\t'<table class=\"wp-help-th-center\">' +\n\t\t\t\theader +\n\t\t\t\ttable2.join('') +\n\t\t\t'</table>';\n\n\t\tif ( editor.plugins.wptextpattern ) {\n\t\t\t// Text pattern section\n\t\t\thtml = html +\n\t\t\t\t'<h2>' + __( 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' ) + '</h2>' +\n\t\t\t\t'<table>' +\n\t\t\t\t\ttr({ '*':  'Bullet list' }) +\n\t\t\t\t\ttr({ '-':  'Bullet list' }) +\n\t\t\t\t\ttr({ '1.':  'Numbered list' }) +\n\t\t\t\t\ttr({ '1)':  'Numbered list' }) +\n\t\t\t\t'</table>';\n\n\t\t\thtml = html +\n\t\t\t\t'<h2>' + __( 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' ) + '</h2>' +\n\t\t\t\t'<table>' +\n\t\t\t\t\ttr({ '>': 'Blockquote' }) +\n\t\t\t\t\ttr({ '##': 'Heading 2' }) +\n\t\t\t\t\ttr({ '###': 'Heading 3' }) +\n\t\t\t\t\ttr({ '####': 'Heading 4' }) +\n\t\t\t\t\ttr({ '#####': 'Heading 5' }) +\n\t\t\t\t\ttr({ '######': 'Heading 6' }) +\n\t\t\t\t'</table>';\n\t\t}\n\n\t\t// Focus management section\n\t\thtml = html +\n\t\t\t'<h2>' + __( 'Focus shortcuts:' ) + '</h2>' +\n\t\t\t'<table>' +\n\t\t\t\ttr({ 'Alt + F8':  'Inline toolbar (when an image, link or preview is selected)' }) +\n\t\t\t\ttr({ 'Alt + F9':  'Editor menu (when enabled)' }) +\n\t\t\t\ttr({ 'Alt + F10': 'Editor toolbar' }) +\n\t\t\t\ttr({ 'Alt + F11': 'Elements path' }) +\n\t\t\t'</table>' +\n\t\t\t'<p>' + __( 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' ) + '</p>';\n\n\t\thtml += '</div>';\n\n\t\tdialog = editor.windowManager.open( {\n\t\t\ttitle: 'Keyboard Shortcuts',\n\t\t\titems: {\n\t\t\t\ttype: 'container',\n\t\t\t\tclasses: 'wp-help',\n\t\t\t\thtml: html\n\t\t\t},\n\t\t\tbuttons: {\n\t\t\t\ttext: 'Close',\n\t\t\t\tonclick: 'close'\n\t\t\t}\n\t\t} );\n\n\t\tif ( dialog.$el ) {\n\t\t\tdialog.$el.find( 'div[role=\"application\"]' ).attr( 'role', 'document' );\n\t\t\t$wrap = dialog.$el.find( '.mce-wp-help' );\n\n\t\t\tif ( $wrap[0] ) {\n\t\t\t\t$wrap.attr( 'tabindex', '0' );\n\t\t\t\t$wrap[0].focus();\n\t\t\t\t$wrap.on( 'keydown', function( event ) {\n\t\t\t\t\t// Prevent use of: page up, page down, end, home, left arrow, up arrow, right arrow, down arrow\n\t\t\t\t\t// in the dialog keydown handler.\n\t\t\t\t\tif ( event.keyCode >= 33 && event.keyCode <= 40 ) {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} );\n\n\teditor.addCommand( 'WP_Medialib', function() {\n\t\tif ( wp && wp.media && wp.media.editor ) {\n\t\t\twp.media.editor.open( editor.id );\n\t\t}\n\t});\n\n\t// Register buttons\n\teditor.addButton( 'wp_more', {\n\t\ttooltip: 'Insert Read More tag',\n\t\tonclick: function() {\n\t\t\teditor.execCommand( 'WP_More', 'more' );\n\t\t}\n\t});\n\n\teditor.addButton( 'wp_page', {\n\t\ttooltip: 'Page break',\n\t\tonclick: function() {\n\t\t\teditor.execCommand( 'WP_More', 'nextpage' );\n\t\t}\n\t});\n\n\teditor.addButton( 'wp_help', {\n\t\ttooltip: 'Keyboard Shortcuts',\n\t\tcmd: 'WP_Help'\n\t});\n\n\teditor.addButton( 'wp_code', {\n\t\ttooltip: 'Code',\n\t\tcmd: 'WP_Code',\n\t\tstateSelector: 'code'\n\t});\n\n\t// Menubar\n\t// Insert->Add Media\n\tif ( wp && wp.media && wp.media.editor ) {\n\t\teditor.addMenuItem( 'add_media', {\n\t\t\ttext: 'Add Media',\n\t\t\ticon: 'wp-media-library',\n\t\t\tcontext: 'insert',\n\t\t\tcmd: 'WP_Medialib'\n\t\t});\n\t}\n\n\t// Insert \"Read More...\"\n\teditor.addMenuItem( 'wp_more', {\n\t\ttext: 'Insert Read More tag',\n\t\ticon: 'wp_more',\n\t\tcontext: 'insert',\n\t\tonclick: function() {\n\t\t\teditor.execCommand( 'WP_More', 'more' );\n\t\t}\n\t});\n\n\t// Insert \"Next Page\"\n\teditor.addMenuItem( 'wp_page', {\n\t\ttext: 'Page break',\n\t\ticon: 'wp_page',\n\t\tcontext: 'insert',\n\t\tonclick: function() {\n\t\t\teditor.execCommand( 'WP_More', 'nextpage' );\n\t\t}\n\t});\n\n\teditor.on( 'BeforeExecCommand', function(e) {\n\t\tif ( tinymce.Env.webkit && ( e.command === 'InsertUnorderedList' || e.command === 'InsertOrderedList' ) ) {\n\t\t\tif ( ! style ) {\n\t\t\t\tstyle = editor.dom.create( 'style', {'type': 'text/css'},\n\t\t\t\t\t'#tinymce,#tinymce span,#tinymce li,#tinymce li>span,#tinymce p,#tinymce p>span{font:medium sans-serif;color:#000;line-height:normal;}');\n\t\t\t}\n\n\t\t\teditor.getDoc().head.appendChild( style );\n\t\t}\n\t});\n\n\teditor.on( 'ExecCommand', function( e ) {\n\t\tif ( tinymce.Env.webkit && style &&\n\t\t\t( 'InsertUnorderedList' === e.command || 'InsertOrderedList' === e.command ) ) {\n\n\t\t\teditor.dom.remove( style );\n\t\t}\n\t});\n\n\teditor.on( 'init', function() {\n\t\tvar env = tinymce.Env,\n\t\t\tbodyClass = ['mceContentBody'], // back-compat for themes that use this in editor-style.css...\n\t\t\tdoc = editor.getDoc(),\n\t\t\tdom = editor.dom;\n\n\t\tif ( env.iOS ) {\n\t\t\tdom.addClass( doc.documentElement, 'ios' );\n\t\t}\n\n\t\tif ( editor.getParam( 'directionality' ) === 'rtl' ) {\n\t\t\tbodyClass.push('rtl');\n\t\t\tdom.setAttrib( doc.documentElement, 'dir', 'rtl' );\n\t\t}\n\n\t\tdom.setAttrib( doc.documentElement, 'lang', editor.getParam( 'wp_lang_attr' ) );\n\n\t\tif ( env.ie ) {\n\t\t\tif ( parseInt( env.ie, 10 ) === 9 ) {\n\t\t\t\tbodyClass.push('ie9');\n\t\t\t} else if ( parseInt( env.ie, 10 ) === 8 ) {\n\t\t\t\tbodyClass.push('ie8');\n\t\t\t} else if ( env.ie < 8 ) {\n\t\t\t\tbodyClass.push('ie7');\n\t\t\t}\n\t\t} else if ( env.webkit ) {\n\t\t\tbodyClass.push('webkit');\n\t\t}\n\n\t\tbodyClass.push('wp-editor');\n\n\t\teach( bodyClass, function( cls ) {\n\t\t\tif ( cls ) {\n\t\t\t\tdom.addClass( doc.body, cls );\n\t\t\t}\n\t\t});\n\n\t\t// Remove invalid parent paragraphs when inserting HTML\n\t\teditor.on( 'BeforeSetContent', function( event ) {\n\t\t\tif ( event.content ) {\n\t\t\t\tevent.content = event.content.replace( /<p>\\s*<(p|div|ul|ol|dl|table|blockquote|h[1-6]|fieldset|pre)( [^>]*)?>/gi, '<$1$2>' )\n\t\t\t\t\t.replace( /<\\/(p|div|ul|ol|dl|table|blockquote|h[1-6]|fieldset|pre)>\\s*<\\/p>/gi, '</$1>' );\n\t\t\t}\n\t\t});\n\n\t\tif ( $ ) {\n\t\t\t$( document ).triggerHandler( 'tinymce-editor-init', [editor] );\n\t\t}\n\n\t\tif ( window.tinyMCEPreInit && window.tinyMCEPreInit.dragDropUpload ) {\n\t\t\tdom.bind( doc, 'dragstart dragend dragover drop', function( event ) {\n\t\t\t\tif ( $ ) {\n\t\t\t\t\t// Trigger the jQuery handlers.\n\t\t\t\t\t$( document ).trigger( new $.Event( event ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif ( editor.getParam( 'wp_paste_filters', true ) ) {\n\t\t\teditor.on( 'PastePreProcess', function( event ) {\n\t\t\t\t// Remove trailing <br> added by WebKit browsers to the clipboard\n\t\t\t\tevent.content = event.content.replace( /<br class=\"?Apple-interchange-newline\"?>/gi, '' );\n\n\t\t\t\t// In WebKit this is handled by removeWebKitStyles()\n\t\t\t\tif ( ! tinymce.Env.webkit ) {\n\t\t\t\t\t// Remove all inline styles\n\t\t\t\t\tevent.content = event.content.replace( /(<[^>]+) style=\"[^\"]*\"([^>]*>)/gi, '$1$2' );\n\n\t\t\t\t\t// Put back the internal styles\n\t\t\t\t\tevent.content = event.content.replace(/(<[^>]+) data-mce-style=([^>]+>)/gi, '$1 style=$2' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teditor.on( 'PastePostProcess', function( event ) {\n\t\t\t\t// Remove empty paragraphs\n\t\t\t\teach( dom.select( 'p', event.node ), function( node ) {\n\t\t\t\t\tif ( dom.isEmpty( node ) ) {\n\t\t\t\t\t\tdom.remove( node );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t});\n\n\teditor.on( 'SaveContent', function( event ) {\n\t\t// If editor is hidden, we just want the textarea's value to be saved\n\t\tif ( ! editor.inline && editor.isHidden() ) {\n\t\t\tevent.content = event.element.value;\n\t\t\treturn;\n\t\t}\n\n\t\t// Keep empty paragraphs :(\n\t\tevent.content = event.content.replace( /<p>(?:<br ?\\/?>|\\u00a0|\\uFEFF| )*<\\/p>/g, '<p>&nbsp;</p>' );\n\n\t\tif ( hasWpautop ) {\n\t\t\tevent.content = wp.editor.removep( event.content );\n\t\t}\n\t});\n\n\teditor.on( 'preInit', function() {\n\t\tvar validElementsSetting = '@[id|accesskey|class|dir|lang|style|tabindex|' +\n\t\t\t'title|contenteditable|draggable|dropzone|hidden|spellcheck|translate],' + // Global attributes.\n\t\t\t'i,' + // Don't replace <i> with <em> and <b> with <strong> and don't remove them when empty.\n\t\t\t'b,' +\n\t\t\t'script[src|async|defer|type|charset|crossorigin|integrity]'; // Add support for <script>.\n\n\t\teditor.schema.addValidElements( validElementsSetting );\n\n\t\tif ( tinymce.Env.iOS ) {\n\t\t\teditor.settings.height = 300;\n\t\t}\n\n\t\teach( {\n\t\t\tc: 'JustifyCenter',\n\t\t\tr: 'JustifyRight',\n\t\t\tl: 'JustifyLeft',\n\t\t\tj: 'JustifyFull',\n\t\t\tq: 'mceBlockQuote',\n\t\t\tu: 'InsertUnorderedList',\n\t\t\to: 'InsertOrderedList',\n\t\t\ts: 'unlink',\n\t\t\tm: 'WP_Medialib',\n\t\t\tz: 'WP_Adv',\n\t\t\tt: 'WP_More',\n\t\t\td: 'Strikethrough',\n\t\t\th: 'WP_Help',\n\t\t\tp: 'WP_Page',\n\t\t\tx: 'WP_Code'\n\t\t}, function( command, key ) {\n\t\t\teditor.shortcuts.add( 'access+' + key, '', command );\n\t\t} );\n\n\t\teditor.addShortcut( 'meta+s', '', function() {\n\t\t\tif ( wp && wp.autosave ) {\n\t\t\t\twp.autosave.server.triggerSave();\n\t\t\t}\n\t\t} );\n\t} );\n\n\t/**\n\t * Experimental: create a floating toolbar.\n\t * This functionality will change in the next releases. Not recommended for use by plugins.\n\t */\n\teditor.on( 'preinit', function() {\n\t\tvar Factory = tinymce.ui.Factory,\n\t\t\tsettings = editor.settings,\n\t\t\tactiveToolbar,\n\t\t\tcurrentSelection,\n\t\t\ttimeout,\n\t\t\tcontainer = editor.getContainer(),\n\t\t\twpAdminbar = document.getElementById( 'wpadminbar' ),\n\t\t\tmceIframe = document.getElementById( editor.id + '_ifr' ),\n\t\t\tmceToolbar,\n\t\t\tmceStatusbar,\n\t\t\twpStatusbar;\n\n\t\t\tif ( container ) {\n\t\t\t\tmceToolbar = tinymce.$( '.mce-toolbar-grp', container )[0];\n\t\t\t\tmceStatusbar = tinymce.$( '.mce-statusbar', container )[0];\n\t\t\t}\n\n\t\t\tif ( editor.id === 'content' ) {\n\t\t\t\twpStatusbar = document.getElementById( 'post-status-info' );\n\t\t\t}\n\n\t\tfunction create( buttons, bottom ) {\n\t\t\tvar toolbar,\n\t\t\t\ttoolbarItems = [],\n\t\t\t\tbuttonGroup;\n\n\t\t\teach( buttons, function( item ) {\n\t\t\t\tvar itemName;\n\n\t\t\t\tfunction bindSelectorChanged() {\n\t\t\t\t\tvar selection = editor.selection;\n\n\t\t\t\t\tif ( itemName === 'bullist' ) {\n\t\t\t\t\t\tselection.selectorChanged( 'ul > li', function( state, args ) {\n\t\t\t\t\t\t\tvar i = args.parents.length,\n\t\t\t\t\t\t\t\tnodeName;\n\n\t\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\t\tnodeName = args.parents[ i ].nodeName;\n\n\t\t\t\t\t\t\t\tif ( nodeName === 'OL' || nodeName == 'UL' ) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\titem.active( state && nodeName === 'UL' );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( itemName === 'numlist' ) {\n\t\t\t\t\t\tselection.selectorChanged( 'ol > li', function( state, args ) {\n\t\t\t\t\t\t\tvar i = args.parents.length,\n\t\t\t\t\t\t\t\tnodeName;\n\n\t\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\t\tnodeName = args.parents[ i ].nodeName;\n\n\t\t\t\t\t\t\t\tif ( nodeName === 'OL' || nodeName === 'UL' ) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\titem.active( state && nodeName === 'OL' );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( item.settings.stateSelector ) {\n\t\t\t\t\t\tselection.selectorChanged( item.settings.stateSelector, function( state ) {\n\t\t\t\t\t\t\titem.active( state );\n\t\t\t\t\t\t}, true );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( item.settings.disabledStateSelector ) {\n\t\t\t\t\t\tselection.selectorChanged( item.settings.disabledStateSelector, function( state ) {\n\t\t\t\t\t\t\titem.disabled( state );\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( item === '|' ) {\n\t\t\t\t\tbuttonGroup = null;\n\t\t\t\t} else {\n\t\t\t\t\tif ( Factory.has( item ) ) {\n\t\t\t\t\t\titem = {\n\t\t\t\t\t\t\ttype: item\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif ( settings.toolbar_items_size ) {\n\t\t\t\t\t\t\titem.size = settings.toolbar_items_size;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttoolbarItems.push( item );\n\n\t\t\t\t\t\tbuttonGroup = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( ! buttonGroup ) {\n\t\t\t\t\t\t\tbuttonGroup = {\n\t\t\t\t\t\t\t\ttype: 'buttongroup',\n\t\t\t\t\t\t\t\titems: []\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\ttoolbarItems.push( buttonGroup );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( editor.buttons[ item ] ) {\n\t\t\t\t\t\t\titemName = item;\n\t\t\t\t\t\t\titem = editor.buttons[ itemName ];\n\n\t\t\t\t\t\t\tif ( typeof item === 'function' ) {\n\t\t\t\t\t\t\t\titem = item();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\titem.type = item.type || 'button';\n\n\t\t\t\t\t\t\tif ( settings.toolbar_items_size ) {\n\t\t\t\t\t\t\t\titem.size = settings.toolbar_items_size;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\titem = Factory.create( item );\n\n\t\t\t\t\t\t\tbuttonGroup.items.push( item );\n\n\t\t\t\t\t\t\tif ( editor.initialized ) {\n\t\t\t\t\t\t\t\tbindSelectorChanged();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\teditor.on( 'init', bindSelectorChanged );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\ttoolbar = Factory.create( {\n\t\t\t\ttype: 'panel',\n\t\t\t\tlayout: 'stack',\n\t\t\t\tclasses: 'toolbar-grp inline-toolbar-grp',\n\t\t\t\tariaRoot: true,\n\t\t\t\tariaRemember: true,\n\t\t\t\titems: [ {\n\t\t\t\t\ttype: 'toolbar',\n\t\t\t\t\tlayout: 'flow',\n\t\t\t\t\titems: toolbarItems\n\t\t\t\t} ]\n\t\t\t} );\n\n\t\t\ttoolbar.bottom = bottom;\n\n\t\t\tfunction reposition() {\n\t\t\t\tif ( ! currentSelection ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t\tvar scrollX = window.pageXOffset || document.documentElement.scrollLeft,\n\t\t\t\t\tscrollY = window.pageYOffset || document.documentElement.scrollTop,\n\t\t\t\t\twindowWidth = window.innerWidth,\n\t\t\t\t\twindowHeight = window.innerHeight,\n\t\t\t\t\tiframeRect = mceIframe ? mceIframe.getBoundingClientRect() : {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tright: windowWidth,\n\t\t\t\t\t\tbottom: windowHeight,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\twidth: windowWidth,\n\t\t\t\t\t\theight: windowHeight\n\t\t\t\t\t},\n\t\t\t\t\ttoolbar = this.getEl(),\n\t\t\t\t\ttoolbarWidth = toolbar.offsetWidth,\n\t\t\t\t\ttoolbarHeight = toolbar.offsetHeight,\n\t\t\t\t\tselection = currentSelection.getBoundingClientRect(),\n\t\t\t\t\tselectionMiddle = ( selection.left + selection.right ) / 2,\n\t\t\t\t\tbuffer = 5,\n\t\t\t\t\tmargin = 8,\n\t\t\t\t\tspaceNeeded = toolbarHeight + margin + buffer,\n\t\t\t\t\twpAdminbarBottom = wpAdminbar ? wpAdminbar.getBoundingClientRect().bottom : 0,\n\t\t\t\t\tmceToolbarBottom = mceToolbar ? mceToolbar.getBoundingClientRect().bottom : 0,\n\t\t\t\t\tmceStatusbarTop = mceStatusbar ? windowHeight - mceStatusbar.getBoundingClientRect().top : 0,\n\t\t\t\t\twpStatusbarTop = wpStatusbar ? windowHeight - wpStatusbar.getBoundingClientRect().top : 0,\n\t\t\t\t\tblockedTop = Math.max( 0, wpAdminbarBottom, mceToolbarBottom, iframeRect.top ),\n\t\t\t\t\tblockedBottom = Math.max( 0, mceStatusbarTop, wpStatusbarTop, windowHeight - iframeRect.bottom ),\n\t\t\t\t\tspaceTop = selection.top + iframeRect.top - blockedTop,\n\t\t\t\t\tspaceBottom = windowHeight - iframeRect.top - selection.bottom - blockedBottom,\n\t\t\t\t\teditorHeight = windowHeight - blockedTop - blockedBottom,\n\t\t\t\t\tclassName = '',\n\t\t\t\t\tiosOffsetTop = 0,\n\t\t\t\t\tiosOffsetBottom = 0,\n\t\t\t\t\ttop, left;\n\n\t\t\t\tif ( spaceTop >= editorHeight || spaceBottom >= editorHeight ) {\n\t\t\t\t\treturn this.hide();\n\t\t\t\t}\n\n\t\t\t\t// Add offset in iOS to move the menu over the image, out of the way of the default iOS menu.\n\t\t\t\tif ( tinymce.Env.iOS && currentSelection.nodeName === 'IMG' ) {\n\t\t\t\t\tiosOffsetTop = 54;\n\t\t\t\t\tiosOffsetBottom = 46;\n\t\t\t\t}\n\n\t\t\t\tif ( this.bottom ) {\n\t\t\t\t\tif ( spaceBottom >= spaceNeeded ) {\n\t\t\t\t\t\tclassName = ' mce-arrow-up';\n\t\t\t\t\t\ttop = selection.bottom + iframeRect.top + scrollY - iosOffsetBottom;\n\t\t\t\t\t} else if ( spaceTop >= spaceNeeded ) {\n\t\t\t\t\t\tclassName = ' mce-arrow-down';\n\t\t\t\t\t\ttop = selection.top + iframeRect.top + scrollY - toolbarHeight - margin + iosOffsetTop;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( spaceTop >= spaceNeeded ) {\n\t\t\t\t\t\tclassName = ' mce-arrow-down';\n\t\t\t\t\t\ttop = selection.top + iframeRect.top + scrollY - toolbarHeight - margin + iosOffsetTop;\n\t\t\t\t\t} else if ( spaceBottom >= spaceNeeded && editorHeight / 2 > selection.bottom + iframeRect.top - blockedTop ) {\n\t\t\t\t\t\tclassName = ' mce-arrow-up';\n\t\t\t\t\t\ttop = selection.bottom + iframeRect.top + scrollY - iosOffsetBottom;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( typeof top === 'undefined' ) {\n\t\t\t\t\ttop = scrollY + blockedTop + buffer + iosOffsetBottom;\n\t\t\t\t}\n\n\t\t\t\tleft = selectionMiddle - toolbarWidth / 2 + iframeRect.left + scrollX;\n\n\t\t\t\tif ( selection.left < 0 || selection.right > iframeRect.width ) {\n\t\t\t\t\tleft = iframeRect.left + scrollX + ( iframeRect.width - toolbarWidth ) / 2;\n\t\t\t\t} else if ( toolbarWidth >= windowWidth ) {\n\t\t\t\t\tclassName += ' mce-arrow-full';\n\t\t\t\t\tleft = 0;\n\t\t\t\t} else if ( ( left < 0 && selection.left + toolbarWidth > windowWidth ) || ( left + toolbarWidth > windowWidth && selection.right - toolbarWidth < 0 ) ) {\n\t\t\t\t\tleft = ( windowWidth - toolbarWidth ) / 2;\n\t\t\t\t} else if ( left < iframeRect.left + scrollX ) {\n\t\t\t\t\tclassName += ' mce-arrow-left';\n\t\t\t\t\tleft = selection.left + iframeRect.left + scrollX;\n\t\t\t\t} else if ( left + toolbarWidth > iframeRect.width + iframeRect.left + scrollX ) {\n\t\t\t\t\tclassName += ' mce-arrow-right';\n\t\t\t\t\tleft = selection.right - toolbarWidth + iframeRect.left + scrollX;\n\t\t\t\t}\n\n\t\t\t\t// No up/down arrows on the menu over images in iOS.\n\t\t\t\tif ( tinymce.Env.iOS && currentSelection.nodeName === 'IMG' ) {\n\t\t\t\t\tclassName = className.replace( / ?mce-arrow-(up|down)/g, '' );\n\t\t\t\t}\n\n\t\t\t\ttoolbar.className = toolbar.className.replace( / ?mce-arrow-[\\w]+/g, '' ) + className;\n\n\t\t\t\tDOM.setStyles( toolbar, {\n\t\t\t\t\t'left': left,\n\t\t\t\t\t'top': top\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\ttoolbar.on( 'show', function() {\n\t\t\t\tthis.reposition();\n\t\t\t} );\n\n\t\t\ttoolbar.on( 'keydown', function( event ) {\n\t\t\t\tif ( event.keyCode === 27 ) {\n\t\t\t\t\tthis.hide();\n\t\t\t\t\teditor.focus();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\teditor.on( 'remove', function() {\n\t\t\t\ttoolbar.remove();\n\t\t\t} );\n\n\t\t\ttoolbar.reposition = reposition;\n\t\t\ttoolbar.hide().renderTo( document.body );\n\n\t\t\treturn toolbar;\n\t\t}\n\n\t\teditor.shortcuts.add( 'alt+119', '', function() {\n\t\t\tvar node;\n\n\t\t\tif ( activeToolbar ) {\n\t\t\t\tnode = activeToolbar.find( 'toolbar' )[0];\n\t\t\t\tnode && node.focus( true );\n\t\t\t}\n\t\t} );\n\n\t\teditor.on( 'nodechange', function( event ) {\n\t\t\tvar collapsed = editor.selection.isCollapsed();\n\n\t\t\tvar args = {\n\t\t\t\telement: event.element,\n\t\t\t\tparents: event.parents,\n\t\t\t\tcollapsed: collapsed\n\t\t\t};\n\n\t\t\teditor.fire( 'wptoolbar', args );\n\n\t\t\tcurrentSelection = args.selection || args.element;\n\n\t\t\tif ( activeToolbar ) {\n\t\t\t\tactiveToolbar.hide();\n\t\t\t}\n\n\t\t\tif ( args.toolbar ) {\n\t\t\t\tactiveToolbar = args.toolbar;\n\t\t\t\tactiveToolbar.show();\n\t\t\t} else {\n\t\t\t\tactiveToolbar = false;\n\t\t\t}\n\t\t} );\n\n\t\teditor.on( 'focus', function() {\n\t\t\tif ( activeToolbar ) {\n\t\t\t\tactiveToolbar.show();\n\t\t\t}\n\t\t} );\n\n\t\tfunction hide( event ) {\n\t\t\tif ( activeToolbar ) {\n\t\t\t\tactiveToolbar.hide();\n\n\t\t\t\tif ( event.type === 'hide' ) {\n\t\t\t\t\tactiveToolbar = false;\n\t\t\t\t} else if ( event.type === 'resize' || event.type === 'scroll' ) {\n\t\t\t\t\tclearTimeout( timeout );\n\n\t\t\t\t\ttimeout = setTimeout( function() {\n\t\t\t\t\t\tif ( activeToolbar && typeof activeToolbar.show === 'function' ) {\n\t\t\t\t\t\t\tactiveToolbar.show();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 250 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tDOM.bind( window, 'resize scroll', hide );\n\t\teditor.dom.bind( editor.getWin(), 'resize scroll', hide );\n\n\t\teditor.on( 'remove', function() {\n\t\t\tDOM.unbind( window, 'resize scroll', hide );\n\t\t\teditor.dom.unbind( editor.getWin(), 'resize scroll', hide );\n\t\t} );\n\n\t\teditor.on( 'blur hide', hide );\n\n\t\teditor.wp = editor.wp || {};\n\t\teditor.wp._createToolbar = create;\n\t}, true );\n\n\tfunction noop() {}\n\n\t// Expose some functions (back-compat)\n\treturn {\n\t\t_showButtons: noop,\n\t\t_hideButtons: noop,\n\t\t_setEmbed: noop,\n\t\t_getEmbed: noop\n\t};\n});\n\n}( window.tinymce ));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wpautoresize/plugin.js",
    "content": "/**\n * plugin.js\n *\n * Copyright, Moxiecode Systems AB\n * Released under LGPL License.\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n// Forked for WordPress so it can be turned on/off after loading.\n\n/*global tinymce:true */\n/*eslint no-nested-ternary:0 */\n\n/**\n * Auto Resize\n *\n * This plugin automatically resizes the content area to fit its content height.\n * It will retain a minimum height, which is the height of the content area when\n * it's initialized.\n */\ntinymce.PluginManager.add( 'wpautoresize', function( editor ) {\n\tvar settings = editor.settings,\n\t\toldSize = 300,\n\t\tisActive = false;\n\n\tif ( editor.settings.inline || tinymce.Env.iOS ) {\n\t\treturn;\n\t}\n\n\tfunction isFullscreen() {\n\t\treturn editor.plugins.fullscreen && editor.plugins.fullscreen.isFullscreen();\n\t}\n\n\tfunction getInt( n ) {\n\t\treturn parseInt( n, 10 ) || 0;\n\t}\n\n\t/**\n\t * This method gets executed each time the editor needs to resize.\n\t */\n\tfunction resize( e ) {\n\t\tvar deltaSize, doc, body, docElm, DOM = tinymce.DOM, resizeHeight, myHeight,\n\t\t\tmarginTop, marginBottom, paddingTop, paddingBottom, borderTop, borderBottom;\n\n\t\tif ( ! isActive ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdoc = editor.getDoc();\n\t\tif ( ! doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\te = e || {};\n\t\tbody = doc.body;\n\t\tdocElm = doc.documentElement;\n\t\tresizeHeight = settings.autoresize_min_height;\n\n\t\tif ( ! body || ( e && e.type === 'setcontent' && e.initial ) || isFullscreen() ) {\n\t\t\tif ( body && docElm ) {\n\t\t\t\tbody.style.overflowY = 'auto';\n\t\t\t\tdocElm.style.overflowY = 'auto'; // Old IE\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Calculate outer height of the body element using CSS styles\n\t\tmarginTop = editor.dom.getStyle( body, 'margin-top', true );\n\t\tmarginBottom = editor.dom.getStyle( body, 'margin-bottom', true );\n\t\tpaddingTop = editor.dom.getStyle( body, 'padding-top', true );\n\t\tpaddingBottom = editor.dom.getStyle( body, 'padding-bottom', true );\n\t\tborderTop = editor.dom.getStyle( body, 'border-top-width', true );\n\t\tborderBottom = editor.dom.getStyle( body, 'border-bottom-width', true );\n\t\tmyHeight = body.offsetHeight + getInt( marginTop ) + getInt( marginBottom ) +\n\t\t\tgetInt( paddingTop ) + getInt( paddingBottom ) +\n\t\t\tgetInt( borderTop ) + getInt( borderBottom );\n\n\t\t// IE < 11, other?\n\t\tif ( myHeight && myHeight < docElm.offsetHeight ) {\n\t\t\tmyHeight = docElm.offsetHeight;\n\t\t}\n\n\t\t// Make sure we have a valid height\n\t\tif ( isNaN( myHeight ) || myHeight <= 0 ) {\n\t\t\t// Get height differently depending on the browser used\n\t\t\tmyHeight = tinymce.Env.ie ? body.scrollHeight : ( tinymce.Env.webkit && body.clientHeight === 0 ? 0 : body.offsetHeight );\n\t\t}\n\n\t\t// Don't make it smaller than the minimum height\n\t\tif ( myHeight > settings.autoresize_min_height ) {\n\t\t\tresizeHeight = myHeight;\n\t\t}\n\n\t\t// If a maximum height has been defined don't exceed this height\n\t\tif ( settings.autoresize_max_height && myHeight > settings.autoresize_max_height ) {\n\t\t\tresizeHeight = settings.autoresize_max_height;\n\t\t\tbody.style.overflowY = 'auto';\n\t\t\tdocElm.style.overflowY = 'auto'; // Old IE\n\t\t} else {\n\t\t\tbody.style.overflowY = 'hidden';\n\t\t\tdocElm.style.overflowY = 'hidden'; // Old IE\n\t\t\tbody.scrollTop = 0;\n\t\t}\n\n\t\t// Resize content element\n\t\tif (resizeHeight !== oldSize) {\n\t\t\tdeltaSize = resizeHeight - oldSize;\n\t\t\tDOM.setStyle( editor.iframeElement, 'height', resizeHeight + 'px' );\n\t\t\toldSize = resizeHeight;\n\n\t\t\t// WebKit doesn't decrease the size of the body element until the iframe gets resized\n\t\t\t// So we need to continue to resize the iframe down until the size gets fixed\n\t\t\tif ( tinymce.isWebKit && deltaSize < 0 ) {\n\t\t\t\tresize( e );\n\t\t\t}\n\n\t\t\teditor.fire( 'wp-autoresize', { height: resizeHeight, deltaHeight: e.type === 'nodechange' ? deltaSize : null } );\n\t\t}\n\t}\n\n\t/**\n\t * Calls the resize x times in 100ms intervals. We can't wait for load events since\n\t * the CSS files might load async.\n\t */\n\tfunction wait( times, interval, callback ) {\n\t\tsetTimeout( function() {\n\t\t\tresize();\n\n\t\t\tif ( times-- ) {\n\t\t\t\twait( times, interval, callback );\n\t\t\t} else if ( callback ) {\n\t\t\t\tcallback();\n\t\t\t}\n\t\t}, interval );\n\t}\n\n\t// Define minimum height\n\tsettings.autoresize_min_height = parseInt(editor.getParam( 'autoresize_min_height', editor.getElement().offsetHeight), 10 );\n\n\t// Define maximum height\n\tsettings.autoresize_max_height = parseInt(editor.getParam( 'autoresize_max_height', 0), 10 );\n\n\tfunction on() {\n\t\tif ( ! editor.dom.hasClass( editor.getBody(), 'wp-autoresize' ) ) {\n\t\t\tisActive = true;\n\t\t\teditor.dom.addClass( editor.getBody(), 'wp-autoresize' );\n\t\t\t// Add appropriate listeners for resizing the content area\n\t\t\teditor.on( 'nodechange setcontent keyup FullscreenStateChanged', resize );\n\t\t\tresize();\n\t\t}\n\t}\n\n\tfunction off() {\n\t\tvar doc;\n\n\t\t// Don't turn off if the setting is 'on'\n\t\tif ( ! settings.wp_autoresize_on ) {\n\t\t\tisActive = false;\n\t\t\tdoc = editor.getDoc();\n\t\t\teditor.dom.removeClass( editor.getBody(), 'wp-autoresize' );\n\t\t\teditor.off( 'nodechange setcontent keyup FullscreenStateChanged', resize );\n\t\t\tdoc.body.style.overflowY = 'auto';\n\t\t\tdoc.documentElement.style.overflowY = 'auto'; // Old IE\n\t\t\toldSize = 0;\n\t\t}\n\t}\n\n\tif ( settings.wp_autoresize_on ) {\n\t\t// Turn resizing on when the editor loads\n\t\tisActive = true;\n\n\t\teditor.on( 'init', function() {\n\t\t\teditor.dom.addClass( editor.getBody(), 'wp-autoresize' );\n\t\t});\n\n\t\teditor.on( 'nodechange keyup FullscreenStateChanged', resize );\n\n\t\teditor.on( 'setcontent', function() {\n\t\t\twait( 3, 100 );\n\t\t});\n\n\t\tif ( editor.getParam( 'autoresize_on_init', true ) ) {\n\t\t\teditor.on( 'init', function() {\n\t\t\t\t// Hit it 10 times in 200 ms intervals\n\t\t\t\twait( 10, 200, function() {\n\t\t\t\t\t// Hit it 5 times in 1 sec intervals\n\t\t\t\t\twait( 5, 1000 );\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t// Reset the stored size\n\teditor.on( 'show', function() {\n\t\toldSize = 0;\n\t});\n\n\t// Register the command\n\teditor.addCommand( 'wpAutoResize', resize );\n\n\t// On/off\n\teditor.addCommand( 'wpAutoResizeOn', on );\n\teditor.addCommand( 'wpAutoResizeOff', off );\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wpdialogs/plugin.js",
    "content": "/* global tinymce */\n/**\n * Included for back-compat.\n * The default WindowManager in TinyMCE 4.0 supports three types of dialogs:\n *\t- With HTML created from JS.\n *\t- With inline HTML (like WPWindowManager).\n *\t- Old type iframe based dialogs.\n * For examples see the default plugins: https://github.com/tinymce/tinymce/tree/master/js/tinymce/plugins\n */\ntinymce.WPWindowManager = tinymce.InlineWindowManager = function( editor ) {\n\tif ( this.wp ) {\n\t\treturn this;\n\t}\n\n\tthis.wp = {};\n\tthis.parent = editor.windowManager;\n\tthis.editor = editor;\n\n\ttinymce.extend( this, this.parent );\n\n\tthis.open = function( args, params ) {\n\t\tvar $element,\n\t\t\tself = this,\n\t\t\twp = this.wp;\n\n\t\tif ( ! args.wpDialog ) {\n\t\t\treturn this.parent.open.apply( this, arguments );\n\t\t} else if ( ! args.id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( typeof jQuery === 'undefined' || ! jQuery.wp || ! jQuery.wp.wpdialog ) {\n\t\t\t// wpdialog.js is not loaded\n\t\t\tif ( window.console && window.console.error ) {\n\t\t\t\twindow.console.error('wpdialog.js is not loaded. Please set \"wpdialogs\" as dependency for your script when calling wp_enqueue_script(). You may also want to enqueue the \"wp-jquery-ui-dialog\" stylesheet.');\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\twp.$element = $element = jQuery( '#' + args.id );\n\n\t\tif ( ! $element.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( window.console && window.console.log ) {\n\t\t\twindow.console.log('tinymce.WPWindowManager is deprecated. Use the default editor.windowManager to open dialogs with inline HTML.');\n\t\t}\n\n\t\twp.features = args;\n\t\twp.params = params;\n\n\t\t// Store selection. Takes a snapshot in the FocusManager of the selection before focus is moved to the dialog.\n\t\teditor.nodeChanged();\n\n\t\t// Create the dialog if necessary\n\t\tif ( ! $element.data('wpdialog') ) {\n\t\t\t$element.wpdialog({\n\t\t\t\ttitle: args.title,\n\t\t\t\twidth: args.width,\n\t\t\t\theight: args.height,\n\t\t\t\tmodal: true,\n\t\t\t\tdialogClass: 'wp-dialog',\n\t\t\t\tzIndex: 300000\n\t\t\t});\n\t\t}\n\n\t\t$element.wpdialog('open');\n\n\t\t$element.on( 'wpdialogclose', function() {\n\t\t\tif ( self.wp.$element ) {\n\t\t\t\tself.wp = {};\n\t\t\t}\n\t\t});\n\t};\n\n\tthis.close = function() {\n\t\tif ( ! this.wp.features || ! this.wp.features.wpDialog ) {\n\t\t\treturn this.parent.close.apply( this, arguments );\n\t\t}\n\n\t\tthis.wp.$element.wpdialog('close');\n\t};\n};\n\ntinymce.PluginManager.add( 'wpdialogs', function( editor ) {\n\t// Replace window manager\n\teditor.on( 'init', function() {\n\t\teditor.windowManager = new tinymce.WPWindowManager( editor );\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wpeditimage/plugin.js",
    "content": "/* global tinymce */\ntinymce.PluginManager.add( 'wpeditimage', function( editor ) {\n\tvar toolbar, serializer, touchOnImage,\n\t\teach = tinymce.each,\n\t\ttrim = tinymce.trim,\n\t\tiOS = tinymce.Env.iOS;\n\n\tfunction isPlaceholder( node ) {\n\t\treturn !! ( editor.dom.getAttrib( node, 'data-mce-placeholder' ) || editor.dom.getAttrib( node, 'data-mce-object' ) );\n\t}\n\n\teditor.addButton( 'wp_img_remove', {\n\t\ttooltip: 'Remove',\n\t\ticon: 'dashicon dashicons-no',\n\t\tonclick: function() {\n\t\t\tremoveImage( editor.selection.getNode() );\n\t\t}\n\t} );\n\n\teditor.addButton( 'wp_img_edit', {\n\t\ttooltip: 'Edit ', // trailing space is needed, used for context\n\t\ticon: 'dashicon dashicons-edit',\n\t\tonclick: function() {\n\t\t\teditImage( editor.selection.getNode() );\n\t\t}\n\t} );\n\n\teach( {\n\t\talignleft: 'Align left',\n\t\taligncenter: 'Align center',\n\t\talignright: 'Align right',\n\t\talignnone: 'No alignment'\n\t}, function( tooltip, name ) {\n\t\tvar direction = name.slice( 5 );\n\n\t\teditor.addButton( 'wp_img_' + name, {\n\t\t\ttooltip: tooltip,\n\t\t\ticon: 'dashicon dashicons-align-' + direction,\n\t\t\tcmd: 'alignnone' === name ? 'wpAlignNone' : 'Justify' + direction.slice( 0, 1 ).toUpperCase() + direction.slice( 1 ),\n\t\t\tonPostRender: function() {\n\t\t\t\tvar self = this;\n\n\t\t\t\teditor.on( 'NodeChange', function( event ) {\n\t\t\t\t\tvar node;\n\n\t\t\t\t\t// Don't bother.\n\t\t\t\t\tif ( event.element.nodeName !== 'IMG' ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tnode = editor.dom.getParent( event.element, '.wp-caption' ) || event.element;\n\n\t\t\t\t\tif ( 'alignnone' === name ) {\n\t\t\t\t\t\tself.active( ! /\\balign(left|center|right)\\b/.test( node.className ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.active( editor.dom.hasClass( node, name ) );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t} );\n\n\teditor.once( 'preinit', function() {\n\t\tif ( editor.wp && editor.wp._createToolbar ) {\n\t\t\ttoolbar = editor.wp._createToolbar( [\n\t\t\t\t'wp_img_alignleft',\n\t\t\t\t'wp_img_aligncenter',\n\t\t\t\t'wp_img_alignright',\n\t\t\t\t'wp_img_alignnone',\n\t\t\t\t'wp_img_edit',\n\t\t\t\t'wp_img_remove'\n\t\t\t] );\n\t\t}\n\t} );\n\n\teditor.on( 'wptoolbar', function( event ) {\n\t\tif ( event.element.nodeName === 'IMG' && ! isPlaceholder( event.element ) ) {\n\t\t\tevent.toolbar = toolbar;\n\t\t}\n\t} );\n\n\t// Safari on iOS fails to select images in contentEditoble mode on touch.\n\t// Select them again.\n\tif ( iOS ) {\n\t\teditor.on( 'init', function() {\n\t\t\teditor.on( 'touchstart', function( event ) {\n\t\t\t\tif ( event.target.nodeName === 'IMG' ) {\n\t\t\t\t\ttouchOnImage = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teditor.dom.bind( editor.getDoc(), 'touchmove', function( event ) {\n\t\t\t\tif ( event.target.nodeName === 'IMG' ) {\n\t\t\t\t\ttouchOnImage = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teditor.on( 'touchend', function( event ) {\n\t\t\t\tif ( touchOnImage && event.target.nodeName === 'IMG' ) {\n\t\t\t\t\tvar node = event.target;\n\n\t\t\t\t\ttouchOnImage = false;\n\n\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\teditor.selection.select( node );\n\t\t\t\t\t\teditor.nodeChanged();\n\t\t\t\t\t}, 200 );\n\t\t\t\t} else if ( toolbar ) {\n\t\t\t\t\ttoolbar.hide();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tfunction parseShortcode( content ) {\n\t\treturn content.replace( /(?:<p>)?\\[(?:wp_)?caption([^\\]]+)\\]([\\s\\S]+?)\\[\\/(?:wp_)?caption\\](?:<\\/p>)?/g, function( a, b, c ) {\n\t\t\tvar id, align, classes, caption, img, width;\n\n\t\t\tid = b.match( /id=['\"]([^'\"]*)['\"] ?/ );\n\t\t\tif ( id ) {\n\t\t\t\tb = b.replace( id[0], '' );\n\t\t\t}\n\n\t\t\talign = b.match( /align=['\"]([^'\"]*)['\"] ?/ );\n\t\t\tif ( align ) {\n\t\t\t\tb = b.replace( align[0], '' );\n\t\t\t}\n\n\t\t\tclasses = b.match( /class=['\"]([^'\"]*)['\"] ?/ );\n\t\t\tif ( classes ) {\n\t\t\t\tb = b.replace( classes[0], '' );\n\t\t\t}\n\n\t\t\twidth = b.match( /width=['\"]([0-9]*)['\"] ?/ );\n\t\t\tif ( width ) {\n\t\t\t\tb = b.replace( width[0], '' );\n\t\t\t}\n\n\t\t\tc = trim( c );\n\t\t\timg = c.match( /((?:<a [^>]+>)?<img [^>]+>(?:<\\/a>)?)([\\s\\S]*)/i );\n\n\t\t\tif ( img && img[2] ) {\n\t\t\t\tcaption = trim( img[2] );\n\t\t\t\timg = trim( img[1] );\n\t\t\t} else {\n\t\t\t\t// old captions shortcode style\n\t\t\t\tcaption = trim( b ).replace( /caption=['\"]/, '' ).replace( /['\"]$/, '' );\n\t\t\t\timg = c;\n\t\t\t}\n\n\t\t\tid = ( id && id[1] ) ? id[1].replace( /[<>&]+/g,  '' ) : '';\n\t\t\talign = ( align && align[1] ) ? align[1] : 'alignnone';\n\t\t\tclasses = ( classes && classes[1] ) ? ' ' + classes[1].replace( /[<>&]+/g,  '' ) : '';\n\n\t\t\tif ( ! width && img ) {\n\t\t\t\twidth = img.match( /width=['\"]([0-9]*)['\"]/ );\n\t\t\t}\n\n\t\t\tif ( width && width[1] ) {\n\t\t\t\twidth = width[1];\n\t\t\t}\n\n\t\t\tif ( ! width || ! caption ) {\n\t\t\t\treturn c;\n\t\t\t}\n\n\t\t\twidth = parseInt( width, 10 );\n\t\t\tif ( ! editor.getParam( 'wpeditimage_html5_captions' ) ) {\n\t\t\t\twidth += 10;\n\t\t\t}\n\n\t\t\treturn '<div class=\"mceTemp\"><dl id=\"' + id + '\" class=\"wp-caption ' + align + classes + '\" style=\"width: ' + width + 'px\">' +\n\t\t\t\t'<dt class=\"wp-caption-dt\">'+ img +'</dt><dd class=\"wp-caption-dd\">'+ caption +'</dd></dl></div>';\n\t\t});\n\t}\n\n\tfunction getShortcode( content ) {\n\t\treturn content.replace( /(?:<div [^>]+mceTemp[^>]+>)?\\s*(<dl [^>]+wp-caption[^>]+>[\\s\\S]+?<\\/dl>)\\s*(?:<\\/div>)?/g, function( all, dl ) {\n\t\t\tvar out = '';\n\n\t\t\tif ( dl.indexOf('<img ') === -1 ) {\n\t\t\t\t// Broken caption. The user managed to drag the image out?\n\t\t\t\t// Try to return the caption text as a paragraph.\n\t\t\t\tout = dl.match( /<dd [^>]+>([\\s\\S]+?)<\\/dd>/i );\n\n\t\t\t\tif ( out && out[1] ) {\n\t\t\t\t\treturn '<p>' + out[1] + '</p>';\n\t\t\t\t}\n\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\tout = dl.replace( /\\s*<dl ([^>]+)>\\s*<dt [^>]+>([\\s\\S]+?)<\\/dt>\\s*<dd [^>]+>([\\s\\S]*?)<\\/dd>\\s*<\\/dl>\\s*/gi, function( a, b, c, caption ) {\n\t\t\t\tvar id, classes, align, width;\n\n\t\t\t\twidth = c.match( /width=\"([0-9]*)\"/ );\n\t\t\t\twidth = ( width && width[1] ) ? width[1] : '';\n\n\t\t\t\tclasses = b.match( /class=\"([^\"]*)\"/ );\n\t\t\t\tclasses = ( classes && classes[1] ) ? classes[1] : '';\n\t\t\t\talign = classes.match( /align[a-z]+/i ) || 'alignnone';\n\n\t\t\t\tif ( ! width || ! caption ) {\n\t\t\t\t\tif ( 'alignnone' !== align[0] ) {\n\t\t\t\t\t\tc = c.replace( /><img/, ' class=\"' + align[0] + '\"><img' );\n\t\t\t\t\t}\n\t\t\t\t\treturn c;\n\t\t\t\t}\n\n\t\t\t\tid = b.match( /id=\"([^\"]*)\"/ );\n\t\t\t\tid = ( id && id[1] ) ? id[1] : '';\n\n\t\t\t\tclasses = classes.replace( /wp-caption ?|align[a-z]+ ?/gi, '' );\n\n\t\t\t\tif ( classes ) {\n\t\t\t\t\tclasses = ' class=\"' + classes + '\"';\n\t\t\t\t}\n\n\t\t\t\tcaption = caption.replace( /\\r\\n|\\r/g, '\\n' ).replace( /<[a-zA-Z0-9]+( [^<>]+)?>/g, function( a ) {\n\t\t\t\t\t// no line breaks inside HTML tags\n\t\t\t\t\treturn a.replace( /[\\r\\n\\t]+/, ' ' );\n\t\t\t\t});\n\n\t\t\t\t// convert remaining line breaks to <br>\n\t\t\t\tcaption = caption.replace( /\\s*\\n\\s*/g, '<br />' );\n\n\t\t\t\treturn '[caption id=\"' + id + '\" align=\"' + align + '\" width=\"' + width + '\"' + classes + ']' + c + ' ' + caption + '[/caption]';\n\t\t\t});\n\n\t\t\tif ( out.indexOf('[caption') === -1 ) {\n\t\t\t\t// the caption html seems broken, try to find the image that may be wrapped in a link\n\t\t\t\t// and may be followed by <p> with the caption text.\n\t\t\t\tout = dl.replace( /[\\s\\S]*?((?:<a [^>]+>)?<img [^>]+>(?:<\\/a>)?)(<p>[\\s\\S]*<\\/p>)?[\\s\\S]*/gi, '<p>$1</p>$2' );\n\t\t\t}\n\n\t\t\treturn out;\n\t\t});\n\t}\n\n\tfunction extractImageData( imageNode ) {\n\t\tvar classes, extraClasses, metadata, captionBlock, caption, link, width, height,\n\t\t\tcaptionClassName = [],\n\t\t\tdom = editor.dom,\n\t\t\tisIntRegExp = /^\\d+$/;\n\n\t\t// default attributes\n\t\tmetadata = {\n\t\t\tattachment_id: false,\n\t\t\tsize: 'custom',\n\t\t\tcaption: '',\n\t\t\talign: 'none',\n\t\t\textraClasses: '',\n\t\t\tlink: false,\n\t\t\tlinkUrl: '',\n\t\t\tlinkClassName: '',\n\t\t\tlinkTargetBlank: false,\n\t\t\tlinkRel: '',\n\t\t\ttitle: ''\n\t\t};\n\n\t\tmetadata.url = dom.getAttrib( imageNode, 'src' );\n\t\tmetadata.alt = dom.getAttrib( imageNode, 'alt' );\n\t\tmetadata.title = dom.getAttrib( imageNode, 'title' );\n\n\t\twidth = dom.getAttrib( imageNode, 'width' );\n\t\theight = dom.getAttrib( imageNode, 'height' );\n\n\t\tif ( ! isIntRegExp.test( width ) || parseInt( width, 10 ) < 1 ) {\n\t\t\twidth = imageNode.naturalWidth || imageNode.width;\n\t\t}\n\n\t\tif ( ! isIntRegExp.test( height ) || parseInt( height, 10 ) < 1 ) {\n\t\t\theight = imageNode.naturalHeight || imageNode.height;\n\t\t}\n\n\t\tmetadata.customWidth = metadata.width = width;\n\t\tmetadata.customHeight = metadata.height = height;\n\n\t\tclasses = tinymce.explode( imageNode.className, ' ' );\n\t\textraClasses = [];\n\n\t\ttinymce.each( classes, function( name ) {\n\n\t\t\tif ( /^wp-image/.test( name ) ) {\n\t\t\t\tmetadata.attachment_id = parseInt( name.replace( 'wp-image-', '' ), 10 );\n\t\t\t} else if ( /^align/.test( name ) ) {\n\t\t\t\tmetadata.align = name.replace( 'align', '' );\n\t\t\t} else if ( /^size/.test( name ) ) {\n\t\t\t\tmetadata.size = name.replace( 'size-', '' );\n\t\t\t} else {\n\t\t\t\textraClasses.push( name );\n\t\t\t}\n\n\t\t} );\n\n\t\tmetadata.extraClasses = extraClasses.join( ' ' );\n\n\t\t// Extract caption\n\t\tcaptionBlock = dom.getParents( imageNode, '.wp-caption' );\n\n\t\tif ( captionBlock.length ) {\n\t\t\tcaptionBlock = captionBlock[0];\n\n\t\t\tclasses = captionBlock.className.split( ' ' );\n\t\t\ttinymce.each( classes, function( name ) {\n\t\t\t\tif ( /^align/.test( name ) ) {\n\t\t\t\t\tmetadata.align = name.replace( 'align', '' );\n\t\t\t\t} else if ( name && name !== 'wp-caption' ) {\n\t\t\t\t\tcaptionClassName.push( name );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tmetadata.captionClassName = captionClassName.join( ' ' );\n\n\t\t\tcaption = dom.select( 'dd.wp-caption-dd', captionBlock );\n\t\t\tif ( caption.length ) {\n\t\t\t\tcaption = caption[0];\n\n\t\t\t\tmetadata.caption = editor.serializer.serialize( caption )\n\t\t\t\t\t.replace( /<br[^>]*>/g, '$&\\n' ).replace( /^<p>/, '' ).replace( /<\\/p>$/, '' );\n\t\t\t}\n\t\t}\n\n\t\t// Extract linkTo\n\t\tif ( imageNode.parentNode && imageNode.parentNode.nodeName === 'A' ) {\n\t\t\tlink = imageNode.parentNode;\n\t\t\tmetadata.linkUrl = dom.getAttrib( link, 'href' );\n\t\t\tmetadata.linkTargetBlank = dom.getAttrib( link, 'target' ) === '_blank' ? true : false;\n\t\t\tmetadata.linkRel = dom.getAttrib( link, 'rel' );\n\t\t\tmetadata.linkClassName = link.className;\n\t\t}\n\n\t\treturn metadata;\n\t}\n\n\tfunction hasTextContent( node ) {\n\t\treturn node && !! ( node.textContent || node.innerText );\n\t}\n\n\t// Verify HTML in captions\n\tfunction verifyHTML( caption ) {\n\t\tif ( ! caption || ( caption.indexOf( '<' ) === -1 && caption.indexOf( '>' ) === -1 ) ) {\n\t\t\treturn caption;\n\t\t}\n\n\t\tif ( ! serializer ) {\n\t\t\tserializer = new tinymce.html.Serializer( {}, editor.schema );\n\t\t}\n\n\t\treturn serializer.serialize( editor.parser.parse( caption, { forced_root_block: false } ) );\n\t}\n\n\tfunction updateImage( imageNode, imageData ) {\n\t\tvar classes, className, node, html, parent, wrap, linkNode,\n\t\t\tcaptionNode, dd, dl, id, attrs, linkAttrs, width, height, align,\n\t\t\tdom = editor.dom;\n\n\t\tclasses = tinymce.explode( imageData.extraClasses, ' ' );\n\n\t\tif ( ! classes ) {\n\t\t\tclasses = [];\n\t\t}\n\n\t\tif ( ! imageData.caption ) {\n\t\t\tclasses.push( 'align' + imageData.align );\n\t\t}\n\n\t\tif ( imageData.attachment_id ) {\n\t\t\tclasses.push( 'wp-image-' + imageData.attachment_id );\n\t\t\tif ( imageData.size && imageData.size !== 'custom' ) {\n\t\t\t\tclasses.push( 'size-' + imageData.size );\n\t\t\t}\n\t\t}\n\n\t\twidth = imageData.width;\n\t\theight = imageData.height;\n\n\t\tif ( imageData.size === 'custom' ) {\n\t\t\twidth = imageData.customWidth;\n\t\t\theight = imageData.customHeight;\n\t\t}\n\n\t\tattrs = {\n\t\t\tsrc: imageData.url,\n\t\t\twidth: width || null,\n\t\t\theight: height || null,\n\t\t\talt: imageData.alt,\n\t\t\ttitle: imageData.title || null,\n\t\t\t'class': classes.join( ' ' ) || null\n\t\t};\n\n\t\tdom.setAttribs( imageNode, attrs );\n\n\t\tlinkAttrs = {\n\t\t\thref: imageData.linkUrl,\n\t\t\trel: imageData.linkRel || null,\n\t\t\ttarget: imageData.linkTargetBlank ? '_blank': null,\n\t\t\t'class': imageData.linkClassName || null\n\t\t};\n\n\t\tif ( imageNode.parentNode && imageNode.parentNode.nodeName === 'A' && ! hasTextContent( imageNode.parentNode ) ) {\n\t\t\t// Update or remove an existing link wrapped around the image\n\t\t\tif ( imageData.linkUrl ) {\n\t\t\t\tdom.setAttribs( imageNode.parentNode, linkAttrs );\n\t\t\t} else {\n\t\t\t\tdom.remove( imageNode.parentNode, true );\n\t\t\t}\n\t\t} else if ( imageData.linkUrl ) {\n\t\t\tif ( linkNode = dom.getParent( imageNode, 'a' ) ) {\n\t\t\t\t// The image is inside a link together with other nodes,\n\t\t\t\t// or is nested in another node, move it out\n\t\t\t\tdom.insertAfter( imageNode, linkNode );\n\t\t\t}\n\n\t\t\t// Add link wrapped around the image\n\t\t\tlinkNode = dom.create( 'a', linkAttrs );\n\t\t\timageNode.parentNode.insertBefore( linkNode, imageNode );\n\t\t\tlinkNode.appendChild( imageNode );\n\t\t}\n\n\t\tcaptionNode = editor.dom.getParent( imageNode, '.mceTemp' );\n\n\t\tif ( imageNode.parentNode && imageNode.parentNode.nodeName === 'A' && ! hasTextContent( imageNode.parentNode ) ) {\n\t\t\tnode = imageNode.parentNode;\n\t\t} else {\n\t\t\tnode = imageNode;\n\t\t}\n\n\t\tif ( imageData.caption ) {\n\t\t\timageData.caption = verifyHTML( imageData.caption );\n\n\t\t\tid = imageData.attachment_id ? 'attachment_' + imageData.attachment_id : null;\n\t\t\talign = 'align' + ( imageData.align || 'none' );\n\t\t\tclassName = 'wp-caption ' + align;\n\n\t\t\tif ( imageData.captionClassName ) {\n\t\t\t\tclassName += ' ' + imageData.captionClassName.replace( /[<>&]+/g,  '' );\n\t\t\t}\n\n\t\t\tif ( ! editor.getParam( 'wpeditimage_html5_captions' ) ) {\n\t\t\t\twidth = parseInt( width, 10 );\n\t\t\t\twidth += 10;\n\t\t\t}\n\n\t\t\tif ( captionNode ) {\n\t\t\t\tdl = dom.select( 'dl.wp-caption', captionNode );\n\n\t\t\t\tif ( dl.length ) {\n\t\t\t\t\tdom.setAttribs( dl, {\n\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t'class': className,\n\t\t\t\t\t\tstyle: 'width: ' + width + 'px'\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\tdd = dom.select( '.wp-caption-dd', captionNode );\n\n\t\t\t\tif ( dd.length ) {\n\t\t\t\t\tdom.setHTML( dd[0], imageData.caption );\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tid = id ? 'id=\"'+ id +'\" ' : '';\n\n\t\t\t\t// should create a new function for generating the caption markup\n\t\t\t\thtml =  '<dl ' + id + 'class=\"' + className +'\" style=\"width: '+ width +'px\">' +\n\t\t\t\t\t'<dt class=\"wp-caption-dt\"></dt><dd class=\"wp-caption-dd\">'+ imageData.caption +'</dd></dl>';\n\n\t\t\t\twrap = dom.create( 'div', { 'class': 'mceTemp' }, html );\n\n\t\t\t\tif ( parent = dom.getParent( node, 'p' ) ) {\n\t\t\t\t\tparent.parentNode.insertBefore( wrap, parent );\n\t\t\t\t} else {\n\t\t\t\t\tnode.parentNode.insertBefore( wrap, node );\n\t\t\t\t}\n\n\t\t\t\teditor.$( wrap ).find( 'dt.wp-caption-dt' ).append( node );\n\n\t\t\t\tif ( parent && dom.isEmpty( parent ) ) {\n\t\t\t\t\tdom.remove( parent );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( captionNode ) {\n\t\t\t// Remove the caption wrapper and place the image in new paragraph\n\t\t\tparent = dom.create( 'p' );\n\t\t\tcaptionNode.parentNode.insertBefore( parent, captionNode );\n\t\t\tparent.appendChild( node );\n\t\t\tdom.remove( captionNode );\n\t\t}\n\n\t\tif ( wp.media.events ) {\n\t\t\twp.media.events.trigger( 'editor:image-update', {\n\t\t\t\teditor: editor,\n\t\t\t\tmetadata: imageData,\n\t\t\t\timage: imageNode\n\t\t\t} );\n\t\t}\n\n\t\teditor.nodeChanged();\n\t}\n\n\tfunction editImage( img ) {\n\t\tvar frame, callback, metadata;\n\n\t\tif ( typeof wp === 'undefined' || ! wp.media ) {\n\t\t\teditor.execCommand( 'mceImage' );\n\t\t\treturn;\n\t\t}\n\n\t\tmetadata = extractImageData( img );\n\n\t\t// Manipulate the metadata by reference that is fed into the PostImage model used in the media modal\n\t\twp.media.events.trigger( 'editor:image-edit', {\n\t\t\teditor: editor,\n\t\t\tmetadata: metadata,\n\t\t\timage: img\n\t\t} );\n\n\t\tframe = wp.media({\n\t\t\tframe: 'image',\n\t\t\tstate: 'image-details',\n\t\t\tmetadata: metadata\n\t\t} );\n\n\t\twp.media.events.trigger( 'editor:frame-create', { frame: frame } );\n\n\t\tcallback = function( imageData ) {\n\t\t\teditor.focus();\n\t\t\teditor.undoManager.transact( function() {\n\t\t\t\tupdateImage( img, imageData );\n\t\t\t} );\n\t\t\tframe.detach();\n\t\t};\n\n\t\tframe.state('image-details').on( 'update', callback );\n\t\tframe.state('replace-image').on( 'replace', callback );\n\t\tframe.on( 'close', function() {\n\t\t\teditor.focus();\n\t\t\tframe.detach();\n\t\t});\n\n\t\tframe.open();\n\t}\n\n\tfunction removeImage( node ) {\n\t\tvar wrap = editor.dom.getParent( node, 'div.mceTemp' );\n\n\t\tif ( ! wrap && node.nodeName === 'IMG' ) {\n\t\t\twrap = editor.dom.getParent( node, 'a' );\n\t\t}\n\n\t\tif ( wrap ) {\n\t\t\tif ( wrap.nextSibling ) {\n\t\t\t\teditor.selection.select( wrap.nextSibling );\n\t\t\t} else if ( wrap.previousSibling ) {\n\t\t\t\teditor.selection.select( wrap.previousSibling );\n\t\t\t} else {\n\t\t\t\teditor.selection.select( wrap.parentNode );\n\t\t\t}\n\n\t\t\teditor.selection.collapse( true );\n\t\t\teditor.dom.remove( wrap );\n\t\t} else {\n\t\t\teditor.dom.remove( node );\n\t\t}\n\n\t\teditor.nodeChanged();\n\t\teditor.undoManager.add();\n\t}\n\n\teditor.on( 'init', function() {\n\t\tvar dom = editor.dom,\n\t\t\tcaptionClass = editor.getParam( 'wpeditimage_html5_captions' ) ? 'html5-captions' : 'html4-captions';\n\n\t\tdom.addClass( editor.getBody(), captionClass );\n\n\t\t// Add caption field to the default image dialog\n\t\teditor.on( 'wpLoadImageForm', function( event ) {\n\t\t\tif ( editor.getParam( 'wpeditimage_disable_captions' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar captionField = {\n\t\t\t\ttype: 'textbox',\n\t\t\t\tflex: 1,\n\t\t\t\tname: 'caption',\n\t\t\t\tminHeight: 60,\n\t\t\t\tmultiline: true,\n\t\t\t\tscroll: true,\n\t\t\t\tlabel: 'Image caption'\n\t\t\t};\n\n\t\t\tevent.data.splice( event.data.length - 1, 0, captionField );\n\t\t});\n\n\t\t// Fix caption parent width for images added from URL\n\t\teditor.on( 'wpNewImageRefresh', function( event ) {\n\t\t\tvar parent, captionWidth;\n\n\t\t\tif ( parent = dom.getParent( event.node, 'dl.wp-caption' ) ) {\n\t\t\t\tif ( ! parent.style.width ) {\n\t\t\t\t\tcaptionWidth = parseInt( event.node.clientWidth, 10 ) + 10;\n\t\t\t\t\tcaptionWidth = captionWidth ? captionWidth + 'px' : '50%';\n\t\t\t\t\tdom.setStyle( parent, 'width', captionWidth );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\teditor.on( 'wpImageFormSubmit', function( event ) {\n\t\t\tvar data = event.imgData.data,\n\t\t\t\timgNode = event.imgData.node,\n\t\t\t\tcaption = event.imgData.caption,\n\t\t\t\tcaptionId = '',\n\t\t\t\tcaptionAlign = '',\n\t\t\t\tcaptionWidth = '',\n\t\t\t\twrap, parent, node, html, imgId;\n\n\t\t\t// Temp image id so we can find the node later\n\t\t\tdata.id = '__wp-temp-img-id';\n\t\t\t// Cancel the original callback\n\t\t\tevent.imgData.cancel = true;\n\n\t\t\tif ( ! data.style ) {\n\t\t\t\tdata.style = null;\n\t\t\t}\n\n\t\t\tif ( ! data.src ) {\n\t\t\t\t// Delete the image and the caption\n\t\t\t\tif ( imgNode ) {\n\t\t\t\t\tif ( wrap = dom.getParent( imgNode, 'div.mceTemp' ) ) {\n\t\t\t\t\t\tdom.remove( wrap );\n\t\t\t\t\t} else if ( imgNode.parentNode.nodeName === 'A' ) {\n\t\t\t\t\t\tdom.remove( imgNode.parentNode );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdom.remove( imgNode );\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.nodeChanged();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( caption ) {\n\t\t\t\tcaption = caption.replace( /\\r\\n|\\r/g, '\\n' ).replace( /<\\/?[a-zA-Z0-9]+( [^<>]+)?>/g, function( a ) {\n\t\t\t\t\t// No line breaks inside HTML tags\n\t\t\t\t\treturn a.replace( /[\\r\\n\\t]+/, ' ' );\n\t\t\t\t});\n\n\t\t\t\t// Convert remaining line breaks to <br>\n\t\t\t\tcaption = caption.replace( /(<br[^>]*>)\\s*\\n\\s*/g, '$1' ).replace( /\\s*\\n\\s*/g, '<br />' );\n\t\t\t\tcaption = verifyHTML( caption );\n\t\t\t}\n\n\t\t\tif ( ! imgNode ) {\n\t\t\t\t// New image inserted\n\t\t\t\thtml = dom.createHTML( 'img', data );\n\n\t\t\t\tif ( caption ) {\n\t\t\t\t\tnode = editor.selection.getNode();\n\n\t\t\t\t\tif ( data.width ) {\n\t\t\t\t\t\tcaptionWidth = parseInt( data.width, 10 );\n\n\t\t\t\t\t\tif ( ! editor.getParam( 'wpeditimage_html5_captions' ) ) {\n\t\t\t\t\t\t\tcaptionWidth += 10;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcaptionWidth = ' style=\"width: ' + captionWidth + 'px\"';\n\t\t\t\t\t}\n\n\t\t\t\t\thtml = '<dl class=\"wp-caption alignnone\"' + captionWidth + '>' +\n\t\t\t\t\t\t'<dt class=\"wp-caption-dt\">'+ html +'</dt><dd class=\"wp-caption-dd\">'+ caption +'</dd></dl>';\n\n\t\t\t\t\tif ( node.nodeName === 'P' ) {\n\t\t\t\t\t\tparent = node;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparent = dom.getParent( node, 'p' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( parent && parent.nodeName === 'P' ) {\n\t\t\t\t\t\twrap = dom.create( 'div', { 'class': 'mceTemp' }, html );\n\t\t\t\t\t\tparent.parentNode.insertBefore( wrap, parent );\n\t\t\t\t\t\teditor.selection.select( wrap );\n\t\t\t\t\t\teditor.nodeChanged();\n\n\t\t\t\t\t\tif ( dom.isEmpty( parent ) ) {\n\t\t\t\t\t\t\tdom.remove( parent );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\teditor.selection.setContent( '<div class=\"mceTemp\">' + html + '</div>' );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\teditor.selection.setContent( html );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Edit existing image\n\n\t\t\t\t// Store the original image id if any\n\t\t\t\timgId = imgNode.id || null;\n\t\t\t\t// Update the image node\n\t\t\t\tdom.setAttribs( imgNode, data );\n\t\t\t\twrap = dom.getParent( imgNode, 'dl.wp-caption' );\n\n\t\t\t\tif ( caption ) {\n\t\t\t\t\tif ( wrap ) {\n\t\t\t\t\t\tif ( parent = dom.select( 'dd.wp-caption-dd', wrap )[0] ) {\n\t\t\t\t\t\t\tparent.innerHTML = caption;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( imgNode.className ) {\n\t\t\t\t\t\t\tcaptionId = imgNode.className.match( /wp-image-([0-9]+)/ );\n\t\t\t\t\t\t\tcaptionAlign = imgNode.className.match( /align(left|right|center|none)/ );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( captionAlign ) {\n\t\t\t\t\t\t\tcaptionAlign = captionAlign[0];\n\t\t\t\t\t\t\timgNode.className = imgNode.className.replace( /align(left|right|center|none)/g, '' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcaptionAlign = 'alignnone';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcaptionAlign = ' class=\"wp-caption ' + captionAlign + '\"';\n\n\t\t\t\t\t\tif ( captionId ) {\n\t\t\t\t\t\t\tcaptionId = ' id=\"attachment_' + captionId[1] + '\"';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcaptionWidth = data.width || imgNode.clientWidth;\n\n\t\t\t\t\t\tif ( captionWidth ) {\n\t\t\t\t\t\t\tcaptionWidth = parseInt( captionWidth, 10 );\n\n\t\t\t\t\t\t\tif ( ! editor.getParam( 'wpeditimage_html5_captions' ) ) {\n\t\t\t\t\t\t\t\tcaptionWidth += 10;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcaptionWidth = ' style=\"width: '+ captionWidth +'px\"';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( imgNode.parentNode && imgNode.parentNode.nodeName === 'A' ) {\n\t\t\t\t\t\t\tnode = imgNode.parentNode;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode = imgNode;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thtml = '<dl ' + captionId + captionAlign + captionWidth + '>' +\n\t\t\t\t\t\t\t'<dt class=\"wp-caption-dt\"></dt><dd class=\"wp-caption-dd\">'+ caption +'</dd></dl>';\n\n\t\t\t\t\t\twrap = dom.create( 'div', { 'class': 'mceTemp' }, html );\n\n\t\t\t\t\t\tif ( parent = dom.getParent( node, 'p' ) ) {\n\t\t\t\t\t\t\tparent.parentNode.insertBefore( wrap, parent );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.parentNode.insertBefore( wrap, node );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\teditor.$( wrap ).find( 'dt.wp-caption-dt' ).append( node );\n\n\t\t\t\t\t\tif ( parent && dom.isEmpty( parent ) ) {\n\t\t\t\t\t\t\tdom.remove( parent );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( wrap ) {\n\t\t\t\t\t\t// Remove the caption wrapper and place the image in new paragraph\n\t\t\t\t\t\tif ( imgNode.parentNode.nodeName === 'A' ) {\n\t\t\t\t\t\t\thtml = dom.getOuterHTML( imgNode.parentNode );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thtml = dom.getOuterHTML( imgNode );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent = dom.create( 'p', {}, html );\n\t\t\t\t\t\tdom.insertAfter( parent, wrap.parentNode );\n\t\t\t\t\t\teditor.selection.select( parent );\n\t\t\t\t\t\teditor.nodeChanged();\n\t\t\t\t\t\tdom.remove( wrap.parentNode );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\timgNode = dom.get('__wp-temp-img-id');\n\t\t\tdom.setAttrib( imgNode, 'id', imgId );\n\t\t\tevent.imgData.node = imgNode;\n\t\t});\n\n\t\teditor.on( 'wpLoadImageData', function( event ) {\n\t\t\tvar parent,\n\t\t\t\tdata = event.imgData.data,\n\t\t\t\timgNode = event.imgData.node;\n\n\t\t\tif ( parent = dom.getParent( imgNode, 'dl.wp-caption' ) ) {\n\t\t\t\tparent = dom.select( 'dd.wp-caption-dd', parent )[0];\n\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tdata.caption = editor.serializer.serialize( parent )\n\t\t\t\t\t\t.replace( /<br[^>]*>/g, '$&\\n' ).replace( /^<p>/, '' ).replace( /<\\/p>$/, '' );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Prevent IE11 from making dl.wp-caption resizable\n\t\tif ( tinymce.Env.ie && tinymce.Env.ie > 10 ) {\n\t\t\t// The 'mscontrolselect' event is supported only in IE11+\n\t\t\tdom.bind( editor.getBody(), 'mscontrolselect', function( event ) {\n\t\t\t\tif ( event.target.nodeName === 'IMG' && dom.getParent( event.target, '.wp-caption' ) ) {\n\t\t\t\t\t// Hide the thick border with resize handles around dl.wp-caption\n\t\t\t\t\teditor.getBody().focus(); // :(\n\t\t\t\t} else if ( event.target.nodeName === 'DL' && dom.hasClass( event.target, 'wp-caption' ) ) {\n\t\t\t\t\t// Trigger the thick border with resize handles...\n\t\t\t\t\t// This will make the caption text editable.\n\t\t\t\t\tevent.target.focus();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\teditor.on( 'ObjectResized', function( event ) {\n\t\tvar node = event.target;\n\n\t\tif ( node.nodeName === 'IMG' ) {\n\t\t\teditor.undoManager.transact( function() {\n\t\t\t\tvar parent, width,\n\t\t\t\t\tdom = editor.dom;\n\n\t\t\t\tnode.className = node.className.replace( /\\bsize-[^ ]+/, '' );\n\n\t\t\t\tif ( parent = dom.getParent( node, '.wp-caption' ) ) {\n\t\t\t\t\twidth = event.width || dom.getAttrib( node, 'width' );\n\n\t\t\t\t\tif ( width ) {\n\t\t\t\t\t\twidth = parseInt( width, 10 );\n\n\t\t\t\t\t\tif ( ! editor.getParam( 'wpeditimage_html5_captions' ) ) {\n\t\t\t\t\t\t\twidth += 10;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdom.setStyle( parent, 'width', width + 'px' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n    });\n\n\teditor.on( 'BeforeExecCommand', function( event ) {\n\t\tvar node, p, DL, align, replacement,\n\t\t\tcmd = event.command,\n\t\t\tdom = editor.dom;\n\n\t\tif ( cmd === 'mceInsertContent' ) {\n\t\t\t// When inserting content, if the caret is inside a caption create new paragraph under\n\t\t\t// and move the caret there\n\t\t\tif ( node = dom.getParent( editor.selection.getNode(), 'div.mceTemp' ) ) {\n\t\t\t\tp = dom.create( 'p' );\n\t\t\t\tdom.insertAfter( p, node );\n\t\t\t\teditor.selection.setCursorLocation( p, 0 );\n\t\t\t\teditor.nodeChanged();\n\t\t\t}\n\t\t} else if ( cmd === 'JustifyLeft' || cmd === 'JustifyRight' || cmd === 'JustifyCenter' || cmd === 'wpAlignNone' ) {\n\t\t\tnode = editor.selection.getNode();\n\t\t\talign = 'align' + cmd.slice( 7 ).toLowerCase();\n\t\t\tDL = editor.dom.getParent( node, '.wp-caption' );\n\n\t\t\tif ( node.nodeName !== 'IMG' && ! DL ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnode = DL || node;\n\n\t\t\tif ( editor.dom.hasClass( node, align ) ) {\n\t\t\t\treplacement = ' alignnone';\n\t\t\t} else {\n\t\t\t\treplacement = ' ' + align;\n\t\t\t}\n\n\t\t\tnode.className = trim( node.className.replace( / ?align(left|center|right|none)/g, '' ) + replacement );\n\n\t\t\teditor.nodeChanged();\n\t\t\tevent.preventDefault();\n\n\t\t\tif ( toolbar ) {\n\t\t\t\ttoolbar.reposition();\n\t\t\t}\n\n\t\t\teditor.fire( 'ExecCommand', {\n\t\t\t\tcommand: cmd,\n\t\t\t\tui: event.ui,\n\t\t\t\tvalue: event.value\n\t\t\t} );\n\t\t}\n\t});\n\n\teditor.on( 'keydown', function( event ) {\n\t\tvar node, wrap, P, spacer,\n\t\t\tselection = editor.selection,\n\t\t\tkeyCode = event.keyCode,\n\t\t\tdom = editor.dom,\n\t\t\tVK = tinymce.util.VK;\n\n\t\tif ( keyCode === VK.ENTER ) {\n\t\t\t// When pressing Enter inside a caption move the caret to a new parapraph under it\n\t\t\tnode = selection.getNode();\n\t\t\twrap = dom.getParent( node, 'div.mceTemp' );\n\n\t\t\tif ( wrap ) {\n\t\t\t\tdom.events.cancel( event ); // Doesn't cancel all :(\n\n\t\t\t\t// Remove any extra dt and dd cleated on pressing Enter...\n\t\t\t\ttinymce.each( dom.select( 'dt, dd', wrap ), function( element ) {\n\t\t\t\t\tif ( dom.isEmpty( element ) ) {\n\t\t\t\t\t\tdom.remove( element );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tspacer = tinymce.Env.ie && tinymce.Env.ie < 11 ? '' : '<br data-mce-bogus=\"1\" />';\n\t\t\t\tP = dom.create( 'p', null, spacer );\n\n\t\t\t\tif ( node.nodeName === 'DD' ) {\n\t\t\t\t\tdom.insertAfter( P, wrap );\n\t\t\t\t} else {\n\t\t\t\t\twrap.parentNode.insertBefore( P, wrap );\n\t\t\t\t}\n\n\t\t\t\teditor.nodeChanged();\n\t\t\t\tselection.setCursorLocation( P, 0 );\n\t\t\t}\n\t\t} else if ( keyCode === VK.DELETE || keyCode === VK.BACKSPACE ) {\n\t\t\tnode = selection.getNode();\n\n\t\t\tif ( node.nodeName === 'DIV' && dom.hasClass( node, 'mceTemp' ) ) {\n\t\t\t\twrap = node;\n\t\t\t} else if ( node.nodeName === 'IMG' || node.nodeName === 'DT' || node.nodeName === 'A' ) {\n\t\t\t\twrap = dom.getParent( node, 'div.mceTemp' );\n\t\t\t}\n\n\t\t\tif ( wrap ) {\n\t\t\t\tdom.events.cancel( event );\n\t\t\t\tremoveImage( node );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t});\n\n\t// After undo/redo FF seems to set the image height very slowly when it is set to 'auto' in the CSS.\n\t// This causes image.getBoundingClientRect() to return wrong values and the resize handles are shown in wrong places.\n\t// Collapse the selection to remove the resize handles.\n\tif ( tinymce.Env.gecko ) {\n\t\teditor.on( 'undo redo', function() {\n\t\t\tif ( editor.selection.getNode().nodeName === 'IMG' ) {\n\t\t\t\teditor.selection.collapse();\n\t\t\t}\n\t\t});\n\t}\n\n\teditor.wpSetImgCaption = function( content ) {\n\t\treturn parseShortcode( content );\n\t};\n\n\teditor.wpGetImgCaption = function( content ) {\n\t\treturn getShortcode( content );\n\t};\n\n\teditor.on( 'BeforeSetContent', function( event ) {\n\t\tif ( event.format !== 'raw' ) {\n\t\t\tevent.content = editor.wpSetImgCaption( event.content );\n\t\t}\n\t});\n\n\teditor.on( 'PostProcess', function( event ) {\n\t\tif ( event.get ) {\n\t\t\tevent.content = editor.wpGetImgCaption( event.content );\n\t\t}\n\t});\n\n\t( function() {\n\t\tvar wrap;\n\n\t\teditor.on( 'dragstart', function() {\n\t\t\tvar node = editor.selection.getNode();\n\n\t\t\tif ( node.nodeName === 'IMG' ) {\n\t\t\t\twrap = editor.dom.getParent( node, '.mceTemp' );\n\n\t\t\t\tif ( ! wrap && node.parentNode.nodeName === 'A' && ! hasTextContent( node.parentNode ) ) {\n\t\t\t\t\twrap = node.parentNode;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\teditor.on( 'drop', function( event ) {\n\t\t\tvar dom = editor.dom,\n\t\t\t\trng = tinymce.dom.RangeUtils.getCaretRangeFromPoint( event.clientX, event.clientY, editor.getDoc() );\n\n\t\t\t// Don't allow anything to be dropped in a captioned image.\n\t\t\tif ( dom.getParent( rng.startContainer, '.mceTemp' ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( wrap ) {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\teditor.undoManager.transact( function() {\n\t\t\t\t\teditor.selection.setRng( rng );\n\t\t\t\t\teditor.selection.setNode( wrap );\n\t\t\t\t\tdom.remove( wrap );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\twrap = null;\n\t\t} );\n\t} )();\n\n\t// Add to editor.wp\n\teditor.wp = editor.wp || {};\n\teditor.wp.isPlaceholder = isPlaceholder;\n\n\t// Back-compat.\n\treturn {\n\t\t_do_shcode: parseShortcode,\n\t\t_get_shcode: getShortcode\n\t};\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wpembed/plugin.js",
    "content": "(function ( tinymce ) {\n\t'use strict';\n\n\ttinymce.PluginManager.add( 'wpembed', function ( editor, url ) {\n\t\teditor.on( 'init', function () {\n\t\t\tvar scriptId = editor.dom.uniqueId();\n\n\t\t\tvar scriptElm = editor.dom.create( 'script', {\n\t\t\t\tid: scriptId,\n\t\t\t\ttype: 'text/javascript',\n\t\t\t\tsrc: url + '/../../../wp-embed.js'\n\t\t\t} );\n\n\t\t\teditor.getDoc().getElementsByTagName( 'head' )[ 0 ].appendChild( scriptElm );\n\t\t} );\n\t} );\n})( window.tinymce );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wpemoji/plugin.js",
    "content": "( function( tinymce, wp ) {\n\ttinymce.PluginManager.add( 'wpemoji', function( editor ) {\n\t\tvar typing,\n\t\t\tenv = tinymce.Env,\n\t\t\tua = window.navigator.userAgent,\n\t\t\tisWin = ua.indexOf( 'Windows' ) > -1,\n\t\t\tisWin8 = ( function() {\n\t\t\t\tvar match = ua.match( /Windows NT 6\\.(\\d)/ );\n\n\t\t\t\tif ( match && match[1] > 1 ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}());\n\n\t\tif ( ! wp || ! wp.emoji || ! wp.emoji.replaceEmoji ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfunction setImgAttr( image ) {\n\t\t\timage.className = 'emoji';\n\t\t\timage.setAttribute( 'data-mce-resize', 'false' );\n\t\t\timage.setAttribute( 'data-mce-placeholder', '1' );\n\t\t\timage.setAttribute( 'data-wp-emoji', '1' );\n\t\t}\n\n\t\tfunction replaceEmoji( node ) {\n\t\t\tvar imgAttr = {\n\t\t\t\t'data-mce-resize': 'false',\n\t\t\t\t'data-mce-placeholder': '1',\n\t\t\t\t'data-wp-emoji': '1'\n\t\t\t};\n\n\t\t\twp.emoji.parse( node, { imgAttr: imgAttr } );\n\t\t}\n\n\t\t// Test if the node text contains emoji char(s) and replace.\n\t\tfunction parseNode( node ) {\n\t\t\tvar selection, bookmark;\n\n\t\t\tif ( node && window.twemoji && window.twemoji.test( node.textContent || node.innerText ) ) {\n\t\t\t\tif ( env.webkit ) {\n\t\t\t\t\tselection = editor.selection;\n\t\t\t\t\tbookmark = selection.getBookmark();\n\t\t\t\t}\n\n\t\t\t\treplaceEmoji( node );\n\n\t\t\t\tif ( env.webkit ) {\n\t\t\t\t\tselection.moveToBookmark( bookmark );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( isWin8 ) {\n\t\t\t// Windows 8+ emoji can be \"typed\" with the onscreen keyboard.\n\t\t\t// That triggers the normal keyboard events, but not the 'input' event.\n\t\t\t// Thankfully it sets keyCode 231 when the onscreen keyboard inserts any emoji.\n\t\t\teditor.on( 'keyup', function( event ) {\n\t\t\t\tif ( event.keyCode === 231 ) {\n\t\t\t\t\tparseNode( editor.selection.getNode() );\n\t\t\t\t}\n\t\t\t} );\n\t\t} else if ( ! isWin ) {\n\t\t\t// In MacOS inserting emoji doesn't trigger the stanradr keyboard events.\n\t\t\t// Thankfully it triggers the 'input' event.\n\t\t\t// This works in Android and iOS as well.\n\t\t\teditor.on( 'keydown keyup', function( event ) {\n\t\t\t\ttyping = ( event.type === 'keydown' );\n\t\t\t} );\n\n\t\t\teditor.on( 'input', function() {\n\t\t\t\tif ( typing ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tparseNode( editor.selection.getNode() );\n\t\t\t});\n\t\t}\n\n\t\teditor.on( 'setcontent', function( event ) {\n\t\t\tvar selection = editor.selection,\n\t\t\t\tnode = selection.getNode();\n\n\t\t\tif ( window.twemoji && window.twemoji.test( node.textContent || node.innerText ) ) {\n\t\t\t\treplaceEmoji( node );\n\n\t\t\t\t// In IE all content in the editor is left selected after wp.emoji.parse()...\n\t\t\t\t// Collapse the selection to the beginning.\n\t\t\t\tif ( env.ie && env.ie < 9 && event.load && node && node.nodeName === 'BODY' ) {\n\t\t\t\t\tselection.collapse( true );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Convert Twemoji compatible pasted emoji replacement images into our format.\n\t\teditor.on( 'PastePostProcess', function( event ) {\n\t\t\tif ( window.twemoji ) {\n\t\t\t\ttinymce.each( editor.dom.$( 'img.emoji', event.node ), function( image ) {\n\t\t\t\t\tif ( image.alt && window.twemoji.test( image.alt ) ) {\n\t\t\t\t\t\tsetImgAttr( image );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\teditor.on( 'postprocess', function( event ) {\n\t\t\tif ( event.content ) {\n\t\t\t\tevent.content = event.content.replace( /<img[^>]+data-wp-emoji=\"[^>]+>/g, function( img ) {\n\t\t\t\t\tvar alt = img.match( /alt=\"([^\"]+)\"/ );\n\n\t\t\t\t\tif ( alt && alt[1] ) {\n\t\t\t\t\t\treturn alt[1];\n\t\t\t\t\t}\n\n\t\t\t\t\treturn img;\n\t\t\t\t});\n\t\t\t}\n\t\t} );\n\n\t\teditor.on( 'resolvename', function( event ) {\n\t\t\tif ( event.target.nodeName === 'IMG' && editor.dom.getAttrib( event.target, 'data-wp-emoji' ) ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t} );\n\t} );\n} )( window.tinymce, window.wp );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wpgallery/plugin.js",
    "content": "/* global tinymce */\ntinymce.PluginManager.add('wpgallery', function( editor ) {\n\n\tfunction replaceGalleryShortcodes( content ) {\n\t\treturn content.replace( /\\[gallery([^\\]]*)\\]/g, function( match ) {\n\t\t\treturn html( 'wp-gallery', match );\n\t\t});\n\t}\n\n\tfunction html( cls, data ) {\n\t\tdata = window.encodeURIComponent( data );\n\t\treturn '<img src=\"' + tinymce.Env.transparentSrc + '\" class=\"wp-media mceItem ' + cls + '\" ' +\n\t\t\t'data-wp-media=\"' + data + '\" data-mce-resize=\"false\" data-mce-placeholder=\"1\" alt=\"\" />';\n\t}\n\n\tfunction restoreMediaShortcodes( content ) {\n\t\tfunction getAttr( str, name ) {\n\t\t\tname = new RegExp( name + '=\\\"([^\\\"]+)\\\"' ).exec( str );\n\t\t\treturn name ? window.decodeURIComponent( name[1] ) : '';\n\t\t}\n\n\t\treturn content.replace( /(?:<p(?: [^>]+)?>)*(<img [^>]+>)(?:<\\/p>)*/g, function( match, image ) {\n\t\t\tvar data = getAttr( image, 'data-wp-media' );\n\n\t\t\tif ( data ) {\n\t\t\t\treturn '<p>' + data + '</p>';\n\t\t\t}\n\n\t\t\treturn match;\n\t\t});\n\t}\n\n\tfunction editMedia( node ) {\n\t\tvar gallery, frame, data;\n\n\t\tif ( node.nodeName !== 'IMG' ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if the `wp.media` API exists.\n\t\tif ( typeof wp === 'undefined' || ! wp.media ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdata = window.decodeURIComponent( editor.dom.getAttrib( node, 'data-wp-media' ) );\n\n\t\t// Make sure we've selected a gallery node.\n\t\tif ( editor.dom.hasClass( node, 'wp-gallery' ) && wp.media.gallery ) {\n\t\t\tgallery = wp.media.gallery;\n\t\t\tframe = gallery.edit( data );\n\n\t\t\tframe.state('gallery-edit').on( 'update', function( selection ) {\n\t\t\t\tvar shortcode = gallery.shortcode( selection ).string();\n\t\t\t\teditor.dom.setAttrib( node, 'data-wp-media', window.encodeURIComponent( shortcode ) );\n\t\t\t\tframe.detach();\n\t\t\t});\n\t\t}\n\t}\n\n\t// Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('...');\n\teditor.addCommand( 'WP_Gallery', function() {\n\t\teditMedia( editor.selection.getNode() );\n\t});\n\n\teditor.on( 'mouseup', function( event ) {\n\t\tvar dom = editor.dom,\n\t\t\tnode = event.target;\n\n\t\tfunction unselect() {\n\t\t\tdom.removeClass( dom.select( 'img.wp-media-selected' ), 'wp-media-selected' );\n\t\t}\n\n\t\tif ( node.nodeName === 'IMG' && dom.getAttrib( node, 'data-wp-media' ) ) {\n\t\t\t// Don't trigger on right-click\n\t\t\tif ( event.button !== 2 ) {\n\t\t\t\tif ( dom.hasClass( node, 'wp-media-selected' ) ) {\n\t\t\t\t\teditMedia( node );\n\t\t\t\t} else {\n\t\t\t\t\tunselect();\n\t\t\t\t\tdom.addClass( node, 'wp-media-selected' );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tunselect();\n\t\t}\n\t});\n\n\t// Display gallery, audio or video instead of img in the element path\n\teditor.on( 'ResolveName', function( event ) {\n\t\tvar dom = editor.dom,\n\t\t\tnode = event.target;\n\n\t\tif ( node.nodeName === 'IMG' && dom.getAttrib( node, 'data-wp-media' ) ) {\n\t\t\tif ( dom.hasClass( node, 'wp-gallery' ) ) {\n\t\t\t\tevent.name = 'gallery';\n\t\t\t}\n\t\t}\n\t});\n\n\teditor.on( 'BeforeSetContent', function( event ) {\n\t\t// 'wpview' handles the gallery shortcode when present\n\t\tif ( ! editor.plugins.wpview || typeof wp === 'undefined' || ! wp.mce ) {\n\t\t\tevent.content = replaceGalleryShortcodes( event.content );\n\t\t}\n\t});\n\n\teditor.on( 'PostProcess', function( event ) {\n\t\tif ( event.get ) {\n\t\t\tevent.content = restoreMediaShortcodes( event.content );\n\t\t}\n\t});\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wplink/plugin.js",
    "content": "( function( tinymce ) {\n\ttinymce.ui.WPLinkPreview = tinymce.ui.Control.extend( {\n\t\turl: '#',\n\t\trenderHtml: function() {\n\t\t\treturn (\n\t\t\t\t'<div id=\"' + this._id + '\" class=\"wp-link-preview\">' +\n\t\t\t\t\t'<a href=\"' + this.url + '\" target=\"_blank\" tabindex=\"-1\">' + this.url + '</a>' +\n\t\t\t\t'</div>'\n\t\t\t);\n\t\t},\n\t\tsetURL: function( url ) {\n\t\t\tvar index, lastIndex;\n\n\t\t\tif ( this.url !== url ) {\n\t\t\t\tthis.url = url;\n\n\t\t\t\turl = window.decodeURIComponent( url );\n\n\t\t\t\turl = url.replace( /^(?:https?:)?\\/\\/(?:www\\.)?/, '' );\n\n\t\t\t\tif ( ( index = url.indexOf( '?' ) ) !== -1 ) {\n\t\t\t\t\turl = url.slice( 0, index );\n\t\t\t\t}\n\n\t\t\t\tif ( ( index = url.indexOf( '#' ) ) !== -1 ) {\n\t\t\t\t\turl = url.slice( 0, index );\n\t\t\t\t}\n\n\t\t\t\turl = url.replace( /(?:index)?\\.html$/, '' );\n\n\t\t\t\tif ( url.charAt( url.length - 1 ) === '/' ) {\n\t\t\t\t\turl = url.slice( 0, -1 );\n\t\t\t\t}\n\n\t\t\t\t// If the URL is longer that 40 chars, concatenate the beginning (after the domain) and ending with ...\n\t\t\t\tif ( url.length > 40 && ( index = url.indexOf( '/' ) ) !== -1 && ( lastIndex = url.lastIndexOf( '/' ) ) !== -1 && lastIndex !== index ) {\n\t\t\t\t\t// If the beginning + ending are shorter that 40 chars, show more of the ending\n\t\t\t\t\tif ( index + url.length - lastIndex < 40 ) {\n\t\t\t\t\t\tlastIndex =  -( 40 - ( index + 1 ) );\n\t\t\t\t\t}\n\n\t\t\t\t\turl = url.slice( 0, index + 1 ) + '\\u2026' + url.slice( lastIndex );\n\t\t\t\t}\n\n\t\t\t\ttinymce.$( this.getEl().firstChild ).attr( 'href', this.url ).text( url );\n\t\t\t}\n\t\t}\n\t} );\n\n\ttinymce.PluginManager.add( 'wplink', function( editor ) {\n\t\tvar toolbar;\n\n\t\teditor.addCommand( 'WP_Link', function() {\n\t\t\twindow.wpLink && window.wpLink.open( editor.id );\n\t\t});\n\n\t\t// WP default shortcut\n\t\teditor.addShortcut( 'access+a', '', 'WP_Link' );\n\t\t// The \"de-facto standard\" shortcut, see #27305\n\t\teditor.addShortcut( 'meta+k', '', 'WP_Link' );\n\n\t\teditor.addButton( 'link', {\n\t\t\ticon: 'link',\n\t\t\ttooltip: 'Insert/edit link',\n\t\t\tcmd: 'WP_Link',\n\t\t\tstateSelector: 'a[href]'\n\t\t});\n\n\t\teditor.addButton( 'unlink', {\n\t\t\ticon: 'unlink',\n\t\t\ttooltip: 'Remove link',\n\t\t\tcmd: 'unlink'\n\t\t});\n\n\t\teditor.addMenuItem( 'link', {\n\t\t\ticon: 'link',\n\t\t\ttext: 'Insert/edit link',\n\t\t\tcmd: 'WP_Link',\n\t\t\tstateSelector: 'a[href]',\n\t\t\tcontext: 'insert',\n\t\t\tprependToContext: true\n\t\t});\n\n\t\teditor.on( 'pastepreprocess', function( event ) {\n\t\t\tvar pastedStr = event.content,\n\t\t\t\tregExp = /^(?:https?:)?\\/\\/\\S+$/i;\n\n\t\t\tif ( ! editor.selection.isCollapsed() && ! regExp.test( editor.selection.getContent() ) ) {\n\t\t\t\tpastedStr = pastedStr.replace( /<[^>]+>/g, '' );\n\t\t\t\tpastedStr = tinymce.trim( pastedStr );\n\n\t\t\t\tif ( regExp.test( pastedStr ) ) {\n\t\t\t\t\teditor.execCommand( 'mceInsertLink', false, {\n\t\t\t\t\t\thref: editor.dom.decode( pastedStr )\n\t\t\t\t\t} );\n\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\teditor.addButton( 'wp_link_preview', {\n\t\t\ttype: 'WPLinkPreview',\n\t\t\tonPostRender: function() {\n\t\t\t\tvar self = this;\n\n\t\t\t\teditor.on( 'wptoolbar', function( event ) {\n\t\t\t\t\tvar anchor = editor.dom.getParent( event.element, 'a' ),\n\t\t\t\t\t\t$anchor,\n\t\t\t\t\t\thref;\n\n\t\t\t\t\tif ( anchor ) {\n\t\t\t\t\t\t$anchor = editor.$( anchor );\n\t\t\t\t\t\thref = $anchor.attr( 'href' );\n\n\t\t\t\t\t\tif ( href && ! $anchor.find( 'img' ).length ) {\n\t\t\t\t\t\t\tself.setURL( href );\n\t\t\t\t\t\t\tevent.element = anchor;\n\t\t\t\t\t\t\tevent.toolbar = toolbar;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\teditor.addButton( 'wp_link_edit', {\n\t\t\ttooltip: 'Edit ', // trailing space is needed, used for context\n\t\t\ticon: 'dashicon dashicons-edit',\n\t\t\tcmd: 'WP_Link'\n\t\t} );\n\n\t\teditor.addButton( 'wp_link_remove', {\n\t\t\ttooltip: 'Remove',\n\t\t\ticon: 'dashicon dashicons-no',\n\t\t\tcmd: 'unlink'\n\t\t} );\n\n\t\teditor.on( 'preinit', function() {\n\t\t\tif ( editor.wp && editor.wp._createToolbar ) {\n\t\t\t\ttoolbar = editor.wp._createToolbar( [\n\t\t\t\t\t'wp_link_preview',\n\t\t\t\t\t'wp_link_edit',\n\t\t\t\t\t'wp_link_remove'\n\t\t\t\t], true );\n\t\t\t}\n\t\t} );\n\t} );\n} )( window.tinymce );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js",
    "content": "/**\n * Text pattern plugin for TinyMCE\n *\n * @since 4.3.0\n *\n * This plugin can automatically format text patterns as you type. It includes two patterns:\n *  - Unordered list (`* ` and `- `).\n *  - Ordered list (`1. ` and `1) `).\n *\n * If the transformation in unwanted, the user can undo the change by pressing backspace,\n * using the undo shortcut, or the undo button in the toolbar.\n */\n( function( tinymce, setTimeout ) {\n\ttinymce.PluginManager.add( 'wptextpattern', function( editor ) {\n\t\tvar VK = tinymce.util.VK,\n\t\t\tspacePatterns = [\n\t\t\t\t{ regExp: /^[*-]\\s/, cmd: 'InsertUnorderedList' },\n\t\t\t\t{ regExp: /^1[.)]\\s/, cmd: 'InsertOrderedList' }\n\t\t\t],\n\t\t\tenterPatterns = [\n\t\t\t\t{ start: '##', format: 'h2' },\n\t\t\t\t{ start: '###', format: 'h3' },\n\t\t\t\t{ start: '####', format: 'h4' },\n\t\t\t\t{ start: '#####', format: 'h5' },\n\t\t\t\t{ start: '######', format: 'h6' },\n\t\t\t\t{ start: '>', format: 'blockquote' }\n\t\t\t],\n\t\t\tcanUndo, refNode, refPattern;\n\n\t\teditor.on( 'selectionchange', function() {\n\t\t\tcanUndo = null;\n\t\t} );\n\n\t\teditor.on( 'keydown', function( event ) {\n\t\t\tif ( ( canUndo && event.keyCode === 27 /* ESCAPE */ ) || ( canUndo === 'space' && event.keyCode === VK.BACKSPACE ) ) {\n\t\t\t\teditor.undoManager.undo();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\n\t\t\tif ( event.keyCode === VK.ENTER && ! VK.modifierPressed( event ) ) {\n\t\t\t\twatchEnter();\n\t\t\t}\n\t\t}, true );\n\n\t\teditor.on( 'keyup', function( event ) {\n\t\t\tif ( event.keyCode === VK.SPACEBAR && ! event.ctrlKey && ! event.metaKey && ! event.altKey ) {\n\t\t\t\tspace();\n\t\t\t} else if ( event.keyCode === VK.ENTER && ! VK.modifierPressed( event ) ) {\n\t\t\t\tenter();\n\t\t\t}\n\t\t} );\n\n\t\tfunction firstTextNode( node ) {\n\t\t\tvar parent = editor.dom.getParent( node, 'p' ),\n\t\t\t\tchild;\n\n\t\t\tif ( ! parent ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twhile ( child = parent.firstChild ) {\n\t\t\t\tif ( child.nodeType !== 3 ) {\n\t\t\t\t\tparent = child;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! child ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! child.data ) {\n\t\t\t\tif ( child.nextSibling && child.nextSibling.nodeType === 3 ) {\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t} else {\n\t\t\t\t\tchild = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn child;\n\t\t}\n\n\t\tfunction space() {\n\t\t\tvar rng = editor.selection.getRng(),\n\t\t\t\tnode = rng.startContainer,\n\t\t\t\tparent,\n\t\t\t\ttext;\n\n\t\t\tif ( ! node || firstTextNode( node ) !== node ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tparent = node.parentNode;\n\t\t\ttext = node.data;\n\n\t\t\ttinymce.each( spacePatterns, function( pattern ) {\n\t\t\t\tvar match = text.match( pattern.regExp );\n\n\t\t\t\tif ( ! match || rng.startOffset !== match[0].length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\teditor.undoManager.add();\n\n\t\t\t\teditor.undoManager.transact( function() {\n\t\t\t\t\tnode.deleteData( 0, match[0].length );\n\n\t\t\t\t\tif ( ! parent.innerHTML ) {\n\t\t\t\t\t\tparent.appendChild( document.createElement( 'br' ) );\n\t\t\t\t\t}\n\n\t\t\t\t\teditor.selection.setCursorLocation( parent );\n\t\t\t\t\teditor.execCommand( pattern.cmd );\n\t\t\t\t} );\n\n\t\t\t\t// We need to wait for native events to be triggered.\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tcanUndo = 'space';\n\t\t\t\t} );\n\n\t\t\t\treturn false;\n\t\t\t} );\n\t\t}\n\n\t\tfunction watchEnter() {\n\t\t\tvar rng = editor.selection.getRng(),\n\t\t\t\tstart = rng.startContainer,\n\t\t\t\tnode = firstTextNode( start ),\n\t\t\t\ti = enterPatterns.length,\n\t\t\t\ttext, pattern;\n\n\t\t\tif ( ! node ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttext = node.data;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\t if ( text.indexOf( enterPatterns[ i ].start ) === 0 ) {\n\t\t\t\t \tpattern = enterPatterns[ i ];\n\t\t\t\t \tbreak;\n\t\t\t\t }\n\t\t\t}\n\n\t\t\tif ( ! pattern ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( node === start && tinymce.trim( text ) === pattern.start ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trefNode = node;\n\t\t\trefPattern = pattern;\n\t\t}\n\n\t\tfunction enter() {\n\t\t\tif ( refNode ) {\n\t\t\t\teditor.undoManager.add();\n\n\t\t\t\teditor.undoManager.transact( function() {\n\t\t\t\t\teditor.formatter.apply( refPattern.format, {}, refNode );\n\t\t\t\t\trefNode.replaceData( 0, refNode.data.length, tinymce.trim( refNode.data.slice( refPattern.start.length ) ) );\n\t\t\t\t} );\n\n\t\t\t\t// We need to wait for native events to be triggered.\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\tcanUndo = 'enter';\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\trefNode = null;\n\t\t\trefPattern = null;\n\t\t}\n\t} );\n} )( window.tinymce, window.setTimeout );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/plugins/wpview/plugin.js",
    "content": "/* global tinymce */\n\n/**\n * WordPress View plugin.\n */\ntinymce.PluginManager.add( 'wpview', function( editor ) {\n\tvar $ = editor.$,\n\t\tselected,\n\t\tEnv = tinymce.Env,\n\t\tVK = tinymce.util.VK,\n\t\tTreeWalker = tinymce.dom.TreeWalker,\n\t\ttoRemove = false,\n\t\tfirstFocus = true,\n\t\t_noop = function() { return false; },\n\t\tisios = /iPad|iPod|iPhone/.test( navigator.userAgent ),\n\t\tcursorInterval,\n\t\tlastKeyDownNode,\n\t\tsetViewCursorTries,\n\t\tfocus,\n\t\texecCommandView,\n\t\texecCommandBefore,\n\t\ttoolbar;\n\n\tfunction getView( node ) {\n\t\treturn getParent( node, 'wpview-wrap' );\n\t}\n\n\t/**\n\t * Returns the node or a parent of the node that has the passed className.\n\t * Doing this directly is about 40% faster\n\t */\n\tfunction getParent( node, className ) {\n\t\twhile ( node && node.parentNode ) {\n\t\t\tif ( node.className && ( ' ' + node.className + ' ' ).indexOf( ' ' + className + ' ' ) !== -1 ) {\n\t\t\t\treturn node;\n\t\t\t}\n\n\t\t\tnode = node.parentNode;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction _stop( event ) {\n\t\tevent.stopPropagation();\n\t}\n\n\tfunction setViewCursor( before, view ) {\n\t\tvar location = before ? 'before' : 'after',\n\t\t\toffset = before ? 0 : 1;\n\t\tdeselect();\n\t\teditor.selection.setCursorLocation( editor.dom.select( '.wpview-selection-' + location, view )[0], offset );\n\t\teditor.nodeChanged();\n\t}\n\n\tfunction handleEnter( view, before, key ) {\n\t\tvar dom = editor.dom,\n\t\t\tpadNode = dom.create( 'p' );\n\n\t\tif ( ! ( Env.ie && Env.ie < 11 ) ) {\n\t\t\tpadNode.innerHTML = '<br data-mce-bogus=\"1\">';\n\t\t}\n\n\t\tif ( before ) {\n\t\t\tview.parentNode.insertBefore( padNode, view );\n\t\t} else {\n\t\t\tdom.insertAfter( padNode, view );\n\t\t}\n\n\t\tdeselect();\n\n\t\tif ( before && key === VK.ENTER ) {\n\t\t\tsetViewCursor( before, view );\n\t\t} else {\n\t\t\teditor.selection.setCursorLocation( padNode, 0 );\n\t\t}\n\n\t\teditor.nodeChanged();\n\t}\n\n\tfunction removeView( view ) {\n\t\teditor.undoManager.transact( function() {\n\t\t\thandleEnter( view );\n\t\t\twp.mce.views.remove( editor, view );\n\t\t});\n\t}\n\n\tfunction select( viewNode ) {\n\t\tvar clipboard,\n\t\t\tdom = editor.dom;\n\n\t\tif ( ! viewNode ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( viewNode !== selected ) {\n\t\t\t// Make sure that the editor is focused.\n\t\t\t// It is possible that the editor is not focused when the mouse event fires\n\t\t\t// without focus, the selection will not work properly.\n\t\t\teditor.getBody().focus();\n\n\t\t\tdeselect();\n\t\t\tselected = viewNode;\n\t\t\tdom.setAttrib( viewNode, 'data-mce-selected', 1 );\n\n\t\t\tclipboard = dom.create( 'div', {\n\t\t\t\t'class': 'wpview-clipboard',\n\t\t\t\t'contenteditable': 'true'\n\t\t\t}, wp.mce.views.getText( viewNode ) );\n\n\t\t\teditor.dom.select( '.wpview-body', viewNode )[0].appendChild( clipboard );\n\n\t\t\t// Both of the following are necessary to prevent manipulating the selection/focus\n\t\t\tdom.bind( clipboard, 'beforedeactivate focusin focusout', _stop );\n\t\t\tdom.bind( selected, 'beforedeactivate focusin focusout', _stop );\n\n\t\t\t// select the hidden div\n\t\t\tif ( isios ) {\n\t\t\t\teditor.selection.select( clipboard );\n\t\t\t} else {\n\t\t\t\teditor.selection.select( clipboard, true );\n\t\t\t}\n\t\t}\n\n\t\teditor.nodeChanged();\n\t\teditor.fire( 'wpview-selected', viewNode );\n\t}\n\n\t/**\n\t * Deselect a selected view and remove clipboard\n\t */\n\tfunction deselect() {\n\t\tvar clipboard,\n\t\t\tdom = editor.dom;\n\n\t\tif ( selected ) {\n\t\t\tclipboard = editor.dom.select( '.wpview-clipboard', selected )[0];\n\t\t\tdom.unbind( clipboard );\n\t\t\tdom.remove( clipboard );\n\n\t\t\tdom.unbind( selected, 'beforedeactivate focusin focusout click mouseup', _stop );\n\t\t\tdom.setAttrib( selected, 'data-mce-selected', null );\n\t\t}\n\n\t\tselected = null;\n\t}\n\n\t// Check if the `wp.mce` API exists.\n\tif ( typeof wp === 'undefined' || ! wp.mce ) {\n\t\treturn {\n\t\t\tgetView: _noop\n\t\t};\n\t}\n\n\tfunction resetViewsCallback( match, viewText ) {\n\t\treturn '<p>' + window.decodeURIComponent( viewText ) + '</p>';\n\t}\n\n\t// Replace the view tags with the view string\n\tfunction resetViews( content ) {\n\t\treturn content.replace( /<div[^>]+data-wpview-text=\"([^\"]+)\"[^>]*>(?:[\\s\\S]+?wpview-selection-after[^>]+>[^<>]*<\\/p>\\s*|\\.)<\\/div>/g, resetViewsCallback )\n\t\t\t.replace( /<p [^>]*?data-wpview-marker=\"([^\"]+)\"[^>]*>[\\s\\S]*?<\\/p>/g, resetViewsCallback );\n\t}\n\n\t// Prevent adding undo levels on changes inside a view wrapper\n\teditor.on( 'BeforeAddUndo', function( event ) {\n\t\tif ( event.level.content ) {\n\t\t\tevent.level.content = resetViews( event.level.content );\n\t\t}\n\t});\n\n\t// When the editor's content changes, scan the new content for\n\t// matching view patterns, and transform the matches into\n\t// view wrappers.\n\teditor.on( 'BeforeSetContent', function( event ) {\n\t\tvar node;\n\n\t\tif ( ! event.selection ) {\n\t\t\twp.mce.views.unbind();\n\t\t}\n\n\t\tif ( ! event.content ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! event.load ) {\n\t\t\tif ( selected ) {\n\t\t\t\tremoveView( selected );\n\t\t\t}\n\n\t\t\tnode = editor.selection.getNode();\n\n\t\t\tif ( node && node !== editor.getBody() && /^\\s*https?:\\/\\/\\S+\\s*$/i.test( event.content ) ) {\n\t\t\t\t// When a url is pasted or inserted, only try to embed it when it is in an empty paragrapgh.\n\t\t\t\tnode = editor.dom.getParent( node, 'p' );\n\n\t\t\t\tif ( node && /^[\\s\\uFEFF\\u00A0]*$/.test( $( node ).text() || '' ) ) {\n\t\t\t\t\t// Make sure there are no empty inline elements in the <p>\n\t\t\t\t\tnode.innerHTML = '';\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tevent.content = wp.mce.views.setMarkers( event.content );\n\t});\n\n\t// When pasting strip all tags and check if the string is an URL.\n\t// Then replace the pasted content with the cleaned URL.\n\teditor.on( 'pastePreProcess', function( event ) {\n\t\tvar pastedStr = event.content;\n\n\t\tif ( pastedStr ) {\n\t\t\tpastedStr = tinymce.trim( pastedStr.replace( /<[^>]+>/g, '' ) );\n\n\t\t\tif ( /^https?:\\/\\/\\S+$/i.test( pastedStr ) ) {\n\t\t\t\tevent.content = pastedStr;\n\t\t\t}\n\t\t}\n\t});\n\n\t// When the editor's content has been updated and the DOM has been\n\t// processed, render the views in the document.\n\teditor.on( 'SetContent', function() {\n\t\twp.mce.views.render();\n\t});\n\n\t// Set the cursor before or after a view when clicking next to it.\n\teditor.on( 'click', function( event ) {\n\t\tvar x = event.clientX,\n\t\t\ty = event.clientY,\n\t\t\tbody = editor.getBody(),\n\t\t\tbodyRect = body.getBoundingClientRect(),\n\t\t\tfirst = body.firstChild,\n\t\t\tlast = body.lastChild,\n\t\t\tfirstRect, lastRect, view;\n\n\t\tif ( ! first || ! last ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfirstRect = first.getBoundingClientRect();\n\t\tlastRect = last.getBoundingClientRect();\n\n\t\tif ( y < firstRect.top && ( view = getView( first ) ) ) {\n\t\t\tsetViewCursor( true, view );\n\t\t\tevent.preventDefault();\n\t\t} else if ( y > lastRect.bottom && ( view = getView( last ) ) ) {\n\t\t\tsetViewCursor( false, view );\n\t\t\tevent.preventDefault();\n\t\t} else if ( x < bodyRect.left || x > bodyRect.right ) {\n\t\t\ttinymce.each( editor.dom.select( '.wpview-wrap' ), function( view ) {\n\t\t\t\tvar rect = view.getBoundingClientRect();\n\n\t\t\t\tif ( y < rect.top ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( y >= rect.top && y <= rect.bottom ) {\n\t\t\t\t\tif ( x < bodyRect.left ) {\n\t\t\t\t\t\tsetViewCursor( true, view );\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t} else if ( x > bodyRect.right ) {\n\t\t\t\t\t\tsetViewCursor( false, view );\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\teditor.on( 'init', function() {\n\t\tvar scrolled = false,\n\t\t\tselection = editor.selection,\n\t\t\tMutationObserver = window.MutationObserver || window.WebKitMutationObserver;\n\n\t\t// When a view is selected, ensure content that is being pasted\n\t\t// or inserted is added to a text node (instead of the view).\n\t\teditor.on( 'BeforeSetContent', function() {\n\t\t\tvar walker, target,\n\t\t\t\tview = getView( selection.getNode() );\n\n\t\t\t// If the selection is not within a view, bail.\n\t\t\tif ( ! view ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! view.nextSibling || getView( view.nextSibling ) ) {\n\t\t\t\t// If there are no additional nodes or the next node is a\n\t\t\t\t// view, create a text node after the current view.\n\t\t\t\ttarget = editor.getDoc().createTextNode('');\n\t\t\t\teditor.dom.insertAfter( target, view );\n\t\t\t} else {\n\t\t\t\t// Otherwise, find the next text node.\n\t\t\t\twalker = new TreeWalker( view.nextSibling, view.nextSibling );\n\t\t\t\ttarget = walker.next();\n\t\t\t}\n\n\t\t\t// Select the `target` text node.\n\t\t\tselection.select( target );\n\t\t\tselection.collapse( true );\n\t\t});\n\n\t\teditor.dom.bind( editor.getDoc(), 'touchmove', function() {\n\t\t\tscrolled = true;\n\t\t});\n\n\t\teditor.on( 'mousedown mouseup click touchend', function( event ) {\n\t\t\tvar view = getView( event.target );\n\n\t\t\tfirstFocus = false;\n\n\t\t\t// Contain clicks inside the view wrapper\n\t\t\tif ( view ) {\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif ( event.type === 'touchend' && scrolled ) {\n\t\t\t\t\tscrolled = false;\n\t\t\t\t} else {\n\t\t\t\t\tselect( view );\n\t\t\t\t}\n\n\t\t\t\t// Returning false stops the ugly bars from appearing in IE11 and stops the view being selected as a range in FF.\n\t\t\t\t// Unfortunately, it also inhibits the dragging of views to a new location.\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\tif ( event.type === 'touchend' || event.type === 'mousedown' ) {\n\t\t\t\t\tdeselect();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( event.type === 'touchend' && scrolled ) {\n\t\t\t\tscrolled = false;\n\t\t\t}\n\t\t}, true );\n\n\t\tif ( MutationObserver ) {\n\t\t\tnew MutationObserver( function() {\n\t\t\t\teditor.fire( 'wp-body-class-change' );\n\t\t\t} )\n\t\t\t.observe( editor.getBody(), {\n\t\t\t\tattributes: true,\n\t\t\t\tattributeFilter: ['class']\n\t\t\t} );\n\t\t}\n\n\t\tif ( tinymce.Env.ie ) {\n\t\t\t// Prevent resize handles in newer IE\n\t\t\teditor.dom.bind( editor.getBody(), 'controlselect mscontrolselect', function( event ) {\n\t\t\t\tif ( getView( event.target ) ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\n\t// Empty the wpview wrap and marker nodes\n\tfunction emptyViewNodes( rootNode ) {\n\t\t$( 'div[data-wpview-text], p[data-wpview-marker]', rootNode ).each( function( i, node ) {\n\t\t\tnode.innerHTML = '.';\n\t\t});\n\t}\n\n\t// Run that before the DOM cleanup\n\teditor.on( 'PreProcess', function( event ) {\n\t\temptyViewNodes( event.node );\n\t}, true );\n\n\teditor.on( 'hide', function() {\n\t\twp.mce.views.unbind();\n\t\tdeselect();\n\t\temptyViewNodes();\n\t});\n\n\teditor.on( 'PostProcess', function( event ) {\n\t\tif ( event.content ) {\n\t\t\tevent.content = event.content.replace( /<div [^>]*?data-wpview-text=\"([^\"]+)\"[^>]*>[\\s\\S]*?<\\/div>/g, resetViewsCallback )\n\t\t\t\t.replace( /<p [^>]*?data-wpview-marker=\"([^\"]+)\"[^>]*>[\\s\\S]*?<\\/p>/g, resetViewsCallback );\n\t\t}\n\t});\n\n\t// Excludes arrow keys, delete, backspace, enter, space bar.\n\t// Ref: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.keyCode\n\tfunction isSpecialKey( key ) {\n\t\treturn ( ( key <= 47 && key !== VK.SPACEBAR && key !== VK.ENTER && key !== VK.DELETE && key !== VK.BACKSPACE && ( key < 37 || key > 40 ) ) ||\n\t\t\tkey >= 224 || // OEM or non-printable\n\t\t\t( key >= 144 && key <= 150 ) || // Num Lock, Scroll Lock, OEM\n\t\t\t( key >= 91 && key <= 93 ) || // Windows keys\n\t\t\t( key >= 112 && key <= 135 ) ); // F keys\n\t}\n\n\t// (De)select views when arrow keys are used to navigate the content of the editor.\n\teditor.on( 'keydown', function( event ) {\n\t\tvar key = event.keyCode,\n\t\t\tdom = editor.dom,\n\t\t\tselection = editor.selection,\n\t\t\tnode, view, cursorBefore, cursorAfter,\n\t\t\trange, clonedRange, tempRange;\n\n\t\tif ( selected ) {\n\t\t\t// Ignore key presses that involve the command or control key, but continue when in combination with backspace or v.\n\t\t\t// Also ignore the F# keys.\n\t\t\tif ( ( ( event.metaKey || event.ctrlKey ) && key !== VK.BACKSPACE && key !== 86 ) || ( key >= 112 && key <= 123 ) ) {\n\t\t\t\t// Remove the view when pressing cmd/ctrl+x on keyup, otherwise the browser can't copy the content.\n\t\t\t\tif ( ( event.metaKey || event.ctrlKey ) && key === 88 ) {\n\t\t\t\t\ttoRemove = selected;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tview = getView( selection.getNode() );\n\n\t\t\t// If the caret is not within the selected view, deselect the view and bail.\n\t\t\tif ( view !== selected ) {\n\t\t\t\tdeselect();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( key === VK.LEFT ) {\n\t\t\t\tsetViewCursor( true, view );\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( key === VK.UP ) {\n\t\t\t\tif ( view.previousSibling ) {\n\t\t\t\t\tif ( getView( view.previousSibling ) ) {\n\t\t\t\t\t\tsetViewCursor( true, view.previousSibling );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdeselect();\n\t\t\t\t\t\tselection.select( view.previousSibling, true );\n\t\t\t\t\t\tselection.collapse();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetViewCursor( true, view );\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( key === VK.RIGHT ) {\n\t\t\t\tsetViewCursor( false, view );\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( key === VK.DOWN ) {\n\t\t\t\tif ( view.nextSibling ) {\n\t\t\t\t\tif ( getView( view.nextSibling ) ) {\n\t\t\t\t\t\tsetViewCursor( false, view.nextSibling );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdeselect();\n\t\t\t\t\t\tselection.setCursorLocation( view.nextSibling, 0 );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetViewCursor( false, view );\n\t\t\t\t}\n\n\t\t\t\tevent.preventDefault();\n\t\t\t// Ignore keys that don't insert anything.\n\t\t\t} else if ( ! isSpecialKey( key ) ) {\n\t\t\t\tremoveView( selected );\n\n\t\t\t\tif ( key === VK.ENTER || key === VK.DELETE || key === VK.BACKSPACE ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ( event.metaKey || event.ctrlKey || ( key >= 112 && key <= 123 ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnode = selection.getNode();\n\t\t\tlastKeyDownNode = node;\n\t\t\tview = getView( node );\n\n\t\t\t// Make sure we don't delete part of a view.\n\t\t\t// If the range ends or starts with the view, we'll need to trim it.\n\t\t\tif ( ! selection.isCollapsed() ) {\n\t\t\t\trange = selection.getRng();\n\n\t\t\t\tif ( view = getView( range.endContainer ) ) {\n\t\t\t\t\tclonedRange = range.cloneRange();\n\t\t\t\t\tselection.select( view.previousSibling, true );\n\t\t\t\t\tselection.collapse();\n\t\t\t\t\ttempRange = selection.getRng();\n\t\t\t\t\tclonedRange.setEnd( tempRange.endContainer, tempRange.endOffset );\n\t\t\t\t\tselection.setRng( clonedRange );\n\t\t\t\t} else if ( view = getView( range.startContainer ) ) {\n\t\t\t\t\tclonedRange = range.cloneRange();\n\t\t\t\t\tclonedRange.setStart( view.nextSibling, 0 );\n\t\t\t\t\tselection.setRng( clonedRange );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! view ) {\n\t\t\t\t// Make sure we don't eat any content.\n\t\t\t\tif ( event.keyCode === VK.BACKSPACE ) {\n\t\t\t\t\tif ( editor.dom.isEmpty( node ) ) {\n\t\t\t\t\t\tif ( view = getView( node.previousSibling ) ) {\n\t\t\t\t\t\t\tsetViewCursor( false, view );\n\t\t\t\t\t\t\teditor.dom.remove( node );\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( ( range = selection.getRng() ) &&\n\t\t\t\t\t\t\trange.startOffset === 0 &&\n\t\t\t\t\t\t\trange.endOffset === 0 &&\n\t\t\t\t\t\t\t( view = getView( node.previousSibling ) ) ) {\n\t\t\t\t\t\tsetViewCursor( false, view );\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! ( ( cursorBefore = dom.hasClass( view, 'wpview-selection-before' ) ) ||\n\t\t\t\t\t( cursorAfter = dom.hasClass( view, 'wpview-selection-after' ) ) ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isSpecialKey( key ) ) {\n\t\t\t\t// ignore\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ( cursorAfter && key === VK.UP ) || ( cursorBefore && key === VK.BACKSPACE ) ) {\n\t\t\t\tif ( view.previousSibling ) {\n\t\t\t\t\tif ( getView( view.previousSibling ) ) {\n\t\t\t\t\t\tsetViewCursor( false, view.previousSibling );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( dom.isEmpty( view.previousSibling ) && key === VK.BACKSPACE ) {\n\t\t\t\t\t\t\tdom.remove( view.previousSibling );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselection.select( view.previousSibling, true );\n\t\t\t\t\t\t\tselection.collapse();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetViewCursor( true, view );\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( cursorAfter && ( key === VK.DOWN || key === VK.RIGHT ) ) {\n\t\t\t\tif ( view.nextSibling ) {\n\t\t\t\t\tif ( getView( view.nextSibling ) ) {\n\t\t\t\t\t\tsetViewCursor( key === VK.RIGHT, view.nextSibling );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselection.setCursorLocation( view.nextSibling, 0 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( cursorBefore && ( key === VK.UP || key ===  VK.LEFT ) ) {\n\t\t\t\tif ( view.previousSibling ) {\n\t\t\t\t\tif ( getView( view.previousSibling ) ) {\n\t\t\t\t\t\tsetViewCursor( key === VK.UP, view.previousSibling );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselection.select( view.previousSibling, true );\n\t\t\t\t\t\tselection.collapse();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( cursorBefore && key === VK.DOWN ) {\n\t\t\t\tif ( view.nextSibling ) {\n\t\t\t\t\tif ( getView( view.nextSibling ) ) {\n\t\t\t\t\t\tsetViewCursor( true, view.nextSibling );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselection.setCursorLocation( view.nextSibling, 0 );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetViewCursor( false, view );\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( ( cursorAfter && key === VK.LEFT ) || ( cursorBefore && key === VK.RIGHT ) ) {\n\t\t\t\tselect( view );\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( cursorAfter && key === VK.BACKSPACE ) {\n\t\t\t\tremoveView( view );\n\t\t\t\tevent.preventDefault();\n\t\t\t} else if ( cursorAfter ) {\n\t\t\t\thandleEnter( view );\n\t\t\t} else if ( cursorBefore ) {\n\t\t\t\thandleEnter( view , true, key );\n\t\t\t}\n\n\t\t\tif ( key === VK.ENTER ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t});\n\n\teditor.on( 'keyup', function() {\n\t\tif ( toRemove ) {\n\t\t\tremoveView( toRemove );\n\t\t\ttoRemove = false;\n\t\t}\n\t});\n\n\teditor.on( 'focus', function() {\n\t\tvar view;\n\n\t\tfocus = true;\n\t\teditor.dom.addClass( editor.getBody(), 'has-focus' );\n\n\t\t// Edge case: show the fake caret when the editor is focused for the first time\n\t\t// and the first element is a view.\n\t\tif ( firstFocus && ( view = getView( editor.getBody().firstChild ) ) ) {\n\t\t\tsetViewCursor( true, view );\n\t\t}\n\n\t\tfirstFocus = false;\n\t} );\n\n\teditor.on( 'blur', function() {\n\t\tfocus = false;\n\t\teditor.dom.removeClass( editor.getBody(), 'has-focus' );\n\t} );\n\n\teditor.on( 'NodeChange', function( event ) {\n\t\tvar dom = editor.dom,\n\t\t\tviews = editor.dom.select( '.wpview-wrap' ),\n\t\t\tclassName = event.element.className,\n\t\t\tview = getView( event.element ),\n\t\t\tlKDN = lastKeyDownNode;\n\n\t\tlastKeyDownNode = false;\n\n\t\tclearInterval( cursorInterval );\n\n\t\t// This runs a lot and is faster than replacing each class separately\n\t\ttinymce.each( views, function ( view ) {\n\t\t\tif ( view.className ) {\n\t\t\t\tview.className = view.className.replace( / ?\\bwpview-(?:selection-before|selection-after|cursor-hide)\\b/g, '' );\n\t\t\t}\n\t\t});\n\n\t\tif ( focus && view ) {\n\t\t\tif ( ( className === 'wpview-selection-before' || className === 'wpview-selection-after' ) &&\n\t\t\t\teditor.selection.isCollapsed() ) {\n\n\t\t\t\tsetViewCursorTries = 0;\n\n\t\t\t\tdeselect();\n\n\t\t\t\t// Make sure the cursor arrived in the right node.\n\t\t\t\t// This is necessary for Firefox.\n\t\t\t\tif ( lKDN === view.previousSibling ) {\n\t\t\t\t\tsetViewCursor( true, view );\n\t\t\t\t\treturn;\n\t\t\t\t} else if ( lKDN === view.nextSibling ) {\n\t\t\t\t\tsetViewCursor( false, view );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tdom.addClass( view, className );\n\n\t\t\t\tcursorInterval = setInterval( function() {\n\t\t\t\t\tif ( dom.hasClass( view, 'wpview-cursor-hide' ) ) {\n\t\t\t\t\t\tdom.removeClass( view, 'wpview-cursor-hide' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdom.addClass( view, 'wpview-cursor-hide' );\n\t\t\t\t\t}\n\t\t\t\t}, 500 );\n\t\t\t// If the cursor lands anywhere else in the view, set the cursor before it.\n\t\t\t// Only try this once to prevent a loop. (You never know.)\n\t\t\t} else if ( ! getParent( event.element, 'wpview-clipboard' ) && ! setViewCursorTries ) {\n\t\t\t\tdeselect();\n\t\t\t\tsetViewCursorTries++;\n\t\t\t\tsetViewCursor( true, view );\n\t\t\t}\n\t\t}\n\t});\n\n\teditor.on( 'BeforeExecCommand', function() {\n\t\tvar node = editor.selection.getNode(),\n\t\t\tview;\n\n\t\tif ( node && ( ( execCommandBefore = node.className === 'wpview-selection-before' ) || node.className === 'wpview-selection-after' ) && ( view = getView( node ) ) ) {\n\t\t\thandleEnter( view, execCommandBefore );\n\t\t\texecCommandView = view;\n\t\t}\n\t});\n\n\teditor.on( 'ExecCommand', function() {\n\t\tvar toSelect, node;\n\n\t\tif ( selected ) {\n\t\t\ttoSelect = selected;\n\t\t\tdeselect();\n\t\t\tselect( toSelect );\n\t\t}\n\n\t\tif ( execCommandView ) {\n\t\t\tnode = execCommandView[ execCommandBefore ? 'previousSibling' : 'nextSibling' ];\n\n\t\t\tif ( node && node.nodeName === 'P' && editor.dom.isEmpty( node ) ) {\n\t\t\t\teditor.dom.remove( node );\n\t\t\t\tsetViewCursor( execCommandBefore, execCommandView );\n\t\t\t}\n\n\t\t\texecCommandView = false;\n\t\t}\n\t});\n\n\teditor.on( 'ResolveName', function( event ) {\n\t\tif ( editor.dom.hasClass( event.target, 'wpview-wrap' ) ) {\n\t\t\tevent.name = editor.dom.getAttrib( event.target, 'data-wpview-type' ) || 'wpview';\n\t\t\tevent.stopPropagation();\n\t\t} else if ( getView( event.target ) ) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t});\n\n\teditor.addButton( 'wp_view_edit', {\n\t\ttooltip: 'Edit ', // trailing space is needed, used for context\n\t\ticon: 'dashicon dashicons-edit',\n\t\tonclick: function() {\n\t\t\tselected && wp.mce.views.edit( editor, selected );\n\t\t}\n\t} );\n\n\teditor.addButton( 'wp_view_remove', {\n\t\ttooltip: 'Remove',\n\t\ticon: 'dashicon dashicons-no',\n\t\tonclick: function() {\n\t\t\tselected && removeView( selected );\n\t\t}\n\t} );\n\n\teditor.once( 'preinit', function() {\n\t\tif ( editor.wp && editor.wp._createToolbar ) {\n\t\t\ttoolbar = editor.wp._createToolbar( [\n\t\t\t\t'wp_view_edit',\n\t\t\t\t'wp_view_remove'\n\t\t\t] );\n\t\t}\n\t} );\n\n\teditor.on( 'wptoolbar', function( event ) {\n\t\tif ( selected ) {\n\t\t\tevent.element = selected;\n\t\t\tevent.toolbar = toolbar;\n\t\t}\n\t} );\n\n\t// Add to editor.wp\n\teditor.wp = editor.wp || {};\n\teditor.wp.getView = getView;\n\teditor.wp.setViewCursor = setViewCursor;\n\n\t// Keep for back-compat.\n\treturn {\n\t\tgetView: getView\n\t};\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/skins/lightgray/fonts/readme.md",
    "content": "Icons are generated and provided by the http://icomoon.io service.\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/skins/wordpress/wp-content.css",
    "content": "/* Additional default styles for the editor */\n\nhtml {\n\tcursor: text;\n}\n\nhtml.ios {\n\theight: 100%;\n}\n\n.ios body#tinymce {\n\theight: 200%;\n\tmax-width: none;\n}\n\nbody {\n\tfont-family: Georgia, \"Times New Roman\", \"Bitstream Charter\", Times, serif;\n\tfont-size: 16px;\n\tline-height: 1.5;\n\tcolor: #333;\n\tmargin: 9px 10px;\n\tmax-width: 100%;\n\t-webkit-font-smoothing: antialiased !important;\n\toverflow-wrap: break-word;\n\tword-wrap: break-word; /* Old syntax */\n}\n\nbody.rtl {\n\tfont-family: Tahoma, \"Times New Roman\", \"Bitstream Charter\", Times, serif;\n}\n\nbody.locale-he-il {\n\tfont-family: Arial, \"Times New Roman\", \"Bitstream Charter\", Times, serif;\n}\n\nbody.wp-autoresize {\n\toverflow: visible !important;\n\t/* The padding ensures margins of the children are contained in the body. */\n\tpadding-top: 1px !important;\n\tpadding-bottom: 1px !important;\n\tpadding-left: 0 !important;\n\tpadding-right: 0 !important;\n}\n\n/* When font-weight is different than the default browser style,\nChrome and Safari replace <strong> and <b> with spans with inline styles on pasting?! */\nbody.webkit strong,\nbody.webkit b {\n\tfont-weight: bold !important;\n}\n\npre {\n\tfont-family: Consolas, Monaco, monospace;\n}\n\ntd,\nth {\n\tfont-family: inherit;\n\tfont-size: inherit;\n}\n\n/* For emoji replacement images */\nimg.emoji {\n\tdisplay: inline !important;\n\tborder: none !important;\n\theight: 1em !important;\n\twidth: 1em !important;\n\tmargin: 0 .07em !important;\n\tvertical-align: -0.1em !important;\n\tbackground: none !important;\n\tpadding: 0 !important;\n\t-webkit-box-shadow: none !important;\n\tbox-shadow: none !important;\n}\n\n.mceIEcenter {\n\ttext-align: center;\n}\n\nimg {\n\theight: auto;\n\tmax-width: 100%;\n}\n\n.wp-caption {\n\tmargin: 0; /* browser reset */\n\tmax-width: 100%;\n}\n\n/* iOS does not obey max-width if width is set. */\n.ios .wp-caption {\n\twidth: auto !important;\n}\n\n.wp-caption img {\n\tdisplay: block;\n}\n\ndiv.mceTemp {\n\t-ms-user-select: element;\n}\n\ndl.wp-caption,\ndl.wp-caption * {\n\t-webkit-user-drag: none;\n}\n\n.wp-caption-dd {\n\tfont-size: 14px;\n\tpadding-top: 0.5em;\n\tmargin: 0; /* browser reset */\n}\n\n.aligncenter {\n\tdisplay: block;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\n.alignleft {\n\tfloat: left;\n\tmargin: 0.5em 1em 0.5em 0;\n}\n\n.alignright {\n\tfloat: right;\n\tmargin: 0.5em 0 0.5em 1em;\n}\n\n/* Remove blue highlighting of selected images in WebKit */\nimg[data-mce-selected]::selection {\n\tbackground-color: transparent;\n}\n\n/* Styles for the WordPress plugins */\n.mce-content-body img[data-mce-placeholder] {\n\tborder-radius: 0;\n\tpadding: 0;\n}\n\n.mce-content-body img[data-wp-more] {\n\tborder: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\twidth: 96%;\n\theight: 16px;\n\tdisplay: block;\n\tmargin: 15px auto 0;\n\toutline: 0;\n\tcursor: default;\n}\n\n.mce-content-body img[data-mce-placeholder][data-mce-selected] {\n\toutline: 1px dotted #888;\n}\n\n.mce-content-body img[data-wp-more=\"more\"] {\n\tbackground: transparent url( images/more.png ) repeat-y scroll center center;\n}\n\n.mce-content-body img[data-wp-more=\"nextpage\"] {\n    background: transparent url( images/pagebreak.png ) repeat-y scroll center center;\n}\n\n/* Gallery, audio, video placeholders */\n.mce-content-body img.wp-media {\n\tborder: 1px solid #aaa;\n\tbackground-color: #f2f2f2;\n\tbackground-repeat: no-repeat;\n\tbackground-position: center center;\n\twidth: 99%;\n\theight: 250px;\n\toutline: 0;\n\tcursor: pointer;\n}\n\n.mce-content-body img.wp-media:hover {\n\tbackground-color: #ededed;\n\tborder-color: #777;\n}\n\n.mce-content-body img.wp-media.wp-media-selected {\n\tbackground-color: #d8d8d8;\n\tborder-color: #777;\n}\n\n.mce-content-body img.wp-media.wp-gallery {\n\tbackground-image: url(images/gallery.png);\n}\n\n/* Image resize handles */\n.mce-content-body div.mce-resizehandle {\n\tborder-color: #777;\n\twidth: 7px;\n\theight: 7px;\n}\n\n.mce-content-body img[data-mce-selected] {\n\toutline: 1px solid #777;\n}\n\n.mce-content-body img[data-mce-resize=\"false\"] {\n\toutline: 0;\n}\n\naudio,\nvideo,\nembed {\n\tdisplay: -moz-inline-stack;\n\tdisplay: inline-block;\n}\n\naudio {\n\tvisibility: hidden;\n}\n\n/**\n * WP Views\n */\n\n.wpview-wrap {\n\twidth: 99.99%; /* All IE need hasLayout, incl. 11 (ugh, not again!!) */\n\tposition: relative;\n\tclear: both;\n}\n\n/* delegate the handling of the selection to the wpview tinymce plugin */\n.wpview-wrap,\n.wpview-wrap * {\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n/* hide the shortcode content, but allow the content to still be selected */\n.wpview-wrap .wpview-clipboard,\n.wpview-wrap > p {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tz-index: -1;\n\tclip: rect(1px 1px 1px 1px); /* IE7 */\n\tclip: rect(1px, 1px, 1px, 1px);\n\toverflow: hidden;\n\toutline: 0;\n\tpadding: 0;\n\tborder: 0;\n\twidth: 1px;\n\theight: 1px;\n}\n\n/* An ugly box will appear when this is focussed in IE, so we'll move it outside the window. */\n.wpview-wrap.wpview-selection-before > p,\n.wpview-wrap.wpview-selection-after > p {\n\tleft: -10000px;\n}\n\n.wpview-wrap .wpview-clipboard,\n.wpview-wrap .wpview-clipboard *,\n.wpview-wrap > p {\n\t-moz-user-select: text;\n\t-webkit-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n}\n\n.has-focus .wpview-wrap.wpview-selection-before:before,\n.has-focus .wpview-wrap.wpview-selection-after:before {\n\tcontent: '';\n\tmargin: 0;\n\tpadding: 0;\n\tposition: absolute;\n\ttop: -2px;\n\tleft: -3px;\n\tbottom: -2px;\n\twidth: 1px;\n\tbackground-color: black;\n\tbackground-color: currentcolor;\n\topacity: 1;\n}\n\n.has-focus .wpview-wrap.wpview-selection-after:before {\n\tleft: auto;\n\tright: -3px;\n}\n\n.has-focus .wpview-wrap.wpview-cursor-hide:before {\n\topacity: 0;\n}\n\n/**\n * Media previews\n */\n.wpview-wrap {\n    position: relative;\n    margin-bottom: 16px;\n\tborder: 1px solid transparent;\n}\n\n.wpview-wrap[data-mce-selected] {\n\tbackground-color: rgba(0,0,0,0.1);\n\tborder-color: rgba(0,0,0,0.3);\n}\n\n.ie8 .wpview-wrap[data-mce-selected],\n.ie7 .wpview-wrap[data-mce-selected] {\n\tbackground-color: #e5e5e5;\n\tborder-color: #777;\n}\n\n.wpview-overlay {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.wpview-wrap[data-mce-selected] .wpview-overlay {\n\tdisplay: none;\n}\n\n.wpview-wrap .loading-placeholder {\n\tborder: 1px dashed #ccc;\n\tpadding: 10px;\n}\n\n.wpview-wrap[data-mce-selected] .loading-placeholder {\n\tborder-color: transparent;\n}\n\n/* A little \"loading\" animation, not showing in IE < 10 */\n.wpview-wrap .wpview-loading {\n\twidth: 60px;\n\theight: 5px;\n\toverflow: hidden;\n\tbackground-color: transparent;\n\tmargin: 10px auto 0;\n}\n\n.wpview-wrap .wpview-loading ins {\n\tbackground-color: #333;\n\tmargin: 0 0 0 -60px;\n\twidth: 60px;\n\theight: 5px;\n\tdisplay: block;\n\t-webkit-animation: wpview-loading 1.3s infinite 1s linear;\n\tanimation: wpview-loading 1.3s infinite 1s linear;\n}\n\n@-webkit-keyframes wpview-loading {\n\t0% {\n\t\tmargin-left: -60px;\n\t}\n\t100% {\n\t\tmargin-left: 60px;\n\t}\n}\n\n@keyframes wpview-loading {\n\t0% {\n\t\tmargin-left: -60px;\n\t}\n\t100% {\n\t\tmargin-left: 60px;\n\t}\n}\n\n.wpview-wrap .wpview-content > iframe {\n\tmax-width: 100%;\n\tbackground: transparent;\n}\n\n.wpview-error {\n\tborder: 1px solid #dedede;\n\tpadding: 1em 0;\n\tmargin: 0;\n\tword-wrap: break-word;\n}\n\n.wpview-wrap[data-mce-selected] .wpview-error {\n\tborder-color: transparent;\n}\n\n.wpview-error .dashicons,\n.loading-placeholder .dashicons {\n\tdisplay: block;\n\tmargin: 0 auto;\n\twidth: 32px;\n\theight: 32px;\n\tfont-size: 32px;\n}\n\n.wpview-error p {\n\tmargin: 0;\n\ttext-align: center;\n\tfont-family: 'Open Sans', sans-serif;\n}\n\n.wpview-type-gallery:after {\n    content: '';\n\tdisplay: table;\n    clear: both;\n}\n\n.gallery img[data-mce-selected]:focus {\n\toutline: none;\n}\n\n.gallery a {\n\tcursor: default;\n}\n\n.gallery {\n\tmargin: auto -6px;\n\tpadding: 6px 0;\n\tline-height: 1;\n\toverflow-x: hidden;\n}\n\n.ie7 .gallery,\n.ie8 .gallery {\n\tmargin: auto;\n}\n\n.gallery .gallery-item {\n\tfloat: left;\n\tmargin: 0;\n\ttext-align: center;\n\tpadding: 6px;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.ie7 .gallery .gallery-item,\n.ie8 .gallery .gallery-item {\n\tpadding: 6px 0;\n}\n\n.gallery .gallery-caption,\n.gallery .gallery-icon {\n\tmargin: 0;\n}\n\n.gallery .gallery-caption {\n\tfont-size: 13px;\n\tmargin: 4px 0;\n}\n\n.gallery-columns-1 .gallery-item {\n\twidth: 100%;\n}\n\n.gallery-columns-2 .gallery-item {\n\twidth: 50%;\n}\n\n.gallery-columns-3 .gallery-item {\n\twidth: 33.333%;\n}\n\n.ie8 .gallery-columns-3 .gallery-item,\n.ie7 .gallery-columns-3 .gallery-item {\n\twidth: 33%;\n}\n\n.gallery-columns-4 .gallery-item {\n\twidth: 25%;\n}\n\n.gallery-columns-5 .gallery-item {\n\twidth: 20%;\n}\n\n.gallery-columns-6 .gallery-item {\n\twidth: 16.665%;\n}\n\n.gallery-columns-7 .gallery-item {\n\twidth: 14.285%;\n}\n\n.gallery-columns-8 .gallery-item {\n\twidth: 12.5%;\n}\n\n.gallery-columns-9 .gallery-item {\n\twidth: 11.111%;\n}\n\n.gallery img {\n\tmax-width: 100%;\n\theight: auto;\n\tborder: none;\n\tpadding: 0;\n}\n\nimg.wp-oembed {\n\tborder: 1px dashed #888;\n\tbackground: #f7f5f2 url(images/embedded.png) no-repeat scroll center center;\n\twidth: 300px;\n\theight: 250px;\n\toutline: 0;\n}\n\n/* rtl */\n.rtl .gallery .gallery-item {\n\tfloat: right;\n}\n\n@media print,\n\t(-o-min-device-pixel-ratio: 5/4),\n\t(-webkit-min-device-pixel-ratio: 1.25),\n\t(min-resolution: 120dpi) {\n\n\t.mce-content-body img.mce-wp-more {\n\t\tbackground-image: url( images/more-2x.png );\n\t\tbackground-size: 1900px 20px;\n\t}\n\n\t.mce-content-body img.mce-wp-nextpage {\n    \tbackground-image: url( images/pagebreak-2x.png );\n\t\tbackground-size: 1900px 20px;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/themes/modern/theme.js",
    "content": "/**\n * theme.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*global tinymce:true */\n\ntinymce.ThemeManager.add('modern', function(editor) {\n\tvar self = this, settings = editor.settings, Factory = tinymce.ui.Factory,\n\t\teach = tinymce.each, DOM = tinymce.DOM, Rect = tinymce.ui.Rect, FloatPanel = tinymce.ui.FloatPanel;\n\n\t// Default menus\n\tvar defaultMenus = {\n\t\tfile: {title: 'File', items: 'newdocument'},\n\t\tedit: {title: 'Edit', items: 'undo redo | cut copy paste pastetext | selectall'},\n\t\tinsert: {title: 'Insert', items: '|'},\n\t\tview: {title: 'View', items: 'visualaid |'},\n\t\tformat: {title: 'Format', items: 'bold italic underline strikethrough superscript subscript | formats | removeformat'},\n\t\ttable: {title: 'Table'},\n\t\ttools: {title: 'Tools'}\n\t};\n\n\tvar defaultToolbar = \"undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | \" +\n\t\t\"bullist numlist outdent indent | link image\";\n\n\tfunction createToolbar(items, size) {\n\t\tvar toolbarItems = [], buttonGroup;\n\n\t\tif (!items) {\n\t\t\treturn;\n\t\t}\n\n\t\teach(items.split(/[ ,]/), function(item) {\n\t\t\tvar itemName;\n\n\t\t\tfunction bindSelectorChanged() {\n\t\t\t\tvar selection = editor.selection;\n\n\t\t\t\tfunction setActiveItem(name) {\n\t\t\t\t\treturn function(state, args) {\n\t\t\t\t\t\tvar nodeName, i = args.parents.length;\n\n\t\t\t\t\t\twhile (i--) {\n\t\t\t\t\t\t\tnodeName = args.parents[i].nodeName;\n\t\t\t\t\t\t\tif (nodeName == \"OL\" || nodeName == \"UL\") {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titem.active(state && nodeName == name);\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (itemName == \"bullist\") {\n\t\t\t\t\tselection.selectorChanged('ul > li', setActiveItem(\"UL\"));\n\t\t\t\t}\n\n\t\t\t\tif (itemName == \"numlist\") {\n\t\t\t\t\tselection.selectorChanged('ol > li', setActiveItem(\"OL\"));\n\t\t\t\t}\n\n\t\t\t\tif (item.settings.stateSelector) {\n\t\t\t\t\tselection.selectorChanged(item.settings.stateSelector, function(state) {\n\t\t\t\t\t\titem.active(state);\n\t\t\t\t\t}, true);\n\t\t\t\t}\n\n\t\t\t\tif (item.settings.disabledStateSelector) {\n\t\t\t\t\tselection.selectorChanged(item.settings.disabledStateSelector, function(state) {\n\t\t\t\t\t\titem.disabled(state);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (item == \"|\") {\n\t\t\t\tbuttonGroup = null;\n\t\t\t} else {\n\t\t\t\tif (Factory.has(item)) {\n\t\t\t\t\titem = {type: item, size: size};\n\t\t\t\t\ttoolbarItems.push(item);\n\t\t\t\t\tbuttonGroup = null;\n\t\t\t\t} else {\n\t\t\t\t\tif (!buttonGroup) {\n\t\t\t\t\t\tbuttonGroup = {type: 'buttongroup', items: []};\n\t\t\t\t\t\ttoolbarItems.push(buttonGroup);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (editor.buttons[item]) {\n\t\t\t\t\t\t// TODO: Move control creation to some UI class\n\t\t\t\t\t\titemName = item;\n\t\t\t\t\t\titem = editor.buttons[itemName];\n\n\t\t\t\t\t\tif (typeof item == \"function\") {\n\t\t\t\t\t\t\titem = item();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titem.type = item.type || 'button';\n\t\t\t\t\t\titem.size = size;\n\n\t\t\t\t\t\titem = Factory.create(item);\n\t\t\t\t\t\tbuttonGroup.items.push(item);\n\n\t\t\t\t\t\tif (editor.initialized) {\n\t\t\t\t\t\t\tbindSelectorChanged();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\teditor.on('init', bindSelectorChanged);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\ttype: 'toolbar',\n\t\t\tlayout: 'flow',\n\t\t\titems: toolbarItems\n\t\t};\n\t}\n\n\t/**\n\t * Creates the toolbars from config and returns a toolbar array.\n\t *\n\t * @param {String} size Optional toolbar item size.\n\t * @return {Array} Array with toolbars.\n\t */\n\tfunction createToolbars(size) {\n\t\tvar toolbars = [];\n\n\t\tfunction addToolbar(items) {\n\t\t\tif (items) {\n\t\t\t\ttoolbars.push(createToolbar(items, size));\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert toolbar array to multiple options\n\t\tif (tinymce.isArray(settings.toolbar)) {\n\t\t\t// Empty toolbar array is the same as a disabled toolbar\n\t\t\tif (settings.toolbar.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttinymce.each(settings.toolbar, function(toolbar, i) {\n\t\t\t\tsettings[\"toolbar\" + (i + 1)] = toolbar;\n\t\t\t});\n\n\t\t\tdelete settings.toolbar;\n\t\t}\n\n\t\t// Generate toolbar<n>\n\t\tfor (var i = 1; i < 10; i++) {\n\t\t\tif (!addToolbar(settings[\"toolbar\" + i])) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Generate toolbar or default toolbar unless it's disabled\n\t\tif (!toolbars.length && settings.toolbar !== false) {\n\t\t\taddToolbar(settings.toolbar || defaultToolbar);\n\t\t}\n\n\t\tif (toolbars.length) {\n\t\t\treturn {\n\t\t\t\ttype: 'panel',\n\t\t\t\tlayout: 'stack',\n\t\t\t\tclasses: \"toolbar-grp\",\n\t\t\t\tariaRoot: true,\n\t\t\t\tariaRemember: true,\n\t\t\t\titems: toolbars\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Creates the menu buttons based on config.\n\t *\n\t * @return {Array} Menu buttons array.\n\t */\n\tfunction createMenuButtons() {\n\t\tvar name, menuButtons = [];\n\n\t\tfunction createMenuItem(name) {\n\t\t\tvar menuItem;\n\n\t\t\tif (name == '|') {\n\t\t\t\treturn {text: '|'};\n\t\t\t}\n\n\t\t\tmenuItem = editor.menuItems[name];\n\n\t\t\treturn menuItem;\n\t\t}\n\n\t\tfunction createMenu(context) {\n\t\t\tvar menuButton, menu, menuItems, isUserDefined, removedMenuItems;\n\n\t\t\tremovedMenuItems = tinymce.makeMap((settings.removed_menuitems || '').split(/[ ,]/));\n\n\t\t\t// User defined menu\n\t\t\tif (settings.menu) {\n\t\t\t\tmenu = settings.menu[context];\n\t\t\t\tisUserDefined = true;\n\t\t\t} else {\n\t\t\t\tmenu = defaultMenus[context];\n\t\t\t}\n\n\t\t\tif (menu) {\n\t\t\t\tmenuButton = {text: menu.title};\n\t\t\t\tmenuItems = [];\n\n\t\t\t\t// Default/user defined items\n\t\t\t\teach((menu.items || '').split(/[ ,]/), function(item) {\n\t\t\t\t\tvar menuItem = createMenuItem(item);\n\n\t\t\t\t\tif (menuItem && !removedMenuItems[item]) {\n\t\t\t\t\t\tmenuItems.push(createMenuItem(item));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Added though context\n\t\t\t\tif (!isUserDefined) {\n\t\t\t\t\teach(editor.menuItems, function(menuItem) {\n\t\t\t\t\t\tif (menuItem.context == context) {\n\t\t\t\t\t\t\tif (menuItem.separator == 'before') {\n\t\t\t\t\t\t\t\tmenuItems.push({text: '|'});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (menuItem.prependToContext) {\n\t\t\t\t\t\t\t\tmenuItems.unshift(menuItem);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmenuItems.push(menuItem);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (menuItem.separator == 'after') {\n\t\t\t\t\t\t\t\tmenuItems.push({text: '|'});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0; i < menuItems.length; i++) {\n\t\t\t\t\tif (menuItems[i].text == '|') {\n\t\t\t\t\t\tif (i === 0 || i == menuItems.length - 1) {\n\t\t\t\t\t\t\tmenuItems.splice(i, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmenuButton.menu = menuItems;\n\n\t\t\t\tif (!menuButton.menu.length) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn menuButton;\n\t\t}\n\n\t\tvar defaultMenuBar = [];\n\t\tif (settings.menu) {\n\t\t\tfor (name in settings.menu) {\n\t\t\t\tdefaultMenuBar.push(name);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (name in defaultMenus) {\n\t\t\t\tdefaultMenuBar.push(name);\n\t\t\t}\n\t\t}\n\n\t\tvar enabledMenuNames = typeof settings.menubar == \"string\" ? settings.menubar.split(/[ ,]/) : defaultMenuBar;\n\t\tfor (var i = 0; i < enabledMenuNames.length; i++) {\n\t\t\tvar menu = enabledMenuNames[i];\n\t\t\tmenu = createMenu(menu);\n\n\t\t\tif (menu) {\n\t\t\t\tmenuButtons.push(menu);\n\t\t\t}\n\t\t}\n\n\t\treturn menuButtons;\n\t}\n\n\t/**\n\t * Adds accessibility shortcut keys to panel.\n\t *\n\t * @param {tinymce.ui.Panel} panel Panel to add focus to.\n\t */\n\tfunction addAccessibilityKeys(panel) {\n\t\tfunction focus(type) {\n\t\t\tvar item = panel.find(type)[0];\n\n\t\t\tif (item) {\n\t\t\t\titem.focus(true);\n\t\t\t}\n\t\t}\n\n\t\teditor.shortcuts.add('Alt+F9', '', function() {\n\t\t\tfocus('menubar');\n\t\t});\n\n\t\teditor.shortcuts.add('Alt+F10', '', function() {\n\t\t\tfocus('toolbar');\n\t\t});\n\n\t\teditor.shortcuts.add('Alt+F11', '', function() {\n\t\t\tfocus('elementpath');\n\t\t});\n\n\t\tpanel.on('cancel', function() {\n\t\t\teditor.focus();\n\t\t});\n\t}\n\n\t/**\n\t * Resizes the editor to the specified width, height.\n\t */\n\tfunction resizeTo(width, height) {\n\t\tvar containerElm, iframeElm, containerSize, iframeSize;\n\n\t\tfunction getSize(elm) {\n\t\t\treturn {\n\t\t\t\twidth: elm.clientWidth,\n\t\t\t\theight: elm.clientHeight\n\t\t\t};\n\t\t}\n\n\t\tcontainerElm = editor.getContainer();\n\t\tiframeElm = editor.getContentAreaContainer().firstChild;\n\t\tcontainerSize = getSize(containerElm);\n\t\tiframeSize = getSize(iframeElm);\n\n\t\tif (width !== null) {\n\t\t\twidth = Math.max(settings.min_width || 100, width);\n\t\t\twidth = Math.min(settings.max_width || 0xFFFF, width);\n\n\t\t\tDOM.setStyle(containerElm, 'width', width + (containerSize.width - iframeSize.width));\n\t\t\tDOM.setStyle(iframeElm, 'width', width);\n\t\t}\n\n\t\theight = Math.max(settings.min_height || 100, height);\n\t\theight = Math.min(settings.max_height || 0xFFFF, height);\n\t\tDOM.setStyle(iframeElm, 'height', height);\n\n\t\teditor.fire('ResizeEditor');\n\t}\n\n\tfunction resizeBy(dw, dh) {\n\t\tvar elm = editor.getContentAreaContainer();\n\t\tself.resizeTo(elm.clientWidth + dw, elm.clientHeight + dh);\n\t}\n\n\t/**\n\t * Handles contextual toolbars.\n\t */\n\tfunction addContextualToolbars() {\n\t\tvar scrollContainer;\n\n\t\tfunction getContextToolbars() {\n\t\t\treturn editor.contextToolbars || [];\n\t\t}\n\n\t\tfunction getElementRect(elm) {\n\t\t\tvar pos, targetRect, root;\n\n\t\t\tpos = tinymce.DOM.getPos(editor.getContentAreaContainer());\n\t\t\ttargetRect = editor.dom.getRect(elm);\n\t\t\troot = editor.dom.getRoot();\n\n\t\t\t// Adjust targetPos for scrolling in the editor\n\t\t\tif (root.nodeName == 'BODY') {\n\t\t\t\ttargetRect.x -= root.ownerDocument.documentElement.scrollLeft || root.scrollLeft;\n\t\t\t\ttargetRect.y -= root.ownerDocument.documentElement.scrollTop || root.scrollTop;\n\t\t\t}\n\n\t\t\ttargetRect.x += pos.x;\n\t\t\ttargetRect.y += pos.y;\n\n\t\t\treturn targetRect;\n\t\t}\n\n\t\tfunction hideAllFloatingPanels() {\n\t\t\teach(editor.contextToolbars, function(toolbar) {\n\t\t\t\tif (toolbar.panel) {\n\t\t\t\t\ttoolbar.panel.hide();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction reposition(match) {\n\t\t\tvar relPos, panelRect, elementRect, contentAreaRect, panel, relRect, testPositions;\n\n\t\t\tif (editor.removed) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!match || !match.toolbar.panel) {\n\t\t\t\thideAllFloatingPanels();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttestPositions = [\n\t\t\t\t'tc-bc', 'bc-tc',\n\t\t\t\t'tl-bl', 'bl-tl',\n\t\t\t\t'tr-br', 'br-tr'\n\t\t\t];\n\n\t\t\tpanel = match.toolbar.panel;\n\t\t\tpanel.show();\n\n\t\t\telementRect = getElementRect(match.element);\n\t\t\tpanelRect = tinymce.DOM.getRect(panel.getEl());\n\t\t\tcontentAreaRect = tinymce.DOM.getRect(editor.getContentAreaContainer() || editor.getBody());\n\n\t\t\tif (!editor.inline) {\n\t\t\t\tcontentAreaRect.w = editor.getDoc().documentElement.offsetWidth;\n\t\t\t}\n\n\t\t\t// Inflate the elementRect so it doesn't get placed above resize handles\n\t\t\tif (editor.selection.controlSelection.isResizable(match.element)) {\n\t\t\t\telementRect = Rect.inflate(elementRect, 0, 7);\n\t\t\t}\n\n\t\t\trelPos = Rect.findBestRelativePosition(panelRect, elementRect, contentAreaRect, testPositions);\n\n\t\t\tif (relPos) {\n\t\t\t\teach(testPositions.concat('inside'), function(pos) {\n\t\t\t\t\tpanel.classes.toggle('tinymce-inline-' + pos, pos == relPos);\n\t\t\t\t});\n\n\t\t\t\trelRect = Rect.relativePosition(panelRect, elementRect, relPos);\n\t\t\t\tpanel.moveTo(relRect.x, relRect.y);\n\t\t\t} else {\n\t\t\t\teach(testPositions, function(pos) {\n\t\t\t\t\tpanel.classes.toggle('tinymce-inline-' + pos, false);\n\t\t\t\t});\n\n\t\t\t\tpanel.classes.toggle('tinymce-inline-inside', true);\n\n\t\t\t\telementRect = Rect.intersect(contentAreaRect, elementRect);\n\n\t\t\t\tif (elementRect) {\n\t\t\t\t\trelPos = Rect.findBestRelativePosition(panelRect, elementRect, contentAreaRect, [\n\t\t\t\t\t\t'tc-tc', 'tl-tl', 'tr-tr'\n\t\t\t\t\t]);\n\n\t\t\t\t\tif (relPos) {\n\t\t\t\t\t\trelRect = Rect.relativePosition(panelRect, elementRect, relPos);\n\t\t\t\t\t\tpanel.moveTo(relRect.x, relRect.y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpanel.moveTo(elementRect.x, elementRect.y);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpanel.hide();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//drawRect(contentAreaRect, 'blue');\n\t\t\t//drawRect(elementRect, 'red');\n\t\t\t//drawRect(panelRect, 'green');\n\t\t}\n\n\t\tfunction repositionHandler() {\n\t\t\tfunction execute() {\n\t\t\t\tif (editor.selection) {\n\t\t\t\t\treposition(findFrontMostMatch(editor.selection.getNode()));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(execute);\n\t\t\t} else {\n\t\t\t\texecute();\n\t\t\t}\n\t\t}\n\n\t\tfunction bindScrollEvent() {\n\t\t\tif (!scrollContainer) {\n\t\t\t\tscrollContainer = editor.selection.getScrollContainer() || editor.getWin();\n\t\t\t\ttinymce.$(scrollContainer).on('scroll', repositionHandler);\n\n\t\t\t\teditor.on('remove', function() {\n\t\t\t\t\ttinymce.$(scrollContainer).off('scroll');\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction showContextToolbar(match) {\n\t\t\tvar panel;\n\n\t\t\tif (match.toolbar.panel) {\n\t\t\t\tmatch.toolbar.panel.show();\n\t\t\t\treposition(match);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tbindScrollEvent();\n\n\t\t\tpanel = Factory.create({\n\t\t\t\ttype: 'floatpanel',\n\t\t\t\trole: 'application',\n\t\t\t\tclasses: 'tinymce tinymce-inline',\n\t\t\t\tlayout: 'flex',\n\t\t\t\tdirection: 'column',\n\t\t\t\talign: 'stretch',\n\t\t\t\tautohide: false,\n\t\t\t\tautofix: true,\n\t\t\t\tfixed: true,\n\t\t\t\tborder: 1,\n\t\t\t\titems: createToolbar(match.toolbar.items)\n\t\t\t});\n\n\t\t\tmatch.toolbar.panel = panel;\n\t\t\tpanel.renderTo(document.body).reflow();\n\t\t\treposition(match);\n\t\t}\n\n\t\tfunction hideAllContextToolbars() {\n\t\t\ttinymce.each(getContextToolbars(), function(toolbar) {\n\t\t\t\tif (toolbar.panel) {\n\t\t\t\t\ttoolbar.panel.hide();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfunction findFrontMostMatch(targetElm) {\n\t\t\tvar i, y, parentsAndSelf, toolbars = getContextToolbars();\n\n\t\t\tparentsAndSelf = editor.$(targetElm).parents().add(targetElm);\n\t\t\tfor (i = parentsAndSelf.length - 1; i >= 0; i--) {\n\t\t\t\tfor (y = toolbars.length - 1; y >= 0; y--) {\n\t\t\t\t\tif (toolbars[y].predicate(parentsAndSelf[i])) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttoolbar: toolbars[y],\n\t\t\t\t\t\t\telement: parentsAndSelf[i]\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}\n\n\t\teditor.on('click keyup', function() {\n\t\t\t// Needs to be delayed to avoid Chrome img focus out bug\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tvar match;\n\n\t\t\t\tif (editor.removed) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tmatch = findFrontMostMatch(editor.selection.getNode());\n\t\t\t\tif (match) {\n\t\t\t\t\tshowContextToolbar(match);\n\t\t\t\t} else {\n\t\t\t\t\thideAllContextToolbars();\n\t\t\t\t}\n\t\t\t}, 0);\n\t\t});\n\n\t\teditor.on('blur hide', hideAllContextToolbars);\n\n\t\teditor.on('ObjectResizeStart', function() {\n\t\t\tvar match = findFrontMostMatch(editor.selection.getNode());\n\n\t\t\tif (match && match.toolbar.panel) {\n\t\t\t\tmatch.toolbar.panel.hide();\n\t\t\t}\n\t\t});\n\n\t\teditor.on('nodeChange ResizeEditor ResizeWindow', repositionHandler);\n\n\t\teditor.on('remove', function() {\n\t\t\ttinymce.each(getContextToolbars(), function(toolbar) {\n\t\t\t\tif (toolbar.panel) {\n\t\t\t\t\ttoolbar.panel.remove();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\teditor.contextToolbars = {};\n\t\t});\n\t}\n\n\t/**\n\t * Renders the inline editor UI.\n\t *\n\t * @return {Object} Name/value object with theme data.\n\t */\n\tfunction renderInlineUI(args) {\n\t\tvar panel, inlineToolbarContainer;\n\n\t\tif (settings.fixed_toolbar_container) {\n\t\t\tinlineToolbarContainer = DOM.select(settings.fixed_toolbar_container)[0];\n\t\t}\n\n\t\tfunction reposition() {\n\t\t\tif (panel && panel.moveRel && panel.visible() && !panel._fixed) {\n\t\t\t\t// TODO: This is kind of ugly and doesn't handle multiple scrollable elements\n\t\t\t\tvar scrollContainer = editor.selection.getScrollContainer(), body = editor.getBody();\n\t\t\t\tvar deltaX = 0, deltaY = 0;\n\n\t\t\t\tif (scrollContainer) {\n\t\t\t\t\tvar bodyPos = DOM.getPos(body), scrollContainerPos = DOM.getPos(scrollContainer);\n\n\t\t\t\t\tdeltaX = Math.max(0, scrollContainerPos.x - bodyPos.x);\n\t\t\t\t\tdeltaY = Math.max(0, scrollContainerPos.y - bodyPos.y);\n\t\t\t\t}\n\n\t\t\t\tpanel.fixed(false).moveRel(body, editor.rtl ? ['tr-br', 'br-tr'] : ['tl-bl', 'bl-tl', 'tr-br']).moveBy(deltaX, deltaY);\n\t\t\t}\n\t\t}\n\n\t\tfunction show() {\n\t\t\tif (panel) {\n\t\t\t\tpanel.show();\n\t\t\t\treposition();\n\t\t\t\tDOM.addClass(editor.getBody(), 'mce-edit-focus');\n\t\t\t}\n\t\t}\n\n\t\tfunction hide() {\n\t\t\tif (panel) {\n\t\t\t\t// We require two events as the inline float panel based toolbar does not have autohide=true\n\t\t\t\tpanel.hide();\n\n\t\t\t\t// All other autohidden float panels will be closed below.\n\t\t\t\tFloatPanel.hideAll();\n\n\t\t\t\tDOM.removeClass(editor.getBody(), 'mce-edit-focus');\n\t\t\t}\n\t\t}\n\n\t\tfunction render() {\n\t\t\tif (panel) {\n\t\t\t\tif (!panel.visible()) {\n\t\t\t\t\tshow();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Render a plain panel inside the inlineToolbarContainer if it's defined\n\t\t\tpanel = self.panel = Factory.create({\n\t\t\t\ttype: inlineToolbarContainer ? 'panel' : 'floatpanel',\n\t\t\t\trole: 'application',\n\t\t\t\tclasses: 'tinymce tinymce-inline',\n\t\t\t\tlayout: 'flex',\n\t\t\t\tdirection: 'column',\n\t\t\t\talign: 'stretch',\n\t\t\t\tautohide: false,\n\t\t\t\tautofix: true,\n\t\t\t\tfixed: !!inlineToolbarContainer,\n\t\t\t\tborder: 1,\n\t\t\t\titems: [\n\t\t\t\t\tsettings.menubar === false ? null : {type: 'menubar', border: '0 0 1 0', items: createMenuButtons()},\n\t\t\t\t\tcreateToolbars(settings.toolbar_items_size)\n\t\t\t\t]\n\t\t\t});\n\n\t\t\t// Add statusbar\n\t\t\t/*if (settings.statusbar !== false) {\n\t\t\t\tpanel.add({type: 'panel', classes: 'statusbar', layout: 'flow', border: '1 0 0 0', items: [\n\t\t\t\t\t{type: 'elementpath'}\n\t\t\t\t]});\n\t\t\t}*/\n\n\t\t\teditor.fire('BeforeRenderUI');\n\t\t\tpanel.renderTo(inlineToolbarContainer || document.body).reflow();\n\n\t\t\taddAccessibilityKeys(panel);\n\t\t\tshow();\n\t\t\taddContextualToolbars();\n\n\t\t\teditor.on('nodeChange', reposition);\n\t\t\teditor.on('activate', show);\n\t\t\teditor.on('deactivate', hide);\n\n\t\t\teditor.nodeChanged();\n\t\t}\n\n\t\tsettings.content_editable = true;\n\n\t\teditor.on('focus', function() {\n\t\t\t// Render only when the CSS file has been loaded\n\t\t\tif (args.skinUiCss) {\n\t\t\t\ttinymce.DOM.styleSheetLoader.load(args.skinUiCss, render, render);\n\t\t\t} else {\n\t\t\t\trender();\n\t\t\t}\n\t\t});\n\n\t\teditor.on('blur hide', hide);\n\n\t\t// Remove the panel when the editor is removed\n\t\teditor.on('remove', function() {\n\t\t\tif (panel) {\n\t\t\t\tpanel.remove();\n\t\t\t\tpanel = null;\n\t\t\t}\n\t\t});\n\n\t\t// Preload skin css\n\t\tif (args.skinUiCss) {\n\t\t\ttinymce.DOM.styleSheetLoader.load(args.skinUiCss);\n\t\t}\n\n\t\treturn {};\n\t}\n\n\t/**\n\t * Renders the iframe editor UI.\n\t *\n\t * @param {Object} args Details about target element etc.\n\t * @return {Object} Name/value object with theme data.\n\t */\n\tfunction renderIframeUI(args) {\n\t\tvar panel, resizeHandleCtrl, startSize;\n\n\t\tif (args.skinUiCss) {\n\t\t\ttinymce.DOM.loadCSS(args.skinUiCss);\n\t\t}\n\n\t\t// Basic UI layout\n\t\tpanel = self.panel = Factory.create({\n\t\t\ttype: 'panel',\n\t\t\trole: 'application',\n\t\t\tclasses: 'tinymce',\n\t\t\tstyle: 'visibility: hidden',\n\t\t\tlayout: 'stack',\n\t\t\tborder: 1,\n\t\t\titems: [\n\t\t\t\tsettings.menubar === false ? null : {type: 'menubar', border: '0 0 1 0', items: createMenuButtons()},\n\t\t\t\tcreateToolbars(settings.toolbar_items_size),\n\t\t\t\t{type: 'panel', name: 'iframe', layout: 'stack', classes: 'edit-area', html: '', border: '1 0 0 0'}\n\t\t\t]\n\t\t});\n\n\t\tif (settings.resize !== false) {\n\t\t\tresizeHandleCtrl = {\n\t\t\t\ttype: 'resizehandle',\n\t\t\t\tdirection: settings.resize,\n\n\t\t\t\tonResizeStart: function() {\n\t\t\t\t\tvar elm = editor.getContentAreaContainer().firstChild;\n\n\t\t\t\t\tstartSize = {\n\t\t\t\t\t\twidth: elm.clientWidth,\n\t\t\t\t\t\theight: elm.clientHeight\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tonResize: function(e) {\n\t\t\t\t\tif (settings.resize == 'both') {\n\t\t\t\t\t\tresizeTo(startSize.width + e.deltaX, startSize.height + e.deltaY);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresizeTo(null, startSize.height + e.deltaY);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// Add statusbar if needed\n\t\tif (settings.statusbar !== false) {\n\t\t\tpanel.add({type: 'panel', name: 'statusbar', classes: 'statusbar', layout: 'flow', border: '1 0 0 0', ariaRoot: true, items: [\n\t\t\t\t{type: 'elementpath'},\n\t\t\t\tresizeHandleCtrl\n\t\t\t]});\n\t\t}\n\n\t\tif (settings.readonly) {\n\t\t\tpanel.find('*').disabled(true);\n\t\t}\n\n\t\teditor.fire('BeforeRenderUI');\n\t\tpanel.renderBefore(args.targetNode).reflow();\n\n\t\tif (settings.width) {\n\t\t\ttinymce.DOM.setStyle(panel.getEl(), 'width', settings.width);\n\t\t}\n\n\t\t// Remove the panel when the editor is removed\n\t\teditor.on('remove', function() {\n\t\t\tpanel.remove();\n\t\t\tpanel = null;\n\t\t});\n\n\t\t// Add accesibility shortcuts\n\t\taddAccessibilityKeys(panel);\n\t\taddContextualToolbars();\n\n\t\treturn {\n\t\t\tiframeContainer: panel.find('#iframe')[0].getEl(),\n\t\t\teditorContainer: panel.getEl()\n\t\t};\n\t}\n\n\t/**\n\t * Renders the UI for the theme. This gets called by the editor.\n\t *\n\t * @param {Object} args Details about target element etc.\n\t * @return {Object} Theme UI data items.\n\t */\n\tself.renderUI = function(args) {\n\t\tvar skin = settings.skin !== false ? settings.skin || 'lightgray' : false;\n\n\t\tif (skin) {\n\t\t\tvar skinUrl = settings.skin_url;\n\n\t\t\tif (skinUrl) {\n\t\t\t\tskinUrl = editor.documentBaseURI.toAbsolute(skinUrl);\n\t\t\t} else {\n\t\t\t\tskinUrl = tinymce.baseURL + '/skins/' + skin;\n\t\t\t}\n\n\t\t\t// Load special skin for IE7\n\t\t\t// TODO: Remove this when we drop IE7 support\n\t\t\tif (tinymce.Env.documentMode <= 7) {\n\t\t\t\targs.skinUiCss = skinUrl + '/skin.ie7.min.css';\n\t\t\t} else {\n\t\t\t\targs.skinUiCss = skinUrl + '/skin.min.css';\n\t\t\t}\n\n\t\t\t// Load content.min.css or content.inline.min.css\n\t\t\teditor.contentCSS.push(skinUrl + '/content' + (editor.inline ? '.inline' : '') + '.min.css');\n\t\t}\n\n\t\t// Handle editor setProgressState change\n\t\teditor.on('ProgressState', function(e) {\n\t\t\tself.throbber = self.throbber || new tinymce.ui.Throbber(self.panel.getEl('body'));\n\n\t\t\tif (e.state) {\n\t\t\t\tself.throbber.show(e.time);\n\t\t\t} else {\n\t\t\t\tself.throbber.hide();\n\t\t\t}\n\t\t});\n\n\t\tif (settings.inline) {\n\t\t\treturn renderInlineUI(args);\n\t\t}\n\n\t\treturn renderIframeUI(args);\n\t};\n\n\tself.resizeTo = resizeTo;\n\tself.resizeBy = resizeBy;\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/tiny_mce_popup.js",
    "content": "/**\n * tinymce_mce_popup.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\nvar tinymce, tinyMCE;\n\n/**\n * TinyMCE popup/dialog helper class. This gives you easy access to the\n * parent editor instance and a bunch of other things. It's higly recommended\n * that you load this script into your dialogs.\n *\n * @static\n * @class tinyMCEPopup\n */\nvar tinyMCEPopup = {\n\t/**\n\t * Initializes the popup this will be called automatically.\n\t *\n\t * @method init\n\t */\n\tinit: function() {\n\t\tvar self = this, parentWin, settings, uiWindow;\n\n\t\t// Find window & API\n\t\tparentWin = self.getWin();\n\t\ttinymce = tinyMCE = parentWin.tinymce;\n\t\tself.editor = tinymce.EditorManager.activeEditor;\n\t\tself.params = self.editor.windowManager.getParams();\n\n\t\tuiWindow = self.editor.windowManager.windows[self.editor.windowManager.windows.length - 1];\n\t\tself.features = uiWindow.features;\n\t\tself.uiWindow = uiWindow;\n\n\t\tsettings = self.editor.settings;\n\n\t\t// Setup popup CSS path(s)\n\t\tif (settings.popup_css !== false) {\n\t\t\tif (settings.popup_css) {\n\t\t\t\tsettings.popup_css = self.editor.documentBaseURI.toAbsolute(settings.popup_css);\n\t\t\t} else {\n\t\t\t\tsettings.popup_css = self.editor.baseURI.toAbsolute(\"plugins/compat3x/css/dialog.css\");\n\t\t\t}\n\t\t}\n\n\t\tif (settings.popup_css_add) {\n\t\t\tsettings.popup_css += ',' + self.editor.documentBaseURI.toAbsolute(settings.popup_css_add);\n\t\t}\n\n\t\t// Setup local DOM\n\t\tself.dom = self.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document, {\n\t\t\townEvents: true,\n\t\t\tproxy: tinyMCEPopup._eventProxy\n\t\t});\n\n\t\tself.dom.bind(window, 'ready', self._onDOMLoaded, self);\n\n\t\t// Enables you to skip loading the default css\n\t\tif (self.features.popup_css !== false) {\n\t\t\tself.dom.loadCSS(self.features.popup_css || self.editor.settings.popup_css);\n\t\t}\n\n\t\t// Setup on init listeners\n\t\tself.listeners = [];\n\n\t\t/**\n\t\t * Fires when the popup is initialized.\n\t\t *\n\t\t * @event onInit\n\t\t * @param {tinymce.Editor} editor Editor instance.\n\t\t * @example\n\t\t * // Alerts the selected contents when the dialog is loaded\n\t\t * tinyMCEPopup.onInit.add(function(ed) {\n\t\t *     alert(ed.selection.getContent());\n\t\t * });\n\t\t *\n\t\t * // Executes the init method on page load in some object using the SomeObject scope\n\t\t * tinyMCEPopup.onInit.add(SomeObject.init, SomeObject);\n\t\t */\n\t\tself.onInit = {\n\t\t\tadd: function(func, scope) {\n\t\t\t\tself.listeners.push({func : func, scope : scope});\n\t\t\t}\n\t\t};\n\n\t\tself.isWindow = !self.getWindowArg('mce_inline');\n\t\tself.id = self.getWindowArg('mce_window_id');\n\t},\n\n\t/**\n\t * Returns the reference to the parent window that opened the dialog.\n\t *\n\t * @method getWin\n\t * @return {Window} Reference to the parent window that opened the dialog.\n\t */\n\tgetWin: function() {\n\t\t// Added frameElement check to fix bug: #2817583\n\t\treturn (!window.frameElement && window.dialogArguments) || opener || parent || top;\n\t},\n\n\t/**\n\t * Returns a window argument/parameter by name.\n\t *\n\t * @method getWindowArg\n\t * @param {String} name Name of the window argument to retrive.\n\t * @param {String} defaultValue Optional default value to return.\n\t * @return {String} Argument value or default value if it wasn't found.\n\t */\n\tgetWindowArg : function(name, defaultValue) {\n\t\tvar value = this.params[name];\n\n\t\treturn tinymce.is(value) ? value : defaultValue;\n\t},\n\n\t/**\n\t * Returns a editor parameter/config option value.\n\t *\n\t * @method getParam\n\t * @param {String} name Name of the editor config option to retrive.\n\t * @param {String} defaultValue Optional default value to return.\n\t * @return {String} Parameter value or default value if it wasn't found.\n\t */\n\tgetParam : function(name, defaultValue) {\n\t\treturn this.editor.getParam(name, defaultValue);\n\t},\n\n\t/**\n\t * Returns a language item by key.\n\t *\n\t * @method getLang\n\t * @param {String} name Language item like mydialog.something.\n\t * @param {String} defaultValue Optional default value to return.\n\t * @return {String} Language value for the item like \"my string\" or the default value if it wasn't found.\n\t */\n\tgetLang : function(name, defaultValue) {\n\t\treturn this.editor.getLang(name, defaultValue);\n\t},\n\n\t/**\n\t * Executed a command on editor that opened the dialog/popup.\n\t *\n\t * @method execCommand\n\t * @param {String} cmd Command to execute.\n\t * @param {Boolean} ui Optional boolean value if the UI for the command should be presented or not.\n\t * @param {Object} val Optional value to pass with the comman like an URL.\n\t * @param {Object} a Optional arguments object.\n\t */\n\texecCommand : function(cmd, ui, val, args) {\n\t\targs = args || {};\n\t\targs.skip_focus = 1;\n\n\t\tthis.restoreSelection();\n\t\treturn this.editor.execCommand(cmd, ui, val, args);\n\t},\n\n\t/**\n\t * Resizes the dialog to the inner size of the window. This is needed since various browsers\n\t * have different border sizes on windows.\n\t *\n\t * @method resizeToInnerSize\n\t */\n\tresizeToInnerSize : function() {\n\t\t/*var self = this;\n\n\t\t// Detach it to workaround a Chrome specific bug\n\t\t// https://sourceforge.net/tracker/?func=detail&atid=635682&aid=2926339&group_id=103281\n\t\tsetTimeout(function() {\n\t\t\tvar vp = self.dom.getViewPort(window);\n\n\t\t\tself.editor.windowManager.resizeBy(\n\t\t\t\tself.getWindowArg('mce_width') - vp.w,\n\t\t\t\tself.getWindowArg('mce_height') - vp.h,\n\t\t\t\tself.id || window\n\t\t\t);\n\t\t}, 10);*/\n\t},\n\n\t/**\n\t * Will executed the specified string when the page has been loaded. This function\n\t * was added for compatibility with the 2.x branch.\n\t *\n\t * @method executeOnLoad\n\t * @param {String} evil String to evalutate on init.\n\t */\n\texecuteOnLoad : function(evil) {\n\t\tthis.onInit.add(function() {\n\t\t\teval(evil);\n\t\t});\n\t},\n\n\t/**\n\t * Stores the current editor selection for later restoration. This can be useful since some browsers\n\t * looses it's selection if a control element is selected/focused inside the dialogs.\n\t *\n\t * @method storeSelection\n\t */\n\tstoreSelection : function() {\n\t\tthis.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark(1);\n\t},\n\n\t/**\n\t * Restores any stored selection. This can be useful since some browsers\n\t * looses it's selection if a control element is selected/focused inside the dialogs.\n\t *\n\t * @method restoreSelection\n\t */\n\trestoreSelection : function() {\n\t\tvar self = tinyMCEPopup;\n\n\t\tif (!self.isWindow && tinymce.isIE) {\n\t\t\tself.editor.selection.moveToBookmark(self.editor.windowManager.bookmark);\n\t\t}\n\t},\n\n\t/**\n\t * Loads a specific dialog language pack. If you pass in plugin_url as a argument\n\t * when you open the window it will load the <plugin url>/langs/<code>_dlg.js lang pack file.\n\t *\n\t * @method requireLangPack\n\t */\n\trequireLangPack : function() {\n\t\tvar self = this, url = self.getWindowArg('plugin_url') || self.getWindowArg('theme_url'), settings = self.editor.settings, lang;\n\n\t\tif (settings.language !== false) {\n\t\t\tlang = settings.language || \"en\";\n\t\t}\n\n\t\tif (url && lang && self.features.translate_i18n !== false && settings.language_load !== false) {\n\t\t\turl += '/langs/' + lang + '_dlg.js';\n\n\t\t\tif (!tinymce.ScriptLoader.isDone(url)) {\n\t\t\t\tdocument.write('<script type=\"text/javascript\" src=\"' + url + '\"></script>');\n\t\t\t\ttinymce.ScriptLoader.markDone(url);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Executes a color picker on the specified element id. When the user\n\t * then selects a color it will be set as the value of the specified element.\n\t *\n\t * @method pickColor\n\t * @param {DOMEvent} e DOM event object.\n\t * @param {string} element_id Element id to be filled with the color value from the picker.\n\t */\n\tpickColor : function(e, element_id) {\n\t\tvar el = document.getElementById(element_id), colorPickerCallback = this.editor.settings.color_picker_callback;\n\t\tif (colorPickerCallback) {\n\t\t\tcolorPickerCallback.call(\n\t\t\t\tthis.editor,\n\t\t\t\tfunction (value) {\n\t\t\t\t\tel.value = value;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tel.onchange();\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\t// Try fire event, ignore errors\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tel.value\n\t\t\t);\n\t\t}\n\t},\n\n\t/**\n\t * Opens a filebrowser/imagebrowser this will set the output value from\n\t * the browser as a value on the specified element.\n\t *\n\t * @method openBrowser\n\t * @param {string} element_id Id of the element to set value in.\n\t * @param {string} type Type of browser to open image/file/flash.\n\t * @param {string} option Option name to get the file_broswer_callback function name from.\n\t */\n\topenBrowser : function(element_id, type) {\n\t\ttinyMCEPopup.restoreSelection();\n\t\tthis.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window);\n\t},\n\n\t/**\n\t * Creates a confirm dialog. Please don't use the blocking behavior of this\n\t * native version use the callback method instead then it can be extended.\n\t *\n\t * @method confirm\n\t * @param {String} t Title for the new confirm dialog.\n\t * @param {function} cb Callback function to be executed after the user has selected ok or cancel.\n\t * @param {Object} s Optional scope to execute the callback in.\n\t */\n\tconfirm : function(t, cb, s) {\n\t\tthis.editor.windowManager.confirm(t, cb, s, window);\n\t},\n\n\t/**\n\t * Creates a alert dialog. Please don't use the blocking behavior of this\n\t * native version use the callback method instead then it can be extended.\n\t *\n\t * @method alert\n\t * @param {String} tx Title for the new alert dialog.\n\t * @param {function} cb Callback function to be executed after the user has selected ok.\n\t * @param {Object} s Optional scope to execute the callback in.\n\t */\n\talert : function(tx, cb, s) {\n\t\tthis.editor.windowManager.alert(tx, cb, s, window);\n\t},\n\n\t/**\n\t * Closes the current window.\n\t *\n\t * @method close\n\t */\n\tclose : function() {\n\t\tvar t = this;\n\n\t\t// To avoid domain relaxing issue in Opera\n\t\tfunction close() {\n\t\t\tt.editor.windowManager.close(window);\n\t\t\ttinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup\n\t\t}\n\n\t\tif (tinymce.isOpera) {\n\t\t\tt.getWin().setTimeout(close, 0);\n\t\t} else {\n\t\t\tclose();\n\t\t}\n\t},\n\n\t// Internal functions\n\n\t_restoreSelection : function() {\n\t\tvar e = window.event.srcElement;\n\n\t\tif (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button')) {\n\t\t\ttinyMCEPopup.restoreSelection();\n\t\t}\n\t},\n\n/*\t_restoreSelection : function() {\n\t\tvar e = window.event.srcElement;\n\n\t\t// If user focus a non text input or textarea\n\t\tif ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text')\n\t\t\ttinyMCEPopup.restoreSelection();\n\t},*/\n\n\t_onDOMLoaded : function() {\n\t\tvar t = tinyMCEPopup, ti = document.title, h, nv;\n\n\t\t// Translate page\n\t\tif (t.features.translate_i18n !== false) {\n\t\t\tvar map = {\n\t\t\t\t\"update\": \"Ok\",\n\t\t\t\t\"insert\": \"Ok\",\n\t\t\t\t\"cancel\": \"Cancel\",\n\t\t\t\t\"not_set\": \"--\",\n\t\t\t\t\"class_name\": \"Class name\",\n\t\t\t\t\"browse\": \"Browse\"\n\t\t\t};\n\n\t\t\tvar langCode = (tinymce.settings ? tinymce.settings : t.editor.settings).language || 'en';\n\t\t\tfor (var key in map) {\n\t\t\t\ttinymce.i18n.data[langCode + \".\" + key] = tinymce.i18n.translate(map[key]);\n\t\t\t}\n\n\t\t\th = document.body.innerHTML;\n\n\t\t\t// Replace a=x with a=\"x\" in IE\n\t\t\tif (tinymce.isIE) {\n\t\t\t\th = h.replace(/ (value|title|alt)=([^\"][^\\s>]+)/gi, ' $1=\"$2\"');\n\t\t\t}\n\n\t\t\tdocument.dir = t.editor.getParam('directionality','');\n\n\t\t\tif ((nv = t.editor.translate(h)) && nv != h) {\n\t\t\t\tdocument.body.innerHTML = nv;\n\t\t\t}\n\n\t\t\tif ((nv = t.editor.translate(ti)) && nv != ti) {\n\t\t\t\tdocument.title = ti = nv;\n\t\t\t}\n\t\t}\n\n\t\tif (!t.editor.getParam('browser_preferred_colors', false) || !t.isWindow) {\n\t\t\tt.dom.addClass(document.body, 'forceColors');\n\t\t}\n\n\t\tdocument.body.style.display = '';\n\n\t\t// Restore selection in IE when focus is placed on a non textarea or input element of the type text\n\t\tif (tinymce.Env.ie) {\n\t\t\tif (tinymce.Env.ie < 11) {\n\t\t\t\tdocument.attachEvent('onmouseup', tinyMCEPopup._restoreSelection);\n\n\t\t\t\t// Add base target element for it since it would fail with modal dialogs\n\t\t\t\tt.dom.add(t.dom.select('head')[0], 'base', {target: '_self'});\n\t\t\t} else {\n\t\t\t\tdocument.addEventListener('mouseup', tinyMCEPopup._restoreSelection, false);\n\t\t\t}\n\t\t}\n\n\t\tt.restoreSelection();\n\t\tt.resizeToInnerSize();\n\n\t\t// Set inline title\n\t\tif (!t.isWindow) {\n\t\t\tt.editor.windowManager.setTitle(window, ti);\n\t\t} else {\n\t\t\twindow.focus();\n\t\t}\n\n\t\tif (!tinymce.isIE && !t.isWindow) {\n\t\t\tt.dom.bind(document, 'focus', function() {\n\t\t\t\tt.editor.windowManager.focus(t.id);\n\t\t\t});\n\t\t}\n\n\t\t// Patch for accessibility\n\t\ttinymce.each(t.dom.select('select'), function(e) {\n\t\t\te.onkeydown = tinyMCEPopup._accessHandler;\n\t\t});\n\n\t\t// Call onInit\n\t\t// Init must be called before focus so the selection won't get lost by the focus call\n\t\ttinymce.each(t.listeners, function(o) {\n\t\t\to.func.call(o.scope, t.editor);\n\t\t});\n\n\t\t// Move focus to window\n\t\tif (t.getWindowArg('mce_auto_focus', true)) {\n\t\t\twindow.focus();\n\n\t\t\t// Focus element with mceFocus class\n\t\t\ttinymce.each(document.forms, function(f) {\n\t\t\t\ttinymce.each(f.elements, function(e) {\n\t\t\t\t\tif (t.dom.hasClass(e, 'mceFocus') && !e.disabled) {\n\t\t\t\t\t\te.focus();\n\t\t\t\t\t\treturn false; // Break loop\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tdocument.onkeyup = tinyMCEPopup._closeWinKeyHandler;\n\n\t\tif ('textContent' in document) {\n\t\t\tt.uiWindow.getEl('head').firstChild.textContent = document.title;\n\t\t} else {\n\t\t\tt.uiWindow.getEl('head').firstChild.innerText = document.title;\n\t\t}\n\t},\n\n\t_accessHandler : function(e) {\n\t\te = e || window.event;\n\n\t\tif (e.keyCode == 13 || e.keyCode == 32) {\n\t\t\tvar elm = e.target || e.srcElement;\n\n\t\t\tif (elm.onchange) {\n\t\t\t\telm.onchange();\n\t\t\t}\n\n\t\t\treturn tinymce.dom.Event.cancel(e);\n\t\t}\n\t},\n\n\t_closeWinKeyHandler : function(e) {\n\t\te = e || window.event;\n\n\t\tif (e.keyCode == 27) {\n\t\t\ttinyMCEPopup.close();\n\t\t}\n\t},\n\n\t_eventProxy: function(id) {\n\t\treturn function(evt) {\n\t\t\ttinyMCEPopup.dom.events.callNativeHandler(id, evt);\n\t\t};\n\t}\n};\n\ntinyMCEPopup.init();\n\ntinymce.util.Dispatcher = function(scope) {\n\tthis.scope = scope || this;\n\tthis.listeners = [];\n\n\tthis.add = function(callback, scope) {\n\t\tthis.listeners.push({cb : callback, scope : scope || this.scope});\n\n\t\treturn callback;\n\t};\n\n\tthis.addToTop = function(callback, scope) {\n\t\tvar self = this, listener = {cb : callback, scope : scope || self.scope};\n\n\t\t// Create new listeners if addToTop is executed in a dispatch loop\n\t\tif (self.inDispatch) {\n\t\t\tself.listeners = [listener].concat(self.listeners);\n\t\t} else {\n\t\t\tself.listeners.unshift(listener);\n\t\t}\n\n\t\treturn callback;\n\t};\n\n\tthis.remove = function(callback) {\n\t\tvar listeners = this.listeners, output = null;\n\n\t\ttinymce.each(listeners, function(listener, i) {\n\t\t\tif (callback == listener.cb) {\n\t\t\t\toutput = listener;\n\t\t\t\tlisteners.splice(i, 1);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\treturn output;\n\t};\n\n\tthis.dispatch = function() {\n\t\tvar self = this, returnValue, args = arguments, i, listeners = self.listeners, listener;\n\n\t\tself.inDispatch = true;\n\n\t\t// Needs to be a real loop since the listener count might change while looping\n\t\t// And this is also more efficient\n\t\tfor (i = 0; i < listeners.length; i++) {\n\t\t\tlistener = listeners[i];\n\t\t\treturnValue = listener.cb.apply(listener.scope, args.length > 0 ? args : [listener.scope]);\n\n\t\t\tif (returnValue === false) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tself.inDispatch = false;\n\n\t\treturn returnValue;\n\t};\n};\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/utils/editable_selects.js",
    "content": "/**\n * editable_selects.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\nvar TinyMCE_EditableSelects = {\n\teditSelectElm : null,\n\n\tinit : function() {\n\t\tvar nl = document.getElementsByTagName(\"select\"), i, d = document, o;\n\n\t\tfor (i=0; i<nl.length; i++) {\n\t\t\tif (nl[i].className.indexOf('mceEditableSelect') != -1) {\n\t\t\t\to = new Option(tinyMCEPopup.editor.translate('value'), '__mce_add_custom__');\n\n\t\t\t\to.className = 'mceAddSelectValue';\n\n\t\t\t\tnl[i].options[nl[i].options.length] = o;\n\t\t\t\tnl[i].onchange = TinyMCE_EditableSelects.onChangeEditableSelect;\n\t\t\t}\n\t\t}\n\t},\n\n\tonChangeEditableSelect : function(e) {\n\t\tvar d = document, ne, se = window.event ? window.event.srcElement : e.target;\n\n\t\tif (se.options[se.selectedIndex].value == '__mce_add_custom__') {\n\t\t\tne = d.createElement(\"input\");\n\t\t\tne.id = se.id + \"_custom\";\n\t\t\tne.name = se.name + \"_custom\";\n\t\t\tne.type = \"text\";\n\n\t\t\tne.style.width = se.offsetWidth + 'px';\n\t\t\tse.parentNode.insertBefore(ne, se);\n\t\t\tse.style.display = 'none';\n\t\t\tne.focus();\n\t\t\tne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput;\n\t\t\tne.onkeydown = TinyMCE_EditableSelects.onKeyDown;\n\t\t\tTinyMCE_EditableSelects.editSelectElm = se;\n\t\t}\n\t},\n\n\tonBlurEditableSelectInput : function() {\n\t\tvar se = TinyMCE_EditableSelects.editSelectElm;\n\n\t\tif (se) {\n\t\t\tif (se.previousSibling.value != '') {\n\t\t\t\taddSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value);\n\t\t\t\tselectByValue(document.forms[0], se.id, se.previousSibling.value);\n\t\t\t} else\n\t\t\t\tselectByValue(document.forms[0], se.id, '');\n\n\t\t\tse.style.display = 'inline';\n\t\t\tse.parentNode.removeChild(se.previousSibling);\n\t\t\tTinyMCE_EditableSelects.editSelectElm = null;\n\t\t}\n\t},\n\n\tonKeyDown : function(e) {\n\t\te = e || window.event;\n\n\t\tif (e.keyCode == 13)\n\t\t\tTinyMCE_EditableSelects.onBlurEditableSelectInput();\n\t}\n};\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/utils/form_utils.js",
    "content": "/**\n * form_utils.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\nvar themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam(\"theme\"));\n\nfunction getColorPickerHTML(id, target_form_element) {\n\tvar h = \"\", dom = tinyMCEPopup.dom;\n\n\tif (label = dom.select('label[for=' + target_form_element + ']')[0]) {\n\t\tlabel.id = label.id || dom.uniqueId();\n\t}\n\n\th += '<a role=\"button\" aria-labelledby=\"' + id + '_label\" id=\"' + id + '_link\" href=\"javascript:;\" onclick=\"tinyMCEPopup.pickColor(event,\\'' + target_form_element +'\\');\" onmousedown=\"return false;\" class=\"pickcolor\">';\n\th += '<span id=\"' + id + '\" title=\"' + tinyMCEPopup.getLang('browse') + '\">&nbsp;<span id=\"' + id + '_label\" class=\"mceVoiceLabel mceIconOnly\" style=\"display:none;\">' + tinyMCEPopup.getLang('browse') + '</span></span></a>';\n\n\treturn h;\n}\n\nfunction updateColor(img_id, form_element_id) {\n\tdocument.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;\n}\n\nfunction setBrowserDisabled(id, state) {\n\tvar img = document.getElementById(id);\n\tvar lnk = document.getElementById(id + \"_link\");\n\n\tif (lnk) {\n\t\tif (state) {\n\t\t\tlnk.setAttribute(\"realhref\", lnk.getAttribute(\"href\"));\n\t\t\tlnk.removeAttribute(\"href\");\n\t\t\ttinyMCEPopup.dom.addClass(img, 'disabled');\n\t\t} else {\n\t\t\tif (lnk.getAttribute(\"realhref\"))\n\t\t\t\tlnk.setAttribute(\"href\", lnk.getAttribute(\"realhref\"));\n\n\t\t\ttinyMCEPopup.dom.removeClass(img, 'disabled');\n\t\t}\n\t}\n}\n\nfunction getBrowserHTML(id, target_form_element, type, prefix) {\n\tvar option = prefix + \"_\" + type + \"_browser_callback\", cb, html;\n\n\tcb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam(\"file_browser_callback\"));\n\n\tif (!cb)\n\t\treturn \"\";\n\n\thtml = \"\";\n\thtml += '<a id=\"' + id + '_link\" href=\"javascript:openBrowser(\\'' + id + '\\',\\'' + target_form_element + '\\', \\'' + type + '\\',\\'' + option + '\\');\" onmousedown=\"return false;\" class=\"browse\">';\n\thtml += '<span id=\"' + id + '\" title=\"' + tinyMCEPopup.getLang('browse') + '\">&nbsp;</span></a>';\n\n\treturn html;\n}\n\nfunction openBrowser(img_id, target_form_element, type, option) {\n\tvar img = document.getElementById(img_id);\n\n\tif (img.className != \"mceButtonDisabled\")\n\t\ttinyMCEPopup.openBrowser(target_form_element, type, option);\n}\n\nfunction selectByValue(form_obj, field_name, value, add_custom, ignore_case) {\n\tif (!form_obj || !form_obj.elements[field_name])\n\t\treturn;\n\n\tif (!value)\n\t\tvalue = \"\";\n\n\tvar sel = form_obj.elements[field_name];\n\n\tvar found = false;\n\tfor (var i=0; i<sel.options.length; i++) {\n\t\tvar option = sel.options[i];\n\n\t\tif (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {\n\t\t\toption.selected = true;\n\t\t\tfound = true;\n\t\t} else\n\t\t\toption.selected = false;\n\t}\n\n\tif (!found && add_custom && value != '') {\n\t\tvar option = new Option(value, value);\n\t\toption.selected = true;\n\t\tsel.options[sel.options.length] = option;\n\t\tsel.selectedIndex = sel.options.length - 1;\n\t}\n\n\treturn found;\n}\n\nfunction getSelectValue(form_obj, field_name) {\n\tvar elm = form_obj.elements[field_name];\n\n\tif (elm == null || elm.options == null || elm.selectedIndex === -1)\n\t\treturn \"\";\n\n\treturn elm.options[elm.selectedIndex].value;\n}\n\nfunction addSelectValue(form_obj, field_name, name, value) {\n\tvar s = form_obj.elements[field_name];\n\tvar o = new Option(name, value);\n\ts.options[s.options.length] = o;\n}\n\nfunction addClassesToList(list_id, specific_option) {\n\t// Setup class droplist\n\tvar styleSelectElm = document.getElementById(list_id);\n\tvar styles = tinyMCEPopup.getParam('theme_advanced_styles', false);\n\tstyles = tinyMCEPopup.getParam(specific_option, styles);\n\n\tif (styles) {\n\t\tvar stylesAr = styles.split(';');\n\n\t\tfor (var i=0; i<stylesAr.length; i++) {\n\t\t\tif (stylesAr != \"\") {\n\t\t\t\tvar key, value;\n\n\t\t\t\tkey = stylesAr[i].split('=')[0];\n\t\t\t\tvalue = stylesAr[i].split('=')[1];\n\n\t\t\t\tstyleSelectElm.options[styleSelectElm.length] = new Option(key, value);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t/*tinymce.each(tinyMCEPopup.editor.dom.getClasses(), function(o) {\n\t\t\tstyleSelectElm.options[styleSelectElm.length] = new Option(o.title || o['class'], o['class']);\n\t\t});*/\n\t}\n}\n\nfunction isVisible(element_id) {\n\tvar elm = document.getElementById(element_id);\n\n\treturn elm && elm.style.display != \"none\";\n}\n\nfunction convertRGBToHex(col) {\n\tvar re = new RegExp(\"rgb\\\\s*\\\\(\\\\s*([0-9]+).*,\\\\s*([0-9]+).*,\\\\s*([0-9]+).*\\\\)\", \"gi\");\n\n\tvar rgb = col.replace(re, \"$1,$2,$3\").split(',');\n\tif (rgb.length == 3) {\n\t\tr = parseInt(rgb[0]).toString(16);\n\t\tg = parseInt(rgb[1]).toString(16);\n\t\tb = parseInt(rgb[2]).toString(16);\n\n\t\tr = r.length == 1 ? '0' + r : r;\n\t\tg = g.length == 1 ? '0' + g : g;\n\t\tb = b.length == 1 ? '0' + b : b;\n\n\t\treturn \"#\" + r + g + b;\n\t}\n\n\treturn col;\n}\n\nfunction convertHexToRGB(col) {\n\tif (col.indexOf('#') != -1) {\n\t\tcol = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');\n\n\t\tr = parseInt(col.substring(0, 2), 16);\n\t\tg = parseInt(col.substring(2, 4), 16);\n\t\tb = parseInt(col.substring(4, 6), 16);\n\n\t\treturn \"rgb(\" + r + \",\" + g + \",\" + b + \")\";\n\t}\n\n\treturn col;\n}\n\nfunction trimSize(size) {\n\treturn size.replace(/([0-9\\.]+)(px|%|in|cm|mm|em|ex|pt|pc)/i, '$1$2');\n}\n\nfunction getCSSSize(size) {\n\tsize = trimSize(size);\n\n\tif (size == \"\")\n\t\treturn \"\";\n\n\t// Add px\n\tif (/^[0-9]+$/.test(size))\n\t\tsize += 'px';\n\t// Sanity check, IE doesn't like broken values\n\telse if (!(/^[0-9\\.]+(px|%|in|cm|mm|em|ex|pt|pc)$/i.test(size)))\n\t\treturn \"\";\n\n\treturn size;\n}\n\nfunction getStyle(elm, attrib, style) {\n\tvar val = tinyMCEPopup.dom.getAttrib(elm, attrib);\n\n\tif (val != '')\n\t\treturn '' + val;\n\n\tif (typeof(style) == 'undefined')\n\t\tstyle = attrib;\n\n\treturn tinyMCEPopup.dom.getStyle(elm, style);\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/utils/mctabs.js",
    "content": "/**\n * mctabs.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/*jshint globals: tinyMCEPopup */\n\nfunction MCTabs() {\n\tthis.settings = [];\n\tthis.onChange = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.Dispatcher');\n};\n\nMCTabs.prototype.init = function(settings) {\n\tthis.settings = settings;\n};\n\nMCTabs.prototype.getParam = function(name, default_value) {\n\tvar value = null;\n\n\tvalue = (typeof(this.settings[name]) == \"undefined\") ? default_value : this.settings[name];\n\n\t// Fix bool values\n\tif (value == \"true\" || value == \"false\")\n\t\treturn (value == \"true\");\n\n\treturn value;\n};\n\nMCTabs.prototype.showTab =function(tab){\n\ttab.className = 'current';\n\ttab.setAttribute(\"aria-selected\", true);\n\ttab.setAttribute(\"aria-expanded\", true);\n\ttab.tabIndex = 0;\n};\n\nMCTabs.prototype.hideTab =function(tab){\n\tvar t=this;\n\n\ttab.className = '';\n\ttab.setAttribute(\"aria-selected\", false);\n\ttab.setAttribute(\"aria-expanded\", false);\n\ttab.tabIndex = -1;\n};\n\nMCTabs.prototype.showPanel = function(panel) {\n\tpanel.className = 'current';\n\tpanel.setAttribute(\"aria-hidden\", false);\n};\n\nMCTabs.prototype.hidePanel = function(panel) {\n\tpanel.className = 'panel';\n\tpanel.setAttribute(\"aria-hidden\", true);\n};\n\nMCTabs.prototype.getPanelForTab = function(tabElm) {\n\treturn tinyMCEPopup.dom.getAttrib(tabElm, \"aria-controls\");\n};\n\nMCTabs.prototype.displayTab = function(tab_id, panel_id, avoid_focus) {\n\tvar panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i, t = this;\n\n\ttabElm = document.getElementById(tab_id);\n\n\tif (panel_id === undefined) {\n\t\tpanel_id = t.getPanelForTab(tabElm);\n\t}\n\n\tpanelElm= document.getElementById(panel_id);\n\tpanelContainerElm = panelElm ? panelElm.parentNode : null;\n\ttabContainerElm = tabElm ? tabElm.parentNode : null;\n\tselectionClass = t.getParam('selection_class', 'current');\n\n\tif (tabElm && tabContainerElm) {\n\t\tnodes = tabContainerElm.childNodes;\n\n\t\t// Hide all other tabs\n\t\tfor (i = 0; i < nodes.length; i++) {\n\t\t\tif (nodes[i].nodeName == \"LI\") {\n\t\t\t\tt.hideTab(nodes[i]);\n\t\t\t}\n\t\t}\n\n\t\t// Show selected tab\n\t\tt.showTab(tabElm);\n\t}\n\n\tif (panelElm && panelContainerElm) {\n\t\tnodes = panelContainerElm.childNodes;\n\n\t\t// Hide all other panels\n\t\tfor (i = 0; i < nodes.length; i++) {\n\t\t\tif (nodes[i].nodeName == \"DIV\")\n\t\t\t\tt.hidePanel(nodes[i]);\n\t\t}\n\n\t\tif (!avoid_focus) {\n\t\t\ttabElm.focus();\n\t\t}\n\n\t\t// Show selected panel\n\t\tt.showPanel(panelElm);\n\t}\n};\n\nMCTabs.prototype.getAnchor = function() {\n\tvar pos, url = document.location.href;\n\n\tif ((pos = url.lastIndexOf('#')) != -1)\n\t\treturn url.substring(pos + 1);\n\n\treturn \"\";\n};\n\n\n//Global instance\nvar mcTabs = new MCTabs();\n\ntinyMCEPopup.onInit.add(function() {\n\tvar tinymce = tinyMCEPopup.getWin().tinymce, dom = tinyMCEPopup.dom, each = tinymce.each;\n\n\teach(dom.select('div.tabs'), function(tabContainerElm) {\n\t\t//var keyNav;\n\n\t\tdom.setAttrib(tabContainerElm, \"role\", \"tablist\");\n\n\t\tvar items = tinyMCEPopup.dom.select('li', tabContainerElm);\n\t\tvar action = function(id) {\n\t\t\tmcTabs.displayTab(id, mcTabs.getPanelForTab(id));\n\t\t\tmcTabs.onChange.dispatch(id);\n\t\t};\n\n\t\teach(items, function(item) {\n\t\t\tdom.setAttrib(item, 'role', 'tab');\n\t\t\tdom.bind(item, 'click', function(evt) {\n\t\t\t\taction(item.id);\n\t\t\t});\n\t\t});\n\n\t\tdom.bind(dom.getRoot(), 'keydown', function(evt) {\n\t\t\tif (evt.keyCode === 9 && evt.ctrlKey && !evt.altKey) { // Tab\n\t\t\t\t//keyNav.moveFocus(evt.shiftKey ? -1 : 1);\n\t\t\t\ttinymce.dom.Event.cancel(evt);\n\t\t\t}\n\t\t});\n\n\t\teach(dom.select('a', tabContainerElm), function(a) {\n\t\t\tdom.setAttrib(a, 'tabindex', '-1');\n\t\t});\n\n\t\t/*keyNav = tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', {\n\t\t\troot: tabContainerElm,\n\t\t\titems: items,\n\t\t\tonAction: action,\n\t\t\tactOnFocus: true,\n\t\t\tenableLeftRight: true,\n\t\t\tenableUpDown: true\n\t\t}, tinyMCEPopup.dom);*/\n\t});\n});"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/utils/validate.js",
    "content": "/**\n * validate.js\n *\n * Released under LGPL License.\n * Copyright (c) 1999-2015 Ephox Corp. All rights reserved\n *\n * License: http://www.tinymce.com/license\n * Contributing: http://www.tinymce.com/contributing\n */\n\n/**\n\t// String validation:\n\n\tif (!Validator.isEmail('myemail'))\n\t\talert('Invalid email.');\n\n\t// Form validation:\n\n\tvar f = document.forms['myform'];\n\n\tif (!Validator.isEmail(f.myemail))\n\t\talert('Invalid email.');\n*/\n\nvar Validator = {\n\tisEmail : function(s) {\n\t\treturn this.test(s, '^[-!#$%&\\'*+\\\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\\'*+\\\\/0-9=?A-Z^_`a-z{|}~]+\\.[-!#$%&\\'*+\\\\./0-9=?A-Z^_`a-z{|}~]+$');\n\t},\n\n\tisAbsUrl : function(s) {\n\t\treturn this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\\\.]+\\\\/?.*$');\n\t},\n\n\tisSize : function(s) {\n\t\treturn this.test(s, '^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)?$');\n\t},\n\n\tisId : function(s) {\n\t\treturn this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$');\n\t},\n\n\tisEmpty : function(s) {\n\t\tvar nl, i;\n\n\t\tif (s.nodeName == 'SELECT' && s.selectedIndex < 1)\n\t\t\treturn true;\n\n\t\tif (s.type == 'checkbox' && !s.checked)\n\t\t\treturn true;\n\n\t\tif (s.type == 'radio') {\n\t\t\tfor (i=0, nl = s.form.elements; i<nl.length; i++) {\n\t\t\t\tif (nl[i].type == \"radio\" && nl[i].name == s.name && nl[i].checked)\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn new RegExp('^\\\\s*$').test(s.nodeType == 1 ? s.value : s);\n\t},\n\n\tisNumber : function(s, d) {\n\t\treturn !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\\\.[0-9]*$'));\n\t},\n\n\ttest : function(s, p) {\n\t\ts = s.nodeType == 1 ? s.value : s;\n\n\t\treturn s == '' || new RegExp(p).test(s);\n\t}\n};\n\nvar AutoValidator = {\n\tsettings : {\n\t\tid_cls : 'id',\n\t\tint_cls : 'int',\n\t\turl_cls : 'url',\n\t\tnumber_cls : 'number',\n\t\temail_cls : 'email',\n\t\tsize_cls : 'size',\n\t\trequired_cls : 'required',\n\t\tinvalid_cls : 'invalid',\n\t\tmin_cls : 'min',\n\t\tmax_cls : 'max'\n\t},\n\n\tinit : function(s) {\n\t\tvar n;\n\n\t\tfor (n in s)\n\t\t\tthis.settings[n] = s[n];\n\t},\n\n\tvalidate : function(f) {\n\t\tvar i, nl, s = this.settings, c = 0;\n\n\t\tnl = this.tags(f, 'label');\n\t\tfor (i=0; i<nl.length; i++) {\n\t\t\tthis.removeClass(nl[i], s.invalid_cls);\n\t\t\tnl[i].setAttribute('aria-invalid', false);\n\t\t}\n\n\t\tc += this.validateElms(f, 'input');\n\t\tc += this.validateElms(f, 'select');\n\t\tc += this.validateElms(f, 'textarea');\n\n\t\treturn c == 3;\n\t},\n\n\tinvalidate : function(n) {\n\t\tthis.mark(n.form, n);\n\t},\n\n\tgetErrorMessages : function(f) {\n\t\tvar nl, i, s = this.settings, field, msg, values, messages = [], ed = tinyMCEPopup.editor;\n\t\tnl = this.tags(f, \"label\");\n\t\tfor (i=0; i<nl.length; i++) {\n\t\t\tif (this.hasClass(nl[i], s.invalid_cls)) {\n\t\t\t\tfield = document.getElementById(nl[i].getAttribute(\"for\"));\n\t\t\t\tvalues = { field: nl[i].textContent };\n\t\t\t\tif (this.hasClass(field, s.min_cls, true)) {\n\t\t\t\t\tmessage = ed.getLang('invalid_data_min');\n\t\t\t\t\tvalues.min = this.getNum(field, s.min_cls);\n\t\t\t\t} else if (this.hasClass(field, s.number_cls)) {\n\t\t\t\t\tmessage = ed.getLang('invalid_data_number');\n\t\t\t\t} else if (this.hasClass(field, s.size_cls)) {\n\t\t\t\t\tmessage = ed.getLang('invalid_data_size');\n\t\t\t\t} else {\n\t\t\t\t\tmessage = ed.getLang('invalid_data');\n\t\t\t\t}\n\n\t\t\t\tmessage = message.replace(/{\\#([^}]+)\\}/g, function(a, b) {\n\t\t\t\t\treturn values[b] || '{#' + b + '}';\n\t\t\t\t});\n\t\t\t\tmessages.push(message);\n\t\t\t}\n\t\t}\n\t\treturn messages;\n\t},\n\n\treset : function(e) {\n\t\tvar t = ['label', 'input', 'select', 'textarea'];\n\t\tvar i, j, nl, s = this.settings;\n\n\t\tif (e == null)\n\t\t\treturn;\n\n\t\tfor (i=0; i<t.length; i++) {\n\t\t\tnl = this.tags(e.form ? e.form : e, t[i]);\n\t\t\tfor (j=0; j<nl.length; j++) {\n\t\t\t\tthis.removeClass(nl[j], s.invalid_cls);\n\t\t\t\tnl[j].setAttribute('aria-invalid', false);\n\t\t\t}\n\t\t}\n\t},\n\n\tvalidateElms : function(f, e) {\n\t\tvar nl, i, n, s = this.settings, st = true, va = Validator, v;\n\n\t\tnl = this.tags(f, e);\n\t\tfor (i=0; i<nl.length; i++) {\n\t\t\tn = nl[i];\n\n\t\t\tthis.removeClass(n, s.invalid_cls);\n\n\t\t\tif (this.hasClass(n, s.required_cls) && va.isEmpty(n))\n\t\t\t\tst = this.mark(f, n);\n\n\t\t\tif (this.hasClass(n, s.number_cls) && !va.isNumber(n))\n\t\t\t\tst = this.mark(f, n);\n\n\t\t\tif (this.hasClass(n, s.int_cls) && !va.isNumber(n, true))\n\t\t\t\tst = this.mark(f, n);\n\n\t\t\tif (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n))\n\t\t\t\tst = this.mark(f, n);\n\n\t\t\tif (this.hasClass(n, s.email_cls) && !va.isEmail(n))\n\t\t\t\tst = this.mark(f, n);\n\n\t\t\tif (this.hasClass(n, s.size_cls) && !va.isSize(n))\n\t\t\t\tst = this.mark(f, n);\n\n\t\t\tif (this.hasClass(n, s.id_cls) && !va.isId(n))\n\t\t\t\tst = this.mark(f, n);\n\n\t\t\tif (this.hasClass(n, s.min_cls, true)) {\n\t\t\t\tv = this.getNum(n, s.min_cls);\n\n\t\t\t\tif (isNaN(v) || parseInt(n.value) < parseInt(v))\n\t\t\t\t\tst = this.mark(f, n);\n\t\t\t}\n\n\t\t\tif (this.hasClass(n, s.max_cls, true)) {\n\t\t\t\tv = this.getNum(n, s.max_cls);\n\n\t\t\t\tif (isNaN(v) || parseInt(n.value) > parseInt(v))\n\t\t\t\t\tst = this.mark(f, n);\n\t\t\t}\n\t\t}\n\n\t\treturn st;\n\t},\n\n\thasClass : function(n, c, d) {\n\t\treturn new RegExp('\\\\b' + c + (d ? '[0-9]+' : '') + '\\\\b', 'g').test(n.className);\n\t},\n\n\tgetNum : function(n, c) {\n\t\tc = n.className.match(new RegExp('\\\\b' + c + '([0-9]+)\\\\b', 'g'))[0];\n\t\tc = c.replace(/[^0-9]/g, '');\n\n\t\treturn c;\n\t},\n\n\taddClass : function(n, c, b) {\n\t\tvar o = this.removeClass(n, c);\n\t\tn.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;\n\t},\n\n\tremoveClass : function(n, c) {\n\t\tc = n.className.replace(new RegExp(\"(^|\\\\s+)\" + c + \"(\\\\s+|$)\"), ' ');\n\t\treturn n.className = c != ' ' ? c : '';\n\t},\n\n\ttags : function(f, s) {\n\t\treturn f.getElementsByTagName(s);\n\t},\n\n\tmark : function(f, n) {\n\t\tvar s = this.settings;\n\n\t\tthis.addClass(n, s.invalid_cls);\n\t\tn.setAttribute('aria-invalid', 'true');\n\t\tthis.markLabels(f, n, s.invalid_cls);\n\n\t\treturn false;\n\t},\n\n\tmarkLabels : function(f, n, ic) {\n\t\tvar nl, i;\n\n\t\tnl = this.tags(f, \"label\");\n\t\tfor (i=0; i<nl.length; i++) {\n\t\t\tif (nl[i].getAttribute(\"for\") == n.id || nl[i].htmlFor == n.id)\n\t\t\t\tthis.addClass(nl[i], ic);\n\t\t}\n\n\t\treturn null;\n\t}\n};\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tinymce/wp-tinymce.php",
    "content": "<?php\n/**\n * Disable error reporting\n *\n * Set this to error_reporting( -1 ) for debugging.\n */\nerror_reporting(0);\n\n$basepath = dirname(__FILE__);\n\nfunction get_file($path) {\n\n\tif ( function_exists('realpath') )\n\t\t$path = realpath($path);\n\n\tif ( ! $path || ! @is_file($path) )\n\t\treturn false;\n\n\treturn @file_get_contents($path);\n}\n\n$expires_offset = 31536000; // 1 year\n\nheader('Content-Type: application/javascript; charset=UTF-8');\nheader('Vary: Accept-Encoding'); // Handle proxies\nheader('Expires: ' . gmdate( \"D, d M Y H:i:s\", time() + $expires_offset ) . ' GMT');\nheader(\"Cache-Control: public, max-age=$expires_offset\");\n\nif ( isset($_GET['c']) && 1 == $_GET['c'] && isset($_SERVER['HTTP_ACCEPT_ENCODING'])\n\t&& false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && ( $file = get_file($basepath . '/wp-tinymce.js.gz') ) ) {\n\n\theader('Content-Encoding: gzip');\n\techo $file;\n} else {\n\t// Back compat. This file shouldn't be used if this condition can occur (as in, if gzip isn't accepted).\n\techo get_file( $basepath . '/tinymce.min.js' );\n\techo get_file( $basepath . '/plugins/compat3x/plugin.min.js' );\n}\nexit;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/tw-sack.js",
    "content": "/* Simple AJAX Code-Kit (SACK) v1.6.1 */\n/* 2005 Gregory Wild-Smith */\n/* www.twilightuniverse.com */\n/* Software licenced under a modified X11 licence,\n   see documentation or authors website for more details */\n\nfunction sack(file) {\n\tthis.xmlhttp = null;\n\n\tthis.resetData = function() {\n\t\tthis.method = \"POST\";\n  \t\tthis.queryStringSeparator = \"?\";\n\t\tthis.argumentSeparator = \"&\";\n\t\tthis.URLString = \"\";\n\t\tthis.encodeURIString = true;\n  \t\tthis.execute = false;\n  \t\tthis.element = null;\n\t\tthis.elementObj = null;\n\t\tthis.requestFile = file;\n\t\tthis.vars = new Object();\n\t\tthis.responseStatus = new Array(2);\n  \t};\n\n\tthis.resetFunctions = function() {\n  \t\tthis.onLoading = function() { };\n  \t\tthis.onLoaded = function() { };\n  \t\tthis.onInteractive = function() { };\n  \t\tthis.onCompletion = function() { };\n  \t\tthis.onError = function() { };\n\t\tthis.onFail = function() { };\n\t};\n\n\tthis.reset = function() {\n\t\tthis.resetFunctions();\n\t\tthis.resetData();\n\t};\n\n\tthis.createAJAX = function() {\n\t\ttry {\n\t\t\tthis.xmlhttp = new ActiveXObject(\"Msxml2.XMLHTTP\");\n\t\t} catch (e1) {\n\t\t\ttry {\n\t\t\t\tthis.xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\n\t\t\t} catch (e2) {\n\t\t\t\tthis.xmlhttp = null;\n\t\t\t}\n\t\t}\n\n\t\tif (! this.xmlhttp) {\n\t\t\tif (typeof XMLHttpRequest != \"undefined\") {\n\t\t\t\tthis.xmlhttp = new XMLHttpRequest();\n\t\t\t} else {\n\t\t\t\tthis.failed = true;\n\t\t\t}\n\t\t}\n\t};\n\n\tthis.setVar = function(name, value){\n\t\tthis.vars[name] = Array(value, false);\n\t};\n\n\tthis.encVar = function(name, value, returnvars) {\n\t\tif (true == returnvars) {\n\t\t\treturn Array(encodeURIComponent(name), encodeURIComponent(value));\n\t\t} else {\n\t\t\tthis.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);\n\t\t}\n\t}\n\n\tthis.processURLString = function(string, encode) {\n\t\tencoded = encodeURIComponent(this.argumentSeparator);\n\t\tregexp = new RegExp(this.argumentSeparator + \"|\" + encoded);\n\t\tvarArray = string.split(regexp);\n\t\tfor (i = 0; i < varArray.length; i++){\n\t\t\turlVars = varArray[i].split(\"=\");\n\t\t\tif (true == encode){\n\t\t\t\tthis.encVar(urlVars[0], urlVars[1]);\n\t\t\t} else {\n\t\t\t\tthis.setVar(urlVars[0], urlVars[1]);\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.createURLString = function(urlstring) {\n\t\tif (this.encodeURIString && this.URLString.length) {\n\t\t\tthis.processURLString(this.URLString, true);\n\t\t}\n\n\t\tif (urlstring) {\n\t\t\tif (this.URLString.length) {\n\t\t\t\tthis.URLString += this.argumentSeparator + urlstring;\n\t\t\t} else {\n\t\t\t\tthis.URLString = urlstring;\n\t\t\t}\n\t\t}\n\n\t\t// prevents caching of URLString\n\t\tthis.setVar(\"rndval\", new Date().getTime());\n\n\t\turlstringtemp = new Array();\n\t\tfor (key in this.vars) {\n\t\t\tif (false == this.vars[key][1] && true == this.encodeURIString) {\n\t\t\t\tencoded = this.encVar(key, this.vars[key][0], true);\n\t\t\t\tdelete this.vars[key];\n\t\t\t\tthis.vars[encoded[0]] = Array(encoded[1], true);\n\t\t\t\tkey = encoded[0];\n\t\t\t}\n\n\t\t\turlstringtemp[urlstringtemp.length] = key + \"=\" + this.vars[key][0];\n\t\t}\n\t\tif (urlstring){\n\t\t\tthis.URLString += this.argumentSeparator + urlstringtemp.join(this.argumentSeparator);\n\t\t} else {\n\t\t\tthis.URLString += urlstringtemp.join(this.argumentSeparator);\n\t\t}\n\t}\n\n\tthis.runResponse = function() {\n\t\teval(this.response);\n\t}\n\n\tthis.runAJAX = function(urlstring) {\n\t\tif (this.failed) {\n\t\t\tthis.onFail();\n\t\t} else {\n\t\t\tthis.createURLString(urlstring);\n\t\t\tif (this.element) {\n\t\t\t\tthis.elementObj = document.getElementById(this.element);\n\t\t\t}\n\t\t\tif (this.xmlhttp) {\n\t\t\t\tvar self = this;\n\t\t\t\tif (this.method == \"GET\") {\n\t\t\t\t\ttotalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;\n\t\t\t\t\tthis.xmlhttp.open(this.method, totalurlstring, true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.xmlhttp.open(this.method, this.requestFile, true);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.xmlhttp.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\")\n\t\t\t\t\t} catch (e) { }\n\t\t\t\t}\n\n\t\t\t\tthis.xmlhttp.onreadystatechange = function() {\n\t\t\t\t\tswitch (self.xmlhttp.readyState) {\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\tself.onLoading();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tself.onLoaded();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tself.onInteractive();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tself.response = self.xmlhttp.responseText;\n\t\t\t\t\t\t\tself.responseXML = self.xmlhttp.responseXML;\n\t\t\t\t\t\t\tself.responseStatus[0] = self.xmlhttp.status;\n\t\t\t\t\t\t\tself.responseStatus[1] = self.xmlhttp.statusText;\n\n\t\t\t\t\t\t\tif (self.execute) {\n\t\t\t\t\t\t\t\tself.runResponse();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (self.elementObj) {\n\t\t\t\t\t\t\t\telemNodeName = self.elementObj.nodeName;\n\t\t\t\t\t\t\t\telemNodeName.toLowerCase();\n\t\t\t\t\t\t\t\tif (elemNodeName == \"input\"\n\t\t\t\t\t\t\t\t|| elemNodeName == \"select\"\n\t\t\t\t\t\t\t\t|| elemNodeName == \"option\"\n\t\t\t\t\t\t\t\t|| elemNodeName == \"textarea\") {\n\t\t\t\t\t\t\t\t\tself.elementObj.value = self.response;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tself.elementObj.innerHTML = self.response;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (self.responseStatus[0] == \"200\") {\n\t\t\t\t\t\t\t\tself.onCompletion();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tself.onError();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tself.URLString = \"\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tthis.xmlhttp.send(this.URLString);\n\t\t\t}\n\t\t}\n\t};\n\n\tthis.reset();\n\tthis.createAJAX();\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/twemoji.js",
    "content": "/*jslint indent: 2, browser: true, bitwise: true, plusplus: true */\nvar twemoji = (function (\n  /*! Copyright Twitter Inc. and other contributors. Licensed under MIT *//*\n    https://github.com/twitter/twemoji/blob/gh-pages/LICENSE\n  */\n\n  // WARNING:   this file is generated automatically via\n  //            `node twemoji-generator.js`\n  //            please update its `createTwemoji` function\n  //            at the bottom of the same file instead.\n\n) {\n  'use strict';\n\n  /*jshint maxparams:4 */\n\n  var\n    // the exported module object\n    twemoji = {\n\n\n    /////////////////////////\n    //      properties     //\n    /////////////////////////\n\n      // default assets url, by default will be Twitter Inc. CDN\n      base: (location.protocol === 'https:' ? 'https:' : 'http:') +\n            '//twemoji.maxcdn.com/',\n\n      // default assets file extensions, by default '.png'\n      ext: '.png',\n\n      // default assets/folder size, by default \"36x36\"\n      // available via Twitter CDN: 16, 36, 72\n      size: '36x36',\n\n      // default class name, by default 'emoji'\n      className: 'emoji',\n\n      // basic utilities / helpers to convert code points\n      // to JavaScript surrogates and vice versa\n      convert: {\n\n        /**\n         * Given an HEX codepoint, returns UTF16 surrogate pairs.\n         *\n         * @param   string  generic codepoint, i.e. '1F4A9'\n         * @return  string  codepoint transformed into utf16 surrogates pair,\n         *          i.e. \\uD83D\\uDCA9\n         *\n         * @example\n         *  twemoji.convert.fromCodePoint('1f1e8');\n         *  // \"\\ud83c\\udde8\"\n         *\n         *  '1f1e8-1f1f3'.split('-').map(twemoji.convert.fromCodePoint).join('')\n         *  // \"\\ud83c\\udde8\\ud83c\\uddf3\"\n         */\n        fromCodePoint: fromCodePoint,\n\n        /**\n         * Given UTF16 surrogate pairs, returns the equivalent HEX codepoint.\n         *\n         * @param   string  generic utf16 surrogates pair, i.e. \\uD83D\\uDCA9\n         * @param   string  optional separator for double code points, default='-'\n         * @return  string  utf16 transformed into codepoint, i.e. '1F4A9'\n         *\n         * @example\n         *  twemoji.convert.toCodePoint('\\ud83c\\udde8\\ud83c\\uddf3');\n         *  // \"1f1e8-1f1f3\"\n         *\n         *  twemoji.convert.toCodePoint('\\ud83c\\udde8\\ud83c\\uddf3', '~');\n         *  // \"1f1e8~1f1f3\"\n         */\n        toCodePoint: toCodePoint\n      },\n\n\n    /////////////////////////\n    //       methods       //\n    /////////////////////////\n\n      /**\n       * User first: used to remove missing images\n       * preserving the original text intent when\n       * a fallback for network problems is desired.\n       * Automatically added to Image nodes via DOM\n       * It could be recycled for string operations via:\n       *  $('img.emoji').on('error', twemoji.onerror)\n       */\n      onerror: function onerror() {\n        if (this.parentNode) {\n          this.parentNode.replaceChild(createText(this.alt), this);\n        }\n      },\n\n      /**\n       * Main method/logic to generate either <img> tags or HTMLImage nodes.\n       *  \"emojify\" a generic text or DOM Element.\n       *\n       * @overloads\n       *\n       * String replacement for `innerHTML` or server side operations\n       *  twemoji.parse(string);\n       *  twemoji.parse(string, Function);\n       *  twemoji.parse(string, Object);\n       *\n       * HTMLElement tree parsing for safer operations over existing DOM\n       *  twemoji.parse(HTMLElement);\n       *  twemoji.parse(HTMLElement, Function);\n       *  twemoji.parse(HTMLElement, Object);\n       *\n       * @param   string|HTMLElement  the source to parse and enrich with emoji.\n       *\n       *          string              replace emoji matches with <img> tags.\n       *                              Mainly used to inject emoji via `innerHTML`\n       *                              It does **not** parse the string or validate it,\n       *                              it simply replaces found emoji with a tag.\n       *                              NOTE: be sure this won't affect security.\n       *\n       *          HTMLElement         walk through the DOM tree and find emoji\n       *                              that are inside **text node only** (nodeType === 3)\n       *                              Mainly used to put emoji in already generated DOM\n       *                              without compromising surrounding nodes and\n       *                              **avoiding** the usage of `innerHTML`.\n       *                              NOTE: Using DOM elements instead of strings should\n       *                              improve security without compromising too much\n       *                              performance compared with a less safe `innerHTML`.\n       *\n       * @param   Function|Object  [optional]\n       *                              either the callback that will be invoked or an object\n       *                              with all properties to use per each found emoji.\n       *\n       *          Function            if specified, this will be invoked per each emoji\n       *                              that has been found through the RegExp except\n       *                              those follwed by the invariant \\uFE0E (\"as text\").\n       *                              Once invoked, parameters will be:\n       *\n       *                                codePoint:string  the lower case HEX code point\n       *                                                  i.e. \"1f4a9\"\n       *\n       *                                options:Object    all info for this parsing operation\n       *\n       *                                variant:char      the optional \\uFE0F (\"as image\")\n       *                                                  variant, in case this info\n       *                                                  is anyhow meaningful.\n       *                                                  By default this is ignored.\n       *\n       *                              If such callback will return a falsy value instead\n       *                              of a valid `src` to use for the image, nothing will\n       *                              actually change for that specific emoji.\n       *\n       *\n       *          Object              if specified, an object containing the following properties\n       *\n       *            callback   Function  the callback to invoke per each found emoji.\n       *            base       string    the base url, by default twemoji.base\n       *            ext        string    the image extension, by default twemoji.ext\n       *            size       string    the assets size, by default twemoji.size\n       *\n       * @example\n       *\n       *  twemoji.parse(\"I \\u2764\\uFE0F emoji!\");\n       *  // I <img class=\"emoji\" draggable=\"false\" alt=\"❤️\" src=\"/assets/2764.gif\"> emoji!\n       *\n       *\n       *  twemoji.parse(\"I \\u2764\\uFE0F emoji!\", function(icon, options, variant) {\n       *    return '/assets/' + icon + '.gif';\n       *  });\n       *  // I <img class=\"emoji\" draggable=\"false\" alt=\"❤️\" src=\"/assets/2764.gif\"> emoji!\n       *\n       *\n       * twemoji.parse(\"I \\u2764\\uFE0F emoji!\", {\n       *   size: 72,\n       *   callback: function(icon, options, variant) {\n       *     return '/assets/' + options.size + '/' + icon + options.ext;\n       *   }\n       * });\n       *  // I <img class=\"emoji\" draggable=\"false\" alt=\"❤️\" src=\"/assets/72x72/2764.png\"> emoji!\n       *\n       */\n      parse: parse,\n\n      /**\n       * Given a string, invokes the callback argument\n       *  per each emoji found in such string.\n       * This is the most raw version used by\n       *  the .parse(string) method itself.\n       *\n       * @param   string    generic string to parse\n       * @param   Function  a generic callback that will be\n       *                    invoked to replace the content.\n       *                    This calback wil receive standard\n       *                    String.prototype.replace(str, callback)\n       *                    arguments such:\n       *  callback(\n       *    match,  // the emoji match\n       *    icon,   // the emoji text (same as text)\n       *    variant // either '\\uFE0E' or '\\uFE0F', if present\n       *  );\n       *\n       *                    and others commonly received via replace.\n       *\n       *  NOTE: When the variant \\uFE0E is found, remember this is an explicit intent\n       *  from the user: the emoji should **not** be replaced with an image.\n       *  In \\uFE0F case one, it's the opposite, it should be graphic.\n       *  This utility convetion is that only \\uFE0E are not translated into images.\n       */\n      replace: replace,\n\n      /**\n       * Simplify string tests against emoji.\n       *\n       * @param   string  some text that might contain emoji\n       * @return  boolean true if any emoji was found, false otherwise.\n       *\n       * @example\n       *\n       *  if (twemoji.test(someContent)) {\n       *    console.log(\"emoji All The Things!\");\n       *  }\n       */\n      test: test\n    },\n\n    // used to escape HTML special chars in attributes\n    escaper = {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      \"'\": '&#39;',\n      '\"': '&quot;'\n    },\n\n    // RegExp based on emoji's official Unicode standards\n    // http://www.unicode.org/Public/UNIDATA/EmojiSources.txt\n    re = /((?:\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc67|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67|\\ud83c\\uddf7\\ud83c\\uddf8|\\ud83d\\udd95\\ud83c\\udffd|\\ud83d\\udd95\\ud83c\\udffc|\\ud83d\\udd95\\ud83c\\udffb|\\ud83d\\udd90\\ud83c\\udfff|\\ud83d\\udd90\\ud83c\\udffe|\\ud83d\\udd90\\ud83c\\udffd|\\ud83d\\udd90\\ud83c\\udffc|\\ud83d\\udd90\\ud83c\\udffb|\\ud83d\\udcaa\\ud83c\\udfff|\\ud83d\\udcaa\\ud83c\\udffe|\\ud83d\\udcaa\\ud83c\\udffd|\\ud83d\\udcaa\\ud83c\\udffc|\\ud83d\\udcaa\\ud83c\\udffb|\\ud83d\\udc87\\ud83c\\udfff|\\ud83d\\udc87\\ud83c\\udffe|\\ud83d\\udc87\\ud83c\\udffd|\\ud83d\\udc87\\ud83c\\udffc|\\ud83d\\udc87\\ud83c\\udffb|\\ud83d\\udc86\\ud83c\\udfff|\\ud83d\\udc86\\ud83c\\udffe|\\ud83d\\udc86\\ud83c\\udffd|\\ud83e\\udd18\\ud83c\\udfff|\\ud83e\\udd18\\ud83c\\udffe|\\ud83e\\udd18\\ud83c\\udffd|\\ud83e\\udd18\\ud83c\\udffc|\\ud83e\\udd18\\ud83c\\udffb|\\ud83d\\udec0\\ud83c\\udfff|\\ud83d\\udec0\\ud83c\\udffe|\\ud83d\\udec0\\ud83c\\udffd|\\ud83d\\udec0\\ud83c\\udffc|\\ud83d\\udec0\\ud83c\\udffb|\\ud83d\\udeb6\\ud83c\\udfff|\\ud83d\\udeb6\\ud83c\\udffe|\\ud83d\\udeb6\\ud83c\\udffd|\\ud83d\\udeb6\\ud83c\\udffc|\\ud83d\\udeb6\\ud83c\\udffb|\\ud83d\\udeb5\\ud83c\\udfff|\\ud83d\\udeb5\\ud83c\\udffe|\\ud83d\\udeb5\\ud83c\\udffd|\\ud83d\\udeb5\\ud83c\\udffc|\\ud83d\\udeb5\\ud83c\\udffb|\\ud83d\\udeb4\\ud83c\\udfff|\\ud83d\\udeb4\\ud83c\\udffe|\\ud83d\\udeb4\\ud83c\\udffd|\\ud83d\\udeb4\\ud83c\\udffc|\\ud83d\\udeb4\\ud83c\\udffb|\\ud83d\\udea3\\ud83c\\udfff|\\ud83d\\udea3\\ud83c\\udffe|\\ud83d\\udea3\\ud83c\\udffd|\\ud83d\\udea3\\ud83c\\udffc|\\ud83d\\udea3\\ud83c\\udffb|\\ud83d\\ude4f\\ud83c\\udfff|\\ud83d\\ude4f\\ud83c\\udffe|\\ud83d\\ude4f\\ud83c\\udffd|\\ud83d\\ude4f\\ud83c\\udffc|\\ud83d\\ude4f\\ud83c\\udffb|\\ud83d\\ude4e\\ud83c\\udfff|\\ud83d\\ude4e\\ud83c\\udffe|\\ud83d\\ude4e\\ud83c\\udffd|\\ud83d\\ude4e\\ud83c\\udffc|\\ud83d\\ude4e\\ud83c\\udffb|\\ud83d\\ude4d\\ud83c\\udfff|\\ud83d\\ude4d\\ud83c\\udffe|\\ud83d\\ude4d\\ud83c\\udffd|\\ud83d\\ude4d\\ud83c\\udffc|\\ud83d\\ude4d\\ud83c\\udffb|\\ud83d\\ude4c\\ud83c\\udfff|\\ud83d\\ude4c\\ud83c\\udffe|\\ud83d\\ude4c\\ud83c\\udffd|\\ud83d\\ude4c\\ud83c\\udffc|\\ud83d\\ude4c\\ud83c\\udffb|\\ud83d\\ude4b\\ud83c\\udfff|\\ud83d\\ude4b\\ud83c\\udffe|\\ud83d\\ude4b\\ud83c\\udffd|\\ud83d\\ude4b\\ud83c\\udffc|\\ud83d\\ude4b\\ud83c\\udffb|\\ud83d\\ude47\\ud83c\\udfff|\\ud83d\\ude47\\ud83c\\udffe|\\ud83c\\udde8\\ud83c\\uddf3|\\ud83c\\udde9\\ud83c\\uddea|\\ud83c\\uddea\\ud83c\\uddf8|\\ud83c\\uddeb\\ud83c\\uddf7|\\ud83c\\uddec\\ud83c\\udde7|\\ud83c\\uddee\\ud83c\\uddf9|\\ud83c\\uddef\\ud83c\\uddf5|\\ud83c\\uddf0\\ud83c\\uddf7|\\ud83c\\uddf7\\ud83c\\uddfa|\\ud83c\\uddfa\\ud83c\\uddf8|\\ud83d\\udc86\\ud83c\\udffc|\\ud83d\\ude47\\ud83c\\udffd|\\ud83d\\ude47\\ud83c\\udffc|\\ud83d\\udc86\\ud83c\\udffb|\\ud83d\\udc85\\ud83c\\udfff|\\ud83d\\udc85\\ud83c\\udffe|\\ud83d\\udc85\\ud83c\\udffd|\\ud83d\\udc85\\ud83c\\udffc|\\ud83d\\udc85\\ud83c\\udffb|\\ud83d\\udc83\\ud83c\\udfff|\\ud83d\\udc83\\ud83c\\udffe|\\ud83d\\udc83\\ud83c\\udffd|\\ud83d\\udc83\\ud83c\\udffc|\\ud83d\\udc83\\ud83c\\udffb|\\ud83d\\udc82\\ud83c\\udfff|\\ud83c\\udde6\\ud83c\\udde8|\\ud83c\\udde6\\ud83c\\udde9|\\ud83c\\udde6\\ud83c\\uddea|\\ud83c\\udde6\\ud83c\\uddeb|\\ud83c\\udde6\\ud83c\\uddec|\\ud83c\\udde6\\ud83c\\uddee|\\ud83c\\udde6\\ud83c\\uddf1|\\ud83c\\udde6\\ud83c\\uddf2|\\ud83c\\udde6\\ud83c\\uddf4|\\ud83c\\udde6\\ud83c\\uddf6|\\ud83c\\udde6\\ud83c\\uddf7|\\ud83c\\udde6\\ud83c\\uddf8|\\ud83c\\udde6\\ud83c\\uddf9|\\ud83c\\udde6\\ud83c\\uddfa|\\ud83c\\udde6\\ud83c\\uddfc|\\ud83c\\udde6\\ud83c\\uddfd|\\ud83c\\udde6\\ud83c\\uddff|\\ud83c\\udde7\\ud83c\\udde6|\\ud83c\\udde7\\ud83c\\udde7|\\ud83c\\udde7\\ud83c\\udde9|\\ud83c\\udde7\\ud83c\\uddea|\\ud83c\\udde7\\ud83c\\uddeb|\\ud83c\\udde7\\ud83c\\uddec|\\ud83c\\udde7\\ud83c\\udded|\\ud83c\\udde7\\ud83c\\uddee|\\ud83c\\udde7\\ud83c\\uddef|\\ud83c\\udde7\\ud83c\\uddf1|\\ud83c\\udde7\\ud83c\\uddf2|\\ud83c\\udde7\\ud83c\\uddf3|\\ud83c\\udde7\\ud83c\\uddf4|\\ud83c\\udde7\\ud83c\\uddf6|\\ud83c\\udde7\\ud83c\\uddf7|\\ud83c\\udde7\\ud83c\\uddf8|\\ud83c\\udde7\\ud83c\\uddf9|\\ud83c\\udde7\\ud83c\\uddfb|\\ud83c\\udde7\\ud83c\\uddfc|\\ud83c\\udde7\\ud83c\\uddfe|\\ud83c\\udde7\\ud83c\\uddff|\\ud83c\\udde8\\ud83c\\udde6|\\ud83c\\udde8\\ud83c\\udde8|\\ud83c\\udde8\\ud83c\\udde9|\\ud83c\\udde8\\ud83c\\uddeb|\\ud83c\\udde8\\ud83c\\uddec|\\ud83c\\udde8\\ud83c\\udded|\\ud83c\\udde8\\ud83c\\uddee|\\ud83c\\udde8\\ud83c\\uddf0|\\ud83c\\udde8\\ud83c\\uddf1|\\ud83c\\udde8\\ud83c\\uddf2|\\ud83c\\udde8\\ud83c\\uddf4|\\ud83c\\udde8\\ud83c\\uddf5|\\ud83c\\udde8\\ud83c\\uddf7|\\ud83c\\udde8\\ud83c\\uddfa|\\ud83c\\udde8\\ud83c\\uddfb|\\ud83c\\udde8\\ud83c\\uddfc|\\ud83c\\udde8\\ud83c\\uddfd|\\ud83c\\udde8\\ud83c\\uddfe|\\ud83c\\udde8\\ud83c\\uddff|\\ud83c\\udde9\\ud83c\\uddec|\\ud83c\\udde9\\ud83c\\uddef|\\ud83c\\udde9\\ud83c\\uddf0|\\ud83c\\udde9\\ud83c\\uddf2|\\ud83c\\udde9\\ud83c\\uddf4|\\ud83c\\udde9\\ud83c\\uddff|\\ud83c\\uddea\\ud83c\\udde6|\\ud83c\\uddea\\ud83c\\udde8|\\ud83c\\uddea\\ud83c\\uddea|\\ud83c\\uddea\\ud83c\\uddec|\\ud83c\\uddea\\ud83c\\udded|\\ud83c\\uddea\\ud83c\\uddf7|\\ud83c\\uddea\\ud83c\\uddf9|\\ud83c\\uddea\\ud83c\\uddfa|\\ud83c\\uddeb\\ud83c\\uddee|\\ud83c\\uddeb\\ud83c\\uddef|\\ud83c\\uddeb\\ud83c\\uddf0|\\ud83c\\uddeb\\ud83c\\uddf2|\\ud83c\\uddeb\\ud83c\\uddf4|\\ud83c\\uddec\\ud83c\\udde6|\\ud83c\\uddec\\ud83c\\udde9|\\ud83c\\uddec\\ud83c\\uddea|\\ud83c\\uddec\\ud83c\\uddeb|\\ud83c\\uddec\\ud83c\\uddec|\\ud83c\\uddec\\ud83c\\udded|\\ud83c\\uddec\\ud83c\\uddee|\\ud83c\\uddec\\ud83c\\uddf1|\\ud83c\\uddec\\ud83c\\uddf2|\\ud83c\\uddec\\ud83c\\uddf3|\\ud83c\\uddec\\ud83c\\uddf5|\\ud83c\\uddec\\ud83c\\uddf6|\\ud83c\\uddec\\ud83c\\uddf7|\\ud83c\\uddec\\ud83c\\uddf8|\\ud83c\\uddec\\ud83c\\uddf9|\\ud83c\\uddec\\ud83c\\uddfa|\\ud83c\\uddec\\ud83c\\uddfc|\\ud83c\\uddec\\ud83c\\uddfe|\\ud83c\\udded\\ud83c\\uddf0|\\ud83c\\udded\\ud83c\\uddf2|\\ud83c\\udded\\ud83c\\uddf3|\\ud83c\\udded\\ud83c\\uddf7|\\ud83c\\udded\\ud83c\\uddf9|\\ud83c\\udded\\ud83c\\uddfa|\\ud83c\\uddee\\ud83c\\udde8|\\ud83c\\uddee\\ud83c\\udde9|\\ud83c\\uddee\\ud83c\\uddea|\\ud83c\\uddee\\ud83c\\uddf1|\\ud83c\\uddee\\ud83c\\uddf2|\\ud83c\\uddee\\ud83c\\uddf3|\\ud83c\\uddee\\ud83c\\uddf4|\\ud83c\\uddee\\ud83c\\uddf6|\\ud83c\\uddee\\ud83c\\uddf7|\\ud83c\\uddee\\ud83c\\uddf8|\\ud83c\\uddef\\ud83c\\uddea|\\ud83c\\uddef\\ud83c\\uddf2|\\ud83c\\uddef\\ud83c\\uddf4|\\ud83c\\uddf0\\ud83c\\uddea|\\ud83c\\uddf0\\ud83c\\uddec|\\ud83c\\uddf0\\ud83c\\udded|\\ud83c\\uddf0\\ud83c\\uddee|\\ud83c\\uddf0\\ud83c\\uddf2|\\ud83c\\uddf0\\ud83c\\uddf3|\\ud83c\\uddf0\\ud83c\\uddf5|\\ud83c\\uddf0\\ud83c\\uddfc|\\ud83c\\uddf0\\ud83c\\uddfe|\\ud83c\\uddf0\\ud83c\\uddff|\\ud83c\\uddf1\\ud83c\\udde6|\\ud83c\\uddf1\\ud83c\\udde7|\\ud83c\\uddf1\\ud83c\\udde8|\\ud83c\\uddf1\\ud83c\\uddee|\\ud83c\\uddf1\\ud83c\\uddf0|\\ud83c\\uddf1\\ud83c\\uddf7|\\ud83c\\uddf1\\ud83c\\uddf8|\\ud83c\\uddf1\\ud83c\\uddf9|\\ud83c\\uddf1\\ud83c\\uddfa|\\ud83c\\uddf1\\ud83c\\uddfb|\\ud83c\\uddf1\\ud83c\\uddfe|\\ud83c\\uddf2\\ud83c\\udde6|\\ud83c\\uddf2\\ud83c\\udde8|\\ud83c\\uddf2\\ud83c\\udde9|\\ud83c\\uddf2\\ud83c\\uddea|\\ud83c\\uddf2\\ud83c\\uddeb|\\ud83c\\uddf2\\ud83c\\uddec|\\ud83c\\uddf2\\ud83c\\udded|\\ud83c\\uddf2\\ud83c\\uddf0|\\ud83c\\uddf2\\ud83c\\uddf1|\\ud83c\\uddf2\\ud83c\\uddf2|\\ud83c\\uddf2\\ud83c\\uddf3|\\ud83c\\uddf2\\ud83c\\uddf4|\\ud83c\\uddf2\\ud83c\\uddf5|\\ud83c\\uddf2\\ud83c\\uddf6|\\ud83c\\uddf2\\ud83c\\uddf7|\\ud83c\\uddf2\\ud83c\\uddf8|\\ud83c\\uddf2\\ud83c\\uddf9|\\ud83c\\uddf2\\ud83c\\uddfa|\\ud83c\\uddf2\\ud83c\\uddfb|\\ud83c\\uddf2\\ud83c\\uddfc|\\ud83c\\uddf2\\ud83c\\uddfd|\\ud83c\\uddf2\\ud83c\\uddfe|\\ud83c\\uddf2\\ud83c\\uddff|\\ud83c\\uddf3\\ud83c\\udde6|\\ud83c\\uddf3\\ud83c\\udde8|\\ud83c\\uddf3\\ud83c\\uddea|\\ud83c\\uddf3\\ud83c\\uddeb|\\ud83c\\uddf3\\ud83c\\uddec|\\ud83c\\uddf3\\ud83c\\uddee|\\ud83c\\uddf3\\ud83c\\uddf1|\\ud83c\\uddf3\\ud83c\\uddf4|\\ud83c\\uddf3\\ud83c\\uddf5|\\ud83c\\uddf3\\ud83c\\uddf7|\\ud83c\\uddf3\\ud83c\\uddfa|\\ud83c\\uddf3\\ud83c\\uddff|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c\\udde6|\\ud83c\\uddf5\\ud83c\\uddea|\\ud83c\\uddf5\\ud83c\\uddeb|\\ud83c\\uddf5\\ud83c\\uddec|\\ud83c\\uddf5\\ud83c\\udded|\\ud83c\\uddf5\\ud83c\\uddf0|\\ud83c\\uddf5\\ud83c\\uddf1|\\ud83c\\uddf5\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c\\uddf3|\\ud83c\\uddf5\\ud83c\\uddf7|\\ud83c\\uddf5\\ud83c\\uddf8|\\ud83c\\uddf5\\ud83c\\uddf9|\\ud83c\\uddf5\\ud83c\\uddfc|\\ud83c\\uddf5\\ud83c\\uddfe|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c\\uddea|\\ud83c\\uddf7\\ud83c\\uddf4|\\ud83d\\udc82\\ud83c\\udffe|\\ud83c\\uddf7\\ud83c\\uddfc|\\ud83c\\uddf8\\ud83c\\udde6|\\ud83c\\uddf8\\ud83c\\udde7|\\ud83c\\uddf8\\ud83c\\udde8|\\ud83c\\uddf8\\ud83c\\udde9|\\ud83c\\uddf8\\ud83c\\uddea|\\ud83c\\uddf8\\ud83c\\uddec|\\ud83c\\uddf8\\ud83c\\udded|\\ud83c\\uddf8\\ud83c\\uddee|\\ud83c\\uddf8\\ud83c\\uddef|\\ud83c\\uddf8\\ud83c\\uddf0|\\ud83c\\uddf8\\ud83c\\uddf1|\\ud83c\\uddf8\\ud83c\\uddf2|\\ud83c\\uddf8\\ud83c\\uddf3|\\ud83c\\uddf8\\ud83c\\uddf4|\\ud83c\\uddf8\\ud83c\\uddf7|\\ud83c\\uddf8\\ud83c\\uddf8|\\ud83c\\uddf8\\ud83c\\uddf9|\\ud83c\\uddf8\\ud83c\\uddfb|\\ud83c\\uddf8\\ud83c\\uddfd|\\ud83c\\uddf8\\ud83c\\uddfe|\\ud83c\\uddf8\\ud83c\\uddff|\\ud83c\\uddf9\\ud83c\\udde6|\\ud83c\\uddf9\\ud83c\\udde8|\\ud83c\\uddf9\\ud83c\\udde9|\\ud83c\\uddf9\\ud83c\\uddeb|\\ud83c\\uddf9\\ud83c\\uddec|\\ud83c\\uddf9\\ud83c\\udded|\\ud83c\\uddf9\\ud83c\\uddef|\\ud83c\\uddf9\\ud83c\\uddf0|\\ud83c\\uddf9\\ud83c\\uddf1|\\ud83c\\uddf9\\ud83c\\uddf2|\\ud83c\\uddf9\\ud83c\\uddf3|\\ud83c\\uddf9\\ud83c\\uddf4|\\ud83c\\uddf9\\ud83c\\uddf7|\\ud83c\\uddf9\\ud83c\\uddf9|\\ud83c\\uddf9\\ud83c\\uddfb|\\ud83c\\uddf9\\ud83c\\uddfc|\\ud83c\\uddf9\\ud83c\\uddff|\\ud83c\\uddfa\\ud83c\\udde6|\\ud83c\\uddfa\\ud83c\\uddec|\\ud83c\\uddfa\\ud83c\\uddf2|\\ud83c\\uddfa\\ud83c\\uddfe|\\ud83c\\uddfa\\ud83c\\uddff|\\ud83c\\uddfb\\ud83c\\udde6|\\ud83c\\uddfb\\ud83c\\udde8|\\ud83c\\uddfb\\ud83c\\uddea|\\ud83c\\uddfb\\ud83c\\uddec|\\ud83c\\uddfb\\ud83c\\uddee|\\ud83c\\uddfb\\ud83c\\uddf3|\\ud83c\\uddfb\\ud83c\\uddfa|\\ud83c\\uddfc\\ud83c\\uddeb|\\ud83c\\uddfc\\ud83c\\uddf8|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c\\uddea|\\ud83c\\uddfe\\ud83c\\uddf9|\\ud83c\\uddff\\ud83c\\udde6|\\ud83c\\uddff\\ud83c\\uddf2|\\ud83c\\uddff\\ud83c\\uddfc|\\ud83c\\udf85\\ud83c\\udffb|\\ud83c\\udf85\\ud83c\\udffc|\\ud83c\\udf85\\ud83c\\udffd|\\ud83c\\udf85\\ud83c\\udffe|\\ud83c\\udf85\\ud83c\\udfff|\\ud83c\\udfc3\\ud83c\\udffb|\\ud83c\\udfc3\\ud83c\\udffc|\\ud83c\\udfc3\\ud83c\\udffd|\\ud83c\\udfc3\\ud83c\\udffe|\\ud83c\\udfc3\\ud83c\\udfff|\\ud83c\\udfc4\\ud83c\\udffb|\\ud83c\\udfc4\\ud83c\\udffc|\\ud83c\\udfc4\\ud83c\\udffd|\\ud83c\\udfc4\\ud83c\\udffe|\\ud83c\\udfc4\\ud83c\\udfff|\\ud83c\\udfc7\\ud83c\\udffb|\\ud83c\\udfc7\\ud83c\\udffc|\\ud83c\\udfc7\\ud83c\\udffd|\\ud83c\\udfc7\\ud83c\\udffe|\\ud83c\\udfc7\\ud83c\\udfff|\\ud83c\\udfca\\ud83c\\udffb|\\ud83c\\udfca\\ud83c\\udffc|\\ud83c\\udfca\\ud83c\\udffd|\\ud83c\\udfca\\ud83c\\udffe|\\ud83c\\udfca\\ud83c\\udfff|\\ud83c\\udfcb\\ud83c\\udffb|\\ud83c\\udfcb\\ud83c\\udffc|\\ud83c\\udfcb\\ud83c\\udffd|\\ud83c\\udfcb\\ud83c\\udffe|\\ud83c\\udfcb\\ud83c\\udfff|\\ud83d\\udc42\\ud83c\\udffb|\\ud83d\\udc42\\ud83c\\udffc|\\ud83d\\udc42\\ud83c\\udffd|\\ud83d\\udc42\\ud83c\\udffe|\\ud83d\\udc42\\ud83c\\udfff|\\ud83d\\udc43\\ud83c\\udffb|\\ud83d\\udc43\\ud83c\\udffc|\\ud83d\\udc43\\ud83c\\udffd|\\ud83d\\udc43\\ud83c\\udffe|\\ud83d\\udc43\\ud83c\\udfff|\\ud83d\\udc46\\ud83c\\udffb|\\ud83d\\udc46\\ud83c\\udffc|\\ud83d\\udc46\\ud83c\\udffd|\\ud83d\\udc46\\ud83c\\udffe|\\ud83d\\udc46\\ud83c\\udfff|\\ud83d\\udc47\\ud83c\\udffb|\\ud83d\\udc47\\ud83c\\udffc|\\ud83d\\udc47\\ud83c\\udffd|\\ud83d\\udc47\\ud83c\\udffe|\\ud83d\\udc47\\ud83c\\udfff|\\ud83d\\udc48\\ud83c\\udffb|\\ud83d\\udc48\\ud83c\\udffc|\\ud83d\\udc48\\ud83c\\udffd|\\ud83d\\udc48\\ud83c\\udffe|\\ud83d\\udc48\\ud83c\\udfff|\\ud83d\\udc49\\ud83c\\udffb|\\ud83d\\udc49\\ud83c\\udffc|\\ud83d\\udc49\\ud83c\\udffd|\\ud83d\\udc49\\ud83c\\udffe|\\ud83d\\udc49\\ud83c\\udfff|\\ud83d\\udc4a\\ud83c\\udffb|\\ud83d\\udc4a\\ud83c\\udffc|\\ud83d\\udc4a\\ud83c\\udffd|\\ud83d\\udc4a\\ud83c\\udffe|\\ud83d\\udc4a\\ud83c\\udfff|\\ud83d\\udc4b\\ud83c\\udffb|\\ud83d\\udc4b\\ud83c\\udffc|\\ud83d\\udc4b\\ud83c\\udffd|\\ud83d\\udc4b\\ud83c\\udffe|\\ud83d\\udc4b\\ud83c\\udfff|\\ud83d\\udc4c\\ud83c\\udffb|\\ud83d\\udc4c\\ud83c\\udffc|\\ud83d\\udc4c\\ud83c\\udffd|\\ud83d\\udc4c\\ud83c\\udffe|\\ud83d\\udc4c\\ud83c\\udfff|\\ud83d\\udc4d\\ud83c\\udffb|\\ud83d\\udc4d\\ud83c\\udffc|\\ud83d\\udc4d\\ud83c\\udffd|\\ud83d\\udc4d\\ud83c\\udffe|\\ud83d\\udc4d\\ud83c\\udfff|\\ud83d\\udc4e\\ud83c\\udffb|\\ud83d\\udc4e\\ud83c\\udffc|\\ud83d\\udc4e\\ud83c\\udffd|\\ud83d\\udc4e\\ud83c\\udffe|\\ud83d\\udc4e\\ud83c\\udfff|\\ud83d\\udc4f\\ud83c\\udffb|\\ud83d\\udc4f\\ud83c\\udffc|\\ud83d\\udc4f\\ud83c\\udffd|\\ud83d\\udc4f\\ud83c\\udffe|\\ud83d\\udc4f\\ud83c\\udfff|\\ud83d\\udc50\\ud83c\\udffb|\\ud83d\\udc50\\ud83c\\udffc|\\ud83d\\udc50\\ud83c\\udffd|\\ud83d\\udc50\\ud83c\\udffe|\\ud83d\\udc50\\ud83c\\udfff|\\ud83d\\udc66\\ud83c\\udffb|\\ud83d\\udc66\\ud83c\\udffc|\\ud83d\\udc66\\ud83c\\udffd|\\ud83d\\udc66\\ud83c\\udffe|\\ud83d\\udc66\\ud83c\\udfff|\\ud83d\\udc67\\ud83c\\udffb|\\ud83d\\udc67\\ud83c\\udffc|\\ud83d\\udc67\\ud83c\\udffd|\\ud83d\\udc67\\ud83c\\udffe|\\ud83d\\udc67\\ud83c\\udfff|\\ud83d\\udc68\\ud83c\\udffb|\\ud83d\\udc68\\ud83c\\udffc|\\ud83d\\udc68\\ud83c\\udffd|\\ud83d\\udc68\\ud83c\\udffe|\\ud83d\\udc68\\ud83c\\udfff|\\ud83d\\ude47\\ud83c\\udffb|\\ud83d\\ude46\\ud83c\\udfff|\\ud83d\\ude46\\ud83c\\udffe|\\ud83d\\ude46\\ud83c\\udffd|\\ud83d\\ude46\\ud83c\\udffc|\\ud83d\\ude46\\ud83c\\udffb|\\ud83d\\ude45\\ud83c\\udfff|\\ud83d\\ude45\\ud83c\\udffe|\\ud83d\\ude45\\ud83c\\udffd|\\ud83d\\ude45\\ud83c\\udffc|\\ud83d\\ude45\\ud83c\\udffb|\\ud83d\\udc69\\ud83c\\udffb|\\ud83d\\udc69\\ud83c\\udffc|\\ud83d\\udc69\\ud83c\\udffd|\\ud83d\\udc69\\ud83c\\udffe|\\ud83d\\udc69\\ud83c\\udfff|\\ud83d\\udd96\\ud83c\\udfff|\\ud83d\\udd96\\ud83c\\udffe|\\ud83d\\udd96\\ud83c\\udffd|\\ud83d\\udd96\\ud83c\\udffc|\\ud83d\\udd96\\ud83c\\udffb|\\ud83d\\udd95\\ud83c\\udfff|\\ud83d\\udd95\\ud83c\\udffe|\\ud83d\\udc6e\\ud83c\\udffb|\\ud83d\\udc6e\\ud83c\\udffc|\\ud83d\\udc6e\\ud83c\\udffd|\\ud83d\\udc6e\\ud83c\\udffe|\\ud83d\\udc6e\\ud83c\\udfff|\\ud83d\\udc70\\ud83c\\udffb|\\ud83d\\udc70\\ud83c\\udffc|\\ud83d\\udc70\\ud83c\\udffd|\\ud83d\\udc70\\ud83c\\udffe|\\ud83d\\udc70\\ud83c\\udfff|\\ud83d\\udc71\\ud83c\\udffb|\\ud83d\\udc71\\ud83c\\udffc|\\ud83d\\udc71\\ud83c\\udffd|\\ud83d\\udc71\\ud83c\\udffe|\\ud83d\\udc71\\ud83c\\udfff|\\ud83d\\udc72\\ud83c\\udffb|\\ud83d\\udc72\\ud83c\\udffc|\\ud83d\\udc72\\ud83c\\udffd|\\ud83d\\udc72\\ud83c\\udffe|\\ud83d\\udc72\\ud83c\\udfff|\\ud83d\\udc73\\ud83c\\udffb|\\ud83d\\udc73\\ud83c\\udffc|\\ud83d\\udc73\\ud83c\\udffd|\\ud83d\\udc73\\ud83c\\udffe|\\ud83d\\udc73\\ud83c\\udfff|\\ud83d\\udc74\\ud83c\\udffb|\\ud83d\\udc74\\ud83c\\udffc|\\ud83d\\udc74\\ud83c\\udffd|\\ud83d\\udc74\\ud83c\\udffe|\\ud83d\\udc74\\ud83c\\udfff|\\ud83d\\udc75\\ud83c\\udffb|\\ud83d\\udc75\\ud83c\\udffc|\\ud83d\\udc75\\ud83c\\udffd|\\ud83d\\udc75\\ud83c\\udffe|\\ud83d\\udc75\\ud83c\\udfff|\\ud83d\\udc76\\ud83c\\udffb|\\ud83d\\udc76\\ud83c\\udffc|\\ud83d\\udc76\\ud83c\\udffd|\\ud83d\\udc76\\ud83c\\udffe|\\ud83d\\udc76\\ud83c\\udfff|\\ud83d\\udc77\\ud83c\\udffb|\\ud83d\\udc77\\ud83c\\udffc|\\ud83d\\udc77\\ud83c\\udffd|\\ud83d\\udc77\\ud83c\\udffe|\\ud83d\\udc77\\ud83c\\udfff|\\ud83d\\udc78\\ud83c\\udffb|\\ud83d\\udc78\\ud83c\\udffc|\\ud83d\\udc78\\ud83c\\udffd|\\ud83d\\udc78\\ud83c\\udffe|\\ud83d\\udc78\\ud83c\\udfff|\\ud83d\\udc7c\\ud83c\\udffb|\\ud83d\\udc7c\\ud83c\\udffc|\\ud83d\\udc7c\\ud83c\\udffd|\\ud83d\\udc7c\\ud83c\\udffe|\\ud83d\\udc7c\\ud83c\\udfff|\\ud83d\\udc81\\ud83c\\udffb|\\ud83d\\udc81\\ud83c\\udffc|\\ud83d\\udc81\\ud83c\\udffd|\\ud83d\\udc81\\ud83c\\udffe|\\ud83d\\udc81\\ud83c\\udfff|\\ud83d\\udc82\\ud83c\\udffb|\\ud83d\\udc82\\ud83c\\udffc|\\ud83d\\udc82\\ud83c\\udffd|\\u270a\\ud83c\\udffd|\\u270b\\ud83c\\udffd|\\u270d\\ud83c\\udffe|\\u270d\\ud83c\\udffd|\\u270d\\ud83c\\udffc|\\u270d\\ud83c\\udffb|\\u270c\\ud83c\\udfff|\\u270c\\ud83c\\udffe|\\u270c\\ud83c\\udffd|\\u270c\\ud83c\\udffc|\\u270c\\ud83c\\udffb|\\u270b\\ud83c\\udfff|\\u270b\\ud83c\\udffc|\\u270b\\ud83c\\udffb|\\u270a\\ud83c\\udfff|\\u270d\\ud83c\\udfff|\\u270a\\ud83c\\udffe|\\u270b\\ud83c\\udffe|\\u270a\\ud83c\\udffc|\\u270a\\ud83c\\udffb|\\u261d\\ud83c\\udfff|\\u261d\\ud83c\\udffd|\\u261d\\ud83c\\udffc|\\u261d\\ud83c\\udffb|\\u261d\\ud83c\\udffe|\\u26f9\\ud83c\\udffe|\\u26f9\\ud83c\\udfff|\\u26f9\\ud83c\\udffd|\\u26f9\\ud83c\\udffc|\\u26f9\\ud83c\\udffb|\\u0039\\ufe0f?\\u20e3|\\u0038\\ufe0f?\\u20e3|\\u0037\\ufe0f?\\u20e3|\\u0036\\ufe0f?\\u20e3|\\u0035\\ufe0f?\\u20e3|\\u0034\\ufe0f?\\u20e3|\\u0033\\ufe0f?\\u20e3|\\u0032\\ufe0f?\\u20e3|\\u0031\\ufe0f?\\u20e3|\\u0030\\ufe0f?\\u20e3|\\u0023\\ufe0f?\\u20e3|\\u002a\\u20e3|\\u0039\\ufe0f?\\u20e3|\\u0038\\ufe0f?\\u20e3|\\u0037\\ufe0f?\\u20e3|\\u0036\\ufe0f?\\u20e3|\\u0035\\ufe0f?\\u20e3|\\u0034\\ufe0f?\\u20e3|\\u0033\\ufe0f?\\u20e3|\\u0032\\ufe0f?\\u20e3|\\u0031\\ufe0f?\\u20e3|\\u0030\\ufe0f?\\u20e3|\\u0023\\ufe0f?\\u20e3|\\ud83d\\udd55|\\ud83d\\udd56|\\ud83d\\udd57|\\ud83d\\udd58|\\ud83d\\udd59|\\ud83d\\udd5a|\\ud83d\\udd5b|\\ud83d\\uddfb|\\ud83d\\uddfc|\\ud83d\\uddfd|\\ud83d\\uddfe|\\ud83d\\uddff|\\ud83d\\ude01|\\ud83d\\ude02|\\ud83d\\ude03|\\ud83d\\ude04|\\ud83d\\ude05|\\ud83d\\ude06|\\ud83d\\ude09|\\ud83d\\ude0a|\\ud83d\\ude0b|\\ud83d\\ude0c|\\ud83d\\ude0d|\\ud83d\\ude0f|\\ud83d\\ude12|\\ud83d\\ude13|\\ud83d\\ude14|\\ud83d\\ude16|\\ud83d\\ude18|\\ud83d\\ude1a|\\ud83d\\ude1c|\\ud83d\\ude1d|\\ud83d\\ude1e|\\ud83d\\ude20|\\ud83d\\ude21|\\ud83d\\ude22|\\ud83d\\ude23|\\ud83d\\ude24|\\ud83d\\ude25|\\ud83d\\ude28|\\ud83d\\ude29|\\ud83d\\ude2a|\\ud83d\\ude2b|\\ud83d\\ude2d|\\ud83d\\ude30|\\ud83d\\ude31|\\ud83d\\ude32|\\ud83d\\ude33|\\ud83d\\ude35|\\ud83d\\ude37|\\ud83d\\ude38|\\ud83d\\ude39|\\ud83d\\ude3a|\\ud83d\\ude3b|\\ud83d\\ude3c|\\ud83d\\ude3d|\\ud83d\\ude3e|\\ud83d\\ude3f|\\ud83d\\ude40|\\ud83d\\ude45|\\ud83d\\ude46|\\ud83d\\ude47|\\ud83d\\ude48|\\ud83d\\ude49|\\ud83d\\ude4a|\\ud83d\\ude4b|\\ud83d\\ude4c|\\ud83d\\ude4d|\\ud83d\\ude4e|\\ud83d\\ude4f|\\ud83d\\ude80|\\ud83d\\ude83|\\ud83d\\ude84|\\ud83d\\ude85|\\ud83d\\ude87|\\ud83d\\ude89|\\ud83d\\ude8c|\\ud83d\\ude8f|\\ud83d\\ude91|\\ud83d\\ude92|\\ud83d\\ude93|\\ud83d\\ude95|\\ud83d\\ude97|\\ud83d\\ude99|\\ud83d\\ude9a|\\ud83d\\udea2|\\ud83d\\udea4|\\ud83d\\udea5|\\ud83d\\udea7|\\ud83d\\udea8|\\ud83d\\udea9|\\ud83d\\udeaa|\\ud83d\\udeab|\\ud83d\\udeac|\\ud83d\\udead|\\ud83d\\udeb2|\\ud83d\\udeb6|\\ud83d\\udeb9|\\ud83d\\udeba|\\ud83d\\udebb|\\ud83d\\udebc|\\ud83d\\udebd|\\ud83d\\udebe|\\ud83d\\udec0|\\ud83c\\udde6|\\ud83c\\udde7|\\ud83c\\udde8|\\ud83c\\udde9|\\ud83c\\uddea|\\ud83c\\uddeb|\\ud83c\\uddec|\\ud83c\\udded|\\ud83c\\uddee|\\ud83c\\uddef|\\ud83c\\uddf0|\\ud83c\\uddf1|\\ud83c\\uddf2|\\ud83c\\uddf3|\\ud83c\\uddf4|\\ud83c\\uddf5|\\ud83c\\uddf6|\\ud83c\\uddf7|\\ud83c\\uddf8|\\ud83c\\uddf9|\\ud83c\\uddfa|\\ud83c\\uddfb|\\ud83c\\uddfc|\\ud83c\\uddfd|\\ud83c\\uddfe|\\ud83c\\uddff|\\ud83c\\udf0d|\\ud83c\\udf0e|\\ud83c\\udf10|\\ud83c\\udf12|\\ud83c\\udf16|\\ud83c\\udf17|\\ud83c\\udf18|\\ud83c\\udf1a|\\ud83c\\udf1c|\\ud83c\\udf1d|\\ud83c\\udf1e|\\ud83c\\udf32|\\ud83c\\udf33|\\ud83c\\udf4b|\\ud83c\\udf50|\\ud83c\\udf7c|\\ud83c\\udfc7|\\ud83c\\udfc9|\\ud83c\\udfe4|\\ud83d\\udc00|\\ud83d\\udc01|\\ud83d\\udc02|\\ud83d\\udc03|\\ud83d\\udc04|\\ud83d\\udc05|\\ud83d\\udc06|\\ud83d\\udc07|\\ud83d\\udc08|\\ud83d\\udc09|\\ud83d\\udc0a|\\ud83d\\udc0b|\\ud83d\\udc0f|\\ud83d\\udc10|\\ud83d\\udc13|\\ud83d\\udc15|\\ud83d\\udc16|\\ud83d\\udc2a|\\ud83d\\udc65|\\ud83d\\udc6c|\\ud83d\\udc6d|\\ud83d\\udcad|\\ud83d\\udcb6|\\ud83d\\udcb7|\\ud83d\\udcec|\\ud83d\\udced|\\ud83d\\udcef|\\ud83d\\udcf5|\\ud83d\\udd00|\\ud83d\\udd01|\\ud83d\\udd02|\\ud83d\\udd04|\\ud83d\\udd05|\\ud83d\\udd06|\\ud83d\\udd07|\\ud83d\\udd08|\\ud83d\\udd09|\\ud83d\\udd15|\\ud83d\\udd2c|\\ud83d\\udd2d|\\ud83d\\udd5c|\\ud83d\\udd5d|\\ud83d\\udd5e|\\ud83d\\udd5f|\\ud83d\\udd60|\\ud83d\\udd61|\\ud83d\\udd62|\\ud83d\\udd63|\\ud83d\\udd64|\\ud83d\\udd65|\\ud83d\\udd66|\\ud83d\\udd67|\\ud83d\\ude00|\\ud83d\\ude07|\\ud83d\\ude08|\\ud83d\\ude0e|\\ud83d\\ude10|\\ud83d\\ude11|\\ud83d\\ude15|\\ud83d\\ude17|\\ud83d\\ude19|\\ud83d\\ude1b|\\ud83d\\ude1f|\\ud83d\\ude26|\\ud83d\\ude27|\\ud83d\\ude2c|\\ud83d\\ude2e|\\ud83d\\ude2f|\\ud83d\\ude34|\\ud83d\\ude36|\\ud83d\\ude81|\\ud83d\\ude82|\\ud83d\\ude86|\\ud83d\\ude88|\\ud83d\\ude8a|\\ud83d\\ude8b|\\ud83d\\ude8d|\\ud83d\\ude8e|\\ud83d\\ude90|\\ud83d\\ude94|\\ud83d\\ude96|\\ud83d\\ude98|\\ud83d\\ude9b|\\ud83d\\ude9c|\\ud83d\\ude9d|\\ud83d\\ude9e|\\ud83d\\ude9f|\\ud83d\\udea0|\\ud83d\\udea1|\\ud83d\\udea3|\\ud83d\\udea6|\\ud83d\\udeae|\\ud83d\\udeaf|\\ud83d\\udeb0|\\ud83d\\udeb1|\\ud83d\\udeb3|\\ud83d\\udeb4|\\ud83d\\udeb5|\\ud83d\\udeb7|\\ud83d\\udeb8|\\ud83d\\udebf|\\ud83d\\udec1|\\ud83d\\udec2|\\ud83d\\udec3|\\ud83d\\udec4|\\ud83d\\udec5|\\ud83d\\udecd|\\ud83d\\udecc|\\ud83d\\udecb|\\ud83e\\udd81|\\ud83e\\udd80|\\ud83e\\udd18|\\ud83c\\udf46|\\ud83e\\uddc0|\\ud83e\\udd84|\\ud83e\\udd83|\\ud83e\\udd82|\\ud83e\\udd17|\\ud83e\\udd16|\\ud83e\\udd15|\\ud83e\\udd14|\\ud83e\\udd13|\\ud83e\\udd12|\\ud83e\\udd11|\\ud83e\\udd10|\\ud83d\\udef3|\\ud83d\\udef0|\\ud83d\\udeec|\\ud83c\\udccf|\\ud83c\\udd8e|\\ud83c\\udd91|\\ud83c\\udd92|\\ud83c\\udd93|\\ud83c\\udd94|\\ud83c\\udd95|\\ud83c\\udd96|\\ud83c\\udd97|\\ud83c\\udd98|\\ud83c\\udd99|\\ud83c\\udd9a|\\ud83d\\udeeb|\\ud83d\\udee9|\\ud83d\\udee5|\\ud83d\\udee4|\\ud83d\\udee3|\\ud83d\\udee2|\\ud83d\\udee1|\\ud83d\\udee0|\\ud83d\\uded0|\\ud83d\\udecf|\\ud83c\\ude01|\\ud83c\\ude32|\\ud83c\\ude33|\\ud83c\\ude34|\\ud83c\\ude35|\\ud83c\\ude36|\\ud83c\\ude38|\\ud83c\\ude39|\\ud83c\\ude3a|\\ud83c\\ude50|\\ud83c\\ude51|\\ud83c\\udf00|\\ud83c\\udf01|\\ud83c\\udf02|\\ud83c\\udf03|\\ud83c\\udf04|\\ud83c\\udf05|\\ud83c\\udf06|\\ud83c\\udf07|\\ud83c\\udf08|\\ud83c\\udf09|\\ud83c\\udf0a|\\ud83c\\udf0b|\\ud83c\\udf0c|\\ud83c\\udf0f|\\ud83c\\udf11|\\ud83c\\udf13|\\ud83c\\udf14|\\ud83c\\udf15|\\ud83c\\udf19|\\ud83c\\udf1b|\\ud83c\\udf1f|\\ud83c\\udf20|\\ud83c\\udf30|\\ud83c\\udf31|\\ud83c\\udf34|\\ud83c\\udf35|\\ud83c\\udf37|\\ud83c\\udf38|\\ud83c\\udf39|\\ud83c\\udf3a|\\ud83c\\udf3b|\\ud83c\\udf3c|\\ud83c\\udf3d|\\ud83c\\udf3e|\\ud83c\\udf3f|\\ud83c\\udf40|\\ud83c\\udf41|\\ud83c\\udf42|\\ud83c\\udf43|\\ud83c\\udf44|\\ud83c\\udf45|\\ud83d\\udece|\\ud83c\\udf47|\\ud83c\\udf48|\\ud83c\\udf49|\\ud83c\\udf4a|\\ud83c\\udf4c|\\ud83c\\udf4d|\\ud83c\\udf4e|\\ud83c\\udf4f|\\ud83c\\udf51|\\ud83c\\udf52|\\ud83c\\udf53|\\ud83c\\udf54|\\ud83c\\udf55|\\ud83c\\udf56|\\ud83c\\udf57|\\ud83c\\udf58|\\ud83c\\udf59|\\ud83c\\udf5a|\\ud83c\\udf5b|\\ud83c\\udf5c|\\ud83c\\udf5d|\\ud83c\\udf5e|\\ud83c\\udf5f|\\ud83c\\udf60|\\ud83c\\udf61|\\ud83c\\udf62|\\ud83c\\udf63|\\ud83c\\udf64|\\ud83c\\udf65|\\ud83c\\udf66|\\ud83c\\udf67|\\ud83c\\udf68|\\ud83c\\udf69|\\ud83c\\udf6a|\\ud83c\\udf6b|\\ud83c\\udf6c|\\ud83c\\udf6d|\\ud83c\\udf6e|\\ud83c\\udf6f|\\ud83c\\udf70|\\ud83c\\udf71|\\ud83c\\udf72|\\ud83c\\udf73|\\ud83c\\udf74|\\ud83c\\udf75|\\ud83c\\udf76|\\ud83c\\udf77|\\ud83c\\udf78|\\ud83c\\udf79|\\ud83c\\udf7a|\\ud83c\\udf7b|\\ud83c\\udf80|\\ud83c\\udf81|\\ud83c\\udf82|\\ud83c\\udf83|\\ud83c\\udf84|\\ud83c\\udf85|\\ud83c\\udf86|\\ud83c\\udf87|\\ud83c\\udf88|\\ud83c\\udf89|\\ud83c\\udf8a|\\ud83c\\udf8b|\\ud83c\\udf8c|\\ud83c\\udf8d|\\ud83c\\udf8e|\\ud83c\\udf8f|\\ud83c\\udf90|\\ud83c\\udf91|\\ud83c\\udf92|\\ud83c\\udf93|\\ud83c\\udfa0|\\ud83c\\udfa1|\\ud83c\\udfa2|\\ud83c\\udfa3|\\ud83c\\udfa4|\\ud83c\\udfa5|\\ud83c\\udfa6|\\ud83c\\udfa7|\\ud83c\\udfa8|\\ud83c\\udfa9|\\ud83c\\udfaa|\\ud83c\\udfab|\\ud83c\\udfac|\\ud83c\\udfad|\\ud83c\\udfae|\\ud83c\\udfaf|\\ud83c\\udfb0|\\ud83c\\udfb1|\\ud83c\\udfb2|\\ud83c\\udfb3|\\ud83c\\udfb4|\\ud83c\\udfb5|\\ud83c\\udfb6|\\ud83c\\udfb7|\\ud83c\\udfb8|\\ud83c\\udfb9|\\ud83c\\udfba|\\ud83c\\udfbb|\\ud83c\\udfbc|\\ud83c\\udfbd|\\ud83c\\udfbe|\\ud83c\\udfbf|\\ud83c\\udfc0|\\ud83c\\udfc1|\\ud83c\\udfc2|\\ud83c\\udfc3|\\ud83c\\udfc4|\\ud83c\\udfc6|\\ud83c\\udfc8|\\ud83c\\udfca|\\ud83c\\udfe0|\\ud83c\\udfe1|\\ud83c\\udfe2|\\ud83c\\udfe3|\\ud83c\\udfe5|\\ud83c\\udfe6|\\ud83c\\udfe7|\\ud83c\\udfe8|\\ud83c\\udfe9|\\ud83c\\udfea|\\ud83c\\udfeb|\\ud83c\\udfec|\\ud83c\\udfed|\\ud83c\\udfee|\\ud83c\\udfef|\\ud83c\\udff0|\\ud83d\\udc0c|\\ud83d\\udc0d|\\ud83d\\udc0e|\\ud83d\\udc11|\\ud83d\\udc12|\\ud83d\\udc14|\\ud83d\\udc17|\\ud83d\\udc18|\\ud83d\\udc19|\\ud83d\\udc1a|\\ud83d\\udc1b|\\ud83d\\udc1c|\\ud83d\\udc1d|\\ud83d\\udc1e|\\ud83d\\udc1f|\\ud83d\\udc20|\\ud83d\\udc21|\\ud83d\\udc22|\\ud83d\\udc23|\\ud83d\\udc24|\\ud83d\\udc25|\\ud83d\\udc26|\\ud83d\\udc27|\\ud83d\\udc28|\\ud83d\\udc29|\\ud83d\\udc2b|\\ud83d\\udc2c|\\ud83d\\udc2d|\\ud83c\\udf21|\\ud83c\\udf24|\\ud83c\\udf25|\\ud83c\\udf26|\\ud83c\\udf27|\\ud83c\\udf28|\\ud83c\\udf29|\\ud83c\\udf2a|\\ud83c\\udf2b|\\ud83c\\udf2c|\\ud83c\\udf2d|\\ud83c\\udf2e|\\ud83c\\udf2f|\\ud83c\\udf36|\\ud83c\\udf7d|\\ud83c\\udf7e|\\ud83c\\udf7f|\\ud83d\\udc2e|\\ud83d\\udc2f|\\ud83d\\udc30|\\ud83d\\udc31|\\ud83d\\udc32|\\ud83c\\udf96|\\ud83c\\udf97|\\ud83c\\udf99|\\ud83c\\udf9a|\\ud83c\\udf9b|\\ud83c\\udf9e|\\ud83c\\udf9f|\\ud83d\\udc33|\\ud83d\\udc34|\\ud83d\\udc35|\\ud83d\\udc36|\\ud83d\\udc37|\\ud83d\\udc38|\\ud83d\\udc39|\\ud83d\\udc3a|\\ud83d\\udc3b|\\ud83d\\udc3c|\\ud83c\\udfc5|\\ud83d\\udc3d|\\ud83d\\udc3e|\\ud83d\\udc40|\\ud83d\\udc42|\\ud83d\\udc43|\\ud83d\\udc44|\\ud83d\\udc45|\\ud83d\\udc46|\\ud83d\\udc47|\\ud83d\\udc48|\\ud83d\\udc49|\\ud83d\\udc4a|\\ud83d\\udc4b|\\ud83d\\udc4c|\\ud83d\\udc4d|\\ud83c\\udfcb|\\ud83c\\udfcc|\\ud83c\\udfcd|\\ud83c\\udfce|\\ud83c\\udfcf|\\ud83c\\udfd0|\\ud83c\\udfd1|\\ud83c\\udfd2|\\ud83c\\udfd3|\\ud83c\\udfd4|\\ud83c\\udfd5|\\ud83c\\udfd6|\\ud83c\\udfd7|\\ud83c\\udfd8|\\ud83c\\udfd9|\\ud83c\\udfda|\\ud83c\\udfdb|\\ud83c\\udfdc|\\ud83c\\udfdd|\\ud83c\\udfde|\\ud83c\\udfdf|\\ud83c\\udff3|\\ud83c\\udff4|\\ud83c\\udff5|\\ud83c\\udff7|\\ud83c\\udff8|\\ud83c\\udff9|\\ud83c\\udffa|\\ud83c\\udffb|\\ud83c\\udffc|\\ud83c\\udffd|\\ud83c\\udffe|\\ud83c\\udfff|\\ud83d\\udc3f|\\ud83d\\udc41|\\ud83d\\udc4e|\\ud83d\\udc4f|\\ud83d\\udc50|\\ud83d\\udc51|\\ud83d\\udc52|\\ud83d\\udc53|\\ud83d\\udc54|\\ud83d\\udc55|\\ud83d\\udc56|\\ud83d\\udc57|\\ud83d\\udc58|\\ud83d\\udc59|\\ud83d\\udc5a|\\ud83d\\udc5b|\\ud83d\\udc5c|\\ud83d\\udc5d|\\ud83d\\udc5e|\\ud83d\\udc5f|\\ud83d\\udc60|\\ud83d\\udc61|\\ud83d\\udc62|\\ud83d\\udc63|\\ud83d\\udc64|\\ud83d\\udc66|\\ud83d\\udc67|\\ud83d\\udc68|\\ud83d\\udc69|\\ud83d\\udc6a|\\ud83d\\udc6b|\\ud83d\\udc6e|\\ud83d\\udc6f|\\ud83d\\udc70|\\ud83d\\udc71|\\ud83d\\udc72|\\ud83d\\udc73|\\ud83d\\udc74|\\ud83d\\udc75|\\ud83d\\udc76|\\ud83d\\udc77|\\ud83d\\udc78|\\ud83d\\udc79|\\ud83d\\udc7a|\\ud83d\\udc7b|\\ud83d\\udc7c|\\ud83d\\udc7d|\\ud83d\\udc7e|\\ud83d\\udc7f|\\ud83d\\udc80|\\ud83d\\udc81|\\ud83d\\udc82|\\ud83d\\udc83|\\ud83d\\udc84|\\ud83d\\udc85|\\ud83d\\udc86|\\ud83d\\udc87|\\ud83d\\udc88|\\ud83d\\udc89|\\ud83d\\udc8a|\\ud83d\\udc8b|\\ud83d\\udc8c|\\ud83d\\udc8d|\\ud83d\\udc8e|\\ud83d\\udc8f|\\ud83d\\udc90|\\ud83d\\udc91|\\ud83d\\udc92|\\ud83d\\udc93|\\ud83d\\udc94|\\ud83d\\udc95|\\ud83d\\udc96|\\ud83d\\udc97|\\ud83d\\udc98|\\ud83d\\udc99|\\ud83d\\udc9a|\\ud83d\\udc9b|\\ud83d\\udc9c|\\ud83d\\udc9d|\\ud83d\\udc9e|\\ud83d\\udc9f|\\ud83d\\udca0|\\ud83d\\udca1|\\ud83d\\udca2|\\ud83d\\udca3|\\ud83d\\udca4|\\ud83d\\udca5|\\ud83d\\udca6|\\ud83d\\udca7|\\ud83d\\udca8|\\ud83d\\udca9|\\ud83d\\udcaa|\\ud83d\\udcab|\\ud83d\\udcac|\\ud83d\\udcae|\\ud83d\\udcaf|\\ud83d\\udcb0|\\ud83d\\udcb1|\\ud83d\\udcb2|\\ud83d\\udcb3|\\ud83d\\udcb4|\\ud83d\\udcb5|\\ud83d\\udcb8|\\ud83d\\udcb9|\\ud83d\\udcba|\\ud83d\\udcbb|\\ud83d\\udcbc|\\ud83d\\udcbd|\\ud83d\\udcbe|\\ud83d\\udcbf|\\ud83d\\udcc0|\\ud83d\\udcc1|\\ud83d\\udcc2|\\ud83d\\udcc3|\\ud83d\\udcc4|\\ud83d\\udcc5|\\ud83d\\udcc6|\\ud83d\\udcc7|\\ud83d\\udcc8|\\ud83d\\udcc9|\\ud83d\\udcca|\\ud83d\\udccb|\\ud83d\\udccc|\\ud83d\\udccd|\\ud83d\\udcce|\\ud83d\\udccf|\\ud83d\\udcd0|\\ud83d\\udcd1|\\ud83d\\udcd2|\\ud83d\\udcd3|\\ud83d\\udcd4|\\ud83d\\udcd5|\\ud83d\\udcd6|\\ud83d\\udcd7|\\ud83d\\udcd8|\\ud83d\\udcd9|\\ud83d\\udcda|\\ud83d\\udcdb|\\ud83d\\udcdc|\\ud83d\\udcdd|\\ud83d\\udcde|\\ud83d\\udcdf|\\ud83d\\udce0|\\ud83d\\udce1|\\ud83d\\udce2|\\ud83d\\udce3|\\ud83d\\udce4|\\ud83d\\udce5|\\ud83d\\udce6|\\ud83d\\udce7|\\ud83d\\udce8|\\ud83d\\udce9|\\ud83d\\udcea|\\ud83d\\udceb|\\ud83d\\udcee|\\ud83d\\udcf0|\\ud83d\\udcf1|\\ud83d\\udcf2|\\ud83d\\udcf3|\\ud83d\\udcf4|\\ud83d\\udcf6|\\ud83d\\udcf7|\\ud83d\\udcf9|\\ud83d\\udcfa|\\ud83d\\udcfb|\\ud83d\\udcfc|\\ud83d\\udd03|\\ud83d\\udd0a|\\ud83d\\udd0b|\\ud83d\\udd0c|\\ud83d\\udd0d|\\ud83d\\udd0e|\\ud83d\\udd0f|\\ud83d\\udd10|\\ud83d\\udd11|\\ud83d\\udd12|\\ud83d\\udd13|\\ud83d\\udd14|\\ud83d\\udd16|\\ud83d\\udd17|\\ud83d\\udd18|\\ud83d\\udd19|\\ud83d\\udd1a|\\ud83d\\udd1b|\\ud83d\\udd1c|\\ud83d\\udd1d|\\ud83d\\udd1e|\\ud83d\\udd1f|\\ud83d\\udd20|\\ud83d\\udd21|\\ud83d\\udd22|\\ud83d\\udd23|\\ud83d\\udd24|\\ud83d\\udd25|\\ud83d\\udd26|\\ud83d\\udcf8|\\ud83d\\udcfd|\\ud83d\\udcff|\\ud83d\\udd49|\\ud83d\\udd4a|\\ud83d\\udd4b|\\ud83d\\udd4c|\\ud83d\\udd4d|\\ud83d\\udd4e|\\ud83d\\udd6f|\\ud83d\\udd70|\\ud83d\\udd73|\\ud83d\\udd74|\\ud83d\\udd75|\\ud83d\\udd76|\\ud83d\\udd77|\\ud83d\\udd78|\\ud83d\\udd79|\\ud83d\\udd87|\\ud83d\\udd8a|\\ud83d\\udd8b|\\ud83d\\udd8c|\\ud83d\\udd8d|\\ud83d\\udd27|\\ud83d\\udd28|\\ud83d\\udd29|\\ud83d\\udd2a|\\ud83d\\udd2b|\\ud83d\\udd90|\\ud83d\\udd2e|\\ud83d\\udd2f|\\ud83d\\udd30|\\ud83d\\udd31|\\ud83d\\udd32|\\ud83d\\udd95|\\ud83d\\udd33|\\ud83d\\udd34|\\ud83d\\udd35|\\ud83d\\udd36|\\ud83d\\udd37|\\ud83d\\udd96|\\ud83d\\udda5|\\ud83d\\udda8|\\ud83d\\uddb1|\\ud83d\\uddb2|\\ud83d\\uddbc|\\ud83d\\uddc2|\\ud83d\\uddc3|\\ud83d\\uddc4|\\ud83d\\uddd1|\\ud83d\\uddd2|\\ud83d\\uddd3|\\ud83d\\udddc|\\ud83d\\udddd|\\ud83d\\uddde|\\ud83d\\udde1|\\ud83d\\udde3|\\ud83d\\udde8|\\ud83d\\uddef|\\ud83d\\uddf3|\\ud83d\\uddfa|\\ud83d\\ude41|\\ud83d\\ude42|\\ud83d\\ude43|\\ud83d\\ude44|\\ud83d\\udd38|\\ud83d\\udd39|\\ud83d\\udd3a|\\ud83d\\udd3b|\\ud83d\\udd3c|\\ud83d\\udd3d|\\ud83d\\udd50|\\ud83d\\udd51|\\ud83d\\udd52|\\ud83d\\udd53|\\ud83d\\udd54|\\ue50a|\\u2797|\\u2796|\\u2795|\\u2763|\\u2755|\\u2754|\\u2753|\\u2728|\\u2721|\\u2705|\\u2699|\\u2697|\\u2696|\\u2694|\\u2692|\\u2639|\\u2638|\\u2626|\\u2623|\\u2622|\\u2620|\\u2618|\\u2604|\\u2603|\\u2602|\\u2328|\\u274c|\\u274e|\\u271d|\\u270a|\\u270b|\\u270d|\\u269b|\\u269c|\\u262f|\\u262a|\\u262e|\\u27b0|\\u27bf|\\u26f9|\\u26ce|\\u26b0|\\u26b1|\\u26c8|\\u26cf|\\u26d1|\\u26d3|\\u26e9|\\u26f0|\\u26f1|\\u26f4|\\u26f7|\\u26f8|\\u23f1|\\u23e9|\\u23ec|\\u23f0|\\u23ed|\\u23ee|\\u23f3|\\u23ea|\\u23fa|\\u23f9|\\u23f8|\\u23f2|\\u23eb|\\u23ef|\\u00a9|\\u00ae)|(?:(?:\\ud83c\\udc04|\\ud83c\\udd70|\\ud83c\\udd71|\\ud83c\\udd7e|\\ud83c\\udd7f|\\ud83c\\ude02|\\ud83c\\ude1a|\\ud83c\\ude2f|\\ud83c\\ude37|\\u3299|\\u3297|\\u3030|\\u2935|\\u2934|\\u2764|\\u2757|\\u2747|\\u2744|\\u2734|\\u2733|\\u2716|\\u2714|\\u2712|\\u2709|\\u2708|\\u2702|\\u2693|\\u2668|\\u2666|\\u2665|\\u2663|\\u2660|\\u2653|\\u2652|\\u2651|\\u2650|\\u2649|\\u2648|\\u2615|\\u2614|\\u2611|\\u2601|\\u2600|\\u2199|\\u2198|\\u2197|\\u2196|\\u2195|\\u2194|\\u2139|\\u2122|\\u2049|\\u303d|\\u270f|\\u270c|\\u267f|\\u267b|\\u264b|\\u264a|\\u264f|\\u264e|\\u264d|\\u264c|\\u263a|\\u261d|\\u260e|\\u231a|\\u231b|\\u203c|\\u27a1|\\u26c5|\\u26a0|\\u26a1|\\u26d4|\\u26ea|\\u26f2|\\u26aa|\\u26f5|\\u26fa|\\u26fd|\\u26ab|\\u26bd|\\u26be|\\u26c4|\\u26f3|\\u25fc|\\u25fb|\\u25fe|\\u25c0|\\u25b6|\\u25ab|\\u25aa|\\u25fd|\\u24c2|\\u21a9|\\u21aa|\\u2b05|\\u2b55|\\u2b50|\\u2b06|\\u2b07|\\u2b1c|\\u2b1b)([\\uFE0E\\uFE0F]?)))/g,\n\n    // used to find HTML special chars in attributes\n    rescaper = /[&<>'\"]/g,\n\n    // nodes with type 1 which should **not** be parsed (including lower case svg)\n    shouldntBeParsed = /IFRAME|NOFRAMES|NOSCRIPT|SCRIPT|SELECT|STYLE|TEXTAREA|[a-z]/,\n\n    // just a private shortcut\n    fromCharCode = String.fromCharCode;\n\n  return twemoji;\n\n\n  /////////////////////////\n  //  private functions  //\n  //     declaration     //\n  /////////////////////////\n\n  /**\n   * Shortcut to create text nodes\n   * @param   string  text used to create DOM text node\n   * @return  Node  a DOM node with that text\n   */\n  function createText(text) {\n    return document.createTextNode(text);\n  }\n\n  /**\n   * Utility function to escape html attribute text\n   * @param   string  text use in HTML attribute\n   * @return  string  text encoded to use in HTML attribute\n   */\n  function escapeHTML(s) {\n    return s.replace(rescaper, replacer);\n  }\n\n  /**\n   * Default callback used to generate emoji src\n   *  based on Twitter CDN\n   * @param   string    the emoji codepoint string\n   * @param   string    the default size to use, i.e. \"36x36\"\n   * @param   string    optional \"\\uFE0F\" variant char, ignored by default\n   * @return  string    the image source to use\n   */\n  function defaultImageSrcGenerator(icon, options) {\n    return ''.concat(options.base, options.size, '/', icon, options.ext);\n  }\n\n  /**\n   * Given a generic DOM nodeType 1, walk through all children\n   * and store every nodeType 3 (#text) found in the tree.\n   * @param   Element a DOM Element with probably some text in it\n   * @param   Array the list of previously discovered text nodes\n   * @return  Array same list with new discovered nodes, if any\n   */\n  function grabAllTextNodes(node, allText) {\n    var\n      childNodes = node.childNodes,\n      length = childNodes.length,\n      subnode,\n      nodeType;\n    while (length--) {\n      subnode = childNodes[length];\n      nodeType = subnode.nodeType;\n      // parse emoji only in text nodes\n      if (nodeType === 3) {\n        // collect them to process emoji later\n        allText.push(subnode);\n      }\n      // ignore all nodes that are not type 1 or that\n      // should not be parsed as script, style, and others\n      else if (nodeType === 1 && !shouldntBeParsed.test(subnode.nodeName)) {\n        grabAllTextNodes(subnode, allText);\n      }\n    }\n    return allText;\n  }\n\n  /**\n   * Used to both remove the possible variant\n   *  and to convert utf16 into code points\n   * @param   string    the emoji surrogate pair\n   * @param   string    the optional variant char, if any\n   */\n  function grabTheRightIcon(icon, variant) {\n    // if variant is present as \\uFE0F\n    return toCodePoint(\n      variant === '\\uFE0F' ?\n        // the icon should not contain it\n        icon.slice(0, -1) :\n        // fix non standard OSX behavior\n        (icon.length === 3 && icon.charAt(1) === '\\uFE0F' ?\n          icon.charAt(0) + icon.charAt(2) : icon)\n    );\n  }\n\n  /**\n   * DOM version of the same logic / parser:\n   *  emojify all found sub-text nodes placing images node instead.\n   * @param   Element   generic DOM node with some text in some child node\n   * @param   Object    options  containing info about how to parse\n    *\n    *            .callback   Function  the callback to invoke per each found emoji.\n    *            .base       string    the base url, by default twemoji.base\n    *            .ext        string    the image extension, by default twemoji.ext\n    *            .size       string    the assets size, by default twemoji.size\n    *\n   * @return  Element same generic node with emoji in place, if any.\n   */\n  function parseNode(node, options) {\n    var\n      allText = grabAllTextNodes(node, []),\n      length = allText.length,\n      attrib,\n      attrname,\n      modified,\n      fragment,\n      subnode,\n      text,\n      match,\n      i,\n      index,\n      img,\n      alt,\n      icon,\n      variant,\n      src;\n    while (length--) {\n      modified = false;\n      fragment = document.createDocumentFragment();\n      subnode = allText[length];\n      text = subnode.nodeValue;\n      i = 0;\n      while ((match = re.exec(text))) {\n        index = match.index;\n        if (index !== i) {\n          fragment.appendChild(\n            createText(text.slice(i, index))\n          );\n        }\n        alt = match[0];\n        icon = match[1];\n        variant = match[2];\n        i = index + alt.length;\n        if (variant !== '\\uFE0E') {\n          src = options.callback(\n            grabTheRightIcon(icon, variant),\n            options,\n            variant\n          );\n          if (src) {\n            img = new Image();\n            img.onerror = options.onerror;\n            img.setAttribute('draggable', 'false');\n            attrib = options.attributes(icon, variant);\n            for (attrname in attrib) {\n              if (\n                attrib.hasOwnProperty(attrname) &&\n                // don't allow any handlers to be set + don't allow overrides\n                attrname.indexOf('on') !== 0 &&\n                !img.hasAttribute(attrname)\n              ) {\n                img.setAttribute(attrname, attrib[attrname]);\n              }\n            }\n            img.className = options.className;\n            img.alt = alt;\n            img.src = src;\n            modified = true;\n            fragment.appendChild(img);\n          }\n        }\n        if (!img) fragment.appendChild(createText(alt));\n        img = null;\n      }\n      // is there actually anything to replace in here ?\n      if (modified) {\n        // any text left to be added ?\n        if (i < text.length) {\n          fragment.appendChild(\n            createText(text.slice(i))\n          );\n        }\n        // replace the text node only, leave intact\n        // anything else surrounding such text\n        subnode.parentNode.replaceChild(fragment, subnode);\n      }\n    }\n    return node;\n  }\n\n  /**\n   * String/HTML version of the same logic / parser:\n   *  emojify a generic text placing images tags instead of surrogates pair.\n   * @param   string    generic string with possibly some emoji in it\n   * @param   Object    options  containing info about how to parse\n   *\n   *            .callback   Function  the callback to invoke per each found emoji.\n   *            .base       string    the base url, by default twemoji.base\n   *            .ext        string    the image extension, by default twemoji.ext\n   *            .size       string    the assets size, by default twemoji.size\n   *\n   * @return  the string with <img tags> replacing all found and parsed emoji\n   */\n  function parseString(str, options) {\n    return replace(str, function (match, icon, variant) {\n      var\n        ret = match,\n        attrib,\n        attrname,\n        src;\n      // verify the variant is not the FE0E one\n      // this variant means \"emoji as text\" and should not\n      // require any action/replacement\n      // http://unicode.org/Public/UNIDATA/StandardizedVariants.html\n      if (variant !== '\\uFE0E') {\n        src = options.callback(\n          grabTheRightIcon(icon, variant),\n          options,\n          variant\n        );\n        if (src) {\n          // recycle the match string replacing the emoji\n          // with its image counter part\n          ret = '<img '.concat(\n            'class=\"', options.className, '\" ',\n            'draggable=\"false\" ',\n            // needs to preserve user original intent\n            // when variants should be copied and pasted too\n            'alt=\"',\n            match,\n            '\"',\n            ' src=\"',\n            src,\n            '\"'\n          );\n          attrib = options.attributes(icon, variant);\n          for (attrname in attrib) { \n            if (\n              attrib.hasOwnProperty(attrname) &&\n              // don't allow any handlers to be set + don't allow overrides\n              attrname.indexOf('on') !== 0 &&\n              ret.indexOf(' ' + attrname + '=') === -1\n            ) {\n              ret = ret.concat(' ', attrname, '=\"', escapeHTML(attrib[attrname]), '\"');\n            }\n          }\n          ret = ret.concat('>');\n        }\n      }\n      return ret;\n    });\n  }\n\n  /**\n   * Function used to actually replace HTML special chars\n   * @param   string  HTML special char\n   * @return  string  encoded HTML special char\n   */\n  function replacer(m) {\n    return escaper[m];\n  }\n\n  /**\n   * Default options.attribute callback\n   * @return  null\n   */\n  function returnNull() {\n    return null;\n  }\n\n  /**\n   * Given a generic value, creates its squared counterpart if it's a number.\n   *  As example, number 36 will return '36x36'.\n   * @param   any     a generic value.\n   * @return  any     a string representing asset size, i.e. \"36x36\"\n   *                  only in case the value was a number.\n   *                  Returns initial value otherwise.\n   */\n  function toSizeSquaredAsset(value) {\n    return typeof value === 'number' ?\n      value + 'x' + value :\n      value;\n  }\n\n\n  /////////////////////////\n  //  exported functions //\n  //     declaration     //\n  /////////////////////////\n\n  function fromCodePoint(codepoint) {\n    var code = typeof codepoint === 'string' ?\n          parseInt(codepoint, 16) : codepoint;\n    if (code < 0x10000) {\n      return fromCharCode(code);\n    }\n    code -= 0x10000;\n    return fromCharCode(\n      0xD800 + (code >> 10),\n      0xDC00 + (code & 0x3FF)\n    );\n  }\n\n  function parse(what, how) {\n    if (!how || typeof how === 'function') {\n      how = {callback: how};\n    }\n    // if first argument is string, inject html <img> tags\n    // otherwise use the DOM tree and parse text nodes only\n    return (typeof what === 'string' ? parseString : parseNode)(what, {\n      callback:   how.callback || defaultImageSrcGenerator,\n      attributes: typeof how.attributes === 'function' ? how.attributes : returnNull,\n      base:       typeof how.base === 'string' ? how.base : twemoji.base,\n      ext:        how.ext || twemoji.ext,\n      size:       how.folder || toSizeSquaredAsset(how.size || twemoji.size),\n      className:  how.className || twemoji.className,\n      onerror:    how.onerror || twemoji.onerror\n    });\n  }\n\n  function replace(text, callback) {\n    return String(text).replace(re, callback);\n  }\n\n  function test(text) {\n    // IE6 needs a reset before too\n    re.lastIndex = 0;\n    var result = re.test(text);\n    re.lastIndex = 0;\n    return result;\n  }\n\n  function toCodePoint(unicodeSurrogates, sep) {\n    var\n      r = [],\n      c = 0,\n      p = 0,\n      i = 0;\n    while (i < unicodeSurrogates.length) {\n      c = unicodeSurrogates.charCodeAt(i++);\n      if (p) {\n        r.push((0x10000 + ((p - 0xD800) << 10) + (c - 0xDC00)).toString(16));\n        p = 0;\n      } else if (0xD800 <= c && c <= 0xDBFF) {\n        p = c;\n      } else {\n        r.push(c.toString(16));\n      }\n    }\n    return r.join(sep || '-');\n  }\n\n}());\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/utils.js",
    "content": "/* global userSettings */\n/* exported getUserSetting, setUserSetting, deleteUserSetting */\n// utility functions\n\nvar wpCookies = {\n// The following functions are from Cookie.js class in TinyMCE 3, Moxiecode, used under LGPL.\n\n\teach: function( obj, cb, scope ) {\n\t\tvar n, l;\n\n\t\tif ( ! obj ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tscope = scope || obj;\n\n\t\tif ( typeof( obj.length ) !== 'undefined' ) {\n\t\t\tfor ( n = 0, l = obj.length; n < l; n++ ) {\n\t\t\t\tif ( cb.call( scope, obj[n], n, obj ) === false ) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( n in obj ) {\n\t\t\t\tif ( obj.hasOwnProperty(n) ) {\n\t\t\t\t\tif ( cb.call( scope, obj[n], n, obj ) === false ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn 1;\n\t},\n\n\t/**\n\t * Get a multi-values cookie.\n\t * Returns a JS object with the name: 'value' pairs.\n\t */\n\tgetHash: function( name ) {\n\t\tvar cookie = this.get( name ), values;\n\n\t\tif ( cookie ) {\n\t\t\tthis.each( cookie.split('&'), function( pair ) {\n\t\t\t\tpair = pair.split('=');\n\t\t\t\tvalues = values || {};\n\t\t\t\tvalues[pair[0]] = pair[1];\n\t\t\t});\n\t\t}\n\n\t\treturn values;\n\t},\n\n\t/**\n\t * Set a multi-values cookie.\n\t *\n\t * 'values_obj' is the JS object that is stored. It is encoded as URI in wpCookies.set().\n\t */\n\tsetHash: function( name, values_obj, expires, path, domain, secure ) {\n\t\tvar str = '';\n\n\t\tthis.each( values_obj, function( val, key ) {\n\t\t\tstr += ( ! str ? '' : '&' ) + key + '=' + val;\n\t\t});\n\n\t\tthis.set( name, str, expires, path, domain, secure );\n\t},\n\n\t/**\n\t * Get a cookie.\n\t */\n\tget: function( name ) {\n\t\tvar e, b,\n\t\t\tcookie = document.cookie,\n\t\t\tp = name + '=';\n\n\t\tif ( ! cookie ) {\n\t\t\treturn;\n\t\t}\n\n\t\tb = cookie.indexOf( '; ' + p );\n\n\t\tif ( b === -1 ) {\n\t\t\tb = cookie.indexOf(p);\n\n\t\t\tif ( b !== 0 ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else {\n\t\t\tb += 2;\n\t\t}\n\n\t\te = cookie.indexOf( ';', b );\n\n\t\tif ( e === -1 ) {\n\t\t\te = cookie.length;\n\t\t}\n\n\t\treturn decodeURIComponent( cookie.substring( b + p.length, e ) );\n\t},\n\n\t/**\n\t * Set a cookie.\n\t *\n\t * The 'expires' arg can be either a JS Date() object set to the expiration date (back-compat)\n\t * or the number of seconds until expiration\n\t */\n\tset: function( name, value, expires, path, domain, secure ) {\n\t\tvar d = new Date();\n\n\t\tif ( typeof( expires ) === 'object' && expires.toGMTString ) {\n\t\t\texpires = expires.toGMTString();\n\t\t} else if ( parseInt( expires, 10 ) ) {\n\t\t\td.setTime( d.getTime() + ( parseInt( expires, 10 ) * 1000 ) ); // time must be in miliseconds\n\t\t\texpires = d.toGMTString();\n\t\t} else {\n\t\t\texpires = '';\n\t\t}\n\n\t\tdocument.cookie = name + '=' + encodeURIComponent( value ) +\n\t\t\t( expires ? '; expires=' + expires : '' ) +\n\t\t\t( path    ? '; path=' + path       : '' ) +\n\t\t\t( domain  ? '; domain=' + domain   : '' ) +\n\t\t\t( secure  ? '; secure'             : '' );\n\t},\n\n\t/**\n\t * Remove a cookie.\n\t *\n\t * This is done by setting it to an empty value and setting the expiration time in the past.\n\t */\n\tremove: function( name, path, domain, secure ) {\n\t\tthis.set( name, '', -1000, path, domain, secure );\n\t}\n};\n\n// Returns the value as string. Second arg or empty string is returned when value is not set.\nfunction getUserSetting( name, def ) {\n\tvar settings = getAllUserSettings();\n\n\tif ( settings.hasOwnProperty( name ) ) {\n\t\treturn settings[name];\n\t}\n\n\tif ( typeof def !== 'undefined' ) {\n\t\treturn def;\n\t}\n\n\treturn '';\n}\n\n// Both name and value must be only ASCII letters, numbers or underscore\n// and the shorter, the better (cookies can store maximum 4KB). Not suitable to store text.\n// The value is converted and stored as string.\nfunction setUserSetting( name, value, _del ) {\n\tif ( 'object' !== typeof userSettings ) {\n\t\treturn false;\n\t}\n\n\tvar uid = userSettings.uid,\n\t\tsettings = wpCookies.getHash( 'wp-settings-' + uid ),\n\t\tpath = userSettings.url,\n\t\tsecure = !! userSettings.secure;\n\n\tname = name.toString().replace( /[^A-Za-z0-9_-]/g, '' );\n\n\tif ( typeof value === 'number' ) {\n\t\tvalue = parseInt( value, 10 );\n\t} else {\n\t\tvalue = value.toString().replace( /[^A-Za-z0-9_-]/g, '' );\n\t}\n\n\tsettings = settings || {};\n\n\tif ( _del ) {\n\t\tdelete settings[name];\n\t} else {\n\t\tsettings[name] = value;\n\t}\n\n\twpCookies.setHash( 'wp-settings-' + uid, settings, 31536000, path, '', secure );\n\twpCookies.set( 'wp-settings-time-' + uid, userSettings.time, 31536000, path, '', secure );\n\n\treturn name;\n}\n\nfunction deleteUserSetting( name ) {\n\treturn setUserSetting( name, '', 1 );\n}\n\n// Returns all settings as js object.\nfunction getAllUserSettings() {\n\tif ( 'object' !== typeof userSettings ) {\n\t\treturn {};\n\t}\n\n\treturn wpCookies.getHash( 'wp-settings-' + userSettings.uid ) || {};\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-a11y.js",
    "content": "window.wp = window.wp || {};\n\n( function ( wp, $ ) {\n\t'use strict';\n\n\tvar $containerPolite,\n\t\t$containerAssertive,\n\t\trole;\n\n\t/**\n\t * Update the ARIA live notification area text node.\n\t *\n\t * @since 4.2.0\n\t * @since 4.3.0 Introduced the 'ariaLive' argument.\n\t *\n\t * @param {String} message  The message to be announced by Assistive Technologies.\n\t * @param {String} ariaLive Optional. The politeness level for aria-live. Possible values:\n\t *                          polite or assertive. Default polite.\n\t */\n\tfunction speak( message, ariaLive ) {\n\t\t// Clear previous messages to allow repeated strings being read out.\n\t\tclear();\n\n\t\tif ( $containerAssertive && 'assertive' === ariaLive ) {\n\t\t\t$containerAssertive.text( message );\n\t\t} else if ( $containerPolite ) {\n\t\t\t$containerPolite.text( message );\n\t\t}\n\t}\n\n\t/**\n\t * Build the live regions markup.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param {String} ariaLive Optional. Value for the 'aria-live' attribute, default 'polite'.\n\t *\n\t * @return {Object} $container The ARIA live region jQuery object.\n\t */\n\tfunction addContainer( ariaLive ) {\n\t\tariaLive = ariaLive || 'polite';\n\t\trole = 'assertive' === ariaLive ? 'alert' : 'status';\n\n\t\tvar $container = $( '<div>', {\n\t\t\t'id': 'wp-a11y-speak-' + ariaLive,\n\t\t\t'role': role,\n\t\t\t'aria-live': ariaLive,\n\t\t\t'aria-relevant': 'additions text',\n\t\t\t'aria-atomic': 'true',\n\t\t\t'class': 'screen-reader-text wp-a11y-speak-region'\n\t\t});\n\n\t\t$( document.body ).append( $container );\n\t\treturn $container;\n\t}\n\n\t/**\n\t * Clear the live regions.\n\t *\n\t * @since 4.3.0\n\t */\n\tfunction clear() {\n\t\t$( '.wp-a11y-speak-region' ).text( '' );\n\t}\n\n\t/**\n\t * Initialize wp.a11y and define ARIA live notification area.\n\t *\n\t * @since 4.2.0\n\t * @since 4.3.0 Added the assertive live region.\n\t */\n\t$( document ).ready( function() {\n\t\t$containerPolite = $( '#wp-a11y-speak-polite' );\n\t\t$containerAssertive = $( '#wp-a11y-speak-assertive' );\n\n\t\tif ( ! $containerPolite.length ) {\n\t\t\t$containerPolite = addContainer( 'polite' );\n\t\t}\n\n\t\tif ( ! $containerAssertive.length ) {\n\t\t\t$containerAssertive = addContainer( 'assertive' );\n\t\t}\n\t});\n\n\twp.a11y = wp.a11y || {};\n\twp.a11y.speak = speak;\n\n}( window.wp, window.jQuery ));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-ajax-response.js",
    "content": "var wpAjax = jQuery.extend( {\n\tunserialize: function( s ) {\n\t\tvar r = {}, q, pp, i, p;\n\t\tif ( !s ) { return r; }\n\t\tq = s.split('?'); if ( q[1] ) { s = q[1]; }\n\t\tpp = s.split('&');\n\t\tfor ( i in pp ) {\n\t\t\tif ( jQuery.isFunction(pp.hasOwnProperty) && !pp.hasOwnProperty(i) ) { continue; }\n\t\t\tp = pp[i].split('=');\n\t\t\tr[p[0]] = p[1];\n\t\t}\n\t\treturn r;\n\t},\n\tparseAjaxResponse: function( x, r, e ) { // 1 = good, 0 = strange (bad data?), -1 = you lack permission\n\t\tvar parsed = {}, re = jQuery('#' + r).empty(), err = '';\n\n\t\tif ( x && typeof x == 'object' && x.getElementsByTagName('wp_ajax') ) {\n\t\t\tparsed.responses = [];\n\t\t\tparsed.errors = false;\n\t\t\tjQuery('response', x).each( function() {\n\t\t\t\tvar th = jQuery(this), child = jQuery(this.firstChild), response;\n\t\t\t\tresponse = { action: th.attr('action'), what: child.get(0).nodeName, id: child.attr('id'), oldId: child.attr('old_id'), position: child.attr('position') };\n\t\t\t\tresponse.data = jQuery( 'response_data', child ).text();\n\t\t\t\tresponse.supplemental = {};\n\t\t\t\tif ( !jQuery( 'supplemental', child ).children().each( function() {\n\t\t\t\t\tresponse.supplemental[this.nodeName] = jQuery(this).text();\n\t\t\t\t} ).size() ) { response.supplemental = false; }\n\t\t\t\tresponse.errors = [];\n\t\t\t\tif ( !jQuery('wp_error', child).each( function() {\n\t\t\t\t\tvar code = jQuery(this).attr('code'), anError, errorData, formField;\n\t\t\t\t\tanError = { code: code, message: this.firstChild.nodeValue, data: false };\n\t\t\t\t\terrorData = jQuery('wp_error_data[code=\"' + code + '\"]', x);\n\t\t\t\t\tif ( errorData ) { anError.data = errorData.get(); }\n\t\t\t\t\tformField = jQuery( 'form-field', errorData ).text();\n\t\t\t\t\tif ( formField ) { code = formField; }\n\t\t\t\t\tif ( e ) { wpAjax.invalidateForm( jQuery('#' + e + ' :input[name=\"' + code + '\"]' ).parents('.form-field:first') ); }\n\t\t\t\t\terr += '<p>' + anError.message + '</p>';\n\t\t\t\t\tresponse.errors.push( anError );\n\t\t\t\t\tparsed.errors = true;\n\t\t\t\t} ).size() ) { response.errors = false; }\n\t\t\t\tparsed.responses.push( response );\n\t\t\t} );\n\t\t\tif ( err.length ) { re.html( '<div class=\"error\">' + err + '</div>' ); }\n\t\t\treturn parsed;\n\t\t}\n\t\tif ( isNaN(x) ) { return !re.html('<div class=\"error\"><p>' + x + '</p></div>'); }\n\t\tx = parseInt(x,10);\n\t\tif ( -1 == x ) { return !re.html('<div class=\"error\"><p>' + wpAjax.noPerm + '</p></div>'); }\n\t\telse if ( 0 === x ) { return !re.html('<div class=\"error\"><p>' + wpAjax.broken  + '</p></div>'); }\n\t\treturn true;\n\t},\n\tinvalidateForm: function ( selector ) {\n\t\treturn jQuery( selector ).addClass( 'form-invalid' ).find('input').one( 'change wp-check-valid-field', function() { jQuery(this).closest('.form-invalid').removeClass( 'form-invalid' ); } );\n\t},\n\tvalidateForm: function( selector ) {\n\t\tselector = jQuery( selector );\n\t\treturn !wpAjax.invalidateForm( selector.find('.form-required').filter( function() { return jQuery('input:visible', this).val() === ''; } ) ).size();\n\t}\n}, wpAjax || { noPerm: 'You do not have permission to do that.', broken: 'An unidentified error has occurred.' } );\n\n// Basic form validation\njQuery(document).ready( function($){\n\t$('form.validate').submit( function() { return wpAjax.validateForm( $(this) ); } );\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-auth-check.js",
    "content": "/* global adminpage */\n// Interim login dialog\n(function($){\n\tvar wrap, next;\n\n\tfunction show() {\n\t\tvar parent = $('#wp-auth-check'),\n\t\t\tform = $('#wp-auth-check-form'),\n\t\t\tnoframe = wrap.find('.wp-auth-fallback-expired'),\n\t\t\tframe, loaded = false;\n\n\t\tif ( form.length ) {\n\t\t\t// Add unload confirmation to counter (frame-busting) JS redirects\n\t\t\t$(window).on( 'beforeunload.wp-auth-check', function(e) {\n\t\t\t\te.originalEvent.returnValue = window.authcheckL10n.beforeunload;\n\t\t\t});\n\n\t\t\tframe = $('<iframe id=\"wp-auth-check-frame\" frameborder=\"0\">').attr( 'title', noframe.text() );\n\t\t\tframe.load( function() {\n\t\t\t\tvar height, body;\n\n\t\t\t\tloaded = true;\n\n\t\t\t\ttry {\n\t\t\t\t\tbody = $(this).contents().find('body');\n\t\t\t\t\theight = body.height();\n\t\t\t\t} catch(e) {\n\t\t\t\t\twrap.addClass('fallback');\n\t\t\t\t\tparent.css( 'max-height', '' );\n\t\t\t\t\tform.remove();\n\t\t\t\t\tnoframe.focus();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif ( height ) {\n\t\t\t\t\tif ( body && body.hasClass('interim-login-success') )\n\t\t\t\t\t\thide();\n\t\t\t\t\telse\n\t\t\t\t\t\tparent.css( 'max-height', height + 40 + 'px' );\n\t\t\t\t} else if ( ! body || ! body.length ) {\n\t\t\t\t\t// Catch \"silent\" iframe origin exceptions in WebKit after another page is loaded in the iframe\n\t\t\t\t\twrap.addClass('fallback');\n\t\t\t\t\tparent.css( 'max-height', '' );\n\t\t\t\t\tform.remove();\n\t\t\t\t\tnoframe.focus();\n\t\t\t\t}\n\t\t\t}).attr( 'src', form.data('src') );\n\n\t\t\t$('#wp-auth-check-form').append( frame );\n\t\t}\n\n\t\t$( 'body' ).addClass( 'modal-open' );\n\t\twrap.removeClass('hidden');\n\n\t\tif ( frame ) {\n\t\t\tframe.focus();\n\t\t\t// WebKit doesn't throw an error if the iframe fails to load because of \"X-Frame-Options: DENY\" header.\n\t\t\t// Wait for 10 sec. and switch to the fallback text.\n\t\t\tsetTimeout( function() {\n\t\t\t\tif ( ! loaded ) {\n\t\t\t\t\twrap.addClass('fallback');\n\t\t\t\t\tform.remove();\n\t\t\t\t\tnoframe.focus();\n\t\t\t\t}\n\t\t\t}, 10000 );\n\t\t} else {\n\t\t\tnoframe.focus();\n\t\t}\n\t}\n\n\tfunction hide() {\n\t\t$(window).off( 'beforeunload.wp-auth-check' );\n\n\t\t// When on the Edit Post screen, speed up heartbeat after the user logs in to quickly refresh nonces\n\t\tif ( typeof adminpage !== 'undefined' && ( adminpage === 'post-php' || adminpage === 'post-new-php' ) &&\n\t\t\ttypeof wp !== 'undefined' && wp.heartbeat ) {\n\n\t\t\t$(document).off( 'heartbeat-tick.wp-auth-check' );\n\t\t\twp.heartbeat.connectNow();\n\t\t}\n\n\t\twrap.fadeOut( 200, function() {\n\t\t\twrap.addClass('hidden').css('display', '');\n\t\t\t$('#wp-auth-check-frame').remove();\n\t\t\t$( 'body' ).removeClass( 'modal-open' );\n\t\t});\n\t}\n\n\tfunction schedule() {\n\t\tvar interval = parseInt( window.authcheckL10n.interval, 10 ) || 180; // in seconds, default 3 min.\n\t\tnext = ( new Date() ).getTime() + ( interval * 1000 );\n\t}\n\n\t$( document ).on( 'heartbeat-tick.wp-auth-check', function( e, data ) {\n\t\tif ( 'wp-auth-check' in data ) {\n\t\t\tschedule();\n\t\t\tif ( ! data['wp-auth-check'] && wrap.hasClass('hidden') ) {\n\t\t\t\tshow();\n\t\t\t} else if ( data['wp-auth-check'] && ! wrap.hasClass('hidden') ) {\n\t\t\t\thide();\n\t\t\t}\n\t\t}\n\t}).on( 'heartbeat-send.wp-auth-check', function( e, data ) {\n\t\tif ( ( new Date() ).getTime() > next ) {\n\t\t\tdata['wp-auth-check'] = true;\n\t\t}\n\t}).ready( function() {\n\t\tschedule();\n\t\twrap = $('#wp-auth-check-wrap');\n\t\twrap.find('.wp-auth-check-close').on( 'click', function() {\n\t\t\thide();\n\t\t});\n\t});\n\n}(jQuery));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-backbone.js",
    "content": "window.wp = window.wp || {};\n\n(function ($) {\n\t// Create the WordPress Backbone namespace.\n\twp.Backbone = {};\n\n\n\t// wp.Backbone.Subviews\n\t// --------------------\n\t//\n\t// A subview manager.\n\twp.Backbone.Subviews = function( view, views ) {\n\t\tthis.view = view;\n\t\tthis._views = _.isArray( views ) ? { '': views } : views || {};\n\t};\n\n\twp.Backbone.Subviews.extend = Backbone.Model.extend;\n\n\t_.extend( wp.Backbone.Subviews.prototype, {\n\t\t// ### Fetch all of the subviews\n\t\t//\n\t\t// Returns an array of all subviews.\n\t\tall: function() {\n\t\t\treturn _.flatten( this._views );\n\t\t},\n\n\t\t// ### Get a selector's subviews\n\t\t//\n\t\t// Fetches all subviews that match a given `selector`.\n\t\t//\n\t\t// If no `selector` is provided, it will grab all subviews attached\n\t\t// to the view's root.\n\t\tget: function( selector ) {\n\t\t\tselector = selector || '';\n\t\t\treturn this._views[ selector ];\n\t\t},\n\n\t\t// ### Get a selector's first subview\n\t\t//\n\t\t// Fetches the first subview that matches a given `selector`.\n\t\t//\n\t\t// If no `selector` is provided, it will grab the first subview\n\t\t// attached to the view's root.\n\t\t//\n\t\t// Useful when a selector only has one subview at a time.\n\t\tfirst: function( selector ) {\n\t\t\tvar views = this.get( selector );\n\t\t\treturn views && views.length ? views[0] : null;\n\t\t},\n\n\t\t// ### Register subview(s)\n\t\t//\n\t\t// Registers any number of `views` to a `selector`.\n\t\t//\n\t\t// When no `selector` is provided, the root selector (the empty string)\n\t\t// is used. `views` accepts a `Backbone.View` instance or an array of\n\t\t// `Backbone.View` instances.\n\t\t//\n\t\t// ---\n\t\t//\n\t\t// Accepts an `options` object, which has a significant effect on the\n\t\t// resulting behavior.\n\t\t//\n\t\t// `options.silent` &ndash; *boolean, `false`*\n\t\t// > If `options.silent` is true, no DOM modifications will be made.\n\t\t//\n\t\t// `options.add` &ndash; *boolean, `false`*\n\t\t// > Use `Views.add()` as a shortcut for setting `options.add` to true.\n\t\t//\n\t\t// > By default, the provided `views` will replace\n\t\t// any existing views associated with the selector. If `options.add`\n\t\t// is true, the provided `views` will be added to the existing views.\n\t\t//\n\t\t// `options.at` &ndash; *integer, `undefined`*\n\t\t// > When adding, to insert `views` at a specific index, use\n\t\t// `options.at`. By default, `views` are added to the end of the array.\n\t\tset: function( selector, views, options ) {\n\t\t\tvar existing, next;\n\n\t\t\tif ( ! _.isString( selector ) ) {\n\t\t\t\toptions  = views;\n\t\t\t\tviews    = selector;\n\t\t\t\tselector = '';\n\t\t\t}\n\n\t\t\toptions  = options || {};\n\t\t\tviews    = _.isArray( views ) ? views : [ views ];\n\t\t\texisting = this.get( selector );\n\t\t\tnext     = views;\n\n\t\t\tif ( existing ) {\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tif ( _.isUndefined( options.at ) ) {\n\t\t\t\t\t\tnext = existing.concat( views );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext = existing;\n\t\t\t\t\t\tnext.splice.apply( next, [ options.at, 0 ].concat( views ) );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t_.each( next, function( view ) {\n\t\t\t\t\t\tview.__detach = true;\n\t\t\t\t\t});\n\n\t\t\t\t\t_.each( existing, function( view ) {\n\t\t\t\t\t\tif ( view.__detach )\n\t\t\t\t\t\t\tview.$el.detach();\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tview.remove();\n\t\t\t\t\t});\n\n\t\t\t\t\t_.each( next, function( view ) {\n\t\t\t\t\t\tdelete view.__detach;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis._views[ selector ] = next;\n\n\t\t\t_.each( views, function( subview ) {\n\t\t\t\tvar constructor = subview.Views || wp.Backbone.Subviews,\n\t\t\t\t\tsubviews = subview.views = subview.views || new constructor( subview );\n\t\t\t\tsubviews.parent   = this.view;\n\t\t\t\tsubviews.selector = selector;\n\t\t\t}, this );\n\n\t\t\tif ( ! options.silent )\n\t\t\t\tthis._attach( selector, views, _.extend({ ready: this._isReady() }, options ) );\n\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### Add subview(s) to existing subviews\n\t\t//\n\t\t// An alias to `Views.set()`, which defaults `options.add` to true.\n\t\t//\n\t\t// Adds any number of `views` to a `selector`.\n\t\t//\n\t\t// When no `selector` is provided, the root selector (the empty string)\n\t\t// is used. `views` accepts a `Backbone.View` instance or an array of\n\t\t// `Backbone.View` instances.\n\t\t//\n\t\t// Use `Views.set()` when setting `options.add` to `false`.\n\t\t//\n\t\t// Accepts an `options` object. By default, provided `views` will be\n\t\t// inserted at the end of the array of existing views. To insert\n\t\t// `views` at a specific index, use `options.at`. If `options.silent`\n\t\t// is true, no DOM modifications will be made.\n\t\t//\n\t\t// For more information on the `options` object, see `Views.set()`.\n\t\tadd: function( selector, views, options ) {\n\t\t\tif ( ! _.isString( selector ) ) {\n\t\t\t\toptions  = views;\n\t\t\t\tviews    = selector;\n\t\t\t\tselector = '';\n\t\t\t}\n\n\t\t\treturn this.set( selector, views, _.extend({ add: true }, options ) );\n\t\t},\n\n\t\t// ### Stop tracking subviews\n\t\t//\n\t\t// Stops tracking `views` registered to a `selector`. If no `views` are\n\t\t// set, then all of the `selector`'s subviews will be unregistered and\n\t\t// removed.\n\t\t//\n\t\t// Accepts an `options` object. If `options.silent` is set, `remove`\n\t\t// will *not* be triggered on the unregistered views.\n\t\tunset: function( selector, views, options ) {\n\t\t\tvar existing;\n\n\t\t\tif ( ! _.isString( selector ) ) {\n\t\t\t\toptions = views;\n\t\t\t\tviews = selector;\n\t\t\t\tselector = '';\n\t\t\t}\n\n\t\t\tviews = views || [];\n\n\t\t\tif ( existing = this.get( selector ) ) {\n\t\t\t\tviews = _.isArray( views ) ? views : [ views ];\n\t\t\t\tthis._views[ selector ] = views.length ? _.difference( existing, views ) : [];\n\t\t\t}\n\n\t\t\tif ( ! options || ! options.silent )\n\t\t\t\t_.invoke( views, 'remove' );\n\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### Detach all subviews\n\t\t//\n\t\t// Detaches all subviews from the DOM.\n\t\t//\n\t\t// Helps to preserve all subview events when re-rendering the master\n\t\t// view. Used in conjunction with `Views.render()`.\n\t\tdetach: function() {\n\t\t\t$( _.pluck( this.all(), 'el' ) ).detach();\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### Render all subviews\n\t\t//\n\t\t// Renders all subviews. Used in conjunction with `Views.detach()`.\n\t\trender: function() {\n\t\t\tvar options = {\n\t\t\t\t\tready: this._isReady()\n\t\t\t\t};\n\n\t\t\t_.each( this._views, function( views, selector ) {\n\t\t\t\tthis._attach( selector, views, options );\n\t\t\t}, this );\n\n\t\t\tthis.rendered = true;\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### Remove all subviews\n\t\t//\n\t\t// Triggers the `remove()` method on all subviews. Detaches the master\n\t\t// view from its parent. Resets the internals of the views manager.\n\t\t//\n\t\t// Accepts an `options` object. If `options.silent` is set, `unset`\n\t\t// will *not* be triggered on the master view's parent.\n\t\tremove: function( options ) {\n\t\t\tif ( ! options || ! options.silent ) {\n\t\t\t\tif ( this.parent && this.parent.views )\n\t\t\t\t\tthis.parent.views.unset( this.selector, this.view, { silent: true });\n\t\t\t\tdelete this.parent;\n\t\t\t\tdelete this.selector;\n\t\t\t}\n\n\t\t\t_.invoke( this.all(), 'remove' );\n\t\t\tthis._views = [];\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### Replace a selector's subviews\n\t\t//\n\t\t// By default, sets the `$target` selector's html to the subview `els`.\n\t\t//\n\t\t// Can be overridden in subclasses.\n\t\treplace: function( $target, els ) {\n\t\t\t$target.html( els );\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### Insert subviews into a selector\n\t\t//\n\t\t// By default, appends the subview `els` to the end of the `$target`\n\t\t// selector. If `options.at` is set, inserts the subview `els` at the\n\t\t// provided index.\n\t\t//\n\t\t// Can be overridden in subclasses.\n\t\tinsert: function( $target, els, options ) {\n\t\t\tvar at = options && options.at,\n\t\t\t\t$children;\n\n\t\t\tif ( _.isNumber( at ) && ($children = $target.children()).length > at )\n\t\t\t\t$children.eq( at ).before( els );\n\t\t\telse\n\t\t\t\t$target.append( els );\n\n\t\t\treturn this;\n\t\t},\n\n\t\t// ### Trigger the ready event\n\t\t//\n\t\t// **Only use this method if you know what you're doing.**\n\t\t// For performance reasons, this method does not check if the view is\n\t\t// actually attached to the DOM. It's taking your word for it.\n\t\t//\n\t\t// Fires the ready event on the current view and all attached subviews.\n\t\tready: function() {\n\t\t\tthis.view.trigger('ready');\n\n\t\t\t// Find all attached subviews, and call ready on them.\n\t\t\t_.chain( this.all() ).map( function( view ) {\n\t\t\t\treturn view.views;\n\t\t\t}).flatten().where({ attached: true }).invoke('ready');\n\t\t},\n\n\t\t// #### Internal. Attaches a series of views to a selector.\n\t\t//\n\t\t// Checks to see if a matching selector exists, renders the views,\n\t\t// performs the proper DOM operation, and then checks if the view is\n\t\t// attached to the document.\n\t\t_attach: function( selector, views, options ) {\n\t\t\tvar $selector = selector ? this.view.$( selector ) : this.view.$el,\n\t\t\t\tmanagers;\n\n\t\t\t// Check if we found a location to attach the views.\n\t\t\tif ( ! $selector.length )\n\t\t\t\treturn this;\n\n\t\t\tmanagers = _.chain( views ).pluck('views').flatten().value();\n\n\t\t\t// Render the views if necessary.\n\t\t\t_.each( managers, function( manager ) {\n\t\t\t\tif ( manager.rendered )\n\t\t\t\t\treturn;\n\n\t\t\t\tmanager.view.render();\n\t\t\t\tmanager.rendered = true;\n\t\t\t}, this );\n\n\t\t\t// Insert or replace the views.\n\t\t\tthis[ options.add ? 'insert' : 'replace' ]( $selector, _.pluck( views, 'el' ), options );\n\n\t\t\t// Set attached and trigger ready if the current view is already\n\t\t\t// attached to the DOM.\n\t\t\t_.each( managers, function( manager ) {\n\t\t\t\tmanager.attached = true;\n\n\t\t\t\tif ( options.ready )\n\t\t\t\t\tmanager.ready();\n\t\t\t}, this );\n\n\t\t\treturn this;\n\t\t},\n\n\t\t// #### Internal. Checks if the current view is in the DOM.\n\t\t_isReady: function() {\n\t\t\tvar node = this.view.el;\n\t\t\twhile ( node ) {\n\t\t\t\tif ( node === document.body )\n\t\t\t\t\treturn true;\n\t\t\t\tnode = node.parentNode;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t});\n\n\n\t// wp.Backbone.View\n\t// ----------------\n\t//\n\t// The base view class.\n\twp.Backbone.View = Backbone.View.extend({\n\t\t// The constructor for the `Views` manager.\n\t\tSubviews: wp.Backbone.Subviews,\n\n\t\tconstructor: function( options ) {\n\t\t\tthis.views = new this.Subviews( this, this.views );\n\t\t\tthis.on( 'ready', this.ready, this );\n\n\t\t\tthis.options = options || {};\n\n\t\t\tBackbone.View.apply( this, arguments );\n\t\t},\n\n\t\tremove: function() {\n\t\t\tvar result = Backbone.View.prototype.remove.apply( this, arguments );\n\n\t\t\t// Recursively remove child views.\n\t\t\tif ( this.views )\n\t\t\t\tthis.views.remove();\n\n\t\t\treturn result;\n\t\t},\n\n\t\trender: function() {\n\t\t\tvar options;\n\n\t\t\tif ( this.prepare )\n\t\t\t\toptions = this.prepare();\n\n\t\t\tthis.views.detach();\n\n\t\t\tif ( this.template ) {\n\t\t\t\toptions = options || {};\n\t\t\t\tthis.trigger( 'prepare', options );\n\t\t\t\tthis.$el.html( this.template( options ) );\n\t\t\t}\n\n\t\t\tthis.views.render();\n\t\t\treturn this;\n\t\t},\n\n\t\tprepare: function() {\n\t\t\treturn this.options;\n\t\t},\n\n\t\tready: function() {}\n\t});\n}(jQuery));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-embed-template.js",
    "content": "(function ( window, document ) {\n\t'use strict';\n\n\tvar supportedBrowser = ( document.querySelector && window.addEventListener ),\n\t\tloaded = false,\n\t\tsecret,\n\t\tsecretTimeout,\n\t\tresizing;\n\n\tfunction sendEmbedMessage( message, value ) {\n\t\twindow.parent.postMessage( {\n\t\t\tmessage: message,\n\t\t\tvalue: value,\n\t\t\tsecret: secret\n\t\t}, '*' );\n\t}\n\n\tfunction onLoad() {\n\t\tif ( loaded ) {\n\t\t\treturn;\n\t\t}\n\t\tloaded = true;\n\n\t\tvar share_dialog = document.querySelector( '.wp-embed-share-dialog' ),\n\t\t\tshare_dialog_open = document.querySelector( '.wp-embed-share-dialog-open' ),\n\t\t\tshare_dialog_close = document.querySelector( '.wp-embed-share-dialog-close' ),\n\t\t\tshare_input = document.querySelectorAll( '.wp-embed-share-input' ),\n\t\t\tshare_dialog_tabs = document.querySelectorAll( '.wp-embed-share-tab-button button' ),\n\t\t\tlinks = document.getElementsByTagName( 'a' ),\n\t\t\ti;\n\n\t\tif ( share_input ) {\n\t\t\tfor ( i = 0; i < share_input.length; i++ ) {\n\t\t\t\tshare_input[ i ].addEventListener( 'click', function ( e ) {\n\t\t\t\t\te.target.select();\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\tfunction openSharingDialog() {\n\t\t\tshare_dialog.className = share_dialog.className.replace( 'hidden', '' );\n\t\t\t// Initial focus should go on the currently selected tab in the dialog.\n\t\t\tdocument.querySelector( '.wp-embed-share-tab-button [aria-selected=\"true\"]' ).focus();\n\t\t}\n\n\t\tfunction closeSharingDialog() {\n\t\t\tshare_dialog.className += ' hidden';\n\t\t\tdocument.querySelector( '.wp-embed-share-dialog-open' ).focus();\n\t\t}\n\n\t\tif ( share_dialog_open ) {\n\t\t\tshare_dialog_open.addEventListener( 'click', function () {\n\t\t\t\topenSharingDialog();\n\t\t\t} );\n\t\t}\n\n\t\tif ( share_dialog_close ) {\n\t\t\tshare_dialog_close.addEventListener( 'click', function () {\n\t\t\t\tcloseSharingDialog();\n\t\t\t} );\n\t\t}\n\n\t\tfunction shareClickHandler( e ) {\n\t\t\tvar currentTab = document.querySelector( '.wp-embed-share-tab-button [aria-selected=\"true\"]' );\n\t\t\tcurrentTab.setAttribute( 'aria-selected', 'false' );\n\t\t\tdocument.querySelector( '#' + currentTab.getAttribute( 'aria-controls' ) ).setAttribute( 'aria-hidden', 'true' );\n\n\t\t\te.target.setAttribute( 'aria-selected', 'true' );\n\t\t\tdocument.querySelector( '#' + e.target.getAttribute( 'aria-controls' ) ).setAttribute( 'aria-hidden', 'false' );\n\t\t}\n\n\t\tfunction shareKeyHandler( e ) {\n\t\t\tvar target = e.target,\n\t\t\t\tpreviousSibling = target.parentElement.previousElementSibling,\n\t\t\t\tnextSibling = target.parentElement.nextElementSibling,\n\t\t\t\tnewTab, newTabChild;\n\n\t\t\tif ( 37 === e.keyCode ) {\n\t\t\t\tnewTab = previousSibling;\n\t\t\t} else if ( 39 === e.keyCode ) {\n\t\t\t\tnewTab = nextSibling;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( 'rtl' === document.documentElement.getAttribute( 'dir' ) ) {\n\t\t\t\tnewTab = ( newTab === previousSibling ) ? nextSibling : previousSibling;\n\t\t\t}\n\n\t\t\tif ( newTab ) {\n\t\t\t\tnewTabChild = newTab.firstElementChild;\n\n\t\t\t\ttarget.setAttribute( 'tabindex', '-1' );\n\t\t\t\ttarget.setAttribute( 'aria-selected', false );\n\t\t\t\tdocument.querySelector( '#' + target.getAttribute( 'aria-controls' ) ).setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t\tnewTabChild.setAttribute( 'tabindex', '0' );\n\t\t\t\tnewTabChild.setAttribute( 'aria-selected', 'true' );\n\t\t\t\tnewTabChild.focus();\n\t\t\t\tdocument.querySelector( '#' + newTabChild.getAttribute( 'aria-controls' ) ).setAttribute( 'aria-hidden', 'false' );\n\t\t\t}\n\t\t}\n\n\t\tif ( share_dialog_tabs ) {\n\t\t\tfor ( i = 0; i < share_dialog_tabs.length; i++ ) {\n\t\t\t\tshare_dialog_tabs[ i ].addEventListener( 'click', shareClickHandler );\n\n\t\t\t\tshare_dialog_tabs[ i ].addEventListener( 'keydown', shareKeyHandler );\n\t\t\t}\n\t\t}\n\n\t\tdocument.addEventListener( 'keydown', function ( e ) {\n\t\t\tif ( 27 === e.keyCode && -1 === share_dialog.className.indexOf( 'hidden' ) ) {\n\t\t\t\tcloseSharingDialog();\n\t\t\t} else if ( 9 === e.keyCode ) {\n\t\t\t\tconstrainTabbing( e );\n\t\t\t}\n\t\t}, false );\n\n\t\tfunction constrainTabbing( e ) {\n\t\t\t// Need to re-get the selected tab each time.\n\t\t\tvar firstFocusable = document.querySelector( '.wp-embed-share-tab-button [aria-selected=\"true\"]' );\n\n\t\t\tif ( share_dialog_close === e.target && ! e.shiftKey ) {\n\t\t\t\tfirstFocusable.focus();\n\t\t\t\te.preventDefault();\n\t\t\t} else if ( firstFocusable === e.target && e.shiftKey ) {\n\t\t\t\tshare_dialog_close.focus();\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t}\n\n\t\tif ( window.self === window.top ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Send this document's height to the parent (embedding) site.\n\t\t */\n\t\tsendEmbedMessage( 'height', Math.ceil( document.body.getBoundingClientRect().height ) );\n\n\t\t/**\n\t\t * Detect clicks to external (_top) links.\n\t\t */\n\t\tfunction linkClickHandler( e ) {\n\t\t\tvar target = e.target,\n\t\t\t\thref;\n\t\t\tif ( target.hasAttribute( 'href' ) ) {\n\t\t\t\thref = target.getAttribute( 'href' );\n\t\t\t} else {\n\t\t\t\thref = target.parentElement.getAttribute( 'href' );\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Send link target to the parent (embedding) site.\n\t\t\t */\n\t\t\tsendEmbedMessage( 'link', href );\n\t\t\te.preventDefault();\n\t\t}\n\n\t\tfor ( i = 0; i < links.length; i++ ) {\n\t\t\tlinks[ i ].addEventListener( 'click', linkClickHandler );\n\t\t}\n\t}\n\n\t/**\n\t * Iframe resize handler.\n\t */\n\tfunction onResize() {\n\t\tif ( window.self === window.top ) {\n\t\t\treturn;\n\t\t}\n\n\t\tclearTimeout( resizing );\n\n\t\tresizing = setTimeout( function () {\n\t\t\tsendEmbedMessage( 'height', Math.ceil( document.body.getBoundingClientRect().height ) );\n\t\t}, 100 );\n\t}\n\n\t/**\n\t * Re-get the secret when it was added later on.\n\t */\n\tfunction getSecret() {\n\t\tif ( window.self === window.top || !!secret ) {\n\t\t\treturn;\n\t\t}\n\n\t\tsecret = window.location.hash.replace( /.*secret=([\\d\\w]{10}).*/, '$1' );\n\n\t\tclearTimeout( secretTimeout );\n\n\t\tsecretTimeout = setTimeout( function () {\n\t\t\tgetSecret();\n\t\t}, 100 );\n\t}\n\n\tif ( supportedBrowser ) {\n\t\tgetSecret();\n\t\tdocument.documentElement.className = document.documentElement.className.replace( /\\bno-js\\b/, '' ) + ' js';\n\t\tdocument.addEventListener( 'DOMContentLoaded', onLoad, false );\n\t\twindow.addEventListener( 'load', onLoad, false );\n\t\twindow.addEventListener( 'resize', onResize, false );\n\t}\n})( window, document );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-embed.js",
    "content": "/**\n * WordPress inline HTML embed\n *\n * @since 4.4.0\n *\n * This file cannot have ampersands in it. This is to ensure\n * it can be embedded in older versions of WordPress.\n * See https://core.trac.wordpress.org/changeset/35708.\n */\n(function ( window, document ) {\n\t'use strict';\n\n\tvar supportedBrowser = false,\n\t\tloaded = false;\n\n\t\tif ( document.querySelector ) {\n\t\t\tif ( window.addEventListener ) {\n\t\t\t\tsupportedBrowser = true;\n\t\t\t}\n\t\t}\n\n\twindow.wp = window.wp || {};\n\n\tif ( !! window.wp.receiveEmbedMessage ) {\n\t\treturn;\n\t}\n\n\twindow.wp.receiveEmbedMessage = function( e ) {\n\t\tvar data = e.data;\n\t\tif ( ! ( data.secret || data.message || data.value ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( /[^a-zA-Z0-9]/.test( data.secret ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar iframes = document.querySelectorAll( 'iframe[data-secret=\"' + data.secret + '\"]' ),\n\t\t\tblockquotes = document.querySelectorAll( 'blockquote[data-secret=\"' + data.secret + '\"]' ),\n\t\t\ti, source, height, sourceURL, targetURL;\n\n\t\tfor ( i = 0; i < blockquotes.length; i++ ) {\n\t\t\tblockquotes[ i ].style.display = 'none';\n\t\t}\n\n\t\tfor ( i = 0; i < iframes.length; i++ ) {\n\t\t\tsource = iframes[ i ];\n\n\t\t\tif ( e.source !== source.contentWindow ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tsource.style.display = '';\n\n\t\t\t/* Resize the iframe on request. */\n\t\t\tif ( 'height' === data.message ) {\n\t\t\t\theight = parseInt( data.value, 10 );\n\t\t\t\tif ( height > 1000 ) {\n\t\t\t\t\theight = 1000;\n\t\t\t\t} else if ( ~~height < 200 ) {\n\t\t\t\t\theight = 200;\n\t\t\t\t}\n\n\t\t\t\tsource.height = height;\n\t\t\t}\n\n\t\t\t/* Link to a specific URL on request. */\n\t\t\tif ( 'link' === data.message ) {\n\t\t\t\tsourceURL = document.createElement( 'a' );\n\t\t\t\ttargetURL = document.createElement( 'a' );\n\n\t\t\t\tsourceURL.href = source.getAttribute( 'src' );\n\t\t\t\ttargetURL.href = data.value;\n\n\t\t\t\t/* Only continue if link hostname matches iframe's hostname. */\n\t\t\t\tif ( targetURL.host === sourceURL.host ) {\n\t\t\t\t\tif ( document.activeElement === source ) {\n\t\t\t\t\t\twindow.top.location.href = data.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction onLoad() {\n\t\tif ( loaded ) {\n\t\t\treturn;\n\t\t}\n\t\tloaded = true;\n\n\t\tvar isIE10 = -1 !== navigator.appVersion.indexOf( 'MSIE 10' ),\n\t\t\tisIE11 = !!navigator.userAgent.match( /Trident.*rv:11\\./ ),\n\t\t\tiframes = document.querySelectorAll( 'iframe.wp-embedded-content' ),\n\t\t\tblockquotes = document.querySelectorAll( 'blockquote.wp-embedded-content' ),\n\t\t\tiframeClone, i, source, secret;\n\n\t\tfor ( i = 0; i < blockquotes.length; i++ ) {\n\t\t\tblockquotes[ i ].style.display = 'none';\n\t\t}\n\n\t\tfor ( i = 0; i < iframes.length; i++ ) {\n\t\t\tsource = iframes[ i ];\n\t\t\tsource.style.display = '';\n\n\t\t\tif ( source.getAttribute( 'data-secret' ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* Add secret to iframe */\n\t\t\tsecret = Math.random().toString( 36 ).substr( 2, 10 );\n\t\t\tsource.src += '#?secret=' + secret;\n\t\t\tsource.setAttribute( 'data-secret', secret );\n\n\t\t\t/* Remove security attribute from iframes in IE10 and IE11. */\n\t\t\tif ( ( isIE10 || isIE11 ) ) {\n\t\t\t\tiframeClone = source.cloneNode( true );\n\t\t\t\tiframeClone.removeAttribute( 'security' );\n\t\t\t\tsource.parentNode.replaceChild( iframeClone, source );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( supportedBrowser ) {\n\t\twindow.addEventListener( 'message', window.wp.receiveEmbedMessage, false );\n\t\tdocument.addEventListener( 'DOMContentLoaded', onLoad, false );\n\t\twindow.addEventListener( 'load', onLoad, false );\n\t}\n})( window, document );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-emoji-loader.js",
    "content": "( function( window, document, settings ) {\n\tvar src, ready;\n\n\t/**\n\t * Detect if the browser supports rendering emoji or flag emoji. Flag emoji are a single glyph\n\t * made of two characters, so some browsers (notably, Firefox OS X) don't support them.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param type {String} Whether to test for support of \"simple\" or \"flag\" emoji.\n\t * @return {Boolean} True if the browser can render emoji, false if it cannot.\n\t */\n\tfunction browserSupportsEmoji( type ) {\n\t\tvar canvas = document.createElement( 'canvas' ),\n\t\t\tcontext = canvas.getContext && canvas.getContext( '2d' ),\n\t\t\tstringFromCharCode = String.fromCharCode,\n\t\t\ttone;\n\n\t\tif ( ! context || ! context.fillText ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t/*\n\t\t * Chrome on OS X added native emoji rendering in M41. Unfortunately,\n\t\t * it doesn't work when the font is bolder than 500 weight. So, we\n\t\t * check for bold rendering support to avoid invisible emoji in Chrome.\n\t\t */\n\t\tcontext.textBaseline = 'top';\n\t\tcontext.font = '600 32px Arial';\n\n\t\tif ( 'flag' === type ) {\n\t\t\t/*\n\t\t\t * This works because the image will be one of three things:\n\t\t\t * - Two empty squares, if the browser doesn't render emoji\n\t\t\t * - Two squares with 'A' and 'U' in them, if the browser doesn't render flag emoji\n\t\t\t * - The Australian flag\n\t\t\t *\n\t\t\t * The first two will encode to small images (1-2KB data URLs), the third will encode\n\t\t\t * to a larger image (4-5KB data URL).\n\t\t\t */\n\t\t\tcontext.fillText( stringFromCharCode( 55356, 56806, 55356, 56826 ), 0, 0 );\n\t\t\treturn canvas.toDataURL().length > 3000;\n\t\t} else if ( 'diversity' === type ) {\n\t\t\t/*\n\t\t\t * This tests if the browser supports the Emoji Diversity specification, by rendering an\n\t\t\t * emoji with no skin tone specified (in this case, Santa). It then adds a skin tone, and\n\t\t\t * compares if the emoji rendering has changed.\n\t\t\t */\n\t\t\tcontext.fillText( stringFromCharCode( 55356, 57221 ), 0, 0 );\n\t\t\ttone = context.getImageData( 16, 16, 1, 1 ).data.toString();\n\t\t\tcontext.fillText( stringFromCharCode( 55356, 57221, 55356, 57343 ), 0, 0 );\n\t\t\t// Chrome has issues comparing arrays, so we compare it as a  string, instead.\n\t\t\treturn tone !== context.getImageData( 16, 16, 1, 1 ).data.toString();\n\t\t} else {\n\t\t\tif ( 'simple' === type ) {\n\t\t\t\t/*\n\t\t\t\t * This creates a smiling emoji, and checks to see if there is any image data in the\n\t\t\t\t * center pixel. In browsers that don't support emoji, the character will be rendered\n\t\t\t\t * as an empty square, so the center pixel will be blank.\n\t\t\t\t */\n\t\t\t\tcontext.fillText( stringFromCharCode( 55357, 56835 ), 0, 0 );\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * To check for Unicode 8 support, let's try rendering the most important advancement\n\t\t\t\t * that the Unicode Consortium have made in years: the burrito.\n\t\t\t\t */\n\t\t\t\tcontext.fillText( stringFromCharCode( 55356, 57135 ), 0, 0 );\n\t\t\t}\n\t\t\treturn context.getImageData( 16, 16, 1, 1 ).data[0] !== 0;\n\t\t}\n\t}\n\n\tfunction addScript( src ) {\n\t\tvar script = document.createElement( 'script' );\n\n\t\tscript.src = src;\n\t\tscript.type = 'text/javascript';\n\t\tdocument.getElementsByTagName( 'head' )[0].appendChild( script );\n\t}\n\n\tsettings.supports = {\n\t\tsimple:    browserSupportsEmoji( 'simple' ),\n\t\tflag:      browserSupportsEmoji( 'flag' ),\n\t\tunicode8:  browserSupportsEmoji( 'unicode8' ),\n\t\tdiversity: browserSupportsEmoji( 'diversity' )\n\t};\n\n\tsettings.DOMReady = false;\n\tsettings.readyCallback = function() {\n\t\tsettings.DOMReady = true;\n\t};\n\n\tif ( ! settings.supports.simple || ! settings.supports.flag || ! settings.supports.unicode8 || ! settings.supports.diversity ) {\n\t\tready = function() {\n\t\t\tsettings.readyCallback();\n\t\t};\n\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.addEventListener( 'DOMContentLoaded', ready, false );\n\t\t\twindow.addEventListener( 'load', ready, false );\n\t\t} else {\n\t\t\twindow.attachEvent( 'onload', ready );\n\t\t\tdocument.attachEvent( 'onreadystatechange', function() {\n\t\t\t\tif ( 'complete' === document.readyState ) {\n\t\t\t\t\tsettings.readyCallback();\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tsrc = settings.source || {};\n\n\t\tif ( src.concatemoji ) {\n\t\t\taddScript( src.concatemoji );\n\t\t} else if ( src.wpemoji && src.twemoji ) {\n\t\t\taddScript( src.twemoji );\n\t\t\taddScript( src.wpemoji );\n\t\t}\n\t}\n\n} )( window, document, window._wpemojiSettings );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-emoji.js",
    "content": "\n( function( window, settings ) {\n\tfunction wpEmoji() {\n\t\tvar MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,\n\n\t\t/**\n\t\t * Flag to determine if we should replace emoji characters with images.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @var Boolean\n\t\t */\n\t\treplaceEmoji = false,\n\n\t\t// Private\n\t\ttwemoji, timer,\n\t\tloaded = false,\n\t\tcount = 0;\n\n\t\t/**\n\t\t * Runs when the document load event is fired, so we can do our first parse of the page.\n\t\t *\n\t\t * @since 4.2.0\n\t\t */\n\t\tfunction load() {\n\t\t\tif ( loaded ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( typeof window.twemoji === 'undefined' ) {\n\t\t\t\t// Break if waiting for longer than 30 sec.\n\t\t\t\tif ( count > 600 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Still waiting.\n\t\t\t\twindow.clearTimeout( timer );\n\t\t\t\ttimer = window.setTimeout( load, 50 );\n\t\t\t\tcount++;\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttwemoji = window.twemoji;\n\t\t\tloaded = true;\n\n\t\t\tif ( MutationObserver ) {\n\t\t\t\tnew MutationObserver( function( mutationRecords ) {\n\t\t\t\t\tvar i = mutationRecords.length,\n\t\t\t\t\t\taddedNodes, removedNodes, ii, node;\n\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\taddedNodes = mutationRecords[ i ].addedNodes;\n\t\t\t\t\t\tremovedNodes = mutationRecords[ i ].removedNodes;\n\t\t\t\t\t\tii = addedNodes.length;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tii === 1 && removedNodes.length === 1 &&\n\t\t\t\t\t\t\taddedNodes[0].nodeType === 3 &&\n\t\t\t\t\t\t\tremovedNodes[0].nodeName === 'IMG' &&\n\t\t\t\t\t\t\taddedNodes[0].data === removedNodes[0].alt &&\n\t\t\t\t\t\t\t'load-failed' === removedNodes[0].getAttribute( 'data-error' )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\twhile ( ii-- ) {\n\t\t\t\t\t\t\tnode = addedNodes[ ii ];\n\n\t\t\t\t\t\t\tif ( node.nodeType === 3 ) {\n\t\t\t\t\t\t\t\tnode = node.parentNode;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( ! node || node.nodeType !== 1 ||\n\t\t\t\t\t\t\t\t( node.className && typeof node.className === 'string' && node.className.indexOf( 'wp-exclude-emoji' ) !== -1 ) ) {\n\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( test( node.textContent ) ) {\n\t\t\t\t\t\t\t\tparse( node );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ).observe( document.body, {\n\t\t\t\t\tchildList: true,\n\t\t\t\t\tsubtree: true\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tparse( document.body );\n\t\t}\n\n\t\t/**\n\t\t * Test if a text string contains emoji characters.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @param {String} text The string to test\n\t\t *\n\t\t * @return {Boolean} Whether the string contains emoji characters.\n\t\t */\n\t\tfunction test( text ) {\n\t\t\t// Single char. U+20E3 to detect keycaps. U+00A9 \"copyright sign\" and U+00AE \"registered sign\" not included.\n\t\t\tvar single = /[\\u203C\\u2049\\u20E3\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u2300\\u231A\\u231B\\u2328\\u2388\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638\\u2639\\u263A\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267F\\u2692\\u2693\\u2694\\u2696\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753\\u2754\\u2755\\u2757\\u2763\\u2764\\u2795\\u2796\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05\\u2B06\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]/,\n\t\t\t// Surrogate pair range. Only tests for the second half. \n\t\t\tpair = /[\\uDC00-\\uDFFF]/;\n\n\t\t\tif ( text ) {\n\t\t\t\treturn  pair.test( text ) || single.test( text );\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Given an element or string, parse any emoji characters into Twemoji images.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param {HTMLElement|String} object The element or string to parse.\n\t\t * @param {Object} args Additional options for Twemoji.\n\t\t */\n\t\tfunction parse( object, args ) {\n\t\t\tvar params;\n\n\t\t\tif ( ! replaceEmoji || ! twemoji || ! object ||\n\t\t\t\t( 'string' !== typeof object && ( ! object.childNodes || ! object.childNodes.length ) ) ) {\n\n\t\t\t\treturn object;\n\t\t\t}\n\n\t\t\targs = args || {};\n\t\t\tparams = {\n\t\t\t\tbase: settings.baseUrl,\n\t\t\t\text: settings.ext,\n\t\t\t\tclassName: args.className || 'emoji',\n\t\t\t\tcallback: function( icon, options ) {\n\t\t\t\t\t// Ignore some standard characters that TinyMCE recommends in its character map.\n\t\t\t\t\tswitch ( icon ) {\n\t\t\t\t\t\tcase 'a9':\n\t\t\t\t\t\tcase 'ae':\n\t\t\t\t\t\tcase '2122':\n\t\t\t\t\t\tcase '2194':\n\t\t\t\t\t\tcase '2660':\n\t\t\t\t\t\tcase '2663':\n\t\t\t\t\t\tcase '2665':\n\t\t\t\t\t\tcase '2666':\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! settings.supports.flag && settings.supports.simple && settings.supports.unicode8 && settings.supports.diversity &&\n\t\t\t\t\t\t! /^1f1(?:e[6-9a-f]|f[0-9a-f])-1f1(?:e[6-9a-f]|f[0-9a-f])$/.test( icon ) ) {\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ''.concat( options.base, icon, options.ext );\n\t\t\t\t},\n\t\t\t\tonerror: function() {\n\t\t\t\t\tif ( twemoji.parentNode ) {\n\t\t\t\t\t\tthis.setAttribute( 'data-error', 'load-failed' );\n\t\t\t\t\t\ttwemoji.parentNode.replaceChild( document.createTextNode( twemoji.alt ), twemoji );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif ( typeof args.imgAttr === 'object' ) {\n\t\t\t\tparams.attributes = function() {\n\t\t\t\t\treturn args.imgAttr;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn twemoji.parse( object, params );\n\t\t}\n\n\t\t/**\n\t\t * Initialize our emoji support, and set up listeners.\n\t\t */\n\t\tif ( settings ) {\n\t\t\treplaceEmoji = ! settings.supports.simple || ! settings.supports.flag || ! settings.supports.unicode8 || ! settings.supports.diversity;\n\n\t\t\tif ( settings.DOMReady ) {\n\t\t\t\tload();\n\t\t\t} else {\n\t\t\t\tsettings.readyCallback = load;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\treplaceEmoji: replaceEmoji,\n\t\t\tparse: parse,\n\t\t\ttest: test\n\t\t};\n\t}\n\n\twindow.wp = window.wp || {};\n\twindow.wp.emoji = new wpEmoji();\n\n} )( window, window._wpemojiSettings );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-list-revisions.js",
    "content": "(function(w) {\n\tvar init = function() {\n\t\tvar pr = document.getElementById('post-revisions'),\n\t\tinputs = pr ? pr.getElementsByTagName('input') : [];\n\t\tpr.onclick = function() {\n\t\t\tvar i, checkCount = 0, side;\n\t\t\tfor ( i = 0; i < inputs.length; i++ ) {\n\t\t\t\tcheckCount += inputs[i].checked ? 1 : 0;\n\t\t\t\tside = inputs[i].getAttribute('name');\n\t\t\t\tif ( ! inputs[i].checked &&\n\t\t\t\t( 'left' == side && 1 > checkCount || 'right' == side && 1 < checkCount && ( ! inputs[i-1] || ! inputs[i-1].checked ) ) &&\n\t\t\t\t! ( inputs[i+1] && inputs[i+1].checked && 'right' == inputs[i+1].getAttribute('name') ) )\n\t\t\t\t\tinputs[i].style.visibility = 'hidden';\n\t\t\t\telse if ( 'left' == side || 'right' == side )\n\t\t\t\t\tinputs[i].style.visibility = 'visible';\n\t\t\t}\n\t\t};\n\t\tpr.onclick();\n\t};\n\tif ( w && w.addEventListener )\n\t\tw.addEventListener('load', init, false);\n\telse if ( w && w.attachEvent )\n\t\tw.attachEvent('onload', init);\n})(window);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-lists.js",
    "content": "/* global ajaxurl, wpAjax */\n(function($) {\nvar fs = {add:'ajaxAdd',del:'ajaxDel',dim:'ajaxDim',process:'process',recolor:'recolor'}, wpList;\n\nwpList = {\n\tsettings: {\n\t\turl: ajaxurl, type: 'POST',\n\t\tresponse: 'ajax-response',\n\n\t\twhat: '',\n\t\talt: 'alternate', altOffset: 0,\n\t\taddColor: null, delColor: null, dimAddColor: null, dimDelColor: null,\n\n\t\tconfirm: null,\n\t\taddBefore: null, addAfter: null,\n\t\tdelBefore: null, delAfter: null,\n\t\tdimBefore: null, dimAfter: null\n\t},\n\n\tnonce: function(e,s) {\n\t\tvar url = wpAjax.unserialize(e.attr('href'));\n\t\treturn s.nonce || url._ajax_nonce || $('#' + s.element + ' input[name=\"_ajax_nonce\"]').val() || url._wpnonce || $('#' + s.element + ' input[name=\"_wpnonce\"]').val() || 0;\n\t},\n\n\tparseData: function(e,t) {\n\t\tvar d = [], wpListsData;\n\n\t\ttry {\n\t\t\twpListsData = $(e).attr('data-wp-lists') || '';\n\t\t\twpListsData = wpListsData.match(new RegExp(t+':[\\\\S]+'));\n\n\t\t\tif ( wpListsData )\n\t\t\t\td = wpListsData[0].split(':');\n\t\t} catch(r) {}\n\n\t\treturn d;\n\t},\n\n\tpre: function(e,s,a) {\n\t\tvar bg, r;\n\n\t\ts = $.extend( {}, this.wpList.settings, {\n\t\t\telement: null,\n\t\t\tnonce: 0,\n\t\t\ttarget: e.get(0)\n\t\t}, s || {} );\n\n\t\tif ( $.isFunction( s.confirm ) ) {\n\t\t\tif ( 'add' != a ) {\n\t\t\t\tbg = $('#' + s.element).css('backgroundColor');\n\t\t\t\t$('#' + s.element).css('backgroundColor', '#FF9966');\n\t\t\t}\n\t\t\tr = s.confirm.call(this, e, s, a, bg);\n\n\t\t\tif ( 'add' != a )\n\t\t\t\t$('#' + s.element).css('backgroundColor', bg );\n\n\t\t\tif ( !r )\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn s;\n\t},\n\n\tajaxAdd: function( e, s ) {\n\t\te = $(e);\n\t\ts = s || {};\n\t\tvar list = this, data = wpList.parseData(e,'add'), es, valid, formData, res, rres;\n\n\t\ts = wpList.pre.call( list, e, s, 'add' );\n\n\t\ts.element = data[2] || e.attr( 'id' ) || s.element || null;\n\n\t\tif ( data[3] )\n\t\t\ts.addColor = '#' + data[3];\n\t\telse\n\t\t\ts.addColor = s.addColor || '#FFFF33';\n\n\t\tif ( !s )\n\t\t\treturn false;\n\n\t\tif ( !e.is('[id=\"' + s.element + '-submit\"]') )\n\t\t\treturn !wpList.add.call( list, e, s );\n\n\t\tif ( !s.element )\n\t\t\treturn true;\n\n\t\ts.action = 'add-' + s.what;\n\n\t\ts.nonce = wpList.nonce(e,s);\n\n\t\tes = $('#' + s.element + ' :input').not('[name=\"_ajax_nonce\"], [name=\"_wpnonce\"], [name=\"action\"]');\n\t\tvalid = wpAjax.validateForm( '#' + s.element );\n\n\t\tif ( !valid )\n\t\t\treturn false;\n\n\t\ts.data = $.param( $.extend( { _ajax_nonce: s.nonce, action: s.action }, wpAjax.unserialize( data[4] || '' ) ) );\n\t\tformData = $.isFunction(es.fieldSerialize) ? es.fieldSerialize() : es.serialize();\n\n\t\tif ( formData )\n\t\t\ts.data += '&' + formData;\n\n\t\tif ( $.isFunction(s.addBefore) ) {\n\t\t\ts = s.addBefore( s );\n\t\t\tif ( !s )\n\t\t\t\treturn true;\n\t\t}\n\n\t\tif ( !s.data.match(/_ajax_nonce=[a-f0-9]+/) )\n\t\t\treturn true;\n\n\t\ts.success = function(r) {\n\t\t\tres = wpAjax.parseAjaxResponse(r, s.response, s.element);\n\n\t\t\trres = r;\n\n\t\t\tif ( !res || res.errors )\n\t\t\t\treturn false;\n\n\t\t\tif ( true === res )\n\t\t\t\treturn true;\n\n\t\t\tjQuery.each( res.responses, function() {\n\t\t\t\twpList.add.call( list, this.data, $.extend( {}, s, { // this.firstChild.nodevalue\n\t\t\t\t\tpos: this.position || 0,\n\t\t\t\t\tid: this.id || 0,\n\t\t\t\t\toldId: this.oldId || null\n\t\t\t\t} ) );\n\t\t\t} );\n\n\t\t\tlist.wpList.recolor();\n\t\t\t$(list).trigger( 'wpListAddEnd', [ s, list.wpList ] );\n\t\t\twpList.clear.call(list,'#' + s.element);\n\t\t};\n\n\t\ts.complete = function(x, st) {\n\t\t\tif ( $.isFunction(s.addAfter) ) {\n\t\t\t\tvar _s = $.extend( { xml: x, status: st, parsed: res }, s );\n\t\t\t\ts.addAfter( rres, _s );\n\t\t\t}\n\t\t};\n\n\t\t$.ajax( s );\n\t\treturn false;\n\t},\n\n\tajaxDel: function( e, s ) {\n\t\te = $(e);\n\t\ts = s || {};\n\t\tvar list = this, data = wpList.parseData(e,'delete'), element, res, rres;\n\n\t\ts = wpList.pre.call( list, e, s, 'delete' );\n\n\t\ts.element = data[2] || s.element || null;\n\n\t\tif ( data[3] )\n\t\t\ts.delColor = '#' + data[3];\n\t\telse\n\t\t\ts.delColor = s.delColor || '#faa';\n\n\t\tif ( !s || !s.element )\n\t\t\treturn false;\n\n\t\ts.action = 'delete-' + s.what;\n\n\t\ts.nonce = wpList.nonce(e,s);\n\n\t\ts.data = $.extend(\n\t\t\t{ action: s.action, id: s.element.split('-').pop(), _ajax_nonce: s.nonce },\n\t\t\twpAjax.unserialize( data[4] || '' )\n\t\t);\n\n\t\tif ( $.isFunction(s.delBefore) ) {\n\t\t\ts = s.delBefore( s, list );\n\t\t\tif ( !s )\n\t\t\t\treturn true;\n\t\t}\n\n\t\tif ( !s.data._ajax_nonce )\n\t\t\treturn true;\n\n\t\telement = $('#' + s.element);\n\n\t\tif ( 'none' != s.delColor ) {\n\t\t\telement.css( 'backgroundColor', s.delColor ).fadeOut( 350, function(){\n\t\t\t\tlist.wpList.recolor();\n\t\t\t\t$(list).trigger( 'wpListDelEnd', [ s, list.wpList ] );\n\t\t\t});\n\t\t} else {\n\t\t\tlist.wpList.recolor();\n\t\t\t$(list).trigger( 'wpListDelEnd', [ s, list.wpList ] );\n\t\t}\n\n\t\ts.success = function(r) {\n\t\t\tres = wpAjax.parseAjaxResponse(r, s.response, s.element);\n\t\t\trres = r;\n\n\t\t\tif ( !res || res.errors ) {\n\t\t\t\telement.stop().stop().css( 'backgroundColor', '#faa' ).show().queue( function() { list.wpList.recolor(); $(this).dequeue(); } );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\ts.complete = function(x, st) {\n\t\t\tif ( $.isFunction(s.delAfter) ) {\n\t\t\t\telement.queue( function() {\n\t\t\t\t\tvar _s = $.extend( { xml: x, status: st, parsed: res }, s );\n\t\t\t\t\ts.delAfter( rres, _s );\n\t\t\t\t}).dequeue();\n\t\t\t}\n\t\t};\n\n\t\t$.ajax( s );\n\t\treturn false;\n\t},\n\n\tajaxDim: function( e, s ) {\n\t\tif ( $(e).parent().css('display') == 'none' ) // Prevent hidden links from being clicked by hotkeys\n\t\t\treturn false;\n\n\t\te = $(e);\n\t\ts = s || {};\n\n\t\tvar list = this, data = wpList.parseData(e,'dim'), element, isClass, color, dimColor, res, rres;\n\n\t\ts = wpList.pre.call( list, e, s, 'dim' );\n\n\t\ts.element = data[2] || s.element || null;\n\t\ts.dimClass =  data[3] || s.dimClass || null;\n\n\t\tif ( data[4] )\n\t\t\ts.dimAddColor = '#' + data[4];\n\t\telse\n\t\t\ts.dimAddColor = s.dimAddColor || '#FFFF33';\n\n\t\tif ( data[5] )\n\t\t\ts.dimDelColor = '#' + data[5];\n\t\telse\n\t\t\ts.dimDelColor = s.dimDelColor || '#FF3333';\n\n\t\tif ( !s || !s.element || !s.dimClass )\n\t\t\treturn true;\n\n\t\ts.action = 'dim-' + s.what;\n\n\t\ts.nonce = wpList.nonce(e,s);\n\n\t\ts.data = $.extend(\n\t\t\t{ action: s.action, id: s.element.split('-').pop(), dimClass: s.dimClass, _ajax_nonce : s.nonce },\n\t\t\twpAjax.unserialize( data[6] || '' )\n\t\t);\n\n\t\tif ( $.isFunction(s.dimBefore) ) {\n\t\t\ts = s.dimBefore( s );\n\t\t\tif ( !s )\n\t\t\t\treturn true;\n\t\t}\n\n\t\telement = $('#' + s.element);\n\t\tisClass = element.toggleClass(s.dimClass).is('.' + s.dimClass);\n\t\tcolor = wpList.getColor( element );\n\t\telement.toggleClass( s.dimClass );\n\t\tdimColor = isClass ? s.dimAddColor : s.dimDelColor;\n\n\t\tif ( 'none' != dimColor ) {\n\t\t\telement\n\t\t\t\t.animate( { backgroundColor: dimColor }, 'fast' )\n\t\t\t\t.queue( function() { element.toggleClass(s.dimClass); $(this).dequeue(); } )\n\t\t\t\t.animate( { backgroundColor: color }, { complete: function() {\n\t\t\t\t\t\t$(this).css( 'backgroundColor', '' );\n\t\t\t\t\t\t$(list).trigger( 'wpListDimEnd', [ s, list.wpList ] );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} else {\n\t\t\t$(list).trigger( 'wpListDimEnd', [ s, list.wpList ] );\n\t\t}\n\n\t\tif ( !s.data._ajax_nonce )\n\t\t\treturn true;\n\n\t\ts.success = function(r) {\n\t\t\tres = wpAjax.parseAjaxResponse(r, s.response, s.element);\n\t\t\trres = r;\n\n\t\t\tif ( !res || res.errors ) {\n\t\t\t\telement.stop().stop().css( 'backgroundColor', '#FF3333' )[isClass?'removeClass':'addClass'](s.dimClass).show().queue( function() { list.wpList.recolor(); $(this).dequeue(); } );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\n\t\ts.complete = function(x, st) {\n\t\t\tif ( $.isFunction(s.dimAfter) ) {\n\t\t\t\telement.queue( function() {\n\t\t\t\t\tvar _s = $.extend( { xml: x, status: st, parsed: res }, s );\n\t\t\t\t\ts.dimAfter( rres, _s );\n\t\t\t\t}).dequeue();\n\t\t\t}\n\t\t};\n\n\t\t$.ajax( s );\n\t\treturn false;\n\t},\n\n\tgetColor: function( el ) {\n\t\tvar color = jQuery(el).css('backgroundColor');\n\n\t\treturn color || '#ffffff';\n\t},\n\n\tadd: function( e, s ) {\n\t\tif ( 'string' == typeof e ) {\n\t\t\te = $( $.trim( e ) ); // Trim leading whitespaces\n\t\t} else {\n\t\t\te = $( e );\n\t\t}\n\n\t\tvar list = $(this), old = false, _s = { pos: 0, id: 0, oldId: null }, ba, ref, color;\n\n\t\tif ( 'string' == typeof s )\n\t\t\ts = { what: s };\n\n\t\ts = $.extend(_s, this.wpList.settings, s);\n\n\t\tif ( !e.size() || !s.what )\n\t\t\treturn false;\n\n\t\tif ( s.oldId )\n\t\t\told = $('#' + s.what + '-' + s.oldId);\n\n\t\tif ( s.id && ( s.id != s.oldId || !old || !old.size() ) )\n\t\t\t$('#' + s.what + '-' + s.id).remove();\n\n\t\tif ( old && old.size() ) {\n\t\t\told.before(e);\n\t\t\told.remove();\n\t\t} else if ( isNaN(s.pos) ) {\n\t\t\tba = 'after';\n\n\t\t\tif ( '-' == s.pos.substr(0,1) ) {\n\t\t\t\ts.pos = s.pos.substr(1);\n\t\t\t\tba = 'before';\n\t\t\t}\n\n\t\t\tref = list.find( '#' + s.pos );\n\n\t\t\tif ( 1 === ref.size() )\n\t\t\t\tref[ba](e);\n\t\t\telse\n\t\t\t\tlist.append(e);\n\n\t\t} else if ( 'comment' != s.what || 0 === $('#' + s.element).length ) {\n\t\t\tif ( s.pos < 0 ) {\n\t\t\t\tlist.prepend(e);\n\t\t\t} else {\n\t\t\t\tlist.append(e);\n\t\t\t}\n\t\t}\n\n\t\tif ( s.alt ) {\n\t\t\tif ( ( list.children(':visible').index( e[0] ) + s.altOffset ) % 2 ) { e.removeClass( s.alt ); }\n\t\t\telse { e.addClass( s.alt ); }\n\t\t}\n\n\t\tif ( 'none' != s.addColor ) {\n\t\t\tcolor = wpList.getColor( e );\n\t\t\te.css( 'backgroundColor', s.addColor ).animate( { backgroundColor: color }, { complete: function() { $(this).css( 'backgroundColor', '' ); } } );\n\t\t}\n\t\tlist.each( function() { this.wpList.process( e ); } );\n\t\treturn e;\n\t},\n\n\tclear: function(e) {\n\t\tvar list = this, t, tag;\n\n\t\te = $(e);\n\n\t\tif ( list.wpList && e.parents( '#' + list.id ).size() )\n\t\t\treturn;\n\n\t\te.find(':input').each( function() {\n\t\t\tif ( $(this).parents('.form-no-clear').size() )\n\t\t\t\treturn;\n\n\t\t\tt = this.type.toLowerCase();\n\t\t\ttag = this.tagName.toLowerCase();\n\n\t\t\tif ( 'text' == t || 'password' == t || 'textarea' == tag )\n\t\t\t\tthis.value = '';\n\t\t\telse if ( 'checkbox' == t || 'radio' == t )\n\t\t\t\tthis.checked = false;\n\t\t\telse if ( 'select' == tag )\n\t\t\t\tthis.selectedIndex = null;\n\t\t});\n\t},\n\n\tprocess: function(el) {\n\t\tvar list = this,\n\t\t\t$el = $(el || document);\n\n\t\t$el.delegate( 'form[data-wp-lists^=\"add:' + list.id + ':\"]', 'submit', function(){\n\t\t\treturn list.wpList.add(this);\n\t\t});\n\n\t\t$el.delegate( 'a[data-wp-lists^=\"add:' + list.id + ':\"], input[data-wp-lists^=\"add:' + list.id + ':\"]', 'click', function(){\n\t\t\treturn list.wpList.add(this);\n\t\t});\n\n\t\t$el.delegate( '[data-wp-lists^=\"delete:' + list.id + ':\"]', 'click', function(){\n\t\t\treturn list.wpList.del(this);\n\t\t});\n\n\t\t$el.delegate( '[data-wp-lists^=\"dim:' + list.id + ':\"]', 'click', function(){\n\t\t\treturn list.wpList.dim(this);\n\t\t});\n\t},\n\n\trecolor: function() {\n\t\tvar list = this, items, eo;\n\n\t\tif ( !list.wpList.settings.alt )\n\t\t\treturn;\n\n\t\titems = $('.list-item:visible', list);\n\n\t\tif ( !items.size() )\n\t\t\titems = $(list).children(':visible');\n\n\t\teo = [':even',':odd'];\n\n\t\tif ( list.wpList.settings.altOffset % 2 )\n\t\t\teo.reverse();\n\n\t\titems.filter(eo[0]).addClass(list.wpList.settings.alt).end().filter(eo[1]).removeClass(list.wpList.settings.alt);\n\t},\n\n\tinit: function() {\n\t\tvar lists = this;\n\n\t\tlists.wpList.process = function(a) {\n\t\t\tlists.each( function() {\n\t\t\t\tthis.wpList.process(a);\n\t\t\t} );\n\t\t};\n\n\t\tlists.wpList.recolor = function() {\n\t\t\tlists.each( function() {\n\t\t\t\tthis.wpList.recolor();\n\t\t\t} );\n\t\t};\n\t}\n};\n\n$.fn.wpList = function( settings ) {\n\tthis.each( function() {\n\t\tvar _this = this;\n\n\t\tthis.wpList = { settings: $.extend( {}, wpList.settings, { what: wpList.parseData(this,'list')[1] || '' }, settings ) };\n\t\t$.each( fs, function(i,f) { _this.wpList[i] = function( e, s ) { return wpList[f].call( _this, e, s ); }; } );\n\t} );\n\n\twpList.init.call(this);\n\n\tthis.wpList.process();\n\n\treturn this;\n};\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-pointer.js",
    "content": "/* global wpPointerL10n */\n/**\n * Pointer jQuery widget.\n */\n(function($){\n\tvar identifier = 0,\n\t\tzindex = 9999;\n\n\t$.widget('wp.pointer', {\n\t\toptions: {\n\t\t\tpointerClass: 'wp-pointer',\n\t\t\tpointerWidth: 320,\n\t\t\tcontent: function() {\n\t\t\t\treturn $(this).text();\n\t\t\t},\n\t\t\tbuttons: function( event, t ) {\n\t\t\t\tvar close  = ( wpPointerL10n ) ? wpPointerL10n.dismiss : 'Dismiss',\n\t\t\t\t\tbutton = $('<a class=\"close\" href=\"#\">' + close + '</a>');\n\n\t\t\t\treturn button.bind( 'click.pointer', function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tt.element.pointer('close');\n\t\t\t\t});\n\t\t\t},\n\t\t\tposition: 'top',\n\t\t\tshow: function( event, t ) {\n\t\t\t\tt.pointer.show();\n\t\t\t\tt.opened();\n\t\t\t},\n\t\t\thide: function( event, t ) {\n\t\t\t\tt.pointer.hide();\n\t\t\t\tt.closed();\n\t\t\t},\n\t\t\tdocument: document\n\t\t},\n\n\t\t_create: function() {\n\t\t\tvar positioning,\n\t\t\t\tfamily;\n\n\t\t\tthis.content = $('<div class=\"wp-pointer-content\"></div>');\n\t\t\tthis.arrow   = $('<div class=\"wp-pointer-arrow\"><div class=\"wp-pointer-arrow-inner\"></div></div>');\n\n\t\t\tfamily = this.element.parents().add( this.element );\n\t\t\tpositioning = 'absolute';\n\n\t\t\tif ( family.filter(function(){ return 'fixed' === $(this).css('position'); }).length )\n\t\t\t\tpositioning = 'fixed';\n\n\t\t\tthis.pointer = $('<div />')\n\t\t\t\t.append( this.content )\n\t\t\t\t.append( this.arrow )\n\t\t\t\t.attr('id', 'wp-pointer-' + identifier++)\n\t\t\t\t.addClass( this.options.pointerClass )\n\t\t\t\t.css({'position': positioning, 'width': this.options.pointerWidth+'px', 'display': 'none'})\n\t\t\t\t.appendTo( this.options.document.body );\n\t\t},\n\n\t\t_setOption: function( key, value ) {\n\t\t\tvar o   = this.options,\n\t\t\t\ttip = this.pointer;\n\n\t\t\t// Handle document transfer\n\t\t\tif ( key === 'document' && value !== o.document ) {\n\t\t\t\ttip.detach().appendTo( value.body );\n\n\t\t\t// Handle class change\n\t\t\t} else if ( key === 'pointerClass' ) {\n\t\t\t\ttip.removeClass( o.pointerClass ).addClass( value );\n\t\t\t}\n\n\t\t\t// Call super method.\n\t\t\t$.Widget.prototype._setOption.apply( this, arguments );\n\n\t\t\t// Reposition automatically\n\t\t\tif ( key === 'position' ) {\n\t\t\t\tthis.reposition();\n\n\t\t\t// Update content automatically if pointer is open\n\t\t\t} else if ( key === 'content' && this.active ) {\n\t\t\t\tthis.update();\n\t\t\t}\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tthis.pointer.remove();\n\t\t\t$.Widget.prototype.destroy.call( this );\n\t\t},\n\n\t\twidget: function() {\n\t\t\treturn this.pointer;\n\t\t},\n\n\t\tupdate: function( event ) {\n\t\t\tvar self = this,\n\t\t\t\to    = this.options,\n\t\t\t\tdfd  = $.Deferred(),\n\t\t\t\tcontent;\n\n\t\t\tif ( o.disabled )\n\t\t\t\treturn;\n\n\t\t\tdfd.done( function( content ) {\n\t\t\t\tself._update( event, content );\n\t\t\t});\n\n\t\t\t// Either o.content is a string...\n\t\t\tif ( typeof o.content === 'string' ) {\n\t\t\t\tcontent = o.content;\n\n\t\t\t// ...or o.content is a callback.\n\t\t\t} else {\n\t\t\t\tcontent = o.content.call( this.element[0], dfd.resolve, event, this._handoff() );\n\t\t\t}\n\n\t\t\t// If content is set, then complete the update.\n\t\t\tif ( content )\n\t\t\t\tdfd.resolve( content );\n\n\t\t\treturn dfd.promise();\n\t\t},\n\n\t\t/**\n\t\t * Update is separated into two functions to allow events to defer\n\t\t * updating the pointer (e.g. fetch content with ajax, etc).\n\t\t */\n\t\t_update: function( event, content ) {\n\t\t\tvar buttons,\n\t\t\t\to = this.options;\n\n\t\t\tif ( ! content )\n\t\t\t\treturn;\n\n\t\t\tthis.pointer.stop(); // Kill any animations on the pointer.\n\t\t\tthis.content.html( content );\n\n\t\t\tbuttons = o.buttons.call( this.element[0], event, this._handoff() );\n\t\t\tif ( buttons ) {\n\t\t\t\tbuttons.wrap('<div class=\"wp-pointer-buttons\" />').parent().appendTo( this.content );\n\t\t\t}\n\n\t\t\tthis.reposition();\n\t\t},\n\n\t\treposition: function() {\n\t\t\tvar position;\n\n\t\t\tif ( this.options.disabled )\n\t\t\t\treturn;\n\n\t\t\tposition = this._processPosition( this.options.position );\n\n\t\t\t// Reposition pointer.\n\t\t\tthis.pointer.css({\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tzIndex: zindex++ // Increment the z-index so that it shows above other opened pointers.\n\t\t\t}).show().position($.extend({\n\t\t\t\tof: this.element,\n\t\t\t\tcollision: 'fit none'\n\t\t\t}, position )); // the object comes before this.options.position so the user can override position.of.\n\n\t\t\tthis.repoint();\n\t\t},\n\n\t\trepoint: function() {\n\t\t\tvar o = this.options,\n\t\t\t\tedge;\n\n\t\t\tif ( o.disabled )\n\t\t\t\treturn;\n\n\t\t\tedge = ( typeof o.position == 'string' ) ? o.position : o.position.edge;\n\n\t\t\t// Remove arrow classes.\n\t\t\tthis.pointer[0].className = this.pointer[0].className.replace( /wp-pointer-[^\\s'\"]*/, '' );\n\n\t\t\t// Add arrow class.\n\t\t\tthis.pointer.addClass( 'wp-pointer-' + edge );\n\t\t},\n\n\t\t_processPosition: function( position ) {\n\t\t\tvar opposite = {\n\t\t\t\t\ttop: 'bottom',\n\t\t\t\t\tbottom: 'top',\n\t\t\t\t\tleft: 'right',\n\t\t\t\t\tright: 'left'\n\t\t\t\t},\n\t\t\t\tresult;\n\n\t\t\t// If the position object is a string, it is shorthand for position.edge.\n\t\t\tif ( typeof position == 'string' ) {\n\t\t\t\tresult = {\n\t\t\t\t\tedge: position + ''\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tresult = $.extend( {}, position );\n\t\t\t}\n\n\t\t\tif ( ! result.edge )\n\t\t\t\treturn result;\n\n\t\t\tif ( result.edge == 'top' || result.edge == 'bottom' ) {\n\t\t\t\tresult.align = result.align || 'left';\n\n\t\t\t\tresult.at = result.at || result.align + ' ' + opposite[ result.edge ];\n\t\t\t\tresult.my = result.my || result.align + ' ' + result.edge;\n\t\t\t} else {\n\t\t\t\tresult.align = result.align || 'top';\n\n\t\t\t\tresult.at = result.at || opposite[ result.edge ] + ' ' + result.align;\n\t\t\t\tresult.my = result.my || result.edge + ' ' + result.align;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\topen: function( event ) {\n\t\t\tvar self = this,\n\t\t\t\to    = this.options;\n\n\t\t\tif ( this.active || o.disabled || this.element.is(':hidden') )\n\t\t\t\treturn;\n\n\t\t\tthis.update().done( function() {\n\t\t\t\tself._open( event );\n\t\t\t});\n\t\t},\n\n\t\t_open: function( event ) {\n\t\t\tvar self = this,\n\t\t\t\to    = this.options;\n\n\t\t\tif ( this.active || o.disabled || this.element.is(':hidden') )\n\t\t\t\treturn;\n\n\t\t\tthis.active = true;\n\n\t\t\tthis._trigger( 'open', event, this._handoff() );\n\n\t\t\tthis._trigger( 'show', event, this._handoff({\n\t\t\t\topened: function() {\n\t\t\t\t\tself._trigger( 'opened', event, self._handoff() );\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\n\t\tclose: function( event ) {\n\t\t\tif ( !this.active || this.options.disabled )\n\t\t\t\treturn;\n\n\t\t\tvar self = this;\n\t\t\tthis.active = false;\n\n\t\t\tthis._trigger( 'close', event, this._handoff() );\n\t\t\tthis._trigger( 'hide', event, this._handoff({\n\t\t\t\tclosed: function() {\n\t\t\t\t\tself._trigger( 'closed', event, self._handoff() );\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\n\t\tsendToTop: function() {\n\t\t\tif ( this.active )\n\t\t\t\tthis.pointer.css( 'z-index', zindex++ );\n\t\t},\n\n\t\ttoggle: function( event ) {\n\t\t\tif ( this.pointer.is(':hidden') )\n\t\t\t\tthis.open( event );\n\t\t\telse\n\t\t\t\tthis.close( event );\n\t\t},\n\n\t\t_handoff: function( extend ) {\n\t\t\treturn $.extend({\n\t\t\t\tpointer: this.pointer,\n\t\t\t\telement: this.element\n\t\t\t}, extend);\n\t\t}\n\t});\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wp-util.js",
    "content": "/* global _wpUtilSettings */\nwindow.wp = window.wp || {};\n\n(function ($) {\n\t// Check for the utility settings.\n\tvar settings = typeof _wpUtilSettings === 'undefined' ? {} : _wpUtilSettings;\n\n\t/**\n\t * wp.template( id )\n\t *\n\t * Fetch a JavaScript template for an id, and return a templating function for it.\n\t *\n\t * @param  {string} id   A string that corresponds to a DOM element with an id prefixed with \"tmpl-\".\n\t *                       For example, \"attachment\" maps to \"tmpl-attachment\".\n\t * @return {function}    A function that lazily-compiles the template requested.\n\t */\n\twp.template = _.memoize(function ( id ) {\n\t\tvar compiled,\n\t\t\t/*\n\t\t\t * Underscore's default ERB-style templates are incompatible with PHP\n\t\t\t * when asp_tags is enabled, so WordPress uses Mustache-inspired templating syntax.\n\t\t\t *\n\t\t\t * @see trac ticket #22344.\n\t\t\t */\n\t\t\toptions = {\n\t\t\t\tevaluate:    /<#([\\s\\S]+?)#>/g,\n\t\t\t\tinterpolate: /\\{\\{\\{([\\s\\S]+?)\\}\\}\\}/g,\n\t\t\t\tescape:      /\\{\\{([^\\}]+?)\\}\\}(?!\\})/g,\n\t\t\t\tvariable:    'data'\n\t\t\t};\n\n\t\treturn function ( data ) {\n\t\t\tcompiled = compiled || _.template( $( '#tmpl-' + id ).html(), null, options );\n\t\t\treturn compiled( data );\n\t\t};\n\t});\n\n\t// wp.ajax\n\t// ------\n\t//\n\t// Tools for sending ajax requests with JSON responses and built in error handling.\n\t// Mirrors and wraps jQuery's ajax APIs.\n\twp.ajax = {\n\t\tsettings: settings.ajax || {},\n\n\t\t/**\n\t\t * wp.ajax.post( [action], [data] )\n\t\t *\n\t\t * Sends a POST request to WordPress.\n\t\t *\n\t\t * @param  {string} action The slug of the action to fire in WordPress.\n\t\t * @param  {object} data   The data to populate $_POST with.\n\t\t * @return {$.promise}     A jQuery promise that represents the request,\n\t\t *                         decorated with an abort() method.\n\t\t */\n\t\tpost: function( action, data ) {\n\t\t\treturn wp.ajax.send({\n\t\t\t\tdata: _.isObject( action ) ? action : _.extend( data || {}, { action: action })\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * wp.ajax.send( [action], [options] )\n\t\t *\n\t\t * Sends a POST request to WordPress.\n\t\t *\n\t\t * @param  {string} action  The slug of the action to fire in WordPress.\n\t\t * @param  {object} options The options passed to jQuery.ajax.\n\t\t * @return {$.promise}      A jQuery promise that represents the request,\n\t\t *                          decorated with an abort() method.\n\t\t */\n\t\tsend: function( action, options ) {\n\t\t\tvar promise, deferred;\n\t\t\tif ( _.isObject( action ) ) {\n\t\t\t\toptions = action;\n\t\t\t} else {\n\t\t\t\toptions = options || {};\n\t\t\t\toptions.data = _.extend( options.data || {}, { action: action });\n\t\t\t}\n\n\t\t\toptions = _.defaults( options || {}, {\n\t\t\t\ttype:    'POST',\n\t\t\t\turl:     wp.ajax.settings.url,\n\t\t\t\tcontext: this\n\t\t\t});\n\n\t\t\tdeferred = $.Deferred( function( deferred ) {\n\t\t\t\t// Transfer success/error callbacks.\n\t\t\t\tif ( options.success )\n\t\t\t\t\tdeferred.done( options.success );\n\t\t\t\tif ( options.error )\n\t\t\t\t\tdeferred.fail( options.error );\n\n\t\t\t\tdelete options.success;\n\t\t\t\tdelete options.error;\n\n\t\t\t\t// Use with PHP's wp_send_json_success() and wp_send_json_error()\n\t\t\t\tdeferred.jqXHR = $.ajax( options ).done( function( response ) {\n\t\t\t\t\t// Treat a response of `1` as successful for backwards\n\t\t\t\t\t// compatibility with existing handlers.\n\t\t\t\t\tif ( response === '1' || response === 1 )\n\t\t\t\t\t\tresponse = { success: true };\n\n\t\t\t\t\tif ( _.isObject( response ) && ! _.isUndefined( response.success ) )\n\t\t\t\t\t\tdeferred[ response.success ? 'resolveWith' : 'rejectWith' ]( this, [response.data] );\n\t\t\t\t\telse\n\t\t\t\t\t\tdeferred.rejectWith( this, [response] );\n\t\t\t\t}).fail( function() {\n\t\t\t\t\tdeferred.rejectWith( this, arguments );\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tpromise = deferred.promise();\n\t\t\tpromise.abort = function() {\n\t\t\t\tdeferred.jqXHR.abort();\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\treturn promise;\n\t\t}\n\t};\n\n}(jQuery));\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wpdialog.js",
    "content": "( function($) {\n\t$.widget('wp.wpdialog', $.ui.dialog, {\n\t\topen: function() {\n\t\t\t// Add beforeOpen event.\n\t\t\tif ( this.isOpen() || false === this._trigger('beforeOpen') ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Open the dialog.\n\t\t\tthis._super();\n\t\t\t// WebKit leaves focus in the TinyMCE editor unless we shift focus.\n\t\t\tthis.element.focus();\n\t\t\tthis._trigger('refresh');\n\t\t}\n\t});\n\n\t$.wp.wpdialog.prototype.options.closeOnEscape = false;\n\n})(jQuery);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/wplink.js",
    "content": "/* global ajaxurl, tinymce, wpLinkL10n, setUserSetting, wpActiveEditor */\nvar wpLink;\n\n( function( $ ) {\n\tvar editor, searchTimer, River, Query, correctedURL,\n\t\tinputs = {},\n\t\trivers = {},\n\t\tisTouch = ( 'ontouchend' in document );\n\n\tfunction getLink() {\n\t\treturn editor.dom.getParent( editor.selection.getNode(), 'a' );\n\t}\n\n\twpLink = {\n\t\ttimeToTriggerRiver: 150,\n\t\tminRiverAJAXDuration: 200,\n\t\triverBottomThreshold: 5,\n\t\tkeySensitivity: 100,\n\t\tlastSearch: '',\n\t\ttextarea: '',\n\n\t\tinit: function() {\n\t\t\tinputs.wrap = $('#wp-link-wrap');\n\t\t\tinputs.dialog = $( '#wp-link' );\n\t\t\tinputs.backdrop = $( '#wp-link-backdrop' );\n\t\t\tinputs.submit = $( '#wp-link-submit' );\n\t\t\tinputs.close = $( '#wp-link-close' );\n\n\t\t\t// Input\n\t\t\tinputs.text = $( '#wp-link-text' );\n\t\t\tinputs.url = $( '#wp-link-url' );\n\t\t\tinputs.nonce = $( '#_ajax_linking_nonce' );\n\t\t\tinputs.openInNewTab = $( '#wp-link-target' );\n\t\t\tinputs.search = $( '#wp-link-search' );\n\n\t\t\t// Build Rivers\n\t\t\trivers.search = new River( $( '#search-results' ) );\n\t\t\trivers.recent = new River( $( '#most-recent-results' ) );\n\t\t\trivers.elements = inputs.dialog.find( '.query-results' );\n\n\t\t\t// Get search notice text\n\t\t\tinputs.queryNotice = $( '#query-notice-message' );\n\t\t\tinputs.queryNoticeTextDefault = inputs.queryNotice.find( '.query-notice-default' );\n\t\t\tinputs.queryNoticeTextHint = inputs.queryNotice.find( '.query-notice-hint' );\n\n\t\t\t// Bind event handlers\n\t\t\tinputs.dialog.keydown( wpLink.keydown );\n\t\t\tinputs.dialog.keyup( wpLink.keyup );\n\t\t\tinputs.submit.click( function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\twpLink.update();\n\t\t\t});\n\t\t\tinputs.close.add( inputs.backdrop ).add( '#wp-link-cancel a' ).click( function( event ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\twpLink.close();\n\t\t\t});\n\n\t\t\t$( '#wp-link-search-toggle' ).on( 'click', wpLink.toggleInternalLinking );\n\n\t\t\trivers.elements.on( 'river-select', wpLink.updateFields );\n\n\t\t\t// Display 'hint' message when search field or 'query-results' box are focused\n\t\t\tinputs.search.on( 'focus.wplink', function() {\n\t\t\t\tinputs.queryNoticeTextDefault.hide();\n\t\t\t\tinputs.queryNoticeTextHint.removeClass( 'screen-reader-text' ).show();\n\t\t\t} ).on( 'blur.wplink', function() {\n\t\t\t\tinputs.queryNoticeTextDefault.show();\n\t\t\t\tinputs.queryNoticeTextHint.addClass( 'screen-reader-text' ).hide();\n\t\t\t} );\n\n\t\t\tinputs.search.on( 'keyup input', function() {\n\t\t\t\tvar self = this;\n\n\t\t\t\twindow.clearTimeout( searchTimer );\n\t\t\t\tsearchTimer = window.setTimeout( function() {\n\t\t\t\t\twpLink.searchInternalLinks.call( self );\n\t\t\t\t}, 500 );\n\t\t\t});\n\n\t\t\tinputs.url.on( 'paste', function() {\n\t\t\t\tsetTimeout( wpLink.correctURL, 0 );\n\t\t\t} );\n\n\t\t\tinputs.url.on( 'blur', wpLink.correctURL );\n\t\t},\n\n\t\t// If URL wasn't corrected last time and doesn't start with http:, https:, ? # or /, prepend http://\n\t\tcorrectURL: function () {\n\t\t\tvar url = $.trim( inputs.url.val() );\n\n\t\t\tif ( url && correctedURL !== url && ! /^(?:[a-z]+:|#|\\?|\\.|\\/)/.test( url ) ) {\n\t\t\t\tinputs.url.val( 'http://' + url );\n\t\t\t\tcorrectedURL = url;\n\t\t\t}\n\t\t},\n\n\t\topen: function( editorId ) {\n\t\t\tvar ed,\n\t\t\t\t$body = $( document.body );\n\n\t\t\t$body.addClass( 'modal-open' );\n\n\t\t\twpLink.range = null;\n\n\t\t\tif ( editorId ) {\n\t\t\t\twindow.wpActiveEditor = editorId;\n\t\t\t}\n\n\t\t\tif ( ! window.wpActiveEditor ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.textarea = $( '#' + window.wpActiveEditor ).get( 0 );\n\n\t\t\tif ( typeof tinymce !== 'undefined' ) {\n\t\t\t\t// Make sure the link wrapper is the last element in the body,\n\t\t\t\t// or the inline editor toolbar may show above the backdrop.\n\t\t\t\t$body.append( inputs.backdrop, inputs.wrap );\n\n\t\t\t\ted = tinymce.get( wpActiveEditor );\n\n\t\t\t\tif ( ed && ! ed.isHidden() ) {\n\t\t\t\t\teditor = ed;\n\t\t\t\t} else {\n\t\t\t\t\teditor = null;\n\t\t\t\t}\n\n\t\t\t\tif ( editor && tinymce.isIE ) {\n\t\t\t\t\teditor.windowManager.bookmark = editor.selection.getBookmark();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! wpLink.isMCE() && document.selection ) {\n\t\t\t\tthis.textarea.focus();\n\t\t\t\tthis.range = document.selection.createRange();\n\t\t\t}\n\n\t\t\tinputs.wrap.show();\n\t\t\tinputs.backdrop.show();\n\n\t\t\twpLink.refresh();\n\n\t\t\t$( document ).trigger( 'wplink-open', inputs.wrap );\n\t\t},\n\n\t\tisMCE: function() {\n\t\t\treturn editor && ! editor.isHidden();\n\t\t},\n\n\t\trefresh: function() {\n\t\t\tvar text = '';\n\n\t\t\t// Refresh rivers (clear links, check visibility)\n\t\t\trivers.search.refresh();\n\t\t\trivers.recent.refresh();\n\n\t\t\tif ( wpLink.isMCE() ) {\n\t\t\t\twpLink.mceRefresh();\n\t\t\t} else {\n\t\t\t\t// For the Text editor the \"Link text\" field is always shown\n\t\t\t\tif ( ! inputs.wrap.hasClass( 'has-text-field' ) ) {\n\t\t\t\t\tinputs.wrap.addClass( 'has-text-field' );\n\t\t\t\t}\n\n\t\t\t\tif ( document.selection ) {\n\t\t\t\t\t// Old IE\n\t\t\t\t\ttext = document.selection.createRange().text || '';\n\t\t\t\t} else if ( typeof this.textarea.selectionStart !== 'undefined' &&\n\t\t\t\t\t( this.textarea.selectionStart !== this.textarea.selectionEnd ) ) {\n\t\t\t\t\t// W3C\n\t\t\t\t\ttext = this.textarea.value.substring( this.textarea.selectionStart, this.textarea.selectionEnd ) || '';\n\t\t\t\t}\n\n\t\t\t\tinputs.text.val( text );\n\t\t\t\twpLink.setDefaultValues();\n\t\t\t}\n\n\t\t\tif ( isTouch ) {\n\t\t\t\t// Close the onscreen keyboard\n\t\t\t\tinputs.url.focus().blur();\n\t\t\t} else {\n\t\t\t\t// Focus the URL field and highlight its contents.\n\t\t\t\t// If this is moved above the selection changes,\n\t\t\t\t// IE will show a flashing cursor over the dialog.\n\t\t\t\tinputs.url.focus()[0].select();\n\t\t\t}\n\n\t\t\t// Load the most recent results if this is the first time opening the panel.\n\t\t\tif ( ! rivers.recent.ul.children().length ) {\n\t\t\t\trivers.recent.ajax();\n\t\t\t}\n\n\t\t\tcorrectedURL = inputs.url.val().replace( /^http:\\/\\//, '' );\n\t\t},\n\n\t\thasSelectedText: function( linkNode ) {\n\t\t\tvar html = editor.selection.getContent();\n\n\t\t\t// Partial html and not a fully selected anchor element\n\t\t\tif ( /</.test( html ) && ( ! /^<a [^>]+>[^<]+<\\/a>$/.test( html ) || html.indexOf('href=') === -1 ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif ( linkNode ) {\n\t\t\t\tvar nodes = linkNode.childNodes, i;\n\n\t\t\t\tif ( nodes.length === 0 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tfor ( i = nodes.length - 1; i >= 0; i-- ) {\n\t\t\t\t\tif ( nodes[i].nodeType != 3 ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\tmceRefresh: function() {\n\t\t\tvar text,\n\t\t\t\tselectedNode = editor.selection.getNode(),\n\t\t\t\tlinkNode = editor.dom.getParent( selectedNode, 'a[href]' ),\n\t\t\t\tonlyText = this.hasSelectedText( linkNode );\n\n\t\t\tif ( linkNode ) {\n\t\t\t\ttext = linkNode.innerText || linkNode.textContent;\n\t\t\t\tinputs.url.val( editor.dom.getAttrib( linkNode, 'href' ) );\n\t\t\t\tinputs.openInNewTab.prop( 'checked', '_blank' === editor.dom.getAttrib( linkNode, 'target' ) );\n\t\t\t\tinputs.submit.val( wpLinkL10n.update );\n\t\t\t} else {\n\t\t\t\ttext = editor.selection.getContent({ format: 'text' });\n\t\t\t\tthis.setDefaultValues();\n\t\t\t}\n\n\t\t\tif ( onlyText ) {\n\t\t\t\tinputs.text.val( text || '' );\n\t\t\t\tinputs.wrap.addClass( 'has-text-field' );\n\t\t\t} else {\n\t\t\t\tinputs.text.val( '' );\n\t\t\t\tinputs.wrap.removeClass( 'has-text-field' );\n\t\t\t}\n\t\t},\n\n\t\tclose: function() {\n\t\t\t$( document.body ).removeClass( 'modal-open' );\n\n\t\t\tif ( ! wpLink.isMCE() ) {\n\t\t\t\twpLink.textarea.focus();\n\n\t\t\t\tif ( wpLink.range ) {\n\t\t\t\t\twpLink.range.moveToBookmark( wpLink.range.getBookmark() );\n\t\t\t\t\twpLink.range.select();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\teditor.focus();\n\t\t\t}\n\n\t\t\tinputs.backdrop.hide();\n\t\t\tinputs.wrap.hide();\n\n\t\t\tcorrectedURL = false;\n\n\t\t\t$( document ).trigger( 'wplink-close', inputs.wrap );\n\t\t},\n\n\t\tgetAttrs: function() {\n\t\t\twpLink.correctURL();\n\n\t\t\treturn {\n\t\t\t\thref: $.trim( inputs.url.val() ),\n\t\t\t\ttarget: inputs.openInNewTab.prop( 'checked' ) ? '_blank' : ''\n\t\t\t};\n\t\t},\n\n\t\tbuildHtml: function(attrs) {\n\t\t\tvar html = '<a href=\"' + attrs.href + '\"';\n\n\t\t\tif ( attrs.target ) {\n\t\t\t\thtml += ' target=\"' + attrs.target + '\"';\n\t\t\t}\n\n\t\t\treturn html + '>';\n\t\t},\n\n\t\tupdate: function() {\n\t\t\tif ( wpLink.isMCE() ) {\n\t\t\t\twpLink.mceUpdate();\n\t\t\t} else {\n\t\t\t\twpLink.htmlUpdate();\n\t\t\t}\n\t\t},\n\n\t\thtmlUpdate: function() {\n\t\t\tvar attrs, text, html, begin, end, cursor, selection,\n\t\t\t\ttextarea = wpLink.textarea;\n\n\t\t\tif ( ! textarea ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattrs = wpLink.getAttrs();\n\t\t\ttext = inputs.text.val();\n\n\t\t\t// If there's no href, return.\n\t\t\tif ( ! attrs.href ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thtml = wpLink.buildHtml(attrs);\n\n\t\t\t// Insert HTML\n\t\t\tif ( document.selection && wpLink.range ) {\n\t\t\t\t// IE\n\t\t\t\t// Note: If no text is selected, IE will not place the cursor\n\t\t\t\t//       inside the closing tag.\n\t\t\t\ttextarea.focus();\n\t\t\t\twpLink.range.text = html + ( text || wpLink.range.text ) + '</a>';\n\t\t\t\twpLink.range.moveToBookmark( wpLink.range.getBookmark() );\n\t\t\t\twpLink.range.select();\n\n\t\t\t\twpLink.range = null;\n\t\t\t} else if ( typeof textarea.selectionStart !== 'undefined' ) {\n\t\t\t\t// W3C\n\t\t\t\tbegin = textarea.selectionStart;\n\t\t\t\tend = textarea.selectionEnd;\n\t\t\t\tselection = text || textarea.value.substring( begin, end );\n\t\t\t\thtml = html + selection + '</a>';\n\t\t\t\tcursor = begin + html.length;\n\n\t\t\t\t// If no text is selected, place the cursor inside the closing tag.\n\t\t\t\tif ( begin === end && ! selection ) {\n\t\t\t\t\tcursor -= 4;\n\t\t\t\t}\n\n\t\t\t\ttextarea.value = (\n\t\t\t\t\ttextarea.value.substring( 0, begin ) +\n\t\t\t\t\thtml +\n\t\t\t\t\ttextarea.value.substring( end, textarea.value.length )\n\t\t\t\t);\n\n\t\t\t\t// Update cursor position\n\t\t\t\ttextarea.selectionStart = textarea.selectionEnd = cursor;\n\t\t\t}\n\n\t\t\twpLink.close();\n\t\t\ttextarea.focus();\n\t\t},\n\n\t\tmceUpdate: function() {\n\t\t\tvar attrs = wpLink.getAttrs(),\n\t\t\t\tlink, text;\n\n\t\t\twpLink.close();\n\t\t\teditor.focus();\n\n\t\t\tif ( tinymce.isIE ) {\n\t\t\t\teditor.selection.moveToBookmark( editor.windowManager.bookmark );\n\t\t\t}\n\n\t\t\tif ( ! attrs.href ) {\n\t\t\t\teditor.execCommand( 'unlink' );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlink = getLink();\n\n\t\t\tif ( inputs.wrap.hasClass( 'has-text-field' ) ) {\n\t\t\t\ttext = inputs.text.val() || attrs.href;\n\t\t\t}\n\n\t\t\tif ( link ) {\n\t\t\t\tif ( text ) {\n\t\t\t\t\tif ( 'innerText' in link ) {\n\t\t\t\t\t\tlink.innerText = text;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlink.textContent = text;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\teditor.dom.setAttribs( link, attrs );\n\t\t\t} else {\n\t\t\t\tif ( text ) {\n\t\t\t\t\teditor.selection.setNode( editor.dom.create( 'a', attrs, editor.dom.encode( text ) ) );\n\t\t\t\t} else {\n\t\t\t\t\teditor.execCommand( 'mceInsertLink', false, attrs );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\teditor.nodeChanged();\n\t\t},\n\n\t\tupdateFields: function( e, li ) {\n\t\t\tinputs.url.val( li.children( '.item-permalink' ).val() );\n\t\t},\n\n\t\tsetDefaultValues: function() {\n\t\t\tvar selection,\n\t\t\t\temailRegexp = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i,\n\t\t\t\turlRegexp = /^(https?|ftp):\\/\\/[A-Z0-9.-]+\\.[A-Z]{2,4}[^ \"]*$/i;\n\n\t\t\tif ( this.isMCE() ) {\n\t\t\t\tselection = editor.selection.getContent();\n\t\t\t} else if ( document.selection && wpLink.range ) {\n\t\t\t\tselection = wpLink.range.text;\n\t\t\t} else if ( typeof this.textarea.selectionStart !== 'undefined' ) {\n\t\t\t\tselection = this.textarea.value.substring( this.textarea.selectionStart, this.textarea.selectionEnd );\n\t\t\t}\n\n\t\t\tif ( selection && emailRegexp.test( selection ) ) {\n\t\t\t\t// Selection is email address\n\t\t\t\tinputs.url.val( 'mailto:' + selection );\n\t\t\t} else if ( selection && urlRegexp.test( selection ) ) {\n\t\t\t\t// Selection is URL\n\t\t\t\tinputs.url.val( selection.replace( /&amp;|&#0?38;/gi, '&' ) );\n\t\t\t} else {\n\t\t\t\t// Set URL to default.\n\t\t\t\tinputs.url.val( '' );\n\t\t\t}\n\n\t\t\t// Update save prompt.\n\t\t\tinputs.submit.val( wpLinkL10n.save );\n\t\t},\n\n\t\tsearchInternalLinks: function() {\n\t\t\tvar t = $( this ), waiting,\n\t\t\t\tsearch = t.val();\n\n\t\t\tif ( search.length > 2 ) {\n\t\t\t\trivers.recent.hide();\n\t\t\t\trivers.search.show();\n\n\t\t\t\t// Don't search if the keypress didn't change the title.\n\t\t\t\tif ( wpLink.lastSearch == search )\n\t\t\t\t\treturn;\n\n\t\t\t\twpLink.lastSearch = search;\n\t\t\t\twaiting = t.parent().find( '.spinner' ).addClass( 'is-active' );\n\n\t\t\t\trivers.search.change( search );\n\t\t\t\trivers.search.ajax( function() {\n\t\t\t\t\twaiting.removeClass( 'is-active' );\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\trivers.search.hide();\n\t\t\t\trivers.recent.show();\n\t\t\t}\n\t\t},\n\n\t\tnext: function() {\n\t\t\trivers.search.next();\n\t\t\trivers.recent.next();\n\t\t},\n\n\t\tprev: function() {\n\t\t\trivers.search.prev();\n\t\t\trivers.recent.prev();\n\t\t},\n\n\t\tkeydown: function( event ) {\n\t\t\tvar fn, id;\n\n\t\t\t// Escape key.\n\t\t\tif ( 27 === event.keyCode ) {\n\t\t\t\twpLink.close();\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t// Tab key.\n\t\t\t} else if ( 9 === event.keyCode ) {\n\t\t\t\tid = event.target.id;\n\n\t\t\t\t// wp-link-submit must always be the last focusable element in the dialog.\n\t\t\t\t// following focusable elements will be skipped on keyboard navigation.\n\t\t\t\tif ( id === 'wp-link-submit' && ! event.shiftKey ) {\n\t\t\t\t\tinputs.close.focus();\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t} else if ( id === 'wp-link-close' && event.shiftKey ) {\n\t\t\t\t\tinputs.submit.focus();\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Up Arrow and Down Arrow keys.\n\t\t\tif ( 38 !== event.keyCode && 40 !== event.keyCode ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( document.activeElement &&\n\t\t\t\t( document.activeElement.id === 'link-title-field' || document.activeElement.id === 'url-field' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Up Arrow key.\n\t\t\tfn = 38 === event.keyCode ? 'prev' : 'next';\n\t\t\tclearInterval( wpLink.keyInterval );\n\t\t\twpLink[ fn ]();\n\t\t\twpLink.keyInterval = setInterval( wpLink[ fn ], wpLink.keySensitivity );\n\t\t\tevent.preventDefault();\n\t\t},\n\n\t\tkeyup: function( event ) {\n\t\t\t// Up Arrow and Down Arrow keys.\n\t\t\tif ( 38 === event.keyCode || 40 === event.keyCode ) {\n\t\t\t\tclearInterval( wpLink.keyInterval );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t},\n\n\t\tdelayedCallback: function( func, delay ) {\n\t\t\tvar timeoutTriggered, funcTriggered, funcArgs, funcContext;\n\n\t\t\tif ( ! delay )\n\t\t\t\treturn func;\n\n\t\t\tsetTimeout( function() {\n\t\t\t\tif ( funcTriggered )\n\t\t\t\t\treturn func.apply( funcContext, funcArgs );\n\t\t\t\t// Otherwise, wait.\n\t\t\t\ttimeoutTriggered = true;\n\t\t\t}, delay );\n\n\t\t\treturn function() {\n\t\t\t\tif ( timeoutTriggered )\n\t\t\t\t\treturn func.apply( this, arguments );\n\t\t\t\t// Otherwise, wait.\n\t\t\t\tfuncArgs = arguments;\n\t\t\t\tfuncContext = this;\n\t\t\t\tfuncTriggered = true;\n\t\t\t};\n\t\t},\n\n\t\ttoggleInternalLinking: function( event ) {\n\t\t\tvar visible = inputs.wrap.hasClass( 'search-panel-visible' );\n\n\t\t\tinputs.wrap.toggleClass( 'search-panel-visible', ! visible );\n\t\t\tsetUserSetting( 'wplink', visible ? '0' : '1' );\n\t\t\tinputs[ ! visible ? 'search' : 'url' ].focus();\n\t\t\tevent.preventDefault();\n\t\t}\n\t};\n\n\tRiver = function( element, search ) {\n\t\tvar self = this;\n\t\tthis.element = element;\n\t\tthis.ul = element.children( 'ul' );\n\t\tthis.contentHeight = element.children( '#link-selector-height' );\n\t\tthis.waiting = element.find('.river-waiting');\n\n\t\tthis.change( search );\n\t\tthis.refresh();\n\n\t\t$( '#wp-link .query-results, #wp-link #link-selector' ).scroll( function() {\n\t\t\tself.maybeLoad();\n\t\t});\n\t\telement.on( 'click', 'li', function( event ) {\n\t\t\tself.select( $( this ), event );\n\t\t});\n\t};\n\n\t$.extend( River.prototype, {\n\t\trefresh: function() {\n\t\t\tthis.deselect();\n\t\t\tthis.visible = this.element.is( ':visible' );\n\t\t},\n\t\tshow: function() {\n\t\t\tif ( ! this.visible ) {\n\t\t\t\tthis.deselect();\n\t\t\t\tthis.element.show();\n\t\t\t\tthis.visible = true;\n\t\t\t}\n\t\t},\n\t\thide: function() {\n\t\t\tthis.element.hide();\n\t\t\tthis.visible = false;\n\t\t},\n\t\t// Selects a list item and triggers the river-select event.\n\t\tselect: function( li, event ) {\n\t\t\tvar liHeight, elHeight, liTop, elTop;\n\n\t\t\tif ( li.hasClass( 'unselectable' ) || li == this.selected )\n\t\t\t\treturn;\n\n\t\t\tthis.deselect();\n\t\t\tthis.selected = li.addClass( 'selected' );\n\t\t\t// Make sure the element is visible\n\t\t\tliHeight = li.outerHeight();\n\t\t\telHeight = this.element.height();\n\t\t\tliTop = li.position().top;\n\t\t\telTop = this.element.scrollTop();\n\n\t\t\tif ( liTop < 0 ) // Make first visible element\n\t\t\t\tthis.element.scrollTop( elTop + liTop );\n\t\t\telse if ( liTop + liHeight > elHeight ) // Make last visible element\n\t\t\t\tthis.element.scrollTop( elTop + liTop - elHeight + liHeight );\n\n\t\t\t// Trigger the river-select event\n\t\t\tthis.element.trigger( 'river-select', [ li, event, this ] );\n\t\t},\n\t\tdeselect: function() {\n\t\t\tif ( this.selected )\n\t\t\t\tthis.selected.removeClass( 'selected' );\n\t\t\tthis.selected = false;\n\t\t},\n\t\tprev: function() {\n\t\t\tif ( ! this.visible )\n\t\t\t\treturn;\n\n\t\t\tvar to;\n\t\t\tif ( this.selected ) {\n\t\t\t\tto = this.selected.prev( 'li' );\n\t\t\t\tif ( to.length )\n\t\t\t\t\tthis.select( to );\n\t\t\t}\n\t\t},\n\t\tnext: function() {\n\t\t\tif ( ! this.visible )\n\t\t\t\treturn;\n\n\t\t\tvar to = this.selected ? this.selected.next( 'li' ) : $( 'li:not(.unselectable):first', this.element );\n\t\t\tif ( to.length )\n\t\t\t\tthis.select( to );\n\t\t},\n\t\tajax: function( callback ) {\n\t\t\tvar self = this,\n\t\t\t\tdelay = this.query.page == 1 ? 0 : wpLink.minRiverAJAXDuration,\n\t\t\t\tresponse = wpLink.delayedCallback( function( results, params ) {\n\t\t\t\t\tself.process( results, params );\n\t\t\t\t\tif ( callback )\n\t\t\t\t\t\tcallback( results, params );\n\t\t\t\t}, delay );\n\n\t\t\tthis.query.ajax( response );\n\t\t},\n\t\tchange: function( search ) {\n\t\t\tif ( this.query && this._search == search )\n\t\t\t\treturn;\n\n\t\t\tthis._search = search;\n\t\t\tthis.query = new Query( search );\n\t\t\tthis.element.scrollTop( 0 );\n\t\t},\n\t\tprocess: function( results, params ) {\n\t\t\tvar list = '', alt = true, classes = '',\n\t\t\t\tfirstPage = params.page == 1;\n\n\t\t\tif ( ! results ) {\n\t\t\t\tif ( firstPage ) {\n\t\t\t\t\tlist += '<li class=\"unselectable no-matches-found\"><span class=\"item-title\"><em>' +\n\t\t\t\t\t\twpLinkL10n.noMatchesFound + '</em></span></li>';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$.each( results, function() {\n\t\t\t\t\tclasses = alt ? 'alternate' : '';\n\t\t\t\t\tclasses += this.title ? '' : ' no-title';\n\t\t\t\t\tlist += classes ? '<li class=\"' + classes + '\">' : '<li>';\n\t\t\t\t\tlist += '<input type=\"hidden\" class=\"item-permalink\" value=\"' + this.permalink + '\" />';\n\t\t\t\t\tlist += '<span class=\"item-title\">';\n\t\t\t\t\tlist += this.title ? this.title : wpLinkL10n.noTitle;\n\t\t\t\t\tlist += '</span><span class=\"item-info\">' + this.info + '</span></li>';\n\t\t\t\t\talt = ! alt;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.ul[ firstPage ? 'html' : 'append' ]( list );\n\t\t},\n\t\tmaybeLoad: function() {\n\t\t\tvar self = this,\n\t\t\t\tel = this.element,\n\t\t\t\tbottom = el.scrollTop() + el.height();\n\n\t\t\tif ( ! this.query.ready() || bottom < this.contentHeight.height() - wpLink.riverBottomThreshold )\n\t\t\t\treturn;\n\n\t\t\tsetTimeout(function() {\n\t\t\t\tvar newTop = el.scrollTop(),\n\t\t\t\t\tnewBottom = newTop + el.height();\n\n\t\t\t\tif ( ! self.query.ready() || newBottom < self.contentHeight.height() - wpLink.riverBottomThreshold )\n\t\t\t\t\treturn;\n\n\t\t\t\tself.waiting.addClass( 'is-active' );\n\t\t\t\tel.scrollTop( newTop + self.waiting.outerHeight() );\n\n\t\t\t\tself.ajax( function() {\n\t\t\t\t\tself.waiting.removeClass( 'is-active' );\n\t\t\t\t});\n\t\t\t}, wpLink.timeToTriggerRiver );\n\t\t}\n\t});\n\n\tQuery = function( search ) {\n\t\tthis.page = 1;\n\t\tthis.allLoaded = false;\n\t\tthis.querying = false;\n\t\tthis.search = search;\n\t};\n\n\t$.extend( Query.prototype, {\n\t\tready: function() {\n\t\t\treturn ! ( this.querying || this.allLoaded );\n\t\t},\n\t\tajax: function( callback ) {\n\t\t\tvar self = this,\n\t\t\t\tquery = {\n\t\t\t\t\taction : 'wp-link-ajax',\n\t\t\t\t\tpage : this.page,\n\t\t\t\t\t'_ajax_linking_nonce' : inputs.nonce.val()\n\t\t\t\t};\n\n\t\t\tif ( this.search )\n\t\t\t\tquery.search = this.search;\n\n\t\t\tthis.querying = true;\n\n\t\t\t$.post( ajaxurl, query, function( r ) {\n\t\t\t\tself.page++;\n\t\t\t\tself.querying = false;\n\t\t\t\tself.allLoaded = ! r;\n\t\t\t\tcallback( r, query );\n\t\t\t}, 'json' );\n\t\t}\n\t});\n\n\t$( document ).ready( wpLink.init );\n})( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/js/zxcvbn-async.js",
    "content": "/* global _zxcvbnSettings */\n(function() {\n  var async_load = function() {\n    var first, s;\n    s = document.createElement('script');\n    s.src = _zxcvbnSettings.src;\n    s.type = 'text/javascript';\n    s.async = true;\n    first = document.getElementsByTagName('script')[0];\n    return first.parentNode.insertBefore(s, first);\n  };\n\n  if (window.attachEvent != null) {\n    window.attachEvent('onload', async_load);\n  } else {\n    window.addEventListener('load', async_load, false);\n  }\n}).call(this);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/kses.php",
    "content": "<?php\n/**\n * kses 0.2.2 - HTML/XHTML filter that only allows some elements and attributes\n * Copyright (C) 2002, 2003, 2005  Ulf Harnhammar\n *\n * This program is free software and open source software; you can redistribute\n * it and/or modify it under the terms of the GNU General Public License as\n * published by the Free Software Foundation; either version 2 of the License,\n * or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along\n * with this program; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA\n * http://www.gnu.org/licenses/gpl.html\n *\n * [kses strips evil scripts!]\n *\n * Added wp_ prefix to avoid conflicts with existing kses users\n *\n * @version 0.2.2\n * @copyright (C) 2002, 2003, 2005\n * @author Ulf Harnhammar <http://advogato.org/person/metaur/>\n *\n * @package External\n * @subpackage KSES\n *\n */\n\n/**\n * You can override this in a plugin.\n *\n * The wp_kses_allowed_html filter is more powerful and supplies context.\n * CUSTOM_TAGS is not recommended and should be considered deprecated.\n *\n * @see wp_kses_allowed_html()\n *\n * @since 1.2.0\n */\nif ( ! defined( 'CUSTOM_TAGS' ) )\n\tdefine( 'CUSTOM_TAGS', false );\n\n// Ensure that these variables are added to the global namespace\n// (e.g. if using namespaces / autoload in the current PHP environment).\nglobal $allowedposttags, $allowedtags, $allowedentitynames;\n\nif ( ! CUSTOM_TAGS ) {\n\t/**\n\t * Kses global for default allowable HTML tags.\n\t *\n\t * Can be override by using CUSTOM_TAGS constant.\n\t *\n\t * @global array $allowedposttags\n\t * @since 2.0.0\n\t */\n\t$allowedposttags = array(\n\t\t'address' => array(),\n\t\t'a' => array(\n\t\t\t'href' => true,\n\t\t\t'rel' => true,\n\t\t\t'rev' => true,\n\t\t\t'name' => true,\n\t\t\t'target' => true,\n\t\t),\n\t\t'abbr' => array(),\n\t\t'acronym' => array(),\n\t\t'area' => array(\n\t\t\t'alt' => true,\n\t\t\t'coords' => true,\n\t\t\t'href' => true,\n\t\t\t'nohref' => true,\n\t\t\t'shape' => true,\n\t\t\t'target' => true,\n\t\t),\n\t\t'article' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'aside' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'audio' => array(\n\t\t\t'autoplay' => true,\n\t\t\t'controls' => true,\n\t\t\t'loop' => true,\n\t\t\t'muted' => true,\n\t\t\t'preload' => true,\n\t\t\t'src' => true,\n\t\t),\n\t\t'b' => array(),\n\t\t'bdo' => array(\n\t\t\t'dir' => true,\n\t\t),\n\t\t'big' => array(),\n\t\t'blockquote' => array(\n\t\t\t'cite' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'br' => array(),\n\t\t'button' => array(\n\t\t\t'disabled' => true,\n\t\t\t'name' => true,\n\t\t\t'type' => true,\n\t\t\t'value' => true,\n\t\t),\n\t\t'caption' => array(\n\t\t\t'align' => true,\n\t\t),\n\t\t'cite' => array(\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t),\n\t\t'code' => array(),\n\t\t'col' => array(\n\t\t\t'align' => true,\n\t\t\t'char' => true,\n\t\t\t'charoff' => true,\n\t\t\t'span' => true,\n\t\t\t'dir' => true,\n\t\t\t'valign' => true,\n\t\t\t'width' => true,\n\t\t),\n\t\t'colgroup' => array(\n\t\t\t'align' => true,\n\t\t\t'char' => true,\n\t\t\t'charoff' => true,\n\t\t\t'span' => true,\n\t\t\t'valign' => true,\n\t\t\t'width' => true,\n\t\t),\n\t\t'del' => array(\n\t\t\t'datetime' => true,\n\t\t),\n\t\t'dd' => array(),\n\t\t'dfn' => array(),\n\t\t'details' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'open' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'div' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'dl' => array(),\n\t\t'dt' => array(),\n\t\t'em' => array(),\n\t\t'fieldset' => array(),\n\t\t'figure' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'figcaption' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'font' => array(\n\t\t\t'color' => true,\n\t\t\t'face' => true,\n\t\t\t'size' => true,\n\t\t),\n\t\t'footer' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'form' => array(\n\t\t\t'action' => true,\n\t\t\t'accept' => true,\n\t\t\t'accept-charset' => true,\n\t\t\t'enctype' => true,\n\t\t\t'method' => true,\n\t\t\t'name' => true,\n\t\t\t'target' => true,\n\t\t),\n\t\t'h1' => array(\n\t\t\t'align' => true,\n\t\t),\n\t\t'h2' => array(\n\t\t\t'align' => true,\n\t\t),\n\t\t'h3' => array(\n\t\t\t'align' => true,\n\t\t),\n\t\t'h4' => array(\n\t\t\t'align' => true,\n\t\t),\n\t\t'h5' => array(\n\t\t\t'align' => true,\n\t\t),\n\t\t'h6' => array(\n\t\t\t'align' => true,\n\t\t),\n\t\t'header' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'hgroup' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'hr' => array(\n\t\t\t'align' => true,\n\t\t\t'noshade' => true,\n\t\t\t'size' => true,\n\t\t\t'width' => true,\n\t\t),\n\t\t'i' => array(),\n\t\t'img' => array(\n\t\t\t'alt' => true,\n\t\t\t'align' => true,\n\t\t\t'border' => true,\n\t\t\t'height' => true,\n\t\t\t'hspace' => true,\n\t\t\t'longdesc' => true,\n\t\t\t'vspace' => true,\n\t\t\t'src' => true,\n\t\t\t'usemap' => true,\n\t\t\t'width' => true,\n\t\t),\n\t\t'ins' => array(\n\t\t\t'datetime' => true,\n\t\t\t'cite' => true,\n\t\t),\n\t\t'kbd' => array(),\n\t\t'label' => array(\n\t\t\t'for' => true,\n\t\t),\n\t\t'legend' => array(\n\t\t\t'align' => true,\n\t\t),\n\t\t'li' => array(\n\t\t\t'align' => true,\n\t\t\t'value' => true,\n\t\t),\n\t\t'map' => array(\n\t\t\t'name' => true,\n\t\t),\n\t\t'mark' => array(),\n\t\t'menu' => array(\n\t\t\t'type' => true,\n\t\t),\n\t\t'nav' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'p' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'pre' => array(\n\t\t\t'width' => true,\n\t\t),\n\t\t'q' => array(\n\t\t\t'cite' => true,\n\t\t),\n\t\t's' => array(),\n\t\t'samp' => array(),\n\t\t'span' => array(\n\t\t\t'dir' => true,\n\t\t\t'align' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'section' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'small' => array(),\n\t\t'strike' => array(),\n\t\t'strong' => array(),\n\t\t'sub' => array(),\n\t\t'summary' => array(\n\t\t\t'align' => true,\n\t\t\t'dir' => true,\n\t\t\t'lang' => true,\n\t\t\t'xml:lang' => true,\n\t\t),\n\t\t'sup' => array(),\n\t\t'table' => array(\n\t\t\t'align' => true,\n\t\t\t'bgcolor' => true,\n\t\t\t'border' => true,\n\t\t\t'cellpadding' => true,\n\t\t\t'cellspacing' => true,\n\t\t\t'dir' => true,\n\t\t\t'rules' => true,\n\t\t\t'summary' => true,\n\t\t\t'width' => true,\n\t\t),\n\t\t'tbody' => array(\n\t\t\t'align' => true,\n\t\t\t'char' => true,\n\t\t\t'charoff' => true,\n\t\t\t'valign' => true,\n\t\t),\n\t\t'td' => array(\n\t\t\t'abbr' => true,\n\t\t\t'align' => true,\n\t\t\t'axis' => true,\n\t\t\t'bgcolor' => true,\n\t\t\t'char' => true,\n\t\t\t'charoff' => true,\n\t\t\t'colspan' => true,\n\t\t\t'dir' => true,\n\t\t\t'headers' => true,\n\t\t\t'height' => true,\n\t\t\t'nowrap' => true,\n\t\t\t'rowspan' => true,\n\t\t\t'scope' => true,\n\t\t\t'valign' => true,\n\t\t\t'width' => true,\n\t\t),\n\t\t'textarea' => array(\n\t\t\t'cols' => true,\n\t\t\t'rows' => true,\n\t\t\t'disabled' => true,\n\t\t\t'name' => true,\n\t\t\t'readonly' => true,\n\t\t),\n\t\t'tfoot' => array(\n\t\t\t'align' => true,\n\t\t\t'char' => true,\n\t\t\t'charoff' => true,\n\t\t\t'valign' => true,\n\t\t),\n\t\t'th' => array(\n\t\t\t'abbr' => true,\n\t\t\t'align' => true,\n\t\t\t'axis' => true,\n\t\t\t'bgcolor' => true,\n\t\t\t'char' => true,\n\t\t\t'charoff' => true,\n\t\t\t'colspan' => true,\n\t\t\t'headers' => true,\n\t\t\t'height' => true,\n\t\t\t'nowrap' => true,\n\t\t\t'rowspan' => true,\n\t\t\t'scope' => true,\n\t\t\t'valign' => true,\n\t\t\t'width' => true,\n\t\t),\n\t\t'thead' => array(\n\t\t\t'align' => true,\n\t\t\t'char' => true,\n\t\t\t'charoff' => true,\n\t\t\t'valign' => true,\n\t\t),\n\t\t'title' => array(),\n\t\t'tr' => array(\n\t\t\t'align' => true,\n\t\t\t'bgcolor' => true,\n\t\t\t'char' => true,\n\t\t\t'charoff' => true,\n\t\t\t'valign' => true,\n\t\t),\n\t\t'track' => array(\n\t\t\t'default' => true,\n\t\t\t'kind' => true,\n\t\t\t'label' => true,\n\t\t\t'src' => true,\n\t\t\t'srclang' => true,\n\t\t),\n\t\t'tt' => array(),\n\t\t'u' => array(),\n\t\t'ul' => array(\n\t\t\t'type' => true,\n\t\t),\n\t\t'ol' => array(\n\t\t\t'start' => true,\n\t\t\t'type' => true,\n\t\t),\n\t\t'var' => array(),\n\t\t'video' => array(\n\t\t\t'autoplay' => true,\n\t\t\t'controls' => true,\n\t\t\t'height' => true,\n\t\t\t'loop' => true,\n\t\t\t'muted' => true,\n\t\t\t'poster' => true,\n\t\t\t'preload' => true,\n\t\t\t'src' => true,\n\t\t\t'width' => true,\n\t\t),\n\t);\n\n\t/**\n\t * Kses allowed HTML elements.\n\t *\n\t * @global array $allowedtags\n\t * @since 1.0.0\n\t */\n\t$allowedtags = array(\n\t\t'a' => array(\n\t\t\t'href' => true,\n\t\t\t'title' => true,\n\t\t),\n\t\t'abbr' => array(\n\t\t\t'title' => true,\n\t\t),\n\t\t'acronym' => array(\n\t\t\t'title' => true,\n\t\t),\n\t\t'b' => array(),\n\t\t'blockquote' => array(\n\t\t\t'cite' => true,\n\t\t),\n\t\t'cite' => array(),\n\t\t'code' => array(),\n\t\t'del' => array(\n\t\t\t'datetime' => true,\n\t\t),\n\t\t'em' => array(),\n\t\t'i' => array(),\n\t\t'q' => array(\n\t\t\t'cite' => true,\n\t\t),\n\t\t's' => array(),\n\t\t'strike' => array(),\n\t\t'strong' => array(),\n\t);\n\n\t$allowedentitynames = array(\n\t\t'nbsp',    'iexcl',  'cent',    'pound',  'curren', 'yen',\n\t\t'brvbar',  'sect',   'uml',     'copy',   'ordf',   'laquo',\n\t\t'not',     'shy',    'reg',     'macr',   'deg',    'plusmn',\n\t\t'acute',   'micro',  'para',    'middot', 'cedil',  'ordm',\n\t\t'raquo',   'iquest', 'Agrave',  'Aacute', 'Acirc',  'Atilde',\n\t\t'Auml',    'Aring',  'AElig',   'Ccedil', 'Egrave', 'Eacute',\n\t\t'Ecirc',   'Euml',   'Igrave',  'Iacute', 'Icirc',  'Iuml',\n\t\t'ETH',     'Ntilde', 'Ograve',  'Oacute', 'Ocirc',  'Otilde',\n\t\t'Ouml',    'times',  'Oslash',  'Ugrave', 'Uacute', 'Ucirc',\n\t\t'Uuml',    'Yacute', 'THORN',   'szlig',  'agrave', 'aacute',\n\t\t'acirc',   'atilde', 'auml',    'aring',  'aelig',  'ccedil',\n\t\t'egrave',  'eacute', 'ecirc',   'euml',   'igrave', 'iacute',\n\t\t'icirc',   'iuml',   'eth',     'ntilde', 'ograve', 'oacute',\n\t\t'ocirc',   'otilde', 'ouml',    'divide', 'oslash', 'ugrave',\n\t\t'uacute',  'ucirc',  'uuml',    'yacute', 'thorn',  'yuml',\n\t\t'quot',    'amp',    'lt',      'gt',     'apos',   'OElig',\n\t\t'oelig',   'Scaron', 'scaron',  'Yuml',   'circ',   'tilde',\n\t\t'ensp',    'emsp',   'thinsp',  'zwnj',   'zwj',    'lrm',\n\t\t'rlm',     'ndash',  'mdash',   'lsquo',  'rsquo',  'sbquo',\n\t\t'ldquo',   'rdquo',  'bdquo',   'dagger', 'Dagger', 'permil',\n\t\t'lsaquo',  'rsaquo', 'euro',    'fnof',   'Alpha',  'Beta',\n\t\t'Gamma',   'Delta',  'Epsilon', 'Zeta',   'Eta',    'Theta',\n\t\t'Iota',    'Kappa',  'Lambda',  'Mu',     'Nu',     'Xi',\n\t\t'Omicron', 'Pi',     'Rho',     'Sigma',  'Tau',    'Upsilon',\n\t\t'Phi',     'Chi',    'Psi',     'Omega',  'alpha',  'beta',\n\t\t'gamma',   'delta',  'epsilon', 'zeta',   'eta',    'theta',\n\t\t'iota',    'kappa',  'lambda',  'mu',     'nu',     'xi',\n\t\t'omicron', 'pi',     'rho',     'sigmaf', 'sigma',  'tau',\n\t\t'upsilon', 'phi',    'chi',     'psi',    'omega',  'thetasym',\n\t\t'upsih',   'piv',    'bull',    'hellip', 'prime',  'Prime',\n\t\t'oline',   'frasl',  'weierp',  'image',  'real',   'trade',\n\t\t'alefsym', 'larr',   'uarr',    'rarr',   'darr',   'harr',\n\t\t'crarr',   'lArr',   'uArr',    'rArr',   'dArr',   'hArr',\n\t\t'forall',  'part',   'exist',   'empty',  'nabla',  'isin',\n\t\t'notin',   'ni',     'prod',    'sum',    'minus',  'lowast',\n\t\t'radic',   'prop',   'infin',   'ang',    'and',    'or',\n\t\t'cap',     'cup',    'int',     'sim',    'cong',   'asymp',\n\t\t'ne',      'equiv',  'le',      'ge',     'sub',    'sup',\n\t\t'nsub',    'sube',   'supe',    'oplus',  'otimes', 'perp',\n\t\t'sdot',    'lceil',  'rceil',   'lfloor', 'rfloor', 'lang',\n\t\t'rang',    'loz',    'spades',  'clubs',  'hearts', 'diams',\n\t\t'sup1',    'sup2',   'sup3',    'frac14', 'frac12', 'frac34',\n\t\t'there4',\n\t);\n\n\t$allowedposttags = array_map( '_wp_add_global_attributes', $allowedposttags );\n} else {\n\t$allowedtags = wp_kses_array_lc( $allowedtags );\n\t$allowedposttags = wp_kses_array_lc( $allowedposttags );\n}\n\n/**\n * Filters content and keeps only allowable HTML elements.\n *\n * This function makes sure that only the allowed HTML element names, attribute\n * names and attribute values plus only sane HTML entities will occur in\n * $string. You have to remove any slashes from PHP's magic quotes before you\n * call this function.\n *\n * The default allowed protocols are 'http', 'https', 'ftp', 'mailto', 'news',\n * 'irc', 'gopher', 'nntp', 'feed', 'telnet, 'mms', 'rtsp' and 'svn'. This\n * covers all common link protocols, except for 'javascript' which should not\n * be allowed for untrusted users.\n *\n * @since 1.0.0\n *\n * @param string $string            Content to filter through kses\n * @param array  $allowed_html      List of allowed HTML elements\n * @param array  $allowed_protocols Optional. Allowed protocol in links.\n * @return string Filtered content with only allowed HTML elements\n */\nfunction wp_kses( $string, $allowed_html, $allowed_protocols = array() ) {\n\tif ( empty( $allowed_protocols ) )\n\t\t$allowed_protocols = wp_allowed_protocols();\n\t$string = wp_kses_no_null( $string, array( 'slash_zero' => 'keep' ) );\n\t$string = wp_kses_js_entities($string);\n\t$string = wp_kses_normalize_entities($string);\n\t$string = wp_kses_hook($string, $allowed_html, $allowed_protocols); // WP changed the order of these funcs and added args to wp_kses_hook\n\treturn wp_kses_split($string, $allowed_html, $allowed_protocols);\n}\n\n/**\n * Filters one attribute only and ensures its value is allowed.\n *\n * This function has the advantage of being more secure than esc_attr() and can\n * escape data in some situations where wp_kses() must strip the whole attribute.\n *\n * @since 4.2.3\n *\n * @param string $string The 'whole' attribute, including name and value.\n * @param string $element The element name to which the attribute belongs.\n * @return string Filtered attribute.\n */\nfunction wp_kses_one_attr( $string, $element ) {\n\t$uris = array('xmlns', 'profile', 'href', 'src', 'cite', 'classid', 'codebase', 'data', 'usemap', 'longdesc', 'action');\n\t$allowed_html = wp_kses_allowed_html( 'post' );\n\t$allowed_protocols = wp_allowed_protocols();\n\t$string = wp_kses_no_null( $string, array( 'slash_zero' => 'keep' ) );\n\t$string = wp_kses_js_entities( $string );\n\t\n\t// Preserve leading and trailing whitespace.\n\t$matches = array();\n\tpreg_match('/^\\s*/', $string, $matches);\n\t$lead = $matches[0];\n\tpreg_match('/\\s*$/', $string, $matches);\n\t$trail = $matches[0];\n\tif ( empty( $trail ) ) {\n\t\t$string = substr( $string, strlen( $lead ) );\n\t} else {\n\t\t$string = substr( $string, strlen( $lead ), -strlen( $trail ) );\n\t}\n\t\n\t// Parse attribute name and value from input.\n\t$split = preg_split( '/\\s*=\\s*/', $string, 2 );\n\t$name = $split[0];\n\tif ( count( $split ) == 2 ) {\n\t\t$value = $split[1];\n\n\t\t// Remove quotes surrounding $value.\n\t\t// Also guarantee correct quoting in $string for this one attribute.\n\t\tif ( '' == $value ) {\n\t\t\t$quote = '';\n\t\t} else {\n\t\t\t$quote = $value[0];\n\t\t}\n\t\tif ( '\"' == $quote || \"'\" == $quote ) {\n\t\t\tif ( substr( $value, -1 ) != $quote ) {\n\t\t\t\treturn '';\n\t\t\t}\n\t\t\t$value = substr( $value, 1, -1 );\n\t\t} else {\n\t\t\t$quote = '\"';\n\t\t}\n\n\t\t// Sanitize quotes, angle braces, and entities.\n\t\t$value = esc_attr( $value );\n\n\t\t// Sanitize URI values.\n\t\tif ( in_array( strtolower( $name ), $uris ) ) {\n\t\t\t$value = wp_kses_bad_protocol( $value, $allowed_protocols );\n\t\t}\n\n\t\t$string = \"$name=$quote$value$quote\";\n\t\t$vless = 'n';\n\t} else {\n\t\t$value = '';\n\t\t$vless = 'y';\n\t}\n\t\n\t// Sanitize attribute by name.\n\twp_kses_attr_check( $name, $value, $string, $vless, $element, $allowed_html );\n\n\t// Restore whitespace.\n\treturn $lead . $string . $trail;\n}\n\n/**\n * Return a list of allowed tags and attributes for a given context.\n *\n * @since 3.5.0\n *\n * @global array $allowedposttags\n * @global array $allowedtags\n * @global array $allowedentitynames\n *\n * @param string $context The context for which to retrieve tags.\n *                        Allowed values are post, strip, data,entities, or\n *                        the name of a field filter such as pre_user_description.\n * @return array List of allowed tags and their allowed attributes.\n */\nfunction wp_kses_allowed_html( $context = '' ) {\n\tglobal $allowedposttags, $allowedtags, $allowedentitynames;\n\n\tif ( is_array( $context ) ) {\n\t\t/**\n\t\t * Filter HTML elements allowed for a given context.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param string $tags    Allowed tags, attributes, and/or entities.\n\t\t * @param string $context Context to judge allowed tags by. Allowed values are 'post',\n\t\t *                        'data', 'strip', 'entities', 'explicit', or the name of a filter.\n\t\t */\n\t\treturn apply_filters( 'wp_kses_allowed_html', $context, 'explicit' );\n\t}\n\n\tswitch ( $context ) {\n\t\tcase 'post':\n\t\t\t/** This filter is documented in wp-includes/kses.php */\n\t\t\treturn apply_filters( 'wp_kses_allowed_html', $allowedposttags, $context );\n\n\t\tcase 'user_description':\n\t\tcase 'pre_user_description':\n\t\t\t$tags = $allowedtags;\n\t\t\t$tags['a']['rel'] = true;\n\t\t\t/** This filter is documented in wp-includes/kses.php */\n\t\t\treturn apply_filters( 'wp_kses_allowed_html', $tags, $context );\n\n\t\tcase 'strip':\n\t\t\t/** This filter is documented in wp-includes/kses.php */\n\t\t\treturn apply_filters( 'wp_kses_allowed_html', array(), $context );\n\n\t\tcase 'entities':\n\t\t\t/** This filter is documented in wp-includes/kses.php */\n\t\t\treturn apply_filters( 'wp_kses_allowed_html', $allowedentitynames, $context);\n\n\t\tcase 'data':\n\t\tdefault:\n\t\t\t/** This filter is documented in wp-includes/kses.php */\n\t\t\treturn apply_filters( 'wp_kses_allowed_html', $allowedtags, $context );\n\t}\n}\n\n/**\n * You add any kses hooks here.\n *\n * There is currently only one kses WordPress hook and it is called here. All\n * parameters are passed to the hooks and expected to receive a string.\n *\n * @since 1.0.0\n *\n * @param string $string            Content to filter through kses\n * @param array  $allowed_html      List of allowed HTML elements\n * @param array  $allowed_protocols Allowed protocol in links\n * @return string Filtered content through 'pre_kses' hook\n */\nfunction wp_kses_hook( $string, $allowed_html, $allowed_protocols ) {\n\t/**\n\t * Filter content to be run through kses.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $string            Content to run through kses.\n\t * @param array  $allowed_html      Allowed HTML elements.\n\t * @param array  $allowed_protocols Allowed protocol in links.\n\t */\n\treturn apply_filters( 'pre_kses', $string, $allowed_html, $allowed_protocols );\n}\n\n/**\n * This function returns kses' version number.\n *\n * @since 1.0.0\n *\n * @return string KSES Version Number\n */\nfunction wp_kses_version() {\n\treturn '0.2.2';\n}\n\n/**\n * Searches for HTML tags, no matter how malformed.\n *\n * It also matches stray \">\" characters.\n *\n * @since 1.0.0\n *\n * @global array $pass_allowed_html\n * @global array $pass_allowed_protocols\n *\n * @param string $string            Content to filter\n * @param array  $allowed_html      Allowed HTML elements\n * @param array  $allowed_protocols Allowed protocols to keep\n * @return string Content with fixed HTML tags\n */\nfunction wp_kses_split( $string, $allowed_html, $allowed_protocols ) {\n\tglobal $pass_allowed_html, $pass_allowed_protocols;\n\t$pass_allowed_html = $allowed_html;\n\t$pass_allowed_protocols = $allowed_protocols;\n\treturn preg_replace_callback( '%(<!--.*?(-->|$))|(<[^>]*(>|$)|>)%', '_wp_kses_split_callback', $string );\n}\n\n/**\n * Callback for wp_kses_split.\n *\n * @since 3.1.0\n * @access private\n *\n * @global array $pass_allowed_html\n * @global array $pass_allowed_protocols\n *\n * @return string\n */\nfunction _wp_kses_split_callback( $match ) {\n\tglobal $pass_allowed_html, $pass_allowed_protocols;\n\treturn wp_kses_split2( $match[0], $pass_allowed_html, $pass_allowed_protocols );\n}\n\n/**\n * Callback for wp_kses_split for fixing malformed HTML tags.\n *\n * This function does a lot of work. It rejects some very malformed things like\n * <:::>. It returns an empty string, if the element isn't allowed (look ma, no\n * strip_tags()!). Otherwise it splits the tag into an element and an attribute\n * list.\n *\n * After the tag is split into an element and an attribute list, it is run\n * through another filter which will remove illegal attributes and once that is\n * completed, will be returned.\n *\n * @access private\n * @since 1.0.0\n *\n * @param string $string            Content to filter\n * @param array  $allowed_html      Allowed HTML elements\n * @param array  $allowed_protocols Allowed protocols to keep\n * @return string Fixed HTML element\n */\nfunction wp_kses_split2($string, $allowed_html, $allowed_protocols) {\n\t$string = wp_kses_stripslashes($string);\n\n\tif (substr($string, 0, 1) != '<')\n\t\treturn '&gt;';\n\t// It matched a \">\" character\n\n\tif ( '<!--' == substr( $string, 0, 4 ) ) {\n\t\t$string = str_replace( array('<!--', '-->'), '', $string );\n\t\twhile ( $string != ($newstring = wp_kses($string, $allowed_html, $allowed_protocols)) )\n\t\t\t$string = $newstring;\n\t\tif ( $string == '' )\n\t\t\treturn '';\n\t\t// prevent multiple dashes in comments\n\t\t$string = preg_replace('/--+/', '-', $string);\n\t\t// prevent three dashes closing a comment\n\t\t$string = preg_replace('/-$/', '', $string);\n\t\treturn \"<!--{$string}-->\";\n\t}\n\t// Allow HTML comments\n\n\tif (!preg_match('%^<\\s*(/\\s*)?([a-zA-Z0-9]+)([^>]*)>?$%', $string, $matches))\n\t\treturn '';\n\t// It's seriously malformed\n\n\t$slash = trim($matches[1]);\n\t$elem = $matches[2];\n\t$attrlist = $matches[3];\n\n\tif ( ! is_array( $allowed_html ) )\n\t\t$allowed_html = wp_kses_allowed_html( $allowed_html );\n\n\tif ( ! isset($allowed_html[strtolower($elem)]) )\n\t\treturn '';\n\t// They are using a not allowed HTML element\n\n\tif ($slash != '')\n\t\treturn \"</$elem>\";\n\t// No attributes are allowed for closing elements\n\n\treturn wp_kses_attr( $elem, $attrlist, $allowed_html, $allowed_protocols );\n}\n\n/**\n * Removes all attributes, if none are allowed for this element.\n *\n * If some are allowed it calls wp_kses_hair() to split them further, and then\n * it builds up new HTML code from the data that kses_hair() returns. It also\n * removes \"<\" and \">\" characters, if there are any left. One more thing it does\n * is to check if the tag has a closing XHTML slash, and if it does, it puts one\n * in the returned code as well.\n *\n * @since 1.0.0\n *\n * @param string $element           HTML element/tag\n * @param string $attr              HTML attributes from HTML element to closing HTML element tag\n * @param array  $allowed_html      Allowed HTML elements\n * @param array  $allowed_protocols Allowed protocols to keep\n * @return string Sanitized HTML element\n */\nfunction wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols) {\n\tif ( ! is_array( $allowed_html ) )\n\t\t$allowed_html = wp_kses_allowed_html( $allowed_html );\n\n\t// Is there a closing XHTML slash at the end of the attributes?\n\t$xhtml_slash = '';\n\tif (preg_match('%\\s*/\\s*$%', $attr))\n\t\t$xhtml_slash = ' /';\n\n\t// Are any attributes allowed at all for this element?\n\tif ( ! isset($allowed_html[strtolower($element)]) || count($allowed_html[strtolower($element)]) == 0 )\n\t\treturn \"<$element$xhtml_slash>\";\n\n\t// Split it\n\t$attrarr = wp_kses_hair($attr, $allowed_protocols);\n\n\t// Go through $attrarr, and save the allowed attributes for this element\n\t// in $attr2\n\t$attr2 = '';\n\tforeach ( $attrarr as $arreach ) {\n\t\tif ( wp_kses_attr_check( $arreach['name'], $arreach['value'], $arreach['whole'], $arreach['vless'], $element, $allowed_html ) ) {\n\t\t\t$attr2 .= ' '.$arreach['whole'];\n\t\t}\n\t}\n\n\t// Remove any \"<\" or \">\" characters\n\t$attr2 = preg_replace('/[<>]/', '', $attr2);\n\n\treturn \"<$element$attr2$xhtml_slash>\";\n}\n\n/**\n * Determine whether an attribute is allowed.\n *\n * @since 4.2.3\n *\n * @param string $name The attribute name. Returns empty string when not allowed.\n * @param string $value The attribute value. Returns a filtered value.\n * @param string $whole The name=value input. Returns filtered input.\n * @param string $vless 'y' when attribute like \"enabled\", otherwise 'n'.\n * @param string $element The name of the element to which this attribute belongs.\n * @param array $allowed_html The full list of allowed elements and attributes.\n * @return bool Is the attribute allowed?\n */\nfunction wp_kses_attr_check( &$name, &$value, &$whole, $vless, $element, $allowed_html ) {\n\t$allowed_attr = $allowed_html[strtolower( $element )];\n\n\t$name_low = strtolower( $name );\n\tif ( ! isset( $allowed_attr[$name_low] ) || '' == $allowed_attr[$name_low] ) {\n\t\t$name = $value = $whole = '';\n\t\treturn false;\n\t}\n\n\tif ( 'style' == $name_low ) {\n\t\t$new_value = safecss_filter_attr( $value );\n\n\t\tif ( empty( $new_value ) ) {\n\t\t\t$name = $value = $whole = '';\n\t\t\treturn false;\n\t\t}\n\n\t\t$whole = str_replace( $value, $new_value, $whole );\n\t\t$value = $new_value;\n\t}\n\n\tif ( is_array( $allowed_attr[$name_low] ) ) {\n\t\t// there are some checks\n\t\tforeach ( $allowed_attr[$name_low] as $currkey => $currval ) {\n\t\t\tif ( ! wp_kses_check_attr_val( $value, $vless, $currkey, $currval ) ) {\n\t\t\t\t$name = $value = $whole = '';\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Builds an attribute list from string containing attributes.\n *\n * This function does a lot of work. It parses an attribute list into an array\n * with attribute data, and tries to do the right thing even if it gets weird\n * input. It will add quotes around attribute values that don't have any quotes\n * or apostrophes around them, to make it easier to produce HTML code that will\n * conform to W3C's HTML specification. It will also remove bad URL protocols\n * from attribute values. It also reduces duplicate attributes by using the\n * attribute defined first (foo='bar' foo='baz' will result in foo='bar').\n *\n * @since 1.0.0\n *\n * @param string $attr              Attribute list from HTML element to closing HTML element tag\n * @param array  $allowed_protocols Allowed protocols to keep\n * @return array List of attributes after parsing\n */\nfunction wp_kses_hair($attr, $allowed_protocols) {\n\t$attrarr = array();\n\t$mode = 0;\n\t$attrname = '';\n\t$uris = array('xmlns', 'profile', 'href', 'src', 'cite', 'classid', 'codebase', 'data', 'usemap', 'longdesc', 'action');\n\n\t// Loop through the whole attribute list\n\n\twhile (strlen($attr) != 0) {\n\t\t$working = 0; // Was the last operation successful?\n\n\t\tswitch ($mode) {\n\t\t\tcase 0 : // attribute name, href for instance\n\n\t\t\t\tif ( preg_match('/^([-a-zA-Z:]+)/', $attr, $match ) ) {\n\t\t\t\t\t$attrname = $match[1];\n\t\t\t\t\t$working = $mode = 1;\n\t\t\t\t\t$attr = preg_replace( '/^[-a-zA-Z:]+/', '', $attr );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 1 : // equals sign or valueless (\"selected\")\n\n\t\t\t\tif (preg_match('/^\\s*=\\s*/', $attr)) // equals sign\n\t\t\t\t\t{\n\t\t\t\t\t$working = 1;\n\t\t\t\t\t$mode = 2;\n\t\t\t\t\t$attr = preg_replace('/^\\s*=\\s*/', '', $attr);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (preg_match('/^\\s+/', $attr)) // valueless\n\t\t\t\t\t{\n\t\t\t\t\t$working = 1;\n\t\t\t\t\t$mode = 0;\n\t\t\t\t\tif(false === array_key_exists($attrname, $attrarr)) {\n\t\t\t\t\t\t$attrarr[$attrname] = array ('name' => $attrname, 'value' => '', 'whole' => $attrname, 'vless' => 'y');\n\t\t\t\t\t}\n\t\t\t\t\t$attr = preg_replace('/^\\s+/', '', $attr);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2 : // attribute value, a URL after href= for instance\n\n\t\t\t\tif (preg_match('%^\"([^\"]*)\"(\\s+|/?$)%', $attr, $match))\n\t\t\t\t\t// \"value\"\n\t\t\t\t\t{\n\t\t\t\t\t$thisval = $match[1];\n\t\t\t\t\tif ( in_array(strtolower($attrname), $uris) )\n\t\t\t\t\t\t$thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);\n\n\t\t\t\t\tif(false === array_key_exists($attrname, $attrarr)) {\n\t\t\t\t\t\t$attrarr[$attrname] = array ('name' => $attrname, 'value' => $thisval, 'whole' => \"$attrname=\\\"$thisval\\\"\", 'vless' => 'n');\n\t\t\t\t\t}\n\t\t\t\t\t$working = 1;\n\t\t\t\t\t$mode = 0;\n\t\t\t\t\t$attr = preg_replace('/^\"[^\"]*\"(\\s+|$)/', '', $attr);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (preg_match(\"%^'([^']*)'(\\s+|/?$)%\", $attr, $match))\n\t\t\t\t\t// 'value'\n\t\t\t\t\t{\n\t\t\t\t\t$thisval = $match[1];\n\t\t\t\t\tif ( in_array(strtolower($attrname), $uris) )\n\t\t\t\t\t\t$thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);\n\n\t\t\t\t\tif(false === array_key_exists($attrname, $attrarr)) {\n\t\t\t\t\t\t$attrarr[$attrname] = array ('name' => $attrname, 'value' => $thisval, 'whole' => \"$attrname='$thisval'\", 'vless' => 'n');\n\t\t\t\t\t}\n\t\t\t\t\t$working = 1;\n\t\t\t\t\t$mode = 0;\n\t\t\t\t\t$attr = preg_replace(\"/^'[^']*'(\\s+|$)/\", '', $attr);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (preg_match(\"%^([^\\s\\\"']+)(\\s+|/?$)%\", $attr, $match))\n\t\t\t\t\t// value\n\t\t\t\t\t{\n\t\t\t\t\t$thisval = $match[1];\n\t\t\t\t\tif ( in_array(strtolower($attrname), $uris) )\n\t\t\t\t\t\t$thisval = wp_kses_bad_protocol($thisval, $allowed_protocols);\n\n\t\t\t\t\tif(false === array_key_exists($attrname, $attrarr)) {\n\t\t\t\t\t\t$attrarr[$attrname] = array ('name' => $attrname, 'value' => $thisval, 'whole' => \"$attrname=\\\"$thisval\\\"\", 'vless' => 'n');\n\t\t\t\t\t}\n\t\t\t\t\t// We add quotes to conform to W3C's HTML spec.\n\t\t\t\t\t$working = 1;\n\t\t\t\t\t$mode = 0;\n\t\t\t\t\t$attr = preg_replace(\"%^[^\\s\\\"']+(\\s+|$)%\", '', $attr);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t} // switch\n\n\t\tif ($working == 0) // not well formed, remove and try again\n\t\t{\n\t\t\t$attr = wp_kses_html_error($attr);\n\t\t\t$mode = 0;\n\t\t}\n\t} // while\n\n\tif ($mode == 1 && false === array_key_exists($attrname, $attrarr))\n\t\t// special case, for when the attribute list ends with a valueless\n\t\t// attribute like \"selected\"\n\t\t$attrarr[$attrname] = array ('name' => $attrname, 'value' => '', 'whole' => $attrname, 'vless' => 'y');\n\n\treturn $attrarr;\n}\n\n/**\n * Finds all attributes of an HTML element.\n *\n * Does not modify input.  May return \"evil\" output.\n *\n * Based on wp_kses_split2() and wp_kses_attr()\n *\n * @since 4.2.3\n *\n * @param string $element HTML element/tag\n * @return array|bool List of attributes found in $element. Returns false on failure.\n */\nfunction wp_kses_attr_parse( $element ) {\n\t$valid = preg_match('%^(<\\s*)(/\\s*)?([a-zA-Z0-9]+\\s*)([^>]*)(>?)$%', $element, $matches);\n\tif ( 1 !== $valid ) {\n\t\treturn false;\n\t}\n\n\t$begin =  $matches[1];\n\t$slash =  $matches[2];\n\t$elname = $matches[3];\n\t$attr =   $matches[4];\n\t$end =    $matches[5];\n\n\tif ( '' !== $slash ) {\n\t\t// Closing elements do not get parsed.\n\t\treturn false;\n\t}\n\n\t// Is there a closing XHTML slash at the end of the attributes?\n\tif ( 1 === preg_match( '%\\s*/\\s*$%', $attr, $matches ) ) {\n\t\t$xhtml_slash = $matches[0];\n\t\t$attr = substr( $attr, 0, -strlen( $xhtml_slash ) );\n\t} else {\n\t\t$xhtml_slash = '';\n\t}\n\t\n\t// Split it\n\t$attrarr = wp_kses_hair_parse( $attr );\n\tif ( false === $attrarr ) {\n\t\treturn false;\n\t}\n\n\t// Make sure all input is returned by adding front and back matter.\n\tarray_unshift( $attrarr, $begin . $slash . $elname );\n\tarray_push( $attrarr, $xhtml_slash . $end );\n\t\n\treturn $attrarr;\n}\n\n/**\n * Builds an attribute list from string containing attributes.\n *\n * Does not modify input.  May return \"evil\" output.\n * In case of unexpected input, returns false instead of stripping things.\n *\n * Based on wp_kses_hair() but does not return a multi-dimensional array.\n *\n * @since 4.2.3\n *\n * @param string $attr Attribute list from HTML element to closing HTML element tag\n * @return array|bool List of attributes found in $attr. Returns false on failure.\n */\nfunction wp_kses_hair_parse( $attr ) {\n\tif ( '' === $attr ) {\n\t\treturn array();\n\t}\n\n\t$regex =\n\t  '(?:'\n\t.     '[-a-zA-Z:]+'   // Attribute name.\n\t. '|'\n\t.     '\\[\\[?[^\\[\\]]+\\]\\]?' // Shortcode in the name position implies unfiltered_html.\n\t. ')'\n\t. '(?:'               // Attribute value.\n\t.     '\\s*=\\s*'       // All values begin with '='\n\t.     '(?:'\n\t.         '\"[^\"]*\"'   // Double-quoted\n\t.     '|'\n\t.         \"'[^']*'\"   // Single-quoted\n\t.     '|'\n\t.         '[^\\s\"\\']+' // Non-quoted\n\t.         '(?:\\s|$)'  // Must have a space\n\t.     ')'\n\t. '|'\n\t.     '(?:\\s|$)'      // If attribute has no value, space is required.\n\t. ')'\n\t. '\\s*';              // Trailing space is optional except as mentioned above.\n\n\t// Although it is possible to reduce this procedure to a single regexp,\n\t// we must run that regexp twice to get exactly the expected result.\n\n\t$validation = \"%^($regex)+$%\";\n\t$extraction = \"%$regex%\";\n\n\tif ( 1 === preg_match( $validation, $attr ) ) {\n\t\tpreg_match_all( $extraction, $attr, $attrarr );\n\t\treturn $attrarr[0];\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * Performs different checks for attribute values.\n *\n * The currently implemented checks are \"maxlen\", \"minlen\", \"maxval\", \"minval\"\n * and \"valueless\".\n *\n * @since 1.0.0\n *\n * @param string $value      Attribute value\n * @param string $vless      Whether the value is valueless. Use 'y' or 'n'\n * @param string $checkname  What $checkvalue is checking for.\n * @param mixed  $checkvalue What constraint the value should pass\n * @return bool Whether check passes\n */\nfunction wp_kses_check_attr_val($value, $vless, $checkname, $checkvalue) {\n\t$ok = true;\n\n\tswitch (strtolower($checkname)) {\n\t\tcase 'maxlen' :\n\t\t\t// The maxlen check makes sure that the attribute value has a length not\n\t\t\t// greater than the given value. This can be used to avoid Buffer Overflows\n\t\t\t// in WWW clients and various Internet servers.\n\n\t\t\tif (strlen($value) > $checkvalue)\n\t\t\t\t$ok = false;\n\t\t\tbreak;\n\n\t\tcase 'minlen' :\n\t\t\t// The minlen check makes sure that the attribute value has a length not\n\t\t\t// smaller than the given value.\n\n\t\t\tif (strlen($value) < $checkvalue)\n\t\t\t\t$ok = false;\n\t\t\tbreak;\n\n\t\tcase 'maxval' :\n\t\t\t// The maxval check does two things: it checks that the attribute value is\n\t\t\t// an integer from 0 and up, without an excessive amount of zeroes or\n\t\t\t// whitespace (to avoid Buffer Overflows). It also checks that the attribute\n\t\t\t// value is not greater than the given value.\n\t\t\t// This check can be used to avoid Denial of Service attacks.\n\n\t\t\tif (!preg_match('/^\\s{0,6}[0-9]{1,6}\\s{0,6}$/', $value))\n\t\t\t\t$ok = false;\n\t\t\tif ($value > $checkvalue)\n\t\t\t\t$ok = false;\n\t\t\tbreak;\n\n\t\tcase 'minval' :\n\t\t\t// The minval check makes sure that the attribute value is a positive integer,\n\t\t\t// and that it is not smaller than the given value.\n\n\t\t\tif (!preg_match('/^\\s{0,6}[0-9]{1,6}\\s{0,6}$/', $value))\n\t\t\t\t$ok = false;\n\t\t\tif ($value < $checkvalue)\n\t\t\t\t$ok = false;\n\t\t\tbreak;\n\n\t\tcase 'valueless' :\n\t\t\t// The valueless check makes sure if the attribute has a value\n\t\t\t// (like <a href=\"blah\">) or not (<option selected>). If the given value\n\t\t\t// is a \"y\" or a \"Y\", the attribute must not have a value.\n\t\t\t// If the given value is an \"n\" or an \"N\", the attribute must have one.\n\n\t\t\tif (strtolower($checkvalue) != $vless)\n\t\t\t\t$ok = false;\n\t\t\tbreak;\n\t} // switch\n\n\treturn $ok;\n}\n\n/**\n * Sanitize string from bad protocols.\n *\n * This function removes all non-allowed protocols from the beginning of\n * $string. It ignores whitespace and the case of the letters, and it does\n * understand HTML entities. It does its work in a while loop, so it won't be\n * fooled by a string like \"javascript:javascript:alert(57)\".\n *\n * @since 1.0.0\n *\n * @param string $string            Content to filter bad protocols from\n * @param array  $allowed_protocols Allowed protocols to keep\n * @return string Filtered content\n */\nfunction wp_kses_bad_protocol($string, $allowed_protocols) {\n\t$string = wp_kses_no_null($string);\n\t$iterations = 0;\n\n\tdo {\n\t\t$original_string = $string;\n\t\t$string = wp_kses_bad_protocol_once($string, $allowed_protocols);\n\t} while ( $original_string != $string && ++$iterations < 6 );\n\n\tif ( $original_string != $string )\n\t\treturn '';\n\n\treturn $string;\n}\n\n/**\n * Removes any invalid control characters in $string.\n *\n * Also removes any instance of the '\\0' string.\n *\n * @since 1.0.0\n *\n * @param string $string\n * @param array $options Set 'slash_zero' => 'keep' when '\\0' is allowed. Default is 'remove'.\n * @return string\n */\nfunction wp_kses_no_null( $string, $options = null ) {\n\tif ( ! isset( $options['slash_zero'] ) ) {\n\t\t$options = array( 'slash_zero' => 'remove' );\n\t}\n\n\t$string = preg_replace( '/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/', '', $string );\n\tif ( 'remove' == $options['slash_zero'] ) {\n\t\t$string = preg_replace( '/\\\\\\\\+0+/', '', $string );\n\t}\n\n\treturn $string;\n}\n\n/**\n * Strips slashes from in front of quotes.\n *\n * This function changes the character sequence \\\" to just \". It leaves all\n * other slashes alone. It's really weird, but the quoting from\n * preg_replace(//e) seems to require this.\n *\n * @since 1.0.0\n *\n * @param string $string String to strip slashes\n * @return string Fixed string with quoted slashes\n */\nfunction wp_kses_stripslashes($string) {\n\treturn preg_replace('%\\\\\\\\\"%', '\"', $string);\n}\n\n/**\n * Goes through an array and changes the keys to all lower case.\n *\n * @since 1.0.0\n *\n * @param array $inarray Unfiltered array\n * @return array Fixed array with all lowercase keys\n */\nfunction wp_kses_array_lc($inarray) {\n\t$outarray = array ();\n\n\tforeach ( (array) $inarray as $inkey => $inval) {\n\t\t$outkey = strtolower($inkey);\n\t\t$outarray[$outkey] = array ();\n\n\t\tforeach ( (array) $inval as $inkey2 => $inval2) {\n\t\t\t$outkey2 = strtolower($inkey2);\n\t\t\t$outarray[$outkey][$outkey2] = $inval2;\n\t\t} // foreach $inval\n\t} // foreach $inarray\n\n\treturn $outarray;\n}\n\n/**\n * Removes the HTML JavaScript entities found in early versions of Netscape 4.\n *\n * @since 1.0.0\n *\n * @param string $string\n * @return string\n */\nfunction wp_kses_js_entities($string) {\n\treturn preg_replace('%&\\s*\\{[^}]*(\\}\\s*;?|$)%', '', $string);\n}\n\n/**\n * Handles parsing errors in wp_kses_hair().\n *\n * The general plan is to remove everything to and including some whitespace,\n * but it deals with quotes and apostrophes as well.\n *\n * @since 1.0.0\n *\n * @param string $string\n * @return string\n */\nfunction wp_kses_html_error($string) {\n\treturn preg_replace('/^(\"[^\"]*(\"|$)|\\'[^\\']*(\\'|$)|\\S)*\\s*/', '', $string);\n}\n\n/**\n * Sanitizes content from bad protocols and other characters.\n *\n * This function searches for URL protocols at the beginning of $string, while\n * handling whitespace and HTML entities.\n *\n * @since 1.0.0\n *\n * @param string $string            Content to check for bad protocols\n * @param string $allowed_protocols Allowed protocols\n * @return string Sanitized content\n */\nfunction wp_kses_bad_protocol_once($string, $allowed_protocols, $count = 1 ) {\n\t$string2 = preg_split( '/:|&#0*58;|&#x0*3a;/i', $string, 2 );\n\tif ( isset($string2[1]) && ! preg_match('%/\\?%', $string2[0]) ) {\n\t\t$string = trim( $string2[1] );\n\t\t$protocol = wp_kses_bad_protocol_once2( $string2[0], $allowed_protocols );\n\t\tif ( 'feed:' == $protocol ) {\n\t\t\tif ( $count > 2 )\n\t\t\t\treturn '';\n\t\t\t$string = wp_kses_bad_protocol_once( $string, $allowed_protocols, ++$count );\n\t\t\tif ( empty( $string ) )\n\t\t\t\treturn $string;\n\t\t}\n\t\t$string = $protocol . $string;\n\t}\n\n\treturn $string;\n}\n\n/**\n * Callback for wp_kses_bad_protocol_once() regular expression.\n *\n * This function processes URL protocols, checks to see if they're in the\n * whitelist or not, and returns different data depending on the answer.\n *\n * @access private\n * @since 1.0.0\n *\n * @param string $string            URI scheme to check against the whitelist\n * @param string $allowed_protocols Allowed protocols\n * @return string Sanitized content\n */\nfunction wp_kses_bad_protocol_once2( $string, $allowed_protocols ) {\n\t$string2 = wp_kses_decode_entities($string);\n\t$string2 = preg_replace('/\\s/', '', $string2);\n\t$string2 = wp_kses_no_null($string2);\n\t$string2 = strtolower($string2);\n\n\t$allowed = false;\n\tforeach ( (array) $allowed_protocols as $one_protocol )\n\t\tif ( strtolower($one_protocol) == $string2 ) {\n\t\t\t$allowed = true;\n\t\t\tbreak;\n\t\t}\n\n\tif ($allowed)\n\t\treturn \"$string2:\";\n\telse\n\t\treturn '';\n}\n\n/**\n * Converts and fixes HTML entities.\n *\n * This function normalizes HTML entities. It will convert `AT&T` to the correct\n * `AT&amp;T`, `&#00058;` to `&#58;`, `&#XYZZY;` to `&amp;#XYZZY;` and so on.\n *\n * @since 1.0.0\n *\n * @param string $string Content to normalize entities\n * @return string Content with normalized entities\n */\nfunction wp_kses_normalize_entities($string) {\n\t// Disarm all entities by converting & to &amp;\n\t$string = str_replace('&', '&amp;', $string);\n\n\t// Change back the allowed entities in our entity whitelist\n\t$string = preg_replace_callback('/&amp;([A-Za-z]{2,8}[0-9]{0,2});/', 'wp_kses_named_entities', $string);\n\t$string = preg_replace_callback('/&amp;#(0*[0-9]{1,7});/', 'wp_kses_normalize_entities2', $string);\n\t$string = preg_replace_callback('/&amp;#[Xx](0*[0-9A-Fa-f]{1,6});/', 'wp_kses_normalize_entities3', $string);\n\n\treturn $string;\n}\n\n/**\n * Callback for wp_kses_normalize_entities() regular expression.\n *\n * This function only accepts valid named entity references, which are finite,\n * case-sensitive, and highly scrutinized by HTML and XML validators.\n *\n * @since 3.0.0\n *\n * @global array $allowedentitynames\n *\n * @param array $matches preg_replace_callback() matches array\n * @return string Correctly encoded entity\n */\nfunction wp_kses_named_entities($matches) {\n\tglobal $allowedentitynames;\n\n\tif ( empty($matches[1]) )\n\t\treturn '';\n\n\t$i = $matches[1];\n\treturn ( ! in_array( $i, $allowedentitynames ) ) ? \"&amp;$i;\" : \"&$i;\";\n}\n\n/**\n * Callback for wp_kses_normalize_entities() regular expression.\n *\n * This function helps {@see wp_kses_normalize_entities()} to only accept 16-bit\n * values and nothing more for `&#number;` entities.\n *\n * @access private\n * @since 1.0.0\n *\n * @param array $matches preg_replace_callback() matches array\n * @return string Correctly encoded entity\n */\nfunction wp_kses_normalize_entities2($matches) {\n\tif ( empty($matches[1]) )\n\t\treturn '';\n\n\t$i = $matches[1];\n\tif (valid_unicode($i)) {\n\t\t$i = str_pad(ltrim($i,'0'), 3, '0', STR_PAD_LEFT);\n\t\t$i = \"&#$i;\";\n\t} else {\n\t\t$i = \"&amp;#$i;\";\n\t}\n\n\treturn $i;\n}\n\n/**\n * Callback for wp_kses_normalize_entities() for regular expression.\n *\n * This function helps wp_kses_normalize_entities() to only accept valid Unicode\n * numeric entities in hex form.\n *\n * @access private\n *\n * @param array $matches preg_replace_callback() matches array\n * @return string Correctly encoded entity\n */\nfunction wp_kses_normalize_entities3($matches) {\n\tif ( empty($matches[1]) )\n\t\treturn '';\n\n\t$hexchars = $matches[1];\n\treturn ( ! valid_unicode( hexdec( $hexchars ) ) ) ? \"&amp;#x$hexchars;\" : '&#x'.ltrim($hexchars,'0').';';\n}\n\n/**\n * Helper function to determine if a Unicode value is valid.\n *\n * @param int $i Unicode value\n * @return bool True if the value was a valid Unicode number\n */\nfunction valid_unicode($i) {\n\treturn ( $i == 0x9 || $i == 0xa || $i == 0xd ||\n\t\t\t($i >= 0x20 && $i <= 0xd7ff) ||\n\t\t\t($i >= 0xe000 && $i <= 0xfffd) ||\n\t\t\t($i >= 0x10000 && $i <= 0x10ffff) );\n}\n\n/**\n * Convert all entities to their character counterparts.\n *\n * This function decodes numeric HTML entities (`&#65;` and `&#x41;`).\n * It doesn't do anything with other entities like &auml;, but we don't\n * need them in the URL protocol whitelisting system anyway.\n *\n * @since 1.0.0\n *\n * @param string $string Content to change entities\n * @return string Content after decoded entities\n */\nfunction wp_kses_decode_entities($string) {\n\t$string = preg_replace_callback('/&#([0-9]+);/', '_wp_kses_decode_entities_chr', $string);\n\t$string = preg_replace_callback('/&#[Xx]([0-9A-Fa-f]+);/', '_wp_kses_decode_entities_chr_hexdec', $string);\n\n\treturn $string;\n}\n\n/**\n * Regex callback for wp_kses_decode_entities()\n *\n * @param array $match preg match\n * @return string\n */\nfunction _wp_kses_decode_entities_chr( $match ) {\n\treturn chr( $match[1] );\n}\n\n/**\n * Regex callback for wp_kses_decode_entities()\n *\n * @param array $match preg match\n * @return string\n */\nfunction _wp_kses_decode_entities_chr_hexdec( $match ) {\n\treturn chr( hexdec( $match[1] ) );\n}\n\n/**\n * Sanitize content with allowed HTML Kses rules.\n *\n * @since 1.0.0\n *\n * @param string $data Content to filter, expected to be escaped with slashes\n * @return string Filtered content\n */\nfunction wp_filter_kses( $data ) {\n\treturn addslashes( wp_kses( stripslashes( $data ), current_filter() ) );\n}\n\n/**\n * Sanitize content with allowed HTML Kses rules.\n *\n * @since 2.9.0\n *\n * @param string $data Content to filter, expected to not be escaped\n * @return string Filtered content\n */\nfunction wp_kses_data( $data ) {\n\treturn wp_kses( $data, current_filter() );\n}\n\n/**\n * Sanitize content for allowed HTML tags for post content.\n *\n * Post content refers to the page contents of the 'post' type and not $_POST\n * data from forms.\n *\n * @since 2.0.0\n *\n * @param string $data Post content to filter, expected to be escaped with slashes\n * @return string Filtered post content with allowed HTML tags and attributes intact.\n */\nfunction wp_filter_post_kses( $data ) {\n\treturn addslashes( wp_kses( stripslashes( $data ), 'post' ) );\n}\n\n/**\n * Sanitize content for allowed HTML tags for post content.\n *\n * Post content refers to the page contents of the 'post' type and not $_POST\n * data from forms.\n *\n * @since 2.9.0\n *\n * @param string $data Post content to filter\n * @return string Filtered post content with allowed HTML tags and attributes intact.\n */\nfunction wp_kses_post( $data ) {\n\treturn wp_kses( $data, 'post' );\n}\n\n/**\n * Navigates through an array, object, or scalar, and sanitizes content for\n * allowed HTML tags for post content.\n *\n * @since 4.4.2\n *\n * @param mixed $value The array or string to filter.\n * @return mixed $value The filtered content.\n */\nfunction wp_kses_post_deep( $data ) {\n\treturn map_deep( $data, 'wp_kses_post' );\n}\n\n/**\n * Strips all of the HTML in the content.\n *\n * @since 2.1.0\n *\n * @param string $data Content to strip all HTML from\n * @return string Filtered content without any HTML\n */\nfunction wp_filter_nohtml_kses( $data ) {\n\treturn addslashes( wp_kses( stripslashes( $data ), 'strip' ) );\n}\n\n/**\n * Adds all Kses input form content filters.\n *\n * All hooks have default priority. The wp_filter_kses() function is added to\n * the 'pre_comment_content' and 'title_save_pre' hooks.\n *\n * The wp_filter_post_kses() function is added to the 'content_save_pre',\n * 'excerpt_save_pre', and 'content_filtered_save_pre' hooks.\n *\n * @since 2.0.0\n */\nfunction kses_init_filters() {\n\t// Normal filtering\n\tadd_filter('title_save_pre', 'wp_filter_kses');\n\n\t// Comment filtering\n\tif ( current_user_can( 'unfiltered_html' ) )\n\t\tadd_filter( 'pre_comment_content', 'wp_filter_post_kses' );\n\telse\n\t\tadd_filter( 'pre_comment_content', 'wp_filter_kses' );\n\n\t// Post filtering\n\tadd_filter('content_save_pre', 'wp_filter_post_kses');\n\tadd_filter('excerpt_save_pre', 'wp_filter_post_kses');\n\tadd_filter('content_filtered_save_pre', 'wp_filter_post_kses');\n}\n\n/**\n * Removes all Kses input form content filters.\n *\n * A quick procedural method to removing all of the filters that kses uses for\n * content in WordPress Loop.\n *\n * Does not remove the kses_init() function from 'init' hook (priority is\n * default). Also does not remove kses_init() function from 'set_current_user'\n * hook (priority is also default).\n *\n * @since 2.0.6\n */\nfunction kses_remove_filters() {\n\t// Normal filtering\n\tremove_filter('title_save_pre', 'wp_filter_kses');\n\n\t// Comment filtering\n\tremove_filter( 'pre_comment_content', 'wp_filter_post_kses' );\n\tremove_filter( 'pre_comment_content', 'wp_filter_kses' );\n\n\t// Post filtering\n\tremove_filter('content_save_pre', 'wp_filter_post_kses');\n\tremove_filter('excerpt_save_pre', 'wp_filter_post_kses');\n\tremove_filter('content_filtered_save_pre', 'wp_filter_post_kses');\n}\n\n/**\n * Sets up most of the Kses filters for input form content.\n *\n * If you remove the kses_init() function from 'init' hook and\n * 'set_current_user' (priority is default), then none of the Kses filter hooks\n * will be added.\n *\n * First removes all of the Kses filters in case the current user does not need\n * to have Kses filter the content. If the user does not have unfiltered_html\n * capability, then Kses filters are added.\n *\n * @since 2.0.0\n */\nfunction kses_init() {\n\tkses_remove_filters();\n\n\tif ( ! current_user_can( 'unfiltered_html' ) ) {\n\t\tkses_init_filters();\n\t}\n}\n\n/**\n * Inline CSS filter\n *\n * @since 2.8.1\n */\nfunction safecss_filter_attr( $css, $deprecated = '' ) {\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.8.1' ); // Never implemented\n\n\t$css = wp_kses_no_null($css);\n\t$css = str_replace(array(\"\\n\",\"\\r\",\"\\t\"), '', $css);\n\n\tif ( preg_match( '%[\\\\\\\\(&=}]|/\\*%', $css ) ) // remove any inline css containing \\ ( & } = or comments\n\t\treturn '';\n\n\t$css_array = explode( ';', trim( $css ) );\n\n\t/**\n\t * Filter list of allowed CSS attributes.\n\t *\n\t * @since 2.8.1\n\t *\n\t * @param array $attr List of allowed CSS attributes.\n\t */\n\t$allowed_attr = apply_filters( 'safe_style_css', array( 'text-align', 'margin', 'color', 'float',\n\t'border', 'background', 'background-color', 'border-bottom', 'border-bottom-color',\n\t'border-bottom-style', 'border-bottom-width', 'border-collapse', 'border-color', 'border-left',\n\t'border-left-color', 'border-left-style', 'border-left-width', 'border-right', 'border-right-color',\n\t'border-right-style', 'border-right-width', 'border-spacing', 'border-style', 'border-top',\n\t'border-top-color', 'border-top-style', 'border-top-width', 'border-width', 'caption-side',\n\t'clear', 'cursor', 'direction', 'font', 'font-family', 'font-size', 'font-style',\n\t'font-variant', 'font-weight', 'height', 'min-height','max-height' , 'letter-spacing', 'line-height', 'margin-bottom',\n\t'margin-left', 'margin-right', 'margin-top', 'overflow', 'padding', 'padding-bottom',\n\t'padding-left', 'padding-right', 'padding-top', 'text-decoration', 'text-indent', 'vertical-align',\n\t'width', 'min-width', 'max-width' ) );\n\n\tif ( empty($allowed_attr) )\n\t\treturn $css;\n\n\t$css = '';\n\tforeach ( $css_array as $css_item ) {\n\t\tif ( $css_item == '' )\n\t\t\tcontinue;\n\t\t$css_item = trim( $css_item );\n\t\t$found = false;\n\t\tif ( strpos( $css_item, ':' ) === false ) {\n\t\t\t$found = true;\n\t\t} else {\n\t\t\t$parts = explode( ':', $css_item );\n\t\t\tif ( in_array( trim( $parts[0] ), $allowed_attr ) )\n\t\t\t\t$found = true;\n\t\t}\n\t\tif ( $found ) {\n\t\t\tif( $css != '' )\n\t\t\t\t$css .= ';';\n\t\t\t$css .= $css_item;\n\t\t}\n\t}\n\n\treturn $css;\n}\n\n/**\n * Helper function to add global attributes to a tag in the allowed html list.\n *\n * @since 3.5.0\n * @access private\n *\n * @param array $value An array of attributes.\n * @return array The array of attributes with global attributes added.\n */\nfunction _wp_add_global_attributes( $value ) {\n\t$global_attributes = array(\n\t\t'class' => true,\n\t\t'id' => true,\n\t\t'style' => true,\n\t\t'title' => true,\n\t\t'role' => true,\n\t);\n\n\tif ( true === $value )\n\t\t$value = array();\n\n\tif ( is_array( $value ) )\n\t\treturn array_merge( $value, $global_attributes );\n\n\treturn $value;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/l10n.php",
    "content": "<?php\n/**\n * Core Translation API\n *\n * @package WordPress\n * @subpackage i18n\n * @since 1.2.0\n */\n\n/**\n * Retrieves the current locale.\n *\n * If the locale is set, then it will filter the locale in the {@see 'locale'}\n * filter hook and return the value.\n *\n * If the locale is not set already, then the WPLANG constant is used if it is\n * defined. Then it is filtered through the {@see 'locale'} filter hook and\n * the value for the locale global set and the locale is returned.\n *\n * The process to get the locale should only be done once, but the locale will\n * always be filtered using the {@see 'locale'} hook.\n *\n * @since 1.5.0\n *\n * @global string $locale\n * @global string $wp_local_package\n *\n * @return string The locale of the blog or from the {@see 'locale'} hook.\n */\nfunction get_locale() {\n\tglobal $locale, $wp_local_package;\n\n\tif ( isset( $locale ) ) {\n\t\t/**\n\t\t * Filter WordPress install's locale ID.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param string $locale The locale ID.\n\t\t */\n\t\treturn apply_filters( 'locale', $locale );\n\t}\n\n\tif ( isset( $wp_local_package ) ) {\n\t\t$locale = $wp_local_package;\n\t}\n\n\t// WPLANG was defined in wp-config.\n\tif ( defined( 'WPLANG' ) ) {\n\t\t$locale = WPLANG;\n\t}\n\n\t// If multisite, check options.\n\tif ( is_multisite() ) {\n\t\t// Don't check blog option when installing.\n\t\tif ( wp_installing() || ( false === $ms_locale = get_option( 'WPLANG' ) ) ) {\n\t\t\t$ms_locale = get_site_option( 'WPLANG' );\n\t\t}\n\n\t\tif ( $ms_locale !== false ) {\n\t\t\t$locale = $ms_locale;\n\t\t}\n\t} else {\n\t\t$db_locale = get_option( 'WPLANG' );\n\t\tif ( $db_locale !== false ) {\n\t\t\t$locale = $db_locale;\n\t\t}\n\t}\n\n\tif ( empty( $locale ) ) {\n\t\t$locale = 'en_US';\n\t}\n\n\t/** This filter is documented in wp-includes/l10n.php */\n\treturn apply_filters( 'locale', $locale );\n}\n\n/**\n * Retrieve the translation of $text.\n *\n * If there is no translation, or the text domain isn't loaded, the original text is returned.\n *\n * *Note:* Don't use translate() directly, use __() or related functions.\n *\n * @since 2.2.0\n *\n * @param string $text   Text to translate.\n * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.\n *                       Default 'default'.\n * @return string Translated text\n */\nfunction translate( $text, $domain = 'default' ) {\n\t$translations = get_translations_for_domain( $domain );\n\t$translations = $translations->translate( $text );\n\n\t/**\n\t * Filter text with its translation.\n\t *\n\t * @since 2.0.11\n\t *\n\t * @param string $translations Translated text.\n\t * @param string $text         Text to translate.\n\t * @param string $domain       Text domain. Unique identifier for retrieving translated strings.\n\t */\n\treturn apply_filters( 'gettext', $translations, $text, $domain );\n}\n\n/**\n * Remove last item on a pipe-delimited string.\n *\n * Meant for removing the last item in a string, such as 'Role name|User role'. The original\n * string will be returned if no pipe '|' characters are found in the string.\n *\n * @since 2.8.0\n *\n * @param string $string A pipe-delimited string.\n * @return string Either $string or everything before the last pipe.\n */\nfunction before_last_bar( $string ) {\n\t$last_bar = strrpos( $string, '|' );\n\tif ( false === $last_bar )\n\t\treturn $string;\n\telse\n\t\treturn substr( $string, 0, $last_bar );\n}\n\n/**\n * Retrieve the translation of $text in the context defined in $context.\n *\n * If there is no translation, or the text domain isn't loaded the original\n * text is returned.\n *\n * *Note:* Don't use translate_with_gettext_context() directly, use _x() or related functions.\n *\n * @since 2.8.0\n *\n * @param string $text    Text to translate.\n * @param string $context Context information for the translators.\n * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.\n *                        Default 'default'.\n * @return string Translated text on success, original text on failure.\n */\nfunction translate_with_gettext_context( $text, $context, $domain = 'default' ) {\n\t$translations = get_translations_for_domain( $domain );\n\t$translations = $translations->translate( $text, $context );\n\t/**\n\t * Filter text with its translation based on context information.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $translations Translated text.\n\t * @param string $text         Text to translate.\n\t * @param string $context      Context information for the translators.\n\t * @param string $domain       Text domain. Unique identifier for retrieving translated strings.\n\t */\n\treturn apply_filters( 'gettext_with_context', $translations, $text, $context, $domain );\n}\n\n/**\n * Retrieve the translation of $text.\n *\n * If there is no translation, or the text domain isn't loaded, the original text is returned.\n *\n * @since 2.1.0\n *\n * @param string $text   Text to translate.\n * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.\n *                       Default 'default'.\n * @return string Translated text.\n */\nfunction __( $text, $domain = 'default' ) {\n\treturn translate( $text, $domain );\n}\n\n/**\n * Retrieve the translation of $text and escapes it for safe use in an attribute.\n *\n * If there is no translation, or the text domain isn't loaded, the original text is returned.\n *\n * @since 2.8.0\n *\n * @param string $text   Text to translate.\n * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.\n *                       Default 'default'.\n * @return string Translated text on success, original text on failure.\n */\nfunction esc_attr__( $text, $domain = 'default' ) {\n\treturn esc_attr( translate( $text, $domain ) );\n}\n\n/**\n * Retrieve the translation of $text and escapes it for safe use in HTML output.\n *\n * If there is no translation, or the text domain isn't loaded, the original text is returned.\n *\n * @since 2.8.0\n *\n * @param string $text   Text to translate.\n * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.\n *                       Default 'default'.\n * @return string Translated text\n */\nfunction esc_html__( $text, $domain = 'default' ) {\n\treturn esc_html( translate( $text, $domain ) );\n}\n\n/**\n * Display translated text.\n *\n * @since 1.2.0\n *\n * @param string $text   Text to translate.\n * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.\n *                       Default 'default'.\n */\nfunction _e( $text, $domain = 'default' ) {\n\techo translate( $text, $domain );\n}\n\n/**\n * Display translated text that has been escaped for safe use in an attribute.\n *\n * @since 2.8.0\n *\n * @param string $text   Text to translate.\n * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.\n *                       Default 'default'.\n */\nfunction esc_attr_e( $text, $domain = 'default' ) {\n\techo esc_attr( translate( $text, $domain ) );\n}\n\n/**\n * Display translated text that has been escaped for safe use in HTML output.\n *\n * @since 2.8.0\n *\n * @param string $text   Text to translate.\n * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.\n *                       Default 'default'.\n */\nfunction esc_html_e( $text, $domain = 'default' ) {\n\techo esc_html( translate( $text, $domain ) );\n}\n\n/**\n * Retrieve translated string with gettext context.\n *\n * Quite a few times, there will be collisions with similar translatable text\n * found in more than two places, but with different translated context.\n *\n * By including the context in the pot file, translators can translate the two\n * strings differently.\n *\n * @since 2.8.0\n *\n * @param string $text    Text to translate.\n * @param string $context Context information for the translators.\n * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.\n *                        Default 'default'.\n * @return string Translated context string without pipe.\n */\nfunction _x( $text, $context, $domain = 'default' ) {\n\treturn translate_with_gettext_context( $text, $context, $domain );\n}\n\n/**\n * Display translated string with gettext context.\n *\n * @since 3.0.0\n *\n * @param string $text    Text to translate.\n * @param string $context Context information for the translators.\n * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.\n *                        Default 'default'.\n * @return string Translated context string without pipe.\n */\nfunction _ex( $text, $context, $domain = 'default' ) {\n\techo _x( $text, $context, $domain );\n}\n\n/**\n * Translate string with gettext context, and escapes it for safe use in an attribute.\n *\n * @since 2.8.0\n *\n * @param string $text    Text to translate.\n * @param string $context Context information for the translators.\n * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.\n *                        Default 'default'.\n * @return string Translated text\n */\nfunction esc_attr_x( $text, $context, $domain = 'default' ) {\n\treturn esc_attr( translate_with_gettext_context( $text, $context, $domain ) );\n}\n\n/**\n * Translate string with gettext context, and escapes it for safe use in HTML output.\n *\n * @since 2.9.0\n *\n * @param string $text    Text to translate.\n * @param string $context Context information for the translators.\n * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.\n *                        Default 'default'.\n * @return string Translated text.\n */\nfunction esc_html_x( $text, $context, $domain = 'default' ) {\n\treturn esc_html( translate_with_gettext_context( $text, $context, $domain ) );\n}\n\n/**\n * Translates and retrieves the singular or plural form based on the supplied number.\n *\n * Used when you want to use the appropriate form of a string based on whether a\n * number is singular or plural.\n *\n * Example:\n *\n *     $people = sprintf( _n( '%s person', '%s people', $count, 'text-domain' ), number_format_i18n( $count ) );\n *\n * @since 2.8.0\n *\n * @param string $single The text to be used if the number is singular.\n * @param string $plural The text to be used if the number is plural.\n * @param int    $number The number to compare against to use either the singular or plural form.\n * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings.\n *                       Default 'default'.\n * @return string The translated singular or plural form.\n */\nfunction _n( $single, $plural, $number, $domain = 'default' ) {\n\t$translations = get_translations_for_domain( $domain );\n\t$translation = $translations->translate_plural( $single, $plural, $number );\n\n\t/**\n\t * Filter the singular or plural form of a string.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param string $translation Translated text.\n\t * @param string $single      The text to be used if the number is singular.\n\t * @param string $plural      The text to be used if the number is plural.\n\t * @param string $number      The number to compare against to use either the singular or plural form.\n\t * @param string $domain      Text domain. Unique identifier for retrieving translated strings.\n\t */\n\treturn apply_filters( 'ngettext', $translation, $single, $plural, $number, $domain );\n}\n\n/**\n * Translates and retrieves the singular or plural form based on the supplied number, with gettext context.\n *\n * This is a hybrid of _n() and _x(). It supports context and plurals.\n *\n * Used when you want to use the appropriate form of a string with context based on whether a\n * number is singular or plural.\n *\n * Example:\n *\n *     $people = sprintf( _n( '%s person', '%s people', $count, 'context', 'text-domain' ), number_format_i18n( $count ) );\n *\n * @since 2.8.0\n *\n * @param string $single  The text to be used if the number is singular.\n * @param string $plural  The text to be used if the number is plural.\n * @param int    $number  The number to compare against to use either the singular or plural form.\n * @param string $context Context information for the translators.\n * @param string $domain  Optional. Text domain. Unique identifier for retrieving translated strings.\n *                        Default 'default'.\n * @return string The translated singular or plural form.\n */\nfunction _nx($single, $plural, $number, $context, $domain = 'default') {\n\t$translations = get_translations_for_domain( $domain );\n\t$translation = $translations->translate_plural( $single, $plural, $number, $context );\n\n\t/**\n\t * Filter the singular or plural form of a string with gettext context.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $translation Translated text.\n\t * @param string $single      The text to be used if the number is singular.\n\t * @param string $plural      The text to be used if the number is plural.\n\t * @param string $number      The number to compare against to use either the singular or plural form.\n\t * @param string $context     Context information for the translators.\n\t * @param string $domain      Text domain. Unique identifier for retrieving translated strings.\n\t */\n\treturn apply_filters( 'ngettext_with_context', $translation, $single, $plural, $number, $context, $domain );\n}\n\n/**\n * Registers plural strings in POT file, but don't translate them.\n *\n * Used when you want to keep structures with translatable plural\n * strings and use them later when the number is known.\n *\n * Example:\n *\n *     $messages = array(\n *      \t'post' => _n_noop( '%s post', '%s posts', 'text-domain' ),\n *      \t'page' => _n_noop( '%s pages', '%s pages', 'text-domain' ),\n *     );\n *     ...\n *     $message = $messages[ $type ];\n *     $usable_text = sprintf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) );\n *\n * @since 2.5.0\n *\n * @param string $singular Singular form to be localized.\n * @param string $plural   Plural form to be localized.\n * @param string $domain   Optional. Text domain. Unique identifier for retrieving translated strings.\n *                         Default null.\n * @return array {\n *     Array of translation information for the strings.\n *\n *     @type string $0        Singular form to be localized. No longer used.\n *     @type string $1        Plural form to be localized. No longer used.\n *     @type string $singular Singular form to be localized.\n *     @type string $plural   Plural form to be localized.\n *     @type null   $context  Context information for the translators.\n *     @type string $domain   Text domain.\n * }\n */\nfunction _n_noop( $singular, $plural, $domain = null ) {\n\treturn array( 0 => $singular, 1 => $plural, 'singular' => $singular, 'plural' => $plural, 'context' => null, 'domain' => $domain );\n}\n\n/**\n * Register plural strings with gettext context in the POT file, but don't translate them.\n *\n * Used when you want to keep structures with translatable plural\n * strings and use them later when the number is known.\n *\n * Example:\n *\n *     $messages = array(\n *      \t'post' => _n_noop( '%s post', '%s posts', 'context', 'text-domain' ),\n *      \t'page' => _n_noop( '%s pages', '%s pages', 'context', 'text-domain' ),\n *     );\n *     ...\n *     $message = $messages[ $type ];\n *     $usable_text = sprintf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) );\n *\n * @since 2.8.0\n *\n * @param string $singular Singular form to be localized.\n * @param string $plural   Plural form to be localized.\n * @param string $domain   Optional. Text domain. Unique identifier for retrieving translated strings.\n *                         Default null.\n * @return array {\n *     Array of translation information for the strings.\n *\n *     @type string $0        Singular form to be localized. No longer used.\n *     @type string $1        Plural form to be localized. No longer used.\n *     @type string $2        Context information for the translators. No longer used.\n *     @type string $singular Singular form to be localized.\n *     @type string $plural   Plural form to be localized.\n *     @type string $context  Context information for the translators.\n *     @type string $domain   Text domain.\n * }\n */\nfunction _nx_noop( $singular, $plural, $context, $domain = null ) {\n\treturn array( 0 => $singular, 1 => $plural, 2 => $context, 'singular' => $singular, 'plural' => $plural, 'context' => $context, 'domain' => $domain );\n}\n\n/**\n * Translates and retrieves the singular or plural form of a string that's been registered\n * with _n_noop() or _nx_noop().\n *\n * Used when you want to use a translatable plural string once the number is known.\n *\n * Example:\n *\n *     $messages = array(\n *      \t'post' => _n_noop( '%s post', '%s posts', 'text-domain' ),\n *      \t'page' => _n_noop( '%s pages', '%s pages', 'text-domain' ),\n *     );\n *     ...\n *     $message = $messages[ $type ];\n *     $usable_text = sprintf( translate_nooped_plural( $message, $count, 'text-domain' ), number_format_i18n( $count ) );\n *\n * @since 3.1.0\n *\n * @param array  $nooped_plural Array with singular, plural, and context keys, usually the result of _n_noop() or _nx_noop().\n * @param int    $count         Number of objects.\n * @param string $domain        Optional. Text domain. Unique identifier for retrieving translated strings. If $nooped_plural contains\n *                              a text domain passed to _n_noop() or _nx_noop(), it will override this value. Default 'default'.\n * @return string Either $single or $plural translated text.\n */\nfunction translate_nooped_plural( $nooped_plural, $count, $domain = 'default' ) {\n\tif ( $nooped_plural['domain'] )\n\t\t$domain = $nooped_plural['domain'];\n\n\tif ( $nooped_plural['context'] )\n\t\treturn _nx( $nooped_plural['singular'], $nooped_plural['plural'], $count, $nooped_plural['context'], $domain );\n\telse\n\t\treturn _n( $nooped_plural['singular'], $nooped_plural['plural'], $count, $domain );\n}\n\n/**\n * Load a .mo file into the text domain $domain.\n *\n * If the text domain already exists, the translations will be merged. If both\n * sets have the same string, the translation from the original value will be taken.\n *\n * On success, the .mo file will be placed in the $l10n global by $domain\n * and will be a MO object.\n *\n * @since 1.5.0\n *\n * @global array $l10n\n *\n * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n * @param string $mofile Path to the .mo file.\n * @return bool True on success, false on failure.\n */\nfunction load_textdomain( $domain, $mofile ) {\n\tglobal $l10n;\n\n\t/**\n\t * Filter text domain and/or MO file path for loading translations.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param bool   $override Whether to override the text domain. Default false.\n\t * @param string $domain   Text domain. Unique identifier for retrieving translated strings.\n\t * @param string $mofile   Path to the MO file.\n\t */\n\t$plugin_override = apply_filters( 'override_load_textdomain', false, $domain, $mofile );\n\n\tif ( true == $plugin_override ) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * Fires before the MO translation file is loaded.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n\t * @param string $mofile Path to the .mo file.\n\t */\n\tdo_action( 'load_textdomain', $domain, $mofile );\n\n\t/**\n\t * Filter MO file path for loading translations for a specific text domain.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $mofile Path to the MO file.\n\t * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n\t */\n\t$mofile = apply_filters( 'load_textdomain_mofile', $mofile, $domain );\n\n\tif ( !is_readable( $mofile ) ) return false;\n\n\t$mo = new MO();\n\tif ( !$mo->import_from_file( $mofile ) ) return false;\n\n\tif ( isset( $l10n[$domain] ) )\n\t\t$mo->merge_with( $l10n[$domain] );\n\n\t$l10n[$domain] = &$mo;\n\n\treturn true;\n}\n\n/**\n * Unload translations for a text domain.\n *\n * @since 3.0.0\n *\n * @global array $l10n\n *\n * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n * @return bool Whether textdomain was unloaded.\n */\nfunction unload_textdomain( $domain ) {\n\tglobal $l10n;\n\n\t/**\n\t * Filter the text domain for loading translation.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param bool   $override Whether to override unloading the text domain. Default false.\n\t * @param string $domain   Text domain. Unique identifier for retrieving translated strings.\n\t */\n\t$plugin_override = apply_filters( 'override_unload_textdomain', false, $domain );\n\n\tif ( $plugin_override )\n\t\treturn true;\n\n\t/**\n\t * Fires before the text domain is unloaded.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n\t */\n\tdo_action( 'unload_textdomain', $domain );\n\n\tif ( isset( $l10n[$domain] ) ) {\n\t\tunset( $l10n[$domain] );\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Load default translated strings based on locale.\n *\n * Loads the .mo file in WP_LANG_DIR constant path from WordPress root.\n * The translated (.mo) file is named based on the locale.\n *\n * @see load_textdomain()\n *\n * @since 1.5.0\n *\n * @param string $locale Optional. Locale to load. Default is the value of {@see get_locale()}.\n * @return bool Whether the textdomain was loaded.\n */\nfunction load_default_textdomain( $locale = null ) {\n\tif ( null === $locale ) {\n\t\t$locale = get_locale();\n\t}\n\n\t// Unload previously loaded strings so we can switch translations.\n\tunload_textdomain( 'default' );\n\n\t$return = load_textdomain( 'default', WP_LANG_DIR . \"/$locale.mo\" );\n\n\tif ( ( is_multisite() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) ) && ! file_exists(  WP_LANG_DIR . \"/admin-$locale.mo\" ) ) {\n\t\tload_textdomain( 'default', WP_LANG_DIR . \"/ms-$locale.mo\" );\n\t\treturn $return;\n\t}\n\n\tif ( is_admin() || wp_installing() || ( defined( 'WP_REPAIRING' ) && WP_REPAIRING ) ) {\n\t\tload_textdomain( 'default', WP_LANG_DIR . \"/admin-$locale.mo\" );\n\t}\n\n\tif ( is_network_admin() || ( defined( 'WP_INSTALLING_NETWORK' ) && WP_INSTALLING_NETWORK ) )\n\t\tload_textdomain( 'default', WP_LANG_DIR . \"/admin-network-$locale.mo\" );\n\n\treturn $return;\n}\n\n/**\n * Load a plugin's translated strings.\n *\n * If the path is not given then it will be the root of the plugin directory.\n *\n * The .mo file should be named based on the text domain with a dash, and then the locale exactly.\n *\n * @since 1.5.0\n *\n * @param string $domain          Unique identifier for retrieving translated strings\n * @param string $deprecated      Use the $plugin_rel_path parameter instead.\n * @param string $plugin_rel_path Optional. Relative path to WP_PLUGIN_DIR where the .mo file resides.\n *                                Default false.\n * @return bool True when textdomain is successfully loaded, false otherwise.\n */\nfunction load_plugin_textdomain( $domain, $deprecated = false, $plugin_rel_path = false ) {\n\t$locale = get_locale();\n\t/**\n\t * Filter a plugin's locale.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $locale The plugin's current locale.\n\t * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n\t */\n\t$locale = apply_filters( 'plugin_locale', $locale, $domain );\n\n\tif ( false !== $plugin_rel_path\t) {\n\t\t$path = WP_PLUGIN_DIR . '/' . trim( $plugin_rel_path, '/' );\n\t} elseif ( false !== $deprecated ) {\n\t\t_deprecated_argument( __FUNCTION__, '2.7' );\n\t\t$path = ABSPATH . trim( $deprecated, '/' );\n\t} else {\n\t\t$path = WP_PLUGIN_DIR;\n\t}\n\n\t// Load the textdomain according to the plugin first\n\t$mofile = $domain . '-' . $locale . '.mo';\n\tif ( $loaded = load_textdomain( $domain, $path . '/'. $mofile ) )\n\t\treturn $loaded;\n\n\t// Otherwise, load from the languages directory\n\t$mofile = WP_LANG_DIR . '/plugins/' . $mofile;\n\treturn load_textdomain( $domain, $mofile );\n}\n\n/**\n * Load the translated strings for a plugin residing in the mu-plugins directory.\n *\n * @since 3.0.0\n *\n * @param string $domain             Text domain. Unique identifier for retrieving translated strings.\n * @param string $mu_plugin_rel_path Relative to WPMU_PLUGIN_DIR directory in which the .mo file resides.\n *                                   Default empty string.\n * @return bool True when textdomain is successfully loaded, false otherwise.\n */\nfunction load_muplugin_textdomain( $domain, $mu_plugin_rel_path = '' ) {\n\t/** This filter is documented in wp-includes/l10n.php */\n\t$locale = apply_filters( 'plugin_locale', get_locale(), $domain );\n\t$path = trailingslashit( WPMU_PLUGIN_DIR . '/' . ltrim( $mu_plugin_rel_path, '/' ) );\n\n\t// Load the textdomain according to the plugin first\n\t$mofile = $domain . '-' . $locale . '.mo';\n\tif ( $loaded = load_textdomain( $domain, $path . $mofile ) )\n\t\treturn $loaded;\n\n\t// Otherwise, load from the languages directory\n\t$mofile = WP_LANG_DIR . '/plugins/' . $mofile;\n\treturn load_textdomain( $domain, $mofile );\n}\n\n/**\n * Load the theme's translated strings.\n *\n * If the current locale exists as a .mo file in the theme's root directory, it\n * will be included in the translated strings by the $domain.\n *\n * The .mo files must be named based on the locale exactly.\n *\n * @since 1.5.0\n *\n * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n * @param string $path   Optional. Path to the directory containing the .mo file.\n *                       Default false.\n * @return bool True when textdomain is successfully loaded, false otherwise.\n */\nfunction load_theme_textdomain( $domain, $path = false ) {\n\t$locale = get_locale();\n\t/**\n\t * Filter a theme's locale.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $locale The theme's current locale.\n\t * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n\t */\n\t$locale = apply_filters( 'theme_locale', $locale, $domain );\n\n\tif ( ! $path )\n\t\t$path = get_template_directory();\n\n\t// Load the textdomain according to the theme\n\t$mofile = untrailingslashit( $path ) . \"/{$locale}.mo\";\n\tif ( $loaded = load_textdomain( $domain, $mofile ) )\n\t\treturn $loaded;\n\n\t// Otherwise, load from the languages directory\n\t$mofile = WP_LANG_DIR . \"/themes/{$domain}-{$locale}.mo\";\n\treturn load_textdomain( $domain, $mofile );\n}\n\n/**\n * Load the child themes translated strings.\n *\n * If the current locale exists as a .mo file in the child themes\n * root directory, it will be included in the translated strings by the $domain.\n *\n * The .mo files must be named based on the locale exactly.\n *\n * @since 2.9.0\n *\n * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n * @param string $path   Optional. Path to the directory containing the .mo file.\n *                       Default false.\n * @return bool True when the theme textdomain is successfully loaded, false otherwise.\n */\nfunction load_child_theme_textdomain( $domain, $path = false ) {\n\tif ( ! $path )\n\t\t$path = get_stylesheet_directory();\n\treturn load_theme_textdomain( $domain, $path );\n}\n\n/**\n * Return the Translations instance for a text domain.\n *\n * If there isn't one, returns empty Translations instance.\n *\n * @since 2.8.0\n *\n * @global array $l10n\n *\n * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n * @return NOOP_Translations A Translations instance.\n */\nfunction get_translations_for_domain( $domain ) {\n\tglobal $l10n;\n\tif ( !isset( $l10n[$domain] ) ) {\n\t\t$l10n[$domain] = new NOOP_Translations;\n\t}\n\treturn $l10n[$domain];\n}\n\n/**\n * Whether there are translations for the text domain.\n *\n * @since 3.0.0\n *\n * @global array $l10n\n *\n * @param string $domain Text domain. Unique identifier for retrieving translated strings.\n * @return bool Whether there are translations.\n */\nfunction is_textdomain_loaded( $domain ) {\n\tglobal $l10n;\n\treturn isset( $l10n[$domain] );\n}\n\n/**\n * Translates role name.\n *\n * Since the role names are in the database and not in the source there\n * are dummy gettext calls to get them into the POT file and this function\n * properly translates them back.\n *\n * The before_last_bar() call is needed, because older installs keep the roles\n * using the old context format: 'Role name|User role' and just skipping the\n * content after the last bar is easier than fixing them in the DB. New installs\n * won't suffer from that problem.\n *\n * @since 2.8.0\n *\n * @param string $name The role name.\n * @return string Translated role name on success, original name on failure.\n */\nfunction translate_user_role( $name ) {\n\treturn translate_with_gettext_context( before_last_bar($name), 'User role' );\n}\n\n/**\n * Get all available languages based on the presence of *.mo files in a given directory.\n *\n * The default directory is WP_LANG_DIR.\n *\n * @since 3.0.0\n *\n * @param string $dir A directory to search for language files.\n *                    Default WP_LANG_DIR.\n * @return array An array of language codes or an empty array if no languages are present. Language codes are formed by stripping the .mo extension from the language file names.\n */\nfunction get_available_languages( $dir = null ) {\n\t$languages = array();\n\n\t$lang_files = glob( ( is_null( $dir) ? WP_LANG_DIR : $dir ) . '/*.mo' );\n\tif ( $lang_files ) {\n\t\tforeach ( $lang_files as $lang_file ) {\n\t\t\t$lang_file = basename( $lang_file, '.mo' );\n\t\t\tif ( 0 !== strpos( $lang_file, 'continents-cities' ) && 0 !== strpos( $lang_file, 'ms-' ) &&\n\t\t\t\t0 !== strpos( $lang_file, 'admin-' ) ) {\n\t\t\t\t$languages[] = $lang_file;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $languages;\n}\n\n/**\n * Get installed translations.\n *\n * Looks in the wp-content/languages directory for translations of\n * plugins or themes.\n *\n * @since 3.7.0\n *\n * @param string $type What to search for. Accepts 'plugins', 'themes', 'core'.\n * @return array Array of language data.\n */\nfunction wp_get_installed_translations( $type ) {\n\tif ( $type !== 'themes' && $type !== 'plugins' && $type !== 'core' )\n\t\treturn array();\n\n\t$dir = 'core' === $type ? '' : \"/$type\";\n\n\tif ( ! is_dir( WP_LANG_DIR ) )\n\t\treturn array();\n\n\tif ( $dir && ! is_dir( WP_LANG_DIR . $dir ) )\n\t\treturn array();\n\n\t$files = scandir( WP_LANG_DIR . $dir );\n\tif ( ! $files )\n\t\treturn array();\n\n\t$language_data = array();\n\n\tforeach ( $files as $file ) {\n\t\tif ( '.' === $file[0] || is_dir( $file ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( substr( $file, -3 ) !== '.po' ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( ! preg_match( '/(?:(.+)-)?([a-z]{2,3}(?:_[A-Z]{2})?(?:_[a-z0-9]+)?).po/', $file, $match ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( ! in_array( substr( $file, 0, -3 ) . '.mo', $files ) )  {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlist( , $textdomain, $language ) = $match;\n\t\tif ( '' === $textdomain ) {\n\t\t\t$textdomain = 'default';\n\t\t}\n\t\t$language_data[ $textdomain ][ $language ] = wp_get_pomo_file_data( WP_LANG_DIR . \"$dir/$file\" );\n\t}\n\treturn $language_data;\n}\n\n/**\n * Extract headers from a PO file.\n *\n * @since 3.7.0\n *\n * @param string $po_file Path to PO file.\n * @return array PO file headers.\n */\nfunction wp_get_pomo_file_data( $po_file ) {\n\t$headers = get_file_data( $po_file, array(\n\t\t'POT-Creation-Date'  => '\"POT-Creation-Date',\n\t\t'PO-Revision-Date'   => '\"PO-Revision-Date',\n\t\t'Project-Id-Version' => '\"Project-Id-Version',\n\t\t'X-Generator'        => '\"X-Generator',\n\t) );\n\tforeach ( $headers as $header => $value ) {\n\t\t// Remove possible contextual '\\n' and closing double quote.\n\t\t$headers[ $header ] = preg_replace( '~(\\\\\\n)?\"$~', '', $value );\n\t}\n\treturn $headers;\n}\n\n/**\n * Language selector.\n *\n * @since 4.0.0\n * @since 4.3.0 Introduced the `echo` argument.\n *\n * @see get_available_languages()\n * @see wp_get_available_translations()\n *\n * @param string|array $args {\n *     Optional. Array or string of arguments for outputting the language selector.\n *\n *     @type string   $id                           ID attribute of the select element. Default empty.\n *     @type string   $name                         Name attribute of the select element. Default empty.\n *     @type array    $languages                    List of installed languages, contain only the locales.\n *                                                  Default empty array.\n *     @type array    $translations                 List of available translations. Default result of\n *                                                  wp_get_available_translations().\n *     @type string   $selected                     Language which should be selected. Default empty.\n *     @type bool|int $echo                         Whether to echo or return the generated markup. Accepts 0, 1, or their\n *                                                  bool equivalents. Default 1.\n *     @type bool     $show_available_translations  Whether to show available translations. Default true.\n * }\n * @return string HTML content only if 'echo' argument is 0.\n */\nfunction wp_dropdown_languages( $args = array() ) {\n\n\t$args = wp_parse_args( $args, array(\n\t\t'id'           => '',\n\t\t'name'         => '',\n\t\t'languages'    => array(),\n\t\t'translations' => array(),\n\t\t'selected'     => '',\n\t\t'echo'         => 1,\n\t\t'show_available_translations' => true,\n\t) );\n\n\t$translations = $args['translations'];\n\tif ( empty( $translations ) ) {\n\t\trequire_once( ABSPATH . 'wp-admin/includes/translation-install.php' );\n\t\t$translations = wp_get_available_translations();\n\t}\n\n\t/*\n\t * $args['languages'] should only contain the locales. Find the locale in\n\t * $translations to get the native name. Fall back to locale.\n\t */\n\t$languages = array();\n\tforeach ( $args['languages'] as $locale ) {\n\t\tif ( isset( $translations[ $locale ] ) ) {\n\t\t\t$translation = $translations[ $locale ];\n\t\t\t$languages[] = array(\n\t\t\t\t'language'    => $translation['language'],\n\t\t\t\t'native_name' => $translation['native_name'],\n\t\t\t\t'lang'        => current( $translation['iso'] ),\n\t\t\t);\n\n\t\t\t// Remove installed language from available translations.\n\t\t\tunset( $translations[ $locale ] );\n\t\t} else {\n\t\t\t$languages[] = array(\n\t\t\t\t'language'    => $locale,\n\t\t\t\t'native_name' => $locale,\n\t\t\t\t'lang'        => '',\n\t\t\t);\n\t\t}\n\t}\n\n\t$translations_available = ( ! empty( $translations ) && $args['show_available_translations'] );\n\n\t$output = sprintf( '<select name=\"%s\" id=\"%s\">', esc_attr( $args['name'] ), esc_attr( $args['id'] ) );\n\n\t// Holds the HTML markup.\n\t$structure = array();\n\n\t// List installed languages.\n\tif ( $translations_available ) {\n\t\t$structure[] = '<optgroup label=\"' . esc_attr_x( 'Installed', 'translations' ) . '\">';\n\t}\n\t$structure[] = '<option value=\"\" lang=\"en\" data-installed=\"1\">English (United States)</option>';\n\tforeach ( $languages as $language ) {\n\t\t$structure[] = sprintf(\n\t\t\t'<option value=\"%s\" lang=\"%s\"%s data-installed=\"1\">%s</option>',\n\t\t\tesc_attr( $language['language'] ),\n\t\t\tesc_attr( $language['lang'] ),\n\t\t\tselected( $language['language'], $args['selected'], false ),\n\t\t\tesc_html( $language['native_name'] )\n\t\t);\n\t}\n\tif ( $translations_available ) {\n\t\t$structure[] = '</optgroup>';\n\t}\n\n\t// List available translations.\n\tif ( $translations_available ) {\n\t\t$structure[] = '<optgroup label=\"' . esc_attr_x( 'Available', 'translations' ) . '\">';\n\t\tforeach ( $translations as $translation ) {\n\t\t\t$structure[] = sprintf(\n\t\t\t\t'<option value=\"%s\" lang=\"%s\"%s>%s</option>',\n\t\t\t\tesc_attr( $translation['language'] ),\n\t\t\t\tesc_attr( current( $translation['iso'] ) ),\n\t\t\t\tselected( $translation['language'], $args['selected'], false ),\n\t\t\t\tesc_html( $translation['native_name'] )\n\t\t\t);\n\t\t}\n\t\t$structure[] = '</optgroup>';\n\t}\n\n\t$output .= join( \"\\n\", $structure );\n\n\t$output .= '</select>';\n\n\tif ( $args['echo'] ) {\n\t\techo $output;\n\t}\n\n\treturn $output;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/link-template.php",
    "content": "<?php\n/**\n * WordPress Link Template Functions\n *\n * @package WordPress\n * @subpackage Template\n */\n\n/**\n * Display the permalink for the current post.\n *\n * @since 1.2.0\n * @since 4.4.0 Added the `$post` parameter.\n *\n * @param int|WP_Post $post Optional. Post ID or post object. Default is the global `$post`.\n */\nfunction the_permalink( $post = 0 ) {\n\t/**\n\t * Filter the display of the permalink for the current post.\n\t *\n\t * @since 1.5.0\n\t * @since 4.4.0 Added the `$post` parameter.\n\t *\n\t * @param string      $permalink The permalink for the current post.\n\t * @param int|WP_Post $post      Post ID, WP_Post object, or 0. Default 0.\n\t */\n\techo esc_url( apply_filters( 'the_permalink', get_permalink( $post ), $post ) );\n}\n\n/**\n * Retrieve trailing slash string, if blog set for adding trailing slashes.\n *\n * Conditionally adds a trailing slash if the permalink structure has a trailing\n * slash, strips the trailing slash if not. The string is passed through the\n * 'user_trailingslashit' filter. Will remove trailing slash from string, if\n * blog is not set to have them.\n *\n * @since 2.2.0\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $string URL with or without a trailing slash.\n * @param string $type_of_url The type of URL being considered (e.g. single, category, etc) for use in the filter.\n * @return string The URL with the trailing slash appended or stripped.\n */\nfunction user_trailingslashit($string, $type_of_url = '') {\n\tglobal $wp_rewrite;\n\tif ( $wp_rewrite->use_trailing_slashes )\n\t\t$string = trailingslashit($string);\n\telse\n\t\t$string = untrailingslashit($string);\n\n\t/**\n\t * Filter the trailing slashed string, depending on whether the site is set\n\t * to use training slashes.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param string $string      URL with or without a trailing slash.\n\t * @param string $type_of_url The type of URL being considered. Accepts 'single', 'single_trackback',\n\t *                            'single_feed', 'single_paged', 'feed', 'category', 'page', 'year',\n\t *                            'month', 'day', 'paged', 'post_type_archive'.\n\t */\n\treturn apply_filters( 'user_trailingslashit', $string, $type_of_url );\n}\n\n/**\n * Display permalink anchor for current post.\n *\n * The permalink mode title will use the post title for the 'a' element 'id'\n * attribute. The id mode uses 'post-' with the post ID for the 'id' attribute.\n *\n * @since 0.71\n *\n * @param string $mode Permalink mode can be either 'title', 'id', or default, which is 'id'.\n */\nfunction permalink_anchor( $mode = 'id' ) {\n\t$post = get_post();\n\tswitch ( strtolower( $mode ) ) {\n\t\tcase 'title':\n\t\t\t$title = sanitize_title( $post->post_title ) . '-' . $post->ID;\n\t\t\techo '<a id=\"'.$title.'\"></a>';\n\t\t\tbreak;\n\t\tcase 'id':\n\t\tdefault:\n\t\t\techo '<a id=\"post-' . $post->ID . '\"></a>';\n\t\t\tbreak;\n\t}\n}\n\n/**\n * Retrieve full permalink for current post or post ID.\n *\n * This function is an alias for get_permalink().\n *\n * @since 3.9.0\n *\n * @see get_permalink()\n *\n * @param int|WP_Post $post      Optional. Post ID or post object. Default is the global `$post`.\n * @param bool        $leavename Optional. Whether to keep post name or page name. Default false.\n *\n * @return string|false The permalink URL or false if post does not exist.\n */\nfunction get_the_permalink( $post = 0, $leavename = false ) {\n\treturn get_permalink( $post, $leavename );\n}\n\n/**\n * Retrieve full permalink for current post or post ID.\n *\n * @since 1.0.0\n *\n * @param int|WP_Post $post      Optional. Post ID or post object. Default is the global `$post`.\n * @param bool        $leavename Optional. Whether to keep post name or page name. Default false.\n * @return string|false The permalink URL or false if post does not exist.\n */\nfunction get_permalink( $post = 0, $leavename = false ) {\n\t$rewritecode = array(\n\t\t'%year%',\n\t\t'%monthnum%',\n\t\t'%day%',\n\t\t'%hour%',\n\t\t'%minute%',\n\t\t'%second%',\n\t\t$leavename? '' : '%postname%',\n\t\t'%post_id%',\n\t\t'%category%',\n\t\t'%author%',\n\t\t$leavename? '' : '%pagename%',\n\t);\n\n\tif ( is_object( $post ) && isset( $post->filter ) && 'sample' == $post->filter ) {\n\t\t$sample = true;\n\t} else {\n\t\t$post = get_post( $post );\n\t\t$sample = false;\n\t}\n\n\tif ( empty($post->ID) )\n\t\treturn false;\n\n\tif ( $post->post_type == 'page' )\n\t\treturn get_page_link($post, $leavename, $sample);\n\telseif ( $post->post_type == 'attachment' )\n\t\treturn get_attachment_link( $post, $leavename );\n\telseif ( in_array($post->post_type, get_post_types( array('_builtin' => false) ) ) )\n\t\treturn get_post_permalink($post, $leavename, $sample);\n\n\t$permalink = get_option('permalink_structure');\n\n\t/**\n\t * Filter the permalink structure for a post before token replacement occurs.\n\t *\n\t * Only applies to posts with post_type of 'post'.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string  $permalink The site's permalink structure.\n\t * @param WP_Post $post      The post in question.\n\t * @param bool    $leavename Whether to keep the post name.\n\t */\n\t$permalink = apply_filters( 'pre_post_link', $permalink, $post, $leavename );\n\n\tif ( '' != $permalink && !in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft', 'future' ) ) ) {\n\t\t$unixtime = strtotime($post->post_date);\n\n\t\t$category = '';\n\t\tif ( strpos($permalink, '%category%') !== false ) {\n\t\t\t$cats = get_the_category($post->ID);\n\t\t\tif ( $cats ) {\n\t\t\t\tusort($cats, '_usort_terms_by_ID'); // order by ID\n\n\t\t\t\t/**\n\t\t\t\t * Filter the category that gets used in the %category% permalink token.\n\t\t\t\t *\n\t\t\t\t * @since 3.5.0\n\t\t\t\t *\n\t\t\t\t * @param stdClass $cat  The category to use in the permalink.\n\t\t\t\t * @param array    $cats Array of all categories associated with the post.\n\t\t\t\t * @param WP_Post  $post The post in question.\n\t\t\t\t */\n\t\t\t\t$category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post );\n\n\t\t\t\t$category_object = get_term( $category_object, 'category' );\n\t\t\t\t$category = $category_object->slug;\n\t\t\t\tif ( $parent = $category_object->parent )\n\t\t\t\t\t$category = get_category_parents($parent, false, '/', true) . $category;\n\t\t\t}\n\t\t\t// show default category in permalinks, without\n\t\t\t// having to assign it explicitly\n\t\t\tif ( empty($category) ) {\n\t\t\t\t$default_category = get_term( get_option( 'default_category' ), 'category' );\n\t\t\t\t$category = is_wp_error( $default_category ) ? '' : $default_category->slug;\n\t\t\t}\n\t\t}\n\n\t\t$author = '';\n\t\tif ( strpos($permalink, '%author%') !== false ) {\n\t\t\t$authordata = get_userdata($post->post_author);\n\t\t\t$author = $authordata->user_nicename;\n\t\t}\n\n\t\t$date = explode(\" \",date('Y m d H i s', $unixtime));\n\t\t$rewritereplace =\n\t\tarray(\n\t\t\t$date[0],\n\t\t\t$date[1],\n\t\t\t$date[2],\n\t\t\t$date[3],\n\t\t\t$date[4],\n\t\t\t$date[5],\n\t\t\t$post->post_name,\n\t\t\t$post->ID,\n\t\t\t$category,\n\t\t\t$author,\n\t\t\t$post->post_name,\n\t\t);\n\t\t$permalink = home_url( str_replace($rewritecode, $rewritereplace, $permalink) );\n\t\t$permalink = user_trailingslashit($permalink, 'single');\n\t} else { // if they're not using the fancy permalink option\n\t\t$permalink = home_url('?p=' . $post->ID);\n\t}\n\n\t/**\n\t * Filter the permalink for a post.\n\t *\n\t * Only applies to posts with post_type of 'post'.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string  $permalink The post's permalink.\n\t * @param WP_Post $post      The post in question.\n\t * @param bool    $leavename Whether to keep the post name.\n\t */\n\treturn apply_filters( 'post_link', $permalink, $post, $leavename );\n}\n\n/**\n * Retrieve the permalink for a post with a custom post type.\n *\n * @since 3.0.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param int $id         Optional. Post ID.\n * @param bool $leavename Optional, defaults to false. Whether to keep post name.\n * @param bool $sample    Optional, defaults to false. Is it a sample permalink.\n * @return string|WP_Error The post permalink.\n */\nfunction get_post_permalink( $id = 0, $leavename = false, $sample = false ) {\n\tglobal $wp_rewrite;\n\n\t$post = get_post($id);\n\n\tif ( is_wp_error( $post ) )\n\t\treturn $post;\n\n\t$post_link = $wp_rewrite->get_extra_permastruct($post->post_type);\n\n\t$slug = $post->post_name;\n\n\t$draft_or_pending = get_post_status( $id ) && in_array( get_post_status( $id ), array( 'draft', 'pending', 'auto-draft', 'future' ) );\n\n\t$post_type = get_post_type_object($post->post_type);\n\n\tif ( $post_type->hierarchical ) {\n\t\t$slug = get_page_uri( $id );\n\t}\n\n\tif ( !empty($post_link) && ( !$draft_or_pending || $sample ) ) {\n\t\tif ( ! $leavename ) {\n\t\t\t$post_link = str_replace(\"%$post->post_type%\", $slug, $post_link);\n\t\t}\n\t\t$post_link = home_url( user_trailingslashit($post_link) );\n\t} else {\n\t\tif ( $post_type->query_var && ( isset($post->post_status) && !$draft_or_pending ) )\n\t\t\t$post_link = add_query_arg($post_type->query_var, $slug, '');\n\t\telse\n\t\t\t$post_link = add_query_arg(array('post_type' => $post->post_type, 'p' => $post->ID), '');\n\t\t$post_link = home_url($post_link);\n\t}\n\n\t/**\n\t * Filter the permalink for a post with a custom post type.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string  $post_link The post's permalink.\n\t * @param WP_Post $post      The post in question.\n\t * @param bool    $leavename Whether to keep the post name.\n\t * @param bool    $sample    Is it a sample permalink.\n\t */\n\treturn apply_filters( 'post_type_link', $post_link, $post, $leavename, $sample );\n}\n\n/**\n * Retrieve the permalink for current page or page ID.\n *\n * Respects page_on_front. Use this one.\n *\n * @since 1.5.0\n *\n * @param int|object $post      Optional. Post ID or object.\n * @param bool       $leavename Optional, defaults to false. Whether to keep page name.\n * @param bool       $sample    Optional, defaults to false. Is it a sample permalink.\n * @return string The page permalink.\n */\nfunction get_page_link( $post = false, $leavename = false, $sample = false ) {\n\t$post = get_post( $post );\n\n\tif ( 'page' == get_option( 'show_on_front' ) && $post->ID == get_option( 'page_on_front' ) )\n\t\t$link = home_url('/');\n\telse\n\t\t$link = _get_page_link( $post, $leavename, $sample );\n\n\t/**\n\t * Filter the permalink for a page.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $link    The page's permalink.\n\t * @param int    $post_id The ID of the page.\n\t * @param bool   $sample  Is it a sample permalink.\n\t */\n\treturn apply_filters( 'page_link', $link, $post->ID, $sample );\n}\n\n/**\n * Retrieve the page permalink.\n *\n * Ignores page_on_front. Internal use only.\n *\n * @since 2.1.0\n * @access private\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param int|object $post      Optional. Post ID or object.\n * @param bool       $leavename Optional. Leave name.\n * @param bool       $sample    Optional. Sample permalink.\n * @return string The page permalink.\n */\nfunction _get_page_link( $post = false, $leavename = false, $sample = false ) {\n\tglobal $wp_rewrite;\n\n\t$post = get_post( $post );\n\n\t$draft_or_pending = in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft' ) );\n\n\t$link = $wp_rewrite->get_page_permastruct();\n\n\tif ( !empty($link) && ( ( isset($post->post_status) && !$draft_or_pending ) || $sample ) ) {\n\t\tif ( ! $leavename ) {\n\t\t\t$link = str_replace('%pagename%', get_page_uri( $post ), $link);\n\t\t}\n\n\t\t$link = home_url($link);\n\t\t$link = user_trailingslashit($link, 'page');\n\t} else {\n\t\t$link = home_url( '?page_id=' . $post->ID );\n\t}\n\n\t/**\n\t * Filter the permalink for a non-page_on_front page.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $link    The page's permalink.\n\t * @param int    $post_id The ID of the page.\n\t */\n\treturn apply_filters( '_get_page_link', $link, $post->ID );\n}\n\n/**\n * Retrieve permalink for attachment.\n *\n * This can be used in the WordPress Loop or outside of it.\n *\n * @since 2.0.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param int|object $post      Optional. Post ID or object.\n * @param bool       $leavename Optional. Leave name.\n * @return string The attachment permalink.\n */\nfunction get_attachment_link( $post = null, $leavename = false ) {\n\tglobal $wp_rewrite;\n\n\t$link = false;\n\n\t$post = get_post( $post );\n\t$parent = ( $post->post_parent > 0 && $post->post_parent != $post->ID ) ? get_post( $post->post_parent ) : false;\n\tif ( $parent && ! in_array( $parent->post_type, get_post_types() ) ) {\n\t\t$parent = false;\n\t}\n\n\tif ( $wp_rewrite->using_permalinks() && $parent ) {\n\t\tif ( 'page' == $parent->post_type )\n\t\t\t$parentlink = _get_page_link( $post->post_parent ); // Ignores page_on_front\n\t\telse\n\t\t\t$parentlink = get_permalink( $post->post_parent );\n\n\t\tif ( is_numeric($post->post_name) || false !== strpos(get_option('permalink_structure'), '%category%') )\n\t\t\t$name = 'attachment/' . $post->post_name; // <permalink>/<int>/ is paged so we use the explicit attachment marker\n\t\telse\n\t\t\t$name = $post->post_name;\n\n\t\tif ( strpos($parentlink, '?') === false )\n\t\t\t$link = user_trailingslashit( trailingslashit($parentlink) . '%postname%' );\n\n\t\tif ( ! $leavename )\n\t\t\t$link = str_replace( '%postname%', $name, $link );\n\t} elseif ( $wp_rewrite->using_permalinks() && ! $leavename ) {\n\t\t$link = home_url( user_trailingslashit( $post->post_name ) );\n\t}\n\n\tif ( ! $link )\n\t\t$link = home_url( '/?attachment_id=' . $post->ID );\n\n\t/**\n\t * Filter the permalink for an attachment.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param string $link    The attachment's permalink.\n\t * @param int    $post_id Attachment ID.\n\t */\n\treturn apply_filters( 'attachment_link', $link, $post->ID );\n}\n\n/**\n * Retrieve the permalink for the year archives.\n *\n * @since 1.5.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param int|bool $year False for current year or year for permalink.\n * @return string The permalink for the specified year archive.\n */\nfunction get_year_link($year) {\n\tglobal $wp_rewrite;\n\tif ( !$year )\n\t\t$year = gmdate('Y', current_time('timestamp'));\n\t$yearlink = $wp_rewrite->get_year_permastruct();\n\tif ( !empty($yearlink) ) {\n\t\t$yearlink = str_replace('%year%', $year, $yearlink);\n\t\t$yearlink = home_url( user_trailingslashit( $yearlink, 'year' ) );\n\t} else {\n\t\t$yearlink = home_url( '?m=' . $year );\n\t}\n\n\t/**\n\t * Filter the year archive permalink.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $yearlink Permalink for the year archive.\n\t * @param int    $year     Year for the archive.\n\t */\n\treturn apply_filters( 'year_link', $yearlink, $year );\n}\n\n/**\n * Retrieve the permalink for the month archives with year.\n *\n * @since 1.0.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param bool|int $year  False for current year. Integer of year.\n * @param bool|int $month False for current month. Integer of month.\n * @return string The permalink for the specified month and year archive.\n */\nfunction get_month_link($year, $month) {\n\tglobal $wp_rewrite;\n\tif ( !$year )\n\t\t$year = gmdate('Y', current_time('timestamp'));\n\tif ( !$month )\n\t\t$month = gmdate('m', current_time('timestamp'));\n\t$monthlink = $wp_rewrite->get_month_permastruct();\n\tif ( !empty($monthlink) ) {\n\t\t$monthlink = str_replace('%year%', $year, $monthlink);\n\t\t$monthlink = str_replace('%monthnum%', zeroise(intval($month), 2), $monthlink);\n\t\t$monthlink = home_url( user_trailingslashit( $monthlink, 'month' ) );\n\t} else {\n\t\t$monthlink = home_url( '?m=' . $year . zeroise( $month, 2 ) );\n\t}\n\n\t/**\n\t * Filter the month archive permalink.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $monthlink Permalink for the month archive.\n\t * @param int    $year      Year for the archive.\n\t * @param int    $month     The month for the archive.\n\t */\n\treturn apply_filters( 'month_link', $monthlink, $year, $month );\n}\n\n/**\n * Retrieve the permalink for the day archives with year and month.\n *\n * @since 1.0.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param bool|int $year  False for current year. Integer of year.\n * @param bool|int $month False for current month. Integer of month.\n * @param bool|int $day   False for current day. Integer of day.\n * @return string The permalink for the specified day, month, and year archive.\n */\nfunction get_day_link($year, $month, $day) {\n\tglobal $wp_rewrite;\n\tif ( !$year )\n\t\t$year = gmdate('Y', current_time('timestamp'));\n\tif ( !$month )\n\t\t$month = gmdate('m', current_time('timestamp'));\n\tif ( !$day )\n\t\t$day = gmdate('j', current_time('timestamp'));\n\n\t$daylink = $wp_rewrite->get_day_permastruct();\n\tif ( !empty($daylink) ) {\n\t\t$daylink = str_replace('%year%', $year, $daylink);\n\t\t$daylink = str_replace('%monthnum%', zeroise(intval($month), 2), $daylink);\n\t\t$daylink = str_replace('%day%', zeroise(intval($day), 2), $daylink);\n\t\t$daylink = home_url( user_trailingslashit( $daylink, 'day' ) );\n\t} else {\n\t\t$daylink = home_url( '?m=' . $year . zeroise( $month, 2 ) . zeroise( $day, 2 ) );\n\t}\n\n\t/**\n\t * Filter the day archive permalink.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $daylink Permalink for the day archive.\n\t * @param int    $year    Year for the archive.\n\t * @param int    $month   Month for the archive.\n\t * @param int    $day     The day for the archive.\n\t */\n\treturn apply_filters( 'day_link', $daylink, $year, $month, $day );\n}\n\n/**\n * Display the permalink for the feed type.\n *\n * @since 3.0.0\n *\n * @param string $anchor The link's anchor text.\n * @param string $feed   Optional, defaults to default feed. Feed type.\n */\nfunction the_feed_link( $anchor, $feed = '' ) {\n\t$link = '<a href=\"' . esc_url( get_feed_link( $feed ) ) . '\">' . $anchor . '</a>';\n\n\t/**\n\t * Filter the feed link anchor tag.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $link The complete anchor tag for a feed link.\n\t * @param string $feed The feed type, or an empty string for the\n\t *                     default feed type.\n\t */\n\techo apply_filters( 'the_feed_link', $link, $feed );\n}\n\n/**\n * Retrieve the permalink for the feed type.\n *\n * @since 1.5.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $feed Optional, defaults to default feed. Feed type.\n * @return string The feed permalink.\n */\nfunction get_feed_link($feed = '') {\n\tglobal $wp_rewrite;\n\n\t$permalink = $wp_rewrite->get_feed_permastruct();\n\tif ( '' != $permalink ) {\n\t\tif ( false !== strpos($feed, 'comments_') ) {\n\t\t\t$feed = str_replace('comments_', '', $feed);\n\t\t\t$permalink = $wp_rewrite->get_comment_feed_permastruct();\n\t\t}\n\n\t\tif ( get_default_feed() == $feed )\n\t\t\t$feed = '';\n\n\t\t$permalink = str_replace('%feed%', $feed, $permalink);\n\t\t$permalink = preg_replace('#/+#', '/', \"/$permalink\");\n\t\t$output =  home_url( user_trailingslashit($permalink, 'feed') );\n\t} else {\n\t\tif ( empty($feed) )\n\t\t\t$feed = get_default_feed();\n\n\t\tif ( false !== strpos($feed, 'comments_') )\n\t\t\t$feed = str_replace('comments_', 'comments-', $feed);\n\n\t\t$output = home_url(\"?feed={$feed}\");\n\t}\n\n\t/**\n\t * Filter the feed type permalink.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $output The feed permalink.\n\t * @param string $feed   Feed type.\n\t */\n\treturn apply_filters( 'feed_link', $output, $feed );\n}\n\n/**\n * Retrieve the permalink for the post comments feed.\n *\n * @since 2.2.0\n *\n * @param int    $post_id Optional. Post ID.\n * @param string $feed    Optional. Feed type.\n * @return string The permalink for the comments feed for the given post.\n */\nfunction get_post_comments_feed_link($post_id = 0, $feed = '') {\n\t$post_id = absint( $post_id );\n\n\tif ( ! $post_id )\n\t\t$post_id = get_the_ID();\n\n\tif ( empty( $feed ) )\n\t\t$feed = get_default_feed();\n\n\t$post = get_post( $post_id );\n\t$unattached = 'attachment' === $post->post_type && 0 === (int) $post->post_parent;\n\n\tif ( '' != get_option('permalink_structure') ) {\n\t\tif ( 'page' == get_option('show_on_front') && $post_id == get_option('page_on_front') )\n\t\t\t$url = _get_page_link( $post_id );\n\t\telse\n\t\t\t$url = get_permalink($post_id);\n\n\t\tif ( $unattached ) {\n\t\t\t$url =  home_url( '/feed/' );\n\t\t\tif ( $feed !== get_default_feed() ) {\n\t\t\t\t$url .= \"$feed/\";\n\t\t\t}\n\t\t\t$url = add_query_arg( 'attachment_id', $post_id, $url );\n\t\t} else {\n\t\t\t$url = trailingslashit($url) . 'feed';\n\t\t\tif ( $feed != get_default_feed() )\n\t\t\t\t$url .= \"/$feed\";\n\t\t\t$url = user_trailingslashit($url, 'single_feed');\n\t\t}\n\t} else {\n\t\tif ( $unattached ) {\n\t\t\t$url = add_query_arg( array( 'feed' => $feed, 'attachment_id' => $post_id ), home_url( '/' ) );\n\t\t} elseif ( 'page' == $post->post_type ) {\n\t\t\t$url = add_query_arg( array( 'feed' => $feed, 'page_id' => $post_id ), home_url( '/' ) );\n\t\t} else {\n\t\t\t$url = add_query_arg( array( 'feed' => $feed, 'p' => $post_id ), home_url( '/' ) );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the post comments feed permalink.\n\t *\n\t * @since 1.5.1\n\t *\n\t * @param string $url Post comments feed permalink.\n\t */\n\treturn apply_filters( 'post_comments_feed_link', $url );\n}\n\n/**\n * Display the comment feed link for a post.\n *\n * Prints out the comment feed link for a post. Link text is placed in the\n * anchor. If no link text is specified, default text is used. If no post ID is\n * specified, the current post is used.\n *\n * @since 2.5.0\n *\n * @param string $link_text Descriptive text.\n * @param int    $post_id   Optional post ID. Default to current post.\n * @param string $feed      Optional. Feed format.\n*/\nfunction post_comments_feed_link( $link_text = '', $post_id = '', $feed = '' ) {\n\t$url = get_post_comments_feed_link( $post_id, $feed );\n\tif ( empty( $link_text ) ) {\n\t\t$link_text = __('Comments Feed');\n\t}\n\n\t$link = '<a href=\"' . esc_url( $url ) . '\">' . $link_text . '</a>';\n\t/**\n\t * Filter the post comment feed link anchor tag.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $link    The complete anchor tag for the comment feed link.\n\t * @param int    $post_id Post ID.\n\t * @param string $feed    The feed type, or an empty string for the default feed type.\n\t */\n\techo apply_filters( 'post_comments_feed_link_html', $link, $post_id, $feed );\n}\n\n/**\n * Retrieve the feed link for a given author.\n *\n * Returns a link to the feed for all posts by a given author. A specific feed\n * can be requested or left blank to get the default feed.\n *\n * @since 2.5.0\n *\n * @param int    $author_id ID of an author.\n * @param string $feed      Optional. Feed type.\n * @return string Link to the feed for the author specified by $author_id.\n*/\nfunction get_author_feed_link( $author_id, $feed = '' ) {\n\t$author_id = (int) $author_id;\n\t$permalink_structure = get_option('permalink_structure');\n\n\tif ( empty($feed) )\n\t\t$feed = get_default_feed();\n\n\tif ( '' == $permalink_structure ) {\n\t\t$link = home_url(\"?feed=$feed&amp;author=\" . $author_id);\n\t} else {\n\t\t$link = get_author_posts_url($author_id);\n\t\tif ( $feed == get_default_feed() )\n\t\t\t$feed_link = 'feed';\n\t\telse\n\t\t\t$feed_link = \"feed/$feed\";\n\n\t\t$link = trailingslashit($link) . user_trailingslashit($feed_link, 'feed');\n\t}\n\n\t/**\n\t * Filter the feed link for a given author.\n\t *\n\t * @since 1.5.1\n\t *\n\t * @param string $link The author feed link.\n\t * @param string $feed Feed type.\n\t */\n\t$link = apply_filters( 'author_feed_link', $link, $feed );\n\n\treturn $link;\n}\n\n/**\n * Retrieve the feed link for a category.\n *\n * Returns a link to the feed for all posts in a given category. A specific feed\n * can be requested or left blank to get the default feed.\n *\n * @since 2.5.0\n *\n * @param int    $cat_id ID of a category.\n * @param string $feed   Optional. Feed type.\n * @return string Link to the feed for the category specified by $cat_id.\n*/\nfunction get_category_feed_link( $cat_id, $feed = '' ) {\n\treturn get_term_feed_link( $cat_id, 'category', $feed );\n}\n\n/**\n * Retrieve the feed link for a term.\n *\n * Returns a link to the feed for all posts in a given term. A specific feed\n * can be requested or left blank to get the default feed.\n *\n * @since 3.0.0\n *\n * @param int    $term_id  ID of a category.\n * @param string $taxonomy Optional. Taxonomy of $term_id\n * @param string $feed     Optional. Feed type.\n * @return string|false Link to the feed for the term specified by $term_id and $taxonomy.\n*/\nfunction get_term_feed_link( $term_id, $taxonomy = 'category', $feed = '' ) {\n\t$term_id = ( int ) $term_id;\n\n\t$term = get_term( $term_id, $taxonomy  );\n\n\tif ( empty( $term ) || is_wp_error( $term ) )\n\t\treturn false;\n\n\tif ( empty( $feed ) )\n\t\t$feed = get_default_feed();\n\n\t$permalink_structure = get_option( 'permalink_structure' );\n\n\tif ( '' == $permalink_structure ) {\n\t\tif ( 'category' == $taxonomy ) {\n\t\t\t$link = home_url(\"?feed=$feed&amp;cat=$term_id\");\n\t\t}\n\t\telseif ( 'post_tag' == $taxonomy ) {\n\t\t\t$link = home_url(\"?feed=$feed&amp;tag=$term->slug\");\n\t\t} else {\n\t\t\t$t = get_taxonomy( $taxonomy );\n\t\t\t$link = home_url(\"?feed=$feed&amp;$t->query_var=$term->slug\");\n\t\t}\n\t} else {\n\t\t$link = get_term_link( $term_id, $term->taxonomy );\n\t\tif ( $feed == get_default_feed() )\n\t\t\t$feed_link = 'feed';\n\t\telse\n\t\t\t$feed_link = \"feed/$feed\";\n\n\t\t$link = trailingslashit( $link ) . user_trailingslashit( $feed_link, 'feed' );\n\t}\n\n\tif ( 'category' == $taxonomy ) {\n\t\t/**\n\t\t * Filter the category feed link.\n\t\t *\n\t\t * @since 1.5.1\n\t\t *\n\t\t * @param string $link The category feed link.\n\t\t * @param string $feed Feed type.\n\t\t */\n\t\t$link = apply_filters( 'category_feed_link', $link, $feed );\n\t} elseif ( 'post_tag' == $taxonomy ) {\n\t\t/**\n\t\t * Filter the post tag feed link.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param string $link The tag feed link.\n\t\t * @param string $feed Feed type.\n\t\t */\n\t\t$link = apply_filters( 'tag_feed_link', $link, $feed );\n\t} else {\n\t\t/**\n\t\t * Filter the feed link for a taxonomy other than 'category' or 'post_tag'.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $link The taxonomy feed link.\n\t\t * @param string $feed Feed type.\n\t\t * @param string $feed The taxonomy name.\n\t\t */\n\t\t$link = apply_filters( 'taxonomy_feed_link', $link, $feed, $taxonomy );\n\t}\n\n\treturn $link;\n}\n\n/**\n * Retrieve permalink for feed of tag.\n *\n * @since 2.3.0\n *\n * @param int    $tag_id Tag ID.\n * @param string $feed   Optional. Feed type.\n * @return string The feed permalink for the given tag.\n */\nfunction get_tag_feed_link( $tag_id, $feed = '' ) {\n\treturn get_term_feed_link( $tag_id, 'post_tag', $feed );\n}\n\n/**\n * Retrieve edit tag link.\n *\n * @since 2.7.0\n *\n * @param int    $tag_id   Tag ID\n * @param string $taxonomy Taxonomy\n * @return string The edit tag link URL for the given tag.\n */\nfunction get_edit_tag_link( $tag_id, $taxonomy = 'post_tag' ) {\n\t/**\n\t * Filter the edit link for a tag (or term in another taxonomy).\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $link The term edit link.\n\t */\n\treturn apply_filters( 'get_edit_tag_link', get_edit_term_link( $tag_id, $taxonomy ) );\n}\n\n/**\n * Display or retrieve edit tag link with formatting.\n *\n * @since 2.7.0\n *\n * @param string $link   Optional. Anchor text.\n * @param string $before Optional. Display before edit link.\n * @param string $after  Optional. Display after edit link.\n * @param object $tag    Tag object.\n */\nfunction edit_tag_link( $link = '', $before = '', $after = '', $tag = null ) {\n\t$link = edit_term_link( $link, '', '', $tag, false );\n\n\t/**\n\t * Filter the anchor tag for the edit link for a tag (or term in another taxonomy).\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $link The anchor tag for the edit link.\n\t */\n\techo $before . apply_filters( 'edit_tag_link', $link ) . $after;\n}\n\n/**\n * Retrieve edit term url.\n *\n * @since 3.1.0\n *\n * @param int    $term_id     Term ID.\n * @param string $taxonomy    Taxonomy.\n * @param string $object_type The object type. Used to highlight the proper post type menu on the linked page.\n *                            Defaults to the first object_type associated with the taxonomy.\n * @return string|null The edit term link URL for the given term, or null on failure.\n */\nfunction get_edit_term_link( $term_id, $taxonomy, $object_type = '' ) {\n\t$tax = get_taxonomy( $taxonomy );\n\tif ( ! $tax || ! current_user_can( $tax->cap->edit_terms ) ) {\n\t\treturn;\n\t}\n\n\t$term = get_term( $term_id, $taxonomy );\n\tif ( ! $term || is_wp_error( $term ) ) {\n\t\treturn;\n\t}\n\n\t$args = array(\n\t\t'action' => 'edit',\n\t\t'taxonomy' => $taxonomy,\n\t\t'tag_ID' => $term->term_id,\n\t);\n\n\tif ( $object_type ) {\n\t\t$args['post_type'] = $object_type;\n\t} elseif ( ! empty( $tax->object_type ) ) {\n\t\t$args['post_type'] = reset( $tax->object_type );\n\t}\n\n\tif ( $tax->show_ui ) {\n\t\t$location = add_query_arg( $args, admin_url( 'edit-tags.php' ) );\n\t} else {\n\t\t$location = '';\n\t}\n\n\t/**\n\t * Filter the edit link for a term.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $location    The edit link.\n\t * @param int    $term_id     Term ID.\n\t * @param string $taxonomy    Taxonomy name.\n\t * @param string $object_type The object type (eg. the post type).\n\t */\n\treturn apply_filters( 'get_edit_term_link', $location, $term_id, $taxonomy, $object_type );\n}\n\n/**\n * Display or retrieve edit term link with formatting.\n *\n * @since 3.1.0\n *\n * @param string $link   Optional. Anchor text. Default empty.\n * @param string $before Optional. Display before edit link. Default empty.\n * @param string $after  Optional. Display after edit link. Default empty.\n * @param object $term   Optional. Term object. If null, the queried object will be inspected. Default null.\n * @param bool   $echo   Optional. Whether or not to echo the return. Default true.\n * @return string|void HTML content.\n */\nfunction edit_term_link( $link = '', $before = '', $after = '', $term = null, $echo = true ) {\n\tif ( is_null( $term ) )\n\t\t$term = get_queried_object();\n\n\tif ( ! $term )\n\t\treturn;\n\n\t$tax = get_taxonomy( $term->taxonomy );\n\tif ( ! current_user_can( $tax->cap->edit_terms ) )\n\t\treturn;\n\n\tif ( empty( $link ) )\n\t\t$link = __('Edit This');\n\n\t$link = '<a href=\"' . get_edit_term_link( $term->term_id, $term->taxonomy ) . '\">' . $link . '</a>';\n\n\t/**\n\t * Filter the anchor tag for the edit link of a term.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $link    The anchor tag for the edit link.\n\t * @param int    $term_id Term ID.\n\t */\n\t$link = $before . apply_filters( 'edit_term_link', $link, $term->term_id ) . $after;\n\n\tif ( $echo )\n\t\techo $link;\n\telse\n\t\treturn $link;\n}\n\n/**\n * Retrieve permalink for search.\n *\n * @since  3.0.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $query Optional. The query string to use. If empty the current query is used.\n * @return string The search permalink.\n */\nfunction get_search_link( $query = '' ) {\n\tglobal $wp_rewrite;\n\n\tif ( empty($query) )\n\t\t$search = get_search_query( false );\n\telse\n\t\t$search = stripslashes($query);\n\n\t$permastruct = $wp_rewrite->get_search_permastruct();\n\n\tif ( empty( $permastruct ) ) {\n\t\t$link = home_url('?s=' . urlencode($search) );\n\t} else {\n\t\t$search = urlencode($search);\n\t\t$search = str_replace('%2F', '/', $search); // %2F(/) is not valid within a URL, send it un-encoded.\n\t\t$link = str_replace( '%search%', $search, $permastruct );\n\t\t$link = home_url( user_trailingslashit( $link, 'search' ) );\n\t}\n\n\t/**\n\t * Filter the search permalink.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $link   Search permalink.\n\t * @param string $search The URL-encoded search term.\n\t */\n\treturn apply_filters( 'search_link', $link, $search );\n}\n\n/**\n * Retrieve the permalink for the feed of the search results.\n *\n * @since 2.5.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $search_query Optional. Search query.\n * @param string $feed         Optional. Feed type.\n * @return string The search results feed permalink.\n */\nfunction get_search_feed_link($search_query = '', $feed = '') {\n\tglobal $wp_rewrite;\n\t$link = get_search_link($search_query);\n\n\tif ( empty($feed) )\n\t\t$feed = get_default_feed();\n\n\t$permastruct = $wp_rewrite->get_search_permastruct();\n\n\tif ( empty($permastruct) ) {\n\t\t$link = add_query_arg('feed', $feed, $link);\n\t} else {\n\t\t$link = trailingslashit($link);\n\t\t$link .= \"feed/$feed/\";\n\t}\n\n\t/**\n\t * Filter the search feed link.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $link Search feed link.\n\t * @param string $feed Feed type.\n\t * @param string $type The search type. One of 'posts' or 'comments'.\n\t */\n\treturn apply_filters( 'search_feed_link', $link, $feed, 'posts' );\n}\n\n/**\n * Retrieve the permalink for the comments feed of the search results.\n *\n * @since 2.5.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $search_query Optional. Search query.\n * @param string $feed         Optional. Feed type.\n * @return string The comments feed search results permalink.\n */\nfunction get_search_comments_feed_link($search_query = '', $feed = '') {\n\tglobal $wp_rewrite;\n\n\tif ( empty($feed) )\n\t\t$feed = get_default_feed();\n\n\t$link = get_search_feed_link($search_query, $feed);\n\n\t$permastruct = $wp_rewrite->get_search_permastruct();\n\n\tif ( empty($permastruct) )\n\t\t$link = add_query_arg('feed', 'comments-' . $feed, $link);\n\telse\n\t\t$link = add_query_arg('withcomments', 1, $link);\n\n\t/** This filter is documented in wp-includes/link-template.php */\n\treturn apply_filters( 'search_feed_link', $link, $feed, 'comments' );\n}\n\n/**\n * Retrieve the permalink for a post type archive.\n *\n * @since 3.1.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $post_type Post type\n * @return string|false The post type archive permalink.\n */\nfunction get_post_type_archive_link( $post_type ) {\n\tglobal $wp_rewrite;\n\tif ( ! $post_type_obj = get_post_type_object( $post_type ) )\n\t\treturn false;\n\n\tif ( ! $post_type_obj->has_archive )\n\t\treturn false;\n\n\tif ( get_option( 'permalink_structure' ) && is_array( $post_type_obj->rewrite ) ) {\n\t\t$struct = ( true === $post_type_obj->has_archive ) ? $post_type_obj->rewrite['slug'] : $post_type_obj->has_archive;\n\t\tif ( $post_type_obj->rewrite['with_front'] )\n\t\t\t$struct = $wp_rewrite->front . $struct;\n\t\telse\n\t\t\t$struct = $wp_rewrite->root . $struct;\n\t\t$link = home_url( user_trailingslashit( $struct, 'post_type_archive' ) );\n\t} else {\n\t\t$link = home_url( '?post_type=' . $post_type );\n\t}\n\n\t/**\n\t * Filter the post type archive permalink.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $link      The post type archive permalink.\n\t * @param string $post_type Post type name.\n\t */\n\treturn apply_filters( 'post_type_archive_link', $link, $post_type );\n}\n\n/**\n * Retrieve the permalink for a post type archive feed.\n *\n * @since 3.1.0\n *\n * @param string $post_type Post type\n * @param string $feed      Optional. Feed type\n * @return string|false The post type feed permalink.\n */\nfunction get_post_type_archive_feed_link( $post_type, $feed = '' ) {\n\t$default_feed = get_default_feed();\n\tif ( empty( $feed ) )\n\t\t$feed = $default_feed;\n\n\tif ( ! $link = get_post_type_archive_link( $post_type ) )\n\t\treturn false;\n\n\t$post_type_obj = get_post_type_object( $post_type );\n\tif ( get_option( 'permalink_structure' ) && is_array( $post_type_obj->rewrite ) && $post_type_obj->rewrite['feeds'] ) {\n\t\t$link = trailingslashit( $link );\n\t\t$link .= 'feed/';\n\t\tif ( $feed != $default_feed )\n\t\t\t$link .= \"$feed/\";\n\t} else {\n\t\t$link = add_query_arg( 'feed', $feed, $link );\n\t}\n\n\t/**\n\t * Filter the post type archive feed link.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $link The post type archive feed link.\n\t * @param string $feed Feed type.\n\t */\n\treturn apply_filters( 'post_type_archive_feed_link', $link, $feed );\n}\n\n/**\n * Retrieve URL used for the post preview.\n *\n * Get the preview post URL. Allows additional query args to be appended.\n *\n * @since 4.4.0\n *\n * @param int|WP_Post $post         Optional. Post ID or `WP_Post` object. Defaults to global post.\n * @param array       $query_args   Optional. Array of additional query args to be appended to the link.\n * @param string      $preview_link Optional. Base preview link to be used if it should differ from the post permalink.\n * @return string URL used for the post preview.\n */\nfunction get_preview_post_link( $post = null, $query_args = array(), $preview_link = '' ) {\n\t$post = get_post( $post );\n\tif ( ! $post ) {\n\t\treturn;\n\t}\n\n\t$post_type_object = get_post_type_object( $post->post_type );\n\tif ( is_post_type_viewable( $post_type_object ) ) {\n\t\tif ( ! $preview_link ) {\n\t\t\t$preview_link = get_permalink( $post );\n\t\t}\n\n\t\t$query_args['preview'] = 'true';\n\t\t$preview_link = add_query_arg( $query_args, $preview_link );\n\t}\n\n\t/**\n\t * Filter the URL used for a post preview.\n\t *\n\t * @since 2.0.5\n\t * @since 4.0.0 Added the `$post` parameter.\n\t *\n\t * @param string  $preview_link URL used for the post preview.\n\t * @param WP_Post $post         Post object.\n\t */\n\treturn apply_filters( 'preview_post_link', $preview_link, $post );\n}\n\n/**\n * Retrieve edit posts link for post.\n *\n * Can be used within the WordPress loop or outside of it. Can be used with\n * pages, posts, attachments, and revisions.\n *\n * @since 2.3.0\n *\n * @param int    $id      Optional. Post ID.\n * @param string $context Optional, defaults to display. How to write the '&', defaults to '&amp;'.\n * @return string|null The edit post link for the given post. null if the post type is invalid or does\n *                     not allow an editing UI.\n */\nfunction get_edit_post_link( $id = 0, $context = 'display' ) {\n\tif ( ! $post = get_post( $id ) )\n\t\treturn;\n\n\tif ( 'revision' === $post->post_type )\n\t\t$action = '';\n\telseif ( 'display' == $context )\n\t\t$action = '&amp;action=edit';\n\telse\n\t\t$action = '&action=edit';\n\n\t$post_type_object = get_post_type_object( $post->post_type );\n\tif ( !$post_type_object )\n\t\treturn;\n\n\tif ( !current_user_can( 'edit_post', $post->ID ) )\n\t\treturn;\n\n\tif ( $post_type_object->_edit_link ) {\n\t\t$link = admin_url( sprintf( $post_type_object->_edit_link . $action, $post->ID ) );\n\t} else {\n\t\t$link = '';\n\t}\n\n\t/**\n\t * Filter the post edit link.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $link    The edit link.\n\t * @param int    $post_id Post ID.\n\t * @param string $context The link context. If set to 'display' then ampersands\n\t *                        are encoded.\n\t */\n\treturn apply_filters( 'get_edit_post_link', $link, $post->ID, $context );\n}\n\n/**\n * Display edit post link for post.\n *\n * @since 1.0.0\n * @since 4.4.0 The `$class` argument was added.\n *\n * @param string $text   Optional. Anchor text.\n * @param string $before Optional. Display before edit link.\n * @param string $after  Optional. Display after edit link.\n * @param int    $id     Optional. Post ID.\n * @param string $class  Optional. Add custom class to link.\n */\nfunction edit_post_link( $text = null, $before = '', $after = '', $id = 0, $class = 'post-edit-link' ) {\n\tif ( ! $post = get_post( $id ) ) {\n\t\treturn;\n\t}\n\n\tif ( ! $url = get_edit_post_link( $post->ID ) ) {\n\t\treturn;\n\t}\n\n\tif ( null === $text ) {\n\t\t$text = __( 'Edit This' );\n\t}\n\n\t$link = '<a class=\"' . esc_attr( $class ) . '\" href=\"' . esc_url( $url ) . '\">' . $text . '</a>';\n\n\t/**\n\t * Filter the post edit link anchor tag.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $link    Anchor tag for the edit link.\n\t * @param int    $post_id Post ID.\n\t * @param string $text    Anchor text.\n\t */\n\techo $before . apply_filters( 'edit_post_link', $link, $post->ID, $text ) . $after;\n}\n\n/**\n * Retrieve delete posts link for post.\n *\n * Can be used within the WordPress loop or outside of it, with any post type.\n *\n * @since 2.9.0\n *\n * @param int    $id           Optional. Post ID.\n * @param string $deprecated   Not used.\n * @param bool   $force_delete Whether to bypass trash and force deletion. Default is false.\n * @return string|void The delete post link URL for the given post.\n */\nfunction get_delete_post_link( $id = 0, $deprecated = '', $force_delete = false ) {\n\tif ( ! empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '3.0' );\n\n\tif ( !$post = get_post( $id ) )\n\t\treturn;\n\n\t$post_type_object = get_post_type_object( $post->post_type );\n\tif ( !$post_type_object )\n\t\treturn;\n\n\tif ( !current_user_can( 'delete_post', $post->ID ) )\n\t\treturn;\n\n\t$action = ( $force_delete || !EMPTY_TRASH_DAYS ) ? 'delete' : 'trash';\n\n\t$delete_link = add_query_arg( 'action', $action, admin_url( sprintf( $post_type_object->_edit_link, $post->ID ) ) );\n\n\t/**\n\t * Filter the post delete link.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $link         The delete link.\n\t * @param int    $post_id      Post ID.\n\t * @param bool   $force_delete Whether to bypass the trash and force deletion. Default false.\n\t */\n\treturn apply_filters( 'get_delete_post_link', wp_nonce_url( $delete_link, \"$action-post_{$post->ID}\" ), $post->ID, $force_delete );\n}\n\n/**\n * Retrieve edit comment link.\n *\n * @since 2.3.0\n *\n * @param int|WP_Comment $comment_id Optional. Comment ID or WP_Comment object.\n * @return string|void The edit comment link URL for the given comment.\n */\nfunction get_edit_comment_link( $comment_id = 0 ) {\n\t$comment = get_comment( $comment_id );\n\n\tif ( !current_user_can( 'edit_comment', $comment->comment_ID ) )\n\t\treturn;\n\n\t$location = admin_url('comment.php?action=editcomment&amp;c=') . $comment->comment_ID;\n\n\t/**\n\t * Filter the comment edit link.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $location The edit link.\n\t */\n\treturn apply_filters( 'get_edit_comment_link', $location );\n}\n\n/**\n * Display edit comment link with formatting.\n *\n * @since 1.0.0\n *\n * @param string $text   Optional. Anchor text.\n * @param string $before Optional. Display before edit link.\n * @param string $after  Optional. Display after edit link.\n */\nfunction edit_comment_link( $text = null, $before = '', $after = '' ) {\n\t$comment = get_comment();\n\n\tif ( ! current_user_can( 'edit_comment', $comment->comment_ID ) ) {\n\t\treturn;\n\t}\n\n\tif ( null === $text ) {\n\t\t$text = __( 'Edit This' );\n\t}\n\n\t$link = '<a class=\"comment-edit-link\" href=\"' . esc_url( get_edit_comment_link( $comment ) ) . '\">' . $text . '</a>';\n\n\t/**\n\t * Filter the comment edit link anchor tag.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $link       Anchor tag for the edit link.\n\t * @param int    $comment_id Comment ID.\n\t * @param string $text       Anchor text.\n\t */\n\techo $before . apply_filters( 'edit_comment_link', $link, $comment->comment_ID, $text ) . $after;\n}\n\n/**\n * Display edit bookmark (literally a URL external to blog) link.\n *\n * @since 2.7.0\n *\n * @param int|stdClass $link Optional. Bookmark ID.\n * @return string|void The edit bookmark link URL.\n */\nfunction get_edit_bookmark_link( $link = 0 ) {\n\t$link = get_bookmark( $link );\n\n\tif ( !current_user_can('manage_links') )\n\t\treturn;\n\n\t$location = admin_url('link.php?action=edit&amp;link_id=') . $link->link_id;\n\n\t/**\n\t * Filter the bookmark (link) edit link.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $location The edit link.\n\t * @param int    $link_id  Bookmark ID.\n\t */\n\treturn apply_filters( 'get_edit_bookmark_link', $location, $link->link_id );\n}\n\n/**\n * Display edit bookmark (literally a URL external to blog) link anchor content.\n *\n * @since 2.7.0\n *\n * @param string $link     Optional. Anchor text.\n * @param string $before   Optional. Display before edit link.\n * @param string $after    Optional. Display after edit link.\n * @param int    $bookmark Optional. Bookmark ID.\n */\nfunction edit_bookmark_link( $link = '', $before = '', $after = '', $bookmark = null ) {\n\t$bookmark = get_bookmark($bookmark);\n\n\tif ( !current_user_can('manage_links') )\n\t\treturn;\n\n\tif ( empty($link) )\n\t\t$link = __('Edit This');\n\n\t$link = '<a href=\"' . esc_url( get_edit_bookmark_link( $bookmark ) ) . '\">' . $link . '</a>';\n\n\t/**\n\t * Filter the bookmark edit link anchor tag.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $link    Anchor tag for the edit link.\n\t * @param int    $link_id Bookmark ID.\n\t */\n\techo $before . apply_filters( 'edit_bookmark_link', $link, $bookmark->link_id ) . $after;\n}\n\n/**\n * Retrieve edit user link\n *\n * @since 3.5.0\n *\n * @param int $user_id Optional. User ID. Defaults to the current user.\n * @return string URL to edit user page or empty string.\n */\nfunction get_edit_user_link( $user_id = null ) {\n\tif ( ! $user_id )\n\t\t$user_id = get_current_user_id();\n\n\tif ( empty( $user_id ) || ! current_user_can( 'edit_user', $user_id ) )\n\t\treturn '';\n\n\t$user = get_userdata( $user_id );\n\n\tif ( ! $user )\n\t\treturn '';\n\n\tif ( get_current_user_id() == $user->ID )\n\t\t$link = get_edit_profile_url( $user->ID );\n\telse\n\t\t$link = add_query_arg( 'user_id', $user->ID, self_admin_url( 'user-edit.php' ) );\n\n\t/**\n\t * Filter the user edit link.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param string $link    The edit link.\n\t * @param int    $user_id User ID.\n\t */\n\treturn apply_filters( 'get_edit_user_link', $link, $user->ID );\n}\n\n// Navigation links\n\n/**\n * Retrieve previous post that is adjacent to current post.\n *\n * @since 1.5.0\n *\n * @param bool         $in_same_term   Optional. Whether post should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n * @return null|string|WP_Post Post object if successful. Null if global $post is not set. Empty string if no corresponding post exists.\n */\nfunction get_previous_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\treturn get_adjacent_post( $in_same_term, $excluded_terms, true, $taxonomy );\n}\n\n/**\n * Retrieve next post that is adjacent to current post.\n *\n * @since 1.5.0\n *\n * @param bool         $in_same_term   Optional. Whether post should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n * @return null|string|WP_Post Post object if successful. Null if global $post is not set. Empty string if no corresponding post exists.\n */\nfunction get_next_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\treturn get_adjacent_post( $in_same_term, $excluded_terms, false, $taxonomy );\n}\n\n/**\n * Retrieve adjacent post.\n *\n * Can either be next or previous post.\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param bool         $in_same_term   Optional. Whether post should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param bool         $previous       Optional. Whether to retrieve previous post.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n * @return null|string|WP_Post Post object if successful. Null if global $post is not set. Empty string if no corresponding post exists.\n */\nfunction get_adjacent_post( $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {\n\tglobal $wpdb;\n\n\tif ( ( ! $post = get_post() ) || ! taxonomy_exists( $taxonomy ) )\n\t\treturn null;\n\n\t$current_post_date = $post->post_date;\n\n\t$join = '';\n\t$where = '';\n\n\tif ( $in_same_term || ! empty( $excluded_terms ) ) {\n\t\tif ( ! empty( $excluded_terms ) && ! is_array( $excluded_terms ) ) {\n\t\t\t// back-compat, $excluded_terms used to be $excluded_terms with IDs separated by \" and \"\n\t\t\tif ( false !== strpos( $excluded_terms, ' and ' ) ) {\n\t\t\t\t_deprecated_argument( __FUNCTION__, '3.3', sprintf( __( 'Use commas instead of %s to separate excluded terms.' ), \"'and'\" ) );\n\t\t\t\t$excluded_terms = explode( ' and ', $excluded_terms );\n\t\t\t} else {\n\t\t\t\t$excluded_terms = explode( ',', $excluded_terms );\n\t\t\t}\n\n\t\t\t$excluded_terms = array_map( 'intval', $excluded_terms );\n\t\t}\n\n\t\tif ( $in_same_term ) {\n\t\t\t$join .= \" INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id\";\n\t\t\t$where .= $wpdb->prepare( \"AND tt.taxonomy = %s\", $taxonomy );\n\n\t\t\tif ( ! is_object_in_taxonomy( $post->post_type, $taxonomy ) )\n\t\t\t\treturn '';\n\t\t\t$term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );\n\n\t\t\t// Remove any exclusions from the term array to include.\n\t\t\t$term_array = array_diff( $term_array, (array) $excluded_terms );\n\t\t\t$term_array = array_map( 'intval', $term_array );\n\n\t\t\tif ( ! $term_array || is_wp_error( $term_array ) )\n\t\t\t\treturn '';\n\n\t\t\t$where .= \" AND tt.term_id IN (\" . implode( ',', $term_array ) . \")\";\n\t\t}\n\n\t\tif ( ! empty( $excluded_terms ) ) {\n\t\t\t$where .= \" AND p.ID NOT IN ( SELECT tr.object_id FROM $wpdb->term_relationships tr LEFT JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) WHERE tt.term_id IN (\" . implode( $excluded_terms, ',' ) . ') )';\n\t\t}\n\t}\n\n\t// 'post_status' clause depends on the current user.\n\tif ( is_user_logged_in() ) {\n\t\t$user_id = get_current_user_id();\n\n\t\t$post_type_object = get_post_type_object( $post->post_type );\n\t\tif ( empty( $post_type_object ) ) {\n\t\t\t$post_type_cap    = $post->post_type;\n\t\t\t$read_private_cap = 'read_private_' . $post_type_cap . 's';\n\t\t} else {\n\t\t\t$read_private_cap = $post_type_object->cap->read_private_posts;\n\t\t}\n\n\t\t/*\n\t\t * Results should include private posts belonging to the current user, or private posts where the\n\t\t * current user has the 'read_private_posts' cap.\n\t\t */\n\t\t$private_states = get_post_stati( array( 'private' => true ) );\n\t\t$where .= \" AND ( p.post_status = 'publish'\";\n\t\tforeach ( (array) $private_states as $state ) {\n\t\t\tif ( current_user_can( $read_private_cap ) ) {\n\t\t\t\t$where .= $wpdb->prepare( \" OR p.post_status = %s\", $state );\n\t\t\t} else {\n\t\t\t\t$where .= $wpdb->prepare( \" OR (p.post_author = %d AND p.post_status = %s)\", $user_id, $state );\n\t\t\t}\n\t\t}\n\t\t$where .= \" )\";\n\t} else {\n\t\t$where .= \" AND p.post_status = 'publish'\";\n\t}\n\n\t$adjacent = $previous ? 'previous' : 'next';\n\t$op = $previous ? '<' : '>';\n\t$order = $previous ? 'DESC' : 'ASC';\n\n\t/**\n\t * Filter the excluded term ids\n\t *\n\t * The dynamic portion of the hook name, `$adjacent`, refers to the type\n\t * of adjacency, 'next' or 'previous'.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $excluded_terms Array of excluded term IDs.\n\t */\n\t$excluded_terms = apply_filters( \"get_{$adjacent}_post_excluded_terms\", $excluded_terms );\n\n\t/**\n\t * Filter the JOIN clause in the SQL for an adjacent post query.\n\t *\n\t * The dynamic portion of the hook name, `$adjacent`, refers to the type\n\t * of adjacency, 'next' or 'previous'.\n\t *\n\t * @since 2.5.0\n\t * @since 4.4.0 Added the `$taxonomy` and `$post` parameters.\n\t *\n\t * @param string  $join           The JOIN clause in the SQL.\n\t * @param bool    $in_same_term   Whether post should be in a same taxonomy term.\n\t * @param array   $excluded_terms Array of excluded term IDs.\n\t * @param string  $taxonomy       Taxonomy. Used to identify the term used when `$in_same_term` is true.\n\t * @param WP_Post $post           WP_Post object.\n\t */\n\t$join = apply_filters( \"get_{$adjacent}_post_join\", $join, $in_same_term, $excluded_terms, $taxonomy, $post );\n\n\t/**\n\t * Filter the WHERE clause in the SQL for an adjacent post query.\n\t *\n\t * The dynamic portion of the hook name, `$adjacent`, refers to the type\n\t * of adjacency, 'next' or 'previous'.\n\t *\n\t * @since 2.5.0\n\t * @since 4.4.0 Added the `$taxonomy` and `$post` parameters.\n\t *\n\t * @param string $where          The `WHERE` clause in the SQL.\n\t * @param bool   $in_same_term   Whether post should be in a same taxonomy term.\n\t * @param array  $excluded_terms Array of excluded term IDs.\n\t * @param string $taxonomy       Taxonomy. Used to identify the term used when `$in_same_term` is true.\n\t * @param WP_Post $post           WP_Post object.\n\t */\n\t$where = apply_filters( \"get_{$adjacent}_post_where\", $wpdb->prepare( \"WHERE p.post_date $op %s AND p.post_type = %s $where\", $current_post_date, $post->post_type ), $in_same_term, $excluded_terms, $taxonomy, $post );\n\n\t/**\n\t * Filter the ORDER BY clause in the SQL for an adjacent post query.\n\t *\n\t * The dynamic portion of the hook name, `$adjacent`, refers to the type\n\t * of adjacency, 'next' or 'previous'.\n\t *\n\t * @since 2.5.0\n\t * @since 4.4.0 Added the `$post` parameter.\n\t *\n\t * @param string $order_by The `ORDER BY` clause in the SQL.\n\t * @param WP_Post $post    WP_Post object.\n\t */\n\t$sort  = apply_filters( \"get_{$adjacent}_post_sort\", \"ORDER BY p.post_date $order LIMIT 1\", $post );\n\n\t$query = \"SELECT p.ID FROM $wpdb->posts AS p $join $where $sort\";\n\t$query_key = 'adjacent_post_' . md5( $query );\n\t$result = wp_cache_get( $query_key, 'counts' );\n\tif ( false !== $result ) {\n\t\tif ( $result )\n\t\t\t$result = get_post( $result );\n\t\treturn $result;\n\t}\n\n\t$result = $wpdb->get_var( $query );\n\tif ( null === $result )\n\t\t$result = '';\n\n\twp_cache_set( $query_key, $result, 'counts' );\n\n\tif ( $result )\n\t\t$result = get_post( $result );\n\n\treturn $result;\n}\n\n/**\n * Get adjacent post relational link.\n *\n * Can either be next or previous post relational link.\n *\n * @since 2.8.0\n *\n * @param string       $title          Optional. Link title format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param bool         $previous       Optional. Whether to display link to previous or next post. Default true.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n * @return string|void The adjacent post relational link URL.\n */\nfunction get_adjacent_post_rel_link( $title = '%title', $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {\n\tif ( $previous && is_attachment() && $post = get_post() )\n\t\t$post = get_post( $post->post_parent );\n\telse\n\t\t$post = get_adjacent_post( $in_same_term, $excluded_terms, $previous, $taxonomy );\n\n\tif ( empty( $post ) )\n\t\treturn;\n\n\t$post_title = the_title_attribute( array( 'echo' => false, 'post' => $post ) );\n\n\tif ( empty( $post_title ) )\n\t\t$post_title = $previous ? __( 'Previous Post' ) : __( 'Next Post' );\n\n\t$date = mysql2date( get_option( 'date_format' ), $post->post_date );\n\n\t$title = str_replace( '%title', $post_title, $title );\n\t$title = str_replace( '%date', $date, $title );\n\n\t$link = $previous ? \"<link rel='prev' title='\" : \"<link rel='next' title='\";\n\t$link .= esc_attr( $title );\n\t$link .= \"' href='\" . get_permalink( $post ) . \"' />\\n\";\n\n\t$adjacent = $previous ? 'previous' : 'next';\n\n\t/**\n\t * Filter the adjacent post relational link.\n\t *\n\t * The dynamic portion of the hook name, `$adjacent`, refers to the type\n\t * of adjacency, 'next' or 'previous'.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $link The relational link.\n\t */\n\treturn apply_filters( \"{$adjacent}_post_rel_link\", $link );\n}\n\n/**\n * Display relational links for the posts adjacent to the current post.\n *\n * @since 2.8.0\n *\n * @param string       $title          Optional. Link title format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n */\nfunction adjacent_posts_rel_link( $title = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\techo get_adjacent_post_rel_link( $title, $in_same_term, $excluded_terms, true, $taxonomy );\n\techo get_adjacent_post_rel_link( $title, $in_same_term, $excluded_terms, false, $taxonomy );\n}\n\n/**\n * Display relational links for the posts adjacent to the current post for single post pages.\n *\n * This is meant to be attached to actions like 'wp_head'. Do not call this directly in plugins or theme templates.\n * @since 3.0.0\n *\n */\nfunction adjacent_posts_rel_link_wp_head() {\n\tif ( ! is_single() || is_attachment() ) {\n\t\treturn;\n\t}\n\tadjacent_posts_rel_link();\n}\n\n/**\n * Display relational link for the next post adjacent to the current post.\n *\n * @since 2.8.0\n *\n * @param string       $title          Optional. Link title format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n */\nfunction next_post_rel_link( $title = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\techo get_adjacent_post_rel_link( $title, $in_same_term, $excluded_terms, false, $taxonomy );\n}\n\n/**\n * Display relational link for the previous post adjacent to the current post.\n *\n * @since 2.8.0\n *\n * @param string       $title          Optional. Link title format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs. Default true.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n */\nfunction prev_post_rel_link( $title = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\techo get_adjacent_post_rel_link( $title, $in_same_term, $excluded_terms, true, $taxonomy );\n}\n\n/**\n * Retrieve boundary post.\n *\n * Boundary being either the first or last post by publish date within the constraints specified\n * by $in_same_term or $excluded_terms.\n *\n * @since 2.8.0\n *\n * @param bool         $in_same_term   Optional. Whether returned post should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param bool         $start          Optional. Whether to retrieve first or last post.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n * @return null|array Array containing the boundary post object if successful, null otherwise.\n */\nfunction get_boundary_post( $in_same_term = false, $excluded_terms = '', $start = true, $taxonomy = 'category' ) {\n\t$post = get_post();\n\tif ( ! $post || ! is_single() || is_attachment() || ! taxonomy_exists( $taxonomy ) )\n\t\treturn null;\n\n\t$query_args = array(\n\t\t'posts_per_page' => 1,\n\t\t'order' => $start ? 'ASC' : 'DESC',\n\t\t'update_post_term_cache' => false,\n\t\t'update_post_meta_cache' => false\n\t);\n\n\t$term_array = array();\n\n\tif ( ! is_array( $excluded_terms ) ) {\n\t\tif ( ! empty( $excluded_terms ) )\n\t\t\t$excluded_terms = explode( ',', $excluded_terms );\n\t\telse\n\t\t\t$excluded_terms = array();\n\t}\n\n\tif ( $in_same_term || ! empty( $excluded_terms ) ) {\n\t\tif ( $in_same_term )\n\t\t\t$term_array = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'ids' ) );\n\n\t\tif ( ! empty( $excluded_terms ) ) {\n\t\t\t$excluded_terms = array_map( 'intval', $excluded_terms );\n\t\t\t$excluded_terms = array_diff( $excluded_terms, $term_array );\n\n\t\t\t$inverse_terms = array();\n\t\t\tforeach ( $excluded_terms as $excluded_term )\n\t\t\t\t$inverse_terms[] = $excluded_term * -1;\n\t\t\t$excluded_terms = $inverse_terms;\n\t\t}\n\n\t\t$query_args[ 'tax_query' ] = array( array(\n\t\t\t'taxonomy' => $taxonomy,\n\t\t\t'terms' => array_merge( $term_array, $excluded_terms )\n\t\t) );\n\t}\n\n\treturn get_posts( $query_args );\n}\n\n/*\n * Get previous post link that is adjacent to the current post.\n *\n * @since 3.7.0\n *\n * @param string       $format         Optional. Link anchor format.\n * @param string       $link           Optional. Link permalink format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n * @return string The link URL of the previous post in relation to the current post.\n */\nfunction get_previous_post_link( $format = '&laquo; %link', $link = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\treturn get_adjacent_post_link( $format, $link, $in_same_term, $excluded_terms, true, $taxonomy );\n}\n\n/**\n * Display previous post link that is adjacent to the current post.\n *\n * @since 1.5.0\n * @see get_previous_post_link()\n *\n * @param string       $format         Optional. Link anchor format.\n * @param string       $link           Optional. Link permalink format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n */\nfunction previous_post_link( $format = '&laquo; %link', $link = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\techo get_previous_post_link( $format, $link, $in_same_term, $excluded_terms, $taxonomy );\n}\n\n/**\n * Get next post link that is adjacent to the current post.\n *\n * @since 3.7.0\n *\n * @param string       $format         Optional. Link anchor format.\n * @param string       $link           Optional. Link permalink format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n * @return string The link URL of the next post in relation to the current post.\n */\nfunction get_next_post_link( $format = '%link &raquo;', $link = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\treturn get_adjacent_post_link( $format, $link, $in_same_term, $excluded_terms, false, $taxonomy );\n}\n\n/**\n * Display next post link that is adjacent to the current post.\n *\n * @since 1.5.0\n * @see get_next_post_link()\n *\n * @param string       $format         Optional. Link anchor format.\n * @param string       $link           Optional. Link permalink format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n */\nfunction next_post_link( $format = '%link &raquo;', $link = '%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {\n\t echo get_next_post_link( $format, $link, $in_same_term, $excluded_terms, $taxonomy );\n}\n\n/**\n * Get adjacent post link.\n *\n * Can be either next post link or previous.\n *\n * @since 3.7.0\n *\n * @param string       $format         Link anchor format.\n * @param string       $link           Link permalink format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded terms IDs.\n * @param bool         $previous       Optional. Whether to display link to previous or next post. Default true.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n * @return string The link URL of the previous or next post in relation to the current post.\n */\nfunction get_adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {\n\tif ( $previous && is_attachment() )\n\t\t$post = get_post( get_post()->post_parent );\n\telse\n\t\t$post = get_adjacent_post( $in_same_term, $excluded_terms, $previous, $taxonomy );\n\n\tif ( ! $post ) {\n\t\t$output = '';\n\t} else {\n\t\t$title = $post->post_title;\n\n\t\tif ( empty( $post->post_title ) )\n\t\t\t$title = $previous ? __( 'Previous Post' ) : __( 'Next Post' );\n\n\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t$title = apply_filters( 'the_title', $title, $post->ID );\n\n\t\t$date = mysql2date( get_option( 'date_format' ), $post->post_date );\n\t\t$rel = $previous ? 'prev' : 'next';\n\n\t\t$string = '<a href=\"' . get_permalink( $post ) . '\" rel=\"'.$rel.'\">';\n\t\t$inlink = str_replace( '%title', $title, $link );\n\t\t$inlink = str_replace( '%date', $date, $inlink );\n\t\t$inlink = $string . $inlink . '</a>';\n\n\t\t$output = str_replace( '%link', $inlink, $format );\n\t}\n\n\t$adjacent = $previous ? 'previous' : 'next';\n\n\t/**\n\t * Filter the adjacent post link.\n\t *\n\t * The dynamic portion of the hook name, `$adjacent`, refers to the type\n\t * of adjacency, 'next' or 'previous'.\n\t *\n\t * @since 2.6.0\n\t * @since 4.2.0 Added the `$adjacent` parameter.\n\t *\n\t * @param string  $output   The adjacent post link.\n\t * @param string  $format   Link anchor format.\n\t * @param string  $link     Link permalink format.\n\t * @param WP_Post $post     The adjacent post.\n\t * @param string  $adjacent Whether the post is previous or next.\n\t */\n\treturn apply_filters( \"{$adjacent}_post_link\", $output, $format, $link, $post, $adjacent );\n}\n\n/**\n * Display adjacent post link.\n *\n * Can be either next post link or previous.\n *\n * @since 2.5.0\n *\n * @param string       $format         Link anchor format.\n * @param string       $link           Link permalink format.\n * @param bool         $in_same_term   Optional. Whether link should be in a same taxonomy term.\n * @param array|string $excluded_terms Optional. Array or comma-separated list of excluded category IDs.\n * @param bool         $previous       Optional. Whether to display link to previous or next post. Default true.\n * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.\n */\nfunction adjacent_post_link( $format, $link, $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {\n\techo get_adjacent_post_link( $format, $link, $in_same_term, $excluded_terms, $previous, $taxonomy );\n}\n\n/**\n * Retrieve links for page numbers.\n *\n * @since 1.5.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param int  $pagenum Optional. Page ID.\n * @param bool $escape  Optional. Whether to escape the URL for display, with esc_url(). Defaults to true.\n * \t                    Otherwise, prepares the URL with esc_url_raw().\n * @return string The link URL for the given page number.\n */\nfunction get_pagenum_link($pagenum = 1, $escape = true ) {\n\tglobal $wp_rewrite;\n\n\t$pagenum = (int) $pagenum;\n\n\t$request = remove_query_arg( 'paged' );\n\n\t$home_root = parse_url(home_url());\n\t$home_root = ( isset($home_root['path']) ) ? $home_root['path'] : '';\n\t$home_root = preg_quote( $home_root, '|' );\n\n\t$request = preg_replace('|^'. $home_root . '|i', '', $request);\n\t$request = preg_replace('|^/+|', '', $request);\n\n\tif ( !$wp_rewrite->using_permalinks() || is_admin() ) {\n\t\t$base = trailingslashit( get_bloginfo( 'url' ) );\n\n\t\tif ( $pagenum > 1 ) {\n\t\t\t$result = add_query_arg( 'paged', $pagenum, $base . $request );\n\t\t} else {\n\t\t\t$result = $base . $request;\n\t\t}\n\t} else {\n\t\t$qs_regex = '|\\?.*?$|';\n\t\tpreg_match( $qs_regex, $request, $qs_match );\n\n\t\tif ( !empty( $qs_match[0] ) ) {\n\t\t\t$query_string = $qs_match[0];\n\t\t\t$request = preg_replace( $qs_regex, '', $request );\n\t\t} else {\n\t\t\t$query_string = '';\n\t\t}\n\n\t\t$request = preg_replace( \"|$wp_rewrite->pagination_base/\\d+/?$|\", '', $request);\n\t\t$request = preg_replace( '|^' . preg_quote( $wp_rewrite->index, '|' ) . '|i', '', $request);\n\t\t$request = ltrim($request, '/');\n\n\t\t$base = trailingslashit( get_bloginfo( 'url' ) );\n\n\t\tif ( $wp_rewrite->using_index_permalinks() && ( $pagenum > 1 || '' != $request ) )\n\t\t\t$base .= $wp_rewrite->index . '/';\n\n\t\tif ( $pagenum > 1 ) {\n\t\t\t$request = ( ( !empty( $request ) ) ? trailingslashit( $request ) : $request ) . user_trailingslashit( $wp_rewrite->pagination_base . \"/\" . $pagenum, 'paged' );\n\t\t}\n\n\t\t$result = $base . $request . $query_string;\n\t}\n\n\t/**\n\t * Filter the page number link for the current request.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $result The page number link.\n\t */\n\t$result = apply_filters( 'get_pagenum_link', $result );\n\n\tif ( $escape )\n\t\treturn esc_url( $result );\n\telse\n\t\treturn esc_url_raw( $result );\n}\n\n/**\n * Retrieve next posts page link.\n *\n * Backported from 2.1.3 to 2.0.10.\n *\n * @since 2.0.10\n *\n * @global int $paged\n *\n * @param int $max_page Optional. Max pages.\n * @return string|void The link URL for next posts page.\n */\nfunction get_next_posts_page_link($max_page = 0) {\n\tglobal $paged;\n\n\tif ( !is_single() ) {\n\t\tif ( !$paged )\n\t\t\t$paged = 1;\n\t\t$nextpage = intval($paged) + 1;\n\t\tif ( !$max_page || $max_page >= $nextpage )\n\t\t\treturn get_pagenum_link($nextpage);\n\t}\n}\n\n/**\n * Display or return the next posts page link.\n *\n * @since 0.71\n *\n * @param int   $max_page Optional. Max pages.\n * @param bool  $echo     Optional. Echo or return;\n * @return string|void The link URL for next posts page if `$echo = false`.\n */\nfunction next_posts( $max_page = 0, $echo = true ) {\n\t$output = esc_url( get_next_posts_page_link( $max_page ) );\n\n\tif ( $echo )\n\t\techo $output;\n\telse\n\t\treturn $output;\n}\n\n/**\n * Return the next posts page link.\n *\n * @since 2.7.0\n *\n * @global int      $paged\n * @global WP_Query $wp_query\n *\n * @param string $label    Content for link text.\n * @param int    $max_page Optional. Max pages.\n * @return string|void HTML-formatted next posts page link.\n */\nfunction get_next_posts_link( $label = null, $max_page = 0 ) {\n\tglobal $paged, $wp_query;\n\n\tif ( !$max_page )\n\t\t$max_page = $wp_query->max_num_pages;\n\n\tif ( !$paged )\n\t\t$paged = 1;\n\n\t$nextpage = intval($paged) + 1;\n\n\tif ( null === $label )\n\t\t$label = __( 'Next Page &raquo;' );\n\n\tif ( !is_single() && ( $nextpage <= $max_page ) ) {\n\t\t/**\n\t\t * Filter the anchor tag attributes for the next posts page link.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param string $attributes Attributes for the anchor tag.\n\t\t */\n\t\t$attr = apply_filters( 'next_posts_link_attributes', '' );\n\n\t\treturn '<a href=\"' . next_posts( $max_page, false ) . \"\\\" $attr>\" . preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label) . '</a>';\n\t}\n}\n\n/**\n * Display the next posts page link.\n *\n * @since 0.71\n *\n * @param string $label    Content for link text.\n * @param int    $max_page Optional. Max pages.\n */\nfunction next_posts_link( $label = null, $max_page = 0 ) {\n\techo get_next_posts_link( $label, $max_page );\n}\n\n/**\n * Retrieve previous posts page link.\n *\n * Will only return string, if not on a single page or post.\n *\n * Backported to 2.0.10 from 2.1.3.\n *\n * @since 2.0.10\n *\n * @global int $paged\n *\n * @return string|void The link for the previous posts page.\n */\nfunction get_previous_posts_page_link() {\n\tglobal $paged;\n\n\tif ( !is_single() ) {\n\t\t$nextpage = intval($paged) - 1;\n\t\tif ( $nextpage < 1 )\n\t\t\t$nextpage = 1;\n\t\treturn get_pagenum_link($nextpage);\n\t}\n}\n\n/**\n * Display or return the previous posts page link.\n *\n * @since 0.71\n *\n * @param bool $echo Optional. Echo or return;\n * @return string|void The previous posts page link if `$echo = false`.\n */\nfunction previous_posts( $echo = true ) {\n\t$output = esc_url( get_previous_posts_page_link() );\n\n\tif ( $echo )\n\t\techo $output;\n\telse\n\t\treturn $output;\n}\n\n/**\n * Return the previous posts page link.\n *\n * @since 2.7.0\n *\n * @global int $paged\n *\n * @param string $label Optional. Previous page link text.\n * @return string|void HTML-formatted previous page link.\n */\nfunction get_previous_posts_link( $label = null ) {\n\tglobal $paged;\n\n\tif ( null === $label )\n\t\t$label = __( '&laquo; Previous Page' );\n\n\tif ( !is_single() && $paged > 1 ) {\n\t\t/**\n\t\t * Filter the anchor tag attributes for the previous posts page link.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param string $attributes Attributes for the anchor tag.\n\t\t */\n\t\t$attr = apply_filters( 'previous_posts_link_attributes', '' );\n\t\treturn '<a href=\"' . previous_posts( false ) . \"\\\" $attr>\". preg_replace( '/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label ) .'</a>';\n\t}\n}\n\n/**\n * Display the previous posts page link.\n *\n * @since 0.71\n *\n * @param string $label Optional. Previous page link text.\n */\nfunction previous_posts_link( $label = null ) {\n\techo get_previous_posts_link( $label );\n}\n\n/**\n * Return post pages link navigation for previous and next pages.\n *\n * @since 2.8.0\n *\n * @global WP_Query $wp_query\n *\n * @param string|array $args Optional args.\n * @return string The posts link navigation.\n */\nfunction get_posts_nav_link( $args = array() ) {\n\tglobal $wp_query;\n\n\t$return = '';\n\n\tif ( !is_singular() ) {\n\t\t$defaults = array(\n\t\t\t'sep' => ' &#8212; ',\n\t\t\t'prelabel' => __('&laquo; Previous Page'),\n\t\t\t'nxtlabel' => __('Next Page &raquo;'),\n\t\t);\n\t\t$args = wp_parse_args( $args, $defaults );\n\n\t\t$max_num_pages = $wp_query->max_num_pages;\n\t\t$paged = get_query_var('paged');\n\n\t\t//only have sep if there's both prev and next results\n\t\tif ($paged < 2 || $paged >= $max_num_pages) {\n\t\t\t$args['sep'] = '';\n\t\t}\n\n\t\tif ( $max_num_pages > 1 ) {\n\t\t\t$return = get_previous_posts_link($args['prelabel']);\n\t\t\t$return .= preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $args['sep']);\n\t\t\t$return .= get_next_posts_link($args['nxtlabel']);\n\t\t}\n\t}\n\treturn $return;\n\n}\n\n/**\n * Display post pages link navigation for previous and next pages.\n *\n * @since 0.71\n *\n * @param string $sep      Optional. Separator for posts navigation links.\n * @param string $prelabel Optional. Label for previous pages.\n * @param string $nxtlabel Optional Label for next pages.\n */\nfunction posts_nav_link( $sep = '', $prelabel = '', $nxtlabel = '' ) {\n\t$args = array_filter( compact('sep', 'prelabel', 'nxtlabel') );\n\techo get_posts_nav_link($args);\n}\n\n/**\n * Return navigation to next/previous post when applicable.\n *\n * @since 4.1.0\n * @since 4.4.0 Introduced the `in_same_term`, `excluded_terms`, and `taxonomy` arguments.\n *\n * @param array $args {\n *     Optional. Default post navigation arguments. Default empty array.\n *\n *     @type string       $prev_text          Anchor text to display in the previous post link. Default '%title'.\n *     @type string       $next_text          Anchor text to display in the next post link. Default '%title'.\n *     @type bool         $in_same_term       Whether link should be in a same taxonomy term. Default false.\n *     @type array|string $excluded_terms     Array or comma-separated list of excluded term IDs. Default empty.\n *     @type string       $taxonomy           Taxonomy, if `$in_same_term` is true. Default 'category'.\n *     @type string       $screen_reader_text Screen reader text for nav element. Default 'Post navigation'.\n * }\n * @return string Markup for post links.\n */\nfunction get_the_post_navigation( $args = array() ) {\n\t$args = wp_parse_args( $args, array(\n\t\t'prev_text'          => '%title',\n\t\t'next_text'          => '%title',\n\t\t'in_same_term'       => false,\n\t\t'excluded_terms'     => '',\n\t\t'taxonomy'           => 'category',\n\t\t'screen_reader_text' => __( 'Post navigation' ),\n\t) );\n\n\t$navigation = '';\n\n\t$previous = get_previous_post_link(\n\t\t'<div class=\"nav-previous\">%link</div>',\n\t\t$args['prev_text'],\n\t\t$args['in_same_term'],\n\t\t$args['excluded_terms'],\n\t\t$args['taxonomy']\n\t);\n\n\t$next = get_next_post_link(\n\t\t'<div class=\"nav-next\">%link</div>',\n\t\t$args['next_text'],\n\t\t$args['in_same_term'],\n\t\t$args['excluded_terms'],\n\t\t$args['taxonomy']\n\t);\n\n\t// Only add markup if there's somewhere to navigate to.\n\tif ( $previous || $next ) {\n\t\t$navigation = _navigation_markup( $previous . $next, 'post-navigation', $args['screen_reader_text'] );\n\t}\n\n\treturn $navigation;\n}\n\n/**\n * Display navigation to next/previous post when applicable.\n *\n * @since 4.1.0\n *\n * @param array $args Optional. See {@see get_the_post_navigation()} for available\n *                    arguments. Default empty array.\n */\nfunction the_post_navigation( $args = array() ) {\n\techo get_the_post_navigation( $args );\n}\n\n/**\n * Return navigation to next/previous set of posts when applicable.\n *\n * @since 4.1.0\n *\n * @global WP_Query $wp_query WordPress Query object.\n *\n * @param array $args {\n *     Optional. Default posts navigation arguments. Default empty array.\n *\n *     @type string $prev_text          Anchor text to display in the previous posts link.\n *                                      Default 'Older posts'.\n *     @type string $next_text          Anchor text to display in the next posts link.\n *                                      Default 'Newer posts'.\n *     @type string $screen_reader_text Screen reader text for nav element.\n *                                      Default 'Posts navigation'.\n * }\n * @return string Markup for posts links.\n */\nfunction get_the_posts_navigation( $args = array() ) {\n\t$navigation = '';\n\n\t// Don't print empty markup if there's only one page.\n\tif ( $GLOBALS['wp_query']->max_num_pages > 1 ) {\n\t\t$args = wp_parse_args( $args, array(\n\t\t\t'prev_text'          => __( 'Older posts' ),\n\t\t\t'next_text'          => __( 'Newer posts' ),\n\t\t\t'screen_reader_text' => __( 'Posts navigation' ),\n\t\t) );\n\n\t\t$next_link = get_previous_posts_link( $args['next_text'] );\n\t\t$prev_link = get_next_posts_link( $args['prev_text'] );\n\n\t\tif ( $prev_link ) {\n\t\t\t$navigation .= '<div class=\"nav-previous\">' . $prev_link . '</div>';\n\t\t}\n\n\t\tif ( $next_link ) {\n\t\t\t$navigation .= '<div class=\"nav-next\">' . $next_link . '</div>';\n\t\t}\n\n\t\t$navigation = _navigation_markup( $navigation, 'posts-navigation', $args['screen_reader_text'] );\n\t}\n\n\treturn $navigation;\n}\n\n/**\n * Display navigation to next/previous set of posts when applicable.\n *\n * @since 4.1.0\n *\n * @param array $args Optional. See {@see get_the_posts_navigation()} for available\n *                    arguments. Default empty array.\n */\nfunction the_posts_navigation( $args = array() ) {\n\techo get_the_posts_navigation( $args );\n}\n\n/**\n * Return a paginated navigation to next/previous set of posts,\n * when applicable.\n *\n * @since 4.1.0\n *\n * @param array $args {\n *     Optional. Default pagination arguments, {@see paginate_links()}.\n *\n *     @type string $screen_reader_text Screen reader text for navigation element.\n *                                      Default 'Posts navigation'.\n * }\n * @return string Markup for pagination links.\n */\nfunction get_the_posts_pagination( $args = array() ) {\n\t$navigation = '';\n\n\t// Don't print empty markup if there's only one page.\n\tif ( $GLOBALS['wp_query']->max_num_pages > 1 ) {\n\t\t$args = wp_parse_args( $args, array(\n\t\t\t'mid_size'           => 1,\n\t\t\t'prev_text'          => _x( 'Previous', 'previous post' ),\n\t\t\t'next_text'          => _x( 'Next', 'next post' ),\n\t\t\t'screen_reader_text' => __( 'Posts navigation' ),\n\t\t) );\n\n\t\t// Make sure we get a string back. Plain is the next best thing.\n\t\tif ( isset( $args['type'] ) && 'array' == $args['type'] ) {\n\t\t\t$args['type'] = 'plain';\n\t\t}\n\n\t\t// Set up paginated links.\n\t\t$links = paginate_links( $args );\n\n\t\tif ( $links ) {\n\t\t\t$navigation = _navigation_markup( $links, 'pagination', $args['screen_reader_text'] );\n\t\t}\n\t}\n\n\treturn $navigation;\n}\n\n/**\n * Display a paginated navigation to next/previous set of posts,\n * when applicable.\n *\n * @since 4.1.0\n *\n * @param array $args Optional. See {@see get_the_posts_pagination()} for available arguments.\n *                    Default empty array.\n */\nfunction the_posts_pagination( $args = array() ) {\n\techo get_the_posts_pagination( $args );\n}\n\n/**\n * Wraps passed links in navigational markup.\n *\n * @since 4.1.0\n * @access private\n *\n * @param string $links              Navigational links.\n * @param string $class              Optional. Custom class for nav element. Default: 'posts-navigation'.\n * @param string $screen_reader_text Optional. Screen reader text for nav element. Default: 'Posts navigation'.\n * @return string Navigation template tag.\n */\nfunction _navigation_markup( $links, $class = 'posts-navigation', $screen_reader_text = '' ) {\n\tif ( empty( $screen_reader_text ) ) {\n\t\t$screen_reader_text = __( 'Posts navigation' );\n\t}\n\n\t$template = '\n\t<nav class=\"navigation %1$s\" role=\"navigation\">\n\t\t<h2 class=\"screen-reader-text\">%2$s</h2>\n\t\t<div class=\"nav-links\">%3$s</div>\n\t</nav>';\n\n\t/**\n\t * Filter the navigation markup template.\n\t *\n\t * Note: The filtered template HTML must contain specifiers for the navigation\n\t * class (%1$s), the screen-reader-text value (%2$s), and placement of the\n\t * navigation links (%3$s):\n\t *\n\t *     <nav class=\"navigation %1$s\" role=\"navigation\">\n\t *         <h2 class=\"screen-reader-text\">%2$s</h2>\n\t *         <div class=\"nav-links\">%3$s</div>\n\t *     </nav>\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $template The default template.\n\t * @param string $class    The class passed by the calling function.\n\t * @return string Navigation template.\n\t */\n\t$template = apply_filters( 'navigation_markup_template', $template, $class );\n\n\treturn sprintf( $template, sanitize_html_class( $class ), esc_html( $screen_reader_text ), $links );\n}\n\n/**\n * Retrieve comments page number link.\n *\n * @since 2.7.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param int $pagenum  Optional. Page number.\n * @param int $max_page Optional. The maximum number of comment pages.\n * @return string The comments page number link URL.\n */\nfunction get_comments_pagenum_link( $pagenum = 1, $max_page = 0 ) {\n\tglobal $wp_rewrite;\n\n\t$pagenum = (int) $pagenum;\n\n\t$result = get_permalink();\n\n\tif ( 'newest' == get_option('default_comments_page') ) {\n\t\tif ( $pagenum != $max_page ) {\n\t\t\tif ( $wp_rewrite->using_permalinks() )\n\t\t\t\t$result = user_trailingslashit( trailingslashit($result) . $wp_rewrite->comments_pagination_base . '-' . $pagenum, 'commentpaged');\n\t\t\telse\n\t\t\t\t$result = add_query_arg( 'cpage', $pagenum, $result );\n\t\t}\n\t} elseif ( $pagenum > 1 ) {\n\t\tif ( $wp_rewrite->using_permalinks() )\n\t\t\t$result = user_trailingslashit( trailingslashit($result) . $wp_rewrite->comments_pagination_base . '-' . $pagenum, 'commentpaged');\n\t\telse\n\t\t\t$result = add_query_arg( 'cpage', $pagenum, $result );\n\t}\n\n\t$result .= '#comments';\n\n\t/**\n\t * Filter the comments page number link for the current request.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $result The comments page number link.\n\t */\n\treturn apply_filters( 'get_comments_pagenum_link', $result );\n}\n\n/**\n * Return the link to next comments page.\n *\n * @since 2.7.1\n *\n * @global WP_Query $wp_query\n *\n * @param string $label    Optional. Label for link text.\n * @param int    $max_page Optional. Max page.\n * @return string|void HTML-formatted link for the next page of comments.\n */\nfunction get_next_comments_link( $label = '', $max_page = 0 ) {\n\tglobal $wp_query;\n\n\tif ( ! is_singular() )\n\t\treturn;\n\n\t$page = get_query_var('cpage');\n\n\tif ( ! $page ) {\n\t\t$page = 1;\n\t}\n\n\t$nextpage = intval($page) + 1;\n\n\tif ( empty($max_page) )\n\t\t$max_page = $wp_query->max_num_comment_pages;\n\n\tif ( empty($max_page) )\n\t\t$max_page = get_comment_pages_count();\n\n\tif ( $nextpage > $max_page )\n\t\treturn;\n\n\tif ( empty($label) )\n\t\t$label = __('Newer Comments &raquo;');\n\n\t/**\n\t * Filter the anchor tag attributes for the next comments page link.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $attributes Attributes for the anchor tag.\n\t */\n\treturn '<a href=\"' . esc_url( get_comments_pagenum_link( $nextpage, $max_page ) ) . '\" ' . apply_filters( 'next_comments_link_attributes', '' ) . '>'. preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label) .'</a>';\n}\n\n/**\n * Display the link to next comments page.\n *\n * @since 2.7.0\n *\n * @param string $label    Optional. Label for link text.\n * @param int    $max_page Optional. Max page.\n */\nfunction next_comments_link( $label = '', $max_page = 0 ) {\n\techo get_next_comments_link( $label, $max_page );\n}\n\n/**\n * Return the previous comments page link.\n *\n * @since 2.7.1\n *\n * @param string $label Optional. Label for comments link text.\n * @return string|void HTML-formatted link for the previous page of comments.\n */\nfunction get_previous_comments_link( $label = '' ) {\n\tif ( ! is_singular() )\n\t\treturn;\n\n\t$page = get_query_var('cpage');\n\n\tif ( intval($page) <= 1 )\n\t\treturn;\n\n\t$prevpage = intval($page) - 1;\n\n\tif ( empty($label) )\n\t\t$label = __('&laquo; Older Comments');\n\n\t/**\n\t * Filter the anchor tag attributes for the previous comments page link.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $attributes Attributes for the anchor tag.\n\t */\n\treturn '<a href=\"' . esc_url( get_comments_pagenum_link( $prevpage ) ) . '\" ' . apply_filters( 'previous_comments_link_attributes', '' ) . '>' . preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&#038;$1', $label) .'</a>';\n}\n\n/**\n * Display the previous comments page link.\n *\n * @since 2.7.0\n *\n * @param string $label Optional. Label for comments link text.\n */\nfunction previous_comments_link( $label = '' ) {\n\techo get_previous_comments_link( $label );\n}\n\n/**\n * Create pagination links for the comments on the current post.\n *\n * @see paginate_links()\n * @since 2.7.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string|array $args Optional args. See paginate_links().\n * @return string|void Markup for pagination links.\n*/\nfunction paginate_comments_links($args = array()) {\n\tglobal $wp_rewrite;\n\n\tif ( ! is_singular() )\n\t\treturn;\n\n\t$page = get_query_var('cpage');\n\tif ( !$page )\n\t\t$page = 1;\n\t$max_page = get_comment_pages_count();\n\t$defaults = array(\n\t\t'base' => add_query_arg( 'cpage', '%#%' ),\n\t\t'format' => '',\n\t\t'total' => $max_page,\n\t\t'current' => $page,\n\t\t'echo' => true,\n\t\t'add_fragment' => '#comments'\n\t);\n\tif ( $wp_rewrite->using_permalinks() )\n\t\t$defaults['base'] = user_trailingslashit(trailingslashit(get_permalink()) . $wp_rewrite->comments_pagination_base . '-%#%', 'commentpaged');\n\n\t$args = wp_parse_args( $args, $defaults );\n\t$page_links = paginate_links( $args );\n\n\tif ( $args['echo'] )\n\t\techo $page_links;\n\telse\n\t\treturn $page_links;\n}\n\n/**\n * Returns navigation to next/previous set of comments when applicable.\n *\n * @since 4.4.0\n *\n * @param array $args {\n *     Optional. Default comments navigation arguments.\n *\n *     @type string $prev_text          Anchor text to display in the previous comments link. Default 'Older comments'.\n *     @type string $next_text          Anchor text to display in the next comments link. Default 'Newer comments'.\n *     @type string $screen_reader_text Screen reader text for nav element. Default 'Comments navigation'.\n * }\n * @return string Markup for comments links.\n */\nfunction get_the_comments_navigation( $args = array() ) {\n\t$navigation = '';\n\n\t// Are there comments to navigate through?\n\tif ( get_comment_pages_count() > 1 ) {\n\t\t$args = wp_parse_args( $args, array(\n\t\t\t'prev_text'          => __( 'Older comments' ),\n\t\t\t'next_text'          => __( 'Newer comments' ),\n\t\t\t'screen_reader_text' => __( 'Comments navigation' ),\n\t\t) );\n\n\t\t$prev_link = get_previous_comments_link( $args['prev_text'] );\n\t\t$next_link = get_next_comments_link( $args['next_text'] );\n\n\t\tif ( $prev_link ) {\n\t\t\t$navigation .= '<div class=\"nav-previous\">' . $prev_link . '</div>';\n\t\t}\n\n\t\tif ( $next_link ) {\n\t\t\t$navigation .= '<div class=\"nav-next\">' . $next_link . '</div>';\n\t\t}\n\n\t\t$navigation = _navigation_markup( $navigation, 'comment-navigation', $args['screen_reader_text'] );\n\t}\n\n\treturn $navigation;\n}\n\n/**\n * Displays navigation to next/previous set of comments when applicable.\n *\n * @since 4.4.0\n *\n * @param array $args See {@see get_the_comments_navigation()} for available arguments.\n */\nfunction the_comments_navigation( $args = array() ) {\n\techo get_the_comments_navigation( $args );\n}\n\n/**\n * Returns a paginated navigation to next/previous set of comments,\n * when applicable.\n *\n * @since 4.4.0\n *\n * @see paginate_comments_links()\n *\n * @param array $args {\n *     Optional. Default pagination arguments.\n *\n *     @type string $screen_reader_text Screen reader text for nav element. Default 'Comments navigation'.\n * }\n * @return string Markup for pagination links.\n */\nfunction get_the_comments_pagination( $args = array() ) {\n\t$navigation = '';\n\t$args       = wp_parse_args( $args, array(\n\t\t'screen_reader_text' => __( 'Comments navigation' ),\n\t) );\n\t$args['echo'] = false;\n\n\t// Make sure we get plain links, so we get a string we can work with.\n\t$args['type'] = 'plain';\n\n\t$links = paginate_comments_links( $args );\n\n\tif ( $links ) {\n\t\t$navigation = _navigation_markup( $links, 'comments-pagination', $args['screen_reader_text'] );\n\t}\n\n\treturn $navigation;\n}\n\n/**\n * Displays a paginated navigation to next/previous set of comments,\n * when applicable.\n *\n * @since 4.4.0\n *\n * @param array $args See {@see get_the_comments_pagination()} for available arguments.\n */\nfunction the_comments_pagination( $args = array() ) {\n\techo get_the_comments_pagination( $args );\n}\n\n/**\n * Retrieve the Press This bookmarklet link.\n *\n * Use this in 'a' element 'href' attribute.\n *\n * @since 2.6.0\n *\n * @global bool          $is_IE\n * @global string        $wp_version\n * @global WP_Press_This $wp_press_this\n *\n * @return string The Press This bookmarklet link URL.\n */\nfunction get_shortcut_link() {\n\tglobal $is_IE, $wp_version;\n\n\tinclude_once( ABSPATH . 'wp-admin/includes/class-wp-press-this.php' );\n\t$bookmarklet_version = $GLOBALS['wp_press_this']->version;\n\t$link = '';\n\n\tif ( $is_IE ) {\n\t\t/**\n\t\t * Return the old/shorter bookmarklet code for MSIE 8 and lower,\n\t\t * since they only support a max length of ~2000 characters for\n\t\t * bookmark[let] URLs, which is way to small for our smarter one.\n\t\t * Do update the version number so users do not get the \"upgrade your\n\t\t * bookmarklet\" notice when using PT in those browsers.\n\t\t */\n\t\t$ua = $_SERVER['HTTP_USER_AGENT'];\n\n\t\tif ( ! empty( $ua ) && preg_match( '/\\bMSIE (\\d)/', $ua, $matches ) && (int) $matches[1] <= 8 ) {\n\t\t\t$url = wp_json_encode( admin_url( 'press-this.php' ) );\n\n\t\t\t$link = 'javascript:var d=document,w=window,e=w.getSelection,k=d.getSelection,x=d.selection,' .\n\t\t\t\t's=(e?e():(k)?k():(x?x.createRange().text:0)),f=' . $url . ',l=d.location,e=encodeURIComponent,' .\n\t\t\t\t'u=f+\"?u=\"+e(l.href)+\"&t=\"+e(d.title)+\"&s=\"+e(s)+\"&v=' . $bookmarklet_version . '\";' .\n\t\t\t\t'a=function(){if(!w.open(u,\"t\",\"toolbar=0,resizable=1,scrollbars=1,status=1,width=600,height=700\"))l.href=u;};' .\n\t\t\t\t'if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else a();void(0)';\n\t\t}\n\t}\n\n\tif ( empty( $link ) ) {\n\t\t$src = @file_get_contents( ABSPATH . 'wp-admin/js/bookmarklet.min.js' );\n\n\t\tif ( $src ) {\n\t\t\t$url = wp_json_encode( admin_url( 'press-this.php' ) . '?v=' . $bookmarklet_version );\n\t\t\t$link = 'javascript:' . str_replace( 'window.pt_url', $url, $src );\n\t\t}\n\t}\n\n\t$link = str_replace( array( \"\\r\", \"\\n\", \"\\t\" ),  '', $link );\n\n\t/**\n\t * Filter the Press This bookmarklet link.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string $link The Press This bookmarklet link.\n\t */\n\treturn apply_filters( 'shortcut_link', $link );\n}\n\n/**\n * Retrieve the home url for the current site.\n *\n * Returns the 'home' option with the appropriate protocol, 'https' if\n * {@see is_ssl()} and 'http' otherwise. If `$scheme` is 'http' or 'https',\n * `is_ssl()` is overridden.\n *\n * @since 3.0.0\n *\n * @param  string      $path   Optional. Path relative to the home url. Default empty.\n * @param  string|null $scheme Optional. Scheme to give the home url context. Accepts\n *                             'http', 'https', 'relative', 'rest', or null. Default null.\n * @return string Home url link with optional path appended.\n*/\nfunction home_url( $path = '', $scheme = null ) {\n\treturn get_home_url( null, $path, $scheme );\n}\n\n/**\n * Retrieve the home url for a given site.\n *\n * Returns the 'home' option with the appropriate protocol, 'https' if\n * {@see is_ssl()} and 'http' otherwise. If `$scheme` is 'http' or 'https',\n * `is_ssl()` is\n * overridden.\n *\n * @since 3.0.0\n *\n * @global string $pagenow\n *\n * @param  int         $blog_id     Optional. Blog ID. Default null (current blog).\n * @param  string      $path        Optional. Path relative to the home URL. Default empty.\n * @param  string|null $orig_scheme Optional. Scheme to give the home URL context. Accepts\n *                                  'http', 'https', 'relative', 'rest', or null. Default null.\n * @return string Home URL link with optional path appended.\n*/\nfunction get_home_url( $blog_id = null, $path = '', $scheme = null ) {\n\tglobal $pagenow;\n\n\t$orig_scheme = $scheme;\n\n\tif ( empty( $blog_id ) || !is_multisite() ) {\n\t\t$url = get_option( 'home' );\n\t} else {\n\t\tswitch_to_blog( $blog_id );\n\t\t$url = get_option( 'home' );\n\t\trestore_current_blog();\n\t}\n\n\tif ( ! in_array( $scheme, array( 'http', 'https', 'relative' ) ) ) {\n\t\tif ( is_ssl() && ! is_admin() && 'wp-login.php' !== $pagenow )\n\t\t\t$scheme = 'https';\n\t\telse\n\t\t\t$scheme = parse_url( $url, PHP_URL_SCHEME );\n\t}\n\n\t$url = set_url_scheme( $url, $scheme );\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= '/' . ltrim( $path, '/' );\n\n\t/**\n\t * Filter the home URL.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string      $url         The complete home URL including scheme and path.\n\t * @param string      $path        Path relative to the home URL. Blank string if no path is specified.\n\t * @param string|null $orig_scheme Scheme to give the home URL context. Accepts 'http', 'https',\n\t *                                 'relative', 'rest', or null.\n\t * @param int|null    $blog_id     Blog ID, or null for the current blog.\n\t */\n\treturn apply_filters( 'home_url', $url, $path, $orig_scheme, $blog_id );\n}\n\n/**\n * Retrieve the site url for the current site.\n *\n * Returns the 'site_url' option with the appropriate protocol, 'https' if\n * is_ssl() and 'http' otherwise. If $scheme is 'http' or 'https', is_ssl() is\n * overridden.\n *\n * @since 3.0.0\n *\n * @param string $path   Optional. Path relative to the site url.\n * @param string $scheme Optional. Scheme to give the site url context. See set_url_scheme().\n * @return string Site url link with optional path appended.\n*/\nfunction site_url( $path = '', $scheme = null ) {\n\treturn get_site_url( null, $path, $scheme );\n}\n\n/**\n * Retrieve the site url for a given site.\n *\n * Returns the 'site_url' option with the appropriate protocol, 'https' if\n * {@see is_ssl()} and 'http' otherwise. If `$scheme` is 'http' or 'https',\n * `is_ssl()` is overridden.\n *\n * @since 3.0.0\n *\n * @param int    $blog_id Optional. Blog ID. Default null (current site).\n * @param string $path    Optional. Path relative to the site url. Default empty.\n * @param string $scheme  Optional. Scheme to give the site url context. Accepts\n *                        'http', 'https', 'login', 'login_post', 'admin', or\n *                        'relative'. Default null.\n * @return string Site url link with optional path appended.\n*/\nfunction get_site_url( $blog_id = null, $path = '', $scheme = null ) {\n\tif ( empty( $blog_id ) || !is_multisite() ) {\n\t\t$url = get_option( 'siteurl' );\n\t} else {\n\t\tswitch_to_blog( $blog_id );\n\t\t$url = get_option( 'siteurl' );\n\t\trestore_current_blog();\n\t}\n\n\t$url = set_url_scheme( $url, $scheme );\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= '/' . ltrim( $path, '/' );\n\n\t/**\n\t * Filter the site URL.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string      $url     The complete site URL including scheme and path.\n\t * @param string      $path    Path relative to the site URL. Blank string if no path is specified.\n\t * @param string|null $scheme  Scheme to give the site URL context. Accepts 'http', 'https', 'login',\n\t *                             'login_post', 'admin', 'relative' or null.\n\t * @param int|null    $blog_id Blog ID, or null for the current blog.\n\t */\n\treturn apply_filters( 'site_url', $url, $path, $scheme, $blog_id );\n}\n\n/**\n * Retrieve the url to the admin area for the current site.\n *\n * @since 2.6.0\n *\n * @param string $path   Optional path relative to the admin url.\n * @param string $scheme The scheme to use. Default is 'admin', which obeys force_ssl_admin() and is_ssl(). 'http' or 'https' can be passed to force those schemes.\n * @return string Admin url link with optional path appended.\n*/\nfunction admin_url( $path = '', $scheme = 'admin' ) {\n\treturn get_admin_url( null, $path, $scheme );\n}\n\n/**\n * Retrieves the url to the admin area for a given site.\n *\n * @since 3.0.0\n *\n * @param int    $blog_id Optional. Blog ID. Default null (current site).\n * @param string $path    Optional. Path relative to the admin url. Default empty.\n * @param string $scheme  Optional. The scheme to use. Accepts 'http' or 'https',\n *                        to force those schemes. Default 'admin', which obeys\n *                        {@see force_ssl_admin()} and {@see is_ssl()}.\n * @return string Admin url link with optional path appended.\n*/\nfunction get_admin_url( $blog_id = null, $path = '', $scheme = 'admin' ) {\n\t$url = get_site_url($blog_id, 'wp-admin/', $scheme);\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= ltrim( $path, '/' );\n\n\t/**\n\t * Filter the admin area URL.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string   $url     The complete admin area URL including scheme and path.\n\t * @param string   $path    Path relative to the admin area URL. Blank string if no path is specified.\n\t * @param int|null $blog_id Blog ID, or null for the current blog.\n\t */\n\treturn apply_filters( 'admin_url', $url, $path, $blog_id );\n}\n\n/**\n * Retrieve the url to the includes directory.\n *\n * @since 2.6.0\n *\n * @param string $path   Optional. Path relative to the includes url.\n * @param string $scheme Optional. Scheme to give the includes url context.\n * @return string Includes url link with optional path appended.\n*/\nfunction includes_url( $path = '', $scheme = null ) {\n\t$url = site_url( '/' . WPINC . '/', $scheme );\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= ltrim($path, '/');\n\n\t/**\n\t * Filter the URL to the includes directory.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $url  The complete URL to the includes directory including scheme and path.\n\t * @param string $path Path relative to the URL to the wp-includes directory. Blank string\n\t *                     if no path is specified.\n\t */\n\treturn apply_filters( 'includes_url', $url, $path );\n}\n\n/**\n * Retrieve the url to the content directory.\n *\n * @since 2.6.0\n *\n * @param string $path Optional. Path relative to the content url.\n * @return string Content url link with optional path appended.\n*/\nfunction content_url($path = '') {\n\t$url = set_url_scheme( WP_CONTENT_URL );\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= '/' . ltrim($path, '/');\n\n\t/**\n\t * Filter the URL to the content directory.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $url  The complete URL to the content directory including scheme and path.\n\t * @param string $path Path relative to the URL to the content directory. Blank string\n\t *                     if no path is specified.\n\t */\n\treturn apply_filters( 'content_url', $url, $path);\n}\n\n/**\n * Retrieve a URL within the plugins or mu-plugins directory.\n *\n * Defaults to the plugins directory URL if no arguments are supplied.\n *\n * @since 2.6.0\n *\n * @param  string $path   Optional. Extra path appended to the end of the URL, including\n *                        the relative directory if $plugin is supplied. Default empty.\n * @param  string $plugin Optional. A full path to a file inside a plugin or mu-plugin.\n *                        The URL will be relative to its directory. Default empty.\n *                        Typically this is done by passing `__FILE__` as the argument.\n * @return string Plugins URL link with optional paths appended.\n*/\nfunction plugins_url( $path = '', $plugin = '' ) {\n\n\t$path = wp_normalize_path( $path );\n\t$plugin = wp_normalize_path( $plugin );\n\t$mu_plugin_dir = wp_normalize_path( WPMU_PLUGIN_DIR );\n\n\tif ( !empty($plugin) && 0 === strpos($plugin, $mu_plugin_dir) )\n\t\t$url = WPMU_PLUGIN_URL;\n\telse\n\t\t$url = WP_PLUGIN_URL;\n\n\n\t$url = set_url_scheme( $url );\n\n\tif ( !empty($plugin) && is_string($plugin) ) {\n\t\t$folder = dirname(plugin_basename($plugin));\n\t\tif ( '.' != $folder )\n\t\t\t$url .= '/' . ltrim($folder, '/');\n\t}\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= '/' . ltrim($path, '/');\n\n\t/**\n\t * Filter the URL to the plugins directory.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $url    The complete URL to the plugins directory including scheme and path.\n\t * @param string $path   Path relative to the URL to the plugins directory. Blank string\n\t *                       if no path is specified.\n\t * @param string $plugin The plugin file path to be relative to. Blank string if no plugin\n\t *                       is specified.\n\t */\n\treturn apply_filters( 'plugins_url', $url, $path, $plugin );\n}\n\n/**\n * Retrieve the site url for the current network.\n *\n * Returns the site url with the appropriate protocol, 'https' if\n * is_ssl() and 'http' otherwise. If $scheme is 'http' or 'https', is_ssl() is\n * overridden.\n *\n * @since 3.0.0\n *\n * @param string $path   Optional. Path relative to the site url.\n * @param string $scheme Optional. Scheme to give the site url context. See set_url_scheme().\n * @return string Site url link with optional path appended.\n*/\nfunction network_site_url( $path = '', $scheme = null ) {\n\tif ( ! is_multisite() )\n\t\treturn site_url($path, $scheme);\n\n\t$current_site = get_current_site();\n\n\tif ( 'relative' == $scheme )\n\t\t$url = $current_site->path;\n\telse\n\t\t$url = set_url_scheme( 'http://' . $current_site->domain . $current_site->path, $scheme );\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= ltrim( $path, '/' );\n\n\t/**\n\t * Filter the network site URL.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string      $url    The complete network site URL including scheme and path.\n\t * @param string      $path   Path relative to the network site URL. Blank string if\n\t *                            no path is specified.\n\t * @param string|null $scheme Scheme to give the URL context. Accepts 'http', 'https',\n\t *                            'relative' or null.\n\t */\n\treturn apply_filters( 'network_site_url', $url, $path, $scheme );\n}\n\n/**\n * Retrieves the home url for the current network.\n *\n * Returns the home url with the appropriate protocol, 'https' {@see is_ssl()}\n * and 'http' otherwise. If `$scheme` is 'http' or 'https', `is_ssl()` is\n * overridden.\n *\n * @since 3.0.0\n *\n * @param  string $path   Optional. Path relative to the home url. Default empty.\n * @param  string $scheme Optional. Scheme to give the home url context. Accepts\n *                        'http', 'https', or 'relative'. Default null.\n * @return string Home url link with optional path appended.\n*/\nfunction network_home_url( $path = '', $scheme = null ) {\n\tif ( ! is_multisite() )\n\t\treturn home_url($path, $scheme);\n\n\t$current_site = get_current_site();\n\t$orig_scheme = $scheme;\n\n\tif ( ! in_array( $scheme, array( 'http', 'https', 'relative' ) ) )\n\t\t$scheme = is_ssl() && ! is_admin() ? 'https' : 'http';\n\n\tif ( 'relative' == $scheme )\n\t\t$url = $current_site->path;\n\telse\n\t\t$url = set_url_scheme( 'http://' . $current_site->domain . $current_site->path, $scheme );\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= ltrim( $path, '/' );\n\n\t/**\n\t * Filter the network home URL.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string      $url         The complete network home URL including scheme and path.\n\t * @param string      $path        Path relative to the network home URL. Blank string\n\t *                                 if no path is specified.\n\t * @param string|null $orig_scheme Scheme to give the URL context. Accepts 'http', 'https',\n\t *                                 'relative' or null.\n\t */\n\treturn apply_filters( 'network_home_url', $url, $path, $orig_scheme);\n}\n\n/**\n * Retrieve the url to the admin area for the network.\n *\n * @since 3.0.0\n *\n * @param string $path   Optional path relative to the admin url.\n * @param string $scheme The scheme to use. Default is 'admin', which obeys force_ssl_admin() and is_ssl(). 'http' or 'https' can be passed to force those schemes.\n * @return string Admin url link with optional path appended.\n*/\nfunction network_admin_url( $path = '', $scheme = 'admin' ) {\n\tif ( ! is_multisite() )\n\t\treturn admin_url( $path, $scheme );\n\n\t$url = network_site_url('wp-admin/network/', $scheme);\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= ltrim($path, '/');\n\n\t/**\n\t * Filter the network admin URL.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $url  The complete network admin URL including scheme and path.\n\t * @param string $path Path relative to the network admin URL. Blank string if\n\t *                     no path is specified.\n\t */\n\treturn apply_filters( 'network_admin_url', $url, $path );\n}\n\n/**\n * Retrieve the url to the admin area for the current user.\n *\n * @since 3.0.0\n *\n * @param string $path   Optional path relative to the admin url.\n * @param string $scheme The scheme to use. Default is 'admin', which obeys force_ssl_admin() and is_ssl(). 'http' or 'https' can be passed to force those schemes.\n * @return string Admin url link with optional path appended.\n*/\nfunction user_admin_url( $path = '', $scheme = 'admin' ) {\n\t$url = network_site_url('wp-admin/user/', $scheme);\n\n\tif ( $path && is_string( $path ) )\n\t\t$url .= ltrim($path, '/');\n\n\t/**\n\t * Filter the user admin URL for the current user.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $url  The complete URL including scheme and path.\n\t * @param string $path Path relative to the URL. Blank string if\n\t *                     no path is specified.\n\t */\n\treturn apply_filters( 'user_admin_url', $url, $path );\n}\n\n/**\n * Retrieve the url to the admin area for either the current blog or the network depending on context.\n *\n * @since 3.1.0\n *\n * @param string $path   Optional path relative to the admin url.\n * @param string $scheme The scheme to use. Default is 'admin', which obeys force_ssl_admin() and is_ssl(). 'http' or 'https' can be passed to force those schemes.\n * @return string Admin url link with optional path appended.\n*/\nfunction self_admin_url($path = '', $scheme = 'admin') {\n\tif ( is_network_admin() )\n\t\treturn network_admin_url($path, $scheme);\n\telseif ( is_user_admin() )\n\t\treturn user_admin_url($path, $scheme);\n\telse\n\t\treturn admin_url($path, $scheme);\n}\n\n/**\n * Sets the scheme for a URL.\n *\n * @since 3.4.0\n * @since 4.4.0 The 'rest' scheme was added.\n *\n * @param string      $url    Absolute url that includes a scheme\n * @param string|null $scheme Optional. Scheme to give $url. Currently 'http', 'https', 'login',\n *                            'login_post', 'admin', 'relative', 'rest', 'rpc', or null. Default null.\n * @return string $url URL with chosen scheme.\n */\nfunction set_url_scheme( $url, $scheme = null ) {\n\t$orig_scheme = $scheme;\n\n\tif ( ! $scheme ) {\n\t\t$scheme = is_ssl() ? 'https' : 'http';\n\t} elseif ( $scheme === 'admin' || $scheme === 'login' || $scheme === 'login_post' || $scheme === 'rpc' ) {\n\t\t$scheme = is_ssl() || force_ssl_admin() ? 'https' : 'http';\n\t} elseif ( $scheme !== 'http' && $scheme !== 'https' && $scheme !== 'relative' ) {\n\t\t$scheme = is_ssl() ? 'https' : 'http';\n\t}\n\n\t$url = trim( $url );\n\tif ( substr( $url, 0, 2 ) === '//' )\n\t\t$url = 'http:' . $url;\n\n\tif ( 'relative' == $scheme ) {\n\t\t$url = ltrim( preg_replace( '#^\\w+://[^/]*#', '', $url ) );\n\t\tif ( $url !== '' && $url[0] === '/' )\n\t\t\t$url = '/' . ltrim($url , \"/ \\t\\n\\r\\0\\x0B\" );\n\t} else {\n\t\t$url = preg_replace( '#^\\w+://#', $scheme . '://', $url );\n\t}\n\n\t/**\n\t * Filter the resulting URL after setting the scheme.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string      $url         The complete URL including scheme and path.\n\t * @param string      $scheme      Scheme applied to the URL. One of 'http', 'https', or 'relative'.\n\t * @param string|null $orig_scheme Scheme requested for the URL. One of 'http', 'https', 'login',\n\t *                                 'login_post', 'admin', 'relative', 'rest', 'rpc', or null.\n\t */\n\treturn apply_filters( 'set_url_scheme', $url, $scheme, $orig_scheme );\n}\n\n/**\n * Get the URL to the user's dashboard.\n *\n * If a user does not belong to any site, the global user dashboard is used. If the user belongs to the current site,\n * the dashboard for the current site is returned. If the user cannot edit the current site, the dashboard to the user's\n * primary blog is returned.\n *\n * @since 3.1.0\n *\n * @param int    $user_id Optional. User ID. Defaults to current user.\n * @param string $path    Optional path relative to the dashboard. Use only paths known to both blog and user admins.\n * @param string $scheme  The scheme to use. Default is 'admin', which obeys force_ssl_admin() and is_ssl(). 'http' or 'https' can be passed to force those schemes.\n * @return string Dashboard url link with optional path appended.\n */\nfunction get_dashboard_url( $user_id = 0, $path = '', $scheme = 'admin' ) {\n\t$user_id = $user_id ? (int) $user_id : get_current_user_id();\n\n\t$blogs = get_blogs_of_user( $user_id );\n\tif ( ! is_super_admin() && empty($blogs) ) {\n\t\t$url = user_admin_url( $path, $scheme );\n\t} elseif ( ! is_multisite() ) {\n\t\t$url = admin_url( $path, $scheme );\n\t} else {\n\t\t$current_blog = get_current_blog_id();\n\t\tif ( $current_blog  && ( is_super_admin( $user_id ) || in_array( $current_blog, array_keys( $blogs ) ) ) ) {\n\t\t\t$url = admin_url( $path, $scheme );\n\t\t} else {\n\t\t\t$active = get_active_blog_for_user( $user_id );\n\t\t\tif ( $active )\n\t\t\t\t$url = get_admin_url( $active->blog_id, $path, $scheme );\n\t\t\telse\n\t\t\t\t$url = user_admin_url( $path, $scheme );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the dashboard URL for a user.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $url     The complete URL including scheme and path.\n\t * @param int    $user_id The user ID.\n\t * @param string $path    Path relative to the URL. Blank string if no path is specified.\n\t * @param string $scheme  Scheme to give the URL context. Accepts 'http', 'https', 'login',\n\t *                        'login_post', 'admin', 'relative' or null.\n\t */\n\treturn apply_filters( 'user_dashboard_url', $url, $user_id, $path, $scheme);\n}\n\n/**\n * Get the URL to the user's profile editor.\n *\n * @since 3.1.0\n *\n * @param int    $user_id Optional. User ID. Defaults to current user.\n * @param string $scheme  The scheme to use. Default is 'admin', which obeys force_ssl_admin() and is_ssl().\n *                        'http' or 'https' can be passed to force those schemes.\n * @return string Dashboard url link with optional path appended.\n */\nfunction get_edit_profile_url( $user_id = 0, $scheme = 'admin' ) {\n\t$user_id = $user_id ? (int) $user_id : get_current_user_id();\n\n\tif ( is_user_admin() )\n\t\t$url = user_admin_url( 'profile.php', $scheme );\n\telseif ( is_network_admin() )\n\t\t$url = network_admin_url( 'profile.php', $scheme );\n\telse\n\t\t$url = get_dashboard_url( $user_id, 'profile.php', $scheme );\n\n\t/**\n\t * Filter the URL for a user's profile editor.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string $url     The complete URL including scheme and path.\n\t * @param int    $user_id The user ID.\n\t * @param string $scheme  Scheme to give the URL context. Accepts 'http', 'https', 'login',\n\t *                        'login_post', 'admin', 'relative' or null.\n\t */\n\treturn apply_filters( 'edit_profile_url', $url, $user_id, $scheme);\n}\n\n/**\n * Output rel=canonical for singular queries.\n *\n * @since 2.9.0\n*/\nfunction rel_canonical() {\n\tif ( ! is_singular() ) {\n\t\treturn;\n\t}\n\n\tif ( ! $id = get_queried_object_id() ) {\n\t\treturn;\n\t}\n\n\t$url = get_permalink( $id );\n\n\t$page = get_query_var( 'page' );\n\tif ( $page >= 2 ) {\n\t\tif ( '' == get_option( 'permalink_structure' ) ) {\n\t\t\t$url = add_query_arg( 'page', $page, $url );\n\t\t} else {\n\t\t\t$url = trailingslashit( $url ) . user_trailingslashit( $page, 'single_paged' );\n\t\t}\n\t}\n\n\t$cpage = get_query_var( 'cpage' );\n\tif ( $cpage ) {\n\t\t$url = get_comments_pagenum_link( $cpage );\n\t}\n\techo '<link rel=\"canonical\" href=\"' . esc_url( $url ) . \"\\\" />\\n\";\n}\n\n/**\n * Return a shortlink for a post, page, attachment, or blog.\n *\n * This function exists to provide a shortlink tag that all themes and plugins can target. A plugin must hook in to\n * provide the actual shortlinks. Default shortlink support is limited to providing ?p= style links for posts.\n * Plugins can short-circuit this function via the pre_get_shortlink filter or filter the output\n * via the get_shortlink filter.\n *\n * @since 3.0.0.\n *\n * @param int    $id          A post or blog id. Default is 0, which means the current post or blog.\n * @param string $context     Whether the id is a 'blog' id, 'post' id, or 'media' id.\n *                            If 'post', the post_type of the post is consulted.\n *                            If 'query', the current query is consulted to determine the id and context.\n *                            Default is 'post'.\n * @param bool   $allow_slugs Whether to allow post slugs in the shortlink. It is up to the plugin how and whether to honor this.\n * @return string A shortlink or an empty string if no shortlink exists for the requested resource or if shortlinks are not enabled.\n */\nfunction wp_get_shortlink($id = 0, $context = 'post', $allow_slugs = true) {\n\t/**\n\t * Filter whether to preempt generating a shortlink for the given post.\n\t *\n\t * Passing a truthy value to the filter will effectively short-circuit the\n\t * shortlink-generation process, returning that value instead.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param bool|string $return      Short-circuit return value. Either false or a URL string.\n\t * @param int         $id          Post ID, or 0 for the current post.\n\t * @param string      $context     The context for the link. One of 'post' or 'query',\n\t * @param bool        $allow_slugs Whether to allow post slugs in the shortlink.\n\t */\n\t$shortlink = apply_filters( 'pre_get_shortlink', false, $id, $context, $allow_slugs );\n\n\tif ( false !== $shortlink ) {\n\t\treturn $shortlink;\n\t}\n\n\t$post_id = 0;\n\tif ( 'query' == $context && is_singular() ) {\n\t\t$post_id = get_queried_object_id();\n\t\t$post = get_post( $post_id );\n\t} elseif ( 'post' == $context ) {\n\t\t$post = get_post( $id );\n\t\tif ( ! empty( $post->ID ) )\n\t\t\t$post_id = $post->ID;\n\t}\n\n\t$shortlink = '';\n\n\t// Return p= link for all public post types.\n\tif ( ! empty( $post_id ) ) {\n\t\t$post_type = get_post_type_object( $post->post_type );\n\n\t\tif ( 'page' === $post->post_type && $post->ID == get_option( 'page_on_front' ) && 'page' == get_option( 'show_on_front' ) ) {\n\t\t\t$shortlink = home_url( '/' );\n\t\t} elseif ( $post_type->public ) {\n\t\t\t$shortlink = home_url( '?p=' . $post_id );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the shortlink for a post.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $shortlink   Shortlink URL.\n\t * @param int    $id          Post ID, or 0 for the current post.\n\t * @param string $context     The context for the link. One of 'post' or 'query',\n\t * @param bool   $allow_slugs Whether to allow post slugs in the shortlink. Not used by default.\n\t */\n\treturn apply_filters( 'get_shortlink', $shortlink, $id, $context, $allow_slugs );\n}\n\n/**\n *  Inject rel=shortlink into head if a shortlink is defined for the current page.\n *\n *  Attached to the wp_head action.\n *\n * @since 3.0.0\n */\nfunction wp_shortlink_wp_head() {\n\t$shortlink = wp_get_shortlink( 0, 'query' );\n\n\tif ( empty( $shortlink ) )\n\t\treturn;\n\n\techo \"<link rel='shortlink' href='\" . esc_url( $shortlink ) . \"' />\\n\";\n}\n\n/**\n * Send a Link: rel=shortlink header if a shortlink is defined for the current page.\n *\n * Attached to the wp action.\n *\n * @since 3.0.0\n */\nfunction wp_shortlink_header() {\n\tif ( headers_sent() )\n\t\treturn;\n\n\t$shortlink = wp_get_shortlink(0, 'query');\n\n\tif ( empty($shortlink) )\n\t\treturn;\n\n\theader('Link: <' . $shortlink . '>; rel=shortlink', false);\n}\n\n/**\n * Display the Short Link for a Post\n *\n * Must be called from inside \"The Loop\"\n *\n * Call like the_shortlink(__('Shortlinkage FTW'))\n *\n * @since 3.0.0\n *\n * @param string $text   Optional The link text or HTML to be displayed. Defaults to 'This is the short link.'\n * @param string $title  Optional The tooltip for the link. Must be sanitized. Defaults to the sanitized post title.\n * @param string $before Optional HTML to display before the link.\n * @param string $after  Optional HTML to display after the link.\n */\nfunction the_shortlink( $text = '', $title = '', $before = '', $after = '' ) {\n\t$post = get_post();\n\n\tif ( empty( $text ) )\n\t\t$text = __('This is the short link.');\n\n\tif ( empty( $title ) )\n\t\t$title = the_title_attribute( array( 'echo' => false ) );\n\n\t$shortlink = wp_get_shortlink( $post->ID );\n\n\tif ( !empty( $shortlink ) ) {\n\t\t$link = '<a rel=\"shortlink\" href=\"' . esc_url( $shortlink ) . '\" title=\"' . $title . '\">' . $text . '</a>';\n\n\t\t/**\n\t\t * Filter the shortlink anchor tag for a post.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $link      Shortlink anchor tag.\n\t\t * @param string $shortlink Shortlink URL.\n\t\t * @param string $text      Shortlink's text.\n\t\t * @param string $title     Shortlink's title attribute.\n\t\t */\n\t\t$link = apply_filters( 'the_shortlink', $link, $shortlink, $text, $title );\n\t\techo $before, $link, $after;\n\t}\n}\n\n\n/**\n * Retrieve the avatar URL.\n *\n * @since 4.2.0\n *\n * @param mixed $id_or_email The Gravatar to retrieve a URL for. Accepts a user_id, gravatar md5 hash,\n *                           user email, WP_User object, WP_Post object, or WP_Comment object.\n * @param array $args {\n *     Optional. Arguments to return instead of the default arguments.\n *\n *     @type int    $size           Height and width of the avatar in pixels. Default 96.\n *     @type string $default        URL for the default image or a default type. Accepts '404' (return\n *                                  a 404 instead of a default image), 'retro' (8bit), 'monsterid' (monster),\n *                                  'wavatar' (cartoon face), 'indenticon' (the \"quilt\"), 'mystery', 'mm',\n *                                  or 'mysteryman' (The Oyster Man), 'blank' (transparent GIF), or\n *                                  'gravatar_default' (the Gravatar logo). Default is the value of the\n *                                  'avatar_default' option, with a fallback of 'mystery'.\n *     @type bool   $force_default  Whether to always show the default image, never the Gravatar. Default false.\n *     @type string $rating         What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are\n *                                  judged in that order. Default is the value of the 'avatar_rating' option.\n *     @type string $scheme         URL scheme to use. See set_url_scheme() for accepted values.\n *                                  Default null.\n *     @type array  $processed_args When the function returns, the value will be the processed/sanitized $args\n *                                  plus a \"found_avatar\" guess. Pass as a reference. Default null.\n * }\n * @return false|string The URL of the avatar we found, or false if we couldn't find an avatar.\n */\nfunction get_avatar_url( $id_or_email, $args = null ) {\n\t$args = get_avatar_data( $id_or_email, $args );\n\treturn $args['url'];\n}\n\n/**\n * Retrieve default data about the avatar.\n *\n * @since 4.2.0\n *\n * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,\n *                            user email, WP_User object, WP_Post object, or WP_Comment object.\n * @param array $args {\n *     Optional. Arguments to return instead of the default arguments.\n *\n *     @type int    $size           Height and width of the avatar image file in pixels. Default 96.\n *     @type int    $height         Display height of the avatar in pixels. Defaults to $size.\n *     @type int    $width          Display width of the avatar in pixels. Defaults to $size.\n *     @type string $default        URL for the default image or a default type. Accepts '404' (return\n *                                  a 404 instead of a default image), 'retro' (8bit), 'monsterid' (monster),\n *                                  'wavatar' (cartoon face), 'indenticon' (the \"quilt\"), 'mystery', 'mm',\n *                                  or 'mysteryman' (The Oyster Man), 'blank' (transparent GIF), or\n *                                  'gravatar_default' (the Gravatar logo). Default is the value of the\n *                                  'avatar_default' option, with a fallback of 'mystery'.\n *     @type bool   $force_default  Whether to always show the default image, never the Gravatar. Default false.\n *     @type string $rating         What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are\n *                                  judged in that order. Default is the value of the 'avatar_rating' option.\n *     @type string $scheme         URL scheme to use. See set_url_scheme() for accepted values.\n *                                  Default null.\n *     @type array  $processed_args When the function returns, the value will be the processed/sanitized $args\n *                                  plus a \"found_avatar\" guess. Pass as a reference. Default null.\n *     @type string $extra_attr     HTML attributes to insert in the IMG element. Is not sanitized. Default empty.\n * }\n * @return array $processed_args {\n *     Along with the arguments passed in `$args`, this will contain a couple of extra arguments.\n *\n *     @type bool   $found_avatar True if we were able to find an avatar for this user,\n *                                false or not set if we couldn't.\n *     @type string $url          The URL of the avatar we found.\n * }\n */\nfunction get_avatar_data( $id_or_email, $args = null ) {\n\t$args = wp_parse_args( $args, array(\n\t\t'size'           => 96,\n\t\t'height'         => null,\n\t\t'width'          => null,\n\t\t'default'        => get_option( 'avatar_default', 'mystery' ),\n\t\t'force_default'  => false,\n\t\t'rating'         => get_option( 'avatar_rating' ),\n\t\t'scheme'         => null,\n\t\t'processed_args' => null, // if used, should be a reference\n\t\t'extra_attr'     => '',\n\t) );\n\n\tif ( is_numeric( $args['size'] ) ) {\n\t\t$args['size'] = absint( $args['size'] );\n\t\tif ( ! $args['size'] ) {\n\t\t\t$args['size'] = 96;\n\t\t}\n\t} else {\n\t\t$args['size'] = 96;\n\t}\n\n\tif ( is_numeric( $args['height'] ) ) {\n\t\t$args['height'] = absint( $args['height'] );\n\t\tif ( ! $args['height'] ) {\n\t\t\t$args['height'] = $args['size'];\n\t\t}\n\t} else {\n\t\t$args['height'] = $args['size'];\n\t}\n\n\tif ( is_numeric( $args['width'] ) ) {\n\t\t$args['width'] = absint( $args['width'] );\n\t\tif ( ! $args['width'] ) {\n\t\t\t$args['width'] = $args['size'];\n\t\t}\n\t} else {\n\t\t$args['width'] = $args['size'];\n\t}\n\n\tif ( empty( $args['default'] ) ) {\n\t\t$args['default'] = get_option( 'avatar_default', 'mystery' );\n\t}\n\n\tswitch ( $args['default'] ) {\n\t\tcase 'mm' :\n\t\tcase 'mystery' :\n\t\tcase 'mysteryman' :\n\t\t\t$args['default'] = 'mm';\n\t\t\tbreak;\n\t\tcase 'gravatar_default' :\n\t\t\t$args['default'] = false;\n\t\t\tbreak;\n\t}\n\n\t$args['force_default'] = (bool) $args['force_default'];\n\n\t$args['rating'] = strtolower( $args['rating'] );\n\n\t$args['found_avatar'] = false;\n\n\t/**\n\t * Filter whether to retrieve the avatar URL early.\n\t *\n\t * Passing a non-null value in the 'url' member of the return array will\n\t * effectively short circuit get_avatar_data(), passing the value through\n\t * the {@see 'get_avatar_data'} filter and returning early.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param array  $args        Arguments passed to get_avatar_data(), after processing.\n\t * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,\n\t *                            user email, WP_User object, WP_Post object, or WP_Comment object.\n\t */\n\t$args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email );\n\n\tif ( isset( $args['url'] ) && ! is_null( $args['url'] ) ) {\n\t\t/** This filter is documented in wp-includes/link-template.php */\n\t\treturn apply_filters( 'get_avatar_data', $args, $id_or_email );\n\t}\n\n\t$email_hash = '';\n\t$user = $email = false;\n\n\tif ( is_object( $id_or_email ) && isset( $id_or_email->comment_ID ) ) {\n\t\t$id_or_email = get_comment( $id_or_email );\n\t}\n\n\t// Process the user identifier.\n\tif ( is_numeric( $id_or_email ) ) {\n\t\t$user = get_user_by( 'id', absint( $id_or_email ) );\n\t} elseif ( is_string( $id_or_email ) ) {\n\t\tif ( strpos( $id_or_email, '@md5.gravatar.com' ) ) {\n\t\t\t// md5 hash\n\t\t\tlist( $email_hash ) = explode( '@', $id_or_email );\n\t\t} else {\n\t\t\t// email address\n\t\t\t$email = $id_or_email;\n\t\t}\n\t} elseif ( $id_or_email instanceof WP_User ) {\n\t\t// User Object\n\t\t$user = $id_or_email;\n\t} elseif ( $id_or_email instanceof WP_Post ) {\n\t\t// Post Object\n\t\t$user = get_user_by( 'id', (int) $id_or_email->post_author );\n\t} elseif ( $id_or_email instanceof WP_Comment ) {\n\t\t/**\n\t\t * Filter the list of allowed comment types for retrieving avatars.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $types An array of content types. Default only contains 'comment'.\n\t\t */\n\t\t$allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );\n\t\tif ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) ) {\n\t\t\t$args['url'] = false;\n\t\t\t/** This filter is documented in wp-includes/link-template.php */\n\t\t\treturn apply_filters( 'get_avatar_data', $args, $id_or_email );\n\t\t}\n\n\t\tif ( ! empty( $id_or_email->user_id ) ) {\n\t\t\t$user = get_user_by( 'id', (int) $id_or_email->user_id );\n\t\t}\n\t\tif ( ( ! $user || is_wp_error( $user ) ) && ! empty( $id_or_email->comment_author_email ) ) {\n\t\t\t$email = $id_or_email->comment_author_email;\n\t\t}\n\t}\n\n\tif ( ! $email_hash ) {\n\t\tif ( $user ) {\n\t\t\t$email = $user->user_email;\n\t\t}\n\n\t\tif ( $email ) {\n\t\t\t$email_hash = md5( strtolower( trim( $email ) ) );\n\t\t}\n\t}\n\n\tif ( $email_hash ) {\n\t\t$args['found_avatar'] = true;\n\t\t$gravatar_server = hexdec( $email_hash[0] ) % 3;\n\t} else {\n\t\t$gravatar_server = rand( 0, 2 );\n\t}\n\n\t$url_args = array(\n\t\t's' => $args['size'],\n\t\t'd' => $args['default'],\n\t\t'f' => $args['force_default'] ? 'y' : false,\n\t\t'r' => $args['rating'],\n\t);\n\n\tif ( is_ssl() ) {\n\t\t$url = 'https://secure.gravatar.com/avatar/' . $email_hash;\n\t} else {\n\t\t$url = sprintf( 'http://%d.gravatar.com/avatar/%s', $gravatar_server, $email_hash );\n\t}\n\n\t$url = add_query_arg(\n\t\trawurlencode_deep( array_filter( $url_args ) ),\n\t\tset_url_scheme( $url, $args['scheme'] )\n\t);\n\n\t/**\n\t * Filter the avatar URL.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param string $url         The URL of the avatar.\n\t * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,\n\t *                            user email, WP_User object, WP_Post object, or WP_Comment object.\n\t * @param array  $args        Arguments passed to get_avatar_data(), after processing.\n\t */\n\t$args['url'] = apply_filters( 'get_avatar_url', $url, $id_or_email, $args );\n\n\t/**\n\t * Filter the avatar data.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param array  $args        Arguments passed to get_avatar_data(), after processing.\n\t * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,\n\t *                            user email, WP_User object, WP_Post object, or WP_Comment object.\n\t */\n\treturn apply_filters( 'get_avatar_data', $args, $id_or_email );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/load.php",
    "content": "<?php\n/**\n * These functions are needed to load WordPress.\n *\n * @internal This file must be parsable by PHP4.\n *\n * @package WordPress\n */\n\n/**\n * Return the HTTP protocol sent by the server.\n *\n * @since 4.4.0\n *\n * @return string The HTTP protocol. Default: HTTP/1.0.\n */\nfunction wp_get_server_protocol() {\n\t$protocol = $_SERVER['SERVER_PROTOCOL'];\n\tif ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0' ) ) ) {\n\t\t$protocol = 'HTTP/1.0';\n\t}\n\treturn $protocol;\n}\n\n/**\n * Turn register globals off.\n *\n * @since 2.1.0\n * @access private\n */\nfunction wp_unregister_GLOBALS() {\n\tif ( !ini_get( 'register_globals' ) )\n\t\treturn;\n\n\tif ( isset( $_REQUEST['GLOBALS'] ) )\n\t\tdie( 'GLOBALS overwrite attempt detected' );\n\n\t// Variables that shouldn't be unset\n\t$no_unset = array( 'GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix' );\n\n\t$input = array_merge( $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset( $_SESSION ) && is_array( $_SESSION ) ? $_SESSION : array() );\n\tforeach ( $input as $k => $v )\n\t\tif ( !in_array( $k, $no_unset ) && isset( $GLOBALS[$k] ) ) {\n\t\t\tunset( $GLOBALS[$k] );\n\t\t}\n}\n\n/**\n * Fix `$_SERVER` variables for various setups.\n *\n * @since 3.0.0\n * @access private\n *\n * @global string $PHP_SELF The filename of the currently executing script,\n *                          relative to the document root.\n */\nfunction wp_fix_server_vars() {\n\tglobal $PHP_SELF;\n\n\t$default_server_values = array(\n\t\t'SERVER_SOFTWARE' => '',\n\t\t'REQUEST_URI' => '',\n\t);\n\n\t$_SERVER = array_merge( $default_server_values, $_SERVER );\n\n\t// Fix for IIS when running with PHP ISAPI\n\tif ( empty( $_SERVER['REQUEST_URI'] ) || ( PHP_SAPI != 'cgi-fcgi' && preg_match( '/^Microsoft-IIS\\//', $_SERVER['SERVER_SOFTWARE'] ) ) ) {\n\n\t\t// IIS Mod-Rewrite\n\t\tif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {\n\t\t\t$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];\n\t\t}\n\t\t// IIS Isapi_Rewrite\n\t\telseif ( isset( $_SERVER['HTTP_X_REWRITE_URL'] ) ) {\n\t\t\t$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];\n\t\t} else {\n\t\t\t// Use ORIG_PATH_INFO if there is no PATH_INFO\n\t\t\tif ( !isset( $_SERVER['PATH_INFO'] ) && isset( $_SERVER['ORIG_PATH_INFO'] ) )\n\t\t\t\t$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];\n\n\t\t\t// Some IIS + PHP configurations puts the script-name in the path-info (No need to append it twice)\n\t\t\tif ( isset( $_SERVER['PATH_INFO'] ) ) {\n\t\t\t\tif ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] )\n\t\t\t\t\t$_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];\n\t\t\t\telse\n\t\t\t\t\t$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO'];\n\t\t\t}\n\n\t\t\t// Append the query string if it exists and isn't null\n\t\t\tif ( ! empty( $_SERVER['QUERY_STRING'] ) ) {\n\t\t\t\t$_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];\n\t\t\t}\n\t\t}\n\t}\n\n\t// Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests\n\tif ( isset( $_SERVER['SCRIPT_FILENAME'] ) && ( strpos( $_SERVER['SCRIPT_FILENAME'], 'php.cgi' ) == strlen( $_SERVER['SCRIPT_FILENAME'] ) - 7 ) )\n\t\t$_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED'];\n\n\t// Fix for Dreamhost and other PHP as CGI hosts\n\tif ( strpos( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) !== false )\n\t\tunset( $_SERVER['PATH_INFO'] );\n\n\t// Fix empty PHP_SELF\n\t$PHP_SELF = $_SERVER['PHP_SELF'];\n\tif ( empty( $PHP_SELF ) )\n\t\t$_SERVER['PHP_SELF'] = $PHP_SELF = preg_replace( '/(\\?.*)?$/', '', $_SERVER[\"REQUEST_URI\"] );\n}\n\n/**\n * Check for the required PHP version, and the MySQL extension or\n * a database drop-in.\n *\n * Dies if requirements are not met.\n *\n * @since 3.0.0\n * @access private\n *\n * @global string $required_php_version The required PHP version string.\n * @global string $wp_version           The WordPress version string.\n */\nfunction wp_check_php_mysql_versions() {\n\tglobal $required_php_version, $wp_version;\n\t$php_version = phpversion();\n\n\tif ( version_compare( $required_php_version, $php_version, '>' ) ) {\n\t\twp_load_translations_early();\n\n\t\t$protocol = wp_get_server_protocol();\n\t\theader( sprintf( '%s 500 Internal Server Error', $protocol ), true, 500 );\n\t\theader( 'Content-Type: text/html; charset=utf-8' );\n\t\tdie( sprintf( __( 'Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s.' ), $php_version, $wp_version, $required_php_version ) );\n\t}\n\n\tif ( ! extension_loaded( 'mysql' ) && ! extension_loaded( 'mysqli' ) && ! file_exists( WP_CONTENT_DIR . '/db.php' ) ) {\n\t\twp_load_translations_early();\n\n\t\t$protocol = wp_get_server_protocol();\n\t\theader( sprintf( '%s 500 Internal Server Error', $protocol ), true, 500 );\n\t\theader( 'Content-Type: text/html; charset=utf-8' );\n\t\tdie( __( 'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.' ) );\n\t}\n}\n\n/**\n * Don't load all of WordPress when handling a favicon.ico request.\n *\n * Instead, send the headers for a zero-length favicon and bail.\n *\n * @since 3.0.0\n */\nfunction wp_favicon_request() {\n\tif ( '/favicon.ico' == $_SERVER['REQUEST_URI'] ) {\n\t\theader('Content-Type: image/vnd.microsoft.icon');\n\t\texit;\n\t}\n}\n\n/**\n * Die with a maintenance message when conditions are met.\n *\n * Checks for a file in the WordPress root directory named \".maintenance\".\n * This file will contain the variable $upgrading, set to the time the file\n * was created. If the file was created less than 10 minutes ago, WordPress\n * enters maintenance mode and displays a message.\n *\n * The default message can be replaced by using a drop-in (maintenance.php in\n * the wp-content directory).\n *\n * @since 3.0.0\n * @access private\n *\n * @global int $upgrading the unix timestamp marking when upgrading WordPress began.\n */\nfunction wp_maintenance() {\n\tif ( ! file_exists( ABSPATH . '.maintenance' ) || wp_installing() )\n\t\treturn;\n\n\tglobal $upgrading;\n\n\tinclude( ABSPATH . '.maintenance' );\n\t// If the $upgrading timestamp is older than 10 minutes, don't die.\n\tif ( ( time() - $upgrading ) >= 600 )\n\t\treturn;\n\n\tif ( file_exists( WP_CONTENT_DIR . '/maintenance.php' ) ) {\n\t\trequire_once( WP_CONTENT_DIR . '/maintenance.php' );\n\t\tdie();\n\t}\n\n\twp_load_translations_early();\n\n\t$protocol = wp_get_server_protocol();\n\theader( \"$protocol 503 Service Unavailable\", true, 503 );\n\theader( 'Content-Type: text/html; charset=utf-8' );\n\theader( 'Retry-After: 600' );\n?>\n\t<!DOCTYPE html>\n\t<html xmlns=\"http://www.w3.org/1999/xhtml\"<?php if ( is_rtl() ) echo ' dir=\"rtl\"'; ?>>\n\t<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<title><?php _e( 'Maintenance' ); ?></title>\n\n\t</head>\n\t<body>\n\t\t<h1><?php _e( 'Briefly unavailable for scheduled maintenance. Check back in a minute.' ); ?></h1>\n\t</body>\n\t</html>\n<?php\n\tdie();\n}\n\n/**\n * Start the WordPress micro-timer.\n *\n * @since 0.71\n * @access private\n *\n * @global float $timestart Unix timestamp set at the beginning of the page load.\n * @see timer_stop()\n *\n * @return bool Always returns true.\n */\nfunction timer_start() {\n\tglobal $timestart;\n\t$timestart = microtime( true );\n\treturn true;\n}\n\n/**\n * Retrieve or display the time from the page start to when function is called.\n *\n * @since 0.71\n *\n * @global float   $timestart Seconds from when timer_start() is called.\n * @global float   $timeend   Seconds from when function is called.\n *\n * @param int|bool $display   Whether to echo or return the results. Accepts 0|false for return,\n *                            1|true for echo. Default 0|false.\n * @param int      $precision The number of digits from the right of the decimal to display.\n *                            Default 3.\n * @return string The \"second.microsecond\" finished time calculation. The number is formatted\n *                for human consumption, both localized and rounded.\n */\nfunction timer_stop( $display = 0, $precision = 3 ) {\n\tglobal $timestart, $timeend;\n\t$timeend = microtime( true );\n\t$timetotal = $timeend - $timestart;\n\t$r = ( function_exists( 'number_format_i18n' ) ) ? number_format_i18n( $timetotal, $precision ) : number_format( $timetotal, $precision );\n\tif ( $display )\n\t\techo $r;\n\treturn $r;\n}\n\n/**\n * Set PHP error reporting based on WordPress debug settings.\n *\n * Uses three constants: `WP_DEBUG`, `WP_DEBUG_DISPLAY`, and `WP_DEBUG_LOG`.\n * All three can be defined in wp-config.php, and by default are set to false.\n *\n * When `WP_DEBUG` is true, all PHP notices are reported. WordPress will also\n * display internal notices: when a deprecated WordPress function, function\n * argument, or file is used. Deprecated code may be removed from a later\n * version.\n *\n * It is strongly recommended that plugin and theme developers use `WP_DEBUG`\n * in their development environments.\n *\n * `WP_DEBUG_DISPLAY` and `WP_DEBUG_LOG` perform no function unless `WP_DEBUG`\n * is true.\n *\n * When `WP_DEBUG_DISPLAY` is true, WordPress will force errors to be displayed.\n * `WP_DEBUG_DISPLAY` defaults to true. Defining it as null prevents WordPress\n * from changing the global configuration setting. Defining `WP_DEBUG_DISPLAY`\n * as false will force errors to be hidden.\n *\n * When `WP_DEBUG_LOG` is true, errors will be logged to debug.log in the content\n * directory.\n *\n * Errors are never displayed for XML-RPC requests.\n *\n * @since 3.0.0\n * @access private\n */\nfunction wp_debug_mode() {\n\tif ( WP_DEBUG ) {\n\t\terror_reporting( E_ALL );\n\n\t\tif ( WP_DEBUG_DISPLAY )\n\t\t\tini_set( 'display_errors', 1 );\n\t\telseif ( null !== WP_DEBUG_DISPLAY )\n\t\t\tini_set( 'display_errors', 0 );\n\n\t\tif ( WP_DEBUG_LOG ) {\n\t\t\tini_set( 'log_errors', 1 );\n\t\t\tini_set( 'error_log', WP_CONTENT_DIR . '/debug.log' );\n\t\t}\n\t} else {\n\t\terror_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );\n\t}\n\tif ( defined( 'XMLRPC_REQUEST' ) )\n\t\tini_set( 'display_errors', 0 );\n}\n\n/**\n * Set the location of the language directory.\n *\n * To set directory manually, define the `WP_LANG_DIR` constant\n * in wp-config.php.\n *\n * If the language directory exists within `WP_CONTENT_DIR`, it\n * is used. Otherwise the language directory is assumed to live\n * in `WPINC`.\n *\n * @since 3.0.0\n * @access private\n */\nfunction wp_set_lang_dir() {\n\tif ( !defined( 'WP_LANG_DIR' ) ) {\n\t\tif ( file_exists( WP_CONTENT_DIR . '/languages' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) || !@is_dir(ABSPATH . WPINC . '/languages') ) {\n\t\t\t/**\n\t\t\t * Server path of the language directory.\n\t\t\t *\n\t\t\t * No leading slash, no trailing slash, full path, not relative to ABSPATH\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t */\n\t\t\tdefine( 'WP_LANG_DIR', WP_CONTENT_DIR . '/languages' );\n\t\t\tif ( !defined( 'LANGDIR' ) ) {\n\t\t\t\t// Old static relative path maintained for limited backwards compatibility - won't work in some cases\n\t\t\t\tdefine( 'LANGDIR', 'wp-content/languages' );\n\t\t\t}\n\t\t} else {\n\t\t\t/**\n\t\t\t * Server path of the language directory.\n\t\t\t *\n\t\t\t * No leading slash, no trailing slash, full path, not relative to `ABSPATH`.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t */\n\t\t\tdefine( 'WP_LANG_DIR', ABSPATH . WPINC . '/languages' );\n\t\t\tif ( !defined( 'LANGDIR' ) ) {\n\t\t\t\t// Old relative path maintained for backwards compatibility\n\t\t\t\tdefine( 'LANGDIR', WPINC . '/languages' );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Load the database class file and instantiate the `$wpdb` global.\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb The WordPress database class.\n */\nfunction require_wp_db() {\n\tglobal $wpdb;\n\n\trequire_once( ABSPATH . WPINC . '/wp-db.php' );\n\tif ( file_exists( WP_CONTENT_DIR . '/db.php' ) )\n\t\trequire_once( WP_CONTENT_DIR . '/db.php' );\n\n\tif ( isset( $wpdb ) )\n\t\treturn;\n\n\t$wpdb = new wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST );\n}\n\n/**\n * Set the database table prefix and the format specifiers for database\n * table columns.\n *\n * Columns not listed here default to `%s`.\n *\n * @since 3.0.0\n * @access private\n *\n * @global wpdb   $wpdb         The WordPress database class.\n * @global string $table_prefix The database table prefix.\n */\nfunction wp_set_wpdb_vars() {\n\tglobal $wpdb, $table_prefix;\n\tif ( !empty( $wpdb->error ) )\n\t\tdead_db();\n\n\t$wpdb->field_types = array( 'post_author' => '%d', 'post_parent' => '%d', 'menu_order' => '%d', 'term_id' => '%d', 'term_group' => '%d', 'term_taxonomy_id' => '%d',\n\t\t'parent' => '%d', 'count' => '%d','object_id' => '%d', 'term_order' => '%d', 'ID' => '%d', 'comment_ID' => '%d', 'comment_post_ID' => '%d', 'comment_parent' => '%d',\n\t\t'user_id' => '%d', 'link_id' => '%d', 'link_owner' => '%d', 'link_rating' => '%d', 'option_id' => '%d', 'blog_id' => '%d', 'meta_id' => '%d', 'post_id' => '%d',\n\t\t'user_status' => '%d', 'umeta_id' => '%d', 'comment_karma' => '%d', 'comment_count' => '%d',\n\t\t// multisite:\n\t\t'active' => '%d', 'cat_id' => '%d', 'deleted' => '%d', 'lang_id' => '%d', 'mature' => '%d', 'public' => '%d', 'site_id' => '%d', 'spam' => '%d',\n\t);\n\n\t$prefix = $wpdb->set_prefix( $table_prefix );\n\n\tif ( is_wp_error( $prefix ) ) {\n\t\twp_load_translations_early();\n\t\twp_die(\n\t\t\t/* translators: 1: $table_prefix 2: wp-config.php */\n\t\t\tsprintf( __( '<strong>ERROR</strong>: %1$s in %2$s can only contain numbers, letters, and underscores.' ),\n\t\t\t\t'<code>$table_prefix</code>',\n\t\t\t\t'<code>wp-config.php</code>'\n\t\t\t)\n\t\t);\n\t}\n}\n\n/**\n * Toggle `$_wp_using_ext_object_cache` on and off without directly\n * touching global.\n *\n * @since 3.7.0\n *\n * @global bool $_wp_using_ext_object_cache\n *\n * @param bool $using Whether external object cache is being used.\n * @return bool The current 'using' setting.\n */\nfunction wp_using_ext_object_cache( $using = null ) {\n\tglobal $_wp_using_ext_object_cache;\n\t$current_using = $_wp_using_ext_object_cache;\n\tif ( null !== $using )\n\t\t$_wp_using_ext_object_cache = $using;\n\treturn $current_using;\n}\n\n/**\n * Start the WordPress object cache.\n *\n * If an object-cache.php file exists in the wp-content directory,\n * it uses that drop-in as an external object cache.\n *\n * @since 3.0.0\n * @access private\n *\n * @global int $blog_id Blog ID.\n */\nfunction wp_start_object_cache() {\n\tglobal $blog_id;\n\n\t$first_init = false;\n \tif ( ! function_exists( 'wp_cache_init' ) ) {\n\t\tif ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {\n\t\t\trequire_once ( WP_CONTENT_DIR . '/object-cache.php' );\n\t\t\tif ( function_exists( 'wp_cache_init' ) )\n\t\t\t\twp_using_ext_object_cache( true );\n\t\t}\n\n\t\t$first_init = true;\n\t} elseif ( ! wp_using_ext_object_cache() && file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {\n\t\t/*\n\t\t * Sometimes advanced-cache.php can load object-cache.php before\n\t\t * it is loaded here. This breaks the function_exists check above\n\t\t * and can result in `$_wp_using_ext_object_cache` being set\n\t\t * incorrectly. Double check if an external cache exists.\n\t\t */\n\t\twp_using_ext_object_cache( true );\n\t}\n\n\tif ( ! wp_using_ext_object_cache() )\n\t\trequire_once ( ABSPATH . WPINC . '/cache.php' );\n\n\t/*\n\t * If cache supports reset, reset instead of init if already\n\t * initialized. Reset signals to the cache that global IDs\n\t * have changed and it may need to update keys and cleanup caches.\n\t */\n\tif ( ! $first_init && function_exists( 'wp_cache_switch_to_blog' ) )\n\t\twp_cache_switch_to_blog( $blog_id );\n\telseif ( function_exists( 'wp_cache_init' ) )\n\t\twp_cache_init();\n\n\tif ( function_exists( 'wp_cache_add_global_groups' ) ) {\n\t\twp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks' ) );\n\t\twp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );\n\t}\n}\n\n/**\n * Redirect to the installer if WordPress is not installed.\n *\n * Dies with an error message when Multisite is enabled.\n *\n * @since 3.0.0\n * @access private\n */\nfunction wp_not_installed() {\n\tif ( is_multisite() ) {\n\t\tif ( ! is_blog_installed() && ! wp_installing() ) {\n\t\t\tnocache_headers();\n\n\t\t\twp_die( __( 'The site you have requested is not installed properly. Please contact the system administrator.' ) );\n\t\t}\n\t} elseif ( ! is_blog_installed() && ! wp_installing() ) {\n\t\tnocache_headers();\n\n\t\trequire( ABSPATH . WPINC . '/kses.php' );\n\t\trequire( ABSPATH . WPINC . '/pluggable.php' );\n\t\trequire( ABSPATH . WPINC . '/formatting.php' );\n\n\t\t$link = wp_guess_url() . '/wp-admin/install.php';\n\n\t\twp_redirect( $link );\n\t\tdie();\n\t}\n}\n\n/**\n * Retrieve an array of must-use plugin files.\n *\n * The default directory is wp-content/mu-plugins. To change the default\n * directory manually, define `WPMU_PLUGIN_DIR` and `WPMU_PLUGIN_URL`\n * in wp-config.php.\n *\n * @since 3.0.0\n * @access private\n *\n * @return array Files to include.\n */\nfunction wp_get_mu_plugins() {\n\t$mu_plugins = array();\n\tif ( !is_dir( WPMU_PLUGIN_DIR ) )\n\t\treturn $mu_plugins;\n\tif ( ! $dh = opendir( WPMU_PLUGIN_DIR ) )\n\t\treturn $mu_plugins;\n\twhile ( ( $plugin = readdir( $dh ) ) !== false ) {\n\t\tif ( substr( $plugin, -4 ) == '.php' )\n\t\t\t$mu_plugins[] = WPMU_PLUGIN_DIR . '/' . $plugin;\n\t}\n\tclosedir( $dh );\n\tsort( $mu_plugins );\n\n\treturn $mu_plugins;\n}\n\n/**\n * Retrieve an array of active and valid plugin files.\n *\n * While upgrading or installing WordPress, no plugins are returned.\n *\n * The default directory is wp-content/plugins. To change the default\n * directory manually, define `WP_PLUGIN_DIR` and `WP_PLUGIN_URL`\n * in wp-config.php.\n *\n * @since 3.0.0\n * @access private\n *\n * @return array Files.\n */\nfunction wp_get_active_and_valid_plugins() {\n\t$plugins = array();\n\t$active_plugins = (array) get_option( 'active_plugins', array() );\n\n\t// Check for hacks file if the option is enabled\n\tif ( get_option( 'hack_file' ) && file_exists( ABSPATH . 'my-hacks.php' ) ) {\n\t\t_deprecated_file( 'my-hacks.php', '1.5' );\n\t\tarray_unshift( $plugins, ABSPATH . 'my-hacks.php' );\n\t}\n\n\tif ( empty( $active_plugins ) || wp_installing() )\n\t\treturn $plugins;\n\n\t$network_plugins = is_multisite() ? wp_get_active_network_plugins() : false;\n\n\tforeach ( $active_plugins as $plugin ) {\n\t\tif ( ! validate_file( $plugin ) // $plugin must validate as file\n\t\t\t&& '.php' == substr( $plugin, -4 ) // $plugin must end with '.php'\n\t\t\t&& file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist\n\t\t\t// not already included as a network plugin\n\t\t\t&& ( ! $network_plugins || ! in_array( WP_PLUGIN_DIR . '/' . $plugin, $network_plugins ) )\n\t\t\t)\n\t\t$plugins[] = WP_PLUGIN_DIR . '/' . $plugin;\n\t}\n\treturn $plugins;\n}\n\n/**\n * Set internal encoding.\n *\n * In most cases the default internal encoding is latin1, which is\n * of no use, since we want to use the `mb_` functions for `utf-8` strings.\n *\n * @since 3.0.0\n * @access private\n */\nfunction wp_set_internal_encoding() {\n\tif ( function_exists( 'mb_internal_encoding' ) ) {\n\t\t$charset = get_option( 'blog_charset' );\n\t\tif ( ! $charset || ! @mb_internal_encoding( $charset ) )\n\t\t\tmb_internal_encoding( 'UTF-8' );\n\t}\n}\n\n/**\n * Add magic quotes to `$_GET`, `$_POST`, `$_COOKIE`, and `$_SERVER`.\n *\n * Also forces `$_REQUEST` to be `$_GET + $_POST`. If `$_SERVER`,\n * `$_COOKIE`, or `$_ENV` are needed, use those superglobals directly.\n *\n * @since 3.0.0\n * @access private\n */\nfunction wp_magic_quotes() {\n\t// If already slashed, strip.\n\tif ( get_magic_quotes_gpc() ) {\n\t\t$_GET    = stripslashes_deep( $_GET    );\n\t\t$_POST   = stripslashes_deep( $_POST   );\n\t\t$_COOKIE = stripslashes_deep( $_COOKIE );\n\t}\n\n\t// Escape with wpdb.\n\t$_GET    = add_magic_quotes( $_GET    );\n\t$_POST   = add_magic_quotes( $_POST   );\n\t$_COOKIE = add_magic_quotes( $_COOKIE );\n\t$_SERVER = add_magic_quotes( $_SERVER );\n\n\t// Force REQUEST to be GET + POST.\n\t$_REQUEST = array_merge( $_GET, $_POST );\n}\n\n/**\n * Runs just before PHP shuts down execution.\n *\n * @since 1.2.0\n * @access private\n */\nfunction shutdown_action_hook() {\n\t/**\n\t * Fires just before PHP shuts down execution.\n\t *\n\t * @since 1.2.0\n\t */\n\tdo_action( 'shutdown' );\n\n\twp_cache_close();\n}\n\n/**\n * Copy an object.\n *\n * @since 2.7.0\n * @deprecated 3.2.0\n *\n * @param object $object The object to clone.\n * @return object The cloned object.\n */\nfunction wp_clone( $object ) {\n\t// Use parens for clone to accommodate PHP 4. See #17880\n\treturn clone( $object );\n}\n\n/**\n * Whether the current request is for an administrative interface page.\n *\n * Does not check if the user is an administrator; {@see current_user_can()}\n * for checking roles and capabilities.\n *\n * @since 1.5.1\n *\n * @global WP_Screen $current_screen\n *\n * @return bool True if inside WordPress administration interface, false otherwise.\n */\nfunction is_admin() {\n\tif ( isset( $GLOBALS['current_screen'] ) )\n\t\treturn $GLOBALS['current_screen']->in_admin();\n\telseif ( defined( 'WP_ADMIN' ) )\n\t\treturn WP_ADMIN;\n\n\treturn false;\n}\n\n/**\n * Whether the current request is for a site's admininstrative interface.\n *\n * e.g. `/wp-admin/`\n *\n * Does not check if the user is an administrator; {@see current_user_can()}\n * for checking roles and capabilities.\n *\n * @since 3.1.0\n *\n * @global WP_Screen $current_screen\n *\n * @return bool True if inside WordPress blog administration pages.\n */\nfunction is_blog_admin() {\n\tif ( isset( $GLOBALS['current_screen'] ) )\n\t\treturn $GLOBALS['current_screen']->in_admin( 'site' );\n\telseif ( defined( 'WP_BLOG_ADMIN' ) )\n\t\treturn WP_BLOG_ADMIN;\n\n\treturn false;\n}\n\n/**\n * Whether the current request is for the network administrative interface.\n *\n * e.g. `/wp-admin/network/`\n *\n * Does not check if the user is an administrator; {@see current_user_can()}\n * for checking roles and capabilities.\n *\n * @since 3.1.0\n *\n * @global WP_Screen $current_screen\n *\n * @return bool True if inside WordPress network administration pages.\n */\nfunction is_network_admin() {\n\tif ( isset( $GLOBALS['current_screen'] ) )\n\t\treturn $GLOBALS['current_screen']->in_admin( 'network' );\n\telseif ( defined( 'WP_NETWORK_ADMIN' ) )\n\t\treturn WP_NETWORK_ADMIN;\n\n\treturn false;\n}\n\n/**\n * Whether the current request is for a user admin screen.\n *\n * e.g. `/wp-admin/user/`\n *\n * Does not inform on whether the user is an admin! Use capability\n * checks to tell if the user should be accessing a section or not\n * {@see current_user_can()}.\n *\n * @since 3.1.0\n *\n * @global WP_Screen $current_screen\n *\n * @return bool True if inside WordPress user administration pages.\n */\nfunction is_user_admin() {\n\tif ( isset( $GLOBALS['current_screen'] ) )\n\t\treturn $GLOBALS['current_screen']->in_admin( 'user' );\n\telseif ( defined( 'WP_USER_ADMIN' ) )\n\t\treturn WP_USER_ADMIN;\n\n\treturn false;\n}\n\n/**\n * If Multisite is enabled.\n *\n * @since 3.0.0\n *\n * @return bool True if Multisite is enabled, false otherwise.\n */\nfunction is_multisite() {\n\tif ( defined( 'MULTISITE' ) )\n\t\treturn MULTISITE;\n\n\tif ( defined( 'SUBDOMAIN_INSTALL' ) || defined( 'VHOST' ) || defined( 'SUNRISE' ) )\n\t\treturn true;\n\n\treturn false;\n}\n\n/**\n * Retrieve the current blog ID.\n *\n * @since 3.1.0\n *\n * @global int $blog_id\n *\n * @return int Blog id\n */\nfunction get_current_blog_id() {\n\tglobal $blog_id;\n\treturn absint($blog_id);\n}\n\n/**\n * Attempt an early load of translations.\n *\n * Used for errors encountered during the initial loading process, before\n * the locale has been properly detected and loaded.\n *\n * Designed for unusual load sequences (like setup-config.php) or for when\n * the script will then terminate with an error, otherwise there is a risk\n * that a file can be double-included.\n *\n * @since 3.4.0\n * @access private\n *\n * @global string    $text_direction\n * @global WP_Locale $wp_locale      The WordPress date and time locale object.\n *\n * @staticvar bool $loaded\n */\nfunction wp_load_translations_early() {\n\tglobal $text_direction, $wp_locale;\n\n\tstatic $loaded = false;\n\tif ( $loaded )\n\t\treturn;\n\t$loaded = true;\n\n\tif ( function_exists( 'did_action' ) && did_action( 'init' ) )\n\t\treturn;\n\n\t// We need $wp_local_package\n\trequire ABSPATH . WPINC . '/version.php';\n\n\t// Translation and localization\n\trequire_once ABSPATH . WPINC . '/pomo/mo.php';\n\trequire_once ABSPATH . WPINC . '/l10n.php';\n\trequire_once ABSPATH . WPINC . '/locale.php';\n\n\t// General libraries\n\trequire_once ABSPATH . WPINC . '/plugin.php';\n\n\t$locales = $locations = array();\n\n\twhile ( true ) {\n\t\tif ( defined( 'WPLANG' ) ) {\n\t\t\tif ( '' == WPLANG )\n\t\t\t\tbreak;\n\t\t\t$locales[] = WPLANG;\n\t\t}\n\n\t\tif ( isset( $wp_local_package ) )\n\t\t\t$locales[] = $wp_local_package;\n\n\t\tif ( ! $locales )\n\t\t\tbreak;\n\n\t\tif ( defined( 'WP_LANG_DIR' ) && @is_dir( WP_LANG_DIR ) )\n\t\t\t$locations[] = WP_LANG_DIR;\n\n\t\tif ( defined( 'WP_CONTENT_DIR' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) )\n\t\t\t$locations[] = WP_CONTENT_DIR . '/languages';\n\n\t\tif ( @is_dir( ABSPATH . 'wp-content/languages' ) )\n\t\t\t$locations[] = ABSPATH . 'wp-content/languages';\n\n\t\tif ( @is_dir( ABSPATH . WPINC . '/languages' ) )\n\t\t\t$locations[] = ABSPATH . WPINC . '/languages';\n\n\t\tif ( ! $locations )\n\t\t\tbreak;\n\n\t\t$locations = array_unique( $locations );\n\n\t\tforeach ( $locales as $locale ) {\n\t\t\tforeach ( $locations as $location ) {\n\t\t\t\tif ( file_exists( $location . '/' . $locale . '.mo' ) ) {\n\t\t\t\t\tload_textdomain( 'default', $location . '/' . $locale . '.mo' );\n\t\t\t\t\tif ( defined( 'WP_SETUP_CONFIG' ) && file_exists( $location . '/admin-' . $locale . '.mo' ) )\n\t\t\t\t\t\tload_textdomain( 'default', $location . '/admin-' . $locale . '.mo' );\n\t\t\t\t\tbreak 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbreak;\n\t}\n\n\t$wp_locale = new WP_Locale();\n}\n\n/**\n * Check or set whether WordPress is in \"installation\" mode.\n *\n * If the `WP_INSTALLING` constant is defined during the bootstrap, `wp_installing()` will default to `true`.\n *\n * @since 4.4.0\n *\n * @staticvar bool $installing\n *\n * @param bool $is_installing Optional. True to set WP into Installing mode, false to turn Installing mode off.\n *                            Omit this parameter if you only want to fetch the current status.\n * @return bool True if WP is installing, otherwise false. When a `$is_installing` is passed, the function will\n *              report whether WP was in installing mode prior to the change to `$is_installing`.\n */\nfunction wp_installing( $is_installing = null ) {\n\tstatic $installing = null;\n\n\t// Support for the `WP_INSTALLING` constant, defined before WP is loaded.\n\tif ( is_null( $installing ) ) {\n\t\t$installing = defined( 'WP_INSTALLING' ) && WP_INSTALLING;\n\t}\n\n\tif ( ! is_null( $is_installing ) ) {\n\t\t$old_installing = $installing;\n\t\t$installing = $is_installing;\n\t\treturn (bool) $old_installing;\n\t}\n\n\treturn (bool) $installing;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/locale.php",
    "content": "<?php\n/**\n * Date and Time Locale object\n *\n * @package WordPress\n * @subpackage i18n\n */\n\n/**\n * Class that loads the calendar locale.\n *\n * @since 2.1.0\n */\nclass WP_Locale {\n\t/**\n\t * Stores the translated strings for the full weekday names.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $weekday;\n\n\t/**\n\t * Stores the translated strings for the one character weekday names.\n\t *\n\t * There is a hack to make sure that Tuesday and Thursday, as well\n\t * as Sunday and Saturday, don't conflict. See init() method for more.\n\t *\n\t * @see WP_Locale::init() for how to handle the hack.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $weekday_initial;\n\n\t/**\n\t * Stores the translated strings for the abbreviated weekday names.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $weekday_abbrev;\n\n\t/**\n\t * Stores the default start of the week.\n\t *\n\t * @since 4.4.0\n\t * @var string\n\t */\n\tpublic $start_of_week;\n\n\t/**\n\t * Stores the translated strings for the full month names.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $month;\n\n\t/**\n\t * Stores the translated strings for the abbreviated month names.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $month_abbrev;\n\n\t/**\n\t * Stores the translated strings for 'am' and 'pm'.\n\t *\n\t * Also the capitalized versions.\n\t *\n\t * @since 2.1.0\n\t * @var array\n\t */\n\tpublic $meridiem;\n\n\t/**\n\t * The text direction of the locale language.\n\t *\n\t * Default is left to right 'ltr'.\n\t *\n\t * @since 2.1.0\n\t * @var string\n\t */\n\tpublic $text_direction = 'ltr';\n\n\t/**\n\t * The thousands separator and decimal point values used for localizing numbers.\n\t *\n\t * @since 2.3.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $number_format;\n\n\t/**\n\t * Sets up the translated strings and object properties.\n\t *\n\t * The method creates the translatable strings for various\n\t * calendar elements. Which allows for specifying locale\n\t * specific calendar names and text direction.\n\t *\n\t * @since 2.1.0\n\t * @access private\n\t *\n\t * @global string $text_direction\n\t * @global string $wp_version\n\t */\n\tpublic function init() {\n\t\t// The Weekdays\n\t\t$this->weekday[0] = /* translators: weekday */ __('Sunday');\n\t\t$this->weekday[1] = /* translators: weekday */ __('Monday');\n\t\t$this->weekday[2] = /* translators: weekday */ __('Tuesday');\n\t\t$this->weekday[3] = /* translators: weekday */ __('Wednesday');\n\t\t$this->weekday[4] = /* translators: weekday */ __('Thursday');\n\t\t$this->weekday[5] = /* translators: weekday */ __('Friday');\n\t\t$this->weekday[6] = /* translators: weekday */ __('Saturday');\n\n\t\t// The first letter of each day.\n\t\t$this->weekday_initial[ __( 'Sunday' ) ]    = /* translators: one-letter abbreviation of the weekday */ _x( 'S', 'Sunday initial' );\n\t\t$this->weekday_initial[ __( 'Monday' ) ]    = /* translators: one-letter abbreviation of the weekday */ _x( 'M', 'Monday initial' );\n\t\t$this->weekday_initial[ __( 'Tuesday' ) ]   = /* translators: one-letter abbreviation of the weekday */ _x( 'T', 'Tuesday initial' );\n\t\t$this->weekday_initial[ __( 'Wednesday' ) ] = /* translators: one-letter abbreviation of the weekday */ _x( 'W', 'Wednesday initial' );\n\t\t$this->weekday_initial[ __( 'Thursday' ) ]  = /* translators: one-letter abbreviation of the weekday */ _x( 'T', 'Thursday initial' );\n\t\t$this->weekday_initial[ __( 'Friday' ) ]    = /* translators: one-letter abbreviation of the weekday */ _x( 'F', 'Friday initial' );\n\t\t$this->weekday_initial[ __( 'Saturday' ) ]  = /* translators: one-letter abbreviation of the weekday */ _x( 'S', 'Saturday initial' );\n\n\t\t// Abbreviations for each day.\n\t\t$this->weekday_abbrev[__('Sunday')]    = /* translators: three-letter abbreviation of the weekday */ __('Sun');\n\t\t$this->weekday_abbrev[__('Monday')]    = /* translators: three-letter abbreviation of the weekday */ __('Mon');\n\t\t$this->weekday_abbrev[__('Tuesday')]   = /* translators: three-letter abbreviation of the weekday */ __('Tue');\n\t\t$this->weekday_abbrev[__('Wednesday')] = /* translators: three-letter abbreviation of the weekday */ __('Wed');\n\t\t$this->weekday_abbrev[__('Thursday')]  = /* translators: three-letter abbreviation of the weekday */ __('Thu');\n\t\t$this->weekday_abbrev[__('Friday')]    = /* translators: three-letter abbreviation of the weekday */ __('Fri');\n\t\t$this->weekday_abbrev[__('Saturday')]  = /* translators: three-letter abbreviation of the weekday */ __('Sat');\n\n\t\t// The Months\n\t\t$this->month['01'] = /* translators: month name */ __( 'January' );\n\t\t$this->month['02'] = /* translators: month name */ __( 'February' );\n\t\t$this->month['03'] = /* translators: month name */ __( 'March' );\n\t\t$this->month['04'] = /* translators: month name */ __( 'April' );\n\t\t$this->month['05'] = /* translators: month name */ __( 'May' );\n\t\t$this->month['06'] = /* translators: month name */ __( 'June' );\n\t\t$this->month['07'] = /* translators: month name */ __( 'July' );\n\t\t$this->month['08'] = /* translators: month name */ __( 'August' );\n\t\t$this->month['09'] = /* translators: month name */ __( 'September' );\n\t\t$this->month['10'] = /* translators: month name */ __( 'October' );\n\t\t$this->month['11'] = /* translators: month name */ __( 'November' );\n\t\t$this->month['12'] = /* translators: month name */ __( 'December' );\n\n\t\t// The Months, genitive\n\t\t$this->month_genitive['01'] = /* translators: month name, genitive */ _x( 'January', 'genitive' );\n\t\t$this->month_genitive['02'] = /* translators: month name, genitive */ _x( 'February', 'genitive' );\n\t\t$this->month_genitive['03'] = /* translators: month name, genitive */ _x( 'March', 'genitive' );\n\t\t$this->month_genitive['04'] = /* translators: month name, genitive */ _x( 'April', 'genitive' );\n\t\t$this->month_genitive['05'] = /* translators: month name, genitive */ _x( 'May', 'genitive' );\n\t\t$this->month_genitive['06'] = /* translators: month name, genitive */ _x( 'June', 'genitive' );\n\t\t$this->month_genitive['07'] = /* translators: month name, genitive */ _x( 'July', 'genitive' );\n\t\t$this->month_genitive['08'] = /* translators: month name, genitive */ _x( 'August', 'genitive' );\n\t\t$this->month_genitive['09'] = /* translators: month name, genitive */ _x( 'September', 'genitive' );\n\t\t$this->month_genitive['10'] = /* translators: month name, genitive */ _x( 'October', 'genitive' );\n\t\t$this->month_genitive['11'] = /* translators: month name, genitive */ _x( 'November', 'genitive' );\n\t\t$this->month_genitive['12'] = /* translators: month name, genitive */ _x( 'December', 'genitive' );\n\n\t\t// Abbreviations for each month.\n\t\t$this->month_abbrev[ __( 'January' ) ]   = /* translators: three-letter abbreviation of the month */ _x( 'Jan', 'January abbreviation' );\n\t\t$this->month_abbrev[ __( 'February' ) ]  = /* translators: three-letter abbreviation of the month */ _x( 'Feb', 'February abbreviation' );\n\t\t$this->month_abbrev[ __( 'March' ) ]     = /* translators: three-letter abbreviation of the month */ _x( 'Mar', 'March abbreviation' );\n\t\t$this->month_abbrev[ __( 'April' ) ]     = /* translators: three-letter abbreviation of the month */ _x( 'Apr', 'April abbreviation' );\n\t\t$this->month_abbrev[ __( 'May' ) ]       = /* translators: three-letter abbreviation of the month */ _x( 'May', 'May abbreviation' );\n\t\t$this->month_abbrev[ __( 'June' ) ]      = /* translators: three-letter abbreviation of the month */ _x( 'Jun', 'June abbreviation' );\n\t\t$this->month_abbrev[ __( 'July' ) ]      = /* translators: three-letter abbreviation of the month */ _x( 'Jul', 'July abbreviation' );\n\t\t$this->month_abbrev[ __( 'August' ) ]    = /* translators: three-letter abbreviation of the month */ _x( 'Aug', 'August abbreviation' );\n\t\t$this->month_abbrev[ __( 'September' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Sep', 'September abbreviation' );\n\t\t$this->month_abbrev[ __( 'October' ) ]   = /* translators: three-letter abbreviation of the month */ _x( 'Oct', 'October abbreviation' );\n\t\t$this->month_abbrev[ __( 'November' ) ]  = /* translators: three-letter abbreviation of the month */ _x( 'Nov', 'November abbreviation' );\n\t\t$this->month_abbrev[ __( 'December' ) ]  = /* translators: three-letter abbreviation of the month */ _x( 'Dec', 'December abbreviation' );\n\n\t\t// The Meridiems\n\t\t$this->meridiem['am'] = __('am');\n\t\t$this->meridiem['pm'] = __('pm');\n\t\t$this->meridiem['AM'] = __('AM');\n\t\t$this->meridiem['PM'] = __('PM');\n\n\t\t// Numbers formatting\n\t\t// See http://php.net/number_format\n\n\t\t/* translators: $thousands_sep argument for http://php.net/number_format, default is , */\n\t\t$trans = __('number_format_thousands_sep');\n\t\t$this->number_format['thousands_sep'] = ('number_format_thousands_sep' == $trans) ? ',' : $trans;\n\n\t\t/* translators: $dec_point argument for http://php.net/number_format, default is . */\n\t\t$trans = __('number_format_decimal_point');\n\t\t$this->number_format['decimal_point'] = ('number_format_decimal_point' == $trans) ? '.' : $trans;\n\n\t\t// Set text direction.\n\t\tif ( isset( $GLOBALS['text_direction'] ) )\n\t\t\t$this->text_direction = $GLOBALS['text_direction'];\n\t\t/* translators: 'rtl' or 'ltr'. This sets the text direction for WordPress. */\n\t\telseif ( 'rtl' == _x( 'ltr', 'text direction' ) )\n\t\t\t$this->text_direction = 'rtl';\n\n\t\tif ( 'rtl' === $this->text_direction && strpos( $GLOBALS['wp_version'], '-src' ) ) {\n\t\t\t$this->text_direction = 'ltr';\n\t\t\tadd_action( 'all_admin_notices', array( $this, 'rtl_src_admin_notice' ) );\n\t\t}\n\t}\n\n\t/**\n\t * @since 3.8.0\n\t */\n\tpublic function rtl_src_admin_notice() {\n\t\t/* translators: %s: Name of the directory (build) */\n\t\techo '<div class=\"error\"><p>' . sprintf( __( 'The %s directory of the develop repository must be used for RTL.' ), '<code>build</code>' ) . '</p></div>';\n\t}\n\n\t/**\n\t * Retrieve the full translated weekday word.\n\t *\n\t * Week starts on translated Sunday and can be fetched\n\t * by using 0 (zero). So the week starts with 0 (zero)\n\t * and ends on Saturday with is fetched by using 6 (six).\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param int $weekday_number 0 for Sunday through 6 Saturday\n\t * @return string Full translated weekday\n\t */\n\tpublic function get_weekday($weekday_number) {\n\t\treturn $this->weekday[$weekday_number];\n\t}\n\n\t/**\n\t * Retrieve the translated weekday initial.\n\t *\n\t * The weekday initial is retrieved by the translated\n\t * full weekday word. When translating the weekday initial\n\t * pay attention to make sure that the starting letter does\n\t * not conflict.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param string $weekday_name\n\t * @return string\n\t */\n\tpublic function get_weekday_initial($weekday_name) {\n\t\treturn $this->weekday_initial[$weekday_name];\n\t}\n\n\t/**\n\t * Retrieve the translated weekday abbreviation.\n\t *\n\t * The weekday abbreviation is retrieved by the translated\n\t * full weekday word.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param string $weekday_name Full translated weekday word\n\t * @return string Translated weekday abbreviation\n\t */\n\tpublic function get_weekday_abbrev($weekday_name) {\n\t\treturn $this->weekday_abbrev[$weekday_name];\n\t}\n\n\t/**\n\t * Retrieve the full translated month by month number.\n\t *\n\t * The $month_number parameter has to be a string\n\t * because it must have the '0' in front of any number\n\t * that is less than 10. Starts from '01' and ends at\n\t * '12'.\n\t *\n\t * You can use an integer instead and it will add the\n\t * '0' before the numbers less than 10 for you.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param string|int $month_number '01' through '12'\n\t * @return string Translated full month name\n\t */\n\tpublic function get_month($month_number) {\n\t\treturn $this->month[zeroise($month_number, 2)];\n\t}\n\n\t/**\n\t * Retrieve translated version of month abbreviation string.\n\t *\n\t * The $month_name parameter is expected to be the translated or\n\t * translatable version of the month.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param string $month_name Translated month to get abbreviated version\n\t * @return string Translated abbreviated month\n\t */\n\tpublic function get_month_abbrev($month_name) {\n\t\treturn $this->month_abbrev[$month_name];\n\t}\n\n\t/**\n\t * Retrieve translated version of meridiem string.\n\t *\n\t * The $meridiem parameter is expected to not be translated.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param string $meridiem Either 'am', 'pm', 'AM', or 'PM'. Not translated version.\n\t * @return string Translated version\n\t */\n\tpublic function get_meridiem($meridiem) {\n\t\treturn $this->meridiem[$meridiem];\n\t}\n\n\t/**\n\t * Global variables are deprecated. For backwards compatibility only.\n\t *\n\t * @deprecated For backwards compatibility only.\n\t * @access private\n\t *\n\t * @global array $weekday\n\t * @global array $weekday_initial\n\t * @global array $weekday_abbrev\n\t * @global array $month\n\t * @global array $month_abbrev\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function register_globals() {\n\t\t$GLOBALS['weekday']         = $this->weekday;\n\t\t$GLOBALS['weekday_initial'] = $this->weekday_initial;\n\t\t$GLOBALS['weekday_abbrev']  = $this->weekday_abbrev;\n\t\t$GLOBALS['month']           = $this->month;\n\t\t$GLOBALS['month_abbrev']    = $this->month_abbrev;\n\t}\n\n\t/**\n\t * Constructor which calls helper methods to set up object variables\n\t *\n\t * @since 2.1.0\n\t */\n\tpublic function __construct() {\n\t\t$this->init();\n\t\t$this->register_globals();\n\t}\n\n\t/**\n\t * Checks if current locale is RTL.\n\t *\n\t * @since 3.0.0\n\t * @return bool Whether locale is RTL.\n\t */\n\tpublic function is_rtl() {\n\t\treturn 'rtl' == $this->text_direction;\n\t}\n\n\t/**\n\t * Register date/time format strings for general POT.\n\t *\n\t * Private, unused method to add some date/time formats translated\n\t * on wp-admin/options-general.php to the general POT that would\n\t * otherwise be added to the admin POT.\n\t *\n\t * @since 3.6.0\n\t */\n\tpublic function _strings_for_pot() {\n\t\t/* translators: localized date format, see http://php.net/date */\n\t\t__( 'F j, Y' );\n\t\t/* translators: localized time format, see http://php.net/date */\n\t\t__( 'g:i a' );\n\t\t/* translators: localized date and time format, see http://php.net/date */\n\t\t__( 'F j, Y g:i a' );\n\t}\n}\n\n/**\n * Checks if current locale is RTL.\n *\n * @since 3.0.0\n *\n * @global WP_Locale $wp_locale\n *\n * @return bool Whether locale is RTL.\n */\nfunction is_rtl() {\n\tglobal $wp_locale;\n\treturn $wp_locale->is_rtl();\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/media-template.php",
    "content": "<?php\n/**\n * WordPress media templates.\n *\n * @package WordPress\n * @subpackage Media\n * @since 3.5.0\n */\n\n/**\n * Output the markup for a audio tag to be used in an Underscore template\n * when data.model is passed.\n *\n * @since 3.9.0\n */\nfunction wp_underscore_audio_template() {\n\t$audio_types = wp_get_audio_extensions();\n?>\n<audio style=\"visibility: hidden\"\n\tcontrols\n\tclass=\"wp-audio-shortcode\"\n\twidth=\"{{ _.isUndefined( data.model.width ) ? 400 : data.model.width }}\"\n\tpreload=\"{{ _.isUndefined( data.model.preload ) ? 'none' : data.model.preload }}\"\n\t<#\n\t<?php foreach ( array( 'autoplay', 'loop' ) as $attr ):\n\t?>if ( ! _.isUndefined( data.model.<?php echo $attr ?> ) && data.model.<?php echo $attr ?> ) {\n\t\t#> <?php echo $attr ?><#\n\t}\n\t<?php endforeach ?>#>\n>\n\t<# if ( ! _.isEmpty( data.model.src ) ) { #>\n\t<source src=\"{{ data.model.src }}\" type=\"{{ wp.media.view.settings.embedMimes[ data.model.src.split('.').pop() ] }}\" />\n\t<# } #>\n\n\t<?php foreach ( $audio_types as $type ):\n\t?><# if ( ! _.isEmpty( data.model.<?php echo $type ?> ) ) { #>\n\t<source src=\"{{ data.model.<?php echo $type ?> }}\" type=\"{{ wp.media.view.settings.embedMimes[ '<?php echo $type ?>' ] }}\" />\n\t<# } #>\n\t<?php endforeach;\n?></audio>\n<?php\n}\n\n/**\n * Output the markup for a video tag to be used in an Underscore template\n * when data.model is passed.\n *\n * @since 3.9.0\n */\nfunction wp_underscore_video_template() {\n\t$video_types = wp_get_video_extensions();\n?>\n<#  var w_rule = '', classes = [],\n\t\tw, h, settings = wp.media.view.settings,\n\t\tisYouTube = isVimeo = false;\n\n\tif ( ! _.isEmpty( data.model.src ) ) {\n\t\tisYouTube = data.model.src.match(/youtube|youtu\\.be/);\n\t\tisVimeo = -1 !== data.model.src.indexOf('vimeo');\n\t}\n\n\tif ( settings.contentWidth && data.model.width >= settings.contentWidth ) {\n\t\tw = settings.contentWidth;\n\t} else {\n\t\tw = data.model.width;\n\t}\n\n\tif ( w !== data.model.width ) {\n\t\th = Math.ceil( ( data.model.height * w ) / data.model.width );\n\t} else {\n\t\th = data.model.height;\n \t}\n\n\tif ( w ) {\n\t\tw_rule = 'width: ' + w + 'px; ';\n\t}\n\n\tif ( isYouTube ) {\n\t\tclasses.push( 'youtube-video' );\n\t}\n\n\tif ( isVimeo ) {\n\t\tclasses.push( 'vimeo-video' );\n\t}\n\n#>\n<div style=\"{{ w_rule }}\" class=\"wp-video\">\n<video controls\n\tclass=\"wp-video-shortcode {{ classes.join( ' ' ) }}\"\n\t<# if ( w ) { #>width=\"{{ w }}\"<# } #>\n\t<# if ( h ) { #>height=\"{{ h }}\"<# } #>\n\t<?php\n\t$props = array( 'poster' => '', 'preload' => 'metadata' );\n\tforeach ( $props as $key => $value ):\n\t\tif ( empty( $value ) ) {\n\t\t?><#\n\t\tif ( ! _.isUndefined( data.model.<?php echo $key ?> ) && data.model.<?php echo $key ?> ) {\n\t\t\t#> <?php echo $key ?>=\"{{ data.model.<?php echo $key ?> }}\"<#\n\t\t} #>\n\t\t<?php } else {\n\t\t\techo $key ?>=\"{{ _.isUndefined( data.model.<?php echo $key ?> ) ? '<?php echo $value ?>' : data.model.<?php echo $key ?> }}\"<?php\n\t\t}\n\tendforeach;\n\t?><#\n\t<?php foreach ( array( 'autoplay', 'loop' ) as $attr ):\n\t?> if ( ! _.isUndefined( data.model.<?php echo $attr ?> ) && data.model.<?php echo $attr ?> ) {\n\t\t#> <?php echo $attr ?><#\n\t}\n\t<?php endforeach ?>#>\n>\n\t<# if ( ! _.isEmpty( data.model.src ) ) {\n\t\tif ( isYouTube ) { #>\n\t\t<source src=\"{{ data.model.src }}\" type=\"video/youtube\" />\n\t\t<# } else if ( isVimeo ) { #>\n\t\t<source src=\"{{ data.model.src }}\" type=\"video/vimeo\" />\n\t\t<# } else { #>\n\t\t<source src=\"{{ data.model.src }}\" type=\"{{ settings.embedMimes[ data.model.src.split('.').pop() ] }}\" />\n\t\t<# }\n\t} #>\n\n\t<?php foreach ( $video_types as $type ):\n\t?><# if ( data.model.<?php echo $type ?> ) { #>\n\t<source src=\"{{ data.model.<?php echo $type ?> }}\" type=\"{{ settings.embedMimes[ '<?php echo $type ?>' ] }}\" />\n\t<# } #>\n\t<?php endforeach; ?>\n\t{{{ data.model.content }}}\n</video>\n</div>\n<?php\n}\n\n/**\n * Prints the templates used in the media manager.\n *\n * @since 3.5.0\n *\n * @global bool $is_IE\n */\nfunction wp_print_media_templates() {\n\tglobal $is_IE;\n\t$class = 'media-modal wp-core-ui';\n\tif ( $is_IE && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE 7') !== false )\n\t\t$class .= ' ie7';\n\t?>\n\t<!--[if lte IE 8]>\n\t<style>\n\t\t.attachment:focus {\n\t\t\toutline: #1e8cbe solid;\n\t\t}\n\t\t.selected.attachment {\n\t\t\toutline: #1e8cbe solid;\n\t\t}\n\t</style>\n\t<![endif]-->\n\t<script type=\"text/html\" id=\"tmpl-media-frame\">\n\t\t<div class=\"media-frame-menu\"></div>\n\t\t<div class=\"media-frame-title\"></div>\n\t\t<div class=\"media-frame-router\"></div>\n\t\t<div class=\"media-frame-content\"></div>\n\t\t<div class=\"media-frame-toolbar\"></div>\n\t\t<div class=\"media-frame-uploader\"></div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-media-modal\">\n\t\t<div class=\"<?php echo $class; ?>\">\n\t\t\t<button type=\"button\" class=\"button-link media-modal-close\"><span class=\"media-modal-icon\"><span class=\"screen-reader-text\"><?php _e( 'Close media panel' ); ?></span></span></button>\n\t\t\t<div class=\"media-modal-content\"></div>\n\t\t</div>\n\t\t<div class=\"media-modal-backdrop\"></div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-uploader-window\">\n\t\t<div class=\"uploader-window-content\">\n\t\t\t<h1><?php _e( 'Drop files to upload' ); ?></h1>\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-uploader-editor\">\n\t\t<div class=\"uploader-editor-content\">\n\t\t\t<div class=\"uploader-editor-title\"><?php _e( 'Drop files to upload' ); ?></div>\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-uploader-inline\">\n\t\t<# var messageClass = data.message ? 'has-upload-message' : 'no-upload-message'; #>\n\t\t<# if ( data.canClose ) { #>\n\t\t<button class=\"close dashicons dashicons-no\"><span class=\"screen-reader-text\"><?php _e( 'Close uploader' ); ?></span></button>\n\t\t<# } #>\n\t\t<div class=\"uploader-inline-content {{ messageClass }}\">\n\t\t<# if ( data.message ) { #>\n\t\t\t<h2 class=\"upload-message\">{{ data.message }}</h2>\n\t\t<# } #>\n\t\t<?php if ( ! _device_can_upload() ) : ?>\n\t\t\t<h2 class=\"upload-instructions\"><?php printf( __( 'The web browser on your device cannot be used to upload files. You may be able to use the <a href=\"%s\">native app for your device</a> instead.' ), 'https://apps.wordpress.org/' ); ?></h2>\n\t\t<?php elseif ( is_multisite() && ! is_upload_space_available() ) : ?>\n\t\t\t<h2 class=\"upload-instructions\"><?php _e( 'Upload Limit Exceeded' ); ?></h2>\n\t\t\t<?php\n\t\t\t/** This action is documented in wp-admin/includes/media.php */\n\t\t\tdo_action( 'upload_ui_over_quota' ); ?>\n\n\t\t<?php else : ?>\n\t\t\t<div class=\"upload-ui\">\n\t\t\t\t<h2 class=\"upload-instructions drop-instructions\"><?php _e( 'Drop files anywhere to upload' ); ?></h2>\n\t\t\t\t<p class=\"upload-instructions drop-instructions\"><?php _ex( 'or', 'Uploader: Drop files here - or - Select Files' ); ?></p>\n\t\t\t\t<button type=\"button\" class=\"browser button button-hero\"><?php _e( 'Select Files' ); ?></button>\n\t\t\t</div>\n\n\t\t\t<div class=\"upload-inline-status\"></div>\n\n\t\t\t<div class=\"post-upload-ui\">\n\t\t\t\t<?php\n\t\t\t\t/** This action is documented in wp-admin/includes/media.php */\n\t\t\t\tdo_action( 'pre-upload-ui' );\n\t\t\t\t/** This action is documented in wp-admin/includes/media.php */\n\t\t\t\tdo_action( 'pre-plupload-upload-ui' );\n\n\t\t\t\tif ( 10 === remove_action( 'post-plupload-upload-ui', 'media_upload_flash_bypass' ) ) {\n\t\t\t\t\t/** This action is documented in wp-admin/includes/media.php */\n\t\t\t\t\tdo_action( 'post-plupload-upload-ui' );\n\t\t\t\t\tadd_action( 'post-plupload-upload-ui', 'media_upload_flash_bypass' );\n\t\t\t\t} else {\n\t\t\t\t\t/** This action is documented in wp-admin/includes/media.php */\n\t\t\t\t\tdo_action( 'post-plupload-upload-ui' );\n\t\t\t\t}\n\n\t\t\t\t$max_upload_size = wp_max_upload_size();\n\t\t\t\tif ( ! $max_upload_size ) {\n\t\t\t\t\t$max_upload_size = 0;\n\t\t\t\t}\n\t\t\t\t?>\n\n\t\t\t\t<p class=\"max-upload-size\"><?php\n\t\t\t\t\tprintf( __( 'Maximum upload file size: %s.' ), esc_html( size_format( $max_upload_size ) ) );\n\t\t\t\t?></p>\n\n\t\t\t\t<# if ( data.suggestedWidth && data.suggestedHeight ) { #>\n\t\t\t\t\t<p class=\"suggested-dimensions\">\n\t\t\t\t\t\t<?php _e( 'Suggested image dimensions:' ); ?> {{data.suggestedWidth}} &times; {{data.suggestedHeight}}\n\t\t\t\t\t</p>\n\t\t\t\t<# } #>\n\n\t\t\t\t<?php\n\t\t\t\t/** This action is documented in wp-admin/includes/media.php */\n\t\t\t\tdo_action( 'post-upload-ui' ); ?>\n\t\t\t</div>\n\t\t<?php endif; ?>\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-media-library-view-switcher\">\n\t\t<a href=\"<?php echo esc_url( add_query_arg( 'mode', 'list', $_SERVER['REQUEST_URI'] ) ) ?>\" class=\"view-list\">\n\t\t\t<span class=\"screen-reader-text\"><?php _e( 'List View' ); ?></span>\n\t\t</a>\n\t\t<a href=\"<?php echo esc_url( add_query_arg( 'mode', 'grid', $_SERVER['REQUEST_URI'] ) ) ?>\" class=\"view-grid current\">\n\t\t\t<span class=\"screen-reader-text\"><?php _e( 'Grid View' ); ?></span>\n\t\t</a>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-uploader-status\">\n\t\t<h2><?php _e( 'Uploading' ); ?></h2>\n\t\t<button type=\"button\" class=\"button-link upload-dismiss-errors\"><span class=\"screen-reader-text\"><?php _e( 'Dismiss Errors' ); ?></span></button>\n\n\t\t<div class=\"media-progress-bar\"><div></div></div>\n\t\t<div class=\"upload-details\">\n\t\t\t<span class=\"upload-count\">\n\t\t\t\t<span class=\"upload-index\"></span> / <span class=\"upload-total\"></span>\n\t\t\t</span>\n\t\t\t<span class=\"upload-detail-separator\">&ndash;</span>\n\t\t\t<span class=\"upload-filename\"></span>\n\t\t</div>\n\t\t<div class=\"upload-errors\"></div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-uploader-status-error\">\n\t\t<span class=\"upload-error-filename\">{{{ data.filename }}}</span>\n\t\t<span class=\"upload-error-message\">{{ data.message }}</span>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-edit-attachment-frame\">\n\t\t<div class=\"edit-media-header\">\n\t\t\t<button class=\"left dashicons <# if ( ! data.hasPrevious ) { #> disabled <# } #>\"><span class=\"screen-reader-text\"><?php _e( 'Edit previous media item' ); ?></span></button>\n\t\t\t<button class=\"right dashicons <# if ( ! data.hasNext ) { #> disabled <# } #>\"><span class=\"screen-reader-text\"><?php _e( 'Edit next media item' ); ?></span></button>\n\t\t</div>\n\t\t<div class=\"media-frame-title\"></div>\n\t\t<div class=\"media-frame-content\"></div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-attachment-details-two-column\">\n\t\t<div class=\"attachment-media-view {{ data.orientation }}\">\n\t\t\t<div class=\"thumbnail thumbnail-{{ data.type }}\">\n\t\t\t\t<# if ( data.uploading ) { #>\n\t\t\t\t\t<div class=\"media-progress-bar\"><div></div></div>\n\t\t\t\t<# } else if ( 'image' === data.type && data.sizes && data.sizes.large ) { #>\n\t\t\t\t\t<img class=\"details-image\" src=\"{{ data.sizes.large.url }}\" draggable=\"false\" alt=\"\" />\n\t\t\t\t<# } else if ( 'image' === data.type && data.sizes && data.sizes.full ) { #>\n\t\t\t\t\t<img class=\"details-image\" src=\"{{ data.sizes.full.url }}\" draggable=\"false\" alt=\"\" />\n\t\t\t\t<# } else if ( -1 === jQuery.inArray( data.type, [ 'audio', 'video' ] ) ) { #>\n\t\t\t\t\t<img class=\"details-image icon\" src=\"{{ data.icon }}\" draggable=\"false\" alt=\"\" />\n\t\t\t\t<# } #>\n\n\t\t\t\t<# if ( 'audio' === data.type ) { #>\n\t\t\t\t<div class=\"wp-media-wrapper\">\n\t\t\t\t\t<audio style=\"visibility: hidden\" controls class=\"wp-audio-shortcode\" width=\"100%\" preload=\"none\">\n\t\t\t\t\t\t<source type=\"{{ data.mime }}\" src=\"{{ data.url }}\"/>\n\t\t\t\t\t</audio>\n\t\t\t\t</div>\n\t\t\t\t<# } else if ( 'video' === data.type ) {\n\t\t\t\t\tvar w_rule = '';\n\t\t\t\t\tif ( data.width ) {\n\t\t\t\t\t\tw_rule = 'width: ' + data.width + 'px;';\n\t\t\t\t\t} else if ( wp.media.view.settings.contentWidth ) {\n\t\t\t\t\t\tw_rule = 'width: ' + wp.media.view.settings.contentWidth + 'px;';\n\t\t\t\t\t}\n\t\t\t\t#>\n\t\t\t\t<div style=\"{{ w_rule }}\" class=\"wp-media-wrapper wp-video\">\n\t\t\t\t\t<video controls=\"controls\" class=\"wp-video-shortcode\" preload=\"metadata\"\n\t\t\t\t\t\t<# if ( data.width ) { #>width=\"{{ data.width }}\"<# } #>\n\t\t\t\t\t\t<# if ( data.height ) { #>height=\"{{ data.height }}\"<# } #>\n\t\t\t\t\t\t<# if ( data.image && data.image.src !== data.icon ) { #>poster=\"{{ data.image.src }}\"<# } #>>\n\t\t\t\t\t\t<source type=\"{{ data.mime }}\" src=\"{{ data.url }}\"/>\n\t\t\t\t\t</video>\n\t\t\t\t</div>\n\t\t\t\t<# } #>\n\n\t\t\t\t<div class=\"attachment-actions\">\n\t\t\t\t\t<# if ( 'image' === data.type && ! data.uploading && data.sizes && data.can.save ) { #>\n\t\t\t\t\t<button type=\"button\" class=\"button edit-attachment\"><?php _e( 'Edit Image' ); ?></button>\n\t\t\t\t\t<# } #>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"attachment-info\">\n\t\t\t<span class=\"settings-save-status\">\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t<span class=\"saved\"><?php esc_html_e('Saved.'); ?></span>\n\t\t\t</span>\n\t\t\t<div class=\"details\">\n\t\t\t\t<div class=\"filename\"><strong><?php _e( 'File name:' ); ?></strong> {{ data.filename }}</div>\n\t\t\t\t<div class=\"filename\"><strong><?php _e( 'File type:' ); ?></strong> {{ data.mime }}</div>\n\t\t\t\t<div class=\"uploaded\"><strong><?php _e( 'Uploaded on:' ); ?></strong> {{ data.dateFormatted }}</div>\n\n\t\t\t\t<div class=\"file-size\"><strong><?php _e( 'File size:' ); ?></strong> {{ data.filesizeHumanReadable }}</div>\n\t\t\t\t<# if ( 'image' === data.type && ! data.uploading ) { #>\n\t\t\t\t\t<# if ( data.width && data.height ) { #>\n\t\t\t\t\t\t<div class=\"dimensions\"><strong><?php _e( 'Dimensions:' ); ?></strong> {{ data.width }} &times; {{ data.height }}</div>\n\t\t\t\t\t<# } #>\n\t\t\t\t<# } #>\n\n\t\t\t\t<# if ( data.fileLength ) { #>\n\t\t\t\t\t<div class=\"file-length\"><strong><?php _e( 'Length:' ); ?></strong> {{ data.fileLength }}</div>\n\t\t\t\t<# } #>\n\n\t\t\t\t<# if ( 'audio' === data.type && data.meta.bitrate ) { #>\n\t\t\t\t\t<div class=\"bitrate\">\n\t\t\t\t\t\t<strong><?php _e( 'Bitrate:' ); ?></strong> {{ Math.round( data.meta.bitrate / 1000 ) }}kb/s\n\t\t\t\t\t\t<# if ( data.meta.bitrate_mode ) { #>\n\t\t\t\t\t\t{{ ' ' + data.meta.bitrate_mode.toUpperCase() }}\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t</div>\n\t\t\t\t<# } #>\n\n\t\t\t\t<div class=\"compat-meta\">\n\t\t\t\t\t<# if ( data.compat && data.compat.meta ) { #>\n\t\t\t\t\t\t{{{ data.compat.meta }}}\n\t\t\t\t\t<# } #>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"settings\">\n\t\t\t\t<label class=\"setting\" data-setting=\"url\">\n\t\t\t\t\t<span class=\"name\"><?php _e('URL'); ?></span>\n\t\t\t\t\t<input type=\"text\" value=\"{{ data.url }}\" readonly />\n\t\t\t\t</label>\n\t\t\t\t<# var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly'; #>\n\t\t\t\t<?php if ( post_type_supports( 'attachment', 'title' ) ) : ?>\n\t\t\t\t<label class=\"setting\" data-setting=\"title\">\n\t\t\t\t\t<span class=\"name\"><?php _e('Title'); ?></span>\n\t\t\t\t\t<input type=\"text\" value=\"{{ data.title }}\" {{ maybeReadOnly }} />\n\t\t\t\t</label>\n\t\t\t\t<?php endif; ?>\n\t\t\t\t<# if ( 'audio' === data.type ) { #>\n\t\t\t\t<?php foreach ( array(\n\t\t\t\t\t'artist' => __( 'Artist' ),\n\t\t\t\t\t'album' => __( 'Album' ),\n\t\t\t\t) as $key => $label ) : ?>\n\t\t\t\t<label class=\"setting\" data-setting=\"<?php echo esc_attr( $key ) ?>\">\n\t\t\t\t\t<span class=\"name\"><?php echo $label ?></span>\n\t\t\t\t\t<input type=\"text\" value=\"{{ data.<?php echo $key ?> || data.meta.<?php echo $key ?> || '' }}\" />\n\t\t\t\t</label>\n\t\t\t\t<?php endforeach; ?>\n\t\t\t\t<# } #>\n\t\t\t\t<label class=\"setting\" data-setting=\"caption\">\n\t\t\t\t\t<span class=\"name\"><?php _e( 'Caption' ); ?></span>\n\t\t\t\t\t<textarea {{ maybeReadOnly }}>{{ data.caption }}</textarea>\n\t\t\t\t</label>\n\t\t\t\t<# if ( 'image' === data.type ) { #>\n\t\t\t\t\t<label class=\"setting\" data-setting=\"alt\">\n\t\t\t\t\t\t<span class=\"name\"><?php _e( 'Alt Text' ); ?></span>\n\t\t\t\t\t\t<input type=\"text\" value=\"{{ data.alt }}\" {{ maybeReadOnly }} />\n\t\t\t\t\t</label>\n\t\t\t\t<# } #>\n\t\t\t\t<label class=\"setting\" data-setting=\"description\">\n\t\t\t\t\t<span class=\"name\"><?php _e('Description'); ?></span>\n\t\t\t\t\t<textarea {{ maybeReadOnly }}>{{ data.description }}</textarea>\n\t\t\t\t</label>\n\t\t\t\t<label class=\"setting\">\n\t\t\t\t\t<span class=\"name\"><?php _e( 'Uploaded By' ); ?></span>\n\t\t\t\t\t<span class=\"value\">{{ data.authorName }}</span>\n\t\t\t\t</label>\n\t\t\t\t<# if ( data.uploadedToTitle ) { #>\n\t\t\t\t\t<label class=\"setting\">\n\t\t\t\t\t\t<span class=\"name\"><?php _e( 'Uploaded To' ); ?></span>\n\t\t\t\t\t\t<# if ( data.uploadedToLink ) { #>\n\t\t\t\t\t\t\t<span class=\"value\"><a href=\"{{ data.uploadedToLink }}\">{{ data.uploadedToTitle }}</a></span>\n\t\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t\t<span class=\"value\">{{ data.uploadedToTitle }}</span>\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t</label>\n\t\t\t\t<# } #>\n\t\t\t\t<div class=\"attachment-compat\"></div>\n\t\t\t</div>\n\n\t\t\t<div class=\"actions\">\n\t\t\t\t<a class=\"view-attachment\" href=\"{{ data.link }}\"><?php _e( 'View attachment page' ); ?></a>\n\t\t\t\t<# if ( data.can.save ) { #> |\n\t\t\t\t\t<a href=\"post.php?post={{ data.id }}&action=edit\"><?php _e( 'Edit more details' ); ?></a>\n\t\t\t\t<# } #>\n\t\t\t\t<# if ( ! data.uploading && data.can.remove ) { #> |\n\t\t\t\t\t<?php if ( MEDIA_TRASH ): ?>\n\t\t\t\t\t\t<# if ( 'trash' === data.status ) { #>\n\t\t\t\t\t\t\t<button type=\"button\" class=\"button-link untrash-attachment\"><?php _e( 'Untrash' ); ?></button>\n\t\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t\t<button type=\"button\" class=\"button-link trash-attachment\"><?php _ex( 'Trash', 'verb' ); ?></button>\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t<?php else: ?>\n\t\t\t\t\t\t<button type=\"button\" class=\"button-link delete-attachment\"><?php _e( 'Delete Permanently' ); ?></button>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t<# } #>\n\t\t\t</div>\n\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-attachment\">\n\t\t<div class=\"attachment-preview js--select-attachment type-{{ data.type }} subtype-{{ data.subtype }} {{ data.orientation }}\">\n\t\t\t<div class=\"thumbnail\">\n\t\t\t\t<# if ( data.uploading ) { #>\n\t\t\t\t\t<div class=\"media-progress-bar\"><div style=\"width: {{ data.percent }}%\"></div></div>\n\t\t\t\t<# } else if ( 'image' === data.type && data.sizes ) { #>\n\t\t\t\t\t<div class=\"centered\">\n\t\t\t\t\t\t<img src=\"{{ data.size.url }}\" draggable=\"false\" alt=\"\" />\n\t\t\t\t\t</div>\n\t\t\t\t<# } else { #>\n\t\t\t\t\t<div class=\"centered\">\n\t\t\t\t\t\t<# if ( data.image && data.image.src && data.image.src !== data.icon ) { #>\n\t\t\t\t\t\t\t<img src=\"{{ data.image.src }}\" class=\"thumbnail\" draggable=\"false\" alt=\"\" />\n\t\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t\t<img src=\"{{ data.icon }}\" class=\"icon\" draggable=\"false\" alt=\"\" />\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"filename\">\n\t\t\t\t\t\t<div>{{ data.filename }}</div>\n\t\t\t\t\t</div>\n\t\t\t\t<# } #>\n\t\t\t</div>\n\t\t\t<# if ( data.buttons.close ) { #>\n\t\t\t\t<button type=\"button\" class=\"button-link attachment-close media-modal-icon\"><span class=\"screen-reader-text\"><?php _e( 'Remove' ); ?></span></button>\n\t\t\t<# } #>\n\t\t</div>\n\t\t<# if ( data.buttons.check ) { #>\n\t\t\t<button type=\"button\" class=\"button-link check\" tabindex=\"-1\"><span class=\"media-modal-icon\"></span><span class=\"screen-reader-text\"><?php _e( 'Deselect' ); ?></span></button>\n\t\t<# } #>\n\t\t<#\n\t\tvar maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly';\n\t\tif ( data.describe ) {\n\t\t\tif ( 'image' === data.type ) { #>\n\t\t\t\t<input type=\"text\" value=\"{{ data.caption }}\" class=\"describe\" data-setting=\"caption\"\n\t\t\t\t\tplaceholder=\"<?php esc_attr_e('Caption this image&hellip;'); ?>\" {{ maybeReadOnly }} />\n\t\t\t<# } else { #>\n\t\t\t\t<input type=\"text\" value=\"{{ data.title }}\" class=\"describe\" data-setting=\"title\"\n\t\t\t\t\t<# if ( 'video' === data.type ) { #>\n\t\t\t\t\t\tplaceholder=\"<?php esc_attr_e('Describe this video&hellip;'); ?>\"\n\t\t\t\t\t<# } else if ( 'audio' === data.type ) { #>\n\t\t\t\t\t\tplaceholder=\"<?php esc_attr_e('Describe this audio file&hellip;'); ?>\"\n\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\tplaceholder=\"<?php esc_attr_e('Describe this media file&hellip;'); ?>\"\n\t\t\t\t\t<# } #> {{ maybeReadOnly }} />\n\t\t\t<# }\n\t\t} #>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-attachment-details\">\n\t\t<h2>\n\t\t\t<?php _e( 'Attachment Details' ); ?>\n\t\t\t<span class=\"settings-save-status\">\n\t\t\t\t<span class=\"spinner\"></span>\n\t\t\t\t<span class=\"saved\"><?php esc_html_e('Saved.'); ?></span>\n\t\t\t</span>\n\t\t</h2>\n\t\t<div class=\"attachment-info\">\n\t\t\t<div class=\"thumbnail thumbnail-{{ data.type }}\">\n\t\t\t\t<# if ( data.uploading ) { #>\n\t\t\t\t\t<div class=\"media-progress-bar\"><div></div></div>\n\t\t\t\t<# } else if ( 'image' === data.type && data.sizes ) { #>\n\t\t\t\t\t<img src=\"{{ data.size.url }}\" draggable=\"false\" alt=\"\" />\n\t\t\t\t<# } else { #>\n\t\t\t\t\t<img src=\"{{ data.icon }}\" class=\"icon\" draggable=\"false\" alt=\"\" />\n\t\t\t\t<# } #>\n\t\t\t</div>\n\t\t\t<div class=\"details\">\n\t\t\t\t<div class=\"filename\">{{ data.filename }}</div>\n\t\t\t\t<div class=\"uploaded\">{{ data.dateFormatted }}</div>\n\n\t\t\t\t<div class=\"file-size\">{{ data.filesizeHumanReadable }}</div>\n\t\t\t\t<# if ( 'image' === data.type && ! data.uploading ) { #>\n\t\t\t\t\t<# if ( data.width && data.height ) { #>\n\t\t\t\t\t\t<div class=\"dimensions\">{{ data.width }} &times; {{ data.height }}</div>\n\t\t\t\t\t<# } #>\n\n\t\t\t\t\t<# if ( data.can.save && data.sizes ) { #>\n\t\t\t\t\t\t<a class=\"edit-attachment\" href=\"{{ data.editLink }}&amp;image-editor\" target=\"_blank\"><?php _e( 'Edit Image' ); ?></a>\n\t\t\t\t\t<# } #>\n\t\t\t\t<# } #>\n\n\t\t\t\t<# if ( data.fileLength ) { #>\n\t\t\t\t\t<div class=\"file-length\"><?php _e( 'Length:' ); ?> {{ data.fileLength }}</div>\n\t\t\t\t<# } #>\n\n\t\t\t\t<# if ( ! data.uploading && data.can.remove ) { #>\n\t\t\t\t\t<?php if ( MEDIA_TRASH ): ?>\n\t\t\t\t\t<# if ( 'trash' === data.status ) { #>\n\t\t\t\t\t\t<button type=\"button\" class=\"button-link untrash-attachment\"><?php _e( 'Untrash' ); ?></button>\n\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t<button type=\"button\" class=\"button-link trash-attachment\"><?php _ex( 'Trash', 'verb' ); ?></button>\n\t\t\t\t\t<# } #>\n\t\t\t\t\t<?php else: ?>\n\t\t\t\t\t\t<button type=\"button\" class=\"button-link delete-attachment\"><?php _e( 'Delete Permanently' ); ?></button>\n\t\t\t\t\t<?php endif; ?>\n\t\t\t\t<# } #>\n\n\t\t\t\t<div class=\"compat-meta\">\n\t\t\t\t\t<# if ( data.compat && data.compat.meta ) { #>\n\t\t\t\t\t\t{{{ data.compat.meta }}}\n\t\t\t\t\t<# } #>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<label class=\"setting\" data-setting=\"url\">\n\t\t\t<span class=\"name\"><?php _e('URL'); ?></span>\n\t\t\t<input type=\"text\" value=\"{{ data.url }}\" readonly />\n\t\t</label>\n\t\t<# var maybeReadOnly = data.can.save || data.allowLocalEdits ? '' : 'readonly'; #>\n\t\t<?php if ( post_type_supports( 'attachment', 'title' ) ) : ?>\n\t\t<label class=\"setting\" data-setting=\"title\">\n\t\t\t<span class=\"name\"><?php _e('Title'); ?></span>\n\t\t\t<input type=\"text\" value=\"{{ data.title }}\" {{ maybeReadOnly }} />\n\t\t</label>\n\t\t<?php endif; ?>\n\t\t<# if ( 'audio' === data.type ) { #>\n\t\t<?php foreach ( array(\n\t\t\t'artist' => __( 'Artist' ),\n\t\t\t'album' => __( 'Album' ),\n\t\t) as $key => $label ) : ?>\n\t\t<label class=\"setting\" data-setting=\"<?php echo esc_attr( $key ) ?>\">\n\t\t\t<span class=\"name\"><?php echo $label ?></span>\n\t\t\t<input type=\"text\" value=\"{{ data.<?php echo $key ?> || data.meta.<?php echo $key ?> || '' }}\" />\n\t\t</label>\n\t\t<?php endforeach; ?>\n\t\t<# } #>\n\t\t<label class=\"setting\" data-setting=\"caption\">\n\t\t\t<span class=\"name\"><?php _e('Caption'); ?></span>\n\t\t\t<textarea {{ maybeReadOnly }}>{{ data.caption }}</textarea>\n\t\t</label>\n\t\t<# if ( 'image' === data.type ) { #>\n\t\t\t<label class=\"setting\" data-setting=\"alt\">\n\t\t\t\t<span class=\"name\"><?php _e('Alt Text'); ?></span>\n\t\t\t\t<input type=\"text\" value=\"{{ data.alt }}\" {{ maybeReadOnly }} />\n\t\t\t</label>\n\t\t<# } #>\n\t\t<label class=\"setting\" data-setting=\"description\">\n\t\t\t<span class=\"name\"><?php _e('Description'); ?></span>\n\t\t\t<textarea {{ maybeReadOnly }}>{{ data.description }}</textarea>\n\t\t</label>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-media-selection\">\n\t\t<div class=\"selection-info\">\n\t\t\t<span class=\"count\"></span>\n\t\t\t<# if ( data.editable ) { #>\n\t\t\t\t<button type=\"button\" class=\"button-link edit-selection\"><?php _e( 'Edit Selection' ); ?></button>\n\t\t\t<# } #>\n\t\t\t<# if ( data.clearable ) { #>\n\t\t\t\t<button type=\"button\" class=\"button-link clear-selection\"><?php _e( 'Clear' ); ?></button>\n\t\t\t<# } #>\n\t\t</div>\n\t\t<div class=\"selection-view\"></div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-attachment-display-settings\">\n\t\t<h2><?php _e( 'Attachment Display Settings' ); ?></h2>\n\n\t\t<# if ( 'image' === data.type ) { #>\n\t\t\t<label class=\"setting\">\n\t\t\t\t<span><?php _e('Alignment'); ?></span>\n\t\t\t\t<select class=\"alignment\"\n\t\t\t\t\tdata-setting=\"align\"\n\t\t\t\t\t<# if ( data.userSettings ) { #>\n\t\t\t\t\t\tdata-user-setting=\"align\"\n\t\t\t\t\t<# } #>>\n\n\t\t\t\t\t<option value=\"left\">\n\t\t\t\t\t\t<?php esc_attr_e('Left'); ?>\n\t\t\t\t\t</option>\n\t\t\t\t\t<option value=\"center\">\n\t\t\t\t\t\t<?php esc_attr_e('Center'); ?>\n\t\t\t\t\t</option>\n\t\t\t\t\t<option value=\"right\">\n\t\t\t\t\t\t<?php esc_attr_e('Right'); ?>\n\t\t\t\t\t</option>\n\t\t\t\t\t<option value=\"none\" selected>\n\t\t\t\t\t\t<?php esc_attr_e('None'); ?>\n\t\t\t\t\t</option>\n\t\t\t\t</select>\n\t\t\t</label>\n\t\t<# } #>\n\n\t\t<div class=\"setting\">\n\t\t\t<label>\n\t\t\t\t<# if ( data.model.canEmbed ) { #>\n\t\t\t\t\t<span><?php _e('Embed or Link'); ?></span>\n\t\t\t\t<# } else { #>\n\t\t\t\t\t<span><?php _e('Link To'); ?></span>\n\t\t\t\t<# } #>\n\n\t\t\t\t<select class=\"link-to\"\n\t\t\t\t\tdata-setting=\"link\"\n\t\t\t\t\t<# if ( data.userSettings && ! data.model.canEmbed ) { #>\n\t\t\t\t\t\tdata-user-setting=\"urlbutton\"\n\t\t\t\t\t<# } #>>\n\n\t\t\t\t<# if ( data.model.canEmbed ) { #>\n\t\t\t\t\t<option value=\"embed\" selected>\n\t\t\t\t\t\t<?php esc_attr_e('Embed Media Player'); ?>\n\t\t\t\t\t</option>\n\t\t\t\t\t<option value=\"file\">\n\t\t\t\t<# } else { #>\n\t\t\t\t\t<option value=\"none\" selected>\n\t\t\t\t\t\t<?php esc_attr_e('None'); ?>\n\t\t\t\t\t</option>\n\t\t\t\t\t<option value=\"file\">\n\t\t\t\t<# } #>\n\t\t\t\t\t<# if ( data.model.canEmbed ) { #>\n\t\t\t\t\t\t<?php esc_attr_e('Link to Media File'); ?>\n\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t<?php esc_attr_e('Media File'); ?>\n\t\t\t\t\t<# } #>\n\t\t\t\t\t</option>\n\t\t\t\t\t<option value=\"post\">\n\t\t\t\t\t<# if ( data.model.canEmbed ) { #>\n\t\t\t\t\t\t<?php esc_attr_e('Link to Attachment Page'); ?>\n\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t<?php esc_attr_e('Attachment Page'); ?>\n\t\t\t\t\t<# } #>\n\t\t\t\t\t</option>\n\t\t\t\t<# if ( 'image' === data.type ) { #>\n\t\t\t\t\t<option value=\"custom\">\n\t\t\t\t\t\t<?php esc_attr_e('Custom URL'); ?>\n\t\t\t\t\t</option>\n\t\t\t\t<# } #>\n\t\t\t\t</select>\n\t\t\t</label>\n\t\t\t<input type=\"text\" class=\"link-to-custom\" data-setting=\"linkUrl\" />\n\t\t</div>\n\n\t\t<# if ( 'undefined' !== typeof data.sizes ) { #>\n\t\t\t<label class=\"setting\">\n\t\t\t\t<span><?php _e('Size'); ?></span>\n\t\t\t\t<select class=\"size\" name=\"size\"\n\t\t\t\t\tdata-setting=\"size\"\n\t\t\t\t\t<# if ( data.userSettings ) { #>\n\t\t\t\t\t\tdata-user-setting=\"imgsize\"\n\t\t\t\t\t<# } #>>\n\t\t\t\t\t<?php\n\t\t\t\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\t\t\t\t$sizes = apply_filters( 'image_size_names_choose', array(\n\t\t\t\t\t\t'thumbnail' => __('Thumbnail'),\n\t\t\t\t\t\t'medium'    => __('Medium'),\n\t\t\t\t\t\t'large'     => __('Large'),\n\t\t\t\t\t\t'full'      => __('Full Size'),\n\t\t\t\t\t) );\n\n\t\t\t\t\tforeach ( $sizes as $value => $name ) : ?>\n\t\t\t\t\t\t<#\n\t\t\t\t\t\tvar size = data.sizes['<?php echo esc_js( $value ); ?>'];\n\t\t\t\t\t\tif ( size ) { #>\n\t\t\t\t\t\t\t<option value=\"<?php echo esc_attr( $value ); ?>\" <?php selected( $value, 'full' ); ?>>\n\t\t\t\t\t\t\t\t<?php echo esc_html( $name ); ?> &ndash; {{ size.width }} &times; {{ size.height }}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t<?php endforeach; ?>\n\t\t\t\t</select>\n\t\t\t</label>\n\t\t<# } #>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-gallery-settings\">\n\t\t<h2><?php _e( 'Gallery Settings' ); ?></h2>\n\n\t\t<label class=\"setting\">\n\t\t\t<span><?php _e('Link To'); ?></span>\n\t\t\t<select class=\"link-to\"\n\t\t\t\tdata-setting=\"link\"\n\t\t\t\t<# if ( data.userSettings ) { #>\n\t\t\t\t\tdata-user-setting=\"urlbutton\"\n\t\t\t\t<# } #>>\n\n\t\t\t\t<option value=\"post\" <# if ( ! wp.media.galleryDefaults.link || 'post' == wp.media.galleryDefaults.link ) {\n\t\t\t\t\t#>selected=\"selected\"<# }\n\t\t\t\t#>>\n\t\t\t\t\t<?php esc_attr_e('Attachment Page'); ?>\n\t\t\t\t</option>\n\t\t\t\t<option value=\"file\" <# if ( 'file' == wp.media.galleryDefaults.link ) { #>selected=\"selected\"<# } #>>\n\t\t\t\t\t<?php esc_attr_e('Media File'); ?>\n\t\t\t\t</option>\n\t\t\t\t<option value=\"none\" <# if ( 'none' == wp.media.galleryDefaults.link ) { #>selected=\"selected\"<# } #>>\n\t\t\t\t\t<?php esc_attr_e('None'); ?>\n\t\t\t\t</option>\n\t\t\t</select>\n\t\t</label>\n\n\t\t<label class=\"setting\">\n\t\t\t<span><?php _e('Columns'); ?></span>\n\t\t\t<select class=\"columns\" name=\"columns\"\n\t\t\t\tdata-setting=\"columns\">\n\t\t\t\t<?php for ( $i = 1; $i <= 9; $i++ ) : ?>\n\t\t\t\t\t<option value=\"<?php echo esc_attr( $i ); ?>\" <#\n\t\t\t\t\t\tif ( <?php echo $i ?> == wp.media.galleryDefaults.columns ) { #>selected=\"selected\"<# }\n\t\t\t\t\t#>>\n\t\t\t\t\t\t<?php echo esc_html( $i ); ?>\n\t\t\t\t\t</option>\n\t\t\t\t<?php endfor; ?>\n\t\t\t</select>\n\t\t</label>\n\n\t\t<label class=\"setting\">\n\t\t\t<span><?php _e( 'Random Order' ); ?></span>\n\t\t\t<input type=\"checkbox\" data-setting=\"_orderbyRandom\" />\n\t\t</label>\n\n\t\t<label class=\"setting size\">\n\t\t\t<span><?php _e( 'Size' ); ?></span>\n\t\t\t<select class=\"size\" name=\"size\"\n\t\t\t\tdata-setting=\"size\"\n\t\t\t\t<# if ( data.userSettings ) { #>\n\t\t\t\t\tdata-user-setting=\"imgsize\"\n\t\t\t\t<# } #>\n\t\t\t\t>\n\t\t\t\t<?php\n\t\t\t\t// This filter is documented in wp-admin/includes/media.php\n\t\t\t\t$size_names = apply_filters( 'image_size_names_choose', array(\n\t\t\t\t\t'thumbnail' => __( 'Thumbnail' ),\n\t\t\t\t\t'medium'    => __( 'Medium' ),\n\t\t\t\t\t'large'     => __( 'Large' ),\n\t\t\t\t\t'full'      => __( 'Full Size' ),\n\t\t\t\t) );\n\n\t\t\t\tforeach ( $size_names as $size => $label ) : ?>\n\t\t\t\t\t<option value=\"<?php echo esc_attr( $size ); ?>\">\n\t\t\t\t\t\t<?php echo esc_html( $label ); ?>\n\t\t\t\t\t</option>\n\t\t\t\t<?php endforeach; ?>\n\t\t\t</select>\n\t\t</label>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-playlist-settings\">\n\t\t<h2><?php _e( 'Playlist Settings' ); ?></h2>\n\n\t\t<# var emptyModel = _.isEmpty( data.model ),\n\t\t\tisVideo = 'video' === data.controller.get('library').props.get('type'); #>\n\n\t\t<label class=\"setting\">\n\t\t\t<input type=\"checkbox\" data-setting=\"tracklist\" <# if ( emptyModel ) { #>\n\t\t\t\tchecked=\"checked\"\n\t\t\t<# } #> />\n\t\t\t<# if ( isVideo ) { #>\n\t\t\t<span><?php _e( 'Show Video List' ); ?></span>\n\t\t\t<# } else { #>\n\t\t\t<span><?php _e( 'Show Tracklist' ); ?></span>\n\t\t\t<# } #>\n\t\t</label>\n\n\t\t<# if ( ! isVideo ) { #>\n\t\t<label class=\"setting\">\n\t\t\t<input type=\"checkbox\" data-setting=\"artists\" <# if ( emptyModel ) { #>\n\t\t\t\tchecked=\"checked\"\n\t\t\t<# } #> />\n\t\t\t<span><?php _e( 'Show Artist Name in Tracklist' ); ?></span>\n\t\t</label>\n\t\t<# } #>\n\n\t\t<label class=\"setting\">\n\t\t\t<input type=\"checkbox\" data-setting=\"images\" <# if ( emptyModel ) { #>\n\t\t\t\tchecked=\"checked\"\n\t\t\t<# } #> />\n\t\t\t<span><?php _e( 'Show Images' ); ?></span>\n\t\t</label>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-embed-link-settings\">\n\t\t<label class=\"setting link-text\">\n\t\t\t<span><?php _e( 'Link Text' ); ?></span>\n\t\t\t<input type=\"text\" class=\"alignment\" data-setting=\"linkText\" />\n\t\t</label>\n\t\t<div class=\"embed-container\" style=\"display: none;\">\n\t\t\t<div class=\"embed-preview\"></div>\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-embed-image-settings\">\n\t\t<div class=\"thumbnail\">\n\t\t\t<img src=\"{{ data.model.url }}\" draggable=\"false\" alt=\"\" />\n\t\t</div>\n\n\t\t<?php\n\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\tif ( ! apply_filters( 'disable_captions', '' ) ) : ?>\n\t\t\t<label class=\"setting caption\">\n\t\t\t\t<span><?php _e('Caption'); ?></span>\n\t\t\t\t<textarea data-setting=\"caption\" />\n\t\t\t</label>\n\t\t<?php endif; ?>\n\n\t\t<label class=\"setting alt-text\">\n\t\t\t<span><?php _e('Alt Text'); ?></span>\n\t\t\t<input type=\"text\" data-setting=\"alt\" />\n\t\t</label>\n\n\t\t<div class=\"setting align\">\n\t\t\t<span><?php _e('Align'); ?></span>\n\t\t\t<div class=\"button-group button-large\" data-setting=\"align\">\n\t\t\t\t<button class=\"button\" value=\"left\">\n\t\t\t\t\t<?php esc_attr_e('Left'); ?>\n\t\t\t\t</button>\n\t\t\t\t<button class=\"button\" value=\"center\">\n\t\t\t\t\t<?php esc_attr_e('Center'); ?>\n\t\t\t\t</button>\n\t\t\t\t<button class=\"button\" value=\"right\">\n\t\t\t\t\t<?php esc_attr_e('Right'); ?>\n\t\t\t\t</button>\n\t\t\t\t<button class=\"button active\" value=\"none\">\n\t\t\t\t\t<?php esc_attr_e('None'); ?>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"setting link-to\">\n\t\t\t<span><?php _e('Link To'); ?></span>\n\t\t\t<div class=\"button-group button-large\" data-setting=\"link\">\n\t\t\t\t<button class=\"button\" value=\"file\">\n\t\t\t\t\t<?php esc_attr_e('Image URL'); ?>\n\t\t\t\t</button>\n\t\t\t\t<button class=\"button\" value=\"custom\">\n\t\t\t\t\t<?php esc_attr_e('Custom URL'); ?>\n\t\t\t\t</button>\n\t\t\t\t<button class=\"button active\" value=\"none\">\n\t\t\t\t\t<?php esc_attr_e('None'); ?>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<input type=\"text\" class=\"link-to-custom\" data-setting=\"linkUrl\" />\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-image-details\">\n\t\t<div class=\"media-embed\">\n\t\t\t<div class=\"embed-media-settings\">\n\t\t\t\t<div class=\"column-image\">\n\t\t\t\t\t<div class=\"image\">\n\t\t\t\t\t\t<img src=\"{{ data.model.url }}\" draggable=\"false\" alt=\"\" />\n\n\t\t\t\t\t\t<# if ( data.attachment && window.imageEdit ) { #>\n\t\t\t\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t\t\t\t<input type=\"button\" class=\"edit-attachment button\" value=\"<?php esc_attr_e( 'Edit Original' ); ?>\" />\n\t\t\t\t\t\t\t\t<input type=\"button\" class=\"replace-attachment button\" value=\"<?php esc_attr_e( 'Replace' ); ?>\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"column-settings\">\n\t\t\t\t\t<?php\n\t\t\t\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\t\t\t\tif ( ! apply_filters( 'disable_captions', '' ) ) : ?>\n\t\t\t\t\t\t<label class=\"setting caption\">\n\t\t\t\t\t\t\t<span><?php _e('Caption'); ?></span>\n\t\t\t\t\t\t\t<textarea data-setting=\"caption\">{{ data.model.caption }}</textarea>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t<?php endif; ?>\n\n\t\t\t\t\t<label class=\"setting alt-text\">\n\t\t\t\t\t\t<span><?php _e('Alternative Text'); ?></span>\n\t\t\t\t\t\t<input type=\"text\" data-setting=\"alt\" value=\"{{ data.model.alt }}\" />\n\t\t\t\t\t</label>\n\n\t\t\t\t\t<h2><?php _e( 'Display Settings' ); ?></h2>\n\t\t\t\t\t<div class=\"setting align\">\n\t\t\t\t\t\t<span><?php _e('Align'); ?></span>\n\t\t\t\t\t\t<div class=\"button-group button-large\" data-setting=\"align\">\n\t\t\t\t\t\t\t<button class=\"button\" value=\"left\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('Left'); ?>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button class=\"button\" value=\"center\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('Center'); ?>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button class=\"button\" value=\"right\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('Right'); ?>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button class=\"button active\" value=\"none\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('None'); ?>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<# if ( data.attachment ) { #>\n\t\t\t\t\t\t<# if ( 'undefined' !== typeof data.attachment.sizes ) { #>\n\t\t\t\t\t\t\t<label class=\"setting size\">\n\t\t\t\t\t\t\t\t<span><?php _e('Size'); ?></span>\n\t\t\t\t\t\t\t\t<select class=\"size\" name=\"size\"\n\t\t\t\t\t\t\t\t\tdata-setting=\"size\"\n\t\t\t\t\t\t\t\t\t<# if ( data.userSettings ) { #>\n\t\t\t\t\t\t\t\t\t\tdata-user-setting=\"imgsize\"\n\t\t\t\t\t\t\t\t\t<# } #>>\n\t\t\t\t\t\t\t\t\t<?php\n\t\t\t\t\t\t\t\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\t\t\t\t\t\t\t\t$sizes = apply_filters( 'image_size_names_choose', array(\n\t\t\t\t\t\t\t\t\t\t'thumbnail' => __('Thumbnail'),\n\t\t\t\t\t\t\t\t\t\t'medium'    => __('Medium'),\n\t\t\t\t\t\t\t\t\t\t'large'     => __('Large'),\n\t\t\t\t\t\t\t\t\t\t'full'      => __('Full Size'),\n\t\t\t\t\t\t\t\t\t) );\n\n\t\t\t\t\t\t\t\t\tforeach ( $sizes as $value => $name ) : ?>\n\t\t\t\t\t\t\t\t\t\t<#\n\t\t\t\t\t\t\t\t\t\tvar size = data.sizes['<?php echo esc_js( $value ); ?>'];\n\t\t\t\t\t\t\t\t\t\tif ( size ) { #>\n\t\t\t\t\t\t\t\t\t\t\t<option value=\"<?php echo esc_attr( $value ); ?>\">\n\t\t\t\t\t\t\t\t\t\t\t\t<?php echo esc_html( $name ); ?> &ndash; {{ size.width }} &times; {{ size.height }}\n\t\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t\t<# } #>\n\t\t\t\t\t\t\t\t\t<?php endforeach; ?>\n\t\t\t\t\t\t\t\t\t<option value=\"<?php echo esc_attr( 'custom' ); ?>\">\n\t\t\t\t\t\t\t\t\t\t<?php _e( 'Custom Size' ); ?>\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t\t\t<div class=\"custom-size<# if ( data.model.size !== 'custom' ) { #> hidden<# } #>\">\n\t\t\t\t\t\t\t\t<label><span><?php _e( 'Width' ); ?> <small>(px)</small></span> <input data-setting=\"customWidth\" type=\"number\" step=\"1\" value=\"{{ data.model.customWidth }}\" /></label><span class=\"sep\">&times;</span><label><span><?php _e( 'Height' ); ?> <small>(px)</small></span><input data-setting=\"customHeight\" type=\"number\" step=\"1\" value=\"{{ data.model.customHeight }}\" /></label>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t<# } #>\n\n\t\t\t\t\t<div class=\"setting link-to\">\n\t\t\t\t\t\t<span><?php _e('Link To'); ?></span>\n\t\t\t\t\t\t<select data-setting=\"link\">\n\t\t\t\t\t\t<# if ( data.attachment ) { #>\n\t\t\t\t\t\t\t<option value=\"file\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('Media File'); ?>\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t<option value=\"post\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('Attachment Page'); ?>\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t\t<option value=\"file\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('Image URL'); ?>\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t\t\t<option value=\"custom\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('Custom URL'); ?>\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t<option value=\"none\">\n\t\t\t\t\t\t\t\t<?php esc_attr_e('None'); ?>\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<input type=\"text\" class=\"link-to-custom\" data-setting=\"linkUrl\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"advanced-section\">\n\t\t\t\t\t\t<h2><button type=\"button\" class=\"button-link advanced-toggle\"><?php _e( 'Advanced Options' ); ?></button></h2>\n\t\t\t\t\t\t<div class=\"advanced-settings hidden\">\n\t\t\t\t\t\t\t<div class=\"advanced-image\">\n\t\t\t\t\t\t\t\t<label class=\"setting title-text\">\n\t\t\t\t\t\t\t\t\t<span><?php _e('Image Title Attribute'); ?></span>\n\t\t\t\t\t\t\t\t\t<input type=\"text\" data-setting=\"title\" value=\"{{ data.model.title }}\" />\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<label class=\"setting extra-classes\">\n\t\t\t\t\t\t\t\t\t<span><?php _e('Image CSS Class'); ?></span>\n\t\t\t\t\t\t\t\t\t<input type=\"text\" data-setting=\"extraClasses\" value=\"{{ data.model.extraClasses }}\" />\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"advanced-link\">\n\t\t\t\t\t\t\t\t<div class=\"setting link-target\">\n\t\t\t\t\t\t\t\t\t<label><input type=\"checkbox\" data-setting=\"linkTargetBlank\" value=\"_blank\" <# if ( data.model.linkTargetBlank ) { #>checked=\"checked\"<# } #>><?php _e( 'Open link in a new tab' ); ?></label>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<label class=\"setting link-rel\">\n\t\t\t\t\t\t\t\t\t<span><?php _e('Link Rel'); ?></span>\n\t\t\t\t\t\t\t\t\t<input type=\"text\" data-setting=\"linkRel\" value=\"{{ data.model.linkClassName }}\" />\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t<label class=\"setting link-class-name\">\n\t\t\t\t\t\t\t\t\t<span><?php _e('Link CSS Class'); ?></span>\n\t\t\t\t\t\t\t\t\t<input type=\"text\" data-setting=\"linkClassName\" value=\"{{ data.model.linkClassName }}\" />\n\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-image-editor\">\n\t\t<div id=\"media-head-{{ data.id }}\"></div>\n\t\t<div id=\"image-editor-{{ data.id }}\"></div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-audio-details\">\n\t\t<# var ext, html5types = {\n\t\t\tmp3: wp.media.view.settings.embedMimes.mp3,\n\t\t\togg: wp.media.view.settings.embedMimes.ogg\n\t\t}; #>\n\n\t\t<?php $audio_types = wp_get_audio_extensions(); ?>\n\t\t<div class=\"media-embed media-embed-details\">\n\t\t\t<div class=\"embed-media-settings embed-audio-settings\">\n\t\t\t\t<?php wp_underscore_audio_template() ?>\n\n\t\t\t\t<# if ( ! _.isEmpty( data.model.src ) ) {\n\t\t\t\t\text = data.model.src.split('.').pop();\n\t\t\t\t\tif ( html5types[ ext ] ) {\n\t\t\t\t\t\tdelete html5types[ ext ];\n\t\t\t\t\t}\n\t\t\t\t#>\n\t\t\t\t<label class=\"setting\">\n\t\t\t\t\t<span>SRC</span>\n\t\t\t\t\t<input type=\"text\" disabled=\"disabled\" data-setting=\"src\" value=\"{{ data.model.src }}\" />\n\t\t\t\t\t<button type=\"button\" class=\"button-link remove-setting\"><?php _e( 'Remove audio source' ); ?></button>\n\t\t\t\t</label>\n\t\t\t\t<# } #>\n\t\t\t\t<?php\n\n\t\t\t\tforeach ( $audio_types as $type ):\n\t\t\t\t?><# if ( ! _.isEmpty( data.model.<?php echo $type ?> ) ) {\n\t\t\t\t\tif ( ! _.isUndefined( html5types.<?php echo $type ?> ) ) {\n\t\t\t\t\t\tdelete html5types.<?php echo $type ?>;\n\t\t\t\t\t}\n\t\t\t\t#>\n\t\t\t\t<label class=\"setting\">\n\t\t\t\t\t<span><?php echo strtoupper( $type ) ?></span>\n\t\t\t\t\t<input type=\"text\" disabled=\"disabled\" data-setting=\"<?php echo $type ?>\" value=\"{{ data.model.<?php echo $type ?> }}\" />\n\t\t\t\t\t<button type=\"button\" class=\"button-link remove-setting\"><?php _e( 'Remove audio source' ); ?></button>\n\t\t\t\t</label>\n\t\t\t\t<# } #>\n\t\t\t\t<?php endforeach ?>\n\n\t\t\t\t<# if ( ! _.isEmpty( html5types ) ) { #>\n\t\t\t\t<div class=\"setting\">\n\t\t\t\t\t<span><?php _e( 'Add alternate sources for maximum HTML5 playback:' ) ?></span>\n\t\t\t\t\t<div class=\"button-large\">\n\t\t\t\t\t<# _.each( html5types, function (mime, type) { #>\n\t\t\t\t\t<button class=\"button add-media-source\" data-mime=\"{{ mime }}\">{{ type }}</button>\n\t\t\t\t\t<# } ) #>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<# } #>\n\n\t\t\t\t<div class=\"setting preload\">\n\t\t\t\t\t<span><?php _e( 'Preload' ); ?></span>\n\t\t\t\t\t<div class=\"button-group button-large\" data-setting=\"preload\">\n\t\t\t\t\t\t<button class=\"button\" value=\"auto\"><?php _ex( 'Auto', 'auto preload' ); ?></button>\n\t\t\t\t\t\t<button class=\"button\" value=\"metadata\"><?php _e( 'Metadata' ); ?></button>\n\t\t\t\t\t\t<button class=\"button active\" value=\"none\"><?php _e( 'None' ); ?></button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<label class=\"setting checkbox-setting\">\n\t\t\t\t\t<input type=\"checkbox\" data-setting=\"autoplay\" />\n\t\t\t\t\t<span><?php _e( 'Autoplay' ); ?></span>\n\t\t\t\t</label>\n\n\t\t\t\t<label class=\"setting checkbox-setting\">\n\t\t\t\t\t<input type=\"checkbox\" data-setting=\"loop\" />\n\t\t\t\t\t<span><?php _e( 'Loop' ); ?></span>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-video-details\">\n\t\t<# var ext, html5types = {\n\t\t\tmp4: wp.media.view.settings.embedMimes.mp4,\n\t\t\togv: wp.media.view.settings.embedMimes.ogv,\n\t\t\twebm: wp.media.view.settings.embedMimes.webm\n\t\t}; #>\n\n\t\t<?php $video_types = wp_get_video_extensions(); ?>\n\t\t<div class=\"media-embed media-embed-details\">\n\t\t\t<div class=\"embed-media-settings embed-video-settings\">\n\t\t\t\t<div class=\"wp-video-holder\">\n\t\t\t\t<#\n\t\t\t\tvar w = ! data.model.width || data.model.width > 640 ? 640 : data.model.width,\n\t\t\t\t\th = ! data.model.height ? 360 : data.model.height;\n\n\t\t\t\tif ( data.model.width && w !== data.model.width ) {\n\t\t\t\t\th = Math.ceil( ( h * w ) / data.model.width );\n\t\t\t\t}\n\t\t\t\t#>\n\n\t\t\t\t<?php wp_underscore_video_template() ?>\n\n\t\t\t\t<# if ( ! _.isEmpty( data.model.src ) ) {\n\t\t\t\t\text = data.model.src.split('.').pop();\n\t\t\t\t\tif ( html5types[ ext ] ) {\n\t\t\t\t\t\tdelete html5types[ ext ];\n\t\t\t\t\t}\n\t\t\t\t#>\n\t\t\t\t<label class=\"setting\">\n\t\t\t\t\t<span>SRC</span>\n\t\t\t\t\t<input type=\"text\" disabled=\"disabled\" data-setting=\"src\" value=\"{{ data.model.src }}\" />\n\t\t\t\t\t<button type=\"button\" class=\"button-link remove-setting\"><?php _e( 'Remove video source' ); ?></button>\n\t\t\t\t</label>\n\t\t\t\t<# } #>\n\t\t\t\t<?php foreach ( $video_types as $type ):\n\t\t\t\t?><# if ( ! _.isEmpty( data.model.<?php echo $type ?> ) ) {\n\t\t\t\t\tif ( ! _.isUndefined( html5types.<?php echo $type ?> ) ) {\n\t\t\t\t\t\tdelete html5types.<?php echo $type ?>;\n\t\t\t\t\t}\n\t\t\t\t#>\n\t\t\t\t<label class=\"setting\">\n\t\t\t\t\t<span><?php echo strtoupper( $type ) ?></span>\n\t\t\t\t\t<input type=\"text\" disabled=\"disabled\" data-setting=\"<?php echo $type ?>\" value=\"{{ data.model.<?php echo $type ?> }}\" />\n\t\t\t\t\t<button type=\"button\" class=\"button-link remove-setting\"><?php _e( 'Remove video source' ); ?></button>\n\t\t\t\t</label>\n\t\t\t\t<# } #>\n\t\t\t\t<?php endforeach ?>\n\t\t\t\t</div>\n\n\t\t\t\t<# if ( ! _.isEmpty( html5types ) ) { #>\n\t\t\t\t<div class=\"setting\">\n\t\t\t\t\t<span><?php _e( 'Add alternate sources for maximum HTML5 playback:' ); ?></span>\n\t\t\t\t\t<div class=\"button-large\">\n\t\t\t\t\t<# _.each( html5types, function (mime, type) { #>\n\t\t\t\t\t<button class=\"button add-media-source\" data-mime=\"{{ mime }}\">{{ type }}</button>\n\t\t\t\t\t<# } ) #>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<# } #>\n\n\t\t\t\t<# if ( ! _.isEmpty( data.model.poster ) ) { #>\n\t\t\t\t<label class=\"setting\">\n\t\t\t\t\t<span><?php _e( 'Poster Image' ); ?></span>\n\t\t\t\t\t<input type=\"text\" disabled=\"disabled\" data-setting=\"poster\" value=\"{{ data.model.poster }}\" />\n\t\t\t\t\t<button type=\"button\" class=\"button-link remove-setting\"><?php _e( 'Remove poster image' ); ?></button>\n\t\t\t\t</label>\n\t\t\t\t<# } #>\n\t\t\t\t<div class=\"setting preload\">\n\t\t\t\t\t<span><?php _e( 'Preload' ); ?></span>\n\t\t\t\t\t<div class=\"button-group button-large\" data-setting=\"preload\">\n\t\t\t\t\t\t<button class=\"button\" value=\"auto\"><?php _ex( 'Auto', 'auto preload' ); ?></button>\n\t\t\t\t\t\t<button class=\"button\" value=\"metadata\"><?php _e( 'Metadata' ); ?></button>\n\t\t\t\t\t\t<button class=\"button active\" value=\"none\"><?php _e( 'None' ); ?></button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<label class=\"setting checkbox-setting\">\n\t\t\t\t\t<input type=\"checkbox\" data-setting=\"autoplay\" />\n\t\t\t\t\t<span><?php _e( 'Autoplay' ); ?></span>\n\t\t\t\t</label>\n\n\t\t\t\t<label class=\"setting checkbox-setting\">\n\t\t\t\t\t<input type=\"checkbox\" data-setting=\"loop\" />\n\t\t\t\t\t<span><?php _e( 'Loop' ); ?></span>\n\t\t\t\t</label>\n\n\t\t\t\t<label class=\"setting\" data-setting=\"content\">\n\t\t\t\t\t<span><?php _e( 'Tracks (subtitles, captions, descriptions, chapters, or metadata)' ); ?></span>\n\t\t\t\t\t<#\n\t\t\t\t\tvar content = '';\n\t\t\t\t\tif ( ! _.isEmpty( data.model.content ) ) {\n\t\t\t\t\t\tvar tracks = jQuery( data.model.content ).filter( 'track' );\n\t\t\t\t\t\t_.each( tracks.toArray(), function (track) {\n\t\t\t\t\t\t\tcontent += track.outerHTML; #>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<input class=\"content-track\" type=\"text\" value=\"{{ track.outerHTML }}\" />\n\t\t\t\t\t\t\t<button type=\"button\" class=\"button-link remove-setting remove-track\"><?php _ex( 'Remove video track', 'media' ); ?></button>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<# } ); #>\n\t\t\t\t\t<# } else { #>\n\t\t\t\t\t<em><?php _e( 'There are no associated subtitles.' ); ?></em>\n\t\t\t\t\t<# } #>\n\t\t\t\t\t<textarea class=\"hidden content-setting\">{{ content }}</textarea>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-editor-gallery\">\n\t\t<# if ( data.attachments.length ) { #>\n\t\t\t<div class=\"gallery gallery-columns-{{ data.columns }}\">\n\t\t\t\t<# _.each( data.attachments, function( attachment, index ) { #>\n\t\t\t\t\t<dl class=\"gallery-item\">\n\t\t\t\t\t\t<dt class=\"gallery-icon\">\n\t\t\t\t\t\t\t<# if ( attachment.thumbnail ) { #>\n\t\t\t\t\t\t\t\t<img src=\"{{ attachment.thumbnail.url }}\" width=\"{{ attachment.thumbnail.width }}\" height=\"{{ attachment.thumbnail.height }}\" alt=\"\" />\n\t\t\t\t\t\t\t<# } else { #>\n\t\t\t\t\t\t\t\t<img src=\"{{ attachment.url }}\" alt=\"\" />\n\t\t\t\t\t\t\t<# } #>\n\t\t\t\t\t\t</dt>\n\t\t\t\t\t\t<# if ( attachment.caption ) { #>\n\t\t\t\t\t\t\t<dd class=\"wp-caption-text gallery-caption\">\n\t\t\t\t\t\t\t\t{{{ data.verifyHTML( attachment.caption ) }}}\n\t\t\t\t\t\t\t</dd>\n\t\t\t\t\t\t<# } #>\n\t\t\t\t\t</dl>\n\t\t\t\t\t<# if ( index % data.columns === data.columns - 1 ) { #>\n\t\t\t\t\t\t<br style=\"clear: both;\">\n\t\t\t\t\t<# } #>\n\t\t\t\t<# } ); #>\n\t\t\t</div>\n\t\t<# } else { #>\n\t\t\t<div class=\"wpview-error\">\n\t\t\t\t<div class=\"dashicons dashicons-format-gallery\"></div><p><?php _e( 'No items found.' ); ?></p>\n\t\t\t</div>\n\t\t<# } #>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-crop-content\">\n\t\t<img class=\"crop-image\" src=\"{{ data.url }}\" alt=\"\">\n\t\t<div class=\"upload-errors\"></div>\n\t</script>\n\n\t<script type=\"text/html\" id=\"tmpl-site-icon-preview\">\n\t\t<h2><?php _e( 'Preview' ); ?></h2>\n\t\t<strong><?php _e( 'As a browser icon' ); ?></strong>\n\t\t<div class=\"favicon-preview\">\n\t\t\t<img src=\"images/browser.png\" class=\"browser-preview\" width=\"182\" height=\"\" alt=\"\" />\n\n\t\t\t<div class=\"favicon\">\n\t\t\t\t<img id=\"preview-favicon\" src=\"{{ data.url }}\" alt=\"<?php esc_attr_e( 'Preview as a browser icon' ); ?>\"/>\n\t\t\t</div>\n\t\t\t<span class=\"browser-title\"><?php bloginfo( 'name' ); ?></span>\n\t\t</div>\n\n\t\t<strong><?php _e( 'As an app icon' ); ?></strong>\n\t\t<div class=\"app-icon-preview\">\n\t\t\t<img id=\"preview-app-icon\" src=\"{{ data.url }}\" alt=\"<?php esc_attr_e( 'Preview as an app icon' ); ?>\"/>\n\t\t</div>\n\t</script>\n\n\t<?php\n\n\t/**\n\t * Fires when the custom Backbone media templates are printed.\n\t *\n\t * @since 3.5.0\n\t */\n\tdo_action( 'print_media_templates' );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/media.php",
    "content": "<?php\n/**\n * WordPress API for media display.\n *\n * @package WordPress\n * @subpackage Media\n */\n\n/**\n * Scale down the default size of an image.\n *\n * This is so that the image is a better fit for the editor and theme.\n *\n * The `$size` parameter accepts either an array or a string. The supported string\n * values are 'thumb' or 'thumbnail' for the given thumbnail size or defaults at\n * 128 width and 96 height in pixels. Also supported for the string value is\n * 'medium', 'medium_large' and 'full'. The 'full' isn't actually supported, but any value other\n * than the supported will result in the content_width size or 500 if that is\n * not set.\n *\n * Finally, there is a filter named {@see 'editor_max_image_size'}, that will be\n * called on the calculated array for width and height, respectively. The second\n * parameter will be the value that was in the $size parameter. The returned\n * type for the hook is an array with the width as the first element and the\n * height as the second element.\n *\n * @since 2.5.0\n *\n * @global int   $content_width\n * @global array $_wp_additional_image_sizes\n *\n * @param int          $width   Width of the image in pixels.\n * @param int          $height  Height of the image in pixels.\n * @param string|array $size    Optional. Image size. Accepts any valid image size, or an array\n *                              of width and height values in pixels (in that order).\n *                              Default 'medium'.\n * @param string       $context Optional. Could be 'display' (like in a theme) or 'edit'\n *                              (like inserting into an editor). Default null.\n * @return array Width and height of what the result image should resize to.\n */\nfunction image_constrain_size_for_editor( $width, $height, $size = 'medium', $context = null ) {\n\tglobal $content_width, $_wp_additional_image_sizes;\n\n\tif ( ! $context )\n\t\t$context = is_admin() ? 'edit' : 'display';\n\n\tif ( is_array($size) ) {\n\t\t$max_width = $size[0];\n\t\t$max_height = $size[1];\n\t}\n\telseif ( $size == 'thumb' || $size == 'thumbnail' ) {\n\t\t$max_width = intval(get_option('thumbnail_size_w'));\n\t\t$max_height = intval(get_option('thumbnail_size_h'));\n\t\t// last chance thumbnail size defaults\n\t\tif ( !$max_width && !$max_height ) {\n\t\t\t$max_width = 128;\n\t\t\t$max_height = 96;\n\t\t}\n\t}\n\telseif ( $size == 'medium' ) {\n\t\t$max_width = intval(get_option('medium_size_w'));\n\t\t$max_height = intval(get_option('medium_size_h'));\n\n\t}\n\telseif ( $size == 'medium_large' ) {\n\t\t$max_width = intval( get_option( 'medium_large_size_w' ) );\n\t\t$max_height = intval( get_option( 'medium_large_size_h' ) );\n\n\t\tif ( intval( $content_width ) > 0 ) {\n\t\t\t$max_width = min( intval( $content_width ), $max_width );\n\t\t}\n\t}\n\telseif ( $size == 'large' ) {\n\t\t/*\n\t\t * We're inserting a large size image into the editor. If it's a really\n\t\t * big image we'll scale it down to fit reasonably within the editor\n\t\t * itself, and within the theme's content width if it's known. The user\n\t\t * can resize it in the editor if they wish.\n\t\t */\n\t\t$max_width = intval(get_option('large_size_w'));\n\t\t$max_height = intval(get_option('large_size_h'));\n\t\tif ( intval($content_width) > 0 ) {\n\t\t\t$max_width = min( intval($content_width), $max_width );\n\t\t}\n\t} elseif ( isset( $_wp_additional_image_sizes ) && count( $_wp_additional_image_sizes ) && in_array( $size, array_keys( $_wp_additional_image_sizes ) ) ) {\n\t\t$max_width = intval( $_wp_additional_image_sizes[$size]['width'] );\n\t\t$max_height = intval( $_wp_additional_image_sizes[$size]['height'] );\n\t\tif ( intval($content_width) > 0 && 'edit' == $context ) // Only in admin. Assume that theme authors know what they're doing.\n\t\t\t$max_width = min( intval($content_width), $max_width );\n\t}\n\t// $size == 'full' has no constraint\n\telse {\n\t\t$max_width = $width;\n\t\t$max_height = $height;\n\t}\n\n\t/**\n\t * Filter the maximum image size dimensions for the editor.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array        $max_image_size An array with the width as the first element,\n\t *                                     and the height as the second element.\n\t * @param string|array $size           Size of what the result image should be.\n\t * @param string       $context        The context the image is being resized for.\n\t *                                     Possible values are 'display' (like in a theme)\n\t *                                     or 'edit' (like inserting into an editor).\n\t */\n\tlist( $max_width, $max_height ) = apply_filters( 'editor_max_image_size', array( $max_width, $max_height ), $size, $context );\n\n\treturn wp_constrain_dimensions( $width, $height, $max_width, $max_height );\n}\n\n/**\n * Retrieve width and height attributes using given width and height values.\n *\n * Both attributes are required in the sense that both parameters must have a\n * value, but are optional in that if you set them to false or null, then they\n * will not be added to the returned string.\n *\n * You can set the value using a string, but it will only take numeric values.\n * If you wish to put 'px' after the numbers, then it will be stripped out of\n * the return.\n *\n * @since 2.5.0\n *\n * @param int|string $width  Image width in pixels.\n * @param int|string $height Image height in pixels.\n * @return string HTML attributes for width and, or height.\n */\nfunction image_hwstring( $width, $height ) {\n\t$out = '';\n\tif ($width)\n\t\t$out .= 'width=\"'.intval($width).'\" ';\n\tif ($height)\n\t\t$out .= 'height=\"'.intval($height).'\" ';\n\treturn $out;\n}\n\n/**\n * Scale an image to fit a particular size (such as 'thumb' or 'medium').\n *\n * Array with image url, width, height, and whether is intermediate size, in\n * that order is returned on success is returned. $is_intermediate is true if\n * $url is a resized image, false if it is the original.\n *\n * The URL might be the original image, or it might be a resized version. This\n * function won't create a new resized copy, it will just return an already\n * resized one if it exists.\n *\n * A plugin may use the 'image_downsize' filter to hook into and offer image\n * resizing services for images. The hook must return an array with the same\n * elements that are returned in the function. The first element being the URL\n * to the new image that was resized.\n *\n * @since 2.5.0\n *\n * @param int          $id   Attachment ID for image.\n * @param array|string $size Optional. Image size to scale to. Accepts any valid image size,\n *                           or an array of width and height values in pixels (in that order).\n *                           Default 'medium'.\n * @return false|array Array containing the image URL, width, height, and boolean for whether\n *                     the image is an intermediate size. False on failure.\n */\nfunction image_downsize( $id, $size = 'medium' ) {\n\n\tif ( !wp_attachment_is_image($id) )\n\t\treturn false;\n\n\t/**\n\t * Filter whether to preempt the output of image_downsize().\n\t *\n\t * Passing a truthy value to the filter will effectively short-circuit\n\t * down-sizing the image, returning that value as output instead.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param bool         $downsize Whether to short-circuit the image downsize. Default false.\n\t * @param int          $id       Attachment ID for image.\n\t * @param array|string $size     Size of image. Image size or array of width and height values (in that order).\n\t *                               Default 'medium'.\n\t */\n\tif ( $out = apply_filters( 'image_downsize', false, $id, $size ) ) {\n\t\treturn $out;\n\t}\n\n\t$img_url = wp_get_attachment_url($id);\n\t$meta = wp_get_attachment_metadata($id);\n\t$width = $height = 0;\n\t$is_intermediate = false;\n\t$img_url_basename = wp_basename($img_url);\n\n\t// try for a new style intermediate size\n\tif ( $intermediate = image_get_intermediate_size($id, $size) ) {\n\t\t$img_url = str_replace($img_url_basename, $intermediate['file'], $img_url);\n\t\t$width = $intermediate['width'];\n\t\t$height = $intermediate['height'];\n\t\t$is_intermediate = true;\n\t}\n\telseif ( $size == 'thumbnail' ) {\n\t\t// fall back to the old thumbnail\n\t\tif ( ($thumb_file = wp_get_attachment_thumb_file($id)) && $info = getimagesize($thumb_file) ) {\n\t\t\t$img_url = str_replace($img_url_basename, wp_basename($thumb_file), $img_url);\n\t\t\t$width = $info[0];\n\t\t\t$height = $info[1];\n\t\t\t$is_intermediate = true;\n\t\t}\n\t}\n\tif ( !$width && !$height && isset( $meta['width'], $meta['height'] ) ) {\n\t\t// any other type: use the real image\n\t\t$width = $meta['width'];\n\t\t$height = $meta['height'];\n\t}\n\n\tif ( $img_url) {\n\t\t// we have the actual image size, but might need to further constrain it if content_width is narrower\n\t\tlist( $width, $height ) = image_constrain_size_for_editor( $width, $height, $size );\n\n\t\treturn array( $img_url, $width, $height, $is_intermediate );\n\t}\n\treturn false;\n\n}\n\n/**\n * Register a new image size.\n *\n * Cropping behavior for the image size is dependent on the value of $crop:\n * 1. If false (default), images will be scaled, not cropped.\n * 2. If an array in the form of array( x_crop_position, y_crop_position ):\n *    - x_crop_position accepts 'left' 'center', or 'right'.\n *    - y_crop_position accepts 'top', 'center', or 'bottom'.\n *    Images will be cropped to the specified dimensions within the defined crop area.\n * 3. If true, images will be cropped to the specified dimensions using center positions.\n *\n * @since 2.9.0\n *\n * @global array $_wp_additional_image_sizes Associative array of additional image sizes.\n *\n * @param string     $name   Image size identifier.\n * @param int        $width  Image width in pixels.\n * @param int        $height Image height in pixels.\n * @param bool|array $crop   Optional. Whether to crop images to specified width and height or resize.\n *                           An array can specify positioning of the crop area. Default false.\n */\nfunction add_image_size( $name, $width = 0, $height = 0, $crop = false ) {\n\tglobal $_wp_additional_image_sizes;\n\n\t$_wp_additional_image_sizes[ $name ] = array(\n\t\t'width'  => absint( $width ),\n\t\t'height' => absint( $height ),\n\t\t'crop'   => $crop,\n\t);\n}\n\n/**\n * Check if an image size exists.\n *\n * @since 3.9.0\n *\n * @global array $_wp_additional_image_sizes\n *\n * @param string $name The image size to check.\n * @return bool True if the image size exists, false if not.\n */\nfunction has_image_size( $name ) {\n\tglobal $_wp_additional_image_sizes;\n\n\treturn isset( $_wp_additional_image_sizes[ $name ] );\n}\n\n/**\n * Remove a new image size.\n *\n * @since 3.9.0\n *\n * @global array $_wp_additional_image_sizes\n *\n * @param string $name The image size to remove.\n * @return bool True if the image size was successfully removed, false on failure.\n */\nfunction remove_image_size( $name ) {\n\tglobal $_wp_additional_image_sizes;\n\n\tif ( isset( $_wp_additional_image_sizes[ $name ] ) ) {\n\t\tunset( $_wp_additional_image_sizes[ $name ] );\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Registers an image size for the post thumbnail.\n *\n * @since 2.9.0\n *\n * @see add_image_size() for details on cropping behavior.\n *\n * @param int        $width  Image width in pixels.\n * @param int        $height Image height in pixels.\n * @param bool|array $crop   Optional. Whether to crop images to specified width and height or resize.\n *                           An array can specify positioning of the crop area. Default false.\n */\nfunction set_post_thumbnail_size( $width = 0, $height = 0, $crop = false ) {\n\tadd_image_size( 'post-thumbnail', $width, $height, $crop );\n}\n\n/**\n * Gets an img tag for an image attachment, scaling it down if requested.\n *\n * The filter 'get_image_tag_class' allows for changing the class name for the\n * image without having to use regular expressions on the HTML content. The\n * parameters are: what WordPress will use for the class, the Attachment ID,\n * image align value, and the size the image should be.\n *\n * The second filter 'get_image_tag' has the HTML content, which can then be\n * further manipulated by a plugin to change all attribute values and even HTML\n * content.\n *\n * @since 2.5.0\n *\n * @param int          $id    Attachment ID.\n * @param string       $alt   Image Description for the alt attribute.\n * @param string       $title Image Description for the title attribute.\n * @param string       $align Part of the class name for aligning the image.\n * @param string|array $size  Optional. Registered image size to retrieve a tag for. Accepts any\n *                            valid image size, or an array of width and height values in pixels\n *                            (in that order). Default 'medium'.\n * @return string HTML IMG element for given image attachment\n */\nfunction get_image_tag( $id, $alt, $title, $align, $size = 'medium' ) {\n\n\tlist( $img_src, $width, $height ) = image_downsize($id, $size);\n\t$hwstring = image_hwstring($width, $height);\n\n\t$title = $title ? 'title=\"' . esc_attr( $title ) . '\" ' : '';\n\n\t$class = 'align' . esc_attr($align) .' size-' . esc_attr($size) . ' wp-image-' . $id;\n\n\t/**\n\t * Filter the value of the attachment's image tag class attribute.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string       $class CSS class name or space-separated list of classes.\n\t * @param int          $id    Attachment ID.\n\t * @param string       $align Part of the class name for aligning the image.\n\t * @param string|array $size  Size of image. Image size or array of width and height values (in that order).\n\t *                            Default 'medium'.\n\t */\n\t$class = apply_filters( 'get_image_tag_class', $class, $id, $align, $size );\n\n\t$html = '<img src=\"' . esc_attr($img_src) . '\" alt=\"' . esc_attr($alt) . '\" ' . $title . $hwstring . 'class=\"' . $class . '\" />';\n\n\t/**\n\t * Filter the HTML content for the image tag.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string       $html  HTML content for the image.\n\t * @param int          $id    Attachment ID.\n\t * @param string       $alt   Alternate text.\n\t * @param string       $title Attachment title.\n\t * @param string       $align Part of the class name for aligning the image.\n\t * @param string|array $size  Size of image. Image size or array of width and height values (in that order).\n\t *                            Default 'medium'.\n\t */\n\treturn apply_filters( 'get_image_tag', $html, $id, $alt, $title, $align, $size );\n}\n\n/**\n * Calculates the new dimensions for a down-sampled image.\n *\n * If either width or height are empty, no constraint is applied on\n * that dimension.\n *\n * @since 2.5.0\n *\n * @param int $current_width  Current width of the image.\n * @param int $current_height Current height of the image.\n * @param int $max_width      Optional. Max width in pixels to constrain to. Default 0.\n * @param int $max_height     Optional. Max height in pixels to constrain to. Default 0.\n * @return array First item is the width, the second item is the height.\n */\nfunction wp_constrain_dimensions( $current_width, $current_height, $max_width = 0, $max_height = 0 ) {\n\tif ( !$max_width && !$max_height )\n\t\treturn array( $current_width, $current_height );\n\n\t$width_ratio = $height_ratio = 1.0;\n\t$did_width = $did_height = false;\n\n\tif ( $max_width > 0 && $current_width > 0 && $current_width > $max_width ) {\n\t\t$width_ratio = $max_width / $current_width;\n\t\t$did_width = true;\n\t}\n\n\tif ( $max_height > 0 && $current_height > 0 && $current_height > $max_height ) {\n\t\t$height_ratio = $max_height / $current_height;\n\t\t$did_height = true;\n\t}\n\n\t// Calculate the larger/smaller ratios\n\t$smaller_ratio = min( $width_ratio, $height_ratio );\n\t$larger_ratio  = max( $width_ratio, $height_ratio );\n\n\tif ( (int) round( $current_width * $larger_ratio ) > $max_width || (int) round( $current_height * $larger_ratio ) > $max_height ) {\n \t\t// The larger ratio is too big. It would result in an overflow.\n\t\t$ratio = $smaller_ratio;\n\t} else {\n\t\t// The larger ratio fits, and is likely to be a more \"snug\" fit.\n\t\t$ratio = $larger_ratio;\n\t}\n\n\t// Very small dimensions may result in 0, 1 should be the minimum.\n\t$w = max ( 1, (int) round( $current_width  * $ratio ) );\n\t$h = max ( 1, (int) round( $current_height * $ratio ) );\n\n\t// Sometimes, due to rounding, we'll end up with a result like this: 465x700 in a 177x177 box is 117x176... a pixel short\n\t// We also have issues with recursive calls resulting in an ever-changing result. Constraining to the result of a constraint should yield the original result.\n\t// Thus we look for dimensions that are one pixel shy of the max value and bump them up\n\n\t// Note: $did_width means it is possible $smaller_ratio == $width_ratio.\n\tif ( $did_width && $w == $max_width - 1 ) {\n\t\t$w = $max_width; // Round it up\n\t}\n\n\t// Note: $did_height means it is possible $smaller_ratio == $height_ratio.\n\tif ( $did_height && $h == $max_height - 1 ) {\n\t\t$h = $max_height; // Round it up\n\t}\n\n\t/**\n\t * Filter dimensions to constrain down-sampled images to.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param array $dimensions     The image width and height.\n\t * @param int \t$current_width  The current width of the image.\n\t * @param int \t$current_height The current height of the image.\n\t * @param int \t$max_width      The maximum width permitted.\n\t * @param int \t$max_height     The maximum height permitted.\n\t */\n\treturn apply_filters( 'wp_constrain_dimensions', array( $w, $h ), $current_width, $current_height, $max_width, $max_height );\n}\n\n/**\n * Retrieves calculated resize dimensions for use in WP_Image_Editor.\n *\n * Calculates dimensions and coordinates for a resized image that fits\n * within a specified width and height.\n *\n * Cropping behavior is dependent on the value of $crop:\n * 1. If false (default), images will not be cropped.\n * 2. If an array in the form of array( x_crop_position, y_crop_position ):\n *    - x_crop_position accepts 'left' 'center', or 'right'.\n *    - y_crop_position accepts 'top', 'center', or 'bottom'.\n *    Images will be cropped to the specified dimensions within the defined crop area.\n * 3. If true, images will be cropped to the specified dimensions using center positions.\n *\n * @since 2.5.0\n *\n * @param int        $orig_w Original width in pixels.\n * @param int        $orig_h Original height in pixels.\n * @param int        $dest_w New width in pixels.\n * @param int        $dest_h New height in pixels.\n * @param bool|array $crop   Optional. Whether to crop image to specified width and height or resize.\n *                           An array can specify positioning of the crop area. Default false.\n * @return false|array False on failure. Returned array matches parameters for `imagecopyresampled()`.\n */\nfunction image_resize_dimensions( $orig_w, $orig_h, $dest_w, $dest_h, $crop = false ) {\n\n\tif ($orig_w <= 0 || $orig_h <= 0)\n\t\treturn false;\n\t// at least one of dest_w or dest_h must be specific\n\tif ($dest_w <= 0 && $dest_h <= 0)\n\t\treturn false;\n\n\t/**\n\t * Filter whether to preempt calculating the image resize dimensions.\n\t *\n\t * Passing a non-null value to the filter will effectively short-circuit\n\t * image_resize_dimensions(), returning that value instead.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param null|mixed $null   Whether to preempt output of the resize dimensions.\n\t * @param int        $orig_w Original width in pixels.\n\t * @param int        $orig_h Original height in pixels.\n\t * @param int        $dest_w New width in pixels.\n\t * @param int        $dest_h New height in pixels.\n\t * @param bool|array $crop   Whether to crop image to specified width and height or resize.\n\t *                           An array can specify positioning of the crop area. Default false.\n\t */\n\t$output = apply_filters( 'image_resize_dimensions', null, $orig_w, $orig_h, $dest_w, $dest_h, $crop );\n\tif ( null !== $output )\n\t\treturn $output;\n\n\tif ( $crop ) {\n\t\t// crop the largest possible portion of the original image that we can size to $dest_w x $dest_h\n\t\t$aspect_ratio = $orig_w / $orig_h;\n\t\t$new_w = min($dest_w, $orig_w);\n\t\t$new_h = min($dest_h, $orig_h);\n\n\t\tif ( ! $new_w ) {\n\t\t\t$new_w = (int) round( $new_h * $aspect_ratio );\n\t\t}\n\n\t\tif ( ! $new_h ) {\n\t\t\t$new_h = (int) round( $new_w / $aspect_ratio );\n\t\t}\n\n\t\t$size_ratio = max($new_w / $orig_w, $new_h / $orig_h);\n\n\t\t$crop_w = round($new_w / $size_ratio);\n\t\t$crop_h = round($new_h / $size_ratio);\n\n\t\tif ( ! is_array( $crop ) || count( $crop ) !== 2 ) {\n\t\t\t$crop = array( 'center', 'center' );\n\t\t}\n\n\t\tlist( $x, $y ) = $crop;\n\n\t\tif ( 'left' === $x ) {\n\t\t\t$s_x = 0;\n\t\t} elseif ( 'right' === $x ) {\n\t\t\t$s_x = $orig_w - $crop_w;\n\t\t} else {\n\t\t\t$s_x = floor( ( $orig_w - $crop_w ) / 2 );\n\t\t}\n\n\t\tif ( 'top' === $y ) {\n\t\t\t$s_y = 0;\n\t\t} elseif ( 'bottom' === $y ) {\n\t\t\t$s_y = $orig_h - $crop_h;\n\t\t} else {\n\t\t\t$s_y = floor( ( $orig_h - $crop_h ) / 2 );\n\t\t}\n\t} else {\n\t\t// don't crop, just resize using $dest_w x $dest_h as a maximum bounding box\n\t\t$crop_w = $orig_w;\n\t\t$crop_h = $orig_h;\n\n\t\t$s_x = 0;\n\t\t$s_y = 0;\n\n\t\tlist( $new_w, $new_h ) = wp_constrain_dimensions( $orig_w, $orig_h, $dest_w, $dest_h );\n\t}\n\n\t// if the resulting image would be the same size or larger we don't want to resize it\n\tif ( $new_w >= $orig_w && $new_h >= $orig_h && $dest_w != $orig_w && $dest_h != $orig_h ) {\n\t\treturn false;\n\t}\n\n\t// the return array matches the parameters to imagecopyresampled()\n\t// int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h\n\treturn array( 0, 0, (int) $s_x, (int) $s_y, (int) $new_w, (int) $new_h, (int) $crop_w, (int) $crop_h );\n\n}\n\n/**\n * Resizes an image to make a thumbnail or intermediate size.\n *\n * The returned array has the file size, the image width, and image height. The\n * filter 'image_make_intermediate_size' can be used to hook in and change the\n * values of the returned array. The only parameter is the resized file path.\n *\n * @since 2.5.0\n *\n * @param string $file   File path.\n * @param int    $width  Image width.\n * @param int    $height Image height.\n * @param bool   $crop   Optional. Whether to crop image to specified width and height or resize.\n *                       Default false.\n * @return false|array False, if no image was created. Metadata array on success.\n */\nfunction image_make_intermediate_size( $file, $width, $height, $crop = false ) {\n\tif ( $width || $height ) {\n\t\t$editor = wp_get_image_editor( $file );\n\n\t\tif ( is_wp_error( $editor ) || is_wp_error( $editor->resize( $width, $height, $crop ) ) )\n\t\t\treturn false;\n\n\t\t$resized_file = $editor->save();\n\n\t\tif ( ! is_wp_error( $resized_file ) && $resized_file ) {\n\t\t\tunset( $resized_file['path'] );\n\t\t\treturn $resized_file;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Retrieves the image's intermediate size (resized) path, width, and height.\n *\n * The $size parameter can be an array with the width and height respectively.\n * If the size matches the 'sizes' metadata array for width and height, then it\n * will be used. If there is no direct match, then the nearest image size larger\n * than the specified size will be used. If nothing is found, then the function\n * will break out and return false.\n *\n * The metadata 'sizes' is used for compatible sizes that can be used for the\n * parameter $size value.\n *\n * The url path will be given, when the $size parameter is a string.\n *\n * If you are passing an array for the $size, you should consider using\n * add_image_size() so that a cropped version is generated. It's much more\n * efficient than having to find the closest-sized image and then having the\n * browser scale down the image.\n *\n * @since 2.5.0\n *\n * @param int          $post_id Attachment ID.\n * @param array|string $size    Optional. Image size. Accepts any valid image size, or an array\n *                              of width and height values in pixels (in that order).\n *                              Default 'thumbnail'.\n * @return false|array $data {\n *     Array of file relative path, width, and height on success. Additionally includes absolute\n *     path and URL if registered size is passed to $size parameter. False on failure.\n *\n *     @type string $file   Image's path relative to uploads directory\n *     @type int    $width  Width of image\n *     @type int    $height Height of image\n *     @type string $path   Optional. Image's absolute filesystem path. Only returned if registered\n *                          size is passed to `$size` parameter.\n *     @type string $url    Optional. Image's URL. Only returned if registered size is passed to `$size`\n *                          parameter.\n * }\n */\nfunction image_get_intermediate_size( $post_id, $size = 'thumbnail' ) {\n\tif ( !is_array( $imagedata = wp_get_attachment_metadata( $post_id ) ) )\n\t\treturn false;\n\n\t// get the best one for a specified set of dimensions\n\tif ( is_array($size) && !empty($imagedata['sizes']) ) {\n\t\t$candidates = array();\n\n\t\tforeach ( $imagedata['sizes'] as $_size => $data ) {\n\t\t\t// If there's an exact match to an existing image size, short circuit.\n\t\t\tif ( $data['width'] == $size[0] && $data['height'] == $size[1] ) {\n\t\t\t\tlist( $data['width'], $data['height'] ) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );\n\n\t\t\t\t/** This filter is documented in wp-includes/media.php */\n\t\t\t\treturn apply_filters( 'image_get_intermediate_size', $data, $post_id, $size );\n\t\t\t}\n\t\t\t// If it's not an exact match but it's at least the dimensions requested.\n\t\t\tif ( $data['width'] >= $size[0] && $data['height'] >= $size[1] ) {\n\t\t\t\t$candidates[ $data['width'] * $data['height'] ] = $_size;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $candidates ) ) {\n\t\t\t// find for the smallest image not smaller than the desired size\n\t\t\tksort( $candidates );\n\t\t\tforeach ( $candidates as $_size ) {\n\t\t\t\t$data = $imagedata['sizes'][$_size];\n\n\t\t\t\t// Skip images with unexpectedly divergent aspect ratios (crops)\n\t\t\t\t// First, we calculate what size the original image would be if constrained to a box the size of the current image in the loop\n\t\t\t\t$maybe_cropped = image_resize_dimensions($imagedata['width'], $imagedata['height'], $data['width'], $data['height'], false );\n\t\t\t\t// If the size doesn't match within one pixel, then it is of a different aspect ratio, so we skip it, unless it's the thumbnail size\n\t\t\t\tif ( 'thumbnail' != $_size &&\n\t\t\t\t  ( ! $maybe_cropped\n\t\t\t\t    || ( $maybe_cropped[4] != $data['width'] && $maybe_cropped[4] + 1 != $data['width'] )\n\t\t\t\t    || ( $maybe_cropped[5] != $data['height'] && $maybe_cropped[5] + 1 != $data['height'] )\n\t\t\t\t  ) ) {\n\t\t\t\t  continue;\n\t\t\t\t}\n\t\t\t\t// If we're still here, then we're going to use this size.\n\t\t\t\tlist( $data['width'], $data['height'] ) = image_constrain_size_for_editor( $data['width'], $data['height'], $size );\n\n\t\t\t\t/** This filter is documented in wp-includes/media.php */\n\t\t\t\treturn apply_filters( 'image_get_intermediate_size', $data, $post_id, $size );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( is_array($size) || empty($size) || empty($imagedata['sizes'][$size]) )\n\t\treturn false;\n\n\t$data = $imagedata['sizes'][$size];\n\t// include the full filesystem path of the intermediate file\n\tif ( empty($data['path']) && !empty($data['file']) ) {\n\t\t$file_url = wp_get_attachment_url($post_id);\n\t\t$data['path'] = path_join( dirname($imagedata['file']), $data['file'] );\n\t\t$data['url'] = path_join( dirname($file_url), $data['file'] );\n\t}\n\n\t/**\n\t * Filter the output of image_get_intermediate_size()\n\t *\n\t * @since 4.4.0\n\t *\n\t * @see image_get_intermediate_size()\n\t *\n\t * @param array        $data    Array of file relative path, width, and height on success. May also include\n\t *                              file absolute path and URL.\n\t * @param int          $post_id The post_id of the image attachment\n\t * @param string|array $size    Registered image size or flat array of initially-requested height and width\n\t *                              dimensions (in that order).\n\t */\n\treturn apply_filters( 'image_get_intermediate_size', $data, $post_id, $size );\n}\n\n/**\n * Gets the available intermediate image sizes.\n *\n * @since 3.0.0\n *\n * @global array $_wp_additional_image_sizes\n *\n * @return array Returns a filtered array of image size strings.\n */\nfunction get_intermediate_image_sizes() {\n\tglobal $_wp_additional_image_sizes;\n\t$image_sizes = array('thumbnail', 'medium', 'medium_large', 'large'); // Standard sizes\n\tif ( isset( $_wp_additional_image_sizes ) && count( $_wp_additional_image_sizes ) )\n\t\t$image_sizes = array_merge( $image_sizes, array_keys( $_wp_additional_image_sizes ) );\n\n\t/**\n\t * Filter the list of intermediate image sizes.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array $image_sizes An array of intermediate image sizes. Defaults\n\t *                           are 'thumbnail', 'medium', 'medium_large', 'large'.\n\t */\n\treturn apply_filters( 'intermediate_image_sizes', $image_sizes );\n}\n\n/**\n * Retrieve an image to represent an attachment.\n *\n * A mime icon for files, thumbnail or intermediate size for images.\n *\n * The returned array contains four values: the URL of the attachment image src,\n * the width of the image file, the height of the image file, and a boolean\n * representing whether the returned array describes an intermediate (generated)\n * image size or the original, full-sized upload.\n *\n * @since 2.5.0\n *\n * @param int          $attachment_id Image attachment ID.\n * @param string|array $size          Optional. Image size. Accepts any valid image size, or an array of width\n *                                    and height values in pixels (in that order). Default 'thumbnail'.\n * @param bool         $icon          Optional. Whether the image should be treated as an icon. Default false.\n * @return false|array Returns an array (url, width, height, is_intermediate), or false, if no image is available.\n */\nfunction wp_get_attachment_image_src( $attachment_id, $size = 'thumbnail', $icon = false ) {\n\t// get a thumbnail or intermediate image if there is one\n\t$image = image_downsize( $attachment_id, $size );\n\tif ( ! $image ) {\n\t\t$src = false;\n\n\t\tif ( $icon && $src = wp_mime_type_icon( $attachment_id ) ) {\n\t\t\t/** This filter is documented in wp-includes/post.php */\n\t\t\t$icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' );\n\n\t\t\t$src_file = $icon_dir . '/' . wp_basename( $src );\n\t\t\t@list( $width, $height ) = getimagesize( $src_file );\n\t\t}\n\n\t\tif ( $src && $width && $height ) {\n\t\t\t$image = array( $src, $width, $height );\n\t\t}\n\t}\n\t/**\n\t * Filter the image src result.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param array|false  $image         Either array with src, width & height, icon src, or false.\n\t * @param int          $attachment_id Image attachment ID.\n\t * @param string|array $size          Size of image. Image size or array of width and height values\n\t *                                    (in that order). Default 'thumbnail'.\n\t * @param bool         $icon          Whether the image should be treated as an icon. Default false.\n\t */\n\treturn apply_filters( 'wp_get_attachment_image_src', $image, $attachment_id, $size, $icon );\n}\n\n/**\n * Get an HTML img element representing an image attachment\n *\n * While `$size` will accept an array, it is better to register a size with\n * add_image_size() so that a cropped version is generated. It's much more\n * efficient than having to find the closest-sized image and then having the\n * browser scale down the image.\n *\n * @since 2.5.0\n *\n * @param int          $attachment_id Image attachment ID.\n * @param string|array $size          Optional. Image size. Accepts any valid image size, or an array of width\n *                                    and height values in pixels (in that order). Default 'thumbnail'.\n * @param bool         $icon          Optional. Whether the image should be treated as an icon. Default false.\n * @param string|array $attr          Optional. Attributes for the image markup. Default empty.\n * @return string HTML img element or empty string on failure.\n */\nfunction wp_get_attachment_image($attachment_id, $size = 'thumbnail', $icon = false, $attr = '') {\n\t$html = '';\n\t$image = wp_get_attachment_image_src($attachment_id, $size, $icon);\n\tif ( $image ) {\n\t\tlist($src, $width, $height) = $image;\n\t\t$hwstring = image_hwstring($width, $height);\n\t\t$size_class = $size;\n\t\tif ( is_array( $size_class ) ) {\n\t\t\t$size_class = join( 'x', $size_class );\n\t\t}\n\t\t$attachment = get_post($attachment_id);\n\t\t$default_attr = array(\n\t\t\t'src'\t=> $src,\n\t\t\t'class'\t=> \"attachment-$size_class size-$size_class\",\n\t\t\t'alt'\t=> trim(strip_tags( get_post_meta($attachment_id, '_wp_attachment_image_alt', true) )), // Use Alt field first\n\t\t);\n\t\tif ( empty($default_attr['alt']) )\n\t\t\t$default_attr['alt'] = trim(strip_tags( $attachment->post_excerpt )); // If not, Use the Caption\n\t\tif ( empty($default_attr['alt']) )\n\t\t\t$default_attr['alt'] = trim(strip_tags( $attachment->post_title )); // Finally, use the title\n\n\t\t$attr = wp_parse_args( $attr, $default_attr );\n\n\t\t// Generate 'srcset' and 'sizes' if not already present.\n\t\tif ( empty( $attr['srcset'] ) ) {\n\t\t\t$image_meta = get_post_meta( $attachment_id, '_wp_attachment_metadata', true );\n\n\t\t\tif ( is_array( $image_meta ) ) {\n\t\t\t\t$size_array = array( absint( $width ), absint( $height ) );\n\t\t\t\t$srcset = wp_calculate_image_srcset( $size_array, $src, $image_meta, $attachment_id );\n\t\t\t\t$sizes = wp_calculate_image_sizes( $size_array, $src, $image_meta, $attachment_id );\n\n\t\t\t\tif ( $srcset && ( $sizes || ! empty( $attr['sizes'] ) ) ) {\n\t\t\t\t\t$attr['srcset'] = $srcset;\n\n\t\t\t\t\tif ( empty( $attr['sizes'] ) ) {\n\t\t\t\t\t\t$attr['sizes'] = $sizes;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the list of attachment image attributes.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array        $attr       Attributes for the image markup.\n\t\t * @param WP_Post      $attachment Image attachment post.\n\t\t * @param string|array $size       Requested size. Image size or array of width and height values\n\t\t *                                 (in that order). Default 'thumbnail'.\n\t\t */\n\t\t$attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, $attachment, $size );\n\t\t$attr = array_map( 'esc_attr', $attr );\n\t\t$html = rtrim(\"<img $hwstring\");\n\t\tforeach ( $attr as $name => $value ) {\n\t\t\t$html .= \" $name=\" . '\"' . $value . '\"';\n\t\t}\n\t\t$html .= ' />';\n\t}\n\n\treturn $html;\n}\n\n/**\n * Get the URL of an image attachment.\n *\n * @since 4.4.0\n *\n * @param int          $attachment_id Image attachment ID.\n * @param string|array $size          Optional. Image size to retrieve. Accepts any valid image size, or an array\n *                                    of width and height values in pixels (in that order). Default 'thumbnail'.\n * @param bool         $icon          Optional. Whether the image should be treated as an icon. Default false.\n * @return string|false Attachment URL or false if no image is available.\n */\nfunction wp_get_attachment_image_url( $attachment_id, $size = 'thumbnail', $icon = false ) {\n\t$image = wp_get_attachment_image_src( $attachment_id, $size, $icon );\n\treturn isset( $image['0'] ) ? $image['0'] : false;\n}\n\n/**\n * Get the attachment path relative to the upload directory.\n *\n * @since 4.4.1\n * @access private\n *\n * @param string $file Attachment file name.\n * @return string Attachment path relative to the upload directory.\n */\nfunction _wp_get_attachment_relative_path( $file ) {\n\t$dirname = dirname( $file );\n\n\tif ( '.' === $dirname ) {\n\t\treturn '';\n\t}\n\n\tif ( false !== strpos( $dirname, 'wp-content/uploads' ) ) {\n\t\t// Get the directory name relative to the upload directory (back compat for pre-2.7 uploads)\n\t\t$dirname = substr( $dirname, strpos( $dirname, 'wp-content/uploads' ) + 18 );\n\t\t$dirname = ltrim( $dirname, '/' );\n\t}\n\n\treturn $dirname;\n}\n\n/**\n * Caches and returns the base URL of the uploads directory.\n *\n * @since 4.4.0\n * @access private\n *\n * @return string The base URL, cached.\n */\nfunction _wp_upload_dir_baseurl() {\n\tstatic $baseurl = array();\n\n\t$blog_id = get_current_blog_id();\n\n\tif ( empty( $baseurl[$blog_id] ) ) {\n\t\t$uploads_dir = wp_upload_dir();\n\t\t$baseurl[$blog_id] = $uploads_dir['baseurl'];\n\t}\n\n\treturn $baseurl[$blog_id];\n}\n\n/**\n * Get the image size as array from its meta data.\n *\n * Used for responsive images.\n *\n * @since 4.4.0\n * @access private\n *\n * @param string $size_name  Image size. Accepts any valid image size name ('thumbnail', 'medium', etc.).\n * @param array  $image_meta The image meta data.\n * @return array|bool Array of width and height values in pixels (in that order)\n *                    or false if the size doesn't exist.\n */\nfunction _wp_get_image_size_from_meta( $size_name, $image_meta ) {\n\tif ( $size_name === 'full' ) {\n\t\treturn array(\n\t\t\tabsint( $image_meta['width'] ),\n\t\t\tabsint( $image_meta['height'] ),\n\t\t);\n\t} elseif ( ! empty( $image_meta['sizes'][$size_name] ) ) {\n\t\treturn array(\n\t\t\tabsint( $image_meta['sizes'][$size_name]['width'] ),\n\t\t\tabsint( $image_meta['sizes'][$size_name]['height'] ),\n\t\t);\n\t}\n\n\treturn false;\n}\n\n/**\n * Retrieves the value for an image attachment's 'srcset' attribute.\n *\n * @since 4.4.0\n *\n * @see wp_calculate_image_srcset()\n *\n * @param int          $attachment_id Image attachment ID.\n * @param array|string $size          Optional. Image size. Accepts any valid image size, or an array of\n *                                    width and height values in pixels (in that order). Default 'medium'.\n * @param array        $image_meta    Optional. The image meta data as returned by 'wp_get_attachment_metadata()'.\n *                                    Default null.\n * @return string|bool A 'srcset' value string or false.\n */\nfunction wp_get_attachment_image_srcset( $attachment_id, $size = 'medium', $image_meta = null ) {\n\tif ( ! $image = wp_get_attachment_image_src( $attachment_id, $size ) ) {\n\t\treturn false;\n\t}\n\n\tif ( ! is_array( $image_meta ) ) {\n\t\t$image_meta = get_post_meta( $attachment_id, '_wp_attachment_metadata', true );\n\t}\n\n\t$image_src = $image[0];\n\t$size_array = array(\n\t\tabsint( $image[1] ),\n\t\tabsint( $image[2] )\n\t);\n\n\treturn wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id );\n}\n\n/**\n * A helper function to calculate the image sources to include in a 'srcset' attribute.\n *\n * @since 4.4.0\n *\n * @param array  $size_array    Array of width and height values in pixels (in that order).\n * @param string $image_src     The 'src' of the image.\n * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.\n * @param int    $attachment_id Optional. The image attachment ID to pass to the filter. Default 0.\n * @return string|bool          The 'srcset' attribute value. False on error or when only one source exists.\n */\nfunction wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id = 0 ) {\n\t/**\n\t * Let plugins pre-filter the image meta to be able to fix inconsistencies in the stored data.\n\t *\n\t * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.\n\t * @param array  $size_array    Array of width and height values in pixels (in that order).\n\t * @param string $image_src     The 'src' of the image.\n\t * @param int    $attachment_id The image attachment ID or 0 if not supplied.\n\t */\n\t$image_meta = apply_filters( 'wp_calculate_image_srcset_meta', $image_meta, $size_array, $image_src, $attachment_id );\n\n\tif ( empty( $image_meta['sizes'] ) ) {\n\t\treturn false;\n\t}\n\n\t$image_sizes = $image_meta['sizes'];\n\n\t// Get the width and height of the image.\n\t$image_width = (int) $size_array[0];\n\t$image_height = (int) $size_array[1];\n\n\t// Bail early if error/no width.\n\tif ( $image_width < 1 ) {\n\t\treturn false;\n\t}\n\n\t$image_basename = wp_basename( $image_meta['file'] );\n\n\t/*\n\t * WordPress flattens animated GIFs into one frame when generating intermediate sizes.\n\t * To avoid hiding animation in user content, if src is a full size GIF, a srcset attribute is not generated.\n\t * If src is an intermediate size GIF, the full size is excluded from srcset to keep a flattened GIF from becoming animated.\n\t */\n\tif ( ! isset( $image_sizes['thumbnail']['mime-type'] ) || 'image/gif' !== $image_sizes['thumbnail']['mime-type'] ) {\n\t\t$image_sizes['full'] = array(\n\t\t\t'width'  => $image_meta['width'],\n\t\t\t'height' => $image_meta['height'],\n\t\t\t'file'   => $image_basename,\n\t\t);\n\t} elseif ( strpos( $image_src, $image_meta['file'] ) ) {\n\t\treturn false;\n\t}\n\n\t// Retrieve the uploads sub-directory from the full size image.\n\t$dirname = _wp_get_attachment_relative_path( $image_meta['file'] );\n\n\tif ( $dirname ) {\n\t\t$dirname = trailingslashit( $dirname );\n\t}\n\n\t$image_baseurl = _wp_upload_dir_baseurl();\n\t$image_baseurl = trailingslashit( $image_baseurl ) . $dirname;\n\n\t// Calculate the image aspect ratio.\n\t$image_ratio = $image_height / $image_width;\n\n\t/*\n\t * Images that have been edited in WordPress after being uploaded will\n\t * contain a unique hash. Look for that hash and use it later to filter\n\t * out images that are leftovers from previous versions.\n\t */\n\t$image_edited = preg_match( '/-e[0-9]{13}/', wp_basename( $image_src ), $image_edit_hash );\n\n\t/**\n\t * Filter the maximum image width to be included in a 'srcset' attribute.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param int   $max_width  The maximum image width to be included in the 'srcset'. Default '1600'.\n\t * @param array $size_array Array of width and height values in pixels (in that order).\n\t */\n\t$max_srcset_image_width = apply_filters( 'max_srcset_image_width', 1600, $size_array );\n\n\t// Array to hold URL candidates.\n\t$sources = array();\n\n\t/**\n\t * To make sure the ID matches our image src, we will check to see if any sizes in our attachment\n\t * meta match our $image_src. If no mathces are found we don't return a srcset to avoid serving\n\t * an incorrect image. See #35045.\n\t */\n\t$src_matched = false;\n\n\t/*\n\t * Loop through available images. Only use images that are resized\n\t * versions of the same edit.\n\t */\n\tforeach ( $image_sizes as $image ) {\n\n\t\t// If the file name is part of the `src`, we've confirmed a match.\n\t\tif ( ! $src_matched && false !== strpos( $image_src, $dirname . $image['file'] ) ) {\n\t\t\t$src_matched = true;\n\t\t}\n\n\t\t// Filter out images that are from previous edits.\n\t\tif ( $image_edited && ! strpos( $image['file'], $image_edit_hash[0] ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/*\n\t\t * Filter out images that are wider than '$max_srcset_image_width' unless\n\t\t * that file is in the 'src' attribute.\n\t\t */\n\t\tif ( $max_srcset_image_width && $image['width'] > $max_srcset_image_width &&\n\t\t\tfalse === strpos( $image_src, $image['file'] ) ) {\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Calculate the new image ratio.\n\t\tif ( $image['width'] ) {\n\t\t\t$image_ratio_compare = $image['height'] / $image['width'];\n\t\t} else {\n\t\t\t$image_ratio_compare = 0;\n\t\t}\n\n\t\t// If the new ratio differs by less than 0.002, use it.\n\t\tif ( abs( $image_ratio - $image_ratio_compare ) < 0.002 ) {\n\t\t\t// Add the URL, descriptor, and value to the sources array to be returned.\n\t\t\t$sources[ $image['width'] ] = array(\n\t\t\t\t'url'        => $image_baseurl . $image['file'],\n\t\t\t\t'descriptor' => 'w',\n\t\t\t\t'value'      => $image['width'],\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Filter an image's 'srcset' sources.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array  $sources {\n\t *     One or more arrays of source data to include in the 'srcset'.\n\t *\n\t *     @type array $width {\n\t *         @type string $url        The URL of an image source.\n\t *         @type string $descriptor The descriptor type used in the image candidate string,\n\t *                                  either 'w' or 'x'.\n\t *         @type int    $value      The source width if paired with a 'w' descriptor, or a\n\t *                                  pixel density value if paired with an 'x' descriptor.\n\t *     }\n\t * }\n\t * @param array  $size_array    Array of width and height values in pixels (in that order).\n\t * @param string $image_src     The 'src' of the image.\n\t * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.\n \t * @param int    $attachment_id Image attachment ID or 0.\n\t */\n\t$sources = apply_filters( 'wp_calculate_image_srcset', $sources, $size_array, $image_src, $image_meta, $attachment_id );\n\n\t// Only return a 'srcset' value if there is more than one source.\n\tif ( ! $src_matched || count( $sources ) < 2 ) {\n\t\treturn false;\n\t}\n\n\t$srcset = '';\n\n\tforeach ( $sources as $source ) {\n\t\t$srcset .= $source['url'] . ' ' . $source['value'] . $source['descriptor'] . ', ';\n\t}\n\n\treturn rtrim( $srcset, ', ' );\n}\n\n/**\n * Retrieves the value for an image attachment's 'sizes' attribute.\n *\n * @since 4.4.0\n *\n * @see wp_calculate_image_sizes()\n *\n * @param int          $attachment_id Image attachment ID.\n * @param array|string $size          Optional. Image size. Accepts any valid image size, or an array of width\n *                                    and height values in pixels (in that order). Default 'medium'.\n * @param array        $image_meta    Optional. The image meta data as returned by 'wp_get_attachment_metadata()'.\n *                                    Default null.\n * @return string|bool A valid source size value for use in a 'sizes' attribute or false.\n */\nfunction wp_get_attachment_image_sizes( $attachment_id, $size = 'medium', $image_meta = null ) {\n\tif ( ! $image = wp_get_attachment_image_src( $attachment_id, $size ) ) {\n\t\treturn false;\n\t}\n\n\tif ( ! is_array( $image_meta ) ) {\n\t\t$image_meta = get_post_meta( $attachment_id, '_wp_attachment_metadata', true );\n\t}\n\n\t$image_src = $image[0];\n\t$size_array = array(\n\t\tabsint( $image[1] ),\n\t\tabsint( $image[2] )\n\t);\n\n\treturn wp_calculate_image_sizes( $size_array, $image_src, $image_meta, $attachment_id );\n}\n\n/**\n * Creates a 'sizes' attribute value for an image.\n *\n * @since 4.4.0\n *\n * @param array|string $size          Image size to retrieve. Accepts any valid image size, or an array\n *                                    of width and height values in pixels (in that order). Default 'medium'.\n * @param string       $image_src     Optional. The URL to the image file. Default null.\n * @param array        $image_meta    Optional. The image meta data as returned by 'wp_get_attachment_metadata()'.\n *                                    Default null.\n * @param int          $attachment_id Optional. Image attachment ID. Either `$image_meta` or `$attachment_id`\n *                                    is needed when using the image size name as argument for `$size`. Default 0.\n * @return string|bool A valid source size value for use in a 'sizes' attribute or false.\n */\nfunction wp_calculate_image_sizes( $size, $image_src = null, $image_meta = null, $attachment_id = 0 ) {\n\t$width = 0;\n\n\tif ( is_array( $size ) ) {\n\t\t$width = absint( $size[0] );\n\t} elseif ( is_string( $size ) ) {\n\t\tif ( ! $image_meta && $attachment_id ) {\n\t\t\t$image_meta = get_post_meta( $attachment_id, '_wp_attachment_metadata', true );\n\t\t}\n\n\t\tif ( is_array( $image_meta ) ) {\n\t\t\t$size_array = _wp_get_image_size_from_meta( $size, $image_meta );\n\t\t\tif ( $size_array ) {\n\t\t\t\t$width = absint( $size_array[0] );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( ! $width ) {\n\t\treturn false;\n\t}\n\n\t// Setup the default 'sizes' attribute.\n\t$sizes = sprintf( '(max-width: %1$dpx) 100vw, %1$dpx', $width );\n\n\t/**\n\t * Filter the output of 'wp_calculate_image_sizes()'.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string       $sizes         A source size value for use in a 'sizes' attribute.\n\t * @param array|string $size          Requested size. Image size or array of width and height values\n\t *                                    in pixels (in that order).\n\t * @param string|null  $image_src     The URL to the image file or null.\n\t * @param array|null   $image_meta    The image meta data as returned by wp_get_attachment_metadata() or null.\n\t * @param int          $attachment_id Image attachment ID of the original image or 0.\n\t */\n\treturn apply_filters( 'wp_calculate_image_sizes', $sizes, $size, $image_src, $image_meta, $attachment_id );\n}\n\n/**\n * Filters 'img' elements in post content to add 'srcset' and 'sizes' attributes.\n *\n * @since 4.4.0\n *\n * @see wp_image_add_srcset_and_sizes()\n *\n * @param string $content The raw post content to be filtered.\n * @return string Converted content with 'srcset' and 'sizes' attributes added to images.\n */\nfunction wp_make_content_images_responsive( $content ) {\n\tif ( ! preg_match_all( '/<img [^>]+>/', $content, $matches ) ) {\n\t\treturn $content;\n\t}\n\n\t$selected_images = $attachment_ids = array();\n\n\tforeach( $matches[0] as $image ) {\n\t\tif ( false === strpos( $image, ' srcset=' ) && preg_match( '/wp-image-([0-9]+)/i', $image, $class_id ) &&\n\t\t\t( $attachment_id = absint( $class_id[1] ) ) ) {\n\n\t\t\t/*\n\t\t\t * If exactly the same image tag is used more than once, overwrite it.\n\t\t\t * All identical tags will be replaced later with 'str_replace()'.\n\t\t\t */\n\t\t\t$selected_images[ $image ] = $attachment_id;\n\t\t\t// Overwrite the ID when the same image is included more than once.\n\t\t\t$attachment_ids[ $attachment_id ] = true;\n\t\t}\n\t}\n\n\tif ( count( $attachment_ids ) > 1 ) {\n\t\t/*\n\t\t * Warm object cache for use with 'get_post_meta()'.\n\t\t *\n\t\t * To avoid making a database call for each image, a single query\n\t\t * warms the object cache with the meta information for all images.\n\t\t */\n\t\tupdate_meta_cache( 'post', array_keys( $attachment_ids ) );\n\t}\n\n\tforeach ( $selected_images as $image => $attachment_id ) {\n\t\t$image_meta = get_post_meta( $attachment_id, '_wp_attachment_metadata', true );\n\t\t$content = str_replace( $image, wp_image_add_srcset_and_sizes( $image, $image_meta, $attachment_id ), $content );\n\t}\n\n\treturn $content;\n}\n\n/**\n * Adds 'srcset' and 'sizes' attributes to an existing 'img' element.\n *\n * @since 4.4.0\n *\n * @see wp_calculate_image_srcset()\n * @see wp_calculate_image_sizes()\n *\n * @param string $image         An HTML 'img' element to be filtered.\n * @param array  $image_meta    The image meta data as returned by 'wp_get_attachment_metadata()'.\n * @param int    $attachment_id Image attachment ID.\n * @return string Converted 'img' element with 'srcset' and 'sizes' attributes added.\n */\nfunction wp_image_add_srcset_and_sizes( $image, $image_meta, $attachment_id ) {\n\t// Ensure the image meta exists.\n\tif ( empty( $image_meta['sizes'] ) ) {\n\t\treturn $image;\n\t}\n\n\t$image_src = preg_match( '/src=\"([^\"]+)\"/', $image, $match_src ) ? $match_src[1] : '';\n\tlist( $image_src ) = explode( '?', $image_src );\n\n\t// Return early if we couldn't get the image source.\n\tif ( ! $image_src ) {\n\t\treturn $image;\n\t}\n\n\t// Bail early if an image has been inserted and later edited.\n\tif ( preg_match( '/-e[0-9]{13}/', $image_meta['file'], $img_edit_hash ) &&\n\t\tstrpos( wp_basename( $image_src ), $img_edit_hash[0] ) === false ) {\n\n\t\treturn $image;\n\t}\n\n\t$width  = preg_match( '/ width=\"([0-9]+)\"/',  $image, $match_width  ) ? (int) $match_width[1]  : 0;\n\t$height = preg_match( '/ height=\"([0-9]+)\"/', $image, $match_height ) ? (int) $match_height[1] : 0;\n\n\tif ( ! $width || ! $height ) {\n\t\t/*\n\t\t * If attempts to parse the size value failed, attempt to use the image meta data to match\n\t\t * the image file name from 'src' against the available sizes for an attachment.\n\t\t */\n\t\t$image_filename = wp_basename( $image_src );\n\n\t\tif ( $image_filename === wp_basename( $image_meta['file'] ) ) {\n\t\t\t$width = (int) $image_meta['width'];\n\t\t\t$height = (int) $image_meta['height'];\n\t\t} else {\n\t\t\tforeach( $image_meta['sizes'] as $image_size_data ) {\n\t\t\t\tif ( $image_filename === $image_size_data['file'] ) {\n\t\t\t\t\t$width = (int) $image_size_data['width'];\n\t\t\t\t\t$height = (int) $image_size_data['height'];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( ! $width || ! $height ) {\n\t\treturn $image;\n\t}\n\n\t$size_array = array( $width, $height );\n\t$srcset = wp_calculate_image_srcset( $size_array, $image_src, $image_meta, $attachment_id );\n\n\tif ( $srcset ) {\n\t\t// Check if there is already a 'sizes' attribute.\n\t\t$sizes = strpos( $image, ' sizes=' );\n\n\t\tif ( ! $sizes ) {\n\t\t\t$sizes = wp_calculate_image_sizes( $size_array, $image_src, $image_meta, $attachment_id );\n\t\t}\n\t}\n\n\tif ( $srcset && $sizes ) {\n\t\t// Format the 'srcset' and 'sizes' string and escape attributes.\n\t\t$attr = sprintf( ' srcset=\"%s\"', esc_attr( $srcset ) );\n\n\t\tif ( is_string( $sizes ) ) {\n\t\t\t$attr .= sprintf( ' sizes=\"%s\"', esc_attr( $sizes ) );\n\t\t}\n\n\t\t// Add 'srcset' and 'sizes' attributes to the image markup.\n\t\t$image = preg_replace( '/<img ([^>]+?)[\\/ ]*>/', '<img $1' . $attr . ' />', $image );\n\t}\n\n\treturn $image;\n}\n\n/**\n * Adds a 'wp-post-image' class to post thumbnails. Internal use only.\n *\n * Uses the 'begin_fetch_post_thumbnail_html' and 'end_fetch_post_thumbnail_html' action hooks to\n * dynamically add/remove itself so as to only filter post thumbnails.\n *\n * @ignore\n * @since 2.9.0\n *\n * @param array $attr Thumbnail attributes including src, class, alt, title.\n * @return array Modified array of attributes including the new 'wp-post-image' class.\n */\nfunction _wp_post_thumbnail_class_filter( $attr ) {\n\t$attr['class'] .= ' wp-post-image';\n\treturn $attr;\n}\n\n/**\n * Adds '_wp_post_thumbnail_class_filter' callback to the 'wp_get_attachment_image_attributes'\n * filter hook. Internal use only.\n *\n * @ignore\n * @since 2.9.0\n *\n * @param array $attr Thumbnail attributes including src, class, alt, title.\n */\nfunction _wp_post_thumbnail_class_filter_add( $attr ) {\n\tadd_filter( 'wp_get_attachment_image_attributes', '_wp_post_thumbnail_class_filter' );\n}\n\n/**\n * Removes the '_wp_post_thumbnail_class_filter' callback from the 'wp_get_attachment_image_attributes'\n * filter hook. Internal use only.\n *\n * @ignore\n * @since 2.9.0\n *\n * @param array $attr Thumbnail attributes including src, class, alt, title.\n */\nfunction _wp_post_thumbnail_class_filter_remove( $attr ) {\n\tremove_filter( 'wp_get_attachment_image_attributes', '_wp_post_thumbnail_class_filter' );\n}\n\nadd_shortcode('wp_caption', 'img_caption_shortcode');\nadd_shortcode('caption', 'img_caption_shortcode');\n\n/**\n * Builds the Caption shortcode output.\n *\n * Allows a plugin to replace the content that would otherwise be returned. The\n * filter is 'img_caption_shortcode' and passes an empty string, the attr\n * parameter and the content parameter values.\n *\n * The supported attributes for the shortcode are 'id', 'align', 'width', and\n * 'caption'.\n *\n * @since 2.6.0\n *\n * @param array  $attr {\n *     Attributes of the caption shortcode.\n *\n *     @type string $id      ID of the div element for the caption.\n *     @type string $align   Class name that aligns the caption. Default 'alignnone'. Accepts 'alignleft',\n *                           'aligncenter', alignright', 'alignnone'.\n *     @type int    $width   The width of the caption, in pixels.\n *     @type string $caption The caption text.\n *     @type string $class   Additional class name(s) added to the caption container.\n * }\n * @param string $content Shortcode content.\n * @return string HTML content to display the caption.\n */\nfunction img_caption_shortcode( $attr, $content = null ) {\n\t// New-style shortcode with the caption inside the shortcode with the link and image tags.\n\tif ( ! isset( $attr['caption'] ) ) {\n\t\tif ( preg_match( '#((?:<a [^>]+>\\s*)?<img [^>]+>(?:\\s*</a>)?)(.*)#is', $content, $matches ) ) {\n\t\t\t$content = $matches[1];\n\t\t\t$attr['caption'] = trim( $matches[2] );\n\t\t}\n\t} elseif ( strpos( $attr['caption'], '<' ) !== false ) {\n\t\t$attr['caption'] = wp_kses( $attr['caption'], 'post' );\n\t}\n\n\t/**\n\t * Filter the default caption shortcode output.\n\t *\n\t * If the filtered output isn't empty, it will be used instead of generating\n\t * the default caption template.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @see img_caption_shortcode()\n\t *\n\t * @param string $output  The caption output. Default empty.\n\t * @param array  $attr    Attributes of the caption shortcode.\n\t * @param string $content The image element, possibly wrapped in a hyperlink.\n\t */\n\t$output = apply_filters( 'img_caption_shortcode', '', $attr, $content );\n\tif ( $output != '' )\n\t\treturn $output;\n\n\t$atts = shortcode_atts( array(\n\t\t'id'\t  => '',\n\t\t'align'\t  => 'alignnone',\n\t\t'width'\t  => '',\n\t\t'caption' => '',\n\t\t'class'   => '',\n\t), $attr, 'caption' );\n\n\t$atts['width'] = (int) $atts['width'];\n\tif ( $atts['width'] < 1 || empty( $atts['caption'] ) )\n\t\treturn $content;\n\n\tif ( ! empty( $atts['id'] ) )\n\t\t$atts['id'] = 'id=\"' . esc_attr( sanitize_html_class( $atts['id'] ) ) . '\" ';\n\n\t$class = trim( 'wp-caption ' . $atts['align'] . ' ' . $atts['class'] );\n\n\t$html5 = current_theme_supports( 'html5', 'caption' );\n\t// HTML5 captions never added the extra 10px to the image width\n\t$width = $html5 ? $atts['width'] : ( 10 + $atts['width'] );\n\n\t/**\n\t * Filter the width of an image's caption.\n\t *\n\t * By default, the caption is 10 pixels greater than the width of the image,\n\t * to prevent post content from running up against a floated image.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @see img_caption_shortcode()\n\t *\n\t * @param int    $width    Width of the caption in pixels. To remove this inline style,\n\t *                         return zero.\n\t * @param array  $atts     Attributes of the caption shortcode.\n\t * @param string $content  The image element, possibly wrapped in a hyperlink.\n\t */\n\t$caption_width = apply_filters( 'img_caption_shortcode_width', $width, $atts, $content );\n\n\t$style = '';\n\tif ( $caption_width )\n\t\t$style = 'style=\"width: ' . (int) $caption_width . 'px\" ';\n\n\t$html = '';\n\tif ( $html5 ) {\n\t\t$html = '<figure ' . $atts['id'] . $style . 'class=\"' . esc_attr( $class ) . '\">'\n\t\t. do_shortcode( $content ) . '<figcaption class=\"wp-caption-text\">' . $atts['caption'] . '</figcaption></figure>';\n\t} else {\n\t\t$html = '<div ' . $atts['id'] . $style . 'class=\"' . esc_attr( $class ) . '\">'\n\t\t. do_shortcode( $content ) . '<p class=\"wp-caption-text\">' . $atts['caption'] . '</p></div>';\n\t}\n\n\treturn $html;\n}\n\nadd_shortcode('gallery', 'gallery_shortcode');\n\n/**\n * Builds the Gallery shortcode output.\n *\n * This implements the functionality of the Gallery Shortcode for displaying\n * WordPress images on a post.\n *\n * @since 2.5.0\n *\n * @staticvar int $instance\n *\n * @param array $attr {\n *     Attributes of the gallery shortcode.\n *\n *     @type string       $order      Order of the images in the gallery. Default 'ASC'. Accepts 'ASC', 'DESC'.\n *     @type string       $orderby    The field to use when ordering the images. Default 'menu_order ID'.\n *                                    Accepts any valid SQL ORDERBY statement.\n *     @type int          $id         Post ID.\n *     @type string       $itemtag    HTML tag to use for each image in the gallery.\n *                                    Default 'dl', or 'figure' when the theme registers HTML5 gallery support.\n *     @type string       $icontag    HTML tag to use for each image's icon.\n *                                    Default 'dt', or 'div' when the theme registers HTML5 gallery support.\n *     @type string       $captiontag HTML tag to use for each image's caption.\n *                                    Default 'dd', or 'figcaption' when the theme registers HTML5 gallery support.\n *     @type int          $columns    Number of columns of images to display. Default 3.\n *     @type string|array $size       Size of the images to display. Accepts any valid image size, or an array of width\n *                                    and height values in pixels (in that order). Default 'thumbnail'.\n *     @type string       $ids        A comma-separated list of IDs of attachments to display. Default empty.\n *     @type string       $include    A comma-separated list of IDs of attachments to include. Default empty.\n *     @type string       $exclude    A comma-separated list of IDs of attachments to exclude. Default empty.\n *     @type string       $link       What to link each image to. Default empty (links to the attachment page).\n *                                    Accepts 'file', 'none'.\n * }\n * @return string HTML content to display gallery.\n */\nfunction gallery_shortcode( $attr ) {\n\t$post = get_post();\n\n\tstatic $instance = 0;\n\t$instance++;\n\n\tif ( ! empty( $attr['ids'] ) ) {\n\t\t// 'ids' is explicitly ordered, unless you specify otherwise.\n\t\tif ( empty( $attr['orderby'] ) ) {\n\t\t\t$attr['orderby'] = 'post__in';\n\t\t}\n\t\t$attr['include'] = $attr['ids'];\n\t}\n\n\t/**\n\t * Filter the default gallery shortcode output.\n\t *\n\t * If the filtered output isn't empty, it will be used instead of generating\n\t * the default gallery template.\n\t *\n\t * @since 2.5.0\n\t * @since 4.2.0 The `$instance` parameter was added.\n\t *\n\t * @see gallery_shortcode()\n\t *\n\t * @param string $output   The gallery output. Default empty.\n\t * @param array  $attr     Attributes of the gallery shortcode.\n\t * @param int    $instance Unique numeric ID of this gallery shortcode instance.\n\t */\n\t$output = apply_filters( 'post_gallery', '', $attr, $instance );\n\tif ( $output != '' ) {\n\t\treturn $output;\n\t}\n\n\t$html5 = current_theme_supports( 'html5', 'gallery' );\n\t$atts = shortcode_atts( array(\n\t\t'order'      => 'ASC',\n\t\t'orderby'    => 'menu_order ID',\n\t\t'id'         => $post ? $post->ID : 0,\n\t\t'itemtag'    => $html5 ? 'figure'     : 'dl',\n\t\t'icontag'    => $html5 ? 'div'        : 'dt',\n\t\t'captiontag' => $html5 ? 'figcaption' : 'dd',\n\t\t'columns'    => 3,\n\t\t'size'       => 'thumbnail',\n\t\t'include'    => '',\n\t\t'exclude'    => '',\n\t\t'link'       => ''\n\t), $attr, 'gallery' );\n\n\t$id = intval( $atts['id'] );\n\n\tif ( ! empty( $atts['include'] ) ) {\n\t\t$_attachments = get_posts( array( 'include' => $atts['include'], 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );\n\n\t\t$attachments = array();\n\t\tforeach ( $_attachments as $key => $val ) {\n\t\t\t$attachments[$val->ID] = $_attachments[$key];\n\t\t}\n\t} elseif ( ! empty( $atts['exclude'] ) ) {\n\t\t$attachments = get_children( array( 'post_parent' => $id, 'exclude' => $atts['exclude'], 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );\n\t} else {\n\t\t$attachments = get_children( array( 'post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'] ) );\n\t}\n\n\tif ( empty( $attachments ) ) {\n\t\treturn '';\n\t}\n\n\tif ( is_feed() ) {\n\t\t$output = \"\\n\";\n\t\tforeach ( $attachments as $att_id => $attachment ) {\n\t\t\t$output .= wp_get_attachment_link( $att_id, $atts['size'], true ) . \"\\n\";\n\t\t}\n\t\treturn $output;\n\t}\n\n\t$itemtag = tag_escape( $atts['itemtag'] );\n\t$captiontag = tag_escape( $atts['captiontag'] );\n\t$icontag = tag_escape( $atts['icontag'] );\n\t$valid_tags = wp_kses_allowed_html( 'post' );\n\tif ( ! isset( $valid_tags[ $itemtag ] ) ) {\n\t\t$itemtag = 'dl';\n\t}\n\tif ( ! isset( $valid_tags[ $captiontag ] ) ) {\n\t\t$captiontag = 'dd';\n\t}\n\tif ( ! isset( $valid_tags[ $icontag ] ) ) {\n\t\t$icontag = 'dt';\n\t}\n\n\t$columns = intval( $atts['columns'] );\n\t$itemwidth = $columns > 0 ? floor(100/$columns) : 100;\n\t$float = is_rtl() ? 'right' : 'left';\n\n\t$selector = \"gallery-{$instance}\";\n\n\t$gallery_style = '';\n\n\t/**\n\t * Filter whether to print default gallery styles.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool $print Whether to print default gallery styles.\n\t *                    Defaults to false if the theme supports HTML5 galleries.\n\t *                    Otherwise, defaults to true.\n\t */\n\tif ( apply_filters( 'use_default_gallery_style', ! $html5 ) ) {\n\t\t$gallery_style = \"\n\t\t<style type='text/css'>\n\t\t\t#{$selector} {\n\t\t\t\tmargin: auto;\n\t\t\t}\n\t\t\t#{$selector} .gallery-item {\n\t\t\t\tfloat: {$float};\n\t\t\t\tmargin-top: 10px;\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: {$itemwidth}%;\n\t\t\t}\n\t\t\t#{$selector} img {\n\t\t\t\tborder: 2px solid #cfcfcf;\n\t\t\t}\n\t\t\t#{$selector} .gallery-caption {\n\t\t\t\tmargin-left: 0;\n\t\t\t}\n\t\t\t/* see gallery_shortcode() in wp-includes/media.php */\n\t\t</style>\\n\\t\\t\";\n\t}\n\n\t$size_class = sanitize_html_class( $atts['size'] );\n\t$gallery_div = \"<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>\";\n\n\t/**\n\t * Filter the default gallery shortcode CSS styles.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $gallery_style Default CSS styles and opening HTML div container\n\t *                              for the gallery shortcode output.\n\t */\n\t$output = apply_filters( 'gallery_style', $gallery_style . $gallery_div );\n\n\t$i = 0;\n\tforeach ( $attachments as $id => $attachment ) {\n\n\t\t$attr = ( trim( $attachment->post_excerpt ) ) ? array( 'aria-describedby' => \"$selector-$id\" ) : '';\n\t\tif ( ! empty( $atts['link'] ) && 'file' === $atts['link'] ) {\n\t\t\t$image_output = wp_get_attachment_link( $id, $atts['size'], false, false, false, $attr );\n\t\t} elseif ( ! empty( $atts['link'] ) && 'none' === $atts['link'] ) {\n\t\t\t$image_output = wp_get_attachment_image( $id, $atts['size'], false, $attr );\n\t\t} else {\n\t\t\t$image_output = wp_get_attachment_link( $id, $atts['size'], true, false, false, $attr );\n\t\t}\n\t\t$image_meta  = wp_get_attachment_metadata( $id );\n\n\t\t$orientation = '';\n\t\tif ( isset( $image_meta['height'], $image_meta['width'] ) ) {\n\t\t\t$orientation = ( $image_meta['height'] > $image_meta['width'] ) ? 'portrait' : 'landscape';\n\t\t}\n\t\t$output .= \"<{$itemtag} class='gallery-item'>\";\n\t\t$output .= \"\n\t\t\t<{$icontag} class='gallery-icon {$orientation}'>\n\t\t\t\t$image_output\n\t\t\t</{$icontag}>\";\n\t\tif ( $captiontag && trim($attachment->post_excerpt) ) {\n\t\t\t$output .= \"\n\t\t\t\t<{$captiontag} class='wp-caption-text gallery-caption' id='$selector-$id'>\n\t\t\t\t\" . wptexturize($attachment->post_excerpt) . \"\n\t\t\t\t</{$captiontag}>\";\n\t\t}\n\t\t$output .= \"</{$itemtag}>\";\n\t\tif ( ! $html5 && $columns > 0 && ++$i % $columns == 0 ) {\n\t\t\t$output .= '<br style=\"clear: both\" />';\n\t\t}\n\t}\n\n\tif ( ! $html5 && $columns > 0 && $i % $columns !== 0 ) {\n\t\t$output .= \"\n\t\t\t<br style='clear: both' />\";\n\t}\n\n\t$output .= \"\n\t\t</div>\\n\";\n\n\treturn $output;\n}\n\n/**\n * Outputs the templates used by playlists.\n *\n * @since 3.9.0\n */\nfunction wp_underscore_playlist_templates() {\n?>\n<script type=\"text/html\" id=\"tmpl-wp-playlist-current-item\">\n\t<# if ( data.image ) { #>\n\t<img src=\"{{ data.thumb.src }}\" alt=\"\" />\n\t<# } #>\n\t<div class=\"wp-playlist-caption\">\n\t\t<span class=\"wp-playlist-item-meta wp-playlist-item-title\"><?php\n\t\t\t/* translators: playlist item title */\n\t\t\tprintf( _x( '&#8220;%s&#8221;', 'playlist item title' ), '{{ data.title }}' );\n\t\t?></span>\n\t\t<# if ( data.meta.album ) { #><span class=\"wp-playlist-item-meta wp-playlist-item-album\">{{ data.meta.album }}</span><# } #>\n\t\t<# if ( data.meta.artist ) { #><span class=\"wp-playlist-item-meta wp-playlist-item-artist\">{{ data.meta.artist }}</span><# } #>\n\t</div>\n</script>\n<script type=\"text/html\" id=\"tmpl-wp-playlist-item\">\n\t<div class=\"wp-playlist-item\">\n\t\t<a class=\"wp-playlist-caption\" href=\"{{ data.src }}\">\n\t\t\t{{ data.index ? ( data.index + '. ' ) : '' }}\n\t\t\t<# if ( data.caption ) { #>\n\t\t\t\t{{ data.caption }}\n\t\t\t<# } else { #>\n\t\t\t\t<span class=\"wp-playlist-item-title\"><?php\n\t\t\t\t\t/* translators: playlist item title */\n\t\t\t\t\tprintf( _x( '&#8220;%s&#8221;', 'playlist item title' ), '{{{ data.title }}}' );\n\t\t\t\t?></span>\n\t\t\t\t<# if ( data.artists && data.meta.artist ) { #>\n\t\t\t\t<span class=\"wp-playlist-item-artist\"> &mdash; {{ data.meta.artist }}</span>\n\t\t\t\t<# } #>\n\t\t\t<# } #>\n\t\t</a>\n\t\t<# if ( data.meta.length_formatted ) { #>\n\t\t<div class=\"wp-playlist-item-length\">{{ data.meta.length_formatted }}</div>\n\t\t<# } #>\n\t</div>\n</script>\n<?php\n}\n\n/**\n * Outputs and enqueue default scripts and styles for playlists.\n *\n * @since 3.9.0\n *\n * @param string $type Type of playlist. Accepts 'audio' or 'video'.\n */\nfunction wp_playlist_scripts( $type ) {\n\twp_enqueue_style( 'wp-mediaelement' );\n\twp_enqueue_script( 'wp-playlist' );\n?>\n<!--[if lt IE 9]><script>document.createElement('<?php echo esc_js( $type ) ?>');</script><![endif]-->\n<?php\n\tadd_action( 'wp_footer', 'wp_underscore_playlist_templates', 0 );\n\tadd_action( 'admin_footer', 'wp_underscore_playlist_templates', 0 );\n}\n\n/**\n * Builds the Playlist shortcode output.\n *\n * This implements the functionality of the playlist shortcode for displaying\n * a collection of WordPress audio or video files in a post.\n *\n * @since 3.9.0\n *\n * @global int $content_width\n * @staticvar int $instance\n *\n * @param array $attr {\n *     Array of default playlist attributes.\n *\n *     @type string  $type         Type of playlist to display. Accepts 'audio' or 'video'. Default 'audio'.\n *     @type string  $order        Designates ascending or descending order of items in the playlist.\n *                                 Accepts 'ASC', 'DESC'. Default 'ASC'.\n *     @type string  $orderby      Any column, or columns, to sort the playlist. If $ids are\n *                                 passed, this defaults to the order of the $ids array ('post__in').\n *                                 Otherwise default is 'menu_order ID'.\n *     @type int     $id           If an explicit $ids array is not present, this parameter\n *                                 will determine which attachments are used for the playlist.\n *                                 Default is the current post ID.\n *     @type array   $ids          Create a playlist out of these explicit attachment IDs. If empty,\n *                                 a playlist will be created from all $type attachments of $id.\n *                                 Default empty.\n *     @type array   $exclude      List of specific attachment IDs to exclude from the playlist. Default empty.\n *     @type string  $style        Playlist style to use. Accepts 'light' or 'dark'. Default 'light'.\n *     @type bool    $tracklist    Whether to show or hide the playlist. Default true.\n *     @type bool    $tracknumbers Whether to show or hide the numbers next to entries in the playlist. Default true.\n *     @type bool    $images       Show or hide the video or audio thumbnail (Featured Image/post\n *                                 thumbnail). Default true.\n *     @type bool    $artists      Whether to show or hide artist name in the playlist. Default true.\n * }\n *\n * @return string Playlist output. Empty string if the passed type is unsupported.\n */\nfunction wp_playlist_shortcode( $attr ) {\n\tglobal $content_width;\n\t$post = get_post();\n\n\tstatic $instance = 0;\n\t$instance++;\n\n\tif ( ! empty( $attr['ids'] ) ) {\n\t\t// 'ids' is explicitly ordered, unless you specify otherwise.\n\t\tif ( empty( $attr['orderby'] ) ) {\n\t\t\t$attr['orderby'] = 'post__in';\n\t\t}\n\t\t$attr['include'] = $attr['ids'];\n\t}\n\n\t/**\n\t * Filter the playlist output.\n\t *\n\t * Passing a non-empty value to the filter will short-circuit generation\n\t * of the default playlist output, returning the passed value instead.\n\t *\n\t * @since 3.9.0\n\t * @since 4.2.0 The `$instance` parameter was added.\n\t *\n\t * @param string $output   Playlist output. Default empty.\n\t * @param array  $attr     An array of shortcode attributes.\n\t * @param int    $instance Unique numeric ID of this playlist shortcode instance.\n\t */\n\t$output = apply_filters( 'post_playlist', '', $attr, $instance );\n\tif ( $output != '' ) {\n\t\treturn $output;\n\t}\n\n\t$atts = shortcode_atts( array(\n\t\t'type'\t\t=> 'audio',\n\t\t'order'\t\t=> 'ASC',\n\t\t'orderby'\t=> 'menu_order ID',\n\t\t'id'\t\t=> $post ? $post->ID : 0,\n\t\t'include'\t=> '',\n\t\t'exclude'   => '',\n\t\t'style'\t\t=> 'light',\n\t\t'tracklist' => true,\n\t\t'tracknumbers' => true,\n\t\t'images'\t=> true,\n\t\t'artists'\t=> true\n\t), $attr, 'playlist' );\n\n\t$id = intval( $atts['id'] );\n\n\tif ( $atts['type'] !== 'audio' ) {\n\t\t$atts['type'] = 'video';\n\t}\n\n\t$args = array(\n\t\t'post_status' => 'inherit',\n\t\t'post_type' => 'attachment',\n\t\t'post_mime_type' => $atts['type'],\n\t\t'order' => $atts['order'],\n\t\t'orderby' => $atts['orderby']\n\t);\n\n\tif ( ! empty( $atts['include'] ) ) {\n\t\t$args['include'] = $atts['include'];\n\t\t$_attachments = get_posts( $args );\n\n\t\t$attachments = array();\n\t\tforeach ( $_attachments as $key => $val ) {\n\t\t\t$attachments[$val->ID] = $_attachments[$key];\n\t\t}\n\t} elseif ( ! empty( $atts['exclude'] ) ) {\n\t\t$args['post_parent'] = $id;\n\t\t$args['exclude'] = $atts['exclude'];\n\t\t$attachments = get_children( $args );\n\t} else {\n\t\t$args['post_parent'] = $id;\n\t\t$attachments = get_children( $args );\n\t}\n\n\tif ( empty( $attachments ) ) {\n\t\treturn '';\n\t}\n\n\tif ( is_feed() ) {\n\t\t$output = \"\\n\";\n\t\tforeach ( $attachments as $att_id => $attachment ) {\n\t\t\t$output .= wp_get_attachment_link( $att_id ) . \"\\n\";\n\t\t}\n\t\treturn $output;\n\t}\n\n\t$outer = 22; // default padding and border of wrapper\n\n\t$default_width = 640;\n\t$default_height = 360;\n\n\t$theme_width = empty( $content_width ) ? $default_width : ( $content_width - $outer );\n\t$theme_height = empty( $content_width ) ? $default_height : round( ( $default_height * $theme_width ) / $default_width );\n\n\t$data = array(\n\t\t'type' => $atts['type'],\n\t\t// don't pass strings to JSON, will be truthy in JS\n\t\t'tracklist' => wp_validate_boolean( $atts['tracklist'] ),\n\t\t'tracknumbers' => wp_validate_boolean( $atts['tracknumbers'] ),\n\t\t'images' => wp_validate_boolean( $atts['images'] ),\n\t\t'artists' => wp_validate_boolean( $atts['artists'] ),\n\t);\n\n\t$tracks = array();\n\tforeach ( $attachments as $attachment ) {\n\t\t$url = wp_get_attachment_url( $attachment->ID );\n\t\t$ftype = wp_check_filetype( $url, wp_get_mime_types() );\n\t\t$track = array(\n\t\t\t'src' => $url,\n\t\t\t'type' => $ftype['type'],\n\t\t\t'title' => $attachment->post_title,\n\t\t\t'caption' => $attachment->post_excerpt,\n\t\t\t'description' => $attachment->post_content\n\t\t);\n\n\t\t$track['meta'] = array();\n\t\t$meta = wp_get_attachment_metadata( $attachment->ID );\n\t\tif ( ! empty( $meta ) ) {\n\n\t\t\tforeach ( wp_get_attachment_id3_keys( $attachment ) as $key => $label ) {\n\t\t\t\tif ( ! empty( $meta[ $key ] ) ) {\n\t\t\t\t\t$track['meta'][ $key ] = $meta[ $key ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( 'video' === $atts['type'] ) {\n\t\t\t\tif ( ! empty( $meta['width'] ) && ! empty( $meta['height'] ) ) {\n\t\t\t\t\t$width = $meta['width'];\n\t\t\t\t\t$height = $meta['height'];\n\t\t\t\t\t$theme_height = round( ( $height * $theme_width ) / $width );\n\t\t\t\t} else {\n\t\t\t\t\t$width = $default_width;\n\t\t\t\t\t$height = $default_height;\n\t\t\t\t}\n\n\t\t\t\t$track['dimensions'] = array(\n\t\t\t\t\t'original' => compact( 'width', 'height' ),\n\t\t\t\t\t'resized' => array(\n\t\t\t\t\t\t'width' => $theme_width,\n\t\t\t\t\t\t'height' => $theme_height\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif ( $atts['images'] ) {\n\t\t\t$thumb_id = get_post_thumbnail_id( $attachment->ID );\n\t\t\tif ( ! empty( $thumb_id ) ) {\n\t\t\t\tlist( $src, $width, $height ) = wp_get_attachment_image_src( $thumb_id, 'full' );\n\t\t\t\t$track['image'] = compact( 'src', 'width', 'height' );\n\t\t\t\tlist( $src, $width, $height ) = wp_get_attachment_image_src( $thumb_id, 'thumbnail' );\n\t\t\t\t$track['thumb'] = compact( 'src', 'width', 'height' );\n\t\t\t} else {\n\t\t\t\t$src = wp_mime_type_icon( $attachment->ID );\n\t\t\t\t$width = 48;\n\t\t\t\t$height = 64;\n\t\t\t\t$track['image'] = compact( 'src', 'width', 'height' );\n\t\t\t\t$track['thumb'] = compact( 'src', 'width', 'height' );\n\t\t\t}\n\t\t}\n\n\t\t$tracks[] = $track;\n\t}\n\t$data['tracks'] = $tracks;\n\n\t$safe_type = esc_attr( $atts['type'] );\n\t$safe_style = esc_attr( $atts['style'] );\n\n\tob_start();\n\n\tif ( 1 === $instance ) {\n\t\t/**\n\t\t * Print and enqueue playlist scripts, styles, and JavaScript templates.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param string $type  Type of playlist. Possible values are 'audio' or 'video'.\n\t\t * @param string $style The 'theme' for the playlist. Core provides 'light' and 'dark'.\n\t\t */\n\t\tdo_action( 'wp_playlist_scripts', $atts['type'], $atts['style'] );\n\t} ?>\n<div class=\"wp-playlist wp-<?php echo $safe_type ?>-playlist wp-playlist-<?php echo $safe_style ?>\">\n\t<?php if ( 'audio' === $atts['type'] ): ?>\n\t<div class=\"wp-playlist-current-item\"></div>\n\t<?php endif ?>\n\t<<?php echo $safe_type ?> controls=\"controls\" preload=\"none\" width=\"<?php\n\t\techo (int) $theme_width;\n\t?>\"<?php if ( 'video' === $safe_type ):\n\t\techo ' height=\"', (int) $theme_height, '\"';\n\telse:\n\t\techo ' style=\"visibility: hidden\"';\n\tendif; ?>></<?php echo $safe_type ?>>\n\t<div class=\"wp-playlist-next\"></div>\n\t<div class=\"wp-playlist-prev\"></div>\n\t<noscript>\n\t<ol><?php\n\tforeach ( $attachments as $att_id => $attachment ) {\n\t\tprintf( '<li>%s</li>', wp_get_attachment_link( $att_id ) );\n\t}\n\t?></ol>\n\t</noscript>\n\t<script type=\"application/json\" class=\"wp-playlist-script\"><?php echo wp_json_encode( $data ) ?></script>\n</div>\n\t<?php\n\treturn ob_get_clean();\n}\nadd_shortcode( 'playlist', 'wp_playlist_shortcode' );\n\n/**\n * Provides a No-JS Flash fallback as a last resort for audio / video.\n *\n * @since 3.6.0\n *\n * @param string $url The media element URL.\n * @return string Fallback HTML.\n */\nfunction wp_mediaelement_fallback( $url ) {\n\t/**\n\t * Filter the Mediaelement fallback output for no-JS.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $output Fallback output for no-JS.\n\t * @param string $url    Media file URL.\n\t */\n\treturn apply_filters( 'wp_mediaelement_fallback', sprintf( '<a href=\"%1$s\">%1$s</a>', esc_url( $url ) ), $url );\n}\n\n/**\n * Returns a filtered list of WP-supported audio formats.\n *\n * @since 3.6.0\n *\n * @return array Supported audio formats.\n */\nfunction wp_get_audio_extensions() {\n\t/**\n\t * Filter the list of supported audio formats.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array $extensions An array of support audio formats. Defaults are\n\t *                          'mp3', 'ogg', 'wma', 'm4a', 'wav'.\n\t */\n\treturn apply_filters( 'wp_audio_extensions', array( 'mp3', 'ogg', 'wma', 'm4a', 'wav' ) );\n}\n\n/**\n * Returns useful keys to use to lookup data from an attachment's stored metadata.\n *\n * @since 3.9.0\n *\n * @param WP_Post $attachment The current attachment, provided for context.\n * @param string  $context    Optional. The context. Accepts 'edit', 'display'. Default 'display'.\n * @return array Key/value pairs of field keys to labels.\n */\nfunction wp_get_attachment_id3_keys( $attachment, $context = 'display' ) {\n\t$fields = array(\n\t\t'artist' => __( 'Artist' ),\n\t\t'album' => __( 'Album' ),\n\t);\n\n\tif ( 'display' === $context ) {\n\t\t$fields['genre']            = __( 'Genre' );\n\t\t$fields['year']             = __( 'Year' );\n\t\t$fields['length_formatted'] = _x( 'Length', 'video or audio' );\n\t} elseif ( 'js' === $context ) {\n\t\t$fields['bitrate']          = __( 'Bitrate' );\n\t\t$fields['bitrate_mode']     = __( 'Bitrate Mode' );\n\t}\n\n\t/**\n\t * Filter the editable list of keys to look up data from an attachment's metadata.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param array   $fields     Key/value pairs of field keys to labels.\n\t * @param WP_Post $attachment Attachment object.\n\t * @param string  $context    The context. Accepts 'edit', 'display'. Default 'display'.\n\t */\n\treturn apply_filters( 'wp_get_attachment_id3_keys', $fields, $attachment, $context );\n}\n/**\n * Builds the Audio shortcode output.\n *\n * This implements the functionality of the Audio Shortcode for displaying\n * WordPress mp3s in a post.\n *\n * @since 3.6.0\n *\n * @staticvar int $instance\n *\n * @param array  $attr {\n *     Attributes of the audio shortcode.\n *\n *     @type string $src      URL to the source of the audio file. Default empty.\n *     @type string $loop     The 'loop' attribute for the `<audio>` element. Default empty.\n *     @type string $autoplay The 'autoplay' attribute for the `<audio>` element. Default empty.\n *     @type string $preload  The 'preload' attribute for the `<audio>` element. Default empty.\n *     @type string $class    The 'class' attribute for the `<audio>` element. Default 'wp-audio-shortcode'.\n *     @type string $style    The 'style' attribute for the `<audio>` element. Default 'width: 100%'.\n * }\n * @param string $content Shortcode content.\n * @return string|void HTML content to display audio.\n */\nfunction wp_audio_shortcode( $attr, $content = '' ) {\n\t$post_id = get_post() ? get_the_ID() : 0;\n\n\tstatic $instance = 0;\n\t$instance++;\n\n\t/**\n\t * Filter the default audio shortcode output.\n\t *\n\t * If the filtered output isn't empty, it will be used instead of generating the default audio template.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $html     Empty variable to be replaced with shortcode markup.\n\t * @param array  $attr     Attributes of the shortcode. @see wp_audio_shortcode()\n\t * @param string $content  Shortcode content.\n\t * @param int    $instance Unique numeric ID of this audio shortcode instance.\n\t */\n\t$override = apply_filters( 'wp_audio_shortcode_override', '', $attr, $content, $instance );\n\tif ( '' !== $override ) {\n\t\treturn $override;\n\t}\n\n\t$audio = null;\n\n\t$default_types = wp_get_audio_extensions();\n\t$defaults_atts = array(\n\t\t'src'      => '',\n\t\t'loop'     => '',\n\t\t'autoplay' => '',\n\t\t'preload'  => 'none'\n\t);\n\tforeach ( $default_types as $type ) {\n\t\t$defaults_atts[$type] = '';\n\t}\n\n\t$atts = shortcode_atts( $defaults_atts, $attr, 'audio' );\n\n\t$primary = false;\n\tif ( ! empty( $atts['src'] ) ) {\n\t\t$type = wp_check_filetype( $atts['src'], wp_get_mime_types() );\n\t\tif ( ! in_array( strtolower( $type['ext'] ), $default_types ) ) {\n\t\t\treturn sprintf( '<a class=\"wp-embedded-audio\" href=\"%s\">%s</a>', esc_url( $atts['src'] ), esc_html( $atts['src'] ) );\n\t\t}\n\t\t$primary = true;\n\t\tarray_unshift( $default_types, 'src' );\n\t} else {\n\t\tforeach ( $default_types as $ext ) {\n\t\t\tif ( ! empty( $atts[ $ext ] ) ) {\n\t\t\t\t$type = wp_check_filetype( $atts[ $ext ], wp_get_mime_types() );\n\t\t\t\tif ( strtolower( $type['ext'] ) === $ext ) {\n\t\t\t\t\t$primary = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( ! $primary ) {\n\t\t$audios = get_attached_media( 'audio', $post_id );\n\t\tif ( empty( $audios ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$audio = reset( $audios );\n\t\t$atts['src'] = wp_get_attachment_url( $audio->ID );\n\t\tif ( empty( $atts['src'] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tarray_unshift( $default_types, 'src' );\n\t}\n\n\t/**\n\t * Filter the media library used for the audio shortcode.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $library Media library used for the audio shortcode.\n\t */\n\t$library = apply_filters( 'wp_audio_shortcode_library', 'mediaelement' );\n\tif ( 'mediaelement' === $library && did_action( 'init' ) ) {\n\t\twp_enqueue_style( 'wp-mediaelement' );\n\t\twp_enqueue_script( 'wp-mediaelement' );\n\t}\n\n\t/**\n\t * Filter the class attribute for the audio shortcode output container.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $class CSS class or list of space-separated classes.\n\t */\n\t$html_atts = array(\n\t\t'class'    => apply_filters( 'wp_audio_shortcode_class', 'wp-audio-shortcode' ),\n\t\t'id'       => sprintf( 'audio-%d-%d', $post_id, $instance ),\n\t\t'loop'     => wp_validate_boolean( $atts['loop'] ),\n\t\t'autoplay' => wp_validate_boolean( $atts['autoplay'] ),\n\t\t'preload'  => $atts['preload'],\n\t\t'style'    => 'width: 100%; visibility: hidden;',\n\t);\n\n\t// These ones should just be omitted altogether if they are blank\n\tforeach ( array( 'loop', 'autoplay', 'preload' ) as $a ) {\n\t\tif ( empty( $html_atts[$a] ) ) {\n\t\t\tunset( $html_atts[$a] );\n\t\t}\n\t}\n\n\t$attr_strings = array();\n\tforeach ( $html_atts as $k => $v ) {\n\t\t$attr_strings[] = $k . '=\"' . esc_attr( $v ) . '\"';\n\t}\n\n\t$html = '';\n\tif ( 'mediaelement' === $library && 1 === $instance ) {\n\t\t$html .= \"<!--[if lt IE 9]><script>document.createElement('audio');</script><![endif]-->\\n\";\n\t}\n\t$html .= sprintf( '<audio %s controls=\"controls\">', join( ' ', $attr_strings ) );\n\n\t$fileurl = '';\n\t$source = '<source type=\"%s\" src=\"%s\" />';\n\tforeach ( $default_types as $fallback ) {\n\t\tif ( ! empty( $atts[ $fallback ] ) ) {\n\t\t\tif ( empty( $fileurl ) ) {\n\t\t\t\t$fileurl = $atts[ $fallback ];\n\t\t\t}\n\t\t\t$type = wp_check_filetype( $atts[ $fallback ], wp_get_mime_types() );\n\t\t\t$url = add_query_arg( '_', $instance, $atts[ $fallback ] );\n\t\t\t$html .= sprintf( $source, $type['type'], esc_url( $url ) );\n\t\t}\n\t}\n\n\tif ( 'mediaelement' === $library ) {\n\t\t$html .= wp_mediaelement_fallback( $fileurl );\n\t}\n\t$html .= '</audio>';\n\n\t/**\n\t * Filter the audio shortcode output.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $html    Audio shortcode HTML output.\n\t * @param array  $atts    Array of audio shortcode attributes.\n\t * @param string $audio   Audio file.\n\t * @param int    $post_id Post ID.\n\t * @param string $library Media library used for the audio shortcode.\n\t */\n\treturn apply_filters( 'wp_audio_shortcode', $html, $atts, $audio, $post_id, $library );\n}\nadd_shortcode( 'audio', 'wp_audio_shortcode' );\n\n/**\n * Returns a filtered list of WP-supported video formats.\n *\n * @since 3.6.0\n *\n * @return array List of supported video formats.\n */\nfunction wp_get_video_extensions() {\n\t/**\n\t * Filter the list of supported video formats.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array $extensions An array of support video formats. Defaults are\n\t *                          'mp4', 'm4v', 'webm', 'ogv', 'wmv', 'flv'.\n\t */\n\treturn apply_filters( 'wp_video_extensions', array( 'mp4', 'm4v', 'webm', 'ogv', 'wmv', 'flv' ) );\n}\n\n/**\n * Builds the Video shortcode output.\n *\n * This implements the functionality of the Video Shortcode for displaying\n * WordPress mp4s in a post.\n *\n * @since 3.6.0\n *\n * @global int $content_width\n * @staticvar int $instance\n *\n * @param array  $attr {\n *     Attributes of the shortcode.\n *\n *     @type string $src      URL to the source of the video file. Default empty.\n *     @type int    $height   Height of the video embed in pixels. Default 360.\n *     @type int    $width    Width of the video embed in pixels. Default $content_width or 640.\n *     @type string $poster   The 'poster' attribute for the `<video>` element. Default empty.\n *     @type string $loop     The 'loop' attribute for the `<video>` element. Default empty.\n *     @type string $autoplay The 'autoplay' attribute for the `<video>` element. Default empty.\n *     @type string $preload  The 'preload' attribute for the `<video>` element.\n *                            Default 'metadata'.\n *     @type string $class    The 'class' attribute for the `<video>` element.\n *                            Default 'wp-video-shortcode'.\n * }\n * @param string $content Shortcode content.\n * @return string|void HTML content to display video.\n */\nfunction wp_video_shortcode( $attr, $content = '' ) {\n\tglobal $content_width;\n\t$post_id = get_post() ? get_the_ID() : 0;\n\n\tstatic $instance = 0;\n\t$instance++;\n\n\t/**\n\t * Filter the default video shortcode output.\n\t *\n\t * If the filtered output isn't empty, it will be used instead of generating\n\t * the default video template.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @see wp_video_shortcode()\n\t *\n\t * @param string $html     Empty variable to be replaced with shortcode markup.\n\t * @param array  $attr     Attributes of the video shortcode.\n\t * @param string $content  Video shortcode content.\n\t * @param int    $instance Unique numeric ID of this video shortcode instance.\n\t */\n\t$override = apply_filters( 'wp_video_shortcode_override', '', $attr, $content, $instance );\n\tif ( '' !== $override ) {\n\t\treturn $override;\n\t}\n\n\t$video = null;\n\n\t$default_types = wp_get_video_extensions();\n\t$defaults_atts = array(\n\t\t'src'      => '',\n\t\t'poster'   => '',\n\t\t'loop'     => '',\n\t\t'autoplay' => '',\n\t\t'preload'  => 'metadata',\n\t\t'width'    => 640,\n\t\t'height'   => 360,\n\t);\n\n\tforeach ( $default_types as $type ) {\n\t\t$defaults_atts[$type] = '';\n\t}\n\n\t$atts = shortcode_atts( $defaults_atts, $attr, 'video' );\n\n\tif ( is_admin() ) {\n\t\t// shrink the video so it isn't huge in the admin\n\t\tif ( $atts['width'] > $defaults_atts['width'] ) {\n\t\t\t$atts['height'] = round( ( $atts['height'] * $defaults_atts['width'] ) / $atts['width'] );\n\t\t\t$atts['width'] = $defaults_atts['width'];\n\t\t}\n\t} else {\n\t\t// if the video is bigger than the theme\n\t\tif ( ! empty( $content_width ) && $atts['width'] > $content_width ) {\n\t\t\t$atts['height'] = round( ( $atts['height'] * $content_width ) / $atts['width'] );\n\t\t\t$atts['width'] = $content_width;\n\t\t}\n\t}\n\n\t$is_vimeo = $is_youtube = false;\n\t$yt_pattern = '#^https?://(?:www\\.)?(?:youtube\\.com/watch|youtu\\.be/)#';\n\t$vimeo_pattern = '#^https?://(.+\\.)?vimeo\\.com/.*#';\n\n\t$primary = false;\n\tif ( ! empty( $atts['src'] ) ) {\n\t\t$is_vimeo = ( preg_match( $vimeo_pattern, $atts['src'] ) );\n\t\t$is_youtube = (  preg_match( $yt_pattern, $atts['src'] ) );\n\t\tif ( ! $is_youtube && ! $is_vimeo ) {\n\t\t\t$type = wp_check_filetype( $atts['src'], wp_get_mime_types() );\n\t\t\tif ( ! in_array( strtolower( $type['ext'] ), $default_types ) ) {\n\t\t\t\treturn sprintf( '<a class=\"wp-embedded-video\" href=\"%s\">%s</a>', esc_url( $atts['src'] ), esc_html( $atts['src'] ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( $is_vimeo ) {\n\t\t\twp_enqueue_script( 'froogaloop' );\n\t\t}\n\n\t\t$primary = true;\n\t\tarray_unshift( $default_types, 'src' );\n\t} else {\n\t\tforeach ( $default_types as $ext ) {\n\t\t\tif ( ! empty( $atts[ $ext ] ) ) {\n\t\t\t\t$type = wp_check_filetype( $atts[ $ext ], wp_get_mime_types() );\n\t\t\t\tif ( strtolower( $type['ext'] ) === $ext ) {\n\t\t\t\t\t$primary = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( ! $primary ) {\n\t\t$videos = get_attached_media( 'video', $post_id );\n\t\tif ( empty( $videos ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$video = reset( $videos );\n\t\t$atts['src'] = wp_get_attachment_url( $video->ID );\n\t\tif ( empty( $atts['src'] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tarray_unshift( $default_types, 'src' );\n\t}\n\n\t/**\n\t * Filter the media library used for the video shortcode.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $library Media library used for the video shortcode.\n\t */\n\t$library = apply_filters( 'wp_video_shortcode_library', 'mediaelement' );\n\tif ( 'mediaelement' === $library && did_action( 'init' ) ) {\n\t\twp_enqueue_style( 'wp-mediaelement' );\n\t\twp_enqueue_script( 'wp-mediaelement' );\n\t}\n\n\t/**\n\t * Filter the class attribute for the video shortcode output container.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $class CSS class or list of space-separated classes.\n\t */\n\t$html_atts = array(\n\t\t'class'    => apply_filters( 'wp_video_shortcode_class', 'wp-video-shortcode' ),\n\t\t'id'       => sprintf( 'video-%d-%d', $post_id, $instance ),\n\t\t'width'    => absint( $atts['width'] ),\n\t\t'height'   => absint( $atts['height'] ),\n\t\t'poster'   => esc_url( $atts['poster'] ),\n\t\t'loop'     => wp_validate_boolean( $atts['loop'] ),\n\t\t'autoplay' => wp_validate_boolean( $atts['autoplay'] ),\n\t\t'preload'  => $atts['preload'],\n\t);\n\n\t// These ones should just be omitted altogether if they are blank\n\tforeach ( array( 'poster', 'loop', 'autoplay', 'preload' ) as $a ) {\n\t\tif ( empty( $html_atts[$a] ) ) {\n\t\t\tunset( $html_atts[$a] );\n\t\t}\n\t}\n\n\t$attr_strings = array();\n\tforeach ( $html_atts as $k => $v ) {\n\t\t$attr_strings[] = $k . '=\"' . esc_attr( $v ) . '\"';\n\t}\n\n\t$html = '';\n\tif ( 'mediaelement' === $library && 1 === $instance ) {\n\t\t$html .= \"<!--[if lt IE 9]><script>document.createElement('video');</script><![endif]-->\\n\";\n\t}\n\t$html .= sprintf( '<video %s controls=\"controls\">', join( ' ', $attr_strings ) );\n\n\t$fileurl = '';\n\t$source = '<source type=\"%s\" src=\"%s\" />';\n\tforeach ( $default_types as $fallback ) {\n\t\tif ( ! empty( $atts[ $fallback ] ) ) {\n\t\t\tif ( empty( $fileurl ) ) {\n\t\t\t\t$fileurl = $atts[ $fallback ];\n\t\t\t}\n\t\t\tif ( 'src' === $fallback && $is_youtube ) {\n\t\t\t\t$type = array( 'type' => 'video/youtube' );\n\t\t\t} elseif ( 'src' === $fallback && $is_vimeo ) {\n\t\t\t\t$type = array( 'type' => 'video/vimeo' );\n\t\t\t} else {\n\t\t\t\t$type = wp_check_filetype( $atts[ $fallback ], wp_get_mime_types() );\n\t\t\t}\n\t\t\t$url = add_query_arg( '_', $instance, $atts[ $fallback ] );\n\t\t\t$html .= sprintf( $source, $type['type'], esc_url( $url ) );\n\t\t}\n\t}\n\n\tif ( ! empty( $content ) ) {\n\t\tif ( false !== strpos( $content, \"\\n\" ) ) {\n\t\t\t$content = str_replace( array( \"\\r\\n\", \"\\n\", \"\\t\" ), '', $content );\n\t\t}\n\t\t$html .= trim( $content );\n\t}\n\n\tif ( 'mediaelement' === $library ) {\n\t\t$html .= wp_mediaelement_fallback( $fileurl );\n\t}\n\t$html .= '</video>';\n\n\t$width_rule = '';\n\tif ( ! empty( $atts['width'] ) ) {\n\t\t$width_rule = sprintf( 'width: %dpx; ', $atts['width'] );\n\t}\n\t$output = sprintf( '<div style=\"%s\" class=\"wp-video\">%s</div>', $width_rule, $html );\n\n\t/**\n\t * Filter the output of the video shortcode.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $output  Video shortcode HTML output.\n\t * @param array  $atts    Array of video shortcode attributes.\n\t * @param string $video   Video file.\n\t * @param int    $post_id Post ID.\n\t * @param string $library Media library used for the video shortcode.\n\t */\n\treturn apply_filters( 'wp_video_shortcode', $output, $atts, $video, $post_id, $library );\n}\nadd_shortcode( 'video', 'wp_video_shortcode' );\n\n/**\n * Displays previous image link that has the same post parent.\n *\n * @since 2.5.0\n *\n * @see adjacent_image_link()\n *\n * @param string|array $size Optional. Image size. Accepts any valid image size, an array of width and\n *                           height values in pixels (in that order), 0, or 'none'. 0 or 'none' will\n *                           default to 'post_title' or `$text`. Default 'thumbnail'.\n * @param string       $text Optional. Link text. Default false.\n */\nfunction previous_image_link( $size = 'thumbnail', $text = false ) {\n\tadjacent_image_link(true, $size, $text);\n}\n\n/**\n * Displays next image link that has the same post parent.\n *\n * @since 2.5.0\n *\n * @see adjacent_image_link()\n *\n * @param string|array $size Optional. Image size. Accepts any valid image size, an array of width and\n *                           height values in pixels (in that order), 0, or 'none'. 0 or 'none' will\n *                           default to 'post_title' or `$text`. Default 'thumbnail'.\n * @param string       $text Optional. Link text. Default false.\n */\nfunction next_image_link( $size = 'thumbnail', $text = false ) {\n\tadjacent_image_link(false, $size, $text);\n}\n\n/**\n * Displays next or previous image link that has the same post parent.\n *\n * Retrieves the current attachment object from the $post global.\n *\n * @since 2.5.0\n *\n * @param bool         $prev Optional. Whether to display the next (false) or previous (true) link. Default true.\n * @param string|array $size Optional. Image size. Accepts any valid image size, or an array of width and height\n *                           values in pixels (in that order). Default 'thumbnail'.\n * @param bool         $text Optional. Link text. Default false.\n */\nfunction adjacent_image_link( $prev = true, $size = 'thumbnail', $text = false ) {\n\t$post = get_post();\n\t$attachments = array_values( get_children( array( 'post_parent' => $post->post_parent, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC', 'orderby' => 'menu_order ID' ) ) );\n\n\tforeach ( $attachments as $k => $attachment ) {\n\t\tif ( $attachment->ID == $post->ID ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t$output = '';\n\t$attachment_id = 0;\n\n\tif ( $attachments ) {\n\t\t$k = $prev ? $k - 1 : $k + 1;\n\n\t\tif ( isset( $attachments[ $k ] ) ) {\n\t\t\t$attachment_id = $attachments[ $k ]->ID;\n\t\t\t$output = wp_get_attachment_link( $attachment_id, $size, true, false, $text );\n\t\t}\n\t}\n\n\t$adjacent = $prev ? 'previous' : 'next';\n\n\t/**\n\t * Filter the adjacent image link.\n\t *\n\t * The dynamic portion of the hook name, `$adjacent`, refers to the type of adjacency,\n\t * either 'next', or 'previous'.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param string $output        Adjacent image HTML markup.\n\t * @param int    $attachment_id Attachment ID\n\t * @param string $size          Image size.\n\t * @param string $text          Link text.\n\t */\n\techo apply_filters( \"{$adjacent}_image_link\", $output, $attachment_id, $size, $text );\n}\n\n/**\n * Retrieves taxonomies attached to given the attachment.\n *\n * @since 2.5.0\n *\n * @param int|array|object $attachment Attachment ID, data array, or data object.\n * @return array Empty array on failure. List of taxonomies on success.\n */\nfunction get_attachment_taxonomies( $attachment ) {\n\tif ( is_int( $attachment ) ) {\n\t\t$attachment = get_post( $attachment );\n\t} elseif ( is_array( $attachment ) ) {\n\t\t$attachment = (object) $attachment;\n\t}\n\tif ( ! is_object($attachment) )\n\t\treturn array();\n\n\t$file = get_attached_file( $attachment->ID );\n\t$filename = basename( $file );\n\n\t$objects = array('attachment');\n\n\tif ( false !== strpos($filename, '.') )\n\t\t$objects[] = 'attachment:' . substr($filename, strrpos($filename, '.') + 1);\n\tif ( !empty($attachment->post_mime_type) ) {\n\t\t$objects[] = 'attachment:' . $attachment->post_mime_type;\n\t\tif ( false !== strpos($attachment->post_mime_type, '/') )\n\t\t\tforeach ( explode('/', $attachment->post_mime_type) as $token )\n\t\t\t\tif ( !empty($token) )\n\t\t\t\t\t$objects[] = \"attachment:$token\";\n\t}\n\n\t$taxonomies = array();\n\tforeach ( $objects as $object )\n\t\tif ( $taxes = get_object_taxonomies($object) )\n\t\t\t$taxonomies = array_merge($taxonomies, $taxes);\n\n\treturn array_unique($taxonomies);\n}\n\n/**\n * Retrieves all of the taxonomy names that are registered for attachments.\n *\n * Handles mime-type-specific taxonomies such as attachment:image and attachment:video.\n *\n * @since 3.5.0\n *\n * @see get_taxonomies()\n *\n * @param string $output Optional. The type of taxonomy output to return. Accepts 'names' or 'objects'.\n *                       Default 'names'.\n * @return array The names of all taxonomy of $object_type.\n */\nfunction get_taxonomies_for_attachments( $output = 'names' ) {\n\t$taxonomies = array();\n\tforeach ( get_taxonomies( array(), 'objects' ) as $taxonomy ) {\n\t\tforeach ( $taxonomy->object_type as $object_type ) {\n\t\t\tif ( 'attachment' == $object_type || 0 === strpos( $object_type, 'attachment:' ) ) {\n\t\t\t\tif ( 'names' == $output )\n\t\t\t\t\t$taxonomies[] = $taxonomy->name;\n\t\t\t\telse\n\t\t\t\t\t$taxonomies[ $taxonomy->name ] = $taxonomy;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $taxonomies;\n}\n\n/**\n * Create new GD image resource with transparency support\n *\n * @todo: Deprecate if possible.\n *\n * @since 2.9.0\n *\n * @param int $width  Image width in pixels.\n * @param int $height Image height in pixels..\n * @return resource The GD image resource.\n */\nfunction wp_imagecreatetruecolor($width, $height) {\n\t$img = imagecreatetruecolor($width, $height);\n\tif ( is_resource($img) && function_exists('imagealphablending') && function_exists('imagesavealpha') ) {\n\t\timagealphablending($img, false);\n\t\timagesavealpha($img, true);\n\t}\n\treturn $img;\n}\n\n/**\n * Based on a supplied width/height example, return the biggest possible dimensions based on the max width/height.\n *\n * @since 2.9.0\n *\n * @see wp_constrain_dimensions()\n *\n * @param int $example_width  The width of an example embed.\n * @param int $example_height The height of an example embed.\n * @param int $max_width      The maximum allowed width.\n * @param int $max_height     The maximum allowed height.\n * @return array The maximum possible width and height based on the example ratio.\n */\nfunction wp_expand_dimensions( $example_width, $example_height, $max_width, $max_height ) {\n\t$example_width  = (int) $example_width;\n\t$example_height = (int) $example_height;\n\t$max_width      = (int) $max_width;\n\t$max_height     = (int) $max_height;\n\n\treturn wp_constrain_dimensions( $example_width * 1000000, $example_height * 1000000, $max_width, $max_height );\n}\n\n/**\n * Converts a shorthand byte value to an integer byte value.\n *\n * @since 2.3.0\n *\n * @param string $size A shorthand byte value.\n * @return int An integer byte value.\n */\nfunction wp_convert_hr_to_bytes( $size ) {\n\t$size  = strtolower( $size );\n\t$bytes = (int) $size;\n\tif ( strpos( $size, 'k' ) !== false )\n\t\t$bytes = intval( $size ) * KB_IN_BYTES;\n\telseif ( strpos( $size, 'm' ) !== false )\n\t\t$bytes = intval($size) * MB_IN_BYTES;\n\telseif ( strpos( $size, 'g' ) !== false )\n\t\t$bytes = intval( $size ) * GB_IN_BYTES;\n\treturn $bytes;\n}\n\n/**\n * Determines the maximum upload size allowed in php.ini.\n *\n * @since 2.5.0\n *\n * @return int Allowed upload size.\n */\nfunction wp_max_upload_size() {\n\t$u_bytes = wp_convert_hr_to_bytes( ini_get( 'upload_max_filesize' ) );\n\t$p_bytes = wp_convert_hr_to_bytes( ini_get( 'post_max_size' ) );\n\n\t/**\n\t * Filter the maximum upload size allowed in php.ini.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param int $size    Max upload size limit in bytes.\n\t * @param int $u_bytes Maximum upload filesize in bytes.\n\t * @param int $p_bytes Maximum size of POST data in bytes.\n\t */\n\treturn apply_filters( 'upload_size_limit', min( $u_bytes, $p_bytes ), $u_bytes, $p_bytes );\n}\n\n/**\n * Returns a WP_Image_Editor instance and loads file into it.\n *\n * @since 3.5.0\n *\n * @param string $path Path to the file to load.\n * @param array  $args Optional. Additional arguments for retrieving the image editor.\n *                     Default empty array.\n * @return WP_Image_Editor|WP_Error The WP_Image_Editor object if successful, an WP_Error\n *                                  object otherwise.\n */\nfunction wp_get_image_editor( $path, $args = array() ) {\n\t$args['path'] = $path;\n\n\tif ( ! isset( $args['mime_type'] ) ) {\n\t\t$file_info = wp_check_filetype( $args['path'] );\n\n\t\t// If $file_info['type'] is false, then we let the editor attempt to\n\t\t// figure out the file type, rather than forcing a failure based on extension.\n\t\tif ( isset( $file_info ) && $file_info['type'] )\n\t\t\t$args['mime_type'] = $file_info['type'];\n\t}\n\n\t$implementation = _wp_image_editor_choose( $args );\n\n\tif ( $implementation ) {\n\t\t$editor = new $implementation( $path );\n\t\t$loaded = $editor->load();\n\n\t\tif ( is_wp_error( $loaded ) )\n\t\t\treturn $loaded;\n\n\t\treturn $editor;\n\t}\n\n\treturn new WP_Error( 'image_no_editor', __('No editor could be selected.') );\n}\n\n/**\n * Tests whether there is an editor that supports a given mime type or methods.\n *\n * @since 3.5.0\n *\n * @param string|array $args Optional. Array of arguments to retrieve the image editor supports.\n *                           Default empty array.\n * @return bool True if an eligible editor is found; false otherwise.\n */\nfunction wp_image_editor_supports( $args = array() ) {\n\treturn (bool) _wp_image_editor_choose( $args );\n}\n\n/**\n * Tests which editors are capable of supporting the request.\n *\n * @ignore\n * @since 3.5.0\n *\n * @param array $args Optional. Array of arguments for choosing a capable editor. Default empty array.\n * @return string|false Class name for the first editor that claims to support the request. False if no\n *                     editor claims to support the request.\n */\nfunction _wp_image_editor_choose( $args = array() ) {\n\trequire_once ABSPATH . WPINC . '/class-wp-image-editor.php';\n\trequire_once ABSPATH . WPINC . '/class-wp-image-editor-gd.php';\n\trequire_once ABSPATH . WPINC . '/class-wp-image-editor-imagick.php';\n\n\t/**\n\t * Filter the list of image editing library classes.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array $image_editors List of available image editors. Defaults are\n\t *                             'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD'.\n\t */\n\t$implementations = apply_filters( 'wp_image_editors', array( 'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD' ) );\n\n\tforeach ( $implementations as $implementation ) {\n\t\tif ( ! call_user_func( array( $implementation, 'test' ), $args ) )\n\t\t\tcontinue;\n\n\t\tif ( isset( $args['mime_type'] ) &&\n\t\t\t! call_user_func(\n\t\t\t\tarray( $implementation, 'supports_mime_type' ),\n\t\t\t\t$args['mime_type'] ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( isset( $args['methods'] ) &&\n\t\t\t array_diff( $args['methods'], get_class_methods( $implementation ) ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn $implementation;\n\t}\n\n\treturn false;\n}\n\n/**\n * Prints default plupload arguments.\n *\n * @since 3.4.0\n */\nfunction wp_plupload_default_settings() {\n\t$wp_scripts = wp_scripts();\n\n\t$data = $wp_scripts->get_data( 'wp-plupload', 'data' );\n\tif ( $data && false !== strpos( $data, '_wpPluploadSettings' ) )\n\t\treturn;\n\n\t$max_upload_size = wp_max_upload_size();\n\n\t$defaults = array(\n\t\t'runtimes'            => 'html5,flash,silverlight,html4',\n\t\t'file_data_name'      => 'async-upload', // key passed to $_FILE.\n\t\t'url'                 => admin_url( 'async-upload.php', 'relative' ),\n\t\t'flash_swf_url'       => includes_url( 'js/plupload/plupload.flash.swf' ),\n\t\t'silverlight_xap_url' => includes_url( 'js/plupload/plupload.silverlight.xap' ),\n\t\t'filters' => array(\n\t\t\t'max_file_size'   => $max_upload_size . 'b',\n\t\t),\n\t);\n\n\t// Currently only iOS Safari supports multiple files uploading but iOS 7.x has a bug that prevents uploading of videos\n\t// when enabled. See #29602.\n\tif ( wp_is_mobile() && strpos( $_SERVER['HTTP_USER_AGENT'], 'OS 7_' ) !== false &&\n\t\tstrpos( $_SERVER['HTTP_USER_AGENT'], 'like Mac OS X' ) !== false ) {\n\n\t\t$defaults['multi_selection'] = false;\n\t}\n\n\t/**\n\t * Filter the Plupload default settings.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param array $defaults Default Plupload settings array.\n\t */\n\t$defaults = apply_filters( 'plupload_default_settings', $defaults );\n\n\t$params = array(\n\t\t'action' => 'upload-attachment',\n\t);\n\n\t/**\n\t * Filter the Plupload default parameters.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param array $params Default Plupload parameters array.\n\t */\n\t$params = apply_filters( 'plupload_default_params', $params );\n\t$params['_wpnonce'] = wp_create_nonce( 'media-form' );\n\t$defaults['multipart_params'] = $params;\n\n\t$settings = array(\n\t\t'defaults' => $defaults,\n\t\t'browser'  => array(\n\t\t\t'mobile'    => wp_is_mobile(),\n\t\t\t'supported' => _device_can_upload(),\n\t\t),\n\t\t'limitExceeded' => is_multisite() && ! is_upload_space_available()\n\t);\n\n\t$script = 'var _wpPluploadSettings = ' . wp_json_encode( $settings ) . ';';\n\n\tif ( $data )\n\t\t$script = \"$data\\n$script\";\n\n\t$wp_scripts->add_data( 'wp-plupload', 'data', $script );\n}\n\n/**\n * Prepares an attachment post object for JS, where it is expected\n * to be JSON-encoded and fit into an Attachment model.\n *\n * @since 3.5.0\n *\n * @param mixed $attachment Attachment ID or object.\n * @return array|void Array of attachment details.\n */\nfunction wp_prepare_attachment_for_js( $attachment ) {\n\tif ( ! $attachment = get_post( $attachment ) )\n\t\treturn;\n\n\tif ( 'attachment' != $attachment->post_type )\n\t\treturn;\n\n\t$meta = wp_get_attachment_metadata( $attachment->ID );\n\tif ( false !== strpos( $attachment->post_mime_type, '/' ) )\n\t\tlist( $type, $subtype ) = explode( '/', $attachment->post_mime_type );\n\telse\n\t\tlist( $type, $subtype ) = array( $attachment->post_mime_type, '' );\n\n\t$attachment_url = wp_get_attachment_url( $attachment->ID );\n\n\t$response = array(\n\t\t'id'          => $attachment->ID,\n\t\t'title'       => $attachment->post_title,\n\t\t'filename'    => wp_basename( get_attached_file( $attachment->ID ) ),\n\t\t'url'         => $attachment_url,\n\t\t'link'        => get_attachment_link( $attachment->ID ),\n\t\t'alt'         => get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ),\n\t\t'author'      => $attachment->post_author,\n\t\t'description' => $attachment->post_content,\n\t\t'caption'     => $attachment->post_excerpt,\n\t\t'name'        => $attachment->post_name,\n\t\t'status'      => $attachment->post_status,\n\t\t'uploadedTo'  => $attachment->post_parent,\n\t\t'date'        => strtotime( $attachment->post_date_gmt ) * 1000,\n\t\t'modified'    => strtotime( $attachment->post_modified_gmt ) * 1000,\n\t\t'menuOrder'   => $attachment->menu_order,\n\t\t'mime'        => $attachment->post_mime_type,\n\t\t'type'        => $type,\n\t\t'subtype'     => $subtype,\n\t\t'icon'        => wp_mime_type_icon( $attachment->ID ),\n\t\t'dateFormatted' => mysql2date( get_option('date_format'), $attachment->post_date ),\n\t\t'nonces'      => array(\n\t\t\t'update' => false,\n\t\t\t'delete' => false,\n\t\t\t'edit'   => false\n\t\t),\n\t\t'editLink'   => false,\n\t\t'meta'       => false,\n\t);\n\n\t$author = new WP_User( $attachment->post_author );\n\t$response['authorName'] = $author->display_name;\n\n\tif ( $attachment->post_parent ) {\n\t\t$post_parent = get_post( $attachment->post_parent );\n\t} else {\n\t\t$post_parent = false;\n\t}\n\n\tif ( $post_parent ) {\n\t\t$parent_type = get_post_type_object( $post_parent->post_type );\n\t\tif ( $parent_type && $parent_type->show_ui && current_user_can( 'edit_post', $attachment->post_parent ) ) {\n\t\t\t$response['uploadedToLink'] = get_edit_post_link( $attachment->post_parent, 'raw' );\n\t\t}\n\t\t$response['uploadedToTitle'] = $post_parent->post_title ? $post_parent->post_title : __( '(no title)' );\n\t}\n\n\t$attached_file = get_attached_file( $attachment->ID );\n\n\tif ( isset( $meta['filesize'] ) ) {\n\t\t$bytes = $meta['filesize'];\n\t} elseif ( file_exists( $attached_file ) ) {\n\t\t$bytes = filesize( $attached_file );\n\t} else {\n\t\t$bytes = '';\n\t}\n\n\tif ( $bytes ) {\n\t\t$response['filesizeInBytes'] = $bytes;\n\t\t$response['filesizeHumanReadable'] = size_format( $bytes );\n\t}\n\n\tif ( current_user_can( 'edit_post', $attachment->ID ) ) {\n\t\t$response['nonces']['update'] = wp_create_nonce( 'update-post_' . $attachment->ID );\n\t\t$response['nonces']['edit'] = wp_create_nonce( 'image_editor-' . $attachment->ID );\n\t\t$response['editLink'] = get_edit_post_link( $attachment->ID, 'raw' );\n\t}\n\n\tif ( current_user_can( 'delete_post', $attachment->ID ) )\n\t\t$response['nonces']['delete'] = wp_create_nonce( 'delete-post_' . $attachment->ID );\n\n\tif ( $meta && 'image' === $type ) {\n\t\t$sizes = array();\n\n\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\t$possible_sizes = apply_filters( 'image_size_names_choose', array(\n\t\t\t'thumbnail' => __('Thumbnail'),\n\t\t\t'medium'    => __('Medium'),\n\t\t\t'large'     => __('Large'),\n\t\t\t'full'      => __('Full Size'),\n\t\t) );\n\t\tunset( $possible_sizes['full'] );\n\n\t\t// Loop through all potential sizes that may be chosen. Try to do this with some efficiency.\n\t\t// First: run the image_downsize filter. If it returns something, we can use its data.\n\t\t// If the filter does not return something, then image_downsize() is just an expensive\n\t\t// way to check the image metadata, which we do second.\n\t\tforeach ( $possible_sizes as $size => $label ) {\n\n\t\t\t/** This filter is documented in wp-includes/media.php */\n\t\t\tif ( $downsize = apply_filters( 'image_downsize', false, $attachment->ID, $size ) ) {\n\t\t\t\tif ( ! $downsize[3] )\n\t\t\t\t\tcontinue;\n\t\t\t\t$sizes[ $size ] = array(\n\t\t\t\t\t'height'      => $downsize[2],\n\t\t\t\t\t'width'       => $downsize[1],\n\t\t\t\t\t'url'         => $downsize[0],\n\t\t\t\t\t'orientation' => $downsize[2] > $downsize[1] ? 'portrait' : 'landscape',\n\t\t\t\t);\n\t\t\t} elseif ( isset( $meta['sizes'][ $size ] ) ) {\n\t\t\t\tif ( ! isset( $base_url ) )\n\t\t\t\t\t$base_url = str_replace( wp_basename( $attachment_url ), '', $attachment_url );\n\n\t\t\t\t// Nothing from the filter, so consult image metadata if we have it.\n\t\t\t\t$size_meta = $meta['sizes'][ $size ];\n\n\t\t\t\t// We have the actual image size, but might need to further constrain it if content_width is narrower.\n\t\t\t\t// Thumbnail, medium, and full sizes are also checked against the site's height/width options.\n\t\t\t\tlist( $width, $height ) = image_constrain_size_for_editor( $size_meta['width'], $size_meta['height'], $size, 'edit' );\n\n\t\t\t\t$sizes[ $size ] = array(\n\t\t\t\t\t'height'      => $height,\n\t\t\t\t\t'width'       => $width,\n\t\t\t\t\t'url'         => $base_url . $size_meta['file'],\n\t\t\t\t\t'orientation' => $height > $width ? 'portrait' : 'landscape',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t$sizes['full'] = array( 'url' => $attachment_url );\n\n\t\tif ( isset( $meta['height'], $meta['width'] ) ) {\n\t\t\t$sizes['full']['height'] = $meta['height'];\n\t\t\t$sizes['full']['width'] = $meta['width'];\n\t\t\t$sizes['full']['orientation'] = $meta['height'] > $meta['width'] ? 'portrait' : 'landscape';\n\t\t}\n\n\t\t$response = array_merge( $response, array( 'sizes' => $sizes ), $sizes['full'] );\n\t} elseif ( $meta && 'video' === $type ) {\n\t\tif ( isset( $meta['width'] ) )\n\t\t\t$response['width'] = (int) $meta['width'];\n\t\tif ( isset( $meta['height'] ) )\n\t\t\t$response['height'] = (int) $meta['height'];\n\t}\n\n\tif ( $meta && ( 'audio' === $type || 'video' === $type ) ) {\n\t\tif ( isset( $meta['length_formatted'] ) )\n\t\t\t$response['fileLength'] = $meta['length_formatted'];\n\n\t\t$response['meta'] = array();\n\t\tforeach ( wp_get_attachment_id3_keys( $attachment, 'js' ) as $key => $label ) {\n\t\t\t$response['meta'][ $key ] = false;\n\n\t\t\tif ( ! empty( $meta[ $key ] ) ) {\n\t\t\t\t$response['meta'][ $key ] = $meta[ $key ];\n\t\t\t}\n\t\t}\n\n\t\t$id = get_post_thumbnail_id( $attachment->ID );\n\t\tif ( ! empty( $id ) ) {\n\t\t\tlist( $src, $width, $height ) = wp_get_attachment_image_src( $id, 'full' );\n\t\t\t$response['image'] = compact( 'src', 'width', 'height' );\n\t\t\tlist( $src, $width, $height ) = wp_get_attachment_image_src( $id, 'thumbnail' );\n\t\t\t$response['thumb'] = compact( 'src', 'width', 'height' );\n\t\t} else {\n\t\t\t$src = wp_mime_type_icon( $attachment->ID );\n\t\t\t$width = 48;\n\t\t\t$height = 64;\n\t\t\t$response['image'] = compact( 'src', 'width', 'height' );\n\t\t\t$response['thumb'] = compact( 'src', 'width', 'height' );\n\t\t}\n\t}\n\n\tif ( function_exists('get_compat_media_markup') )\n\t\t$response['compat'] = get_compat_media_markup( $attachment->ID, array( 'in_modal' => true ) );\n\n\t/**\n\t * Filter the attachment data prepared for JavaScript.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array      $response   Array of prepared attachment data.\n\t * @param int|object $attachment Attachment ID or object.\n\t * @param array      $meta       Array of attachment meta data.\n\t */\n\treturn apply_filters( 'wp_prepare_attachment_for_js', $response, $attachment, $meta );\n}\n\n/**\n * Enqueues all scripts, styles, settings, and templates necessary to use\n * all media JS APIs.\n *\n * @since 3.5.0\n *\n * @global int       $content_width\n * @global wpdb      $wpdb\n * @global WP_Locale $wp_locale\n *\n * @param array $args {\n *     Arguments for enqueuing media scripts.\n *\n *     @type int|WP_Post A post object or ID.\n * }\n */\nfunction wp_enqueue_media( $args = array() ) {\n\t// Enqueue me just once per page, please.\n\tif ( did_action( 'wp_enqueue_media' ) )\n\t\treturn;\n\n\tglobal $content_width, $wpdb, $wp_locale;\n\n\t$defaults = array(\n\t\t'post' => null,\n\t);\n\t$args = wp_parse_args( $args, $defaults );\n\n\t// We're going to pass the old thickbox media tabs to `media_upload_tabs`\n\t// to ensure plugins will work. We will then unset those tabs.\n\t$tabs = array(\n\t\t// handler action suffix => tab label\n\t\t'type'     => '',\n\t\t'type_url' => '',\n\t\t'gallery'  => '',\n\t\t'library'  => '',\n\t);\n\n\t/** This filter is documented in wp-admin/includes/media.php */\n\t$tabs = apply_filters( 'media_upload_tabs', $tabs );\n\tunset( $tabs['type'], $tabs['type_url'], $tabs['gallery'], $tabs['library'] );\n\n\t$props = array(\n\t\t'link'  => get_option( 'image_default_link_type' ), // db default is 'file'\n\t\t'align' => get_option( 'image_default_align' ), // empty default\n\t\t'size'  => get_option( 'image_default_size' ),  // empty default\n\t);\n\n\t$exts = array_merge( wp_get_audio_extensions(), wp_get_video_extensions() );\n\t$mimes = get_allowed_mime_types();\n\t$ext_mimes = array();\n\tforeach ( $exts as $ext ) {\n\t\tforeach ( $mimes as $ext_preg => $mime_match ) {\n\t\t\tif ( preg_match( '#' . $ext . '#i', $ext_preg ) ) {\n\t\t\t\t$ext_mimes[ $ext ] = $mime_match;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t$has_audio = $wpdb->get_var( \"\n\t\tSELECT ID\n\t\tFROM $wpdb->posts\n\t\tWHERE post_type = 'attachment'\n\t\tAND post_mime_type LIKE 'audio%'\n\t\tLIMIT 1\n\t\" );\n\t$has_video = $wpdb->get_var( \"\n\t\tSELECT ID\n\t\tFROM $wpdb->posts\n\t\tWHERE post_type = 'attachment'\n\t\tAND post_mime_type LIKE 'video%'\n\t\tLIMIT 1\n\t\" );\n\t$months = $wpdb->get_results( $wpdb->prepare( \"\n\t\tSELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month\n\t\tFROM $wpdb->posts\n\t\tWHERE post_type = %s\n\t\tORDER BY post_date DESC\n\t\", 'attachment' ) );\n\tforeach ( $months as $month_year ) {\n\t\t$month_year->text = sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month_year->month ), $month_year->year );\n\t}\n\n\t$settings = array(\n\t\t'tabs'      => $tabs,\n\t\t'tabUrl'    => add_query_arg( array( 'chromeless' => true ), admin_url('media-upload.php') ),\n\t\t'mimeTypes' => wp_list_pluck( get_post_mime_types(), 0 ),\n\t\t/** This filter is documented in wp-admin/includes/media.php */\n\t\t'captions'  => ! apply_filters( 'disable_captions', '' ),\n\t\t'nonce'     => array(\n\t\t\t'sendToEditor' => wp_create_nonce( 'media-send-to-editor' ),\n\t\t),\n\t\t'post'    => array(\n\t\t\t'id' => 0,\n\t\t),\n\t\t'defaultProps' => $props,\n\t\t'attachmentCounts' => array(\n\t\t\t'audio' => ( $has_audio ) ? 1 : 0,\n\t\t\t'video' => ( $has_video ) ? 1 : 0\n\t\t),\n\t\t'embedExts'    => $exts,\n\t\t'embedMimes'   => $ext_mimes,\n\t\t'contentWidth' => $content_width,\n\t\t'months'       => $months,\n\t\t'mediaTrash'   => MEDIA_TRASH ? 1 : 0\n\t);\n\n\t$post = null;\n\tif ( isset( $args['post'] ) ) {\n\t\t$post = get_post( $args['post'] );\n\t\t$settings['post'] = array(\n\t\t\t'id' => $post->ID,\n\t\t\t'nonce' => wp_create_nonce( 'update-post_' . $post->ID ),\n\t\t);\n\n\t\t$thumbnail_support = current_theme_supports( 'post-thumbnails', $post->post_type ) && post_type_supports( $post->post_type, 'thumbnail' );\n\t\tif ( ! $thumbnail_support && 'attachment' === $post->post_type && $post->post_mime_type ) {\n\t\t\tif ( wp_attachment_is( 'audio', $post ) ) {\n\t\t\t\t$thumbnail_support = post_type_supports( 'attachment:audio', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:audio' );\n\t\t\t} elseif ( wp_attachment_is( 'video', $post ) ) {\n\t\t\t\t$thumbnail_support = post_type_supports( 'attachment:video', 'thumbnail' ) || current_theme_supports( 'post-thumbnails', 'attachment:video' );\n\t\t\t}\n\t\t}\n\n\t\tif ( $thumbnail_support ) {\n\t\t\t$featured_image_id = get_post_meta( $post->ID, '_thumbnail_id', true );\n\t\t\t$settings['post']['featuredImageId'] = $featured_image_id ? $featured_image_id : -1;\n\t\t}\n\t}\n\n\tif ( $post ) {\n\t\t$post_type_object = get_post_type_object( $post->post_type );\n\t} else {\n\t\t$post_type_object = get_post_type_object( 'post' );\n\t}\n\n\t$strings = array(\n\t\t// Generic\n\t\t'url'         => __( 'URL' ),\n\t\t'addMedia'    => __( 'Add Media' ),\n\t\t'search'      => __( 'Search' ),\n\t\t'select'      => __( 'Select' ),\n\t\t'cancel'      => __( 'Cancel' ),\n\t\t'update'      => __( 'Update' ),\n\t\t'replace'     => __( 'Replace' ),\n\t\t'remove'      => __( 'Remove' ),\n\t\t'back'        => __( 'Back' ),\n\t\t/* translators: This is a would-be plural string used in the media manager.\n\t\t   If there is not a word you can use in your language to avoid issues with the\n\t\t   lack of plural support here, turn it into \"selected: %d\" then translate it.\n\t\t */\n\t\t'selected'    => __( '%d selected' ),\n\t\t'dragInfo'    => __( 'Drag and drop to reorder media files.' ),\n\n\t\t// Upload\n\t\t'uploadFilesTitle'  => __( 'Upload Files' ),\n\t\t'uploadImagesTitle' => __( 'Upload Images' ),\n\n\t\t// Library\n\t\t'mediaLibraryTitle'      => __( 'Media Library' ),\n\t\t'insertMediaTitle'       => __( 'Insert Media' ),\n\t\t'createNewGallery'       => __( 'Create a new gallery' ),\n\t\t'createNewPlaylist'      => __( 'Create a new playlist' ),\n\t\t'createNewVideoPlaylist' => __( 'Create a new video playlist' ),\n\t\t'returnToLibrary'        => __( '&#8592; Return to library' ),\n\t\t'allMediaItems'          => __( 'All media items' ),\n\t\t'allDates'               => __( 'All dates' ),\n\t\t'noItemsFound'           => __( 'No items found.' ),\n\t\t'insertIntoPost'         => $post_type_object->labels->insert_into_item,\n\t\t'unattached'             => __( 'Unattached' ),\n\t\t'trash'                  => _x( 'Trash', 'noun' ),\n\t\t'uploadedToThisPost'     => $post_type_object->labels->uploaded_to_this_item,\n\t\t'warnDelete'             => __( \"You are about to permanently delete this item.\\n  'Cancel' to stop, 'OK' to delete.\" ),\n\t\t'warnBulkDelete'         => __( \"You are about to permanently delete these items.\\n  'Cancel' to stop, 'OK' to delete.\" ),\n\t\t'warnBulkTrash'          => __( \"You are about to trash these items.\\n  'Cancel' to stop, 'OK' to delete.\" ),\n\t\t'bulkSelect'             => __( 'Bulk Select' ),\n\t\t'cancelSelection'        => __( 'Cancel Selection' ),\n\t\t'trashSelected'          => __( 'Trash Selected' ),\n\t\t'untrashSelected'        => __( 'Untrash Selected' ),\n\t\t'deleteSelected'         => __( 'Delete Selected' ),\n\t\t'deletePermanently'      => __( 'Delete Permanently' ),\n\t\t'apply'                  => __( 'Apply' ),\n\t\t'filterByDate'           => __( 'Filter by date' ),\n\t\t'filterByType'           => __( 'Filter by type' ),\n\t\t'searchMediaLabel'       => __( 'Search Media' ),\n\t\t'noMedia'                => __( 'No media attachments found.' ),\n\n\t\t// Library Details\n\t\t'attachmentDetails'  => __( 'Attachment Details' ),\n\n\t\t// From URL\n\t\t'insertFromUrlTitle' => __( 'Insert from URL' ),\n\n\t\t// Featured Images\n\t\t'setFeaturedImageTitle' => $post_type_object->labels->featured_image,\n\t\t'setFeaturedImage'      => $post_type_object->labels->set_featured_image,\n\n\t\t// Gallery\n\t\t'createGalleryTitle' => __( 'Create Gallery' ),\n\t\t'editGalleryTitle'   => __( 'Edit Gallery' ),\n\t\t'cancelGalleryTitle' => __( '&#8592; Cancel Gallery' ),\n\t\t'insertGallery'      => __( 'Insert gallery' ),\n\t\t'updateGallery'      => __( 'Update gallery' ),\n\t\t'addToGallery'       => __( 'Add to gallery' ),\n\t\t'addToGalleryTitle'  => __( 'Add to Gallery' ),\n\t\t'reverseOrder'       => __( 'Reverse order' ),\n\n\t\t// Edit Image\n\t\t'imageDetailsTitle'     => __( 'Image Details' ),\n\t\t'imageReplaceTitle'     => __( 'Replace Image' ),\n\t\t'imageDetailsCancel'    => __( 'Cancel Edit' ),\n\t\t'editImage'             => __( 'Edit Image' ),\n\n\t\t// Crop Image\n\t\t'chooseImage' => __( 'Choose Image' ),\n\t\t'selectAndCrop' => __( 'Select and Crop' ),\n\t\t'skipCropping' => __( 'Skip Cropping' ),\n\t\t'cropImage' => __( 'Crop Image' ),\n\t\t'cropYourImage' => __( 'Crop your image' ),\n\t\t'cropping' => __( 'Cropping&hellip;' ),\n\t\t'suggestedDimensions' => __( 'Suggested image dimensions:' ),\n\t\t'cropError' => __( 'There has been an error cropping your image.' ),\n\n\t\t// Edit Audio\n\t\t'audioDetailsTitle'     => __( 'Audio Details' ),\n\t\t'audioReplaceTitle'     => __( 'Replace Audio' ),\n\t\t'audioAddSourceTitle'   => __( 'Add Audio Source' ),\n\t\t'audioDetailsCancel'    => __( 'Cancel Edit' ),\n\n\t\t// Edit Video\n\t\t'videoDetailsTitle'     => __( 'Video Details' ),\n\t\t'videoReplaceTitle'     => __( 'Replace Video' ),\n\t\t'videoAddSourceTitle'   => __( 'Add Video Source' ),\n\t\t'videoDetailsCancel'    => __( 'Cancel Edit' ),\n\t\t'videoSelectPosterImageTitle' => __( 'Select Poster Image' ),\n\t\t'videoAddTrackTitle'\t=> __( 'Add Subtitles' ),\n\n \t\t// Playlist\n \t\t'playlistDragInfo'    => __( 'Drag and drop to reorder tracks.' ),\n \t\t'createPlaylistTitle' => __( 'Create Audio Playlist' ),\n \t\t'editPlaylistTitle'   => __( 'Edit Audio Playlist' ),\n \t\t'cancelPlaylistTitle' => __( '&#8592; Cancel Audio Playlist' ),\n \t\t'insertPlaylist'      => __( 'Insert audio playlist' ),\n \t\t'updatePlaylist'      => __( 'Update audio playlist' ),\n \t\t'addToPlaylist'       => __( 'Add to audio playlist' ),\n \t\t'addToPlaylistTitle'  => __( 'Add to Audio Playlist' ),\n\n \t\t// Video Playlist\n \t\t'videoPlaylistDragInfo'    => __( 'Drag and drop to reorder videos.' ),\n \t\t'createVideoPlaylistTitle' => __( 'Create Video Playlist' ),\n \t\t'editVideoPlaylistTitle'   => __( 'Edit Video Playlist' ),\n \t\t'cancelVideoPlaylistTitle' => __( '&#8592; Cancel Video Playlist' ),\n \t\t'insertVideoPlaylist'      => __( 'Insert video playlist' ),\n \t\t'updateVideoPlaylist'      => __( 'Update video playlist' ),\n \t\t'addToVideoPlaylist'       => __( 'Add to video playlist' ),\n \t\t'addToVideoPlaylistTitle'  => __( 'Add to Video Playlist' ),\n\t);\n\n\t/**\n\t * Filter the media view settings.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array   $settings List of media view settings.\n\t * @param WP_Post $post     Post object.\n\t */\n\t$settings = apply_filters( 'media_view_settings', $settings, $post );\n\n\t/**\n\t * Filter the media view strings.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array   $strings List of media view strings.\n\t * @param WP_Post $post    Post object.\n\t */\n\t$strings = apply_filters( 'media_view_strings', $strings,  $post );\n\n\t$strings['settings'] = $settings;\n\n\t// Ensure we enqueue media-editor first, that way media-views is\n\t// registered internally before we try to localize it. see #24724.\n\twp_enqueue_script( 'media-editor' );\n\twp_localize_script( 'media-views', '_wpMediaViewsL10n', $strings );\n\n\twp_enqueue_script( 'media-audiovideo' );\n\twp_enqueue_style( 'media-views' );\n\tif ( is_admin() ) {\n\t\twp_enqueue_script( 'mce-view' );\n\t\twp_enqueue_script( 'image-edit' );\n\t}\n\twp_enqueue_style( 'imgareaselect' );\n\twp_plupload_default_settings();\n\n\trequire_once ABSPATH . WPINC . '/media-template.php';\n\tadd_action( 'admin_footer', 'wp_print_media_templates' );\n\tadd_action( 'wp_footer', 'wp_print_media_templates' );\n\tadd_action( 'customize_controls_print_footer_scripts', 'wp_print_media_templates' );\n\n\t/**\n\t * Fires at the conclusion of wp_enqueue_media().\n\t *\n\t * @since 3.5.0\n\t */\n\tdo_action( 'wp_enqueue_media' );\n}\n\n/**\n * Retrieves media attached to the passed post.\n *\n * @since 3.6.0\n *\n * @param string      $type Mime type.\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.\n * @return array Found attachments.\n */\nfunction get_attached_media( $type, $post = 0 ) {\n\tif ( ! $post = get_post( $post ) )\n\t\treturn array();\n\n\t$args = array(\n\t\t'post_parent' => $post->ID,\n\t\t'post_type' => 'attachment',\n\t\t'post_mime_type' => $type,\n\t\t'posts_per_page' => -1,\n\t\t'orderby' => 'menu_order',\n\t\t'order' => 'ASC',\n\t);\n\n\t/**\n\t * Filter arguments used to retrieve media attached to the given post.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array  $args Post query arguments.\n\t * @param string $type Mime type of the desired media.\n\t * @param mixed  $post Post ID or object.\n\t */\n\t$args = apply_filters( 'get_attached_media_args', $args, $type, $post );\n\n\t$children = get_children( $args );\n\n\t/**\n\t * Filter the list of media attached to the given post.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array  $children Associative array of media attached to the given post.\n\t * @param string $type     Mime type of the media desired.\n\t * @param mixed  $post     Post ID or object.\n\t */\n\treturn (array) apply_filters( 'get_attached_media', $children, $type, $post );\n}\n\n/**\n * Check the content blob for an audio, video, object, embed, or iframe tags.\n *\n * @since 3.6.0\n *\n * @param string $content A string which might contain media data.\n * @param array  $types   An array of media types: 'audio', 'video', 'object', 'embed', or 'iframe'.\n * @return array A list of found HTML media embeds.\n */\nfunction get_media_embedded_in_content( $content, $types = null ) {\n\t$html = array();\n\n\t/**\n\t * Filter the embedded media types that are allowed to be returned from the content blob.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param array $allowed_media_types An array of allowed media types. Default media types are\n\t *                                   'audio', 'video', 'object', 'embed', and 'iframe'.\n\t */\n\t$allowed_media_types = apply_filters( 'media_embedded_in_content_allowed_types', array( 'audio', 'video', 'object', 'embed', 'iframe' ) );\n\n\tif ( ! empty( $types ) ) {\n\t\tif ( ! is_array( $types ) ) {\n\t\t\t$types = array( $types );\n\t\t}\n\n\t\t$allowed_media_types = array_intersect( $allowed_media_types, $types );\n\t}\n\n\t$tags = implode( '|', $allowed_media_types );\n\n\tif ( preg_match_all( '#<(?P<tag>' . $tags . ')[^<]*?(?:>[\\s\\S]*?<\\/(?P=tag)>|\\s*\\/>)#', $content, $matches ) ) {\n\t\tforeach ( $matches[0] as $match ) {\n\t\t\t$html[] = $match;\n\t\t}\n\t}\n\n\treturn $html;\n}\n\n/**\n * Retrieves galleries from the passed post's content.\n *\n * @since 3.6.0\n *\n * @param int|WP_Post $post Post ID or object.\n * @param bool        $html Optional. Whether to return HTML or data in the array. Default true.\n * @return array A list of arrays, each containing gallery data and srcs parsed\n *               from the expanded shortcode.\n */\nfunction get_post_galleries( $post, $html = true ) {\n\tif ( ! $post = get_post( $post ) )\n\t\treturn array();\n\n\tif ( ! has_shortcode( $post->post_content, 'gallery' ) )\n\t\treturn array();\n\n\t$galleries = array();\n\tif ( preg_match_all( '/' . get_shortcode_regex() . '/s', $post->post_content, $matches, PREG_SET_ORDER ) ) {\n\t\tforeach ( $matches as $shortcode ) {\n\t\t\tif ( 'gallery' === $shortcode[2] ) {\n\t\t\t\t$srcs = array();\n\n\t\t\t\t$gallery = do_shortcode_tag( $shortcode );\n\t\t\t\tif ( $html ) {\n\t\t\t\t\t$galleries[] = $gallery;\n\t\t\t\t} else {\n\t\t\t\t\tpreg_match_all( '#src=([\\'\"])(.+?)\\1#is', $gallery, $src, PREG_SET_ORDER );\n\t\t\t\t\tif ( ! empty( $src ) ) {\n\t\t\t\t\t\tforeach ( $src as $s )\n\t\t\t\t\t\t\t$srcs[] = $s[2];\n\t\t\t\t\t}\n\n\t\t\t\t\t$data = shortcode_parse_atts( $shortcode[3] );\n\t\t\t\t\t$data['src'] = array_values( array_unique( $srcs ) );\n\t\t\t\t\t$galleries[] = $data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter the list of all found galleries in the given post.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array   $galleries Associative array of all found post galleries.\n\t * @param WP_Post $post      Post object.\n\t */\n\treturn apply_filters( 'get_post_galleries', $galleries, $post );\n}\n\n/**\n * Check a specified post's content for gallery and, if present, return the first\n *\n * @since 3.6.0\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.\n * @param bool        $html Optional. Whether to return HTML or data. Default is true.\n * @return string|array Gallery data and srcs parsed from the expanded shortcode.\n */\nfunction get_post_gallery( $post = 0, $html = true ) {\n\t$galleries = get_post_galleries( $post, $html );\n\t$gallery = reset( $galleries );\n\n\t/**\n\t * Filter the first-found post gallery.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param array       $gallery   The first-found post gallery.\n\t * @param int|WP_Post $post      Post ID or object.\n\t * @param array       $galleries Associative array of all found post galleries.\n\t */\n\treturn apply_filters( 'get_post_gallery', $gallery, $post, $galleries );\n}\n\n/**\n * Retrieve the image srcs from galleries from a post's content, if present\n *\n * @since 3.6.0\n *\n * @see get_post_galleries()\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.\n * @return array A list of lists, each containing image srcs parsed.\n *               from an expanded shortcode\n */\nfunction get_post_galleries_images( $post = 0 ) {\n\t$galleries = get_post_galleries( $post, false );\n\treturn wp_list_pluck( $galleries, 'src' );\n}\n\n/**\n * Checks a post's content for galleries and return the image srcs for the first found gallery\n *\n * @since 3.6.0\n *\n * @see get_post_gallery()\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.\n * @return array A list of a gallery's image srcs in order.\n */\nfunction get_post_gallery_images( $post = 0 ) {\n\t$gallery = get_post_gallery( $post, false );\n\treturn empty( $gallery['src'] ) ? array() : $gallery['src'];\n}\n\n/**\n * Maybe attempts to generate attachment metadata, if missing.\n *\n * @since 3.9.0\n *\n * @param WP_Post $attachment Attachment object.\n */\nfunction wp_maybe_generate_attachment_metadata( $attachment ) {\n\tif ( empty( $attachment ) || ( empty( $attachment->ID ) || ! $attachment_id = (int) $attachment->ID ) ) {\n\t\treturn;\n\t}\n\n\t$file = get_attached_file( $attachment_id );\n\t$meta = wp_get_attachment_metadata( $attachment_id );\n\tif ( empty( $meta ) && file_exists( $file ) ) {\n\t\t$_meta = get_post_meta( $attachment_id );\n\t\t$regeneration_lock = 'wp_generating_att_' . $attachment_id;\n\t\tif ( ! array_key_exists( '_wp_attachment_metadata', $_meta ) && ! get_transient( $regeneration_lock ) ) {\n\t\t\tset_transient( $regeneration_lock, $file );\n\t\t\twp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) );\n\t\t\tdelete_transient( $regeneration_lock );\n\t\t}\n\t}\n}\n\n/**\n * Tries to convert an attachment URL into a post ID.\n *\n * @since 4.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $url The URL to resolve.\n * @return int The found post ID, or 0 on failure.\n */\nfunction attachment_url_to_postid( $url ) {\n\tglobal $wpdb;\n\n\t$dir = wp_upload_dir();\n\t$path = $url;\n\n\t$site_url = parse_url( $dir['url'] );\n\t$image_path = parse_url( $path );\n\n\t//force the protocols to match if needed\n\tif ( isset( $image_path['scheme'] ) && ( $image_path['scheme'] !== $site_url['scheme'] ) ) {\n\t\t$path = str_replace( $image_path['scheme'], $site_url['scheme'], $path );\n\t}\n\n\tif ( 0 === strpos( $path, $dir['baseurl'] . '/' ) ) {\n\t\t$path = substr( $path, strlen( $dir['baseurl'] . '/' ) );\n\t}\n\n\t$sql = $wpdb->prepare(\n\t\t\"SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attached_file' AND meta_value = %s\",\n\t\t$path\n\t);\n\t$post_id = $wpdb->get_var( $sql );\n\n\t/**\n\t * Filter an attachment id found by URL.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param int|null $post_id The post_id (if any) found by the function.\n\t * @param string   $url     The URL being looked up.\n\t */\n\treturn (int) apply_filters( 'attachment_url_to_postid', $post_id, $url );\n}\n\n/**\n * Returns the URLs for CSS files used in an iframe-sandbox'd TinyMCE media view.\n *\n * @since 4.0.0\n *\n * @global string $wp_version\n *\n * @return array The relevant CSS file URLs.\n */\nfunction wpview_media_sandbox_styles() {\n \t$version = 'ver=' . $GLOBALS['wp_version'];\n \t$mediaelement = includes_url( \"js/mediaelement/mediaelementplayer.min.css?$version\" );\n \t$wpmediaelement = includes_url( \"js/mediaelement/wp-mediaelement.css?$version\" );\n\n\treturn array( $mediaelement, $wpmediaelement );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/meta.php",
    "content": "<?php\n/**\n * Core Metadata API\n *\n * Functions for retrieving and manipulating metadata of various WordPress object types. Metadata\n * for an object is a represented by a simple key-value pair. Objects may contain multiple\n * metadata entries that share the same key and differ only in their value.\n *\n * @package WordPress\n * @subpackage Meta\n */\n\n/**\n * Add metadata for the specified object.\n *\n * @since 2.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $meta_type  Type of object metadata is for (e.g., comment, post, or user)\n * @param int    $object_id  ID of the object metadata is for\n * @param string $meta_key   Metadata key\n * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.\n * @param bool   $unique     Optional, default is false.\n *                           Whether the specified metadata key should be unique for the object.\n *                           If true, and the object already has a value for the specified metadata key,\n *                           no change will be made.\n * @return int|false The meta ID on success, false on failure.\n */\nfunction add_metadata($meta_type, $object_id, $meta_key, $meta_value, $unique = false) {\n\tglobal $wpdb;\n\n\tif ( ! $meta_type || ! $meta_key || ! is_numeric( $object_id ) ) {\n\t\treturn false;\n\t}\n\n\t$object_id = absint( $object_id );\n\tif ( ! $object_id ) {\n\t\treturn false;\n\t}\n\n\t$table = _get_meta_table( $meta_type );\n\tif ( ! $table ) {\n\t\treturn false;\n\t}\n\n\t$column = sanitize_key($meta_type . '_id');\n\n\t// expected_slashed ($meta_key)\n\t$meta_key = wp_unslash($meta_key);\n\t$meta_value = wp_unslash($meta_value);\n\t$meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );\n\n\t/**\n\t * Filter whether to add metadata of a specific type.\n\t *\n\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t * object type (comment, post, or user). Returning a non-null value\n\t * will effectively short-circuit the function.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param null|bool $check      Whether to allow adding metadata for the given type.\n\t * @param int       $object_id  Object ID.\n\t * @param string    $meta_key   Meta key.\n\t * @param mixed     $meta_value Meta value. Must be serializable if non-scalar.\n\t * @param bool      $unique     Whether the specified meta key should be unique\n\t *                              for the object. Optional. Default false.\n\t */\n\t$check = apply_filters( \"add_{$meta_type}_metadata\", null, $object_id, $meta_key, $meta_value, $unique );\n\tif ( null !== $check )\n\t\treturn $check;\n\n\tif ( $unique && $wpdb->get_var( $wpdb->prepare(\n\t\t\"SELECT COUNT(*) FROM $table WHERE meta_key = %s AND $column = %d\",\n\t\t$meta_key, $object_id ) ) )\n\t\treturn false;\n\n\t$_meta_value = $meta_value;\n\t$meta_value = maybe_serialize( $meta_value );\n\n\t/**\n\t * Fires immediately before meta of a specific type is added.\n\t *\n\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t * object type (comment, post, or user).\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param int    $object_id  Object ID.\n\t * @param string $meta_key   Meta key.\n\t * @param mixed  $meta_value Meta value.\n\t */\n\tdo_action( \"add_{$meta_type}_meta\", $object_id, $meta_key, $_meta_value );\n\n\t$result = $wpdb->insert( $table, array(\n\t\t$column => $object_id,\n\t\t'meta_key' => $meta_key,\n\t\t'meta_value' => $meta_value\n\t) );\n\n\tif ( ! $result )\n\t\treturn false;\n\n\t$mid = (int) $wpdb->insert_id;\n\n\twp_cache_delete($object_id, $meta_type . '_meta');\n\n\t/**\n\t * Fires immediately after meta of a specific type is added.\n\t *\n\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t * object type (comment, post, or user).\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int    $mid        The meta ID after successful update.\n\t * @param int    $object_id  Object ID.\n\t * @param string $meta_key   Meta key.\n\t * @param mixed  $meta_value Meta value.\n\t */\n\tdo_action( \"added_{$meta_type}_meta\", $mid, $object_id, $meta_key, $_meta_value );\n\n\treturn $mid;\n}\n\n/**\n * Update metadata for the specified object. If no value already exists for the specified object\n * ID and metadata key, the metadata will be added.\n *\n * @since 2.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $meta_type  Type of object metadata is for (e.g., comment, post, or user)\n * @param int    $object_id  ID of the object metadata is for\n * @param string $meta_key   Metadata key\n * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.\n * @param mixed  $prev_value Optional. If specified, only update existing metadata entries with\n * \t\t                     the specified value. Otherwise, update all entries.\n * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure.\n */\nfunction update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_value = '') {\n\tglobal $wpdb;\n\n\tif ( ! $meta_type || ! $meta_key || ! is_numeric( $object_id ) ) {\n\t\treturn false;\n\t}\n\n\t$object_id = absint( $object_id );\n\tif ( ! $object_id ) {\n\t\treturn false;\n\t}\n\n\t$table = _get_meta_table( $meta_type );\n\tif ( ! $table ) {\n\t\treturn false;\n\t}\n\n\t$column = sanitize_key($meta_type . '_id');\n\t$id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';\n\n\t// expected_slashed ($meta_key)\n\t$meta_key = wp_unslash($meta_key);\n\t$passed_value = $meta_value;\n\t$meta_value = wp_unslash($meta_value);\n\t$meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );\n\n\t/**\n\t * Filter whether to update metadata of a specific type.\n\t *\n\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t * object type (comment, post, or user). Returning a non-null value\n\t * will effectively short-circuit the function.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param null|bool $check      Whether to allow updating metadata for the given type.\n\t * @param int       $object_id  Object ID.\n\t * @param string    $meta_key   Meta key.\n\t * @param mixed     $meta_value Meta value. Must be serializable if non-scalar.\n\t * @param mixed     $prev_value Optional. If specified, only update existing\n\t *                              metadata entries with the specified value.\n\t *                              Otherwise, update all entries.\n\t */\n\t$check = apply_filters( \"update_{$meta_type}_metadata\", null, $object_id, $meta_key, $meta_value, $prev_value );\n\tif ( null !== $check )\n\t\treturn (bool) $check;\n\n\t// Compare existing value to new value if no prev value given and the key exists only once.\n\tif ( empty($prev_value) ) {\n\t\t$old_value = get_metadata($meta_type, $object_id, $meta_key);\n\t\tif ( count($old_value) == 1 ) {\n\t\t\tif ( $old_value[0] === $meta_value )\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\t$meta_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d\", $meta_key, $object_id ) );\n\tif ( empty( $meta_ids ) ) {\n\t\treturn add_metadata($meta_type, $object_id, $meta_key, $passed_value);\n\t}\n\n\t$_meta_value = $meta_value;\n\t$meta_value = maybe_serialize( $meta_value );\n\n\t$data  = compact( 'meta_value' );\n\t$where = array( $column => $object_id, 'meta_key' => $meta_key );\n\n\tif ( !empty( $prev_value ) ) {\n\t\t$prev_value = maybe_serialize($prev_value);\n\t\t$where['meta_value'] = $prev_value;\n\t}\n\n\tforeach ( $meta_ids as $meta_id ) {\n\t\t/**\n\t\t * Fires immediately before updating metadata of a specific type.\n\t\t *\n\t\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t\t * object type (comment, post, or user).\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int    $meta_id    ID of the metadata entry to update.\n\t\t * @param int    $object_id  Object ID.\n\t\t * @param string $meta_key   Meta key.\n\t\t * @param mixed  $meta_value Meta value.\n\t\t */\n\t\tdo_action( \"update_{$meta_type}_meta\", $meta_id, $object_id, $meta_key, $_meta_value );\n\t}\n\n\tif ( 'post' == $meta_type ) {\n\t\tforeach ( $meta_ids as $meta_id ) {\n\t\t\t/**\n\t\t\t * Fires immediately before updating a post's metadata.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param int    $meta_id    ID of metadata entry to update.\n\t\t\t * @param int    $object_id  Object ID.\n\t\t\t * @param string $meta_key   Meta key.\n\t\t\t * @param mixed  $meta_value Meta value.\n\t\t\t */\n\t\t\tdo_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value );\n\t\t}\n\t}\n\n\t$result = $wpdb->update( $table, $data, $where );\n\tif ( ! $result )\n\t\treturn false;\n\n\twp_cache_delete($object_id, $meta_type . '_meta');\n\n\tforeach ( $meta_ids as $meta_id ) {\n\t\t/**\n\t\t * Fires immediately after updating metadata of a specific type.\n\t\t *\n\t\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t\t * object type (comment, post, or user).\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int    $meta_id    ID of updated metadata entry.\n\t\t * @param int    $object_id  Object ID.\n\t\t * @param string $meta_key   Meta key.\n\t\t * @param mixed  $meta_value Meta value.\n\t\t */\n\t\tdo_action( \"updated_{$meta_type}_meta\", $meta_id, $object_id, $meta_key, $_meta_value );\n\t}\n\n\tif ( 'post' == $meta_type ) {\n\t\tforeach ( $meta_ids as $meta_id ) {\n\t\t\t/**\n\t\t\t * Fires immediately after updating a post's metadata.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param int    $meta_id    ID of updated metadata entry.\n\t\t\t * @param int    $object_id  Object ID.\n\t\t\t * @param string $meta_key   Meta key.\n\t\t\t * @param mixed  $meta_value Meta value.\n\t\t\t */\n\t\t\tdo_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value );\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Delete metadata for the specified object.\n *\n * @since 2.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $meta_type  Type of object metadata is for (e.g., comment, post, or user)\n * @param int    $object_id  ID of the object metadata is for\n * @param string $meta_key   Metadata key\n * @param mixed  $meta_value Optional. Metadata value. Must be serializable if non-scalar. If specified, only delete\n *                           metadata entries with this value. Otherwise, delete all entries with the specified meta_key.\n *                           Pass `null, `false`, or an empty string to skip this check. (For backward compatibility,\n *                           it is not possible to pass an empty string to delete those entries with an empty string\n *                           for a value.)\n * @param bool   $delete_all Optional, default is false. If true, delete matching metadata entries for all objects,\n *                           ignoring the specified object_id. Otherwise, only delete matching metadata entries for\n *                           the specified object_id.\n * @return bool True on successful delete, false on failure.\n */\nfunction delete_metadata($meta_type, $object_id, $meta_key, $meta_value = '', $delete_all = false) {\n\tglobal $wpdb;\n\n\tif ( ! $meta_type || ! $meta_key || ! is_numeric( $object_id ) && ! $delete_all ) {\n\t\treturn false;\n\t}\n\n\t$object_id = absint( $object_id );\n\tif ( ! $object_id && ! $delete_all ) {\n\t\treturn false;\n\t}\n\n\t$table = _get_meta_table( $meta_type );\n\tif ( ! $table ) {\n\t\treturn false;\n\t}\n\n\t$type_column = sanitize_key($meta_type . '_id');\n\t$id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';\n\t// expected_slashed ($meta_key)\n\t$meta_key = wp_unslash($meta_key);\n\t$meta_value = wp_unslash($meta_value);\n\n\t/**\n\t * Filter whether to delete metadata of a specific type.\n\t *\n\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t * object type (comment, post, or user). Returning a non-null value\n\t * will effectively short-circuit the function.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param null|bool $delete     Whether to allow metadata deletion of the given type.\n\t * @param int       $object_id  Object ID.\n\t * @param string    $meta_key   Meta key.\n\t * @param mixed     $meta_value Meta value. Must be serializable if non-scalar.\n\t * @param bool      $delete_all Whether to delete the matching metadata entries\n\t *                              for all objects, ignoring the specified $object_id.\n\t *                              Default false.\n\t */\n\t$check = apply_filters( \"delete_{$meta_type}_metadata\", null, $object_id, $meta_key, $meta_value, $delete_all );\n\tif ( null !== $check )\n\t\treturn (bool) $check;\n\n\t$_meta_value = $meta_value;\n\t$meta_value = maybe_serialize( $meta_value );\n\n\t$query = $wpdb->prepare( \"SELECT $id_column FROM $table WHERE meta_key = %s\", $meta_key );\n\n\tif ( !$delete_all )\n\t\t$query .= $wpdb->prepare(\" AND $type_column = %d\", $object_id );\n\n\tif ( '' !== $meta_value && null !== $meta_value && false !== $meta_value )\n\t\t$query .= $wpdb->prepare(\" AND meta_value = %s\", $meta_value );\n\n\t$meta_ids = $wpdb->get_col( $query );\n\tif ( !count( $meta_ids ) )\n\t\treturn false;\n\n\tif ( $delete_all )\n\t\t$object_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT $type_column FROM $table WHERE meta_key = %s\", $meta_key ) );\n\n\t/**\n\t * Fires immediately before deleting metadata of a specific type.\n\t *\n\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t * object type (comment, post, or user).\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array  $meta_ids   An array of metadata entry IDs to delete.\n\t * @param int    $object_id  Object ID.\n\t * @param string $meta_key   Meta key.\n\t * @param mixed  $meta_value Meta value.\n\t */\n\tdo_action( \"delete_{$meta_type}_meta\", $meta_ids, $object_id, $meta_key, $_meta_value );\n\n\t// Old-style action.\n\tif ( 'post' == $meta_type ) {\n\t\t/**\n\t\t * Fires immediately before deleting metadata for a post.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param array $meta_ids An array of post metadata entry IDs to delete.\n\t\t */\n\t\tdo_action( 'delete_postmeta', $meta_ids );\n\t}\n\n\t$query = \"DELETE FROM $table WHERE $id_column IN( \" . implode( ',', $meta_ids ) . \" )\";\n\n\t$count = $wpdb->query($query);\n\n\tif ( !$count )\n\t\treturn false;\n\n\tif ( $delete_all ) {\n\t\tforeach ( (array) $object_ids as $o_id ) {\n\t\t\twp_cache_delete($o_id, $meta_type . '_meta');\n\t\t}\n\t} else {\n\t\twp_cache_delete($object_id, $meta_type . '_meta');\n\t}\n\n\t/**\n\t * Fires immediately after deleting metadata of a specific type.\n\t *\n\t * The dynamic portion of the hook name, `$meta_type`, refers to the meta\n\t * object type (comment, post, or user).\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param array  $meta_ids   An array of deleted metadata entry IDs.\n\t * @param int    $object_id  Object ID.\n\t * @param string $meta_key   Meta key.\n\t * @param mixed  $meta_value Meta value.\n\t */\n\tdo_action( \"deleted_{$meta_type}_meta\", $meta_ids, $object_id, $meta_key, $_meta_value );\n\n\t// Old-style action.\n\tif ( 'post' == $meta_type ) {\n\t\t/**\n\t\t * Fires immediately after deleting metadata for a post.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param array $meta_ids An array of deleted post metadata entry IDs.\n\t\t */\n\t\tdo_action( 'deleted_postmeta', $meta_ids );\n\t}\n\n\treturn true;\n}\n\n/**\n * Retrieve metadata for the specified object.\n *\n * @since 2.9.0\n *\n * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)\n * @param int    $object_id ID of the object metadata is for\n * @param string $meta_key  Optional. Metadata key. If not specified, retrieve all metadata for\n * \t\t                    the specified object.\n * @param bool   $single    Optional, default is false.\n *                          If true, return only the first value of the specified meta_key.\n *                          This parameter has no effect if meta_key is not specified.\n * @return mixed Single metadata value, or array of values\n */\nfunction get_metadata($meta_type, $object_id, $meta_key = '', $single = false) {\n\tif ( ! $meta_type || ! is_numeric( $object_id ) ) {\n\t\treturn false;\n\t}\n\n\t$object_id = absint( $object_id );\n\tif ( ! $object_id ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Filter whether to retrieve metadata of a specific type.\n\t *\n\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t * object type (comment, post, or user). Returning a non-null value\n\t * will effectively short-circuit the function.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param null|array|string $value     The value get_metadata() should return - a single metadata value,\n\t *                                     or an array of values.\n\t * @param int               $object_id Object ID.\n\t * @param string            $meta_key  Meta key.\n\t * @param bool              $single    Whether to return only the first value of the specified $meta_key.\n\t */\n\t$check = apply_filters( \"get_{$meta_type}_metadata\", null, $object_id, $meta_key, $single );\n\tif ( null !== $check ) {\n\t\tif ( $single && is_array( $check ) )\n\t\t\treturn $check[0];\n\t\telse\n\t\t\treturn $check;\n\t}\n\n\t$meta_cache = wp_cache_get($object_id, $meta_type . '_meta');\n\n\tif ( !$meta_cache ) {\n\t\t$meta_cache = update_meta_cache( $meta_type, array( $object_id ) );\n\t\t$meta_cache = $meta_cache[$object_id];\n\t}\n\n\tif ( ! $meta_key ) {\n\t\treturn $meta_cache;\n\t}\n\n\tif ( isset($meta_cache[$meta_key]) ) {\n\t\tif ( $single )\n\t\t\treturn maybe_unserialize( $meta_cache[$meta_key][0] );\n\t\telse\n\t\t\treturn array_map('maybe_unserialize', $meta_cache[$meta_key]);\n\t}\n\n\tif ($single)\n\t\treturn '';\n\telse\n\t\treturn array();\n}\n\n/**\n * Determine if a meta key is set for a given object\n *\n * @since 3.3.0\n *\n * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)\n * @param int    $object_id ID of the object metadata is for\n * @param string $meta_key  Metadata key.\n * @return bool True of the key is set, false if not.\n */\nfunction metadata_exists( $meta_type, $object_id, $meta_key ) {\n\tif ( ! $meta_type || ! is_numeric( $object_id ) ) {\n\t\treturn false;\n\t}\n\n\t$object_id = absint( $object_id );\n\tif ( ! $object_id ) {\n\t\treturn false;\n\t}\n\n\t/** This filter is documented in wp-includes/meta.php */\n\t$check = apply_filters( \"get_{$meta_type}_metadata\", null, $object_id, $meta_key, true );\n\tif ( null !== $check )\n\t\treturn (bool) $check;\n\n\t$meta_cache = wp_cache_get( $object_id, $meta_type . '_meta' );\n\n\tif ( !$meta_cache ) {\n\t\t$meta_cache = update_meta_cache( $meta_type, array( $object_id ) );\n\t\t$meta_cache = $meta_cache[$object_id];\n\t}\n\n\tif ( isset( $meta_cache[ $meta_key ] ) )\n\t\treturn true;\n\n\treturn false;\n}\n\n/**\n * Get meta data by meta ID\n *\n * @since 3.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user).\n * @param int    $meta_id   ID for a specific meta row\n * @return object|false Meta object or false.\n */\nfunction get_metadata_by_mid( $meta_type, $meta_id ) {\n\tglobal $wpdb;\n\n\tif ( ! $meta_type || ! is_numeric( $meta_id ) ) {\n\t\treturn false;\n\t}\n\n\t$meta_id = absint( $meta_id );\n\tif ( ! $meta_id ) {\n\t\treturn false;\n\t}\n\n\t$table = _get_meta_table( $meta_type );\n\tif ( ! $table ) {\n\t\treturn false;\n\t}\n\n\t$id_column = ( 'user' == $meta_type ) ? 'umeta_id' : 'meta_id';\n\n\t$meta = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $table WHERE $id_column = %d\", $meta_id ) );\n\n\tif ( empty( $meta ) )\n\t\treturn false;\n\n\tif ( isset( $meta->meta_value ) )\n\t\t$meta->meta_value = maybe_unserialize( $meta->meta_value );\n\n\treturn $meta;\n}\n\n/**\n * Update meta data by meta ID\n *\n * @since 3.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $meta_type  Type of object metadata is for (e.g., comment, post, or user)\n * @param int    $meta_id    ID for a specific meta row\n * @param string $meta_value Metadata value\n * @param string $meta_key   Optional, you can provide a meta key to update it\n * @return bool True on successful update, false on failure.\n */\nfunction update_metadata_by_mid( $meta_type, $meta_id, $meta_value, $meta_key = false ) {\n\tglobal $wpdb;\n\n\t// Make sure everything is valid.\n\tif ( ! $meta_type || ! is_numeric( $meta_id ) ) {\n\t\treturn false;\n\t}\n\n\t$meta_id = absint( $meta_id );\n\tif ( ! $meta_id ) {\n\t\treturn false;\n\t}\n\n\t$table = _get_meta_table( $meta_type );\n\tif ( ! $table ) {\n\t\treturn false;\n\t}\n\n\t$column = sanitize_key($meta_type . '_id');\n\t$id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';\n\n\t// Fetch the meta and go on if it's found.\n\tif ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) {\n\t\t$original_key = $meta->meta_key;\n\t\t$object_id = $meta->{$column};\n\n\t\t// If a new meta_key (last parameter) was specified, change the meta key,\n\t\t// otherwise use the original key in the update statement.\n\t\tif ( false === $meta_key ) {\n\t\t\t$meta_key = $original_key;\n\t\t} elseif ( ! is_string( $meta_key ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Sanitize the meta\n\t\t$_meta_value = $meta_value;\n\t\t$meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );\n\t\t$meta_value = maybe_serialize( $meta_value );\n\n\t\t// Format the data query arguments.\n\t\t$data = array(\n\t\t\t'meta_key' => $meta_key,\n\t\t\t'meta_value' => $meta_value\n\t\t);\n\n\t\t// Format the where query arguments.\n\t\t$where = array();\n\t\t$where[$id_column] = $meta_id;\n\n\t\t/** This action is documented in wp-includes/meta.php */\n\t\tdo_action( \"update_{$meta_type}_meta\", $meta_id, $object_id, $meta_key, $_meta_value );\n\n\t\tif ( 'post' == $meta_type ) {\n\t\t\t/** This action is documented in wp-includes/meta.php */\n\t\t\tdo_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value );\n\t\t}\n\n\t\t// Run the update query, all fields in $data are %s, $where is a %d.\n\t\t$result = $wpdb->update( $table, $data, $where, '%s', '%d' );\n\t\tif ( ! $result )\n\t\t\treturn false;\n\n\t\t// Clear the caches.\n\t\twp_cache_delete($object_id, $meta_type . '_meta');\n\n\t\t/** This action is documented in wp-includes/meta.php */\n\t\tdo_action( \"updated_{$meta_type}_meta\", $meta_id, $object_id, $meta_key, $_meta_value );\n\n\t\tif ( 'post' == $meta_type ) {\n\t\t\t/** This action is documented in wp-includes/meta.php */\n\t\t\tdo_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value );\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// And if the meta was not found.\n\treturn false;\n}\n\n/**\n * Delete meta data by meta ID\n *\n * @since 3.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $meta_type Type of object metadata is for (e.g., comment, post, term, or user).\n * @param int    $meta_id   ID for a specific meta row\n * @return bool True on successful delete, false on failure.\n */\nfunction delete_metadata_by_mid( $meta_type, $meta_id ) {\n\tglobal $wpdb;\n\n\t// Make sure everything is valid.\n\tif ( ! $meta_type || ! is_numeric( $meta_id ) ) {\n\t\treturn false;\n\t}\n\n\t$meta_id = absint( $meta_id );\n\tif ( ! $meta_id ) {\n\t\treturn false;\n\t}\n\n\t$table = _get_meta_table( $meta_type );\n\tif ( ! $table ) {\n\t\treturn false;\n\t}\n\n\t// object and id columns\n\t$column = sanitize_key($meta_type . '_id');\n\t$id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';\n\n\t// Fetch the meta and go on if it's found.\n\tif ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) {\n\t\t$object_id = $meta->{$column};\n\n\t\t/** This action is documented in wp-includes/meta.php */\n\t\tdo_action( \"delete_{$meta_type}_meta\", (array) $meta_id, $object_id, $meta->meta_key, $meta->meta_value );\n\n\t\t// Old-style action.\n\t\tif ( 'post' == $meta_type || 'comment' == $meta_type ) {\n\t\t\t/**\n\t\t\t * Fires immediately before deleting post or comment metadata of a specific type.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t\t\t * object type (post or comment).\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param int $meta_id ID of the metadata entry to delete.\n\t\t\t */\n\t\t\tdo_action( \"delete_{$meta_type}meta\", $meta_id );\n\t\t}\n\n\t\t// Run the query, will return true if deleted, false otherwise\n\t\t$result = (bool) $wpdb->delete( $table, array( $id_column => $meta_id ) );\n\n\t\t// Clear the caches.\n\t\twp_cache_delete($object_id, $meta_type . '_meta');\n\n\t\t/** This action is documented in wp-includes/meta.php */\n\t\tdo_action( \"deleted_{$meta_type}_meta\", (array) $meta_id, $object_id, $meta->meta_key, $meta->meta_value );\n\n\t\t// Old-style action.\n\t\tif ( 'post' == $meta_type || 'comment' == $meta_type ) {\n\t\t\t/**\n\t\t\t * Fires immediately after deleting post or comment metadata of a specific type.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook, `$meta_type`, refers to the meta\n\t\t\t * object type (post or comment).\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param int $meta_ids Deleted metadata entry ID.\n\t\t\t */\n\t\t\tdo_action( \"deleted_{$meta_type}meta\", $meta_id );\n\t\t}\n\n\t\treturn $result;\n\n\t}\n\n\t// Meta id was not found.\n\treturn false;\n}\n\n/**\n * Update the metadata cache for the specified objects.\n *\n * @since 2.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string    $meta_type  Type of object metadata is for (e.g., comment, post, or user)\n * @param int|array $object_ids Array or comma delimited list of object IDs to update cache for\n * @return array|false Metadata cache for the specified objects, or false on failure.\n */\nfunction update_meta_cache($meta_type, $object_ids) {\n\tglobal $wpdb;\n\n\tif ( ! $meta_type || ! $object_ids ) {\n\t\treturn false;\n\t}\n\n\t$table = _get_meta_table( $meta_type );\n\tif ( ! $table ) {\n\t\treturn false;\n\t}\n\n\t$column = sanitize_key($meta_type . '_id');\n\n\tif ( !is_array($object_ids) ) {\n\t\t$object_ids = preg_replace('|[^0-9,]|', '', $object_ids);\n\t\t$object_ids = explode(',', $object_ids);\n\t}\n\n\t$object_ids = array_map('intval', $object_ids);\n\n\t$cache_key = $meta_type . '_meta';\n\t$ids = array();\n\t$cache = array();\n\tforeach ( $object_ids as $id ) {\n\t\t$cached_object = wp_cache_get( $id, $cache_key );\n\t\tif ( false === $cached_object )\n\t\t\t$ids[] = $id;\n\t\telse\n\t\t\t$cache[$id] = $cached_object;\n\t}\n\n\tif ( empty( $ids ) )\n\t\treturn $cache;\n\n\t// Get meta info\n\t$id_list = join( ',', $ids );\n\t$id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';\n\t$meta_list = $wpdb->get_results( \"SELECT $column, meta_key, meta_value FROM $table WHERE $column IN ($id_list) ORDER BY $id_column ASC\", ARRAY_A );\n\n\tif ( !empty($meta_list) ) {\n\t\tforeach ( $meta_list as $metarow) {\n\t\t\t$mpid = intval($metarow[$column]);\n\t\t\t$mkey = $metarow['meta_key'];\n\t\t\t$mval = $metarow['meta_value'];\n\n\t\t\t// Force subkeys to be array type:\n\t\t\tif ( !isset($cache[$mpid]) || !is_array($cache[$mpid]) )\n\t\t\t\t$cache[$mpid] = array();\n\t\t\tif ( !isset($cache[$mpid][$mkey]) || !is_array($cache[$mpid][$mkey]) )\n\t\t\t\t$cache[$mpid][$mkey] = array();\n\n\t\t\t// Add a value to the current pid/key:\n\t\t\t$cache[$mpid][$mkey][] = $mval;\n\t\t}\n\t}\n\n\tforeach ( $ids as $id ) {\n\t\tif ( ! isset($cache[$id]) )\n\t\t\t$cache[$id] = array();\n\t\twp_cache_add( $id, $cache[$id], $cache_key );\n\t}\n\n\treturn $cache;\n}\n\n/**\n * Given a meta query, generates SQL clauses to be appended to a main query.\n *\n * @since 3.2.0\n *\n * @see WP_Meta_Query\n *\n * @param array $meta_query         A meta query.\n * @param string $type              Type of meta.\n * @param string $primary_table     Primary database table name.\n * @param string $primary_id_column Primary ID column name.\n * @param object $context           Optional. The main query object\n * @return array Associative array of `JOIN` and `WHERE` SQL.\n */\nfunction get_meta_sql( $meta_query, $type, $primary_table, $primary_id_column, $context = null ) {\n\t$meta_query_obj = new WP_Meta_Query( $meta_query );\n\treturn $meta_query_obj->get_sql( $type, $primary_table, $primary_id_column, $context );\n}\n\n/**\n * Retrieve the name of the metadata table for the specified object type.\n *\n * @since 2.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $type Type of object to get metadata table for (e.g., comment, post, or user)\n * @return string|false Metadata table name, or false if no metadata table exists\n */\nfunction _get_meta_table($type) {\n\tglobal $wpdb;\n\n\t$table_name = $type . 'meta';\n\n\tif ( empty($wpdb->$table_name) )\n\t\treturn false;\n\n\treturn $wpdb->$table_name;\n}\n\n/**\n * Determine whether a meta key is protected.\n *\n * @since 3.1.3\n *\n * @param string      $meta_key Meta key\n * @param string|null $meta_type\n * @return bool True if the key is protected, false otherwise.\n */\nfunction is_protected_meta( $meta_key, $meta_type = null ) {\n\t$protected = ( '_' == $meta_key[0] );\n\n\t/**\n\t * Filter whether a meta key is protected.\n\t *\n\t * @since 3.2.0\n\t *\n\t * @param bool   $protected Whether the key is protected. Default false.\n\t * @param string $meta_key  Meta key.\n\t * @param string $meta_type Meta type.\n\t */\n\treturn apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type );\n}\n\n/**\n * Sanitize meta value.\n *\n * @since 3.1.3\n *\n * @param string $meta_key   Meta key\n * @param mixed  $meta_value Meta value to sanitize\n * @param string $meta_type  Type of meta\n * @return mixed Sanitized $meta_value\n */\nfunction sanitize_meta( $meta_key, $meta_value, $meta_type ) {\n\n\t/**\n\t * Filter the sanitization of a specific meta key of a specific meta type.\n\t *\n\t * The dynamic portions of the hook name, `$meta_type`, and `$meta_key`,\n\t * refer to the metadata object type (comment, post, or user) and the meta\n\t * key value,\n\t * respectively.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param mixed  $meta_value Meta value to sanitize.\n\t * @param string $meta_key   Meta key.\n\t * @param string $meta_type  Meta type.\n\t */\n\treturn apply_filters( \"sanitize_{$meta_type}_meta_{$meta_key}\", $meta_value, $meta_key, $meta_type );\n}\n\n/**\n * Register meta key\n *\n * @since 3.3.0\n *\n * @param string       $meta_type         Type of meta\n * @param string       $meta_key          Meta key\n * @param string|array $sanitize_callback A function or method to call when sanitizing the value of $meta_key.\n * @param string|array $auth_callback     Optional. A function or method to call when performing edit_post_meta, add_post_meta, and delete_post_meta capability checks.\n */\nfunction register_meta( $meta_type, $meta_key, $sanitize_callback, $auth_callback = null ) {\n\tif ( is_callable( $sanitize_callback ) )\n\t\tadd_filter( \"sanitize_{$meta_type}_meta_{$meta_key}\", $sanitize_callback, 10, 3 );\n\n\tif ( empty( $auth_callback ) ) {\n\t\tif ( is_protected_meta( $meta_key, $meta_type ) )\n\t\t\t$auth_callback = '__return_false';\n\t\telse\n\t\t\t$auth_callback = '__return_true';\n\t}\n\n\tif ( is_callable( $auth_callback ) )\n\t\tadd_filter( \"auth_{$meta_type}_meta_{$meta_key}\", $auth_callback, 10, 6 );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ms-blogs.php",
    "content": "<?php\n\n/**\n * Site/blog functions that work with the blogs table and related data.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since MU\n */\n\n/**\n * Update the last_updated field for the current blog.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction wpmu_update_blogs_date() {\n\tglobal $wpdb;\n\n\tupdate_blog_details( $wpdb->blogid, array('last_updated' => current_time('mysql', true)) );\n\t/**\n\t * Fires after the blog details are updated.\n\t *\n\t * @since MU\n\t *\n\t * @param int $blog_id Blog ID.\n\t */\n\tdo_action( 'wpmu_blog_updated', $wpdb->blogid );\n}\n\n/**\n * Get a full blog URL, given a blog id.\n *\n * @since MU\n *\n * @param int $blog_id Blog ID\n * @return string Full URL of the blog if found. Empty string if not.\n */\nfunction get_blogaddress_by_id( $blog_id ) {\n\t$bloginfo = get_blog_details( (int) $blog_id );\n\n\tif ( empty( $bloginfo ) ) {\n\t\treturn '';\n\t}\n\n\t$scheme = parse_url( $bloginfo->home, PHP_URL_SCHEME );\n\t$scheme = empty( $scheme ) ? 'http' : $scheme;\n\n\treturn esc_url( $scheme . '://' . $bloginfo->domain . $bloginfo->path );\n}\n\n/**\n * Get a full blog URL, given a blog name.\n *\n * @since MU\n *\n * @param string $blogname The (subdomain or directory) name\n * @return string\n */\nfunction get_blogaddress_by_name( $blogname ) {\n\tif ( is_subdomain_install() ) {\n\t\tif ( $blogname == 'main' )\n\t\t\t$blogname = 'www';\n\t\t$url = rtrim( network_home_url(), '/' );\n\t\tif ( !empty( $blogname ) )\n\t\t\t$url = preg_replace( '|^([^\\.]+://)|', \"\\${1}\" . $blogname . '.', $url );\n\t} else {\n\t\t$url = network_home_url( $blogname );\n\t}\n\treturn esc_url( $url . '/' );\n}\n\n/**\n * Given a blog's (subdomain or directory) slug, retrieve its id.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $slug\n * @return int A blog id\n */\nfunction get_id_from_blogname( $slug ) {\n\tglobal $wpdb;\n\n\t$current_site = get_current_site();\n\t$slug = trim( $slug, '/' );\n\n\t$blog_id = wp_cache_get( 'get_id_from_blogname_' . $slug, 'blog-details' );\n\tif ( $blog_id )\n\t\treturn $blog_id;\n\n\tif ( is_subdomain_install() ) {\n\t\t$domain = $slug . '.' . $current_site->domain;\n\t\t$path = $current_site->path;\n\t} else {\n\t\t$domain = $current_site->domain;\n\t\t$path = $current_site->path . $slug . '/';\n\t}\n\n\t$blog_id = $wpdb->get_var( $wpdb->prepare(\"SELECT blog_id FROM {$wpdb->blogs} WHERE domain = %s AND path = %s\", $domain, $path) );\n\twp_cache_set( 'get_id_from_blogname_' . $slug, $blog_id, 'blog-details' );\n\treturn $blog_id;\n}\n\n/**\n * Retrieve the details for a blog from the blogs table and blog options.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|string|array $fields  Optional. A blog ID, a blog slug, or an array of fields to query against.\n *                                  If not specified the current blog ID is used.\n * @param bool             $get_all Whether to retrieve all details or only the details in the blogs table.\n *                                  Default is true.\n * @return object|false Blog details on success. False on failure.\n */\nfunction get_blog_details( $fields = null, $get_all = true ) {\n\tglobal $wpdb;\n\n\tif ( is_array($fields ) ) {\n\t\tif ( isset($fields['blog_id']) ) {\n\t\t\t$blog_id = $fields['blog_id'];\n\t\t} elseif ( isset($fields['domain']) && isset($fields['path']) ) {\n\t\t\t$key = md5( $fields['domain'] . $fields['path'] );\n\t\t\t$blog = wp_cache_get($key, 'blog-lookup');\n\t\t\tif ( false !== $blog )\n\t\t\t\treturn $blog;\n\t\t\tif ( substr( $fields['domain'], 0, 4 ) == 'www.' ) {\n\t\t\t\t$nowww = substr( $fields['domain'], 4 );\n\t\t\t\t$blog = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) AND path = %s ORDER BY CHAR_LENGTH(domain) DESC\", $nowww, $fields['domain'], $fields['path'] ) );\n\t\t\t} else {\n\t\t\t\t$blog = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s\", $fields['domain'], $fields['path'] ) );\n\t\t\t}\n\t\t\tif ( $blog ) {\n\t\t\t\twp_cache_set($blog->blog_id . 'short', $blog, 'blog-details');\n\t\t\t\t$blog_id = $blog->blog_id;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} elseif ( isset($fields['domain']) && is_subdomain_install() ) {\n\t\t\t$key = md5( $fields['domain'] );\n\t\t\t$blog = wp_cache_get($key, 'blog-lookup');\n\t\t\tif ( false !== $blog )\n\t\t\t\treturn $blog;\n\t\t\tif ( substr( $fields['domain'], 0, 4 ) == 'www.' ) {\n\t\t\t\t$nowww = substr( $fields['domain'], 4 );\n\t\t\t\t$blog = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->blogs WHERE domain IN (%s,%s) ORDER BY CHAR_LENGTH(domain) DESC\", $nowww, $fields['domain'] ) );\n\t\t\t} else {\n\t\t\t\t$blog = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->blogs WHERE domain = %s\", $fields['domain'] ) );\n\t\t\t}\n\t\t\tif ( $blog ) {\n\t\t\t\twp_cache_set($blog->blog_id . 'short', $blog, 'blog-details');\n\t\t\t\t$blog_id = $blog->blog_id;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t} else {\n\t\tif ( ! $fields )\n\t\t\t$blog_id = get_current_blog_id();\n\t\telseif ( ! is_numeric( $fields ) )\n\t\t\t$blog_id = get_id_from_blogname( $fields );\n\t\telse\n\t\t\t$blog_id = $fields;\n\t}\n\n\t$blog_id = (int) $blog_id;\n\n\t$all = $get_all == true ? '' : 'short';\n\t$details = wp_cache_get( $blog_id . $all, 'blog-details' );\n\n\tif ( $details ) {\n\t\tif ( ! is_object( $details ) ) {\n\t\t\tif ( $details == -1 ) {\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\t// Clear old pre-serialized objects. Cache clients do better with that.\n\t\t\t\twp_cache_delete( $blog_id . $all, 'blog-details' );\n\t\t\t\tunset($details);\n\t\t\t}\n\t\t} else {\n\t\t\treturn $details;\n\t\t}\n\t}\n\n\t// Try the other cache.\n\tif ( $get_all ) {\n\t\t$details = wp_cache_get( $blog_id . 'short', 'blog-details' );\n\t} else {\n\t\t$details = wp_cache_get( $blog_id, 'blog-details' );\n\t\t// If short was requested and full cache is set, we can return.\n\t\tif ( $details ) {\n\t\t\tif ( ! is_object( $details ) ) {\n\t\t\t\tif ( $details == -1 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\t// Clear old pre-serialized objects. Cache clients do better with that.\n\t\t\t\t\twp_cache_delete( $blog_id, 'blog-details' );\n\t\t\t\t\tunset($details);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn $details;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( empty($details) ) {\n\t\t$details = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->blogs WHERE blog_id = %d /* get_blog_details */\", $blog_id ) );\n\t\tif ( ! $details ) {\n\t\t\t// Set the full cache.\n\t\t\twp_cache_set( $blog_id, -1, 'blog-details' );\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif ( ! $get_all ) {\n\t\twp_cache_set( $blog_id . $all, $details, 'blog-details' );\n\t\treturn $details;\n\t}\n\n\tswitch_to_blog( $blog_id );\n\t$details->blogname   = get_option( 'blogname' );\n\t$details->siteurl    = get_option( 'siteurl' );\n\t$details->post_count = get_option( 'post_count' );\n\t$details->home       = get_option( 'home' );\n\trestore_current_blog();\n\n\t/**\n\t * Filter a blog's details.\n\t *\n\t * @since MU\n\t *\n\t * @param object $details The blog details.\n\t */\n\t$details = apply_filters( 'blog_details', $details );\n\n\twp_cache_set( $blog_id . $all, $details, 'blog-details' );\n\n\t$key = md5( $details->domain . $details->path );\n\twp_cache_set( $key, $details, 'blog-lookup' );\n\n\treturn $details;\n}\n\n/**\n * Clear the blog details cache.\n *\n * @since MU\n *\n * @param int $blog_id Optional. Blog ID. Defaults to current blog.\n */\nfunction refresh_blog_details( $blog_id = 0 ) {\n\t$blog_id = (int) $blog_id;\n\tif ( ! $blog_id ) {\n\t\t$blog_id = get_current_blog_id();\n\t}\n\n\t$details = get_blog_details( $blog_id, false );\n\tif ( ! $details ) {\n\t\t// Make sure clean_blog_cache() gets the blog ID\n\t\t// when the blog has been previously cached as\n\t\t// non-existent.\n\t\t$details = (object) array(\n\t\t\t'blog_id' => $blog_id,\n\t\t\t'domain' => null,\n\t\t\t'path' => null\n\t\t);\n\t}\n\n\tclean_blog_cache( $details );\n\n\t/**\n\t * Fires after the blog details cache is cleared.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param int $blog_id Blog ID.\n\t */\n\tdo_action( 'refresh_blog_details', $blog_id );\n}\n\n/**\n * Update the details for a blog. Updates the blogs table for a given blog id.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int   $blog_id Blog ID\n * @param array $details Array of details keyed by blogs table field names.\n * @return bool True if update succeeds, false otherwise.\n */\nfunction update_blog_details( $blog_id, $details = array() ) {\n\tglobal $wpdb;\n\n\tif ( empty($details) )\n\t\treturn false;\n\n\tif ( is_object($details) )\n\t\t$details = get_object_vars($details);\n\n\t$current_details = get_blog_details($blog_id, false);\n\tif ( empty($current_details) )\n\t\treturn false;\n\n\t$current_details = get_object_vars($current_details);\n\n\t$details = array_merge($current_details, $details);\n\t$details['last_updated'] = current_time('mysql', true);\n\n\t$update_details = array();\n\t$fields = array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id');\n\tforeach ( array_intersect( array_keys( $details ), $fields ) as $field ) {\n\t\tif ( 'path' === $field ) {\n\t\t\t$details[ $field ] = trailingslashit( '/' . trim( $details[ $field ], '/' ) );\n\t\t}\n\n\t\t$update_details[ $field ] = $details[ $field ];\n\t}\n\n\t$result = $wpdb->update( $wpdb->blogs, $update_details, array('blog_id' => $blog_id) );\n\n\tif ( false === $result )\n\t\treturn false;\n\n\t// If spam status changed, issue actions.\n\tif ( $details['spam'] != $current_details['spam'] ) {\n\t\tif ( $details['spam'] == 1 ) {\n\t\t\t/**\n\t\t\t * Fires when the blog status is changed to 'spam'.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param int $blog_id Blog ID.\n\t\t\t */\n\t\t\tdo_action( 'make_spam_blog', $blog_id );\n\t\t} else {\n\t\t\t/**\n\t\t\t * Fires when the blog status is changed to 'ham'.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param int $blog_id Blog ID.\n\t\t\t */\n\t\t\tdo_action( 'make_ham_blog', $blog_id );\n\t\t}\n\t}\n\n\t// If mature status changed, issue actions.\n\tif ( $details['mature'] != $current_details['mature'] ) {\n\t\tif ( $details['mature'] == 1 ) {\n\t\t\t/**\n\t\t\t * Fires when the blog status is changed to 'mature'.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param int $blog_id Blog ID.\n\t\t\t */\n\t\t\tdo_action( 'mature_blog', $blog_id );\n\t\t} else {\n\t\t\t/**\n\t\t\t * Fires when the blog status is changed to 'unmature'.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param int $blog_id Blog ID.\n\t\t\t */\n\t\t\tdo_action( 'unmature_blog', $blog_id );\n\t\t}\n\t}\n\n\t// If archived status changed, issue actions.\n\tif ( $details['archived'] != $current_details['archived'] ) {\n\t\tif ( $details['archived'] == 1 ) {\n\t\t\t/**\n\t\t\t * Fires when the blog status is changed to 'archived'.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param int $blog_id Blog ID.\n\t\t\t */\n\t\t\tdo_action( 'archive_blog', $blog_id );\n\t\t} else {\n\t\t\t/**\n\t\t\t * Fires when the blog status is changed to 'unarchived'.\n\t\t\t *\n\t\t\t * @since MU\n\t\t\t *\n\t\t\t * @param int $blog_id Blog ID.\n\t\t\t */\n\t\t\tdo_action( 'unarchive_blog', $blog_id );\n\t\t}\n\t}\n\n\t// If deleted status changed, issue actions.\n\tif ( $details['deleted'] != $current_details['deleted'] ) {\n\t\tif ( $details['deleted'] == 1 ) {\n\t\t\t/**\n\t\t\t * Fires when the blog status is changed to 'deleted'.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param int $blog_id Blog ID.\n\t\t\t */\n\t\t\tdo_action( 'make_delete_blog', $blog_id );\n\t\t} else {\n\t\t\t/**\n\t\t\t * Fires when the blog status is changed to 'undeleted'.\n\t\t\t *\n\t\t\t * @since 3.5.0\n\t\t\t *\n\t\t\t * @param int $blog_id Blog ID.\n\t\t\t */\n\t\t\tdo_action( 'make_undelete_blog', $blog_id );\n\t\t}\n\t}\n\n\tif ( isset( $details['public'] ) ) {\n\t\tswitch_to_blog( $blog_id );\n\t\tupdate_option( 'blog_public', $details['public'] );\n\t\trestore_current_blog();\n\t}\n\n\trefresh_blog_details($blog_id);\n\n\treturn true;\n}\n\n/**\n * Clean the blog cache\n *\n * @since 3.5.0\n *\n * @param stdClass $blog The blog details as returned from get_blog_details()\n */\nfunction clean_blog_cache( $blog ) {\n\t$blog_id = $blog->blog_id;\n\t$domain_path_key = md5( $blog->domain . $blog->path );\n\n\twp_cache_delete( $blog_id , 'blog-details' );\n\twp_cache_delete( $blog_id . 'short' , 'blog-details' );\n\twp_cache_delete(  $domain_path_key, 'blog-lookup' );\n\twp_cache_delete( 'current_blog_' . $blog->domain, 'site-options' );\n\twp_cache_delete( 'current_blog_' . $blog->domain . $blog->path, 'site-options' );\n\twp_cache_delete( 'get_id_from_blogname_' . trim( $blog->path, '/' ), 'blog-details' );\n\twp_cache_delete( $domain_path_key, 'blog-id-cache' );\n}\n\n/**\n * Retrieve option value for a given blog id based on name of option.\n *\n * If the option does not exist or does not have a value, then the return value\n * will be false. This is useful to check whether you need to install an option\n * and is commonly used during installation of plugin options and to test\n * whether upgrading is required.\n *\n * If the option was serialized then it will be unserialized when it is returned.\n *\n * @since MU\n *\n * @param int    $id      A blog ID. Can be null to refer to the current blog.\n * @param string $option  Name of option to retrieve. Expected to not be SQL-escaped.\n * @param mixed  $default Optional. Default value to return if the option does not exist.\n * @return mixed Value set for the option.\n */\nfunction get_blog_option( $id, $option, $default = false ) {\n\t$id = (int) $id;\n\n\tif ( empty( $id ) )\n\t\t$id = get_current_blog_id();\n\n\tif ( get_current_blog_id() == $id )\n\t\treturn get_option( $option, $default );\n\n\tswitch_to_blog( $id );\n\t$value = get_option( $option, $default );\n\trestore_current_blog();\n\n\t/**\n\t * Filter a blog option value.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the blog option name.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param string  $value The option value.\n\t * @param int     $id    Blog ID.\n\t */\n\treturn apply_filters( \"blog_option_{$option}\", $value, $id );\n}\n\n/**\n * Add a new option for a given blog id.\n *\n * You do not need to serialize values. If the value needs to be serialized, then\n * it will be serialized before it is inserted into the database. Remember,\n * resources can not be serialized or added as an option.\n *\n * You can create options without values and then update the values later.\n * Existing options will not be updated and checks are performed to ensure that you\n * aren't adding a protected WordPress option. Care should be taken to not name\n * options the same as the ones which are protected.\n *\n * @since MU\n *\n * @param int    $id     A blog ID. Can be null to refer to the current blog.\n * @param string $option Name of option to add. Expected to not be SQL-escaped.\n * @param mixed  $value  Optional. Option value, can be anything. Expected to not be SQL-escaped.\n * @return bool False if option was not added and true if option was added.\n */\nfunction add_blog_option( $id, $option, $value ) {\n\t$id = (int) $id;\n\n\tif ( empty( $id ) )\n\t\t$id = get_current_blog_id();\n\n\tif ( get_current_blog_id() == $id )\n\t\treturn add_option( $option, $value );\n\n\tswitch_to_blog( $id );\n\t$return = add_option( $option, $value );\n\trestore_current_blog();\n\n\treturn $return;\n}\n\n/**\n * Removes option by name for a given blog id. Prevents removal of protected WordPress options.\n *\n * @since MU\n *\n * @param int    $id     A blog ID. Can be null to refer to the current blog.\n * @param string $option Name of option to remove. Expected to not be SQL-escaped.\n * @return bool True, if option is successfully deleted. False on failure.\n */\nfunction delete_blog_option( $id, $option ) {\n\t$id = (int) $id;\n\n\tif ( empty( $id ) )\n\t\t$id = get_current_blog_id();\n\n\tif ( get_current_blog_id() == $id )\n\t\treturn delete_option( $option );\n\n\tswitch_to_blog( $id );\n\t$return = delete_option( $option );\n\trestore_current_blog();\n\n\treturn $return;\n}\n\n/**\n * Update an option for a particular blog.\n *\n * @since MU\n *\n * @param int    $id     The blog id\n * @param string $option The option key\n * @param mixed  $value  The option value\n * @return bool True on success, false on failure.\n */\nfunction update_blog_option( $id, $option, $value, $deprecated = null ) {\n\t$id = (int) $id;\n\n\tif ( null !== $deprecated  )\n\t\t_deprecated_argument( __FUNCTION__, '3.1' );\n\n\tif ( get_current_blog_id() == $id )\n\t\treturn update_option( $option, $value );\n\n\tswitch_to_blog( $id );\n\t$return = update_option( $option, $value );\n\trestore_current_blog();\n\n\trefresh_blog_details( $id );\n\n\treturn $return;\n}\n\n/**\n * Switch the current blog.\n *\n * This function is useful if you need to pull posts, or other information,\n * from other blogs. You can switch back afterwards using restore_current_blog().\n *\n * Things that aren't switched:\n *  - autoloaded options. See #14992\n *  - plugins. See #14941\n *\n * @see restore_current_blog()\n * @since MU\n *\n * @global wpdb            $wpdb\n * @global int             $blog_id\n * @global array           $_wp_switched_stack\n * @global bool            $switched\n * @global string          $table_prefix\n * @global WP_Object_Cache $wp_object_cache\n *\n * @param int  $new_blog   The id of the blog you want to switch to. Default: current blog\n * @param bool $deprecated Deprecated argument\n * @return true Always returns True.\n */\nfunction switch_to_blog( $new_blog, $deprecated = null ) {\n\tglobal $wpdb;\n\n\tif ( empty( $new_blog ) )\n\t\t$new_blog = $GLOBALS['blog_id'];\n\n\t$GLOBALS['_wp_switched_stack'][] = $GLOBALS['blog_id'];\n\n\t/*\n\t * If we're switching to the same blog id that we're on,\n\t * set the right vars, do the associated actions, but skip\n\t * the extra unnecessary work\n\t */\n\tif ( $new_blog == $GLOBALS['blog_id'] ) {\n\t\t/**\n\t\t * Fires when the blog is switched.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param int $new_blog New blog ID.\n\t\t * @param int $new_blog Blog ID.\n\t\t */\n\t\tdo_action( 'switch_blog', $new_blog, $new_blog );\n\t\t$GLOBALS['switched'] = true;\n\t\treturn true;\n\t}\n\n\t$wpdb->set_blog_id( $new_blog );\n\t$GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();\n\t$prev_blog_id = $GLOBALS['blog_id'];\n\t$GLOBALS['blog_id'] = $new_blog;\n\n\tif ( function_exists( 'wp_cache_switch_to_blog' ) ) {\n\t\twp_cache_switch_to_blog( $new_blog );\n\t} else {\n\t\tglobal $wp_object_cache;\n\n\t\tif ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) )\n\t\t\t$global_groups = $wp_object_cache->global_groups;\n\t\telse\n\t\t\t$global_groups = false;\n\n\t\twp_cache_init();\n\n\t\tif ( function_exists( 'wp_cache_add_global_groups' ) ) {\n\t\t\tif ( is_array( $global_groups ) ) {\n\t\t\t\twp_cache_add_global_groups( $global_groups );\n\t\t\t} else {\n\t\t\t\twp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks' ) );\n\t\t\t}\n\t\t\twp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );\n\t\t}\n\t}\n\n\tif ( did_action( 'init' ) ) {\n\t\twp_roles()->reinit();\n\t\t$current_user = wp_get_current_user();\n\t\t$current_user->for_blog( $new_blog );\n\t}\n\n\t/** This filter is documented in wp-includes/ms-blogs.php */\n\tdo_action( 'switch_blog', $new_blog, $prev_blog_id );\n\t$GLOBALS['switched'] = true;\n\n\treturn true;\n}\n\n/**\n * Restore the current blog, after calling switch_to_blog()\n *\n * @see switch_to_blog()\n * @since MU\n *\n * @global wpdb            $wpdb\n * @global array           $_wp_switched_stack\n * @global int             $blog_id\n * @global bool            $switched\n * @global string          $table_prefix\n * @global WP_Object_Cache $wp_object_cache\n *\n * @return bool True on success, false if we're already on the current blog\n */\nfunction restore_current_blog() {\n\tglobal $wpdb;\n\n\tif ( empty( $GLOBALS['_wp_switched_stack'] ) )\n\t\treturn false;\n\n\t$blog = array_pop( $GLOBALS['_wp_switched_stack'] );\n\n\tif ( $GLOBALS['blog_id'] == $blog ) {\n\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\tdo_action( 'switch_blog', $blog, $blog );\n\t\t// If we still have items in the switched stack, consider ourselves still 'switched'\n\t\t$GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );\n\t\treturn true;\n\t}\n\n\t$wpdb->set_blog_id( $blog );\n\t$prev_blog_id = $GLOBALS['blog_id'];\n\t$GLOBALS['blog_id'] = $blog;\n\t$GLOBALS['table_prefix'] = $wpdb->get_blog_prefix();\n\n\tif ( function_exists( 'wp_cache_switch_to_blog' ) ) {\n\t\twp_cache_switch_to_blog( $blog );\n\t} else {\n\t\tglobal $wp_object_cache;\n\n\t\tif ( is_object( $wp_object_cache ) && isset( $wp_object_cache->global_groups ) )\n\t\t\t$global_groups = $wp_object_cache->global_groups;\n\t\telse\n\t\t\t$global_groups = false;\n\n\t\twp_cache_init();\n\n\t\tif ( function_exists( 'wp_cache_add_global_groups' ) ) {\n\t\t\tif ( is_array( $global_groups ) ) {\n\t\t\t\twp_cache_add_global_groups( $global_groups );\n\t\t\t} else {\n\t\t\t\twp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'site-lookup', 'blog-lookup', 'blog-details', 'rss', 'global-posts', 'blog-id-cache', 'networks' ) );\n\t\t\t}\n\t\t\twp_cache_add_non_persistent_groups( array( 'comment', 'counts', 'plugins' ) );\n\t\t}\n\t}\n\n\tif ( did_action( 'init' ) ) {\n\t\twp_roles()->reinit();\n\t\t$current_user = wp_get_current_user();\n\t\t$current_user->for_blog( $blog );\n\t}\n\n\t/** This filter is documented in wp-includes/ms-blogs.php */\n\tdo_action( 'switch_blog', $blog, $prev_blog_id );\n\n\t// If we still have items in the switched stack, consider ourselves still 'switched'\n\t$GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] );\n\n\treturn true;\n}\n\n/**\n * Determines if switch_to_blog() is in effect\n *\n * @since 3.5.0\n *\n * @global array $_wp_switched_stack\n *\n * @return bool True if switched, false otherwise.\n */\nfunction ms_is_switched() {\n\treturn ! empty( $GLOBALS['_wp_switched_stack'] );\n}\n\n/**\n * Check if a particular blog is archived.\n *\n * @since MU\n *\n * @param int $id The blog id\n * @return string Whether the blog is archived or not\n */\nfunction is_archived( $id ) {\n\treturn get_blog_status($id, 'archived');\n}\n\n/**\n * Update the 'archived' status of a particular blog.\n *\n * @since MU\n *\n * @param int    $id       The blog id\n * @param string $archived The new status\n * @return string $archived\n */\nfunction update_archived( $id, $archived ) {\n\tupdate_blog_status($id, 'archived', $archived);\n\treturn $archived;\n}\n\n/**\n * Update a blog details field.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $blog_id BLog ID\n * @param string $pref    A field name\n * @param string $value   Value for $pref\n * @param null   $deprecated\n * @return string|false $value\n */\nfunction update_blog_status( $blog_id, $pref, $value, $deprecated = null ) {\n\tglobal $wpdb;\n\n\tif ( null !== $deprecated  )\n\t\t_deprecated_argument( __FUNCTION__, '3.1' );\n\n\tif ( ! in_array( $pref, array( 'site_id', 'domain', 'path', 'registered', 'last_updated', 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id') ) )\n\t\treturn $value;\n\n\t$result = $wpdb->update( $wpdb->blogs, array($pref => $value, 'last_updated' => current_time('mysql', true)), array('blog_id' => $blog_id) );\n\n\tif ( false === $result )\n\t\treturn false;\n\n\trefresh_blog_details( $blog_id );\n\n\tif ( 'spam' == $pref ) {\n\t\tif ( $value == 1 ) {\n\t\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\t\tdo_action( 'make_spam_blog', $blog_id );\n\t\t} else {\n\t\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\t\tdo_action( 'make_ham_blog', $blog_id );\n\t\t}\n\t} elseif ( 'mature' == $pref ) {\n\t\tif ( $value == 1 ) {\n\t\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\t\tdo_action( 'mature_blog', $blog_id );\n\t\t} else {\n\t\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\t\tdo_action( 'unmature_blog', $blog_id );\n\t\t}\n\t} elseif ( 'archived' == $pref ) {\n\t\tif ( $value == 1 ) {\n\t\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\t\tdo_action( 'archive_blog', $blog_id );\n\t\t} else {\n\t\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\t\tdo_action( 'unarchive_blog', $blog_id );\n\t\t}\n\t} elseif ( 'deleted' == $pref ) {\n\t\tif ( $value == 1 ) {\n\t\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\t\tdo_action( 'make_delete_blog', $blog_id );\n\t\t} else {\n\t\t\t/** This filter is documented in wp-includes/ms-blogs.php */\n\t\t\tdo_action( 'make_undelete_blog', $blog_id );\n\t\t}\n\t} elseif ( 'public' == $pref ) {\n\t\t/**\n\t\t * Fires after the current blog's 'public' setting is updated.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param int    $blog_id Blog ID.\n\t\t * @param string $value   The value of blog status.\n \t\t */\n\t\tdo_action( 'update_blog_public', $blog_id, $value ); // Moved here from update_blog_public().\n\t}\n\n\treturn $value;\n}\n\n/**\n * Get a blog details field.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $id   The blog id\n * @param string $pref A field name\n * @return bool|string|null $value\n */\nfunction get_blog_status( $id, $pref ) {\n\tglobal $wpdb;\n\n\t$details = get_blog_details( $id, false );\n\tif ( $details )\n\t\treturn $details->$pref;\n\n\treturn $wpdb->get_var( $wpdb->prepare(\"SELECT %s FROM {$wpdb->blogs} WHERE blog_id = %d\", $pref, $id) );\n}\n\n/**\n * Get a list of most recently updated blogs.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param mixed $deprecated Not used\n * @param int   $start      The offset\n * @param int   $quantity   The maximum number of blogs to retrieve. Default is 40.\n * @return array The list of blogs\n */\nfunction get_last_updated( $deprecated = '', $start = 0, $quantity = 40 ) {\n\tglobal $wpdb;\n\n\tif ( ! empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, 'MU' ); // never used\n\n\treturn $wpdb->get_results( $wpdb->prepare(\"SELECT blog_id, domain, path FROM $wpdb->blogs WHERE site_id = %d AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' AND last_updated != '0000-00-00 00:00:00' ORDER BY last_updated DESC limit %d, %d\", $wpdb->siteid, $start, $quantity ) , ARRAY_A );\n}\n\n/**\n * Handler for updating the blog date when a post is published or an already published post is changed.\n *\n * @since 3.3.0\n *\n * @param string $new_status The new post status\n * @param string $old_status The old post status\n * @param object $post       Post object\n */\nfunction _update_blog_date_on_post_publish( $new_status, $old_status, $post ) {\n\t$post_type_obj = get_post_type_object( $post->post_type );\n\tif ( ! $post_type_obj || ! $post_type_obj->public ) {\n\t\treturn;\n\t}\n\n\tif ( 'publish' != $new_status && 'publish' != $old_status ) {\n\t\treturn;\n\t}\n\n\t// Post was freshly published, published post was saved, or published post was unpublished.\n\n\twpmu_update_blogs_date();\n}\n\n/**\n * Handler for updating the blog date when a published post is deleted.\n *\n * @since 3.4.0\n *\n * @param int $post_id Post ID\n */\nfunction _update_blog_date_on_post_delete( $post_id ) {\n\t$post = get_post( $post_id );\n\n\t$post_type_obj = get_post_type_object( $post->post_type );\n\tif ( ! $post_type_obj || ! $post_type_obj->public ) {\n\t\treturn;\n\t}\n\n\tif ( 'publish' != $post->post_status ) {\n\t\treturn;\n\t}\n\n\twpmu_update_blogs_date();\n}\n\n/**\n * Handler for updating the blog posts count date when a post is deleted.\n *\n * @since 4.0.0\n *\n * @param int $post_id Post ID.\n */\nfunction _update_posts_count_on_delete( $post_id ) {\n\t$post = get_post( $post_id );\n\n\tif ( ! $post || 'publish' !== $post->post_status ) {\n\t\treturn;\n\t}\n\n\tupdate_posts_count();\n}\n\n/**\n * Handler for updating the blog posts count date when a post status changes.\n *\n * @since 4.0.0\n *\n * @param string $new_status The status the post is changing to.\n * @param string $old_status The status the post is changing from.\n */\nfunction _update_posts_count_on_transition_post_status( $new_status, $old_status ) {\n\tif ( $new_status === $old_status ) {\n\t\treturn;\n\t}\n\n\tif ( 'publish' !== $new_status && 'publish' !== $old_status ) {\n\t\treturn;\n\t}\n\n\tupdate_posts_count();\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ms-default-constants.php",
    "content": "<?php\n/**\n * Defines constants and global variables that can be overridden, generally in wp-config.php.\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/**\n * Defines Multisite upload constants.\n *\n * Exists for backward compatibility with legacy file-serving through\n * wp-includes/ms-files.php (wp-content/blogs.php in MU).\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction ms_upload_constants() {\n\tglobal $wpdb;\n\n\t// This filter is attached in ms-default-filters.php but that file is not included during SHORTINIT.\n\tadd_filter( 'default_site_option_ms_files_rewriting', '__return_true' );\n\n\tif ( ! get_site_option( 'ms_files_rewriting' ) )\n\t\treturn;\n\n\t// Base uploads dir relative to ABSPATH\n\tif ( !defined( 'UPLOADBLOGSDIR' ) )\n\t\tdefine( 'UPLOADBLOGSDIR', 'wp-content/blogs.dir' );\n\n\t// Note, the main site in a post-MU network uses wp-content/uploads.\n\t// This is handled in wp_upload_dir() by ignoring UPLOADS for this case.\n\tif ( ! defined( 'UPLOADS' ) ) {\n\t\tdefine( 'UPLOADS', UPLOADBLOGSDIR . \"/{$wpdb->blogid}/files/\" );\n\n\t\t// Uploads dir relative to ABSPATH\n\t\tif ( 'wp-content/blogs.dir' == UPLOADBLOGSDIR && ! defined( 'BLOGUPLOADDIR' ) )\n\t\t\tdefine( 'BLOGUPLOADDIR', WP_CONTENT_DIR . \"/blogs.dir/{$wpdb->blogid}/files/\" );\n\t}\n}\n\n/**\n * Defines Multisite cookie constants.\n *\n * @since 3.0.0\n */\nfunction ms_cookie_constants(  ) {\n\t$current_site = get_current_site();\n\n\t/**\n\t * @since 1.2.0\n\t */\n\tif ( !defined( 'COOKIEPATH' ) )\n\t\tdefine( 'COOKIEPATH', $current_site->path );\n\n\t/**\n\t * @since 1.5.0\n\t */\n\tif ( !defined( 'SITECOOKIEPATH' ) )\n\t\tdefine( 'SITECOOKIEPATH', $current_site->path );\n\n\t/**\n\t * @since 2.6.0\n\t */\n\tif ( !defined( 'ADMIN_COOKIE_PATH' ) ) {\n\t\tif ( ! is_subdomain_install() || trim( parse_url( get_option( 'siteurl' ), PHP_URL_PATH ), '/' ) ) {\n\t\t\tdefine( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH );\n\t\t} else {\n\t\t\tdefine( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' );\n\t\t}\n\t}\n\n\t/**\n\t * @since 2.0.0\n\t */\n\tif ( !defined('COOKIE_DOMAIN') && is_subdomain_install() ) {\n\t\tif ( !empty( $current_site->cookie_domain ) )\n\t\t\tdefine('COOKIE_DOMAIN', '.' . $current_site->cookie_domain);\n\t\telse\n\t\t\tdefine('COOKIE_DOMAIN', '.' . $current_site->domain);\n\t}\n}\n\n/**\n * Defines Multisite file constants.\n *\n * Exists for backward compatibility with legacy file-serving through\n * wp-includes/ms-files.php (wp-content/blogs.php in MU).\n *\n * @since 3.0.0\n */\nfunction ms_file_constants() {\n\t/**\n\t * Optional support for X-Sendfile header\n\t * @since 3.0.0\n\t */\n\tif ( !defined( 'WPMU_SENDFILE' ) )\n\t\tdefine( 'WPMU_SENDFILE', false );\n\n\t/**\n\t * Optional support for X-Accel-Redirect header\n\t * @since 3.0.0\n\t */\n\tif ( !defined( 'WPMU_ACCEL_REDIRECT' ) )\n\t\tdefine( 'WPMU_ACCEL_REDIRECT', false );\n}\n\n/**\n * Defines Multisite subdomain constants and handles warnings and notices.\n *\n * VHOST is deprecated in favor of SUBDOMAIN_INSTALL, which is a bool.\n *\n * On first call, the constants are checked and defined. On second call,\n * we will have translations loaded and can trigger warnings easily.\n *\n * @since 3.0.0\n *\n * @staticvar bool $subdomain_error\n * @staticvar bool $subdomain_error_warn\n */\nfunction ms_subdomain_constants() {\n\tstatic $subdomain_error = null;\n\tstatic $subdomain_error_warn = null;\n\n\tif ( false === $subdomain_error ) {\n\t\treturn;\n\t}\n\n\tif ( $subdomain_error ) {\n\t\t$vhost_deprecated = __( 'The constant <code>VHOST</code> <strong>is deprecated</strong>. Use the boolean constant <code>SUBDOMAIN_INSTALL</code> in wp-config.php to enable a subdomain configuration. Use is_subdomain_install() to check whether a subdomain configuration is enabled.' );\n\t\tif ( $subdomain_error_warn ) {\n\t\t\ttrigger_error( __( '<strong>Conflicting values for the constants VHOST and SUBDOMAIN_INSTALL.</strong> The value of SUBDOMAIN_INSTALL will be assumed to be your subdomain configuration setting.' ) . ' ' . $vhost_deprecated, E_USER_WARNING );\n\t\t} else {\n\t \t\t_deprecated_argument( 'define()', '3.0', $vhost_deprecated );\n\t\t}\n\t\treturn;\n\t}\n\n\tif ( defined( 'SUBDOMAIN_INSTALL' ) && defined( 'VHOST' ) ) {\n\t\t$subdomain_error = true;\n\t\tif ( SUBDOMAIN_INSTALL !== ( 'yes' == VHOST ) ) {\n\t\t\t$subdomain_error_warn = true;\n\t\t}\n\t} elseif ( defined( 'SUBDOMAIN_INSTALL' ) ) {\n\t\t$subdomain_error = false;\n\t\tdefine( 'VHOST', SUBDOMAIN_INSTALL ? 'yes' : 'no' );\n\t} elseif ( defined( 'VHOST' ) ) {\n\t\t$subdomain_error = true;\n\t\tdefine( 'SUBDOMAIN_INSTALL', 'yes' == VHOST );\n\t} else {\n\t\t$subdomain_error = false;\n\t\tdefine( 'SUBDOMAIN_INSTALL', false );\n\t\tdefine( 'VHOST', 'no' );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ms-default-filters.php",
    "content": "<?php\n/**\n * Sets up the default filters and actions for Multisite.\n *\n * If you need to remove a default hook, this file will give you the priority\n * for which to use to remove the hook.\n *\n * Not all of the Multisite default hooks are found in ms-default-filters.php\n *\n * @package WordPress\n * @subpackage Multisite\n * @see default-filters.php\n * @since 3.0.0\n */\n\nadd_action( 'init', 'ms_subdomain_constants' );\n\n// Functions\nadd_action( 'update_option_blog_public', 'update_blog_public', 10, 2 );\nadd_filter( 'option_users_can_register', 'users_can_register_signup_filter' );\nadd_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' );\n\n// Users\nadd_filter( 'wpmu_validate_user_signup', 'signup_nonce_check' );\nadd_action( 'init', 'maybe_add_existing_user_to_blog' );\nadd_action( 'wpmu_new_user', 'newuser_notify_siteadmin' );\nadd_action( 'wpmu_activate_user', 'add_new_user_to_blog', 10, 3 );\nadd_action( 'wpmu_activate_user', 'wpmu_welcome_user_notification', 10, 3 );\nadd_action( 'after_signup_user', 'wpmu_signup_user_notification', 10, 4 );\nadd_action( 'network_site_new_created_user',   'wp_send_new_user_notifications' );\nadd_action( 'network_site_users_created_user', 'wp_send_new_user_notifications' );\nadd_action( 'network_user_new_created_user',   'wp_send_new_user_notifications' );\nadd_filter( 'sanitize_user', 'strtolower' );\n\n// Blogs\nadd_filter( 'wpmu_validate_blog_signup', 'signup_nonce_check' );\nadd_action( 'wpmu_new_blog', 'wpmu_log_new_registrations', 10, 2 );\nadd_action( 'wpmu_new_blog', 'newblog_notify_siteadmin', 10, 2 );\nadd_action( 'wpmu_activate_blog', 'wpmu_welcome_notification', 10, 5 );\nadd_action( 'after_signup_site', 'wpmu_signup_blog_notification', 10, 7 );\n\n// Register Nonce\nadd_action( 'signup_hidden_fields', 'signup_nonce_fields' );\n\n// Template\nadd_action( 'template_redirect', 'maybe_redirect_404' );\nadd_filter( 'allowed_redirect_hosts', 'redirect_this_site' );\n\n// Administration\nadd_filter( 'term_id_filter', 'global_terms', 10, 2 );\nadd_action( 'delete_post', '_update_posts_count_on_delete' );\nadd_action( 'delete_post', '_update_blog_date_on_post_delete' );\nadd_action( 'transition_post_status', '_update_blog_date_on_post_publish', 10, 3 );\nadd_action( 'transition_post_status', '_update_posts_count_on_transition_post_status', 10, 2 );\n\n// Counts\nadd_action( 'admin_init', 'wp_schedule_update_network_counts');\nadd_action( 'update_network_counts', 'wp_update_network_counts');\nforeach ( array( 'user_register', 'deleted_user', 'wpmu_new_user', 'make_spam_user', 'make_ham_user' ) as $action )\n\tadd_action( $action, 'wp_maybe_update_network_user_counts' );\nforeach ( array( 'make_spam_blog', 'make_ham_blog', 'archive_blog', 'unarchive_blog', 'make_delete_blog', 'make_undelete_blog' ) as $action )\n\tadd_action( $action, 'wp_maybe_update_network_site_counts' );\nunset( $action );\n\n// Files\nadd_filter( 'wp_upload_bits', 'upload_is_file_too_big' );\nadd_filter( 'import_upload_size_limit', 'fix_import_form_size' );\nadd_filter( 'upload_mimes', 'check_upload_mimes' );\nadd_filter( 'upload_size_limit', 'upload_size_limit_filter' );\nadd_action( 'upload_ui_over_quota', 'multisite_over_quota_message' );\n\n// Mail\nadd_action( 'phpmailer_init', 'fix_phpmailer_messageid' );\n\n// Disable somethings by default for multisite\nadd_filter( 'enable_update_services_configuration', '__return_false' );\nif ( ! defined('POST_BY_EMAIL') || ! POST_BY_EMAIL ) // back compat constant.\n\tadd_filter( 'enable_post_by_email_configuration', '__return_false' );\nif ( ! defined('EDIT_ANY_USER') || ! EDIT_ANY_USER ) // back compat constant.\n\tadd_filter( 'enable_edit_any_user_configuration', '__return_false' );\nadd_filter( 'force_filtered_html_on_import', '__return_true' );\n\n// WP_HOME and WP_SITEURL should not have any effect in MS\nremove_filter( 'option_siteurl', '_config_wp_siteurl' );\nremove_filter( 'option_home',    '_config_wp_home'    );\n\n// Some options changes should trigger blog details refresh.\nadd_action( 'update_option_blogname',   'refresh_blog_details', 10, 0 );\nadd_action( 'update_option_siteurl',    'refresh_blog_details', 10, 0 );\nadd_action( 'update_option_post_count', 'refresh_blog_details', 10, 0 );\n\n// If the network upgrade hasn't run yet, assume ms-files.php rewriting is used.\nadd_filter( 'default_site_option_ms_files_rewriting', '__return_true' );\n\n// Whitelist multisite domains for HTTP requests\nadd_filter( 'http_request_host_is_external', 'ms_allowed_http_request_hosts', 20, 2 );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ms-deprecated.php",
    "content": "<?php\n/**\n * Deprecated functions from WordPress MU and the multisite feature. You shouldn't\n * use these functions and look for the alternatives instead. The functions will be\n * removed in a later version.\n *\n * @package WordPress\n * @subpackage Deprecated\n * @since 3.0.0\n */\n\n/*\n * Deprecated functions come here to die.\n */\n\n/**\n * Get the \"dashboard blog\", the blog where users without a blog edit their profile data.\n * Dashboard blog functionality was removed in WordPress 3.1, replaced by the user admin.\n *\n * @since MU\n * @deprecated 3.1.0 Use get_blog_details()\n * @see get_blog_details()\n *\n * @return int Current site ID.\n */\nfunction get_dashboard_blog() {\n    _deprecated_function( __FUNCTION__, '3.1' );\n    if ( $blog = get_site_option( 'dashboard_blog' ) )\n        return get_blog_details( $blog );\n\n    return get_blog_details( $GLOBALS['current_site']->blog_id );\n}\n\n/**\n * Generates a random password.\n *\n * @since MU\n * @deprecated 3.0.0 Use wp_generate_password()\n * @see wp_generate_password()\n */\nfunction generate_random_password( $len = 8 ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'wp_generate_password()' );\n\treturn wp_generate_password( $len );\n}\n\n/**\n * Determine if user is a site admin.\n *\n * Plugins should use is_multisite() instead of checking if this function exists\n * to determine if multisite is enabled.\n *\n * This function must reside in a file included only if is_multisite() due to\n * legacy function_exists() checks to determine if multisite is enabled.\n *\n * @since MU\n * @deprecated 3.0.0 Use is_super_admin()\n * @see is_super_admin()\n */\nfunction is_site_admin( $user_login = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'is_super_admin()' );\n\n\tif ( empty( $user_login ) ) {\n\t\t$user_id = get_current_user_id();\n\t\tif ( !$user_id )\n\t\t\treturn false;\n\t} else {\n\t\t$user = get_user_by( 'login', $user_login );\n\t\tif ( ! $user->exists() )\n\t\t\treturn false;\n\t\t$user_id = $user->ID;\n\t}\n\n\treturn is_super_admin( $user_id );\n}\n\nif ( !function_exists( 'graceful_fail' ) ) :\n/**\n * Deprecated functionality to gracefully fail.\n *\n * @since MU\n * @deprecated 3.0.0 Use wp_die()\n * @see wp_die()\n */\nfunction graceful_fail( $message ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'wp_die()' );\n\t$message = apply_filters( 'graceful_fail', $message );\n\t$message_template = apply_filters( 'graceful_fail_template',\n'<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\"><head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n<title>Error!</title>\n<style type=\"text/css\">\nimg {\n\tborder: 0;\n}\nbody {\nline-height: 1.6em; font-family: Georgia, serif; width: 390px; margin: auto;\ntext-align: center;\n}\n.message {\n\tfont-size: 22px;\n\twidth: 350px;\n\tmargin: auto;\n}\n</style>\n</head>\n<body>\n<p class=\"message\">%s</p>\n</body>\n</html>' );\n\tdie( sprintf( $message_template, $message ) );\n}\nendif;\n\n/**\n * Deprecated functionality to retrieve user information.\n *\n * @since MU\n * @deprecated 3.0.0 Use get_user_by()\n * @see get_user_by()\n */\nfunction get_user_details( $username ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'get_user_by()' );\n\treturn get_user_by('login', $username);\n}\n\n/**\n * Deprecated functionality to clear the global post cache.\n *\n * @since MU\n * @deprecated 3.0.0 Use clean_post_cache()\n * @see clean_post_cache()\n */\nfunction clear_global_post_cache( $post_id ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'clean_post_cache()' );\n}\n\n/**\n * Deprecated functionality to determin if the current site is the main site.\n *\n * @since MU\n * @deprecated 3.0.0 Use is_main_site()\n * @see is_main_site()\n */\nfunction is_main_blog() {\n\t_deprecated_function( __FUNCTION__, '3.0', 'is_main_site()' );\n\treturn is_main_site();\n}\n\n/**\n * Deprecated functionality to validate an email address.\n *\n * @since MU\n * @deprecated 3.0.0 Use is_email()\n * @see is_email()\n */\nfunction validate_email( $email, $check_domain = true) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'is_email()' );\n\treturn is_email( $email, $check_domain );\n}\n\n/**\n * Deprecated functionality to retrieve a list of all sites.\n *\n * @since MU\n * @deprecated 3.0.0 Use wp_get_sites()\n * @see wp_get_sites()\n */\nfunction get_blog_list( $start = 0, $num = 10, $deprecated = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.0', 'wp_get_sites()' );\n\n\tglobal $wpdb;\n\t$blogs = $wpdb->get_results( $wpdb->prepare(\"SELECT blog_id, domain, path FROM $wpdb->blogs WHERE site_id = %d AND public = '1' AND archived = '0' AND mature = '0' AND spam = '0' AND deleted = '0' ORDER BY registered DESC\", $wpdb->siteid), ARRAY_A );\n\n\t$blog_list = array();\n\tforeach ( (array) $blogs as $details ) {\n\t\t$blog_list[ $details['blog_id'] ] = $details;\n\t\t$blog_list[ $details['blog_id'] ]['postcount'] = $wpdb->get_var( \"SELECT COUNT(ID) FROM \" . $wpdb->get_blog_prefix( $details['blog_id'] ). \"posts WHERE post_status='publish' AND post_type='post'\" );\n\t}\n\n\tif ( ! $blog_list ) {\n\t\treturn array();\n\t}\n\n\tif ( $num == 'all' ) {\n\t\treturn array_slice( $blog_list, $start, count( $blog_list ) );\n\t} else {\n\t\treturn array_slice( $blog_list, $start, $num );\n\t}\n}\n\n/**\n * Deprecated functionality to retrieve a list of the most active sites.\n *\n * @since MU\n * @deprecated 3.0.0\n *\n * @return array List of \"most active\" sites.\n */\nfunction get_most_active_blogs( $num = 10, $display = true ) {\n\t_deprecated_function( __FUNCTION__, '3.0' );\n\n\t$blogs = get_blog_list( 0, 'all', false ); // $blog_id -> $details\n\tif ( is_array( $blogs ) ) {\n\t\treset( $blogs );\n\t\t$most_active = array();\n\t\t$blog_list = array();\n\t\tforeach ( (array) $blogs as $key => $details ) {\n\t\t\t$most_active[ $details['blog_id'] ] = $details['postcount'];\n\t\t\t$blog_list[ $details['blog_id'] ] = $details; // array_slice() removes keys!!\n\t\t}\n\t\tarsort( $most_active );\n\t\treset( $most_active );\n\t\t$t = array();\n\t\tforeach ( (array) $most_active as $key => $details ) {\n\t\t\t$t[ $key ] = $blog_list[ $key ];\n\t\t}\n\t\tunset( $most_active );\n\t\t$most_active = $t;\n\t}\n\n\tif ( $display ) {\n\t\tif ( is_array( $most_active ) ) {\n\t\t\treset( $most_active );\n\t\t\tforeach ( (array) $most_active as $key => $details ) {\n\t\t\t\t$url = esc_url('http://' . $details['domain'] . $details['path']);\n\t\t\t\techo '<li>' . $details['postcount'] . \" <a href='$url'>$url</a></li>\";\n\t\t\t}\n\t\t}\n\t}\n\treturn array_slice( $most_active, 0, $num );\n}\n\n/**\n * Redirect a user based on $_GET or $_POST arguments.\n *\n * The function looks for redirect arguments in the following order:\n * 1) $_GET['ref']\n * 2) $_POST['ref']\n * 3) $_SERVER['HTTP_REFERER']\n * 4) $_GET['redirect']\n * 5) $_POST['redirect']\n * 6) $url\n *\n * @since MU\n * @deprecated 3.3.0 Use wp_redirect()\n * @see wp_redirect()\n *\n * @param string $url\n */\nfunction wpmu_admin_do_redirect( $url = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\t$ref = '';\n\tif ( isset( $_GET['ref'] ) )\n\t\t$ref = $_GET['ref'];\n\tif ( isset( $_POST['ref'] ) )\n\t\t$ref = $_POST['ref'];\n\n\tif ( $ref ) {\n\t\t$ref = wpmu_admin_redirect_add_updated_param( $ref );\n\t\twp_redirect( $ref );\n\t\texit();\n\t}\n\tif ( ! empty( $_SERVER['HTTP_REFERER'] ) ) {\n\t\twp_redirect( $_SERVER['HTTP_REFERER'] );\n\t\texit();\n\t}\n\n\t$url = wpmu_admin_redirect_add_updated_param( $url );\n\tif ( isset( $_GET['redirect'] ) ) {\n\t\tif ( substr( $_GET['redirect'], 0, 2 ) == 's_' )\n\t\t\t$url .= '&action=blogs&s='. esc_html( substr( $_GET['redirect'], 2 ) );\n\t} elseif ( isset( $_POST['redirect'] ) ) {\n\t\t$url = wpmu_admin_redirect_add_updated_param( $_POST['redirect'] );\n\t}\n\twp_redirect( $url );\n\texit();\n}\n\n/**\n * Adds an 'updated=true' argument to a URL.\n *\n * @since MU\n * @deprecated 3.3.0 Use add_query_arg()\n * @see add_query_arg()\n *\n * @param string $url\n * @return string\n */\nfunction wpmu_admin_redirect_add_updated_param( $url = '' ) {\n\t_deprecated_function( __FUNCTION__, '3.3' );\n\n\tif ( strpos( $url, 'updated=true' ) === false ) {\n\t\tif ( strpos( $url, '?' ) === false )\n\t\t\treturn $url . '?updated=true';\n\t\telse\n\t\t\treturn $url . '&updated=true';\n\t}\n\treturn $url;\n}\n\n/**\n * Get a numeric user ID from either an email address or a login.\n *\n * A numeric string is considered to be an existing user ID\n * and is simply returned as such.\n *\n * @since MU\n * @deprecated 3.6.0 Use get_user_by()\n * @see get_user_by()\n *\n * @param string $string Either an email address or a login.\n * @return int\n */\nfunction get_user_id_from_string( $string ) {\n\t_deprecated_function( __FUNCTION__, '3.6', 'get_user_by()' );\n\n\tif ( is_email( $string ) )\n\t\t$user = get_user_by( 'email', $string );\n\telseif ( is_numeric( $string ) )\n\t\treturn $string;\n\telse\n\t\t$user = get_user_by( 'login', $string );\n\n\tif ( $user )\n\t\treturn $user->ID;\n\treturn 0;\n}\n\n/**\n * Get a full blog URL, given a domain and a path.\n *\n * @since MU\n * @deprecated 3.7.0\n *\n * @param string $domain\n * @param string $path\n * @return string\n */\nfunction get_blogaddress_by_domain( $domain, $path ) {\n\t_deprecated_function( __FUNCTION__, '3.7' );\n\n\tif ( is_subdomain_install() ) {\n\t\t$url = \"http://\" . $domain.$path;\n\t} else {\n\t\tif ( $domain != $_SERVER['HTTP_HOST'] ) {\n\t\t\t$blogname = substr( $domain, 0, strpos( $domain, '.' ) );\n\t\t\t$url = 'http://' . substr( $domain, strpos( $domain, '.' ) + 1 ) . $path;\n\t\t\t// we're not installing the main blog\n\t\t\tif ( $blogname != 'www.' )\n\t\t\t\t$url .= $blogname . '/';\n\t\t} else { // main blog\n\t\t\t$url = 'http://' . $domain . $path;\n\t\t}\n\t}\n\treturn esc_url_raw( $url );\n}\n\n/**\n * Create an empty blog.\n *\n * @since MU 1.0\n * @deprecated 4.4.0\n *\n * @param string $domain       The new blog's domain.\n * @param string $path         The new blog's path.\n * @param string $weblog_title The new blog's title.\n * @param int    $site_id      Optional. Defaults to 1.\n * @return string|int The ID of the newly created blog\n */\nfunction create_empty_blog( $domain, $path, $weblog_title, $site_id = 1 ) {\n\t_deprecated_function( __FUNCTION__, '4.4' );\n\n\tif ( empty($path) )\n\t\t$path = '/';\n\n\t// Check if the domain has been used already. We should return an error message.\n\tif ( domain_exists($domain, $path, $site_id) )\n\t\treturn __( '<strong>ERROR</strong>: Site URL already taken.' );\n\n\t// Need to back up wpdb table names, and create a new wp_blogs entry for new blog.\n\t// Need to get blog_id from wp_blogs, and create new table names.\n\t// Must restore table names at the end of function.\n\n\tif ( ! $blog_id = insert_blog($domain, $path, $site_id) )\n\t\treturn __( '<strong>ERROR</strong>: problem creating site entry.' );\n\n\tswitch_to_blog($blog_id);\n\tinstall_blog($blog_id);\n\trestore_current_blog();\n\n\treturn $blog_id;\n}\n\n/**\n * Get the admin for a domain/path combination.\n *\n * @since MU 1.0\n * @deprecated 4.4.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $sitedomain Optional. Site domain.\n * @param string $path       Optional. Site path.\n * @return array|false The network admins\n */\nfunction get_admin_users_for_domain( $sitedomain = '', $path = '' ) {\n\t_deprecated_function( __FUNCTION__, '4.4' );\n\n\tglobal $wpdb;\n\n\tif ( ! $sitedomain )\n\t\t$site_id = $wpdb->siteid;\n\telse\n\t\t$site_id = $wpdb->get_var( $wpdb->prepare( \"SELECT id FROM $wpdb->site WHERE domain = %s AND path = %s\", $sitedomain, $path ) );\n\n\tif ( $site_id )\n\t\treturn $wpdb->get_results( $wpdb->prepare( \"SELECT u.ID, u.user_login, u.user_pass FROM $wpdb->users AS u, $wpdb->sitemeta AS sm WHERE sm.meta_key = 'admin_user_id' AND u.ID = sm.meta_value AND sm.site_id = %d\", $site_id ), ARRAY_A );\n\n\treturn false;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ms-files.php",
    "content": "<?php\n/**\n * Multisite upload handler.\n *\n * @since 3.0.0\n *\n * @package WordPress\n * @subpackage Multisite\n */\n\ndefine( 'SHORTINIT', true );\nrequire_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' );\n\nif ( !is_multisite() )\n\tdie( 'Multisite support not enabled' );\n\nms_file_constants();\n\nerror_reporting( 0 );\n\nif ( $current_blog->archived == '1' || $current_blog->spam == '1' || $current_blog->deleted == '1' ) {\n\tstatus_header( 404 );\n\tdie( '404 &#8212; File not found.' );\n}\n\n$file = rtrim( BLOGUPLOADDIR, '/' ) . '/' . str_replace( '..', '', $_GET[ 'file' ] );\nif ( !is_file( $file ) ) {\n\tstatus_header( 404 );\n\tdie( '404 &#8212; File not found.' );\n}\n\n$mime = wp_check_filetype( $file );\nif ( false === $mime[ 'type' ] && function_exists( 'mime_content_type' ) )\n\t$mime[ 'type' ] = mime_content_type( $file );\n\nif ( $mime[ 'type' ] )\n\t$mimetype = $mime[ 'type' ];\nelse\n\t$mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 );\n\nheader( 'Content-Type: ' . $mimetype ); // always send this\nif ( false === strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS' ) )\n\theader( 'Content-Length: ' . filesize( $file ) );\n\n// Optional support for X-Sendfile and X-Accel-Redirect\nif ( WPMU_ACCEL_REDIRECT ) {\n\theader( 'X-Accel-Redirect: ' . str_replace( WP_CONTENT_DIR, '', $file ) );\n\texit;\n} elseif ( WPMU_SENDFILE ) {\n\theader( 'X-Sendfile: ' . $file );\n\texit;\n}\n\n$last_modified = gmdate( 'D, d M Y H:i:s', filemtime( $file ) );\n$etag = '\"' . md5( $last_modified ) . '\"';\nheader( \"Last-Modified: $last_modified GMT\" );\nheader( 'ETag: ' . $etag );\nheader( 'Expires: ' . gmdate( 'D, d M Y H:i:s', time() + 100000000 ) . ' GMT' );\n\n// Support for Conditional GET - use stripslashes to avoid formatting.php dependency\n$client_etag = isset( $_SERVER['HTTP_IF_NONE_MATCH'] ) ? stripslashes( $_SERVER['HTTP_IF_NONE_MATCH'] ) : false;\n\nif ( ! isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) )\n\t$_SERVER['HTTP_IF_MODIFIED_SINCE'] = false;\n\n$client_last_modified = trim( $_SERVER['HTTP_IF_MODIFIED_SINCE'] );\n// If string is empty, return 0. If not, attempt to parse into a timestamp\n$client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0;\n\n// Make a timestamp for our most recent modification...\n$modified_timestamp = strtotime($last_modified);\n\nif ( ( $client_last_modified && $client_etag )\n\t? ( ( $client_modified_timestamp >= $modified_timestamp) && ( $client_etag == $etag ) )\n\t: ( ( $client_modified_timestamp >= $modified_timestamp) || ( $client_etag == $etag ) )\n\t) {\n\tstatus_header( 304 );\n\texit;\n}\n\n// If we made it this far, just serve the file\nreadfile( $file );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ms-functions.php",
    "content": "<?php\n/**\n * Multisite WordPress API\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/**\n * Gets the network's site and user counts.\n *\n * @since MU 1.0\n *\n * @return array Site and user count for the network.\n */\nfunction get_sitestats() {\n\t$stats = array(\n\t\t'blogs' => get_blog_count(),\n\t\t'users' => get_user_count(),\n\t);\n\n\treturn $stats;\n}\n\n/**\n * Get one of a user's active blogs\n *\n * Returns the user's primary blog, if they have one and\n * it is active. If it's inactive, function returns another\n * active blog of the user. If none are found, the user\n * is added as a Subscriber to the Dashboard Blog and that blog\n * is returned.\n *\n * @since MU 1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $user_id The unique ID of the user\n * @return object|void The blog object\n */\nfunction get_active_blog_for_user( $user_id ) {\n\tglobal $wpdb;\n\t$blogs = get_blogs_of_user( $user_id );\n\tif ( empty( $blogs ) )\n\t\treturn;\n\n\tif ( !is_multisite() )\n\t\treturn $blogs[$wpdb->blogid];\n\n\t$primary_blog = get_user_meta( $user_id, 'primary_blog', true );\n\t$first_blog = current($blogs);\n\tif ( false !== $primary_blog ) {\n\t\tif ( ! isset( $blogs[ $primary_blog ] ) ) {\n\t\t\tupdate_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id );\n\t\t\t$primary = get_blog_details( $first_blog->userblog_id );\n\t\t} else {\n\t\t\t$primary = get_blog_details( $primary_blog );\n\t\t}\n\t} else {\n\t\t//TODO Review this call to add_user_to_blog too - to get here the user must have a role on this blog?\n\t\tadd_user_to_blog( $first_blog->userblog_id, $user_id, 'subscriber' );\n\t\tupdate_user_meta( $user_id, 'primary_blog', $first_blog->userblog_id );\n\t\t$primary = $first_blog;\n\t}\n\n\tif ( ( ! is_object( $primary ) ) || ( $primary->archived == 1 || $primary->spam == 1 || $primary->deleted == 1 ) ) {\n\t\t$blogs = get_blogs_of_user( $user_id, true ); // if a user's primary blog is shut down, check their other blogs.\n\t\t$ret = false;\n\t\tif ( is_array( $blogs ) && count( $blogs ) > 0 ) {\n\t\t\tforeach ( (array) $blogs as $blog_id => $blog ) {\n\t\t\t\tif ( $blog->site_id != $wpdb->siteid )\n\t\t\t\t\tcontinue;\n\t\t\t\t$details = get_blog_details( $blog_id );\n\t\t\t\tif ( is_object( $details ) && $details->archived == 0 && $details->spam == 0 && $details->deleted == 0 ) {\n\t\t\t\t\t$ret = $blog;\n\t\t\t\t\tif ( get_user_meta( $user_id , 'primary_blog', true ) != $blog_id )\n\t\t\t\t\t\tupdate_user_meta( $user_id, 'primary_blog', $blog_id );\n\t\t\t\t\tif ( !get_user_meta($user_id , 'source_domain', true) )\n\t\t\t\t\t\tupdate_user_meta( $user_id, 'source_domain', $blog->domain );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t\treturn $ret;\n\t} else {\n\t\treturn $primary;\n\t}\n}\n\n/**\n * The number of active users in your installation.\n *\n * The count is cached and updated twice daily. This is not a live count.\n *\n * @since MU 2.7\n *\n * @return int\n */\nfunction get_user_count() {\n\treturn get_site_option( 'user_count' );\n}\n\n/**\n * The number of active sites on your installation.\n *\n * The count is cached and updated twice daily. This is not a live count.\n *\n * @since MU 1.0\n *\n * @param int $network_id Deprecated, not supported.\n * @return int\n */\nfunction get_blog_count( $network_id = 0 ) {\n\tif ( func_num_args() )\n\t\t_deprecated_argument( __FUNCTION__, '3.1' );\n\n\treturn get_site_option( 'blog_count' );\n}\n\n/**\n * Get a blog post from any site on the network.\n *\n * @since MU 1.0\n *\n * @param int $blog_id ID of the blog.\n * @param int $post_id ID of the post you're looking for.\n * @return WP_Post|null WP_Post on success or null on failure\n */\nfunction get_blog_post( $blog_id, $post_id ) {\n\tswitch_to_blog( $blog_id );\n\t$post = get_post( $post_id );\n\trestore_current_blog();\n\n\treturn $post;\n}\n\n/**\n * Add a user to a blog.\n *\n * Use the 'add_user_to_blog' action to fire an event when\n * users are added to a blog.\n *\n * @since MU 1.0\n *\n * @param int    $blog_id ID of the blog you're adding the user to.\n * @param int    $user_id ID of the user you're adding.\n * @param string $role    The role you want the user to have\n * @return true|WP_Error\n */\nfunction add_user_to_blog( $blog_id, $user_id, $role ) {\n\tswitch_to_blog($blog_id);\n\n\t$user = get_userdata( $user_id );\n\n\tif ( ! $user ) {\n\t\trestore_current_blog();\n\t\treturn new WP_Error( 'user_does_not_exist', __( 'The requested user does not exist.' ) );\n\t}\n\n\tif ( !get_user_meta($user_id, 'primary_blog', true) ) {\n\t\tupdate_user_meta($user_id, 'primary_blog', $blog_id);\n\t\t$details = get_blog_details($blog_id);\n\t\tupdate_user_meta($user_id, 'source_domain', $details->domain);\n\t}\n\n\t$user->set_role($role);\n\n\t/**\n\t * Fires immediately after a user is added to a site.\n\t *\n\t * @since MU\n\t *\n\t * @param int    $user_id User ID.\n\t * @param string $role    User role.\n\t * @param int    $blog_id Blog ID.\n\t */\n\tdo_action( 'add_user_to_blog', $user_id, $role, $blog_id );\n\twp_cache_delete( $user_id, 'users' );\n\twp_cache_delete( $blog_id . '_user_count', 'blog-details' );\n\trestore_current_blog();\n\treturn true;\n}\n\n/**\n * Remove a user from a blog.\n *\n * Use the 'remove_user_from_blog' action to fire an event when\n * users are removed from a blog.\n *\n * Accepts an optional $reassign parameter, if you want to\n * reassign the user's blog posts to another user upon removal.\n *\n * @since MU 1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $user_id  ID of the user you're removing.\n * @param int    $blog_id  ID of the blog you're removing the user from.\n * @param string $reassign Optional. A user to whom to reassign posts.\n * @return true|WP_Error\n */\nfunction remove_user_from_blog($user_id, $blog_id = '', $reassign = '') {\n\tglobal $wpdb;\n\tswitch_to_blog($blog_id);\n\t$user_id = (int) $user_id;\n\t/**\n\t * Fires before a user is removed from a site.\n\t *\n\t * @since MU\n\t *\n\t * @param int $user_id User ID.\n\t * @param int $blog_id Blog ID.\n\t */\n\tdo_action( 'remove_user_from_blog', $user_id, $blog_id );\n\n\t// If being removed from the primary blog, set a new primary if the user is assigned\n\t// to multiple blogs.\n\t$primary_blog = get_user_meta($user_id, 'primary_blog', true);\n\tif ( $primary_blog == $blog_id ) {\n\t\t$new_id = '';\n\t\t$new_domain = '';\n\t\t$blogs = get_blogs_of_user($user_id);\n\t\tforeach ( (array) $blogs as $blog ) {\n\t\t\tif ( $blog->userblog_id == $blog_id )\n\t\t\t\tcontinue;\n\t\t\t$new_id = $blog->userblog_id;\n\t\t\t$new_domain = $blog->domain;\n\t\t\tbreak;\n\t\t}\n\n\t\tupdate_user_meta($user_id, 'primary_blog', $new_id);\n\t\tupdate_user_meta($user_id, 'source_domain', $new_domain);\n\t}\n\n\t// wp_revoke_user($user_id);\n\t$user = get_userdata( $user_id );\n\tif ( ! $user ) {\n\t\trestore_current_blog();\n\t\treturn new WP_Error('user_does_not_exist', __('That user does not exist.'));\n\t}\n\n\t$user->remove_all_caps();\n\n\t$blogs = get_blogs_of_user($user_id);\n\tif ( count($blogs) == 0 ) {\n\t\tupdate_user_meta($user_id, 'primary_blog', '');\n\t\tupdate_user_meta($user_id, 'source_domain', '');\n\t}\n\n\tif ( $reassign != '' ) {\n\t\t$reassign = (int) $reassign;\n\t\t$post_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT ID FROM $wpdb->posts WHERE post_author = %d\", $user_id ) );\n\t\t$link_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT link_id FROM $wpdb->links WHERE link_owner = %d\", $user_id ) );\n\n\t\tif ( ! empty( $post_ids ) ) {\n\t\t\t$wpdb->query( $wpdb->prepare( \"UPDATE $wpdb->posts SET post_author = %d WHERE post_author = %d\", $reassign, $user_id ) );\n\t\t\tarray_walk( $post_ids, 'clean_post_cache' );\n\t\t}\n\n\t\tif ( ! empty( $link_ids ) ) {\n\t\t\t$wpdb->query( $wpdb->prepare( \"UPDATE $wpdb->links SET link_owner = %d WHERE link_owner = %d\", $reassign, $user_id ) );\n\t\t\tarray_walk( $link_ids, 'clean_bookmark_cache' );\n\t\t}\n\t}\n\n\trestore_current_blog();\n\n\treturn true;\n}\n\n/**\n * Get the permalink for a post on another blog.\n *\n * @since MU 1.0\n *\n * @param int $blog_id ID of the source blog.\n * @param int $post_id ID of the desired post.\n * @return string The post's permalink\n */\nfunction get_blog_permalink( $blog_id, $post_id ) {\n\tswitch_to_blog( $blog_id );\n\t$link = get_permalink( $post_id );\n\trestore_current_blog();\n\n\treturn $link;\n}\n\n/**\n * Get a blog's numeric ID from its URL.\n *\n * On a subdirectory installation like example.com/blog1/,\n * $domain will be the root 'example.com' and $path the\n * subdirectory '/blog1/'. With subdomains like blog1.example.com,\n * $domain is 'blog1.example.com' and $path is '/'.\n *\n * @since MU 2.6.5\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $domain\n * @param string $path   Optional. Not required for subdomain installations.\n * @return int 0 if no blog found, otherwise the ID of the matching blog\n */\nfunction get_blog_id_from_url( $domain, $path = '/' ) {\n\tglobal $wpdb;\n\n\t$domain = strtolower( $domain );\n\t$path = strtolower( $path );\n\t$id = wp_cache_get( md5( $domain . $path ), 'blog-id-cache' );\n\n\tif ( $id == -1 ) // blog does not exist\n\t\treturn 0;\n\telseif ( $id )\n\t\treturn (int) $id;\n\n\t$id = $wpdb->get_var( $wpdb->prepare( \"SELECT blog_id FROM $wpdb->blogs WHERE domain = %s and path = %s /* get_blog_id_from_url */\", $domain, $path ) );\n\n\tif ( ! $id ) {\n\t\twp_cache_set( md5( $domain . $path ), -1, 'blog-id-cache' );\n\t\treturn 0;\n\t}\n\n\twp_cache_set( md5( $domain . $path ), $id, 'blog-id-cache' );\n\n\treturn $id;\n}\n\n// Admin functions\n\n/**\n * Checks an email address against a list of banned domains.\n *\n * This function checks against the Banned Email Domains list\n * at wp-admin/network/settings.php. The check is only run on\n * self-registrations; user creation at wp-admin/network/users.php\n * bypasses this check.\n *\n * @since MU\n *\n * @param string $user_email The email provided by the user at registration.\n * @return bool Returns true when the email address is banned.\n */\nfunction is_email_address_unsafe( $user_email ) {\n\t$banned_names = get_site_option( 'banned_email_domains' );\n\tif ( $banned_names && ! is_array( $banned_names ) )\n\t\t$banned_names = explode( \"\\n\", $banned_names );\n\n\t$is_email_address_unsafe = false;\n\n\tif ( $banned_names && is_array( $banned_names ) ) {\n\t\t$banned_names = array_map( 'strtolower', $banned_names );\n\t\t$normalized_email = strtolower( $user_email );\n\n\t\tlist( $email_local_part, $email_domain ) = explode( '@', $normalized_email );\n\n\t\tforeach ( $banned_names as $banned_domain ) {\n\t\t\tif ( ! $banned_domain )\n\t\t\t\tcontinue;\n\n\t\t\tif ( $email_domain == $banned_domain ) {\n\t\t\t\t$is_email_address_unsafe = true;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t$dotted_domain = \".$banned_domain\";\n\t\t\tif ( $dotted_domain === substr( $normalized_email, -strlen( $dotted_domain ) ) ) {\n\t\t\t\t$is_email_address_unsafe = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter whether an email address is unsafe.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param bool   $is_email_address_unsafe Whether the email address is \"unsafe\". Default false.\n\t * @param string $user_email              User email address.\n\t */\n\treturn apply_filters( 'is_email_address_unsafe', $is_email_address_unsafe, $user_email );\n}\n\n/**\n * Sanitize and validate data required for a user sign-up.\n *\n * Verifies the validity and uniqueness of user names and user email addresses,\n * and checks email addresses against admin-provided domain whitelists and blacklists.\n *\n * The {@see 'wpmu_validate_user_signup'} hook provides an easy way to modify the sign-up\n * process. The value $result, which is passed to the hook, contains both the user-provided\n * info and the error messages created by the function. {@see 'wpmu_validate_user_signup'}\n * allows you to process the data in any way you'd like, and unset the relevant errors if\n * necessary.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $user_name  The login name provided by the user.\n * @param string $user_email The email provided by the user.\n * @return array Contains username, email, and error messages.\n */\nfunction wpmu_validate_user_signup($user_name, $user_email) {\n\tglobal $wpdb;\n\n\t$errors = new WP_Error();\n\n\t$orig_username = $user_name;\n\t$user_name = preg_replace( '/\\s+/', '', sanitize_user( $user_name, true ) );\n\n\tif ( $user_name != $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) {\n\t\t$errors->add( 'user_name', __( 'Usernames can only contain lowercase letters (a-z) and numbers.' ) );\n\t\t$user_name = $orig_username;\n\t}\n\n\t$user_email = sanitize_email( $user_email );\n\n\tif ( empty( $user_name ) )\n\t   \t$errors->add('user_name', __( 'Please enter a username.' ) );\n\n\t$illegal_names = get_site_option( 'illegal_names' );\n\tif ( ! is_array( $illegal_names ) ) {\n\t\t$illegal_names = array(  'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' );\n\t\tadd_site_option( 'illegal_names', $illegal_names );\n\t}\n\tif ( in_array( $user_name, $illegal_names ) ) {\n\t\t$errors->add( 'user_name',  __( 'Sorry, that username is not allowed.' ) );\n\t}\n\n\t/** This filter is documented in wp-includes/user.php */\n\t$illegal_logins = (array) apply_filters( 'illegal_user_logins', array() );\n\n\tif ( in_array( strtolower( $user_name ), array_map( 'strtolower', $illegal_logins ) ) ) {\n\t\t$errors->add( 'user_name',  __( 'Sorry, that username is not allowed.' ) );\n\t}\n\n\tif ( is_email_address_unsafe( $user_email ) )\n\t\t$errors->add('user_email',  __('You cannot use that email address to signup. We are having problems with them blocking some of our email. Please use another email provider.'));\n\n\tif ( strlen( $user_name ) < 4 )\n\t\t$errors->add('user_name',  __( 'Username must be at least 4 characters.' ) );\n\n\tif ( strlen( $user_name ) > 60 ) {\n\t\t$errors->add( 'user_name', __( 'Username may not be longer than 60 characters.' ) );\n\t}\n\n\t// all numeric?\n\tif ( preg_match( '/^[0-9]*$/', $user_name ) )\n\t\t$errors->add('user_name', __('Sorry, usernames must have letters too!'));\n\n\tif ( !is_email( $user_email ) )\n\t\t$errors->add('user_email', __( 'Please enter a valid email address.' ) );\n\n\t$limited_email_domains = get_site_option( 'limited_email_domains' );\n\tif ( is_array( $limited_email_domains ) && ! empty( $limited_email_domains ) ) {\n\t\t$emaildomain = substr( $user_email, 1 + strpos( $user_email, '@' ) );\n\t\tif ( ! in_array( $emaildomain, $limited_email_domains ) ) {\n\t\t\t$errors->add('user_email', __('Sorry, that email address is not allowed!'));\n\t\t}\n\t}\n\n\t// Check if the username has been used already.\n\tif ( username_exists($user_name) )\n\t\t$errors->add( 'user_name', __( 'Sorry, that username already exists!' ) );\n\n\t// Check if the email address has been used already.\n\tif ( email_exists($user_email) )\n\t\t$errors->add( 'user_email', __( 'Sorry, that email address is already used!' ) );\n\n\t// Has someone already signed up for this username?\n\t$signup = $wpdb->get_row( $wpdb->prepare(\"SELECT * FROM $wpdb->signups WHERE user_login = %s\", $user_name) );\n\tif ( $signup != null ) {\n\t\t$registered_at =  mysql2date('U', $signup->registered);\n\t\t$now = current_time( 'timestamp', true );\n\t\t$diff = $now - $registered_at;\n\t\t// If registered more than two days ago, cancel registration and let this signup go through.\n\t\tif ( $diff > 2 * DAY_IN_SECONDS )\n\t\t\t$wpdb->delete( $wpdb->signups, array( 'user_login' => $user_name ) );\n\t\telse\n\t\t\t$errors->add('user_name', __('That username is currently reserved but may be available in a couple of days.'));\n\t}\n\n\t$signup = $wpdb->get_row( $wpdb->prepare(\"SELECT * FROM $wpdb->signups WHERE user_email = %s\", $user_email) );\n\tif ( $signup != null ) {\n\t\t$diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered);\n\t\t// If registered more than two days ago, cancel registration and let this signup go through.\n\t\tif ( $diff > 2 * DAY_IN_SECONDS )\n\t\t\t$wpdb->delete( $wpdb->signups, array( 'user_email' => $user_email ) );\n\t\telse\n\t\t\t$errors->add('user_email', __('That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing.'));\n\t}\n\n\t$result = array('user_name' => $user_name, 'orig_username' => $orig_username, 'user_email' => $user_email, 'errors' => $errors);\n\n\t/**\n\t * Filter the validated user registration details.\n\t *\n\t * This does not allow you to override the username or email of the user during\n\t * registration. The values are solely used for validation and error handling.\n\t *\n\t * @since MU\n\t *\n\t * @param array $result {\n\t *     The array of user name, email and the error messages.\n\t *\n\t *     @type string   $user_name     Sanitized and unique username.\n\t *     @type string   $orig_username Original username.\n\t *     @type string   $user_email    User email address.\n\t *     @type WP_Error $errors        WP_Error object containing any errors found.\n\t * }\n\t */\n\treturn apply_filters( 'wpmu_validate_user_signup', $result );\n}\n\n/**\n * Processes new site registrations.\n *\n * Checks the data provided by the user during blog signup. Verifies\n * the validity and uniqueness of blog paths and domains.\n *\n * This function prevents the current user from registering a new site\n * with a blogname equivalent to another user's login name. Passing the\n * $user parameter to the function, where $user is the other user, is\n * effectively an override of this limitation.\n *\n * Filter 'wpmu_validate_blog_signup' if you want to modify\n * the way that WordPress validates new site signups.\n *\n * @since MU\n *\n * @global wpdb   $wpdb\n * @global string $domain\n *\n * @param string         $blogname   The blog name provided by the user. Must be unique.\n * @param string         $blog_title The blog title provided by the user.\n * @param WP_User|string $user       Optional. The user object to check against the new site name.\n * @return array Contains the new site data and error messages.\n */\nfunction wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) {\n\tglobal $wpdb, $domain;\n\n\t$current_site = get_current_site();\n\t$base = $current_site->path;\n\n\t$blog_title = strip_tags( $blog_title );\n\n\t$errors = new WP_Error();\n\t$illegal_names = get_site_option( 'illegal_names' );\n\tif ( $illegal_names == false ) {\n\t\t$illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' );\n\t\tadd_site_option( 'illegal_names', $illegal_names );\n\t}\n\n\t/*\n\t * On sub dir installs, some names are so illegal, only a filter can\n\t * spring them from jail.\n\t */\n\tif ( ! is_subdomain_install() ) {\n\t\t$illegal_names = array_merge( $illegal_names, get_subdirectory_reserved_names() );\n\t}\n\n\tif ( empty( $blogname ) )\n\t\t$errors->add('blogname', __( 'Please enter a site name.' ) );\n\n\tif ( preg_match( '/[^a-z0-9]+/', $blogname ) ) {\n\t\t$errors->add( 'blogname', __( 'Site names can only contain lowercase letters (a-z) and numbers.' ) );\n\t}\n\n\tif ( in_array( $blogname, $illegal_names ) )\n\t\t$errors->add('blogname',  __( 'That name is not allowed.' ) );\n\n\tif ( strlen( $blogname ) < 4 && !is_super_admin() )\n\t\t$errors->add('blogname',  __( 'Site name must be at least 4 characters.' ) );\n\n\t// do not allow users to create a blog that conflicts with a page on the main blog.\n\tif ( !is_subdomain_install() && $wpdb->get_var( $wpdb->prepare( \"SELECT post_name FROM \" . $wpdb->get_blog_prefix( $current_site->blog_id ) . \"posts WHERE post_type = 'page' AND post_name = %s\", $blogname ) ) )\n\t\t$errors->add( 'blogname', __( 'Sorry, you may not use that site name.' ) );\n\n\t// all numeric?\n\tif ( preg_match( '/^[0-9]*$/', $blogname ) )\n\t\t$errors->add('blogname', __('Sorry, site names must have letters too!'));\n\n\t/**\n\t * Filter the new site name during registration.\n\t *\n\t * The name is the site's subdomain or the site's subdirectory\n\t * path depending on the network settings.\n\t *\n\t * @since MU\n\t *\n\t * @param string $blogname Site name.\n\t */\n\t$blogname = apply_filters( 'newblogname', $blogname );\n\n\t$blog_title = wp_unslash(  $blog_title );\n\n\tif ( empty( $blog_title ) )\n\t\t$errors->add('blog_title', __( 'Please enter a site title.' ) );\n\n\t// Check if the domain/path has been used already.\n\tif ( is_subdomain_install() ) {\n\t\t$mydomain = $blogname . '.' . preg_replace( '|^www\\.|', '', $domain );\n\t\t$path = $base;\n\t} else {\n\t\t$mydomain = \"$domain\";\n\t\t$path = $base.$blogname.'/';\n\t}\n\tif ( domain_exists($mydomain, $path, $current_site->id) )\n\t\t$errors->add( 'blogname', __( 'Sorry, that site already exists!' ) );\n\n\tif ( username_exists( $blogname ) ) {\n\t\tif ( ! is_object( $user ) || ( is_object($user) && ( $user->user_login != $blogname ) ) )\n\t\t\t$errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) );\n\t}\n\n\t// Has someone already signed up for this domain?\n\t$signup = $wpdb->get_row( $wpdb->prepare(\"SELECT * FROM $wpdb->signups WHERE domain = %s AND path = %s\", $mydomain, $path) ); // TODO: Check email too?\n\tif ( ! empty($signup) ) {\n\t\t$diff = current_time( 'timestamp', true ) - mysql2date('U', $signup->registered);\n\t\t// If registered more than two days ago, cancel registration and let this signup go through.\n\t\tif ( $diff > 2 * DAY_IN_SECONDS )\n\t\t\t$wpdb->delete( $wpdb->signups, array( 'domain' => $mydomain , 'path' => $path ) );\n\t\telse\n\t\t\t$errors->add('blogname', __('That site is currently reserved but may be available in a couple days.'));\n\t}\n\n\t$result = array('domain' => $mydomain, 'path' => $path, 'blogname' => $blogname, 'blog_title' => $blog_title, 'user' => $user, 'errors' => $errors);\n\n\t/**\n\t * Filter site details and error messages following registration.\n\t *\n\t * @since MU\n\t *\n\t * @param array $result {\n\t *     Array of domain, path, blog name, blog title, user and error messages.\n\t *\n\t *     @type string         $domain     Domain for the site.\n\t *     @type string         $path       Path for the site. Used in subdirectory installs.\n\t *     @type string         $blogname   The unique site name (slug).\n\t *     @type string         $blog_title Blog title.\n\t *     @type string|WP_User $user       By default, an empty string. A user object if provided.\n\t *     @type WP_Error       $errors     WP_Error containing any errors found.\n\t * }\n\t */\n\treturn apply_filters( 'wpmu_validate_blog_signup', $result );\n}\n\n/**\n * Record site signup information for future activation.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $domain     The requested domain.\n * @param string $path       The requested path.\n * @param string $title      The requested site title.\n * @param string $user       The user's requested login name.\n * @param string $user_email The user's email address.\n * @param array  $meta       By default, contains the requested privacy setting and lang_id.\n */\nfunction wpmu_signup_blog( $domain, $path, $title, $user, $user_email, $meta = array() )  {\n\tglobal $wpdb;\n\n\t$key = substr( md5( time() . rand() . $domain ), 0, 16 );\n\t$meta = serialize($meta);\n\n\t$wpdb->insert( $wpdb->signups, array(\n\t\t'domain' => $domain,\n\t\t'path' => $path,\n\t\t'title' => $title,\n\t\t'user_login' => $user,\n\t\t'user_email' => $user_email,\n\t\t'registered' => current_time('mysql', true),\n\t\t'activation_key' => $key,\n\t\t'meta' => $meta\n\t) );\n\n\t/**\n\t * Fires after site signup information has been written to the database.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $domain     The requested domain.\n\t * @param string $path       The requested path.\n\t * @param string $title      The requested site title.\n\t * @param string $user       The user's requested login name.\n\t * @param string $user_email The user's email address.\n\t * @param string $key        The user's activation key\n\t * @param array  $meta       By default, contains the requested privacy setting and lang_id.\n\t */\n\tdo_action( 'after_signup_site', $domain, $path, $title, $user, $user_email, $key, $meta );\n}\n\n/**\n * Record user signup information for future activation.\n *\n * This function is used when user registration is open but\n * new site registration is not.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $user       The user's requested login name.\n * @param string $user_email The user's email address.\n * @param array  $meta       By default, this is an empty array.\n */\nfunction wpmu_signup_user( $user, $user_email, $meta = array() ) {\n\tglobal $wpdb;\n\n\t// Format data\n\t$user = preg_replace( '/\\s+/', '', sanitize_user( $user, true ) );\n\t$user_email = sanitize_email( $user_email );\n\t$key = substr( md5( time() . rand() . $user_email ), 0, 16 );\n\t$meta = serialize($meta);\n\n\t$wpdb->insert( $wpdb->signups, array(\n\t\t'domain' => '',\n\t\t'path' => '',\n\t\t'title' => '',\n\t\t'user_login' => $user,\n\t\t'user_email' => $user_email,\n\t\t'registered' => current_time('mysql', true),\n\t\t'activation_key' => $key,\n\t\t'meta' => $meta\n\t) );\n\n\t/**\n\t * Fires after a user's signup information has been written to the database.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $user       The user's requested login name.\n\t * @param string $user_email The user's email address.\n\t * @param string $key        The user's activation key\n\t * @param array  $meta       Additional signup meta. By default, this is an empty array.\n\t */\n\tdo_action( 'after_signup_user', $user, $user_email, $key, $meta );\n}\n\n/**\n * Notify user of signup success.\n *\n * This is the notification function used when site registration\n * is enabled.\n *\n * Filter 'wpmu_signup_blog_notification' to bypass this function or\n * replace it with your own notification behavior.\n *\n * Filter 'wpmu_signup_blog_notification_email' and\n * 'wpmu_signup_blog_notification_subject' to change the content\n * and subject line of the email sent to newly registered users.\n *\n * @since MU\n *\n * @param string $domain     The new blog domain.\n * @param string $path       The new blog path.\n * @param string $title      The site title.\n * @param string $user       The user's login name.\n * @param string $user_email The user's email address.\n * @param string $key        The activation key created in wpmu_signup_blog()\n * @param array  $meta       By default, contains the requested privacy setting and lang_id.\n * @return bool\n */\nfunction wpmu_signup_blog_notification( $domain, $path, $title, $user, $user_email, $key, $meta = array() ) {\n\t/**\n\t * Filter whether to bypass the new site email notification.\n\t *\n\t * @since MU\n\t *\n\t * @param string|bool $domain     Site domain.\n\t * @param string      $path       Site path.\n\t * @param string      $title      Site title.\n\t * @param string      $user       User login name.\n\t * @param string      $user_email User email address.\n\t * @param string      $key        Activation key created in wpmu_signup_blog().\n\t * @param array       $meta       By default, contains the requested privacy setting and lang_id.\n\t */\n\tif ( ! apply_filters( 'wpmu_signup_blog_notification', $domain, $path, $title, $user, $user_email, $key, $meta ) ) {\n\t\treturn false;\n\t}\n\n\t// Send email with activation link.\n\tif ( !is_subdomain_install() || get_current_site()->id != 1 )\n\t\t$activate_url = network_site_url(\"wp-activate.php?key=$key\");\n\telse\n\t\t$activate_url = \"http://{$domain}{$path}wp-activate.php?key=$key\"; // @todo use *_url() API\n\n\t$activate_url = esc_url($activate_url);\n\t$admin_email = get_site_option( 'admin_email' );\n\tif ( $admin_email == '' )\n\t\t$admin_email = 'support@' . $_SERVER['SERVER_NAME'];\n\t$from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) );\n\t$message_headers = \"From: \\\"{$from_name}\\\" <{$admin_email}>\\n\" . \"Content-Type: text/plain; charset=\\\"\" . get_option('blog_charset') . \"\\\"\\n\";\n\t$message = sprintf(\n\t\t/**\n\t\t * Filter the message content of the new blog notification email.\n\t\t *\n\t\t * Content should be formatted for transmission via wp_mail().\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param string $content    Content of the notification email.\n\t\t * @param string $domain     Site domain.\n\t\t * @param string $path       Site path.\n\t\t * @param string $title      Site title.\n\t\t * @param string $user       User login name.\n\t\t * @param string $user_email User email address.\n\t\t * @param string $key        Activation key created in wpmu_signup_blog().\n\t\t * @param array  $meta       By default, contains the requested privacy setting and lang_id.\n\t\t */\n\t\tapply_filters( 'wpmu_signup_blog_notification_email',\n\t\t\t__( \"To activate your blog, please click the following link:\\n\\n%s\\n\\nAfter you activate, you will receive *another email* with your login.\\n\\nAfter you activate, you can visit your site here:\\n\\n%s\" ),\n\t\t\t$domain, $path, $title, $user, $user_email, $key, $meta\n\t\t),\n\t\t$activate_url,\n\t\tesc_url( \"http://{$domain}{$path}\" ),\n\t\t$key\n\t);\n\t// TODO: Don't hard code activation link.\n\t$subject = sprintf(\n\t\t/**\n\t\t * Filter the subject of the new blog notification email.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param string $subject    Subject of the notification email.\n\t\t * @param string $domain     Site domain.\n\t\t * @param string $path       Site path.\n\t\t * @param string $title      Site title.\n\t\t * @param string $user       User login name.\n\t\t * @param string $user_email User email address.\n\t\t * @param string $key        Activation key created in wpmu_signup_blog().\n\t\t * @param array  $meta       By default, contains the requested privacy setting and lang_id.\n\t\t */\n\t\tapply_filters( 'wpmu_signup_blog_notification_subject',\n\t\t\t__( '[%1$s] Activate %2$s' ),\n\t\t\t$domain, $path, $title, $user, $user_email, $key, $meta\n\t\t),\n\t\t$from_name,\n\t\tesc_url( 'http://' . $domain . $path )\n\t);\n\twp_mail( $user_email, wp_specialchars_decode( $subject ), $message, $message_headers );\n\treturn true;\n}\n\n/**\n * Notify user of signup success.\n *\n * This is the notification function used when no new site has\n * been requested.\n *\n * Filter 'wpmu_signup_user_notification' to bypass this function or\n * replace it with your own notification behavior.\n *\n * Filter 'wpmu_signup_user_notification_email' and\n * 'wpmu_signup_user_notification_subject' to change the content\n * and subject line of the email sent to newly registered users.\n *\n * @since MU\n *\n * @param string $user       The user's login name.\n * @param string $user_email The user's email address.\n * @param string $key        The activation key created in wpmu_signup_user()\n * @param array  $meta       By default, an empty array.\n * @return bool\n */\nfunction wpmu_signup_user_notification( $user, $user_email, $key, $meta = array() ) {\n\t/**\n\t * Filter whether to bypass the email notification for new user sign-up.\n\t *\n\t * @since MU\n\t *\n\t * @param string $user       User login name.\n\t * @param string $user_email User email address.\n\t * @param string $key        Activation key created in wpmu_signup_user().\n\t * @param array  $meta       Signup meta data.\n\t */\n\tif ( ! apply_filters( 'wpmu_signup_user_notification', $user, $user_email, $key, $meta ) )\n\t\treturn false;\n\n\t// Send email with activation link.\n\t$admin_email = get_site_option( 'admin_email' );\n\tif ( $admin_email == '' )\n\t\t$admin_email = 'support@' . $_SERVER['SERVER_NAME'];\n\t$from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) );\n\t$message_headers = \"From: \\\"{$from_name}\\\" <{$admin_email}>\\n\" . \"Content-Type: text/plain; charset=\\\"\" . get_option('blog_charset') . \"\\\"\\n\";\n\t$message = sprintf(\n\t\t/**\n\t\t * Filter the content of the notification email for new user sign-up.\n\t\t *\n\t\t * Content should be formatted for transmission via wp_mail().\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param string $content    Content of the notification email.\n\t\t * @param string $user       User login name.\n\t\t * @param string $user_email User email address.\n\t\t * @param string $key        Activation key created in wpmu_signup_user().\n\t\t * @param array  $meta       Signup meta data.\n\t\t */\n\t\tapply_filters( 'wpmu_signup_user_notification_email',\n\t\t\t__( \"To activate your user, please click the following link:\\n\\n%s\\n\\nAfter you activate, you will receive *another email* with your login.\" ),\n\t\t\t$user, $user_email, $key, $meta\n\t\t),\n\t\tsite_url( \"wp-activate.php?key=$key\" )\n\t);\n\t// TODO: Don't hard code activation link.\n\t$subject = sprintf(\n\t\t/**\n\t\t * Filter the subject of the notification email of new user signup.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param string $subject    Subject of the notification email.\n\t\t * @param string $user       User login name.\n\t\t * @param string $user_email User email address.\n\t\t * @param string $key        Activation key created in wpmu_signup_user().\n\t\t * @param array  $meta       Signup meta data.\n\t\t */\n\t\tapply_filters( 'wpmu_signup_user_notification_subject',\n\t\t\t__( '[%1$s] Activate %2$s' ),\n\t\t\t$user, $user_email, $key, $meta\n\t\t),\n\t\t$from_name,\n\t\t$user\n\t);\n\twp_mail( $user_email, wp_specialchars_decode( $subject ), $message, $message_headers );\n\treturn true;\n}\n\n/**\n * Activate a signup.\n *\n * Hook to 'wpmu_activate_user' or 'wpmu_activate_blog' for events\n * that should happen only when users or sites are self-created (since\n * those actions are not called when users and sites are created\n * by a Super Admin).\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $key The activation key provided to the user.\n * @return array|WP_Error An array containing information about the activated user and/or blog\n */\nfunction wpmu_activate_signup($key) {\n\tglobal $wpdb;\n\n\t$signup = $wpdb->get_row( $wpdb->prepare(\"SELECT * FROM $wpdb->signups WHERE activation_key = %s\", $key) );\n\n\tif ( empty( $signup ) )\n\t\treturn new WP_Error( 'invalid_key', __( 'Invalid activation key.' ) );\n\n\tif ( $signup->active ) {\n\t\tif ( empty( $signup->domain ) )\n\t\t\treturn new WP_Error( 'already_active', __( 'The user is already active.' ), $signup );\n\t\telse\n\t\t\treturn new WP_Error( 'already_active', __( 'The site is already active.' ), $signup );\n\t}\n\n\t$meta = maybe_unserialize($signup->meta);\n\t$password = wp_generate_password( 12, false );\n\n\t$user_id = username_exists($signup->user_login);\n\n\tif ( ! $user_id )\n\t\t$user_id = wpmu_create_user($signup->user_login, $password, $signup->user_email);\n\telse\n\t\t$user_already_exists = true;\n\n\tif ( ! $user_id )\n\t\treturn new WP_Error('create_user', __('Could not create user'), $signup);\n\n\t$now = current_time('mysql', true);\n\n\tif ( empty($signup->domain) ) {\n\t\t$wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $key) );\n\n\t\tif ( isset( $user_already_exists ) )\n\t\t\treturn new WP_Error( 'user_already_exists', __( 'That username is already activated.' ), $signup);\n\n\t\t/**\n\t\t * Fires immediately after a new user is activated.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param int   $user_id  User ID.\n\t\t * @param int   $password User password.\n\t\t * @param array $meta     Signup meta data.\n\t\t */\n\t\tdo_action( 'wpmu_activate_user', $user_id, $password, $meta );\n\t\treturn array( 'user_id' => $user_id, 'password' => $password, 'meta' => $meta );\n\t}\n\n\t$blog_id = wpmu_create_blog( $signup->domain, $signup->path, $signup->title, $user_id, $meta, $wpdb->siteid );\n\n\t// TODO: What to do if we create a user but cannot create a blog?\n\tif ( is_wp_error($blog_id) ) {\n\t\t// If blog is taken, that means a previous attempt to activate this blog failed in between creating the blog and\n\t\t// setting the activation flag. Let's just set the active flag and instruct the user to reset their password.\n\t\tif ( 'blog_taken' == $blog_id->get_error_code() ) {\n\t\t\t$blog_id->add_data( $signup );\n\t\t\t$wpdb->update( $wpdb->signups, array( 'active' => 1, 'activated' => $now ), array( 'activation_key' => $key ) );\n\t\t}\n\t\treturn $blog_id;\n\t}\n\n\t$wpdb->update( $wpdb->signups, array('active' => 1, 'activated' => $now), array('activation_key' => $key) );\n\t/**\n\t * Fires immediately after a site is activated.\n\t *\n\t * @since MU\n\t *\n\t * @param int    $blog_id       Blog ID.\n\t * @param int    $user_id       User ID.\n\t * @param int    $password      User password.\n\t * @param string $signup_title  Site title.\n\t * @param array  $meta          Signup meta data.\n\t */\n\tdo_action( 'wpmu_activate_blog', $blog_id, $user_id, $password, $signup->title, $meta );\n\n\treturn array('blog_id' => $blog_id, 'user_id' => $user_id, 'password' => $password, 'title' => $signup->title, 'meta' => $meta);\n}\n\n/**\n * Create a user.\n *\n * This function runs when a user self-registers as well as when\n * a Super Admin creates a new user. Hook to 'wpmu_new_user' for events\n * that should affect all new users, but only on Multisite (otherwise\n * use 'user_register').\n *\n * @since MU\n *\n * @param string $user_name The new user's login name.\n * @param string $password  The new user's password.\n * @param string $email     The new user's email address.\n * @return int|false Returns false on failure, or int $user_id on success\n */\nfunction wpmu_create_user( $user_name, $password, $email ) {\n\t$user_name = preg_replace( '/\\s+/', '', sanitize_user( $user_name, true ) );\n\n\t$user_id = wp_create_user( $user_name, $password, $email );\n\tif ( is_wp_error( $user_id ) )\n\t\treturn false;\n\n\t// Newly created users have no roles or caps until they are added to a blog.\n\tdelete_user_option( $user_id, 'capabilities' );\n\tdelete_user_option( $user_id, 'user_level' );\n\n\t/**\n\t * Fires immediately after a new user is created.\n\t *\n\t * @since MU\n\t *\n\t * @param int $user_id User ID.\n\t */\n\tdo_action( 'wpmu_new_user', $user_id );\n\n\treturn $user_id;\n}\n\n/**\n * Create a site.\n *\n * This function runs when a user self-registers a new site as well\n * as when a Super Admin creates a new site. Hook to 'wpmu_new_blog'\n * for events that should affect all new sites.\n *\n * On subdirectory installs, $domain is the same as the main site's\n * domain, and the path is the subdirectory name (eg 'example.com'\n * and '/blog1/'). On subdomain installs, $domain is the new subdomain +\n * root domain (eg 'blog1.example.com'), and $path is '/'.\n *\n * @since MU\n *\n * @param string $domain  The new site's domain.\n * @param string $path    The new site's path.\n * @param string $title   The new site's title.\n * @param int    $user_id The user ID of the new site's admin.\n * @param array  $meta    Optional. Used to set initial site options.\n * @param int    $site_id Optional. Only relevant on multi-network installs.\n * @return int|WP_Error Returns WP_Error object on failure, int $blog_id on success\n */\nfunction wpmu_create_blog( $domain, $path, $title, $user_id, $meta = array(), $site_id = 1 ) {\n\t$defaults = array( 'public' => 0 );\n\t$meta = wp_parse_args( $meta, $defaults );\n\n\t$domain = preg_replace( '/\\s+/', '', sanitize_user( $domain, true ) );\n\n\tif ( is_subdomain_install() )\n\t\t$domain = str_replace( '@', '', $domain );\n\n\t$title = strip_tags( $title );\n\t$user_id = (int) $user_id;\n\n\tif ( empty($path) )\n\t\t$path = '/';\n\n\t// Check if the domain has been used already. We should return an error message.\n\tif ( domain_exists($domain, $path, $site_id) )\n\t\treturn new WP_Error( 'blog_taken', __( 'Sorry, that site already exists!' ) );\n\n\tif ( ! wp_installing() ) {\n\t\twp_installing( true );\n\t}\n\n\tif ( ! $blog_id = insert_blog($domain, $path, $site_id) )\n\t\treturn new WP_Error('insert_blog', __('Could not create site.'));\n\n\tswitch_to_blog($blog_id);\n\tinstall_blog($blog_id, $title);\n\twp_install_defaults($user_id);\n\n\tadd_user_to_blog($blog_id, $user_id, 'administrator');\n\n\tforeach ( $meta as $key => $value ) {\n\t\tif ( in_array( $key, array( 'public', 'archived', 'mature', 'spam', 'deleted', 'lang_id' ) ) )\n\t\t\tupdate_blog_status( $blog_id, $key, $value );\n\t\telse\n\t\t\tupdate_option( $key, $value );\n\t}\n\n\tadd_option( 'WPLANG', get_site_option( 'WPLANG' ) );\n\tupdate_option( 'blog_public', (int) $meta['public'] );\n\n\tif ( ! is_super_admin( $user_id ) && ! get_user_meta( $user_id, 'primary_blog', true ) )\n\t\tupdate_user_meta( $user_id, 'primary_blog', $blog_id );\n\n\trestore_current_blog();\n\t/**\n\t * Fires immediately after a new site is created.\n\t *\n\t * @since MU\n\t *\n\t * @param int    $blog_id Blog ID.\n\t * @param int    $user_id User ID.\n\t * @param string $domain  Site domain.\n\t * @param string $path    Site path.\n\t * @param int    $site_id Site ID. Only relevant on multi-network installs.\n\t * @param array  $meta    Meta data. Used to set initial site options.\n\t */\n\tdo_action( 'wpmu_new_blog', $blog_id, $user_id, $domain, $path, $site_id, $meta );\n\n\treturn $blog_id;\n}\n\n/**\n * Notifies the network admin that a new site has been activated.\n *\n * Filter 'newblog_notify_siteadmin' to change the content of\n * the notification email.\n *\n * @since MU\n *\n * @param int $blog_id The new site's ID.\n * @return bool\n */\nfunction newblog_notify_siteadmin( $blog_id, $deprecated = '' ) {\n\tif ( get_site_option( 'registrationnotification' ) != 'yes' )\n\t\treturn false;\n\n\t$email = get_site_option( 'admin_email' );\n\tif ( is_email($email) == false )\n\t\treturn false;\n\n\t$options_site_url = esc_url(network_admin_url('settings.php'));\n\n\tswitch_to_blog( $blog_id );\n\t$blogname = get_option( 'blogname' );\n\t$siteurl = site_url();\n\trestore_current_blog();\n\n\t$msg = sprintf( __( 'New Site: %1$s\nURL: %2$s\nRemote IP: %3$s\n\nDisable these notifications: %4$s' ), $blogname, $siteurl, wp_unslash( $_SERVER['REMOTE_ADDR'] ), $options_site_url);\n\t/**\n\t * Filter the message body of the new site activation email sent\n\t * to the network administrator.\n\t *\n\t * @since MU\n\t *\n\t * @param string $msg Email body.\n\t */\n\t$msg = apply_filters( 'newblog_notify_siteadmin', $msg );\n\n\twp_mail( $email, sprintf( __( 'New Site Registration: %s' ), $siteurl ), $msg );\n\treturn true;\n}\n\n/**\n * Notifies the network admin that a new user has been activated.\n *\n * Filter 'newuser_notify_siteadmin' to change the content of\n * the notification email.\n *\n * @since MU\n *\n * @param int $user_id The new user's ID.\n * @return bool\n */\nfunction newuser_notify_siteadmin( $user_id ) {\n\tif ( get_site_option( 'registrationnotification' ) != 'yes' )\n\t\treturn false;\n\n\t$email = get_site_option( 'admin_email' );\n\n\tif ( is_email($email) == false )\n\t\treturn false;\n\n\t$user = get_userdata( $user_id );\n\n\t$options_site_url = esc_url(network_admin_url('settings.php'));\n\t$msg = sprintf(__('New User: %1$s\nRemote IP: %2$s\n\nDisable these notifications: %3$s'), $user->user_login, wp_unslash( $_SERVER['REMOTE_ADDR'] ), $options_site_url);\n\n\t/**\n\t * Filter the message body of the new user activation email sent\n\t * to the network administrator.\n\t *\n\t * @since MU\n\t *\n\t * @param string  $msg  Email body.\n\t * @param WP_User $user WP_User instance of the new user.\n\t */\n\t$msg = apply_filters( 'newuser_notify_siteadmin', $msg, $user );\n\twp_mail( $email, sprintf(__('New User Registration: %s'), $user->user_login), $msg );\n\treturn true;\n}\n\n/**\n * Check whether a blogname is already taken.\n *\n * Used during the new site registration process to ensure\n * that each blogname is unique.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $domain  The domain to be checked.\n * @param string $path    The path to be checked.\n * @param int    $site_id Optional. Relevant only on multi-network installs.\n * @return int\n */\nfunction domain_exists($domain, $path, $site_id = 1) {\n\tglobal $wpdb;\n\t$path = trailingslashit( $path );\n\t$result = $wpdb->get_var( $wpdb->prepare(\"SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s AND site_id = %d\", $domain, $path, $site_id) );\n\n\t/**\n\t * Filter whether a blogname is taken.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param int|null $result  The blog_id if the blogname exists, null otherwise.\n\t * @param string   $domain  Domain to be checked.\n\t * @param string   $path    Path to be checked.\n\t * @param int      $site_id Site ID. Relevant only on multi-network installs.\n\t */\n\treturn apply_filters( 'domain_exists', $result, $domain, $path, $site_id );\n}\n\n/**\n * Store basic site info in the blogs table.\n *\n * This function creates a row in the wp_blogs table and returns\n * the new blog's ID. It is the first step in creating a new blog.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $domain  The domain of the new site.\n * @param string $path    The path of the new site.\n * @param int    $site_id Unless you're running a multi-network install, be sure to set this value to 1.\n * @return int|false The ID of the new row\n */\nfunction insert_blog($domain, $path, $site_id) {\n\tglobal $wpdb;\n\n\t$path = trailingslashit($path);\n\t$site_id = (int) $site_id;\n\n\t$result = $wpdb->insert( $wpdb->blogs, array('site_id' => $site_id, 'domain' => $domain, 'path' => $path, 'registered' => current_time('mysql')) );\n\tif ( ! $result )\n\t\treturn false;\n\n\t$blog_id = $wpdb->insert_id;\n\trefresh_blog_details( $blog_id );\n\n\twp_maybe_update_network_site_counts();\n\n\treturn $blog_id;\n}\n\n/**\n * Install an empty blog.\n *\n * Creates the new blog tables and options. If calling this function\n * directly, be sure to use switch_to_blog() first, so that $wpdb\n * points to the new blog.\n *\n * @since MU\n *\n * @global wpdb     $wpdb\n * @global WP_Roles $wp_roles\n *\n * @param int    $blog_id    The value returned by insert_blog().\n * @param string $blog_title The title of the new site.\n */\nfunction install_blog( $blog_id, $blog_title = '' ) {\n\tglobal $wpdb, $wp_roles, $current_site;\n\n\t// Cast for security\n\t$blog_id = (int) $blog_id;\n\n\trequire_once( ABSPATH . 'wp-admin/includes/upgrade.php' );\n\n\t$suppress = $wpdb->suppress_errors();\n\tif ( $wpdb->get_results( \"DESCRIBE {$wpdb->posts}\" ) )\n\t\tdie( '<h1>' . __( 'Already Installed' ) . '</h1><p>' . __( 'You appear to have already installed WordPress. To reinstall please clear your old database tables first.' ) . '</p></body></html>' );\n\t$wpdb->suppress_errors( $suppress );\n\n\t$url = get_blogaddress_by_id( $blog_id );\n\n\t// Set everything up\n\tmake_db_current_silent( 'blog' );\n\tpopulate_options();\n\tpopulate_roles();\n\n\t// populate_roles() clears previous role definitions so we start over.\n\t$wp_roles = new WP_Roles();\n\n\t$siteurl = $home = untrailingslashit( $url );\n\n\tif ( ! is_subdomain_install() ) {\n\n \t\tif ( 'https' === parse_url( get_site_option( 'siteurl' ), PHP_URL_SCHEME ) ) {\n \t\t\t$siteurl = set_url_scheme( $siteurl, 'https' );\n \t\t}\n \t\tif ( 'https' === parse_url( get_home_url( $current_site->blog_id ), PHP_URL_SCHEME ) ) {\n \t\t\t$home = set_url_scheme( $home, 'https' );\n \t\t}\n\n\t}\n\n\tupdate_option( 'siteurl', $siteurl );\n\tupdate_option( 'home', $home );\n\n\tif ( get_site_option( 'ms_files_rewriting' ) )\n\t\tupdate_option( 'upload_path', UPLOADBLOGSDIR . \"/$blog_id/files\" );\n\telse\n\t\tupdate_option( 'upload_path', get_blog_option( get_current_site()->blog_id, 'upload_path' ) );\n\n\tupdate_option( 'blogname', wp_unslash( $blog_title ) );\n\tupdate_option( 'admin_email', '' );\n\n\t// remove all perms\n\t$table_prefix = $wpdb->get_blog_prefix();\n\tdelete_metadata( 'user', 0, $table_prefix . 'user_level',   null, true ); // delete all\n\tdelete_metadata( 'user', 0, $table_prefix . 'capabilities', null, true ); // delete all\n}\n\n/**\n * Set blog defaults.\n *\n * This function creates a row in the wp_blogs table.\n *\n * @since MU\n * @deprecated MU\n * @deprecated Use wp_install_defaults()\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $blog_id Ignored in this function.\n * @param int $user_id\n */\nfunction install_blog_defaults($blog_id, $user_id) {\n\tglobal $wpdb;\n\n\trequire_once( ABSPATH . 'wp-admin/includes/upgrade.php' );\n\n\t$suppress = $wpdb->suppress_errors();\n\n\twp_install_defaults($user_id);\n\n\t$wpdb->suppress_errors( $suppress );\n}\n\n/**\n * Notify a user that their blog activation has been successful.\n *\n * Filter 'wpmu_welcome_notification' to disable or bypass.\n *\n * Filter 'update_welcome_email' and 'update_welcome_subject' to\n * modify the content and subject line of the notification email.\n *\n * @since MU\n *\n * @param int    $blog_id\n * @param int    $user_id\n * @param string $password\n * @param string $title    The new blog's title\n * @param array  $meta     Optional. Not used in the default function, but is passed along to hooks for customization.\n * @return bool\n */\nfunction wpmu_welcome_notification( $blog_id, $user_id, $password, $title, $meta = array() ) {\n\t$current_site = get_current_site();\n\n\t/**\n\t * Filter whether to bypass the welcome email after site activation.\n\t *\n\t * Returning false disables the welcome email.\n\t *\n\t * @since MU\n\t *\n\t * @param int|bool $blog_id  Blog ID.\n\t * @param int      $user_id  User ID.\n\t * @param string   $password User password.\n\t * @param string   $title    Site title.\n\t * @param array    $meta     Signup meta data.\n\t */\n\tif ( ! apply_filters( 'wpmu_welcome_notification', $blog_id, $user_id, $password, $title, $meta ) )\n\t\treturn false;\n\n\t$welcome_email = get_site_option( 'welcome_email' );\n\tif ( $welcome_email == false ) {\n\t\t/* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */\n\t\t$welcome_email = __( 'Howdy USERNAME,\n\nYour new SITE_NAME site has been successfully set up at:\nBLOG_URL\n\nYou can log in to the administrator account with the following information:\n\nUsername: USERNAME\nPassword: PASSWORD\nLog in here: BLOG_URLwp-login.php\n\nWe hope you enjoy your new site. Thanks!\n\n--The Team @ SITE_NAME' );\n\t}\n\n\t$url = get_blogaddress_by_id($blog_id);\n\t$user = get_userdata( $user_id );\n\n\t$welcome_email = str_replace( 'SITE_NAME', $current_site->site_name, $welcome_email );\n\t$welcome_email = str_replace( 'BLOG_TITLE', $title, $welcome_email );\n\t$welcome_email = str_replace( 'BLOG_URL', $url, $welcome_email );\n\t$welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email );\n\t$welcome_email = str_replace( 'PASSWORD', $password, $welcome_email );\n\n\t/**\n\t * Filter the content of the welcome email after site activation.\n\t *\n\t * Content should be formatted for transmission via wp_mail().\n\t *\n\t * @since MU\n\t *\n\t * @param string $welcome_email Message body of the email.\n\t * @param int    $blog_id       Blog ID.\n\t * @param int    $user_id       User ID.\n\t * @param string $password      User password.\n\t * @param string $title         Site title.\n\t * @param array  $meta          Signup meta data.\n\t */\n\t$welcome_email = apply_filters( 'update_welcome_email', $welcome_email, $blog_id, $user_id, $password, $title, $meta );\n\t$admin_email = get_site_option( 'admin_email' );\n\n\tif ( $admin_email == '' )\n\t\t$admin_email = 'support@' . $_SERVER['SERVER_NAME'];\n\n\t$from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) );\n\t$message_headers = \"From: \\\"{$from_name}\\\" <{$admin_email}>\\n\" . \"Content-Type: text/plain; charset=\\\"\" . get_option('blog_charset') . \"\\\"\\n\";\n\t$message = $welcome_email;\n\n\tif ( empty( $current_site->site_name ) )\n\t\t$current_site->site_name = 'WordPress';\n\n\t/**\n\t * Filter the subject of the welcome email after site activation.\n\t *\n\t * @since MU\n\t *\n\t * @param string $subject Subject of the email.\n\t */\n\t$subject = apply_filters( 'update_welcome_subject', sprintf( __( 'New %1$s Site: %2$s' ), $current_site->site_name, wp_unslash( $title ) ) );\n\twp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers );\n\treturn true;\n}\n\n/**\n * Notify a user that their account activation has been successful.\n *\n * Filter 'wpmu_welcome_user_notification' to disable or bypass.\n *\n * Filter 'update_welcome_user_email' and 'update_welcome_user_subject' to\n * modify the content and subject line of the notification email.\n *\n * @since MU\n *\n * @param int    $user_id\n * @param string $password\n * @param array  $meta     Optional. Not used in the default function, but is passed along to hooks for customization.\n * @return bool\n */\nfunction wpmu_welcome_user_notification( $user_id, $password, $meta = array() ) {\n\t$current_site = get_current_site();\n\n\t/**\n \t * Filter whether to bypass the welcome email after user activation.\n\t *\n\t * Returning false disables the welcome email.\n\t *\n\t * @since MU\n\t *\n\t * @param int    $user_id  User ID.\n\t * @param string $password User password.\n\t * @param array  $meta     Signup meta data.\n\t */\n\tif ( ! apply_filters( 'wpmu_welcome_user_notification', $user_id, $password, $meta ) )\n\t\treturn false;\n\n\t$welcome_email = get_site_option( 'welcome_user_email' );\n\n\t$user = get_userdata( $user_id );\n\n\t/**\n\t * Filter the content of the welcome email after user activation.\n\t *\n\t * Content should be formatted for transmission via wp_mail().\n\t *\n\t * @since MU\n\t *\n\t * @param type   $welcome_email The message body of the account activation success email.\n\t * @param int    $user_id       User ID.\n\t * @param string $password      User password.\n\t * @param array  $meta          Signup meta data.\n\t */\n\t$welcome_email = apply_filters( 'update_welcome_user_email', $welcome_email, $user_id, $password, $meta );\n\t$welcome_email = str_replace( 'SITE_NAME', $current_site->site_name, $welcome_email );\n\t$welcome_email = str_replace( 'USERNAME', $user->user_login, $welcome_email );\n\t$welcome_email = str_replace( 'PASSWORD', $password, $welcome_email );\n\t$welcome_email = str_replace( 'LOGINLINK', wp_login_url(), $welcome_email );\n\n\t$admin_email = get_site_option( 'admin_email' );\n\n\tif ( $admin_email == '' )\n\t\t$admin_email = 'support@' . $_SERVER['SERVER_NAME'];\n\n\t$from_name = get_site_option( 'site_name' ) == '' ? 'WordPress' : esc_html( get_site_option( 'site_name' ) );\n\t$message_headers = \"From: \\\"{$from_name}\\\" <{$admin_email}>\\n\" . \"Content-Type: text/plain; charset=\\\"\" . get_option('blog_charset') . \"\\\"\\n\";\n\t$message = $welcome_email;\n\n\tif ( empty( $current_site->site_name ) )\n\t\t$current_site->site_name = 'WordPress';\n\n\t/**\n\t * Filter the subject of the welcome email after user activation.\n\t *\n\t * @since MU\n\t *\n\t * @param string $subject Subject of the email.\n\t */\n\t$subject = apply_filters( 'update_welcome_user_subject', sprintf( __( 'New %1$s User: %2$s' ), $current_site->site_name, $user->user_login) );\n\twp_mail( $user->user_email, wp_specialchars_decode( $subject ), $message, $message_headers );\n\treturn true;\n}\n\n/**\n * Get the current site info.\n *\n * Returns an object containing the 'id', 'domain', 'path', and 'site_name'\n * properties of the site being viewed.\n *\n * @see wpmu_current_site()\n *\n * @since MU\n *\n * @global object $current_site\n *\n * @return object\n */\nfunction get_current_site() {\n\tglobal $current_site;\n\treturn $current_site;\n}\n\n/**\n * Get a user's most recent post.\n *\n * Walks through each of a user's blogs to find the post with\n * the most recent post_date_gmt.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $user_id\n * @return array Contains the blog_id, post_id, post_date_gmt, and post_gmt_ts\n */\nfunction get_most_recent_post_of_user( $user_id ) {\n\tglobal $wpdb;\n\n\t$user_blogs = get_blogs_of_user( (int) $user_id );\n\t$most_recent_post = array();\n\n\t// Walk through each blog and get the most recent post\n\t// published by $user_id\n\tforeach ( (array) $user_blogs as $blog ) {\n\t\t$prefix = $wpdb->get_blog_prefix( $blog->userblog_id );\n\t\t$recent_post = $wpdb->get_row( $wpdb->prepare(\"SELECT ID, post_date_gmt FROM {$prefix}posts WHERE post_author = %d AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1\", $user_id ), ARRAY_A);\n\n\t\t// Make sure we found a post\n\t\tif ( isset($recent_post['ID']) ) {\n\t\t\t$post_gmt_ts = strtotime($recent_post['post_date_gmt']);\n\n\t\t\t// If this is the first post checked or if this post is\n\t\t\t// newer than the current recent post, make it the new\n\t\t\t// most recent post.\n\t\t\tif ( !isset($most_recent_post['post_gmt_ts']) || ( $post_gmt_ts > $most_recent_post['post_gmt_ts'] ) ) {\n\t\t\t\t$most_recent_post = array(\n\t\t\t\t\t'blog_id'\t\t=> $blog->userblog_id,\n\t\t\t\t\t'post_id'\t\t=> $recent_post['ID'],\n\t\t\t\t\t'post_date_gmt'\t=> $recent_post['post_date_gmt'],\n\t\t\t\t\t'post_gmt_ts'\t=> $post_gmt_ts\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $most_recent_post;\n}\n\n// Misc functions\n\n/**\n * Get the size of a directory.\n *\n * A helper function that is used primarily to check whether\n * a blog has exceeded its allowed upload space.\n *\n * @since MU\n *\n * @param string $directory Full path of a directory.\n * @return int Size of the directory in MB.\n */\nfunction get_dirsize( $directory ) {\n\t$dirsize = get_transient( 'dirsize_cache' );\n\tif ( is_array( $dirsize ) && isset( $dirsize[ $directory ][ 'size' ] ) )\n\t\treturn $dirsize[ $directory ][ 'size' ];\n\n\tif ( ! is_array( $dirsize ) )\n\t\t$dirsize = array();\n\n\t// Exclude individual site directories from the total when checking the main site,\n\t// as they are subdirectories and should not be counted.\n\tif ( is_main_site() ) {\n\t\t$dirsize[ $directory ][ 'size' ] = recurse_dirsize( $directory, $directory . '/sites' );\n\t} else {\n\t\t$dirsize[ $directory ][ 'size' ] = recurse_dirsize( $directory );\n\t}\n\n\tset_transient( 'dirsize_cache', $dirsize, HOUR_IN_SECONDS );\n\treturn $dirsize[ $directory ][ 'size' ];\n}\n\n/**\n * Get the size of a directory recursively.\n *\n * Used by get_dirsize() to get a directory's size when it contains\n * other directories.\n *\n * @since MU\n * @since 4.3.0 $exclude parameter added.\n *\n * @param string $directory Full path of a directory.\n * @param string $exclude   Optional. Full path of a subdirectory to exclude from the total.\n * @return int|false Size in MB if a valid directory. False if not.\n */\nfunction recurse_dirsize( $directory, $exclude = null ) {\n\t$size = 0;\n\n\t$directory = untrailingslashit( $directory );\n\n\tif ( ! file_exists( $directory ) || ! is_dir( $directory ) || ! is_readable( $directory ) || $directory === $exclude ) {\n\t\treturn false;\n\t}\n\n\tif ($handle = opendir($directory)) {\n\t\twhile(($file = readdir($handle)) !== false) {\n\t\t\t$path = $directory.'/'.$file;\n\t\t\tif ($file != '.' && $file != '..') {\n\t\t\t\tif (is_file($path)) {\n\t\t\t\t\t$size += filesize($path);\n\t\t\t\t} elseif (is_dir($path)) {\n\t\t\t\t\t$handlesize = recurse_dirsize( $path, $exclude );\n\t\t\t\t\tif ($handlesize > 0)\n\t\t\t\t\t\t$size += $handlesize;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tclosedir($handle);\n\t}\n\treturn $size;\n}\n\n/**\n * Check an array of MIME types against a whitelist.\n *\n * WordPress ships with a set of allowed upload filetypes,\n * which is defined in wp-includes/functions.php in\n * get_allowed_mime_types(). This function is used to filter\n * that list against the filetype whitelist provided by Multisite\n * Super Admins at wp-admin/network/settings.php.\n *\n * @since MU\n *\n * @param array $mimes\n * @return array\n */\nfunction check_upload_mimes( $mimes ) {\n\t$site_exts = explode( ' ', get_site_option( 'upload_filetypes', 'jpg jpeg png gif' ) );\n\t$site_mimes = array();\n\tforeach ( $site_exts as $ext ) {\n\t\tforeach ( $mimes as $ext_pattern => $mime ) {\n\t\t\tif ( $ext != '' && strpos( $ext_pattern, $ext ) !== false )\n\t\t\t\t$site_mimes[$ext_pattern] = $mime;\n\t\t}\n\t}\n\treturn $site_mimes;\n}\n\n/**\n * Update a blog's post count.\n *\n * WordPress MS stores a blog's post count as an option so as\n * to avoid extraneous COUNTs when a blog's details are fetched\n * with get_blog_details(). This function is called when posts\n * are published or unpublished to make sure the count stays current.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction update_posts_count( $deprecated = '' ) {\n\tglobal $wpdb;\n\tupdate_option( 'post_count', (int) $wpdb->get_var( \"SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_status = 'publish' and post_type = 'post'\" ) );\n}\n\n/**\n * Logs user registrations.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $blog_id\n * @param int $user_id\n */\nfunction wpmu_log_new_registrations( $blog_id, $user_id ) {\n\tglobal $wpdb;\n\t$user = get_userdata( (int) $user_id );\n\tif ( $user )\n\t\t$wpdb->insert( $wpdb->registration_log, array('email' => $user->user_email, 'IP' => preg_replace( '/[^0-9., ]/', '', wp_unslash( $_SERVER['REMOTE_ADDR'] ) ), 'blog_id' => $blog_id, 'date_registered' => current_time('mysql')) );\n}\n\n/**\n * Maintains a canonical list of terms by syncing terms created for each blog with the global terms table.\n *\n * @since 3.0.0\n *\n * @see term_id_filter\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @staticvar int $global_terms_recurse\n *\n * @param int $term_id An ID for a term on the current blog.\n * @return int An ID from the global terms table mapped from $term_id.\n */\nfunction global_terms( $term_id, $deprecated = '' ) {\n\tglobal $wpdb;\n\tstatic $global_terms_recurse = null;\n\n\tif ( !global_terms_enabled() )\n\t\treturn $term_id;\n\n\t// prevent a race condition\n\t$recurse_start = false;\n\tif ( $global_terms_recurse === null ) {\n\t\t$recurse_start = true;\n\t\t$global_terms_recurse = 1;\n\t} elseif ( 10 < $global_terms_recurse++ ) {\n\t\treturn $term_id;\n\t}\n\n\t$term_id = intval( $term_id );\n\t$c = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->terms WHERE term_id = %d\", $term_id ) );\n\n\t$global_id = $wpdb->get_var( $wpdb->prepare( \"SELECT cat_ID FROM $wpdb->sitecategories WHERE category_nicename = %s\", $c->slug ) );\n\tif ( $global_id == null ) {\n\t\t$used_global_id = $wpdb->get_var( $wpdb->prepare( \"SELECT cat_ID FROM $wpdb->sitecategories WHERE cat_ID = %d\", $c->term_id ) );\n\t\tif ( null == $used_global_id ) {\n\t\t\t$wpdb->insert( $wpdb->sitecategories, array( 'cat_ID' => $term_id, 'cat_name' => $c->name, 'category_nicename' => $c->slug ) );\n\t\t\t$global_id = $wpdb->insert_id;\n\t\t\tif ( empty( $global_id ) )\n\t\t\t\treturn $term_id;\n\t\t} else {\n\t\t\t$max_global_id = $wpdb->get_var( \"SELECT MAX(cat_ID) FROM $wpdb->sitecategories\" );\n\t\t\t$max_local_id = $wpdb->get_var( \"SELECT MAX(term_id) FROM $wpdb->terms\" );\n\t\t\t$new_global_id = max( $max_global_id, $max_local_id ) + mt_rand( 100, 400 );\n\t\t\t$wpdb->insert( $wpdb->sitecategories, array( 'cat_ID' => $new_global_id, 'cat_name' => $c->name, 'category_nicename' => $c->slug ) );\n\t\t\t$global_id = $wpdb->insert_id;\n\t\t}\n\t} elseif ( $global_id != $term_id ) {\n\t\t$local_id = $wpdb->get_var( $wpdb->prepare( \"SELECT term_id FROM $wpdb->terms WHERE term_id = %d\", $global_id ) );\n\t\tif ( null != $local_id ) {\n\t\t\tglobal_terms( $local_id );\n\t\t\tif ( 10 < $global_terms_recurse ) {\n\t\t\t\t$global_id = $term_id;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( $global_id != $term_id ) {\n\t\tif ( get_option( 'default_category' ) == $term_id )\n\t\t\tupdate_option( 'default_category', $global_id );\n\n\t\t$wpdb->update( $wpdb->terms, array('term_id' => $global_id), array('term_id' => $term_id) );\n\t\t$wpdb->update( $wpdb->term_taxonomy, array('term_id' => $global_id), array('term_id' => $term_id) );\n\t\t$wpdb->update( $wpdb->term_taxonomy, array('parent' => $global_id), array('parent' => $term_id) );\n\n\t\tclean_term_cache($term_id);\n\t}\n\tif ( $recurse_start )\n\t\t$global_terms_recurse = null;\n\n\treturn $global_id;\n}\n\n/**\n * Ensure that the current site's domain is listed in the allowed redirect host list.\n *\n * @see wp_validate_redirect()\n * @since MU\n *\n * @return array The current site's domain\n */\nfunction redirect_this_site( $deprecated = '' ) {\n\treturn array( get_current_site()->domain );\n}\n\n/**\n * Check whether an upload is too big.\n *\n * @since MU\n *\n * @blessed\n *\n * @param array $upload\n * @return string|array If the upload is under the size limit, $upload is returned. Otherwise returns an error message.\n */\nfunction upload_is_file_too_big( $upload ) {\n\tif ( ! is_array( $upload ) || defined( 'WP_IMPORTING' ) || get_site_option( 'upload_space_check_disabled' ) )\n\t\treturn $upload;\n\n\tif ( strlen( $upload['bits'] )  > ( KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 ) ) ) {\n\t\treturn sprintf( __( 'This file is too big. Files must be less than %d KB in size.' ) . '<br />', get_site_option( 'fileupload_maxk', 1500 ) );\n\t}\n\n\treturn $upload;\n}\n\n/**\n * Add a nonce field to the signup page.\n *\n * @since MU\n */\nfunction signup_nonce_fields() {\n\t$id = mt_rand();\n\techo \"<input type='hidden' name='signup_form_id' value='{$id}' />\";\n\twp_nonce_field('signup_form_' . $id, '_signup_form', false);\n}\n\n/**\n * Process the signup nonce created in signup_nonce_fields().\n *\n * @since MU\n *\n * @param array $result\n * @return array\n */\nfunction signup_nonce_check( $result ) {\n\tif ( !strpos( $_SERVER[ 'PHP_SELF' ], 'wp-signup.php' ) )\n\t\treturn $result;\n\n\tif ( wp_create_nonce('signup_form_' . $_POST[ 'signup_form_id' ]) != $_POST['_signup_form'] )\n\t\twp_die( __( 'Please try again.' ) );\n\n\treturn $result;\n}\n\n/**\n * Correct 404 redirects when NOBLOGREDIRECT is defined.\n *\n * @since MU\n */\nfunction maybe_redirect_404() {\n\t/**\n\t * Filter the redirect URL for 404s on the main site.\n\t *\n\t * The filter is only evaluated if the NOBLOGREDIRECT constant is defined.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $no_blog_redirect The redirect URL defined in NOBLOGREDIRECT.\n\t */\n\tif ( is_main_site() && is_404() && defined( 'NOBLOGREDIRECT' ) && ( $destination = apply_filters( 'blog_redirect_404', NOBLOGREDIRECT ) ) ) {\n\t\tif ( $destination == '%siteurl%' )\n\t\t\t$destination = network_home_url();\n\t\twp_redirect( $destination );\n\t\texit();\n\t}\n}\n\n/**\n * Add a new user to a blog by visiting /newbloguser/username/.\n *\n * This will only work when the user's details are saved as an option\n * keyed as 'new_user_x', where 'x' is the username of the user to be\n * added, as when a user is invited through the regular WP Add User interface.\n *\n * @since MU\n */\nfunction maybe_add_existing_user_to_blog() {\n\tif ( false === strpos( $_SERVER[ 'REQUEST_URI' ], '/newbloguser/' ) )\n\t\treturn;\n\n\t$parts = explode( '/', $_SERVER[ 'REQUEST_URI' ] );\n\t$key = array_pop( $parts );\n\n\tif ( $key == '' )\n\t\t$key = array_pop( $parts );\n\n\t$details = get_option( 'new_user_' . $key );\n\tif ( !empty( $details ) )\n\t\tdelete_option( 'new_user_' . $key );\n\n\tif ( empty( $details ) || is_wp_error( add_existing_user_to_blog( $details ) ) )\n\t\twp_die( sprintf(__('An error occurred adding you to this site. Back to the <a href=\"%s\">homepage</a>.'), home_url() ) );\n\n\twp_die( sprintf( __( 'You have been added to this site. Please visit the <a href=\"%s\">homepage</a> or <a href=\"%s\">log in</a> using your username and password.' ), home_url(), admin_url() ), __( 'WordPress &rsaquo; Success' ), array( 'response' => 200 ) );\n}\n\n/**\n * Add a user to a blog based on details from maybe_add_existing_user_to_blog().\n *\n * @since MU\n *\n * @global int $blog_id\n *\n * @param array $details\n * @return true|WP_Error|void\n */\nfunction add_existing_user_to_blog( $details = false ) {\n\tglobal $blog_id;\n\n\tif ( is_array( $details ) ) {\n\t\t$result = add_user_to_blog( $blog_id, $details[ 'user_id' ], $details[ 'role' ] );\n\t\t/**\n\t\t * Fires immediately after an existing user is added to a site.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param int   $user_id User ID.\n\t\t * @param mixed $result  True on success or a WP_Error object if the user doesn't exist.\n\t\t */\n\t\tdo_action( 'added_existing_user', $details['user_id'], $result );\n\t\treturn $result;\n\t}\n}\n\n/**\n * Add a newly created user to the appropriate blog\n *\n * To add a user in general, use add_user_to_blog(). This function\n * is specifically hooked into the wpmu_activate_user action.\n *\n * @since MU\n * @see add_user_to_blog()\n *\n * @param int   $user_id\n * @param mixed $password Ignored.\n * @param array $meta\n */\nfunction add_new_user_to_blog( $user_id, $password, $meta ) {\n\tif ( !empty( $meta[ 'add_to_blog' ] ) ) {\n\t\t$blog_id = $meta[ 'add_to_blog' ];\n\t\t$role = $meta[ 'new_role' ];\n\t\tremove_user_from_blog($user_id, get_current_site()->blog_id); // remove user from main blog.\n\t\tadd_user_to_blog( $blog_id, $user_id, $role );\n\t\tupdate_user_meta( $user_id, 'primary_blog', $blog_id );\n\t}\n}\n\n/**\n * Correct From host on outgoing mail to match the site domain\n *\n * @since MU\n */\nfunction fix_phpmailer_messageid( $phpmailer ) {\n\t$phpmailer->Hostname = get_current_site()->domain;\n}\n\n/**\n * Check to see whether a user is marked as a spammer, based on user login.\n *\n * @since MU\n *\n * @param string|WP_User $user Optional. Defaults to current user. WP_User object,\n * \t                           or user login name as a string.\n * @return bool\n */\nfunction is_user_spammy( $user = null ) {\n    if ( ! ( $user instanceof WP_User ) ) {\n\t\tif ( $user ) {\n\t\t\t$user = get_user_by( 'login', $user );\n\t\t} else {\n\t\t\t$user = wp_get_current_user();\n\t\t}\n\t}\n\n\treturn $user && isset( $user->spam ) && 1 == $user->spam;\n}\n\n/**\n * Update this blog's 'public' setting in the global blogs table.\n *\n * Public blogs have a setting of 1, private blogs are 0.\n *\n * @since MU\n *\n * @param int $old_value\n * @param int $value     The new public value\n */\nfunction update_blog_public( $old_value, $value ) {\n\tupdate_blog_status( get_current_blog_id(), 'public', (int) $value );\n}\n\n/**\n * Check whether a usermeta key has to do with the current blog.\n *\n * @since MU\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $key\n * @param int    $user_id Optional. Defaults to current user.\n * @param int    $blog_id Optional. Defaults to current blog.\n * @return bool\n */\nfunction is_user_option_local( $key, $user_id = 0, $blog_id = 0 ) {\n\tglobal $wpdb;\n\n\t$current_user = wp_get_current_user();\n\tif ( $blog_id == 0 ) {\n\t\t$blog_id = $wpdb->blogid;\n\t}\n\t$local_key = $wpdb->get_blog_prefix( $blog_id ) . $key;\n\n\treturn isset( $current_user->$local_key );\n}\n\n/**\n * Check whether users can self-register, based on Network settings.\n *\n * @since MU\n *\n * @return bool\n */\nfunction users_can_register_signup_filter() {\n\t$registration = get_site_option('registration');\n\treturn ( $registration == 'all' || $registration == 'user' );\n}\n\n/**\n * Ensure that the welcome message is not empty. Currently unused.\n *\n * @since MU\n *\n * @param string $text\n * @return string\n */\nfunction welcome_user_msg_filter( $text ) {\n\tif ( !$text ) {\n\t\tremove_filter( 'site_option_welcome_user_email', 'welcome_user_msg_filter' );\n\n\t\t/* translators: Do not translate USERNAME, PASSWORD, LOGINLINK, SITE_NAME: those are placeholders. */\n\t\t$text = __( 'Howdy USERNAME,\n\nYour new account is set up.\n\nYou can log in with the following information:\nUsername: USERNAME\nPassword: PASSWORD\nLOGINLINK\n\nThanks!\n\n--The Team @ SITE_NAME' );\n\t\tupdate_site_option( 'welcome_user_email', $text );\n\t}\n\treturn $text;\n}\n\n/**\n * Whether to force SSL on content.\n *\n * @since 2.8.5\n *\n * @staticvar bool $forced_content\n *\n * @param bool $force\n * @return bool True if forced, false if not forced.\n */\nfunction force_ssl_content( $force = '' ) {\n\tstatic $forced_content = false;\n\n\tif ( '' != $force ) {\n\t\t$old_forced = $forced_content;\n\t\t$forced_content = $force;\n\t\treturn $old_forced;\n\t}\n\n\treturn $forced_content;\n}\n\n/**\n * Formats a URL to use https.\n *\n * Useful as a filter.\n *\n * @since 2.8.5\n *\n * @param string URL\n * @return string URL with https as the scheme\n */\nfunction filter_SSL( $url ) {\n\tif ( ! is_string( $url ) )\n\t\treturn get_bloginfo( 'url' ); // Return home blog url with proper scheme\n\n\tif ( force_ssl_content() && is_ssl() )\n\t\t$url = set_url_scheme( $url, 'https' );\n\n\treturn $url;\n}\n\n/**\n * Schedule update of the network-wide counts for the current network.\n *\n * @since 3.1.0\n */\nfunction wp_schedule_update_network_counts() {\n\tif ( !is_main_site() )\n\t\treturn;\n\n\tif ( ! wp_next_scheduled('update_network_counts') && ! wp_installing() )\n\t\twp_schedule_event(time(), 'twicedaily', 'update_network_counts');\n}\n\n/**\n *  Update the network-wide counts for the current network.\n *\n *  @since 3.1.0\n */\nfunction wp_update_network_counts() {\n\twp_update_network_user_counts();\n\twp_update_network_site_counts();\n}\n\n/**\n * Update the count of sites for the current network.\n *\n * If enabled through the 'enable_live_network_counts' filter, update the sites count\n * on a network when a site is created or its status is updated.\n *\n * @since 3.7.0\n */\nfunction wp_maybe_update_network_site_counts() {\n\t$is_small_network = ! wp_is_large_network( 'sites' );\n\n\t/**\n\t * Filter whether to update network site or user counts when a new site is created.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @see wp_is_large_network()\n\t *\n\t * @param bool   $small_network Whether the network is considered small.\n\t * @param string $context       Context. Either 'users' or 'sites'.\n\t */\n\tif ( ! apply_filters( 'enable_live_network_counts', $is_small_network, 'sites' ) )\n\t\treturn;\n\n\twp_update_network_site_counts();\n}\n\n/**\n * Update the network-wide users count.\n *\n * If enabled through the 'enable_live_network_counts' filter, update the users count\n * on a network when a user is created or its status is updated.\n *\n * @since 3.7.0\n */\nfunction wp_maybe_update_network_user_counts() {\n\t$is_small_network = ! wp_is_large_network( 'users' );\n\n\t/** This filter is documented in wp-includes/ms-functions.php */\n\tif ( ! apply_filters( 'enable_live_network_counts', $is_small_network, 'users' ) )\n\t\treturn;\n\n\twp_update_network_user_counts();\n}\n\n/**\n * Update the network-wide site count.\n *\n * @since 3.7.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction wp_update_network_site_counts() {\n\tglobal $wpdb;\n\n\t$count = $wpdb->get_var( $wpdb->prepare(\"SELECT COUNT(blog_id) as c FROM $wpdb->blogs WHERE site_id = %d AND spam = '0' AND deleted = '0' and archived = '0'\", $wpdb->siteid) );\n\tupdate_site_option( 'blog_count', $count );\n}\n\n/**\n * Update the network-wide user count.\n *\n * @since 3.7.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction wp_update_network_user_counts() {\n\tglobal $wpdb;\n\n\t$count = $wpdb->get_var( \"SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0'\" );\n\tupdate_site_option( 'user_count', $count );\n}\n\n/**\n * Returns the space used by the current blog.\n *\n * @since 3.5.0\n *\n * @return int Used space in megabytes\n */\nfunction get_space_used() {\n\t/**\n\t * Filter the amount of storage space used by the current site.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param int|bool $space_used The amount of used space, in megabytes. Default false.\n\t */\n\t$space_used = apply_filters( 'pre_get_space_used', false );\n\tif ( false === $space_used ) {\n\t\t$upload_dir = wp_upload_dir();\n\t\t$space_used = get_dirsize( $upload_dir['basedir'] ) / MB_IN_BYTES;\n\t}\n\n\treturn $space_used;\n}\n\n/**\n * Returns the upload quota for the current blog.\n *\n * @since MU\n *\n * @return int Quota in megabytes\n */\nfunction get_space_allowed() {\n\t$space_allowed = get_option( 'blog_upload_space' );\n\n\tif ( ! is_numeric( $space_allowed ) )\n\t\t$space_allowed = get_site_option( 'blog_upload_space' );\n\n\tif ( ! is_numeric( $space_allowed ) )\n\t\t$space_allowed = 100;\n\n\t/**\n\t * Filter the upload quota for the current site.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param int $space_allowed Upload quota in megabytes for the current blog.\n\t */\n\treturn apply_filters( 'get_space_allowed', $space_allowed );\n}\n\n/**\n * Determines if there is any upload space left in the current blog's quota.\n *\n * @since 3.0.0\n *\n * @return int of upload space available in bytes\n */\nfunction get_upload_space_available() {\n\t$allowed = get_space_allowed();\n\tif ( $allowed < 0 ) {\n\t\t$allowed = 0;\n\t}\n\t$space_allowed = $allowed * MB_IN_BYTES;\n\tif ( get_site_option( 'upload_space_check_disabled' ) )\n\t\treturn $space_allowed;\n\n\t$space_used = get_space_used() * MB_IN_BYTES;\n\n\tif ( ( $space_allowed - $space_used ) <= 0 )\n\t\treturn 0;\n\n\treturn $space_allowed - $space_used;\n}\n\n/**\n * Determines if there is any upload space left in the current blog's quota.\n *\n * @since 3.0.0\n * @return bool True if space is available, false otherwise.\n */\nfunction is_upload_space_available() {\n\tif ( get_site_option( 'upload_space_check_disabled' ) )\n\t\treturn true;\n\n\treturn (bool) get_upload_space_available();\n}\n\n/**\n * @since 3.0.0\n *\n * @return int of upload size limit in bytes\n */\nfunction upload_size_limit_filter( $size ) {\n\t$fileupload_maxk = KB_IN_BYTES * get_site_option( 'fileupload_maxk', 1500 );\n\tif ( get_site_option( 'upload_space_check_disabled' ) )\n\t\treturn min( $size, $fileupload_maxk );\n\n\treturn min( $size, $fileupload_maxk, get_upload_space_available() );\n}\n\n/**\n * Whether or not we have a large network.\n *\n * The default criteria for a large network is either more than 10,000 users or more than 10,000 sites.\n * Plugins can alter this criteria using the 'wp_is_large_network' filter.\n *\n * @since 3.3.0\n * @param string $using 'sites or 'users'. Default is 'sites'.\n * @return bool True if the network meets the criteria for large. False otherwise.\n */\nfunction wp_is_large_network( $using = 'sites' ) {\n\tif ( 'users' == $using ) {\n\t\t$count = get_user_count();\n\t\t/**\n\t\t * Filter whether the network is considered large.\n\t\t *\n\t\t * @since 3.3.0\n\t\t *\n\t\t * @param bool   $is_large_network Whether the network has more than 10000 users or sites.\n\t\t * @param string $component        The component to count. Accepts 'users', or 'sites'.\n\t\t * @param int    $count            The count of items for the component.\n\t\t */\n\t\treturn apply_filters( 'wp_is_large_network', $count > 10000, 'users', $count );\n\t}\n\n\t$count = get_blog_count();\n\t/** This filter is documented in wp-includes/ms-functions.php */\n\treturn apply_filters( 'wp_is_large_network', $count > 10000, 'sites', $count );\n}\n\n\n/**\n * Return an array of sites for a network or networks.\n *\n * @since 3.7.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $args {\n *     Array of default arguments. Optional.\n *\n *     @type int|array $network_id A network ID or array of network IDs. Set to null to retrieve sites\n *                                 from all networks. Defaults to current network ID.\n *     @type int       $public     Retrieve public or non-public sites. Default null, for any.\n *     @type int       $archived   Retrieve archived or non-archived sites. Default null, for any.\n *     @type int       $mature     Retrieve mature or non-mature sites. Default null, for any.\n *     @type int       $spam       Retrieve spam or non-spam sites. Default null, for any.\n *     @type int       $deleted    Retrieve deleted or non-deleted sites. Default null, for any.\n *     @type int       $limit      Number of sites to limit the query to. Default 100.\n *     @type int       $offset     Exclude the first x sites. Used in combination with the $limit parameter. Default 0.\n * }\n * @return array An empty array if the install is considered \"large\" via wp_is_large_network(). Otherwise,\n *               an associative array of site data arrays, each containing the site (network) ID, blog ID,\n *               site domain and path, dates registered and modified, and the language ID. Also, boolean\n *               values for whether the site is public, archived, mature, spam, and/or deleted.\n */\nfunction wp_get_sites( $args = array() ) {\n\tglobal $wpdb;\n\n\tif ( wp_is_large_network() )\n\t\treturn array();\n\n\t$defaults = array(\n\t\t'network_id' => $wpdb->siteid,\n\t\t'public'     => null,\n\t\t'archived'   => null,\n\t\t'mature'     => null,\n\t\t'spam'       => null,\n\t\t'deleted'    => null,\n\t\t'limit'      => 100,\n\t\t'offset'     => 0,\n\t);\n\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$query = \"SELECT * FROM $wpdb->blogs WHERE 1=1 \";\n\n\tif ( isset( $args['network_id'] ) && ( is_array( $args['network_id'] ) || is_numeric( $args['network_id'] ) ) ) {\n\t\t$network_ids = implode( ',', wp_parse_id_list( $args['network_id'] ) );\n\t\t$query .= \"AND site_id IN ($network_ids) \";\n\t}\n\n\tif ( isset( $args['public'] ) )\n\t\t$query .= $wpdb->prepare( \"AND public = %d \", $args['public'] );\n\n\tif ( isset( $args['archived'] ) )\n\t\t$query .= $wpdb->prepare( \"AND archived = %d \", $args['archived'] );\n\n\tif ( isset( $args['mature'] ) )\n\t\t$query .= $wpdb->prepare( \"AND mature = %d \", $args['mature'] );\n\n\tif ( isset( $args['spam'] ) )\n\t\t$query .= $wpdb->prepare( \"AND spam = %d \", $args['spam'] );\n\n\tif ( isset( $args['deleted'] ) )\n\t\t$query .= $wpdb->prepare( \"AND deleted = %d \", $args['deleted'] );\n\n\tif ( isset( $args['limit'] ) && $args['limit'] ) {\n\t\tif ( isset( $args['offset'] ) && $args['offset'] )\n\t\t\t$query .= $wpdb->prepare( \"LIMIT %d , %d \", $args['offset'], $args['limit'] );\n\t\telse\n\t\t\t$query .= $wpdb->prepare( \"LIMIT %d \", $args['limit'] );\n\t}\n\n\t$site_results = $wpdb->get_results( $query, ARRAY_A );\n\n\treturn $site_results;\n}\n\n/**\n * Retrieves a list of reserved site on a sub-directory Multisite install.\n *\n * @since 4.4.0\n *\n * @return array $names Array of reserved subdirectory names.\n */\nfunction get_subdirectory_reserved_names() {\n\t$names = array(\n\t\t'page', 'comments', 'blog', 'files', 'feed', 'wp-admin',\n\t\t'wp-content', 'wp-includes', 'wp-json', 'embed'\n\t);\n\n\t/**\n\t * Filter reserved site names on a sub-directory Multisite install.\n\t *\n\t * @since 3.0.0\n\t * @since 4.4.0 'wp-admin', 'wp-content', 'wp-includes', 'wp-json', and 'embed' were added\n\t *              to the reserved names list.\n\t *\n\t * @param array $subdirectory_reserved_names Array of reserved names.\n\t */\n\treturn apply_filters( 'subdirectory_reserved_names', $names );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ms-load.php",
    "content": "<?php\n/**\n * These functions are needed to load Multisite.\n *\n * @since 3.0.0\n *\n * @package WordPress\n * @subpackage Multisite\n */\n\n/**\n * Whether a subdomain configuration is enabled.\n *\n * @since 3.0.0\n *\n * @return bool True if subdomain configuration is enabled, false otherwise.\n */\nfunction is_subdomain_install() {\n\tif ( defined('SUBDOMAIN_INSTALL') )\n\t\treturn SUBDOMAIN_INSTALL;\n\n\treturn ( defined( 'VHOST' ) && VHOST == 'yes' );\n}\n\n/**\n * Returns array of network plugin files to be included in global scope.\n *\n * The default directory is wp-content/plugins. To change the default directory\n * manually, define `WP_PLUGIN_DIR` and `WP_PLUGIN_URL` in `wp-config.php`.\n *\n * @access private\n * @since 3.1.0\n *\n * @return array Files to include.\n */\nfunction wp_get_active_network_plugins() {\n\t$active_plugins = (array) get_site_option( 'active_sitewide_plugins', array() );\n\tif ( empty( $active_plugins ) )\n\t\treturn array();\n\n\t$plugins = array();\n\t$active_plugins = array_keys( $active_plugins );\n\tsort( $active_plugins );\n\n\tforeach ( $active_plugins as $plugin ) {\n\t\tif ( ! validate_file( $plugin ) // $plugin must validate as file\n\t\t\t&& '.php' == substr( $plugin, -4 ) // $plugin must end with '.php'\n\t\t\t&& file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist\n\t\t\t)\n\t\t$plugins[] = WP_PLUGIN_DIR . '/' . $plugin;\n\t}\n\treturn $plugins;\n}\n\n/**\n * Checks status of current blog.\n *\n * Checks if the blog is deleted, inactive, archived, or spammed.\n *\n * Dies with a default message if the blog does not pass the check.\n *\n * To change the default message when a blog does not pass the check,\n * use the wp-content/blog-deleted.php, blog-inactive.php and\n * blog-suspended.php drop-ins.\n *\n * @since 3.0.0\n *\n * @return true|string Returns true on success, or drop-in file to include.\n */\nfunction ms_site_check() {\n\t$blog = get_blog_details();\n\n\t/**\n\t * Filter checking the status of the current blog.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param bool null Whether to skip the blog status check. Default null.\n\t*/\n\t$check = apply_filters( 'ms_site_check', null );\n\tif ( null !== $check )\n\t\treturn true;\n\n\t// Allow super admins to see blocked sites\n\tif ( is_super_admin() )\n\t\treturn true;\n\n\tif ( '1' == $blog->deleted ) {\n\t\tif ( file_exists( WP_CONTENT_DIR . '/blog-deleted.php' ) )\n\t\t\treturn WP_CONTENT_DIR . '/blog-deleted.php';\n\t\telse\n\t\t\twp_die( __( 'This site is no longer available.' ), '', array( 'response' => 410 ) );\n\t}\n\n\tif ( '2' == $blog->deleted ) {\n\t\tif ( file_exists( WP_CONTENT_DIR . '/blog-inactive.php' ) ) {\n\t\t\treturn WP_CONTENT_DIR . '/blog-inactive.php';\n\t\t} else {\n\t\t\t$admin_email = str_replace( '@', ' AT ', get_site_option( 'admin_email', 'support@' . get_current_site()->domain ) );\n\t\t\twp_die(\n\t\t\t\t/* translators: %s: admin email link */\n\t\t\t\tsprintf( __( 'This site has not been activated yet. If you are having problems activating your site, please contact %s.' ),\n\t\t\t\t\tsprintf( '<a href=\"mailto:%s\">%s</a>', $admin_email )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t}\n\n\tif ( $blog->archived == '1' || $blog->spam == '1' ) {\n\t\tif ( file_exists( WP_CONTENT_DIR . '/blog-suspended.php' ) )\n\t\t\treturn WP_CONTENT_DIR . '/blog-suspended.php';\n\t\telse\n\t\t\twp_die( __( 'This site has been archived or suspended.' ), '', array( 'response' => 410 ) );\n\t}\n\n\treturn true;\n}\n\n/**\n * Retrieve the closest matching network for a domain and path.\n *\n * @since 3.9.0\n * @since 4.4.0 Converted to a wrapper for WP_Network::get_by_path()\n *\n * @param string   $domain   Domain to check.\n * @param string   $path     Path to check.\n * @param int|null $segments Path segments to use. Defaults to null, or the full path.\n * @return WP_Network|false Network object if successful. False when no network is found.\n */\nfunction get_network_by_path( $domain, $path, $segments = null ) {\n\treturn WP_Network::get_by_path( $domain, $path, $segments );\n}\n\n/**\n * Retrieve an object containing information about the requested network.\n *\n * @since 3.9.0\n * @since 4.4.0 Converted to leverage WP_Network\n *\n * @param object|int $network The network's database row or ID.\n * @return WP_Network|false Object containing network information if found, false if not.\n */\nfunction wp_get_network( $network ) {\n\tif ( ! is_object( $network ) ) {\n\t\t$network = WP_Network::get_instance( $network );\n\t} else {\n\t\t$network = new WP_Network( $network );\n\t}\n\n\treturn $network;\n}\n\n/**\n * Retrieve a site object by its domain and path.\n *\n * @since 3.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string   $domain   Domain to check.\n * @param string   $path     Path to check.\n * @param int|null $segments Path segments to use. Defaults to null, or the full path.\n * @return object|false Site object if successful. False when no site is found.\n */\nfunction get_site_by_path( $domain, $path, $segments = null ) {\n\tglobal $wpdb;\n\n\t$path_segments = array_filter( explode( '/', trim( $path, '/' ) ) );\n\n\t/**\n\t * Filter the number of path segments to consider when searching for a site.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param int|null $segments The number of path segments to consider. WordPress by default looks at\n\t *                           one path segment following the network path. The function default of\n\t *                           null only makes sense when you know the requested path should match a site.\n\t * @param string   $domain   The requested domain.\n\t * @param string   $path     The requested path, in full.\n\t */\n\t$segments = apply_filters( 'site_by_path_segments_count', $segments, $domain, $path );\n\n\tif ( null !== $segments && count( $path_segments ) > $segments ) {\n\t\t$path_segments = array_slice( $path_segments, 0, $segments );\n\t}\n\n\t$paths = array();\n\n\twhile ( count( $path_segments ) ) {\n\t\t$paths[] = '/' . implode( '/', $path_segments ) . '/';\n\t\tarray_pop( $path_segments );\n\t}\n\n\t$paths[] = '/';\n\n\t/**\n\t * Determine a site by its domain and path.\n\t *\n\t * This allows one to short-circuit the default logic, perhaps by\n\t * replacing it with a routine that is more optimal for your setup.\n\t *\n\t * Return null to avoid the short-circuit. Return false if no site\n\t * can be found at the requested domain and path. Otherwise, return\n\t * a site object.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param null|bool|object $site     Site value to return by path.\n\t * @param string           $domain   The requested domain.\n\t * @param string           $path     The requested path, in full.\n\t * @param int|null         $segments The suggested number of paths to consult.\n\t *                                   Default null, meaning the entire path was to be consulted.\n\t * @param array            $paths    The paths to search for, based on $path and $segments.\n\t */\n\t$pre = apply_filters( 'pre_get_site_by_path', null, $domain, $path, $segments, $paths );\n\tif ( null !== $pre ) {\n\t\treturn $pre;\n\t}\n\n\t/*\n\t * @todo\n\t * get_blog_details(), caching, etc. Consider alternative optimization routes,\n\t * perhaps as an opt-in for plugins, rather than using the pre_* filter.\n\t * For example: The segments filter can expand or ignore paths.\n\t * If persistent caching is enabled, we could query the DB for a path <> '/'\n\t * then cache whether we can just always ignore paths.\n\t */\n\n\t// Either www or non-www is supported, not both. If a www domain is requested,\n\t// query for both to provide the proper redirect.\n\t$domains = array( $domain );\n\tif ( 'www.' === substr( $domain, 0, 4 ) ) {\n\t\t$domains[] = substr( $domain, 4 );\n\t\t$search_domains = \"'\" . implode( \"', '\", $wpdb->_escape( $domains ) ) . \"'\";\n\t}\n\n\tif ( count( $paths ) > 1 ) {\n\t\t$search_paths = \"'\" . implode( \"', '\", $wpdb->_escape( $paths ) ) . \"'\";\n\t}\n\n\tif ( count( $domains ) > 1 && count( $paths ) > 1 ) {\n\t\t$site = $wpdb->get_row( \"SELECT * FROM $wpdb->blogs WHERE domain IN ($search_domains) AND path IN ($search_paths) ORDER BY CHAR_LENGTH(domain) DESC, CHAR_LENGTH(path) DESC LIMIT 1\" );\n\t} elseif ( count( $domains ) > 1 ) {\n\t\t$sql = $wpdb->prepare( \"SELECT * FROM $wpdb->blogs WHERE path = %s\", $paths[0] );\n\t\t$sql .= \" AND domain IN ($search_domains) ORDER BY CHAR_LENGTH(domain) DESC LIMIT 1\";\n\t\t$site = $wpdb->get_row( $sql );\n\t} elseif ( count( $paths ) > 1 ) {\n\t\t$sql = $wpdb->prepare( \"SELECT * FROM $wpdb->blogs WHERE domain = %s\", $domains[0] );\n\t\t$sql .= \" AND path IN ($search_paths) ORDER BY CHAR_LENGTH(path) DESC LIMIT 1\";\n\t\t$site = $wpdb->get_row( $sql );\n\t} else {\n\t\t$site = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->blogs WHERE domain = %s AND path = %s\", $domains[0], $paths[0] ) );\n\t}\n\n\tif ( $site ) {\n\t\t// @todo get_blog_details()\n\t\treturn $site;\n\t}\n\n\treturn false;\n}\n\n/**\n * Displays a failure message.\n *\n * Used when a blog's tables do not exist. Checks for a missing $wpdb->site table as well.\n *\n * @access private\n * @since 3.0.0\n * @since 4.4.0 The `$domain` and `$path` parameters were added.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $domain The requested domain for the error to reference.\n * @param string $path   The requested path for the error to reference.\n */\nfunction ms_not_installed( $domain, $path ) {\n\tglobal $wpdb;\n\n\tif ( ! is_admin() ) {\n\t\tdead_db();\n\t}\n\n\twp_load_translations_early();\n\n\t$title = __( 'Error establishing a database connection' );\n\n\t$msg  = '<h1>' . $title . '</h1>';\n\t$msg .= '<p>' . __( 'If your site does not display, please contact the owner of this network.' ) . '';\n\t$msg .= ' ' . __( 'If you are the owner of this network please check that MySQL is running properly and all tables are error free.' ) . '</p>';\n\t$query = $wpdb->prepare( \"SHOW TABLES LIKE %s\", $wpdb->esc_like( $wpdb->site ) );\n\tif ( ! $wpdb->get_var( $query ) ) {\n\t\t$msg .= '<p>' . sprintf(\n\t\t\t/* translators: %s: table name */\n\t\t\t__( '<strong>Database tables are missing.</strong> This means that MySQL is not running, WordPress was not installed properly, or someone deleted %s. You really should look at your database now.' ),\n\t\t\t'<code>' . $wpdb->site . '</code>'\n\t\t) . '</p>';\n\t} else {\n\t\t$msg .= '<p>' . sprintf(\n\t\t\t/* translators: 1: site url, 2: table name, 3: database name */\n\t\t\t__( '<strong>Could not find site %1$s.</strong> Searched for table %2$s in database %3$s. Is that right?' ),\n\t\t\t'<code>' . rtrim( $domain . $path, '/' ) . '</code>',\n\t\t\t'<code>' . $wpdb->blogs . '</code>',\n\t\t\t'<code>' . DB_NAME . '</code>'\n\t\t) . '</p>';\n\t}\n\t$msg .= '<p><strong>' . __( 'What do I do now?' ) . '</strong> ';\n\t/* translators: %s: Codex URL */\n\t$msg .= sprintf( __( 'Read the <a href=\"%s\" target=\"_blank\">bug report</a> page. Some of the guidelines there may help you figure out what went wrong.' ),\n\t\t__( 'https://codex.wordpress.org/Debugging_a_WordPress_Network' )\n\t);\n\t$msg .= ' ' . __( 'If you&#8217;re still stuck with this message, then check that your database contains the following tables:' ) . '</p><ul>';\n\tforeach ( $wpdb->tables('global') as $t => $table ) {\n\t\tif ( 'sitecategories' == $t )\n\t\t\tcontinue;\n\t\t$msg .= '<li>' . $table . '</li>';\n\t}\n\t$msg .= '</ul>';\n\n\twp_die( $msg, $title, array( 'response' => 500 ) );\n}\n\n/**\n * This deprecated function formerly set the site_name property of the $current_site object.\n *\n * This function simply returns the object, as before.\n * The bootstrap takes care of setting site_name.\n *\n * @access private\n * @since 3.0.0\n * @deprecated 3.9.0 Use get_current_site() instead.\n *\n * @param object $current_site\n * @return object\n */\nfunction get_current_site_name( $current_site ) {\n\t_deprecated_function( __FUNCTION__, '3.9', 'get_current_site()' );\n\treturn $current_site;\n}\n\n/**\n * This deprecated function managed much of the site and network loading in multisite.\n *\n * The current bootstrap code is now responsible for parsing the site and network load as\n * well as setting the global $current_site object.\n *\n * @access private\n * @since 3.0.0\n * @deprecated 3.9.0\n *\n * @global object $current_site\n *\n * @return object\n */\nfunction wpmu_current_site() {\n\tglobal $current_site;\n\t_deprecated_function( __FUNCTION__, '3.9' );\n\treturn $current_site;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/ms-settings.php",
    "content": "<?php\n/**\n * Used to set up and fix common variables and include\n * the Multisite procedural and class library.\n *\n * Allows for some configuration in wp-config.php (see ms-default-constants.php)\n *\n * @package WordPress\n * @subpackage Multisite\n * @since 3.0.0\n */\n\n/** WP_Network class */\nrequire_once( ABSPATH . WPINC . '/class-wp-network.php' );\n\n/** Multisite loader */\nrequire_once( ABSPATH . WPINC . '/ms-load.php' );\n\n/** Default Multisite constants */\nrequire_once( ABSPATH . WPINC . '/ms-default-constants.php' );\n\nif ( defined( 'SUNRISE' ) ) {\n\tinclude_once( WP_CONTENT_DIR . '/sunrise.php' );\n}\n\n/** Check for and define SUBDOMAIN_INSTALL and the deprecated VHOST constant. */\nms_subdomain_constants();\n\nif ( !isset( $current_site ) || !isset( $current_blog ) ) {\n\n\t// Given the domain and path, let's try to identify the network and site.\n\t// Usually, it's easier to query the site first, which declares its network.\n\t// In limited situations, though, we either can or must find the network first.\n\n\t$domain = strtolower( stripslashes( $_SERVER['HTTP_HOST'] ) );\n\tif ( substr( $domain, -3 ) == ':80' ) {\n\t\t$domain = substr( $domain, 0, -3 );\n\t\t$_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -3 );\n\t} elseif ( substr( $domain, -4 ) == ':443' ) {\n\t\t$domain = substr( $domain, 0, -4 );\n\t\t$_SERVER['HTTP_HOST'] = substr( $_SERVER['HTTP_HOST'], 0, -4 );\n\t}\n\n\t$path = stripslashes( $_SERVER['REQUEST_URI'] );\n\tif ( is_admin() ) {\n\t\t$path = preg_replace( '#(.*)/wp-admin/.*#', '$1/', $path );\n\t}\n\tlist( $path ) = explode( '?', $path );\n\n\t// If the network is defined in wp-config.php, we can simply use that.\n\tif ( defined( 'DOMAIN_CURRENT_SITE' ) && defined( 'PATH_CURRENT_SITE' ) ) {\n\t\t$current_site = new stdClass;\n\t\t$current_site->id = defined( 'SITE_ID_CURRENT_SITE' ) ? SITE_ID_CURRENT_SITE : 1;\n\t\t$current_site->domain = DOMAIN_CURRENT_SITE;\n\t\t$current_site->path = PATH_CURRENT_SITE;\n\t\tif ( defined( 'BLOG_ID_CURRENT_SITE' ) ) {\n\t\t\t$current_site->blog_id = BLOG_ID_CURRENT_SITE;\n\t\t} elseif ( defined( 'BLOGID_CURRENT_SITE' ) ) { // deprecated.\n\t\t\t$current_site->blog_id = BLOGID_CURRENT_SITE;\n\t\t}\n\n\t\tif ( 0 === strcasecmp( $current_site->domain, $domain ) && 0 === strcasecmp( $current_site->path, $path ) ) {\n\t\t\t$current_blog = get_site_by_path( $domain, $path );\n\t\t} elseif ( '/' !== $current_site->path && 0 === strcasecmp( $current_site->domain, $domain ) && 0 === stripos( $path, $current_site->path ) ) {\n\t\t\t// If the current network has a path and also matches the domain and path of the request,\n\t\t\t// we need to look for a site using the first path segment following the network's path.\n\t\t\t$current_blog = get_site_by_path( $domain, $path, 1 + count( explode( '/', trim( $current_site->path, '/' ) ) ) );\n\t\t} else {\n\t\t\t// Otherwise, use the first path segment (as usual).\n\t\t\t$current_blog = get_site_by_path( $domain, $path, 1 );\n\t\t}\n\n\t} elseif ( ! is_subdomain_install() ) {\n\t\t/*\n\t\t * A \"subdomain\" install can be re-interpreted to mean \"can support any domain\".\n\t\t * If we're not dealing with one of these installs, then the important part is determining\n\t\t * the network first, because we need the network's path to identify any sites.\n\t\t */\n\t\tif ( ! $current_site = wp_cache_get( 'current_network', 'site-options' ) ) {\n\t\t\t// Are there even two networks installed?\n\t\t\t$one_network = $wpdb->get_row( \"SELECT * FROM $wpdb->site LIMIT 2\" ); // [sic]\n\t\t\tif ( 1 === $wpdb->num_rows ) {\n\t\t\t\t$current_site = new WP_Network( $one_network );\n\t\t\t\twp_cache_add( 'current_network', $current_site, 'site-options' );\n\t\t\t} elseif ( 0 === $wpdb->num_rows ) {\n\t\t\t\tms_not_installed( $domain, $path );\n\t\t\t}\n\t\t}\n\t\tif ( empty( $current_site ) ) {\n\t\t\t$current_site = WP_Network::get_by_path( $domain, $path, 1 );\n\t\t}\n\n\t\tif ( empty( $current_site ) ) {\n\t\t\t/**\n\t\t\t * Fires when a network cannot be found based on the requested domain and path.\n\t\t\t *\n\t\t\t * At the time of this action, the only recourse is to redirect somewhere\n\t\t\t * and exit. If you want to declare a particular network, do so earlier.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param string $domain       The domain used to search for a network.\n\t\t\t * @param string $path         The path used to search for a path.\n\t\t\t */\n\t\t\tdo_action( 'ms_network_not_found', $domain, $path );\n\n\t\t\tms_not_installed( $domain, $path );\n\t\t} elseif ( $path === $current_site->path ) {\n\t\t\t$current_blog = get_site_by_path( $domain, $path );\n\t\t} else {\n\t\t\t// Search the network path + one more path segment (on top of the network path).\n\t\t\t$current_blog = get_site_by_path( $domain, $path, substr_count( $current_site->path, '/' ) );\n\t\t}\n\t} else {\n\t\t// Find the site by the domain and at most the first path segment.\n\t\t$current_blog = get_site_by_path( $domain, $path, 1 );\n\t\tif ( $current_blog ) {\n\t\t\t$current_site = WP_Network::get_instance( $current_blog->site_id ? $current_blog->site_id : 1 );\n\t\t} else {\n\t\t\t// If you don't have a site with the same domain/path as a network, you're pretty screwed, but:\n\t\t\t$current_site = WP_Network::get_by_path( $domain, $path, 1 );\n\t\t}\n\t}\n\n\t// The network declared by the site trumps any constants.\n\tif ( $current_blog && $current_blog->site_id != $current_site->id ) {\n\t\t$current_site = WP_Network::get_instance( $current_blog->site_id );\n\t}\n\n\t// No network has been found, bail.\n\tif ( empty( $current_site ) ) {\n\t\t/** This action is documented in wp-includes/ms-settings.php */\n\t\tdo_action( 'ms_network_not_found', $domain, $path );\n\n\t\tms_not_installed( $domain, $path );\n\t}\n\n\t// @todo Investigate when exactly this can occur.\n\tif ( empty( $current_blog ) && wp_installing() ) {\n\t\t$current_blog = new stdClass;\n\t\t$current_blog->blog_id = $blog_id = 1;\n\t}\n\n\t// No site has been found, bail.\n\tif ( empty( $current_blog ) ) {\n\t\t// We're going to redirect to the network URL, with some possible modifications.\n\t\t$scheme = is_ssl() ? 'https' : 'http';\n\t\t$destination = \"$scheme://{$current_site->domain}{$current_site->path}\";\n\n\t\t/**\n\t\t * Fires when a network can be determined but a site cannot.\n\t\t *\n\t\t * At the time of this action, the only recourse is to redirect somewhere\n\t\t * and exit. If you want to declare a particular site, do so earlier.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param object $current_site The network that had been determined.\n\t\t * @param string $domain       The domain used to search for a site.\n\t\t * @param string $path         The path used to search for a site.\n\t\t */\n\t\tdo_action( 'ms_site_not_found', $current_site, $domain, $path );\n\n\t\tif ( is_subdomain_install() && ! defined( 'NOBLOGREDIRECT' ) ) {\n\t\t\t// For a \"subdomain\" install, redirect to the signup form specifically.\n\t\t\t$destination .= 'wp-signup.php?new=' . str_replace( '.' . $current_site->domain, '', $domain );\n\t\t} elseif ( is_subdomain_install() ) {\n\t\t\t// For a \"subdomain\" install, the NOBLOGREDIRECT constant\n\t\t\t// can be used to avoid a redirect to the signup form.\n\t\t\t// Using the ms_site_not_found action is preferred to the constant.\n\t\t\tif ( '%siteurl%' !== NOBLOGREDIRECT ) {\n\t\t\t\t$destination = NOBLOGREDIRECT;\n\t\t\t}\n\t\t} elseif ( 0 === strcasecmp( $current_site->domain, $domain ) ) {\n\t\t\t/*\n\t\t\t * If the domain we were searching for matches the network's domain,\n\t\t\t * it's no use redirecting back to ourselves -- it'll cause a loop.\n\t\t\t * As we couldn't find a site, we're simply not installed.\n\t\t\t */\n\t\t\tms_not_installed( $domain, $path );\n\t\t}\n\n\t\theader( 'Location: ' . $destination );\n\t\texit;\n\t}\n\n\t// Figure out the current network's main site.\n\tif ( empty( $current_site->blog_id ) ) {\n\t\tif ( $current_blog->domain === $current_site->domain && $current_blog->path === $current_site->path ) {\n\t\t\t$current_site->blog_id = $current_blog->blog_id;\n\t\t} elseif ( ! $current_site->blog_id = wp_cache_get( 'network:' . $current_site->id . ':main_site', 'site-options' ) ) {\n\t\t\t$current_site->blog_id = $wpdb->get_var( $wpdb->prepare( \"SELECT blog_id FROM $wpdb->blogs WHERE domain = %s AND path = %s\",\n\t\t\t\t$current_site->domain, $current_site->path ) );\n\t\t\twp_cache_add( 'network:' . $current_site->id . ':main_site', $current_site->blog_id, 'site-options' );\n\t\t}\n\t}\n\n\t$blog_id = $current_blog->blog_id;\n\t$public  = $current_blog->public;\n\n\tif ( empty( $current_blog->site_id ) ) {\n\t\t// This dates to [MU134] and shouldn't be relevant anymore,\n\t\t// but it could be possible for arguments passed to insert_blog() etc.\n\t\t$current_blog->site_id = 1;\n\t}\n\n\t$site_id = $current_blog->site_id;\n\twp_load_core_site_options( $site_id );\n}\n\n$wpdb->set_prefix( $table_prefix, false ); // $table_prefix can be set in sunrise.php\n$wpdb->set_blog_id( $current_blog->blog_id, $current_blog->site_id );\n$table_prefix = $wpdb->get_blog_prefix();\n$_wp_switched_stack = array();\n$switched = false;\n\n// need to init cache again after blog_id is set\nwp_start_object_cache();\n\nif ( ! $current_site instanceof WP_Network ) {\n\t$current_site = new WP_Network( $current_site );\n}\n\n// Define upload directory constants\nms_upload_constants();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/nav-menu-template.php",
    "content": "<?php\n/**\n * Navigation Menu template functions\n *\n * @package WordPress\n * @subpackage Nav_Menus\n * @since 3.0.0\n */\n\n/**\n * Create HTML list of nav menu items.\n *\n * @since 3.0.0\n * @uses Walker\n */\nclass Walker_Nav_Menu extends Walker {\n\t/**\n\t * What the class handles.\n\t *\n\t * @see Walker::$tree_type\n\t * @since 3.0.0\n\t * @var string\n\t */\n\tpublic $tree_type = array( 'post_type', 'taxonomy', 'custom' );\n\n\t/**\n\t * Database fields to use.\n\t *\n\t * @see Walker::$db_fields\n\t * @since 3.0.0\n\t * @todo Decouple this.\n\t * @var array\n\t */\n\tpublic $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );\n\n\t/**\n\t * Starts the list before the elements are added.\n\t *\n\t * @see Walker::start_lvl()\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of menu item. Used for padding.\n\t * @param array  $args   An array of arguments. @see wp_nav_menu()\n\t */\n\tpublic function start_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$indent = str_repeat(\"\\t\", $depth);\n\t\t$output .= \"\\n$indent<ul class=\\\"sub-menu\\\">\\n\";\n\t}\n\n\t/**\n\t * Ends the list of after the elements are added.\n\t *\n\t * @see Walker::end_lvl()\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param int    $depth  Depth of menu item. Used for padding.\n\t * @param array  $args   An array of arguments. @see wp_nav_menu()\n\t */\n\tpublic function end_lvl( &$output, $depth = 0, $args = array() ) {\n\t\t$indent = str_repeat(\"\\t\", $depth);\n\t\t$output .= \"$indent</ul>\\n\";\n\t}\n\n\t/**\n\t * Start the element output.\n\t *\n\t * @see Walker::start_el()\n\t *\n\t * @since 3.0.0\n\t * @since 4.4.0 'nav_menu_item_args' filter was added.\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param object $item   Menu item data object.\n\t * @param int    $depth  Depth of menu item. Used for padding.\n\t * @param array  $args   An array of arguments. @see wp_nav_menu()\n\t * @param int    $id     Current item ID.\n\t */\n\tpublic function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {\n\t\t$indent = ( $depth ) ? str_repeat( \"\\t\", $depth ) : '';\n\n\t\t$classes = empty( $item->classes ) ? array() : (array) $item->classes;\n\t\t$classes[] = 'menu-item-' . $item->ID;\n\n\t\t/**\n\t\t * Filter the arguments for a single nav menu item.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array  $args  An array of arguments.\n\t\t * @param object $item  Menu item data object.\n\t\t * @param int    $depth Depth of menu item. Used for padding.\n\t\t */\n\t\t$args = apply_filters( 'nav_menu_item_args', $args, $item, $depth );\n\n\t\t/**\n\t\t * Filter the CSS class(es) applied to a menu item's list item element.\n\t\t *\n\t\t * @since 3.0.0\n\t\t * @since 4.1.0 The `$depth` parameter was added.\n\t\t *\n\t\t * @param array  $classes The CSS classes that are applied to the menu item's `<li>` element.\n\t\t * @param object $item    The current menu item.\n\t\t * @param array  $args    An array of {@see wp_nav_menu()} arguments.\n\t\t * @param int    $depth   Depth of menu item. Used for padding.\n\t\t */\n\t\t$class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );\n\t\t$class_names = $class_names ? ' class=\"' . esc_attr( $class_names ) . '\"' : '';\n\n\t\t/**\n\t\t * Filter the ID applied to a menu item's list item element.\n\t\t *\n\t\t * @since 3.0.1\n\t\t * @since 4.1.0 The `$depth` parameter was added.\n\t\t *\n\t\t * @param string $menu_id The ID that is applied to the menu item's `<li>` element.\n\t\t * @param object $item    The current menu item.\n\t\t * @param array  $args    An array of {@see wp_nav_menu()} arguments.\n\t\t * @param int    $depth   Depth of menu item. Used for padding.\n\t\t */\n\t\t$id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth );\n\t\t$id = $id ? ' id=\"' . esc_attr( $id ) . '\"' : '';\n\n\t\t$output .= $indent . '<li' . $id . $class_names .'>';\n\n\t\t$atts = array();\n\t\t$atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';\n\t\t$atts['target'] = ! empty( $item->target )     ? $item->target     : '';\n\t\t$atts['rel']    = ! empty( $item->xfn )        ? $item->xfn        : '';\n\t\t$atts['href']   = ! empty( $item->url )        ? $item->url        : '';\n\n\t\t/**\n\t\t * Filter the HTML attributes applied to a menu item's anchor element.\n\t\t *\n\t\t * @since 3.6.0\n\t\t * @since 4.1.0 The `$depth` parameter was added.\n\t\t *\n\t\t * @param array $atts {\n\t\t *     The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored.\n\t\t *\n\t\t *     @type string $title  Title attribute.\n\t\t *     @type string $target Target attribute.\n\t\t *     @type string $rel    The rel attribute.\n\t\t *     @type string $href   The href attribute.\n\t\t * }\n\t\t * @param object $item  The current menu item.\n\t\t * @param array  $args  An array of {@see wp_nav_menu()} arguments.\n\t\t * @param int    $depth Depth of menu item. Used for padding.\n\t\t */\n\t\t$atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );\n\n\t\t$attributes = '';\n\t\tforeach ( $atts as $attr => $value ) {\n\t\t\tif ( ! empty( $value ) ) {\n\t\t\t\t$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );\n\t\t\t\t$attributes .= ' ' . $attr . '=\"' . $value . '\"';\n\t\t\t}\n\t\t}\n\n\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t$title = apply_filters( 'the_title', $item->title, $item->ID );\n\n\t\t/**\n\t\t * Filter a menu item's title.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string $title The menu item's title.\n\t\t * @param object $item  The current menu item.\n\t\t * @param array  $args  An array of {@see wp_nav_menu()} arguments.\n\t\t * @param int    $depth Depth of menu item. Used for padding.\n\t\t */\n\t\t$title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth );\n\n\t\t$item_output = $args->before;\n\t\t$item_output .= '<a'. $attributes .'>';\n\t\t$item_output .= $args->link_before . $title . $args->link_after;\n\t\t$item_output .= '</a>';\n\t\t$item_output .= $args->after;\n\n\t\t/**\n\t\t * Filter a menu item's starting output.\n\t\t *\n\t\t * The menu item's starting output only includes `$args->before`, the opening `<a>`,\n\t\t * the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is\n\t\t * no filter for modifying the opening and closing `<li>` for a menu item.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $item_output The menu item's starting HTML output.\n\t\t * @param object $item        Menu item data object.\n\t\t * @param int    $depth       Depth of menu item. Used for padding.\n\t\t * @param array  $args        An array of {@see wp_nav_menu()} arguments.\n\t\t */\n\t\t$output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );\n\t}\n\n\t/**\n\t * Ends the element output, if needed.\n\t *\n\t * @see Walker::end_el()\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $output Passed by reference. Used to append additional content.\n\t * @param object $item   Page data object. Not used.\n\t * @param int    $depth  Depth of page. Not Used.\n\t * @param array  $args   An array of arguments. @see wp_nav_menu()\n\t */\n\tpublic function end_el( &$output, $item, $depth = 0, $args = array() ) {\n\t\t$output .= \"</li>\\n\";\n\t}\n\n} // Walker_Nav_Menu\n\n/**\n * Displays a navigation menu.\n *\n * @since 3.0.0\n *\n * @staticvar array $menu_id_slugs\n *\n * @param array $args {\n *     Optional. Array of nav menu arguments.\n *\n *     @type string        $menu            Desired menu. Accepts (matching in order) id, slug, name. Default empty.\n *     @type string        $menu_class      CSS class to use for the ul element which forms the menu. Default 'menu'.\n *     @type string        $menu_id         The ID that is applied to the ul element which forms the menu.\n *                                          Default is the menu slug, incremented.\n *     @type string        $container       Whether to wrap the ul, and what to wrap it with. Default 'div'.\n *     @type string        $container_class Class that is applied to the container. Default 'menu-{menu slug}-container'.\n *     @type string        $container_id    The ID that is applied to the container. Default empty.\n *     @type callable|bool $fallback_cb     If the menu doesn't exists, a callback function will fire.\n *                                          Default is 'wp_page_menu'. Set to false for no fallback.\n *     @type string        $before          Text before the link text. Default empty.\n *     @type string        $after           Text after the link text. Default empty.\n *     @type string        $link_before     Text before the link. Default empty.\n *     @type string        $link_after      Text after the link. Default empty.\n *     @type bool          $echo            Whether to echo the menu or return it. Default true.\n *     @type int           $depth           How many levels of the hierarchy are to be included. 0 means all. Default 0.\n *     @type object        $walker          Instance of a custom walker class. Default empty.\n *     @type string        $theme_location  Theme location to be used. Must be registered with register_nav_menu()\n *                                          in order to be selectable by the user.\n *     @type string        $items_wrap      How the list items should be wrapped. Default is a ul with an id and class.\n *                                          Uses printf() format with numbered placeholders.\n * }\n * @return object|false|void Menu output if $echo is false, false if there are no items or no menu was found.\n */\nfunction wp_nav_menu( $args = array() ) {\n\tstatic $menu_id_slugs = array();\n\n\t$defaults = array( 'menu' => '', 'container' => 'div', 'container_class' => '', 'container_id' => '', 'menu_class' => 'menu', 'menu_id' => '',\n\t'echo' => true, 'fallback_cb' => 'wp_page_menu', 'before' => '', 'after' => '', 'link_before' => '', 'link_after' => '', 'items_wrap' => '<ul id=\"%1$s\" class=\"%2$s\">%3$s</ul>',\n\t'depth' => 0, 'walker' => '', 'theme_location' => '' );\n\n\t$args = wp_parse_args( $args, $defaults );\n\t/**\n\t * Filter the arguments used to display a navigation menu.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @see wp_nav_menu()\n\t *\n\t * @param array $args Array of wp_nav_menu() arguments.\n\t */\n\t$args = apply_filters( 'wp_nav_menu_args', $args );\n\t$args = (object) $args;\n\n\t/**\n\t * Filter whether to short-circuit the wp_nav_menu() output.\n\t *\n\t * Returning a non-null value to the filter will short-circuit\n\t * wp_nav_menu(), echoing that value if $args->echo is true,\n\t * returning that value otherwise.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @see wp_nav_menu()\n\t *\n\t * @param string|null $output Nav menu output to short-circuit with. Default null.\n\t * @param object      $args   An object containing wp_nav_menu() arguments.\n\t */\n\t$nav_menu = apply_filters( 'pre_wp_nav_menu', null, $args );\n\n\tif ( null !== $nav_menu ) {\n\t\tif ( $args->echo ) {\n\t\t\techo $nav_menu;\n\t\t\treturn;\n\t\t}\n\n\t\treturn $nav_menu;\n\t}\n\n\t// Get the nav menu based on the requested menu\n\t$menu = wp_get_nav_menu_object( $args->menu );\n\n\t// Get the nav menu based on the theme_location\n\tif ( ! $menu && $args->theme_location && ( $locations = get_nav_menu_locations() ) && isset( $locations[ $args->theme_location ] ) )\n\t\t$menu = wp_get_nav_menu_object( $locations[ $args->theme_location ] );\n\n\t// get the first menu that has items if we still can't find a menu\n\tif ( ! $menu && !$args->theme_location ) {\n\t\t$menus = wp_get_nav_menus();\n\t\tforeach ( $menus as $menu_maybe ) {\n\t\t\tif ( $menu_items = wp_get_nav_menu_items( $menu_maybe->term_id, array( 'update_post_term_cache' => false ) ) ) {\n\t\t\t\t$menu = $menu_maybe;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( empty( $args->menu ) ) {\n\t\t$args->menu = $menu;\n\t}\n\n\t// If the menu exists, get its items.\n\tif ( $menu && ! is_wp_error($menu) && !isset($menu_items) )\n\t\t$menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'update_post_term_cache' => false ) );\n\n\t/*\n\t * If no menu was found:\n\t *  - Fall back (if one was specified), or bail.\n\t *\n\t * If no menu items were found:\n\t *  - Fall back, but only if no theme location was specified.\n\t *  - Otherwise, bail.\n\t */\n\tif ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) )\n\t\t&& isset( $args->fallback_cb ) && $args->fallback_cb && is_callable( $args->fallback_cb ) )\n\t\t\treturn call_user_func( $args->fallback_cb, (array) $args );\n\n\tif ( ! $menu || is_wp_error( $menu ) )\n\t\treturn false;\n\n\t$nav_menu = $items = '';\n\n\t$show_container = false;\n\tif ( $args->container ) {\n\t\t/**\n\t\t * Filter the list of HTML tags that are valid for use as menu containers.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $tags The acceptable HTML tags for use as menu containers.\n\t\t *                    Default is array containing 'div' and 'nav'.\n\t\t */\n\t\t$allowed_tags = apply_filters( 'wp_nav_menu_container_allowedtags', array( 'div', 'nav' ) );\n\t\tif ( is_string( $args->container ) && in_array( $args->container, $allowed_tags ) ) {\n\t\t\t$show_container = true;\n\t\t\t$class = $args->container_class ? ' class=\"' . esc_attr( $args->container_class ) . '\"' : ' class=\"menu-'. $menu->slug .'-container\"';\n\t\t\t$id = $args->container_id ? ' id=\"' . esc_attr( $args->container_id ) . '\"' : '';\n\t\t\t$nav_menu .= '<'. $args->container . $id . $class . '>';\n\t\t}\n\t}\n\n\t// Set up the $menu_item variables\n\t_wp_menu_item_classes_by_context( $menu_items );\n\n\t$sorted_menu_items = $menu_items_with_children = array();\n\tforeach ( (array) $menu_items as $menu_item ) {\n\t\t$sorted_menu_items[ $menu_item->menu_order ] = $menu_item;\n\t\tif ( $menu_item->menu_item_parent )\n\t\t\t$menu_items_with_children[ $menu_item->menu_item_parent ] = true;\n\t}\n\n\t// Add the menu-item-has-children class where applicable\n\tif ( $menu_items_with_children ) {\n\t\tforeach ( $sorted_menu_items as &$menu_item ) {\n\t\t\tif ( isset( $menu_items_with_children[ $menu_item->ID ] ) )\n\t\t\t\t$menu_item->classes[] = 'menu-item-has-children';\n\t\t}\n\t}\n\n\tunset( $menu_items, $menu_item );\n\n\t/**\n\t * Filter the sorted list of menu item objects before generating the menu's HTML.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array  $sorted_menu_items The menu items, sorted by each menu item's menu order.\n\t * @param object $args              An object containing wp_nav_menu() arguments.\n\t */\n\t$sorted_menu_items = apply_filters( 'wp_nav_menu_objects', $sorted_menu_items, $args );\n\n\t$items .= walk_nav_menu_tree( $sorted_menu_items, $args->depth, $args );\n\tunset($sorted_menu_items);\n\n\t// Attributes\n\tif ( ! empty( $args->menu_id ) ) {\n\t\t$wrap_id = $args->menu_id;\n\t} else {\n\t\t$wrap_id = 'menu-' . $menu->slug;\n\t\twhile ( in_array( $wrap_id, $menu_id_slugs ) ) {\n\t\t\tif ( preg_match( '#-(\\d+)$#', $wrap_id, $matches ) )\n\t\t\t\t$wrap_id = preg_replace('#-(\\d+)$#', '-' . ++$matches[1], $wrap_id );\n\t\t\telse\n\t\t\t\t$wrap_id = $wrap_id . '-1';\n\t\t}\n\t}\n\t$menu_id_slugs[] = $wrap_id;\n\n\t$wrap_class = $args->menu_class ? $args->menu_class : '';\n\n\t/**\n\t * Filter the HTML list content for navigation menus.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @see wp_nav_menu()\n\t *\n\t * @param string $items The HTML list content for the menu items.\n\t * @param object $args  An object containing wp_nav_menu() arguments.\n\t */\n\t$items = apply_filters( 'wp_nav_menu_items', $items, $args );\n\t/**\n\t * Filter the HTML list content for a specific navigation menu.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @see wp_nav_menu()\n\t *\n\t * @param string $items The HTML list content for the menu items.\n\t * @param object $args  An object containing wp_nav_menu() arguments.\n\t */\n\t$items = apply_filters( \"wp_nav_menu_{$menu->slug}_items\", $items, $args );\n\n\t// Don't print any markup if there are no items at this point.\n\tif ( empty( $items ) )\n\t\treturn false;\n\n\t$nav_menu .= sprintf( $args->items_wrap, esc_attr( $wrap_id ), esc_attr( $wrap_class ), $items );\n\tunset( $items );\n\n\tif ( $show_container )\n\t\t$nav_menu .= '</' . $args->container . '>';\n\n\t/**\n\t * Filter the HTML content for navigation menus.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @see wp_nav_menu()\n\t *\n\t * @param string $nav_menu The HTML content for the navigation menu.\n\t * @param object $args     An object containing wp_nav_menu() arguments.\n\t */\n\t$nav_menu = apply_filters( 'wp_nav_menu', $nav_menu, $args );\n\n\tif ( $args->echo )\n\t\techo $nav_menu;\n\telse\n\t\treturn $nav_menu;\n}\n\n/**\n * Add the class property classes for the current context, if applicable.\n *\n * @access private\n * @since 3.0.0\n *\n * @global WP_Query   $wp_query\n * @global WP_Rewrite $wp_rewrite\n *\n * @param array $menu_items The current menu item objects to which to add the class property information.\n */\nfunction _wp_menu_item_classes_by_context( &$menu_items ) {\n\tglobal $wp_query, $wp_rewrite;\n\n\t$queried_object = $wp_query->get_queried_object();\n\t$queried_object_id = (int) $wp_query->queried_object_id;\n\n\t$active_object = '';\n\t$active_ancestor_item_ids = array();\n\t$active_parent_item_ids = array();\n\t$active_parent_object_ids = array();\n\t$possible_taxonomy_ancestors = array();\n\t$possible_object_parents = array();\n\t$home_page_id = (int) get_option( 'page_for_posts' );\n\n\tif ( $wp_query->is_singular && ! empty( $queried_object->post_type ) && ! is_post_type_hierarchical( $queried_object->post_type ) ) {\n\t\tforeach ( (array) get_object_taxonomies( $queried_object->post_type ) as $taxonomy ) {\n\t\t\tif ( is_taxonomy_hierarchical( $taxonomy ) ) {\n\t\t\t\t$term_hierarchy = _get_term_hierarchy( $taxonomy );\n\t\t\t\t$terms = wp_get_object_terms( $queried_object_id, $taxonomy, array( 'fields' => 'ids' ) );\n\t\t\t\tif ( is_array( $terms ) ) {\n\t\t\t\t\t$possible_object_parents = array_merge( $possible_object_parents, $terms );\n\t\t\t\t\t$term_to_ancestor = array();\n\t\t\t\t\tforeach ( (array) $term_hierarchy as $anc => $descs ) {\n\t\t\t\t\t\tforeach ( (array) $descs as $desc )\n\t\t\t\t\t\t\t$term_to_ancestor[ $desc ] = $anc;\n\t\t\t\t\t}\n\n\t\t\t\t\tforeach ( $terms as $desc ) {\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t$possible_taxonomy_ancestors[ $taxonomy ][] = $desc;\n\t\t\t\t\t\t\tif ( isset( $term_to_ancestor[ $desc ] ) ) {\n\t\t\t\t\t\t\t\t$_desc = $term_to_ancestor[ $desc ];\n\t\t\t\t\t\t\t\tunset( $term_to_ancestor[ $desc ] );\n\t\t\t\t\t\t\t\t$desc = $_desc;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$desc = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} while ( ! empty( $desc ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} elseif ( ! empty( $queried_object->taxonomy ) && is_taxonomy_hierarchical( $queried_object->taxonomy ) ) {\n\t\t$term_hierarchy = _get_term_hierarchy( $queried_object->taxonomy );\n\t\t$term_to_ancestor = array();\n\t\tforeach ( (array) $term_hierarchy as $anc => $descs ) {\n\t\t\tforeach ( (array) $descs as $desc )\n\t\t\t\t$term_to_ancestor[ $desc ] = $anc;\n\t\t}\n\t\t$desc = $queried_object->term_id;\n\t\tdo {\n\t\t\t$possible_taxonomy_ancestors[ $queried_object->taxonomy ][] = $desc;\n\t\t\tif ( isset( $term_to_ancestor[ $desc ] ) ) {\n\t\t\t\t$_desc = $term_to_ancestor[ $desc ];\n\t\t\t\tunset( $term_to_ancestor[ $desc ] );\n\t\t\t\t$desc = $_desc;\n\t\t\t} else {\n\t\t\t\t$desc = 0;\n\t\t\t}\n\t\t} while ( ! empty( $desc ) );\n\t}\n\n\t$possible_object_parents = array_filter( $possible_object_parents );\n\n\t$front_page_url = home_url();\n\n\tforeach ( (array) $menu_items as $key => $menu_item ) {\n\n\t\t$menu_items[$key]->current = false;\n\n\t\t$classes = (array) $menu_item->classes;\n\t\t$classes[] = 'menu-item';\n\t\t$classes[] = 'menu-item-type-' . $menu_item->type;\n\t\t$classes[] = 'menu-item-object-' . $menu_item->object;\n\n\t\t// if the menu item corresponds to a taxonomy term for the currently-queried non-hierarchical post object\n\t\tif ( $wp_query->is_singular && 'taxonomy' == $menu_item->type && in_array( $menu_item->object_id, $possible_object_parents ) ) {\n\t\t\t$active_parent_object_ids[] = (int) $menu_item->object_id;\n\t\t\t$active_parent_item_ids[] = (int) $menu_item->db_id;\n\t\t\t$active_object = $queried_object->post_type;\n\n\t\t// if the menu item corresponds to the currently-queried post or taxonomy object\n\t\t} elseif (\n\t\t\t$menu_item->object_id == $queried_object_id &&\n\t\t\t(\n\t\t\t\t( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && $wp_query->is_home && $home_page_id == $menu_item->object_id ) ||\n\t\t\t\t( 'post_type' == $menu_item->type && $wp_query->is_singular ) ||\n\t\t\t\t( 'taxonomy' == $menu_item->type && ( $wp_query->is_category || $wp_query->is_tag || $wp_query->is_tax ) && $queried_object->taxonomy == $menu_item->object )\n\t\t\t)\n\t\t) {\n\t\t\t$classes[] = 'current-menu-item';\n\t\t\t$menu_items[$key]->current = true;\n\t\t\t$_anc_id = (int) $menu_item->db_id;\n\n\t\t\twhile(\n\t\t\t\t( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&\n\t\t\t\t! in_array( $_anc_id, $active_ancestor_item_ids )\n\t\t\t) {\n\t\t\t\t$active_ancestor_item_ids[] = $_anc_id;\n\t\t\t}\n\n\t\t\tif ( 'post_type' == $menu_item->type && 'page' == $menu_item->object ) {\n\t\t\t\t// Back compat classes for pages to match wp_page_menu()\n\t\t\t\t$classes[] = 'page_item';\n\t\t\t\t$classes[] = 'page-item-' . $menu_item->object_id;\n\t\t\t\t$classes[] = 'current_page_item';\n\t\t\t}\n\t\t\t$active_parent_item_ids[] = (int) $menu_item->menu_item_parent;\n\t\t\t$active_parent_object_ids[] = (int) $menu_item->post_parent;\n\t\t\t$active_object = $menu_item->object;\n\n\t\t// if the menu item corresponds to the currently-queried post type archive\n\t\t} elseif (\n\t\t\t'post_type_archive' == $menu_item->type &&\n\t\t\tis_post_type_archive( array( $menu_item->object ) )\n\t\t) {\n\t\t\t$classes[] = 'current-menu-item';\n\t\t\t$menu_items[$key]->current = true;\n\t\t// if the menu item corresponds to the currently-requested URL\n\t\t} elseif ( 'custom' == $menu_item->object && isset( $_SERVER['HTTP_HOST'] ) ) {\n\t\t\t$_root_relative_current = untrailingslashit( $_SERVER['REQUEST_URI'] );\n\t\t\t$current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_root_relative_current );\n\t\t\t$raw_item_url = strpos( $menu_item->url, '#' ) ? substr( $menu_item->url, 0, strpos( $menu_item->url, '#' ) ) : $menu_item->url;\n\t\t\t$item_url = set_url_scheme( untrailingslashit( $raw_item_url ) );\n\t\t\t$_indexless_current = untrailingslashit( preg_replace( '/' . preg_quote( $wp_rewrite->index, '/' ) . '$/', '', $current_url ) );\n\n\t\t\tif ( $raw_item_url && in_array( $item_url, array( $current_url, $_indexless_current, $_root_relative_current ) ) ) {\n\t\t\t\t$classes[] = 'current-menu-item';\n\t\t\t\t$menu_items[$key]->current = true;\n\t\t\t\t$_anc_id = (int) $menu_item->db_id;\n\n\t\t\t\twhile(\n\t\t\t\t\t( $_anc_id = get_post_meta( $_anc_id, '_menu_item_menu_item_parent', true ) ) &&\n\t\t\t\t\t! in_array( $_anc_id, $active_ancestor_item_ids )\n\t\t\t\t) {\n\t\t\t\t\t$active_ancestor_item_ids[] = $_anc_id;\n\t\t\t\t}\n\n\t\t\t\tif ( in_array( home_url(), array( untrailingslashit( $current_url ), untrailingslashit( $_indexless_current ) ) ) ) {\n\t\t\t\t\t// Back compat for home link to match wp_page_menu()\n\t\t\t\t\t$classes[] = 'current_page_item';\n\t\t\t\t}\n\t\t\t\t$active_parent_item_ids[] = (int) $menu_item->menu_item_parent;\n\t\t\t\t$active_parent_object_ids[] = (int) $menu_item->post_parent;\n\t\t\t\t$active_object = $menu_item->object;\n\n\t\t\t// give front page item current-menu-item class when extra query arguments involved\n\t\t\t} elseif ( $item_url == $front_page_url && is_front_page() ) {\n\t\t\t\t$classes[] = 'current-menu-item';\n\t\t\t}\n\n\t\t\tif ( untrailingslashit($item_url) == home_url() )\n\t\t\t\t$classes[] = 'menu-item-home';\n\t\t}\n\n\t\t// back-compat with wp_page_menu: add \"current_page_parent\" to static home page link for any non-page query\n\t\tif ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && empty( $wp_query->is_page ) && $home_page_id == $menu_item->object_id )\n\t\t\t$classes[] = 'current_page_parent';\n\n\t\t$menu_items[$key]->classes = array_unique( $classes );\n\t}\n\t$active_ancestor_item_ids = array_filter( array_unique( $active_ancestor_item_ids ) );\n\t$active_parent_item_ids = array_filter( array_unique( $active_parent_item_ids ) );\n\t$active_parent_object_ids = array_filter( array_unique( $active_parent_object_ids ) );\n\n\t// set parent's class\n\tforeach ( (array) $menu_items as $key => $parent_item ) {\n\t\t$classes = (array) $parent_item->classes;\n\t\t$menu_items[$key]->current_item_ancestor = false;\n\t\t$menu_items[$key]->current_item_parent = false;\n\n\t\tif (\n\t\t\tisset( $parent_item->type ) &&\n\t\t\t(\n\t\t\t\t// ancestral post object\n\t\t\t\t(\n\t\t\t\t\t'post_type' == $parent_item->type &&\n\t\t\t\t\t! empty( $queried_object->post_type ) &&\n\t\t\t\t\tis_post_type_hierarchical( $queried_object->post_type ) &&\n\t\t\t\t\tin_array( $parent_item->object_id, $queried_object->ancestors ) &&\n\t\t\t\t\t$parent_item->object != $queried_object->ID\n\t\t\t\t) ||\n\n\t\t\t\t// ancestral term\n\t\t\t\t(\n\t\t\t\t\t'taxonomy' == $parent_item->type &&\n\t\t\t\t\tisset( $possible_taxonomy_ancestors[ $parent_item->object ] ) &&\n\t\t\t\t\tin_array( $parent_item->object_id, $possible_taxonomy_ancestors[ $parent_item->object ] ) &&\n\t\t\t\t\t(\n\t\t\t\t\t\t! isset( $queried_object->term_id ) ||\n\t\t\t\t\t\t$parent_item->object_id != $queried_object->term_id\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t) {\n\t\t\t$classes[] = empty( $queried_object->taxonomy ) ? 'current-' . $queried_object->post_type . '-ancestor' : 'current-' . $queried_object->taxonomy . '-ancestor';\n\t\t}\n\n\t\tif ( in_array(  intval( $parent_item->db_id ), $active_ancestor_item_ids ) ) {\n\t\t\t$classes[] = 'current-menu-ancestor';\n\t\t\t$menu_items[$key]->current_item_ancestor = true;\n\t\t}\n\t\tif ( in_array( $parent_item->db_id, $active_parent_item_ids ) ) {\n\t\t\t$classes[] = 'current-menu-parent';\n\t\t\t$menu_items[$key]->current_item_parent = true;\n\t\t}\n\t\tif ( in_array( $parent_item->object_id, $active_parent_object_ids ) )\n\t\t\t$classes[] = 'current-' . $active_object . '-parent';\n\n\t\tif ( 'post_type' == $parent_item->type && 'page' == $parent_item->object ) {\n\t\t\t// Back compat classes for pages to match wp_page_menu()\n\t\t\tif ( in_array('current-menu-parent', $classes) )\n\t\t\t\t$classes[] = 'current_page_parent';\n\t\t\tif ( in_array('current-menu-ancestor', $classes) )\n\t\t\t\t$classes[] = 'current_page_ancestor';\n\t\t}\n\n\t\t$menu_items[$key]->classes = array_unique( $classes );\n\t}\n}\n\n/**\n * Retrieve the HTML list content for nav menu items.\n *\n * @uses Walker_Nav_Menu to create HTML list content.\n * @since 3.0.0\n *\n * @param array  $items\n * @param int    $depth\n * @param object $r\n * @return string\n */\nfunction walk_nav_menu_tree( $items, $depth, $r ) {\n\t$walker = ( empty($r->walker) ) ? new Walker_Nav_Menu : $r->walker;\n\t$args = array( $items, $depth, $r );\n\n\treturn call_user_func_array( array( $walker, 'walk' ), $args );\n}\n\n/**\n * Prevents a menu item ID from being used more than once.\n *\n * @since 3.0.1\n * @access private\n *\n * @staticvar array $used_ids\n * @param string $id\n * @param object $item\n * @return string\n */\nfunction _nav_menu_item_id_use_once( $id, $item ) {\n\tstatic $_used_ids = array();\n\tif ( in_array( $item->ID, $_used_ids ) ) {\n\t\treturn '';\n\t}\n\t$_used_ids[] = $item->ID;\n\treturn $id;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/nav-menu.php",
    "content": "<?php\n/**\n * Navigation Menu functions\n *\n * @package WordPress\n * @subpackage Nav_Menus\n * @since 3.0.0\n */\n\n/**\n * Returns a navigation menu object.\n *\n * @since 3.0.0\n *\n * @param string $menu Menu ID, slug, or name - or the menu object.\n * @return object|false False if $menu param isn't supplied or term does not exist, menu object if successful.\n */\nfunction wp_get_nav_menu_object( $menu ) {\n\t$menu_obj = false;\n\n\tif ( is_object( $menu ) ) {\n\t\t$menu_obj = $menu;\n\t}\n\n\tif ( $menu && ! $menu_obj ) {\n\t\t$menu_obj = get_term( $menu, 'nav_menu' );\n\n\t\tif ( ! $menu_obj ) {\n\t\t\t$menu_obj = get_term_by( 'slug', $menu, 'nav_menu' );\n\t\t}\n\n\t\tif ( ! $menu_obj ) {\n\t\t\t$menu_obj = get_term_by( 'name', $menu, 'nav_menu' );\n\t\t}\n\t}\n\n\tif ( ! $menu_obj || is_wp_error( $menu_obj ) ) {\n\t\t$menu_obj = false;\n\t}\n\n\t/**\n\t * Filter the nav_menu term retrieved for wp_get_nav_menu_object().\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param object|false $menu_obj Term from nav_menu taxonomy, or false if nothing had been found.\n\t * @param string       $menu     The menu ID, slug, or name passed to wp_get_nav_menu_object().\n\t */\n\treturn apply_filters( 'wp_get_nav_menu_object', $menu_obj, $menu );\n}\n\n/**\n * Check if the given ID is a navigation menu.\n *\n * Returns true if it is; false otherwise.\n *\n * @since 3.0.0\n *\n * @param int|string $menu The menu to check (ID, slug, or name).\n * @return bool Whether the menu exists.\n */\nfunction is_nav_menu( $menu ) {\n\tif ( ! $menu )\n\t\treturn false;\n\n\t$menu_obj = wp_get_nav_menu_object( $menu );\n\n\tif (\n\t\t$menu_obj &&\n\t\t! is_wp_error( $menu_obj ) &&\n\t\t! empty( $menu_obj->taxonomy ) &&\n\t\t'nav_menu' == $menu_obj->taxonomy\n\t)\n\t\treturn true;\n\n\treturn false;\n}\n\n/**\n * Register navigation menus for a theme.\n *\n * @since 3.0.0\n *\n * @global array $_wp_registered_nav_menus\n *\n * @param array $locations Associative array of menu location identifiers (like a slug) and descriptive text.\n */\nfunction register_nav_menus( $locations = array() ) {\n\tglobal $_wp_registered_nav_menus;\n\n\tadd_theme_support( 'menus' );\n\n\t$_wp_registered_nav_menus = array_merge( (array) $_wp_registered_nav_menus, $locations );\n}\n\n/**\n * Unregisters a navigation menu for a theme.\n *\n * @global array $_wp_registered_nav_menus\n *\n * @param string $location The menu location identifier.\n * @return bool True on success, false on failure.\n */\nfunction unregister_nav_menu( $location ) {\n\tglobal $_wp_registered_nav_menus;\n\n\tif ( is_array( $_wp_registered_nav_menus ) && isset( $_wp_registered_nav_menus[$location] ) ) {\n\t\tunset( $_wp_registered_nav_menus[$location] );\n\t\tif ( empty( $_wp_registered_nav_menus ) ) {\n\t\t\t_remove_theme_support( 'menus' );\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Register a navigation menu for a theme.\n *\n * @since 3.0.0\n *\n * @param string $location    Menu location identifier, like a slug.\n * @param string $description Menu location descriptive text.\n */\nfunction register_nav_menu( $location, $description ) {\n\tregister_nav_menus( array( $location => $description ) );\n}\n/**\n * Returns an array of all registered navigation menus in a theme\n *\n * @since 3.0.0\n *\n * @global array $_wp_registered_nav_menus\n *\n * @return array\n */\nfunction get_registered_nav_menus() {\n\tglobal $_wp_registered_nav_menus;\n\tif ( isset( $_wp_registered_nav_menus ) )\n\t\treturn $_wp_registered_nav_menus;\n\treturn array();\n}\n\n/**\n * Returns an array with the registered navigation menu locations and the menu assigned to it\n *\n * @since 3.0.0\n * @return array\n */\n\nfunction get_nav_menu_locations() {\n\t$locations = get_theme_mod( 'nav_menu_locations' );\n\treturn ( is_array( $locations ) ) ? $locations : array();\n}\n\n/**\n * Whether a registered nav menu location has a menu assigned to it.\n *\n * @since 3.0.0\n *\n * @param string $location Menu location identifier.\n * @return bool Whether location has a menu.\n */\nfunction has_nav_menu( $location ) {\n\t$has_nav_menu = false;\n\n\t$registered_nav_menus = get_registered_nav_menus();\n\tif ( isset( $registered_nav_menus[ $location ] ) ) {\n\t\t$locations = get_nav_menu_locations();\n\t\t$has_nav_menu = ! empty( $locations[ $location ] );\n\t}\n\n\t/**\n\t * Filter whether a nav menu is assigned to the specified location.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param bool   $has_nav_menu Whether there is a menu assigned to a location.\n\t * @param string $location     Menu location.\n\t */\n\treturn apply_filters( 'has_nav_menu', $has_nav_menu, $location );\n}\n\n/**\n * Determine whether the given ID is a nav menu item.\n *\n * @since 3.0.0\n *\n * @param int $menu_item_id The ID of the potential nav menu item.\n * @return bool Whether the given ID is that of a nav menu item.\n */\nfunction is_nav_menu_item( $menu_item_id = 0 ) {\n\treturn ( ! is_wp_error( $menu_item_id ) && ( 'nav_menu_item' == get_post_type( $menu_item_id ) ) );\n}\n\n/**\n * Create a Navigation Menu.\n *\n * @since 3.0.0\n *\n * @param string $menu_name Menu name.\n * @return int|WP_Error Menu ID on success, WP_Error object on failure.\n */\nfunction wp_create_nav_menu( $menu_name ) {\n\treturn wp_update_nav_menu_object( 0, array( 'menu-name' => $menu_name ) );\n}\n\n/**\n * Delete a Navigation Menu.\n *\n * @since 3.0.0\n *\n * @param string $menu Menu ID, slug, or name.\n * @return bool|WP_Error True on success, false or WP_Error object on failure.\n */\nfunction wp_delete_nav_menu( $menu ) {\n\t$menu = wp_get_nav_menu_object( $menu );\n\tif ( ! $menu )\n\t\treturn false;\n\n\t$menu_objects = get_objects_in_term( $menu->term_id, 'nav_menu' );\n\tif ( ! empty( $menu_objects ) ) {\n\t\tforeach ( $menu_objects as $item ) {\n\t\t\twp_delete_post( $item );\n\t\t}\n\t}\n\n\t$result = wp_delete_term( $menu->term_id, 'nav_menu' );\n\n\t// Remove this menu from any locations.\n\t$locations = get_nav_menu_locations();\n\tforeach ( $locations as $location => $menu_id ) {\n\t\tif ( $menu_id == $menu->term_id )\n\t\t\t$locations[ $location ] = 0;\n\t}\n\tset_theme_mod( 'nav_menu_locations', $locations );\n\n\tif ( $result && !is_wp_error($result) )\n\n\t\t/**\n\t\t * Fires after a navigation menu has been successfully deleted.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param int $term_id ID of the deleted menu.\n\t\t */\n\t\tdo_action( 'wp_delete_nav_menu', $menu->term_id );\n\n\treturn $result;\n}\n\n/**\n * Save the properties of a menu or create a new menu with those properties.\n *\n * @since 3.0.0\n *\n * @param int   $menu_id   The ID of the menu or \"0\" to create a new menu.\n * @param array $menu_data The array of menu data.\n * @return int|WP_Error Menu ID on success, WP_Error object on failure.\n */\nfunction wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) {\n\t$menu_id = (int) $menu_id;\n\n\t$_menu = wp_get_nav_menu_object( $menu_id );\n\n\t$args = array(\n\t\t'description' => ( isset( $menu_data['description'] ) ? $menu_data['description']  : '' ),\n\t\t'name'        => ( isset( $menu_data['menu-name']   ) ? $menu_data['menu-name']    : '' ),\n\t\t'parent'      => ( isset( $menu_data['parent']      ) ? (int) $menu_data['parent'] : 0  ),\n\t\t'slug'        => null,\n\t);\n\n\t// double-check that we're not going to have one menu take the name of another\n\t$_possible_existing = get_term_by( 'name', $menu_data['menu-name'], 'nav_menu' );\n\tif (\n\t\t$_possible_existing &&\n\t\t! is_wp_error( $_possible_existing ) &&\n\t\tisset( $_possible_existing->term_id ) &&\n\t\t$_possible_existing->term_id != $menu_id\n\t) {\n\t\treturn new WP_Error( 'menu_exists',\n\t\t\t/* translators: %s: menu name */\n\t\t\tsprintf( __( 'The menu name %s conflicts with another menu name. Please try another.' ),\n\t\t\t\t'<strong>' . esc_html( $menu_data['menu-name'] ) . '</strong>'\n\t\t\t)\n\t\t);\n\t}\n\n\t// menu doesn't already exist, so create a new menu\n\tif ( ! $_menu || is_wp_error( $_menu ) ) {\n\t\t$menu_exists = get_term_by( 'name', $menu_data['menu-name'], 'nav_menu' );\n\n\t\tif ( $menu_exists ) {\n\t\t\treturn new WP_Error( 'menu_exists',\n\t\t\t\t/* translators: %s: menu name */\n\t\t\t\tsprintf( __( 'The menu name %s conflicts with another menu name. Please try another.' ),\n\t\t\t\t\t'<strong>' . esc_html( $menu_data['menu-name'] ) . '</strong>'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\t$_menu = wp_insert_term( $menu_data['menu-name'], 'nav_menu', $args );\n\n\t\tif ( is_wp_error( $_menu ) )\n\t\t\treturn $_menu;\n\n\t\t/**\n\t\t * Fires after a navigation menu is successfully created.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param int   $term_id   ID of the new menu.\n\t\t * @param array $menu_data An array of menu data.\n\t\t */\n\t\tdo_action( 'wp_create_nav_menu', $_menu['term_id'], $menu_data );\n\n\t\treturn (int) $_menu['term_id'];\n\t}\n\n\tif ( ! $_menu || ! isset( $_menu->term_id ) )\n\t\treturn 0;\n\n\t$menu_id = (int) $_menu->term_id;\n\n\t$update_response = wp_update_term( $menu_id, 'nav_menu', $args );\n\n\tif ( is_wp_error( $update_response ) )\n\t\treturn $update_response;\n\n\t$menu_id = (int) $update_response['term_id'];\n\n\t/**\n\t * Fires after a navigation menu has been successfully updated.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param int   $menu_id   ID of the updated menu.\n\t * @param array $menu_data An array of menu data.\n\t */\n\tdo_action( 'wp_update_nav_menu', $menu_id, $menu_data );\n\treturn $menu_id;\n}\n\n/**\n * Save the properties of a menu item or create a new one.\n *\n * @since 3.0.0\n *\n * @param int   $menu_id         The ID of the menu. Required. If \"0\", makes the menu item a draft orphan.\n * @param int   $menu_item_db_id The ID of the menu item. If \"0\", creates a new menu item.\n * @param array $menu_item_data  The menu item's data.\n * @return int|WP_Error The menu item's database ID or WP_Error object on failure.\n */\nfunction wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array() ) {\n\t$menu_id = (int) $menu_id;\n\t$menu_item_db_id = (int) $menu_item_db_id;\n\n\t// make sure that we don't convert non-nav_menu_item objects into nav_menu_item objects\n\tif ( ! empty( $menu_item_db_id ) && ! is_nav_menu_item( $menu_item_db_id ) )\n\t\treturn new WP_Error( 'update_nav_menu_item_failed', __( 'The given object ID is not that of a menu item.' ) );\n\n\t$menu = wp_get_nav_menu_object( $menu_id );\n\n\tif ( ! $menu && 0 !== $menu_id ) {\n\t\treturn new WP_Error( 'invalid_menu_id', __( 'Invalid menu ID.' ) );\n\t}\n\n\tif ( is_wp_error( $menu ) ) {\n\t\treturn $menu;\n\t}\n\n\t$defaults = array(\n\t\t'menu-item-db-id' => $menu_item_db_id,\n\t\t'menu-item-object-id' => 0,\n\t\t'menu-item-object' => '',\n\t\t'menu-item-parent-id' => 0,\n\t\t'menu-item-position' => 0,\n\t\t'menu-item-type' => 'custom',\n\t\t'menu-item-title' => '',\n\t\t'menu-item-url' => '',\n\t\t'menu-item-description' => '',\n\t\t'menu-item-attr-title' => '',\n\t\t'menu-item-target' => '',\n\t\t'menu-item-classes' => '',\n\t\t'menu-item-xfn' => '',\n\t\t'menu-item-status' => '',\n\t);\n\n\t$args = wp_parse_args( $menu_item_data, $defaults );\n\n\tif ( 0 == $menu_id ) {\n\t\t$args['menu-item-position'] = 1;\n\t} elseif ( 0 == (int) $args['menu-item-position'] ) {\n\t\t$menu_items = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );\n\t\t$last_item = array_pop( $menu_items );\n\t\t$args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : count( $menu_items );\n\t}\n\n\t$original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0;\n\n\tif ( 'custom' != $args['menu-item-type'] ) {\n\t\t/* if non-custom menu item, then:\n\t\t\t* use original object's URL\n\t\t\t* blank default title to sync with original object's\n\t\t*/\n\n\t\t$args['menu-item-url'] = '';\n\n\t\t$original_title = '';\n\t\tif ( 'taxonomy' == $args['menu-item-type'] ) {\n\t\t\t$original_parent = get_term_field( 'parent', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' );\n\t\t\t$original_title = get_term_field( 'name', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' );\n\t\t} elseif ( 'post_type' == $args['menu-item-type'] ) {\n\n\t\t\t$original_object = get_post( $args['menu-item-object-id'] );\n\t\t\t$original_parent = (int) $original_object->post_parent;\n\t\t\t$original_title = $original_object->post_title;\n\t\t} elseif ( 'post_type_archive' == $args['menu-item-type'] ) {\n\t\t\t$original_object = get_post_type_object( $args['menu-item-object'] );\n\t\t\t$original_title = $original_object->labels->archives;\n\t\t}\n\n\t\tif ( $args['menu-item-title'] == $original_title )\n\t\t\t$args['menu-item-title'] = '';\n\n\t\t// hack to get wp to create a post object when too many properties are empty\n\t\tif ( '' ==  $args['menu-item-title'] && '' == $args['menu-item-description'] )\n\t\t\t$args['menu-item-description'] = ' ';\n\t}\n\n\t// Populate the menu item object\n\t$post = array(\n\t\t'menu_order' => $args['menu-item-position'],\n\t\t'ping_status' => 0,\n\t\t'post_content' => $args['menu-item-description'],\n\t\t'post_excerpt' => $args['menu-item-attr-title'],\n\t\t'post_parent' => $original_parent,\n\t\t'post_title' => $args['menu-item-title'],\n\t\t'post_type' => 'nav_menu_item',\n\t);\n\n\t$update = 0 != $menu_item_db_id;\n\n\t// New menu item. Default is draft status\n\tif ( ! $update ) {\n\t\t$post['ID'] = 0;\n\t\t$post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft';\n\t\t$menu_item_db_id = wp_insert_post( $post );\n\t\tif ( ! $menu_item_db_id\t|| is_wp_error( $menu_item_db_id ) )\n\t\t\treturn $menu_item_db_id;\n\n\t\t/**\n\t\t * Fires immediately after a new navigation menu item has been added.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @see wp_update_nav_menu_item()\n\t\t *\n\t\t * @param int   $menu_id         ID of the updated menu.\n\t\t * @param int   $menu_item_db_id ID of the new menu item.\n\t\t * @param array $args            An array of arguments used to update/add the menu item.\n\t\t */\n\t\tdo_action( 'wp_add_nav_menu_item', $menu_id, $menu_item_db_id, $args );\n\t}\n\n\t// Associate the menu item with the menu term\n\t// Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms()\n\t if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) ) {\n\t\twp_set_object_terms( $menu_item_db_id, array( $menu->term_id ), 'nav_menu' );\n\t}\n\n\tif ( 'custom' == $args['menu-item-type'] ) {\n\t\t$args['menu-item-object-id'] = $menu_item_db_id;\n\t\t$args['menu-item-object'] = 'custom';\n\t}\n\n\t$menu_item_db_id = (int) $menu_item_db_id;\n\n\tupdate_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($args['menu-item-type']) );\n\tupdate_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', strval( (int) $args['menu-item-parent-id'] ) );\n\tupdate_post_meta( $menu_item_db_id, '_menu_item_object_id', strval( (int) $args['menu-item-object-id'] ) );\n\tupdate_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($args['menu-item-object']) );\n\tupdate_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($args['menu-item-target']) );\n\n\t$args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) );\n\t$args['menu-item-xfn'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) );\n\tupdate_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] );\n\tupdate_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] );\n\tupdate_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($args['menu-item-url']) );\n\n\tif ( 0 == $menu_id )\n\t\tupdate_post_meta( $menu_item_db_id, '_menu_item_orphaned', (string) time() );\n\telseif ( get_post_meta( $menu_item_db_id, '_menu_item_orphaned' ) )\n\t\tdelete_post_meta( $menu_item_db_id, '_menu_item_orphaned' );\n\n\t// Update existing menu item. Default is publish status\n\tif ( $update ) {\n\t\t$post['ID'] = $menu_item_db_id;\n\t\t$post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish';\n\t\twp_update_post( $post );\n\t}\n\n\t/**\n\t * Fires after a navigation menu item has been updated.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @see wp_update_nav_menu_item()\n\t *\n\t * @param int   $menu_id         ID of the updated menu.\n\t * @param int   $menu_item_db_id ID of the updated menu item.\n\t * @param array $args            An array of arguments used to update a menu item.\n\t */\n\tdo_action( 'wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args );\n\n\treturn $menu_item_db_id;\n}\n\n/**\n * Returns all navigation menu objects.\n *\n * @since 3.0.0\n * @since 4.1.0 Default value of the 'orderby' argument was changed from 'none'\n *              to 'name'.\n *\n * @param array $args Optional. Array of arguments passed on to {@see get_terms()}.\n *                    Default empty array.\n * @return array Menu objects.\n */\nfunction wp_get_nav_menus( $args = array() ) {\n\t$defaults = array( 'hide_empty' => false, 'orderby' => 'name' );\n\t$args = wp_parse_args( $args, $defaults );\n\n\t/**\n\t * Filter the navigation menu objects being returned.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @see get_terms()\n\t *\n\t * @param array $menus An array of menu objects.\n\t * @param array $args  An array of arguments used to retrieve menu objects.\n\t */\n\treturn apply_filters( 'wp_get_nav_menus', get_terms( 'nav_menu',  $args), $args );\n}\n\n/**\n * Sort menu items by the desired key.\n *\n * @since 3.0.0\n * @access private\n *\n * @global string $_menu_item_sort_prop\n *\n * @param object $a The first object to compare\n * @param object $b The second object to compare\n * @return int -1, 0, or 1 if $a is considered to be respectively less than, equal to, or greater than $b.\n */\nfunction _sort_nav_menu_items( $a, $b ) {\n\tglobal $_menu_item_sort_prop;\n\n\tif ( empty( $_menu_item_sort_prop ) )\n\t\treturn 0;\n\n\tif ( ! isset( $a->$_menu_item_sort_prop ) || ! isset( $b->$_menu_item_sort_prop ) )\n\t\treturn 0;\n\n\t$_a = (int) $a->$_menu_item_sort_prop;\n\t$_b = (int) $b->$_menu_item_sort_prop;\n\n\tif ( $a->$_menu_item_sort_prop == $b->$_menu_item_sort_prop )\n\t\treturn 0;\n\telseif ( $_a == $a->$_menu_item_sort_prop && $_b == $b->$_menu_item_sort_prop )\n\t\treturn $_a < $_b ? -1 : 1;\n\telse\n\t\treturn strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop );\n}\n\n/**\n * Return if a menu item is valid.\n *\n * @link https://core.trac.wordpress.org/ticket/13958\n *\n * @since 3.2.0\n * @access private\n *\n * @param object $item The menu item to check.\n * @return bool False if invalid, otherwise true.\n */\nfunction _is_valid_nav_menu_item( $item ) {\n\treturn empty( $item->_invalid );\n}\n\n/**\n * Return all menu items of a navigation menu.\n *\n * @since 3.0.0\n *\n * @global string $_menu_item_sort_prop\n * @staticvar array $fetched\n *\n * @param string $menu Menu name, ID, or slug.\n * @param array  $args Optional. Arguments to pass to {@see get_posts()}.\n * @return false|array $items Array of menu items, otherwise false.\n */\nfunction wp_get_nav_menu_items( $menu, $args = array() ) {\n\t$menu = wp_get_nav_menu_object( $menu );\n\n\tif ( ! $menu ) {\n\t\treturn false;\n\t}\n\n\tstatic $fetched = array();\n\n\t$items = get_objects_in_term( $menu->term_id, 'nav_menu' );\n\tif ( is_wp_error( $items ) ) {\n\t\treturn false;\n\t}\n\n\t$defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item',\n\t\t'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true );\n\t$args = wp_parse_args( $args, $defaults );\n\t$args['include'] = $items;\n\n\tif ( ! empty( $items ) ) {\n\t\t$items = get_posts( $args );\n\t} else {\n\t\t$items = array();\n\t}\n\n\t// Get all posts and terms at once to prime the caches\n\tif ( empty( $fetched[$menu->term_id] ) || wp_using_ext_object_cache() ) {\n\t\t$fetched[$menu->term_id] = true;\n\t\t$posts = array();\n\t\t$terms = array();\n\t\tforeach ( $items as $item ) {\n\t\t\t$object_id = get_post_meta( $item->ID, '_menu_item_object_id', true );\n\t\t\t$object    = get_post_meta( $item->ID, '_menu_item_object',    true );\n\t\t\t$type      = get_post_meta( $item->ID, '_menu_item_type',      true );\n\n\t\t\tif ( 'post_type' == $type )\n\t\t\t\t$posts[$object][] = $object_id;\n\t\t\telseif ( 'taxonomy' == $type)\n\t\t\t\t$terms[$object][] = $object_id;\n\t\t}\n\n\t\tif ( ! empty( $posts ) ) {\n\t\t\tforeach ( array_keys($posts) as $post_type ) {\n\t\t\t\tget_posts( array('post__in' => $posts[$post_type], 'post_type' => $post_type, 'nopaging' => true, 'update_post_term_cache' => false) );\n\t\t\t}\n\t\t}\n\t\tunset($posts);\n\n\t\tif ( ! empty( $terms ) ) {\n\t\t\tforeach ( array_keys($terms) as $taxonomy ) {\n\t\t\t\tget_terms( $taxonomy, array(\n\t\t\t\t\t'include' => $terms[ $taxonomy ],\n\t\t\t\t\t'hierarchical' => false,\n\t\t\t\t) );\n\t\t\t}\n\t\t}\n\t\tunset($terms);\n\t}\n\n\t$items = array_map( 'wp_setup_nav_menu_item', $items );\n\n\tif ( ! is_admin() ) { // Remove invalid items only in frontend\n\t\t$items = array_filter( $items, '_is_valid_nav_menu_item' );\n\t}\n\n\tif ( ARRAY_A == $args['output'] ) {\n\t\t$GLOBALS['_menu_item_sort_prop'] = $args['output_key'];\n\t\tusort($items, '_sort_nav_menu_items');\n\t\t$i = 1;\n\t\tforeach ( $items as $k => $item ) {\n\t\t\t$items[$k]->{$args['output_key']} = $i++;\n\t\t}\n\t}\n\n\t/**\n\t * Filter the navigation menu items being returned.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array  $items An array of menu item post objects.\n\t * @param object $menu  The menu object.\n\t * @param array  $args  An array of arguments used to retrieve menu item objects.\n\t */\n\treturn apply_filters( 'wp_get_nav_menu_items', $items, $menu, $args );\n}\n\n/**\n * Decorates a menu item object with the shared navigation menu item properties.\n *\n * Properties:\n * - ID:               The term_id if the menu item represents a taxonomy term.\n * - attr_title:       The title attribute of the link element for this menu item.\n * - classes:          The array of class attribute values for the link element of this menu item.\n * - db_id:            The DB ID of this item as a nav_menu_item object, if it exists (0 if it doesn't exist).\n * - description:      The description of this menu item.\n * - menu_item_parent: The DB ID of the nav_menu_item that is this item's menu parent, if any. 0 otherwise.\n * - object:           The type of object originally represented, such as \"category,\" \"post\", or \"attachment.\"\n * - object_id:        The DB ID of the original object this menu item represents, e.g. ID for posts and term_id for categories.\n * - post_parent:      The DB ID of the original object's parent object, if any (0 otherwise).\n * - post_title:       A \"no title\" label if menu item represents a post that lacks a title.\n * - target:           The target attribute of the link element for this menu item.\n * - title:            The title of this menu item.\n * - type:             The family of objects originally represented, such as \"post_type\" or \"taxonomy.\"\n * - type_label:       The singular label used to describe this type of menu item.\n * - url:              The URL to which this menu item points.\n * - xfn:              The XFN relationship expressed in the link of this menu item.\n * - _invalid:         Whether the menu item represents an object that no longer exists.\n *\n * @since 3.0.0\n *\n * @param object $menu_item The menu item to modify.\n * @return object $menu_item The menu item with standard menu item properties.\n */\nfunction wp_setup_nav_menu_item( $menu_item ) {\n\tif ( isset( $menu_item->post_type ) ) {\n\t\tif ( 'nav_menu_item' == $menu_item->post_type ) {\n\t\t\t$menu_item->db_id = (int) $menu_item->ID;\n\t\t\t$menu_item->menu_item_parent = ! isset( $menu_item->menu_item_parent ) ? get_post_meta( $menu_item->ID, '_menu_item_menu_item_parent', true ) : $menu_item->menu_item_parent;\n\t\t\t$menu_item->object_id = ! isset( $menu_item->object_id ) ? get_post_meta( $menu_item->ID, '_menu_item_object_id', true ) : $menu_item->object_id;\n\t\t\t$menu_item->object = ! isset( $menu_item->object ) ? get_post_meta( $menu_item->ID, '_menu_item_object', true ) : $menu_item->object;\n\t\t\t$menu_item->type = ! isset( $menu_item->type ) ? get_post_meta( $menu_item->ID, '_menu_item_type', true ) : $menu_item->type;\n\n\t\t\tif ( 'post_type' == $menu_item->type ) {\n\t\t\t\t$object = get_post_type_object( $menu_item->object );\n\t\t\t\tif ( $object ) {\n\t\t\t\t\t$menu_item->type_label = $object->labels->singular_name;\n\t\t\t\t} else {\n\t\t\t\t\t$menu_item->type_label = $menu_item->object;\n\t\t\t\t\t$menu_item->_invalid = true;\n\t\t\t\t}\n\n\t\t\t\t$menu_item->url = get_permalink( $menu_item->object_id );\n\n\t\t\t\t$original_object = get_post( $menu_item->object_id );\n\t\t\t\t$original_title = $original_object->post_title;\n\n\t\t\t\tif ( '' === $original_title ) {\n\t\t\t\t\t/* translators: %d: ID of a post */\n\t\t\t\t\t$original_title = sprintf( __( '#%d (no title)' ), $original_object->ID );\n\t\t\t\t}\n\n\t\t\t\t$menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;\n\n\t\t\t} elseif ( 'post_type_archive' == $menu_item->type ) {\n\t\t\t\t$object =  get_post_type_object( $menu_item->object );\n\t\t\t\tif ( $object ) {\n\t\t\t\t\t$menu_item->title = '' == $menu_item->post_title ? $object->labels->archives : $menu_item->post_title;\n\t\t\t\t} else {\n\t\t\t\t\t$menu_item->_invalid = true;\n\t\t\t\t}\n\n\t\t\t\t$menu_item->type_label = __( 'Post Type Archive' );\n\t\t\t\t$menu_item->description = '';\n\t\t\t\t$menu_item->url = get_post_type_archive_link( $menu_item->object );\n\t\t\t} elseif ( 'taxonomy' == $menu_item->type ) {\n\t\t\t\t$object = get_taxonomy( $menu_item->object );\n\t\t\t\tif ( $object ) {\n\t\t\t\t\t$menu_item->type_label = $object->labels->singular_name;\n\t\t\t\t} else {\n\t\t\t\t\t$menu_item->type_label = $menu_item->object;\n\t\t\t\t\t$menu_item->_invalid = true;\n\t\t\t\t}\n\n\t\t\t\t$term_url = get_term_link( (int) $menu_item->object_id, $menu_item->object );\n\t\t\t\t$menu_item->url = !is_wp_error( $term_url ) ? $term_url : '';\n\n\t\t\t\t$original_title = get_term_field( 'name', $menu_item->object_id, $menu_item->object, 'raw' );\n\t\t\t\tif ( is_wp_error( $original_title ) )\n\t\t\t\t\t$original_title = false;\n\t\t\t\t$menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;\n\n\t\t\t} else {\n\t\t\t\t$menu_item->type_label = __('Custom Link');\n\t\t\t\t$menu_item->title = $menu_item->post_title;\n\t\t\t\t$menu_item->url = ! isset( $menu_item->url ) ? get_post_meta( $menu_item->ID, '_menu_item_url', true ) : $menu_item->url;\n\t\t\t}\n\n\t\t\t$menu_item->target = ! isset( $menu_item->target ) ? get_post_meta( $menu_item->ID, '_menu_item_target', true ) : $menu_item->target;\n\n\t\t\t/**\n\t\t\t * Filter a navigation menu item's title attribute.\n\t\t\t *\n\t\t\t * @since 3.0.0\n\t\t\t *\n\t\t\t * @param string $item_title The menu item title attribute.\n\t\t\t */\n\t\t\t$menu_item->attr_title = ! isset( $menu_item->attr_title ) ? apply_filters( 'nav_menu_attr_title', $menu_item->post_excerpt ) : $menu_item->attr_title;\n\n\t\t\tif ( ! isset( $menu_item->description ) ) {\n\t\t\t\t/**\n\t\t\t\t * Filter a navigation menu item's description.\n\t\t\t\t *\n\t\t\t\t * @since 3.0.0\n\t\t\t\t *\n\t\t\t\t * @param string $description The menu item description.\n\t\t\t\t */\n\t\t\t\t$menu_item->description = apply_filters( 'nav_menu_description', wp_trim_words( $menu_item->post_content, 200 ) );\n\t\t\t}\n\n\t\t\t$menu_item->classes = ! isset( $menu_item->classes ) ? (array) get_post_meta( $menu_item->ID, '_menu_item_classes', true ) : $menu_item->classes;\n\t\t\t$menu_item->xfn = ! isset( $menu_item->xfn ) ? get_post_meta( $menu_item->ID, '_menu_item_xfn', true ) : $menu_item->xfn;\n\t\t} else {\n\t\t\t$menu_item->db_id = 0;\n\t\t\t$menu_item->menu_item_parent = 0;\n\t\t\t$menu_item->object_id = (int) $menu_item->ID;\n\t\t\t$menu_item->type = 'post_type';\n\n\t\t\t$object = get_post_type_object( $menu_item->post_type );\n\t\t\t$menu_item->object = $object->name;\n\t\t\t$menu_item->type_label = $object->labels->singular_name;\n\n\t\t\tif ( '' === $menu_item->post_title ) {\n\t\t\t\t/* translators: %d: ID of a post */\n\t\t\t\t$menu_item->post_title = sprintf( __( '#%d (no title)' ), $menu_item->ID );\n\t\t\t}\n\n\t\t\t$menu_item->title = $menu_item->post_title;\n\t\t\t$menu_item->url = get_permalink( $menu_item->ID );\n\t\t\t$menu_item->target = '';\n\n\t\t\t/** This filter is documented in wp-includes/nav-menu.php */\n\t\t\t$menu_item->attr_title = apply_filters( 'nav_menu_attr_title', '' );\n\n\t\t\t/** This filter is documented in wp-includes/nav-menu.php */\n\t\t\t$menu_item->description = apply_filters( 'nav_menu_description', '' );\n\t\t\t$menu_item->classes = array();\n\t\t\t$menu_item->xfn = '';\n\t\t}\n\t} elseif ( isset( $menu_item->taxonomy ) ) {\n\t\t$menu_item->ID = $menu_item->term_id;\n\t\t$menu_item->db_id = 0;\n\t\t$menu_item->menu_item_parent = 0;\n\t\t$menu_item->object_id = (int) $menu_item->term_id;\n\t\t$menu_item->post_parent = (int) $menu_item->parent;\n\t\t$menu_item->type = 'taxonomy';\n\n\t\t$object = get_taxonomy( $menu_item->taxonomy );\n\t\t$menu_item->object = $object->name;\n\t\t$menu_item->type_label = $object->labels->singular_name;\n\n\t\t$menu_item->title = $menu_item->name;\n\t\t$menu_item->url = get_term_link( $menu_item, $menu_item->taxonomy );\n\t\t$menu_item->target = '';\n\t\t$menu_item->attr_title = '';\n\t\t$menu_item->description = get_term_field( 'description', $menu_item->term_id, $menu_item->taxonomy );\n\t\t$menu_item->classes = array();\n\t\t$menu_item->xfn = '';\n\n\t}\n\n\t/**\n\t * Filter a navigation menu item object.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param object $menu_item The menu item object.\n\t */\n\treturn apply_filters( 'wp_setup_nav_menu_item', $menu_item );\n}\n\n/**\n * Get the menu items associated with a particular object.\n *\n * @since 3.0.0\n *\n * @param int    $object_id   The ID of the original object.\n * @param string $object_type The type of object, such as \"taxonomy\" or \"post_type.\"\n * @param string $taxonomy    If $object_type is \"taxonomy\", $taxonomy is the name of the tax that $object_id belongs to\n * @return array The array of menu item IDs; empty array if none;\n */\nfunction wp_get_associated_nav_menu_items( $object_id = 0, $object_type = 'post_type', $taxonomy = '' ) {\n\t$object_id = (int) $object_id;\n\t$menu_item_ids = array();\n\n\t$query = new WP_Query;\n\t$menu_items = $query->query(\n\t\tarray(\n\t\t\t'meta_key' => '_menu_item_object_id',\n\t\t\t'meta_value' => $object_id,\n\t\t\t'post_status' => 'any',\n\t\t\t'post_type' => 'nav_menu_item',\n\t\t\t'posts_per_page' => -1,\n\t\t)\n\t);\n\tforeach ( (array) $menu_items as $menu_item ) {\n\t\tif ( isset( $menu_item->ID ) && is_nav_menu_item( $menu_item->ID ) ) {\n\t\t\t$menu_item_type = get_post_meta( $menu_item->ID, '_menu_item_type', true );\n\t\t\tif (\n\t\t\t\t'post_type' == $object_type &&\n\t\t\t\t'post_type' == $menu_item_type\n\t\t\t) {\n\t\t\t\t$menu_item_ids[] = (int) $menu_item->ID;\n\t\t\t} elseif (\n\t\t\t\t'taxonomy' == $object_type &&\n\t\t\t\t'taxonomy' == $menu_item_type &&\n\t\t\t\tget_post_meta( $menu_item->ID, '_menu_item_object', true ) == $taxonomy\n\t\t\t) {\n\t\t\t\t$menu_item_ids[] = (int) $menu_item->ID;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn array_unique( $menu_item_ids );\n}\n\n/**\n * Callback for handling a menu item when its original object is deleted.\n *\n * @since 3.0.0\n * @access private\n *\n * @param int $object_id The ID of the original object being trashed.\n *\n */\nfunction _wp_delete_post_menu_item( $object_id = 0 ) {\n\t$object_id = (int) $object_id;\n\n\t$menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'post_type' );\n\n\tforeach ( (array) $menu_item_ids as $menu_item_id ) {\n\t\twp_delete_post( $menu_item_id, true );\n\t}\n}\n\n/**\n * Callback for handling a menu item when its original object is deleted.\n *\n * @since 3.0.0\n * @access private\n *\n * @param int $object_id The ID of the original object being trashed.\n *\n */\nfunction _wp_delete_tax_menu_item( $object_id = 0, $tt_id, $taxonomy ) {\n\t$object_id = (int) $object_id;\n\n\t$menu_item_ids = wp_get_associated_nav_menu_items( $object_id, 'taxonomy', $taxonomy );\n\n\tforeach ( (array) $menu_item_ids as $menu_item_id ) {\n\t\twp_delete_post( $menu_item_id, true );\n\t}\n}\n\n/**\n * Automatically add newly published page objects to menus with that as an option.\n *\n * @since 3.0.0\n * @access private\n *\n * @param string $new_status The new status of the post object.\n * @param string $old_status The old status of the post object.\n * @param object $post       The post object being transitioned from one status to another.\n */\nfunction _wp_auto_add_pages_to_menu( $new_status, $old_status, $post ) {\n\tif ( 'publish' != $new_status || 'publish' == $old_status || 'page' != $post->post_type )\n\t\treturn;\n\tif ( ! empty( $post->post_parent ) )\n\t\treturn;\n\t$auto_add = get_option( 'nav_menu_options' );\n\tif ( empty( $auto_add ) || ! is_array( $auto_add ) || ! isset( $auto_add['auto_add'] ) )\n\t\treturn;\n\t$auto_add = $auto_add['auto_add'];\n\tif ( empty( $auto_add ) || ! is_array( $auto_add ) )\n\t\treturn;\n\n\t$args = array(\n\t\t'menu-item-object-id' => $post->ID,\n\t\t'menu-item-object' => $post->post_type,\n\t\t'menu-item-type' => 'post_type',\n\t\t'menu-item-status' => 'publish',\n\t);\n\n\tforeach ( $auto_add as $menu_id ) {\n\t\t$items = wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );\n\t\tif ( ! is_array( $items ) )\n\t\t\tcontinue;\n\t\tforeach ( $items as $item ) {\n\t\t\tif ( $post->ID == $item->object_id )\n\t\t\t\tcontinue 2;\n\t\t}\n\t\twp_update_nav_menu_item( $menu_id, 0, $args );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/option.php",
    "content": "<?php\n/**\n * Option API\n *\n * @package WordPress\n * @subpackage Option\n */\n\n/**\n * Retrieve option value based on name of option.\n *\n * If the option does not exist or does not have a value, then the return value\n * will be false. This is useful to check whether you need to install an option\n * and is commonly used during installation of plugin options and to test\n * whether upgrading is required.\n *\n * If the option was serialized then it will be unserialized when it is returned.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $option  Name of option to retrieve. Expected to not be SQL-escaped.\n * @param mixed  $default Optional. Default value to return if the option does not exist.\n * @return mixed Value set for the option.\n */\nfunction get_option( $option, $default = false ) {\n\tglobal $wpdb;\n\n\t$option = trim( $option );\n\tif ( empty( $option ) )\n\t\treturn false;\n\n\t/**\n\t * Filter the value of an existing option before it is retrieved.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * Passing a truthy value to the filter will short-circuit retrieving\n\t * the option value, returning the passed value instead.\n\t *\n\t * @since 1.5.0\n\t * @since 4.4.0 The `$option` parameter was added.\n\t *\n\t * @param bool|mixed $pre_option Value to return instead of the option value.\n\t *                               Default false to skip it.\n\t * @param string     $option     Option name.\n\t */\n\t$pre = apply_filters( 'pre_option_' . $option, false, $option );\n\tif ( false !== $pre )\n\t\treturn $pre;\n\n\tif ( defined( 'WP_SETUP_CONFIG' ) )\n\t\treturn false;\n\n\tif ( ! wp_installing() ) {\n\t\t// prevent non-existent options from triggering multiple queries\n\t\t$notoptions = wp_cache_get( 'notoptions', 'options' );\n\t\tif ( isset( $notoptions[ $option ] ) ) {\n\t\t\t/**\n\t\t\t * Filter the default value for an option.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t * @since 4.4.0 The `$option` parameter was added.\n\t\t\t *\n\t\t\t * @param mixed  $default The default value to return if the option does not exist\n\t\t\t *                        in the database.\n\t\t\t * @param string $option  Option name.\n\t\t\t */\n\t\t\treturn apply_filters( 'default_option_' . $option, $default, $option );\n\t\t}\n\n\t\t$alloptions = wp_load_alloptions();\n\n\t\tif ( isset( $alloptions[$option] ) ) {\n\t\t\t$value = $alloptions[$option];\n\t\t} else {\n\t\t\t$value = wp_cache_get( $option, 'options' );\n\n\t\t\tif ( false === $value ) {\n\t\t\t\t$row = $wpdb->get_row( $wpdb->prepare( \"SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1\", $option ) );\n\n\t\t\t\t// Has to be get_row instead of get_var because of funkiness with 0, false, null values\n\t\t\t\tif ( is_object( $row ) ) {\n\t\t\t\t\t$value = $row->option_value;\n\t\t\t\t\twp_cache_add( $option, $value, 'options' );\n\t\t\t\t} else { // option does not exist, so we must cache its non-existence\n\t\t\t\t\tif ( ! is_array( $notoptions ) ) {\n\t\t\t\t\t\t $notoptions = array();\n\t\t\t\t\t}\n\t\t\t\t\t$notoptions[$option] = true;\n\t\t\t\t\twp_cache_set( 'notoptions', $notoptions, 'options' );\n\n\t\t\t\t\t/** This filter is documented in wp-includes/option.php */\n\t\t\t\t\treturn apply_filters( 'default_option_' . $option, $default, $option );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t$suppress = $wpdb->suppress_errors();\n\t\t$row = $wpdb->get_row( $wpdb->prepare( \"SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1\", $option ) );\n\t\t$wpdb->suppress_errors( $suppress );\n\t\tif ( is_object( $row ) ) {\n\t\t\t$value = $row->option_value;\n\t\t} else {\n\t\t\t/** This filter is documented in wp-includes/option.php */\n\t\t\treturn apply_filters( 'default_option_' . $option, $default, $option );\n\t\t}\n\t}\n\n\t// If home is not set use siteurl.\n\tif ( 'home' == $option && '' == $value )\n\t\treturn get_option( 'siteurl' );\n\n\tif ( in_array( $option, array('siteurl', 'home', 'category_base', 'tag_base') ) )\n\t\t$value = untrailingslashit( $value );\n\n\t/**\n\t * Filter the value of an existing option.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * @since 1.5.0 As 'option_' . $setting\n\t * @since 3.0.0\n\t * @since 4.4.0 The `$option` parameter was added.\n\t *\n\t * @param mixed  $value  Value of the option. If stored serialized, it will be\n\t *                       unserialized prior to being returned.\n\t * @param string $option Option name.\n\t */\n\treturn apply_filters( 'option_' . $option, maybe_unserialize( $value ), $option );\n}\n\n/**\n * Protect WordPress special option from being modified.\n *\n * Will die if $option is in protected list. Protected options are 'alloptions'\n * and 'notoptions' options.\n *\n * @since 2.2.0\n *\n * @param string $option Option name.\n */\nfunction wp_protect_special_option( $option ) {\n\tif ( 'alloptions' === $option || 'notoptions' === $option )\n\t\twp_die( sprintf( __( '%s is a protected WP option and may not be modified' ), esc_html( $option ) ) );\n}\n\n/**\n * Print option value after sanitizing for forms.\n *\n * @since 1.5.0\n *\n * @param string $option Option name.\n */\nfunction form_option( $option ) {\n\techo esc_attr( get_option( $option ) );\n}\n\n/**\n * Loads and caches all autoloaded options, if available or all options.\n *\n * @since 2.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return array List of all options.\n */\nfunction wp_load_alloptions() {\n\tglobal $wpdb;\n\n\tif ( ! wp_installing() || ! is_multisite() )\n\t\t$alloptions = wp_cache_get( 'alloptions', 'options' );\n\telse\n\t\t$alloptions = false;\n\n\tif ( !$alloptions ) {\n\t\t$suppress = $wpdb->suppress_errors();\n\t\tif ( !$alloptions_db = $wpdb->get_results( \"SELECT option_name, option_value FROM $wpdb->options WHERE autoload = 'yes'\" ) )\n\t\t\t$alloptions_db = $wpdb->get_results( \"SELECT option_name, option_value FROM $wpdb->options\" );\n\t\t$wpdb->suppress_errors($suppress);\n\t\t$alloptions = array();\n\t\tforeach ( (array) $alloptions_db as $o ) {\n\t\t\t$alloptions[$o->option_name] = $o->option_value;\n\t\t}\n\t\tif ( ! wp_installing() || ! is_multisite() )\n\t\t\twp_cache_add( 'alloptions', $alloptions, 'options' );\n\t}\n\n\treturn $alloptions;\n}\n\n/**\n * Loads and caches certain often requested site options if is_multisite() and a persistent cache is not being used.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $site_id Optional site ID for which to query the options. Defaults to the current site.\n */\nfunction wp_load_core_site_options( $site_id = null ) {\n\tglobal $wpdb;\n\n\tif ( ! is_multisite() || wp_using_ext_object_cache() || wp_installing() )\n\t\treturn;\n\n\tif ( empty($site_id) )\n\t\t$site_id = $wpdb->siteid;\n\n\t$core_options = array('site_name', 'siteurl', 'active_sitewide_plugins', '_site_transient_timeout_theme_roots', '_site_transient_theme_roots', 'site_admins', 'can_compress_scripts', 'global_terms_enabled', 'ms_files_rewriting' );\n\n\t$core_options_in = \"'\" . implode(\"', '\", $core_options) . \"'\";\n\t$options = $wpdb->get_results( $wpdb->prepare(\"SELECT meta_key, meta_value FROM $wpdb->sitemeta WHERE meta_key IN ($core_options_in) AND site_id = %d\", $site_id) );\n\n\tforeach ( $options as $option ) {\n\t\t$key = $option->meta_key;\n\t\t$cache_key = \"{$site_id}:$key\";\n\t\t$option->meta_value = maybe_unserialize( $option->meta_value );\n\n\t\twp_cache_set( $cache_key, $option->meta_value, 'site-options' );\n\t}\n}\n\n/**\n * Update the value of an option that was already added.\n *\n * You do not need to serialize values. If the value needs to be serialized, then\n * it will be serialized before it is inserted into the database. Remember,\n * resources can not be serialized or added as an option.\n *\n * If the option does not exist, then the option will be added with the option value,\n * with an `$autoload` value of 'yes'.\n *\n * @since 1.0.0\n * @since 4.2.0 The `$autoload` parameter was added.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string      $option   Option name. Expected to not be SQL-escaped.\n * @param mixed       $value    Option value. Must be serializable if non-scalar. Expected to not be SQL-escaped.\n * @param string|bool $autoload Optional. Whether to load the option when WordPress starts up. For existing options,\n *                              `$autoload` can only be updated using `update_option()` if `$value` is also changed.\n *                              Accepts 'yes'|true to enable or 'no'|false to disable. For non-existent options,\n *                              the default value is 'yes'. Default null.\n * @return bool False if value was not updated and true if value was updated.\n */\nfunction update_option( $option, $value, $autoload = null ) {\n\tglobal $wpdb;\n\n\t$option = trim($option);\n\tif ( empty($option) )\n\t\treturn false;\n\n\twp_protect_special_option( $option );\n\n\tif ( is_object( $value ) )\n\t\t$value = clone $value;\n\n\t$value = sanitize_option( $option, $value );\n\t$old_value = get_option( $option );\n\n\t/**\n\t * Filter a specific option before its value is (maybe) serialized and updated.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * @since 2.6.0\n\t * @since 4.4.0 The `$option` parameter was added.\n\t *\n\t * @param mixed  $value     The new, unserialized option value.\n\t * @param mixed  $old_value The old option value.\n\t * @param string $option    Option name.\n\t */\n\t$value = apply_filters( 'pre_update_option_' . $option, $value, $old_value, $option );\n\n\t/**\n\t * Filter an option before its value is (maybe) serialized and updated.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param mixed  $value     The new, unserialized option value.\n\t * @param string $option    Name of the option.\n\t * @param mixed  $old_value The old option value.\n\t */\n\t$value = apply_filters( 'pre_update_option', $value, $option, $old_value );\n\n\t// If the new and old values are the same, no need to update.\n\tif ( $value === $old_value )\n\t\treturn false;\n\n\t/** This filter is documented in wp-includes/option.php */\n\tif ( apply_filters( 'default_option_' . $option, false ) === $old_value ) {\n\t\t// Default setting for new options is 'yes'.\n\t\tif ( null === $autoload ) {\n\t\t\t$autoload = 'yes';\n\t\t}\n\n\t\treturn add_option( $option, $value, '', $autoload );\n\t}\n\n\t$serialized_value = maybe_serialize( $value );\n\n\t/**\n\t * Fires immediately before an option value is updated.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $option    Name of the option to update.\n\t * @param mixed  $old_value The old option value.\n\t * @param mixed  $value     The new option value.\n\t */\n\tdo_action( 'update_option', $option, $old_value, $value );\n\n\t$update_args = array(\n\t\t'option_value' => $serialized_value,\n\t);\n\n\tif ( null !== $autoload ) {\n\t\t$update_args['autoload'] = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';\n\t}\n\n\t$result = $wpdb->update( $wpdb->options, $update_args, array( 'option_name' => $option ) );\n\tif ( ! $result )\n\t\treturn false;\n\n\t$notoptions = wp_cache_get( 'notoptions', 'options' );\n\tif ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) {\n\t\tunset( $notoptions[$option] );\n\t\twp_cache_set( 'notoptions', $notoptions, 'options' );\n\t}\n\n\tif ( ! wp_installing() ) {\n\t\t$alloptions = wp_load_alloptions();\n\t\tif ( isset( $alloptions[$option] ) ) {\n\t\t\t$alloptions[ $option ] = $serialized_value;\n\t\t\twp_cache_set( 'alloptions', $alloptions, 'options' );\n\t\t} else {\n\t\t\twp_cache_set( $option, $serialized_value, 'options' );\n\t\t}\n\t}\n\n\t/**\n\t * Fires after the value of a specific option has been successfully updated.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * @since 2.0.1\n\t * @since 4.4.0 The `$option` parameter was added.\n\t *\n\t * @param mixed  $old_value The old option value.\n\t * @param mixed  $value     The new option value.\n\t * @param string $option    Option name.\n\t */\n\tdo_action( \"update_option_{$option}\", $old_value, $value, $option );\n\n\t/**\n\t * Fires after the value of an option has been successfully updated.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $option    Name of the updated option.\n\t * @param mixed  $old_value The old option value.\n\t * @param mixed  $value     The new option value.\n\t */\n\tdo_action( 'updated_option', $option, $old_value, $value );\n\treturn true;\n}\n\n/**\n * Add a new option.\n *\n * You do not need to serialize values. If the value needs to be serialized, then\n * it will be serialized before it is inserted into the database. Remember,\n * resources can not be serialized or added as an option.\n *\n * You can create options without values and then update the values later.\n * Existing options will not be updated and checks are performed to ensure that you\n * aren't adding a protected WordPress option. Care should be taken to not name\n * options the same as the ones which are protected.\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string         $option      Name of option to add. Expected to not be SQL-escaped.\n * @param mixed          $value       Optional. Option value. Must be serializable if non-scalar. Expected to not be SQL-escaped.\n * @param string         $deprecated  Optional. Description. Not used anymore.\n * @param string|bool    $autoload    Optional. Whether to load the option when WordPress starts up.\n *                                    Default is enabled. Accepts 'no' to disable for legacy reasons.\n * @return bool False if option was not added and true if option was added.\n */\nfunction add_option( $option, $value = '', $deprecated = '', $autoload = 'yes' ) {\n\tglobal $wpdb;\n\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.3' );\n\n\t$option = trim($option);\n\tif ( empty($option) )\n\t\treturn false;\n\n\twp_protect_special_option( $option );\n\n\tif ( is_object($value) )\n\t\t$value = clone $value;\n\n\t$value = sanitize_option( $option, $value );\n\n\t// Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query\n\t$notoptions = wp_cache_get( 'notoptions', 'options' );\n\tif ( !is_array( $notoptions ) || !isset( $notoptions[$option] ) )\n\t\t/** This filter is documented in wp-includes/option.php */\n\t\tif ( apply_filters( 'default_option_' . $option, false ) !== get_option( $option ) )\n\t\t\treturn false;\n\n\t$serialized_value = maybe_serialize( $value );\n\t$autoload = ( 'no' === $autoload || false === $autoload ) ? 'no' : 'yes';\n\n\t/**\n\t * Fires before an option is added.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $option Name of the option to add.\n\t * @param mixed  $value  Value of the option.\n\t */\n\tdo_action( 'add_option', $option, $value );\n\n\t$result = $wpdb->query( $wpdb->prepare( \"INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)\", $option, $serialized_value, $autoload ) );\n\tif ( ! $result )\n\t\treturn false;\n\n\tif ( ! wp_installing() ) {\n\t\tif ( 'yes' == $autoload ) {\n\t\t\t$alloptions = wp_load_alloptions();\n\t\t\t$alloptions[ $option ] = $serialized_value;\n\t\t\twp_cache_set( 'alloptions', $alloptions, 'options' );\n\t\t} else {\n\t\t\twp_cache_set( $option, $serialized_value, 'options' );\n\t\t}\n\t}\n\n\t// This option exists now\n\t$notoptions = wp_cache_get( 'notoptions', 'options' ); // yes, again... we need it to be fresh\n\tif ( is_array( $notoptions ) && isset( $notoptions[$option] ) ) {\n\t\tunset( $notoptions[$option] );\n\t\twp_cache_set( 'notoptions', $notoptions, 'options' );\n\t}\n\n\t/**\n\t * Fires after a specific option has been added.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * @since 2.5.0 As \"add_option_{$name}\"\n\t * @since 3.0.0\n\t *\n\t * @param string $option Name of the option to add.\n\t * @param mixed  $value  Value of the option.\n\t */\n\tdo_action( \"add_option_{$option}\", $option, $value );\n\n\t/**\n\t * Fires after an option has been added.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $option Name of the added option.\n\t * @param mixed  $value  Value of the option.\n\t */\n\tdo_action( 'added_option', $option, $value );\n\treturn true;\n}\n\n/**\n * Removes option by name. Prevents removal of protected WordPress options.\n *\n * @since 1.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $option Name of option to remove. Expected to not be SQL-escaped.\n * @return bool True, if option is successfully deleted. False on failure.\n */\nfunction delete_option( $option ) {\n\tglobal $wpdb;\n\n\t$option = trim( $option );\n\tif ( empty( $option ) )\n\t\treturn false;\n\n\twp_protect_special_option( $option );\n\n\t// Get the ID, if no ID then return\n\t$row = $wpdb->get_row( $wpdb->prepare( \"SELECT autoload FROM $wpdb->options WHERE option_name = %s\", $option ) );\n\tif ( is_null( $row ) )\n\t\treturn false;\n\n\t/**\n\t * Fires immediately before an option is deleted.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $option Name of the option to delete.\n\t */\n\tdo_action( 'delete_option', $option );\n\n\t$result = $wpdb->delete( $wpdb->options, array( 'option_name' => $option ) );\n\tif ( ! wp_installing() ) {\n\t\tif ( 'yes' == $row->autoload ) {\n\t\t\t$alloptions = wp_load_alloptions();\n\t\t\tif ( is_array( $alloptions ) && isset( $alloptions[$option] ) ) {\n\t\t\t\tunset( $alloptions[$option] );\n\t\t\t\twp_cache_set( 'alloptions', $alloptions, 'options' );\n\t\t\t}\n\t\t} else {\n\t\t\twp_cache_delete( $option, 'options' );\n\t\t}\n\t}\n\tif ( $result ) {\n\n\t\t/**\n\t\t * Fires after a specific option has been deleted.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $option Name of the deleted option.\n\t\t */\n\t\tdo_action( \"delete_option_$option\", $option );\n\n\t\t/**\n\t\t * Fires after an option has been deleted.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param string $option Name of the deleted option.\n\t\t */\n\t\tdo_action( 'deleted_option', $option );\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Delete a transient.\n *\n * @since 2.8.0\n *\n * @param string $transient Transient name. Expected to not be SQL-escaped.\n * @return bool true if successful, false otherwise\n */\nfunction delete_transient( $transient ) {\n\n\t/**\n\t * Fires immediately before a specific transient is deleted.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $transient Transient name.\n\t */\n\tdo_action( 'delete_transient_' . $transient, $transient );\n\n\tif ( wp_using_ext_object_cache() ) {\n\t\t$result = wp_cache_delete( $transient, 'transient' );\n\t} else {\n\t\t$option_timeout = '_transient_timeout_' . $transient;\n\t\t$option = '_transient_' . $transient;\n\t\t$result = delete_option( $option );\n\t\tif ( $result )\n\t\t\tdelete_option( $option_timeout );\n\t}\n\n\tif ( $result ) {\n\n\t\t/**\n\t\t * Fires after a transient is deleted.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $transient Deleted transient name.\n\t\t */\n\t\tdo_action( 'deleted_transient', $transient );\n\t}\n\n\treturn $result;\n}\n\n/**\n * Get the value of a transient.\n *\n * If the transient does not exist, does not have a value, or has expired,\n * then the return value will be false.\n *\n * @since 2.8.0\n *\n * @param string $transient Transient name. Expected to not be SQL-escaped.\n * @return mixed Value of transient.\n */\nfunction get_transient( $transient ) {\n\n\t/**\n\t * Filter the value of an existing transient.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * Passing a truthy value to the filter will effectively short-circuit retrieval\n\t * of the transient, returning the passed value instead.\n\t *\n\t * @since 2.8.0\n\t * @since 4.4.0 The `$transient` parameter was added\n\t *\n\t * @param mixed  $pre_transient The default value to return if the transient does not exist.\n\t *                              Any value other than false will short-circuit the retrieval\n\t *                              of the transient, and return the returned value.\n\t * @param string $transient     Transient name.\n\t */\n\t$pre = apply_filters( 'pre_transient_' . $transient, false, $transient );\n\tif ( false !== $pre )\n\t\treturn $pre;\n\n\tif ( wp_using_ext_object_cache() ) {\n\t\t$value = wp_cache_get( $transient, 'transient' );\n\t} else {\n\t\t$transient_option = '_transient_' . $transient;\n\t\tif ( ! wp_installing() ) {\n\t\t\t// If option is not in alloptions, it is not autoloaded and thus has a timeout\n\t\t\t$alloptions = wp_load_alloptions();\n\t\t\tif ( !isset( $alloptions[$transient_option] ) ) {\n\t\t\t\t$transient_timeout = '_transient_timeout_' . $transient;\n\t\t\t\t$timeout = get_option( $transient_timeout );\n\t\t\t\tif ( false !== $timeout && $timeout < time() ) {\n\t\t\t\t\tdelete_option( $transient_option  );\n\t\t\t\t\tdelete_option( $transient_timeout );\n\t\t\t\t\t$value = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( ! isset( $value ) )\n\t\t\t$value = get_option( $transient_option );\n\t}\n\n\t/**\n\t * Filter an existing transient's value.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * @since 2.8.0\n\t * @since 4.4.0 The `$transient` parameter was added\n\t *\n\t * @param mixed  $value     Value of transient.\n\t * @param string $transient Transient name.\n\t */\n\treturn apply_filters( 'transient_' . $transient, $value, $transient );\n}\n\n/**\n * Set/update the value of a transient.\n *\n * You do not need to serialize values. If the value needs to be serialized, then\n * it will be serialized before it is set.\n *\n * @since 2.8.0\n *\n * @param string $transient  Transient name. Expected to not be SQL-escaped. Must be\n *                           172 characters or fewer in length.\n * @param mixed  $value      Transient value. Must be serializable if non-scalar.\n *                           Expected to not be SQL-escaped.\n * @param int    $expiration Optional. Time until expiration in seconds. Default 0 (no expiration).\n * @return bool False if value was not set and true if value was set.\n */\nfunction set_transient( $transient, $value, $expiration = 0 ) {\n\n\t$expiration = (int) $expiration;\n\n\t/**\n\t * Filter a specific transient before its value is set.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * @since 3.0.0\n\t * @since 4.2.0 The `$expiration` parameter was added.\n\t * @since 4.4.0 The `$transient` parameter was added.\n\t *\n\t * @param mixed  $value      New value of transient.\n\t * @param int    $expiration Time until expiration in seconds.\n\t * @param string $transient  Transient name.\n\t */\n\t$value = apply_filters( 'pre_set_transient_' . $transient, $value, $expiration, $transient );\n\n\t/**\n\t * Filter the expiration for a transient before its value is set.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param int    $expiration Time until expiration in seconds. Use 0 for no expiration.\n\t * @param mixed  $value      New value of transient.\n\t * @param string $transient  Transient name.\n\t */\n\t$expiration = apply_filters( 'expiration_of_transient_' . $transient, $expiration, $value, $transient );\n\n\tif ( wp_using_ext_object_cache() ) {\n\t\t$result = wp_cache_set( $transient, $value, 'transient', $expiration );\n\t} else {\n\t\t$transient_timeout = '_transient_timeout_' . $transient;\n\t\t$transient_option = '_transient_' . $transient;\n\t\tif ( false === get_option( $transient_option ) ) {\n\t\t\t$autoload = 'yes';\n\t\t\tif ( $expiration ) {\n\t\t\t\t$autoload = 'no';\n\t\t\t\tadd_option( $transient_timeout, time() + $expiration, '', 'no' );\n\t\t\t}\n\t\t\t$result = add_option( $transient_option, $value, '', $autoload );\n\t\t} else {\n\t\t\t// If expiration is requested, but the transient has no timeout option,\n\t\t\t// delete, then re-create transient rather than update.\n\t\t\t$update = true;\n\t\t\tif ( $expiration ) {\n\t\t\t\tif ( false === get_option( $transient_timeout ) ) {\n\t\t\t\t\tdelete_option( $transient_option );\n\t\t\t\t\tadd_option( $transient_timeout, time() + $expiration, '', 'no' );\n\t\t\t\t\t$result = add_option( $transient_option, $value, '', 'no' );\n\t\t\t\t\t$update = false;\n\t\t\t\t} else {\n\t\t\t\t\tupdate_option( $transient_timeout, time() + $expiration );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( $update ) {\n\t\t\t\t$result = update_option( $transient_option, $value );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( $result ) {\n\n\t\t/**\n\t\t * Fires after the value for a specific transient has been set.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t\t *\n\t\t * @since 3.0.0\n\t\t * @since 3.6.0 The `$value` and `$expiration` parameters were added.\n\t\t * @since 4.4.0 The `$transient` parameter was added.\n\t\t *\n\t\t * @param mixed  $value      Transient value.\n\t\t * @param int    $expiration Time until expiration in seconds.\n\t\t * @param string $transient  The name of the transient.\n\t\t */\n\t\tdo_action( 'set_transient_' . $transient, $value, $expiration, $transient );\n\n\t\t/**\n\t\t * Fires after the value for a transient has been set.\n\t\t *\n\t\t * @since 3.0.0\n\t\t * @since 3.6.0 The `$value` and `$expiration` parameters were added.\n\t\t *\n\t\t * @param string $transient  The name of the transient.\n\t\t * @param mixed  $value      Transient value.\n\t\t * @param int    $expiration Time until expiration in seconds.\n\t\t */\n\t\tdo_action( 'setted_transient', $transient, $value, $expiration );\n\t}\n\treturn $result;\n}\n\n/**\n * Saves and restores user interface settings stored in a cookie.\n *\n * Checks if the current user-settings cookie is updated and stores it. When no\n * cookie exists (different browser used), adds the last saved cookie restoring\n * the settings.\n *\n * @since 2.7.0\n */\nfunction wp_user_settings() {\n\n\tif ( ! is_admin() || defined( 'DOING_AJAX' ) ) {\n\t\treturn;\n\t}\n\n\tif ( ! $user_id = get_current_user_id() ) {\n\t\treturn;\n\t}\n\n\tif ( is_super_admin() && ! is_user_member_of_blog() ) {\n\t\treturn;\n\t}\n\n\t$settings = (string) get_user_option( 'user-settings', $user_id );\n\n\tif ( isset( $_COOKIE['wp-settings-' . $user_id] ) ) {\n\t\t$cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-' . $user_id] );\n\n\t\t// No change or both empty\n\t\tif ( $cookie == $settings )\n\t\t\treturn;\n\n\t\t$last_saved = (int) get_user_option( 'user-settings-time', $user_id );\n\t\t$current = isset( $_COOKIE['wp-settings-time-' . $user_id]) ? preg_replace( '/[^0-9]/', '', $_COOKIE['wp-settings-time-' . $user_id] ) : 0;\n\n\t\t// The cookie is newer than the saved value. Update the user_option and leave the cookie as-is\n\t\tif ( $current > $last_saved ) {\n\t\t\tupdate_user_option( $user_id, 'user-settings', $cookie, false );\n\t\t\tupdate_user_option( $user_id, 'user-settings-time', time() - 5, false );\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// The cookie is not set in the current browser or the saved value is newer.\n\t$secure = ( 'https' === parse_url( admin_url(), PHP_URL_SCHEME ) );\n\tsetcookie( 'wp-settings-' . $user_id, $settings, time() + YEAR_IN_SECONDS, SITECOOKIEPATH, null, $secure );\n\tsetcookie( 'wp-settings-time-' . $user_id, time(), time() + YEAR_IN_SECONDS, SITECOOKIEPATH, null, $secure );\n\t$_COOKIE['wp-settings-' . $user_id] = $settings;\n}\n\n/**\n * Retrieve user interface setting value based on setting name.\n *\n * @since 2.7.0\n *\n * @param string $name    The name of the setting.\n * @param string $default Optional default value to return when $name is not set.\n * @return mixed the last saved user setting or the default value/false if it doesn't exist.\n */\nfunction get_user_setting( $name, $default = false ) {\n\t$all_user_settings = get_all_user_settings();\n\n\treturn isset( $all_user_settings[$name] ) ? $all_user_settings[$name] : $default;\n}\n\n/**\n * Add or update user interface setting.\n *\n * Both $name and $value can contain only ASCII letters, numbers and underscores.\n * This function has to be used before any output has started as it calls setcookie().\n *\n * @since 2.8.0\n *\n * @param string $name  The name of the setting.\n * @param string $value The value for the setting.\n * @return bool|void true if set successfully/false if not.\n */\nfunction set_user_setting( $name, $value ) {\n\tif ( headers_sent() ) {\n\t\treturn false;\n\t}\n\n\t$all_user_settings = get_all_user_settings();\n\t$all_user_settings[$name] = $value;\n\n\treturn wp_set_all_user_settings( $all_user_settings );\n}\n\n/**\n * Delete user interface settings.\n *\n * Deleting settings would reset them to the defaults.\n * This function has to be used before any output has started as it calls setcookie().\n *\n * @since 2.7.0\n *\n * @param string $names The name or array of names of the setting to be deleted.\n * @return bool|void true if deleted successfully/false if not.\n */\nfunction delete_user_setting( $names ) {\n\tif ( headers_sent() ) {\n\t\treturn false;\n\t}\n\n\t$all_user_settings = get_all_user_settings();\n\t$names = (array) $names;\n\t$deleted = false;\n\n\tforeach ( $names as $name ) {\n\t\tif ( isset( $all_user_settings[$name] ) ) {\n\t\t\tunset( $all_user_settings[$name] );\n\t\t\t$deleted = true;\n\t\t}\n\t}\n\n\tif ( $deleted ) {\n\t\treturn wp_set_all_user_settings( $all_user_settings );\n\t}\n\n\treturn false;\n}\n\n/**\n * Retrieve all user interface settings.\n *\n * @since 2.7.0\n *\n * @global array $_updated_user_settings\n *\n * @return array the last saved user settings or empty array.\n */\nfunction get_all_user_settings() {\n\tglobal $_updated_user_settings;\n\n\tif ( ! $user_id = get_current_user_id() ) {\n\t\treturn array();\n\t}\n\n\tif ( isset( $_updated_user_settings ) && is_array( $_updated_user_settings ) ) {\n\t\treturn $_updated_user_settings;\n\t}\n\n\t$user_settings = array();\n\n\tif ( isset( $_COOKIE['wp-settings-' . $user_id] ) ) {\n\t\t$cookie = preg_replace( '/[^A-Za-z0-9=&_-]/', '', $_COOKIE['wp-settings-' . $user_id] );\n\n\t\tif ( strpos( $cookie, '=' ) ) { // '=' cannot be 1st char\n\t\t\tparse_str( $cookie, $user_settings );\n\t\t}\n\t} else {\n\t\t$option = get_user_option( 'user-settings', $user_id );\n\n\t\tif ( $option && is_string( $option ) ) {\n\t\t\tparse_str( $option, $user_settings );\n\t\t}\n\t}\n\n\t$_updated_user_settings = $user_settings;\n\treturn $user_settings;\n}\n\n/**\n * Private. Set all user interface settings.\n *\n * @since 2.8.0\n *\n * @global array $_updated_user_settings\n *\n * @param array $user_settings\n * @return bool|void\n */\nfunction wp_set_all_user_settings( $user_settings ) {\n\tglobal $_updated_user_settings;\n\n\tif ( ! $user_id = get_current_user_id() ) {\n\t\treturn false;\n\t}\n\n\tif ( is_super_admin() && ! is_user_member_of_blog() ) {\n\t\treturn;\n\t}\n\n\t$settings = '';\n\tforeach ( $user_settings as $name => $value ) {\n\t\t$_name = preg_replace( '/[^A-Za-z0-9_-]+/', '', $name );\n\t\t$_value = preg_replace( '/[^A-Za-z0-9_-]+/', '', $value );\n\n\t\tif ( ! empty( $_name ) ) {\n\t\t\t$settings .= $_name . '=' . $_value . '&';\n\t\t}\n\t}\n\n\t$settings = rtrim( $settings, '&' );\n\tparse_str( $settings, $_updated_user_settings );\n\n\tupdate_user_option( $user_id, 'user-settings', $settings, false );\n\tupdate_user_option( $user_id, 'user-settings-time', time(), false );\n\n\treturn true;\n}\n\n/**\n * Delete the user settings of the current user.\n *\n * @since 2.7.0\n */\nfunction delete_all_user_settings() {\n\tif ( ! $user_id = get_current_user_id() ) {\n\t\treturn;\n\t}\n\n\tupdate_user_option( $user_id, 'user-settings', '', false );\n\tsetcookie( 'wp-settings-' . $user_id, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH );\n}\n\n/**\n * Retrieve an option value for the current network based on name of option.\n *\n * @since 2.8.0\n * @since 4.4.0 The `$use_cache` parameter was deprecated.\n * @since 4.4.0 Modified into wrapper for get_network_option()\n *\n * @see get_network_option()\n *\n * @param string $option     Name of option to retrieve. Expected to not be SQL-escaped.\n * @param mixed  $default    Optional value to return if option doesn't exist. Default false.\n * @param bool   $deprecated Whether to use cache. Multisite only. Always set to true.\n * @return mixed Value set for the option.\n */\nfunction get_site_option( $option, $default = false, $deprecated = true ) {\n\treturn get_network_option( null, $option, $default );\n}\n\n/**\n * Add a new option for the current network.\n *\n * Existing options will not be updated. Note that prior to 3.3 this wasn't the case.\n *\n * @since 2.8.0\n * @since 4.4.0 Modified into wrapper for add_network_option()\n *\n * @see add_network_option()\n *\n * @param string $option Name of option to add. Expected to not be SQL-escaped.\n * @param mixed  $value  Option value, can be anything. Expected to not be SQL-escaped.\n * @return bool False if the option was not added. True if the option was added.\n */\nfunction add_site_option( $option, $value ) {\n\treturn add_network_option( null, $option, $value );\n}\n\n/**\n * Removes a option by name for the current network.\n *\n * @since 2.8.0\n * @since 4.4.0 Modified into wrapper for delete_network_option()\n *\n * @see delete_network_option()\n *\n * @param string $option Name of option to remove. Expected to not be SQL-escaped.\n * @return bool True, if succeed. False, if failure.\n */\nfunction delete_site_option( $option ) {\n\treturn delete_network_option( null, $option );\n}\n\n/**\n * Update the value of an option that was already added for the current network.\n *\n * @since 2.8.0\n * @since 4.4.0 Modified into wrapper for update_network_option()\n *\n * @see update_network_option()\n *\n * @param string $option Name of option. Expected to not be SQL-escaped.\n * @param mixed  $value  Option value. Expected to not be SQL-escaped.\n * @return bool False if value was not updated. True if value was updated.\n */\nfunction update_site_option( $option, $value ) {\n\treturn update_network_option( null, $option, $value );\n}\n\n/**\n * Retrieve a network's option value based on the option name.\n *\n * @since 4.4.0\n *\n * @see get_option()\n *\n * @global wpdb   $wpdb\n * @global object $current_site\n *\n * @param int      $network_id ID of the network. Can be null to default to the current network ID.\n * @param string   $option     Name of option to retrieve. Expected to not be SQL-escaped.\n * @param mixed    $default    Optional. Value to return if the option doesn't exist. Default false.\n * @return mixed Value set for the option.\n */\nfunction get_network_option( $network_id, $option, $default = false ) {\n\tglobal $wpdb, $current_site;\n\n\tif ( $network_id && ! is_numeric( $network_id ) ) {\n\t\treturn false;\n\t}\n\n\t$network_id = (int) $network_id;\n\n\t// Fallback to the current network if a network ID is not specified.\n\tif ( ! $network_id && is_multisite() ) {\n\t\t$network_id = $current_site->id;\n\t}\n\n\t/**\n\t * Filter an existing network option before it is retrieved.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * Passing a truthy value to the filter will effectively short-circuit retrieval,\n\t * returning the passed value instead.\n\t *\n\t * @since 2.9.0 As 'pre_site_option_' . $key\n\t * @since 3.0.0\n\t * @since 4.4.0 The `$option` parameter was added\n\t *\n\t * @param mixed  $pre_option The default value to return if the option does not exist.\n\t * @param string $option     Option name.\n\t */\n\t$pre = apply_filters( 'pre_site_option_' . $option, false, $option );\n\n\tif ( false !== $pre ) {\n\t\treturn $pre;\n\t}\n\n\t// prevent non-existent options from triggering multiple queries\n\t$notoptions_key = \"$network_id:notoptions\";\n\t$notoptions = wp_cache_get( $notoptions_key, 'site-options' );\n\n\tif ( isset( $notoptions[ $option ] ) ) {\n\n\t\t/**\n\t\t * Filter a specific default network option.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t\t *\n\t\t * @since 3.4.0\n\t\t * @since 4.4.0 The `$option` parameter was added.\n\t\t *\n\t\t * @param mixed  $default The value to return if the site option does not exist\n\t\t *                        in the database.\n\t\t * @param string $option  Option name.\n\t\t */\n\t\treturn apply_filters( 'default_site_option_' . $option, $default, $option );\n\t}\n\n\tif ( ! is_multisite() ) {\n\t\t/** This filter is documented in wp-includes/option.php */\n\t\t$default = apply_filters( 'default_site_option_' . $option, $default, $option );\n\t\t$value = get_option( $option, $default );\n\t} else {\n\t\t$cache_key = \"$network_id:$option\";\n\t\t$value = wp_cache_get( $cache_key, 'site-options' );\n\n\t\tif ( ! isset( $value ) || false === $value ) {\n\t\t\t$row = $wpdb->get_row( $wpdb->prepare( \"SELECT meta_value FROM $wpdb->sitemeta WHERE meta_key = %s AND site_id = %d\", $option, $network_id ) );\n\n\t\t\t// Has to be get_row instead of get_var because of funkiness with 0, false, null values\n\t\t\tif ( is_object( $row ) ) {\n\t\t\t\t$value = $row->meta_value;\n\t\t\t\t$value = maybe_unserialize( $value );\n\t\t\t\twp_cache_set( $cache_key, $value, 'site-options' );\n\t\t\t} else {\n\t\t\t\tif ( ! is_array( $notoptions ) ) {\n\t\t\t\t\t$notoptions = array();\n\t\t\t\t}\n\t\t\t\t$notoptions[ $option ] = true;\n\t\t\t\twp_cache_set( $notoptions_key, $notoptions, 'site-options' );\n\n\t\t\t\t/** This filter is documented in wp-includes/option.php */\n\t\t\t\t$value = apply_filters( 'default_site_option_' . $option, $default, $option );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter the value of an existing network option.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * @since 2.9.0 As 'site_option_' . $key\n\t * @since 3.0.0\n\t * @since 4.4.0 The `$option` parameter was added\n\t *\n\t * @param mixed  $value  Value of network option.\n\t * @param string $option Option name.\n\t */\n\treturn apply_filters( 'site_option_' . $option, $value, $option );\n}\n\n/**\n * Add a new network option.\n *\n * Existing options will not be updated.\n *\n * @since 4.4.0\n *\n * @see add_option()\n *\n * @global wpdb   $wpdb\n * @global object $current_site\n *\n * @param int    $network_id ID of the network. Can be null to default to the current network ID.\n * @param string $option     Name of option to add. Expected to not be SQL-escaped.\n * @param mixed  $value      Option value, can be anything. Expected to not be SQL-escaped.\n * @return bool False if option was not added and true if option was added.\n */\nfunction add_network_option( $network_id, $option, $value ) {\n\tglobal $wpdb, $current_site;\n\n\tif ( $network_id && ! is_numeric( $network_id ) ) {\n\t\treturn false;\n\t}\n\n\t$network_id = (int) $network_id;\n\n\t// Fallback to the current network if a network ID is not specified.\n\tif ( ! $network_id && is_multisite() ) {\n\t\t$network_id = $current_site->id;\n\t}\n\n\twp_protect_special_option( $option );\n\n\t/**\n\t * Filter the value of a specific network option before it is added.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * @since 2.9.0 As 'pre_add_site_option_' . $key\n\t * @since 3.0.0\n\t * @since 4.4.0 The `$option` parameter was added\n\t *\n\t * @param mixed  $value  Value of network option.\n\t * @param string $option Option name.\n\t */\n\t$value = apply_filters( 'pre_add_site_option_' . $option, $value, $option );\n\n\t$notoptions_key = \"$network_id:notoptions\";\n\n\tif ( ! is_multisite() ) {\n\t\t$result = add_option( $option, $value );\n\t} else {\n\t\t$cache_key = \"$network_id:$option\";\n\n\t\t// Make sure the option doesn't already exist. We can check the 'notoptions' cache before we ask for a db query\n\t\t$notoptions = wp_cache_get( $notoptions_key, 'site-options' );\n\t\tif ( ! is_array( $notoptions ) || ! isset( $notoptions[ $option ] ) ) {\n\t\t\tif ( false !== get_network_option( $network_id, $option, false ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t$value = sanitize_option( $option, $value );\n\n\t\t$serialized_value = maybe_serialize( $value );\n\t\t$result = $wpdb->insert( $wpdb->sitemeta, array( 'site_id'    => $network_id, 'meta_key'   => $option, 'meta_value' => $serialized_value ) );\n\n\t\tif ( ! $result ) {\n\t\t\treturn false;\n\t\t}\n\n\t\twp_cache_set( $cache_key, $value, 'site-options' );\n\n\t\t// This option exists now\n\t\t$notoptions = wp_cache_get( $notoptions_key, 'site-options' ); // yes, again... we need it to be fresh\n\t\tif ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {\n\t\t\tunset( $notoptions[ $option ] );\n\t\t\twp_cache_set( $notoptions_key, $notoptions, 'site-options' );\n\t\t}\n\t}\n\n\tif ( $result ) {\n\n\t\t/**\n\t\t * Fires after a specific network option has been successfully added.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t\t *\n\t\t * @since 2.9.0 As \"add_site_option_{$key}\"\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $option Name of the network option.\n\t\t * @param mixed  $value  Value of the network option.\n\t\t */\n\t\tdo_action( 'add_site_option_' . $option, $option, $value );\n\n\t\t/**\n\t\t * Fires after a network option has been successfully added.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $option Name of the network option.\n\t\t * @param mixed  $value  Value of the network option.\n\t\t */\n\t\tdo_action( 'add_site_option', $option, $value );\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Removes a network option by name.\n *\n * @since 4.4.0\n *\n * @see delete_option()\n *\n * @global wpdb   $wpdb\n * @global object $current_site\n *\n * @param int    $network_id ID of the network. Can be null to default to the current network ID.\n * @param string $option     Name of option to remove. Expected to not be SQL-escaped.\n * @return bool True, if succeed. False, if failure.\n */\nfunction delete_network_option( $network_id, $option ) {\n\tglobal $wpdb, $current_site;\n\n\tif ( $network_id && ! is_numeric( $network_id ) ) {\n\t\treturn false;\n\t}\n\n\t$network_id = (int) $network_id;\n\n\t// Fallback to the current network if a network ID is not specified.\n\tif ( ! $network_id && is_multisite() ) {\n\t\t$network_id = $current_site->id;\n\t}\n\n\t/**\n\t * Fires immediately before a specific network option is deleted.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * @since 3.0.0\n\t * @since 4.4.0 The `$option` parameter was added\n\t *\n\t * @param string $option Option name.\n\t */\n\tdo_action( 'pre_delete_site_option_' . $option, $option );\n\n\tif ( ! is_multisite() ) {\n\t\t$result = delete_option( $option );\n\t} else {\n\t\t$row = $wpdb->get_row( $wpdb->prepare( \"SELECT meta_id FROM {$wpdb->sitemeta} WHERE meta_key = %s AND site_id = %d\", $option, $network_id ) );\n\t\tif ( is_null( $row ) || ! $row->meta_id ) {\n\t\t\treturn false;\n\t\t}\n\t\t$cache_key = \"$network_id:$option\";\n\t\twp_cache_delete( $cache_key, 'site-options' );\n\n\t\t$result = $wpdb->delete( $wpdb->sitemeta, array( 'meta_key' => $option, 'site_id' => $network_id ) );\n\t}\n\n\tif ( $result ) {\n\n\t\t/**\n\t\t * Fires after a specific network option has been deleted.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t\t *\n\t\t * @since 2.9.0 As \"delete_site_option_{$key}\"\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $option Name of the network option.\n\t\t */\n\t\tdo_action( 'delete_site_option_' . $option, $option );\n\n\t\t/**\n\t\t * Fires after a network option has been deleted.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $option Name of the network option.\n\t\t */\n\t\tdo_action( 'delete_site_option', $option );\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Update the value of a network option that was already added.\n *\n * @since 4.4.0\n *\n * @see update_option()\n *\n * @global wpdb   $wpdb\n * @global object $current_site\n *\n * @param int      $network_id ID of the network. Can be null to default to the current network ID.\n * @param string   $option     Name of option. Expected to not be SQL-escaped.\n * @param mixed    $value      Option value. Expected to not be SQL-escaped.\n * @return bool False if value was not updated and true if value was updated.\n */\nfunction update_network_option( $network_id, $option, $value ) {\n\tglobal $wpdb, $current_site;\n\n\tif ( $network_id && ! is_numeric( $network_id ) ) {\n\t\treturn false;\n\t}\n\n\t$network_id = (int) $network_id;\n\n\t// Fallback to the current network if a network ID is not specified.\n\tif ( ! $network_id && is_multisite() ) {\n\t\t$network_id = $current_site->id;\n\t}\n\n\twp_protect_special_option( $option );\n\n\t$old_value = get_network_option( $network_id, $option, false );\n\n\t/**\n\t * Filter a specific network option before its value is updated.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t *\n\t * @since 2.9.0 As 'pre_update_site_option_' . $key\n\t * @since 3.0.0\n\t * @since 4.4.0 The `$option` parameter was added\n\t *\n\t * @param mixed  $value     New value of the network option.\n\t * @param mixed  $old_value Old value of the network option.\n\t * @param string $option    Option name.\n\t */\n\t$value = apply_filters( 'pre_update_site_option_' . $option, $value, $old_value, $option );\n\n\tif ( $value === $old_value ) {\n\t\treturn false;\n\t}\n\n\tif ( false === $old_value ) {\n\t\treturn add_network_option( $network_id, $option, $value );\n\t}\n\n\t$notoptions_key = \"$network_id:notoptions\";\n\t$notoptions = wp_cache_get( $notoptions_key, 'site-options' );\n\tif ( is_array( $notoptions ) && isset( $notoptions[ $option ] ) ) {\n\t\tunset( $notoptions[ $option ] );\n\t\twp_cache_set( $notoptions_key, $notoptions, 'site-options' );\n\t}\n\n\tif ( ! is_multisite() ) {\n\t\t$result = update_option( $option, $value );\n\t} else {\n\t\t$value = sanitize_option( $option, $value );\n\n\t\t$serialized_value = maybe_serialize( $value );\n\t\t$result = $wpdb->update( $wpdb->sitemeta, array( 'meta_value' => $serialized_value ), array( 'site_id' => $network_id, 'meta_key' => $option ) );\n\n\t\tif ( $result ) {\n\t\t\t$cache_key = \"$network_id:$option\";\n\t\t\twp_cache_set( $cache_key, $value, 'site-options' );\n\t\t}\n\t}\n\n\tif ( $result ) {\n\n\t\t/**\n\t\t * Fires after the value of a specific network option has been successfully updated.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$option`, refers to the option name.\n\t\t *\n\t\t * @since 2.9.0 As \"update_site_option_{$key}\"\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $option    Name of the network option.\n\t\t * @param mixed  $value     Current value of the network option.\n\t\t * @param mixed  $old_value Old value of the network option.\n\t\t */\n\t\tdo_action( 'update_site_option_' . $option, $option, $value, $old_value );\n\n\t\t/**\n\t\t * Fires after the value of a network option has been successfully updated.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $option    Name of the network option.\n\t\t * @param mixed  $value     Current value of the network option.\n\t\t * @param mixed  $old_value Old value of the network option.\n\t\t */\n\t\tdo_action( 'update_site_option', $option, $value, $old_value );\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Delete a site transient.\n *\n * @since 2.9.0\n *\n * @param string $transient Transient name. Expected to not be SQL-escaped.\n * @return bool True if successful, false otherwise\n */\nfunction delete_site_transient( $transient ) {\n\n\t/**\n\t * Fires immediately before a specific site transient is deleted.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $transient Transient name.\n\t */\n\tdo_action( 'delete_site_transient_' . $transient, $transient );\n\n\tif ( wp_using_ext_object_cache() ) {\n\t\t$result = wp_cache_delete( $transient, 'site-transient' );\n\t} else {\n\t\t$option_timeout = '_site_transient_timeout_' . $transient;\n\t\t$option = '_site_transient_' . $transient;\n\t\t$result = delete_site_option( $option );\n\t\tif ( $result )\n\t\t\tdelete_site_option( $option_timeout );\n\t}\n\tif ( $result ) {\n\n\t\t/**\n\t\t * Fires after a transient is deleted.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $transient Deleted transient name.\n\t\t */\n\t\tdo_action( 'deleted_site_transient', $transient );\n\t}\n\n\treturn $result;\n}\n\n/**\n * Get the value of a site transient.\n *\n * If the transient does not exist, does not have a value, or has expired,\n * then the return value will be false.\n *\n * @since 2.9.0\n *\n * @see get_transient()\n *\n * @param string $transient Transient name. Expected to not be SQL-escaped.\n * @return mixed Value of transient.\n */\nfunction get_site_transient( $transient ) {\n\n\t/**\n\t * Filter the value of an existing site transient.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * Passing a truthy value to the filter will effectively short-circuit retrieval,\n\t * returning the passed value instead.\n\t *\n\t * @since 2.9.0\n\t * @since 4.4.0 The `$transient` parameter was added.\n\t *\n\t * @param mixed  $pre_site_transient The default value to return if the site transient does not exist.\n\t *                                   Any value other than false will short-circuit the retrieval\n\t *                                   of the transient, and return the returned value.\n\t * @param string $transient          Transient name.\n\t */\n\t$pre = apply_filters( 'pre_site_transient_' . $transient, false, $transient );\n\n\tif ( false !== $pre )\n\t\treturn $pre;\n\n\tif ( wp_using_ext_object_cache() ) {\n\t\t$value = wp_cache_get( $transient, 'site-transient' );\n\t} else {\n\t\t// Core transients that do not have a timeout. Listed here so querying timeouts can be avoided.\n\t\t$no_timeout = array('update_core', 'update_plugins', 'update_themes');\n\t\t$transient_option = '_site_transient_' . $transient;\n\t\tif ( ! in_array( $transient, $no_timeout ) ) {\n\t\t\t$transient_timeout = '_site_transient_timeout_' . $transient;\n\t\t\t$timeout = get_site_option( $transient_timeout );\n\t\t\tif ( false !== $timeout && $timeout < time() ) {\n\t\t\t\tdelete_site_option( $transient_option  );\n\t\t\t\tdelete_site_option( $transient_timeout );\n\t\t\t\t$value = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! isset( $value ) )\n\t\t\t$value = get_site_option( $transient_option );\n\t}\n\n\t/**\n\t * Filter the value of an existing site transient.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * @since 2.9.0\n\t * @since 4.4.0 The `$transient` parameter was added.\n\t *\n\t * @param mixed  $value     Value of site transient.\n\t * @param string $transient Transient name.\n\t */\n\treturn apply_filters( 'site_transient_' . $transient, $value, $transient );\n}\n\n/**\n * Set/update the value of a site transient.\n *\n * You do not need to serialize values, if the value needs to be serialize, then\n * it will be serialized before it is set.\n *\n * @since 2.9.0\n *\n * @see set_transient()\n *\n * @param string $transient  Transient name. Expected to not be SQL-escaped. Must be\n *                           40 characters or fewer in length.\n * @param mixed  $value      Transient value. Expected to not be SQL-escaped.\n * @param int    $expiration Optional. Time until expiration in seconds. Default 0 (no expiration).\n * @return bool False if value was not set and true if value was set.\n */\nfunction set_site_transient( $transient, $value, $expiration = 0 ) {\n\n\t/**\n\t * Filter the value of a specific site transient before it is set.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * @since 3.0.0\n\t * @since 4.4.0 The `$transient` parameter was added.\n\t *\n\t * @param mixed  $value     New value of site transient.\n\t * @param string $transient Transient name.\n\t */\n\t$value = apply_filters( 'pre_set_site_transient_' . $transient, $value, $transient );\n\n\t$expiration = (int) $expiration;\n\n\t/**\n\t * Filter the expiration for a site transient before its value is set.\n\t *\n\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param int    $expiration Time until expiration in seconds. Use 0 for no expiration.\n\t * @param mixed  $value      New value of site transient.\n\t * @param string $transient  Transient name.\n\t */\n\t$expiration = apply_filters( 'expiration_of_site_transient_' . $transient, $expiration, $value, $transient );\n\n\tif ( wp_using_ext_object_cache() ) {\n\t\t$result = wp_cache_set( $transient, $value, 'site-transient', $expiration );\n\t} else {\n\t\t$transient_timeout = '_site_transient_timeout_' . $transient;\n\t\t$option = '_site_transient_' . $transient;\n\t\tif ( false === get_site_option( $option ) ) {\n\t\t\tif ( $expiration )\n\t\t\t\tadd_site_option( $transient_timeout, time() + $expiration );\n\t\t\t$result = add_site_option( $option, $value );\n\t\t} else {\n\t\t\tif ( $expiration )\n\t\t\t\tupdate_site_option( $transient_timeout, time() + $expiration );\n\t\t\t$result = update_site_option( $option, $value );\n\t\t}\n\t}\n\tif ( $result ) {\n\n\t\t/**\n\t\t * Fires after the value for a specific site transient has been set.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$transient`, refers to the transient name.\n\t\t *\n\t\t * @since 3.0.0\n\t\t * @since 4.4.0 The `$transient` parameter was added\n\t\t *\n\t\t * @param mixed  $value      Site transient value.\n\t\t * @param int    $expiration Time until expiration in seconds.\n\t\t * @param string $transient  Transient name.\n\t\t */\n\t\tdo_action( 'set_site_transient_' . $transient, $value, $expiration, $transient );\n\n\t\t/**\n\t\t * Fires after the value for a site transient has been set.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $transient  The name of the site transient.\n\t\t * @param mixed  $value      Site transient value.\n\t\t * @param int    $expiration Time until expiration in seconds.\n\t\t */\n\t\tdo_action( 'setted_site_transient', $transient, $value, $expiration );\n\t}\n\treturn $result;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/pluggable-deprecated.php",
    "content": "<?php\n/**\n * Deprecated pluggable functions from past WordPress versions. You shouldn't use these\n * functions and look for the alternatives instead. The functions will be removed in a\n * later version.\n *\n * Deprecated warnings are also thrown if one of these functions is being defined by a plugin.\n *\n * @package WordPress\n * @subpackage Deprecated\n * @see pluggable.php\n */\n\n/*\n * Deprecated functions come here to die.\n */\n\nif ( !function_exists('set_current_user') ) :\n/**\n * Changes the current user by ID or name.\n *\n * Set $id to null and specify a name if you do not know a user's ID.\n *\n * @since 2.0.1\n * @deprecated 3.0.0 Use wp_set_current_user()\n * @see wp_set_current_user()\n *\n * @param int|null $id User ID.\n * @param string $name Optional. The user's username\n * @return WP_User returns wp_set_current_user()\n */\nfunction set_current_user($id, $name = '') {\n\t_deprecated_function( __FUNCTION__, '3.0', 'wp_set_current_user()' );\n\treturn wp_set_current_user($id, $name);\n}\nendif;\n\nif ( !function_exists('get_userdatabylogin') ) :\n/**\n * Retrieve user info by login name.\n *\n * @since 0.71\n * @deprecated 3.3.0 Use get_user_by()\n * @see get_user_by()\n *\n * @param string $user_login User's username\n * @return bool|object False on failure, User DB row object\n */\nfunction get_userdatabylogin($user_login) {\n\t_deprecated_function( __FUNCTION__, '3.3', \"get_user_by('login')\" );\n\treturn get_user_by('login', $user_login);\n}\nendif;\n\nif ( !function_exists('get_user_by_email') ) :\n/**\n * Retrieve user info by email.\n *\n * @since 2.5.0\n * @deprecated 3.3.0 Use get_user_by()\n * @see get_user_by()\n *\n * @param string $email User's email address\n * @return bool|object False on failure, User DB row object\n */\nfunction get_user_by_email($email) {\n\t_deprecated_function( __FUNCTION__, '3.3', \"get_user_by('email')\" );\n\treturn get_user_by('email', $email);\n}\nendif;\n\nif ( !function_exists('wp_setcookie') ) :\n/**\n * Sets a cookie for a user who just logged in. This function is deprecated.\n *\n * @since 1.5.0\n * @deprecated 2.5.0 Use wp_set_auth_cookie()\n * @see wp_set_auth_cookie()\n *\n * @param string $username The user's username\n * @param string $password Optional. The user's password\n * @param bool $already_md5 Optional. Whether the password has already been through MD5\n * @param string $home Optional. Will be used instead of COOKIEPATH if set\n * @param string $siteurl Optional. Will be used instead of SITECOOKIEPATH if set\n * @param bool $remember Optional. Remember that the user is logged in\n */\nfunction wp_setcookie($username, $password = '', $already_md5 = false, $home = '', $siteurl = '', $remember = false) {\n\t_deprecated_function( __FUNCTION__, '2.5', 'wp_set_auth_cookie()' );\n\t$user = get_user_by('login', $username);\n\twp_set_auth_cookie($user->ID, $remember);\n}\nelse :\n\t_deprecated_function( 'wp_setcookie', '2.5', 'wp_set_auth_cookie()' );\nendif;\n\nif ( !function_exists('wp_clearcookie') ) :\n/**\n * Clears the authentication cookie, logging the user out. This function is deprecated.\n *\n * @since 1.5.0\n * @deprecated 2.5.0 Use wp_clear_auth_cookie()\n * @see wp_clear_auth_cookie()\n */\nfunction wp_clearcookie() {\n\t_deprecated_function( __FUNCTION__, '2.5', 'wp_clear_auth_cookie()' );\n\twp_clear_auth_cookie();\n}\nelse :\n\t_deprecated_function( 'wp_clearcookie', '2.5', 'wp_clear_auth_cookie()' );\nendif;\n\nif ( !function_exists('wp_get_cookie_login') ):\n/**\n * Gets the user cookie login. This function is deprecated.\n *\n * This function is deprecated and should no longer be extended as it won't be\n * used anywhere in WordPress. Also, plugins shouldn't use it either.\n *\n * @since 2.0.3\n * @deprecated 2.5.0\n *\n * @return bool Always returns false\n */\nfunction wp_get_cookie_login() {\n\t_deprecated_function( __FUNCTION__, '2.5' );\n\treturn false;\n}\nelse :\n\t_deprecated_function( 'wp_get_cookie_login', '2.5' );\nendif;\n\nif ( !function_exists('wp_login') ) :\n/**\n * Checks a users login information and logs them in if it checks out. This function is deprecated.\n *\n * Use the global $error to get the reason why the login failed. If the username\n * is blank, no error will be set, so assume blank username on that case.\n *\n * Plugins extending this function should also provide the global $error and set\n * what the error is, so that those checking the global for why there was a\n * failure can utilize it later.\n *\n * @since 1.2.2\n * @deprecated 2.5.0 Use wp_signon()\n * @see wp_signon()\n *\n * @global string $error Error when false is returned\n *\n * @param string $username   User's username\n * @param string $password   User's password\n * @param string $deprecated Not used\n * @return bool False on login failure, true on successful check\n */\nfunction wp_login($username, $password, $deprecated = '') {\n\t_deprecated_function( __FUNCTION__, '2.5', 'wp_signon()' );\n\tglobal $error;\n\n\t$user = wp_authenticate($username, $password);\n\n\tif ( ! is_wp_error($user) )\n\t\treturn true;\n\n\t$error = $user->get_error_message();\n\treturn false;\n}\nelse :\n\t_deprecated_function( 'wp_login', '2.5', 'wp_signon()' );\nendif;\n\n/**\n * WordPress AtomPub API implementation.\n *\n * Originally stored in wp-app.php, and later wp-includes/class-wp-atom-server.php.\n * It is kept here in case a plugin directly referred to the class.\n *\n * @since 2.2.0\n * @deprecated 3.5.0\n *\n * @link https://wordpress.org/plugins/atom-publishing-protocol/\n */\nif ( ! class_exists( 'wp_atom_server', false ) ) {\n\tclass wp_atom_server {\n\t\tpublic function __call( $name, $arguments ) {\n\t\t\t_deprecated_function( __CLASS__ . '::' . $name, '3.5', 'the Atom Publishing Protocol plugin' );\n\t\t}\n\n\t\tpublic static function __callStatic( $name, $arguments ) {\n\t\t\t_deprecated_function( __CLASS__ . '::' . $name, '3.5', 'the Atom Publishing Protocol plugin' );\n\t\t}\n\t}\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/pluggable.php",
    "content": "<?php\n/**\n * These functions can be replaced via plugins. If plugins do not redefine these\n * functions, then these will be used instead.\n *\n * @package WordPress\n */\n\nif ( !function_exists('wp_set_current_user') ) :\n/**\n * Changes the current user by ID or name.\n *\n * Set $id to null and specify a name if you do not know a user's ID.\n *\n * Some WordPress functionality is based on the current user and not based on\n * the signed in user. Therefore, it opens the ability to edit and perform\n * actions on users who aren't signed in.\n *\n * @since 2.0.3\n * @global WP_User $current_user The current user object which holds the user data.\n *\n * @param int    $id   User ID\n * @param string $name User's username\n * @return WP_User Current user User object\n */\nfunction wp_set_current_user($id, $name = '') {\n\tglobal $current_user;\n\n\t// If `$id` matches the user who's already current, there's nothing to do.\n\tif ( isset( $current_user )\n\t\t&& ( $current_user instanceof WP_User )\n\t\t&& ( $id == $current_user->ID )\n\t\t&& ( null !== $id )\n\t) {\n\t\treturn $current_user;\n\t}\n\n\t$current_user = new WP_User( $id, $name );\n\n\tsetup_userdata( $current_user->ID );\n\n\t/**\n\t * Fires after the current user is set.\n\t *\n\t * @since 2.0.1\n\t */\n\tdo_action( 'set_current_user' );\n\n\treturn $current_user;\n}\nendif;\n\nif ( !function_exists('wp_get_current_user') ) :\n/**\n * Retrieve the current user object.\n *\n * @since 2.0.3\n *\n * @global WP_User $current_user\n *\n * @return WP_User Current user WP_User object\n */\nfunction wp_get_current_user() {\n\tglobal $current_user;\n\n\tget_currentuserinfo();\n\n\treturn $current_user;\n}\nendif;\n\nif ( !function_exists('get_currentuserinfo') ) :\n/**\n * Populate global variables with information about the currently logged in user.\n *\n * Will set the current user, if the current user is not set. The current user\n * will be set to the logged-in person. If no user is logged-in, then it will\n * set the current user to 0, which is invalid and won't have any permissions.\n *\n * @since 0.71\n *\n * @global WP_User $current_user Checks if the current user is set\n *\n * @return false|void False on XML-RPC Request and invalid auth cookie.\n */\nfunction get_currentuserinfo() {\n\tglobal $current_user;\n\n\tif ( ! empty( $current_user ) ) {\n\t\tif ( $current_user instanceof WP_User )\n\t\t\treturn;\n\n\t\t// Upgrade stdClass to WP_User\n\t\tif ( is_object( $current_user ) && isset( $current_user->ID ) ) {\n\t\t\t$cur_id = $current_user->ID;\n\t\t\t$current_user = null;\n\t\t\twp_set_current_user( $cur_id );\n\t\t\treturn;\n\t\t}\n\n\t\t// $current_user has a junk value. Force to WP_User with ID 0.\n\t\t$current_user = null;\n\t\twp_set_current_user( 0 );\n\t\treturn false;\n\t}\n\n\tif ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST ) {\n\t\twp_set_current_user( 0 );\n\t\treturn false;\n\t}\n\n\t/**\n\t * Filter the current user.\n\t *\n\t * The default filters use this to determine the current user from the\n\t * request's cookies, if available.\n\t *\n\t * Returning a value of false will effectively short-circuit setting\n\t * the current user.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param int|bool $user_id User ID if one has been determined, false otherwise.\n\t */\n\t$user_id = apply_filters( 'determine_current_user', false );\n\tif ( ! $user_id ) {\n\t\twp_set_current_user( 0 );\n\t\treturn false;\n\t}\n\n\twp_set_current_user( $user_id );\n}\nendif;\n\nif ( !function_exists('get_userdata') ) :\n/**\n * Retrieve user info by user ID.\n *\n * @since 0.71\n *\n * @param int $user_id User ID\n * @return WP_User|false WP_User object on success, false on failure.\n */\nfunction get_userdata( $user_id ) {\n\treturn get_user_by( 'id', $user_id );\n}\nendif;\n\nif ( !function_exists('get_user_by') ) :\n/**\n * Retrieve user info by a given field\n *\n * @since 2.8.0\n * @since 4.4.0 Added 'ID' as an alias of 'id' for the `$field` parameter.\n *\n * @param string     $field The field to retrieve the user with. id | ID | slug | email | login.\n * @param int|string $value A value for $field. A user ID, slug, email address, or login name.\n * @return WP_User|false WP_User object on success, false on failure.\n */\nfunction get_user_by( $field, $value ) {\n\t$userdata = WP_User::get_data_by( $field, $value );\n\n\tif ( !$userdata )\n\t\treturn false;\n\n\t$user = new WP_User;\n\t$user->init( $userdata );\n\n\treturn $user;\n}\nendif;\n\nif ( !function_exists('cache_users') ) :\n/**\n * Retrieve info for user lists to prevent multiple queries by get_userdata()\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $user_ids User ID numbers list\n */\nfunction cache_users( $user_ids ) {\n\tglobal $wpdb;\n\n\t$clean = _get_non_cached_ids( $user_ids, 'users' );\n\n\tif ( empty( $clean ) )\n\t\treturn;\n\n\t$list = implode( ',', $clean );\n\n\t$users = $wpdb->get_results( \"SELECT * FROM $wpdb->users WHERE ID IN ($list)\" );\n\n\t$ids = array();\n\tforeach ( $users as $user ) {\n\t\tupdate_user_caches( $user );\n\t\t$ids[] = $user->ID;\n\t}\n\tupdate_meta_cache( 'user', $ids );\n}\nendif;\n\nif ( !function_exists( 'wp_mail' ) ) :\n/**\n * Send mail, similar to PHP's mail\n *\n * A true return value does not automatically mean that the user received the\n * email successfully. It just only means that the method used was able to\n * process the request without any errors.\n *\n * Using the two 'wp_mail_from' and 'wp_mail_from_name' hooks allow from\n * creating a from address like 'Name <email@address.com>' when both are set. If\n * just 'wp_mail_from' is set, then just the email address will be used with no\n * name.\n *\n * The default content type is 'text/plain' which does not allow using HTML.\n * However, you can set the content type of the email by using the\n * 'wp_mail_content_type' filter.\n *\n * The default charset is based on the charset used on the blog. The charset can\n * be set using the 'wp_mail_charset' filter.\n *\n * @since 1.2.1\n *\n * @global PHPMailer $phpmailer\n *\n * @param string|array $to          Array or comma-separated list of email addresses to send message.\n * @param string       $subject     Email subject\n * @param string       $message     Message contents\n * @param string|array $headers     Optional. Additional headers.\n * @param string|array $attachments Optional. Files to attach.\n * @return bool Whether the email contents were sent successfully.\n */\nfunction wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {\n\t// Compact the input, apply the filters, and extract them back out\n\n\t/**\n\t * Filter the wp_mail() arguments.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param array $args A compacted array of wp_mail() arguments, including the \"to\" email,\n\t *                    subject, message, headers, and attachments values.\n\t */\n\t$atts = apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) );\n\n\tif ( isset( $atts['to'] ) ) {\n\t\t$to = $atts['to'];\n\t}\n\n\tif ( isset( $atts['subject'] ) ) {\n\t\t$subject = $atts['subject'];\n\t}\n\n\tif ( isset( $atts['message'] ) ) {\n\t\t$message = $atts['message'];\n\t}\n\n\tif ( isset( $atts['headers'] ) ) {\n\t\t$headers = $atts['headers'];\n\t}\n\n\tif ( isset( $atts['attachments'] ) ) {\n\t\t$attachments = $atts['attachments'];\n\t}\n\n\tif ( ! is_array( $attachments ) ) {\n\t\t$attachments = explode( \"\\n\", str_replace( \"\\r\\n\", \"\\n\", $attachments ) );\n\t}\n\tglobal $phpmailer;\n\n\t// (Re)create it, if it's gone missing\n\tif ( ! ( $phpmailer instanceof PHPMailer ) ) {\n\t\trequire_once ABSPATH . WPINC . '/class-phpmailer.php';\n\t\trequire_once ABSPATH . WPINC . '/class-smtp.php';\n\t\t$phpmailer = new PHPMailer( true );\n\t}\n\n\t// Headers\n\tif ( empty( $headers ) ) {\n\t\t$headers = array();\n\t} else {\n\t\tif ( !is_array( $headers ) ) {\n\t\t\t// Explode the headers out, so this function can take both\n\t\t\t// string headers and an array of headers.\n\t\t\t$tempheaders = explode( \"\\n\", str_replace( \"\\r\\n\", \"\\n\", $headers ) );\n\t\t} else {\n\t\t\t$tempheaders = $headers;\n\t\t}\n\t\t$headers = array();\n\t\t$cc = array();\n\t\t$bcc = array();\n\n\t\t// If it's actually got contents\n\t\tif ( !empty( $tempheaders ) ) {\n\t\t\t// Iterate through the raw headers\n\t\t\tforeach ( (array) $tempheaders as $header ) {\n\t\t\t\tif ( strpos($header, ':') === false ) {\n\t\t\t\t\tif ( false !== stripos( $header, 'boundary=' ) ) {\n\t\t\t\t\t\t$parts = preg_split('/boundary=/i', trim( $header ) );\n\t\t\t\t\t\t$boundary = trim( str_replace( array( \"'\", '\"' ), '', $parts[1] ) );\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// Explode them out\n\t\t\t\tlist( $name, $content ) = explode( ':', trim( $header ), 2 );\n\n\t\t\t\t// Cleanup crew\n\t\t\t\t$name    = trim( $name    );\n\t\t\t\t$content = trim( $content );\n\n\t\t\t\tswitch ( strtolower( $name ) ) {\n\t\t\t\t\t// Mainly for legacy -- process a From: header if it's there\n\t\t\t\t\tcase 'from':\n\t\t\t\t\t\t$bracket_pos = strpos( $content, '<' );\n\t\t\t\t\t\tif ( $bracket_pos !== false ) {\n\t\t\t\t\t\t\t// Text before the bracketed email is the \"From\" name.\n\t\t\t\t\t\t\tif ( $bracket_pos > 0 ) {\n\t\t\t\t\t\t\t\t$from_name = substr( $content, 0, $bracket_pos - 1 );\n\t\t\t\t\t\t\t\t$from_name = str_replace( '\"', '', $from_name );\n\t\t\t\t\t\t\t\t$from_name = trim( $from_name );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$from_email = substr( $content, $bracket_pos + 1 );\n\t\t\t\t\t\t\t$from_email = str_replace( '>', '', $from_email );\n\t\t\t\t\t\t\t$from_email = trim( $from_email );\n\n\t\t\t\t\t\t// Avoid setting an empty $from_email.\n\t\t\t\t\t\t} elseif ( '' !== trim( $content ) ) {\n\t\t\t\t\t\t\t$from_email = trim( $content );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'content-type':\n\t\t\t\t\t\tif ( strpos( $content, ';' ) !== false ) {\n\t\t\t\t\t\t\tlist( $type, $charset_content ) = explode( ';', $content );\n\t\t\t\t\t\t\t$content_type = trim( $type );\n\t\t\t\t\t\t\tif ( false !== stripos( $charset_content, 'charset=' ) ) {\n\t\t\t\t\t\t\t\t$charset = trim( str_replace( array( 'charset=', '\"' ), '', $charset_content ) );\n\t\t\t\t\t\t\t} elseif ( false !== stripos( $charset_content, 'boundary=' ) ) {\n\t\t\t\t\t\t\t\t$boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '\"' ), '', $charset_content ) );\n\t\t\t\t\t\t\t\t$charset = '';\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Avoid setting an empty $content_type.\n\t\t\t\t\t\t} elseif ( '' !== trim( $content ) ) {\n\t\t\t\t\t\t\t$content_type = trim( $content );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cc':\n\t\t\t\t\t\t$cc = array_merge( (array) $cc, explode( ',', $content ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bcc':\n\t\t\t\t\t\t$bcc = array_merge( (array) $bcc, explode( ',', $content ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// Add it to our grand headers array\n\t\t\t\t\t\t$headers[trim( $name )] = trim( $content );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Empty out the values that may be set\n\t$phpmailer->ClearAllRecipients();\n\t$phpmailer->ClearAttachments();\n\t$phpmailer->ClearCustomHeaders();\n\t$phpmailer->ClearReplyTos();\n\n\t// From email and name\n\t// If we don't have a name from the input headers\n\tif ( !isset( $from_name ) )\n\t\t$from_name = 'WordPress';\n\n\t/* If we don't have an email from the input headers default to wordpress@$sitename\n\t * Some hosts will block outgoing mail from this address if it doesn't exist but\n\t * there's no easy alternative. Defaulting to admin_email might appear to be another\n\t * option but some hosts may refuse to relay mail from an unknown domain. See\n\t * https://core.trac.wordpress.org/ticket/5007.\n\t */\n\n\tif ( !isset( $from_email ) ) {\n\t\t// Get the site domain and get rid of www.\n\t\t$sitename = strtolower( $_SERVER['SERVER_NAME'] );\n\t\tif ( substr( $sitename, 0, 4 ) == 'www.' ) {\n\t\t\t$sitename = substr( $sitename, 4 );\n\t\t}\n\n\t\t$from_email = 'wordpress@' . $sitename;\n\t}\n\n\t/**\n\t * Filter the email address to send from.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param string $from_email Email address to send from.\n\t */\n\t$phpmailer->From = apply_filters( 'wp_mail_from', $from_email );\n\n\t/**\n\t * Filter the name to associate with the \"from\" email address.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $from_name Name associated with the \"from\" email address.\n\t */\n\t$phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name );\n\n\t// Set destination addresses\n\tif ( !is_array( $to ) )\n\t\t$to = explode( ',', $to );\n\n\tforeach ( (array) $to as $recipient ) {\n\t\ttry {\n\t\t\t// Break $recipient into name and address parts if in the format \"Foo <bar@baz.com>\"\n\t\t\t$recipient_name = '';\n\t\t\tif ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {\n\t\t\t\tif ( count( $matches ) == 3 ) {\n\t\t\t\t\t$recipient_name = $matches[1];\n\t\t\t\t\t$recipient = $matches[2];\n\t\t\t\t}\n\t\t\t}\n\t\t\t$phpmailer->AddAddress( $recipient, $recipient_name);\n\t\t} catch ( phpmailerException $e ) {\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\t// Set mail's subject and body\n\t$phpmailer->Subject = $subject;\n\t$phpmailer->Body    = $message;\n\n\t// Add any CC and BCC recipients\n\tif ( !empty( $cc ) ) {\n\t\tforeach ( (array) $cc as $recipient ) {\n\t\t\ttry {\n\t\t\t\t// Break $recipient into name and address parts if in the format \"Foo <bar@baz.com>\"\n\t\t\t\t$recipient_name = '';\n\t\t\t\tif ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {\n\t\t\t\t\tif ( count( $matches ) == 3 ) {\n\t\t\t\t\t\t$recipient_name = $matches[1];\n\t\t\t\t\t\t$recipient = $matches[2];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$phpmailer->AddCc( $recipient, $recipient_name );\n\t\t\t} catch ( phpmailerException $e ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !empty( $bcc ) ) {\n\t\tforeach ( (array) $bcc as $recipient) {\n\t\t\ttry {\n\t\t\t\t// Break $recipient into name and address parts if in the format \"Foo <bar@baz.com>\"\n\t\t\t\t$recipient_name = '';\n\t\t\t\tif ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {\n\t\t\t\t\tif ( count( $matches ) == 3 ) {\n\t\t\t\t\t\t$recipient_name = $matches[1];\n\t\t\t\t\t\t$recipient = $matches[2];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$phpmailer->AddBcc( $recipient, $recipient_name );\n\t\t\t} catch ( phpmailerException $e ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set to use PHP's mail()\n\t$phpmailer->IsMail();\n\n\t// Set Content-Type and charset\n\t// If we don't have a content-type from the input headers\n\tif ( !isset( $content_type ) )\n\t\t$content_type = 'text/plain';\n\n\t/**\n\t * Filter the wp_mail() content type.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $content_type Default wp_mail() content type.\n\t */\n\t$content_type = apply_filters( 'wp_mail_content_type', $content_type );\n\n\t$phpmailer->ContentType = $content_type;\n\n\t// Set whether it's plaintext, depending on $content_type\n\tif ( 'text/html' == $content_type )\n\t\t$phpmailer->IsHTML( true );\n\n\t// If we don't have a charset from the input headers\n\tif ( !isset( $charset ) )\n\t\t$charset = get_bloginfo( 'charset' );\n\n\t// Set the content-type and charset\n\n\t/**\n\t * Filter the default wp_mail() charset.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $charset Default email charset.\n\t */\n\t$phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset );\n\n\t// Set custom headers\n\tif ( !empty( $headers ) ) {\n\t\tforeach ( (array) $headers as $name => $content ) {\n\t\t\t$phpmailer->AddCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) );\n\t\t}\n\n\t\tif ( false !== stripos( $content_type, 'multipart' ) && ! empty($boundary) )\n\t\t\t$phpmailer->AddCustomHeader( sprintf( \"Content-Type: %s;\\n\\t boundary=\\\"%s\\\"\", $content_type, $boundary ) );\n\t}\n\n\tif ( !empty( $attachments ) ) {\n\t\tforeach ( $attachments as $attachment ) {\n\t\t\ttry {\n\t\t\t\t$phpmailer->AddAttachment($attachment);\n\t\t\t} catch ( phpmailerException $e ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Fires after PHPMailer is initialized.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param PHPMailer &$phpmailer The PHPMailer instance, passed by reference.\n\t */\n\tdo_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );\n\n\t// Send!\n\ttry {\n\t\treturn $phpmailer->Send();\n\t} catch ( phpmailerException $e ) {\n\n\t\t$mail_error_data = compact( $to, $subject, $message, $headers, $attachments );\n\n\t\t/**\n\t\t * Fires after a phpmailerException is caught.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param WP_Error $error A WP_Error object with the phpmailerException code, message, and an array\n\t\t *                        containing the mail recipient, subject, message, headers, and attachments.\n\t\t */\n \t\tdo_action( 'wp_mail_failed', new WP_Error( $e->getCode(), $e->getMessage(), $mail_error_data ) );\n\n\t\treturn false;\n\t}\n}\nendif;\n\nif ( !function_exists('wp_authenticate') ) :\n/**\n * Checks a user's login information and logs them in if it checks out.\n *\n * @since 2.5.0\n *\n * @param string $username User's username\n * @param string $password User's password\n * @return WP_User|WP_Error WP_User object if login successful, otherwise WP_Error object.\n */\nfunction wp_authenticate($username, $password) {\n\t$username = sanitize_user($username);\n\t$password = trim($password);\n\n\t/**\n\t * Filter the user to authenticate.\n\t *\n\t * If a non-null value is passed, the filter will effectively short-circuit\n\t * authentication, returning an error instead.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param null|WP_User $user     User to authenticate.\n\t * @param string       $username User login.\n\t * @param string       $password User password\n\t */\n\t$user = apply_filters( 'authenticate', null, $username, $password );\n\n\tif ( $user == null ) {\n\t\t// TODO what should the error message be? (Or would these even happen?)\n\t\t// Only needed if all authentication handlers fail to return anything.\n\t\t$user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));\n\t}\n\n\t$ignore_codes = array('empty_username', 'empty_password');\n\n\tif (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {\n\t\t/**\n\t\t * Fires after a user login has failed.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $username User login.\n\t\t */\n\t\tdo_action( 'wp_login_failed', $username );\n\t}\n\n\treturn $user;\n}\nendif;\n\nif ( !function_exists('wp_logout') ) :\n/**\n * Log the current user out.\n *\n * @since 2.5.0\n */\nfunction wp_logout() {\n\twp_destroy_current_session();\n\twp_clear_auth_cookie();\n\n\t/**\n\t * Fires after a user is logged-out.\n\t *\n\t * @since 1.5.0\n\t */\n\tdo_action( 'wp_logout' );\n}\nendif;\n\nif ( !function_exists('wp_validate_auth_cookie') ) :\n/**\n * Validates authentication cookie.\n *\n * The checks include making sure that the authentication cookie is set and\n * pulling in the contents (if $cookie is not used).\n *\n * Makes sure the cookie is not expired. Verifies the hash in cookie is what is\n * should be and compares the two.\n *\n * @since 2.5.0\n *\n * @global int $login_grace_period\n *\n * @param string $cookie Optional. If used, will validate contents instead of cookie's\n * @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in\n * @return false|int False if invalid cookie, User ID if valid.\n */\nfunction wp_validate_auth_cookie($cookie = '', $scheme = '') {\n\tif ( ! $cookie_elements = wp_parse_auth_cookie($cookie, $scheme) ) {\n\t\t/**\n\t\t * Fires if an authentication cookie is malformed.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param string $cookie Malformed auth cookie.\n\t\t * @param string $scheme Authentication scheme. Values include 'auth', 'secure_auth',\n\t\t *                       or 'logged_in'.\n\t\t */\n\t\tdo_action( 'auth_cookie_malformed', $cookie, $scheme );\n\t\treturn false;\n\t}\n\n\t$scheme = $cookie_elements['scheme'];\n\t$username = $cookie_elements['username'];\n\t$hmac = $cookie_elements['hmac'];\n\t$token = $cookie_elements['token'];\n\t$expired = $expiration = $cookie_elements['expiration'];\n\n\t// Allow a grace period for POST and AJAX requests\n\tif ( defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD'] ) {\n\t\t$expired += HOUR_IN_SECONDS;\n\t}\n\n\t// Quick check to see if an honest cookie has expired\n\tif ( $expired < time() ) {\n\t\t/**\n\t\t * Fires once an authentication cookie has expired.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array $cookie_elements An array of data for the authentication cookie.\n\t\t */\n\t\tdo_action( 'auth_cookie_expired', $cookie_elements );\n\t\treturn false;\n\t}\n\n\t$user = get_user_by('login', $username);\n\tif ( ! $user ) {\n\t\t/**\n\t\t * Fires if a bad username is entered in the user authentication process.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array $cookie_elements An array of data for the authentication cookie.\n\t\t */\n\t\tdo_action( 'auth_cookie_bad_username', $cookie_elements );\n\t\treturn false;\n\t}\n\n\t$pass_frag = substr($user->user_pass, 8, 4);\n\n\t$key = wp_hash( $username . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme );\n\n\t// If ext/hash is not present, compat.php's hash_hmac() does not support sha256.\n\t$algo = function_exists( 'hash' ) ? 'sha256' : 'sha1';\n\t$hash = hash_hmac( $algo, $username . '|' . $expiration . '|' . $token, $key );\n\n\tif ( ! hash_equals( $hash, $hmac ) ) {\n\t\t/**\n\t\t * Fires if a bad authentication cookie hash is encountered.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array $cookie_elements An array of data for the authentication cookie.\n\t\t */\n\t\tdo_action( 'auth_cookie_bad_hash', $cookie_elements );\n\t\treturn false;\n\t}\n\n\t$manager = WP_Session_Tokens::get_instance( $user->ID );\n\tif ( ! $manager->verify( $token ) ) {\n\t\tdo_action( 'auth_cookie_bad_session_token', $cookie_elements );\n\t\treturn false;\n\t}\n\n\t// AJAX/POST grace period set above\n\tif ( $expiration < time() ) {\n\t\t$GLOBALS['login_grace_period'] = 1;\n\t}\n\n\t/**\n\t * Fires once an authentication cookie has been validated.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array   $cookie_elements An array of data for the authentication cookie.\n\t * @param WP_User $user            User object.\n\t */\n\tdo_action( 'auth_cookie_valid', $cookie_elements, $user );\n\n\treturn $user->ID;\n}\nendif;\n\nif ( !function_exists('wp_generate_auth_cookie') ) :\n/**\n * Generate authentication cookie contents.\n *\n * @since 2.5.0\n *\n * @param int    $user_id    User ID\n * @param int    $expiration Cookie expiration in seconds\n * @param string $scheme     Optional. The cookie scheme to use: auth, secure_auth, or logged_in\n * @param string $token      User's session token to use for this cookie\n * @return string Authentication cookie contents. Empty string if user does not exist.\n */\nfunction wp_generate_auth_cookie( $user_id, $expiration, $scheme = 'auth', $token = '' ) {\n\t$user = get_userdata($user_id);\n\tif ( ! $user ) {\n\t\treturn '';\n\t}\n\n\tif ( ! $token ) {\n\t\t$manager = WP_Session_Tokens::get_instance( $user_id );\n\t\t$token = $manager->create( $expiration );\n\t}\n\n\t$pass_frag = substr($user->user_pass, 8, 4);\n\n\t$key = wp_hash( $user->user_login . '|' . $pass_frag . '|' . $expiration . '|' . $token, $scheme );\n\n\t// If ext/hash is not present, compat.php's hash_hmac() does not support sha256.\n\t$algo = function_exists( 'hash' ) ? 'sha256' : 'sha1';\n\t$hash = hash_hmac( $algo, $user->user_login . '|' . $expiration . '|' . $token, $key );\n\n\t$cookie = $user->user_login . '|' . $expiration . '|' . $token . '|' . $hash;\n\n\t/**\n\t * Filter the authentication cookie.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $cookie     Authentication cookie.\n\t * @param int    $user_id    User ID.\n\t * @param int    $expiration Authentication cookie expiration in seconds.\n\t * @param string $scheme     Cookie scheme used. Accepts 'auth', 'secure_auth', or 'logged_in'.\n\t * @param string $token      User's session token used.\n\t */\n\treturn apply_filters( 'auth_cookie', $cookie, $user_id, $expiration, $scheme, $token );\n}\nendif;\n\nif ( !function_exists('wp_parse_auth_cookie') ) :\n/**\n * Parse a cookie into its components\n *\n * @since 2.7.0\n *\n * @param string $cookie\n * @param string $scheme Optional. The cookie scheme to use: auth, secure_auth, or logged_in\n * @return array|false Authentication cookie components\n */\nfunction wp_parse_auth_cookie($cookie = '', $scheme = '') {\n\tif ( empty($cookie) ) {\n\t\tswitch ($scheme){\n\t\t\tcase 'auth':\n\t\t\t\t$cookie_name = AUTH_COOKIE;\n\t\t\t\tbreak;\n\t\t\tcase 'secure_auth':\n\t\t\t\t$cookie_name = SECURE_AUTH_COOKIE;\n\t\t\t\tbreak;\n\t\t\tcase \"logged_in\":\n\t\t\t\t$cookie_name = LOGGED_IN_COOKIE;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif ( is_ssl() ) {\n\t\t\t\t\t$cookie_name = SECURE_AUTH_COOKIE;\n\t\t\t\t\t$scheme = 'secure_auth';\n\t\t\t\t} else {\n\t\t\t\t\t$cookie_name = AUTH_COOKIE;\n\t\t\t\t\t$scheme = 'auth';\n\t\t\t\t}\n\t    }\n\n\t\tif ( empty($_COOKIE[$cookie_name]) )\n\t\t\treturn false;\n\t\t$cookie = $_COOKIE[$cookie_name];\n\t}\n\n\t$cookie_elements = explode('|', $cookie);\n\tif ( count( $cookie_elements ) !== 4 ) {\n\t\treturn false;\n\t}\n\n\tlist( $username, $expiration, $token, $hmac ) = $cookie_elements;\n\n\treturn compact( 'username', 'expiration', 'token', 'hmac', 'scheme' );\n}\nendif;\n\nif ( !function_exists('wp_set_auth_cookie') ) :\n/**\n * Sets the authentication cookies based on user ID.\n *\n * The $remember parameter increases the time that the cookie will be kept. The\n * default the cookie is kept without remembering is two days. When $remember is\n * set, the cookies will be kept for 14 days or two weeks.\n *\n * @since 2.5.0\n * @since 4.3.0 Added the `$token` parameter.\n *\n * @param int    $user_id  User ID\n * @param bool   $remember Whether to remember the user\n * @param mixed  $secure   Whether the admin cookies should only be sent over HTTPS.\n *                         Default is_ssl().\n * @param string $token    Optional. User's session token to use for this cookie.\n */\nfunction wp_set_auth_cookie( $user_id, $remember = false, $secure = '', $token = '' ) {\n\tif ( $remember ) {\n\t\t/**\n\t\t * Filter the duration of the authentication cookie expiration period.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param int  $length   Duration of the expiration period in seconds.\n\t\t * @param int  $user_id  User ID.\n\t\t * @param bool $remember Whether to remember the user login. Default false.\n\t\t */\n\t\t$expiration = time() + apply_filters( 'auth_cookie_expiration', 14 * DAY_IN_SECONDS, $user_id, $remember );\n\n\t\t/*\n\t\t * Ensure the browser will continue to send the cookie after the expiration time is reached.\n\t\t * Needed for the login grace period in wp_validate_auth_cookie().\n\t\t */\n\t\t$expire = $expiration + ( 12 * HOUR_IN_SECONDS );\n\t} else {\n\t\t/** This filter is documented in wp-includes/pluggable.php */\n\t\t$expiration = time() + apply_filters( 'auth_cookie_expiration', 2 * DAY_IN_SECONDS, $user_id, $remember );\n\t\t$expire = 0;\n\t}\n\n\tif ( '' === $secure ) {\n\t\t$secure = is_ssl();\n\t}\n\n\t// Frontend cookie is secure when the auth cookie is secure and the site's home URL is forced HTTPS.\n\t$secure_logged_in_cookie = $secure && 'https' === parse_url( get_option( 'home' ), PHP_URL_SCHEME );\n\n\t/**\n\t * Filter whether the connection is secure.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool $secure  Whether the connection is secure.\n\t * @param int  $user_id User ID.\n\t */\n\t$secure = apply_filters( 'secure_auth_cookie', $secure, $user_id );\n\n\t/**\n\t * Filter whether to use a secure cookie when logged-in.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool $secure_logged_in_cookie Whether to use a secure cookie when logged-in.\n\t * @param int  $user_id                 User ID.\n\t * @param bool $secure                  Whether the connection is secure.\n\t */\n\t$secure_logged_in_cookie = apply_filters( 'secure_logged_in_cookie', $secure_logged_in_cookie, $user_id, $secure );\n\n\tif ( $secure ) {\n\t\t$auth_cookie_name = SECURE_AUTH_COOKIE;\n\t\t$scheme = 'secure_auth';\n\t} else {\n\t\t$auth_cookie_name = AUTH_COOKIE;\n\t\t$scheme = 'auth';\n\t}\n\n\tif ( '' === $token ) {\n\t\t$manager = WP_Session_Tokens::get_instance( $user_id );\n\t\t$token   = $manager->create( $expiration );\n\t}\n\n\t$auth_cookie = wp_generate_auth_cookie( $user_id, $expiration, $scheme, $token );\n\t$logged_in_cookie = wp_generate_auth_cookie( $user_id, $expiration, 'logged_in', $token );\n\n\t/**\n\t * Fires immediately before the authentication cookie is set.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $auth_cookie Authentication cookie.\n\t * @param int    $expire      Login grace period in seconds. Default 43,200 seconds, or 12 hours.\n\t * @param int    $expiration  Duration in seconds the authentication cookie should be valid.\n\t *                            Default 1,209,600 seconds, or 14 days.\n\t * @param int    $user_id     User ID.\n\t * @param string $scheme      Authentication scheme. Values include 'auth', 'secure_auth', or 'logged_in'.\n\t */\n\tdo_action( 'set_auth_cookie', $auth_cookie, $expire, $expiration, $user_id, $scheme );\n\n\t/**\n\t * Fires immediately before the secure authentication cookie is set.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string $logged_in_cookie The logged-in cookie.\n\t * @param int    $expire           Login grace period in seconds. Default 43,200 seconds, or 12 hours.\n\t * @param int    $expiration       Duration in seconds the authentication cookie should be valid.\n\t *                                 Default 1,209,600 seconds, or 14 days.\n\t * @param int    $user_id          User ID.\n\t * @param string $scheme           Authentication scheme. Default 'logged_in'.\n\t */\n\tdo_action( 'set_logged_in_cookie', $logged_in_cookie, $expire, $expiration, $user_id, 'logged_in' );\n\n\tsetcookie($auth_cookie_name, $auth_cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, $secure, true);\n\tsetcookie($auth_cookie_name, $auth_cookie, $expire, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, $secure, true);\n\tsetcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);\n\tif ( COOKIEPATH != SITECOOKIEPATH )\n\t\tsetcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, SITECOOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);\n}\nendif;\n\nif ( !function_exists('wp_clear_auth_cookie') ) :\n/**\n * Removes all of the cookies associated with authentication.\n *\n * @since 2.5.0\n */\nfunction wp_clear_auth_cookie() {\n\t/**\n\t * Fires just before the authentication cookies are cleared.\n\t *\n\t * @since 2.7.0\n\t */\n\tdo_action( 'clear_auth_cookie' );\n\n\tsetcookie( AUTH_COOKIE,        ' ', time() - YEAR_IN_SECONDS, ADMIN_COOKIE_PATH,   COOKIE_DOMAIN );\n\tsetcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, ADMIN_COOKIE_PATH,   COOKIE_DOMAIN );\n\tsetcookie( AUTH_COOKIE,        ' ', time() - YEAR_IN_SECONDS, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN );\n\tsetcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN );\n\tsetcookie( LOGGED_IN_COOKIE,   ' ', time() - YEAR_IN_SECONDS, COOKIEPATH,          COOKIE_DOMAIN );\n\tsetcookie( LOGGED_IN_COOKIE,   ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH,      COOKIE_DOMAIN );\n\n\t// Old cookies\n\tsetcookie( AUTH_COOKIE,        ' ', time() - YEAR_IN_SECONDS, COOKIEPATH,     COOKIE_DOMAIN );\n\tsetcookie( AUTH_COOKIE,        ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );\n\tsetcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH,     COOKIE_DOMAIN );\n\tsetcookie( SECURE_AUTH_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );\n\n\t// Even older cookies\n\tsetcookie( USER_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH,     COOKIE_DOMAIN );\n\tsetcookie( PASS_COOKIE, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH,     COOKIE_DOMAIN );\n\tsetcookie( USER_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );\n\tsetcookie( PASS_COOKIE, ' ', time() - YEAR_IN_SECONDS, SITECOOKIEPATH, COOKIE_DOMAIN );\n}\nendif;\n\nif ( !function_exists('is_user_logged_in') ) :\n/**\n * Checks if the current visitor is a logged in user.\n *\n * @since 2.0.0\n *\n * @return bool True if user is logged in, false if not logged in.\n */\nfunction is_user_logged_in() {\n\t$user = wp_get_current_user();\n\n\treturn $user->exists();\n}\nendif;\n\nif ( !function_exists('auth_redirect') ) :\n/**\n * Checks if a user is logged in, if not it redirects them to the login page.\n *\n * @since 1.5.0\n */\nfunction auth_redirect() {\n\t// Checks if a user is logged in, if not redirects them to the login page\n\n\t$secure = ( is_ssl() || force_ssl_admin() );\n\n\t/**\n\t * Filter whether to use a secure authentication redirect.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool $secure Whether to use a secure authentication redirect. Default false.\n\t */\n\t$secure = apply_filters( 'secure_auth_redirect', $secure );\n\n\t// If https is required and request is http, redirect\n\tif ( $secure && !is_ssl() && false !== strpos($_SERVER['REQUEST_URI'], 'wp-admin') ) {\n\t\tif ( 0 === strpos( $_SERVER['REQUEST_URI'], 'http' ) ) {\n\t\t\twp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );\n\t\t\texit();\n\t\t} else {\n\t\t\twp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );\n\t\t\texit();\n\t\t}\n\t}\n\n\tif ( is_user_admin() ) {\n\t\t$scheme = 'logged_in';\n\t} else {\n\t\t/**\n\t\t * Filter the authentication redirect scheme.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param string $scheme Authentication redirect scheme. Default empty.\n\t\t */\n\t\t$scheme = apply_filters( 'auth_redirect_scheme', '' );\n\t}\n\n\tif ( $user_id = wp_validate_auth_cookie( '',  $scheme) ) {\n\t\t/**\n\t\t * Fires before the authentication redirect.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param int $user_id User ID.\n\t\t */\n\t\tdo_action( 'auth_redirect', $user_id );\n\n\t\t// If the user wants ssl but the session is not ssl, redirect.\n\t\tif ( !$secure && get_user_option('use_ssl', $user_id) && false !== strpos($_SERVER['REQUEST_URI'], 'wp-admin') ) {\n\t\t\tif ( 0 === strpos( $_SERVER['REQUEST_URI'], 'http' ) ) {\n\t\t\t\twp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );\n\t\t\t\texit();\n\t\t\t} else {\n\t\t\t\twp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );\n\t\t\t\texit();\n\t\t\t}\n\t\t}\n\n\t\treturn;  // The cookie is good so we're done\n\t}\n\n\t// The cookie is no good so force login\n\tnocache_headers();\n\n\t$redirect = ( strpos( $_SERVER['REQUEST_URI'], '/options.php' ) && wp_get_referer() ) ? wp_get_referer() : set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );\n\n\t$login_url = wp_login_url($redirect, true);\n\n\twp_redirect($login_url);\n\texit();\n}\nendif;\n\nif ( !function_exists('check_admin_referer') ) :\n/**\n * Makes sure that a user was referred from another admin page.\n *\n * To avoid security exploits.\n *\n * @since 1.2.0\n *\n * @param int|string $action    Action nonce.\n * @param string     $query_arg Optional. Key to check for nonce in `$_REQUEST` (since 2.5).\n *                              Default '_wpnonce'.\n * @return false|int False if the nonce is invalid, 1 if the nonce is valid and generated between\n *                   0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago.\n */\nfunction check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {\n\tif ( -1 == $action )\n\t\t_doing_it_wrong( __FUNCTION__, __( 'You should specify a nonce action to be verified by using the first parameter.' ), '3.2' );\n\n\t$adminurl = strtolower(admin_url());\n\t$referer = strtolower(wp_get_referer());\n\t$result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false;\n\n\t/**\n\t * Fires once the admin request has been validated or not.\n\t *\n\t * @since 1.5.1\n\t *\n\t * @param string    $action The nonce action.\n\t * @param false|int $result False if the nonce is invalid, 1 if the nonce is valid and generated between\n\t *                          0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago.\n\t */\n\tdo_action( 'check_admin_referer', $action, $result );\n\n\tif ( ! $result && ! ( -1 == $action && strpos( $referer, $adminurl ) === 0 ) ) {\n\t\twp_nonce_ays( $action );\n\t\tdie();\n\t}\n\n\treturn $result;\n}\nendif;\n\nif ( !function_exists('check_ajax_referer') ) :\n/**\n * Verifies the AJAX request to prevent processing requests external of the blog.\n *\n * @since 2.0.3\n *\n * @param int|string   $action    Action nonce.\n * @param false|string $query_arg Optional. Key to check for the nonce in `$_REQUEST` (since 2.5). If false,\n *                                `$_REQUEST` values will be evaluated for '_ajax_nonce', and '_wpnonce'\n *                                (in that order). Default false.\n * @param bool         $die       Optional. Whether to die early when the nonce cannot be verified.\n *                                Default true.\n * @return false|int False if the nonce is invalid, 1 if the nonce is valid and generated between\n *                   0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago.\n */\nfunction check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {\n\t$nonce = '';\n\n\tif ( $query_arg && isset( $_REQUEST[ $query_arg ] ) )\n\t\t$nonce = $_REQUEST[ $query_arg ];\n\telseif ( isset( $_REQUEST['_ajax_nonce'] ) )\n\t\t$nonce = $_REQUEST['_ajax_nonce'];\n\telseif ( isset( $_REQUEST['_wpnonce'] ) )\n\t\t$nonce = $_REQUEST['_wpnonce'];\n\n\t$result = wp_verify_nonce( $nonce, $action );\n\n\t/**\n\t * Fires once the AJAX request has been validated or not.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string    $action The AJAX nonce action.\n\t * @param false|int $result False if the nonce is invalid, 1 if the nonce is valid and generated between\n\t *                          0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago.\n\t */\n\tdo_action( 'check_ajax_referer', $action, $result );\n\n\tif ( $die && false === $result ) {\n\t\tif ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {\n\t\t\twp_die( -1 );\n\t\t} else {\n\t\t\tdie( '-1' );\n\t\t}\n\t}\n\n\treturn $result;\n}\nendif;\n\nif ( !function_exists('wp_redirect') ) :\n/**\n * Redirects to another page.\n *\n * @since 1.5.1\n *\n * @global bool $is_IIS\n *\n * @param string $location The path to redirect to.\n * @param int    $status   Status code to use.\n * @return bool False if $location is not provided, true otherwise.\n */\nfunction wp_redirect($location, $status = 302) {\n\tglobal $is_IIS;\n\n\t/**\n\t * Filter the redirect location.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $location The path to redirect to.\n\t * @param int    $status   Status code to use.\n\t */\n\t$location = apply_filters( 'wp_redirect', $location, $status );\n\n\t/**\n\t * Filter the redirect status code.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int    $status   Status code to use.\n\t * @param string $location The path to redirect to.\n\t */\n\t$status = apply_filters( 'wp_redirect_status', $status, $location );\n\n\tif ( ! $location )\n\t\treturn false;\n\n\t$location = wp_sanitize_redirect($location);\n\n\tif ( !$is_IIS && PHP_SAPI != 'cgi-fcgi' )\n\t\tstatus_header($status); // This causes problems on IIS and some FastCGI setups\n\n\theader(\"Location: $location\", true, $status);\n\n\treturn true;\n}\nendif;\n\nif ( !function_exists('wp_sanitize_redirect') ) :\n/**\n * Sanitizes a URL for use in a redirect.\n *\n * @since 2.3.0\n *\n * @return string redirect-sanitized URL\n **/\nfunction wp_sanitize_redirect($location) {\n\t$regex = '/\n\t\t(\n\t\t\t(?: [\\xC2-\\xDF][\\x80-\\xBF]        # double-byte sequences   110xxxxx 10xxxxxx\n\t\t\t|   \\xE0[\\xA0-\\xBF][\\x80-\\xBF]    # triple-byte sequences   1110xxxx 10xxxxxx * 2\n\t\t\t|   [\\xE1-\\xEC][\\x80-\\xBF]{2}\n\t\t\t|   \\xED[\\x80-\\x9F][\\x80-\\xBF]\n\t\t\t|   [\\xEE-\\xEF][\\x80-\\xBF]{2}\n\t\t\t|   \\xF0[\\x90-\\xBF][\\x80-\\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3\n\t\t\t|   [\\xF1-\\xF3][\\x80-\\xBF]{3}\n\t\t\t|   \\xF4[\\x80-\\x8F][\\x80-\\xBF]{2}\n\t\t){1,40}                              # ...one or more times\n\t\t)/x';\n\t$location = preg_replace_callback( $regex, '_wp_sanitize_utf8_in_redirect', $location );\n\t$location = preg_replace('|[^a-z0-9-~+_.?#=&;,/:%!*\\[\\]()@]|i', '', $location);\n\t$location = wp_kses_no_null($location);\n\n\t// remove %0d and %0a from location\n\t$strip = array('%0d', '%0a', '%0D', '%0A');\n\treturn _deep_replace( $strip, $location );\n}\n\n/**\n * URL encode UTF-8 characters in a URL.\n *\n * @ignore\n * @since 4.2.0\n * @access private\n *\n * @see wp_sanitize_redirect()\n */\nfunction _wp_sanitize_utf8_in_redirect( $matches ) {\n\treturn urlencode( $matches[0] );\n}\nendif;\n\nif ( !function_exists('wp_safe_redirect') ) :\n/**\n * Performs a safe (local) redirect, using wp_redirect().\n *\n * Checks whether the $location is using an allowed host, if it has an absolute\n * path. A plugin can therefore set or remove allowed host(s) to or from the\n * list.\n *\n * If the host is not allowed, then the redirect defaults to wp-admin on the siteurl\n * instead. This prevents malicious redirects which redirect to another host,\n * but only used in a few places.\n *\n * @since 2.3.0\n */\nfunction wp_safe_redirect($location, $status = 302) {\n\n\t// Need to look at the URL the way it will end up in wp_redirect()\n\t$location = wp_sanitize_redirect($location);\n\n\t/**\n\t * Filter the redirect fallback URL for when the provided redirect is not safe (local).\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param string $fallback_url The fallback URL to use by default.\n\t * @param int    $status       The redirect status.\n\t */\n\t$location = wp_validate_redirect( $location, apply_filters( 'wp_safe_redirect_fallback', admin_url(), $status ) );\n\n\twp_redirect($location, $status);\n}\nendif;\n\nif ( !function_exists('wp_validate_redirect') ) :\n/**\n * Validates a URL for use in a redirect.\n *\n * Checks whether the $location is using an allowed host, if it has an absolute\n * path. A plugin can therefore set or remove allowed host(s) to or from the\n * list.\n *\n * If the host is not allowed, then the redirect is to $default supplied\n *\n * @since 2.8.1\n *\n * @param string $location The redirect to validate\n * @param string $default  The value to return if $location is not allowed\n * @return string redirect-sanitized URL\n **/\nfunction wp_validate_redirect($location, $default = '') {\n\t$location = trim( $location );\n\t// browsers will assume 'http' is your protocol, and will obey a redirect to a URL starting with '//'\n\tif ( substr($location, 0, 2) == '//' )\n\t\t$location = 'http:' . $location;\n\n\t// In php 5 parse_url may fail if the URL query part contains http://, bug #38143\n\t$test = ( $cut = strpos($location, '?') ) ? substr( $location, 0, $cut ) : $location;\n\n\t// @-operator is used to prevent possible warnings in PHP < 5.3.3.\n\t$lp = @parse_url($test);\n\n\t// Give up if malformed URL\n\tif ( false === $lp )\n\t\treturn $default;\n\n\t// Allow only http and https schemes. No data:, etc.\n\tif ( isset($lp['scheme']) && !('http' == $lp['scheme'] || 'https' == $lp['scheme']) )\n\t\treturn $default;\n\n\t// Reject if certain components are set but host is not. This catches urls like https:host.com for which parse_url does not set the host field.\n\tif ( ! isset( $lp['host'] ) && ( isset( $lp['scheme'] ) || isset( $lp['user'] ) || isset( $lp['pass'] ) || isset( $lp['port'] ) ) ) {\n\t\treturn $default;\n\t}\n\n\t// Reject malformed components parse_url() can return on odd inputs\n\tforeach ( array( 'user', 'pass', 'host' ) as $component ) {\n\t\tif ( isset( $lp[ $component ] ) && strpbrk( $lp[ $component ], ':/?#@' ) ) {\n\t\t\treturn $default;\n\t\t}\n\t}\n\n\t$wpp = parse_url(home_url());\n\n\t/**\n\t * Filter the whitelist of hosts to redirect to.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param array       $hosts An array of allowed hosts.\n\t * @param bool|string $host  The parsed host; empty if not isset.\n\t */\n\t$allowed_hosts = (array) apply_filters( 'allowed_redirect_hosts', array($wpp['host']), isset($lp['host']) ? $lp['host'] : '' );\n\n\tif ( isset($lp['host']) && ( !in_array($lp['host'], $allowed_hosts) && $lp['host'] != strtolower($wpp['host'])) )\n\t\t$location = $default;\n\n\treturn $location;\n}\nendif;\n\nif ( ! function_exists('wp_notify_postauthor') ) :\n/**\n * Notify an author (and/or others) of a comment/trackback/pingback on a post.\n *\n * @since 1.0.0\n *\n * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.\n * @param string          $deprecated Not used\n * @return bool True on completion. False if no email addresses were specified.\n */\nfunction wp_notify_postauthor( $comment_id, $deprecated = null ) {\n\tif ( null !== $deprecated ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.8' );\n\t}\n\n\t$comment = get_comment( $comment_id );\n\tif ( empty( $comment ) || empty( $comment->comment_post_ID ) )\n\t\treturn false;\n\n\t$post    = get_post( $comment->comment_post_ID );\n\t$author  = get_userdata( $post->post_author );\n\n\t// Who to notify? By default, just the post author, but others can be added.\n\t$emails = array();\n\tif ( $author ) {\n\t\t$emails[] = $author->user_email;\n\t}\n\n\t/**\n\t * Filter the list of email addresses to receive a comment notification.\n\t *\n\t * By default, only post authors are notified of comments. This filter allows\n\t * others to be added.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param array $emails     An array of email addresses to receive a comment notification.\n\t * @param int   $comment_id The comment ID.\n\t */\n\t$emails = apply_filters( 'comment_notification_recipients', $emails, $comment->comment_ID );\n\t$emails = array_filter( $emails );\n\n\t// If there are no addresses to send the comment to, bail.\n\tif ( ! count( $emails ) ) {\n\t\treturn false;\n\t}\n\n\t// Facilitate unsetting below without knowing the keys.\n\t$emails = array_flip( $emails );\n\n\t/**\n\t * Filter whether to notify comment authors of their comments on their own posts.\n\t *\n\t * By default, comment authors aren't notified of their comments on their own\n\t * posts. This filter allows you to override that.\n\t *\n\t * @since 3.8.0\n\t *\n\t * @param bool $notify     Whether to notify the post author of their own comment.\n\t *                         Default false.\n\t * @param int  $comment_id The comment ID.\n\t */\n\t$notify_author = apply_filters( 'comment_notification_notify_author', false, $comment->comment_ID );\n\n\t// The comment was left by the author\n\tif ( $author && ! $notify_author && $comment->user_id == $post->post_author ) {\n\t\tunset( $emails[ $author->user_email ] );\n\t}\n\n\t// The author moderated a comment on their own post\n\tif ( $author && ! $notify_author && $post->post_author == get_current_user_id() ) {\n\t\tunset( $emails[ $author->user_email ] );\n\t}\n\n\t// The post author is no longer a member of the blog\n\tif ( $author && ! $notify_author && ! user_can( $post->post_author, 'read_post', $post->ID ) ) {\n\t\tunset( $emails[ $author->user_email ] );\n\t}\n\n\t// If there's no email to send the comment to, bail, otherwise flip array back around for use below\n\tif ( ! count( $emails ) ) {\n\t\treturn false;\n\t} else {\n\t\t$emails = array_flip( $emails );\n\t}\n\n\t$comment_author_domain = @gethostbyaddr($comment->comment_author_IP);\n\n\t// The blogname option is escaped with esc_html on the way into the database in sanitize_option\n\t// we want to reverse this for the plain text arena of emails.\n\t$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);\n\t$comment_content = wp_specialchars_decode( $comment->comment_content );\n\n\tswitch ( $comment->comment_type ) {\n\t\tcase 'trackback':\n\t\t\t$notify_message  = sprintf( __( 'New trackback on your post \"%s\"' ), $post->post_title ) . \"\\r\\n\";\n\t\t\t/* translators: 1: website name, 2: website IP, 3: website hostname */\n\t\t\t$notify_message .= sprintf( __('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'Comment: %s' ), \"\\r\\n\" . $comment_content ) . \"\\r\\n\\r\\n\";\n\t\t\t$notify_message .= __( 'You can see all trackbacks on this post here:' ) . \"\\r\\n\";\n\t\t\t/* translators: 1: blog name, 2: post title */\n\t\t\t$subject = sprintf( __('[%1$s] Trackback: \"%2$s\"'), $blogname, $post->post_title );\n\t\t\tbreak;\n\t\tcase 'pingback':\n\t\t\t$notify_message  = sprintf( __( 'New pingback on your post \"%s\"' ), $post->post_title ) . \"\\r\\n\";\n\t\t\t/* translators: 1: website name, 2: website IP, 3: website hostname */\n\t\t\t$notify_message .= sprintf( __('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'Comment: %s' ), \"\\r\\n\" . $comment_content ) . \"\\r\\n\\r\\n\";\n\t\t\t$notify_message .= __( 'You can see all pingbacks on this post here:' ) . \"\\r\\n\";\n\t\t\t/* translators: 1: blog name, 2: post title */\n\t\t\t$subject = sprintf( __('[%1$s] Pingback: \"%2$s\"'), $blogname, $post->post_title );\n\t\t\tbreak;\n\t\tdefault: // Comments\n\t\t\t$notify_message  = sprintf( __( 'New comment on your post \"%s\"' ), $post->post_title ) . \"\\r\\n\";\n\t\t\t/* translators: 1: comment author, 2: author IP, 3: author domain */\n\t\t\t$notify_message .= sprintf( __( 'Author: %1$s (IP: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'Email: %s' ), $comment->comment_author_email ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __('Comment: %s' ), \"\\r\\n\" . $comment_content ) . \"\\r\\n\\r\\n\";\n\t\t\t$notify_message .= __( 'You can see all comments on this post here:' ) . \"\\r\\n\";\n\t\t\t/* translators: 1: blog name, 2: post title */\n\t\t\t$subject = sprintf( __('[%1$s] Comment: \"%2$s\"'), $blogname, $post->post_title );\n\t\t\tbreak;\n\t}\n\t$notify_message .= get_permalink($comment->comment_post_ID) . \"#comments\\r\\n\\r\\n\";\n\t$notify_message .= sprintf( __('Permalink: %s'), get_comment_link( $comment ) ) . \"\\r\\n\";\n\n\tif ( user_can( $post->post_author, 'edit_comment', $comment->comment_ID ) ) {\n\t\tif ( EMPTY_TRASH_DAYS ) {\n\t\t\t$notify_message .= sprintf( __('Trash it: %s'), admin_url(\"comment.php?action=trash&c={$comment->comment_ID}\") ) . \"\\r\\n\";\n\t\t} else {\n\t\t\t$notify_message .= sprintf( __('Delete it: %s'), admin_url(\"comment.php?action=delete&c={$comment->comment_ID}\") ) . \"\\r\\n\";\n\t\t}\n\t\t$notify_message .= sprintf( __('Spam it: %s'), admin_url(\"comment.php?action=spam&c={$comment->comment_ID}\") ) . \"\\r\\n\";\n\t}\n\n\t$wp_email = 'wordpress@' . preg_replace('#^www\\.#', '', strtolower($_SERVER['SERVER_NAME']));\n\n\tif ( '' == $comment->comment_author ) {\n\t\t$from = \"From: \\\"$blogname\\\" <$wp_email>\";\n\t\tif ( '' != $comment->comment_author_email )\n\t\t\t$reply_to = \"Reply-To: $comment->comment_author_email\";\n\t} else {\n\t\t$from = \"From: \\\"$comment->comment_author\\\" <$wp_email>\";\n\t\tif ( '' != $comment->comment_author_email )\n\t\t\t$reply_to = \"Reply-To: \\\"$comment->comment_author_email\\\" <$comment->comment_author_email>\";\n\t}\n\n\t$message_headers = \"$from\\n\"\n\t\t. \"Content-Type: text/plain; charset=\\\"\" . get_option('blog_charset') . \"\\\"\\n\";\n\n\tif ( isset($reply_to) )\n\t\t$message_headers .= $reply_to . \"\\n\";\n\n\t/**\n\t * Filter the comment notification email text.\n\t *\n\t * @since 1.5.2\n\t *\n\t * @param string $notify_message The comment notification email text.\n\t * @param int    $comment_id     Comment ID.\n\t */\n\t$notify_message = apply_filters( 'comment_notification_text', $notify_message, $comment->comment_ID );\n\n\t/**\n\t * Filter the comment notification email subject.\n\t *\n\t * @since 1.5.2\n\t *\n\t * @param string $subject    The comment notification email subject.\n\t * @param int    $comment_id Comment ID.\n\t */\n\t$subject = apply_filters( 'comment_notification_subject', $subject, $comment->comment_ID );\n\n\t/**\n\t * Filter the comment notification email headers.\n\t *\n\t * @since 1.5.2\n\t *\n\t * @param string $message_headers Headers for the comment notification email.\n\t * @param int    $comment_id      Comment ID.\n\t */\n\t$message_headers = apply_filters( 'comment_notification_headers', $message_headers, $comment->comment_ID );\n\n\tforeach ( $emails as $email ) {\n\t\t@wp_mail( $email, wp_specialchars_decode( $subject ), $notify_message, $message_headers );\n\t}\n\n\treturn true;\n}\nendif;\n\nif ( !function_exists('wp_notify_moderator') ) :\n/**\n * Notifies the moderator of the site about a new comment that is awaiting approval.\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * Uses the {@see 'notify_moderator'} filter to determine whether the site moderator\n * should be notified, overriding the site setting.\n *\n * @param int $comment_id Comment ID.\n * @return true Always returns true.\n */\nfunction wp_notify_moderator($comment_id) {\n\tglobal $wpdb;\n\n\t$maybe_notify = get_option( 'moderation_notify' );\n\n\t/**\n\t * Filter whether to send the site moderator email notifications, overriding the site setting.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param bool $maybe_notify Whether to notify blog moderator.\n\t * @param int  $comment_ID   The id of the comment for the notification.\n\t */\n\t$maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_id );\n\n\tif ( ! $maybe_notify ) {\n\t\treturn true;\n\t}\n\n\t$comment = get_comment($comment_id);\n\t$post = get_post($comment->comment_post_ID);\n\t$user = get_userdata( $post->post_author );\n\t// Send to the administration and to the post author if the author can modify the comment.\n\t$emails = array( get_option( 'admin_email' ) );\n\tif ( $user && user_can( $user->ID, 'edit_comment', $comment_id ) && ! empty( $user->user_email ) ) {\n\t\tif ( 0 !== strcasecmp( $user->user_email, get_option( 'admin_email' ) ) )\n\t\t\t$emails[] = $user->user_email;\n\t}\n\n\t$comment_author_domain = @gethostbyaddr($comment->comment_author_IP);\n\t$comments_waiting = $wpdb->get_var(\"SELECT count(comment_ID) FROM $wpdb->comments WHERE comment_approved = '0'\");\n\n\t// The blogname option is escaped with esc_html on the way into the database in sanitize_option\n\t// we want to reverse this for the plain text arena of emails.\n\t$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);\n\t$comment_content = wp_specialchars_decode( $comment->comment_content );\n\n\tswitch ( $comment->comment_type ) {\n\t\tcase 'trackback':\n\t\t\t$notify_message  = sprintf( __('A new trackback on the post \"%s\" is waiting for your approval'), $post->post_title ) . \"\\r\\n\";\n\t\t\t$notify_message .= get_permalink($comment->comment_post_ID) . \"\\r\\n\\r\\n\";\n\t\t\t/* translators: 1: website name, 2: website IP, 3: website hostname */\n\t\t\t$notify_message .= sprintf( __( 'Website: %1$s (IP: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . \"\\r\\n\";\n\t\t\t$notify_message .= __('Trackback excerpt: ') . \"\\r\\n\" . $comment_content . \"\\r\\n\\r\\n\";\n\t\t\tbreak;\n\t\tcase 'pingback':\n\t\t\t$notify_message  = sprintf( __('A new pingback on the post \"%s\" is waiting for your approval'), $post->post_title ) . \"\\r\\n\";\n\t\t\t$notify_message .= get_permalink($comment->comment_post_ID) . \"\\r\\n\\r\\n\";\n\t\t\t/* translators: 1: website name, 2: website IP, 3: website hostname */\n\t\t\t$notify_message .= sprintf( __( 'Website: %1$s (IP: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . \"\\r\\n\";\n\t\t\t$notify_message .= __('Pingback excerpt: ') . \"\\r\\n\" . $comment_content . \"\\r\\n\\r\\n\";\n\t\t\tbreak;\n\t\tdefault: // Comments\n\t\t\t$notify_message  = sprintf( __('A new comment on the post \"%s\" is waiting for your approval'), $post->post_title ) . \"\\r\\n\";\n\t\t\t$notify_message .= get_permalink($comment->comment_post_ID) . \"\\r\\n\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'Author: %1$s (IP: %2$s, %3$s)' ), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'Email: %s' ), $comment->comment_author_email ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'URL: %s' ), $comment->comment_author_url ) . \"\\r\\n\";\n\t\t\t$notify_message .= sprintf( __( 'Comment: %s' ), \"\\r\\n\" . $comment_content ) . \"\\r\\n\\r\\n\";\n\t\t\tbreak;\n\t}\n\n\t$notify_message .= sprintf( __('Approve it: %s'),  admin_url(\"comment.php?action=approve&c=$comment_id\") ) . \"\\r\\n\";\n\tif ( EMPTY_TRASH_DAYS )\n\t\t$notify_message .= sprintf( __('Trash it: %s'), admin_url(\"comment.php?action=trash&c=$comment_id\") ) . \"\\r\\n\";\n\telse\n\t\t$notify_message .= sprintf( __('Delete it: %s'), admin_url(\"comment.php?action=delete&c=$comment_id\") ) . \"\\r\\n\";\n\t$notify_message .= sprintf( __('Spam it: %s'), admin_url(\"comment.php?action=spam&c=$comment_id\") ) . \"\\r\\n\";\n\n\t$notify_message .= sprintf( _n('Currently %s comment is waiting for approval. Please visit the moderation panel:',\n \t\t'Currently %s comments are waiting for approval. Please visit the moderation panel:', $comments_waiting), number_format_i18n($comments_waiting) ) . \"\\r\\n\";\n\t$notify_message .= admin_url(\"edit-comments.php?comment_status=moderated\") . \"\\r\\n\";\n\n\t$subject = sprintf( __('[%1$s] Please moderate: \"%2$s\"'), $blogname, $post->post_title );\n\t$message_headers = '';\n\n\t/**\n\t * Filter the list of recipients for comment moderation emails.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param array $emails     List of email addresses to notify for comment moderation.\n\t * @param int   $comment_id Comment ID.\n\t */\n\t$emails = apply_filters( 'comment_moderation_recipients', $emails, $comment_id );\n\n\t/**\n\t * Filter the comment moderation email text.\n\t *\n\t * @since 1.5.2\n\t *\n\t * @param string $notify_message Text of the comment moderation email.\n\t * @param int    $comment_id     Comment ID.\n\t */\n\t$notify_message = apply_filters( 'comment_moderation_text', $notify_message, $comment_id );\n\n\t/**\n\t * Filter the comment moderation email subject.\n\t *\n\t * @since 1.5.2\n\t *\n\t * @param string $subject    Subject of the comment moderation email.\n\t * @param int    $comment_id Comment ID.\n\t */\n\t$subject = apply_filters( 'comment_moderation_subject', $subject, $comment_id );\n\n\t/**\n\t * Filter the comment moderation email headers.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $message_headers Headers for the comment moderation email.\n\t * @param int    $comment_id      Comment ID.\n\t */\n\t$message_headers = apply_filters( 'comment_moderation_headers', $message_headers, $comment_id );\n\n\tforeach ( $emails as $email ) {\n\t\t@wp_mail( $email, wp_specialchars_decode( $subject ), $notify_message, $message_headers );\n\t}\n\n\treturn true;\n}\nendif;\n\nif ( !function_exists('wp_password_change_notification') ) :\n/**\n * Notify the blog admin of a user changing password, normally via email.\n *\n * @since 2.7.0\n *\n * @param WP_User $user User object.\n */\nfunction wp_password_change_notification( $user ) {\n\t// send a copy of password change notification to the admin\n\t// but check to see if it's the admin whose password we're changing, and skip this\n\tif ( 0 !== strcasecmp( $user->user_email, get_option( 'admin_email' ) ) ) {\n\t\t$message = sprintf(__('Password Lost and Changed for user: %s'), $user->user_login) . \"\\r\\n\";\n\t\t// The blogname option is escaped with esc_html on the way into the database in sanitize_option\n\t\t// we want to reverse this for the plain text arena of emails.\n\t\t$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);\n\t\twp_mail(get_option('admin_email'), sprintf(__('[%s] Password Lost/Changed'), $blogname), $message);\n\t}\n}\nendif;\n\nif ( !function_exists('wp_new_user_notification') ) :\n/**\n * Email login credentials to a newly-registered user.\n *\n * A new user registration notification is also sent to admin email.\n *\n * @since 2.0.0\n * @since 4.3.0 The `$plaintext_pass` parameter was changed to `$notify`.\n * @since 4.3.1 The `$plaintext_pass` parameter was deprecated. `$notify` added as a third parameter.\n *\n * @global wpdb         $wpdb      WordPress database object for queries.\n * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.\n *\n * @param int    $user_id    User ID.\n * @param null   $deprecated Not used (argument deprecated).\n * @param string $notify     Optional. Type of notification that should happen. Accepts 'admin' or an empty\n *                           string (admin only), or 'both' (admin and user). Default empty.\n */\nfunction wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {\n\tif ( $deprecated !== null ) {\n\t\t_deprecated_argument( __FUNCTION__, '4.3.1' );\n\t}\n\n\tglobal $wpdb, $wp_hasher;\n\t$user = get_userdata( $user_id );\n\n\t// The blogname option is escaped with esc_html on the way into the database in sanitize_option\n\t// we want to reverse this for the plain text arena of emails.\n\t$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);\n\n\t$message  = sprintf(__('New user registration on your site %s:'), $blogname) . \"\\r\\n\\r\\n\";\n\t$message .= sprintf(__('Username: %s'), $user->user_login) . \"\\r\\n\\r\\n\";\n\t$message .= sprintf(__('Email: %s'), $user->user_email) . \"\\r\\n\";\n\n\t@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);\n\n\t// `$deprecated was pre-4.3 `$plaintext_pass`. An empty `$plaintext_pass` didn't sent a user notifcation.\n\tif ( 'admin' === $notify || ( empty( $deprecated ) && empty( $notify ) ) ) {\n\t\treturn;\n\t}\n\n\t// Generate something random for a password reset key.\n\t$key = wp_generate_password( 20, false );\n\n\t/** This action is documented in wp-login.php */\n\tdo_action( 'retrieve_password_key', $user->user_login, $key );\n\n\t// Now insert the key, hashed, into the DB.\n\tif ( empty( $wp_hasher ) ) {\n\t\trequire_once ABSPATH . WPINC . '/class-phpass.php';\n\t\t$wp_hasher = new PasswordHash( 8, true );\n\t}\n\t$hashed = time() . ':' . $wp_hasher->HashPassword( $key );\n\t$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) );\n\n\t$message = sprintf(__('Username: %s'), $user->user_login) . \"\\r\\n\\r\\n\";\n\t$message .= __('To set your password, visit the following address:') . \"\\r\\n\\r\\n\";\n\t$message .= '<' . network_site_url(\"wp-login.php?action=rp&key=$key&login=\" . rawurlencode($user->user_login), 'login') . \">\\r\\n\\r\\n\";\n\n\t$message .= wp_login_url() . \"\\r\\n\";\n\n\twp_mail($user->user_email, sprintf(__('[%s] Your username and password info'), $blogname), $message);\n}\nendif;\n\nif ( !function_exists('wp_nonce_tick') ) :\n/**\n * Get the time-dependent variable for nonce creation.\n *\n * A nonce has a lifespan of two ticks. Nonces in their second tick may be\n * updated, e.g. by autosave.\n *\n * @since 2.5.0\n *\n * @return float Float value rounded up to the next highest integer.\n */\nfunction wp_nonce_tick() {\n\t/**\n\t * Filter the lifespan of nonces in seconds.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param int $lifespan Lifespan of nonces in seconds. Default 86,400 seconds, or one day.\n\t */\n\t$nonce_life = apply_filters( 'nonce_life', DAY_IN_SECONDS );\n\n\treturn ceil(time() / ( $nonce_life / 2 ));\n}\nendif;\n\nif ( !function_exists('wp_verify_nonce') ) :\n/**\n * Verify that correct nonce was used with time limit.\n *\n * The user is given an amount of time to use the token, so therefore, since the\n * UID and $action remain the same, the independent variable is the time.\n *\n * @since 2.0.3\n *\n * @param string     $nonce  Nonce that was used in the form to verify\n * @param string|int $action Should give context to what is taking place and be the same when nonce was created.\n * @return false|int False if the nonce is invalid, 1 if the nonce is valid and generated between\n *                   0-12 hours ago, 2 if the nonce is valid and generated between 12-24 hours ago.\n */\nfunction wp_verify_nonce( $nonce, $action = -1 ) {\n\t$nonce = (string) $nonce;\n\t$user = wp_get_current_user();\n\t$uid = (int) $user->ID;\n\tif ( ! $uid ) {\n\t\t/**\n\t\t * Filter whether the user who generated the nonce is logged out.\n\t\t *\n\t\t * @since 3.5.0\n\t\t *\n\t\t * @param int    $uid    ID of the nonce-owning user.\n\t\t * @param string $action The nonce action.\n\t\t */\n\t\t$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );\n\t}\n\n\tif ( empty( $nonce ) ) {\n\t\treturn false;\n\t}\n\n\t$token = wp_get_session_token();\n\t$i = wp_nonce_tick();\n\n\t// Nonce generated 0-12 hours ago\n\t$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 );\n\tif ( hash_equals( $expected, $nonce ) ) {\n\t\treturn 1;\n\t}\n\n\t// Nonce generated 12-24 hours ago\n\t$expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );\n\tif ( hash_equals( $expected, $nonce ) ) {\n\t\treturn 2;\n\t}\n\n\t/**\n\t * Fires when nonce verification fails.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string     $nonce  The invalid nonce.\n\t * @param string|int $action The nonce action.\n\t * @param WP_User    $user   The current user object.\n\t * @param string     $token  The user's session token.\n\t */\n\tdo_action( 'wp_verify_nonce_failed', $nonce, $action, $user, $token );\n\n\t// Invalid nonce\n\treturn false;\n}\nendif;\n\nif ( !function_exists('wp_create_nonce') ) :\n/**\n * Creates a cryptographic token tied to a specific action, user, user session,\n * and window of time.\n *\n * @since 2.0.3\n * @since 4.0.0 Session tokens were integrated with nonce creation\n *\n * @param string|int $action Scalar value to add context to the nonce.\n * @return string The token.\n */\nfunction wp_create_nonce($action = -1) {\n\t$user = wp_get_current_user();\n\t$uid = (int) $user->ID;\n\tif ( ! $uid ) {\n\t\t/** This filter is documented in wp-includes/pluggable.php */\n\t\t$uid = apply_filters( 'nonce_user_logged_out', $uid, $action );\n\t}\n\n\t$token = wp_get_session_token();\n\t$i = wp_nonce_tick();\n\n\treturn substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );\n}\nendif;\n\nif ( !function_exists('wp_salt') ) :\n/**\n * Get salt to add to hashes.\n *\n * Salts are created using secret keys. Secret keys are located in two places:\n * in the database and in the wp-config.php file. The secret key in the database\n * is randomly generated and will be appended to the secret keys in wp-config.php.\n *\n * The secret keys in wp-config.php should be updated to strong, random keys to maximize\n * security. Below is an example of how the secret key constants are defined.\n * Do not paste this example directly into wp-config.php. Instead, have a\n * {@link https://api.wordpress.org/secret-key/1.1/salt/ secret key created} just\n * for you.\n *\n *     define('AUTH_KEY',         ' Xakm<o xQy rw4EMsLKM-?!T+,PFF})H4lzcW57AF0U@N@< >M%G4Yt>f`z]MON');\n *     define('SECURE_AUTH_KEY',  'LzJ}op]mr|6+![P}Ak:uNdJCJZd>(Hx.-Mh#Tz)pCIU#uGEnfFz|f ;;eU%/U^O~');\n *     define('LOGGED_IN_KEY',    '|i|Ux`9<p-h$aFf(qnT:sDO:D1P^wZ$$/Ra@miTJi9G;ddp_<q}6H1)o|a +&JCM');\n *     define('NONCE_KEY',        '%:R{[P|,s.KuMltH5}cI;/k<Gx~j!f0I)m_sIyu+&NJZ)-iO>z7X>QYR0Z_XnZ@|');\n *     define('AUTH_SALT',        'eZyT)-Naw]F8CwA*VaW#q*|.)g@o}||wf~@C-YSt}(dh_r6EbI#A,y|nU2{B#JBW');\n *     define('SECURE_AUTH_SALT', '!=oLUTXh,QW=H `}`L|9/^4-3 STz},T(w}W<I`.JjPi)<Bmf1v,HpGe}T1:Xt7n');\n *     define('LOGGED_IN_SALT',   '+XSqHc;@Q*K_b|Z?NC[3H!!EONbh.n<+=uKR:>*c(u`g~EJBf#8u#R{mUEZrozmm');\n *     define('NONCE_SALT',       'h`GXHhD>SLWVfg1(1(N{;.V!MoE(SfbA_ksP@&`+AycHcAV$+?@3q+rxV{%^VyKT');\n *\n * Salting passwords helps against tools which has stored hashed values of\n * common dictionary strings. The added values makes it harder to crack.\n *\n * @since 2.5.0\n *\n * @link https://api.wordpress.org/secret-key/1.1/salt/ Create secrets for wp-config.php\n *\n * @staticvar array $cached_salts\n * @staticvar array $duplicated_keys\n *\n * @param string $scheme Authentication scheme (auth, secure_auth, logged_in, nonce)\n * @return string Salt value\n */\nfunction wp_salt( $scheme = 'auth' ) {\n\tstatic $cached_salts = array();\n\tif ( isset( $cached_salts[ $scheme ] ) ) {\n\t\t/**\n\t\t * Filter the WordPress salt.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $cached_salt Cached salt for the given scheme.\n\t\t * @param string $scheme      Authentication scheme. Values include 'auth',\n\t\t *                            'secure_auth', 'logged_in', and 'nonce'.\n\t\t */\n\t\treturn apply_filters( 'salt', $cached_salts[ $scheme ], $scheme );\n\t}\n\n\tstatic $duplicated_keys;\n\tif ( null === $duplicated_keys ) {\n\t\t$duplicated_keys = array( 'put your unique phrase here' => true );\n\t\tforeach ( array( 'AUTH', 'SECURE_AUTH', 'LOGGED_IN', 'NONCE', 'SECRET' ) as $first ) {\n\t\t\tforeach ( array( 'KEY', 'SALT' ) as $second ) {\n\t\t\t\tif ( ! defined( \"{$first}_{$second}\" ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$value = constant( \"{$first}_{$second}\" );\n\t\t\t\t$duplicated_keys[ $value ] = isset( $duplicated_keys[ $value ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t$values = array(\n\t\t'key' => '',\n\t\t'salt' => ''\n\t);\n\tif ( defined( 'SECRET_KEY' ) && SECRET_KEY && empty( $duplicated_keys[ SECRET_KEY ] ) ) {\n\t\t$values['key'] = SECRET_KEY;\n\t}\n\tif ( 'auth' == $scheme && defined( 'SECRET_SALT' ) && SECRET_SALT && empty( $duplicated_keys[ SECRET_SALT ] ) ) {\n\t\t$values['salt'] = SECRET_SALT;\n\t}\n\n\tif ( in_array( $scheme, array( 'auth', 'secure_auth', 'logged_in', 'nonce' ) ) ) {\n\t\tforeach ( array( 'key', 'salt' ) as $type ) {\n\t\t\t$const = strtoupper( \"{$scheme}_{$type}\" );\n\t\t\tif ( defined( $const ) && constant( $const ) && empty( $duplicated_keys[ constant( $const ) ] ) ) {\n\t\t\t\t$values[ $type ] = constant( $const );\n\t\t\t} elseif ( ! $values[ $type ] ) {\n\t\t\t\t$values[ $type ] = get_site_option( \"{$scheme}_{$type}\" );\n\t\t\t\tif ( ! $values[ $type ] ) {\n\t\t\t\t\t$values[ $type ] = wp_generate_password( 64, true, true );\n\t\t\t\t\tupdate_site_option( \"{$scheme}_{$type}\", $values[ $type ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ( ! $values['key'] ) {\n\t\t\t$values['key'] = get_site_option( 'secret_key' );\n\t\t\tif ( ! $values['key'] ) {\n\t\t\t\t$values['key'] = wp_generate_password( 64, true, true );\n\t\t\t\tupdate_site_option( 'secret_key', $values['key'] );\n\t\t\t}\n\t\t}\n\t\t$values['salt'] = hash_hmac( 'md5', $scheme, $values['key'] );\n\t}\n\n\t$cached_salts[ $scheme ] = $values['key'] . $values['salt'];\n\n\t/** This filter is documented in wp-includes/pluggable.php */\n\treturn apply_filters( 'salt', $cached_salts[ $scheme ], $scheme );\n}\nendif;\n\nif ( !function_exists('wp_hash') ) :\n/**\n * Get hash of given string.\n *\n * @since 2.0.3\n *\n * @param string $data Plain text to hash\n * @return string Hash of $data\n */\nfunction wp_hash($data, $scheme = 'auth') {\n\t$salt = wp_salt($scheme);\n\n\treturn hash_hmac('md5', $data, $salt);\n}\nendif;\n\nif ( !function_exists('wp_hash_password') ) :\n/**\n * Create a hash (encrypt) of a plain text password.\n *\n * For integration with other applications, this function can be overwritten to\n * instead use the other package password checking algorithm.\n *\n * @since 2.5.0\n *\n * @global PasswordHash $wp_hasher PHPass object\n *\n * @param string $password Plain text user password to hash\n * @return string The hash string of the password\n */\nfunction wp_hash_password($password) {\n\tglobal $wp_hasher;\n\n\tif ( empty($wp_hasher) ) {\n\t\trequire_once( ABSPATH . WPINC . '/class-phpass.php');\n\t\t// By default, use the portable hash from phpass\n\t\t$wp_hasher = new PasswordHash(8, true);\n\t}\n\n\treturn $wp_hasher->HashPassword( trim( $password ) );\n}\nendif;\n\nif ( !function_exists('wp_check_password') ) :\n/**\n * Checks the plaintext password against the encrypted Password.\n *\n * Maintains compatibility between old version and the new cookie authentication\n * protocol using PHPass library. The $hash parameter is the encrypted password\n * and the function compares the plain text password when encrypted similarly\n * against the already encrypted password to see if they match.\n *\n * For integration with other applications, this function can be overwritten to\n * instead use the other package password checking algorithm.\n *\n * @since 2.5.0\n *\n * @global PasswordHash $wp_hasher PHPass object used for checking the password\n *\tagainst the $hash + $password\n * @uses PasswordHash::CheckPassword\n *\n * @param string $password Plaintext user's password\n * @param string $hash     Hash of the user's password to check against.\n * @return bool False, if the $password does not match the hashed password\n */\nfunction wp_check_password($password, $hash, $user_id = '') {\n\tglobal $wp_hasher;\n\n\t// If the hash is still md5...\n\tif ( strlen($hash) <= 32 ) {\n\t\t$check = hash_equals( $hash, md5( $password ) );\n\t\tif ( $check && $user_id ) {\n\t\t\t// Rehash using new hash.\n\t\t\twp_set_password($password, $user_id);\n\t\t\t$hash = wp_hash_password($password);\n\t\t}\n\n\t\t/**\n\t\t * Filter whether the plaintext password matches the encrypted password.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param bool   $check    Whether the passwords match.\n\t\t * @param string $password The plaintext password.\n\t\t * @param string $hash     The hashed password.\n\t\t * @param int    $user_id  User ID.\n\t\t */\n\t\treturn apply_filters( 'check_password', $check, $password, $hash, $user_id );\n\t}\n\n\t// If the stored hash is longer than an MD5, presume the\n\t// new style phpass portable hash.\n\tif ( empty($wp_hasher) ) {\n\t\trequire_once( ABSPATH . WPINC . '/class-phpass.php');\n\t\t// By default, use the portable hash from phpass\n\t\t$wp_hasher = new PasswordHash(8, true);\n\t}\n\n\t$check = $wp_hasher->CheckPassword($password, $hash);\n\n\t/** This filter is documented in wp-includes/pluggable.php */\n\treturn apply_filters( 'check_password', $check, $password, $hash, $user_id );\n}\nendif;\n\nif ( !function_exists('wp_generate_password') ) :\n/**\n * Generates a random password drawn from the defined set of characters.\n *\n * @since 2.5.0\n *\n * @param int  $length              Optional. The length of password to generate. Default 12.\n * @param bool $special_chars       Optional. Whether to include standard special characters.\n *                                  Default true.\n * @param bool $extra_special_chars Optional. Whether to include other special characters.\n *                                  Used when generating secret keys and salts. Default false.\n * @return string The random password.\n */\nfunction wp_generate_password( $length = 12, $special_chars = true, $extra_special_chars = false ) {\n\t$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\tif ( $special_chars )\n\t\t$chars .= '!@#$%^&*()';\n\tif ( $extra_special_chars )\n\t\t$chars .= '-_ []{}<>~`+=,.;:/?|';\n\n\t$password = '';\n\tfor ( $i = 0; $i < $length; $i++ ) {\n\t\t$password .= substr($chars, wp_rand(0, strlen($chars) - 1), 1);\n\t}\n\n\t/**\n\t * Filter the randomly-generated password.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $password The generated password.\n\t */\n\treturn apply_filters( 'random_password', $password );\n}\nendif;\n\nif ( !function_exists('wp_rand') ) :\n/**\n * Generates a random number\n *\n * @since 2.6.2\n * @since 4.4.0 Uses PHP7 random_int() or the random_compat library if available.\n *\n * @global string $rnd_value\n * @staticvar string $seed\n * @staticvar bool $external_rand_source_available\n *\n * @param int $min Lower limit for the generated number\n * @param int $max Upper limit for the generated number\n * @return int A random number between min and max\n */\nfunction wp_rand( $min = 0, $max = 0 ) {\n\tglobal $rnd_value;\n\n\t// Some misconfigured 32bit environments (Entropy PHP, for example) truncate integers larger than PHP_INT_MAX to PHP_INT_MAX rather than overflowing them to floats.\n\t$max_random_number = 3000000000 === 2147483647 ? (float) \"4294967295\" : 4294967295; // 4294967295 = 0xffffffff\n\n\t// We only handle Ints, floats are truncated to their integer value.\n\t$min = (int) $min;\n\t$max = (int) $max;\n\n\t// Use PHP's CSPRNG, or a compatible method\n\tstatic $use_random_int_functionality = true;\n\tif ( $use_random_int_functionality ) {\n\t\ttry {\n\t\t\t$_max = ( 0 != $max ) ? $max : $max_random_number;\n\t\t\t// wp_rand() can accept arguements in either order, PHP cannot.\n\t\t\t$_max = max( $min, $_max );\n\t\t\t$_min = min( $min, $_max );\n\t\t\t$val = random_int( $_min, $_max );\n\t\t\tif ( false !== $val ) {\n\t\t\t\treturn absint( $val );\n\t\t\t} else {\n\t\t\t\t$use_random_int_functionality = false;\n\t\t\t}\n\t\t} catch ( Error $e ) {\n\t\t\t$use_random_int_functionality = false;\n\t\t} catch ( Exception $e ) {\n\t\t\t$use_random_int_functionality = false;\n\t\t}\n\t}\n\n\t// Reset $rnd_value after 14 uses\n\t// 32(md5) + 40(sha1) + 40(sha1) / 8 = 14 random numbers from $rnd_value\n\tif ( strlen($rnd_value) < 8 ) {\n\t\tif ( defined( 'WP_SETUP_CONFIG' ) )\n\t\t\tstatic $seed = '';\n\t\telse\n\t\t\t$seed = get_transient('random_seed');\n\t\t$rnd_value = md5( uniqid(microtime() . mt_rand(), true ) . $seed );\n\t\t$rnd_value .= sha1($rnd_value);\n\t\t$rnd_value .= sha1($rnd_value . $seed);\n\t\t$seed = md5($seed . $rnd_value);\n\t\tif ( ! defined( 'WP_SETUP_CONFIG' ) && ! defined( 'WP_INSTALLING' ) ) {\n\t\t\tset_transient( 'random_seed', $seed );\n\t\t}\n\t}\n\n\t// Take the first 8 digits for our value\n\t$value = substr($rnd_value, 0, 8);\n\n\t// Strip the first eight, leaving the remainder for the next call to wp_rand().\n\t$rnd_value = substr($rnd_value, 8);\n\n\t$value = abs(hexdec($value));\n\n\t// Reduce the value to be within the min - max range\n\tif ( $max != 0 )\n\t\t$value = $min + ( $max - $min + 1 ) * $value / ( $max_random_number + 1 );\n\n\treturn abs(intval($value));\n}\nendif;\n\nif ( !function_exists('wp_set_password') ) :\n/**\n * Updates the user's password with a new encrypted one.\n *\n * For integration with other applications, this function can be overwritten to\n * instead use the other package password checking algorithm.\n *\n * Please note: This function should be used sparingly and is really only meant for single-time\n * application. Leveraging this improperly in a plugin or theme could result in an endless loop\n * of password resets if precautions are not taken to ensure it does not execute on every page load.\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $password The plaintext new user password\n * @param int    $user_id  User ID\n */\nfunction wp_set_password( $password, $user_id ) {\n\tglobal $wpdb;\n\n\t$hash = wp_hash_password( $password );\n\t$wpdb->update($wpdb->users, array('user_pass' => $hash, 'user_activation_key' => ''), array('ID' => $user_id) );\n\n\twp_cache_delete($user_id, 'users');\n}\nendif;\n\nif ( !function_exists( 'get_avatar' ) ) :\n/**\n * Retrieve the avatar `<img>` tag for a user, email address, MD5 hash, comment, or post.\n *\n * @since 2.5.0\n * @since 4.2.0 Optional `$args` parameter added.\n *\n * @param mixed $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,\n *                           user email, WP_User object, WP_Post object, or WP_Comment object.\n * @param int    $size       Optional. Height and width of the avatar image file in pixels. Default 96.\n * @param string $default    Optional. URL for the default image or a default type. Accepts '404'\n *                           (return a 404 instead of a default image), 'retro' (8bit), 'monsterid'\n *                           (monster), 'wavatar' (cartoon face), 'indenticon' (the \"quilt\"),\n *                           'mystery', 'mm', or 'mysteryman' (The Oyster Man), 'blank' (transparent GIF),\n *                           or 'gravatar_default' (the Gravatar logo). Default is the value of the\n *                           'avatar_default' option, with a fallback of 'mystery'.\n * @param string $alt        Optional. Alternative text to use in &lt;img&gt; tag. Default empty.\n * @param array  $args       {\n *     Optional. Extra arguments to retrieve the avatar.\n *\n *     @type int          $height        Display height of the avatar in pixels. Defaults to $size.\n *     @type int          $width         Display width of the avatar in pixels. Defaults to $size.\n *     @type bool         $force_default Whether to always show the default image, never the Gravatar. Default false.\n *     @type string       $rating        What rating to display avatars up to. Accepts 'G', 'PG', 'R', 'X', and are\n *                                       judged in that order. Default is the value of the 'avatar_rating' option.\n *     @type string       $scheme        URL scheme to use. See set_url_scheme() for accepted values.\n *                                       Default null.\n *     @type array|string $class         Array or string of additional classes to add to the &lt;img&gt; element.\n *                                       Default null.\n *     @type bool         $force_display Whether to always show the avatar - ignores the show_avatars option.\n *                                       Default false.\n *     @type string       $extra_attr    HTML attributes to insert in the IMG element. Is not sanitized. Default empty.\n * }\n * @return false|string `<img>` tag for the user's avatar. False on failure.\n */\nfunction get_avatar( $id_or_email, $size = 96, $default = '', $alt = '', $args = null ) {\n\t$defaults = array(\n\t\t// get_avatar_data() args.\n\t\t'size'          => 96,\n\t\t'height'        => null,\n\t\t'width'         => null,\n\t\t'default'       => get_option( 'avatar_default', 'mystery' ),\n\t\t'force_default' => false,\n\t\t'rating'        => get_option( 'avatar_rating' ),\n\t\t'scheme'        => null,\n\t\t'alt'           => '',\n\t\t'class'         => null,\n\t\t'force_display' => false,\n\t\t'extra_attr'    => '',\n\t);\n\n\tif ( empty( $args ) ) {\n\t\t$args = array();\n\t}\n\n\t$args['size']    = (int) $size;\n\t$args['default'] = $default;\n\t$args['alt']     = $alt;\n\n\t$args = wp_parse_args( $args, $defaults );\n\n\tif ( empty( $args['height'] ) ) {\n\t\t$args['height'] = $args['size'];\n\t}\n\tif ( empty( $args['width'] ) ) {\n\t\t$args['width'] = $args['size'];\n\t}\n\n\tif ( is_object( $id_or_email ) && isset( $id_or_email->comment_ID ) ) {\n\t\t$id_or_email = get_comment( $id_or_email );\n\t}\n\n\t/**\n\t * Filter whether to retrieve the avatar URL early.\n\t *\n\t * Passing a non-null value will effectively short-circuit get_avatar(), passing\n\t * the value through the {@see 'pre_get_avatar'} filter and returning early.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param string $avatar      HTML for the user's avatar. Default null.\n\t * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,\n\t *                            user email, WP_User object, WP_Post object, or WP_Comment object.\n\t * @param array  $args        Arguments passed to get_avatar_url(), after processing.\n\t */\n\t$avatar = apply_filters( 'pre_get_avatar', null, $id_or_email, $args );\n\n\tif ( ! is_null( $avatar ) ) {\n\t\t/** This filter is documented in wp-includes/pluggable.php */\n\t\treturn apply_filters( 'get_avatar', $avatar, $id_or_email, $args['size'], $args['default'], $args['alt'], $args );\n\t}\n\n\tif ( ! $args['force_display'] && ! get_option( 'show_avatars' ) ) {\n\t\treturn false;\n\t}\n\n\t$url2x = get_avatar_url( $id_or_email, array_merge( $args, array( 'size' => $args['size'] * 2 ) ) );\n\n\t$args = get_avatar_data( $id_or_email, $args );\n\n\t$url = $args['url'];\n\n\tif ( ! $url || is_wp_error( $url ) ) {\n\t\treturn false;\n\t}\n\n\t$class = array( 'avatar', 'avatar-' . (int) $args['size'], 'photo' );\n\n\tif ( ! $args['found_avatar'] || $args['force_default'] ) {\n\t\t$class[] = 'avatar-default';\n\t}\n\n\tif ( $args['class'] ) {\n\t\tif ( is_array( $args['class'] ) ) {\n\t\t\t$class = array_merge( $class, $args['class'] );\n\t\t} else {\n\t\t\t$class[] = $args['class'];\n\t\t}\n\t}\n\n\t$avatar = sprintf(\n\t\t\"<img alt='%s' src='%s' srcset='%s' class='%s' height='%d' width='%d' %s/>\",\n\t\tesc_attr( $args['alt'] ),\n\t\tesc_url( $url ),\n\t\tesc_attr( \"$url2x 2x\" ),\n\t\tesc_attr( join( ' ', $class ) ),\n\t\t(int) $args['height'],\n\t\t(int) $args['width'],\n\t\t$args['extra_attr']\n\t);\n\n\t/**\n\t * Filter the avatar to retrieve.\n\t *\n\t * @since 2.5.0\n\t * @since 4.2.0 The `$args` parameter was added.\n\t *\n\t * @param string $avatar      &lt;img&gt; tag for the user's avatar.\n\t * @param mixed  $id_or_email The Gravatar to retrieve. Accepts a user_id, gravatar md5 hash,\n\t *                            user email, WP_User object, WP_Post object, or WP_Comment object.\n\t * @param int    $size        Square avatar width and height in pixels to retrieve.\n\t * @param string $alt         Alternative text to use in the avatar image tag.\n\t *                                       Default empty.\n\t * @param array  $args        Arguments passed to get_avatar_data(), after processing.\n\t */\n\treturn apply_filters( 'get_avatar', $avatar, $id_or_email, $args['size'], $args['default'], $args['alt'], $args );\n}\nendif;\n\nif ( !function_exists( 'wp_text_diff' ) ) :\n/**\n * Displays a human readable HTML representation of the difference between two strings.\n *\n * The Diff is available for getting the changes between versions. The output is\n * HTML, so the primary use is for displaying the changes. If the two strings\n * are equivalent, then an empty string will be returned.\n *\n * The arguments supported and can be changed are listed below.\n *\n * 'title' : Default is an empty string. Titles the diff in a manner compatible\n *\t\twith the output.\n * 'title_left' : Default is an empty string. Change the HTML to the left of the\n *\t\ttitle.\n * 'title_right' : Default is an empty string. Change the HTML to the right of\n *\t\tthe title.\n *\n * @since 2.6.0\n *\n * @see wp_parse_args() Used to change defaults to user defined settings.\n * @uses Text_Diff\n * @uses WP_Text_Diff_Renderer_Table\n *\n * @param string       $left_string  \"old\" (left) version of string\n * @param string       $right_string \"new\" (right) version of string\n * @param string|array $args         Optional. Change 'title', 'title_left', and 'title_right' defaults.\n * @return string Empty string if strings are equivalent or HTML with differences.\n */\nfunction wp_text_diff( $left_string, $right_string, $args = null ) {\n\t$defaults = array( 'title' => '', 'title_left' => '', 'title_right' => '' );\n\t$args = wp_parse_args( $args, $defaults );\n\n\tif ( ! class_exists( 'WP_Text_Diff_Renderer_Table', false ) )\n\t\trequire( ABSPATH . WPINC . '/wp-diff.php' );\n\n\t$left_string  = normalize_whitespace($left_string);\n\t$right_string = normalize_whitespace($right_string);\n\n\t$left_lines  = explode(\"\\n\", $left_string);\n\t$right_lines = explode(\"\\n\", $right_string);\n\t$text_diff = new Text_Diff($left_lines, $right_lines);\n\t$renderer  = new WP_Text_Diff_Renderer_Table( $args );\n\t$diff = $renderer->render($text_diff);\n\n\tif ( !$diff )\n\t\treturn '';\n\n\t$r  = \"<table class='diff'>\\n\";\n\n\tif ( ! empty( $args[ 'show_split_view' ] ) ) {\n\t\t$r .= \"<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />\";\n\t} else {\n\t\t$r .= \"<col class='content' />\";\n\t}\n\n\tif ( $args['title'] || $args['title_left'] || $args['title_right'] )\n\t\t$r .= \"<thead>\";\n\tif ( $args['title'] )\n\t\t$r .= \"<tr class='diff-title'><th colspan='4'>$args[title]</th></tr>\\n\";\n\tif ( $args['title_left'] || $args['title_right'] ) {\n\t\t$r .= \"<tr class='diff-sub-title'>\\n\";\n\t\t$r .= \"\\t<td></td><th>$args[title_left]</th>\\n\";\n\t\t$r .= \"\\t<td></td><th>$args[title_right]</th>\\n\";\n\t\t$r .= \"</tr>\\n\";\n\t}\n\tif ( $args['title'] || $args['title_left'] || $args['title_right'] )\n\t\t$r .= \"</thead>\\n\";\n\n\t$r .= \"<tbody>\\n$diff\\n</tbody>\\n\";\n\t$r .= \"</table>\";\n\n\treturn $r;\n}\nendif;\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/plugin.php",
    "content": "<?php\n/**\n * The plugin API is located in this file, which allows for creating actions\n * and filters and hooking functions, and methods. The functions or methods will\n * then be run when the action or filter is called.\n *\n * The API callback examples reference functions, but can be methods of classes.\n * To hook methods, you'll need to pass an array one of two ways.\n *\n * Any of the syntaxes explained in the PHP documentation for the\n * {@link http://us2.php.net/manual/en/language.pseudo-types.php#language.types.callback 'callback'}\n * type are valid.\n *\n * Also see the {@link https://codex.wordpress.org/Plugin_API Plugin API} for\n * more information and examples on how to use a lot of these functions.\n *\n * @package WordPress\n * @subpackage Plugin\n * @since 1.5.0\n */\n\n// Initialize the filter globals.\nglobal $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;\n\nif ( ! isset( $wp_filter ) )\n\t$wp_filter = array();\n\nif ( ! isset( $wp_actions ) )\n\t$wp_actions = array();\n\nif ( ! isset( $merged_filters ) )\n\t$merged_filters = array();\n\nif ( ! isset( $wp_current_filter ) )\n\t$wp_current_filter = array();\n\n/**\n * Hook a function or method to a specific filter action.\n *\n * WordPress offers filter hooks to allow plugins to modify\n * various types of internal data at runtime.\n *\n * A plugin can modify data by binding a callback to a filter hook. When the filter\n * is later applied, each bound callback is run in order of priority, and given\n * the opportunity to modify a value by returning a new value.\n *\n * The following example shows how a callback function is bound to a filter hook.\n *\n * Note that `$example` is passed to the callback, (maybe) modified, then returned:\n *\n *     function example_callback( $example ) {\n *         // Maybe modify $example in some way.\n *     \t   return $example;\n *     }\n *     add_filter( 'example_filter', 'example_callback' );\n *\n * Bound callbacks can accept from none to the total number of arguments passed as parameters\n * in the corresponding apply_filters() call.\n *\n * In other words, if an apply_filters() call passes four total arguments, callbacks bound to\n * it can accept none (the same as 1) of the arguments or up to four. The important part is that\n * the `$accepted_args` value must reflect the number of arguments the bound callback *actually*\n * opted to accept. If no arguments were accepted by the callback that is considered to be the\n * same as accepting 1 argument. For example:\n *\n *     // Filter call.\n *     $value = apply_filters( 'hook', $value, $arg2, $arg3 );\n *\n *     // Accepting zero/one arguments.\n *     function example_callback() {\n *         ...\n *         return 'some value';\n *     }\n *     add_filter( 'hook', 'example_callback' ); // Where $priority is default 10, $accepted_args is default 1.\n *\n *     // Accepting two arguments (three possible).\n *     function example_callback( $value, $arg2 ) {\n *         ...\n *         return $maybe_modified_value;\n *     }\n *     add_filter( 'hook', 'example_callback', 10, 2 ); // Where $priority is 10, $accepted_args is 2.\n *\n * *Note:* The function will return true whether or not the callback is valid.\n * It is up to you to take care. This is done for optimization purposes, so\n * everything is as quick as possible.\n *\n * @since 0.71\n *\n * @global array $wp_filter      A multidimensional array of all hooks and the callbacks hooked to them.\n * @global array $merged_filters Tracks the tags that need to be merged for later. If the hook is added,\n *                               it doesn't need to run through that process.\n *\n * @param string   $tag             The name of the filter to hook the $function_to_add callback to.\n * @param callable $function_to_add The callback to be run when the filter is applied.\n * @param int      $priority        Optional. Used to specify the order in which the functions\n *                                  associated with a particular action are executed. Default 10.\n *                                  Lower numbers correspond with earlier execution,\n *                                  and functions with the same priority are executed\n *                                  in the order in which they were added to the action.\n * @param int      $accepted_args   Optional. The number of arguments the function accepts. Default 1.\n * @return true\n */\nfunction add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {\n\tglobal $wp_filter, $merged_filters;\n\n\t$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);\n\t$wp_filter[$tag][$priority][$idx] = array('function' => $function_to_add, 'accepted_args' => $accepted_args);\n\tunset( $merged_filters[ $tag ] );\n\treturn true;\n}\n\n/**\n * Check if any filter has been registered for a hook.\n *\n * @since 2.5.0\n *\n * @global array $wp_filter Stores all of the filters.\n *\n * @param string        $tag               The name of the filter hook.\n * @param callable|bool $function_to_check Optional. The callback to check for. Default false.\n * @return false|int If $function_to_check is omitted, returns boolean for whether the hook has\n *                   anything registered. When checking a specific function, the priority of that\n *                   hook is returned, or false if the function is not attached. When using the\n *                   $function_to_check argument, this function may return a non-boolean value\n *                   that evaluates to false (e.g.) 0, so use the === operator for testing the\n *                   return value.\n */\nfunction has_filter($tag, $function_to_check = false) {\n\t// Don't reset the internal array pointer\n\t$wp_filter = $GLOBALS['wp_filter'];\n\n\t$has = ! empty( $wp_filter[ $tag ] );\n\n\t// Make sure at least one priority has a filter callback\n\tif ( $has ) {\n\t\t$exists = false;\n\t\tforeach ( $wp_filter[ $tag ] as $callbacks ) {\n\t\t\tif ( ! empty( $callbacks ) ) {\n\t\t\t\t$exists = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $exists ) {\n\t\t\t$has = false;\n\t\t}\n\t}\n\n\tif ( false === $function_to_check || false === $has )\n\t\treturn $has;\n\n\tif ( !$idx = _wp_filter_build_unique_id($tag, $function_to_check, false) )\n\t\treturn false;\n\n\tforeach ( (array) array_keys($wp_filter[$tag]) as $priority ) {\n\t\tif ( isset($wp_filter[$tag][$priority][$idx]) )\n\t\t\treturn $priority;\n\t}\n\n\treturn false;\n}\n\n/**\n * Call the functions added to a filter hook.\n *\n * The callback functions attached to filter hook $tag are invoked by calling\n * this function. This function can be used to create a new filter hook by\n * simply calling this function with the name of the new hook specified using\n * the $tag parameter.\n *\n * The function allows for additional arguments to be added and passed to hooks.\n *\n *     // Our filter callback function\n *     function example_callback( $string, $arg1, $arg2 ) {\n *         // (maybe) modify $string\n *         return $string;\n *     }\n *     add_filter( 'example_filter', 'example_callback', 10, 3 );\n *\n *     /*\n *      * Apply the filters by calling the 'example_callback' function we\n *      * \"hooked\" to 'example_filter' using the add_filter() function above.\n *      * - 'example_filter' is the filter hook $tag\n *      * - 'filter me' is the value being filtered\n *      * - $arg1 and $arg2 are the additional arguments passed to the callback.\n *     $value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );\n *\n * @since 0.71\n *\n * @global array $wp_filter         Stores all of the filters.\n * @global array $merged_filters    Merges the filter hooks using this function.\n * @global array $wp_current_filter Stores the list of current filters with the current one last.\n *\n * @param string $tag   The name of the filter hook.\n * @param mixed  $value The value on which the filters hooked to `$tag` are applied on.\n * @param mixed  $var   Additional variables passed to the functions hooked to `$tag`.\n * @return mixed The filtered value after all hooked functions are applied to it.\n */\nfunction apply_filters( $tag, $value ) {\n\tglobal $wp_filter, $merged_filters, $wp_current_filter;\n\n\t$args = array();\n\n\t// Do 'all' actions first.\n\tif ( isset($wp_filter['all']) ) {\n\t\t$wp_current_filter[] = $tag;\n\t\t$args = func_get_args();\n\t\t_wp_call_all_hook($args);\n\t}\n\n\tif ( !isset($wp_filter[$tag]) ) {\n\t\tif ( isset($wp_filter['all']) )\n\t\t\tarray_pop($wp_current_filter);\n\t\treturn $value;\n\t}\n\n\tif ( !isset($wp_filter['all']) )\n\t\t$wp_current_filter[] = $tag;\n\n\t// Sort.\n\tif ( !isset( $merged_filters[ $tag ] ) ) {\n\t\tksort($wp_filter[$tag]);\n\t\t$merged_filters[ $tag ] = true;\n\t}\n\n\treset( $wp_filter[ $tag ] );\n\n\tif ( empty($args) )\n\t\t$args = func_get_args();\n\n\tdo {\n\t\tforeach ( (array) current($wp_filter[$tag]) as $the_ )\n\t\t\tif ( !is_null($the_['function']) ){\n\t\t\t\t$args[1] = $value;\n\t\t\t\t$value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));\n\t\t\t}\n\n\t} while ( next($wp_filter[$tag]) !== false );\n\n\tarray_pop( $wp_current_filter );\n\n\treturn $value;\n}\n\n/**\n * Execute functions hooked on a specific filter hook, specifying arguments in an array.\n *\n * @see 3.0.0\n *\n * @see apply_filters() This function is identical, but the arguments passed to the\n * functions hooked to `$tag` are supplied using an array.\n *\n * @global array $wp_filter         Stores all of the filters\n * @global array $merged_filters    Merges the filter hooks using this function.\n * @global array $wp_current_filter Stores the list of current filters with the current one last\n *\n * @param string $tag  The name of the filter hook.\n * @param array  $args The arguments supplied to the functions hooked to $tag.\n * @return mixed The filtered value after all hooked functions are applied to it.\n */\nfunction apply_filters_ref_array($tag, $args) {\n\tglobal $wp_filter, $merged_filters, $wp_current_filter;\n\n\t// Do 'all' actions first\n\tif ( isset($wp_filter['all']) ) {\n\t\t$wp_current_filter[] = $tag;\n\t\t$all_args = func_get_args();\n\t\t_wp_call_all_hook($all_args);\n\t}\n\n\tif ( !isset($wp_filter[$tag]) ) {\n\t\tif ( isset($wp_filter['all']) )\n\t\t\tarray_pop($wp_current_filter);\n\t\treturn $args[0];\n\t}\n\n\tif ( !isset($wp_filter['all']) )\n\t\t$wp_current_filter[] = $tag;\n\n\t// Sort\n\tif ( !isset( $merged_filters[ $tag ] ) ) {\n\t\tksort($wp_filter[$tag]);\n\t\t$merged_filters[ $tag ] = true;\n\t}\n\n\treset( $wp_filter[ $tag ] );\n\n\tdo {\n\t\tforeach ( (array) current($wp_filter[$tag]) as $the_ )\n\t\t\tif ( !is_null($the_['function']) )\n\t\t\t\t$args[0] = call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));\n\n\t} while ( next($wp_filter[$tag]) !== false );\n\n\tarray_pop( $wp_current_filter );\n\n\treturn $args[0];\n}\n\n/**\n * Removes a function from a specified filter hook.\n *\n * This function removes a function attached to a specified filter hook. This\n * method can be used to remove default functions attached to a specific filter\n * hook and possibly replace them with a substitute.\n *\n * To remove a hook, the $function_to_remove and $priority arguments must match\n * when the hook was added. This goes for both filters and actions. No warning\n * will be given on removal failure.\n *\n * @since 1.2.0\n *\n * @global array $wp_filter         Stores all of the filters\n * @global array $merged_filters    Merges the filter hooks using this function.\n *\n * @param string   $tag                The filter hook to which the function to be removed is hooked.\n * @param callable $function_to_remove The name of the function which should be removed.\n * @param int      $priority           Optional. The priority of the function. Default 10.\n * @return bool    Whether the function existed before it was removed.\n */\nfunction remove_filter( $tag, $function_to_remove, $priority = 10 ) {\n\t$function_to_remove = _wp_filter_build_unique_id( $tag, $function_to_remove, $priority );\n\n\t$r = isset( $GLOBALS['wp_filter'][ $tag ][ $priority ][ $function_to_remove ] );\n\n\tif ( true === $r ) {\n\t\tunset( $GLOBALS['wp_filter'][ $tag ][ $priority ][ $function_to_remove ] );\n\t\tif ( empty( $GLOBALS['wp_filter'][ $tag ][ $priority ] ) ) {\n\t\t\tunset( $GLOBALS['wp_filter'][ $tag ][ $priority ] );\n\t\t}\n\t\tif ( empty( $GLOBALS['wp_filter'][ $tag ] ) ) {\n\t\t\t$GLOBALS['wp_filter'][ $tag ] = array();\n\t\t}\n\t\tunset( $GLOBALS['merged_filters'][ $tag ] );\n\t}\n\n\treturn $r;\n}\n\n/**\n * Remove all of the hooks from a filter.\n *\n * @since 2.7.0\n *\n * @global array $wp_filter         Stores all of the filters\n * @global array $merged_filters    Merges the filter hooks using this function.\n *\n * @param string   $tag      The filter to remove hooks from.\n * @param int|bool $priority Optional. The priority number to remove. Default false.\n * @return true True when finished.\n */\nfunction remove_all_filters( $tag, $priority = false ) {\n\tglobal $wp_filter, $merged_filters;\n\n\tif ( isset( $wp_filter[ $tag ]) ) {\n\t\tif ( false === $priority ) {\n\t\t\t$wp_filter[ $tag ] = array();\n\t\t} elseif ( isset( $wp_filter[ $tag ][ $priority ] ) ) {\n\t\t\t$wp_filter[ $tag ][ $priority ] = array();\n\t\t}\n\t}\n\n\tunset( $merged_filters[ $tag ] );\n\n\treturn true;\n}\n\n/**\n * Retrieve the name of the current filter or action.\n *\n * @since 2.5.0\n *\n * @global array $wp_current_filter Stores the list of current filters with the current one last\n *\n * @return string Hook name of the current filter or action.\n */\nfunction current_filter() {\n\tglobal $wp_current_filter;\n\treturn end( $wp_current_filter );\n}\n\n/**\n * Retrieve the name of the current action.\n *\n * @since 3.9.0\n *\n * @return string Hook name of the current action.\n */\nfunction current_action() {\n\treturn current_filter();\n}\n\n/**\n * Retrieve the name of a filter currently being processed.\n *\n * The function current_filter() only returns the most recent filter or action\n * being executed. did_action() returns true once the action is initially\n * processed.\n *\n * This function allows detection for any filter currently being\n * executed (despite not being the most recent filter to fire, in the case of\n * hooks called from hook callbacks) to be verified.\n *\n * @since 3.9.0\n *\n * @see current_filter()\n * @see did_action()\n * @global array $wp_current_filter Current filter.\n *\n * @param null|string $filter Optional. Filter to check. Defaults to null, which\n *                            checks if any filter is currently being run.\n * @return bool Whether the filter is currently in the stack.\n */\nfunction doing_filter( $filter = null ) {\n\tglobal $wp_current_filter;\n\n\tif ( null === $filter ) {\n\t\treturn ! empty( $wp_current_filter );\n\t}\n\n\treturn in_array( $filter, $wp_current_filter );\n}\n\n/**\n * Retrieve the name of an action currently being processed.\n *\n * @since 3.9.0\n *\n * @param string|null $action Optional. Action to check. Defaults to null, which checks\n *                            if any action is currently being run.\n * @return bool Whether the action is currently in the stack.\n */\nfunction doing_action( $action = null ) {\n\treturn doing_filter( $action );\n}\n\n/**\n * Hooks a function on to a specific action.\n *\n * Actions are the hooks that the WordPress core launches at specific points\n * during execution, or when specific events occur. Plugins can specify that\n * one or more of its PHP functions are executed at these points, using the\n * Action API.\n *\n * @since 1.2.0\n *\n * @param string   $tag             The name of the action to which the $function_to_add is hooked.\n * @param callable $function_to_add The name of the function you wish to be called.\n * @param int      $priority        Optional. Used to specify the order in which the functions\n *                                  associated with a particular action are executed. Default 10.\n *                                  Lower numbers correspond with earlier execution,\n *                                  and functions with the same priority are executed\n *                                  in the order in which they were added to the action.\n * @param int      $accepted_args   Optional. The number of arguments the function accepts. Default 1.\n * @return true Will always return true.\n */\nfunction add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {\n\treturn add_filter($tag, $function_to_add, $priority, $accepted_args);\n}\n\n/**\n * Execute functions hooked on a specific action hook.\n *\n * This function invokes all functions attached to action hook `$tag`. It is\n * possible to create new action hooks by simply calling this function,\n * specifying the name of the new hook using the `$tag` parameter.\n *\n * You can pass extra arguments to the hooks, much like you can with\n * {@see apply_filters()}.\n *\n * @since 1.2.0\n *\n * @global array $wp_filter         Stores all of the filters\n * @global array $wp_actions        Increments the amount of times action was triggered.\n * @global array $merged_filters    Merges the filter hooks using this function.\n * @global array $wp_current_filter Stores the list of current filters with the current one last\n *\n * @param string $tag The name of the action to be executed.\n * @param mixed  $arg Optional. Additional arguments which are passed on to the\n *                    functions hooked to the action. Default empty.\n */\nfunction do_action($tag, $arg = '') {\n\tglobal $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;\n\n\tif ( ! isset($wp_actions[$tag]) )\n\t\t$wp_actions[$tag] = 1;\n\telse\n\t\t++$wp_actions[$tag];\n\n\t// Do 'all' actions first\n\tif ( isset($wp_filter['all']) ) {\n\t\t$wp_current_filter[] = $tag;\n\t\t$all_args = func_get_args();\n\t\t_wp_call_all_hook($all_args);\n\t}\n\n\tif ( !isset($wp_filter[$tag]) ) {\n\t\tif ( isset($wp_filter['all']) )\n\t\t\tarray_pop($wp_current_filter);\n\t\treturn;\n\t}\n\n\tif ( !isset($wp_filter['all']) )\n\t\t$wp_current_filter[] = $tag;\n\n\t$args = array();\n\tif ( is_array($arg) && 1 == count($arg) && isset($arg[0]) && is_object($arg[0]) ) // array(&$this)\n\t\t$args[] =& $arg[0];\n\telse\n\t\t$args[] = $arg;\n\tfor ( $a = 2, $num = func_num_args(); $a < $num; $a++ )\n\t\t$args[] = func_get_arg($a);\n\n\t// Sort\n\tif ( !isset( $merged_filters[ $tag ] ) ) {\n\t\tksort($wp_filter[$tag]);\n\t\t$merged_filters[ $tag ] = true;\n\t}\n\n\treset( $wp_filter[ $tag ] );\n\n\tdo {\n\t\tforeach ( (array) current($wp_filter[$tag]) as $the_ )\n\t\t\tif ( !is_null($the_['function']) )\n\t\t\t\tcall_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));\n\n\t} while ( next($wp_filter[$tag]) !== false );\n\n\tarray_pop($wp_current_filter);\n}\n\n/**\n * Retrieve the number of times an action is fired.\n *\n * @since 2.1.0\n *\n * @global array $wp_actions Increments the amount of times action was triggered.\n *\n * @param string $tag The name of the action hook.\n * @return int The number of times action hook $tag is fired.\n */\nfunction did_action($tag) {\n\tglobal $wp_actions;\n\n\tif ( ! isset( $wp_actions[ $tag ] ) )\n\t\treturn 0;\n\n\treturn $wp_actions[$tag];\n}\n\n/**\n * Execute functions hooked on a specific action hook, specifying arguments in an array.\n *\n * @since 2.1.0\n *\n * @see do_action() This function is identical, but the arguments passed to the\n *                  functions hooked to $tag< are supplied using an array.\n * @global array $wp_filter         Stores all of the filters\n * @global array $wp_actions        Increments the amount of times action was triggered.\n * @global array $merged_filters    Merges the filter hooks using this function.\n * @global array $wp_current_filter Stores the list of current filters with the current one last\n *\n * @param string $tag  The name of the action to be executed.\n * @param array  $args The arguments supplied to the functions hooked to `$tag`.\n */\nfunction do_action_ref_array($tag, $args) {\n\tglobal $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;\n\n\tif ( ! isset($wp_actions[$tag]) )\n\t\t$wp_actions[$tag] = 1;\n\telse\n\t\t++$wp_actions[$tag];\n\n\t// Do 'all' actions first\n\tif ( isset($wp_filter['all']) ) {\n\t\t$wp_current_filter[] = $tag;\n\t\t$all_args = func_get_args();\n\t\t_wp_call_all_hook($all_args);\n\t}\n\n\tif ( !isset($wp_filter[$tag]) ) {\n\t\tif ( isset($wp_filter['all']) )\n\t\t\tarray_pop($wp_current_filter);\n\t\treturn;\n\t}\n\n\tif ( !isset($wp_filter['all']) )\n\t\t$wp_current_filter[] = $tag;\n\n\t// Sort\n\tif ( !isset( $merged_filters[ $tag ] ) ) {\n\t\tksort($wp_filter[$tag]);\n\t\t$merged_filters[ $tag ] = true;\n\t}\n\n\treset( $wp_filter[ $tag ] );\n\n\tdo {\n\t\tforeach ( (array) current($wp_filter[$tag]) as $the_ )\n\t\t\tif ( !is_null($the_['function']) )\n\t\t\t\tcall_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));\n\n\t} while ( next($wp_filter[$tag]) !== false );\n\n\tarray_pop($wp_current_filter);\n}\n\n/**\n * Check if any action has been registered for a hook.\n *\n * @since 2.5.0\n *\n * @see has_filter() has_action() is an alias of has_filter().\n *\n * @param string        $tag               The name of the action hook.\n * @param callable|bool $function_to_check Optional. The callback to check for. Default false.\n * @return bool|int If $function_to_check is omitted, returns boolean for whether the hook has\n *                  anything registered. When checking a specific function, the priority of that\n *                  hook is returned, or false if the function is not attached. When using the\n *                  $function_to_check argument, this function may return a non-boolean value\n *                  that evaluates to false (e.g.) 0, so use the === operator for testing the\n *                  return value.\n */\nfunction has_action($tag, $function_to_check = false) {\n\treturn has_filter($tag, $function_to_check);\n}\n\n/**\n * Removes a function from a specified action hook.\n *\n * This function removes a function attached to a specified action hook. This\n * method can be used to remove default functions attached to a specific filter\n * hook and possibly replace them with a substitute.\n *\n * @since 1.2.0\n *\n * @param string   $tag                The action hook to which the function to be removed is hooked.\n * @param callable $function_to_remove The name of the function which should be removed.\n * @param int      $priority           Optional. The priority of the function. Default 10.\n * @return bool Whether the function is removed.\n */\nfunction remove_action( $tag, $function_to_remove, $priority = 10 ) {\n\treturn remove_filter( $tag, $function_to_remove, $priority );\n}\n\n/**\n * Remove all of the hooks from an action.\n *\n * @since 2.7.0\n *\n * @param string   $tag      The action to remove hooks from.\n * @param int|bool $priority The priority number to remove them from. Default false.\n * @return true True when finished.\n */\nfunction remove_all_actions($tag, $priority = false) {\n\treturn remove_all_filters($tag, $priority);\n}\n\n//\n// Functions for handling plugins.\n//\n\n/**\n * Gets the basename of a plugin.\n *\n * This method extracts the name of a plugin from its filename.\n *\n * @since 1.5.0\n *\n * @global array $wp_plugin_paths\n *\n * @param string $file The filename of plugin.\n * @return string The name of a plugin.\n */\nfunction plugin_basename( $file ) {\n\tglobal $wp_plugin_paths;\n\n\tforeach ( $wp_plugin_paths as $dir => $realdir ) {\n\t\tif ( strpos( $file, $realdir ) === 0 ) {\n\t\t\t$file = $dir . substr( $file, strlen( $realdir ) );\n\t\t}\n\t}\n\n\t$file = wp_normalize_path( $file );\n\t$plugin_dir = wp_normalize_path( WP_PLUGIN_DIR );\n\t$mu_plugin_dir = wp_normalize_path( WPMU_PLUGIN_DIR );\n\n\t$file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#','',$file); // get relative path from plugins dir\n\t$file = trim($file, '/');\n\treturn $file;\n}\n\n/**\n * Register a plugin's real path.\n *\n * This is used in plugin_basename() to resolve symlinked paths.\n *\n * @since 3.9.0\n *\n * @see plugin_basename()\n *\n * @global array $wp_plugin_paths\n *\n * @staticvar string $wp_plugin_path\n * @staticvar string $wpmu_plugin_path\n *\n * @param string $file Known path to the file.\n * @return bool Whether the path was able to be registered.\n */\nfunction wp_register_plugin_realpath( $file ) {\n\tglobal $wp_plugin_paths;\n\n\t// Normalize, but store as static to avoid recalculation of a constant value\n\tstatic $wp_plugin_path = null, $wpmu_plugin_path = null;\n\tif ( ! isset( $wp_plugin_path ) ) {\n\t\t$wp_plugin_path   = wp_normalize_path( WP_PLUGIN_DIR   );\n\t\t$wpmu_plugin_path = wp_normalize_path( WPMU_PLUGIN_DIR );\n\t}\n\n\t$plugin_path = wp_normalize_path( dirname( $file ) );\n\t$plugin_realpath = wp_normalize_path( dirname( realpath( $file ) ) );\n\n\tif ( $plugin_path === $wp_plugin_path || $plugin_path === $wpmu_plugin_path ) {\n\t\treturn false;\n\t}\n\n\tif ( $plugin_path !== $plugin_realpath ) {\n\t\t$wp_plugin_paths[ $plugin_path ] = $plugin_realpath;\n\t}\n\n\treturn true;\n}\n\n/**\n * Get the filesystem directory path (with trailing slash) for the plugin __FILE__ passed in.\n *\n * @since 2.8.0\n *\n * @param string $file The filename of the plugin (__FILE__).\n * @return string the filesystem path of the directory that contains the plugin.\n */\nfunction plugin_dir_path( $file ) {\n\treturn trailingslashit( dirname( $file ) );\n}\n\n/**\n * Get the URL directory path (with trailing slash) for the plugin __FILE__ passed in.\n *\n * @since 2.8.0\n *\n * @param string $file The filename of the plugin (__FILE__).\n * @return string the URL path of the directory that contains the plugin.\n */\nfunction plugin_dir_url( $file ) {\n\treturn trailingslashit( plugins_url( '', $file ) );\n}\n\n/**\n * Set the activation hook for a plugin.\n *\n * When a plugin is activated, the action 'activate_PLUGINNAME' hook is\n * called. In the name of this hook, PLUGINNAME is replaced with the name\n * of the plugin, including the optional subdirectory. For example, when the\n * plugin is located in wp-content/plugins/sampleplugin/sample.php, then\n * the name of this hook will become 'activate_sampleplugin/sample.php'.\n *\n * When the plugin consists of only one file and is (as by default) located at\n * wp-content/plugins/sample.php the name of this hook will be\n * 'activate_sample.php'.\n *\n * @since 2.0.0\n *\n * @param string   $file     The filename of the plugin including the path.\n * @param callable $function The function hooked to the 'activate_PLUGIN' action.\n */\nfunction register_activation_hook($file, $function) {\n\t$file = plugin_basename($file);\n\tadd_action('activate_' . $file, $function);\n}\n\n/**\n * Set the deactivation hook for a plugin.\n *\n * When a plugin is deactivated, the action 'deactivate_PLUGINNAME' hook is\n * called. In the name of this hook, PLUGINNAME is replaced with the name\n * of the plugin, including the optional subdirectory. For example, when the\n * plugin is located in wp-content/plugins/sampleplugin/sample.php, then\n * the name of this hook will become 'deactivate_sampleplugin/sample.php'.\n *\n * When the plugin consists of only one file and is (as by default) located at\n * wp-content/plugins/sample.php the name of this hook will be\n * 'deactivate_sample.php'.\n *\n * @since 2.0.0\n *\n * @param string   $file     The filename of the plugin including the path.\n * @param callable $function The function hooked to the 'deactivate_PLUGIN' action.\n */\nfunction register_deactivation_hook($file, $function) {\n\t$file = plugin_basename($file);\n\tadd_action('deactivate_' . $file, $function);\n}\n\n/**\n * Set the uninstallation hook for a plugin.\n *\n * Registers the uninstall hook that will be called when the user clicks on the\n * uninstall link that calls for the plugin to uninstall itself. The link won't\n * be active unless the plugin hooks into the action.\n *\n * The plugin should not run arbitrary code outside of functions, when\n * registering the uninstall hook. In order to run using the hook, the plugin\n * will have to be included, which means that any code laying outside of a\n * function will be run during the uninstall process. The plugin should not\n * hinder the uninstall process.\n *\n * If the plugin can not be written without running code within the plugin, then\n * the plugin should create a file named 'uninstall.php' in the base plugin\n * folder. This file will be called, if it exists, during the uninstall process\n * bypassing the uninstall hook. The plugin, when using the 'uninstall.php'\n * should always check for the 'WP_UNINSTALL_PLUGIN' constant, before\n * executing.\n *\n * @since 2.7.0\n *\n * @param string   $file     Plugin file.\n * @param callable $callback The callback to run when the hook is called. Must be\n *                           a static method or function.\n */\nfunction register_uninstall_hook( $file, $callback ) {\n\tif ( is_array( $callback ) && is_object( $callback[0] ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Only a static class method or function can be used in an uninstall hook.' ), '3.1' );\n\t\treturn;\n\t}\n\n\t/*\n\t * The option should not be autoloaded, because it is not needed in most\n\t * cases. Emphasis should be put on using the 'uninstall.php' way of\n\t * uninstalling the plugin.\n\t */\n\t$uninstallable_plugins = (array) get_option('uninstall_plugins');\n\t$uninstallable_plugins[plugin_basename($file)] = $callback;\n\n\tupdate_option('uninstall_plugins', $uninstallable_plugins);\n}\n\n/**\n * Call the 'all' hook, which will process the functions hooked into it.\n *\n * The 'all' hook passes all of the arguments or parameters that were used for\n * the hook, which this function was called for.\n *\n * This function is used internally for apply_filters(), do_action(), and\n * do_action_ref_array() and is not meant to be used from outside those\n * functions. This function does not check for the existence of the all hook, so\n * it will fail unless the all hook exists prior to this function call.\n *\n * @since 2.5.0\n * @access private\n *\n * @global array $wp_filter  Stores all of the filters\n *\n * @param array $args The collected parameters from the hook that was called.\n */\nfunction _wp_call_all_hook($args) {\n\tglobal $wp_filter;\n\n\treset( $wp_filter['all'] );\n\tdo {\n\t\tforeach ( (array) current($wp_filter['all']) as $the_ )\n\t\t\tif ( !is_null($the_['function']) )\n\t\t\t\tcall_user_func_array($the_['function'], $args);\n\n\t} while ( next($wp_filter['all']) !== false );\n}\n\n/**\n * Build Unique ID for storage and retrieval.\n *\n * The old way to serialize the callback caused issues and this function is the\n * solution. It works by checking for objects and creating a new property in\n * the class to keep track of the object and new objects of the same class that\n * need to be added.\n *\n * It also allows for the removal of actions and filters for objects after they\n * change class properties. It is possible to include the property $wp_filter_id\n * in your class and set it to \"null\" or a number to bypass the workaround.\n * However this will prevent you from adding new classes and any new classes\n * will overwrite the previous hook by the same class.\n *\n * Functions and static method callbacks are just returned as strings and\n * shouldn't have any speed penalty.\n *\n * @link https://core.trac.wordpress.org/ticket/3875\n *\n * @since 2.2.3\n * @access private\n *\n * @global array $wp_filter Storage for all of the filters and actions.\n * @staticvar int $filter_id_count\n *\n * @param string   $tag      Used in counting how many hooks were applied\n * @param callable $function Used for creating unique id\n * @param int|bool $priority Used in counting how many hooks were applied. If === false\n *                           and $function is an object reference, we return the unique\n *                           id only if it already has one, false otherwise.\n * @return string|false Unique ID for usage as array key or false if $priority === false\n *                      and $function is an object reference, and it does not already have\n *                      a unique id.\n */\nfunction _wp_filter_build_unique_id($tag, $function, $priority) {\n\tglobal $wp_filter;\n\tstatic $filter_id_count = 0;\n\n\tif ( is_string($function) )\n\t\treturn $function;\n\n\tif ( is_object($function) ) {\n\t\t// Closures are currently implemented as objects\n\t\t$function = array( $function, '' );\n\t} else {\n\t\t$function = (array) $function;\n\t}\n\n\tif (is_object($function[0]) ) {\n\t\t// Object Class Calling\n\t\tif ( function_exists('spl_object_hash') ) {\n\t\t\treturn spl_object_hash($function[0]) . $function[1];\n\t\t} else {\n\t\t\t$obj_idx = get_class($function[0]).$function[1];\n\t\t\tif ( !isset($function[0]->wp_filter_id) ) {\n\t\t\t\tif ( false === $priority )\n\t\t\t\t\treturn false;\n\t\t\t\t$obj_idx .= isset($wp_filter[$tag][$priority]) ? count((array)$wp_filter[$tag][$priority]) : $filter_id_count;\n\t\t\t\t$function[0]->wp_filter_id = $filter_id_count;\n\t\t\t\t++$filter_id_count;\n\t\t\t} else {\n\t\t\t\t$obj_idx .= $function[0]->wp_filter_id;\n\t\t\t}\n\n\t\t\treturn $obj_idx;\n\t\t}\n\t} elseif ( is_string( $function[0] ) ) {\n\t\t// Static Calling\n\t\treturn $function[0] . '::' . $function[1];\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/pomo/entry.php",
    "content": "<?php\n/**\n * Contains Translation_Entry class\n *\n * @version $Id: entry.php 1157 2015-11-20 04:30:11Z dd32 $\n * @package pomo\n * @subpackage entry\n */\n\nif ( ! class_exists( 'Translation_Entry', false ) ):\n/**\n * Translation_Entry class encapsulates a translatable string\n */\nclass Translation_Entry {\n\n\t/**\n\t * Whether the entry contains a string and its plural form, default is false\n\t *\n\t * @var boolean\n\t */\n\tvar $is_plural = false;\n\n\tvar $context = null;\n\tvar $singular = null;\n\tvar $plural = null;\n\tvar $translations = array();\n\tvar $translator_comments = '';\n\tvar $extracted_comments = '';\n\tvar $references = array();\n\tvar $flags = array();\n\n\t/**\n\t * @param array $args associative array, support following keys:\n\t * \t- singular (string) -- the string to translate, if omitted and empty entry will be created\n\t * \t- plural (string) -- the plural form of the string, setting this will set {@link $is_plural} to true\n\t * \t- translations (array) -- translations of the string and possibly -- its plural forms\n\t * \t- context (string) -- a string differentiating two equal strings used in different contexts\n\t * \t- translator_comments (string) -- comments left by translators\n\t * \t- extracted_comments (string) -- comments left by developers\n\t * \t- references (array) -- places in the code this strings is used, in relative_to_root_path/file.php:linenum form\n\t * \t- flags (array) -- flags like php-format\n\t */\n\tfunction __construct( $args = array() ) {\n\t\t// if no singular -- empty object\n\t\tif (!isset($args['singular'])) {\n\t\t\treturn;\n\t\t}\n\t\t// get member variable values from args hash\n\t\tforeach ($args as $varname => $value) {\n\t\t\t$this->$varname = $value;\n\t\t}\n\t\tif (isset($args['plural']) && $args['plural']) $this->is_plural = true;\n\t\tif (!is_array($this->translations)) $this->translations = array();\n\t\tif (!is_array($this->references)) $this->references = array();\n\t\tif (!is_array($this->flags)) $this->flags = array();\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function Translation_Entry( $args = array() ) {\n\t\tself::__construct( $args );\n\t}\n\n\t/**\n\t * Generates a unique key for this entry\n\t *\n\t * @return string|bool the key or false if the entry is empty\n\t */\n\tfunction key() {\n\t\tif ( null === $this->singular || '' === $this->singular ) return false;\n\n\t\t// Prepend context and EOT, like in MO files\n\t\t$key = !$this->context? $this->singular : $this->context.chr(4).$this->singular;\n\t\t// Standardize on \\n line endings\n\t\t$key = str_replace( array( \"\\r\\n\", \"\\r\" ), \"\\n\", $key );\n\n\t\treturn $key;\n\t}\n\n\t/**\n\t * @param object $other\n\t */\n\tfunction merge_with(&$other) {\n\t\t$this->flags = array_unique( array_merge( $this->flags, $other->flags ) );\n\t\t$this->references = array_unique( array_merge( $this->references, $other->references ) );\n\t\tif ( $this->extracted_comments != $other->extracted_comments ) {\n\t\t\t$this->extracted_comments .= $other->extracted_comments;\n\t\t}\n\n\t}\n}\nendif;"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/pomo/mo.php",
    "content": "<?php\n/**\n * Class for working with MO files\n *\n * @version $Id: mo.php 1157 2015-11-20 04:30:11Z dd32 $\n * @package pomo\n * @subpackage mo\n */\n\nrequire_once dirname(__FILE__) . '/translations.php';\nrequire_once dirname(__FILE__) . '/streams.php';\n\nif ( ! class_exists( 'MO', false ) ):\nclass MO extends Gettext_Translations {\n\n\tvar $_nplurals = 2;\n\n\t/**\n\t * Fills up with the entries from MO file $filename\n\t *\n\t * @param string $filename MO file to load\n\t */\n\tfunction import_from_file($filename) {\n\t\t$reader = new POMO_FileReader($filename);\n\t\tif (!$reader->is_resource())\n\t\t\treturn false;\n\t\treturn $this->import_from_reader($reader);\n\t}\n\n\t/**\n\t * @param string $filename\n\t * @return bool\n\t */\n\tfunction export_to_file($filename) {\n\t\t$fh = fopen($filename, 'wb');\n\t\tif ( !$fh ) return false;\n\t\t$res = $this->export_to_file_handle( $fh );\n\t\tfclose($fh);\n\t\treturn $res;\n\t}\n\n\t/**\n\t * @return string|false\n\t */\n\tfunction export() {\n\t\t$tmp_fh = fopen(\"php://temp\", 'r+');\n\t\tif ( !$tmp_fh ) return false;\n\t\t$this->export_to_file_handle( $tmp_fh );\n\t\trewind( $tmp_fh );\n\t\treturn stream_get_contents( $tmp_fh );\n\t}\n\n\t/**\n\t * @param Translation_Entry $entry\n\t * @return bool\n\t */\n\tfunction is_entry_good_for_export( $entry ) {\n\t\tif ( empty( $entry->translations ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !array_filter( $entry->translations ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param resource $fh\n\t * @return true\n\t */\n\tfunction export_to_file_handle($fh) {\n\t\t$entries = array_filter( $this->entries, array( $this, 'is_entry_good_for_export' ) );\n\t\tksort($entries);\n\t\t$magic = 0x950412de;\n\t\t$revision = 0;\n\t\t$total = count($entries) + 1; // all the headers are one entry\n\t\t$originals_lenghts_addr = 28;\n\t\t$translations_lenghts_addr = $originals_lenghts_addr + 8 * $total;\n\t\t$size_of_hash = 0;\n\t\t$hash_addr = $translations_lenghts_addr + 8 * $total;\n\t\t$current_addr = $hash_addr;\n\t\tfwrite($fh, pack('V*', $magic, $revision, $total, $originals_lenghts_addr,\n\t\t\t$translations_lenghts_addr, $size_of_hash, $hash_addr));\n\t\tfseek($fh, $originals_lenghts_addr);\n\n\t\t// headers' msgid is an empty string\n\t\tfwrite($fh, pack('VV', 0, $current_addr));\n\t\t$current_addr++;\n\t\t$originals_table = chr(0);\n\n\t\t$reader = new POMO_Reader();\n\n\t\tforeach($entries as $entry) {\n\t\t\t$originals_table .= $this->export_original($entry) . chr(0);\n\t\t\t$length = $reader->strlen($this->export_original($entry));\n\t\t\tfwrite($fh, pack('VV', $length, $current_addr));\n\t\t\t$current_addr += $length + 1; // account for the NULL byte after\n\t\t}\n\n\t\t$exported_headers = $this->export_headers();\n\t\tfwrite($fh, pack('VV', $reader->strlen($exported_headers), $current_addr));\n\t\t$current_addr += strlen($exported_headers) + 1;\n\t\t$translations_table = $exported_headers . chr(0);\n\n\t\tforeach($entries as $entry) {\n\t\t\t$translations_table .= $this->export_translations($entry) . chr(0);\n\t\t\t$length = $reader->strlen($this->export_translations($entry));\n\t\t\tfwrite($fh, pack('VV', $length, $current_addr));\n\t\t\t$current_addr += $length + 1;\n\t\t}\n\n\t\tfwrite($fh, $originals_table);\n\t\tfwrite($fh, $translations_table);\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param Translation_Entry $entry\n\t * @return string\n\t */\n\tfunction export_original($entry) {\n\t\t//TODO: warnings for control characters\n\t\t$exported = $entry->singular;\n\t\tif ($entry->is_plural) $exported .= chr(0).$entry->plural;\n\t\tif ($entry->context) $exported = $entry->context . chr(4) . $exported;\n\t\treturn $exported;\n\t}\n\n\t/**\n\t * @param Translation_Entry $entry\n\t * @return string\n\t */\n\tfunction export_translations($entry) {\n\t\t//TODO: warnings for control characters\n\t\treturn $entry->is_plural ? implode(chr(0), $entry->translations) : $entry->translations[0];\n\t}\n\n\t/**\n\t * @return string\n\t */\n\tfunction export_headers() {\n\t\t$exported = '';\n\t\tforeach($this->headers as $header => $value) {\n\t\t\t$exported.= \"$header: $value\\n\";\n\t\t}\n\t\treturn $exported;\n\t}\n\n\t/**\n\t * @param int $magic\n\t * @return string|false\n\t */\n\tfunction get_byteorder($magic) {\n\t\t// The magic is 0x950412de\n\n\t\t// bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565\n\t\t$magic_little = (int) - 1794895138;\n\t\t$magic_little_64 = (int) 2500072158;\n\t\t// 0xde120495\n\t\t$magic_big = ((int) - 569244523) & 0xFFFFFFFF;\n\t\tif ($magic_little == $magic || $magic_little_64 == $magic) {\n\t\t\treturn 'little';\n\t\t} else if ($magic_big == $magic) {\n\t\t\treturn 'big';\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * @param POMO_FileReader $reader\n\t */\n\tfunction import_from_reader($reader) {\n\t\t$endian_string = MO::get_byteorder($reader->readint32());\n\t\tif (false === $endian_string) {\n\t\t\treturn false;\n\t\t}\n\t\t$reader->setEndian($endian_string);\n\n\t\t$endian = ('big' == $endian_string)? 'N' : 'V';\n\n\t\t$header = $reader->read(24);\n\t\tif ($reader->strlen($header) != 24)\n\t\t\treturn false;\n\n\t\t// parse header\n\t\t$header = unpack(\"{$endian}revision/{$endian}total/{$endian}originals_lenghts_addr/{$endian}translations_lenghts_addr/{$endian}hash_length/{$endian}hash_addr\", $header);\n\t\tif (!is_array($header))\n\t\t\treturn false;\n\n\t\t// support revision 0 of MO format specs, only\n\t\tif ( $header['revision'] != 0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// seek to data blocks\n\t\t$reader->seekto( $header['originals_lenghts_addr'] );\n\n\t\t// read originals' indices\n\t\t$originals_lengths_length = $header['translations_lenghts_addr'] - $header['originals_lenghts_addr'];\n\t\tif ( $originals_lengths_length != $header['total'] * 8 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$originals = $reader->read($originals_lengths_length);\n\t\tif ( $reader->strlen( $originals ) != $originals_lengths_length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// read translations' indices\n\t\t$translations_lenghts_length = $header['hash_addr'] - $header['translations_lenghts_addr'];\n\t\tif ( $translations_lenghts_length != $header['total'] * 8 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$translations = $reader->read($translations_lenghts_length);\n\t\tif ( $reader->strlen( $translations ) != $translations_lenghts_length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// transform raw data into set of indices\n\t\t$originals    = $reader->str_split( $originals, 8 );\n\t\t$translations = $reader->str_split( $translations, 8 );\n\n\t\t// skip hash table\n\t\t$strings_addr = $header['hash_addr'] + $header['hash_length'] * 4;\n\n\t\t$reader->seekto($strings_addr);\n\n\t\t$strings = $reader->read_all();\n\t\t$reader->close();\n\n\t\tfor ( $i = 0; $i < $header['total']; $i++ ) {\n\t\t\t$o = unpack( \"{$endian}length/{$endian}pos\", $originals[$i] );\n\t\t\t$t = unpack( \"{$endian}length/{$endian}pos\", $translations[$i] );\n\t\t\tif ( !$o || !$t ) return false;\n\n\t\t\t// adjust offset due to reading strings to separate space before\n\t\t\t$o['pos'] -= $strings_addr;\n\t\t\t$t['pos'] -= $strings_addr;\n\n\t\t\t$original    = $reader->substr( $strings, $o['pos'], $o['length'] );\n\t\t\t$translation = $reader->substr( $strings, $t['pos'], $t['length'] );\n\n\t\t\tif ('' === $original) {\n\t\t\t\t$this->set_headers($this->make_headers($translation));\n\t\t\t} else {\n\t\t\t\t$entry = &$this->make_entry($original, $translation);\n\t\t\t\t$this->entries[$entry->key()] = &$entry;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Build a Translation_Entry from original string and translation strings,\n\t * found in a MO file\n\t *\n\t * @static\n\t * @param string $original original string to translate from MO file. Might contain\n\t * \t0x04 as context separator or 0x00 as singular/plural separator\n\t * @param string $translation translation string from MO file. Might contain\n\t * \t0x00 as a plural translations separator\n\t */\n\tfunction &make_entry($original, $translation) {\n\t\t$entry = new Translation_Entry();\n\t\t// look for context\n\t\t$parts = explode(chr(4), $original);\n\t\tif (isset($parts[1])) {\n\t\t\t$original = $parts[1];\n\t\t\t$entry->context = $parts[0];\n\t\t}\n\t\t// look for plural original\n\t\t$parts = explode(chr(0), $original);\n\t\t$entry->singular = $parts[0];\n\t\tif (isset($parts[1])) {\n\t\t\t$entry->is_plural = true;\n\t\t\t$entry->plural = $parts[1];\n\t\t}\n\t\t// plural translations are also separated by \\0\n\t\t$entry->translations = explode(chr(0), $translation);\n\t\treturn $entry;\n\t}\n\n\t/**\n\t * @param int $count\n\t * @return string\n\t */\n\tfunction select_plural_form($count) {\n\t\treturn $this->gettext_select_plural_form($count);\n\t}\n\n\t/**\n\t * @return int\n\t */\n\tfunction get_plural_forms_count() {\n\t\treturn $this->_nplurals;\n\t}\n}\nendif;"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/pomo/po.php",
    "content": "<?php\n/**\n * Class for working with PO files\n *\n * @version $Id: po.php 1158 2015-11-20 04:31:23Z dd32 $\n * @package pomo\n * @subpackage po\n */\n\nrequire_once dirname(__FILE__) . '/translations.php';\n\nif ( ! defined( 'PO_MAX_LINE_LEN' ) ) {\n\tdefine('PO_MAX_LINE_LEN', 79);\n}\n\nini_set('auto_detect_line_endings', 1);\n\n/**\n * Routines for working with PO files\n */\nif ( ! class_exists( 'PO', false ) ):\nclass PO extends Gettext_Translations {\n\n\tvar $comments_before_headers = '';\n\n\t/**\n\t * Exports headers to a PO entry\n\t *\n\t * @return string msgid/msgstr PO entry for this PO file headers, doesn't contain newline at the end\n\t */\n\tfunction export_headers() {\n\t\t$header_string = '';\n\t\tforeach($this->headers as $header => $value) {\n\t\t\t$header_string.= \"$header: $value\\n\";\n\t\t}\n\t\t$poified = PO::poify($header_string);\n\t\tif ($this->comments_before_headers)\n\t\t\t$before_headers = $this->prepend_each_line(rtrim($this->comments_before_headers).\"\\n\", '# ');\n\t\telse\n\t\t\t$before_headers = '';\n\t\treturn rtrim(\"{$before_headers}msgid \\\"\\\"\\nmsgstr $poified\");\n\t}\n\n\t/**\n\t * Exports all entries to PO format\n\t *\n\t * @return string sequence of mgsgid/msgstr PO strings, doesn't containt newline at the end\n\t */\n\tfunction export_entries() {\n\t\t//TODO sorting\n\t\treturn implode(\"\\n\\n\", array_map(array('PO', 'export_entry'), $this->entries));\n\t}\n\n\t/**\n\t * Exports the whole PO file as a string\n\t *\n\t * @param bool $include_headers whether to include the headers in the export\n\t * @return string ready for inclusion in PO file string for headers and all the enrtries\n\t */\n\tfunction export($include_headers = true) {\n\t\t$res = '';\n\t\tif ($include_headers) {\n\t\t\t$res .= $this->export_headers();\n\t\t\t$res .= \"\\n\\n\";\n\t\t}\n\t\t$res .= $this->export_entries();\n\t\treturn $res;\n\t}\n\n\t/**\n\t * Same as {@link export}, but writes the result to a file\n\t *\n\t * @param string $filename where to write the PO string\n\t * @param bool $include_headers whether to include tje headers in the export\n\t * @return bool true on success, false on error\n\t */\n\tfunction export_to_file($filename, $include_headers = true) {\n\t\t$fh = fopen($filename, 'w');\n\t\tif (false === $fh) return false;\n\t\t$export = $this->export($include_headers);\n\t\t$res = fwrite($fh, $export);\n\t\tif (false === $res) return false;\n\t\treturn fclose($fh);\n\t}\n\n\t/**\n\t * Text to include as a comment before the start of the PO contents\n\t *\n\t * Doesn't need to include # in the beginning of lines, these are added automatically\n\t */\n\tfunction set_comment_before_headers( $text ) {\n\t\t$this->comments_before_headers = $text;\n\t}\n\n\t/**\n\t * Formats a string in PO-style\n\t *\n\t * @static\n\t * @param string $string the string to format\n\t * @return string the poified string\n\t */\n\tpublic static function poify($string) {\n\t\t$quote = '\"';\n\t\t$slash = '\\\\';\n\t\t$newline = \"\\n\";\n\n\t\t$replaces = array(\n\t\t\t\"$slash\" \t=> \"$slash$slash\",\n\t\t\t\"$quote\"\t=> \"$slash$quote\",\n\t\t\t\"\\t\" \t\t=> '\\t',\n\t\t);\n\n\t\t$string = str_replace(array_keys($replaces), array_values($replaces), $string);\n\n\t\t$po = $quote.implode(\"${slash}n$quote$newline$quote\", explode($newline, $string)).$quote;\n\t\t// add empty string on first line for readbility\n\t\tif (false !== strpos($string, $newline) &&\n\t\t\t\t(substr_count($string, $newline) > 1 || !($newline === substr($string, -strlen($newline))))) {\n\t\t\t$po = \"$quote$quote$newline$po\";\n\t\t}\n\t\t// remove empty strings\n\t\t$po = str_replace(\"$newline$quote$quote\", '', $po);\n\t\treturn $po;\n\t}\n\n\t/**\n\t * Gives back the original string from a PO-formatted string\n\t *\n\t * @static\n\t * @param string $string PO-formatted string\n\t * @return string enascaped string\n\t */\n\tpublic static function unpoify($string) {\n\t\t$escapes = array('t' => \"\\t\", 'n' => \"\\n\", 'r' => \"\\r\", '\\\\' => '\\\\');\n\t\t$lines = array_map('trim', explode(\"\\n\", $string));\n\t\t$lines = array_map(array('PO', 'trim_quotes'), $lines);\n\t\t$unpoified = '';\n\t\t$previous_is_backslash = false;\n\t\tforeach($lines as $line) {\n\t\t\tpreg_match_all('/./u', $line, $chars);\n\t\t\t$chars = $chars[0];\n\t\t\tforeach($chars as $char) {\n\t\t\t\tif (!$previous_is_backslash) {\n\t\t\t\t\tif ('\\\\' == $char)\n\t\t\t\t\t\t$previous_is_backslash = true;\n\t\t\t\t\telse\n\t\t\t\t\t\t$unpoified .= $char;\n\t\t\t\t} else {\n\t\t\t\t\t$previous_is_backslash = false;\n\t\t\t\t\t$unpoified .= isset($escapes[$char])? $escapes[$char] : $char;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Standardise the line endings on imported content, technically PO files shouldn't contain \\r\n\t\t$unpoified = str_replace( array( \"\\r\\n\", \"\\r\" ), \"\\n\", $unpoified );\n\n\t\treturn $unpoified;\n\t}\n\n\t/**\n\t * Inserts $with in the beginning of every new line of $string and\n\t * returns the modified string\n\t *\n\t * @static\n\t * @param string $string prepend lines in this string\n\t * @param string $with prepend lines with this string\n\t */\n\tpublic static function prepend_each_line($string, $with) {\n\t\t$php_with = var_export($with, true);\n\t\t$lines = explode(\"\\n\", $string);\n\t\t// do not prepend the string on the last empty line, artefact by explode\n\t\tif (\"\\n\" == substr($string, -1)) unset($lines[count($lines) - 1]);\n\t\t$res = implode(\"\\n\", array_map(create_function('$x', \"return $php_with.\\$x;\"), $lines));\n\t\t// give back the empty line, we ignored above\n\t\tif (\"\\n\" == substr($string, -1)) $res .= \"\\n\";\n\t\treturn $res;\n\t}\n\n\t/**\n\t * Prepare a text as a comment -- wraps the lines and prepends #\n\t * and a special character to each line\n\t *\n\t * @access private\n\t * @param string $text the comment text\n\t * @param string $char character to denote a special PO comment,\n\t * \tlike :, default is a space\n\t */\n\tpublic static function comment_block($text, $char=' ') {\n\t\t$text = wordwrap($text, PO_MAX_LINE_LEN - 3);\n\t\treturn PO::prepend_each_line($text, \"#$char \");\n\t}\n\n\t/**\n\t * Builds a string from the entry for inclusion in PO file\n\t *\n\t * @static\n\t * @param Translation_Entry &$entry the entry to convert to po string\n\t * @return false|string PO-style formatted string for the entry or\n\t * \tfalse if the entry is empty\n\t */\n\tpublic static function export_entry(&$entry) {\n\t\tif ( null === $entry->singular || '' === $entry->singular ) return false;\n\t\t$po = array();\n\t\tif (!empty($entry->translator_comments)) $po[] = PO::comment_block($entry->translator_comments);\n\t\tif (!empty($entry->extracted_comments)) $po[] = PO::comment_block($entry->extracted_comments, '.');\n\t\tif (!empty($entry->references)) $po[] = PO::comment_block(implode(' ', $entry->references), ':');\n\t\tif (!empty($entry->flags)) $po[] = PO::comment_block(implode(\", \", $entry->flags), ',');\n\t\tif ($entry->context) $po[] = 'msgctxt '.PO::poify($entry->context);\n\t\t$po[] = 'msgid '.PO::poify($entry->singular);\n\t\tif (!$entry->is_plural) {\n\t\t\t$translation = empty($entry->translations)? '' : $entry->translations[0];\n\t\t\t$translation = PO::match_begin_and_end_newlines( $translation, $entry->singular );\n\t\t\t$po[] = 'msgstr '.PO::poify($translation);\n\t\t} else {\n\t\t\t$po[] = 'msgid_plural '.PO::poify($entry->plural);\n\t\t\t$translations = empty($entry->translations)? array('', '') : $entry->translations;\n\t\t\tforeach($translations as $i => $translation) {\n\t\t\t\t$translation = PO::match_begin_and_end_newlines( $translation, $entry->plural );\n\t\t\t\t$po[] = \"msgstr[$i] \".PO::poify($translation);\n\t\t\t}\n\t\t}\n\t\treturn implode(\"\\n\", $po);\n\t}\n\n\tpublic static function match_begin_and_end_newlines( $translation, $original ) {\n\t\tif ( '' === $translation ) {\n\t\t\treturn $translation;\n\t\t}\n\n\t\t$original_begin = \"\\n\" === substr( $original, 0, 1 );\n\t\t$original_end = \"\\n\" === substr( $original, -1 );\n\t\t$translation_begin = \"\\n\" === substr( $translation, 0, 1 );\n\t\t$translation_end = \"\\n\" === substr( $translation, -1 );\n\n\t\tif ( $original_begin ) {\n\t\t\tif ( ! $translation_begin ) {\n\t\t\t\t$translation = \"\\n\" . $translation;\n\t\t\t}\n\t\t} elseif ( $translation_begin ) {\n\t\t\t$translation = ltrim( $translation, \"\\n\" );\n\t\t}\n\n\t\tif ( $original_end ) {\n\t\t\tif ( ! $translation_end ) {\n\t\t\t\t$translation .= \"\\n\";\n\t\t\t}\n\t\t} elseif ( $translation_end ) {\n\t\t\t$translation = rtrim( $translation, \"\\n\" );\n\t\t}\n\n\t\treturn $translation;\n\t}\n\n\t/**\n\t * @param string $filename\n\t * @return boolean\n\t */\n\tfunction import_from_file($filename) {\n\t\t$f = fopen($filename, 'r');\n\t\tif (!$f) return false;\n\t\t$lineno = 0;\n\t\twhile (true) {\n\t\t\t$res = $this->read_entry($f, $lineno);\n\t\t\tif (!$res) break;\n\t\t\tif ($res['entry']->singular == '') {\n\t\t\t\t$this->set_headers($this->make_headers($res['entry']->translations[0]));\n\t\t\t} else {\n\t\t\t\t$this->add_entry($res['entry']);\n\t\t\t}\n\t\t}\n\t\tPO::read_line($f, 'clear');\n\t\tif ( false === $res ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( ! $this->headers && ! $this->entries ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param resource $f\n\t * @param int      $lineno\n\t * @return null|false|array\n\t */\n\tfunction read_entry($f, $lineno = 0) {\n\t\t$entry = new Translation_Entry();\n\t\t// where were we in the last step\n\t\t// can be: comment, msgctxt, msgid, msgid_plural, msgstr, msgstr_plural\n\t\t$context = '';\n\t\t$msgstr_index = 0;\n\t\t$is_final = create_function('$context', 'return $context == \"msgstr\" || $context == \"msgstr_plural\";');\n\t\twhile (true) {\n\t\t\t$lineno++;\n\t\t\t$line = PO::read_line($f);\n\t\t\tif (!$line)  {\n\t\t\t\tif (feof($f)) {\n\t\t\t\t\tif ($is_final($context))\n\t\t\t\t\t\tbreak;\n\t\t\t\t\telseif (!$context) // we haven't read a line and eof came\n\t\t\t\t\t\treturn null;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ($line == \"\\n\") continue;\n\t\t\t$line = trim($line);\n\t\t\tif (preg_match('/^#/', $line, $m)) {\n\t\t\t\t// the comment is the start of a new entry\n\t\t\t\tif ($is_final($context)) {\n\t\t\t\t\tPO::read_line($f, 'put-back');\n\t\t\t\t\t$lineno--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// comments have to be at the beginning\n\t\t\t\tif ($context && $context != 'comment') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// add comment\n\t\t\t\t$this->add_comment_to_entry($entry, $line);\n\t\t\t} elseif (preg_match('/^msgctxt\\s+(\".*\")/', $line, $m)) {\n\t\t\t\tif ($is_final($context)) {\n\t\t\t\t\tPO::read_line($f, 'put-back');\n\t\t\t\t\t$lineno--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ($context && $context != 'comment') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$context = 'msgctxt';\n\t\t\t\t$entry->context .= PO::unpoify($m[1]);\n\t\t\t} elseif (preg_match('/^msgid\\s+(\".*\")/', $line, $m)) {\n\t\t\t\tif ($is_final($context)) {\n\t\t\t\t\tPO::read_line($f, 'put-back');\n\t\t\t\t\t$lineno--;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ($context && $context != 'msgctxt' && $context != 'comment') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$context = 'msgid';\n\t\t\t\t$entry->singular .= PO::unpoify($m[1]);\n\t\t\t} elseif (preg_match('/^msgid_plural\\s+(\".*\")/', $line, $m)) {\n\t\t\t\tif ($context != 'msgid') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$context = 'msgid_plural';\n\t\t\t\t$entry->is_plural = true;\n\t\t\t\t$entry->plural .= PO::unpoify($m[1]);\n\t\t\t} elseif (preg_match('/^msgstr\\s+(\".*\")/', $line, $m)) {\n\t\t\t\tif ($context != 'msgid') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$context = 'msgstr';\n\t\t\t\t$entry->translations = array(PO::unpoify($m[1]));\n\t\t\t} elseif (preg_match('/^msgstr\\[(\\d+)\\]\\s+(\".*\")/', $line, $m)) {\n\t\t\t\tif ($context != 'msgid_plural' && $context != 'msgstr_plural') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t$context = 'msgstr_plural';\n\t\t\t\t$msgstr_index = $m[1];\n\t\t\t\t$entry->translations[$m[1]] = PO::unpoify($m[2]);\n\t\t\t} elseif (preg_match('/^\".*\"$/', $line)) {\n\t\t\t\t$unpoified = PO::unpoify($line);\n\t\t\t\tswitch ($context) {\n\t\t\t\t\tcase 'msgid':\n\t\t\t\t\t\t$entry->singular .= $unpoified; break;\n\t\t\t\t\tcase 'msgctxt':\n\t\t\t\t\t\t$entry->context .= $unpoified; break;\n\t\t\t\t\tcase 'msgid_plural':\n\t\t\t\t\t\t$entry->plural .= $unpoified; break;\n\t\t\t\t\tcase 'msgstr':\n\t\t\t\t\t\t$entry->translations[0] .= $unpoified; break;\n\t\t\t\t\tcase 'msgstr_plural':\n\t\t\t\t\t\t$entry->translations[$msgstr_index] .= $unpoified; break;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif (array() == array_filter($entry->translations, create_function('$t', 'return $t || \"0\" === $t;'))) {\n\t\t\t$entry->translations = array();\n\t\t}\n\t\treturn array('entry' => $entry, 'lineno' => $lineno);\n\t}\n\n\t/**\n\t * @staticvar string   $last_line\n\t * @staticvar boolean  $use_last_line\n\t *\n\t * @param     resource $f\n\t * @param     string   $action\n\t * @return boolean\n\t */\n\tfunction read_line($f, $action = 'read') {\n\t\tstatic $last_line = '';\n\t\tstatic $use_last_line = false;\n\t\tif ('clear' == $action) {\n\t\t\t$last_line = '';\n\t\t\treturn true;\n\t\t}\n\t\tif ('put-back' == $action) {\n\t\t\t$use_last_line = true;\n\t\t\treturn true;\n\t\t}\n\t\t$line = $use_last_line? $last_line : fgets($f);\n\t\t$line = ( \"\\r\\n\" == substr( $line, -2 ) ) ? rtrim( $line, \"\\r\\n\" ) . \"\\n\" : $line;\n\t\t$last_line = $line;\n\t\t$use_last_line = false;\n\t\treturn $line;\n\t}\n\n\t/**\n\t * @param Translation_Entry $entry\n\t * @param string            $po_comment_line\n\t */\n\tfunction add_comment_to_entry(&$entry, $po_comment_line) {\n\t\t$first_two = substr($po_comment_line, 0, 2);\n\t\t$comment = trim(substr($po_comment_line, 2));\n\t\tif ('#:' == $first_two) {\n\t\t\t$entry->references = array_merge($entry->references, preg_split('/\\s+/', $comment));\n\t\t} elseif ('#.' == $first_two) {\n\t\t\t$entry->extracted_comments = trim($entry->extracted_comments . \"\\n\" . $comment);\n\t\t} elseif ('#,' == $first_two) {\n\t\t\t$entry->flags = array_merge($entry->flags, preg_split('/,\\s*/', $comment));\n\t\t} else {\n\t\t\t$entry->translator_comments = trim($entry->translator_comments . \"\\n\" . $comment);\n\t\t}\n\t}\n\n\t/**\n\t * @param string $s\n\t * @return sring\n\t */\n\tpublic static function trim_quotes($s) {\n\t\tif ( substr($s, 0, 1) == '\"') $s = substr($s, 1);\n\t\tif ( substr($s, -1, 1) == '\"') $s = substr($s, 0, -1);\n\t\treturn $s;\n\t}\n}\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/pomo/streams.php",
    "content": "<?php\n/**\n * Classes, which help reading streams of data from files.\n * Based on the classes from Danilo Segan <danilo@kvota.net>\n *\n * @version $Id: streams.php 1157 2015-11-20 04:30:11Z dd32 $\n * @package pomo\n * @subpackage streams\n */\n\nif ( ! class_exists( 'POMO_Reader', false ) ):\nclass POMO_Reader {\n\n\tvar $endian = 'little';\n\tvar $_post = '';\n\n\t/**\n\t * PHP5 constructor.\n\t */\n\tfunction __construct() {\n\t\t$this->is_overloaded = ((ini_get(\"mbstring.func_overload\") & 2) != 0) && function_exists('mb_substr');\n\t\t$this->_pos = 0;\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function POMO_Reader() {\n\t\tself::__construct();\n\t}\n\n\t/**\n\t * Sets the endianness of the file.\n\t *\n\t * @param $endian string 'big' or 'little'\n\t */\n\tfunction setEndian($endian) {\n\t\t$this->endian = $endian;\n\t}\n\n\t/**\n\t * Reads a 32bit Integer from the Stream\n\t *\n\t * @return mixed The integer, corresponding to the next 32 bits from\n\t * \tthe stream of false if there are not enough bytes or on error\n\t */\n\tfunction readint32() {\n\t\t$bytes = $this->read(4);\n\t\tif (4 != $this->strlen($bytes))\n\t\t\treturn false;\n\t\t$endian_letter = ('big' == $this->endian)? 'N' : 'V';\n\t\t$int = unpack($endian_letter, $bytes);\n\t\treturn reset( $int );\n\t}\n\n\t/**\n\t * Reads an array of 32-bit Integers from the Stream\n\t *\n\t * @param integer count How many elements should be read\n\t * @return mixed Array of integers or false if there isn't\n\t * \tenough data or on error\n\t */\n\tfunction readint32array($count) {\n\t\t$bytes = $this->read(4 * $count);\n\t\tif (4*$count != $this->strlen($bytes))\n\t\t\treturn false;\n\t\t$endian_letter = ('big' == $this->endian)? 'N' : 'V';\n\t\treturn unpack($endian_letter.$count, $bytes);\n\t}\n\n\t/**\n\t * @param string $string\n\t * @param int    $start\n\t * @param int    $length\n\t * @return string\n\t */\n\tfunction substr($string, $start, $length) {\n\t\tif ($this->is_overloaded) {\n\t\t\treturn mb_substr($string, $start, $length, 'ascii');\n\t\t} else {\n\t\t\treturn substr($string, $start, $length);\n\t\t}\n\t}\n\n\t/**\n\t * @param string $string\n\t * @return int\n\t */\n\tfunction strlen($string) {\n\t\tif ($this->is_overloaded) {\n\t\t\treturn mb_strlen($string, 'ascii');\n\t\t} else {\n\t\t\treturn strlen($string);\n\t\t}\n\t}\n\n\t/**\n\t * @param string $string\n\t * @param int    $chunk_size\n\t * @return array\n\t */\n\tfunction str_split($string, $chunk_size) {\n\t\tif (!function_exists('str_split')) {\n\t\t\t$length = $this->strlen($string);\n\t\t\t$out = array();\n\t\t\tfor ($i = 0; $i < $length; $i += $chunk_size)\n\t\t\t\t$out[] = $this->substr($string, $i, $chunk_size);\n\t\t\treturn $out;\n\t\t} else {\n\t\t\treturn str_split( $string, $chunk_size );\n\t\t}\n\t}\n\n\t/**\n\t * @return int\n\t */\n\tfunction pos() {\n\t\treturn $this->_pos;\n\t}\n\n\t/**\n\t * @return true\n\t */\n\tfunction is_resource() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * @return true\n\t */\n\tfunction close() {\n\t\treturn true;\n\t}\n}\nendif;\n\nif ( ! class_exists( 'POMO_FileReader', false ) ):\nclass POMO_FileReader extends POMO_Reader {\n\n\t/**\n\t * @param string $filename\n\t */\n\tfunction __construct( $filename ) {\n\t\tparent::POMO_Reader();\n\t\t$this->_f = fopen($filename, 'rb');\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function POMO_FileReader( $filename ) {\n\t\tself::__construct( $filename );\n\t}\n\n\t/**\n\t * @param int $bytes\n\t */\n\tfunction read($bytes) {\n\t\treturn fread($this->_f, $bytes);\n\t}\n\n\t/**\n\t * @param int $pos\n\t * @return boolean\n\t */\n\tfunction seekto($pos) {\n\t\tif ( -1 == fseek($this->_f, $pos, SEEK_SET)) {\n\t\t\treturn false;\n\t\t}\n\t\t$this->_pos = $pos;\n\t\treturn true;\n\t}\n\n\t/**\n\t * @return bool\n\t */\n\tfunction is_resource() {\n\t\treturn is_resource($this->_f);\n\t}\n\n\t/**\n\t * @return bool\n\t */\n\tfunction feof() {\n\t\treturn feof($this->_f);\n\t}\n\n\t/**\n\t * @return bool\n\t */\n\tfunction close() {\n\t\treturn fclose($this->_f);\n\t}\n\n\t/**\n\t * @return string\n\t */\n\tfunction read_all() {\n\t\t$all = '';\n\t\twhile ( !$this->feof() )\n\t\t\t$all .= $this->read(4096);\n\t\treturn $all;\n\t}\n}\nendif;\n\nif ( ! class_exists( 'POMO_StringReader', false ) ):\n/**\n * Provides file-like methods for manipulating a string instead\n * of a physical file.\n */\nclass POMO_StringReader extends POMO_Reader {\n\n\tvar $_str = '';\n\n\t/**\n\t * PHP5 constructor.\n\t */\n\tfunction __construct( $str = '' ) {\n\t\tparent::POMO_Reader();\n\t\t$this->_str = $str;\n\t\t$this->_pos = 0;\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function POMO_StringReader( $str = '' ) {\n\t\tself::__construct( $str );\n\t}\n\n\t/**\n\t * @param string $bytes\n\t * @return string\n\t */\n\tfunction read($bytes) {\n\t\t$data = $this->substr($this->_str, $this->_pos, $bytes);\n\t\t$this->_pos += $bytes;\n\t\tif ($this->strlen($this->_str) < $this->_pos) $this->_pos = $this->strlen($this->_str);\n\t\treturn $data;\n\t}\n\n\t/**\n\t * @param int $pos\n\t * @return int\n\t */\n\tfunction seekto($pos) {\n\t\t$this->_pos = $pos;\n\t\tif ($this->strlen($this->_str) < $this->_pos) $this->_pos = $this->strlen($this->_str);\n\t\treturn $this->_pos;\n\t}\n\n\t/**\n\t * @return int\n\t */\n\tfunction length() {\n\t\treturn $this->strlen($this->_str);\n\t}\n\n\t/**\n\t * @return string\n\t */\n\tfunction read_all() {\n\t\treturn $this->substr($this->_str, $this->_pos, $this->strlen($this->_str));\n\t}\n\n}\nendif;\n\nif ( ! class_exists( 'POMO_CachedFileReader', false ) ):\n/**\n * Reads the contents of the file in the beginning.\n */\nclass POMO_CachedFileReader extends POMO_StringReader {\n\t/**\n\t * PHP5 constructor.\n\t */\n\tfunction __construct( $filename ) {\n\t\tparent::POMO_StringReader();\n\t\t$this->_str = file_get_contents($filename);\n\t\tif (false === $this->_str)\n\t\t\treturn false;\n\t\t$this->_pos = 0;\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function POMO_CachedFileReader( $filename ) {\n\t\tself::__construct( $filename );\n\t}\n}\nendif;\n\nif ( ! class_exists( 'POMO_CachedIntFileReader', false ) ):\n/**\n * Reads the contents of the file in the beginning.\n */\nclass POMO_CachedIntFileReader extends POMO_CachedFileReader {\n\t/**\n\t * PHP5 constructor.\n\t */\n\tpublic function __construct( $filename ) {\n\t\tparent::POMO_CachedFileReader($filename);\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tfunction POMO_CachedIntFileReader( $filename ) {\n\t\tself::__construct( $filename );\n\t}\n}\nendif;\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/pomo/translations.php",
    "content": "<?php\n/**\n * Class for a set of entries for translation and their associated headers\n *\n * @version $Id: translations.php 1157 2015-11-20 04:30:11Z dd32 $\n * @package pomo\n * @subpackage translations\n */\n\nrequire_once dirname(__FILE__) . '/entry.php';\n\nif ( ! class_exists( 'Translations', false ) ):\nclass Translations {\n\tvar $entries = array();\n\tvar $headers = array();\n\n\t/**\n\t * Add entry to the PO structure\n\t *\n\t * @param array|Translation_Entry &$entry\n\t * @return bool true on success, false if the entry doesn't have a key\n\t */\n\tfunction add_entry($entry) {\n\t\tif (is_array($entry)) {\n\t\t\t$entry = new Translation_Entry($entry);\n\t\t}\n\t\t$key = $entry->key();\n\t\tif (false === $key) return false;\n\t\t$this->entries[$key] = &$entry;\n\t\treturn true;\n\t}\n\n\t/**\n\t * @param array|Translation_Entry $entry\n\t * @return bool\n\t */\n\tfunction add_entry_or_merge($entry) {\n\t\tif (is_array($entry)) {\n\t\t\t$entry = new Translation_Entry($entry);\n\t\t}\n\t\t$key = $entry->key();\n\t\tif (false === $key) return false;\n\t\tif (isset($this->entries[$key]))\n\t\t\t$this->entries[$key]->merge_with($entry);\n\t\telse\n\t\t\t$this->entries[$key] = &$entry;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets $header PO header to $value\n\t *\n\t * If the header already exists, it will be overwritten\n\t *\n\t * TODO: this should be out of this class, it is gettext specific\n\t *\n\t * @param string $header header name, without trailing :\n\t * @param string $value header value, without trailing \\n\n\t */\n\tfunction set_header($header, $value) {\n\t\t$this->headers[$header] = $value;\n\t}\n\n\t/**\n\t * @param array $headers\n\t */\n\tfunction set_headers($headers) {\n\t\tforeach($headers as $header => $value) {\n\t\t\t$this->set_header($header, $value);\n\t\t}\n\t}\n\n\t/**\n\t * @param string $header\n\t */\n\tfunction get_header($header) {\n\t\treturn isset($this->headers[$header])? $this->headers[$header] : false;\n\t}\n\n\t/**\n\t * @param Translation_Entry $entry\n\t */\n\tfunction translate_entry(&$entry) {\n\t\t$key = $entry->key();\n\t\treturn isset($this->entries[$key])? $this->entries[$key] : false;\n\t}\n\n\t/**\n\t * @param string $singular\n\t * @param string $context\n\t * @return string\n\t */\n\tfunction translate($singular, $context=null) {\n\t\t$entry = new Translation_Entry(array('singular' => $singular, 'context' => $context));\n\t\t$translated = $this->translate_entry($entry);\n\t\treturn ($translated && !empty($translated->translations))? $translated->translations[0] : $singular;\n\t}\n\n\t/**\n\t * Given the number of items, returns the 0-based index of the plural form to use\n\t *\n\t * Here, in the base Translations class, the common logic for English is implemented:\n\t * \t0 if there is one element, 1 otherwise\n\t *\n\t * This function should be overrided by the sub-classes. For example MO/PO can derive the logic\n\t * from their headers.\n\t *\n\t * @param integer $count number of items\n\t */\n\tfunction select_plural_form($count) {\n\t\treturn 1 == $count? 0 : 1;\n\t}\n\n\t/**\n\t * @return int\n\t */\n\tfunction get_plural_forms_count() {\n\t\treturn 2;\n\t}\n\n\t/**\n\t * @param string $singular\n\t * @param string $plural\n\t * @param int    $count\n\t * @param string $context\n\t */\n\tfunction translate_plural($singular, $plural, $count, $context = null) {\n\t\t$entry = new Translation_Entry(array('singular' => $singular, 'plural' => $plural, 'context' => $context));\n\t\t$translated = $this->translate_entry($entry);\n\t\t$index = $this->select_plural_form($count);\n\t\t$total_plural_forms = $this->get_plural_forms_count();\n\t\tif ($translated && 0 <= $index && $index < $total_plural_forms &&\n\t\t\t\tis_array($translated->translations) &&\n\t\t\t\tisset($translated->translations[$index]))\n\t\t\treturn $translated->translations[$index];\n\t\telse\n\t\t\treturn 1 == $count? $singular : $plural;\n\t}\n\n\t/**\n\t * Merge $other in the current object.\n\t *\n\t * @param Object &$other Another Translation object, whose translations will be merged in this one\n\t * @return void\n\t **/\n\tfunction merge_with(&$other) {\n\t\tforeach( $other->entries as $entry ) {\n\t\t\t$this->entries[$entry->key()] = $entry;\n\t\t}\n\t}\n\n\t/**\n\t * @param object $other\n\t */\n\tfunction merge_originals_with(&$other) {\n\t\tforeach( $other->entries as $entry ) {\n\t\t\tif ( !isset( $this->entries[$entry->key()] ) )\n\t\t\t\t$this->entries[$entry->key()] = $entry;\n\t\t\telse\n\t\t\t\t$this->entries[$entry->key()]->merge_with($entry);\n\t\t}\n\t}\n}\n\nclass Gettext_Translations extends Translations {\n\t/**\n\t * The gettext implementation of select_plural_form.\n\t *\n\t * It lives in this class, because there are more than one descendand, which will use it and\n\t * they can't share it effectively.\n\t *\n\t * @param int $count\n\t */\n\tfunction gettext_select_plural_form($count) {\n\t\tif (!isset($this->_gettext_select_plural_form) || is_null($this->_gettext_select_plural_form)) {\n\t\t\tlist( $nplurals, $expression ) = $this->nplurals_and_expression_from_header($this->get_header('Plural-Forms'));\n\t\t\t$this->_nplurals = $nplurals;\n\t\t\t$this->_gettext_select_plural_form = $this->make_plural_form_function($nplurals, $expression);\n\t\t}\n\t\treturn call_user_func($this->_gettext_select_plural_form, $count);\n\t}\n\n\t/**\n\t * @param string $header\n\t * @return array\n\t */\n\tfunction nplurals_and_expression_from_header($header) {\n\t\tif (preg_match('/^\\s*nplurals\\s*=\\s*(\\d+)\\s*;\\s+plural\\s*=\\s*(.+)$/', $header, $matches)) {\n\t\t\t$nplurals = (int)$matches[1];\n\t\t\t$expression = trim($this->parenthesize_plural_exression($matches[2]));\n\t\t\treturn array($nplurals, $expression);\n\t\t} else {\n\t\t\treturn array(2, 'n != 1');\n\t\t}\n\t}\n\n\t/**\n\t * Makes a function, which will return the right translation index, according to the\n\t * plural forms header\n\t * @param int    $nplurals\n\t * @param string $expression\n\t */\n\tfunction make_plural_form_function($nplurals, $expression) {\n\t\t$expression = str_replace('n', '$n', $expression);\n\t\t$func_body = \"\n\t\t\t\\$index = (int)($expression);\n\t\t\treturn (\\$index < $nplurals)? \\$index : $nplurals - 1;\";\n\t\treturn create_function('$n', $func_body);\n\t}\n\n\t/**\n\t * Adds parentheses to the inner parts of ternary operators in\n\t * plural expressions, because PHP evaluates ternary oerators from left to right\n\t *\n\t * @param string $expression the expression without parentheses\n\t * @return string the expression with parentheses added\n\t */\n\tfunction parenthesize_plural_exression($expression) {\n\t\t$expression .= ';';\n\t\t$res = '';\n\t\t$depth = 0;\n\t\tfor ($i = 0; $i < strlen($expression); ++$i) {\n\t\t\t$char = $expression[$i];\n\t\t\tswitch ($char) {\n\t\t\t\tcase '?':\n\t\t\t\t\t$res .= ' ? (';\n\t\t\t\t\t$depth++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ':':\n\t\t\t\t\t$res .= ') : (';\n\t\t\t\t\tbreak;\n\t\t\t\tcase ';':\n\t\t\t\t\t$res .= str_repeat(')', $depth) . ';';\n\t\t\t\t\t$depth= 0;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$res .= $char;\n\t\t\t}\n\t\t}\n\t\treturn rtrim($res, ';');\n\t}\n\n\t/**\n\t * @param string $translation\n\t * @return array\n\t */\n\tfunction make_headers($translation) {\n\t\t$headers = array();\n\t\t// sometimes \\ns are used instead of real new lines\n\t\t$translation = str_replace('\\n', \"\\n\", $translation);\n\t\t$lines = explode(\"\\n\", $translation);\n\t\tforeach($lines as $line) {\n\t\t\t$parts = explode(':', $line, 2);\n\t\t\tif (!isset($parts[1])) continue;\n\t\t\t$headers[trim($parts[0])] = trim($parts[1]);\n\t\t}\n\t\treturn $headers;\n\t}\n\n\t/**\n\t * @param string $header\n\t * @param string $value\n\t */\n\tfunction set_header($header, $value) {\n\t\tparent::set_header($header, $value);\n\t\tif ('Plural-Forms' == $header) {\n\t\t\tlist( $nplurals, $expression ) = $this->nplurals_and_expression_from_header($this->get_header('Plural-Forms'));\n\t\t\t$this->_nplurals = $nplurals;\n\t\t\t$this->_gettext_select_plural_form = $this->make_plural_form_function($nplurals, $expression);\n\t\t}\n\t}\n}\nendif;\n\nif ( ! class_exists( 'NOOP_Translations', false ) ):\n/**\n * Provides the same interface as Translations, but doesn't do anything\n */\nclass NOOP_Translations {\n\tvar $entries = array();\n\tvar $headers = array();\n\n\tfunction add_entry($entry) {\n\t\treturn true;\n\t}\n\n\t/**\n\t *\n\t * @param string $header\n\t * @param string $value\n\t */\n\tfunction set_header($header, $value) {\n\t}\n\n\t/**\n\t *\n\t * @param array $headers\n\t */\n\tfunction set_headers($headers) {\n\t}\n\n\t/**\n\t * @param string $header\n\t * @return false\n\t */\n\tfunction get_header($header) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * @param Translation_Entry $entry\n\t * @return false\n\t */\n\tfunction translate_entry(&$entry) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * @param string $singular\n\t * @param string $context\n\t */\n\tfunction translate($singular, $context=null) {\n\t\treturn $singular;\n\t}\n\n\t/**\n\t *\n\t * @param int $count\n\t * @return bool\n\t */\n\tfunction select_plural_form($count) {\n\t\treturn 1 == $count? 0 : 1;\n\t}\n\n\t/**\n\t * @return int\n\t */\n\tfunction get_plural_forms_count() {\n\t\treturn 2;\n\t}\n\n\t/**\n\t * @param string $singular\n\t * @param string $plural\n\t * @param int    $count\n\t * @param string $context\n\t */\n\tfunction translate_plural($singular, $plural, $count, $context = null) {\n\t\t\treturn 1 == $count? $singular : $plural;\n\t}\n\n\t/**\n\t * @param object $other\n\t */\n\tfunction merge_with(&$other) {\n\t}\n}\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/post-formats.php",
    "content": "<?php\n/**\n * Post format functions.\n *\n * @package WordPress\n * @subpackage Post\n */\n\n/**\n * Retrieve the format slug for a post\n *\n * @since 3.1.0\n *\n * @param int|object|null $post Post ID or post object. Optional, default is the current post from the loop.\n * @return string|false The format if successful. False otherwise.\n */\nfunction get_post_format( $post = null ) {\n\tif ( ! $post = get_post( $post ) )\n\t\treturn false;\n\n\tif ( ! post_type_supports( $post->post_type, 'post-formats' ) )\n\t\treturn false;\n\n\t$_format = get_the_terms( $post->ID, 'post_format' );\n\n\tif ( empty( $_format ) )\n\t\treturn false;\n\n\t$format = reset( $_format );\n\n\treturn str_replace('post-format-', '', $format->slug );\n}\n\n/**\n * Check if a post has any of the given formats, or any format.\n *\n * @since 3.1.0\n *\n * @param string|array    $format Optional. The format or formats to check.\n * @param object|int|null $post   Optional. The post to check. If not supplied, defaults to the current post if used in the loop.\n * @return bool True if the post has any of the given formats (or any format, if no format specified), false otherwise.\n */\nfunction has_post_format( $format = array(), $post = null ) {\n\t$prefixed = array();\n\n\tif ( $format ) {\n\t\tforeach ( (array) $format as $single ) {\n\t\t\t$prefixed[] = 'post-format-' . sanitize_key( $single );\n\t\t}\n\t}\n\n\treturn has_term( $prefixed, 'post_format', $post );\n}\n\n/**\n * Assign a format to a post\n *\n * @since 3.1.0\n *\n * @param int|object $post   The post for which to assign a format.\n * @param string     $format A format to assign. Use an empty string or array to remove all formats from the post.\n * @return array|WP_Error|false WP_Error on error. Array of affected term IDs on success.\n */\nfunction set_post_format( $post, $format ) {\n\t$post = get_post( $post );\n\n\tif ( empty( $post ) )\n\t\treturn new WP_Error( 'invalid_post', __( 'Invalid post.' ) );\n\n\tif ( ! empty( $format ) ) {\n\t\t$format = sanitize_key( $format );\n\t\tif ( 'standard' === $format || ! in_array( $format, get_post_format_slugs() ) )\n\t\t\t$format = '';\n\t\telse\n\t\t\t$format = 'post-format-' . $format;\n\t}\n\n\treturn wp_set_post_terms( $post->ID, $format, 'post_format' );\n}\n\n/**\n * Returns an array of post format slugs to their translated and pretty display versions\n *\n * @since 3.1.0\n *\n * @return array The array of translated post format names.\n */\nfunction get_post_format_strings() {\n\t$strings = array(\n\t\t'standard' => _x( 'Standard', 'Post format' ), // Special case. any value that evals to false will be considered standard\n\t\t'aside'    => _x( 'Aside',    'Post format' ),\n\t\t'chat'     => _x( 'Chat',     'Post format' ),\n\t\t'gallery'  => _x( 'Gallery',  'Post format' ),\n\t\t'link'     => _x( 'Link',     'Post format' ),\n\t\t'image'    => _x( 'Image',    'Post format' ),\n\t\t'quote'    => _x( 'Quote',    'Post format' ),\n\t\t'status'   => _x( 'Status',   'Post format' ),\n\t\t'video'    => _x( 'Video',    'Post format' ),\n\t\t'audio'    => _x( 'Audio',    'Post format' ),\n\t);\n\treturn $strings;\n}\n\n/**\n * Retrieves an array of post format slugs.\n *\n * @since 3.1.0\n *\n * @return array The array of post format slugs.\n */\nfunction get_post_format_slugs() {\n\t$slugs = array_keys( get_post_format_strings() );\n\treturn array_combine( $slugs, $slugs );\n}\n\n/**\n * Returns a pretty, translated version of a post format slug\n *\n * @since 3.1.0\n *\n * @param string $slug A post format slug.\n * @return string The translated post format name.\n */\nfunction get_post_format_string( $slug ) {\n\t$strings = get_post_format_strings();\n\tif ( !$slug )\n\t\treturn $strings['standard'];\n\telse\n\t\treturn ( isset( $strings[$slug] ) ) ? $strings[$slug] : '';\n}\n\n/**\n * Returns a link to a post format index.\n *\n * @since 3.1.0\n *\n * @param string $format The post format slug.\n * @return string|WP_Error|false The post format term link.\n */\nfunction get_post_format_link( $format ) {\n\t$term = get_term_by('slug', 'post-format-' . $format, 'post_format' );\n\tif ( ! $term || is_wp_error( $term ) )\n\t\treturn false;\n\treturn get_term_link( $term );\n}\n\n/**\n * Filters the request to allow for the format prefix.\n *\n * @access private\n * @since 3.1.0\n *\n * @param array $qvs\n * @return array\n */\nfunction _post_format_request( $qvs ) {\n\tif ( ! isset( $qvs['post_format'] ) )\n\t\treturn $qvs;\n\t$slugs = get_post_format_slugs();\n\tif ( isset( $slugs[ $qvs['post_format'] ] ) )\n\t\t$qvs['post_format'] = 'post-format-' . $slugs[ $qvs['post_format'] ];\n\t$tax = get_taxonomy( 'post_format' );\n\tif ( ! is_admin() )\n\t\t$qvs['post_type'] = $tax->object_type;\n\treturn $qvs;\n}\n\n/**\n * Filters the post format term link to remove the format prefix.\n *\n * @access private\n * @since 3.1.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $link\n * @param object $term\n * @param string $taxonomy\n * @return string\n */\nfunction _post_format_link( $link, $term, $taxonomy ) {\n\tglobal $wp_rewrite;\n\tif ( 'post_format' != $taxonomy ) {\n\t\treturn $link;\n\t}\n\tif ( $wp_rewrite->get_extra_permastruct( $taxonomy ) ) {\n\t\treturn str_replace( \"/{$term->slug}\", '/' . str_replace( 'post-format-', '', $term->slug ), $link );\n\t} else {\n\t\t$link = remove_query_arg( 'post_format', $link );\n\t\treturn add_query_arg( 'post_format', str_replace( 'post-format-', '', $term->slug ), $link );\n\t}\n}\n\n/**\n * Remove the post format prefix from the name property of the term object created by get_term().\n *\n * @access private\n * @since 3.1.0\n *\n * @param object $term\n * @return object\n */\nfunction _post_format_get_term( $term ) {\n\tif ( isset( $term->slug ) ) {\n\t\t$term->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );\n\t}\n\treturn $term;\n}\n\n/**\n * Remove the post format prefix from the name property of the term objects created by get_terms().\n *\n * @access private\n * @since 3.1.0\n *\n * @param array        $terms\n * @param string|array $taxonomies\n * @param array        $args\n * @return array\n */\nfunction _post_format_get_terms( $terms, $taxonomies, $args ) {\n\tif ( in_array( 'post_format', (array) $taxonomies ) ) {\n\t\tif ( isset( $args['fields'] ) && 'names' == $args['fields'] ) {\n\t\t\tforeach ( $terms as $order => $name ) {\n\t\t\t\t$terms[$order] = get_post_format_string( str_replace( 'post-format-', '', $name ) );\n\t\t\t}\n\t\t} else {\n\t\t\tforeach ( (array) $terms as $order => $term ) {\n\t\t\t\tif ( isset( $term->taxonomy ) && 'post_format' == $term->taxonomy ) {\n\t\t\t\t\t$terms[$order]->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn $terms;\n}\n\n/**\n * Remove the post format prefix from the name property of the term objects created by wp_get_object_terms().\n *\n * @access private\n * @since 3.1.0\n *\n * @param array $terms\n * @return array\n */\nfunction _post_format_wp_get_object_terms( $terms ) {\n\tforeach ( (array) $terms as $order => $term ) {\n\t\tif ( isset( $term->taxonomy ) && 'post_format' == $term->taxonomy ) {\n\t\t\t$terms[$order]->name = get_post_format_string( str_replace( 'post-format-', '', $term->slug ) );\n\t\t}\n\t}\n\treturn $terms;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/post-template.php",
    "content": "<?php\n/**\n * WordPress Post Template Functions.\n *\n * Gets content for the current post in the loop.\n *\n * @package WordPress\n * @subpackage Template\n */\n\n/**\n * Display the ID of the current item in the WordPress Loop.\n *\n * @since 0.71\n */\nfunction the_ID() {\n\techo get_the_ID();\n}\n\n/**\n * Retrieve the ID of the current item in the WordPress Loop.\n *\n * @since 2.1.0\n *\n * @return int|false The ID of the current item in the WordPress Loop. False if $post is not set.\n */\nfunction get_the_ID() {\n\t$post = get_post();\n\treturn ! empty( $post ) ? $post->ID : false;\n}\n\n/**\n * Display or retrieve the current post title with optional content.\n *\n * @since 0.71\n *\n * @param string $before Optional. Content to prepend to the title.\n * @param string $after  Optional. Content to append to the title.\n * @param bool   $echo   Optional, default to true.Whether to display or return.\n * @return string|void String if $echo parameter is false.\n */\nfunction the_title( $before = '', $after = '', $echo = true ) {\n\t$title = get_the_title();\n\n\tif ( strlen($title) == 0 )\n\t\treturn;\n\n\t$title = $before . $title . $after;\n\n\tif ( $echo )\n\t\techo $title;\n\telse\n\t\treturn $title;\n}\n\n/**\n * Sanitize the current title when retrieving or displaying.\n *\n * Works like {@link the_title()}, except the parameters can be in a string or\n * an array. See the function for what can be override in the $args parameter.\n *\n * The title before it is displayed will have the tags stripped and {@link\n * esc_attr()} before it is passed to the user or displayed. The default\n * as with {@link the_title()}, is to display the title.\n *\n * @since 2.3.0\n *\n * @param string|array $args {\n *     Title attribute arguments. Optional.\n *\n *     @type string  $before Markup to prepend to the title. Default empty.\n *     @type string  $after  Markup to append to the title. Default empty.\n *     @type bool    $echo   Whether to echo or return the title. Default true for echo.\n *     @type WP_Post $post   Current post object to retrieve the title for.\n * }\n * @return string|void String when echo is false.\n */\nfunction the_title_attribute( $args = '' ) {\n\t$defaults = array( 'before' => '', 'after' =>  '', 'echo' => true, 'post' => get_post() );\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$title = get_the_title( $r['post'] );\n\n\tif ( strlen( $title ) == 0 ) {\n\t\treturn;\n\t}\n\n\t$title = $r['before'] . $title . $r['after'];\n\t$title = esc_attr( strip_tags( $title ) );\n\n\tif ( $r['echo'] ) {\n\t\techo $title;\n\t} else {\n\t\treturn $title;\n\t}\n}\n\n/**\n * Retrieve post title.\n *\n * If the post is protected and the visitor is not an admin, then \"Protected\"\n * will be displayed before the post title. If the post is private, then\n * \"Private\" will be located before the post title.\n *\n * @since 0.71\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.\n * @return string\n */\nfunction get_the_title( $post = 0 ) {\n\t$post = get_post( $post );\n\n\t$title = isset( $post->post_title ) ? $post->post_title : '';\n\t$id = isset( $post->ID ) ? $post->ID : 0;\n\n\tif ( ! is_admin() ) {\n\t\tif ( ! empty( $post->post_password ) ) {\n\n\t\t\t/**\n\t\t\t * Filter the text prepended to the post title for protected posts.\n\t\t\t *\n\t\t\t * The filter is only applied on the front end.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param string  $prepend Text displayed before the post title.\n\t\t\t *                         Default 'Protected: %s'.\n\t\t\t * @param WP_Post $post    Current post object.\n\t\t\t */\n\t\t\t$protected_title_format = apply_filters( 'protected_title_format', __( 'Protected: %s' ), $post );\n\t\t\t$title = sprintf( $protected_title_format, $title );\n\t\t} elseif ( isset( $post->post_status ) && 'private' == $post->post_status ) {\n\n\t\t\t/**\n\t\t\t * Filter the text prepended to the post title of private posts.\n\t\t\t *\n\t\t\t * The filter is only applied on the front end.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @param string  $prepend Text displayed before the post title.\n\t\t\t *                         Default 'Private: %s'.\n\t\t\t * @param WP_Post $post    Current post object.\n\t\t\t */\n\t\t\t$private_title_format = apply_filters( 'private_title_format', __( 'Private: %s' ), $post );\n\t\t\t$title = sprintf( $private_title_format, $title );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the post title.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $title The post title.\n\t * @param int    $id    The post ID.\n\t */\n\treturn apply_filters( 'the_title', $title, $id );\n}\n\n/**\n * Display the Post Global Unique Identifier (guid).\n *\n * The guid will appear to be a link, but should not be used as an link to the\n * post. The reason you should not use it as a link, is because of moving the\n * blog across domains.\n *\n * Url is escaped to make it xml safe\n *\n * @since 1.5.0\n *\n * @param int|WP_Post $id Optional. Post ID or post object.\n */\nfunction the_guid( $id = 0 ) {\n\t/**\n\t * Filter the escaped Global Unique Identifier (guid) of the post.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @see get_the_guid()\n\t *\n\t * @param string $post_guid Escaped Global Unique Identifier (guid) of the post.\n\t */\n\techo apply_filters( 'the_guid', get_the_guid( $id ) );\n}\n\n/**\n * Retrieve the Post Global Unique Identifier (guid).\n *\n * The guid will appear to be a link, but should not be used as an link to the\n * post. The reason you should not use it as a link, is because of moving the\n * blog across domains.\n *\n * @since 1.5.0\n *\n * @param int|WP_Post $id Optional. Post ID or post object.\n * @return string\n */\nfunction get_the_guid( $id = 0 ) {\n\t$post = get_post($id);\n\n\t/**\n\t * Filter the Global Unique Identifier (guid) of the post.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $post_guid Global Unique Identifier (guid) of the post.\n\t */\n\treturn apply_filters( 'get_the_guid', $post->guid );\n}\n\n/**\n * Display the post content.\n *\n * @since 0.71\n *\n * @param string $more_link_text Optional. Content for when there is more text.\n * @param bool   $strip_teaser   Optional. Strip teaser content before the more text. Default is false.\n */\nfunction the_content( $more_link_text = null, $strip_teaser = false) {\n\t$content = get_the_content( $more_link_text, $strip_teaser );\n\n\t/**\n\t * Filter the post content.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $content Content of the current post.\n\t */\n\t$content = apply_filters( 'the_content', $content );\n\t$content = str_replace( ']]>', ']]&gt;', $content );\n\techo $content;\n}\n\n/**\n * Retrieve the post content.\n *\n * @since 0.71\n *\n * @global int   $page\n * @global int   $more\n * @global bool  $preview\n * @global array $pages\n * @global int   $multipage\n *\n * @param string $more_link_text Optional. Content for when there is more text.\n * @param bool   $strip_teaser   Optional. Strip teaser content before the more text. Default is false.\n * @return string\n */\nfunction get_the_content( $more_link_text = null, $strip_teaser = false ) {\n\tglobal $page, $more, $preview, $pages, $multipage;\n\n\t$post = get_post();\n\n\tif ( null === $more_link_text )\n\t\t$more_link_text = __( '(more&hellip;)' );\n\n\t$output = '';\n\t$has_teaser = false;\n\n\t// If post password required and it doesn't match the cookie.\n\tif ( post_password_required( $post ) )\n\t\treturn get_the_password_form( $post );\n\n\tif ( $page > count( $pages ) ) // if the requested page doesn't exist\n\t\t$page = count( $pages ); // give them the highest numbered page that DOES exist\n\n\t$content = $pages[$page - 1];\n\tif ( preg_match( '/<!--more(.*?)?-->/', $content, $matches ) ) {\n\t\t$content = explode( $matches[0], $content, 2 );\n\t\tif ( ! empty( $matches[1] ) && ! empty( $more_link_text ) )\n\t\t\t$more_link_text = strip_tags( wp_kses_no_null( trim( $matches[1] ) ) );\n\n\t\t$has_teaser = true;\n\t} else {\n\t\t$content = array( $content );\n\t}\n\n\tif ( false !== strpos( $post->post_content, '<!--noteaser-->' ) && ( ! $multipage || $page == 1 ) )\n\t\t$strip_teaser = true;\n\n\t$teaser = $content[0];\n\n\tif ( $more && $strip_teaser && $has_teaser )\n\t\t$teaser = '';\n\n\t$output .= $teaser;\n\n\tif ( count( $content ) > 1 ) {\n\t\tif ( $more ) {\n\t\t\t$output .= '<span id=\"more-' . $post->ID . '\"></span>' . $content[1];\n\t\t} else {\n\t\t\tif ( ! empty( $more_link_text ) )\n\n\t\t\t\t/**\n\t\t\t\t * Filter the Read More link text.\n\t\t\t\t *\n\t\t\t\t * @since 2.8.0\n\t\t\t\t *\n\t\t\t\t * @param string $more_link_element Read More link element.\n\t\t\t\t * @param string $more_link_text    Read More text.\n\t\t\t\t */\n\t\t\t\t$output .= apply_filters( 'the_content_more_link', ' <a href=\"' . get_permalink() . \"#more-{$post->ID}\\\" class=\\\"more-link\\\">$more_link_text</a>\", $more_link_text );\n\t\t\t$output = force_balance_tags( $output );\n\t\t}\n\t}\n\n\tif ( $preview ) // Preview fix for JavaScript bug with foreign languages.\n\t\t$output =\tpreg_replace_callback( '/\\%u([0-9A-F]{4})/', '_convert_urlencoded_to_entities', $output );\n\n\treturn $output;\n}\n\n/**\n * Preview fix for JavaScript bug with foreign languages.\n *\n * @since 3.1.0\n * @access private\n *\n * @param array $match Match array from preg_replace_callback.\n * @return string\n */\nfunction _convert_urlencoded_to_entities( $match ) {\n\treturn '&#' . base_convert( $match[1], 16, 10 ) . ';';\n}\n\n/**\n * Display the post excerpt.\n *\n * @since 0.71\n */\nfunction the_excerpt() {\n\n\t/**\n\t * Filter the displayed post excerpt.\n\t *\n\t * @since 0.71\n\t *\n\t * @see get_the_excerpt()\n\t *\n\t * @param string $post_excerpt The post excerpt.\n\t */\n\techo apply_filters( 'the_excerpt', get_the_excerpt() );\n}\n\n/**\n * Retrieve the post excerpt.\n *\n * @since 0.71\n *\n * @param mixed $deprecated Not used.\n * @return string\n */\nfunction get_the_excerpt( $deprecated = '' ) {\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.3' );\n\n\t$post = get_post();\n\tif ( empty( $post ) ) {\n\t\treturn '';\n\t}\n\n\tif ( post_password_required() ) {\n\t\treturn __( 'There is no excerpt because this is a protected post.' );\n\t}\n\n\t/**\n\t * Filter the retrieved post excerpt.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param string $post_excerpt The post excerpt.\n\t */\n\treturn apply_filters( 'get_the_excerpt', $post->post_excerpt );\n}\n\n/**\n * Whether post has excerpt.\n *\n * @since 2.3.0\n *\n * @param int|WP_Post $id Optional. Post ID or post object.\n * @return bool\n */\nfunction has_excerpt( $id = 0 ) {\n\t$post = get_post( $id );\n\treturn ( !empty( $post->post_excerpt ) );\n}\n\n/**\n * Display the classes for the post div.\n *\n * @since 2.7.0\n *\n * @param string|array $class   One or more classes to add to the class list.\n * @param int|WP_Post  $post_id Optional. Post ID or post object. Defaults to the global `$post`.\n */\nfunction post_class( $class = '', $post_id = null ) {\n\t// Separates classes with a single space, collates classes for post DIV\n\techo 'class=\"' . join( ' ', get_post_class( $class, $post_id ) ) . '\"';\n}\n\n/**\n * Retrieve the classes for the post div as an array.\n *\n * The class names are many. If the post is a sticky, then the 'sticky'\n * class name. The class 'hentry' is always added to each post. If the post has a\n * post thumbnail, 'has-post-thumbnail' is added as a class. For each taxonomy that\n * the post belongs to, a class will be added of the format '{$taxonomy}-{$slug}' -\n * eg 'category-foo' or 'my_custom_taxonomy-bar'. The 'post_tag' taxonomy is a special\n * case; the class has the 'tag-' prefix instead of 'post_tag-'. All classes are\n * passed through the filter, 'post_class' with the list of classes, followed by\n * $class parameter value, with the post ID as the last parameter.\n *\n * @since 2.7.0\n * @since 4.2.0 Custom taxonomy classes were added.\n *\n * @param string|array $class   One or more classes to add to the class list.\n * @param int|WP_Post  $post_id Optional. Post ID or post object.\n * @return array Array of classes.\n */\nfunction get_post_class( $class = '', $post_id = null ) {\n\t$post = get_post( $post_id );\n\n\t$classes = array();\n\n\tif ( $class ) {\n\t\tif ( ! is_array( $class ) ) {\n\t\t\t$class = preg_split( '#\\s+#', $class );\n\t\t}\n\t\t$classes = array_map( 'esc_attr', $class );\n\t} else {\n\t\t// Ensure that we always coerce class to being an array.\n\t\t$class = array();\n\t}\n\n\tif ( ! $post ) {\n\t\treturn $classes;\n\t}\n\n\t$classes[] = 'post-' . $post->ID;\n\tif ( ! is_admin() )\n\t\t$classes[] = $post->post_type;\n\t$classes[] = 'type-' . $post->post_type;\n\t$classes[] = 'status-' . $post->post_status;\n\n\t// Post Format\n\tif ( post_type_supports( $post->post_type, 'post-formats' ) ) {\n\t\t$post_format = get_post_format( $post->ID );\n\n\t\tif ( $post_format && !is_wp_error($post_format) )\n\t\t\t$classes[] = 'format-' . sanitize_html_class( $post_format );\n\t\telse\n\t\t\t$classes[] = 'format-standard';\n\t}\n\n\t$post_password_required = post_password_required( $post->ID );\n\n\t// Post requires password.\n\tif ( $post_password_required ) {\n\t\t$classes[] = 'post-password-required';\n\t} elseif ( ! empty( $post->post_password ) ) {\n\t\t$classes[] = 'post-password-protected';\n\t}\n\n\t// Post thumbnails.\n\tif ( current_theme_supports( 'post-thumbnails' ) && has_post_thumbnail( $post->ID ) && ! is_attachment( $post ) && ! $post_password_required ) {\n\t\t$classes[] = 'has-post-thumbnail';\n\t}\n\n\t// sticky for Sticky Posts\n\tif ( is_sticky( $post->ID ) ) {\n\t\tif ( is_home() && ! is_paged() ) {\n\t\t\t$classes[] = 'sticky';\n\t\t} elseif ( is_admin() ) {\n\t\t\t$classes[] = 'status-sticky';\n\t\t}\n\t}\n\n\t// hentry for hAtom compliance\n\t$classes[] = 'hentry';\n\n\t// All public taxonomies\n\t$taxonomies = get_taxonomies( array( 'public' => true ) );\n\tforeach ( (array) $taxonomies as $taxonomy ) {\n\t\tif ( is_object_in_taxonomy( $post->post_type, $taxonomy ) ) {\n\t\t\tforeach ( (array) get_the_terms( $post->ID, $taxonomy ) as $term ) {\n\t\t\t\tif ( empty( $term->slug ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$term_class = sanitize_html_class( $term->slug, $term->term_id );\n\t\t\t\tif ( is_numeric( $term_class ) || ! trim( $term_class, '-' ) ) {\n\t\t\t\t\t$term_class = $term->term_id;\n\t\t\t\t}\n\n\t\t\t\t// 'post_tag' uses the 'tag' prefix for backward compatibility.\n\t\t\t\tif ( 'post_tag' == $taxonomy ) {\n\t\t\t\t\t$classes[] = 'tag-' . $term_class;\n\t\t\t\t} else {\n\t\t\t\t\t$classes[] = sanitize_html_class( $taxonomy . '-' . $term_class, $taxonomy . '-' . $term->term_id );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t$classes = array_map( 'esc_attr', $classes );\n\n\t/**\n\t * Filter the list of CSS classes for the current post.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array $classes An array of post classes.\n\t * @param array $class   An array of additional classes added to the post.\n\t * @param int   $post_id The post ID.\n\t */\n\t$classes = apply_filters( 'post_class', $classes, $class, $post->ID );\n\n\treturn array_unique( $classes );\n}\n\n/**\n * Display the classes for the body element.\n *\n * @since 2.8.0\n *\n * @param string|array $class One or more classes to add to the class list.\n */\nfunction body_class( $class = '' ) {\n\t// Separates classes with a single space, collates classes for body element\n\techo 'class=\"' . join( ' ', get_body_class( $class ) ) . '\"';\n}\n\n/**\n * Retrieve the classes for the body element as an array.\n *\n * @since 2.8.0\n *\n * @global WP_Query $wp_query\n *\n * @param string|array $class One or more classes to add to the class list.\n * @return array Array of classes.\n */\nfunction get_body_class( $class = '' ) {\n\tglobal $wp_query;\n\n\t$classes = array();\n\n\tif ( is_rtl() )\n\t\t$classes[] = 'rtl';\n\n\tif ( is_front_page() )\n\t\t$classes[] = 'home';\n\tif ( is_home() )\n\t\t$classes[] = 'blog';\n\tif ( is_archive() )\n\t\t$classes[] = 'archive';\n\tif ( is_date() )\n\t\t$classes[] = 'date';\n\tif ( is_search() ) {\n\t\t$classes[] = 'search';\n\t\t$classes[] = $wp_query->posts ? 'search-results' : 'search-no-results';\n\t}\n\tif ( is_paged() )\n\t\t$classes[] = 'paged';\n\tif ( is_attachment() )\n\t\t$classes[] = 'attachment';\n\tif ( is_404() )\n\t\t$classes[] = 'error404';\n\n\tif ( is_single() ) {\n\t\t$post_id = $wp_query->get_queried_object_id();\n\t\t$post = $wp_query->get_queried_object();\n\n\t\t$classes[] = 'single';\n\t\tif ( isset( $post->post_type ) ) {\n\t\t\t$classes[] = 'single-' . sanitize_html_class($post->post_type, $post_id);\n\t\t\t$classes[] = 'postid-' . $post_id;\n\n\t\t\t// Post Format\n\t\t\tif ( post_type_supports( $post->post_type, 'post-formats' ) ) {\n\t\t\t\t$post_format = get_post_format( $post->ID );\n\n\t\t\t\tif ( $post_format && !is_wp_error($post_format) )\n\t\t\t\t\t$classes[] = 'single-format-' . sanitize_html_class( $post_format );\n\t\t\t\telse\n\t\t\t\t\t$classes[] = 'single-format-standard';\n\t\t\t}\n\t\t}\n\n\t\tif ( is_attachment() ) {\n\t\t\t$mime_type = get_post_mime_type($post_id);\n\t\t\t$mime_prefix = array( 'application/', 'image/', 'text/', 'audio/', 'video/', 'music/' );\n\t\t\t$classes[] = 'attachmentid-' . $post_id;\n\t\t\t$classes[] = 'attachment-' . str_replace( $mime_prefix, '', $mime_type );\n\t\t}\n\t} elseif ( is_archive() ) {\n\t\tif ( is_post_type_archive() ) {\n\t\t\t$classes[] = 'post-type-archive';\n\t\t\t$post_type = get_query_var( 'post_type' );\n\t\t\tif ( is_array( $post_type ) )\n\t\t\t\t$post_type = reset( $post_type );\n\t\t\t$classes[] = 'post-type-archive-' . sanitize_html_class( $post_type );\n\t\t} elseif ( is_author() ) {\n\t\t\t$author = $wp_query->get_queried_object();\n\t\t\t$classes[] = 'author';\n\t\t\tif ( isset( $author->user_nicename ) ) {\n\t\t\t\t$classes[] = 'author-' . sanitize_html_class( $author->user_nicename, $author->ID );\n\t\t\t\t$classes[] = 'author-' . $author->ID;\n\t\t\t}\n\t\t} elseif ( is_category() ) {\n\t\t\t$cat = $wp_query->get_queried_object();\n\t\t\t$classes[] = 'category';\n\t\t\tif ( isset( $cat->term_id ) ) {\n\t\t\t\t$cat_class = sanitize_html_class( $cat->slug, $cat->term_id );\n\t\t\t\tif ( is_numeric( $cat_class ) || ! trim( $cat_class, '-' ) ) {\n\t\t\t\t\t$cat_class = $cat->term_id;\n\t\t\t\t}\n\n\t\t\t\t$classes[] = 'category-' . $cat_class;\n\t\t\t\t$classes[] = 'category-' . $cat->term_id;\n\t\t\t}\n\t\t} elseif ( is_tag() ) {\n\t\t\t$tag = $wp_query->get_queried_object();\n\t\t\t$classes[] = 'tag';\n\t\t\tif ( isset( $tag->term_id ) ) {\n\t\t\t\t$tag_class = sanitize_html_class( $tag->slug, $tag->term_id );\n\t\t\t\tif ( is_numeric( $tag_class ) || ! trim( $tag_class, '-' ) ) {\n\t\t\t\t\t$tag_class = $tag->term_id;\n\t\t\t\t}\n\n\t\t\t\t$classes[] = 'tag-' . $tag_class;\n\t\t\t\t$classes[] = 'tag-' . $tag->term_id;\n\t\t\t}\n\t\t} elseif ( is_tax() ) {\n\t\t\t$term = $wp_query->get_queried_object();\n\t\t\tif ( isset( $term->term_id ) ) {\n\t\t\t\t$term_class = sanitize_html_class( $term->slug, $term->term_id );\n\t\t\t\tif ( is_numeric( $term_class ) || ! trim( $term_class, '-' ) ) {\n\t\t\t\t\t$term_class = $term->term_id;\n\t\t\t\t}\n\n\t\t\t\t$classes[] = 'tax-' . sanitize_html_class( $term->taxonomy );\n\t\t\t\t$classes[] = 'term-' . $term_class;\n\t\t\t\t$classes[] = 'term-' . $term->term_id;\n\t\t\t}\n\t\t}\n\t} elseif ( is_page() ) {\n\t\t$classes[] = 'page';\n\n\t\t$page_id = $wp_query->get_queried_object_id();\n\n\t\t$post = get_post($page_id);\n\n\t\t$classes[] = 'page-id-' . $page_id;\n\n\t\tif ( get_pages( array( 'parent' => $page_id, 'number' => 1 ) ) ) {\n\t\t\t$classes[] = 'page-parent';\n\t\t}\n\n\t\tif ( $post->post_parent ) {\n\t\t\t$classes[] = 'page-child';\n\t\t\t$classes[] = 'parent-pageid-' . $post->post_parent;\n\t\t}\n\t\tif ( is_page_template() ) {\n\t\t\t$classes[] = 'page-template';\n\n\t\t\t$template_slug  = get_page_template_slug( $page_id );\n\t\t\t$template_parts = explode( '/', $template_slug );\n\n\t\t\tforeach ( $template_parts as $part ) {\n\t\t\t\t$classes[] = 'page-template-' . sanitize_html_class( str_replace( array( '.', '/' ), '-', basename( $part, '.php' ) ) );\n\t\t\t}\n\t\t\t$classes[] = 'page-template-' . sanitize_html_class( str_replace( '.', '-', $template_slug ) );\n\t\t} else {\n\t\t\t$classes[] = 'page-template-default';\n\t\t}\n\t}\n\n\tif ( is_user_logged_in() )\n\t\t$classes[] = 'logged-in';\n\n\tif ( is_admin_bar_showing() ) {\n\t\t$classes[] = 'admin-bar';\n\t\t$classes[] = 'no-customize-support';\n\t}\n\n\tif ( get_background_color() !== get_theme_support( 'custom-background', 'default-color' ) || get_background_image() )\n\t\t$classes[] = 'custom-background';\n\n\t$page = $wp_query->get( 'page' );\n\n\tif ( ! $page || $page < 2 )\n\t\t$page = $wp_query->get( 'paged' );\n\n\tif ( $page && $page > 1 && ! is_404() ) {\n\t\t$classes[] = 'paged-' . $page;\n\n\t\tif ( is_single() )\n\t\t\t$classes[] = 'single-paged-' . $page;\n\t\telseif ( is_page() )\n\t\t\t$classes[] = 'page-paged-' . $page;\n\t\telseif ( is_category() )\n\t\t\t$classes[] = 'category-paged-' . $page;\n\t\telseif ( is_tag() )\n\t\t\t$classes[] = 'tag-paged-' . $page;\n\t\telseif ( is_date() )\n\t\t\t$classes[] = 'date-paged-' . $page;\n\t\telseif ( is_author() )\n\t\t\t$classes[] = 'author-paged-' . $page;\n\t\telseif ( is_search() )\n\t\t\t$classes[] = 'search-paged-' . $page;\n\t\telseif ( is_post_type_archive() )\n\t\t\t$classes[] = 'post-type-paged-' . $page;\n\t}\n\n\tif ( ! empty( $class ) ) {\n\t\tif ( !is_array( $class ) )\n\t\t\t$class = preg_split( '#\\s+#', $class );\n\t\t$classes = array_merge( $classes, $class );\n\t} else {\n\t\t// Ensure that we always coerce class to being an array.\n\t\t$class = array();\n\t}\n\n\t$classes = array_map( 'esc_attr', $classes );\n\n\t/**\n\t * Filter the list of CSS body classes for the current post or page.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $classes An array of body classes.\n\t * @param array $class   An array of additional classes added to the body.\n\t */\n\t$classes = apply_filters( 'body_class', $classes, $class );\n\n\treturn array_unique( $classes );\n}\n\n/**\n * Whether post requires password and correct password has been provided.\n *\n * @since 2.7.0\n *\n * @param int|WP_Post|null $post An optional post. Global $post used if not provided.\n * @return bool false if a password is not required or the correct password cookie is present, true otherwise.\n */\nfunction post_password_required( $post = null ) {\n\t$post = get_post($post);\n\n\tif ( empty( $post->post_password ) )\n\t\treturn false;\n\n\tif ( ! isset( $_COOKIE['wp-postpass_' . COOKIEHASH] ) )\n\t\treturn true;\n\n\trequire_once ABSPATH . WPINC . '/class-phpass.php';\n\t$hasher = new PasswordHash( 8, true );\n\n\t$hash = wp_unslash( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] );\n\tif ( 0 !== strpos( $hash, '$P$B' ) )\n\t\treturn true;\n\n\treturn ! $hasher->CheckPassword( $post->post_password, $hash );\n}\n\n//\n// Page Template Functions for usage in Themes\n//\n\n/**\n * The formatted output of a list of pages.\n *\n * Displays page links for paginated posts (i.e. includes the <!--nextpage-->.\n * Quicktag one or more times). This tag must be within The Loop.\n *\n * @since 1.2.0\n *\n * @global int $page\n * @global int $numpages\n * @global int $multipage\n * @global int $more\n *\n * @param string|array $args {\n *     Optional. Array or string of default arguments.\n *\n *     @type string       $before           HTML or text to prepend to each link. Default is `<p> Pages:`.\n *     @type string       $after            HTML or text to append to each link. Default is `</p>`.\n *     @type string       $link_before      HTML or text to prepend to each link, inside the `<a>` tag.\n *                                          Also prepended to the current item, which is not linked. Default empty.\n *     @type string       $link_after       HTML or text to append to each Pages link inside the `<a>` tag.\n *                                          Also appended to the current item, which is not linked. Default empty.\n *     @type string       $next_or_number   Indicates whether page numbers should be used. Valid values are number\n *                                          and next. Default is 'number'.\n *     @type string       $separator        Text between pagination links. Default is ' '.\n *     @type string       $nextpagelink     Link text for the next page link, if available. Default is 'Next Page'.\n *     @type string       $previouspagelink Link text for the previous page link, if available. Default is 'Previous Page'.\n *     @type string       $pagelink         Format string for page numbers. The % in the parameter string will be\n *                                          replaced with the page number, so 'Page %' generates \"Page 1\", \"Page 2\", etc.\n *                                          Defaults to '%', just the page number.\n *     @type int|bool     $echo             Whether to echo or not. Accepts 1|true or 0|false. Default 1|true.\n * }\n * @return string Formatted output in HTML.\n */\nfunction wp_link_pages( $args = '' ) {\n\tglobal $page, $numpages, $multipage, $more;\n\n\t$defaults = array(\n\t\t'before'           => '<p>' . __( 'Pages:' ),\n\t\t'after'            => '</p>',\n\t\t'link_before'      => '',\n\t\t'link_after'       => '',\n\t\t'next_or_number'   => 'number',\n\t\t'separator'        => ' ',\n\t\t'nextpagelink'     => __( 'Next page' ),\n\t\t'previouspagelink' => __( 'Previous page' ),\n\t\t'pagelink'         => '%',\n\t\t'echo'             => 1\n\t);\n\n\t$params = wp_parse_args( $args, $defaults );\n\n\t/**\n\t * Filter the arguments used in retrieving page links for paginated posts.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $params An array of arguments for page links for paginated posts.\n\t */\n\t$r = apply_filters( 'wp_link_pages_args', $params );\n\n\t$output = '';\n\tif ( $multipage ) {\n\t\tif ( 'number' == $r['next_or_number'] ) {\n\t\t\t$output .= $r['before'];\n\t\t\tfor ( $i = 1; $i <= $numpages; $i++ ) {\n\t\t\t\t$link = $r['link_before'] . str_replace( '%', $i, $r['pagelink'] ) . $r['link_after'];\n\t\t\t\tif ( $i != $page || ! $more && 1 == $page ) {\n\t\t\t\t\t$link = _wp_link_page( $i ) . $link . '</a>';\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\t * Filter the HTML output of individual page number links.\n\t\t\t\t *\n\t\t\t\t * @since 3.6.0\n\t\t\t\t *\n\t\t\t\t * @param string $link The page number HTML output.\n\t\t\t\t * @param int    $i    Page number for paginated posts' page links.\n\t\t\t\t */\n\t\t\t\t$link = apply_filters( 'wp_link_pages_link', $link, $i );\n\n\t\t\t\t// Use the custom links separator beginning with the second link.\n\t\t\t\t$output .= ( 1 === $i ) ? ' ' : $r['separator'];\n\t\t\t\t$output .= $link;\n\t\t\t}\n\t\t\t$output .= $r['after'];\n\t\t} elseif ( $more ) {\n\t\t\t$output .= $r['before'];\n\t\t\t$prev = $page - 1;\n\t\t\tif ( $prev > 0 ) {\n\t\t\t\t$link = _wp_link_page( $prev ) . $r['link_before'] . $r['previouspagelink'] . $r['link_after'] . '</a>';\n\n\t\t\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t\t\t$output .= apply_filters( 'wp_link_pages_link', $link, $prev );\n\t\t\t}\n\t\t\t$next = $page + 1;\n\t\t\tif ( $next <= $numpages ) {\n\t\t\t\tif ( $prev ) {\n\t\t\t\t\t$output .= $r['separator'];\n\t\t\t\t}\n\t\t\t\t$link = _wp_link_page( $next ) . $r['link_before'] . $r['nextpagelink'] . $r['link_after'] . '</a>';\n\n\t\t\t\t/** This filter is documented in wp-includes/post-template.php */\n\t\t\t\t$output .= apply_filters( 'wp_link_pages_link', $link, $next );\n\t\t\t}\n\t\t\t$output .= $r['after'];\n\t\t}\n\t}\n\n\t/**\n\t * Filter the HTML output of page links for paginated posts.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param string $output HTML output of paginated posts' page links.\n\t * @param array  $args   An array of arguments.\n\t */\n\t$html = apply_filters( 'wp_link_pages', $output, $args );\n\n\tif ( $r['echo'] ) {\n\t\techo $html;\n\t}\n\treturn $html;\n}\n\n/**\n * Helper function for wp_link_pages().\n *\n * @since 3.1.0\n * @access private\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param int $i Page number.\n * @return string Link.\n */\nfunction _wp_link_page( $i ) {\n\tglobal $wp_rewrite;\n\t$post = get_post();\n\t$query_args = array();\n\n\tif ( 1 == $i ) {\n\t\t$url = get_permalink();\n\t} else {\n\t\tif ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) )\n\t\t\t$url = add_query_arg( 'page', $i, get_permalink() );\n\t\telseif ( 'page' == get_option('show_on_front') && get_option('page_on_front') == $post->ID )\n\t\t\t$url = trailingslashit(get_permalink()) . user_trailingslashit(\"$wp_rewrite->pagination_base/\" . $i, 'single_paged');\n\t\telse\n\t\t\t$url = trailingslashit(get_permalink()) . user_trailingslashit($i, 'single_paged');\n\t}\n\n\tif ( is_preview() ) {\n\n\t\tif ( ( 'draft' !== $post->post_status ) && isset( $_GET['preview_id'], $_GET['preview_nonce'] ) ) {\n\t\t\t$query_args['preview_id'] = wp_unslash( $_GET['preview_id'] );\n\t\t\t$query_args['preview_nonce'] = wp_unslash( $_GET['preview_nonce'] );\n\t\t}\n\n\t\t$url = get_preview_post_link( $post, $query_args, $url );\n\t}\n\n\treturn '<a href=\"' . esc_url( $url ) . '\">';\n}\n\n//\n// Post-meta: Custom per-post fields.\n//\n\n/**\n * Retrieve post custom meta data field.\n *\n * @since 1.5.0\n *\n * @param string $key Meta data key name.\n * @return false|string|array Array of values or single value, if only one element exists. False will be returned if key does not exist.\n */\nfunction post_custom( $key = '' ) {\n\t$custom = get_post_custom();\n\n\tif ( !isset( $custom[$key] ) )\n\t\treturn false;\n\telseif ( 1 == count($custom[$key]) )\n\t\treturn $custom[$key][0];\n\telse\n\t\treturn $custom[$key];\n}\n\n/**\n * Display list of post custom fields.\n *\n * @since 1.2.0\n *\n * @internal This will probably change at some point...\n *\n */\nfunction the_meta() {\n\tif ( $keys = get_post_custom_keys() ) {\n\t\techo \"<ul class='post-meta'>\\n\";\n\t\tforeach ( (array) $keys as $key ) {\n\t\t\t$keyt = trim($key);\n\t\t\tif ( is_protected_meta( $keyt, 'post' ) )\n\t\t\t\tcontinue;\n\t\t\t$values = array_map('trim', get_post_custom_values($key));\n\t\t\t$value = implode($values,', ');\n\n\t\t\t/**\n\t\t\t * Filter the HTML output of the li element in the post custom fields list.\n\t\t\t *\n\t\t\t * @since 2.2.0\n\t\t\t *\n\t\t\t * @param string $html  The HTML output for the li element.\n\t\t\t * @param string $key   Meta key.\n\t\t\t * @param string $value Meta value.\n\t\t\t */\n\t\t\techo apply_filters( 'the_meta_key', \"<li><span class='post-meta-key'>$key:</span> $value</li>\\n\", $key, $value );\n\t\t}\n\t\techo \"</ul>\\n\";\n\t}\n}\n\n//\n// Pages\n//\n\n/**\n * Retrieve or display list of pages as a dropdown (select list).\n *\n * @since 2.1.0\n * @since 4.2.0 The `$value_field` argument was added.\n * @since 4.3.0 The `$class` argument was added.\n *\n * @param array|string $args {\n *     Optional. Array or string of arguments to generate a pages drop-down element.\n *\n *     @type int          $depth                 Maximum depth. Default 0.\n *     @type int          $child_of              Page ID to retrieve child pages of. Default 0.\n *     @type int|string   $selected              Value of the option that should be selected. Default 0.\n *     @type bool|int     $echo                  Whether to echo or return the generated markup. Accepts 0, 1,\n *                                               or their bool equivalents. Default 1.\n *     @type string       $name                  Value for the 'name' attribute of the select element.\n *                                               Default 'page_id'.\n *     @type string       $id                    Value for the 'id' attribute of the select element.\n *     @type string       $class                 Value for the 'class' attribute of the select element. Default: none.\n *                                               Defaults to the value of `$name`.\n *     @type string       $show_option_none      Text to display for showing no pages. Default empty (does not display).\n *     @type string       $show_option_no_change Text to display for \"no change\" option. Default empty (does not display).\n *     @type string       $option_none_value     Value to use when no page is selected. Default empty.\n *     @type string       $value_field           Post field used to populate the 'value' attribute of the option\n *                                               elements. Accepts any valid post field. Default 'ID'.\n * }\n * @return string HTML content, if not displaying.\n */\nfunction wp_dropdown_pages( $args = '' ) {\n\t$defaults = array(\n\t\t'depth' => 0, 'child_of' => 0,\n\t\t'selected' => 0, 'echo' => 1,\n\t\t'name' => 'page_id', 'id' => '',\n\t\t'class' => '',\n\t\t'show_option_none' => '', 'show_option_no_change' => '',\n\t\t'option_none_value' => '',\n\t\t'value_field' => 'ID',\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$pages = get_pages( $r );\n\t$output = '';\n\t// Back-compat with old system where both id and name were based on $name argument\n\tif ( empty( $r['id'] ) ) {\n\t\t$r['id'] = $r['name'];\n\t}\n\n\tif ( ! empty( $pages ) ) {\n\t\t$class = '';\n\t\tif ( ! empty( $r['class'] ) ) {\n\t\t\t$class = \" class='\" . esc_attr( $r['class'] ) . \"'\";\n\t\t}\n\n\t\t$output = \"<select name='\" . esc_attr( $r['name'] ) . \"'\" . $class . \" id='\" . esc_attr( $r['id'] ) . \"'>\\n\";\n\t\tif ( $r['show_option_no_change'] ) {\n\t\t\t$output .= \"\\t<option value=\\\"-1\\\">\" . $r['show_option_no_change'] . \"</option>\\n\";\n\t\t}\n\t\tif ( $r['show_option_none'] ) {\n\t\t\t$output .= \"\\t<option value=\\\"\" . esc_attr( $r['option_none_value'] ) . '\">' . $r['show_option_none'] . \"</option>\\n\";\n\t\t}\n\t\t$output .= walk_page_dropdown_tree( $pages, $r['depth'], $r );\n\t\t$output .= \"</select>\\n\";\n\t}\n\n\t/**\n\t * Filter the HTML output of a list of pages as a drop down.\n\t *\n\t * @since 2.1.0\n\t * @since 4.4.0 `$r` and `$pages` added as arguments.\n\t *\n\t * @param string $output HTML output for drop down list of pages.\n\t * @param array  $r      The parsed arguments array.\n\t * @param array  $pages  List of WP_Post objects returned by `get_pages()`\n \t */\n\t$html = apply_filters( 'wp_dropdown_pages', $output, $r, $pages );\n\n\tif ( $r['echo'] ) {\n\t\techo $html;\n\t}\n\treturn $html;\n}\n\n/**\n * Retrieve or display list of pages in list (li) format.\n *\n * @since 1.5.0\n *\n * @see get_pages()\n *\n * @global WP_Query $wp_query\n *\n * @param array|string $args {\n *     Array or string of arguments. Optional.\n *\n *     @type int    $child_of     Display only the sub-pages of a single page by ID. Default 0 (all pages).\n *     @type string $authors      Comma-separated list of author IDs. Default empty (all authors).\n *     @type string $date_format  PHP date format to use for the listed pages. Relies on the 'show_date' parameter.\n *                                Default is the value of 'date_format' option.\n *     @type int    $depth        Number of levels in the hierarchy of pages to include in the generated list.\n *                                Accepts -1 (any depth), 0 (all pages), 1 (top-level pages only), and n (pages to\n *                                the given n depth). Default 0.\n *     @type bool   $echo         Whether or not to echo the list of pages. Default true.\n *     @type string $exclude      Comma-separated list of page IDs to exclude. Default empty.\n *     @type array  $include      Comma-separated list of page IDs to include. Default empty.\n *     @type string $link_after   Text or HTML to follow the page link label. Default null.\n *     @type string $link_before  Text or HTML to precede the page link label. Default null.\n *     @type string $post_type    Post type to query for. Default 'page'.\n *     @type string $post_status  Comma-separated list of post statuses to include. Default 'publish'.\n *     @type string $show_date\t  Whether to display the page publish or modified date for each page. Accepts\n *                                'modified' or any other value. An empty value hides the date. Default empty.\n *     @type string $sort_column  Comma-separated list of column names to sort the pages by. Accepts 'post_author',\n *                                'post_date', 'post_title', 'post_name', 'post_modified', 'post_modified_gmt',\n *                                'menu_order', 'post_parent', 'ID', 'rand', or 'comment_count'. Default 'post_title'.\n *     @type string $title_li     List heading. Passing a null or empty value will result in no heading, and the list\n *                                will not be wrapped with unordered list `<ul>` tags. Default 'Pages'.\n *     @type Walker $walker       Walker instance to use for listing pages. Default empty (Walker_Page).\n * }\n * @return string|void HTML list of pages.\n */\nfunction wp_list_pages( $args = '' ) {\n\t$defaults = array(\n\t\t'depth' => 0, 'show_date' => '',\n\t\t'date_format' => get_option( 'date_format' ),\n\t\t'child_of' => 0, 'exclude' => '',\n\t\t'title_li' => __( 'Pages' ), 'echo' => 1,\n\t\t'authors' => '', 'sort_column' => 'menu_order, post_title',\n\t\t'link_before' => '', 'link_after' => '', 'walker' => '',\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$output = '';\n\t$current_page = 0;\n\n\t// sanitize, mostly to keep spaces out\n\t$r['exclude'] = preg_replace( '/[^0-9,]/', '', $r['exclude'] );\n\n\t// Allow plugins to filter an array of excluded pages (but don't put a nullstring into the array)\n\t$exclude_array = ( $r['exclude'] ) ? explode( ',', $r['exclude'] ) : array();\n\n\t/**\n\t * Filter the array of pages to exclude from the pages list.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array $exclude_array An array of page IDs to exclude.\n\t */\n\t$r['exclude'] = implode( ',', apply_filters( 'wp_list_pages_excludes', $exclude_array ) );\n\n\t// Query pages.\n\t$r['hierarchical'] = 0;\n\t$pages = get_pages( $r );\n\n\tif ( ! empty( $pages ) ) {\n\t\tif ( $r['title_li'] ) {\n\t\t\t$output .= '<li class=\"pagenav\">' . $r['title_li'] . '<ul>';\n\t\t}\n\t\tglobal $wp_query;\n\t\tif ( is_page() || is_attachment() || $wp_query->is_posts_page ) {\n\t\t\t$current_page = get_queried_object_id();\n\t\t} elseif ( is_singular() ) {\n\t\t\t$queried_object = get_queried_object();\n\t\t\tif ( is_post_type_hierarchical( $queried_object->post_type ) ) {\n\t\t\t\t$current_page = $queried_object->ID;\n\t\t\t}\n\t\t}\n\n\t\t$output .= walk_page_tree( $pages, $r['depth'], $current_page, $r );\n\n\t\tif ( $r['title_li'] ) {\n\t\t\t$output .= '</ul></li>';\n\t\t}\n\t}\n\n\t/**\n\t * Filter the HTML output of the pages to list.\n\t *\n\t * @since 1.5.1\n\t * @since 4.4.0 `$pages` added as arguments.\n\t *\n\t * @see wp_list_pages()\n\t *\n\t * @param string $output HTML output of the pages list.\n\t * @param array  $r      An array of page-listing arguments.\n\t * @param array  $pages  List of WP_Post objects returned by `get_pages()`\n\t */\n\t$html = apply_filters( 'wp_list_pages', $output, $r, $pages );\n\n\tif ( $r['echo'] ) {\n\t\techo $html;\n\t} else {\n\t\treturn $html;\n\t}\n}\n\n/**\n * Display or retrieve list of pages with optional home link.\n *\n * The arguments are listed below and part of the arguments are for {@link\n * wp_list_pages()} function. Check that function for more info on those\n * arguments.\n *\n * @since 2.7.0\n * @since 4.4.0 Added `menu_id`, `container`, `before`, `after`, and `walker` arguments.\n *\n * @param array|string $args {\n *     Optional. Arguments to generate a page menu. See wp_list_pages() for additional arguments.\n *\n *     @type string          $sort_column How to short the list of pages. Accepts post column names.\n *                                        Default 'menu_order, post_title'.\n *     @type string          $menu_id     ID for the div containing the page list. Default is empty string.\n *     @type string          $menu_class  Class to use for the element containing the page list. Default 'menu'.\n *     @type string          $container   Element to use for the element containing the page list. Default 'div'.\n *     @type bool            $echo        Whether to echo the list or return it. Accepts true (echo) or false (return).\n *                                        Default true.\n *     @type int|bool|string $show_home   Whether to display the link to the home page. Can just enter the text\n *                                        you'd like shown for the home link. 1|true defaults to 'Home'.\n *     @type string          $link_before The HTML or text to prepend to $show_home text. Default empty.\n *     @type string          $link_after  The HTML or text to append to $show_home text. Default empty.\n *     @type string          $before      The HTML or text to prepend to the menu. Default is '<ul>'.\n *     @type string          $after       The HTML or text to append to the menu. Default is '</ul>'.\n *     @type Walker          $walker      Walker instance to use for listing pages. Default empty (Walker_Page).\n * }\n * @return string|void HTML menu\n */\nfunction wp_page_menu( $args = array() ) {\n\t$defaults = array(\n\t\t'sort_column' => 'menu_order, post_title',\n\t\t'menu_id'     => '',\n\t\t'menu_class'  => 'menu',\n\t\t'container'   => 'div',\n\t\t'echo'        => true,\n\t\t'link_before' => '',\n\t\t'link_after'  => '',\n\t\t'before'      => '<ul>',\n\t\t'after'       => '</ul>',\n\t\t'walker'      => '',\n\t);\n\t$args = wp_parse_args( $args, $defaults );\n\n\t/**\n\t * Filter the arguments used to generate a page-based menu.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @see wp_page_menu()\n\t *\n\t * @param array $args An array of page menu arguments.\n\t */\n\t$args = apply_filters( 'wp_page_menu_args', $args );\n\n\t$menu = '';\n\n\t$list_args = $args;\n\n\t// Show Home in the menu\n\tif ( ! empty($args['show_home']) ) {\n\t\tif ( true === $args['show_home'] || '1' === $args['show_home'] || 1 === $args['show_home'] )\n\t\t\t$text = __('Home');\n\t\telse\n\t\t\t$text = $args['show_home'];\n\t\t$class = '';\n\t\tif ( is_front_page() && !is_paged() )\n\t\t\t$class = 'class=\"current_page_item\"';\n\t\t$menu .= '<li ' . $class . '><a href=\"' . home_url( '/' ) . '\">' . $args['link_before'] . $text . $args['link_after'] . '</a></li>';\n\t\t// If the front page is a page, add it to the exclude list\n\t\tif (get_option('show_on_front') == 'page') {\n\t\t\tif ( !empty( $list_args['exclude'] ) ) {\n\t\t\t\t$list_args['exclude'] .= ',';\n\t\t\t} else {\n\t\t\t\t$list_args['exclude'] = '';\n\t\t\t}\n\t\t\t$list_args['exclude'] .= get_option('page_on_front');\n\t\t}\n\t}\n\n\t$list_args['echo'] = false;\n\t$list_args['title_li'] = '';\n\t$menu .= str_replace( array( \"\\r\", \"\\n\", \"\\t\" ), '', wp_list_pages($list_args) );\n\n\t$container = sanitize_text_field( $args['container'] );\n\n\t// Fallback in case `wp_nav_menu()` was called without a container.\n\tif ( empty( $container ) ) {\n\t\t$container = 'div';\n\t}\n\n\tif ( $menu ) {\n\n\t\t// wp_nav_menu doesn't set before and after\n\t\tif ( isset( $args['fallback_cb'] ) &&\n\t\t\t'wp_page_menu' === $args['fallback_cb'] &&\n\t\t\t'ul' !== $container ) {\n\t\t\t$args['before'] = '<ul>';\n\t\t\t$args['after'] = '</ul>';\n\t\t}\n\n\t\t$menu = $args['before'] . $menu . $args['after'];\n\t}\n\n\t$attrs = '';\n\tif ( ! empty( $args['menu_id'] ) ) {\n\t\t$attrs .= ' id=\"' . esc_attr( $args['menu_id'] ) . '\"';\n\t}\n\n\tif ( ! empty( $args['menu_class'] ) ) {\n\t\t$attrs .= ' class=\"' . esc_attr( $args['menu_class'] ) . '\"';\n\t}\n\n\t$menu = \"<{$container}{$attrs}>\" . $menu . \"</{$container}>\\n\";\n\n\t/**\n\t * Filter the HTML output of a page-based menu.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @see wp_page_menu()\n\t *\n\t * @param string $menu The HTML output.\n\t * @param array  $args An array of arguments.\n\t */\n\t$menu = apply_filters( 'wp_page_menu', $menu, $args );\n\tif ( $args['echo'] )\n\t\techo $menu;\n\telse\n\t\treturn $menu;\n}\n\n//\n// Page helpers\n//\n\n/**\n * Retrieve HTML list content for page list.\n *\n * @uses Walker_Page to create HTML list content.\n * @since 2.1.0\n *\n * @param array $pages\n * @param int   $depth\n * @param int   $current_page\n * @param array $r\n * @return string\n */\nfunction walk_page_tree( $pages, $depth, $current_page, $r ) {\n\tif ( empty($r['walker']) )\n\t\t$walker = new Walker_Page;\n\telse\n\t\t$walker = $r['walker'];\n\n\tforeach ( (array) $pages as $page ) {\n\t\tif ( $page->post_parent )\n\t\t\t$r['pages_with_children'][ $page->post_parent ] = true;\n\t}\n\n\t$args = array($pages, $depth, $r, $current_page);\n\treturn call_user_func_array(array($walker, 'walk'), $args);\n}\n\n/**\n * Retrieve HTML dropdown (select) content for page list.\n *\n * @uses Walker_PageDropdown to create HTML dropdown content.\n * @since 2.1.0\n * @see Walker_PageDropdown::walk() for parameters and return description.\n *\n * @return string\n */\nfunction walk_page_dropdown_tree() {\n\t$args = func_get_args();\n\tif ( empty($args[2]['walker']) ) // the user's options are the third parameter\n\t\t$walker = new Walker_PageDropdown;\n\telse\n\t\t$walker = $args[2]['walker'];\n\n\treturn call_user_func_array(array($walker, 'walk'), $args);\n}\n\n//\n// Attachments\n//\n\n/**\n * Display an attachment page link using an image or icon.\n *\n * @since 2.0.0\n *\n * @param int|WP_Post $id Optional. Post ID or post object.\n * @param bool        $fullsize     Optional, default is false. Whether to use full size.\n * @param bool        $deprecated   Deprecated. Not used.\n * @param bool        $permalink    Optional, default is false. Whether to include permalink.\n */\nfunction the_attachment_link( $id = 0, $fullsize = false, $deprecated = false, $permalink = false ) {\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '2.5' );\n\n\tif ( $fullsize )\n\t\techo wp_get_attachment_link($id, 'full', $permalink);\n\telse\n\t\techo wp_get_attachment_link($id, 'thumbnail', $permalink);\n}\n\n/**\n * Retrieve an attachment page link using an image or icon, if possible.\n *\n * @since 2.5.0\n * @since 4.4.0 The `$id` parameter can now accept either a post ID or `WP_Post` object.\n *\n * @param int|WP_Post  $id        Optional. Post ID or post object.\n * @param string|array $size      Optional. Image size. Accepts any valid image size, or an array\n *                                of width and height values in pixels (in that order).\n *                                Default 'thumbnail'.\n * @param bool         $permalink Optional, Whether to add permalink to image. Default false.\n * @param bool         $icon      Optional. Whether the attachment is an icon. Default false.\n * @param string|false $text      Optional. Link text to use. Activated by passing a string, false otherwise.\n *                                Default false.\n * @param array|string $attr      Optional. Array or string of attributes. Default empty.\n * @return string HTML content.\n */\nfunction wp_get_attachment_link( $id = 0, $size = 'thumbnail', $permalink = false, $icon = false, $text = false, $attr = '' ) {\n\t$_post = get_post( $id );\n\n\tif ( empty( $_post ) || ( 'attachment' != $_post->post_type ) || ! $url = wp_get_attachment_url( $_post->ID ) )\n\t\treturn __( 'Missing Attachment' );\n\n\tif ( $permalink )\n\t\t$url = get_attachment_link( $_post->ID );\n\n\tif ( $text ) {\n\t\t$link_text = $text;\n\t} elseif ( $size && 'none' != $size ) {\n\t\t$link_text = wp_get_attachment_image( $_post->ID, $size, $icon, $attr );\n\t} else {\n\t\t$link_text = '';\n\t}\n\n\tif ( trim( $link_text ) == '' )\n\t\t$link_text = $_post->post_title;\n\n\t/**\n\t * Filter a retrieved attachment page link.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string       $link_html The page link HTML output.\n\t * @param int          $id        Post ID.\n\t * @param string|array $size      Size of the image. Image size or array of width and height values (in that order).\n\t *                                Default 'thumbnail'.\n\t * @param bool         $permalink Whether to add permalink to image. Default false.\n\t * @param bool         $icon      Whether to include an icon. Default false.\n\t * @param string|bool  $text      If string, will be link text. Default false.\n\t */\n\treturn apply_filters( 'wp_get_attachment_link', \"<a href='$url'>$link_text</a>\", $id, $size, $permalink, $icon, $text );\n}\n\n/**\n * Wrap attachment in paragraph tag before content.\n *\n * @since 2.0.0\n *\n * @param string $content\n * @return string\n */\nfunction prepend_attachment($content) {\n\t$post = get_post();\n\n\tif ( empty($post->post_type) || $post->post_type != 'attachment' )\n\t\treturn $content;\n\n\tif ( wp_attachment_is( 'video', $post ) ) {\n\t\t$meta = wp_get_attachment_metadata( get_the_ID() );\n\t\t$atts = array( 'src' => wp_get_attachment_url() );\n\t\tif ( ! empty( $meta['width'] ) && ! empty( $meta['height'] ) ) {\n\t\t\t$atts['width'] = (int) $meta['width'];\n\t\t\t$atts['height'] = (int) $meta['height'];\n\t\t}\n\t\tif ( has_post_thumbnail() ) {\n\t\t\t$atts['poster'] = wp_get_attachment_url( get_post_thumbnail_id() );\n\t\t}\n\t\t$p = wp_video_shortcode( $atts );\n\t} elseif ( wp_attachment_is( 'audio', $post ) ) {\n\t\t$p = wp_audio_shortcode( array( 'src' => wp_get_attachment_url() ) );\n\t} else {\n\t\t$p = '<p class=\"attachment\">';\n\t\t// show the medium sized image representation of the attachment if available, and link to the raw file\n\t\t$p .= wp_get_attachment_link(0, 'medium', false);\n\t\t$p .= '</p>';\n\t}\n\n\t/**\n\t * Filter the attachment markup to be prepended to the post content.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @see prepend_attachment()\n\t *\n\t * @param string $p The attachment HTML output.\n\t */\n\t$p = apply_filters( 'prepend_attachment', $p );\n\n\treturn \"$p\\n$content\";\n}\n\n//\n// Misc\n//\n\n/**\n * Retrieve protected post password form content.\n *\n * @since 1.0.0\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.\n * @return string HTML content for password form for password protected post.\n */\nfunction get_the_password_form( $post = 0 ) {\n\t$post = get_post( $post );\n\t$label = 'pwbox-' . ( empty($post->ID) ? rand() : $post->ID );\n\t$output = '<form action=\"' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '\" class=\"post-password-form\" method=\"post\">\n\t<p>' . __( 'This content is password protected. To view it please enter your password below:' ) . '</p>\n\t<p><label for=\"' . $label . '\">' . __( 'Password:' ) . ' <input name=\"post_password\" id=\"' . $label . '\" type=\"password\" size=\"20\" /></label> <input type=\"submit\" name=\"Submit\" value=\"' . esc_attr__( 'Submit' ) . '\" /></p></form>\n\t';\n\n\t/**\n\t * Filter the HTML output for the protected post password form.\n\t *\n\t * If modifying the password field, please note that the core database schema\n\t * limits the password field to 20 characters regardless of the value of the\n\t * size attribute in the form input.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param string $output The password form HTML output.\n\t */\n\treturn apply_filters( 'the_password_form', $output );\n}\n\n/**\n * Whether currently in a page template.\n *\n * This template tag allows you to determine if you are in a page template.\n * You can optionally provide a template name or array of template names\n * and then the check will be specific to that template.\n *\n * @since 2.5.0\n * @since 4.2.0 The `$template` parameter was changed to also accept an array of page templates.\n *\n * @param string|array $template The specific template name or array of templates to match.\n * @return bool True on success, false on failure.\n */\nfunction is_page_template( $template = '' ) {\n\tif ( ! is_page() )\n\t\treturn false;\n\n\t$page_template = get_page_template_slug( get_queried_object_id() );\n\n\tif ( empty( $template ) )\n\t\treturn (bool) $page_template;\n\n\tif ( $template == $page_template )\n\t\treturn true;\n\n\tif ( is_array( $template ) ) {\n\t\tif ( ( in_array( 'default', $template, true ) && ! $page_template )\n\t\t\t|| in_array( $page_template, $template, true )\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn ( 'default' === $template && ! $page_template );\n}\n\n/**\n * Get the specific template name for a page.\n *\n * @since 3.4.0\n *\n * @param int $post_id Optional. The page ID to check. Defaults to the current post, when used in the loop.\n * @return string|false Page template filename. Returns an empty string when the default page template\n * \tis in use. Returns false if the post is not a page.\n */\nfunction get_page_template_slug( $post_id = null ) {\n\t$post = get_post( $post_id );\n\tif ( ! $post || 'page' != $post->post_type )\n\t\treturn false;\n\t$template = get_post_meta( $post->ID, '_wp_page_template', true );\n\tif ( ! $template || 'default' == $template )\n\t\treturn '';\n\treturn $template;\n}\n\n/**\n * Retrieve formatted date timestamp of a revision (linked to that revisions's page).\n *\n * @since 2.6.0\n *\n * @param int|object $revision Revision ID or revision object.\n * @param bool       $link     Optional, default is true. Link to revisions's page?\n * @return string|false i18n formatted datetimestamp or localized 'Current Revision'.\n */\nfunction wp_post_revision_title( $revision, $link = true ) {\n\tif ( !$revision = get_post( $revision ) )\n\t\treturn $revision;\n\n\tif ( !in_array( $revision->post_type, array( 'post', 'page', 'revision' ) ) )\n\t\treturn false;\n\n\t/* translators: revision date format, see http://php.net/date */\n\t$datef = _x( 'F j, Y @ H:i:s', 'revision date format' );\n\t/* translators: 1: date */\n\t$autosavef = _x( '%1$s [Autosave]', 'post revision title extra' );\n\t/* translators: 1: date */\n\t$currentf  = _x( '%1$s [Current Revision]', 'post revision title extra' );\n\n\t$date = date_i18n( $datef, strtotime( $revision->post_modified ) );\n\tif ( $link && current_user_can( 'edit_post', $revision->ID ) && $link = get_edit_post_link( $revision->ID ) )\n\t\t$date = \"<a href='$link'>$date</a>\";\n\n\tif ( !wp_is_post_revision( $revision ) )\n\t\t$date = sprintf( $currentf, $date );\n\telseif ( wp_is_post_autosave( $revision ) )\n\t\t$date = sprintf( $autosavef, $date );\n\n\treturn $date;\n}\n\n/**\n * Retrieve formatted date timestamp of a revision (linked to that revisions's page).\n *\n * @since 3.6.0\n *\n * @param int|object $revision Revision ID or revision object.\n * @param bool       $link     Optional, default is true. Link to revisions's page?\n * @return string|false gravatar, user, i18n formatted datetimestamp or localized 'Current Revision'.\n */\nfunction wp_post_revision_title_expanded( $revision, $link = true ) {\n\tif ( !$revision = get_post( $revision ) )\n\t\treturn $revision;\n\n\tif ( !in_array( $revision->post_type, array( 'post', 'page', 'revision' ) ) )\n\t\treturn false;\n\n\t$author = get_the_author_meta( 'display_name', $revision->post_author );\n\t/* translators: revision date format, see http://php.net/date */\n\t$datef = _x( 'F j, Y @ H:i:s', 'revision date format' );\n\n\t$gravatar = get_avatar( $revision->post_author, 24 );\n\n\t$date = date_i18n( $datef, strtotime( $revision->post_modified ) );\n\tif ( $link && current_user_can( 'edit_post', $revision->ID ) && $link = get_edit_post_link( $revision->ID ) )\n\t\t$date = \"<a href='$link'>$date</a>\";\n\n\t$revision_date_author = sprintf(\n\t\t/* translators: post revision title: 1: author avatar, 2: author name, 3: time ago, 4: date */\n\t\t_x( '%1$s %2$s, %3$s ago (%4$s)', 'post revision title' ),\n\t\t$gravatar,\n\t\t$author,\n\t\thuman_time_diff( strtotime( $revision->post_modified ), current_time( 'timestamp' ) ),\n\t\t$date\n\t);\n\n\t$autosavef = __( '%1$s [Autosave]' );\n\t$currentf  = __( '%1$s [Current Revision]' );\n\n\tif ( !wp_is_post_revision( $revision ) )\n\t\t$revision_date_author = sprintf( $currentf, $revision_date_author );\n\telseif ( wp_is_post_autosave( $revision ) )\n\t\t$revision_date_author = sprintf( $autosavef, $revision_date_author );\n\n\t/**\n\t * Filter the formatted author and date for a revision.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string  $revision_date_author The formatted string.\n\t * @param WP_Post $revision             The revision object.\n\t * @param bool    $link                 Whether to link to the revisions page, as passed into\n\t *                                      wp_post_revision_title_expanded().\n\t */\n\treturn apply_filters( 'wp_post_revision_title_expanded', $revision_date_author, $revision, $link );\n}\n\n/**\n * Display list of a post's revisions.\n *\n * Can output either a UL with edit links or a TABLE with diff interface, and\n * restore action links.\n *\n * @since 2.6.0\n *\n * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post.\n * @param string      $type    'all' (default), 'revision' or 'autosave'\n */\nfunction wp_list_post_revisions( $post_id = 0, $type = 'all' ) {\n\tif ( ! $post = get_post( $post_id ) )\n\t\treturn;\n\n\t// $args array with (parent, format, right, left, type) deprecated since 3.6\n\tif ( is_array( $type ) ) {\n\t\t$type = ! empty( $type['type'] ) ? $type['type']  : $type;\n\t\t_deprecated_argument( __FUNCTION__, '3.6' );\n\t}\n\n\tif ( ! $revisions = wp_get_post_revisions( $post->ID ) )\n\t\treturn;\n\n\t$rows = '';\n\tforeach ( $revisions as $revision ) {\n\t\tif ( ! current_user_can( 'read_post', $revision->ID ) )\n\t\t\tcontinue;\n\n\t\t$is_autosave = wp_is_post_autosave( $revision );\n\t\tif ( ( 'revision' === $type && $is_autosave ) || ( 'autosave' === $type && ! $is_autosave ) )\n\t\t\tcontinue;\n\n\t\t$rows .= \"\\t<li>\" . wp_post_revision_title_expanded( $revision ) . \"</li>\\n\";\n\t}\n\n\techo \"<div class='hide-if-js'><p>\" . __( 'JavaScript must be enabled to use this feature.' ) . \"</p></div>\\n\";\n\n\techo \"<ul class='post-revisions hide-if-no-js'>\\n\";\n\techo $rows;\n\techo \"</ul>\";\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/post-thumbnail-template.php",
    "content": "<?php\n/**\n * WordPress Post Thumbnail Template Functions.\n *\n * Support for post thumbnails.\n * Theme's functions.php must call add_theme_support( 'post-thumbnails' ) to use these.\n *\n * @package WordPress\n * @subpackage Template\n */\n\n/**\n * Check if post has an image attached.\n *\n * @since 2.9.0\n * @since 4.4.0 `$post` can be a post ID or WP_Post object.\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.\n * @return bool Whether the post has an image attached.\n */\nfunction has_post_thumbnail( $post = null ) {\n\treturn (bool) get_post_thumbnail_id( $post );\n}\n\n/**\n * Retrieve post thumbnail ID.\n *\n * @since 2.9.0\n * @since 4.4.0 `$post` can be a post ID or WP_Post object.\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.\n * @return string|int Post thumbnail ID or empty string.\n */\nfunction get_post_thumbnail_id( $post = null ) {\n\t$post = get_post( $post );\n\tif ( ! $post ) {\n\t\treturn '';\n\t}\n\treturn get_post_meta( $post->ID, '_thumbnail_id', true );\n}\n\n/**\n * Display the post thumbnail.\n *\n * When a theme adds 'post-thumbnail' support, a special 'post-thumbnail' image size\n * is registered, which differs from the 'thumbnail' image size managed via the\n * Settings > Media screen.\n *\n * When using the_post_thumbnail() or related functions, the 'post-thumbnail' image\n * size is used by default, though a different size can be specified instead as needed.\n *\n * @since 2.9.0\n *\n * @see get_the_post_thumbnail()\n *\n * @param string|array $size Optional. Image size to use. Accepts any valid image size, or\n *                           an array of width and height values in pixels (in that order).\n *                           Default 'post-thumbnail'.\n * @param string|array $attr Optional. Query string or array of attributes. Default empty.\n */\nfunction the_post_thumbnail( $size = 'post-thumbnail', $attr = '' ) {\n\techo get_the_post_thumbnail( null, $size, $attr );\n}\n\n/**\n * Update cache for thumbnails in the current loop.\n *\n * @since 3.2.0\n *\n * @global WP_Query $wp_query\n *\n * @param WP_Query $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global.\n */\nfunction update_post_thumbnail_cache( $wp_query = null ) {\n\tif ( ! $wp_query )\n\t\t$wp_query = $GLOBALS['wp_query'];\n\n\tif ( $wp_query->thumbnails_cached )\n\t\treturn;\n\n\t$thumb_ids = array();\n\tforeach ( $wp_query->posts as $post ) {\n\t\tif ( $id = get_post_thumbnail_id( $post->ID ) )\n\t\t\t$thumb_ids[] = $id;\n\t}\n\n\tif ( ! empty ( $thumb_ids ) ) {\n\t\t_prime_post_caches( $thumb_ids, false, true );\n\t}\n\n\t$wp_query->thumbnails_cached = true;\n}\n\n/**\n * Retrieve the post thumbnail.\n *\n * When a theme adds 'post-thumbnail' support, a special 'post-thumbnail' image size\n * is registered, which differs from the 'thumbnail' image size managed via the\n * Settings > Media screen.\n *\n * When using the_post_thumbnail() or related functions, the 'post-thumbnail' image\n * size is used by default, though a different size can be specified instead as needed.\n *\n * @since 2.9.0\n * @since 4.4.0 `$post` can be a post ID or WP_Post object.\n *\n * @param int|WP_Post  $post Optional. Post ID or WP_Post object.  Default is global `$post`.\n * @param string|array $size Optional. Image size to use. Accepts any valid image size, or\n *                           an array of width and height values in pixels (in that order).\n *                           Default 'post-thumbnail'.\n * @param string|array $attr Optional. Query string or array of attributes. Default empty.\n * @return string The post thumbnail image tag.\n */\nfunction get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr = '' ) {\n\t$post = get_post( $post );\n\tif ( ! $post ) {\n\t\treturn '';\n\t}\n\t$post_thumbnail_id = get_post_thumbnail_id( $post );\n\n\t/**\n\t * Filter the post thumbnail size.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string|array $size The post thumbnail size. Image size or array of width and height\n\t *                           values (in that order). Default 'post-thumbnail'.\n\t */\n\t$size = apply_filters( 'post_thumbnail_size', $size );\n\n\tif ( $post_thumbnail_id ) {\n\n\t\t/**\n\t\t * Fires before fetching the post thumbnail HTML.\n\t\t *\n\t\t * Provides \"just in time\" filtering of all filters in wp_get_attachment_image().\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int          $post_id           The post ID.\n\t\t * @param string       $post_thumbnail_id The post thumbnail ID.\n\t\t * @param string|array $size              The post thumbnail size. Image size or array of width\n\t\t *                                        and height values (in that order). Default 'post-thumbnail'.\n\t\t */\n\t\tdo_action( 'begin_fetch_post_thumbnail_html', $post->ID, $post_thumbnail_id, $size );\n\t\tif ( in_the_loop() )\n\t\t\tupdate_post_thumbnail_cache();\n\t\t$html = wp_get_attachment_image( $post_thumbnail_id, $size, false, $attr );\n\n\t\t/**\n\t\t * Fires after fetching the post thumbnail HTML.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int          $post_id           The post ID.\n\t\t * @param string       $post_thumbnail_id The post thumbnail ID.\n\t\t * @param string|array $size              The post thumbnail size. Image size or array of width\n\t\t *                                        and height values (in that order). Default 'post-thumbnail'.\n\t\t */\n\t\tdo_action( 'end_fetch_post_thumbnail_html', $post->ID, $post_thumbnail_id, $size );\n\n\t} else {\n\t\t$html = '';\n\t}\n\t/**\n\t * Filter the post thumbnail HTML.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string       $html              The post thumbnail HTML.\n\t * @param int          $post_id           The post ID.\n\t * @param string       $post_thumbnail_id The post thumbnail ID.\n\t * @param string|array $size              The post thumbnail size. Image size or array of width and height\n\t *                                        values (in that order). Default 'post-thumbnail'.\n\t * @param string       $attr              Query string of attributes.\n\t */\n\treturn apply_filters( 'post_thumbnail_html', $html, $post->ID, $post_thumbnail_id, $size, $attr );\n}\n\n/**\n * Return the post thumbnail URL.\n *\n * @since 4.4.0\n *\n * @param int|WP_Post  $post Optional. Post ID or WP_Post object.  Default is global `$post`.\n * @param string|array $size Optional. Registered image size to retrieve the source for or a flat\n *                           array of height and width dimensions. Default 'post-thumbnail'.\n * @return string|false Post thumbnail URL or false if no URL is available.\n */\nfunction get_the_post_thumbnail_url( $post = null, $size = 'post-thumbnail' ) {\n\t$post_thumbnail_id = get_post_thumbnail_id( $post );\n\tif ( ! $post_thumbnail_id ) {\n\t\treturn false;\n\t}\n\treturn wp_get_attachment_image_url( $post_thumbnail_id, $size );\n}\n\n/**\n * Display the post thumbnail URL.\n *\n * @since 4.4.0\n *\n * @param string|array $size Optional. Image size to use. Accepts any valid image size,\n *                           or an array of width and height values in pixels (in that order).\n *                           Default 'post-thumbnail'.\n */\nfunction the_post_thumbnail_url( $size = 'post-thumbnail' ) {\n\t$url = get_the_post_thumbnail_url( null, $size );\n\tif ( $url ) {\n\t\techo esc_url( $url );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/post.php",
    "content": "<?php\n/**\n * Core Post API\n *\n * @package WordPress\n * @subpackage Post\n */\n\n//\n// Post Type Registration\n//\n\n/**\n * Creates the initial post types when 'init' action is fired.\n *\n * @since 2.9.0\n */\nfunction create_initial_post_types() {\n\tregister_post_type( 'post', array(\n\t\t'labels' => array(\n\t\t\t'name_admin_bar' => _x( 'Post', 'add new on admin bar' ),\n\t\t),\n\t\t'public'  => true,\n\t\t'_builtin' => true, /* internal use only. don't use this when registering your own post type. */\n\t\t'_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */\n\t\t'capability_type' => 'post',\n\t\t'map_meta_cap' => true,\n\t\t'menu_position' => 5,\n\t\t'hierarchical' => false,\n\t\t'rewrite' => false,\n\t\t'query_var' => false,\n\t\t'delete_with_user' => true,\n\t\t'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ),\n\t) );\n\n\tregister_post_type( 'page', array(\n\t\t'labels' => array(\n\t\t\t'name_admin_bar' => _x( 'Page', 'add new on admin bar' ),\n\t\t),\n\t\t'public' => true,\n\t\t'publicly_queryable' => false,\n\t\t'_builtin' => true, /* internal use only. don't use this when registering your own post type. */\n\t\t'_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */\n\t\t'capability_type' => 'page',\n\t\t'map_meta_cap' => true,\n\t\t'menu_position' => 20,\n\t\t'hierarchical' => true,\n\t\t'rewrite' => false,\n\t\t'query_var' => false,\n\t\t'delete_with_user' => true,\n\t\t'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'page-attributes', 'custom-fields', 'comments', 'revisions' ),\n\t) );\n\n\tregister_post_type( 'attachment', array(\n\t\t'labels' => array(\n\t\t\t'name' => _x('Media', 'post type general name'),\n\t\t\t'name_admin_bar' => _x( 'Media', 'add new from admin bar' ),\n\t\t\t'add_new' => _x( 'Add New', 'add new media' ),\n \t\t\t'edit_item' => __( 'Edit Media' ),\n \t\t\t'view_item' => __( 'View Attachment Page' ),\n\t\t),\n\t\t'public' => true,\n\t\t'show_ui' => true,\n\t\t'_builtin' => true, /* internal use only. don't use this when registering your own post type. */\n\t\t'_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */\n\t\t'capability_type' => 'post',\n\t\t'capabilities' => array(\n\t\t\t'create_posts' => 'upload_files',\n\t\t),\n\t\t'map_meta_cap' => true,\n\t\t'hierarchical' => false,\n\t\t'rewrite' => false,\n\t\t'query_var' => false,\n\t\t'show_in_nav_menus' => false,\n\t\t'delete_with_user' => true,\n\t\t'supports' => array( 'title', 'author', 'comments' ),\n\t) );\n\tadd_post_type_support( 'attachment:audio', 'thumbnail' );\n\tadd_post_type_support( 'attachment:video', 'thumbnail' );\n\n\tregister_post_type( 'revision', array(\n\t\t'labels' => array(\n\t\t\t'name' => __( 'Revisions' ),\n\t\t\t'singular_name' => __( 'Revision' ),\n\t\t),\n\t\t'public' => false,\n\t\t'_builtin' => true, /* internal use only. don't use this when registering your own post type. */\n\t\t'_edit_link' => 'revision.php?revision=%d', /* internal use only. don't use this when registering your own post type. */\n\t\t'capability_type' => 'post',\n\t\t'map_meta_cap' => true,\n\t\t'hierarchical' => false,\n\t\t'rewrite' => false,\n\t\t'query_var' => false,\n\t\t'can_export' => false,\n\t\t'delete_with_user' => true,\n\t\t'supports' => array( 'author' ),\n\t) );\n\n\tregister_post_type( 'nav_menu_item', array(\n\t\t'labels' => array(\n\t\t\t'name' => __( 'Navigation Menu Items' ),\n\t\t\t'singular_name' => __( 'Navigation Menu Item' ),\n\t\t),\n\t\t'public' => false,\n\t\t'_builtin' => true, /* internal use only. don't use this when registering your own post type. */\n\t\t'hierarchical' => false,\n\t\t'rewrite' => false,\n\t\t'delete_with_user' => false,\n\t\t'query_var' => false,\n\t) );\n\n\tregister_post_status( 'publish', array(\n\t\t'label'       => _x( 'Published', 'post' ),\n\t\t'public'      => true,\n\t\t'_builtin'    => true, /* internal use only. */\n\t\t'label_count' => _n_noop( 'Published <span class=\"count\">(%s)</span>', 'Published <span class=\"count\">(%s)</span>' ),\n\t) );\n\n\tregister_post_status( 'future', array(\n\t\t'label'       => _x( 'Scheduled', 'post' ),\n\t\t'protected'   => true,\n\t\t'_builtin'    => true, /* internal use only. */\n\t\t'label_count' => _n_noop('Scheduled <span class=\"count\">(%s)</span>', 'Scheduled <span class=\"count\">(%s)</span>' ),\n\t) );\n\n\tregister_post_status( 'draft', array(\n\t\t'label'       => _x( 'Draft', 'post' ),\n\t\t'protected'   => true,\n\t\t'_builtin'    => true, /* internal use only. */\n\t\t'label_count' => _n_noop( 'Draft <span class=\"count\">(%s)</span>', 'Drafts <span class=\"count\">(%s)</span>' ),\n\t) );\n\n\tregister_post_status( 'pending', array(\n\t\t'label'       => _x( 'Pending', 'post' ),\n\t\t'protected'   => true,\n\t\t'_builtin'    => true, /* internal use only. */\n\t\t'label_count' => _n_noop( 'Pending <span class=\"count\">(%s)</span>', 'Pending <span class=\"count\">(%s)</span>' ),\n\t) );\n\n\tregister_post_status( 'private', array(\n\t\t'label'       => _x( 'Private', 'post' ),\n\t\t'private'     => true,\n\t\t'_builtin'    => true, /* internal use only. */\n\t\t'label_count' => _n_noop( 'Private <span class=\"count\">(%s)</span>', 'Private <span class=\"count\">(%s)</span>' ),\n\t) );\n\n\tregister_post_status( 'trash', array(\n\t\t'label'       => _x( 'Trash', 'post' ),\n\t\t'internal'    => true,\n\t\t'_builtin'    => true, /* internal use only. */\n\t\t'label_count' => _n_noop( 'Trash <span class=\"count\">(%s)</span>', 'Trash <span class=\"count\">(%s)</span>' ),\n\t\t'show_in_admin_status_list' => true,\n\t) );\n\n\tregister_post_status( 'auto-draft', array(\n\t\t'label'    => 'auto-draft',\n\t\t'internal' => true,\n\t\t'_builtin' => true, /* internal use only. */\n\t) );\n\n\tregister_post_status( 'inherit', array(\n\t\t'label'    => 'inherit',\n\t\t'internal' => true,\n\t\t'_builtin' => true, /* internal use only. */\n\t\t'exclude_from_search' => false,\n\t) );\n}\n\n/**\n * Retrieve attached file path based on attachment ID.\n *\n * By default the path will go through the 'get_attached_file' filter, but\n * passing a true to the $unfiltered argument of get_attached_file() will\n * return the file path unfiltered.\n *\n * The function works by getting the single post meta name, named\n * '_wp_attached_file' and returning it. This is a convenience function to\n * prevent looking up the meta name and provide a mechanism for sending the\n * attached filename through a filter.\n *\n * @since 2.0.0\n *\n * @param int  $attachment_id Attachment ID.\n * @param bool $unfiltered    Optional. Whether to apply filters. Default false.\n * @return string|false The file path to where the attached file should be, false otherwise.\n */\nfunction get_attached_file( $attachment_id, $unfiltered = false ) {\n\t$file = get_post_meta( $attachment_id, '_wp_attached_file', true );\n\t// If the file is relative, prepend upload dir.\n\tif ( $file && 0 !== strpos($file, '/') && !preg_match('|^.:\\\\\\|', $file) && ( ($uploads = wp_upload_dir()) && false === $uploads['error'] ) )\n\t\t$file = $uploads['basedir'] . \"/$file\";\n\tif ( $unfiltered )\n\t\treturn $file;\n\n\t/**\n\t * Filter the attached file based on the given ID.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $file          Path to attached file.\n\t * @param int    $attachment_id Attachment ID.\n\t */\n\treturn apply_filters( 'get_attached_file', $file, $attachment_id );\n}\n\n/**\n * Update attachment file path based on attachment ID.\n *\n * Used to update the file path of the attachment, which uses post meta name\n * '_wp_attached_file' to store the path of the attachment.\n *\n * @since 2.1.0\n *\n * @param int    $attachment_id Attachment ID.\n * @param string $file          File path for the attachment.\n * @return bool True on success, false on failure.\n */\nfunction update_attached_file( $attachment_id, $file ) {\n\tif ( !get_post( $attachment_id ) )\n\t\treturn false;\n\n\t/**\n\t * Filter the path to the attached file to update.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $file          Path to the attached file to update.\n\t * @param int    $attachment_id Attachment ID.\n\t */\n\t$file = apply_filters( 'update_attached_file', $file, $attachment_id );\n\n\tif ( $file = _wp_relative_upload_path( $file ) )\n\t\treturn update_post_meta( $attachment_id, '_wp_attached_file', $file );\n\telse\n\t\treturn delete_post_meta( $attachment_id, '_wp_attached_file' );\n}\n\n/**\n * Return relative path to an uploaded file.\n *\n * The path is relative to the current upload dir.\n *\n * @since 2.9.0\n *\n * @param string $path Full path to the file.\n * @return string Relative path on success, unchanged path on failure.\n */\nfunction _wp_relative_upload_path( $path ) {\n\t$new_path = $path;\n\n\t$uploads = wp_upload_dir();\n\tif ( 0 === strpos( $new_path, $uploads['basedir'] ) ) {\n\t\t\t$new_path = str_replace( $uploads['basedir'], '', $new_path );\n\t\t\t$new_path = ltrim( $new_path, '/' );\n\t}\n\n\t/**\n\t * Filter the relative path to an uploaded file.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param string $new_path Relative path to the file.\n\t * @param string $path     Full path to the file.\n\t */\n\treturn apply_filters( '_wp_relative_upload_path', $new_path, $path );\n}\n\n/**\n * Retrieve all children of the post parent ID.\n *\n * Normally, without any enhancements, the children would apply to pages. In the\n * context of the inner workings of WordPress, pages, posts, and attachments\n * share the same table, so therefore the functionality could apply to any one\n * of them. It is then noted that while this function does not work on posts, it\n * does not mean that it won't work on posts. It is recommended that you know\n * what context you wish to retrieve the children of.\n *\n * Attachments may also be made the child of a post, so if that is an accurate\n * statement (which needs to be verified), it would then be possible to get\n * all of the attachments for a post. Attachments have since changed since\n * version 2.5, so this is most likely inaccurate, but serves generally as an\n * example of what is possible.\n *\n * The arguments listed as defaults are for this function and also of the\n * {@link get_posts()} function. The arguments are combined with the\n * get_children defaults and are then passed to the {@link get_posts()}\n * function, which accepts additional arguments. You can replace the defaults in\n * this function, listed below and the additional arguments listed in the\n * {@link get_posts()} function.\n *\n * The 'post_parent' is the most important argument and important attention\n * needs to be paid to the $args parameter. If you pass either an object or an\n * integer (number), then just the 'post_parent' is grabbed and everything else\n * is lost. If you don't specify any arguments, then it is assumed that you are\n * in The Loop and the post parent will be grabbed for from the current post.\n *\n * The 'post_parent' argument is the ID to get the children. The 'numberposts'\n * is the amount of posts to retrieve that has a default of '-1', which is\n * used to get all of the posts. Giving a number higher than 0 will only\n * retrieve that amount of posts.\n *\n * The 'post_type' and 'post_status' arguments can be used to choose what\n * criteria of posts to retrieve. The 'post_type' can be anything, but WordPress\n * post types are 'post', 'pages', and 'attachments'. The 'post_status'\n * argument will accept any post status within the write administration panels.\n *\n * @since 2.0.0\n *\n * @see get_posts()\n * @todo Check validity of description.\n *\n * @global WP_Post $post\n *\n * @param mixed  $args   Optional. User defined arguments for replacing the defaults. Default empty.\n * @param string $output Optional. Constant for return type. Accepts OBJECT, ARRAY_A, ARRAY_N.\n *                       Default OBJECT.\n * @return array Array of children, where the type of each element is determined by $output parameter.\n *               Empty array on failure.\n */\nfunction get_children( $args = '', $output = OBJECT ) {\n\t$kids = array();\n\tif ( empty( $args ) ) {\n\t\tif ( isset( $GLOBALS['post'] ) ) {\n\t\t\t$args = array('post_parent' => (int) $GLOBALS['post']->post_parent );\n\t\t} else {\n\t\t\treturn $kids;\n\t\t}\n\t} elseif ( is_object( $args ) ) {\n\t\t$args = array('post_parent' => (int) $args->post_parent );\n\t} elseif ( is_numeric( $args ) ) {\n\t\t$args = array('post_parent' => (int) $args);\n\t}\n\n\t$defaults = array(\n\t\t'numberposts' => -1, 'post_type' => 'any',\n\t\t'post_status' => 'any', 'post_parent' => 0,\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$children = get_posts( $r );\n\n\tif ( ! $children )\n\t\treturn $kids;\n\n\tif ( ! empty( $r['fields'] ) )\n\t\treturn $children;\n\n\tupdate_post_cache($children);\n\n\tforeach ( $children as $key => $child )\n\t\t$kids[$child->ID] = $children[$key];\n\n\tif ( $output == OBJECT ) {\n\t\treturn $kids;\n\t} elseif ( $output == ARRAY_A ) {\n\t\t$weeuns = array();\n\t\tforeach ( (array) $kids as $kid ) {\n\t\t\t$weeuns[$kid->ID] = get_object_vars($kids[$kid->ID]);\n\t\t}\n\t\treturn $weeuns;\n\t} elseif ( $output == ARRAY_N ) {\n\t\t$babes = array();\n\t\tforeach ( (array) $kids as $kid ) {\n\t\t\t$babes[$kid->ID] = array_values(get_object_vars($kids[$kid->ID]));\n\t\t}\n\t\treturn $babes;\n\t} else {\n\t\treturn $kids;\n\t}\n}\n\n/**\n * Get extended entry info (<!--more-->).\n *\n * There should not be any space after the second dash and before the word\n * 'more'. There can be text or space(s) after the word 'more', but won't be\n * referenced.\n *\n * The returned array has 'main', 'extended', and 'more_text' keys. Main has the text before\n * the `<!--more-->`. The 'extended' key has the content after the\n * `<!--more-->` comment. The 'more_text' key has the custom \"Read More\" text.\n *\n * @since 1.0.0\n *\n * @param string $post Post content.\n * @return array Post before ('main'), after ('extended'), and custom read more ('more_text').\n */\nfunction get_extended( $post ) {\n\t//Match the new style more links.\n\tif ( preg_match('/<!--more(.*?)?-->/', $post, $matches) ) {\n\t\tlist($main, $extended) = explode($matches[0], $post, 2);\n\t\t$more_text = $matches[1];\n\t} else {\n\t\t$main = $post;\n\t\t$extended = '';\n\t\t$more_text = '';\n\t}\n\n\t//  leading and trailing whitespace.\n\t$main = preg_replace('/^[\\s]*(.*)[\\s]*$/', '\\\\1', $main);\n\t$extended = preg_replace('/^[\\s]*(.*)[\\s]*$/', '\\\\1', $extended);\n\t$more_text = preg_replace('/^[\\s]*(.*)[\\s]*$/', '\\\\1', $more_text);\n\n\treturn array( 'main' => $main, 'extended' => $extended, 'more_text' => $more_text );\n}\n\n/**\n * Retrieves post data given a post ID or post object.\n *\n * See {@link sanitize_post()} for optional $filter values. Also, the parameter\n * $post, must be given as a variable, since it is passed by reference.\n *\n * @since 1.5.1\n *\n * @global WP_Post $post\n *\n * @param int|WP_Post|null $post   Optional. Post ID or post object. Defaults to global $post.\n * @param string           $output Optional, default is Object. Accepts OBJECT, ARRAY_A, or ARRAY_N.\n *                                 Default OBJECT.\n * @param string           $filter Optional. Type of filter to apply. Accepts 'raw', 'edit', 'db',\n *                                 or 'display'. Default 'raw'.\n * @return WP_Post|array|null Type corresponding to $output on success or null on failure.\n *                            When $output is OBJECT, a `WP_Post` instance is returned.\n */\nfunction get_post( $post = null, $output = OBJECT, $filter = 'raw' ) {\n\tif ( empty( $post ) && isset( $GLOBALS['post'] ) )\n\t\t$post = $GLOBALS['post'];\n\n\tif ( $post instanceof WP_Post ) {\n\t\t$_post = $post;\n\t} elseif ( is_object( $post ) ) {\n\t\tif ( empty( $post->filter ) ) {\n\t\t\t$_post = sanitize_post( $post, 'raw' );\n\t\t\t$_post = new WP_Post( $_post );\n\t\t} elseif ( 'raw' == $post->filter ) {\n\t\t\t$_post = new WP_Post( $post );\n\t\t} else {\n\t\t\t$_post = WP_Post::get_instance( $post->ID );\n\t\t}\n\t} else {\n\t\t$_post = WP_Post::get_instance( $post );\n\t}\n\n\tif ( ! $_post )\n\t\treturn null;\n\n\t$_post = $_post->filter( $filter );\n\n\tif ( $output == ARRAY_A )\n\t\treturn $_post->to_array();\n\telseif ( $output == ARRAY_N )\n\t\treturn array_values( $_post->to_array() );\n\n\treturn $_post;\n}\n\n/**\n * Retrieve ancestors of a post.\n *\n * @since 2.5.0\n *\n * @param int|WP_Post $post Post ID or post object.\n * @return array Ancestor IDs or empty array if none are found.\n */\nfunction get_post_ancestors( $post ) {\n\t$post = get_post( $post );\n\n\tif ( ! $post || empty( $post->post_parent ) || $post->post_parent == $post->ID )\n\t\treturn array();\n\n\t$ancestors = array();\n\n\t$id = $ancestors[] = $post->post_parent;\n\n\twhile ( $ancestor = get_post( $id ) ) {\n\t\t// Loop detection: If the ancestor has been seen before, break.\n\t\tif ( empty( $ancestor->post_parent ) || ( $ancestor->post_parent == $post->ID ) || in_array( $ancestor->post_parent, $ancestors ) )\n\t\t\tbreak;\n\n\t\t$id = $ancestors[] = $ancestor->post_parent;\n\t}\n\n\treturn $ancestors;\n}\n\n/**\n * Retrieve data from a post field based on Post ID.\n *\n * Examples of the post field will be, 'post_type', 'post_status', 'post_content',\n * etc and based off of the post object property or key names.\n *\n * The context values are based off of the taxonomy filter functions and\n * supported values are found within those functions.\n *\n * @since 2.3.0\n *\n * @see sanitize_post_field()\n *\n * @param string      $field   Post field name.\n * @param int|WP_Post $post    Post ID or post object.\n * @param string      $context Optional. How to filter the field. Accepts 'raw', 'edit', 'db',\n *                             or 'display'. Default 'display'.\n * @return string The value of the post field on success, empty string on failure.\n */\nfunction get_post_field( $field, $post, $context = 'display' ) {\n\t$post = get_post( $post );\n\n\tif ( !$post )\n\t\treturn '';\n\n\tif ( !isset($post->$field) )\n\t\treturn '';\n\n\treturn sanitize_post_field($field, $post->$field, $post->ID, $context);\n}\n\n/**\n * Retrieve the mime type of an attachment based on the ID.\n *\n * This function can be used with any post type, but it makes more sense with\n * attachments.\n *\n * @since 2.0.0\n *\n * @param int|WP_Post $ID Optional. Post ID or post object. Default empty.\n * @return string|false The mime type on success, false on failure.\n */\nfunction get_post_mime_type( $ID = '' ) {\n\t$post = get_post($ID);\n\n\tif ( is_object($post) )\n\t\treturn $post->post_mime_type;\n\n\treturn false;\n}\n\n/**\n * Retrieve the post status based on the Post ID.\n *\n * If the post ID is of an attachment, then the parent post status will be given\n * instead.\n *\n * @since 2.0.0\n *\n * @param int|WP_Post $ID Optional. Post ID or post object. Default empty.\n * @return string|false Post status on success, false on failure.\n */\nfunction get_post_status( $ID = '' ) {\n\t$post = get_post($ID);\n\n\tif ( !is_object($post) )\n\t\treturn false;\n\n\tif ( 'attachment' == $post->post_type ) {\n\t\tif ( 'private' == $post->post_status )\n\t\t\treturn 'private';\n\n\t\t// Unattached attachments are assumed to be published.\n\t\tif ( ( 'inherit' == $post->post_status ) && ( 0 == $post->post_parent) )\n\t\t\treturn 'publish';\n\n\t\t// Inherit status from the parent.\n\t\tif ( $post->post_parent && ( $post->ID != $post->post_parent ) ) {\n\t\t\t$parent_post_status = get_post_status( $post->post_parent );\n\t\t\tif ( 'trash' == $parent_post_status ) {\n\t\t\t\treturn get_post_meta( $post->post_parent, '_wp_trash_meta_status', true );\n\t\t\t} else {\n\t\t\t\treturn $parent_post_status;\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Filter the post status.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string  $post_status The post status.\n\t * @param WP_Post $post        The post object.\n\t */\n\treturn apply_filters( 'get_post_status', $post->post_status, $post );\n}\n\n/**\n * Retrieve all of the WordPress supported post statuses.\n *\n * Posts have a limited set of valid status values, this provides the\n * post_status values and descriptions.\n *\n * @since 2.5.0\n *\n * @return array List of post statuses.\n */\nfunction get_post_statuses() {\n\t$status = array(\n\t\t'draft'   => __( 'Draft' ),\n\t\t'pending' => __( 'Pending Review' ),\n\t\t'private' => __( 'Private' ),\n\t\t'publish' => __( 'Published' )\n\t);\n\n\treturn $status;\n}\n\n/**\n * Retrieve all of the WordPress support page statuses.\n *\n * Pages have a limited set of valid status values, this provides the\n * post_status values and descriptions.\n *\n * @since 2.5.0\n *\n * @return array List of page statuses.\n */\nfunction get_page_statuses() {\n\t$status = array(\n\t\t'draft'   => __( 'Draft' ),\n\t\t'private' => __( 'Private' ),\n\t\t'publish' => __( 'Published' )\n\t);\n\n\treturn $status;\n}\n\n/**\n * Register a post status. Do not use before init.\n *\n * A simple function for creating or modifying a post status based on the\n * parameters given. The function will accept an array (second optional\n * parameter), along with a string for the post status name.\n *\n * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.\n *\n * @since 3.0.0\n * @global array $wp_post_statuses Inserts new post status object into the list\n *\n * @param string $post_status Name of the post status.\n * @param array|string $args {\n *     Optional. Array or string of post status arguments.\n *\n *     @type bool|string $label                     A descriptive name for the post status marked\n *                                                  for translation. Defaults to value of $post_status.\n *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.\n *                                                  Default array of $label, twice\n *     @type bool        $exclude_from_search       Whether to exclude posts with this post status\n *                                                  from search results. Default is value of $internal.\n *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.\n *                                                  Default false.\n *     @type bool        $public                    Whether posts of this status should be shown\n *                                                  in the front end of the site. Default false.\n *     @type bool        $internal                  Whether the status is for internal use only.\n *                                                  Default false.\n *     @type bool        $protected                 Whether posts with this status should be protected.\n *                                                  Default false.\n *     @type bool        $private                   Whether posts with this status should be private.\n *                                                  Default false.\n *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-\n *                                                  queryable. Default is value of $public.\n *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for\n *                                                  their post type. Default is value of $internal.\n *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at\n *                                                  the top of the edit listings,\n *                                                  e.g. All (12) | Published (9) | My Custom Status (2)\n *                                                  Default is value of $internal.\n * }\n * @return object\n */\nfunction register_post_status( $post_status, $args = array() ) {\n\tglobal $wp_post_statuses;\n\n\tif (!is_array($wp_post_statuses))\n\t\t$wp_post_statuses = array();\n\n\t// Args prefixed with an underscore are reserved for internal use.\n\t$defaults = array(\n\t\t'label' => false,\n\t\t'label_count' => false,\n\t\t'exclude_from_search' => null,\n\t\t'_builtin' => false,\n\t\t'public' => null,\n\t\t'internal' => null,\n\t\t'protected' => null,\n\t\t'private' => null,\n\t\t'publicly_queryable' => null,\n\t\t'show_in_admin_status_list' => null,\n\t\t'show_in_admin_all_list' => null,\n\t);\n\t$args = wp_parse_args($args, $defaults);\n\t$args = (object) $args;\n\n\t$post_status = sanitize_key($post_status);\n\t$args->name = $post_status;\n\n\t// Set various defaults.\n\tif ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private )\n\t\t$args->internal = true;\n\n\tif ( null === $args->public  )\n\t\t$args->public = false;\n\n\tif ( null === $args->private  )\n\t\t$args->private = false;\n\n\tif ( null === $args->protected  )\n\t\t$args->protected = false;\n\n\tif ( null === $args->internal  )\n\t\t$args->internal = false;\n\n\tif ( null === $args->publicly_queryable )\n\t\t$args->publicly_queryable = $args->public;\n\n\tif ( null === $args->exclude_from_search )\n\t\t$args->exclude_from_search = $args->internal;\n\n\tif ( null === $args->show_in_admin_all_list )\n\t\t$args->show_in_admin_all_list = !$args->internal;\n\n\tif ( null === $args->show_in_admin_status_list )\n\t\t$args->show_in_admin_status_list = !$args->internal;\n\n\tif ( false === $args->label )\n\t\t$args->label = $post_status;\n\n\tif ( false === $args->label_count )\n\t\t$args->label_count = array( $args->label, $args->label );\n\n\t$wp_post_statuses[$post_status] = $args;\n\n\treturn $args;\n}\n\n/**\n * Retrieve a post status object by name.\n *\n * @since 3.0.0\n *\n * @global array $wp_post_statuses List of post statuses.\n *\n * @see register_post_status()\n *\n * @param string $post_status The name of a registered post status.\n * @return object|null A post status object.\n */\nfunction get_post_status_object( $post_status ) {\n\tglobal $wp_post_statuses;\n\n\tif ( empty($wp_post_statuses[$post_status]) )\n\t\treturn null;\n\n\treturn $wp_post_statuses[$post_status];\n}\n\n/**\n * Get a list of post statuses.\n *\n * @since 3.0.0\n *\n * @global array $wp_post_statuses List of post statuses.\n *\n * @see register_post_status()\n *\n * @param array|string $args     Optional. Array or string of post status arguments to compare against\n *                               properties of the global `$wp_post_statuses objects`. Default empty array.\n * @param string       $output   Optional. The type of output to return, either 'names' or 'objects'. Default 'names'.\n * @param string       $operator Optional. The logical operation to perform. 'or' means only one element\n *                               from the array needs to match; 'and' means all elements must match.\n *                               Default 'and'.\n * @return array A list of post status names or objects.\n */\nfunction get_post_stati( $args = array(), $output = 'names', $operator = 'and' ) {\n\tglobal $wp_post_statuses;\n\n\t$field = ('names' == $output) ? 'name' : false;\n\n\treturn wp_filter_object_list($wp_post_statuses, $args, $operator, $field);\n}\n\n/**\n * Whether the post type is hierarchical.\n *\n * A false return value might also mean that the post type does not exist.\n *\n * @since 3.0.0\n *\n * @see get_post_type_object()\n *\n * @param string $post_type Post type name\n * @return bool Whether post type is hierarchical.\n */\nfunction is_post_type_hierarchical( $post_type ) {\n\tif ( ! post_type_exists( $post_type ) )\n\t\treturn false;\n\n\t$post_type = get_post_type_object( $post_type );\n\treturn $post_type->hierarchical;\n}\n\n/**\n * Check if a post type is registered.\n *\n * @since 3.0.0\n *\n * @see get_post_type_object()\n *\n * @param string $post_type Post type name.\n * @return bool Whether post type is registered.\n */\nfunction post_type_exists( $post_type ) {\n\treturn (bool) get_post_type_object( $post_type );\n}\n\n/**\n * Retrieve the post type of the current post or of a given post.\n *\n * @since 2.1.0\n *\n * @param int|WP_Post|null $post Optional. Post ID or post object. Default is global $post.\n * @return string|false          Post type on success, false on failure.\n */\nfunction get_post_type( $post = null ) {\n\tif ( $post = get_post( $post ) )\n\t\treturn $post->post_type;\n\n\treturn false;\n}\n\n/**\n * Retrieve a post type object by name.\n *\n * @since 3.0.0\n *\n * @global array $wp_post_types List of post types.\n *\n * @see register_post_type()\n *\n * @param string $post_type The name of a registered post type.\n * @return object|null A post type object.\n */\nfunction get_post_type_object( $post_type ) {\n\tglobal $wp_post_types;\n\n\tif ( ! is_scalar( $post_type ) || empty( $wp_post_types[ $post_type ] ) ) {\n\t\treturn null;\n\t}\n\n\treturn $wp_post_types[ $post_type ];\n}\n\n/**\n * Get a list of all registered post type objects.\n *\n * @since 2.9.0\n *\n * @global array $wp_post_types List of post types.\n *\n * @see register_post_type() for accepted arguments.\n *\n * @param array|string $args     Optional. An array of key => value arguments to match against\n *                               the post type objects. Default empty array.\n * @param string       $output   Optional. The type of output to return. Accepts post type 'names'\n *                               or 'objects'. Default 'names'.\n * @param string       $operator Optional. The logical operation to perform. 'or' means only one\n *                               element from the array needs to match; 'and' means all elements\n *                               must match. Accepts 'or' or 'and'. Default 'and'.\n * @return array A list of post type names or objects.\n */\nfunction get_post_types( $args = array(), $output = 'names', $operator = 'and' ) {\n\tglobal $wp_post_types;\n\n\t$field = ('names' == $output) ? 'name' : false;\n\n\treturn wp_filter_object_list($wp_post_types, $args, $operator, $field);\n}\n\n/**\n * Register a post type. Do not use before init.\n *\n * A function for creating or modifying a post type based on the\n * parameters given. The function will accept an array (second optional\n * parameter), along with a string for the post type name.\n *\n * @since 2.9.0\n * @since 3.0.0 The `show_ui` argument is now enforced on the new post screen.\n * @since 4.4.0 The `show_ui` argument is now enforced on the post type listing screen and post editing screen.\n *\n * @global array      $wp_post_types List of post types.\n * @global WP_Rewrite $wp_rewrite    Used for default feeds.\n * @global WP         $wp            Used to add query vars.\n *\n * @param string $post_type Post type key, must not exceed 20 characters.\n * @param array|string $args {\n *     Array or string of arguments for registering a post type.\n *\n *     @type string      $label                Name of the post type shown in the menu. Usually plural.\n *                                             Default is value of $labels['name'].\n *     @type array       $labels               An array of labels for this post type. If not set, post\n *                                             labels are inherited for non-hierarchical types and page\n *                                             labels for hierarchical ones. {@see get_post_type_labels()}.\n *     @type string      $description          A short descriptive summary of what the post type is.\n *                                             Default empty.\n *     @type bool        $public               Whether a post type is intended for use publicly either via\n *                                             the admin interface or by front-end users. While the default\n *                                             settings of $exclude_from_search, $publicly_queryable, $show_ui,\n *                                             and $show_in_nav_menus are inherited from public, each does not\n *                                             rely on this relationship and controls a very specific intention.\n *                                             Default false.\n *     @type bool        $hierarchical         Whether the post type is hierarchical (e.g. page). Default false.\n *     @type bool        $exclude_from_search  Whether to exclude posts with this post type from front end search\n *                                             results. Default is the opposite value of $public.\n *     @type bool        $publicly_queryable   Whether queries can be performed on the front end for the post type\n *                                             as part of {@see parse_request()}. Endpoints would include:\n *                                             * ?post_type={post_type_key}\n *                                             * ?{post_type_key}={single_post_slug}\n *                                             * ?{post_type_query_var}={single_post_slug}\n *                                             If not set, the default is inherited from $public.\n *     @type bool        $show_ui              Whether to generate and allow a UI for managing this post type in the\n *                                             admin. Default is value of $public.\n *     @type bool        $show_in_menu         Where to show the post type in the admin menu. To work, $show_ui\n *                                             must be true. If true, the post type is shown in its own top level\n *                                             menu. If false, no menu is shown. If a string of an existing top\n *                                             level menu (eg. 'tools.php' or 'edit.php?post_type=page'), the post\n *                                             type will be placed as a sub-menu of that.\n *                                             Default is value of $show_ui.\n *     @type bool        $show_in_nav_menus    Makes this post type available for selection in navigation menus.\n *                                             Default is value $public.\n *     @type bool        $show_in_admin_bar    Makes this post type available via the admin bar. Default is value\n *                                             of $show_in_menu.\n *     @type int         $menu_position        The position in the menu order the post type should appear. To work,\n *                                             $show_in_menu must be true. Default null (at the bottom).\n *     @type string      $menu_icon            The url to the icon to be used for this menu. Pass a base64-encoded\n *                                             SVG using a data URI, which will be colored to match the color scheme\n *                                             -- this should begin with 'data:image/svg+xml;base64,'. Pass the name\n *                                             of a Dashicons helper class to use a font icon, e.g.\n *                                             'dashicons-chart-pie'. Pass 'none' to leave div.wp-menu-image empty\n *                                             so an icon can be added via CSS. Defaults to use the posts icon.\n *     @type string      $capability_type      The string to use to build the read, edit, and delete capabilities.\n *                                             May be passed as an array to allow for alternative plurals when using\n *                                             this argument as a base to construct the capabilities, e.g.\n *                                             array('story', 'stories'). Default 'post'.\n *     @type array       $capabilities         Array of capabilities for this post type. $capability_type is used\n *                                             as a base to construct capabilities by default.\n *                                             {@see get_post_type_capabilities()}.\n *     @type bool        $map_meta_cap         Whether to use the internal default meta capability handling.\n *                                             Default false.\n *     @type array       $supports             An alias for calling {@see add_post_type_support()} directly.\n *                                             Defaults to array containing 'title' & 'editor'.\n *     @type callable    $register_meta_box_cb Provide a callback function that sets up the meta boxes for the\n *                                             edit form. Do remove_meta_box() and add_meta_box() calls in the\n *                                             callback. Default null.\n *     @type array       $taxonomies           An array of taxonomy identifiers that will be registered for the\n *                                             post type. Taxonomies can be registered later with\n *                                             {@see register_taxonomy()} or {@see register_taxonomy_for_object_type()}.\n *                                             Default empty array.\n *     @type bool|string $has_archive          Whether there should be post type archives, or if a string, the\n *                                             archive slug to use. Will generate the proper rewrite rules if\n *                                             $rewrite is enabled. Default false.\n *     @type bool|array  $rewrite              {\n *         Triggers the handling of rewrites for this post type. To prevent rewrite, set to false.\n *         Defaults to true, using $post_type as slug. To specify rewrite rules, an array can be\n *         passed with any of these keys:\n *\n *         @type string $slug       Customize the permastruct slug. Defaults to $post_type key.\n *         @type bool   $with_front Whether the permastruct should be prepended with WP_Rewrite::$front.\n *                                  Default true.\n *         @type bool   $feeds      Whether the feed permastruct should be built for this post type.\n *                                  Default is value of $has_archive.\n *         @type bool   $pages      Whether the permastruct should provide for pagination. Default true.\n *         @type const  $ep_mask    Endpoint mask to assign. If not specified and permalink_epmask is set,\n *                                  inherits from $permalink_epmask. If not specified and permalink_epmask\n *                                  is not set, defaults to EP_PERMALINK.\n *     }\n *     @type string|bool $query_var            Sets the query_var key for this post type. Defaults to $post_type\n *                                             key. If false, a post type cannot be loaded at\n *                                             ?{query_var}={post_slug}. If specified as a string, the query\n *                                             ?{query_var_string}={post_slug} will be valid.\n *     @type bool        $can_export           Whether to allow this post type to be exported. Default true.\n *     @type bool        $delete_with_user     Whether to delete posts of this type when deleting a user. If true,\n *                                             posts of this type belonging to the user will be moved to trash\n *                                             when then user is deleted. If false, posts of this type belonging\n *                                             to the user will *not* be trashed or deleted. If not set (the default),\n *                                             posts are trashed if post_type_supports('author'). Otherwise posts\n *                                             are not trashed or deleted. Default null.\n *     @type bool        $_builtin             FOR INTERNAL USE ONLY! True if this post type is a native or\n *                                             \"built-in\" post_type. Default false.\n *     @type string      $_edit_link           FOR INTERNAL USE ONLY! URL segment to use for edit link of\n *                                             this post type. Default 'post.php?post=%d'.\n * }\n * @return object|WP_Error The registered post type object, or an error object.\n */\nfunction register_post_type( $post_type, $args = array() ) {\n\tglobal $wp_post_types, $wp_rewrite, $wp;\n\n\tif ( ! is_array( $wp_post_types ) ) {\n\t\t$wp_post_types = array();\n\t}\n\n\t// Sanitize post type name\n\t$post_type = sanitize_key( $post_type );\n\t$args      = wp_parse_args( $args );\n\n\t/**\n\t * Filter the arguments for registering a post type.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array  $args      Array of arguments for registering a post type.\n\t * @param string $post_type Post type key.\n\t */\n\t$args = apply_filters( 'register_post_type_args', $args, $post_type );\n\n\t$has_edit_link = ! empty( $args['_edit_link'] );\n\n\t// Args prefixed with an underscore are reserved for internal use.\n\t$defaults = array(\n\t\t'labels'               => array(),\n\t\t'description'          => '',\n\t\t'public'               => false,\n\t\t'hierarchical'         => false,\n\t\t'exclude_from_search'  => null,\n\t\t'publicly_queryable'   => null,\n\t\t'show_ui'              => null,\n\t\t'show_in_menu'         => null,\n\t\t'show_in_nav_menus'    => null,\n\t\t'show_in_admin_bar'    => null,\n\t\t'menu_position'        => null,\n\t\t'menu_icon'            => null,\n\t\t'capability_type'      => 'post',\n\t\t'capabilities'         => array(),\n\t\t'map_meta_cap'         => null,\n\t\t'supports'             => array(),\n\t\t'register_meta_box_cb' => null,\n\t\t'taxonomies'           => array(),\n\t\t'has_archive'          => false,\n\t\t'rewrite'              => true,\n\t\t'query_var'            => true,\n\t\t'can_export'           => true,\n\t\t'delete_with_user'     => null,\n\t\t'_builtin'             => false,\n\t\t'_edit_link'           => 'post.php?post=%d',\n\t);\n\t$args = array_merge( $defaults, $args );\n\t$args = (object) $args;\n\n\t$args->name = $post_type;\n\n\tif ( empty( $post_type ) || strlen( $post_type ) > 20 ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Post type names must be between 1 and 20 characters in length.' ), '4.2' );\n\t\treturn new WP_Error( 'post_type_length_invalid', __( 'Post type names must be between 1 and 20 characters in length.' ) );\n\t}\n\n\t// If not set, default to the setting for public.\n\tif ( null === $args->publicly_queryable )\n\t\t$args->publicly_queryable = $args->public;\n\n\t// If not set, default to the setting for public.\n\tif ( null === $args->show_ui )\n\t\t$args->show_ui = $args->public;\n\n\t// If not set, default to the setting for show_ui.\n\tif ( null === $args->show_in_menu || ! $args->show_ui )\n\t\t$args->show_in_menu = $args->show_ui;\n\n\t// If not set, default to the whether the full UI is shown.\n\tif ( null === $args->show_in_admin_bar )\n\t\t$args->show_in_admin_bar = (bool) $args->show_in_menu;\n\n\t// If not set, default to the setting for public.\n\tif ( null === $args->show_in_nav_menus )\n\t\t$args->show_in_nav_menus = $args->public;\n\n\t// If not set, default to true if not public, false if public.\n\tif ( null === $args->exclude_from_search )\n\t\t$args->exclude_from_search = !$args->public;\n\n\t// Back compat with quirky handling in version 3.0. #14122.\n\tif ( empty( $args->capabilities ) && null === $args->map_meta_cap && in_array( $args->capability_type, array( 'post', 'page' ) ) )\n\t\t$args->map_meta_cap = true;\n\n\t// If not set, default to false.\n\tif ( null === $args->map_meta_cap )\n\t\t$args->map_meta_cap = false;\n\n\t// If there's no specified edit link and no UI, remove the edit link.\n\tif ( ! $args->show_ui && ! $has_edit_link ) {\n\t\t$args->_edit_link = '';\n\t}\n\n\t$args->cap = get_post_type_capabilities( $args );\n\tunset( $args->capabilities );\n\n\tif ( is_array( $args->capability_type ) )\n\t\t$args->capability_type = $args->capability_type[0];\n\n\tif ( ! empty( $args->supports ) ) {\n\t\tadd_post_type_support( $post_type, $args->supports );\n\t\tunset( $args->supports );\n\t} elseif ( false !== $args->supports ) {\n\t\t// Add default features\n\t\tadd_post_type_support( $post_type, array( 'title', 'editor' ) );\n\t}\n\n\tif ( false !== $args->query_var ) {\n\t\tif ( true === $args->query_var )\n\t\t\t$args->query_var = $post_type;\n\t\telse\n\t\t\t$args->query_var = sanitize_title_with_dashes( $args->query_var );\n\n\t\tif ( $wp && is_post_type_viewable( $args ) ) {\n\t\t\t$wp->add_query_var( $args->query_var );\n\t\t}\n\t}\n\n\tif ( false !== $args->rewrite && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) {\n\t\tif ( ! is_array( $args->rewrite ) )\n\t\t\t$args->rewrite = array();\n\t\tif ( empty( $args->rewrite['slug'] ) )\n\t\t\t$args->rewrite['slug'] = $post_type;\n\t\tif ( ! isset( $args->rewrite['with_front'] ) )\n\t\t\t$args->rewrite['with_front'] = true;\n\t\tif ( ! isset( $args->rewrite['pages'] ) )\n\t\t\t$args->rewrite['pages'] = true;\n\t\tif ( ! isset( $args->rewrite['feeds'] ) || ! $args->has_archive )\n\t\t\t$args->rewrite['feeds'] = (bool) $args->has_archive;\n\t\tif ( ! isset( $args->rewrite['ep_mask'] ) ) {\n\t\t\tif ( isset( $args->permalink_epmask ) )\n\t\t\t\t$args->rewrite['ep_mask'] = $args->permalink_epmask;\n\t\t\telse\n\t\t\t\t$args->rewrite['ep_mask'] = EP_PERMALINK;\n\t\t}\n\n\t\tif ( $args->hierarchical )\n\t\t\tadd_rewrite_tag( \"%$post_type%\", '(.+?)', $args->query_var ? \"{$args->query_var}=\" : \"post_type=$post_type&pagename=\" );\n\t\telse\n\t\t\tadd_rewrite_tag( \"%$post_type%\", '([^/]+)', $args->query_var ? \"{$args->query_var}=\" : \"post_type=$post_type&name=\" );\n\n\t\tif ( $args->has_archive ) {\n\t\t\t$archive_slug = $args->has_archive === true ? $args->rewrite['slug'] : $args->has_archive;\n\t\t\tif ( $args->rewrite['with_front'] )\n\t\t\t\t$archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;\n\t\t\telse\n\t\t\t\t$archive_slug = $wp_rewrite->root . $archive_slug;\n\n\t\t\tadd_rewrite_rule( \"{$archive_slug}/?$\", \"index.php?post_type=$post_type\", 'top' );\n\t\t\tif ( $args->rewrite['feeds'] && $wp_rewrite->feeds ) {\n\t\t\t\t$feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';\n\t\t\t\tadd_rewrite_rule( \"{$archive_slug}/feed/$feeds/?$\", \"index.php?post_type=$post_type\" . '&feed=$matches[1]', 'top' );\n\t\t\t\tadd_rewrite_rule( \"{$archive_slug}/$feeds/?$\", \"index.php?post_type=$post_type\" . '&feed=$matches[1]', 'top' );\n\t\t\t}\n\t\t\tif ( $args->rewrite['pages'] )\n\t\t\t\tadd_rewrite_rule( \"{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$\", \"index.php?post_type=$post_type\" . '&paged=$matches[1]', 'top' );\n\t\t}\n\n\t\t$permastruct_args = $args->rewrite;\n\t\t$permastruct_args['feed'] = $permastruct_args['feeds'];\n\t\tadd_permastruct( $post_type, \"{$args->rewrite['slug']}/%$post_type%\", $permastruct_args );\n\t}\n\n\t// Register the post type meta box if a custom callback was specified.\n\tif ( $args->register_meta_box_cb )\n\t\tadd_action( 'add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1 );\n\n\t$args->labels = get_post_type_labels( $args );\n\t$args->label = $args->labels->name;\n\n\t$wp_post_types[ $post_type ] = $args;\n\n\tadd_action( 'future_' . $post_type, '_future_post_hook', 5, 2 );\n\n\tforeach ( $args->taxonomies as $taxonomy ) {\n\t\tregister_taxonomy_for_object_type( $taxonomy, $post_type );\n\t}\n\n\t/**\n\t * Fires after a post type is registered.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $post_type Post type.\n\t * @param object $args      Arguments used to register the post type.\n\t */\n\tdo_action( 'registered_post_type', $post_type, $args );\n\n\treturn $args;\n}\n\n/**\n * Build an object with all post type capabilities out of a post type object\n *\n * Post type capabilities use the 'capability_type' argument as a base, if the\n * capability is not set in the 'capabilities' argument array or if the\n * 'capabilities' argument is not supplied.\n *\n * The capability_type argument can optionally be registered as an array, with\n * the first value being singular and the second plural, e.g. array('story, 'stories')\n * Otherwise, an 's' will be added to the value for the plural form. After\n * registration, capability_type will always be a string of the singular value.\n *\n * By default, seven keys are accepted as part of the capabilities array:\n *\n * - edit_post, read_post, and delete_post are meta capabilities, which are then\n *   generally mapped to corresponding primitive capabilities depending on the\n *   context, which would be the post being edited/read/deleted and the user or\n *   role being checked. Thus these capabilities would generally not be granted\n *   directly to users or roles.\n *\n * - edit_posts - Controls whether objects of this post type can be edited.\n * - edit_others_posts - Controls whether objects of this type owned by other users\n *   can be edited. If the post type does not support an author, then this will\n *   behave like edit_posts.\n * - publish_posts - Controls publishing objects of this post type.\n * - read_private_posts - Controls whether private objects can be read.\n *\n * These four primitive capabilities are checked in core in various locations.\n * There are also seven other primitive capabilities which are not referenced\n * directly in core, except in map_meta_cap(), which takes the three aforementioned\n * meta capabilities and translates them into one or more primitive capabilities\n * that must then be checked against the user or role, depending on the context.\n *\n * - read - Controls whether objects of this post type can be read.\n * - delete_posts - Controls whether objects of this post type can be deleted.\n * - delete_private_posts - Controls whether private objects can be deleted.\n * - delete_published_posts - Controls whether published objects can be deleted.\n * - delete_others_posts - Controls whether objects owned by other users can be\n *   can be deleted. If the post type does not support an author, then this will\n *   behave like delete_posts.\n * - edit_private_posts - Controls whether private objects can be edited.\n * - edit_published_posts - Controls whether published objects can be edited.\n *\n * These additional capabilities are only used in map_meta_cap(). Thus, they are\n * only assigned by default if the post type is registered with the 'map_meta_cap'\n * argument set to true (default is false).\n *\n * @since 3.0.0\n *\n * @see register_post_type()\n * @see map_meta_cap()\n *\n * @param object $args Post type registration arguments.\n * @return object object with all the capabilities as member variables.\n */\nfunction get_post_type_capabilities( $args ) {\n\tif ( ! is_array( $args->capability_type ) )\n\t\t$args->capability_type = array( $args->capability_type, $args->capability_type . 's' );\n\n\t// Singular base for meta capabilities, plural base for primitive capabilities.\n\tlist( $singular_base, $plural_base ) = $args->capability_type;\n\n\t$default_capabilities = array(\n\t\t// Meta capabilities\n\t\t'edit_post'          => 'edit_'         . $singular_base,\n\t\t'read_post'          => 'read_'         . $singular_base,\n\t\t'delete_post'        => 'delete_'       . $singular_base,\n\t\t// Primitive capabilities used outside of map_meta_cap():\n\t\t'edit_posts'         => 'edit_'         . $plural_base,\n\t\t'edit_others_posts'  => 'edit_others_'  . $plural_base,\n\t\t'publish_posts'      => 'publish_'      . $plural_base,\n\t\t'read_private_posts' => 'read_private_' . $plural_base,\n\t);\n\n\t// Primitive capabilities used within map_meta_cap():\n\tif ( $args->map_meta_cap ) {\n\t\t$default_capabilities_for_mapping = array(\n\t\t\t'read'                   => 'read',\n\t\t\t'delete_posts'           => 'delete_'           . $plural_base,\n\t\t\t'delete_private_posts'   => 'delete_private_'   . $plural_base,\n\t\t\t'delete_published_posts' => 'delete_published_' . $plural_base,\n\t\t\t'delete_others_posts'    => 'delete_others_'    . $plural_base,\n\t\t\t'edit_private_posts'     => 'edit_private_'     . $plural_base,\n\t\t\t'edit_published_posts'   => 'edit_published_'   . $plural_base,\n\t\t);\n\t\t$default_capabilities = array_merge( $default_capabilities, $default_capabilities_for_mapping );\n\t}\n\n\t$capabilities = array_merge( $default_capabilities, $args->capabilities );\n\n\t// Post creation capability simply maps to edit_posts by default:\n\tif ( ! isset( $capabilities['create_posts'] ) )\n\t\t$capabilities['create_posts'] = $capabilities['edit_posts'];\n\n\t// Remember meta capabilities for future reference.\n\tif ( $args->map_meta_cap )\n\t\t_post_type_meta_capabilities( $capabilities );\n\n\treturn (object) $capabilities;\n}\n\n/**\n * Store or return a list of post type meta caps for map_meta_cap().\n *\n * @since 3.1.0\n * @access private\n *\n * @staticvar array $meta_caps\n *\n * @param array|void $capabilities Post type meta capabilities.\n */\nfunction _post_type_meta_capabilities( $capabilities = null ) {\n\tstatic $meta_caps = array();\n\tif ( null === $capabilities )\n\t\treturn $meta_caps;\n\tforeach ( $capabilities as $core => $custom ) {\n\t\tif ( in_array( $core, array( 'read_post', 'delete_post', 'edit_post' ) ) )\n\t\t\t$meta_caps[ $custom ] = $core;\n\t}\n}\n\n/**\n * Build an object with all post type labels out of a post type object\n *\n * Accepted keys of the label array in the post type object:\n *\n * - name - general name for the post type, usually plural. The same and overridden\n *          by $post_type_object->label. Default is Posts/Pages\n * - singular_name - name for one object of this post type. Default is Post/Page\n * - add_new - Default is Add New for both hierarchical and non-hierarchical types.\n *             When internationalizing this string, please use a gettext context\n *             {@link https://codex.wordpress.org/I18n_for_WordPress_Developers#Disambiguation_by_context}\n *             matching your post type. Example: `_x( 'Add New', 'product' );`.\n * - add_new_item - Default is Add New Post/Add New Page.\n * - edit_item - Default is Edit Post/Edit Page.\n * - new_item - Default is New Post/New Page.\n * - view_item - Default is View Post/View Page.\n * - search_items - Default is Search Posts/Search Pages.\n * - not_found - Default is No posts found/No pages found.\n * - not_found_in_trash - Default is No posts found in Trash/No pages found in Trash.\n * - parent_item_colon - This string isn't used on non-hierarchical types. In hierarchical\n *                       ones the default is 'Parent Page:'.\n * - all_items - String for the submenu. Default is All Posts/All Pages.\n * - archives - String for use with archives in nav menus. Default is Post Archives/Page Archives.\n * - insert_into_item - String for the media frame button. Default is Insert into post/Insert into page.\n * - uploaded_to_this_item - String for the media frame filter. Default is Uploaded to this post/Uploaded to this page.\n * - featured_image - Default is Featured Image.\n * - set_featured_image - Default is Set featured image.\n * - remove_featured_image - Default is Remove featured image.\n * - use_featured_image - Default is Use as featured image.\n * - menu_name - Default is the same as `name`.\n * - filter_items_list - String for the table views hidden heading.\n * - items_list_navigation - String for the table pagination hidden heading.\n * - items_list - String for the table hidden heading.\n *\n * Above, the first default value is for non-hierarchical post types (like posts)\n * and the second one is for hierarchical post types (like pages).\n *\n * @since 3.0.0\n * @since 4.3.0 Added the `featured_image`, `set_featured_image`, `remove_featured_image`,\n *              and `use_featured_image` labels.\n * @since 4.4.0 Added the `insert_into_item`, `uploaded_to_this_item`, `filter_items_list`,\n *              `items_list_navigation`, and `items_list` labels.\n *\n * @access private\n *\n * @param object $post_type_object Post type object.\n * @return object object with all the labels as member variables.\n */\nfunction get_post_type_labels( $post_type_object ) {\n\t$nohier_vs_hier_defaults = array(\n\t\t'name' => array( _x('Posts', 'post type general name'), _x('Pages', 'post type general name') ),\n\t\t'singular_name' => array( _x('Post', 'post type singular name'), _x('Page', 'post type singular name') ),\n\t\t'add_new' => array( _x('Add New', 'post'), _x('Add New', 'page') ),\n\t\t'add_new_item' => array( __('Add New Post'), __('Add New Page') ),\n\t\t'edit_item' => array( __('Edit Post'), __('Edit Page') ),\n\t\t'new_item' => array( __('New Post'), __('New Page') ),\n\t\t'view_item' => array( __('View Post'), __('View Page') ),\n\t\t'search_items' => array( __('Search Posts'), __('Search Pages') ),\n\t\t'not_found' => array( __('No posts found.'), __('No pages found.') ),\n\t\t'not_found_in_trash' => array( __('No posts found in Trash.'), __('No pages found in Trash.') ),\n\t\t'parent_item_colon' => array( null, __('Parent Page:') ),\n\t\t'all_items' => array( __( 'All Posts' ), __( 'All Pages' ) ),\n\t\t'archives' => array( __( 'Post Archives' ), __( 'Page Archives' ) ),\n\t\t'insert_into_item' => array( __( 'Insert into post' ), __( 'Insert into page' ) ),\n\t\t'uploaded_to_this_item' => array( __( 'Uploaded to this post' ), __( 'Uploaded to this page' ) ),\n\t\t'featured_image' => array( __( 'Featured Image' ), __( 'Featured Image' ) ),\n\t\t'set_featured_image' => array( __( 'Set featured image' ), __( 'Set featured image' ) ),\n\t\t'remove_featured_image' => array( __( 'Remove featured image' ), __( 'Remove featured image' ) ),\n\t\t'use_featured_image' => array( __( 'Use as featured image' ), __( 'Use as featured image' ) ),\n\t\t'filter_items_list' => array( __( 'Filter posts list' ), __( 'Filter pages list' ) ),\n\t\t'items_list_navigation' => array( __( 'Posts list navigation' ), __( 'Pages list navigation' ) ),\n\t\t'items_list' => array( __( 'Posts list' ), __( 'Pages list' ) ),\n\t);\n\t$nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name'];\n\n\t$labels = _get_custom_object_labels( $post_type_object, $nohier_vs_hier_defaults );\n\n\t$post_type = $post_type_object->name;\n\n\t$default_labels = clone $labels;\n\n\t/**\n\t * Filter the labels of a specific post type.\n\t *\n\t * The dynamic portion of the hook name, `$post_type`, refers to\n\t * the post type slug.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @see get_post_type_labels() for the full list of labels.\n\t *\n\t * @param object $labels Object with labels for the post type as member variables.\n\t */\n\t$labels = apply_filters( \"post_type_labels_{$post_type}\", $labels );\n\n\t// Ensure that the filtered labels contain all required default values.\n\t$labels = (object) array_merge( (array) $default_labels, (array) $labels );\n\n\treturn $labels;\n}\n\n/**\n * Build an object with custom-something object (post type, taxonomy) labels\n * out of a custom-something object\n *\n * @since 3.0.0\n * @access private\n *\n * @param object $object                  A custom-something object.\n * @param array  $nohier_vs_hier_defaults Hierarchical vs non-hierarchical default labels.\n * @return object Object containing labels for the given custom-something object.\n */\nfunction _get_custom_object_labels( $object, $nohier_vs_hier_defaults ) {\n\t$object->labels = (array) $object->labels;\n\n\tif ( isset( $object->label ) && empty( $object->labels['name'] ) )\n\t\t$object->labels['name'] = $object->label;\n\n\tif ( !isset( $object->labels['singular_name'] ) && isset( $object->labels['name'] ) )\n\t\t$object->labels['singular_name'] = $object->labels['name'];\n\n\tif ( ! isset( $object->labels['name_admin_bar'] ) )\n\t\t$object->labels['name_admin_bar'] = isset( $object->labels['singular_name'] ) ? $object->labels['singular_name'] : $object->name;\n\n\tif ( !isset( $object->labels['menu_name'] ) && isset( $object->labels['name'] ) )\n\t\t$object->labels['menu_name'] = $object->labels['name'];\n\n\tif ( !isset( $object->labels['all_items'] ) && isset( $object->labels['menu_name'] ) )\n\t\t$object->labels['all_items'] = $object->labels['menu_name'];\n\n\tif ( !isset( $object->labels['archives'] ) && isset( $object->labels['all_items'] ) ) {\n\t\t$object->labels['archives'] = $object->labels['all_items'];\n\t}\n\n\t$defaults = array();\n\tforeach ( $nohier_vs_hier_defaults as $key => $value ) {\n\t\t$defaults[$key] = $object->hierarchical ? $value[1] : $value[0];\n\t}\n\t$labels = array_merge( $defaults, $object->labels );\n\t$object->labels = (object) $object->labels;\n\n\treturn (object) $labels;\n}\n\n/**\n * Add submenus for post types.\n *\n * @access private\n * @since 3.1.0\n */\nfunction _add_post_type_submenus() {\n\tforeach ( get_post_types( array( 'show_ui' => true ) ) as $ptype ) {\n\t\t$ptype_obj = get_post_type_object( $ptype );\n\t\t// Sub-menus only.\n\t\tif ( ! $ptype_obj->show_in_menu || $ptype_obj->show_in_menu === true )\n\t\t\tcontinue;\n\t\tadd_submenu_page( $ptype_obj->show_in_menu, $ptype_obj->labels->name, $ptype_obj->labels->all_items, $ptype_obj->cap->edit_posts, \"edit.php?post_type=$ptype\" );\n\t}\n}\n\n/**\n * Register support of certain features for a post type.\n *\n * All core features are directly associated with a functional area of the edit\n * screen, such as the editor or a meta box. Features include: 'title', 'editor',\n * 'comments', 'revisions', 'trackbacks', 'author', 'excerpt', 'page-attributes',\n * 'thumbnail', 'custom-fields', and 'post-formats'.\n *\n * Additionally, the 'revisions' feature dictates whether the post type will\n * store revisions, and the 'comments' feature dictates whether the comments\n * count will show on the edit screen.\n *\n * @since 3.0.0\n *\n * @global array $_wp_post_type_features\n *\n * @param string       $post_type The post type for which to add the feature.\n * @param string|array $feature   The feature being added, accepts an array of\n *                                feature strings or a single string.\n */\nfunction add_post_type_support( $post_type, $feature ) {\n\tglobal $_wp_post_type_features;\n\n\t$features = (array) $feature;\n\tforeach ($features as $feature) {\n\t\tif ( func_num_args() == 2 )\n\t\t\t$_wp_post_type_features[$post_type][$feature] = true;\n\t\telse\n\t\t\t$_wp_post_type_features[$post_type][$feature] = array_slice( func_get_args(), 2 );\n\t}\n}\n\n/**\n * Remove support for a feature from a post type.\n *\n * @since 3.0.0\n *\n * @global array $_wp_post_type_features\n *\n * @param string $post_type The post type for which to remove the feature.\n * @param string $feature   The feature being removed.\n */\nfunction remove_post_type_support( $post_type, $feature ) {\n\tglobal $_wp_post_type_features;\n\n\tunset( $_wp_post_type_features[ $post_type ][ $feature ] );\n}\n\n/**\n * Get all the post type features\n *\n * @since 3.4.0\n *\n * @global array $_wp_post_type_features\n *\n * @param string $post_type The post type.\n * @return array Post type supports list.\n */\nfunction get_all_post_type_supports( $post_type ) {\n\tglobal $_wp_post_type_features;\n\n\tif ( isset( $_wp_post_type_features[$post_type] ) )\n\t\treturn $_wp_post_type_features[$post_type];\n\n\treturn array();\n}\n\n/**\n * Check a post type's support for a given feature.\n *\n * @since 3.0.0\n *\n * @global array $_wp_post_type_features\n *\n * @param string $post_type The post type being checked.\n * @param string $feature   The feature being checked.\n * @return bool Whether the post type supports the given feature.\n */\nfunction post_type_supports( $post_type, $feature ) {\n\tglobal $_wp_post_type_features;\n\n\treturn ( isset( $_wp_post_type_features[$post_type][$feature] ) );\n}\n\n/**\n * Update the post type for the post ID.\n *\n * The page or post cache will be cleaned for the post ID.\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $post_id   Optional. Post ID to change post type. Default 0.\n * @param string $post_type Optional. Post type. Accepts 'post' or 'page' to\n *                          name a few. Default 'post'.\n * @return int|false Amount of rows changed. Should be 1 for success and 0 for failure.\n */\nfunction set_post_type( $post_id = 0, $post_type = 'post' ) {\n\tglobal $wpdb;\n\n\t$post_type = sanitize_post_field('post_type', $post_type, $post_id, 'db');\n\t$return = $wpdb->update( $wpdb->posts, array('post_type' => $post_type), array('ID' => $post_id) );\n\n\tclean_post_cache( $post_id );\n\n\treturn $return;\n}\n\n/**\n * Determines whether a post type is considered \"viewable\".\n *\n * For built-in post types such as posts and pages, the 'public' value will be evaluated.\n * For all others, the 'publicly_queryable' value will be used.\n *\n * @since 4.4.0\n *\n * @param object $post_type_object Post type object.\n * @return bool Whether the post type should be considered viewable.\n */\nfunction is_post_type_viewable( $post_type_object ) {\n\treturn $post_type_object->publicly_queryable || ( $post_type_object->_builtin && $post_type_object->public );\n}\n\n/**\n * Retrieve list of latest posts or posts matching criteria.\n *\n * The defaults are as follows:\n *\n * @since 1.2.0\n *\n * @see WP_Query::parse_query()\n *\n * @param array $args {\n *     Optional. Arguments to retrieve posts. See WP_Query::parse_query() for all\n *     available arguments.\n *\n *     @type int        $numberposts      Total number of posts to retrieve. Is an alias of $posts_per_page\n *                                        in WP_Query. Accepts -1 for all. Default 5.\n *     @type int|string $category         Category ID or comma-separated list of IDs (this or any children).\n *                                        Is an alias of $cat in WP_Query. Default 0.\n *     @type array      $include          An array of post IDs to retrieve, sticky posts will be included.\n *                                        Is an alias of $post__in in WP_Query. Default empty array.\n *     @type array      $exclude          An array of post IDs not to retrieve. Default empty array.\n *     @type bool       $suppress_filters Whether to suppress filters. Default true.\n * }\n * @return array List of posts.\n */\nfunction get_posts( $args = null ) {\n\t$defaults = array(\n\t\t'numberposts' => 5,\n\t\t'category' => 0, 'orderby' => 'date',\n\t\t'order' => 'DESC', 'include' => array(),\n\t\t'exclude' => array(), 'meta_key' => '',\n\t\t'meta_value' =>'', 'post_type' => 'post',\n\t\t'suppress_filters' => true\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\tif ( empty( $r['post_status'] ) )\n\t\t$r['post_status'] = ( 'attachment' == $r['post_type'] ) ? 'inherit' : 'publish';\n\tif ( ! empty($r['numberposts']) && empty($r['posts_per_page']) )\n\t\t$r['posts_per_page'] = $r['numberposts'];\n\tif ( ! empty($r['category']) )\n\t\t$r['cat'] = $r['category'];\n\tif ( ! empty($r['include']) ) {\n\t\t$incposts = wp_parse_id_list( $r['include'] );\n\t\t$r['posts_per_page'] = count($incposts);  // only the number of posts included\n\t\t$r['post__in'] = $incposts;\n\t} elseif ( ! empty($r['exclude']) )\n\t\t$r['post__not_in'] = wp_parse_id_list( $r['exclude'] );\n\n\t$r['ignore_sticky_posts'] = true;\n\t$r['no_found_rows'] = true;\n\n\t$get_posts = new WP_Query;\n\treturn $get_posts->query($r);\n\n}\n\n//\n// Post meta functions\n//\n\n/**\n * Add meta data field to a post.\n *\n * Post meta data is called \"Custom Fields\" on the Administration Screen.\n *\n * @since 1.5.0\n *\n * @param int    $post_id    Post ID.\n * @param string $meta_key   Metadata name.\n * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.\n * @param bool   $unique     Optional. Whether the same key should not be added.\n *                           Default false.\n * @return int|false Meta ID on success, false on failure.\n */\nfunction add_post_meta( $post_id, $meta_key, $meta_value, $unique = false ) {\n\t// Make sure meta is added to the post, not a revision.\n\tif ( $the_post = wp_is_post_revision($post_id) )\n\t\t$post_id = $the_post;\n\n\treturn add_metadata('post', $post_id, $meta_key, $meta_value, $unique);\n}\n\n/**\n * Remove metadata matching criteria from a post.\n *\n * You can match based on the key, or key and value. Removing based on key and\n * value, will keep from removing duplicate metadata with the same key. It also\n * allows removing all metadata matching key, if needed.\n *\n * @since 1.5.0\n *\n * @param int    $post_id    Post ID.\n * @param string $meta_key   Metadata name.\n * @param mixed  $meta_value Optional. Metadata value. Must be serializable if\n *                           non-scalar. Default empty.\n * @return bool True on success, false on failure.\n */\nfunction delete_post_meta( $post_id, $meta_key, $meta_value = '' ) {\n\t// Make sure meta is added to the post, not a revision.\n\tif ( $the_post = wp_is_post_revision($post_id) )\n\t\t$post_id = $the_post;\n\n\treturn delete_metadata('post', $post_id, $meta_key, $meta_value);\n}\n\n/**\n * Retrieve post meta field for a post.\n *\n * @since 1.5.0\n *\n * @param int    $post_id Post ID.\n * @param string $key     Optional. The meta key to retrieve. By default, returns\n *                        data for all keys. Default empty.\n * @param bool   $single  Optional. Whether to return a single value. Default false.\n * @return mixed Will be an array if $single is false. Will be value of meta data\n *               field if $single is true.\n */\nfunction get_post_meta( $post_id, $key = '', $single = false ) {\n\treturn get_metadata('post', $post_id, $key, $single);\n}\n\n/**\n * Update post meta field based on post ID.\n *\n * Use the $prev_value parameter to differentiate between meta fields with the\n * same key and post ID.\n *\n * If the meta field for the post does not exist, it will be added.\n *\n * @since 1.5.0\n *\n * @param int    $post_id    Post ID.\n * @param string $meta_key   Metadata key.\n * @param mixed  $meta_value Metadata value. Must be serializable if non-scalar.\n * @param mixed  $prev_value Optional. Previous value to check before removing.\n *                           Default empty.\n * @return int|bool Meta ID if the key didn't exist, true on successful update,\n *                  false on failure.\n */\nfunction update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ) {\n\t// Make sure meta is added to the post, not a revision.\n\tif ( $the_post = wp_is_post_revision($post_id) )\n\t\t$post_id = $the_post;\n\n\treturn update_metadata('post', $post_id, $meta_key, $meta_value, $prev_value);\n}\n\n/**\n * Delete everything from post meta matching meta key.\n *\n * @since 2.3.0\n *\n * @param string $post_meta_key Key to search for when deleting.\n * @return bool Whether the post meta key was deleted from the database.\n */\nfunction delete_post_meta_by_key( $post_meta_key ) {\n\treturn delete_metadata( 'post', null, $post_meta_key, '', true );\n}\n\n/**\n * Retrieve post meta fields, based on post ID.\n *\n * The post meta fields are retrieved from the cache where possible,\n * so the function is optimized to be called more than once.\n *\n * @since 1.2.0\n *\n * @param int $post_id Optional. Post ID. Default is ID of the global $post.\n * @return array Post meta for the given post.\n */\nfunction get_post_custom( $post_id = 0 ) {\n\t$post_id = absint( $post_id );\n\tif ( ! $post_id )\n\t\t$post_id = get_the_ID();\n\n\treturn get_post_meta( $post_id );\n}\n\n/**\n * Retrieve meta field names for a post.\n *\n * If there are no meta fields, then nothing (null) will be returned.\n *\n * @since 1.2.0\n *\n * @param int $post_id Optional. Post ID. Default is ID of the global $post.\n * @return array|void Array of the keys, if retrieved.\n */\nfunction get_post_custom_keys( $post_id = 0 ) {\n\t$custom = get_post_custom( $post_id );\n\n\tif ( !is_array($custom) )\n\t\treturn;\n\n\tif ( $keys = array_keys($custom) )\n\t\treturn $keys;\n}\n\n/**\n * Retrieve values for a custom post field.\n *\n * The parameters must not be considered optional. All of the post meta fields\n * will be retrieved and only the meta field key values returned.\n *\n * @since 1.2.0\n *\n * @param string $key     Optional. Meta field key. Default empty.\n * @param int    $post_id Optional. Post ID. Default is ID of the global $post.\n * @return array|null Meta field values.\n */\nfunction get_post_custom_values( $key = '', $post_id = 0 ) {\n\tif ( !$key )\n\t\treturn null;\n\n\t$custom = get_post_custom($post_id);\n\n\treturn isset($custom[$key]) ? $custom[$key] : null;\n}\n\n/**\n * Check if post is sticky.\n *\n * Sticky posts should remain at the top of The Loop. If the post ID is not\n * given, then The Loop ID for the current post will be used.\n *\n * @since 2.7.0\n *\n * @param int $post_id Optional. Post ID. Default is ID of the global $post.\n * @return bool Whether post is sticky.\n */\nfunction is_sticky( $post_id = 0 ) {\n\t$post_id = absint( $post_id );\n\n\tif ( ! $post_id )\n\t\t$post_id = get_the_ID();\n\n\t$stickies = get_option( 'sticky_posts' );\n\n\tif ( ! is_array( $stickies ) )\n\t\treturn false;\n\n\tif ( in_array( $post_id, $stickies ) )\n\t\treturn true;\n\n\treturn false;\n}\n\n/**\n * Sanitize every post field.\n *\n * If the context is 'raw', then the post object or array will get minimal\n * sanitization of the integer fields.\n *\n * @since 2.3.0\n *\n * @see sanitize_post_field()\n *\n * @param object|WP_Post|array $post    The Post Object or Array\n * @param string               $context Optional. How to sanitize post fields.\n *                                      Accepts 'raw', 'edit', 'db', or 'display'.\n *                                      Default 'display'.\n * @return object|WP_Post|array The now sanitized Post Object or Array (will be the\n *                              same type as $post).\n */\nfunction sanitize_post( $post, $context = 'display' ) {\n\tif ( is_object($post) ) {\n\t\t// Check if post already filtered for this context.\n\t\tif ( isset($post->filter) && $context == $post->filter )\n\t\t\treturn $post;\n\t\tif ( !isset($post->ID) )\n\t\t\t$post->ID = 0;\n\t\tforeach ( array_keys(get_object_vars($post)) as $field )\n\t\t\t$post->$field = sanitize_post_field($field, $post->$field, $post->ID, $context);\n\t\t$post->filter = $context;\n\t} elseif ( is_array( $post ) ) {\n\t\t// Check if post already filtered for this context.\n\t\tif ( isset($post['filter']) && $context == $post['filter'] )\n\t\t\treturn $post;\n\t\tif ( !isset($post['ID']) )\n\t\t\t$post['ID'] = 0;\n\t\tforeach ( array_keys($post) as $field )\n\t\t\t$post[$field] = sanitize_post_field($field, $post[$field], $post['ID'], $context);\n\t\t$post['filter'] = $context;\n\t}\n\treturn $post;\n}\n\n/**\n * Sanitize post field based on context.\n *\n * Possible context values are:  'raw', 'edit', 'db', 'display', 'attribute' and\n * 'js'. The 'display' context is used by default. 'attribute' and 'js' contexts\n * are treated like 'display' when calling filters.\n *\n * @since 2.3.0\n * @since 4.4.0 Like `sanitize_post()`, `$context` defaults to 'display'.\n *\n * @param string $field   The Post Object field name.\n * @param mixed  $value   The Post Object value.\n * @param int    $post_id Post ID.\n * @param string $context Optional. How to sanitize post fields. Looks for 'raw', 'edit',\n *                        'db', 'display', 'attribute' and 'js'. Default 'display'.\n * @return mixed Sanitized value.\n */\nfunction sanitize_post_field( $field, $value, $post_id, $context = 'display' ) {\n\t$int_fields = array('ID', 'post_parent', 'menu_order');\n\tif ( in_array($field, $int_fields) )\n\t\t$value = (int) $value;\n\n\t// Fields which contain arrays of integers.\n\t$array_int_fields = array( 'ancestors' );\n\tif ( in_array($field, $array_int_fields) ) {\n\t\t$value = array_map( 'absint', $value);\n\t\treturn $value;\n\t}\n\n\tif ( 'raw' == $context )\n\t\treturn $value;\n\n\t$prefixed = false;\n\tif ( false !== strpos($field, 'post_') ) {\n\t\t$prefixed = true;\n\t\t$field_no_prefix = str_replace('post_', '', $field);\n\t}\n\n\tif ( 'edit' == $context ) {\n\t\t$format_to_edit = array('post_content', 'post_excerpt', 'post_title', 'post_password');\n\n\t\tif ( $prefixed ) {\n\n\t\t\t/**\n\t\t\t * Filter the value of a specific post field to edit.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field`, refers to the post\n\t\t\t * field name.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param mixed $value   Value of the post field.\n\t\t\t * @param int   $post_id Post ID.\n\t\t\t */\n\t\t\t$value = apply_filters( \"edit_{$field}\", $value, $post_id );\n\n\t\t\t/**\n\t\t\t * Filter the value of a specific post field to edit.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field_no_prefix`, refers to\n\t\t\t * the post field name.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param mixed $value   Value of the post field.\n\t\t\t * @param int   $post_id Post ID.\n\t\t\t */\n\t\t\t$value = apply_filters( \"{$field_no_prefix}_edit_pre\", $value, $post_id );\n\t\t} else {\n\t\t\t$value = apply_filters( \"edit_post_{$field}\", $value, $post_id );\n\t\t}\n\n\t\tif ( in_array($field, $format_to_edit) ) {\n\t\t\tif ( 'post_content' == $field )\n\t\t\t\t$value = format_to_edit($value, user_can_richedit());\n\t\t\telse\n\t\t\t\t$value = format_to_edit($value);\n\t\t} else {\n\t\t\t$value = esc_attr($value);\n\t\t}\n\t} elseif ( 'db' == $context ) {\n\t\tif ( $prefixed ) {\n\n\t\t\t/**\n\t\t\t * Filter the value of a specific post field before saving.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field`, refers to the post\n\t\t\t * field name.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param mixed $value Value of the post field.\n\t\t\t */\n\t\t\t$value = apply_filters( \"pre_{$field}\", $value );\n\n\t\t\t/**\n\t\t\t * Filter the value of a specific field before saving.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field_no_prefix`, refers\n\t\t\t * to the post field name.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param mixed $value Value of the post field.\n\t\t\t */\n\t\t\t$value = apply_filters( \"{$field_no_prefix}_save_pre\", $value );\n\t\t} else {\n\t\t\t$value = apply_filters( \"pre_post_{$field}\", $value );\n\n\t\t\t/**\n\t\t\t * Filter the value of a specific post field before saving.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field`, refers to the post\n\t\t\t * field name.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param mixed $value Value of the post field.\n\t\t\t */\n\t\t\t$value = apply_filters( \"{$field}_pre\", $value );\n\t\t}\n\t} else {\n\n\t\t// Use display filters by default.\n\t\tif ( $prefixed ) {\n\n\t\t\t/**\n\t\t\t * Filter the value of a specific post field for display.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field`, refers to the post\n\t\t\t * field name.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param mixed  $value   Value of the prefixed post field.\n\t\t\t * @param int    $post_id Post ID.\n\t\t\t * @param string $context Context for how to sanitize the field. Possible\n\t\t\t *                        values include 'raw', 'edit', 'db', 'display',\n\t\t\t *                        'attribute' and 'js'.\n\t\t\t */\n\t\t\t$value = apply_filters( $field, $value, $post_id, $context );\n\t\t} else {\n\t\t\t$value = apply_filters( \"post_{$field}\", $value, $post_id, $context );\n\t\t}\n\t}\n\n\tif ( 'attribute' == $context )\n\t\t$value = esc_attr($value);\n\telseif ( 'js' == $context )\n\t\t$value = esc_js($value);\n\n\treturn $value;\n}\n\n/**\n * Make a post sticky.\n *\n * Sticky posts should be displayed at the top of the front page.\n *\n * @since 2.7.0\n *\n * @param int $post_id Post ID.\n */\nfunction stick_post( $post_id ) {\n\t$stickies = get_option('sticky_posts');\n\n\tif ( !is_array($stickies) )\n\t\t$stickies = array($post_id);\n\n\tif ( ! in_array($post_id, $stickies) )\n\t\t$stickies[] = $post_id;\n\n\tupdate_option('sticky_posts', $stickies);\n}\n\n/**\n * Un-stick a post.\n *\n * Sticky posts should be displayed at the top of the front page.\n *\n * @since 2.7.0\n *\n * @param int $post_id Post ID.\n */\nfunction unstick_post( $post_id ) {\n\t$stickies = get_option('sticky_posts');\n\n\tif ( !is_array($stickies) )\n\t\treturn;\n\n\tif ( ! in_array($post_id, $stickies) )\n\t\treturn;\n\n\t$offset = array_search($post_id, $stickies);\n\tif ( false === $offset )\n\t\treturn;\n\n\tarray_splice($stickies, $offset, 1);\n\n\tupdate_option('sticky_posts', $stickies);\n}\n\n/**\n * Return the cache key for wp_count_posts() based on the passed arguments.\n *\n * @since 3.9.0\n *\n * @param string $type Optional. Post type to retrieve count Default 'post'.\n * @param string $perm Optional. 'readable' or empty. Default empty.\n * @return string The cache key.\n */\nfunction _count_posts_cache_key( $type = 'post', $perm = '' ) {\n\t$cache_key = 'posts-' . $type;\n\tif ( 'readable' == $perm && is_user_logged_in() ) {\n\t\t$post_type_object = get_post_type_object( $type );\n\t\tif ( $post_type_object && ! current_user_can( $post_type_object->cap->read_private_posts ) ) {\n\t\t\t$cache_key .= '_' . $perm . '_' . get_current_user_id();\n\t\t}\n\t}\n\treturn $cache_key;\n}\n\n/**\n * Count number of posts of a post type and if user has permissions to view.\n *\n * This function provides an efficient method of finding the amount of post's\n * type a blog has. Another method is to count the amount of items in\n * get_posts(), but that method has a lot of overhead with doing so. Therefore,\n * when developing for 2.5+, use this function instead.\n *\n * The $perm parameter checks for 'readable' value and if the user can read\n * private posts, it will display that for the user that is signed in.\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $type Optional. Post type to retrieve count. Default 'post'.\n * @param string $perm Optional. 'readable' or empty. Default empty.\n * @return object Number of posts for each status.\n */\nfunction wp_count_posts( $type = 'post', $perm = '' ) {\n\tglobal $wpdb;\n\n\tif ( ! post_type_exists( $type ) )\n\t\treturn new stdClass;\n\n\t$cache_key = _count_posts_cache_key( $type, $perm );\n\n\t$counts = wp_cache_get( $cache_key, 'counts' );\n\tif ( false !== $counts ) {\n\t\t/** This filter is documented in wp-includes/post.php */\n\t\treturn apply_filters( 'wp_count_posts', $counts, $type, $perm );\n\t}\n\n\t$query = \"SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s\";\n\tif ( 'readable' == $perm && is_user_logged_in() ) {\n\t\t$post_type_object = get_post_type_object($type);\n\t\tif ( ! current_user_can( $post_type_object->cap->read_private_posts ) ) {\n\t\t\t$query .= $wpdb->prepare( \" AND (post_status != 'private' OR ( post_author = %d AND post_status = 'private' ))\",\n\t\t\t\tget_current_user_id()\n\t\t\t);\n\t\t}\n\t}\n\t$query .= ' GROUP BY post_status';\n\n\t$results = (array) $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );\n\t$counts = array_fill_keys( get_post_stati(), 0 );\n\n\tforeach ( $results as $row ) {\n\t\t$counts[ $row['post_status'] ] = $row['num_posts'];\n\t}\n\n\t$counts = (object) $counts;\n\twp_cache_set( $cache_key, $counts, 'counts' );\n\n\t/**\n\t * Modify returned post counts by status for the current post type.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param object $counts An object containing the current post_type's post\n\t *                       counts by status.\n\t * @param string $type   Post type.\n\t * @param string $perm   The permission to determine if the posts are 'readable'\n\t *                       by the current user.\n\t */\n\treturn apply_filters( 'wp_count_posts', $counts, $type, $perm );\n}\n\n/**\n * Count number of attachments for the mime type(s).\n *\n * If you set the optional mime_type parameter, then an array will still be\n * returned, but will only have the item you are looking for. It does not give\n * you the number of attachments that are children of a post. You can get that\n * by counting the number of children that post has.\n *\n * @since 2.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string|array $mime_type Optional. Array or comma-separated list of\n *                                MIME patterns. Default empty.\n * @return object An object containing the attachment counts by mime type.\n */\nfunction wp_count_attachments( $mime_type = '' ) {\n\tglobal $wpdb;\n\n\t$and = wp_post_mime_type_where( $mime_type );\n\t$count = $wpdb->get_results( \"SELECT post_mime_type, COUNT( * ) AS num_posts FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' $and GROUP BY post_mime_type\", ARRAY_A );\n\n\t$counts = array();\n\tforeach ( (array) $count as $row ) {\n\t\t$counts[ $row['post_mime_type'] ] = $row['num_posts'];\n\t}\n\t$counts['trash'] = $wpdb->get_var( \"SELECT COUNT( * ) FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status = 'trash' $and\");\n\n\t/**\n\t * Modify returned attachment counts by mime type.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param object $counts    An object containing the attachment counts by\n\t *                          mime type.\n\t * @param string $mime_type The mime type pattern used to filter the attachments\n\t *                          counted.\n\t */\n\treturn apply_filters( 'wp_count_attachments', (object) $counts, $mime_type );\n}\n\n/**\n * Get default post mime types.\n *\n * @since 2.9.0\n *\n * @return array List of post mime types.\n */\nfunction get_post_mime_types() {\n\t$post_mime_types = array(\t//\tarray( adj, noun )\n\t\t'image' => array(__('Images'), __('Manage Images'), _n_noop('Image <span class=\"count\">(%s)</span>', 'Images <span class=\"count\">(%s)</span>')),\n\t\t'audio' => array(__('Audio'), __('Manage Audio'), _n_noop('Audio <span class=\"count\">(%s)</span>', 'Audio <span class=\"count\">(%s)</span>')),\n\t\t'video' => array(__('Video'), __('Manage Video'), _n_noop('Video <span class=\"count\">(%s)</span>', 'Video <span class=\"count\">(%s)</span>')),\n\t);\n\n\t/**\n\t * Filter the default list of post mime types.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array $post_mime_types Default list of post mime types.\n\t */\n\treturn apply_filters( 'post_mime_types', $post_mime_types );\n}\n\n/**\n * Check a MIME-Type against a list.\n *\n * If the wildcard_mime_types parameter is a string, it must be comma separated\n * list. If the real_mime_types is a string, it is also comma separated to\n * create the list.\n *\n * @since 2.5.0\n *\n * @param string|array $wildcard_mime_types Mime types, e.g. audio/mpeg or image (same as image/*)\n *                                          or flash (same as *flash*).\n * @param string|array $real_mime_types     Real post mime type values.\n * @return array array(wildcard=>array(real types)).\n */\nfunction wp_match_mime_types( $wildcard_mime_types, $real_mime_types ) {\n\t$matches = array();\n\tif ( is_string( $wildcard_mime_types ) ) {\n\t\t$wildcard_mime_types = array_map( 'trim', explode( ',', $wildcard_mime_types ) );\n\t}\n\tif ( is_string( $real_mime_types ) ) {\n\t\t$real_mime_types = array_map( 'trim', explode( ',', $real_mime_types ) );\n\t}\n\n\t$patternses = array();\n\t$wild = '[-._a-z0-9]*';\n\n\tforeach ( (array) $wildcard_mime_types as $type ) {\n\t\t$mimes = array_map( 'trim', explode( ',', $type ) );\n\t\tforeach ( $mimes as $mime ) {\n\t\t\t$regex = str_replace( '__wildcard__', $wild, preg_quote( str_replace( '*', '__wildcard__', $mime ) ) );\n\t\t\t$patternses[][$type] = \"^$regex$\";\n\t\t\tif ( false === strpos( $mime, '/' ) ) {\n\t\t\t\t$patternses[][$type] = \"^$regex/\";\n\t\t\t\t$patternses[][$type] = $regex;\n\t\t\t}\n\t\t}\n\t}\n\tasort( $patternses );\n\n\tforeach ( $patternses as $patterns ) {\n\t\tforeach ( $patterns as $type => $pattern ) {\n\t\t\tforeach ( (array) $real_mime_types as $real ) {\n\t\t\t\tif ( preg_match( \"#$pattern#\", $real ) && ( empty( $matches[$type] ) || false === array_search( $real, $matches[$type] ) ) ) {\n\t\t\t\t\t$matches[$type][] = $real;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn $matches;\n}\n\n/**\n * Convert MIME types into SQL.\n *\n * @since 2.5.0\n *\n * @param string|array $post_mime_types List of mime types or comma separated string\n *                                      of mime types.\n * @param string       $table_alias     Optional. Specify a table alias, if needed.\n *                                      Default empty.\n * @return string The SQL AND clause for mime searching.\n */\nfunction wp_post_mime_type_where( $post_mime_types, $table_alias = '' ) {\n\t$where = '';\n\t$wildcards = array('', '%', '%/%');\n\tif ( is_string($post_mime_types) )\n\t\t$post_mime_types = array_map('trim', explode(',', $post_mime_types));\n\n\t$wheres = array();\n\n\tforeach ( (array) $post_mime_types as $mime_type ) {\n\t\t$mime_type = preg_replace('/\\s/', '', $mime_type);\n\t\t$slashpos = strpos($mime_type, '/');\n\t\tif ( false !== $slashpos ) {\n\t\t\t$mime_group = preg_replace('/[^-*.a-zA-Z0-9]/', '', substr($mime_type, 0, $slashpos));\n\t\t\t$mime_subgroup = preg_replace('/[^-*.+a-zA-Z0-9]/', '', substr($mime_type, $slashpos + 1));\n\t\t\tif ( empty($mime_subgroup) )\n\t\t\t\t$mime_subgroup = '*';\n\t\t\telse\n\t\t\t\t$mime_subgroup = str_replace('/', '', $mime_subgroup);\n\t\t\t$mime_pattern = \"$mime_group/$mime_subgroup\";\n\t\t} else {\n\t\t\t$mime_pattern = preg_replace('/[^-*.a-zA-Z0-9]/', '', $mime_type);\n\t\t\tif ( false === strpos($mime_pattern, '*') )\n\t\t\t\t$mime_pattern .= '/*';\n\t\t}\n\n\t\t$mime_pattern = preg_replace('/\\*+/', '%', $mime_pattern);\n\n\t\tif ( in_array( $mime_type, $wildcards ) )\n\t\t\treturn '';\n\n\t\tif ( false !== strpos($mime_pattern, '%') )\n\t\t\t$wheres[] = empty($table_alias) ? \"post_mime_type LIKE '$mime_pattern'\" : \"$table_alias.post_mime_type LIKE '$mime_pattern'\";\n\t\telse\n\t\t\t$wheres[] = empty($table_alias) ? \"post_mime_type = '$mime_pattern'\" : \"$table_alias.post_mime_type = '$mime_pattern'\";\n\t}\n\tif ( !empty($wheres) )\n\t\t$where = ' AND (' . join(' OR ', $wheres) . ') ';\n\treturn $where;\n}\n\n/**\n * Trash or delete a post or page.\n *\n * When the post and page is permanently deleted, everything that is tied to\n * it is deleted also. This includes comments, post meta fields, and terms\n * associated with the post.\n *\n * The post or page is moved to trash instead of permanently deleted unless\n * trash is disabled, item is already in the trash, or $force_delete is true.\n *\n * @since 1.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @see wp_delete_attachment()\n * @see wp_trash_post()\n *\n * @param int  $postid       Optional. Post ID. Default 0.\n * @param bool $force_delete Optional. Whether to bypass trash and force deletion.\n *                           Default false.\n * @return array|false|WP_Post False on failure.\n */\nfunction wp_delete_post( $postid = 0, $force_delete = false ) {\n\tglobal $wpdb;\n\n\tif ( !$post = $wpdb->get_row($wpdb->prepare(\"SELECT * FROM $wpdb->posts WHERE ID = %d\", $postid)) )\n\t\treturn $post;\n\n\tif ( !$force_delete && ( $post->post_type == 'post' || $post->post_type == 'page') && get_post_status( $postid ) != 'trash' && EMPTY_TRASH_DAYS )\n\t\treturn wp_trash_post( $postid );\n\n\tif ( $post->post_type == 'attachment' )\n\t\treturn wp_delete_attachment( $postid, $force_delete );\n\n\t/**\n\t * Filter whether a post deletion should take place.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param bool    $delete       Whether to go forward with deletion.\n\t * @param WP_Post $post         Post object.\n\t * @param bool    $force_delete Whether to bypass the trash.\n\t */\n\t$check = apply_filters( 'pre_delete_post', null, $post, $force_delete );\n\tif ( null !== $check ) {\n\t\treturn $check;\n\t}\n\n\t/**\n\t * Fires before a post is deleted, at the start of wp_delete_post().\n\t *\n\t * @since 3.2.0\n\t *\n\t * @see wp_delete_post()\n\t *\n\t * @param int $postid Post ID.\n\t */\n\tdo_action( 'before_delete_post', $postid );\n\n\tdelete_post_meta($postid,'_wp_trash_meta_status');\n\tdelete_post_meta($postid,'_wp_trash_meta_time');\n\n\twp_delete_object_term_relationships($postid, get_object_taxonomies($post->post_type));\n\n\t$parent_data = array( 'post_parent' => $post->post_parent );\n\t$parent_where = array( 'post_parent' => $postid );\n\n\tif ( is_post_type_hierarchical( $post->post_type ) ) {\n\t\t// Point children of this page to its parent, also clean the cache of affected children.\n\t\t$children_query = $wpdb->prepare( \"SELECT * FROM $wpdb->posts WHERE post_parent = %d AND post_type = %s\", $postid, $post->post_type );\n\t\t$children = $wpdb->get_results( $children_query );\n\n\t\t$wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => $post->post_type ) );\n\t}\n\n\t// Do raw query. wp_get_post_revisions() is filtered.\n\t$revision_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'revision'\", $postid ) );\n\t// Use wp_delete_post (via wp_delete_post_revision) again. Ensures any meta/misplaced data gets cleaned up.\n\tforeach ( $revision_ids as $revision_id )\n\t\twp_delete_post_revision( $revision_id );\n\n\t// Point all attachments to this post up one level.\n\t$wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => 'attachment' ) );\n\n\twp_defer_comment_counting( true );\n\n\t$comment_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d\", $postid ));\n\tforeach ( $comment_ids as $comment_id ) {\n\t\twp_delete_comment( $comment_id, true );\n\t}\n\n\twp_defer_comment_counting( false );\n\n\t$post_meta_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d \", $postid ));\n\tforeach ( $post_meta_ids as $mid )\n\t\tdelete_metadata_by_mid( 'post', $mid );\n\n\t/**\n\t * Fires immediately before a post is deleted from the database.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param int $postid Post ID.\n\t */\n\tdo_action( 'delete_post', $postid );\n\t$result = $wpdb->delete( $wpdb->posts, array( 'ID' => $postid ) );\n\tif ( ! $result ) {\n\t\treturn false;\n\t}\n\n\t/**\n\t * Fires immediately after a post is deleted from the database.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param int $postid Post ID.\n\t */\n\tdo_action( 'deleted_post', $postid );\n\n\tclean_post_cache( $post );\n\n\tif ( is_post_type_hierarchical( $post->post_type ) && $children ) {\n\t\tforeach ( $children as $child )\n\t\t\tclean_post_cache( $child );\n\t}\n\n\twp_clear_scheduled_hook('publish_future_post', array( $postid ) );\n\n\t/**\n\t * Fires after a post is deleted, at the conclusion of wp_delete_post().\n\t *\n\t * @since 3.2.0\n\t *\n\t * @see wp_delete_post()\n\t *\n\t * @param int $postid Post ID.\n\t */\n\tdo_action( 'after_delete_post', $postid );\n\n\treturn $post;\n}\n\n/**\n * Reset the page_on_front, show_on_front, and page_for_post settings when\n * a linked page is deleted or trashed.\n *\n * Also ensures the post is no longer sticky.\n *\n * @since 3.7.0\n * @access private\n *\n * @param int $post_id Post ID.\n */\nfunction _reset_front_page_settings_for_post( $post_id ) {\n\t$post = get_post( $post_id );\n\tif ( 'page' == $post->post_type ) {\n\t \t/*\n\t \t * If the page is defined in option page_on_front or post_for_posts,\n\t \t * adjust the corresponding options.\n\t \t */\n\t\tif ( get_option( 'page_on_front' ) == $post->ID ) {\n\t\t\tupdate_option( 'show_on_front', 'posts' );\n\t\t\tupdate_option( 'page_on_front', 0 );\n\t\t}\n\t\tif ( get_option( 'page_for_posts' ) == $post->ID ) {\n\t\t\tdelete_option( 'page_for_posts', 0 );\n\t\t}\n\t}\n\tunstick_post( $post->ID );\n}\n\n/**\n * Move a post or page to the Trash\n *\n * If trash is disabled, the post or page is permanently deleted.\n *\n * @since 2.9.0\n *\n * @see wp_delete_post()\n *\n * @param int $post_id Optional. Post ID. Default is ID of the global $post\n *                     if EMPTY_TRASH_DAYS equals true.\n * @return false|array|WP_Post|null Post data array, otherwise false.\n */\nfunction wp_trash_post( $post_id = 0 ) {\n\tif ( !EMPTY_TRASH_DAYS )\n\t\treturn wp_delete_post($post_id, true);\n\n\tif ( !$post = get_post($post_id, ARRAY_A) )\n\t\treturn $post;\n\n\tif ( $post['post_status'] == 'trash' )\n\t\treturn false;\n\n\t/**\n\t * Fires before a post is sent to the trash.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param int $post_id Post ID.\n\t */\n\tdo_action( 'wp_trash_post', $post_id );\n\n\tadd_post_meta($post_id,'_wp_trash_meta_status', $post['post_status']);\n\tadd_post_meta($post_id,'_wp_trash_meta_time', time());\n\n\t$post['post_status'] = 'trash';\n\twp_insert_post( wp_slash( $post ) );\n\n\twp_trash_post_comments($post_id);\n\n\t/**\n\t * Fires after a post is sent to the trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $post_id Post ID.\n\t */\n\tdo_action( 'trashed_post', $post_id );\n\n\treturn $post;\n}\n\n/**\n * Restore a post or page from the Trash.\n *\n * @since 2.9.0\n *\n * @param int $post_id Optional. Post ID. Default is ID of the global $post.\n * @return WP_Post|false WP_Post object. False on failure.\n */\nfunction wp_untrash_post( $post_id = 0 ) {\n\tif ( !$post = get_post($post_id, ARRAY_A) )\n\t\treturn $post;\n\n\tif ( $post['post_status'] != 'trash' )\n\t\treturn false;\n\n\t/**\n\t * Fires before a post is restored from the trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $post_id Post ID.\n\t */\n\tdo_action( 'untrash_post', $post_id );\n\n\t$post_status = get_post_meta($post_id, '_wp_trash_meta_status', true);\n\n\t$post['post_status'] = $post_status;\n\n\tdelete_post_meta($post_id, '_wp_trash_meta_status');\n\tdelete_post_meta($post_id, '_wp_trash_meta_time');\n\n\twp_insert_post( wp_slash( $post ) );\n\n\twp_untrash_post_comments($post_id);\n\n\t/**\n\t * Fires after a post is restored from the trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $post_id Post ID.\n\t */\n\tdo_action( 'untrashed_post', $post_id );\n\n\treturn $post;\n}\n\n/**\n * Moves comments for a post to the trash.\n *\n * @since 2.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to global $post.\n * @return mixed|void False on failure.\n */\nfunction wp_trash_post_comments( $post = null ) {\n\tglobal $wpdb;\n\n\t$post = get_post($post);\n\tif ( empty($post) )\n\t\treturn;\n\n\t$post_id = $post->ID;\n\n\t/**\n\t * Fires before comments are sent to the trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $post_id Post ID.\n\t */\n\tdo_action( 'trash_post_comments', $post_id );\n\n\t$comments = $wpdb->get_results( $wpdb->prepare(\"SELECT comment_ID, comment_approved FROM $wpdb->comments WHERE comment_post_ID = %d\", $post_id) );\n\tif ( empty($comments) )\n\t\treturn;\n\n\t// Cache current status for each comment.\n\t$statuses = array();\n\tforeach ( $comments as $comment )\n\t\t$statuses[$comment->comment_ID] = $comment->comment_approved;\n\tadd_post_meta($post_id, '_wp_trash_meta_comments_status', $statuses);\n\n\t// Set status for all comments to post-trashed.\n\t$result = $wpdb->update($wpdb->comments, array('comment_approved' => 'post-trashed'), array('comment_post_ID' => $post_id));\n\n\tclean_comment_cache( array_keys($statuses) );\n\n\t/**\n\t * Fires after comments are sent to the trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int   $post_id  Post ID.\n\t * @param array $statuses Array of comment statuses.\n\t */\n\tdo_action( 'trashed_post_comments', $post_id, $statuses );\n\n\treturn $result;\n}\n\n/**\n * Restore comments for a post from the trash.\n *\n * @since 2.9.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to global $post.\n * @return true|void\n */\nfunction wp_untrash_post_comments( $post = null ) {\n\tglobal $wpdb;\n\n\t$post = get_post($post);\n\tif ( empty($post) )\n\t\treturn;\n\n\t$post_id = $post->ID;\n\n\t$statuses = get_post_meta($post_id, '_wp_trash_meta_comments_status', true);\n\n\tif ( empty($statuses) )\n\t\treturn true;\n\n\t/**\n\t * Fires before comments are restored for a post from the trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $post_id Post ID.\n\t */\n\tdo_action( 'untrash_post_comments', $post_id );\n\n\t// Restore each comment to its original status.\n\t$group_by_status = array();\n\tforeach ( $statuses as $comment_id => $comment_status )\n\t\t$group_by_status[$comment_status][] = $comment_id;\n\n\tforeach ( $group_by_status as $status => $comments ) {\n\t\t// Sanity check. This shouldn't happen.\n\t\tif ( 'post-trashed' == $status ) {\n\t\t\t$status = '0';\n\t\t}\n\t\t$comments_in = implode( ', ', array_map( 'intval', $comments ) );\n\t\t$wpdb->query( $wpdb->prepare( \"UPDATE $wpdb->comments SET comment_approved = %s WHERE comment_ID IN ($comments_in)\", $status ) );\n\t}\n\n\tclean_comment_cache( array_keys($statuses) );\n\n\tdelete_post_meta($post_id, '_wp_trash_meta_comments_status');\n\n\t/**\n\t * Fires after comments are restored for a post from the trash.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $post_id Post ID.\n\t */\n\tdo_action( 'untrashed_post_comments', $post_id );\n}\n\n/**\n * Retrieve the list of categories for a post.\n *\n * Compatibility layer for themes and plugins. Also an easy layer of abstraction\n * away from the complexity of the taxonomy layer.\n *\n * @since 2.1.0\n *\n * @see wp_get_object_terms()\n *\n * @param int   $post_id Optional. The Post ID. Does not default to the ID of the\n *                       global $post. Default 0.\n * @param array $args    Optional. Category arguments. Default empty.\n * @return array List of categories.\n */\nfunction wp_get_post_categories( $post_id = 0, $args = array() ) {\n\t$post_id = (int) $post_id;\n\n\t$defaults = array('fields' => 'ids');\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$cats = wp_get_object_terms($post_id, 'category', $args);\n\treturn $cats;\n}\n\n/**\n * Retrieve the tags for a post.\n *\n * There is only one default for this function, called 'fields' and by default\n * is set to 'all'. There are other defaults that can be overridden in\n * {@link wp_get_object_terms()}.\n *\n * @since 2.3.0\n *\n * @param int   $post_id Optional. The Post ID. Does not default to the ID of the\n *                       global $post. Default 0.\n * @param array $args Optional. Overwrite the defaults\n * @return array List of post tags.\n */\nfunction wp_get_post_tags( $post_id = 0, $args = array() ) {\n\treturn wp_get_post_terms( $post_id, 'post_tag', $args);\n}\n\n/**\n * Retrieve the terms for a post.\n *\n * There is only one default for this function, called 'fields' and by default\n * is set to 'all'. There are other defaults that can be overridden in\n * {@link wp_get_object_terms()}.\n *\n * @since 2.8.0\n *\n * @param int    $post_id  Optional. The Post ID. Does not default to the ID of the\n *                         global $post. Default 0.\n * @param string $taxonomy Optional. The taxonomy for which to retrieve terms. Default 'post_tag'.\n * @param array  $args     Optional. {@link wp_get_object_terms()} arguments. Default empty array.\n * @return array|WP_Error  List of post terms or empty array if no terms were found. WP_Error object\n *                         if `$taxonomy` doesn't exist.\n */\nfunction wp_get_post_terms( $post_id = 0, $taxonomy = 'post_tag', $args = array() ) {\n\t$post_id = (int) $post_id;\n\n\t$defaults = array('fields' => 'all');\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$tags = wp_get_object_terms($post_id, $taxonomy, $args);\n\n\treturn $tags;\n}\n\n/**\n * Retrieve a number of recent posts.\n *\n * @since 1.0.0\n *\n * @see get_posts()\n *\n * @param array  $args       Optional. Arguments to retrieve posts. Default empty array.\n * @param string $output     Optional. Type of output. Accepts ARRAY_A or ''. Default ARRAY_A.\n * @return array|false Associative array if $output equals ARRAY_A, array or false if no results.\n */\nfunction wp_get_recent_posts( $args = array(), $output = ARRAY_A ) {\n\n\tif ( is_numeric( $args ) ) {\n\t\t_deprecated_argument( __FUNCTION__, '3.1', __( 'Passing an integer number of posts is deprecated. Pass an array of arguments instead.' ) );\n\t\t$args = array( 'numberposts' => absint( $args ) );\n\t}\n\n\t// Set default arguments.\n\t$defaults = array(\n\t\t'numberposts' => 10, 'offset' => 0,\n\t\t'category' => 0, 'orderby' => 'post_date',\n\t\t'order' => 'DESC', 'include' => '',\n\t\t'exclude' => '', 'meta_key' => '',\n\t\t'meta_value' =>'', 'post_type' => 'post', 'post_status' => 'draft, publish, future, pending, private',\n\t\t'suppress_filters' => true\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$results = get_posts( $r );\n\n\t// Backward compatibility. Prior to 3.1 expected posts to be returned in array.\n\tif ( ARRAY_A == $output ){\n\t\tforeach ( $results as $key => $result ) {\n\t\t\t$results[$key] = get_object_vars( $result );\n\t\t}\n\t\treturn $results ? $results : array();\n\t}\n\n\treturn $results ? $results : false;\n\n}\n\n/**\n * Insert or update a post.\n *\n * If the $postarr parameter has 'ID' set to a value, then post will be updated.\n *\n * You can set the post date manually, by setting the values for 'post_date'\n * and 'post_date_gmt' keys. You can close the comments or open the comments by\n * setting the value for 'comment_status' key.\n *\n * @since 1.0.0\n * @since 4.2.0 Support was added for encoding emoji in the post title, content, and excerpt.\n * @since 4.4.0 A 'meta_input' array can now be passed to `$postarr` to add post meta data.\n *\n * @see sanitize_post()\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $postarr {\n *     An array of elements that make up a post to update or insert.\n *\n *     @type int    $ID                    The post ID. If equal to something other than 0,\n *                                         the post with that ID will be updated. Default 0.\n *     @type int    $post_author           The ID of the user who added the post. Default is\n *                                         the current user ID.\n *     @type string $post_date             The date of the post. Default is the current time.\n *     @type string $post_date_gmt         The date of the post in the GMT timezone. Default is\n *                                         the value of `$post_date`.\n *     @type mixed  $post_content          The post content. Default empty.\n *     @type string $post_content_filtered The filtered post content. Default empty.\n *     @type string $post_title            The post title. Default empty.\n *     @type string $post_excerpt          The post excerpt. Default empty.\n *     @type string $post_status           The post status. Default 'draft'.\n *     @type string $post_type             The post type. Default 'post'.\n *     @type string $comment_status        Whether the post can accept comments. Accepts 'open' or 'closed'.\n *                                         Default is the value of 'default_comment_status' option.\n *     @type string $ping_status           Whether the post can accept pings. Accepts 'open' or 'closed'.\n *                                         Default is the value of 'default_ping_status' option.\n *     @type string $post_password         The password to access the post. Default empty.\n *     @type string $post_name             The post name. Default is the sanitized post title.\n *     @type string $to_ping               Space or carriage return-separated list of URLs to ping.\n *                                         Default empty.\n *     @type string $pinged                Space or carriage return-separated list of URLs that have\n *                                         been pinged. Default empty.\n *     @type string $post_modified         The date when the post was last modified. Default is\n *                                         the current time.\n *     @type string $post_modified_gmt     The date when the post was last modified in the GMT\n *                                         timezone. Default is the current time.\n *     @type int    $post_parent           Set this for the post it belongs to, if any. Default 0.\n *     @type int    $menu_order            The order the post should be displayed in. Default 0.\n *     @type string $post_mime_type        The mime type of the post. Default empty.\n *     @type string $guid                  Global Unique ID for referencing the post. Default empty.\n *     @type array  $tax_input             Array of taxonomy terms keyed by their taxonomy name. Default empty.\n *     @type array  $meta_input            Array of post meta values keyed by their post meta key. Default empty.\n * }\n * @param bool  $wp_error Optional. Whether to allow return of WP_Error on failure. Default false.\n * @return int|WP_Error The post ID on success. The value 0 or WP_Error on failure.\n */\nfunction wp_insert_post( $postarr, $wp_error = false ) {\n\tglobal $wpdb;\n\n\t$user_id = get_current_user_id();\n\n\t$defaults = array(\n\t\t'post_author' => $user_id,\n\t\t'post_content' => '',\n\t\t'post_content_filtered' => '',\n\t\t'post_title' => '',\n\t\t'post_excerpt' => '',\n\t\t'post_status' => 'draft',\n\t\t'post_type' => 'post',\n\t\t'comment_status' => '',\n\t\t'ping_status' => '',\n\t\t'post_password' => '',\n\t\t'to_ping' =>  '',\n\t\t'pinged' => '',\n\t\t'post_parent' => 0,\n\t\t'menu_order' => 0,\n\t\t'guid' => '',\n\t\t'import_id' => 0,\n\t\t'context' => '',\n\t);\n\n\t$postarr = wp_parse_args($postarr, $defaults);\n\n\tunset( $postarr[ 'filter' ] );\n\n\t$postarr = sanitize_post($postarr, 'db');\n\n\t// Are we updating or creating?\n\t$post_ID = 0;\n\t$update = false;\n\t$guid = $postarr['guid'];\n\n\tif ( ! empty( $postarr['ID'] ) ) {\n\t\t$update = true;\n\n\t\t// Get the post ID and GUID.\n\t\t$post_ID = $postarr['ID'];\n\t\t$post_before = get_post( $post_ID );\n\t\tif ( is_null( $post_before ) ) {\n\t\t\tif ( $wp_error ) {\n\t\t\t\treturn new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) );\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\t\t$guid = get_post_field( 'guid', $post_ID );\n\t\t$previous_status = get_post_field('post_status', $post_ID );\n\t} else {\n\t\t$previous_status = 'new';\n\t}\n\n\t$post_type = empty( $postarr['post_type'] ) ? 'post' : $postarr['post_type'];\n\n\t$post_title = $postarr['post_title'];\n\t$post_content = $postarr['post_content'];\n\t$post_excerpt = $postarr['post_excerpt'];\n\tif ( isset( $postarr['post_name'] ) ) {\n\t\t$post_name = $postarr['post_name'];\n\t}\n\n\t$maybe_empty = 'attachment' !== $post_type\n\t\t&& ! $post_content && ! $post_title && ! $post_excerpt\n\t\t&& post_type_supports( $post_type, 'editor' )\n\t\t&& post_type_supports( $post_type, 'title' )\n\t\t&& post_type_supports( $post_type, 'excerpt' );\n\n\t/**\n\t * Filter whether the post should be considered \"empty\".\n\t *\n\t * The post is considered \"empty\" if both:\n\t * 1. The post type supports the title, editor, and excerpt fields\n\t * 2. The title, editor, and excerpt fields are all empty\n\t *\n\t * Returning a truthy value to the filter will effectively short-circuit\n\t * the new post being inserted, returning 0. If $wp_error is true, a WP_Error\n\t * will be returned instead.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param bool  $maybe_empty Whether the post should be considered \"empty\".\n\t * @param array $postarr     Array of post data.\n\t */\n\tif ( apply_filters( 'wp_insert_post_empty_content', $maybe_empty, $postarr ) ) {\n\t\tif ( $wp_error ) {\n\t\t\treturn new WP_Error( 'empty_content', __( 'Content, title, and excerpt are empty.' ) );\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t$post_status = empty( $postarr['post_status'] ) ? 'draft' : $postarr['post_status'];\n\tif ( 'attachment' === $post_type && ! in_array( $post_status, array( 'inherit', 'private', 'trash' ) ) ) {\n\t\t$post_status = 'inherit';\n\t}\n\n\tif ( ! empty( $postarr['post_category'] ) ) {\n\t\t// Filter out empty terms.\n\t\t$post_category = array_filter( $postarr['post_category'] );\n\t}\n\n\t// Make sure we set a valid category.\n\tif ( empty( $post_category ) || 0 == count( $post_category ) || ! is_array( $post_category ) ) {\n\t\t// 'post' requires at least one category.\n\t\tif ( 'post' == $post_type && 'auto-draft' != $post_status ) {\n\t\t\t$post_category = array( get_option('default_category') );\n\t\t} else {\n\t\t\t$post_category = array();\n\t\t}\n\t}\n\n\t// Don't allow contributors to set the post slug for pending review posts.\n\tif ( 'pending' == $post_status && !current_user_can( 'publish_posts' ) ) {\n\t\t$post_name = '';\n\t}\n\n\t/*\n\t * Create a valid post name. Drafts and pending posts are allowed to have\n\t * an empty post name.\n\t */\n\tif ( empty($post_name) ) {\n\t\tif ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) {\n\t\t\t$post_name = sanitize_title($post_title);\n\t\t} else {\n\t\t\t$post_name = '';\n\t\t}\n\t} else {\n\t\t// On updates, we need to check to see if it's using the old, fixed sanitization context.\n\t\t$check_name = sanitize_title( $post_name, '', 'old-save' );\n\t\tif ( $update && strtolower( urlencode( $post_name ) ) == $check_name && get_post_field( 'post_name', $post_ID ) == $check_name ) {\n\t\t\t$post_name = $check_name;\n\t\t} else { // new post, or slug has changed.\n\t\t\t$post_name = sanitize_title($post_name);\n\t\t}\n\t}\n\n\t/*\n\t * If the post date is empty (due to having been new or a draft) and status\n\t * is not 'draft' or 'pending', set date to now.\n\t */\n\tif ( empty( $postarr['post_date'] ) || '0000-00-00 00:00:00' == $postarr['post_date'] ) {\n\t\tif ( empty( $postarr['post_date_gmt'] ) || '0000-00-00 00:00:00' == $postarr['post_date_gmt'] ) {\n\t\t\t$post_date = current_time( 'mysql' );\n\t\t} else {\n\t\t\t$post_date = get_date_from_gmt( $postarr['post_date_gmt'] );\n\t\t}\n\t} else {\n\t\t$post_date = $postarr['post_date'];\n\t}\n\n\t// Validate the date.\n\t$mm = substr( $post_date, 5, 2 );\n\t$jj = substr( $post_date, 8, 2 );\n\t$aa = substr( $post_date, 0, 4 );\n\t$valid_date = wp_checkdate( $mm, $jj, $aa, $post_date );\n\tif ( ! $valid_date ) {\n\t\tif ( $wp_error ) {\n\t\t\treturn new WP_Error( 'invalid_date', __( 'Whoops, the provided date is invalid.' ) );\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tif ( empty( $postarr['post_date_gmt'] ) || '0000-00-00 00:00:00' == $postarr['post_date_gmt'] ) {\n\t\tif ( ! in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) {\n\t\t\t$post_date_gmt = get_gmt_from_date( $post_date );\n\t\t} else {\n\t\t\t$post_date_gmt = '0000-00-00 00:00:00';\n\t\t}\n\t} else {\n\t\t$post_date_gmt = $postarr['post_date_gmt'];\n\t}\n\n\tif ( $update || '0000-00-00 00:00:00' == $post_date ) {\n\t\t$post_modified     = current_time( 'mysql' );\n\t\t$post_modified_gmt = current_time( 'mysql', 1 );\n\t} else {\n\t\t$post_modified     = $post_date;\n\t\t$post_modified_gmt = $post_date_gmt;\n\t}\n\n\tif ( 'attachment' !== $post_type ) {\n\t\tif ( 'publish' == $post_status ) {\n\t\t\t$now = gmdate('Y-m-d H:i:59');\n\t\t\tif ( mysql2date('U', $post_date_gmt, false) > mysql2date('U', $now, false) ) {\n\t\t\t\t$post_status = 'future';\n\t\t\t}\n\t\t} elseif ( 'future' == $post_status ) {\n\t\t\t$now = gmdate('Y-m-d H:i:59');\n\t\t\tif ( mysql2date('U', $post_date_gmt, false) <= mysql2date('U', $now, false) ) {\n\t\t\t\t$post_status = 'publish';\n\t\t\t}\n\t\t}\n\t}\n\n\t// Comment status.\n\tif ( empty( $postarr['comment_status'] ) ) {\n\t\tif ( $update ) {\n\t\t\t$comment_status = 'closed';\n\t\t} else {\n\t\t\t$comment_status = get_default_comment_status( $post_type );\n\t\t}\n\t} else {\n\t\t$comment_status = $postarr['comment_status'];\n\t}\n\n\t// These variables are needed by compact() later.\n\t$post_content_filtered = $postarr['post_content_filtered'];\n\t$post_author = isset( $postarr['post_author'] ) ? $postarr['post_author'] : $user_id;\n\t$ping_status = empty( $postarr['ping_status'] ) ? get_default_comment_status( $post_type, 'pingback' ) : $postarr['ping_status'];\n\t$to_ping = isset( $postarr['to_ping'] ) ? sanitize_trackback_urls( $postarr['to_ping'] ) : '';\n\t$pinged = isset( $postarr['pinged'] ) ? $postarr['pinged'] : '';\n\t$import_id = isset( $postarr['import_id'] ) ? $postarr['import_id'] : 0;\n\n\t/*\n\t * The 'wp_insert_post_parent' filter expects all variables to be present.\n\t * Previously, these variables would have already been extracted\n\t */\n\tif ( isset( $postarr['menu_order'] ) ) {\n\t\t$menu_order = (int) $postarr['menu_order'];\n\t} else {\n\t\t$menu_order = 0;\n\t}\n\n\t$post_password = isset( $postarr['post_password'] ) ? $postarr['post_password'] : '';\n\tif ( 'private' == $post_status ) {\n\t\t$post_password = '';\n\t}\n\n\tif ( isset( $postarr['post_parent'] ) ) {\n\t\t$post_parent = (int) $postarr['post_parent'];\n\t} else {\n\t\t$post_parent = 0;\n\t}\n\n\t/**\n\t * Filter the post parent -- used to check for and prevent hierarchy loops.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param int   $post_parent Post parent ID.\n\t * @param int   $post_ID     Post ID.\n\t * @param array $new_postarr Array of parsed post data.\n\t * @param array $postarr     Array of sanitized, but otherwise unmodified post data.\n\t */\n\t$post_parent = apply_filters( 'wp_insert_post_parent', $post_parent, $post_ID, compact( array_keys( $postarr ) ), $postarr );\n\n\t$post_name = wp_unique_post_slug( $post_name, $post_ID, $post_status, $post_type, $post_parent );\n\n\t// Don't unslash.\n\t$post_mime_type = isset( $postarr['post_mime_type'] ) ? $postarr['post_mime_type'] : '';\n\n\t// Expected_slashed (everything!).\n\t$data = compact( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'guid' );\n\n\t$emoji_fields = array( 'post_title', 'post_content', 'post_excerpt' );\n\n\tforeach ( $emoji_fields as $emoji_field ) {\n\t\tif ( isset( $data[ $emoji_field ] ) ) {\n\t\t\t$charset = $wpdb->get_col_charset( $wpdb->posts, $emoji_field );\n\t\t\tif ( 'utf8' === $charset ) {\n\t\t\t\t$data[ $emoji_field ] = wp_encode_emoji( $data[ $emoji_field ] );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( 'attachment' === $post_type ) {\n\t\t/**\n\t\t * Filter attachment post data before it is updated in or added to the database.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param array $data    An array of sanitized attachment post data.\n\t\t * @param array $postarr An array of unsanitized attachment post data.\n\t\t */\n\t\t$data = apply_filters( 'wp_insert_attachment_data', $data, $postarr );\n\t} else {\n\t\t/**\n\t\t * Filter slashed post data just before it is inserted into the database.\n\t\t *\n\t\t * @since 2.7.0\n\t\t *\n\t\t * @param array $data    An array of slashed post data.\n\t\t * @param array $postarr An array of sanitized, but otherwise unmodified post data.\n\t\t */\n\t\t$data = apply_filters( 'wp_insert_post_data', $data, $postarr );\n\t}\n\t$data = wp_unslash( $data );\n\t$where = array( 'ID' => $post_ID );\n\n\tif ( $update ) {\n\t\t/**\n\t\t * Fires immediately before an existing post is updated in the database.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param int   $post_ID Post ID.\n\t\t * @param array $data    Array of unslashed post data.\n\t\t */\n\t\tdo_action( 'pre_post_update', $post_ID, $data );\n\t\tif ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) {\n\t\t\tif ( $wp_error ) {\n\t\t\t\treturn new WP_Error('db_update_error', __('Could not update post in the database'), $wpdb->last_error);\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// If there is a suggested ID, use it if not already present.\n\t\tif ( ! empty( $import_id ) ) {\n\t\t\t$import_id = (int) $import_id;\n\t\t\tif ( ! $wpdb->get_var( $wpdb->prepare(\"SELECT ID FROM $wpdb->posts WHERE ID = %d\", $import_id) ) ) {\n\t\t\t\t$data['ID'] = $import_id;\n\t\t\t}\n\t\t}\n\t\tif ( false === $wpdb->insert( $wpdb->posts, $data ) ) {\n\t\t\tif ( $wp_error ) {\n\t\t\t\treturn new WP_Error('db_insert_error', __('Could not insert post into the database'), $wpdb->last_error);\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\t$post_ID = (int) $wpdb->insert_id;\n\n\t\t// Use the newly generated $post_ID.\n\t\t$where = array( 'ID' => $post_ID );\n\t}\n\n\tif ( empty( $data['post_name'] ) && ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {\n\t\t$data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'], $post_ID ), $post_ID, $data['post_status'], $post_type, $post_parent );\n\t\t$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );\n\t\tclean_post_cache( $post_ID );\n\t}\n\n\tif ( is_object_in_taxonomy( $post_type, 'category' ) ) {\n\t\twp_set_post_categories( $post_ID, $post_category );\n\t}\n\n\tif ( isset( $postarr['tags_input'] ) && is_object_in_taxonomy( $post_type, 'post_tag' ) ) {\n\t\twp_set_post_tags( $post_ID, $postarr['tags_input'] );\n\t}\n\n\t// New-style support for all custom taxonomies.\n\tif ( ! empty( $postarr['tax_input'] ) ) {\n\t\tforeach ( $postarr['tax_input'] as $taxonomy => $tags ) {\n\t\t\t$taxonomy_obj = get_taxonomy($taxonomy);\n\t\t\tif ( ! $taxonomy_obj ) {\n\t\t\t\t/* translators: %s: taxonomy name */\n\t\t\t\t_doing_it_wrong( __FUNCTION__, sprintf( __( 'Invalid taxonomy: %s.' ), $taxonomy ), '4.4.0' );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// array = hierarchical, string = non-hierarchical.\n\t\t\tif ( is_array( $tags ) ) {\n\t\t\t\t$tags = array_filter($tags);\n\t\t\t}\n\t\t\tif ( current_user_can( $taxonomy_obj->cap->assign_terms ) ) {\n\t\t\t\twp_set_post_terms( $post_ID, $tags, $taxonomy );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( ! empty( $postarr['meta_input'] ) ) {\n\t\tforeach ( $postarr['meta_input'] as $field => $value ) {\n\t\t\tupdate_post_meta( $post_ID, $field, $value );\n\t\t}\n\t}\n\n\t$current_guid = get_post_field( 'guid', $post_ID );\n\n\t// Set GUID.\n\tif ( ! $update && '' == $current_guid ) {\n\t\t$wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post_ID ) ), $where );\n\t}\n\n\tif ( 'attachment' === $postarr['post_type'] ) {\n\t\tif ( ! empty( $postarr['file'] ) ) {\n\t\t\tupdate_attached_file( $post_ID, $postarr['file'] );\n\t\t}\n\n\t\tif ( ! empty( $postarr['context'] ) ) {\n\t\t\tadd_post_meta( $post_ID, '_wp_attachment_context', $postarr['context'], true );\n\t\t}\n\t}\n\n\tclean_post_cache( $post_ID );\n\n\t$post = get_post( $post_ID );\n\n\tif ( ! empty( $postarr['page_template'] ) && 'page' == $data['post_type'] ) {\n\t\t$post->page_template = $postarr['page_template'];\n\t\t$page_templates = wp_get_theme()->get_page_templates( $post );\n\t\tif ( 'default' != $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) ) {\n\t\t\tif ( $wp_error ) {\n\t\t\t\treturn new WP_Error('invalid_page_template', __('The page template is invalid.'));\n\t\t\t}\n\t\t\tupdate_post_meta( $post_ID, '_wp_page_template', 'default' );\n\t\t} else {\n\t\t\tupdate_post_meta( $post_ID, '_wp_page_template', $postarr['page_template'] );\n\t\t}\n\t}\n\n\tif ( 'attachment' !== $postarr['post_type'] ) {\n\t\twp_transition_post_status( $data['post_status'], $previous_status, $post );\n\t} else {\n\t\tif ( $update ) {\n\t\t\t/**\n\t\t\t * Fires once an existing attachment has been updated.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param int $post_ID Attachment ID.\n\t\t\t */\n\t\t\tdo_action( 'edit_attachment', $post_ID );\n\t\t\t$post_after = get_post( $post_ID );\n\n\t\t\t/**\n\t\t\t * Fires once an existing attachment has been updated.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param int     $post_ID      Post ID.\n\t\t\t * @param WP_Post $post_after   Post object following the update.\n\t\t\t * @param WP_Post $post_before  Post object before the update.\n\t\t\t */\n\t\t\tdo_action( 'attachment_updated', $post_ID, $post_after, $post_before );\n\t\t} else {\n\n\t\t\t/**\n\t\t\t * Fires once an attachment has been added.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param int $post_ID Attachment ID.\n\t\t\t */\n\t\t\tdo_action( 'add_attachment', $post_ID );\n\t\t}\n\n\t\treturn $post_ID;\n\t}\n\n\tif ( $update ) {\n\t\t/**\n\t\t * Fires once an existing post has been updated.\n\t\t *\n\t\t * @since 1.2.0\n\t\t *\n\t\t * @param int     $post_ID Post ID.\n\t\t * @param WP_Post $post    Post object.\n\t\t */\n\t\tdo_action( 'edit_post', $post_ID, $post );\n\t\t$post_after = get_post($post_ID);\n\n\t\t/**\n\t\t * Fires once an existing post has been updated.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param int     $post_ID      Post ID.\n\t\t * @param WP_Post $post_after   Post object following the update.\n\t\t * @param WP_Post $post_before  Post object before the update.\n\t\t */\n\t\tdo_action( 'post_updated', $post_ID, $post_after, $post_before);\n\t}\n\n\t/**\n\t * Fires once a post has been saved.\n\t *\n\t * The dynamic portion of the hook name, `$post->post_type`, refers to\n\t * the post type slug.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param int     $post_ID Post ID.\n\t * @param WP_Post $post    Post object.\n\t * @param bool    $update  Whether this is an existing post being updated or not.\n\t */\n\tdo_action( \"save_post_{$post->post_type}\", $post_ID, $post, $update );\n\n\t/**\n\t * Fires once a post has been saved.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param int     $post_ID Post ID.\n\t * @param WP_Post $post    Post object.\n\t * @param bool    $update  Whether this is an existing post being updated or not.\n\t */\n\tdo_action( 'save_post', $post_ID, $post, $update );\n\n\t/**\n\t * Fires once a post has been saved.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param int     $post_ID Post ID.\n\t * @param WP_Post $post    Post object.\n\t * @param bool    $update  Whether this is an existing post being updated or not.\n\t */\n\tdo_action( 'wp_insert_post', $post_ID, $post, $update );\n\n\treturn $post_ID;\n}\n\n/**\n * Update a post with new post data.\n *\n * The date does not have to be set for drafts. You can set the date and it will\n * not be overridden.\n *\n * @since 1.0.0\n *\n * @param array|object $postarr  Optional. Post data. Arrays are expected to be escaped,\n *                               objects are not. Default array.\n * @param bool         $wp_error Optional. Allow return of WP_Error on failure. Default false.\n * @return int|WP_Error The value 0 or WP_Error on failure. The post ID on success.\n */\nfunction wp_update_post( $postarr = array(), $wp_error = false ) {\n\tif ( is_object($postarr) ) {\n\t\t// Non-escaped post was passed.\n\t\t$postarr = get_object_vars($postarr);\n\t\t$postarr = wp_slash($postarr);\n\t}\n\n\t// First, get all of the original fields.\n\t$post = get_post($postarr['ID'], ARRAY_A);\n\n\tif ( is_null( $post ) ) {\n\t\tif ( $wp_error )\n\t\t\treturn new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) );\n\t\treturn 0;\n\t}\n\n\t// Escape data pulled from DB.\n\t$post = wp_slash($post);\n\n\t// Passed post category list overwrites existing category list if not empty.\n\tif ( isset($postarr['post_category']) && is_array($postarr['post_category'])\n\t\t\t && 0 != count($postarr['post_category']) )\n\t\t$post_cats = $postarr['post_category'];\n\telse\n\t\t$post_cats = $post['post_category'];\n\n\t// Drafts shouldn't be assigned a date unless explicitly done so by the user.\n\tif ( isset( $post['post_status'] ) && in_array($post['post_status'], array('draft', 'pending', 'auto-draft')) && empty($postarr['edit_date']) &&\n\t\t\t ('0000-00-00 00:00:00' == $post['post_date_gmt']) )\n\t\t$clear_date = true;\n\telse\n\t\t$clear_date = false;\n\n\t// Merge old and new fields with new fields overwriting old ones.\n\t$postarr = array_merge($post, $postarr);\n\t$postarr['post_category'] = $post_cats;\n\tif ( $clear_date ) {\n\t\t$postarr['post_date'] = current_time('mysql');\n\t\t$postarr['post_date_gmt'] = '';\n\t}\n\n\tif ($postarr['post_type'] == 'attachment')\n\t\treturn wp_insert_attachment($postarr);\n\n\treturn wp_insert_post( $postarr, $wp_error );\n}\n\n/**\n * Publish a post by transitioning the post status.\n *\n * @since 2.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|WP_Post $post Post ID or post object.\n */\nfunction wp_publish_post( $post ) {\n\tglobal $wpdb;\n\n\tif ( ! $post = get_post( $post ) )\n\t\treturn;\n\n\tif ( 'publish' == $post->post_status )\n\t\treturn;\n\n\t$wpdb->update( $wpdb->posts, array( 'post_status' => 'publish' ), array( 'ID' => $post->ID ) );\n\n\tclean_post_cache( $post->ID );\n\n\t$old_status = $post->post_status;\n\t$post->post_status = 'publish';\n\twp_transition_post_status( 'publish', $old_status, $post );\n\n\t/** This action is documented in wp-includes/post.php */\n\tdo_action( 'edit_post', $post->ID, $post );\n\n\t/** This action is documented in wp-includes/post.php */\n\tdo_action( \"save_post_{$post->post_type}\", $post->ID, $post, true );\n\n\t/** This action is documented in wp-includes/post.php */\n\tdo_action( 'save_post', $post->ID, $post, true );\n\n\t/** This action is documented in wp-includes/post.php */\n\tdo_action( 'wp_insert_post', $post->ID, $post, true );\n}\n\n/**\n * Publish future post and make sure post ID has future post status.\n *\n * Invoked by cron 'publish_future_post' event. This safeguard prevents cron\n * from publishing drafts, etc.\n *\n * @since 2.5.0\n *\n * @param int|WP_Post $post_id Post ID or post object.\n */\nfunction check_and_publish_future_post( $post_id ) {\n\t$post = get_post($post_id);\n\n\tif ( empty($post) )\n\t\treturn;\n\n\tif ( 'future' != $post->post_status )\n\t\treturn;\n\n\t$time = strtotime( $post->post_date_gmt . ' GMT' );\n\n\t// Uh oh, someone jumped the gun!\n\tif ( $time > time() ) {\n\t\twp_clear_scheduled_hook( 'publish_future_post', array( $post_id ) ); // clear anything else in the system\n\t\twp_schedule_single_event( $time, 'publish_future_post', array( $post_id ) );\n\t\treturn;\n\t}\n\n\t// wp_publish_post(_ returns no meaningful value.\n\twp_publish_post( $post_id );\n}\n\n/**\n * Computes a unique slug for the post, when given the desired slug and some post details.\n *\n * @since 2.8.0\n *\n * @global wpdb       $wpdb WordPress database abstraction object.\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $slug        The desired slug (post_name).\n * @param int    $post_ID     Post ID.\n * @param string $post_status No uniqueness checks are made if the post is still draft or pending.\n * @param string $post_type   Post type.\n * @param int    $post_parent Post parent ID.\n * @return string Unique slug for the post, based on $post_name (with a -1, -2, etc. suffix)\n */\nfunction wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {\n\tif ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) || ( 'inherit' == $post_status && 'revision' == $post_type ) )\n\t\treturn $slug;\n\n\tglobal $wpdb, $wp_rewrite;\n\n\t$original_slug = $slug;\n\n\t$feeds = $wp_rewrite->feeds;\n\tif ( ! is_array( $feeds ) )\n\t\t$feeds = array();\n\n\tif ( 'attachment' == $post_type ) {\n\t\t// Attachment slugs must be unique across all types.\n\t\t$check_sql = \"SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND ID != %d LIMIT 1\";\n\t\t$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_ID ) );\n\n\t\t/**\n\t\t * Filter whether the post slug would make a bad attachment slug.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param bool   $bad_slug Whether the slug would be bad as an attachment slug.\n\t\t * @param string $slug     The post slug.\n\t\t */\n\t\tif ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_attachment_slug', false, $slug ) ) {\n\t\t\t$suffix = 2;\n\t\t\tdo {\n\t\t\t\t$alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . \"-$suffix\";\n\t\t\t\t$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_ID ) );\n\t\t\t\t$suffix++;\n\t\t\t} while ( $post_name_check );\n\t\t\t$slug = $alt_post_name;\n\t\t}\n\t} elseif ( is_post_type_hierarchical( $post_type ) ) {\n\t\tif ( 'nav_menu_item' == $post_type )\n\t\t\treturn $slug;\n\n\t\t/*\n\t\t * Page slugs must be unique within their own trees. Pages are in a separate\n\t\t * namespace than posts so page slugs are allowed to overlap post slugs.\n\t\t */\n\t\t$check_sql = \"SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( %s, 'attachment' ) AND ID != %d AND post_parent = %d LIMIT 1\";\n\t\t$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID, $post_parent ) );\n\n\t\t/**\n\t\t * Filter whether the post slug would make a bad hierarchical post slug.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param bool   $bad_slug    Whether the post slug would be bad in a hierarchical post context.\n\t\t * @param string $slug        The post slug.\n\t\t * @param string $post_type   Post type.\n\t\t * @param int    $post_parent Post parent ID.\n\t\t */\n\t\tif ( $post_name_check || in_array( $slug, $feeds ) || preg_match( \"@^($wp_rewrite->pagination_base)?\\d+$@\", $slug )  || apply_filters( 'wp_unique_post_slug_is_bad_hierarchical_slug', false, $slug, $post_type, $post_parent ) ) {\n\t\t\t$suffix = 2;\n\t\t\tdo {\n\t\t\t\t$alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . \"-$suffix\";\n\t\t\t\t$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID, $post_parent ) );\n\t\t\t\t$suffix++;\n\t\t\t} while ( $post_name_check );\n\t\t\t$slug = $alt_post_name;\n\t\t}\n\t} else {\n\t\t// Post slugs must be unique across all posts.\n\t\t$check_sql = \"SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type = %s AND ID != %d LIMIT 1\";\n\t\t$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $slug, $post_type, $post_ID ) );\n\n\t\t// Prevent new post slugs that could result in URLs that conflict with date archives.\n\t\t$post = get_post( $post_ID );\n\t\t$conflicts_with_date_archive = false;\n\t\tif ( 'post' === $post_type && ( ! $post || $post->post_name !== $slug ) && preg_match( '/^[0-9]+$/', $slug ) && $slug_num = intval( $slug ) ) {\n\t\t\t$permastructs   = array_values( array_filter( explode( '/', get_option( 'permalink_structure' ) ) ) );\n\t\t\t$postname_index = array_search( '%postname%', $permastructs );\n\n\t\t\t/*\n\t\t\t * Potential date clashes are as follows:\n\t\t\t *\n\t\t\t * - Any integer in the first permastruct position could be a year.\n\t\t\t * - An integer between 1 and 12 that follows 'year' conflicts with 'monthnum'.\n\t\t\t * - An integer between 1 and 31 that follows 'monthnum' conflicts with 'day'.\n\t\t\t */\n\t\t\tif ( 0 === $postname_index ||\n\t\t\t\t( $postname_index && '%year%' === $permastructs[ $postname_index - 1 ] && 13 > $slug_num ) ||\n\t\t\t\t( $postname_index && '%monthnum%' === $permastructs[ $postname_index - 1 ] && 32 > $slug_num )\n\t\t\t) {\n\t\t\t\t$conflicts_with_date_archive = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter whether the post slug would be bad as a flat slug.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param bool   $bad_slug  Whether the post slug would be bad as a flat slug.\n\t\t * @param string $slug      The post slug.\n\t\t * @param string $post_type Post type.\n\t\t */\n\t\tif ( $post_name_check || in_array( $slug, $feeds ) || $conflicts_with_date_archive || apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ) ) {\n\t\t\t$suffix = 2;\n\t\t\tdo {\n\t\t\t\t$alt_post_name = _truncate_post_slug( $slug, 200 - ( strlen( $suffix ) + 1 ) ) . \"-$suffix\";\n\t\t\t\t$post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, $alt_post_name, $post_type, $post_ID ) );\n\t\t\t\t$suffix++;\n\t\t\t} while ( $post_name_check );\n\t\t\t$slug = $alt_post_name;\n\t\t}\n\t}\n\n\t/**\n\t * Filter the unique post slug.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string $slug          The post slug.\n\t * @param int    $post_ID       Post ID.\n\t * @param string $post_status   The post status.\n\t * @param string $post_type     Post type.\n\t * @param int    $post_parent   Post parent ID\n\t * @param string $original_slug The original post slug.\n\t */\n\treturn apply_filters( 'wp_unique_post_slug', $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug );\n}\n\n/**\n * Truncate a post slug.\n *\n * @since 3.6.0\n * @access private\n *\n * @see utf8_uri_encode()\n *\n * @param string $slug   The slug to truncate.\n * @param int    $length Optional. Max length of the slug. Default 200 (characters).\n * @return string The truncated slug.\n */\nfunction _truncate_post_slug( $slug, $length = 200 ) {\n\tif ( strlen( $slug ) > $length ) {\n\t\t$decoded_slug = urldecode( $slug );\n\t\tif ( $decoded_slug === $slug )\n\t\t\t$slug = substr( $slug, 0, $length );\n\t\telse\n\t\t\t$slug = utf8_uri_encode( $decoded_slug, $length );\n\t}\n\n\treturn rtrim( $slug, '-' );\n}\n\n/**\n * Add tags to a post.\n *\n * @see wp_set_post_tags()\n *\n * @since 2.3.0\n *\n * @param int          $post_id Optional. The Post ID. Does not default to the ID of the global $post.\n * @param string|array $tags    Optional. An array of tags to set for the post, or a string of tags\n *                              separated by commas. Default empty.\n * @return array|false|WP_Error Array of affected term IDs. WP_Error or false on failure.\n */\nfunction wp_add_post_tags( $post_id = 0, $tags = '' ) {\n\treturn wp_set_post_tags($post_id, $tags, true);\n}\n\n/**\n * Set the tags for a post.\n *\n * @since 2.3.0\n *\n * @see wp_set_object_terms()\n *\n * @param int          $post_id Optional. The Post ID. Does not default to the ID of the global $post.\n * @param string|array $tags    Optional. An array of tags to set for the post, or a string of tags\n *                              separated by commas. Default empty.\n * @param bool         $append  Optional. If true, don't delete existing tags, just add on. If false,\n *                              replace the tags with the new tags. Default false.\n * @return array|false|WP_Error Array of affected term IDs. WP_Error or false on failure.\n */\nfunction wp_set_post_tags( $post_id = 0, $tags = '', $append = false ) {\n\treturn wp_set_post_terms( $post_id, $tags, 'post_tag', $append);\n}\n\n/**\n * Set the terms for a post.\n *\n * @since 2.8.0\n *\n * @see wp_set_object_terms()\n *\n * @param int          $post_id  Optional. The Post ID. Does not default to the ID of the global $post.\n * @param string|array $tags     Optional. An array of terms to set for the post, or a string of terms\n *                               separated by commas. Default empty.\n * @param string       $taxonomy Optional. Taxonomy name. Default 'post_tag'.\n * @param bool         $append   Optional. If true, don't delete existing terms, just add on. If false,\n *                               replace the terms with the new terms. Default false.\n * @return array|false|WP_Error Array of affected term IDs. WP_Error or false on failure.\n */\nfunction wp_set_post_terms( $post_id = 0, $tags = '', $taxonomy = 'post_tag', $append = false ) {\n\t$post_id = (int) $post_id;\n\n\tif ( !$post_id )\n\t\treturn false;\n\n\tif ( empty($tags) )\n\t\t$tags = array();\n\n\tif ( ! is_array( $tags ) ) {\n\t\t$comma = _x( ',', 'tag delimiter' );\n\t\tif ( ',' !== $comma )\n\t\t\t$tags = str_replace( $comma, ',', $tags );\n\t\t$tags = explode( ',', trim( $tags, \" \\n\\t\\r\\0\\x0B,\" ) );\n\t}\n\n\t/*\n\t * Hierarchical taxonomies must always pass IDs rather than names so that\n\t * children with the same names but different parents aren't confused.\n\t */\n\tif ( is_taxonomy_hierarchical( $taxonomy ) ) {\n\t\t$tags = array_unique( array_map( 'intval', $tags ) );\n\t}\n\n\treturn wp_set_object_terms( $post_id, $tags, $taxonomy, $append );\n}\n\n/**\n * Set categories for a post.\n *\n * If the post categories parameter is not set, then the default category is\n * going used.\n *\n * @since 2.1.0\n *\n * @param int       $post_ID         Optional. The Post ID. Does not default to the ID\n *                                   of the global $post. Default 0.\n * @param array|int $post_categories Optional. List of categories or ID of category.\n *                                   Default empty array.\n * @param bool      $append         If true, don't delete existing categories, just add on.\n *                                  If false, replace the categories with the new categories.\n * @return array|bool|WP_Error\n */\nfunction wp_set_post_categories( $post_ID = 0, $post_categories = array(), $append = false ) {\n\t$post_ID = (int) $post_ID;\n\t$post_type = get_post_type( $post_ID );\n\t$post_status = get_post_status( $post_ID );\n\t// If $post_categories isn't already an array, make it one:\n\t$post_categories = (array) $post_categories;\n\tif ( empty( $post_categories ) ) {\n\t\tif ( 'post' == $post_type && 'auto-draft' != $post_status ) {\n\t\t\t$post_categories = array( get_option('default_category') );\n\t\t\t$append = false;\n\t\t} else {\n\t\t\t$post_categories = array();\n\t\t}\n\t} elseif ( 1 == count( $post_categories ) && '' == reset( $post_categories ) ) {\n\t\treturn true;\n\t}\n\n\treturn wp_set_post_terms( $post_ID, $post_categories, 'category', $append );\n}\n\n/**\n * Fires actions related to the transitioning of a post's status.\n *\n * When a post is saved, the post status is \"transitioned\" from one status to another,\n * though this does not always mean the status has actually changed before and after\n * the save. This function fires a number of action hooks related to that transition:\n * the generic 'transition_post_status' action, as well as the dynamic hooks\n * `\"{$old_status}_to_{$new_status}\"` and `\"{$new_status}_{$post->post_type}\"`. Note\n * that the function does not transition the post object in the database.\n *\n * For instance: When publishing a post for the first time, the post status may transition\n * from 'draft' – or some other status – to 'publish'. However, if a post is already\n * published and is simply being updated, the \"old\" and \"new\" statuses may both be 'publish'\n * before and after the transition.\n *\n * @since 2.3.0\n *\n * @param string  $new_status Transition to this post status.\n * @param string  $old_status Previous post status.\n * @param WP_Post $post Post data.\n */\nfunction wp_transition_post_status( $new_status, $old_status, $post ) {\n\t/**\n\t * Fires when a post is transitioned from one status to another.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string  $new_status New post status.\n\t * @param string  $old_status Old post status.\n\t * @param WP_Post $post       Post object.\n\t */\n\tdo_action( 'transition_post_status', $new_status, $old_status, $post );\n\n\t/**\n\t * Fires when a post is transitioned from one status to another.\n\t *\n\t * The dynamic portions of the hook name, `$new_status` and `$old status`,\n\t * refer to the old and new post statuses, respectively.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param WP_Post $post Post object.\n\t */\n\tdo_action( \"{$old_status}_to_{$new_status}\", $post );\n\n\t/**\n\t * Fires when a post is transitioned from one status to another.\n\t *\n\t * The dynamic portions of the hook name, `$new_status` and `$post->post_type`,\n\t * refer to the new post status and post type, respectively.\n\t *\n\t * Please note: When this action is hooked using a particular post status (like\n\t * 'publish', as `publish_{$post->post_type}`), it will fire both when a post is\n\t * first transitioned to that status from something else, as well as upon\n\t * subsequent post updates (old and new status are both the same).\n\t *\n\t * Therefore, if you are looking to only fire a callback when a post is first\n\t * transitioned to a status, use the {@see 'transition_post_status'} hook instead.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int     $post_id Post ID.\n\t * @param WP_Post $post    Post object.\n\t */\n\tdo_action( \"{$new_status}_{$post->post_type}\", $post->ID, $post );\n}\n\n//\n// Comment, trackback, and pingback functions.\n//\n\n/**\n * Add a URL to those already pinged.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $post_id Post ID.\n * @param string $uri     Ping URI.\n * @return int|false How many rows were updated.\n */\nfunction add_ping( $post_id, $uri ) {\n\tglobal $wpdb;\n\t$pung = $wpdb->get_var( $wpdb->prepare( \"SELECT pinged FROM $wpdb->posts WHERE ID = %d\", $post_id ));\n\t$pung = trim($pung);\n\t$pung = preg_split('/\\s/', $pung);\n\t$pung[] = $uri;\n\t$new = implode(\"\\n\", $pung);\n\n\t/**\n\t * Filter the new ping URL to add for the given post.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param string $new New ping URL to add.\n\t */\n\t$new = apply_filters( 'add_ping', $new );\n\n\t// expected_slashed ($new).\n\t$new = wp_unslash($new);\n\treturn $wpdb->update( $wpdb->posts, array( 'pinged' => $new ), array( 'ID' => $post_id ) );\n}\n\n/**\n * Retrieve enclosures already enclosed for a post.\n *\n * @since 1.5.0\n *\n * @param int $post_id Post ID.\n * @return array List of enclosures.\n */\nfunction get_enclosed( $post_id ) {\n\t$custom_fields = get_post_custom( $post_id );\n\t$pung = array();\n\tif ( !is_array( $custom_fields ) )\n\t\treturn $pung;\n\n\tforeach ( $custom_fields as $key => $val ) {\n\t\tif ( 'enclosure' != $key || !is_array( $val ) )\n\t\t\tcontinue;\n\t\tforeach ( $val as $enc ) {\n\t\t\t$enclosure = explode( \"\\n\", $enc );\n\t\t\t$pung[] = trim( $enclosure[ 0 ] );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the list of enclosures already enclosed for the given post.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param array $pung    Array of enclosures for the given post.\n\t * @param int   $post_id Post ID.\n\t */\n\treturn apply_filters( 'get_enclosed', $pung, $post_id );\n}\n\n/**\n * Retrieve URLs already pinged for a post.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $post_id Post ID.\n * @return array\n */\nfunction get_pung( $post_id ) {\n\tglobal $wpdb;\n\t$pung = $wpdb->get_var( $wpdb->prepare( \"SELECT pinged FROM $wpdb->posts WHERE ID = %d\", $post_id ));\n\t$pung = trim($pung);\n\t$pung = preg_split('/\\s/', $pung);\n\n\t/**\n\t * Filter the list of already-pinged URLs for the given post.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param array $pung Array of URLs already pinged for the given post.\n\t */\n\treturn apply_filters( 'get_pung', $pung );\n}\n\n/**\n * Retrieve URLs that need to be pinged.\n *\n * @since 1.5.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int $post_id Post ID\n * @return array\n */\nfunction get_to_ping( $post_id ) {\n\tglobal $wpdb;\n\t$to_ping = $wpdb->get_var( $wpdb->prepare( \"SELECT to_ping FROM $wpdb->posts WHERE ID = %d\", $post_id ));\n\t$to_ping = sanitize_trackback_urls( $to_ping );\n\t$to_ping = preg_split('/\\s/', $to_ping, -1, PREG_SPLIT_NO_EMPTY);\n\n\t/**\n\t * Filter the list of URLs yet to ping for the given post.\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param array $to_ping List of URLs yet to ping.\n\t */\n\treturn apply_filters( 'get_to_ping', $to_ping );\n}\n\n/**\n * Do trackbacks for a list of URLs.\n *\n * @since 1.0.0\n *\n * @param string $tb_list Comma separated list of URLs.\n * @param int    $post_id Post ID.\n */\nfunction trackback_url_list( $tb_list, $post_id ) {\n\tif ( ! empty( $tb_list ) ) {\n\t\t// Get post data.\n\t\t$postdata = get_post( $post_id, ARRAY_A );\n\n\t\t// Form an excerpt.\n\t\t$excerpt = strip_tags( $postdata['post_excerpt'] ? $postdata['post_excerpt'] : $postdata['post_content'] );\n\n\t\tif ( strlen( $excerpt ) > 255 ) {\n\t\t\t$excerpt = substr( $excerpt, 0, 252 ) . '&hellip;';\n\t\t}\n\n\t\t$trackback_urls = explode( ',', $tb_list );\n\t\tforeach ( (array) $trackback_urls as $tb_url ) {\n\t\t\t$tb_url = trim( $tb_url );\n\t\t\ttrackback( $tb_url, wp_unslash( $postdata['post_title'] ), $excerpt, $post_id );\n\t\t}\n\t}\n}\n\n//\n// Page functions\n//\n\n/**\n * Get a list of page IDs.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @return array List of page IDs.\n */\nfunction get_all_page_ids() {\n\tglobal $wpdb;\n\n\t$page_ids = wp_cache_get('all_page_ids', 'posts');\n\tif ( ! is_array( $page_ids ) ) {\n\t\t$page_ids = $wpdb->get_col(\"SELECT ID FROM $wpdb->posts WHERE post_type = 'page'\");\n\t\twp_cache_add('all_page_ids', $page_ids, 'posts');\n\t}\n\n\treturn $page_ids;\n}\n\n/**\n * Retrieves page data given a page ID or page object.\n *\n * Use get_post() instead of get_page().\n *\n * @since 1.5.1\n * @deprecated 3.5.0 Use get_post()\n *\n * @param mixed  $page   Page object or page ID. Passed by reference.\n * @param string $output Optional. What to output. Accepts OBJECT, ARRAY_A, or ARRAY_N.\n *                       Default OBJECT.\n * @param string $filter Optional. How the return value should be filtered. Accepts 'raw',\n *                       'edit', 'db', 'display'. Default 'raw'.\n * @return WP_Post|array|null WP_Post on success or null on failure.\n */\nfunction get_page( $page, $output = OBJECT, $filter = 'raw') {\n\treturn get_post( $page, $output, $filter );\n}\n\n/**\n * Retrieves a page given its path.\n *\n * @since 2.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string       $page_path Page path.\n * @param string       $output    Optional. Output type. Accepts OBJECT, ARRAY_N, or ARRAY_A.\n *                                Default OBJECT.\n * @param string|array $post_type Optional. Post type or array of post types. Default 'page'.\n * @return WP_Post|array|void WP_Post on success.\n */\nfunction get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) {\n\tglobal $wpdb;\n\n\t$page_path = rawurlencode(urldecode($page_path));\n\t$page_path = str_replace('%2F', '/', $page_path);\n\t$page_path = str_replace('%20', ' ', $page_path);\n\t$parts = explode( '/', trim( $page_path, '/' ) );\n\t$parts = esc_sql( $parts );\n\t$parts = array_map( 'sanitize_title_for_query', $parts );\n\n\t$in_string = \"'\" . implode( \"','\", $parts ) . \"'\";\n\n\tif ( is_array( $post_type ) ) {\n\t\t$post_types = $post_type;\n\t} else {\n\t\t$post_types = array( $post_type, 'attachment' );\n\t}\n\n\t$post_types = esc_sql( $post_types );\n\t$post_type_in_string = \"'\" . implode( \"','\", $post_types ) . \"'\";\n\t$sql = \"\n\t\tSELECT ID, post_name, post_parent, post_type\n\t\tFROM $wpdb->posts\n\t\tWHERE post_name IN ($in_string)\n\t\tAND post_type IN ($post_type_in_string)\n\t\";\n\n\t$pages = $wpdb->get_results( $sql, OBJECT_K );\n\n\t$revparts = array_reverse( $parts );\n\n\t$foundid = 0;\n\tforeach ( (array) $pages as $page ) {\n\t\tif ( $page->post_name == $revparts[0] ) {\n\t\t\t$count = 0;\n\t\t\t$p = $page;\n\t\t\twhile ( $p->post_parent != 0 && isset( $pages[ $p->post_parent ] ) ) {\n\t\t\t\t$count++;\n\t\t\t\t$parent = $pages[ $p->post_parent ];\n\t\t\t\tif ( ! isset( $revparts[ $count ] ) || $parent->post_name != $revparts[ $count ] )\n\t\t\t\t\tbreak;\n\t\t\t\t$p = $parent;\n\t\t\t}\n\n\t\t\tif ( $p->post_parent == 0 && $count+1 == count( $revparts ) && $p->post_name == $revparts[ $count ] ) {\n\t\t\t\t$foundid = $page->ID;\n\t\t\t\tif ( $page->post_type == $post_type )\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( $foundid ) {\n\t\treturn get_post( $foundid, $output );\n\t}\n}\n\n/**\n * Retrieve a page given its title.\n *\n * @since 2.1.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string       $page_title Page title\n * @param string       $output     Optional. Output type. OBJECT, ARRAY_N, or ARRAY_A.\n *                                 Default OBJECT.\n * @param string|array $post_type  Optional. Post type or array of post types. Default 'page'.\n * @return WP_Post|array|void WP_Post on success or null on failure\n */\nfunction get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' ) {\n\tglobal $wpdb;\n\n\tif ( is_array( $post_type ) ) {\n\t\t$post_type = esc_sql( $post_type );\n\t\t$post_type_in_string = \"'\" . implode( \"','\", $post_type ) . \"'\";\n\t\t$sql = $wpdb->prepare( \"\n\t\t\tSELECT ID\n\t\t\tFROM $wpdb->posts\n\t\t\tWHERE post_title = %s\n\t\t\tAND post_type IN ($post_type_in_string)\n\t\t\", $page_title );\n\t} else {\n\t\t$sql = $wpdb->prepare( \"\n\t\t\tSELECT ID\n\t\t\tFROM $wpdb->posts\n\t\t\tWHERE post_title = %s\n\t\t\tAND post_type = %s\n\t\t\", $page_title, $post_type );\n\t}\n\n\t$page = $wpdb->get_var( $sql );\n\n\tif ( $page ) {\n\t\treturn get_post( $page, $output );\n\t}\n}\n\n/**\n * Identify descendants of a given page ID in a list of page objects.\n *\n * Descendants are identified from the `$pages` array passed to the function. No database queries are performed.\n *\n * @since 1.5.1\n *\n * @param int   $page_id Page ID.\n * @param array $pages   List of page objects from which descendants should be identified.\n * @return array List of page children.\n */\nfunction get_page_children( $page_id, $pages ) {\n\t// Build a hash of ID -> children.\n\t$children = array();\n\tforeach ( (array) $pages as $page ) {\n\t\t$children[ intval( $page->post_parent ) ][] = $page;\n\t}\n\n\t$page_list = array();\n\n\t// Start the search by looking at immediate children.\n\tif ( isset( $children[ $page_id ] ) ) {\n\t\t// Always start at the end of the stack in order to preserve original `$pages` order.\n\t\t$to_look = array_reverse( $children[ $page_id ] );\n\n\t\twhile ( $to_look ) {\n\t\t\t$p = array_pop( $to_look );\n\t\t\t$page_list[] = $p;\n\t\t\tif ( isset( $children[ $p->ID ] ) ) {\n\t\t\t\tforeach ( array_reverse( $children[ $p->ID ] ) as $child ) {\n\t\t\t\t\t// Append to the `$to_look` stack to descend the tree.\n\t\t\t\t\t$to_look[] = $child;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn $page_list;\n}\n\n/**\n * Order the pages with children under parents in a flat list.\n *\n * It uses auxiliary structure to hold parent-children relationships and\n * runs in O(N) complexity\n *\n * @since 2.0.0\n *\n * @param array $pages   Posts array, passed by reference.\n * @param int   $page_id Optional. Parent page ID. Default 0.\n * @return array A list arranged by hierarchy. Children immediately follow their parents.\n */\nfunction get_page_hierarchy( &$pages, $page_id = 0 ) {\n\tif ( empty( $pages ) ) {\n\t\treturn array();\n\t}\n\n\t$children = array();\n\tforeach ( (array) $pages as $p ) {\n\t\t$parent_id = intval( $p->post_parent );\n\t\t$children[ $parent_id ][] = $p;\n\t}\n\n\t$result = array();\n\t_page_traverse_name( $page_id, $children, $result );\n\n\treturn $result;\n}\n\n/**\n * Traverse and return all the nested children post names of a root page.\n *\n * $children contains parent-children relations\n *\n * @since 2.9.0\n *\n * @see _page_traverse_name()\n *\n * @param int   $page_id   Page ID.\n * @param array &$children Parent-children relations, passed by reference.\n * @param array &$result   Result, passed by reference.\n */\nfunction _page_traverse_name( $page_id, &$children, &$result ){\n\tif ( isset( $children[ $page_id ] ) ){\n\t\tforeach ( (array)$children[ $page_id ] as $child ) {\n\t\t\t$result[ $child->ID ] = $child->post_name;\n\t\t\t_page_traverse_name( $child->ID, $children, $result );\n\t\t}\n\t}\n}\n\n/**\n * Build URI for a page.\n *\n * Sub pages will be in the \"directory\" under the parent page post name.\n *\n * @since 1.5.0\n *\n * @param WP_Post|object|int $page Page object or page ID.\n * @return string|false Page URI, false on error.\n */\nfunction get_page_uri( $page ) {\n\t$page = get_post( $page );\n\n\tif ( ! $page )\n\t\treturn false;\n\n\t$uri = $page->post_name;\n\n\tforeach ( $page->ancestors as $parent ) {\n\t\t$parent = get_post( $parent );\n\t\tif ( $parent ) {\n\t\t\t$uri = $parent->post_name . '/' . $uri;\n\t\t}\n\t}\n\n\t/**\n\t * Filter the URI for a page.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string  $uri  Page URI.\n\t * @param WP_Post $page Page object.\n\t */\n\treturn apply_filters( 'get_page_uri', $uri, $page );\n}\n\n/**\n * Retrieve a list of pages.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @since 1.5.0\n *\n * @param array|string $args {\n *     Optional. Array or string of arguments to retrieve pages.\n *\n *     @type int          $child_of     Page ID to return child and grandchild pages of. Note: The value\n *                                      of `$hierarchical` has no bearing on whether `$child_of` returns\n *                                      hierarchical results. Default 0, or no restriction.\n *     @type string       $sort_order   How to sort retrieved pages. Accepts 'ASC', 'DESC'. Default 'ASC'.\n *     @type string       $sort_column  What columns to sort pages by, comma-separated. Accepts 'post_author',\n *                                      'post_date', 'post_title', 'post_name', 'post_modified', 'menu_order',\n *                                      'post_modified_gmt', 'post_parent', 'ID', 'rand', 'comment_count'.\n *                                      'post_' can be omitted for any values that start with it.\n *                                      Default 'post_title'.\n *     @type bool         $hierarchical Whether to return pages hierarchically. If false in conjunction with\n *                                      `$child_of` also being false, both arguments will be disregarded.\n *                                      Default true.\n *     @type array        $exclude      Array of page IDs to exclude. Default empty array.\n *     @type array        $include      Array of page IDs to include. Cannot be used with `$child_of`,\n *                                      `$parent`, `$exclude`, `$meta_key`, `$meta_value`, or `$hierarchical`.\n *                                      Default empty array.\n *     @type string       $meta_key     Only include pages with this meta key. Default empty.\n *     @type string       $meta_value   Only include pages with this meta value. Requires `$meta_key`.\n *                                      Default empty.\n *     @type string       $authors      A comma-separated list of author IDs. Default empty.\n *     @type int          $parent       Page ID to return direct children of. Default -1, or no restriction.\n *     @type string|array $exclude_tree Comma-separated string or array of page IDs to exclude.\n *                                      Default empty array.\n *     @type int          $number       The number of pages to return. Default 0, or all pages.\n *     @type int          $offset       The number of pages to skip before returning. Requires `$number`.\n *                                      Default 0.\n *     @type string       $post_type    The post type to query. Default 'page'.\n *     @type string       $post_status  A comma-separated list of post status types to include.\n *                                      Default 'publish'.\n * }\n * @return array|false List of pages matching defaults or `$args`.\n */\nfunction get_pages( $args = array() ) {\n\tglobal $wpdb;\n\n\t$defaults = array(\n\t\t'child_of' => 0, 'sort_order' => 'ASC',\n\t\t'sort_column' => 'post_title', 'hierarchical' => 1,\n\t\t'exclude' => array(), 'include' => array(),\n\t\t'meta_key' => '', 'meta_value' => '',\n\t\t'authors' => '', 'parent' => -1, 'exclude_tree' => array(),\n\t\t'number' => '', 'offset' => 0,\n\t\t'post_type' => 'page', 'post_status' => 'publish',\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\t$number = (int) $r['number'];\n\t$offset = (int) $r['offset'];\n\t$child_of = (int) $r['child_of'];\n\t$hierarchical = $r['hierarchical'];\n\t$exclude = $r['exclude'];\n\t$meta_key = $r['meta_key'];\n\t$meta_value = $r['meta_value'];\n\t$parent = $r['parent'];\n\t$post_status = $r['post_status'];\n\n\t// Make sure the post type is hierarchical.\n\t$hierarchical_post_types = get_post_types( array( 'hierarchical' => true ) );\n\tif ( ! in_array( $r['post_type'], $hierarchical_post_types ) ) {\n\t\treturn false;\n\t}\n\n\tif ( $parent > 0 && ! $child_of ) {\n\t\t$hierarchical = false;\n\t}\n\n\t// Make sure we have a valid post status.\n\tif ( ! is_array( $post_status ) ) {\n\t\t$post_status = explode( ',', $post_status );\n\t}\n\tif ( array_diff( $post_status, get_post_stati() ) ) {\n\t\treturn false;\n\t}\n\n\t// $args can be whatever, only use the args defined in defaults to compute the key.\n\t$key = md5( serialize( wp_array_slice_assoc( $r, array_keys( $defaults ) ) ) );\n\t$last_changed = wp_cache_get( 'last_changed', 'posts' );\n\tif ( ! $last_changed ) {\n\t\t$last_changed = microtime();\n\t\twp_cache_set( 'last_changed', $last_changed, 'posts' );\n\t}\n\n\t$cache_key = \"get_pages:$key:$last_changed\";\n\tif ( $cache = wp_cache_get( $cache_key, 'posts' ) ) {\n\t\t// Convert to WP_Post instances.\n\t\t$pages = array_map( 'get_post', $cache );\n\t\t/** This filter is documented in wp-includes/post.php */\n\t\t$pages = apply_filters( 'get_pages', $pages, $r );\n\t\treturn $pages;\n\t}\n\n\t$inclusions = '';\n\tif ( ! empty( $r['include'] ) ) {\n\t\t$child_of = 0; //ignore child_of, parent, exclude, meta_key, and meta_value params if using include\n\t\t$parent = -1;\n\t\t$exclude = '';\n\t\t$meta_key = '';\n\t\t$meta_value = '';\n\t\t$hierarchical = false;\n\t\t$incpages = wp_parse_id_list( $r['include'] );\n\t\tif ( ! empty( $incpages ) ) {\n\t\t\t$inclusions = ' AND ID IN (' . implode( ',', $incpages ) .  ')';\n\t\t}\n\t}\n\n\t$exclusions = '';\n\tif ( ! empty( $exclude ) ) {\n\t\t$expages = wp_parse_id_list( $exclude );\n\t\tif ( ! empty( $expages ) ) {\n\t\t\t$exclusions = ' AND ID NOT IN (' . implode( ',', $expages ) .  ')';\n\t\t}\n\t}\n\n\t$author_query = '';\n\tif ( ! empty( $r['authors'] ) ) {\n\t\t$post_authors = preg_split( '/[\\s,]+/', $r['authors'] );\n\n\t\tif ( ! empty( $post_authors ) ) {\n\t\t\tforeach ( $post_authors as $post_author ) {\n\t\t\t\t//Do we have an author id or an author login?\n\t\t\t\tif ( 0 == intval($post_author) ) {\n\t\t\t\t\t$post_author = get_user_by('login', $post_author);\n\t\t\t\t\tif ( empty( $post_author ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif ( empty( $post_author->ID ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t$post_author = $post_author->ID;\n\t\t\t\t}\n\n\t\t\t\tif ( '' == $author_query ) {\n\t\t\t\t\t$author_query = $wpdb->prepare(' post_author = %d ', $post_author);\n\t\t\t\t} else {\n\t\t\t\t\t$author_query .= $wpdb->prepare(' OR post_author = %d ', $post_author);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( '' != $author_query ) {\n\t\t\t\t$author_query = \" AND ($author_query)\";\n\t\t\t}\n\t\t}\n\t}\n\n\t$join = '';\n\t$where = \"$exclusions $inclusions \";\n\tif ( '' !== $meta_key || '' !== $meta_value ) {\n\t\t$join = \" LEFT JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )\";\n\n\t\t// meta_key and meta_value might be slashed\n\t\t$meta_key = wp_unslash($meta_key);\n\t\t$meta_value = wp_unslash($meta_value);\n\t\tif ( '' !== $meta_key ) {\n\t\t\t$where .= $wpdb->prepare(\" AND $wpdb->postmeta.meta_key = %s\", $meta_key);\n\t\t}\n\t\tif ( '' !== $meta_value ) {\n\t\t\t$where .= $wpdb->prepare(\" AND $wpdb->postmeta.meta_value = %s\", $meta_value);\n\t\t}\n\n\t}\n\n\tif ( is_array( $parent ) ) {\n\t\t$post_parent__in = implode( ',', array_map( 'absint', (array) $parent ) );\n\t\tif ( ! empty( $post_parent__in ) ) {\n\t\t\t$where .= \" AND post_parent IN ($post_parent__in)\";\n\t\t}\n\t} elseif ( $parent >= 0 ) {\n\t\t$where .= $wpdb->prepare(' AND post_parent = %d ', $parent);\n\t}\n\n\tif ( 1 == count( $post_status ) ) {\n\t\t$where_post_type = $wpdb->prepare( \"post_type = %s AND post_status = %s\", $r['post_type'], reset( $post_status ) );\n\t} else {\n\t\t$post_status = implode( \"', '\", $post_status );\n\t\t$where_post_type = $wpdb->prepare( \"post_type = %s AND post_status IN ('$post_status')\", $r['post_type'] );\n\t}\n\n\t$orderby_array = array();\n\t$allowed_keys = array( 'author', 'post_author', 'date', 'post_date', 'title', 'post_title', 'name', 'post_name', 'modified',\n\t\t'post_modified', 'modified_gmt', 'post_modified_gmt', 'menu_order', 'parent', 'post_parent',\n\t\t'ID', 'rand', 'comment_count' );\n\n\tforeach ( explode( ',', $r['sort_column'] ) as $orderby ) {\n\t\t$orderby = trim( $orderby );\n\t\tif ( ! in_array( $orderby, $allowed_keys ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tswitch ( $orderby ) {\n\t\t\tcase 'menu_order':\n\t\t\t\tbreak;\n\t\t\tcase 'ID':\n\t\t\t\t$orderby = \"$wpdb->posts.ID\";\n\t\t\t\tbreak;\n\t\t\tcase 'rand':\n\t\t\t\t$orderby = 'RAND()';\n\t\t\t\tbreak;\n\t\t\tcase 'comment_count':\n\t\t\t\t$orderby = \"$wpdb->posts.comment_count\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif ( 0 === strpos( $orderby, 'post_' ) ) {\n\t\t\t\t\t$orderby = \"$wpdb->posts.\" . $orderby;\n\t\t\t\t} else {\n\t\t\t\t\t$orderby = \"$wpdb->posts.post_\" . $orderby;\n\t\t\t\t}\n\t\t}\n\n\t\t$orderby_array[] = $orderby;\n\n\t}\n\t$sort_column = ! empty( $orderby_array ) ? implode( ',', $orderby_array ) : \"$wpdb->posts.post_title\";\n\n\t$sort_order = strtoupper( $r['sort_order'] );\n\tif ( '' !== $sort_order && ! in_array( $sort_order, array( 'ASC', 'DESC' ) ) ) {\n\t\t$sort_order = 'ASC';\n\t}\n\n\t$query = \"SELECT * FROM $wpdb->posts $join WHERE ($where_post_type) $where \";\n\t$query .= $author_query;\n\t$query .= \" ORDER BY \" . $sort_column . \" \" . $sort_order ;\n\n\tif ( ! empty( $number ) ) {\n\t\t$query .= ' LIMIT ' . $offset . ',' . $number;\n\t}\n\n\t$pages = $wpdb->get_results($query);\n\n\tif ( empty($pages) ) {\n\t\t/** This filter is documented in wp-includes/post.php */\n\t\t$pages = apply_filters( 'get_pages', array(), $r );\n\t\treturn $pages;\n\t}\n\n\t// Sanitize before caching so it'll only get done once.\n\t$num_pages = count($pages);\n\tfor ($i = 0; $i < $num_pages; $i++) {\n\t\t$pages[$i] = sanitize_post($pages[$i], 'raw');\n\t}\n\n\t// Update cache.\n\tupdate_post_cache( $pages );\n\n\tif ( $child_of || $hierarchical ) {\n\t\t$pages = get_page_children($child_of, $pages);\n\t}\n\n\tif ( ! empty( $r['exclude_tree'] ) ) {\n\t\t$exclude = wp_parse_id_list( $r['exclude_tree'] );\n\t\tforeach ( $exclude as $id ) {\n\t\t\t$children = get_page_children( $id, $pages );\n\t\t\tforeach ( $children as $child ) {\n\t\t\t\t$exclude[] = $child->ID;\n\t\t\t}\n\t\t}\n\n\t\t$num_pages = count( $pages );\n\t\tfor ( $i = 0; $i < $num_pages; $i++ ) {\n\t\t\tif ( in_array( $pages[$i]->ID, $exclude ) ) {\n\t\t\t\tunset( $pages[$i] );\n\t\t\t}\n\t\t}\n\t}\n\n\t$page_structure = array();\n\tforeach ( $pages as $page ) {\n\t\t$page_structure[] = $page->ID;\n\t}\n\n\twp_cache_set( $cache_key, $page_structure, 'posts' );\n\n\t// Convert to WP_Post instances\n\t$pages = array_map( 'get_post', $pages );\n\n\t/**\n\t * Filter the retrieved list of pages.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array $pages List of pages to retrieve.\n\t * @param array $r     Array of get_pages() arguments.\n\t */\n\treturn apply_filters( 'get_pages', $pages, $r );\n}\n\n//\n// Attachment functions\n//\n\n/**\n * Check if the attachment URI is local one and is really an attachment.\n *\n * @since 2.0.0\n *\n * @param string $url URL to check\n * @return bool True on success, false on failure.\n */\nfunction is_local_attachment($url) {\n\tif (strpos($url, home_url()) === false)\n\t\treturn false;\n\tif (strpos($url, home_url('/?attachment_id=')) !== false)\n\t\treturn true;\n\tif ( $id = url_to_postid($url) ) {\n\t\t$post = get_post($id);\n\t\tif ( 'attachment' == $post->post_type )\n\t\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Insert an attachment.\n *\n * If you set the 'ID' in the $args parameter, it will mean that you are\n * updating and attempt to update the attachment. You can also set the\n * attachment name or title by setting the key 'post_name' or 'post_title'.\n *\n * You can set the dates for the attachment manually by setting the 'post_date'\n * and 'post_date_gmt' keys' values.\n *\n * By default, the comments will use the default settings for whether the\n * comments are allowed. You can close them manually or keep them open by\n * setting the value for the 'comment_status' key.\n *\n * @since 2.0.0\n *\n * @see wp_insert_post()\n *\n * @param string|array $args   Arguments for inserting an attachment.\n * @param string       $file   Optional. Filename.\n * @param int          $parent Optional. Parent post ID.\n * @return int Attachment ID.\n */\nfunction wp_insert_attachment( $args, $file = false, $parent = 0 ) {\n\t$defaults = array(\n\t\t'file'        => $file,\n\t\t'post_parent' => 0\n\t);\n\n\t$data = wp_parse_args( $args, $defaults );\n\n\tif ( ! empty( $parent ) ) {\n\t\t$data['post_parent'] = $parent;\n\t}\n\n\t$data['post_type'] = 'attachment';\n\n\treturn wp_insert_post( $data );\n}\n\n/**\n * Trash or delete an attachment.\n *\n * When an attachment is permanently deleted, the file will also be removed.\n * Deletion removes all post meta fields, taxonomy, comments, etc. associated\n * with the attachment (except the main post).\n *\n * The attachment is moved to the trash instead of permanently deleted unless trash\n * for media is disabled, item is already in the trash, or $force_delete is true.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int  $post_id      Attachment ID.\n * @param bool $force_delete Optional. Whether to bypass trash and force deletion.\n *                           Default false.\n * @return mixed False on failure. Post data on success.\n */\nfunction wp_delete_attachment( $post_id, $force_delete = false ) {\n\tglobal $wpdb;\n\n\tif ( !$post = $wpdb->get_row( $wpdb->prepare(\"SELECT * FROM $wpdb->posts WHERE ID = %d\", $post_id) ) )\n\t\treturn $post;\n\n\tif ( 'attachment' != $post->post_type )\n\t\treturn false;\n\n\tif ( !$force_delete && EMPTY_TRASH_DAYS && MEDIA_TRASH && 'trash' != $post->post_status )\n\t\treturn wp_trash_post( $post_id );\n\n\tdelete_post_meta($post_id, '_wp_trash_meta_status');\n\tdelete_post_meta($post_id, '_wp_trash_meta_time');\n\n\t$meta = wp_get_attachment_metadata( $post_id );\n\t$backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true );\n\t$file = get_attached_file( $post_id );\n\n\tif ( is_multisite() )\n\t\tdelete_transient( 'dirsize_cache' );\n\n\t/**\n\t * Fires before an attachment is deleted, at the start of wp_delete_attachment().\n\t *\n\t * @since 2.0.0\n\t *\n\t * @param int $post_id Attachment ID.\n\t */\n\tdo_action( 'delete_attachment', $post_id );\n\n\twp_delete_object_term_relationships($post_id, array('category', 'post_tag'));\n\twp_delete_object_term_relationships($post_id, get_object_taxonomies($post->post_type));\n\n\t// Delete all for any posts.\n\tdelete_metadata( 'post', null, '_thumbnail_id', $post_id, true );\n\n\twp_defer_comment_counting( true );\n\n\t$comment_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d\", $post_id ));\n\tforeach ( $comment_ids as $comment_id ) {\n\t\twp_delete_comment( $comment_id, true );\n\t}\n\n\twp_defer_comment_counting( false );\n\n\t$post_meta_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d \", $post_id ));\n\tforeach ( $post_meta_ids as $mid )\n\t\tdelete_metadata_by_mid( 'post', $mid );\n\n\t/** This action is documented in wp-includes/post.php */\n\tdo_action( 'delete_post', $post_id );\n\t$result = $wpdb->delete( $wpdb->posts, array( 'ID' => $post_id ) );\n\tif ( ! $result ) {\n\t\treturn false;\n\t}\n\t/** This action is documented in wp-includes/post.php */\n\tdo_action( 'deleted_post', $post_id );\n\n\t$uploadpath = wp_upload_dir();\n\n\tif ( ! empty($meta['thumb']) ) {\n\t\t// Don't delete the thumb if another attachment uses it.\n\t\tif (! $wpdb->get_row( $wpdb->prepare( \"SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d\", '%' . $wpdb->esc_like( $meta['thumb'] ) . '%', $post_id)) ) {\n\t\t\t$thumbfile = str_replace(basename($file), $meta['thumb'], $file);\n\t\t\t/** This filter is documented in wp-includes/functions.php */\n\t\t\t$thumbfile = apply_filters( 'wp_delete_file', $thumbfile );\n\t\t\t@ unlink( path_join($uploadpath['basedir'], $thumbfile) );\n\t\t}\n\t}\n\n\t// Remove intermediate and backup images if there are any.\n\tif ( isset( $meta['sizes'] ) && is_array( $meta['sizes'] ) ) {\n\t\tforeach ( $meta['sizes'] as $size => $sizeinfo ) {\n\t\t\t$intermediate_file = str_replace( basename( $file ), $sizeinfo['file'], $file );\n\t\t\t/** This filter is documented in wp-includes/functions.php */\n\t\t\t$intermediate_file = apply_filters( 'wp_delete_file', $intermediate_file );\n\t\t\t@ unlink( path_join( $uploadpath['basedir'], $intermediate_file ) );\n\t\t}\n\t}\n\n\tif ( is_array($backup_sizes) ) {\n\t\tforeach ( $backup_sizes as $size ) {\n\t\t\t$del_file = path_join( dirname($meta['file']), $size['file'] );\n\t\t\t/** This filter is documented in wp-includes/functions.php */\n\t\t\t$del_file = apply_filters( 'wp_delete_file', $del_file );\n\t\t\t@ unlink( path_join($uploadpath['basedir'], $del_file) );\n\t\t}\n\t}\n\n\twp_delete_file( $file );\n\n\tclean_post_cache( $post );\n\n\treturn $post;\n}\n\n/**\n * Retrieve attachment meta field for attachment ID.\n *\n * @since 2.1.0\n *\n * @param int  $post_id    Attachment ID. Default 0.\n * @param bool $unfiltered Optional. If true, filters are not run. Default false.\n * @return mixed Attachment meta field. False on failure.\n */\nfunction wp_get_attachment_metadata( $post_id = 0, $unfiltered = false ) {\n\t$post_id = (int) $post_id;\n\tif ( !$post = get_post( $post_id ) )\n\t\treturn false;\n\n\t$data = get_post_meta( $post->ID, '_wp_attachment_metadata', true );\n\n\tif ( $unfiltered )\n\t\treturn $data;\n\n\t/**\n\t * Filter the attachment meta data.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array|bool $data    Array of meta data for the given attachment, or false\n\t *                            if the object does not exist.\n\t * @param int        $post_id Attachment ID.\n\t */\n\treturn apply_filters( 'wp_get_attachment_metadata', $data, $post->ID );\n}\n\n/**\n * Update metadata for an attachment.\n *\n * @since 2.1.0\n *\n * @param int   $post_id Attachment ID.\n * @param array $data    Attachment data.\n * @return int|bool False if $post is invalid.\n */\nfunction wp_update_attachment_metadata( $post_id, $data ) {\n\t$post_id = (int) $post_id;\n\tif ( !$post = get_post( $post_id ) )\n\t\treturn false;\n\n\t/**\n\t * Filter the updated attachment meta data.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param array $data    Array of updated attachment meta data.\n\t * @param int   $post_id Attachment ID.\n\t */\n\tif ( $data = apply_filters( 'wp_update_attachment_metadata', $data, $post->ID ) )\n\t\treturn update_post_meta( $post->ID, '_wp_attachment_metadata', $data );\n\telse\n\t\treturn delete_post_meta( $post->ID, '_wp_attachment_metadata' );\n}\n\n/**\n * Retrieve the URL for an attachment.\n *\n * @since 2.1.0\n *\n * @global string $pagenow\n *\n * @param int $post_id Optional. Attachment ID. Default 0.\n * @return string|false Attachment URL, otherwise false.\n */\nfunction wp_get_attachment_url( $post_id = 0 ) {\n\t$post_id = (int) $post_id;\n\tif ( !$post = get_post( $post_id ) )\n\t\treturn false;\n\n\tif ( 'attachment' != $post->post_type )\n\t\treturn false;\n\n\t$url = '';\n\t// Get attached file.\n\tif ( $file = get_post_meta( $post->ID, '_wp_attached_file', true) ) {\n\t\t// Get upload directory.\n\t\tif ( ($uploads = wp_upload_dir()) && false === $uploads['error'] ) {\n\t\t\t// Check that the upload base exists in the file location.\n\t\t\tif ( 0 === strpos( $file, $uploads['basedir'] ) ) {\n\t\t\t\t// Replace file location with url location.\n\t\t\t\t$url = str_replace($uploads['basedir'], $uploads['baseurl'], $file);\n\t\t\t} elseif ( false !== strpos($file, 'wp-content/uploads') ) {\n\t\t\t\t// Get the directory name relative to the basedir (back compat for pre-2.7 uploads)\n\t\t\t\t$url = trailingslashit( $uploads['baseurl'] . '/' . _wp_get_attachment_relative_path( $file ) ) . basename( $file );\n\t\t\t} else {\n\t\t\t\t// It's a newly-uploaded file, therefore $file is relative to the basedir.\n\t\t\t\t$url = $uploads['baseurl'] . \"/$file\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * If any of the above options failed, Fallback on the GUID as used pre-2.7,\n\t * not recommended to rely upon this.\n\t */\n\tif ( empty($url) ) {\n\t\t$url = get_the_guid( $post->ID );\n\t}\n\n\t// On SSL front-end, URLs should be HTTPS.\n\tif ( is_ssl() && ! is_admin() && 'wp-login.php' !== $GLOBALS['pagenow'] ) {\n\t\t$url = set_url_scheme( $url );\n\t}\n\n\t/**\n\t * Filter the attachment URL.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $url     URL for the given attachment.\n\t * @param int    $post_id Attachment ID.\n\t */\n\t$url = apply_filters( 'wp_get_attachment_url', $url, $post->ID );\n\n\tif ( empty( $url ) )\n\t\treturn false;\n\n\treturn $url;\n}\n\n/**\n * Retrieve thumbnail for an attachment.\n *\n * @since 2.1.0\n *\n * @param int $post_id Optional. Attachment ID. Default 0.\n * @return string|false False on failure. Thumbnail file path on success.\n */\nfunction wp_get_attachment_thumb_file( $post_id = 0 ) {\n\t$post_id = (int) $post_id;\n\tif ( !$post = get_post( $post_id ) )\n\t\treturn false;\n\tif ( !is_array( $imagedata = wp_get_attachment_metadata( $post->ID ) ) )\n\t\treturn false;\n\n\t$file = get_attached_file( $post->ID );\n\n\tif ( !empty($imagedata['thumb']) && ($thumbfile = str_replace(basename($file), $imagedata['thumb'], $file)) && file_exists($thumbfile) ) {\n\t\t/**\n\t\t * Filter the attachment thumbnail file path.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $thumbfile File path to the attachment thumbnail.\n\t\t * @param int    $post_id   Attachment ID.\n\t\t */\n\t\treturn apply_filters( 'wp_get_attachment_thumb_file', $thumbfile, $post->ID );\n\t}\n\treturn false;\n}\n\n/**\n * Retrieve URL for an attachment thumbnail.\n *\n * @since 2.1.0\n *\n * @param int $post_id Optional. Attachment ID. Default 0.\n * @return string|false False on failure. Thumbnail URL on success.\n */\nfunction wp_get_attachment_thumb_url( $post_id = 0 ) {\n\t$post_id = (int) $post_id;\n\tif ( !$post = get_post( $post_id ) )\n\t\treturn false;\n\tif ( !$url = wp_get_attachment_url( $post->ID ) )\n\t\treturn false;\n\n\t$sized = image_downsize( $post_id, 'thumbnail' );\n\tif ( $sized )\n\t\treturn $sized[0];\n\n\tif ( !$thumb = wp_get_attachment_thumb_file( $post->ID ) )\n\t\treturn false;\n\n\t$url = str_replace(basename($url), basename($thumb), $url);\n\n\t/**\n\t * Filter the attachment thumbnail URL.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $url     URL for the attachment thumbnail.\n\t * @param int    $post_id Attachment ID.\n\t */\n\treturn apply_filters( 'wp_get_attachment_thumb_url', $url, $post->ID );\n}\n\n/**\n * Verifies an attachment is of a given type.\n *\n * @since 4.2.0\n *\n * @param string      $type    Attachment type. Accepts 'image', 'audio', or 'video'.\n * @param int|WP_Post $post_id Optional. Attachment ID. Default 0.\n * @return bool True if one of the accepted types, false otherwise.\n */\nfunction wp_attachment_is( $type, $post_id = 0 ) {\n\tif ( ! $post = get_post( $post_id ) ) {\n\t\treturn false;\n\t}\n\n\tif ( ! $file = get_attached_file( $post->ID ) ) {\n\t\treturn false;\n\t}\n\n\tif ( 0 === strpos( $post->post_mime_type, $type . '/' ) ) {\n\t\treturn true;\n\t}\n\n\t$check = wp_check_filetype( $file );\n\tif ( empty( $check['ext'] ) ) {\n\t\treturn false;\n\t}\n\n\t$ext = $check['ext'];\n\n\tif ( 'import' !== $post->post_mime_type ) {\n\t\treturn $type === $ext;\n\t}\n\n\tswitch ( $type ) {\n\tcase 'image':\n\t\t$image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );\n\t\treturn in_array( $ext, $image_exts );\n\n\tcase 'audio':\n\t\treturn in_array( $ext, wp_get_audio_extensions() );\n\n\tcase 'video':\n\t\treturn in_array( $ext, wp_get_video_extensions() );\n\n\tdefault:\n\t\treturn $type === $ext;\n\t}\n}\n\n/**\n * Checks if the attachment is an image.\n *\n * @since 2.1.0\n * @since 4.2.0 Modified into wrapper for wp_attachment_is() and\n *              allowed WP_Post object to be passed.\n *\n * @param int|WP_Post $post Optional. Attachment ID. Default 0.\n * @return bool Whether the attachment is an image.\n */\nfunction wp_attachment_is_image( $post = 0 ) {\n\treturn wp_attachment_is( 'image', $post );\n}\n\n/**\n * Retrieve the icon for a MIME type.\n *\n * @since 2.1.0\n *\n * @param string|int $mime MIME type or attachment ID.\n * @return string|false Icon, false otherwise.\n */\nfunction wp_mime_type_icon( $mime = 0 ) {\n\tif ( !is_numeric($mime) )\n\t\t$icon = wp_cache_get(\"mime_type_icon_$mime\");\n\n\t$post_id = 0;\n\tif ( empty($icon) ) {\n\t\t$post_mimes = array();\n\t\tif ( is_numeric($mime) ) {\n\t\t\t$mime = (int) $mime;\n\t\t\tif ( $post = get_post( $mime ) ) {\n\t\t\t\t$post_id = (int) $post->ID;\n\t\t\t\t$file = get_attached_file( $post_id );\n\t\t\t\t$ext = preg_replace('/^.+?\\.([^.]+)$/', '$1', $file);\n\t\t\t\tif ( !empty($ext) ) {\n\t\t\t\t\t$post_mimes[] = $ext;\n\t\t\t\t\tif ( $ext_type = wp_ext2type( $ext ) )\n\t\t\t\t\t\t$post_mimes[] = $ext_type;\n\t\t\t\t}\n\t\t\t\t$mime = $post->post_mime_type;\n\t\t\t} else {\n\t\t\t\t$mime = 0;\n\t\t\t}\n\t\t} else {\n\t\t\t$post_mimes[] = $mime;\n\t\t}\n\n\t\t$icon_files = wp_cache_get('icon_files');\n\n\t\tif ( !is_array($icon_files) ) {\n\t\t\t/**\n\t\t\t * Filter the icon directory path.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param string $path Icon directory absolute path.\n\t\t\t */\n\t\t\t$icon_dir = apply_filters( 'icon_dir', ABSPATH . WPINC . '/images/media' );\n\n\t\t\t/**\n\t\t\t * Filter the icon directory URI.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param string $uri Icon directory URI.\n\t\t\t */\n\t\t\t$icon_dir_uri = apply_filters( 'icon_dir_uri', includes_url( 'images/media' ) );\n\n\t\t\t/**\n\t\t\t * Filter the list of icon directory URIs.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param array $uris List of icon directory URIs.\n\t\t\t */\n\t\t\t$dirs = apply_filters( 'icon_dirs', array( $icon_dir => $icon_dir_uri ) );\n\t\t\t$icon_files = array();\n\t\t\twhile ( $dirs ) {\n\t\t\t\t$keys = array_keys( $dirs );\n\t\t\t\t$dir = array_shift( $keys );\n\t\t\t\t$uri = array_shift($dirs);\n\t\t\t\tif ( $dh = opendir($dir) ) {\n\t\t\t\t\twhile ( false !== $file = readdir($dh) ) {\n\t\t\t\t\t\t$file = basename($file);\n\t\t\t\t\t\tif ( substr($file, 0, 1) == '.' )\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\tif ( !in_array(strtolower(substr($file, -4)), array('.png', '.gif', '.jpg') ) ) {\n\t\t\t\t\t\t\tif ( is_dir(\"$dir/$file\") )\n\t\t\t\t\t\t\t\t$dirs[\"$dir/$file\"] = \"$uri/$file\";\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$icon_files[\"$dir/$file\"] = \"$uri/$file\";\n\t\t\t\t\t}\n\t\t\t\t\tclosedir($dh);\n\t\t\t\t}\n\t\t\t}\n\t\t\twp_cache_add( 'icon_files', $icon_files, 'default', 600 );\n\t\t}\n\n\t\t$types = array();\n\t\t// Icon basename - extension = MIME wildcard.\n\t\tforeach ( $icon_files as $file => $uri )\n\t\t\t$types[ preg_replace('/^([^.]*).*$/', '$1', basename($file)) ] =& $icon_files[$file];\n\n\t\tif ( ! empty($mime) ) {\n\t\t\t$post_mimes[] = substr($mime, 0, strpos($mime, '/'));\n\t\t\t$post_mimes[] = substr($mime, strpos($mime, '/') + 1);\n\t\t\t$post_mimes[] = str_replace('/', '_', $mime);\n\t\t}\n\n\t\t$matches = wp_match_mime_types(array_keys($types), $post_mimes);\n\t\t$matches['default'] = array('default');\n\n\t\tforeach ( $matches as $match => $wilds ) {\n\t\t\tforeach ( $wilds as $wild ) {\n\t\t\t\tif ( ! isset( $types[ $wild ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$icon = $types[ $wild ];\n\t\t\t\tif ( ! is_numeric( $mime ) ) {\n\t\t\t\t\twp_cache_add( \"mime_type_icon_$mime\", $icon );\n\t\t\t\t}\n\t\t\t\tbreak 2;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter the mime type icon.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $icon    Path to the mime type icon.\n\t * @param string $mime    Mime type.\n\t * @param int    $post_id Attachment ID. Will equal 0 if the function passed\n\t *                        the mime type.\n\t */\n\treturn apply_filters( 'wp_mime_type_icon', $icon, $mime, $post_id );\n}\n\n/**\n * Check for changed slugs for published post objects and save the old slug.\n *\n * The function is used when a post object of any type is updated,\n * by comparing the current and previous post objects.\n *\n * If the slug was changed and not already part of the old slugs then it will be\n * added to the post meta field ('_wp_old_slug') for storing old slugs for that\n * post.\n *\n * The most logically usage of this function is redirecting changed post objects, so\n * that those that linked to an changed post will be redirected to the new post.\n *\n * @since 2.1.0\n *\n * @param int     $post_id     Post ID.\n * @param WP_Post $post        The Post Object\n * @param WP_Post $post_before The Previous Post Object\n */\nfunction wp_check_for_changed_slugs( $post_id, $post, $post_before ) {\n\t// Don't bother if it hasn't changed.\n\tif ( $post->post_name == $post_before->post_name ) {\n\t\treturn;\n\t}\n\n\t// We're only concerned with published, non-hierarchical objects.\n\tif ( ! ( 'publish' === $post->post_status || ( 'attachment' === get_post_type( $post ) && 'inherit' === $post->post_status ) ) || is_post_type_hierarchical( $post->post_type ) ) {\n\t\treturn;\n\t}\n\n\t$old_slugs = (array) get_post_meta( $post_id, '_wp_old_slug' );\n\n\t// If we haven't added this old slug before, add it now.\n\tif ( ! empty( $post_before->post_name ) && ! in_array( $post_before->post_name, $old_slugs ) ) {\n\t\tadd_post_meta( $post_id, '_wp_old_slug', $post_before->post_name );\n\t}\n\n\t// If the new slug was used previously, delete it from the list.\n\tif ( in_array( $post->post_name, $old_slugs ) ) {\n\t\tdelete_post_meta( $post_id, '_wp_old_slug', $post->post_name );\n\t}\n}\n\n/**\n * Retrieve the private post SQL based on capability.\n *\n * This function provides a standardized way to appropriately select on the\n * post_status of a post type. The function will return a piece of SQL code\n * that can be added to a WHERE clause; this SQL is constructed to allow all\n * published posts, and all private posts to which the user has access.\n *\n * @since 2.2.0\n * @since 4.3.0 Added the ability to pass an array to `$post_type`.\n *\n * @param string|array $post_type Single post type or an array of post types. Currently only supports 'post' or 'page'.\n * @return string SQL code that can be added to a where clause.\n */\nfunction get_private_posts_cap_sql( $post_type ) {\n\treturn get_posts_by_author_sql( $post_type, false );\n}\n\n/**\n * Retrieve the post SQL based on capability, author, and type.\n *\n * @since 3.0.0\n * @since 4.3.0 Introduced the ability to pass an array of post types to `$post_type`.\n *\n * @see get_private_posts_cap_sql()\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array|string   $post_type   Single post type or an array of post types.\n * @param bool           $full        Optional. Returns a full WHERE statement instead of just\n *                                    an 'andalso' term. Default true.\n * @param int            $post_author Optional. Query posts having a single author ID. Default null.\n * @param bool           $public_only Optional. Only return public posts. Skips cap checks for\n *                                    $current_user.  Default false.\n * @return string SQL WHERE code that can be added to a query.\n */\nfunction get_posts_by_author_sql( $post_type, $full = true, $post_author = null, $public_only = false ) {\n\tglobal $wpdb;\n\n\tif ( is_array( $post_type ) ) {\n\t\t$post_types = $post_type;\n\t} else {\n\t\t$post_types = array( $post_type );\n\t}\n\n\t$post_type_clauses = array();\n\tforeach ( $post_types as $post_type ) {\n\t\t$post_type_obj = get_post_type_object( $post_type );\n\t\tif ( ! $post_type_obj ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/**\n\t\t * Filter the capability to read private posts for a custom post type\n\t\t * when generating SQL for getting posts by author.\n\t\t *\n\t\t * @since 2.2.0\n\t\t * @deprecated 3.2.0 The hook transitioned from \"somewhat useless\" to \"totally useless\".\n\t\t *\n\t\t * @param string $cap Capability.\n\t\t */\n\t\tif ( ! $cap = apply_filters( 'pub_priv_sql_capability', '' ) ) {\n\t\t\t$cap = current_user_can( $post_type_obj->cap->read_private_posts );\n\t\t}\n\n\t\t// Only need to check the cap if $public_only is false.\n\t\t$post_status_sql = \"post_status = 'publish'\";\n\t\tif ( false === $public_only ) {\n\t\t\tif ( $cap ) {\n\t\t\t\t// Does the user have the capability to view private posts? Guess so.\n\t\t\t\t$post_status_sql .= \" OR post_status = 'private'\";\n\t\t\t} elseif ( is_user_logged_in() ) {\n\t\t\t\t// Users can view their own private posts.\n\t\t\t\t$id = get_current_user_id();\n\t\t\t\tif ( null === $post_author || ! $full ) {\n\t\t\t\t\t$post_status_sql .= \" OR post_status = 'private' AND post_author = $id\";\n\t\t\t\t} elseif ( $id == (int) $post_author ) {\n\t\t\t\t\t$post_status_sql .= \" OR post_status = 'private'\";\n\t\t\t\t} // else none\n\t\t\t} // else none\n\t\t}\n\n\t\t$post_type_clauses[] = \"( post_type = '\" . $post_type . \"' AND ( $post_status_sql ) )\";\n\t}\n\n\tif ( empty( $post_type_clauses ) ) {\n\t\treturn $full ? 'WHERE 1 = 0' : '1 = 0';\n\t}\n\n\t$sql = '( '. implode( ' OR ', $post_type_clauses ) . ' )';\n\n\tif ( null !== $post_author ) {\n\t\t$sql .= $wpdb->prepare( ' AND post_author = %d', $post_author );\n\t}\n\n\tif ( $full ) {\n\t\t$sql = 'WHERE ' . $sql;\n\t}\n\n\treturn $sql;\n}\n\n/**\n * Retrieve the date that the last post was published.\n *\n * The server timezone is the default and is the difference between GMT and\n * server time. The 'blog' value is the date when the last post was posted. The\n * 'gmt' is when the last post was posted in GMT formatted date.\n *\n * @since 0.71\n * @since 4.4.0 The `$post_type` argument was added.\n *\n * @param string $timezone  Optional. The timezone for the timestamp. Accepts 'server', 'blog', or 'gmt'.\n *                          'server' uses the server's internal timezone.\n *                          'blog' uses the `post_modified` field, which proxies to the timezone set for the site.\n *                          'gmt' uses the `post_modified_gmt` field.\n *                          Default 'server'.\n * @param string $post_type Optional. The post type to check. Default 'any'.\n * @return string The date of the last post.\n */\nfunction get_lastpostdate( $timezone = 'server', $post_type = 'any' ) {\n\t/**\n\t * Filter the date the last post was published.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $date     Date the last post was published.\n\t * @param string $timezone Location to use for getting the post published date.\n\t *                         See {@see get_lastpostdate()} for accepted `$timezone` values.\n\t */\n\treturn apply_filters( 'get_lastpostdate', _get_last_post_time( $timezone, 'date', $post_type ), $timezone );\n}\n\n/**\n * Get the timestamp of the last time any post was modified.\n *\n * The server timezone is the default and is the difference between GMT and\n * server time. The 'blog' value is just when the last post was modified. The\n * 'gmt' is when the last post was modified in GMT time.\n *\n * @since 1.2.0\n * @since 4.4.0 The `$post_type` argument was added.\n *\n * @param string $timezone  Optional. The timezone for the timestamp. See {@see get_lastpostdate()}\n *                          for information on accepted values.\n *                          Default 'server'.\n * @param string $post_type Optional. The post type to check. Default 'any'.\n * @return string The timestamp.\n */\nfunction get_lastpostmodified( $timezone = 'server', $post_type = 'any' ) {\n\t/**\n\t * Pre-filter the return value of get_lastpostmodified() before the query is run.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $lastpostmodified Date the last post was modified.\n\t *                                 Returning anything other than false will short-circuit the function.\n\t * @param string $timezone         Location to use for getting the post modified date.\n\t *                                 See {@see get_lastpostdate()} for accepted `$timezone` values.\n\t * @param string $post_type        The post type to check.\n\t */\n\t$lastpostmodified = apply_filters( 'pre_get_lastpostmodified', false, $timezone, $post_type );\n\tif ( false !== $lastpostmodified ) {\n\t\treturn $lastpostmodified;\n\t}\n\n\t$lastpostmodified = _get_last_post_time( $timezone, 'modified', $post_type );\n\n\t$lastpostdate = get_lastpostdate($timezone);\n\tif ( $lastpostdate > $lastpostmodified ) {\n\t\t$lastpostmodified = $lastpostdate;\n\t}\n\n\t/**\n\t * Filter the date the last post was modified.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $lastpostmodified Date the last post was modified.\n\t * @param string $timezone         Location to use for getting the post modified date.\n\t *                                 See {@see get_lastpostdate()} for accepted `$timezone` values.\n\t */\n\treturn apply_filters( 'get_lastpostmodified', $lastpostmodified, $timezone );\n}\n\n/**\n * Get the timestamp of the last time any post was modified or published.\n *\n * @since 3.1.0\n * @since 4.4.0 The `$post_type` argument was added.\n * @access private\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $timezone  The timezone for the timestamp. See get_lastpostdate().\n *                          for information on accepted values.\n * @param string $field     Post field to check. Accepts 'date' or 'modified'.\n * @param string $post_type Optional. The post type to check. Default 'any'.\n * @return string|false The timestamp.\n */\nfunction _get_last_post_time( $timezone, $field, $post_type = 'any' ) {\n\tglobal $wpdb;\n\n\tif ( ! in_array( $field, array( 'date', 'modified' ) ) ) {\n\t\treturn false;\n\t}\n\n\t$timezone = strtolower( $timezone );\n\n\t$key = \"lastpost{$field}:$timezone\";\n\tif ( 'any' !== $post_type ) {\n\t\t$key .= ':' . sanitize_key( $post_type );\n\t}\n\n\t$date = wp_cache_get( $key, 'timeinfo' );\n\n\tif ( ! $date ) {\n\t\tif ( 'any' === $post_type ) {\n\t\t\t$post_types = get_post_types( array( 'public' => true ) );\n\t\t\tarray_walk( $post_types, array( $wpdb, 'escape_by_ref' ) );\n\t\t\t$post_types = \"'\" . implode( \"', '\", $post_types ) . \"'\";\n\t\t} else {\n\t\t\t$post_types = \"'\" . sanitize_key( $post_type ) . \"'\";\n\t\t}\n\n\t\tswitch ( $timezone ) {\n\t\t\tcase 'gmt':\n\t\t\t\t$date = $wpdb->get_var(\"SELECT post_{$field}_gmt FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1\");\n\t\t\t\tbreak;\n\t\t\tcase 'blog':\n\t\t\t\t$date = $wpdb->get_var(\"SELECT post_{$field} FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1\");\n\t\t\t\tbreak;\n\t\t\tcase 'server':\n\t\t\t\t$add_seconds_server = date( 'Z' );\n\t\t\t\t$date = $wpdb->get_var(\"SELECT DATE_ADD(post_{$field}_gmt, INTERVAL '$add_seconds_server' SECOND) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type IN ({$post_types}) ORDER BY post_{$field}_gmt DESC LIMIT 1\");\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( $date ) {\n\t\t\twp_cache_set( $key, $date, 'timeinfo' );\n\t\t}\n\t}\n\n\treturn $date;\n}\n\n/**\n * Updates posts in cache.\n *\n * @since 1.5.1\n *\n * @param array $posts Array of post objects, passed by reference.\n */\nfunction update_post_cache( &$posts ) {\n\tif ( ! $posts )\n\t\treturn;\n\n\tforeach ( $posts as $post )\n\t\twp_cache_add( $post->ID, $post, 'posts' );\n}\n\n/**\n * Will clean the post in the cache.\n *\n * Cleaning means delete from the cache of the post. Will call to clean the term\n * object cache associated with the post ID.\n *\n * This function not run if $_wp_suspend_cache_invalidation is not empty. See\n * wp_suspend_cache_invalidation().\n *\n * @since 2.0.0\n *\n * @global bool $_wp_suspend_cache_invalidation\n *\n * @param int|WP_Post $post Post ID or post object to remove from the cache.\n */\nfunction clean_post_cache( $post ) {\n\tglobal $_wp_suspend_cache_invalidation;\n\n\tif ( ! empty( $_wp_suspend_cache_invalidation ) )\n\t\treturn;\n\n\t$post = get_post( $post );\n\tif ( empty( $post ) )\n\t\treturn;\n\n\twp_cache_delete( $post->ID, 'posts' );\n\twp_cache_delete( $post->ID, 'post_meta' );\n\n\tclean_object_term_cache( $post->ID, $post->post_type );\n\n\twp_cache_delete( 'wp_get_archives', 'general' );\n\n\t/**\n\t * Fires immediately after the given post's cache is cleaned.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param int     $post_id Post ID.\n\t * @param WP_Post $post    Post object.\n\t */\n\tdo_action( 'clean_post_cache', $post->ID, $post );\n\n\tif ( 'page' == $post->post_type ) {\n\t\twp_cache_delete( 'all_page_ids', 'posts' );\n\n\t\t/**\n\t\t * Fires immediately after the given page's cache is cleaned.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param int $post_id Post ID.\n\t\t */\n\t\tdo_action( 'clean_page_cache', $post->ID );\n\t}\n\n\twp_cache_set( 'last_changed', microtime(), 'posts' );\n}\n\n/**\n * Call major cache updating functions for list of Post objects.\n *\n * @since 1.5.0\n *\n * @param array  $posts             Array of Post objects\n * @param string $post_type         Optional. Post type. Default 'post'.\n * @param bool   $update_term_cache Optional. Whether to update the term cache. Default true.\n * @param bool   $update_meta_cache Optional. Whether to update the meta cache. Default true.\n */\nfunction update_post_caches( &$posts, $post_type = 'post', $update_term_cache = true, $update_meta_cache = true ) {\n\t// No point in doing all this work if we didn't match any posts.\n\tif ( !$posts )\n\t\treturn;\n\n\tupdate_post_cache($posts);\n\n\t$post_ids = array();\n\tforeach ( $posts as $post )\n\t\t$post_ids[] = $post->ID;\n\n\tif ( ! $post_type )\n\t\t$post_type = 'any';\n\n\tif ( $update_term_cache ) {\n\t\tif ( is_array($post_type) ) {\n\t\t\t$ptypes = $post_type;\n\t\t} elseif ( 'any' == $post_type ) {\n\t\t\t$ptypes = array();\n\t\t\t// Just use the post_types in the supplied posts.\n\t\t\tforeach ( $posts as $post ) {\n\t\t\t\t$ptypes[] = $post->post_type;\n\t\t\t}\n\t\t\t$ptypes = array_unique($ptypes);\n\t\t} else {\n\t\t\t$ptypes = array($post_type);\n\t\t}\n\n\t\tif ( ! empty($ptypes) )\n\t\t\tupdate_object_term_cache($post_ids, $ptypes);\n\t}\n\n\tif ( $update_meta_cache )\n\t\tupdate_postmeta_cache($post_ids);\n}\n\n/**\n * Updates metadata cache for list of post IDs.\n *\n * Performs SQL query to retrieve the metadata for the post IDs and updates the\n * metadata cache for the posts. Therefore, the functions, which call this\n * function, do not need to perform SQL queries on their own.\n *\n * @since 2.1.0\n *\n * @param array $post_ids List of post IDs.\n * @return array|false Returns false if there is nothing to update or an array\n *                     of metadata.\n */\nfunction update_postmeta_cache( $post_ids ) {\n\treturn update_meta_cache('post', $post_ids);\n}\n\n/**\n * Will clean the attachment in the cache.\n *\n * Cleaning means delete from the cache. Optionally will clean the term\n * object cache associated with the attachment ID.\n *\n * This function will not run if $_wp_suspend_cache_invalidation is not empty.\n *\n * @since 3.0.0\n *\n * @global bool $_wp_suspend_cache_invalidation\n *\n * @param int  $id          The attachment ID in the cache to clean.\n * @param bool $clean_terms Optional. Whether to clean terms cache. Default false.\n */\nfunction clean_attachment_cache( $id, $clean_terms = false ) {\n\tglobal $_wp_suspend_cache_invalidation;\n\n\tif ( !empty($_wp_suspend_cache_invalidation) )\n\t\treturn;\n\n\t$id = (int) $id;\n\n\twp_cache_delete($id, 'posts');\n\twp_cache_delete($id, 'post_meta');\n\n\tif ( $clean_terms )\n\t\tclean_object_term_cache($id, 'attachment');\n\n\t/**\n\t * Fires after the given attachment's cache is cleaned.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param int $id Attachment ID.\n\t */\n\tdo_action( 'clean_attachment_cache', $id );\n}\n\n//\n// Hooks\n//\n\n/**\n * Hook for managing future post transitions to published.\n *\n * @since 2.3.0\n * @access private\n *\n * @see wp_clear_scheduled_hook()\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string  $new_status New post status.\n * @param string  $old_status Previous post status.\n * @param WP_Post $post       Post object.\n */\nfunction _transition_post_status( $new_status, $old_status, $post ) {\n\tglobal $wpdb;\n\n\tif ( $old_status != 'publish' && $new_status == 'publish' ) {\n\t\t// Reset GUID if transitioning to publish and it is empty.\n\t\tif ( '' == get_the_guid($post->ID) )\n\t\t\t$wpdb->update( $wpdb->posts, array( 'guid' => get_permalink( $post->ID ) ), array( 'ID' => $post->ID ) );\n\n\t\t/**\n\t\t * Fires when a post's status is transitioned from private to published.\n\t\t *\n\t\t * @since 1.5.0\n\t\t * @deprecated 2.3.0 Use 'private_to_publish' instead.\n\t\t *\n\t\t * @param int $post_id Post ID.\n\t\t */\n\t\tdo_action('private_to_published', $post->ID);\n\t}\n\n\t// If published posts changed clear the lastpostmodified cache.\n\tif ( 'publish' == $new_status || 'publish' == $old_status) {\n\t\tforeach ( array( 'server', 'gmt', 'blog' ) as $timezone ) {\n\t\t\twp_cache_delete( \"lastpostmodified:$timezone\", 'timeinfo' );\n\t\t\twp_cache_delete( \"lastpostdate:$timezone\", 'timeinfo' );\n\t\t\twp_cache_delete( \"lastpostdate:$timezone:{$post->post_type}\", 'timeinfo' );\n\t\t}\n\t}\n\n\tif ( $new_status !== $old_status ) {\n\t\twp_cache_delete( _count_posts_cache_key( $post->post_type ), 'counts' );\n\t\twp_cache_delete( _count_posts_cache_key( $post->post_type, 'readable' ), 'counts' );\n\t}\n\n\t// Always clears the hook in case the post status bounced from future to draft.\n\twp_clear_scheduled_hook('publish_future_post', array( $post->ID ) );\n}\n\n/**\n * Hook used to schedule publication for a post marked for the future.\n *\n * The $post properties used and must exist are 'ID' and 'post_date_gmt'.\n *\n * @since 2.3.0\n * @access private\n *\n * @param int     $deprecated Not used. Can be set to null. Never implemented. Not marked\n *                            as deprecated with _deprecated_argument() as it conflicts with\n *                            wp_transition_post_status() and the default filter for\n *                            {@see _future_post_hook()}.\n * @param WP_Post $post       Post object.\n */\nfunction _future_post_hook( $deprecated, $post ) {\n\twp_clear_scheduled_hook( 'publish_future_post', array( $post->ID ) );\n\twp_schedule_single_event( strtotime( get_gmt_from_date( $post->post_date ) . ' GMT') , 'publish_future_post', array( $post->ID ) );\n}\n\n/**\n * Hook to schedule pings and enclosures when a post is published.\n *\n * Uses XMLRPC_REQUEST and WP_IMPORTING constants.\n *\n * @since 2.3.0\n * @access private\n *\n * @param int $post_id The ID in the database table of the post being published.\n */\nfunction _publish_post_hook( $post_id ) {\n\tif ( defined( 'XMLRPC_REQUEST' ) ) {\n\t\t/**\n\t\t * Fires when _publish_post_hook() is called during an XML-RPC request.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param int $post_id Post ID.\n\t\t */\n\t\tdo_action( 'xmlrpc_publish_post', $post_id );\n\t}\n\n\tif ( defined('WP_IMPORTING') )\n\t\treturn;\n\n\tif ( get_option('default_pingback_flag') )\n\t\tadd_post_meta( $post_id, '_pingme', '1' );\n\tadd_post_meta( $post_id, '_encloseme', '1' );\n\n\twp_schedule_single_event(time(), 'do_pings');\n}\n\n/**\n * Return the post's parent's post_ID\n *\n * @since 3.1.0\n *\n * @param int $post_ID\n *\n * @return int|false Post parent ID, otherwise false.\n */\nfunction wp_get_post_parent_id( $post_ID ) {\n\t$post = get_post( $post_ID );\n\tif ( !$post || is_wp_error( $post ) )\n\t\treturn false;\n\treturn (int) $post->post_parent;\n}\n\n/**\n * Check the given subset of the post hierarchy for hierarchy loops.\n *\n * Prevents loops from forming and breaks those that it finds. Attached\n * to the 'wp_insert_post_parent' filter.\n *\n * @since 3.1.0\n *\n * @see wp_find_hierarchy_loop()\n *\n * @param int $post_parent ID of the parent for the post we're checking.\n * @param int $post_ID     ID of the post we're checking.\n * @return int The new post_parent for the post, 0 otherwise.\n */\nfunction wp_check_post_hierarchy_for_loops( $post_parent, $post_ID ) {\n\t// Nothing fancy here - bail.\n\tif ( !$post_parent )\n\t\treturn 0;\n\n\t// New post can't cause a loop.\n\tif ( empty( $post_ID ) )\n\t\treturn $post_parent;\n\n\t// Can't be its own parent.\n\tif ( $post_parent == $post_ID )\n\t\treturn 0;\n\n\t// Now look for larger loops.\n\tif ( !$loop = wp_find_hierarchy_loop( 'wp_get_post_parent_id', $post_ID, $post_parent ) )\n\t\treturn $post_parent; // No loop\n\n\t// Setting $post_parent to the given value causes a loop.\n\tif ( isset( $loop[$post_ID] ) )\n\t\treturn 0;\n\n\t// There's a loop, but it doesn't contain $post_ID. Break the loop.\n\tforeach ( array_keys( $loop ) as $loop_member )\n\t\twp_update_post( array( 'ID' => $loop_member, 'post_parent' => 0 ) );\n\n\treturn $post_parent;\n}\n\n/**\n * Set a post thumbnail.\n *\n * @since 3.1.0\n *\n * @param int|WP_Post $post         Post ID or post object where thumbnail should be attached.\n * @param int         $thumbnail_id Thumbnail to attach.\n * @return int|bool True on success, false on failure.\n */\nfunction set_post_thumbnail( $post, $thumbnail_id ) {\n\t$post = get_post( $post );\n\t$thumbnail_id = absint( $thumbnail_id );\n\tif ( $post && $thumbnail_id && get_post( $thumbnail_id ) ) {\n\t\tif ( wp_get_attachment_image( $thumbnail_id, 'thumbnail' ) )\n\t\t\treturn update_post_meta( $post->ID, '_thumbnail_id', $thumbnail_id );\n\t\telse\n\t\t\treturn delete_post_meta( $post->ID, '_thumbnail_id' );\n\t}\n\treturn false;\n}\n\n/**\n * Remove a post thumbnail.\n *\n * @since 3.3.0\n *\n * @param int|WP_Post $post Post ID or post object where thumbnail should be removed from.\n * @return bool True on success, false on failure.\n */\nfunction delete_post_thumbnail( $post ) {\n\t$post = get_post( $post );\n\tif ( $post )\n\t\treturn delete_post_meta( $post->ID, '_thumbnail_id' );\n\treturn false;\n}\n\n/**\n * Delete auto-drafts for new posts that are > 7 days old.\n *\n * @since 3.4.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction wp_delete_auto_drafts() {\n\tglobal $wpdb;\n\n\t// Cleanup old auto-drafts more than 7 days old.\n\t$old_posts = $wpdb->get_col( \"SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) > post_date\" );\n\tforeach ( (array) $old_posts as $delete ) {\n\t\t// Force delete.\n\t\twp_delete_post( $delete, true );\n\t}\n}\n\n/**\n * Update the custom taxonomies' term counts when a post's status is changed.\n *\n * For example, default posts term counts (for custom taxonomies) don't include\n * private / draft posts.\n *\n * @since 3.3.0\n * @access private\n *\n * @param string  $new_status New post status.\n * @param string  $old_status Old post status.\n * @param WP_Post $post       Post object.\n */\nfunction _update_term_count_on_transition_post_status( $new_status, $old_status, $post ) {\n\t// Update counts for the post's terms.\n\tforeach ( (array) get_object_taxonomies( $post->post_type ) as $taxonomy ) {\n\t\t$tt_ids = wp_get_object_terms( $post->ID, $taxonomy, array( 'fields' => 'tt_ids' ) );\n\t\twp_update_term_count( $tt_ids, $taxonomy );\n\t}\n}\n\n/**\n * Adds any posts from the given ids to the cache that do not already exist in cache\n *\n * @since 3.4.0\n * @access private\n *\n * @see update_post_caches()\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array $ids               ID list.\n * @param bool  $update_term_cache Optional. Whether to update the term cache. Default true.\n * @param bool  $update_meta_cache Optional. Whether to update the meta cache. Default true.\n */\nfunction _prime_post_caches( $ids, $update_term_cache = true, $update_meta_cache = true ) {\n\tglobal $wpdb;\n\n\t$non_cached_ids = _get_non_cached_ids( $ids, 'posts' );\n\tif ( !empty( $non_cached_ids ) ) {\n\t\t$fresh_posts = $wpdb->get_results( sprintf( \"SELECT $wpdb->posts.* FROM $wpdb->posts WHERE ID IN (%s)\", join( \",\", $non_cached_ids ) ) );\n\n\t\tupdate_post_caches( $fresh_posts, 'any', $update_term_cache, $update_meta_cache );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/query.php",
    "content": "<?php\n/**\n * WordPress Query API\n *\n * The query API attempts to get which part of WordPress the user is on. It\n * also provides functionality for getting URL query information.\n *\n * @link https://codex.wordpress.org/The_Loop More information on The Loop.\n *\n * @package WordPress\n * @subpackage Query\n */\n\n/**\n * Retrieve variable in the WP_Query class.\n *\n * @since 1.5.0\n * @since 3.9.0 The `$default` argument was introduced.\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param string $var       The variable key to retrieve.\n * @param mixed  $default   Optional. Value to return if the query variable is not set. Default empty.\n * @return mixed Contents of the query variable.\n */\nfunction get_query_var( $var, $default = '' ) {\n\tglobal $wp_query;\n\treturn $wp_query->get( $var, $default );\n}\n\n/**\n * Retrieve the currently-queried object.\n *\n * Wrapper for WP_Query::get_queried_object().\n *\n * @since 3.1.0\n * @access public\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return object Queried object.\n */\nfunction get_queried_object() {\n\tglobal $wp_query;\n\treturn $wp_query->get_queried_object();\n}\n\n/**\n * Retrieve ID of the current queried object.\n *\n * Wrapper for WP_Query::get_queried_object_id().\n *\n * @since 3.1.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return int ID of the queried object.\n */\nfunction get_queried_object_id() {\n\tglobal $wp_query;\n\treturn $wp_query->get_queried_object_id();\n}\n\n/**\n * Set query variable.\n *\n * @since 2.2.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param string $var   Query variable key.\n * @param mixed  $value Query variable value.\n */\nfunction set_query_var( $var, $value ) {\n\tglobal $wp_query;\n\t$wp_query->set( $var, $value );\n}\n\n/**\n * Set up The Loop with query parameters.\n *\n * This will override the current WordPress Loop and shouldn't be used more than\n * once. This must not be used within the WordPress Loop.\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param string $query\n * @return array List of posts\n */\nfunction query_posts($query) {\n\t$GLOBALS['wp_query'] = new WP_Query();\n\treturn $GLOBALS['wp_query']->query($query);\n}\n\n/**\n * Destroy the previous query and set up a new query.\n *\n * This should be used after {@link query_posts()} and before another {@link\n * query_posts()}. This will remove obscure bugs that occur when the previous\n * wp_query object is not destroyed properly before another is set up.\n *\n * @since 2.3.0\n *\n * @global WP_Query $wp_query     Global WP_Query instance.\n * @global WP_Query $wp_the_query Copy of the global WP_Query instance created during wp_reset_query().\n */\nfunction wp_reset_query() {\n\t$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];\n\twp_reset_postdata();\n}\n\n/**\n * After looping through a separate query, this function restores\n * the $post global to the current post in the main query.\n *\n * @since 3.0.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n */\nfunction wp_reset_postdata() {\n\tglobal $wp_query;\n\n\tif ( isset( $wp_query ) ) {\n\t\t$wp_query->reset_postdata();\n\t}\n}\n\n/*\n * Query type checks.\n */\n\n/**\n * Is the query for an existing archive page?\n *\n * Month, Year, Category, Author, Post Type archive...\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_archive() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_archive();\n}\n\n/**\n * Is the query for an existing post type archive page?\n *\n * @since 3.1.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param string|array $post_types Optional. Post type or array of posts types to check against.\n * @return bool\n */\nfunction is_post_type_archive( $post_types = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_post_type_archive( $post_types );\n}\n\n/**\n * Is the query for an existing attachment page?\n *\n * @since 2.0.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param int|string|array|object $attachment Attachment ID, title, slug, or array of such.\n * @return bool\n */\nfunction is_attachment( $attachment = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_attachment( $attachment );\n}\n\n/**\n * Is the query for an existing author archive page?\n *\n * If the $author parameter is specified, this function will additionally\n * check if the query is for one of the authors specified.\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param mixed $author Optional. User ID, nickname, nicename, or array of User IDs, nicknames, and nicenames\n * @return bool\n */\nfunction is_author( $author = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_author( $author );\n}\n\n/**\n * Is the query for an existing category archive page?\n *\n * If the $category parameter is specified, this function will additionally\n * check if the query is for one of the categories specified.\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param mixed $category Optional. Category ID, name, slug, or array of Category IDs, names, and slugs.\n * @return bool\n */\nfunction is_category( $category = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_category( $category );\n}\n\n/**\n * Is the query for an existing tag archive page?\n *\n * If the $tag parameter is specified, this function will additionally\n * check if the query is for one of the tags specified.\n *\n * @since 2.3.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param mixed $tag Optional. Tag ID, name, slug, or array of Tag IDs, names, and slugs.\n * @return bool\n */\nfunction is_tag( $tag = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_tag( $tag );\n}\n\n/**\n * Is the query for an existing taxonomy archive page?\n *\n * If the $taxonomy parameter is specified, this function will additionally\n * check if the query is for that specific $taxonomy.\n *\n * If the $term parameter is specified in addition to the $taxonomy parameter,\n * this function will additionally check if the query is for one of the terms\n * specified.\n *\n * @since 2.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param string|array     $taxonomy Optional. Taxonomy slug or slugs.\n * @param int|string|array $term     Optional. Term ID, name, slug or array of Term IDs, names, and slugs.\n * @return bool\n */\nfunction is_tax( $taxonomy = '', $term = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_tax( $taxonomy, $term );\n}\n\n/**\n * Whether the current URL is within the comments popup window.\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_comments_popup() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_comments_popup();\n}\n\n/**\n * Is the query for an existing date archive?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_date() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_date();\n}\n\n/**\n * Is the query for an existing day archive?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_day() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_day();\n}\n\n/**\n * Is the query for a feed?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param string|array $feeds Optional feed types to check.\n * @return bool\n */\nfunction is_feed( $feeds = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_feed( $feeds );\n}\n\n/**\n * Is the query for a comments feed?\n *\n * @since 3.0.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_comment_feed() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_comment_feed();\n}\n\n/**\n * Is the query for the front page of the site?\n *\n * This is for what is displayed at your site's main URL.\n *\n * Depends on the site's \"Front page displays\" Reading Settings 'show_on_front' and 'page_on_front'.\n *\n * If you set a static page for the front page of your site, this function will return\n * true when viewing that page.\n *\n * Otherwise the same as @see is_home()\n *\n * @since 2.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool True, if front of site.\n */\nfunction is_front_page() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_front_page();\n}\n\n/**\n * Is the query for the blog homepage?\n *\n * This is the page which shows the time based blog content of your site.\n *\n * Depends on the site's \"Front page displays\" Reading Settings 'show_on_front' and 'page_for_posts'.\n *\n * If you set a static page for the front page of your site, this function will return\n * true only on the page you set as the \"Posts page\".\n *\n * @see is_front_page()\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool True if blog view homepage.\n */\nfunction is_home() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_home();\n}\n\n/**\n * Is the query for an existing month archive?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_month() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_month();\n}\n\n/**\n * Is the query for an existing single page?\n *\n * If the $page parameter is specified, this function will additionally\n * check if the query is for one of the pages specified.\n *\n * @see is_single()\n * @see is_singular()\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param int|string|array $page Optional. Page ID, title, slug, or array of such. Default empty.\n * @return bool Whether the query is for an existing single page.\n */\nfunction is_page( $page = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_page( $page );\n}\n\n/**\n * Is the query for paged result and not for the first page?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_paged() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_paged();\n}\n\n/**\n * Is the query for a post or page preview?\n *\n * @since 2.0.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_preview() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_preview();\n}\n\n/**\n * Is the query for the robots file?\n *\n * @since 2.1.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_robots() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_robots();\n}\n\n/**\n * Is the query for a search?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_search() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_search();\n}\n\n/**\n * Is the query for an existing single post?\n *\n * Works for any post type, except attachments and pages\n *\n * If the $post parameter is specified, this function will additionally\n * check if the query is for one of the Posts specified.\n *\n * @see is_page()\n * @see is_singular()\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param int|string|array $post Optional. Post ID, title, slug, or array of such. Default empty.\n * @return bool Whether the query is for an existing single post.\n */\nfunction is_single( $post = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_single( $post );\n}\n\n/**\n * Is the query for an existing single post of any post type (post, attachment, page, ... )?\n *\n * If the $post_types parameter is specified, this function will additionally\n * check if the query is for one of the Posts Types specified.\n *\n * @see is_page()\n * @see is_single()\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param string|array $post_types Optional. Post type or array of post types. Default empty.\n * @return bool Whether the query is for an existing single post of any of the given post types.\n */\nfunction is_singular( $post_types = '' ) {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_singular( $post_types );\n}\n\n/**\n * Is the query for a specific time?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_time() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_time();\n}\n\n/**\n * Is the query for a trackback endpoint call?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_trackback() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_trackback();\n}\n\n/**\n * Is the query for an existing year archive?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_year() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_year();\n}\n\n/**\n * Is the query a 404 (returns no results)?\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_404() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_404();\n}\n\n/**\n * Is the query for an embedded post?\n *\n * @since 4.4.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool Whether we're in an embedded post or not.\n */\nfunction is_embed() {\n\tglobal $wp_query;\n\n\tif ( ! isset( $wp_query ) ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );\n\t\treturn false;\n\t}\n\n\treturn $wp_query->is_embed();\n}\n\n/**\n * Is the query the main query?\n *\n * @since 3.3.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction is_main_query() {\n\tif ( 'pre_get_posts' === current_filter() ) {\n\t\t$message = sprintf(\n\t\t\t/* translators: 1: pre_get_posts 2: WP_Query->is_main_query() 3: is_main_query() 4: link to codex is_main_query() page. */\n\t\t\t__( 'In %1$s, use the %2$s method, not the %3$s function. See %4$s.' ),\n\t\t\t'<code>pre_get_posts</code>',\n\t\t\t'<code>WP_Query->is_main_query()</code>',\n\t\t\t'<code>is_main_query()</code>',\n\t\t\t__( 'https://codex.wordpress.org/Function_Reference/is_main_query' )\n\t\t);\n\t\t_doing_it_wrong( __FUNCTION__, $message, '3.7' );\n\t}\n\n\tglobal $wp_query;\n\treturn $wp_query->is_main_query();\n}\n\n/*\n * The Loop. Post loop control.\n */\n\n/**\n * Whether current WordPress query has results to loop over.\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction have_posts() {\n\tglobal $wp_query;\n\treturn $wp_query->have_posts();\n}\n\n/**\n * Whether the caller is in the Loop.\n *\n * @since 2.0.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool True if caller is within loop, false if loop hasn't started or ended.\n */\nfunction in_the_loop() {\n\tglobal $wp_query;\n\treturn $wp_query->in_the_loop;\n}\n\n/**\n * Rewind the loop posts.\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n */\nfunction rewind_posts() {\n\tglobal $wp_query;\n\t$wp_query->rewind_posts();\n}\n\n/**\n * Iterate the post index in the loop.\n *\n * @since 1.5.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n */\nfunction the_post() {\n\tglobal $wp_query;\n\t$wp_query->the_post();\n}\n\n/*\n * Comments loop.\n */\n\n/**\n * Whether there are comments to loop over.\n *\n * @since 2.2.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return bool\n */\nfunction have_comments() {\n\tglobal $wp_query;\n\treturn $wp_query->have_comments();\n}\n\n/**\n * Iterate comment index in the comment loop.\n *\n * @since 2.2.0\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @return object\n */\nfunction the_comment() {\n\tglobal $wp_query;\n\treturn $wp_query->the_comment();\n}\n\n/*\n * WP_Query\n */\n\n/**\n * The WordPress Query class.\n *\n * @link https://codex.wordpress.org/Function_Reference/WP_Query Codex page.\n *\n * @since 1.5.0\n */\nclass WP_Query {\n\n\t/**\n\t * Query vars set by the user\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $query;\n\n\t/**\n\t * Query vars, after parsing\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $query_vars = array();\n\n\t/**\n\t * Taxonomy query, as passed to get_tax_sql()\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @var object WP_Tax_Query\n\t */\n\tpublic $tax_query;\n\n\t/**\n\t * Metadata query container\n\t *\n\t * @since 3.2.0\n\t * @access public\n\t * @var object WP_Meta_Query\n\t */\n\tpublic $meta_query = false;\n\n\t/**\n\t * Date query container\n\t *\n\t * @since 3.7.0\n\t * @access public\n\t * @var object WP_Date_Query\n\t */\n\tpublic $date_query = false;\n\n\t/**\n\t * Holds the data for a single object that is queried.\n\t *\n\t * Holds the contents of a post, page, category, attachment.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var object|array\n\t */\n\tpublic $queried_object;\n\n\t/**\n\t * The ID of the queried object.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $queried_object_id;\n\n\t/**\n\t * Get post database query.\n\t *\n\t * @since 2.0.1\n\t * @access public\n\t * @var string\n\t */\n\tpublic $request;\n\n\t/**\n\t * List of posts.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $posts;\n\n\t/**\n\t * The amount of posts for the current query.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $post_count = 0;\n\n\t/**\n\t * Index of the current item in the loop.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $current_post = -1;\n\n\t/**\n\t * Whether the loop has started and the caller is in the loop.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $in_the_loop = false;\n\n\t/**\n\t * The current post.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var WP_Post\n\t */\n\tpublic $post;\n\n\t/**\n\t * The list of comments for current post.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t * @var array\n\t */\n\tpublic $comments;\n\n\t/**\n\t * The amount of comments for the posts.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $comment_count = 0;\n\n\t/**\n\t * The index of the comment in the comment loop.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $current_comment = -1;\n\n\t/**\n\t * Current comment ID.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $comment;\n\n\t/**\n\t * The amount of found posts for the current query.\n\t *\n\t * If limit clause was not used, equals $post_count.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $found_posts = 0;\n\n\t/**\n\t * The amount of pages.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $max_num_pages = 0;\n\n\t/**\n\t * The amount of comment pages.\n\t *\n\t * @since 2.7.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $max_num_comment_pages = 0;\n\n\t/**\n\t * Set if query is single post.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_single = false;\n\n\t/**\n\t * Set if query is preview of blog.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_preview = false;\n\n\t/**\n\t * Set if query returns a page.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_page = false;\n\n\t/**\n\t * Set if query is an archive list.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_archive = false;\n\n\t/**\n\t * Set if query is part of a date.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_date = false;\n\n\t/**\n\t * Set if query contains a year.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_year = false;\n\n\t/**\n\t * Set if query contains a month.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_month = false;\n\n\t/**\n\t * Set if query contains a day.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_day = false;\n\n\t/**\n\t * Set if query contains time.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_time = false;\n\n\t/**\n\t * Set if query contains an author.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_author = false;\n\n\t/**\n\t * Set if query contains category.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_category = false;\n\n\t/**\n\t * Set if query contains tag.\n\t *\n\t * @since 2.3.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_tag = false;\n\n\t/**\n\t * Set if query contains taxonomy.\n\t *\n\t * @since 2.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_tax = false;\n\n\t/**\n\t * Set if query was part of a search result.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_search = false;\n\n\t/**\n\t * Set if query is feed display.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_feed = false;\n\n\t/**\n\t * Set if query is comment feed display.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_comment_feed = false;\n\n\t/**\n\t * Set if query is trackback.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_trackback = false;\n\n\t/**\n\t * Set if query is blog homepage.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_home = false;\n\n\t/**\n\t * Set if query couldn't found anything.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_404 = false;\n\n\t/**\n\t * Set if query is embed.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_embed = false;\n\n\t/**\n\t * Set if query is within comments popup window.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_comments_popup = false;\n\n\t/**\n\t * Set if query is paged\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_paged = false;\n\n\t/**\n\t * Set if query is part of administration page.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_admin = false;\n\n\t/**\n\t * Set if query is an attachment.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_attachment = false;\n\n\t/**\n\t * Set if is single, is a page, or is an attachment.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_singular = false;\n\n\t/**\n\t * Set if query is for robots.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_robots = false;\n\n\t/**\n\t * Set if query contains posts.\n\t *\n\t * Basically, the homepage if the option isn't set for the static homepage.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_posts_page = false;\n\n\t/**\n\t * Set if query is for a post type archive.\n\t *\n\t * @since 3.1.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_post_type_archive = false;\n\n\t/**\n\t * Stores the ->query_vars state like md5(serialize( $this->query_vars ) ) so we know\n\t * whether we have to re-parse because something has changed\n\t *\n\t * @since 3.1.0\n\t * @access private\n\t * @var bool|string\n\t */\n\tprivate $query_vars_hash = false;\n\n\t/**\n\t * Whether query vars have changed since the initial parse_query() call. Used to catch modifications to query vars made\n\t * via pre_get_posts hooks.\n\t *\n\t * @since 3.1.1\n\t * @access private\n\t */\n\tprivate $query_vars_changed = true;\n\n\t/**\n\t * Set if post thumbnails are cached\n\t *\n\t * @since 3.2.0\n\t * @access public\n\t * @var bool\n\t */\n\t public $thumbnails_cached = false;\n\n\t/**\n\t * Whether the term meta cache for matched posts has been primed.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var bool\n\t */\n\tpublic $updated_term_meta_cache = false;\n\n\t/**\n\t * Whether the comment meta cache for matched posts has been primed.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var bool\n\t */\n\tpublic $updated_comment_meta_cache = false;\n\n\t/**\n\t * Cached list of search stopwords.\n\t *\n\t * @since 3.7.0\n\t * @var array\n\t */\n\tprivate $stopwords;\n\n\tprivate $compat_fields = array( 'query_vars_hash', 'query_vars_changed' );\n\n\tprivate $compat_methods = array( 'init_query_flags', 'parse_tax_query' );\n\n\t/**\n\t * Resets query flags to false.\n\t *\n\t * The query flags are what page info WordPress was able to figure out.\n\t *\n\t * @since 2.0.0\n\t * @access private\n\t */\n\tprivate function init_query_flags() {\n\t\t$this->is_single = false;\n\t\t$this->is_preview = false;\n\t\t$this->is_page = false;\n\t\t$this->is_archive = false;\n\t\t$this->is_date = false;\n\t\t$this->is_year = false;\n\t\t$this->is_month = false;\n\t\t$this->is_day = false;\n\t\t$this->is_time = false;\n\t\t$this->is_author = false;\n\t\t$this->is_category = false;\n\t\t$this->is_tag = false;\n\t\t$this->is_tax = false;\n\t\t$this->is_search = false;\n\t\t$this->is_feed = false;\n\t\t$this->is_comment_feed = false;\n\t\t$this->is_trackback = false;\n\t\t$this->is_home = false;\n\t\t$this->is_404 = false;\n\t\t$this->is_comments_popup = false;\n\t\t$this->is_paged = false;\n\t\t$this->is_admin = false;\n\t\t$this->is_attachment = false;\n\t\t$this->is_singular = false;\n\t\t$this->is_robots = false;\n\t\t$this->is_posts_page = false;\n\t\t$this->is_post_type_archive = false;\n\t}\n\n\t/**\n\t * Initiates object properties and sets default values.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t */\n\tpublic function init() {\n\t\tunset($this->posts);\n\t\tunset($this->query);\n\t\t$this->query_vars = array();\n\t\tunset($this->queried_object);\n\t\tunset($this->queried_object_id);\n\t\t$this->post_count = 0;\n\t\t$this->current_post = -1;\n\t\t$this->in_the_loop = false;\n\t\tunset( $this->request );\n\t\tunset( $this->post );\n\t\tunset( $this->comments );\n\t\tunset( $this->comment );\n\t\t$this->comment_count = 0;\n\t\t$this->current_comment = -1;\n\t\t$this->found_posts = 0;\n\t\t$this->max_num_pages = 0;\n\t\t$this->max_num_comment_pages = 0;\n\n\t\t$this->init_query_flags();\n\t}\n\n\t/**\n\t * Reparse the query vars.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t */\n\tpublic function parse_query_vars() {\n\t\t$this->parse_query();\n\t}\n\n\t/**\n\t * Fills in the query variables, which do not exist within the parameter.\n\t *\n\t * @since 2.1.0\n\t * @access public\n\t *\n\t * @param array $array Defined query variables.\n\t * @return array Complete query variables with undefined ones filled in empty.\n\t */\n\tpublic function fill_query_vars($array) {\n\t\t$keys = array(\n\t\t\t'error'\n\t\t\t, 'm'\n\t\t\t, 'p'\n\t\t\t, 'post_parent'\n\t\t\t, 'subpost'\n\t\t\t, 'subpost_id'\n\t\t\t, 'attachment'\n\t\t\t, 'attachment_id'\n\t\t\t, 'name'\n\t\t\t, 'static'\n\t\t\t, 'pagename'\n\t\t\t, 'page_id'\n\t\t\t, 'second'\n\t\t\t, 'minute'\n\t\t\t, 'hour'\n\t\t\t, 'day'\n\t\t\t, 'monthnum'\n\t\t\t, 'year'\n\t\t\t, 'w'\n\t\t\t, 'category_name'\n\t\t\t, 'tag'\n\t\t\t, 'cat'\n\t\t\t, 'tag_id'\n\t\t\t, 'author'\n\t\t\t, 'author_name'\n\t\t\t, 'feed'\n\t\t\t, 'tb'\n\t\t\t, 'paged'\n\t\t\t, 'comments_popup'\n\t\t\t, 'meta_key'\n\t\t\t, 'meta_value'\n\t\t\t, 'preview'\n\t\t\t, 's'\n\t\t\t, 'sentence'\n\t\t\t, 'title'\n\t\t\t, 'fields'\n\t\t\t, 'menu_order'\n\t\t);\n\n\t\tforeach ( $keys as $key ) {\n\t\t\tif ( !isset($array[$key]) )\n\t\t\t\t$array[$key] = '';\n\t\t}\n\n\t\t$array_keys = array( 'category__in', 'category__not_in', 'category__and', 'post__in', 'post__not_in', 'post_name__in',\n\t\t\t'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'post_parent__in', 'post_parent__not_in',\n\t\t\t'author__in', 'author__not_in' );\n\n\t\tforeach ( $array_keys as $key ) {\n\t\t\tif ( !isset($array[$key]) )\n\t\t\t\t$array[$key] = array();\n\t\t}\n\t\treturn $array;\n\t}\n\n\t/**\n\t * Parse a query string and set query type booleans.\n\t *\n\t * @since 1.5.0\n\t * @since 4.2.0 Introduced the ability to order by specific clauses of a `$meta_query`, by passing the clause's\n\t *              array key to `$orderby`.\n\t * @since 4.4.0 Introduced `$post_name__in` and `$title` parameters. `$s` was updated to support excluded\n\t *              search terms, by prepending a hyphen.\n\t * @access public\n\t *\n\t * @param string|array $query {\n\t *     Optional. Array or string of Query parameters.\n\t *\n\t *     @type int          $attachment_id           Attachment post ID. Used for 'attachment' post_type.\n\t *     @type int|string   $author                  Author ID, or comma-separated list of IDs.\n\t *     @type string       $author_name             User 'user_nicename'.\n\t *     @type array        $author__in              An array of author IDs to query from.\n\t *     @type array        $author__not_in          An array of author IDs not to query from.\n\t *     @type bool         $cache_results           Whether to cache post information. Default true.\n\t *     @type int|string   $cat                     Category ID or comma-separated list of IDs (this or any children).\n\t *     @type array        $category__and           An array of category IDs (AND in).\n\t *     @type array        $category__in            An array of category IDs (OR in, no children).\n\t *     @type array        $category__not_in        An array of category IDs (NOT in).\n\t *     @type string       $category_name           Use category slug (not name, this or any children).\n\t *     @type int          $comments_per_page       The number of comments to return per page.\n\t *                                                 Default 'comments_per_page' option.\n\t *     @type int|string   $comments_popup          Whether the query is within the comments popup. Default empty.\n\t *     @type array        $date_query              An associative array of WP_Date_Query arguments.\n\t *                                                 {@see WP_Date_Query::__construct()}\n\t *     @type int          $day                     Day of the month. Default empty. Accepts numbers 1-31.\n\t *     @type bool         $exact                   Whether to search by exact keyword. Default false.\n\t *     @type string|array $fields                  Which fields to return. Single field or all fields (string),\n\t *                                                 or array of fields. 'id=>parent' uses 'id' and 'post_parent'.\n\t *                                                 Default all fields. Accepts 'ids', 'id=>parent'.\n\t *     @type int          $hour                    Hour of the day. Default empty. Accepts numbers 0-23.\n\t *     @type int|bool     $ignore_sticky_posts     Whether to ignore sticky posts or not. Setting this to false\n\t *                                                 excludes stickies from 'post__in'. Accepts 1|true, 0|false.\n\t *                                                 Default 0|false.\n\t *     @type int          $m                       Combination YearMonth. Accepts any four-digit year and month\n\t *                                                 numbers 1-12. Default empty.\n\t *     @type string       $meta_compare            Comparison operator to test the 'meta_value'.\n\t *     @type string       $meta_key                Custom field key.\n\t *     @type array        $meta_query              An associative array of WP_Meta_Query arguments.\n\t *                                                 {@see WP_Meta_Query->queries}\n\t *     @type string       $meta_value              Custom field value.\n\t *     @type int          $meta_value_num          Custom field value number.\n\t *     @type int          $menu_order              The menu order of the posts.\n\t *     @type int          $monthnum                The two-digit month. Default empty. Accepts numbers 1-12.\n\t *     @type string       $name                    Post slug.\n\t *     @type bool         $nopaging                Show all posts (true) or paginate (false). Default false.\n\t *     @type bool         $no_found_rows           Whether to skip counting the total rows found. Enabling can improve\n\t *                                                 performance. Default false.\n\t *     @type int          $offset                  The number of posts to offset before retrieval.\n\t *     @type string       $order                   Designates ascending or descending order of posts. Default 'DESC'.\n\t *                                                 Accepts 'ASC', 'DESC'.\n\t *     @type string|array $orderby                 Sort retrieved posts by parameter. One or more options may be\n\t *                                                 passed. To use 'meta_value', or 'meta_value_num',\n\t *                                                 'meta_key=keyname' must be also be defined. To sort by a\n\t *                                                 specific `$meta_query` clause, use that clause's array key.\n\t *                                                 Default 'date'. Accepts 'none', 'name', 'author', 'date',\n\t *                                                 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand',\n\t *                                                 'comment_count', 'meta_value', 'meta_value_num', 'post__in',\n\t *                                                 and the array keys of `$meta_query`.\n\t *     @type int          $p                       Post ID.\n\t *     @type int          $page                    Show the number of posts that would show up on page X of a\n\t *                                                 static front page.\n\t *     @type int          $paged                   The number of the current page.\n\t *     @type int          $page_id                 Page ID.\n\t *     @type string       $pagename                Page slug.\n\t *     @type string       $perm                    Show posts if user has the appropriate capability.\n\t *     @type array        $post__in                An array of post IDs to retrieve, sticky posts will be included\n\t *     @type string       $post_mime_type          The mime type of the post. Used for 'attachment' post_type.\n\t *     @type array        $post__not_in            An array of post IDs not to retrieve. Note: a string of comma-\n\t *                                                 separated IDs will NOT work.\n\t *     @type int          $post_parent             Page ID to retrieve child pages for. Use 0 to only retrieve\n\t *                                                 top-level pages.\n\t *     @type array        $post_parent__in         An array containing parent page IDs to query child pages from.\n\t *     @type array        $post_parent__not_in     An array containing parent page IDs not to query child pages from.\n\t *     @type string|array $post_type               A post type slug (string) or array of post type slugs.\n\t *                                                 Default 'any' if using 'tax_query'.\n\t *     @type string|array $post_status             A post status (string) or array of post statuses.\n\t *     @type int          $posts_per_page          The number of posts to query for. Use -1 to request all posts.\n\t *     @type int          $posts_per_archive_page  The number of posts to query for by archive page. Overrides\n\t *                                                 'posts_per_page' when is_archive(), or is_search() are true.\n\t *     @type array        $post_name__in           An array of post slugs that results must match.\n\t *     @type string       $s                       Search keyword(s). Prepending a term with a hyphen will\n\t *                                                 exclude posts matching that term. Eg, 'pillow -sofa' will\n\t *                                                 return posts containing 'pillow' but not 'sofa'.\n\t *     @type int          $second                  Second of the minute. Default empty. Accepts numbers 0-60.\n\t *     @type bool         $sentence                Whether to search by phrase. Default false.\n\t *     @type bool         $suppress_filters        Whether to suppress filters. Default false.\n\t *     @type string       $tag                     Tag slug. Comma-separated (either), Plus-separated (all).\n\t *     @type array        $tag__and                An array of tag ids (AND in).\n\t *     @type array        $tag__in                 An array of tag ids (OR in).\n\t *     @type array        $tag__not_in             An array of tag ids (NOT in).\n\t *     @type int          $tag_id                  Tag id or comma-separated list of IDs.\n\t *     @type array        $tag_slug__and           An array of tag slugs (AND in).\n\t *     @type array        $tag_slug__in            An array of tag slugs (OR in). unless 'ignore_sticky_posts' is\n\t *                                                 true. Note: a string of comma-separated IDs will NOT work.\n\t *     @type array        $tax_query               An associative array of WP_Tax_Query arguments.\n\t *                                                 {@see WP_Tax_Query->queries}\n\t *     @type string       $title                   Post title.\n\t *     @type bool         $update_post_meta_cache  Whether to update the post meta cache. Default true.\n\t *     @type bool         $update_post_term_cache  Whether to update the post term cache. Default true.\n\t *     @type int          $w                       The week number of the year. Default empty. Accepts numbers 0-53.\n\t *     @type int          $year                    The four-digit year. Default empty. Accepts any four-digit year.\n\t * }\n\t */\n\tpublic function parse_query( $query =  '' ) {\n\t\tif ( ! empty( $query ) ) {\n\t\t\t$this->init();\n\t\t\t$this->query = $this->query_vars = wp_parse_args( $query );\n\t\t} elseif ( ! isset( $this->query ) ) {\n\t\t\t$this->query = $this->query_vars;\n\t\t}\n\n\t\t$this->query_vars = $this->fill_query_vars($this->query_vars);\n\t\t$qv = &$this->query_vars;\n\t\t$this->query_vars_changed = true;\n\n\t\tif ( ! empty($qv['robots']) )\n\t\t\t$this->is_robots = true;\n\n\t\t$qv['p'] =  absint($qv['p']);\n\t\t$qv['page_id'] =  absint($qv['page_id']);\n\t\t$qv['year'] = absint($qv['year']);\n\t\t$qv['monthnum'] = absint($qv['monthnum']);\n\t\t$qv['day'] = absint($qv['day']);\n\t\t$qv['w'] = absint($qv['w']);\n\t\t$qv['m'] = preg_replace( '|[^0-9]|', '', $qv['m'] );\n\t\t$qv['paged'] = absint($qv['paged']);\n\t\t$qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // comma separated list of positive or negative integers\n\t\t$qv['author'] = preg_replace( '|[^0-9,-]|', '', $qv['author'] ); // comma separated list of positive or negative integers\n\t\t$qv['pagename'] = trim( $qv['pagename'] );\n\t\t$qv['name'] = trim( $qv['name'] );\n\t\t$qv['title'] = trim( $qv['title'] );\n\t\tif ( '' !== $qv['hour'] ) $qv['hour'] = absint($qv['hour']);\n\t\tif ( '' !== $qv['minute'] ) $qv['minute'] = absint($qv['minute']);\n\t\tif ( '' !== $qv['second'] ) $qv['second'] = absint($qv['second']);\n\t\tif ( '' !== $qv['menu_order'] ) $qv['menu_order'] = absint($qv['menu_order']);\n\n\t\t// Fairly insane upper bound for search string lengths.\n\t\tif ( ! is_scalar( $qv['s'] ) || ( ! empty( $qv['s'] ) && strlen( $qv['s'] ) > 1600 ) ) {\n\t\t\t$qv['s'] = '';\n\t\t}\n\n\t\t// Compat. Map subpost to attachment.\n\t\tif ( '' != $qv['subpost'] )\n\t\t\t$qv['attachment'] = $qv['subpost'];\n\t\tif ( '' != $qv['subpost_id'] )\n\t\t\t$qv['attachment_id'] = $qv['subpost_id'];\n\n\t\t$qv['attachment_id'] = absint($qv['attachment_id']);\n\n\t\tif ( ('' != $qv['attachment']) || !empty($qv['attachment_id']) ) {\n\t\t\t$this->is_single = true;\n\t\t\t$this->is_attachment = true;\n\t\t} elseif ( '' != $qv['name'] ) {\n\t\t\t$this->is_single = true;\n\t\t} elseif ( $qv['p'] ) {\n\t\t\t$this->is_single = true;\n\t\t} elseif ( ('' !== $qv['hour']) && ('' !== $qv['minute']) &&('' !== $qv['second']) && ('' != $qv['year']) && ('' != $qv['monthnum']) && ('' != $qv['day']) ) {\n\t\t\t// If year, month, day, hour, minute, and second are set, a single\n\t\t\t// post is being queried.\n\t\t\t$this->is_single = true;\n\t\t} elseif ( '' != $qv['static'] || '' != $qv['pagename'] || !empty($qv['page_id']) ) {\n\t\t\t$this->is_page = true;\n\t\t\t$this->is_single = false;\n\t\t} else {\n\t\t\t// Look for archive queries. Dates, categories, authors, search, post type archives.\n\n\t\t\tif ( isset( $this->query['s'] ) ) {\n\t\t\t\t$this->is_search = true;\n\t\t\t}\n\n\t\t\tif ( '' !== $qv['second'] ) {\n\t\t\t\t$this->is_time = true;\n\t\t\t\t$this->is_date = true;\n\t\t\t}\n\n\t\t\tif ( '' !== $qv['minute'] ) {\n\t\t\t\t$this->is_time = true;\n\t\t\t\t$this->is_date = true;\n\t\t\t}\n\n\t\t\tif ( '' !== $qv['hour'] ) {\n\t\t\t\t$this->is_time = true;\n\t\t\t\t$this->is_date = true;\n\t\t\t}\n\n\t\t\tif ( $qv['day'] ) {\n\t\t\t\tif ( ! $this->is_date ) {\n\t\t\t\t\t$date = sprintf( '%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day'] );\n\t\t\t\t\tif ( $qv['monthnum'] && $qv['year'] && ! wp_checkdate( $qv['monthnum'], $qv['day'], $qv['year'], $date ) ) {\n\t\t\t\t\t\t$qv['error'] = '404';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this->is_day = true;\n\t\t\t\t\t\t$this->is_date = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $qv['monthnum'] ) {\n\t\t\t\tif ( ! $this->is_date ) {\n\t\t\t\t\tif ( 12 < $qv['monthnum'] ) {\n\t\t\t\t\t\t$qv['error'] = '404';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this->is_month = true;\n\t\t\t\t\t\t$this->is_date = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $qv['year'] ) {\n\t\t\t\tif ( ! $this->is_date ) {\n\t\t\t\t\t$this->is_year = true;\n\t\t\t\t\t$this->is_date = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $qv['m'] ) {\n\t\t\t\t$this->is_date = true;\n\t\t\t\tif ( strlen($qv['m']) > 9 ) {\n\t\t\t\t\t$this->is_time = true;\n\t\t\t\t} elseif ( strlen( $qv['m'] ) > 7 ) {\n\t\t\t\t\t$this->is_day = true;\n\t\t\t\t} elseif ( strlen( $qv['m'] ) > 5 ) {\n\t\t\t\t\t$this->is_month = true;\n\t\t\t\t} else {\n\t\t\t\t\t$this->is_year = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( '' != $qv['w'] ) {\n\t\t\t\t$this->is_date = true;\n\t\t\t}\n\n\t\t\t$this->query_vars_hash = false;\n\t\t\t$this->parse_tax_query( $qv );\n\n\t\t\tforeach ( $this->tax_query->queries as $tax_query ) {\n\t\t\t\tif ( ! is_array( $tax_query ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( isset( $tax_query['operator'] ) && 'NOT IN' != $tax_query['operator'] ) {\n\t\t\t\t\tswitch ( $tax_query['taxonomy'] ) {\n\t\t\t\t\t\tcase 'category':\n\t\t\t\t\t\t\t$this->is_category = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'post_tag':\n\t\t\t\t\t\t\t$this->is_tag = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t$this->is_tax = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tunset( $tax_query );\n\n\t\t\tif ( empty($qv['author']) || ($qv['author'] == '0') ) {\n\t\t\t\t$this->is_author = false;\n\t\t\t} else {\n\t\t\t\t$this->is_author = true;\n\t\t\t}\n\n\t\t\tif ( '' != $qv['author_name'] )\n\t\t\t\t$this->is_author = true;\n\n\t\t\tif ( !empty( $qv['post_type'] ) && ! is_array( $qv['post_type'] ) ) {\n\t\t\t\t$post_type_obj = get_post_type_object( $qv['post_type'] );\n\t\t\t\tif ( ! empty( $post_type_obj->has_archive ) )\n\t\t\t\t\t$this->is_post_type_archive = true;\n\t\t\t}\n\n\t\t\tif ( $this->is_post_type_archive || $this->is_date || $this->is_author || $this->is_category || $this->is_tag || $this->is_tax )\n\t\t\t\t$this->is_archive = true;\n\t\t}\n\n\t\tif ( '' != $qv['feed'] )\n\t\t\t$this->is_feed = true;\n\n\t\tif ( '' != $qv['tb'] )\n\t\t\t$this->is_trackback = true;\n\n\t\tif ( '' != $qv['paged'] && ( intval($qv['paged']) > 1 ) )\n\t\t\t$this->is_paged = true;\n\n\t\tif ( '' != $qv['comments_popup'] )\n\t\t\t$this->is_comments_popup = true;\n\n\t\t// if we're previewing inside the write screen\n\t\tif ( '' != $qv['preview'] )\n\t\t\t$this->is_preview = true;\n\n\t\tif ( is_admin() )\n\t\t\t$this->is_admin = true;\n\n\t\tif ( false !== strpos($qv['feed'], 'comments-') ) {\n\t\t\t$qv['feed'] = str_replace('comments-', '', $qv['feed']);\n\t\t\t$qv['withcomments'] = 1;\n\t\t}\n\n\t\t$this->is_singular = $this->is_single || $this->is_page || $this->is_attachment;\n\n\t\tif ( $this->is_feed && ( !empty($qv['withcomments']) || ( empty($qv['withoutcomments']) && $this->is_singular ) ) )\n\t\t\t$this->is_comment_feed = true;\n\n\t\tif ( !( $this->is_singular || $this->is_archive || $this->is_search || $this->is_feed || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_comments_popup || $this->is_robots ) )\n\t\t\t$this->is_home = true;\n\n\t\t// Correct is_* for page_on_front and page_for_posts\n\t\tif ( $this->is_home && 'page' == get_option('show_on_front') && get_option('page_on_front') ) {\n\t\t\t$_query = wp_parse_args($this->query);\n\t\t\t// pagename can be set and empty depending on matched rewrite rules. Ignore an empty pagename.\n\t\t\tif ( isset($_query['pagename']) && '' == $_query['pagename'] )\n\t\t\t\tunset($_query['pagename']);\n\t\t\tif ( empty($_query) || !array_diff( array_keys($_query), array('preview', 'page', 'paged', 'cpage') ) ) {\n\t\t\t\t$this->is_page = true;\n\t\t\t\t$this->is_home = false;\n\t\t\t\t$qv['page_id'] = get_option('page_on_front');\n\t\t\t\t// Correct <!--nextpage--> for page_on_front\n\t\t\t\tif ( !empty($qv['paged']) ) {\n\t\t\t\t\t$qv['page'] = $qv['paged'];\n\t\t\t\t\tunset($qv['paged']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( '' != $qv['pagename'] ) {\n\t\t\t$this->queried_object = get_page_by_path( $qv['pagename'] );\n\n\t\t\tif ( $this->queried_object && 'attachment' == $this->queried_object->post_type ) {\n\t\t\t\tif ( preg_match( \"/^[^%]*%(?:postname)%/\", get_option( 'permalink_structure' ) ) ) {\n\t\t\t\t\t// See if we also have a post with the same slug\n\t\t\t\t\t$post = get_page_by_path( $qv['pagename'], OBJECT, 'post' );\n\t\t\t\t\tif ( $post ) {\n\t\t\t\t\t\t$this->queried_object = $post;\n\t\t\t\t\t\t$this->is_page = false;\n\t\t\t\t\t\t$this->is_single = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! empty( $this->queried_object ) ) {\n\t\t\t\t$this->queried_object_id = (int) $this->queried_object->ID;\n\t\t\t} else {\n\t\t\t\tunset( $this->queried_object );\n\t\t\t}\n\n\t\t\tif  ( 'page' == get_option('show_on_front') && isset($this->queried_object_id) && $this->queried_object_id == get_option('page_for_posts') ) {\n\t\t\t\t$this->is_page = false;\n\t\t\t\t$this->is_home = true;\n\t\t\t\t$this->is_posts_page = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( $qv['page_id'] ) {\n\t\t\tif  ( 'page' == get_option('show_on_front') && $qv['page_id'] == get_option('page_for_posts') ) {\n\t\t\t\t$this->is_page = false;\n\t\t\t\t$this->is_home = true;\n\t\t\t\t$this->is_posts_page = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( !empty($qv['post_type']) ) {\n\t\t\tif ( is_array($qv['post_type']) )\n\t\t\t\t$qv['post_type'] = array_map('sanitize_key', $qv['post_type']);\n\t\t\telse\n\t\t\t\t$qv['post_type'] = sanitize_key($qv['post_type']);\n\t\t}\n\n\t\tif ( ! empty( $qv['post_status'] ) ) {\n\t\t\tif ( is_array( $qv['post_status'] ) )\n\t\t\t\t$qv['post_status'] = array_map('sanitize_key', $qv['post_status']);\n\t\t\telse\n\t\t\t\t$qv['post_status'] = preg_replace('|[^a-z0-9_,-]|', '', $qv['post_status']);\n\t\t}\n\n\t\tif ( $this->is_posts_page && ( ! isset($qv['withcomments']) || ! $qv['withcomments'] ) )\n\t\t\t$this->is_comment_feed = false;\n\n\t\t$this->is_singular = $this->is_single || $this->is_page || $this->is_attachment;\n\t\t// Done correcting is_* for page_on_front and page_for_posts\n\n\t\tif ( '404' == $qv['error'] )\n\t\t\t$this->set_404();\n\n\t\t$this->is_embed = isset( $qv['embed'] ) && ( $this->is_singular || $this->is_404 );\n\n\t\t$this->query_vars_hash = md5( serialize( $this->query_vars ) );\n\t\t$this->query_vars_changed = false;\n\n\t\t/**\n\t\t * Fires after the main query vars have been parsed.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t */\n\t\tdo_action_ref_array( 'parse_query', array( &$this ) );\n\t}\n\n\t/**\n\t * Parses various taxonomy related query vars.\n\t *\n\t * For BC, this method is not marked as protected. See [28987].\n\t *\n\t * @access protected\n\t * @since 3.1.0\n\t *\n\t * @param array &$q The query variables\n\t */\n\tpublic function parse_tax_query( &$q ) {\n\t\tif ( ! empty( $q['tax_query'] ) && is_array( $q['tax_query'] ) ) {\n\t\t\t$tax_query = $q['tax_query'];\n\t\t} else {\n\t\t\t$tax_query = array();\n\t\t}\n\n\t\tif ( !empty($q['taxonomy']) && !empty($q['term']) ) {\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => $q['taxonomy'],\n\t\t\t\t'terms' => array( $q['term'] ),\n\t\t\t\t'field' => 'slug',\n\t\t\t);\n\t\t}\n\n\t\tforeach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t ) {\n\t\t\tif ( 'post_tag' == $taxonomy )\n\t\t\t\tcontinue;\t// Handled further down in the $q['tag'] block\n\n\t\t\tif ( $t->query_var && !empty( $q[$t->query_var] ) ) {\n\t\t\t\t$tax_query_defaults = array(\n\t\t\t\t\t'taxonomy' => $taxonomy,\n\t\t\t\t\t'field' => 'slug',\n\t\t\t\t);\n\n \t\t\t\tif ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) {\n\t\t\t\t\t$q[$t->query_var] = wp_basename( $q[$t->query_var] );\n\t\t\t\t}\n\n\t\t\t\t$term = $q[$t->query_var];\n\n\t\t\t\tif ( is_array( $term ) ) {\n\t\t\t\t\t$term = implode( ',', $term );\n\t\t\t\t}\n\n\t\t\t\tif ( strpos($term, '+') !== false ) {\n\t\t\t\t\t$terms = preg_split( '/[+]+/', $term );\n\t\t\t\t\tforeach ( $terms as $term ) {\n\t\t\t\t\t\t$tax_query[] = array_merge( $tax_query_defaults, array(\n\t\t\t\t\t\t\t'terms' => array( $term )\n\t\t\t\t\t\t) );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$tax_query[] = array_merge( $tax_query_defaults, array(\n\t\t\t\t\t\t'terms' => preg_split( '/[,]+/', $term )\n\t\t\t\t\t) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If querystring 'cat' is an array, implode it.\n\t\tif ( is_array( $q['cat'] ) ) {\n\t\t\t$q['cat'] = implode( ',', $q['cat'] );\n\t\t}\n\n\t\t// Category stuff\n\t\tif ( ! empty( $q['cat'] ) && ! $this->is_singular ) {\n\t\t\t$cat_in = $cat_not_in = array();\n\n\t\t\t$cat_array = preg_split( '/[,\\s]+/', urldecode( $q['cat'] ) );\n\t\t\t$cat_array = array_map( 'intval', $cat_array );\n\t\t\t$q['cat'] = implode( ',', $cat_array );\n\n\t\t\tforeach ( $cat_array as $cat ) {\n\t\t\t\tif ( $cat > 0 )\n\t\t\t\t\t$cat_in[] = $cat;\n\t\t\t\telseif ( $cat < 0 )\n\t\t\t\t\t$cat_not_in[] = abs( $cat );\n\t\t\t}\n\n\t\t\tif ( ! empty( $cat_in ) ) {\n\t\t\t\t$tax_query[] = array(\n\t\t\t\t\t'taxonomy' => 'category',\n\t\t\t\t\t'terms' => $cat_in,\n\t\t\t\t\t'field' => 'term_id',\n\t\t\t\t\t'include_children' => true\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif ( ! empty( $cat_not_in ) ) {\n\t\t\t\t$tax_query[] = array(\n\t\t\t\t\t'taxonomy' => 'category',\n\t\t\t\t\t'terms' => $cat_not_in,\n\t\t\t\t\t'field' => 'term_id',\n\t\t\t\t\t'operator' => 'NOT IN',\n\t\t\t\t\t'include_children' => true\n\t\t\t\t);\n\t\t\t}\n\t\t\tunset( $cat_array, $cat_in, $cat_not_in );\n\t\t}\n\n\t\tif ( ! empty( $q['category__and'] ) && 1 === count( (array) $q['category__and'] ) ) {\n\t\t\t$q['category__and'] = (array) $q['category__and'];\n\t\t\tif ( ! isset( $q['category__in'] ) )\n\t\t\t\t$q['category__in'] = array();\n\t\t\t$q['category__in'][] = absint( reset( $q['category__and'] ) );\n\t\t\tunset( $q['category__and'] );\n\t\t}\n\n\t\tif ( ! empty( $q['category__in'] ) ) {\n\t\t\t$q['category__in'] = array_map( 'absint', array_unique( (array) $q['category__in'] ) );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'category',\n\t\t\t\t'terms' => $q['category__in'],\n\t\t\t\t'field' => 'term_id',\n\t\t\t\t'include_children' => false\n\t\t\t);\n\t\t}\n\n\t\tif ( ! empty($q['category__not_in']) ) {\n\t\t\t$q['category__not_in'] = array_map( 'absint', array_unique( (array) $q['category__not_in'] ) );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'category',\n\t\t\t\t'terms' => $q['category__not_in'],\n\t\t\t\t'operator' => 'NOT IN',\n\t\t\t\t'include_children' => false\n\t\t\t);\n\t\t}\n\n\t\tif ( ! empty($q['category__and']) ) {\n\t\t\t$q['category__and'] = array_map( 'absint', array_unique( (array) $q['category__and'] ) );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'category',\n\t\t\t\t'terms' => $q['category__and'],\n\t\t\t\t'field' => 'term_id',\n\t\t\t\t'operator' => 'AND',\n\t\t\t\t'include_children' => false\n\t\t\t);\n\t\t}\n\n\t\t// If querystring 'tag' is array, implode it.\n\t\tif ( is_array( $q['tag'] ) ) {\n\t\t\t$q['tag'] = implode( ',', $q['tag'] );\n\t\t}\n\n\t\t// Tag stuff\n\t\tif ( '' != $q['tag'] && !$this->is_singular && $this->query_vars_changed ) {\n\t\t\tif ( strpos($q['tag'], ',') !== false ) {\n\t\t\t\t$tags = preg_split('/[,\\r\\n\\t ]+/', $q['tag']);\n\t\t\t\tforeach ( (array) $tags as $tag ) {\n\t\t\t\t\t$tag = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db');\n\t\t\t\t\t$q['tag_slug__in'][] = $tag;\n\t\t\t\t}\n\t\t\t} elseif ( preg_match('/[+\\r\\n\\t ]+/', $q['tag'] ) || ! empty( $q['cat'] ) ) {\n\t\t\t\t$tags = preg_split('/[+\\r\\n\\t ]+/', $q['tag']);\n\t\t\t\tforeach ( (array) $tags as $tag ) {\n\t\t\t\t\t$tag = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db');\n\t\t\t\t\t$q['tag_slug__and'][] = $tag;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$q['tag'] = sanitize_term_field('slug', $q['tag'], 0, 'post_tag', 'db');\n\t\t\t\t$q['tag_slug__in'][] = $q['tag'];\n\t\t\t}\n\t\t}\n\n\t\tif ( !empty($q['tag_id']) ) {\n\t\t\t$q['tag_id'] = absint( $q['tag_id'] );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'post_tag',\n\t\t\t\t'terms' => $q['tag_id']\n\t\t\t);\n\t\t}\n\n\t\tif ( !empty($q['tag__in']) ) {\n\t\t\t$q['tag__in'] = array_map('absint', array_unique( (array) $q['tag__in'] ) );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'post_tag',\n\t\t\t\t'terms' => $q['tag__in']\n\t\t\t);\n\t\t}\n\n\t\tif ( !empty($q['tag__not_in']) ) {\n\t\t\t$q['tag__not_in'] = array_map('absint', array_unique( (array) $q['tag__not_in'] ) );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'post_tag',\n\t\t\t\t'terms' => $q['tag__not_in'],\n\t\t\t\t'operator' => 'NOT IN'\n\t\t\t);\n\t\t}\n\n\t\tif ( !empty($q['tag__and']) ) {\n\t\t\t$q['tag__and'] = array_map('absint', array_unique( (array) $q['tag__and'] ) );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'post_tag',\n\t\t\t\t'terms' => $q['tag__and'],\n\t\t\t\t'operator' => 'AND'\n\t\t\t);\n\t\t}\n\n\t\tif ( !empty($q['tag_slug__in']) ) {\n\t\t\t$q['tag_slug__in'] = array_map('sanitize_title_for_query', array_unique( (array) $q['tag_slug__in'] ) );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'post_tag',\n\t\t\t\t'terms' => $q['tag_slug__in'],\n\t\t\t\t'field' => 'slug'\n\t\t\t);\n\t\t}\n\n\t\tif ( !empty($q['tag_slug__and']) ) {\n\t\t\t$q['tag_slug__and'] = array_map('sanitize_title_for_query', array_unique( (array) $q['tag_slug__and'] ) );\n\t\t\t$tax_query[] = array(\n\t\t\t\t'taxonomy' => 'post_tag',\n\t\t\t\t'terms' => $q['tag_slug__and'],\n\t\t\t\t'field' => 'slug',\n\t\t\t\t'operator' => 'AND'\n\t\t\t);\n\t\t}\n\n\t\t$this->tax_query = new WP_Tax_Query( $tax_query );\n\n\t\t/**\n\t\t * Fires after taxonomy-related query vars have been parsed.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param WP_Query $this The WP_Query instance.\n\t\t */\n\t\tdo_action( 'parse_tax_query', $this );\n\t}\n\n\t/**\n\t * Generate SQL for the WHERE clause based on passed search terms.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param array $q Query variables.\n\t * @return string WHERE clause.\n\t */\n\tprotected function parse_search( &$q ) {\n\t\tglobal $wpdb;\n\n\t\t$search = '';\n\n\t\t// added slashes screw with quote grouping when done early, so done later\n\t\t$q['s'] = stripslashes( $q['s'] );\n\t\tif ( empty( $_GET['s'] ) && $this->is_main_query() )\n\t\t\t$q['s'] = urldecode( $q['s'] );\n\t\t// there are no line breaks in <input /> fields\n\t\t$q['s'] = str_replace( array( \"\\r\", \"\\n\" ), '', $q['s'] );\n\t\t$q['search_terms_count'] = 1;\n\t\tif ( ! empty( $q['sentence'] ) ) {\n\t\t\t$q['search_terms'] = array( $q['s'] );\n\t\t} else {\n\t\t\tif ( preg_match_all( '/\".*?(\"|$)|((?<=[\\t \",+])|^)[^\\t \",+]+/', $q['s'], $matches ) ) {\n\t\t\t\t$q['search_terms_count'] = count( $matches[0] );\n\t\t\t\t$q['search_terms'] = $this->parse_search_terms( $matches[0] );\n\t\t\t\t// if the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence\n\t\t\t\tif ( empty( $q['search_terms'] ) || count( $q['search_terms'] ) > 9 )\n\t\t\t\t\t$q['search_terms'] = array( $q['s'] );\n\t\t\t} else {\n\t\t\t\t$q['search_terms'] = array( $q['s'] );\n\t\t\t}\n\t\t}\n\n\t\t$n = ! empty( $q['exact'] ) ? '' : '%';\n\t\t$searchand = '';\n\t\t$q['search_orderby_title'] = array();\n\t\tforeach ( $q['search_terms'] as $term ) {\n\t\t\t// Terms prefixed with '-' should be excluded.\n\t\t\t$include = '-' !== substr( $term, 0, 1 );\n\t\t\tif ( $include ) {\n\t\t\t\t$like_op  = 'LIKE';\n\t\t\t\t$andor_op = 'OR';\n\t\t\t} else {\n\t\t\t\t$like_op  = 'NOT LIKE';\n\t\t\t\t$andor_op = 'AND';\n\t\t\t\t$term     = substr( $term, 1 );\n\t\t\t}\n\n\t\t\tif ( $n && $include ) {\n\t\t\t\t$like = '%' . $wpdb->esc_like( $term ) . '%';\n\t\t\t\t$q['search_orderby_title'][] = $wpdb->prepare( \"$wpdb->posts.post_title LIKE %s\", $like );\n\t\t\t}\n\n\t\t\t$like = $n . $wpdb->esc_like( $term ) . $n;\n\t\t\t$search .= $wpdb->prepare( \"{$searchand}(($wpdb->posts.post_title $like_op %s) $andor_op ($wpdb->posts.post_content $like_op %s))\", $like, $like );\n\t\t\t$searchand = ' AND ';\n\t\t}\n\n\t\tif ( ! empty( $search ) ) {\n\t\t\t$search = \" AND ({$search}) \";\n\t\t\tif ( ! is_user_logged_in() )\n\t\t\t\t$search .= \" AND ($wpdb->posts.post_password = '') \";\n\t\t}\n\n\t\treturn $search;\n\t}\n\n\t/**\n\t * Check if the terms are suitable for searching.\n\t *\n\t * Uses an array of stopwords (terms) that are excluded from the separate\n\t * term matching when searching for posts. The list of English stopwords is\n\t * the approximate search engines list, and is translatable.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param array $terms Terms to check.\n\t * @return array Terms that are not stopwords.\n\t */\n\tprotected function parse_search_terms( $terms ) {\n\t\t$strtolower = function_exists( 'mb_strtolower' ) ? 'mb_strtolower' : 'strtolower';\n\t\t$checked = array();\n\n\t\t$stopwords = $this->get_search_stopwords();\n\n\t\tforeach ( $terms as $term ) {\n\t\t\t// keep before/after spaces when term is for exact match\n\t\t\tif ( preg_match( '/^\".+\"$/', $term ) )\n\t\t\t\t$term = trim( $term, \"\\\"'\" );\n\t\t\telse\n\t\t\t\t$term = trim( $term, \"\\\"' \" );\n\n\t\t\t// Avoid single A-Z.\n\t\t\tif ( ! $term || ( 1 === strlen( $term ) && preg_match( '/^[a-z]$/i', $term ) ) )\n\t\t\t\tcontinue;\n\n\t\t\tif ( in_array( call_user_func( $strtolower, $term ), $stopwords, true ) )\n\t\t\t\tcontinue;\n\n\t\t\t$checked[] = $term;\n\t\t}\n\n\t\treturn $checked;\n\t}\n\n\t/**\n\t * Retrieve stopwords used when parsing search terms.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @return array Stopwords.\n\t */\n\tprotected function get_search_stopwords() {\n\t\tif ( isset( $this->stopwords ) )\n\t\t\treturn $this->stopwords;\n\n\t\t/* translators: This is a comma-separated list of very common words that should be excluded from a search,\n\t\t * like a, an, and the. These are usually called \"stopwords\". You should not simply translate these individual\n\t\t * words into your language. Instead, look for and provide commonly accepted stopwords in your language.\n\t\t */\n\t\t$words = explode( ',', _x( 'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www',\n\t\t\t'Comma-separated list of search stopwords in your language' ) );\n\n\t\t$stopwords = array();\n\t\tforeach ( $words as $word ) {\n\t\t\t$word = trim( $word, \"\\r\\n\\t \" );\n\t\t\tif ( $word )\n\t\t\t\t$stopwords[] = $word;\n\t\t}\n\n\t\t/**\n\t\t * Filter stopwords used when parsing search terms.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param array $stopwords Stopwords.\n\t\t */\n\t\t$this->stopwords = apply_filters( 'wp_search_stopwords', $stopwords );\n\t\treturn $this->stopwords;\n\t}\n\n\t/**\n\t * Generate SQL for the ORDER BY condition based on passed search terms.\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param array $q Query variables.\n\t * @return string ORDER BY clause.\n\t */\n\tprotected function parse_search_order( &$q ) {\n\t\tglobal $wpdb;\n\n\t\tif ( $q['search_terms_count'] > 1 ) {\n\t\t\t$num_terms = count( $q['search_orderby_title'] );\n\n\t\t\t// If the search terms contain negative queries, don't bother ordering by sentence matches.\n\t\t\t$like = '';\n\t\t\tif ( ! preg_match( '/(?:\\s|^)\\-/', $q['s'] ) ) {\n\t\t\t\t$like = '%' . $wpdb->esc_like( $q['s'] ) . '%';\n\t\t\t}\n\n\t\t\t$search_orderby = '';\n\n\t\t\t// sentence match in 'post_title'\n\t\t\tif ( $like ) {\n\t\t\t\t$search_orderby .= $wpdb->prepare( \"WHEN $wpdb->posts.post_title LIKE %s THEN 1 \", $like );\n\t\t\t}\n\n\t\t\t// sanity limit, sort as sentence when more than 6 terms\n\t\t\t// (few searches are longer than 6 terms and most titles are not)\n\t\t\tif ( $num_terms < 7 ) {\n\t\t\t\t// all words in title\n\t\t\t\t$search_orderby .= 'WHEN ' . implode( ' AND ', $q['search_orderby_title'] ) . ' THEN 2 ';\n\t\t\t\t// any word in title, not needed when $num_terms == 1\n\t\t\t\tif ( $num_terms > 1 )\n\t\t\t\t\t$search_orderby .= 'WHEN ' . implode( ' OR ', $q['search_orderby_title'] ) . ' THEN 3 ';\n\t\t\t}\n\n\t\t\t// sentence match in 'post_content'\n\t\t\tif ( $like ) {\n\t\t\t\t$search_orderby .= $wpdb->prepare( \"WHEN $wpdb->posts.post_content LIKE %s THEN 4 \", $like );\n\t\t\t}\n\n\t\t\tif ( $search_orderby ) {\n\t\t\t\t$search_orderby = '(CASE ' . $search_orderby . 'ELSE 5 END)';\n\t\t\t}\n\t\t} else {\n\t\t\t// single word or sentence search\n\t\t\t$search_orderby = reset( $q['search_orderby_title'] ) . ' DESC';\n\t\t}\n\n\t\treturn $search_orderby;\n\t}\n\n\t/**\n\t * If the passed orderby value is allowed, convert the alias to a\n\t * properly-prefixed orderby value.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @param string $orderby Alias for the field to order by.\n\t * @return string|false Table-prefixed value to used in the ORDER clause. False otherwise.\n\t */\n\tprotected function parse_orderby( $orderby ) {\n\t\tglobal $wpdb;\n\n\t\t// Used to filter values.\n\t\t$allowed_keys = array(\n\t\t\t'post_name', 'post_author', 'post_date', 'post_title', 'post_modified',\n\t\t\t'post_parent', 'post_type', 'name', 'author', 'date', 'title', 'modified',\n\t\t\t'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand',\n\t\t);\n\n\t\t$primary_meta_key = '';\n\t\t$primary_meta_query = false;\n\t\t$meta_clauses = $this->meta_query->get_clauses();\n\t\tif ( ! empty( $meta_clauses ) ) {\n\t\t\t$primary_meta_query = reset( $meta_clauses );\n\n\t\t\tif ( ! empty( $primary_meta_query['key'] ) ) {\n\t\t\t\t$primary_meta_key = $primary_meta_query['key'];\n\t\t\t\t$allowed_keys[] = $primary_meta_key;\n\t\t\t}\n\n\t\t\t$allowed_keys[] = 'meta_value';\n\t\t\t$allowed_keys[] = 'meta_value_num';\n\t\t\t$allowed_keys   = array_merge( $allowed_keys, array_keys( $meta_clauses ) );\n\t\t}\n\n\t\tif ( ! in_array( $orderby, $allowed_keys, true ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tswitch ( $orderby ) {\n\t\t\tcase 'post_name':\n\t\t\tcase 'post_author':\n\t\t\tcase 'post_date':\n\t\t\tcase 'post_title':\n\t\t\tcase 'post_modified':\n\t\t\tcase 'post_parent':\n\t\t\tcase 'post_type':\n\t\t\tcase 'ID':\n\t\t\tcase 'menu_order':\n\t\t\tcase 'comment_count':\n\t\t\t\t$orderby_clause = \"$wpdb->posts.{$orderby}\";\n\t\t\t\tbreak;\n\t\t\tcase 'rand':\n\t\t\t\t$orderby_clause = 'RAND()';\n\t\t\t\tbreak;\n\t\t\tcase $primary_meta_key:\n\t\t\tcase 'meta_value':\n\t\t\t\tif ( ! empty( $primary_meta_query['type'] ) ) {\n\t\t\t\t\t$orderby_clause = \"CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})\";\n\t\t\t\t} else {\n\t\t\t\t\t$orderby_clause = \"{$primary_meta_query['alias']}.meta_value\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'meta_value_num':\n\t\t\t\t$orderby_clause = \"{$primary_meta_query['alias']}.meta_value+0\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif ( array_key_exists( $orderby, $meta_clauses ) ) {\n\t\t\t\t\t// $orderby corresponds to a meta_query clause.\n\t\t\t\t\t$meta_clause = $meta_clauses[ $orderby ];\n\t\t\t\t\t$orderby_clause = \"CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})\";\n\t\t\t\t} else {\n\t\t\t\t\t// Default: order by post field.\n\t\t\t\t\t$orderby_clause = \"$wpdb->posts.post_\" . sanitize_key( $orderby );\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn $orderby_clause;\n\t}\n\n\t/**\n\t * Parse an 'order' query variable and cast it to ASC or DESC as necessary.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param string $order The 'order' query variable.\n\t * @return string The sanitized 'order' query variable.\n\t */\n\tprotected function parse_order( $order ) {\n\t\tif ( ! is_string( $order ) || empty( $order ) ) {\n\t\t\treturn 'DESC';\n\t\t}\n\n\t\tif ( 'ASC' === strtoupper( $order ) ) {\n\t\t\treturn 'ASC';\n\t\t} else {\n\t\t\treturn 'DESC';\n\t\t}\n\t}\n\n\t/**\n\t * Sets the 404 property and saves whether query is feed.\n\t *\n\t * @since 2.0.0\n\t * @access public\n\t */\n\tpublic function set_404() {\n\t\t$is_feed = $this->is_feed;\n\n\t\t$this->init_query_flags();\n\t\t$this->is_404 = true;\n\n\t\t$this->is_feed = $is_feed;\n\t}\n\n\t/**\n\t * Retrieve query variable.\n\t *\n\t * @since 1.5.0\n\t * @since 3.9.0 The `$default` argument was introduced.\n\t *\n\t * @access public\n\t *\n\t * @param string $query_var Query variable key.\n\t * @param mixed  $default   Optional. Value to return if the query variable is not set. Default empty.\n\t * @return mixed Contents of the query variable.\n\t */\n\tpublic function get( $query_var, $default = '' ) {\n\t\tif ( isset( $this->query_vars[ $query_var ] ) ) {\n\t\t\treturn $this->query_vars[ $query_var ];\n\t\t}\n\n\t\treturn $default;\n\t}\n\n\t/**\n\t * Set query variable.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @param string $query_var Query variable key.\n\t * @param mixed  $value     Query variable value.\n\t */\n\tpublic function set($query_var, $value) {\n\t\t$this->query_vars[$query_var] = $value;\n\t}\n\n\t/**\n\t * Retrieve the posts based on query variables.\n\t *\n\t * There are a few filters and actions that can be used to modify the post\n\t * database query.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t *\n\t * @return array List of posts.\n\t */\n\tpublic function get_posts() {\n\t\tglobal $wpdb;\n\n\t\t$this->parse_query();\n\n\t\t/**\n\t\t * Fires after the query variable object is created, but before the actual query is run.\n\t\t *\n\t\t * Note: If using conditional tags, use the method versions within the passed instance\n\t\t * (e.g. $this->is_main_query() instead of is_main_query()). This is because the functions\n\t\t * like is_main_query() test against the global $wp_query instance, not the passed one.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t */\n\t\tdo_action_ref_array( 'pre_get_posts', array( &$this ) );\n\n\t\t// Shorthand.\n\t\t$q = &$this->query_vars;\n\n\t\t// Fill again in case pre_get_posts unset some vars.\n\t\t$q = $this->fill_query_vars($q);\n\n\t\t// Parse meta query\n\t\t$this->meta_query = new WP_Meta_Query();\n\t\t$this->meta_query->parse_query_vars( $q );\n\n\t\t// Set a flag if a pre_get_posts hook changed the query vars.\n\t\t$hash = md5( serialize( $this->query_vars ) );\n\t\tif ( $hash != $this->query_vars_hash ) {\n\t\t\t$this->query_vars_changed = true;\n\t\t\t$this->query_vars_hash = $hash;\n\t\t}\n\t\tunset($hash);\n\n\t\t// First let's clear some variables\n\t\t$distinct = '';\n\t\t$whichauthor = '';\n\t\t$whichmimetype = '';\n\t\t$where = '';\n\t\t$limits = '';\n\t\t$join = '';\n\t\t$search = '';\n\t\t$groupby = '';\n\t\t$post_status_join = false;\n\t\t$page = 1;\n\n\t\tif ( isset( $q['caller_get_posts'] ) ) {\n\t\t\t_deprecated_argument( 'WP_Query', '3.1', __( '\"caller_get_posts\" is deprecated. Use \"ignore_sticky_posts\" instead.' ) );\n\t\t\tif ( !isset( $q['ignore_sticky_posts'] ) )\n\t\t\t\t$q['ignore_sticky_posts'] = $q['caller_get_posts'];\n\t\t}\n\n\t\tif ( !isset( $q['ignore_sticky_posts'] ) )\n\t\t\t$q['ignore_sticky_posts'] = false;\n\n\t\tif ( !isset($q['suppress_filters']) )\n\t\t\t$q['suppress_filters'] = false;\n\n\t\tif ( !isset($q['cache_results']) ) {\n\t\t\tif ( wp_using_ext_object_cache() )\n\t\t\t\t$q['cache_results'] = false;\n\t\t\telse\n\t\t\t\t$q['cache_results'] = true;\n\t\t}\n\n\t\tif ( !isset($q['update_post_term_cache']) )\n\t\t\t$q['update_post_term_cache'] = true;\n\n\t\tif ( !isset($q['update_post_meta_cache']) )\n\t\t\t$q['update_post_meta_cache'] = true;\n\n\t\tif ( !isset($q['post_type']) ) {\n\t\t\tif ( $this->is_search )\n\t\t\t\t$q['post_type'] = 'any';\n\t\t\telse\n\t\t\t\t$q['post_type'] = '';\n\t\t}\n\t\t$post_type = $q['post_type'];\n\t\tif ( empty( $q['posts_per_page'] ) ) {\n\t\t\t$q['posts_per_page'] = get_option( 'posts_per_page' );\n\t\t}\n\t\tif ( isset($q['showposts']) && $q['showposts'] ) {\n\t\t\t$q['showposts'] = (int) $q['showposts'];\n\t\t\t$q['posts_per_page'] = $q['showposts'];\n\t\t}\n\t\tif ( (isset($q['posts_per_archive_page']) && $q['posts_per_archive_page'] != 0) && ($this->is_archive || $this->is_search) )\n\t\t\t$q['posts_per_page'] = $q['posts_per_archive_page'];\n\t\tif ( !isset($q['nopaging']) ) {\n\t\t\tif ( $q['posts_per_page'] == -1 ) {\n\t\t\t\t$q['nopaging'] = true;\n\t\t\t} else {\n\t\t\t\t$q['nopaging'] = false;\n\t\t\t}\n\t\t}\n\n\t\tif ( $this->is_feed ) {\n\t\t\t// This overrides posts_per_page.\n\t\t\tif ( ! empty( $q['posts_per_rss'] ) ) {\n\t\t\t\t$q['posts_per_page'] = $q['posts_per_rss'];\n\t\t\t} else {\n\t\t\t\t$q['posts_per_page'] = get_option( 'posts_per_rss' );\n\t\t\t}\n\t\t\t$q['nopaging'] = false;\n\t\t}\n\t\t$q['posts_per_page'] = (int) $q['posts_per_page'];\n\t\tif ( $q['posts_per_page'] < -1 )\n\t\t\t$q['posts_per_page'] = abs($q['posts_per_page']);\n\t\telseif ( $q['posts_per_page'] == 0 )\n\t\t\t$q['posts_per_page'] = 1;\n\n\t\tif ( !isset($q['comments_per_page']) || $q['comments_per_page'] == 0 )\n\t\t\t$q['comments_per_page'] = get_option('comments_per_page');\n\n\t\tif ( $this->is_home && (empty($this->query) || $q['preview'] == 'true') && ( 'page' == get_option('show_on_front') ) && get_option('page_on_front') ) {\n\t\t\t$this->is_page = true;\n\t\t\t$this->is_home = false;\n\t\t\t$q['page_id'] = get_option('page_on_front');\n\t\t}\n\n\t\tif ( isset($q['page']) ) {\n\t\t\t$q['page'] = trim($q['page'], '/');\n\t\t\t$q['page'] = absint($q['page']);\n\t\t}\n\n\t\t// If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present.\n\t\tif ( isset($q['no_found_rows']) )\n\t\t\t$q['no_found_rows'] = (bool) $q['no_found_rows'];\n\t\telse\n\t\t\t$q['no_found_rows'] = false;\n\n\t\tswitch ( $q['fields'] ) {\n\t\t\tcase 'ids':\n\t\t\t\t$fields = \"$wpdb->posts.ID\";\n\t\t\t\tbreak;\n\t\t\tcase 'id=>parent':\n\t\t\t\t$fields = \"$wpdb->posts.ID, $wpdb->posts.post_parent\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$fields = \"$wpdb->posts.*\";\n\t\t}\n\n\t\tif ( '' !== $q['menu_order'] )\n\t\t\t$where .= \" AND $wpdb->posts.menu_order = \" . $q['menu_order'];\n\n\t\t// The \"m\" parameter is meant for months but accepts datetimes of varying specificity\n\t\tif ( $q['m'] ) {\n\t\t\t$where .= \" AND YEAR($wpdb->posts.post_date)=\" . substr($q['m'], 0, 4);\n\t\t\tif ( strlen($q['m']) > 5 )\n\t\t\t\t$where .= \" AND MONTH($wpdb->posts.post_date)=\" . substr($q['m'], 4, 2);\n\t\t\tif ( strlen($q['m']) > 7 )\n\t\t\t\t$where .= \" AND DAYOFMONTH($wpdb->posts.post_date)=\" . substr($q['m'], 6, 2);\n\t\t\tif ( strlen($q['m']) > 9 )\n\t\t\t\t$where .= \" AND HOUR($wpdb->posts.post_date)=\" . substr($q['m'], 8, 2);\n\t\t\tif ( strlen($q['m']) > 11 )\n\t\t\t\t$where .= \" AND MINUTE($wpdb->posts.post_date)=\" . substr($q['m'], 10, 2);\n\t\t\tif ( strlen($q['m']) > 13 )\n\t\t\t\t$where .= \" AND SECOND($wpdb->posts.post_date)=\" . substr($q['m'], 12, 2);\n\t\t}\n\n\t\t// Handle the other individual date parameters\n\t\t$date_parameters = array();\n\n\t\tif ( '' !== $q['hour'] )\n\t\t\t$date_parameters['hour'] = $q['hour'];\n\n\t\tif ( '' !== $q['minute'] )\n\t\t\t$date_parameters['minute'] = $q['minute'];\n\n\t\tif ( '' !== $q['second'] )\n\t\t\t$date_parameters['second'] = $q['second'];\n\n\t\tif ( $q['year'] )\n\t\t\t$date_parameters['year'] = $q['year'];\n\n\t\tif ( $q['monthnum'] )\n\t\t\t$date_parameters['monthnum'] = $q['monthnum'];\n\n\t\tif ( $q['w'] )\n\t\t\t$date_parameters['week'] = $q['w'];\n\n\t\tif ( $q['day'] )\n\t\t\t$date_parameters['day'] = $q['day'];\n\n\t\tif ( $date_parameters ) {\n\t\t\t$date_query = new WP_Date_Query( array( $date_parameters ) );\n\t\t\t$where .= $date_query->get_sql();\n\t\t}\n\t\tunset( $date_parameters, $date_query );\n\n\t\t// Handle complex date queries\n\t\tif ( ! empty( $q['date_query'] ) ) {\n\t\t\t$this->date_query = new WP_Date_Query( $q['date_query'] );\n\t\t\t$where .= $this->date_query->get_sql();\n\t\t}\n\n\n\t\t// If we've got a post_type AND it's not \"any\" post_type.\n\t\tif ( !empty($q['post_type']) && 'any' != $q['post_type'] ) {\n\t\t\tforeach ( (array)$q['post_type'] as $_post_type ) {\n\t\t\t\t$ptype_obj = get_post_type_object($_post_type);\n\t\t\t\tif ( !$ptype_obj || !$ptype_obj->query_var || empty($q[ $ptype_obj->query_var ]) )\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif ( ! $ptype_obj->hierarchical ) {\n\t\t\t\t\t// Non-hierarchical post types can directly use 'name'.\n\t\t\t\t\t$q['name'] = $q[ $ptype_obj->query_var ];\n\t\t\t\t} else {\n\t\t\t\t\t// Hierarchical post types will operate through 'pagename'.\n\t\t\t\t\t$q['pagename'] = $q[ $ptype_obj->query_var ];\n\t\t\t\t\t$q['name'] = '';\n\t\t\t\t}\n\n\t\t\t\t// Only one request for a slug is possible, this is why name & pagename are overwritten above.\n\t\t\t\tbreak;\n\t\t\t} //end foreach\n\t\t\tunset($ptype_obj);\n\t\t}\n\n\t\tif ( '' !== $q['title'] ) {\n\t\t\t$where .= $wpdb->prepare( \" AND $wpdb->posts.post_title = %s\", stripslashes( $q['title'] ) );\n\t\t}\n\n\t\t// Parameters related to 'post_name'.\n\t\tif ( '' != $q['name'] ) {\n\t\t\t$q['name'] = sanitize_title_for_query( $q['name'] );\n\t\t\t$where .= \" AND $wpdb->posts.post_name = '\" . $q['name'] . \"'\";\n\t\t} elseif ( '' != $q['pagename'] ) {\n\t\t\tif ( isset($this->queried_object_id) ) {\n\t\t\t\t$reqpage = $this->queried_object_id;\n\t\t\t} else {\n\t\t\t\tif ( 'page' != $q['post_type'] ) {\n\t\t\t\t\tforeach ( (array)$q['post_type'] as $_post_type ) {\n\t\t\t\t\t\t$ptype_obj = get_post_type_object($_post_type);\n\t\t\t\t\t\tif ( !$ptype_obj || !$ptype_obj->hierarchical )\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t$reqpage = get_page_by_path($q['pagename'], OBJECT, $_post_type);\n\t\t\t\t\t\tif ( $reqpage )\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tunset($ptype_obj);\n\t\t\t\t} else {\n\t\t\t\t\t$reqpage = get_page_by_path($q['pagename']);\n\t\t\t\t}\n\t\t\t\tif ( !empty($reqpage) )\n\t\t\t\t\t$reqpage = $reqpage->ID;\n\t\t\t\telse\n\t\t\t\t\t$reqpage = 0;\n\t\t\t}\n\n\t\t\t$page_for_posts = get_option('page_for_posts');\n\t\t\tif  ( ('page' != get_option('show_on_front') ) || empty($page_for_posts) || ( $reqpage != $page_for_posts ) ) {\n\t\t\t\t$q['pagename'] = sanitize_title_for_query( wp_basename( $q['pagename'] ) );\n\t\t\t\t$q['name'] = $q['pagename'];\n\t\t\t\t$where .= \" AND ($wpdb->posts.ID = '$reqpage')\";\n\t\t\t\t$reqpage_obj = get_post( $reqpage );\n\t\t\t\tif ( is_object($reqpage_obj) && 'attachment' == $reqpage_obj->post_type ) {\n\t\t\t\t\t$this->is_attachment = true;\n\t\t\t\t\t$post_type = $q['post_type'] = 'attachment';\n\t\t\t\t\t$this->is_page = true;\n\t\t\t\t\t$q['attachment_id'] = $reqpage;\n\t\t\t\t}\n\t\t\t}\n\t\t} elseif ( '' != $q['attachment'] ) {\n\t\t\t$q['attachment'] = sanitize_title_for_query( wp_basename( $q['attachment'] ) );\n\t\t\t$q['name'] = $q['attachment'];\n\t\t\t$where .= \" AND $wpdb->posts.post_name = '\" . $q['attachment'] . \"'\";\n\t\t} elseif ( is_array( $q['post_name__in'] ) && ! empty( $q['post_name__in'] ) ) {\n\t\t\t$q['post_name__in'] = array_map( 'sanitize_title_for_query', $q['post_name__in'] );\n\t\t\t$where .= \" AND $wpdb->posts.post_name IN ('\" . implode( \"' ,'\", $q['post_name__in'] ) . \"')\";\n\t\t}\n\n\t\tif ( intval($q['comments_popup']) )\n\t\t\t$q['p'] = absint($q['comments_popup']);\n\n\t\t// If an attachment is requested by number, let it supersede any post number.\n\t\tif ( $q['attachment_id'] )\n\t\t\t$q['p'] = absint($q['attachment_id']);\n\n\t\t// If a post number is specified, load that post\n\t\tif ( $q['p'] ) {\n\t\t\t$where .= \" AND {$wpdb->posts}.ID = \" . $q['p'];\n\t\t} elseif ( $q['post__in'] ) {\n\t\t\t$post__in = implode(',', array_map( 'absint', $q['post__in'] ));\n\t\t\t$where .= \" AND {$wpdb->posts}.ID IN ($post__in)\";\n\t\t} elseif ( $q['post__not_in'] ) {\n\t\t\t$post__not_in = implode(',',  array_map( 'absint', $q['post__not_in'] ));\n\t\t\t$where .= \" AND {$wpdb->posts}.ID NOT IN ($post__not_in)\";\n\t\t}\n\n\t\tif ( is_numeric( $q['post_parent'] ) ) {\n\t\t\t$where .= $wpdb->prepare( \" AND $wpdb->posts.post_parent = %d \", $q['post_parent'] );\n\t\t} elseif ( $q['post_parent__in'] ) {\n\t\t\t$post_parent__in = implode( ',', array_map( 'absint', $q['post_parent__in'] ) );\n\t\t\t$where .= \" AND {$wpdb->posts}.post_parent IN ($post_parent__in)\";\n\t\t} elseif ( $q['post_parent__not_in'] ) {\n\t\t\t$post_parent__not_in = implode( ',',  array_map( 'absint', $q['post_parent__not_in'] ) );\n\t\t\t$where .= \" AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)\";\n\t\t}\n\n\t\tif ( $q['page_id'] ) {\n\t\t\tif  ( ('page' != get_option('show_on_front') ) || ( $q['page_id'] != get_option('page_for_posts') ) ) {\n\t\t\t\t$q['p'] = $q['page_id'];\n\t\t\t\t$where = \" AND {$wpdb->posts}.ID = \" . $q['page_id'];\n\t\t\t}\n\t\t}\n\n\t\t// If a search pattern is specified, load the posts that match.\n\t\tif ( ! empty( $q['s'] ) ) {\n\t\t\t$search = $this->parse_search( $q );\n\t\t}\n\n\t\t/**\n\t\t * Filter the search SQL that is used in the WHERE clause of WP_Query.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string   $search Search SQL for WHERE clause.\n\t\t * @param WP_Query $this   The current WP_Query object.\n\t\t */\n\t\t$search = apply_filters_ref_array( 'posts_search', array( $search, &$this ) );\n\n\t\t// Taxonomies\n\t\tif ( !$this->is_singular ) {\n\t\t\t$this->parse_tax_query( $q );\n\n\t\t\t$clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' );\n\n\t\t\t$join .= $clauses['join'];\n\t\t\t$where .= $clauses['where'];\n\t\t}\n\n\t\tif ( $this->is_tax ) {\n\t\t\tif ( empty($post_type) ) {\n\t\t\t\t// Do a fully inclusive search for currently registered post types of queried taxonomies\n\t\t\t\t$post_type = array();\n\t\t\t\t$taxonomies = array_keys( $this->tax_query->queried_terms );\n\t\t\t\tforeach ( get_post_types( array( 'exclude_from_search' => false ) ) as $pt ) {\n\t\t\t\t\t$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );\n\t\t\t\t\tif ( array_intersect( $taxonomies, $object_taxonomies ) )\n\t\t\t\t\t\t$post_type[] = $pt;\n\t\t\t\t}\n\t\t\t\tif ( ! $post_type )\n\t\t\t\t\t$post_type = 'any';\n\t\t\t\telseif ( count( $post_type ) == 1 )\n\t\t\t\t\t$post_type = $post_type[0];\n\n\t\t\t\t$post_status_join = true;\n\t\t\t} elseif ( in_array('attachment', (array) $post_type) ) {\n\t\t\t\t$post_status_join = true;\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Ensure that 'taxonomy', 'term', 'term_id', 'cat', and\n\t\t * 'category_name' vars are set for backward compatibility.\n\t\t */\n\t\tif ( ! empty( $this->tax_query->queried_terms ) ) {\n\n\t\t\t/*\n\t\t\t * Set 'taxonomy', 'term', and 'term_id' to the\n\t\t\t * first taxonomy other than 'post_tag' or 'category'.\n\t\t\t */\n\t\t\tif ( ! isset( $q['taxonomy'] ) ) {\n\t\t\t\tforeach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) {\n\t\t\t\t\tif ( empty( $queried_items['terms'][0] ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! in_array( $queried_taxonomy, array( 'category', 'post_tag' ) ) ) {\n\t\t\t\t\t\t$q['taxonomy'] = $queried_taxonomy;\n\n\t\t\t\t\t\tif ( 'slug' === $queried_items['field'] ) {\n\t\t\t\t\t\t\t$q['term'] = $queried_items['terms'][0];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$q['term_id'] = $queried_items['terms'][0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 'cat', 'category_name', 'tag_id'\n\t\t\tforeach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) {\n\t\t\t\tif ( empty( $queried_items['terms'][0] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( 'category' === $queried_taxonomy ) {\n\t\t\t\t\t$the_cat = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'category' );\n\t\t\t\t\tif ( $the_cat ) {\n\t\t\t\t\t\t$this->set( 'cat', $the_cat->term_id );\n\t\t\t\t\t\t$this->set( 'category_name', $the_cat->slug );\n\t\t\t\t\t}\n\t\t\t\t\tunset( $the_cat );\n\t\t\t\t}\n\n\t\t\t\tif ( 'post_tag' === $queried_taxonomy ) {\n\t\t\t\t\t$the_tag = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'post_tag' );\n\t\t\t\t\tif ( $the_tag ) {\n\t\t\t\t\t\t$this->set( 'tag_id', $the_tag->term_id );\n\t\t\t\t\t}\n\t\t\t\t\tunset( $the_tag );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( !empty( $this->tax_query->queries ) || !empty( $this->meta_query->queries ) ) {\n\t\t\t$groupby = \"{$wpdb->posts}.ID\";\n\t\t}\n\n\t\t// Author/user stuff\n\n\t\tif ( ! empty( $q['author'] ) && $q['author'] != '0' ) {\n\t\t\t$q['author'] = addslashes_gpc( '' . urldecode( $q['author'] ) );\n\t\t\t$authors = array_unique( array_map( 'intval', preg_split( '/[,\\s]+/', $q['author'] ) ) );\n\t\t\tforeach ( $authors as $author ) {\n\t\t\t\t$key = $author > 0 ? 'author__in' : 'author__not_in';\n\t\t\t\t$q[$key][] = abs( $author );\n\t\t\t}\n\t\t\t$q['author'] = implode( ',', $authors );\n\t\t}\n\n\t\tif ( ! empty( $q['author__not_in'] ) ) {\n\t\t\t$author__not_in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__not_in'] ) ) );\n\t\t\t$where .= \" AND {$wpdb->posts}.post_author NOT IN ($author__not_in) \";\n\t\t} elseif ( ! empty( $q['author__in'] ) ) {\n\t\t\t$author__in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__in'] ) ) );\n\t\t\t$where .= \" AND {$wpdb->posts}.post_author IN ($author__in) \";\n\t\t}\n\n\t\t// Author stuff for nice URLs\n\n\t\tif ( '' != $q['author_name'] ) {\n\t\t\tif ( strpos($q['author_name'], '/') !== false ) {\n\t\t\t\t$q['author_name'] = explode('/', $q['author_name']);\n\t\t\t\tif ( $q['author_name'][ count($q['author_name'])-1 ] ) {\n\t\t\t\t\t$q['author_name'] = $q['author_name'][count($q['author_name'])-1]; // no trailing slash\n\t\t\t\t} else {\n\t\t\t\t\t$q['author_name'] = $q['author_name'][count($q['author_name'])-2]; // there was a trailing slash\n\t\t\t\t}\n\t\t\t}\n\t\t\t$q['author_name'] = sanitize_title_for_query( $q['author_name'] );\n\t\t\t$q['author'] = get_user_by('slug', $q['author_name']);\n\t\t\tif ( $q['author'] )\n\t\t\t\t$q['author'] = $q['author']->ID;\n\t\t\t$whichauthor .= \" AND ($wpdb->posts.post_author = \" . absint($q['author']) . ')';\n\t\t}\n\n\t\t// MIME-Type stuff for attachment browsing\n\n\t\tif ( isset( $q['post_mime_type'] ) && '' != $q['post_mime_type'] )\n\t\t\t$whichmimetype = wp_post_mime_type_where( $q['post_mime_type'], $wpdb->posts );\n\n\t\t$where .= $search . $whichauthor . $whichmimetype;\n\n\t\tif ( ! empty( $this->meta_query->queries ) ) {\n\t\t\t$clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this );\n\t\t\t$join   .= $clauses['join'];\n\t\t\t$where  .= $clauses['where'];\n\t\t}\n\n\t\t$rand = ( isset( $q['orderby'] ) && 'rand' === $q['orderby'] );\n\t\tif ( ! isset( $q['order'] ) ) {\n\t\t\t$q['order'] = $rand ? '' : 'DESC';\n\t\t} else {\n\t\t\t$q['order'] = $rand ? '' : $this->parse_order( $q['order'] );\n\t\t}\n\n\t\t// Order by.\n\t\tif ( empty( $q['orderby'] ) ) {\n\t\t\t/*\n\t\t\t * Boolean false or empty array blanks out ORDER BY,\n\t\t\t * while leaving the value unset or otherwise empty sets the default.\n\t\t\t */\n\t\t\tif ( isset( $q['orderby'] ) && ( is_array( $q['orderby'] ) || false === $q['orderby'] ) ) {\n\t\t\t\t$orderby = '';\n\t\t\t} else {\n\t\t\t\t$orderby = \"$wpdb->posts.post_date \" . $q['order'];\n\t\t\t}\n\t\t} elseif ( 'none' == $q['orderby'] ) {\n\t\t\t$orderby = '';\n\t\t} elseif ( $q['orderby'] == 'post__in' && ! empty( $post__in ) ) {\n\t\t\t$orderby = \"FIELD( {$wpdb->posts}.ID, $post__in )\";\n\t\t} elseif ( $q['orderby'] == 'post_parent__in' && ! empty( $post_parent__in ) ) {\n\t\t\t$orderby = \"FIELD( {$wpdb->posts}.post_parent, $post_parent__in )\";\n\t\t} else {\n\t\t\t$orderby_array = array();\n\t\t\tif ( is_array( $q['orderby'] ) ) {\n\t\t\t\tforeach ( $q['orderby'] as $_orderby => $order ) {\n\t\t\t\t\t$orderby = addslashes_gpc( urldecode( $_orderby ) );\n\t\t\t\t\t$parsed  = $this->parse_orderby( $orderby );\n\n\t\t\t\t\tif ( ! $parsed ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$orderby_array[] = $parsed . ' ' . $this->parse_order( $order );\n\t\t\t\t}\n\t\t\t\t$orderby = implode( ', ', $orderby_array );\n\n\t\t\t} else {\n\t\t\t\t$q['orderby'] = urldecode( $q['orderby'] );\n\t\t\t\t$q['orderby'] = addslashes_gpc( $q['orderby'] );\n\n\t\t\t\tforeach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) {\n\t\t\t\t\t$parsed = $this->parse_orderby( $orderby );\n\t\t\t\t\t// Only allow certain values for safety.\n\t\t\t\t\tif ( ! $parsed ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$orderby_array[] = $parsed;\n\t\t\t\t}\n\t\t\t\t$orderby = implode( ' ' . $q['order'] . ', ', $orderby_array );\n\n\t\t\t\tif ( empty( $orderby ) ) {\n\t\t\t\t\t$orderby = \"$wpdb->posts.post_date \" . $q['order'];\n\t\t\t\t} elseif ( ! empty( $q['order'] ) ) {\n\t\t\t\t\t$orderby .= \" {$q['order']}\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Order search results by relevance only when another \"orderby\" is not specified in the query.\n\t\tif ( ! empty( $q['s'] ) ) {\n\t\t\t$search_orderby = '';\n\t\t\tif ( ! empty( $q['search_orderby_title'] ) && ( empty( $q['orderby'] ) && ! $this->is_feed ) || ( isset( $q['orderby'] ) && 'relevance' === $q['orderby'] ) )\n\t\t\t\t$search_orderby = $this->parse_search_order( $q );\n\n\t\t\t/**\n\t\t\t * Filter the ORDER BY used when ordering search results.\n\t\t\t *\n\t\t\t * @since 3.7.0\n\t\t\t *\n\t\t\t * @param string   $search_orderby The ORDER BY clause.\n\t\t\t * @param WP_Query $this           The current WP_Query instance.\n\t\t\t */\n\t\t\t$search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this );\n\t\t\tif ( $search_orderby )\n\t\t\t\t$orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby;\n\t\t}\n\n\t\tif ( is_array( $post_type ) && count( $post_type ) > 1 ) {\n\t\t\t$post_type_cap = 'multiple_post_type';\n\t\t} else {\n\t\t\tif ( is_array( $post_type ) )\n\t\t\t\t$post_type = reset( $post_type );\n\t\t\t$post_type_object = get_post_type_object( $post_type );\n\t\t\tif ( empty( $post_type_object ) )\n\t\t\t\t$post_type_cap = $post_type;\n\t\t}\n\n\t\tif ( isset( $q['post_password'] ) ) {\n\t\t\t$where .= $wpdb->prepare( \" AND $wpdb->posts.post_password = %s\", $q['post_password'] );\n\t\t\tif ( empty( $q['perm'] ) ) {\n\t\t\t\t$q['perm'] = 'readable';\n\t\t\t}\n\t\t} elseif ( isset( $q['has_password'] ) ) {\n\t\t\t$where .= sprintf( \" AND $wpdb->posts.post_password %s ''\", $q['has_password'] ? '!=' : '=' );\n\t\t}\n\n\t\tif ( 'any' == $post_type ) {\n\t\t\t$in_search_post_types = get_post_types( array('exclude_from_search' => false) );\n\t\t\tif ( empty( $in_search_post_types ) )\n\t\t\t\t$where .= ' AND 1=0 ';\n\t\t\telse\n\t\t\t\t$where .= \" AND $wpdb->posts.post_type IN ('\" . join(\"', '\", $in_search_post_types ) . \"')\";\n\t\t} elseif ( !empty( $post_type ) && is_array( $post_type ) ) {\n\t\t\t$where .= \" AND $wpdb->posts.post_type IN ('\" . join(\"', '\", $post_type) . \"')\";\n\t\t} elseif ( ! empty( $post_type ) ) {\n\t\t\t$where .= \" AND $wpdb->posts.post_type = '$post_type'\";\n\t\t\t$post_type_object = get_post_type_object ( $post_type );\n\t\t} elseif ( $this->is_attachment ) {\n\t\t\t$where .= \" AND $wpdb->posts.post_type = 'attachment'\";\n\t\t\t$post_type_object = get_post_type_object ( 'attachment' );\n\t\t} elseif ( $this->is_page ) {\n\t\t\t$where .= \" AND $wpdb->posts.post_type = 'page'\";\n\t\t\t$post_type_object = get_post_type_object ( 'page' );\n\t\t} else {\n\t\t\t$where .= \" AND $wpdb->posts.post_type = 'post'\";\n\t\t\t$post_type_object = get_post_type_object ( 'post' );\n\t\t}\n\n\t\t$edit_cap = 'edit_post';\n\t\t$read_cap = 'read_post';\n\n\t\tif ( ! empty( $post_type_object ) ) {\n\t\t\t$edit_others_cap = $post_type_object->cap->edit_others_posts;\n\t\t\t$read_private_cap = $post_type_object->cap->read_private_posts;\n\t\t} else {\n\t\t\t$edit_others_cap = 'edit_others_' . $post_type_cap . 's';\n\t\t\t$read_private_cap = 'read_private_' . $post_type_cap . 's';\n\t\t}\n\n\t\t$user_id = get_current_user_id();\n\n\t\t$q_status = array();\n\t\tif ( ! empty( $q['post_status'] ) ) {\n\t\t\t$statuswheres = array();\n\t\t\t$q_status = $q['post_status'];\n\t\t\tif ( ! is_array( $q_status ) )\n\t\t\t\t$q_status = explode(',', $q_status);\n\t\t\t$r_status = array();\n\t\t\t$p_status = array();\n\t\t\t$e_status = array();\n\t\t\tif ( in_array( 'any', $q_status ) ) {\n\t\t\t\tforeach ( get_post_stati( array( 'exclude_from_search' => true ) ) as $status ) {\n\t\t\t\t\tif ( ! in_array( $status, $q_status ) ) {\n\t\t\t\t\t\t$e_status[] = \"$wpdb->posts.post_status <> '$status'\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tforeach ( get_post_stati() as $status ) {\n\t\t\t\t\tif ( in_array( $status, $q_status ) ) {\n\t\t\t\t\t\tif ( 'private' == $status )\n\t\t\t\t\t\t\t$p_status[] = \"$wpdb->posts.post_status = '$status'\";\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t$r_status[] = \"$wpdb->posts.post_status = '$status'\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( empty($q['perm'] ) || 'readable' != $q['perm'] ) {\n\t\t\t\t$r_status = array_merge($r_status, $p_status);\n\t\t\t\tunset($p_status);\n\t\t\t}\n\n\t\t\tif ( !empty($e_status) ) {\n\t\t\t\t$statuswheres[] = \"(\" . join( ' AND ', $e_status ) . \")\";\n\t\t\t}\n\t\t\tif ( !empty($r_status) ) {\n\t\t\t\tif ( !empty($q['perm'] ) && 'editable' == $q['perm'] && !current_user_can($edit_others_cap) )\n\t\t\t\t\t$statuswheres[] = \"($wpdb->posts.post_author = $user_id \" . \"AND (\" . join( ' OR ', $r_status ) . \"))\";\n\t\t\t\telse\n\t\t\t\t\t$statuswheres[] = \"(\" . join( ' OR ', $r_status ) . \")\";\n\t\t\t}\n\t\t\tif ( !empty($p_status) ) {\n\t\t\t\tif ( !empty($q['perm'] ) && 'readable' == $q['perm'] && !current_user_can($read_private_cap) )\n\t\t\t\t\t$statuswheres[] = \"($wpdb->posts.post_author = $user_id \" . \"AND (\" . join( ' OR ', $p_status ) . \"))\";\n\t\t\t\telse\n\t\t\t\t\t$statuswheres[] = \"(\" . join( ' OR ', $p_status ) . \")\";\n\t\t\t}\n\t\t\tif ( $post_status_join ) {\n\t\t\t\t$join .= \" LEFT JOIN $wpdb->posts AS p2 ON ($wpdb->posts.post_parent = p2.ID) \";\n\t\t\t\tforeach ( $statuswheres as $index => $statuswhere )\n\t\t\t\t\t$statuswheres[$index] = \"($statuswhere OR ($wpdb->posts.post_status = 'inherit' AND \" . str_replace($wpdb->posts, 'p2', $statuswhere) . \"))\";\n\t\t\t}\n\t\t\t$where_status = implode( ' OR ', $statuswheres );\n\t\t\tif ( ! empty( $where_status ) ) {\n\t\t\t\t$where .= \" AND ($where_status)\";\n\t\t\t}\n\t\t} elseif ( !$this->is_singular ) {\n\t\t\t$where .= \" AND ($wpdb->posts.post_status = 'publish'\";\n\n\t\t\t// Add public states.\n\t\t\t$public_states = get_post_stati( array('public' => true) );\n\t\t\tforeach ( (array) $public_states as $state ) {\n\t\t\t\tif ( 'publish' == $state ) // Publish is hard-coded above.\n\t\t\t\t\tcontinue;\n\t\t\t\t$where .= \" OR $wpdb->posts.post_status = '$state'\";\n\t\t\t}\n\n\t\t\tif ( $this->is_admin ) {\n\t\t\t\t// Add protected states that should show in the admin all list.\n\t\t\t\t$admin_all_states = get_post_stati( array('protected' => true, 'show_in_admin_all_list' => true) );\n\t\t\t\tforeach ( (array) $admin_all_states as $state )\n\t\t\t\t\t$where .= \" OR $wpdb->posts.post_status = '$state'\";\n\t\t\t}\n\n\t\t\tif ( is_user_logged_in() ) {\n\t\t\t\t// Add private states that are limited to viewing by the author of a post or someone who has caps to read private states.\n\t\t\t\t$private_states = get_post_stati( array('private' => true) );\n\t\t\t\tforeach ( (array) $private_states as $state )\n\t\t\t\t\t$where .= current_user_can( $read_private_cap ) ? \" OR $wpdb->posts.post_status = '$state'\" : \" OR $wpdb->posts.post_author = $user_id AND $wpdb->posts.post_status = '$state'\";\n\t\t\t}\n\n\t\t\t$where .= ')';\n\t\t}\n\n\t\t/*\n\t\t * Apply filters on where and join prior to paging so that any\n\t\t * manipulations to them are reflected in the paging by day queries.\n\t\t */\n\t\tif ( !$q['suppress_filters'] ) {\n\t\t\t/**\n\t\t\t * Filter the WHERE clause of the query.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t *\n\t\t\t * @param string   $where The WHERE clause of the query.\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$where = apply_filters_ref_array( 'posts_where', array( $where, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the JOIN clause of the query.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t *\n\t\t\t * @param string   $where The JOIN clause of the query.\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$join = apply_filters_ref_array( 'posts_join', array( $join, &$this ) );\n\t\t}\n\n\t\t// Paging\n\t\tif ( empty($q['nopaging']) && !$this->is_singular ) {\n\t\t\t$page = absint($q['paged']);\n\t\t\tif ( !$page )\n\t\t\t\t$page = 1;\n\n\t\t\t// If 'offset' is provided, it takes precedence over 'paged'.\n\t\t\tif ( isset( $q['offset'] ) && is_numeric( $q['offset'] ) ) {\n\t\t\t\t$q['offset'] = absint( $q['offset'] );\n\t\t\t\t$pgstrt = $q['offset'] . ', ';\n\t\t\t} else {\n\t\t\t\t$pgstrt = absint( ( $page - 1 ) * $q['posts_per_page'] ) . ', ';\n\t\t\t}\n\t\t\t$limits = 'LIMIT ' . $pgstrt . $q['posts_per_page'];\n\t\t}\n\n\t\t// Comments feeds\n\t\tif ( $this->is_comment_feed && ! $this->is_singular ) {\n\t\t\tif ( $this->is_archive || $this->is_search ) {\n\t\t\t\t$cjoin = \"JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) $join \";\n\t\t\t\t$cwhere = \"WHERE comment_approved = '1' $where\";\n\t\t\t\t$cgroupby = \"$wpdb->comments.comment_id\";\n\t\t\t} else { // Other non singular e.g. front\n\t\t\t\t$cjoin = \"JOIN $wpdb->posts ON ( $wpdb->comments.comment_post_ID = $wpdb->posts.ID )\";\n\t\t\t\t$cwhere = \"WHERE post_status = 'publish' AND comment_approved = '1'\";\n\t\t\t\t$cgroupby = '';\n\t\t\t}\n\n\t\t\tif ( !$q['suppress_filters'] ) {\n\t\t\t\t/**\n\t\t\t\t * Filter the JOIN clause of the comments feed query before sending.\n\t\t\t\t *\n\t\t\t\t * @since 2.2.0\n\t\t\t\t *\n\t\t\t\t * @param string   $cjoin The JOIN clause of the query.\n\t\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t\t */\n\t\t\t\t$cjoin = apply_filters_ref_array( 'comment_feed_join', array( $cjoin, &$this ) );\n\n\t\t\t\t/**\n\t\t\t\t * Filter the WHERE clause of the comments feed query before sending.\n\t\t\t\t *\n\t\t\t\t * @since 2.2.0\n\t\t\t\t *\n\t\t\t\t * @param string   $cwhere The WHERE clause of the query.\n\t\t\t\t * @param WP_Query &$this  The WP_Query instance (passed by reference).\n\t\t\t\t */\n\t\t\t\t$cwhere = apply_filters_ref_array( 'comment_feed_where', array( $cwhere, &$this ) );\n\n\t\t\t\t/**\n\t\t\t\t * Filter the GROUP BY clause of the comments feed query before sending.\n\t\t\t\t *\n\t\t\t\t * @since 2.2.0\n\t\t\t\t *\n\t\t\t\t * @param string   $cgroupby The GROUP BY clause of the query.\n\t\t\t\t * @param WP_Query &$this    The WP_Query instance (passed by reference).\n\t\t\t\t */\n\t\t\t\t$cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( $cgroupby, &$this ) );\n\n\t\t\t\t/**\n\t\t\t\t * Filter the ORDER BY clause of the comments feed query before sending.\n\t\t\t\t *\n\t\t\t\t * @since 2.8.0\n\t\t\t\t *\n\t\t\t\t * @param string   $corderby The ORDER BY clause of the query.\n\t\t\t\t * @param WP_Query &$this    The WP_Query instance (passed by reference).\n\t\t\t\t */\n\t\t\t\t$corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) );\n\n\t\t\t\t/**\n\t\t\t\t * Filter the LIMIT clause of the comments feed query before sending.\n\t\t\t\t *\n\t\t\t\t * @since 2.8.0\n\t\t\t\t *\n\t\t\t\t * @param string   $climits The JOIN clause of the query.\n\t\t\t\t * @param WP_Query &$this   The WP_Query instance (passed by reference).\n\t\t\t\t */\n\t\t\t\t$climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option('posts_per_rss'), &$this ) );\n\t\t\t}\n\t\t\t$cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '';\n\t\t\t$corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : '';\n\n\t\t\t$comments = (array) $wpdb->get_results(\"SELECT $distinct $wpdb->comments.* FROM $wpdb->comments $cjoin $cwhere $cgroupby $corderby $climits\");\n\t\t\t// Convert to WP_Comment\n\t\t\t$this->comments = array_map( 'get_comment', $comments );\n\t\t\t$this->comment_count = count($this->comments);\n\n\t\t\t$post_ids = array();\n\n\t\t\tforeach ( $this->comments as $comment )\n\t\t\t\t$post_ids[] = (int) $comment->comment_post_ID;\n\n\t\t\t$post_ids = join(',', $post_ids);\n\t\t\t$join = '';\n\t\t\tif ( $post_ids )\n\t\t\t\t$where = \"AND $wpdb->posts.ID IN ($post_ids) \";\n\t\t\telse\n\t\t\t\t$where = \"AND 0\";\n\t\t}\n\n\t\t$pieces = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' );\n\n\t\t/*\n\t\t * Apply post-paging filters on where and join. Only plugins that\n\t\t * manipulate paging queries should use these hooks.\n\t\t */\n\t\tif ( !$q['suppress_filters'] ) {\n\t\t\t/**\n\t\t\t * Filter the WHERE clause of the query.\n\t\t\t *\n\t\t\t * Specifically for manipulating paging queries.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t *\n\t\t\t * @param string   $where The WHERE clause of the query.\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$where = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the GROUP BY clause of the query.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param string   $groupby The GROUP BY clause of the query.\n\t\t\t * @param WP_Query &$this   The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$groupby = apply_filters_ref_array( 'posts_groupby', array( $groupby, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the JOIN clause of the query.\n\t\t\t *\n\t\t\t * Specifically for manipulating paging queries.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t *\n\t\t\t * @param string   $join  The JOIN clause of the query.\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$join = apply_filters_ref_array( 'posts_join_paged', array( $join, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the ORDER BY clause of the query.\n\t\t\t *\n\t\t\t * @since 1.5.1\n\t\t\t *\n\t\t\t * @param string   $orderby The ORDER BY clause of the query.\n\t\t\t * @param WP_Query &$this   The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$orderby = apply_filters_ref_array( 'posts_orderby', array( $orderby, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the DISTINCT clause of the query.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t *\n\t\t\t * @param string   $distinct The DISTINCT clause of the query.\n\t\t\t * @param WP_Query &$this    The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$distinct = apply_filters_ref_array( 'posts_distinct', array( $distinct, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the LIMIT clause of the query.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t *\n\t\t\t * @param string   $limits The LIMIT clause of the query.\n\t\t\t * @param WP_Query &$this  The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$limits = apply_filters_ref_array( 'post_limits', array( $limits, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the SELECT clause of the query.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t *\n\t\t\t * @param string   $fields The SELECT clause of the query.\n\t\t\t * @param WP_Query &$this  The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$fields = apply_filters_ref_array( 'posts_fields', array( $fields, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter all query clauses at once, for convenience.\n\t\t\t *\n\t\t\t * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT,\n\t\t\t * fields (SELECT), and LIMITS clauses.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param array    $clauses The list of clauses for the query.\n\t\t\t * @param WP_Query &$this   The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) );\n\n\t\t\t$where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';\n\t\t\t$groupby = isset( $clauses[ 'groupby' ] ) ? $clauses[ 'groupby' ] : '';\n\t\t\t$join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';\n\t\t\t$orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : '';\n\t\t\t$distinct = isset( $clauses[ 'distinct' ] ) ? $clauses[ 'distinct' ] : '';\n\t\t\t$fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : '';\n\t\t\t$limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : '';\n\t\t}\n\n\t\t/**\n\t\t * Fires to announce the query's current selection parameters.\n\t\t *\n\t\t * For use by caching plugins.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param string $selection The assembled selection query.\n\t\t */\n\t\tdo_action( 'posts_selection', $where . $groupby . $orderby . $limits . $join );\n\n\t\t/*\n\t\t * Filter again for the benefit of caching plugins.\n\t\t * Regular plugins should use the hooks above.\n\t\t */\n\t\tif ( !$q['suppress_filters'] ) {\n\t\t\t/**\n\t\t\t * Filter the WHERE clause of the query.\n\t\t\t *\n\t\t\t * For use by caching plugins.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string   $where The WHERE clause of the query.\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$where = apply_filters_ref_array( 'posts_where_request', array( $where, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the GROUP BY clause of the query.\n\t\t\t *\n\t\t\t * For use by caching plugins.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string   $groupby The GROUP BY clause of the query.\n\t\t\t * @param WP_Query &$this   The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$groupby = apply_filters_ref_array( 'posts_groupby_request', array( $groupby, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the JOIN clause of the query.\n\t\t\t *\n\t\t\t * For use by caching plugins.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string   $join  The JOIN clause of the query.\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$join = apply_filters_ref_array( 'posts_join_request', array( $join, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the ORDER BY clause of the query.\n\t\t\t *\n\t\t\t * For use by caching plugins.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string   $orderby The ORDER BY clause of the query.\n\t\t\t * @param WP_Query &$this   The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$orderby = apply_filters_ref_array( 'posts_orderby_request', array( $orderby, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the DISTINCT clause of the query.\n\t\t\t *\n\t\t\t * For use by caching plugins.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string   $distinct The DISTINCT clause of the query.\n\t\t\t * @param WP_Query &$this    The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$distinct = apply_filters_ref_array( 'posts_distinct_request', array( $distinct, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the SELECT clause of the query.\n\t\t\t *\n\t\t\t * For use by caching plugins.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string   $fields The SELECT clause of the query.\n\t\t\t * @param WP_Query &$this  The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$fields = apply_filters_ref_array( 'posts_fields_request', array( $fields, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter the LIMIT clause of the query.\n\t\t\t *\n\t\t\t * For use by caching plugins.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string   $limits The LIMIT clause of the query.\n\t\t\t * @param WP_Query &$this  The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) );\n\n\t\t\t/**\n\t\t\t * Filter all query clauses at once, for convenience.\n\t\t\t *\n\t\t\t * For use by caching plugins.\n\t\t\t *\n\t\t\t * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT,\n\t\t\t * fields (SELECT), and LIMITS clauses.\n\t\t\t *\n\t\t\t * @since 3.1.0\n\t\t\t *\n\t\t\t * @param array    $pieces The pieces of the query.\n\t\t\t * @param WP_Query &$this  The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) );\n\n\t\t\t$where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';\n\t\t\t$groupby = isset( $clauses[ 'groupby' ] ) ? $clauses[ 'groupby' ] : '';\n\t\t\t$join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';\n\t\t\t$orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : '';\n\t\t\t$distinct = isset( $clauses[ 'distinct' ] ) ? $clauses[ 'distinct' ] : '';\n\t\t\t$fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : '';\n\t\t\t$limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : '';\n\t\t}\n\n\t\tif ( ! empty($groupby) )\n\t\t\t$groupby = 'GROUP BY ' . $groupby;\n\t\tif ( !empty( $orderby ) )\n\t\t\t$orderby = 'ORDER BY ' . $orderby;\n\n\t\t$found_rows = '';\n\t\tif ( !$q['no_found_rows'] && !empty($limits) )\n\t\t\t$found_rows = 'SQL_CALC_FOUND_ROWS';\n\n\t\t$this->request = $old_request = \"SELECT $found_rows $distinct $fields FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits\";\n\n\t\tif ( !$q['suppress_filters'] ) {\n\t\t\t/**\n\t\t\t * Filter the completed SQL query before sending.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param array    $request The complete SQL query.\n\t\t\t * @param WP_Query &$this   The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$this->request = apply_filters_ref_array( 'posts_request', array( $this->request, &$this ) );\n\t\t}\n\n\t\tif ( 'ids' == $q['fields'] ) {\n\t\t\t$this->posts = $wpdb->get_col( $this->request );\n\t\t\t$this->posts = array_map( 'intval', $this->posts );\n\t\t\t$this->post_count = count( $this->posts );\n\t\t\t$this->set_found_posts( $q, $limits );\n\n\t\t\treturn $this->posts;\n\t\t}\n\n\t\tif ( 'id=>parent' == $q['fields'] ) {\n\t\t\t$this->posts = $wpdb->get_results( $this->request );\n\t\t\t$this->post_count = count( $this->posts );\n\t\t\t$this->set_found_posts( $q, $limits );\n\n\t\t\t$r = array();\n\t\t\tforeach ( $this->posts as $key => $post ) {\n\t\t\t\t$this->posts[ $key ]->ID = (int) $post->ID;\n\t\t\t\t$this->posts[ $key ]->post_parent = (int) $post->post_parent;\n\n\t\t\t\t$r[ (int) $post->ID ] = (int) $post->post_parent;\n\t\t\t}\n\n\t\t\treturn $r;\n\t\t}\n\n\t\t$split_the_query = ( $old_request == $this->request && \"$wpdb->posts.*\" == $fields && !empty( $limits ) && $q['posts_per_page'] < 500 );\n\n\t\t/**\n\t\t * Filter whether to split the query.\n\t\t *\n\t\t * Splitting the query will cause it to fetch just the IDs of the found posts\n\t\t * (and then individually fetch each post by ID), rather than fetching every\n\t\t * complete row at once. One massive result vs. many small results.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @param bool     $split_the_query Whether or not to split the query.\n\t\t * @param WP_Query $this            The WP_Query instance.\n\t\t */\n\t\t$split_the_query = apply_filters( 'split_the_query', $split_the_query, $this );\n\n\t\tif ( $split_the_query ) {\n\t\t\t// First get the IDs and then fill in the objects\n\n\t\t\t$this->request = \"SELECT $found_rows $distinct $wpdb->posts.ID FROM $wpdb->posts $join WHERE 1=1 $where $groupby $orderby $limits\";\n\n\t\t\t/**\n\t\t\t * Filter the Post IDs SQL request before sending.\n\t\t\t *\n\t\t\t * @since 3.4.0\n\t\t\t *\n\t\t\t * @param string   $request The post ID request.\n\t\t\t * @param WP_Query $this    The WP_Query instance.\n\t\t\t */\n\t\t\t$this->request = apply_filters( 'posts_request_ids', $this->request, $this );\n\n\t\t\t$ids = $wpdb->get_col( $this->request );\n\n\t\t\tif ( $ids ) {\n\t\t\t\t$this->posts = $ids;\n\t\t\t\t$this->set_found_posts( $q, $limits );\n\t\t\t\t_prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );\n\t\t\t} else {\n\t\t\t\t$this->posts = array();\n\t\t\t}\n\t\t} else {\n\t\t\t$this->posts = $wpdb->get_results( $this->request );\n\t\t\t$this->set_found_posts( $q, $limits );\n\t\t}\n\n\t\t// Convert to WP_Post objects\n\t\tif ( $this->posts )\n\t\t\t$this->posts = array_map( 'get_post', $this->posts );\n\n\n\t\tif ( $q['update_post_term_cache'] ) {\n\t\t\tadd_filter( 'get_term_metadata', array( $this, 'lazyload_term_meta' ), 10, 2 );\n\t\t}\n\n\t\tif ( ! $q['suppress_filters'] ) {\n\t\t\t/**\n\t\t\t * Filter the raw post results array, prior to status checks.\n\t\t\t *\n\t\t\t * @since 2.3.0\n\t\t\t *\n\t\t\t * @param array    $posts The post results array.\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$this->posts = apply_filters_ref_array( 'posts_results', array( $this->posts, &$this ) );\n\t\t}\n\n\t\tif ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) {\n\t\t\t/** This filter is documented in wp-includes/query.php */\n\t\t\t$cjoin = apply_filters_ref_array( 'comment_feed_join', array( '', &$this ) );\n\n\t\t\t/** This filter is documented in wp-includes/query.php */\n\t\t\t$cwhere = apply_filters_ref_array( 'comment_feed_where', array( \"WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'\", &$this ) );\n\n\t\t\t/** This filter is documented in wp-includes/query.php */\n\t\t\t$cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( '', &$this ) );\n\t\t\t$cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '';\n\n\t\t\t/** This filter is documented in wp-includes/query.php */\n\t\t\t$corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) );\n\t\t\t$corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : '';\n\n\t\t\t/** This filter is documented in wp-includes/query.php */\n\t\t\t$climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option('posts_per_rss'), &$this ) );\n\n\t\t\t$comments_request = \"SELECT $wpdb->comments.* FROM $wpdb->comments $cjoin $cwhere $cgroupby $corderby $climits\";\n\t\t\t$comments = $wpdb->get_results($comments_request);\n\t\t\t// Convert to WP_Comment\n\t\t\t$this->comments = array_map( 'get_comment', $comments );\n\t\t\t$this->comment_count = count($this->comments);\n\t\t}\n\n\t\t// Check post status to determine if post should be displayed.\n\t\tif ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {\n\t\t\t$status = get_post_status($this->posts[0]);\n\t\t\tif ( 'attachment' === $this->posts[0]->post_type && 0 === (int) $this->posts[0]->post_parent ) {\n\t\t\t\t$this->is_page = false;\n\t\t\t\t$this->is_single = true;\n\t\t\t\t$this->is_attachment = true;\n\t\t\t}\n\t\t\t$post_status_obj = get_post_status_object($status);\n\t\t\t//$type = get_post_type($this->posts[0]);\n\n\t\t\t// If the post_status was specifically requested, let it pass through.\n\t\t\tif ( !$post_status_obj->public && ! in_array( $status, $q_status ) ) {\n\n\t\t\t\tif ( ! is_user_logged_in() ) {\n\t\t\t\t\t// User must be logged in to view unpublished posts.\n\t\t\t\t\t$this->posts = array();\n\t\t\t\t} else {\n\t\t\t\t\tif  ( $post_status_obj->protected ) {\n\t\t\t\t\t\t// User must have edit permissions on the draft to preview.\n\t\t\t\t\t\tif ( ! current_user_can($edit_cap, $this->posts[0]->ID) ) {\n\t\t\t\t\t\t\t$this->posts = array();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this->is_preview = true;\n\t\t\t\t\t\t\tif ( 'future' != $status )\n\t\t\t\t\t\t\t\t$this->posts[0]->post_date = current_time('mysql');\n\t\t\t\t\t\t}\n\t\t\t\t\t} elseif ( $post_status_obj->private ) {\n\t\t\t\t\t\tif ( ! current_user_can($read_cap, $this->posts[0]->ID) )\n\t\t\t\t\t\t\t$this->posts = array();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this->posts = array();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( $this->is_preview && $this->posts && current_user_can( $edit_cap, $this->posts[0]->ID ) ) {\n\t\t\t\t/**\n\t\t\t\t * Filter the single post for preview mode.\n\t\t\t\t *\n\t\t\t\t * @since 2.7.0\n\t\t\t\t *\n\t\t\t\t * @param WP_Post  $post_preview  The Post object.\n\t\t\t\t * @param WP_Query &$this         The WP_Query instance (passed by reference).\n\t\t\t\t */\n\t\t\t\t$this->posts[0] = get_post( apply_filters_ref_array( 'the_preview', array( $this->posts[0], &$this ) ) );\n\t\t\t}\n\t\t}\n\n\t\t// Put sticky posts at the top of the posts array\n\t\t$sticky_posts = get_option('sticky_posts');\n\t\tif ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['ignore_sticky_posts'] ) {\n\t\t\t$num_posts = count($this->posts);\n\t\t\t$sticky_offset = 0;\n\t\t\t// Loop over posts and relocate stickies to the front.\n\t\t\tfor ( $i = 0; $i < $num_posts; $i++ ) {\n\t\t\t\tif ( in_array($this->posts[$i]->ID, $sticky_posts) ) {\n\t\t\t\t\t$sticky_post = $this->posts[$i];\n\t\t\t\t\t// Remove sticky from current position\n\t\t\t\t\tarray_splice($this->posts, $i, 1);\n\t\t\t\t\t// Move to front, after other stickies\n\t\t\t\t\tarray_splice($this->posts, $sticky_offset, 0, array($sticky_post));\n\t\t\t\t\t// Increment the sticky offset. The next sticky will be placed at this offset.\n\t\t\t\t\t$sticky_offset++;\n\t\t\t\t\t// Remove post from sticky posts array\n\t\t\t\t\t$offset = array_search($sticky_post->ID, $sticky_posts);\n\t\t\t\t\tunset( $sticky_posts[$offset] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If any posts have been excluded specifically, Ignore those that are sticky.\n\t\t\tif ( !empty($sticky_posts) && !empty($q['post__not_in']) )\n\t\t\t\t$sticky_posts = array_diff($sticky_posts, $q['post__not_in']);\n\n\t\t\t// Fetch sticky posts that weren't in the query results\n\t\t\tif ( !empty($sticky_posts) ) {\n\t\t\t\t$stickies = get_posts( array(\n\t\t\t\t\t'post__in' => $sticky_posts,\n\t\t\t\t\t'post_type' => $post_type,\n\t\t\t\t\t'post_status' => 'publish',\n\t\t\t\t\t'nopaging' => true\n\t\t\t\t) );\n\n\t\t\t\tforeach ( $stickies as $sticky_post ) {\n\t\t\t\t\tarray_splice( $this->posts, $sticky_offset, 0, array( $sticky_post ) );\n\t\t\t\t\t$sticky_offset++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If comments have been fetched as part of the query, make sure comment meta lazy-loading is set up.\n\t\tif ( ! empty( $this->comments ) ) {\n\t\t\tadd_filter( 'get_comment_metadata', array( $this, 'lazyload_comment_meta' ), 10, 2 );\n\t\t}\n\n\t\tif ( ! $q['suppress_filters'] ) {\n\t\t\t/**\n\t\t\t * Filter the array of retrieved posts after they've been fetched and\n\t\t\t * internally processed.\n\t\t\t *\n\t\t\t * @since 1.5.0\n\t\t\t *\n\t\t\t * @param array    $posts The array of retrieved posts.\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$this->posts = apply_filters_ref_array( 'the_posts', array( $this->posts, &$this ) );\n\t\t}\n\n\t\t// Ensure that any posts added/modified via one of the filters above are\n\t\t// of the type WP_Post and are filtered.\n\t\tif ( $this->posts ) {\n\t\t\t$this->post_count = count( $this->posts );\n\n\t\t\t$this->posts = array_map( 'get_post', $this->posts );\n\n\t\t\tif ( $q['cache_results'] )\n\t\t\t\tupdate_post_caches($this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache']);\n\n\t\t\t$this->post = reset( $this->posts );\n\t\t} else {\n\t\t\t$this->post_count = 0;\n\t\t\t$this->posts = array();\n\t\t}\n\n\t\treturn $this->posts;\n\t}\n\n\t/**\n\t * Set up the amount of found posts and the number of pages (if limit clause was used)\n\t * for the current query.\n\t *\n\t * @since 3.5.0\n\t * @access private\n\t *\n\t * @global wpdb $wpdb WordPress database abstraction object.\n\t */\n\tprivate function set_found_posts( $q, $limits ) {\n\t\tglobal $wpdb;\n\n\t\t// Bail if posts is an empty array. Continue if posts is an empty string,\n\t\t// null, or false to accommodate caching plugins that fill posts later.\n\t\tif ( $q['no_found_rows'] || ( is_array( $this->posts ) && ! $this->posts ) )\n\t\t\treturn;\n\n\t\tif ( ! empty( $limits ) ) {\n\t\t\t/**\n\t\t\t * Filter the query to run for retrieving the found posts.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t *\n\t\t\t * @param string   $found_posts The query to run to find the found posts.\n\t\t\t * @param WP_Query &$this       The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\t$this->found_posts = $wpdb->get_var( apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) ) );\n\t\t} else {\n\t\t\t$this->found_posts = count( $this->posts );\n\t\t}\n\n\t\t/**\n\t\t * Filter the number of found posts for the query.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param int      $found_posts The number of posts found.\n\t\t * @param WP_Query &$this       The WP_Query instance (passed by reference).\n\t\t */\n\t\t$this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) );\n\n\t\tif ( ! empty( $limits ) )\n\t\t\t$this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] );\n\t}\n\n\t/**\n\t * Set up the next post and iterate current post index.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return WP_Post Next post.\n\t */\n\tpublic function next_post() {\n\n\t\t$this->current_post++;\n\n\t\t$this->post = $this->posts[$this->current_post];\n\t\treturn $this->post;\n\t}\n\n\t/**\n\t * Sets up the current post.\n\t *\n\t * Retrieves the next post, sets up the post, sets the 'in the loop'\n\t * property to true.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @global WP_Post $post\n\t */\n\tpublic function the_post() {\n\t\tglobal $post;\n\t\t$this->in_the_loop = true;\n\n\t\tif ( $this->current_post == -1 ) // loop has just started\n\t\t\t/**\n\t\t\t * Fires once the loop is started.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\tdo_action_ref_array( 'loop_start', array( &$this ) );\n\n\t\t$post = $this->next_post();\n\t\t$this->setup_postdata( $post );\n\t}\n\n\t/**\n\t * Whether there are more posts available in the loop.\n\t *\n\t * Calls action 'loop_end', when the loop is complete.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return bool True if posts are available, false if end of loop.\n\t */\n\tpublic function have_posts() {\n\t\tif ( $this->current_post + 1 < $this->post_count ) {\n\t\t\treturn true;\n\t\t} elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) {\n\t\t\t/**\n\t\t\t * Fires once the loop has ended.\n\t\t\t *\n\t\t\t * @since 2.0.0\n\t\t\t *\n\t\t\t * @param WP_Query &$this The WP_Query instance (passed by reference).\n\t\t\t */\n\t\t\tdo_action_ref_array( 'loop_end', array( &$this ) );\n\t\t\t// Do some cleaning up after the loop\n\t\t\t$this->rewind_posts();\n\t\t}\n\n\t\t$this->in_the_loop = false;\n\t\treturn false;\n\t}\n\n\t/**\n\t * Rewind the posts and reset post index.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t */\n\tpublic function rewind_posts() {\n\t\t$this->current_post = -1;\n\t\tif ( $this->post_count > 0 ) {\n\t\t\t$this->post = $this->posts[0];\n\t\t}\n\t}\n\n\t/**\n\t * Iterate current comment index and return WP_Comment object.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t *\n\t * @return WP_Comment Comment object.\n\t */\n\tpublic function next_comment() {\n\t\t$this->current_comment++;\n\n\t\t$this->comment = $this->comments[$this->current_comment];\n\t\treturn $this->comment;\n\t}\n\n\t/**\n\t * Sets up the current comment.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t * @global WP_Comment $comment Current comment.\n\t */\n\tpublic function the_comment() {\n\t\tglobal $comment;\n\n\t\t$comment = $this->next_comment();\n\n\t\tif ( $this->current_comment == 0 ) {\n\t\t\t/**\n\t\t\t * Fires once the comment loop is started.\n\t\t\t *\n\t\t\t * @since 2.2.0\n\t\t\t */\n\t\t\tdo_action( 'comment_loop_start' );\n\t\t}\n\t}\n\n\t/**\n\t * Whether there are more comments available.\n\t *\n\t * Automatically rewinds comments when finished.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t *\n\t * @return bool True, if more comments. False, if no more posts.\n\t */\n\tpublic function have_comments() {\n\t\tif ( $this->current_comment + 1 < $this->comment_count ) {\n\t\t\treturn true;\n\t\t} elseif ( $this->current_comment + 1 == $this->comment_count ) {\n\t\t\t$this->rewind_comments();\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Rewind the comments, resets the comment index and comment to first.\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t */\n\tpublic function rewind_comments() {\n\t\t$this->current_comment = -1;\n\t\tif ( $this->comment_count > 0 ) {\n\t\t\t$this->comment = $this->comments[0];\n\t\t}\n\t}\n\n\t/**\n\t * Sets up the WordPress query by parsing query string.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @param string $query URL query string.\n\t * @return array List of posts.\n\t */\n\tpublic function query( $query ) {\n\t\t$this->init();\n\t\t$this->query = $this->query_vars = wp_parse_args( $query );\n\t\treturn $this->get_posts();\n\t}\n\n\t/**\n\t * Retrieve queried object.\n\t *\n\t * If queried object is not set, then the queried object will be set from\n\t * the category, tag, taxonomy, posts page, single post, page, or author\n\t * query variable. After it is set up, it will be returned.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return object\n\t */\n\tpublic function get_queried_object() {\n\t\tif ( isset($this->queried_object) )\n\t\t\treturn $this->queried_object;\n\n\t\t$this->queried_object = null;\n\t\t$this->queried_object_id = null;\n\n\t\tif ( $this->is_category || $this->is_tag || $this->is_tax ) {\n\t\t\tif ( $this->is_category ) {\n\t\t\t\tif ( $this->get( 'cat' ) ) {\n\t\t\t\t\t$term = get_term( $this->get( 'cat' ), 'category' );\n\t\t\t\t} elseif ( $this->get( 'category_name' ) ) {\n\t\t\t\t\t$term = get_term_by( 'slug', $this->get( 'category_name' ), 'category' );\n\t\t\t\t}\n\t\t\t} elseif ( $this->is_tag ) {\n\t\t\t\tif ( $this->get( 'tag_id' ) ) {\n\t\t\t\t\t$term = get_term( $this->get( 'tag_id' ), 'post_tag' );\n\t\t\t\t} elseif ( $this->get( 'tag' ) ) {\n\t\t\t\t\t$term = get_term_by( 'slug', $this->get( 'tag' ), 'post_tag' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// For other tax queries, grab the first term from the first clause.\n\t\t\t\t$tax_query_in_and = wp_list_filter( $this->tax_query->queried_terms, array( 'operator' => 'NOT IN' ), 'NOT' );\n\n\t\t\t\tif ( ! empty( $tax_query_in_and ) ) {\n\t\t\t\t\t$queried_taxonomies = array_keys( $tax_query_in_and );\n\t\t\t\t\t$matched_taxonomy = reset( $queried_taxonomies );\n\t\t\t\t\t$query = $tax_query_in_and[ $matched_taxonomy ];\n\n\t\t\t\t\tif ( $query['terms'] ) {\n\t\t\t\t\t\tif ( 'term_id' == $query['field'] ) {\n\t\t\t\t\t\t\t$term = get_term( reset( $query['terms'] ), $matched_taxonomy );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$term = get_term_by( $query['field'], reset( $query['terms'] ), $matched_taxonomy );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! empty( $term ) && ! is_wp_error( $term ) )  {\n\t\t\t\t$this->queried_object = $term;\n\t\t\t\t$this->queried_object_id = (int) $term->term_id;\n\n\t\t\t\tif ( $this->is_category && 'category' === $this->queried_object->taxonomy )\n\t\t\t\t\t_make_cat_compat( $this->queried_object );\n\t\t\t}\n\t\t} elseif ( $this->is_post_type_archive ) {\n\t\t\t$post_type = $this->get( 'post_type' );\n\t\t\tif ( is_array( $post_type ) )\n\t\t\t\t$post_type = reset( $post_type );\n\t\t\t$this->queried_object = get_post_type_object( $post_type );\n\t\t} elseif ( $this->is_posts_page ) {\n\t\t\t$page_for_posts = get_option('page_for_posts');\n\t\t\t$this->queried_object = get_post( $page_for_posts );\n\t\t\t$this->queried_object_id = (int) $this->queried_object->ID;\n\t\t} elseif ( $this->is_singular && ! empty( $this->post ) ) {\n\t\t\t$this->queried_object = $this->post;\n\t\t\t$this->queried_object_id = (int) $this->post->ID;\n\t\t} elseif ( $this->is_author ) {\n\t\t\t$this->queried_object_id = (int) $this->get('author');\n\t\t\t$this->queried_object = get_userdata( $this->queried_object_id );\n\t\t}\n\n\t\treturn $this->queried_object;\n\t}\n\n\t/**\n\t * Retrieve ID of the current queried object.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @return int\n\t */\n\tpublic function get_queried_object_id() {\n\t\t$this->get_queried_object();\n\n\t\tif ( isset($this->queried_object_id) ) {\n\t\t\treturn $this->queried_object_id;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t/**\n\t * Constructor.\n\t *\n\t * Sets up the WordPress query, if parameter is not empty.\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t *\n\t * @param string|array $query URL query string or array of vars.\n\t */\n\tpublic function __construct($query = '') {\n\t\tif ( ! empty($query) ) {\n\t\t\t$this->query($query);\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to get.\n\t * @return mixed Property.\n\t */\n\tpublic function __get( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn $this->$name;\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties checkable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to check if set.\n\t * @return bool Whether the property is set.\n\t */\n\tpublic function __isset( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn isset( $this->$name );\n\t\t}\n\t}\n\n\t/**\n\t * Make private/protected methods readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param callable $name      Method to call.\n\t * @param array    $arguments Arguments to pass when calling.\n\t * @return mixed|false Return value of the callback, false otherwise.\n\t */\n\tpublic function __call( $name, $arguments ) {\n\t\tif ( in_array( $name, $this->compat_methods ) ) {\n\t\t\treturn call_user_func_array( array( $this, $name ), $arguments );\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n \t * Is the query for an existing archive page?\n \t *\n \t * Month, Year, Category, Author, Post Type archive...\n\t *\n \t * @since 3.1.0\n \t *\n \t * @return bool\n \t */\n\tpublic function is_archive() {\n\t\treturn (bool) $this->is_archive;\n\t}\n\n\t/**\n\t * Is the query for an existing post type archive page?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param mixed $post_types Optional. Post type or array of posts types to check against.\n\t * @return bool\n\t */\n\tpublic function is_post_type_archive( $post_types = '' ) {\n\t\tif ( empty( $post_types ) || ! $this->is_post_type_archive )\n\t\t\treturn (bool) $this->is_post_type_archive;\n\n\t\t$post_type = $this->get( 'post_type' );\n\t\tif ( is_array( $post_type ) )\n\t\t\t$post_type = reset( $post_type );\n\t\t$post_type_object = get_post_type_object( $post_type );\n\n\t\treturn in_array( $post_type_object->name, (array) $post_types );\n\t}\n\n\t/**\n\t * Is the query for an existing attachment page?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param mixed $attachment Attachment ID, title, slug, or array of such.\n\t * @return bool\n\t */\n\tpublic function is_attachment( $attachment = '' ) {\n\t\tif ( ! $this->is_attachment ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( empty( $attachment ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t$attachment = (array) $attachment;\n\n\t\t$post_obj = $this->get_queried_object();\n\n\t\tif ( in_array( (string) $post_obj->ID, $attachment ) ) {\n\t\t\treturn true;\n\t\t} elseif ( in_array( $post_obj->post_title, $attachment ) ) {\n\t\t\treturn true;\n\t\t} elseif ( in_array( $post_obj->post_name, $attachment ) ) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Is the query for an existing author archive page?\n\t *\n\t * If the $author parameter is specified, this function will additionally\n\t * check if the query is for one of the authors specified.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param mixed $author Optional. User ID, nickname, nicename, or array of User IDs, nicknames, and nicenames\n\t * @return bool\n\t */\n\tpublic function is_author( $author = '' ) {\n\t\tif ( !$this->is_author )\n\t\t\treturn false;\n\n\t\tif ( empty($author) )\n\t\t\treturn true;\n\n\t\t$author_obj = $this->get_queried_object();\n\n\t\t$author = (array) $author;\n\n\t\tif ( in_array( (string) $author_obj->ID, $author ) )\n\t\t\treturn true;\n\t\telseif ( in_array( $author_obj->nickname, $author ) )\n\t\t\treturn true;\n\t\telseif ( in_array( $author_obj->user_nicename, $author ) )\n\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Is the query for an existing category archive page?\n\t *\n\t * If the $category parameter is specified, this function will additionally\n\t * check if the query is for one of the categories specified.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param mixed $category Optional. Category ID, name, slug, or array of Category IDs, names, and slugs.\n\t * @return bool\n\t */\n\tpublic function is_category( $category = '' ) {\n\t\tif ( !$this->is_category )\n\t\t\treturn false;\n\n\t\tif ( empty($category) )\n\t\t\treturn true;\n\n\t\t$cat_obj = $this->get_queried_object();\n\n\t\t$category = (array) $category;\n\n\t\tif ( in_array( (string) $cat_obj->term_id, $category ) )\n\t\t\treturn true;\n\t\telseif ( in_array( $cat_obj->name, $category ) )\n\t\t\treturn true;\n\t\telseif ( in_array( $cat_obj->slug, $category ) )\n\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Is the query for an existing tag archive page?\n\t *\n\t * If the $tag parameter is specified, this function will additionally\n\t * check if the query is for one of the tags specified.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param mixed $tag Optional. Tag ID, name, slug, or array of Tag IDs, names, and slugs.\n\t * @return bool\n\t */\n\tpublic function is_tag( $tag = '' ) {\n\t\tif ( ! $this->is_tag )\n\t\t\treturn false;\n\n\t\tif ( empty( $tag ) )\n\t\t\treturn true;\n\n\t\t$tag_obj = $this->get_queried_object();\n\n\t\t$tag = (array) $tag;\n\n\t\tif ( in_array( (string) $tag_obj->term_id, $tag ) )\n\t\t\treturn true;\n\t\telseif ( in_array( $tag_obj->name, $tag ) )\n\t\t\treturn true;\n\t\telseif ( in_array( $tag_obj->slug, $tag ) )\n\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Is the query for an existing taxonomy archive page?\n\t *\n\t * If the $taxonomy parameter is specified, this function will additionally\n\t * check if the query is for that specific $taxonomy.\n\t *\n\t * If the $term parameter is specified in addition to the $taxonomy parameter,\n\t * this function will additionally check if the query is for one of the terms\n\t * specified.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @global array $wp_taxonomies\n\t *\n\t * @param mixed $taxonomy Optional. Taxonomy slug or slugs.\n\t * @param mixed $term     Optional. Term ID, name, slug or array of Term IDs, names, and slugs.\n\t * @return bool\n\t */\n\tpublic function is_tax( $taxonomy = '', $term = '' ) {\n\t\tglobal $wp_taxonomies;\n\n\t\tif ( !$this->is_tax )\n\t\t\treturn false;\n\n\t\tif ( empty( $taxonomy ) )\n\t\t\treturn true;\n\n\t\t$queried_object = $this->get_queried_object();\n\t\t$tax_array = array_intersect( array_keys( $wp_taxonomies ), (array) $taxonomy );\n\t\t$term_array = (array) $term;\n\n\t\t// Check that the taxonomy matches.\n\t\tif ( ! ( isset( $queried_object->taxonomy ) && count( $tax_array ) && in_array( $queried_object->taxonomy, $tax_array ) ) )\n\t\t\treturn false;\n\n\t\t// Only a Taxonomy provided.\n\t\tif ( empty( $term ) )\n\t\t\treturn true;\n\n\t\treturn isset( $queried_object->term_id ) &&\n\t\t\tcount( array_intersect(\n\t\t\t\tarray( $queried_object->term_id, $queried_object->name, $queried_object->slug ),\n\t\t\t\t$term_array\n\t\t\t) );\n\t}\n\n\t/**\n\t * Whether the current URL is within the comments popup window.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_comments_popup() {\n\t\treturn (bool) $this->is_comments_popup;\n\t}\n\n\t/**\n\t * Is the query for an existing date archive?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_date() {\n\t\treturn (bool) $this->is_date;\n\t}\n\n\t/**\n\t * Is the query for an existing day archive?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_day() {\n\t\treturn (bool) $this->is_day;\n\t}\n\n\t/**\n\t * Is the query for a feed?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string|array $feeds Optional feed types to check.\n\t * @return bool\n\t */\n\tpublic function is_feed( $feeds = '' ) {\n\t\tif ( empty( $feeds ) || ! $this->is_feed )\n\t\t\treturn (bool) $this->is_feed;\n\t\t$qv = $this->get( 'feed' );\n\t\tif ( 'feed' == $qv )\n\t\t\t$qv = get_default_feed();\n\t\treturn in_array( $qv, (array) $feeds );\n\t}\n\n\t/**\n\t * Is the query for a comments feed?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_comment_feed() {\n\t\treturn (bool) $this->is_comment_feed;\n\t}\n\n\t/**\n\t * Is the query for the front page of the site?\n\t *\n\t * This is for what is displayed at your site's main URL.\n\t *\n\t * Depends on the site's \"Front page displays\" Reading Settings 'show_on_front' and 'page_on_front'.\n\t *\n\t * If you set a static page for the front page of your site, this function will return\n\t * true when viewing that page.\n\t *\n\t * Otherwise the same as @see WP_Query::is_home()\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool True, if front of site.\n\t */\n\tpublic function is_front_page() {\n\t\t// most likely case\n\t\tif ( 'posts' == get_option( 'show_on_front') && $this->is_home() )\n\t\t\treturn true;\n\t\telseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $this->is_page( get_option( 'page_on_front' ) ) )\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n\n\t/**\n\t * Is the query for the blog homepage?\n\t *\n\t * This is the page which shows the time based blog content of your site.\n\t *\n\t * Depends on the site's \"Front page displays\" Reading Settings 'show_on_front' and 'page_for_posts'.\n\t *\n\t * If you set a static page for the front page of your site, this function will return\n\t * true only on the page you set as the \"Posts page\".\n\t *\n\t * @see WP_Query::is_front_page()\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool True if blog view homepage.\n\t */\n\tpublic function is_home() {\n\t\treturn (bool) $this->is_home;\n\t}\n\n\t/**\n\t * Is the query for an existing month archive?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_month() {\n\t\treturn (bool) $this->is_month;\n\t}\n\n\t/**\n\t * Is the query for an existing single page?\n\t *\n\t * If the $page parameter is specified, this function will additionally\n\t * check if the query is for one of the pages specified.\n\t *\n\t * @see WP_Query::is_single()\n\t * @see WP_Query::is_singular()\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param int|string|array $page Optional. Page ID, title, slug, path, or array of such. Default empty.\n\t * @return bool Whether the query is for an existing single page.\n\t */\n\tpublic function is_page( $page = '' ) {\n\t\tif ( !$this->is_page )\n\t\t\treturn false;\n\n\t\tif ( empty( $page ) )\n\t\t\treturn true;\n\n\t\t$page_obj = $this->get_queried_object();\n\n\t\t$page = (array) $page;\n\n\t\tif ( in_array( (string) $page_obj->ID, $page ) ) {\n\t\t\treturn true;\n\t\t} elseif ( in_array( $page_obj->post_title, $page ) ) {\n\t\t\treturn true;\n\t\t} elseif ( in_array( $page_obj->post_name, $page ) ) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\tforeach ( $page as $pagepath ) {\n\t\t\t\tif ( ! strpos( $pagepath, '/' ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$pagepath_obj = get_page_by_path( $pagepath );\n\n\t\t\t\tif ( $pagepath_obj && ( $pagepath_obj->ID == $page_obj->ID ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Is the query for paged result and not for the first page?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_paged() {\n\t\treturn (bool) $this->is_paged;\n\t}\n\n\t/**\n\t * Is the query for a post or page preview?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_preview() {\n\t\treturn (bool) $this->is_preview;\n\t}\n\n\t/**\n\t * Is the query for the robots file?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_robots() {\n\t\treturn (bool) $this->is_robots;\n\t}\n\n\t/**\n\t * Is the query for a search?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_search() {\n\t\treturn (bool) $this->is_search;\n\t}\n\n\t/**\n\t * Is the query for an existing single post?\n\t *\n\t * Works for any post type, except attachments and pages\n\t *\n\t * If the $post parameter is specified, this function will additionally\n\t * check if the query is for one of the Posts specified.\n\t *\n\t * @see WP_Query::is_page()\n\t * @see WP_Query::is_singular()\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param int|string|array $post Optional. Post ID, title, slug, path, or array of such. Default empty.\n\t * @return bool Whether the query is for an existing single post.\n\t */\n\tpublic function is_single( $post = '' ) {\n\t\tif ( !$this->is_single )\n\t\t\treturn false;\n\n\t\tif ( empty($post) )\n\t\t\treturn true;\n\n\t\t$post_obj = $this->get_queried_object();\n\n\t\t$post = (array) $post;\n\n\t\tif ( in_array( (string) $post_obj->ID, $post ) ) {\n\t\t\treturn true;\n\t\t} elseif ( in_array( $post_obj->post_title, $post ) ) {\n\t\t\treturn true;\n\t\t} elseif ( in_array( $post_obj->post_name, $post ) ) {\n\t\t\treturn true;\n\t\t} else {\n\t\t\tforeach ( $post as $postpath ) {\n\t\t\t\tif ( ! strpos( $postpath, '/' ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t$postpath_obj = get_page_by_path( $postpath, OBJECT, $post_obj->post_type );\n\n\t\t\t\tif ( $postpath_obj && ( $postpath_obj->ID == $post_obj->ID ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Is the query for an existing single post of any post type (post, attachment, page, ... )?\n\t *\n\t * If the $post_types parameter is specified, this function will additionally\n\t * check if the query is for one of the Posts Types specified.\n\t *\n\t * @see WP_Query::is_page()\n\t * @see WP_Query::is_single()\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param string|array $post_types Optional. Post type or array of post types. Default empty.\n\t * @return bool Whether the query is for an existing single post of any of the given post types.\n\t */\n\tpublic function is_singular( $post_types = '' ) {\n\t\tif ( empty( $post_types ) || !$this->is_singular )\n\t\t\treturn (bool) $this->is_singular;\n\n\t\t$post_obj = $this->get_queried_object();\n\n\t\treturn in_array( $post_obj->post_type, (array) $post_types );\n\t}\n\n\t/**\n\t * Is the query for a specific time?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_time() {\n\t\treturn (bool) $this->is_time;\n\t}\n\n\t/**\n\t * Is the query for a trackback endpoint call?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_trackback() {\n\t\treturn (bool) $this->is_trackback;\n\t}\n\n\t/**\n\t * Is the query for an existing year archive?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_year() {\n\t\treturn (bool) $this->is_year;\n\t}\n\n\t/**\n\t * Is the query a 404 (returns no results)?\n\t *\n\t * @since 3.1.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_404() {\n\t\treturn (bool) $this->is_404;\n\t}\n\n\t/**\n\t * Is the query for an embedded post?\n\t *\n\t * @since 4.4.0\n\t *\n\t * @return bool\n\t */\n\tpublic function is_embed() {\n\t\treturn (bool) $this->is_embed;\n\t}\n\n\t/**\n\t * Is the query the main query?\n\t *\n\t * @since 3.3.0\n\t *\n\t * @global WP_Query $wp_query Global WP_Query instance.\n\t *\n\t * @return bool\n\t */\n\tpublic function is_main_query() {\n\t\tglobal $wp_the_query;\n\t\treturn $wp_the_query === $this;\n\t}\n\n\t/**\n\t * Set up global post data.\n\t *\n\t * @since 4.1.0\n\t * @since 4.4.0 Added the ability to pass a post ID to `$post`.\n\t *\n\t * @global int             $id\n\t * @global WP_User         $authordata\n\t * @global string|int|bool $currentday\n\t * @global string|int|bool $currentmonth\n\t * @global int             $page\n\t * @global array           $pages\n\t * @global int             $multipage\n\t * @global int             $more\n\t * @global int             $numpages\n\t *\n\t * @param WP_Post|object|int $post WP_Post instance or Post ID/object.\n\t * @return true True when finished.\n\t */\n\tpublic function setup_postdata( $post ) {\n\t\tglobal $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages;\n\n\t\tif ( ! ( $post instanceof WP_Post ) ) {\n\t\t\t$post = get_post( $post );\n\t\t}\n\n\t\tif ( ! $post ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$id = (int) $post->ID;\n\n\t\t$authordata = get_userdata($post->post_author);\n\n\t\t$currentday = mysql2date('d.m.y', $post->post_date, false);\n\t\t$currentmonth = mysql2date('m', $post->post_date, false);\n\t\t$numpages = 1;\n\t\t$multipage = 0;\n\t\t$page = $this->get( 'page' );\n\t\tif ( ! $page )\n\t\t\t$page = 1;\n\n\t\t/*\n\t\t * Force full post content when viewing the permalink for the $post,\n\t\t * or when on an RSS feed. Otherwise respect the 'more' tag.\n\t\t */\n\t\tif ( $post->ID === get_queried_object_id() && ( $this->is_page() || $this->is_single() ) ) {\n\t\t\t$more = 1;\n\t\t} elseif ( $this->is_feed() ) {\n\t\t\t$more = 1;\n\t\t} else {\n\t\t\t$more = 0;\n\t\t}\n\n\t\t$content = $post->post_content;\n\t\tif ( false !== strpos( $content, '<!--nextpage-->' ) ) {\n\t\t\t$content = str_replace( \"\\n<!--nextpage-->\\n\", '<!--nextpage-->', $content );\n\t\t\t$content = str_replace( \"\\n<!--nextpage-->\", '<!--nextpage-->', $content );\n\t\t\t$content = str_replace( \"<!--nextpage-->\\n\", '<!--nextpage-->', $content );\n\n\t\t\t// Ignore nextpage at the beginning of the content.\n\t\t\tif ( 0 === strpos( $content, '<!--nextpage-->' ) )\n\t\t\t\t$content = substr( $content, 15 );\n\n\t\t\t$pages = explode('<!--nextpage-->', $content);\n\t\t} else {\n\t\t\t$pages = array( $post->post_content );\n\t\t}\n\n\t\t/**\n\t\t * Filter the \"pages\" derived from splitting the post content.\n\t\t *\n\t\t * \"Pages\" are determined by splitting the post content based on the presence\n\t\t * of `<!-- nextpage -->` tags.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array   $pages Array of \"pages\" derived from the post content.\n\t\t *                       of `<!-- nextpage -->` tags..\n\t\t * @param WP_Post $post  Current post object.\n\t\t */\n\t\t$pages = apply_filters( 'content_pagination', $pages, $post );\n\n\t\t$numpages = count( $pages );\n\n\t\tif ( $numpages > 1 ) {\n\t\t\tif ( $page > 1 ) {\n\t\t\t\t$more = 1;\n\t\t\t}\n\t\t\t$multipage = 1;\n\t\t} else {\n\t \t\t$multipage = 0;\n\t \t}\n\n\t\t/**\n\t\t * Fires once the post data has been setup.\n\t\t *\n\t\t * @since 2.8.0\n\t\t * @since 4.1.0 Introduced `$this` parameter.\n\t\t *\n\t\t * @param WP_Post  &$post The Post object (passed by reference).\n\t\t * @param WP_Query &$this The current Query object (passed by reference).\n\t\t */\n\t\tdo_action_ref_array( 'the_post', array( &$post, &$this ) );\n\n\t\treturn true;\n\t}\n\t/**\n\t * After looping through a nested query, this function\n\t * restores the $post global to the current post in this query.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @global WP_Post $post\n\t */\n\tpublic function reset_postdata() {\n\t\tif ( ! empty( $this->post ) ) {\n\t\t\t$GLOBALS['post'] = $this->post;\n\t\t\t$this->setup_postdata( $this->post );\n\t\t}\n\t}\n\n\t/**\n\t * Lazy-loads termmeta for located posts.\n\t *\n\t * As a rule, term queries (`get_terms()` and `wp_get_object_terms()`) prime the metadata cache for matched\n\t * terms by default. However, this can cause a slight performance penalty, especially when that metadata is\n\t * not actually used. In the context of a `WP_Query` instance, we're able to avoid this potential penalty.\n\t * `update_object_term_cache()`, called from `update_post_caches()`, does not 'update_term_meta_cache'.\n\t * Instead, the first time `get_term_meta()` is called from within a `WP_Query` loop, the current method\n\t * detects the fact, and then primes the metadata cache for all terms attached to all posts in the loop,\n\t * with a single database query.\n\t *\n\t * This method is public so that it can be used as a filter callback. As a rule, there is no need to invoke it\n\t * directly, from either inside or outside the `WP_Query` object.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param mixed $check  The `$check` param passed from the 'get_term_metadata' hook.\n\t * @param int  $term_id ID of the term whose metadata is being cached.\n\t * @return mixed In order not to short-circuit `get_metadata()`. Generally, this is `null`, but it could be\n\t *               another value if filtered by a plugin.\n\t */\n\tpublic function lazyload_term_meta( $check, $term_id ) {\n\t\t/*\n\t\t * We only do this once per `WP_Query` instance.\n\t\t * Can't use `remove_filter()` because of non-unique object hashes.\n\t\t */\n\t\tif ( $this->updated_term_meta_cache ) {\n\t\t\treturn $check;\n\t\t}\n\n\t\t// We can only lazyload if the entire post object is present.\n\t\t$posts = array();\n\t\tforeach ( $this->posts as $post ) {\n\t\t\tif ( $post instanceof WP_Post ) {\n\t\t\t\t$posts[] = $post;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $posts ) ) {\n\t\t\t// Fetch cached term_ids for each post. Keyed by term_id for faster lookup.\n\t\t\t$term_ids = array();\n\t\t\tforeach ( $posts as $post ) {\n\t\t\t\t$taxonomies = get_object_taxonomies( $post->post_type );\n\t\t\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\t\t\t// Term cache should already be primed by 'update_post_term_cache'.\n\t\t\t\t\t$terms = get_object_term_cache( $post->ID, $taxonomy );\n\t\t\t\t\tif ( false !== $terms ) {\n\t\t\t\t\t\tforeach ( $terms as $term ) {\n\t\t\t\t\t\t\tif ( ! isset( $term_ids[ $term->term_id ] ) ) {\n\t\t\t\t\t\t\t\t$term_ids[ $term->term_id ] = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Only update the metadata cache for terms belonging to these posts if the term_id passed\n\t\t\t * to `get_term_meta()` matches one of those terms. This prevents a single call to\n\t\t\t * `get_term_meta()` from priming metadata for all `WP_Query` objects.\n\t\t\t */\n\t\t\tif ( isset( $term_ids[ $term_id ] ) ) {\n\t\t\t\tupdate_termmeta_cache( array_keys( $term_ids ) );\n\t\t\t\t$this->updated_term_meta_cache = true;\n\t\t\t}\n\t\t}\n\n\t\t// If no terms were found, there's no need to run this again.\n\t\tif ( empty( $term_ids ) ) {\n\t\t\t$this->updated_term_meta_cache = true;\n\t\t}\n\n\t\treturn $check;\n\t}\n\n\t/**\n\t * Lazy-load comment meta when inside of a `WP_Query` loop.\n\t *\n\t * This method is public so that it can be used as a filter callback. As a rule, there is no need to invoke it\n\t * directly, from either inside or outside the `WP_Query` object.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param mixed $check     The `$check` param passed from the 'get_comment_metadata' hook.\n\t * @param int  $comment_id ID of the comment whose metadata is being cached.\n\t * @return mixed The original value of `$check`, to not affect 'get_comment_metadata'.\n\t */\n\tpublic function lazyload_comment_meta( $check, $comment_id ) {\n\t\t/*\n\t\t * We only do this once per `WP_Query` instance.\n\t\t * Can't use `remove_filter()` because of non-unique object hashes.\n\t\t */\n\t\tif ( $this->updated_comment_meta_cache ) {\n\t\t\treturn $check;\n\t\t}\n\n\t\t// Don't use `wp_list_pluck()` to avoid by-reference manipulation.\n\t\t$comment_ids = array();\n\t\tif ( is_array( $this->comments ) ) {\n\t\t\tforeach ( $this->comments as $comment ) {\n\t\t\t\t$comment_ids[] = $comment->comment_ID;\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t * Only update the metadata cache for comments belonging to these posts if the comment_id passed\n\t\t * to `get_comment_meta()` matches one of those comments. This prevents a single call to\n\t\t * `get_comment_meta()` from priming metadata for all `WP_Query` objects.\n\t\t */\n\t\tif ( in_array( $comment_id, $comment_ids ) ) {\n\t\t\tupdate_meta_cache( 'comment', $comment_ids );\n\t\t\t$this->updated_comment_meta_cache = true;\n\t\t} elseif ( empty( $comment_ids ) ) {\n\t\t\t$this->updated_comment_meta_cache = true;\n\t\t}\n\n\t\treturn $check;\n\t}\n}\n\n/**\n * Redirect old slugs to the correct permalink.\n *\n * Attempts to find the current slug from the past slugs.\n *\n * @since 2.1.0\n *\n * @global WP_Query   $wp_query   Global WP_Query instance.\n * @global wpdb       $wpdb       WordPress database abstraction object.\n */\nfunction wp_old_slug_redirect() {\n\tglobal $wp_query;\n\n\tif ( is_404() && '' !== $wp_query->query_vars['name'] ) :\n\t\tglobal $wpdb;\n\n\t\t// Guess the current post_type based on the query vars.\n\t\tif ( get_query_var( 'post_type' ) ) {\n\t\t\t$post_type = get_query_var( 'post_type' );\n\t\t} elseif ( get_query_var( 'attachment' ) ) {\n\t\t\t$post_type = 'attachment';\n\t\t} elseif ( ! empty( $wp_query->query_vars['pagename'] ) ) {\n\t\t\t$post_type = 'page';\n\t\t} else {\n\t\t\t$post_type = 'post';\n\t\t}\n\n\t\tif ( is_array( $post_type ) ) {\n\t\t\tif ( count( $post_type ) > 1 )\n\t\t\t\treturn;\n\t\t\t$post_type = reset( $post_type );\n\t\t}\n\n\t\t// Do not attempt redirect for hierarchical post types\n\t\tif ( is_post_type_hierarchical( $post_type ) )\n\t\t\treturn;\n\n\t\t$query = $wpdb->prepare(\"SELECT post_id FROM $wpdb->postmeta, $wpdb->posts WHERE ID = post_id AND post_type = %s AND meta_key = '_wp_old_slug' AND meta_value = %s\", $post_type, $wp_query->query_vars['name']);\n\n\t\t// if year, monthnum, or day have been specified, make our query more precise\n\t\t// just in case there are multiple identical _wp_old_slug values\n\t\tif ( '' != $wp_query->query_vars['year'] )\n\t\t\t$query .= $wpdb->prepare(\" AND YEAR(post_date) = %d\", $wp_query->query_vars['year']);\n\t\tif ( '' != $wp_query->query_vars['monthnum'] )\n\t\t\t$query .= $wpdb->prepare(\" AND MONTH(post_date) = %d\", $wp_query->query_vars['monthnum']);\n\t\tif ( '' != $wp_query->query_vars['day'] )\n\t\t\t$query .= $wpdb->prepare(\" AND DAYOFMONTH(post_date) = %d\", $wp_query->query_vars['day']);\n\n\t\t$id = (int) $wpdb->get_var($query);\n\n\t\tif ( ! $id )\n\t\t\treturn;\n\n\t\t$link = get_permalink( $id );\n\n\t\tif ( isset( $GLOBALS['wp_query']->query_vars['paged'] ) && $GLOBALS['wp_query']->query_vars['paged'] > 1 ) {\n\t\t\t$link = user_trailingslashit( trailingslashit( $link ) . 'page/' . $GLOBALS['wp_query']->query_vars['paged'] );\n\t\t} elseif( is_embed() ) {\n\t\t\t$link = user_trailingslashit( trailingslashit( $link ) . 'embed' );\n\t\t}\n\n\t\t/**\n\t\t * Filter the old slug redirect URL.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param string $link The redirect URL.\n\t\t */\n\t\t$link = apply_filters( 'old_slug_redirect_url', $link );\n\n\t\tif ( ! $link ) {\n\t\t\treturn;\n\t\t}\n\n\t\twp_redirect( $link, 301 ); // Permanent redirect\n\t\texit;\n\tendif;\n}\n\n/**\n * Set up global post data.\n *\n * @since 1.5.0\n * @since 4.4.0 Added the ability to pass a post ID to `$post`.\n *\n * @global WP_Query $wp_query Global WP_Query instance.\n *\n * @param WP_Post|object|int $post WP_Post instance or Post ID/object.\n * @return bool True when finished.\n */\nfunction setup_postdata( $post ) {\n\tglobal $wp_query;\n\n\tif ( ! empty( $wp_query ) && $wp_query instanceof WP_Query ) {\n\t\treturn $wp_query->setup_postdata( $post );\n\t}\n\n\treturn false;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/byte_safe_strings.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library\n * for using the new PHP 7 random_* API in PHP 5 projects\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Paragon Initiative Enterprises\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nif (!function_exists('RandomCompat_strlen')) {\n    if (\n        defined('MB_OVERLOAD_STRING') &&\n        ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING\n    ) {\n        /**\n         * strlen() implementation that isn't brittle to mbstring.func_overload\n         *\n         * This version uses mb_strlen() in '8bit' mode to treat strings as raw\n         * binary rather than UTF-8, ISO-8859-1, etc\n         *\n         * @param string $binary_string\n         *\n         * @throws TypeError\n         *\n         * @return int\n         */\n        function RandomCompat_strlen($binary_string)\n        {\n            if (!is_string($binary_string)) {\n                throw new TypeError(\n                    'RandomCompat_strlen() expects a string'\n                );\n            }\n            return mb_strlen($binary_string, '8bit');\n        }\n    } else {\n        /**\n         * strlen() implementation that isn't brittle to mbstring.func_overload\n         *\n         * This version just used the default strlen()\n         *\n         * @param string $binary_string\n         *\n         * @throws TypeError\n         *\n         * @return int\n         */\n        function RandomCompat_strlen($binary_string)\n        {\n            if (!is_string($binary_string)) {\n                throw new TypeError(\n                    'RandomCompat_strlen() expects a string'\n                );\n            }\n            return strlen($binary_string);\n        }\n    }\n}\n\nif (!function_exists('RandomCompat_substr')) {\n    if (\n        defined('MB_OVERLOAD_STRING') &&\n        ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING\n    ) {\n        /**\n         * substr() implementation that isn't brittle to mbstring.func_overload\n         *\n         * This version uses mb_substr() in '8bit' mode to treat strings as raw\n         * binary rather than UTF-8, ISO-8859-1, etc\n         *\n         * @param string $binary_string\n         * @param int $start\n         * @param int $length (optional)\n         *\n         * @throws TypeError\n         *\n         * @return string\n         */\n        function RandomCompat_substr($binary_string, $start, $length = null)\n        {\n            if (!is_string($binary_string)) {\n                throw new TypeError(\n                    'RandomCompat_substr(): First argument should be a string'\n                );\n            }\n            if (!is_int($start)) {\n                throw new TypeError(\n                    'RandomCompat_substr(): Second argument should be an integer'\n                );\n            }\n            if ($length === null) {\n                /**\n                 * mb_substr($str, 0, NULL, '8bit') returns an empty string on\n                 * PHP 5.3, so we have to find the length ourselves.\n                 */\n                $length = RandomCompat_strlen($length) - $start;\n            } elseif (!is_int($length)) {\n                throw new TypeError(\n                    'RandomCompat_substr(): Third argument should be an integer, or omitted'\n                );\n            }\n            return mb_substr($binary_string, $start, $length, '8bit');\n        }\n    } else {\n        /**\n         * substr() implementation that isn't brittle to mbstring.func_overload\n         *\n         * This version just uses the default substr()\n         *\n         * @param string $binary_string\n         * @param int $start\n         * @param int $length (optional)\n         *\n         * @throws TypeError\n         *\n         * @return string\n         */\n        function RandomCompat_substr($binary_string, $start, $length = null)\n        {\n            if (!is_string($binary_string)) {\n                throw new TypeError(\n                    'RandomCompat_substr(): First argument should be a string'\n                );\n            }\n            if (!is_int($start)) {\n                throw new TypeError(\n                    'RandomCompat_substr(): Second argument should be an integer'\n                );\n            }\n            if ($length !== null) {\n                if (!is_int($length)) {\n                    throw new TypeError(\n                        'RandomCompat_substr(): Third argument should be an integer, or omitted'\n                    );\n                }\n                return substr($binary_string, $start, $length);\n            }\n            return substr($binary_string, $start);\n        }\n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/cast_to_int.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library\n * for using the new PHP 7 random_* API in PHP 5 projects\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 Paragon Initiative Enterprises\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nif (!function_exists('RandomCompat_intval')) {\n    \n    /**\n     * Cast to an integer if we can, safely.\n     * \n     * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)\n     * (non-inclusive), it will sanely cast it to an int. If you it's equal to\n     * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats \n     * lose precision, so the <= and => operators might accidentally let a float\n     * through.\n     * \n     * @param numeric $number The number we want to convert to an int\n     * @param boolean $fail_open Set to true to not throw an exception\n     * \n     * @return int (or float if $fail_open)\n     */\n    function RandomCompat_intval($number, $fail_open = false)\n    {\n        if (is_numeric($number)) {\n            $number += 0;\n        }\n        if (\n            is_float($number) &&\n            $number > ~PHP_INT_MAX &&\n            $number < PHP_INT_MAX\n        ) {\n            $number = (int) $number;\n        }\n        if (is_int($number) || $fail_open) {\n            return $number;\n        }\n        throw new TypeError(\n            'Expected an integer.'\n        );\n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/error_polyfill.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library \n * for using the new PHP 7 random_* API in PHP 5 projects\n * \n * The MIT License (MIT)\n * \n * Copyright (c) 2015 Paragon Initiative Enterprises\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nif (!class_exists('Error', false)) {\n    // We can't really avoid making this extend Exception in PHP 5.\n    class Error extends Exception\n    {\n        \n    }\n}\n\nif (!class_exists('TypeError', false)) {\n    class TypeError extends Error\n    {\n        \n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/random.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library \n * for using the new PHP 7 random_* API in PHP 5 projects\n * \n * The MIT License (MIT)\n * \n * Copyright (c) 2015 Paragon Initiative Enterprises\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nif (!defined('PHP_VERSION_ID')) {\n    // This constant was introduced in PHP 5.2.7\n    $RandomCompatversion = explode('.', PHP_VERSION);\n    define('PHP_VERSION_ID', ($RandomCompatversion[0] * 10000 + $RandomCompatversion[1] * 100 + $RandomCompatversion[2]));\n    $RandomCompatversion = null;\n}\nif (PHP_VERSION_ID < 70000) {\n    if (!defined('RANDOM_COMPAT_READ_BUFFER')) {\n        define('RANDOM_COMPAT_READ_BUFFER', 8);\n    }\n    $RandomCompatDIR = dirname(__FILE__);\n    require_once $RandomCompatDIR.'/byte_safe_strings.php';\n    require_once $RandomCompatDIR.'/cast_to_int.php';\n    require_once $RandomCompatDIR.'/error_polyfill.php';\n    if (!function_exists('random_bytes')) {\n        /**\n         * PHP 5.2.0 - 5.6.x way to implement random_bytes()\n         * \n         * We use conditional statements here to define the function in accordance\n         * to the operating environment. It's a micro-optimization.\n         * \n         * In order of preference:\n         *   1. Use libsodium if available.\n         *   2. fread() /dev/urandom if available (never on Windows)\n         *   3. mcrypt_create_iv($bytes, MCRYPT_CREATE_IV)\n         *   4. COM('CAPICOM.Utilities.1')->GetRandom()\n         *   5. openssl_random_pseudo_bytes() (absolute last resort)\n         * \n         * See ERRATA.md for our reasoning behind this particular order\n         */\n        if (PHP_VERSION_ID >= 50300 && extension_loaded('libsodium') && function_exists('\\\\Sodium\\\\randombytes_buf')) {\n            // See random_bytes_libsodium.php\n            require_once $RandomCompatDIR.'/random_bytes_libsodium.php';\n        }\n        if (\n            !function_exists('random_bytes') && \n            DIRECTORY_SEPARATOR === '/' &&\n            @is_readable('/dev/urandom')\n        ) {\n            // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast\n            // way to exclude Windows.\n            // \n            // Error suppression on is_readable() in case of an open_basedir or \n            // safe_mode failure. All we care about is whether or not we can \n            // read it at this point. If the PHP environment is going to panic \n            // over trying to see if the file can be read in the first place,\n            // that is not helpful to us here.\n            \n            // See random_bytes_dev_urandom.php\n            require_once $RandomCompatDIR.'/random_bytes_dev_urandom.php';\n        }\n        if (\n            !function_exists('random_bytes') &&\n            PHP_VERSION_ID >= 50307 &&\n            extension_loaded('mcrypt')\n        ) {\n            // See random_bytes_mcrypt.php\n            require_once $RandomCompatDIR.'/random_bytes_mcrypt.php';\n        }\n        if (\n            !function_exists('random_bytes') && \n            extension_loaded('com_dotnet') &&\n            class_exists('COM')\n        ) {\n            $RandomCompat_disabled_classes = preg_split(\n                '#\\s*,\\s*#', \n                strtolower(ini_get('disable_classes'))\n            );\n            \n            if (!in_array('com', $RandomCompat_disabled_classes)) {\n                try {\n                    $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1');\n                    if (method_exists($RandomCompatCOMtest, 'GetRandom')) {\n                        // See random_bytes_com_dotnet.php\n                        require_once $RandomCompatDIR.'/random_bytes_com_dotnet.php';\n                    }\n                } catch (com_exception $e) {\n                    // Don't try to use it.\n                }\n            }\n            $RandomCompat_disabled_classes = null;\n            $RandomCompatCOMtest = null;\n        }\n        if (\n            !function_exists('random_bytes') && \n            extension_loaded('openssl') &&\n            (\n                // Unix-like with PHP >= 5.3.0 or\n                (\n                    DIRECTORY_SEPARATOR === '/' &&\n                    PHP_VERSION_ID >= 50300\n                ) ||\n                // Windows with PHP >= 5.4.1\n                PHP_VERSION_ID >= 50401\n            )\n        ) {\n            // See random_bytes_openssl.php\n            require_once $RandomCompatDIR.'/random_bytes_openssl.php';\n        }\n        if (!function_exists('random_bytes')) {\n            /**\n             * We don't have any more options, so let's throw an exception right now\n             * and hope the developer won't let it fail silently.\n             */\n            function random_bytes()\n            {\n                throw new Exception(\n                    'There is no suitable CSPRNG installed on your system'\n                );\n            }\n        }\n    }\n    if (!function_exists('random_int')) {\n        require_once $RandomCompatDIR.'/random_int.php';\n    }\n    $RandomCompatDIR = null;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/random_bytes_com_dotnet.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library \n * for using the new PHP 7 random_* API in PHP 5 projects\n * \n * The MIT License (MIT)\n * \n * Copyright (c) 2015 Paragon Initiative Enterprises\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Windows with PHP < 5.3.0 will not have the function\n * openssl_random_pseudo_bytes() available, so let's use\n * CAPICOM to work around this deficiency.\n * \n * @param int $bytes\n * \n * @throws Exception\n * \n * @return string\n */\nfunction random_bytes($bytes)\n{\n    try {\n        $bytes = RandomCompat_intval($bytes);\n    } catch (TypeError $ex) {\n        throw new TypeError(\n            'random_bytes(): $bytes must be an integer'\n        );\n    }\n    if ($bytes < 1) {\n        throw new Error(\n            'Length must be greater than 0'\n        );\n    }\n    $buf = '';\n    $util = new COM('CAPICOM.Utilities.1');\n    $execCount = 0;\n    /**\n     * Let's not let it loop forever. If we run N times and fail to\n     * get N bytes of random data, then CAPICOM has failed us.\n     */\n    do {\n        $buf .= base64_decode($util->GetRandom($bytes, 0));\n        if (RandomCompat_strlen($buf) >= $bytes) {\n            /**\n             * Return our random entropy buffer here:\n             */\n            return RandomCompat_substr($buf, 0, $bytes);\n        }\n        ++$execCount; \n    } while ($execCount < $bytes);\n    /**\n     * If we reach here, PHP has failed us.\n     */\n    throw new Exception(\n        'Could not gather sufficient random data'\n    );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/random_bytes_dev_urandom.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library \n * for using the new PHP 7 random_* API in PHP 5 projects\n * \n * The MIT License (MIT)\n * \n * Copyright (c) 2015 Paragon Initiative Enterprises\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nif (!defined('RANDOM_COMPAT_READ_BUFFER')) {\n    define('RANDOM_COMPAT_READ_BUFFER', 8);\n}\n\n/**\n * Unless open_basedir is enabled, use /dev/urandom for\n * random numbers in accordance with best practices\n * \n * Why we use /dev/urandom and not /dev/random\n * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers\n * \n * @param int $bytes\n * \n * @throws Exception\n * \n * @return string\n */\nfunction random_bytes($bytes)\n{\n    static $fp = null;\n    /**\n     * This block should only be run once\n     */\n    if (empty($fp)) {\n        /**\n         * We use /dev/urandom if it is a char device.\n         * We never fall back to /dev/random\n         */\n        $fp = fopen('/dev/urandom', 'rb');\n        if (!empty($fp)) {\n            $st = fstat($fp);\n            if (($st['mode'] & 0170000) !== 020000) {\n                fclose($fp);\n                $fp = false;\n            }\n        }\n        if (!empty($fp)) {\n            /**\n             * stream_set_read_buffer() does not exist in HHVM\n             * \n             * If we don't set the stream's read buffer to 0, PHP will\n             * internally buffer 8192 bytes, which can waste entropy\n             * \n             * stream_set_read_buffer returns 0 on success\n             */\n            if (function_exists('stream_set_read_buffer')) {\n                stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);\n            }\n            if (function_exists('stream_set_chunk_size')) {\n                stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);\n            }\n        }\n    }\n    try {\n        $bytes = RandomCompat_intval($bytes);\n    } catch (TypeError $ex) {\n        throw new TypeError(\n            'random_bytes(): $bytes must be an integer'\n        );\n    }\n    if ($bytes < 1) {\n        throw new Error(\n            'Length must be greater than 0'\n        );\n    }\n    /**\n     * This if() block only runs if we managed to open a file handle\n     * \n     * It does not belong in an else {} block, because the above \n     * if (empty($fp)) line is logic that should only be run once per\n     * page load.\n     */\n    if (!empty($fp)) {\n        $remaining = $bytes;\n        $buf = '';\n        /**\n         * We use fread() in a loop to protect against partial reads\n         */\n        do {\n            $read = fread($fp, $remaining); \n            if ($read === false) {\n                /**\n                 * We cannot safely read from the file. Exit the\n                 * do-while loop and trigger the exception condition\n                 */\n                $buf = false;\n                break;\n            }\n            /**\n             * Decrease the number of bytes returned from remaining\n             */\n            $remaining -= RandomCompat_strlen($read);\n            $buf .= $read;\n        } while ($remaining > 0);\n        \n        /**\n         * Is our result valid?\n         */\n        if ($buf !== false) {\n            if (RandomCompat_strlen($buf) === $bytes) {\n                /**\n                 * Return our random entropy buffer here:\n                 */\n                return $buf;\n            }\n        }\n    }\n    /**\n     * If we reach here, PHP has failed us.\n     */\n    throw new Exception(\n        'Error reading from source device'\n    );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/random_bytes_libsodium.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library \n * for using the new PHP 7 random_* API in PHP 5 projects\n * \n * The MIT License (MIT)\n * \n * Copyright (c) 2015 Paragon Initiative Enterprises\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * If the libsodium PHP extension is loaded, we'll use it above any other\n * solution.\n *\n * libsodium-php project:\n * @ref https://github.com/jedisct1/libsodium-php\n *\n * @param int $bytes\n *\n * @throws Exception\n *\n * @return string\n */\nfunction random_bytes($bytes)\n{\n    try {\n        $bytes = RandomCompat_intval($bytes);\n    } catch (TypeError $ex) {\n        throw new TypeError(\n            'random_bytes(): $bytes must be an integer'\n        );\n    }\n    if ($bytes < 1) {\n        throw new Error(\n            'Length must be greater than 0'\n        );\n    }\n    /**\n     * \\Sodium\\randombytes_buf() doesn't allow more than 2147483647 bytes to be\n     * generated in one invocation.\n     */\n    if ($bytes > 2147483647) {\n        $buf = '';\n        for ($i = 0; $i < $bytes; $i += 1073741824) {\n            $n = ($bytes - $i) > 1073741824\n                ? 1073741824\n                : $bytes - $i;\n            $buf .= \\Sodium\\randombytes_buf($n);\n        }\n    } else {\n        $buf = \\Sodium\\randombytes_buf($bytes);\n    }\n\n    if ($buf !== false) {\n        if (RandomCompat_strlen($buf) === $bytes) {\n            return $buf;\n        }\n    }\n\n    /**\n     * If we reach here, PHP has failed us.\n     */\n    throw new Exception(\n        'Could not gather sufficient random data'\n    );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/random_bytes_mcrypt.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library \n * for using the new PHP 7 random_* API in PHP 5 projects\n * \n * The MIT License (MIT)\n * \n * Copyright (c) 2015 Paragon Initiative Enterprises\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\n/**\n * Powered by ext/mcrypt (and thankfully NOT libmcrypt)\n * \n * @ref https://bugs.php.net/bug.php?id=55169\n * @ref https://github.com/php/php-src/blob/c568ffe5171d942161fc8dda066bce844bdef676/ext/mcrypt/mcrypt.c#L1321-L1386\n * \n * @param int $bytes\n * \n * @throws Exception\n * \n * @return string\n */\nfunction random_bytes($bytes)\n{\n    try {\n        $bytes = RandomCompat_intval($bytes);\n    } catch (TypeError $ex) {\n        throw new TypeError(\n            'random_bytes(): $bytes must be an integer'\n        );\n    }\n    if ($bytes < 1) {\n        throw new Error(\n            'Length must be greater than 0'\n        );\n    }\n\n    $buf = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM);\n    if ($buf !== false) {\n        if (RandomCompat_strlen($buf) === $bytes) {\n            /**\n             * Return our random entropy buffer here:\n             */\n            return $buf;\n        }\n    }\n    /**\n     * If we reach here, PHP has failed us.\n     */\n    throw new Exception(\n        'Could not gather sufficient random data'\n    );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/random_bytes_openssl.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library \n * for using the new PHP 7 random_* API in PHP 5 projects\n * \n * The MIT License (MIT)\n * \n * Copyright (c) 2015 Paragon Initiative Enterprises\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Since openssl_random_pseudo_bytes() uses openssl's \n * RAND_pseudo_bytes() API, which has been marked as deprecated by the\n * OpenSSL team, this is our last resort before failure.\n * \n * @ref https://www.openssl.org/docs/crypto/RAND_bytes.html\n * \n * @param int $bytes\n * \n * @throws Exception\n * \n * @return string\n */\nfunction random_bytes($bytes)\n{\n    try {\n        $bytes = RandomCompat_intval($bytes);\n    } catch (TypeError $ex) {\n        throw new TypeError(\n            'random_bytes(): $bytes must be an integer'\n        );\n    }\n    if ($bytes < 1) {\n        throw new Error(\n            'Length must be greater than 0'\n        );\n    }\n    $secure = true;\n    /**\n     * $secure is passed by reference. If it's set to false, fail. Note\n     * that this will only return false if this function fails to return\n     * any data.\n     * \n     * @ref https://github.com/paragonie/random_compat/issues/6#issuecomment-119564973\n     */\n    $buf = openssl_random_pseudo_bytes($bytes, $secure);\n    if ($buf !== false && $secure) {\n        if (RandomCompat_strlen($buf) === $bytes) {\n            return $buf;\n        }\n    }\n    /**\n     * If we reach here, PHP has failed us.\n     */\n    throw new Exception(\n        'Could not gather sufficient random data'\n    );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/random_compat/random_int.php",
    "content": "<?php\n/**\n * Random_* Compatibility Library \n * for using the new PHP 7 random_* API in PHP 5 projects\n * \n * The MIT License (MIT)\n * \n * Copyright (c) 2015 Paragon Initiative Enterprises\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Fetch a random integer between $min and $max inclusive\n * \n * @param int $min\n * @param int $max\n * \n * @throws Exception\n * \n * @return int\n */\nfunction random_int($min, $max)\n{\n    /**\n     * Type and input logic checks\n     * \n     * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)\n     * (non-inclusive), it will sanely cast it to an int. If you it's equal to\n     * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats \n     * lose precision, so the <= and => operators might accidentally let a float\n     * through.\n     */\n    \n    try {\n        $min = RandomCompat_intval($min);\n    } catch (TypeError $ex) {\n        throw new TypeError(\n            'random_int(): $min must be an integer'\n        );\n    }\n    try {\n        $max = RandomCompat_intval($max);\n    } catch (TypeError $ex) {\n        throw new TypeError(\n            'random_int(): $max must be an integer'\n        );\n    }\n    \n    /**\n     * Now that we've verified our weak typing system has given us an integer,\n     * let's validate the logic then we can move forward with generating random\n     * integers along a given range.\n     */\n    if ($min > $max) {\n        throw new Error(\n            'Minimum value must be less than or equal to the maximum value'\n        );\n    }\n    if ($max === $min) {\n        return $min;\n    }\n\n    /**\n     * Initialize variables to 0\n     * \n     * We want to store:\n     * $bytes => the number of random bytes we need\n     * $mask => an integer bitmask (for use with the &) operator\n     *          so we can minimize the number of discards\n     */\n    $attempts = $bits = $bytes = $mask = $valueShift = 0;\n\n    /**\n     * At this point, $range is a positive number greater than 0. It might\n     * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to\n     * a float and we will lose some precision.\n     */\n    $range = $max - $min;\n\n    /**\n     * Test for integer overflow:\n     */\n    if (!is_int($range)) {\n        /**\n         * Still safely calculate wider ranges.\n         * Provided by @CodesInChaos, @oittaa\n         * \n         * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435\n         * \n         * We use ~0 as a mask in this case because it generates all 1s\n         * \n         * @ref https://eval.in/400356 (32-bit)\n         * @ref http://3v4l.org/XX9r5  (64-bit)\n         */\n        $bytes = PHP_INT_SIZE;\n        $mask = ~0;\n    } else {\n        /**\n         * $bits is effectively ceil(log($range, 2)) without dealing with \n         * type juggling\n         */\n        while ($range > 0) {\n            if ($bits % 8 === 0) {\n               ++$bytes;\n            }\n            ++$bits;\n            $range >>= 1;\n            $mask = $mask << 1 | 1;\n        }\n        $valueShift = $min;\n    }\n\n    /**\n     * Now that we have our parameters set up, let's begin generating\n     * random integers until one falls between $min and $max\n     */\n    do {\n        /**\n         * The rejection probability is at most 0.5, so this corresponds\n         * to a failure probability of 2^-128 for a working RNG\n         */\n        if ($attempts > 128) {\n            throw new Exception(\n                'random_int: RNG is broken - too many rejections'\n            );\n        }\n\n        /**\n         * Let's grab the necessary number of random bytes\n         */\n        $randomByteString = random_bytes($bytes);\n        if ($randomByteString === false) {\n            throw new Exception(\n                'Random number generator failure'\n            );\n        }\n\n        /**\n         * Let's turn $randomByteString into an integer\n         * \n         * This uses bitwise operators (<< and |) to build an integer\n         * out of the values extracted from ord()\n         * \n         * Example: [9F] | [6D] | [32] | [0C] =>\n         *   159 + 27904 + 3276800 + 201326592 =>\n         *   204631455\n         */\n        $val = 0;\n        for ($i = 0; $i < $bytes; ++$i) {\n            $val |= ord($randomByteString[$i]) << ($i * 8);\n        }\n\n        /**\n         * Apply mask\n         */\n        $val &= $mask;\n        $val += $valueShift;\n\n        ++$attempts;\n        /**\n         * If $val overflows to a floating point number,\n         * ... or is larger than $max,\n         * ... or smaller than $min,\n         * then try again.\n         */\n    } while (!is_int($val) || $val > $max || $val < $min);\n    return (int) $val;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/registration-functions.php",
    "content": "<?php\n/**\n * Deprecated. No longer needed.\n *\n * @package WordPress\n */\n_deprecated_file( basename(__FILE__), '2.1', null, __( 'This file no longer needs to be included.' ) );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/registration.php",
    "content": "<?php\n/**\n * Deprecated. No longer needed.\n *\n * @package WordPress\n */\n_deprecated_file( basename(__FILE__), '3.1', null, __( 'This file no longer needs to be included.' ) );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/rest-api/class-wp-rest-request.php",
    "content": "<?php\n/**\n * REST API: WP_REST_Request class\n *\n * @package WordPress\n * @subpackage REST_API\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a REST request object.\n *\n * Contains data from the request, to be passed to the callback.\n *\n * Note: This implements ArrayAccess, and acts as an array of parameters when\n * used in that manner. It does not use ArrayObject (as we cannot rely on SPL),\n * so be aware it may have non-array behaviour in some cases.\n *\n * @since 4.4.0\n *\n * @see ArrayAccess\n */\nclass WP_REST_Request implements ArrayAccess {\n\n\t/**\n\t * HTTP method.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $method = '';\n\n\t/**\n\t * Parameters passed to the request.\n\t *\n\t * These typically come from the `$_GET`, `$_POST` and `$_FILES`\n\t * superglobals when being created from the global scope.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array Contains GET, POST and FILES keys mapping to arrays of data.\n\t */\n\tprotected $params;\n\n\t/**\n\t * HTTP headers for the request.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array Map of key to value. Key is always lowercase, as per HTTP specification.\n\t */\n\tprotected $headers = array();\n\n\t/**\n\t * Body data.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var string Binary data from the request.\n\t */\n\tprotected $body = null;\n\n\t/**\n\t * Route matched for the request.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $route;\n\n\t/**\n\t * Attributes (options) for the route that was matched.\n\t *\n\t * This is the options array used when the route was registered, typically\n\t * containing the callback as well as the valid methods for the route.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array Attributes for the request.\n\t */\n\tprotected $attributes = array();\n\n\t/**\n\t * Used to determine if the JSON data has been parsed yet.\n\t *\n\t * Allows lazy-parsing of JSON data where possible.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $parsed_json = false;\n\n\t/**\n\t * Used to determine if the body data has been parsed yet.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $parsed_body = false;\n\n\t/**\n\t * Constructor.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $method     Optional. Request method. Default empty.\n\t * @param string $route      Optional. Request route. Default empty.\n\t * @param array  $attributes Optional. Request attributes. Default empty array.\n\t */\n\tpublic function __construct( $method = '', $route = '', $attributes = array() ) {\n\t\t$this->params = array(\n\t\t\t'URL'   => array(),\n\t\t\t'GET'   => array(),\n\t\t\t'POST'  => array(),\n\t\t\t'FILES' => array(),\n\n\t\t\t// See parse_json_params.\n\t\t\t'JSON'  => null,\n\n\t\t\t'defaults' => array(),\n\t\t);\n\n\t\t$this->set_method( $method );\n\t\t$this->set_route( $route );\n\t\t$this->set_attributes( $attributes );\n\t}\n\n\t/**\n\t * Retrieves the HTTP method for the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return string HTTP method.\n\t */\n\tpublic function get_method() {\n\t\treturn $this->method;\n\t}\n\n\t/**\n\t * Sets HTTP method for the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $method HTTP method.\n\t */\n\tpublic function set_method( $method ) {\n\t\t$this->method = strtoupper( $method );\n\t}\n\n\t/**\n\t * Retrieves all headers from the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Map of key to value. Key is always lowercase, as per HTTP specification.\n\t */\n\tpublic function get_headers() {\n\t\treturn $this->headers;\n\t}\n\n\t/**\n\t * Canonicalizes the header name.\n\t *\n\t * Ensures that header names are always treated the same regardless of\n\t * source. Header names are always case insensitive.\n\t *\n\t * Note that we treat `-` (dashes) and `_` (underscores) as the same\n\t * character, as per header parsing rules in both Apache and nginx.\n\t *\n\t * @link http://stackoverflow.com/q/18185366\n\t * @link http://wiki.nginx.org/Pitfalls#Missing_.28disappearing.29_HTTP_headers\n\t * @link http://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @static\n\t *\n\t * @param string $key Header name.\n\t * @return string Canonicalized name.\n\t */\n\tpublic static function canonicalize_header_name( $key ) {\n\t\t$key = strtolower( $key );\n\t\t$key = str_replace( '-', '_', $key );\n\n\t\treturn $key;\n\t}\n\n\t/**\n\t * Retrieves the given header from the request.\n\t *\n\t * If the header has multiple values, they will be concatenated with a comma\n\t * as per the HTTP specification. Be aware that some non-compliant headers\n\t * (notably cookie headers) cannot be joined this way.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key Header name, will be canonicalized to lowercase.\n\t * @return string|null String value if set, null otherwise.\n\t */\n\tpublic function get_header( $key ) {\n\t\t$key = $this->canonicalize_header_name( $key );\n\n\t\tif ( ! isset( $this->headers[ $key ] ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn implode( ',', $this->headers[ $key ] );\n\t}\n\n\t/**\n\t * Retrieves header values from the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key Header name, will be canonicalized to lowercase.\n\t * @return array|null List of string values if set, null otherwise.\n\t */\n\tpublic function get_header_as_array( $key ) {\n\t\t$key = $this->canonicalize_header_name( $key );\n\n\t\tif ( ! isset( $this->headers[ $key ] ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn $this->headers[ $key ];\n\t}\n\n\t/**\n\t * Sets the header on request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key   Header name.\n\t * @param string $value Header value, or list of values.\n\t */\n\tpublic function set_header( $key, $value ) {\n\t\t$key = $this->canonicalize_header_name( $key );\n\t\t$value = (array) $value;\n\n\t\t$this->headers[ $key ] = $value;\n\t}\n\n\t/**\n\t * Appends a header value for the given header.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key   Header name.\n\t * @param string $value Header value, or list of values.\n\t */\n\tpublic function add_header( $key, $value ) {\n\t\t$key = $this->canonicalize_header_name( $key );\n\t\t$value = (array) $value;\n\n\t\tif ( ! isset( $this->headers[ $key ] ) ) {\n\t\t\t$this->headers[ $key ] = array();\n\t\t}\n\n\t\t$this->headers[ $key ] = array_merge( $this->headers[ $key ], $value );\n\t}\n\n\t/**\n\t * Removes all values for a header.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key Header name.\n\t */\n\tpublic function remove_header( $key ) {\n\t\tunset( $this->headers[ $key ] );\n\t}\n\n\t/**\n\t * Sets headers on the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $headers  Map of header name to value.\n\t * @param bool  $override If true, replace the request's headers. Otherwise, merge with existing.\n\t */\n\tpublic function set_headers( $headers, $override = true ) {\n\t\tif ( true === $override ) {\n\t\t\t$this->headers = array();\n\t\t}\n\n\t\tforeach ( $headers as $key => $value ) {\n\t\t\t$this->set_header( $key, $value );\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the content-type of the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Map containing 'value' and 'parameters' keys.\n\t */\n\tpublic function get_content_type() {\n\t\t$value = $this->get_header( 'content-type' );\n\t\tif ( empty( $value ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t$parameters = '';\n\t\tif ( strpos( $value, ';' ) ) {\n\t\t\tlist( $value, $parameters ) = explode( ';', $value, 2 );\n\t\t}\n\n\t\t$value = strtolower( $value );\n\t\tif ( strpos( $value, '/' ) === false ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Parse type and subtype out.\n\t\tlist( $type, $subtype ) = explode( '/', $value, 2 );\n\n\t\t$data = compact( 'value', 'type', 'subtype', 'parameters' );\n\t\t$data = array_map( 'trim', $data );\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Retrieves the parameter priority order.\n\t *\n\t * Used when checking parameters in get_param().\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @return array List of types to check, in order of priority.\n\t */\n\tprotected function get_parameter_order() {\n\t\t$order = array();\n\t\t$order[] = 'JSON';\n\n\t\t$this->parse_json_params();\n\n\t\t// Ensure we parse the body data.\n\t\t$body = $this->get_body();\n\t\tif ( $this->method !== 'POST' && ! empty( $body ) ) {\n\t\t\t$this->parse_body_params();\n\t\t}\n\n\t\t$accepts_body_data = array( 'POST', 'PUT', 'PATCH' );\n\t\tif ( in_array( $this->method, $accepts_body_data ) ) {\n\t\t\t$order[] = 'POST';\n\t\t}\n\n\t\t$order[] = 'GET';\n\t\t$order[] = 'URL';\n\t\t$order[] = 'defaults';\n\n\t\t/**\n\t\t * Filter the parameter order.\n\t\t *\n\t\t * The order affects which parameters are checked when using get_param() and family.\n\t\t * This acts similarly to PHP's `request_order` setting.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array           $order {\n\t\t *    An array of types to check, in order of priority.\n\t\t *\n\t\t *    @param string $type The type to check.\n\t\t * }\n\t\t * @param WP_REST_Request $this The request object.\n\t\t */\n\t\treturn apply_filters( 'rest_request_parameter_order', $order, $this );\n\t}\n\n\t/**\n\t * Retrieves a parameter from the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key Parameter name.\n\t * @return mixed|null Value if set, null otherwise.\n\t */\n\tpublic function get_param( $key ) {\n\t\t$order = $this->get_parameter_order();\n\n\t\tforeach ( $order as $type ) {\n\t\t\t// Determine if we have the parameter for this type.\n\t\t\tif ( isset( $this->params[ $type ][ $key ] ) ) {\n\t\t\t\treturn $this->params[ $type ][ $key ];\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Sets a parameter on the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key   Parameter name.\n\t * @param mixed  $value Parameter value.\n\t */\n\tpublic function set_param( $key, $value ) {\n\t\tswitch ( $this->method ) {\n\t\t\tcase 'POST':\n\t\t\t\t$this->params['POST'][ $key ] = $value;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$this->params['GET'][ $key ] = $value;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves merged parameters from the request.\n\t *\n\t * The equivalent of get_param(), but returns all parameters for the request.\n\t * Handles merging all the available values into a single array.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Map of key to value.\n\t */\n\tpublic function get_params() {\n\t\t$order = $this->get_parameter_order();\n\t\t$order = array_reverse( $order, true );\n\n\t\t$params = array();\n\t\tforeach ( $order as $type ) {\n\t\t\t$params = array_merge( $params, (array) $this->params[ $type ] );\n\t\t}\n\n\t\treturn $params;\n\t}\n\n\t/**\n\t * Retrieves parameters from the route itself.\n\t *\n\t * These are parsed from the URL using the regex.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Parameter map of key to value.\n\t */\n\tpublic function get_url_params() {\n\t\treturn $this->params['URL'];\n\t}\n\n\t/**\n\t * Sets parameters from the route.\n\t *\n\t * Typically, this is set after parsing the URL.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $params Parameter map of key to value.\n\t */\n\tpublic function set_url_params( $params ) {\n\t\t$this->params['URL'] = $params;\n\t}\n\n\t/**\n\t * Retrieves parameters from the query string.\n\t *\n\t * These are the parameters you'd typically find in `$_GET`.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Parameter map of key to value\n\t */\n\tpublic function get_query_params() {\n\t\treturn $this->params['GET'];\n\t}\n\n\t/**\n\t * Sets parameters from the query string.\n\t *\n\t * Typically, this is set from `$_GET`.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $params Parameter map of key to value.\n\t */\n\tpublic function set_query_params( $params ) {\n\t\t$this->params['GET'] = $params;\n\t}\n\n\t/**\n\t * Retrieves parameters from the body.\n\t *\n\t * These are the parameters you'd typically find in `$_POST`.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Parameter map of key to value.\n\t */\n\tpublic function get_body_params() {\n\t\treturn $this->params['POST'];\n\t}\n\n\t/**\n\t * Sets parameters from the body.\n\t *\n\t * Typically, this is set from `$_POST`.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $params Parameter map of key to value.\n\t */\n\tpublic function set_body_params( $params ) {\n\t\t$this->params['POST'] = $params;\n\t}\n\n\t/**\n\t * Retrieves multipart file parameters from the body.\n\t *\n\t * These are the parameters you'd typically find in `$_FILES`.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Parameter map of key to value\n\t */\n\tpublic function get_file_params() {\n\t\treturn $this->params['FILES'];\n\t}\n\n\t/**\n\t * Sets multipart file parameters from the body.\n\t *\n\t * Typically, this is set from `$_FILES`.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $params Parameter map of key to value.\n\t */\n\tpublic function set_file_params( $params ) {\n\t\t$this->params['FILES'] = $params;\n\t}\n\n\t/**\n\t * Retrieves the default parameters.\n\t *\n\t * These are the parameters set in the route registration.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Parameter map of key to value\n\t */\n\tpublic function get_default_params() {\n\t\treturn $this->params['defaults'];\n\t}\n\n\t/**\n\t * Sets default parameters.\n\t *\n\t * These are the parameters set in the route registration.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $params Parameter map of key to value.\n\t */\n\tpublic function set_default_params( $params ) {\n\t\t$this->params['defaults'] = $params;\n\t}\n\n\t/**\n\t * Retrieves the request body content.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return string Binary data from the request body.\n\t */\n\tpublic function get_body() {\n\t\treturn $this->body;\n\t}\n\n\t/**\n\t * Sets body content.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $data Binary data from the request body.\n\t */\n\tpublic function set_body( $data ) {\n\t\t$this->body = $data;\n\n\t\t// Enable lazy parsing.\n\t\t$this->parsed_json = false;\n\t\t$this->parsed_body = false;\n\t\t$this->params['JSON'] = null;\n\t}\n\n\t/**\n\t * Retrieves the parameters from a JSON-formatted body.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Parameter map of key to value.\n\t */\n\tpublic function get_json_params() {\n\t\t// Ensure the parameters have been parsed out.\n\t\t$this->parse_json_params();\n\n\t\treturn $this->params['JSON'];\n\t}\n\n\t/**\n\t * Parses the JSON parameters.\n\t *\n\t * Avoids parsing the JSON data until we need to access it.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t */\n\tprotected function parse_json_params() {\n\t\tif ( $this->parsed_json ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->parsed_json = true;\n\n\t\t// Check that we actually got JSON.\n\t\t$content_type = $this->get_content_type();\n\n\t\tif ( empty( $content_type ) || 'application/json' !== $content_type['value'] ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$params = json_decode( $this->get_body(), true );\n\n\t\t/*\n\t\t * Check for a parsing error.\n\t\t *\n\t\t * Note that due to WP's JSON compatibility functions, json_last_error\n\t\t * might not be defined: https://core.trac.wordpress.org/ticket/27799\n\t\t */\n\t\tif ( null === $params && ( ! function_exists( 'json_last_error' ) || JSON_ERROR_NONE !== json_last_error() ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->params['JSON'] = $params;\n\t}\n\n\t/**\n\t * Parses the request body parameters.\n\t *\n\t * Parses out URL-encoded bodies for request methods that aren't supported\n\t * natively by PHP. In PHP 5.x, only POST has these parsed automatically.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t */\n\tprotected function parse_body_params() {\n\t\tif ( $this->parsed_body ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->parsed_body = true;\n\n\t\t/*\n\t\t * Check that we got URL-encoded. Treat a missing content-type as\n\t\t * URL-encoded for maximum compatibility.\n\t\t */\n\t\t$content_type = $this->get_content_type();\n\n\t\tif ( ! empty( $content_type ) && 'application/x-www-form-urlencoded' !== $content_type['value'] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tparse_str( $this->get_body(), $params );\n\n\t\t/*\n\t\t * Amazingly, parse_str follows magic quote rules. Sigh.\n\t\t *\n\t\t * NOTE: Do not refactor to use `wp_unslash`.\n\t\t */\n\t\tif ( get_magic_quotes_gpc() ) {\n\t\t\t$params = stripslashes_deep( $params );\n\t\t}\n\n\t\t/*\n\t\t * Add to the POST parameters stored internally. If a user has already\n\t\t * set these manually (via `set_body_params`), don't override them.\n\t\t */\n\t\t$this->params['POST'] = array_merge( $params, $this->params['POST'] );\n\t}\n\n\t/**\n\t * Retrieves the route that matched the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return string Route matching regex.\n\t */\n\tpublic function get_route() {\n\t\treturn $this->route;\n\t}\n\n\t/**\n\t * Sets the route that matched the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $route Route matching regex.\n\t */\n\tpublic function set_route( $route ) {\n\t\t$this->route = $route;\n\t}\n\n\t/**\n\t * Retrieves the attributes for the request.\n\t *\n\t * These are the options for the route that was matched.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array Attributes for the request.\n\t */\n\tpublic function get_attributes() {\n\t\treturn $this->attributes;\n\t}\n\n\t/**\n\t * Sets the attributes for the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $attributes Attributes for the request.\n\t */\n\tpublic function set_attributes( $attributes ) {\n\t\t$this->attributes = $attributes;\n\t}\n\n\t/**\n\t * Sanitizes (where possible) the params on the request.\n\t *\n\t * This is primarily based off the sanitize_callback param on each registered\n\t * argument.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return true|null True if there are no parameters to sanitize, null otherwise.\n\t */\n\tpublic function sanitize_params() {\n\n\t\t$attributes = $this->get_attributes();\n\n\t\t// No arguments set, skip sanitizing.\n\t\tif ( empty( $attributes['args'] ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t$order = $this->get_parameter_order();\n\n\t\tforeach ( $order as $type ) {\n\t\t\tif ( empty( $this->params[ $type ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tforeach ( $this->params[ $type ] as $key => $value ) {\n\t\t\t\t// Check if this param has a sanitize_callback added.\n\t\t\t\tif ( isset( $attributes['args'][ $key ] ) && ! empty( $attributes['args'][ $key ]['sanitize_callback'] ) ) {\n\t\t\t\t\t$this->params[ $type ][ $key ] = call_user_func( $attributes['args'][ $key ]['sanitize_callback'], $value, $this, $key );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Checks whether this request is valid according to its attributes.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return bool|WP_Error True if there are no parameters to validate or if all pass validation,\n\t *                       WP_Error if required parameters are missing.\n\t */\n\tpublic function has_valid_params() {\n\n\t\t$attributes = $this->get_attributes();\n\t\t$required = array();\n\n\t\t// No arguments set, skip validation.\n\t\tif ( empty( $attributes['args'] ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tforeach ( $attributes['args'] as $key => $arg ) {\n\n\t\t\t$param = $this->get_param( $key );\n\t\t\tif ( isset( $arg['required'] ) && true === $arg['required'] && null === $param ) {\n\t\t\t\t$required[] = $key;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $required ) ) {\n\t\t\treturn new WP_Error( 'rest_missing_callback_param', sprintf( __( 'Missing parameter(s): %s' ), implode( ', ', $required ) ), array( 'status' => 400, 'params' => $required ) );\n\t\t}\n\n\t\t/*\n\t\t * Check the validation callbacks for each registered arg.\n\t\t *\n\t\t * This is done after required checking as required checking is cheaper.\n\t\t */\n\t\t$invalid_params = array();\n\n\t\tforeach ( $attributes['args'] as $key => $arg ) {\n\n\t\t\t$param = $this->get_param( $key );\n\n\t\t\tif ( null !== $param && ! empty( $arg['validate_callback'] ) ) {\n\t\t\t\t$valid_check = call_user_func( $arg['validate_callback'], $param, $this, $key );\n\n\t\t\t\tif ( false === $valid_check ) {\n\t\t\t\t\t$invalid_params[ $key ] = __( 'Invalid parameter.' );\n\t\t\t\t}\n\n\t\t\t\tif ( is_wp_error( $valid_check ) ) {\n\t\t\t\t\t$invalid_params[] = sprintf( '%s (%s)', $key, $valid_check->get_error_message() );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( $invalid_params ) {\n\t\t\treturn new WP_Error( 'rest_invalid_param', sprintf( __( 'Invalid parameter(s): %s' ), implode( ', ', $invalid_params ) ), array( 'status' => 400, 'params' => $invalid_params ) );\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Checks if a parameter is set.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $offset Parameter name.\n\t * @return bool Whether the parameter is set.\n\t */\n\tpublic function offsetExists( $offset ) {\n\t\t$order = $this->get_parameter_order();\n\n\t\tforeach ( $order as $type ) {\n\t\t\tif ( isset( $this->params[ $type ][ $offset ] ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Retrieves a parameter from the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $offset Parameter name.\n\t * @return mixed|null Value if set, null otherwise.\n\t */\n\tpublic function offsetGet( $offset ) {\n\t\treturn $this->get_param( $offset );\n\t}\n\n\t/**\n\t * Sets a parameter on the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $offset Parameter name.\n\t * @param mixed  $value  Parameter value.\n\t */\n\tpublic function offsetSet( $offset, $value ) {\n\t\t$this->set_param( $offset, $value );\n\t}\n\n\t/**\n\t * Removes a parameter from the request.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $offset Parameter name.\n\t */\n\tpublic function offsetUnset( $offset ) {\n\t\t$order = $this->get_parameter_order();\n\n\t\t// Remove the offset from every group.\n\t\tforeach ( $order as $type ) {\n\t\t\tunset( $this->params[ $type ][ $offset ] );\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/rest-api/class-wp-rest-response.php",
    "content": "<?php\n/**\n * REST API: WP_REST_Response class\n *\n * @package WordPress\n * @subpackage REST_API\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a REST response object.\n *\n * @since 4.4.0\n *\n * @see WP_HTTP_Response\n */\nclass WP_REST_Response extends WP_HTTP_Response {\n\n\t/**\n\t * Links related to the response.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $links = array();\n\n\t/**\n\t * The route that was to create the response.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $matched_route = '';\n\n\t/**\n\t * The handler that was used to create the response.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var null|array\n\t */\n\tprotected $matched_handler = null;\n\n\t/**\n\t * Adds a link to the response.\n\t *\n\t * @internal The $rel parameter is first, as this looks nicer when sending multiple.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @link http://tools.ietf.org/html/rfc5988\n\t * @link http://www.iana.org/assignments/link-relations/link-relations.xml\n\t *\n\t * @param string $rel        Link relation. Either an IANA registered type,\n\t *                           or an absolute URL.\n\t * @param string $href       Target URI for the link.\n\t * @param array  $attributes Optional. Link parameters to send along with the URL. Default empty array.\n\t */\n\tpublic function add_link( $rel, $href, $attributes = array() ) {\n\t\tif ( empty( $this->links[ $rel ] ) ) {\n\t\t\t$this->links[ $rel ] = array();\n\t\t}\n\n\t\tif ( isset( $attributes['href'] ) ) {\n\t\t\t// Remove the href attribute, as it's used for the main URL.\n\t\t\tunset( $attributes['href'] );\n\t\t}\n\n\t\t$this->links[ $rel ][] = array(\n\t\t\t'href'       => $href,\n\t\t\t'attributes' => $attributes,\n\t\t);\n\t}\n\n\t/**\n\t * Removes a link from the response.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param  string $rel  Link relation. Either an IANA registered type, or an absolute URL.\n\t * @param  string $href Optional. Only remove links for the relation matching the given href.\n\t *                      Default null.\n\t */\n\tpublic function remove_link( $rel, $href = null ) {\n\t\tif ( ! isset( $this->links[ $rel ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( $href ) {\n\t\t\t$this->links[ $rel ] = wp_list_filter( $this->links[ $rel ], array( 'href' => $href ), 'NOT' );\n\t\t} else {\n\t\t\t$this->links[ $rel ] = array();\n\t\t}\n\n\t\tif ( ! $this->links[ $rel ] ) {\n\t\t\tunset( $this->links[ $rel ] );\n\t\t}\n\t}\n\n\t/**\n\t * Adds multiple links to the response.\n\t *\n\t * Link data should be an associative array with link relation as the key.\n\t * The value can either be an associative array of link attributes\n\t * (including `href` with the URL for the response), or a list of these\n\t * associative arrays.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $links Map of link relation to list of links.\n\t */\n\tpublic function add_links( $links ) {\n\t\tforeach ( $links as $rel => $set ) {\n\t\t\t// If it's a single link, wrap with an array for consistent handling.\n\t\t\tif ( isset( $set['href'] ) ) {\n\t\t\t\t$set = array( $set );\n\t\t\t}\n\n\t\t\tforeach ( $set as $attributes ) {\n\t\t\t\t$this->add_link( $rel, $attributes['href'], $attributes );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves links for the response.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array List of links.\n\t */\n\tpublic function get_links() {\n\t\treturn $this->links;\n\t}\n\n\t/**\n\t * Sets a single link header.\n\t *\n\t * @internal The $rel parameter is first, as this looks nicer when sending multiple.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @link http://tools.ietf.org/html/rfc5988\n\t * @link http://www.iana.org/assignments/link-relations/link-relations.xml\n\t *\n\t * @param string $rel   Link relation. Either an IANA registered type, or an absolute URL.\n\t * @param string $link  Target IRI for the link.\n\t * @param array  $other Optional. Other parameters to send, as an assocative array.\n\t *                      Default empty array.\n\t */\n\tpublic function link_header( $rel, $link, $other = array() ) {\n\t\t$header = '<' . $link . '>; rel=\"' . $rel . '\"';\n\n\t\tforeach ( $other as $key => $value ) {\n\t\t\tif ( 'title' === $key ) {\n\t\t\t\t$value = '\"' . $value . '\"';\n\t\t\t}\n\t\t\t$header .= '; ' . $key . '=' . $value;\n\t\t}\n\t\t$this->header( 'Link', $header, false );\n\t}\n\n\t/**\n\t * Retrieves the route that was used.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return string The matched route.\n\t */\n\tpublic function get_matched_route() {\n\t\treturn $this->matched_route;\n\t}\n\n\t/**\n\t * Sets the route (regex for path) that caused the response.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $route Route name.\n\t */\n\tpublic function set_matched_route( $route ) {\n\t\t$this->matched_route = $route;\n\t}\n\n\t/**\n\t * Retrieves the handler that was used to generate the response.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return null|array The handler that was used to create the response.\n\t */\n\tpublic function get_matched_handler() {\n\t\treturn $this->matched_handler;\n\t}\n\n\t/**\n\t * Retrieves the handler that was responsible for generating the response.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $handler The matched handler.\n\t */\n\tpublic function set_matched_handler( $handler ) {\n\t\t$this->matched_handler = $handler;\n\t}\n\n\t/**\n\t * Checks if the response is an error, i.e. >= 400 response code.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return bool Whether the response is an error.\n\t */\n\tpublic function is_error() {\n\t\treturn $this->get_status() >= 400;\n\t}\n\n\t/**\n\t * Retrieves a WP_Error object from the response.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return WP_Error|null WP_Error or null on not an errored response.\n\t */\n\tpublic function as_error() {\n\t\tif ( ! $this->is_error() ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t$error = new WP_Error;\n\n\t\tif ( is_array( $this->get_data() ) ) {\n\t\t\t$data = $this->get_data();\n\t\t\t$error->add( $data['code'], $data['message'], $data['data'] );\n\t\t\tif ( ! empty( $data['additional_errors'] ) ) {\n\t\t\t\tforeach( $data['additional_errors'] as $err ) {\n\t\t\t\t\t$error->add( $err['code'], $err['message'], $err['data'] );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t$error->add( $this->get_status(), '', array( 'status' => $this->get_status() ) );\n\t\t}\n\n\t\treturn $error;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/rest-api/class-wp-rest-server.php",
    "content": "<?php\n/**\n * REST API: WP_REST_Server class\n *\n * @package WordPress\n * @subpackage REST_API\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement the WordPress REST API server.\n *\n * @since 4.4.0\n */\nclass WP_REST_Server {\n\n\t/**\n\t * Alias for GET transport method.\n\t *\n\t * @since 4.4.0\n\t * @var string\n\t */\n\tconst READABLE = 'GET';\n\n\t/**\n\t * Alias for POST transport method.\n\t *\n\t * @since 4.4.0\n\t * @var string\n\t */\n\tconst CREATABLE = 'POST';\n\n\t/**\n\t * Alias for POST, PUT, PATCH transport methods together.\n\t *\n\t * @since 4.4.0\n\t * @var string\n\t */\n\tconst EDITABLE = 'POST, PUT, PATCH';\n\n\t/**\n\t * Alias for DELETE transport method.\n\t *\n\t * @since 4.4.0\n\t * @var string\n\t */\n\tconst DELETABLE = 'DELETE';\n\n\t/**\n\t * Alias for GET, POST, PUT, PATCH & DELETE transport methods together.\n\t *\n\t * @since 4.4.0\n\t * @var string\n\t */\n\tconst ALLMETHODS = 'GET, POST, PUT, PATCH, DELETE';\n\n\t/**\n\t * Namespaces registered to the server.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $namespaces = array();\n\n\t/**\n\t * Endpoints registered to the server.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $endpoints = array();\n\n\t/**\n\t * Options defined for the routes.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $route_options = array();\n\n\t/**\n\t * Instantiates the REST server.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$this->endpoints = array(\n\t\t\t// Meta endpoints.\n\t\t\t'/' => array(\n\t\t\t\t'callback' => array( $this, 'get_index' ),\n\t\t\t\t'methods' => 'GET',\n\t\t\t\t'args' => array(\n\t\t\t\t\t'context' => array(\n\t\t\t\t\t\t'default' => 'view',\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t}\n\n\n\t/**\n\t * Checks the authentication headers if supplied.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return WP_Error|null WP_Error indicates unsuccessful login, null indicates successful\n\t *                       or no authentication provided\n\t */\n\tpublic function check_authentication() {\n\t\t/**\n\t\t * Pass an authentication error to the API\n\t\t *\n\t\t * This is used to pass a WP_Error from an authentication method back to\n\t\t * the API.\n\t\t *\n\t\t * Authentication methods should check first if they're being used, as\n\t\t * multiple authentication methods can be enabled on a site (cookies,\n\t\t * HTTP basic auth, OAuth). If the authentication method hooked in is\n\t\t * not actually being attempted, null should be returned to indicate\n\t\t * another authentication method should check instead. Similarly,\n\t\t * callbacks should ensure the value is `null` before checking for\n\t\t * errors.\n\t\t *\n\t\t * A WP_Error instance can be returned if an error occurs, and this should\n\t\t * match the format used by API methods internally (that is, the `status`\n\t\t * data should be used). A callback can return `true` to indicate that\n\t\t * the authentication method was used, and it succeeded.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param WP_Error|null|bool WP_Error if authentication error, null if authentication\n\t\t *                              method wasn't used, true if authentication succeeded.\n\t\t */\n\t\treturn apply_filters( 'rest_authentication_errors', null );\n\t}\n\n\t/**\n\t * Converts an error to a response object.\n\t *\n\t * This iterates over all error codes and messages to change it into a flat\n\t * array. This enables simpler client behaviour, as it is represented as a\n\t * list in JSON rather than an object/map.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @param WP_Error $error WP_Error instance.\n\t * @return WP_REST_Response List of associative arrays with code and message keys.\n\t */\n\tprotected function error_to_response( $error ) {\n\t\t$error_data = $error->get_error_data();\n\n\t\tif ( is_array( $error_data ) && isset( $error_data['status'] ) ) {\n\t\t\t$status = $error_data['status'];\n\t\t} else {\n\t\t\t$status = 500;\n\t\t}\n\n\t\t$errors = array();\n\n\t\tforeach ( (array) $error->errors as $code => $messages ) {\n\t\t\tforeach ( (array) $messages as $message ) {\n\t\t\t\t$errors[] = array( 'code' => $code, 'message' => $message, 'data' => $error->get_error_data( $code ) );\n\t\t\t}\n\t\t}\n\n\t\t$data = $errors[0];\n\t\tif ( count( $errors ) > 1 ) {\n\t\t\t// Remove the primary error.\n\t\t\tarray_shift( $errors );\n\t\t\t$data['additional_errors'] = $errors;\n\t\t}\n\n\t\t$response = new WP_REST_Response( $data, $status );\n\n\t\treturn $response;\n\t}\n\n\t/**\n\t * Retrieves an appropriate error representation in JSON.\n\t *\n\t * Note: This should only be used in WP_REST_Server::serve_request(), as it\n\t * cannot handle WP_Error internally. All callbacks and other internal methods\n\t * should instead return a WP_Error with the data set to an array that includes\n\t * a 'status' key, with the value being the HTTP status to send.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @param string $code    WP_Error-style code.\n\t * @param string $message Human-readable message.\n\t * @param int    $status  Optional. HTTP status code to send. Default null.\n\t * @return string JSON representation of the error\n\t */\n\tprotected function json_error( $code, $message, $status = null ) {\n\t\tif ( $status ) {\n\t\t\t$this->set_status( $status );\n\t\t}\n\n\t\t$error = compact( 'code', 'message' );\n\n\t\treturn wp_json_encode( $error );\n\t}\n\n\t/**\n\t * Handles serving an API request.\n\t *\n\t * Matches the current server URI to a route and runs the first matching\n\t * callback then outputs a JSON representation of the returned value.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @see WP_REST_Server::dispatch()\n\t *\n\t * @param string $path Optional. The request route. If not set, `$_SERVER['PATH_INFO']` will be used.\n\t *                     Default null.\n\t * @return false|null Null if not served and a HEAD request, false otherwise.\n\t */\n\tpublic function serve_request( $path = null ) {\n\t\t$content_type = isset( $_GET['_jsonp'] ) ? 'application/javascript' : 'application/json';\n\t\t$this->send_header( 'Content-Type', $content_type . '; charset=' . get_option( 'blog_charset' ) );\n\n\t\t/*\n\t\t * Mitigate possible JSONP Flash attacks.\n\t\t *\n\t\t * http://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/\n\t\t */\n\t\t$this->send_header( 'X-Content-Type-Options', 'nosniff' );\n\t\t$this->send_header( 'Access-Control-Expose-Headers', 'X-WP-Total, X-WP-TotalPages' );\n\t\t$this->send_header( 'Access-Control-Allow-Headers', 'Authorization' );\n\n\t\t/**\n\t\t * Send nocache headers on authenticated requests.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param bool $rest_send_nocache_headers Whether to send no-cache headers.\n\t\t */\n\t\t$send_no_cache_headers = apply_filters( 'rest_send_nocache_headers', is_user_logged_in() );\n\t\tif ( $send_no_cache_headers ) {\n\t\t\tforeach ( wp_get_nocache_headers() as $header => $header_value ) {\n\t\t\t\t$this->send_header( $header, $header_value );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter whether the REST API is enabled.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param bool $rest_enabled Whether the REST API is enabled. Default true.\n\t\t */\n\t\t$enabled = apply_filters( 'rest_enabled', true );\n\n\t\t/**\n\t\t * Filter whether jsonp is enabled.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param bool $jsonp_enabled Whether jsonp is enabled. Default true.\n\t\t */\n\t\t$jsonp_enabled = apply_filters( 'rest_jsonp_enabled', true );\n\n\t\t$jsonp_callback = null;\n\n\t\tif ( ! $enabled ) {\n\t\t\techo $this->json_error( 'rest_disabled', __( 'The REST API is disabled on this site.' ), 404 );\n\t\t\treturn false;\n\t\t}\n\t\tif ( isset( $_GET['_jsonp'] ) ) {\n\t\t\tif ( ! $jsonp_enabled ) {\n\t\t\t\techo $this->json_error( 'rest_callback_disabled', __( 'JSONP support is disabled on this site.' ), 400 );\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Check for invalid characters (only alphanumeric allowed).\n\t\t\tif ( is_string( $_GET['_jsonp'] ) ) {\n\t\t\t\t$jsonp_callback = preg_replace( '/[^\\w\\.]/', '', wp_unslash( $_GET['_jsonp'] ), -1, $illegal_char_count );\n\t\t\t\tif ( 0 !== $illegal_char_count ) {\n\t\t\t\t\t$jsonp_callback = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( null === $jsonp_callback ) {\n\t\t\t\techo $this->json_error( 'rest_callback_invalid', __( 'The JSONP callback function is invalid.' ), 400 );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $path ) ) {\n\t\t\tif ( isset( $_SERVER['PATH_INFO'] ) ) {\n\t\t\t\t$path = $_SERVER['PATH_INFO'];\n\t\t\t} else {\n\t\t\t\t$path = '/';\n\t\t\t}\n\t\t}\n\n\t\t$request = new WP_REST_Request( $_SERVER['REQUEST_METHOD'], $path );\n\n\t\t$request->set_query_params( $_GET );\n\t\t$request->set_body_params( $_POST );\n\t\t$request->set_file_params( $_FILES );\n\t\t$request->set_headers( $this->get_headers( $_SERVER ) );\n\t\t$request->set_body( $this->get_raw_data() );\n\n\t\t/*\n\t\t * HTTP method override for clients that can't use PUT/PATCH/DELETE. First, we check\n\t\t * $_GET['_method']. If that is not set, we check for the HTTP_X_HTTP_METHOD_OVERRIDE\n\t\t * header.\n\t\t */\n\t\tif ( isset( $_GET['_method'] ) ) {\n\t\t\t$request->set_method( $_GET['_method'] );\n\t\t} elseif ( isset( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ) {\n\t\t\t$request->set_method( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] );\n\t\t}\n\n\t\t$result = $this->check_authentication();\n\n\t\tif ( ! is_wp_error( $result ) ) {\n\t\t\t$result = $this->dispatch( $request );\n\t\t}\n\n\t\t// Normalize to either WP_Error or WP_REST_Response...\n\t\t$result = rest_ensure_response( $result );\n\n\t\t// ...then convert WP_Error across.\n\t\tif ( is_wp_error( $result ) ) {\n\t\t\t$result = $this->error_to_response( $result );\n\t\t}\n\n\t\t/**\n\t\t * Filter the API response.\n\t\t *\n\t\t * Allows modification of the response before returning.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param WP_HTTP_Response $result  Result to send to the client. Usually a WP_REST_Response.\n\t\t * @param WP_REST_Server   $this    Server instance.\n\t\t * @param WP_REST_Request  $request Request used to generate the response.\n\t\t */\n\t\t$result = apply_filters( 'rest_post_dispatch', rest_ensure_response( $result ), $this, $request );\n\n\t\t// Wrap the response in an envelope if asked for.\n\t\tif ( isset( $_GET['_envelope'] ) ) {\n\t\t\t$result = $this->envelope_response( $result, isset( $_GET['_embed'] ) );\n\t\t}\n\n\t\t// Send extra data from response objects.\n\t\t$headers = $result->get_headers();\n\t\t$this->send_headers( $headers );\n\n\t\t$code = $result->get_status();\n\t\t$this->set_status( $code );\n\n\t\t/**\n\t\t * Filter whether the request has already been served.\n\t\t *\n\t\t * Allow sending the request manually - by returning true, the API result\n\t\t * will not be sent to the client.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param bool             $served  Whether the request has already been served.\n\t\t *                                           Default false.\n\t\t * @param WP_HTTP_Response $result  Result to send to the client. Usually a WP_REST_Response.\n\t\t * @param WP_REST_Request  $request Request used to generate the response.\n\t\t * @param WP_REST_Server   $this    Server instance.\n\t\t */\n\t\t$served = apply_filters( 'rest_pre_serve_request', false, $result, $request, $this );\n\n\t\tif ( ! $served ) {\n\t\t\tif ( 'HEAD' === $request->get_method() ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Embed links inside the request.\n\t\t\t$result = $this->response_to_data( $result, isset( $_GET['_embed'] ) );\n\n\t\t\t$result = wp_json_encode( $result );\n\n\t\t\t$json_error_message = $this->get_json_last_error();\n\t\t\tif ( $json_error_message ) {\n\t\t\t\t$json_error_obj = new WP_Error( 'rest_encode_error', $json_error_message, array( 'status' => 500 ) );\n\t\t\t\t$result = $this->error_to_response( $json_error_obj );\n\t\t\t\t$result = wp_json_encode( $result->data[0] );\n\t\t\t}\n\n\t\t\tif ( $jsonp_callback ) {\n\t\t\t\t// Prepend '/**/' to mitigate possible JSONP Flash attacks\n\t\t\t\t// http://miki.it/blog/2014/7/8/abusing-jsonp-with-rosetta-flash/\n\t\t\t\techo '/**/' . $jsonp_callback . '(' . $result . ')';\n\t\t\t} else {\n\t\t\t\techo $result;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Converts a response to data to send.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_REST_Response $response Response object.\n\t * @param bool             $embed    Whether links should be embedded.\n\t * @return array {\n\t *     Data with sub-requests embedded.\n\t *\n\t *     @type array [$_links]    Links.\n\t *     @type array [$_embedded] Embeddeds.\n\t * }\n\t */\n\tpublic function response_to_data( $response, $embed ) {\n\t\t$data  = $response->get_data();\n\t\t$links = $this->get_response_links( $response );\n\n\t\tif ( ! empty( $links ) ) {\n\t\t\t// Convert links to part of the data.\n\t\t\t$data['_links'] = $links;\n\t\t}\n\t\tif ( $embed ) {\n\t\t\t// Determine if this is a numeric array.\n\t\t\tif ( wp_is_numeric_array( $data ) ) {\n\t\t\t\t$data = array_map( array( $this, 'embed_links' ), $data );\n\t\t\t} else {\n\t\t\t\t$data = $this->embed_links( $data );\n\t\t\t}\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Retrieves links from a response.\n\t *\n\t * Extracts the links from a response into a structured hash, suitable for\n\t * direct output.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @static\n\t *\n\t * @param WP_REST_Response $response Response to extract links from.\n\t * @return array Map of link relation to list of link hashes.\n\t */\n\tpublic static function get_response_links( $response ) {\n\t\t$links = $response->get_links();\n\n\t\tif ( empty( $links ) ) {\n\t\t\treturn array();\n\t\t}\n\n\t\t// Convert links to part of the data.\n\t\t$data = array();\n\t\tforeach ( $links as $rel => $items ) {\n\t\t\t$data[ $rel ] = array();\n\n\t\t\tforeach ( $items as $item ) {\n\t\t\t\t$attributes = $item['attributes'];\n\t\t\t\t$attributes['href'] = $item['href'];\n\t\t\t\t$data[ $rel ][] = $attributes;\n\t\t\t}\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Embeds the links from the data into the request.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @param array $data Data from the request.\n\t * @return array {\n\t *     Data with sub-requests embedded.\n\t *\n\t *     @type array [$_links]    Links.\n\t *     @type array [$_embedded] Embeddeds.\n\t * }\n\t */\n\tprotected function embed_links( $data ) {\n\t\tif ( empty( $data['_links'] ) ) {\n\t\t\treturn $data;\n\t\t}\n\n\t\t$embedded = array();\n\t\t$api_root = rest_url();\n\n\t\tforeach ( $data['_links'] as $rel => $links ) {\n\t\t\t// Ignore links to self, for obvious reasons.\n\t\t\tif ( 'self' === $rel ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$embeds = array();\n\n\t\t\tforeach ( $links as $item ) {\n\t\t\t\t// Determine if the link is embeddable.\n\t\t\t\tif ( empty( $item['embeddable'] ) || strpos( $item['href'], $api_root ) !== 0 ) {\n\t\t\t\t\t// Ensure we keep the same order.\n\t\t\t\t\t$embeds[] = array();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Run through our internal routing and serve.\n\t\t\t\t$route = substr( $item['href'], strlen( untrailingslashit( $api_root ) ) );\n\t\t\t\t$query_params = array();\n\n\t\t\t\t// Parse out URL query parameters.\n\t\t\t\t$parsed = parse_url( $route );\n\t\t\t\tif ( empty( $parsed['path'] ) ) {\n\t\t\t\t\t$embeds[] = array();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( ! empty( $parsed['query'] ) ) {\n\t\t\t\t\tparse_str( $parsed['query'], $query_params );\n\n\t\t\t\t\t// Ensure magic quotes are stripped.\n\t\t\t\t\tif ( get_magic_quotes_gpc() ) {\n\t\t\t\t\t\t$query_params = stripslashes_deep( $query_params );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Embedded resources get passed context=embed.\n\t\t\t\tif ( empty( $query_params['context'] ) ) {\n\t\t\t\t\t$query_params['context'] = 'embed';\n\t\t\t\t}\n\n\t\t\t\t$request = new WP_REST_Request( 'GET', $parsed['path'] );\n\n\t\t\t\t$request->set_query_params( $query_params );\n\t\t\t\t$response = $this->dispatch( $request );\n\n\t\t\t\t$embeds[] = $this->response_to_data( $response, false );\n\t\t\t}\n\n\t\t\t// Determine if any real links were found.\n\t\t\t$has_links = count( array_filter( $embeds ) );\n\t\t\tif ( $has_links ) {\n\t\t\t\t$embedded[ $rel ] = $embeds;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! empty( $embedded ) ) {\n\t\t\t$data['_embedded'] = $embedded;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Wraps the response in an envelope.\n\t *\n\t * The enveloping technique is used to work around browser/client\n\t * compatibility issues. Essentially, it converts the full HTTP response to\n\t * data instead.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_REST_Response $response Response object.\n\t * @param bool             $embed    Whether links should be embedded.\n\t * @return WP_REST_Response New response with wrapped data\n\t */\n\tpublic function envelope_response( $response, $embed ) {\n\t\t$envelope = array(\n\t\t\t'body'    => $this->response_to_data( $response, $embed ),\n\t\t\t'status'  => $response->get_status(),\n\t\t\t'headers' => $response->get_headers(),\n\t\t);\n\n\t\t/**\n\t\t * Filter the enveloped form of a response.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array            $envelope Envelope data.\n\t\t * @param WP_REST_Response $response Original response data.\n\t\t */\n\t\t$envelope = apply_filters( 'rest_envelope_response', $envelope, $response );\n\n\t\t// Ensure it's still a response and return.\n\t\treturn rest_ensure_response( $envelope );\n\t}\n\n\t/**\n\t * Registers a route to the server.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $namespace  Namespace.\n\t * @param string $route      The REST route.\n\t * @param array  $route_args Route arguments.\n\t * @param bool   $override   Optional. Whether the route should be overriden if it already exists.\n\t *                           Default false.\n\t */\n\tpublic function register_route( $namespace, $route, $route_args, $override = false ) {\n\t\tif ( ! isset( $this->namespaces[ $namespace ] ) ) {\n\t\t\t$this->namespaces[ $namespace ] = array();\n\n\t\t\t$this->register_route( $namespace, '/' . $namespace, array(\n\t\t\t\tarray(\n\t\t\t\t\t'methods' => self::READABLE,\n\t\t\t\t\t'callback' => array( $this, 'get_namespace_index' ),\n\t\t\t\t\t'args' => array(\n\t\t\t\t\t\t'namespace' => array(\n\t\t\t\t\t\t\t'default' => $namespace,\n\t\t\t\t\t\t),\n\t\t\t\t\t\t'context' => array(\n\t\t\t\t\t\t\t'default' => 'view',\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t) );\n\t\t}\n\n\t\t// Associative to avoid double-registration.\n\t\t$this->namespaces[ $namespace ][ $route ] = true;\n\t\t$route_args['namespace'] = $namespace;\n\n\t\tif ( $override || empty( $this->endpoints[ $route ] ) ) {\n\t\t\t$this->endpoints[ $route ] = $route_args;\n\t\t} else {\n\t\t\t$this->endpoints[ $route ] = array_merge( $this->endpoints[ $route ], $route_args );\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the route map.\n\t *\n\t * The route map is an associative array with path regexes as the keys. The\n\t * value is an indexed array with the callback function/method as the first\n\t * item, and a bitmask of HTTP methods as the second item (see the class\n\t * constants).\n\t *\n\t * Each route can be mapped to more than one callback by using an array of\n\t * the indexed arrays. This allows mapping e.g. GET requests to one callback\n\t * and POST requests to another.\n\t *\n\t * Note that the path regexes (array keys) must have @ escaped, as this is\n\t * used as the delimiter with preg_match()\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array `'/path/regex' => array( $callback, $bitmask )` or\n\t *               `'/path/regex' => array( array( $callback, $bitmask ), ...)`.\n\t */\n\tpublic function get_routes() {\n\n\t\t/**\n\t\t * Filter the array of available endpoints.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array $endpoints The available endpoints. An array of matching regex patterns, each mapped\n\t\t *                         to an array of callbacks for the endpoint. These take the format\n\t\t *                         `'/path/regex' => array( $callback, $bitmask )` or\n\t\t *                         `'/path/regex' => array( array( $callback, $bitmask ).\n\t\t */\n\t\t$endpoints = apply_filters( 'rest_endpoints', $this->endpoints );\n\n\t\t// Normalise the endpoints.\n\t\t$defaults = array(\n\t\t\t'methods'       => '',\n\t\t\t'accept_json'   => false,\n\t\t\t'accept_raw'    => false,\n\t\t\t'show_in_index' => true,\n\t\t\t'args'          => array(),\n\t\t);\n\n\t\tforeach ( $endpoints as $route => &$handlers ) {\n\n\t\t\tif ( isset( $handlers['callback'] ) ) {\n\t\t\t\t// Single endpoint, add one deeper.\n\t\t\t\t$handlers = array( $handlers );\n\t\t\t}\n\n\t\t\tif ( ! isset( $this->route_options[ $route ] ) ) {\n\t\t\t\t$this->route_options[ $route ] = array();\n\t\t\t}\n\n\t\t\tforeach ( $handlers as $key => &$handler ) {\n\n\t\t\t\tif ( ! is_numeric( $key ) ) {\n\t\t\t\t\t// Route option, move it to the options.\n\t\t\t\t\t$this->route_options[ $route ][ $key ] = $handler;\n\t\t\t\t\tunset( $handlers[ $key ] );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$handler = wp_parse_args( $handler, $defaults );\n\n\t\t\t\t// Allow comma-separated HTTP methods.\n\t\t\t\tif ( is_string( $handler['methods'] ) ) {\n\t\t\t\t\t$methods = explode( ',', $handler['methods'] );\n\t\t\t\t} else if ( is_array( $handler['methods'] ) ) {\n\t\t\t\t\t$methods = $handler['methods'];\n\t\t\t\t} else {\n\t\t\t\t\t$methods = array();\n\t\t\t\t}\n\n\t\t\t\t$handler['methods'] = array();\n\n\t\t\t\tforeach ( $methods as $method ) {\n\t\t\t\t\t$method = strtoupper( trim( $method ) );\n\t\t\t\t\t$handler['methods'][ $method ] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn $endpoints;\n\t}\n\n\t/**\n\t * Retrieves namespaces registered on the server.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @return array List of registered namespaces.\n\t */\n\tpublic function get_namespaces() {\n\t\treturn array_keys( $this->namespaces );\n\t}\n\n\t/**\n\t * Retrieves specified options for a route.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $route Route pattern to fetch options for.\n\t * @return array|null Data as an associative array if found, or null if not found.\n\t */\n\tpublic function get_route_options( $route ) {\n\t\tif ( ! isset( $this->route_options[ $route ] ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn $this->route_options[ $route ];\n\t}\n\n\t/**\n\t * Matches the request to a callback and call it.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_REST_Request $request Request to attempt dispatching.\n\t * @return WP_REST_Response Response returned by the callback.\n\t */\n\tpublic function dispatch( $request ) {\n\t\t/**\n\t\t * Filter the pre-calculated result of a REST dispatch request.\n\t\t *\n\t\t * Allow hijacking the request before dispatching by returning a non-empty. The returned value\n\t\t * will be used to serve the request instead.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param mixed           $result  Response to replace the requested version with. Can be anything\n\t\t *                                 a normal endpoint can return, or null to not hijack the request.\n\t\t * @param WP_REST_Server  $this    Server instance.\n\t\t * @param WP_REST_Request $request Request used to generate the response.\n\t\t */\n\t\t$result = apply_filters( 'rest_pre_dispatch', null, $this, $request );\n\n\t\tif ( ! empty( $result ) ) {\n\t\t\treturn $result;\n\t\t}\n\n\t\t$method = $request->get_method();\n\t\t$path   = $request->get_route();\n\n\t\tforeach ( $this->get_routes() as $route => $handlers ) {\n\t\t\t$match = preg_match( '@^' . $route . '$@i', $path, $args );\n\n\t\t\tif ( ! $match ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tforeach ( $handlers as $handler ) {\n\t\t\t\t$callback  = $handler['callback'];\n\t\t\t\t$response = null;\n\n\t\t\t\t$checked_method = 'HEAD' === $method ? 'GET' : $method;\n\t\t\t\tif ( empty( $handler['methods'][ $checked_method ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( ! is_callable( $callback ) ) {\n\t\t\t\t\t$response = new WP_Error( 'rest_invalid_handler', __( 'The handler for the route is invalid' ), array( 'status' => 500 ) );\n\t\t\t\t}\n\n\t\t\t\tif ( ! is_wp_error( $response ) ) {\n\t\t\t\t\t// Remove the redundant preg_match argument.\n\t\t\t\t\tunset( $args[0] );\n\n\t\t\t\t\t$request->set_url_params( $args );\n\t\t\t\t\t$request->set_attributes( $handler );\n\n\t\t\t\t\t$request->sanitize_params();\n\n\t\t\t\t\t$defaults = array();\n\n\t\t\t\t\tforeach ( $handler['args'] as $arg => $options ) {\n\t\t\t\t\t\tif ( isset( $options['default'] ) ) {\n\t\t\t\t\t\t\t$defaults[ $arg ] = $options['default'];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$request->set_default_params( $defaults );\n\n\t\t\t\t\t$check_required = $request->has_valid_params();\n\t\t\t\t\tif ( is_wp_error( $check_required ) ) {\n\t\t\t\t\t\t$response = $check_required;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( ! is_wp_error( $response ) ) {\n\t\t\t\t\t// Check permission specified on the route.\n\t\t\t\t\tif ( ! empty( $handler['permission_callback'] ) ) {\n\t\t\t\t\t\t$permission = call_user_func( $handler['permission_callback'], $request );\n\n\t\t\t\t\t\tif ( is_wp_error( $permission ) ) {\n\t\t\t\t\t\t\t$response = $permission;\n\t\t\t\t\t\t} else if ( false === $permission || null === $permission ) {\n\t\t\t\t\t\t\t$response = new WP_Error( 'rest_forbidden', __( \"You don't have permission to do this.\" ), array( 'status' => 403 ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( ! is_wp_error( $response ) ) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Filter the REST dispatch request result.\n\t\t\t\t\t *\n\t\t\t\t\t * Allow plugins to override dispatching the request.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 4.4.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param bool            $dispatch_result Dispatch result, will be used if not empty.\n\t\t\t\t\t * @param WP_REST_Request $request         Request used to generate the response.\n\t\t\t\t\t */\n\t\t\t\t\t$dispatch_result = apply_filters( 'rest_dispatch_request', null, $request );\n\n\t\t\t\t\t// Allow plugins to halt the request via this filter.\n\t\t\t\t\tif ( null !== $dispatch_result ) {\n\t\t\t\t\t\t$response = $dispatch_result;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$response = call_user_func( $callback, $request );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( is_wp_error( $response ) ) {\n\t\t\t\t\t$response = $this->error_to_response( $response );\n\t\t\t\t} else {\n\t\t\t\t\t$response = rest_ensure_response( $response );\n\t\t\t\t}\n\n\t\t\t\t$response->set_matched_route( $route );\n\t\t\t\t$response->set_matched_handler( $handler );\n\n\t\t\t\treturn $response;\n\t\t\t}\n\t\t}\n\n\t\treturn $this->error_to_response( new WP_Error( 'rest_no_route', __( 'No route was found matching the URL and request method' ), array( 'status' => 404 ) ) );\n\t}\n\n\t/**\n\t * Returns if an error occurred during most recent JSON encode/decode.\n\t *\n\t * Strings to be translated will be in format like\n\t * \"Encoding error: Maximum stack depth exceeded\".\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @return bool|string Boolean false or string error message.\n\t */\n\tprotected function get_json_last_error() {\n\t\t// See https://core.trac.wordpress.org/ticket/27799.\n\t\tif ( ! function_exists( 'json_last_error' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$last_error_code = json_last_error();\n\n\t\tif ( ( defined( 'JSON_ERROR_NONE' ) && JSON_ERROR_NONE === $last_error_code ) || empty( $last_error_code ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn json_last_error_msg();\n\t}\n\n\t/**\n\t * Retrieves the site index.\n\t *\n\t * This endpoint describes the capabilities of the site.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $request {\n\t *     Request.\n\t *\n\t *     @type string $context Context.\n\t * }\n\t * @return array Index entity\n\t */\n\tpublic function get_index( $request ) {\n\t\t// General site data.\n\t\t$available = array(\n\t\t\t'name'           => get_option( 'blogname' ),\n\t\t\t'description'    => get_option( 'blogdescription' ),\n\t\t\t'url'            => get_option( 'siteurl' ),\n\t\t\t'namespaces'     => array_keys( $this->namespaces ),\n\t\t\t'authentication' => array(),\n\t\t\t'routes'         => $this->get_data_for_routes( $this->get_routes(), $request['context'] ),\n\t\t);\n\n\t\t$response = new WP_REST_Response( $available );\n\n\t\t$response->add_link( 'help', 'http://v2.wp-api.org/' );\n\n\t\t/**\n\t\t * Filter the API root index data.\n\t\t *\n\t\t * This contains the data describing the API. This includes information\n\t\t * about supported authentication schemes, supported namespaces, routes\n\t\t * available on the API, and a small amount of data about the site.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param WP_REST_Response $response Response data.\n\t\t */\n\t\treturn apply_filters( 'rest_index', $response );\n\t}\n\n\t/**\n\t * Retrieves the index for a namespace.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param WP_REST_Request $request REST request instance.\n\t * @return WP_REST_Response|WP_Error WP_REST_Response instance if the index was found,\n\t *                                   WP_Error if the namespace isn't set.\n\t */\n\tpublic function get_namespace_index( $request ) {\n\t\t$namespace = $request['namespace'];\n\n\t\tif ( ! isset( $this->namespaces[ $namespace ] ) ) {\n\t\t\treturn new WP_Error( 'rest_invalid_namespace', __( 'The specified namespace could not be found.' ), array( 'status' => 404 ) );\n\t\t}\n\n\t\t$routes = $this->namespaces[ $namespace ];\n\t\t$endpoints = array_intersect_key( $this->get_routes(), $routes );\n\n\t\t$data = array(\n\t\t\t'namespace' => $namespace,\n\t\t\t'routes' => $this->get_data_for_routes( $endpoints, $request['context'] ),\n\t\t);\n\t\t$response = rest_ensure_response( $data );\n\n\t\t// Link to the root index.\n\t\t$response->add_link( 'up', rest_url( '/' ) );\n\n\t\t/**\n\t\t * Filter the namespace index data.\n\t\t *\n\t\t * This typically is just the route data for the namespace, but you can\n\t\t * add any data you'd like here.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param WP_REST_Response $response Response data.\n\t\t * @param WP_REST_Request  $request  Request data. The namespace is passed as the 'namespace' parameter.\n\t\t */\n\t\treturn apply_filters( 'rest_namespace_index', $response, $request );\n\t}\n\n\t/**\n\t * Retrieves the publicly-visible data for routes.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array  $routes  Routes to get data for.\n\t * @param string $context Optional. Context for data. Accepts 'view' or 'help'. Default 'view'.\n\t * @return array Route data to expose in indexes.\n\t */\n\tpublic function get_data_for_routes( $routes, $context = 'view' ) {\n\t\t$available = array();\n\n\t\t// Find the available routes.\n\t\tforeach ( $routes as $route => $callbacks ) {\n\t\t\t$data = $this->get_data_for_route( $route, $callbacks, $context );\n\t\t\tif ( empty( $data ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter the REST endpoint data.\n\t\t\t *\n\t\t\t * @since 4.4.0\n\t\t\t *\n\t\t\t * @param WP_REST_Request $request Request data. The namespace is passed as the 'namespace' parameter.\n\t\t\t */\n\t\t\t$available[ $route ] = apply_filters( 'rest_endpoints_description', $data );\n\t\t}\n\n\t\t/**\n\t\t * Filter the publicly-visible data for routes.\n\t\t *\n\t\t * This data is exposed on indexes and can be used by clients or\n\t\t * developers to investigate the site and find out how to use it. It\n\t\t * acts as a form of self-documentation.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array $available Map of route to route data.\n\t\t * @param array $routes    Internal route data as an associative array.\n\t\t */\n\t\treturn apply_filters( 'rest_route_data', $available, $routes );\n\t}\n\n\t/**\n\t * Retrieves publicly-visible data for the route.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $route     Route to get data for.\n\t * @param array  $callbacks Callbacks to convert to data.\n\t * @param string $context   Optional. Context for the data. Accepts 'view' or 'help'. Default 'view'.\n\t * @return array|null Data for the route, or null if no publicly-visible data.\n\t */\n\tpublic function get_data_for_route( $route, $callbacks, $context = 'view' ) {\n\t\t$data = array(\n\t\t\t'namespace' => '',\n\t\t\t'methods' => array(),\n\t\t\t'endpoints' => array(),\n\t\t);\n\n\t\tif ( isset( $this->route_options[ $route ] ) ) {\n\t\t\t$options = $this->route_options[ $route ];\n\n\t\t\tif ( isset( $options['namespace'] ) ) {\n\t\t\t\t$data['namespace'] = $options['namespace'];\n\t\t\t}\n\n\t\t\tif ( isset( $options['schema'] ) && 'help' === $context ) {\n\t\t\t\t$data['schema'] = call_user_func( $options['schema'] );\n\t\t\t}\n\t\t}\n\n\t\t$route = preg_replace( '#\\(\\?P<(\\w+?)>.*?\\)#', '{$1}', $route );\n\n\t\tforeach ( $callbacks as $callback ) {\n\t\t\t// Skip to the next route if any callback is hidden.\n\t\t\tif ( empty( $callback['show_in_index'] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$data['methods'] = array_merge( $data['methods'], array_keys( $callback['methods'] ) );\n\t\t\t$endpoint_data = array(\n\t\t\t\t'methods' => array_keys( $callback['methods'] ),\n\t\t\t);\n\n\t\t\tif ( isset( $callback['args'] ) ) {\n\t\t\t\t$endpoint_data['args'] = array();\n\t\t\t\tforeach ( $callback['args'] as $key => $opts ) {\n\t\t\t\t\t$arg_data = array(\n\t\t\t\t\t\t'required' => ! empty( $opts['required'] ),\n\t\t\t\t\t);\n\t\t\t\t\tif ( isset( $opts['default'] ) ) {\n\t\t\t\t\t\t$arg_data['default'] = $opts['default'];\n\t\t\t\t\t}\n\t\t\t\t\tif ( isset( $opts['enum'] ) ) {\n\t\t\t\t\t\t$arg_data['enum'] = $opts['enum'];\n\t\t\t\t\t}\n\t\t\t\t\tif ( isset( $opts['description'] ) ) {\n\t\t\t\t\t\t$arg_data['description'] = $opts['description'];\n\t\t\t\t\t}\n\t\t\t\t\t$endpoint_data['args'][ $key ] = $arg_data;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$data['endpoints'][] = $endpoint_data;\n\n\t\t\t// For non-variable routes, generate links.\n\t\t\tif ( strpos( $route, '{' ) === false ) {\n\t\t\t\t$data['_links'] = array(\n\t\t\t\t\t'self' => rest_url( $route ),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $data['methods'] ) ) {\n\t\t\t// No methods supported, hide the route.\n\t\t\treturn null;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Sends an HTTP status code.\n\t *\n\t * @since 4.4.0\n\t * @access protected\n\t *\n\t * @param int $code HTTP status.\n\t */\n\tprotected function set_status( $code ) {\n\t\tstatus_header( $code );\n\t}\n\n\t/**\n\t * Sends an HTTP header.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param string $key Header key.\n\t * @param string $value Header value.\n\t */\n\tpublic function send_header( $key, $value ) {\n\t\t/*\n\t\t * Sanitize as per RFC2616 (Section 4.2):\n\t\t *\n\t\t * Any LWS that occurs between field-content MAY be replaced with a\n\t\t * single SP before interpreting the field value or forwarding the\n\t\t * message downstream.\n\t\t */\n\t\t$value = preg_replace( '/\\s+/', ' ', $value );\n\t\theader( sprintf( '%s: %s', $key, $value ) );\n\t}\n\n\t/**\n\t * Sends multiple HTTP headers.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $headers Map of header name to header value.\n\t */\n\tpublic function send_headers( $headers ) {\n\t\tforeach ( $headers as $key => $value ) {\n\t\t\t$this->send_header( $key, $value );\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the raw request entity (body).\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @global string $HTTP_RAW_POST_DATA Raw post data.\n\t *\n\t * @return string Raw request data.\n\t */\n\tpublic static function get_raw_data() {\n\t\tglobal $HTTP_RAW_POST_DATA;\n\n\t\t/*\n\t\t * A bug in PHP < 5.2.2 makes $HTTP_RAW_POST_DATA not set by default,\n\t\t * but we can do it ourself.\n\t\t */\n\t\tif ( ! isset( $HTTP_RAW_POST_DATA ) ) {\n\t\t\t$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );\n\t\t}\n\n\t\treturn $HTTP_RAW_POST_DATA;\n\t}\n\n\t/**\n\t * Extracts headers from a PHP-style $_SERVER array.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $server Associative array similar to `$_SERVER`.\n\t * @return array Headers extracted from the input.\n\t */\n\tpublic function get_headers( $server ) {\n\t\t$headers = array();\n\n\t\t// CONTENT_* headers are not prefixed with HTTP_.\n\t\t$additional = array( 'CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true );\n\n\t\tforeach ( $server as $key => $value ) {\n\t\t\tif ( strpos( $key, 'HTTP_' ) === 0 ) {\n\t\t\t\t$headers[ substr( $key, 5 ) ] = $value;\n\t\t\t} elseif ( isset( $additional[ $key ] ) ) {\n\t\t\t\t$headers[ $key ] = $value;\n\t\t\t}\n\t\t}\n\n\t\treturn $headers;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/rest-api.php",
    "content": "<?php\n/**\n * REST API functions.\n *\n * @package WordPress\n * @subpackage REST_API\n * @since 4.4.0\n */\n\n/**\n * Version number for our API.\n *\n * @var string\n */\ndefine( 'REST_API_VERSION', '2.0' );\n\n/**\n * Registers a REST API route.\n *\n * @since 4.4.0\n *\n * @global WP_REST_Server $wp_rest_server ResponseHandler instance (usually WP_REST_Server).\n *\n * @param string $namespace The first URL segment after core prefix. Should be unique to your package/plugin.\n * @param string $route     The base URL for route you are adding.\n * @param array  $args      Optional. Either an array of options for the endpoint, or an array of arrays for\n *                          multiple methods. Default empty array.\n * @param bool   $override  Optional. If the route already exists, should we override it? True overrides,\n *                          false merges (with newer overriding if duplicate keys exist). Default false.\n * @return bool True on success, false on error.\n */\nfunction register_rest_route( $namespace, $route, $args = array(), $override = false ) {\n\t/** @var WP_REST_Server $wp_rest_server */\n\tglobal $wp_rest_server;\n\n\tif ( empty( $namespace ) ) {\n\t\t/*\n\t\t * Non-namespaced routes are not allowed, with the exception of the main\n\t\t * and namespace indexes. If you really need to register a\n\t\t * non-namespaced route, call `WP_REST_Server::register_route` directly.\n\t\t */\n\t\t_doing_it_wrong( 'register_rest_route', 'Routes must be namespaced with plugin or theme name and version.', '4.4.0' );\n\t\treturn false;\n\t} else if ( empty( $route ) ) {\n\t\t_doing_it_wrong( 'register_rest_route', 'Route must be specified.', '4.4.0' );\n\t\treturn false;\n\t}\n\n\tif ( isset( $args['callback'] ) ) {\n\t\t// Upgrade a single set to multiple.\n\t\t$args = array( $args );\n\t}\n\n\t$defaults = array(\n\t\t'methods'         => 'GET',\n\t\t'callback'        => null,\n\t\t'args'            => array(),\n\t);\n\tforeach ( $args as $key => &$arg_group ) {\n\t\tif ( ! is_numeric( $arg_group ) ) {\n\t\t\t// Route option, skip here.\n\t\t\tcontinue;\n\t\t}\n\n\t\t$arg_group = array_merge( $defaults, $arg_group );\n\t}\n\n\t$full_route = '/' . trim( $namespace, '/' ) . '/' . trim( $route, '/' );\n\t$wp_rest_server->register_route( $namespace, $full_route, $args, $override );\n\treturn true;\n}\n\n/**\n * Registers rewrite rules for the API.\n *\n * @since 4.4.0\n *\n * @see rest_api_register_rewrites()\n * @global WP $wp Current WordPress environment instance.\n */\nfunction rest_api_init() {\n\trest_api_register_rewrites();\n\n\tglobal $wp;\n\t$wp->add_query_var( 'rest_route' );\n}\n\n/**\n * Adds REST rewrite rules.\n *\n * @since 4.4.0\n *\n * @see add_rewrite_rule()\n */\nfunction rest_api_register_rewrites() {\n\tadd_rewrite_rule( '^' . rest_get_url_prefix() . '/?$','index.php?rest_route=/','top' );\n\tadd_rewrite_rule( '^' . rest_get_url_prefix() . '/(.*)?','index.php?rest_route=/$matches[1]','top' );\n}\n\n/**\n * Registers the default REST API filters.\n *\n * Attached to the {@see 'rest_api_init'} action\n * to make testing and disabling these filters easier.\n *\n * @since 4.4.0\n */\nfunction rest_api_default_filters() {\n\t// Deprecated reporting.\n\tadd_action( 'deprecated_function_run', 'rest_handle_deprecated_function', 10, 3 );\n\tadd_filter( 'deprecated_function_trigger_error', '__return_false' );\n\tadd_action( 'deprecated_argument_run', 'rest_handle_deprecated_argument', 10, 3 );\n\tadd_filter( 'deprecated_argument_trigger_error', '__return_false' );\n\n\t// Default serving.\n\tadd_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );\n\tadd_filter( 'rest_post_dispatch', 'rest_send_allow_header', 10, 3 );\n\n\tadd_filter( 'rest_pre_dispatch', 'rest_handle_options_request', 10, 3 );\n}\n\n/**\n * Loads the REST API.\n *\n * @since 4.4.0\n *\n * @global WP             $wp             Current WordPress environment instance.\n * @global WP_REST_Server $wp_rest_server ResponseHandler instance (usually WP_REST_Server).\n */\nfunction rest_api_loaded() {\n\tif ( empty( $GLOBALS['wp']->query_vars['rest_route'] ) ) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Whether this is a REST Request.\n\t *\n\t * @since 4.4.0\n\t * @var bool\n\t */\n\tdefine( 'REST_REQUEST', true );\n\n\t/** @var WP_REST_Server $wp_rest_server */\n\tglobal $wp_rest_server;\n\n\t/**\n\t * Filter the REST Server Class.\n\t *\n\t * This filter allows you to adjust the server class used by the API, using a\n\t * different class to handle requests.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $class_name The name of the server class. Default 'WP_REST_Server'.\n\t */\n\t$wp_rest_server_class = apply_filters( 'wp_rest_server_class', 'WP_REST_Server' );\n\t$wp_rest_server = new $wp_rest_server_class;\n\n\t/**\n\t * Fires when preparing to serve an API request.\n\t *\n\t * Endpoint objects should be created and register their hooks on this action rather\n\t * than another action to ensure they're only loaded when needed.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param WP_REST_Server $wp_rest_server Server object.\n\t */\n\tdo_action( 'rest_api_init', $wp_rest_server );\n\n\t// Fire off the request.\n\t$wp_rest_server->serve_request( $GLOBALS['wp']->query_vars['rest_route'] );\n\n\t// We're done.\n\tdie();\n}\n\n/**\n * Retrieves the URL prefix for any API resource.\n *\n * @since 4.4.0\n *\n * @return string Prefix.\n */\nfunction rest_get_url_prefix() {\n\t/**\n\t * Filter the REST URL prefix.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $prefix URL prefix. Default 'wp-json'.\n\t */\n\treturn apply_filters( 'rest_url_prefix', 'wp-json' );\n}\n\n/**\n * Retrieves the URL to a REST endpoint on a site.\n *\n * Note: The returned URL is NOT escaped.\n *\n * @since 4.4.0\n *\n * @todo Check if this is even necessary\n *\n * @param int    $blog_id Optional. Blog ID. Default of null returns URL for current blog.\n * @param string $path    Optional. REST route. Default '/'.\n * @param string $scheme  Optional. Sanitization scheme. Default 'rest'.\n * @return string Full URL to the endpoint.\n */\nfunction get_rest_url( $blog_id = null, $path = '/', $scheme = 'rest' ) {\n\tif ( empty( $path ) ) {\n\t\t$path = '/';\n\t}\n\n\tif ( is_multisite() && get_blog_option( $blog_id, 'permalink_structure' ) || get_option( 'permalink_structure' ) ) {\n\t\t$url = get_home_url( $blog_id, rest_get_url_prefix(), $scheme );\n\t\t$url .= '/' . ltrim( $path, '/' );\n\t} else {\n\t\t$url = trailingslashit( get_home_url( $blog_id, '', $scheme ) );\n\n\t\t$path = '/' . ltrim( $path, '/' );\n\n\t\t$url = add_query_arg( 'rest_route', $path, $url );\n\t}\n\n\tif ( is_ssl() ) {\n\t\t// If the current host is the same as the REST URL host, force the REST URL scheme to HTTPS.\n\t\tif ( $_SERVER['SERVER_NAME'] === parse_url( get_home_url( $blog_id ), PHP_URL_HOST ) ) {\n\t\t\t$url = set_url_scheme( $url, 'https' );\n\t\t}\n\t}\n\n\t/**\n\t * Filter the REST URL.\n\t *\n\t * Use this filter to adjust the url returned by the `get_rest_url` function.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $url     REST URL.\n\t * @param string $path    REST route.\n\t * @param int    $blog_id Blog ID.\n\t * @param string $scheme  Sanitization scheme.\n\t */\n\treturn apply_filters( 'rest_url', $url, $path, $blog_id, $scheme );\n}\n\n/**\n * Retrieves the URL to a REST endpoint.\n *\n * Note: The returned URL is NOT escaped.\n *\n * @since 4.4.0\n *\n * @param string $path   Optional. REST route. Default empty.\n * @param string $scheme Optional. Sanitization scheme. Default 'json'.\n * @return string Full URL to the endpoint.\n */\nfunction rest_url( $path = '', $scheme = 'json' ) {\n\treturn get_rest_url( null, $path, $scheme );\n}\n\n/**\n * Do a REST request.\n *\n * Used primarily to route internal requests through WP_REST_Server.\n *\n * @since 4.4.0\n *\n * @global WP_REST_Server $wp_rest_server ResponseHandler instance (usually WP_REST_Server).\n *\n * @param WP_REST_Request|string $request Request.\n * @return WP_REST_Response REST response.\n */\nfunction rest_do_request( $request ) {\n\tglobal $wp_rest_server;\n\t$request = rest_ensure_request( $request );\n\treturn $wp_rest_server->dispatch( $request );\n}\n\n/**\n * Ensures request arguments are a request object (for consistency).\n *\n * @since 4.4.0\n *\n * @param array|WP_REST_Request $request Request to check.\n * @return WP_REST_Request REST request instance.\n */\nfunction rest_ensure_request( $request ) {\n\tif ( $request instanceof WP_REST_Request ) {\n\t\treturn $request;\n\t}\n\n\treturn new WP_REST_Request( 'GET', '', $request );\n}\n\n/**\n * Ensures a REST response is a response object (for consistency).\n *\n * This implements WP_HTTP_Response, allowing usage of `set_status`/`header`/etc\n * without needing to double-check the object. Will also allow WP_Error to indicate error\n * responses, so users should immediately check for this value.\n *\n * @since 4.4.0\n *\n * @param WP_Error|WP_HTTP_Response|mixed $response Response to check.\n * @return mixed WP_Error if response generated an error, WP_HTTP_Response if response\n *               is a already an instance, otherwise returns a new WP_REST_Response instance.\n */\nfunction rest_ensure_response( $response ) {\n\tif ( is_wp_error( $response ) ) {\n\t\treturn $response;\n\t}\n\n\tif ( $response instanceof WP_HTTP_Response ) {\n\t\treturn $response;\n\t}\n\n\treturn new WP_REST_Response( $response );\n}\n\n/**\n * Handles _deprecated_function() errors.\n *\n * @since 4.4.0\n *\n * @param string $function    Function name.\n * @param string $replacement Replacement function name.\n * @param string $version     Version.\n */\nfunction rest_handle_deprecated_function( $function, $replacement, $version ) {\n\tif ( ! empty( $replacement ) ) {\n\t\t/* translators: 1: function name, 2: WordPress version number, 3: new function name */\n\t\t$string = sprintf( __( '%1$s (since %2$s; use %3$s instead)' ), $function, $version, $replacement );\n\t} else {\n\t\t/* translators: 1: function name, 2: WordPress version number */\n\t\t$string = sprintf( __( '%1$s (since %2$s; no alternative available)' ), $function, $version );\n\t}\n\n\theader( sprintf( 'X-WP-DeprecatedFunction: %s', $string ) );\n}\n\n/**\n * Handles _deprecated_argument() errors.\n *\n * @since 4.4.0\n *\n * @param string $function    Function name.\n * @param string $replacement Replacement function name.\n * @param string $version     Version.\n */\nfunction rest_handle_deprecated_argument( $function, $replacement, $version ) {\n\tif ( ! empty( $replacement ) ) {\n\t\t/* translators: 1: function name, 2: WordPress version number, 3: new argument name */\n\t\t$string = sprintf( __( '%1$s (since %2$s; %3$s)' ), $function, $version, $replacement );\n\t} else {\n\t\t/* translators: 1: function name, 2: WordPress version number */\n\t\t$string = sprintf( __( '%1$s (since %2$s; no alternative available)' ), $function, $version );\n\t}\n\n\theader( sprintf( 'X-WP-DeprecatedParam: %s', $string ) );\n}\n\n/**\n * Sends Cross-Origin Resource Sharing headers with API requests.\n *\n * @since 4.4.0\n *\n * @param mixed $value Response data.\n * @return mixed Response data.\n */\nfunction rest_send_cors_headers( $value ) {\n\t$origin = get_http_origin();\n\n\tif ( $origin ) {\n\t\theader( 'Access-Control-Allow-Origin: ' . esc_url_raw( $origin ) );\n\t\theader( 'Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE' );\n\t\theader( 'Access-Control-Allow-Credentials: true' );\n\t}\n\n\treturn $value;\n}\n\n/**\n * Handles OPTIONS requests for the server.\n *\n * This is handled outside of the server code, as it doesn't obey normal route\n * mapping.\n *\n * @since 4.4.0\n *\n * @param mixed           $response Current response, either response or `null` to indicate pass-through.\n * @param WP_REST_Server  $handler  ResponseHandler instance (usually WP_REST_Server).\n * @param WP_REST_Request $request  The request that was used to make current response.\n * @return WP_REST_Response Modified response, either response or `null` to indicate pass-through.\n */\nfunction rest_handle_options_request( $response, $handler, $request ) {\n\tif ( ! empty( $response ) || $request->get_method() !== 'OPTIONS' ) {\n\t\treturn $response;\n\t}\n\n\t$response = new WP_REST_Response();\n\t$data = array();\n\n\t$accept = array();\n\n\tforeach ( $handler->get_routes() as $route => $endpoints ) {\n\t\t$match = preg_match( '@^' . $route . '$@i', $request->get_route(), $args );\n\n\t\tif ( ! $match ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$data = $handler->get_data_for_route( $route, $endpoints, 'help' );\n\t\t$accept = array_merge( $accept, $data['methods'] );\n\t\tbreak;\n\t}\n\t$response->header( 'Accept', implode( ', ', $accept ) );\n\n\t$response->set_data( $data );\n\treturn $response;\n}\n\n/**\n * Sends the \"Allow\" header to state all methods that can be sent to the current route.\n *\n * @since 4.4.0\n *\n * @param WP_REST_Response $response Current response being served.\n * @param WP_REST_Server   $server   ResponseHandler instance (usually WP_REST_Server).\n * @param WP_REST_Request  $request  The request that was used to make current response.\n * @return WP_REST_Response Response to be served, with \"Allow\" header if route has allowed methods.\n */\nfunction rest_send_allow_header( $response, $server, $request ) {\n\t$matched_route = $response->get_matched_route();\n\n\tif ( ! $matched_route ) {\n\t\treturn $response;\n\t}\n\n\t$routes = $server->get_routes();\n\n\t$allowed_methods = array();\n\n\t// Get the allowed methods across the routes.\n\tforeach ( $routes[ $matched_route ] as $_handler ) {\n\t\tforeach ( $_handler['methods'] as $handler_method => $value ) {\n\n\t\t\tif ( ! empty( $_handler['permission_callback'] ) ) {\n\n\t\t\t\t$permission = call_user_func( $_handler['permission_callback'], $request );\n\n\t\t\t\t$allowed_methods[ $handler_method ] = true === $permission;\n\t\t\t} else {\n\t\t\t\t$allowed_methods[ $handler_method ] = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Strip out all the methods that are not allowed (false values).\n\t$allowed_methods = array_filter( $allowed_methods );\n\n\tif ( $allowed_methods ) {\n\t\t$response->header( 'Allow', implode( ', ', array_map( 'strtoupper', array_keys( $allowed_methods ) ) ) );\n\t}\n\n\treturn $response;\n}\n\n/**\n * Adds the REST API URL to the WP RSD endpoint.\n *\n * @since 4.4.0\n *\n * @see get_rest_url()\n */\nfunction rest_output_rsd() {\n\t$api_root = get_rest_url();\n\n\tif ( empty( $api_root ) ) {\n\t\treturn;\n\t}\n\t?>\n\t<api name=\"WP-API\" blogID=\"1\" preferred=\"false\" apiLink=\"<?php echo esc_url( $api_root ); ?>\" />\n\t<?php\n}\n\n/**\n * Outputs the REST API link tag into page header.\n *\n * @since 4.4.0\n *\n * @see get_rest_url()\n */\nfunction rest_output_link_wp_head() {\n\t$api_root = get_rest_url();\n\n\tif ( empty( $api_root ) ) {\n\t\treturn;\n\t}\n\n\techo \"<link rel='https://api.w.org/' href='\" . esc_url( $api_root ) . \"' />\\n\";\n}\n\n/**\n * Sends a Link header for the REST API.\n *\n * @since 4.4.0\n */\nfunction rest_output_link_header() {\n\tif ( headers_sent() ) {\n\t\treturn;\n\t}\n\n\t$api_root = get_rest_url();\n\n\tif ( empty( $api_root ) ) {\n\t\treturn;\n\t}\n\n\theader( 'Link: <' . esc_url_raw( $api_root ) . '>; rel=\"https://api.w.org/\"', false );\n}\n\n/**\n * Checks for errors when using cookie-based authentication.\n *\n * WordPress' built-in cookie authentication is always active\n * for logged in users. However, the API has to check nonces\n * for each request to ensure users are not vulnerable to CSRF.\n *\n * @since 4.4.0\n *\n * @global mixed $wp_rest_auth_cookie\n *\n * @param WP_Error|mixed $result Error from another authentication handler, null if we should handle it,\n *                               or another value if not.\n * @return WP_Error|mixed|bool WP_Error if the cookie is invalid, the $result, otherwise true.\n */\nfunction rest_cookie_check_errors( $result ) {\n\tif ( ! empty( $result ) ) {\n\t\treturn $result;\n\t}\n\n\tglobal $wp_rest_auth_cookie;\n\n\t/*\n\t * Is cookie authentication being used? (If we get an auth\n\t * error, but we're still logged in, another authentication\n\t * must have been used).\n\t */\n\tif ( true !== $wp_rest_auth_cookie && is_user_logged_in() ) {\n\t\treturn $result;\n\t}\n\n\t// Determine if there is a nonce.\n\t$nonce = null;\n\n\tif ( isset( $_REQUEST['_wpnonce'] ) ) {\n\t\t$nonce = $_REQUEST['_wpnonce'];\n\t} elseif ( isset( $_SERVER['HTTP_X_WP_NONCE'] ) ) {\n\t\t$nonce = $_SERVER['HTTP_X_WP_NONCE'];\n\t}\n\n\tif ( null === $nonce ) {\n\t\t// No nonce at all, so act as if it's an unauthenticated request.\n\t\twp_set_current_user( 0 );\n\t\treturn true;\n\t}\n\n\t// Check the nonce.\n\t$result = wp_verify_nonce( $nonce, 'wp_rest' );\n\n\tif ( ! $result ) {\n\t\treturn new WP_Error( 'rest_cookie_invalid_nonce', __( 'Cookie nonce is invalid' ), array( 'status' => 403 ) );\n\t}\n\n\treturn true;\n}\n\n/**\n * Collects cookie authentication status.\n *\n * Collects errors from wp_validate_auth_cookie for use by rest_cookie_check_errors.\n *\n * @since 4.4.0\n *\n * @see current_action()\n * @global mixed $wp_rest_auth_cookie\n */\nfunction rest_cookie_collect_status() {\n\tglobal $wp_rest_auth_cookie;\n\n\t$status_type = current_action();\n\n\tif ( 'auth_cookie_valid' !== $status_type ) {\n\t\t$wp_rest_auth_cookie = substr( $status_type, 12 );\n\t\treturn;\n\t}\n\n\t$wp_rest_auth_cookie = true;\n}\n\n/**\n * Parses an RFC3339 timestamp into a DateTime.\n *\n * @since 4.4.0\n *\n * @param string $date      RFC3339 timestamp.\n * @param bool   $force_utc Optional. Whether to force UTC timezone instead of using\n *                          the timestamp's timezone. Default false.\n * @return DateTime DateTime instance.\n */\nfunction rest_parse_date( $date, $force_utc = false ) {\n\tif ( $force_utc ) {\n\t\t$date = preg_replace( '/[+-]\\d+:?\\d+$/', '+00:00', $date );\n\t}\n\n\t$regex = '#^\\d{4}-\\d{2}-\\d{2}[Tt ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}(?::\\d{2})?)?$#';\n\n\tif ( ! preg_match( $regex, $date, $matches ) ) {\n\t\treturn false;\n\t}\n\n\treturn strtotime( $date );\n}\n\n/**\n * Retrieves a local date with its GMT equivalent, in MySQL datetime format.\n *\n * @since 4.4.0\n *\n * @see rest_parse_date()\n *\n * @param string $date      RFC3339 timestamp.\n * @param bool   $force_utc Whether a UTC timestamp should be forced. Default false.\n * @return array|null Local and UTC datetime strings, in MySQL datetime format (Y-m-d H:i:s),\n *                    null on failure.\n */\nfunction rest_get_date_with_gmt( $date, $force_utc = false ) {\n\t$date = rest_parse_date( $date, $force_utc );\n\n\tif ( empty( $date ) ) {\n\t\treturn null;\n\t}\n\n\t$utc = date( 'Y-m-d H:i:s', $date );\n\t$local = get_date_from_gmt( $utc );\n\n\treturn array( $local, $utc );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/revision.php",
    "content": "<?php\n/**\n * Post revision functions.\n *\n * @package WordPress\n * @subpackage Post_Revisions\n */\n\n/**\n * Determines which fields of posts are to be saved in revisions.\n *\n * Does two things. If passed a post *array*, it will return a post array ready\n * to be inserted into the posts table as a post revision. Otherwise, returns\n * an array whose keys are the post fields to be saved for post revisions.\n *\n * @since 2.6.0\n * @access private\n *\n * @staticvar array $fields\n *\n * @param array|null $post     Optional. A post array to be processed for insertion as a post revision. Default null.\n * @param bool       $autosave Optional. Is the revision an autosave? Default false.\n * @return array Post array ready to be inserted as a post revision or array of fields that can be versioned.\n */\nfunction _wp_post_revision_fields( $post = null, $autosave = false ) {\n\tstatic $fields = null;\n\n\tif ( is_null( $fields ) ) {\n\t\t// Allow these to be versioned\n\t\t$fields = array(\n\t\t\t'post_title' => __( 'Title' ),\n\t\t\t'post_content' => __( 'Content' ),\n\t\t\t'post_excerpt' => __( 'Excerpt' ),\n\t\t);\n\n\t\t/**\n\t\t * Filter the list of fields saved in post revisions.\n\t\t *\n\t\t * Included by default: 'post_title', 'post_content' and 'post_excerpt'.\n\t\t *\n\t\t * Disallowed fields: 'ID', 'post_name', 'post_parent', 'post_date',\n\t\t * 'post_date_gmt', 'post_status', 'post_type', 'comment_count',\n\t\t * and 'post_author'.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param array $fields List of fields to revision. Contains 'post_title',\n\t\t *                      'post_content', and 'post_excerpt' by default.\n\t\t */\n\t\t$fields = apply_filters( '_wp_post_revision_fields', $fields );\n\n\t\t// WP uses these internally either in versioning or elsewhere - they cannot be versioned\n\t\tforeach ( array( 'ID', 'post_name', 'post_parent', 'post_date', 'post_date_gmt', 'post_status', 'post_type', 'comment_count', 'post_author' ) as $protect )\n\t\t\tunset( $fields[$protect] );\n\t}\n\n\tif ( !is_array($post) )\n\t\treturn $fields;\n\n\t$return = array();\n\tforeach ( array_intersect( array_keys( $post ), array_keys( $fields ) ) as $field )\n\t\t$return[$field] = $post[$field];\n\n\t$return['post_parent']   = $post['ID'];\n\t$return['post_status']   = 'inherit';\n\t$return['post_type']     = 'revision';\n\t$return['post_name']     = $autosave ? \"$post[ID]-autosave-v1\" : \"$post[ID]-revision-v1\"; // \"1\" is the revisioning system version\n\t$return['post_date']     = isset($post['post_modified']) ? $post['post_modified'] : '';\n\t$return['post_date_gmt'] = isset($post['post_modified_gmt']) ? $post['post_modified_gmt'] : '';\n\n\treturn $return;\n}\n\n/**\n * Creates a revision for the current version of a post.\n *\n * Typically used immediately after a post update, as every update is a revision,\n * and the most recent revision always matches the current post.\n *\n * @since 2.6.0\n *\n * @param int $post_id The ID of the post to save as a revision.\n * @return int|WP_Error|void Void or 0 if error, new revision ID, if success.\n */\nfunction wp_save_post_revision( $post_id ) {\n\tif ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )\n\t\treturn;\n\n\tif ( ! $post = get_post( $post_id ) )\n\t\treturn;\n\n\tif ( ! post_type_supports( $post->post_type, 'revisions' ) )\n\t\treturn;\n\n\tif ( 'auto-draft' == $post->post_status )\n\t\treturn;\n\n\tif ( ! wp_revisions_enabled( $post ) )\n\t\treturn;\n\n\t// Compare the proposed update with the last stored revision verifying that\n\t// they are different, unless a plugin tells us to always save regardless.\n\t// If no previous revisions, save one\n\tif ( $revisions = wp_get_post_revisions( $post_id ) ) {\n\t\t// grab the last revision, but not an autosave\n\t\tforeach ( $revisions as $revision ) {\n\t\t\tif ( false !== strpos( $revision->post_name, \"{$revision->post_parent}-revision\" ) ) {\n\t\t\t\t$last_revision = $revision;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter whether the post has changed since the last revision.\n\t\t *\n\t\t * By default a revision is saved only if one of the revisioned fields has changed.\n\t\t * This filter can override that so a revision is saved even if nothing has changed.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param bool    $check_for_changes Whether to check for changes before saving a new revision.\n\t\t *                                   Default true.\n\t\t * @param WP_Post $last_revision     The the last revision post object.\n\t\t * @param WP_Post $post              The post object.\n\t\t *\n\t\t */\n\t\tif ( isset( $last_revision ) && apply_filters( 'wp_save_post_revision_check_for_changes', $check_for_changes = true, $last_revision, $post ) ) {\n\t\t\t$post_has_changed = false;\n\n\t\t\tforeach ( array_keys( _wp_post_revision_fields() ) as $field ) {\n\t\t\t\tif ( normalize_whitespace( $post->$field ) != normalize_whitespace( $last_revision->$field ) ) {\n\t\t\t\t\t$post_has_changed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Filter whether a post has changed.\n\t\t\t *\n\t\t\t * By default a revision is saved only if one of the revisioned fields has changed.\n\t\t\t * This filter allows for additional checks to determine if there were changes.\n\t\t\t *\n\t\t\t * @since 4.1.0\n\t\t\t *\n\t\t\t * @param bool    $post_has_changed Whether the post has changed.\n\t\t\t * @param WP_Post $last_revision    The last revision post object.\n\t\t\t * @param WP_Post $post             The post object.\n\t\t\t *\n\t\t\t */\n\t\t\t$post_has_changed = (bool) apply_filters( 'wp_save_post_revision_post_has_changed', $post_has_changed, $last_revision, $post );\n\n\t\t\t//don't save revision if post unchanged\n\t\t\tif ( ! $post_has_changed ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t$return = _wp_put_post_revision( $post );\n\n\t// If a limit for the number of revisions to keep has been set,\n\t// delete the oldest ones.\n\t$revisions_to_keep = wp_revisions_to_keep( $post );\n\n\tif ( $revisions_to_keep < 0 )\n\t\treturn $return;\n\n\t$revisions = wp_get_post_revisions( $post_id, array( 'order' => 'ASC' ) );\n\n\t$delete = count($revisions) - $revisions_to_keep;\n\n\tif ( $delete < 1 )\n\t\treturn $return;\n\n\t$revisions = array_slice( $revisions, 0, $delete );\n\n\tfor ( $i = 0; isset( $revisions[$i] ); $i++ ) {\n\t\tif ( false !== strpos( $revisions[ $i ]->post_name, 'autosave' ) )\n\t\t\tcontinue;\n\n\t\twp_delete_post_revision( $revisions[ $i ]->ID );\n\t}\n\n\treturn $return;\n}\n\n/**\n * Retrieve the autosaved data of the specified post.\n *\n * Returns a post object containing the information that was autosaved for the\n * specified post. If the optional $user_id is passed, returns the autosave for that user\n * otherwise returns the latest autosave.\n *\n * @since 2.6.0\n *\n * @param int $post_id The post ID.\n * @param int $user_id Optional The post author ID.\n * @return WP_Post|false The autosaved data or false on failure or when no autosave exists.\n */\nfunction wp_get_post_autosave( $post_id, $user_id = 0 ) {\n\t$revisions = wp_get_post_revisions( $post_id, array( 'check_enabled' => false ) );\n\n\tforeach ( $revisions as $revision ) {\n\t\tif ( false !== strpos( $revision->post_name, \"{$post_id}-autosave\" ) ) {\n\t\t\tif ( $user_id && $user_id != $revision->post_author )\n\t\t\t\tcontinue;\n\n\t\t\treturn $revision;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Determines if the specified post is a revision.\n *\n * @since 2.6.0\n *\n * @param int|WP_Post $post Post ID or post object.\n * @return false|int False if not a revision, ID of revision's parent otherwise.\n */\nfunction wp_is_post_revision( $post ) {\n\tif ( !$post = wp_get_post_revision( $post ) )\n\t\treturn false;\n\n\treturn (int) $post->post_parent;\n}\n\n/**\n * Determines if the specified post is an autosave.\n *\n * @since 2.6.0\n *\n * @param int|WP_Post $post Post ID or post object.\n * @return false|int False if not a revision, ID of autosave's parent otherwise\n */\nfunction wp_is_post_autosave( $post ) {\n\tif ( !$post = wp_get_post_revision( $post ) )\n\t\treturn false;\n\n\tif ( false !== strpos( $post->post_name, \"{$post->post_parent}-autosave\" ) )\n\t\treturn (int) $post->post_parent;\n\n\treturn false;\n}\n\n/**\n * Inserts post data into the posts table as a post revision.\n *\n * @since 2.6.0\n * @access private\n *\n * @param int|WP_Post|array|null $post     Post ID, post object OR post array.\n * @param bool                   $autosave Optional. Is the revision an autosave?\n * @return int|WP_Error WP_Error or 0 if error, new revision ID if success.\n */\nfunction _wp_put_post_revision( $post = null, $autosave = false ) {\n\tif ( is_object($post) )\n\t\t$post = get_object_vars( $post );\n\telseif ( !is_array($post) )\n\t\t$post = get_post($post, ARRAY_A);\n\n\tif ( ! $post || empty($post['ID']) )\n\t\treturn new WP_Error( 'invalid_post', __( 'Invalid post ID.' ) );\n\n\tif ( isset($post['post_type']) && 'revision' == $post['post_type'] )\n\t\treturn new WP_Error( 'post_type', __( 'Cannot create a revision of a revision' ) );\n\n\t$post = _wp_post_revision_fields( $post, $autosave );\n\t$post = wp_slash($post); //since data is from db\n\n\t$revision_id = wp_insert_post( $post );\n\tif ( is_wp_error($revision_id) )\n\t\treturn $revision_id;\n\n\tif ( $revision_id ) {\n\t\t/**\n\t\t * Fires once a revision has been saved.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param int $revision_id Post revision ID.\n\t\t */\n\t\tdo_action( '_wp_put_post_revision', $revision_id );\n\t}\n\n\treturn $revision_id;\n}\n\n/**\n * Gets a post revision.\n *\n * @since 2.6.0\n *\n * @param int|WP_Post $post   The post ID or object.\n * @param string      $output Optional. OBJECT, ARRAY_A, or ARRAY_N.\n * @param string      $filter Optional sanitation filter. @see sanitize_post().\n * @return WP_Post|array|null Null if error or post object if success.\n */\nfunction wp_get_post_revision(&$post, $output = OBJECT, $filter = 'raw') {\n\tif ( !$revision = get_post( $post, OBJECT, $filter ) )\n\t\treturn $revision;\n\tif ( 'revision' !== $revision->post_type )\n\t\treturn null;\n\n\tif ( $output == OBJECT ) {\n\t\treturn $revision;\n\t} elseif ( $output == ARRAY_A ) {\n\t\t$_revision = get_object_vars($revision);\n\t\treturn $_revision;\n\t} elseif ( $output == ARRAY_N ) {\n\t\t$_revision = array_values(get_object_vars($revision));\n\t\treturn $_revision;\n\t}\n\n\treturn $revision;\n}\n\n/**\n * Restores a post to the specified revision.\n *\n * Can restore a past revision using all fields of the post revision, or only selected fields.\n *\n * @since 2.6.0\n *\n * @param int|WP_Post $revision_id Revision ID or revision object.\n * @param array       $fields      Optional. What fields to restore from. Defaults to all.\n * @return int|false|null Null if error, false if no fields to restore, (int) post ID if success.\n */\nfunction wp_restore_post_revision( $revision_id, $fields = null ) {\n\tif ( !$revision = wp_get_post_revision( $revision_id, ARRAY_A ) )\n\t\treturn $revision;\n\n\tif ( !is_array( $fields ) )\n\t\t$fields = array_keys( _wp_post_revision_fields() );\n\n\t$update = array();\n\tforeach ( array_intersect( array_keys( $revision ), $fields ) as $field ) {\n\t\t$update[$field] = $revision[$field];\n\t}\n\n\tif ( !$update )\n\t\treturn false;\n\n\t$update['ID'] = $revision['post_parent'];\n\n\t$update = wp_slash( $update ); //since data is from db\n\n\t$post_id = wp_update_post( $update );\n\tif ( ! $post_id || is_wp_error( $post_id ) )\n\t\treturn $post_id;\n\n\t// Add restore from details\n\t$restore_details = array(\n\t\t'restored_revision_id' => $revision_id,\n\t\t'restored_by_user'     => get_current_user_id(),\n\t\t'restored_time'        => time()\n\t);\n\tupdate_post_meta( $post_id, '_post_restored_from', $restore_details );\n\n\t// Update last edit user\n\tupdate_post_meta( $post_id, '_edit_last', get_current_user_id() );\n\n\t/**\n\t * Fires after a post revision has been restored.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param int $post_id     Post ID.\n\t * @param int $revision_id Post revision ID.\n\t */\n\tdo_action( 'wp_restore_post_revision', $post_id, $revision['ID'] );\n\n\treturn $post_id;\n}\n\n/**\n * Deletes a revision.\n *\n * Deletes the row from the posts table corresponding to the specified revision.\n *\n * @since 2.6.0\n *\n * @param int|WP_Post $revision_id Revision ID or revision object.\n * @return array|false|WP_Post|WP_Error|null Null or WP_Error if error, deleted post if success.\n */\nfunction wp_delete_post_revision( $revision_id ) {\n\tif ( ! $revision = wp_get_post_revision( $revision_id ) ) {\n\t\treturn $revision;\n\t}\n\n\t$delete = wp_delete_post( $revision->ID );\n\tif ( $delete ) {\n\t\t/**\n\t\t * Fires once a post revision has been deleted.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param int          $revision_id Post revision ID.\n\t\t * @param object|array $revision    Post revision object or array.\n\t\t */\n\t\tdo_action( 'wp_delete_post_revision', $revision->ID, $revision );\n\t}\n\n\treturn $delete;\n}\n\n/**\n * Returns all revisions of specified post.\n *\n * @since 2.6.0\n *\n * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post.\n * @return array An array of revisions, or an empty array if none.\n */\nfunction wp_get_post_revisions( $post_id = 0, $args = null ) {\n\t$post = get_post( $post_id );\n\tif ( ! $post || empty( $post->ID ) )\n\t\treturn array();\n\n\t$defaults = array( 'order' => 'DESC', 'orderby' => 'date ID', 'check_enabled' => true );\n\t$args = wp_parse_args( $args, $defaults );\n\n\tif ( $args['check_enabled'] && ! wp_revisions_enabled( $post ) )\n\t\treturn array();\n\n\t$args = array_merge( $args, array( 'post_parent' => $post->ID, 'post_type' => 'revision', 'post_status' => 'inherit' ) );\n\n\tif ( ! $revisions = get_children( $args ) )\n\t\treturn array();\n\n\treturn $revisions;\n}\n\n/**\n * Determine if revisions are enabled for a given post.\n *\n * @since 3.6.0\n *\n * @param WP_Post $post The post object.\n * @return bool True if number of revisions to keep isn't zero, false otherwise.\n */\nfunction wp_revisions_enabled( $post ) {\n\treturn wp_revisions_to_keep( $post ) !== 0;\n}\n\n/**\n * Determine how many revisions to retain for a given post.\n *\n * By default, an infinite number of revisions are kept.\n *\n * The constant WP_POST_REVISIONS can be set in wp-config to specify the limit\n * of revisions to keep.\n *\n * @since 3.6.0\n *\n * @param WP_Post $post The post object.\n * @return int The number of revisions to keep.\n */\nfunction wp_revisions_to_keep( $post ) {\n\t$num = WP_POST_REVISIONS;\n\n\tif ( true === $num )\n\t\t$num = -1;\n\telse\n\t\t$num = intval( $num );\n\n\tif ( ! post_type_supports( $post->post_type, 'revisions' ) )\n\t\t$num = 0;\n\n\t/**\n\t * Filter the number of revisions to save for the given post.\n\t *\n\t * Overrides the value of WP_POST_REVISIONS.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param int     $num  Number of revisions to store.\n\t * @param WP_Post $post Post object.\n\t */\n\treturn (int) apply_filters( 'wp_revisions_to_keep', $num, $post );\n}\n\n/**\n * Sets up the post object for preview based on the post autosave.\n *\n * @since 2.7.0\n * @access private\n *\n * @param WP_Post $post\n * @return WP_Post|false\n */\nfunction _set_preview( $post ) {\n\tif ( ! is_object( $post ) ) {\n\t\treturn $post;\n\t}\n\n\t$preview = wp_get_post_autosave( $post->ID );\n\tif ( ! is_object( $preview ) ) {\n\t\treturn $post;\n\t}\n\n\t$preview = sanitize_post( $preview );\n\n\t$post->post_content = $preview->post_content;\n\t$post->post_title = $preview->post_title;\n\t$post->post_excerpt = $preview->post_excerpt;\n\n\tadd_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 );\n\n\treturn $post;\n}\n\n/**\n * Filters the latest content for preview from the post autosave.\n *\n * @since 2.7.0\n * @access private\n */\nfunction _show_post_preview() {\n\tif ( isset($_GET['preview_id']) && isset($_GET['preview_nonce']) ) {\n\t\t$id = (int) $_GET['preview_id'];\n\n\t\tif ( false === wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . $id ) )\n\t\t\twp_die( __('You do not have permission to preview drafts.') );\n\n\t\tadd_filter('the_preview', '_set_preview');\n\t}\n}\n\n/**\n * Filters terms lookup to set the post format.\n *\n * @since 3.6.0\n * @access private\n *\n * @param array  $terms\n * @param int    $post_id\n * @param string $taxonomy\n * @return array\n */\nfunction _wp_preview_terms_filter( $terms, $post_id, $taxonomy ) {\n\tif ( ! $post = get_post() )\n\t\treturn $terms;\n\n\tif ( empty( $_REQUEST['post_format'] ) || $post->ID != $post_id || 'post_format' != $taxonomy || 'revision' == $post->post_type )\n\t\treturn $terms;\n\n\tif ( 'standard' == $_REQUEST['post_format'] )\n\t\t$terms = array();\n\telseif ( $term = get_term_by( 'slug', 'post-format-' . sanitize_key( $_REQUEST['post_format'] ), 'post_format' ) )\n\t\t$terms = array( $term ); // Can only have one post format\n\n\treturn $terms;\n}\n\n/**\n * Gets the post revision version.\n *\n * @since 3.6.0\n * @access private\n *\n * @param WP_Post $revision\n * @return int|false\n */\nfunction _wp_get_post_revision_version( $revision ) {\n\tif ( is_object( $revision ) )\n\t\t$revision = get_object_vars( $revision );\n\telseif ( !is_array( $revision ) )\n\t\treturn false;\n\n\tif ( preg_match( '/^\\d+-(?:autosave|revision)-v(\\d+)$/', $revision['post_name'], $matches ) )\n\t\treturn (int) $matches[1];\n\n\treturn 0;\n}\n\n/**\n * Upgrade the revisions author, add the current post as a revision and set the revisions version to 1\n *\n * @since 3.6.0\n * @access private\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param WP_Post $post      Post object\n * @param array   $revisions Current revisions of the post\n * @return bool true if the revisions were upgraded, false if problems\n */\nfunction _wp_upgrade_revisions_of_post( $post, $revisions ) {\n\tglobal $wpdb;\n\n\t// Add post option exclusively\n\t$lock = \"revision-upgrade-{$post->ID}\";\n\t$now = time();\n\t$result = $wpdb->query( $wpdb->prepare( \"INSERT IGNORE INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, 'no') /* LOCK */\", $lock, $now ) );\n\tif ( ! $result ) {\n\t\t// If we couldn't get a lock, see how old the previous lock is\n\t\t$locked = get_option( $lock );\n\t\tif ( ! $locked ) {\n\t\t\t// Can't write to the lock, and can't read the lock.\n\t\t\t// Something broken has happened\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( $locked > $now - 3600 ) {\n\t\t\t// Lock is not too old: some other process may be upgrading this post.  Bail.\n\t\t\treturn false;\n\t\t}\n\n\t\t// Lock is too old - update it (below) and continue\n\t}\n\n\t// If we could get a lock, re-\"add\" the option to fire all the correct filters.\n\tupdate_option( $lock, $now );\n\n\treset( $revisions );\n\t$add_last = true;\n\n\tdo {\n\t\t$this_revision = current( $revisions );\n\t\t$prev_revision = next( $revisions );\n\n\t\t$this_revision_version = _wp_get_post_revision_version( $this_revision );\n\n\t\t// Something terrible happened\n\t\tif ( false === $this_revision_version )\n\t\t\tcontinue;\n\n\t\t// 1 is the latest revision version, so we're already up to date.\n\t\t// No need to add a copy of the post as latest revision.\n\t\tif ( 0 < $this_revision_version ) {\n\t\t\t$add_last = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Always update the revision version\n\t\t$update = array(\n\t\t\t'post_name' => preg_replace( '/^(\\d+-(?:autosave|revision))[\\d-]*$/', '$1-v1', $this_revision->post_name ),\n\t\t);\n\n\t\t// If this revision is the oldest revision of the post, i.e. no $prev_revision,\n\t\t// the correct post_author is probably $post->post_author, but that's only a good guess.\n\t\t// Update the revision version only and Leave the author as-is.\n\t\tif ( $prev_revision ) {\n\t\t\t$prev_revision_version = _wp_get_post_revision_version( $prev_revision );\n\n\t\t\t// If the previous revision is already up to date, it no longer has the information we need :(\n\t\t\tif ( $prev_revision_version < 1 )\n\t\t\t\t$update['post_author'] = $prev_revision->post_author;\n\t\t}\n\n\t\t// Upgrade this revision\n\t\t$result = $wpdb->update( $wpdb->posts, $update, array( 'ID' => $this_revision->ID ) );\n\n\t\tif ( $result )\n\t\t\twp_cache_delete( $this_revision->ID, 'posts' );\n\n\t} while ( $prev_revision );\n\n\tdelete_option( $lock );\n\n\t// Add a copy of the post as latest revision.\n\tif ( $add_last )\n\t\twp_save_post_revision( $post->ID );\n\n\treturn true;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/rewrite.php",
    "content": "<?php\n/**\n * WordPress Rewrite API\n *\n * @package WordPress\n * @subpackage Rewrite\n */\n\n/**\n * Endpoint Mask for default, which is nothing.\n *\n * @since 2.1.0\n */\ndefine('EP_NONE', 0);\n\n/**\n * Endpoint Mask for Permalink.\n *\n * @since 2.1.0\n */\ndefine('EP_PERMALINK', 1);\n\n/**\n * Endpoint Mask for Attachment.\n *\n * @since 2.1.0\n */\ndefine('EP_ATTACHMENT', 2);\n\n/**\n * Endpoint Mask for date.\n *\n * @since 2.1.0\n */\ndefine('EP_DATE', 4);\n\n/**\n * Endpoint Mask for year\n *\n * @since 2.1.0\n */\ndefine('EP_YEAR', 8);\n\n/**\n * Endpoint Mask for month.\n *\n * @since 2.1.0\n */\ndefine('EP_MONTH', 16);\n\n/**\n * Endpoint Mask for day.\n *\n * @since 2.1.0\n */\ndefine('EP_DAY', 32);\n\n/**\n * Endpoint Mask for root.\n *\n * @since 2.1.0\n */\ndefine('EP_ROOT', 64);\n\n/**\n * Endpoint Mask for comments.\n *\n * @since 2.1.0\n */\ndefine('EP_COMMENTS', 128);\n\n/**\n * Endpoint Mask for searches.\n *\n * @since 2.1.0\n */\ndefine('EP_SEARCH', 256);\n\n/**\n * Endpoint Mask for categories.\n *\n * @since 2.1.0\n */\ndefine('EP_CATEGORIES', 512);\n\n/**\n * Endpoint Mask for tags.\n *\n * @since 2.3.0\n */\ndefine('EP_TAGS', 1024);\n\n/**\n * Endpoint Mask for authors.\n *\n * @since 2.1.0\n */\ndefine('EP_AUTHORS', 2048);\n\n/**\n * Endpoint Mask for pages.\n *\n * @since 2.1.0\n */\ndefine('EP_PAGES', 4096);\n\n/**\n * Endpoint Mask for all archive views.\n *\n * @since 3.7.0\n */\ndefine( 'EP_ALL_ARCHIVES', EP_DATE | EP_YEAR | EP_MONTH | EP_DAY | EP_CATEGORIES | EP_TAGS | EP_AUTHORS );\n\n/**\n * Endpoint Mask for everything.\n *\n * @since 2.1.0\n */\ndefine( 'EP_ALL', EP_PERMALINK | EP_ATTACHMENT | EP_ROOT | EP_COMMENTS | EP_SEARCH | EP_PAGES | EP_ALL_ARCHIVES );\n\n/**\n * Adds a rewrite rule that transforms a URL structure to a set of query vars.\n *\n * Any value in the $after parameter that isn't 'bottom' will result in the rule\n * being placed at the top of the rewrite rules.\n *\n * @since 2.1.0\n * @since 4.4.0 Array support was added to the `$query` parameter.\n *\n * @global WP_Rewrite $wp_rewrite WordPress Rewrite Component.\n *\n * @param string       $regex Regular expression to match request against.\n * @param string|array $query The corresponding query vars for this rewrite rule.\n * @param string       $after Optional. Priority of the new rule. Accepts 'top'\n *                            or 'bottom'. Default 'bottom'.\n */\nfunction add_rewrite_rule( $regex, $query, $after = 'bottom' ) {\n\tglobal $wp_rewrite;\n\n\t$wp_rewrite->add_rule( $regex, $query, $after );\n}\n\n/**\n * Add a new rewrite tag (like %postname%).\n *\n * The $query parameter is optional. If it is omitted you must ensure that\n * you call this on, or before, the 'init' hook. This is because $query defaults\n * to \"$tag=\", and for this to work a new query var has to be added.\n *\n * @since 2.1.0\n *\n * @global WP_Rewrite $wp_rewrite\n * @global WP         $wp\n *\n * @param string $tag   Name of the new rewrite tag.\n * @param string $regex Regular expression to substitute the tag for in rewrite rules.\n * @param string $query Optional. String to append to the rewritten query. Must end in '='. Default empty.\n */\nfunction add_rewrite_tag( $tag, $regex, $query = '' ) {\n\t// validate the tag's name\n\tif ( strlen( $tag ) < 3 || $tag[0] != '%' || $tag[ strlen($tag) - 1 ] != '%' )\n\t\treturn;\n\n\tglobal $wp_rewrite, $wp;\n\n\tif ( empty( $query ) ) {\n\t\t$qv = trim( $tag, '%' );\n\t\t$wp->add_query_var( $qv );\n\t\t$query = $qv . '=';\n\t}\n\n\t$wp_rewrite->add_rewrite_tag( $tag, $regex, $query );\n}\n\n/**\n * Add permalink structure.\n *\n * @since 3.0.0\n *\n * @see WP_Rewrite::add_permastruct()\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string $name   Name for permalink structure.\n * @param string $struct Permalink structure.\n * @param array  $args   Optional. Arguments for building the rules from the permalink structure,\n *                       see WP_Rewrite::add_permastruct() for full details. Default empty array.\n */\nfunction add_permastruct( $name, $struct, $args = array() ) {\n\tglobal $wp_rewrite;\n\n\t// backwards compatibility for the old parameters: $with_front and $ep_mask\n\tif ( ! is_array( $args ) )\n\t\t$args = array( 'with_front' => $args );\n\tif ( func_num_args() == 4 )\n\t\t$args['ep_mask'] = func_get_arg( 3 );\n\n\t$wp_rewrite->add_permastruct( $name, $struct, $args );\n}\n\n/**\n * Add a new feed type like /atom1/.\n *\n * @since 2.1.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string   $feedname Feed name.\n * @param callable $function Callback to run on feed display.\n * @return string Feed action name.\n */\nfunction add_feed( $feedname, $function ) {\n\tglobal $wp_rewrite;\n\n\tif ( ! in_array( $feedname, $wp_rewrite->feeds ) ) {\n\t\t$wp_rewrite->feeds[] = $feedname;\n\t}\n\n\t$hook = 'do_feed_' . $feedname;\n\n\t// Remove default function hook\n\tremove_action( $hook, $hook );\n\n\tadd_action( $hook, $function, 10, 2 );\n\n\treturn $hook;\n}\n\n/**\n * Remove rewrite rules and then recreate rewrite rules.\n *\n * @since 3.0.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param bool $hard Whether to update .htaccess (hard flush) or just update\n * \t                 rewrite_rules transient (soft flush). Default is true (hard).\n */\nfunction flush_rewrite_rules( $hard = true ) {\n\tglobal $wp_rewrite;\n\t$wp_rewrite->flush_rules( $hard );\n}\n\n/**\n * Add an endpoint, like /trackback/.\n *\n * Adding an endpoint creates extra rewrite rules for each of the matching\n * places specified by the provided bitmask. For example:\n *\n *     add_rewrite_endpoint( 'json', EP_PERMALINK | EP_PAGES );\n *\n * will add a new rewrite rule ending with \"json(/(.*))?/?$\" for every permastruct\n * that describes a permalink (post) or page. This is rewritten to \"json=$match\"\n * where $match is the part of the URL matched by the endpoint regex (e.g. \"foo\" in\n * \"[permalink]/json/foo/\").\n *\n * A new query var with the same name as the endpoint will also be created.\n *\n * When specifying $places ensure that you are using the EP_* constants (or a\n * combination of them using the bitwise OR operator) as their values are not\n * guaranteed to remain static (especially `EP_ALL`).\n *\n * Be sure to flush the rewrite rules - see flush_rewrite_rules() - when your plugin gets\n * activated and deactivated.\n *\n * @since 2.1.0\n * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`.\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param string      $name      Name of the endpoint.\n * @param int         $places    Endpoint mask describing the places the endpoint should be added.\n * @param string|bool $query_var Name of the corresponding query variable. Pass `false` to skip registering a query_var\n *                               for this endpoint. Defaults to the value of `$name`.\n */\nfunction add_rewrite_endpoint( $name, $places, $query_var = true ) {\n\tglobal $wp_rewrite;\n\t$wp_rewrite->add_endpoint( $name, $places, $query_var );\n}\n\n/**\n * Filter the URL base for taxonomies.\n *\n * To remove any manually prepended /index.php/.\n *\n * @access private\n * @since 2.6.0\n *\n * @param string $base The taxonomy base that we're going to filter\n * @return string\n */\nfunction _wp_filter_taxonomy_base( $base ) {\n\tif ( !empty( $base ) ) {\n\t\t$base = preg_replace( '|^/index\\.php/|', '', $base );\n\t\t$base = trim( $base, '/' );\n\t}\n\treturn $base;\n}\n\n\n/**\n * Resolve numeric slugs that collide with date permalinks.\n *\n * Permalinks of posts with numeric slugs can sometimes look to WP_Query::parse_query()\n * like a date archive, as when your permalink structure is `/%year%/%postname%/` and\n * a post with post_name '05' has the URL `/2015/05/`.\n *\n * This function detects conflicts of this type and resolves them in favor of the\n * post permalink.\n *\n * Note that, since 4.3.0, wp_unique_post_slug() prevents the creation of post slugs\n * that would result in a date archive conflict. The resolution performed in this\n * function is primarily for legacy content, as well as cases when the admin has changed\n * the site's permalink structure in a way that introduces URL conflicts.\n *\n * @since 4.3.0\n *\n * @param array $query_vars Optional. Query variables for setting up the loop, as determined in\n *                          WP::parse_request(). Default empty array.\n * @return array Returns the original array of query vars, with date/post conflicts resolved.\n */\nfunction wp_resolve_numeric_slug_conflicts( $query_vars = array() ) {\n\tif ( ! isset( $query_vars['year'] ) && ! isset( $query_vars['monthnum'] ) && ! isset( $query_vars['day'] ) ) {\n\t\treturn $query_vars;\n\t}\n\n\t// Identify the 'postname' position in the permastruct array.\n\t$permastructs   = array_values( array_filter( explode( '/', get_option( 'permalink_structure' ) ) ) );\n\t$postname_index = array_search( '%postname%', $permastructs );\n\n\tif ( false === $postname_index ) {\n\t\treturn $query_vars;\n\t}\n\n\t/*\n\t * A numeric slug could be confused with a year, month, or day, depending on position. To account for\n\t * the possibility of post pagination (eg 2015/2 for the second page of a post called '2015'), our\n\t * `is_*` checks are generous: check for year-slug clashes when `is_year` *or* `is_month`, and check\n\t * for month-slug clashes when `is_month` *or* `is_day`.\n\t */\n\t$compare = '';\n\tif ( 0 === $postname_index && ( isset( $query_vars['year'] ) || isset( $query_vars['monthnum'] ) ) ) {\n\t\t$compare = 'year';\n\t} elseif ( '%year%' === $permastructs[ $postname_index - 1 ] && ( isset( $query_vars['monthnum'] ) || isset( $query_vars['day'] ) ) ) {\n\t\t$compare = 'monthnum';\n\t} elseif ( '%monthnum%' === $permastructs[ $postname_index - 1 ] && isset( $query_vars['day'] ) ) {\n\t\t$compare = 'day';\n\t}\n\n\tif ( ! $compare ) {\n\t\treturn $query_vars;\n\t}\n\n\t// This is the potentially clashing slug.\n\t$value = $query_vars[ $compare ];\n\n\t$post = get_page_by_path( $value, OBJECT, 'post' );\n\tif ( ! ( $post instanceof WP_Post ) ) {\n\t\treturn $query_vars;\n\t}\n\n\t// If the date of the post doesn't match the date specified in the URL, resolve to the date archive.\n\tif ( preg_match( '/^([0-9]{4})\\-([0-9]{2})/', $post->post_date, $matches ) && isset( $query_vars['year'] ) && ( 'monthnum' === $compare || 'day' === $compare ) ) {\n\t\t// $matches[1] is the year the post was published.\n\t\tif ( intval( $query_vars['year'] ) !== intval( $matches[1] ) ) {\n\t\t\treturn $query_vars;\n\t\t}\n\n\t\t// $matches[2] is the month the post was published.\n\t\tif ( 'day' === $compare && isset( $query_vars['monthnum'] ) && intval( $query_vars['monthnum'] ) !== intval( $matches[2] ) ) {\n\t\t\treturn $query_vars;\n\t\t}\n\t}\n\n\t/*\n\t * If the located post contains nextpage pagination, then the URL chunk following postname may be\n\t * intended as the page number. Verify that it's a valid page before resolving to it.\n\t */\n\t$maybe_page = '';\n\tif ( 'year' === $compare && isset( $query_vars['monthnum'] ) ) {\n\t\t$maybe_page = $query_vars['monthnum'];\n\t} elseif ( 'monthnum' === $compare && isset( $query_vars['day'] ) ) {\n\t\t$maybe_page = $query_vars['day'];\n\t}\n\t// Bug found in #11694 - 'page' was returning '/4'\n\t$maybe_page = (int) trim( $maybe_page, '/' );\n\n\t$post_page_count = substr_count( $post->post_content, '<!--nextpage-->' ) + 1;\n\n\t// If the post doesn't have multiple pages, but a 'page' candidate is found, resolve to the date archive.\n\tif ( 1 === $post_page_count && $maybe_page ) {\n\t\treturn $query_vars;\n\t}\n\n\t// If the post has multiple pages and the 'page' number isn't valid, resolve to the date archive.\n\tif ( $post_page_count > 1 && $maybe_page > $post_page_count ) {\n\t\treturn $query_vars;\n\t}\n\n\t// If we've gotten to this point, we have a slug/date clash. First, adjust for nextpage.\n\tif ( '' !== $maybe_page ) {\n\t\t$query_vars['page'] = intval( $maybe_page );\n\t}\n\n\t// Next, unset autodetected date-related query vars.\n\tunset( $query_vars['year'] );\n\tunset( $query_vars['monthnum'] );\n\tunset( $query_vars['day'] );\n\n\t// Then, set the identified post.\n\t$query_vars['name'] = $post->post_name;\n\n\t// Finally, return the modified query vars.\n\treturn $query_vars;\n}\n\n/**\n * Examine a url and try to determine the post ID it represents.\n *\n * Checks are supposedly from the hosted site blog.\n *\n * @since 1.0.0\n *\n * @global WP_Rewrite $wp_rewrite\n * @global WP         $wp\n *\n * @param string $url Permalink to check.\n * @return int Post ID, or 0 on failure.\n */\nfunction url_to_postid( $url ) {\n\tglobal $wp_rewrite;\n\n\t/**\n\t * Filter the URL to derive the post ID from.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param string $url The URL to derive the post ID from.\n\t */\n\t$url = apply_filters( 'url_to_postid', $url );\n\n\t// First, check to see if there is a 'p=N' or 'page_id=N' to match against\n\tif ( preg_match('#[?&](p|page_id|attachment_id)=(\\d+)#', $url, $values) )\t{\n\t\t$id = absint($values[2]);\n\t\tif ( $id )\n\t\t\treturn $id;\n\t}\n\n\t// Check to see if we are using rewrite rules\n\t$rewrite = $wp_rewrite->wp_rewrite_rules();\n\n\t// Not using rewrite rules, and 'p=N' and 'page_id=N' methods failed, so we're out of options\n\tif ( empty($rewrite) )\n\t\treturn 0;\n\n\t// Get rid of the #anchor\n\t$url_split = explode('#', $url);\n\t$url = $url_split[0];\n\n\t// Get rid of URL ?query=string\n\t$url_split = explode('?', $url);\n\t$url = $url_split[0];\n\n\t// Set the correct URL scheme.\n\t$url = set_url_scheme( $url );\n\n\t// Add 'www.' if it is absent and should be there\n\tif ( false !== strpos(home_url(), '://www.') && false === strpos($url, '://www.') )\n\t\t$url = str_replace('://', '://www.', $url);\n\n\t// Strip 'www.' if it is present and shouldn't be\n\tif ( false === strpos(home_url(), '://www.') )\n\t\t$url = str_replace('://www.', '://', $url);\n\n\t// Strip 'index.php/' if we're not using path info permalinks\n\tif ( !$wp_rewrite->using_index_permalinks() )\n\t\t$url = str_replace( $wp_rewrite->index . '/', '', $url );\n\n\tif ( false !== strpos( trailingslashit( $url ), home_url( '/' ) ) ) {\n\t\t// Chop off http://domain.com/[path]\n\t\t$url = str_replace(home_url(), '', $url);\n\t} else {\n\t\t// Chop off /path/to/blog\n\t\t$home_path = parse_url( home_url( '/' ) );\n\t\t$home_path = isset( $home_path['path'] ) ? $home_path['path'] : '' ;\n\t\t$url = preg_replace( sprintf( '#^%s#', preg_quote( $home_path ) ), '', trailingslashit( $url ) );\n\t}\n\n\t// Trim leading and lagging slashes\n\t$url = trim($url, '/');\n\n\t$request = $url;\n\t$post_type_query_vars = array();\n\n\tforeach ( get_post_types( array() , 'objects' ) as $post_type => $t ) {\n\t\tif ( ! empty( $t->query_var ) )\n\t\t\t$post_type_query_vars[ $t->query_var ] = $post_type;\n\t}\n\n\t// Look for matches.\n\t$request_match = $request;\n\tforeach ( (array)$rewrite as $match => $query) {\n\n\t\t// If the requesting file is the anchor of the match, prepend it\n\t\t// to the path info.\n\t\tif ( !empty($url) && ($url != $request) && (strpos($match, $url) === 0) )\n\t\t\t$request_match = $url . '/' . $request;\n\n\t\tif ( preg_match(\"#^$match#\", $request_match, $matches) ) {\n\n\t\t\tif ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\\$matches\\[([0-9]+)\\]/', $query, $varmatch ) ) {\n\t\t\t\t// This is a verbose page match, let's check to be sure about it.\n\t\t\t\t$page = get_page_by_path( $matches[ $varmatch[1] ] );\n\t\t\t\tif ( ! $page ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$post_status_obj = get_post_status_object( $page->post_status );\n\t\t\t\tif ( ! $post_status_obj->public && ! $post_status_obj->protected\n\t\t\t\t\t&& ! $post_status_obj->private && $post_status_obj->exclude_from_search ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Got a match.\n\t\t\t// Trim the query of everything up to the '?'.\n\t\t\t$query = preg_replace(\"!^.+\\?!\", '', $query);\n\n\t\t\t// Substitute the substring matches into the query.\n\t\t\t$query = addslashes(WP_MatchesMapRegex::apply($query, $matches));\n\n\t\t\t// Filter out non-public query vars\n\t\t\tglobal $wp;\n\t\t\tparse_str( $query, $query_vars );\n\t\t\t$query = array();\n\t\t\tforeach ( (array) $query_vars as $key => $value ) {\n\t\t\t\tif ( in_array( $key, $wp->public_query_vars ) ){\n\t\t\t\t\t$query[$key] = $value;\n\t\t\t\t\tif ( isset( $post_type_query_vars[$key] ) ) {\n\t\t\t\t\t\t$query['post_type'] = $post_type_query_vars[$key];\n\t\t\t\t\t\t$query['name'] = $value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resolve conflicts between posts with numeric slugs and date archive queries.\n\t\t\t$query = wp_resolve_numeric_slug_conflicts( $query );\n\n\t\t\t// Do the query\n\t\t\t$query = new WP_Query( $query );\n\t\t\tif ( ! empty( $query->posts ) && $query->is_singular )\n\t\t\t\treturn $query->post->ID;\n\t\t\telse\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\treturn 0;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/rss-functions.php",
    "content": "<?php\n/**\n * Deprecated. Use rss.php instead.\n *\n * @package WordPress\n */\n\n_deprecated_file( basename(__FILE__), '2.1', WPINC . '/rss.php' );\nrequire_once( ABSPATH . WPINC . '/rss.php' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/rss.php",
    "content": "<?php\n/**\n * MagpieRSS: a simple RSS integration tool\n *\n * A compiled file for RSS syndication\n *\n * @author Kellan Elliott-McCrea <kellan@protest.net>\n * @version 0.51\n * @license GPL\n *\n * @package External\n * @subpackage MagpieRSS\n * @deprecated 3.0.0 Use SimplePie instead.\n */\n\n/**\n * Deprecated. Use SimplePie (class-simplepie.php) instead.\n */\n_deprecated_file( basename( __FILE__ ), '3.0', WPINC . '/class-simplepie.php' );\n\n/**\n * Fires before MagpieRSS is loaded, to optionally replace it.\n *\n * @since 2.3.0\n * @deprecated 3.0.0\n */\ndo_action( 'load_feed_engine' );\n\n/** RSS feed constant. */\ndefine('RSS', 'RSS');\ndefine('ATOM', 'Atom');\ndefine('MAGPIE_USER_AGENT', 'WordPress/' . $GLOBALS['wp_version']);\n\nclass MagpieRSS {\n\tvar $parser;\n\tvar $current_item\t= array();\t// item currently being parsed\n\tvar $items\t\t\t= array();\t// collection of parsed items\n\tvar $channel\t\t= array();\t// hash of channel fields\n\tvar $textinput\t\t= array();\n\tvar $image\t\t\t= array();\n\tvar $feed_type;\n\tvar $feed_version;\n\n\t// parser variables\n\tvar $stack\t\t\t\t= array(); // parser stack\n\tvar $inchannel\t\t\t= false;\n\tvar $initem \t\t\t= false;\n\tvar $incontent\t\t\t= false; // if in Atom <content mode=\"xml\"> field\n\tvar $intextinput\t\t= false;\n\tvar $inimage \t\t\t= false;\n\tvar $current_field\t\t= '';\n\tvar $current_namespace\t= false;\n\n\t//var $ERROR = \"\";\n\n\tvar $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright');\n\n\t/**\n\t * PHP5 constructor.\n\t */\n\tfunction __construct( $source ) {\n\n\t\t# if PHP xml isn't compiled in, die\n\t\t#\n\t\tif ( !function_exists('xml_parser_create') )\n\t\t\ttrigger_error( \"Failed to load PHP's XML Extension. http://www.php.net/manual/en/ref.xml.php\" );\n\n\t\t$parser = @xml_parser_create();\n\n\t\tif ( !is_resource($parser) )\n\t\t\ttrigger_error( \"Failed to create an instance of PHP's XML parser. http://www.php.net/manual/en/ref.xml.php\");\n\n\t\t$this->parser = $parser;\n\n\t\t# pass in parser, and a reference to this object\n\t\t# set up handlers\n\t\t#\n\t\txml_set_object( $this->parser, $this );\n\t\txml_set_element_handler($this->parser,\n\t\t\t\t'feed_start_element', 'feed_end_element' );\n\n\t\txml_set_character_data_handler( $this->parser, 'feed_cdata' );\n\n\t\t$status = xml_parse( $this->parser, $source );\n\n\t\tif (! $status ) {\n\t\t\t$errorcode = xml_get_error_code( $this->parser );\n\t\t\tif ( $errorcode != XML_ERROR_NONE ) {\n\t\t\t\t$xml_error = xml_error_string( $errorcode );\n\t\t\t\t$error_line = xml_get_current_line_number($this->parser);\n\t\t\t\t$error_col = xml_get_current_column_number($this->parser);\n\t\t\t\t$errormsg = \"$xml_error at line $error_line, column $error_col\";\n\n\t\t\t\t$this->error( $errormsg );\n\t\t\t}\n\t\t}\n\n\t\txml_parser_free( $this->parser );\n\n\t\t$this->normalize();\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function MagpieRSS( $source ) {\n\t\tself::__construct( $source );\n\t}\n\n\tfunction feed_start_element($p, $element, &$attrs) {\n\t\t$el = $element = strtolower($element);\n\t\t$attrs = array_change_key_case($attrs, CASE_LOWER);\n\n\t\t// check for a namespace, and split if found\n\t\t$ns\t= false;\n\t\tif ( strpos( $element, ':' ) ) {\n\t\t\tlist($ns, $el) = split( ':', $element, 2);\n\t\t}\n\t\tif ( $ns and $ns != 'rdf' ) {\n\t\t\t$this->current_namespace = $ns;\n\t\t}\n\n\t\t# if feed type isn't set, then this is first element of feed\n\t\t# identify feed from root element\n\t\t#\n\t\tif (!isset($this->feed_type) ) {\n\t\t\tif ( $el == 'rdf' ) {\n\t\t\t\t$this->feed_type = RSS;\n\t\t\t\t$this->feed_version = '1.0';\n\t\t\t}\n\t\t\telseif ( $el == 'rss' ) {\n\t\t\t\t$this->feed_type = RSS;\n\t\t\t\t$this->feed_version = $attrs['version'];\n\t\t\t}\n\t\t\telseif ( $el == 'feed' ) {\n\t\t\t\t$this->feed_type = ATOM;\n\t\t\t\t$this->feed_version = $attrs['version'];\n\t\t\t\t$this->inchannel = true;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif ( $el == 'channel' )\n\t\t{\n\t\t\t$this->inchannel = true;\n\t\t}\n\t\telseif ($el == 'item' or $el == 'entry' )\n\t\t{\n\t\t\t$this->initem = true;\n\t\t\tif ( isset($attrs['rdf:about']) ) {\n\t\t\t\t$this->current_item['about'] = $attrs['rdf:about'];\n\t\t\t}\n\t\t}\n\n\t\t// if we're in the default namespace of an RSS feed,\n\t\t//  record textinput or image fields\n\t\telseif (\n\t\t\t$this->feed_type == RSS and\n\t\t\t$this->current_namespace == '' and\n\t\t\t$el == 'textinput' )\n\t\t{\n\t\t\t$this->intextinput = true;\n\t\t}\n\n\t\telseif (\n\t\t\t$this->feed_type == RSS and\n\t\t\t$this->current_namespace == '' and\n\t\t\t$el == 'image' )\n\t\t{\n\t\t\t$this->inimage = true;\n\t\t}\n\n\t\t# handle atom content constructs\n\t\telseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )\n\t\t{\n\t\t\t// avoid clashing w/ RSS mod_content\n\t\t\tif ($el == 'content' ) {\n\t\t\t\t$el = 'atom_content';\n\t\t\t}\n\n\t\t\t$this->incontent = $el;\n\n\t\t}\n\n\t\t// if inside an Atom content construct (e.g. content or summary) field treat tags as text\n\t\telseif ($this->feed_type == ATOM and $this->incontent )\n\t\t{\n\t\t\t// if tags are inlined, then flatten\n\t\t\t$attrs_str = join(' ',\n\t\t\t\t\tarray_map(array('MagpieRSS', 'map_attrs'),\n\t\t\t\t\tarray_keys($attrs),\n\t\t\t\t\tarray_values($attrs) ) );\n\n\t\t\t$this->append_content( \"<$element $attrs_str>\"  );\n\n\t\t\tarray_unshift( $this->stack, $el );\n\t\t}\n\n\t\t// Atom support many links per containging element.\n\t\t// Magpie treats link elements of type rel='alternate'\n\t\t// as being equivalent to RSS's simple link element.\n\t\t//\n\t\telseif ($this->feed_type == ATOM and $el == 'link' )\n\t\t{\n\t\t\tif ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' )\n\t\t\t{\n\t\t\t\t$link_el = 'link';\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$link_el = 'link_' . $attrs['rel'];\n\t\t\t}\n\n\t\t\t$this->append($link_el, $attrs['href']);\n\t\t}\n\t\t// set stack[0] to current element\n\t\telse {\n\t\t\tarray_unshift($this->stack, $el);\n\t\t}\n\t}\n\n\tfunction feed_cdata ($p, $text) {\n\n\t\tif ($this->feed_type == ATOM and $this->incontent)\n\t\t{\n\t\t\t$this->append_content( $text );\n\t\t}\n\t\telse {\n\t\t\t$current_el = join('_', array_reverse($this->stack));\n\t\t\t$this->append($current_el, $text);\n\t\t}\n\t}\n\n\tfunction feed_end_element ($p, $el) {\n\t\t$el = strtolower($el);\n\n\t\tif ( $el == 'item' or $el == 'entry' )\n\t\t{\n\t\t\t$this->items[] = $this->current_item;\n\t\t\t$this->current_item = array();\n\t\t\t$this->initem = false;\n\t\t}\n\t\telseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' )\n\t\t{\n\t\t\t$this->intextinput = false;\n\t\t}\n\t\telseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' )\n\t\t{\n\t\t\t$this->inimage = false;\n\t\t}\n\t\telseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )\n\t\t{\n\t\t\t$this->incontent = false;\n\t\t}\n\t\telseif ($el == 'channel' or $el == 'feed' )\n\t\t{\n\t\t\t$this->inchannel = false;\n\t\t}\n\t\telseif ($this->feed_type == ATOM and $this->incontent  ) {\n\t\t\t// balance tags properly\n\t\t\t// note: This may not actually be necessary\n\t\t\tif ( $this->stack[0] == $el )\n\t\t\t{\n\t\t\t\t$this->append_content(\"</$el>\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$this->append_content(\"<$el />\");\n\t\t\t}\n\n\t\t\tarray_shift( $this->stack );\n\t\t}\n\t\telse {\n\t\t\tarray_shift( $this->stack );\n\t\t}\n\n\t\t$this->current_namespace = false;\n\t}\n\n\tfunction concat (&$str1, $str2=\"\") {\n\t\tif (!isset($str1) ) {\n\t\t\t$str1=\"\";\n\t\t}\n\t\t$str1 .= $str2;\n\t}\n\n\tfunction append_content($text) {\n\t\tif ( $this->initem ) {\n\t\t\t$this->concat( $this->current_item[ $this->incontent ], $text );\n\t\t}\n\t\telseif ( $this->inchannel ) {\n\t\t\t$this->concat( $this->channel[ $this->incontent ], $text );\n\t\t}\n\t}\n\n\t// smart append - field and namespace aware\n\tfunction append($el, $text) {\n\t\tif (!$el) {\n\t\t\treturn;\n\t\t}\n\t\tif ( $this->current_namespace )\n\t\t{\n\t\t\tif ( $this->initem ) {\n\t\t\t\t$this->concat(\n\t\t\t\t\t$this->current_item[ $this->current_namespace ][ $el ], $text);\n\t\t\t}\n\t\t\telseif ($this->inchannel) {\n\t\t\t\t$this->concat(\n\t\t\t\t\t$this->channel[ $this->current_namespace][ $el ], $text );\n\t\t\t}\n\t\t\telseif ($this->intextinput) {\n\t\t\t\t$this->concat(\n\t\t\t\t\t$this->textinput[ $this->current_namespace][ $el ], $text );\n\t\t\t}\n\t\t\telseif ($this->inimage) {\n\t\t\t\t$this->concat(\n\t\t\t\t\t$this->image[ $this->current_namespace ][ $el ], $text );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif ( $this->initem ) {\n\t\t\t\t$this->concat(\n\t\t\t\t\t$this->current_item[ $el ], $text);\n\t\t\t}\n\t\t\telseif ($this->intextinput) {\n\t\t\t\t$this->concat(\n\t\t\t\t\t$this->textinput[ $el ], $text );\n\t\t\t}\n\t\t\telseif ($this->inimage) {\n\t\t\t\t$this->concat(\n\t\t\t\t\t$this->image[ $el ], $text );\n\t\t\t}\n\t\t\telseif ($this->inchannel) {\n\t\t\t\t$this->concat(\n\t\t\t\t\t$this->channel[ $el ], $text );\n\t\t\t}\n\n\t\t}\n\t}\n\n\tfunction normalize () {\n\t\t// if atom populate rss fields\n\t\tif ( $this->is_atom() ) {\n\t\t\t$this->channel['descripton'] = $this->channel['tagline'];\n\t\t\tfor ( $i = 0; $i < count($this->items); $i++) {\n\t\t\t\t$item = $this->items[$i];\n\t\t\t\tif ( isset($item['summary']) )\n\t\t\t\t\t$item['description'] = $item['summary'];\n\t\t\t\tif ( isset($item['atom_content']))\n\t\t\t\t\t$item['content']['encoded'] = $item['atom_content'];\n\n\t\t\t\t$this->items[$i] = $item;\n\t\t\t}\n\t\t}\n\t\telseif ( $this->is_rss() ) {\n\t\t\t$this->channel['tagline'] = $this->channel['description'];\n\t\t\tfor ( $i = 0; $i < count($this->items); $i++) {\n\t\t\t\t$item = $this->items[$i];\n\t\t\t\tif ( isset($item['description']))\n\t\t\t\t\t$item['summary'] = $item['description'];\n\t\t\t\tif ( isset($item['content']['encoded'] ) )\n\t\t\t\t\t$item['atom_content'] = $item['content']['encoded'];\n\n\t\t\t\t$this->items[$i] = $item;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction is_rss () {\n\t\tif ( $this->feed_type == RSS ) {\n\t\t\treturn $this->feed_version;\n\t\t}\n\t\telse {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction is_atom() {\n\t\tif ( $this->feed_type == ATOM ) {\n\t\t\treturn $this->feed_version;\n\t\t}\n\t\telse {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction map_attrs($k, $v) {\n\t\treturn \"$k=\\\"$v\\\"\";\n\t}\n\n\tfunction error( $errormsg, $lvl = E_USER_WARNING ) {\n\t\t// append PHP's error message if track_errors enabled\n\t\tif ( isset($php_errormsg) ) {\n\t\t\t$errormsg .= \" ($php_errormsg)\";\n\t\t}\n\t\tif ( MAGPIE_DEBUG ) {\n\t\t\ttrigger_error( $errormsg, $lvl);\n\t\t} else {\n\t\t\terror_log( $errormsg, 0);\n\t\t}\n\t}\n\n}\n\nif ( !function_exists('fetch_rss') ) :\n/**\n * Build Magpie object based on RSS from URL.\n *\n * @since 1.5.0\n * @package External\n * @subpackage MagpieRSS\n *\n * @param string $url URL to retrieve feed\n * @return bool|MagpieRSS false on failure or MagpieRSS object on success.\n */\nfunction fetch_rss ($url) {\n\t// initialize constants\n\tinit();\n\n\tif ( !isset($url) ) {\n\t\t// error(\"fetch_rss called without a url\");\n\t\treturn false;\n\t}\n\n\t// if cache is disabled\n\tif ( !MAGPIE_CACHE_ON ) {\n\t\t// fetch file, and parse it\n\t\t$resp = _fetch_remote_file( $url );\n\t\tif ( is_success( $resp->status ) ) {\n\t\t\treturn _response_to_rss( $resp );\n\t\t}\n\t\telse {\n\t\t\t// error(\"Failed to fetch $url and cache is off\");\n\t\t\treturn false;\n\t\t}\n\t}\n\t// else cache is ON\n\telse {\n\t\t// Flow\n\t\t// 1. check cache\n\t\t// 2. if there is a hit, make sure it's fresh\n\t\t// 3. if cached obj fails freshness check, fetch remote\n\t\t// 4. if remote fails, return stale object, or error\n\n\t\t$cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE );\n\n\t\tif (MAGPIE_DEBUG and $cache->ERROR) {\n\t\t\tdebug($cache->ERROR, E_USER_WARNING);\n\t\t}\n\n\t\t$cache_status \t = 0;\t\t// response of check_cache\n\t\t$request_headers = array(); // HTTP headers to send with fetch\n\t\t$rss \t\t\t = 0;\t\t// parsed RSS object\n\t\t$errormsg\t\t = 0;\t\t// errors, if any\n\n\t\tif (!$cache->ERROR) {\n\t\t\t// return cache HIT, MISS, or STALE\n\t\t\t$cache_status = $cache->check_cache( $url );\n\t\t}\n\n\t\t// if object cached, and cache is fresh, return cached obj\n\t\tif ( $cache_status == 'HIT' ) {\n\t\t\t$rss = $cache->get( $url );\n\t\t\tif ( isset($rss) and $rss ) {\n\t\t\t\t$rss->from_cache = 1;\n\t\t\t\tif ( MAGPIE_DEBUG > 1) {\n\t\t\t\tdebug(\"MagpieRSS: Cache HIT\", E_USER_NOTICE);\n\t\t\t}\n\t\t\t\treturn $rss;\n\t\t\t}\n\t\t}\n\n\t\t// else attempt a conditional get\n\n\t\t// set up headers\n\t\tif ( $cache_status == 'STALE' ) {\n\t\t\t$rss = $cache->get( $url );\n\t\t\tif ( isset($rss->etag) and $rss->last_modified ) {\n\t\t\t\t$request_headers['If-None-Match'] = $rss->etag;\n\t\t\t\t$request_headers['If-Last-Modified'] = $rss->last_modified;\n\t\t\t}\n\t\t}\n\n\t\t$resp = _fetch_remote_file( $url, $request_headers );\n\n\t\tif (isset($resp) and $resp) {\n\t\t\tif ($resp->status == '304' ) {\n\t\t\t\t// we have the most current copy\n\t\t\t\tif ( MAGPIE_DEBUG > 1) {\n\t\t\t\t\tdebug(\"Got 304 for $url\");\n\t\t\t\t}\n\t\t\t\t// reset cache on 304 (at minutillo insistent prodding)\n\t\t\t\t$cache->set($url, $rss);\n\t\t\t\treturn $rss;\n\t\t\t}\n\t\t\telseif ( is_success( $resp->status ) ) {\n\t\t\t\t$rss = _response_to_rss( $resp );\n\t\t\t\tif ( $rss ) {\n\t\t\t\t\tif (MAGPIE_DEBUG > 1) {\n\t\t\t\t\t\tdebug(\"Fetch successful\");\n\t\t\t\t\t}\n\t\t\t\t\t// add object to cache\n\t\t\t\t\t$cache->set( $url, $rss );\n\t\t\t\t\treturn $rss;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$errormsg = \"Failed to fetch $url. \";\n\t\t\t\tif ( $resp->error ) {\n\t\t\t\t\t# compensate for Snoopy's annoying habbit to tacking\n\t\t\t\t\t# on '\\n'\n\t\t\t\t\t$http_error = substr($resp->error, 0, -2);\n\t\t\t\t\t$errormsg .= \"(HTTP Error: $http_error)\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$errormsg .=  \"(HTTP Response: \" . $resp->response_code .')';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t$errormsg = \"Unable to retrieve RSS file for unknown reasons.\";\n\t\t}\n\n\t\t// else fetch failed\n\n\t\t// attempt to return cached object\n\t\tif ($rss) {\n\t\t\tif ( MAGPIE_DEBUG ) {\n\t\t\t\tdebug(\"Returning STALE object for $url\");\n\t\t\t}\n\t\t\treturn $rss;\n\t\t}\n\n\t\t// else we totally failed\n\t\t// error( $errormsg );\n\n\t\treturn false;\n\n\t} // end if ( !MAGPIE_CACHE_ON ) {\n} // end fetch_rss()\nendif;\n\n/**\n * Retrieve URL headers and content using WP HTTP Request API.\n *\n * @since 1.5.0\n * @package External\n * @subpackage MagpieRSS\n *\n * @param string $url URL to retrieve\n * @param array $headers Optional. Headers to send to the URL.\n * @return Snoopy style response\n */\nfunction _fetch_remote_file($url, $headers = \"\" ) {\n\t$resp = wp_safe_remote_request( $url, array( 'headers' => $headers, 'timeout' => MAGPIE_FETCH_TIME_OUT ) );\n\tif ( is_wp_error($resp) ) {\n\t\t$error = array_shift($resp->errors);\n\n\t\t$resp = new stdClass;\n\t\t$resp->status = 500;\n\t\t$resp->response_code = 500;\n\t\t$resp->error = $error[0] . \"\\n\"; //\\n = Snoopy compatibility\n\t\treturn $resp;\n\t}\n\n\t// Snoopy returns headers unprocessed.\n\t// Also note, WP_HTTP lowercases all keys, Snoopy did not.\n\t$return_headers = array();\n\tforeach ( wp_remote_retrieve_headers( $resp ) as $key => $value ) {\n\t\tif ( !is_array($value) ) {\n\t\t\t$return_headers[] = \"$key: $value\";\n\t\t} else {\n\t\t\tforeach ( $value as $v )\n\t\t\t\t$return_headers[] = \"$key: $v\";\n\t\t}\n\t}\n\n\t$response = new stdClass;\n\t$response->status = wp_remote_retrieve_response_code( $resp );\n\t$response->response_code = wp_remote_retrieve_response_code( $resp );\n\t$response->headers = $return_headers;\n\t$response->results = wp_remote_retrieve_body( $resp );\n\n\treturn $response;\n}\n\n/**\n * Retrieve\n *\n * @since 1.5.0\n * @package External\n * @subpackage MagpieRSS\n *\n * @param array $resp\n * @return MagpieRSS|bool\n */\nfunction _response_to_rss ($resp) {\n\t$rss = new MagpieRSS( $resp->results );\n\n\t// if RSS parsed successfully\n\tif ( $rss && (!isset($rss->ERROR) || !$rss->ERROR) ) {\n\n\t\t// find Etag, and Last-Modified\n\t\tforeach ( (array) $resp->headers as $h) {\n\t\t\t// 2003-03-02 - Nicola Asuni (www.tecnick.com) - fixed bug \"Undefined offset: 1\"\n\t\t\tif (strpos($h, \": \")) {\n\t\t\t\tlist($field, $val) = explode(\": \", $h, 2);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t$field = $h;\n\t\t\t\t$val = \"\";\n\t\t\t}\n\n\t\t\tif ( $field == 'etag' ) {\n\t\t\t\t$rss->etag = $val;\n\t\t\t}\n\n\t\t\tif ( $field == 'last-modified' ) {\n\t\t\t\t$rss->last_modified = $val;\n\t\t\t}\n\t\t}\n\n\t\treturn $rss;\n\t} // else construct error message\n\telse {\n\t\t$errormsg = \"Failed to parse RSS file.\";\n\n\t\tif ($rss) {\n\t\t\t$errormsg .= \" (\" . $rss->ERROR . \")\";\n\t\t}\n\t\t// error($errormsg);\n\n\t\treturn false;\n\t} // end if ($rss and !$rss->error)\n}\n\n/**\n * Set up constants with default values, unless user overrides.\n *\n * @since 1.5.0\n * @package External\n * @subpackage MagpieRSS\n */\nfunction init () {\n\tif ( defined('MAGPIE_INITALIZED') ) {\n\t\treturn;\n\t}\n\telse {\n\t\tdefine('MAGPIE_INITALIZED', 1);\n\t}\n\n\tif ( !defined('MAGPIE_CACHE_ON') ) {\n\t\tdefine('MAGPIE_CACHE_ON', 1);\n\t}\n\n\tif ( !defined('MAGPIE_CACHE_DIR') ) {\n\t\tdefine('MAGPIE_CACHE_DIR', './cache');\n\t}\n\n\tif ( !defined('MAGPIE_CACHE_AGE') ) {\n\t\tdefine('MAGPIE_CACHE_AGE', 60*60); // one hour\n\t}\n\n\tif ( !defined('MAGPIE_CACHE_FRESH_ONLY') ) {\n\t\tdefine('MAGPIE_CACHE_FRESH_ONLY', 0);\n\t}\n\n\t\tif ( !defined('MAGPIE_DEBUG') ) {\n\t\tdefine('MAGPIE_DEBUG', 0);\n\t}\n\n\tif ( !defined('MAGPIE_USER_AGENT') ) {\n\t\t$ua = 'WordPress/' . $GLOBALS['wp_version'];\n\n\t\tif ( MAGPIE_CACHE_ON ) {\n\t\t\t$ua = $ua . ')';\n\t\t}\n\t\telse {\n\t\t\t$ua = $ua . '; No cache)';\n\t\t}\n\n\t\tdefine('MAGPIE_USER_AGENT', $ua);\n\t}\n\n\tif ( !defined('MAGPIE_FETCH_TIME_OUT') ) {\n\t\tdefine('MAGPIE_FETCH_TIME_OUT', 2);\t// 2 second timeout\n\t}\n\n\t// use gzip encoding to fetch rss files if supported?\n\tif ( !defined('MAGPIE_USE_GZIP') ) {\n\t\tdefine('MAGPIE_USE_GZIP', true);\n\t}\n}\n\nfunction is_info ($sc) {\n\treturn $sc >= 100 && $sc < 200;\n}\n\nfunction is_success ($sc) {\n\treturn $sc >= 200 && $sc < 300;\n}\n\nfunction is_redirect ($sc) {\n\treturn $sc >= 300 && $sc < 400;\n}\n\nfunction is_error ($sc) {\n\treturn $sc >= 400 && $sc < 600;\n}\n\nfunction is_client_error ($sc) {\n\treturn $sc >= 400 && $sc < 500;\n}\n\nfunction is_server_error ($sc) {\n\treturn $sc >= 500 && $sc < 600;\n}\n\nclass RSSCache {\n\tvar $BASE_CACHE;\t// where the cache files are stored\n\tvar $MAX_AGE\t= 43200;  \t\t// when are files stale, default twelve hours\n\tvar $ERROR \t\t= '';\t\t\t// accumulate error messages\n\n\t/**\n\t * PHP5 constructor.\n\t */\n\tfunction __construct( $base = '', $age = '' ) {\n\t\t$this->BASE_CACHE = WP_CONTENT_DIR . '/cache';\n\t\tif ( $base ) {\n\t\t\t$this->BASE_CACHE = $base;\n\t\t}\n\t\tif ( $age ) {\n\t\t\t$this->MAX_AGE = $age;\n\t\t}\n\n\t}\n\n\t/**\n\t * PHP4 constructor.\n\t */\n\tpublic function RSSCache( $base = '', $age = '' ) {\n\t\tself::__construct( $base, $age );\n\t}\n\n/*=======================================================================*\\\n\tFunction:\tset\n\tPurpose:\tadd an item to the cache, keyed on url\n\tInput:\t\turl from wich the rss file was fetched\n\tOutput:\t\ttrue on success\n\\*=======================================================================*/\n\tfunction set ($url, $rss) {\n\t\t$cache_option = 'rss_' . $this->file_name( $url );\n\n\t\tset_transient($cache_option, $rss, $this->MAX_AGE);\n\n\t\treturn $cache_option;\n\t}\n\n/*=======================================================================*\\\n\tFunction:\tget\n\tPurpose:\tfetch an item from the cache\n\tInput:\t\turl from wich the rss file was fetched\n\tOutput:\t\tcached object on HIT, false on MISS\n\\*=======================================================================*/\n\tfunction get ($url) {\n\t\t$this->ERROR = \"\";\n\t\t$cache_option = 'rss_' . $this->file_name( $url );\n\n\t\tif ( ! $rss = get_transient( $cache_option ) ) {\n\t\t\t$this->debug(\n\t\t\t\t\"Cache doesn't contain: $url (cache option: $cache_option)\"\n\t\t\t);\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn $rss;\n\t}\n\n/*=======================================================================*\\\n\tFunction:\tcheck_cache\n\tPurpose:\tcheck a url for membership in the cache\n\t\t\t\tand whether the object is older then MAX_AGE (ie. STALE)\n\tInput:\t\turl from wich the rss file was fetched\n\tOutput:\t\tcached object on HIT, false on MISS\n\\*=======================================================================*/\n\tfunction check_cache ( $url ) {\n\t\t$this->ERROR = \"\";\n\t\t$cache_option = 'rss_' . $this->file_name( $url );\n\n\t\tif ( get_transient($cache_option) ) {\n\t\t\t// object exists and is current\n\t\t\t\treturn 'HIT';\n\t\t} else {\n\t\t\t// object does not exist\n\t\t\treturn 'MISS';\n\t\t}\n\t}\n\n/*=======================================================================*\\\n\tFunction:\tserialize\n\\*=======================================================================*/\n\tfunction serialize ( $rss ) {\n\t\treturn serialize( $rss );\n\t}\n\n/*=======================================================================*\\\n\tFunction:\tunserialize\n\\*=======================================================================*/\n\tfunction unserialize ( $data ) {\n\t\treturn unserialize( $data );\n\t}\n\n/*=======================================================================*\\\n\tFunction:\tfile_name\n\tPurpose:\tmap url to location in cache\n\tInput:\t\turl from wich the rss file was fetched\n\tOutput:\t\ta file name\n\\*=======================================================================*/\n\tfunction file_name ($url) {\n\t\treturn md5( $url );\n\t}\n\n/*=======================================================================*\\\n\tFunction:\terror\n\tPurpose:\tregister error\n\\*=======================================================================*/\n\tfunction error ($errormsg, $lvl=E_USER_WARNING) {\n\t\t// append PHP's error message if track_errors enabled\n\t\tif ( isset($php_errormsg) ) {\n\t\t\t$errormsg .= \" ($php_errormsg)\";\n\t\t}\n\t\t$this->ERROR = $errormsg;\n\t\tif ( MAGPIE_DEBUG ) {\n\t\t\ttrigger_error( $errormsg, $lvl);\n\t\t}\n\t\telse {\n\t\t\terror_log( $errormsg, 0);\n\t\t}\n\t}\n\t\t\tfunction debug ($debugmsg, $lvl=E_USER_NOTICE) {\n\t\tif ( MAGPIE_DEBUG ) {\n\t\t\t$this->error(\"MagpieRSS [debug] $debugmsg\", $lvl);\n\t\t}\n\t}\n}\n\nif ( !function_exists('parse_w3cdtf') ) :\nfunction parse_w3cdtf ( $date_str ) {\n\n\t# regex to match wc3dtf\n\t$pat = \"/(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(:(\\d{2}))?(?:([-+])(\\d{2}):?(\\d{2})|(Z))?/\";\n\n\tif ( preg_match( $pat, $date_str, $match ) ) {\n\t\tlist( $year, $month, $day, $hours, $minutes, $seconds) =\n\t\t\tarray( $match[1], $match[2], $match[3], $match[4], $match[5], $match[7]);\n\n\t\t# calc epoch for current date assuming GMT\n\t\t$epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year);\n\n\t\t$offset = 0;\n\t\tif ( $match[11] == 'Z' ) {\n\t\t\t# zulu time, aka GMT\n\t\t}\n\t\telse {\n\t\t\tlist( $tz_mod, $tz_hour, $tz_min ) =\n\t\t\t\tarray( $match[8], $match[9], $match[10]);\n\n\t\t\t# zero out the variables\n\t\t\tif ( ! $tz_hour ) { $tz_hour = 0; }\n\t\t\tif ( ! $tz_min ) { $tz_min = 0; }\n\n\t\t\t$offset_secs = (($tz_hour*60)+$tz_min)*60;\n\n\t\t\t# is timezone ahead of GMT?  then subtract offset\n\t\t\t#\n\t\t\tif ( $tz_mod == '+' ) {\n\t\t\t\t$offset_secs = $offset_secs * -1;\n\t\t\t}\n\n\t\t\t$offset = $offset_secs;\n\t\t}\n\t\t$epoch = $epoch + $offset;\n\t\treturn $epoch;\n\t}\n\telse {\n\t\treturn -1;\n\t}\n}\nendif;\n\nif ( !function_exists('wp_rss') ) :\n/**\n * Display all RSS items in a HTML ordered list.\n *\n * @since 1.5.0\n * @package External\n * @subpackage MagpieRSS\n *\n * @param string $url URL of feed to display. Will not auto sense feed URL.\n * @param int $num_items Optional. Number of items to display, default is all.\n */\nfunction wp_rss( $url, $num_items = -1 ) {\n\tif ( $rss = fetch_rss( $url ) ) {\n\t\techo '<ul>';\n\n\t\tif ( $num_items !== -1 ) {\n\t\t\t$rss->items = array_slice( $rss->items, 0, $num_items );\n\t\t}\n\n\t\tforeach ( (array) $rss->items as $item ) {\n\t\t\tprintf(\n\t\t\t\t'<li><a href=\"%1$s\" title=\"%2$s\">%3$s</a></li>',\n\t\t\t\tesc_url( $item['link'] ),\n\t\t\t\tesc_attr( strip_tags( $item['description'] ) ),\n\t\t\t\tesc_html( $item['title'] )\n\t\t\t);\n\t\t}\n\n\t\techo '</ul>';\n\t} else {\n\t\t_e( 'An error has occurred, which probably means the feed is down. Try again later.' );\n\t}\n}\nendif;\n\nif ( !function_exists('get_rss') ) :\n/**\n * Display RSS items in HTML list items.\n *\n * You have to specify which HTML list you want, either ordered or unordered\n * before using the function. You also have to specify how many items you wish\n * to display. You can't display all of them like you can with wp_rss()\n * function.\n *\n * @since 1.5.0\n * @package External\n * @subpackage MagpieRSS\n *\n * @param string $url URL of feed to display. Will not auto sense feed URL.\n * @param int $num_items Optional. Number of items to display, default is all.\n * @return bool False on failure.\n */\nfunction get_rss ($url, $num_items = 5) { // Like get posts, but for RSS\n\t$rss = fetch_rss($url);\n\tif ( $rss ) {\n\t\t$rss->items = array_slice($rss->items, 0, $num_items);\n\t\tforeach ( (array) $rss->items as $item ) {\n\t\t\techo \"<li>\\n\";\n\t\t\techo \"<a href='$item[link]' title='$item[description]'>\";\n\t\t\techo esc_html($item['title']);\n\t\t\techo \"</a><br />\\n\";\n\t\t\techo \"</li>\\n\";\n\t\t}\n\t} else {\n\t\treturn false;\n\t}\n}\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/script-loader.php",
    "content": "<?php\n/**\n * WordPress scripts and styles default loader.\n *\n * Most of the functionality that existed here was moved to\n * {@link http://backpress.automattic.com/ BackPress}. WordPress themes and\n * plugins will only be concerned about the filters and actions set in this\n * file.\n *\n * Several constants are used to manage the loading, concatenating and compression of scripts and CSS:\n * define('SCRIPT_DEBUG', true); loads the development (non-minified) versions of all scripts and CSS, and disables compression and concatenation,\n * define('CONCATENATE_SCRIPTS', false); disables compression and concatenation of scripts and CSS,\n * define('COMPRESS_SCRIPTS', false); disables compression of scripts,\n * define('COMPRESS_CSS', false); disables compression of CSS,\n * define('ENFORCE_GZIP', true); forces gzip for compression (default is deflate).\n *\n * The globals $concatenate_scripts, $compress_scripts and $compress_css can be set by plugins\n * to temporarily override the above settings. Also a compression test is run once and the result is saved\n * as option 'can_compress_scripts' (0/1). The test will run again if that option is deleted.\n *\n * @package WordPress\n */\n\n/** BackPress: WordPress Dependencies Class */\nrequire( ABSPATH . WPINC . '/class.wp-dependencies.php' );\n\n/** BackPress: WordPress Scripts Class */\nrequire( ABSPATH . WPINC . '/class.wp-scripts.php' );\n\n/** BackPress: WordPress Scripts Functions */\nrequire( ABSPATH . WPINC . '/functions.wp-scripts.php' );\n\n/** BackPress: WordPress Styles Class */\nrequire( ABSPATH . WPINC . '/class.wp-styles.php' );\n\n/** BackPress: WordPress Styles Functions */\nrequire( ABSPATH . WPINC . '/functions.wp-styles.php' );\n\n/**\n * Register all WordPress scripts.\n *\n * Localizes some of them.\n * args order: $scripts->add( 'handle', 'url', 'dependencies', 'query-string', 1 );\n * when last arg === 1 queues the script for the footer\n *\n * @since 2.6.0\n *\n * @param WP_Scripts $scripts WP_Scripts object.\n */\nfunction wp_default_scripts( &$scripts ) {\n\tinclude( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version\n\n\t$develop_src = false !== strpos( $wp_version, '-src' );\n\n\tif ( ! defined( 'SCRIPT_DEBUG' ) ) {\n\t\tdefine( 'SCRIPT_DEBUG', $develop_src );\n\t}\n\n\tif ( ! $guessurl = site_url() ) {\n\t\t$guessed_url = true;\n\t\t$guessurl = wp_guess_url();\n\t}\n\n\t$scripts->base_url = $guessurl;\n\t$scripts->content_url = defined('WP_CONTENT_URL')? WP_CONTENT_URL : '';\n\t$scripts->default_version = get_bloginfo( 'version' );\n\t$scripts->default_dirs = array('/wp-admin/js/', '/wp-includes/js/');\n\n\t$suffix = SCRIPT_DEBUG ? '' : '.min';\n\t$dev_suffix = $develop_src ? '' : '.min';\n\n\t$scripts->add( 'utils', \"/wp-includes/js/utils$suffix.js\" );\n\tdid_action( 'init' ) && $scripts->localize( 'utils', 'userSettings', array(\n\t\t'url' => (string) SITECOOKIEPATH,\n\t\t'uid' => (string) get_current_user_id(),\n\t\t'time' => (string) time(),\n\t\t'secure' => (string) ( 'https' === parse_url( site_url(), PHP_URL_SCHEME ) ),\n\t) );\n\n\t$scripts->add( 'common', \"/wp-admin/js/common$suffix.js\", array('jquery', 'hoverIntent', 'utils'), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'common', 'commonL10n', array(\n\t\t'warnDelete' => __( \"You are about to permanently delete these items.\\n  'Cancel' to stop, 'OK' to delete.\" ),\n\t\t'dismiss'    => __( 'Dismiss this notice.' ),\n\t) );\n\n\t$scripts->add( 'wp-a11y', \"/wp-includes/js/wp-a11y$suffix.js\", array( 'jquery' ), false, 1 );\n\n\t$scripts->add( 'sack', \"/wp-includes/js/tw-sack$suffix.js\", array(), '1.6.1', 1 );\n\n\t$scripts->add( 'quicktags', \"/wp-includes/js/quicktags$suffix.js\", array(), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'quicktags', 'quicktagsL10n', array(\n\t\t'closeAllOpenTags'      => __( 'Close all open tags' ),\n\t\t'closeTags'             => __( 'close tags' ),\n\t\t'enterURL'              => __( 'Enter the URL' ),\n\t\t'enterImageURL'         => __( 'Enter the URL of the image' ),\n\t\t'enterImageDescription' => __( 'Enter a description of the image' ),\n\t\t'textdirection'         => __( 'text direction' ),\n\t\t'toggleTextdirection'   => __( 'Toggle Editor Text Direction' ),\n\t\t'dfw'                   => __( 'Distraction-free writing mode' ),\n\t\t'strong'          => __( 'Bold' ),\n\t\t'strongClose'     => __( 'Close bold tag' ),\n\t\t'em'              => __( 'Italic' ),\n\t\t'emClose'         => __( 'Close italic tag' ),\n\t\t'link'            => __( 'Insert link' ),\n\t\t'blockquote'      => __( 'Blockquote' ),\n\t\t'blockquoteClose' => __( 'Close blockquote tag' ),\n\t\t'del'             => __( 'Deleted text (strikethrough)' ),\n\t\t'delClose'        => __( 'Close deleted text tag' ),\n\t\t'ins'             => __( 'Inserted text' ),\n\t\t'insClose'        => __( 'Close inserted text tag' ),\n\t\t'image'           => __( 'Insert image' ),\n\t\t'ul'              => __( 'Bulleted list' ),\n\t\t'ulClose'         => __( 'Close bulleted list tag' ),\n\t\t'ol'              => __( 'Numbered list' ),\n\t\t'olClose'         => __( 'Close numbered list tag' ),\n\t\t'li'              => __( 'List item' ),\n\t\t'liClose'         => __( 'Close list item tag' ),\n\t\t'code'            => __( 'Code' ),\n\t\t'codeClose'       => __( 'Close code tag' ),\n\t\t'more'            => __( 'Insert Read More tag' ),\n\t) );\n\n\t$scripts->add( 'colorpicker', \"/wp-includes/js/colorpicker$suffix.js\", array('prototype'), '3517m' );\n\n\t$scripts->add( 'editor', \"/wp-admin/js/editor$suffix.js\", array('utils','jquery'), false, 1 );\n\n\t// Back-compat for old DFW. To-do: remove at the end of 2016.\n\t$scripts->add( 'wp-fullscreen-stub', \"/wp-admin/js/wp-fullscreen-stub$suffix.js\", array(), false, 1 );\n\n\t$scripts->add( 'wp-ajax-response', \"/wp-includes/js/wp-ajax-response$suffix.js\", array('jquery'), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'wp-ajax-response', 'wpAjax', array(\n\t\t'noPerm' => __('You do not have permission to do that.'),\n\t\t'broken' => __('An unidentified error has occurred.')\n\t) );\n\n\t$scripts->add( 'wp-pointer', \"/wp-includes/js/wp-pointer$suffix.js\", array( 'jquery-ui-widget', 'jquery-ui-position' ), '20111129a', 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'wp-pointer', 'wpPointerL10n', array(\n\t\t'dismiss' => __('Dismiss'),\n\t) );\n\n\t$scripts->add( 'autosave', \"/wp-includes/js/autosave$suffix.js\", array('heartbeat'), false, 1 );\n\n\t$scripts->add( 'heartbeat', \"/wp-includes/js/heartbeat$suffix.js\", array('jquery'), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'heartbeat', 'heartbeatSettings',\n\t\t/**\n\t\t * Filter the Heartbeat settings.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param array $settings Heartbeat settings array.\n\t\t */\n\t\tapply_filters( 'heartbeat_settings', array() )\n\t);\n\n\t$scripts->add( 'wp-auth-check', \"/wp-includes/js/wp-auth-check$suffix.js\", array('heartbeat'), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'wp-auth-check', 'authcheckL10n', array(\n\t\t'beforeunload' => __('Your session has expired. You can log in again from this page or go to the login page.'),\n\n\t\t/**\n\t\t * Filter the authentication check interval.\n\t\t *\n\t\t * @since 3.6.0\n\t\t *\n\t\t * @param int $interval The interval in which to check a user's authentication.\n\t\t *                      Default 3 minutes in seconds, or 180.\n\t\t */\n\t\t'interval' => apply_filters( 'wp_auth_check_interval', 3 * MINUTE_IN_SECONDS ),\n\t) );\n\n\t$scripts->add( 'wp-lists', \"/wp-includes/js/wp-lists$suffix.js\", array( 'wp-ajax-response', 'jquery-color' ), false, 1 );\n\n\t// WordPress no longer uses or bundles Prototype or script.aculo.us. These are now pulled from an external source.\n\t$scripts->add( 'prototype', 'https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js', array(), '1.7.1');\n\t$scripts->add( 'scriptaculous-root', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js', array('prototype'), '1.9.0');\n\t$scripts->add( 'scriptaculous-builder', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/builder.js', array('scriptaculous-root'), '1.9.0');\n\t$scripts->add( 'scriptaculous-dragdrop', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/dragdrop.js', array('scriptaculous-builder', 'scriptaculous-effects'), '1.9.0');\n\t$scripts->add( 'scriptaculous-effects', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/effects.js', array('scriptaculous-root'), '1.9.0');\n\t$scripts->add( 'scriptaculous-slider', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/slider.js', array('scriptaculous-effects'), '1.9.0');\n\t$scripts->add( 'scriptaculous-sound', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/sound.js', array( 'scriptaculous-root' ), '1.9.0' );\n\t$scripts->add( 'scriptaculous-controls', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/controls.js', array('scriptaculous-root'), '1.9.0');\n\t$scripts->add( 'scriptaculous', false, array('scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls') );\n\n\t// not used in core, replaced by Jcrop.js\n\t$scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop') );\n\n\t// jQuery\n\t$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.11.3' );\n\t$scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.11.3' );\n\t$scripts->add( 'jquery-migrate', \"/wp-includes/js/jquery/jquery-migrate$suffix.js\", array(), '1.2.1' );\n\n\t// full jQuery UI\n\t$scripts->add( 'jquery-ui-core', \"/wp-includes/js/jquery/ui/core$dev_suffix.js\", array('jquery'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-core', \"/wp-includes/js/jquery/ui/effect$dev_suffix.js\", array('jquery'), '1.11.4', 1 );\n\n\t$scripts->add( 'jquery-effects-blind', \"/wp-includes/js/jquery/ui/effect-blind$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-bounce', \"/wp-includes/js/jquery/ui/effect-bounce$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-clip', \"/wp-includes/js/jquery/ui/effect-clip$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-drop', \"/wp-includes/js/jquery/ui/effect-drop$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-explode', \"/wp-includes/js/jquery/ui/effect-explode$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-fade', \"/wp-includes/js/jquery/ui/effect-fade$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-fold', \"/wp-includes/js/jquery/ui/effect-fold$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-highlight', \"/wp-includes/js/jquery/ui/effect-highlight$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-puff', \"/wp-includes/js/jquery/ui/effect-puff$dev_suffix.js\", array('jquery-effects-core', 'jquery-effects-scale'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-pulsate', \"/wp-includes/js/jquery/ui/effect-pulsate$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-scale', \"/wp-includes/js/jquery/ui/effect-scale$dev_suffix.js\", array('jquery-effects-core', 'jquery-effects-size'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-shake', \"/wp-includes/js/jquery/ui/effect-shake$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-size', \"/wp-includes/js/jquery/ui/effect-size$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-slide', \"/wp-includes/js/jquery/ui/effect-slide$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-effects-transfer', \"/wp-includes/js/jquery/ui/effect-transfer$dev_suffix.js\", array('jquery-effects-core'), '1.11.4', 1 );\n\n\t$scripts->add( 'jquery-ui-accordion', \"/wp-includes/js/jquery/ui/accordion$dev_suffix.js\", array('jquery-ui-core', 'jquery-ui-widget'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-autocomplete', \"/wp-includes/js/jquery/ui/autocomplete$dev_suffix.js\", array('jquery-ui-menu'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-button', \"/wp-includes/js/jquery/ui/button$dev_suffix.js\", array('jquery-ui-core', 'jquery-ui-widget'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-datepicker', \"/wp-includes/js/jquery/ui/datepicker$dev_suffix.js\", array('jquery-ui-core'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-dialog', \"/wp-includes/js/jquery/ui/dialog$dev_suffix.js\", array('jquery-ui-resizable', 'jquery-ui-draggable', 'jquery-ui-button', 'jquery-ui-position'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-draggable', \"/wp-includes/js/jquery/ui/draggable$dev_suffix.js\", array('jquery-ui-mouse'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-droppable', \"/wp-includes/js/jquery/ui/droppable$dev_suffix.js\", array('jquery-ui-draggable'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-menu', \"/wp-includes/js/jquery/ui/menu$dev_suffix.js\", array( 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-position' ), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-mouse', \"/wp-includes/js/jquery/ui/mouse$dev_suffix.js\", array( 'jquery-ui-core', 'jquery-ui-widget' ), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-position', \"/wp-includes/js/jquery/ui/position$dev_suffix.js\", array('jquery'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-progressbar', \"/wp-includes/js/jquery/ui/progressbar$dev_suffix.js\", array('jquery-ui-core', 'jquery-ui-widget'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-resizable', \"/wp-includes/js/jquery/ui/resizable$dev_suffix.js\", array('jquery-ui-mouse'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-selectable', \"/wp-includes/js/jquery/ui/selectable$dev_suffix.js\", array('jquery-ui-mouse'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-selectmenu', \"/wp-includes/js/jquery/ui/selectmenu$dev_suffix.js\", array('jquery-ui-menu'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-slider', \"/wp-includes/js/jquery/ui/slider$dev_suffix.js\", array('jquery-ui-mouse'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-sortable', \"/wp-includes/js/jquery/ui/sortable$dev_suffix.js\", array('jquery-ui-mouse'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-spinner', \"/wp-includes/js/jquery/ui/spinner$dev_suffix.js\", array( 'jquery-ui-button' ), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-tabs', \"/wp-includes/js/jquery/ui/tabs$dev_suffix.js\", array('jquery-ui-core', 'jquery-ui-widget'), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-tooltip', \"/wp-includes/js/jquery/ui/tooltip$dev_suffix.js\", array( 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-position' ), '1.11.4', 1 );\n\t$scripts->add( 'jquery-ui-widget', \"/wp-includes/js/jquery/ui/widget$dev_suffix.js\", array('jquery'), '1.11.4', 1 );\n\n\t// deprecated, not used in core, most functionality is included in jQuery 1.3\n\t$scripts->add( 'jquery-form', \"/wp-includes/js/jquery/jquery.form$suffix.js\", array('jquery'), '3.37.0', 1 );\n\n\t// jQuery plugins\n\t$scripts->add( 'jquery-color', \"/wp-includes/js/jquery/jquery.color.min.js\", array('jquery'), '2.1.1', 1 );\n\t$scripts->add( 'suggest', \"/wp-includes/js/jquery/suggest$suffix.js\", array('jquery'), '1.1-20110113', 1 );\n\t$scripts->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array('jquery'), '20m', 1 );\n\t$scripts->add( 'jquery-query', \"/wp-includes/js/jquery/jquery.query.js\", array('jquery'), '2.1.7', 1 );\n\t$scripts->add( 'jquery-serialize-object', \"/wp-includes/js/jquery/jquery.serialize-object.js\", array('jquery'), '0.2', 1 );\n\t$scripts->add( 'jquery-hotkeys', \"/wp-includes/js/jquery/jquery.hotkeys$suffix.js\", array('jquery'), '0.0.2m', 1 );\n\t$scripts->add( 'jquery-table-hotkeys', \"/wp-includes/js/jquery/jquery.table-hotkeys$suffix.js\", array('jquery', 'jquery-hotkeys'), false, 1 );\n\t$scripts->add( 'jquery-touch-punch', \"/wp-includes/js/jquery/jquery.ui.touch-punch.js\", array('jquery-ui-widget', 'jquery-ui-mouse'), '0.2.2', 1 );\n\n\t// Masonry v2 depended on jQuery. v3 does not. The older jquery-masonry handle is a shiv.\n\t// It sets jQuery as a dependency, as the theme may have been implicitly loading it this way.\n\t$scripts->add( 'masonry', \"/wp-includes/js/masonry.min.js\", array(), '3.1.2', 1 );\n\t$scripts->add( 'jquery-masonry', \"/wp-includes/js/jquery/jquery.masonry$dev_suffix.js\", array( 'jquery', 'masonry' ), '3.1.2', 1 );\n\n\t$scripts->add( 'thickbox', \"/wp-includes/js/thickbox/thickbox.js\", array('jquery'), '3.1-20121105', 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'thickbox', 'thickboxL10n', array(\n\t\t\t'next' => __('Next &gt;'),\n\t\t\t'prev' => __('&lt; Prev'),\n\t\t\t'image' => __('Image'),\n\t\t\t'of' => __('of'),\n\t\t\t'close' => __('Close'),\n\t\t\t'noiframes' => __('This feature requires inline frames. You have iframes disabled or your browser does not support them.'),\n\t\t\t'loadingAnimation' => includes_url('js/thickbox/loadingAnimation.gif'),\n\t) );\n\n\t$scripts->add( 'jcrop', \"/wp-includes/js/jcrop/jquery.Jcrop.min.js\", array('jquery'), '0.9.12');\n\n\t$scripts->add( 'swfobject', \"/wp-includes/js/swfobject.js\", array(), '2.2-20120417');\n\n\t// error message for both plupload and swfupload\n\t$uploader_l10n = array(\n\t\t'queue_limit_exceeded' => __('You have attempted to queue too many files.'),\n\t\t'file_exceeds_size_limit' => __('%s exceeds the maximum upload size for this site.'),\n\t\t'zero_byte_file' => __('This file is empty. Please try another.'),\n\t\t'invalid_filetype' => __('This file type is not allowed. Please try another.'),\n\t\t'not_an_image' => __('This file is not an image. Please try another.'),\n\t\t'image_memory_exceeded' => __('Memory exceeded. Please try another smaller file.'),\n\t\t'image_dimensions_exceeded' => __('This is larger than the maximum size. Please try another.'),\n\t\t'default_error' => __('An error occurred in the upload. Please try again later.'),\n\t\t'missing_upload_url' => __('There was a configuration error. Please contact the server administrator.'),\n\t\t'upload_limit_exceeded' => __('You may only upload 1 file.'),\n\t\t'http_error' => __('HTTP error.'),\n\t\t'upload_failed' => __('Upload failed.'),\n\t\t'big_upload_failed' => __('Please try uploading this file with the %1$sbrowser uploader%2$s.'),\n\t\t'big_upload_queued' => __('%s exceeds the maximum upload size for the multi-file uploader when used in your browser.'),\n\t\t'io_error' => __('IO error.'),\n\t\t'security_error' => __('Security error.'),\n\t\t'file_cancelled' => __('File canceled.'),\n\t\t'upload_stopped' => __('Upload stopped.'),\n\t\t'dismiss' => __('Dismiss'),\n\t\t'crunching' => __('Crunching&hellip;'),\n\t\t'deleted' => __('moved to the trash.'),\n\t\t'error_uploading' => __('&#8220;%s&#8221; has failed to upload.')\n\t);\n\n\t$scripts->add( 'plupload', '/wp-includes/js/plupload/plupload.full.min.js', array(), '2.1.8' );\n\t// Back compat handles:\n\tforeach ( array( 'all', 'html5', 'flash', 'silverlight', 'html4' ) as $handle ) {\n\t\t$scripts->add( \"plupload-$handle\", false, array( 'plupload' ), '2.1.1' );\n\t}\n\n\t$scripts->add( 'plupload-handlers', \"/wp-includes/js/plupload/handlers$suffix.js\", array( 'plupload', 'jquery' ) );\n\tdid_action( 'init' ) && $scripts->localize( 'plupload-handlers', 'pluploadL10n', $uploader_l10n );\n\n\t$scripts->add( 'wp-plupload', \"/wp-includes/js/plupload/wp-plupload$suffix.js\", array( 'plupload', 'jquery', 'json2', 'media-models' ), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'wp-plupload', 'pluploadL10n', $uploader_l10n );\n\n\t// keep 'swfupload' for back-compat.\n\t$scripts->add( 'swfupload', '/wp-includes/js/swfupload/swfupload.js', array(), '2201-20110113');\n\t$scripts->add( 'swfupload-swfobject', '/wp-includes/js/swfupload/plugins/swfupload.swfobject.js', array('swfupload', 'swfobject'), '2201a');\n\t$scripts->add( 'swfupload-queue', '/wp-includes/js/swfupload/plugins/swfupload.queue.js', array('swfupload'), '2201');\n\t$scripts->add( 'swfupload-speed', '/wp-includes/js/swfupload/plugins/swfupload.speed.js', array('swfupload'), '2201');\n\t$scripts->add( 'swfupload-all', false, array('swfupload', 'swfupload-swfobject', 'swfupload-queue'), '2201');\n\t$scripts->add( 'swfupload-handlers', \"/wp-includes/js/swfupload/handlers$suffix.js\", array('swfupload-all', 'jquery'), '2201-20110524');\n\tdid_action( 'init' ) && $scripts->localize( 'swfupload-handlers', 'swfuploadL10n', $uploader_l10n );\n\n\t$scripts->add( 'comment-reply', \"/wp-includes/js/comment-reply$suffix.js\", array(), false, 1 );\n\n\t$scripts->add( 'json2', \"/wp-includes/js/json2$suffix.js\", array(), '2015-05-03' );\n\tdid_action( 'init' ) && $scripts->add_data( 'json2', 'conditional', 'lt IE 8' );\n\n\t$scripts->add( 'underscore', \"/wp-includes/js/underscore$dev_suffix.js\", array(), '1.6.0', 1 );\n\t$scripts->add( 'backbone', \"/wp-includes/js/backbone$dev_suffix.js\", array( 'underscore','jquery' ), '1.1.2', 1 );\n\n\t$scripts->add( 'wp-util', \"/wp-includes/js/wp-util$suffix.js\", array('underscore', 'jquery'), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'wp-util', '_wpUtilSettings', array(\n\t\t'ajax' => array(\n\t\t\t'url' => admin_url( 'admin-ajax.php', 'relative' ),\n\t\t),\n\t) );\n\n\t$scripts->add( 'wp-backbone', \"/wp-includes/js/wp-backbone$suffix.js\", array('backbone', 'wp-util'), false, 1 );\n\n\t$scripts->add( 'revisions', \"/wp-admin/js/revisions$suffix.js\", array( 'wp-backbone', 'jquery-ui-slider', 'hoverIntent' ), false, 1 );\n\n\t$scripts->add( 'imgareaselect', \"/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js\", array('jquery'), false, 1 );\n\n\t$scripts->add( 'mediaelement', \"/wp-includes/js/mediaelement/mediaelement-and-player.min.js\", array('jquery'), '2.18.1', 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'mediaelement', 'mejsL10n', array(\n\t\t'language' => get_bloginfo( 'language' ),\n\t\t'strings'  => array(\n\t\t\t'Close'               => __( 'Close' ),\n\t\t\t'Fullscreen'          => __( 'Fullscreen' ),\n\t\t\t'Download File'       => __( 'Download File' ),\n\t\t\t'Download Video'      => __( 'Download Video' ),\n\t\t\t'Play/Pause'          => __( 'Play/Pause' ),\n\t\t\t'Mute Toggle'         => __( 'Mute Toggle' ),\n\t\t\t'None'                => __( 'None' ),\n\t\t\t'Turn off Fullscreen' => __( 'Turn off Fullscreen' ),\n\t\t\t'Go Fullscreen'       => __( 'Go Fullscreen' ),\n\t\t\t'Unmute'              => __( 'Unmute' ),\n\t\t\t'Mute'                => __( 'Mute' ),\n\t\t\t'Captions/Subtitles'  => __( 'Captions/Subtitles' )\n\t\t),\n\t) );\n\n\n\t$scripts->add( 'wp-mediaelement', \"/wp-includes/js/mediaelement/wp-mediaelement.js\", array('mediaelement'), false, 1 );\n\t$mejs_settings = array(\n\t\t'pluginPath' => includes_url( 'js/mediaelement/', 'relative' ),\n\t);\n\tdid_action( 'init' ) && $scripts->localize( 'mediaelement', '_wpmejsSettings',\n\t\t/**\n\t\t * Filter the MediaElement configuration settings.\n\t\t *\n\t\t * @since 4.4.0\n\t\t *\n\t\t * @param array $mejs_settings MediaElement settings array.\n\t\t */\n\t\tapply_filters( 'mejs_settings', $mejs_settings )\n\t);\n\n\t$scripts->add( 'froogaloop',  \"/wp-includes/js/mediaelement/froogaloop.min.js\", array(), '2.0' );\n\t$scripts->add( 'wp-playlist', \"/wp-includes/js/mediaelement/wp-playlist.js\", array( 'wp-util', 'backbone', 'mediaelement' ), false, 1 );\n\n\t$scripts->add( 'zxcvbn-async', \"/wp-includes/js/zxcvbn-async$suffix.js\", array(), '1.0' );\n\tdid_action( 'init' ) && $scripts->localize( 'zxcvbn-async', '_zxcvbnSettings', array(\n\t\t'src' => empty( $guessed_url ) ? includes_url( '/js/zxcvbn.min.js' ) : $scripts->base_url . '/wp-includes/js/zxcvbn.min.js',\n\t) );\n\n\t$scripts->add( 'password-strength-meter', \"/wp-admin/js/password-strength-meter$suffix.js\", array( 'jquery', 'zxcvbn-async' ), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'password-strength-meter', 'pwsL10n', array(\n\t\t'short'    => _x( 'Very weak', 'password strength' ),\n\t\t'bad'      => _x( 'Weak', 'password strength' ),\n\t\t'good'     => _x( 'Medium', 'password strength' ),\n\t\t'strong'   => _x( 'Strong', 'password strength' ),\n\t\t'mismatch' => _x( 'Mismatch', 'password mismatch' ),\n\t) );\n\n\t$scripts->add( 'user-profile', \"/wp-admin/js/user-profile$suffix.js\", array( 'jquery', 'password-strength-meter', 'wp-util' ), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'user-profile', 'userProfileL10n', array(\n\t\t'warn'     => __( 'Your new password has not been saved.' ),\n\t\t'show'     => __( 'Show' ),\n\t\t'hide'     => __( 'Hide' ),\n\t\t'cancel'   => __( 'Cancel' ),\n\t\t'ariaShow' => esc_attr__( 'Show password' ),\n\t\t'ariaHide' => esc_attr__( 'Hide password' ),\n\t) );\n\n\t$scripts->add( 'language-chooser', \"/wp-admin/js/language-chooser$suffix.js\", array( 'jquery' ), false, 1 );\n\n\t$scripts->add( 'user-suggest', \"/wp-admin/js/user-suggest$suffix.js\", array( 'jquery-ui-autocomplete' ), false, 1 );\n\n\t$scripts->add( 'admin-bar', \"/wp-includes/js/admin-bar$suffix.js\", array(), false, 1 );\n\n\t$scripts->add( 'wplink', \"/wp-includes/js/wplink$suffix.js\", array( 'jquery' ), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'wplink', 'wpLinkL10n', array(\n\t\t'title' => __('Insert/edit link'),\n\t\t'update' => __('Update'),\n\t\t'save' => __('Add Link'),\n\t\t'noTitle' => __('(no title)'),\n\t\t'noMatchesFound' => __('No results found.')\n\t) );\n\n\t$scripts->add( 'wpdialogs', \"/wp-includes/js/wpdialog$suffix.js\", array( 'jquery-ui-dialog' ), false, 1 );\n\n\t$scripts->add( 'word-count', \"/wp-admin/js/word-count$suffix.js\", array(), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'word-count', 'wordCountL10n', array(\n\t\t/*\n\t\t * translators: If your word count is based on single characters (e.g. East Asian characters),\n\t\t * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'.\n\t\t * Do not translate into your own language.\n\t\t */\n\t\t'type' => _x( 'words', 'Word count type. Do not translate!' ),\n\t\t'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array()\n\t) );\n\n\t$scripts->add( 'media-upload', \"/wp-admin/js/media-upload$suffix.js\", array( 'thickbox', 'shortcode' ), false, 1 );\n\n\t$scripts->add( 'hoverIntent', \"/wp-includes/js/hoverIntent$suffix.js\", array('jquery'), '1.8.1', 1 );\n\n\t$scripts->add( 'customize-base',     \"/wp-includes/js/customize-base$suffix.js\",     array( 'jquery', 'json2', 'underscore' ), false, 1 );\n\t$scripts->add( 'customize-loader',   \"/wp-includes/js/customize-loader$suffix.js\",   array( 'customize-base' ), false, 1 );\n\t$scripts->add( 'customize-preview',  \"/wp-includes/js/customize-preview$suffix.js\",  array( 'customize-base' ), false, 1 );\n\t$scripts->add( 'customize-models',   \"/wp-includes/js/customize-models.js\", array( 'underscore', 'backbone' ), false, 1 );\n\t$scripts->add( 'customize-views',    \"/wp-includes/js/customize-views.js\",  array( 'jquery', 'underscore', 'imgareaselect', 'customize-models', 'media-editor', 'media-views' ), false, 1 );\n\t$scripts->add( 'customize-controls', \"/wp-admin/js/customize-controls$suffix.js\", array( 'customize-base', 'wp-a11y' ), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'customize-controls', '_wpCustomizeControlsL10n', array(\n\t\t'activate'           => __( 'Save &amp; Activate' ),\n\t\t'save'               => __( 'Save &amp; Publish' ),\n\t\t'saveAlert'          => __( 'The changes you made will be lost if you navigate away from this page.' ),\n\t\t'saved'              => __( 'Saved' ),\n\t\t'cancel'             => __( 'Cancel' ),\n\t\t'close'              => __( 'Close' ),\n\t\t'cheatin'            => __( 'Cheatin&#8217; uh?' ),\n\t\t'notAllowed'         => __( 'You are not allowed to customize the appearance of this site.' ),\n\t\t'previewIframeTitle' => __( 'Site Preview' ),\n\t\t'loginIframeTitle'   => __( 'Session expired' ),\n\t\t'collapseSidebar'    => __( 'Collapse Sidebar' ),\n\t\t'expandSidebar'      => __( 'Expand Sidebar' ),\n\t\t// Used for overriding the file types allowed in plupload.\n\t\t'allowedFiles'       => __( 'Allowed Files' ),\n\t) );\n\n\t$scripts->add( 'customize-widgets', \"/wp-admin/js/customize-widgets$suffix.js\", array( 'jquery', 'jquery-ui-sortable', 'jquery-ui-droppable', 'wp-backbone', 'customize-controls' ), false, 1 );\n\t$scripts->add( 'customize-preview-widgets', \"/wp-includes/js/customize-preview-widgets$suffix.js\", array( 'jquery', 'wp-util', 'customize-preview' ), false, 1 );\n\n\t$scripts->add( 'customize-nav-menus', \"/wp-admin/js/customize-nav-menus$suffix.js\", array( 'jquery', 'wp-backbone', 'customize-controls', 'accordion', 'nav-menu' ), false, 1 );\n\t$scripts->add( 'customize-preview-nav-menus', \"/wp-includes/js/customize-preview-nav-menus$suffix.js\", array( 'jquery', 'wp-util', 'customize-preview' ), false, 1 );\n\n\t$scripts->add( 'accordion', \"/wp-admin/js/accordion$suffix.js\", array( 'jquery' ), false, 1 );\n\n\t$scripts->add( 'shortcode', \"/wp-includes/js/shortcode$suffix.js\", array( 'underscore' ), false, 1 );\n\t$scripts->add( 'media-models', \"/wp-includes/js/media-models$suffix.js\", array( 'wp-backbone' ), false, 1 );\n\tdid_action( 'init' ) && $scripts->localize( 'media-models', '_wpMediaModelsL10n', array(\n\t\t'settings' => array(\n\t\t\t'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),\n\t\t\t'post' => array( 'id' => 0 ),\n\t\t),\n\t) );\n\n\t$scripts->add( 'wp-embed', \"/wp-includes/js/wp-embed$suffix.js\" );\n\n\t// To enqueue media-views or media-editor, call wp_enqueue_media().\n\t// Both rely on numerous settings, styles, and templates to operate correctly.\n\t$scripts->add( 'media-views',  \"/wp-includes/js/media-views$suffix.js\",  array( 'utils', 'media-models', 'wp-plupload', 'jquery-ui-sortable', 'wp-mediaelement' ), false, 1 );\n\t$scripts->add( 'media-editor', \"/wp-includes/js/media-editor$suffix.js\", array( 'shortcode', 'media-views' ), false, 1 );\n\t$scripts->add( 'media-audiovideo', \"/wp-includes/js/media-audiovideo$suffix.js\", array( 'media-editor' ), false, 1 );\n\t$scripts->add( 'mce-view', \"/wp-includes/js/mce-view$suffix.js\", array( 'shortcode', 'jquery', 'media-views', 'media-audiovideo' ), false, 1 );\n\n\tif ( is_admin() ) {\n\t\t$scripts->add( 'admin-tags', \"/wp-admin/js/tags$suffix.js\", array( 'jquery', 'wp-ajax-response' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'admin-tags', 'tagsl10n', array(\n\t\t\t'noPerm' => __('You do not have permission to do that.'),\n\t\t\t'broken' => __('An unidentified error has occurred.')\n\t\t));\n\n\t\t$scripts->add( 'admin-comments', \"/wp-admin/js/edit-comments$suffix.js\", array('wp-lists', 'quicktags', 'jquery-query'), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'admin-comments', 'adminCommentsL10n', array(\n\t\t\t'hotkeys_highlight_first' => isset($_GET['hotkeys_highlight_first']),\n\t\t\t'hotkeys_highlight_last' => isset($_GET['hotkeys_highlight_last']),\n\t\t\t'replyApprove' => __( 'Approve and Reply' ),\n\t\t\t'reply' => __( 'Reply' ),\n\t\t\t'warnQuickEdit' => __( \"Are you sure you want to edit this comment?\\nThe changes you made will be lost.\" ),\n\t\t\t'docTitleComments' => __( 'Comments' ),\n\t\t\t/* translators: %s: comments count */\n\t\t\t'docTitleCommentsCount' => __( 'Comments (%s)' ),\n\t\t) );\n\n\t\t$scripts->add( 'xfn', \"/wp-admin/js/xfn$suffix.js\", array('jquery'), false, 1 );\n\n\t\t$scripts->add( 'postbox', \"/wp-admin/js/postbox$suffix.js\", array('jquery-ui-sortable'), false, 1 );\n\n\t\t$scripts->add( 'tags-box', \"/wp-admin/js/tags-box$suffix.js\", array( 'jquery', 'suggest' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'tags-box', 'tagsBoxL10n', array(\n\t\t\t'tagDelimiter' => _x( ',', 'tag delimiter' ),\n\t\t) );\n\n\t\t$scripts->add( 'post', \"/wp-admin/js/post$suffix.js\", array( 'suggest', 'wp-lists', 'postbox', 'tags-box', 'underscore', 'word-count', 'wp-a11y' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'post', 'postL10n', array(\n\t\t\t'ok' => __('OK'),\n\t\t\t'cancel' => __('Cancel'),\n\t\t\t'publishOn' => __('Publish on:'),\n\t\t\t'publishOnFuture' =>  __('Schedule for:'),\n\t\t\t'publishOnPast' => __('Published on:'),\n\t\t\t/* translators: 1: month, 2: day, 3: year, 4: hour, 5: minute */\n\t\t\t'dateFormat' => __('%1$s %2$s, %3$s @ %4$s:%5$s'),\n\t\t\t'showcomm' => __('Show more comments'),\n\t\t\t'endcomm' => __('No more comments found.'),\n\t\t\t'publish' => __('Publish'),\n\t\t\t'schedule' => __('Schedule'),\n\t\t\t'update' => __('Update'),\n\t\t\t'savePending' => __('Save as Pending'),\n\t\t\t'saveDraft' => __('Save Draft'),\n\t\t\t'private' => __('Private'),\n\t\t\t'public' => __('Public'),\n\t\t\t'publicSticky' => __('Public, Sticky'),\n\t\t\t'password' => __('Password Protected'),\n\t\t\t'privatelyPublished' => __('Privately Published'),\n\t\t\t'published' => __('Published'),\n\t\t\t'saveAlert' => __('The changes you made will be lost if you navigate away from this page.'),\n\t\t\t'savingText' => __('Saving Draft&#8230;'),\n\t\t\t'permalinkSaved' => __( 'Permalink saved' ),\n\t\t) );\n\n\t\t$scripts->add( 'press-this', \"/wp-admin/js/press-this$suffix.js\", array( 'jquery', 'tags-box' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'press-this', 'pressThisL10n', array(\n\t\t\t'newPost' => __( 'Title' ),\n\t\t\t'serverError' => __( 'Connection lost or the server is busy. Please try again later.' ),\n\t\t\t'saveAlert' => __( 'The changes you made will be lost if you navigate away from this page.' ),\n\t\t\t/* translators: %d: nth embed found in a post */\n\t\t\t'suggestedEmbedAlt' => __( 'Suggested embed #%d' ),\n\t\t\t/* translators: %d: nth image found in a post */\n\t\t\t'suggestedImgAlt' => __( 'Suggested image #%d' ),\n\t\t) );\n\n\t\t$scripts->add( 'editor-expand', \"/wp-admin/js/editor-expand$suffix.js\", array( 'jquery' ), false, 1 );\n\n\t\t$scripts->add( 'link', \"/wp-admin/js/link$suffix.js\", array( 'wp-lists', 'postbox' ), false, 1 );\n\n\t\t$scripts->add( 'comment', \"/wp-admin/js/comment$suffix.js\", array( 'jquery', 'postbox' ) );\n\t\t$scripts->add_data( 'comment', 'group', 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'comment', 'commentL10n', array(\n\t\t\t'submittedOn' => __( 'Submitted on:' ),\n\t\t\t/* translators: 1: month, 2: day, 3: year, 4: hour, 5: minute */\n\t\t\t'dateFormat' => __( '%1$s %2$s, %3$s @ %4$s:%5$s' )\n\t\t) );\n\n\t\t$scripts->add( 'admin-gallery', \"/wp-admin/js/gallery$suffix.js\", array( 'jquery-ui-sortable' ) );\n\n\t\t$scripts->add( 'admin-widgets', \"/wp-admin/js/widgets$suffix.js\", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), false, 1 );\n\n\t\t$scripts->add( 'theme', \"/wp-admin/js/theme$suffix.js\", array( 'wp-backbone', 'wp-a11y' ), false, 1 );\n\n\t\t$scripts->add( 'inline-edit-post', \"/wp-admin/js/inline-edit-post$suffix.js\", array( 'jquery', 'suggest' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'inline-edit-post', 'inlineEditL10n', array(\n\t\t\t'error' => __('Error while saving the changes.'),\n\t\t\t'ntdeltitle' => __('Remove From Bulk Edit'),\n\t\t\t'notitle' => __('(no title)'),\n\t\t\t'comma' => trim( _x( ',', 'tag delimiter' ) ),\n\t\t) );\n\n\t\t$scripts->add( 'inline-edit-tax', \"/wp-admin/js/inline-edit-tax$suffix.js\", array( 'jquery', 'wp-a11y' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'inline-edit-tax', 'inlineEditL10n', array(\n\t\t\t'error' => __( 'Error while saving the changes.' ),\n\t\t\t'saved' => __( 'Changes saved.' ),\n\t\t) );\n\n\t\t$scripts->add( 'plugin-install', \"/wp-admin/js/plugin-install$suffix.js\", array( 'jquery', 'thickbox' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'plugin-install', 'plugininstallL10n', array(\n\t\t\t'plugin_information' => __('Plugin Information:'),\n\t\t\t'ays' => __('Are you sure you want to install this plugin?')\n\t\t) );\n\n\t\t$scripts->add( 'updates', \"/wp-admin/js/updates$suffix.js\", array( 'jquery', 'wp-util', 'wp-a11y' ) );\n\t\tdid_action( 'init' ) && $scripts->localize( 'updates', '_wpUpdatesSettings', array(\n\t\t\t'ajax_nonce' => wp_create_nonce( 'updates' ),\n\t\t\t'l10n'       => array(\n\t\t\t\t'updating'          => __( 'Updating...' ), // no ellipsis\n\t\t\t\t'updated'           => __( 'Updated!' ),\n\t\t\t\t'updateFailedShort' => __( 'Update Failed!' ),\n\t\t\t\t/* translators: Error string for a failed update */\n\t\t\t\t'updateFailed'      => __( 'Update Failed: %s' ),\n\t\t\t\t/* translators: Plugin name and version */\n\t\t\t\t'updatingLabel'     => __( 'Updating %s...' ), // no ellipsis\n\t\t\t\t/* translators: Plugin name and version */\n\t\t\t\t'updatedLabel'      => __( '%s updated!' ),\n\t\t\t\t/* translators: Plugin name and version */\n\t\t\t\t'updateFailedLabel' => __( '%s update failed' ),\n\t\t\t\t/* translators: JavaScript accessible string */\n\t\t\t\t'updatingMsg'       => __( 'Updating... please wait.' ), // no ellipsis\n\t\t\t\t/* translators: JavaScript accessible string */\n\t\t\t\t'updatedMsg'        => __( 'Update completed successfully.' ),\n\t\t\t\t/* translators: JavaScript accessible string */\n\t\t\t\t'updateCancel'      => __( 'Update canceled.' ),\n\t\t\t\t'beforeunload'      => __( 'Plugin updates may not complete if you navigate away from this page.' ),\n\t\t\t)\n\t\t) );\n\n\t\t$scripts->add( 'farbtastic', '/wp-admin/js/farbtastic.js', array('jquery'), '1.2' );\n\n\t\t$scripts->add( 'iris', '/wp-admin/js/iris.min.js', array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ), '1.0.7', 1 );\n\t\t$scripts->add( 'wp-color-picker', \"/wp-admin/js/color-picker$suffix.js\", array( 'iris' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'wp-color-picker', 'wpColorPickerL10n', array(\n\t\t\t'clear' => __( 'Clear' ),\n\t\t\t'defaultString' => __( 'Default' ),\n\t\t\t'pick' => __( 'Select Color' ),\n\t\t\t'current' => __( 'Current Color' ),\n\t\t) );\n\n\t\t$scripts->add( 'dashboard', \"/wp-admin/js/dashboard$suffix.js\", array( 'jquery', 'admin-comments', 'postbox' ), false, 1 );\n\n\t\t$scripts->add( 'list-revisions', \"/wp-includes/js/wp-list-revisions$suffix.js\" );\n\n\t\t$scripts->add( 'media-grid', \"/wp-includes/js/media-grid$suffix.js\", array( 'media-editor' ), false, 1 );\n\t\t$scripts->add( 'media', \"/wp-admin/js/media$suffix.js\", array( 'jquery' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'media', 'attachMediaBoxL10n', array(\n\t\t\t'error' => __( 'An error has occurred. Please reload the page and try again.' ),\n\t\t));\n\n\t\t$scripts->add( 'image-edit', \"/wp-admin/js/image-edit$suffix.js\", array('jquery', 'json2', 'imgareaselect'), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'image-edit', 'imageEditL10n', array(\n\t\t\t'error' => __( 'Could not load the preview image. Please reload the page and try again.' )\n\t\t));\n\n\t\t$scripts->add( 'set-post-thumbnail', \"/wp-admin/js/set-post-thumbnail$suffix.js\", array( 'jquery' ), false, 1 );\n\t\tdid_action( 'init' ) && $scripts->localize( 'set-post-thumbnail', 'setPostThumbnailL10n', array(\n\t\t\t'setThumbnail' => __( 'Use as featured image' ),\n\t\t\t'saving' => __( 'Saving...' ), // no ellipsis\n\t\t\t'error' => __( 'Could not set that as the thumbnail image. Try a different attachment.' ),\n\t\t\t'done' => __( 'Done' )\n\t\t) );\n\n\t\t// Navigation Menus\n\t\t$scripts->add( 'nav-menu', \"/wp-admin/js/nav-menu$suffix.js\", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-lists', 'postbox' ) );\n\t\tdid_action( 'init' ) && $scripts->localize( 'nav-menu', 'navMenuL10n', array(\n\t\t\t'noResultsFound' => __( 'No results found.' ),\n\t\t\t'warnDeleteMenu' => __( \"You are about to permanently delete this menu. \\n 'Cancel' to stop, 'OK' to delete.\" ),\n\t\t\t'saveAlert' => __( 'The changes you made will be lost if you navigate away from this page.' ),\n\t\t\t'untitled' => _x( '(no label)', 'missing menu item navigation label' )\n\t\t) );\n\n\t\t$scripts->add( 'custom-header', \"/wp-admin/js/custom-header.js\", array( 'jquery-masonry' ), false, 1 );\n\t\t$scripts->add( 'custom-background', \"/wp-admin/js/custom-background$suffix.js\", array( 'wp-color-picker', 'media-views' ), false, 1 );\n\t\t$scripts->add( 'media-gallery', \"/wp-admin/js/media-gallery$suffix.js\", array('jquery'), false, 1 );\n\n\t\t$scripts->add( 'svg-painter', '/wp-admin/js/svg-painter.js', array( 'jquery' ), false, 1 );\n\t}\n}\n\n/**\n * Assign default styles to $styles object.\n *\n * Nothing is returned, because the $styles parameter is passed by reference.\n * Meaning that whatever object is passed will be updated without having to\n * reassign the variable that was passed back to the same value. This saves\n * memory.\n *\n * Adding default styles is not the only task, it also assigns the base_url\n * property, the default version, and text direction for the object.\n *\n * @since 2.6.0\n *\n * @param WP_Styles $styles\n */\nfunction wp_default_styles( &$styles ) {\n\tinclude( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version\n\n\tif ( ! defined( 'SCRIPT_DEBUG' ) )\n\t\tdefine( 'SCRIPT_DEBUG', false !== strpos( $wp_version, '-src' ) );\n\n\tif ( ! $guessurl = site_url() )\n\t\t$guessurl = wp_guess_url();\n\n\t$styles->base_url = $guessurl;\n\t$styles->content_url = defined('WP_CONTENT_URL')? WP_CONTENT_URL : '';\n\t$styles->default_version = get_bloginfo( 'version' );\n\t$styles->text_direction = function_exists( 'is_rtl' ) && is_rtl() ? 'rtl' : 'ltr';\n\t$styles->default_dirs = array('/wp-admin/', '/wp-includes/css/');\n\n\t$open_sans_font_url = '';\n\n\t/* translators: If there are characters in your language that are not supported\n\t * by Open Sans, translate this to 'off'. Do not translate into your own language.\n\t */\n\tif ( 'off' !== _x( 'on', 'Open Sans font: on or off' ) ) {\n\t\t$subsets = 'latin,latin-ext';\n\n\t\t/* translators: To add an additional Open Sans character subset specific to your language,\n\t\t * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language.\n\t\t */\n\t\t$subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)' );\n\n\t\tif ( 'cyrillic' == $subset ) {\n\t\t\t$subsets .= ',cyrillic,cyrillic-ext';\n\t\t} elseif ( 'greek' == $subset ) {\n\t\t\t$subsets .= ',greek,greek-ext';\n\t\t} elseif ( 'vietnamese' == $subset ) {\n\t\t\t$subsets .= ',vietnamese';\n\t\t}\n\n\t\t// Hotlink Open Sans, for now\n\t\t$open_sans_font_url = \"https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,300,400,600&subset=$subsets\";\n\t}\n\n\t// Register a stylesheet for the selected admin color scheme.\n\t$styles->add( 'colors', true, array( 'wp-admin', 'buttons', 'open-sans', 'dashicons' ) );\n\n\t$suffix = SCRIPT_DEBUG ? '' : '.min';\n\n\t// Admin CSS\n\t$styles->add( 'wp-admin',            \"/wp-admin/css/wp-admin$suffix.css\", array( 'open-sans', 'dashicons' ) );\n\t$styles->add( 'login',               \"/wp-admin/css/login$suffix.css\", array( 'buttons', 'open-sans', 'dashicons' ) );\n\t$styles->add( 'install',             \"/wp-admin/css/install$suffix.css\", array( 'buttons', 'open-sans' ) );\n\t$styles->add( 'wp-color-picker',     \"/wp-admin/css/color-picker$suffix.css\" );\n\t$styles->add( 'customize-controls',  \"/wp-admin/css/customize-controls$suffix.css\", array( 'wp-admin', 'colors', 'ie', 'imgareaselect' ) );\n\t$styles->add( 'customize-widgets',   \"/wp-admin/css/customize-widgets$suffix.css\", array( 'wp-admin', 'colors' ) );\n\t$styles->add( 'customize-nav-menus', \"/wp-admin/css/customize-nav-menus$suffix.css\", array( 'wp-admin', 'colors' ) );\n\t$styles->add( 'press-this',          \"/wp-admin/css/press-this$suffix.css\", array( 'open-sans', 'buttons' ) );\n\n\t$styles->add( 'ie', \"/wp-admin/css/ie$suffix.css\" );\n\t$styles->add_data( 'ie', 'conditional', 'lte IE 7' );\n\n\t// Common dependencies\n\t$styles->add( 'buttons',   \"/wp-includes/css/buttons$suffix.css\" );\n\t$styles->add( 'dashicons', \"/wp-includes/css/dashicons$suffix.css\" );\n\t$styles->add( 'open-sans', $open_sans_font_url );\n\n\t// Includes CSS\n\t$styles->add( 'admin-bar',            \"/wp-includes/css/admin-bar$suffix.css\", array( 'open-sans', 'dashicons' ) );\n\t$styles->add( 'wp-auth-check',        \"/wp-includes/css/wp-auth-check$suffix.css\", array( 'dashicons' ) );\n\t$styles->add( 'editor-buttons',       \"/wp-includes/css/editor$suffix.css\", array( 'dashicons' ) );\n\t$styles->add( 'media-views',          \"/wp-includes/css/media-views$suffix.css\", array( 'buttons', 'dashicons', 'wp-mediaelement' ) );\n\t$styles->add( 'wp-pointer',           \"/wp-includes/css/wp-pointer$suffix.css\", array( 'dashicons' ) );\n\t$styles->add( 'customize-preview',    \"/wp-includes/css/customize-preview$suffix.css\" );\n\t$styles->add( 'wp-embed-template-ie', \"/wp-includes/css/wp-embed-template-ie$suffix.css\" );\n\t$styles->add_data( 'wp-embed-template-ie', 'conditional', 'lte IE 8' );\n\n\t// External libraries and friends\n\t$styles->add( 'imgareaselect',       '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.8' );\n\t$styles->add( 'wp-jquery-ui-dialog', \"/wp-includes/css/jquery-ui-dialog$suffix.css\", array( 'dashicons' ) );\n\t$styles->add( 'mediaelement',        \"/wp-includes/js/mediaelement/mediaelementplayer.min.css\", array(), '2.18.1' );\n\t$styles->add( 'wp-mediaelement',     \"/wp-includes/js/mediaelement/wp-mediaelement.css\", array( 'mediaelement' ) );\n\t$styles->add( 'thickbox',            '/wp-includes/js/thickbox/thickbox.css', array( 'dashicons' ) );\n\n\t// Deprecated CSS\n\t$styles->add( 'media',      \"/wp-admin/css/deprecated-media$suffix.css\" );\n\t$styles->add( 'farbtastic', '/wp-admin/css/farbtastic.css', array(), '1.3u1' );\n\t$styles->add( 'jcrop',      \"/wp-includes/js/jcrop/jquery.Jcrop.min.css\", array(), '0.9.12' );\n\t$styles->add( 'colors-fresh', false, array( 'wp-admin', 'buttons' ) ); // Old handle.\n\n\t// RTL CSS\n\t$rtl_styles = array(\n\t\t// wp-admin\n\t\t'wp-admin', 'install', 'wp-color-picker', 'customize-controls', 'customize-widgets', 'customize-nav-menus', 'ie', 'login', 'press-this',\n\t\t// wp-includes\n\t\t'buttons', 'admin-bar', 'wp-auth-check', 'editor-buttons', 'media-views', 'wp-pointer',\n\t\t'wp-jquery-ui-dialog',\n\t\t// deprecated\n\t\t'media', 'farbtastic',\n\t);\n\n\tforeach ( $rtl_styles as $rtl_style ) {\n\t\t$styles->add_data( $rtl_style, 'rtl', 'replace' );\n\t\tif ( $suffix ) {\n\t\t\t$styles->add_data( $rtl_style, 'suffix', $suffix );\n\t\t}\n\t}\n}\n\n/**\n * Reorder JavaScript scripts array to place prototype before jQuery.\n *\n * @since 2.3.1\n *\n * @param array $js_array JavaScript scripts array\n * @return array Reordered array, if needed.\n */\nfunction wp_prototype_before_jquery( $js_array ) {\n\tif ( false === $prototype = array_search( 'prototype', $js_array, true ) )\n\t\treturn $js_array;\n\n\tif ( false === $jquery = array_search( 'jquery', $js_array, true ) )\n\t\treturn $js_array;\n\n\tif ( $prototype < $jquery )\n\t\treturn $js_array;\n\n\tunset($js_array[$prototype]);\n\n\tarray_splice( $js_array, $jquery, 0, 'prototype' );\n\n\treturn $js_array;\n}\n\n/**\n * Load localized data on print rather than initialization.\n *\n * These localizations require information that may not be loaded even by init.\n *\n * @since 2.5.0\n */\nfunction wp_just_in_time_script_localization() {\n\n\twp_localize_script( 'autosave', 'autosaveL10n', array(\n\t\t'autosaveInterval' => AUTOSAVE_INTERVAL,\n\t\t'blog_id' => get_current_blog_id(),\n\t) );\n\n}\n\n/**\n * Administration Screen CSS for changing the styles.\n *\n * If installing the 'wp-admin/' directory will be replaced with './'.\n *\n * The $_wp_admin_css_colors global manages the Administration Screens CSS\n * stylesheet that is loaded. The option that is set is 'admin_color' and is the\n * color and key for the array. The value for the color key is an object with\n * a 'url' parameter that has the URL path to the CSS file.\n *\n * The query from $src parameter will be appended to the URL that is given from\n * the $_wp_admin_css_colors array value URL.\n *\n * @since 2.6.0\n * @global array $_wp_admin_css_colors\n *\n * @param string $src    Source URL.\n * @param string $handle Either 'colors' or 'colors-rtl'.\n * @return string|false URL path to CSS stylesheet for Administration Screens.\n */\nfunction wp_style_loader_src( $src, $handle ) {\n\tglobal $_wp_admin_css_colors;\n\n\tif ( wp_installing() )\n\t\treturn preg_replace( '#^wp-admin/#', './', $src );\n\n\tif ( 'colors' == $handle ) {\n\t\t$color = get_user_option('admin_color');\n\n\t\tif ( empty($color) || !isset($_wp_admin_css_colors[$color]) )\n\t\t\t$color = 'fresh';\n\n\t\t$color = $_wp_admin_css_colors[$color];\n\t\t$parsed = parse_url( $src );\n\t\t$url = $color->url;\n\n\t\tif ( ! $url ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( isset($parsed['query']) && $parsed['query'] ) {\n\t\t\twp_parse_str( $parsed['query'], $qv );\n\t\t\t$url = add_query_arg( $qv, $url );\n\t\t}\n\n\t\treturn $url;\n\t}\n\n\treturn $src;\n}\n\n/**\n * Prints the script queue in the HTML head on admin pages.\n *\n * Postpones the scripts that were queued for the footer.\n * print_footer_scripts() is called in the footer to print these scripts.\n *\n * @since 2.8.0\n *\n * @see wp_print_scripts()\n *\n * @global bool $concatenate_scripts\n *\n * @return array\n */\nfunction print_head_scripts() {\n\tglobal $concatenate_scripts;\n\n\tif ( ! did_action('wp_print_scripts') ) {\n\t\t/** This action is documented in wp-includes/functions.wp-scripts.php */\n\t\tdo_action( 'wp_print_scripts' );\n\t}\n\n\t$wp_scripts = wp_scripts();\n\n\tscript_concat_settings();\n\t$wp_scripts->do_concat = $concatenate_scripts;\n\t$wp_scripts->do_head_items();\n\n\t/**\n\t * Filter whether to print the head scripts.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param bool $print Whether to print the head scripts. Default true.\n\t */\n\tif ( apply_filters( 'print_head_scripts', true ) ) {\n\t\t_print_scripts();\n\t}\n\n\t$wp_scripts->reset();\n\treturn $wp_scripts->done;\n}\n\n/**\n * Prints the scripts that were queued for the footer or too late for the HTML head.\n *\n * @since 2.8.0\n *\n * @global WP_Scripts $wp_scripts\n * @global bool       $concatenate_scripts\n *\n * @return array\n */\nfunction print_footer_scripts() {\n\tglobal $wp_scripts, $concatenate_scripts;\n\n\tif ( ! ( $wp_scripts instanceof WP_Scripts ) ) {\n\t\treturn array(); // No need to run if not instantiated.\n\t}\n\tscript_concat_settings();\n\t$wp_scripts->do_concat = $concatenate_scripts;\n\t$wp_scripts->do_footer_items();\n\n\t/**\n\t * Filter whether to print the footer scripts.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param bool $print Whether to print the footer scripts. Default true.\n\t */\n\tif ( apply_filters( 'print_footer_scripts', true ) ) {\n\t\t_print_scripts();\n\t}\n\n\t$wp_scripts->reset();\n\treturn $wp_scripts->done;\n}\n\n/**\n * Print scripts (internal use only)\n *\n * @ignore\n *\n * @global WP_Scripts $wp_scripts\n * @global bool       $compress_scripts\n */\nfunction _print_scripts() {\n\tglobal $wp_scripts, $compress_scripts;\n\n\t$zip = $compress_scripts ? 1 : 0;\n\tif ( $zip && defined('ENFORCE_GZIP') && ENFORCE_GZIP )\n\t\t$zip = 'gzip';\n\n\tif ( $concat = trim( $wp_scripts->concat, ', ' ) ) {\n\n\t\tif ( !empty($wp_scripts->print_code) ) {\n\t\t\techo \"\\n<script type='text/javascript'>\\n\";\n\t\t\techo \"/* <![CDATA[ */\\n\"; // not needed in HTML 5\n\t\t\techo $wp_scripts->print_code;\n\t\t\techo \"/* ]]> */\\n\";\n\t\t\techo \"</script>\\n\";\n\t\t}\n\n\t\t$concat = str_split( $concat, 128 );\n\t\t$concat = 'load%5B%5D=' . implode( '&load%5B%5D=', $concat );\n\n\t\t$src = $wp_scripts->base_url . \"/wp-admin/load-scripts.php?c={$zip}&\" . $concat . '&ver=' . $wp_scripts->default_version;\n\t\techo \"<script type='text/javascript' src='\" . esc_attr($src) . \"'></script>\\n\";\n\t}\n\n\tif ( !empty($wp_scripts->print_html) )\n\t\techo $wp_scripts->print_html;\n}\n\n/**\n * Prints the script queue in the HTML head on the front end.\n *\n * Postpones the scripts that were queued for the footer.\n * wp_print_footer_scripts() is called in the footer to print these scripts.\n *\n * @since 2.8.0\n *\n * @global WP_Scripts $wp_scripts\n *\n * @return array\n */\nfunction wp_print_head_scripts() {\n\tif ( ! did_action('wp_print_scripts') ) {\n\t\t/** This action is documented in wp-includes/functions.wp-scripts.php */\n\t\tdo_action( 'wp_print_scripts' );\n\t}\n\n\tglobal $wp_scripts;\n\n\tif ( ! ( $wp_scripts instanceof WP_Scripts ) ) {\n\t\treturn array(); // no need to run if nothing is queued\n\t}\n\treturn print_head_scripts();\n}\n\n/**\n * Private, for use in *_footer_scripts hooks\n *\n * @since 3.3.0\n */\nfunction _wp_footer_scripts() {\n\tprint_late_styles();\n\tprint_footer_scripts();\n}\n\n/**\n * Hooks to print the scripts and styles in the footer.\n *\n * @since 2.8.0\n */\nfunction wp_print_footer_scripts() {\n\t/**\n\t * Fires when footer scripts are printed.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( 'wp_print_footer_scripts' );\n}\n\n/**\n * Wrapper for do_action('wp_enqueue_scripts')\n *\n * Allows plugins to queue scripts for the front end using wp_enqueue_script().\n * Runs first in wp_head() where all is_home(), is_page(), etc. functions are available.\n *\n * @since 2.8.0\n */\nfunction wp_enqueue_scripts() {\n\t/**\n\t * Fires when scripts and styles are enqueued.\n\t *\n\t * @since 2.8.0\n\t */\n\tdo_action( 'wp_enqueue_scripts' );\n}\n\n/**\n * Prints the styles queue in the HTML head on admin pages.\n *\n * @since 2.8.0\n *\n * @global bool $concatenate_scripts\n *\n * @return array\n */\nfunction print_admin_styles() {\n\tglobal $concatenate_scripts;\n\n\t$wp_styles = wp_styles();\n\n\tscript_concat_settings();\n\t$wp_styles->do_concat = $concatenate_scripts;\n\t$wp_styles->do_items(false);\n\n\t/**\n\t * Filter whether to print the admin styles.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param bool $print Whether to print the admin styles. Default true.\n\t */\n\tif ( apply_filters( 'print_admin_styles', true ) ) {\n\t\t_print_styles();\n\t}\n\n\t$wp_styles->reset();\n\treturn $wp_styles->done;\n}\n\n/**\n * Prints the styles that were queued too late for the HTML head.\n *\n * @since 3.3.0\n *\n * @global WP_Styles $wp_styles\n * @global bool      $concatenate_scripts\n *\n * @return array|void\n */\nfunction print_late_styles() {\n\tglobal $wp_styles, $concatenate_scripts;\n\n\tif ( ! ( $wp_styles instanceof WP_Styles ) ) {\n\t\treturn;\n\t}\n\n\t$wp_styles->do_concat = $concatenate_scripts;\n\t$wp_styles->do_footer_items();\n\n\t/**\n\t * Filter whether to print the styles queued too late for the HTML head.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param bool $print Whether to print the 'late' styles. Default true.\n\t */\n\tif ( apply_filters( 'print_late_styles', true ) ) {\n\t\t_print_styles();\n\t}\n\n\t$wp_styles->reset();\n\treturn $wp_styles->done;\n}\n\n/**\n * Print styles (internal use only)\n *\n * @ignore\n *\n * @global bool $compress_css\n */\nfunction _print_styles() {\n\tglobal $compress_css;\n\n\t$wp_styles = wp_styles();\n\n\t$zip = $compress_css ? 1 : 0;\n\tif ( $zip && defined('ENFORCE_GZIP') && ENFORCE_GZIP )\n\t\t$zip = 'gzip';\n\n\tif ( !empty($wp_styles->concat) ) {\n\t\t$dir = $wp_styles->text_direction;\n\t\t$ver = $wp_styles->default_version;\n\t\t$href = $wp_styles->base_url . \"/wp-admin/load-styles.php?c={$zip}&dir={$dir}&load=\" . trim($wp_styles->concat, ', ') . '&ver=' . $ver;\n\t\techo \"<link rel='stylesheet' href='\" . esc_attr($href) . \"' type='text/css' media='all' />\\n\";\n\n\t\tif ( !empty($wp_styles->print_code) ) {\n\t\t\techo \"<style type='text/css'>\\n\";\n\t\t\techo $wp_styles->print_code;\n\t\t\techo \"\\n</style>\\n\";\n\t\t}\n\t}\n\n\tif ( !empty($wp_styles->print_html) )\n\t\techo $wp_styles->print_html;\n}\n\n/**\n * Determine the concatenation and compression settings for scripts and styles.\n *\n * @since 2.8.0\n *\n * @global bool $concatenate_scripts\n * @global bool $compress_scripts\n * @global bool $compress_css\n */\nfunction script_concat_settings() {\n\tglobal $concatenate_scripts, $compress_scripts, $compress_css;\n\n\t$compressed_output = ( ini_get('zlib.output_compression') || 'ob_gzhandler' == ini_get('output_handler') );\n\n\tif ( ! isset($concatenate_scripts) ) {\n\t\t$concatenate_scripts = defined('CONCATENATE_SCRIPTS') ? CONCATENATE_SCRIPTS : true;\n\t\tif ( ! is_admin() || ( defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ) )\n\t\t\t$concatenate_scripts = false;\n\t}\n\n\tif ( ! isset($compress_scripts) ) {\n\t\t$compress_scripts = defined('COMPRESS_SCRIPTS') ? COMPRESS_SCRIPTS : true;\n\t\tif ( $compress_scripts && ( ! get_site_option('can_compress_scripts') || $compressed_output ) )\n\t\t\t$compress_scripts = false;\n\t}\n\n\tif ( ! isset($compress_css) ) {\n\t\t$compress_css = defined('COMPRESS_CSS') ? COMPRESS_CSS : true;\n\t\tif ( $compress_css && ( ! get_site_option('can_compress_scripts') || $compressed_output ) )\n\t\t\t$compress_css = false;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/session.php",
    "content": "<?php\n/**\n * Abstract class for managing user session tokens.\n *\n * @since 4.0.0\n */\nabstract class WP_Session_Tokens {\n\n\t/**\n\t * User ID.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t * @var int User ID.\n\t */\n\tprotected $user_id;\n\n\t/**\n\t * Protected constructor.\n\t *\n\t * @since 4.0.0\n\t *\n\t * @param int $user_id User whose session to manage.\n\t */\n\tprotected function __construct( $user_id ) {\n\t\t$this->user_id = $user_id;\n\t}\n\n\t/**\n\t * Get a session token manager instance for a user.\n\t *\n\t * This method contains a filter that allows a plugin to swap out\n\t * the session manager for a subclass of WP_Session_Tokens.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @static\n\t *\n\t * @param int $user_id User whose session to manage.\n\t */\n\tfinal public static function get_instance( $user_id ) {\n\t\t/**\n\t\t * Filter the session token manager used.\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @param string $session Name of class to use as the manager.\n\t\t *                        Default 'WP_User_Meta_Session_Tokens'.\n\t\t */\n\t\t$manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' );\n\t\treturn new $manager( $user_id );\n\t}\n\n\t/**\n\t * Hashes a session token for storage.\n\t *\n\t * @since 4.0.0\n\t * @access private\n\t *\n\t * @param string $token Session token to hash.\n\t * @return string A hash of the session token (a verifier).\n\t */\n\tfinal private function hash_token( $token ) {\n\t\t// If ext/hash is not present, use sha1() instead.\n\t\tif ( function_exists( 'hash' ) ) {\n\t\t\treturn hash( 'sha256', $token );\n\t\t} else {\n\t\t\treturn sha1( $token );\n\t\t}\n\t}\n\n\t/**\n\t * Get a user's session.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $token Session token\n\t * @return array User session\n\t */\n\tfinal public function get( $token ) {\n\t\t$verifier = $this->hash_token( $token );\n\t\treturn $this->get_session( $verifier );\n\t}\n\n\t/**\n\t * Validate a user's session token as authentic.\n\t *\n\t * Checks that the given token is present and hasn't expired.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $token Token to verify.\n\t * @return bool Whether the token is valid for the user.\n\t */\n\tfinal public function verify( $token ) {\n\t\t$verifier = $this->hash_token( $token );\n\t\treturn (bool) $this->get_session( $verifier );\n\t}\n\n\t/**\n\t * Generate a session token and attach session information to it.\n\t *\n\t * A session token is a long, random string. It is used in a cookie\n\t * link that cookie to an expiration time and to ensure the cookie\n\t * becomes invalidated upon logout.\n\t *\n\t * This function generates a token and stores it with the associated\n\t * expiration time (and potentially other session information via the\n\t * `attach_session_information` filter).\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param int $expiration Session expiration timestamp.\n\t * @return string Session token.\n\t */\n\tfinal public function create( $expiration ) {\n\t\t/**\n\t\t * Filter the information attached to the newly created session.\n\t\t *\n\t\t * Could be used in the future to attach information such as\n\t\t * IP address or user agent to a session.\n\t\t *\n\t\t * @since 4.0.0\n\t\t *\n\t\t * @param array $session Array of extra data.\n\t\t * @param int   $user_id User ID.\n\t\t */\n\t\t$session = apply_filters( 'attach_session_information', array(), $this->user_id );\n\t\t$session['expiration'] = $expiration;\n\n\t\t// IP address.\n\t\tif ( !empty( $_SERVER['REMOTE_ADDR'] ) ) {\n\t\t\t$session['ip'] = $_SERVER['REMOTE_ADDR'];\n\t\t}\n\n\t\t// User-agent.\n\t\tif ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {\n\t\t\t$session['ua'] = wp_unslash( $_SERVER['HTTP_USER_AGENT'] );\n\t\t}\n\n\t\t// Timestamp\n\t\t$session['login'] = time();\n\n\t\t$token = wp_generate_password( 43, false, false );\n\n\t\t$this->update( $token, $session );\n\n\t\treturn $token;\n\t}\n\n\t/**\n\t * Update a session token.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $token Session token to update.\n\t * @param array  $session Session information.\n\t */\n\tfinal public function update( $token, $session ) {\n\t\t$verifier = $this->hash_token( $token );\n\t\t$this->update_session( $verifier, $session );\n\t}\n\n\t/**\n\t * Destroy a session token.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $token Session token to destroy.\n\t */\n\tfinal public function destroy( $token ) {\n\t\t$verifier = $this->hash_token( $token );\n\t\t$this->update_session( $verifier, null );\n\t}\n\n\t/**\n\t * Destroy all session tokens for this user,\n\t * except a single token, presumably the one in use.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $token_to_keep Session token to keep.\n\t */\n\tfinal public function destroy_others( $token_to_keep ) {\n\t\t$verifier = $this->hash_token( $token_to_keep );\n\t\t$session = $this->get_session( $verifier );\n\t\tif ( $session ) {\n\t\t\t$this->destroy_other_sessions( $verifier );\n\t\t} else {\n\t\t\t$this->destroy_all_sessions();\n\t\t}\n\t}\n\n\t/**\n\t * Determine whether a session token is still valid,\n\t * based on expiration.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param array $session Session to check.\n\t * @return bool Whether session is valid.\n\t */\n\tfinal protected function is_still_valid( $session ) {\n\t\treturn $session['expiration'] >= time();\n\t}\n\n\t/**\n\t * Destroy all session tokens for a user.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t */\n\tfinal public function destroy_all() {\n\t\t$this->destroy_all_sessions();\n\t}\n\n\t/**\n\t * Destroy all session tokens for all users.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @static\n\t */\n\tfinal public static function destroy_all_for_all_users() {\n\t\t$manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' );\n\t\tcall_user_func( array( $manager, 'drop_sessions' ) );\n\t}\n\n\t/**\n\t * Retrieve all sessions of a user.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @return array Sessions of a user.\n\t */\n\tfinal public function get_all() {\n\t\treturn array_values( $this->get_sessions() );\n\t}\n\n\t/**\n\t * This method should retrieve all sessions of a user, keyed by verifier.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @return array Sessions of a user, keyed by verifier.\n\t */\n\tabstract protected function get_sessions();\n\n\t/**\n\t * This method should look up a session by its verifier (token hash).\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param string $verifier Verifier of the session to retrieve.\n\t * @return array|null The session, or null if it does not exist.\n\t */\n\tabstract protected function get_session( $verifier );\n\n\t/**\n\t * This method should update a session by its verifier.\n\t *\n\t * Omitting the second argument should destroy the session.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param string $verifier Verifier of the session to update.\n\t */\n\tabstract protected function update_session( $verifier, $session = null );\n\n\t/**\n\t * This method should destroy all session tokens for this user,\n\t * except a single session passed.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param string $verifier Verifier of the session to keep.\n\t */\n\tabstract protected function destroy_other_sessions( $verifier );\n\n\t/**\n\t * This method should destroy all sessions for a user.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t */\n\tabstract protected function destroy_all_sessions();\n\n\t/**\n\t * This static method should destroy all session tokens for all users.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @static\n\t */\n\tpublic static function drop_sessions() {}\n}\n\n/**\n * Meta-based user sessions token manager.\n *\n * @since 4.0.0\n */\nclass WP_User_Meta_Session_Tokens extends WP_Session_Tokens {\n\n\t/**\n\t * Get all sessions of a user.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @return array Sessions of a user.\n\t */\n\tprotected function get_sessions() {\n\t\t$sessions = get_user_meta( $this->user_id, 'session_tokens', true );\n\n\t\tif ( ! is_array( $sessions ) ) {\n\t\t\treturn array();\n\t\t}\n\n\t\t$sessions = array_map( array( $this, 'prepare_session' ), $sessions );\n\t\treturn array_filter( $sessions, array( $this, 'is_still_valid' ) );\n\t}\n\n\t/**\n\t * Converts an expiration to an array of session information.\n\t *\n\t * @param mixed $session Session or expiration.\n\t * @return array Session.\n\t */\n\tprotected function prepare_session( $session ) {\n\t\tif ( is_int( $session ) ) {\n\t\t\treturn array( 'expiration' => $session );\n\t\t}\n\n\t\treturn $session;\n\t}\n\n\t/**\n\t * Retrieve a session by its verifier (token hash).\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param string $verifier Verifier of the session to retrieve.\n\t * @return array|null The session, or null if it does not exist\n\t */\n\tprotected function get_session( $verifier ) {\n\t\t$sessions = $this->get_sessions();\n\n\t\tif ( isset( $sessions[ $verifier ] ) ) {\n\t\t\treturn $sessions[ $verifier ];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Update a session by its verifier.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param string $verifier Verifier of the session to update.\n\t * @param array  $session  Optional. Session. Omitting this argument destroys the session.\n\t */\n\tprotected function update_session( $verifier, $session = null ) {\n\t\t$sessions = $this->get_sessions();\n\n\t\tif ( $session ) {\n\t\t\t$sessions[ $verifier ] = $session;\n\t\t} else {\n\t\t\tunset( $sessions[ $verifier ] );\n\t\t}\n\n\t\t$this->update_sessions( $sessions );\n\t}\n\n\t/**\n\t * Update a user's sessions in the usermeta table.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param array $sessions Sessions.\n\t */\n\tprotected function update_sessions( $sessions ) {\n\t\tif ( $sessions ) {\n\t\t\tupdate_user_meta( $this->user_id, 'session_tokens', $sessions );\n\t\t} else {\n\t\t\tdelete_user_meta( $this->user_id, 'session_tokens' );\n\t\t}\n\t}\n\n\t/**\n\t * Destroy all session tokens for a user, except a single session passed.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t *\n\t * @param string $verifier Verifier of the session to keep.\n\t */\n\tprotected function destroy_other_sessions( $verifier ) {\n\t\t$session = $this->get_session( $verifier );\n\t\t$this->update_sessions( array( $verifier => $session ) );\n\t}\n\n\t/**\n\t * Destroy all session tokens for a user.\n\t *\n\t * @since 4.0.0\n\t * @access protected\n\t */\n\tprotected function destroy_all_sessions() {\n\t\t$this->update_sessions( array() );\n\t}\n\n\t/**\n\t * Destroy all session tokens for all users.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t * @static\n\t */\n\tpublic static function drop_sessions() {\n\t\tdelete_metadata( 'user', 0, 'session_tokens', false, true );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/shortcodes.php",
    "content": "<?php\n/**\n * WordPress API for creating bbcode like tags or what WordPress calls\n * \"shortcodes.\" The tag and attribute parsing or regular expression code is\n * based on the Textpattern tag parser.\n *\n * A few examples are below:\n *\n * [shortcode /]\n * [shortcode foo=\"bar\" baz=\"bing\" /]\n * [shortcode foo=\"bar\"]content[/shortcode]\n *\n * Shortcode tags support attributes and enclosed content, but does not entirely\n * support inline shortcodes in other shortcodes. You will have to call the\n * shortcode parser in your function to account for that.\n *\n * {@internal\n * Please be aware that the above note was made during the beta of WordPress 2.6\n * and in the future may not be accurate. Please update the note when it is no\n * longer the case.}}\n *\n * To apply shortcode tags to content:\n *\n *     $out = do_shortcode( $content );\n *\n * @link https://codex.wordpress.org/Shortcode_API\n *\n * @package WordPress\n * @subpackage Shortcodes\n * @since 2.5.0\n */\n\n/**\n * Container for storing shortcode tags and their hook to call for the shortcode\n *\n * @since 2.5.0\n *\n * @name $shortcode_tags\n * @var array\n * @global array $shortcode_tags\n */\n$shortcode_tags = array();\n\n/**\n * Add hook for shortcode tag.\n *\n * There can only be one hook for each shortcode. Which means that if another\n * plugin has a similar shortcode, it will override yours or yours will override\n * theirs depending on which order the plugins are included and/or ran.\n *\n * Simplest example of a shortcode tag using the API:\n *\n *     // [footag foo=\"bar\"]\n *     function footag_func( $atts ) {\n *         return \"foo = {\n *             $atts[foo]\n *         }\";\n *     }\n *     add_shortcode( 'footag', 'footag_func' );\n *\n * Example with nice attribute defaults:\n *\n *     // [bartag foo=\"bar\"]\n *     function bartag_func( $atts ) {\n *         $args = shortcode_atts( array(\n *             'foo' => 'no foo',\n *             'baz' => 'default baz',\n *         ), $atts );\n *\n *         return \"foo = {$args['foo']}\";\n *     }\n *     add_shortcode( 'bartag', 'bartag_func' );\n *\n * Example with enclosed content:\n *\n *     // [baztag]content[/baztag]\n *     function baztag_func( $atts, $content = '' ) {\n *         return \"content = $content\";\n *     }\n *     add_shortcode( 'baztag', 'baztag_func' );\n *\n * @since 2.5.0\n *\n * @global array $shortcode_tags\n *\n * @param string   $tag  Shortcode tag to be searched in post content.\n * @param callable $func Hook to run when shortcode is found.\n */\nfunction add_shortcode($tag, $func) {\n\tglobal $shortcode_tags;\n\n\tif ( '' == trim( $tag ) ) {\n\t\t$message = __( 'Invalid shortcode name: Empty name given.' );\n\t\t_doing_it_wrong( __FUNCTION__, $message, '4.4.0' );\n\t\treturn;\n\t}\n\n\tif ( 0 !== preg_match( '@[<>&/\\[\\]\\x00-\\x20=]@', $tag ) ) {\n\t\t/* translators: %s: shortcode name */\n\t\t$message = sprintf( __( 'Invalid shortcode name: %s. Do not use spaces or reserved characters: & / < > [ ]' ), $tag );\n\t\t_doing_it_wrong( __FUNCTION__, $message, '4.4.0' );\n\t\treturn;\n\t}\n\n\t$shortcode_tags[ $tag ] = $func;\n}\n\n/**\n * Removes hook for shortcode.\n *\n * @since 2.5.0\n *\n * @global array $shortcode_tags\n *\n * @param string $tag Shortcode tag to remove hook for.\n */\nfunction remove_shortcode($tag) {\n\tglobal $shortcode_tags;\n\n\tunset($shortcode_tags[$tag]);\n}\n\n/**\n * Clear all shortcodes.\n *\n * This function is simple, it clears all of the shortcode tags by replacing the\n * shortcodes global by a empty array. This is actually a very efficient method\n * for removing all shortcodes.\n *\n * @since 2.5.0\n *\n * @global array $shortcode_tags\n */\nfunction remove_all_shortcodes() {\n\tglobal $shortcode_tags;\n\n\t$shortcode_tags = array();\n}\n\n/**\n * Whether a registered shortcode exists named $tag\n *\n * @since 3.6.0\n *\n * @global array $shortcode_tags List of shortcode tags and their callback hooks.\n *\n * @param string $tag Shortcode tag to check.\n * @return bool Whether the given shortcode exists.\n */\nfunction shortcode_exists( $tag ) {\n\tglobal $shortcode_tags;\n\treturn array_key_exists( $tag, $shortcode_tags );\n}\n\n/**\n * Whether the passed content contains the specified shortcode\n *\n * @since 3.6.0\n *\n * @global array $shortcode_tags\n *\n * @param string $content Content to search for shortcodes.\n * @param string $tag     Shortcode tag to check.\n * @return bool Whether the passed content contains the given shortcode.\n */\nfunction has_shortcode( $content, $tag ) {\n\tif ( false === strpos( $content, '[' ) ) {\n\t\treturn false;\n\t}\n\n\tif ( shortcode_exists( $tag ) ) {\n\t\tpreg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER );\n\t\tif ( empty( $matches ) )\n\t\t\treturn false;\n\n\t\tforeach ( $matches as $shortcode ) {\n\t\t\tif ( $tag === $shortcode[2] ) {\n\t\t\t\treturn true;\n\t\t\t} elseif ( ! empty( $shortcode[5] ) && has_shortcode( $shortcode[5], $tag ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Search content for shortcodes and filter shortcodes through their hooks.\n *\n * If there are no shortcode tags defined, then the content will be returned\n * without any filtering. This might cause issues when plugins are disabled but\n * the shortcode will still show up in the post or content.\n *\n * @since 2.5.0\n *\n * @global array $shortcode_tags List of shortcode tags and their callback hooks.\n *\n * @param string $content Content to search for shortcodes.\n * @param bool $ignore_html When true, shortcodes inside HTML elements will be skipped.\n * @return string Content with shortcodes filtered out.\n */\nfunction do_shortcode( $content, $ignore_html = false ) {\n\tglobal $shortcode_tags;\n\n\tif ( false === strpos( $content, '[' ) ) {\n\t\treturn $content;\n\t}\n\n\tif (empty($shortcode_tags) || !is_array($shortcode_tags))\n\t\treturn $content;\n\n\t// Find all registered tag names in $content.\n\tpreg_match_all( '@\\[([^<>&/\\[\\]\\x00-\\x20=]++)@', $content, $matches );\n\t$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );\n\n\tif ( empty( $tagnames ) ) {\n\t\treturn $content;\n\t}\n\n\t$content = do_shortcodes_in_html_tags( $content, $ignore_html, $tagnames );\n\n\t$pattern = get_shortcode_regex( $tagnames );\n\t$content = preg_replace_callback( \"/$pattern/\", 'do_shortcode_tag', $content );\n\n\t// Always restore square braces so we don't break things like <!--[if IE ]>\n\t$content = unescape_invalid_shortcodes( $content );\n\n\treturn $content;\n}\n\n/**\n * Retrieve the shortcode regular expression for searching.\n *\n * The regular expression combines the shortcode tags in the regular expression\n * in a regex class.\n *\n * The regular expression contains 6 different sub matches to help with parsing.\n *\n * 1 - An extra [ to allow for escaping shortcodes with double [[]]\n * 2 - The shortcode name\n * 3 - The shortcode argument list\n * 4 - The self closing /\n * 5 - The content of a shortcode when it wraps some content.\n * 6 - An extra ] to allow for escaping shortcodes with double [[]]\n *\n * @since 2.5.0\n *\n * @global array $shortcode_tags\n *\n * @param array $tagnames List of shortcodes to find. Optional. Defaults to all registered shortcodes.\n * @return string The shortcode search regular expression\n */\nfunction get_shortcode_regex( $tagnames = null ) {\n\tglobal $shortcode_tags;\n\n\tif ( empty( $tagnames ) ) {\n\t\t$tagnames = array_keys( $shortcode_tags );\n\t}\n\t$tagregexp = join( '|', array_map('preg_quote', $tagnames) );\n\n\t// WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag()\n\t// Also, see shortcode_unautop() and shortcode.js.\n\treturn\n\t\t  '\\\\['                              // Opening bracket\n\t\t. '(\\\\[?)'                           // 1: Optional second opening bracket for escaping shortcodes: [[tag]]\n\t\t. \"($tagregexp)\"                     // 2: Shortcode name\n\t\t. '(?![\\\\w-])'                       // Not followed by word character or hyphen\n\t\t. '('                                // 3: Unroll the loop: Inside the opening shortcode tag\n\t\t.     '[^\\\\]\\\\/]*'                   // Not a closing bracket or forward slash\n\t\t.     '(?:'\n\t\t.         '\\\\/(?!\\\\])'               // A forward slash not followed by a closing bracket\n\t\t.         '[^\\\\]\\\\/]*'               // Not a closing bracket or forward slash\n\t\t.     ')*?'\n\t\t. ')'\n\t\t. '(?:'\n\t\t.     '(\\\\/)'                        // 4: Self closing tag ...\n\t\t.     '\\\\]'                          // ... and closing bracket\n\t\t. '|'\n\t\t.     '\\\\]'                          // Closing bracket\n\t\t.     '(?:'\n\t\t.         '('                        // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags\n\t\t.             '[^\\\\[]*+'             // Not an opening bracket\n\t\t.             '(?:'\n\t\t.                 '\\\\[(?!\\\\/\\\\2\\\\])' // An opening bracket not followed by the closing shortcode tag\n\t\t.                 '[^\\\\[]*+'         // Not an opening bracket\n\t\t.             ')*+'\n\t\t.         ')'\n\t\t.         '\\\\[\\\\/\\\\2\\\\]'             // Closing shortcode tag\n\t\t.     ')?'\n\t\t. ')'\n\t\t. '(\\\\]?)';                          // 6: Optional second closing brocket for escaping shortcodes: [[tag]]\n}\n\n/**\n * Regular Expression callable for do_shortcode() for calling shortcode hook.\n * @see get_shortcode_regex for details of the match array contents.\n *\n * @since 2.5.0\n * @access private\n *\n * @global array $shortcode_tags\n *\n * @param array $m Regular expression match array\n * @return string|false False on failure.\n */\nfunction do_shortcode_tag( $m ) {\n\tglobal $shortcode_tags;\n\n\t// allow [[foo]] syntax for escaping a tag\n\tif ( $m[1] == '[' && $m[6] == ']' ) {\n\t\treturn substr($m[0], 1, -1);\n\t}\n\n\t$tag = $m[2];\n\t$attr = shortcode_parse_atts( $m[3] );\n\n\tif ( ! is_callable( $shortcode_tags[ $tag ] ) ) {\n\t\t/* translators: %s: shortcode tag */\n\t\t$message = sprintf( __( 'Attempting to parse a shortcode without a valid callback: %s' ), $tag );\n\t\t_doing_it_wrong( __FUNCTION__, $message, '4.3.0' );\n\t\treturn $m[0];\n\t}\n\n\tif ( isset( $m[5] ) ) {\n\t\t// enclosing tag - extra parameter\n\t\treturn $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ) . $m[6];\n\t} else {\n\t\t// self-closing tag\n\t\treturn $m[1] . call_user_func( $shortcode_tags[$tag], $attr, null,  $tag ) . $m[6];\n\t}\n}\n\n/**\n * Search only inside HTML elements for shortcodes and process them.\n *\n * Any [ or ] characters remaining inside elements will be HTML encoded\n * to prevent interference with shortcodes that are outside the elements.\n * Assumes $content processed by KSES already.  Users with unfiltered_html\n * capability may get unexpected output if angle braces are nested in tags.\n *\n * @since 4.2.3\n *\n * @param string $content Content to search for shortcodes\n * @param bool $ignore_html When true, all square braces inside elements will be encoded.\n * @param array $tagnames List of shortcodes to find.\n * @return string Content with shortcodes filtered out.\n */\nfunction do_shortcodes_in_html_tags( $content, $ignore_html, $tagnames ) {\n\t// Normalize entities in unfiltered HTML before adding placeholders.\n\t$trans = array( '&#91;' => '&#091;', '&#93;' => '&#093;' );\n\t$content = strtr( $content, $trans );\n\t$trans = array( '[' => '&#91;', ']' => '&#93;' );\n\n\t$pattern = get_shortcode_regex( $tagnames );\n\t$textarr = wp_html_split( $content );\n\n\tforeach ( $textarr as &$element ) {\n\t\tif ( '' == $element || '<' !== $element[0] ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t$noopen = false === strpos( $element, '[' );\n\t\t$noclose = false === strpos( $element, ']' );\n\t\tif ( $noopen || $noclose ) {\n\t\t\t// This element does not contain shortcodes.\n\t\t\tif ( $noopen xor $noclose ) {\n\t\t\t\t// Need to encode stray [ or ] chars.\n\t\t\t\t$element = strtr( $element, $trans );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( $ignore_html || '<!--' === substr( $element, 0, 4 ) || '<![CDATA[' === substr( $element, 0, 9 ) ) {\n\t\t\t// Encode all [ and ] chars.\n\t\t\t$element = strtr( $element, $trans );\n\t\t\tcontinue;\n\t\t}\n\n\t\t$attributes = wp_kses_attr_parse( $element );\n\t\tif ( false === $attributes ) {\n\t\t\t// Some plugins are doing things like [name] <[email]>.\n\t\t\tif ( 1 === preg_match( '%^<\\s*\\[\\[?[^\\[\\]]+\\]%', $element ) ) {\n\t\t\t\t$element = preg_replace_callback( \"/$pattern/\", 'do_shortcode_tag', $element );\n\t\t\t}\n\n\t\t\t// Looks like we found some crazy unfiltered HTML.  Skipping it for sanity.\n\t\t\t$element = strtr( $element, $trans );\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Get element name\n\t\t$front = array_shift( $attributes );\n\t\t$back = array_pop( $attributes );\n\t\t$matches = array();\n\t\tpreg_match('%[a-zA-Z0-9]+%', $front, $matches);\n\t\t$elname = $matches[0];\n\n\t\t// Look for shortcodes in each attribute separately.\n\t\tforeach ( $attributes as &$attr ) {\n\t\t\t$open = strpos( $attr, '[' );\n\t\t\t$close = strpos( $attr, ']' );\n\t\t\tif ( false === $open || false === $close ) {\n\t\t\t\tcontinue; // Go to next attribute.  Square braces will be escaped at end of loop.\n\t\t\t}\n\t\t\t$double = strpos( $attr, '\"' );\n\t\t\t$single = strpos( $attr, \"'\" );\n\t\t\tif ( ( false === $single || $open < $single ) && ( false === $double || $open < $double ) ) {\n\t\t\t\t// $attr like '[shortcode]' or 'name = [shortcode]' implies unfiltered_html.\n\t\t\t\t// In this specific situation we assume KSES did not run because the input\n\t\t\t\t// was written by an administrator, so we should avoid changing the output\n\t\t\t\t// and we do not need to run KSES here.\n\t\t\t\t$attr = preg_replace_callback( \"/$pattern/\", 'do_shortcode_tag', $attr );\n\t\t\t} else {\n\t\t\t\t// $attr like 'name = \"[shortcode]\"' or \"name = '[shortcode]'\"\n\t\t\t\t// We do not know if $content was unfiltered. Assume KSES ran before shortcodes.\n\t\t\t\t$count = 0;\n\t\t\t\t$new_attr = preg_replace_callback( \"/$pattern/\", 'do_shortcode_tag', $attr, -1, $count );\n\t\t\t\tif ( $count > 0 ) {\n\t\t\t\t\t// Sanitize the shortcode output using KSES.\n\t\t\t\t\t$new_attr = wp_kses_one_attr( $new_attr, $elname );\n\t\t\t\t\tif ( '' !== trim( $new_attr ) ) {\n\t\t\t\t\t\t// The shortcode is safe to use now.\n\t\t\t\t\t\t$attr = $new_attr;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t$element = $front . implode( '', $attributes ) . $back;\n\n\t\t// Now encode any remaining [ or ] chars.\n\t\t$element = strtr( $element, $trans );\n\t}\n\n\t$content = implode( '', $textarr );\n\n\treturn $content;\n}\n\n/**\n * Remove placeholders added by do_shortcodes_in_html_tags().\n *\n * @since 4.2.3\n *\n * @param string $content Content to search for placeholders.\n * @return string Content with placeholders removed.\n */\nfunction unescape_invalid_shortcodes( $content ) {\n        // Clean up entire string, avoids re-parsing HTML.\n        $trans = array( '&#91;' => '[', '&#93;' => ']' );\n        $content = strtr( $content, $trans );\n\n        return $content;\n}\n\n/**\n * Retrieve the shortcode attributes regex.\n *\n * @since 4.4.0\n *\n * @return string The shortcode attribute regular expression\n */\nfunction get_shortcode_atts_regex() {\n\treturn '/([\\w-]+)\\s*=\\s*\"([^\"]*)\"(?:\\s|$)|([\\w-]+)\\s*=\\s*\\'([^\\']*)\\'(?:\\s|$)|([\\w-]+)\\s*=\\s*([^\\s\\'\"]+)(?:\\s|$)|\"([^\"]*)\"(?:\\s|$)|(\\S+)(?:\\s|$)/';\n}\n\n/**\n * Retrieve all attributes from the shortcodes tag.\n *\n * The attributes list has the attribute name as the key and the value of the\n * attribute as the value in the key/value pair. This allows for easier\n * retrieval of the attributes, since all attributes have to be known.\n *\n * @since 2.5.0\n *\n * @param string $text\n * @return array|string List of attribute values.\n *                      Returns empty array if trim( $text ) == '\"\"'.\n *                      Returns empty string if trim( $text ) == ''.\n *                      All other matches are checked for not empty().\n */\nfunction shortcode_parse_atts($text) {\n\t$atts = array();\n\t$pattern = get_shortcode_atts_regex();\n\t$text = preg_replace(\"/[\\x{00a0}\\x{200b}]+/u\", \" \", $text);\n\tif ( preg_match_all($pattern, $text, $match, PREG_SET_ORDER) ) {\n\t\tforeach ($match as $m) {\n\t\t\tif (!empty($m[1]))\n\t\t\t\t$atts[strtolower($m[1])] = stripcslashes($m[2]);\n\t\t\telseif (!empty($m[3]))\n\t\t\t\t$atts[strtolower($m[3])] = stripcslashes($m[4]);\n\t\t\telseif (!empty($m[5]))\n\t\t\t\t$atts[strtolower($m[5])] = stripcslashes($m[6]);\n\t\t\telseif (isset($m[7]) && strlen($m[7]))\n\t\t\t\t$atts[] = stripcslashes($m[7]);\n\t\t\telseif (isset($m[8]))\n\t\t\t\t$atts[] = stripcslashes($m[8]);\n\t\t}\n\n\t\t// Reject any unclosed HTML elements\n\t\tforeach( $atts as &$value ) {\n\t\t\tif ( false !== strpos( $value, '<' ) ) {\n\t\t\t\tif ( 1 !== preg_match( '/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value ) ) {\n\t\t\t\t\t$value = '';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t$atts = ltrim($text);\n\t}\n\treturn $atts;\n}\n\n/**\n * Combine user attributes with known attributes and fill in defaults when needed.\n *\n * The pairs should be considered to be all of the attributes which are\n * supported by the caller and given as a list. The returned attributes will\n * only contain the attributes in the $pairs list.\n *\n * If the $atts list has unsupported attributes, then they will be ignored and\n * removed from the final returned list.\n *\n * @since 2.5.0\n *\n * @param array  $pairs     Entire list of supported attributes and their defaults.\n * @param array  $atts      User defined attributes in shortcode tag.\n * @param string $shortcode Optional. The name of the shortcode, provided for context to enable filtering\n * @return array Combined and filtered attribute list.\n */\nfunction shortcode_atts( $pairs, $atts, $shortcode = '' ) {\n\t$atts = (array)$atts;\n\t$out = array();\n\tforeach ($pairs as $name => $default) {\n\t\tif ( array_key_exists($name, $atts) )\n\t\t\t$out[$name] = $atts[$name];\n\t\telse\n\t\t\t$out[$name] = $default;\n\t}\n\t/**\n\t * Filter a shortcode's default attributes.\n\t *\n\t * If the third parameter of the shortcode_atts() function is present then this filter is available.\n\t * The third parameter, $shortcode, is the name of the shortcode.\n\t *\n\t * @since 3.6.0\n\t * @since 4.4.0 Added the `$shortcode` parameter.\n\t *\n\t * @param array  $out       The output array of shortcode attributes.\n\t * @param array  $pairs     The supported attributes and their defaults.\n\t * @param array  $atts      The user defined shortcode attributes.\n\t * @param string $shortcode The shortcode name.\n\t */\n\tif ( $shortcode ) {\n\t\t$out = apply_filters( \"shortcode_atts_{$shortcode}\", $out, $pairs, $atts, $shortcode );\n\t}\n\n\treturn $out;\n}\n\n/**\n * Remove all shortcode tags from the given content.\n *\n * @since 2.5.0\n *\n * @global array $shortcode_tags\n *\n * @param string $content Content to remove shortcode tags.\n * @return string Content without shortcode tags.\n */\nfunction strip_shortcodes( $content ) {\n\tglobal $shortcode_tags;\n\n\tif ( false === strpos( $content, '[' ) ) {\n\t\treturn $content;\n\t}\n\n\tif (empty($shortcode_tags) || !is_array($shortcode_tags))\n\t\treturn $content;\n\n\t// Find all registered tag names in $content.\n\tpreg_match_all( '@\\[([^<>&/\\[\\]\\x00-\\x20=]++)@', $content, $matches );\n\t$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );\n\n\tif ( empty( $tagnames ) ) {\n\t\treturn $content;\n\t}\n\n\t$content = do_shortcodes_in_html_tags( $content, true, $tagnames );\n\n\t$pattern = get_shortcode_regex( $tagnames );\n\t$content = preg_replace_callback( \"/$pattern/\", 'strip_shortcode_tag', $content );\n\n\t// Always restore square braces so we don't break things like <!--[if IE ]>\n\t$content = unescape_invalid_shortcodes( $content );\n\n\treturn $content;\n}\n\n/**\n *\n * @param array $m\n * @return string|false\n */\nfunction strip_shortcode_tag( $m ) {\n\t// allow [[foo]] syntax for escaping a tag\n\tif ( $m[1] == '[' && $m[6] == ']' ) {\n\t\treturn substr($m[0], 1, -1);\n\t}\n\n\treturn $m[1] . $m[6];\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/taxonomy.php",
    "content": "<?php\n/**\n * Core Taxonomy API\n *\n * @package WordPress\n * @subpackage Taxonomy\n */\n\n//\n// Taxonomy Registration\n//\n\n/**\n * Creates the initial taxonomies.\n *\n * This function fires twice: in wp-settings.php before plugins are loaded (for\n * backwards compatibility reasons), and again on the {@see 'init'} action. We must\n * avoid registering rewrite rules before the {@see 'init'} action.\n *\n * @since 2.8.0\n *\n * @global WP_Rewrite $wp_rewrite The WordPress rewrite class.\n */\nfunction create_initial_taxonomies() {\n\tglobal $wp_rewrite;\n\n\tif ( ! did_action( 'init' ) ) {\n\t\t$rewrite = array( 'category' => false, 'post_tag' => false, 'post_format' => false );\n\t} else {\n\n\t\t/**\n\t\t * Filter the post formats rewrite base.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param string $context Context of the rewrite base. Default 'type'.\n\t\t */\n\t\t$post_format_base = apply_filters( 'post_format_rewrite_base', 'type' );\n\t\t$rewrite = array(\n\t\t\t'category' => array(\n\t\t\t\t'hierarchical' => true,\n\t\t\t\t'slug' => get_option('category_base') ? get_option('category_base') : 'category',\n\t\t\t\t'with_front' => ! get_option('category_base') || $wp_rewrite->using_index_permalinks(),\n\t\t\t\t'ep_mask' => EP_CATEGORIES,\n\t\t\t),\n\t\t\t'post_tag' => array(\n\t\t\t\t'hierarchical' => false,\n\t\t\t\t'slug' => get_option('tag_base') ? get_option('tag_base') : 'tag',\n\t\t\t\t'with_front' => ! get_option('tag_base') || $wp_rewrite->using_index_permalinks(),\n\t\t\t\t'ep_mask' => EP_TAGS,\n\t\t\t),\n\t\t\t'post_format' => $post_format_base ? array( 'slug' => $post_format_base ) : false,\n\t\t);\n\t}\n\n\tregister_taxonomy( 'category', 'post', array(\n\t\t'hierarchical' => true,\n\t\t'query_var' => 'category_name',\n\t\t'rewrite' => $rewrite['category'],\n\t\t'public' => true,\n\t\t'show_ui' => true,\n\t\t'show_admin_column' => true,\n\t\t'_builtin' => true,\n\t) );\n\n\tregister_taxonomy( 'post_tag', 'post', array(\n\t \t'hierarchical' => false,\n\t\t'query_var' => 'tag',\n\t\t'rewrite' => $rewrite['post_tag'],\n\t\t'public' => true,\n\t\t'show_ui' => true,\n\t\t'show_admin_column' => true,\n\t\t'_builtin' => true,\n\t) );\n\n\tregister_taxonomy( 'nav_menu', 'nav_menu_item', array(\n\t\t'public' => false,\n\t\t'hierarchical' => false,\n\t\t'labels' => array(\n\t\t\t'name' => __( 'Navigation Menus' ),\n\t\t\t'singular_name' => __( 'Navigation Menu' ),\n\t\t),\n\t\t'query_var' => false,\n\t\t'rewrite' => false,\n\t\t'show_ui' => false,\n\t\t'_builtin' => true,\n\t\t'show_in_nav_menus' => false,\n\t) );\n\n\tregister_taxonomy( 'link_category', 'link', array(\n\t\t'hierarchical' => false,\n\t\t'labels' => array(\n\t\t\t'name' => __( 'Link Categories' ),\n\t\t\t'singular_name' => __( 'Link Category' ),\n\t\t\t'search_items' => __( 'Search Link Categories' ),\n\t\t\t'popular_items' => null,\n\t\t\t'all_items' => __( 'All Link Categories' ),\n\t\t\t'edit_item' => __( 'Edit Link Category' ),\n\t\t\t'update_item' => __( 'Update Link Category' ),\n\t\t\t'add_new_item' => __( 'Add New Link Category' ),\n\t\t\t'new_item_name' => __( 'New Link Category Name' ),\n\t\t\t'separate_items_with_commas' => null,\n\t\t\t'add_or_remove_items' => null,\n\t\t\t'choose_from_most_used' => null,\n\t\t),\n\t\t'capabilities' => array(\n\t\t\t'manage_terms' => 'manage_links',\n\t\t\t'edit_terms'   => 'manage_links',\n\t\t\t'delete_terms' => 'manage_links',\n\t\t\t'assign_terms' => 'manage_links',\n\t\t),\n\t\t'query_var' => false,\n\t\t'rewrite' => false,\n\t\t'public' => false,\n\t\t'show_ui' => true,\n\t\t'_builtin' => true,\n\t) );\n\n\tregister_taxonomy( 'post_format', 'post', array(\n\t\t'public' => true,\n\t\t'hierarchical' => false,\n\t\t'labels' => array(\n\t\t\t'name' => _x( 'Format', 'post format' ),\n\t\t\t'singular_name' => _x( 'Format', 'post format' ),\n\t\t),\n\t\t'query_var' => true,\n\t\t'rewrite' => $rewrite['post_format'],\n\t\t'show_ui' => false,\n\t\t'_builtin' => true,\n\t\t'show_in_nav_menus' => current_theme_supports( 'post-formats' ),\n\t) );\n}\n\n/**\n * Retrieves a list of registered taxonomy names or objects.\n *\n * @since 3.0.0\n *\n * @global array $wp_taxonomies The registered taxonomies.\n *\n * @param array  $args     Optional. An array of `key => value` arguments to match against the taxonomy objects.\n *                         Default empty array.\n * @param string $output   Optional. The type of output to return in the array. Accepts either taxonomy 'names'\n *                         or 'objects'. Default 'names'.\n * @param string $operator Optional. The logical operation to perform. Accepts 'and' or 'or'. 'or' means only\n *                         one element from the array needs to match; 'and' means all elements must match.\n *                         Default 'and'.\n * @return array A list of taxonomy names or objects.\n */\nfunction get_taxonomies( $args = array(), $output = 'names', $operator = 'and' ) {\n\tglobal $wp_taxonomies;\n\n\t$field = ('names' == $output) ? 'name' : false;\n\n\treturn wp_filter_object_list($wp_taxonomies, $args, $operator, $field);\n}\n\n/**\n * Return all of the taxonomy names that are of $object_type.\n *\n * It appears that this function can be used to find all of the names inside of\n * $wp_taxonomies global variable.\n *\n * `<?php $taxonomies = get_object_taxonomies('post'); ?>` Should\n * result in `Array( 'category', 'post_tag' )`\n *\n * @since 2.3.0\n *\n * @global array $wp_taxonomies The registered taxonomies.\n *\n * @param array|string|WP_Post $object Name of the type of taxonomy object, or an object (row from posts)\n * @param string               $output Optional. The type of output to return in the array. Accepts either\n *                                     taxonomy 'names' or 'objects'. Default 'names'.\n * @return array The names of all taxonomy of $object_type.\n */\nfunction get_object_taxonomies( $object, $output = 'names' ) {\n\tglobal $wp_taxonomies;\n\n\tif ( is_object($object) ) {\n\t\tif ( $object->post_type == 'attachment' )\n\t\t\treturn get_attachment_taxonomies($object);\n\t\t$object = $object->post_type;\n\t}\n\n\t$object = (array) $object;\n\n\t$taxonomies = array();\n\tforeach ( (array) $wp_taxonomies as $tax_name => $tax_obj ) {\n\t\tif ( array_intersect($object, (array) $tax_obj->object_type) ) {\n\t\t\tif ( 'names' == $output )\n\t\t\t\t$taxonomies[] = $tax_name;\n\t\t\telse\n\t\t\t\t$taxonomies[ $tax_name ] = $tax_obj;\n\t\t}\n\t}\n\n\treturn $taxonomies;\n}\n\n/**\n * Retrieves the taxonomy object of $taxonomy.\n *\n * The get_taxonomy function will first check that the parameter string given\n * is a taxonomy object and if it is, it will return it.\n *\n * @since 2.3.0\n *\n * @global array $wp_taxonomies The registered taxonomies.\n *\n * @param string $taxonomy Name of taxonomy object to return.\n * @return object|false The Taxonomy Object or false if $taxonomy doesn't exist.\n */\nfunction get_taxonomy( $taxonomy ) {\n\tglobal $wp_taxonomies;\n\n\tif ( ! taxonomy_exists( $taxonomy ) )\n\t\treturn false;\n\n\treturn $wp_taxonomies[$taxonomy];\n}\n\n/**\n * Checks that the taxonomy name exists.\n *\n * Formerly is_taxonomy(), introduced in 2.3.0.\n *\n * @since 3.0.0\n *\n * @global array $wp_taxonomies The registered taxonomies.\n *\n * @param string $taxonomy Name of taxonomy object.\n * @return bool Whether the taxonomy exists.\n */\nfunction taxonomy_exists( $taxonomy ) {\n\tglobal $wp_taxonomies;\n\n\treturn isset( $wp_taxonomies[$taxonomy] );\n}\n\n/**\n * Whether the taxonomy object is hierarchical.\n *\n * Checks to make sure that the taxonomy is an object first. Then Gets the\n * object, and finally returns the hierarchical value in the object.\n *\n * A false return value might also mean that the taxonomy does not exist.\n *\n * @since 2.3.0\n *\n * @param string $taxonomy Name of taxonomy object.\n * @return bool Whether the taxonomy is hierarchical.\n */\nfunction is_taxonomy_hierarchical($taxonomy) {\n\tif ( ! taxonomy_exists($taxonomy) )\n\t\treturn false;\n\n\t$taxonomy = get_taxonomy($taxonomy);\n\treturn $taxonomy->hierarchical;\n}\n\n/**\n * Creates or modifies a taxonomy object.\n *\n * Note: Do not use before the {@see 'init'} hook.\n *\n * A simple function for creating or modifying a taxonomy object based on the\n * parameters given. The function will accept an array (third optional\n * parameter), along with strings for the taxonomy name and another string for\n * the object type.\n *\n * @since 2.3.0\n * @since 4.2.0 Introduced `show_in_quick_edit` argument.\n * @since 4.4.0 The `show_ui` argument is now enforced on the term editing screen.\n * @since 4.4.0 The `public` argument now controls whether the taxonomy can be queried on the front-end.\n *\n * @global array $wp_taxonomies Registered taxonomies.\n * @global WP    $wp            WP instance.\n *\n * @param string       $taxonomy    Taxonomy key, must not exceed 32 characters.\n * @param array|string $object_type Name of the object type for the taxonomy object.\n * @param array|string $args        {\n *     Optional. Array or query string of arguments for registering a taxonomy.\n *\n *     @type string        $label                 Name of the taxonomy shown in the menu. Usually plural. If not set,\n *                                                `$labels['name']` will be used.\n *     @type array         $labels                An array of labels for this taxonomy. By default, Tag labels are used for\n *                                                non-hierarchical taxonmies, and Category labels are used for hierarchical\n *                                                taxonomies. See accepted values in get_taxonomy_labels().\n *                                                Default empty array.\n *     @type string        $description           A short descriptive summary of what the taxonomy is for. Default empty.\n *     @type bool          $public                Whether the taxonomy is publicly queryable. Default true.\n *     @type bool          $hierarchical          Whether the taxonomy is hierarchical. Default false.\n *     @type bool          $show_ui               Whether to generate and allow a UI for managing terms in this taxonomy in\n *                                                the admin. If not set, the default is inherited from `$public`\n *                                                (default true).\n *     @type bool          $show_in_menu          Whether to show the taxonomy in the admin menu. If true, the taxonomy is\n *                                                shown as a submenu of the object type menu. If false, no menu is shown.\n *                                                `$show_ui` must be true. If not set, default is inherited from `$show_ui`\n *                                                (default true).\n *     @type bool          $show_in_nav_menus     Makes this taxonomy available for selection in navigation menus. If not\n *                                                set, the default is inherited from `$public` (default true).\n *     @type bool          $show_tagcloud         Whether to list the taxonomy in the Tag Cloud Widget controls. If not set,\n *                                                the default is inherited from `$show_ui` (default true).\n *     @type bool          $show_in_quick_edit    Whether to show the taxonomy in the quick/bulk edit panel. It not set,\n *                                                the default is inherited from `$show_ui` (default true).\n *     @type bool          $show_admin_column     Whether to display a column for the taxonomy on its post type listing\n *                                                screens. Default false.\n *     @type bool|callable $meta_box_cb           Provide a callback function for the meta box display. If not set,\n *                                                post_categories_meta_box() is used for hierarchical taxonomies, and\n *                                                post_tags_meta_box() is used for non-hierarchical. If false, no meta\n *                                                box is shown.\n *     @type array         $capabilities {\n *         Array of capabilities for this taxonomy.\n *\n *         @type string $manage_terms Default 'manage_categories'.\n *         @type string $edit_terms   Default 'manage_categories'.\n *         @type string $delete_terms Default 'manage_categories'.\n *         @type string $assign_terms Default 'edit_posts'.\n *     }\n *     @type bool|array    $rewrite {\n *         Triggers the handling of rewrites for this taxonomy. Default true, using $taxonomy as slug. To prevent\n *         rewrite, set to false. To specify rewrite rules, an array can be passed with any of these keys:\n *\n *         @type string $slug         Customize the permastruct slug. Default `$taxonomy` key.\n *         @type bool   $with_front   Should the permastruct be prepended with WP_Rewrite::$front. Default true.\n *         @type bool   $hierarchical Either hierarchical rewrite tag or not. Default false.\n *         @type int    $ep_mask      Assign an endpoint mask. Default `EP_NONE`.\n *     }\n *     @type string        $query_var             Sets the query var key for this taxonomy. Default `$taxonomy` key. If\n *                                                false, a taxonomy cannot be loaded at `?{query_var}={term_slug}`. If a\n *                                                string, the query `?{query_var}={term_slug}` will be valid.\n *     @type callable      $update_count_callback Works much like a hook, in that it will be called when the count is\n *                                                updated. Default _update_post_term_count() for taxonomies attached\n *                                                to post types, which confirms that the objects are published before\n *                                                counting them. Default _update_generic_term_count() for taxonomies\n *                                                attached to other object types, such as users.\n *     @type bool          $_builtin              This taxonomy is a \"built-in\" taxonomy. INTERNAL USE ONLY!\n *                                                Default false.\n * }\n * @return WP_Error|void WP_Error, if errors.\n */\nfunction register_taxonomy( $taxonomy, $object_type, $args = array() ) {\n\tglobal $wp_taxonomies, $wp;\n\n\tif ( ! is_array( $wp_taxonomies ) )\n\t\t$wp_taxonomies = array();\n\n\t$args = wp_parse_args( $args );\n\n\t/**\n\t * Filter the arguments for registering a taxonomy.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array  $args        Array of arguments for registering a taxonomy.\n\t * @param array  $object_type Array of names of object types for the taxonomy.\n\t * @param string $taxonomy    Taxonomy key.\n\t */\n\t$args = apply_filters( 'register_taxonomy_args', $args, $taxonomy, (array) $object_type );\n\n\t$defaults = array(\n\t\t'labels'                => array(),\n\t\t'description'           => '',\n\t\t'public'                => true,\n\t\t'hierarchical'          => false,\n\t\t'show_ui'               => null,\n\t\t'show_in_menu'          => null,\n\t\t'show_in_nav_menus'     => null,\n\t\t'show_tagcloud'         => null,\n\t\t'show_in_quick_edit'\t=> null,\n\t\t'show_admin_column'     => false,\n\t\t'meta_box_cb'           => null,\n\t\t'capabilities'          => array(),\n\t\t'rewrite'               => true,\n\t\t'query_var'             => $taxonomy,\n\t\t'update_count_callback' => '',\n\t\t'_builtin'              => false,\n\t);\n\t$args = array_merge( $defaults, $args );\n\n\tif ( empty( $taxonomy ) || strlen( $taxonomy ) > 32 ) {\n\t\t_doing_it_wrong( __FUNCTION__, __( 'Taxonomy names must be between 1 and 32 characters in length.' ), '4.2' );\n\t\treturn new WP_Error( 'taxonomy_length_invalid', __( 'Taxonomy names must be between 1 and 32 characters in length.' ) );\n\t}\n\n\t// Non-public taxonomies should not register query vars, except in the admin.\n\tif ( false !== $args['query_var'] && ( is_admin() || false !== $args['public'] ) && ! empty( $wp ) ) {\n\t\tif ( true === $args['query_var'] )\n\t\t\t$args['query_var'] = $taxonomy;\n\t\telse\n\t\t\t$args['query_var'] = sanitize_title_with_dashes( $args['query_var'] );\n\t\t$wp->add_query_var( $args['query_var'] );\n\t} else {\n\t\t// Force query_var to false for non-public taxonomies.\n\t\t$args['query_var'] = false;\n\t}\n\n\tif ( false !== $args['rewrite'] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) {\n\t\t$args['rewrite'] = wp_parse_args( $args['rewrite'], array(\n\t\t\t'with_front' => true,\n\t\t\t'hierarchical' => false,\n\t\t\t'ep_mask' => EP_NONE,\n\t\t) );\n\n\t\tif ( empty( $args['rewrite']['slug'] ) )\n\t\t\t$args['rewrite']['slug'] = sanitize_title_with_dashes( $taxonomy );\n\n\t\tif ( $args['hierarchical'] && $args['rewrite']['hierarchical'] )\n\t\t\t$tag = '(.+?)';\n\t\telse\n\t\t\t$tag = '([^/]+)';\n\n\t\tadd_rewrite_tag( \"%$taxonomy%\", $tag, $args['query_var'] ? \"{$args['query_var']}=\" : \"taxonomy=$taxonomy&term=\" );\n\t\tadd_permastruct( $taxonomy, \"{$args['rewrite']['slug']}/%$taxonomy%\", $args['rewrite'] );\n\t}\n\n\t// If not set, default to the setting for public.\n\tif ( null === $args['show_ui'] )\n\t\t$args['show_ui'] = $args['public'];\n\n\t// If not set, default to the setting for show_ui.\n\tif ( null === $args['show_in_menu' ] || ! $args['show_ui'] )\n\t\t$args['show_in_menu' ] = $args['show_ui'];\n\n\t// If not set, default to the setting for public.\n\tif ( null === $args['show_in_nav_menus'] )\n\t\t$args['show_in_nav_menus'] = $args['public'];\n\n\t// If not set, default to the setting for show_ui.\n\tif ( null === $args['show_tagcloud'] )\n\t\t$args['show_tagcloud'] = $args['show_ui'];\n\n\t// If not set, default to the setting for show_ui.\n\tif ( null === $args['show_in_quick_edit'] ) {\n\t\t$args['show_in_quick_edit'] = $args['show_ui'];\n\t}\n\n\t$default_caps = array(\n\t\t'manage_terms' => 'manage_categories',\n\t\t'edit_terms'   => 'manage_categories',\n\t\t'delete_terms' => 'manage_categories',\n\t\t'assign_terms' => 'edit_posts',\n\t);\n\t$args['cap'] = (object) array_merge( $default_caps, $args['capabilities'] );\n\tunset( $args['capabilities'] );\n\n\t$args['name'] = $taxonomy;\n\t$args['object_type'] = array_unique( (array) $object_type );\n\n\t$args['labels'] = get_taxonomy_labels( (object) $args );\n\t$args['label'] = $args['labels']->name;\n\n\t// If not set, use the default meta box\n\tif ( null === $args['meta_box_cb'] ) {\n\t\tif ( $args['hierarchical'] )\n\t\t\t$args['meta_box_cb'] = 'post_categories_meta_box';\n\t\telse\n\t\t\t$args['meta_box_cb'] = 'post_tags_meta_box';\n\t}\n\n\t$wp_taxonomies[ $taxonomy ] = (object) $args;\n\n\t// register callback handling for metabox\n \tadd_filter( 'wp_ajax_add-' . $taxonomy, '_wp_ajax_add_hierarchical_term' );\n\n\t/**\n\t * Fires after a taxonomy is registered.\n\t *\n\t * @since 3.3.0\n\t *\n\t * @param string       $taxonomy    Taxonomy slug.\n\t * @param array|string $object_type Object type or array of object types.\n\t * @param array        $args        Array of taxonomy registration arguments.\n\t */\n\tdo_action( 'registered_taxonomy', $taxonomy, $object_type, $args );\n}\n\n/**\n * Builds an object with all taxonomy labels out of a taxonomy object\n *\n * Accepted keys of the label array in the taxonomy object:\n *\n * - name - general name for the taxonomy, usually plural. The same as and overridden by $tax->label. Default is Tags/Categories\n * - singular_name - name for one object of this taxonomy. Default is Tag/Category\n * - search_items - Default is Search Tags/Search Categories\n * - popular_items - This string isn't used on hierarchical taxonomies. Default is Popular Tags\n * - all_items - Default is All Tags/All Categories\n * - parent_item - This string isn't used on non-hierarchical taxonomies. In hierarchical ones the default is Parent Category\n * - parent_item_colon - The same as `parent_item`, but with colon `:` in the end\n * - edit_item - Default is Edit Tag/Edit Category\n * - view_item - Default is View Tag/View Category\n * - update_item - Default is Update Tag/Update Category\n * - add_new_item - Default is Add New Tag/Add New Category\n * - new_item_name - Default is New Tag Name/New Category Name\n * - separate_items_with_commas - This string isn't used on hierarchical taxonomies. Default is \"Separate tags with commas\", used in the meta box.\n * - add_or_remove_items - This string isn't used on hierarchical taxonomies. Default is \"Add or remove tags\", used in the meta box when JavaScript is disabled.\n * - choose_from_most_used - This string isn't used on hierarchical taxonomies. Default is \"Choose from the most used tags\", used in the meta box.\n * - not_found - Default is \"No tags found\"/\"No categories found\", used in the meta box and taxonomy list table.\n * - no_terms - Default is \"No tags\"/\"No categories\", used in the posts and media list tables.\n * - items_list_navigation - String for the table pagination hidden heading.\n * - items_list - String for the table hidden heading.\n *\n * Above, the first default value is for non-hierarchical taxonomies (like tags) and the second one is for hierarchical taxonomies (like categories).\n *\n * @todo Better documentation for the labels array.\n *\n * @since 3.0.0\n * @since 4.3.0 Added the `no_terms` label.\n * @since 4.4.0 Added the `items_list_navigation` and `items_list` labels.\n *\n * @param object $tax Taxonomy object.\n * @return object object with all the labels as member variables.\n */\nfunction get_taxonomy_labels( $tax ) {\n\t$tax->labels = (array) $tax->labels;\n\n\tif ( isset( $tax->helps ) && empty( $tax->labels['separate_items_with_commas'] ) )\n\t\t$tax->labels['separate_items_with_commas'] = $tax->helps;\n\n\tif ( isset( $tax->no_tagcloud ) && empty( $tax->labels['not_found'] ) )\n\t\t$tax->labels['not_found'] = $tax->no_tagcloud;\n\n\t$nohier_vs_hier_defaults = array(\n\t\t'name' => array( _x( 'Tags', 'taxonomy general name' ), _x( 'Categories', 'taxonomy general name' ) ),\n\t\t'singular_name' => array( _x( 'Tag', 'taxonomy singular name' ), _x( 'Category', 'taxonomy singular name' ) ),\n\t\t'search_items' => array( __( 'Search Tags' ), __( 'Search Categories' ) ),\n\t\t'popular_items' => array( __( 'Popular Tags' ), null ),\n\t\t'all_items' => array( __( 'All Tags' ), __( 'All Categories' ) ),\n\t\t'parent_item' => array( null, __( 'Parent Category' ) ),\n\t\t'parent_item_colon' => array( null, __( 'Parent Category:' ) ),\n\t\t'edit_item' => array( __( 'Edit Tag' ), __( 'Edit Category' ) ),\n\t\t'view_item' => array( __( 'View Tag' ), __( 'View Category' ) ),\n\t\t'update_item' => array( __( 'Update Tag' ), __( 'Update Category' ) ),\n\t\t'add_new_item' => array( __( 'Add New Tag' ), __( 'Add New Category' ) ),\n\t\t'new_item_name' => array( __( 'New Tag Name' ), __( 'New Category Name' ) ),\n\t\t'separate_items_with_commas' => array( __( 'Separate tags with commas' ), null ),\n\t\t'add_or_remove_items' => array( __( 'Add or remove tags' ), null ),\n\t\t'choose_from_most_used' => array( __( 'Choose from the most used tags' ), null ),\n\t\t'not_found' => array( __( 'No tags found.' ), __( 'No categories found.' ) ),\n\t\t'no_terms' => array( __( 'No tags' ), __( 'No categories' ) ),\n\t\t'items_list_navigation' => array( __( 'Tags list navigation' ), __( 'Categories list navigation' ) ),\n\t\t'items_list' => array( __( 'Tags list' ), __( 'Categories list' ) ),\n\t);\n\t$nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name'];\n\n\t$labels = _get_custom_object_labels( $tax, $nohier_vs_hier_defaults );\n\n\t$taxonomy = $tax->name;\n\n\t$default_labels = clone $labels;\n\n\t/**\n\t * Filter the labels of a specific taxonomy.\n\t *\n\t * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @see get_taxonomy_labels() for the full list of taxonomy labels.\n\t *\n\t * @param object $labels Object with labels for the taxonomy as member variables.\n\t */\n\t$labels = apply_filters( \"taxonomy_labels_{$taxonomy}\", $labels );\n\n\t// Ensure that the filtered labels contain all required default values.\n\t$labels = (object) array_merge( (array) $default_labels, (array) $labels );\n\n\treturn $labels;\n}\n\n/**\n * Add an already registered taxonomy to an object type.\n *\n * @since 3.0.0\n *\n * @global array $wp_taxonomies The registered taxonomies.\n *\n * @param string $taxonomy    Name of taxonomy object.\n * @param string $object_type Name of the object type.\n * @return bool True if successful, false if not.\n */\nfunction register_taxonomy_for_object_type( $taxonomy, $object_type) {\n\tglobal $wp_taxonomies;\n\n\tif ( !isset($wp_taxonomies[$taxonomy]) )\n\t\treturn false;\n\n\tif ( ! get_post_type_object($object_type) )\n\t\treturn false;\n\n\tif ( ! in_array( $object_type, $wp_taxonomies[$taxonomy]->object_type ) )\n\t\t$wp_taxonomies[$taxonomy]->object_type[] = $object_type;\n\n\t// Filter out empties.\n\t$wp_taxonomies[ $taxonomy ]->object_type = array_filter( $wp_taxonomies[ $taxonomy ]->object_type );\n\n\treturn true;\n}\n\n/**\n * Remove an already registered taxonomy from an object type.\n *\n * @since 3.7.0\n *\n * @global array $wp_taxonomies The registered taxonomies.\n *\n * @param string $taxonomy    Name of taxonomy object.\n * @param string $object_type Name of the object type.\n * @return bool True if successful, false if not.\n */\nfunction unregister_taxonomy_for_object_type( $taxonomy, $object_type ) {\n\tglobal $wp_taxonomies;\n\n\tif ( ! isset( $wp_taxonomies[ $taxonomy ] ) )\n\t\treturn false;\n\n\tif ( ! get_post_type_object( $object_type ) )\n\t\treturn false;\n\n\t$key = array_search( $object_type, $wp_taxonomies[ $taxonomy ]->object_type, true );\n\tif ( false === $key )\n\t\treturn false;\n\n\tunset( $wp_taxonomies[ $taxonomy ]->object_type[ $key ] );\n\treturn true;\n}\n\n//\n// Term API\n//\n\n/**\n * Retrieve object_ids of valid taxonomy and term.\n *\n * The strings of $taxonomies must exist before this function will continue. On\n * failure of finding a valid taxonomy, it will return an WP_Error class, kind\n * of like Exceptions in PHP 5, except you can't catch them. Even so, you can\n * still test for the WP_Error class and get the error message.\n *\n * The $terms aren't checked the same as $taxonomies, but still need to exist\n * for $object_ids to be returned.\n *\n * It is possible to change the order that object_ids is returned by either\n * using PHP sort family functions or using the database by using $args with\n * either ASC or DESC array. The value should be in the key named 'order'.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|array    $term_ids   Term id or array of term ids of terms that will be used.\n * @param string|array $taxonomies String of taxonomy name or Array of string values of taxonomy names.\n * @param array|string $args       Change the order of the object_ids, either ASC or DESC.\n * @return WP_Error|array If the taxonomy does not exist, then WP_Error will be returned. On success.\n *\tthe array can be empty meaning that there are no $object_ids found or it will return the $object_ids found.\n */\nfunction get_objects_in_term( $term_ids, $taxonomies, $args = array() ) {\n\tglobal $wpdb;\n\n\tif ( ! is_array( $term_ids ) ) {\n\t\t$term_ids = array( $term_ids );\n\t}\n\tif ( ! is_array( $taxonomies ) ) {\n\t\t$taxonomies = array( $taxonomies );\n\t}\n\tforeach ( (array) $taxonomies as $taxonomy ) {\n\t\tif ( ! taxonomy_exists( $taxonomy ) ) {\n\t\t\treturn new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );\n\t\t}\n\t}\n\n\t$defaults = array( 'order' => 'ASC' );\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$order = ( 'desc' == strtolower( $args['order'] ) ) ? 'DESC' : 'ASC';\n\n\t$term_ids = array_map('intval', $term_ids );\n\n\t$taxonomies = \"'\" . implode( \"', '\", $taxonomies ) . \"'\";\n\t$term_ids = \"'\" . implode( \"', '\", $term_ids ) . \"'\";\n\n\t$object_ids = $wpdb->get_col(\"SELECT tr.object_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ($taxonomies) AND tt.term_id IN ($term_ids) ORDER BY tr.object_id $order\");\n\n\tif ( ! $object_ids ){\n\t\treturn array();\n\t}\n\treturn $object_ids;\n}\n\n/**\n * Given a taxonomy query, generates SQL to be appended to a main query.\n *\n * @since 3.1.0\n *\n * @see WP_Tax_Query\n *\n * @param array  $tax_query         A compact tax query\n * @param string $primary_table\n * @param string $primary_id_column\n * @return array\n */\nfunction get_tax_sql( $tax_query, $primary_table, $primary_id_column ) {\n\t$tax_query_obj = new WP_Tax_Query( $tax_query );\n\treturn $tax_query_obj->get_sql( $primary_table, $primary_id_column );\n}\n\n/**\n * Get all Term data from database by Term ID.\n *\n * The usage of the get_term function is to apply filters to a term object. It\n * is possible to get a term object from the database before applying the\n * filters.\n *\n * $term ID must be part of $taxonomy, to get from the database. Failure, might\n * be able to be captured by the hooks. Failure would be the same value as $wpdb\n * returns for the get_row method.\n *\n * There are two hooks, one is specifically for each term, named 'get_term', and\n * the second is for the taxonomy name, 'term_$taxonomy'. Both hooks gets the\n * term object, and the taxonomy name as parameters. Both hooks are expected to\n * return a Term object.\n *\n * {@see 'get_term'} hook - Takes two parameters the term Object and the taxonomy name.\n * Must return term object. Used in get_term() as a catch-all filter for every\n * $term.\n *\n * {@see 'get_$taxonomy'} hook - Takes two parameters the term Object and the taxonomy\n * name. Must return term object. $taxonomy will be the taxonomy name, so for\n * example, if 'category', it would be 'get_category' as the filter name. Useful\n * for custom taxonomies or plugging into default taxonomies.\n *\n * @todo Better formatting for DocBlock\n *\n * @since 2.3.0\n * @since 4.4.0 Converted to return a WP_Term object if `$output` is `OBJECT`.\n *              The `$taxonomy` parameter was made optional.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param.\n *\n * @param int|WP_Term|object $term If integer, term data will be fetched from the database, or from the cache if\n *                                 available. If stdClass object (as in the results of a database query), will apply\n *                                 filters and return a `WP_Term` object corresponding to the `$term` data. If `WP_Term`,\n *                                 will return `$term`.\n * @param string     $taxonomy Optional. Taxonomy name that $term is part of.\n * @param string     $output   Constant OBJECT, ARRAY_A, or ARRAY_N\n * @param string     $filter   Optional, default is raw or no WordPress defined filter will applied.\n * @return mixed Type corresponding to `$output` on success or null on failure. When `$output` is `OBJECT`,\n *               a WP_Term instance is returned. If taxonomy does not exist then WP_Error will be returned.\n */\nfunction get_term( $term, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {\n\tif ( empty( $term ) ) {\n\t\treturn new WP_Error( 'invalid_term', __( 'Empty Term' ) );\n\t}\n\n\tif ( $taxonomy && ! taxonomy_exists( $taxonomy ) ) {\n\t\treturn new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );\n\t}\n\n\tif ( $term instanceof WP_Term ) {\n\t\t$_term = $term;\n\t} elseif ( is_object( $term ) ) {\n\t\tif ( empty( $term->filter ) || 'raw' === $term->filter ) {\n\t\t\t$_term = sanitize_term( $term, $taxonomy, 'raw' );\n\t\t\t$_term = new WP_Term( $_term );\n\t\t} else {\n\t\t\t$_term = WP_Term::get_instance( $term->term_id );\n\t\t}\n\t} else {\n\t\t$_term = WP_Term::get_instance( $term, $taxonomy );\n\t}\n\n\tif ( is_wp_error( $_term ) ) {\n\t\treturn $_term;\n\t} elseif ( ! $_term ) {\n\t\treturn null;\n\t}\n\n\t/**\n\t * Filter a term.\n\t *\n\t * @since 2.3.0\n\t * @since 4.4.0 `$_term` can now also be a WP_Term object.\n\t *\n\t * @param int|WP_Term $_term    Term object or ID.\n\t * @param string      $taxonomy The taxonomy slug.\n\t */\n\t$_term = apply_filters( 'get_term', $_term, $taxonomy );\n\n\t/**\n\t * Filter a taxonomy.\n\t *\n\t * The dynamic portion of the filter name, `$taxonomy`, refers\n\t * to the taxonomy slug.\n\t *\n\t * @since 2.3.0\n\t * @since 4.4.0 `$_term` can now also be a WP_Term object.\n\t *\n\t * @param int|WP_Term $_term    Term object or ID.\n\t * @param string      $taxonomy The taxonomy slug.\n\t */\n\t$_term = apply_filters( \"get_$taxonomy\", $_term, $taxonomy );\n\n\t// Sanitize term, according to the specified filter.\n\t$_term->filter( $filter );\n\n\tif ( $output == ARRAY_A ) {\n\t\treturn $_term->to_array();\n\t} elseif ( $output == ARRAY_N ) {\n\t\treturn array_values( $_term->to_array() );\n\t}\n\n\treturn $_term;\n}\n\n/**\n * Get all Term data from database by Term field and data.\n *\n * Warning: $value is not escaped for 'name' $field. You must do it yourself, if\n * required.\n *\n * The default $field is 'id', therefore it is possible to also use null for\n * field, but not recommended that you do so.\n *\n * If $value does not exist, the return value will be false. If $taxonomy exists\n * and $field and $value combinations exist, the Term will be returned.\n *\n * @todo Better formatting for DocBlock.\n *\n * @since 2.3.0\n * @since 4.4.0 `$taxonomy` is optional if `$field` is 'term_taxonomy_id'. Converted to return\n *              a WP_Term object if `$output` is `OBJECT`.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @see sanitize_term_field() The $context param lists the available values for get_term_by() $filter param.\n *\n * @param string     $field    Either 'slug', 'name', 'id' (term_id), or 'term_taxonomy_id'\n * @param string|int $value    Search for this term value\n * @param string     $taxonomy Taxonomy name. Optional, if `$field` is 'term_taxonomy_id'.\n * @param string     $output   Constant OBJECT, ARRAY_A, or ARRAY_N\n * @param string     $filter   Optional, default is raw or no WordPress defined filter will applied.\n * @return WP_Term|bool WP_Term instance on success. Will return false if `$taxonomy` does not exist\n *                      or `$term` was not found.\n */\nfunction get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter = 'raw' ) {\n\tglobal $wpdb;\n\n\t// 'term_taxonomy_id' lookups don't require taxonomy checks.\n\tif ( 'term_taxonomy_id' !== $field && ! taxonomy_exists( $taxonomy ) ) {\n\t\treturn false;\n\t}\n\n\t$tax_clause = $wpdb->prepare( \"AND tt.taxonomy = %s\", $taxonomy );\n\n\tif ( 'slug' == $field ) {\n\t\t$_field = 't.slug';\n\t\t$value = sanitize_title($value);\n\t\tif ( empty($value) )\n\t\t\treturn false;\n\t} elseif ( 'name' == $field ) {\n\t\t// Assume already escaped\n\t\t$value = wp_unslash($value);\n\t\t$_field = 't.name';\n\t} elseif ( 'term_taxonomy_id' == $field ) {\n\t\t$value = (int) $value;\n\t\t$_field = 'tt.term_taxonomy_id';\n\n\t\t// No `taxonomy` clause when searching by 'term_taxonomy_id'.\n\t\t$tax_clause = '';\n\t} else {\n\t\t$term = get_term( (int) $value, $taxonomy, $output, $filter );\n\t\tif ( is_wp_error( $term ) || is_null( $term ) ) {\n\t\t\t$term = false;\n\t\t}\n\t\treturn $term;\n\t}\n\n\t$term = $wpdb->get_row( $wpdb->prepare( \"SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE $_field = %s $tax_clause LIMIT 1\", $value ) );\n\tif ( ! $term )\n\t\treturn false;\n\n\t// In the case of 'term_taxonomy_id', override the provided `$taxonomy` with whatever we find in the db.\n\tif ( 'term_taxonomy_id' === $field ) {\n\t\t$taxonomy = $term->taxonomy;\n\t}\n\n\twp_cache_add( $term->term_id, $term, 'terms' );\n\n\treturn get_term( $term, $taxonomy, $output, $filter );\n}\n\n/**\n * Merge all term children into a single array of their IDs.\n *\n * This recursive function will merge all of the children of $term into the same\n * array of term IDs. Only useful for taxonomies which are hierarchical.\n *\n * Will return an empty array if $term does not exist in $taxonomy.\n *\n * @since 2.3.0\n *\n * @param string $term_id  ID of Term to get children.\n * @param string $taxonomy Taxonomy Name.\n * @return array|WP_Error List of Term IDs. WP_Error returned if `$taxonomy` does not exist.\n */\nfunction get_term_children( $term_id, $taxonomy ) {\n\tif ( ! taxonomy_exists($taxonomy) )\n\t\treturn new WP_Error('invalid_taxonomy', __('Invalid taxonomy'));\n\n\t$term_id = intval( $term_id );\n\n\t$terms = _get_term_hierarchy($taxonomy);\n\n\tif ( ! isset($terms[$term_id]) )\n\t\treturn array();\n\n\t$children = $terms[$term_id];\n\n\tforeach ( (array) $terms[$term_id] as $child ) {\n\t\tif ( $term_id == $child ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( isset($terms[$child]) )\n\t\t\t$children = array_merge($children, get_term_children($child, $taxonomy));\n\t}\n\n\treturn $children;\n}\n\n/**\n * Get sanitized Term field.\n *\n * The function is for contextual reasons and for simplicity of usage.\n *\n * @since 2.3.0\n * @since 4.4.0 The `$taxonomy` parameter was made optional. `$term` can also now accept a WP_Term object.\n *\n * @see sanitize_term_field()\n *\n * @param string      $field    Term field to fetch.\n * @param int|WP_Term $term     Term ID or object.\n * @param string      $taxonomy Optional. Taxonomy Name. Default empty.\n * @param string      $context  Optional, default is display. Look at sanitize_term_field() for available options.\n * @return string|int|null|WP_Error Will return an empty string if $term is not an object or if $field is not set in $term.\n */\nfunction get_term_field( $field, $term, $taxonomy = '', $context = 'display' ) {\n\t$term = get_term( $term, $taxonomy );\n\tif ( is_wp_error($term) )\n\t\treturn $term;\n\n\tif ( !is_object($term) )\n\t\treturn '';\n\n\tif ( !isset($term->$field) )\n\t\treturn '';\n\n\treturn sanitize_term_field( $field, $term->$field, $term->term_id, $term->taxonomy, $context );\n}\n\n/**\n * Sanitizes Term for editing.\n *\n * Return value is sanitize_term() and usage is for sanitizing the term for\n * editing. Function is for contextual and simplicity.\n *\n * @since 2.3.0\n *\n * @param int|object $id       Term ID or object.\n * @param string     $taxonomy Taxonomy name.\n * @return string|int|null|WP_Error Will return empty string if $term is not an object.\n */\nfunction get_term_to_edit( $id, $taxonomy ) {\n\t$term = get_term( $id, $taxonomy );\n\n\tif ( is_wp_error($term) )\n\t\treturn $term;\n\n\tif ( !is_object($term) )\n\t\treturn '';\n\n\treturn sanitize_term($term, $taxonomy, 'edit');\n}\n\n/**\n * Retrieve the terms in a given taxonomy or list of taxonomies.\n *\n * You can fully inject any customizations to the query before it is sent, as\n * well as control the output with a filter.\n *\n * The {@see 'get_terms'} filter will be called when the cache has the term and will\n * pass the found term along with the array of $taxonomies and array of $args.\n * This filter is also called before the array of terms is passed and will pass\n * the array of terms, along with the $taxonomies and $args.\n *\n * The {@see 'list_terms_exclusions'} filter passes the compiled exclusions along with\n * the $args.\n *\n * The {@see 'get_terms_orderby'} filter passes the `ORDER BY` clause for the query\n * along with the $args array.\n *\n * @since 2.3.0\n * @since 4.2.0 Introduced 'name' and 'childless' parameters.\n * @since 4.4.0 Introduced the ability to pass 'term_id' as an alias of 'id' for the `orderby` parameter.\n *              Introduced the 'meta_query' and 'update_term_meta_cache' parameters. Converted to return\n *              a list of WP_Term objects.\n *\n * @global wpdb  $wpdb WordPress database abstraction object.\n * @global array $wp_filter\n *\n * @param string|array $taxonomies Taxonomy name or list of Taxonomy names.\n * @param array|string $args {\n *     Optional. Array or string of arguments to get terms.\n *\n *     @type string       $orderby                Field(s) to order terms by. Accepts term fields ('name', 'slug',\n *                                                'term_group', 'term_id', 'id', 'description'), 'count' for term\n *                                                taxonomy count, 'include' to match the 'order' of the $include param,\n *                                                or 'none' to skip ORDER BY. Defaults to 'name'.\n *     @type string       $order                  Whether to order terms in ascending or descending order.\n *                                                Accepts 'ASC' (ascending) or 'DESC' (descending).\n *                                                Default 'ASC'.\n *     @type bool|int     $hide_empty             Whether to hide terms not assigned to any posts. Accepts\n *                                                1|true or 0|false. Default 1|true.\n *     @type array|string $include                Array or comma/space-separated string of term ids to include.\n *                                                Default empty array.\n *     @type array|string $exclude                Array or comma/space-separated string of term ids to exclude.\n *                                                If $include is non-empty, $exclude is ignored.\n *                                                Default empty array.\n *     @type array|string $exclude_tree           Array or comma/space-separated string of term ids to exclude\n *                                                along with all of their descendant terms. If $include is\n *                                                non-empty, $exclude_tree is ignored. Default empty array.\n *     @type int|string   $number                 Maximum number of terms to return. Accepts ''|0 (all) or any\n *                                                positive number. Default ''|0 (all).\n *     @type int          $offset                 The number by which to offset the terms query. Default empty.\n *     @type string       $fields                 Term fields to query for. Accepts 'all' (returns an array of complete\n *                                                term objects), 'ids' (returns an array of ids), 'id=>parent' (returns\n *                                                an associative array with ids as keys, parent term IDs as values),\n *                                                'names' (returns an array of term names), 'count' (returns the number\n *                                                of matching terms), 'id=>name' (returns an associative array with ids\n *                                                as keys, term names as values), or 'id=>slug' (returns an associative\n *                                                array with ids as keys, term slugs as values). Default 'all'.\n *     @type string|array $name                   Optional. Name or array of names to return term(s) for. Default empty.\n *     @type string|array $slug                   Optional. Slug or array of slugs to return term(s) for. Default empty.\n *     @type bool         $hierarchical           Whether to include terms that have non-empty descendants (even\n *                                                if $hide_empty is set to true). Default true.\n *     @type string       $search                 Search criteria to match terms. Will be SQL-formatted with\n *                                                wildcards before and after. Default empty.\n *     @type string       $name__like             Retrieve terms with criteria by which a term is LIKE $name__like.\n *                                                Default empty.\n *     @type string       $description__like      Retrieve terms where the description is LIKE $description__like.\n *                                                Default empty.\n *     @type bool         $pad_counts             Whether to pad the quantity of a term's children in the quantity\n *                                                of each term's \"count\" object variable. Default false.\n *     @type string       $get                    Whether to return terms regardless of ancestry or whether the terms\n *                                                are empty. Accepts 'all' or empty (disabled). Default empty.\n *     @type int          $child_of               Term ID to retrieve child terms of. If multiple taxonomies\n *                                                are passed, $child_of is ignored. Default 0.\n *     @type int|string   $parent                 Parent term ID to retrieve direct-child terms of. Default empty.\n *     @type bool         $childless              True to limit results to terms that have no children. This parameter\n *                                                has no effect on non-hierarchical taxonomies. Default false.\n *     @type string       $cache_domain           Unique cache key to be produced when this query is stored in an\n *                                                object cache. Default is 'core'.\n *     @type bool         $update_term_meta_cache Whether to prime meta caches for matched terms. Default true.\n *     @type array        $meta_query             Meta query clauses to limit retrieved terms by.\n *                                                See `WP_Meta_Query`. Default empty.\n * }\n * @return array|int|WP_Error List of WP_Term instances and their children. Will return WP_Error, if any of $taxonomies\n *                            do not exist.\n */\nfunction get_terms( $taxonomies, $args = '' ) {\n\tglobal $wpdb;\n\t$empty_array = array();\n\n\t$single_taxonomy = ! is_array( $taxonomies ) || 1 === count( $taxonomies );\n\tif ( ! is_array( $taxonomies ) ) {\n\t\t$taxonomies = array( $taxonomies );\n\t}\n\n\tforeach ( $taxonomies as $taxonomy ) {\n\t\tif ( ! taxonomy_exists($taxonomy) ) {\n\t\t\treturn new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );\n\t\t}\n\t}\n\n\t$defaults = array(\n\t\t'orderby'                => 'name',\n\t\t'order'                  => 'ASC',\n\t\t'hide_empty'             => true,\n\t\t'include'                => array(),\n\t\t'exclude'                => array(),\n\t\t'exclude_tree'           => array(),\n\t\t'number'                 => '',\n\t\t'offset'                 => '',\n\t\t'fields'                 => 'all',\n\t\t'name'                   => '',\n\t\t'slug'                   => '',\n\t\t'hierarchical'           => true,\n\t\t'search'                 => '',\n\t\t'name__like'             => '',\n\t\t'description__like'      => '',\n\t\t'pad_counts'             => false,\n\t\t'get'                    => '',\n\t\t'child_of'               => 0,\n\t\t'parent'                 => '',\n\t\t'childless'              => false,\n\t\t'cache_domain'           => 'core',\n\t\t'update_term_meta_cache' => true,\n\t\t'meta_query'             => ''\n\t);\n\n\t/**\n\t * Filter the terms query default arguments.\n\t *\n\t * Use 'get_terms_args' to filter the passed arguments.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $defaults   An array of default get_terms() arguments.\n\t * @param array $taxonomies An array of taxonomies.\n\t */\n\t$args = wp_parse_args( $args, apply_filters( 'get_terms_defaults', $defaults, $taxonomies ) );\n\n\t$args['number'] = absint( $args['number'] );\n\t$args['offset'] = absint( $args['offset'] );\n\n\t// Save queries by not crawling the tree in the case of multiple taxes or a flat tax.\n\t$has_hierarchical_tax = false;\n\tforeach ( $taxonomies as $_tax ) {\n\t\tif ( is_taxonomy_hierarchical( $_tax ) ) {\n\t\t\t$has_hierarchical_tax = true;\n\t\t}\n\t}\n\n\tif ( ! $has_hierarchical_tax ) {\n\t\t$args['hierarchical'] = false;\n\t\t$args['pad_counts'] = false;\n\t}\n\n\t// 'parent' overrides 'child_of'.\n\tif ( 0 < intval( $args['parent'] ) ) {\n\t\t$args['child_of'] = false;\n\t}\n\n\tif ( 'all' == $args['get'] ) {\n\t\t$args['childless'] = false;\n\t\t$args['child_of'] = 0;\n\t\t$args['hide_empty'] = 0;\n\t\t$args['hierarchical'] = false;\n\t\t$args['pad_counts'] = false;\n\t}\n\n\t/**\n\t * Filter the terms query arguments.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array $args       An array of get_terms() arguments.\n\t * @param array $taxonomies An array of taxonomies.\n\t */\n\t$args = apply_filters( 'get_terms_args', $args, $taxonomies );\n\n\t// Avoid the query if the queried parent/child_of term has no descendants.\n\t$child_of = $args['child_of'];\n\t$parent   = $args['parent'];\n\n\tif ( $child_of ) {\n\t\t$_parent = $child_of;\n\t} elseif ( $parent ) {\n\t\t$_parent = $parent;\n\t} else {\n\t\t$_parent = false;\n\t}\n\n\tif ( $_parent ) {\n\t\t$in_hierarchy = false;\n\t\tforeach ( $taxonomies as $_tax ) {\n\t\t\t$hierarchy = _get_term_hierarchy( $_tax );\n\n\t\t\tif ( isset( $hierarchy[ $_parent ] ) ) {\n\t\t\t\t$in_hierarchy = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $in_hierarchy ) {\n\t\t\treturn $empty_array;\n\t\t}\n\t}\n\n\t$_orderby = strtolower( $args['orderby'] );\n\tif ( 'count' == $_orderby ) {\n\t\t$orderby = 'tt.count';\n\t} elseif ( 'name' == $_orderby ) {\n\t\t$orderby = 't.name';\n\t} elseif ( 'slug' == $_orderby ) {\n\t\t$orderby = 't.slug';\n\t} elseif ( 'include' == $_orderby && ! empty( $args['include'] ) ) {\n\t\t$include = implode( ',', array_map( 'absint', $args['include'] ) );\n\t\t$orderby = \"FIELD( t.term_id, $include )\";\n\t} elseif ( 'term_group' == $_orderby ) {\n\t\t$orderby = 't.term_group';\n\t} elseif ( 'description' == $_orderby ) {\n\t\t$orderby = 'tt.description';\n\t} elseif ( 'none' == $_orderby ) {\n\t\t$orderby = '';\n\t} elseif ( empty( $_orderby ) || 'id' == $_orderby || 'term_id' === $_orderby ) {\n\t\t$orderby = 't.term_id';\n\t} else {\n\t\t$orderby = 't.name';\n\t}\n\n\t/**\n\t * Filter the ORDERBY clause of the terms query.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $orderby    `ORDERBY` clause of the terms query.\n\t * @param array  $args       An array of terms query arguments.\n\t * @param array  $taxonomies An array of taxonomies.\n\t */\n\t$orderby = apply_filters( 'get_terms_orderby', $orderby, $args, $taxonomies );\n\n\t$order = strtoupper( $args['order'] );\n\tif ( ! empty( $orderby ) ) {\n\t\t$orderby = \"ORDER BY $orderby\";\n\t} else {\n\t\t$order = '';\n\t}\n\n\tif ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ) ) ) {\n\t\t$order = 'ASC';\n\t}\n\n\t$where = \"tt.taxonomy IN ('\" . implode(\"', '\", $taxonomies) . \"')\";\n\n\t$exclude = $args['exclude'];\n\t$exclude_tree = $args['exclude_tree'];\n\t$include = $args['include'];\n\n\t$inclusions = '';\n\tif ( ! empty( $include ) ) {\n\t\t$exclude = '';\n\t\t$exclude_tree = '';\n\t\t$inclusions = implode( ',', wp_parse_id_list( $include ) );\n\t}\n\n\tif ( ! empty( $inclusions ) ) {\n\t\t$inclusions = ' AND t.term_id IN ( ' . $inclusions . ' )';\n\t\t$where .= $inclusions;\n\t}\n\n\t$exclusions = array();\n\tif ( ! empty( $exclude_tree ) ) {\n\t\t$exclude_tree = wp_parse_id_list( $exclude_tree );\n\t\t$excluded_children = $exclude_tree;\n\t\tforeach ( $exclude_tree as $extrunk ) {\n\t\t\t$excluded_children = array_merge(\n\t\t\t\t$excluded_children,\n\t\t\t\t(array) get_terms( $taxonomies[0], array( 'child_of' => intval( $extrunk ), 'fields' => 'ids', 'hide_empty' => 0 ) )\n\t\t\t);\n\t\t}\n\t\t$exclusions = array_merge( $excluded_children, $exclusions );\n\t}\n\n\tif ( ! empty( $exclude ) ) {\n\t\t$exclusions = array_merge( wp_parse_id_list( $exclude ), $exclusions );\n\t}\n\n\t// 'childless' terms are those without an entry in the flattened term hierarchy.\n\t$childless = (bool) $args['childless'];\n\tif ( $childless ) {\n\t\tforeach ( $taxonomies as $_tax ) {\n\t\t\t$term_hierarchy = _get_term_hierarchy( $_tax );\n\t\t\t$exclusions = array_merge( array_keys( $term_hierarchy ), $exclusions );\n\t\t}\n\t}\n\n\tif ( ! empty( $exclusions ) ) {\n\t\t$exclusions = ' AND t.term_id NOT IN (' . implode( ',', array_map( 'intval', $exclusions ) ) . ')';\n\t} else {\n\t\t$exclusions = '';\n\t}\n\n\t/**\n\t * Filter the terms to exclude from the terms query.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $exclusions `NOT IN` clause of the terms query.\n\t * @param array  $args       An array of terms query arguments.\n\t * @param array  $taxonomies An array of taxonomies.\n\t */\n\t$exclusions = apply_filters( 'list_terms_exclusions', $exclusions, $args, $taxonomies );\n\n\tif ( ! empty( $exclusions ) ) {\n\t\t$where .= $exclusions;\n\t}\n\n\tif ( ! empty( $args['name'] ) ) {\n\t\t$names = (array) $args['name'];\n\t\tforeach ( $names as &$_name ) {\n\t\t\t$_name = sanitize_term_field( 'name', $_name, 0, reset( $taxonomies ), 'db' );\n\t\t}\n\n\t\t$where .= \" AND t.name IN ('\" . implode( \"', '\", array_map( 'esc_sql', $names ) ) . \"')\";\n\t}\n\n\tif ( ! empty( $args['slug'] ) ) {\n\t\tif ( is_array( $args['slug'] ) ) {\n\t\t\t$slug = array_map( 'sanitize_title', $args['slug'] );\n\t\t\t$where .= \" AND t.slug IN ('\" . implode( \"', '\", $slug ) . \"')\";\n\t\t} else {\n\t\t\t$slug = sanitize_title( $args['slug'] );\n\t\t\t$where .= \" AND t.slug = '$slug'\";\n\t\t}\n\t}\n\n\tif ( ! empty( $args['name__like'] ) ) {\n\t\t$where .= $wpdb->prepare( \" AND t.name LIKE %s\", '%' . $wpdb->esc_like( $args['name__like'] ) . '%' );\n\t}\n\n\tif ( ! empty( $args['description__like'] ) ) {\n\t\t$where .= $wpdb->prepare( \" AND tt.description LIKE %s\", '%' . $wpdb->esc_like( $args['description__like'] ) . '%' );\n\t}\n\n\tif ( '' !== $parent ) {\n\t\t$parent = (int) $parent;\n\t\t$where .= \" AND tt.parent = '$parent'\";\n\t}\n\n\t$hierarchical = $args['hierarchical'];\n\tif ( 'count' == $args['fields'] ) {\n\t\t$hierarchical = false;\n\t}\n\tif ( $args['hide_empty'] && !$hierarchical ) {\n\t\t$where .= ' AND tt.count > 0';\n\t}\n\n\t$number = $args['number'];\n\t$offset = $args['offset'];\n\n\t// Don't limit the query results when we have to descend the family tree.\n\tif ( $number && ! $hierarchical && ! $child_of && '' === $parent ) {\n\t\tif ( $offset ) {\n\t\t\t$limits = 'LIMIT ' . $offset . ',' . $number;\n\t\t} else {\n\t\t\t$limits = 'LIMIT ' . $number;\n\t\t}\n\t} else {\n\t\t$limits = '';\n\t}\n\n\tif ( ! empty( $args['search'] ) ) {\n\t\t$like = '%' . $wpdb->esc_like( $args['search'] ) . '%';\n\t\t$where .= $wpdb->prepare( ' AND ((t.name LIKE %s) OR (t.slug LIKE %s))', $like, $like );\n\t}\n\n\t// Meta query support.\n\t$join = '';\n\t$distinct = '';\n\tif ( ! empty( $args['meta_query'] ) ) {\n\t\t$mquery = new WP_Meta_Query( $args['meta_query'] );\n\t\t$mq_sql = $mquery->get_sql( 'term', 't', 'term_id' );\n\n\t\t$join  .= $mq_sql['join'];\n\t\t$where .= $mq_sql['where'];\n\t\t$distinct .= \"DISTINCT\";\n\t}\n\n\t$selects = array();\n\tswitch ( $args['fields'] ) {\n\t\tcase 'all':\n\t\t\t$selects = array( 't.*', 'tt.*' );\n\t\t\tbreak;\n\t\tcase 'ids':\n\t\tcase 'id=>parent':\n\t\t\t$selects = array( 't.term_id', 'tt.parent', 'tt.count', 'tt.taxonomy' );\n\t\t\tbreak;\n\t\tcase 'names':\n\t\t\t$selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.taxonomy' );\n\t\t\tbreak;\n\t\tcase 'count':\n\t\t\t$orderby = '';\n\t\t\t$order = '';\n\t\t\t$selects = array( 'COUNT(*)' );\n\t\t\tbreak;\n\t\tcase 'id=>name':\n\t\t\t$selects = array( 't.term_id', 't.name', 'tt.count', 'tt.taxonomy' );\n\t\t\tbreak;\n\t\tcase 'id=>slug':\n\t\t\t$selects = array( 't.term_id', 't.slug', 'tt.count', 'tt.taxonomy' );\n\t\t\tbreak;\n\t}\n\n\t$_fields = $args['fields'];\n\n\t/**\n\t * Filter the fields to select in the terms query.\n\t *\n\t * Field lists modified using this filter will only modify the term fields returned\n\t * by the function when the `$fields` parameter set to 'count' or 'all'. In all other\n\t * cases, the term fields in the results array will be determined by the `$fields`\n\t * parameter alone.\n\t *\n\t * Use of this filter can result in unpredictable behavior, and is not recommended.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array $selects    An array of fields to select for the terms query.\n\t * @param array $args       An array of term query arguments.\n\t * @param array $taxonomies An array of taxonomies.\n\t */\n\t$fields = implode( ', ', apply_filters( 'get_terms_fields', $selects, $args, $taxonomies ) );\n\n\t$join .= \" INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id\";\n\n\t$pieces = array( 'fields', 'join', 'where', 'distinct', 'orderby', 'order', 'limits' );\n\n\t/**\n\t * Filter the terms query SQL clauses.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param array $pieces     Terms query SQL clauses.\n\t * @param array $taxonomies An array of taxonomies.\n\t * @param array $args       An array of terms query arguments.\n\t */\n\t$clauses = apply_filters( 'terms_clauses', compact( $pieces ), $taxonomies, $args );\n\n\t$fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : '';\n\t$join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : '';\n\t$where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : '';\n\t$distinct = isset( $clauses[ 'distinct' ] ) ? $clauses[ 'distinct' ] : '';\n\t$orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : '';\n\t$order = isset( $clauses[ 'order' ] ) ? $clauses[ 'order' ] : '';\n\t$limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : '';\n\n\t$query = \"SELECT $distinct $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits\";\n\n\t// $args can be anything. Only use the args defined in defaults to compute the key.\n\t$key = md5( serialize( wp_array_slice_assoc( $args, array_keys( $defaults ) ) ) . serialize( $taxonomies ) . $query );\n\t$last_changed = wp_cache_get( 'last_changed', 'terms' );\n\tif ( ! $last_changed ) {\n\t\t$last_changed = microtime();\n\t\twp_cache_set( 'last_changed', $last_changed, 'terms' );\n\t}\n\t$cache_key = \"get_terms:$key:$last_changed\";\n\t$cache = wp_cache_get( $cache_key, 'terms' );\n\tif ( false !== $cache ) {\n\t\tif ( 'all' === $_fields ) {\n\t\t\t$cache = array_map( 'get_term', $cache );\n\t\t}\n\n\t\t/**\n\t\t * Filter the given taxonomy's terms cache.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param array $cache      Cached array of terms for the given taxonomy.\n\t\t * @param array $taxonomies An array of taxonomies.\n\t\t * @param array $args       An array of get_terms() arguments.\n\t\t */\n\t\treturn apply_filters( 'get_terms', $cache, $taxonomies, $args );\n\t}\n\n\tif ( 'count' == $_fields ) {\n\t\treturn $wpdb->get_var( $query );\n\t}\n\n\t$terms = $wpdb->get_results($query);\n\tif ( 'all' == $_fields ) {\n\t\tupdate_term_cache( $terms );\n\t}\n\n\t// Prime termmeta cache.\n\tif ( $args['update_term_meta_cache'] ) {\n\t\t$term_ids = wp_list_pluck( $terms, 'term_id' );\n\t\tupdate_termmeta_cache( $term_ids );\n\t}\n\n\tif ( empty($terms) ) {\n\t\twp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS );\n\n\t\t/** This filter is documented in wp-includes/taxonomy.php */\n\t\treturn apply_filters( 'get_terms', array(), $taxonomies, $args );\n\t}\n\n\tif ( $child_of ) {\n\t\tforeach ( $taxonomies as $_tax ) {\n\t\t\t$children = _get_term_hierarchy( $_tax );\n\t\t\tif ( ! empty( $children ) ) {\n\t\t\t\t$terms = _get_term_children( $child_of, $terms, $_tax );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Update term counts to include children.\n\tif ( $args['pad_counts'] && 'all' == $_fields ) {\n\t\tforeach ( $taxonomies as $_tax ) {\n\t\t\t_pad_term_counts( $terms, $_tax );\n\t\t}\n\t}\n\n\t// Make sure we show empty categories that have children.\n\tif ( $hierarchical && $args['hide_empty'] && is_array( $terms ) ) {\n\t\tforeach ( $terms as $k => $term ) {\n\t\t\tif ( ! $term->count ) {\n\t\t\t\t$children = get_term_children( $term->term_id, $term->taxonomy );\n\t\t\t\tif ( is_array( $children ) ) {\n\t\t\t\t\tforeach ( $children as $child_id ) {\n\t\t\t\t\t\t$child = get_term( $child_id, $term->taxonomy );\n\t\t\t\t\t\tif ( $child->count ) {\n\t\t\t\t\t\t\tcontinue 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// It really is empty.\n\t\t\t\tunset($terms[$k]);\n\t\t\t}\n\t\t}\n\t}\n\n\t$_terms = array();\n\tif ( 'id=>parent' == $_fields ) {\n\t\tforeach ( $terms as $term ) {\n\t\t\t$_terms[ $term->term_id ] = $term->parent;\n\t\t}\n\t} elseif ( 'ids' == $_fields ) {\n\t\tforeach ( $terms as $term ) {\n\t\t\t$_terms[] = $term->term_id;\n\t\t}\n\t} elseif ( 'names' == $_fields ) {\n\t\tforeach ( $terms as $term ) {\n\t\t\t$_terms[] = $term->name;\n\t\t}\n\t} elseif ( 'id=>name' == $_fields ) {\n\t\tforeach ( $terms as $term ) {\n\t\t\t$_terms[ $term->term_id ] = $term->name;\n\t\t}\n\t} elseif ( 'id=>slug' == $_fields ) {\n\t\tforeach ( $terms as $term ) {\n\t\t\t$_terms[ $term->term_id ] = $term->slug;\n\t\t}\n\t}\n\n\tif ( ! empty( $_terms ) ) {\n\t\t$terms = $_terms;\n\t}\n\n\tif ( $number && is_array( $terms ) && count( $terms ) > $number ) {\n\t\t$terms = array_slice( $terms, $offset, $number );\n\t}\n\n\twp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS );\n\n\tif ( 'all' === $_fields ) {\n\t\t$terms = array_map( 'get_term', $terms );\n\t}\n\n\t/** This filter is documented in wp-includes/taxonomy.php */\n\treturn apply_filters( 'get_terms', $terms, $taxonomies, $args );\n}\n\n/**\n * Adds metadata to a term.\n *\n * @since 4.4.0\n *\n * @param int    $term_id    Term ID.\n * @param string $meta_key   Metadata name.\n * @param mixed  $meta_value Metadata value.\n * @param bool   $unique     Optional. Whether to bail if an entry with the same key is found for the term.\n *                           Default false.\n * @return int|WP_Error|bool Meta ID on success. WP_Error when term_id is ambiguous between taxonomies.\n *                           False on failure.\n */\nfunction add_term_meta( $term_id, $meta_key, $meta_value, $unique = false ) {\n\t// Bail if term meta table is not installed.\n\tif ( get_option( 'db_version' ) < 34370 ) {\n\t\treturn false;\n\t}\n\n\tif ( wp_term_is_shared( $term_id ) ) {\n\t\treturn new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.'), $term_id );\n\t}\n\n\t$added = add_metadata( 'term', $term_id, $meta_key, $meta_value, $unique );\n\n\t// Bust term query cache.\n\tif ( $added ) {\n\t\twp_cache_set( 'last_changed', microtime(), 'terms' );\n\t}\n\n\treturn $added;\n}\n\n/**\n * Removes metadata matching criteria from a term.\n *\n * @since 4.4.0\n *\n * @param int    $term_id    Term ID.\n * @param string $meta_key   Metadata name.\n * @param mixed  $meta_value Optional. Metadata value. If provided, rows will only be removed that match the value.\n * @return bool True on success, false on failure.\n */\nfunction delete_term_meta( $term_id, $meta_key, $meta_value = '' ) {\n\t// Bail if term meta table is not installed.\n\tif ( get_option( 'db_version' ) < 34370 ) {\n\t\treturn false;\n\t}\n\n\t$deleted = delete_metadata( 'term', $term_id, $meta_key, $meta_value );\n\n\t// Bust term query cache.\n\tif ( $deleted ) {\n\t\twp_cache_set( 'last_changed', microtime(), 'terms' );\n\t}\n\n\treturn $deleted;\n}\n\n/**\n * Retrieves metadata for a term.\n *\n * @since 4.4.0\n *\n * @param int    $term_id Term ID.\n * @param string $key     Optional. The meta key to retrieve. If no key is provided, fetches all metadata for the term.\n * @param bool   $single  Whether to return a single value. If false, an array of all values matching the\n *                        `$term_id`/`$key` pair will be returned. Default: false.\n * @return mixed If `$single` is false, an array of metadata values. If `$single` is true, a single metadata value.\n */\nfunction get_term_meta( $term_id, $key = '', $single = false ) {\n\t// Bail if term meta table is not installed.\n\tif ( get_option( 'db_version' ) < 34370 ) {\n\t\treturn false;\n\t}\n\n\treturn get_metadata( 'term', $term_id, $key, $single );\n}\n\n/**\n * Updates term metadata.\n *\n * Use the `$prev_value` parameter to differentiate between meta fields with the same key and term ID.\n *\n * If the meta field for the term does not exist, it will be added.\n *\n * @since 4.4.0\n *\n * @param int    $term_id    Term ID.\n * @param string $meta_key   Metadata key.\n * @param mixed  $meta_value Metadata value.\n * @param mixed  $prev_value Optional. Previous value to check before removing.\n * @return int|WP_Error|bool Meta ID if the key didn't previously exist. True on successful update.\n *                           WP_Error when term_id is ambiguous between taxonomies. False on failure.\n */\nfunction update_term_meta( $term_id, $meta_key, $meta_value, $prev_value = '' ) {\n\t// Bail if term meta table is not installed.\n\tif ( get_option( 'db_version' ) < 34370 ) {\n\t\treturn false;\n\t}\n\n\tif ( wp_term_is_shared( $term_id ) ) {\n\t\treturn new WP_Error( 'ambiguous_term_id', __( 'Term meta cannot be added to terms that are shared between taxonomies.'), $term_id );\n\t}\n\n\t$updated = update_metadata( 'term', $term_id, $meta_key, $meta_value, $prev_value );\n\n\t// Bust term query cache.\n\tif ( $updated ) {\n\t\twp_cache_set( 'last_changed', microtime(), 'terms' );\n\t}\n\n\treturn $updated;\n}\n\n/**\n * Updates metadata cache for list of term IDs.\n *\n * Performs SQL query to retrieve all metadata for the terms matching `$term_ids` and stores them in the cache.\n * Subsequent calls to `get_term_meta()` will not need to query the database.\n *\n * @since 4.4.0\n *\n * @param array $term_ids List of term IDs.\n * @return array|false Returns false if there is nothing to update. Returns an array of metadata on success.\n */\nfunction update_termmeta_cache( $term_ids ) {\n\t// Bail if term meta table is not installed.\n\tif ( get_option( 'db_version' ) < 34370 ) {\n\t\treturn;\n\t}\n\n\treturn update_meta_cache( 'term', $term_ids );\n}\n\n/**\n * Check if Term exists.\n *\n * Formerly is_term(), introduced in 2.3.0.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|string $term     The term to check\n * @param string     $taxonomy The taxonomy name to use\n * @param int        $parent   Optional. ID of parent term under which to confine the exists search.\n * @return mixed Returns null if the term does not exist. Returns the term ID\n *               if no taxonomy is specified and the term ID exists. Returns\n *               an array of the term ID and the term taxonomy ID the taxonomy\n *               is specified and the pairing exists.\n */\nfunction term_exists( $term, $taxonomy = '', $parent = null ) {\n\tglobal $wpdb;\n\n\t$select = \"SELECT term_id FROM $wpdb->terms as t WHERE \";\n\t$tax_select = \"SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE \";\n\n\tif ( is_int($term) ) {\n\t\tif ( 0 == $term )\n\t\t\treturn 0;\n\t\t$where = 't.term_id = %d';\n\t\tif ( !empty($taxonomy) )\n\t\t\treturn $wpdb->get_row( $wpdb->prepare( $tax_select . $where . \" AND tt.taxonomy = %s\", $term, $taxonomy ), ARRAY_A );\n\t\telse\n\t\t\treturn $wpdb->get_var( $wpdb->prepare( $select . $where, $term ) );\n\t}\n\n\t$term = trim( wp_unslash( $term ) );\n\t$slug = sanitize_title( $term );\n\n\t$where = 't.slug = %s';\n\t$else_where = 't.name = %s';\n\t$where_fields = array($slug);\n\t$else_where_fields = array($term);\n\t$orderby = 'ORDER BY t.term_id ASC';\n\t$limit = 'LIMIT 1';\n\tif ( !empty($taxonomy) ) {\n\t\tif ( is_numeric( $parent ) ) {\n\t\t\t$parent = (int) $parent;\n\t\t\t$where_fields[] = $parent;\n\t\t\t$else_where_fields[] = $parent;\n\t\t\t$where .= ' AND tt.parent = %d';\n\t\t\t$else_where .= ' AND tt.parent = %d';\n\t\t}\n\n\t\t$where_fields[] = $taxonomy;\n\t\t$else_where_fields[] = $taxonomy;\n\n\t\tif ( $result = $wpdb->get_row( $wpdb->prepare(\"SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $where AND tt.taxonomy = %s $orderby $limit\", $where_fields), ARRAY_A) )\n\t\t\treturn $result;\n\n\t\treturn $wpdb->get_row( $wpdb->prepare(\"SELECT tt.term_id, tt.term_taxonomy_id FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_id = t.term_id WHERE $else_where AND tt.taxonomy = %s $orderby $limit\", $else_where_fields), ARRAY_A);\n\t}\n\n\tif ( $result = $wpdb->get_var( $wpdb->prepare(\"SELECT term_id FROM $wpdb->terms as t WHERE $where $orderby $limit\", $where_fields) ) )\n\t\treturn $result;\n\n\treturn $wpdb->get_var( $wpdb->prepare(\"SELECT term_id FROM $wpdb->terms as t WHERE $else_where $orderby $limit\", $else_where_fields) );\n}\n\n/**\n * Check if a term is an ancestor of another term.\n *\n * You can use either an id or the term object for both parameters.\n *\n * @since 3.4.0\n *\n * @param int|object $term1    ID or object to check if this is the parent term.\n * @param int|object $term2    The child term.\n * @param string     $taxonomy Taxonomy name that $term1 and `$term2` belong to.\n * @return bool Whether `$term2` is a child of `$term1`.\n */\nfunction term_is_ancestor_of( $term1, $term2, $taxonomy ) {\n\tif ( ! isset( $term1->term_id ) )\n\t\t$term1 = get_term( $term1, $taxonomy );\n\tif ( ! isset( $term2->parent ) )\n\t\t$term2 = get_term( $term2, $taxonomy );\n\n\tif ( empty( $term1->term_id ) || empty( $term2->parent ) )\n\t\treturn false;\n\tif ( $term2->parent == $term1->term_id )\n\t\treturn true;\n\n\treturn term_is_ancestor_of( $term1, get_term( $term2->parent, $taxonomy ), $taxonomy );\n}\n\n/**\n * Sanitize Term all fields.\n *\n * Relies on sanitize_term_field() to sanitize the term. The difference is that\n * this function will sanitize <strong>all</strong> fields. The context is based\n * on sanitize_term_field().\n *\n * The $term is expected to be either an array or an object.\n *\n * @since 2.3.0\n *\n * @param array|object $term     The term to check.\n * @param string       $taxonomy The taxonomy name to use.\n * @param string       $context  Optional. Context in which to sanitize the term. Accepts 'edit', 'db',\n *                               'display', 'attribute', or 'js'. Default 'display'.\n * @return array|object Term with all fields sanitized.\n */\nfunction sanitize_term($term, $taxonomy, $context = 'display') {\n\t$fields = array( 'term_id', 'name', 'description', 'slug', 'count', 'parent', 'term_group', 'term_taxonomy_id', 'object_id' );\n\n\t$do_object = is_object( $term );\n\n\t$term_id = $do_object ? $term->term_id : (isset($term['term_id']) ? $term['term_id'] : 0);\n\n\tforeach ( (array) $fields as $field ) {\n\t\tif ( $do_object ) {\n\t\t\tif ( isset($term->$field) )\n\t\t\t\t$term->$field = sanitize_term_field($field, $term->$field, $term_id, $taxonomy, $context);\n\t\t} else {\n\t\t\tif ( isset($term[$field]) )\n\t\t\t\t$term[$field] = sanitize_term_field($field, $term[$field], $term_id, $taxonomy, $context);\n\t\t}\n\t}\n\n\tif ( $do_object )\n\t\t$term->filter = $context;\n\telse\n\t\t$term['filter'] = $context;\n\n\treturn $term;\n}\n\n/**\n * Cleanse the field value in the term based on the context.\n *\n * Passing a term field value through the function should be assumed to have\n * cleansed the value for whatever context the term field is going to be used.\n *\n * If no context or an unsupported context is given, then default filters will\n * be applied.\n *\n * There are enough filters for each context to support a custom filtering\n * without creating your own filter function. Simply create a function that\n * hooks into the filter you need.\n *\n * @since 2.3.0\n *\n * @param string $field    Term field to sanitize.\n * @param string $value    Search for this term value.\n * @param int    $term_id  Term ID.\n * @param string $taxonomy Taxonomy Name.\n * @param string $context  Context in which to sanitize the term field. Accepts 'edit', 'db', 'display',\n *                         'attribute', or 'js'.\n * @return mixed Sanitized field.\n */\nfunction sanitize_term_field($field, $value, $term_id, $taxonomy, $context) {\n\t$int_fields = array( 'parent', 'term_id', 'count', 'term_group', 'term_taxonomy_id', 'object_id' );\n\tif ( in_array( $field, $int_fields ) ) {\n\t\t$value = (int) $value;\n\t\tif ( $value < 0 )\n\t\t\t$value = 0;\n\t}\n\n\tif ( 'raw' == $context )\n\t\treturn $value;\n\n\tif ( 'edit' == $context ) {\n\n\t\t/**\n\t\t * Filter a term field to edit before it is sanitized.\n\t\t *\n\t\t * The dynamic portion of the filter name, `$field`, refers to the term field.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param mixed $value     Value of the term field.\n\t\t * @param int   $term_id   Term ID.\n\t\t * @param string $taxonomy Taxonomy slug.\n\t\t */\n\t\t$value = apply_filters( \"edit_term_{$field}\", $value, $term_id, $taxonomy );\n\n\t\t/**\n\t\t * Filter the taxonomy field to edit before it is sanitized.\n\t\t *\n\t\t * The dynamic portions of the filter name, `$taxonomy` and `$field`, refer\n\t\t * to the taxonomy slug and taxonomy field, respectively.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param mixed $value   Value of the taxonomy field to edit.\n\t\t * @param int   $term_id Term ID.\n\t\t */\n\t\t$value = apply_filters( \"edit_{$taxonomy}_{$field}\", $value, $term_id );\n\n\t\tif ( 'description' == $field )\n\t\t\t$value = esc_html($value); // textarea_escaped\n\t\telse\n\t\t\t$value = esc_attr($value);\n\t} elseif ( 'db' == $context ) {\n\n\t\t/**\n\t\t * Filter a term field value before it is sanitized.\n\t\t *\n\t\t * The dynamic portion of the filter name, `$field`, refers to the term field.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param mixed  $value    Value of the term field.\n\t\t * @param string $taxonomy Taxonomy slug.\n\t\t */\n\t\t$value = apply_filters( \"pre_term_{$field}\", $value, $taxonomy );\n\n\t\t/**\n\t\t * Filter a taxonomy field before it is sanitized.\n\t\t *\n\t\t * The dynamic portions of the filter name, `$taxonomy` and `$field`, refer\n\t\t * to the taxonomy slug and field name, respectively.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param mixed $value Value of the taxonomy field.\n\t\t */\n\t\t$value = apply_filters( \"pre_{$taxonomy}_{$field}\", $value );\n\n\t\t// Back compat filters\n\t\tif ( 'slug' == $field ) {\n\t\t\t/**\n\t\t\t * Filter the category nicename before it is sanitized.\n\t\t\t *\n\t\t\t * Use the pre_{$taxonomy}_{$field} hook instead.\n\t\t\t *\n\t\t\t * @since 2.0.3\n\t\t\t *\n\t\t\t * @param string $value The category nicename.\n\t\t\t */\n\t\t\t$value = apply_filters( 'pre_category_nicename', $value );\n\t\t}\n\n\t} elseif ( 'rss' == $context ) {\n\n\t\t/**\n\t\t * Filter the term field for use in RSS.\n\t\t *\n\t\t * The dynamic portion of the filter name, `$field`, refers to the term field.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param mixed  $value    Value of the term field.\n\t\t * @param string $taxonomy Taxonomy slug.\n\t\t */\n\t\t$value = apply_filters( \"term_{$field}_rss\", $value, $taxonomy );\n\n\t\t/**\n\t\t * Filter the taxonomy field for use in RSS.\n\t\t *\n\t\t * The dynamic portions of the hook name, `$taxonomy`, and `$field`, refer\n\t\t * to the taxonomy slug and field name, respectively.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param mixed $value Value of the taxonomy field.\n\t\t */\n\t\t$value = apply_filters( \"{$taxonomy}_{$field}_rss\", $value );\n\t} else {\n\t\t// Use display filters by default.\n\n\t\t/**\n\t\t * Filter the term field sanitized for display.\n\t\t *\n\t\t * The dynamic portion of the filter name, `$field`, refers to the term field name.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param mixed  $value    Value of the term field.\n\t\t * @param int    $term_id  Term ID.\n\t\t * @param string $taxonomy Taxonomy slug.\n\t\t * @param string $context  Context to retrieve the term field value.\n\t\t */\n\t\t$value = apply_filters( \"term_{$field}\", $value, $term_id, $taxonomy, $context );\n\n\t\t/**\n\t\t * Filter the taxonomy field sanitized for display.\n\t\t *\n\t\t * The dynamic portions of the filter name, `$taxonomy`, and `$field`, refer\n\t\t * to the taxonomy slug and taxonomy field, respectively.\n\t\t *\n\t\t * @since 2.3.0\n\t\t *\n\t\t * @param mixed  $value   Value of the taxonomy field.\n\t\t * @param int    $term_id Term ID.\n\t\t * @param string $context Context to retrieve the taxonomy field value.\n\t\t */\n\t\t$value = apply_filters( \"{$taxonomy}_{$field}\", $value, $term_id, $context );\n\t}\n\n\tif ( 'attribute' == $context ) {\n\t\t$value = esc_attr($value);\n\t} elseif ( 'js' == $context ) {\n\t\t$value = esc_js($value);\n\t}\n\treturn $value;\n}\n\n/**\n * Count how many terms are in Taxonomy.\n *\n * Default $args is 'hide_empty' which can be 'hide_empty=true' or array('hide_empty' => true).\n *\n * @todo Document $args as a hash notation.\n *\n * @since 2.3.0\n *\n * @param string       $taxonomy Taxonomy name\n * @param array|string $args     Overwrite defaults. See get_terms()\n * @return array|int|WP_Error How many terms are in $taxonomy. WP_Error if $taxonomy does not exist.\n */\nfunction wp_count_terms( $taxonomy, $args = array() ) {\n\t$defaults = array('hide_empty' => false);\n\t$args = wp_parse_args($args, $defaults);\n\n\t// backwards compatibility\n\tif ( isset($args['ignore_empty']) ) {\n\t\t$args['hide_empty'] = $args['ignore_empty'];\n\t\tunset($args['ignore_empty']);\n\t}\n\n\t$args['fields'] = 'count';\n\n\treturn get_terms($taxonomy, $args);\n}\n\n/**\n * Will unlink the object from the taxonomy or taxonomies.\n *\n * Will remove all relationships between the object and any terms in\n * a particular taxonomy or taxonomies. Does not remove the term or\n * taxonomy itself.\n *\n * @since 2.3.0\n *\n * @param int          $object_id  The term Object Id that refers to the term.\n * @param string|array $taxonomies List of Taxonomy Names or single Taxonomy name.\n */\nfunction wp_delete_object_term_relationships( $object_id, $taxonomies ) {\n\t$object_id = (int) $object_id;\n\n\tif ( !is_array($taxonomies) )\n\t\t$taxonomies = array($taxonomies);\n\n\tforeach ( (array) $taxonomies as $taxonomy ) {\n\t\t$term_ids = wp_get_object_terms( $object_id, $taxonomy, array( 'fields' => 'ids' ) );\n\t\t$term_ids = array_map( 'intval', $term_ids );\n\t\twp_remove_object_terms( $object_id, $term_ids, $taxonomy );\n\t}\n}\n\n/**\n * Removes a term from the database.\n *\n * If the term is a parent of other terms, then the children will be updated to\n * that term's parent.\n *\n * Metadata associated with the term will be deleted.\n *\n * The `$args` 'default' will only override the terms found, if there is only one\n * term found. Any other and the found terms are used.\n *\n * The $args 'force_default' will force the term supplied as default to be\n * assigned even if the object was not going to be termless\n *\n * @todo Document $args as a hash notation.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int          $term     Term ID.\n * @param string       $taxonomy Taxonomy Name.\n * @param array|string $args     Optional. Change 'default' term id and override found term ids.\n * @return bool|int|WP_Error Returns false if not term; true if completes delete action.\n */\nfunction wp_delete_term( $term, $taxonomy, $args = array() ) {\n\tglobal $wpdb;\n\n\t$term = (int) $term;\n\n\tif ( ! $ids = term_exists($term, $taxonomy) )\n\t\treturn false;\n\tif ( is_wp_error( $ids ) )\n\t\treturn $ids;\n\n\t$tt_id = $ids['term_taxonomy_id'];\n\n\t$defaults = array();\n\n\tif ( 'category' == $taxonomy ) {\n\t\t$defaults['default'] = get_option( 'default_category' );\n\t\tif ( $defaults['default'] == $term )\n\t\t\treturn 0; // Don't delete the default category\n\t}\n\n\t$args = wp_parse_args($args, $defaults);\n\n\tif ( isset( $args['default'] ) ) {\n\t\t$default = (int) $args['default'];\n\t\tif ( ! term_exists( $default, $taxonomy ) ) {\n\t\t\tunset( $default );\n\t\t}\n\t}\n\n\tif ( isset( $args['force_default'] ) ) {\n\t\t$force_default = $args['force_default'];\n\t}\n\n\t/**\n\t * Fires when deleting a term, before any modifications are made to posts or terms.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param int    $term     Term ID.\n\t * @param string $taxonomy Taxonomy Name.\n\t */\n\tdo_action( 'pre_delete_term', $term, $taxonomy );\n\n\t// Update children to point to new parent\n\tif ( is_taxonomy_hierarchical($taxonomy) ) {\n\t\t$term_obj = get_term($term, $taxonomy);\n\t\tif ( is_wp_error( $term_obj ) )\n\t\t\treturn $term_obj;\n\t\t$parent = $term_obj->parent;\n\n\t\t$edit_ids = $wpdb->get_results( \"SELECT term_id, term_taxonomy_id FROM $wpdb->term_taxonomy WHERE `parent` = \" . (int)$term_obj->term_id );\n\t\t$edit_tt_ids = wp_list_pluck( $edit_ids, 'term_taxonomy_id' );\n\n\t\t/**\n\t\t * Fires immediately before a term to delete's children are reassigned a parent.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param array $edit_tt_ids An array of term taxonomy IDs for the given term.\n\t\t */\n\t\tdo_action( 'edit_term_taxonomies', $edit_tt_ids );\n\n\t\t$wpdb->update( $wpdb->term_taxonomy, compact( 'parent' ), array( 'parent' => $term_obj->term_id) + compact( 'taxonomy' ) );\n\n\t\t// Clean the cache for all child terms.\n\t\t$edit_term_ids = wp_list_pluck( $edit_ids, 'term_id' );\n\t\tclean_term_cache( $edit_term_ids, $taxonomy );\n\n\t\t/**\n\t\t * Fires immediately after a term to delete's children are reassigned a parent.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param array $edit_tt_ids An array of term taxonomy IDs for the given term.\n\t\t */\n\t\tdo_action( 'edited_term_taxonomies', $edit_tt_ids );\n\t}\n\n\t// Get the term before deleting it or its term relationships so we can pass to actions below.\n\t$deleted_term = get_term( $term, $taxonomy );\n\n\t$objects = $wpdb->get_col( $wpdb->prepare( \"SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d\", $tt_id ) );\n\n\tforeach ( (array) $objects as $object ) {\n\t\t$terms = wp_get_object_terms($object, $taxonomy, array('fields' => 'ids', 'orderby' => 'none'));\n\t\tif ( 1 == count($terms) && isset($default) ) {\n\t\t\t$terms = array($default);\n\t\t} else {\n\t\t\t$terms = array_diff($terms, array($term));\n\t\t\tif (isset($default) && isset($force_default) && $force_default)\n\t\t\t\t$terms = array_merge($terms, array($default));\n\t\t}\n\t\t$terms = array_map('intval', $terms);\n\t\twp_set_object_terms($object, $terms, $taxonomy);\n\t}\n\n\t// Clean the relationship caches for all object types using this term.\n\t$tax_object = get_taxonomy( $taxonomy );\n\tforeach ( $tax_object->object_type as $object_type )\n\t\tclean_object_term_cache( $objects, $object_type );\n\n\t$term_meta_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT meta_id FROM $wpdb->termmeta WHERE term_id = %d \", $term ) );\n\tforeach ( $term_meta_ids as $mid ) {\n\t\tdelete_metadata_by_mid( 'term', $mid );\n\t}\n\n\t/**\n\t * Fires immediately before a term taxonomy ID is deleted.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $tt_id Term taxonomy ID.\n\t */\n\tdo_action( 'delete_term_taxonomy', $tt_id );\n\t$wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $tt_id ) );\n\n\t/**\n\t * Fires immediately after a term taxonomy ID is deleted.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int $tt_id Term taxonomy ID.\n\t */\n\tdo_action( 'deleted_term_taxonomy', $tt_id );\n\n\t// Delete the term if no taxonomies use it.\n\tif ( !$wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d\", $term) ) )\n\t\t$wpdb->delete( $wpdb->terms, array( 'term_id' => $term ) );\n\n\tclean_term_cache($term, $taxonomy);\n\n\t/**\n\t * Fires after a term is deleted from the database and the cache is cleaned.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param int     $term         Term ID.\n\t * @param int     $tt_id        Term taxonomy ID.\n\t * @param string  $taxonomy     Taxonomy slug.\n\t * @param mixed   $deleted_term Copy of the already-deleted term, in the form specified\n\t *                              by the parent function. WP_Error otherwise.\n\t */\n\tdo_action( 'delete_term', $term, $tt_id, $taxonomy, $deleted_term );\n\n\t/**\n\t * Fires after a term in a specific taxonomy is deleted.\n\t *\n\t * The dynamic portion of the hook name, `$taxonomy`, refers to the specific\n\t * taxonomy the term belonged to.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int     $term         Term ID.\n\t * @param int     $tt_id        Term taxonomy ID.\n\t * @param mixed   $deleted_term Copy of the already-deleted term, in the form specified\n\t *                              by the parent function. WP_Error otherwise.\n\t */\n\tdo_action( \"delete_$taxonomy\", $term, $tt_id, $deleted_term );\n\n\treturn true;\n}\n\n/**\n * Deletes one existing category.\n *\n * @since 2.0.0\n *\n * @param int $cat_ID\n * @return bool|int|WP_Error Returns true if completes delete action; false if term doesn't exist;\n * \tZero on attempted deletion of default Category; WP_Error object is also a possibility.\n */\nfunction wp_delete_category( $cat_ID ) {\n\treturn wp_delete_term( $cat_ID, 'category' );\n}\n\n/**\n * Retrieves the terms associated with the given object(s), in the supplied taxonomies.\n *\n * @since 2.3.0\n * @since 4.2.0 Added support for 'taxonomy', 'parent', and 'term_taxonomy_id' values of `$orderby`.\n *              Introduced `$parent` argument.\n * @since 4.4.0 Introduced `$meta_query` and `$update_term_meta_cache` arguments. When `$fields` is 'all' or\n *              'all_with_object_id', an array of `WP_Term` objects will be returned.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|array    $object_ids The ID(s) of the object(s) to retrieve.\n * @param string|array $taxonomies The taxonomies to retrieve terms from.\n * @param array|string $args {\n *     Array of arguments.\n *     @type string $orderby                Field by which results should be sorted. Accepts 'name', 'count', 'slug',\n *                                          'term_group', 'term_order', 'taxonomy', 'parent', or 'term_taxonomy_id'.\n *                                          Default 'name'.\n *     @type string $order                  Sort order. Accepts 'ASC' or 'DESC'. Default 'ASC'.\n *     @type string $fields                 Fields to return for matched terms. Accepts 'all', 'ids', 'names', and\n *                                          'all_with_object_id'. Note that 'all' or 'all_with_object_id' will result\n *                                          in an array of term objects being returned, 'ids' will return an array of\n *                                          integers, and 'names' an array of strings.\n *     @type int    $parent                 Optional. Limit results to the direct children of a given term ID.\n *     @type bool   $update_term_meta_cache Whether to prime termmeta cache for matched terms. Only applies when\n *                                          `$fields` is 'all', 'all_with_object_id', or 'term_id'. Default true.\n *     @type array  $meta_query             Meta query clauses to limit retrieved terms by. See `WP_Meta_Query`.\n *                                          Default empty.\n * }\n * @return array|WP_Error The requested term data or empty array if no terms found.\n *                        WP_Error if any of the $taxonomies don't exist.\n */\nfunction wp_get_object_terms($object_ids, $taxonomies, $args = array()) {\n\tglobal $wpdb;\n\n\tif ( empty( $object_ids ) || empty( $taxonomies ) )\n\t\treturn array();\n\n\tif ( !is_array($taxonomies) )\n\t\t$taxonomies = array($taxonomies);\n\n\tforeach ( $taxonomies as $taxonomy ) {\n\t\tif ( ! taxonomy_exists($taxonomy) )\n\t\t\treturn new WP_Error('invalid_taxonomy', __('Invalid taxonomy'));\n\t}\n\n\tif ( !is_array($object_ids) )\n\t\t$object_ids = array($object_ids);\n\t$object_ids = array_map('intval', $object_ids);\n\n\t$defaults = array(\n\t\t'orderby' => 'name',\n\t\t'order'   => 'ASC',\n\t\t'fields'  => 'all',\n\t\t'parent'  => '',\n\t\t'update_term_meta_cache' => true,\n\t\t'meta_query' => '',\n\t);\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$terms = array();\n\tif ( count($taxonomies) > 1 ) {\n\t\tforeach ( $taxonomies as $index => $taxonomy ) {\n\t\t\t$t = get_taxonomy($taxonomy);\n\t\t\tif ( isset($t->args) && is_array($t->args) && $args != array_merge($args, $t->args) ) {\n\t\t\t\tunset($taxonomies[$index]);\n\t\t\t\t$terms = array_merge($terms, wp_get_object_terms($object_ids, $taxonomy, array_merge($args, $t->args)));\n\t\t\t}\n\t\t}\n\t} else {\n\t\t$t = get_taxonomy($taxonomies[0]);\n\t\tif ( isset($t->args) && is_array($t->args) )\n\t\t\t$args = array_merge($args, $t->args);\n\t}\n\n\t$orderby = $args['orderby'];\n\t$order = $args['order'];\n\t$fields = $args['fields'];\n\n\tif ( in_array( $orderby, array( 'term_id', 'name', 'slug', 'term_group' ) ) ) {\n\t\t$orderby = \"t.$orderby\";\n\t} elseif ( in_array( $orderby, array( 'count', 'parent', 'taxonomy', 'term_taxonomy_id' ) ) ) {\n\t\t$orderby = \"tt.$orderby\";\n\t} elseif ( 'term_order' === $orderby ) {\n\t\t$orderby = 'tr.term_order';\n\t} elseif ( 'none' === $orderby ) {\n\t\t$orderby = '';\n\t\t$order = '';\n\t} else {\n\t\t$orderby = 't.term_id';\n\t}\n\n\t// tt_ids queries can only be none or tr.term_taxonomy_id\n\tif ( ('tt_ids' == $fields) && !empty($orderby) )\n\t\t$orderby = 'tr.term_taxonomy_id';\n\n\tif ( !empty($orderby) )\n\t\t$orderby = \"ORDER BY $orderby\";\n\n\t$order = strtoupper( $order );\n\tif ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ) ) )\n\t\t$order = 'ASC';\n\n\t$taxonomy_array = $taxonomies;\n\t$object_id_array = $object_ids;\n\t$taxonomies = \"'\" . implode(\"', '\", $taxonomies) . \"'\";\n\t$object_ids = implode(', ', $object_ids);\n\n\t$select_this = '';\n\tif ( 'all' == $fields ) {\n\t\t$select_this = 't.*, tt.*';\n\t} elseif ( 'ids' == $fields ) {\n\t\t$select_this = 't.term_id';\n\t} elseif ( 'names' == $fields ) {\n\t\t$select_this = 't.name';\n\t} elseif ( 'slugs' == $fields ) {\n\t\t$select_this = 't.slug';\n\t} elseif ( 'all_with_object_id' == $fields ) {\n\t\t$select_this = 't.*, tt.*, tr.object_id';\n\t}\n\n\t$where = array(\n\t\t\"tt.taxonomy IN ($taxonomies)\",\n\t\t\"tr.object_id IN ($object_ids)\",\n\t);\n\n\tif ( '' !== $args['parent'] ) {\n\t\t$where[] = $wpdb->prepare( 'tt.parent = %d', $args['parent'] );\n\t}\n\n\t// Meta query support.\n\t$meta_query_join = '';\n\tif ( ! empty( $args['meta_query'] ) ) {\n\t\t$mquery = new WP_Meta_Query( $args['meta_query'] );\n\t\t$mq_sql = $mquery->get_sql( 'term', 't', 'term_id' );\n\n\t\t$meta_query_join .= $mq_sql['join'];\n\n\t\t// Strip leading AND.\n\t\t$where[] = preg_replace( '/^\\s*AND/', '', $mq_sql['where'] );\n\t}\n\n\t$where = implode( ' AND ', $where );\n\n\t$query = \"SELECT $select_this FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id $meta_query_join WHERE $where $orderby $order\";\n\n\t$objects = false;\n\tif ( 'all' == $fields || 'all_with_object_id' == $fields ) {\n\t\t$_terms = $wpdb->get_results( $query );\n\t\t$object_id_index = array();\n\t\tforeach ( $_terms as $key => $term ) {\n\t\t\t$term = sanitize_term( $term, $taxonomy, 'raw' );\n\t\t\t$_terms[ $key ] = $term;\n\n\t\t\tif ( isset( $term->object_id ) ) {\n\t\t\t\t$object_id_index[ $key ] = $term->object_id;\n\t\t\t}\n\t\t}\n\n\t\tupdate_term_cache( $_terms );\n\t\t$_terms = array_map( 'get_term', $_terms );\n\n\t\t// Re-add the object_id data, which is lost when fetching terms from cache.\n\t\tif ( 'all_with_object_id' === $fields ) {\n\t\t\tforeach ( $_terms as $key => $_term ) {\n\t\t\t\tif ( isset( $object_id_index[ $key ] ) ) {\n\t\t\t\t\t$_term->object_id = $object_id_index[ $key ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$terms = array_merge( $terms, $_terms );\n\t\t$objects = true;\n\n\t} elseif ( 'ids' == $fields || 'names' == $fields || 'slugs' == $fields ) {\n\t\t$_terms = $wpdb->get_col( $query );\n\t\t$_field = ( 'ids' == $fields ) ? 'term_id' : 'name';\n\t\tforeach ( $_terms as $key => $term ) {\n\t\t\t$_terms[$key] = sanitize_term_field( $_field, $term, $term, $taxonomy, 'raw' );\n\t\t}\n\t\t$terms = array_merge( $terms, $_terms );\n\t} elseif ( 'tt_ids' == $fields ) {\n\t\t$terms = $wpdb->get_col(\"SELECT tr.term_taxonomy_id FROM $wpdb->term_relationships AS tr INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN ($object_ids) AND tt.taxonomy IN ($taxonomies) $orderby $order\");\n\t\tforeach ( $terms as $key => $tt_id ) {\n\t\t\t$terms[$key] = sanitize_term_field( 'term_taxonomy_id', $tt_id, 0, $taxonomy, 'raw' ); // 0 should be the term id, however is not needed when using raw context.\n\t\t}\n\t}\n\n\t// Update termmeta cache, if necessary.\n\tif ( $args['update_term_meta_cache'] && ( 'all' === $fields || 'all_with_object_ids' === $fields || 'term_id' === $fields ) ) {\n\t\tif ( 'term_id' === $fields ) {\n\t\t\t$term_ids = $fields;\n\t\t} else {\n\t\t\t$term_ids = wp_list_pluck( $terms, 'term_id' );\n\t\t}\n\n\t\tupdate_termmeta_cache( $term_ids );\n\t}\n\n\tif ( ! $terms ) {\n\t\t$terms = array();\n\t} elseif ( $objects && 'all_with_object_id' !== $fields ) {\n\t\t$_tt_ids = array();\n\t\t$_terms = array();\n\t\tforeach ( $terms as $term ) {\n\t\t\tif ( in_array( $term->term_taxonomy_id, $_tt_ids ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$_tt_ids[] = $term->term_taxonomy_id;\n\t\t\t$_terms[] = $term;\n\t\t}\n\t\t$terms = $_terms;\n\t} elseif ( ! $objects ) {\n\t\t$terms = array_values( array_unique( $terms ) );\n\t}\n\n\t/**\n\t * Filter the terms for a given object or objects.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param array $terms           An array of terms for the given object or objects.\n\t * @param array $object_id_array Array of object IDs for which `$terms` were retrieved.\n\t * @param array $taxonomy_array  Array of taxonomies from which `$terms` were retrieved.\n\t * @param array $args            An array of arguments for retrieving terms for the given\n\t *                               object(s). See wp_get_object_terms() for details.\n\t */\n\t$terms = apply_filters( 'get_object_terms', $terms, $object_id_array, $taxonomy_array, $args );\n\n\t/**\n\t * Filter the terms for a given object or objects.\n\t *\n\t * The `$taxonomies` parameter passed to this filter is formatted as a SQL fragment. The\n\t * {@see 'get_object_terms'} filter is recommended as an alternative.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param array     $terms      An array of terms for the given object or objects.\n\t * @param int|array $object_ids Object ID or array of IDs.\n\t * @param string    $taxonomies SQL-formatted (comma-separated and quoted) list of taxonomy names.\n\t * @param array     $args       An array of arguments for retrieving terms for the given object(s).\n\t *                              See {@see wp_get_object_terms()} for details.\n\t */\n\treturn apply_filters( 'wp_get_object_terms', $terms, $object_ids, $taxonomies, $args );\n}\n\n/**\n * Add a new term to the database.\n *\n * A non-existent term is inserted in the following sequence:\n * 1. The term is added to the term table, then related to the taxonomy.\n * 2. If everything is correct, several actions are fired.\n * 3. The 'term_id_filter' is evaluated.\n * 4. The term cache is cleaned.\n * 5. Several more actions are fired.\n * 6. An array is returned containing the term_id and term_taxonomy_id.\n *\n * If the 'slug' argument is not empty, then it is checked to see if the term\n * is invalid. If it is not a valid, existing term, it is added and the term_id\n * is given.\n *\n * If the taxonomy is hierarchical, and the 'parent' argument is not empty,\n * the term is inserted and the term_id will be given.\n *\n * Error handling:\n * If $taxonomy does not exist or $term is empty,\n * a WP_Error object will be returned.\n *\n * If the term already exists on the same hierarchical level,\n * or the term slug and name are not unique, a WP_Error object will be returned.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @since 2.3.0\n *\n * @param string       $term     The term to add or update.\n * @param string       $taxonomy The taxonomy to which to add the term.\n * @param array|string $args {\n *     Optional. Array or string of arguments for inserting a term.\n *\n *     @type string $alias_of    Slug of the term to make this term an alias of.\n *                               Default empty string. Accepts a term slug.\n *     @type string $description The term description. Default empty string.\n *     @type int    $parent      The id of the parent term. Default 0.\n *     @type string $slug        The term slug to use. Default empty string.\n * }\n * @return array|WP_Error An array containing the `term_id` and `term_taxonomy_id`,\n *                        {@see WP_Error} otherwise.\n */\nfunction wp_insert_term( $term, $taxonomy, $args = array() ) {\n\tglobal $wpdb;\n\n\tif ( ! taxonomy_exists($taxonomy) ) {\n\t\treturn new WP_Error('invalid_taxonomy', __('Invalid taxonomy'));\n\t}\n\t/**\n\t * Filter a term before it is sanitized and inserted into the database.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $term     The term to add or update.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\t$term = apply_filters( 'pre_insert_term', $term, $taxonomy );\n\tif ( is_wp_error( $term ) ) {\n\t\treturn $term;\n\t}\n\tif ( is_int($term) && 0 == $term ) {\n\t\treturn new WP_Error('invalid_term_id', __('Invalid term ID'));\n\t}\n\tif ( '' == trim($term) ) {\n\t\treturn new WP_Error('empty_term_name', __('A name is required for this term'));\n\t}\n\t$defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => '');\n\t$args = wp_parse_args( $args, $defaults );\n\n\tif ( $args['parent'] > 0 && ! term_exists( (int) $args['parent'] ) ) {\n\t\treturn new WP_Error( 'missing_parent', __( 'Parent term does not exist.' ) );\n\t}\n\t$args['name'] = $term;\n\t$args['taxonomy'] = $taxonomy;\n\t$args = sanitize_term($args, $taxonomy, 'db');\n\n\t// expected_slashed ($name)\n\t$name = wp_unslash( $args['name'] );\n\t$description = wp_unslash( $args['description'] );\n\t$parent = (int) $args['parent'];\n\n\t$slug_provided = ! empty( $args['slug'] );\n\tif ( ! $slug_provided ) {\n\t\t$slug = sanitize_title( $name );\n\t} else {\n\t\t$slug = $args['slug'];\n\t}\n\n\t$term_group = 0;\n\tif ( $args['alias_of'] ) {\n\t\t$alias = get_term_by( 'slug', $args['alias_of'], $taxonomy );\n\t\tif ( ! empty( $alias->term_group ) ) {\n\t\t\t// The alias we want is already in a group, so let's use that one.\n\t\t\t$term_group = $alias->term_group;\n\t\t} elseif ( ! empty( $alias->term_id ) ) {\n\t\t\t/*\n\t\t\t * The alias is not in a group, so we create a new one\n\t\t\t * and add the alias to it.\n\t\t\t */\n\t\t\t$term_group = $wpdb->get_var(\"SELECT MAX(term_group) FROM $wpdb->terms\") + 1;\n\n\t\t\twp_update_term( $alias->term_id, $taxonomy, array(\n\t\t\t\t'term_group' => $term_group,\n\t\t\t) );\n\t\t}\n\t}\n\n\t/*\n\t * Prevent the creation of terms with duplicate names at the same level of a taxonomy hierarchy,\n\t * unless a unique slug has been explicitly provided.\n\t */\n\t$name_matches = get_terms( $taxonomy, array(\n\t\t'name' => $name,\n\t\t'hide_empty' => false,\n\t) );\n\n\t/*\n\t * The `name` match in `get_terms()` doesn't differentiate accented characters,\n\t * so we do a stricter comparison here.\n\t */\n\t$name_match = null;\n\tif ( $name_matches ) {\n\t\tforeach ( $name_matches as $_match ) {\n\t\t\tif ( strtolower( $name ) === strtolower( $_match->name ) ) {\n\t\t\t\t$name_match = $_match;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( $name_match ) {\n\t\t$slug_match = get_term_by( 'slug', $slug, $taxonomy );\n\t\tif ( ! $slug_provided || $name_match->slug === $slug || $slug_match ) {\n\t\t\tif ( is_taxonomy_hierarchical( $taxonomy ) ) {\n\t\t\t\t$siblings = get_terms( $taxonomy, array( 'get' => 'all', 'parent' => $parent ) );\n\n\t\t\t\t$existing_term = null;\n\t\t\t\tif ( $name_match->slug === $slug && in_array( $name, wp_list_pluck( $siblings, 'name' ) ) ) {\n\t\t\t\t\t$existing_term = $name_match;\n\t\t\t\t} elseif ( $slug_match && in_array( $slug, wp_list_pluck( $siblings, 'slug' ) ) ) {\n\t\t\t\t\t$existing_term = $slug_match;\n\t\t\t\t}\n\n\t\t\t\tif ( $existing_term ) {\n\t\t\t\t\treturn new WP_Error( 'term_exists', __( 'A term with the name provided already exists with this parent.' ), $existing_term->term_id );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn new WP_Error( 'term_exists', __( 'A term with the name provided already exists in this taxonomy.' ), $name_match->term_id );\n\t\t\t}\n\t\t}\n\t}\n\n\t$slug = wp_unique_term_slug( $slug, (object) $args );\n\n\tif ( false === $wpdb->insert( $wpdb->terms, compact( 'name', 'slug', 'term_group' ) ) ) {\n\t\treturn new WP_Error( 'db_insert_error', __( 'Could not insert term into the database' ), $wpdb->last_error );\n\t}\n\n\t$term_id = (int) $wpdb->insert_id;\n\n\t// Seems unreachable, However, Is used in the case that a term name is provided, which sanitizes to an empty string.\n\tif ( empty($slug) ) {\n\t\t$slug = sanitize_title($slug, $term_id);\n\n\t\t/** This action is documented in wp-includes/taxonomy.php */\n\t\tdo_action( 'edit_terms', $term_id, $taxonomy );\n\t\t$wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) );\n\n\t\t/** This action is documented in wp-includes/taxonomy.php */\n\t\tdo_action( 'edited_terms', $term_id, $taxonomy );\n\t}\n\n\t$tt_id = $wpdb->get_var( $wpdb->prepare( \"SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d\", $taxonomy, $term_id ) );\n\n\tif ( !empty($tt_id) ) {\n\t\treturn array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id);\n\t}\n\t$wpdb->insert( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent') + array( 'count' => 0 ) );\n\t$tt_id = (int) $wpdb->insert_id;\n\n\t/*\n\t * Sanity check: if we just created a term with the same parent + taxonomy + slug but a higher term_id than\n\t * an existing term, then we have unwittingly created a duplicate term. Delete the dupe, and use the term_id\n\t * and term_taxonomy_id of the older term instead. Then return out of the function so that the \"create\" hooks\n\t * are not fired.\n\t */\n\t$duplicate_term = $wpdb->get_row( $wpdb->prepare( \"SELECT t.term_id, tt.term_taxonomy_id FROM $wpdb->terms t INNER JOIN $wpdb->term_taxonomy tt ON ( tt.term_id = t.term_id ) WHERE t.slug = %s AND tt.parent = %d AND tt.taxonomy = %s AND t.term_id < %d AND tt.term_taxonomy_id != %d\", $slug, $parent, $taxonomy, $term_id, $tt_id ) );\n\tif ( $duplicate_term ) {\n\t\t$wpdb->delete( $wpdb->terms, array( 'term_id' => $term_id ) );\n\t\t$wpdb->delete( $wpdb->term_taxonomy, array( 'term_taxonomy_id' => $tt_id ) );\n\n\t\t$term_id = (int) $duplicate_term->term_id;\n\t\t$tt_id   = (int) $duplicate_term->term_taxonomy_id;\n\n\t\tclean_term_cache( $term_id, $taxonomy );\n\t\treturn array( 'term_id' => $term_id, 'term_taxonomy_id' => $tt_id );\n\t}\n\n\t/**\n\t * Fires immediately after a new term is created, before the term cache is cleaned.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int    $term_id  Term ID.\n\t * @param int    $tt_id    Term taxonomy ID.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\tdo_action( \"create_term\", $term_id, $tt_id, $taxonomy );\n\n\t/**\n\t * Fires after a new term is created for a specific taxonomy.\n\t *\n\t * The dynamic portion of the hook name, `$taxonomy`, refers\n\t * to the slug of the taxonomy the term was created for.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int $term_id Term ID.\n\t * @param int $tt_id   Term taxonomy ID.\n\t */\n\tdo_action( \"create_$taxonomy\", $term_id, $tt_id );\n\n\t/**\n\t * Filter the term ID after a new term is created.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int $term_id Term ID.\n\t * @param int $tt_id   Taxonomy term ID.\n\t */\n\t$term_id = apply_filters( 'term_id_filter', $term_id, $tt_id );\n\n\tclean_term_cache($term_id, $taxonomy);\n\n\t/**\n\t * Fires after a new term is created, and after the term cache has been cleaned.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int    $term_id  Term ID.\n\t * @param int    $tt_id    Term taxonomy ID.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\tdo_action( 'created_term', $term_id, $tt_id, $taxonomy );\n\n\t/**\n\t * Fires after a new term in a specific taxonomy is created, and after the term\n\t * cache has been cleaned.\n\t *\n\t * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int $term_id Term ID.\n\t * @param int $tt_id   Term taxonomy ID.\n\t */\n\tdo_action( \"created_$taxonomy\", $term_id, $tt_id );\n\n\treturn array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id);\n}\n\n/**\n * Create Term and Taxonomy Relationships.\n *\n * Relates an object (post, link etc) to a term and taxonomy type. Creates the\n * term and taxonomy relationship if it doesn't already exist. Creates a term if\n * it doesn't exist (using the slug).\n *\n * A relationship means that the term is grouped in or belongs to the taxonomy.\n * A term has no meaning until it is given context by defining which taxonomy it\n * exists under.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb The WordPress database abstraction object.\n *\n * @param int              $object_id The object to relate to.\n * @param array|int|string $terms     A single term slug, single term id, or array of either term slugs or ids.\n *                                    Will replace all existing related terms in this taxonomy.\n * @param string           $taxonomy  The context in which to relate the term to the object.\n * @param bool             $append    Optional. If false will delete difference of terms. Default false.\n * @return array|WP_Error Affected Term IDs.\n */\nfunction wp_set_object_terms( $object_id, $terms, $taxonomy, $append = false ) {\n\tglobal $wpdb;\n\n\t$object_id = (int) $object_id;\n\n\tif ( ! taxonomy_exists($taxonomy) )\n\t\treturn new WP_Error('invalid_taxonomy', __('Invalid taxonomy'));\n\n\tif ( !is_array($terms) )\n\t\t$terms = array($terms);\n\n\tif ( ! $append )\n\t\t$old_tt_ids =  wp_get_object_terms($object_id, $taxonomy, array('fields' => 'tt_ids', 'orderby' => 'none'));\n\telse\n\t\t$old_tt_ids = array();\n\n\t$tt_ids = array();\n\t$term_ids = array();\n\t$new_tt_ids = array();\n\n\tforeach ( (array) $terms as $term) {\n\t\tif ( !strlen(trim($term)) )\n\t\t\tcontinue;\n\n\t\tif ( !$term_info = term_exists($term, $taxonomy) ) {\n\t\t\t// Skip if a non-existent term ID is passed.\n\t\t\tif ( is_int($term) )\n\t\t\t\tcontinue;\n\t\t\t$term_info = wp_insert_term($term, $taxonomy);\n\t\t}\n\t\tif ( is_wp_error($term_info) )\n\t\t\treturn $term_info;\n\t\t$term_ids[] = $term_info['term_id'];\n\t\t$tt_id = $term_info['term_taxonomy_id'];\n\t\t$tt_ids[] = $tt_id;\n\n\t\tif ( $wpdb->get_var( $wpdb->prepare( \"SELECT term_taxonomy_id FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d\", $object_id, $tt_id ) ) )\n\t\t\tcontinue;\n\n\t\t/**\n\t\t * Fires immediately before an object-term relationship is added.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $object_id Object ID.\n\t\t * @param int $tt_id     Term taxonomy ID.\n\t\t */\n\t\tdo_action( 'add_term_relationship', $object_id, $tt_id );\n\t\t$wpdb->insert( $wpdb->term_relationships, array( 'object_id' => $object_id, 'term_taxonomy_id' => $tt_id ) );\n\n\t\t/**\n\t\t * Fires immediately after an object-term relationship is added.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int $object_id Object ID.\n\t\t * @param int $tt_id     Term taxonomy ID.\n\t\t */\n\t\tdo_action( 'added_term_relationship', $object_id, $tt_id );\n\t\t$new_tt_ids[] = $tt_id;\n\t}\n\n\tif ( $new_tt_ids )\n\t\twp_update_term_count( $new_tt_ids, $taxonomy );\n\n\tif ( ! $append ) {\n\t\t$delete_tt_ids = array_diff( $old_tt_ids, $tt_ids );\n\n\t\tif ( $delete_tt_ids ) {\n\t\t\t$in_delete_tt_ids = \"'\" . implode( \"', '\", $delete_tt_ids ) . \"'\";\n\t\t\t$delete_term_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT tt.term_id FROM $wpdb->term_taxonomy AS tt WHERE tt.taxonomy = %s AND tt.term_taxonomy_id IN ($in_delete_tt_ids)\", $taxonomy ) );\n\t\t\t$delete_term_ids = array_map( 'intval', $delete_term_ids );\n\n\t\t\t$remove = wp_remove_object_terms( $object_id, $delete_term_ids, $taxonomy );\n\t\t\tif ( is_wp_error( $remove ) ) {\n\t\t\t\treturn $remove;\n\t\t\t}\n\t\t}\n\t}\n\n\t$t = get_taxonomy($taxonomy);\n\tif ( ! $append && isset($t->sort) && $t->sort ) {\n\t\t$values = array();\n\t\t$term_order = 0;\n\t\t$final_tt_ids = wp_get_object_terms($object_id, $taxonomy, array('fields' => 'tt_ids'));\n\t\tforeach ( $tt_ids as $tt_id )\n\t\t\tif ( in_array($tt_id, $final_tt_ids) )\n\t\t\t\t$values[] = $wpdb->prepare( \"(%d, %d, %d)\", $object_id, $tt_id, ++$term_order);\n\t\tif ( $values )\n\t\t\tif ( false === $wpdb->query( \"INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES \" . join( ',', $values ) . \" ON DUPLICATE KEY UPDATE term_order = VALUES(term_order)\" ) )\n\t\t\t\treturn new WP_Error( 'db_insert_error', __( 'Could not insert term relationship into the database' ), $wpdb->last_error );\n\t}\n\n\twp_cache_delete( $object_id, $taxonomy . '_relationships' );\n\n\t/**\n\t * Fires after an object's terms have been set.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param int    $object_id  Object ID.\n\t * @param array  $terms      An array of object terms.\n\t * @param array  $tt_ids     An array of term taxonomy IDs.\n\t * @param string $taxonomy   Taxonomy slug.\n\t * @param bool   $append     Whether to append new terms to the old terms.\n\t * @param array  $old_tt_ids Old array of term taxonomy IDs.\n\t */\n\tdo_action( 'set_object_terms', $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids );\n\treturn $tt_ids;\n}\n\n/**\n * Add term(s) associated with a given object.\n *\n * @since 3.6.0\n *\n * @param int              $object_id The ID of the object to which the terms will be added.\n * @param array|int|string $terms     The slug(s) or ID(s) of the term(s) to add.\n * @param array|string     $taxonomy  Taxonomy name.\n * @return array|WP_Error Affected Term IDs\n */\nfunction wp_add_object_terms( $object_id, $terms, $taxonomy ) {\n\treturn wp_set_object_terms( $object_id, $terms, $taxonomy, true );\n}\n\n/**\n * Remove term(s) associated with a given object.\n *\n * @since 3.6.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int              $object_id The ID of the object from which the terms will be removed.\n * @param array|int|string $terms     The slug(s) or ID(s) of the term(s) to remove.\n * @param array|string     $taxonomy  Taxonomy name.\n * @return bool|WP_Error True on success, false or WP_Error on failure.\n */\nfunction wp_remove_object_terms( $object_id, $terms, $taxonomy ) {\n\tglobal $wpdb;\n\n\t$object_id = (int) $object_id;\n\n\tif ( ! taxonomy_exists( $taxonomy ) ) {\n\t\treturn new WP_Error( 'invalid_taxonomy', __( 'Invalid Taxonomy' ) );\n\t}\n\n\tif ( ! is_array( $terms ) ) {\n\t\t$terms = array( $terms );\n\t}\n\n\t$tt_ids = array();\n\n\tforeach ( (array) $terms as $term ) {\n\t\tif ( ! strlen( trim( $term ) ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( ! $term_info = term_exists( $term, $taxonomy ) ) {\n\t\t\t// Skip if a non-existent term ID is passed.\n\t\t\tif ( is_int( $term ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif ( is_wp_error( $term_info ) ) {\n\t\t\treturn $term_info;\n\t\t}\n\n\t\t$tt_ids[] = $term_info['term_taxonomy_id'];\n\t}\n\n\tif ( $tt_ids ) {\n\t\t$in_tt_ids = \"'\" . implode( \"', '\", $tt_ids ) . \"'\";\n\n\t\t/**\n\t\t * Fires immediately before an object-term relationship is deleted.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int   $object_id Object ID.\n\t\t * @param array $tt_ids    An array of term taxonomy IDs.\n\t\t */\n\t\tdo_action( 'delete_term_relationships', $object_id, $tt_ids );\n\t\t$deleted = $wpdb->query( $wpdb->prepare( \"DELETE FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id IN ($in_tt_ids)\", $object_id ) );\n\n\t\twp_cache_delete( $object_id, $taxonomy . '_relationships' );\n\n\t\t/**\n\t\t * Fires immediately after an object-term relationship is deleted.\n\t\t *\n\t\t * @since 2.9.0\n\t\t *\n\t\t * @param int   $object_id Object ID.\n\t\t * @param array $tt_ids    An array of term taxonomy IDs.\n\t\t */\n\t\tdo_action( 'deleted_term_relationships', $object_id, $tt_ids );\n\n\t\twp_update_term_count( $tt_ids, $taxonomy );\n\n\t\treturn (bool) $deleted;\n\t}\n\n\treturn false;\n}\n\n/**\n * Will make slug unique, if it isn't already.\n *\n * The `$slug` has to be unique global to every taxonomy, meaning that one\n * taxonomy term can't have a matching slug with another taxonomy term. Each\n * slug has to be globally unique for every taxonomy.\n *\n * The way this works is that if the taxonomy that the term belongs to is\n * hierarchical and has a parent, it will append that parent to the $slug.\n *\n * If that still doesn't return an unique slug, then it try to append a number\n * until it finds a number that is truly unique.\n *\n * The only purpose for `$term` is for appending a parent, if one exists.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $slug The string that will be tried for a unique slug.\n * @param object $term The term object that the `$slug` will belong to.\n * @return string Will return a true unique slug.\n */\nfunction wp_unique_term_slug( $slug, $term ) {\n\tglobal $wpdb;\n\n\t$needs_suffix = true;\n\t$original_slug = $slug;\n\n\t// As of 4.1, duplicate slugs are allowed as long as they're in different taxonomies.\n\tif ( ! term_exists( $slug ) || get_option( 'db_version' ) >= 30133 && ! get_term_by( 'slug', $slug, $term->taxonomy ) ) {\n\t\t$needs_suffix = false;\n\t}\n\n\t/*\n\t * If the taxonomy supports hierarchy and the term has a parent, make the slug unique\n\t * by incorporating parent slugs.\n\t */\n\t$parent_suffix = '';\n\tif ( $needs_suffix && is_taxonomy_hierarchical( $term->taxonomy ) && ! empty( $term->parent ) ) {\n\t\t$the_parent = $term->parent;\n\t\twhile ( ! empty($the_parent) ) {\n\t\t\t$parent_term = get_term($the_parent, $term->taxonomy);\n\t\t\tif ( is_wp_error($parent_term) || empty($parent_term) )\n\t\t\t\tbreak;\n\t\t\t$parent_suffix .= '-' . $parent_term->slug;\n\t\t\tif ( ! term_exists( $slug . $parent_suffix ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ( empty($parent_term->parent) )\n\t\t\t\tbreak;\n\t\t\t$the_parent = $parent_term->parent;\n\t\t}\n\t}\n\n\t// If we didn't get a unique slug, try appending a number to make it unique.\n\n\t/**\n\t * Filter whether the proposed unique term slug is bad.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param bool   $needs_suffix Whether the slug needs to be made unique with a suffix.\n\t * @param string $slug         The slug.\n\t * @param object $term         Term object.\n\t */\n\tif ( apply_filters( 'wp_unique_term_slug_is_bad_slug', $needs_suffix, $slug, $term ) ) {\n\t\tif ( $parent_suffix ) {\n\t\t\t$slug .= $parent_suffix;\n\t\t} else {\n\t\t\tif ( ! empty( $term->term_id ) )\n\t\t\t\t$query = $wpdb->prepare( \"SELECT slug FROM $wpdb->terms WHERE slug = %s AND term_id != %d\", $slug, $term->term_id );\n\t\t\telse\n\t\t\t\t$query = $wpdb->prepare( \"SELECT slug FROM $wpdb->terms WHERE slug = %s\", $slug );\n\n\t\t\tif ( $wpdb->get_var( $query ) ) {\n\t\t\t\t$num = 2;\n\t\t\t\tdo {\n\t\t\t\t\t$alt_slug = $slug . \"-$num\";\n\t\t\t\t\t$num++;\n\t\t\t\t\t$slug_check = $wpdb->get_var( $wpdb->prepare( \"SELECT slug FROM $wpdb->terms WHERE slug = %s\", $alt_slug ) );\n\t\t\t\t} while ( $slug_check );\n\t\t\t\t$slug = $alt_slug;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter the unique term slug.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param string $slug          Unique term slug.\n\t * @param object $term          Term object.\n\t * @param string $original_slug Slug originally passed to the function for testing.\n\t */\n\treturn apply_filters( 'wp_unique_term_slug', $slug, $term, $original_slug );\n}\n\n/**\n * Update term based on arguments provided.\n *\n * The $args will indiscriminately override all values with the same field name.\n * Care must be taken to not override important information need to update or\n * update will fail (or perhaps create a new term, neither would be acceptable).\n *\n * Defaults will set 'alias_of', 'description', 'parent', and 'slug' if not\n * defined in $args already.\n *\n * 'alias_of' will create a term group, if it doesn't already exist, and update\n * it for the $term.\n *\n * If the 'slug' argument in $args is missing, then the 'name' in $args will be\n * used. It should also be noted that if you set 'slug' and it isn't unique then\n * a WP_Error will be passed back. If you don't pass any slug, then a unique one\n * will be created for you.\n *\n * For what can be overrode in `$args`, check the term scheme can contain and stay\n * away from the term keys.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int          $term_id  The ID of the term\n * @param string       $taxonomy The context in which to relate the term to the object.\n * @param array|string $args     Optional. Array of get_terms() arguments. Default empty array.\n * @return array|WP_Error Returns Term ID and Taxonomy Term ID\n */\nfunction wp_update_term( $term_id, $taxonomy, $args = array() ) {\n\tglobal $wpdb;\n\n\tif ( ! taxonomy_exists( $taxonomy ) ) {\n\t\treturn new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy' ) );\n\t}\n\n\t$term_id = (int) $term_id;\n\n\t// First, get all of the original args\n\t$term = get_term( $term_id, $taxonomy );\n\n\tif ( is_wp_error( $term ) ) {\n\t\treturn $term;\n\t}\n\n\tif ( ! $term ) {\n\t\treturn new WP_Error( 'invalid_term', __( 'Empty Term' ) );\n\t}\n\n\t$term = (array) $term->data;\n\n\t// Escape data pulled from DB.\n\t$term = wp_slash( $term );\n\n\t// Merge old and new args with new args overwriting old ones.\n\t$args = array_merge($term, $args);\n\n\t$defaults = array( 'alias_of' => '', 'description' => '', 'parent' => 0, 'slug' => '');\n\t$args = wp_parse_args($args, $defaults);\n\t$args = sanitize_term($args, $taxonomy, 'db');\n\t$parsed_args = $args;\n\n\t// expected_slashed ($name)\n\t$name = wp_unslash( $args['name'] );\n\t$description = wp_unslash( $args['description'] );\n\n\t$parsed_args['name'] = $name;\n\t$parsed_args['description'] = $description;\n\n\tif ( '' == trim($name) )\n\t\treturn new WP_Error('empty_term_name', __('A name is required for this term'));\n\n\tif ( $parsed_args['parent'] > 0 && ! term_exists( (int) $parsed_args['parent'] ) ) {\n\t\treturn new WP_Error( 'missing_parent', __( 'Parent term does not exist.' ) );\n\t}\n\n\t$empty_slug = false;\n\tif ( empty( $args['slug'] ) ) {\n\t\t$empty_slug = true;\n\t\t$slug = sanitize_title($name);\n\t} else {\n\t\t$slug = $args['slug'];\n\t}\n\n\t$parsed_args['slug'] = $slug;\n\n\t$term_group = isset( $parsed_args['term_group'] ) ? $parsed_args['term_group'] : 0;\n\tif ( $args['alias_of'] ) {\n\t\t$alias = get_term_by( 'slug', $args['alias_of'], $taxonomy );\n\t\tif ( ! empty( $alias->term_group ) ) {\n\t\t\t// The alias we want is already in a group, so let's use that one.\n\t\t\t$term_group = $alias->term_group;\n\t\t} elseif ( ! empty( $alias->term_id ) ) {\n\t\t\t/*\n\t\t\t * The alias is not in a group, so we create a new one\n\t\t\t * and add the alias to it.\n\t\t\t */\n\t\t\t$term_group = $wpdb->get_var(\"SELECT MAX(term_group) FROM $wpdb->terms\") + 1;\n\n\t\t\twp_update_term( $alias->term_id, $taxonomy, array(\n\t\t\t\t'term_group' => $term_group,\n\t\t\t) );\n\t\t}\n\n\t\t$parsed_args['term_group'] = $term_group;\n\t}\n\n\t/**\n\t * Filter the term parent.\n\t *\n\t * Hook to this filter to see if it will cause a hierarchy loop.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param int    $parent      ID of the parent term.\n\t * @param int    $term_id     Term ID.\n\t * @param string $taxonomy    Taxonomy slug.\n\t * @param array  $parsed_args An array of potentially altered update arguments for the given term.\n\t * @param array  $args        An array of update arguments for the given term.\n\t */\n\t$parent = apply_filters( 'wp_update_term_parent', $args['parent'], $term_id, $taxonomy, $parsed_args, $args );\n\n\t// Check for duplicate slug\n\t$duplicate = get_term_by( 'slug', $slug, $taxonomy );\n\tif ( $duplicate && $duplicate->term_id != $term_id ) {\n\t\t// If an empty slug was passed or the parent changed, reset the slug to something unique.\n\t\t// Otherwise, bail.\n\t\tif ( $empty_slug || ( $parent != $term['parent']) )\n\t\t\t$slug = wp_unique_term_slug($slug, (object) $args);\n\t\telse\n\t\t\treturn new WP_Error('duplicate_term_slug', sprintf(__('The slug &#8220;%s&#8221; is already in use by another term'), $slug));\n\t}\n\n\t$tt_id = (int) $wpdb->get_var( $wpdb->prepare( \"SELECT tt.term_taxonomy_id FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = %s AND t.term_id = %d\", $taxonomy, $term_id) );\n\n\t// Check whether this is a shared term that needs splitting.\n\t$_term_id = _split_shared_term( $term_id, $tt_id );\n\tif ( ! is_wp_error( $_term_id ) ) {\n\t\t$term_id = $_term_id;\n\t}\n\n\t/**\n\t * Fires immediately before the given terms are edited.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int    $term_id  Term ID.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\tdo_action( 'edit_terms', $term_id, $taxonomy );\n\t$wpdb->update($wpdb->terms, compact( 'name', 'slug', 'term_group' ), compact( 'term_id' ) );\n\tif ( empty($slug) ) {\n\t\t$slug = sanitize_title($name, $term_id);\n\t\t$wpdb->update( $wpdb->terms, compact( 'slug' ), compact( 'term_id' ) );\n\t}\n\n\t/**\n\t * Fires immediately after the given terms are edited.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int    $term_id  Term ID\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\tdo_action( 'edited_terms', $term_id, $taxonomy );\n\n\t/**\n\t * Fires immediate before a term-taxonomy relationship is updated.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int    $tt_id    Term taxonomy ID.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\tdo_action( 'edit_term_taxonomy', $tt_id, $taxonomy );\n\n\t$wpdb->update( $wpdb->term_taxonomy, compact( 'term_id', 'taxonomy', 'description', 'parent' ), array( 'term_taxonomy_id' => $tt_id ) );\n\n\t/**\n\t * Fires immediately after a term-taxonomy relationship is updated.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param int    $tt_id    Term taxonomy ID.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\tdo_action( 'edited_term_taxonomy', $tt_id, $taxonomy );\n\n\t// Clean the relationship caches for all object types using this term.\n\t$objects = $wpdb->get_col( $wpdb->prepare( \"SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d\", $tt_id ) );\n\t$tax_object = get_taxonomy( $taxonomy );\n\tforeach ( $tax_object->object_type as $object_type ) {\n\t\tclean_object_term_cache( $objects, $object_type );\n\t}\n\n\t/**\n\t * Fires after a term has been updated, but before the term cache has been cleaned.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int    $term_id  Term ID.\n\t * @param int    $tt_id    Term taxonomy ID.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\tdo_action( \"edit_term\", $term_id, $tt_id, $taxonomy );\n\n\t/**\n\t * Fires after a term in a specific taxonomy has been updated, but before the term\n\t * cache has been cleaned.\n\t *\n\t * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int $term_id Term ID.\n\t * @param int $tt_id   Term taxonomy ID.\n\t */\n\tdo_action( \"edit_$taxonomy\", $term_id, $tt_id );\n\n\t/** This filter is documented in wp-includes/taxonomy.php */\n\t$term_id = apply_filters( 'term_id_filter', $term_id, $tt_id );\n\n\tclean_term_cache($term_id, $taxonomy);\n\n\t/**\n\t * Fires after a term has been updated, and the term cache has been cleaned.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int    $term_id  Term ID.\n\t * @param int    $tt_id    Term taxonomy ID.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\tdo_action( \"edited_term\", $term_id, $tt_id, $taxonomy );\n\n\t/**\n\t * Fires after a term for a specific taxonomy has been updated, and the term\n\t * cache has been cleaned.\n\t *\n\t * The dynamic portion of the hook name, `$taxonomy`, refers to the taxonomy slug.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param int $term_id Term ID.\n\t * @param int $tt_id   Term taxonomy ID.\n\t */\n\tdo_action( \"edited_$taxonomy\", $term_id, $tt_id );\n\n\treturn array('term_id' => $term_id, 'term_taxonomy_id' => $tt_id);\n}\n\n/**\n * Enable or disable term counting.\n *\n * @since 2.5.0\n *\n * @staticvar bool $_defer\n *\n * @param bool $defer Optional. Enable if true, disable if false.\n * @return bool Whether term counting is enabled or disabled.\n */\nfunction wp_defer_term_counting($defer=null) {\n\tstatic $_defer = false;\n\n\tif ( is_bool($defer) ) {\n\t\t$_defer = $defer;\n\t\t// flush any deferred counts\n\t\tif ( !$defer )\n\t\t\twp_update_term_count( null, null, true );\n\t}\n\n\treturn $_defer;\n}\n\n/**\n * Updates the amount of terms in taxonomy.\n *\n * If there is a taxonomy callback applied, then it will be called for updating\n * the count.\n *\n * The default action is to count what the amount of terms have the relationship\n * of term ID. Once that is done, then update the database.\n *\n * @since 2.3.0\n *\n * @staticvar array $_deferred\n *\n * @param int|array $terms    The term_taxonomy_id of the terms.\n * @param string    $taxonomy The context of the term.\n * @return bool If no terms will return false, and if successful will return true.\n */\nfunction wp_update_term_count( $terms, $taxonomy, $do_deferred=false ) {\n\tstatic $_deferred = array();\n\n\tif ( $do_deferred ) {\n\t\tforeach ( (array) array_keys($_deferred) as $tax ) {\n\t\t\twp_update_term_count_now( $_deferred[$tax], $tax );\n\t\t\tunset( $_deferred[$tax] );\n\t\t}\n\t}\n\n\tif ( empty($terms) )\n\t\treturn false;\n\n\tif ( !is_array($terms) )\n\t\t$terms = array($terms);\n\n\tif ( wp_defer_term_counting() ) {\n\t\tif ( !isset($_deferred[$taxonomy]) )\n\t\t\t$_deferred[$taxonomy] = array();\n\t\t$_deferred[$taxonomy] = array_unique( array_merge($_deferred[$taxonomy], $terms) );\n\t\treturn true;\n\t}\n\n\treturn wp_update_term_count_now( $terms, $taxonomy );\n}\n\n/**\n * Perform term count update immediately.\n *\n * @since 2.5.0\n *\n * @param array  $terms    The term_taxonomy_id of terms to update.\n * @param string $taxonomy The context of the term.\n * @return true Always true when complete.\n */\nfunction wp_update_term_count_now( $terms, $taxonomy ) {\n\t$terms = array_map('intval', $terms);\n\n\t$taxonomy = get_taxonomy($taxonomy);\n\tif ( !empty($taxonomy->update_count_callback) ) {\n\t\tcall_user_func($taxonomy->update_count_callback, $terms, $taxonomy);\n\t} else {\n\t\t$object_types = (array) $taxonomy->object_type;\n\t\tforeach ( $object_types as &$object_type ) {\n\t\t\tif ( 0 === strpos( $object_type, 'attachment:' ) )\n\t\t\t\tlist( $object_type ) = explode( ':', $object_type );\n\t\t}\n\n\t\tif ( $object_types == array_filter( $object_types, 'post_type_exists' ) ) {\n\t\t\t// Only post types are attached to this taxonomy\n\t\t\t_update_post_term_count( $terms, $taxonomy );\n\t\t} else {\n\t\t\t// Default count updater\n\t\t\t_update_generic_term_count( $terms, $taxonomy );\n\t\t}\n\t}\n\n\tclean_term_cache($terms, '', false);\n\n\treturn true;\n}\n\n//\n// Cache\n//\n\n/**\n * Removes the taxonomy relationship to terms from the cache.\n *\n * Will remove the entire taxonomy relationship containing term `$object_id`. The\n * term IDs have to exist within the taxonomy `$object_type` for the deletion to\n * take place.\n *\n * @since 2.3.0\n *\n * @see get_object_taxonomies() for more on $object_type.\n *\n * @param int|array    $object_ids  Single or list of term object ID(s).\n * @param array|string $object_type The taxonomy object type.\n */\nfunction clean_object_term_cache($object_ids, $object_type) {\n\tif ( !is_array($object_ids) )\n\t\t$object_ids = array($object_ids);\n\n\t$taxonomies = get_object_taxonomies( $object_type );\n\n\tforeach ( $object_ids as $id ) {\n\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\twp_cache_delete($id, \"{$taxonomy}_relationships\");\n\t\t}\n\t}\n\n\t/**\n\t * Fires after the object term cache has been cleaned.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param array  $object_ids An array of object IDs.\n\t * @param string $objet_type Object type.\n\t */\n\tdo_action( 'clean_object_term_cache', $object_ids, $object_type );\n}\n\n/**\n * Will remove all of the term ids from the cache.\n *\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n * @global bool $_wp_suspend_cache_invalidation\n *\n * @param int|array $ids            Single or list of Term IDs.\n * @param string    $taxonomy       Optional. Can be empty and will assume `tt_ids`, else will use for context.\n *                                  Default empty.\n * @param bool      $clean_taxonomy Optional. Whether to clean taxonomy wide caches (true), or just individual\n *                                  term object caches (false). Default true.\n */\nfunction clean_term_cache($ids, $taxonomy = '', $clean_taxonomy = true) {\n\tglobal $wpdb, $_wp_suspend_cache_invalidation;\n\n\tif ( ! empty( $_wp_suspend_cache_invalidation ) ) {\n\t\treturn;\n\t}\n\n\tif ( !is_array($ids) )\n\t\t$ids = array($ids);\n\n\t$taxonomies = array();\n\t// If no taxonomy, assume tt_ids.\n\tif ( empty($taxonomy) ) {\n\t\t$tt_ids = array_map('intval', $ids);\n\t\t$tt_ids = implode(', ', $tt_ids);\n\t\t$terms = $wpdb->get_results(\"SELECT term_id, taxonomy FROM $wpdb->term_taxonomy WHERE term_taxonomy_id IN ($tt_ids)\");\n\t\t$ids = array();\n\t\tforeach ( (array) $terms as $term ) {\n\t\t\t$taxonomies[] = $term->taxonomy;\n\t\t\t$ids[] = $term->term_id;\n\t\t\twp_cache_delete( $term->term_id, 'terms' );\n\t\t}\n\t\t$taxonomies = array_unique($taxonomies);\n\t} else {\n\t\t$taxonomies = array($taxonomy);\n\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\tforeach ( $ids as $id ) {\n\t\t\t\twp_cache_delete( $id, 'terms' );\n\t\t\t}\n\t\t}\n\t}\n\n\tforeach ( $taxonomies as $taxonomy ) {\n\t\tif ( $clean_taxonomy ) {\n\t\t\twp_cache_delete('all_ids', $taxonomy);\n\t\t\twp_cache_delete('get', $taxonomy);\n\t\t\tdelete_option(\"{$taxonomy}_children\");\n\t\t\t// Regenerate {$taxonomy}_children\n\t\t\t_get_term_hierarchy($taxonomy);\n\t\t}\n\n\t\t/**\n\t\t * Fires once after each taxonomy's term cache has been cleaned.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array  $ids      An array of term IDs.\n\t\t * @param string $taxonomy Taxonomy slug.\n\t\t */\n\t\tdo_action( 'clean_term_cache', $ids, $taxonomy );\n\t}\n\n\twp_cache_set( 'last_changed', microtime(), 'terms' );\n}\n\n/**\n * Retrieves the taxonomy relationship to the term object id.\n *\n * @since 2.3.0\n *\n * @param int    $id       Term object ID.\n * @param string $taxonomy Taxonomy name.\n * @return bool|mixed Empty array if $terms found, but not `$taxonomy`. False if nothing is in cache\n *                    for `$taxonomy` and `$id`.\n */\nfunction get_object_term_cache( $id, $taxonomy ) {\n\treturn wp_cache_get( $id, \"{$taxonomy}_relationships\" );\n}\n\n/**\n * Updates the cache for the given term object ID(s).\n *\n * Note: Due to performance concerns, great care should be taken to only update\n * term caches when necessary. Processing time can increase exponentially depending\n * on both the number of passed term IDs and the number of taxonomies those terms\n * belong to.\n *\n * Caches will only be updated for terms not already cached.\n *\n * @since 2.3.0\n *\n * @param string|array $object_ids  Comma-separated list or array of term object IDs.\n * @param array|string $object_type The taxonomy object type.\n * @return void|false False if all of the terms in `$object_ids` are already cached.\n */\nfunction update_object_term_cache($object_ids, $object_type) {\n\tif ( empty($object_ids) )\n\t\treturn;\n\n\tif ( !is_array($object_ids) )\n\t\t$object_ids = explode(',', $object_ids);\n\n\t$object_ids = array_map('intval', $object_ids);\n\n\t$taxonomies = get_object_taxonomies($object_type);\n\n\t$ids = array();\n\tforeach ( (array) $object_ids as $id ) {\n\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\tif ( false === wp_cache_get($id, \"{$taxonomy}_relationships\") ) {\n\t\t\t\t$ids[] = $id;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( empty( $ids ) )\n\t\treturn false;\n\n\t$terms = wp_get_object_terms( $ids, $taxonomies, array(\n\t\t'fields' => 'all_with_object_id',\n\t\t'orderby' => 'name',\n\t\t'update_term_meta_cache' => false,\n\t) );\n\n\t$object_terms = array();\n\tforeach ( (array) $terms as $term )\n\t\t$object_terms[$term->object_id][$term->taxonomy][] = $term;\n\n\tforeach ( $ids as $id ) {\n\t\tforeach ( $taxonomies as $taxonomy ) {\n\t\t\tif ( ! isset($object_terms[$id][$taxonomy]) ) {\n\t\t\t\tif ( !isset($object_terms[$id]) )\n\t\t\t\t\t$object_terms[$id] = array();\n\t\t\t\t$object_terms[$id][$taxonomy] = array();\n\t\t\t}\n\t\t}\n\t}\n\n\tforeach ( $object_terms as $id => $value ) {\n\t\tforeach ( $value as $taxonomy => $terms ) {\n\t\t\twp_cache_add( $id, $terms, \"{$taxonomy}_relationships\" );\n\t\t}\n\t}\n}\n\n/**\n * Updates Terms to Taxonomy in cache.\n *\n * @since 2.3.0\n *\n * @param array  $terms    List of term objects to change.\n * @param string $taxonomy Optional. Update Term to this taxonomy in cache. Default empty.\n */\nfunction update_term_cache( $terms, $taxonomy = '' ) {\n\tforeach ( (array) $terms as $term ) {\n\t\t// Create a copy in case the array was passed by reference.\n\t\t$_term = clone $term;\n\n\t\t// Object ID should not be cached.\n\t\tunset( $_term->object_id );\n\n\t\twp_cache_add( $term->term_id, $_term, 'terms' );\n\t}\n}\n\n//\n// Private\n//\n\n/**\n * Retrieves children of taxonomy as Term IDs.\n *\n * @ignore\n * @since 2.3.0\n *\n * @param string $taxonomy Taxonomy name.\n * @return array Empty if $taxonomy isn't hierarchical or returns children as Term IDs.\n */\nfunction _get_term_hierarchy( $taxonomy ) {\n\tif ( !is_taxonomy_hierarchical($taxonomy) )\n\t\treturn array();\n\t$children = get_option(\"{$taxonomy}_children\");\n\n\tif ( is_array($children) )\n\t\treturn $children;\n\t$children = array();\n\t$terms = get_terms($taxonomy, array('get' => 'all', 'orderby' => 'id', 'fields' => 'id=>parent'));\n\tforeach ( $terms as $term_id => $parent ) {\n\t\tif ( $parent > 0 )\n\t\t\t$children[$parent][] = $term_id;\n\t}\n\tupdate_option(\"{$taxonomy}_children\", $children);\n\n\treturn $children;\n}\n\n/**\n * Get the subset of $terms that are descendants of $term_id.\n *\n * If `$terms` is an array of objects, then _get_term_children() returns an array of objects.\n * If `$terms` is an array of IDs, then _get_term_children() returns an array of IDs.\n *\n * @access private\n * @since 2.3.0\n *\n * @param int    $term_id   The ancestor term: all returned terms should be descendants of `$term_id`.\n * @param array  $terms     The set of terms - either an array of term objects or term IDs - from which those that\n *                          are descendants of $term_id will be chosen.\n * @param string $taxonomy  The taxonomy which determines the hierarchy of the terms.\n * @param array  $ancestors Optional. Term ancestors that have already been identified. Passed by reference, to keep\n *                          track of found terms when recursing the hierarchy. The array of located ancestors is used\n *                          to prevent infinite recursion loops. For performance, `term_ids` are used as array keys,\n *                          with 1 as value. Default empty array.\n * @return array|WP_Error The subset of $terms that are descendants of $term_id.\n */\nfunction _get_term_children( $term_id, $terms, $taxonomy, &$ancestors = array() ) {\n\t$empty_array = array();\n\tif ( empty($terms) )\n\t\treturn $empty_array;\n\n\t$term_list = array();\n\t$has_children = _get_term_hierarchy($taxonomy);\n\n\tif  ( ( 0 != $term_id ) && ! isset($has_children[$term_id]) )\n\t\treturn $empty_array;\n\n\t// Include the term itself in the ancestors array, so we can properly detect when a loop has occurred.\n\tif ( empty( $ancestors ) ) {\n\t\t$ancestors[ $term_id ] = 1;\n\t}\n\n\tforeach ( (array) $terms as $term ) {\n\t\t$use_id = false;\n\t\tif ( !is_object($term) ) {\n\t\t\t$term = get_term($term, $taxonomy);\n\t\t\tif ( is_wp_error( $term ) )\n\t\t\t\treturn $term;\n\t\t\t$use_id = true;\n\t\t}\n\n\t\t// Don't recurse if we've already identified the term as a child - this indicates a loop.\n\t\tif ( isset( $ancestors[ $term->term_id ] ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( $term->parent == $term_id ) {\n\t\t\tif ( $use_id )\n\t\t\t\t$term_list[] = $term->term_id;\n\t\t\telse\n\t\t\t\t$term_list[] = $term;\n\n\t\t\tif ( !isset($has_children[$term->term_id]) )\n\t\t\t\tcontinue;\n\n\t\t\t$ancestors[ $term->term_id ] = 1;\n\n\t\t\tif ( $children = _get_term_children( $term->term_id, $terms, $taxonomy, $ancestors) )\n\t\t\t\t$term_list = array_merge($term_list, $children);\n\t\t}\n\t}\n\n\treturn $term_list;\n}\n\n/**\n * Add count of children to parent count.\n *\n * Recalculates term counts by including items from child terms. Assumes all\n * relevant children are already in the $terms argument.\n *\n * @access private\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array  $terms    List of term objects, passed by reference.\n * @param string $taxonomy Term context.\n */\nfunction _pad_term_counts( &$terms, $taxonomy ) {\n\tglobal $wpdb;\n\n\t// This function only works for hierarchical taxonomies like post categories.\n\tif ( !is_taxonomy_hierarchical( $taxonomy ) )\n\t\treturn;\n\n\t$term_hier = _get_term_hierarchy($taxonomy);\n\n\tif ( empty($term_hier) )\n\t\treturn;\n\n\t$term_items = array();\n\t$terms_by_id = array();\n\t$term_ids = array();\n\n\tforeach ( (array) $terms as $key => $term ) {\n\t\t$terms_by_id[$term->term_id] = & $terms[$key];\n\t\t$term_ids[$term->term_taxonomy_id] = $term->term_id;\n\t}\n\n\t// Get the object and term ids and stick them in a lookup table.\n\t$tax_obj = get_taxonomy($taxonomy);\n\t$object_types = esc_sql($tax_obj->object_type);\n\t$results = $wpdb->get_results(\"SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (\" . implode(',', array_keys($term_ids)) . \") AND post_type IN ('\" . implode(\"', '\", $object_types) . \"') AND post_status = 'publish'\");\n\tforeach ( $results as $row ) {\n\t\t$id = $term_ids[$row->term_taxonomy_id];\n\t\t$term_items[$id][$row->object_id] = isset($term_items[$id][$row->object_id]) ? ++$term_items[$id][$row->object_id] : 1;\n\t}\n\n\t// Touch every ancestor's lookup row for each post in each term.\n\tforeach ( $term_ids as $term_id ) {\n\t\t$child = $term_id;\n\t\t$ancestors = array();\n\t\twhile ( !empty( $terms_by_id[$child] ) && $parent = $terms_by_id[$child]->parent ) {\n\t\t\t$ancestors[] = $child;\n\t\t\tif ( !empty( $term_items[$term_id] ) )\n\t\t\t\tforeach ( $term_items[$term_id] as $item_id => $touches ) {\n\t\t\t\t\t$term_items[$parent][$item_id] = isset($term_items[$parent][$item_id]) ? ++$term_items[$parent][$item_id]: 1;\n\t\t\t\t}\n\t\t\t$child = $parent;\n\n\t\t\tif ( in_array( $parent, $ancestors ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Transfer the touched cells.\n\tforeach ( (array) $term_items as $id => $items )\n\t\tif ( isset($terms_by_id[$id]) )\n\t\t\t$terms_by_id[$id]->count = count($items);\n}\n\n//\n// Default callbacks\n//\n\n/**\n * Will update term count based on object types of the current taxonomy.\n *\n * Private function for the default callback for post_tag and category\n * taxonomies.\n *\n * @access private\n * @since 2.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array  $terms    List of Term taxonomy IDs.\n * @param object $taxonomy Current taxonomy object of terms.\n */\nfunction _update_post_term_count( $terms, $taxonomy ) {\n\tglobal $wpdb;\n\n\t$object_types = (array) $taxonomy->object_type;\n\n\tforeach ( $object_types as &$object_type )\n\t\tlist( $object_type ) = explode( ':', $object_type );\n\n\t$object_types = array_unique( $object_types );\n\n\tif ( false !== ( $check_attachments = array_search( 'attachment', $object_types ) ) ) {\n\t\tunset( $object_types[ $check_attachments ] );\n\t\t$check_attachments = true;\n\t}\n\n\tif ( $object_types )\n\t\t$object_types = esc_sql( array_filter( $object_types, 'post_type_exists' ) );\n\n\tforeach ( (array) $terms as $term ) {\n\t\t$count = 0;\n\n\t\t// Attachments can be 'inherit' status, we need to base count off the parent's status if so.\n\t\tif ( $check_attachments )\n\t\t\t$count += (int) $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status = 'publish' OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) = 'publish' ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d\", $term ) );\n\n\t\tif ( $object_types )\n\t\t\t$count += (int) $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type IN ('\" . implode(\"', '\", $object_types ) . \"') AND term_taxonomy_id = %d\", $term ) );\n\n\t\t/** This action is documented in wp-includes/taxonomy.php */\n\t\tdo_action( 'edit_term_taxonomy', $term, $taxonomy->name );\n\t\t$wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );\n\n\t\t/** This action is documented in wp-includes/taxonomy.php */\n\t\tdo_action( 'edited_term_taxonomy', $term, $taxonomy->name );\n\t}\n}\n\n/**\n * Will update term count based on number of objects.\n *\n * Default callback for the 'link_category' taxonomy.\n *\n * @since 3.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array  $terms    List of term taxonomy IDs.\n * @param object $taxonomy Current taxonomy object of terms.\n */\nfunction _update_generic_term_count( $terms, $taxonomy ) {\n\tglobal $wpdb;\n\n\tforeach ( (array) $terms as $term ) {\n\t\t$count = $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(*) FROM $wpdb->term_relationships WHERE term_taxonomy_id = %d\", $term ) );\n\n\t\t/** This action is documented in wp-includes/taxonomy.php */\n\t\tdo_action( 'edit_term_taxonomy', $term, $taxonomy->name );\n\t\t$wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) );\n\n\t\t/** This action is documented in wp-includes/taxonomy.php */\n\t\tdo_action( 'edited_term_taxonomy', $term, $taxonomy->name );\n\t}\n}\n\n/**\n * Create a new term for a term_taxonomy item that currently shares its term\n * with another term_taxonomy.\n *\n * @ignore\n * @since 4.2.0\n * @since 4.3.0 Introduced `$record` parameter. Also, `$term_id` and\n *              `$term_taxonomy_id` can now accept objects.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int|object $term_id          ID of the shared term, or the shared term object.\n * @param int|object $term_taxonomy_id ID of the term_taxonomy item to receive a new term, or the term_taxonomy object\n *                                     (corresponding to a row from the term_taxonomy table).\n * @param bool       $record           Whether to record data about the split term in the options table. The recording\n *                                     process has the potential to be resource-intensive, so during batch operations\n *                                     it can be beneficial to skip inline recording and do it just once, after the\n *                                     batch is processed. Only set this to `false` if you know what you are doing.\n *                                     Default: true.\n * @return int|WP_Error When the current term does not need to be split (or cannot be split on the current\n *                      database schema), `$term_id` is returned. When the term is successfully split, the\n *                      new term_id is returned. A WP_Error is returned for miscellaneous errors.\n */\nfunction _split_shared_term( $term_id, $term_taxonomy_id, $record = true ) {\n\tglobal $wpdb;\n\n\tif ( is_object( $term_id ) ) {\n\t\t$shared_term = $term_id;\n\t\t$term_id = intval( $shared_term->term_id );\n\t}\n\n\tif ( is_object( $term_taxonomy_id ) ) {\n\t\t$term_taxonomy = $term_taxonomy_id;\n\t\t$term_taxonomy_id = intval( $term_taxonomy->term_taxonomy_id );\n\t}\n\n\t// If there are no shared term_taxonomy rows, there's nothing to do here.\n\t$shared_tt_count = $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(*) FROM $wpdb->term_taxonomy tt WHERE tt.term_id = %d AND tt.term_taxonomy_id != %d\", $term_id, $term_taxonomy_id ) );\n\n\tif ( ! $shared_tt_count ) {\n\t\treturn $term_id;\n\t}\n\n\t/*\n\t * Verify that the term_taxonomy_id passed to the function is actually associated with the term_id.\n\t * If there's a mismatch, it may mean that the term is already split. Return the actual term_id from the db.\n\t */\n\t$check_term_id = $wpdb->get_var( $wpdb->prepare( \"SELECT term_id FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d\", $term_taxonomy_id ) );\n\tif ( $check_term_id != $term_id ) {\n\t\treturn $check_term_id;\n\t}\n\n\t// Pull up data about the currently shared slug, which we'll use to populate the new one.\n\tif ( empty( $shared_term ) ) {\n\t\t$shared_term = $wpdb->get_row( $wpdb->prepare( \"SELECT t.* FROM $wpdb->terms t WHERE t.term_id = %d\", $term_id ) );\n\t}\n\n\t$new_term_data = array(\n\t\t'name' => $shared_term->name,\n\t\t'slug' => $shared_term->slug,\n\t\t'term_group' => $shared_term->term_group,\n\t);\n\n\tif ( false === $wpdb->insert( $wpdb->terms, $new_term_data ) ) {\n\t\treturn new WP_Error( 'db_insert_error', __( 'Could not split shared term.' ), $wpdb->last_error );\n\t}\n\n\t$new_term_id = (int) $wpdb->insert_id;\n\n\t// Update the existing term_taxonomy to point to the newly created term.\n\t$wpdb->update( $wpdb->term_taxonomy,\n\t\tarray( 'term_id' => $new_term_id ),\n\t\tarray( 'term_taxonomy_id' => $term_taxonomy_id )\n\t);\n\n\t// Reassign child terms to the new parent.\n\tif ( empty( $term_taxonomy ) ) {\n\t\t$term_taxonomy = $wpdb->get_row( $wpdb->prepare( \"SELECT * FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d\", $term_taxonomy_id ) );\n\t}\n\n\t$children_tt_ids = $wpdb->get_col( $wpdb->prepare( \"SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE parent = %d AND taxonomy = %s\", $term_id, $term_taxonomy->taxonomy ) );\n\tif ( ! empty( $children_tt_ids ) ) {\n\t\tforeach ( $children_tt_ids as $child_tt_id ) {\n\t\t\t$wpdb->update( $wpdb->term_taxonomy,\n\t\t\t\tarray( 'parent' => $new_term_id ),\n\t\t\t\tarray( 'term_taxonomy_id' => $child_tt_id )\n\t\t\t);\n\t\t\tclean_term_cache( $term_id, $term_taxonomy->taxonomy );\n\t\t}\n\t} else {\n\t\t// If the term has no children, we must force its taxonomy cache to be rebuilt separately.\n\t\tclean_term_cache( $new_term_id, $term_taxonomy->taxonomy );\n\t}\n\n\t// Clean the cache for term taxonomies formerly shared with the current term.\n\t$shared_term_taxonomies = $wpdb->get_row( $wpdb->prepare( \"SELECT taxonomy FROM $wpdb->term_taxonomy WHERE term_id = %d\", $term_id ) );\n\tif ( $shared_term_taxonomies ) {\n\t\tforeach ( $shared_term_taxonomies as $shared_term_taxonomy ) {\n\t\t\tclean_term_cache( $term_id, $shared_term_taxonomy );\n\t\t}\n\t}\n\n\t// Keep a record of term_ids that have been split, keyed by old term_id. See {@see wp_get_split_term()}.\n\tif ( $record ) {\n\t\t$split_term_data = get_option( '_split_terms', array() );\n\t\tif ( ! isset( $split_term_data[ $term_id ] ) ) {\n\t\t\t$split_term_data[ $term_id ] = array();\n\t\t}\n\n\t\t$split_term_data[ $term_id ][ $term_taxonomy->taxonomy ] = $new_term_id;\n\t\tupdate_option( '_split_terms', $split_term_data );\n\t}\n\n\t// If we've just split the final shared term, set the \"finished\" flag.\n\t$shared_terms_exist = $wpdb->get_results(\n\t\t\"SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt\n\t\t LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id\n\t\t GROUP BY t.term_id\n\t\t HAVING term_tt_count > 1\n\t\t LIMIT 1\"\n\t);\n\tif ( ! $shared_terms_exist ) {\n\t\tupdate_option( 'finished_splitting_shared_terms', true );\n\t}\n\n\t/**\n\t * Fires after a previously shared taxonomy term is split into two separate terms.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param int    $term_id          ID of the formerly shared term.\n\t * @param int    $new_term_id      ID of the new term created for the $term_taxonomy_id.\n\t * @param int    $term_taxonomy_id ID for the term_taxonomy row affected by the split.\n\t * @param string $taxonomy         Taxonomy for the split term.\n\t */\n\tdo_action( 'split_shared_term', $term_id, $new_term_id, $term_taxonomy_id, $term_taxonomy->taxonomy );\n\n\treturn $new_term_id;\n}\n\n/**\n * Splits a batch of shared taxonomy terms.\n *\n * @since 4.3.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n */\nfunction _wp_batch_split_terms() {\n\tglobal $wpdb;\n\n\t$lock_name = 'term_split.lock';\n\n\t// Try to lock.\n\t$lock_result = $wpdb->query( $wpdb->prepare( \"INSERT IGNORE INTO `$wpdb->options` ( `option_name`, `option_value`, `autoload` ) VALUES (%s, %s, 'no') /* LOCK */\", $lock_name, time() ) );\n\n\tif ( ! $lock_result ) {\n\t\t$lock_result = get_option( $lock_name );\n\n\t\t// Bail if we were unable to create a lock, or if the existing lock is still valid.\n\t\tif ( ! $lock_result || ( $lock_result > ( time() - HOUR_IN_SECONDS ) ) ) {\n\t\t\twp_schedule_single_event( time() + ( 5 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Update the lock, as by this point we've definitely got a lock, just need to fire the actions.\n\tupdate_option( $lock_name, time() );\n\n\t// Get a list of shared terms (those with more than one associated row in term_taxonomy).\n\t$shared_terms = $wpdb->get_results(\n\t\t\"SELECT tt.term_id, t.*, count(*) as term_tt_count FROM {$wpdb->term_taxonomy} tt\n\t\t LEFT JOIN {$wpdb->terms} t ON t.term_id = tt.term_id\n\t\t GROUP BY t.term_id\n\t\t HAVING term_tt_count > 1\n\t\t LIMIT 10\"\n\t);\n\n\t// No more terms, we're done here.\n\tif ( ! $shared_terms ) {\n\t\tupdate_option( 'finished_splitting_shared_terms', true );\n\t\tdelete_option( $lock_name );\n\t\treturn;\n\t}\n\n\t// Shared terms found? We'll need to run this script again.\n\twp_schedule_single_event( time() + ( 2 * MINUTE_IN_SECONDS ), 'wp_split_shared_term_batch' );\n\n\t// Rekey shared term array for faster lookups.\n\t$_shared_terms = array();\n\tforeach ( $shared_terms as $shared_term ) {\n\t\t$term_id = intval( $shared_term->term_id );\n\t\t$_shared_terms[ $term_id ] = $shared_term;\n\t}\n\t$shared_terms = $_shared_terms;\n\n\t// Get term taxonomy data for all shared terms.\n\t$shared_term_ids = implode( ',', array_keys( $shared_terms ) );\n\t$shared_tts = $wpdb->get_results( \"SELECT * FROM {$wpdb->term_taxonomy} WHERE `term_id` IN ({$shared_term_ids})\" );\n\n\t// Split term data recording is slow, so we do it just once, outside the loop.\n\t$split_term_data = get_option( '_split_terms', array() );\n\t$skipped_first_term = $taxonomies = array();\n\tforeach ( $shared_tts as $shared_tt ) {\n\t\t$term_id = intval( $shared_tt->term_id );\n\n\t\t// Don't split the first tt belonging to a given term_id.\n\t\tif ( ! isset( $skipped_first_term[ $term_id ] ) ) {\n\t\t\t$skipped_first_term[ $term_id ] = 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( ! isset( $split_term_data[ $term_id ] ) ) {\n\t\t\t$split_term_data[ $term_id ] = array();\n\t\t}\n\n\t\t// Keep track of taxonomies whose hierarchies need flushing.\n\t\tif ( ! isset( $taxonomies[ $shared_tt->taxonomy ] ) ) {\n\t\t\t$taxonomies[ $shared_tt->taxonomy ] = 1;\n\t\t}\n\n\t\t// Split the term.\n\t\t$split_term_data[ $term_id ][ $shared_tt->taxonomy ] = _split_shared_term( $shared_terms[ $term_id ], $shared_tt, false );\n\t}\n\n\t// Rebuild the cached hierarchy for each affected taxonomy.\n\tforeach ( array_keys( $taxonomies ) as $tax ) {\n\t\tdelete_option( \"{$tax}_children\" );\n\t\t_get_term_hierarchy( $tax );\n\t}\n\n\tupdate_option( '_split_terms', $split_term_data );\n\n\tdelete_option( $lock_name );\n}\n\n/**\n * In order to avoid the _wp_batch_split_terms() job being accidentally removed,\n * check that it's still scheduled while we haven't finished splitting terms.\n *\n * @ignore\n * @since 4.3.0\n */\nfunction _wp_check_for_scheduled_split_terms() {\n\tif ( ! get_option( 'finished_splitting_shared_terms' ) && ! wp_next_scheduled( 'wp_split_shared_term_batch' ) ) {\n\t\twp_schedule_single_event( time() + MINUTE_IN_SECONDS, 'wp_split_shared_term_batch' );\n\t}\n}\n\n/**\n * Check default categories when a term gets split to see if any of them need to be updated.\n *\n * @ignore\n * @since 4.2.0\n *\n * @param int    $term_id          ID of the formerly shared term.\n * @param int    $new_term_id      ID of the new term created for the $term_taxonomy_id.\n * @param int    $term_taxonomy_id ID for the term_taxonomy row affected by the split.\n * @param string $taxonomy         Taxonomy for the split term.\n */\nfunction _wp_check_split_default_terms( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {\n\tif ( 'category' != $taxonomy ) {\n\t\treturn;\n\t}\n\n\tforeach ( array( 'default_category', 'default_link_category', 'default_email_category' ) as $option ) {\n\t\tif ( $term_id == get_option( $option, -1 ) ) {\n\t\t\tupdate_option( $option, $new_term_id );\n\t\t}\n\t}\n}\n\n/**\n * Check menu items when a term gets split to see if any of them need to be updated.\n *\n * @ignore\n * @since 4.2.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $term_id          ID of the formerly shared term.\n * @param int    $new_term_id      ID of the new term created for the $term_taxonomy_id.\n * @param int    $term_taxonomy_id ID for the term_taxonomy row affected by the split.\n * @param string $taxonomy         Taxonomy for the split term.\n */\nfunction _wp_check_split_terms_in_menus( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {\n\tglobal $wpdb;\n\t$post_ids = $wpdb->get_col( $wpdb->prepare(\n\t\t\"SELECT m1.post_id\n\t\tFROM {$wpdb->postmeta} AS m1\n\t\t\tINNER JOIN {$wpdb->postmeta} AS m2 ON ( m2.post_id = m1.post_id )\n\t\t\tINNER JOIN {$wpdb->postmeta} AS m3 ON ( m3.post_id = m1.post_id )\n\t\tWHERE ( m1.meta_key = '_menu_item_type' AND m1.meta_value = 'taxonomy' )\n\t\t\tAND ( m2.meta_key = '_menu_item_object' AND m2.meta_value = '%s' )\n\t\t\tAND ( m3.meta_key = '_menu_item_object_id' AND m3.meta_value = %d )\",\n\t\t$taxonomy,\n\t\t$term_id\n\t) );\n\n\tif ( $post_ids ) {\n\t\tforeach ( $post_ids as $post_id ) {\n\t\t\tupdate_post_meta( $post_id, '_menu_item_object_id', $new_term_id, $term_id );\n\t\t}\n\t}\n}\n\n/**\n * If the term being split is a nav_menu, change associations.\n *\n * @ignore\n * @since 4.3.0\n *\n * @param int    $term_id          ID of the formerly shared term.\n * @param int    $new_term_id      ID of the new term created for the $term_taxonomy_id.\n * @param int    $term_taxonomy_id ID for the term_taxonomy row affected by the split.\n * @param string $taxonomy         Taxonomy for the split term.\n */\nfunction _wp_check_split_nav_menu_terms( $term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) {\n\tif ( 'nav_menu' !== $taxonomy ) {\n\t\treturn;\n\t}\n\n\t// Update menu locations.\n\t$locations = get_nav_menu_locations();\n\tforeach ( $locations as $location => $menu_id ) {\n\t\tif ( $term_id == $menu_id ) {\n\t\t\t$locations[ $location ] = $new_term_id;\n\t\t}\n\t}\n\tset_theme_mod( 'nav_menu_locations', $locations );\n}\n\n/**\n * Get data about terms that previously shared a single term_id, but have since been split.\n *\n * @since 4.2.0\n *\n * @param int $old_term_id Term ID. This is the old, pre-split term ID.\n * @return array Array of new term IDs, keyed by taxonomy.\n */\nfunction wp_get_split_terms( $old_term_id ) {\n\t$split_terms = get_option( '_split_terms', array() );\n\n\t$terms = array();\n\tif ( isset( $split_terms[ $old_term_id ] ) ) {\n\t\t$terms = $split_terms[ $old_term_id ];\n\t}\n\n\treturn $terms;\n}\n\n/**\n * Get the new term ID corresponding to a previously split term.\n *\n * @since 4.2.0\n *\n * @param int    $old_term_id Term ID. This is the old, pre-split term ID.\n * @param string $taxonomy    Taxonomy that the term belongs to.\n * @return int|false If a previously split term is found corresponding to the old term_id and taxonomy,\n *                   the new term_id will be returned. If no previously split term is found matching\n *                   the parameters, returns false.\n */\nfunction wp_get_split_term( $old_term_id, $taxonomy ) {\n\t$split_terms = wp_get_split_terms( $old_term_id );\n\n\t$term_id = false;\n\tif ( isset( $split_terms[ $taxonomy ] ) ) {\n\t\t$term_id = (int) $split_terms[ $taxonomy ];\n\t}\n\n\treturn $term_id;\n}\n\n/**\n * Determine whether a term is shared between multiple taxonomies.\n *\n * Shared taxonomy terms began to be split in 4.3, but failed cron tasks or other delays in upgrade routines may cause\n * shared terms to remain.\n *\n * @since 4.4.0\n *\n * @param int $term_id\n * @return bool\n */\nfunction wp_term_is_shared( $term_id ) {\n\tglobal $wpdb;\n\n\tif ( get_option( 'finished_splitting_shared_terms' ) ) {\n\t\treturn false;\n\t}\n\n\t$tt_count = $wpdb->get_var( $wpdb->prepare( \"SELECT COUNT(*) FROM $wpdb->term_taxonomy WHERE term_id = %d\", $term_id ) );\n\n\treturn $tt_count > 1;\n}\n\n/**\n * Generate a permalink for a taxonomy term archive.\n *\n * @since 2.5.0\n *\n * @global WP_Rewrite $wp_rewrite\n *\n * @param object|int|string $term     The term object, ID, or slug whose link will be retrieved.\n * @param string            $taxonomy Optional. Taxonomy. Default empty.\n * @return string|WP_Error HTML link to taxonomy term archive on success, WP_Error if term does not exist.\n */\nfunction get_term_link( $term, $taxonomy = '' ) {\n\tglobal $wp_rewrite;\n\n\tif ( !is_object($term) ) {\n\t\tif ( is_int( $term ) ) {\n\t\t\t$term = get_term( $term, $taxonomy );\n\t\t} else {\n\t\t\t$term = get_term_by( 'slug', $term, $taxonomy );\n\t\t}\n\t}\n\n\tif ( !is_object($term) )\n\t\t$term = new WP_Error('invalid_term', __('Empty Term'));\n\n\tif ( is_wp_error( $term ) )\n\t\treturn $term;\n\n\t$taxonomy = $term->taxonomy;\n\n\t$termlink = $wp_rewrite->get_extra_permastruct($taxonomy);\n\n\t$slug = $term->slug;\n\t$t = get_taxonomy($taxonomy);\n\n\tif ( empty($termlink) ) {\n\t\tif ( 'category' == $taxonomy )\n\t\t\t$termlink = '?cat=' . $term->term_id;\n\t\telseif ( $t->query_var )\n\t\t\t$termlink = \"?$t->query_var=$slug\";\n\t\telse\n\t\t\t$termlink = \"?taxonomy=$taxonomy&term=$slug\";\n\t\t$termlink = home_url($termlink);\n\t} else {\n\t\tif ( $t->rewrite['hierarchical'] ) {\n\t\t\t$hierarchical_slugs = array();\n\t\t\t$ancestors = get_ancestors( $term->term_id, $taxonomy, 'taxonomy' );\n\t\t\tforeach ( (array)$ancestors as $ancestor ) {\n\t\t\t\t$ancestor_term = get_term($ancestor, $taxonomy);\n\t\t\t\t$hierarchical_slugs[] = $ancestor_term->slug;\n\t\t\t}\n\t\t\t$hierarchical_slugs = array_reverse($hierarchical_slugs);\n\t\t\t$hierarchical_slugs[] = $slug;\n\t\t\t$termlink = str_replace(\"%$taxonomy%\", implode('/', $hierarchical_slugs), $termlink);\n\t\t} else {\n\t\t\t$termlink = str_replace(\"%$taxonomy%\", $slug, $termlink);\n\t\t}\n\t\t$termlink = home_url( user_trailingslashit($termlink, 'category') );\n\t}\n\t// Back Compat filters.\n\tif ( 'post_tag' == $taxonomy ) {\n\n\t\t/**\n\t\t * Filter the tag link.\n\t\t *\n\t\t * @since 2.3.0\n\t\t * @deprecated 2.5.0 Use 'term_link' instead.\n\t\t *\n\t\t * @param string $termlink Tag link URL.\n\t\t * @param int    $term_id  Term ID.\n\t\t */\n\t\t$termlink = apply_filters( 'tag_link', $termlink, $term->term_id );\n\t} elseif ( 'category' == $taxonomy ) {\n\n\t\t/**\n\t\t * Filter the category link.\n\t\t *\n\t\t * @since 1.5.0\n\t\t * @deprecated 2.5.0 Use 'term_link' instead.\n\t\t *\n\t\t * @param string $termlink Category link URL.\n\t\t * @param int    $term_id  Term ID.\n\t\t */\n\t\t$termlink = apply_filters( 'category_link', $termlink, $term->term_id );\n\t}\n\n\t/**\n\t * Filter the term link.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $termlink Term link URL.\n\t * @param object $term     Term object.\n\t * @param string $taxonomy Taxonomy slug.\n\t */\n\treturn apply_filters( 'term_link', $termlink, $term, $taxonomy );\n}\n\n/**\n * Display the taxonomies of a post with available options.\n *\n * This function can be used within the loop to display the taxonomies for a\n * post without specifying the Post ID. You can also use it outside the Loop to\n * display the taxonomies for a specific post.\n *\n * @since 2.5.0\n *\n * @param array $args {\n *     Arguments about which post to use and how to format the output. Shares all of the arguments\n *     supported by get_the_taxonomies(), in addition to the following.\n *\n *     @type  int|WP_Post $post   Post ID or object to get taxonomies of. Default current post.\n *     @type  string      $before Displays before the taxonomies. Default empty string.\n *     @type  string      $sep    Separates each taxonomy. Default is a space.\n *     @type  string      $after  Displays after the taxonomies. Default empty string.\n * }\n * @param array $args See {@link get_the_taxonomies()} for a description of arguments and their defaults.\n */\nfunction the_taxonomies( $args = array() ) {\n\t$defaults = array(\n\t\t'post' => 0,\n\t\t'before' => '',\n\t\t'sep' => ' ',\n\t\t'after' => '',\n\t);\n\n\t$r = wp_parse_args( $args, $defaults );\n\n\techo $r['before'] . join( $r['sep'], get_the_taxonomies( $r['post'], $r ) ) . $r['after'];\n}\n\n/**\n * Retrieve all taxonomies associated with a post.\n *\n * This function can be used within the loop. It will also return an array of\n * the taxonomies with links to the taxonomy and name.\n *\n * @since 2.5.0\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.\n * @param array $args {\n *     Optional. Arguments about how to format the list of taxonomies. Default empty array.\n *\n *     @type string $template      Template for displaying a taxonomy label and list of terms.\n *                                 Default is \"Label: Terms.\"\n *     @type string $term_template Template for displaying a single term in the list. Default is the term name\n *                                 linked to its archive.\n * }\n * @return array List of taxonomies.\n */\nfunction get_the_taxonomies( $post = 0, $args = array() ) {\n\t$post = get_post( $post );\n\n\t$args = wp_parse_args( $args, array(\n\t\t/* translators: %s: taxonomy label, %l: list of terms formatted as per $term_template */\n\t\t'template' => __( '%s: %l.' ),\n\t\t'term_template' => '<a href=\"%1$s\">%2$s</a>',\n\t) );\n\n\t$taxonomies = array();\n\n\tif ( ! $post ) {\n\t\treturn $taxonomies;\n\t}\n\n\tforeach ( get_object_taxonomies( $post ) as $taxonomy ) {\n\t\t$t = (array) get_taxonomy( $taxonomy );\n\t\tif ( empty( $t['label'] ) ) {\n\t\t\t$t['label'] = $taxonomy;\n\t\t}\n\t\tif ( empty( $t['args'] ) ) {\n\t\t\t$t['args'] = array();\n\t\t}\n\t\tif ( empty( $t['template'] ) ) {\n\t\t\t$t['template'] = $args['template'];\n\t\t}\n\t\tif ( empty( $t['term_template'] ) ) {\n\t\t\t$t['term_template'] = $args['term_template'];\n\t\t}\n\n\t\t$terms = get_object_term_cache( $post->ID, $taxonomy );\n\t\tif ( false === $terms ) {\n\t\t\t$terms = wp_get_object_terms( $post->ID, $taxonomy, $t['args'] );\n\t\t}\n\t\t$links = array();\n\n\t\tforeach ( $terms as $term ) {\n\t\t\t$links[] = wp_sprintf( $t['term_template'], esc_attr( get_term_link( $term ) ), $term->name );\n\t\t}\n\t\tif ( $links ) {\n\t\t\t$taxonomies[$taxonomy] = wp_sprintf( $t['template'], $t['label'], $links, $terms );\n\t\t}\n\t}\n\treturn $taxonomies;\n}\n\n/**\n * Retrieve all taxonomies of a post with just the names.\n *\n * @since 2.5.0\n *\n * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post.\n * @return array\n */\nfunction get_post_taxonomies( $post = 0 ) {\n\t$post = get_post( $post );\n\n\treturn get_object_taxonomies($post);\n}\n\n/**\n * Determine if the given object is associated with any of the given terms.\n *\n * The given terms are checked against the object's terms' term_ids, names and slugs.\n * Terms given as integers will only be checked against the object's terms' term_ids.\n * If no terms are given, determines if object is associated with any terms in the given taxonomy.\n *\n * @since 2.7.0\n *\n * @param int              $object_id ID of the object (post ID, link ID, ...).\n * @param string           $taxonomy  Single taxonomy name.\n * @param int|string|array $terms     Optional. Term term_id, name, slug or array of said. Default null.\n * @return bool|WP_Error WP_Error on input error.\n */\nfunction is_object_in_term( $object_id, $taxonomy, $terms = null ) {\n\tif ( !$object_id = (int) $object_id )\n\t\treturn new WP_Error( 'invalid_object', __( 'Invalid object ID' ) );\n\n\t$object_terms = get_object_term_cache( $object_id, $taxonomy );\n\tif ( false === $object_terms ) {\n\t\t$object_terms = wp_get_object_terms( $object_id, $taxonomy, array( 'update_term_meta_cache' => false ) );\n\t\twp_cache_set( $object_id, $object_terms, \"{$taxonomy}_relationships\" );\n\t}\n\n\tif ( is_wp_error( $object_terms ) )\n\t\treturn $object_terms;\n\tif ( empty( $object_terms ) )\n\t\treturn false;\n\tif ( empty( $terms ) )\n\t\treturn ( !empty( $object_terms ) );\n\n\t$terms = (array) $terms;\n\n\tif ( $ints = array_filter( $terms, 'is_int' ) )\n\t\t$strs = array_diff( $terms, $ints );\n\telse\n\t\t$strs =& $terms;\n\n\tforeach ( $object_terms as $object_term ) {\n\t\t// If term is an int, check against term_ids only.\n\t\tif ( $ints && in_array( $object_term->term_id, $ints ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( $strs ) {\n\t\t\t// Only check numeric strings against term_id, to avoid false matches due to type juggling.\n\t\t\t$numeric_strs = array_map( 'intval', array_filter( $strs, 'is_numeric' ) );\n\t\t\tif ( in_array( $object_term->term_id, $numeric_strs, true ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif ( in_array( $object_term->name, $strs ) ) return true;\n\t\t\tif ( in_array( $object_term->slug, $strs ) ) return true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Determine if the given object type is associated with the given taxonomy.\n *\n * @since 3.0.0\n *\n * @param string $object_type Object type string.\n * @param string $taxonomy    Single taxonomy name.\n * @return bool True if object is associated with the taxonomy, otherwise false.\n */\nfunction is_object_in_taxonomy( $object_type, $taxonomy ) {\n\t$taxonomies = get_object_taxonomies( $object_type );\n\tif ( empty( $taxonomies ) ) {\n\t\treturn false;\n\t}\n\treturn in_array( $taxonomy, $taxonomies );\n}\n\n/**\n * Get an array of ancestor IDs for a given object.\n *\n * @since 3.1.0\n * @since 4.1.0 Introduced the `$resource_type` argument.\n *\n * @param int    $object_id     Optional. The ID of the object. Default 0.\n * @param string $object_type   Optional. The type of object for which we'll be retrieving\n *                              ancestors. Accepts a post type or a taxonomy name. Default empty.\n * @param string $resource_type Optional. Type of resource $object_type is. Accepts 'post_type'\n *                              or 'taxonomy'. Default empty.\n * @return array An array of ancestors from lowest to highest in the hierarchy.\n */\nfunction get_ancestors( $object_id = 0, $object_type = '', $resource_type = '' ) {\n\t$object_id = (int) $object_id;\n\n\t$ancestors = array();\n\n\tif ( empty( $object_id ) ) {\n\n\t\t/** This filter is documented in wp-includes/taxonomy.php */\n\t\treturn apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type, $resource_type );\n\t}\n\n\tif ( ! $resource_type ) {\n\t\tif ( is_taxonomy_hierarchical( $object_type ) ) {\n\t\t\t$resource_type = 'taxonomy';\n\t\t} elseif ( post_type_exists( $object_type ) ) {\n\t\t\t$resource_type = 'post_type';\n\t\t}\n\t}\n\n\tif ( 'taxonomy' === $resource_type ) {\n\t\t$term = get_term($object_id, $object_type);\n\t\twhile ( ! is_wp_error($term) && ! empty( $term->parent ) && ! in_array( $term->parent, $ancestors ) ) {\n\t\t\t$ancestors[] = (int) $term->parent;\n\t\t\t$term = get_term($term->parent, $object_type);\n\t\t}\n\t} elseif ( 'post_type' === $resource_type ) {\n\t\t$ancestors = get_post_ancestors($object_id);\n\t}\n\n\t/**\n\t * Filter a given object's ancestors.\n\t *\n\t * @since 3.1.0\n\t * @since 4.1.1 Introduced the `$resource_type` parameter.\n\t *\n\t * @param array  $ancestors     An array of object ancestors.\n\t * @param int    $object_id     Object ID.\n\t * @param string $object_type   Type of object.\n\t * @param string $resource_type Type of resource $object_type is.\n\t */\n\treturn apply_filters( 'get_ancestors', $ancestors, $object_id, $object_type, $resource_type );\n}\n\n/**\n * Returns the term's parent's term_ID.\n *\n * @since 3.1.0\n *\n * @param int    $term_id  Term ID.\n * @param string $taxonomy Taxonomy name.\n * @return int|false False on error.\n */\nfunction wp_get_term_taxonomy_parent_id( $term_id, $taxonomy ) {\n\t$term = get_term( $term_id, $taxonomy );\n\tif ( ! $term || is_wp_error( $term ) ) {\n\t\treturn false;\n\t}\n\treturn (int) $term->parent;\n}\n\n/**\n * Checks the given subset of the term hierarchy for hierarchy loops.\n * Prevents loops from forming and breaks those that it finds.\n *\n * Attached to the {@see 'wp_update_term_parent'} filter.\n *\n * @since 3.1.0\n *\n * @param int    $parent   `term_id` of the parent for the term we're checking.\n * @param int    $term_id  The term we're checking.\n * @param string $taxonomy The taxonomy of the term we're checking.\n *\n * @return int The new parent for the term.\n */\nfunction wp_check_term_hierarchy_for_loops( $parent, $term_id, $taxonomy ) {\n\t// Nothing fancy here - bail\n\tif ( !$parent )\n\t\treturn 0;\n\n\t// Can't be its own parent.\n\tif ( $parent == $term_id )\n\t\treturn 0;\n\n\t// Now look for larger loops.\n\tif ( !$loop = wp_find_hierarchy_loop( 'wp_get_term_taxonomy_parent_id', $term_id, $parent, array( $taxonomy ) ) )\n\t\treturn $parent; // No loop\n\n\t// Setting $parent to the given value causes a loop.\n\tif ( isset( $loop[$term_id] ) )\n\t\treturn 0;\n\n\t// There's a loop, but it doesn't contain $term_id. Break the loop.\n\tforeach ( array_keys( $loop ) as $loop_member )\n\t\twp_update_term( $loop_member, $taxonomy, array( 'parent' => 0 ) );\n\n\treturn $parent;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/template-loader.php",
    "content": "<?php\n/**\n * Loads the correct template based on the visitor's url\n * @package WordPress\n */\nif ( defined('WP_USE_THEMES') && WP_USE_THEMES )\n\t/**\n\t * Fires before determining which template to load.\n\t *\n\t * @since 1.5.0\n\t */\n\tdo_action( 'template_redirect' );\n\n/**\n * Filter whether to allow 'HEAD' requests to generate content.\n *\n * Provides a significant performance bump by exiting before the page\n * content loads for 'HEAD' requests. See #14348.\n *\n * @since 3.5.0\n *\n * @param bool $exit Whether to exit without generating any content for 'HEAD' requests. Default true.\n */\nif ( 'HEAD' === $_SERVER['REQUEST_METHOD'] && apply_filters( 'exit_on_http_head', true ) )\n\texit();\n\n// Process feeds and trackbacks even if not using themes.\nif ( is_robots() ) :\n\t/**\n\t * Fired when the template loader determines a robots.txt request.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'do_robots' );\n\treturn;\nelseif ( is_feed() ) :\n\tdo_feed();\n\treturn;\nelseif ( is_trackback() ) :\n\tinclude( ABSPATH . 'wp-trackback.php' );\n\treturn;\nelseif ( is_embed() ) :\n\t$template = ABSPATH . WPINC . '/embed-template.php';\n\n\t/**\n\t * Filter the template used for embedded posts.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $template Path to the template file.\n\t */\n\t$template = apply_filters( 'embed_template', $template );\n\n\tinclude ( $template );\n\treturn;\nendif;\n\nif ( defined('WP_USE_THEMES') && WP_USE_THEMES ) :\n\t$template = false;\n\tif     ( is_404()            && $template = get_404_template()            ) :\n\telseif ( is_search()         && $template = get_search_template()         ) :\n\telseif ( is_front_page()     && $template = get_front_page_template()     ) :\n\telseif ( is_home()           && $template = get_home_template()           ) :\n\telseif ( is_post_type_archive() && $template = get_post_type_archive_template() ) :\n\telseif ( is_tax()            && $template = get_taxonomy_template()       ) :\n\telseif ( is_attachment()     && $template = get_attachment_template()     ) :\n\t\tremove_filter('the_content', 'prepend_attachment');\n\telseif ( is_single()         && $template = get_single_template()         ) :\n\telseif ( is_page()           && $template = get_page_template()           ) :\n\telseif ( is_singular()       && $template = get_singular_template()       ) :\n\telseif ( is_category()       && $template = get_category_template()       ) :\n\telseif ( is_tag()            && $template = get_tag_template()            ) :\n\telseif ( is_author()         && $template = get_author_template()         ) :\n\telseif ( is_date()           && $template = get_date_template()           ) :\n\telseif ( is_archive()        && $template = get_archive_template()        ) :\n\telseif ( is_comments_popup() && $template = get_comments_popup_template() ) :\n\telseif ( is_paged()          && $template = get_paged_template()          ) :\n\telse :\n\t\t$template = get_index_template();\n\tendif;\n\t/**\n\t * Filter the path of the current template before including it.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $template The path of the template to include.\n\t */\n\tif ( $template = apply_filters( 'template_include', $template ) )\n\t\tinclude( $template );\n\treturn;\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/template.php",
    "content": "<?php\n/**\n * Template loading functions.\n *\n * @package WordPress\n * @subpackage Template\n */\n\n/**\n * Retrieve path to a template\n *\n * Used to quickly retrieve the path of a template without including the file\n * extension. It will also check the parent theme, if the file exists, with\n * the use of {@link locate_template()}. Allows for more generic template location\n * without the use of the other get_*_template() functions.\n *\n * @since 1.5.0\n *\n * @param string $type      Filename without extension.\n * @param array  $templates An optional list of template candidates\n * @return string Full path to template file.\n */\nfunction get_query_template( $type, $templates = array() ) {\n\t$type = preg_replace( '|[^a-z0-9-]+|', '', $type );\n\n\tif ( empty( $templates ) )\n\t\t$templates = array(\"{$type}.php\");\n\n\t$template = locate_template( $templates );\n\n\t/**\n\t * Filter the path of the queried template by type.\n\t *\n\t * The dynamic portion of the hook name, `$type`, refers to the filename -- minus the file\n\t * extension and any non-alphanumeric characters delimiting words -- of the file to load.\n\t * This hook also applies to various types of files loaded as part of the Template Hierarchy.\n\t *\n\t * Possible values for `$type` include: 'index', '404', 'archive', 'author', 'category', 'tag', 'taxonomy', 'date',\n\t * 'home', 'front_page', 'page', 'paged', 'search', 'single', 'singular', and 'attachment'.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $template Path to the template. See locate_template().\n\t */\n\treturn apply_filters( \"{$type}_template\", $template );\n}\n\n/**\n * Retrieve path of index template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'index_template'.\n *\n * @since 3.0.0\n *\n * @see get_query_template()\n *\n * @return string Full path to index template file.\n */\nfunction get_index_template() {\n\treturn get_query_template('index');\n}\n\n/**\n * Retrieve path of 404 template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. '404_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to 404 template file.\n */\nfunction get_404_template() {\n\treturn get_query_template('404');\n}\n\n/**\n * Retrieve path of archive template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'archive_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to archive template file.\n */\nfunction get_archive_template() {\n\t$post_types = array_filter( (array) get_query_var( 'post_type' ) );\n\n\t$templates = array();\n\n\tif ( count( $post_types ) == 1 ) {\n\t\t$post_type = reset( $post_types );\n\t\t$templates[] = \"archive-{$post_type}.php\";\n\t}\n\t$templates[] = 'archive.php';\n\n\treturn get_query_template( 'archive', $templates );\n}\n\n/**\n * Retrieve path of post type archive template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'archive_template'.\n *\n * @since 3.7.0\n *\n * @see get_archive_template()\n *\n * @return string Full path to archive template file.\n */\nfunction get_post_type_archive_template() {\n\t$post_type = get_query_var( 'post_type' );\n\tif ( is_array( $post_type ) )\n\t\t$post_type = reset( $post_type );\n\n\t$obj = get_post_type_object( $post_type );\n\tif ( ! $obj->has_archive )\n\t\treturn '';\n\n\treturn get_archive_template();\n}\n\n/**\n * Retrieve path of author template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'author_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to author template file.\n */\nfunction get_author_template() {\n\t$author = get_queried_object();\n\n\t$templates = array();\n\n\tif ( $author instanceof WP_User ) {\n\t\t$templates[] = \"author-{$author->user_nicename}.php\";\n\t\t$templates[] = \"author-{$author->ID}.php\";\n\t}\n\t$templates[] = 'author.php';\n\n\treturn get_query_template( 'author', $templates );\n}\n\n/**\n * Retrieve path of category template in current or parent template.\n *\n * Works by first retrieving the current slug, for example 'category-default.php',\n * and then trying category ID, for example 'category-1.php', and will finally fall\n * back to category.php template, if those files don't exist.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'category_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to category template file.\n */\nfunction get_category_template() {\n\t$category = get_queried_object();\n\n\t$templates = array();\n\n\tif ( ! empty( $category->slug ) ) {\n\t\t$templates[] = \"category-{$category->slug}.php\";\n\t\t$templates[] = \"category-{$category->term_id}.php\";\n\t}\n\t$templates[] = 'category.php';\n\n\treturn get_query_template( 'category', $templates );\n}\n\n/**\n * Retrieve path of tag template in current or parent template.\n *\n * Works by first retrieving the current tag name, for example 'tag-wordpress.php',\n * and then trying tag ID, for example 'tag-1.php', and will finally fall back to\n * tag.php template, if those files don't exist.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'tag_template'.\n *\n * @since 2.3.0\n *\n * @see get_query_template()\n *\n * @return string Full path to tag template file.\n */\nfunction get_tag_template() {\n\t$tag = get_queried_object();\n\n\t$templates = array();\n\n\tif ( ! empty( $tag->slug ) ) {\n\t\t$templates[] = \"tag-{$tag->slug}.php\";\n\t\t$templates[] = \"tag-{$tag->term_id}.php\";\n\t}\n\t$templates[] = 'tag.php';\n\n\treturn get_query_template( 'tag', $templates );\n}\n\n/**\n * Retrieve path of taxonomy template in current or parent template.\n *\n * Retrieves the taxonomy and term, if term is available. The template is\n * prepended with 'taxonomy-' and followed by both the taxonomy string and\n * the taxonomy string followed by a dash and then followed by the term.\n *\n * The taxonomy and term template is checked and used first, if it exists.\n * Second, just the taxonomy template is checked, and then finally, taxonomy.php\n * template is used. If none of the files exist, then it will fall back on to\n * index.php.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'taxonomy_template'.\n *\n * @since 2.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to taxonomy template file.\n */\nfunction get_taxonomy_template() {\n\t$term = get_queried_object();\n\n\t$templates = array();\n\n\tif ( ! empty( $term->slug ) ) {\n\t\t$taxonomy = $term->taxonomy;\n\t\t$templates[] = \"taxonomy-$taxonomy-{$term->slug}.php\";\n\t\t$templates[] = \"taxonomy-$taxonomy.php\";\n\t}\n\t$templates[] = 'taxonomy.php';\n\n\treturn get_query_template( 'taxonomy', $templates );\n}\n\n/**\n * Retrieve path of date template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'date_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to date template file.\n */\nfunction get_date_template() {\n\treturn get_query_template('date');\n}\n\n/**\n * Retrieve path of home template in current or parent template.\n *\n * This is the template used for the page containing the blog posts.\n * Attempts to locate 'home.php' first before falling back to 'index.php'.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'home_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to home template file.\n */\nfunction get_home_template() {\n\t$templates = array( 'home.php', 'index.php' );\n\n\treturn get_query_template( 'home', $templates );\n}\n\n/**\n * Retrieve path of front-page template in current or parent template.\n *\n * Looks for 'front-page.php'. The template path is filterable via the\n * dynamic {@see '$type_template'} hook, e.g. 'frontpage_template'.\n *\n * @since 3.0.0\n *\n * @see get_query_template()\n *\n * @return string Full path to front page template file.\n */\nfunction get_front_page_template() {\n\t$templates = array('front-page.php');\n\n\treturn get_query_template( 'front_page', $templates );\n}\n\n/**\n * Retrieve path of page template in current or parent template.\n *\n * Will first look for the specifically assigned page template.\n * Then will search for 'page-{slug}.php', followed by 'page-{id}.php',\n * and finally 'page.php'.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'page_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to page template file.\n */\nfunction get_page_template() {\n\t$id = get_queried_object_id();\n\t$template = get_page_template_slug();\n\t$pagename = get_query_var('pagename');\n\n\tif ( ! $pagename && $id ) {\n\t\t// If a static page is set as the front page, $pagename will not be set. Retrieve it from the queried object\n\t\t$post = get_queried_object();\n\t\tif ( $post )\n\t\t\t$pagename = $post->post_name;\n\t}\n\n\t$templates = array();\n\tif ( $template && 0 === validate_file( $template ) )\n\t\t$templates[] = $template;\n\tif ( $pagename )\n\t\t$templates[] = \"page-$pagename.php\";\n\tif ( $id )\n\t\t$templates[] = \"page-$id.php\";\n\t$templates[] = 'page.php';\n\n\treturn get_query_template( 'page', $templates );\n}\n\n/**\n * Retrieve path of paged template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'paged_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to paged template file.\n */\nfunction get_paged_template() {\n\treturn get_query_template('paged');\n}\n\n/**\n * Retrieve path of search template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'search_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to search template file.\n */\nfunction get_search_template() {\n\treturn get_query_template('search');\n}\n\n/**\n * Retrieve path of single template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'single_template'.\n *\n * @since 1.5.0\n * @since 4.4.0 `single-{post_type}-{post_name}.php` was added to the top of the template hierarchy.\n *\n * @see get_query_template()\n *\n * @return string Full path to single template file.\n */\nfunction get_single_template() {\n\t$object = get_queried_object();\n\n\t$templates = array();\n\n\tif ( ! empty( $object->post_type ) ) {\n\t\t$templates[] = \"single-{$object->post_type}-{$object->post_name}.php\";\n\t\t$templates[] = \"single-{$object->post_type}.php\";\n\t}\n\n\t$templates[] = \"single.php\";\n\n\treturn get_query_template( 'single', $templates );\n}\n\n/**\n * Retrieves the path of the singular template in current or parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'singular_template'.\n *\n * @since 4.3.0\n *\n * @see get_query_template()\n *\n * @return string Full path to singular template file\n */\nfunction get_singular_template() {\n\treturn get_query_template( 'singular' );\n}\n\n/**\n * Retrieve path of attachment template in current or parent template.\n *\n * The attachment path first checks if the first part of the mime type exists.\n * The second check is for the second part of the mime type. The last check is\n * for both types separated by an underscore. If neither are found then the file\n * 'attachment.php' is checked and returned.\n *\n * Some examples for the 'text/plain' mime type are 'text.php', 'plain.php', and\n * finally 'text-plain.php'.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'attachment_template'.\n *\n * @since 2.0.0\n *\n * @see get_query_template()\n *\n * @global array $posts\n *\n * @return string Full path to attachment template file.\n */\nfunction get_attachment_template() {\n\t$attachment = get_queried_object();\n\n\t$templates = array();\n\n\tif ( $attachment ) {\n\t\tif ( false !== strpos( $attachment->post_mime_type, '/' ) ) {\n\t\t\tlist( $type, $subtype ) = explode( '/', $attachment->post_mime_type );\n\t\t} else {\n\t\t\tlist( $type, $subtype ) = array( $attachment->post_mime_type, '' );\n\t\t}\n\n\t\tif ( ! empty( $subtype ) ) {\n\t\t\t$templates[] = \"{$type}-{$subtype}.php\";\n\t\t\t$templates[] = \"{$subtype}.php\";\n\t\t}\n\t\t$templates[] = \"{$type}.php\";\n\t}\n\t$templates[] = 'attachment.php';\n\n\treturn get_query_template( 'attachment', $templates );\n}\n\n/**\n * Retrieve path of comment popup template in current or parent template.\n *\n * Checks for comment popup template in current template, if it exists or in the\n * parent template.\n *\n * The template path is filterable via the dynamic {@see '$type_template'} hook,\n * e.g. 'commentspopup_template'.\n *\n * @since 1.5.0\n *\n * @see get_query_template()\n *\n * @return string Full path to comments popup template file.\n */\nfunction get_comments_popup_template() {\n\t$template = get_query_template( 'comments_popup', array( 'comments-popup.php' ) );\n\n\t// Backward compat code will be removed in a future release.\n\tif ('' == $template)\n\t\t$template = ABSPATH . WPINC . '/theme-compat/comments-popup.php';\n\n\treturn $template;\n}\n\n/**\n * Retrieve the name of the highest priority template file that exists.\n *\n * Searches in the STYLESHEETPATH before TEMPLATEPATH so that themes which\n * inherit from a parent theme can just overload one file.\n *\n * @since 2.7.0\n *\n * @param string|array $template_names Template file(s) to search for, in order.\n * @param bool         $load           If true the template file will be loaded if it is found.\n * @param bool         $require_once   Whether to require_once or require. Default true. Has no effect if $load is false.\n * @return string The template filename if one is located.\n */\nfunction locate_template($template_names, $load = false, $require_once = true ) {\n\t$located = '';\n\tforeach ( (array) $template_names as $template_name ) {\n\t\tif ( !$template_name )\n\t\t\tcontinue;\n\t\tif ( file_exists(STYLESHEETPATH . '/' . $template_name)) {\n\t\t\t$located = STYLESHEETPATH . '/' . $template_name;\n\t\t\tbreak;\n\t\t} elseif ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {\n\t\t\t$located = TEMPLATEPATH . '/' . $template_name;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif ( $load && '' != $located )\n\t\tload_template( $located, $require_once );\n\n\treturn $located;\n}\n\n/**\n * Require the template file with WordPress environment.\n *\n * The globals are set up for the template file to ensure that the WordPress\n * environment is available from within the function. The query variables are\n * also available.\n *\n * @since 1.5.0\n *\n * @global array      $posts\n * @global WP_Post    $post\n * @global bool       $wp_did_header\n * @global WP_Query   $wp_query\n * @global WP_Rewrite $wp_rewrite\n * @global wpdb       $wpdb\n * @global string     $wp_version\n * @global WP         $wp\n * @global int        $id\n * @global WP_Comment $comment\n * @global int        $user_ID\n *\n * @param string $_template_file Path to template file.\n * @param bool   $require_once   Whether to require_once or require. Default true.\n */\nfunction load_template( $_template_file, $require_once = true ) {\n\tglobal $posts, $post, $wp_did_header, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;\n\n\tif ( is_array( $wp_query->query_vars ) ) {\n\t\textract( $wp_query->query_vars, EXTR_SKIP );\n\t}\n\n\tif ( isset( $s ) ) {\n\t\t$s = esc_attr( $s );\n\t}\n\n\tif ( $require_once ) {\n\t\trequire_once( $_template_file );\n\t} else {\n\t\trequire( $_template_file );\n\t}\n}\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/theme-compat/comments-popup.php",
    "content": "<?php\n/**\n * @package WordPress\n * @subpackage Theme_Compat\n * @deprecated 3.0\n *\n * This file is here for Backwards compatibility with old themes and will be removed in a future version\n *\n */\n_deprecated_file(\n\t/* translators: %s: template name */\n\tsprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),\n\t'3.0',\n\tnull,\n\t/* translators: %s: template name */\n\tsprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )\n);\n?><!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n     <title><?php printf(__('%1$s - Comments on %2$s'), get_option('blogname'), the_title('','',false)); ?></title>\n\n\t<meta http-equiv=\"Content-Type\" content=\"<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>\" />\n\t<style type=\"text/css\" media=\"screen\">\n\t\t@import url( <?php bloginfo('stylesheet_url'); ?> );\n\t\tbody { margin: 3px; }\n\t</style>\n\n</head>\n<body id=\"commentspopup\">\n\n<h1 id=\"header\"><a href=\"\" title=\"<?php echo get_option('blogname'); ?>\"><?php echo get_option('blogname'); ?></a></h1>\n\n<?php\n/* Don't remove these lines. */\nadd_filter('comment_text', 'popuplinks');\nif ( have_posts() ) :\nwhile( have_posts()) : the_post();\n?>\n<h2 id=\"comments\"><?php _e('Comments'); ?></h2>\n\n<p><a href=\"<?php echo esc_url( get_post_comments_feed_link($post->ID) ); ?>\"><?php _e('<abbr title=\"Really Simple Syndication\">RSS</abbr> feed for comments on this post.'); ?></a></p>\n\n<?php\n// this line is WordPress' motor, do not delete it.\n$commenter = wp_get_current_commenter();\n$comments = get_approved_comments($id);\n$post = get_post($id);\nif ( post_password_required($post) ) {  // and it doesn't match the cookie\n\techo(get_the_password_form());\n} else { ?>\n\n<?php if ($comments) { ?>\n<ol id=\"commentlist\">\n<?php foreach ($comments as $comment) { ?>\n\t<li id=\"comment-<?php comment_ID() ?>\">\n\t<?php comment_text() ?>\n\t<p><cite><?php comment_type(); ?> <?php printf(__('by %1$s &#8212; %2$s @ <a href=\"#comment-%3$s\">%4$s</a>'), get_comment_author_link( $comment ), get_comment_date( '', $comment ), get_comment_ID(), get_comment_time()); ?></cite></p>\n\t</li>\n\n<?php } // end for each comment ?>\n</ol>\n<?php } else { // this is displayed if there are no comments so far ?>\n\t<p><?php _e('No comments yet.'); ?></p>\n<?php } ?>\n\n<?php if ( comments_open() ) { ?>\n<h2><?php _e('Leave a comment'); ?></h2>\n\n<form action=\"<?php echo site_url(); ?>/wp-comments-post.php\" method=\"post\" id=\"commentform\">\n<?php if ( $user_ID ) : ?>\n\t<p><?php printf(__('Logged in as <a href=\"%1$s\">%2$s</a>. <a href=\"%3$s\" title=\"Log out of this account\">Log out &raquo;</a>'), get_edit_user_link(), $user_identity, wp_logout_url(get_permalink())); ?></p>\n<?php else : ?>\n\t<p>\n\t  <input type=\"text\" name=\"author\" id=\"author\" class=\"textarea\" value=\"<?php echo esc_attr( $commenter['comment_author'] ); ?>\" size=\"28\" tabindex=\"1\" />\n\t   <label for=\"author\"><?php _e('Name'); ?></label>\n\t</p>\n\n\t<p>\n\t  <input type=\"text\" name=\"email\" id=\"email\" value=\"<?php echo esc_attr( $commenter['comment_author_email'] ); ?>\" size=\"28\" tabindex=\"2\" />\n\t   <label for=\"email\"><?php _e('Email'); ?></label>\n\t</p>\n\n\t<p>\n\t  <input type=\"text\" name=\"url\" id=\"url\" value=\"<?php echo esc_attr( $commenter['comment_author_url'] ); ?>\" size=\"28\" tabindex=\"3\" />\n\t   <label for=\"url\"><?php _e('<abbr title=\"Universal Resource Locator\">URL</abbr>'); ?></label>\n\t</p>\n<?php endif; ?>\n\n\t<p>\n\t  <label for=\"comment\"><?php _e('Your Comment'); ?></label>\n\t<br />\n\t  <textarea name=\"comment\" id=\"comment\" cols=\"70\" rows=\"4\" tabindex=\"4\"></textarea>\n\t</p>\n\n\t<p>\n\t  <input type=\"hidden\" name=\"comment_post_ID\" value=\"<?php echo $id; ?>\" />\n\t  <input type=\"hidden\" name=\"redirect_to\" value=\"<?php echo esc_attr($_SERVER[\"REQUEST_URI\"]); ?>\" />\n\t  <input name=\"submit\" type=\"submit\" tabindex=\"5\" value=\"<?php esc_attr_e('Say It!' ); ?>\" />\n\t</p>\n\t<?php\n\t/** This filter is documented in wp-includes/comment-template.php */\n\tdo_action( 'comment_form', $post->ID );\n\t?>\n</form>\n<?php } else { // comments are closed ?>\n<p><?php _e('Sorry, the comment form is closed at this time.'); ?></p>\n<?php }\n} // end password check\n?>\n\n<div><strong><a href=\"javascript:window.close()\"><?php _e('Close this window.'); ?></a></strong></div>\n\n<?php // if you delete this the sky will fall on your head\nendwhile; // have_posts()\nelse: // have_posts()\n?>\n<p><?php _e('Sorry, no posts matched your criteria.'); ?></p>\n<?php endif; ?>\n<!-- // this is just the end of the motor - don't touch that line either :) -->\n<?php //} ?>\n<p class=\"credit\"><?php timer_stop(1); ?> <cite><?php printf(__('Powered by <a href=\"%s\" title=\"Powered by WordPress, state-of-the-art semantic personal publishing platform\"><strong>WordPress</strong></a>'), 'https://wordpress.org/'); ?></cite></p>\n<?php // Seen at http://www.mijnkopthee.nl/log2/archive/2003/05/28/esc(18) ?>\n<script type=\"text/javascript\">\n<!--\ndocument.onkeypress = function esc(e) {\n\tif(typeof(e) == \"undefined\") { e=event; }\n\tif (e.keyCode == 27) { self.close(); }\n}\n// -->\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/theme-compat/comments.php",
    "content": "<?php\n/**\n * @package WordPress\n * @subpackage Theme_Compat\n * @deprecated 3.0\n *\n * This file is here for Backwards compatibility with old themes and will be removed in a future version\n *\n */\n_deprecated_file(\n\t/* translators: %s: template name */\n\tsprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),\n\t'3.0',\n\tnull,\n\t/* translators: %s: template name */\n\tsprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )\n);\n\n// Do not delete these lines\n\tif (!empty($_SERVER['SCRIPT_FILENAME']) && 'comments.php' == basename($_SERVER['SCRIPT_FILENAME']))\n\t\tdie ('Please do not load this page directly. Thanks!');\n\n\tif ( post_password_required() ) { ?>\n\t\t<p class=\"nocomments\"><?php _e('This post is password protected. Enter the password to view comments.'); ?></p>\n\t<?php\n\t\treturn;\n\t}\n?>\n\n<!-- You can start editing here. -->\n\n<?php if ( have_comments() ) : ?>\n\t<h3 id=\"comments\">\n\t\t<?php\n\t\t\tif ( 1 == get_comments_number() ) {\n\t\t\t\t/* translators: %s: post title */\n\t\t\t\tprintf( __( 'One response to %s' ),  '&#8220;' . get_the_title() . '&#8221;' );\n\t\t\t} else {\n\t\t\t\t/* translators: 1: number of comments, 2: post title */\n\t\t\t\tprintf( _n( '%1$s response to %2$s', '%1$s responses to %2$s', get_comments_number() ),\n\t\t\t\t\tnumber_format_i18n( get_comments_number() ),  '&#8220;' . get_the_title() . '&#8221;' );\n\t\t\t}\n\t\t?>\n\t</h3>\n\n\t<div class=\"navigation\">\n\t\t<div class=\"alignleft\"><?php previous_comments_link() ?></div>\n\t\t<div class=\"alignright\"><?php next_comments_link() ?></div>\n\t</div>\n\n\t<ol class=\"commentlist\">\n\t<?php wp_list_comments();?>\n\t</ol>\n\n\t<div class=\"navigation\">\n\t\t<div class=\"alignleft\"><?php previous_comments_link() ?></div>\n\t\t<div class=\"alignright\"><?php next_comments_link() ?></div>\n\t</div>\n <?php else : // this is displayed if there are no comments so far ?>\n\n\t<?php if ( comments_open() ) : ?>\n\t\t<!-- If comments are open, but there are no comments. -->\n\n\t <?php else : // comments are closed ?>\n\t\t<!-- If comments are closed. -->\n\t\t<p class=\"nocomments\"><?php _e('Comments are closed.'); ?></p>\n\n\t<?php endif; ?>\n<?php endif; ?>\n\n<?php if ( comments_open() ) : ?>\n\n<div id=\"respond\">\n\n<h3><?php comment_form_title( __('Leave a Reply'), __('Leave a Reply to %s' ) ); ?></h3>\n\n<div id=\"cancel-comment-reply\">\n\t<small><?php cancel_comment_reply_link() ?></small>\n</div>\n\n<?php if ( get_option('comment_registration') && !is_user_logged_in() ) : ?>\n<p><?php printf(__('You must be <a href=\"%s\">logged in</a> to post a comment.'), wp_login_url( get_permalink() )); ?></p>\n<?php else : ?>\n\n<form action=\"<?php echo site_url(); ?>/wp-comments-post.php\" method=\"post\" id=\"commentform\">\n\n<?php if ( is_user_logged_in() ) : ?>\n\n<p><?php /* translators: %s: user profile link  */\nprintf( __( 'Logged in as %s.' ), sprintf( '<a href=\"%1$s\">%2$s</a>', get_edit_user_link(), $user_identity ) ); ?>\n<a href=\"<?php echo wp_logout_url( get_permalink() ); ?>\" title=\"<?php esc_attr_e( 'Log out of this account' ); ?>\"><?php _e( 'Log out &raquo;' ); ?></a></p>\n\n<?php else : ?>\n\n<p><input type=\"text\" name=\"author\" id=\"author\" value=\"<?php echo esc_attr($comment_author); ?>\" size=\"22\" tabindex=\"1\" <?php if ($req) echo \"aria-required='true'\"; ?> />\n<label for=\"author\"><small><?php _e('Name'); ?> <?php if ($req) _e('(required)'); ?></small></label></p>\n\n<p><input type=\"text\" name=\"email\" id=\"email\" value=\"<?php echo esc_attr($comment_author_email); ?>\" size=\"22\" tabindex=\"2\" <?php if ($req) echo \"aria-required='true'\"; ?> />\n<label for=\"email\"><small><?php _e('Mail (will not be published)'); ?> <?php if ($req) _e('(required)'); ?></small></label></p>\n\n<p><input type=\"text\" name=\"url\" id=\"url\" value=\"<?php echo  esc_attr($comment_author_url); ?>\" size=\"22\" tabindex=\"3\" />\n<label for=\"url\"><small><?php _e('Website'); ?></small></label></p>\n\n<?php endif; ?>\n\n<p><textarea name=\"comment\" id=\"comment\" cols=\"58\" rows=\"10\" tabindex=\"4\"></textarea></p>\n\n<p><input name=\"submit\" type=\"submit\" id=\"submit\" tabindex=\"5\" value=\"<?php esc_attr_e('Submit Comment'); ?>\" />\n<?php comment_id_fields(); ?>\n</p>\n<?php\n/** This filter is documented in wp-includes/comment-template.php */\ndo_action( 'comment_form', $post->ID );\n?>\n\n</form>\n\n<?php endif; // If registration required and not logged in ?>\n</div>\n\n<?php endif; // if you delete this the sky will fall on your head ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/theme-compat/footer.php",
    "content": "<?php\n/**\n * @package WordPress\n * @subpackage Theme_Compat\n * @deprecated 3.0\n *\n * This file is here for Backwards compatibility with old themes and will be removed in a future version\n *\n */\n_deprecated_file(\n\t/* translators: %s: template name */\n\tsprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),\n\t'3.0',\n\tnull,\n\t/* translators: %s: template name */\n\tsprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )\n);\n?>\n\n<hr />\n<div id=\"footer\" role=\"contentinfo\">\n<!-- If you'd like to support WordPress, having the \"powered by\" link somewhere on your blog is the best way; it's our only promotion or advertising. -->\n\t<p>\n\t\t<?php printf(__('%1$s is proudly powered by %2$s'), get_bloginfo('name'),\n\t\t'<a href=\"https://wordpress.org/\">WordPress</a>'); ?>\n\t\t<br /><?php printf(__('%1$s and %2$s.'), '<a href=\"' . get_bloginfo('rss2_url') . '\">' . __('Entries (RSS)') . '</a>', '<a href=\"' . get_bloginfo('comments_rss2_url') . '\">' . __('Comments (RSS)') . '</a>'); ?>\n\t\t<!-- <?php printf(__('%d queries. %s seconds.'), get_num_queries(), timer_stop(0, 3)); ?> -->\n\t</p>\n</div>\n</div>\n\n<!-- Gorgeous design by Michael Heilemann - http://binarybonsai.com/kubrick/ -->\n<?php /* \"Just what do you think you're doing Dave?\" */ ?>\n\n\t\t<?php wp_footer(); ?>\n</body>\n</html>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/theme-compat/header.php",
    "content": "<?php\n/**\n * @package WordPress\n * @subpackage Theme_Compat\n * @deprecated 3.0\n *\n * This file is here for Backwards compatibility with old themes and will be removed in a future version\n *\n */\n_deprecated_file(\n\t/* translators: %s: template name */\n\tsprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),\n\t'3.0',\n\tnull,\n\t/* translators: %s: template name */\n\tsprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )\n);\n?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" <?php language_attributes(); ?>>\n<head>\n<link rel=\"profile\" href=\"http://gmpg.org/xfn/11\" />\n<meta http-equiv=\"Content-Type\" content=\"<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>\" />\n\n<title><?php echo wp_get_document_title(); ?></title>\n\n<link rel=\"stylesheet\" href=\"<?php bloginfo('stylesheet_url'); ?>\" type=\"text/css\" media=\"screen\" />\n<link rel=\"pingback\" href=\"<?php bloginfo('pingback_url'); ?>\" />\n\n<?php if ( file_exists( get_stylesheet_directory() . '/images/kubrickbgwide.jpg' ) ) { ?>\n<style type=\"text/css\" media=\"screen\">\n\n<?php\n// Checks to see whether it needs a sidebar\nif ( empty($withcomments) && !is_single() ) {\n?>\n\t#page { background: url(\"<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbg-<?php bloginfo('text_direction'); ?>.jpg\") repeat-y top; border: none; }\n<?php } else { // No sidebar ?>\n\t#page { background: url(\"<?php bloginfo('stylesheet_directory'); ?>/images/kubrickbgwide.jpg\") repeat-y top; border: none; }\n<?php } ?>\n\n</style>\n<?php } ?>\n\n<?php if ( is_singular() ) wp_enqueue_script( 'comment-reply' ); ?>\n\n<?php wp_head(); ?>\n</head>\n<body <?php body_class(); ?>>\n<div id=\"page\">\n\n<div id=\"header\" role=\"banner\">\n\t<div id=\"headerimg\">\n\t\t<h1><a href=\"<?php echo home_url(); ?>/\"><?php bloginfo('name'); ?></a></h1>\n\t\t<div class=\"description\"><?php bloginfo('description'); ?></div>\n\t</div>\n</div>\n<hr />\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/theme-compat/sidebar.php",
    "content": "<?php\n/**\n * @package WordPress\n * @subpackage Theme_Compat\n * @deprecated 3.0\n *\n * This file is here for Backwards compatibility with old themes and will be removed in a future version\n *\n */\n_deprecated_file(\n\t/* translators: %s: template name */\n\tsprintf( __( 'Theme without %s' ), basename( __FILE__ ) ),\n\t'3.0',\n\tnull,\n\t/* translators: %s: template name */\n\tsprintf( __( 'Please include a %s template in your theme.' ), basename( __FILE__ ) )\n);\n?>\n\t<div id=\"sidebar\" role=\"complementary\">\n\t\t<ul>\n\t\t\t<?php \t/* Widgetized sidebar, if you have the plugin installed. */\n\t\t\t\t\tif ( !function_exists('dynamic_sidebar') || !dynamic_sidebar() ) : ?>\n\t\t\t<li>\n\t\t\t\t<?php get_search_form(); ?>\n\t\t\t</li>\n\n\t\t\t<!-- Author information is disabled per default. Uncomment and fill in your details if you want to use it.\n\t\t\t<li><h2><?php _e('Author'); ?></h2>\n\t\t\t<p>A little something about you, the author. Nothing lengthy, just an overview.</p>\n\t\t\t</li>\n\t\t\t-->\n\n\t\t\t<?php if ( is_404() || is_category() || is_day() || is_month() ||\n\t\t\t\t\t\tis_year() || is_search() || is_paged() ) :\n\t\t\t?> <li>\n\n\t\t\t<?php if ( is_404() ) : /* If this is a 404 page */ ?>\n\t\t\t<?php elseif ( is_category() ) : /* If this is a category archive */ ?>\n\t\t\t\t<p><?php /* translators: %s: category name */\n\t\t\t\t\tprintf( __( 'You are currently browsing the archives for the %s category.' ),\n\t\t\t\t\t\tsingle_cat_title( '', false )\n\t\t\t\t\t);\n\t\t\t\t?></p>\n\n\t\t\t<?php elseif ( is_day() ) : /* If this is a daily archive */ ?>\n\t\t\t\t<p><?php /* translators: 1: site link, 2: archive date */\n\t\t\t\t\tprintf( __( 'You are currently browsing the %1$s blog archives for the day %2$s.' ),\n\t\t\t\t\t\tsprintf( '<a href=\"%1$s/\">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) ),\n\t\t\t\t\t\tget_the_time( __( 'l, F jS, Y' ) )\n\t\t\t\t\t);\n\t\t\t\t?></p>\n\n\t\t\t<?php elseif ( is_month() ) : /* If this is a monthly archive */ ?>\n\t\t\t\t<p><?php /* translators: 1: site link, 2: archive month */\n\t\t\t\t\tprintf( __( 'You are currently browsing the %1$s blog archives for %2$s.' ),\n\t\t\t\t\t\tsprintf( '<a href=\"%1$s/\">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) ),\n\t\t\t\t\t\tget_the_time( __( 'F, Y' ) )\n\t\t\t\t\t);\n\t\t\t\t?></p>\n\n\t\t\t<?php elseif ( is_year() ) : /* If this is a yearly archive */ ?>\n\t\t\t\t<p><?php /* translators: 1: site link, 2: archive year */\n\t\t\t\t\tprintf( __( 'You are currently browsing the %1$s blog archives for the year %2$s.' ),\n\t\t\t\t\t\tsprintf( '<a href=\"%1$s/\">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) ),\n\t\t\t\t\t\tget_the_time( 'Y' )\n\t\t\t\t\t);\n\t\t\t\t?></p>\n\n\t\t\t<?php elseif ( is_search() ) : /* If this is a search result */ ?>\n\t\t\t\t<p><?php /* translators: 1: site link, 2: search query */\n\t\t\t\t\tprintf( __( 'You have searched the %1$s blog archives for <strong>&#8216;%2$s&#8217;</strong>. If you are unable to find anything in these search results, you can try one of these links.' ),\n\t\t\t\t\t\tsprintf( '<a href=\"%1$s/\">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) ),\n\t\t\t\t\t\tesc_html( get_search_query() )\n\t\t\t\t\t); \n\t\t\t\t?></p>\n\n\t\t\t<?php elseif ( isset( $_GET['paged'] ) && ! empty( $_GET['paged'] ) ) : /* If this set is paginated */ ?>\n\t\t\t\t<p><?php /* translators: %s: site link */\n\t\t\t\t\tprintf( __( 'You are currently browsing the %s blog archives.' ),\n\t\t\t\t\t\tsprintf( '<a href=\"%1$s/\">%2$s</a>', get_bloginfo( 'url' ), get_bloginfo( 'name' ) )\n\t\t\t\t\t);\n\t\t\t\t?></p>\n\n\t\t\t<?php endif; ?>\n\n\t\t\t</li>\n\t\t<?php endif; ?>\n\t\t</ul>\n\t\t<ul role=\"navigation\">\n\t\t\t<?php wp_list_pages('title_li=<h2>' . __('Pages') . '</h2>' ); ?>\n\n\t\t\t<li><h2><?php _e('Archives'); ?></h2>\n\t\t\t\t<ul>\n\t\t\t\t<?php wp_get_archives(array('type' => 'monthly')); ?>\n\t\t\t\t</ul>\n\t\t\t</li>\n\n\t\t\t<?php wp_list_categories(array('show_count' => 1, 'title_li' => '<h2>' . __('Categories') . '</h2>')); ?>\n\t\t</ul>\n\t\t<ul>\n\t\t\t<?php if ( is_home() || is_page() ) { /* If this is the frontpage */ ?>\n\t\t\t\t<?php wp_list_bookmarks(); ?>\n\n\t\t\t\t<li><h2><?php _e('Meta'); ?></h2>\n\t\t\t\t<ul>\n\t\t\t\t\t<?php wp_register(); ?>\n\t\t\t\t\t<li><?php wp_loginout(); ?></li>\n\t\t\t\t\t<li><a href=\"http://validator.w3.org/check/referer\" title=\"<?php esc_attr_e('This page validates as XHTML 1.0 Transitional'); ?>\"><?php _e('Valid <abbr title=\"eXtensible HyperText Markup Language\">XHTML</abbr>'); ?></a></li>\n\t\t\t\t\t<li><a href=\"http://gmpg.org/xfn/\"><abbr title=\"<?php esc_attr_e('XHTML Friends Network'); ?>\"><?php _e('XFN'); ?></abbr></a></li>\n\t\t\t\t\t<li><a href=\"https://wordpress.org/\" title=\"<?php esc_attr_e('Powered by WordPress, state-of-the-art semantic personal publishing platform.'); ?>\">WordPress</a></li>\n\t\t\t\t\t<?php wp_meta(); ?>\n\t\t\t\t</ul>\n\t\t\t\t</li>\n\t\t\t<?php } ?>\n\n\t\t\t<?php endif; /* ! dynamic_sidebar() */ ?>\n\t\t</ul>\n\t</div>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/theme.php",
    "content": "<?php\n/**\n * Theme, template, and stylesheet functions.\n *\n * @package WordPress\n * @subpackage Theme\n */\n\n/**\n * Returns an array of WP_Theme objects based on the arguments.\n *\n * Despite advances over get_themes(), this function is quite expensive, and grows\n * linearly with additional themes. Stick to wp_get_theme() if possible.\n *\n * @since 3.4.0\n *\n * @global array $wp_theme_directories\n * @staticvar array $_themes\n *\n * @param array $args The search arguments. Optional.\n * - errors      mixed  True to return themes with errors, false to return themes without errors, null\n *                      to return all themes. Defaults to false.\n * - allowed     mixed  (Multisite) True to return only allowed themes for a site. False to return only\n *                      disallowed themes for a site. 'site' to return only site-allowed themes. 'network'\n *                      to return only network-allowed themes. Null to return all themes. Defaults to null.\n * - blog_id     int    (Multisite) The blog ID used to calculate which themes are allowed. Defaults to 0,\n *                      synonymous for the current blog.\n * @return array Array of WP_Theme objects.\n */\nfunction wp_get_themes( $args = array() ) {\n\tglobal $wp_theme_directories;\n\n\t$defaults = array( 'errors' => false, 'allowed' => null, 'blog_id' => 0 );\n\t$args = wp_parse_args( $args, $defaults );\n\n\t$theme_directories = search_theme_directories();\n\n\tif ( count( $wp_theme_directories ) > 1 ) {\n\t\t// Make sure the current theme wins out, in case search_theme_directories() picks the wrong\n\t\t// one in the case of a conflict. (Normally, last registered theme root wins.)\n\t\t$current_theme = get_stylesheet();\n\t\tif ( isset( $theme_directories[ $current_theme ] ) ) {\n\t\t\t$root_of_current_theme = get_raw_theme_root( $current_theme );\n\t\t\tif ( ! in_array( $root_of_current_theme, $wp_theme_directories ) )\n\t\t\t\t$root_of_current_theme = WP_CONTENT_DIR . $root_of_current_theme;\n\t\t\t$theme_directories[ $current_theme ]['theme_root'] = $root_of_current_theme;\n\t\t}\n\t}\n\n\tif ( empty( $theme_directories ) )\n\t\treturn array();\n\n\tif ( is_multisite() && null !== $args['allowed'] ) {\n\t\t$allowed = $args['allowed'];\n\t\tif ( 'network' === $allowed )\n\t\t\t$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_network() );\n\t\telseif ( 'site' === $allowed )\n\t\t\t$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed_on_site( $args['blog_id'] ) );\n\t\telseif ( $allowed )\n\t\t\t$theme_directories = array_intersect_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) );\n\t\telse\n\t\t\t$theme_directories = array_diff_key( $theme_directories, WP_Theme::get_allowed( $args['blog_id'] ) );\n\t}\n\n\t$themes = array();\n\tstatic $_themes = array();\n\n\tforeach ( $theme_directories as $theme => $theme_root ) {\n\t\tif ( isset( $_themes[ $theme_root['theme_root'] . '/' . $theme ] ) )\n\t\t\t$themes[ $theme ] = $_themes[ $theme_root['theme_root'] . '/' . $theme ];\n\t\telse\n\t\t\t$themes[ $theme ] = $_themes[ $theme_root['theme_root'] . '/' . $theme ] = new WP_Theme( $theme, $theme_root['theme_root'] );\n\t}\n\n\tif ( null !== $args['errors'] ) {\n\t\tforeach ( $themes as $theme => $wp_theme ) {\n\t\t\tif ( $wp_theme->errors() != $args['errors'] )\n\t\t\t\tunset( $themes[ $theme ] );\n\t\t}\n\t}\n\n\treturn $themes;\n}\n\n/**\n * Gets a WP_Theme object for a theme.\n *\n * @since 3.4.0\n *\n * @global array $wp_theme_directories\n *\n * @param string $stylesheet Directory name for the theme. Optional. Defaults to current theme.\n * @param string $theme_root Absolute path of the theme root to look in. Optional. If not specified, get_raw_theme_root()\n * \t                         is used to calculate the theme root for the $stylesheet provided (or current theme).\n * @return WP_Theme Theme object. Be sure to check the object's exists() method if you need to confirm the theme's existence.\n */\nfunction wp_get_theme( $stylesheet = null, $theme_root = null ) {\n\tglobal $wp_theme_directories;\n\n\tif ( empty( $stylesheet ) )\n\t\t$stylesheet = get_stylesheet();\n\n\tif ( empty( $theme_root ) ) {\n\t\t$theme_root = get_raw_theme_root( $stylesheet );\n\t\tif ( false === $theme_root )\n\t\t\t$theme_root = WP_CONTENT_DIR . '/themes';\n\t\telseif ( ! in_array( $theme_root, (array) $wp_theme_directories ) )\n\t\t\t$theme_root = WP_CONTENT_DIR . $theme_root;\n\t}\n\n\treturn new WP_Theme( $stylesheet, $theme_root );\n}\n\n/**\n * Clears the cache held by get_theme_roots() and WP_Theme.\n *\n * @since 3.5.0\n * @param bool $clear_update_cache Whether to clear the Theme updates cache\n */\nfunction wp_clean_themes_cache( $clear_update_cache = true ) {\n\tif ( $clear_update_cache )\n\t\tdelete_site_transient( 'update_themes' );\n\tsearch_theme_directories( true );\n\tforeach ( wp_get_themes( array( 'errors' => null ) ) as $theme )\n\t\t$theme->cache_delete();\n}\n\n/**\n * Whether a child theme is in use.\n *\n * @since 3.0.0\n *\n * @return bool true if a child theme is in use, false otherwise.\n **/\nfunction is_child_theme() {\n\treturn ( TEMPLATEPATH !== STYLESHEETPATH );\n}\n\n/**\n * Retrieve name of the current stylesheet.\n *\n * The theme name that the administrator has currently set the front end theme\n * as.\n *\n * For all intents and purposes, the template name and the stylesheet name are\n * going to be the same for most cases.\n *\n * @since 1.5.0\n *\n * @return string Stylesheet name.\n */\nfunction get_stylesheet() {\n\t/**\n\t * Filter the name of current stylesheet.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $stylesheet Name of the current stylesheet.\n\t */\n\treturn apply_filters( 'stylesheet', get_option( 'stylesheet' ) );\n}\n\n/**\n * Retrieve stylesheet directory path for current theme.\n *\n * @since 1.5.0\n *\n * @return string Path to current theme directory.\n */\nfunction get_stylesheet_directory() {\n\t$stylesheet = get_stylesheet();\n\t$theme_root = get_theme_root( $stylesheet );\n\t$stylesheet_dir = \"$theme_root/$stylesheet\";\n\n\t/**\n\t * Filter the stylesheet directory path for current theme.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $stylesheet_dir Absolute path to the current them.\n\t * @param string $stylesheet     Directory name of the current theme.\n\t * @param string $theme_root     Absolute path to themes directory.\n\t */\n\treturn apply_filters( 'stylesheet_directory', $stylesheet_dir, $stylesheet, $theme_root );\n}\n\n/**\n * Retrieve stylesheet directory URI.\n *\n * @since 1.5.0\n *\n * @return string\n */\nfunction get_stylesheet_directory_uri() {\n\t$stylesheet = str_replace( '%2F', '/', rawurlencode( get_stylesheet() ) );\n\t$theme_root_uri = get_theme_root_uri( $stylesheet );\n\t$stylesheet_dir_uri = \"$theme_root_uri/$stylesheet\";\n\n\t/**\n\t * Filter the stylesheet directory URI.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $stylesheet_dir_uri Stylesheet directory URI.\n\t * @param string $stylesheet         Name of the activated theme's directory.\n\t * @param string $theme_root_uri     Themes root URI.\n\t */\n\treturn apply_filters( 'stylesheet_directory_uri', $stylesheet_dir_uri, $stylesheet, $theme_root_uri );\n}\n\n/**\n * Retrieve URI of current theme stylesheet.\n *\n * The stylesheet file name is 'style.css' which is appended to {@link\n * get_stylesheet_directory_uri() stylesheet directory URI} path.\n *\n * @since 1.5.0\n *\n * @return string\n */\nfunction get_stylesheet_uri() {\n\t$stylesheet_dir_uri = get_stylesheet_directory_uri();\n\t$stylesheet_uri = $stylesheet_dir_uri . '/style.css';\n\t/**\n\t * Filter the URI of the current theme stylesheet.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $stylesheet_uri     Stylesheet URI for the current theme/child theme.\n\t * @param string $stylesheet_dir_uri Stylesheet directory URI for the current theme/child theme.\n\t */\n\treturn apply_filters( 'stylesheet_uri', $stylesheet_uri, $stylesheet_dir_uri );\n}\n\n/**\n * Retrieve localized stylesheet URI.\n *\n * The stylesheet directory for the localized stylesheet files are located, by\n * default, in the base theme directory. The name of the locale file will be the\n * locale followed by '.css'. If that does not exist, then the text direction\n * stylesheet will be checked for existence, for example 'ltr.css'.\n *\n * The theme may change the location of the stylesheet directory by either using\n * the 'stylesheet_directory_uri' filter or the 'locale_stylesheet_uri' filter.\n * If you want to change the location of the stylesheet files for the entire\n * WordPress workflow, then change the former. If you just have the locale in a\n * separate folder, then change the latter.\n *\n * @since 2.1.0\n *\n * @global WP_Locale $wp_locale\n *\n * @return string\n */\nfunction get_locale_stylesheet_uri() {\n\tglobal $wp_locale;\n\t$stylesheet_dir_uri = get_stylesheet_directory_uri();\n\t$dir = get_stylesheet_directory();\n\t$locale = get_locale();\n\tif ( file_exists(\"$dir/$locale.css\") )\n\t\t$stylesheet_uri = \"$stylesheet_dir_uri/$locale.css\";\n\telseif ( !empty($wp_locale->text_direction) && file_exists(\"$dir/{$wp_locale->text_direction}.css\") )\n\t\t$stylesheet_uri = \"$stylesheet_dir_uri/{$wp_locale->text_direction}.css\";\n\telse\n\t\t$stylesheet_uri = '';\n\t/**\n\t * Filter the localized stylesheet URI.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $stylesheet_uri     Localized stylesheet URI.\n\t * @param string $stylesheet_dir_uri Stylesheet directory URI.\n\t */\n\treturn apply_filters( 'locale_stylesheet_uri', $stylesheet_uri, $stylesheet_dir_uri );\n}\n\n/**\n * Retrieve name of the current theme.\n *\n * @since 1.5.0\n *\n * @return string Template name.\n */\nfunction get_template() {\n\t/**\n\t * Filter the name of the current theme.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $template Current theme's directory name.\n\t */\n\treturn apply_filters( 'template', get_option( 'template' ) );\n}\n\n/**\n * Retrieve current theme directory.\n *\n * @since 1.5.0\n *\n * @return string Template directory path.\n */\nfunction get_template_directory() {\n\t$template = get_template();\n\t$theme_root = get_theme_root( $template );\n\t$template_dir = \"$theme_root/$template\";\n\n\t/**\n\t * Filter the current theme directory path.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $template_dir The URI of the current theme directory.\n\t * @param string $template     Directory name of the current theme.\n\t * @param string $theme_root   Absolute path to the themes directory.\n\t */\n\treturn apply_filters( 'template_directory', $template_dir, $template, $theme_root );\n}\n\n/**\n * Retrieve theme directory URI.\n *\n * @since 1.5.0\n *\n * @return string Template directory URI.\n */\nfunction get_template_directory_uri() {\n\t$template = str_replace( '%2F', '/', rawurlencode( get_template() ) );\n\t$theme_root_uri = get_theme_root_uri( $template );\n\t$template_dir_uri = \"$theme_root_uri/$template\";\n\n\t/**\n\t * Filter the current theme directory URI.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $template_dir_uri The URI of the current theme directory.\n\t * @param string $template         Directory name of the current theme.\n\t * @param string $theme_root_uri   The themes root URI.\n\t */\n\treturn apply_filters( 'template_directory_uri', $template_dir_uri, $template, $theme_root_uri );\n}\n\n/**\n * Retrieve theme roots.\n *\n * @since 2.9.0\n *\n * @global array $wp_theme_directories\n *\n * @return array|string An array of theme roots keyed by template/stylesheet or a single theme root if all themes have the same root.\n */\nfunction get_theme_roots() {\n\tglobal $wp_theme_directories;\n\n\tif ( count($wp_theme_directories) <= 1 )\n\t\treturn '/themes';\n\n\t$theme_roots = get_site_transient( 'theme_roots' );\n\tif ( false === $theme_roots ) {\n\t\tsearch_theme_directories( true ); // Regenerate the transient.\n\t\t$theme_roots = get_site_transient( 'theme_roots' );\n\t}\n\treturn $theme_roots;\n}\n\n/**\n * Register a directory that contains themes.\n *\n * @since 2.9.0\n *\n * @global array $wp_theme_directories\n *\n * @param string $directory Either the full filesystem path to a theme folder or a folder within WP_CONTENT_DIR\n * @return bool\n */\nfunction register_theme_directory( $directory ) {\n\tglobal $wp_theme_directories;\n\n\tif ( ! file_exists( $directory ) ) {\n\t\t// Try prepending as the theme directory could be relative to the content directory\n\t\t$directory = WP_CONTENT_DIR . '/' . $directory;\n\t\t// If this directory does not exist, return and do not register\n\t\tif ( ! file_exists( $directory ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif ( ! is_array( $wp_theme_directories ) ) {\n\t\t$wp_theme_directories = array();\n\t}\n\n\t$untrailed = untrailingslashit( $directory );\n\tif ( ! empty( $untrailed ) && ! in_array( $untrailed, $wp_theme_directories ) ) {\n\t\t$wp_theme_directories[] = $untrailed;\n\t}\n\n\treturn true;\n}\n\n/**\n * Search all registered theme directories for complete and valid themes.\n *\n * @since 2.9.0\n *\n * @global array $wp_theme_directories\n * @staticvar array $found_themes\n *\n * @param bool $force Optional. Whether to force a new directory scan. Defaults to false.\n * @return array|false Valid themes found\n */\nfunction search_theme_directories( $force = false ) {\n\tglobal $wp_theme_directories;\n\tstatic $found_themes = null;\n\n\tif ( empty( $wp_theme_directories ) )\n\t\treturn false;\n\n\tif ( ! $force && isset( $found_themes ) )\n\t\treturn $found_themes;\n\n\t$found_themes = array();\n\n\t$wp_theme_directories = (array) $wp_theme_directories;\n\t$relative_theme_roots = array();\n\n\t// Set up maybe-relative, maybe-absolute array of theme directories.\n\t// We always want to return absolute, but we need to cache relative\n\t// to use in get_theme_root().\n\tforeach ( $wp_theme_directories as $theme_root ) {\n\t\tif ( 0 === strpos( $theme_root, WP_CONTENT_DIR ) )\n\t\t\t$relative_theme_roots[ str_replace( WP_CONTENT_DIR, '', $theme_root ) ] = $theme_root;\n\t\telse\n\t\t\t$relative_theme_roots[ $theme_root ] = $theme_root;\n\t}\n\n\t/**\n\t * Filter whether to get the cache of the registered theme directories.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param bool   $cache_expiration Whether to get the cache of the theme directories. Default false.\n\t * @param string $cache_directory  Directory to be searched for the cache.\n\t */\n\tif ( $cache_expiration = apply_filters( 'wp_cache_themes_persistently', false, 'search_theme_directories' ) ) {\n\t\t$cached_roots = get_site_transient( 'theme_roots' );\n\t\tif ( is_array( $cached_roots ) ) {\n\t\t\tforeach ( $cached_roots as $theme_dir => $theme_root ) {\n\t\t\t\t// A cached theme root is no longer around, so skip it.\n\t\t\t\tif ( ! isset( $relative_theme_roots[ $theme_root ] ) )\n\t\t\t\t\tcontinue;\n\t\t\t\t$found_themes[ $theme_dir ] = array(\n\t\t\t\t\t'theme_file' => $theme_dir . '/style.css',\n\t\t\t\t\t'theme_root' => $relative_theme_roots[ $theme_root ], // Convert relative to absolute.\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn $found_themes;\n\t\t}\n\t\tif ( ! is_int( $cache_expiration ) )\n\t\t\t$cache_expiration = 1800; // half hour\n\t} else {\n\t\t$cache_expiration = 1800; // half hour\n\t}\n\n\t/* Loop the registered theme directories and extract all themes */\n\tforeach ( $wp_theme_directories as $theme_root ) {\n\n\t\t// Start with directories in the root of the current theme directory.\n\t\t$dirs = @ scandir( $theme_root );\n\t\tif ( ! $dirs ) {\n\t\t\ttrigger_error( \"$theme_root is not readable\", E_USER_NOTICE );\n\t\t\tcontinue;\n\t\t}\n\t\tforeach ( $dirs as $dir ) {\n\t\t\tif ( ! is_dir( $theme_root . '/' . $dir ) || $dir[0] == '.' || $dir == 'CVS' )\n\t\t\t\tcontinue;\n\t\t\tif ( file_exists( $theme_root . '/' . $dir . '/style.css' ) ) {\n\t\t\t\t// wp-content/themes/a-single-theme\n\t\t\t\t// wp-content/themes is $theme_root, a-single-theme is $dir\n\t\t\t\t$found_themes[ $dir ] = array(\n\t\t\t\t\t'theme_file' => $dir . '/style.css',\n\t\t\t\t\t'theme_root' => $theme_root,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t$found_theme = false;\n\t\t\t\t// wp-content/themes/a-folder-of-themes/*\n\t\t\t\t// wp-content/themes is $theme_root, a-folder-of-themes is $dir, then themes are $sub_dirs\n\t\t\t\t$sub_dirs = @ scandir( $theme_root . '/' . $dir );\n\t\t\t\tif ( ! $sub_dirs ) {\n\t\t\t\t\ttrigger_error( \"$theme_root/$dir is not readable\", E_USER_NOTICE );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tforeach ( $sub_dirs as $sub_dir ) {\n\t\t\t\t\tif ( ! is_dir( $theme_root . '/' . $dir . '/' . $sub_dir ) || $dir[0] == '.' || $dir == 'CVS' )\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tif ( ! file_exists( $theme_root . '/' . $dir . '/' . $sub_dir . '/style.css' ) )\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t$found_themes[ $dir . '/' . $sub_dir ] = array(\n\t\t\t\t\t\t'theme_file' => $dir . '/' . $sub_dir . '/style.css',\n\t\t\t\t\t\t'theme_root' => $theme_root,\n\t\t\t\t\t);\n\t\t\t\t\t$found_theme = true;\n\t\t\t\t}\n\t\t\t\t// Never mind the above, it's just a theme missing a style.css.\n\t\t\t\t// Return it; WP_Theme will catch the error.\n\t\t\t\tif ( ! $found_theme )\n\t\t\t\t\t$found_themes[ $dir ] = array(\n\t\t\t\t\t\t'theme_file' => $dir . '/style.css',\n\t\t\t\t\t\t'theme_root' => $theme_root,\n\t\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasort( $found_themes );\n\n\t$theme_roots = array();\n\t$relative_theme_roots = array_flip( $relative_theme_roots );\n\n\tforeach ( $found_themes as $theme_dir => $theme_data ) {\n\t\t$theme_roots[ $theme_dir ] = $relative_theme_roots[ $theme_data['theme_root'] ]; // Convert absolute to relative.\n\t}\n\n\tif ( $theme_roots != get_site_transient( 'theme_roots' ) )\n\t\tset_site_transient( 'theme_roots', $theme_roots, $cache_expiration );\n\n\treturn $found_themes;\n}\n\n/**\n * Retrieve path to themes directory.\n *\n * Does not have trailing slash.\n *\n * @since 1.5.0\n *\n * @global array $wp_theme_directories\n *\n * @param string $stylesheet_or_template The stylesheet or template name of the theme\n * @return string Theme path.\n */\nfunction get_theme_root( $stylesheet_or_template = false ) {\n\tglobal $wp_theme_directories;\n\n\tif ( $stylesheet_or_template && $theme_root = get_raw_theme_root( $stylesheet_or_template ) ) {\n\t\t// Always prepend WP_CONTENT_DIR unless the root currently registered as a theme directory.\n\t\t// This gives relative theme roots the benefit of the doubt when things go haywire.\n\t\tif ( ! in_array( $theme_root, (array) $wp_theme_directories ) )\n\t\t\t$theme_root = WP_CONTENT_DIR . $theme_root;\n\t} else {\n\t\t$theme_root = WP_CONTENT_DIR . '/themes';\n\t}\n\n\t/**\n\t * Filter the absolute path to the themes directory.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $theme_root Absolute path to themes directory.\n\t */\n\treturn apply_filters( 'theme_root', $theme_root );\n}\n\n/**\n * Retrieve URI for themes directory.\n *\n * Does not have trailing slash.\n *\n * @since 1.5.0\n *\n * @global array $wp_theme_directories\n *\n * @param string $stylesheet_or_template Optional. The stylesheet or template name of the theme.\n * \t                                     Default is to leverage the main theme root.\n * @param string $theme_root             Optional. The theme root for which calculations will be based, preventing\n * \t                                     the need for a get_raw_theme_root() call.\n * @return string Themes URI.\n */\nfunction get_theme_root_uri( $stylesheet_or_template = false, $theme_root = false ) {\n\tglobal $wp_theme_directories;\n\n\tif ( $stylesheet_or_template && ! $theme_root )\n\t\t$theme_root = get_raw_theme_root( $stylesheet_or_template );\n\n\tif ( $stylesheet_or_template && $theme_root ) {\n\t\tif ( in_array( $theme_root, (array) $wp_theme_directories ) ) {\n\t\t\t// Absolute path. Make an educated guess. YMMV -- but note the filter below.\n\t\t\tif ( 0 === strpos( $theme_root, WP_CONTENT_DIR ) )\n\t\t\t\t$theme_root_uri = content_url( str_replace( WP_CONTENT_DIR, '', $theme_root ) );\n\t\t\telseif ( 0 === strpos( $theme_root, ABSPATH ) )\n\t\t\t\t$theme_root_uri = site_url( str_replace( ABSPATH, '', $theme_root ) );\n\t\t\telseif ( 0 === strpos( $theme_root, WP_PLUGIN_DIR ) || 0 === strpos( $theme_root, WPMU_PLUGIN_DIR ) )\n\t\t\t\t$theme_root_uri = plugins_url( basename( $theme_root ), $theme_root );\n\t\t\telse\n\t\t\t\t$theme_root_uri = $theme_root;\n\t\t} else {\n\t\t\t$theme_root_uri = content_url( $theme_root );\n\t\t}\n\t} else {\n\t\t$theme_root_uri = content_url( 'themes' );\n\t}\n\n\t/**\n\t * Filter the URI for themes directory.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $theme_root_uri         The URI for themes directory.\n\t * @param string $siteurl                WordPress web address which is set in General Options.\n\t * @param string $stylesheet_or_template Stylesheet or template name of the theme.\n\t */\n\treturn apply_filters( 'theme_root_uri', $theme_root_uri, get_option( 'siteurl' ), $stylesheet_or_template );\n}\n\n/**\n * Get the raw theme root relative to the content directory with no filters applied.\n *\n * @since 3.1.0\n *\n * @global array $wp_theme_directories\n *\n * @param string $stylesheet_or_template The stylesheet or template name of the theme\n * @param bool   $skip_cache             Optional. Whether to skip the cache.\n *                                       Defaults to false, meaning the cache is used.\n * @return string Theme root\n */\nfunction get_raw_theme_root( $stylesheet_or_template, $skip_cache = false ) {\n\tglobal $wp_theme_directories;\n\n\tif ( count($wp_theme_directories) <= 1 )\n\t\treturn '/themes';\n\n\t$theme_root = false;\n\n\t// If requesting the root for the current theme, consult options to avoid calling get_theme_roots()\n\tif ( ! $skip_cache ) {\n\t\tif ( get_option('stylesheet') == $stylesheet_or_template )\n\t\t\t$theme_root = get_option('stylesheet_root');\n\t\telseif ( get_option('template') == $stylesheet_or_template )\n\t\t\t$theme_root = get_option('template_root');\n\t}\n\n\tif ( empty($theme_root) ) {\n\t\t$theme_roots = get_theme_roots();\n\t\tif ( !empty($theme_roots[$stylesheet_or_template]) )\n\t\t\t$theme_root = $theme_roots[$stylesheet_or_template];\n\t}\n\n\treturn $theme_root;\n}\n\n/**\n * Display localized stylesheet link element.\n *\n * @since 2.1.0\n */\nfunction locale_stylesheet() {\n\t$stylesheet = get_locale_stylesheet_uri();\n\tif ( empty($stylesheet) )\n\t\treturn;\n\techo '<link rel=\"stylesheet\" href=\"' . $stylesheet . '\" type=\"text/css\" media=\"screen\" />';\n}\n\n/**\n * Switches the theme.\n *\n * Accepts one argument: $stylesheet of the theme. It also accepts an additional function signature\n * of two arguments: $template then $stylesheet. This is for backwards compatibility.\n *\n * @since 2.5.0\n *\n * @global array                $wp_theme_directories\n * @global WP_Customize_Manager $wp_customize\n * @global array                $sidebars_widgets\n *\n * @param string $stylesheet Stylesheet name\n */\nfunction switch_theme( $stylesheet ) {\n\tglobal $wp_theme_directories, $wp_customize, $sidebars_widgets;\n\n\t$_sidebars_widgets = null;\n\tif ( 'wp_ajax_customize_save' === current_action() ) {\n\t\t$_sidebars_widgets = $wp_customize->post_value( $wp_customize->get_setting( 'old_sidebars_widgets_data' ) );\n\t} elseif ( is_array( $sidebars_widgets ) ) {\n\t\t$_sidebars_widgets = $sidebars_widgets;\n\t}\n\n\tif ( is_array( $_sidebars_widgets ) ) {\n\t\tset_theme_mod( 'sidebars_widgets', array( 'time' => time(), 'data' => $_sidebars_widgets ) );\n\t}\n\n\t$nav_menu_locations = get_theme_mod( 'nav_menu_locations' );\n\n\tif ( func_num_args() > 1 ) {\n\t\t$stylesheet = func_get_arg( 1 );\n\t}\n\n\t$old_theme = wp_get_theme();\n\t$new_theme = wp_get_theme( $stylesheet );\n\t$template  = $new_theme->get_template();\n\n\tupdate_option( 'template', $template );\n\tupdate_option( 'stylesheet', $stylesheet );\n\n\tif ( count( $wp_theme_directories ) > 1 ) {\n\t\tupdate_option( 'template_root', get_raw_theme_root( $template, true ) );\n\t\tupdate_option( 'stylesheet_root', get_raw_theme_root( $stylesheet, true ) );\n\t} else {\n\t\tdelete_option( 'template_root' );\n\t\tdelete_option( 'stylesheet_root' );\n\t}\n\n\t$new_name  = $new_theme->get('Name');\n\n\tupdate_option( 'current_theme', $new_name );\n\n\t// Migrate from the old mods_{name} option to theme_mods_{slug}.\n\tif ( is_admin() && false === get_option( 'theme_mods_' . $stylesheet ) ) {\n\t\t$default_theme_mods = (array) get_option( 'mods_' . $new_name );\n\t\tif ( ! empty( $nav_menu_locations ) && empty( $default_theme_mods['nav_menu_locations'] ) ) {\n\t\t\t$default_theme_mods['nav_menu_locations'] = $nav_menu_locations;\n\t\t}\n\t\tadd_option( \"theme_mods_$stylesheet\", $default_theme_mods );\n\t} else {\n\t\t/*\n\t\t * Since retrieve_widgets() is called when initializing a theme in the Customizer,\n\t\t * we need to to remove the theme mods to avoid overwriting changes made via\n\t\t * the Customizer when accessing wp-admin/widgets.php.\n\t\t */\n\t\tif ( 'wp_ajax_customize_save' === current_action() ) {\n\t\t\tremove_theme_mod( 'sidebars_widgets' );\n\t\t}\n\n\t\tif ( ! empty( $nav_menu_locations ) ) {\n\t\t\t$nav_mods = get_theme_mod( 'nav_menu_locations' );\n\t\t\tif ( empty( $nav_mods ) ) {\n\t\t\t\tset_theme_mod( 'nav_menu_locations', $nav_menu_locations );\n\t\t\t}\n\t\t}\n\t}\n\n\tupdate_option( 'theme_switched', $old_theme->get_stylesheet() );\n\t/**\n\t * Fires after the theme is switched.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string   $new_name  Name of the new theme.\n\t * @param WP_Theme $new_theme WP_Theme instance of the new theme.\n\t */\n\tdo_action( 'switch_theme', $new_name, $new_theme );\n}\n\n/**\n * Checks that current theme files 'index.php' and 'style.css' exists.\n *\n * Does not initially check the default theme, which is the fallback and should always exist.\n * But if it doesn't exist, it'll fall back to the latest core default theme that does exist.\n * Will switch theme to the fallback theme if current theme does not validate.\n *\n * You can use the 'validate_current_theme' filter to return false to\n * disable this functionality.\n *\n * @since 1.5.0\n * @see WP_DEFAULT_THEME\n *\n * @return bool\n */\nfunction validate_current_theme() {\n\t/**\n\t * Filter whether to validate the current theme.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param bool true Validation flag to check the current theme.\n\t */\n\tif ( wp_installing() || ! apply_filters( 'validate_current_theme', true ) )\n\t\treturn true;\n\n\tif ( ! file_exists( get_template_directory() . '/index.php' ) ) {\n\t\t// Invalid.\n\t} elseif ( ! file_exists( get_template_directory() . '/style.css' ) ) {\n\t\t// Invalid.\n\t} elseif ( is_child_theme() && ! file_exists( get_stylesheet_directory() . '/style.css' ) ) {\n\t\t// Invalid.\n\t} else {\n\t\t// Valid.\n\t\treturn true;\n\t}\n\n\t$default = wp_get_theme( WP_DEFAULT_THEME );\n\tif ( $default->exists() ) {\n\t\tswitch_theme( WP_DEFAULT_THEME );\n\t\treturn false;\n\t}\n\n\t/**\n\t * If we're in an invalid state but WP_DEFAULT_THEME doesn't exist,\n\t * switch to the latest core default theme that's installed.\n\t * If it turns out that this latest core default theme is our current\n\t * theme, then there's nothing we can do about that, so we have to bail,\n\t * rather than going into an infinite loop. (This is why there are\n\t * checks against WP_DEFAULT_THEME above, also.) We also can't do anything\n\t * if it turns out there is no default theme installed. (That's `false`.)\n\t */\n\t$default = WP_Theme::get_core_default_theme();\n\tif ( false === $default || get_stylesheet() == $default->get_stylesheet() ) {\n\t\treturn true;\n\t}\n\n\tswitch_theme( $default->get_stylesheet() );\n\treturn false;\n}\n\n/**\n * Retrieve all theme modifications.\n *\n * @since 3.1.0\n *\n * @return array|void Theme modifications.\n */\nfunction get_theme_mods() {\n\t$theme_slug = get_option( 'stylesheet' );\n\t$mods = get_option( \"theme_mods_$theme_slug\" );\n\tif ( false === $mods ) {\n\t\t$theme_name = get_option( 'current_theme' );\n\t\tif ( false === $theme_name )\n\t\t\t$theme_name = wp_get_theme()->get('Name');\n\t\t$mods = get_option( \"mods_$theme_name\" ); // Deprecated location.\n\t\tif ( is_admin() && false !== $mods ) {\n\t\t\tupdate_option( \"theme_mods_$theme_slug\", $mods );\n\t\t\tdelete_option( \"mods_$theme_name\" );\n\t\t}\n\t}\n\treturn $mods;\n}\n\n/**\n * Retrieve theme modification value for the current theme.\n *\n * If the modification name does not exist, then the $default will be passed\n * through {@link http://php.net/sprintf sprintf()} PHP function with the first\n * string the template directory URI and the second string the stylesheet\n * directory URI.\n *\n * @since 2.1.0\n *\n * @param string      $name    Theme modification name.\n * @param bool|string $default\n * @return string\n */\nfunction get_theme_mod( $name, $default = false ) {\n\t$mods = get_theme_mods();\n\n\tif ( isset( $mods[$name] ) ) {\n\t\t/**\n\t\t * Filter the theme modification, or 'theme_mod', value.\n\t\t *\n\t\t * The dynamic portion of the hook name, `$name`, refers to\n\t\t * the key name of the modification array. For example,\n\t\t * 'header_textcolor', 'header_image', and so on depending\n\t\t * on the theme options.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @param string $current_mod The value of the current theme modification.\n\t\t */\n\t\treturn apply_filters( \"theme_mod_{$name}\", $mods[$name] );\n\t}\n\n\tif ( is_string( $default ) )\n\t\t$default = sprintf( $default, get_template_directory_uri(), get_stylesheet_directory_uri() );\n\n\t/** This filter is documented in wp-includes/theme.php */\n\treturn apply_filters( \"theme_mod_{$name}\", $default );\n}\n\n/**\n * Update theme modification value for the current theme.\n *\n * @since 2.1.0\n *\n * @param string $name  Theme modification name.\n * @param mixed  $value Theme modification value.\n */\nfunction set_theme_mod( $name, $value ) {\n\t$mods = get_theme_mods();\n\t$old_value = isset( $mods[ $name ] ) ? $mods[ $name ] : false;\n\n\t/**\n\t * Filter the theme mod value on save.\n\t *\n\t * The dynamic portion of the hook name, `$name`, refers to the key name of\n\t * the modification array. For example, 'header_textcolor', 'header_image',\n\t * and so on depending on the theme options.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param string $value     The new value of the theme mod.\n\t * @param string $old_value The current value of the theme mod.\n\t */\n\t$mods[ $name ] = apply_filters( \"pre_set_theme_mod_$name\", $value, $old_value );\n\n\t$theme = get_option( 'stylesheet' );\n\tupdate_option( \"theme_mods_$theme\", $mods );\n}\n\n/**\n * Remove theme modification name from current theme list.\n *\n * If removing the name also removes all elements, then the entire option will\n * be removed.\n *\n * @since 2.1.0\n *\n * @param string $name Theme modification name.\n */\nfunction remove_theme_mod( $name ) {\n\t$mods = get_theme_mods();\n\n\tif ( ! isset( $mods[ $name ] ) )\n\t\treturn;\n\n\tunset( $mods[ $name ] );\n\n\tif ( empty( $mods ) ) {\n\t\tremove_theme_mods();\n\t\treturn;\n\t}\n\t$theme = get_option( 'stylesheet' );\n\tupdate_option( \"theme_mods_$theme\", $mods );\n}\n\n/**\n * Remove theme modifications option for current theme.\n *\n * @since 2.1.0\n */\nfunction remove_theme_mods() {\n\tdelete_option( 'theme_mods_' . get_option( 'stylesheet' ) );\n\n\t// Old style.\n\t$theme_name = get_option( 'current_theme' );\n\tif ( false === $theme_name )\n\t\t$theme_name = wp_get_theme()->get('Name');\n\tdelete_option( 'mods_' . $theme_name );\n}\n\n/**\n * Retrieve text color for custom header.\n *\n * @since 2.1.0\n *\n * @return string\n */\nfunction get_header_textcolor() {\n\treturn get_theme_mod('header_textcolor', get_theme_support( 'custom-header', 'default-text-color' ) );\n}\n\n/**\n * Display text color for custom header.\n *\n * @since 2.1.0\n */\nfunction header_textcolor() {\n\techo get_header_textcolor();\n}\n\n/**\n * Whether to display the header text.\n *\n * @since 3.4.0\n *\n * @return bool\n */\nfunction display_header_text() {\n\tif ( ! current_theme_supports( 'custom-header', 'header-text' ) )\n\t\treturn false;\n\n\t$text_color = get_theme_mod( 'header_textcolor', get_theme_support( 'custom-header', 'default-text-color' ) );\n\treturn 'blank' !== $text_color;\n}\n\n/**\n * Check whether a header image is set or not.\n *\n * @since 4.2.0\n *\n * @see get_header_image()\n *\n * @return bool Whether a header image is set or not.\n */\nfunction has_header_image() {\n\treturn (bool) get_header_image();\n}\n\n/**\n * Retrieve header image for custom header.\n *\n * @since 2.1.0\n *\n * @return string|false\n */\nfunction get_header_image() {\n\t$url = get_theme_mod( 'header_image', get_theme_support( 'custom-header', 'default-image' ) );\n\n\tif ( 'remove-header' == $url )\n\t\treturn false;\n\n\tif ( is_random_header_image() )\n\t\t$url = get_random_header_image();\n\n\treturn esc_url_raw( set_url_scheme( $url ) );\n}\n\n/**\n * Create image tag markup for a custom header image.\n *\n * @since 4.4.0\n *\n * @param array $attr Optional. Additional attributes for the image tag. Can be used\n *                              to override the default attributes. Default empty.\n * @return string HTML image element markup or empty string on failure.\n */\nfunction get_header_image_tag( $attr = array() ) {\n\t$header = get_custom_header();\n\n\tif ( empty( $header->url ) ) {\n\t\treturn '';\n\t}\n\n\t$width = absint( $header->width );\n\t$height = absint( $header->height );\n\n\t$attr = wp_parse_args(\n\t\t$attr,\n\t\tarray(\n\t\t\t'src' => $header->url,\n\t\t\t'width' => $width,\n\t\t\t'height' => $height,\n\t\t\t'alt' => get_bloginfo( 'name' ),\n\t\t)\n\t);\n\n\t// Generate 'srcset' and 'sizes' if not already present.\n\tif ( empty( $attr['srcset'] ) && ! empty( $header->attachment_id ) ) {\n\t\t$image_meta = get_post_meta( $header->attachment_id, '_wp_attachment_metadata', true );\n\t\t$size_array = array( $width, $height );\n\n\t\tif ( is_array( $image_meta ) ) {\n\t\t\t$srcset = wp_calculate_image_srcset( $size_array, $header->url, $image_meta, $header->attachment_id );\n\t\t\t$sizes = ! empty( $attr['sizes'] ) ? $attr['sizes'] : wp_calculate_image_sizes( $size_array, $header->url, $image_meta, $header->attachment_id );\n\n\t\t\tif ( $srcset && $sizes ) {\n\t\t\t\t$attr['srcset'] = $srcset;\n\t\t\t\t$attr['sizes'] = $sizes;\n\t\t\t}\n\t\t}\n\t}\n\n\t$attr = array_map( 'esc_attr', $attr );\n\t$html = '<img';\n\n\tforeach ( $attr as $name => $value ) {\n\t\t$html .= ' ' . $name . '=\"' . $value . '\"';\n\t}\n\n\t$html .= ' />';\n\n\t/**\n\t * Filter the markup of header images.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param string $html   The HTML image tag markup being filtered.\n\t * @param object $header The custom header object returned by 'get_custom_header()'.\n\t * @param array  $attr   Array of the attributes for the image tag.\n\t */\n\treturn apply_filters( 'get_header_image_tag', $html, $header, $attr );\n}\n\n/**\n * Display the image markup for a custom header image.\n *\n * @since 4.4.0\n *\n * @param array $attr Optional. Attributes for the image markup. Default empty.\n */\nfunction the_header_image_tag( $attr = array() ) {\n\techo get_header_image_tag( $attr );\n}\n\n/**\n * Get random header image data from registered images in theme.\n *\n * @since 3.4.0\n *\n * @access private\n *\n * @global array  $_wp_default_headers\n * @staticvar object $_wp_random_header\n *\n * @return object\n */\nfunction _get_random_header_data() {\n\tstatic $_wp_random_header = null;\n\n\tif ( empty( $_wp_random_header ) ) {\n\t\tglobal $_wp_default_headers;\n\t\t$header_image_mod = get_theme_mod( 'header_image', '' );\n\t\t$headers = array();\n\n\t\tif ( 'random-uploaded-image' == $header_image_mod )\n\t\t\t$headers = get_uploaded_header_images();\n\t\telseif ( ! empty( $_wp_default_headers ) ) {\n\t\t\tif ( 'random-default-image' == $header_image_mod ) {\n\t\t\t\t$headers = $_wp_default_headers;\n\t\t\t} else {\n\t\t\t\tif ( current_theme_supports( 'custom-header', 'random-default' ) )\n\t\t\t\t\t$headers = $_wp_default_headers;\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $headers ) )\n\t\t\treturn new stdClass;\n\n\t\t$_wp_random_header = (object) $headers[ array_rand( $headers ) ];\n\n\t\t$_wp_random_header->url =  sprintf( $_wp_random_header->url, get_template_directory_uri(), get_stylesheet_directory_uri() );\n\t\t$_wp_random_header->thumbnail_url =  sprintf( $_wp_random_header->thumbnail_url, get_template_directory_uri(), get_stylesheet_directory_uri() );\n\t}\n\treturn $_wp_random_header;\n}\n\n/**\n * Get random header image url from registered images in theme.\n *\n * @since 3.2.0\n *\n * @return string Path to header image\n */\nfunction get_random_header_image() {\n\t$random_image = _get_random_header_data();\n\tif ( empty( $random_image->url ) )\n\t\treturn '';\n\treturn $random_image->url;\n}\n\n/**\n * Check if random header image is in use.\n *\n * Always true if user expressly chooses the option in Appearance > Header.\n * Also true if theme has multiple header images registered, no specific header image\n * is chosen, and theme turns on random headers with add_theme_support().\n *\n * @since 3.2.0\n *\n * @param string $type The random pool to use. any|default|uploaded\n * @return bool\n */\nfunction is_random_header_image( $type = 'any' ) {\n\t$header_image_mod = get_theme_mod( 'header_image', get_theme_support( 'custom-header', 'default-image' ) );\n\n\tif ( 'any' == $type ) {\n\t\tif ( 'random-default-image' == $header_image_mod || 'random-uploaded-image' == $header_image_mod || ( '' != get_random_header_image() && empty( $header_image_mod ) ) )\n\t\t\treturn true;\n\t} else {\n\t\tif ( \"random-$type-image\" == $header_image_mod )\n\t\t\treturn true;\n\t\telseif ( 'default' == $type && empty( $header_image_mod ) && '' != get_random_header_image() )\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Display header image URL.\n *\n * @since 2.1.0\n */\nfunction header_image() {\n\t$image = get_header_image();\n\tif ( $image ) {\n\t\techo esc_url( $image );\n\t}\n}\n\n/**\n * Get the header images uploaded for the current theme.\n *\n * @since 3.2.0\n *\n * @return array\n */\nfunction get_uploaded_header_images() {\n\t$header_images = array();\n\n\t// @todo caching\n\t$headers = get_posts( array( 'post_type' => 'attachment', 'meta_key' => '_wp_attachment_is_custom_header', 'meta_value' => get_option('stylesheet'), 'orderby' => 'none', 'nopaging' => true ) );\n\n\tif ( empty( $headers ) )\n\t\treturn array();\n\n\tforeach ( (array) $headers as $header ) {\n\t\t$url = esc_url_raw( wp_get_attachment_url( $header->ID ) );\n\t\t$header_data = wp_get_attachment_metadata( $header->ID );\n\t\t$header_index = basename($url);\n\n\t\t$header_images[$header_index] = array();\n\t\t$header_images[$header_index]['attachment_id'] = $header->ID;\n\t\t$header_images[$header_index]['url'] =  $url;\n\t\t$header_images[$header_index]['thumbnail_url'] = $url;\n\t\t$header_images[$header_index]['alt_text'] = get_post_meta( $header->ID, '_wp_attachment_image_alt', true );\n\n\t\tif ( isset( $header_data['width'] ) )\n\t\t\t$header_images[$header_index]['width'] = $header_data['width'];\n\t\tif ( isset( $header_data['height'] ) )\n\t\t\t$header_images[$header_index]['height'] = $header_data['height'];\n\t}\n\n\treturn $header_images;\n}\n\n/**\n * Get the header image data.\n *\n * @since 3.4.0\n *\n * @global array $_wp_default_headers\n *\n * @return object\n */\nfunction get_custom_header() {\n\tglobal $_wp_default_headers;\n\n\tif ( is_random_header_image() ) {\n\t\t$data = _get_random_header_data();\n\t} else {\n\t\t$data = get_theme_mod( 'header_image_data' );\n\t\tif ( ! $data && current_theme_supports( 'custom-header', 'default-image' ) ) {\n\t\t\t$directory_args = array( get_template_directory_uri(), get_stylesheet_directory_uri() );\n\t\t\t$data = array();\n\t\t\t$data['url'] = $data['thumbnail_url'] = vsprintf( get_theme_support( 'custom-header', 'default-image' ), $directory_args );\n\t\t\tif ( ! empty( $_wp_default_headers ) ) {\n\t\t\t\tforeach ( (array) $_wp_default_headers as $default_header ) {\n\t\t\t\t\t$url = vsprintf( $default_header['url'], $directory_args );\n\t\t\t\t\tif ( $data['url'] == $url ) {\n\t\t\t\t\t\t$data = $default_header;\n\t\t\t\t\t\t$data['url'] = $url;\n\t\t\t\t\t\t$data['thumbnail_url'] = vsprintf( $data['thumbnail_url'], $directory_args );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t$default = array(\n\t\t'url'           => '',\n\t\t'thumbnail_url' => '',\n\t\t'width'         => get_theme_support( 'custom-header', 'width' ),\n\t\t'height'        => get_theme_support( 'custom-header', 'height' ),\n\t);\n\treturn (object) wp_parse_args( $data, $default );\n}\n\n/**\n * Register a selection of default headers to be displayed by the custom header admin UI.\n *\n * @since 3.0.0\n *\n * @global array $_wp_default_headers\n *\n * @param array $headers Array of headers keyed by a string id. The ids point to arrays containing 'url', 'thumbnail_url', and 'description' keys.\n */\nfunction register_default_headers( $headers ) {\n\tglobal $_wp_default_headers;\n\n\t$_wp_default_headers = array_merge( (array) $_wp_default_headers, (array) $headers );\n}\n\n/**\n * Unregister default headers.\n *\n * This function must be called after register_default_headers() has already added the\n * header you want to remove.\n *\n * @see register_default_headers()\n * @since 3.0.0\n *\n * @global array $_wp_default_headers\n *\n * @param string|array $header The header string id (key of array) to remove, or an array thereof.\n * @return bool|void A single header returns true on success, false on failure.\n *                   There is currently no return value for multiple headers.\n */\nfunction unregister_default_headers( $header ) {\n\tglobal $_wp_default_headers;\n\tif ( is_array( $header ) ) {\n\t\tarray_map( 'unregister_default_headers', $header );\n\t} elseif ( isset( $_wp_default_headers[ $header ] ) ) {\n\t\tunset( $_wp_default_headers[ $header ] );\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n}\n\n/**\n * Retrieve background image for custom background.\n *\n * @since 3.0.0\n *\n * @return string\n */\nfunction get_background_image() {\n\treturn get_theme_mod('background_image', get_theme_support( 'custom-background', 'default-image' ) );\n}\n\n/**\n * Display background image path.\n *\n * @since 3.0.0\n */\nfunction background_image() {\n\techo get_background_image();\n}\n\n/**\n * Retrieve value for custom background color.\n *\n * @since 3.0.0\n *\n * @return string\n */\nfunction get_background_color() {\n\treturn get_theme_mod('background_color', get_theme_support( 'custom-background', 'default-color' ) );\n}\n\n/**\n * Display background color value.\n *\n * @since 3.0.0\n */\nfunction background_color() {\n\techo get_background_color();\n}\n\n/**\n * Default custom background callback.\n *\n * @since 3.0.0\n * @access protected\n */\nfunction _custom_background_cb() {\n\t// $background is the saved custom image, or the default image.\n\t$background = set_url_scheme( get_background_image() );\n\n\t// $color is the saved custom color.\n\t// A default has to be specified in style.css. It will not be printed here.\n\t$color = get_background_color();\n\n\tif ( $color === get_theme_support( 'custom-background', 'default-color' ) ) {\n\t\t$color = false;\n\t}\n\n\tif ( ! $background && ! $color )\n\t\treturn;\n\n\t$style = $color ? \"background-color: #$color;\" : '';\n\n\tif ( $background ) {\n\t\t$image = \" background-image: url('$background');\";\n\n\t\t$repeat = get_theme_mod( 'background_repeat', get_theme_support( 'custom-background', 'default-repeat' ) );\n\t\tif ( ! in_array( $repeat, array( 'no-repeat', 'repeat-x', 'repeat-y', 'repeat' ) ) )\n\t\t\t$repeat = 'repeat';\n\t\t$repeat = \" background-repeat: $repeat;\";\n\n\t\t$position = get_theme_mod( 'background_position_x', get_theme_support( 'custom-background', 'default-position-x' ) );\n\t\tif ( ! in_array( $position, array( 'center', 'right', 'left' ) ) )\n\t\t\t$position = 'left';\n\t\t$position = \" background-position: top $position;\";\n\n\t\t$attachment = get_theme_mod( 'background_attachment', get_theme_support( 'custom-background', 'default-attachment' ) );\n\t\tif ( ! in_array( $attachment, array( 'fixed', 'scroll' ) ) )\n\t\t\t$attachment = 'scroll';\n\t\t$attachment = \" background-attachment: $attachment;\";\n\n\t\t$style .= $image . $repeat . $position . $attachment;\n\t}\n?>\n<style type=\"text/css\" id=\"custom-background-css\">\nbody.custom-background { <?php echo trim( $style ); ?> }\n</style>\n<?php\n}\n\n/**\n * Add callback for custom TinyMCE editor stylesheets.\n *\n * The parameter $stylesheet is the name of the stylesheet, relative to\n * the theme root. It also accepts an array of stylesheets.\n * It is optional and defaults to 'editor-style.css'.\n *\n * This function automatically adds another stylesheet with -rtl prefix, e.g. editor-style-rtl.css.\n * If that file doesn't exist, it is removed before adding the stylesheet(s) to TinyMCE.\n * If an array of stylesheets is passed to add_editor_style(),\n * RTL is only added for the first stylesheet.\n *\n * Since version 3.4 the TinyMCE body has .rtl CSS class.\n * It is a better option to use that class and add any RTL styles to the main stylesheet.\n *\n * @since 3.0.0\n *\n * @global array $editor_styles\n *\n * @param array|string $stylesheet Optional. Stylesheet name or array thereof, relative to theme root.\n * \t                               Defaults to 'editor-style.css'\n */\nfunction add_editor_style( $stylesheet = 'editor-style.css' ) {\n\tadd_theme_support( 'editor-style' );\n\n\tif ( ! is_admin() )\n\t\treturn;\n\n\tglobal $editor_styles;\n\t$editor_styles = (array) $editor_styles;\n\t$stylesheet    = (array) $stylesheet;\n\tif ( is_rtl() ) {\n\t\t$rtl_stylesheet = str_replace('.css', '-rtl.css', $stylesheet[0]);\n\t\t$stylesheet[] = $rtl_stylesheet;\n\t}\n\n\t$editor_styles = array_merge( $editor_styles, $stylesheet );\n}\n\n/**\n * Removes all visual editor stylesheets.\n *\n * @since 3.1.0\n *\n * @global array $editor_styles\n *\n * @return bool True on success, false if there were no stylesheets to remove.\n */\nfunction remove_editor_styles() {\n\tif ( ! current_theme_supports( 'editor-style' ) )\n\t\treturn false;\n\t_remove_theme_support( 'editor-style' );\n\tif ( is_admin() )\n\t\t$GLOBALS['editor_styles'] = array();\n\treturn true;\n}\n\n/**\n * Retrieve any registered editor stylesheets\n *\n * @since 4.0.0\n *\n * @global array $editor_styles Registered editor stylesheets\n *\n * @return array If registered, a list of editor stylesheet URLs.\n */\nfunction get_editor_stylesheets() {\n\t$stylesheets = array();\n\t// load editor_style.css if the current theme supports it\n\tif ( ! empty( $GLOBALS['editor_styles'] ) && is_array( $GLOBALS['editor_styles'] ) ) {\n\t\t$editor_styles = $GLOBALS['editor_styles'];\n\n\t\t$editor_styles = array_unique( array_filter( $editor_styles ) );\n\t\t$style_uri = get_stylesheet_directory_uri();\n\t\t$style_dir = get_stylesheet_directory();\n\n\t\t// Support externally referenced styles (like, say, fonts).\n\t\tforeach ( $editor_styles as $key => $file ) {\n\t\t\tif ( preg_match( '~^(https?:)?//~', $file ) ) {\n\t\t\t\t$stylesheets[] = esc_url_raw( $file );\n\t\t\t\tunset( $editor_styles[ $key ] );\n\t\t\t}\n\t\t}\n\n\t\t// Look in a parent theme first, that way child theme CSS overrides.\n\t\tif ( is_child_theme() ) {\n\t\t\t$template_uri = get_template_directory_uri();\n\t\t\t$template_dir = get_template_directory();\n\n\t\t\tforeach ( $editor_styles as $key => $file ) {\n\t\t\t\tif ( $file && file_exists( \"$template_dir/$file\" ) ) {\n\t\t\t\t\t$stylesheets[] = \"$template_uri/$file\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tforeach ( $editor_styles as $file ) {\n\t\t\tif ( $file && file_exists( \"$style_dir/$file\" ) ) {\n\t\t\t\t$stylesheets[] = \"$style_uri/$file\";\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Filter the array of stylesheets applied to the editor.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param array $stylesheets Array of stylesheets to be applied to the editor.\n\t */\n\treturn apply_filters( 'editor_stylesheets', $stylesheets );\n}\n\n/**\n * Allows a theme to register its support of a certain feature\n *\n * Must be called in the theme's functions.php file to work.\n * If attached to a hook, it must be after_setup_theme.\n * The init hook may be too late for some features.\n *\n * @since 2.9.0\n *\n * @global array $_wp_theme_features\n *\n * @param string $feature The feature being added.\n * @return void|bool False on failure, void otherwise.\n */\nfunction add_theme_support( $feature ) {\n\tglobal $_wp_theme_features;\n\n\tif ( func_num_args() == 1 )\n\t\t$args = true;\n\telse\n\t\t$args = array_slice( func_get_args(), 1 );\n\n\tswitch ( $feature ) {\n\t\tcase 'post-formats' :\n\t\t\tif ( is_array( $args[0] ) ) {\n\t\t\t\t$post_formats = get_post_format_slugs();\n\t\t\t\tunset( $post_formats['standard'] );\n\n\t\t\t\t$args[0] = array_intersect( $args[0], array_keys( $post_formats ) );\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'html5' :\n\t\t\t// You can't just pass 'html5', you need to pass an array of types.\n\t\t\tif ( empty( $args[0] ) ) {\n\t\t\t\t// Build an array of types for back-compat.\n\t\t\t\t$args = array( 0 => array( 'comment-list', 'comment-form', 'search-form' ) );\n\t\t\t} elseif ( ! is_array( $args[0] ) ) {\n\t\t\t\t_doing_it_wrong( \"add_theme_support( 'html5' )\", __( 'You need to pass an array of types.' ), '3.6.1' );\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Calling 'html5' again merges, rather than overwrites.\n\t\t\tif ( isset( $_wp_theme_features['html5'] ) )\n\t\t\t\t$args[0] = array_merge( $_wp_theme_features['html5'][0], $args[0] );\n\t\t\tbreak;\n\n\t\tcase 'custom-header-uploads' :\n\t\t\treturn add_theme_support( 'custom-header', array( 'uploads' => true ) );\n\n\t\tcase 'custom-header' :\n\t\t\tif ( ! is_array( $args ) )\n\t\t\t\t$args = array( 0 => array() );\n\n\t\t\t$defaults = array(\n\t\t\t\t'default-image' => '',\n\t\t\t\t'random-default' => false,\n\t\t\t\t'width' => 0,\n\t\t\t\t'height' => 0,\n\t\t\t\t'flex-height' => false,\n\t\t\t\t'flex-width' => false,\n\t\t\t\t'default-text-color' => '',\n\t\t\t\t'header-text' => true,\n\t\t\t\t'uploads' => true,\n\t\t\t\t'wp-head-callback' => '',\n\t\t\t\t'admin-head-callback' => '',\n\t\t\t\t'admin-preview-callback' => '',\n\t\t\t);\n\n\t\t\t$jit = isset( $args[0]['__jit'] );\n\t\t\tunset( $args[0]['__jit'] );\n\n\t\t\t// Merge in data from previous add_theme_support() calls.\n\t\t\t// The first value registered wins. (A child theme is set up first.)\n\t\t\tif ( isset( $_wp_theme_features['custom-header'] ) )\n\t\t\t\t$args[0] = wp_parse_args( $_wp_theme_features['custom-header'][0], $args[0] );\n\n\t\t\t// Load in the defaults at the end, as we need to insure first one wins.\n\t\t\t// This will cause all constants to be defined, as each arg will then be set to the default.\n\t\t\tif ( $jit )\n\t\t\t\t$args[0] = wp_parse_args( $args[0], $defaults );\n\n\t\t\t// If a constant was defined, use that value. Otherwise, define the constant to ensure\n\t\t\t// the constant is always accurate (and is not defined later,  overriding our value).\n\t\t\t// As stated above, the first value wins.\n\t\t\t// Once we get to wp_loaded (just-in-time), define any constants we haven't already.\n\t\t\t// Constants are lame. Don't reference them. This is just for backwards compatibility.\n\n\t\t\tif ( defined( 'NO_HEADER_TEXT' ) )\n\t\t\t\t$args[0]['header-text'] = ! NO_HEADER_TEXT;\n\t\t\telseif ( isset( $args[0]['header-text'] ) )\n\t\t\t\tdefine( 'NO_HEADER_TEXT', empty( $args[0]['header-text'] ) );\n\n\t\t\tif ( defined( 'HEADER_IMAGE_WIDTH' ) )\n\t\t\t\t$args[0]['width'] = (int) HEADER_IMAGE_WIDTH;\n\t\t\telseif ( isset( $args[0]['width'] ) )\n\t\t\t\tdefine( 'HEADER_IMAGE_WIDTH', (int) $args[0]['width'] );\n\n\t\t\tif ( defined( 'HEADER_IMAGE_HEIGHT' ) )\n\t\t\t\t$args[0]['height'] = (int) HEADER_IMAGE_HEIGHT;\n\t\t\telseif ( isset( $args[0]['height'] ) )\n\t\t\t\tdefine( 'HEADER_IMAGE_HEIGHT', (int) $args[0]['height'] );\n\n\t\t\tif ( defined( 'HEADER_TEXTCOLOR' ) )\n\t\t\t\t$args[0]['default-text-color'] = HEADER_TEXTCOLOR;\n\t\t\telseif ( isset( $args[0]['default-text-color'] ) )\n\t\t\t\tdefine( 'HEADER_TEXTCOLOR', $args[0]['default-text-color'] );\n\n\t\t\tif ( defined( 'HEADER_IMAGE' ) )\n\t\t\t\t$args[0]['default-image'] = HEADER_IMAGE;\n\t\t\telseif ( isset( $args[0]['default-image'] ) )\n\t\t\t\tdefine( 'HEADER_IMAGE', $args[0]['default-image'] );\n\n\t\t\tif ( $jit && ! empty( $args[0]['default-image'] ) )\n\t\t\t\t$args[0]['random-default'] = false;\n\n\t\t\t// If headers are supported, and we still don't have a defined width or height,\n\t\t\t// we have implicit flex sizes.\n\t\t\tif ( $jit ) {\n\t\t\t\tif ( empty( $args[0]['width'] ) && empty( $args[0]['flex-width'] ) )\n\t\t\t\t\t$args[0]['flex-width'] = true;\n\t\t\t\tif ( empty( $args[0]['height'] ) && empty( $args[0]['flex-height'] ) )\n\t\t\t\t\t$args[0]['flex-height'] = true;\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase 'custom-background' :\n\t\t\tif ( ! is_array( $args ) )\n\t\t\t\t$args = array( 0 => array() );\n\n\t\t\t$defaults = array(\n\t\t\t\t'default-image'          => '',\n\t\t\t\t'default-repeat'         => 'repeat',\n\t\t\t\t'default-position-x'     => 'left',\n\t\t\t\t'default-attachment'     => 'scroll',\n\t\t\t\t'default-color'          => '',\n\t\t\t\t'wp-head-callback'       => '_custom_background_cb',\n\t\t\t\t'admin-head-callback'    => '',\n\t\t\t\t'admin-preview-callback' => '',\n\t\t\t);\n\n\t\t\t$jit = isset( $args[0]['__jit'] );\n\t\t\tunset( $args[0]['__jit'] );\n\n\t\t\t// Merge in data from previous add_theme_support() calls. The first value registered wins.\n\t\t\tif ( isset( $_wp_theme_features['custom-background'] ) )\n\t\t\t\t$args[0] = wp_parse_args( $_wp_theme_features['custom-background'][0], $args[0] );\n\n\t\t\tif ( $jit )\n\t\t\t\t$args[0] = wp_parse_args( $args[0], $defaults );\n\n\t\t\tif ( defined( 'BACKGROUND_COLOR' ) )\n\t\t\t\t$args[0]['default-color'] = BACKGROUND_COLOR;\n\t\t\telseif ( isset( $args[0]['default-color'] ) || $jit )\n\t\t\t\tdefine( 'BACKGROUND_COLOR', $args[0]['default-color'] );\n\n\t\t\tif ( defined( 'BACKGROUND_IMAGE' ) )\n\t\t\t\t$args[0]['default-image'] = BACKGROUND_IMAGE;\n\t\t\telseif ( isset( $args[0]['default-image'] ) || $jit )\n\t\t\t\tdefine( 'BACKGROUND_IMAGE', $args[0]['default-image'] );\n\n\t\t\tbreak;\n\n\t\t// Ensure that 'title-tag' is accessible in the admin.\n\t\tcase 'title-tag' :\n\t\t\t// Can be called in functions.php but must happen before wp_loaded, i.e. not in header.php.\n\t\t\tif ( did_action( 'wp_loaded' ) ) {\n\t\t\t\t/* translators: 1: Theme support 2: hook name */\n\t\t\t\t_doing_it_wrong( \"add_theme_support( 'title-tag' )\", sprintf( __( 'Theme support for %1$s should be registered before the %2$s hook.' ),\n\t\t\t\t\t'<code>title-tag</code>', '<code>wp_loaded</code>' ), '4.1' );\n\n\t\t\t\treturn false;\n\t\t\t}\n\t}\n\n\t$_wp_theme_features[ $feature ] = $args;\n}\n\n/**\n * Registers the internal custom header and background routines.\n *\n * @since 3.4.0\n * @access private\n *\n * @global Custom_Image_Header $custom_image_header\n * @global Custom_Background   $custom_background\n */\nfunction _custom_header_background_just_in_time() {\n\tglobal $custom_image_header, $custom_background;\n\n\tif ( current_theme_supports( 'custom-header' ) ) {\n\t\t// In case any constants were defined after an add_custom_image_header() call, re-run.\n\t\tadd_theme_support( 'custom-header', array( '__jit' => true ) );\n\n\t\t$args = get_theme_support( 'custom-header' );\n\t\tif ( $args[0]['wp-head-callback'] )\n\t\t\tadd_action( 'wp_head', $args[0]['wp-head-callback'] );\n\n\t\tif ( is_admin() ) {\n\t\t\trequire_once( ABSPATH . 'wp-admin/custom-header.php' );\n\t\t\t$custom_image_header = new Custom_Image_Header( $args[0]['admin-head-callback'], $args[0]['admin-preview-callback'] );\n\t\t}\n\t}\n\n\tif ( current_theme_supports( 'custom-background' ) ) {\n\t\t// In case any constants were defined after an add_custom_background() call, re-run.\n\t\tadd_theme_support( 'custom-background', array( '__jit' => true ) );\n\n\t\t$args = get_theme_support( 'custom-background' );\n\t\tadd_action( 'wp_head', $args[0]['wp-head-callback'] );\n\n\t\tif ( is_admin() ) {\n\t\t\trequire_once( ABSPATH . 'wp-admin/custom-background.php' );\n\t\t\t$custom_background = new Custom_Background( $args[0]['admin-head-callback'], $args[0]['admin-preview-callback'] );\n\t\t}\n\t}\n}\n\n/**\n * Gets the theme support arguments passed when registering that support\n *\n * @since 3.1.0\n *\n * @global array $_wp_theme_features\n *\n * @param string $feature the feature to check\n * @return mixed The array of extra arguments or the value for the registered feature.\n */\nfunction get_theme_support( $feature ) {\n\tglobal $_wp_theme_features;\n\tif ( ! isset( $_wp_theme_features[ $feature ] ) )\n\t\treturn false;\n\n\tif ( func_num_args() <= 1 )\n\t\treturn $_wp_theme_features[ $feature ];\n\n\t$args = array_slice( func_get_args(), 1 );\n\tswitch ( $feature ) {\n\t\tcase 'custom-header' :\n\t\tcase 'custom-background' :\n\t\t\tif ( isset( $_wp_theme_features[ $feature ][0][ $args[0] ] ) )\n\t\t\t\treturn $_wp_theme_features[ $feature ][0][ $args[0] ];\n\t\t\treturn false;\n\n\t\tdefault :\n\t\t\treturn $_wp_theme_features[ $feature ];\n\t}\n}\n\n/**\n * Allows a theme to de-register its support of a certain feature\n *\n * Should be called in the theme's functions.php file. Generally would\n * be used for child themes to override support from the parent theme.\n *\n * @since 3.0.0\n * @see add_theme_support()\n * @param string $feature the feature being added\n * @return bool|void Whether feature was removed.\n */\nfunction remove_theme_support( $feature ) {\n\t// Blacklist: for internal registrations not used directly by themes.\n\tif ( in_array( $feature, array( 'editor-style', 'widgets', 'menus' ) ) )\n\t\treturn false;\n\n\treturn _remove_theme_support( $feature );\n}\n\n/**\n * Do not use. Removes theme support internally, ignorant of the blacklist.\n *\n * @access private\n * @since 3.1.0\n *\n * @global array               $_wp_theme_features\n * @global Custom_Image_Header $custom_image_header\n * @global Custom_Background   $custom_background\n *\n * @param string $feature\n */\nfunction _remove_theme_support( $feature ) {\n\tglobal $_wp_theme_features;\n\n\tswitch ( $feature ) {\n\t\tcase 'custom-header-uploads' :\n\t\t\tif ( ! isset( $_wp_theme_features['custom-header'] ) )\n\t\t\t\treturn false;\n\t\t\tadd_theme_support( 'custom-header', array( 'uploads' => false ) );\n\t\t\treturn; // Do not continue - custom-header-uploads no longer exists.\n\t}\n\n\tif ( ! isset( $_wp_theme_features[ $feature ] ) )\n\t\treturn false;\n\n\tswitch ( $feature ) {\n\t\tcase 'custom-header' :\n\t\t\tif ( ! did_action( 'wp_loaded' ) )\n\t\t\t\tbreak;\n\t\t\t$support = get_theme_support( 'custom-header' );\n\t\t\tif ( $support[0]['wp-head-callback'] )\n\t\t\t\tremove_action( 'wp_head', $support[0]['wp-head-callback'] );\n\t\t\tremove_action( 'admin_menu', array( $GLOBALS['custom_image_header'], 'init' ) );\n\t\t\tunset( $GLOBALS['custom_image_header'] );\n\t\t\tbreak;\n\n\t\tcase 'custom-background' :\n\t\t\tif ( ! did_action( 'wp_loaded' ) )\n\t\t\t\tbreak;\n\t\t\t$support = get_theme_support( 'custom-background' );\n\t\t\tremove_action( 'wp_head', $support[0]['wp-head-callback'] );\n\t\t\tremove_action( 'admin_menu', array( $GLOBALS['custom_background'], 'init' ) );\n\t\t\tunset( $GLOBALS['custom_background'] );\n\t\t\tbreak;\n\t}\n\n\tunset( $_wp_theme_features[ $feature ] );\n\treturn true;\n}\n\n/**\n * Checks a theme's support for a given feature\n *\n * @since 2.9.0\n *\n * @global array $_wp_theme_features\n *\n * @param string $feature the feature being checked\n * @return bool\n */\nfunction current_theme_supports( $feature ) {\n\tglobal $_wp_theme_features;\n\n\tif ( 'custom-header-uploads' == $feature )\n\t\treturn current_theme_supports( 'custom-header', 'uploads' );\n\n\tif ( !isset( $_wp_theme_features[$feature] ) )\n\t\treturn false;\n\n\t// If no args passed then no extra checks need be performed\n\tif ( func_num_args() <= 1 )\n\t\treturn true;\n\n\t$args = array_slice( func_get_args(), 1 );\n\n\tswitch ( $feature ) {\n\t\tcase 'post-thumbnails':\n\t\t\t// post-thumbnails can be registered for only certain content/post types by passing\n\t\t\t// an array of types to add_theme_support(). If no array was passed, then\n\t\t\t// any type is accepted\n\t\t\tif ( true === $_wp_theme_features[$feature] )  // Registered for all types\n\t\t\t\treturn true;\n\t\t\t$content_type = $args[0];\n\t\t\treturn in_array( $content_type, $_wp_theme_features[$feature][0] );\n\n\t\tcase 'html5':\n\t\tcase 'post-formats':\n\t\t\t// specific post formats can be registered by passing an array of types to\n\t\t\t// add_theme_support()\n\n\t\t\t// Specific areas of HTML5 support *must* be passed via an array to add_theme_support()\n\n\t\t\t$type = $args[0];\n\t\t\treturn in_array( $type, $_wp_theme_features[$feature][0] );\n\n\t\tcase 'custom-header':\n\t\tcase 'custom-background' :\n\t\t\t// specific custom header and background capabilities can be registered by passing\n\t\t\t// an array to add_theme_support()\n\t\t\t$header_support = $args[0];\n\t\t\treturn ( isset( $_wp_theme_features[$feature][0][$header_support] ) && $_wp_theme_features[$feature][0][$header_support] );\n\t}\n\n\t/**\n\t * Filter whether the current theme supports a specific feature.\n\t *\n\t * The dynamic portion of the hook name, `$feature`, refers to the specific theme\n\t * feature. Possible values include 'post-formats', 'post-thumbnails', 'custom-background',\n\t * 'custom-header', 'menus', 'automatic-feed-links', and 'html5'.\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param bool   true     Whether the current theme supports the given feature. Default true.\n\t * @param array  $args    Array of arguments for the feature.\n\t * @param string $feature The theme feature.\n\t */\n\treturn apply_filters( \"current_theme_supports-{$feature}\", true, $args, $_wp_theme_features[$feature] );\n}\n\n/**\n * Checks a theme's support for a given feature before loading the functions which implement it.\n *\n * @since 2.9.0\n *\n * @param string $feature The feature being checked.\n * @param string $include Path to the file.\n * @return bool True if the current theme supports the supplied feature, false otherwise.\n */\nfunction require_if_theme_supports( $feature, $include ) {\n\tif ( current_theme_supports( $feature ) ) {\n\t\trequire ( $include );\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Checks an attachment being deleted to see if it's a header or background image.\n *\n * If true it removes the theme modification which would be pointing at the deleted\n * attachment.\n *\n * @access private\n * @since 3.0.0\n * @since 4.3.0 Also removes `header_image_data`.\n *\n * @param int $id The attachment id.\n */\nfunction _delete_attachment_theme_mod( $id ) {\n\t$attachment_image = wp_get_attachment_url( $id );\n\t$header_image     = get_header_image();\n\t$background_image = get_background_image();\n\n\tif ( $header_image && $header_image == $attachment_image ) {\n\t\tremove_theme_mod( 'header_image' );\n\t\tremove_theme_mod( 'header_image_data' );\n\t}\n\n\tif ( $background_image && $background_image == $attachment_image ) {\n\t\tremove_theme_mod( 'background_image' );\n\t}\n}\n\n/**\n * Checks if a theme has been changed and runs 'after_switch_theme' hook on the next WP load\n *\n * @since 3.3.0\n */\nfunction check_theme_switched() {\n\tif ( $stylesheet = get_option( 'theme_switched' ) ) {\n\t\t$old_theme = wp_get_theme( $stylesheet );\n\n\t\t// Prevent retrieve_widgets() from running since Customizer already called it up front\n\t\tif ( get_option( 'theme_switched_via_customizer' ) ) {\n\t\t\tremove_action( 'after_switch_theme', '_wp_sidebars_changed' );\n\t\t\tupdate_option( 'theme_switched_via_customizer', false );\n\t\t}\n\n\t\tif ( $old_theme->exists() ) {\n\t\t\t/**\n\t\t\t * Fires on the first WP load after a theme switch if the old theme still exists.\n\t\t\t *\n\t\t\t * This action fires multiple times and the parameters differs\n\t\t\t * according to the context, if the old theme exists or not.\n\t\t\t * If the old theme is missing, the parameter will be the slug\n\t\t\t * of the old theme.\n\t\t\t *\n\t\t\t * @since 3.3.0\n\t\t\t *\n\t\t\t * @param string   $old_name  Old theme name.\n\t\t\t * @param WP_Theme $old_theme WP_Theme instance of the old theme.\n\t\t\t */\n\t\t\tdo_action( 'after_switch_theme', $old_theme->get( 'Name' ), $old_theme );\n\t\t} else {\n\t\t\t/** This action is documented in wp-includes/theme.php */\n\t\t\tdo_action( 'after_switch_theme', $stylesheet );\n\t\t}\n\t\tflush_rewrite_rules();\n\n\t\tupdate_option( 'theme_switched', false );\n\t}\n}\n\n/**\n * Includes and instantiates the WP_Customize_Manager class.\n *\n * Loads the Customizer at plugins_loaded when accessing the customize.php admin\n * page or when any request includes a wp_customize=on param, either as a GET\n * query var or as POST data. This param is a signal for whether to bootstrap\n * the Customizer when WordPress is loading, especially in the Customizer preview\n * or when making Customizer Ajax requests for widgets or menus.\n *\n * @since 3.4.0\n *\n * @global WP_Customize_Manager $wp_customize\n */\nfunction _wp_customize_include() {\n\tif ( ! ( ( isset( $_REQUEST['wp_customize'] ) && 'on' == $_REQUEST['wp_customize'] )\n\t\t|| ( is_admin() && 'customize.php' == basename( $_SERVER['PHP_SELF'] ) )\n\t) ) {\n\t\treturn;\n\t}\n\n\trequire_once ABSPATH . WPINC . '/class-wp-customize-manager.php';\n\t$GLOBALS['wp_customize'] = new WP_Customize_Manager();\n}\n\n/**\n * Adds settings for the customize-loader script.\n *\n * @since 3.4.0\n */\nfunction _wp_customize_loader_settings() {\n\t$admin_origin = parse_url( admin_url() );\n\t$home_origin  = parse_url( home_url() );\n\t$cross_domain = ( strtolower( $admin_origin[ 'host' ] ) != strtolower( $home_origin[ 'host' ] ) );\n\n\t$browser = array(\n\t\t'mobile' => wp_is_mobile(),\n\t\t'ios'    => wp_is_mobile() && preg_match( '/iPad|iPod|iPhone/', $_SERVER['HTTP_USER_AGENT'] ),\n\t);\n\n\t$settings = array(\n\t\t'url'           => esc_url( admin_url( 'customize.php' ) ),\n\t\t'isCrossDomain' => $cross_domain,\n\t\t'browser'       => $browser,\n\t\t'l10n'          => array(\n\t\t\t'saveAlert'       => __( 'The changes you made will be lost if you navigate away from this page.' ),\n\t\t\t'mainIframeTitle' => __( 'Customizer' ),\n\t\t),\n\t);\n\n\t$script = 'var _wpCustomizeLoaderSettings = ' . wp_json_encode( $settings ) . ';';\n\n\t$wp_scripts = wp_scripts();\n\t$data = $wp_scripts->get_data( 'customize-loader', 'data' );\n\tif ( $data )\n\t\t$script = \"$data\\n$script\";\n\n\t$wp_scripts->add_data( 'customize-loader', 'data', $script );\n}\n\n/**\n * Returns a URL to load the Customizer.\n *\n * @since 3.4.0\n *\n * @param string $stylesheet Optional. Theme to customize. Defaults to current theme.\n * \t                         The theme's stylesheet will be urlencoded if necessary.\n * @return string\n */\nfunction wp_customize_url( $stylesheet = null ) {\n\t$url = admin_url( 'customize.php' );\n\tif ( $stylesheet )\n\t\t$url .= '?theme=' . urlencode( $stylesheet );\n\treturn esc_url( $url );\n}\n\n/**\n * Prints a script to check whether or not the Customizer is supported,\n * and apply either the no-customize-support or customize-support class\n * to the body.\n *\n * This function MUST be called inside the body tag.\n *\n * Ideally, call this function immediately after the body tag is opened.\n * This prevents a flash of unstyled content.\n *\n * It is also recommended that you add the \"no-customize-support\" class\n * to the body tag by default.\n *\n * @since 3.4.0\n */\nfunction wp_customize_support_script() {\n\t$admin_origin = parse_url( admin_url() );\n\t$home_origin  = parse_url( home_url() );\n\t$cross_domain = ( strtolower( $admin_origin[ 'host' ] ) != strtolower( $home_origin[ 'host' ] ) );\n\n\t?>\n\t<script type=\"text/javascript\">\n\t\t(function() {\n\t\t\tvar request, b = document.body, c = 'className', cs = 'customize-support', rcs = new RegExp('(^|\\\\s+)(no-)?'+cs+'(\\\\s+|$)');\n\n<?php\t\tif ( $cross_domain ): ?>\n\t\t\trequest = (function(){ var xhr = new XMLHttpRequest(); return ('withCredentials' in xhr); })();\n<?php\t\telse: ?>\n\t\t\trequest = true;\n<?php\t\tendif; ?>\n\n\t\t\tb[c] = b[c].replace( rcs, ' ' );\n\t\t\tb[c] += ( window.postMessage && request ? ' ' : ' no-' ) + cs;\n\t\t}());\n\t</script>\n\t<?php\n}\n\n/**\n * Whether the site is being previewed in the Customizer.\n *\n * @since 4.0.0\n *\n * @global WP_Customize_Manager $wp_customize Customizer instance.\n *\n * @return bool True if the site is being previewed in the Customizer, false otherwise.\n */\nfunction is_customize_preview() {\n\tglobal $wp_customize;\n\n\treturn ( $wp_customize instanceof WP_Customize_Manager ) && $wp_customize->is_preview();\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/update.php",
    "content": "<?php\n/**\n * A simple set of functions to check our version 1.0 update service.\n *\n * @package WordPress\n * @since 2.3.0\n */\n\n/**\n * Check WordPress version against the newest version.\n *\n * The WordPress version, PHP version, and Locale is sent. Checks against the\n * WordPress server at api.wordpress.org server. Will only check if WordPress\n * isn't installing.\n *\n * @since 2.3.0\n * @global string $wp_version Used to check against the newest WordPress version.\n * @global wpdb   $wpdb\n * @global string $wp_local_package\n *\n * @param array $extra_stats Extra statistics to report to the WordPress.org API.\n * @param bool  $force_check Whether to bypass the transient cache and force a fresh update check. Defaults to false, true if $extra_stats is set.\n */\nfunction wp_version_check( $extra_stats = array(), $force_check = false ) {\n\tif ( wp_installing() ) {\n\t\treturn;\n\t}\n\n\tglobal $wp_version, $wpdb, $wp_local_package;\n\t// include an unmodified $wp_version\n\tinclude( ABSPATH . WPINC . '/version.php' );\n\t$php_version = phpversion();\n\n\t$current = get_site_transient( 'update_core' );\n\t$translations = wp_get_installed_translations( 'core' );\n\n\t// Invalidate the transient when $wp_version changes\n\tif ( is_object( $current ) && $wp_version != $current->version_checked )\n\t\t$current = false;\n\n\tif ( ! is_object($current) ) {\n\t\t$current = new stdClass;\n\t\t$current->updates = array();\n\t\t$current->version_checked = $wp_version;\n\t}\n\n\tif ( ! empty( $extra_stats ) )\n\t\t$force_check = true;\n\n\t// Wait 60 seconds between multiple version check requests\n\t$timeout = 60;\n\t$time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked );\n\tif ( ! $force_check && $time_not_changed ) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Filter the locale requested for WordPress core translations.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $locale Current locale.\n\t */\n\t$locale = apply_filters( 'core_version_check_locale', get_locale() );\n\n\t// Update last_checked for current to prevent multiple blocking requests if request hangs\n\t$current->last_checked = time();\n\tset_site_transient( 'update_core', $current );\n\n\tif ( method_exists( $wpdb, 'db_version' ) )\n\t\t$mysql_version = preg_replace('/[^0-9.].*/', '', $wpdb->db_version());\n\telse\n\t\t$mysql_version = 'N/A';\n\n\tif ( is_multisite() ) {\n\t\t$user_count = get_user_count();\n\t\t$num_blogs = get_blog_count();\n\t\t$wp_install = network_site_url();\n\t\t$multisite_enabled = 1;\n\t} else {\n\t\t$user_count = count_users();\n\t\t$user_count = $user_count['total_users'];\n\t\t$multisite_enabled = 0;\n\t\t$num_blogs = 1;\n\t\t$wp_install = home_url( '/' );\n\t}\n\n\t$query = array(\n\t\t'version'            => $wp_version,\n\t\t'php'                => $php_version,\n\t\t'locale'             => $locale,\n\t\t'mysql'              => $mysql_version,\n\t\t'local_package'      => isset( $wp_local_package ) ? $wp_local_package : '',\n\t\t'blogs'              => $num_blogs,\n\t\t'users'              => $user_count,\n\t\t'multisite_enabled'  => $multisite_enabled,\n\t\t'initial_db_version' => get_site_option( 'initial_db_version' ),\n\t);\n\n\t$post_body = array(\n\t\t'translations' => wp_json_encode( $translations ),\n\t);\n\n\tif ( is_array( $extra_stats ) )\n\t\t$post_body = array_merge( $post_body, $extra_stats );\n\n\t$url = $http_url = 'http://api.wordpress.org/core/version-check/1.7/?' . http_build_query( $query, null, '&' );\n\tif ( $ssl = wp_http_supports( array( 'ssl' ) ) )\n\t\t$url = set_url_scheme( $url, 'https' );\n\n\t$options = array(\n\t\t'timeout' => ( ( defined('DOING_CRON') && DOING_CRON ) ? 30 : 3 ),\n\t\t'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url( '/' ),\n\t\t'headers' => array(\n\t\t\t'wp_install' => $wp_install,\n\t\t\t'wp_blog' => home_url( '/' )\n\t\t),\n\t\t'body' => $post_body,\n\t);\n\n\t$response = wp_remote_post( $url, $options );\n\tif ( $ssl && is_wp_error( $response ) ) {\n\t\ttrigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );\n\t\t$response = wp_remote_post( $http_url, $options );\n\t}\n\n\tif ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {\n\t\treturn;\n\t}\n\n\t$body = trim( wp_remote_retrieve_body( $response ) );\n\t$body = json_decode( $body, true );\n\n\tif ( ! is_array( $body ) || ! isset( $body['offers'] ) ) {\n\t\treturn;\n\t}\n\n\t$offers = $body['offers'];\n\n\tforeach ( $offers as &$offer ) {\n\t\tforeach ( $offer as $offer_key => $value ) {\n\t\t\tif ( 'packages' == $offer_key )\n\t\t\t\t$offer['packages'] = (object) array_intersect_key( array_map( 'esc_url', $offer['packages'] ),\n\t\t\t\t\tarray_fill_keys( array( 'full', 'no_content', 'new_bundled', 'partial', 'rollback' ), '' ) );\n\t\t\telseif ( 'download' == $offer_key )\n\t\t\t\t$offer['download'] = esc_url( $value );\n\t\t\telse\n\t\t\t\t$offer[ $offer_key ] = esc_html( $value );\n\t\t}\n\t\t$offer = (object) array_intersect_key( $offer, array_fill_keys( array( 'response', 'download', 'locale',\n\t\t\t'packages', 'current', 'version', 'php_version', 'mysql_version', 'new_bundled', 'partial_version', 'notify_email', 'support_email', 'new_files' ), '' ) );\n\t}\n\n\t$updates = new stdClass();\n\t$updates->updates = $offers;\n\t$updates->last_checked = time();\n\t$updates->version_checked = $wp_version;\n\n\tif ( isset( $body['translations'] ) )\n\t\t$updates->translations = $body['translations'];\n\n\tset_site_transient( 'update_core', $updates );\n\n\tif ( ! empty( $body['ttl'] ) ) {\n\t\t$ttl = (int) $body['ttl'];\n\t\tif ( $ttl && ( time() + $ttl < wp_next_scheduled( 'wp_version_check' ) ) ) {\n\t\t\t// Queue an event to re-run the update check in $ttl seconds.\n\t\t\twp_schedule_single_event( time() + $ttl, 'wp_version_check' );\n\t\t}\n\t}\n\n\t// Trigger a background updates check if running non-interactively, and we weren't called from the update handler.\n\tif ( defined( 'DOING_CRON' ) && DOING_CRON && ! doing_action( 'wp_maybe_auto_update' ) ) {\n\t\tdo_action( 'wp_maybe_auto_update' );\n\t}\n}\n\n/**\n * Check plugin versions against the latest versions hosted on WordPress.org.\n *\n * The WordPress version, PHP version, and Locale is sent along with a list of\n * all plugins installed. Checks against the WordPress server at\n * api.wordpress.org. Will only check if WordPress isn't installing.\n *\n * @since 2.3.0\n * @global string $wp_version Used to notify the WordPress version.\n *\n * @param array $extra_stats Extra statistics to report to the WordPress.org API.\n */\nfunction wp_update_plugins( $extra_stats = array() ) {\n\tif ( wp_installing() ) {\n\t\treturn;\n\t}\n\n\tglobal $wp_version;\n\t// include an unmodified $wp_version\n\tinclude( ABSPATH . WPINC . '/version.php' );\n\n\t// If running blog-side, bail unless we've not checked in the last 12 hours\n\tif ( !function_exists( 'get_plugins' ) )\n\t\trequire_once( ABSPATH . 'wp-admin/includes/plugin.php' );\n\n\t$plugins = get_plugins();\n\t$translations = wp_get_installed_translations( 'plugins' );\n\n\t$active  = get_option( 'active_plugins', array() );\n\t$current = get_site_transient( 'update_plugins' );\n\tif ( ! is_object($current) )\n\t\t$current = new stdClass;\n\n\t$new_option = new stdClass;\n\t$new_option->last_checked = time();\n\n\t// Check for update on a different schedule, depending on the page.\n\tswitch ( current_filter() ) {\n\t\tcase 'upgrader_process_complete' :\n\t\t\t$timeout = 0;\n\t\t\tbreak;\n\t\tcase 'load-update-core.php' :\n\t\t\t$timeout = MINUTE_IN_SECONDS;\n\t\t\tbreak;\n\t\tcase 'load-plugins.php' :\n\t\tcase 'load-update.php' :\n\t\t\t$timeout = HOUR_IN_SECONDS;\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tif ( defined( 'DOING_CRON' ) && DOING_CRON ) {\n\t\t\t\t$timeout = 0;\n\t\t\t} else {\n\t\t\t\t$timeout = 12 * HOUR_IN_SECONDS;\n\t\t\t}\n\t}\n\n\t$time_not_changed = isset( $current->last_checked ) && $timeout > ( time() - $current->last_checked );\n\n\tif ( $time_not_changed && ! $extra_stats ) {\n\t\t$plugin_changed = false;\n\t\tforeach ( $plugins as $file => $p ) {\n\t\t\t$new_option->checked[ $file ] = $p['Version'];\n\n\t\t\tif ( !isset( $current->checked[ $file ] ) || strval($current->checked[ $file ]) !== strval($p['Version']) )\n\t\t\t\t$plugin_changed = true;\n\t\t}\n\n\t\tif ( isset ( $current->response ) && is_array( $current->response ) ) {\n\t\t\tforeach ( $current->response as $plugin_file => $update_details ) {\n\t\t\t\tif ( ! isset($plugins[ $plugin_file ]) ) {\n\t\t\t\t\t$plugin_changed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Bail if we've checked recently and if nothing has changed\n\t\tif ( ! $plugin_changed ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Update last_checked for current to prevent multiple blocking requests if request hangs\n\t$current->last_checked = time();\n\tset_site_transient( 'update_plugins', $current );\n\n\t$to_send = compact( 'plugins', 'active' );\n\n\t/**\n\t * Filter the locales requested for plugin translations.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param array $locales Plugin locale. Default is current locale of the site.\n\t */\n\t$locales = apply_filters( 'plugins_update_check_locales', array( get_locale() ) );\n\n\tif ( defined( 'DOING_CRON' ) && DOING_CRON ) {\n\t\t$timeout = 30;\n\t} else {\n\t\t// Three seconds, plus one extra second for every 10 plugins\n\t\t$timeout = 3 + (int) ( count( $plugins ) / 10 );\n\t}\n\n\t$options = array(\n\t\t'timeout' => $timeout,\n\t\t'body' => array(\n\t\t\t'plugins'      => wp_json_encode( $to_send ),\n\t\t\t'translations' => wp_json_encode( $translations ),\n\t\t\t'locale'       => wp_json_encode( $locales ),\n\t\t\t'all'          => wp_json_encode( true ),\n\t\t),\n\t\t'user-agent' => 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )\n\t);\n\n\tif ( $extra_stats ) {\n\t\t$options['body']['update_stats'] = wp_json_encode( $extra_stats );\n\t}\n\n\t$url = $http_url = 'http://api.wordpress.org/plugins/update-check/1.1/';\n\tif ( $ssl = wp_http_supports( array( 'ssl' ) ) )\n\t\t$url = set_url_scheme( $url, 'https' );\n\n\t$raw_response = wp_remote_post( $url, $options );\n\tif ( $ssl && is_wp_error( $raw_response ) ) {\n\t\ttrigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );\n\t\t$raw_response = wp_remote_post( $http_url, $options );\n\t}\n\n\tif ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) {\n\t\treturn;\n\t}\n\n\t$response = json_decode( wp_remote_retrieve_body( $raw_response ), true );\n\tforeach ( $response['plugins'] as &$plugin ) {\n\t\t$plugin = (object) $plugin;\n\t}\n\tunset( $plugin );\n\tforeach ( $response['no_update'] as &$plugin ) {\n\t\t$plugin = (object) $plugin;\n\t}\n\tunset( $plugin );\n\n\tif ( is_array( $response ) ) {\n\t\t$new_option->response = $response['plugins'];\n\t\t$new_option->translations = $response['translations'];\n\t\t// TODO: Perhaps better to store no_update in a separate transient with an expiry?\n\t\t$new_option->no_update = $response['no_update'];\n\t} else {\n\t\t$new_option->response = array();\n\t\t$new_option->translations = array();\n\t\t$new_option->no_update = array();\n\t}\n\n\tset_site_transient( 'update_plugins', $new_option );\n}\n\n/**\n * Check theme versions against the latest versions hosted on WordPress.org.\n *\n * A list of all themes installed in sent to WP. Checks against the\n * WordPress server at api.wordpress.org. Will only check if WordPress isn't\n * installing.\n *\n * @since 2.7.0\n * @uses $wp_version Used to notify the WordPress version.\n *\n * @param array $extra_stats Extra statistics to report to the WordPress.org API.\n */\nfunction wp_update_themes( $extra_stats = array() ) {\n\tif ( wp_installing() ) {\n\t\treturn;\n\t}\n\tglobal $wp_version;\n\t// include an unmodified $wp_version\n\tinclude( ABSPATH . WPINC . '/version.php' );\n\n\t$installed_themes = wp_get_themes();\n\t$translations = wp_get_installed_translations( 'themes' );\n\n\t$last_update = get_site_transient( 'update_themes' );\n\tif ( ! is_object($last_update) )\n\t\t$last_update = new stdClass;\n\n\t$themes = $checked = $request = array();\n\n\t// Put slug of current theme into request.\n\t$request['active'] = get_option( 'stylesheet' );\n\n\tforeach ( $installed_themes as $theme ) {\n\t\t$checked[ $theme->get_stylesheet() ] = $theme->get('Version');\n\n\t\t$themes[ $theme->get_stylesheet() ] = array(\n\t\t\t'Name'       => $theme->get('Name'),\n\t\t\t'Title'      => $theme->get('Name'),\n\t\t\t'Version'    => $theme->get('Version'),\n\t\t\t'Author'     => $theme->get('Author'),\n\t\t\t'Author URI' => $theme->get('AuthorURI'),\n\t\t\t'Template'   => $theme->get_template(),\n\t\t\t'Stylesheet' => $theme->get_stylesheet(),\n\t\t);\n\t}\n\n\t// Check for update on a different schedule, depending on the page.\n\tswitch ( current_filter() ) {\n\t\tcase 'upgrader_process_complete' :\n\t\t\t$timeout = 0;\n\t\t\tbreak;\n\t\tcase 'load-update-core.php' :\n\t\t\t$timeout = MINUTE_IN_SECONDS;\n\t\t\tbreak;\n\t\tcase 'load-themes.php' :\n\t\tcase 'load-update.php' :\n\t\t\t$timeout = HOUR_IN_SECONDS;\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tif ( defined( 'DOING_CRON' ) && DOING_CRON ) {\n\t\t\t\t$timeout = 0;\n\t\t\t} else {\n\t\t\t\t$timeout = 12 * HOUR_IN_SECONDS;\n\t\t\t}\n\t}\n\n\t$time_not_changed = isset( $last_update->last_checked ) && $timeout > ( time() - $last_update->last_checked );\n\n\tif ( $time_not_changed && ! $extra_stats ) {\n\t\t$theme_changed = false;\n\t\tforeach ( $checked as $slug => $v ) {\n\t\t\tif ( !isset( $last_update->checked[ $slug ] ) || strval($last_update->checked[ $slug ]) !== strval($v) )\n\t\t\t\t$theme_changed = true;\n\t\t}\n\n\t\tif ( isset ( $last_update->response ) && is_array( $last_update->response ) ) {\n\t\t\tforeach ( $last_update->response as $slug => $update_details ) {\n\t\t\t\tif ( ! isset($checked[ $slug ]) ) {\n\t\t\t\t\t$theme_changed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Bail if we've checked recently and if nothing has changed\n\t\tif ( ! $theme_changed ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Update last_checked for current to prevent multiple blocking requests if request hangs\n\t$last_update->last_checked = time();\n\tset_site_transient( 'update_themes', $last_update );\n\n\t$request['themes'] = $themes;\n\n\t/**\n\t * Filter the locales requested for theme translations.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param array $locales Theme locale. Default is current locale of the site.\n\t */\n\t$locales = apply_filters( 'themes_update_check_locales', array( get_locale() ) );\n\n\tif ( defined( 'DOING_CRON' ) && DOING_CRON ) {\n\t\t$timeout = 30;\n\t} else {\n\t\t// Three seconds, plus one extra second for every 10 themes\n\t\t$timeout = 3 + (int) ( count( $themes ) / 10 );\n\t}\n\n\t$options = array(\n\t\t'timeout' => $timeout,\n\t\t'body' => array(\n\t\t\t'themes'       => wp_json_encode( $request ),\n\t\t\t'translations' => wp_json_encode( $translations ),\n\t\t\t'locale'       => wp_json_encode( $locales ),\n\t\t),\n\t\t'user-agent'\t=> 'WordPress/' . $wp_version . '; ' . get_bloginfo( 'url' )\n\t);\n\n\tif ( $extra_stats ) {\n\t\t$options['body']['update_stats'] = wp_json_encode( $extra_stats );\n\t}\n\n\t$url = $http_url = 'http://api.wordpress.org/themes/update-check/1.1/';\n\tif ( $ssl = wp_http_supports( array( 'ssl' ) ) )\n\t\t$url = set_url_scheme( $url, 'https' );\n\n\t$raw_response = wp_remote_post( $url, $options );\n\tif ( $ssl && is_wp_error( $raw_response ) ) {\n\t\ttrigger_error( __( 'An unexpected error occurred. Something may be wrong with WordPress.org or this server&#8217;s configuration. If you continue to have problems, please try the <a href=\"https://wordpress.org/support/\">support forums</a>.' ) . ' ' . __( '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)' ), headers_sent() || WP_DEBUG ? E_USER_WARNING : E_USER_NOTICE );\n\t\t$raw_response = wp_remote_post( $http_url, $options );\n\t}\n\n\tif ( is_wp_error( $raw_response ) || 200 != wp_remote_retrieve_response_code( $raw_response ) ) {\n\t\treturn;\n\t}\n\n\t$new_update = new stdClass;\n\t$new_update->last_checked = time();\n\t$new_update->checked = $checked;\n\n\t$response = json_decode( wp_remote_retrieve_body( $raw_response ), true );\n\n\tif ( is_array( $response ) ) {\n\t\t$new_update->response     = $response['themes'];\n\t\t$new_update->translations = $response['translations'];\n\t}\n\n\tset_site_transient( 'update_themes', $new_update );\n}\n\n/**\n * Performs WordPress automatic background updates.\n *\n * @since 3.7.0\n */\nfunction wp_maybe_auto_update() {\n\tinclude_once( ABSPATH . '/wp-admin/includes/admin.php' );\n\tinclude_once( ABSPATH . '/wp-admin/includes/class-wp-upgrader.php' );\n\n\t$upgrader = new WP_Automatic_Updater;\n\t$upgrader->run();\n}\n\n/**\n * Retrieves a list of all language updates available.\n *\n * @since 3.7.0\n *\n * @return array\n */\nfunction wp_get_translation_updates() {\n\t$updates = array();\n\t$transients = array( 'update_core' => 'core', 'update_plugins' => 'plugin', 'update_themes' => 'theme' );\n\tforeach ( $transients as $transient => $type ) {\n\t\t$transient = get_site_transient( $transient );\n\t\tif ( empty( $transient->translations ) )\n\t\t\tcontinue;\n\n\t\tforeach ( $transient->translations as $translation ) {\n\t\t\t$updates[] = (object) $translation;\n\t\t}\n\t}\n\treturn $updates;\n}\n\n/**\n * Collect counts and UI strings for available updates\n *\n * @since 3.3.0\n *\n * @return array\n */\nfunction wp_get_update_data() {\n\t$counts = array( 'plugins' => 0, 'themes' => 0, 'wordpress' => 0, 'translations' => 0 );\n\n\tif ( $plugins = current_user_can( 'update_plugins' ) ) {\n\t\t$update_plugins = get_site_transient( 'update_plugins' );\n\t\tif ( ! empty( $update_plugins->response ) )\n\t\t\t$counts['plugins'] = count( $update_plugins->response );\n\t}\n\n\tif ( $themes = current_user_can( 'update_themes' ) ) {\n\t\t$update_themes = get_site_transient( 'update_themes' );\n\t\tif ( ! empty( $update_themes->response ) )\n\t\t\t$counts['themes'] = count( $update_themes->response );\n\t}\n\n\tif ( ( $core = current_user_can( 'update_core' ) ) && function_exists( 'get_core_updates' ) ) {\n\t\t$update_wordpress = get_core_updates( array('dismissed' => false) );\n\t\tif ( ! empty( $update_wordpress ) && ! in_array( $update_wordpress[0]->response, array('development', 'latest') ) && current_user_can('update_core') )\n\t\t\t$counts['wordpress'] = 1;\n\t}\n\n\tif ( ( $core || $plugins || $themes ) && wp_get_translation_updates() )\n\t\t$counts['translations'] = 1;\n\n\t$counts['total'] = $counts['plugins'] + $counts['themes'] + $counts['wordpress'] + $counts['translations'];\n\t$titles = array();\n\tif ( $counts['wordpress'] )\n\t\t$titles['wordpress'] = sprintf( __( '%d WordPress Update'), $counts['wordpress'] );\n\tif ( $counts['plugins'] )\n\t\t$titles['plugins'] = sprintf( _n( '%d Plugin Update', '%d Plugin Updates', $counts['plugins'] ), $counts['plugins'] );\n\tif ( $counts['themes'] )\n\t\t$titles['themes'] = sprintf( _n( '%d Theme Update', '%d Theme Updates', $counts['themes'] ), $counts['themes'] );\n\tif ( $counts['translations'] )\n\t\t$titles['translations'] = __( 'Translation Updates' );\n\n\t$update_title = $titles ? esc_attr( implode( ', ', $titles ) ) : '';\n\n\t$update_data = array( 'counts' => $counts, 'title' => $update_title );\n\t/**\n\t * Filter the returned array of update data for plugins, themes, and WordPress core.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array $update_data {\n\t *     Fetched update data.\n\t *\n\t *     @type array   $counts       An array of counts for available plugin, theme, and WordPress updates.\n\t *     @type string  $update_title Titles of available updates.\n\t * }\n\t * @param array $titles An array of update counts and UI strings for available updates.\n\t */\n\treturn apply_filters( 'wp_get_update_data', $update_data, $titles );\n}\n\n/**\n * @global string $wp_version\n */\nfunction _maybe_update_core() {\n\tglobal $wp_version;\n\tinclude( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version\n\n\t$current = get_site_transient( 'update_core' );\n\n\tif ( isset( $current->last_checked, $current->version_checked ) &&\n\t\t12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) &&\n\t\t$current->version_checked == $wp_version ) {\n\t\treturn;\n\t}\n\twp_version_check();\n}\n/**\n * Check the last time plugins were run before checking plugin versions.\n *\n * This might have been backported to WordPress 2.6.1 for performance reasons.\n * This is used for the wp-admin to check only so often instead of every page\n * load.\n *\n * @since 2.7.0\n * @access private\n */\nfunction _maybe_update_plugins() {\n\t$current = get_site_transient( 'update_plugins' );\n\tif ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) )\n\t\treturn;\n\twp_update_plugins();\n}\n\n/**\n * Check themes versions only after a duration of time.\n *\n * This is for performance reasons to make sure that on the theme version\n * checker is not run on every page load.\n *\n * @since 2.7.0\n * @access private\n */\nfunction _maybe_update_themes() {\n\t$current = get_site_transient( 'update_themes' );\n\tif ( isset( $current->last_checked ) && 12 * HOUR_IN_SECONDS > ( time() - $current->last_checked ) )\n\t\treturn;\n\twp_update_themes();\n}\n\n/**\n * Schedule core, theme, and plugin update checks.\n *\n * @since 3.1.0\n */\nfunction wp_schedule_update_checks() {\n\tif ( ! wp_next_scheduled( 'wp_version_check' ) && ! wp_installing() )\n\t\twp_schedule_event(time(), 'twicedaily', 'wp_version_check');\n\n\tif ( ! wp_next_scheduled( 'wp_update_plugins' ) && ! wp_installing() )\n\t\twp_schedule_event(time(), 'twicedaily', 'wp_update_plugins');\n\n\tif ( ! wp_next_scheduled( 'wp_update_themes' ) && ! wp_installing() )\n\t\twp_schedule_event(time(), 'twicedaily', 'wp_update_themes');\n\n\tif ( ( wp_next_scheduled( 'wp_maybe_auto_update' ) > ( time() + HOUR_IN_SECONDS ) ) && ! wp_installing() )\n\t\twp_clear_scheduled_hook( 'wp_maybe_auto_update' );\n}\n\n/**\n * Clear existing update caches for plugins, themes, and core.\n *\n * @since 4.1.0\n */\nfunction wp_clean_update_cache() {\n\tif ( function_exists( 'wp_clean_plugins_cache' ) ) {\n\t\twp_clean_plugins_cache();\n\t} else {\n\t\tdelete_site_transient( 'update_plugins' );\n\t}\n\twp_clean_themes_cache();\n\tdelete_site_transient( 'update_core' );\n}\n\nif ( ( ! is_main_site() && ! is_network_admin() ) || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {\n\treturn;\n}\n\nadd_action( 'admin_init', '_maybe_update_core' );\nadd_action( 'wp_version_check', 'wp_version_check' );\nadd_action( 'upgrader_process_complete', 'wp_version_check', 10, 0 );\n\nadd_action( 'load-plugins.php', 'wp_update_plugins' );\nadd_action( 'load-update.php', 'wp_update_plugins' );\nadd_action( 'load-update-core.php', 'wp_update_plugins' );\nadd_action( 'admin_init', '_maybe_update_plugins' );\nadd_action( 'wp_update_plugins', 'wp_update_plugins' );\nadd_action( 'upgrader_process_complete', 'wp_update_plugins', 10, 0 );\n\nadd_action( 'load-themes.php', 'wp_update_themes' );\nadd_action( 'load-update.php', 'wp_update_themes' );\nadd_action( 'load-update-core.php', 'wp_update_themes' );\nadd_action( 'admin_init', '_maybe_update_themes' );\nadd_action( 'wp_update_themes', 'wp_update_themes' );\nadd_action( 'upgrader_process_complete', 'wp_update_themes', 10, 0 );\n\nadd_action( 'update_option_WPLANG', 'wp_clean_update_cache' , 10, 0 );\n\nadd_action( 'wp_maybe_auto_update', 'wp_maybe_auto_update' );\n\nadd_action( 'init', 'wp_schedule_update_checks' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/user.php",
    "content": "<?php\n/**\n * Core User API\n *\n * @package WordPress\n * @subpackage Users\n */\n\n/**\n * Authenticate user with remember capability.\n *\n * The credentials is an array that has 'user_login', 'user_password', and\n * 'remember' indices. If the credentials is not given, then the log in form\n * will be assumed and used if set.\n *\n * The various authentication cookies will be set by this function and will be\n * set for a longer period depending on if the 'remember' credential is set to\n * true.\n *\n * @since 2.5.0\n *\n * @global string $auth_secure_cookie\n *\n * @param array       $credentials   Optional. User info in order to sign on.\n * @param string|bool $secure_cookie Optional. Whether to use secure cookie.\n * @return WP_User|WP_Error WP_User on success, WP_Error on failure.\n */\nfunction wp_signon( $credentials = array(), $secure_cookie = '' ) {\n\tif ( empty($credentials) ) {\n\t\tif ( ! empty($_POST['log']) )\n\t\t\t$credentials['user_login'] = $_POST['log'];\n\t\tif ( ! empty($_POST['pwd']) )\n\t\t\t$credentials['user_password'] = $_POST['pwd'];\n\t\tif ( ! empty($_POST['rememberme']) )\n\t\t\t$credentials['remember'] = $_POST['rememberme'];\n\t}\n\n\tif ( !empty($credentials['remember']) )\n\t\t$credentials['remember'] = true;\n\telse\n\t\t$credentials['remember'] = false;\n\n\t/**\n\t * Fires before the user is authenticated.\n\t *\n\t * The variables passed to the callbacks are passed by reference,\n\t * and can be modified by callback functions.\n\t *\n\t * @since 1.5.1\n\t *\n\t * @todo Decide whether to deprecate the wp_authenticate action.\n\t *\n\t * @param string $user_login    Username, passed by reference.\n\t * @param string $user_password User password, passed by reference.\n\t */\n\tdo_action_ref_array( 'wp_authenticate', array( &$credentials['user_login'], &$credentials['user_password'] ) );\n\n\tif ( '' === $secure_cookie )\n\t\t$secure_cookie = is_ssl();\n\n\t/**\n\t * Filter whether to use a secure sign-on cookie.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param bool  $secure_cookie Whether to use a secure sign-on cookie.\n\t * @param array $credentials {\n \t *     Array of entered sign-on data.\n \t *\n \t *     @type string $user_login    Username.\n \t *     @type string $user_password Password entered.\n\t *     @type bool   $remember      Whether to 'remember' the user. Increases the time\n\t *                                 that the cookie will be kept. Default false.\n \t * }\n\t */\n\t$secure_cookie = apply_filters( 'secure_signon_cookie', $secure_cookie, $credentials );\n\n\tglobal $auth_secure_cookie; // XXX ugly hack to pass this to wp_authenticate_cookie\n\t$auth_secure_cookie = $secure_cookie;\n\n\tadd_filter('authenticate', 'wp_authenticate_cookie', 30, 3);\n\n\t$user = wp_authenticate($credentials['user_login'], $credentials['user_password']);\n\n\tif ( is_wp_error($user) ) {\n\t\tif ( $user->get_error_codes() == array('empty_username', 'empty_password') ) {\n\t\t\t$user = new WP_Error('', '');\n\t\t}\n\n\t\treturn $user;\n\t}\n\n\twp_set_auth_cookie($user->ID, $credentials['remember'], $secure_cookie);\n\t/**\n\t * Fires after the user has successfully logged in.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string  $user_login Username.\n\t * @param WP_User $user       WP_User object of the logged-in user.\n\t */\n\tdo_action( 'wp_login', $user->user_login, $user );\n\treturn $user;\n}\n\n/**\n * Authenticate the user using the username and password.\n *\n * @since 2.8.0\n *\n * @param WP_User|WP_Error|null $user     WP_User or WP_Error object from a previous callback. Default null.\n * @param string                $username Username for authentication.\n * @param string                $password Password for authentication.\n * @return WP_User|WP_Error WP_User on success, WP_Error on failure.\n */\nfunction wp_authenticate_username_password($user, $username, $password) {\n\tif ( $user instanceof WP_User ) {\n\t\treturn $user;\n\t}\n\n\tif ( empty($username) || empty($password) ) {\n\t\tif ( is_wp_error( $user ) )\n\t\t\treturn $user;\n\n\t\t$error = new WP_Error();\n\n\t\tif ( empty($username) )\n\t\t\t$error->add('empty_username', __('<strong>ERROR</strong>: The username field is empty.'));\n\n\t\tif ( empty($password) )\n\t\t\t$error->add('empty_password', __('<strong>ERROR</strong>: The password field is empty.'));\n\n\t\treturn $error;\n\t}\n\n\t$user = get_user_by('login', $username);\n\n\tif ( !$user ) {\n\t\treturn new WP_Error( 'invalid_username',\n\t\t\t__( '<strong>ERROR</strong>: Invalid username.' ) .\n\t\t\t' <a href=\"' . wp_lostpassword_url() . '\">' .\n\t\t\t__( 'Lost your password?' ) .\n\t\t\t'</a>'\n\t\t);\n\t}\n\n\t/**\n\t * Filter whether the given user can be authenticated with the provided $password.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param WP_User|WP_Error $user     WP_User or WP_Error object if a previous\n\t *                                   callback failed authentication.\n\t * @param string           $password Password to check against the user.\n\t */\n\t$user = apply_filters( 'wp_authenticate_user', $user, $password );\n\tif ( is_wp_error($user) )\n\t\treturn $user;\n\n\tif ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {\n\t\treturn new WP_Error( 'incorrect_password',\n\t\t\tsprintf(\n\t\t\t\t/* translators: %s: user name */\n\t\t\t\t__( '<strong>ERROR</strong>: The password you entered for the username %s is incorrect.' ),\n\t\t\t\t'<strong>' . $username . '</strong>'\n\t\t\t) .\n\t\t\t' <a href=\"' . wp_lostpassword_url() . '\">' .\n\t\t\t__( 'Lost your password?' ) .\n\t\t\t'</a>'\n\t\t);\n\t}\n\n\treturn $user;\n}\n\n/**\n * Authenticate the user using the WordPress auth cookie.\n *\n * @since 2.8.0\n *\n * @global string $auth_secure_cookie\n *\n * @param WP_User|WP_Error|null $user     WP_User or WP_Error object from a previous callback. Default null.\n * @param string                $username Username. If not empty, cancels the cookie authentication.\n * @param string                $password Password. If not empty, cancels the cookie authentication.\n * @return WP_User|WP_Error WP_User on success, WP_Error on failure.\n */\nfunction wp_authenticate_cookie($user, $username, $password) {\n\tif ( $user instanceof WP_User ) {\n\t\treturn $user;\n\t}\n\n\tif ( empty($username) && empty($password) ) {\n\t\t$user_id = wp_validate_auth_cookie();\n\t\tif ( $user_id )\n\t\t\treturn new WP_User($user_id);\n\n\t\tglobal $auth_secure_cookie;\n\n\t\tif ( $auth_secure_cookie )\n\t\t\t$auth_cookie = SECURE_AUTH_COOKIE;\n\t\telse\n\t\t\t$auth_cookie = AUTH_COOKIE;\n\n\t\tif ( !empty($_COOKIE[$auth_cookie]) )\n\t\t\treturn new WP_Error('expired_session', __('Please log in again.'));\n\n\t\t// If the cookie is not set, be silent.\n\t}\n\n\treturn $user;\n}\n\n/**\n * For Multisite blogs, check if the authenticated user has been marked as a\n * spammer, or if the user's primary blog has been marked as spam.\n *\n * @since 3.7.0\n *\n * @param WP_User|WP_Error|null $user WP_User or WP_Error object from a previous callback. Default null.\n * @return WP_User|WP_Error WP_User on success, WP_Error if the user is considered a spammer.\n */\nfunction wp_authenticate_spam_check( $user ) {\n\tif ( $user instanceof WP_User && is_multisite() ) {\n\t\t/**\n\t\t * Filter whether the user has been marked as a spammer.\n\t\t *\n\t\t * @since 3.7.0\n\t\t *\n\t\t * @param bool    $spammed Whether the user is considered a spammer.\n\t\t * @param WP_User $user    User to check against.\n\t\t */\n\t\t$spammed = apply_filters( 'check_is_user_spammed', is_user_spammy(), $user );\n\n\t\tif ( $spammed )\n\t\t\treturn new WP_Error( 'spammer_account', __( '<strong>ERROR</strong>: Your account has been marked as a spammer.' ) );\n\t}\n\treturn $user;\n}\n\n/**\n * Validate the logged-in cookie.\n *\n * Checks the logged-in cookie if the previous auth cookie could not be\n * validated and parsed.\n *\n * This is a callback for the determine_current_user filter, rather than API.\n *\n * @since 3.9.0\n *\n * @param int|bool $user_id The user ID (or false) as received from the\n *                       determine_current_user filter.\n * @return int|false User ID if validated, false otherwise. If a user ID from\n *                   an earlier filter callback is received, that value is returned.\n */\nfunction wp_validate_logged_in_cookie( $user_id ) {\n\tif ( $user_id ) {\n\t\treturn $user_id;\n\t}\n\n\tif ( is_blog_admin() || is_network_admin() || empty( $_COOKIE[LOGGED_IN_COOKIE] ) ) {\n\t\treturn false;\n\t}\n\n\treturn wp_validate_auth_cookie( $_COOKIE[LOGGED_IN_COOKIE], 'logged_in' );\n}\n\n/**\n * Number of posts user has written.\n *\n * @since 3.0.0\n * @since 4.1.0 Added `$post_type` argument.\n * @since 4.3.0 Added `$public_only` argument. Added the ability to pass an array\n *              of post types to `$post_type`.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int          $userid      User ID.\n * @param array|string $post_type   Optional. Single post type or array of post types to count the number of posts for. Default 'post'.\n * @param bool         $public_only Optional. Whether to only return counts for public posts. Default false.\n * @return int Number of posts the user has written in this post type.\n */\nfunction count_user_posts( $userid, $post_type = 'post', $public_only = false ) {\n\tglobal $wpdb;\n\n\t$where = get_posts_by_author_sql( $post_type, true, $userid, $public_only );\n\n\t$count = $wpdb->get_var( \"SELECT COUNT(*) FROM $wpdb->posts $where\" );\n\n\t/**\n\t * Filter the number of posts a user has written.\n\t *\n\t * @since 2.7.0\n\t * @since 4.1.0 Added `$post_type` argument.\n\t * @since 4.3.1 Added `$public_only` argument.\n\t *\n\t * @param int          $count       The user's post count.\n\t * @param int          $userid      User ID.\n\t * @param string|array $post_type   Single post type or array of post types to count the number of posts for.\n\t * @param bool         $public_only Whether to limit counted posts to public posts.\n\t */\n\treturn apply_filters( 'get_usernumposts', $count, $userid, $post_type, $public_only );\n}\n\n/**\n * Number of posts written by a list of users.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array        $users       Array of user IDs.\n * @param string|array $post_type   Optional. Single post type or array of post types to check. Defaults to 'post'.\n * @param bool         $public_only Optional. Only return counts for public posts.  Defaults to false.\n * @return array Amount of posts each user has written.\n */\nfunction count_many_users_posts( $users, $post_type = 'post', $public_only = false ) {\n\tglobal $wpdb;\n\n\t$count = array();\n\tif ( empty( $users ) || ! is_array( $users ) )\n\t\treturn $count;\n\n\t$userlist = implode( ',', array_map( 'absint', $users ) );\n\t$where = get_posts_by_author_sql( $post_type, true, null, $public_only );\n\n\t$result = $wpdb->get_results( \"SELECT post_author, COUNT(*) FROM $wpdb->posts $where AND post_author IN ($userlist) GROUP BY post_author\", ARRAY_N );\n\tforeach ( $result as $row ) {\n\t\t$count[ $row[0] ] = $row[1];\n\t}\n\n\tforeach ( $users as $id ) {\n\t\tif ( ! isset( $count[ $id ] ) )\n\t\t\t$count[ $id ] = 0;\n\t}\n\n\treturn $count;\n}\n\n//\n// User option functions\n//\n\n/**\n * Get the current user's ID\n *\n * @since MU\n *\n * @return int The current user's ID\n */\nfunction get_current_user_id() {\n\tif ( ! function_exists( 'wp_get_current_user' ) )\n\t\treturn 0;\n\t$user = wp_get_current_user();\n\treturn ( isset( $user->ID ) ? (int) $user->ID : 0 );\n}\n\n/**\n * Retrieve user option that can be either per Site or per Network.\n *\n * If the user ID is not given, then the current user will be used instead. If\n * the user ID is given, then the user data will be retrieved. The filter for\n * the result, will also pass the original option name and finally the user data\n * object as the third parameter.\n *\n * The option will first check for the per site name and then the per Network name.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $option     User option name.\n * @param int    $user       Optional. User ID.\n * @param string $deprecated Use get_option() to check for an option in the options table.\n * @return mixed User option value on success, false on failure.\n */\nfunction get_user_option( $option, $user = 0, $deprecated = '' ) {\n\tglobal $wpdb;\n\n\tif ( !empty( $deprecated ) )\n\t\t_deprecated_argument( __FUNCTION__, '3.0' );\n\n\tif ( empty( $user ) )\n\t\t$user = get_current_user_id();\n\n\tif ( ! $user = get_userdata( $user ) )\n\t\treturn false;\n\n\t$prefix = $wpdb->get_blog_prefix();\n\tif ( $user->has_prop( $prefix . $option ) ) // Blog specific\n\t\t$result = $user->get( $prefix . $option );\n\telseif ( $user->has_prop( $option ) ) // User specific and cross-blog\n\t\t$result = $user->get( $option );\n\telse\n\t\t$result = false;\n\n\t/**\n\t * Filter a specific user option value.\n\t *\n\t * The dynamic portion of the hook name, `$option`, refers to the user option name.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param mixed   $result Value for the user's option.\n\t * @param string  $option Name of the option being retrieved.\n\t * @param WP_User $user   WP_User object of the user whose option is being retrieved.\n\t */\n\treturn apply_filters( \"get_user_option_{$option}\", $result, $option, $user );\n}\n\n/**\n * Update user option with global blog capability.\n *\n * User options are just like user metadata except that they have support for\n * global blog options. If the 'global' parameter is false, which it is by default\n * it will prepend the WordPress table prefix to the option name.\n *\n * Deletes the user option if $newvalue is empty.\n *\n * @since 2.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $user_id     User ID.\n * @param string $option_name User option name.\n * @param mixed  $newvalue    User option value.\n * @param bool   $global      Optional. Whether option name is global or blog specific.\n *                            Default false (blog specific).\n * @return int|bool User meta ID if the option didn't exist, true on successful update,\n *                  false on failure.\n */\nfunction update_user_option( $user_id, $option_name, $newvalue, $global = false ) {\n\tglobal $wpdb;\n\n\tif ( !$global )\n\t\t$option_name = $wpdb->get_blog_prefix() . $option_name;\n\n\treturn update_user_meta( $user_id, $option_name, $newvalue );\n}\n\n/**\n * Delete user option with global blog capability.\n *\n * User options are just like user metadata except that they have support for\n * global blog options. If the 'global' parameter is false, which it is by default\n * it will prepend the WordPress table prefix to the option name.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int    $user_id     User ID\n * @param string $option_name User option name.\n * @param bool   $global      Optional. Whether option name is global or blog specific.\n *                            Default false (blog specific).\n * @return bool True on success, false on failure.\n */\nfunction delete_user_option( $user_id, $option_name, $global = false ) {\n\tglobal $wpdb;\n\n\tif ( !$global )\n\t\t$option_name = $wpdb->get_blog_prefix() . $option_name;\n\treturn delete_user_meta( $user_id, $option_name );\n}\n\n/**\n * Retrieve list of users matching criteria.\n *\n * @since 3.1.0\n *\n * @see WP_User_Query\n *\n * @param array $args Optional. Arguments to retrieve users. See {@see WP_User_Query::prepare_query()}\n *                    for more information on accepted arguments.\n * @return array List of users.\n */\nfunction get_users( $args = array() ) {\n\n\t$args = wp_parse_args( $args );\n\t$args['count_total'] = false;\n\n\t$user_search = new WP_User_Query($args);\n\n\treturn (array) $user_search->get_results();\n}\n\n/**\n * Get the blogs a user belongs to.\n *\n * @since 3.0.0\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param int  $user_id User ID\n * @param bool $all     Whether to retrieve all blogs, or only blogs that are not\n *                      marked as deleted, archived, or spam.\n * @return array A list of the user's blogs. An empty array if the user doesn't exist\n *               or belongs to no blogs.\n */\nfunction get_blogs_of_user( $user_id, $all = false ) {\n\tglobal $wpdb;\n\n\t$user_id = (int) $user_id;\n\n\t// Logged out users can't have blogs\n\tif ( empty( $user_id ) )\n\t\treturn array();\n\n\t$keys = get_user_meta( $user_id );\n\tif ( empty( $keys ) )\n\t\treturn array();\n\n\tif ( ! is_multisite() ) {\n\t\t$blog_id = get_current_blog_id();\n\t\t$blogs = array( $blog_id => new stdClass );\n\t\t$blogs[ $blog_id ]->userblog_id = $blog_id;\n\t\t$blogs[ $blog_id ]->blogname = get_option('blogname');\n\t\t$blogs[ $blog_id ]->domain = '';\n\t\t$blogs[ $blog_id ]->path = '';\n\t\t$blogs[ $blog_id ]->site_id = 1;\n\t\t$blogs[ $blog_id ]->siteurl = get_option('siteurl');\n\t\t$blogs[ $blog_id ]->archived = 0;\n\t\t$blogs[ $blog_id ]->spam = 0;\n\t\t$blogs[ $blog_id ]->deleted = 0;\n\t\treturn $blogs;\n\t}\n\n\t$blogs = array();\n\n\tif ( isset( $keys[ $wpdb->base_prefix . 'capabilities' ] ) && defined( 'MULTISITE' ) ) {\n\t\t$blog = get_blog_details( 1 );\n\t\tif ( $blog && isset( $blog->domain ) && ( $all || ( ! $blog->archived && ! $blog->spam && ! $blog->deleted ) ) ) {\n\t\t\t$blogs[ 1 ] = (object) array(\n\t\t\t\t'userblog_id' => 1,\n\t\t\t\t'blogname'    => $blog->blogname,\n\t\t\t\t'domain'      => $blog->domain,\n\t\t\t\t'path'        => $blog->path,\n\t\t\t\t'site_id'     => $blog->site_id,\n\t\t\t\t'siteurl'     => $blog->siteurl,\n\t\t\t\t'archived'    => $blog->archived,\n\t\t\t\t'mature'      => $blog->mature,\n\t\t\t\t'spam'        => $blog->spam,\n\t\t\t\t'deleted'     => $blog->deleted,\n\t\t\t);\n\t\t}\n\t\tunset( $keys[ $wpdb->base_prefix . 'capabilities' ] );\n\t}\n\n\t$keys = array_keys( $keys );\n\n\tforeach ( $keys as $key ) {\n\t\tif ( 'capabilities' !== substr( $key, -12 ) )\n\t\t\tcontinue;\n\t\tif ( $wpdb->base_prefix && 0 !== strpos( $key, $wpdb->base_prefix ) )\n\t\t\tcontinue;\n\t\t$blog_id = str_replace( array( $wpdb->base_prefix, '_capabilities' ), '', $key );\n\t\tif ( ! is_numeric( $blog_id ) )\n\t\t\tcontinue;\n\n\t\t$blog_id = (int) $blog_id;\n\t\t$blog = get_blog_details( $blog_id );\n\t\tif ( $blog && isset( $blog->domain ) && ( $all || ( ! $blog->archived && ! $blog->spam && ! $blog->deleted ) ) ) {\n\t\t\t$blogs[ $blog_id ] = (object) array(\n\t\t\t\t'userblog_id' => $blog_id,\n\t\t\t\t'blogname'    => $blog->blogname,\n\t\t\t\t'domain'      => $blog->domain,\n\t\t\t\t'path'        => $blog->path,\n\t\t\t\t'site_id'     => $blog->site_id,\n\t\t\t\t'siteurl'     => $blog->siteurl,\n\t\t\t\t'archived'    => $blog->archived,\n\t\t\t\t'mature'      => $blog->mature,\n\t\t\t\t'spam'        => $blog->spam,\n\t\t\t\t'deleted'     => $blog->deleted,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Filter the list of blogs a user belongs to.\n\t *\n\t * @since MU\n\t *\n\t * @param array $blogs   An array of blog objects belonging to the user.\n\t * @param int   $user_id User ID.\n\t * @param bool  $all     Whether the returned blogs array should contain all blogs, including\n\t *                       those marked 'deleted', 'archived', or 'spam'. Default false.\n\t */\n\treturn apply_filters( 'get_blogs_of_user', $blogs, $user_id, $all );\n}\n\n/**\n * Find out whether a user is a member of a given blog.\n *\n * @since MU 1.1\n *\n * @param int $user_id Optional. The unique ID of the user. Defaults to the current user.\n * @param int $blog_id Optional. ID of the blog to check. Defaults to the current site.\n * @return bool\n */\nfunction is_user_member_of_blog( $user_id = 0, $blog_id = 0 ) {\n\tglobal $wpdb;\n\n\t$user_id = (int) $user_id;\n\t$blog_id = (int) $blog_id;\n\n\tif ( empty( $user_id ) ) {\n\t\t$user_id = get_current_user_id();\n\t}\n\n\t// Technically not needed, but does save calls to get_blog_details and get_user_meta\n\t// in the event that the function is called when a user isn't logged in\n\tif ( empty( $user_id ) ) {\n\t\treturn false;\n\t} else {\n\t\t$user = get_userdata( $user_id );\n\t\tif ( ! $user instanceof WP_User ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tif ( ! is_multisite() ) {\n\t\treturn true;\n\t}\n\n\tif ( empty( $blog_id ) ) {\n\t\t$blog_id = get_current_blog_id();\n\t}\n\n\t$blog = get_blog_details( $blog_id );\n\n\tif ( ! $blog || ! isset( $blog->domain ) || $blog->archived || $blog->spam || $blog->deleted ) {\n\t\treturn false;\n\t}\n\n\t$keys = get_user_meta( $user_id );\n\tif ( empty( $keys ) ) {\n\t\treturn false;\n\t}\n\n\t// no underscore before capabilities in $base_capabilities_key\n\t$base_capabilities_key = $wpdb->base_prefix . 'capabilities';\n\t$site_capabilities_key = $wpdb->base_prefix . $blog_id . '_capabilities';\n\n\tif ( isset( $keys[ $base_capabilities_key ] ) && $blog_id == 1 ) {\n\t\treturn true;\n\t}\n\n\tif ( isset( $keys[ $site_capabilities_key ] ) ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Add meta data field to a user.\n *\n * Post meta data is called \"Custom Fields\" on the Administration Screens.\n *\n * @since 3.0.0\n * @link https://codex.wordpress.org/Function_Reference/add_user_meta\n *\n * @param int    $user_id    User ID.\n * @param string $meta_key   Metadata name.\n * @param mixed  $meta_value Metadata value.\n * @param bool   $unique     Optional, default is false. Whether the same key should not be added.\n * @return int|false Meta ID on success, false on failure.\n */\nfunction add_user_meta($user_id, $meta_key, $meta_value, $unique = false) {\n\treturn add_metadata('user', $user_id, $meta_key, $meta_value, $unique);\n}\n\n/**\n * Remove metadata matching criteria from a user.\n *\n * You can match based on the key, or key and value. Removing based on key and\n * value, will keep from removing duplicate metadata with the same key. It also\n * allows removing all metadata matching key, if needed.\n *\n * @since 3.0.0\n * @link https://codex.wordpress.org/Function_Reference/delete_user_meta\n *\n * @param int    $user_id    User ID\n * @param string $meta_key   Metadata name.\n * @param mixed  $meta_value Optional. Metadata value.\n * @return bool True on success, false on failure.\n */\nfunction delete_user_meta($user_id, $meta_key, $meta_value = '') {\n\treturn delete_metadata('user', $user_id, $meta_key, $meta_value);\n}\n\n/**\n * Retrieve user meta field for a user.\n *\n * @since 3.0.0\n * @link https://codex.wordpress.org/Function_Reference/get_user_meta\n *\n * @param int    $user_id User ID.\n * @param string $key     Optional. The meta key to retrieve. By default, returns data for all keys.\n * @param bool   $single  Whether to return a single value.\n * @return mixed Will be an array if $single is false. Will be value of meta data field if $single is true.\n */\nfunction get_user_meta($user_id, $key = '', $single = false) {\n\treturn get_metadata('user', $user_id, $key, $single);\n}\n\n/**\n * Update user meta field based on user ID.\n *\n * Use the $prev_value parameter to differentiate between meta fields with the\n * same key and user ID.\n *\n * If the meta field for the user does not exist, it will be added.\n *\n * @since 3.0.0\n * @link https://codex.wordpress.org/Function_Reference/update_user_meta\n *\n * @param int    $user_id    User ID.\n * @param string $meta_key   Metadata key.\n * @param mixed  $meta_value Metadata value.\n * @param mixed  $prev_value Optional. Previous value to check before removing.\n * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure.\n */\nfunction update_user_meta($user_id, $meta_key, $meta_value, $prev_value = '') {\n\treturn update_metadata('user', $user_id, $meta_key, $meta_value, $prev_value);\n}\n\n/**\n * Count number of users who have each of the user roles.\n *\n * Assumes there are neither duplicated nor orphaned capabilities meta_values.\n * Assumes role names are unique phrases. Same assumption made by WP_User_Query::prepare_query()\n * Using $strategy = 'time' this is CPU-intensive and should handle around 10^7 users.\n * Using $strategy = 'memory' this is memory-intensive and should handle around 10^5 users, but see WP Bug #12257.\n *\n * @since 3.0.0\n * @since 4.4.0 The number of users with no role is now included in the `none` element.\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param string $strategy 'time' or 'memory'\n * @return array Includes a grand total and an array of counts indexed by role strings.\n */\nfunction count_users($strategy = 'time') {\n\tglobal $wpdb;\n\n\t// Initialize\n\t$id = get_current_blog_id();\n\t$blog_prefix = $wpdb->get_blog_prefix($id);\n\t$result = array();\n\n\tif ( 'time' == $strategy ) {\n\t\t$avail_roles = wp_roles()->get_names();\n\n\t\t// Build a CPU-intensive query that will return concise information.\n\t\t$select_count = array();\n\t\tforeach ( $avail_roles as $this_role => $name ) {\n\t\t\t$select_count[] = $wpdb->prepare( \"COUNT(NULLIF(`meta_value` LIKE %s, false))\", '%' . $wpdb->esc_like( '\"' . $this_role . '\"' ) . '%');\n\t\t}\n\t\t$select_count[] = \"COUNT(NULLIF(`meta_value` = 'a:0:{}', false))\";\n\t\t$select_count = implode(', ', $select_count);\n\n\t\t// Add the meta_value index to the selection list, then run the query.\n\t\t$row = $wpdb->get_row( \"SELECT $select_count, COUNT(*) FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'\", ARRAY_N );\n\n\t\t// Run the previous loop again to associate results with role names.\n\t\t$col = 0;\n\t\t$role_counts = array();\n\t\tforeach ( $avail_roles as $this_role => $name ) {\n\t\t\t$count = (int) $row[$col++];\n\t\t\tif ($count > 0) {\n\t\t\t\t$role_counts[$this_role] = $count;\n\t\t\t}\n\t\t}\n\n\t\t$role_counts['none'] = (int) $row[$col++];\n\n\t\t// Get the meta_value index from the end of the result set.\n\t\t$total_users = (int) $row[$col];\n\n\t\t$result['total_users'] = $total_users;\n\t\t$result['avail_roles'] =& $role_counts;\n\t} else {\n\t\t$avail_roles = array(\n\t\t\t'none' => 0,\n\t\t);\n\n\t\t$users_of_blog = $wpdb->get_col( \"SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = '{$blog_prefix}capabilities'\" );\n\n\t\tforeach ( $users_of_blog as $caps_meta ) {\n\t\t\t$b_roles = maybe_unserialize($caps_meta);\n\t\t\tif ( ! is_array( $b_roles ) )\n\t\t\t\tcontinue;\n\t\t\tif ( empty( $b_roles ) ) {\n\t\t\t\t$avail_roles['none']++;\n\t\t\t}\n\t\t\tforeach ( $b_roles as $b_role => $val ) {\n\t\t\t\tif ( isset($avail_roles[$b_role]) ) {\n\t\t\t\t\t$avail_roles[$b_role]++;\n\t\t\t\t} else {\n\t\t\t\t\t$avail_roles[$b_role] = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t$result['total_users'] = count( $users_of_blog );\n\t\t$result['avail_roles'] =& $avail_roles;\n\t}\n\n\tif ( is_multisite() ) {\n\t\t$result['avail_roles']['none'] = 0;\n\t}\n\n\treturn $result;\n}\n\n//\n// Private helper functions\n//\n\n/**\n * Set up global user vars.\n *\n * Used by wp_set_current_user() for back compat. Might be deprecated in the future.\n *\n * @since 2.0.4\n *\n * @global string $user_login    The user username for logging in\n * @global object $userdata      User data.\n * @global int    $user_level    The level of the user\n * @global int    $user_ID       The ID of the user\n * @global string $user_email    The email address of the user\n * @global string $user_url      The url in the user's profile\n * @global string $user_identity The display name of the user\n *\n * @param int $for_user_id Optional. User ID to set up global data.\n */\nfunction setup_userdata($for_user_id = '') {\n\tglobal $user_login, $userdata, $user_level, $user_ID, $user_email, $user_url, $user_identity;\n\n\tif ( '' == $for_user_id )\n\t\t$for_user_id = get_current_user_id();\n\t$user = get_userdata( $for_user_id );\n\n\tif ( ! $user ) {\n\t\t$user_ID = 0;\n\t\t$user_level = 0;\n\t\t$userdata = null;\n\t\t$user_login = $user_email = $user_url = $user_identity = '';\n\t\treturn;\n\t}\n\n\t$user_ID    = (int) $user->ID;\n\t$user_level = (int) $user->user_level;\n\t$userdata   = $user;\n\t$user_login = $user->user_login;\n\t$user_email = $user->user_email;\n\t$user_url   = $user->user_url;\n\t$user_identity = $user->display_name;\n}\n\n/**\n * Create dropdown HTML content of users.\n *\n * The content can either be displayed, which it is by default or retrieved by\n * setting the 'echo' argument. The 'include' and 'exclude' arguments do not\n * need to be used; all users will be displayed in that case. Only one can be\n * used, either 'include' or 'exclude', but not both.\n *\n * The available arguments are as follows:\n *\n * @since 2.3.0\n *\n * @global int  $blog_id\n *\n * @param array|string $args {\n *     Optional. Array or string of arguments to generate a drop-down of users.\n *     {@see WP_User_Query::prepare_query() for additional available arguments.\n *\n *     @type string       $show_option_all         Text to show as the drop-down default (all).\n *                                                 Default empty.\n *     @type string       $show_option_none        Text to show as the drop-down default when no\n *                                                 users were found. Default empty.\n *     @type int|string   $option_none_value       Value to use for $show_option_non when no users\n *                                                 were found. Default -1.\n *     @type string       $hide_if_only_one_author Whether to skip generating the drop-down\n *                                                 if only one user was found. Default empty.\n *     @type string       $orderby                 Field to order found users by. Accepts user fields.\n *                                                 Default 'display_name'.\n *     @type string       $order                   Whether to order users in ascending or descending\n *                                                 order. Accepts 'ASC' (ascending) or 'DESC' (descending).\n *                                                 Default 'ASC'.\n *     @type array|string $include                 Array or comma-separated list of user IDs to include.\n *                                                 Default empty.\n *     @type array|string $exclude                 Array or comma-separated list of user IDs to exclude.\n *                                                 Default empty.\n *     @type bool|int     $multi                   Whether to skip the ID attribute on the 'select' element.\n *                                                 Accepts 1|true or 0|false. Default 0|false.\n *     @type string       $show                    User table column to display. If the selected item is empty\n *                                                 then the 'user_login' will be displayed in parentheses.\n *                                                 Accepts user fields. Default 'display_name'.\n *     @type int|bool     $echo                    Whether to echo or return the drop-down. Accepts 1|true (echo)\n *                                                 or 0|false (return). Default 1|true.\n *     @type int          $selected                Which user ID should be selected. Default 0.\n *     @type bool         $include_selected        Whether to always include the selected user ID in the drop-\n *                                                 down. Default false.\n *     @type string       $name                    Name attribute of select element. Default 'user'.\n *     @type string       $id                      ID attribute of the select element. Default is the value of $name.\n *     @type string       $class                   Class attribute of the select element. Default empty.\n *     @type int          $blog_id                 ID of blog (Multisite only). Default is ID of the current blog.\n *     @type string       $who                     Which type of users to query. Accepts only an empty string or\n *                                                 'authors'. Default empty.\n * }\n * @return string String of HTML content.\n */\nfunction wp_dropdown_users( $args = '' ) {\n\t$defaults = array(\n\t\t'show_option_all' => '', 'show_option_none' => '', 'hide_if_only_one_author' => '',\n\t\t'orderby' => 'display_name', 'order' => 'ASC',\n\t\t'include' => '', 'exclude' => '', 'multi' => 0,\n\t\t'show' => 'display_name', 'echo' => 1,\n\t\t'selected' => 0, 'name' => 'user', 'class' => '', 'id' => '',\n\t\t'blog_id' => $GLOBALS['blog_id'], 'who' => '', 'include_selected' => false,\n\t\t'option_none_value' => -1\n\t);\n\n\t$defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0;\n\n\t$r = wp_parse_args( $args, $defaults );\n\t$show = $r['show'];\n\t$show_option_all = $r['show_option_all'];\n\t$show_option_none = $r['show_option_none'];\n\t$option_none_value = $r['option_none_value'];\n\n\t$query_args = wp_array_slice_assoc( $r, array( 'blog_id', 'include', 'exclude', 'orderby', 'order', 'who' ) );\n\t$query_args['fields'] = array( 'ID', 'user_login', $show );\n\n\t/**\n\t * Filter the query arguments for the user drop-down.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $query_args The query arguments for wp_dropdown_users().\n\t * @param array $r          The default arguments for wp_dropdown_users().\n\t */\n\t$query_args = apply_filters( 'wp_dropdown_users_args', $query_args, $r );\n\n\t$users = get_users( $query_args );\n\n\t$output = '';\n\tif ( ! empty( $users ) && ( empty( $r['hide_if_only_one_author'] ) || count( $users ) > 1 ) ) {\n\t\t$name = esc_attr( $r['name'] );\n\t\tif ( $r['multi'] && ! $r['id'] ) {\n\t\t\t$id = '';\n\t\t} else {\n\t\t\t$id = $r['id'] ? \" id='\" . esc_attr( $r['id'] ) . \"'\" : \" id='$name'\";\n\t\t}\n\t\t$output = \"<select name='{$name}'{$id} class='\" . $r['class'] . \"'>\\n\";\n\n\t\tif ( $show_option_all ) {\n\t\t\t$output .= \"\\t<option value='0'>$show_option_all</option>\\n\";\n\t\t}\n\n\t\tif ( $show_option_none ) {\n\t\t\t$_selected = selected( $option_none_value, $r['selected'], false );\n\t\t\t$output .= \"\\t<option value='\" . esc_attr( $option_none_value ) . \"'$_selected>$show_option_none</option>\\n\";\n\t\t}\n\n\t\t$found_selected = false;\n\t\tforeach ( (array) $users as $user ) {\n\t\t\t$user->ID = (int) $user->ID;\n\t\t\t$_selected = selected( $user->ID, $r['selected'], false );\n\t\t\tif ( $_selected ) {\n\t\t\t\t$found_selected = true;\n\t\t\t}\n\t\t\t$display = ! empty( $user->$show ) ? $user->$show : '('. $user->user_login . ')';\n\t\t\t$output .= \"\\t<option value='$user->ID'$_selected>\" . esc_html( $display ) . \"</option>\\n\";\n\t\t}\n\n\t\tif ( $r['include_selected'] && ! $found_selected && ( $r['selected'] > 0 ) ) {\n\t\t\t$user = get_userdata( $r['selected'] );\n\t\t\t$_selected = selected( $user->ID, $r['selected'], false );\n\t\t\t$display = ! empty( $user->$show ) ? $user->$show : '('. $user->user_login . ')';\n\t\t\t$output .= \"\\t<option value='$user->ID'$_selected>\" . esc_html( $display ) . \"</option>\\n\";\n\t\t}\n\n\t\t$output .= \"</select>\";\n\t}\n\n\t/**\n\t * Filter the wp_dropdown_users() HTML output.\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $output HTML output generated by wp_dropdown_users().\n\t */\n\t$html = apply_filters( 'wp_dropdown_users', $output );\n\n\tif ( $r['echo'] ) {\n\t\techo $html;\n\t}\n\treturn $html;\n}\n\n/**\n * Sanitize user field based on context.\n *\n * Possible context values are:  'raw', 'edit', 'db', 'display', 'attribute' and 'js'. The\n * 'display' context is used by default. 'attribute' and 'js' contexts are treated like 'display'\n * when calling filters.\n *\n * @since 2.3.0\n *\n * @param string $field   The user Object field name.\n * @param mixed  $value   The user Object value.\n * @param int    $user_id User ID.\n * @param string $context How to sanitize user fields. Looks for 'raw', 'edit', 'db', 'display',\n *                        'attribute' and 'js'.\n * @return mixed Sanitized value.\n */\nfunction sanitize_user_field($field, $value, $user_id, $context) {\n\t$int_fields = array('ID');\n\tif ( in_array($field, $int_fields) )\n\t\t$value = (int) $value;\n\n\tif ( 'raw' == $context )\n\t\treturn $value;\n\n\tif ( !is_string($value) && !is_numeric($value) )\n\t\treturn $value;\n\n\t$prefixed = false !== strpos( $field, 'user_' );\n\n\tif ( 'edit' == $context ) {\n\t\tif ( $prefixed ) {\n\n\t\t\t/** This filter is documented in wp-includes/post.php */\n\t\t\t$value = apply_filters( \"edit_{$field}\", $value, $user_id );\n\t\t} else {\n\n\t\t\t/**\n\t\t\t * Filter a user field value in the 'edit' context.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field`, refers to the prefixed user\n\t\t\t * field being filtered, such as 'user_login', 'user_email', 'first_name', etc.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param mixed $value   Value of the prefixed user field.\n\t\t\t * @param int   $user_id User ID.\n\t\t\t */\n\t\t\t$value = apply_filters( \"edit_user_{$field}\", $value, $user_id );\n\t\t}\n\n\t\tif ( 'description' == $field )\n\t\t\t$value = esc_html( $value ); // textarea_escaped?\n\t\telse\n\t\t\t$value = esc_attr($value);\n\t} elseif ( 'db' == $context ) {\n\t\tif ( $prefixed ) {\n\t\t\t/** This filter is documented in wp-includes/post.php */\n\t\t\t$value = apply_filters( \"pre_{$field}\", $value );\n\t\t} else {\n\n\t\t\t/**\n\t\t\t * Filter the value of a user field in the 'db' context.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field`, refers to the prefixed user\n\t\t\t * field being filtered, such as 'user_login', 'user_email', 'first_name', etc.\n \t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param mixed $value Value of the prefixed user field.\n\t\t\t */\n\t\t\t$value = apply_filters( \"pre_user_{$field}\", $value );\n\t\t}\n\t} else {\n\t\t// Use display filters by default.\n\t\tif ( $prefixed ) {\n\n\t\t\t/** This filter is documented in wp-includes/post.php */\n\t\t\t$value = apply_filters( $field, $value, $user_id, $context );\n\t\t} else {\n\n\t\t\t/**\n\t\t\t * Filter the value of a user field in a standard context.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$field`, refers to the prefixed user\n\t\t\t * field being filtered, such as 'user_login', 'user_email', 'first_name', etc.\n\t\t\t *\n\t\t\t * @since 2.9.0\n\t\t\t *\n\t\t\t * @param mixed  $value   The user object value to sanitize.\n\t\t\t * @param int    $user_id User ID.\n\t\t\t * @param string $context The context to filter within.\n\t\t\t */\n\t\t\t$value = apply_filters( \"user_{$field}\", $value, $user_id, $context );\n\t\t}\n\t}\n\n\tif ( 'user_url' == $field )\n\t\t$value = esc_url($value);\n\n\tif ( 'attribute' == $context ) {\n\t\t$value = esc_attr( $value );\n\t} elseif ( 'js' == $context ) {\n\t\t$value = esc_js( $value );\n\t}\n\treturn $value;\n}\n\n/**\n * Update all user caches\n *\n * @since 3.0.0\n *\n * @param object|WP_User $user User object to be cached\n * @return bool|null Returns false on failure.\n */\nfunction update_user_caches( $user ) {\n\tif ( $user instanceof WP_User ) {\n\t\tif ( ! $user->exists() ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$user = $user->data;\n\t}\n\n\twp_cache_add($user->ID, $user, 'users');\n\twp_cache_add($user->user_login, $user->ID, 'userlogins');\n\twp_cache_add($user->user_email, $user->ID, 'useremail');\n\twp_cache_add($user->user_nicename, $user->ID, 'userslugs');\n}\n\n/**\n * Clean all user caches\n *\n * @since 3.0.0\n * @since 4.4.0 'clean_user_cache' action was added.\n *\n * @param WP_User|int $user User object or ID to be cleaned from the cache\n */\nfunction clean_user_cache( $user ) {\n\tif ( is_numeric( $user ) )\n\t\t$user = new WP_User( $user );\n\n\tif ( ! $user->exists() )\n\t\treturn;\n\n\twp_cache_delete( $user->ID, 'users' );\n\twp_cache_delete( $user->user_login, 'userlogins' );\n\twp_cache_delete( $user->user_email, 'useremail' );\n\twp_cache_delete( $user->user_nicename, 'userslugs' );\n\n\t/**\n\t * Fires immediately after the given user's cache is cleaned.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param int     $user_id User ID.\n\t * @param WP_User $user    User object.\n\t */\n\tdo_action( 'clean_user_cache', $user->ID, $user );\n}\n\n/**\n * Checks whether the given username exists.\n *\n * @since 2.0.0\n *\n * @param string $username Username.\n * @return int|false The user's ID on success, and false on failure.\n */\nfunction username_exists( $username ) {\n\tif ( $user = get_user_by( 'login', $username ) ) {\n\t\treturn $user->ID;\n\t}\n\treturn false;\n}\n\n/**\n * Checks whether the given email exists.\n *\n * @since 2.1.0\n *\n * @param string $email Email.\n * @return int|false The user's ID on success, and false on failure.\n */\nfunction email_exists( $email ) {\n\tif ( $user = get_user_by( 'email', $email) ) {\n\t\treturn $user->ID;\n\t}\n\treturn false;\n}\n\n/**\n * Checks whether a username is valid.\n *\n * @since 2.0.1\n * @since 4.4.0 Empty sanitized usernames are now considered invalid\n *\n * @param string $username Username.\n * @return bool Whether username given is valid\n */\nfunction validate_username( $username ) {\n\t$sanitized = sanitize_user( $username, true );\n\t$valid = ( $sanitized == $username && ! empty( $sanitized ) );\n\n\t/**\n\t * Filter whether the provided username is valid or not.\n\t *\n\t * @since 2.0.1\n\t *\n\t * @param bool   $valid    Whether given username is valid.\n\t * @param string $username Username to check.\n\t */\n\treturn apply_filters( 'validate_username', $valid, $username );\n}\n\n/**\n * Insert a user into the database.\n *\n * Most of the `$userdata` array fields have filters associated with the values. Exceptions are\n * 'ID', 'rich_editing', 'comment_shortcuts', 'admin_color', 'use_ssl',\n * 'user_registered', and 'role'. The filters have the prefix 'pre_user_' followed by the field\n * name. An example using 'description' would have the filter called, 'pre_user_description' that\n * can be hooked into.\n *\n * @since 2.0.0\n * @since 3.6.0 The `aim`, `jabber`, and `yim` fields were removed as default user contact\n *              methods for new installs. See wp_get_user_contact_methods().\n *\n * @global wpdb $wpdb WordPress database abstraction object.\n *\n * @param array|object|WP_User $userdata {\n *     An array, object, or WP_User object of user data arguments.\n *\n *     @type int         $ID                   User ID. If supplied, the user will be updated.\n *     @type string      $user_pass            The plain-text user password.\n *     @type string      $user_login           The user's login username.\n *     @type string      $user_nicename        The URL-friendly user name.\n *     @type string      $user_url             The user URL.\n *     @type string      $user_email           The user email address.\n *     @type string      $display_name         The user's display name.\n *                                             Default is the the user's username.\n *     @type string      $nickname             The user's nickname.\n *                                             Default is the the user's username.\n *     @type string      $first_name           The user's first name. For new users, will be used\n *                                             to build the first part of the user's display name\n *                                             if `$display_name` is not specified.\n *     @type string      $last_name            The user's last name. For new users, will be used\n *                                             to build the second part of the user's display name\n *                                             if `$display_name` is not specified.\n *     @type string      $description          The user's biographical description.\n *     @type string|bool $rich_editing         Whether to enable the rich-editor for the user.\n *                                             False if not empty.\n *     @type string|bool $comment_shortcuts    Whether to enable comment moderation keyboard\n *                                             shortcuts for the user. Default false.\n *     @type string      $admin_color          Admin color scheme for the user. Default 'fresh'.\n *     @type bool        $use_ssl              Whether the user should always access the admin over\n *                                             https. Default false.\n *     @type string      $user_registered      Date the user registered. Format is 'Y-m-d H:i:s'.\n *     @type string|bool $show_admin_bar_front Whether to display the Admin Bar for the user on the\n *                                             site's frontend. Default true.\n *     @type string      $role                 User's role.\n * }\n * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not\n *                      be created.\n */\nfunction wp_insert_user( $userdata ) {\n\tglobal $wpdb;\n\n\tif ( $userdata instanceof stdClass ) {\n\t\t$userdata = get_object_vars( $userdata );\n\t} elseif ( $userdata instanceof WP_User ) {\n\t\t$userdata = $userdata->to_array();\n\t}\n\n\t// Are we updating or creating?\n\tif ( ! empty( $userdata['ID'] ) ) {\n\t\t$ID = (int) $userdata['ID'];\n\t\t$update = true;\n\t\t$old_user_data = get_userdata( $ID );\n\n\t\tif ( ! $old_user_data ) {\n\t\t\treturn new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) );\n\t\t}\n\n\t\t// hashed in wp_update_user(), plaintext if called directly\n\t\t$user_pass = ! empty( $userdata['user_pass'] ) ? $userdata['user_pass'] : $old_user_data->user_pass;\n\t} else {\n\t\t$update = false;\n\t\t// Hash the password\n\t\t$user_pass = wp_hash_password( $userdata['user_pass'] );\n\t}\n\n\t$sanitized_user_login = sanitize_user( $userdata['user_login'], true );\n\n\t/**\n\t * Filter a username after it has been sanitized.\n\t *\n\t * This filter is called before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $sanitized_user_login Username after it has been sanitized.\n\t */\n\t$pre_user_login = apply_filters( 'pre_user_login', $sanitized_user_login );\n\n\t//Remove any non-printable chars from the login string to see if we have ended up with an empty username\n\t$user_login = trim( $pre_user_login );\n\n\t// user_login must be between 0 and 60 characters.\n\tif ( empty( $user_login ) ) {\n\t\treturn new WP_Error('empty_user_login', __('Cannot create a user with an empty login name.') );\n\t} elseif ( mb_strlen( $user_login ) > 60 ) {\n\t\treturn new WP_Error( 'user_login_too_long', __( 'Username may not be longer than 60 characters.' ) );\n\t}\n\n\tif ( ! $update && username_exists( $user_login ) ) {\n\t\treturn new WP_Error( 'existing_user_login', __( 'Sorry, that username already exists!' ) );\n\t}\n\n\t/**\n\t * Filter the list of blacklisted usernames.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $usernames Array of blacklisted usernames.\n\t */\n\t$illegal_logins = (array) apply_filters( 'illegal_user_logins', array() );\n\n\tif ( in_array( strtolower( $user_login ), array_map( 'strtolower', $illegal_logins ) ) ) {\n\t\treturn new WP_Error( 'invalid_username', __( 'Sorry, that username is not allowed.' ) );\n\t}\n\n\t/*\n\t * If a nicename is provided, remove unsafe user characters before using it.\n\t * Otherwise build a nicename from the user_login.\n\t */\n\tif ( ! empty( $userdata['user_nicename'] ) ) {\n\t\t$user_nicename = sanitize_user( $userdata['user_nicename'], true );\n\t\tif ( mb_strlen( $user_nicename ) > 50 ) {\n\t\t\treturn new WP_Error( 'user_nicename_too_long', __( 'Nicename may not be longer than 50 characters.' ) );\n\t\t}\n\t} else {\n\t\t$user_nicename = mb_substr( $user_login, 0, 50 );\n\t}\n\n\t$user_nicename = sanitize_title( $user_nicename );\n\n\t// Store values to save in user meta.\n\t$meta = array();\n\n\t/**\n\t * Filter a user's nicename before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $user_nicename The user's nicename.\n\t */\n\t$user_nicename = apply_filters( 'pre_user_nicename', $user_nicename );\n\n\t$raw_user_url = empty( $userdata['user_url'] ) ? '' : $userdata['user_url'];\n\n\t/**\n\t * Filter a user's URL before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $raw_user_url The user's URL.\n\t */\n\t$user_url = apply_filters( 'pre_user_url', $raw_user_url );\n\n\t$raw_user_email = empty( $userdata['user_email'] ) ? '' : $userdata['user_email'];\n\n\t/**\n\t * Filter a user's email before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $raw_user_email The user's email.\n\t */\n\t$user_email = apply_filters( 'pre_user_email', $raw_user_email );\n\n\t/*\n\t * If there is no update, just check for `email_exists`. If there is an update,\n\t * check if current email and new email are the same, or not, and check `email_exists`\n\t * accordingly.\n\t */\n\tif ( ( ! $update || ( ! empty( $old_user_data ) && 0 !== strcasecmp( $user_email, $old_user_data->user_email ) ) )\n\t\t&& ! defined( 'WP_IMPORTING' )\n\t\t&& email_exists( $user_email )\n\t) {\n\t\treturn new WP_Error( 'existing_user_email', __( 'Sorry, that email address is already used!' ) );\n\t}\n\t$nickname = empty( $userdata['nickname'] ) ? $user_login : $userdata['nickname'];\n\n\t/**\n\t * Filter a user's nickname before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $nickname The user's nickname.\n\t */\n\t$meta['nickname'] = apply_filters( 'pre_user_nickname', $nickname );\n\n\t$first_name = empty( $userdata['first_name'] ) ? '' : $userdata['first_name'];\n\n\t/**\n\t * Filter a user's first name before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $first_name The user's first name.\n\t */\n\t$meta['first_name'] = apply_filters( 'pre_user_first_name', $first_name );\n\n\t$last_name = empty( $userdata['last_name'] ) ? '' : $userdata['last_name'];\n\n\t/**\n\t * Filter a user's last name before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $last_name The user's last name.\n\t */\n\t$meta['last_name'] = apply_filters( 'pre_user_last_name', $last_name );\n\n\tif ( empty( $userdata['display_name'] ) ) {\n\t\tif ( $update ) {\n\t\t\t$display_name = $user_login;\n\t\t} elseif ( $meta['first_name'] && $meta['last_name'] ) {\n\t\t\t/* translators: 1: first name, 2: last name */\n\t\t\t$display_name = sprintf( _x( '%1$s %2$s', 'Display name based on first name and last name' ), $meta['first_name'], $meta['last_name'] );\n\t\t} elseif ( $meta['first_name'] ) {\n\t\t\t$display_name = $meta['first_name'];\n\t\t} elseif ( $meta['last_name'] ) {\n\t\t\t$display_name = $meta['last_name'];\n\t\t} else {\n\t\t\t$display_name = $user_login;\n\t\t}\n\t} else {\n\t\t$display_name = $userdata['display_name'];\n\t}\n\n\t/**\n\t * Filter a user's display name before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $display_name The user's display name.\n\t */\n\t$display_name = apply_filters( 'pre_user_display_name', $display_name );\n\n\t$description = empty( $userdata['description'] ) ? '' : $userdata['description'];\n\n\t/**\n\t * Filter a user's description before the user is created or updated.\n\t *\n\t * @since 2.0.3\n\t *\n\t * @param string $description The user's description.\n\t */\n\t$meta['description'] = apply_filters( 'pre_user_description', $description );\n\n\t$meta['rich_editing'] = empty( $userdata['rich_editing'] ) ? 'true' : $userdata['rich_editing'];\n\n\t$meta['comment_shortcuts'] = empty( $userdata['comment_shortcuts'] ) || 'false' === $userdata['comment_shortcuts'] ? 'false' : 'true';\n\n\t$admin_color = empty( $userdata['admin_color'] ) ? 'fresh' : $userdata['admin_color'];\n\t$meta['admin_color'] = preg_replace( '|[^a-z0-9 _.\\-@]|i', '', $admin_color );\n\n\t$meta['use_ssl'] = empty( $userdata['use_ssl'] ) ? 0 : $userdata['use_ssl'];\n\n\t$user_registered = empty( $userdata['user_registered'] ) ? gmdate( 'Y-m-d H:i:s' ) : $userdata['user_registered'];\n\n\t$meta['show_admin_bar_front'] = empty( $userdata['show_admin_bar_front'] ) ? 'true' : $userdata['show_admin_bar_front'];\n\n\t$user_nicename_check = $wpdb->get_var( $wpdb->prepare(\"SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1\" , $user_nicename, $user_login));\n\n\tif ( $user_nicename_check ) {\n\t\t$suffix = 2;\n\t\twhile ($user_nicename_check) {\n\t\t\t// user_nicename allows 50 chars. Subtract one for a hyphen, plus the length of the suffix.\n\t\t\t$base_length = 49 - mb_strlen( $suffix );\n\t\t\t$alt_user_nicename = mb_substr( $user_nicename, 0, $base_length ) . \"-$suffix\";\n\t\t\t$user_nicename_check = $wpdb->get_var( $wpdb->prepare(\"SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1\" , $alt_user_nicename, $user_login));\n\t\t\t$suffix++;\n\t\t}\n\t\t$user_nicename = $alt_user_nicename;\n\t}\n\n\t$compacted = compact( 'user_pass', 'user_email', 'user_url', 'user_nicename', 'display_name', 'user_registered' );\n\t$data = wp_unslash( $compacted );\n\n\tif ( $update ) {\n\t\tif ( $user_email !== $old_user_data->user_email ) {\n\t\t\t$data['user_activation_key'] = '';\n\t\t}\n\t\t$wpdb->update( $wpdb->users, $data, compact( 'ID' ) );\n\t\t$user_id = (int) $ID;\n\t} else {\n\t\t$wpdb->insert( $wpdb->users, $data + compact( 'user_login' ) );\n\t\t$user_id = (int) $wpdb->insert_id;\n\t}\n\n\t$user = new WP_User( $user_id );\n\n\t/**\n \t * Filter a user's meta values and keys before the user is created or updated.\n \t *\n \t * Does not include contact methods. These are added using `wp_get_user_contact_methods( $user )`.\n \t *\n \t * @since 4.4.0\n \t *\n \t * @param array $meta {\n \t *     Default meta values and keys for the user.\n \t *\n \t *     @type string   $nickname             The user's nickname. Default is the the user's username.\n\t *     @type string   $first_name           The user's first name.\n\t *     @type string   $last_name            The user's last name.\n\t *     @type string   $description          The user's description.\n\t *     @type bool     $rich_editing         Whether to enable the rich-editor for the user. False if not empty.\n\t *     @type bool     $comment_shortcuts    Whether to enable keyboard shortcuts for the user. Default false.\n\t *     @type string   $admin_color          The color scheme for a user's admin screen. Default 'fresh'.\n\t *     @type int|bool $use_ssl              Whether to force SSL on the user's admin area. 0|false if SSL is\n\t *                                          not forced.\n\t *     @type bool     $show_admin_bar_front Whether to show the admin bar on the front end for the user.\n\t *                                          Default true.\n \t * }\n\t * @param WP_User $user   User object.\n\t * @param bool    $update Whether the user is being updated rather than created.\n \t */\n\t$meta = apply_filters( 'insert_user_meta', $meta, $user, $update );\n\n\t// Update user meta.\n\tforeach ( $meta as $key => $value ) {\n\t\tupdate_user_meta( $user_id, $key, $value );\n\t}\n\n\tforeach ( wp_get_user_contact_methods( $user ) as $key => $value ) {\n\t\tif ( isset( $userdata[ $key ] ) ) {\n\t\t\tupdate_user_meta( $user_id, $key, $userdata[ $key ] );\n\t\t}\n\t}\n\n\tif ( isset( $userdata['role'] ) ) {\n\t\t$user->set_role( $userdata['role'] );\n\t} elseif ( ! $update ) {\n\t\t$user->set_role(get_option('default_role'));\n\t}\n\twp_cache_delete( $user_id, 'users' );\n\twp_cache_delete( $user_login, 'userlogins' );\n\n\tif ( $update ) {\n\t\t/**\n\t\t * Fires immediately after an existing user is updated.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param int    $user_id       User ID.\n\t\t * @param object $old_user_data Object containing user's data prior to update.\n\t\t */\n\t\tdo_action( 'profile_update', $user_id, $old_user_data );\n\t} else {\n\t\t/**\n\t\t * Fires immediately after a new user is registered.\n\t\t *\n\t\t * @since 1.5.0\n\t\t *\n\t\t * @param int $user_id User ID.\n\t\t */\n\t\tdo_action( 'user_register', $user_id );\n\t}\n\n\treturn $user_id;\n}\n\n/**\n * Update a user in the database.\n *\n * It is possible to update a user's password by specifying the 'user_pass'\n * value in the $userdata parameter array.\n *\n * If current user's password is being updated, then the cookies will be\n * cleared.\n *\n * @since 2.0.0\n *\n * @see wp_insert_user() For what fields can be set in $userdata.\n *\n * @param mixed $userdata An array of user data or a user object of type stdClass or WP_User.\n * @return int|WP_Error The updated user's ID or a WP_Error object if the user could not be updated.\n */\nfunction wp_update_user($userdata) {\n\tif ( $userdata instanceof stdClass ) {\n\t\t$userdata = get_object_vars( $userdata );\n\t} elseif ( $userdata instanceof WP_User ) {\n\t\t$userdata = $userdata->to_array();\n\t}\n\n\t$ID = isset( $userdata['ID'] ) ? (int) $userdata['ID'] : 0;\n\tif ( ! $ID ) {\n\t\treturn new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) );\n\t}\n\n\t// First, get all of the original fields\n\t$user_obj = get_userdata( $ID );\n\tif ( ! $user_obj ) {\n\t\treturn new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) );\n\t}\n\n\t$user = $user_obj->to_array();\n\n\t// Add additional custom fields\n\tforeach ( _get_additional_user_keys( $user_obj ) as $key ) {\n\t\t$user[ $key ] = get_user_meta( $ID, $key, true );\n\t}\n\n\t// Escape data pulled from DB.\n\t$user = add_magic_quotes( $user );\n\n\tif ( ! empty( $userdata['user_pass'] ) && $userdata['user_pass'] !== $user_obj->user_pass ) {\n\t\t// If password is changing, hash it now\n\t\t$plaintext_pass = $userdata['user_pass'];\n\t\t$userdata['user_pass'] = wp_hash_password( $userdata['user_pass'] );\n\n\t\t/**\n\t\t * Filter whether to send the password change email.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @see wp_insert_user() For `$user` and `$userdata` fields.\n\t\t *\n\t\t * @param bool  $send     Whether to send the email.\n\t\t * @param array $user     The original user array.\n\t\t * @param array $userdata The updated user array.\n\t\t *\n\t\t */\n\t\t$send_password_change_email = apply_filters( 'send_password_change_email', true, $user, $userdata );\n\t}\n\n\tif ( isset( $userdata['user_email'] ) && $user['user_email'] !== $userdata['user_email'] ) {\n\t\t/**\n\t\t * Filter whether to send the email change email.\n\t\t *\n\t\t * @since 4.3.0\n\t\t *\n\t\t * @see wp_insert_user() For `$user` and `$userdata` fields.\n\t\t *\n\t\t * @param bool  $send     Whether to send the email.\n\t\t * @param array $user     The original user array.\n\t\t * @param array $userdata The updated user array.\n\t\t *\n\t\t */\n\t\t$send_email_change_email = apply_filters( 'send_email_change_email', true, $user, $userdata );\n\t}\n\n\twp_cache_delete( $user['user_email'], 'useremail' );\n\n\t// Merge old and new fields with new fields overwriting old ones.\n\t$userdata = array_merge( $user, $userdata );\n\t$user_id = wp_insert_user( $userdata );\n\n\tif ( ! is_wp_error( $user_id ) ) {\n\n\t\t$blog_name = wp_specialchars_decode( get_option( 'blogname' ) );\n\n\t\tif ( ! empty( $send_password_change_email ) ) {\n\n\t\t\t/* translators: Do not translate USERNAME, ADMIN_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */\n\t\t\t$pass_change_text = __( 'Hi ###USERNAME###,\n\nThis notice confirms that your password was changed on ###SITENAME###.\n\nIf you did not change your password, please contact the Site Administrator at\n###ADMIN_EMAIL###\n\nThis email has been sent to ###EMAIL###\n\nRegards,\nAll at ###SITENAME###\n###SITEURL###' );\n\n\t\t\t$pass_change_email = array(\n\t\t\t\t'to'      => $user['user_email'],\n\t\t\t\t'subject' => __( '[%s] Notice of Password Change' ),\n\t\t\t\t'message' => $pass_change_text,\n\t\t\t\t'headers' => '',\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Filter the contents of the email sent when the user's password is changed.\n\t\t\t *\n\t\t\t * @since 4.3.0\n\t\t\t *\n\t\t\t * @param array $pass_change_email {\n\t\t\t *            Used to build wp_mail().\n\t\t\t *            @type string $to      The intended recipients. Add emails in a comma separated string.\n\t\t\t *            @type string $subject The subject of the email.\n\t\t\t *            @type string $message The content of the email.\n\t\t\t *                The following strings have a special meaning and will get replaced dynamically:\n\t\t\t *                - ###USERNAME###    The current user's username.\n\t\t\t *                - ###ADMIN_EMAIL### The admin email in case this was unexpected.\n\t\t\t *                - ###EMAIL###       The old email.\n\t\t\t *                - ###SITENAME###    The name of the site.\n\t\t\t *                - ###SITEURL###     The URL to the site.\n\t\t\t *            @type string $headers Headers. Add headers in a newline (\\r\\n) separated string.\n\t\t\t *        }\n\t\t\t * @param array $user     The original user array.\n\t\t\t * @param array $userdata The updated user array.\n\t\t\t *\n\t\t\t */\n\t\t\t$pass_change_email = apply_filters( 'password_change_email', $pass_change_email, $user, $userdata );\n\n\t\t\t$pass_change_email['message'] = str_replace( '###USERNAME###', $user['user_login'], $pass_change_email['message'] );\n\t\t\t$pass_change_email['message'] = str_replace( '###ADMIN_EMAIL###', get_option( 'admin_email' ), $pass_change_email['message'] );\n\t\t\t$pass_change_email['message'] = str_replace( '###EMAIL###', $user['user_email'], $pass_change_email['message'] );\n\t\t\t$pass_change_email['message'] = str_replace( '###SITENAME###', get_option( 'blogname' ), $pass_change_email['message'] );\n\t\t\t$pass_change_email['message'] = str_replace( '###SITEURL###', home_url(), $pass_change_email['message'] );\n\n\t\t\twp_mail( $pass_change_email['to'], sprintf( $pass_change_email['subject'], $blog_name ), $pass_change_email['message'], $pass_change_email['headers'] );\n\t\t}\n\n\t\tif ( ! empty( $send_email_change_email ) ) {\n\t\t\t/* translators: Do not translate USERNAME, ADMIN_EMAIL, EMAIL, SITENAME, SITEURL: those are placeholders. */\n\t\t\t$email_change_text = __( 'Hi ###USERNAME###,\n\nThis notice confirms that your email was changed on ###SITENAME###.\n\nIf you did not change your email, please contact the Site Administrator at\n###ADMIN_EMAIL###\n\nThis email has been sent to ###EMAIL###\n\nRegards,\nAll at ###SITENAME###\n###SITEURL###' );\n\n\t\t\t$email_change_email = array(\n\t\t\t\t'to'      => $user['user_email'],\n\t\t\t\t'subject' => __( '[%s] Notice of Email Change' ),\n\t\t\t\t'message' => $email_change_text,\n\t\t\t\t'headers' => '',\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Filter the contents of the email sent when the user's email is changed.\n\t\t\t *\n\t\t\t * @since 4.3.0\n\t\t\t *\n\t\t\t * @param array $email_change_email {\n\t\t\t *            Used to build wp_mail().\n\t\t\t *            @type string $to      The intended recipients.\n\t\t\t *            @type string $subject The subject of the email.\n\t\t\t *            @type string $message The content of the email.\n\t\t\t *                The following strings have a special meaning and will get replaced dynamically:\n\t\t\t *                - ###USERNAME###    The current user's username.\n\t\t\t *                - ###ADMIN_EMAIL### The admin email in case this was unexpected.\n\t\t\t *                - ###EMAIL###       The old email.\n\t\t\t *                - ###SITENAME###    The name of the site.\n\t\t\t *                - ###SITEURL###     The URL to the site.\n\t\t\t *            @type string $headers Headers.\n\t\t\t *        }\n\t\t\t * @param array $user The original user array.\n\t\t\t * @param array $userdata The updated user array.\n\t\t\t */\n\t\t\t$email_change_email = apply_filters( 'email_change_email', $email_change_email, $user, $userdata );\n\n\t\t\t$email_change_email['message'] = str_replace( '###USERNAME###', $user['user_login'], $email_change_email['message'] );\n\t\t\t$email_change_email['message'] = str_replace( '###ADMIN_EMAIL###', get_option( 'admin_email' ), $email_change_email['message'] );\n\t\t\t$email_change_email['message'] = str_replace( '###EMAIL###', $user['user_email'], $email_change_email['message'] );\n\t\t\t$email_change_email['message'] = str_replace( '###SITENAME###', get_option( 'blogname' ), $email_change_email['message'] );\n\t\t\t$email_change_email['message'] = str_replace( '###SITEURL###', home_url(), $email_change_email['message'] );\n\n\t\t\twp_mail( $email_change_email['to'], sprintf( $email_change_email['subject'], $blog_name ), $email_change_email['message'], $email_change_email['headers'] );\n\t\t}\n\t}\n\n\t// Update the cookies if the password changed.\n\t$current_user = wp_get_current_user();\n\tif ( $current_user->ID == $ID ) {\n\t\tif ( isset($plaintext_pass) ) {\n\t\t\twp_clear_auth_cookie();\n\n\t\t\t// Here we calculate the expiration length of the current auth cookie and compare it to the default expiration.\n\t\t\t// If it's greater than this, then we know the user checked 'Remember Me' when they logged in.\n\t\t\t$logged_in_cookie    = wp_parse_auth_cookie( '', 'logged_in' );\n\t\t\t/** This filter is documented in wp-includes/pluggable.php */\n\t\t\t$default_cookie_life = apply_filters( 'auth_cookie_expiration', ( 2 * DAY_IN_SECONDS ), $ID, false );\n\t\t\t$remember            = ( ( $logged_in_cookie['expiration'] - time() ) > $default_cookie_life );\n\n\t\t\twp_set_auth_cookie( $ID, $remember );\n\t\t}\n\t}\n\n\treturn $user_id;\n}\n\n/**\n * A simpler way of inserting a user into the database.\n *\n * Creates a new user with just the username, password, and email. For more\n * complex user creation use {@see wp_insert_user()} to specify more information.\n *\n * @since 2.0.0\n * @see wp_insert_user() More complete way to create a new user\n *\n * @param string $username The user's username.\n * @param string $password The user's password.\n * @param string $email    Optional. The user's email. Default empty.\n * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not\n *                      be created.\n */\nfunction wp_create_user($username, $password, $email = '') {\n\t$user_login = wp_slash( $username );\n\t$user_email = wp_slash( $email    );\n\t$user_pass = $password;\n\n\t$userdata = compact('user_login', 'user_email', 'user_pass');\n\treturn wp_insert_user($userdata);\n}\n\n/**\n * Returns a list of meta keys to be (maybe) populated in wp_update_user().\n *\n * The list of keys returned via this function are dependent on the presence\n * of those keys in the user meta data to be set.\n *\n * @since 3.3.0\n * @access private\n *\n * @param WP_User $user WP_User instance.\n * @return array List of user keys to be populated in wp_update_user().\n */\nfunction _get_additional_user_keys( $user ) {\n\t$keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front' );\n\treturn array_merge( $keys, array_keys( wp_get_user_contact_methods( $user ) ) );\n}\n\n/**\n * Set up the user contact methods.\n *\n * Default contact methods were removed in 3.6. A filter dictates contact methods.\n *\n * @since 3.7.0\n *\n * @param WP_User $user Optional. WP_User object.\n * @return array Array of contact methods and their labels.\n */\nfunction wp_get_user_contact_methods( $user = null ) {\n\t$methods = array();\n\tif ( get_site_option( 'initial_db_version' ) < 23588 ) {\n\t\t$methods = array(\n\t\t\t'aim'    => __( 'AIM' ),\n\t\t\t'yim'    => __( 'Yahoo IM' ),\n\t\t\t'jabber' => __( 'Jabber / Google Talk' )\n\t\t);\n\t}\n\n\t/**\n\t * Filter the user contact methods.\n\t *\n\t * @since 2.9.0\n\t *\n\t * @param array   $methods Array of contact methods and their labels.\n \t * @param WP_User $user    WP_User object.\n\t */\n\treturn apply_filters( 'user_contactmethods', $methods, $user );\n}\n\n/**\n * The old private function for setting up user contact methods.\n *\n * @since 2.9.0\n * @access private\n */\nfunction _wp_get_user_contactmethods( $user = null ) {\n\treturn wp_get_user_contact_methods( $user );\n}\n\n/**\n * Gets the text suggesting how to create strong passwords.\n *\n * @since 4.1.0\n *\n * @return string The password hint text.\n */\nfunction wp_get_password_hint() {\n\t$hint = __( 'Hint: The password should be at least twelve characters long. To make it stronger, use upper and lower case letters, numbers, and symbols like ! \" ? $ % ^ &amp; ).' );\n\n\t/**\n\t * Filter the text describing the site's password complexity policy.\n\t *\n\t * @since 4.1.0\n\t *\n\t * @param string $hint The password hint text.\n\t */\n\treturn apply_filters( 'password_hint', $hint );\n}\n\n/**\n * Creates, stores, then returns a password reset key for user.\n *\n * @since 4.4.0\n *\n * @global wpdb         $wpdb      WordPress database abstraction object.\n * @global PasswordHash $wp_hasher Portable PHP password hashing framework.\n *\n * @param WP_User $user User to retrieve password reset key for.\n *\n * @return string|WP_Error Password reset key on success. WP_Error on error.\n */\nfunction get_password_reset_key( $user ) {\n\tglobal $wpdb, $wp_hasher;\n\n\t/**\n\t * Fires before a new password is retrieved.\n\t *\n\t * @since 1.5.0\n\t * @deprecated 1.5.1 Misspelled. Use 'retrieve_password' hook instead.\n\t *\n\t * @param string $user_login The user login name.\n\t */\n\tdo_action( 'retreive_password', $user->user_login );\n\n\t/**\n\t * Fires before a new password is retrieved.\n\t *\n\t * @since 1.5.1\n\t *\n\t * @param string $user_login The user login name.\n\t */\n\tdo_action( 'retrieve_password', $user->user_login );\n\n\t/**\n\t * Filter whether to allow a password to be reset.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param bool true           Whether to allow the password to be reset. Default true.\n\t * @param int  $user_data->ID The ID of the user attempting to reset a password.\n\t */\n\t$allow = apply_filters( 'allow_password_reset', true, $user->ID );\n\n\tif ( ! $allow ) {\n\t\treturn new WP_Error( 'no_password_reset', __( 'Password reset is not allowed for this user' ) );\n\t} elseif ( is_wp_error( $allow ) ) {\n\t\treturn $allow;\n\t}\n\n\t// Generate something random for a password reset key.\n\t$key = wp_generate_password( 20, false );\n\n\t/**\n\t * Fires when a password reset key is generated.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $user_login The username for the user.\n\t * @param string $key        The generated password reset key.\n\t */\n\tdo_action( 'retrieve_password_key', $user->user_login, $key );\n\n\t// Now insert the key, hashed, into the DB.\n\tif ( empty( $wp_hasher ) ) {\n\t\trequire_once ABSPATH . WPINC . '/class-phpass.php';\n\t\t$wp_hasher = new PasswordHash( 8, true );\n\t}\n\t$hashed = time() . ':' . $wp_hasher->HashPassword( $key );\n\t$key_saved = $wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) );\n\tif ( false === $key_saved ) {\n\t\treturn new WP_Error( 'no_password_key_update', __( 'Could not save password reset key to database.' ) );\n\t}\n\n\treturn $key;\n}\n\n/**\n * Retrieves a user row based on password reset key and login\n *\n * A key is considered 'expired' if it exactly matches the value of the\n * user_activation_key field, rather than being matched after going through the\n * hashing process. This field is now hashed; old values are no longer accepted\n * but have a different WP_Error code so good user feedback can be provided.\n *\n * @since 3.1.0\n *\n * @global wpdb         $wpdb      WordPress database object for queries.\n * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.\n *\n * @param string $key       Hash to validate sending user's password.\n * @param string $login     The user login.\n * @return WP_User|WP_Error WP_User object on success, WP_Error object for invalid or expired keys.\n */\nfunction check_password_reset_key($key, $login) {\n\tglobal $wpdb, $wp_hasher;\n\n\t$key = preg_replace('/[^a-z0-9]/i', '', $key);\n\n\tif ( empty( $key ) || !is_string( $key ) )\n\t\treturn new WP_Error('invalid_key', __('Invalid key'));\n\n\tif ( empty($login) || !is_string($login) )\n\t\treturn new WP_Error('invalid_key', __('Invalid key'));\n\n\t$row = $wpdb->get_row( $wpdb->prepare( \"SELECT ID, user_activation_key FROM $wpdb->users WHERE user_login = %s\", $login ) );\n\tif ( ! $row )\n\t\treturn new WP_Error('invalid_key', __('Invalid key'));\n\n\tif ( empty( $wp_hasher ) ) {\n\t\trequire_once ABSPATH . WPINC . '/class-phpass.php';\n\t\t$wp_hasher = new PasswordHash( 8, true );\n\t}\n\n\t/**\n\t * Filter the expiration time of password reset keys.\n\t *\n\t * @since 4.3.0\n\t *\n\t * @param int $expiration The expiration time in seconds.\n\t */\n\t$expiration_duration = apply_filters( 'password_reset_expiration', DAY_IN_SECONDS );\n\n\tif ( false !== strpos( $row->user_activation_key, ':' ) ) {\n\t\tlist( $pass_request_time, $pass_key ) = explode( ':', $row->user_activation_key, 2 );\n\t\t$expiration_time = $pass_request_time + $expiration_duration;\n\t} else {\n\t\t$pass_key = $row->user_activation_key;\n\t\t$expiration_time = false;\n\t}\n\n\t$hash_is_correct = $wp_hasher->CheckPassword( $key, $pass_key );\n\n\tif ( $hash_is_correct && $expiration_time && time() < $expiration_time ) {\n\t\treturn get_userdata( $row->ID );\n\t} elseif ( $hash_is_correct && $expiration_time ) {\n\t\t// Key has an expiration time that's passed\n\t\treturn new WP_Error( 'expired_key', __( 'Invalid key' ) );\n\t}\n\n\tif ( hash_equals( $row->user_activation_key, $key ) || ( $hash_is_correct && ! $expiration_time ) ) {\n\t\t$return = new WP_Error( 'expired_key', __( 'Invalid key' ) );\n\t\t$user_id = $row->ID;\n\n\t\t/**\n\t\t * Filter the return value of check_password_reset_key() when an\n\t\t * old-style key is used.\n\t\t *\n\t\t * @since 3.7.0 Previously plain-text keys were stored in the database.\n\t\t * @since 4.3.0 Previously key hashes were stored without an expiration time.\n\t\t *\n\t\t * @param WP_Error $return  A WP_Error object denoting an expired key.\n\t\t *                          Return a WP_User object to validate the key.\n\t\t * @param int      $user_id The matched user ID.\n\t\t */\n\t\treturn apply_filters( 'password_reset_key_expired', $return, $user_id );\n\t}\n\n\treturn new WP_Error( 'invalid_key', __( 'Invalid key' ) );\n}\n\n/**\n * Handles resetting the user's password.\n *\n * @since 2.5.0\n *\n * @param object $user     The user\n * @param string $new_pass New password for the user in plaintext\n */\nfunction reset_password( $user, $new_pass ) {\n\t/**\n\t * Fires before the user's password is reset.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param object $user     The user.\n\t * @param string $new_pass New user password.\n\t */\n\tdo_action( 'password_reset', $user, $new_pass );\n\n\twp_set_password( $new_pass, $user->ID );\n\tupdate_user_option( $user->ID, 'default_password_nag', false, true );\n\n\t/**\n\t * Fires after the user's password is reset.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param object $user     The user.\n\t * @param string $new_pass New user password.\n\t */\n\tdo_action( 'after_password_reset', $user, $new_pass );\n}\n\n/**\n * Handles registering a new user.\n *\n * @since 2.5.0\n *\n * @param string $user_login User's username for logging in\n * @param string $user_email User's email address to send password and add\n * @return int|WP_Error Either user's ID or error on failure.\n */\nfunction register_new_user( $user_login, $user_email ) {\n\t$errors = new WP_Error();\n\n\t$sanitized_user_login = sanitize_user( $user_login );\n\t/**\n\t * Filter the email address of a user being registered.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $user_email The email address of the new user.\n\t */\n\t$user_email = apply_filters( 'user_registration_email', $user_email );\n\n\t// Check the username\n\tif ( $sanitized_user_login == '' ) {\n\t\t$errors->add( 'empty_username', __( '<strong>ERROR</strong>: Please enter a username.' ) );\n\t} elseif ( ! validate_username( $user_login ) ) {\n\t\t$errors->add( 'invalid_username', __( '<strong>ERROR</strong>: This username is invalid because it uses illegal characters. Please enter a valid username.' ) );\n\t\t$sanitized_user_login = '';\n\t} elseif ( username_exists( $sanitized_user_login ) ) {\n\t\t$errors->add( 'username_exists', __( '<strong>ERROR</strong>: This username is already registered. Please choose another one.' ) );\n\n\t} else {\n\t\t/** This filter is documented in wp-includes/user.php */\n\t\t$illegal_user_logins = array_map( 'strtolower', (array) apply_filters( 'illegal_user_logins', array() ) );\n\t\tif ( in_array( strtolower( $sanitized_user_login ), $illegal_user_logins ) ) {\n\t\t\t$errors->add( 'invalid_username', __( '<strong>ERROR</strong>: Sorry, that username is not allowed.' ) );\n\t\t}\n\t}\n\n\t// Check the email address\n\tif ( $user_email == '' ) {\n\t\t$errors->add( 'empty_email', __( '<strong>ERROR</strong>: Please type your email address.' ) );\n\t} elseif ( ! is_email( $user_email ) ) {\n\t\t$errors->add( 'invalid_email', __( '<strong>ERROR</strong>: The email address isn&#8217;t correct.' ) );\n\t\t$user_email = '';\n\t} elseif ( email_exists( $user_email ) ) {\n\t\t$errors->add( 'email_exists', __( '<strong>ERROR</strong>: This email is already registered, please choose another one.' ) );\n\t}\n\n\t/**\n\t * Fires when submitting registration form data, before the user is created.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string   $sanitized_user_login The submitted username after being sanitized.\n\t * @param string   $user_email           The submitted email.\n\t * @param WP_Error $errors               Contains any errors with submitted username and email,\n\t *                                       e.g., an empty field, an invalid username or email,\n\t *                                       or an existing username or email.\n\t */\n\tdo_action( 'register_post', $sanitized_user_login, $user_email, $errors );\n\n\t/**\n\t * Filter the errors encountered when a new user is being registered.\n\t *\n\t * The filtered WP_Error object may, for example, contain errors for an invalid\n\t * or existing username or email address. A WP_Error object should always returned,\n\t * but may or may not contain errors.\n\t *\n\t * If any errors are present in $errors, this will abort the user's registration.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param WP_Error $errors               A WP_Error object containing any errors encountered\n\t *                                       during registration.\n\t * @param string   $sanitized_user_login User's username after it has been sanitized.\n\t * @param string   $user_email           User's email.\n\t */\n\t$errors = apply_filters( 'registration_errors', $errors, $sanitized_user_login, $user_email );\n\n\tif ( $errors->get_error_code() )\n\t\treturn $errors;\n\n\t$user_pass = wp_generate_password( 12, false );\n\t$user_id = wp_create_user( $sanitized_user_login, $user_pass, $user_email );\n\tif ( ! $user_id || is_wp_error( $user_id ) ) {\n\t\t$errors->add( 'registerfail', sprintf( __( '<strong>ERROR</strong>: Couldn&#8217;t register you&hellip; please contact the <a href=\"mailto:%s\">webmaster</a> !' ), get_option( 'admin_email' ) ) );\n\t\treturn $errors;\n\t}\n\n\tupdate_user_option( $user_id, 'default_password_nag', true, true ); //Set up the Password change nag.\n\n\t/**\n\t * Fires after a new user registration has been recorded.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param int $user_id ID of the newly registered user.\n\t */\n\tdo_action( 'register_new_user', $user_id );\n\n\treturn $user_id;\n}\n\n/**\n * Initiate email notifications related to the creation of new users.\n *\n * Notifications are sent both to the site admin and to the newly created user.\n *\n * @since 4.4.0\n *\n * @param int    $user_id ID of the newly created user.\n * @param string $notify  Optional. Type of notification that should happen. Accepts 'admin' or an empty string\n *                        (admin only), or 'both' (admin and user). Default 'both'.\n */\nfunction wp_send_new_user_notifications( $user_id, $notify = 'both' ) {\n\twp_new_user_notification( $user_id, null, $notify );\n}\n\n/**\n * Retrieve the current session token from the logged_in cookie.\n *\n * @since 4.0.0\n *\n * @return string Token.\n */\nfunction wp_get_session_token() {\n\t$cookie = wp_parse_auth_cookie( '', 'logged_in' );\n\treturn ! empty( $cookie['token'] ) ? $cookie['token'] : '';\n}\n\n/**\n * Retrieve a list of sessions for the current user.\n *\n * @since 4.0.0\n * @return array Array of sessions.\n */\nfunction wp_get_all_sessions() {\n\t$manager = WP_Session_Tokens::get_instance( get_current_user_id() );\n\treturn $manager->get_all();\n}\n\n/**\n * Remove the current session token from the database.\n *\n * @since 4.0.0\n */\nfunction wp_destroy_current_session() {\n\t$token = wp_get_session_token();\n\tif ( $token ) {\n\t\t$manager = WP_Session_Tokens::get_instance( get_current_user_id() );\n\t\t$manager->destroy( $token );\n\t}\n}\n\n/**\n * Remove all but the current session token for the current user for the database.\n *\n * @since 4.0.0\n */\nfunction wp_destroy_other_sessions() {\n\t$token = wp_get_session_token();\n\tif ( $token ) {\n\t\t$manager = WP_Session_Tokens::get_instance( get_current_user_id() );\n\t\t$manager->destroy_others( $token );\n\t}\n}\n\n/**\n * Remove all session tokens for the current user from the database.\n *\n * @since 4.0.0\n */\nfunction wp_destroy_all_sessions() {\n\t$manager = WP_Session_Tokens::get_instance( get_current_user_id() );\n\t$manager->destroy_all();\n}\n\n/**\n * Get the user IDs of all users with no role on this site.\n *\n * This function returns an empty array when used on Multisite.\n *\n * @since 4.4.0\n *\n * @return array Array of user IDs.\n */\nfunction wp_get_users_with_no_role() {\n\tglobal $wpdb;\n\n\tif ( is_multisite() ) {\n\t\treturn array();\n\t}\n\n\t$prefix = $wpdb->get_blog_prefix();\n\t$regex  = implode( '|', wp_roles()->get_names() );\n\t$regex  = preg_replace( '/[^a-zA-Z_\\|-]/', '', $regex );\n\t$users  = $wpdb->get_col( $wpdb->prepare( \"\n\t\tSELECT user_id\n\t\tFROM $wpdb->usermeta\n\t\tWHERE meta_key = '{$prefix}capabilities'\n\t\tAND meta_value NOT REGEXP %s\n\t\", $regex ) );\n\n\treturn $users;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/vars.php",
    "content": "<?php\n/**\n * Creates common globals for the rest of WordPress\n *\n * Sets $pagenow global which is the current page. Checks\n * for the browser to set which one is currently being used.\n *\n * Detects which user environment WordPress is being used on.\n * Only attempts to check for Apache, Nginx and IIS -- three web\n * servers with known pretty permalink capability.\n *\n * Note: Though Nginx is detected, WordPress does not currently\n * generate rewrite rules for it. See https://codex.wordpress.org/Nginx\n *\n * @package WordPress\n */\n\nglobal $pagenow,\n\t$is_lynx, $is_gecko, $is_winIE, $is_macIE, $is_opera, $is_NS4, $is_safari, $is_chrome, $is_iphone, $is_IE, $is_edge,\n\t$is_apache, $is_IIS, $is_iis7, $is_nginx;\n\n// On which page are we ?\nif ( is_admin() ) {\n\t// wp-admin pages are checked more carefully\n\tif ( is_network_admin() )\n\t\tpreg_match('#/wp-admin/network/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);\n\telseif ( is_user_admin() )\n\t\tpreg_match('#/wp-admin/user/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);\n\telse\n\t\tpreg_match('#/wp-admin/?(.*?)$#i', $_SERVER['PHP_SELF'], $self_matches);\n\t$pagenow = $self_matches[1];\n\t$pagenow = trim($pagenow, '/');\n\t$pagenow = preg_replace('#\\?.*?$#', '', $pagenow);\n\tif ( '' === $pagenow || 'index' === $pagenow || 'index.php' === $pagenow ) {\n\t\t$pagenow = 'index.php';\n\t} else {\n\t\tpreg_match('#(.*?)(/|$)#', $pagenow, $self_matches);\n\t\t$pagenow = strtolower($self_matches[1]);\n\t\tif ( '.php' !== substr($pagenow, -4, 4) )\n\t\t\t$pagenow .= '.php'; // for Options +Multiviews: /wp-admin/themes/index.php (themes.php is queried)\n\t}\n} else {\n\tif ( preg_match('#([^/]+\\.php)([?/].*?)?$#i', $_SERVER['PHP_SELF'], $self_matches) )\n\t\t$pagenow = strtolower($self_matches[1]);\n\telse\n\t\t$pagenow = 'index.php';\n}\nunset($self_matches);\n\n// Simple browser detection\n$is_lynx = $is_gecko = $is_winIE = $is_macIE = $is_opera = $is_NS4 = $is_safari = $is_chrome = $is_iphone = $is_edge = false;\n\nif ( isset($_SERVER['HTTP_USER_AGENT']) ) {\n\tif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Lynx') !== false ) {\n\t\t$is_lynx = true;\n\t} elseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'Edge' ) !== false ) {\n\t\t$is_edge = true;\n\t} elseif ( stripos($_SERVER['HTTP_USER_AGENT'], 'chrome') !== false ) {\n\t\tif ( stripos( $_SERVER['HTTP_USER_AGENT'], 'chromeframe' ) !== false ) {\n\t\t\t$is_admin = is_admin();\n\t\t\t/**\n\t\t\t * Filter whether Google Chrome Frame should be used, if available.\n\t\t\t *\n\t\t\t * @since 3.2.0\n\t\t\t *\n\t\t\t * @param bool $is_admin Whether to use the Google Chrome Frame. Default is the value of is_admin().\n\t\t\t */\n\t\t\tif ( $is_chrome = apply_filters( 'use_google_chrome_frame', $is_admin ) )\n\t\t\t\theader( 'X-UA-Compatible: chrome=1' );\n\t\t\t$is_winIE = ! $is_chrome;\n\t\t} else {\n\t\t\t$is_chrome = true;\n\t\t}\n\t} elseif ( stripos($_SERVER['HTTP_USER_AGENT'], 'safari') !== false ) {\n\t\t$is_safari = true;\n\t} elseif ( ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== false ) && strpos($_SERVER['HTTP_USER_AGENT'], 'Win') !== false ) {\n\t\t$is_winIE = true;\n\t} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'Mac') !== false ) {\n\t\t$is_macIE = true;\n\t} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Gecko') !== false ) {\n\t\t$is_gecko = true;\n\t} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== false ) {\n\t\t$is_opera = true;\n\t} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Nav') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla/4.') !== false ) {\n\t\t$is_NS4 = true;\n\t}\n}\n\nif ( $is_safari && stripos($_SERVER['HTTP_USER_AGENT'], 'mobile') !== false )\n\t$is_iphone = true;\n\n$is_IE = ( $is_macIE || $is_winIE );\n\n// Server detection\n\n/**\n * Whether the server software is Apache or something else\n * @global bool $is_apache\n */\n$is_apache = (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false);\n\n/**\n * Whether the server software is Nginx or something else\n * @global bool $is_nginx\n */\n$is_nginx = (strpos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false);\n\n/**\n * Whether the server software is IIS or something else\n * @global bool $is_IIS\n */\n$is_IIS = !$is_apache && (strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'ExpressionDevServer') !== false);\n\n/**\n * Whether the server software is IIS 7.X or greater\n * @global bool $is_iis7\n */\n$is_iis7 = $is_IIS && intval( substr( $_SERVER['SERVER_SOFTWARE'], strpos( $_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS/' ) + 14 ) ) >= 7;\n\n/**\n * Test if the current browser runs on a mobile device (smart phone, tablet, etc.)\n *\n * @staticvar bool $is_mobile\n *\n * @return bool\n */\nfunction wp_is_mobile() {\n\tstatic $is_mobile = null;\n\n\tif ( isset( $is_mobile ) ) {\n\t\treturn $is_mobile;\n\t}\n\n\tif ( empty($_SERVER['HTTP_USER_AGENT']) ) {\n\t\t$is_mobile = false;\n\t} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false // many mobile devices (all iPhone, iPad, etc.)\n\t\t|| strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false\n\t\t|| strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false\n\t\t|| strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false\n\t\t|| strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false\n\t\t|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false\n\t\t|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) {\n\t\t\t$is_mobile = true;\n\t} else {\n\t\t$is_mobile = false;\n\t}\n\n\treturn $is_mobile;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/version.php",
    "content": "<?php\n/**\n * The WordPress version string\n *\n * @global string $wp_version\n */\n$wp_version = '4.4.2';\n\n/**\n * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.\n *\n * @global int $wp_db_version\n */\n$wp_db_version = 35700;\n\n/**\n * Holds the TinyMCE version\n *\n * @global string $tinymce_version\n */\n$tinymce_version = '4208-20151113';\n\n/**\n * Holds the required PHP version\n *\n * @global string $required_php_version\n */\n$required_php_version = '5.2.4';\n\n/**\n * Holds the required MySQL version\n *\n * @global string $required_mysql_version\n */\n$required_mysql_version = '5.0';\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-nav-menu-widget.php",
    "content": "<?php\n/**\n * Widget API: WP_Nav_Menu_Widget class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement the Custom Menu widget.\n *\n * @since 3.0.0\n *\n * @see WP_Widget\n */\n class WP_Nav_Menu_Widget extends WP_Widget {\n\n\t/**\n\t * Sets up a new Custom Menu widget instance.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array( 'description' => __('Add a custom menu to your sidebar.') );\n\t\tparent::__construct( 'nav_menu', __('Custom Menu'), $widget_ops );\n\t}\n\n\t/**\n\t * Outputs the content for the current Custom Menu widget instance.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Custom Menu widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\t// Get menu\n\t\t$nav_menu = ! empty( $instance['nav_menu'] ) ? wp_get_nav_menu_object( $instance['nav_menu'] ) : false;\n\n\t\tif ( !$nav_menu )\n\t\t\treturn;\n\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$instance['title'] = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );\n\n\t\techo $args['before_widget'];\n\n\t\tif ( !empty($instance['title']) )\n\t\t\techo $args['before_title'] . $instance['title'] . $args['after_title'];\n\n\t\t$nav_menu_args = array(\n\t\t\t'fallback_cb' => '',\n\t\t\t'menu'        => $nav_menu\n\t\t);\n\n\t\t/**\n\t\t * Filter the arguments for the Custom Menu widget.\n\t\t *\n\t\t * @since 4.2.0\n\t\t * @since 4.4.0 Added the `$instance` parameter.\n\t\t *\n\t\t * @param array    $nav_menu_args {\n\t\t *     An array of arguments passed to wp_nav_menu() to retrieve a custom menu.\n\t\t *\n\t\t *     @type callable|bool $fallback_cb Callback to fire if the menu doesn't exist. Default empty.\n\t\t *     @type mixed         $menu        Menu ID, slug, or name.\n\t\t * }\n\t\t * @param stdClass $nav_menu      Nav menu object for the current menu.\n\t\t * @param array    $args          Display arguments for the current widget.\n\t\t * @param array    $instance      Array of settings for the current widget.\n\t\t */\n\t\twp_nav_menu( apply_filters( 'widget_nav_menu_args', $nav_menu_args, $nav_menu, $args, $instance ) );\n\n\t\techo $args['after_widget'];\n\t}\n\n\t/**\n\t * Handles updating settings for the current Custom Menu widget instance.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = array();\n\t\tif ( ! empty( $new_instance['title'] ) ) {\n\t\t\t$instance['title'] = sanitize_text_field( stripslashes( $new_instance['title'] ) );\n\t\t}\n\t\tif ( ! empty( $new_instance['nav_menu'] ) ) {\n\t\t\t$instance['nav_menu'] = (int) $new_instance['nav_menu'];\n\t\t}\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Custom Menu widget.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$title = isset( $instance['title'] ) ? $instance['title'] : '';\n\t\t$nav_menu = isset( $instance['nav_menu'] ) ? $instance['nav_menu'] : '';\n\n\t\t// Get menus\n\t\t$menus = wp_get_nav_menus();\n\n\t\t// If no menus exists, direct the user to go and create some.\n\t\t?>\n\t\t<p class=\"nav-menu-widget-no-menus-message\" <?php if ( ! empty( $menus ) ) { echo ' style=\"display:none\" '; } ?>>\n\t\t\t<?php\n\t\t\tif ( isset( $GLOBALS['wp_customize'] ) && $GLOBALS['wp_customize'] instanceof WP_Customize_Manager ) {\n\t\t\t\t$url = 'javascript: wp.customize.panel( \"nav_menus\" ).focus();';\n\t\t\t} else {\n\t\t\t\t$url = admin_url( 'nav-menus.php' );\n\t\t\t}\n\t\t\t?>\n\t\t\t<?php echo sprintf( __( 'No menus have been created yet. <a href=\"%s\">Create some</a>.' ), esc_attr( $url ) ); ?>\n\t\t</p>\n\t\t<div class=\"nav-menu-widget-form-controls\" <?php if ( empty( $menus ) ) { echo ' style=\"display:none\" '; } ?>>\n\t\t\t<p>\n\t\t\t\t<label for=\"<?php echo $this->get_field_id( 'title' ); ?>\"><?php _e( 'Title:' ) ?></label>\n\t\t\t\t<input type=\"text\" class=\"widefat\" id=\"<?php echo $this->get_field_id( 'title' ); ?>\" name=\"<?php echo $this->get_field_name( 'title' ); ?>\" value=\"<?php echo esc_attr( $title ); ?>\"/>\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<label for=\"<?php echo $this->get_field_id( 'nav_menu' ); ?>\"><?php _e( 'Select Menu:' ); ?></label>\n\t\t\t\t<select id=\"<?php echo $this->get_field_id( 'nav_menu' ); ?>\" name=\"<?php echo $this->get_field_name( 'nav_menu' ); ?>\">\n\t\t\t\t\t<option value=\"0\"><?php _e( '&mdash; Select &mdash;' ); ?></option>\n\t\t\t\t\t<?php foreach ( $menus as $menu ) : ?>\n\t\t\t\t\t\t<option value=\"<?php echo esc_attr( $menu->term_id ); ?>\" <?php selected( $nav_menu, $menu->term_id ); ?>>\n\t\t\t\t\t\t\t<?php echo esc_html( $menu->name ); ?>\n\t\t\t\t\t\t</option>\n\t\t\t\t\t<?php endforeach; ?>\n\t\t\t\t</select>\n\t\t\t</p>\n\t\t</div>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-archives.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Archives class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement the Archives widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Archives extends WP_Widget {\n\n\t/**\n\t * Sets up a new Archives widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('classname' => 'widget_archive', 'description' => __( 'A monthly archive of your site&#8217;s Posts.') );\n\t\tparent::__construct('archives', __('Archives'), $widget_ops);\n\t}\n\n\t/**\n\t * Outputs the content for the current Archives widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Archives widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\t$c = ! empty( $instance['count'] ) ? '1' : '0';\n\t\t$d = ! empty( $instance['dropdown'] ) ? '1' : '0';\n\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Archives' ) : $instance['title'], $instance, $this->id_base );\n\n\t\techo $args['before_widget'];\n\t\tif ( $title ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t}\n\n\t\tif ( $d ) {\n\t\t\t$dropdown_id = \"{$this->id_base}-dropdown-{$this->number}\";\n\t\t\t?>\n\t\t<label class=\"screen-reader-text\" for=\"<?php echo esc_attr( $dropdown_id ); ?>\"><?php echo $title; ?></label>\n\t\t<select id=\"<?php echo esc_attr( $dropdown_id ); ?>\" name=\"archive-dropdown\" onchange='document.location.href=this.options[this.selectedIndex].value;'>\n\t\t\t<?php\n\t\t\t/**\n\t\t\t * Filter the arguments for the Archives widget drop-down.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @see wp_get_archives()\n\t\t\t *\n\t\t\t * @param array $args An array of Archives widget drop-down arguments.\n\t\t\t */\n\t\t\t$dropdown_args = apply_filters( 'widget_archives_dropdown_args', array(\n\t\t\t\t'type'            => 'monthly',\n\t\t\t\t'format'          => 'option',\n\t\t\t\t'show_post_count' => $c\n\t\t\t) );\n\n\t\t\tswitch ( $dropdown_args['type'] ) {\n\t\t\t\tcase 'yearly':\n\t\t\t\t\t$label = __( 'Select Year' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'monthly':\n\t\t\t\t\t$label = __( 'Select Month' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'daily':\n\t\t\t\t\t$label = __( 'Select Day' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'weekly':\n\t\t\t\t\t$label = __( 'Select Week' );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t$label = __( 'Select Post' );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t?>\n\n\t\t\t<option value=\"\"><?php echo esc_attr( $label ); ?></option>\n\t\t\t<?php wp_get_archives( $dropdown_args ); ?>\n\n\t\t</select>\n\t\t<?php } else { ?>\n\t\t<ul>\n\t\t<?php\n\t\t/**\n\t\t * Filter the arguments for the Archives widget.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @see wp_get_archives()\n\t\t *\n\t\t * @param array $args An array of Archives option arguments.\n\t\t */\n\t\twp_get_archives( apply_filters( 'widget_archives_args', array(\n\t\t\t'type'            => 'monthly',\n\t\t\t'show_post_count' => $c\n\t\t) ) );\n\t\t?>\n\t\t</ul>\n\t\t<?php\n\t\t}\n\n\t\techo $args['after_widget'];\n\t}\n\n\t/**\n\t * Handles updating settings for the current Archives widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget_Archives::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$new_instance = wp_parse_args( (array) $new_instance, array( 'title' => '', 'count' => 0, 'dropdown' => '') );\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\t\t$instance['count'] = $new_instance['count'] ? 1 : 0;\n\t\t$instance['dropdown'] = $new_instance['dropdown'] ? 1 : 0;\n\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Archives widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$instance = wp_parse_args( (array) $instance, array( 'title' => '', 'count' => 0, 'dropdown' => '') );\n\t\t$title = sanitize_text_field( $instance['title'] );\n\t\t?>\n\t\t<p><label for=\"<?php echo $this->get_field_id('title'); ?>\"><?php _e('Title:'); ?></label> <input class=\"widefat\" id=\"<?php echo $this->get_field_id('title'); ?>\" name=\"<?php echo $this->get_field_name('title'); ?>\" type=\"text\" value=\"<?php echo esc_attr($title); ?>\" /></p>\n\t\t<p>\n\t\t\t<input class=\"checkbox\" type=\"checkbox\"<?php checked( $instance['dropdown'] ); ?> id=\"<?php echo $this->get_field_id('dropdown'); ?>\" name=\"<?php echo $this->get_field_name('dropdown'); ?>\" /> <label for=\"<?php echo $this->get_field_id('dropdown'); ?>\"><?php _e('Display as dropdown'); ?></label>\n\t\t\t<br/>\n\t\t\t<input class=\"checkbox\" type=\"checkbox\"<?php checked( $instance['count'] ); ?> id=\"<?php echo $this->get_field_id('count'); ?>\" name=\"<?php echo $this->get_field_name('count'); ?>\" /> <label for=\"<?php echo $this->get_field_id('count'); ?>\"><?php _e('Show post counts'); ?></label>\n\t\t</p>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-calendar.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Calendar class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement the Calendar widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Calendar extends WP_Widget {\n\t/**\n\t * Ensure that the ID attribute only appears in the markup once\n\t *\n\t * @since 4.4.0\n\t *\n\t * @static\n\t * @access private\n\t * @var int\n\t */\n\tprivate static $instance = 0;\n\n\t/**\n\t * Sets up a new Calendar widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('classname' => 'widget_calendar', 'description' => __( 'A calendar of your site&#8217;s Posts.') );\n\t\tparent::__construct('calendar', __('Calendar'), $widget_ops);\n\t}\n\n\t/**\n\t * Outputs the content for the current Calendar widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance The settings for the particular instance of the widget.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );\n\n\t\techo $args['before_widget'];\n\t\tif ( $title ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t}\n\t\tif ( 0 === self::$instance ) {\n\t\t\techo '<div id=\"calendar_wrap\" class=\"calendar_wrap\">';\n\t\t} else {\n\t\t\techo '<div class=\"calendar_wrap\">';\n\t\t}\n\t\tget_calendar();\n\t\techo '</div>';\n\t\techo $args['after_widget'];\n\n\t\tself::$instance++;\n\t}\n\n\t/**\n\t * Handles updating settings for the current Calendar widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Calendar widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );\n\t\t$title = sanitize_text_field( $instance['title'] );\n\t\t?>\n\t\t<p><label for=\"<?php echo $this->get_field_id('title'); ?>\"><?php _e('Title:'); ?></label>\n\t\t<input class=\"widefat\" id=\"<?php echo $this->get_field_id('title'); ?>\" name=\"<?php echo $this->get_field_name('title'); ?>\" type=\"text\" value=\"<?php echo esc_attr($title); ?>\" /></p>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-categories.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Categories class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Categories widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Categories extends WP_Widget {\n\n\t/**\n\t * Sets up a new Categories widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array( 'classname' => 'widget_categories', 'description' => __( \"A list or dropdown of categories.\" ) );\n\t\tparent::__construct('categories', __('Categories'), $widget_ops);\n\t}\n\n\t/**\n\t * Outputs the content for the current Categories widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Categories widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\tstatic $first_dropdown = true;\n\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Categories' ) : $instance['title'], $instance, $this->id_base );\n\n\t\t$c = ! empty( $instance['count'] ) ? '1' : '0';\n\t\t$h = ! empty( $instance['hierarchical'] ) ? '1' : '0';\n\t\t$d = ! empty( $instance['dropdown'] ) ? '1' : '0';\n\n\t\techo $args['before_widget'];\n\t\tif ( $title ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t}\n\n\t\t$cat_args = array(\n\t\t\t'orderby'      => 'name',\n\t\t\t'show_count'   => $c,\n\t\t\t'hierarchical' => $h\n\t\t);\n\n\t\tif ( $d ) {\n\t\t\t$dropdown_id = ( $first_dropdown ) ? 'cat' : \"{$this->id_base}-dropdown-{$this->number}\";\n\t\t\t$first_dropdown = false;\n\n\t\t\techo '<label class=\"screen-reader-text\" for=\"' . esc_attr( $dropdown_id ) . '\">' . $title . '</label>';\n\n\t\t\t$cat_args['show_option_none'] = __( 'Select Category' );\n\t\t\t$cat_args['id'] = $dropdown_id;\n\n\t\t\t/**\n\t\t\t * Filter the arguments for the Categories widget drop-down.\n\t\t\t *\n\t\t\t * @since 2.8.0\n\t\t\t *\n\t\t\t * @see wp_dropdown_categories()\n\t\t\t *\n\t\t\t * @param array $cat_args An array of Categories widget drop-down arguments.\n\t\t\t */\n\t\t\twp_dropdown_categories( apply_filters( 'widget_categories_dropdown_args', $cat_args ) );\n\t\t\t?>\n\n<script type='text/javascript'>\n/* <![CDATA[ */\n(function() {\n\tvar dropdown = document.getElementById( \"<?php echo esc_js( $dropdown_id ); ?>\" );\n\tfunction onCatChange() {\n\t\tif ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) {\n\t\t\tlocation.href = \"<?php echo home_url(); ?>/?cat=\" + dropdown.options[ dropdown.selectedIndex ].value;\n\t\t}\n\t}\n\tdropdown.onchange = onCatChange;\n})();\n/* ]]> */\n</script>\n\n<?php\n\t\t} else {\n?>\n\t\t<ul>\n<?php\n\t\t$cat_args['title_li'] = '';\n\n\t\t/**\n\t\t * Filter the arguments for the Categories widget.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @param array $cat_args An array of Categories widget options.\n\t\t */\n\t\twp_list_categories( apply_filters( 'widget_categories_args', $cat_args ) );\n?>\n\t\t</ul>\n<?php\n\t\t}\n\n\t\techo $args['after_widget'];\n\t}\n\n\t/**\n\t * Handles updating settings for the current Categories widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\t\t$instance['count'] = !empty($new_instance['count']) ? 1 : 0;\n\t\t$instance['hierarchical'] = !empty($new_instance['hierarchical']) ? 1 : 0;\n\t\t$instance['dropdown'] = !empty($new_instance['dropdown']) ? 1 : 0;\n\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Categories widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t//Defaults\n\t\t$instance = wp_parse_args( (array) $instance, array( 'title' => '') );\n\t\t$title = sanitize_text_field( $instance['title'] );\n\t\t$count = isset($instance['count']) ? (bool) $instance['count'] :false;\n\t\t$hierarchical = isset( $instance['hierarchical'] ) ? (bool) $instance['hierarchical'] : false;\n\t\t$dropdown = isset( $instance['dropdown'] ) ? (bool) $instance['dropdown'] : false;\n\t\t?>\n\t\t<p><label for=\"<?php echo $this->get_field_id('title'); ?>\"><?php _e( 'Title:' ); ?></label>\n\t\t<input class=\"widefat\" id=\"<?php echo $this->get_field_id('title'); ?>\" name=\"<?php echo $this->get_field_name('title'); ?>\" type=\"text\" value=\"<?php echo esc_attr( $title ); ?>\" /></p>\n\n\t\t<p><input type=\"checkbox\" class=\"checkbox\" id=\"<?php echo $this->get_field_id('dropdown'); ?>\" name=\"<?php echo $this->get_field_name('dropdown'); ?>\"<?php checked( $dropdown ); ?> />\n\t\t<label for=\"<?php echo $this->get_field_id('dropdown'); ?>\"><?php _e( 'Display as dropdown' ); ?></label><br />\n\n\t\t<input type=\"checkbox\" class=\"checkbox\" id=\"<?php echo $this->get_field_id('count'); ?>\" name=\"<?php echo $this->get_field_name('count'); ?>\"<?php checked( $count ); ?> />\n\t\t<label for=\"<?php echo $this->get_field_id('count'); ?>\"><?php _e( 'Show post counts' ); ?></label><br />\n\n\t\t<input type=\"checkbox\" class=\"checkbox\" id=\"<?php echo $this->get_field_id('hierarchical'); ?>\" name=\"<?php echo $this->get_field_name('hierarchical'); ?>\"<?php checked( $hierarchical ); ?> />\n\t\t<label for=\"<?php echo $this->get_field_id('hierarchical'); ?>\"><?php _e( 'Show hierarchy' ); ?></label></p>\n\t\t<?php\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-links.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Links class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Links widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Links extends WP_Widget {\n\n\t/**\n\t * Sets up a new Links widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('description' => __( \"Your blogroll\" ) );\n\t\tparent::__construct('links', __('Links'), $widget_ops);\n\t}\n\n\t/**\n\t * Outputs the content for the current Links widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Links widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\t$show_description = isset($instance['description']) ? $instance['description'] : false;\n\t\t$show_name = isset($instance['name']) ? $instance['name'] : false;\n\t\t$show_rating = isset($instance['rating']) ? $instance['rating'] : false;\n\t\t$show_images = isset($instance['images']) ? $instance['images'] : true;\n\t\t$category = isset($instance['category']) ? $instance['category'] : false;\n\t\t$orderby = isset( $instance['orderby'] ) ? $instance['orderby'] : 'name';\n\t\t$order = $orderby == 'rating' ? 'DESC' : 'ASC';\n\t\t$limit = isset( $instance['limit'] ) ? $instance['limit'] : -1;\n\n\t\t$before_widget = preg_replace( '/id=\"[^\"]*\"/', 'id=\"%id\"', $args['before_widget'] );\n\n\t\t$widget_links_args = array(\n\t\t\t'title_before'     => $args['before_title'],\n\t\t\t'title_after'      => $args['after_title'],\n\t\t\t'category_before'  => $before_widget,\n\t\t\t'category_after'   => $args['after_widget'],\n\t\t\t'show_images'      => $show_images,\n\t\t\t'show_description' => $show_description,\n\t\t\t'show_name'        => $show_name,\n\t\t\t'show_rating'      => $show_rating,\n\t\t\t'category'         => $category,\n\t\t\t'class'            => 'linkcat widget',\n\t\t\t'orderby'          => $orderby,\n\t\t\t'order'            => $order,\n\t\t\t'limit'            => $limit,\n\t\t);\n\n\t\t/**\n\t\t * Filter the arguments for the Links widget.\n\t\t *\n\t\t * @since 2.6.0\n\t\t * @since 4.4.0 The `$instance` parameter was added.\n\t\t *\n\t\t * @see wp_list_bookmarks()\n\t\t *\n\t\t * @param array $widget_links_args An array of arguments to retrieve the links list.\n\t\t * @param array $instance          The settings for the particular instance of the widget.\n\t\t */\n\t\twp_list_bookmarks( apply_filters( 'widget_links_args', $widget_links_args, $instance ) );\n\t}\n\n\t/**\n\t * Handles updating settings for the current Links widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$new_instance = (array) $new_instance;\n\t\t$instance = array( 'images' => 0, 'name' => 0, 'description' => 0, 'rating' => 0 );\n\t\tforeach ( $instance as $field => $val ) {\n\t\t\tif ( isset($new_instance[$field]) )\n\t\t\t\t$instance[$field] = 1;\n\t\t}\n\n\t\t$instance['orderby'] = 'name';\n\t\tif ( in_array( $new_instance['orderby'], array( 'name', 'rating', 'id', 'rand' ) ) )\n\t\t\t$instance['orderby'] = $new_instance['orderby'];\n\n\t\t$instance['category'] = intval( $new_instance['category'] );\n\t\t$instance['limit'] = ! empty( $new_instance['limit'] ) ? intval( $new_instance['limit'] ) : -1;\n\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Links widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\n\t\t//Defaults\n\t\t$instance = wp_parse_args( (array) $instance, array( 'images' => true, 'name' => true, 'description' => false, 'rating' => false, 'category' => false, 'orderby' => 'name', 'limit' => -1 ) );\n\t\t$link_cats = get_terms( 'link_category' );\n\t\tif ( ! $limit = intval( $instance['limit'] ) )\n\t\t\t$limit = -1;\n\t\t\t?>\n\t\t<p>\n\t\t<label for=\"<?php echo $this->get_field_id('category'); ?>\"><?php _e( 'Select Link Category:' ); ?></label>\n\t\t<select class=\"widefat\" id=\"<?php echo $this->get_field_id('category'); ?>\" name=\"<?php echo $this->get_field_name('category'); ?>\">\n\t\t<option value=\"\"><?php _ex('All Links', 'links widget'); ?></option>\n\t\t<?php\n\t\tforeach ( $link_cats as $link_cat ) {\n\t\t\techo '<option value=\"' . intval( $link_cat->term_id ) . '\"'\n\t\t\t\t. selected( $instance['category'], $link_cat->term_id, false )\n\t\t\t\t. '>' . $link_cat->name . \"</option>\\n\";\n\t\t}\n\t\t?>\n\t\t</select>\n\t\t<label for=\"<?php echo $this->get_field_id('orderby'); ?>\"><?php _e( 'Sort by:' ); ?></label>\n\t\t<select name=\"<?php echo $this->get_field_name('orderby'); ?>\" id=\"<?php echo $this->get_field_id('orderby'); ?>\" class=\"widefat\">\n\t\t\t<option value=\"name\"<?php selected( $instance['orderby'], 'name' ); ?>><?php _e( 'Link title' ); ?></option>\n\t\t\t<option value=\"rating\"<?php selected( $instance['orderby'], 'rating' ); ?>><?php _e( 'Link rating' ); ?></option>\n\t\t\t<option value=\"id\"<?php selected( $instance['orderby'], 'id' ); ?>><?php _e( 'Link ID' ); ?></option>\n\t\t\t<option value=\"rand\"<?php selected( $instance['orderby'], 'rand' ); ?>><?php _ex( 'Random', 'Links widget' ); ?></option>\n\t\t</select>\n\t\t</p>\n\t\t<p>\n\t\t<input class=\"checkbox\" type=\"checkbox\"<?php checked($instance['images'], true) ?> id=\"<?php echo $this->get_field_id('images'); ?>\" name=\"<?php echo $this->get_field_name('images'); ?>\" />\n\t\t<label for=\"<?php echo $this->get_field_id('images'); ?>\"><?php _e('Show Link Image'); ?></label><br />\n\t\t<input class=\"checkbox\" type=\"checkbox\"<?php checked($instance['name'], true) ?> id=\"<?php echo $this->get_field_id('name'); ?>\" name=\"<?php echo $this->get_field_name('name'); ?>\" />\n\t\t<label for=\"<?php echo $this->get_field_id('name'); ?>\"><?php _e('Show Link Name'); ?></label><br />\n\t\t<input class=\"checkbox\" type=\"checkbox\"<?php checked($instance['description'], true) ?> id=\"<?php echo $this->get_field_id('description'); ?>\" name=\"<?php echo $this->get_field_name('description'); ?>\" />\n\t\t<label for=\"<?php echo $this->get_field_id('description'); ?>\"><?php _e('Show Link Description'); ?></label><br />\n\t\t<input class=\"checkbox\" type=\"checkbox\"<?php checked($instance['rating'], true) ?> id=\"<?php echo $this->get_field_id('rating'); ?>\" name=\"<?php echo $this->get_field_name('rating'); ?>\" />\n\t\t<label for=\"<?php echo $this->get_field_id('rating'); ?>\"><?php _e('Show Link Rating'); ?></label>\n\t\t</p>\n\t\t<p>\n\t\t<label for=\"<?php echo $this->get_field_id('limit'); ?>\"><?php _e( 'Number of links to show:' ); ?></label>\n\t\t<input id=\"<?php echo $this->get_field_id('limit'); ?>\" name=\"<?php echo $this->get_field_name('limit'); ?>\" type=\"text\" value=\"<?php echo $limit == -1 ? '' : intval( $limit ); ?>\" size=\"3\" />\n\t\t</p>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-meta.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Meta class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Meta widget.\n *\n * Displays log in/out, RSS feed links, etc.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Meta extends WP_Widget {\n\n\t/**\n\t * Sets up a new Meta widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('classname' => 'widget_meta', 'description' => __( \"Login, RSS, &amp; WordPress.org links.\") );\n\t\tparent::__construct('meta', __('Meta'), $widget_ops);\n\t}\n\n\t/**\n\t * Outputs the content for the current Meta widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Meta widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', empty($instance['title']) ? __( 'Meta' ) : $instance['title'], $instance, $this->id_base );\n\n\t\techo $args['before_widget'];\n\t\tif ( $title ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t}\n\t\t\t?>\n\t\t\t<ul>\n\t\t\t<?php wp_register(); ?>\n\t\t\t<li><?php wp_loginout(); ?></li>\n\t\t\t<li><a href=\"<?php echo esc_url( get_bloginfo( 'rss2_url' ) ); ?>\"><?php _e('Entries <abbr title=\"Really Simple Syndication\">RSS</abbr>'); ?></a></li>\n\t\t\t<li><a href=\"<?php echo esc_url( get_bloginfo( 'comments_rss2_url' ) ); ?>\"><?php _e('Comments <abbr title=\"Really Simple Syndication\">RSS</abbr>'); ?></a></li>\n\t\t\t<?php\n\t\t\t/**\n\t\t\t * Filter the \"Powered by WordPress\" text in the Meta widget.\n\t\t\t *\n\t\t\t * @since 3.6.0\n\t\t\t *\n\t\t\t * @param string $title_text Default title text for the WordPress.org link.\n\t\t\t */\n\t\t\techo apply_filters( 'widget_meta_poweredby', sprintf( '<li><a href=\"%s\" title=\"%s\">%s</a></li>',\n\t\t\t\tesc_url( __( 'https://wordpress.org/' ) ),\n\t\t\t\tesc_attr__( 'Powered by WordPress, state-of-the-art semantic personal publishing platform.' ),\n\t\t\t\t_x( 'WordPress.org', 'meta widget link text' )\n\t\t\t) );\n\n\t\t\twp_meta();\n\t\t\t?>\n\t\t\t</ul>\n\t\t\t<?php\n\t\techo $args['after_widget'];\n\t}\n\n\t/**\n\t * Handles updating settings for the current Meta widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Meta widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );\n\t\t$title = sanitize_text_field( $instance['title'] );\n?>\n\t\t\t<p><label for=\"<?php echo $this->get_field_id('title'); ?>\"><?php _e('Title:'); ?></label> <input class=\"widefat\" id=\"<?php echo $this->get_field_id('title'); ?>\" name=\"<?php echo $this->get_field_name('title'); ?>\" type=\"text\" value=\"<?php echo esc_attr($title); ?>\" /></p>\n<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-pages.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Pages class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Pages widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Pages extends WP_Widget {\n\n\t/**\n\t * Sets up a new Pages widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('classname' => 'widget_pages', 'description' => __( 'A list of your site&#8217;s Pages.') );\n\t\tparent::__construct('pages', __('Pages'), $widget_ops);\n\t}\n\n\t/**\n\t * Outputs the content for the current Pages widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Pages widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\n\t\t/**\n\t\t * Filter the widget title.\n\t\t *\n\t\t * @since 2.6.0\n\t\t *\n\t\t * @param string $title    The widget title. Default 'Pages'.\n\t\t * @param array  $instance An array of the widget's settings.\n\t\t * @param mixed  $id_base  The widget ID.\n\t\t */\n\t\t$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Pages' ) : $instance['title'], $instance, $this->id_base );\n\n\t\t$sortby = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby'];\n\t\t$exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude'];\n\n\t\tif ( $sortby == 'menu_order' )\n\t\t\t$sortby = 'menu_order, post_title';\n\n\t\t/**\n\t\t * Filter the arguments for the Pages widget.\n\t\t *\n\t\t * @since 2.8.0\n\t\t *\n\t\t * @see wp_list_pages()\n\t\t *\n\t\t * @param array $args An array of arguments to retrieve the pages list.\n\t\t */\n\t\t$out = wp_list_pages( apply_filters( 'widget_pages_args', array(\n\t\t\t'title_li'    => '',\n\t\t\t'echo'        => 0,\n\t\t\t'sort_column' => $sortby,\n\t\t\t'exclude'     => $exclude\n\t\t) ) );\n\n\t\tif ( ! empty( $out ) ) {\n\t\t\techo $args['before_widget'];\n\t\t\tif ( $title ) {\n\t\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t\t}\n\t\t?>\n\t\t<ul>\n\t\t\t<?php echo $out; ?>\n\t\t</ul>\n\t\t<?php\n\t\t\techo $args['after_widget'];\n\t\t}\n\t}\n\n\t/**\n\t * Handles updating settings for the current Pages widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\t\tif ( in_array( $new_instance['sortby'], array( 'post_title', 'menu_order', 'ID' ) ) ) {\n\t\t\t$instance['sortby'] = $new_instance['sortby'];\n\t\t} else {\n\t\t\t$instance['sortby'] = 'menu_order';\n\t\t}\n\n\t\t$instance['exclude'] = sanitize_text_field( $new_instance['exclude'] );\n\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Pages widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t//Defaults\n\t\t$instance = wp_parse_args( (array) $instance, array( 'sortby' => 'post_title', 'title' => '', 'exclude' => '') );\n\t\t?>\n\t\t<p>\n\t\t\t<label for=\"<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>\"><?php _e( 'Title:' ); ?></label>\n\t\t\t<input class=\"widefat\" id=\"<?php echo esc_attr( $this->get_field_id('title') ); ?>\" name=\"<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>\" type=\"text\" value=\"<?php echo esc_attr( $instance['title'] ); ?>\" />\n\t\t</p>\n\t\t<p>\n\t\t\t<label for=\"<?php echo esc_attr( $this->get_field_id( 'sortby' ) ); ?>\"><?php _e( 'Sort by:' ); ?></label>\n\t\t\t<select name=\"<?php echo esc_attr( $this->get_field_name( 'sortby' ) ); ?>\" id=\"<?php echo esc_attr( $this->get_field_id( 'sortby' ) ); ?>\" class=\"widefat\">\n\t\t\t\t<option value=\"post_title\"<?php selected( $instance['sortby'], 'post_title' ); ?>><?php _e('Page title'); ?></option>\n\t\t\t\t<option value=\"menu_order\"<?php selected( $instance['sortby'], 'menu_order' ); ?>><?php _e('Page order'); ?></option>\n\t\t\t\t<option value=\"ID\"<?php selected( $instance['sortby'], 'ID' ); ?>><?php _e( 'Page ID' ); ?></option>\n\t\t\t</select>\n\t\t</p>\n\t\t<p>\n\t\t\t<label for=\"<?php echo esc_attr( $this->get_field_id( 'exclude' ) ); ?>\"><?php _e( 'Exclude:' ); ?></label>\n\t\t\t<input type=\"text\" value=\"<?php echo esc_attr( $instance['exclude'] ); ?>\" name=\"<?php echo esc_attr( $this->get_field_name( 'exclude' ) ); ?>\" id=\"<?php echo esc_attr( $this->get_field_id( 'exclude' ) ); ?>\" class=\"widefat\" />\n\t\t\t<br />\n\t\t\t<small><?php _e( 'Page IDs, separated by commas.' ); ?></small>\n\t\t</p>\n\t\t<?php\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-recent-comments.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Recent_Comments class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Recent Comments widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Recent_Comments extends WP_Widget {\n\n\t/**\n\t * Sets up a new Recent Comments widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'Your site&#8217;s most recent comments.' ) );\n\t\tparent::__construct('recent-comments', __('Recent Comments'), $widget_ops);\n\t\t$this->alt_option_name = 'widget_recent_comments';\n\n\t\tif ( is_active_widget(false, false, $this->id_base) )\n\t\t\tadd_action( 'wp_head', array($this, 'recent_comments_style') );\n\t}\n\n \t/**\n\t * Outputs the default styles for the Recent Comments widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function recent_comments_style() {\n\t\t/**\n\t\t * Filter the Recent Comments default widget styles.\n\t\t *\n\t\t * @since 3.1.0\n\t\t *\n\t\t * @param bool   $active  Whether the widget is active. Default true.\n\t\t * @param string $id_base The widget ID.\n\t\t */\n\t\tif ( ! current_theme_supports( 'widgets' ) // Temp hack #14876\n\t\t\t|| ! apply_filters( 'show_recent_comments_widget_style', true, $this->id_base ) )\n\t\t\treturn;\n\t\t?>\n\t\t<style type=\"text/css\">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style>\n\t\t<?php\n\t}\n\n\t/**\n\t * Outputs the content for the current Recent Comments widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Recent Comments widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\tif ( ! isset( $args['widget_id'] ) )\n\t\t\t$args['widget_id'] = $this->id;\n\n\t\t$output = '';\n\n\t\t$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Comments' );\n\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );\n\n\t\t$number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;\n\t\tif ( ! $number )\n\t\t\t$number = 5;\n\n\t\t/**\n\t\t * Filter the arguments for the Recent Comments widget.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @see WP_Comment_Query::query() for information on accepted arguments.\n\t\t *\n\t\t * @param array $comment_args An array of arguments used to retrieve the recent comments.\n\t\t */\n\t\t$comments = get_comments( apply_filters( 'widget_comments_args', array(\n\t\t\t'number'      => $number,\n\t\t\t'status'      => 'approve',\n\t\t\t'post_status' => 'publish'\n\t\t) ) );\n\n\t\t$output .= $args['before_widget'];\n\t\tif ( $title ) {\n\t\t\t$output .= $args['before_title'] . $title . $args['after_title'];\n\t\t}\n\n\t\t$output .= '<ul id=\"recentcomments\">';\n\t\tif ( is_array( $comments ) && $comments ) {\n\t\t\t// Prime cache for associated posts. (Prime post term cache if we need it for permalinks.)\n\t\t\t$post_ids = array_unique( wp_list_pluck( $comments, 'comment_post_ID' ) );\n\t\t\t_prime_post_caches( $post_ids, strpos( get_option( 'permalink_structure' ), '%category%' ), false );\n\n\t\t\tforeach ( (array) $comments as $comment ) {\n\t\t\t\t$output .= '<li class=\"recentcomments\">';\n\t\t\t\t/* translators: comments widget: 1: comment author, 2: post link */\n\t\t\t\t$output .= sprintf( _x( '%1$s on %2$s', 'widgets' ),\n\t\t\t\t\t'<span class=\"comment-author-link\">' . get_comment_author_link( $comment ) . '</span>',\n\t\t\t\t\t'<a href=\"' . esc_url( get_comment_link( $comment ) ) . '\">' . get_the_title( $comment->comment_post_ID ) . '</a>'\n\t\t\t\t);\n\t\t\t\t$output .= '</li>';\n\t\t\t}\n\t\t}\n\t\t$output .= '</ul>';\n\t\t$output .= $args['after_widget'];\n\n\t\techo $output;\n\t}\n\n\t/**\n\t * Handles updating settings for the current Recent Comments widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\t\t$instance['number'] = absint( $new_instance['number'] );\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Recent Comments widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$title = isset( $instance['title'] ) ? $instance['title'] : '';\n\t\t$number = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;\n\t\t?>\n\t\t<p><label for=\"<?php echo $this->get_field_id( 'title' ); ?>\"><?php _e( 'Title:' ); ?></label>\n\t\t<input class=\"widefat\" id=\"<?php echo $this->get_field_id( 'title' ); ?>\" name=\"<?php echo $this->get_field_name( 'title' ); ?>\" type=\"text\" value=\"<?php echo esc_attr( $title ); ?>\" /></p>\n\n\t\t<p><label for=\"<?php echo $this->get_field_id( 'number' ); ?>\"><?php _e( 'Number of comments to show:' ); ?></label>\n\t\t<input class=\"tiny-text\" id=\"<?php echo $this->get_field_id( 'number' ); ?>\" name=\"<?php echo $this->get_field_name( 'number' ); ?>\" type=\"number\" step=\"1\" min=\"1\" value=\"<?php echo $number; ?>\" size=\"3\" /></p>\n\t\t<?php\n\t}\n\n\t/**\n\t * Flushes the Recent Comments widget cache.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @deprecated 4.4.0 Fragment caching was removed in favor of split queries.\n\t */\n\tpublic function flush_widget_cache() {\n\t\t_deprecated_function( __METHOD__, '4.4' );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-recent-posts.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Recent_Posts class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Recent Posts widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Recent_Posts extends WP_Widget {\n\n\t/**\n\t * Sets up a new Recent Posts widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( \"Your site&#8217;s most recent Posts.\") );\n\t\tparent::__construct('recent-posts', __('Recent Posts'), $widget_ops);\n\t\t$this->alt_option_name = 'widget_recent_entries';\n\t}\n\n\t/**\n\t * Outputs the content for the current Recent Posts widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Recent Posts widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\tif ( ! isset( $args['widget_id'] ) ) {\n\t\t\t$args['widget_id'] = $this->id;\n\t\t}\n\n\t\t$title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Recent Posts' );\n\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );\n\n\t\t$number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;\n\t\tif ( ! $number )\n\t\t\t$number = 5;\n\t\t$show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;\n\n\t\t/**\n\t\t * Filter the arguments for the Recent Posts widget.\n\t\t *\n\t\t * @since 3.4.0\n\t\t *\n\t\t * @see WP_Query::get_posts()\n\t\t *\n\t\t * @param array $args An array of arguments used to retrieve the recent posts.\n\t\t */\n\t\t$r = new WP_Query( apply_filters( 'widget_posts_args', array(\n\t\t\t'posts_per_page'      => $number,\n\t\t\t'no_found_rows'       => true,\n\t\t\t'post_status'         => 'publish',\n\t\t\t'ignore_sticky_posts' => true\n\t\t) ) );\n\n\t\tif ($r->have_posts()) :\n\t\t?>\n\t\t<?php echo $args['before_widget']; ?>\n\t\t<?php if ( $title ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t} ?>\n\t\t<ul>\n\t\t<?php while ( $r->have_posts() ) : $r->the_post(); ?>\n\t\t\t<li>\n\t\t\t\t<a href=\"<?php the_permalink(); ?>\"><?php get_the_title() ? the_title() : the_ID(); ?></a>\n\t\t\t<?php if ( $show_date ) : ?>\n\t\t\t\t<span class=\"post-date\"><?php echo get_the_date(); ?></span>\n\t\t\t<?php endif; ?>\n\t\t\t</li>\n\t\t<?php endwhile; ?>\n\t\t</ul>\n\t\t<?php echo $args['after_widget']; ?>\n\t\t<?php\n\t\t// Reset the global $the_post as this query will have stomped on it\n\t\twp_reset_postdata();\n\n\t\tendif;\n\t}\n\n\t/**\n\t * Handles updating the settings for the current Recent Posts widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\t\t$instance['number'] = (int) $new_instance['number'];\n\t\t$instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : false;\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the settings form for the Recent Posts widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';\n\t\t$number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;\n\t\t$show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : false;\n?>\n\t\t<p><label for=\"<?php echo $this->get_field_id( 'title' ); ?>\"><?php _e( 'Title:' ); ?></label>\n\t\t<input class=\"widefat\" id=\"<?php echo $this->get_field_id( 'title' ); ?>\" name=\"<?php echo $this->get_field_name( 'title' ); ?>\" type=\"text\" value=\"<?php echo $title; ?>\" /></p>\n\n\t\t<p><label for=\"<?php echo $this->get_field_id( 'number' ); ?>\"><?php _e( 'Number of posts to show:' ); ?></label>\n\t\t<input class=\"tiny-text\" id=\"<?php echo $this->get_field_id( 'number' ); ?>\" name=\"<?php echo $this->get_field_name( 'number' ); ?>\" type=\"number\" step=\"1\" min=\"1\" value=\"<?php echo $number; ?>\" size=\"3\" /></p>\n\n\t\t<p><input class=\"checkbox\" type=\"checkbox\"<?php checked( $show_date ); ?> id=\"<?php echo $this->get_field_id( 'show_date' ); ?>\" name=\"<?php echo $this->get_field_name( 'show_date' ); ?>\" />\n\t\t<label for=\"<?php echo $this->get_field_id( 'show_date' ); ?>\"><?php _e( 'Display post date?' ); ?></label></p>\n<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-rss.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_RSS class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a RSS widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_RSS extends WP_Widget {\n\n\t/**\n\t * Sets up a new RSS widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array( 'description' => __('Entries from any RSS or Atom feed.') );\n\t\t$control_ops = array( 'width' => 400, 'height' => 200 );\n\t\tparent::__construct( 'rss', __('RSS'), $widget_ops, $control_ops );\n\t}\n\n\t/**\n\t * Outputs the content for the current RSS widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current RSS widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\tif ( isset($instance['error']) && $instance['error'] )\n\t\t\treturn;\n\n\t\t$url = ! empty( $instance['url'] ) ? $instance['url'] : '';\n\t\twhile ( stristr($url, 'http') != $url )\n\t\t\t$url = substr($url, 1);\n\n\t\tif ( empty($url) )\n\t\t\treturn;\n\n\t\t// self-url destruction sequence\n\t\tif ( in_array( untrailingslashit( $url ), array( site_url(), home_url() ) ) )\n\t\t\treturn;\n\n\t\t$rss = fetch_feed($url);\n\t\t$title = $instance['title'];\n\t\t$desc = '';\n\t\t$link = '';\n\n\t\tif ( ! is_wp_error($rss) ) {\n\t\t\t$desc = esc_attr(strip_tags(@html_entity_decode($rss->get_description(), ENT_QUOTES, get_option('blog_charset'))));\n\t\t\tif ( empty($title) )\n\t\t\t\t$title = strip_tags( $rss->get_title() );\n\t\t\t$link = strip_tags( $rss->get_permalink() );\n\t\t\twhile ( stristr($link, 'http') != $link )\n\t\t\t\t$link = substr($link, 1);\n\t\t}\n\n\t\tif ( empty($title) )\n\t\t\t$title = empty($desc) ? __('Unknown Feed') : $desc;\n\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );\n\n\t\t$url = strip_tags( $url );\n\t\t$icon = includes_url( 'images/rss.png' );\n\t\tif ( $title )\n\t\t\t$title = '<a class=\"rsswidget\" href=\"' . esc_url( $url ) . '\"><img class=\"rss-widget-icon\" style=\"border:0\" width=\"14\" height=\"14\" src=\"' . esc_url( $icon ) . '\" alt=\"RSS\" /></a> <a class=\"rsswidget\" href=\"' . esc_url( $link ) . '\">'. esc_html( $title ) . '</a>';\n\n\t\techo $args['before_widget'];\n\t\tif ( $title ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t}\n\t\twp_widget_rss_output( $rss, $instance );\n\t\techo $args['after_widget'];\n\n\t\tif ( ! is_wp_error($rss) )\n\t\t\t$rss->__destruct();\n\t\tunset($rss);\n\t}\n\n\t/**\n\t * Handles updating settings for the current RSS widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings to save.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$testurl = ( isset( $new_instance['url'] ) && ( !isset( $old_instance['url'] ) || ( $new_instance['url'] != $old_instance['url'] ) ) );\n\t\treturn wp_widget_rss_process( $new_instance, $testurl );\n\t}\n\n\t/**\n\t * Outputs the settings form for the RSS widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\tif ( empty( $instance ) ) {\n\t\t\t$instance = array( 'title' => '', 'url' => '', 'items' => 10, 'error' => false, 'show_summary' => 0, 'show_author' => 0, 'show_date' => 0 );\n\t\t}\n\t\t$instance['number'] = $this->number;\n\n\t\twp_widget_rss_form( $instance );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-search.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Search class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Search widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Search extends WP_Widget {\n\n\t/**\n\t * Sets up a new Search widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('classname' => 'widget_search', 'description' => __( \"A search form for your site.\") );\n\t\tparent::__construct( 'search', _x( 'Search', 'Search widget' ), $widget_ops );\n\t}\n\n\t/**\n\t * Outputs the content for the current Search widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Search widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );\n\n\t\techo $args['before_widget'];\n\t\tif ( $title ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t}\n\n\t\t// Use current theme search form if it exists\n\t\tget_search_form();\n\n\t\techo $args['after_widget'];\n\t}\n\n\t/**\n\t * Outputs the settings form for the Search widget.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$instance = wp_parse_args( (array) $instance, array( 'title' => '') );\n\t\t$title = $instance['title'];\n\t\t?>\n\t\t<p><label for=\"<?php echo $this->get_field_id('title'); ?>\"><?php _e('Title:'); ?> <input class=\"widefat\" id=\"<?php echo $this->get_field_id('title'); ?>\" name=\"<?php echo $this->get_field_name('title'); ?>\" type=\"text\" value=\"<?php echo esc_attr($title); ?>\" /></label></p>\n\t\t<?php\n\t}\n\n\t/**\n\t * Handles updating settings for the current Search widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Updated settings.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$new_instance = wp_parse_args((array) $new_instance, array( 'title' => ''));\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\t\treturn $instance;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-tag-cloud.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Tag_Cloud class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Tag cloud widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Tag_Cloud extends WP_Widget {\n\n\t/**\n\t * Sets up a new Tag Cloud widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array( 'description' => __( \"A cloud of your most used tags.\") );\n\t\tparent::__construct('tag_cloud', __('Tag Cloud'), $widget_ops);\n\t}\n\n\t/**\n\t * Outputs the content for the current Tag Cloud widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Tag Cloud widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\t\t$current_taxonomy = $this->_get_current_taxonomy($instance);\n\t\tif ( !empty($instance['title']) ) {\n\t\t\t$title = $instance['title'];\n\t\t} else {\n\t\t\tif ( 'post_tag' == $current_taxonomy ) {\n\t\t\t\t$title = __('Tags');\n\t\t\t} else {\n\t\t\t\t$tax = get_taxonomy($current_taxonomy);\n\t\t\t\t$title = $tax->labels->name;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Filter the taxonomy used in the Tag Cloud widget.\n\t\t *\n\t\t * @since 2.8.0\n\t\t * @since 3.0.0 Added taxonomy drop-down.\n\t\t *\n\t\t * @see wp_tag_cloud()\n\t\t *\n\t\t * @param array $current_taxonomy The taxonomy to use in the tag cloud. Default 'tags'.\n\t\t */\n\t\t$tag_cloud = wp_tag_cloud( apply_filters( 'widget_tag_cloud_args', array(\n\t\t\t'taxonomy' => $current_taxonomy,\n\t\t\t'echo' => false\n\t\t) ) );\n\n\t\tif ( empty( $tag_cloud ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );\n\n\t\techo $args['before_widget'];\n\t\tif ( $title ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t}\n\n\t\techo '<div class=\"tagcloud\">';\n\n\t\techo $tag_cloud;\n\n\t\techo \"</div>\\n\";\n\t\techo $args['after_widget'];\n\t}\n\n\t/**\n\t * Handles updating settings for the current Tag Cloud widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Settings to save or bool false to cancel saving.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = array();\n\t\t$instance['title'] = sanitize_text_field( stripslashes( $new_instance['title'] ) );\n\t\t$instance['taxonomy'] = stripslashes($new_instance['taxonomy']);\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the Tag Cloud widget settings form.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$current_taxonomy = $this->_get_current_taxonomy($instance);\n\t\t$title_id = $this->get_field_id( 'title' );\n\t\t$instance['title'] = ! empty( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';\n\n\t\techo '<p><label for=\"' . $title_id .'\">' . __( 'Title:' ) . '</label>\n\t\t\t<input type=\"text\" class=\"widefat\" id=\"' . $title_id .'\" name=\"' . $this->get_field_name( 'title' ) .'\" value=\"' . $instance['title'] .'\" />\n\t\t</p>';\n\n\t\t$taxonomies = get_taxonomies( array( 'show_tagcloud' => true ), 'object' );\n\t\t$id = $this->get_field_id( 'taxonomy' );\n\t\t$name = $this->get_field_name( 'taxonomy' );\n\t\t$input = '<input type=\"hidden\" id=\"' . $id . '\" name=\"' . $name . '\" value=\"%s\" />';\n\n\t\tswitch ( count( $taxonomies ) ) {\n\n\t\t// No tag cloud supporting taxonomies found, display error message\n\t\tcase 0:\n\t\t\techo '<p>' . __( 'The tag cloud will not be displayed since there are no taxonomies that support the tag cloud widget.' ) . '</p>';\n\t\t\tprintf( $input, '' );\n\t\t\tbreak;\n\n\t\t// Just a single tag cloud supporting taxonomy found, no need to display options\n\t\tcase 1:\n\t\t\t$keys = array_keys( $taxonomies );\n\t\t\t$taxonomy = reset( $keys );\n\t\t\tprintf( $input, esc_attr( $taxonomy ) );\n\t\t\tbreak;\n\n\t\t// More than one tag cloud supporting taxonomy found, display options\n\t\tdefault:\n\t\t\tprintf(\n\t\t\t\t'<p><label for=\"%1$s\">%2$s</label>' .\n\t\t\t\t'<select class=\"widefat\" id=\"%1$s\" name=\"%3$s\">',\n\t\t\t\t$id,\n\t\t\t\t__( 'Taxonomy:' ),\n\t\t\t\t$name\n\t\t\t);\n\n\t\t\tforeach ( $taxonomies as $taxonomy => $tax ) {\n\t\t\t\tprintf(\n\t\t\t\t\t'<option value=\"%s\"%s>%s</option>',\n\t\t\t\t\tesc_attr( $taxonomy ),\n\t\t\t\t\tselected( $taxonomy, $current_taxonomy, false ),\n\t\t\t\t\t$tax->labels->name\n\t\t\t\t);\n\t\t\t}\n\n\t\t\techo '</select></p>';\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the taxonomy for the current Tag cloud widget instance.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t * @return string Name of the current taxonomy if set, otherwise 'post_tag'.\n\t */\n\tpublic function _get_current_taxonomy($instance) {\n\t\tif ( !empty($instance['taxonomy']) && taxonomy_exists($instance['taxonomy']) )\n\t\t\treturn $instance['taxonomy'];\n\n\t\treturn 'post_tag';\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets/class-wp-widget-text.php",
    "content": "<?php\n/**\n * Widget API: WP_Widget_Text class\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 4.4.0\n */\n\n/**\n * Core class used to implement a Text widget.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n */\nclass WP_Widget_Text extends WP_Widget {\n\n\t/**\n\t * Sets up a new Text widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t */\n\tpublic function __construct() {\n\t\t$widget_ops = array('classname' => 'widget_text', 'description' => __('Arbitrary text or HTML.'));\n\t\t$control_ops = array('width' => 400, 'height' => 350);\n\t\tparent::__construct('text', __('Text'), $widget_ops, $control_ops);\n\t}\n\n\t/**\n\t * Outputs the content for the current Text widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $args     Display arguments including 'before_title', 'after_title',\n\t *                        'before_widget', and 'after_widget'.\n\t * @param array $instance Settings for the current Text widget instance.\n\t */\n\tpublic function widget( $args, $instance ) {\n\n\t\t/** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */\n\t\t$title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance, $this->id_base );\n\n\t\t$widget_text = ! empty( $instance['text'] ) ? $instance['text'] : '';\n\n\t\t/**\n\t\t * Filter the content of the Text widget.\n\t\t *\n\t\t * @since 2.3.0\n\t\t * @since 4.4.0 Added the `$this` parameter.\n\t\t *\n\t\t * @param string         $widget_text The widget content.\n\t\t * @param array          $instance    Array of settings for the current widget.\n\t\t * @param WP_Widget_Text $this        Current Text widget instance.\n\t\t */\n\t\t$text = apply_filters( 'widget_text', $widget_text, $instance, $this );\n\n\t\techo $args['before_widget'];\n\t\tif ( ! empty( $title ) ) {\n\t\t\techo $args['before_title'] . $title . $args['after_title'];\n\t\t} ?>\n\t\t\t<div class=\"textwidget\"><?php echo !empty( $instance['filter'] ) ? wpautop( $text ) : $text; ?></div>\n\t\t<?php\n\t\techo $args['after_widget'];\n\t}\n\n\t/**\n\t * Handles updating settings for the current Text widget instance.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $new_instance New settings for this instance as input by the user via\n\t *                            WP_Widget::form().\n\t * @param array $old_instance Old settings for this instance.\n\t * @return array Settings to save or bool false to cancel saving.\n\t */\n\tpublic function update( $new_instance, $old_instance ) {\n\t\t$instance = $old_instance;\n\t\t$instance['title'] = sanitize_text_field( $new_instance['title'] );\n\t\tif ( current_user_can('unfiltered_html') )\n\t\t\t$instance['text'] =  $new_instance['text'];\n\t\telse\n\t\t\t$instance['text'] = wp_kses_post( stripslashes( $new_instance['text'] ) );\n\t\t$instance['filter'] = ! empty( $new_instance['filter'] );\n\t\treturn $instance;\n\t}\n\n\t/**\n\t * Outputs the Text widget settings form.\n\t *\n\t * @since 2.8.0\n\t * @access public\n\t *\n\t * @param array $instance Current settings.\n\t */\n\tpublic function form( $instance ) {\n\t\t$instance = wp_parse_args( (array) $instance, array( 'title' => '', 'text' => '' ) );\n\t\t$filter = isset( $instance['filter'] ) ? $instance['filter'] : 0;\n\t\t$title = sanitize_text_field( $instance['title'] );\n\t\t?>\n\t\t<p><label for=\"<?php echo $this->get_field_id('title'); ?>\"><?php _e('Title:'); ?></label>\n\t\t<input class=\"widefat\" id=\"<?php echo $this->get_field_id('title'); ?>\" name=\"<?php echo $this->get_field_name('title'); ?>\" type=\"text\" value=\"<?php echo esc_attr($title); ?>\" /></p>\n\n\t\t<p><label for=\"<?php echo $this->get_field_id( 'text' ); ?>\"><?php _e( 'Content:' ); ?></label>\n\t\t<textarea class=\"widefat\" rows=\"16\" cols=\"20\" id=\"<?php echo $this->get_field_id('text'); ?>\" name=\"<?php echo $this->get_field_name('text'); ?>\"><?php echo esc_textarea( $instance['text'] ); ?></textarea></p>\n\n\t\t<p><input id=\"<?php echo $this->get_field_id('filter'); ?>\" name=\"<?php echo $this->get_field_name('filter'); ?>\" type=\"checkbox\"<?php checked( $filter ); ?> />&nbsp;<label for=\"<?php echo $this->get_field_id('filter'); ?>\"><?php _e('Automatically add paragraphs'); ?></label></p>\n\t\t<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/widgets.php",
    "content": "<?php\n/**\n * Core Widgets API\n *\n * This API is used for creating dynamic sidebar without hardcoding functionality into\n * themes\n *\n * Includes both internal WordPress routines and theme-use routines.\n *\n * This functionality was found in a plugin before the WordPress 2.2 release, which\n * included it in the core from that point on.\n *\n * @link https://codex.wordpress.org/Plugins/WordPress_Widgets WordPress Widgets\n * @link https://codex.wordpress.org/Plugins/WordPress_Widgets_Api Widgets API\n *\n * @package WordPress\n * @subpackage Widgets\n * @since 2.2.0\n */\n\n//\n// Global Variables\n//\n\n/** @ignore */\nglobal $wp_registered_sidebars, $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates;\n\n/**\n * Stores the sidebars, since many themes can have more than one.\n *\n * @global array $wp_registered_sidebars\n * @since 2.2.0\n */\n$wp_registered_sidebars = array();\n\n/**\n * Stores the registered widgets.\n *\n * @global array $wp_registered_widgets\n * @since 2.2.0\n */\n$wp_registered_widgets = array();\n\n/**\n * Stores the registered widget control (options).\n *\n * @global array $wp_registered_widget_controls\n * @since 2.2.0\n */\n$wp_registered_widget_controls = array();\n/**\n * @global array $wp_registered_widget_updates\n */\n$wp_registered_widget_updates = array();\n\n/**\n * Private\n *\n * @global array $_wp_sidebars_widgets\n */\n$_wp_sidebars_widgets = array();\n\n/**\n * Private\n *\n * @global array $_wp_deprecated_widgets_callbacks\n */\n$GLOBALS['_wp_deprecated_widgets_callbacks'] = array(\n\t'wp_widget_pages',\n\t'wp_widget_pages_control',\n\t'wp_widget_calendar',\n\t'wp_widget_calendar_control',\n\t'wp_widget_archives',\n\t'wp_widget_archives_control',\n\t'wp_widget_links',\n\t'wp_widget_meta',\n\t'wp_widget_meta_control',\n\t'wp_widget_search',\n\t'wp_widget_recent_entries',\n\t'wp_widget_recent_entries_control',\n\t'wp_widget_tag_cloud',\n\t'wp_widget_tag_cloud_control',\n\t'wp_widget_categories',\n\t'wp_widget_categories_control',\n\t'wp_widget_text',\n\t'wp_widget_text_control',\n\t'wp_widget_rss',\n\t'wp_widget_rss_control',\n\t'wp_widget_recent_comments',\n\t'wp_widget_recent_comments_control'\n);\n\n//\n// Template tags & API functions\n//\n\n/**\n * Register a widget\n *\n * Registers a WP_Widget widget\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n *\n * @global WP_Widget_Factory $wp_widget_factory\n *\n * @param string $widget_class The name of a class that extends WP_Widget\n */\nfunction register_widget($widget_class) {\n\tglobal $wp_widget_factory;\n\n\t$wp_widget_factory->register($widget_class);\n}\n\n/**\n * Unregister a widget\n *\n * Unregisters a WP_Widget widget. Useful for unregistering default widgets.\n * Run within a function hooked to the widgets_init action.\n *\n * @since 2.8.0\n *\n * @see WP_Widget\n *\n * @global WP_Widget_Factory $wp_widget_factory\n *\n * @param string $widget_class The name of a class that extends WP_Widget\n */\nfunction unregister_widget($widget_class) {\n\tglobal $wp_widget_factory;\n\n\t$wp_widget_factory->unregister($widget_class);\n}\n\n/**\n * Creates multiple sidebars.\n *\n * If you wanted to quickly create multiple sidebars for a theme or internally.\n * This function will allow you to do so. If you don't pass the 'name' and/or\n * 'id' in `$args`, then they will be built for you.\n *\n * @since 2.2.0\n *\n * @see register_sidebar() The second parameter is documented by register_sidebar() and is the same here.\n *\n * @global array $wp_registered_sidebars\n *\n * @param int          $number Optional. Number of sidebars to create. Default 1.\n * @param array|string $args {\n *     Optional. Array or string of arguments for building a sidebar.\n *\n *     @type string $id   The base string of the unique identifier for each sidebar. If provided, and multiple\n *                        sidebars are being defined, the id will have \"-2\" appended, and so on.\n *                        Default 'sidebar-' followed by the number the sidebar creation is currently at.\n *     @type string $name The name or title for the sidebars displayed in the admin dashboard. If registering\n *                        more than one sidebar, include '%d' in the string as a placeholder for the uniquely\n *                        assigned number for each sidebar.\n *                        Default 'Sidebar' for the first sidebar, otherwise 'Sidebar %d'.\n * }\n */\nfunction register_sidebars( $number = 1, $args = array() ) {\n\tglobal $wp_registered_sidebars;\n\t$number = (int) $number;\n\n\tif ( is_string($args) )\n\t\tparse_str($args, $args);\n\n\tfor ( $i = 1; $i <= $number; $i++ ) {\n\t\t$_args = $args;\n\n\t\tif ( $number > 1 )\n\t\t\t$_args['name'] = isset($args['name']) ? sprintf($args['name'], $i) : sprintf(__('Sidebar %d'), $i);\n\t\telse\n\t\t\t$_args['name'] = isset($args['name']) ? $args['name'] : __('Sidebar');\n\n\t\t// Custom specified ID's are suffixed if they exist already.\n\t\t// Automatically generated sidebar names need to be suffixed regardless starting at -0\n\t\tif ( isset($args['id']) ) {\n\t\t\t$_args['id'] = $args['id'];\n\t\t\t$n = 2; // Start at -2 for conflicting custom ID's\n\t\t\twhile ( is_registered_sidebar( $_args['id'] ) ) {\n\t\t\t\t$_args['id'] = $args['id'] . '-' . $n++;\n\t\t\t}\n\t\t} else {\n\t\t\t$n = count( $wp_registered_sidebars );\n\t\t\tdo {\n\t\t\t\t$_args['id'] = 'sidebar-' . ++$n;\n\t\t\t} while ( is_registered_sidebar( $_args['id'] ) );\n\t\t}\n\t\tregister_sidebar($_args);\n\t}\n}\n\n/**\n * Builds the definition for a single sidebar and returns the ID.\n *\n * Accepts either a string or an array and then parses that against a set\n * of default arguments for the new sidebar. WordPress will automatically\n * generate a sidebar ID and name based on the current number of registered\n * sidebars if those arguments are not included.\n *\n * When allowing for automatic generation of the name and ID parameters, keep\n * in mind that the incrementor for your sidebar can change over time depending\n * on what other plugins and themes are installed.\n *\n * If theme support for 'widgets' has not yet been added when this function is\n * called, it will be automatically enabled through the use of add_theme_support()\n *\n * @since 2.2.0\n *\n * @global array $wp_registered_sidebars Stores the new sidebar in this array by sidebar ID.\n *\n * @param array|string $args {\n *     Optional. Array or string of arguments for the sidebar being registered.\n *\n *     @type string $name          The name or title of the sidebar displayed in the Widgets\n *                                 interface. Default 'Sidebar $instance'.\n *     @type string $id            The unique identifier by which the sidebar will be called.\n *                                 Default 'sidebar-$instance'.\n *     @type string $description   Description of the sidebar, displayed in the Widgets interface.\n *                                 Default empty string.\n *     @type string $class         Extra CSS class to assign to the sidebar in the Widgets interface.\n *                                 Default empty.\n *     @type string $before_widget HTML content to prepend to each widget's HTML output when\n *                                 assigned to this sidebar. Default is an opening list item element.\n *     @type string $after_widget  HTML content to append to each widget's HTML output when\n *                                 assigned to this sidebar. Default is a closing list item element.\n *     @type string $before_title  HTML content to prepend to the sidebar title when displayed.\n *                                 Default is an opening h2 element.\n *     @type string $after_title   HTML content to append to the sidebar title when displayed.\n *                                 Default is a closing h2 element.\n * }\n * @return string Sidebar ID added to $wp_registered_sidebars global.\n */\nfunction register_sidebar($args = array()) {\n\tglobal $wp_registered_sidebars;\n\n\t$i = count($wp_registered_sidebars) + 1;\n\n\t$id_is_empty = empty( $args['id'] );\n\n\t$defaults = array(\n\t\t'name' => sprintf(__('Sidebar %d'), $i ),\n\t\t'id' => \"sidebar-$i\",\n\t\t'description' => '',\n\t\t'class' => '',\n\t\t'before_widget' => '<li id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget' => \"</li>\\n\",\n\t\t'before_title' => '<h2 class=\"widgettitle\">',\n\t\t'after_title' => \"</h2>\\n\",\n\t);\n\n\t$sidebar = wp_parse_args( $args, $defaults );\n\n\tif ( $id_is_empty ) {\n\t\t/* translators: 1: the id argument, 2: sidebar name, 3: recommended id value */\n\t\t_doing_it_wrong( __FUNCTION__, sprintf( __( 'No %1$s was set in the arguments array for the \"%2$s\" sidebar. Defaulting to \"%3$s\". Manually set the %1$s to \"%3$s\" to silence this notice and keep existing sidebar content.' ), '<code>id</code>', $sidebar['name'], $sidebar['id'] ), '4.2.0' );\n\t}\n\n\t$wp_registered_sidebars[$sidebar['id']] = $sidebar;\n\n\tadd_theme_support('widgets');\n\n\t/**\n\t * Fires once a sidebar has been registered.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $sidebar Parsed arguments for the registered sidebar.\n\t */\n\tdo_action( 'register_sidebar', $sidebar );\n\n\treturn $sidebar['id'];\n}\n\n/**\n * Removes a sidebar from the list.\n *\n * @since 2.2.0\n *\n * @global array $wp_registered_sidebars Stores the new sidebar in this array by sidebar ID.\n *\n * @param string $name The ID of the sidebar when it was added.\n */\nfunction unregister_sidebar( $name ) {\n\tglobal $wp_registered_sidebars;\n\n\tunset( $wp_registered_sidebars[ $name ] );\n}\n\n/**\n * Checks if a sidebar is registered.\n *\n * @since 4.4.0\n *\n * @global array $wp_registered_sidebars Registered sidebars.\n *\n * @param string|int $sidebar_id The ID of the sidebar when it was registered.\n * @return bool True if the sidebar is registered, false otherwise.\n */\nfunction is_registered_sidebar( $sidebar_id ) {\n\tglobal $wp_registered_sidebars;\n\n\treturn isset( $wp_registered_sidebars[ $sidebar_id ] );\n}\n\n/**\n * Register an instance of a widget.\n *\n * The default widget option is 'classname' that can be overridden.\n *\n * The function can also be used to un-register widgets when `$output_callback`\n * parameter is an empty string.\n *\n * @since 2.2.0\n *\n * @global array $wp_registered_widgets       Uses stored registered widgets.\n * @global array $wp_register_widget_defaults Retrieves widget defaults.\n * @global array $wp_registered_widget_updates\n * @global array $_wp_deprecated_widgets_callbacks\n *\n * @param int|string $id              Widget ID.\n * @param string     $name            Widget display title.\n * @param callable   $output_callback Run when widget is called.\n * @param array      $options {\n *     Optional. An array of supplementary widget options for the instance.\n *\n *     @type string $classname   Class name for the widget's HTML container. Default is a shortened\n *                               version of the output callback name.\n *     @type string $description Widget description for display in the widget administration\n *                               panel and/or theme.\n * }\n */\nfunction wp_register_sidebar_widget( $id, $name, $output_callback, $options = array() ) {\n\tglobal $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_widget_updates, $_wp_deprecated_widgets_callbacks;\n\n\t$id = strtolower($id);\n\n\tif ( empty($output_callback) ) {\n\t\tunset($wp_registered_widgets[$id]);\n\t\treturn;\n\t}\n\n\t$id_base = _get_widget_id_base($id);\n\tif ( in_array($output_callback, $_wp_deprecated_widgets_callbacks, true) && !is_callable($output_callback) ) {\n\t\tunset( $wp_registered_widget_controls[ $id ] );\n\t\tunset( $wp_registered_widget_updates[ $id_base ] );\n\t\treturn;\n\t}\n\n\t$defaults = array('classname' => $output_callback);\n\t$options = wp_parse_args($options, $defaults);\n\t$widget = array(\n\t\t'name' => $name,\n\t\t'id' => $id,\n\t\t'callback' => $output_callback,\n\t\t'params' => array_slice(func_get_args(), 4)\n\t);\n\t$widget = array_merge($widget, $options);\n\n\tif ( is_callable($output_callback) && ( !isset($wp_registered_widgets[$id]) || did_action( 'widgets_init' ) ) ) {\n\n\t\t/**\n\t\t * Fires once for each registered widget.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $widget An array of default widget arguments.\n\t\t */\n\t\tdo_action( 'wp_register_sidebar_widget', $widget );\n\t\t$wp_registered_widgets[$id] = $widget;\n\t}\n}\n\n/**\n * Retrieve description for widget.\n *\n * When registering widgets, the options can also include 'description' that\n * describes the widget for display on the widget administration panel or\n * in the theme.\n *\n * @since 2.5.0\n *\n * @global array $wp_registered_widgets\n *\n * @param int|string $id Widget ID.\n * @return string|void Widget description, if available.\n */\nfunction wp_widget_description( $id ) {\n\tif ( !is_scalar($id) )\n\t\treturn;\n\n\tglobal $wp_registered_widgets;\n\n\tif ( isset($wp_registered_widgets[$id]['description']) )\n\t\treturn esc_html( $wp_registered_widgets[$id]['description'] );\n}\n\n/**\n * Retrieve description for a sidebar.\n *\n * When registering sidebars a 'description' parameter can be included that\n * describes the sidebar for display on the widget administration panel.\n *\n * @since 2.9.0\n *\n * @global array $wp_registered_sidebars\n *\n * @param string $id sidebar ID.\n * @return string|void Sidebar description, if available.\n */\nfunction wp_sidebar_description( $id ) {\n\tif ( !is_scalar($id) )\n\t\treturn;\n\n\tglobal $wp_registered_sidebars;\n\n\tif ( isset($wp_registered_sidebars[$id]['description']) )\n\t\treturn esc_html( $wp_registered_sidebars[$id]['description'] );\n}\n\n/**\n * Remove widget from sidebar.\n *\n * @since 2.2.0\n *\n * @param int|string $id Widget ID.\n */\nfunction wp_unregister_sidebar_widget($id) {\n\n\t/**\n\t * Fires just before a widget is removed from a sidebar.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param int $id The widget ID.\n\t */\n\tdo_action( 'wp_unregister_sidebar_widget', $id );\n\n\twp_register_sidebar_widget($id, '', '');\n\twp_unregister_widget_control($id);\n}\n\n/**\n * Registers widget control callback for customizing options.\n *\n * The options contains the 'height', 'width', and 'id_base' keys. The 'height'\n * option is never used. The 'width' option is the width of the fully expanded\n * control form, but try hard to use the default width. The 'id_base' is for\n * multi-widgets (widgets which allow multiple instances such as the text\n * widget), an id_base must be provided. The widget id will end up looking like\n * `{$id_base}-{$unique_number}`.\n *\n * @since 2.2.0\n *\n * @todo Document `$options` as a hash notation, re: WP_Widget::__construct() cross-reference.\n * @todo `$params` parameter?\n *\n * @global array $wp_registered_widget_controls\n * @global array $wp_registered_widget_updates\n * @global array $wp_registered_widgets\n * @global array $_wp_deprecated_widgets_callbacks\n *\n * @param int|string   $id               Sidebar ID.\n * @param string       $name             Sidebar display name.\n * @param callable     $control_callback Run when sidebar is displayed.\n * @param array|string $options          Optional. Widget options. See description above. Default empty array.\n */\nfunction wp_register_widget_control( $id, $name, $control_callback, $options = array() ) {\n\tglobal $wp_registered_widget_controls, $wp_registered_widget_updates, $wp_registered_widgets, $_wp_deprecated_widgets_callbacks;\n\n\t$id = strtolower($id);\n\t$id_base = _get_widget_id_base($id);\n\n\tif ( empty($control_callback) ) {\n\t\tunset($wp_registered_widget_controls[$id]);\n\t\tunset($wp_registered_widget_updates[$id_base]);\n\t\treturn;\n\t}\n\n\tif ( in_array($control_callback, $_wp_deprecated_widgets_callbacks, true) && !is_callable($control_callback) ) {\n\t\tunset( $wp_registered_widgets[ $id ] );\n\t\treturn;\n\t}\n\n\tif ( isset($wp_registered_widget_controls[$id]) && !did_action( 'widgets_init' ) )\n\t\treturn;\n\n\t$defaults = array('width' => 250, 'height' => 200 ); // height is never used\n\t$options = wp_parse_args($options, $defaults);\n\t$options['width'] = (int) $options['width'];\n\t$options['height'] = (int) $options['height'];\n\n\t$widget = array(\n\t\t'name' => $name,\n\t\t'id' => $id,\n\t\t'callback' => $control_callback,\n\t\t'params' => array_slice(func_get_args(), 4)\n\t);\n\t$widget = array_merge($widget, $options);\n\n\t$wp_registered_widget_controls[$id] = $widget;\n\n\tif ( isset($wp_registered_widget_updates[$id_base]) )\n\t\treturn;\n\n\tif ( isset($widget['params'][0]['number']) )\n\t\t$widget['params'][0]['number'] = -1;\n\n\tunset($widget['width'], $widget['height'], $widget['name'], $widget['id']);\n\t$wp_registered_widget_updates[$id_base] = $widget;\n}\n\n/**\n * @global array $wp_registered_widget_updates\n *\n * @param string   $id_base\n * @param callable $update_callback\n * @param array    $options\n */\nfunction _register_widget_update_callback($id_base, $update_callback, $options = array()) {\n\tglobal $wp_registered_widget_updates;\n\n\tif ( isset($wp_registered_widget_updates[$id_base]) ) {\n\t\tif ( empty($update_callback) )\n\t\t\tunset($wp_registered_widget_updates[$id_base]);\n\t\treturn;\n\t}\n\n\t$widget = array(\n\t\t'callback' => $update_callback,\n\t\t'params' => array_slice(func_get_args(), 3)\n\t);\n\n\t$widget = array_merge($widget, $options);\n\t$wp_registered_widget_updates[$id_base] = $widget;\n}\n\n/**\n *\n * @global array $wp_registered_widget_controls\n *\n * @param int|string $id\n * @param string     $name\n * @param callable   $form_callback\n * @param array      $options\n */\nfunction _register_widget_form_callback($id, $name, $form_callback, $options = array()) {\n\tglobal $wp_registered_widget_controls;\n\n\t$id = strtolower($id);\n\n\tif ( empty($form_callback) ) {\n\t\tunset($wp_registered_widget_controls[$id]);\n\t\treturn;\n\t}\n\n\tif ( isset($wp_registered_widget_controls[$id]) && !did_action( 'widgets_init' ) )\n\t\treturn;\n\n\t$defaults = array('width' => 250, 'height' => 200 );\n\t$options = wp_parse_args($options, $defaults);\n\t$options['width'] = (int) $options['width'];\n\t$options['height'] = (int) $options['height'];\n\n\t$widget = array(\n\t\t'name' => $name,\n\t\t'id' => $id,\n\t\t'callback' => $form_callback,\n\t\t'params' => array_slice(func_get_args(), 4)\n\t);\n\t$widget = array_merge($widget, $options);\n\n\t$wp_registered_widget_controls[$id] = $widget;\n}\n\n/**\n * Remove control callback for widget.\n *\n * @since 2.2.0\n *\n * @param int|string $id Widget ID.\n */\nfunction wp_unregister_widget_control($id) {\n\twp_register_widget_control( $id, '', '' );\n}\n\n/**\n * Display dynamic sidebar.\n *\n * By default this displays the default sidebar or 'sidebar-1'. If your theme specifies the 'id' or\n * 'name' parameter for its registered sidebars you can pass an id or name as the $index parameter.\n * Otherwise, you can pass in a numerical index to display the sidebar at that index.\n *\n * @since 2.2.0\n *\n * @global array $wp_registered_sidebars\n * @global array $wp_registered_widgets\n *\n * @param int|string $index Optional, default is 1. Index, name or ID of dynamic sidebar.\n * @return bool True, if widget sidebar was found and called. False if not found or not called.\n */\nfunction dynamic_sidebar( $index = 1 ) {\n\tglobal $wp_registered_sidebars, $wp_registered_widgets;\n\n\tif ( is_int( $index ) ) {\n\t\t$index = \"sidebar-$index\";\n\t} else {\n\t\t$index = sanitize_title( $index );\n\t\tforeach ( (array) $wp_registered_sidebars as $key => $value ) {\n\t\t\tif ( sanitize_title( $value['name'] ) == $index ) {\n\t\t\t\t$index = $key;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t$sidebars_widgets = wp_get_sidebars_widgets();\n\tif ( empty( $wp_registered_sidebars[ $index ] ) || empty( $sidebars_widgets[ $index ] ) || ! is_array( $sidebars_widgets[ $index ] ) ) {\n\t\t/** This action is documented in wp-includes/widget.php */\n\t\tdo_action( 'dynamic_sidebar_before', $index, false );\n\t\t/** This action is documented in wp-includes/widget.php */\n\t\tdo_action( 'dynamic_sidebar_after',  $index, false );\n\t\t/** This filter is documented in wp-includes/widget.php */\n\t\treturn apply_filters( 'dynamic_sidebar_has_widgets', false, $index );\n\t}\n\n\t/**\n\t * Fires before widgets are rendered in a dynamic sidebar.\n\t *\n\t * Note: The action also fires for empty sidebars, and on both the front-end\n\t * and back-end, including the Inactive Widgets sidebar on the Widgets screen.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param int|string $index       Index, name, or ID of the dynamic sidebar.\n\t * @param bool       $has_widgets Whether the sidebar is populated with widgets.\n\t *                                Default true.\n\t */\n\tdo_action( 'dynamic_sidebar_before', $index, true );\n\t$sidebar = $wp_registered_sidebars[$index];\n\n\t$did_one = false;\n\tforeach ( (array) $sidebars_widgets[$index] as $id ) {\n\n\t\tif ( !isset($wp_registered_widgets[$id]) ) continue;\n\n\t\t$params = array_merge(\n\t\t\tarray( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),\n\t\t\t(array) $wp_registered_widgets[$id]['params']\n\t\t);\n\n\t\t// Substitute HTML id and class attributes into before_widget\n\t\t$classname_ = '';\n\t\tforeach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {\n\t\t\tif ( is_string($cn) )\n\t\t\t\t$classname_ .= '_' . $cn;\n\t\t\telseif ( is_object($cn) )\n\t\t\t\t$classname_ .= '_' . get_class($cn);\n\t\t}\n\t\t$classname_ = ltrim($classname_, '_');\n\t\t$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);\n\n\t\t/**\n\t\t * Filter the parameters passed to a widget's display callback.\n\t\t *\n\t\t * Note: The filter is evaluated on both the front-end and back-end,\n\t\t * including for the Inactive Widgets sidebar on the Widgets screen.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @see register_sidebar()\n\t\t *\n\t\t * @param array $params {\n\t\t *     @type array $args  {\n\t\t *         An array of widget display arguments.\n\t\t *\n\t\t *         @type string $name          Name of the sidebar the widget is assigned to.\n\t\t *         @type string $id            ID of the sidebar the widget is assigned to.\n\t\t *         @type string $description   The sidebar description.\n\t\t *         @type string $class         CSS class applied to the sidebar container.\n\t\t *         @type string $before_widget HTML markup to prepend to each widget in the sidebar.\n\t\t *         @type string $after_widget  HTML markup to append to each widget in the sidebar.\n\t\t *         @type string $before_title  HTML markup to prepend to the widget title when displayed.\n\t\t *         @type string $after_title   HTML markup to append to the widget title when displayed.\n\t\t *         @type string $widget_id     ID of the widget.\n\t\t *         @type string $widget_name   Name of the widget.\n\t\t *     }\n\t\t *     @type array $widget_args {\n\t\t *         An array of multi-widget arguments.\n\t\t *\n\t\t *         @type int $number Number increment used for multiples of the same widget.\n\t\t *     }\n\t\t * }\n\t\t */\n\t\t$params = apply_filters( 'dynamic_sidebar_params', $params );\n\n\t\t$callback = $wp_registered_widgets[$id]['callback'];\n\n\t\t/**\n\t\t * Fires before a widget's display callback is called.\n\t\t *\n\t\t * Note: The action fires on both the front-end and back-end, including\n\t\t * for widgets in the Inactive Widgets sidebar on the Widgets screen.\n\t\t *\n\t\t * The action is not fired for empty sidebars.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param array $widget_id {\n\t\t *     An associative array of widget arguments.\n\t\t *\n\t\t *     @type string $name                Name of the widget.\n\t\t *     @type string $id                  Widget ID.\n\t\t *     @type array|callable $callback    When the hook is fired on the front-end, $callback is an array\n\t\t *                                       containing the widget object. Fired on the back-end, $callback\n\t\t *                                       is 'wp_widget_control', see $_callback.\n\t\t *     @type array          $params      An associative array of multi-widget arguments.\n\t\t *     @type string         $classname   CSS class applied to the widget container.\n\t\t *     @type string         $description The widget description.\n\t\t *     @type array          $_callback   When the hook is fired on the back-end, $_callback is populated\n\t\t *                                       with an array containing the widget object, see $callback.\n\t\t * }\n\t\t */\n\t\tdo_action( 'dynamic_sidebar', $wp_registered_widgets[ $id ] );\n\n\t\tif ( is_callable($callback) ) {\n\t\t\tcall_user_func_array($callback, $params);\n\t\t\t$did_one = true;\n\t\t}\n\t}\n\n\t/**\n\t * Fires after widgets are rendered in a dynamic sidebar.\n\t *\n\t * Note: The action also fires for empty sidebars, and on both the front-end\n\t * and back-end, including the Inactive Widgets sidebar on the Widgets screen.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param int|string $index       Index, name, or ID of the dynamic sidebar.\n\t * @param bool       $has_widgets Whether the sidebar is populated with widgets.\n\t *                                Default true.\n\t */\n\tdo_action( 'dynamic_sidebar_after', $index, true );\n\n\t/**\n\t * Filter whether a sidebar has widgets.\n\t *\n\t * Note: The filter is also evaluated for empty sidebars, and on both the front-end\n\t * and back-end, including the Inactive Widgets sidebar on the Widgets screen.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param bool       $did_one Whether at least one widget was rendered in the sidebar.\n\t *                            Default false.\n\t * @param int|string $index   Index, name, or ID of the dynamic sidebar.\n\t */\n\treturn apply_filters( 'dynamic_sidebar_has_widgets', $did_one, $index );\n}\n\n/**\n * Whether widget is displayed on the front-end.\n *\n * Either $callback or $id_base can be used\n * $id_base is the first argument when extending WP_Widget class\n * Without the optional $widget_id parameter, returns the ID of the first sidebar\n * in which the first instance of the widget with the given callback or $id_base is found.\n * With the $widget_id parameter, returns the ID of the sidebar where\n * the widget with that callback/$id_base AND that ID is found.\n *\n * NOTE: $widget_id and $id_base are the same for single widgets. To be effective\n * this function has to run after widgets have initialized, at action 'init' or later.\n *\n * @since 2.2.0\n *\n * @global array $wp_registered_widgets\n *\n * @param string $callback      Optional, Widget callback to check.\n * @param int    $widget_id     Optional, but needed for checking. Widget ID.\n * @param string $id_base       Optional, the base ID of a widget created by extending WP_Widget.\n * @param bool   $skip_inactive Optional, whether to check in 'wp_inactive_widgets'.\n * @return string|false False if widget is not active or id of sidebar in which the widget is active.\n */\nfunction is_active_widget($callback = false, $widget_id = false, $id_base = false, $skip_inactive = true) {\n\tglobal $wp_registered_widgets;\n\n\t$sidebars_widgets = wp_get_sidebars_widgets();\n\n\tif ( is_array($sidebars_widgets) ) {\n\t\tforeach ( $sidebars_widgets as $sidebar => $widgets ) {\n\t\t\tif ( $skip_inactive && ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( is_array($widgets) ) {\n\t\t\t\tforeach ( $widgets as $widget ) {\n\t\t\t\t\tif ( ( $callback && isset($wp_registered_widgets[$widget]['callback']) && $wp_registered_widgets[$widget]['callback'] == $callback ) || ( $id_base && _get_widget_id_base($widget) == $id_base ) ) {\n\t\t\t\t\t\tif ( !$widget_id || $widget_id == $wp_registered_widgets[$widget]['id'] )\n\t\t\t\t\t\t\treturn $sidebar;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Whether the dynamic sidebar is enabled and used by theme.\n *\n * @since 2.2.0\n *\n * @global array $wp_registered_widgets\n * @global array $wp_registered_sidebars\n *\n * @return bool True, if using widgets. False, if not using widgets.\n */\nfunction is_dynamic_sidebar() {\n\tglobal $wp_registered_widgets, $wp_registered_sidebars;\n\t$sidebars_widgets = get_option('sidebars_widgets');\n\tforeach ( (array) $wp_registered_sidebars as $index => $sidebar ) {\n\t\tif ( count($sidebars_widgets[$index]) ) {\n\t\t\tforeach ( (array) $sidebars_widgets[$index] as $widget )\n\t\t\t\tif ( array_key_exists($widget, $wp_registered_widgets) )\n\t\t\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Whether a sidebar is in use.\n *\n * @since 2.8.0\n *\n * @param string|int $index Sidebar name, id or number to check.\n * @return bool true if the sidebar is in use, false otherwise.\n */\nfunction is_active_sidebar( $index ) {\n\t$index = ( is_int($index) ) ? \"sidebar-$index\" : sanitize_title($index);\n\t$sidebars_widgets = wp_get_sidebars_widgets();\n\t$is_active_sidebar = ! empty( $sidebars_widgets[$index] );\n\n\t/**\n\t * Filter whether a dynamic sidebar is considered \"active\".\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param bool       $is_active_sidebar Whether or not the sidebar should be considered \"active\".\n\t *                                      In other words, whether the sidebar contains any widgets.\n\t * @param int|string $index             Index, name, or ID of the dynamic sidebar.\n\t */\n\treturn apply_filters( 'is_active_sidebar', $is_active_sidebar, $index );\n}\n\n//\n// Internal Functions\n//\n\n/**\n * Retrieve full list of sidebars and their widget instance IDs.\n *\n * Will upgrade sidebar widget list, if needed. Will also save updated list, if\n * needed.\n *\n * @since 2.2.0\n * @access private\n *\n * @global array $_wp_sidebars_widgets\n * @global array $sidebars_widgets\n *\n * @param bool $deprecated Not used (argument deprecated).\n * @return array Upgraded list of widgets to version 3 array format when called from the admin.\n */\nfunction wp_get_sidebars_widgets( $deprecated = true ) {\n\tif ( $deprecated !== true )\n\t\t_deprecated_argument( __FUNCTION__, '2.8.1' );\n\n\tglobal $_wp_sidebars_widgets, $sidebars_widgets;\n\n\t// If loading from front page, consult $_wp_sidebars_widgets rather than options\n\t// to see if wp_convert_widget_settings() has made manipulations in memory.\n\tif ( !is_admin() ) {\n\t\tif ( empty($_wp_sidebars_widgets) )\n\t\t\t$_wp_sidebars_widgets = get_option('sidebars_widgets', array());\n\n\t\t$sidebars_widgets = $_wp_sidebars_widgets;\n\t} else {\n\t\t$sidebars_widgets = get_option('sidebars_widgets', array());\n\t}\n\n\tif ( is_array( $sidebars_widgets ) && isset($sidebars_widgets['array_version']) )\n\t\tunset($sidebars_widgets['array_version']);\n\n\t/**\n\t * Filter the list of sidebars and their widgets.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @param array $sidebars_widgets An associative array of sidebars and their widgets.\n\t */\n\treturn apply_filters( 'sidebars_widgets', $sidebars_widgets );\n}\n\n/**\n * Set the sidebar widget option to update sidebars.\n *\n * @since 2.2.0\n * @access private\n *\n * @param array $sidebars_widgets Sidebar widgets and their settings.\n */\nfunction wp_set_sidebars_widgets( $sidebars_widgets ) {\n\tif ( !isset( $sidebars_widgets['array_version'] ) )\n\t\t$sidebars_widgets['array_version'] = 3;\n\tupdate_option( 'sidebars_widgets', $sidebars_widgets );\n}\n\n/**\n * Retrieve default registered sidebars list.\n *\n * @since 2.2.0\n * @access private\n *\n * @global array $wp_registered_sidebars\n *\n * @return array\n */\nfunction wp_get_widget_defaults() {\n\tglobal $wp_registered_sidebars;\n\n\t$defaults = array();\n\n\tforeach ( (array) $wp_registered_sidebars as $index => $sidebar )\n\t\t$defaults[$index] = array();\n\n\treturn $defaults;\n}\n\n/**\n * Convert the widget settings from single to multi-widget format.\n *\n * @since 2.8.0\n *\n * @global array $_wp_sidebars_widgets\n *\n * @param string $base_name\n * @param string $option_name\n * @param array  $settings\n * @return array\n */\nfunction wp_convert_widget_settings($base_name, $option_name, $settings) {\n\t// This test may need expanding.\n\t$single = $changed = false;\n\tif ( empty($settings) ) {\n\t\t$single = true;\n\t} else {\n\t\tforeach ( array_keys($settings) as $number ) {\n\t\t\tif ( 'number' == $number )\n\t\t\t\tcontinue;\n\t\t\tif ( !is_numeric($number) ) {\n\t\t\t\t$single = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( $single ) {\n\t\t$settings = array( 2 => $settings );\n\n\t\t// If loading from the front page, update sidebar in memory but don't save to options\n\t\tif ( is_admin() ) {\n\t\t\t$sidebars_widgets = get_option('sidebars_widgets');\n\t\t} else {\n\t\t\tif ( empty($GLOBALS['_wp_sidebars_widgets']) )\n\t\t\t\t$GLOBALS['_wp_sidebars_widgets'] = get_option('sidebars_widgets', array());\n\t\t\t$sidebars_widgets = &$GLOBALS['_wp_sidebars_widgets'];\n\t\t}\n\n\t\tforeach ( (array) $sidebars_widgets as $index => $sidebar ) {\n\t\t\tif ( is_array($sidebar) ) {\n\t\t\t\tforeach ( $sidebar as $i => $name ) {\n\t\t\t\t\tif ( $base_name == $name ) {\n\t\t\t\t\t\t$sidebars_widgets[$index][$i] = \"$name-2\";\n\t\t\t\t\t\t$changed = true;\n\t\t\t\t\t\tbreak 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( is_admin() && $changed )\n\t\t\tupdate_option('sidebars_widgets', $sidebars_widgets);\n\t}\n\n\t$settings['_multiwidget'] = 1;\n\tif ( is_admin() )\n\t\tupdate_option( $option_name, $settings );\n\n\treturn $settings;\n}\n\n/**\n * Output an arbitrary widget as a template tag.\n *\n * @since 2.8.0\n *\n * @global WP_Widget_Factory $wp_widget_factory\n *\n * @param string $widget   The widget's PHP class name (see class-wp-widget.php).\n * @param array  $instance Optional. The widget's instance settings. Default empty array.\n * @param array  $args {\n *     Optional. Array of arguments to configure the display of the widget.\n *\n *     @type string $before_widget HTML content that will be prepended to the widget's HTML output.\n *                                 Default `<div class=\"widget %s\">`, where `%s` is the widget's class name.\n *     @type string $after_widget  HTML content that will be appended to the widget's HTML output.\n *                                 Default `</div>`.\n *     @type string $before_title  HTML content that will be prepended to the widget's title when displayed.\n *                                 Default `<h2 class=\"widgettitle\">`.\n *     @type string $after_title   HTML content that will be appended to the widget's title when displayed.\n *                                 Default `</h2>`.\n * }\n */\nfunction the_widget( $widget, $instance = array(), $args = array() ) {\n\tglobal $wp_widget_factory;\n\n\t$widget_obj = $wp_widget_factory->widgets[$widget];\n\tif ( ! ( $widget_obj instanceof WP_Widget ) ) {\n\t\treturn;\n\t}\n\n\t$default_args = array(\n\t\t'before_widget' => '<div class=\"widget %s\">',\n\t\t'after_widget'  => \"</div>\",\n\t\t'before_title'  => '<h2 class=\"widgettitle\">',\n\t\t'after_title'   => '</h2>',\n\t);\n\t$args = wp_parse_args( $args, $default_args );\n\t$args['before_widget'] = sprintf( $args['before_widget'], $widget_obj->widget_options['classname'] );\n\n\t$instance = wp_parse_args($instance);\n\n\t/**\n\t * Fires before rendering the requested widget.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $widget   The widget's class name.\n\t * @param array  $instance The current widget instance's settings.\n\t * @param array  $args     An array of the widget's sidebar arguments.\n\t */\n\tdo_action( 'the_widget', $widget, $instance, $args );\n\n\t$widget_obj->_set(-1);\n\t$widget_obj->widget($args, $instance);\n}\n\n/**\n * Private\n *\n * @return string\n */\nfunction _get_widget_id_base($id) {\n\treturn preg_replace( '/-[0-9]+$/', '', $id );\n}\n\n/**\n * Handle sidebars config after theme change\n *\n * @access private\n * @since 3.3.0\n *\n * @global array $sidebars_widgets\n */\nfunction _wp_sidebars_changed() {\n\tglobal $sidebars_widgets;\n\n\tif ( ! is_array( $sidebars_widgets ) )\n\t\t$sidebars_widgets = wp_get_sidebars_widgets();\n\n\tretrieve_widgets(true);\n}\n\n/**\n * Look for \"lost\" widgets, this has to run at least on each theme change.\n *\n * @since 2.8.0\n *\n * @global array $wp_registered_sidebars\n * @global array $sidebars_widgets\n * @global array $wp_registered_widgets\n *\n * @param string|bool $theme_changed Whether the theme was changed as a boolean. A value\n *                                   of 'customize' defers updates for the Customizer.\n * @return array|void\n */\nfunction retrieve_widgets( $theme_changed = false ) {\n\tglobal $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;\n\n\t$registered_sidebar_keys = array_keys( $wp_registered_sidebars );\n\t$orphaned = 0;\n\n\t$old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' );\n\tif ( is_array( $old_sidebars_widgets ) ) {\n\t\t// time() that sidebars were stored is in $old_sidebars_widgets['time']\n\t\t$_sidebars_widgets = $old_sidebars_widgets['data'];\n\n\t\tif ( 'customize' !== $theme_changed ) {\n\t\t\tremove_theme_mod( 'sidebars_widgets' );\n\t\t}\n\n\t\tforeach ( $_sidebars_widgets as $sidebar => $widgets ) {\n\t\t\tif ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !in_array( $sidebar, $registered_sidebar_keys ) ) {\n\t\t\t\t$_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $widgets;\n\t\t\t\tunset( $_sidebars_widgets[$sidebar] );\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif ( empty( $sidebars_widgets ) )\n\t\t\treturn;\n\n\t\tunset( $sidebars_widgets['array_version'] );\n\n\t\t$old = array_keys($sidebars_widgets);\n\t\tsort($old);\n\t\tsort($registered_sidebar_keys);\n\n\t\tif ( $old == $registered_sidebar_keys )\n\t\t\treturn;\n\n\t\t$_sidebars_widgets = array(\n\t\t\t'wp_inactive_widgets' => !empty( $sidebars_widgets['wp_inactive_widgets'] ) ? $sidebars_widgets['wp_inactive_widgets'] : array()\n\t\t);\n\n\t\tunset( $sidebars_widgets['wp_inactive_widgets'] );\n\n\t\tforeach ( $wp_registered_sidebars as $id => $settings ) {\n\t\t\tif ( $theme_changed ) {\n\t\t\t\t$_sidebars_widgets[$id] = array_shift( $sidebars_widgets );\n\t\t\t} else {\n\t\t\t\t// no theme change, grab only sidebars that are currently registered\n\t\t\t\tif ( isset( $sidebars_widgets[$id] ) ) {\n\t\t\t\t\t$_sidebars_widgets[$id] = $sidebars_widgets[$id];\n\t\t\t\t\tunset( $sidebars_widgets[$id] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tforeach ( $sidebars_widgets as $val ) {\n\t\t\tif ( is_array($val) && ! empty( $val ) )\n\t\t\t\t$_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val;\n\t\t}\n\t}\n\n\t// discard invalid, theme-specific widgets from sidebars\n\t$shown_widgets = array();\n\n\tforeach ( $_sidebars_widgets as $sidebar => $widgets ) {\n\t\tif ( !is_array($widgets) )\n\t\t\tcontinue;\n\n\t\t$_widgets = array();\n\t\tforeach ( $widgets as $widget ) {\n\t\t\tif ( isset($wp_registered_widgets[$widget]) )\n\t\t\t\t$_widgets[] = $widget;\n\t\t}\n\n\t\t$_sidebars_widgets[$sidebar] = $_widgets;\n\t\t$shown_widgets = array_merge($shown_widgets, $_widgets);\n\t}\n\n\t$sidebars_widgets = $_sidebars_widgets;\n\tunset($_sidebars_widgets, $_widgets);\n\n\t// find hidden/lost multi-widget instances\n\t$lost_widgets = array();\n\tforeach ( $wp_registered_widgets as $key => $val ) {\n\t\tif ( in_array($key, $shown_widgets, true) )\n\t\t\tcontinue;\n\n\t\t$number = preg_replace('/.+?-([0-9]+)$/', '$1', $key);\n\n\t\tif ( 2 > (int) $number )\n\t\t\tcontinue;\n\n\t\t$lost_widgets[] = $key;\n\t}\n\n\t$sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']);\n\tif ( 'customize' !== $theme_changed ) {\n\t\twp_set_sidebars_widgets( $sidebars_widgets );\n\t}\n\n\treturn $sidebars_widgets;\n}\n\n/**\n * Display the RSS entries in a list.\n *\n * @since 2.5.0\n *\n * @param string|array|object $rss RSS url.\n * @param array $args Widget arguments.\n */\nfunction wp_widget_rss_output( $rss, $args = array() ) {\n\tif ( is_string( $rss ) ) {\n\t\t$rss = fetch_feed($rss);\n\t} elseif ( is_array($rss) && isset($rss['url']) ) {\n\t\t$args = $rss;\n\t\t$rss = fetch_feed($rss['url']);\n\t} elseif ( !is_object($rss) ) {\n\t\treturn;\n\t}\n\n\tif ( is_wp_error($rss) ) {\n\t\tif ( is_admin() || current_user_can('manage_options') )\n\t\t\techo '<p>' . sprintf( __('<strong>RSS Error</strong>: %s'), $rss->get_error_message() ) . '</p>';\n\t\treturn;\n\t}\n\n\t$default_args = array( 'show_author' => 0, 'show_date' => 0, 'show_summary' => 0, 'items' => 0 );\n\t$args = wp_parse_args( $args, $default_args );\n\n\t$items = (int) $args['items'];\n\tif ( $items < 1 || 20 < $items )\n\t\t$items = 10;\n\t$show_summary  = (int) $args['show_summary'];\n\t$show_author   = (int) $args['show_author'];\n\t$show_date     = (int) $args['show_date'];\n\n\tif ( !$rss->get_item_quantity() ) {\n\t\techo '<ul><li>' . __( 'An error has occurred, which probably means the feed is down. Try again later.' ) . '</li></ul>';\n\t\t$rss->__destruct();\n\t\tunset($rss);\n\t\treturn;\n\t}\n\n\techo '<ul>';\n\tforeach ( $rss->get_items( 0, $items ) as $item ) {\n\t\t$link = $item->get_link();\n\t\twhile ( stristr( $link, 'http' ) != $link ) {\n\t\t\t$link = substr( $link, 1 );\n\t\t}\n\t\t$link = esc_url( strip_tags( $link ) );\n\n\t\t$title = esc_html( trim( strip_tags( $item->get_title() ) ) );\n\t\tif ( empty( $title ) ) {\n\t\t\t$title = __( 'Untitled' );\n\t\t}\n\n\t\t$desc = @html_entity_decode( $item->get_description(), ENT_QUOTES, get_option( 'blog_charset' ) );\n\t\t$desc = esc_attr( wp_trim_words( $desc, 55, ' [&hellip;]' ) );\n\n\t\t$summary = '';\n\t\tif ( $show_summary ) {\n\t\t\t$summary = $desc;\n\n\t\t\t// Change existing [...] to [&hellip;].\n\t\t\tif ( '[...]' == substr( $summary, -5 ) ) {\n\t\t\t\t$summary = substr( $summary, 0, -5 ) . '[&hellip;]';\n\t\t\t}\n\n\t\t\t$summary = '<div class=\"rssSummary\">' . esc_html( $summary ) . '</div>';\n\t\t}\n\n\t\t$date = '';\n\t\tif ( $show_date ) {\n\t\t\t$date = $item->get_date( 'U' );\n\n\t\t\tif ( $date ) {\n\t\t\t\t$date = ' <span class=\"rss-date\">' . date_i18n( get_option( 'date_format' ), $date ) . '</span>';\n\t\t\t}\n\t\t}\n\n\t\t$author = '';\n\t\tif ( $show_author ) {\n\t\t\t$author = $item->get_author();\n\t\t\tif ( is_object($author) ) {\n\t\t\t\t$author = $author->get_name();\n\t\t\t\t$author = ' <cite>' . esc_html( strip_tags( $author ) ) . '</cite>';\n\t\t\t}\n\t\t}\n\n\t\tif ( $link == '' ) {\n\t\t\techo \"<li>$title{$date}{$summary}{$author}</li>\";\n\t\t} elseif ( $show_summary ) {\n\t\t\techo \"<li><a class='rsswidget' href='$link'>$title</a>{$date}{$summary}{$author}</li>\";\n\t\t} else {\n\t\t\techo \"<li><a class='rsswidget' href='$link'>$title</a>{$date}{$author}</li>\";\n\t\t}\n\t}\n\techo '</ul>';\n\t$rss->__destruct();\n\tunset($rss);\n}\n\n/**\n * Display RSS widget options form.\n *\n * The options for what fields are displayed for the RSS form are all booleans\n * and are as follows: 'url', 'title', 'items', 'show_summary', 'show_author',\n * 'show_date'.\n *\n * @since 2.5.0\n *\n * @param array|string $args Values for input fields.\n * @param array $inputs Override default display options.\n */\nfunction wp_widget_rss_form( $args, $inputs = null ) {\n\t$default_inputs = array( 'url' => true, 'title' => true, 'items' => true, 'show_summary' => true, 'show_author' => true, 'show_date' => true );\n\t$inputs = wp_parse_args( $inputs, $default_inputs );\n\n\t$args['title'] = isset( $args['title'] ) ? $args['title'] : '';\n\t$args['url'] = isset( $args['url'] ) ? $args['url'] : '';\n\t$args['items'] = isset( $args['items'] ) ? (int) $args['items'] : 0;\n\n\tif ( $args['items'] < 1 || 20 < $args['items'] ) {\n\t\t$args['items'] = 10;\n\t}\n\n\t$args['show_summary']   = isset( $args['show_summary'] ) ? (int) $args['show_summary'] : (int) $inputs['show_summary'];\n\t$args['show_author']    = isset( $args['show_author'] ) ? (int) $args['show_author'] : (int) $inputs['show_author'];\n\t$args['show_date']      = isset( $args['show_date'] ) ? (int) $args['show_date'] : (int) $inputs['show_date'];\n\n\tif ( ! empty( $args['error'] ) ) {\n\t\techo '<p class=\"widget-error\"><strong>' . sprintf( __( 'RSS Error: %s' ), $args['error'] ) . '</strong></p>';\n\t}\n\n\t$esc_number = esc_attr( $args['number'] );\n\tif ( $inputs['url'] ) :\n?>\n\t<p><label for=\"rss-url-<?php echo $esc_number; ?>\"><?php _e( 'Enter the RSS feed URL here:' ); ?></label>\n\t<input class=\"widefat\" id=\"rss-url-<?php echo $esc_number; ?>\" name=\"widget-rss[<?php echo $esc_number; ?>][url]\" type=\"text\" value=\"<?php echo esc_url( $args['url'] ); ?>\" /></p>\n<?php endif; if ( $inputs['title'] ) : ?>\n\t<p><label for=\"rss-title-<?php echo $esc_number; ?>\"><?php _e( 'Give the feed a title (optional):' ); ?></label>\n\t<input class=\"widefat\" id=\"rss-title-<?php echo $esc_number; ?>\" name=\"widget-rss[<?php echo $esc_number; ?>][title]\" type=\"text\" value=\"<?php echo esc_attr( $args['title'] ); ?>\" /></p>\n<?php endif; if ( $inputs['items'] ) : ?>\n\t<p><label for=\"rss-items-<?php echo $esc_number; ?>\"><?php _e( 'How many items would you like to display?' ); ?></label>\n\t<select id=\"rss-items-<?php echo $esc_number; ?>\" name=\"widget-rss[<?php echo $esc_number; ?>][items]\">\n\t<?php\n\tfor ( $i = 1; $i <= 20; ++$i ) {\n\t\techo \"<option value='$i' \" . selected( $args['items'], $i, false ) . \">$i</option>\";\n\t}\n\t?>\n\t</select></p>\n<?php endif; if ( $inputs['show_summary'] ) : ?>\n\t<p><input id=\"rss-show-summary-<?php echo $esc_number; ?>\" name=\"widget-rss[<?php echo $esc_number; ?>][show_summary]\" type=\"checkbox\" value=\"1\" <?php checked( $args['show_summary'] ); ?> />\n\t<label for=\"rss-show-summary-<?php echo $esc_number; ?>\"><?php _e( 'Display item content?' ); ?></label></p>\n<?php endif; if ( $inputs['show_author'] ) : ?>\n\t<p><input id=\"rss-show-author-<?php echo $esc_number; ?>\" name=\"widget-rss[<?php echo $esc_number; ?>][show_author]\" type=\"checkbox\" value=\"1\" <?php checked( $args['show_author'] ); ?> />\n\t<label for=\"rss-show-author-<?php echo $esc_number; ?>\"><?php _e( 'Display item author if available?' ); ?></label></p>\n<?php endif; if ( $inputs['show_date'] ) : ?>\n\t<p><input id=\"rss-show-date-<?php echo $esc_number; ?>\" name=\"widget-rss[<?php echo $esc_number; ?>][show_date]\" type=\"checkbox\" value=\"1\" <?php checked( $args['show_date'] ); ?>/>\n\t<label for=\"rss-show-date-<?php echo $esc_number; ?>\"><?php _e( 'Display item date?' ); ?></label></p>\n<?php\n\tendif;\n\tforeach ( array_keys($default_inputs) as $input ) :\n\t\tif ( 'hidden' === $inputs[$input] ) :\n\t\t\t$id = str_replace( '_', '-', $input );\n?>\n\t<input type=\"hidden\" id=\"rss-<?php echo esc_attr( $id ); ?>-<?php echo $esc_number; ?>\" name=\"widget-rss[<?php echo $esc_number; ?>][<?php echo esc_attr( $input ); ?>]\" value=\"<?php echo esc_attr( $args[ $input ] ); ?>\" />\n<?php\n\t\tendif;\n\tendforeach;\n}\n\n/**\n * Process RSS feed widget data and optionally retrieve feed items.\n *\n * The feed widget can not have more than 20 items or it will reset back to the\n * default, which is 10.\n *\n * The resulting array has the feed title, feed url, feed link (from channel),\n * feed items, error (if any), and whether to show summary, author, and date.\n * All respectively in the order of the array elements.\n *\n * @since 2.5.0\n *\n * @param array $widget_rss RSS widget feed data. Expects unescaped data.\n * @param bool $check_feed Optional, default is true. Whether to check feed for errors.\n * @return array\n */\nfunction wp_widget_rss_process( $widget_rss, $check_feed = true ) {\n\t$items = (int) $widget_rss['items'];\n\tif ( $items < 1 || 20 < $items )\n\t\t$items = 10;\n\t$url           = esc_url_raw( strip_tags( $widget_rss['url'] ) );\n\t$title         = isset( $widget_rss['title'] ) ? trim( strip_tags( $widget_rss['title'] ) ) : '';\n\t$show_summary  = isset( $widget_rss['show_summary'] ) ? (int) $widget_rss['show_summary'] : 0;\n\t$show_author   = isset( $widget_rss['show_author'] ) ? (int) $widget_rss['show_author'] :0;\n\t$show_date     = isset( $widget_rss['show_date'] ) ? (int) $widget_rss['show_date'] : 0;\n\n\tif ( $check_feed ) {\n\t\t$rss = fetch_feed($url);\n\t\t$error = false;\n\t\t$link = '';\n\t\tif ( is_wp_error($rss) ) {\n\t\t\t$error = $rss->get_error_message();\n\t\t} else {\n\t\t\t$link = esc_url(strip_tags($rss->get_permalink()));\n\t\t\twhile ( stristr($link, 'http') != $link )\n\t\t\t\t$link = substr($link, 1);\n\n\t\t\t$rss->__destruct();\n\t\t\tunset($rss);\n\t\t}\n\t}\n\n\treturn compact( 'title', 'url', 'link', 'items', 'error', 'show_summary', 'show_author', 'show_date' );\n}\n\n/**\n * Register all of the default WordPress widgets on startup.\n *\n * Calls 'widgets_init' action after all of the WordPress widgets have been\n * registered.\n *\n * @since 2.2.0\n */\nfunction wp_widgets_init() {\n\tif ( !is_blog_installed() )\n\t\treturn;\n\n\tregister_widget('WP_Widget_Pages');\n\n\tregister_widget('WP_Widget_Calendar');\n\n\tregister_widget('WP_Widget_Archives');\n\n\tif ( get_option( 'link_manager_enabled' ) )\n\t\tregister_widget('WP_Widget_Links');\n\n\tregister_widget('WP_Widget_Meta');\n\n\tregister_widget('WP_Widget_Search');\n\n\tregister_widget('WP_Widget_Text');\n\n\tregister_widget('WP_Widget_Categories');\n\n\tregister_widget('WP_Widget_Recent_Posts');\n\n\tregister_widget('WP_Widget_Recent_Comments');\n\n\tregister_widget('WP_Widget_RSS');\n\n\tregister_widget('WP_Widget_Tag_Cloud');\n\n\tregister_widget('WP_Nav_Menu_Widget');\n\n\t/**\n\t * Fires after all default WordPress widgets have been registered.\n\t *\n\t * @since 2.2.0\n\t */\n\tdo_action( 'widgets_init' );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/wlwmanifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n\n<manifest xmlns=\"http://schemas.microsoft.com/wlw/manifest/weblog\">\n\n  <options>\n    <clientType>WordPress</clientType>\n\t<supportsKeywords>Yes</supportsKeywords>\n\t<supportsGetTags>Yes</supportsGetTags>\n  </options>\n\n  <weblog>\n    <serviceName>WordPress</serviceName>\n    <imageUrl>images/wlw/wp-icon.png</imageUrl>\n    <watermarkImageUrl>images/wlw/wp-watermark.png</watermarkImageUrl>\n    <homepageLinkText>View site</homepageLinkText>\n    <adminLinkText>Dashboard</adminLinkText>\n    <adminUrl>\n      <![CDATA[\n\t\t\t{blog-postapi-url}/../wp-admin/\n\t\t]]>\n    </adminUrl>\n    <postEditingUrl>\n      <![CDATA[\n\t\t\t{blog-postapi-url}/../wp-admin/post.php?action=edit&post={post-id}\n\t\t]]>\n    </postEditingUrl>\n  </weblog>\n\n  <buttons>\n    <button>\n      <id>0</id>\n      <text>Manage Comments</text>\n      <imageUrl>images/wlw/wp-comments.png</imageUrl>\n      <clickUrl>\n        <![CDATA[\n\t\t\t\t{blog-postapi-url}/../wp-admin/edit-comments.php\n\t\t\t]]>\n      </clickUrl>\n    </button>\n\n  </buttons>\n\n</manifest>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/wp-db.php",
    "content": "<?php\n/**\n * WordPress DB Class\n *\n * Original code from {@link http://php.justinvincent.com Justin Vincent (justin@visunet.ie)}\n *\n * @package WordPress\n * @subpackage Database\n * @since 0.71\n */\n\n/**\n * @since 0.71\n */\ndefine( 'EZSQL_VERSION', 'WP1.25' );\n\n/**\n * @since 0.71\n */\ndefine( 'OBJECT', 'OBJECT' );\ndefine( 'object', 'OBJECT' ); // Back compat.\n\n/**\n * @since 2.5.0\n */\ndefine( 'OBJECT_K', 'OBJECT_K' );\n\n/**\n * @since 0.71\n */\ndefine( 'ARRAY_A', 'ARRAY_A' );\n\n/**\n * @since 0.71\n */\ndefine( 'ARRAY_N', 'ARRAY_N' );\n\n/**\n * WordPress Database Access Abstraction Object\n *\n * It is possible to replace this class with your own\n * by setting the $wpdb global variable in wp-content/db.php\n * file to your class. The wpdb class will still be included,\n * so you can extend it or simply use your own.\n *\n * @link https://codex.wordpress.org/Function_Reference/wpdb_Class\n *\n * @package WordPress\n * @subpackage Database\n * @since 0.71\n */\nclass wpdb {\n\n\t/**\n\t * Whether to show SQL/DB errors.\n\t *\n\t * Default behavior is to show errors if both WP_DEBUG and WP_DEBUG_DISPLAY\n\t * evaluated to true.\n\t *\n\t * @since 0.71\n\t * @access private\n\t * @var bool\n\t */\n\tvar $show_errors = false;\n\n\t/**\n\t * Whether to suppress errors during the DB bootstrapping.\n\t *\n\t * @access private\n\t * @since 2.5.0\n\t * @var bool\n\t */\n\tvar $suppress_errors = false;\n\n\t/**\n\t * The last error during query.\n\t *\n\t * @since 2.5.0\n\t * @var string\n\t */\n\tpublic $last_error = '';\n\n\t/**\n\t * Amount of queries made\n\t *\n\t * @since 1.2.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $num_queries = 0;\n\n\t/**\n\t * Count of rows returned by previous query\n\t *\n\t * @since 0.71\n\t * @access public\n\t * @var int\n\t */\n\tpublic $num_rows = 0;\n\n\t/**\n\t * Count of affected rows by previous query\n\t *\n\t * @since 0.71\n\t * @access private\n\t * @var int\n\t */\n\tvar $rows_affected = 0;\n\n\t/**\n\t * The ID generated for an AUTO_INCREMENT column by the previous query (usually INSERT).\n\t *\n\t * @since 0.71\n\t * @access public\n\t * @var int\n\t */\n\tpublic $insert_id = 0;\n\n\t/**\n\t * Last query made\n\t *\n\t * @since 0.71\n\t * @access private\n\t * @var array\n\t */\n\tvar $last_query;\n\n\t/**\n\t * Results of the last query made\n\t *\n\t * @since 0.71\n\t * @access private\n\t * @var array|null\n\t */\n\tvar $last_result;\n\n\t/**\n\t * MySQL result, which is either a resource or boolean.\n\t *\n\t * @since 0.71\n\t * @access protected\n\t * @var mixed\n\t */\n\tprotected $result;\n\n\t/**\n\t * Cached column info, for sanity checking data before inserting\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $col_meta = array();\n\n\t/**\n\t * Calculated character sets on tables\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $table_charset = array();\n\n\t/**\n\t * Whether text fields in the current query need to be sanity checked.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t * @var bool\n\t */\n\tprotected $check_current_query = true;\n\n\t/**\n\t * Flag to ensure we don't run into recursion problems when checking the collation.\n\t *\n\t * @since 4.2.0\n\t * @access private\n\t * @see wpdb::check_safe_collation()\n\t * @var bool\n\t */\n\tprivate $checking_collation = false;\n\n\t/**\n\t * Saved info on the table column\n\t *\n\t * @since 0.71\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $col_info;\n\n\t/**\n\t * Saved queries that were executed\n\t *\n\t * @since 1.5.0\n\t * @access private\n\t * @var array\n\t */\n\tvar $queries;\n\n\t/**\n\t * The number of times to retry reconnecting before dying.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t * @see wpdb::check_connection()\n\t * @var int\n\t */\n\tprotected $reconnect_retries = 5;\n\n\t/**\n\t * WordPress table prefix\n\t *\n\t * You can set this to have multiple WordPress installations\n\t * in a single database. The second reason is for possible\n\t * security precautions.\n\t *\n\t * @since 2.5.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $prefix = '';\n\n\t/**\n\t * WordPress base table prefix.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\t public $base_prefix;\n\n\t/**\n\t * Whether the database queries are ready to start executing.\n\t *\n\t * @since 2.3.2\n\t * @access private\n\t * @var bool\n\t */\n\tvar $ready = false;\n\n\t/**\n\t * Blog ID.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $blogid = 0;\n\n\t/**\n\t * Site ID.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var int\n\t */\n\tpublic $siteid = 0;\n\n\t/**\n\t * List of WordPress per-blog tables\n\t *\n\t * @since 2.5.0\n\t * @access private\n\t * @see wpdb::tables()\n\t * @var array\n\t */\n\tvar $tables = array( 'posts', 'comments', 'links', 'options', 'postmeta',\n\t\t'terms', 'term_taxonomy', 'term_relationships', 'termmeta', 'commentmeta' );\n\n\t/**\n\t * List of deprecated WordPress tables\n\t *\n\t * categories, post2cat, and link2cat were deprecated in 2.3.0, db version 5539\n\t *\n\t * @since 2.9.0\n\t * @access private\n\t * @see wpdb::tables()\n\t * @var array\n\t */\n\tvar $old_tables = array( 'categories', 'post2cat', 'link2cat' );\n\n\t/**\n\t * List of WordPress global tables\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t * @see wpdb::tables()\n\t * @var array\n\t */\n\tvar $global_tables = array( 'users', 'usermeta' );\n\n\t/**\n\t * List of Multisite global tables\n\t *\n\t * @since 3.0.0\n\t * @access private\n\t * @see wpdb::tables()\n\t * @var array\n\t */\n\tvar $ms_global_tables = array( 'blogs', 'signups', 'site', 'sitemeta',\n\t\t'sitecategories', 'registration_log', 'blog_versions' );\n\n\t/**\n\t * WordPress Comments table\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $comments;\n\n\t/**\n\t * WordPress Comment Metadata table\n\t *\n\t * @since 2.9.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $commentmeta;\n\n\t/**\n\t * WordPress Links table\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $links;\n\n\t/**\n\t * WordPress Options table\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $options;\n\n\t/**\n\t * WordPress Post Metadata table\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $postmeta;\n\n\t/**\n\t * WordPress Posts table\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $posts;\n\n\t/**\n\t * WordPress Terms table\n\t *\n\t * @since 2.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $terms;\n\n\t/**\n\t * WordPress Term Relationships table\n\t *\n\t * @since 2.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $term_relationships;\n\n\t/**\n\t * WordPress Term Taxonomy table\n\t *\n\t * @since 2.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $term_taxonomy;\n\n\t/**\n\t * WordPress Term Meta table.\n\t *\n\t * @since 4.4.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $termmeta;\n\n\t/*\n\t * Global and Multisite tables\n\t */\n\n\t/**\n\t * WordPress User Metadata table\n\t *\n\t * @since 2.3.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $usermeta;\n\n\t/**\n\t * WordPress Users table\n\t *\n\t * @since 1.5.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $users;\n\n\t/**\n\t * Multisite Blogs table\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $blogs;\n\n\t/**\n\t * Multisite Blog Versions table\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $blog_versions;\n\n\t/**\n\t * Multisite Registration Log table\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $registration_log;\n\n\t/**\n\t * Multisite Signups table\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $signups;\n\n\t/**\n\t * Multisite Sites table\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $site;\n\n\t/**\n\t * Multisite Sitewide Terms table\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $sitecategories;\n\n\t/**\n\t * Multisite Site Metadata table\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $sitemeta;\n\n\t/**\n\t * Format specifiers for DB columns. Columns not listed here default to %s. Initialized during WP load.\n\t *\n\t * Keys are column names, values are format types: 'ID' => '%d'\n\t *\n\t * @since 2.8.0\n\t * @see wpdb::prepare()\n\t * @see wpdb::insert()\n\t * @see wpdb::update()\n\t * @see wpdb::delete()\n\t * @see wp_set_wpdb_vars()\n\t * @access public\n\t * @var array\n\t */\n\tpublic $field_types = array();\n\n\t/**\n\t * Database table columns charset\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $charset;\n\n\t/**\n\t * Database table columns collate\n\t *\n\t * @since 2.2.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $collate;\n\n\t/**\n\t * Database Username\n\t *\n\t * @since 2.9.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $dbuser;\n\n\t/**\n\t * Database Password\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $dbpassword;\n\n\t/**\n\t * Database Name\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $dbname;\n\n\t/**\n\t * Database Host\n\t *\n\t * @since 3.1.0\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $dbhost;\n\n\t/**\n\t * Database Handle\n\t *\n\t * @since 0.71\n\t * @access protected\n\t * @var string\n\t */\n\tprotected $dbh;\n\n\t/**\n\t * A textual description of the last query/get_row/get_var call\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t * @var string\n\t */\n\tpublic $func_call;\n\n\t/**\n\t * Whether MySQL is used as the database engine.\n\t *\n\t * Set in WPDB::db_connect() to true, by default. This is used when checking\n\t * against the required MySQL version for WordPress. Normally, a replacement\n\t * database drop-in (db.php) will skip these checks, but setting this to true\n\t * will force the checks to occur.\n\t *\n\t * @since 3.3.0\n\t * @access public\n\t * @var bool\n\t */\n\tpublic $is_mysql = null;\n\n\t/**\n\t * A list of incompatible SQL modes.\n\t *\n\t * @since 3.9.0\n\t * @access protected\n\t * @var array\n\t */\n\tprotected $incompatible_modes = array( 'NO_ZERO_DATE', 'ONLY_FULL_GROUP_BY',\n\t\t'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'TRADITIONAL' );\n\n\t/**\n\t * Whether to use mysqli over mysql.\n\t *\n\t * @since 3.9.0\n\t * @access private\n\t * @var bool\n\t */\n\tprivate $use_mysqli = false;\n\n\t/**\n\t * Whether we've managed to successfully connect at some point\n\t *\n\t * @since 3.9.0\n\t * @access private\n\t * @var bool\n\t */\n\tprivate $has_connected = false;\n\n\t/**\n\t * Connects to the database server and selects a database\n\t *\n\t * PHP5 style constructor for compatibility with PHP5. Does\n\t * the actual setting up of the class properties and connection\n\t * to the database.\n\t *\n\t * @link https://core.trac.wordpress.org/ticket/3354\n\t * @since 2.0.8\n\t *\n\t * @global string $wp_version\n\t *\n\t * @param string $dbuser     MySQL database user\n\t * @param string $dbpassword MySQL database password\n\t * @param string $dbname     MySQL database name\n\t * @param string $dbhost     MySQL database host\n\t */\n\tpublic function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) {\n\t\tregister_shutdown_function( array( $this, '__destruct' ) );\n\n\t\tif ( WP_DEBUG && WP_DEBUG_DISPLAY )\n\t\t\t$this->show_errors();\n\n\t\t/* Use ext/mysqli if it exists and:\n\t\t *  - WP_USE_EXT_MYSQL is defined as false, or\n\t\t *  - We are a development version of WordPress, or\n\t\t *  - We are running PHP 5.5 or greater, or\n\t\t *  - ext/mysql is not loaded.\n\t\t */\n\t\tif ( function_exists( 'mysqli_connect' ) ) {\n\t\t\tif ( defined( 'WP_USE_EXT_MYSQL' ) ) {\n\t\t\t\t$this->use_mysqli = ! WP_USE_EXT_MYSQL;\n\t\t\t} elseif ( version_compare( phpversion(), '5.5', '>=' ) || ! function_exists( 'mysql_connect' ) ) {\n\t\t\t\t$this->use_mysqli = true;\n\t\t\t} elseif ( false !== strpos( $GLOBALS['wp_version'], '-' ) ) {\n\t\t\t\t$this->use_mysqli = true;\n\t\t\t}\n\t\t}\n\n\t\t$this->dbuser = $dbuser;\n\t\t$this->dbpassword = $dbpassword;\n\t\t$this->dbname = $dbname;\n\t\t$this->dbhost = $dbhost;\n\n\t\t// wp-config.php creation will manually connect when ready.\n\t\tif ( defined( 'WP_SETUP_CONFIG' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$this->db_connect();\n\t}\n\n\t/**\n\t * PHP5 style destructor and will run when database object is destroyed.\n\t *\n\t * @see wpdb::__construct()\n\t * @since 2.0.8\n\t * @return true\n\t */\n\tpublic function __destruct() {\n\t\treturn true;\n\t}\n\n\t/**\n\t * PHP5 style magic getter, used to lazy-load expensive data.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param string $name The private member to get, and optionally process\n\t * @return mixed The private member\n\t */\n\tpublic function __get( $name ) {\n\t\tif ( 'col_info' === $name )\n\t\t\t$this->load_col_info();\n\n\t\treturn $this->$name;\n\t}\n\n\t/**\n\t * Magic function, for backwards compatibility.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param string $name  The private member to set\n\t * @param mixed  $value The value to set\n\t */\n\tpublic function __set( $name, $value ) {\n\t\t$protected_members = array(\n\t\t\t'col_meta',\n\t\t\t'table_charset',\n\t\t\t'check_current_query',\n\t\t);\n\t\tif (  in_array( $name, $protected_members, true ) ) {\n\t\t\treturn;\n\t\t}\n\t\t$this->$name = $value;\n\t}\n\n\t/**\n\t * Magic function, for backwards compatibility.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param string $name  The private member to check\n\t *\n\t * @return bool If the member is set or not\n\t */\n\tpublic function __isset( $name ) {\n\t\treturn isset( $this->$name );\n\t}\n\n\t/**\n\t * Magic function, for backwards compatibility.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param string $name  The private member to unset\n\t */\n\tpublic function __unset( $name ) {\n\t\tunset( $this->$name );\n\t}\n\n\t/**\n\t * Set $this->charset and $this->collate\n\t *\n\t * @since 3.1.0\n\t */\n\tpublic function init_charset() {\n\t\tif ( function_exists('is_multisite') && is_multisite() ) {\n\t\t\t$this->charset = 'utf8';\n\t\t\tif ( defined( 'DB_COLLATE' ) && DB_COLLATE ) {\n\t\t\t\t$this->collate = DB_COLLATE;\n\t\t\t} else {\n\t\t\t\t$this->collate = 'utf8_general_ci';\n\t\t\t}\n\t\t} elseif ( defined( 'DB_COLLATE' ) ) {\n\t\t\t$this->collate = DB_COLLATE;\n\t\t}\n\n\t\tif ( defined( 'DB_CHARSET' ) ) {\n\t\t\t$this->charset = DB_CHARSET;\n\t\t}\n\n\t\tif ( ( $this->use_mysqli && ! ( $this->dbh instanceof mysqli ) ) || empty( $this->dbh ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( 'utf8' === $this->charset && $this->has_cap( 'utf8mb4' ) ) {\n\t\t\t$this->charset = 'utf8mb4';\n\t\t}\n\n\t\tif ( 'utf8mb4' === $this->charset && ( ! $this->collate || stripos( $this->collate, 'utf8_' ) === 0 ) ) {\n\t\t\t$this->collate = 'utf8mb4_unicode_ci';\n\t\t}\n\t}\n\n\t/**\n\t * Sets the connection's character set.\n\t *\n\t * @since 3.1.0\n\t *\n\t * @param resource $dbh     The resource given by mysql_connect\n\t * @param string   $charset Optional. The character set. Default null.\n\t * @param string   $collate Optional. The collation. Default null.\n\t */\n\tpublic function set_charset( $dbh, $charset = null, $collate = null ) {\n\t\tif ( ! isset( $charset ) )\n\t\t\t$charset = $this->charset;\n\t\tif ( ! isset( $collate ) )\n\t\t\t$collate = $this->collate;\n\t\tif ( $this->has_cap( 'collation' ) && ! empty( $charset ) ) {\n\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\tif ( function_exists( 'mysqli_set_charset' ) && $this->has_cap( 'set_charset' ) ) {\n\t\t\t\t\tmysqli_set_charset( $dbh, $charset );\n\t\t\t\t} else {\n\t\t\t\t\t$query = $this->prepare( 'SET NAMES %s', $charset );\n\t\t\t\t\tif ( ! empty( $collate ) )\n\t\t\t\t\t\t$query .= $this->prepare( ' COLLATE %s', $collate );\n\t\t\t\t\tmysqli_query( $dbh, $query );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ( function_exists( 'mysql_set_charset' ) && $this->has_cap( 'set_charset' ) ) {\n\t\t\t\t\tmysql_set_charset( $charset, $dbh );\n\t\t\t\t} else {\n\t\t\t\t\t$query = $this->prepare( 'SET NAMES %s', $charset );\n\t\t\t\t\tif ( ! empty( $collate ) )\n\t\t\t\t\t\t$query .= $this->prepare( ' COLLATE %s', $collate );\n\t\t\t\t\tmysql_query( $query, $dbh );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Change the current SQL mode, and ensure its WordPress compatibility.\n\t *\n\t * If no modes are passed, it will ensure the current MySQL server\n\t * modes are compatible.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param array $modes Optional. A list of SQL modes to set.\n\t */\n\tpublic function set_sql_mode( $modes = array() ) {\n\t\tif ( empty( $modes ) ) {\n\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\t$res = mysqli_query( $this->dbh, 'SELECT @@SESSION.sql_mode' );\n\t\t\t} else {\n\t\t\t\t$res = mysql_query( 'SELECT @@SESSION.sql_mode', $this->dbh );\n\t\t\t}\n\n\t\t\tif ( empty( $res ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\t$modes_array = mysqli_fetch_array( $res );\n\t\t\t\tif ( empty( $modes_array[0] ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t$modes_str = $modes_array[0];\n\t\t\t} else {\n\t\t\t\t$modes_str = mysql_result( $res, 0 );\n\t\t\t}\n\n\t\t\tif ( empty( $modes_str ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$modes = explode( ',', $modes_str );\n\t\t}\n\n\t\t$modes = array_change_key_case( $modes, CASE_UPPER );\n\n\t\t/**\n\t\t * Filter the list of incompatible SQL modes to exclude.\n\t\t *\n\t\t * @since 3.9.0\n\t\t *\n\t\t * @param array $incompatible_modes An array of incompatible modes.\n\t\t */\n\t\t$incompatible_modes = (array) apply_filters( 'incompatible_sql_modes', $this->incompatible_modes );\n\n\t\tforeach ( $modes as $i => $mode ) {\n\t\t\tif ( in_array( $mode, $incompatible_modes ) ) {\n\t\t\t\tunset( $modes[ $i ] );\n\t\t\t}\n\t\t}\n\n\t\t$modes_str = implode( ',', $modes );\n\n\t\tif ( $this->use_mysqli ) {\n\t\t\tmysqli_query( $this->dbh, \"SET SESSION sql_mode='$modes_str'\" );\n\t\t} else {\n\t\t\tmysql_query( \"SET SESSION sql_mode='$modes_str'\", $this->dbh );\n\t\t}\n\t}\n\n\t/**\n\t * Sets the table prefix for the WordPress tables.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @param string $prefix          Alphanumeric name for the new prefix.\n\t * @param bool   $set_table_names Optional. Whether the table names, e.g. wpdb::$posts, should be updated or not.\n\t * @return string|WP_Error Old prefix or WP_Error on error\n\t */\n\tpublic function set_prefix( $prefix, $set_table_names = true ) {\n\n\t\tif ( preg_match( '|[^a-z0-9_]|i', $prefix ) )\n\t\t\treturn new WP_Error('invalid_db_prefix', 'Invalid database prefix' );\n\n\t\t$old_prefix = is_multisite() ? '' : $prefix;\n\n\t\tif ( isset( $this->base_prefix ) )\n\t\t\t$old_prefix = $this->base_prefix;\n\n\t\t$this->base_prefix = $prefix;\n\n\t\tif ( $set_table_names ) {\n\t\t\tforeach ( $this->tables( 'global' ) as $table => $prefixed_table )\n\t\t\t\t$this->$table = $prefixed_table;\n\n\t\t\tif ( is_multisite() && empty( $this->blogid ) )\n\t\t\t\treturn $old_prefix;\n\n\t\t\t$this->prefix = $this->get_blog_prefix();\n\n\t\t\tforeach ( $this->tables( 'blog' ) as $table => $prefixed_table )\n\t\t\t\t$this->$table = $prefixed_table;\n\n\t\t\tforeach ( $this->tables( 'old' ) as $table => $prefixed_table )\n\t\t\t\t$this->$table = $prefixed_table;\n\t\t}\n\t\treturn $old_prefix;\n\t}\n\n\t/**\n\t * Sets blog id.\n\t *\n\t * @since 3.0.0\n\t * @access public\n\t *\n\t * @param int $blog_id\n\t * @param int $site_id Optional.\n\t * @return int previous blog id\n\t */\n\tpublic function set_blog_id( $blog_id, $site_id = 0 ) {\n\t\tif ( ! empty( $site_id ) )\n\t\t\t$this->siteid = $site_id;\n\n\t\t$old_blog_id  = $this->blogid;\n\t\t$this->blogid = $blog_id;\n\n\t\t$this->prefix = $this->get_blog_prefix();\n\n\t\tforeach ( $this->tables( 'blog' ) as $table => $prefixed_table )\n\t\t\t$this->$table = $prefixed_table;\n\n\t\tforeach ( $this->tables( 'old' ) as $table => $prefixed_table )\n\t\t\t$this->$table = $prefixed_table;\n\n\t\treturn $old_blog_id;\n\t}\n\n\t/**\n\t * Gets blog prefix.\n\t *\n\t * @since 3.0.0\n\t * @param int $blog_id Optional.\n\t * @return string Blog prefix.\n\t */\n\tpublic function get_blog_prefix( $blog_id = null ) {\n\t\tif ( is_multisite() ) {\n\t\t\tif ( null === $blog_id )\n\t\t\t\t$blog_id = $this->blogid;\n\t\t\t$blog_id = (int) $blog_id;\n\t\t\tif ( defined( 'MULTISITE' ) && ( 0 == $blog_id || 1 == $blog_id ) )\n\t\t\t\treturn $this->base_prefix;\n\t\t\telse\n\t\t\t\treturn $this->base_prefix . $blog_id . '_';\n\t\t} else {\n\t\t\treturn $this->base_prefix;\n\t\t}\n\t}\n\n\t/**\n\t * Returns an array of WordPress tables.\n\t *\n\t * Also allows for the CUSTOM_USER_TABLE and CUSTOM_USER_META_TABLE to\n\t * override the WordPress users and usermeta tables that would otherwise\n\t * be determined by the prefix.\n\t *\n\t * The scope argument can take one of the following:\n\t *\n\t * 'all' - returns 'all' and 'global' tables. No old tables are returned.\n\t * 'blog' - returns the blog-level tables for the queried blog.\n\t * 'global' - returns the global tables for the installation, returning multisite tables only if running multisite.\n\t * 'ms_global' - returns the multisite global tables, regardless if current installation is multisite.\n\t * 'old' - returns tables which are deprecated.\n\t *\n\t * @since 3.0.0\n\t * @uses wpdb::$tables\n\t * @uses wpdb::$old_tables\n\t * @uses wpdb::$global_tables\n\t * @uses wpdb::$ms_global_tables\n\t *\n\t * @param string $scope   Optional. Can be all, global, ms_global, blog, or old tables. Defaults to all.\n\t * @param bool   $prefix  Optional. Whether to include table prefixes. Default true. If blog\n\t *                        prefix is requested, then the custom users and usermeta tables will be mapped.\n\t * @param int    $blog_id Optional. The blog_id to prefix. Defaults to wpdb::$blogid. Used only when prefix is requested.\n\t * @return array Table names. When a prefix is requested, the key is the unprefixed table name.\n\t */\n\tpublic function tables( $scope = 'all', $prefix = true, $blog_id = 0 ) {\n\t\tswitch ( $scope ) {\n\t\t\tcase 'all' :\n\t\t\t\t$tables = array_merge( $this->global_tables, $this->tables );\n\t\t\t\tif ( is_multisite() )\n\t\t\t\t\t$tables = array_merge( $tables, $this->ms_global_tables );\n\t\t\t\tbreak;\n\t\t\tcase 'blog' :\n\t\t\t\t$tables = $this->tables;\n\t\t\t\tbreak;\n\t\t\tcase 'global' :\n\t\t\t\t$tables = $this->global_tables;\n\t\t\t\tif ( is_multisite() )\n\t\t\t\t\t$tables = array_merge( $tables, $this->ms_global_tables );\n\t\t\t\tbreak;\n\t\t\tcase 'ms_global' :\n\t\t\t\t$tables = $this->ms_global_tables;\n\t\t\t\tbreak;\n\t\t\tcase 'old' :\n\t\t\t\t$tables = $this->old_tables;\n\t\t\t\tbreak;\n\t\t\tdefault :\n\t\t\t\treturn array();\n\t\t}\n\n\t\tif ( $prefix ) {\n\t\t\tif ( ! $blog_id )\n\t\t\t\t$blog_id = $this->blogid;\n\t\t\t$blog_prefix = $this->get_blog_prefix( $blog_id );\n\t\t\t$base_prefix = $this->base_prefix;\n\t\t\t$global_tables = array_merge( $this->global_tables, $this->ms_global_tables );\n\t\t\tforeach ( $tables as $k => $table ) {\n\t\t\t\tif ( in_array( $table, $global_tables ) )\n\t\t\t\t\t$tables[ $table ] = $base_prefix . $table;\n\t\t\t\telse\n\t\t\t\t\t$tables[ $table ] = $blog_prefix . $table;\n\t\t\t\tunset( $tables[ $k ] );\n\t\t\t}\n\n\t\t\tif ( isset( $tables['users'] ) && defined( 'CUSTOM_USER_TABLE' ) )\n\t\t\t\t$tables['users'] = CUSTOM_USER_TABLE;\n\n\t\t\tif ( isset( $tables['usermeta'] ) && defined( 'CUSTOM_USER_META_TABLE' ) )\n\t\t\t\t$tables['usermeta'] = CUSTOM_USER_META_TABLE;\n\t\t}\n\n\t\treturn $tables;\n\t}\n\n\t/**\n\t * Selects a database using the current database connection.\n\t *\n\t * The database name will be changed based on the current database\n\t * connection. On failure, the execution will bail and display an DB error.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string        $db  MySQL database name\n\t * @param resource|null $dbh Optional link identifier.\n\t */\n\tpublic function select( $db, $dbh = null ) {\n\t\tif ( is_null($dbh) )\n\t\t\t$dbh = $this->dbh;\n\n\t\tif ( $this->use_mysqli ) {\n\t\t\t$success = @mysqli_select_db( $dbh, $db );\n\t\t} else {\n\t\t\t$success = @mysql_select_db( $db, $dbh );\n\t\t}\n\t\tif ( ! $success ) {\n\t\t\t$this->ready = false;\n\t\t\tif ( ! did_action( 'template_redirect' ) ) {\n\t\t\t\twp_load_translations_early();\n\n\t\t\t\t$message = '<h1>' . __( 'Can&#8217;t select database' ) . \"</h1>\\n\";\n\n\t\t\t\t$message .= '<p>' . sprintf(\n\t\t\t\t\t/* translators: %s: database name */\n\t\t\t\t\t__( 'We were able to connect to the database server (which means your username and password is okay) but not able to select the %s database.' ),\n\t\t\t\t\t'<code>' . htmlspecialchars( $db, ENT_QUOTES ) . '</code>'\n\t\t\t\t) . \"</p>\\n\";\n\n\t\t\t\t$message .= \"<ul>\\n\";\n\t\t\t\t$message .= '<li>' . __( 'Are you sure it exists?' ) . \"</li>\\n\";\n\n\t\t\t\t$message .= '<li>' . sprintf(\n\t\t\t\t\t/* translators: 1: database user, 2: database name */\n\t\t\t\t\t__( 'Does the user %1$s have permission to use the %2$s database?' ),\n\t\t\t\t\t'<code>' . htmlspecialchars( $this->dbuser, ENT_QUOTES )  . '</code>',\n\t\t\t\t\t'<code>' . htmlspecialchars( $db, ENT_QUOTES ) . '</code>'\n\t\t\t\t) . \"</li>\\n\";\n\n\t\t\t\t$message .= '<li>' . sprintf(\n\t\t\t\t\t/* translators: %s: database name */\n\t\t\t\t\t__( 'On some systems the name of your database is prefixed with your username, so it would be like <code>username_%1$s</code>. Could that be the problem?' ),\n\t\t\t\t\thtmlspecialchars( $db, ENT_QUOTES )\n\t\t\t\t). \"</li>\\n\";\n\n\t\t\t\t$message .= \"</ul>\\n\";\n\n\t\t\t\t$message .= '<p>' . sprintf(\n\t\t\t\t\t/* translators: %s: support forums URL */\n\t\t\t\t\t__( 'If you don&#8217;t know how to set up a database you should <strong>contact your host</strong>. If all else fails you may find help at the <a href=\"%s\">WordPress Support Forums</a>.' ),\n\t\t\t\t\t__( 'https://wordpress.org/support/' )\n\t\t\t\t) . \"</p>\\n\";\n\n\t\t\t\t$this->bail( $message, 'db_select_fail' );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Do not use, deprecated.\n\t *\n\t * Use esc_sql() or wpdb::prepare() instead.\n\t *\n\t * @since 2.8.0\n\t * @deprecated 3.6.0 Use wpdb::prepare()\n\t * @see wpdb::prepare\n\t * @see esc_sql()\n\t * @access private\n\t *\n\t * @param string $string\n\t * @return string\n\t */\n\tfunction _weak_escape( $string ) {\n\t\tif ( func_num_args() === 1 && function_exists( '_deprecated_function' ) )\n\t\t\t_deprecated_function( __METHOD__, '3.6', 'wpdb::prepare() or esc_sql()' );\n\t\treturn addslashes( $string );\n\t}\n\n\t/**\n\t * Real escape, using mysqli_real_escape_string() or mysql_real_escape_string()\n\t *\n\t * @see mysqli_real_escape_string()\n\t * @see mysql_real_escape_string()\n\t * @since 2.8.0\n\t * @access private\n\t *\n\t * @param  string $string to escape\n\t * @return string escaped\n\t */\n\tfunction _real_escape( $string ) {\n\t\tif ( $this->dbh ) {\n\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\treturn mysqli_real_escape_string( $this->dbh, $string );\n\t\t\t} else {\n\t\t\t\treturn mysql_real_escape_string( $string, $this->dbh );\n\t\t\t}\n\t\t}\n\n\t\t$class = get_class( $this );\n\t\tif ( function_exists( '__' ) ) {\n\t\t\t/* translators: %s: database access abstraction class, usually wpdb or a class extending wpdb */\n\t\t\t_doing_it_wrong( $class, sprintf( __( '%s must set a database connection for use with escaping.' ), $class ), E_USER_NOTICE );\n\t\t} else {\n\t\t\t_doing_it_wrong( $class, sprintf( '%s must set a database connection for use with escaping.', $class ), E_USER_NOTICE );\n\t\t}\n\t\treturn addslashes( $string );\n\t}\n\n\t/**\n\t * Escape data. Works on arrays.\n\t *\n\t * @uses wpdb::_real_escape()\n\t * @since  2.8.0\n\t * @access private\n\t *\n\t * @param  string|array $data\n\t * @return string|array escaped\n\t */\n\tfunction _escape( $data ) {\n\t\tif ( is_array( $data ) ) {\n\t\t\tforeach ( $data as $k => $v ) {\n\t\t\t\tif ( is_array($v) )\n\t\t\t\t\t$data[$k] = $this->_escape( $v );\n\t\t\t\telse\n\t\t\t\t\t$data[$k] = $this->_real_escape( $v );\n\t\t\t}\n\t\t} else {\n\t\t\t$data = $this->_real_escape( $data );\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Do not use, deprecated.\n\t *\n\t * Use esc_sql() or wpdb::prepare() instead.\n\t *\n\t * @since 0.71\n\t * @deprecated 3.6.0 Use wpdb::prepare()\n\t * @see wpdb::prepare()\n\t * @see esc_sql()\n\t *\n\t * @param mixed $data\n\t * @return mixed\n\t */\n\tpublic function escape( $data ) {\n\t\tif ( func_num_args() === 1 && function_exists( '_deprecated_function' ) )\n\t\t\t_deprecated_function( __METHOD__, '3.6', 'wpdb::prepare() or esc_sql()' );\n\t\tif ( is_array( $data ) ) {\n\t\t\tforeach ( $data as $k => $v ) {\n\t\t\t\tif ( is_array( $v ) )\n\t\t\t\t\t$data[$k] = $this->escape( $v, 'recursive' );\n\t\t\t\telse\n\t\t\t\t\t$data[$k] = $this->_weak_escape( $v, 'internal' );\n\t\t\t}\n\t\t} else {\n\t\t\t$data = $this->_weak_escape( $data, 'internal' );\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Escapes content by reference for insertion into the database, for security\n\t *\n\t * @uses wpdb::_real_escape()\n\t *\n\t * @since 2.3.0\n\t *\n\t * @param string $string to escape\n\t */\n\tpublic function escape_by_ref( &$string ) {\n\t\tif ( ! is_float( $string ) )\n\t\t\t$string = $this->_real_escape( $string );\n\t}\n\n\t/**\n\t * Prepares a SQL query for safe execution. Uses sprintf()-like syntax.\n\t *\n\t * The following directives can be used in the query format string:\n\t *   %d (integer)\n\t *   %f (float)\n\t *   %s (string)\n\t *   %% (literal percentage sign - no argument needed)\n\t *\n\t * All of %d, %f, and %s are to be left unquoted in the query string and they need an argument passed for them.\n\t * Literals (%) as parts of the query must be properly written as %%.\n\t *\n\t * This function only supports a small subset of the sprintf syntax; it only supports %d (integer), %f (float), and %s (string).\n\t * Does not support sign, padding, alignment, width or precision specifiers.\n\t * Does not support argument numbering/swapping.\n\t *\n\t * May be called like {@link http://php.net/sprintf sprintf()} or like {@link http://php.net/vsprintf vsprintf()}.\n\t *\n\t * Both %d and %s should be left unquoted in the query string.\n\t *\n\t *     wpdb::prepare( \"SELECT * FROM `table` WHERE `column` = %s AND `field` = %d\", 'foo', 1337 )\n\t *     wpdb::prepare( \"SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s\", 'foo' );\n\t *\n\t * @link http://php.net/sprintf Description of syntax.\n\t * @since 2.3.0\n\t *\n\t * @param string      $query    Query statement with sprintf()-like placeholders\n\t * @param array|mixed $args     The array of variables to substitute into the query's placeholders if being called like\n\t *                              {@link http://php.net/vsprintf vsprintf()}, or the first variable to substitute into the query's placeholders if\n\t *                              being called like {@link http://php.net/sprintf sprintf()}.\n\t * @param mixed       $args,... further variables to substitute into the query's placeholders if being called like\n\t *                              {@link http://php.net/sprintf sprintf()}.\n\t * @return string|void Sanitized query string, if there is a query to prepare.\n\t */\n\tpublic function prepare( $query, $args ) {\n\t\tif ( is_null( $query ) )\n\t\t\treturn;\n\n\t\t// This is not meant to be foolproof -- but it will catch obviously incorrect usage.\n\t\tif ( strpos( $query, '%' ) === false ) {\n\t\t\t_doing_it_wrong( 'wpdb::prepare', sprintf( __( 'The query argument of %s must have a placeholder.' ), 'wpdb::prepare()' ), '3.9' );\n\t\t}\n\n\t\t$args = func_get_args();\n\t\tarray_shift( $args );\n\t\t// If args were passed as an array (as in vsprintf), move them up\n\t\tif ( isset( $args[0] ) && is_array($args[0]) )\n\t\t\t$args = $args[0];\n\t\t$query = str_replace( \"'%s'\", '%s', $query ); // in case someone mistakenly already singlequoted it\n\t\t$query = str_replace( '\"%s\"', '%s', $query ); // doublequote unquoting\n\t\t$query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware\n\t\t$query = preg_replace( '|(?<!%)%s|', \"'%s'\", $query ); // quote the strings, avoiding escaped strings like %%s\n\t\tarray_walk( $args, array( $this, 'escape_by_ref' ) );\n\t\treturn @vsprintf( $query, $args );\n\t}\n\n\t/**\n\t * First half of escaping for LIKE special characters % and _ before preparing for MySQL.\n\t *\n\t * Use this only before wpdb::prepare() or esc_sql().  Reversing the order is very bad for security.\n\t *\n\t * Example Prepared Statement:\n\t *  $wild = '%';\n\t *  $find = 'only 43% of planets';\n\t *  $like = $wild . $wpdb->esc_like( $find ) . $wild;\n\t *  $sql  = $wpdb->prepare( \"SELECT * FROM $wpdb->posts WHERE post_content LIKE %s\", $like );\n\t *\n\t * Example Escape Chain:\n\t *  $sql  = esc_sql( $wpdb->esc_like( $input ) );\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $text The raw text to be escaped. The input typed by the user should have no\n\t *                     extra or deleted slashes.\n\t * @return string Text in the form of a LIKE phrase. The output is not SQL safe. Call $wpdb::prepare()\n\t *                or real_escape next.\n\t */\n\tpublic function esc_like( $text ) {\n\t\treturn addcslashes( $text, '_%\\\\' );\n\t}\n\n\t/**\n\t * Print SQL/DB error.\n\t *\n\t * @since 0.71\n\t * @global array $EZSQL_ERROR Stores error information of query and error string\n\t *\n\t * @param string $str The error to display\n\t * @return false|void False if the showing of errors is disabled.\n\t */\n\tpublic function print_error( $str = '' ) {\n\t\tglobal $EZSQL_ERROR;\n\n\t\tif ( !$str ) {\n\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\t$str = mysqli_error( $this->dbh );\n\t\t\t} else {\n\t\t\t\t$str = mysql_error( $this->dbh );\n\t\t\t}\n\t\t}\n\t\t$EZSQL_ERROR[] = array( 'query' => $this->last_query, 'error_str' => $str );\n\n\t\tif ( $this->suppress_errors )\n\t\t\treturn false;\n\n\t\twp_load_translations_early();\n\n\t\tif ( $caller = $this->get_caller() )\n\t\t\t$error_str = sprintf( __( 'WordPress database error %1$s for query %2$s made by %3$s' ), $str, $this->last_query, $caller );\n\t\telse\n\t\t\t$error_str = sprintf( __( 'WordPress database error %1$s for query %2$s' ), $str, $this->last_query );\n\n\t\terror_log( $error_str );\n\n\t\t// Are we showing errors?\n\t\tif ( ! $this->show_errors )\n\t\t\treturn false;\n\n\t\t// If there is an error then take note of it\n\t\tif ( is_multisite() ) {\n\t\t\t$msg = sprintf(\n\t\t\t\t\"%s [%s]\\n%s\\n\",\n\t\t\t\t__( 'WordPress database error:' ),\n\t\t\t\t$str,\n\t\t\t\t$this->last_query\n\t\t\t);\n\n\t\t\tif ( defined( 'ERRORLOGFILE' ) ) {\n\t\t\t\terror_log( $msg, 3, ERRORLOGFILE );\n\t\t\t}\n\t\t\tif ( defined( 'DIEONDBERROR' ) ) {\n\t\t\t\twp_die( $msg );\n\t\t\t}\n\t\t} else {\n\t\t\t$str   = htmlspecialchars( $str, ENT_QUOTES );\n\t\t\t$query = htmlspecialchars( $this->last_query, ENT_QUOTES );\n\n\t\t\tprintf(\n\t\t\t\t'<div id=\"error\"><p class=\"wpdberror\"><strong>%s</strong> [%s]<br /><code>%s</code></p></div>',\n\t\t\t\t__( 'WordPress database error:' ),\n\t\t\t\t$str,\n\t\t\t\t$query\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Enables showing of database errors.\n\t *\n\t * This function should be used only to enable showing of errors.\n\t * wpdb::hide_errors() should be used instead for hiding of errors. However,\n\t * this function can be used to enable and disable showing of database\n\t * errors.\n\t *\n\t * @since 0.71\n\t * @see wpdb::hide_errors()\n\t *\n\t * @param bool $show Whether to show or hide errors\n\t * @return bool Old value for showing errors.\n\t */\n\tpublic function show_errors( $show = true ) {\n\t\t$errors = $this->show_errors;\n\t\t$this->show_errors = $show;\n\t\treturn $errors;\n\t}\n\n\t/**\n\t * Disables showing of database errors.\n\t *\n\t * By default database errors are not shown.\n\t *\n\t * @since 0.71\n\t * @see wpdb::show_errors()\n\t *\n\t * @return bool Whether showing of errors was active\n\t */\n\tpublic function hide_errors() {\n\t\t$show = $this->show_errors;\n\t\t$this->show_errors = false;\n\t\treturn $show;\n\t}\n\n\t/**\n\t * Whether to suppress database errors.\n\t *\n\t * By default database errors are suppressed, with a simple\n\t * call to this function they can be enabled.\n\t *\n\t * @since 2.5.0\n\t * @see wpdb::hide_errors()\n\t * @param bool $suppress Optional. New value. Defaults to true.\n\t * @return bool Old value\n\t */\n\tpublic function suppress_errors( $suppress = true ) {\n\t\t$errors = $this->suppress_errors;\n\t\t$this->suppress_errors = (bool) $suppress;\n\t\treturn $errors;\n\t}\n\n\t/**\n\t * Kill cached query results.\n\t *\n\t * @since 0.71\n\t */\n\tpublic function flush() {\n\t\t$this->last_result = array();\n\t\t$this->col_info    = null;\n\t\t$this->last_query  = null;\n\t\t$this->rows_affected = $this->num_rows = 0;\n\t\t$this->last_error  = '';\n\n\t\tif ( $this->use_mysqli && $this->result instanceof mysqli_result ) {\n\t\t\tmysqli_free_result( $this->result );\n\t\t\t$this->result = null;\n\n\t\t\t// Sanity check before using the handle\n\t\t\tif ( empty( $this->dbh ) || !( $this->dbh instanceof mysqli ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Clear out any results from a multi-query\n\t\t\twhile ( mysqli_more_results( $this->dbh ) ) {\n\t\t\t\tmysqli_next_result( $this->dbh );\n\t\t\t}\n\t\t} elseif ( is_resource( $this->result ) ) {\n\t\t\tmysql_free_result( $this->result );\n\t\t}\n\t}\n\n\t/**\n\t * Connect to and select database.\n\t *\n\t * If $allow_bail is false, the lack of database connection will need\n\t * to be handled manually.\n\t *\n\t * @since 3.0.0\n\t * @since 3.9.0 $allow_bail parameter added.\n\t *\n\t * @param bool $allow_bail Optional. Allows the function to bail. Default true.\n\t * @return bool True with a successful connection, false on failure.\n\t */\n\tpublic function db_connect( $allow_bail = true ) {\n\t\t$this->is_mysql = true;\n\n\t\t/*\n\t\t * Deprecated in 3.9+ when using MySQLi. No equivalent\n\t\t * $new_link parameter exists for mysqli_* functions.\n\t\t */\n\t\t$new_link = defined( 'MYSQL_NEW_LINK' ) ? MYSQL_NEW_LINK : true;\n\t\t$client_flags = defined( 'MYSQL_CLIENT_FLAGS' ) ? MYSQL_CLIENT_FLAGS : 0;\n\n\t\tif ( $this->use_mysqli ) {\n\t\t\t$this->dbh = mysqli_init();\n\n\t\t\t// mysqli_real_connect doesn't support the host param including a port or socket\n\t\t\t// like mysql_connect does. This duplicates how mysql_connect detects a port and/or socket file.\n\t\t\t$port = null;\n\t\t\t$socket = null;\n\t\t\t$host = $this->dbhost;\n\t\t\t$port_or_socket = strstr( $host, ':' );\n\t\t\tif ( ! empty( $port_or_socket ) ) {\n\t\t\t\t$host = substr( $host, 0, strpos( $host, ':' ) );\n\t\t\t\t$port_or_socket = substr( $port_or_socket, 1 );\n\t\t\t\tif ( 0 !== strpos( $port_or_socket, '/' ) ) {\n\t\t\t\t\t$port = intval( $port_or_socket );\n\t\t\t\t\t$maybe_socket = strstr( $port_or_socket, ':' );\n\t\t\t\t\tif ( ! empty( $maybe_socket ) ) {\n\t\t\t\t\t\t$socket = substr( $maybe_socket, 1 );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$socket = $port_or_socket;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( WP_DEBUG ) {\n\t\t\t\tmysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );\n\t\t\t} else {\n\t\t\t\t@mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );\n\t\t\t}\n\n\t\t\tif ( $this->dbh->connect_errno ) {\n\t\t\t\t$this->dbh = null;\n\n\t\t\t\t/* It's possible ext/mysqli is misconfigured. Fall back to ext/mysql if:\n\t\t \t\t *  - We haven't previously connected, and\n\t\t \t\t *  - WP_USE_EXT_MYSQL isn't set to false, and\n\t\t \t\t *  - ext/mysql is loaded.\n\t\t \t\t */\n\t\t\t\t$attempt_fallback = true;\n\n\t\t\t\tif ( $this->has_connected ) {\n\t\t\t\t\t$attempt_fallback = false;\n\t\t\t\t} elseif ( defined( 'WP_USE_EXT_MYSQL' ) && ! WP_USE_EXT_MYSQL ) {\n\t\t\t\t\t$attempt_fallback = false;\n\t\t\t\t} elseif ( ! function_exists( 'mysql_connect' ) ) {\n\t\t\t\t\t$attempt_fallback = false;\n\t\t\t\t}\n\n\t\t\t\tif ( $attempt_fallback ) {\n\t\t\t\t\t$this->use_mysqli = false;\n\t\t\t\t\treturn $this->db_connect( $allow_bail );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ( WP_DEBUG ) {\n\t\t\t\t$this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );\n\t\t\t} else {\n\t\t\t\t$this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );\n\t\t\t}\n\t\t}\n\n\t\tif ( ! $this->dbh && $allow_bail ) {\n\t\t\twp_load_translations_early();\n\n\t\t\t// Load custom DB error template, if present.\n\t\t\tif ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) {\n\t\t\t\trequire_once( WP_CONTENT_DIR . '/db-error.php' );\n\t\t\t\tdie();\n\t\t\t}\n\n\t\t\t$message = '<h1>' . __( 'Error establishing a database connection' ) . \"</h1>\\n\";\n\n\t\t\t$message .= '<p>' . sprintf(\n\t\t\t\t/* translators: 1: wp-config.php. 2: database host */\n\t\t\t\t__( 'This either means that the username and password information in your %1$s file is incorrect or we can&#8217;t contact the database server at %2$s. This could mean your host&#8217;s database server is down.' ),\n\t\t\t\t'<code>wp-config.php</code>',\n\t\t\t\t'<code>' . htmlspecialchars( $this->dbhost, ENT_QUOTES ) . '</code>'\n\t\t\t) . \"</p>\\n\";\n\n\t\t\t$message .= \"<ul>\\n\";\n\t\t\t$message .= '<li>' . __( 'Are you sure you have the correct username and password?' ) . \"</li>\\n\";\n\t\t\t$message .= '<li>' . __( 'Are you sure that you have typed the correct hostname?' ) . \"</li>\\n\";\n\t\t\t$message .= '<li>' . __( 'Are you sure that the database server is running?' ) . \"</li>\\n\";\n\t\t\t$message .= \"</ul>\\n\";\n\n\t\t\t$message .= '<p>' . sprintf(\n\t\t\t\t/* translators: %s: support forums URL */\n\t\t\t\t__( 'If you&#8217;re unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href=\"%s\">WordPress Support Forums</a>.' ),\n\t\t\t\t__( 'https://wordpress.org/support/' )\n\t\t\t) . \"</p>\\n\";\n\n\t\t\t$this->bail( $message, 'db_connect_fail' );\n\n\t\t\treturn false;\n\t\t} elseif ( $this->dbh ) {\n\t\t\tif ( ! $this->has_connected ) {\n\t\t\t\t$this->init_charset();\n\t\t\t}\n\n\t\t\t$this->has_connected = true;\n\n\t\t\t$this->set_charset( $this->dbh );\n\n\t\t\t$this->ready = true;\n\t\t\t$this->set_sql_mode();\n\t\t\t$this->select( $this->dbname, $this->dbh );\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check that the connection to the database is still up. If not, try to reconnect.\n\t *\n\t * If this function is unable to reconnect, it will forcibly die, or if after the\n\t * the template_redirect hook has been fired, return false instead.\n\t *\n\t * If $allow_bail is false, the lack of database connection will need\n\t * to be handled manually.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param bool $allow_bail Optional. Allows the function to bail. Default true.\n\t * @return bool|void True if the connection is up.\n\t */\n\tpublic function check_connection( $allow_bail = true ) {\n\t\tif ( $this->use_mysqli ) {\n\t\t\tif ( @mysqli_ping( $this->dbh ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\tif ( @mysql_ping( $this->dbh ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t$error_reporting = false;\n\n\t\t// Disable warnings, as we don't want to see a multitude of \"unable to connect\" messages\n\t\tif ( WP_DEBUG ) {\n\t\t\t$error_reporting = error_reporting();\n\t\t\terror_reporting( $error_reporting & ~E_WARNING );\n\t\t}\n\n\t\tfor ( $tries = 1; $tries <= $this->reconnect_retries; $tries++ ) {\n\t\t\t// On the last try, re-enable warnings. We want to see a single instance of the\n\t\t\t// \"unable to connect\" message on the bail() screen, if it appears.\n\t\t\tif ( $this->reconnect_retries === $tries && WP_DEBUG ) {\n\t\t\t\terror_reporting( $error_reporting );\n\t\t\t}\n\n\t\t\tif ( $this->db_connect( false ) ) {\n\t\t\t\tif ( $error_reporting ) {\n\t\t\t\t\terror_reporting( $error_reporting );\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tsleep( 1 );\n\t\t}\n\n\t\t// If template_redirect has already happened, it's too late for wp_die()/dead_db().\n\t\t// Let's just return and hope for the best.\n\t\tif ( did_action( 'template_redirect' ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( ! $allow_bail ) {\n\t\t\treturn false;\n\t\t}\n\n\t\twp_load_translations_early();\n\n\t\t$message = '<h1>' . __( 'Error reconnecting to the database' ) . \"</h1>\\n\";\n\n\t\t$message .= '<p>' . sprintf(\n\t\t\t/* translators: %s: database host */\n\t\t\t__( 'This means that we lost contact with the database server at %s. This could mean your host&#8217;s database server is down.' ),\n\t\t\t'<code>' . htmlspecialchars( $this->dbhost, ENT_QUOTES ) . '</code>'\n\t\t) . \"</p>\\n\";\n\n\t\t$message .= \"<ul>\\n\";\n\t\t$message .= '<li>' . __( 'Are you sure that the database server is running?' ) . \"</li>\\n\";\n\t\t$message .= '<li>' . __( 'Are you sure that the database server is not under particularly heavy load?' ) . \"</li>\\n\";\n\t\t$message .= \"</ul>\\n\";\n\n\t\t$message .= '<p>' . sprintf(\n\t\t\t/* translators: %s: support forums URL */\n\t\t\t__( 'If you&#8217;re unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href=\"%s\">WordPress Support Forums</a>.' ),\n\t\t\t__( 'https://wordpress.org/support/' )\n\t\t) . \"</p>\\n\";\n\n\t\t// We weren't able to reconnect, so we better bail.\n\t\t$this->bail( $message, 'db_connect_fail' );\n\n\t\t// Call dead_db() if bail didn't die, because this database is no more. It has ceased to be (at least temporarily).\n\t\tdead_db();\n\t}\n\n\t/**\n\t * Perform a MySQL database query, using current database connection.\n\t *\n\t * More information can be found on the codex page.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $query Database query\n\t * @return int|false Number of rows affected/selected or false on error\n\t */\n\tpublic function query( $query ) {\n\t\tif ( ! $this->ready ) {\n\t\t\t$this->check_current_query = true;\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Filter the database query.\n\t\t *\n\t\t * Some queries are made before the plugins have been loaded,\n\t\t * and thus cannot be filtered with this method.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $query Database query.\n\t\t */\n\t\t$query = apply_filters( 'query', $query );\n\n\t\t$this->flush();\n\n\t\t// Log how the function was called\n\t\t$this->func_call = \"\\$db->query(\\\"$query\\\")\";\n\n\t\t// If we're writing to the database, make sure the query will write safely.\n\t\tif ( $this->check_current_query && ! $this->check_ascii( $query ) ) {\n\t\t\t$stripped_query = $this->strip_invalid_text_from_query( $query );\n\t\t\t// strip_invalid_text_from_query() can perform queries, so we need\n\t\t\t// to flush again, just to make sure everything is clear.\n\t\t\t$this->flush();\n\t\t\tif ( $stripped_query !== $query ) {\n\t\t\t\t$this->insert_id = 0;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t$this->check_current_query = true;\n\n\t\t// Keep track of the last query for debug..\n\t\t$this->last_query = $query;\n\n\t\t$this->_do_query( $query );\n\n\t\t// MySQL server has gone away, try to reconnect\n\t\t$mysql_errno = 0;\n\t\tif ( ! empty( $this->dbh ) ) {\n\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\t$mysql_errno = mysqli_errno( $this->dbh );\n\t\t\t} else {\n\t\t\t\t$mysql_errno = mysql_errno( $this->dbh );\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $this->dbh ) || 2006 == $mysql_errno ) {\n\t\t\tif ( $this->check_connection() ) {\n\t\t\t\t$this->_do_query( $query );\n\t\t\t} else {\n\t\t\t\t$this->insert_id = 0;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// If there is an error then take note of it..\n\t\tif ( $this->use_mysqli ) {\n\t\t\t$this->last_error = mysqli_error( $this->dbh );\n\t\t} else {\n\t\t\t$this->last_error = mysql_error( $this->dbh );\n\t\t}\n\n\t\tif ( $this->last_error ) {\n\t\t\t// Clear insert_id on a subsequent failed insert.\n\t\t\tif ( $this->insert_id && preg_match( '/^\\s*(insert|replace)\\s/i', $query ) )\n\t\t\t\t$this->insert_id = 0;\n\n\t\t\t$this->print_error();\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( preg_match( '/^\\s*(create|alter|truncate|drop)\\s/i', $query ) ) {\n\t\t\t$return_val = $this->result;\n\t\t} elseif ( preg_match( '/^\\s*(insert|delete|update|replace)\\s/i', $query ) ) {\n\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\t$this->rows_affected = mysqli_affected_rows( $this->dbh );\n\t\t\t} else {\n\t\t\t\t$this->rows_affected = mysql_affected_rows( $this->dbh );\n\t\t\t}\n\t\t\t// Take note of the insert_id\n\t\t\tif ( preg_match( '/^\\s*(insert|replace)\\s/i', $query ) ) {\n\t\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\t\t$this->insert_id = mysqli_insert_id( $this->dbh );\n\t\t\t\t} else {\n\t\t\t\t\t$this->insert_id = mysql_insert_id( $this->dbh );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Return number of rows affected\n\t\t\t$return_val = $this->rows_affected;\n\t\t} else {\n\t\t\t$num_rows = 0;\n\t\t\tif ( $this->use_mysqli && $this->result instanceof mysqli_result ) {\n\t\t\t\twhile ( $row = @mysqli_fetch_object( $this->result ) ) {\n\t\t\t\t\t$this->last_result[$num_rows] = $row;\n\t\t\t\t\t$num_rows++;\n\t\t\t\t}\n\t\t\t} elseif ( is_resource( $this->result ) ) {\n\t\t\t\twhile ( $row = @mysql_fetch_object( $this->result ) ) {\n\t\t\t\t\t$this->last_result[$num_rows] = $row;\n\t\t\t\t\t$num_rows++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log number of rows the query returned\n\t\t\t// and return number of rows selected\n\t\t\t$this->num_rows = $num_rows;\n\t\t\t$return_val     = $num_rows;\n\t\t}\n\n\t\treturn $return_val;\n\t}\n\n\t/**\n\t * Internal function to perform the mysql_query() call.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @access private\n\t * @see wpdb::query()\n\t *\n\t * @param string $query The query to run.\n\t */\n\tprivate function _do_query( $query ) {\n\t\tif ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) {\n\t\t\t$this->timer_start();\n\t\t}\n\n\t\tif ( $this->use_mysqli ) {\n\t\t\t$this->result = @mysqli_query( $this->dbh, $query );\n\t\t} else {\n\t\t\t$this->result = @mysql_query( $query, $this->dbh );\n\t\t}\n\t\t$this->num_queries++;\n\n\t\tif ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) {\n\t\t\t$this->queries[] = array( $query, $this->timer_stop(), $this->get_caller() );\n\t\t}\n\t}\n\n\t/**\n\t * Insert a row into a table.\n\t *\n\t *     wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 'bar' ) )\n\t *     wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) )\n\t *\n\t * @since 2.5.0\n\t * @see wpdb::prepare()\n\t * @see wpdb::$field_types\n\t * @see wp_set_wpdb_vars()\n\t *\n\t * @param string       $table  Table name\n\t * @param array        $data   Data to insert (in column => value pairs).\n\t *                             Both $data columns and $data values should be \"raw\" (neither should be SQL escaped).\n\t *                             Sending a null value will cause the column to be set to NULL - the corresponding format is ignored in this case.\n\t * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data.\n\t *                             If string, that format will be used for all of the values in $data.\n\t *                             A format is one of '%d', '%f', '%s' (integer, float, string).\n\t *                             If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.\n\t * @return int|false The number of rows inserted, or false on error.\n\t */\n\tpublic function insert( $table, $data, $format = null ) {\n\t\treturn $this->_insert_replace_helper( $table, $data, $format, 'INSERT' );\n\t}\n\n\t/**\n\t * Replace a row into a table.\n\t *\n\t *     wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 'bar' ) )\n\t *     wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) )\n\t *\n\t * @since 3.0.0\n\t * @see wpdb::prepare()\n\t * @see wpdb::$field_types\n\t * @see wp_set_wpdb_vars()\n\t *\n\t * @param string       $table  Table name\n\t * @param array        $data   Data to insert (in column => value pairs).\n\t *                             Both $data columns and $data values should be \"raw\" (neither should be SQL escaped).\n\t *                             Sending a null value will cause the column to be set to NULL - the corresponding format is ignored in this case.\n\t * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data.\n\t *                             If string, that format will be used for all of the values in $data.\n\t *                             A format is one of '%d', '%f', '%s' (integer, float, string).\n\t *                             If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.\n\t * @return int|false The number of rows affected, or false on error.\n\t */\n\tpublic function replace( $table, $data, $format = null ) {\n\t\treturn $this->_insert_replace_helper( $table, $data, $format, 'REPLACE' );\n\t}\n\n\t/**\n\t * Helper function for insert and replace.\n\t *\n\t * Runs an insert or replace query based on $type argument.\n\t *\n\t * @access private\n\t * @since 3.0.0\n\t * @see wpdb::prepare()\n\t * @see wpdb::$field_types\n\t * @see wp_set_wpdb_vars()\n\t *\n\t * @param string       $table  Table name\n\t * @param array        $data   Data to insert (in column => value pairs).\n\t *                             Both $data columns and $data values should be \"raw\" (neither should be SQL escaped).\n\t *                             Sending a null value will cause the column to be set to NULL - the corresponding format is ignored in this case.\n\t * @param array|string $format Optional. An array of formats to be mapped to each of the value in $data.\n\t *                             If string, that format will be used for all of the values in $data.\n\t *                             A format is one of '%d', '%f', '%s' (integer, float, string).\n\t *                             If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.\n\t * @param string $type         Optional. What type of operation is this? INSERT or REPLACE. Defaults to INSERT.\n\t * @return int|false The number of rows affected, or false on error.\n\t */\n\tfunction _insert_replace_helper( $table, $data, $format = null, $type = 'INSERT' ) {\n\t\t$this->insert_id = 0;\n\n\t\tif ( ! in_array( strtoupper( $type ), array( 'REPLACE', 'INSERT' ) ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$data = $this->process_fields( $table, $data, $format );\n\t\tif ( false === $data ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$formats = $values = array();\n\t\tforeach ( $data as $value ) {\n\t\t\tif ( is_null( $value['value'] ) ) {\n\t\t\t\t$formats[] = 'NULL';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$formats[] = $value['format'];\n\t\t\t$values[]  = $value['value'];\n\t\t}\n\n\t\t$fields  = '`' . implode( '`, `', array_keys( $data ) ) . '`';\n\t\t$formats = implode( ', ', $formats );\n\n\t\t$sql = \"$type INTO `$table` ($fields) VALUES ($formats)\";\n\n\t\t$this->check_current_query = false;\n\t\treturn $this->query( $this->prepare( $sql, $values ) );\n\t}\n\n\t/**\n\t * Update a row in the table\n\t *\n\t *     wpdb::update( 'table', array( 'column' => 'foo', 'field' => 'bar' ), array( 'ID' => 1 ) )\n\t *     wpdb::update( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) )\n\t *\n\t * @since 2.5.0\n\t * @see wpdb::prepare()\n\t * @see wpdb::$field_types\n\t * @see wp_set_wpdb_vars()\n\t *\n\t * @param string       $table        Table name\n\t * @param array        $data         Data to update (in column => value pairs).\n\t *                                   Both $data columns and $data values should be \"raw\" (neither should be SQL escaped).\n\t *                                   Sending a null value will cause the column to be set to NULL - the corresponding\n\t *                                   format is ignored in this case.\n\t * @param array        $where        A named array of WHERE clauses (in column => value pairs).\n\t *                                   Multiple clauses will be joined with ANDs.\n\t *                                   Both $where columns and $where values should be \"raw\".\n\t *                                   Sending a null value will create an IS NULL comparison - the corresponding format will be ignored in this case.\n\t * @param array|string $format       Optional. An array of formats to be mapped to each of the values in $data.\n\t *                                   If string, that format will be used for all of the values in $data.\n\t *                                   A format is one of '%d', '%f', '%s' (integer, float, string).\n\t *                                   If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.\n\t * @param array|string $where_format Optional. An array of formats to be mapped to each of the values in $where.\n\t *                                   If string, that format will be used for all of the items in $where.\n\t *                                   A format is one of '%d', '%f', '%s' (integer, float, string).\n\t *                                   If omitted, all values in $where will be treated as strings.\n\t * @return int|false The number of rows updated, or false on error.\n\t */\n\tpublic function update( $table, $data, $where, $format = null, $where_format = null ) {\n\t\tif ( ! is_array( $data ) || ! is_array( $where ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$data = $this->process_fields( $table, $data, $format );\n\t\tif ( false === $data ) {\n\t\t\treturn false;\n\t\t}\n\t\t$where = $this->process_fields( $table, $where, $where_format );\n\t\tif ( false === $where ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$fields = $conditions = $values = array();\n\t\tforeach ( $data as $field => $value ) {\n\t\t\tif ( is_null( $value['value'] ) ) {\n\t\t\t\t$fields[] = \"`$field` = NULL\";\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$fields[] = \"`$field` = \" . $value['format'];\n\t\t\t$values[] = $value['value'];\n\t\t}\n\t\tforeach ( $where as $field => $value ) {\n\t\t\tif ( is_null( $value['value'] ) ) {\n\t\t\t\t$conditions[] = \"`$field` IS NULL\";\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$conditions[] = \"`$field` = \" . $value['format'];\n\t\t\t$values[] = $value['value'];\n\t\t}\n\n\t\t$fields = implode( ', ', $fields );\n\t\t$conditions = implode( ' AND ', $conditions );\n\n\t\t$sql = \"UPDATE `$table` SET $fields WHERE $conditions\";\n\n\t\t$this->check_current_query = false;\n\t\treturn $this->query( $this->prepare( $sql, $values ) );\n\t}\n\n\t/**\n\t * Delete a row in the table\n\t *\n\t *     wpdb::delete( 'table', array( 'ID' => 1 ) )\n\t *     wpdb::delete( 'table', array( 'ID' => 1 ), array( '%d' ) )\n\t *\n\t * @since 3.4.0\n\t * @see wpdb::prepare()\n\t * @see wpdb::$field_types\n\t * @see wp_set_wpdb_vars()\n\t *\n\t * @param string       $table        Table name\n\t * @param array        $where        A named array of WHERE clauses (in column => value pairs).\n\t *                                   Multiple clauses will be joined with ANDs.\n\t *                                   Both $where columns and $where values should be \"raw\".\n\t *                                   Sending a null value will create an IS NULL comparison - the corresponding format will be ignored in this case.\n\t * @param array|string $where_format Optional. An array of formats to be mapped to each of the values in $where.\n\t *                                   If string, that format will be used for all of the items in $where.\n\t *                                   A format is one of '%d', '%f', '%s' (integer, float, string).\n\t *                                   If omitted, all values in $where will be treated as strings unless otherwise specified in wpdb::$field_types.\n\t * @return int|false The number of rows updated, or false on error.\n\t */\n\tpublic function delete( $table, $where, $where_format = null ) {\n\t\tif ( ! is_array( $where ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$where = $this->process_fields( $table, $where, $where_format );\n\t\tif ( false === $where ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$conditions = $values = array();\n\t\tforeach ( $where as $field => $value ) {\n\t\t\tif ( is_null( $value['value'] ) ) {\n\t\t\t\t$conditions[] = \"`$field` IS NULL\";\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$conditions[] = \"`$field` = \" . $value['format'];\n\t\t\t$values[] = $value['value'];\n\t\t}\n\n\t\t$conditions = implode( ' AND ', $conditions );\n\n\t\t$sql = \"DELETE FROM `$table` WHERE $conditions\";\n\n\t\t$this->check_current_query = false;\n\t\treturn $this->query( $this->prepare( $sql, $values ) );\n\t}\n\n\t/**\n\t * Processes arrays of field/value pairs and field formats.\n\t *\n\t * This is a helper method for wpdb's CRUD methods, which take field/value\n\t * pairs for inserts, updates, and where clauses. This method first pairs\n\t * each value with a format. Then it determines the charset of that field,\n\t * using that to determine if any invalid text would be stripped. If text is\n\t * stripped, then field processing is rejected and the query fails.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $table  Table name.\n\t * @param array  $data   Field/value pair.\n\t * @param mixed  $format Format for each field.\n\t * @return array|false Returns an array of fields that contain paired values\n\t *                    and formats. Returns false for invalid values.\n\t */\n\tprotected function process_fields( $table, $data, $format ) {\n\t\t$data = $this->process_field_formats( $data, $format );\n\t\tif ( false === $data ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$data = $this->process_field_charsets( $data, $table );\n\t\tif ( false === $data ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$data = $this->process_field_lengths( $data, $table );\n\t\tif ( false === $data ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$converted_data = $this->strip_invalid_text( $data );\n\n\t\tif ( $data !== $converted_data ) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Prepares arrays of value/format pairs as passed to wpdb CRUD methods.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param array $data   Array of fields to values.\n\t * @param mixed $format Formats to be mapped to the values in $data.\n\t * @return array Array, keyed by field names with values being an array\n\t *               of 'value' and 'format' keys.\n\t */\n\tprotected function process_field_formats( $data, $format ) {\n\t\t$formats = $original_formats = (array) $format;\n\n\t\tforeach ( $data as $field => $value ) {\n\t\t\t$value = array(\n\t\t\t\t'value'  => $value,\n\t\t\t\t'format' => '%s',\n\t\t\t);\n\n\t\t\tif ( ! empty( $format ) ) {\n\t\t\t\t$value['format'] = array_shift( $formats );\n\t\t\t\tif ( ! $value['format'] ) {\n\t\t\t\t\t$value['format'] = reset( $original_formats );\n\t\t\t\t}\n\t\t\t} elseif ( isset( $this->field_types[ $field ] ) ) {\n\t\t\t\t$value['format'] = $this->field_types[ $field ];\n\t\t\t}\n\n\t\t\t$data[ $field ] = $value;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Adds field charsets to field/value/format arrays generated by\n\t * the wpdb::process_field_formats() method.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param array  $data  As it comes from the wpdb::process_field_formats() method.\n\t * @param string $table Table name.\n\t * @return array|false The same array as $data with additional 'charset' keys.\n\t */\n\tprotected function process_field_charsets( $data, $table ) {\n\t\tforeach ( $data as $field => $value ) {\n\t\t\tif ( '%d' === $value['format'] || '%f' === $value['format'] ) {\n\t\t\t\t/*\n\t\t\t\t * We can skip this field if we know it isn't a string.\n\t\t\t\t * This checks %d/%f versus ! %s because its sprintf() could take more.\n\t\t\t\t */\n\t\t\t\t$value['charset'] = false;\n\t\t\t} else {\n\t\t\t\t$value['charset'] = $this->get_col_charset( $table, $field );\n\t\t\t\tif ( is_wp_error( $value['charset'] ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$data[ $field ] = $value;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * For string fields, record the maximum string length that field can safely save.\n\t *\n\t * @since 4.2.1\n\t * @access protected\n\t *\n\t * @param array  $data  As it comes from the wpdb::process_field_charsets() method.\n\t * @param string $table Table name.\n\t * @return array|false The same array as $data with additional 'length' keys, or false if\n\t *                     any of the values were too long for their corresponding field.\n\t */\n\tprotected function process_field_lengths( $data, $table ) {\n\t\tforeach ( $data as $field => $value ) {\n\t\t\tif ( '%d' === $value['format'] || '%f' === $value['format'] ) {\n\t\t\t\t/*\n\t\t\t\t * We can skip this field if we know it isn't a string.\n\t\t\t\t * This checks %d/%f versus ! %s because its sprintf() could take more.\n\t\t\t\t */\n\t\t\t\t$value['length'] = false;\n\t\t\t} else {\n\t\t\t\t$value['length'] = $this->get_col_length( $table, $field );\n\t\t\t\tif ( is_wp_error( $value['length'] ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$data[ $field ] = $value;\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Retrieve one variable from the database.\n\t *\n\t * Executes a SQL query and returns the value from the SQL result.\n\t * If the SQL result contains more than one column and/or more than one row, this function returns the value in the column and row specified.\n\t * If $query is null, this function returns the value in the specified column and row from the previous SQL result.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string|null $query Optional. SQL query. Defaults to null, use the result from the previous query.\n\t * @param int         $x     Optional. Column of value to return. Indexed from 0.\n\t * @param int         $y     Optional. Row of value to return. Indexed from 0.\n\t * @return string|null Database query result (as string), or null on failure\n\t */\n\tpublic function get_var( $query = null, $x = 0, $y = 0 ) {\n\t\t$this->func_call = \"\\$db->get_var(\\\"$query\\\", $x, $y)\";\n\n\t\tif ( $this->check_current_query && $this->check_safe_collation( $query ) ) {\n\t\t\t$this->check_current_query = false;\n\t\t}\n\n\t\tif ( $query ) {\n\t\t\t$this->query( $query );\n\t\t}\n\n\t\t// Extract var out of cached results based x,y vals\n\t\tif ( !empty( $this->last_result[$y] ) ) {\n\t\t\t$values = array_values( get_object_vars( $this->last_result[$y] ) );\n\t\t}\n\n\t\t// If there is a value return it else return null\n\t\treturn ( isset( $values[$x] ) && $values[$x] !== '' ) ? $values[$x] : null;\n\t}\n\n\t/**\n\t * Retrieve one row from the database.\n\t *\n\t * Executes a SQL query and returns the row from the SQL result.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string|null $query  SQL query.\n\t * @param string      $output Optional. one of ARRAY_A | ARRAY_N | OBJECT constants.\n\t *                            Return an associative array (column => value, ...),\n\t *                            a numerically indexed array (0 => value, ...) or\n\t *                            an object ( ->column = value ), respectively.\n\t * @param int         $y      Optional. Row to return. Indexed from 0.\n\t * @return array|object|null|void Database query result in format specified by $output or null on failure\n\t */\n\tpublic function get_row( $query = null, $output = OBJECT, $y = 0 ) {\n\t\t$this->func_call = \"\\$db->get_row(\\\"$query\\\",$output,$y)\";\n\n\t\tif ( $this->check_current_query && $this->check_safe_collation( $query ) ) {\n\t\t\t$this->check_current_query = false;\n\t\t}\n\n\t\tif ( $query ) {\n\t\t\t$this->query( $query );\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( !isset( $this->last_result[$y] ) )\n\t\t\treturn null;\n\n\t\tif ( $output == OBJECT ) {\n\t\t\treturn $this->last_result[$y] ? $this->last_result[$y] : null;\n\t\t} elseif ( $output == ARRAY_A ) {\n\t\t\treturn $this->last_result[$y] ? get_object_vars( $this->last_result[$y] ) : null;\n\t\t} elseif ( $output == ARRAY_N ) {\n\t\t\treturn $this->last_result[$y] ? array_values( get_object_vars( $this->last_result[$y] ) ) : null;\n\t\t} elseif ( strtoupper( $output ) === OBJECT ) {\n\t\t\t// Back compat for OBJECT being previously case insensitive.\n\t\t\treturn $this->last_result[$y] ? $this->last_result[$y] : null;\n\t\t} else {\n\t\t\t$this->print_error( \" \\$db->get_row(string query, output type, int offset) -- Output type must be one of: OBJECT, ARRAY_A, ARRAY_N\" );\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve one column from the database.\n\t *\n\t * Executes a SQL query and returns the column from the SQL result.\n\t * If the SQL result contains more than one column, this function returns the column specified.\n\t * If $query is null, this function returns the specified column from the previous SQL result.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string|null $query Optional. SQL query. Defaults to previous query.\n\t * @param int         $x     Optional. Column to return. Indexed from 0.\n\t * @return array Database query result. Array indexed from 0 by SQL result row number.\n\t */\n\tpublic function get_col( $query = null , $x = 0 ) {\n\t\tif ( $this->check_current_query && $this->check_safe_collation( $query ) ) {\n\t\t\t$this->check_current_query = false;\n\t\t}\n\n\t\tif ( $query ) {\n\t\t\t$this->query( $query );\n\t\t}\n\n\t\t$new_array = array();\n\t\t// Extract the column values\n\t\tfor ( $i = 0, $j = count( $this->last_result ); $i < $j; $i++ ) {\n\t\t\t$new_array[$i] = $this->get_var( null, $x, $i );\n\t\t}\n\t\treturn $new_array;\n\t}\n\n\t/**\n\t * Retrieve an entire SQL result set from the database (i.e., many rows)\n\t *\n\t * Executes a SQL query and returns the entire SQL result.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $query  SQL query.\n\t * @param string $output Optional. Any of ARRAY_A | ARRAY_N | OBJECT | OBJECT_K constants.\n\t *                       With one of the first three, return an array of rows indexed from 0 by SQL result row number.\n\t *                       Each row is an associative array (column => value, ...), a numerically indexed array (0 => value, ...), or an object. ( ->column = value ), respectively.\n\t *                       With OBJECT_K, return an associative array of row objects keyed by the value of each row's first column's value.\n\t *                       Duplicate keys are discarded.\n\t * @return array|object|null Database query results\n\t */\n\tpublic function get_results( $query = null, $output = OBJECT ) {\n\t\t$this->func_call = \"\\$db->get_results(\\\"$query\\\", $output)\";\n\n\t\tif ( $this->check_current_query && $this->check_safe_collation( $query ) ) {\n\t\t\t$this->check_current_query = false;\n\t\t}\n\n\t\tif ( $query ) {\n\t\t\t$this->query( $query );\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\n\t\t$new_array = array();\n\t\tif ( $output == OBJECT ) {\n\t\t\t// Return an integer-keyed array of row objects\n\t\t\treturn $this->last_result;\n\t\t} elseif ( $output == OBJECT_K ) {\n\t\t\t// Return an array of row objects with keys from column 1\n\t\t\t// (Duplicates are discarded)\n\t\t\tforeach ( $this->last_result as $row ) {\n\t\t\t\t$var_by_ref = get_object_vars( $row );\n\t\t\t\t$key = array_shift( $var_by_ref );\n\t\t\t\tif ( ! isset( $new_array[ $key ] ) )\n\t\t\t\t\t$new_array[ $key ] = $row;\n\t\t\t}\n\t\t\treturn $new_array;\n\t\t} elseif ( $output == ARRAY_A || $output == ARRAY_N ) {\n\t\t\t// Return an integer-keyed array of...\n\t\t\tif ( $this->last_result ) {\n\t\t\t\tforeach ( (array) $this->last_result as $row ) {\n\t\t\t\t\tif ( $output == ARRAY_N ) {\n\t\t\t\t\t\t// ...integer-keyed row arrays\n\t\t\t\t\t\t$new_array[] = array_values( get_object_vars( $row ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// ...column name-keyed row arrays\n\t\t\t\t\t\t$new_array[] = get_object_vars( $row );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn $new_array;\n\t\t} elseif ( strtoupper( $output ) === OBJECT ) {\n\t\t\t// Back compat for OBJECT being previously case insensitive.\n\t\t\treturn $this->last_result;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Retrieves the character set for the given table.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $table Table name.\n\t * @return string|WP_Error Table character set, WP_Error object if it couldn't be found.\n\t */\n\tprotected function get_table_charset( $table ) {\n\t\t$tablekey = strtolower( $table );\n\n\t\t/**\n\t\t * Filter the table charset value before the DB is checked.\n\t\t *\n\t\t * Passing a non-null value to the filter will effectively short-circuit\n\t\t * checking the DB for the charset, returning that value instead.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param string $charset The character set to use. Default null.\n\t\t * @param string $table   The name of the table being checked.\n\t\t */\n\t\t$charset = apply_filters( 'pre_get_table_charset', null, $table );\n\t\tif ( null !== $charset ) {\n\t\t\treturn $charset;\n\t\t}\n\n\t\tif ( isset( $this->table_charset[ $tablekey ] ) ) {\n\t\t\treturn $this->table_charset[ $tablekey ];\n\t\t}\n\n\t\t$charsets = $columns = array();\n\n\t\t$table_parts = explode( '.', $table );\n\t\t$table = '`' . implode( '`.`', $table_parts ) . '`';\n\t\t$results = $this->get_results( \"SHOW FULL COLUMNS FROM $table\" );\n\t\tif ( ! $results ) {\n\t\t\treturn new WP_Error( 'wpdb_get_table_charset_failure' );\n\t\t}\n\n\t\tforeach ( $results as $column ) {\n\t\t\t$columns[ strtolower( $column->Field ) ] = $column;\n\t\t}\n\n\t\t$this->col_meta[ $tablekey ] = $columns;\n\n\t\tforeach ( $columns as $column ) {\n\t\t\tif ( ! empty( $column->Collation ) ) {\n\t\t\t\tlist( $charset ) = explode( '_', $column->Collation );\n\n\t\t\t\t// If the current connection can't support utf8mb4 characters, let's only send 3-byte utf8 characters.\n\t\t\t\tif ( 'utf8mb4' === $charset && ! $this->has_cap( 'utf8mb4' ) ) {\n\t\t\t\t\t$charset = 'utf8';\n\t\t\t\t}\n\n\t\t\t\t$charsets[ strtolower( $charset ) ] = true;\n\t\t\t}\n\n\t\t\tlist( $type ) = explode( '(', $column->Type );\n\n\t\t\t// A binary/blob means the whole query gets treated like this.\n\t\t\tif ( in_array( strtoupper( $type ), array( 'BINARY', 'VARBINARY', 'TINYBLOB', 'MEDIUMBLOB', 'BLOB', 'LONGBLOB' ) ) ) {\n\t\t\t\t$this->table_charset[ $tablekey ] = 'binary';\n\t\t\t\treturn 'binary';\n\t\t\t}\n\t\t}\n\n\t\t// utf8mb3 is an alias for utf8.\n\t\tif ( isset( $charsets['utf8mb3'] ) ) {\n\t\t\t$charsets['utf8'] = true;\n\t\t\tunset( $charsets['utf8mb3'] );\n\t\t}\n\n\t\t// Check if we have more than one charset in play.\n\t\t$count = count( $charsets );\n\t\tif ( 1 === $count ) {\n\t\t\t$charset = key( $charsets );\n\t\t} elseif ( 0 === $count ) {\n\t\t\t// No charsets, assume this table can store whatever.\n\t\t\t$charset = false;\n\t\t} else {\n\t\t\t// More than one charset. Remove latin1 if present and recalculate.\n\t\t\tunset( $charsets['latin1'] );\n\t\t\t$count = count( $charsets );\n\t\t\tif ( 1 === $count ) {\n\t\t\t\t// Only one charset (besides latin1).\n\t\t\t\t$charset = key( $charsets );\n\t\t\t} elseif ( 2 === $count && isset( $charsets['utf8'], $charsets['utf8mb4'] ) ) {\n\t\t\t\t// Two charsets, but they're utf8 and utf8mb4, use utf8.\n\t\t\t\t$charset = 'utf8';\n\t\t\t} else {\n\t\t\t\t// Two mixed character sets. ascii.\n\t\t\t\t$charset = 'ascii';\n\t\t\t}\n\t\t}\n\n\t\t$this->table_charset[ $tablekey ] = $charset;\n\t\treturn $charset;\n\t}\n\n\t/**\n\t * Retrieves the character set for the given column.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param string $table  Table name.\n\t * @param string $column Column name.\n\t * @return string|false|WP_Error Column character set as a string. False if the column has no\n\t *                               character set. WP_Error object if there was an error.\n\t */\n\tpublic function get_col_charset( $table, $column ) {\n\t\t$tablekey = strtolower( $table );\n\t\t$columnkey = strtolower( $column );\n\n\t\t/**\n\t\t * Filter the column charset value before the DB is checked.\n\t\t *\n\t\t * Passing a non-null value to the filter will short-circuit\n\t\t * checking the DB for the charset, returning that value instead.\n\t\t *\n\t\t * @since 4.2.0\n\t\t *\n\t\t * @param string $charset The character set to use. Default null.\n\t\t * @param string $table   The name of the table being checked.\n\t\t * @param string $column  The name of the column being checked.\n\t\t */\n\t\t$charset = apply_filters( 'pre_get_col_charset', null, $table, $column );\n\t\tif ( null !== $charset ) {\n\t\t\treturn $charset;\n\t\t}\n\n\t\t// Skip this entirely if this isn't a MySQL database.\n\t\tif ( empty( $this->is_mysql ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( empty( $this->table_charset[ $tablekey ] ) ) {\n\t\t\t// This primes column information for us.\n\t\t\t$table_charset = $this->get_table_charset( $table );\n\t\t\tif ( is_wp_error( $table_charset ) ) {\n\t\t\t\treturn $table_charset;\n\t\t\t}\n\t\t}\n\n\t\t// If still no column information, return the table charset.\n\t\tif ( empty( $this->col_meta[ $tablekey ] ) ) {\n\t\t\treturn $this->table_charset[ $tablekey ];\n\t\t}\n\n\t\t// If this column doesn't exist, return the table charset.\n\t\tif ( empty( $this->col_meta[ $tablekey ][ $columnkey ] ) ) {\n\t\t\treturn $this->table_charset[ $tablekey ];\n\t\t}\n\n\t\t// Return false when it's not a string column.\n\t\tif ( empty( $this->col_meta[ $tablekey ][ $columnkey ]->Collation ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlist( $charset ) = explode( '_', $this->col_meta[ $tablekey ][ $columnkey ]->Collation );\n\t\treturn $charset;\n\t}\n\n\t/**\n\t * Retrieve the maximum string length allowed in a given column.\n\t * The length may either be specified as a byte length or a character length.\n\t *\n\t * @since 4.2.1\n\t * @access public\n\t *\n\t * @param string $table  Table name.\n\t * @param string $column Column name.\n\t * @return array|false|WP_Error array( 'length' => (int), 'type' => 'byte' | 'char' )\n\t *                              false if the column has no length (for example, numeric column)\n\t *                              WP_Error object if there was an error.\n\t */\n\tpublic function get_col_length( $table, $column ) {\n\t\t$tablekey = strtolower( $table );\n\t\t$columnkey = strtolower( $column );\n\n\t\t// Skip this entirely if this isn't a MySQL database.\n\t\tif ( empty( $this->is_mysql ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( empty( $this->col_meta[ $tablekey ] ) ) {\n\t\t\t// This primes column information for us.\n\t\t\t$table_charset = $this->get_table_charset( $table );\n\t\t\tif ( is_wp_error( $table_charset ) ) {\n\t\t\t\treturn $table_charset;\n\t\t\t}\n\t\t}\n\n\t\tif ( empty( $this->col_meta[ $tablekey ][ $columnkey ] ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$typeinfo = explode( '(', $this->col_meta[ $tablekey ][ $columnkey ]->Type );\n\n\t\t$type = strtolower( $typeinfo[0] );\n\t\tif ( ! empty( $typeinfo[1] ) ) {\n\t\t\t$length = trim( $typeinfo[1], ')' );\n\t\t} else {\n\t\t\t$length = false;\n\t\t}\n\n\t\tswitch( $type ) {\n\t\t\tcase 'char':\n\t\t\tcase 'varchar':\n\t\t\t\treturn array(\n\t\t\t\t\t'type'   => 'char',\n\t\t\t\t\t'length' => (int) $length,\n\t\t\t\t);\n\n\t\t\tcase 'binary':\n\t\t\tcase 'varbinary':\n\t\t\t\treturn array(\n\t\t\t\t\t'type'   => 'byte',\n\t\t\t\t\t'length' => (int) $length,\n\t\t\t\t);\n\n\t\t\tcase 'tinyblob':\n\t\t\tcase 'tinytext':\n\t\t\t\treturn array(\n\t\t\t\t\t'type'   => 'byte',\n\t\t\t\t\t'length' => 255,        // 2^8 - 1\n\t\t\t\t);\n\n\t\t\tcase 'blob':\n\t\t\tcase 'text':\n\t\t\t\treturn array(\n\t\t\t\t\t'type'   => 'byte',\n\t\t\t\t\t'length' => 65535,      // 2^16 - 1\n\t\t\t\t);\n\n\t\t\tcase 'mediumblob':\n\t\t\tcase 'mediumtext':\n\t\t\t\treturn array(\n\t\t\t\t\t'type'   => 'byte',\n\t\t\t\t\t'length' => 16777215,   // 2^24 - 1\n\t\t\t\t);\n\n\t\t\tcase 'longblob':\n\t\t\tcase 'longtext':\n\t\t\t\treturn array(\n\t\t\t\t\t'type'   => 'byte',\n\t\t\t\t\t'length' => 4294967295, // 2^32 - 1\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Check if a string is ASCII.\n\t *\n\t * The negative regex is faster for non-ASCII strings, as it allows\n\t * the search to finish as soon as it encounters a non-ASCII character.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $string String to check.\n\t * @return bool True if ASCII, false if not.\n\t */\n\tprotected function check_ascii( $string ) {\n\t\tif ( function_exists( 'mb_check_encoding' ) ) {\n\t\t\tif ( mb_check_encoding( $string, 'ASCII' ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} elseif ( ! preg_match( '/[^\\x00-\\x7F]/', $string ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if the query is accessing a collation considered safe on the current version of MySQL.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $query The query to check.\n\t * @return bool True if the collation is safe, false if it isn't.\n\t */\n\tprotected function check_safe_collation( $query ) {\n\t\tif ( $this->checking_collation ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// We don't need to check the collation for queries that don't read data.\n\t\t$query = ltrim( $query, \"\\r\\n\\t (\" );\n\t\tif ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\\s/i', $query ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// All-ASCII queries don't need extra checking.\n\t\tif ( $this->check_ascii( $query ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t$table = $this->get_table_from_query( $query );\n\t\tif ( ! $table ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t$this->checking_collation = true;\n\t\t$collation = $this->get_table_charset( $table );\n\t\t$this->checking_collation = false;\n\n\t\t// Tables with no collation, or latin1 only, don't need extra checking.\n\t\tif ( false === $collation || 'latin1' === $collation ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t$table = strtolower( $table );\n\t\tif ( empty( $this->col_meta[ $table ] ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If any of the columns don't have one of these collations, it needs more sanity checking.\n\t\tforeach ( $this->col_meta[ $table ] as $col ) {\n\t\t\tif ( empty( $col->Collation ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( ! in_array( $col->Collation, array( 'utf8_general_ci', 'utf8_bin', 'utf8mb4_general_ci', 'utf8mb4_bin' ), true ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Strips any invalid characters based on value/charset pairs.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param array $data Array of value arrays. Each value array has the keys\n\t *                    'value' and 'charset'. An optional 'ascii' key can be\n\t *                    set to false to avoid redundant ASCII checks.\n\t * @return array|WP_Error The $data parameter, with invalid characters removed from\n\t *                        each value. This works as a passthrough: any additional keys\n\t *                        such as 'field' are retained in each value array. If we cannot\n\t *                        remove invalid characters, a WP_Error object is returned.\n\t */\n\tprotected function strip_invalid_text( $data ) {\n\t\t$db_check_string = false;\n\n\t\tforeach ( $data as &$value ) {\n\t\t\t$charset = $value['charset'];\n\n\t\t\tif ( is_array( $value['length'] ) ) {\n\t\t\t\t$length = $value['length']['length'];\n\t\t\t\t$truncate_by_byte_length = 'byte' === $value['length']['type'];\n\t\t\t} else {\n\t\t\t\t$length = false;\n\t\t\t\t// Since we have no length, we'll never truncate.\n\t\t\t\t// Initialize the variable to false. true would take us\n\t\t\t\t// through an unnecessary (for this case) codepath below.\n\t\t\t\t$truncate_by_byte_length = false;\n\t\t\t}\n\n\t\t\t// There's no charset to work with.\n\t\t\tif ( false === $charset ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Column isn't a string.\n\t\t\tif ( ! is_string( $value['value'] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t$needs_validation = true;\n\t\t\tif (\n\t\t\t\t// latin1 can store any byte sequence\n\t\t\t\t'latin1' === $charset\n\t\t\t||\n\t\t\t\t// ASCII is always OK.\n\t\t\t\t( ! isset( $value['ascii'] ) && $this->check_ascii( $value['value'] ) )\n\t\t\t) {\n\t\t\t\t$truncate_by_byte_length = true;\n\t\t\t\t$needs_validation = false;\n\t\t\t}\n\n\t\t\tif ( $truncate_by_byte_length ) {\n\t\t\t\tmbstring_binary_safe_encoding();\n\t\t\t\tif ( false !== $length && strlen( $value['value'] ) > $length ) {\n\t\t\t\t\t$value['value'] = substr( $value['value'], 0, $length );\n\t\t\t\t}\n\t\t\t\treset_mbstring_encoding();\n\n\t\t\t\tif ( ! $needs_validation ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// utf8 can be handled by regex, which is a bunch faster than a DB lookup.\n\t\t\tif ( ( 'utf8' === $charset || 'utf8mb3' === $charset || 'utf8mb4' === $charset ) && function_exists( 'mb_strlen' ) ) {\n\t\t\t\t$regex = '/\n\t\t\t\t\t(\n\t\t\t\t\t\t(?: [\\x00-\\x7F]                  # single-byte sequences   0xxxxxxx\n\t\t\t\t\t\t|   [\\xC2-\\xDF][\\x80-\\xBF]       # double-byte sequences   110xxxxx 10xxxxxx\n\t\t\t\t\t\t|   \\xE0[\\xA0-\\xBF][\\x80-\\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2\n\t\t\t\t\t\t|   [\\xE1-\\xEC][\\x80-\\xBF]{2}\n\t\t\t\t\t\t|   \\xED[\\x80-\\x9F][\\x80-\\xBF]\n\t\t\t\t\t\t|   [\\xEE-\\xEF][\\x80-\\xBF]{2}';\n\n\t\t\t\tif ( 'utf8mb4' === $charset ) {\n\t\t\t\t\t$regex .= '\n\t\t\t\t\t\t|    \\xF0[\\x90-\\xBF][\\x80-\\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3\n\t\t\t\t\t\t|    [\\xF1-\\xF3][\\x80-\\xBF]{3}\n\t\t\t\t\t\t|    \\xF4[\\x80-\\x8F][\\x80-\\xBF]{2}\n\t\t\t\t\t';\n\t\t\t\t}\n\n\t\t\t\t$regex .= '){1,40}                          # ...one or more times\n\t\t\t\t\t)\n\t\t\t\t\t| .                                  # anything else\n\t\t\t\t\t/x';\n\t\t\t\t$value['value'] = preg_replace( $regex, '$1', $value['value'] );\n\n\n\t\t\t\tif ( false !== $length && mb_strlen( $value['value'], 'UTF-8' ) > $length ) {\n\t\t\t\t\t$value['value'] = mb_substr( $value['value'], 0, $length, 'UTF-8' );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We couldn't use any local conversions, send it to the DB.\n\t\t\t$value['db'] = $db_check_string = true;\n\t\t}\n\t\tunset( $value ); // Remove by reference.\n\n\t\tif ( $db_check_string ) {\n\t\t\t$queries = array();\n\t\t\tforeach ( $data as $col => $value ) {\n\t\t\t\tif ( ! empty( $value['db'] ) ) {\n\t\t\t\t\t// We're going to need to truncate by characters or bytes, depending on the length value we have.\n\t\t\t\t\tif ( 'byte' === $value['length']['type'] ) {\n\t\t\t\t\t\t// Using binary causes LEFT() to truncate by bytes.\n\t\t\t\t\t\t$charset = 'binary';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$charset = $value['charset'];\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( $this->charset ) {\n\t\t\t\t\t\t$connection_charset = $this->charset;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\t\t\t\t$connection_charset = mysqli_character_set_name( $this->dbh );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$connection_charset = mysql_client_encoding();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( is_array( $value['length'] ) ) {\n\t\t\t\t\t\t$queries[ $col ] = $this->prepare( \"CONVERT( LEFT( CONVERT( %s USING $charset ), %.0f ) USING $connection_charset )\", $value['value'], $value['length']['length'] );\n\t\t\t\t\t} else if ( 'binary' !== $charset ) {\n\t\t\t\t\t\t// If we don't have a length, there's no need to convert binary - it will always return the same result.\n\t\t\t\t\t\t$queries[ $col ] = $this->prepare( \"CONVERT( CONVERT( %s USING $charset ) USING $connection_charset )\", $value['value'] );\n\t\t\t\t\t}\n\n\t\t\t\t\tunset( $data[ $col ]['db'] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$sql = array();\n\t\t\tforeach ( $queries as $column => $query ) {\n\t\t\t\tif ( ! $query ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$sql[] = $query . \" AS x_$column\";\n\t\t\t}\n\n\t\t\t$this->check_current_query = false;\n\t\t\t$row = $this->get_row( \"SELECT \" . implode( ', ', $sql ), ARRAY_A );\n\t\t\tif ( ! $row ) {\n\t\t\t\treturn new WP_Error( 'wpdb_strip_invalid_text_failure' );\n\t\t\t}\n\n\t\t\tforeach ( array_keys( $data ) as $column ) {\n\t\t\t\tif ( isset( $row[\"x_$column\"] ) ) {\n\t\t\t\t\t$data[ $column ]['value'] = $row[\"x_$column\"];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $data;\n\t}\n\n\t/**\n\t * Strips any invalid characters from the query.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $query Query to convert.\n\t * @return string|WP_Error The converted query, or a WP_Error object if the conversion fails.\n\t */\n\tprotected function strip_invalid_text_from_query( $query ) {\n\t\t// We don't need to check the collation for queries that don't read data.\n\t\t$trimmed_query = ltrim( $query, \"\\r\\n\\t (\" );\n\t\tif ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\\s/i', $trimmed_query ) ) {\n\t\t\treturn $query;\n\t\t}\n\n\t\t$table = $this->get_table_from_query( $query );\n\t\tif ( $table ) {\n\t\t\t$charset = $this->get_table_charset( $table );\n\t\t\tif ( is_wp_error( $charset ) ) {\n\t\t\t\treturn $charset;\n\t\t\t}\n\n\t\t\t// We can't reliably strip text from tables containing binary/blob columns\n\t\t\tif ( 'binary' === $charset ) {\n\t\t\t\treturn $query;\n\t\t\t}\n\t\t} else {\n\t\t\t$charset = $this->charset;\n\t\t}\n\n\t\t$data = array(\n\t\t\t'value'   => $query,\n\t\t\t'charset' => $charset,\n\t\t\t'ascii'   => false,\n\t\t\t'length'  => false,\n\t\t);\n\n\t\t$data = $this->strip_invalid_text( array( $data ) );\n\t\tif ( is_wp_error( $data ) ) {\n\t\t\treturn $data;\n\t\t}\n\n\t\treturn $data[0]['value'];\n\t}\n\n\t/**\n\t * Strips any invalid characters from the string for a given table and column.\n\t *\n\t * @since 4.2.0\n\t * @access public\n\t *\n\t * @param string $table  Table name.\n\t * @param string $column Column name.\n\t * @param string $value  The text to check.\n\t * @return string|WP_Error The converted string, or a WP_Error object if the conversion fails.\n\t */\n\tpublic function strip_invalid_text_for_column( $table, $column, $value ) {\n\t\tif ( ! is_string( $value ) ) {\n\t\t\treturn $value;\n\t\t}\n\n\t\t$charset = $this->get_col_charset( $table, $column );\n\t\tif ( ! $charset ) {\n\t\t\t// Not a string column.\n\t\t\treturn $value;\n\t\t} elseif ( is_wp_error( $charset ) ) {\n\t\t\t// Bail on real errors.\n\t\t\treturn $charset;\n\t\t}\n\n\t\t$data = array(\n\t\t\t$column => array(\n\t\t\t\t'value'   => $value,\n\t\t\t\t'charset' => $charset,\n\t\t\t\t'length'  => $this->get_col_length( $table, $column ),\n\t\t\t)\n\t\t);\n\n\t\t$data = $this->strip_invalid_text( $data );\n\t\tif ( is_wp_error( $data ) ) {\n\t\t\treturn $data;\n\t\t}\n\n\t\treturn $data[ $column ]['value'];\n\t}\n\n\t/**\n\t * Find the first table name referenced in a query.\n\t *\n\t * @since 4.2.0\n\t * @access protected\n\t *\n\t * @param string $query The query to search.\n\t * @return string|false $table The table name found, or false if a table couldn't be found.\n\t */\n\tprotected function get_table_from_query( $query ) {\n\t\t// Remove characters that can legally trail the table name.\n\t\t$query = rtrim( $query, ';/-#' );\n\n\t\t// Allow (select...) union [...] style queries. Use the first query's table name.\n\t\t$query = ltrim( $query, \"\\r\\n\\t (\" );\n\n\t\t// Strip everything between parentheses except nested selects.\n\t\t$query = preg_replace( '/\\((?!\\s*select)[^(]*?\\)/is', '()', $query );\n\n\t\t// Quickly match most common queries.\n\t\tif ( preg_match( '/^\\s*(?:'\n\t\t\t\t. 'SELECT.*?\\s+FROM'\n\t\t\t\t. '|INSERT(?:\\s+LOW_PRIORITY|\\s+DELAYED|\\s+HIGH_PRIORITY)?(?:\\s+IGNORE)?(?:\\s+INTO)?'\n\t\t\t\t. '|REPLACE(?:\\s+LOW_PRIORITY|\\s+DELAYED)?(?:\\s+INTO)?'\n\t\t\t\t. '|UPDATE(?:\\s+LOW_PRIORITY)?(?:\\s+IGNORE)?'\n\t\t\t\t. '|DELETE(?:\\s+LOW_PRIORITY|\\s+QUICK|\\s+IGNORE)*(?:\\s+FROM)?'\n\t\t\t\t. ')\\s+((?:[0-9a-zA-Z$_.`-]|[\\xC2-\\xDF][\\x80-\\xBF])+)/is', $query, $maybe ) ) {\n\t\t\treturn str_replace( '`', '', $maybe[1] );\n\t\t}\n\n\t\t// SHOW TABLE STATUS and SHOW TABLES\n\t\tif ( preg_match( '/^\\s*(?:'\n\t\t\t\t. 'SHOW\\s+TABLE\\s+STATUS.+(?:LIKE\\s+|WHERE\\s+Name\\s*=\\s*)'\n\t\t\t\t. '|SHOW\\s+(?:FULL\\s+)?TABLES.+(?:LIKE\\s+|WHERE\\s+Name\\s*=\\s*)'\n\t\t\t\t. ')\\W((?:[0-9a-zA-Z$_.`-]|[\\xC2-\\xDF][\\x80-\\xBF])+)\\W/is', $query, $maybe ) ) {\n\t\t\treturn str_replace( '`', '', $maybe[1] );\n\t\t}\n\n\t\t// Big pattern for the rest of the table-related queries.\n\t\tif ( preg_match( '/^\\s*(?:'\n\t\t\t\t. '(?:EXPLAIN\\s+(?:EXTENDED\\s+)?)?SELECT.*?\\s+FROM'\n\t\t\t\t. '|DESCRIBE|DESC|EXPLAIN|HANDLER'\n\t\t\t\t. '|(?:LOCK|UNLOCK)\\s+TABLE(?:S)?'\n\t\t\t\t. '|(?:RENAME|OPTIMIZE|BACKUP|RESTORE|CHECK|CHECKSUM|ANALYZE|REPAIR).*\\s+TABLE'\n\t\t\t\t. '|TRUNCATE(?:\\s+TABLE)?'\n\t\t\t\t. '|CREATE(?:\\s+TEMPORARY)?\\s+TABLE(?:\\s+IF\\s+NOT\\s+EXISTS)?'\n\t\t\t\t. '|ALTER(?:\\s+IGNORE)?\\s+TABLE'\n\t\t\t\t. '|DROP\\s+TABLE(?:\\s+IF\\s+EXISTS)?'\n\t\t\t\t. '|CREATE(?:\\s+\\w+)?\\s+INDEX.*\\s+ON'\n\t\t\t\t. '|DROP\\s+INDEX.*\\s+ON'\n\t\t\t\t. '|LOAD\\s+DATA.*INFILE.*INTO\\s+TABLE'\n\t\t\t\t. '|(?:GRANT|REVOKE).*ON\\s+TABLE'\n\t\t\t\t. '|SHOW\\s+(?:.*FROM|.*TABLE)'\n\t\t\t\t. ')\\s+\\(*\\s*((?:[0-9a-zA-Z$_.`-]|[\\xC2-\\xDF][\\x80-\\xBF])+)\\s*\\)*/is', $query, $maybe ) ) {\n\t\t\treturn str_replace( '`', '', $maybe[1] );\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Load the column metadata from the last query.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @access protected\n\t */\n\tprotected function load_col_info() {\n\t\tif ( $this->col_info )\n\t\t\treturn;\n\n\t\tif ( $this->use_mysqli ) {\n\t\t\t$num_fields = @mysqli_num_fields( $this->result );\n\t\t\tfor ( $i = 0; $i < $num_fields; $i++ ) {\n\t\t\t\t$this->col_info[ $i ] = @mysqli_fetch_field( $this->result );\n\t\t\t}\n\t\t} else {\n\t\t\t$num_fields = @mysql_num_fields( $this->result );\n\t\t\tfor ( $i = 0; $i < $num_fields; $i++ ) {\n\t\t\t\t$this->col_info[ $i ] = @mysql_fetch_field( $this->result, $i );\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve column metadata from the last query.\n\t *\n\t * @since 0.71\n\t *\n\t * @param string $info_type  Optional. Type one of name, table, def, max_length, not_null, primary_key, multiple_key, unique_key, numeric, blob, type, unsigned, zerofill\n\t * @param int    $col_offset Optional. 0: col name. 1: which table the col's in. 2: col's max length. 3: if the col is numeric. 4: col's type\n\t * @return mixed Column Results\n\t */\n\tpublic function get_col_info( $info_type = 'name', $col_offset = -1 ) {\n\t\t$this->load_col_info();\n\n\t\tif ( $this->col_info ) {\n\t\t\tif ( $col_offset == -1 ) {\n\t\t\t\t$i = 0;\n\t\t\t\t$new_array = array();\n\t\t\t\tforeach ( (array) $this->col_info as $col ) {\n\t\t\t\t\t$new_array[$i] = $col->{$info_type};\n\t\t\t\t\t$i++;\n\t\t\t\t}\n\t\t\t\treturn $new_array;\n\t\t\t} else {\n\t\t\t\treturn $this->col_info[$col_offset]->{$info_type};\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Starts the timer, for debugging purposes.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @return true\n\t */\n\tpublic function timer_start() {\n\t\t$this->time_start = microtime( true );\n\t\treturn true;\n\t}\n\n\t/**\n\t * Stops the debugging timer.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @return float Total time spent on the query, in seconds\n\t */\n\tpublic function timer_stop() {\n\t\treturn ( microtime( true ) - $this->time_start );\n\t}\n\n\t/**\n\t * Wraps errors in a nice header and footer and dies.\n\t *\n\t * Will not die if wpdb::$show_errors is false.\n\t *\n\t * @since 1.5.0\n\t *\n\t * @param string $message    The Error message\n\t * @param string $error_code Optional. A Computer readable string to identify the error.\n\t * @return false|void\n\t */\n\tpublic function bail( $message, $error_code = '500' ) {\n\t\tif ( !$this->show_errors ) {\n\t\t\tif ( class_exists( 'WP_Error', false ) ) {\n\t\t\t\t$this->error = new WP_Error($error_code, $message);\n\t\t\t} else {\n\t\t\t\t$this->error = $message;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\twp_die($message);\n\t}\n\n\t/**\n\t * Whether MySQL database is at least the required minimum version.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @global string $wp_version\n\t * @global string $required_mysql_version\n\t *\n\t * @return WP_Error|void\n\t */\n\tpublic function check_database_version() {\n\t\tglobal $wp_version, $required_mysql_version;\n\t\t// Make sure the server has the required MySQL version\n\t\tif ( version_compare($this->db_version(), $required_mysql_version, '<') )\n\t\t\treturn new WP_Error('database_version', sprintf( __( '<strong>ERROR</strong>: WordPress %1$s requires MySQL %2$s or higher' ), $wp_version, $required_mysql_version ));\n\t}\n\n\t/**\n\t * Whether the database supports collation.\n\t *\n\t * Called when WordPress is generating the table scheme.\n\t *\n\t * Use `wpdb::has_cap( 'collation' )`.\n\t *\n\t * @since 2.5.0\n\t * @deprecated 3.5.0 Use wpdb::has_cap()\n\t *\n\t * @return bool True if collation is supported, false if version does not\n\t */\n\tpublic function supports_collation() {\n\t\t_deprecated_function( __FUNCTION__, '3.5', 'wpdb::has_cap( \\'collation\\' )' );\n\t\treturn $this->has_cap( 'collation' );\n\t}\n\n\t/**\n\t * The database character collate.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @return string The database character collate.\n\t */\n\tpublic function get_charset_collate() {\n\t\t$charset_collate = '';\n\n\t\tif ( ! empty( $this->charset ) )\n\t\t\t$charset_collate = \"DEFAULT CHARACTER SET $this->charset\";\n\t\tif ( ! empty( $this->collate ) )\n\t\t\t$charset_collate .= \" COLLATE $this->collate\";\n\n\t\treturn $charset_collate;\n\t}\n\n\t/**\n\t * Determine if a database supports a particular feature.\n\t *\n\t * @since 2.7.0\n\t * @since 4.1.0 Support was added for the 'utf8mb4' feature.\n\t *\n\t * @see wpdb::db_version()\n\t *\n\t * @param string $db_cap The feature to check for. Accepts 'collation',\n\t *                       'group_concat', 'subqueries', 'set_charset',\n\t *                       or 'utf8mb4'.\n\t * @return int|false Whether the database feature is supported, false otherwise.\n\t */\n\tpublic function has_cap( $db_cap ) {\n\t\t$version = $this->db_version();\n\n\t\tswitch ( strtolower( $db_cap ) ) {\n\t\t\tcase 'collation' :    // @since 2.5.0\n\t\t\tcase 'group_concat' : // @since 2.7.0\n\t\t\tcase 'subqueries' :   // @since 2.7.0\n\t\t\t\treturn version_compare( $version, '4.1', '>=' );\n\t\t\tcase 'set_charset' :\n\t\t\t\treturn version_compare( $version, '5.0.7', '>=' );\n\t\t\tcase 'utf8mb4' :      // @since 4.1.0\n\t\t\t\tif ( version_compare( $version, '5.5.3', '<' ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif ( $this->use_mysqli ) {\n\t\t\t\t\t$client_version = mysqli_get_client_info();\n\t\t\t\t} else {\n\t\t\t\t\t$client_version = mysql_get_client_info();\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server.\n\t\t\t\t * mysqlnd has supported utf8mb4 since 5.0.9.\n\t\t\t\t */\n\t\t\t\tif ( false !== strpos( $client_version, 'mysqlnd' ) ) {\n\t\t\t\t\t$client_version = preg_replace( '/^\\D+([\\d.]+).*/', '$1', $client_version );\n\t\t\t\t\treturn version_compare( $client_version, '5.0.9', '>=' );\n\t\t\t\t} else {\n\t\t\t\t\treturn version_compare( $client_version, '5.5.3', '>=' );\n\t\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Retrieve the name of the function that called wpdb.\n\t *\n\t * Searches up the list of functions until it reaches\n\t * the one that would most logically had called this method.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @return string|array The name of the calling function\n\t */\n\tpublic function get_caller() {\n\t\treturn wp_debug_backtrace_summary( __CLASS__ );\n\t}\n\n\t/**\n\t * The database version number.\n\t *\n\t * @since 2.7.0\n\t *\n\t * @return null|string Null on failure, version number on success.\n\t */\n\tpublic function db_version() {\n\t\tif ( $this->use_mysqli ) {\n\t\t\t$server_info = mysqli_get_server_info( $this->dbh );\n\t\t} else {\n\t\t\t$server_info = mysql_get_server_info( $this->dbh );\n\t\t}\n\t\treturn preg_replace( '/[^0-9.].*/', '', $server_info );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-includes/wp-diff.php",
    "content": "<?php\n/**\n * WordPress Diff bastard child of old MediaWiki Diff Formatter.\n *\n * Basically all that remains is the table structure and some method names.\n *\n * @package WordPress\n * @subpackage Diff\n */\n\nif ( ! class_exists( 'Text_Diff', false ) ) {\n\t/** Text_Diff class */\n\trequire( dirname(__FILE__).'/Text/Diff.php' );\n\t/** Text_Diff_Renderer class */\n\trequire( dirname(__FILE__).'/Text/Diff/Renderer.php' );\n\t/** Text_Diff_Renderer_inline class */\n\trequire( dirname(__FILE__).'/Text/Diff/Renderer/inline.php' );\n}\n\n/**\n * Table renderer to display the diff lines.\n *\n * @since 2.6.0\n * @uses Text_Diff_Renderer Extends\n */\nclass WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {\n\n\t/**\n\t * @see Text_Diff_Renderer::_leading_context_lines\n\t * @var int\n\t * @access public\n\t * @since 2.6.0\n\t */\n\tpublic $_leading_context_lines  = 10000;\n\n\t/**\n\t * @see Text_Diff_Renderer::_trailing_context_lines\n\t * @var int\n\t * @access public\n\t * @since 2.6.0\n\t */\n\tpublic $_trailing_context_lines = 10000;\n\n\t/**\n\t * Threshold for when a diff should be saved or omitted.\n\t *\n\t * @var float\n\t * @access protected\n\t * @since 2.6.0\n\t */\n\tprotected $_diff_threshold = 0.6;\n\n\t/**\n\t * Inline display helper object name.\n\t *\n\t * @var string\n\t * @access protected\n\t * @since 2.6.0\n\t */\n\tprotected $inline_diff_renderer = 'WP_Text_Diff_Renderer_inline';\n\n\t/**\n\t * Should we show the split view or not\n\t *\n\t * @var string\n\t * @access protected\n\t * @since 3.6.0\n\t */\n\tprotected $_show_split_view = true;\n\n\tprotected $compat_fields = array( '_show_split_view', 'inline_diff_renderer', '_diff_threshold' );\n\n\t/**\n\t * Constructor - Call parent constructor with params array.\n\t *\n\t * This will set class properties based on the key value pairs in the array.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param array $params\n\t */\n\tpublic function __construct( $params = array() ) {\n\t\tparent::__construct( $params );\n\t\tif ( isset( $params[ 'show_split_view' ] ) )\n\t\t\t$this->_show_split_view = $params[ 'show_split_view' ];\n\t}\n\n\t/**\n\t * @ignore\n\t *\n\t * @param string $header\n\t * @return string\n\t */\n\tpublic function _startBlock( $header ) {\n\t\treturn '';\n\t}\n\n\t/**\n\t * @ignore\n\t *\n\t * @param array $lines\n\t * @param string $prefix\n\t */\n\tpublic function _lines( $lines, $prefix=' ' ) {\n\t}\n\n\t/**\n\t * @ignore\n\t *\n\t * @param string $line HTML-escape the value.\n\t * @return string\n\t */\n\tpublic function addedLine( $line ) {\n\t\treturn \"<td class='diff-addedline'>{$line}</td>\";\n\n\t}\n\n\t/**\n\t * @ignore\n\t *\n\t * @param string $line HTML-escape the value.\n\t * @return string\n\t */\n\tpublic function deletedLine( $line ) {\n\t\treturn \"<td class='diff-deletedline'>{$line}</td>\";\n\t}\n\n\t/**\n\t * @ignore\n\t *\n\t * @param string $line HTML-escape the value.\n\t * @return string\n\t */\n\tpublic function contextLine( $line ) {\n\t\treturn \"<td class='diff-context'>{$line}</td>\";\n\t}\n\n\t/**\n\t * @ignore\n\t *\n\t * @return string\n\t */\n\tpublic function emptyLine() {\n\t\treturn '<td>&nbsp;</td>';\n\t}\n\n\t/**\n\t * @ignore\n\t * @access public\n\t *\n\t * @param array $lines\n\t * @param bool $encode\n\t * @return string\n\t */\n\tpublic function _added( $lines, $encode = true ) {\n\t\t$r = '';\n\t\tforeach ($lines as $line) {\n\t\t\tif ( $encode ) {\n\t\t\t\t$processed_line = htmlspecialchars( $line );\n\n\t\t\t\t/**\n\t\t\t\t * Contextually filter a diffed line.\n\t\t\t\t *\n\t\t\t\t * Filters TextDiff processing of diffed line. By default, diffs are processed with\n\t\t\t\t * htmlspecialchars. Use this filter to remove or change the processing. Passes a context\n\t\t\t\t * indicating if the line is added, deleted or unchanged.\n\t\t\t\t *\n\t\t\t\t * @since 4.1.0\n\t\t\t\t *\n\t\t\t\t * @param String $processed_line The processed diffed line.\n\t\t\t\t * @param String $line           The unprocessed diffed line.\n\t\t \t\t * @param string null            The line context. Values are 'added', 'deleted' or 'unchanged'.\n\t\t\t\t */\n\t\t\t\t$line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'added' );\n\t\t\t}\n\n\t\t\tif ( $this->_show_split_view ) {\n\t\t\t\t$r .= '<tr>' . $this->emptyLine() . $this->emptyLine() . $this->addedLine( $line ) . \"</tr>\\n\";\n\t\t\t} else {\n\t\t\t\t$r .= '<tr>' . $this->addedLine( $line ) . \"</tr>\\n\";\n\t\t\t}\n\t\t}\n\t\treturn $r;\n\t}\n\n\t/**\n\t * @ignore\n\t * @access public\n\t *\n\t * @param array $lines\n\t * @param bool $encode\n\t * @return string\n\t */\n\tpublic function _deleted( $lines, $encode = true ) {\n\t\t$r = '';\n\t\tforeach ($lines as $line) {\n\t\t\tif ( $encode ) {\n\t\t\t\t$processed_line = htmlspecialchars( $line );\n\n\t\t\t\t/** This filter is documented in wp-includes/wp-diff.php */\n\t\t\t\t$line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'deleted' );\n\t\t\t}\n\t\t\tif ( $this->_show_split_view ) {\n\t\t\t\t$r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . $this->emptyLine() . \"</tr>\\n\";\n\t\t\t} else {\n\t\t\t\t$r .= '<tr>' . $this->deletedLine( $line ) . \"</tr>\\n\";\n\t\t\t}\n\n\t\t}\n\t\treturn $r;\n\t}\n\n\t/**\n\t * @ignore\n\t * @access public\n\t *\n\t * @param array $lines\n\t * @param bool $encode\n\t * @return string\n\t */\n\tpublic function _context( $lines, $encode = true ) {\n\t\t$r = '';\n\t\tforeach ($lines as $line) {\n\t\t\tif ( $encode ) {\n\t\t\t\t$processed_line = htmlspecialchars( $line );\n\n\t\t\t\t/** This filter is documented in wp-includes/wp-diff.php */\n\t\t\t\t$line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'unchanged' );\n\t\t\t}\n\t\t\tif (  $this->_show_split_view ) {\n\t\t\t\t$r .= '<tr>' . $this->contextLine( $line ) . $this->emptyLine() . $this->contextLine( $line )  . \"</tr>\\n\";\n\t\t\t} else {\n\t\t\t\t$r .= '<tr>' . $this->contextLine( $line ) . \"</tr>\\n\";\n\t\t\t}\n\t\t}\n\t\treturn $r;\n\t}\n\n\t/**\n\t * Process changed lines to do word-by-word diffs for extra highlighting.\n\t *\n\t * (TRAC style) sometimes these lines can actually be deleted or added rows.\n\t * We do additional processing to figure that out\n\t *\n\t * @access public\n\t * @since 2.6.0\n\t *\n\t * @param array $orig\n\t * @param array $final\n\t * @return string\n\t */\n\tpublic function _changed( $orig, $final ) {\n\t\t$r = '';\n\n\t\t// Does the aforementioned additional processing\n\t\t// *_matches tell what rows are \"the same\" in orig and final. Those pairs will be diffed to get word changes\n\t\t//\tmatch is numeric: an index in other column\n\t\t//\tmatch is 'X': no match. It is a new row\n\t\t// *_rows are column vectors for the orig column and the final column.\n\t\t//\trow >= 0: an indix of the $orig or $final array\n\t\t//\trow  < 0: a blank row for that column\n\t\tlist($orig_matches, $final_matches, $orig_rows, $final_rows) = $this->interleave_changed_lines( $orig, $final );\n\n\t\t// These will hold the word changes as determined by an inline diff\n\t\t$orig_diffs  = array();\n\t\t$final_diffs = array();\n\n\t\t// Compute word diffs for each matched pair using the inline diff\n\t\tforeach ( $orig_matches as $o => $f ) {\n\t\t\tif ( is_numeric($o) && is_numeric($f) ) {\n\t\t\t\t$text_diff = new Text_Diff( 'auto', array( array($orig[$o]), array($final[$f]) ) );\n\t\t\t\t$renderer = new $this->inline_diff_renderer;\n\t\t\t\t$diff = $renderer->render( $text_diff );\n\n\t\t\t\t// If they're too different, don't include any <ins> or <dels>\n\t\t\t\tif ( preg_match_all( '!(<ins>.*?</ins>|<del>.*?</del>)!', $diff, $diff_matches ) ) {\n\t\t\t\t\t// length of all text between <ins> or <del>\n\t\t\t\t\t$stripped_matches = strlen(strip_tags( join(' ', $diff_matches[0]) ));\n\t\t\t\t\t// since we count lengith of text between <ins> or <del> (instead of picking just one),\n\t\t\t\t\t//\twe double the length of chars not in those tags.\n\t\t\t\t\t$stripped_diff = strlen(strip_tags( $diff )) * 2 - $stripped_matches;\n\t\t\t\t\t$diff_ratio = $stripped_matches / $stripped_diff;\n\t\t\t\t\tif ( $diff_ratio > $this->_diff_threshold )\n\t\t\t\t\t\tcontinue; // Too different. Don't save diffs.\n\t\t\t\t}\n\n\t\t\t\t// Un-inline the diffs by removing del or ins\n\t\t\t\t$orig_diffs[$o]  = preg_replace( '|<ins>.*?</ins>|', '', $diff );\n\t\t\t\t$final_diffs[$f] = preg_replace( '|<del>.*?</del>|', '', $diff );\n\t\t\t}\n\t\t}\n\n\t\tforeach ( array_keys($orig_rows) as $row ) {\n\t\t\t// Both columns have blanks. Ignore them.\n\t\t\tif ( $orig_rows[$row] < 0 && $final_rows[$row] < 0 )\n\t\t\t\tcontinue;\n\n\t\t\t// If we have a word based diff, use it. Otherwise, use the normal line.\n\t\t\tif ( isset( $orig_diffs[$orig_rows[$row]] ) )\n\t\t\t\t$orig_line = $orig_diffs[$orig_rows[$row]];\n\t\t\telseif ( isset( $orig[$orig_rows[$row]] ) )\n\t\t\t\t$orig_line = htmlspecialchars($orig[$orig_rows[$row]]);\n\t\t\telse\n\t\t\t\t$orig_line = '';\n\n\t\t\tif ( isset( $final_diffs[$final_rows[$row]] ) )\n\t\t\t\t$final_line = $final_diffs[$final_rows[$row]];\n\t\t\telseif ( isset( $final[$final_rows[$row]] ) )\n\t\t\t\t$final_line = htmlspecialchars($final[$final_rows[$row]]);\n\t\t\telse\n\t\t\t\t$final_line = '';\n\n\t\t\tif ( $orig_rows[$row] < 0 ) { // Orig is blank. This is really an added row.\n\t\t\t\t$r .= $this->_added( array($final_line), false );\n\t\t\t} elseif ( $final_rows[$row] < 0 ) { // Final is blank. This is really a deleted row.\n\t\t\t\t$r .= $this->_deleted( array($orig_line), false );\n\t\t\t} else { // A true changed row.\n\t\t\t\tif ( $this->_show_split_view ) {\n\t\t\t\t\t$r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->emptyLine() . $this->addedLine( $final_line ) . \"</tr>\\n\";\n\t\t\t\t} else {\n\t\t\t\t\t$r .= '<tr>' . $this->deletedLine( $orig_line ) . \"</tr><tr>\" . $this->addedLine( $final_line ) . \"</tr>\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn $r;\n\t}\n\n\t/**\n\t * Takes changed blocks and matches which rows in orig turned into which rows in final.\n\t *\n\t * Returns\n\t *\t*_matches ( which rows match with which )\n\t *\t*_rows ( order of rows in each column interleaved with blank rows as\n\t *\t\tnecessary )\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param array $orig\n\t * @param array $final\n\t * @return array\n\t */\n\tpublic function interleave_changed_lines( $orig, $final ) {\n\n\t\t// Contains all pairwise string comparisons. Keys are such that this need only be a one dimensional array.\n\t\t$matches = array();\n\t\tforeach ( array_keys($orig) as $o ) {\n\t\t\tforeach ( array_keys($final) as $f ) {\n\t\t\t\t$matches[\"$o,$f\"] = $this->compute_string_distance( $orig[$o], $final[$f] );\n\t\t\t}\n\t\t}\n\t\tasort($matches); // Order by string distance.\n\n\t\t$orig_matches  = array();\n\t\t$final_matches = array();\n\n\t\tforeach ( $matches as $keys => $difference ) {\n\t\t\tlist($o, $f) = explode(',', $keys);\n\t\t\t$o = (int) $o;\n\t\t\t$f = (int) $f;\n\n\t\t\t// Already have better matches for these guys\n\t\t\tif ( isset($orig_matches[$o]) && isset($final_matches[$f]) )\n\t\t\t\tcontinue;\n\n\t\t\t// First match for these guys. Must be best match\n\t\t\tif ( !isset($orig_matches[$o]) && !isset($final_matches[$f]) ) {\n\t\t\t\t$orig_matches[$o] = $f;\n\t\t\t\t$final_matches[$f] = $o;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Best match of this final is already taken?  Must mean this final is a new row.\n\t\t\tif ( isset($orig_matches[$o]) )\n\t\t\t\t$final_matches[$f] = 'x';\n\n\t\t\t// Best match of this orig is already taken?  Must mean this orig is a deleted row.\n\t\t\telseif ( isset($final_matches[$f]) )\n\t\t\t\t$orig_matches[$o] = 'x';\n\t\t}\n\n\t\t// We read the text in this order\n\t\tksort($orig_matches);\n\t\tksort($final_matches);\n\n\t\t// Stores rows and blanks for each column.\n\t\t$orig_rows = $orig_rows_copy = array_keys($orig_matches);\n\t\t$final_rows = array_keys($final_matches);\n\n\t\t// Interleaves rows with blanks to keep matches aligned.\n\t\t// We may end up with some extraneous blank rows, but we'll just ignore them later.\n\t\tforeach ( $orig_rows_copy as $orig_row ) {\n\t\t\t$final_pos = array_search($orig_matches[$orig_row], $final_rows, true);\n\t\t\t$orig_pos = (int) array_search($orig_row, $orig_rows, true);\n\n\t\t\tif ( false === $final_pos ) { // This orig is paired with a blank final.\n\t\t\t\tarray_splice( $final_rows, $orig_pos, 0, -1 );\n\t\t\t} elseif ( $final_pos < $orig_pos ) { // This orig's match is up a ways. Pad final with blank rows.\n\t\t\t\t$diff_pos = $final_pos - $orig_pos;\n\t\t\t\twhile ( $diff_pos < 0 )\n\t\t\t\t\tarray_splice( $final_rows, $orig_pos, 0, $diff_pos++ );\n\t\t\t} elseif ( $final_pos > $orig_pos ) { // This orig's match is down a ways. Pad orig with blank rows.\n\t\t\t\t$diff_pos = $orig_pos - $final_pos;\n\t\t\t\twhile ( $diff_pos < 0 )\n\t\t\t\t\tarray_splice( $orig_rows, $orig_pos, 0, $diff_pos++ );\n\t\t\t}\n\t\t}\n\n\t\t// Pad the ends with blank rows if the columns aren't the same length\n\t\t$diff_count = count($orig_rows) - count($final_rows);\n\t\tif ( $diff_count < 0 ) {\n\t\t\twhile ( $diff_count < 0 )\n\t\t\t\tarray_push($orig_rows, $diff_count++);\n\t\t} elseif ( $diff_count > 0 ) {\n\t\t\t$diff_count = -1 * $diff_count;\n\t\t\twhile ( $diff_count < 0 )\n\t\t\t\tarray_push($final_rows, $diff_count++);\n\t\t}\n\n\t\treturn array($orig_matches, $final_matches, $orig_rows, $final_rows);\n\t}\n\n\t/**\n\t * Computes a number that is intended to reflect the \"distance\" between two strings.\n\t *\n\t * @since 2.6.0\n\t *\n\t * @param string $string1\n\t * @param string $string2\n\t * @return int\n\t */\n\tpublic function compute_string_distance( $string1, $string2 ) {\n\t\t// Vectors containing character frequency for all chars in each string\n\t\t$chars1 = count_chars($string1);\n\t\t$chars2 = count_chars($string2);\n\n\t\t// L1-norm of difference vector.\n\t\t$difference = array_sum( array_map( array($this, 'difference'), $chars1, $chars2 ) );\n\n\t\t// $string1 has zero length? Odd. Give huge penalty by not dividing.\n\t\tif ( !$string1 )\n\t\t\treturn $difference;\n\n\t\t// Return distance per character (of string1).\n\t\treturn $difference / strlen($string1);\n\t}\n\n\t/**\n\t * @ignore\n\t * @since 2.6.0\n\t *\n\t * @param int $a\n\t * @param int $b\n\t * @return int\n\t */\n\tpublic function difference( $a, $b ) {\n\t\treturn abs( $a - $b );\n\t}\n\n\t/**\n\t * Make private properties readable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to get.\n\t * @return mixed Property.\n\t */\n\tpublic function __get( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn $this->$name;\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties settable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name  Property to check if set.\n\t * @param mixed  $value Property value.\n\t * @return mixed Newly-set property.\n\t */\n\tpublic function __set( $name, $value ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn $this->$name = $value;\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties checkable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to check if set.\n\t * @return bool Whether the property is set.\n\t */\n\tpublic function __isset( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\treturn isset( $this->$name );\n\t\t}\n\t}\n\n\t/**\n\t * Make private properties un-settable for backwards compatibility.\n\t *\n\t * @since 4.0.0\n\t * @access public\n\t *\n\t * @param string $name Property to unset.\n\t */\n\tpublic function __unset( $name ) {\n\t\tif ( in_array( $name, $this->compat_fields ) ) {\n\t\t\tunset( $this->$name );\n\t\t}\n\t}\n}\n\n/**\n * Better word splitting than the PEAR package provides.\n *\n * @since 2.6.0\n * @uses Text_Diff_Renderer_inline Extends\n */\nclass WP_Text_Diff_Renderer_inline extends Text_Diff_Renderer_inline {\n\n\t/**\n\t * @ignore\n\t * @since 2.6.0\n\t *\n\t * @param string $string\n\t * @param string $newlineEscape\n\t * @return string\n\t */\n\tpublic function _splitOnWords($string, $newlineEscape = \"\\n\") {\n\t\t$string = str_replace(\"\\0\", '', $string);\n\t\t$words  = preg_split( '/([^\\w])/u', $string, -1, PREG_SPLIT_DELIM_CAPTURE );\n\t\t$words  = str_replace( \"\\n\", $newlineEscape, $words );\n\t\treturn $words;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-links-opml.php",
    "content": "<?php\n/**\n * Outputs the OPML XML format for getting the links defined in the link\n * administration. This can be used to export links from one blog over to\n * another. Links aren't exported by the WordPress export, so this file handles\n * that.\n *\n * This file is not added by default to WordPress theme pages when outputting\n * feed links. It will have to be added manually for browsers and users to pick\n * up that this file exists.\n *\n * @package WordPress\n */\n\nrequire_once( dirname( __FILE__ ) . '/wp-load.php' );\n\nheader('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);\n$link_cat = '';\nif ( !empty($_GET['link_cat']) ) {\n\t$link_cat = $_GET['link_cat'];\n\tif ( !in_array($link_cat, array('all', '0')) )\n\t\t$link_cat = absint( (string)urldecode($link_cat) );\n}\n\necho '<?xml version=\"1.0\"?'.\">\\n\";\n?>\n<opml version=\"1.0\">\n\t<head>\n\t\t<title><?php printf( __('Links for %s'), esc_attr(get_bloginfo('name', 'display')) ); ?></title>\n\t\t<dateCreated><?php echo gmdate(\"D, d M Y H:i:s\"); ?> GMT</dateCreated>\n\t\t<?php\n\t\t/**\n\t\t * Fires in the OPML header.\n\t\t *\n\t\t * @since 3.0.0\n\t\t */\n\t\tdo_action( 'opml_head' );\n\t\t?>\n\t</head>\n\t<body>\n<?php\nif ( empty($link_cat) )\n\t$cats = get_categories(array('taxonomy' => 'link_category', 'hierarchical' => 0));\nelse\n\t$cats = get_categories(array('taxonomy' => 'link_category', 'hierarchical' => 0, 'include' => $link_cat));\n\nforeach ( (array)$cats as $cat ) :\n\t/**\n\t * Filter the OPML outline link category name.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @param string $catname The OPML outline category name.\n\t */\n\t$catname = apply_filters( 'link_category', $cat->name );\n\n?>\n<outline type=\"category\" title=\"<?php echo esc_attr($catname); ?>\">\n<?php\n\t$bookmarks = get_bookmarks(array(\"category\" => $cat->term_id));\n\tforeach ( (array)$bookmarks as $bookmark ) :\n\t\t/**\n\t\t * Filter the OPML outline link title text.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @param string $title The OPML outline title text.\n\t\t */\n\t\t$title = apply_filters( 'link_title', $bookmark->link_name );\n?>\n\t<outline text=\"<?php echo esc_attr($title); ?>\" type=\"link\" xmlUrl=\"<?php echo esc_attr($bookmark->link_rss); ?>\" htmlUrl=\"<?php echo esc_attr($bookmark->link_url); ?>\" updated=\"<?php if ('0000-00-00 00:00:00' != $bookmark->link_updated) echo $bookmark->link_updated; ?>\" />\n<?php\n\tendforeach; // $bookmarks\n?>\n</outline>\n<?php\nendforeach; // $cats\n?>\n</body>\n</opml>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-load.php",
    "content": "<?php\n/**\n * Bootstrap file for setting the ABSPATH constant\n * and loading the wp-config.php file. The wp-config.php\n * file will then load the wp-settings.php file, which\n * will then set up the WordPress environment.\n *\n * If the wp-config.php file is not found then an error\n * will be displayed asking the visitor to set up the\n * wp-config.php file.\n *\n * Will also search for wp-config.php in WordPress' parent\n * directory to allow the WordPress directory to remain\n * untouched.\n *\n * @internal This file must be parsable by PHP4.\n *\n * @package WordPress\n */\n\n/** Define ABSPATH as this file's directory */\ndefine( 'ABSPATH', dirname(__FILE__) . '/' );\n\nerror_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );\n\n/*\n * If wp-config.php exists in the WordPress root, or if it exists in the root and wp-settings.php\n * doesn't, load wp-config.php. The secondary check for wp-settings.php has the added benefit\n * of avoiding cases where the current directory is a nested installation, e.g. / is WordPress(a)\n * and /blog/ is WordPress(b).\n *\n * If neither set of conditions is true, initiate loading the setup process.\n */\nif ( file_exists( ABSPATH . 'wp-config.php') ) {\n\n\t/** The config file resides in ABSPATH */\n\trequire_once( ABSPATH . 'wp-config.php' );\n\n} elseif ( @file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! @file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) {\n\n\t/** The config file resides one level above ABSPATH but is not part of another install */\n\trequire_once( dirname( ABSPATH ) . '/wp-config.php' );\n\n} else {\n\n\t// A config file doesn't exist\n\n\tdefine( 'WPINC', 'wp-includes' );\n\trequire_once( ABSPATH . WPINC . '/load.php' );\n\n\t// Standardize $_SERVER variables across setups.\n\twp_fix_server_vars();\n\n\trequire_once( ABSPATH . WPINC . '/functions.php' );\n\n\t$path = wp_guess_url() . '/wp-admin/setup-config.php';\n\n\t/*\n\t * We're going to redirect to setup-config.php. While this shouldn't result\n\t * in an infinite loop, that's a silly thing to assume, don't you think? If\n\t * we're traveling in circles, our last-ditch effort is \"Need more help?\"\n\t */\n\tif ( false === strpos( $_SERVER['REQUEST_URI'], 'setup-config' ) ) {\n\t\theader( 'Location: ' . $path );\n\t\texit;\n\t}\n\n\tdefine( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );\n\trequire_once( ABSPATH . WPINC . '/version.php' );\n\n\twp_check_php_mysql_versions();\n\twp_load_translations_early();\n\n\t// Die with an error message\n\t$die  = sprintf(\n\t\t/* translators: %s: wp-config.php */\n\t\t__( \"There doesn't seem to be a %s file. I need this before we can get started.\" ),\n\t\t'<code>wp-config.php</code>'\n\t) . '</p>';\n\t$die .= '<p>' . sprintf(\n\t\t/* translators: %s: Codex URL */\n\t\t__( \"Need more help? <a href='%s'>We got it</a>.\" ),\n\t\t__( 'https://codex.wordpress.org/Editing_wp-config.php' )\n\t) . '</p>';\n\t$die .= '<p>' . sprintf(\n\t\t/* translators: %s: wp-config.php */\n\t\t__( \"You can create a %s file through a web interface, but this doesn't work for all server setups. The safest way is to manually create the file.\" ),\n\t\t'<code>wp-config.php</code>'\n\t) . '</p>';\n\t$die .= '<p><a href=\"' . $path . '\" class=\"button button-large\">' . __( \"Create a Configuration File\" ) . '</a>';\n\n\twp_die( $die, __( 'WordPress &rsaquo; Error' ) );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-login.php",
    "content": "<?php\n/**\n * WordPress User Page\n *\n * Handles authentication, registering, resetting passwords, forgot password,\n * and other user handling.\n *\n * @package WordPress\n */\n\n/** Make sure that the WordPress bootstrap has run before continuing. */\nrequire( dirname(__FILE__) . '/wp-load.php' );\n\n// Redirect to https login if forced to use SSL\nif ( force_ssl_admin() && ! is_ssl() ) {\n\tif ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {\n\t\twp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );\n\t\texit();\n\t} else {\n\t\twp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );\n\t\texit();\n\t}\n}\n\n/**\n * Output the login page header.\n *\n * @param string   $title    Optional. WordPress login Page title to display in the `<title>` element.\n *                           Default 'Log In'.\n * @param string   $message  Optional. Message to display in header. Default empty.\n * @param WP_Error $wp_error Optional. The error to pass. Default empty.\n */\nfunction login_header( $title = 'Log In', $message = '', $wp_error = '' ) {\n\tglobal $error, $interim_login, $action;\n\n\t// Don't index any of these forms\n\tadd_action( 'login_head', 'wp_no_robots' );\n\n\tif ( wp_is_mobile() )\n\t\tadd_action( 'login_head', 'wp_login_viewport_meta' );\n\n\tif ( empty($wp_error) )\n\t\t$wp_error = new WP_Error();\n\n\t// Shake it!\n\t$shake_error_codes = array( 'empty_password', 'empty_email', 'invalid_email', 'invalidcombo', 'empty_username', 'invalid_username', 'incorrect_password' );\n\t/**\n\t * Filter the error codes array for shaking the login form.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $shake_error_codes Error codes that shake the login form.\n\t */\n\t$shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );\n\n\tif ( $shake_error_codes && $wp_error->get_error_code() && in_array( $wp_error->get_error_code(), $shake_error_codes ) )\n\t\tadd_action( 'login_head', 'wp_shake_js', 12 );\n\n\t?><!DOCTYPE html>\n\t<!--[if IE 8]>\n\t\t<html xmlns=\"http://www.w3.org/1999/xhtml\" class=\"ie8\" <?php language_attributes(); ?>>\n\t<![endif]-->\n\t<!--[if !(IE 8) ]><!-->\n\t\t<html xmlns=\"http://www.w3.org/1999/xhtml\" <?php language_attributes(); ?>>\n\t<!--<![endif]-->\n\t<head>\n\t<meta http-equiv=\"Content-Type\" content=\"<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>\" />\n\t<title><?php bloginfo('name'); ?> &rsaquo; <?php echo $title; ?></title>\n\t<?php\n\n\twp_admin_css( 'login', true );\n\n\t/*\n\t * Remove all stored post data on logging out.\n\t * This could be added by add_action('login_head'...) like wp_shake_js(),\n\t * but maybe better if it's not removable by plugins\n\t */\n\tif ( 'loggedout' == $wp_error->get_error_code() ) {\n\t\t?>\n\t\t<script>if(\"sessionStorage\" in window){try{for(var key in sessionStorage){if(key.indexOf(\"wp-autosave-\")!=-1){sessionStorage.removeItem(key)}}}catch(e){}};</script>\n\t\t<?php\n\t}\n\n\t/**\n\t * Enqueue scripts and styles for the login page.\n\t *\n\t * @since 3.1.0\n\t */\n\tdo_action( 'login_enqueue_scripts' );\n\t/**\n\t * Fires in the login page header after scripts are enqueued.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'login_head' );\n\n\tif ( is_multisite() ) {\n\t\t$login_header_url   = network_home_url();\n\t\t$login_header_title = get_current_site()->site_name;\n\t} else {\n\t\t$login_header_url   = __( 'https://wordpress.org/' );\n\t\t$login_header_title = __( 'Powered by WordPress' );\n\t}\n\n\t/**\n\t * Filter link URL of the header logo above login form.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $login_header_url Login header logo URL.\n\t */\n\t$login_header_url = apply_filters( 'login_headerurl', $login_header_url );\n\t/**\n\t * Filter the title attribute of the header logo above login form.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $login_header_title Login header logo title attribute.\n\t */\n\t$login_header_title = apply_filters( 'login_headertitle', $login_header_title );\n\n\t$classes = array( 'login-action-' . $action, 'wp-core-ui' );\n\tif ( wp_is_mobile() )\n\t\t$classes[] = 'mobile';\n\tif ( is_rtl() )\n\t\t$classes[] = 'rtl';\n\tif ( $interim_login ) {\n\t\t$classes[] = 'interim-login';\n\t\t?>\n\t\t<style type=\"text/css\">html{background-color: transparent;}</style>\n\t\t<?php\n\n\t\tif ( 'success' ===  $interim_login )\n\t\t\t$classes[] = 'interim-login-success';\n\t}\n\t$classes[] =' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );\n\n\t/**\n\t * Filter the login page body classes.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param array  $classes An array of body classes.\n\t * @param string $action  The action that brought the visitor to the login page.\n\t */\n\t$classes = apply_filters( 'login_body_class', $classes, $action );\n\n\t?>\n\t</head>\n\t<body class=\"login <?php echo esc_attr( implode( ' ', $classes ) ); ?>\">\n\t<div id=\"login\">\n\t\t<h1><a href=\"<?php echo esc_url( $login_header_url ); ?>\" title=\"<?php echo esc_attr( $login_header_title ); ?>\" tabindex=\"-1\"><?php bloginfo( 'name' ); ?></a></h1>\n\t<?php\n\n\tunset( $login_header_url, $login_header_title );\n\n\t/**\n\t * Filter the message to display above the login form.\n\t *\n\t * @since 2.1.0\n\t *\n\t * @param string $message Login message text.\n\t */\n\t$message = apply_filters( 'login_message', $message );\n\tif ( !empty( $message ) )\n\t\techo $message . \"\\n\";\n\n\t// In case a plugin uses $error rather than the $wp_errors object\n\tif ( !empty( $error ) ) {\n\t\t$wp_error->add('error', $error);\n\t\tunset($error);\n\t}\n\n\tif ( $wp_error->get_error_code() ) {\n\t\t$errors = '';\n\t\t$messages = '';\n\t\tforeach ( $wp_error->get_error_codes() as $code ) {\n\t\t\t$severity = $wp_error->get_error_data( $code );\n\t\t\tforeach ( $wp_error->get_error_messages( $code ) as $error_message ) {\n\t\t\t\tif ( 'message' == $severity )\n\t\t\t\t\t$messages .= '\t' . $error_message . \"<br />\\n\";\n\t\t\t\telse\n\t\t\t\t\t$errors .= '\t' . $error_message . \"<br />\\n\";\n\t\t\t}\n\t\t}\n\t\tif ( ! empty( $errors ) ) {\n\t\t\t/**\n\t\t\t * Filter the error messages displayed above the login form.\n\t\t\t *\n\t\t\t * @since 2.1.0\n\t\t\t *\n\t\t\t * @param string $errors Login error message.\n\t\t\t */\n\t\t\techo '<div id=\"login_error\">' . apply_filters( 'login_errors', $errors ) . \"</div>\\n\";\n\t\t}\n\t\tif ( ! empty( $messages ) ) {\n\t\t\t/**\n\t\t\t * Filter instructional messages displayed above the login form.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param string $messages Login messages.\n\t\t\t */\n\t\t\techo '<p class=\"message\">' . apply_filters( 'login_messages', $messages ) . \"</p>\\n\";\n\t\t}\n\t}\n} // End of login_header()\n\n/**\n * Outputs the footer for the login page.\n *\n * @param string $input_id Which input to auto-focus\n */\nfunction login_footer($input_id = '') {\n\tglobal $interim_login;\n\n\t// Don't allow interim logins to navigate away from the page.\n\tif ( ! $interim_login ): ?>\n\t<p id=\"backtoblog\"><a href=\"<?php echo esc_url( home_url( '/' ) ); ?>\" title=\"<?php esc_attr_e( 'Are you lost?' ); ?>\"><?php printf( __( '&larr; Back to %s' ), get_bloginfo( 'title', 'display' ) ); ?></a></p>\n\t<?php endif; ?>\n\n\t</div>\n\n\t<?php if ( !empty($input_id) ) : ?>\n\t<script type=\"text/javascript\">\n\ttry{document.getElementById('<?php echo $input_id; ?>').focus();}catch(e){}\n\tif(typeof wpOnload=='function')wpOnload();\n\t</script>\n\t<?php endif; ?>\n\n\t<?php\n\t/**\n\t * Fires in the login page footer.\n\t *\n\t * @since 3.1.0\n\t */\n\tdo_action( 'login_footer' ); ?>\n\t<div class=\"clear\"></div>\n\t</body>\n\t</html>\n\t<?php\n}\n\n/**\n * @since 3.0.0\n */\nfunction wp_shake_js() {\n\tif ( wp_is_mobile() )\n\t\treturn;\n?>\n<script type=\"text/javascript\">\naddLoadEvent = function(func){if(typeof jQuery!=\"undefined\")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};\nfunction s(id,pos){g(id).left=pos+'px';}\nfunction g(id){return document.getElementById(id).style;}\nfunction shake(id,a,d){c=a.shift();s(id,c);if(a.length>0){setTimeout(function(){shake(id,a,d);},d);}else{try{g(id).position='static';wp_attempt_focus();}catch(e){}}}\naddLoadEvent(function(){ var p=new Array(15,30,15,0,-15,-30,-15,0);p=p.concat(p.concat(p));var i=document.forms[0].id;g(i).position='relative';shake(i,p,20);});\n</script>\n<?php\n}\n\n/**\n * @since 3.7.0\n */\nfunction wp_login_viewport_meta() {\n\t?>\n\t<meta name=\"viewport\" content=\"width=device-width\" />\n\t<?php\n}\n\n/**\n * Handles sending password retrieval email to user.\n *\n * @global wpdb         $wpdb      WordPress database abstraction object.\n * @global PasswordHash $wp_hasher Portable PHP password hashing framework.\n *\n * @return bool|WP_Error True: when finish. WP_Error on error\n */\nfunction retrieve_password() {\n\tglobal $wpdb, $wp_hasher;\n\n\t$errors = new WP_Error();\n\n\tif ( empty( $_POST['user_login'] ) ) {\n\t\t$errors->add('empty_username', __('<strong>ERROR</strong>: Enter a username or email address.'));\n\t} elseif ( strpos( $_POST['user_login'], '@' ) ) {\n\t\t$user_data = get_user_by( 'email', trim( $_POST['user_login'] ) );\n\t\tif ( empty( $user_data ) )\n\t\t\t$errors->add('invalid_email', __('<strong>ERROR</strong>: There is no user registered with that email address.'));\n\t} else {\n\t\t$login = trim($_POST['user_login']);\n\t\t$user_data = get_user_by('login', $login);\n\t}\n\n\t/**\n\t * Fires before errors are returned from a password reset request.\n\t *\n\t * @since 2.1.0\n\t * @since 4.4.0 Added the `$errors` parameter.\n\t *\n\t * @param WP_Error $errors A WP_Error object containing any errors generated\n\t *                         by using invalid credentials.\n\t */\n\tdo_action( 'lostpassword_post', $errors );\n\n\tif ( $errors->get_error_code() )\n\t\treturn $errors;\n\n\tif ( !$user_data ) {\n\t\t$errors->add('invalidcombo', __('<strong>ERROR</strong>: Invalid username or email.'));\n\t\treturn $errors;\n\t}\n\n\t// Redefining user_login ensures we return the right case in the email.\n\t$user_login = $user_data->user_login;\n\t$user_email = $user_data->user_email;\n\t$key = get_password_reset_key( $user_data );\n\n\tif ( is_wp_error( $key ) ) {\n\t\treturn $key;\n\t}\n\n\t$message = __('Someone has requested a password reset for the following account:') . \"\\r\\n\\r\\n\";\n\t$message .= network_home_url( '/' ) . \"\\r\\n\\r\\n\";\n\t$message .= sprintf(__('Username: %s'), $user_login) . \"\\r\\n\\r\\n\";\n\t$message .= __('If this was a mistake, just ignore this email and nothing will happen.') . \"\\r\\n\\r\\n\";\n\t$message .= __('To reset your password, visit the following address:') . \"\\r\\n\\r\\n\";\n\t$message .= '<' . network_site_url(\"wp-login.php?action=rp&key=$key&login=\" . rawurlencode($user_login), 'login') . \">\\r\\n\";\n\n\tif ( is_multisite() )\n\t\t$blogname = $GLOBALS['current_site']->site_name;\n\telse\n\t\t/*\n\t\t * The blogname option is escaped with esc_html on the way into the database\n\t\t * in sanitize_option we want to reverse this for the plain text arena of emails.\n\t\t */\n\t\t$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);\n\n\t$title = sprintf( __('[%s] Password Reset'), $blogname );\n\n\t/**\n\t * Filter the subject of the password reset email.\n\t *\n\t * @since 2.8.0\n\t * @since 4.4.0 Added the `$user_login` and `$user_data` parameters.\n\t *\n\t * @param string  $title      Default email title.\n\t * @param string  $user_login The username for the user.\n\t * @param WP_User $user_data  WP_User object.\n\t */\n\t$title = apply_filters( 'retrieve_password_title', $title, $user_login, $user_data );\n\n\t/**\n\t * Filter the message body of the password reset mail.\n\t *\n\t * @since 2.8.0\n\t * @since 4.1.0 Added `$user_login` and `$user_data` parameters.\n\t *\n\t * @param string  $message    Default mail message.\n\t * @param string  $key        The activation key.\n\t * @param string  $user_login The username for the user.\n\t * @param WP_User $user_data  WP_User object.\n\t */\n\t$message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data );\n\n\tif ( $message && !wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) )\n\t\twp_die( __('The email could not be sent.') . \"<br />\\n\" . __('Possible reason: your host may have disabled the mail() function.') );\n\n\treturn true;\n}\n\n//\n// Main\n//\n\n$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login';\n$errors = new WP_Error();\n\nif ( isset($_GET['key']) )\n\t$action = 'resetpass';\n\n// validate action so as to default to the login screen\nif ( !in_array( $action, array( 'postpass', 'logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login' ), true ) && false === has_filter( 'login_form_' . $action ) )\n\t$action = 'login';\n\nnocache_headers();\n\nheader('Content-Type: '.get_bloginfo('html_type').'; charset='.get_bloginfo('charset'));\n\nif ( defined( 'RELOCATE' ) && RELOCATE ) { // Move flag is set\n\tif ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != $_SERVER['PHP_SELF']) )\n\t\t$_SERVER['PHP_SELF'] = str_replace( $_SERVER['PATH_INFO'], '', $_SERVER['PHP_SELF'] );\n\n\t$url = dirname( set_url_scheme( 'http://' .  $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] ) );\n\tif ( $url != get_option( 'siteurl' ) )\n\t\tupdate_option( 'siteurl', $url );\n}\n\n//Set a cookie now to see if they are supported by the browser.\n$secure = ( 'https' === parse_url( wp_login_url(), PHP_URL_SCHEME ) );\nsetcookie( TEST_COOKIE, 'WP Cookie check', 0, COOKIEPATH, COOKIE_DOMAIN, $secure );\nif ( SITECOOKIEPATH != COOKIEPATH )\n\tsetcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure );\n\n/**\n * Fires when the login form is initialized.\n *\n * @since 3.2.0\n */\ndo_action( 'login_init' );\n/**\n * Fires before a specified login form action.\n *\n * The dynamic portion of the hook name, `$action`, refers to the action\n * that brought the visitor to the login form. Actions include 'postpass',\n * 'logout', 'lostpassword', etc.\n *\n * @since 2.8.0\n */\ndo_action( 'login_form_' . $action );\n\n$http_post = ('POST' == $_SERVER['REQUEST_METHOD']);\n$interim_login = isset($_REQUEST['interim-login']);\n\nswitch ($action) {\n\ncase 'postpass' :\n\tif ( ! array_key_exists( 'post_password', $_POST ) ) {\n\t\twp_safe_redirect( wp_get_referer() );\n\t\texit();\n\t}\n\n\trequire_once ABSPATH . WPINC . '/class-phpass.php';\n\t$hasher = new PasswordHash( 8, true );\n\n\t/**\n\t * Filter the life span of the post password cookie.\n\t *\n\t * By default, the cookie expires 10 days from creation. To turn this\n\t * into a session cookie, return 0.\n\t *\n\t * @since 3.7.0\n\t *\n\t * @param int $expires The expiry time, as passed to setcookie().\n\t */\n\t$expire = apply_filters( 'post_password_expires', time() + 10 * DAY_IN_SECONDS );\n\t$referer = wp_get_referer();\n\tif ( $referer ) {\n\t\t$secure = ( 'https' === parse_url( $referer, PHP_URL_SCHEME ) );\n\t} else {\n\t\t$secure = false;\n\t}\n\tsetcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), $expire, COOKIEPATH, COOKIE_DOMAIN, $secure );\n\n\twp_safe_redirect( wp_get_referer() );\n\texit();\n\ncase 'logout' :\n\tcheck_admin_referer('log-out');\n\n\t$user = wp_get_current_user();\n\n\twp_logout();\n\n\tif ( ! empty( $_REQUEST['redirect_to'] ) ) {\n\t\t$redirect_to = $requested_redirect_to = $_REQUEST['redirect_to'];\n\t} else {\n\t\t$redirect_to = 'wp-login.php?loggedout=true';\n\t\t$requested_redirect_to = '';\n\t}\n\n\t/**\n\t * Filter the log out redirect URL.\n\t *\n\t * @since 4.2.0\n\t *\n\t * @param string  $redirect_to           The redirect destination URL.\n\t * @param string  $requested_redirect_to The requested redirect destination URL passed as a parameter.\n\t * @param WP_User $user                  The WP_User object for the user that's logging out.\n\t */\n\t$redirect_to = apply_filters( 'logout_redirect', $redirect_to, $requested_redirect_to, $user );\n\twp_safe_redirect( $redirect_to );\n\texit();\n\ncase 'lostpassword' :\ncase 'retrievepassword' :\n\n\tif ( $http_post ) {\n\t\t$errors = retrieve_password();\n\t\tif ( !is_wp_error($errors) ) {\n\t\t\t$redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm';\n\t\t\twp_safe_redirect( $redirect_to );\n\t\t\texit();\n\t\t}\n\t}\n\n\tif ( isset( $_GET['error'] ) ) {\n\t\tif ( 'invalidkey' == $_GET['error'] ) {\n\t\t\t$errors->add( 'invalidkey', __( 'Your password reset link appears to be invalid. Please request a new link below.' ) );\n\t\t} elseif ( 'expiredkey' == $_GET['error'] ) {\n\t\t\t$errors->add( 'expiredkey', __( 'Your password reset link has expired. Please request a new link below.' ) );\n\t\t}\n\t}\n\n\t$lostpassword_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';\n\t/**\n\t * Filter the URL redirected to after submitting the lostpassword/retrievepassword form.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $lostpassword_redirect The redirect destination URL.\n\t */\n\t$redirect_to = apply_filters( 'lostpassword_redirect', $lostpassword_redirect );\n\n\t/**\n\t * Fires before the lost password form.\n\t *\n\t * @since 1.5.1\n\t */\n\tdo_action( 'lost_password' );\n\n\tlogin_header(__('Lost Password'), '<p class=\"message\">' . __('Please enter your username or email address. You will receive a link to create a new password via email.') . '</p>', $errors);\n\n\t$user_login = isset($_POST['user_login']) ? wp_unslash($_POST['user_login']) : '';\n\n?>\n\n<form name=\"lostpasswordform\" id=\"lostpasswordform\" action=\"<?php echo esc_url( network_site_url( 'wp-login.php?action=lostpassword', 'login_post' ) ); ?>\" method=\"post\">\n\t<p>\n\t\t<label for=\"user_login\" ><?php _e('Username or Email:') ?><br />\n\t\t<input type=\"text\" name=\"user_login\" id=\"user_login\" class=\"input\" value=\"<?php echo esc_attr($user_login); ?>\" size=\"20\" /></label>\n\t</p>\n\t<?php\n\t/**\n\t * Fires inside the lostpassword form tags, before the hidden fields.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'lostpassword_form' ); ?>\n\t<input type=\"hidden\" name=\"redirect_to\" value=\"<?php echo esc_attr( $redirect_to ); ?>\" />\n\t<p class=\"submit\"><input type=\"submit\" name=\"wp-submit\" id=\"wp-submit\" class=\"button button-primary button-large\" value=\"<?php esc_attr_e('Get New Password'); ?>\" /></p>\n</form>\n\n<p id=\"nav\">\n<a href=\"<?php echo esc_url( wp_login_url() ); ?>\"><?php _e('Log in') ?></a>\n<?php\nif ( get_option( 'users_can_register' ) ) :\n\t$registration_url = sprintf( '<a href=\"%s\">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );\n\n\t/** This filter is documented in wp-includes/general-template.php */\n\techo ' | ' . apply_filters( 'register', $registration_url );\nendif;\n?>\n</p>\n\n<?php\nlogin_footer('user_login');\nbreak;\n\ncase 'resetpass' :\ncase 'rp' :\n\tlist( $rp_path ) = explode( '?', wp_unslash( $_SERVER['REQUEST_URI'] ) );\n\t$rp_cookie = 'wp-resetpass-' . COOKIEHASH;\n\tif ( isset( $_GET['key'] ) ) {\n\t\t$value = sprintf( '%s:%s', wp_unslash( $_GET['login'] ), wp_unslash( $_GET['key'] ) );\n\t\tsetcookie( $rp_cookie, $value, 0, $rp_path, COOKIE_DOMAIN, is_ssl(), true );\n\t\twp_safe_redirect( remove_query_arg( array( 'key', 'login' ) ) );\n\t\texit;\n\t}\n\n\tif ( isset( $_COOKIE[ $rp_cookie ] ) && 0 < strpos( $_COOKIE[ $rp_cookie ], ':' ) ) {\n\t\tlist( $rp_login, $rp_key ) = explode( ':', wp_unslash( $_COOKIE[ $rp_cookie ] ), 2 );\n\t\t$user = check_password_reset_key( $rp_key, $rp_login );\n\t\tif ( isset( $_POST['pass1'] ) && ! hash_equals( $rp_key, $_POST['rp_key'] ) ) {\n\t\t\t$user = false;\n\t\t}\n\t} else {\n\t\t$user = false;\n\t}\n\n\tif ( ! $user || is_wp_error( $user ) ) {\n\t\tsetcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );\n\t\tif ( $user && $user->get_error_code() === 'expired_key' )\n\t\t\twp_redirect( site_url( 'wp-login.php?action=lostpassword&error=expiredkey' ) );\n\t\telse\n\t\t\twp_redirect( site_url( 'wp-login.php?action=lostpassword&error=invalidkey' ) );\n\t\texit;\n\t}\n\n\t$errors = new WP_Error();\n\n\tif ( isset($_POST['pass1']) && $_POST['pass1'] != $_POST['pass2'] )\n\t\t$errors->add( 'password_reset_mismatch', __( 'The passwords do not match.' ) );\n\n\t/**\n\t * Fires before the password reset procedure is validated.\n\t *\n\t * @since 3.5.0\n\t *\n\t * @param object           $errors WP Error object.\n\t * @param WP_User|WP_Error $user   WP_User object if the login and reset key match. WP_Error object otherwise.\n\t */\n\tdo_action( 'validate_password_reset', $errors, $user );\n\n\tif ( ( ! $errors->get_error_code() ) && isset( $_POST['pass1'] ) && !empty( $_POST['pass1'] ) ) {\n\t\treset_password($user, $_POST['pass1']);\n\t\tsetcookie( $rp_cookie, ' ', time() - YEAR_IN_SECONDS, $rp_path, COOKIE_DOMAIN, is_ssl(), true );\n\t\tlogin_header( __( 'Password Reset' ), '<p class=\"message reset-pass\">' . __( 'Your password has been reset.' ) . ' <a href=\"' . esc_url( wp_login_url() ) . '\">' . __( 'Log in' ) . '</a></p>' );\n\t\tlogin_footer();\n\t\texit;\n\t}\n\n\twp_enqueue_script('utils');\n\twp_enqueue_script('user-profile');\n\n\tlogin_header(__('Reset Password'), '<p class=\"message reset-pass\">' . __('Enter your new password below.') . '</p>', $errors );\n\n?>\n<form name=\"resetpassform\" id=\"resetpassform\" action=\"<?php echo esc_url( network_site_url( 'wp-login.php?action=resetpass', 'login_post' ) ); ?>\" method=\"post\" autocomplete=\"off\">\n\t<input type=\"hidden\" id=\"user_login\" value=\"<?php echo esc_attr( $rp_login ); ?>\" autocomplete=\"off\" />\n\n\t<div class=\"user-pass1-wrap\">\n\t\t<p>\n\t\t\t<label for=\"pass1\"><?php _e( 'New password' ) ?></label>\n\t\t</p>\n\n\t\t<div class=\"wp-pwd\">\n\t\t\t<span class=\"password-input-wrapper\">\n\t\t\t\t<input type=\"password\" data-reveal=\"1\" data-pw=\"<?php echo esc_attr( wp_generate_password( 16 ) ); ?>\" name=\"pass1\" id=\"pass1\" class=\"input\" size=\"20\" value=\"\" autocomplete=\"off\" aria-describedby=\"pass-strength-result\" />\n\t\t\t</span>\n\t\t\t<div id=\"pass-strength-result\" class=\"hide-if-no-js\" aria-live=\"polite\"><?php _e( 'Strength indicator' ); ?></div>\n\t\t</div>\n\t</div>\n\n\t<p class=\"user-pass2-wrap\">\n\t\t<label for=\"pass2\"><?php _e( 'Confirm new password' ) ?></label><br />\n\t\t<input type=\"password\" name=\"pass2\" id=\"pass2\" class=\"input\" size=\"20\" value=\"\" autocomplete=\"off\" />\n\t</p>\n\n\t<p class=\"description indicator-hint\"><?php echo wp_get_password_hint(); ?></p>\n\t<br class=\"clear\" />\n\n\t<?php\n\t/**\n\t * Fires following the 'Strength indicator' meter in the user password reset form.\n\t *\n\t * @since 3.9.0\n\t *\n\t * @param WP_User $user User object of the user whose password is being reset.\n\t */\n\tdo_action( 'resetpass_form', $user );\n\t?>\n\t<input type=\"hidden\" name=\"rp_key\" value=\"<?php echo esc_attr( $rp_key ); ?>\" />\n\t<p class=\"submit\"><input type=\"submit\" name=\"wp-submit\" id=\"wp-submit\" class=\"button button-primary button-large\" value=\"<?php esc_attr_e('Reset Password'); ?>\" /></p>\n</form>\n\n<p id=\"nav\">\n<a href=\"<?php echo esc_url( wp_login_url() ); ?>\"><?php _e( 'Log in' ); ?></a>\n<?php\nif ( get_option( 'users_can_register' ) ) :\n\t$registration_url = sprintf( '<a href=\"%s\">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );\n\n\t/** This filter is documented in wp-includes/general-template.php */\n\techo ' | ' . apply_filters( 'register', $registration_url );\nendif;\n?>\n</p>\n\n<?php\nlogin_footer('user_pass');\nbreak;\n\ncase 'register' :\n\tif ( is_multisite() ) {\n\t\t/**\n\t\t * Filter the Multisite sign up URL.\n\t\t *\n\t\t * @since 3.0.0\n\t\t *\n\t\t * @param string $sign_up_url The sign up URL.\n\t\t */\n\t\twp_redirect( apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ) );\n\t\texit;\n\t}\n\n\tif ( !get_option('users_can_register') ) {\n\t\twp_redirect( site_url('wp-login.php?registration=disabled') );\n\t\texit();\n\t}\n\n\t$user_login = '';\n\t$user_email = '';\n\tif ( $http_post ) {\n\t\t$user_login = isset( $_POST['user_login'] ) ? $_POST['user_login'] : '';\n\t\t$user_email = isset( $_POST['user_email'] ) ? $_POST['user_email'] : '';\n\t\t$errors = register_new_user($user_login, $user_email);\n\t\tif ( !is_wp_error($errors) ) {\n\t\t\t$redirect_to = !empty( $_POST['redirect_to'] ) ? $_POST['redirect_to'] : 'wp-login.php?checkemail=registered';\n\t\t\twp_safe_redirect( $redirect_to );\n\t\t\texit();\n\t\t}\n\t}\n\n\t$registration_redirect = ! empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';\n\t/**\n\t * Filter the registration redirect URL.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string $registration_redirect The redirect destination URL.\n\t */\n\t$redirect_to = apply_filters( 'registration_redirect', $registration_redirect );\n\tlogin_header(__('Registration Form'), '<p class=\"message register\">' . __('Register For This Site') . '</p>', $errors);\n?>\n<form name=\"registerform\" id=\"registerform\" action=\"<?php echo esc_url( site_url( 'wp-login.php?action=register', 'login_post' ) ); ?>\" method=\"post\" novalidate=\"novalidate\">\n\t<p>\n\t\t<label for=\"user_login\"><?php _e('Username') ?><br />\n\t\t<input type=\"text\" name=\"user_login\" id=\"user_login\" class=\"input\" value=\"<?php echo esc_attr(wp_unslash($user_login)); ?>\" size=\"20\" /></label>\n\t</p>\n\t<p>\n\t\t<label for=\"user_email\"><?php _e('Email') ?><br />\n\t\t<input type=\"email\" name=\"user_email\" id=\"user_email\" class=\"input\" value=\"<?php echo esc_attr( wp_unslash( $user_email ) ); ?>\" size=\"25\" /></label>\n\t</p>\n\t<?php\n\t/**\n\t * Fires following the 'Email' field in the user registration form.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'register_form' );\n\t?>\n\t<p id=\"reg_passmail\"><?php _e( 'Registration confirmation will be emailed to you.' ); ?></p>\n\t<br class=\"clear\" />\n\t<input type=\"hidden\" name=\"redirect_to\" value=\"<?php echo esc_attr( $redirect_to ); ?>\" />\n\t<p class=\"submit\"><input type=\"submit\" name=\"wp-submit\" id=\"wp-submit\" class=\"button button-primary button-large\" value=\"<?php esc_attr_e('Register'); ?>\" /></p>\n</form>\n\n<p id=\"nav\">\n<a href=\"<?php echo esc_url( wp_login_url() ); ?>\"><?php _e( 'Log in' ); ?></a> |\n<a href=\"<?php echo esc_url( wp_lostpassword_url() ); ?>\" title=\"<?php esc_attr_e( 'Password Lost and Found' ) ?>\"><?php _e( 'Lost your password?' ); ?></a>\n</p>\n\n<?php\nlogin_footer('user_login');\nbreak;\n\ncase 'login' :\ndefault:\n\t$secure_cookie = '';\n\t$customize_login = isset( $_REQUEST['customize-login'] );\n\tif ( $customize_login )\n\t\twp_enqueue_script( 'customize-base' );\n\n\t// If the user wants ssl but the session is not ssl, force a secure cookie.\n\tif ( !empty($_POST['log']) && !force_ssl_admin() ) {\n\t\t$user_name = sanitize_user($_POST['log']);\n\t\tif ( $user = get_user_by('login', $user_name) ) {\n\t\t\tif ( get_user_option('use_ssl', $user->ID) ) {\n\t\t\t\t$secure_cookie = true;\n\t\t\t\tforce_ssl_admin(true);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( isset( $_REQUEST['redirect_to'] ) ) {\n\t\t$redirect_to = $_REQUEST['redirect_to'];\n\t\t// Redirect to https if user wants ssl\n\t\tif ( $secure_cookie && false !== strpos($redirect_to, 'wp-admin') )\n\t\t\t$redirect_to = preg_replace('|^http://|', 'https://', $redirect_to);\n\t} else {\n\t\t$redirect_to = admin_url();\n\t}\n\n\t$reauth = empty($_REQUEST['reauth']) ? false : true;\n\n\t$user = wp_signon( '', $secure_cookie );\n\n\tif ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {\n\t\tif ( headers_sent() ) {\n\t\t\t$user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked due to unexpected output. For help, please see <a href=\"%1$s\">this documentation</a> or try the <a href=\"%2$s\">support forums</a>.' ),\n\t\t\t\t__( 'https://codex.wordpress.org/Cookies' ), __( 'https://wordpress.org/support/' ) ) );\n\t\t} elseif ( isset( $_POST['testcookie'] ) && empty( $_COOKIE[ TEST_COOKIE ] ) ) {\n\t\t\t// If cookies are disabled we can't log in even with a valid user+pass\n\t\t\t$user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href=\"%s\">enable cookies</a> to use WordPress.' ),\n\t\t\t\t__( 'https://codex.wordpress.org/Cookies' ) ) );\n\t\t}\n\t}\n\n\t$requested_redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';\n\t/**\n\t * Filter the login redirect URL.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param string           $redirect_to           The redirect destination URL.\n\t * @param string           $requested_redirect_to The requested redirect destination URL passed as a parameter.\n\t * @param WP_User|WP_Error $user                  WP_User object if login was successful, WP_Error object otherwise.\n\t */\n\t$redirect_to = apply_filters( 'login_redirect', $redirect_to, $requested_redirect_to, $user );\n\n\tif ( !is_wp_error($user) && !$reauth ) {\n\t\tif ( $interim_login ) {\n\t\t\t$message = '<p class=\"message\">' . __('You have logged in successfully.') . '</p>';\n\t\t\t$interim_login = 'success';\n\t\t\tlogin_header( '', $message ); ?>\n\t\t\t</div>\n\t\t\t<?php\n\t\t\t/** This action is documented in wp-login.php */\n\t\t\tdo_action( 'login_footer' ); ?>\n\t\t\t<?php if ( $customize_login ) : ?>\n\t\t\t\t<script type=\"text/javascript\">setTimeout( function(){ new wp.customize.Messenger({ url: '<?php echo wp_customize_url(); ?>', channel: 'login' }).send('login') }, 1000 );</script>\n\t\t\t<?php endif; ?>\n\t\t\t</body></html>\n<?php\t\texit;\n\t\t}\n\n\t\tif ( ( empty( $redirect_to ) || $redirect_to == 'wp-admin/' || $redirect_to == admin_url() ) ) {\n\t\t\t// If the user doesn't belong to a blog, send them to user admin. If the user can't edit posts, send them to their profile.\n\t\t\tif ( is_multisite() && !get_active_blog_for_user($user->ID) && !is_super_admin( $user->ID ) )\n\t\t\t\t$redirect_to = user_admin_url();\n\t\t\telseif ( is_multisite() && !$user->has_cap('read') )\n\t\t\t\t$redirect_to = get_dashboard_url( $user->ID );\n\t\t\telseif ( !$user->has_cap('edit_posts') )\n\t\t\t\t$redirect_to = $user->has_cap( 'read' ) ? admin_url( 'profile.php' ) : home_url();\n\t\t}\n\t\twp_safe_redirect($redirect_to);\n\t\texit();\n\t}\n\n\t$errors = $user;\n\t// Clear errors if loggedout is set.\n\tif ( !empty($_GET['loggedout']) || $reauth )\n\t\t$errors = new WP_Error();\n\n\tif ( $interim_login ) {\n\t\tif ( ! $errors->get_error_code() )\n\t\t\t$errors->add('expired', __('Session expired. Please log in again. You will not move away from this page.'), 'message');\n\t} else {\n\t\t// Some parts of this script use the main login form to display a message\n\t\tif\t\t( isset($_GET['loggedout']) && true == $_GET['loggedout'] )\n\t\t\t$errors->add('loggedout', __('You are now logged out.'), 'message');\n\t\telseif\t( isset($_GET['registration']) && 'disabled' == $_GET['registration'] )\n\t\t\t$errors->add('registerdisabled', __('User registration is currently not allowed.'));\n\t\telseif\t( isset($_GET['checkemail']) && 'confirm' == $_GET['checkemail'] )\n\t\t\t$errors->add('confirm', __('Check your email for the confirmation link.'), 'message');\n\t\telseif\t( isset($_GET['checkemail']) && 'newpass' == $_GET['checkemail'] )\n\t\t\t$errors->add('newpass', __('Check your email for your new password.'), 'message');\n\t\telseif\t( isset($_GET['checkemail']) && 'registered' == $_GET['checkemail'] )\n\t\t\t$errors->add('registered', __('Registration complete. Please check your email.'), 'message');\n\t\telseif ( strpos( $redirect_to, 'about.php?updated' ) )\n\t\t\t$errors->add('updated', __( '<strong>You have successfully updated WordPress!</strong> Please log back in to see what&#8217;s new.' ), 'message' );\n\t}\n\n\t/**\n\t * Filter the login page errors.\n\t *\n\t * @since 3.6.0\n\t *\n\t * @param object $errors      WP Error object.\n\t * @param string $redirect_to Redirect destination URL.\n\t */\n\t$errors = apply_filters( 'wp_login_errors', $errors, $redirect_to );\n\n\t// Clear any stale cookies.\n\tif ( $reauth )\n\t\twp_clear_auth_cookie();\n\n\tlogin_header(__('Log In'), '', $errors);\n\n\tif ( isset($_POST['log']) )\n\t\t$user_login = ( 'incorrect_password' == $errors->get_error_code() || 'empty_password' == $errors->get_error_code() ) ? esc_attr(wp_unslash($_POST['log'])) : '';\n\t$rememberme = ! empty( $_POST['rememberme'] );\n\n\tif ( ! empty( $errors->errors ) ) {\n\t\t$aria_describedby_error = ' aria-describedby=\"login_error\"';\n\t} else {\n\t\t$aria_describedby_error = '';\n\t}\n?>\n\n<form name=\"loginform\" id=\"loginform\" action=\"<?php echo esc_url( site_url( 'wp-login.php', 'login_post' ) ); ?>\" method=\"post\">\n\t<p>\n\t\t<label for=\"user_login\"><?php _e('Username') ?><br />\n\t\t<input type=\"text\" name=\"log\" id=\"user_login\"<?php echo $aria_describedby_error; ?> class=\"input\" value=\"<?php echo esc_attr( $user_login ); ?>\" size=\"20\" /></label>\n\t</p>\n\t<p>\n\t\t<label for=\"user_pass\"><?php _e('Password') ?><br />\n\t\t<input type=\"password\" name=\"pwd\" id=\"user_pass\"<?php echo $aria_describedby_error; ?> class=\"input\" value=\"\" size=\"20\" /></label>\n\t</p>\n\t<?php\n\t/**\n\t * Fires following the 'Password' field in the login form.\n\t *\n\t * @since 2.1.0\n\t */\n\tdo_action( 'login_form' );\n\t?>\n\t<p class=\"forgetmenot\"><label for=\"rememberme\"><input name=\"rememberme\" type=\"checkbox\" id=\"rememberme\" value=\"forever\" <?php checked( $rememberme ); ?> /> <?php esc_attr_e('Remember Me'); ?></label></p>\n\t<p class=\"submit\">\n\t\t<input type=\"submit\" name=\"wp-submit\" id=\"wp-submit\" class=\"button button-primary button-large\" value=\"<?php esc_attr_e('Log In'); ?>\" />\n<?php\tif ( $interim_login ) { ?>\n\t\t<input type=\"hidden\" name=\"interim-login\" value=\"1\" />\n<?php\t} else { ?>\n\t\t<input type=\"hidden\" name=\"redirect_to\" value=\"<?php echo esc_attr($redirect_to); ?>\" />\n<?php \t} ?>\n<?php   if ( $customize_login ) : ?>\n\t\t<input type=\"hidden\" name=\"customize-login\" value=\"1\" />\n<?php   endif; ?>\n\t\t<input type=\"hidden\" name=\"testcookie\" value=\"1\" />\n\t</p>\n</form>\n\n<?php if ( ! $interim_login ) { ?>\n<p id=\"nav\">\n<?php if ( ! isset( $_GET['checkemail'] ) || ! in_array( $_GET['checkemail'], array( 'confirm', 'newpass' ) ) ) :\n\tif ( get_option( 'users_can_register' ) ) :\n\t\t$registration_url = sprintf( '<a href=\"%s\">%s</a>', esc_url( wp_registration_url() ), __( 'Register' ) );\n\n\t\t/** This filter is documented in wp-includes/general-template.php */\n\t\techo apply_filters( 'register', $registration_url ) . ' | ';\n\tendif;\n\t?>\n\t<a href=\"<?php echo esc_url( wp_lostpassword_url() ); ?>\" title=\"<?php esc_attr_e( 'Password Lost and Found' ); ?>\"><?php _e( 'Lost your password?' ); ?></a>\n<?php endif; ?>\n</p>\n<?php } ?>\n\n<script type=\"text/javascript\">\nfunction wp_attempt_focus(){\nsetTimeout( function(){ try{\n<?php if ( $user_login ) { ?>\nd = document.getElementById('user_pass');\nd.value = '';\n<?php } else { ?>\nd = document.getElementById('user_login');\n<?php if ( 'invalid_username' == $errors->get_error_code() ) { ?>\nif( d.value != '' )\nd.value = '';\n<?php\n}\n}?>\nd.focus();\nd.select();\n} catch(e){}\n}, 200);\n}\n\n<?php if ( !$error ) { ?>\nwp_attempt_focus();\n<?php } ?>\nif(typeof wpOnload=='function')wpOnload();\n<?php if ( $interim_login ) { ?>\n(function(){\ntry {\n\tvar i, links = document.getElementsByTagName('a');\n\tfor ( i in links ) {\n\t\tif ( links[i].href )\n\t\t\tlinks[i].target = '_blank';\n\t}\n} catch(e){}\n}());\n<?php } ?>\n</script>\n\n<?php\nlogin_footer();\nbreak;\n} // end action switch\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-mail.php",
    "content": "<?php\n/**\n * Gets the email message from the user's mailbox to add as\n * a WordPress post. Mailbox connection information must be\n * configured under Settings > Writing\n *\n * @package WordPress\n */\n\n/** Make sure that the WordPress bootstrap has run before continuing. */\nrequire(dirname(__FILE__) . '/wp-load.php');\n\n/** This filter is documented in wp-admin/options.php */\nif ( ! apply_filters( 'enable_post_by_email_configuration', true ) )\n\twp_die( __( 'This action has been disabled by the administrator.' ) );\n\n/**\n * Fires to allow a plugin to do a complete takeover of Post by Email.\n *\n * @since 2.9.0\n */\ndo_action( 'wp-mail.php' );\n\n/** Get the POP3 class with which to access the mailbox. */\nrequire_once( ABSPATH . WPINC . '/class-pop3.php' );\n\n/** Only check at this interval for new messages. */\nif ( !defined('WP_MAIL_INTERVAL') )\n\tdefine('WP_MAIL_INTERVAL', 300); // 5 minutes\n\n$last_checked = get_transient('mailserver_last_checked');\n\nif ( $last_checked )\n\twp_die(__('Slow down cowboy, no need to check for new mails so often!'));\n\nset_transient('mailserver_last_checked', true, WP_MAIL_INTERVAL);\n\n$time_difference = get_option('gmt_offset') * HOUR_IN_SECONDS;\n\n$phone_delim = '::';\n\n$pop3 = new POP3();\n\nif ( !$pop3->connect( get_option('mailserver_url'), get_option('mailserver_port') ) || !$pop3->user( get_option('mailserver_login') ) )\n\twp_die( esc_html( $pop3->ERROR ) );\n\n$count = $pop3->pass( get_option('mailserver_pass') );\n\nif( false === $count )\n\twp_die( esc_html( $pop3->ERROR ) );\n\nif( 0 === $count ) {\n\t$pop3->quit();\n\twp_die( __('There doesn&#8217;t seem to be any new mail.') );\n}\n\nfor ( $i = 1; $i <= $count; $i++ ) {\n\n\t$message = $pop3->get($i);\n\n\t$bodysignal = false;\n\t$boundary = '';\n\t$charset = '';\n\t$content = '';\n\t$content_type = '';\n\t$content_transfer_encoding = '';\n\t$post_author = 1;\n\t$author_found = false;\n\t$dmonths = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');\n\tforeach ($message as $line) {\n\t\t// Body signal.\n\t\tif ( strlen($line) < 3 )\n\t\t\t$bodysignal = true;\n\t\tif ( $bodysignal ) {\n\t\t\t$content .= $line;\n\t\t} else {\n\t\t\tif ( preg_match('/Content-Type: /i', $line) ) {\n\t\t\t\t$content_type = trim($line);\n\t\t\t\t$content_type = substr($content_type, 14, strlen($content_type) - 14);\n\t\t\t\t$content_type = explode(';', $content_type);\n\t\t\t\tif ( ! empty( $content_type[1] ) ) {\n\t\t\t\t\t$charset = explode('=', $content_type[1]);\n\t\t\t\t\t$charset = ( ! empty( $charset[1] ) ) ? trim($charset[1]) : '';\n\t\t\t\t}\n\t\t\t\t$content_type = $content_type[0];\n\t\t\t}\n\t\t\tif ( preg_match('/Content-Transfer-Encoding: /i', $line) ) {\n\t\t\t\t$content_transfer_encoding = trim($line);\n\t\t\t\t$content_transfer_encoding = substr($content_transfer_encoding, 27, strlen($content_transfer_encoding) - 27);\n\t\t\t\t$content_transfer_encoding = explode(';', $content_transfer_encoding);\n\t\t\t\t$content_transfer_encoding = $content_transfer_encoding[0];\n\t\t\t}\n\t\t\tif ( ( $content_type == 'multipart/alternative' ) && ( false !== strpos($line, 'boundary=\"') ) && ( '' == $boundary ) ) {\n\t\t\t\t$boundary = trim($line);\n\t\t\t\t$boundary = explode('\"', $boundary);\n\t\t\t\t$boundary = $boundary[1];\n\t\t\t}\n\t\t\tif (preg_match('/Subject: /i', $line)) {\n\t\t\t\t$subject = trim($line);\n\t\t\t\t$subject = substr($subject, 9, strlen($subject) - 9);\n\t\t\t\t// Captures any text in the subject before $phone_delim as the subject\n\t\t\t\tif ( function_exists('iconv_mime_decode') ) {\n\t\t\t\t\t$subject = iconv_mime_decode($subject, 2, get_option('blog_charset'));\n\t\t\t\t} else {\n\t\t\t\t\t$subject = wp_iso_descrambler($subject);\n\t\t\t\t}\n\t\t\t\t$subject = explode($phone_delim, $subject);\n\t\t\t\t$subject = $subject[0];\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * Set the author using the email address (From or Reply-To, the last used)\n\t\t\t * otherwise use the site admin.\n\t\t\t */\n\t\t\tif ( ! $author_found && preg_match( '/^(From|Reply-To): /', $line ) ) {\n\t\t\t\tif ( preg_match('|[a-z0-9_.-]+@[a-z0-9_.-]+(?!.*<)|i', $line, $matches) )\n\t\t\t\t\t$author = $matches[0];\n\t\t\t\telse\n\t\t\t\t\t$author = trim($line);\n\t\t\t\t$author = sanitize_email($author);\n\t\t\t\tif ( is_email($author) ) {\n\t\t\t\t\techo '<p>' . sprintf(__('Author is %s'), $author) . '</p>';\n\t\t\t\t\t$userdata = get_user_by('email', $author);\n\t\t\t\t\tif ( ! empty( $userdata ) ) {\n\t\t\t\t\t\t$post_author = $userdata->ID;\n\t\t\t\t\t\t$author_found = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( preg_match( '/Date: /i', $line ) ) { // of the form '20 Mar 2002 20:32:37 +0100'\n\t\t\t\t$ddate = str_replace( 'Date: ', '', trim( $line ) );\n\t\t\t\t$ddate = preg_replace( '!\\s*\\(.+\\)\\s*$!', '', $ddate );\t// remove parenthesised timezone string if it exists, as this confuses strtotime\n\t\t\t\t$ddate_U = strtotime( $ddate );\n\t\t\t\t$post_date = gmdate( 'Y-m-d H:i:s', $ddate_U + $time_difference );\n\t\t\t\t$post_date_gmt = gmdate( 'Y-m-d H:i:s', $ddate_U );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set $post_status based on $author_found and on author's publish_posts capability\n\tif ( $author_found ) {\n\t\t$user = new WP_User($post_author);\n\t\t$post_status = ( $user->has_cap('publish_posts') ) ? 'publish' : 'pending';\n\t} else {\n\t\t// Author not found in DB, set status to pending. Author already set to admin.\n\t\t$post_status = 'pending';\n\t}\n\n\t$subject = trim($subject);\n\n\tif ( $content_type == 'multipart/alternative' ) {\n\t\t$content = explode('--'.$boundary, $content);\n\t\t$content = $content[2];\n\n\t\t// Match case-insensitive content-transfer-encoding.\n\t\tif ( preg_match( '/Content-Transfer-Encoding: quoted-printable/i', $content, $delim) ) {\n\t\t\t$content = explode($delim[0], $content);\n\t\t\t$content = $content[1];\n\t\t}\n\t\t$content = strip_tags($content, '<img><p><br><i><b><u><em><strong><strike><font><span><div>');\n\t}\n\t$content = trim($content);\n\n\t/**\n\t * Filter the original content of the email.\n\t *\n\t * Give Post-By-Email extending plugins full access to the content, either\n\t * the raw content, or the content of the last quoted-printable section.\n\t *\n\t * @since 2.8.0\n\t *\n\t * @param string $content The original email content.\n\t */\n\t$content = apply_filters( 'wp_mail_original_content', $content );\n\n\tif ( false !== stripos($content_transfer_encoding, \"quoted-printable\") ) {\n\t\t$content = quoted_printable_decode($content);\n\t}\n\n\tif ( function_exists('iconv') && ! empty( $charset ) ) {\n\t\t$content = iconv($charset, get_option('blog_charset'), $content);\n\t}\n\n\t// Captures any text in the body after $phone_delim as the body\n\t$content = explode($phone_delim, $content);\n\t$content = empty( $content[1] ) ? $content[0] : $content[1];\n\n\t$content = trim($content);\n\n\t/**\n\t * Filter the content of the post submitted by email before saving.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param string $content The email content.\n\t */\n\t$post_content = apply_filters( 'phone_content', $content );\n\n\t$post_title = xmlrpc_getposttitle($content);\n\n\tif ($post_title == '') $post_title = $subject;\n\n\t$post_category = array(get_option('default_email_category'));\n\n\t$post_data = compact('post_content','post_title','post_date','post_date_gmt','post_author','post_category', 'post_status');\n\t$post_data = wp_slash($post_data);\n\n\t$post_ID = wp_insert_post($post_data);\n\tif ( is_wp_error( $post_ID ) )\n\t\techo \"\\n\" . $post_ID->get_error_message();\n\n\t// We couldn't post, for whatever reason. Better move forward to the next email.\n\tif ( empty( $post_ID ) )\n\t\tcontinue;\n\n\t/**\n\t * Fires after a post submitted by email is published.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param int $post_ID The post ID.\n\t */\n\tdo_action( 'publish_phone', $post_ID );\n\n\techo \"\\n<p><strong>\" . __( 'Author:' ) . '</strong> ' . esc_html( $post_author ) . '</p>';\n\techo \"\\n<p><strong>\" . __( 'Posted title:' ) . '</strong> ' . esc_html( $post_title ) . '</p>';\n\n\tif(!$pop3->delete($i)) {\n\t\techo '<p>' . sprintf(\n\t\t\t/* translators: %s: POP3 error */\n\t\t\t__( 'Oops: %s' ),\n\t\t\tesc_html( $pop3->ERROR )\n\t\t) . '</p>';\n\t\t$pop3->reset();\n\t\texit;\n\t} else {\n\t\techo '<p>' . sprintf(\n\t\t\t/* translators: %s: the message ID */\n\t\t\t__( 'Mission complete. Message %s deleted.' ),\n\t\t\t'<strong>' . $i . '</strong>'\n\t\t) . '</p>';\n\t}\n\n}\n\n$pop3->quit();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-settings.php",
    "content": "<?php\n/**\n * Used to set up and fix common variables and include\n * the WordPress procedural and class library.\n *\n * Allows for some configuration in wp-config.php (see default-constants.php)\n *\n * @internal This file must be parsable by PHP4.\n *\n * @package WordPress\n */\n\n/**\n * Stores the location of the WordPress directory of functions, classes, and core content.\n *\n * @since 1.0.0\n */\ndefine( 'WPINC', 'wp-includes' );\n\n// Include files required for initialization.\nrequire( ABSPATH . WPINC . '/load.php' );\nrequire( ABSPATH . WPINC . '/default-constants.php' );\n\n/*\n * These can't be directly globalized in version.php. When updating,\n * we're including version.php from another install and don't want\n * these values to be overridden if already set.\n */\nglobal $wp_version, $wp_db_version, $tinymce_version, $required_php_version, $required_mysql_version;\nrequire( ABSPATH . WPINC . '/version.php' );\n\n/**\n * If not already configured, `$blog_id` will default to 1 in a single site\n * configuration. In multisite, it will be overridden by default in ms-settings.php.\n *\n * @global int $blog_id\n * @since 2.0.0\n */\nglobal $blog_id;\n\n// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, SCRIPT_DEBUG, WP_CONTENT_DIR and WP_CACHE.\nwp_initial_constants();\n\n// Check for the required PHP version and for the MySQL extension or a database drop-in.\nwp_check_php_mysql_versions();\n\n// Disable magic quotes at runtime. Magic quotes are added using wpdb later in wp-settings.php.\n@ini_set( 'magic_quotes_runtime', 0 );\n@ini_set( 'magic_quotes_sybase',  0 );\n\n// WordPress calculates offsets from UTC.\ndate_default_timezone_set( 'UTC' );\n\n// Turn register_globals off.\nwp_unregister_GLOBALS();\n\n// Standardize $_SERVER variables across setups.\nwp_fix_server_vars();\n\n// Check if we have received a request due to missing favicon.ico\nwp_favicon_request();\n\n// Check if we're in maintenance mode.\nwp_maintenance();\n\n// Start loading timer.\ntimer_start();\n\n// Check if we're in WP_DEBUG mode.\nwp_debug_mode();\n\n// For an advanced caching plugin to use. Uses a static drop-in because you would only want one.\nif ( WP_CACHE )\n\tWP_DEBUG ? include( WP_CONTENT_DIR . '/advanced-cache.php' ) : @include( WP_CONTENT_DIR . '/advanced-cache.php' );\n\n// Define WP_LANG_DIR if not set.\nwp_set_lang_dir();\n\n// Load early WordPress files.\nrequire( ABSPATH . WPINC . '/compat.php' );\nrequire( ABSPATH . WPINC . '/functions.php' );\nrequire( ABSPATH . WPINC . '/class-wp.php' );\nrequire( ABSPATH . WPINC . '/class-wp-error.php' );\nrequire( ABSPATH . WPINC . '/plugin.php' );\nrequire( ABSPATH . WPINC . '/pomo/mo.php' );\n\n// Include the wpdb class and, if present, a db.php database drop-in.\nrequire_wp_db();\n\n// Set the database table prefix and the format specifiers for database table columns.\n$GLOBALS['table_prefix'] = $table_prefix;\nwp_set_wpdb_vars();\n\n// Start the WordPress object cache, or an external object cache if the drop-in is present.\nwp_start_object_cache();\n\n// Attach the default filters.\nrequire( ABSPATH . WPINC . '/default-filters.php' );\n\n// Initialize multisite if enabled.\nif ( is_multisite() ) {\n\trequire( ABSPATH . WPINC . '/ms-blogs.php' );\n\trequire( ABSPATH . WPINC . '/ms-settings.php' );\n} elseif ( ! defined( 'MULTISITE' ) ) {\n\tdefine( 'MULTISITE', false );\n}\n\nregister_shutdown_function( 'shutdown_action_hook' );\n\n// Stop most of WordPress from being loaded if we just want the basics.\nif ( SHORTINIT )\n\treturn false;\n\n// Load the L10n library.\nrequire_once( ABSPATH . WPINC . '/l10n.php' );\n\n// Run the installer if WordPress is not installed.\nwp_not_installed();\n\n// Load most of WordPress.\nrequire( ABSPATH . WPINC . '/class-wp-walker.php' );\nrequire( ABSPATH . WPINC . '/class-wp-ajax-response.php' );\nrequire( ABSPATH . WPINC . '/formatting.php' );\nrequire( ABSPATH . WPINC . '/capabilities.php' );\nrequire( ABSPATH . WPINC . '/class-wp-roles.php' );\nrequire( ABSPATH . WPINC . '/class-wp-role.php' );\nrequire( ABSPATH . WPINC . '/class-wp-user.php' );\nrequire( ABSPATH . WPINC . '/query.php' );\nrequire( ABSPATH . WPINC . '/date.php' );\nrequire( ABSPATH . WPINC . '/theme.php' );\nrequire( ABSPATH . WPINC . '/class-wp-theme.php' );\nrequire( ABSPATH . WPINC . '/template.php' );\nrequire( ABSPATH . WPINC . '/user.php' );\nrequire( ABSPATH . WPINC . '/class-wp-user-query.php' );\nrequire( ABSPATH . WPINC . '/session.php' );\nrequire( ABSPATH . WPINC . '/meta.php' );\nrequire( ABSPATH . WPINC . '/class-wp-meta-query.php' );\nrequire( ABSPATH . WPINC . '/general-template.php' );\nrequire( ABSPATH . WPINC . '/link-template.php' );\nrequire( ABSPATH . WPINC . '/author-template.php' );\nrequire( ABSPATH . WPINC . '/post.php' );\nrequire( ABSPATH . WPINC . '/class-walker-page.php' );\nrequire( ABSPATH . WPINC . '/class-walker-page-dropdown.php' );\nrequire( ABSPATH . WPINC . '/class-wp-post.php' );\nrequire( ABSPATH . WPINC . '/post-template.php' );\nrequire( ABSPATH . WPINC . '/revision.php' );\nrequire( ABSPATH . WPINC . '/post-formats.php' );\nrequire( ABSPATH . WPINC . '/post-thumbnail-template.php' );\nrequire( ABSPATH . WPINC . '/category.php' );\nrequire( ABSPATH . WPINC . '/class-walker-category.php' );\nrequire( ABSPATH . WPINC . '/class-walker-category-dropdown.php' );\nrequire( ABSPATH . WPINC . '/category-template.php' );\nrequire( ABSPATH . WPINC . '/comment.php' );\nrequire( ABSPATH . WPINC . '/class-wp-comment.php' );\nrequire( ABSPATH . WPINC . '/class-wp-comment-query.php' );\nrequire( ABSPATH . WPINC . '/class-walker-comment.php' );\nrequire( ABSPATH . WPINC . '/comment-template.php' );\nrequire( ABSPATH . WPINC . '/rewrite.php' );\nrequire( ABSPATH . WPINC . '/class-wp-rewrite.php' );\nrequire( ABSPATH . WPINC . '/feed.php' );\nrequire( ABSPATH . WPINC . '/bookmark.php' );\nrequire( ABSPATH . WPINC . '/bookmark-template.php' );\nrequire( ABSPATH . WPINC . '/kses.php' );\nrequire( ABSPATH . WPINC . '/cron.php' );\nrequire( ABSPATH . WPINC . '/deprecated.php' );\nrequire( ABSPATH . WPINC . '/script-loader.php' );\nrequire( ABSPATH . WPINC . '/taxonomy.php' );\nrequire( ABSPATH . WPINC . '/class-wp-term.php' );\nrequire( ABSPATH . WPINC . '/class-wp-tax-query.php' );\nrequire( ABSPATH . WPINC . '/update.php' );\nrequire( ABSPATH . WPINC . '/canonical.php' );\nrequire( ABSPATH . WPINC . '/shortcodes.php' );\nrequire( ABSPATH . WPINC . '/embed.php' );\nrequire( ABSPATH . WPINC . '/class-wp-embed.php' );\nrequire( ABSPATH . WPINC . '/class-wp-oembed-controller.php' );\nrequire( ABSPATH . WPINC . '/media.php' );\nrequire( ABSPATH . WPINC . '/http.php' );\nrequire( ABSPATH . WPINC . '/class-http.php' );\nrequire( ABSPATH . WPINC . '/class-wp-http-streams.php' );\nrequire( ABSPATH . WPINC . '/class-wp-http-curl.php' );\nrequire( ABSPATH . WPINC . '/class-wp-http-proxy.php' );\nrequire( ABSPATH . WPINC . '/class-wp-http-cookie.php' );\nrequire( ABSPATH . WPINC . '/class-wp-http-encoding.php' );\nrequire( ABSPATH . WPINC . '/class-wp-http-response.php' );\nrequire( ABSPATH . WPINC . '/widgets.php' );\nrequire( ABSPATH . WPINC . '/class-wp-widget.php' );\nrequire( ABSPATH . WPINC . '/class-wp-widget-factory.php' );\nrequire( ABSPATH . WPINC . '/nav-menu.php' );\nrequire( ABSPATH . WPINC . '/nav-menu-template.php' );\nrequire( ABSPATH . WPINC . '/admin-bar.php' );\nrequire( ABSPATH . WPINC . '/rest-api.php' );\nrequire( ABSPATH . WPINC . '/rest-api/class-wp-rest-server.php' );\nrequire( ABSPATH . WPINC . '/rest-api/class-wp-rest-response.php' );\nrequire( ABSPATH . WPINC . '/rest-api/class-wp-rest-request.php' );\n\n// Load multisite-specific files.\nif ( is_multisite() ) {\n\trequire( ABSPATH . WPINC . '/ms-functions.php' );\n\trequire( ABSPATH . WPINC . '/ms-default-filters.php' );\n\trequire( ABSPATH . WPINC . '/ms-deprecated.php' );\n}\n\n// Define constants that rely on the API to obtain the default value.\n// Define must-use plugin directory constants, which may be overridden in the sunrise.php drop-in.\nwp_plugin_directory_constants();\n\n$GLOBALS['wp_plugin_paths'] = array();\n\n// Load must-use plugins.\nforeach ( wp_get_mu_plugins() as $mu_plugin ) {\n\tinclude_once( $mu_plugin );\n}\nunset( $mu_plugin );\n\n// Load network activated plugins.\nif ( is_multisite() ) {\n\tforeach ( wp_get_active_network_plugins() as $network_plugin ) {\n\t\twp_register_plugin_realpath( $network_plugin );\n\t\tinclude_once( $network_plugin );\n\t}\n\tunset( $network_plugin );\n}\n\n/**\n * Fires once all must-use and network-activated plugins have loaded.\n *\n * @since 2.8.0\n */\ndo_action( 'muplugins_loaded' );\n\nif ( is_multisite() )\n\tms_cookie_constants(  );\n\n// Define constants after multisite is loaded.\nwp_cookie_constants();\n\n// Define and enforce our SSL constants\nwp_ssl_constants();\n\n// Create common globals.\nrequire( ABSPATH . WPINC . '/vars.php' );\n\n// Make taxonomies and posts available to plugins and themes.\n// @plugin authors: warning: these get registered again on the init hook.\ncreate_initial_taxonomies();\ncreate_initial_post_types();\n\n// Register the default theme directory root\nregister_theme_directory( get_theme_root() );\n\n// Load active plugins.\nforeach ( wp_get_active_and_valid_plugins() as $plugin ) {\n\twp_register_plugin_realpath( $plugin );\n\tinclude_once( $plugin );\n}\nunset( $plugin );\n\n// Load pluggable functions.\nrequire( ABSPATH . WPINC . '/pluggable.php' );\nrequire( ABSPATH . WPINC . '/pluggable-deprecated.php' );\n\n// Set internal encoding.\nwp_set_internal_encoding();\n\n// Run wp_cache_postload() if object cache is enabled and the function exists.\nif ( WP_CACHE && function_exists( 'wp_cache_postload' ) )\n\twp_cache_postload();\n\n/**\n * Fires once activated plugins have loaded.\n *\n * Pluggable functions are also available at this point in the loading order.\n *\n * @since 1.5.0\n */\ndo_action( 'plugins_loaded' );\n\n// Define constants which affect functionality if not already defined.\nwp_functionality_constants();\n\n// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )\nwp_magic_quotes();\n\n/**\n * Fires when comment cookies are sanitized.\n *\n * @since 2.0.11\n */\ndo_action( 'sanitize_comment_cookies' );\n\n/**\n * WordPress Query object\n * @global WP_Query $wp_the_query\n * @since 2.0.0\n */\n$GLOBALS['wp_the_query'] = new WP_Query();\n\n/**\n * Holds the reference to @see $wp_the_query\n * Use this global for WordPress queries\n * @global WP_Query $wp_query\n * @since 1.5.0\n */\n$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];\n\n/**\n * Holds the WordPress Rewrite object for creating pretty URLs\n * @global WP_Rewrite $wp_rewrite\n * @since 1.5.0\n */\n$GLOBALS['wp_rewrite'] = new WP_Rewrite();\n\n/**\n * WordPress Object\n * @global WP $wp\n * @since 2.0.0\n */\n$GLOBALS['wp'] = new WP();\n\n/**\n * WordPress Widget Factory Object\n * @global WP_Widget_Factory $wp_widget_factory\n * @since 2.8.0\n */\n$GLOBALS['wp_widget_factory'] = new WP_Widget_Factory();\n\n/**\n * WordPress User Roles\n * @global WP_Roles $wp_roles\n * @since 2.0.0\n */\n$GLOBALS['wp_roles'] = new WP_Roles();\n\n/**\n * Fires before the theme is loaded.\n *\n * @since 2.6.0\n */\ndo_action( 'setup_theme' );\n\n// Define the template related constants.\nwp_templating_constants(  );\n\n// Load the default text localization domain.\nload_default_textdomain();\n\n$locale = get_locale();\n$locale_file = WP_LANG_DIR . \"/$locale.php\";\nif ( ( 0 === validate_file( $locale ) ) && is_readable( $locale_file ) )\n\trequire( $locale_file );\nunset( $locale_file );\n\n// Pull in locale data after loading text domain.\nrequire_once( ABSPATH . WPINC . '/locale.php' );\n\n/**\n * WordPress Locale object for loading locale domain date and various strings.\n * @global WP_Locale $wp_locale\n * @since 2.1.0\n */\n$GLOBALS['wp_locale'] = new WP_Locale();\n\n// Load the functions for the active theme, for both parent and child theme if applicable.\nif ( ! wp_installing() || 'wp-activate.php' === $pagenow ) {\n\tif ( TEMPLATEPATH !== STYLESHEETPATH && file_exists( STYLESHEETPATH . '/functions.php' ) )\n\t\tinclude( STYLESHEETPATH . '/functions.php' );\n\tif ( file_exists( TEMPLATEPATH . '/functions.php' ) )\n\t\tinclude( TEMPLATEPATH . '/functions.php' );\n}\n\n/**\n * Fires after the theme is loaded.\n *\n * @since 3.0.0\n */\ndo_action( 'after_setup_theme' );\n\n// Set up current user.\n$GLOBALS['wp']->init();\n\n/**\n * Fires after WordPress has finished loading but before any headers are sent.\n *\n * Most of WP is loaded at this stage, and the user is authenticated. WP continues\n * to load on the init hook that follows (e.g. widgets), and many plugins instantiate\n * themselves on it for all sorts of reasons (e.g. they need a user, a taxonomy, etc.).\n *\n * If you wish to plug an action once WP is loaded, use the wp_loaded hook below.\n *\n * @since 1.5.0\n */\ndo_action( 'init' );\n\n// Check site status\nif ( is_multisite() ) {\n\tif ( true !== ( $file = ms_site_check() ) ) {\n\t\trequire( $file );\n\t\tdie();\n\t}\n\tunset($file);\n}\n\n/**\n * This hook is fired once WP, all plugins, and the theme are fully loaded and instantiated.\n *\n * AJAX requests should use wp-admin/admin-ajax.php. admin-ajax.php can handle requests for\n * users not logged in.\n *\n * @link https://codex.wordpress.org/AJAX_in_Plugins\n *\n * @since 3.0.0\n */\ndo_action( 'wp_loaded' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-signup.php",
    "content": "<?php\n\n/** Sets up the WordPress Environment. */\nrequire( dirname(__FILE__) . '/wp-load.php' );\n\nadd_action( 'wp_head', 'wp_no_robots' );\n\nrequire( dirname( __FILE__ ) . '/wp-blog-header.php' );\n\nif ( is_array( get_site_option( 'illegal_names' )) && isset( $_GET[ 'new' ] ) && in_array( $_GET[ 'new' ], get_site_option( 'illegal_names' ) ) ) {\n\twp_redirect( network_home_url() );\n\tdie();\n}\n\n/**\n * Prints signup_header via wp_head\n *\n * @since MU\n */\nfunction do_signup_header() {\n\t/**\n\t * Fires within the head section of the site sign-up screen.\n\t *\n\t * @since 3.0.0\n\t */\n\tdo_action( 'signup_header' );\n}\nadd_action( 'wp_head', 'do_signup_header' );\n\nif ( !is_multisite() ) {\n\twp_redirect( wp_registration_url() );\n\tdie();\n}\n\nif ( !is_main_site() ) {\n\twp_redirect( network_site_url( 'wp-signup.php' ) );\n\tdie();\n}\n\n// Fix for page title\n$wp_query->is_404 = false;\n\n/**\n * Fires before the Site Signup page is loaded.\n *\n * @since 4.4.0\n */\ndo_action( 'before_signup_header' );\n\n/**\n * Prints styles for front-end Multisite signup pages\n *\n * @since MU\n */\nfunction wpmu_signup_stylesheet() {\n\t?>\n\t<style type=\"text/css\">\n\t\t.mu_register { width: 90%; margin:0 auto; }\n\t\t.mu_register form { margin-top: 2em; }\n\t\t.mu_register .error { font-weight:700; padding:10px; color:#333333; background:#FFEBE8; border:1px solid #CC0000; }\n\t\t.mu_register input[type=\"submit\"],\n\t\t\t.mu_register #blog_title,\n\t\t\t.mu_register #user_email,\n\t\t\t.mu_register #blogname,\n\t\t\t.mu_register #user_name { width:100%; font-size: 24px; margin:5px 0; }\n\t\t.mu_register #site-language { display: block; }\n\t\t.mu_register .prefix_address,\n\t\t\t.mu_register .suffix_address {font-size: 18px;display:inline; }\n\t\t.mu_register label { font-weight:700; font-size:15px; display:block; margin:10px 0; }\n\t\t.mu_register label.checkbox { display:inline; }\n\t\t.mu_register .mu_alert { font-weight:700; padding:10px; color:#333333; background:#ffffe0; border:1px solid #e6db55; }\n\t</style>\n\t<?php\n}\n\nadd_action( 'wp_head', 'wpmu_signup_stylesheet' );\nget_header( 'wp-signup' );\n\n/**\n * Fires before the site sign-up form.\n *\n * @since 3.0.0\n */\ndo_action( 'before_signup_form' );\n?>\n<div id=\"signup-content\" class=\"widecolumn\">\n<div class=\"mu_register wp-signup-container\">\n<?php\n/**\n * Generates and displays the Signup and Create Site forms\n *\n * @since MU\n *\n * @param string $blogname The new site name\n * @param string $blog_title The new site title\n * @param array $errors\n */\nfunction show_blog_form( $blogname = '', $blog_title = '', $errors = '' ) {\n\t$current_site = get_current_site();\n\t// Blog name\n\tif ( !is_subdomain_install() )\n\t\techo '<label for=\"blogname\">' . __('Site Name:') . '</label>';\n\telse\n\t\techo '<label for=\"blogname\">' . __('Site Domain:') . '</label>';\n\n\tif ( $errmsg = $errors->get_error_message('blogname') ) { ?>\n\t\t<p class=\"error\"><?php echo $errmsg ?></p>\n\t<?php }\n\n\tif ( !is_subdomain_install() )\n\t\techo '<span class=\"prefix_address\">' . $current_site->domain . $current_site->path . '</span><input name=\"blogname\" type=\"text\" id=\"blogname\" value=\"'. esc_attr($blogname) .'\" maxlength=\"60\" /><br />';\n\telse\n\t\techo '<input name=\"blogname\" type=\"text\" id=\"blogname\" value=\"'.esc_attr($blogname).'\" maxlength=\"60\" /><span class=\"suffix_address\">.' . ( $site_domain = preg_replace( '|^www\\.|', '', $current_site->domain ) ) . '</span><br />';\n\n\tif ( !is_user_logged_in() ) {\n\t\tif ( !is_subdomain_install() )\n\t\t\t$site = $current_site->domain . $current_site->path . __( 'sitename' );\n\t\telse\n\t\t\t$site = __( 'domain' ) . '.' . $site_domain . $current_site->path;\n\t\techo '<p>(<strong>' . sprintf( __('Your address will be %s.'), $site ) . '</strong>) ' . __( 'Must be at least 4 characters, letters and numbers only. It cannot be changed, so choose carefully!' ) . '</p>';\n\t}\n\n\t// Blog Title\n\t?>\n\t<label for=\"blog_title\"><?php _e('Site Title:') ?></label>\n\t<?php if ( $errmsg = $errors->get_error_message('blog_title') ) { ?>\n\t\t<p class=\"error\"><?php echo $errmsg ?></p>\n\t<?php }\n\techo '<input name=\"blog_title\" type=\"text\" id=\"blog_title\" value=\"'.esc_attr($blog_title).'\" />';\n\t?>\n\n\t<?php\n\t// Site Language.\n\t$languages = signup_get_available_languages();\n\n\tif ( ! empty( $languages ) ) :\n\t\t?>\n\t\t<p>\n\t\t\t<label for=\"site-language\"><?php _e( 'Site Language:' ); ?></label>\n\t\t\t<?php\n\t\t\t// Network default.\n\t\t\t$lang = get_site_option( 'WPLANG' );\n\n\t\t\tif ( isset( $_POST['WPLANG'] ) ) {\n\t\t\t\t$lang = $_POST['WPLANG'];\n\t\t\t}\n\n\t\t\t// Use US English if the default isn't available.\n\t\t\tif ( ! in_array( $lang, $languages ) ) {\n\t\t\t\t$lang = '';\n\t\t\t}\n\n\t\t\twp_dropdown_languages( array(\n\t\t\t\t'name'                        => 'WPLANG',\n\t\t\t\t'id'                          => 'site-language',\n\t\t\t\t'selected'                    => $lang,\n\t\t\t\t'languages'                   => $languages,\n\t\t\t\t'show_available_translations' => false,\n\t\t\t) );\n\t\t\t?>\n\t\t</p>\n\t<?php endif; // Languages. ?>\n\n\t<div id=\"privacy\">\n        <p class=\"privacy-intro\">\n            <label for=\"blog_public_on\"><?php _e('Privacy:') ?></label>\n            <?php _e( 'Allow search engines to index this site.' ); ?>\n            <br style=\"clear:both\" />\n            <label class=\"checkbox\" for=\"blog_public_on\">\n                <input type=\"radio\" id=\"blog_public_on\" name=\"blog_public\" value=\"1\" <?php if ( !isset( $_POST['blog_public'] ) || $_POST['blog_public'] == '1' ) { ?>checked=\"checked\"<?php } ?> />\n                <strong><?php _e( 'Yes' ); ?></strong>\n            </label>\n            <label class=\"checkbox\" for=\"blog_public_off\">\n                <input type=\"radio\" id=\"blog_public_off\" name=\"blog_public\" value=\"0\" <?php if ( isset( $_POST['blog_public'] ) && $_POST['blog_public'] == '0' ) { ?>checked=\"checked\"<?php } ?> />\n                <strong><?php _e( 'No' ); ?></strong>\n            </label>\n        </p>\n\t</div>\n\n\t<?php\n\t/**\n\t * Fires after the site sign-up form.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $errors An array possibly containing 'blogname' or 'blog_title' errors.\n\t */\n\tdo_action( 'signup_blogform', $errors );\n}\n\n/**\n * Validate the new site signup\n *\n * @since MU\n *\n * @return array Contains the new site data and error messages.\n */\nfunction validate_blog_form() {\n\t$user = '';\n\tif ( is_user_logged_in() )\n\t\t$user = wp_get_current_user();\n\n\treturn wpmu_validate_blog_signup($_POST['blogname'], $_POST['blog_title'], $user);\n}\n\n/**\n * Display user registration form\n *\n * @since MU\n *\n * @param string $user_name The entered username\n * @param string $user_email The entered email address\n * @param array $errors\n */\nfunction show_user_form($user_name = '', $user_email = '', $errors = '') {\n\t// User name\n\techo '<label for=\"user_name\">' . __('Username:') . '</label>';\n\tif ( $errmsg = $errors->get_error_message('user_name') ) {\n\t\techo '<p class=\"error\">'.$errmsg.'</p>';\n\t}\n\techo '<input name=\"user_name\" type=\"text\" id=\"user_name\" value=\"'. esc_attr($user_name) .'\" maxlength=\"60\" /><br />';\n\t_e( '(Must be at least 4 characters, letters and numbers only.)' );\n\t?>\n\n\t<label for=\"user_email\"><?php _e( 'Email&nbsp;Address:' ) ?></label>\n\t<?php if ( $errmsg = $errors->get_error_message('user_email') ) { ?>\n\t\t<p class=\"error\"><?php echo $errmsg ?></p>\n\t<?php } ?>\n\t<input name=\"user_email\" type=\"email\" id=\"user_email\" value=\"<?php  echo esc_attr($user_email) ?>\" maxlength=\"200\" /><br /><?php _e('We send your registration email to this address. (Double-check your email address before continuing.)') ?>\n\t<?php\n\tif ( $errmsg = $errors->get_error_message('generic') ) {\n\t\techo '<p class=\"error\">' . $errmsg . '</p>';\n\t}\n\t/**\n\t * Fires at the end of the user registration form on the site sign-up form.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $errors An array possibly containing 'user_name' or 'user_email' errors.\n\t */\n\tdo_action( 'signup_extra_fields', $errors );\n}\n\n/**\n * Validate user signup name and email\n *\n * @since MU\n *\n * @return array Contains username, email, and error messages.\n */\nfunction validate_user_form() {\n\treturn wpmu_validate_user_signup($_POST['user_name'], $_POST['user_email']);\n}\n\n/**\n * Allow returning users to sign up for another site\n *\n * @since MU\n *\n * @param string $blogname The new site name\n * @param string $blog_title The new blog title\n * @param array $errors\n */\nfunction signup_another_blog( $blogname = '', $blog_title = '', $errors = '' ) {\n\t$current_user = wp_get_current_user();\n\n\tif ( ! is_wp_error($errors) ) {\n\t\t$errors = new WP_Error();\n\t}\n\n\t$signup_defaults = array(\n\t\t'blogname'   => $blogname,\n\t\t'blog_title' => $blog_title,\n\t\t'errors'     => $errors\n\t);\n\n\t/**\n\t * Filter the default site sign-up variables.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $signup_defaults {\n\t *     An array of default site sign-up variables.\n\t *\n\t *     @type string $blogname   The site blogname.\n\t *     @type string $blog_title The site title.\n\t *     @type array  $errors     An array possibly containing 'blogname' or 'blog_title' errors.\n\t * }\n\t */\n\t$filtered_results = apply_filters( 'signup_another_blog_init', $signup_defaults );\n\n\t$blogname = $filtered_results['blogname'];\n\t$blog_title = $filtered_results['blog_title'];\n\t$errors = $filtered_results['errors'];\n\n\techo '<h2>' . sprintf( __( 'Get <em>another</em> %s site in seconds' ), get_current_site()->site_name ) . '</h2>';\n\n\tif ( $errors->get_error_code() ) {\n\t\techo '<p>' . __( 'There was a problem, please correct the form below and try again.' ) . '</p>';\n\t}\n\t?>\n\t<p><?php printf( __( 'Welcome back, %s. By filling out the form below, you can <strong>add another site to your account</strong>. There is no limit to the number of sites you can have, so create to your heart&#8217;s content, but write responsibly!' ), $current_user->display_name ) ?></p>\n\n\t<?php\n\t$blogs = get_blogs_of_user($current_user->ID);\n\tif ( !empty($blogs) ) { ?>\n\n\t\t\t<p><?php _e( 'Sites you are already a member of:' ) ?></p>\n\t\t\t<ul>\n\t\t\t\t<?php foreach ( $blogs as $blog ) {\n\t\t\t\t\t$home_url = get_home_url( $blog->userblog_id );\n\t\t\t\t\techo '<li><a href=\"' . esc_url( $home_url ) . '\">' . $home_url . '</a></li>';\n\t\t\t\t} ?>\n\t\t\t</ul>\n\t<?php } ?>\n\n\t<p><?php _e( 'If you&#8217;re not going to use a great site domain, leave it for a new user. Now have at it!' ) ?></p>\n\t<form id=\"setupform\" method=\"post\" action=\"wp-signup.php\">\n\t\t<input type=\"hidden\" name=\"stage\" value=\"gimmeanotherblog\" />\n\t\t<?php\n\t\t/**\n\t\t * Hidden sign-up form fields output when creating another site or user.\n\t\t *\n\t\t * @since MU\n\t\t *\n\t\t * @param string $context A string describing the steps of the sign-up process. The value can be\n\t\t *                        'create-another-site', 'validate-user', or 'validate-site'.\n\t\t */\n\t\tdo_action( 'signup_hidden_fields', 'create-another-site' );\n\t\t?>\n\t\t<?php show_blog_form($blogname, $blog_title, $errors); ?>\n\t\t<p class=\"submit\"><input type=\"submit\" name=\"submit\" class=\"submit\" value=\"<?php esc_attr_e( 'Create Site' ) ?>\" /></p>\n\t</form>\n\t<?php\n}\n\n/**\n * Validate a new blog signup\n *\n * @since MU\n *\n * @return null|bool True if blog signup was validated, false if error.\n *                   The function halts all execution if the user is not logged in.\n */\nfunction validate_another_blog_signup() {\n\tglobal $wpdb, $blogname, $blog_title, $errors, $domain, $path;\n\t$current_user = wp_get_current_user();\n\tif ( ! is_user_logged_in() ) {\n\t\tdie();\n\t}\n\n\t$result = validate_blog_form();\n\n\t// Extracted values set/overwrite globals.\n\t$domain = $result['domain'];\n\t$path = $result['path'];\n\t$blogname = $result['blogname'];\n\t$blog_title = $result['blog_title'];\n\t$errors = $result['errors'];\n\n\tif ( $errors->get_error_code() ) {\n\t\tsignup_another_blog($blogname, $blog_title, $errors);\n\t\treturn false;\n\t}\n\n\t$public = (int) $_POST['blog_public'];\n\n\t$blog_meta_defaults = array(\n\t\t'lang_id' => 1,\n\t\t'public'  => $public\n\t);\n\n\t// Handle the language setting for the new site.\n\tif ( ! empty( $_POST['WPLANG'] ) ) {\n\n\t\t$languages = signup_get_available_languages();\n\n\t\tif ( in_array( $_POST['WPLANG'], $languages ) ) {\n\t\t\t$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );\n\n\t\t\tif ( $language ) {\n\t\t\t\t$blog_meta_defaults['WPLANG'] = $language;\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Filter the new site meta variables.\n\t *\n\t * @since MU\n\t * @deprecated 3.0.0 Use the 'add_signup_meta' filter instead.\n\t *\n\t * @param array $blog_meta_defaults An array of default blog meta variables.\n\t */\n\t$meta_defaults = apply_filters( 'signup_create_blog_meta', $blog_meta_defaults );\n\n\t/**\n\t * Filter the new default site meta variables.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $meta {\n\t *     An array of default site meta variables.\n\t *\n\t *     @type int $lang_id     The language ID.\n\t *     @type int $blog_public Whether search engines should be discouraged from indexing the site. 1 for true, 0 for false.\n\t * }\n\t */\n\t$meta = apply_filters( 'add_signup_meta', $meta_defaults );\n\n\t$blog_id = wpmu_create_blog( $domain, $path, $blog_title, $current_user->ID, $meta, $wpdb->siteid );\n\n\tif ( is_wp_error( $blog_id ) ) {\n\t\treturn false;\n\t}\n\n\tconfirm_another_blog_signup( $domain, $path, $blog_title, $current_user->user_login, $current_user->user_email, $meta, $blog_id );\n\treturn true;\n}\n\n/**\n * Confirm a new site signup\n *\n * @since MU\n * @since 4.4.0 Added the `$blog_id` parameter.\n *\n * @param string $domain The domain URL\n * @param string $path The site root path\n * @param string $blog_title The blog title\n * @param string $user_name The username\n * @param string $user_email The user's email address\n * @param array  $meta Any additional meta from the 'add_signup_meta' filter in validate_blog_signup()\n * @param int    $blog_id The blog ID\n */\nfunction confirm_another_blog_signup( $domain, $path, $blog_title, $user_name, $user_email = '', $meta = array(), $blog_id = 0 ) {\n\n\tif ( $blog_id ) {\n\t\tswitch_to_blog( $blog_id );\n\t\t$home_url  = home_url( '/' );\n\t\t$login_url = wp_login_url();\n\t\trestore_current_blog();\n\t} else {\n\t\t$home_url  = 'http://' . $domain . $path;\n\t\t$login_url = 'http://' . $domain . $path . 'wp-login.php';\n\t}\n\n\t$site = sprintf( '<a href=\"%1$s\">%2$s</a>',\n\t\tesc_url( $home_url ),\n\t\t$blog_title\n\t);\n\n\t?>\n\t<h2><?php printf( __( 'The site %s is yours.' ), $site ); ?></h2>\n\t<p>\n\t\t<?php printf(\n\t\t\t__( '<a href=\"%1$s\">%2$s</a> is your new site. <a href=\"%3$s\">Log in</a> as &#8220;%4$s&#8221; using your existing password.' ),\n\t\t\tesc_url( $home_url ),\n\t\t\tuntrailingslashit( $domain . $path ),\n\t\t\tesc_url( $login_url ),\n\t\t\t$user_name\n\t\t); ?>\n\t</p>\n\t<?php\n\t/**\n\t * Fires when the site or user sign-up process is complete.\n\t *\n\t * @since 3.0.0\n\t */\n\tdo_action( 'signup_finished' );\n}\n\n/**\n * Setup the new user signup process\n *\n * @since MU\n *\n * @param string $user_name The username\n * @param string $user_email The user's email\n * @param array $errors\n */\nfunction signup_user( $user_name = '', $user_email = '', $errors = '' ) {\n\tglobal $active_signup;\n\n\tif ( !is_wp_error($errors) )\n\t\t$errors = new WP_Error();\n\n\t$signup_for = isset( $_POST[ 'signup_for' ] ) ? esc_html( $_POST[ 'signup_for' ] ) : 'blog';\n\n\t$signup_user_defaults = array(\n\t\t'user_name'  => $user_name,\n\t\t'user_email' => $user_email,\n\t\t'errors'     => $errors,\n\t);\n\n\t/**\n\t * Filter the default user variables used on the user sign-up form.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $signup_user_defaults {\n\t *     An array of default user variables.\n\t *\n\t *     @type string $user_name  The user username.\n\t *     @type string $user_email The user email address.\n\t *     @type array  $errors     An array of possible errors relevant to the sign-up user.\n\t * }\n\t */\n\t$filtered_results = apply_filters( 'signup_user_init', $signup_user_defaults );\n\t$user_name = $filtered_results['user_name'];\n\t$user_email = $filtered_results['user_email'];\n\t$errors = $filtered_results['errors'];\n\n\t?>\n\n\t<h2><?php printf( __( 'Get your own %s account in seconds' ), get_current_site()->site_name ) ?></h2>\n\t<form id=\"setupform\" method=\"post\" action=\"wp-signup.php\" novalidate=\"novalidate\">\n\t\t<input type=\"hidden\" name=\"stage\" value=\"validate-user-signup\" />\n\t\t<?php\n\t\t/** This action is documented in wp-signup.php */\n\t\tdo_action( 'signup_hidden_fields', 'validate-user' );\n\t\t?>\n\t\t<?php show_user_form($user_name, $user_email, $errors); ?>\n\n\t\t<p>\n\t\t<?php if ( $active_signup == 'blog' ) { ?>\n\t\t\t<input id=\"signupblog\" type=\"hidden\" name=\"signup_for\" value=\"blog\" />\n\t\t<?php } elseif ( $active_signup == 'user' ) { ?>\n\t\t\t<input id=\"signupblog\" type=\"hidden\" name=\"signup_for\" value=\"user\" />\n\t\t<?php } else { ?>\n\t\t\t<input id=\"signupblog\" type=\"radio\" name=\"signup_for\" value=\"blog\" <?php checked( $signup_for, 'blog' ); ?> />\n\t\t\t<label class=\"checkbox\" for=\"signupblog\"><?php _e('Gimme a site!') ?></label>\n\t\t\t<br />\n\t\t\t<input id=\"signupuser\" type=\"radio\" name=\"signup_for\" value=\"user\" <?php checked( $signup_for, 'user' ); ?> />\n\t\t\t<label class=\"checkbox\" for=\"signupuser\"><?php _e('Just a username, please.') ?></label>\n\t\t<?php } ?>\n\t\t</p>\n\n\t\t<p class=\"submit\"><input type=\"submit\" name=\"submit\" class=\"submit\" value=\"<?php esc_attr_e('Next') ?>\" /></p>\n\t</form>\n\t<?php\n}\n\n/**\n * Validate the new user signup\n *\n * @since MU\n *\n * @return bool True if new user signup was validated, false if error\n */\nfunction validate_user_signup() {\n\t$result = validate_user_form();\n\t$user_name = $result['user_name'];\n\t$user_email = $result['user_email'];\n\t$errors = $result['errors'];\n\n\tif ( $errors->get_error_code() ) {\n\t\tsignup_user($user_name, $user_email, $errors);\n\t\treturn false;\n\t}\n\n\tif ( 'blog' == $_POST['signup_for'] ) {\n\t\tsignup_blog($user_name, $user_email);\n\t\treturn false;\n\t}\n\n\t/** This filter is documented in wp-signup.php */\n\twpmu_signup_user( $user_name, $user_email, apply_filters( 'add_signup_meta', array() ) );\n\n\tconfirm_user_signup($user_name, $user_email);\n\treturn true;\n}\n\n/**\n * New user signup confirmation\n *\n * @since MU\n *\n * @param string $user_name The username\n * @param string $user_email The user's email address\n */\nfunction confirm_user_signup($user_name, $user_email) {\n\t?>\n\t<h2><?php /* translators: %s: username */\n\tprintf( __( '%s is your new username' ), $user_name) ?></h2>\n\t<p><?php _e( 'But, before you can start using your new username, <strong>you must activate it</strong>.' ) ?></p>\n\t<p><?php /* translators: %s: email address */\n\tprintf( __( 'Check your inbox at %s and click the link given.' ), '<strong>' . $user_email . '</strong>' ); ?></p>\n\t<p><?php _e( 'If you do not activate your username within two days, you will have to sign up again.' ); ?></p>\n\t<?php\n\t/** This action is documented in wp-signup.php */\n\tdo_action( 'signup_finished' );\n}\n\n/**\n * Setup the new site signup\n *\n * @since MU\n *\n * @param string $user_name The username\n * @param string $user_email The user's email address\n * @param string $blogname The site name\n * @param string $blog_title The site title\n * @param array $errors\n */\nfunction signup_blog($user_name = '', $user_email = '', $blogname = '', $blog_title = '', $errors = '') {\n\tif ( !is_wp_error($errors) )\n\t\t$errors = new WP_Error();\n\n\t$signup_blog_defaults = array(\n\t\t'user_name'  => $user_name,\n\t\t'user_email' => $user_email,\n\t\t'blogname'   => $blogname,\n\t\t'blog_title' => $blog_title,\n\t\t'errors'     => $errors\n\t);\n\n\t/**\n\t * Filter the default site creation variables for the site sign-up form.\n\t *\n\t * @since 3.0.0\n\t *\n\t * @param array $signup_blog_defaults {\n\t *     An array of default site creation variables.\n\t *\n\t *     @type string $user_name  The user username.\n\t *     @type string $user_email The user email address.\n\t *     @type string $blogname   The blogname.\n\t *     @type string $blog_title The title of the site.\n\t *     @type array  $errors     An array of possible errors relevant to new site creation variables.\n\t * }\n\t */\n\t$filtered_results = apply_filters( 'signup_blog_init', $signup_blog_defaults );\n\n\t$user_name = $filtered_results['user_name'];\n\t$user_email = $filtered_results['user_email'];\n\t$blogname = $filtered_results['blogname'];\n\t$blog_title = $filtered_results['blog_title'];\n\t$errors = $filtered_results['errors'];\n\n\tif ( empty($blogname) )\n\t\t$blogname = $user_name;\n\t?>\n\t<form id=\"setupform\" method=\"post\" action=\"wp-signup.php\">\n\t\t<input type=\"hidden\" name=\"stage\" value=\"validate-blog-signup\" />\n\t\t<input type=\"hidden\" name=\"user_name\" value=\"<?php echo esc_attr($user_name) ?>\" />\n\t\t<input type=\"hidden\" name=\"user_email\" value=\"<?php echo esc_attr($user_email) ?>\" />\n\t\t<?php\n\t\t/** This action is documented in wp-signup.php */\n\t\tdo_action( 'signup_hidden_fields', 'validate-site' );\n\t\t?>\n\t\t<?php show_blog_form($blogname, $blog_title, $errors); ?>\n\t\t<p class=\"submit\"><input type=\"submit\" name=\"submit\" class=\"submit\" value=\"<?php esc_attr_e('Signup') ?>\" /></p>\n\t</form>\n\t<?php\n}\n\n/**\n * Validate new site signup\n *\n * @since MU\n *\n * @return bool True if the site signup was validated, false if error\n */\nfunction validate_blog_signup() {\n\t// Re-validate user info.\n\t$user_result = wpmu_validate_user_signup( $_POST['user_name'], $_POST['user_email'] );\n\t$user_name = $user_result['user_name'];\n\t$user_email = $user_result['user_email'];\n\t$user_errors = $user_result['errors'];\n\n\tif ( $user_errors->get_error_code() ) {\n\t\tsignup_user( $user_name, $user_email, $user_errors );\n\t\treturn false;\n\t}\n\n\t$result = wpmu_validate_blog_signup( $_POST['blogname'], $_POST['blog_title'] );\n\t$domain = $result['domain'];\n\t$path = $result['path'];\n\t$blogname = $result['blogname'];\n\t$blog_title = $result['blog_title'];\n\t$errors = $result['errors'];\n\n\tif ( $errors->get_error_code() ) {\n\t\tsignup_blog($user_name, $user_email, $blogname, $blog_title, $errors);\n\t\treturn false;\n\t}\n\n\t$public = (int) $_POST['blog_public'];\n\t$signup_meta = array ('lang_id' => 1, 'public' => $public);\n\n\t// Handle the language setting for the new site.\n\tif ( ! empty( $_POST['WPLANG'] ) ) {\n\n\t\t$languages = signup_get_available_languages();\n\n\t\tif ( in_array( $_POST['WPLANG'], $languages ) ) {\n\t\t\t$language = wp_unslash( sanitize_text_field( $_POST['WPLANG'] ) );\n\n\t\t\tif ( $language ) {\n\t\t\t\t$signup_meta['WPLANG'] = $language;\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/** This filter is documented in wp-signup.php */\n\t$meta = apply_filters( 'add_signup_meta', $signup_meta );\n\n\twpmu_signup_blog($domain, $path, $blog_title, $user_name, $user_email, $meta);\n\tconfirm_blog_signup($domain, $path, $blog_title, $user_name, $user_email, $meta);\n\treturn true;\n}\n\n/**\n * New site signup confirmation\n *\n * @since MU\n *\n * @param string $domain The domain URL\n * @param string $path The site root path\n * @param string $blog_title The new site title\n * @param string $user_name The user's username\n * @param string $user_email The user's email address\n * @param array $meta Any additional meta from the 'add_signup_meta' filter in validate_blog_signup()\n */\nfunction confirm_blog_signup( $domain, $path, $blog_title, $user_name = '', $user_email = '', $meta = array() ) {\n\t?>\n\t<h2><?php /* translators: %s: site address */\n\tprintf( __( 'Congratulations! Your new site, %s, is almost ready.' ), \"<a href='http://{$domain}{$path}'>{$blog_title}</a>\" ) ?></h2>\n\n\t<p><?php _e( 'But, before you can start using your site, <strong>you must activate it</strong>.' ) ?></p>\n\t<p><?php /* translators: %s: email address */\n\tprintf( __( 'Check your inbox at %s and click the link given.' ), '<strong>' . $user_email . '</strong>' ); ?></p>\n\t<p><?php _e( 'If you do not activate your site within two days, you will have to sign up again.' ); ?></p>\n\t<h2><?php _e( 'Still waiting for your email?' ); ?></h2>\n\t<p>\n\t\t<?php _e( 'If you haven&#8217;t received your email yet, there are a number of things you can do:' ) ?>\n\t\t<ul id=\"noemail-tips\">\n\t\t\t<li><p><strong><?php _e( 'Wait a little longer. Sometimes delivery of email can be delayed by processes outside of our control.' ) ?></strong></p></li>\n\t\t\t<li><p><?php _e( 'Check the junk or spam folder of your email client. Sometime emails wind up there by mistake.' ) ?></p></li>\n\t\t\t<li><?php printf( __( 'Have you entered your email correctly? You have entered %s, if it&#8217;s incorrect, you will not receive your email.' ), $user_email ) ?></li>\n\t\t</ul>\n\t</p>\n\t<?php\n\t/** This action is documented in wp-signup.php */\n\tdo_action( 'signup_finished' );\n}\n\n/**\n * Retrieves languages available during the site/user signup process.\n *\n * @since 4.4.0\n *\n * @see get_available_languages()\n *\n * @return array List of available languages.\n */\nfunction signup_get_available_languages() {\n\t/**\n\t * Filter the list of available languages for front-end site signups.\n\t *\n\t * Passing an empty array to this hook will disable output of the setting on the\n\t * signup form, and the default language will be used when creating the site.\n\t *\n\t * Languages not already installed will be stripped.\n\t *\n\t * @since 4.4.0\n\t *\n\t * @param array $available_languages Available languages.\n\t */\n\t$languages = (array) apply_filters( 'signup_get_available_languages', get_available_languages() );\n\n\t/*\n\t * Strip any non-installed languages and return.\n\t *\n\t * Re-call get_available_languages() here in case a language pack was installed\n\t * in a callback hooked to the 'signup_get_available_languages' filter before this point.\n\t */\n\treturn array_intersect_assoc( $languages, get_available_languages() );\n}\n\n// Main\n$active_signup = get_site_option( 'registration', 'none' );\n/**\n * Filter the type of site sign-up.\n *\n * @since 3.0.0\n *\n * @param string $active_signup String that returns registration type. The value can be\n *                              'all', 'none', 'blog', or 'user'.\n */\n$active_signup = apply_filters( 'wpmu_active_signup', $active_signup );\n\n// Make the signup type translatable.\n$i18n_signup['all'] = _x('all', 'Multisite active signup type');\n$i18n_signup['none'] = _x('none', 'Multisite active signup type');\n$i18n_signup['blog'] = _x('blog', 'Multisite active signup type');\n$i18n_signup['user'] = _x('user', 'Multisite active signup type');\n\nif ( is_super_admin() )\n\techo '<div class=\"mu_alert\">' . sprintf( __( 'Greetings Site Administrator! You are currently allowing &#8220;%s&#8221; registrations. To change or disable registration go to your <a href=\"%s\">Options page</a>.' ), $i18n_signup[$active_signup], esc_url( network_admin_url( 'settings.php' ) ) ) . '</div>';\n\n$newblogname = isset($_GET['new']) ? strtolower(preg_replace('/^-|-$|[^-a-zA-Z0-9]/', '', $_GET['new'])) : null;\n\n$current_user = wp_get_current_user();\nif ( $active_signup == 'none' ) {\n\t_e( 'Registration has been disabled.' );\n} elseif ( $active_signup == 'blog' && !is_user_logged_in() ) {\n\t$login_url = wp_login_url( network_site_url( 'wp-signup.php' ) );\n\techo sprintf( __( 'You must first <a href=\"%s\">log in</a>, and then you can create a new site.' ), $login_url );\n} else {\n\t$stage = isset( $_POST['stage'] ) ?  $_POST['stage'] : 'default';\n\tswitch ( $stage ) {\n\t\tcase 'validate-user-signup' :\n\t\t\tif ( $active_signup == 'all' || $_POST[ 'signup_for' ] == 'blog' && $active_signup == 'blog' || $_POST[ 'signup_for' ] == 'user' && $active_signup == 'user' )\n\t\t\t\tvalidate_user_signup();\n\t\t\telse\n\t\t\t\t_e( 'User registration has been disabled.' );\n\t\tbreak;\n\t\tcase 'validate-blog-signup':\n\t\t\tif ( $active_signup == 'all' || $active_signup == 'blog' )\n\t\t\t\tvalidate_blog_signup();\n\t\t\telse\n\t\t\t\t_e( 'Site registration has been disabled.' );\n\t\t\tbreak;\n\t\tcase 'gimmeanotherblog':\n\t\t\tvalidate_another_blog_signup();\n\t\t\tbreak;\n\t\tcase 'default':\n\t\tdefault :\n\t\t\t$user_email = isset( $_POST[ 'user_email' ] ) ? $_POST[ 'user_email' ] : '';\n\t\t\t/**\n\t\t\t * Fires when the site sign-up form is sent.\n\t\t\t *\n\t\t\t * @since 3.0.0\n\t\t\t */\n\t\t\tdo_action( 'preprocess_signup_form' );\n\t\t\tif ( is_user_logged_in() && ( $active_signup == 'all' || $active_signup == 'blog' ) )\n\t\t\t\tsignup_another_blog($newblogname);\n\t\t\telseif ( ! is_user_logged_in() && ( $active_signup == 'all' || $active_signup == 'user' ) )\n\t\t\t\tsignup_user( $newblogname, $user_email );\n\t\t\telseif ( ! is_user_logged_in() && ( $active_signup == 'blog' ) )\n\t\t\t\t_e( 'Sorry, new registrations are not allowed at this time.' );\n\t\t\telse\n\t\t\t\t_e( 'You are logged in already. No need to register again!' );\n\n\t\t\tif ( $newblogname ) {\n\t\t\t\t$newblog = get_blogaddress_by_name( $newblogname );\n\n\t\t\t\tif ( $active_signup == 'blog' || $active_signup == 'all' )\n\t\t\t\t\t/* translators: %s: site address */\n\t\t\t\t\tprintf( '<p><em>' . __( 'The site you were looking for, %s, does not exist, but you can create it now!' ) . '</em></p>',\n\t\t\t\t\t\t'<strong>' . $newblog . '</strong>'\n\t\t\t\t\t);\n\t\t\t\telse\n\t\t\t\t\t/* translators: %s: site address */\n\t\t\t\t\tprintf( '<p><em>' . __( 'The site you were looking for, %s, does not exist.' ) . '</em></p>',\n\t\t\t\t\t\t'<strong>' . $newblog . '</strong>'\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n?>\n</div>\n</div>\n<?php\n/**\n * Fires after the sign-up forms, before wp_footer.\n *\n * @since 3.0.0\n */\ndo_action( 'after_signup_form' ); ?>\n\n<?php get_footer( 'wp-signup' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/wp-trackback.php",
    "content": "<?php\n/**\n * Handle Trackbacks and Pingbacks Sent to WordPress\n *\n * @since 0.71\n *\n * @package WordPress\n * @subpackage Trackbacks\n */\n\nif (empty($wp)) {\n\trequire_once( dirname( __FILE__ ) . '/wp-load.php' );\n\twp( array( 'tb' => '1' ) );\n}\n\n/**\n * Response to a trackback.\n *\n * Responds with an error or success XML message.\n *\n * @since 0.71\n *\n * @param mixed  $error         Whether there was an error.\n *                              Default '0'. Accepts '0' or '1', true or false.\n * @param string $error_message Error message if an error occurred.\n */\nfunction trackback_response($error = 0, $error_message = '') {\n\theader('Content-Type: text/xml; charset=' . get_option('blog_charset') );\n\tif ($error) {\n\t\techo '<?xml version=\"1.0\" encoding=\"utf-8\"?'.\">\\n\";\n\t\techo \"<response>\\n\";\n\t\techo \"<error>1</error>\\n\";\n\t\techo \"<message>$error_message</message>\\n\";\n\t\techo \"</response>\";\n\t\tdie();\n\t} else {\n\t\techo '<?xml version=\"1.0\" encoding=\"utf-8\"?'.\">\\n\";\n\t\techo \"<response>\\n\";\n\t\techo \"<error>0</error>\\n\";\n\t\techo \"</response>\";\n\t}\n}\n\n// Trackback is done by a POST.\n$request_array = 'HTTP_POST_VARS';\n\nif ( !isset($_GET['tb_id']) || !$_GET['tb_id'] ) {\n\t$tb_id = explode('/', $_SERVER['REQUEST_URI']);\n\t$tb_id = intval( $tb_id[ count($tb_id) - 1 ] );\n}\n\n$tb_url  = isset($_POST['url'])     ? $_POST['url']     : '';\n$charset = isset($_POST['charset']) ? $_POST['charset'] : '';\n\n// These three are stripslashed here so they can be properly escaped after mb_convert_encoding().\n$title     = isset($_POST['title'])     ? wp_unslash($_POST['title'])      : '';\n$excerpt   = isset($_POST['excerpt'])   ? wp_unslash($_POST['excerpt'])    : '';\n$blog_name = isset($_POST['blog_name']) ? wp_unslash($_POST['blog_name'])  : '';\n\nif ($charset)\n\t$charset = str_replace( array(',', ' '), '', strtoupper( trim($charset) ) );\nelse\n\t$charset = 'ASCII, UTF-8, ISO-8859-1, JIS, EUC-JP, SJIS';\n\n// No valid uses for UTF-7.\nif ( false !== strpos($charset, 'UTF-7') )\n\tdie;\n\n// For international trackbacks.\nif ( function_exists('mb_convert_encoding') ) {\n\t$title     = mb_convert_encoding($title, get_option('blog_charset'), $charset);\n\t$excerpt   = mb_convert_encoding($excerpt, get_option('blog_charset'), $charset);\n\t$blog_name = mb_convert_encoding($blog_name, get_option('blog_charset'), $charset);\n}\n\n// Now that mb_convert_encoding() has been given a swing, we need to escape these three.\n$title     = wp_slash($title);\n$excerpt   = wp_slash($excerpt);\n$blog_name = wp_slash($blog_name);\n\nif ( is_single() || is_page() )\n\t$tb_id = $posts[0]->ID;\n\nif ( !isset($tb_id) || !intval( $tb_id ) )\n\ttrackback_response(1, 'I really need an ID for this to work.');\n\nif (empty($title) && empty($tb_url) && empty($blog_name)) {\n\t// If it doesn't look like a trackback at all.\n\twp_redirect(get_permalink($tb_id));\n\texit;\n}\n\nif ( !empty($tb_url) && !empty($title) ) {\n\theader('Content-Type: text/xml; charset=' . get_option('blog_charset') );\n\n\tif ( !pings_open($tb_id) )\n\t\ttrackback_response(1, 'Sorry, trackbacks are closed for this item.');\n\n\t$title =  wp_html_excerpt( $title, 250, '&#8230;' );\n\t$excerpt = wp_html_excerpt( $excerpt, 252, '&#8230;' );\n\n\t$comment_post_ID = (int) $tb_id;\n\t$comment_author = $blog_name;\n\t$comment_author_email = '';\n\t$comment_author_url = $tb_url;\n\t$comment_content = \"<strong>$title</strong>\\n\\n$excerpt\";\n\t$comment_type = 'trackback';\n\n\t$dupe = $wpdb->get_results( $wpdb->prepare(\"SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s\", $comment_post_ID, $comment_author_url) );\n\tif ( $dupe )\n\t\ttrackback_response(1, 'We already have a ping from that URL for this post.');\n\n\t$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type');\n\n\twp_new_comment($commentdata);\n\t$trackback_id = $wpdb->insert_id;\n\n\t/**\n\t * Fires after a trackback is added to a post.\n\t *\n\t * @since 1.2.0\n\t *\n\t * @param int $trackback_id Trackback ID.\n\t */\n\tdo_action( 'trackback_post', $trackback_id );\n\ttrackback_response( 0 );\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/html/xmlrpc.php",
    "content": "<?php\n/**\n * XML-RPC protocol support for WordPress\n *\n * @package WordPress\n */\n\n/**\n * Whether this is an XML-RPC Request\n *\n * @var bool\n */\ndefine('XMLRPC_REQUEST', true);\n\n// Some browser-embedded clients send cookies. We don't want them.\n$_COOKIE = array();\n\n// A bug in PHP < 5.2.2 makes $HTTP_RAW_POST_DATA not set by default,\n// but we can do it ourself.\nif ( !isset( $HTTP_RAW_POST_DATA ) ) {\n\t$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );\n}\n\n// fix for mozBlog and other cases where '<?xml' isn't on the very first line\nif ( isset($HTTP_RAW_POST_DATA) )\n\t$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);\n\n/** Include the bootstrap for setting up WordPress environment */\ninclude( dirname( __FILE__ ) . '/wp-load.php' );\n\nif ( isset( $_GET['rsd'] ) ) { // http://cyber.law.harvard.edu/blogs/gems/tech/rsd.html\nheader('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);\n?>\n<?php echo '<?xml version=\"1.0\" encoding=\"'.get_option('blog_charset').'\"?'.'>'; ?>\n<rsd version=\"1.0\" xmlns=\"http://archipelago.phrasewise.com/rsd\">\n  <service>\n    <engineName>WordPress</engineName>\n    <engineLink>https://wordpress.org/</engineLink>\n    <homePageLink><?php bloginfo_rss('url') ?></homePageLink>\n    <apis>\n      <api name=\"WordPress\" blogID=\"1\" preferred=\"true\" apiLink=\"<?php echo site_url('xmlrpc.php', 'rpc') ?>\" />\n      <api name=\"Movable Type\" blogID=\"1\" preferred=\"false\" apiLink=\"<?php echo site_url('xmlrpc.php', 'rpc') ?>\" />\n      <api name=\"MetaWeblog\" blogID=\"1\" preferred=\"false\" apiLink=\"<?php echo site_url('xmlrpc.php', 'rpc') ?>\" />\n      <api name=\"Blogger\" blogID=\"1\" preferred=\"false\" apiLink=\"<?php echo site_url('xmlrpc.php', 'rpc') ?>\" />\n      <?php\n      /**\n       * Add additional APIs to the Really Simple Discovery (RSD) endpoint.\n       *\n       * @link http://cyber.law.harvard.edu/blogs/gems/tech/rsd.html\n\t   *\n       * @since 3.5.0\n       */\n      do_action( 'xmlrpc_rsd_apis' );\n      ?>\n    </apis>\n  </service>\n</rsd>\n<?php\nexit;\n}\n\ninclude_once(ABSPATH . 'wp-admin/includes/admin.php');\ninclude_once(ABSPATH . WPINC . '/class-IXR.php');\ninclude_once(ABSPATH . WPINC . '/class-wp-xmlrpc-server.php');\n\n/**\n * Posts submitted via the XML-RPC interface get that title\n * @name post_default_title\n * @var string\n */\n$post_default_title = \"\";\n\n/**\n * Filter the class used for handling XML-RPC requests.\n *\n * @since 3.1.0\n *\n * @param string $class The name of the XML-RPC server class.\n */\n$wp_xmlrpc_server_class = apply_filters( 'wp_xmlrpc_server_class', 'wp_xmlrpc_server' );\n$wp_xmlrpc_server = new $wp_xmlrpc_server_class;\n\n// Fire off the request\n$wp_xmlrpc_server->serve_request();\n\nexit;\n\n/**\n * logIO() - Writes logging info to a file.\n *\n * @deprecated 3.4.0 Use error_log()\n * @see error_log()\n *\n * @param string $io Whether input or output\n * @param string $msg Information describing logging reason.\n */\nfunction logIO( $io, $msg ) {\n\t_deprecated_function( __FUNCTION__, '3.4', 'error_log()' );\n\tif ( ! empty( $GLOBALS['xmlrpc_logging'] ) )\n\t\terror_log( $io . ' - ' . $msg );\n}"
  },
  {
    "path": "Docker/security/apparmor/wordpress/php.ini",
    "content": "opcache.memory_consumption=128\nopcache.interned_strings_buffer=8\nopcache.max_accelerated_files=4000\nopcache.revalidate_freq=60\nopcache.fast_shutdown=1\nopcache.enable_cli=1\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/wparmor",
    "content": "\n\n#include <tunables/global>\n\n\nprofile wparmor flags=(attach_disconnected,mediate_deleted) {\n\n  #include <abstractions/base>\n\n\n  network,\n  capability,\n  file,\n\n  deny @{PROC}/* w,   # deny write for all files directly in /proc (not in a subdir)\n  # deny write to files not in /proc/<number>/** or /proc/sys/**\n  deny @{PROC}/{[^1-9],[^1-9][^0-9],[^1-9s][^0-9y][^0-9s],[^1-9][^0-9][^0-9][^0-9]*}/** w,\n  deny @{PROC}/sys/[^k]** w,  # deny /proc/sys except /proc/sys/k* (effectively /proc/sys/kernel)\n  deny @{PROC}/sys/kernel/{?,??,[^s][^h][^m]**} w,  # deny everything except shm* in /proc/sys/kernel/\n  deny @{PROC}/sysrq-trigger rwklx,\n  deny @{PROC}/mem rwklx,\n  deny @{PROC}/kmem rwklx,\n  deny @{PROC}/kcore rwklx,\n\n  deny mount,\n  deny umount,\n\n  deny /sys/[^f]*/** wklx,\n  deny /sys/f[^s]*/** wklx,\n  deny /sys/fs/[^c]*/** wklx,\n  deny /sys/fs/c[^g]*/** wklx,\n  deny /sys/fs/cg[^r]*/** wklx,\n  deny /sys/firmware/efi/efivars/** rwklx,\n  deny /sys/kernel/security/** rwklx,\n\n  deny /var/www/html/* wlx,\n  deny /var/www/html/wp-admin/** wlx,\n  deny /var/www/html/wp-includes/** wlx,\n  deny /var/www/html/wp-content/* wlx,\n  # ***YOUR WORK HERE***\n  # Add additional rules to deny writing/executing every /var/www/html/wp-content directory except uploads\n  # You can test your work by spinning up the wordpress docker-compose instance,\n  # but you'll need to ensure you include the wparmor security option in the compose file as well\n\n  # suppress ptrace denials when using 'docker ps' or using 'ps' inside a container\n  ptrace (trace,read) peer=docker-default,\n\n\n  # docker daemon confinement requires explict allow rule for signal\n  signal (receive) set=(kill,term) peer=/usr/bin/docker,\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n                            NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    {description}\n    Copyright (C) {year}  {fullname}\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  {signature of Ty Coon}, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/archive.php",
    "content": "<?php\n/**\n * The template for displaying archive pages.\n *\n * Learn more: http://codex.wordpress.org/Template_Hierarchy\n *\n * @package zues\n */\n\n remove_action( 'zues_loop', 'zues_content', 20 );\n add_action( 'zues_loop', 'zues_content_excerpt', 20 );\n\n zues();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/assets/js/customizer.js",
    "content": "/**\n * Theme Customizer enhancements for a better user experience.\n *\n * Contains handlers to make Theme Customizer preview reload changes asynchronously.\n *\n * @package zues\n */\n\n( function( $ ) {\n\n\t// Site title and description.\n\twp.customize(\n\t\t'blogname', function( value ) {\n\t\t\tvalue.bind(\n\t\t\t\tfunction( to ) {\n\t\t\t\t\t$( '.site-title a' ).text( to );\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t);\n\n\twp.customize(\n\t\t'blogdescription', function( value ) {\n\t\t\tvalue.bind(\n\t\t\t\tfunction( to ) {\n\t\t\t\t\t$( '.site-description' ).text( to );\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t);\n\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/assets/js/scripts.js",
    "content": "/**\n * Javascript code should be placed here, then enqueued using wp_enqueue_script();\n *\n * @package zues\n */\n//\n// jQuery(function(){\n// \tjQuery( '.primary-navigation .menu' ).slicknav({\n// \t\tprependTo:'.site-navigation-outer'\n// \t});\n// });\n\njQuery(document).ready(function() {\n\n\tjQuery('.menu-primary .menu').superfish({\n\t\tdelay:       200,                            // one second delay on mouseout\n\t\tcssArrows:  false                            // disable generation of arrow mark-up\n\t});\n\n\tjQuery('.menu-primary ul.menu, .menu-primary .menu ul').tinyNav({\n\t\tactive: 'current-menu-item',\n\t\theader: '- Navigation -', // String: Specify text for \"header\" and show header instead of the active item\n\t});\n\n});\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/comments.php",
    "content": "<?php\n/**\n * The template for displaying comments.\n *\n * The area of the page that contains both current comments\n * and the comment form.\n *\n * @package zues\n */\n\n/*\n * If the current post is protected by a password and\n * the visitor has not yet entered the password we will\n * return early without loading the comments.\n */\nif ( post_password_required() ) {\n\treturn;\n}\n?>\n\n<section id=\"comments\" class=\"comments-area\">\n\n    <?php if ( have_comments() ) : ?>\n\t\t<h3 class=\"comments-title\">\n    <?php\n\t\t\t\tprintf(\n\t\t\t\t\t// WPCS: XSS OK.\n\t\t\t\t\tesc_html( _nx( 'One comment on &ldquo;%2$s&rdquo;', '%1$s comments on &ldquo;%2$s&rdquo;', get_comments_number(), 'comments title', 'zues' ) ),\n\t\t\t\t\tnumber_format_i18n( get_comments_number() ),\n\t\t\t\t\t'<span>' . get_the_title() . '</span>'\n\t\t\t\t);\n\t?>\n\t\t</h3>\n\n\t\t<ol class=\"comment-list\">\n   \t\t\t<?php wp_list_comments( 'callback=zues_comment' ); ?>\n\t\t</ol><!-- .comment-list -->\n\n\t\t<?php zues_comments_nav(); ?>\n\n    <?php\n\t// If comments are closed and there are comments, let's leave a little note, shall we?\n\tif ( ! comments_open() && '0' !== get_comments_number() && post_type_supports( get_post_type(), 'comments' ) ) : ?>\n\t    \t<p class=\"no-comments\"><?php esc_html_e( 'Comments are closed.', 'zues' ); ?></p>\n\t    <?php endif; ?>\n\n    <?php endif; ?>\n\n    <?php comment_form(); ?>\n\n</section><!-- #comments -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/functions.php",
    "content": "<?php\n/**\n * Zues functions and definitions\n *\n * @package zues\n */\n\n/**\n * Load zues framework.\n */\nrequire_once( get_template_directory() . '/zues-framework/init.php' );\n\nif ( ! function_exists( 'zues_setup' ) ) {\n\t/**\n\t * Sets up theme defaults and registers support for various WordPress features.\n\t *\n\t * Note that this function is hooked into the after_setup_theme hook, which\n\t * runs before the init hook. The init hook is too late for some features, such\n\t * as indicating support for post thumbnails.\n\t */\n\tfunction zues_setup() {\n\t\t/*\n         * Make theme available for translation.\n         * Translations can be filed in the /languages/ directory.\n         * If you're building a theme based on Core, use a find and replace\n         * to change 'zues' to the name of your theme in all the template files\n        */\n\t\tload_theme_textdomain( 'zues', get_template_directory() . '/languages' );\n\n\t\t// Add default posts and comments RSS feed links to head.\n\t\tadd_theme_support( 'automatic-feed-links' );\n\n\t\t/*\n         * Let WordPress manage the document title.\n         * By adding theme support, we declare that this theme does not use a\n         * hard-coded <title> tag in the document head, and expect WordPress to\n         * provide it for us.\n        */\n\t\tadd_theme_support( 'title-tag' );\n\t\tadd_theme_support( 'custom-header' );\n\n\t\t/*\n         * Enable support for Post Thumbnails on posts and pages.\n         *\n         * @link http://codex.wordpress.org/Function_Reference/add_theme_support#Post_Thumbnails\n        */\n\t\tadd_theme_support( 'post-thumbnails' );\n\n\t\tadd_image_size( 'zues-blog-post', 700, 9999 );\n\n\t\t// This theme uses wp_nav_menu() in one location.\n\t\tregister_nav_menus(\n\t\t\tarray(\n\t\t\t'primary' => esc_html__( 'Primary Menu', 'zues' ),\n\t\t\t)\n\t\t);\n\n\t\t/*\n         * Switch default core markup for search form, comment form, and comments\n         * to output valid HTML5.\n        */\n\t\tadd_theme_support(\n\t\t\t'html5', array(\n\t\t\t'search-form',\n\t\t\t'comment-form',\n\t\t\t'comment-list',\n\t\t\t'gallery',\n\t\t\t'caption',\n\t\t\t)\n\t\t);\n\n\t\t// Set up the WordPress core custom background feature.\n\t\tadd_theme_support(\n\t\t\t'custom-background', apply_filters(\n\t\t\t\t'zues_custom_background_args', array(\n\t\t\t\t'default-color' => 'E9E9E9',\n\t\t\t\t'default-image' => '',\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t}\n}\nadd_action( 'after_setup_theme', 'zues_setup' );\n\nif ( ! function_exists( 'zues_content_width' ) ) {\n\t/**\n\t * Set the content width in pixels, based on the theme's design and stylesheet.\n\t *\n\t * Priority 0 to make it available to lower priority callbacks.\n\t *\n\t * @global int $content_width\n\t */\n\tfunction zues_content_width() {\n\t\t$GLOBALS['content_width'] = apply_filters( 'zues_content_width', 700 );\n\t}\n\tadd_action( 'after_setup_theme', 'zues_content_width', 0 );\n}\n\n/**\n * Register the widget areas this theme supports\n */\nfunction zues_register_sidebars() {\n\n\tzues_register_widget_area(\n\t\tarray(\n\t\t'id'          => 'sidebar-primary',\n\t\t'name'        => __( 'Primary Sidebar', 'zues' ),\n\t\t'description' => __( 'Widgets added here are shown in the sidebar next to your content.', 'zues' ),\n\t\t)\n\t);\n\n\tzues_register_widget_area(\n\t\tarray(\n\t\t'id'          => 'footer-1',\n\t\t'name'        => __( 'Footer One', 'zues' ),\n\t\t'description' => __( 'The footer is divided into four widget areas, each spanning 25% of the layout\\'s width.', 'zues' ),\n\t\t)\n\t);\n\n\tzues_register_widget_area(\n\t\tarray(\n\t\t'id'          => 'footer-2',\n\t\t'name'        => __( 'Footer Two', 'zues' ),\n\t\t'description' => __( 'The footer is divided into four widget areas, each spanning 25% of the layout\\'s width.', 'zues' ),\n\t\t)\n\t);\n\n\tzues_register_widget_area(\n\t\tarray(\n\t\t'id'          => 'footer-3',\n\t\t'name'        => __( 'Footer Three', 'zues' ),\n\t\t'description' => __( 'The footer is divided into four widget areas, each spanning 25% of the layout\\'s width.', 'zues' ),\n\t\t)\n\t);\n\n\tzues_register_widget_area(\n\t\tarray(\n\t\t'id'          => 'footer-4',\n\t\t'name'        => __( 'Footer Four', 'zues' ),\n\t\t'description' => __( 'The footer is divided into four widget areas, each spanning 25% of the layout\\'s width.', 'zues' ),\n\t\t)\n\t);\n\n}\n\nadd_action( 'widgets_init', 'zues_register_sidebars', 5 );\n\n/**\n * Enqueue scripts and styles.\n */\nfunction zues_scripts() {\n\twp_enqueue_style( 'ot-zues-style', get_stylesheet_uri() );\n\n\twp_enqueue_script( 'zues-scripts', ZUES_THEME_URI . '/assets/js/scripts.js', array(), '', true );\n\n\tif ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {\n\t\twp_enqueue_script( 'comment-reply' );\n\t}\n}\nadd_action( 'wp_enqueue_scripts', 'zues_scripts' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/index.php",
    "content": "<?php\n/**\n * The main template file.\n *\n * This is the most generic template file in a WordPress theme\n * and one of the two required files for a theme (the other being style.css).\n * It is used to display a page when nothing more specific matches a query.\n * E.g., it puts together the home page when no home.php file exists.\n * Learn more: http://codex.wordpress.org/Template_Hierarchy\n *\n * @package zues\n */\n\nzues();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/page-templates/full-width.php",
    "content": "<?php\n/**\n * Template Name: Full Width Template\n *\n * The template for displaying a full width page.\n *\n * @package zues\n */\n\nzues();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/readme.txt",
    "content": "=== Zues ===\n\nContributors: dannycooper\nTags: light, white, one-column, two-columns, responsive-layout, featured-images, full-width-template, rtl-language-support, threaded-comments, custom-menu, custom-header, custom-background\n\nVersion: 1.0.6\nRequires at least: 4.0\nTested up to: 4.4.2\nStable tag: 1.0.5\nLicense: GPLv2 or later\nLicense URI: http://www.gnu.org/licenses/gpl-2.0.html\n\n== Description ==\n\nZues is a minimal WordPress theme that can be used as a standalone theme, or as a framework to build something even better.\n\n== Installation ==\n\n1. In your admin panel, go to Appearance > Themes and click the Add New button.\n2. Click Upload and Choose File, then select the theme's .zip file. Click Install Now.\n3. Click Activate to use your new theme right away.\n\n== Frequently Asked Questions ==\n\n= Does this theme support any plugins? =\n\nZues includes support for Infinite Scroll in Jetpack.\n\nZues has been tested with the following plugins:\n\n* Contact Form 7\n\n== Changelog ==\n\n= 1.0.6 - March 8, 2016 =\n* ADDED: attr.php attribution\n* REMOVE: favicon.ico\n* REMOVE: add_editor_style()\n\n= 1.0.5 - February 27, 2016 =\n* FIX: Repeating pagination on archive pages\n\n= 1.0.4 - February 26, 2016 =\n* ADDED: Lightweight responsive Navigation\n* ADDED: Credits to readme.txt\n* FIX: placement of wp_head()\n* FIX: prefix constants in zues-framework/init.php\n* REMOVE: empty functions.php\n* REMOVE: unused customizer folder\n* REMOVE: hard-coded favicon\n\n= 1.0.3 - February 1, 2016 =\n* ADDED: Conditional loading of libraries\n* REMOVE: Invalid CSS\n* REMOVE: Undefined function calls\n* FIX: select elements max-width: 100%\n* FIX: Inconsistent wp_nav_menu display\n* FIX: Call if( have_posts() ) before while( have_posts() )\n* FIX: Typo in comments.php </section>\n* FIX: Incorrectly echoing search string in search-header.php\n\n= 1.0.1 - January 28, 2016 =\n* Fixed 'zies' text domain\n* Added initial documentation to hooks/filters\n* Fixed screenshot size (1200px x 900px)\n\n= 1.0 - November 1, 2015 =\n* Initial release\n\n== Credits ==\n\nZues WordPress Theme bundles the following third-party resources:\n\n* normalize.css, (C) 2012-2016 Nicolas Gallagher and Jonathan Neal, [MIT](http://opensource.org/licenses/MIT)\n * Source: http://necolas.github.io/normalize.css/\n\n* superfish.js , (C) 2013 jQuery Foundation and other contributors, [MIT](http://opensource.org/licenses/MIT)\n * Source: http://users.tpg.com.au/j_birch/plugins/superfish/\n\n* jquery.tinyNav.js, (C) 2011-2014 Viljami Salminen, [MIT](http://opensource.org/licenses/MIT)\n * Source: http://tinynav.viljamis.com/\n\n* FontAwesome, (C) Dave Gandy, [SIL OFL 1.1, MIT](http://fontawesome.io/license/)\n * Source: http://fontawesome.io/\n\n* Customizer_Library, (C) Devin Price, [GPL-2](http://opensource.org/licenses/gpl-2.0.php)\n * Source: https://github.com/devinsays/customizer-library\n\n* TGM-Plugin-Activation, (C) 2011 Thomas Griffin, [GPL-2](http://opensource.org/licenses/gpl-2.0.php)\n * Source: https://github.com/TGMPA/TGM-Plugin-Activation\n\n * Hybrid Core - functions-attr.php, (C) 2008-2015 Justin Tadlock, [GPL-2](http://opensource.org/licenses/gpl-2.0.php)\n  * Source: https://github.com/justintadlock/hybrid-core/blob/3.0/inc/functions-attr.php\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/rtl.css",
    "content": "/*\nTheme Name: Zues\n\nAdding support for language written in a Right To Left (RTL) direction is easy -\nit's just a matter of overwriting all the horizontal positioning attributes\nof your CSS stylesheet in a separate stylesheet file named rtl.css.\n\nhttp://codex.wordpress.org/Right_to_Left_Language_Support\n\n*/\n\nbody {\n\tdirection: rtl;\n\tunicode-bidi: embed;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/search.php",
    "content": "<?php\n/**\n * The template for displaying search results pages.\n *\n * @package zues\n */\n\n remove_action( 'zues_loop', 'zues_content', 20 );\n add_action( 'zues_loop', 'zues_content_excerpt', 20 );\n\n zues();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/singular.php",
    "content": "<?php\n/**\n * The template for displaying a single page/post.\n *\n * See /core/structure/post.php and /core/structure/hooks.php\n *\n * @package zues\n */\n\nzues();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/style.css",
    "content": "/*\nTheme Name: Zues\nTheme URI: https://olympusthemes.com/zues\nAuthor: Danny Cooper\nAuthor URI: http://dannycooper.com\nDescription: A simple, minimalist theme. Zues provides a perfect base for child themes to be built upon.\nVersion: 1.0.6\nLicense: GNU General Public License v2 or later\nLicense URI: http://www.gnu.org/licenses/gpl-2.0.html\nText Domain: zues\n\nTags: light, white, one-column, two-columns, responsive-layout, featured-images, full-width-template, rtl-language-support, threaded-comments, custom-menu, custom-header, custom-background\n\nZues WordPress Theme, Copyright 2016 Danny Cooper\nThis theme, like WordPress, is licensed under the GPL.\n*/\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/template-parts/footers/footer-example.php",
    "content": "<?php\n/**\n * Footer Name: Example\n *\n * An example footer for our theme.\n *\n * @package zues\n */\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/template-parts/headers/header-example.php",
    "content": "<?php\n/**\n * Header Name: Example\n *\n * An example header for our theme.\n *\n * @package zues\n */\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/template-parts/sidebars/sidebar.php",
    "content": "<?php\n/**\n * The sidebar containing the main widget area.\n *\n * @package zues\n */\n\nif ( ! is_active_sidebar( 'sidebar-primary' ) ) {\n\treturn;\n}\n\nzues_sidebar_primary();\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/assets/css/base.css",
    "content": "/*--------------------------------------------------------------\n>>> TABLE OF CONTENTS:\n----------------------------------------------------------------\n# Typography\n# Elements\n# Forms\n# Layout\n# Header\n# Navigation\n    ## Menus\n    ## Content Navigation\n# Content\n    ## Posts and pages\n    ## Asides\n    ## Comments\n# Sidebar\n# Footer\n# Accessibility\n# Alignments\n# Clearings\n# Infinite scroll\n# Media\n    ## Captions\n    ## Galleries\n--------------------------------------------------------------*/\n\n/*--------------------------------------------------------------\n# Typography\n--------------------------------------------------------------*/\n\nbody,\nbutton,\ninput,\nselect,\ntextarea {\n    font-family: Georgia, Times, 'Times New Roman', serif;\n    font-size: 16px;\n    font-size: 100%;\n    line-height: 1.8;\n    word-wrap: break-word;\n    color: #404040;\n    text-rendering: optimizeLegibility;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n    clear: both;\n    margin-top: 0;\n    color: #373737;\n}\n\np {\n    margin: 0 0 1.5rem;\n}\n\ndfn,\ncite,\nem,\ni {\n    font-style: italic;\n}\n\nblockquote {\n    font-style: italic;\n    margin: 0 0 1.5rem;\n    padding: 0 0 0 1.5rem;\n    border-left: 2px solid #286185;\n}\n\naddress {\n    margin: 0 0 1.5rem;\n}\n\npre {\n    font-family: 'Courier 10 Pitch', Courier, monospace;\n    font-size: 15px;\n    font-size: .9375rem;\n    line-height: 1.6;\n    overflow: auto;\n    max-width: 100%;\n    margin-bottom: 1.6em;\n    padding: 1.6em;\n    background: #eeeeee;\n}\n\ncode,\nkbd,\ntt,\nvar {\n    font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace;\n    padding: 8px;\n    padding: .5rem;\n}\n\nabbr,\nacronym {\n    cursor: help;\n    border-bottom: 1px dotted #666666;\n}\n\nmark,\nins {\n    text-decoration: none;\n    background: #fff9c0;\n}\n\nbig {\n    font-size: 125%;\n}\n\n/*--------------------------------------------------------------\n## Hyperlinks\n--------------------------------------------------------------*/\n\na {\n    color: #176997;\n}\n\na:hover,\na:focus,\na:active {\n    color: #176997;\n}\n\na:focus {\n    outline: thin dotted;\n}\n\n\n/*--------------------------------------------------------------\n# Elements\n--------------------------------------------------------------*/\n\nhtml {\n    box-sizing: border-box;\n}\n\n*,\n*:before,\n*:after {\n    /* Inherit box-sizing to make it easier to change the property for components that leverage other behavior; see http://css-tricks.com/inheriting-box-sizing-probably-slightly-better-best-practice/ */\n    box-sizing: inherit;\n}\n\nbody {\n    background: #ffffff; /* Fallback for when there is no custom background color defined. */\n}\n\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n    content: '';\n}\n\nblockquote,\nq {\n    quotes: '' '';\n}\n\nhr {\n    margin: 0;\n    border: 0;\n    border-top: 1px solid #dbdbdc;\n}\n\nul,\nol {\n    margin: 0 0 24px;\n    margin: 0 0 1.5rem;\n}\n\n\nul {\n    margin: 0 0 1.5rem 1.5rem;\n    padding: 0;\n    list-style: disc;\n}\n\nul li {\n    margin-bottom: 1rem;\n}\n\nol {\n    list-style: decimal;\n}\n\nli > ul,\nli > ol {\n    margin-bottom: 0;\n    margin-left: 24px;\n    margin-left: 1.5rem;\n}\n\ndt {\n    font-weight: bold;\n}\n\ndd {\n    margin: 0 24px 24px;\n    margin: 0 1.5rem 1.5rem;\n}\n\nimg {\n    max-width: 100%; /* Adhere to container width. */\n    height: auto; /* Make sure images are scaled correctly. */\n    vertical-align: bottom; /* Removes affect of line-height. */\n}\n\n\n\n.submit,\n.wpcf7-submit {\n    font-size: 14px;\n    font-size: .875rem;\n    padding: .5rem 1rem;\n    background: none;\n}\n\n.admin-bar .cats-tags-links {\n    max-width: 80%;\n}\n\n/*--------------------------------------------------------------\n# Forms\n--------------------------------------------------------------*/\n\nlabel {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n\ninput,\ntextarea {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n    max-width: 100%;\n    padding: 8px 16px;\n    padding: .5rem 1rem;\n    border: 1px solid #dbdbdb;\n    border-radius: 3px;\n    background: white;\n}\n\ninput[type='submit']:hover {\n    background: #f1f1f1;\n}\n\nselect {\n    max-width: 100%;\n}\n\n/*--------------------------------------------------------------\n# Layout\n--------------------------------------------------------------*/\n\n.wrap {\n    max-width: 1040px;\n    margin: 0 auto;\n}\n\n.content {\n    width: 700px;\n    margin-right: 50px;\n    float: left;\n}\n\n.primary-sidebar {\n    width: 290px;\n    float: right;\n}\n\n/*--------------------------------------------------------------\n# Header\n--------------------------------------------------------------*/\n\n.site-header {\n    background: #ffffff;\n}\n\n.site-header {\n    padding: 50px 0;\n    padding: 3.125rem 0;\n}\n\n.site-title {\n    font-size: 24px;\n    font-size: 1.5rem;\n    margin: 0;\n}\n\n.site-title a {\n    text-decoration: none;\n    color: #404040;\n}\n\n.site-description {\n    font-size: 14px;\n    font-size: .875rem;\n    margin: 0;\n    color: #5a5a5a;\n}\n\n.has-logo .site-title {\n    display: none;\n}\n\n/*--------------------------------------------------------------\n# Navigation\n--------------------------------------------------------------*/\n\n.nav {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n}\n\n.menu-primary .menu {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n    font-size: 14px;\n    font-size: .875rem;\n    border-top: 1px solid #dbdbdb;\n    border-bottom: 1px solid #dbdbdb;\n}\n\n.menu-primary ul {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n}\n\n.menu-primary ul {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n}\n\n.menu-primary ul li {\n    position: relative;\n}\n\n.menu-primary ul ul {\n    position: absolute;\n    z-index: 99;\n    top: 100%;\n    left: 0;\n    display: none;\n    min-width: 12em; /* allow long menu items to determine submenu width */\n    box-shadow: 2px 2px 6px rgba(0,0,0,.2);\n}\n\n.menu-primary ul > li {\n    -webkit-transition: background .2s;\n            transition: background .2s;\n    white-space: nowrap; /* no need for Supersubs plugin */\n}\n\n.menu-primary ul li:hover > ul,\n.menu-primary ul li.sfHover > ul {\n    display: block;\n}\n\n.menu-primary ul a {\n    position: relative;\n    display: block;\n}\n\n.menu-primary ul ul ul {\n    top: 0;\n    left: 100%;\n}\n\n.menu-primary .menu li {\n    display: inline-block;\n    margin: 0;\n    list-style: none;\n}\n\n.menu-primary .menu li a {\n    display: block;\n    padding: 16px;\n    padding: 1rem;\n    transition: all linear .15s;\n    text-decoration: none;\n    color: #717171;\n}\n\n.menu-primary ul li:first-child {\n    margin-left: -16px;\n    margin-left: -1rem;\n}\n\n.menu-primary ul li ul li:first-child {\n    margin-left: 0;\n}\n\n.menu-primary .menu li:hover > a,\n.menu-primary .menu .current-item > a {\n    text-decoration: none;\n}\n\n/*----- Top Level -----*/\n\n.menu-primary .menu > li {\n    position: relative;\n    display: inline-block;\n}\n\n.menu-primary .menu > li:hover > a,\n.menu-primary .menu > .current-item > a {\n    color: #a5a5a5;\n}\n\n/*----- Bottom Level -----*/\n\n.menu-primary .sub-menu,\n.menu-primary .children {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n    background: #404040;\n    box-shadow: 0 2px 3px rgba(0, 0, 0, .2);\n}\n\n.menu-primary .children ul {\n    border-top: 0;\n    background: #6b6b6b;\n}\n\n.menu-primary .sub-menu li,\n.menu-primary .children li {\n    display: block;\n}\n\n.menu-primary .sub-menu li a,\n.menu-primary .children li a {\n    display: block;\n    color: white;\n    border-top: 1px solid #585858;\n}\n\n.menu-primary .sub-menu li a:hover,\n.menu-primary .sub-menu .current-item a,\n.menu-primary .children li a:hover,\n.menu-primary .children .current-item a {\n    background: black;\n}\n\n.menu-primary-inner ul ul ul {\n    position: absolute;\n    top: 0;\n    left: 100%;\n}\n\n/*----- Responsive Navigation -----*/\n\n.tinynav {\n    display: none;\n}\n\n/*--------------------------------------------------------------\n## Content Navigation\n--------------------------------------------------------------*/\n\n.nav-links {\n    font-size: 14px;\n    font-size: .875rem;\n    font-weight: bold;\n}\n\n.nav-links .meta-nav {\n    color: #717171;\n}\n\n.nav-links a {\n    font-weight: normal;\n    display: block;\n    padding-top: 4px;\n    padding-top: .25rem;\n    text-decoration: none;\n}\n\n.posts-navigation .nav-previous {\n    float: left;\n}\n\n\n.posts-navigation .nav-next {\n    float: right;\n}\n\n/*--------------------------------------------------------------\n# Content\n--------------------------------------------------------------*/\n\n.site-content {\n    margin-top: 50px;\n    margin-top: 3.125rem;\n}\n\narticle.post,\narticle.page {\n    margin-bottom: 50px;\n    margin-bottom: 3.125rem;\n}\n\n.page-template-full-width .content {\n    width: 100%;\n    margin: 0;\n}\n\n\n/*--------------------------------------------------------------\n## Posts and pages\n--------------------------------------------------------------*/\n\n.sticky {\n    display: block;\n}\n\n.single .byline,\n.group-blog .byline {\n    display: inline;\n}\n\n.page-links {\n    clear: both;\n    margin: 0 0 24px;\n    margin: 0 0 1.5rem;\n}\n\n.entry-header {\n    margin: 0 0 24px;\n    margin: 0 0 1.5rem;\n}\n\n.entry-title {\n    font-size: 30px;\n    font-size: 1.875rem;\n    line-height: 1;\n    margin-top: 0;\n    margin-bottom: 8px;\n    margin-bottom: .5rem;\n}\n\n.entry-title a {\n    text-decoration: none;\n    color: #373737;\n}\n\n.archive .archive-header,\n.search .archive-header {\n    margin-bottom: 50px;\n    margin-bottom: 3.125rem;\n    border-bottom: 1px solid #dbdbdb;\n}\n\n.archive .archive-header .archive-title,\n.search .archive-header .archive-title {\n    font-size: 16px;\n    font-size: 1rem;\n}\n\n.archive .page-header p {\n    margin-bottom: 0;\n}\n\n.taxonomy-description {\n    font-size: 14px;\n    font-size: .875rem;\n    color: #5a5a5a;\n}\n\n.entry-thumbnail {\n    margin-bottom: 32px;\n    margin-bottom: 2rem;\n    text-align: center;\n    border-bottom: 0;\n}\n\n.entry-content hr {\n    clear: both;\n    margin: 32px 0;\n    margin: 2rem 0;\n    border-top: 1px solid #dbdbdb;\n}\n\n.entry-content li {\n    margin-bottom: 16px;\n    margin-bottom: 1rem;\n}\n\n.entry-meta,\n.entry-meta a {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n    font-size: 14px;\n    font-size: .875rem;\n    text-decoration: none;\n    color: #9a9a9a;;\n}\n\n.entry-meta a:hover {\n    text-decoration: underline;\n}\n\n.entry-footer {\n    font-size: 13px;\n    font-size: 81.25rem;\n}\n\n.entry-footer a {\n    text-decoration: none;\n    color: #286185;\n}\n\n.edit-link {\n    float: right;\n}\n\n.entry-footer {\n    font-size: 14px;\n    font-size: .875rem;\n    padding-top: 24px;\n    padding-top: 1.5rem;\n    color: #717171;\n    border-top: 1px solid #dbdbdb;\n}\n\n.cat-links,\n.tag-links {\n    display: block;\n}\n\n.cat-links a,\n.tag-links a {\n    text-decoration: none;\n}\n\n.cat-links {\n    margin-bottom: 4px;\n    margin-bottom: .25rem;\n}\n\n.moretag {\n    text-decoration: none;\n}\n\n.post-navigation {\n    margin-bottom: 50px;\n    margin-bottom: 3.125rem;\n}\n\n.content .search-form .search-field {\n\twidth: 75%\n}\n\n.content .search-form .search-submit {\n\tpadding: 12px;\n\tpadding: .75rem;\n\tmargin-left: 16px;\n\tmargin-left: 1rem\n}\n\n/*--------------------------------------------------------------\n## Comments\n--------------------------------------------------------------*/\n\n.comments-area {\n    margin-top: 50px;\n    margin-bottom: 3.125rem;\n}\n\n.comment-list {\n    margin: 0;\n    padding: 0;\n    list-style-type: none;\n}\n\n.comment-notes {\n    font-size: 14px;\n    font-size: .875rem;\n}\n\n.comment-form-author,\n.comment-form-email,\n.comment-form-url {\n    width: 50%;\n}\n\n.comment article {\n    margin-bottom: 48px;\n    margin-bottom: 3rem;\n    padding-bottom: 1rem;\n    border-bottom: 1px solid #dbdbdb;\n}\n\n\nol.comment-list li.comment ul.children {\n    margin: 0 0 0 24px;\n    margin: 0 0 0 1.5rem;\n    list-style: none;\n}\n\n.comment-form-url {\n    margin-right: 0;\n}\n\n.comment-author {\n    font-style: normal;\n    font-weight: 700;\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n    vertical-align: middle;\n}\n\n.comment-author-avatar {\n    float: left;\n    margin-right: 1rem;\n}\n\n.comment-published {\n    color: #9a9a9a;\n}\n\n.avatar {\n    width: 32px;\n    border-radius: 500px;\n}\n\n.comment-text {\n    float: right;\n    width: 85%;\n    margin-top: 8px;\n    margin-top: .5rem;\n}\n\n.comment-meta {\n    margin-bottom: 24px;\n    margin-bottom: 1.5rem;\n}\n\n.comment-meta a {\n    text-decoration: none;\n}\n\n.comment-author-name {\n    font-weight: bold;\n    font-style: normal;\n}\n\n.comment-time {\n    font-size: 13px;\n    font-size: .8125rem;\n}\n\n.comment-time a {\n    color: #5a5a5a;\n}\n\n.comments-title {\n    margin: 0 0 48px;\n    margin: 0 0 3rem;\n}\n\n.comment-reply-link {\n    font-size: 14px;\n    font-size: .875rem;\n    text-decoration: none;\n    color: #5a5a5a;\n}\n\n.comment-reply-link:after {\n    padding-left: 4px;\n    padding-left: .25rem;\n    content: '\\2193';\n}\n\n.bypostauthor span {\n    font-size: 11px;\n    font-size: .785714286rem;\n    font-weight: normal;\n    line-height: 1.428571429;\n    float: right;\n    padding: 6px 10px;\n    padding: .428571429rem .714285714rem;\n    color: white;\n    border: 0;\n    border-radius: 3px;\n    background: #176997;\n    box-shadow: 0 1px 2px rgba(64, 64, 64, .1);\n}\n\n.reply-title {\n    margin-top: 0;\n}\n\n.comment-respond {\n    margin-bottom: 50px;\n    margin-bottom: 3.125rem;\n}\n\n.comment-respond label {\n    font-size: 13px;\n    font-size: .8125rem;\n    display: block;\n    padding-bottom: 4px;\n    padding-bottom: .25rem;\n    color: #717171;\n}\n\n.form-submit {\n    margin-bottom: 0;\n}\n\n.page .comments-area {\n    margin-top: 32px;\n    margin-top: 2rem;\n    padding-top: 50px;\n    padding-top: 3.125rem;\n    border-top: 1px solid #dbdbdb;\n}\n\n.nav-links-comments {\n    margin-bottom: 50px;\n    margin-bottom: 3.125rem;\n}\n\n.nav-links-comments .nav-previous {\n    float: left;\n}\n\n.nav-links-comments .nav-next {\n    float: right;\n}\n\n/*--------------------------------------------------------------\n# Sidebar\n--------------------------------------------------------------*/\n\n.sidebar {\n    font-size: 14px;\n    font-size: .875rem;\n    color: #717171;\n}\n\n.widget {\n    margin-bottom: 48px;\n    margin-bottom: 3rem;\n}\n\n.widget-title {\n    font-size: 16px;\n    font-size: 1rem;\n    margin-bottom: 24px;\n    margin-bottom: 1.5rem;\n}\n\n.widget ul {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n}\n\n.widget ul li {\n    margin-bottom: 16px;\n    margin-bottom: 1rem;\n    padding-bottom: 16px;\n    padding-bottom: 1rem;\n    border-bottom: 1px solid #dbdbdb;\n}\n\n.widget_nav_menu .sub-menu {\n    margin-left: 8px;\n    margin-left: .5rem;\n}\n\n\n.widget_nav_menu ul li {\n    margin-bottom: 0;\n    padding-bottom: 0;\n    border-bottom: 0;\n}\n\n.widget_nav_menu ul li a {\n    display: block;\n    margin-bottom: 16px;\n    margin-bottom: 1rem;\n    padding-bottom: 16px;\n    padding-bottom: 1rem;\n    border-bottom: 1px solid #dbdbdb;\n}\n\n\n.widget_search {\n    padding: 0;\n}\n\n.search-form {\n    position: relative;\n}\n\n.search-form .search-field {\n    box-sizing: border-box;\n    width: 100% ;\n    padding: 12px;\n    padding: .75rem;\n}\n\n.widget ul li a {\n    text-decoration: none;\n    color: #5a5a5a;\n}\n\n.widget ul li a:hover {\n    color: #111111;\n}\n\n.widget .post-date {\n    display: block;\n    color: #cccccc;\n}\n\n/*--------------------------------------------------------------\n# Widgets\n--------------------------------------------------------------*/\n\n.widget table td,\n.widget table th {\n    padding: 0;\n    text-align: center;\n}\n\n.widget .children {\n    margin-top: 16px;\n    margin-top: 1rem;\n    padding-top: 1rem;\n    padding-left: 1rem;\n    border-top: 1px solid #dbdbdb;\n}\n\n.widget .children li:last-child {\n    margin: 0 ;\n    padding: 0;\n    border: 0;\n}\n\n.widget_search .search-submit {\n    position: absolute;\n    z-index: 100;\n    top: 16px;\n    top: 1rem;\n    right: .12px;\n    right: .75rem;\n    display: block;\n    width: 16px;\n    height: 16px;\n    text-indent: -9999px;\n    border: 0;\n    background: url(../images/search-icon.png) no-repeat;\n}\n\n.widget_rss .rsswidget {\n    font-weight: bold;\n    display: block;\n}\n\n.widget_rss .rss-date {\n    display: block;\n    padding: .25rem 0;\n    color: #dbdbdb;\n}\n\n/*--------------------------------------------------------------\n# Footer\n--------------------------------------------------------------*/\n\n.site-footer {\n    font-size: 14px;\n    font-size: .875rem;\n}\n\n.footer-widgets {\n    padding: 50px 0;\n    padding: 2rem 0 1rem;\n    border-top: 1px solid #dbdbdb;\n}\n\n.site-footer .widget {\n    margin-bottom: 0;\n}\n\n.sub-footer {\n    font-size: 13px;\n    font-size: .8125rem;\n    color: #717171;\n}\n\n.sub-footer-inner {\n    border-top: 1px solid #dbdbdb;\n    padding: 16px 0;\n    padding: 1rem 0;\n}\n\n.footer-attribution {\n    float: left;\n}\n\n.footer-copyright {\n    float: right;\n    text-align: right;\n}\n\n.footer-copyright a {\n    text-decoration: none;\n}\n\n\n.site-footer .widget ul li {\n    margin-bottom: 14px;\n    margin-bottom: .875rem;\n    padding-bottom: 14px;\n    padding-bottom: .875rem;\n    border-bottom: 1px solid #dbdbdb;\n}\n\n.site-info a {\n    color: #717171;\n}\n\n.footer-1,\n.footer-2,\n.footer-3,\n.footer-4 {\n    float: left;\n    width: 22%;\n    margin-right: 4%;\n}\n\n.footer-4 {\n    margin-right: 0;\n}\n\n/*--------------------------------------------------------------\n## Tables\n--------------------------------------------------------------*/\n\ntable {\n    width: 100%;\n    margin: 0 0 24px;\n    margin: 0 0 1.5rem;\n    table-layout: fixed;\n    empty-cells: show;\n    border-spacing: 0;\n    border-collapse: collapse;\n    border: 1px solid #cccccc;\n    border-radius: 2px;\n}\n\ntable td,\ntable th {\n    font-size: inherit;\n    overflow: visible;\n    margin: 0;\n    /*to make ths where the title is really long work*/\n    padding: .5em 1em;\n    /* cell padding */\n\n    text-align: left;\n    /*  inner column border */\n\n    border-width: 0 0 0 1px;\n    border-left: 1px solid #cccccc;\n}\n\n/* Consider removing this next declaration block, as it causes problems when\nthere's a rowspan on the first cell. Case added to the tests. issue#432 */\ntable td:first-child,\ntable th:first-child {\n    white-space: nowrap;\n    border-left-width: 0;\n}\n\ntable thead {\n    text-align: left;\n    vertical-align: bottom;\n    color: #404040;\n}\n\ntable a {\n    text-decoration: none;\n}\n\n/*\nstriping:\n   even - #fff (white)\n   odd  - #f2f2f2 (light gray)\n*/\ntable td {\n    background-color: transparent;\n}\n\n\n/* nth-child selector for modern browsers */\ntable tr:nth-child(2n-1) td,\ntable tr:nth-child(2n-1) th {\n    background-color: #f2f2f2;\n}\n/* BORDERED TABLES */\n\ntable td,\ntable th {\n    border-bottom: 1px solid #cbcbcb;\n}\n\ntable tbody > tr:last-child > td {\n    border-bottom-width: 0;\n}\n\n\n/*--------------------------------------------------------------\n# Accessibility\n--------------------------------------------------------------*/\n\n/* Text meant only for screen readers. */\n.screen-reader-text {\n    position: absolute !important;\n    overflow: hidden;\n    clip: rect(1px, 1px, 1px, 1px);\n    width: 1px;\n    height: 1px;\n}\n\n.screen-reader-text:focus {\n    font-size: 14px;\n    font-size: .875rem;\n    font-weight: bold;\n    line-height: normal;\n    z-index: 100000; /* Above WP toolbar. */\n    top: 5px;\n    left: 5px;\n    display: block;\n    clip: auto !important;\n    width: auto;\n    height: auto;\n    padding: 15px 23px 14px;\n    text-decoration: none;\n    color: #21759b;\n    border-radius: 3px;\n    background-color: #f1f1f1;\n    box-shadow: 0 0 2px 2px rgba(0, 0, 0, .6);\n}\n\n/*--------------------------------------------------------------\n# Alignments\n--------------------------------------------------------------*/\n\n.alignleft {\n    float: left;\n    margin-right: 24px;\n    margin-right: 1.5rem;\n}\n\n.alignright {\n    float: right;\n    margin-left: 24px;\n    margin-left: 1.5rem;\n}\n\n.aligncenter {\n    display: block;\n    clear: both;\n    margin-right: auto;\n    margin-left: auto;\n}\n\n/*--------------------------------------------------------------\n# Clearings\n--------------------------------------------------------------*/\n\n.clear:after,\n.entry-content:after,\n.comment-content:after,\n.site-header:after,\n.menu-primary:after,\n.site-content:after,\n.site-footer:after,\n.footer-widgets:after,\n.sub-footer-inner:after {\n    content: ' ';\n    display: block;\n    clear: both;\n}\n\n/*--------------------------------------------------------------\n# Infinite scroll\n--------------------------------------------------------------*/\n\n/* Globally hidden elements when Infinite Scroll is supported and in use. */\n.infinite-scroll .posts-navigation,\n/* Older / Newer Posts Navigation (always hidden) */\n.infinite-scroll.neverending .site-footer {\n    /* Theme Footer (when set to scrolling) */\n    display: none;\n}\n\n/* When Infinite Scroll has reached its end we need to re-display elements that were hidden (via .neverending) before. */\n.infinity-end.neverending .site-footer {\n    display: block;\n}\n\n/*--------------------------------------------------------------\n# Media\n--------------------------------------------------------------*/\n.page-content .wp-smiley,\n.entry-content .wp-smiley,\n.comment-content .wp-smiley {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding: 0;\n    border: none;\n}\n\n/* Make sure embeds and iframes fit their containers. */\nembed,\niframe,\nobject {\n    max-width: 100%;\n}\n\n/*--------------------------------------------------------------\n## Captions\n--------------------------------------------------------------*/\n\n.wp-caption {\n    max-width: 100%;\n    margin-bottom: 24px;\n    margin-bottom: 1.5rem;\n}\n\n.wp-caption img[class*='wp-image-'] {\n    display: block;\n    margin: 0 auto;\n}\n\n.wp-caption-text {\n    text-align: center;\n}\n\n.wp-caption .wp-caption-text {\n    margin: .8125em 0;\n}\n\n/*--------------------------------------------------------------\n## Galleries\n--------------------------------------------------------------*/\n.gallery {\n    margin-bottom: 24px;\n    margin-bottom: 1.5rem;\n}\n\n.gallery-item {\n    display: inline-block;\n    width: 100%;\n    text-align: center;\n    vertical-align: top;\n}\n\n.gallery-columns-2 .gallery-item {\n    max-width: 50%;\n}\n\n.gallery-columns-3 .gallery-item {\n    max-width: 33.33%;\n}\n\n.gallery-columns-4 .gallery-item {\n    max-width: 25%;\n}\n\n.gallery-columns-5 .gallery-item {\n    max-width: 20%;\n}\n\n.gallery-columns-6 .gallery-item {\n    max-width: 16.66%;\n}\n\n.gallery-columns-7 .gallery-item {\n    max-width: 14.28%;\n}\n\n.gallery-columns-8 .gallery-item {\n    max-width: 12.5%;\n}\n\n.gallery-columns-9 .gallery-item {\n    max-width: 11.11%;\n}\n\n.gallery-caption {\n    display: block;\n}\n\n/*--------------------------------------------------------------\n# Pagination\n--------------------------------------------------------------*/\n\nul.page-numbers {\n    font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n    margin-left: 0;\n    margin-bottom: 50px;\n}\n\n.page-numbers {\n    text-align: center;\n}\n.page-numbers li {\n    margin: 0 .2em;\n    display: inline-block;\n}\n.page-numbers li.button {\n    /* make sure prev next buttons are visible */\n    display: inline-block;\n}\n.page-numbers a,\n.page-numbers span {\n    display: inline-block;\n    /* use padding and font-size to change buttons size */\n\n    padding: .5rem 1rem;\n    -webkit-user-select: none;\n       -moz-user-select: none;\n        -ms-user-select: none;\n            user-select: none;\n}\n.page-numbers a {\n    border: 1px solid #dbdbdb;\n    border-radius: .25em;\n    color: #717171;\n}\n\n.page-numbers a:hover {\n    color: #404040;\n}\n\n.no-touch .page-numbers a:hover {\n    background-color: #f2f2f2;\n}\n.page-numbers a.disabled {\n    pointer-events: none;\n    /* button disabled */\n\n    color: rgba(46, 64, 87, .4);\n}\n.page-numbers a.disabled::before,\n.page-numbers a.disabled::after {\n    opacity: .4;\n}\n.page-numbers .button:first-of-type a::before {\n    content: '\\00ab  ';\n}\n.page-numbers .button:last-of-type a::after {\n    content: ' \\00bb';\n}\n.page-numbers .current {\n    pointer-events: none;\n    border: 1px solid #dbdbdb;\n    color: #404040;\n}\n\n/*--------------------------------------------------------------\n# Responsive\n--------------------------------------------------------------*/\n\n@media only screen and (max-width: 1040px) {\n    body {\n        padding: 0 5%;\n    }\n    .content,\n    .sidebar {\n        width: 100%;\n        margin: 0;\n    }\n}\n\n@media only screen and (max-width: 880px) {\n    .tinynav {\n        display: block;\n    }\n\n    .menu-primary .menu {\n        border: 0;\n    }\n\n    .menu-primary ul.menu,\n    .menu-primary .menu ul {\n        display: none;\n    }\n\n    .footer-1,\n    .footer-2,\n    .footer-3,\n    .footer-4 {\n        width: 48%;\n    }\n\n    .footer-2 {\n        margin-right: 0;\n    }\n}\n\n@media only screen and (max-width: 580px) {\n    .footer-1,\n    .footer-2,\n    .footer-3,\n    .footer-4 {\n        width: 100%;\n        margin: 0;\n    }\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/assets/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n\tfont-family: 'FontAwesome';\n\tsrc: url('../fonts/fontawesome-webfont.eot?v=4.3.0');\n\tsrc: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n.fa {\n\tdisplay: inline-block;\n\tfont: normal normal normal 14px/1 FontAwesome;\n\tfont-size: inherit;\n\ttext-rendering: auto;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\ttransform: translate(0, 0);\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n\tfont-size: 1.33333333em;\n\tline-height: 0.75em;\n\tvertical-align: -15%;\n}\n.fa-2x {\n\tfont-size: 2em;\n}\n.fa-3x {\n\tfont-size: 3em;\n}\n.fa-4x {\n\tfont-size: 4em;\n}\n.fa-5x {\n\tfont-size: 5em;\n}\n.fa-fw {\n\twidth: 1.28571429em;\n\ttext-align: center;\n}\n.fa-ul {\n\tpadding-left: 0;\n\tmargin-left: 2.14285714em;\n\tlist-style-type: none;\n}\n.fa-ul > li {\n\tposition: relative;\n}\n.fa-li {\n\tposition: absolute;\n\tleft: -2.14285714em;\n\twidth: 2.14285714em;\n\ttop: 0.14285714em;\n\ttext-align: center;\n}\n.fa-li.fa-lg {\n\tleft: -1.85714286em;\n}\n.fa-border {\n\tpadding: .2em .25em .15em;\n\tborder: solid 0.08em #eeeeee;\n\tborder-radius: .1em;\n}\n.pull-right {\n\tfloat: right;\n}\n.pull-left {\n\tfloat: left;\n}\n.fa.pull-left {\n\tmargin-right: .3em;\n}\n.fa.pull-right {\n\tmargin-left: .3em;\n}\n.fa-spin {\n\t-webkit-animation: fa-spin 2s infinite linear;\n\tanimation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n\t-webkit-animation: fa-spin 1s infinite steps(8);\n\tanimation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n\t0% {\n\t-webkit-transform: rotate(0deg);\n\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t-webkit-transform: rotate(359deg);\n\ttransform: rotate(359deg);\n\t}\n}\n@keyframes fa-spin {\n\t0% {\n\t-webkit-transform: rotate(0deg);\n\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t-webkit-transform: rotate(359deg);\n\ttransform: rotate(359deg);\n\t}\n}\n.fa-rotate-90 {\n\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n\t-webkit-transform: rotate(90deg);\n\t-ms-transform: rotate(90deg);\n\ttransform: rotate(90deg);\n}\n.fa-rotate-180 {\n\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n\t-webkit-transform: rotate(180deg);\n\t-ms-transform: rotate(180deg);\n\ttransform: rotate(180deg);\n}\n.fa-rotate-270 {\n\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n\t-webkit-transform: rotate(270deg);\n\t-ms-transform: rotate(270deg);\n\ttransform: rotate(270deg);\n}\n.fa-flip-horizontal {\n\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\n\t-webkit-transform: scale(-1, 1);\n\t-ms-transform: scale(-1, 1);\n\ttransform: scale(-1, 1);\n}\n.fa-flip-vertical {\n\tfilter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n\t-webkit-transform: scale(1, -1);\n\t-ms-transform: scale(1, -1);\n\ttransform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n\tfilter: none;\n}\n.fa-stack {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 2em;\n\theight: 2em;\n\tline-height: 2em;\n\tvertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n\tposition: absolute;\n\tleft: 0;\n\twidth: 100%;\n\ttext-align: center;\n}\n.fa-stack-1x {\n\tline-height: inherit;\n}\n.fa-stack-2x {\n\tfont-size: 2em;\n}\n.fa-inverse {\n\tcolor: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n\tcontent: \"\\f000\";\n}\n.fa-music:before {\n\tcontent: \"\\f001\";\n}\n.fa-search:before {\n\tcontent: \"\\f002\";\n}\n.fa-envelope-o:before {\n\tcontent: \"\\f003\";\n}\n.fa-heart:before {\n\tcontent: \"\\f004\";\n}\n.fa-star:before {\n\tcontent: \"\\f005\";\n}\n.fa-star-o:before {\n\tcontent: \"\\f006\";\n}\n.fa-user:before {\n\tcontent: \"\\f007\";\n}\n.fa-film:before {\n\tcontent: \"\\f008\";\n}\n.fa-th-large:before {\n\tcontent: \"\\f009\";\n}\n.fa-th:before {\n\tcontent: \"\\f00a\";\n}\n.fa-th-list:before {\n\tcontent: \"\\f00b\";\n}\n.fa-check:before {\n\tcontent: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n\tcontent: \"\\f00d\";\n}\n.fa-search-plus:before {\n\tcontent: \"\\f00e\";\n}\n.fa-search-minus:before {\n\tcontent: \"\\f010\";\n}\n.fa-power-off:before {\n\tcontent: \"\\f011\";\n}\n.fa-signal:before {\n\tcontent: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n\tcontent: \"\\f013\";\n}\n.fa-trash-o:before {\n\tcontent: \"\\f014\";\n}\n.fa-home:before {\n\tcontent: \"\\f015\";\n}\n.fa-file-o:before {\n\tcontent: \"\\f016\";\n}\n.fa-clock-o:before {\n\tcontent: \"\\f017\";\n}\n.fa-road:before {\n\tcontent: \"\\f018\";\n}\n.fa-download:before {\n\tcontent: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n\tcontent: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n\tcontent: \"\\f01b\";\n}\n.fa-inbox:before {\n\tcontent: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n\tcontent: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n\tcontent: \"\\f01e\";\n}\n.fa-refresh:before {\n\tcontent: \"\\f021\";\n}\n.fa-list-alt:before {\n\tcontent: \"\\f022\";\n}\n.fa-lock:before {\n\tcontent: \"\\f023\";\n}\n.fa-flag:before {\n\tcontent: \"\\f024\";\n}\n.fa-headphones:before {\n\tcontent: \"\\f025\";\n}\n.fa-volume-off:before {\n\tcontent: \"\\f026\";\n}\n.fa-volume-down:before {\n\tcontent: \"\\f027\";\n}\n.fa-volume-up:before {\n\tcontent: \"\\f028\";\n}\n.fa-qrcode:before {\n\tcontent: \"\\f029\";\n}\n.fa-barcode:before {\n\tcontent: \"\\f02a\";\n}\n.fa-tag:before {\n\tcontent: \"\\f02b\";\n}\n.fa-tags:before {\n\tcontent: \"\\f02c\";\n}\n.fa-book:before {\n\tcontent: \"\\f02d\";\n}\n.fa-bookmark:before {\n\tcontent: \"\\f02e\";\n}\n.fa-print:before {\n\tcontent: \"\\f02f\";\n}\n.fa-camera:before {\n\tcontent: \"\\f030\";\n}\n.fa-font:before {\n\tcontent: \"\\f031\";\n}\n.fa-bold:before {\n\tcontent: \"\\f032\";\n}\n.fa-italic:before {\n\tcontent: \"\\f033\";\n}\n.fa-text-height:before {\n\tcontent: \"\\f034\";\n}\n.fa-text-width:before {\n\tcontent: \"\\f035\";\n}\n.fa-align-left:before {\n\tcontent: \"\\f036\";\n}\n.fa-align-center:before {\n\tcontent: \"\\f037\";\n}\n.fa-align-right:before {\n\tcontent: \"\\f038\";\n}\n.fa-align-justify:before {\n\tcontent: \"\\f039\";\n}\n.fa-list:before {\n\tcontent: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n\tcontent: \"\\f03b\";\n}\n.fa-indent:before {\n\tcontent: \"\\f03c\";\n}\n.fa-video-camera:before {\n\tcontent: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n\tcontent: \"\\f03e\";\n}\n.fa-pencil:before {\n\tcontent: \"\\f040\";\n}\n.fa-map-marker:before {\n\tcontent: \"\\f041\";\n}\n.fa-adjust:before {\n\tcontent: \"\\f042\";\n}\n.fa-tint:before {\n\tcontent: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n\tcontent: \"\\f044\";\n}\n.fa-share-square-o:before {\n\tcontent: \"\\f045\";\n}\n.fa-check-square-o:before {\n\tcontent: \"\\f046\";\n}\n.fa-arrows:before {\n\tcontent: \"\\f047\";\n}\n.fa-step-backward:before {\n\tcontent: \"\\f048\";\n}\n.fa-fast-backward:before {\n\tcontent: \"\\f049\";\n}\n.fa-backward:before {\n\tcontent: \"\\f04a\";\n}\n.fa-play:before {\n\tcontent: \"\\f04b\";\n}\n.fa-pause:before {\n\tcontent: \"\\f04c\";\n}\n.fa-stop:before {\n\tcontent: \"\\f04d\";\n}\n.fa-forward:before {\n\tcontent: \"\\f04e\";\n}\n.fa-fast-forward:before {\n\tcontent: \"\\f050\";\n}\n.fa-step-forward:before {\n\tcontent: \"\\f051\";\n}\n.fa-eject:before {\n\tcontent: \"\\f052\";\n}\n.fa-chevron-left:before {\n\tcontent: \"\\f053\";\n}\n.fa-chevron-right:before {\n\tcontent: \"\\f054\";\n}\n.fa-plus-circle:before {\n\tcontent: \"\\f055\";\n}\n.fa-minus-circle:before {\n\tcontent: \"\\f056\";\n}\n.fa-times-circle:before {\n\tcontent: \"\\f057\";\n}\n.fa-check-circle:before {\n\tcontent: \"\\f058\";\n}\n.fa-question-circle:before {\n\tcontent: \"\\f059\";\n}\n.fa-info-circle:before {\n\tcontent: \"\\f05a\";\n}\n.fa-crosshairs:before {\n\tcontent: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n\tcontent: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n\tcontent: \"\\f05d\";\n}\n.fa-ban:before {\n\tcontent: \"\\f05e\";\n}\n.fa-arrow-left:before {\n\tcontent: \"\\f060\";\n}\n.fa-arrow-right:before {\n\tcontent: \"\\f061\";\n}\n.fa-arrow-up:before {\n\tcontent: \"\\f062\";\n}\n.fa-arrow-down:before {\n\tcontent: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n\tcontent: \"\\f064\";\n}\n.fa-expand:before {\n\tcontent: \"\\f065\";\n}\n.fa-compress:before {\n\tcontent: \"\\f066\";\n}\n.fa-plus:before {\n\tcontent: \"\\f067\";\n}\n.fa-minus:before {\n\tcontent: \"\\f068\";\n}\n.fa-asterisk:before {\n\tcontent: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n\tcontent: \"\\f06a\";\n}\n.fa-gift:before {\n\tcontent: \"\\f06b\";\n}\n.fa-leaf:before {\n\tcontent: \"\\f06c\";\n}\n.fa-fire:before {\n\tcontent: \"\\f06d\";\n}\n.fa-eye:before {\n\tcontent: \"\\f06e\";\n}\n.fa-eye-slash:before {\n\tcontent: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n\tcontent: \"\\f071\";\n}\n.fa-plane:before {\n\tcontent: \"\\f072\";\n}\n.fa-calendar:before {\n\tcontent: \"\\f073\";\n}\n.fa-random:before {\n\tcontent: \"\\f074\";\n}\n.fa-comment:before {\n\tcontent: \"\\f075\";\n}\n.fa-magnet:before {\n\tcontent: \"\\f076\";\n}\n.fa-chevron-up:before {\n\tcontent: \"\\f077\";\n}\n.fa-chevron-down:before {\n\tcontent: \"\\f078\";\n}\n.fa-retweet:before {\n\tcontent: \"\\f079\";\n}\n.fa-shopping-cart:before {\n\tcontent: \"\\f07a\";\n}\n.fa-folder:before {\n\tcontent: \"\\f07b\";\n}\n.fa-folder-open:before {\n\tcontent: \"\\f07c\";\n}\n.fa-arrows-v:before {\n\tcontent: \"\\f07d\";\n}\n.fa-arrows-h:before {\n\tcontent: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n\tcontent: \"\\f080\";\n}\n.fa-twitter-square:before {\n\tcontent: \"\\f081\";\n}\n.fa-facebook-square:before {\n\tcontent: \"\\f082\";\n}\n.fa-camera-retro:before {\n\tcontent: \"\\f083\";\n}\n.fa-key:before {\n\tcontent: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n\tcontent: \"\\f085\";\n}\n.fa-comments:before {\n\tcontent: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n\tcontent: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n\tcontent: \"\\f088\";\n}\n.fa-star-half:before {\n\tcontent: \"\\f089\";\n}\n.fa-heart-o:before {\n\tcontent: \"\\f08a\";\n}\n.fa-sign-out:before {\n\tcontent: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n\tcontent: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n\tcontent: \"\\f08d\";\n}\n.fa-external-link:before {\n\tcontent: \"\\f08e\";\n}\n.fa-sign-in:before {\n\tcontent: \"\\f090\";\n}\n.fa-trophy:before {\n\tcontent: \"\\f091\";\n}\n.fa-github-square:before {\n\tcontent: \"\\f092\";\n}\n.fa-upload:before {\n\tcontent: \"\\f093\";\n}\n.fa-lemon-o:before {\n\tcontent: \"\\f094\";\n}\n.fa-phone:before {\n\tcontent: \"\\f095\";\n}\n.fa-square-o:before {\n\tcontent: \"\\f096\";\n}\n.fa-bookmark-o:before {\n\tcontent: \"\\f097\";\n}\n.fa-phone-square:before {\n\tcontent: \"\\f098\";\n}\n.fa-twitter:before {\n\tcontent: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n\tcontent: \"\\f09a\";\n}\n.fa-github:before {\n\tcontent: \"\\f09b\";\n}\n.fa-unlock:before {\n\tcontent: \"\\f09c\";\n}\n.fa-credit-card:before {\n\tcontent: \"\\f09d\";\n}\n.fa-rss:before {\n\tcontent: \"\\f09e\";\n}\n.fa-hdd-o:before {\n\tcontent: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n\tcontent: \"\\f0a1\";\n}\n.fa-bell:before {\n\tcontent: \"\\f0f3\";\n}\n.fa-certificate:before {\n\tcontent: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n\tcontent: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n\tcontent: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n\tcontent: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n\tcontent: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n\tcontent: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n\tcontent: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n\tcontent: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n\tcontent: \"\\f0ab\";\n}\n.fa-globe:before {\n\tcontent: \"\\f0ac\";\n}\n.fa-wrench:before {\n\tcontent: \"\\f0ad\";\n}\n.fa-tasks:before {\n\tcontent: \"\\f0ae\";\n}\n.fa-filter:before {\n\tcontent: \"\\f0b0\";\n}\n.fa-briefcase:before {\n\tcontent: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n\tcontent: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n\tcontent: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n\tcontent: \"\\f0c1\";\n}\n.fa-cloud:before {\n\tcontent: \"\\f0c2\";\n}\n.fa-flask:before {\n\tcontent: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n\tcontent: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n\tcontent: \"\\f0c5\";\n}\n.fa-paperclip:before {\n\tcontent: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n\tcontent: \"\\f0c7\";\n}\n.fa-square:before {\n\tcontent: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n\tcontent: \"\\f0c9\";\n}\n.fa-list-ul:before {\n\tcontent: \"\\f0ca\";\n}\n.fa-list-ol:before {\n\tcontent: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n\tcontent: \"\\f0cc\";\n}\n.fa-underline:before {\n\tcontent: \"\\f0cd\";\n}\n.fa-table:before {\n\tcontent: \"\\f0ce\";\n}\n.fa-magic:before {\n\tcontent: \"\\f0d0\";\n}\n.fa-truck:before {\n\tcontent: \"\\f0d1\";\n}\n.fa-pinterest:before {\n\tcontent: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n\tcontent: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n\tcontent: \"\\f0d4\";\n}\n.fa-google-plus:before {\n\tcontent: \"\\f0d5\";\n}\n.fa-money:before {\n\tcontent: \"\\f0d6\";\n}\n.fa-caret-down:before {\n\tcontent: \"\\f0d7\";\n}\n.fa-caret-up:before {\n\tcontent: \"\\f0d8\";\n}\n.fa-caret-left:before {\n\tcontent: \"\\f0d9\";\n}\n.fa-caret-right:before {\n\tcontent: \"\\f0da\";\n}\n.fa-columns:before {\n\tcontent: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n\tcontent: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n\tcontent: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n\tcontent: \"\\f0de\";\n}\n.fa-envelope:before {\n\tcontent: \"\\f0e0\";\n}\n.fa-linkedin:before {\n\tcontent: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n\tcontent: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n\tcontent: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n\tcontent: \"\\f0e4\";\n}\n.fa-comment-o:before {\n\tcontent: \"\\f0e5\";\n}\n.fa-comments-o:before {\n\tcontent: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n\tcontent: \"\\f0e7\";\n}\n.fa-sitemap:before {\n\tcontent: \"\\f0e8\";\n}\n.fa-umbrella:before {\n\tcontent: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n\tcontent: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n\tcontent: \"\\f0eb\";\n}\n.fa-exchange:before {\n\tcontent: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n\tcontent: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n\tcontent: \"\\f0ee\";\n}\n.fa-user-md:before {\n\tcontent: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n\tcontent: \"\\f0f1\";\n}\n.fa-suitcase:before {\n\tcontent: \"\\f0f2\";\n}\n.fa-bell-o:before {\n\tcontent: \"\\f0a2\";\n}\n.fa-coffee:before {\n\tcontent: \"\\f0f4\";\n}\n.fa-cutlery:before {\n\tcontent: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n\tcontent: \"\\f0f6\";\n}\n.fa-building-o:before {\n\tcontent: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n\tcontent: \"\\f0f8\";\n}\n.fa-ambulance:before {\n\tcontent: \"\\f0f9\";\n}\n.fa-medkit:before {\n\tcontent: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n\tcontent: \"\\f0fb\";\n}\n.fa-beer:before {\n\tcontent: \"\\f0fc\";\n}\n.fa-h-square:before {\n\tcontent: \"\\f0fd\";\n}\n.fa-plus-square:before {\n\tcontent: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n\tcontent: \"\\f100\";\n}\n.fa-angle-double-right:before {\n\tcontent: \"\\f101\";\n}\n.fa-angle-double-up:before {\n\tcontent: \"\\f102\";\n}\n.fa-angle-double-down:before {\n\tcontent: \"\\f103\";\n}\n.fa-angle-left:before {\n\tcontent: \"\\f104\";\n}\n.fa-angle-right:before {\n\tcontent: \"\\f105\";\n}\n.fa-angle-up:before {\n\tcontent: \"\\f106\";\n}\n.fa-angle-down:before {\n\tcontent: \"\\f107\";\n}\n.fa-desktop:before {\n\tcontent: \"\\f108\";\n}\n.fa-laptop:before {\n\tcontent: \"\\f109\";\n}\n.fa-tablet:before {\n\tcontent: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n\tcontent: \"\\f10b\";\n}\n.fa-circle-o:before {\n\tcontent: \"\\f10c\";\n}\n.fa-quote-left:before {\n\tcontent: \"\\f10d\";\n}\n.fa-quote-right:before {\n\tcontent: \"\\f10e\";\n}\n.fa-spinner:before {\n\tcontent: \"\\f110\";\n}\n.fa-circle:before {\n\tcontent: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n\tcontent: \"\\f112\";\n}\n.fa-github-alt:before {\n\tcontent: \"\\f113\";\n}\n.fa-folder-o:before {\n\tcontent: \"\\f114\";\n}\n.fa-folder-open-o:before {\n\tcontent: \"\\f115\";\n}\n.fa-smile-o:before {\n\tcontent: \"\\f118\";\n}\n.fa-frown-o:before {\n\tcontent: \"\\f119\";\n}\n.fa-meh-o:before {\n\tcontent: \"\\f11a\";\n}\n.fa-gamepad:before {\n\tcontent: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n\tcontent: \"\\f11c\";\n}\n.fa-flag-o:before {\n\tcontent: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n\tcontent: \"\\f11e\";\n}\n.fa-terminal:before {\n\tcontent: \"\\f120\";\n}\n.fa-code:before {\n\tcontent: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n\tcontent: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n\tcontent: \"\\f123\";\n}\n.fa-location-arrow:before {\n\tcontent: \"\\f124\";\n}\n.fa-crop:before {\n\tcontent: \"\\f125\";\n}\n.fa-code-fork:before {\n\tcontent: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n\tcontent: \"\\f127\";\n}\n.fa-question:before {\n\tcontent: \"\\f128\";\n}\n.fa-info:before {\n\tcontent: \"\\f129\";\n}\n.fa-exclamation:before {\n\tcontent: \"\\f12a\";\n}\n.fa-superscript:before {\n\tcontent: \"\\f12b\";\n}\n.fa-subscript:before {\n\tcontent: \"\\f12c\";\n}\n.fa-eraser:before {\n\tcontent: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n\tcontent: \"\\f12e\";\n}\n.fa-microphone:before {\n\tcontent: \"\\f130\";\n}\n.fa-microphone-slash:before {\n\tcontent: \"\\f131\";\n}\n.fa-shield:before {\n\tcontent: \"\\f132\";\n}\n.fa-calendar-o:before {\n\tcontent: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n\tcontent: \"\\f134\";\n}\n.fa-rocket:before {\n\tcontent: \"\\f135\";\n}\n.fa-maxcdn:before {\n\tcontent: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n\tcontent: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n\tcontent: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n\tcontent: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n\tcontent: \"\\f13a\";\n}\n.fa-html5:before {\n\tcontent: \"\\f13b\";\n}\n.fa-css3:before {\n\tcontent: \"\\f13c\";\n}\n.fa-anchor:before {\n\tcontent: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n\tcontent: \"\\f13e\";\n}\n.fa-bullseye:before {\n\tcontent: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n\tcontent: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n\tcontent: \"\\f142\";\n}\n.fa-rss-square:before {\n\tcontent: \"\\f143\";\n}\n.fa-play-circle:before {\n\tcontent: \"\\f144\";\n}\n.fa-ticket:before {\n\tcontent: \"\\f145\";\n}\n.fa-minus-square:before {\n\tcontent: \"\\f146\";\n}\n.fa-minus-square-o:before {\n\tcontent: \"\\f147\";\n}\n.fa-level-up:before {\n\tcontent: \"\\f148\";\n}\n.fa-level-down:before {\n\tcontent: \"\\f149\";\n}\n.fa-check-square:before {\n\tcontent: \"\\f14a\";\n}\n.fa-pencil-square:before {\n\tcontent: \"\\f14b\";\n}\n.fa-external-link-square:before {\n\tcontent: \"\\f14c\";\n}\n.fa-share-square:before {\n\tcontent: \"\\f14d\";\n}\n.fa-compass:before {\n\tcontent: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n\tcontent: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n\tcontent: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n\tcontent: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n\tcontent: \"\\f153\";\n}\n.fa-gbp:before {\n\tcontent: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n\tcontent: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n\tcontent: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n\tcontent: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n\tcontent: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n\tcontent: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n\tcontent: \"\\f15a\";\n}\n.fa-file:before {\n\tcontent: \"\\f15b\";\n}\n.fa-file-text:before {\n\tcontent: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n\tcontent: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n\tcontent: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n\tcontent: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n\tcontent: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n\tcontent: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n\tcontent: \"\\f163\";\n}\n.fa-thumbs-up:before {\n\tcontent: \"\\f164\";\n}\n.fa-thumbs-down:before {\n\tcontent: \"\\f165\";\n}\n.fa-youtube-square:before {\n\tcontent: \"\\f166\";\n}\n.fa-youtube:before {\n\tcontent: \"\\f167\";\n}\n.fa-xing:before {\n\tcontent: \"\\f168\";\n}\n.fa-xing-square:before {\n\tcontent: \"\\f169\";\n}\n.fa-youtube-play:before {\n\tcontent: \"\\f16a\";\n}\n.fa-dropbox:before {\n\tcontent: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n\tcontent: \"\\f16c\";\n}\n.fa-instagram:before {\n\tcontent: \"\\f16d\";\n}\n.fa-flickr:before {\n\tcontent: \"\\f16e\";\n}\n.fa-adn:before {\n\tcontent: \"\\f170\";\n}\n.fa-bitbucket:before {\n\tcontent: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n\tcontent: \"\\f172\";\n}\n.fa-tumblr:before {\n\tcontent: \"\\f173\";\n}\n.fa-tumblr-square:before {\n\tcontent: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n\tcontent: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n\tcontent: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n\tcontent: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n\tcontent: \"\\f178\";\n}\n.fa-apple:before {\n\tcontent: \"\\f179\";\n}\n.fa-windows:before {\n\tcontent: \"\\f17a\";\n}\n.fa-android:before {\n\tcontent: \"\\f17b\";\n}\n.fa-linux:before {\n\tcontent: \"\\f17c\";\n}\n.fa-dribbble:before {\n\tcontent: \"\\f17d\";\n}\n.fa-skype:before {\n\tcontent: \"\\f17e\";\n}\n.fa-foursquare:before {\n\tcontent: \"\\f180\";\n}\n.fa-trello:before {\n\tcontent: \"\\f181\";\n}\n.fa-female:before {\n\tcontent: \"\\f182\";\n}\n.fa-male:before {\n\tcontent: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n\tcontent: \"\\f184\";\n}\n.fa-sun-o:before {\n\tcontent: \"\\f185\";\n}\n.fa-moon-o:before {\n\tcontent: \"\\f186\";\n}\n.fa-archive:before {\n\tcontent: \"\\f187\";\n}\n.fa-bug:before {\n\tcontent: \"\\f188\";\n}\n.fa-vk:before {\n\tcontent: \"\\f189\";\n}\n.fa-weibo:before {\n\tcontent: \"\\f18a\";\n}\n.fa-renren:before {\n\tcontent: \"\\f18b\";\n}\n.fa-pagelines:before {\n\tcontent: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n\tcontent: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n\tcontent: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n\tcontent: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n\tcontent: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n\tcontent: \"\\f192\";\n}\n.fa-wheelchair:before {\n\tcontent: \"\\f193\";\n}\n.fa-vimeo-square:before {\n\tcontent: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n\tcontent: \"\\f195\";\n}\n.fa-plus-square-o:before {\n\tcontent: \"\\f196\";\n}\n.fa-space-shuttle:before {\n\tcontent: \"\\f197\";\n}\n.fa-slack:before {\n\tcontent: \"\\f198\";\n}\n.fa-envelope-square:before {\n\tcontent: \"\\f199\";\n}\n.fa-wordpress:before {\n\tcontent: \"\\f19a\";\n}\n.fa-openid:before {\n\tcontent: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n\tcontent: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n\tcontent: \"\\f19d\";\n}\n.fa-yahoo:before {\n\tcontent: \"\\f19e\";\n}\n.fa-google:before {\n\tcontent: \"\\f1a0\";\n}\n.fa-reddit:before {\n\tcontent: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n\tcontent: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n\tcontent: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n\tcontent: \"\\f1a4\";\n}\n.fa-delicious:before {\n\tcontent: \"\\f1a5\";\n}\n.fa-digg:before {\n\tcontent: \"\\f1a6\";\n}\n.fa-pied-piper:before {\n\tcontent: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n\tcontent: \"\\f1a8\";\n}\n.fa-drupal:before {\n\tcontent: \"\\f1a9\";\n}\n.fa-joomla:before {\n\tcontent: \"\\f1aa\";\n}\n.fa-language:before {\n\tcontent: \"\\f1ab\";\n}\n.fa-fax:before {\n\tcontent: \"\\f1ac\";\n}\n.fa-building:before {\n\tcontent: \"\\f1ad\";\n}\n.fa-child:before {\n\tcontent: \"\\f1ae\";\n}\n.fa-paw:before {\n\tcontent: \"\\f1b0\";\n}\n.fa-spoon:before {\n\tcontent: \"\\f1b1\";\n}\n.fa-cube:before {\n\tcontent: \"\\f1b2\";\n}\n.fa-cubes:before {\n\tcontent: \"\\f1b3\";\n}\n.fa-behance:before {\n\tcontent: \"\\f1b4\";\n}\n.fa-behance-square:before {\n\tcontent: \"\\f1b5\";\n}\n.fa-steam:before {\n\tcontent: \"\\f1b6\";\n}\n.fa-steam-square:before {\n\tcontent: \"\\f1b7\";\n}\n.fa-recycle:before {\n\tcontent: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n\tcontent: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n\tcontent: \"\\f1ba\";\n}\n.fa-tree:before {\n\tcontent: \"\\f1bb\";\n}\n.fa-spotify:before {\n\tcontent: \"\\f1bc\";\n}\n.fa-deviantart:before {\n\tcontent: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n\tcontent: \"\\f1be\";\n}\n.fa-database:before {\n\tcontent: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n\tcontent: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n\tcontent: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n\tcontent: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n\tcontent: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n\tcontent: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n\tcontent: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n\tcontent: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n\tcontent: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n\tcontent: \"\\f1c9\";\n}\n.fa-vine:before {\n\tcontent: \"\\f1ca\";\n}\n.fa-codepen:before {\n\tcontent: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n\tcontent: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n\tcontent: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n\tcontent: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-rebel:before {\n\tcontent: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n\tcontent: \"\\f1d1\";\n}\n.fa-git-square:before {\n\tcontent: \"\\f1d2\";\n}\n.fa-git:before {\n\tcontent: \"\\f1d3\";\n}\n.fa-hacker-news:before {\n\tcontent: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n\tcontent: \"\\f1d5\";\n}\n.fa-qq:before {\n\tcontent: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n\tcontent: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n\tcontent: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n\tcontent: \"\\f1d9\";\n}\n.fa-history:before {\n\tcontent: \"\\f1da\";\n}\n.fa-genderless:before,\n.fa-circle-thin:before {\n\tcontent: \"\\f1db\";\n}\n.fa-header:before {\n\tcontent: \"\\f1dc\";\n}\n.fa-paragraph:before {\n\tcontent: \"\\f1dd\";\n}\n.fa-sliders:before {\n\tcontent: \"\\f1de\";\n}\n.fa-share-alt:before {\n\tcontent: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n\tcontent: \"\\f1e1\";\n}\n.fa-bomb:before {\n\tcontent: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n\tcontent: \"\\f1e3\";\n}\n.fa-tty:before {\n\tcontent: \"\\f1e4\";\n}\n.fa-binoculars:before {\n\tcontent: \"\\f1e5\";\n}\n.fa-plug:before {\n\tcontent: \"\\f1e6\";\n}\n.fa-slideshare:before {\n\tcontent: \"\\f1e7\";\n}\n.fa-twitch:before {\n\tcontent: \"\\f1e8\";\n}\n.fa-yelp:before {\n\tcontent: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n\tcontent: \"\\f1ea\";\n}\n.fa-wifi:before {\n\tcontent: \"\\f1eb\";\n}\n.fa-calculator:before {\n\tcontent: \"\\f1ec\";\n}\n.fa-paypal:before {\n\tcontent: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n\tcontent: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n\tcontent: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n\tcontent: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n\tcontent: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n\tcontent: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n\tcontent: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n\tcontent: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n\tcontent: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n\tcontent: \"\\f1f7\";\n}\n.fa-trash:before {\n\tcontent: \"\\f1f8\";\n}\n.fa-copyright:before {\n\tcontent: \"\\f1f9\";\n}\n.fa-at:before {\n\tcontent: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n\tcontent: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n\tcontent: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n\tcontent: \"\\f1fd\";\n}\n.fa-area-chart:before {\n\tcontent: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n\tcontent: \"\\f200\";\n}\n.fa-line-chart:before {\n\tcontent: \"\\f201\";\n}\n.fa-lastfm:before {\n\tcontent: \"\\f202\";\n}\n.fa-lastfm-square:before {\n\tcontent: \"\\f203\";\n}\n.fa-toggle-off:before {\n\tcontent: \"\\f204\";\n}\n.fa-toggle-on:before {\n\tcontent: \"\\f205\";\n}\n.fa-bicycle:before {\n\tcontent: \"\\f206\";\n}\n.fa-bus:before {\n\tcontent: \"\\f207\";\n}\n.fa-ioxhost:before {\n\tcontent: \"\\f208\";\n}\n.fa-angellist:before {\n\tcontent: \"\\f209\";\n}\n.fa-cc:before {\n\tcontent: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n\tcontent: \"\\f20b\";\n}\n.fa-meanpath:before {\n\tcontent: \"\\f20c\";\n}\n.fa-buysellads:before {\n\tcontent: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n\tcontent: \"\\f20e\";\n}\n.fa-dashcube:before {\n\tcontent: \"\\f210\";\n}\n.fa-forumbee:before {\n\tcontent: \"\\f211\";\n}\n.fa-leanpub:before {\n\tcontent: \"\\f212\";\n}\n.fa-sellsy:before {\n\tcontent: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n\tcontent: \"\\f214\";\n}\n.fa-simplybuilt:before {\n\tcontent: \"\\f215\";\n}\n.fa-skyatlas:before {\n\tcontent: \"\\f216\";\n}\n.fa-cart-plus:before {\n\tcontent: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n\tcontent: \"\\f218\";\n}\n.fa-diamond:before {\n\tcontent: \"\\f219\";\n}\n.fa-ship:before {\n\tcontent: \"\\f21a\";\n}\n.fa-user-secret:before {\n\tcontent: \"\\f21b\";\n}\n.fa-motorcycle:before {\n\tcontent: \"\\f21c\";\n}\n.fa-street-view:before {\n\tcontent: \"\\f21d\";\n}\n.fa-heartbeat:before {\n\tcontent: \"\\f21e\";\n}\n.fa-venus:before {\n\tcontent: \"\\f221\";\n}\n.fa-mars:before {\n\tcontent: \"\\f222\";\n}\n.fa-mercury:before {\n\tcontent: \"\\f223\";\n}\n.fa-transgender:before {\n\tcontent: \"\\f224\";\n}\n.fa-transgender-alt:before {\n\tcontent: \"\\f225\";\n}\n.fa-venus-double:before {\n\tcontent: \"\\f226\";\n}\n.fa-mars-double:before {\n\tcontent: \"\\f227\";\n}\n.fa-venus-mars:before {\n\tcontent: \"\\f228\";\n}\n.fa-mars-stroke:before {\n\tcontent: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n\tcontent: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n\tcontent: \"\\f22b\";\n}\n.fa-neuter:before {\n\tcontent: \"\\f22c\";\n}\n.fa-facebook-official:before {\n\tcontent: \"\\f230\";\n}\n.fa-pinterest-p:before {\n\tcontent: \"\\f231\";\n}\n.fa-whatsapp:before {\n\tcontent: \"\\f232\";\n}\n.fa-server:before {\n\tcontent: \"\\f233\";\n}\n.fa-user-plus:before {\n\tcontent: \"\\f234\";\n}\n.fa-user-times:before {\n\tcontent: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n\tcontent: \"\\f236\";\n}\n.fa-viacoin:before {\n\tcontent: \"\\f237\";\n}\n.fa-train:before {\n\tcontent: \"\\f238\";\n}\n.fa-subway:before {\n\tcontent: \"\\f239\";\n}\n.fa-medium:before {\n\tcontent: \"\\f23a\";\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/assets/css/grid.css",
    "content": "html {\n\tbox-sizing: border-box; }\n\n*,\n*:before,\n*:after {\n\t-webkit-box-sizing: inherit;\n\t-moz-box-sizing: inherit;\n\tbox-sizing: inherit; }\n\nhtml,\nbody {\n\tfont-size: 100%; }\n\nbody {\n\tbackground: #fff;\n\tcolor: #222222;\n\tcursor: auto;\n\tfont-family: \"Helvetica Neue\", Helvetica, Roboto, Arial, sans-serif;\n\tfont-style: normal;\n\tfont-weight: normal;\n\tline-height: 1.5;\n\tmargin: 0;\n\tpadding: 0;\n\tposition: relative; }\n\na:hover {\n\tcursor: pointer; }\n\nimg {\n\tmax-width: 100%;\n\theight: auto; }\n\nimg {\n\t-ms-interpolation-mode: bicubic; }\n\n#map_canvas img,\n#map_canvas embed,\n#map_canvas object,\n.map_canvas img,\n.map_canvas embed,\n.map_canvas object,\n.mqa-display img,\n.mqa-display embed,\n.mqa-display object {\n\tmax-width: none !important; }\n\n.left {\n\tfloat: left !important; }\n\n.right {\n\tfloat: right !important; }\n\n.clearfix:before, .clearfix:after {\n\tcontent: \" \";\n\tdisplay: table; }\n.clearfix:after {\n\tclear: both; }\n\n.hide {\n\tdisplay: none; }\n\n.invisible {\n\tvisibility: hidden; }\n\n.antialiased {\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale; }\n\nimg {\n\tdisplay: inline-block;\n\tvertical-align: middle; }\n\ntextarea {\n\theight: auto;\n\tmin-height: 50px; }\n\nselect {\n\twidth: 100%; }\n\n.row {\n\tmargin: 0 auto;\n\tmax-width: 62.5rem;\n\twidth: 100%; }\n\t.row:before, .row:after {\n\tcontent: \" \";\n\tdisplay: table; }\n\t.row:after {\n\tclear: both; }\n\t.row.collapse > .column,\n\t.row.collapse > .columns {\n\tpadding-left: 0;\n\tpadding-right: 0; }\n\t.row.collapse .row {\n\tmargin-left: 0;\n\tmargin-right: 0; }\n\t.row .row {\n\tmargin: 0 -0.9375em;\n\tmax-width: none;\n\twidth: auto; }\n\t.row .row:before, .row .row:after {\n\t  content: \" \";\n\t  display: table; }\n\t.row .row:after {\n\t  clear: both; }\n\t.row .row.collapse {\n\t  margin: 0;\n\t  max-width: none;\n\t  width: auto; }\n\t  .row .row.collapse:before, .row .row.collapse:after {\n\t\tcontent: \" \";\n\t\tdisplay: table; }\n\t  .row .row.collapse:after {\n\t\tclear: both; }\n\n.column,\n.columns {\n\tpadding-left: 0.9375em;\n\tpadding-right: 0.9375em;\n\twidth: 100%;\n\tfloat: left; }\n\n.column + .column:last-child,\n.columns + .column:last-child, .column +\n.columns:last-child,\n.columns +\n.columns:last-child {\n\tfloat: right; }\n.column + .column.end,\n.columns + .column.end, .column +\n.columns.end,\n.columns +\n.columns.end {\n\tfloat: left; }\n\n@media only screen {\n\t.small-push-0 {\n\tposition: relative;\n\tleft: 0;\n\tright: auto; }\n\n\t.small-pull-0 {\n\tposition: relative;\n\tright: 0;\n\tleft: auto; }\n\n\t.small-push-1 {\n\tposition: relative;\n\tleft: 8.33333%;\n\tright: auto; }\n\n\t.small-pull-1 {\n\tposition: relative;\n\tright: 8.33333%;\n\tleft: auto; }\n\n\t.small-push-2 {\n\tposition: relative;\n\tleft: 16.66667%;\n\tright: auto; }\n\n\t.small-pull-2 {\n\tposition: relative;\n\tright: 16.66667%;\n\tleft: auto; }\n\n\t.small-push-3 {\n\tposition: relative;\n\tleft: 25%;\n\tright: auto; }\n\n\t.small-pull-3 {\n\tposition: relative;\n\tright: 25%;\n\tleft: auto; }\n\n\t.small-push-4 {\n\tposition: relative;\n\tleft: 33.33333%;\n\tright: auto; }\n\n\t.small-pull-4 {\n\tposition: relative;\n\tright: 33.33333%;\n\tleft: auto; }\n\n\t.small-push-5 {\n\tposition: relative;\n\tleft: 41.66667%;\n\tright: auto; }\n\n\t.small-pull-5 {\n\tposition: relative;\n\tright: 41.66667%;\n\tleft: auto; }\n\n\t.small-push-6 {\n\tposition: relative;\n\tleft: 50%;\n\tright: auto; }\n\n\t.small-pull-6 {\n\tposition: relative;\n\tright: 50%;\n\tleft: auto; }\n\n\t.small-push-7 {\n\tposition: relative;\n\tleft: 58.33333%;\n\tright: auto; }\n\n\t.small-pull-7 {\n\tposition: relative;\n\tright: 58.33333%;\n\tleft: auto; }\n\n\t.small-push-8 {\n\tposition: relative;\n\tleft: 66.66667%;\n\tright: auto; }\n\n\t.small-pull-8 {\n\tposition: relative;\n\tright: 66.66667%;\n\tleft: auto; }\n\n\t.small-push-9 {\n\tposition: relative;\n\tleft: 75%;\n\tright: auto; }\n\n\t.small-pull-9 {\n\tposition: relative;\n\tright: 75%;\n\tleft: auto; }\n\n\t.small-push-10 {\n\tposition: relative;\n\tleft: 83.33333%;\n\tright: auto; }\n\n\t.small-pull-10 {\n\tposition: relative;\n\tright: 83.33333%;\n\tleft: auto; }\n\n\t.small-push-11 {\n\tposition: relative;\n\tleft: 91.66667%;\n\tright: auto; }\n\n\t.small-pull-11 {\n\tposition: relative;\n\tright: 91.66667%;\n\tleft: auto; }\n\n\t.column,\n\t.columns {\n\tposition: relative;\n\tpadding-left: 0.9375em;\n\tpadding-right: 0.9375em;\n\tfloat: left; }\n\n\t.small-1 {\n\twidth: 8.33333%; }\n\n\t.small-2 {\n\twidth: 16.66667%; }\n\n\t.small-3 {\n\twidth: 25%; }\n\n\t.small-4 {\n\twidth: 33.33333%; }\n\n\t.small-5 {\n\twidth: 41.66667%; }\n\n\t.small-6 {\n\twidth: 50%; }\n\n\t.small-7 {\n\twidth: 58.33333%; }\n\n\t.small-8 {\n\twidth: 66.66667%; }\n\n\t.small-9 {\n\twidth: 75%; }\n\n\t.small-10 {\n\twidth: 83.33333%; }\n\n\t.small-11 {\n\twidth: 91.66667%; }\n\n\t.small-12 {\n\twidth: 100%; }\n\n\t.small-offset-0 {\n\tmargin-left: 0 !important; }\n\n\t.small-offset-1 {\n\tmargin-left: 8.33333% !important; }\n\n\t.small-offset-2 {\n\tmargin-left: 16.66667% !important; }\n\n\t.small-offset-3 {\n\tmargin-left: 25% !important; }\n\n\t.small-offset-4 {\n\tmargin-left: 33.33333% !important; }\n\n\t.small-offset-5 {\n\tmargin-left: 41.66667% !important; }\n\n\t.small-offset-6 {\n\tmargin-left: 50% !important; }\n\n\t.small-offset-7 {\n\tmargin-left: 58.33333% !important; }\n\n\t.small-offset-8 {\n\tmargin-left: 66.66667% !important; }\n\n\t.small-offset-9 {\n\tmargin-left: 75% !important; }\n\n\t.small-offset-10 {\n\tmargin-left: 83.33333% !important; }\n\n\t.small-offset-11 {\n\tmargin-left: 91.66667% !important; }\n\n\t.small-reset-order {\n\tfloat: left;\n\tleft: auto;\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tright: auto; }\n\n\t.column.small-centered,\n\t.columns.small-centered {\n\tmargin-left: auto;\n\tmargin-right: auto;\n\tfloat: none; }\n\n\t.column.small-uncentered,\n\t.columns.small-uncentered {\n\tfloat: left;\n\tmargin-left: 0;\n\tmargin-right: 0; }\n\n\t.column.small-centered:last-child,\n\t.columns.small-centered:last-child {\n\tfloat: none; }\n\n\t.column.small-uncentered:last-child,\n\t.columns.small-uncentered:last-child {\n\tfloat: left; }\n\n\t.column.small-uncentered.opposite,\n\t.columns.small-uncentered.opposite {\n\tfloat: right; }\n\n\t.row.small-collapse > .column,\n\t.row.small-collapse > .columns {\n\tpadding-left: 0;\n\tpadding-right: 0; }\n\t.row.small-collapse .row {\n\tmargin-left: 0;\n\tmargin-right: 0; }\n\t.row.small-uncollapse > .column,\n\t.row.small-uncollapse > .columns {\n\tpadding-left: 0.9375em;\n\tpadding-right: 0.9375em;\n\tfloat: left; } }\n@media only screen and (min-width: 40.0625em) {\n\t.medium-push-0 {\n\tposition: relative;\n\tleft: 0;\n\tright: auto; }\n\n\t.medium-pull-0 {\n\tposition: relative;\n\tright: 0;\n\tleft: auto; }\n\n\t.medium-push-1 {\n\tposition: relative;\n\tleft: 8.33333%;\n\tright: auto; }\n\n\t.medium-pull-1 {\n\tposition: relative;\n\tright: 8.33333%;\n\tleft: auto; }\n\n\t.medium-push-2 {\n\tposition: relative;\n\tleft: 16.66667%;\n\tright: auto; }\n\n\t.medium-pull-2 {\n\tposition: relative;\n\tright: 16.66667%;\n\tleft: auto; }\n\n\t.medium-push-3 {\n\tposition: relative;\n\tleft: 25%;\n\tright: auto; }\n\n\t.medium-pull-3 {\n\tposition: relative;\n\tright: 25%;\n\tleft: auto; }\n\n\t.medium-push-4 {\n\tposition: relative;\n\tleft: 33.33333%;\n\tright: auto; }\n\n\t.medium-pull-4 {\n\tposition: relative;\n\tright: 33.33333%;\n\tleft: auto; }\n\n\t.medium-push-5 {\n\tposition: relative;\n\tleft: 41.66667%;\n\tright: auto; }\n\n\t.medium-pull-5 {\n\tposition: relative;\n\tright: 41.66667%;\n\tleft: auto; }\n\n\t.medium-push-6 {\n\tposition: relative;\n\tleft: 50%;\n\tright: auto; }\n\n\t.medium-pull-6 {\n\tposition: relative;\n\tright: 50%;\n\tleft: auto; }\n\n\t.medium-push-7 {\n\tposition: relative;\n\tleft: 58.33333%;\n\tright: auto; }\n\n\t.medium-pull-7 {\n\tposition: relative;\n\tright: 58.33333%;\n\tleft: auto; }\n\n\t.medium-push-8 {\n\tposition: relative;\n\tleft: 66.66667%;\n\tright: auto; }\n\n\t.medium-pull-8 {\n\tposition: relative;\n\tright: 66.66667%;\n\tleft: auto; }\n\n\t.medium-push-9 {\n\tposition: relative;\n\tleft: 75%;\n\tright: auto; }\n\n\t.medium-pull-9 {\n\tposition: relative;\n\tright: 75%;\n\tleft: auto; }\n\n\t.medium-push-10 {\n\tposition: relative;\n\tleft: 83.33333%;\n\tright: auto; }\n\n\t.medium-pull-10 {\n\tposition: relative;\n\tright: 83.33333%;\n\tleft: auto; }\n\n\t.medium-push-11 {\n\tposition: relative;\n\tleft: 91.66667%;\n\tright: auto; }\n\n\t.medium-pull-11 {\n\tposition: relative;\n\tright: 91.66667%;\n\tleft: auto; }\n\n\t.column,\n\t.columns {\n\tposition: relative;\n\tpadding-left: 0.9375em;\n\tpadding-right: 0.9375em;\n\tfloat: left; }\n\n\t.medium-1 {\n\twidth: 8.33333%; }\n\n\t.medium-2 {\n\twidth: 16.66667%; }\n\n\t.medium-3 {\n\twidth: 25%; }\n\n\t.medium-4 {\n\twidth: 33.33333%; }\n\n\t.medium-5 {\n\twidth: 41.66667%; }\n\n\t.medium-6 {\n\twidth: 50%; }\n\n\t.medium-7 {\n\twidth: 58.33333%; }\n\n\t.medium-8 {\n\twidth: 66.66667%; }\n\n\t.medium-9 {\n\twidth: 75%; }\n\n\t.medium-10 {\n\twidth: 83.33333%; }\n\n\t.medium-11 {\n\twidth: 91.66667%; }\n\n\t.medium-12 {\n\twidth: 100%; }\n\n\t.medium-offset-0 {\n\tmargin-left: 0 !important; }\n\n\t.medium-offset-1 {\n\tmargin-left: 8.33333% !important; }\n\n\t.medium-offset-2 {\n\tmargin-left: 16.66667% !important; }\n\n\t.medium-offset-3 {\n\tmargin-left: 25% !important; }\n\n\t.medium-offset-4 {\n\tmargin-left: 33.33333% !important; }\n\n\t.medium-offset-5 {\n\tmargin-left: 41.66667% !important; }\n\n\t.medium-offset-6 {\n\tmargin-left: 50% !important; }\n\n\t.medium-offset-7 {\n\tmargin-left: 58.33333% !important; }\n\n\t.medium-offset-8 {\n\tmargin-left: 66.66667% !important; }\n\n\t.medium-offset-9 {\n\tmargin-left: 75% !important; }\n\n\t.medium-offset-10 {\n\tmargin-left: 83.33333% !important; }\n\n\t.medium-offset-11 {\n\tmargin-left: 91.66667% !important; }\n\n\t.medium-reset-order {\n\tfloat: left;\n\tleft: auto;\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tright: auto; }\n\n\t.column.medium-centered,\n\t.columns.medium-centered {\n\tmargin-left: auto;\n\tmargin-right: auto;\n\tfloat: none; }\n\n\t.column.medium-uncentered,\n\t.columns.medium-uncentered {\n\tfloat: left;\n\tmargin-left: 0;\n\tmargin-right: 0; }\n\n\t.column.medium-centered:last-child,\n\t.columns.medium-centered:last-child {\n\tfloat: none; }\n\n\t.column.medium-uncentered:last-child,\n\t.columns.medium-uncentered:last-child {\n\tfloat: left; }\n\n\t.column.medium-uncentered.opposite,\n\t.columns.medium-uncentered.opposite {\n\tfloat: right; }\n\n\t.row.medium-collapse > .column,\n\t.row.medium-collapse > .columns {\n\tpadding-left: 0;\n\tpadding-right: 0; }\n\t.row.medium-collapse .row {\n\tmargin-left: 0;\n\tmargin-right: 0; }\n\t.row.medium-uncollapse > .column,\n\t.row.medium-uncollapse > .columns {\n\tpadding-left: 0.9375em;\n\tpadding-right: 0.9375em;\n\tfloat: left; }\n\n\t.push-0 {\n\tposition: relative;\n\tleft: 0;\n\tright: auto; }\n\n\t.pull-0 {\n\tposition: relative;\n\tright: 0;\n\tleft: auto; }\n\n\t.push-1 {\n\tposition: relative;\n\tleft: 8.33333%;\n\tright: auto; }\n\n\t.pull-1 {\n\tposition: relative;\n\tright: 8.33333%;\n\tleft: auto; }\n\n\t.push-2 {\n\tposition: relative;\n\tleft: 16.66667%;\n\tright: auto; }\n\n\t.pull-2 {\n\tposition: relative;\n\tright: 16.66667%;\n\tleft: auto; }\n\n\t.push-3 {\n\tposition: relative;\n\tleft: 25%;\n\tright: auto; }\n\n\t.pull-3 {\n\tposition: relative;\n\tright: 25%;\n\tleft: auto; }\n\n\t.push-4 {\n\tposition: relative;\n\tleft: 33.33333%;\n\tright: auto; }\n\n\t.pull-4 {\n\tposition: relative;\n\tright: 33.33333%;\n\tleft: auto; }\n\n\t.push-5 {\n\tposition: relative;\n\tleft: 41.66667%;\n\tright: auto; }\n\n\t.pull-5 {\n\tposition: relative;\n\tright: 41.66667%;\n\tleft: auto; }\n\n\t.push-6 {\n\tposition: relative;\n\tleft: 50%;\n\tright: auto; }\n\n\t.pull-6 {\n\tposition: relative;\n\tright: 50%;\n\tleft: auto; }\n\n\t.push-7 {\n\tposition: relative;\n\tleft: 58.33333%;\n\tright: auto; }\n\n\t.pull-7 {\n\tposition: relative;\n\tright: 58.33333%;\n\tleft: auto; }\n\n\t.push-8 {\n\tposition: relative;\n\tleft: 66.66667%;\n\tright: auto; }\n\n\t.pull-8 {\n\tposition: relative;\n\tright: 66.66667%;\n\tleft: auto; }\n\n\t.push-9 {\n\tposition: relative;\n\tleft: 75%;\n\tright: auto; }\n\n\t.pull-9 {\n\tposition: relative;\n\tright: 75%;\n\tleft: auto; }\n\n\t.push-10 {\n\tposition: relative;\n\tleft: 83.33333%;\n\tright: auto; }\n\n\t.pull-10 {\n\tposition: relative;\n\tright: 83.33333%;\n\tleft: auto; }\n\n\t.push-11 {\n\tposition: relative;\n\tleft: 91.66667%;\n\tright: auto; }\n\n\t.pull-11 {\n\tposition: relative;\n\tright: 91.66667%;\n\tleft: auto; } }\n@media only screen and (min-width: 64.0625em) {\n\t.large-push-0 {\n\tposition: relative;\n\tleft: 0;\n\tright: auto; }\n\n\t.large-pull-0 {\n\tposition: relative;\n\tright: 0;\n\tleft: auto; }\n\n\t.large-push-1 {\n\tposition: relative;\n\tleft: 8.33333%;\n\tright: auto; }\n\n\t.large-pull-1 {\n\tposition: relative;\n\tright: 8.33333%;\n\tleft: auto; }\n\n\t.large-push-2 {\n\tposition: relative;\n\tleft: 16.66667%;\n\tright: auto; }\n\n\t.large-pull-2 {\n\tposition: relative;\n\tright: 16.66667%;\n\tleft: auto; }\n\n\t.large-push-3 {\n\tposition: relative;\n\tleft: 25%;\n\tright: auto; }\n\n\t.large-pull-3 {\n\tposition: relative;\n\tright: 25%;\n\tleft: auto; }\n\n\t.large-push-4 {\n\tposition: relative;\n\tleft: 33.33333%;\n\tright: auto; }\n\n\t.large-pull-4 {\n\tposition: relative;\n\tright: 33.33333%;\n\tleft: auto; }\n\n\t.large-push-5 {\n\tposition: relative;\n\tleft: 41.66667%;\n\tright: auto; }\n\n\t.large-pull-5 {\n\tposition: relative;\n\tright: 41.66667%;\n\tleft: auto; }\n\n\t.large-push-6 {\n\tposition: relative;\n\tleft: 50%;\n\tright: auto; }\n\n\t.large-pull-6 {\n\tposition: relative;\n\tright: 50%;\n\tleft: auto; }\n\n\t.large-push-7 {\n\tposition: relative;\n\tleft: 58.33333%;\n\tright: auto; }\n\n\t.large-pull-7 {\n\tposition: relative;\n\tright: 58.33333%;\n\tleft: auto; }\n\n\t.large-push-8 {\n\tposition: relative;\n\tleft: 66.66667%;\n\tright: auto; }\n\n\t.large-pull-8 {\n\tposition: relative;\n\tright: 66.66667%;\n\tleft: auto; }\n\n\t.large-push-9 {\n\tposition: relative;\n\tleft: 75%;\n\tright: auto; }\n\n\t.large-pull-9 {\n\tposition: relative;\n\tright: 75%;\n\tleft: auto; }\n\n\t.large-push-10 {\n\tposition: relative;\n\tleft: 83.33333%;\n\tright: auto; }\n\n\t.large-pull-10 {\n\tposition: relative;\n\tright: 83.33333%;\n\tleft: auto; }\n\n\t.large-push-11 {\n\tposition: relative;\n\tleft: 91.66667%;\n\tright: auto; }\n\n\t.large-pull-11 {\n\tposition: relative;\n\tright: 91.66667%;\n\tleft: auto; }\n\n\t.column,\n\t.columns {\n\tposition: relative;\n\tpadding-left: 0.9375em;\n\tpadding-right: 0.9375em;\n\tfloat: left; }\n\n\t.large-1 {\n\twidth: 8.33333%; }\n\n\t.large-2 {\n\twidth: 16.66667%; }\n\n\t.large-3 {\n\twidth: 25%; }\n\n\t.large-4 {\n\twidth: 33.33333%; }\n\n\t.large-5 {\n\twidth: 41.66667%; }\n\n\t.large-6 {\n\twidth: 50%; }\n\n\t.large-7 {\n\twidth: 58.33333%; }\n\n\t.large-8 {\n\twidth: 66.66667%; }\n\n\t.large-9 {\n\twidth: 75%; }\n\n\t.large-10 {\n\twidth: 83.33333%; }\n\n\t.large-11 {\n\twidth: 91.66667%; }\n\n\t.large-12 {\n\twidth: 100%; }\n\n\t.large-offset-0 {\n\tmargin-left: 0 !important; }\n\n\t.large-offset-1 {\n\tmargin-left: 8.33333% !important; }\n\n\t.large-offset-2 {\n\tmargin-left: 16.66667% !important; }\n\n\t.large-offset-3 {\n\tmargin-left: 25% !important; }\n\n\t.large-offset-4 {\n\tmargin-left: 33.33333% !important; }\n\n\t.large-offset-5 {\n\tmargin-left: 41.66667% !important; }\n\n\t.large-offset-6 {\n\tmargin-left: 50% !important; }\n\n\t.large-offset-7 {\n\tmargin-left: 58.33333% !important; }\n\n\t.large-offset-8 {\n\tmargin-left: 66.66667% !important; }\n\n\t.large-offset-9 {\n\tmargin-left: 75% !important; }\n\n\t.large-offset-10 {\n\tmargin-left: 83.33333% !important; }\n\n\t.large-offset-11 {\n\tmargin-left: 91.66667% !important; }\n\n\t.large-reset-order {\n\tfloat: left;\n\tleft: auto;\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tright: auto; }\n\n\t.column.large-centered,\n\t.columns.large-centered {\n\tmargin-left: auto;\n\tmargin-right: auto;\n\tfloat: none; }\n\n\t.column.large-uncentered,\n\t.columns.large-uncentered {\n\tfloat: left;\n\tmargin-left: 0;\n\tmargin-right: 0; }\n\n\t.column.large-centered:last-child,\n\t.columns.large-centered:last-child {\n\tfloat: none; }\n\n\t.column.large-uncentered:last-child,\n\t.columns.large-uncentered:last-child {\n\tfloat: left; }\n\n\t.column.large-uncentered.opposite,\n\t.columns.large-uncentered.opposite {\n\tfloat: right; }\n\n\t.row.large-collapse > .column,\n\t.row.large-collapse > .columns {\n\tpadding-left: 0;\n\tpadding-right: 0; }\n\t.row.large-collapse .row {\n\tmargin-left: 0;\n\tmargin-right: 0; }\n\t.row.large-uncollapse > .column,\n\t.row.large-uncollapse > .columns {\n\tpadding-left: 0.9375em;\n\tpadding-right: 0.9375em;\n\tfloat: left; }\n\n\t.push-0 {\n\tposition: relative;\n\tleft: 0;\n\tright: auto; }\n\n\t.pull-0 {\n\tposition: relative;\n\tright: 0;\n\tleft: auto; }\n\n\t.push-1 {\n\tposition: relative;\n\tleft: 8.33333%;\n\tright: auto; }\n\n\t.pull-1 {\n\tposition: relative;\n\tright: 8.33333%;\n\tleft: auto; }\n\n\t.push-2 {\n\tposition: relative;\n\tleft: 16.66667%;\n\tright: auto; }\n\n\t.pull-2 {\n\tposition: relative;\n\tright: 16.66667%;\n\tleft: auto; }\n\n\t.push-3 {\n\tposition: relative;\n\tleft: 25%;\n\tright: auto; }\n\n\t.pull-3 {\n\tposition: relative;\n\tright: 25%;\n\tleft: auto; }\n\n\t.push-4 {\n\tposition: relative;\n\tleft: 33.33333%;\n\tright: auto; }\n\n\t.pull-4 {\n\tposition: relative;\n\tright: 33.33333%;\n\tleft: auto; }\n\n\t.push-5 {\n\tposition: relative;\n\tleft: 41.66667%;\n\tright: auto; }\n\n\t.pull-5 {\n\tposition: relative;\n\tright: 41.66667%;\n\tleft: auto; }\n\n\t.push-6 {\n\tposition: relative;\n\tleft: 50%;\n\tright: auto; }\n\n\t.pull-6 {\n\tposition: relative;\n\tright: 50%;\n\tleft: auto; }\n\n\t.push-7 {\n\tposition: relative;\n\tleft: 58.33333%;\n\tright: auto; }\n\n\t.pull-7 {\n\tposition: relative;\n\tright: 58.33333%;\n\tleft: auto; }\n\n\t.push-8 {\n\tposition: relative;\n\tleft: 66.66667%;\n\tright: auto; }\n\n\t.pull-8 {\n\tposition: relative;\n\tright: 66.66667%;\n\tleft: auto; }\n\n\t.push-9 {\n\tposition: relative;\n\tleft: 75%;\n\tright: auto; }\n\n\t.pull-9 {\n\tposition: relative;\n\tright: 75%;\n\tleft: auto; }\n\n\t.push-10 {\n\tposition: relative;\n\tleft: 83.33333%;\n\tright: auto; }\n\n\t.pull-10 {\n\tposition: relative;\n\tright: 83.33333%;\n\tleft: auto; }\n\n\t.push-11 {\n\tposition: relative;\n\tleft: 91.66667%;\n\tright: auto; }\n\n\t.pull-11 {\n\tposition: relative;\n\tright: 91.66667%;\n\tleft: auto; } }\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/assets/css/normalize.css",
    "content": "/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS and IE text size adjust after device orientation change,\n *    without disabling user zoom.\n */\n\nhtml {\n\tfont-family: sans-serif; /* 1 */\n\t-ms-text-size-adjust: 100%; /* 2 */\n\t-webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n\tmargin: 0;\n}\n\n/* HTML5 display definitions\n   ========================================================================== */\n\n/**\n * Correct `block` display not defined for any HTML5 element in IE 8/9.\n * Correct `block` display not defined for `details` or `summary` in IE 10/11\n * and Firefox.\n * Correct `block` display not defined for `main` in IE 11.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n\tdisplay: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n\tdisplay: inline-block; /* 1 */\n\tvertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n\tdisplay: none;\n\theight: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9/10.\n * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n\tdisplay: none;\n}\n\n/* Links\n   ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n\tbackground-color: transparent;\n}\n\n/**\n * Improve readability of focused elements when they are also in an\n * active/hover state.\n */\n\na:active,\na:hover {\n\toutline: 0;\n}\n\n/* Text-level semantics\n   ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n */\n\nabbr[title] {\n\tborder-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n */\n\nb,\nstrong {\n\tfont-weight: bold;\n}\n\n/**\n * Address styling not present in Safari and Chrome.\n */\n\ndfn {\n\tfont-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari, and Chrome.\n */\n\nh1 {\n\tfont-size: 2em;\n\tmargin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n\tbackground: #ff0;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\n/* Embedded content\n   ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9/10.\n */\n\nimg {\n\tborder: 0;\n}\n\n/**\n * Correct overflow not hidden in IE 9/10/11.\n */\n\nsvg:not(:root) {\n\toverflow: hidden;\n}\n\n/* Grouping content\n   ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari.\n */\n\nfigure {\n\tmargin: 0;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n\tbox-sizing: content-box;\n\theight: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n\toverflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n\tfont-family: monospace, monospace;\n\tfont-size: 1em;\n}\n\n/* Forms\n   ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n *    Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tcolor: inherit; /* 1 */\n\tfont: inherit; /* 2 */\n\tmargin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10/11.\n */\n\nbutton {\n\toverflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n\ttext-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n *    `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n\t-webkit-appearance: button; /* 2 */\n\tcursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n\tcursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n\tborder: 0;\n\tpadding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n\tline-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n\tbox-sizing: border-box; /* 1 */\n\tpadding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n */\n\ninput[type=\"search\"] {\n\t-webkit-appearance: textfield; /* 1 */\n\tbox-sizing: content-box; /* 2 */\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n\tborder: 1px solid #c0c0c0;\n\tmargin: 0 2px;\n\tpadding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9/10/11.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n\tborder: 0; /* 1 */\n\tpadding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9/10/11.\n */\n\ntextarea {\n\toverflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n\tfont-weight: bold;\n}\n\n/* Tables\n   ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntd,\nth {\n\tpadding: 0;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/assets/js/superfish.js",
    "content": "/*\n * jQuery Superfish Menu Plugin - v1.7.7\n * Copyright (c) 2015 \n *\n * Dual licensed under the MIT and GPL licenses:\n *\thttp://www.opensource.org/licenses/mit-license.php\n *\thttp://www.gnu.org/licenses/gpl.html\n */\n\n;(function ($, w) {\n\t\"use strict\";\n\n\tvar methods = (function () {\n\t\t// private properties and methods go here\n\t\tvar c = {\n\t\t\t\tbcClass: 'sf-breadcrumb',\n\t\t\t\tmenuClass: 'sf-js-enabled',\n\t\t\t\tanchorClass: 'sf-with-ul',\n\t\t\t\tmenuArrowClass: 'sf-arrows'\n\t\t\t},\n\t\t\tios = (function () {\n\t\t\t\tvar ios = /^(?![\\w\\W]*Windows Phone)[\\w\\W]*(iPhone|iPad|iPod)/i.test(navigator.userAgent);\n\t\t\t\tif (ios) {\n\t\t\t\t\t// tap anywhere on iOS to unfocus a submenu\n\t\t\t\t\t$('html').css('cursor', 'pointer').on('click', $.noop);\n\t\t\t\t}\n\t\t\t\treturn ios;\n\t\t\t})(),\n\t\t\twp7 = (function () {\n\t\t\t\tvar style = document.documentElement.style;\n\t\t\t\treturn ('behavior' in style && 'fill' in style && /iemobile/i.test(navigator.userAgent));\n\t\t\t})(),\n\t\t\tunprefixedPointerEvents = (function () {\n\t\t\t\treturn (!!w.PointerEvent);\n\t\t\t})(),\n\t\t\ttoggleMenuClasses = function ($menu, o) {\n\t\t\t\tvar classes = c.menuClass;\n\t\t\t\tif (o.cssArrows) {\n\t\t\t\t\tclasses += ' ' + c.menuArrowClass;\n\t\t\t\t}\n\t\t\t\t$menu.toggleClass(classes);\n\t\t\t},\n\t\t\tsetPathToCurrent = function ($menu, o) {\n\t\t\t\treturn $menu.find('li.' + o.pathClass).slice(0, o.pathLevels)\n\t\t\t\t\t.addClass(o.hoverClass + ' ' + c.bcClass)\n\t\t\t\t\t\t.filter(function () {\n\t\t\t\t\t\t\treturn ($(this).children(o.popUpSelector).hide().show().length);\n\t\t\t\t\t\t}).removeClass(o.pathClass);\n\t\t\t},\n\t\t\ttoggleAnchorClass = function ($li) {\n\t\t\t\t$li.children('a').toggleClass(c.anchorClass);\n\t\t\t},\n\t\t\ttoggleTouchAction = function ($menu) {\n\t\t\t\tvar msTouchAction = $menu.css('ms-touch-action');\n\t\t\t\tvar touchAction = $menu.css('touch-action');\n\t\t\t\ttouchAction = touchAction || msTouchAction;\n\t\t\t\ttouchAction = (touchAction === 'pan-y') ? 'auto' : 'pan-y';\n\t\t\t\t$menu.css({\n\t\t\t\t\t'ms-touch-action': touchAction,\n\t\t\t\t\t'touch-action': touchAction\n\t\t\t\t});\n\t\t\t},\n\t\t\tapplyHandlers = function ($menu, o) {\n\t\t\t\tvar targets = 'li:has(' + o.popUpSelector + ')';\n\t\t\t\tif ($.fn.hoverIntent && !o.disableHI) {\n\t\t\t\t\t$menu.hoverIntent(over, out, targets);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$menu\n\t\t\t\t\t\t.on('mouseenter.superfish', targets, over)\n\t\t\t\t\t\t.on('mouseleave.superfish', targets, out);\n\t\t\t\t}\n\t\t\t\tvar touchevent = 'MSPointerDown.superfish';\n\t\t\t\tif (unprefixedPointerEvents) {\n\t\t\t\t\ttouchevent = 'pointerdown.superfish';\n\t\t\t\t}\n\t\t\t\tif (!ios) {\n\t\t\t\t\ttouchevent += ' touchend.superfish';\n\t\t\t\t}\n\t\t\t\tif (wp7) {\n\t\t\t\t\ttouchevent += ' mousedown.superfish';\n\t\t\t\t}\n\t\t\t\t$menu\n\t\t\t\t\t.on('focusin.superfish', 'li', over)\n\t\t\t\t\t.on('focusout.superfish', 'li', out)\n\t\t\t\t\t.on(touchevent, 'a', o, touchHandler);\n\t\t\t},\n\t\t\ttouchHandler = function (e) {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\to = getOptions($this),\n\t\t\t\t\t$ul = $this.siblings(e.data.popUpSelector);\n\n\t\t\t\tif (o.onHandleTouch.call($ul) === false) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t\tif ($ul.length > 0 && $ul.is(':hidden')) {\n\t\t\t\t\t$this.one('click.superfish', false);\n\t\t\t\t\tif (e.type === 'MSPointerDown' || e.type === 'pointerdown') {\n\t\t\t\t\t\t$this.trigger('focus');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$.proxy(over, $this.parent('li'))();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tover = function () {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\to = getOptions($this);\n\t\t\t\tclearTimeout(o.sfTimer);\n\t\t\t\t$this.siblings().superfish('hide').end().superfish('show');\n\t\t\t},\n\t\t\tout = function () {\n\t\t\t\tvar $this = $(this),\n\t\t\t\t\to = getOptions($this);\n\t\t\t\tif (ios) {\n\t\t\t\t\t$.proxy(close, $this, o)();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tclearTimeout(o.sfTimer);\n\t\t\t\t\to.sfTimer = setTimeout($.proxy(close, $this, o), o.delay);\n\t\t\t\t}\n\t\t\t},\n\t\t\tclose = function (o) {\n\t\t\t\to.retainPath = ($.inArray(this[0], o.$path) > -1);\n\t\t\t\tthis.superfish('hide');\n\n\t\t\t\tif (!this.parents('.' + o.hoverClass).length) {\n\t\t\t\t\to.onIdle.call(getMenu(this));\n\t\t\t\t\tif (o.$path.length) {\n\t\t\t\t\t\t$.proxy(over, o.$path)();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetMenu = function ($el) {\n\t\t\t\treturn $el.closest('.' + c.menuClass);\n\t\t\t},\n\t\t\tgetOptions = function ($el) {\n\t\t\t\treturn getMenu($el).data('sf-options');\n\t\t\t};\n\n\t\treturn {\n\t\t\t// public methods\n\t\t\thide: function (instant) {\n\t\t\t\tif (this.length) {\n\t\t\t\t\tvar $this = this,\n\t\t\t\t\t\to = getOptions($this);\n\t\t\t\t\tif (!o) {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\t\t\t\t\tvar not = (o.retainPath === true) ? o.$path : '',\n\t\t\t\t\t\t$ul = $this.find('li.' + o.hoverClass).add(this).not(not).removeClass(o.hoverClass).children(o.popUpSelector),\n\t\t\t\t\t\tspeed = o.speedOut;\n\n\t\t\t\t\tif (instant) {\n\t\t\t\t\t\t$ul.show();\n\t\t\t\t\t\tspeed = 0;\n\t\t\t\t\t}\n\t\t\t\t\to.retainPath = false;\n\n\t\t\t\t\tif (o.onBeforeHide.call($ul) === false) {\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t}\n\n\t\t\t\t\t$ul.stop(true, true).animate(o.animationOut, speed, function () {\n\t\t\t\t\t\tvar $this = $(this);\n\t\t\t\t\t\to.onHide.call($this);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tshow: function () {\n\t\t\t\tvar o = getOptions(this);\n\t\t\t\tif (!o) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tvar $this = this.addClass(o.hoverClass),\n\t\t\t\t\t$ul = $this.children(o.popUpSelector);\n\n\t\t\t\tif (o.onBeforeShow.call($ul) === false) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t\t$ul.stop(true, true).animate(o.animation, o.speed, function () {\n\t\t\t\t\to.onShow.call($ul);\n\t\t\t\t});\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdestroy: function () {\n\t\t\t\treturn this.each(function () {\n\t\t\t\t\tvar $this = $(this),\n\t\t\t\t\t\to = $this.data('sf-options'),\n\t\t\t\t\t\t$hasPopUp;\n\t\t\t\t\tif (!o) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t$hasPopUp = $this.find(o.popUpSelector).parent('li');\n\t\t\t\t\tclearTimeout(o.sfTimer);\n\t\t\t\t\ttoggleMenuClasses($this, o);\n\t\t\t\t\ttoggleAnchorClass($hasPopUp);\n\t\t\t\t\ttoggleTouchAction($this);\n\t\t\t\t\t// remove event handlers\n\t\t\t\t\t$this.off('.superfish').off('.hoverIntent');\n\t\t\t\t\t// clear animation's inline display style\n\t\t\t\t\t$hasPopUp.children(o.popUpSelector).attr('style', function (i, style) {\n\t\t\t\t\t\treturn style.replace(/display[^;]+;?/g, '');\n\t\t\t\t\t});\n\t\t\t\t\t// reset 'current' path classes\n\t\t\t\t\to.$path.removeClass(o.hoverClass + ' ' + c.bcClass).addClass(o.pathClass);\n\t\t\t\t\t$this.find('.' + o.hoverClass).removeClass(o.hoverClass);\n\t\t\t\t\to.onDestroy.call($this);\n\t\t\t\t\t$this.removeData('sf-options');\n\t\t\t\t});\n\t\t\t},\n\t\t\tinit: function (op) {\n\t\t\t\treturn this.each(function () {\n\t\t\t\t\tvar $this = $(this);\n\t\t\t\t\tif ($this.data('sf-options')) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tvar o = $.extend({}, $.fn.superfish.defaults, op),\n\t\t\t\t\t\t$hasPopUp = $this.find(o.popUpSelector).parent('li');\n\t\t\t\t\to.$path = setPathToCurrent($this, o);\n\n\t\t\t\t\t$this.data('sf-options', o);\n\n\t\t\t\t\ttoggleMenuClasses($this, o);\n\t\t\t\t\ttoggleAnchorClass($hasPopUp);\n\t\t\t\t\ttoggleTouchAction($this);\n\t\t\t\t\tapplyHandlers($this, o);\n\n\t\t\t\t\t$hasPopUp.not('.' + c.bcClass).superfish('hide', true);\n\n\t\t\t\t\to.onInit.call(this);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t})();\n\n\t$.fn.superfish = function (method, args) {\n\t\tif (methods[method]) {\n\t\t\treturn methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\t\telse if (typeof method === 'object' || ! method) {\n\t\t\treturn methods.init.apply(this, arguments);\n\t\t}\n\t\telse {\n\t\t\treturn $.error('Method ' +  method + ' does not exist on jQuery.fn.superfish');\n\t\t}\n\t};\n\n\t$.fn.superfish.defaults = {\n\t\tpopUpSelector: 'ul,.sf-mega', // within menu context\n\t\thoverClass: 'sfHover',\n\t\tpathClass: 'overrideThisToUse',\n\t\tpathLevels: 1,\n\t\tdelay: 800,\n\t\tanimation: {opacity: 'show'},\n\t\tanimationOut: {opacity: 'hide'},\n\t\tspeed: 'normal',\n\t\tspeedOut: 'fast',\n\t\tcssArrows: true,\n\t\tdisableHI: false,\n\t\tonInit: $.noop,\n\t\tonBeforeShow: $.noop,\n\t\tonShow: $.noop,\n\t\tonBeforeHide: $.noop,\n\t\tonHide: $.noop,\n\t\tonIdle: $.noop,\n\t\tonDestroy: $.noop,\n\t\tonHandleTouch: $.noop\n\t};\n\n})(jQuery, window);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/assets/js/tinynav.js",
    "content": "/*! http://tinynav.viljamis.com v1.2 by @viljamis */\n(function ($, window, i) {\n  $.fn.tinyNav = function (options) {\n\n    // Default settings\n    var settings = $.extend({\n      'active' : 'selected', // String: Set the \"active\" class\n      'header' : '', // String: Specify text for \"header\" and show header instead of the active item\n      'indent' : '- ', // String: Specify text for indenting sub-items\n      'label'  : '' // String: sets the <label> text for the <select> (if not set, no label will be added)\n    }, options);\n\n    return this.each(function () {\n\n      // Used for namespacing\n      i++;\n\n      var $nav = $(this),\n        // Namespacing\n        namespace = 'tinynav',\n        namespace_i = namespace + i,\n        l_namespace_i = '.l_' + namespace_i,\n        $select = $('<select/>').attr(\"id\", namespace_i).addClass(namespace + ' ' + namespace_i);\n\n      if ($nav.is('ul,ol')) {\n\n        if (settings.header !== '') {\n          $select.append(\n            $('<option/>').text(settings.header)\n          );\n        }\n\n        // Build options\n        var options = '';\n\n        $nav\n          .addClass('l_' + namespace_i)\n          .find('a')\n          .each(function () {\n            options += '<option value=\"' + $(this).attr('href') + '\">';\n            var j;\n            for (j = 0; j < $(this).parents('ul, ol').length - 1; j++) {\n              options += settings.indent;\n            }\n            options += $(this).text() + '</option>';\n          });\n\n        // Append options into a select\n        $select.append(options);\n\n        // Select the active item\n        if (!settings.header) {\n          $select\n            .find(':eq(' + $(l_namespace_i + ' li')\n            .index($(l_namespace_i + ' li.' + settings.active)) + ')')\n            .attr('selected', true);\n        }\n\n        // Change window location\n        $select.change(function () {\n          window.location.href = $(this).val();\n        });\n\n        // Inject select\n        $(l_namespace_i).after($select);\n\n        // Inject label\n        if (settings.label) {\n          $select.before(\n            $(\"<label/>\")\n              .attr(\"for\", namespace_i)\n              .addClass(namespace + '_label ' + namespace_i + '_label')\n              .append(settings.label)\n          );\n        }\n\n      }\n\n    });\n\n  };\n})(jQuery, this, 0);\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/classes/class-admin-notices.php",
    "content": "<?php\n/**\n * Class for displaying notices in wp-admin\n *\n * @package zues\n */\n\n/**\n * Admin notice class\n */\nclass Zues_Admin_Notice\n{\n\t/**\n\t * Notice ID\n\t *\n\t * @var int\n\t */\n\tpublic $notice_id = '';\n\n\t/**\n\t * Notice CSS class\n\t *\n\t * @var string\n\t */\n\tpublic $class = '';\n\n\t/**\n\t * The message to be shown\n\t *\n\t * @var string\n\t */\n\tpublic $message = '';\n\n\t/**\n\t * Construct the class\n\t *\n\t * @param int    $notice_id Notice ID.\n\t * @param string $message   Message to be shown.\n\t * @param string $class     Notice class.\n\t */\n\tfunction __construct( $notice_id, $message, $class = 'updated' ) {\n\t\t$this->notice_id = $notice_id;\n\t\t$this->class = $class;\n\t\t$this->message = $message;\n\t\tadd_action( 'admin_notices', array( $this, 'output' ) );\n\t\tadd_action( 'admin_init', array( $this, 'ignore' ) );\n\t\tadd_action( 'admin_head', array( $this, 'css' ) );\n\t}\n\n\t/**\n\t * If user clicks to ignore the notice, add that to their user meta.\n\t */\n\tfunction ignore() {\n\n\t\tglobal $current_user;\n\t\t$user_id = $current_user->ID;\n\n\t\tif ( isset( $_GET[ $this->notice_id ] ) && 'hide' === $_GET[ $this->notice_id ] ) {\n\t\t\tadd_user_meta( $user_id, $this->notice_id, 'true', true );\n\t\t}\n\n\t}\n\n\t/**\n\t * Output the admin notice.\n\t */\n\tfunction output() {\n\n\t\tglobal $current_user;\n\t\t$user_id = $current_user->ID;\n\t\tif ( ! get_user_meta( $user_id, $this->notice_id ) ) {\n\t\t\techo '<div id=\"olympus-message\" class=\"' . esc_attr( $this->class ) .'\"><p>' . esc_html( $this->message );\n\t\t\techo '<span class=\"olympus-dismiss\"><a href=\"?' . esc_attr( $this->notice_id ) . '=hide\">Hide Notice</a></p></span></div>';\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/functions/attr.php",
    "content": "<?php\n/**\n * HTML attribute functions and filters.  The purposes of this is to provide a way for theme/plugin devs\n * to hook into the attributes for specific HTML elements and create new or modify existing attributes.\n * This is sort of like `body_class()`, `post_class()`, and `comment_class()` on steroids.  Plus, it\n * handles attributes for many more elements.  The biggest benefit of using this is to provide richer\n * microdata while being forward compatible with the ever-changing Web.  Currently, the default microdata\n * vocabulary supported is Schema.org.\n *\n * @package    zues\n * @author     Justin Tadlock <justin@justintadlock.com>\n * @copyright  Copyright (c) 2008 - 2015, Justin Tadlock\n * @link       http://themehybrid.com/hybrid-core\n * @license    http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\n */\n\n// Attributes for major structural elements.\nadd_filter( 'zues_attr_body',    'zues_attr_body',    5 );\nadd_filter( 'zues_attr_header',  'zues_attr_header',  5 );\nadd_filter( 'zues_attr_footer',  'zues_attr_footer',  5 );\nadd_filter( 'zues_attr_content', 'zues_attr_content', 5, 2 );\nadd_filter( 'zues_attr_sidebar', 'zues_attr_sidebar', 5, 2 );\nadd_filter( 'zues_attr_menu',    'zues_attr_menu',    5, 2 );\n\n// Header attributes.\nadd_filter( 'zues_attr_head',             'zues_attr_head',             5 );\nadd_filter( 'zues_attr_branding',         'zues_attr_branding',         5 );\nadd_filter( 'zues_attr_site-title',       'zues_attr_site_title',       5 );\nadd_filter( 'zues_attr_site-description', 'zues_attr_site_description', 5 );\n\n// Archive page header attributes.\nadd_filter( 'zues_attr_archive-header',      'zues_attr_archive_header',      5 );\nadd_filter( 'zues_attr_archive-title',       'zues_attr_archive_title',       5 );\nadd_filter( 'zues_attr_archive-description', 'zues_attr_archive_description', 5 );\n\n// Post-specific attributes.\nadd_filter( 'zues_attr_post',            'zues_attr_post',            5 );\nadd_filter( 'zues_attr_entry',           'zues_attr_post',            5 ); // Alternate for \"post\".\nadd_filter( 'zues_attr_entry-title',     'zues_attr_entry_title',     5 );\nadd_filter( 'zues_attr_entry-author',    'zues_attr_entry_author',    5 );\nadd_filter( 'zues_attr_entry-published', 'zues_attr_entry_published', 5 );\nadd_filter( 'zues_attr_entry-content',   'zues_attr_entry_content',   5 );\nadd_filter( 'zues_attr_entry-summary',   'zues_attr_entry_summary',   5 );\nadd_filter( 'zues_attr_entry-terms',     'zues_attr_entry_terms',     5, 2 );\n\n// Comment specific attributes.\nadd_filter( 'zues_attr_comment',           'zues_attr_comment',           5 );\nadd_filter( 'zues_attr_comment-author',    'zues_attr_comment_author',    5 );\nadd_filter( 'zues_attr_comment-published', 'zues_attr_comment_published', 5 );\nadd_filter( 'zues_attr_comment-permalink', 'zues_attr_comment_permalink', 5 );\nadd_filter( 'zues_attr_comment-content',   'zues_attr_comment_content',   5 );\n\n/**\n * Outputs an HTML element's attributes.\n *\n * @param  string $slug     The slug/ID of the element (e.g., 'sidebar').\n * @param  string $context  A specific context (e.g., 'primary').\n * @param  array  $attr     Array of attributes to pass in (overwrites filters).\n * @return void\n */\nfunction zues_attr( $slug, $context = '', $attr = array() ) {\n\techo zues_get_attr( $slug, $context, $attr );\n}\n\n/**\n * Gets an HTML element's attributes.  This function is actually meant to be filtered by theme authors, plugins,\n * or advanced child theme users.  The purpose is to allow folks to modify, remove, or add any attributes they\n * want without having to edit every template file in the theme.  So, one could support microformats instead\n * of microdata, if desired.\n *\n * @param  string $slug     The slug/ID of the element (e.g., 'sidebar').\n * @param  string $context  A specific context (e.g., 'primary').\n * @param  array  $attr     Array of attributes to pass in (overwrites filters).\n * @return string\n */\nfunction zues_get_attr( $slug, $context = '', $attr = array() ) {\n\n\t$out    = '';\n\t$attr   = wp_parse_args( $attr, apply_filters( \"zues_attr_{$slug}\", array(), $context ) );\n\n\tif ( empty( $attr ) ) {\n\t\t$attr['class'] = $slug; }\n\n\tforeach ( $attr as $name => $value ) {\n\t\t$out .= $value ? sprintf( ' %s=\"%s\"', esc_html( $name ), esc_attr( $value ) ) : esc_html( \" {$name}\" ); }\n\n\treturn trim( $out );\n}\n\n/* === Structural === */\n\n/**\n * <body> element attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_body( $attr ) {\n\n\t$attr['class']     = join( ' ', get_body_class() );\n\t$attr['dir']       = is_rtl() ? 'rtl' : 'ltr';\n\t$attr['itemscope'] = 'itemscope';\n\t$attr['itemtype']  = 'http://schema.org/WebPage';\n\n\tif ( is_singular( 'post' ) || is_home() || is_archive() ) {\n\t\t$attr['itemtype'] = 'http://schema.org/Blog'; } elseif ( is_search() )\n\t\t$attr['itemtype'] = 'http://schema.org/SearchResultsPage';\n\n\treturn $attr;\n}\n\n/**\n * Page <header> element attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_header( $attr ) {\n\n\t$attr['class']     = 'site-header';\n\t$attr['role']      = 'banner';\n\t$attr['itemscope'] = 'itemscope';\n\t$attr['itemtype']  = 'http://schema.org/WPHeader';\n\n\treturn $attr;\n}\n\n/**\n * Page <footer> element attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_footer( $attr ) {\n\n\t$attr['class']     = 'site-footer';\n\t$attr['role']      = 'contentinfo';\n\t$attr['itemscope'] = 'itemscope';\n\t$attr['itemtype']  = 'http://schema.org/WPFooter';\n\n\treturn $attr;\n}\n\n/**\n * Main content container of the page attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_content( $attr, $context ) {\n\n\t$attr['class']    = 'content';\n\t$attr['role']     = 'main';\n\n\tif ( $context ) {\n\n\t\t$attr['class'] .= \" content-{$context}\";\n\n\t}\n\n\tif ( ! is_singular( 'post' ) && ! is_home() && ! is_archive() ) {\n\t\t$attr['itemprop'] = 'mainContentOfPage'; }\n\n\treturn $attr;\n}\n\n/**\n * Sidebar attributes.\n *\n * @param  array  $attr\n * @param  string $context\n * @return array\n */\nfunction zues_attr_sidebar( $attr, $context ) {\n\n\t$attr['class'] = 'sidebar';\n\t$attr['role']  = 'complementary';\n\n\tif ( $context ) {\n\n\t\t$attr['class'] .= \" {$context}-sidebar\";\n\n\t\t$sidebar_name = zues_get_sidebar_name( $context );\n\n\t\tif ( $sidebar_name ) {\n\t\t\t// Translators: The %s is the sidebar name. This is used for the 'aria-label' attribute.\n\t\t\t$attr['aria-label'] = esc_attr( sprintf( _x( '%s Sidebar', 'sidebar aria label', 'zues' ), $sidebar_name ) );\n\t\t}\n\t}\n\n\t$attr['itemscope'] = 'itemscope';\n\t$attr['itemtype']  = 'http://schema.org/WPSideBar';\n\n\treturn $attr;\n}\n\n/**\n * Nav menu attributes.\n *\n * @param  array  $attr\n * @param  string $context\n * @return array\n */\nfunction zues_attr_menu( $attr, $context ) {\n\n\t$attr['class'] = 'menu';\n\t$attr['role']  = 'navigation';\n\n\tif ( $context ) {\n\n\t\t$attr['class'] .= \" menu-{$context}\";\n\n\t\t$menu_name = zues_get_menu_location_name( $context );\n\n\t\tif ( $menu_name ) {\n\t\t\t// Translators: The %s is the menu name. This is used for the 'aria-label' attribute.\n\t\t\t$attr['aria-label'] = esc_attr( sprintf( _x( '%s Menu', 'nav menu aria label', 'zues' ), $menu_name ) );\n\t\t}\n\t}\n\n\t$attr['itemscope']  = 'itemscope';\n\t$attr['itemtype']   = 'http://schema.org/SiteNavigationElement';\n\n\treturn $attr;\n}\n\n/* === header === */\n\n/**\n * <head> attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_head( $attr ) {\n\n\t$attr['itemscope'] = 'itemscope';\n\t$attr['itemtype']  = 'http://schema.org/WebSite';\n\n\treturn $attr;\n}\n\n/**\n * Branding (usually a wrapper for title and tagline) attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_branding( $attr ) {\n\n\t$attr['class'] = 'site-branding';\n\n\treturn $attr;\n}\n\n/**\n * Site title attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_site_title( $attr ) {\n\n\t$attr['class']    = 'site-title';\n\t$attr['itemprop'] = 'headline';\n\n\treturn $attr;\n}\n\n/**\n * Site description attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_site_description( $attr ) {\n\n\t$attr['class']    = 'site-description';\n\t$attr['itemprop'] = 'description';\n\n\treturn $attr;\n}\n\n/* === loop === */\n\n/**\n * Archive header attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_archive_header( $attr ) {\n\n\t$attr['class']     = 'archive-header';\n\t$attr['itemscope'] = 'itemscope';\n\t$attr['itemtype']  = 'http://schema.org/WebPageElement';\n\n\treturn $attr;\n}\n\n/**\n * Archive title attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_archive_title( $attr ) {\n\n\t$attr['class']     = 'archive-title';\n\t$attr['itemprop']  = 'headline';\n\n\treturn $attr;\n}\n\n/**\n * Archive description attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_archive_description( $attr ) {\n\n\t$attr['class']     = 'archive-description';\n\t$attr['itemprop']  = 'text';\n\n\treturn $attr;\n}\n\n/* === posts === */\n\n/**\n * Post <article> element attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_post( $attr ) {\n\n\t$post = get_post();\n\n\t// Make sure we have a real post first.\n\tif ( ! empty( $post ) ) {\n\n\t\t$attr['id']        = 'post-' . get_the_ID();\n\t\t$attr['class']     = join( ' ', get_post_class() );\n\t\t$attr['itemscope'] = 'itemscope';\n\n\t\tif ( 'post' === get_post_type() ) {\n\n\t\t\t$attr['itemtype']  = 'http://schema.org/BlogPosting';\n\n\t\t\t/* Add itemprop if within the main query. */\n\t\t\tif ( is_main_query() && ! is_search() ) {\n\t\t\t\t$attr['itemprop'] = 'blogPost'; }\n\t\t} elseif ( 'attachment' === get_post_type() && wp_attachment_is_image() ) {\n\n\t\t\t$attr['itemtype'] = 'http://schema.org/ImageObject';\n\t\t} else {\n\t\t\t$attr['itemtype']  = 'http://schema.org/CreativeWork';\n\t\t}\n\t} else {\n\n\t\t$attr['id']    = 'post-0';\n\t\t$attr['class'] = join( ' ', get_post_class() );\n\t}\n\n\treturn $attr;\n}\n\n/**\n * Post title attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_entry_title( $attr ) {\n\n\t$attr['class']    = 'entry-title';\n\t$attr['itemprop'] = 'headline';\n\n\treturn $attr;\n}\n\n/**\n * Post author attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_entry_author( $attr ) {\n\n\t$attr['class']     = 'entry-author';\n\t$attr['itemprop']  = 'author';\n\t$attr['itemscope'] = 'itemscope';\n\t$attr['itemtype']  = 'http://schema.org/Person';\n\n\treturn $attr;\n}\n\n/**\n * Post time/published attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_entry_published( $attr ) {\n\n\t$attr['class']    = 'entry-published updated';\n\t$attr['datetime'] = get_the_time( 'Y-m-d\\TH:i:sP' );\n\t$attr['itemprop'] = 'datePublished';\n\n\t// Translators: Post date/time \"title\" attribute.\n\t$attr['title']    = get_the_time( _x( 'l, F j, Y, g:i a', 'post time format', 'zues' ) );\n\n\treturn $attr;\n}\n\n/**\n * Post content (not excerpt) attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_entry_content( $attr ) {\n\n\t$attr['class'] = 'entry-content';\n\n\tif ( 'post' === get_post_type() ) {\n\t\t$attr['itemprop'] = 'idBody';\n\t} else { \t\t$attr['itemprop'] = 'text'; }\n\n\treturn $attr;\n}\n\n/**\n * Post summary/excerpt attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_entry_summary( $attr ) {\n\n\t$attr['class']    = 'entry-summary';\n\t$attr['itemprop'] = 'description';\n\n\treturn $attr;\n}\n\n/**\n * Post terms (tags, categories, etc.) attributes.\n *\n * @param  array  $attr\n * @param  string $context\n * @return array\n */\nfunction zues_attr_entry_terms( $attr, $context ) {\n\n\tif ( ! empty( $context ) ) {\n\n\t\t$attr['class'] = 'entry-terms ' . sanitize_html_class( $context );\n\n\t\tif ( 'category' === $context ) {\n\t\t\t$attr['itemprop'] = 'articleSection'; } else if ( 'post_tag' === $context ) {\n\t\t\t$attr['itemprop'] = 'keywords'; }\n\t}\n\n\treturn $attr;\n}\n\n\n/* === Comment elements === */\n\n\n/**\n * Comment wrapper attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_comment( $attr ) {\n\n\t$attr['id']    = 'comment-' . get_comment_ID();\n\t$attr['class'] = join( ' ', get_comment_class() );\n\n\tif ( in_array( get_comment_type(), array( '', 'comment' ) ) ) {\n\n\t\t$attr['itemprop']  = 'comment';\n\t\t$attr['itemscope'] = 'itemscope';\n\t\t$attr['itemtype']  = 'http://schema.org/Comment';\n\t}\n\n\treturn $attr;\n}\n\n/**\n * Comment author attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_comment_author( $attr ) {\n\n\t$attr['class']     = 'comment-author';\n\t$attr['itemprop']  = 'author';\n\t$attr['itemscope'] = 'itemscope';\n\t$attr['itemtype']  = 'http://schema.org/Person';\n\n\treturn $attr;\n}\n\n/**\n * Comment time/published attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_comment_published( $attr ) {\n\n\t$attr['class']    = 'comment-published';\n\t$attr['datetime'] = get_comment_time( 'Y-m-d\\TH:i:sP' );\n\n\t// Translators: Comment date/time \"title\" attribute.\n\t$attr['title']    = get_comment_time( _x( 'l, F j, Y, g:i a', 'comment time format', 'zues' ) );\n\t$attr['itemprop'] = 'datePublished';\n\n\treturn $attr;\n}\n\n/**\n * Comment permalink attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_comment_permalink( $attr ) {\n\n\t$attr['class']    = 'comment-permalink';\n\t$attr['href']     = get_comment_link();\n\t$attr['itemprop'] = 'url';\n\n\treturn $attr;\n}\n\n/**\n * Comment content/text attributes.\n *\n * @param  array $attr\n * @return array\n */\nfunction zues_attr_comment_content( $attr ) {\n\n\t$attr['class']    = 'comment-content';\n\t$attr['itemprop'] = 'text';\n\n\treturn $attr;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/functions/generate-css.php",
    "content": "<?php\n/**\n * Functions for outputting CSS.\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_generate_css' ) ) {\n\t/**\n\t * Generate CSS code\n\t *\n\t * @param  string  $selector  The CSS selector.\n\t * @param  string  $style     The property to be styled.\n\t * @param  string  $mod_name  The style value.\n\t * @param  string  $prefix    Optional prefix before value.\n\t * @param  string  $postfix  Optional postfix after value.\n\t * @param  boolean $echo     Option to echo or return generated CSS code.\n\t * @return string            Returned CSS code.\n\t */\n\tfunction zues_generate_css( $selector, $style, $mod_name, $prefix = '', $postfix = '', $echo = true ) {\n\n\t\t$return = '';\n\n\t\t$mod = get_theme_mod( $mod_name );\n\n\t\tif ( ! empty( $mod ) ) {\n\t\t\t$return = sprintf(\n\t\t\t\t'%s { %s:%s; }',\n\t\t\t\t$selector,\n\t\t\t\t$style,\n\t\t\t\t$prefix.$mod.$postfix\n\t\t\t);\n\t\t\tif ( $echo ) {\n\t\t\t\techo $return;\n\t\t\t}\n\t\t}\n\t\treturn $return;\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/functions/helpers.php",
    "content": "<?php\n/**\n * Zues helper functions\n *\n * @package zues\n */\n\n/**\n * Has the theme just been activated\n *\n * @return bool\n */\nfunction zues_is_theme_activated() {\n\tglobal $pagenow;\n\n\tif ( is_admin() && isset( $_GET['activated'] ) && $pagenow === 'themes.php' ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n/**\n * Automatically loads all .php files in a directory\n * @param string $dir\n * @todo check against child theme\n */\nfunction zues_autoloader( $dir ) {\n\n\t$full_dir = ZUES_THEME_DIR . $dir;\n\tforeach ( glob( $full_dir.'*.php' ) as $filename ) {\n\t\tinclude $filename; }\n\n}\n\n/**\n * Check if sidebar is active, if it is then display it.\n * @param string $id\n */\nfunction zues_widget_area( $id ) {\n\n\tif ( is_active_sidebar( $id ) ) {\n\t\techo '<div class=\"widget-area '. $id .'\">';\n\t\t\t     dynamic_sidebar( $id );\n\t\techo '</div>';\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/functions/template-tags.php",
    "content": "<?php\n/**\n * Zues Core - A WordPress theme development framework.\n *\n * @package zues\n */\n\n/**\n * Adds custom classes to the array of body classes.\n *\n * @param  array $classes Classes for the body element.\n * @return array\n */\nfunction zues_body_classes( $classes ) {\n\t// Adds a class of group-blog to blogs with more than 1 published author.\n\tif ( is_multi_author() ) {\n\t\t$classes[] = 'group-blog';\n\t}\n\n\tif ( get_header_image() ) {\n\t\t$classes[] = 'has-logo';\n\t}\n\n\tif ( is_page_template( 'page-templates/page-full-width.php' ) ) {\n\t\t$classes[] = 'page-full-width';\n\t}\n\n\treturn $classes;\n}\nadd_filter( 'body_class', 'zues_body_classes' );\n\n/**\n * Add theme support for Infinite Scroll.\n * See: https://jetpack.me/support/infinite-scroll/\n */\nfunction zues_jetpack_setup() {\n\tadd_theme_support(\n\t\t'infinite-scroll', array(\n\t\t'container' => 'main',\n\t\t'render'    => 'ZUES_CORE_infinite_scroll_render',\n\t\t'footer'    => 'page',\n\t\t)\n\t);\n} // end function ZUES_CORE_jetpack_setup\nadd_action( 'after_setup_theme', 'zues_jetpack_setup' );\n\n/**\n * Flush out the transients used in ZUES_CORE_categorized_blog.\n */\nfunction zues_category_transient_flusher() {\n\tif ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {\n\t\treturn;\n\t}\n\t// Like, beat it. Dig?\n\tdelete_transient( 'zues_categories' );\n}\nadd_action( 'edit_category', 'zues_category_transient_flusher' );\nadd_action( 'save_post',     'zues_category_transient_flusher' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/functions/templates.php",
    "content": "<?php\n/**\n * Zues template functions\n *\n * @package zues\n */\n\n/**\n * Return a list of available header templates.\n *\n * @return  array The list of templates.\n * @todo  check against child theme\n */\nfunction zues_get_headers() {\n\n\trequire_once( ABSPATH . 'wp-admin/includes/file.php' );\n\n\tWP_Filesystem();\n\n\tglobal $wp_filesystem;\n\n\t$header_templates = array();\n\n\t$dir = THEME_DIR . '/template-parts/headers/';\n\n\tif ( is_dir( $dir ) ) {\n\n\t\tif ( $dh = opendir( $dir ) ) {\n\n\t\t\twhile ( ($file = readdir( $dh )) !== false ) {\n\t\t\t\tif ( '.' !== $file && '..' !== $file ) {\n\n\t\t\t\t\tif ( ! preg_match( '|Header Name:(.*)$|mi', $wp_filesystem->get_contents( $dir.$file ), $header ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$header_templates[ $file ] = _cleanup_header_comment( $header[1] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclosedir( $dh );\n\t\t}\n\n\t\treturn $header_templates;\n\t}\n\n}\n\n\t/**\n\t * Return a list of available footer templates.\n\t *\n\t * @return  array The list of templates.\n\t */\nfunction zues_get_footers() {\n\n\trequire_once( ABSPATH . 'wp-admin/includes/file.php' );\n\n\tWP_Filesystem();\n\n\tglobal $wp_filesystem;\n\n\t$footers_templates = array();\n\n\t$dir = THEME_DIR . '/template-parts/footers/';\n\n\tif ( is_dir( $dir ) ) {\n\n\t\tif ( $dh = opendir( $dir ) ) {\n\n\t\t\twhile ( ($file = readdir( $dh )) !== false ) {\n\t\t\t\tif ( '.' !== $file && '..' !== $file ) {\n\n\t\t\t\t\tif ( ! preg_match( '|Footer Name:(.*)$|mi', $wp_filesystem->get_contents( $dir.$file ), $header ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t$footer_templates[ $file ] = _cleanup_header_comment( $header[1] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclosedir( $dh );\n\t\t}\n\n\t\treturn $footer_templates;\n\t}\n\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/functions/widget-areas.php",
    "content": "<?php\n/**\n * Helper functions for working with the WordPress sidebar system.  Currently, the framework creates a\n * simple function for registering HTML5-ready sidebars instead of the default WordPress unordered lists.\n *\n * @package    HybridCore\n * @subpackage Functions\n * @author     Justin Tadlock <justin@justintadlock.com>\n * @copyright  Copyright (c) 2008 - 2014, Justin Tadlock\n * @link       http://themehybrid.com/hybrid-core\n * @license    http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\n */\n\nif ( ! function_exists( 'zues_register_widget_area' ) ) {\n\t/**\n\t * Wrapper function for WordPress' register_sidebar() function.  This function exists so that theme authors\n\t * can more quickly register sidebars with an HTML5 structure instead of having to write the same code\n\t * over and over.  Theme authors are also expected to pass in the ID, name, and description of the sidebar.\n\t * This function can handle the rest at that point.\n\t *\n\t * @since  2.0.0\n\t * @access public\n\t * @param  array $args Arguements used to build widget.\n\t * @return string  Sidebar ID.\n\t */\n\tfunction zues_register_widget_area( $args ) {\n\n\t\t/* Set up some default sidebar arguments. */\n\t\t$defaults = array(\n\t\t'id'            => '',\n\t\t'name'          => '',\n\t\t'description'   => '',\n\t\t'before_widget' => '<section id=\"%1$s\" class=\"widget %2$s\">',\n\t\t'after_widget'  => '</section><!-- .widget -->',\n\t\t'before_title'  => '<h3 class=\"widget-title\">',\n\t\t'after_title'   => '</h3>',\n\t\t);\n\n\t\t/* Parse the arguments. */\n\t\t$args = wp_parse_args( $args, $defaults );\n\n\t\t/* Remove action. */\n\t\tremove_action( 'widgets_init', '__return_false', 95 );\n\n\t\t/* Register the sidebar. */\n\t\treturn register_sidebar( $args );\n\t}\n}\n\n/* Compatibility for when a theme doesn't register any sidebars. */\nadd_action( 'widgets_init', '__return_false', 95 );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/init.php",
    "content": "<?php\n/**\n * Zues Framework - A WordPress theme development framework.\n *\n * @package   zues\n * @version   1.0.0\n * @author    Danny Cooper <email@dannycooper.com\n * @copyright Copyright (c) 2008 - 2015, Danny Cooper\n * @link      https://olympusthemes.com/zues\n * @license   http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\n */\n\n /**\n  * Fires before the zues framework\n  */\ndo_action('zues_before');\n\n/**\n * The main class that loads all zues core framework files.\n */\nclass Zues_Framework {\n\t/**\n\t * Get everything started.\n\t */\n\tfunction __construct() {\n\n\t\t$this->constants();\n\t\t$this->functions();\n\t\t$this->structure();\n\t\t$this->admin();\n\n\t\tadd_action( 'wp_enqueue_scripts', array( $this, 'styles' ) );\n\n\t}\n\n\t/**\n\t * Define the framework constants\n\t */\n\tfunction constants() {\n\n\t\t/* Sets the framework version number. */\n\t\tdefine( 'ZUES_FRAMEWORK_VERSION', '1.0.0' );\n\n\t\t/* Sets the path to the parent theme directory. */\n\t\tdefine( 'ZUES_THEME_DIR', get_template_directory() );\n\n\t\t/* Sets the path to the parent theme directory URI. */\n\t\tdefine( 'ZUES_THEME_URI', get_template_directory_uri() );\n\n\t\t/* Sets the path to the child theme directory. */\n\t\tdefine( 'ZUES_CHILD_THEME_DIR', get_stylesheet_directory() );\n\n\t\t/* Sets the path to the child theme directory URI. */\n\t\tdefine( 'ZUES_CHILD_THEME_URI', get_stylesheet_directory_uri() );\n\n\t\t/* Sets the path to the child theme directory. */\n\t\tdefine( 'ZUES_FRAMEWORK_DIR', ZUES_THEME_DIR . '/zues-framework' );\n\n\t\t/* Sets the path to the child theme directory URI. */\n\t\tdefine( 'ZUES_FRAMEWORK_URI', ZUES_THEME_URI . '/zues-framework' );\n\n\t}\n\n\t/**\n\t * Load the core functions/classes required by the rest of the framework.\n\t */\n\tfunction functions() {\n\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/functions/template-tags.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/functions/widget-areas.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/functions/generate-css.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/functions/attr.php';\n\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/functions/templates.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/functions/helpers.php';\n\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/libraries/customizer/customizer-library.php';\n\n\t}\n\n\t/**\n\t * Load the functions relating to the theme structure.\n\t */\n\tfunction structure() {\n\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/wrapper.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/general.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/header.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/primary-nav.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/post.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/page.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/comments.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/sidebar.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/footer.php';\n\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/hooks.php';\n\t\tinclude_once ZUES_FRAMEWORK_DIR . '/structure/filters.php';\n\n\t\t/**\n\t\t * Automatically load all widgets in specified directory\n\t\t *\n\t\t * @see zues-framework/functions/helpers.php:77\n\t\t */\n\t\tzues_autoloader( '/template-parts/widgets/' );\n\n\t}\n\n\t/**\n\t * Register and enqueue core stylesheets.\n\t */\n\tfunction styles() {\n\n\t\twp_enqueue_style( 'olympus-reset', ZUES_FRAMEWORK_URI . '/assets/css/normalize.css' );\n\t\twp_enqueue_style( 'olympus-base', ZUES_FRAMEWORK_URI . '/assets/css/base.css' );\n\n\t\twp_enqueue_script( 'superfish', ZUES_FRAMEWORK_URI . '/assets/js/superfish.js', array( 'jquery' ), '', true );\n\t\twp_enqueue_script( 'tinynav', ZUES_FRAMEWORK_URI . '/assets/js/tinynav.js', array( 'jquery' ), '', true );\n\n\t\t// Register Font Awesome incase we want to use it later\n\t\twp_register_style( 'font-awesome', ZUES_FRAMEWORK_URI . '/assets/css/font-awesome.css' );\n\n\t}\n\n\t/**\n\t * Load the functions/classes to be used within wp-admin.\n\t */\n\tfunction admin() {\n\n\t\tif ( defined('USE_ZUES_ADMIN_NOTICES') ) {\n\n\t\t\t// Class for generating admin notices\n\t\t\tinclude_once ZUES_FRAMEWORK_DIR . '/classes/class-admin-notices.php';\n\n\t\t}\n\n\t\tif ( defined('USE_ZUES_CUSTOMIZER') ) {\n\n\t\t\t// Class for required/recommend plugin notification and installation.\n\t\t\tinclude_once ZUES_FRAMEWORK_DIR . '/libraries/customizer/customizer-library.php';\n\n\t\t}\n\n\t\tif ( defined('USE_TGMPA') ) {\n\n\t\t\t// Class for required/recommend plugin notification and installation.\n\t\t\tinclude_once ZUES_FRAMEWORK_DIR . '/libraries/TGMPA/class-tgm-plugin-activation.php';\n\n\t\t}\n\n\t}\n}\n\n$zues_framework = new Zues_Framework();\n\n/*\n * Fires after the zues framework\n */\ndo_action('zues_end');\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/TGMPA/class-tgm-plugin-activation.php",
    "content": "<?php\n/**\n * Plugin installation and activation for WordPress themes.\n *\n * Please note that this is a drop-in library for a theme or plugin.\n * The authors of this library (Thomas, Gary and Juliette) are NOT responsible\n * for the support of your plugin or theme. Please contact the plugin\n * or theme author for support.\n *\n * @package   TGM-Plugin-Activation\n * @version   2.5.2\n * @link      http://tgmpluginactivation.com/\n * @author    Thomas Griffin, Gary Jones, Juliette Reinders Folmer\n * @copyright Copyright (c) 2011, Thomas Griffin\n * @license   GPL-2.0+\n *\n * @wordpress-plugin\n * Plugin Name: TGM Plugin Activation\n * Plugin URI:\n * Description: Plugin installation and activation for WordPress themes.\n * Version:     2.5.2\n * Author:      Thomas Griffin, Gary Jones, Juliette Reinders Folmer\n * Author URI:  http://tgmpluginactivation.com/\n * Text Domain: tgmpa\n * Domain Path: /languages/\n * Copyright:   2011, Thomas Griffin\n */\n\n/*\n\tCopyright 2011 Thomas Griffin (thomasgriffinmedia.com)\n\n\tThis program is free software; you can redistribute it and/or modify\n\tit under the terms of the GNU General Public License, version 2, as\n\tpublished by the Free Software Foundation.\n\n\tThis program is distributed in the hope that it will be useful,\n\tbut WITHOUT ANY WARRANTY; without even the implied warranty of\n\tMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\tGNU General Public License for more details.\n\n\tYou should have received a copy of the GNU General Public License\n\talong with this program; if not, write to the Free Software\n\tFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\n*/\n\nif ( ! class_exists( 'TGM_Plugin_Activation' ) ) {\n\n\t/**\n\t * Automatic plugin installation and activation library.\n\t *\n\t * Creates a way to automatically install and activate plugins from within themes.\n\t * The plugins can be either bundled, downloaded from the WordPress\n\t * Plugin Repository or downloaded from another external source.\n\t *\n\t * @since 1.0.0\n\t *\n\t * @package TGM-Plugin-Activation\n\t * @author  Thomas Griffin\n\t * @author  Gary Jones\n\t */\n\tclass TGM_Plugin_Activation {\n\t\t/**\n\t\t * TGMPA version number.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @const string Version number.\n\t\t */\n\t\tconst TGMPA_VERSION = '2.5.2';\n\n\t\t/**\n\t\t * Regular expression to test if a URL is a WP plugin repo URL.\n\t\t *\n\t\t * @const string Regex.\n\t\t *\n\t\t * @since 2.5.0\n\t\t */\n\t\tconst WP_REPO_REGEX = '|^http[s]?://wordpress\\.org/(?:extend/)?plugins/|';\n\n\t\t/**\n\t\t * Arbitrary regular expression to test if a string starts with a URL.\n\t\t *\n\t\t * @const string Regex.\n\t\t *\n\t\t * @since 2.5.0\n\t\t */\n\t\tconst IS_URL_REGEX = '|^http[s]?://|';\n\n\t\t/**\n\t\t * Holds a copy of itself, so it can be referenced by the class name.\n\t\t *\n\t\t * @since 1.0.0\n\t\t *\n\t\t * @var TGM_Plugin_Activation\n\t\t */\n\t\tpublic static $instance;\n\n\t\t/**\n\t\t * Holds arrays of plugin details.\n\t\t *\n\t\t * @since 1.0.0\n\t\t *\n\t\t * @since 2.5.0 the array has the plugin slug as an associative key.\n\t\t *\n\t\t * @var array\n\t\t */\n\t\tpublic $plugins = array();\n\n\t\t/**\n\t\t * Holds arrays of plugin names to use to sort the plugins array.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @var array\n\t\t */\n\t\tprotected $sort_order = array();\n\n\t\t/**\n\t\t * Whether any plugins have the 'force_activation' setting set to true.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @var bool\n\t\t */\n\t\tprotected $has_forced_activation = false;\n\n\t\t/**\n\t\t * Whether any plugins have the 'force_deactivation' setting set to true.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @var bool\n\t\t */\n\t\tprotected $has_forced_deactivation = false;\n\n\t\t/**\n\t\t * Name of the unique ID to hash notices.\n\t\t *\n\t\t * @since 2.4.0\n\t\t *\n\t\t * @var string\n\t\t */\n\t\tpublic $id = 'zues';\n\n\t\t/**\n\t\t * Name of the query-string argument for the admin page.\n\t\t *\n\t\t * @since 1.0.0\n\t\t *\n\t\t * @var string\n\t\t */\n\t\tprotected $menu = 'tgmpa-install-plugins';\n\n\t\t/**\n\t\t * Menu function for adding TGMPA dependency plugins page.\n\t\t *\n\t\t * The default of `add_theme_page` means it will appear under the\n\t\t * Appearance menu.\n\t\t *\n\t\t * @var string\n\t\t */\n\t\tpublic $menu_function = 'add_theme_page';\n\n\t\t/**\n\t\t * Capability needed to view the plugin installation menu item.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @var string\n\t\t */\n\t\tpublic $capability = 'edit_theme_options';\n\n\t\t/**\n\t\t * Default absolute path to folder containing bundled plugin zip files.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @var string Absolute path prefix to zip file location for bundled plugins. Default is empty string.\n\t\t */\n\t\tpublic $default_path = '';\n\n\t\t/**\n\t\t * Flag to show admin notices or not.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @var boolean\n\t\t */\n\t\tpublic $has_notices = true;\n\n\t\t/**\n\t\t * Flag to determine if the user can dismiss the notice nag.\n\t\t *\n\t\t * @since 2.4.0\n\t\t *\n\t\t * @var boolean\n\t\t */\n\t\tpublic $dismissable = true;\n\n\t\t/**\n\t\t * Message to be output above nag notice if dismissable is false.\n\t\t *\n\t\t * @since 2.4.0\n\t\t *\n\t\t * @var string\n\t\t */\n\t\tpublic $dismiss_msg = '';\n\n\t\t/**\n\t\t * Flag to set automatic activation of plugins. Off by default.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @var boolean\n\t\t */\n\t\tpublic $is_automatic = false;\n\n\t\t/**\n\t\t * Optional message to display before the plugins table.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @var string Message filtered by wp_kses_post(). Default is empty string.\n\t\t */\n\t\tpublic $message = '';\n\n\t\t/**\n\t\t * Holds configurable array of strings.\n\t\t *\n\t\t * Default values are added in the constructor.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @var array\n\t\t */\n\t\tpublic $strings = array();\n\n\t\t/**\n\t\t * Holds the version of WordPress.\n\t\t *\n\t\t * @since 2.4.0\n\t\t *\n\t\t * @var int\n\t\t */\n\t\tpublic $wp_version;\n\n\t\t/**\n\t\t * Holds the hook name for the admin page.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @var string\n\t\t */\n\t\tpublic $page_hook;\n\n\t\t/**\n\t\t * Adds a reference of this object to $instance, populates default strings,\n\t\t * does the tgmpa_init action hook, and hooks in the interactions to init.\n\t\t *\n\t\t * @internal This method should be `protected`, but as too many TGMPA implementations\n\t\t * haven't upgraded beyond v2.3.6 yet, this gives backward compatibility issues.\n\t\t * Reverted back to public for the time being.\n\t\t *\n\t\t * @since 1.0.0\n\t\t *\n\t\t * @see TGM_Plugin_Activation::init()\n\t\t */\n\t\tpublic function __construct() {\n\t\t\t// Set the current WordPress version.\n\t\t\t$this->wp_version = $GLOBALS['wp_version'];\n\n\t\t\t// Announce that the class is ready, and pass the object (for advanced use).\n\t\t\tdo_action_ref_array( 'tgmpa_init', array( $this ) );\n\n\t\t\t// When the rest of WP has loaded, kick-start the rest of the class.\n\t\t\tadd_action( 'init', array( $this, 'init' ) );\n\t\t}\n\n\t\t/**\n\t\t * Magic method to (not) set protected properties from outside of this class.\n\t\t *\n\t\t * @internal hackedihack... There is a serious bug in v2.3.2 - 2.3.6  where the `menu` property\n\t\t * is being assigned rather than tested in a conditional, effectively rendering it useless.\n\t\t * This 'hack' prevents this from happening.\n\t\t *\n\t\t * @see https://github.com/TGMPA/TGM-Plugin-Activation/blob/2.3.6/tgm-plugin-activation/class-tgm-plugin-activation.php#L1593\n\t\t *\n\t\t * @param string $name  Name of an inaccessible property.\n\t\t * @param mixed  $value Value to assign to the property.\n\t\t * @return void  Silently fail to set the property when this is tried from outside of this class context.\n\t\t *               (Inside this class context, the __set() method if not used as there is direct access.)\n\t\t */\n\t\tpublic function __set( $name, $value ) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Magic method to get the value of a protected property outside of this class context.\n\t\t *\n\t\t * @param string $name Name of an inaccessible property.\n\t\t * @return mixed The property value.\n\t\t */\n\t\tpublic function __get( $name ) {\n\t\t\treturn $this->{$name};\n\t\t}\n\n\t\t/**\n\t\t * Initialise the interactions between this class and WordPress.\n\t\t *\n\t\t * Hooks in three new methods for the class: admin_menu, notices and styles.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @see TGM_Plugin_Activation::admin_menu()\n\t\t * @see TGM_Plugin_Activation::notices()\n\t\t * @see TGM_Plugin_Activation::styles()\n\t\t */\n\t\tpublic function init() {\n\t\t\t/**\n\t\t\t * By default TGMPA only loads on the WP back-end and not in an Ajax call. Using this filter\n\t\t\t * you can overrule that behaviour.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t *\n\t\t\t * @param bool $load Whether or not TGMPA should load.\n\t\t\t *                   Defaults to the return of `is_admin() && ! defined( 'DOING_AJAX' )`.\n\t\t\t */\n\t\t\tif ( true !== apply_filters( 'tgmpa_load', ( is_admin() && ! defined( 'DOING_AJAX' ) ) ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Load class strings.\n\t\t\t$this->strings = array(\n\t\t\t\t'page_title'                      => __( 'Install Required Plugins', 'zues' ),\n\t\t\t\t'menu_title'                      => __( 'Install Plugins', 'zues' ),\n\t\t\t\t'installing'                      => __( 'Installing Plugin: %s', 'zues' ),\n\t\t\t\t'oops'                            => __( 'Something went wrong with the plugin API.', 'zues' ),\n\t\t\t\t'notice_can_install_required'     => _n_noop(\n\t\t\t\t\t'This theme requires the following plugin: %1$s.',\n\t\t\t\t\t'This theme requires the following plugins: %1$s.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'notice_can_install_recommended'  => _n_noop(\n\t\t\t\t\t'This theme recommends the following plugin: %1$s.',\n\t\t\t\t\t'This theme recommends the following plugins: %1$s.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'notice_cannot_install'           => _n_noop(\n\t\t\t\t\t'Sorry, but you do not have the correct permissions to install the %1$s plugin.',\n\t\t\t\t\t'Sorry, but you do not have the correct permissions to install the %1$s plugins.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'notice_ask_to_update'            => _n_noop(\n\t\t\t\t\t'The following plugin needs to be updated to its latest version to ensure maximum compatibility with this theme: %1$s.',\n\t\t\t\t\t'The following plugins need to be updated to their latest version to ensure maximum compatibility with this theme: %1$s.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'notice_ask_to_update_maybe'      => _n_noop(\n\t\t\t\t\t'There is an update available for: %1$s.',\n\t\t\t\t\t'There are updates available for the following plugins: %1$s.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'notice_cannot_update'            => _n_noop(\n\t\t\t\t\t'Sorry, but you do not have the correct permissions to update the %1$s plugin.',\n\t\t\t\t\t'Sorry, but you do not have the correct permissions to update the %1$s plugins.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'notice_can_activate_required'    => _n_noop(\n\t\t\t\t\t'The following required plugin is currently inactive: %1$s.',\n\t\t\t\t\t'The following required plugins are currently inactive: %1$s.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'notice_can_activate_recommended' => _n_noop(\n\t\t\t\t\t'The following recommended plugin is currently inactive: %1$s.',\n\t\t\t\t\t'The following recommended plugins are currently inactive: %1$s.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'notice_cannot_activate'          => _n_noop(\n\t\t\t\t\t'Sorry, but you do not have the correct permissions to activate the %1$s plugin.',\n\t\t\t\t\t'Sorry, but you do not have the correct permissions to activate the %1$s plugins.',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'install_link'                    => _n_noop(\n\t\t\t\t\t'Begin installing plugin',\n\t\t\t\t\t'Begin installing plugins',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'update_link'                     => _n_noop(\n\t\t\t\t\t'Begin updating plugin',\n\t\t\t\t\t'Begin updating plugins',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'activate_link'                   => _n_noop(\n\t\t\t\t\t'Begin activating plugin',\n\t\t\t\t\t'Begin activating plugins',\n\t\t\t\t\t'zues'\n\t\t\t\t),\n\t\t\t\t'return'                          => __( 'Return to Required Plugins Installer', 'zues' ),\n\t\t\t\t'dashboard'                       => __( 'Return to the dashboard', 'zues' ),\n\t\t\t\t'plugin_activated'                => __( 'Plugin activated successfully.', 'zues' ),\n\t\t\t\t'activated_successfully'          => __( 'The following plugin was activated successfully:', 'zues' ),\n\t\t\t\t'plugin_already_active'           => __( 'No action taken. Plugin %1$s was already active.', 'zues' ),\n\t\t\t\t'plugin_needs_higher_version'     => __( 'Plugin not activated. A higher version of %s is needed for this theme. Please update the plugin.', 'zues' ),\n\t\t\t\t'complete'                        => __( 'All plugins installed and activated successfully. %1$s', 'zues' ),\n\t\t\t\t'dismiss'                         => __( 'Dismiss this notice', 'zues' ),\n\t\t\t\t'contact_admin'                   => __( 'Please contact the administrator of this site for help.', 'zues' ),\n\t\t\t);\n\n\t\t\tdo_action( 'tgmpa_register' );\n\n\t\t\t/* After this point, the plugins should be registered and the configuration set. */\n\n\t\t\t// Proceed only if we have plugins to handle.\n\t\t\tif ( empty( $this->plugins ) || ! is_array( $this->plugins ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set up the menu and notices if we still have outstanding actions.\n\t\t\tif ( true !== $this->is_tgmpa_complete() ) {\n\t\t\t\t// Sort the plugins.\n\t\t\t\tarray_multisort( $this->sort_order, SORT_ASC, $this->plugins );\n\n\t\t\t\tadd_action( 'admin_menu', array( $this, 'admin_menu' ) );\n\t\t\t\tadd_action( 'admin_head', array( $this, 'dismiss' ) );\n\n\t\t\t\t// Prevent the normal links from showing underneath a single install/update page.\n\t\t\t\tadd_filter( 'install_plugin_complete_actions', array( $this, 'actions' ) );\n\t\t\t\tadd_filter( 'update_plugin_complete_actions', array( $this, 'actions' ) );\n\n\t\t\t\tif ( $this->has_notices ) {\n\t\t\t\t\tadd_action( 'admin_notices', array( $this, 'notices' ) );\n\t\t\t\t\tadd_action( 'admin_init', array( $this, 'admin_init' ), 1 );\n\t\t\t\t\tadd_action( 'admin_enqueue_scripts', array( $this, 'thickbox' ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If needed, filter plugin action links.\n\t\t\tadd_action( 'load-plugins.php', array( $this, 'add_plugin_action_link_filters' ), 1 );\n\n\t\t\t// Make sure things get reset on switch theme.\n\t\t\tadd_action( 'switch_theme', array( $this, 'flush_plugins_cache' ) );\n\n\t\t\tif ( $this->has_notices ) {\n\t\t\t\tadd_action( 'switch_theme', array( $this, 'update_dismiss' ) );\n\t\t\t}\n\n\t\t\t// Setup the force activation hook.\n\t\t\tif ( true === $this->has_forced_activation ) {\n\t\t\t\tadd_action( 'admin_init', array( $this, 'force_activation' ) );\n\t\t\t}\n\n\t\t\t// Setup the force deactivation hook.\n\t\t\tif ( true === $this->has_forced_deactivation ) {\n\t\t\t\tadd_action( 'switch_theme', array( $this, 'force_deactivation' ) );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Hook in plugin action link filters for the WP native plugins page.\n\t\t *\n\t\t * - Prevent activation of plugins which don't meet the minimum version requirements.\n\t\t * - Prevent deactivation of force-activated plugins.\n\t\t * - Add update notice if update available.\n\t\t *\n\t\t * @since 2.5.0\n\t\t */\n\t\tpublic function add_plugin_action_link_filters() {\n\t\t\tforeach ( $this->plugins as $slug => $plugin ) {\n\t\t\t\tif ( false === $this->can_plugin_activate( $slug ) ) {\n\t\t\t\t\tadd_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_activate' ), 20 );\n\t\t\t\t}\n\n\t\t\t\tif ( true === $plugin['force_activation'] ) {\n\t\t\t\t\tadd_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_deactivate' ), 20 );\n\t\t\t\t}\n\n\t\t\t\tif ( false !== $this->does_plugin_require_update( $slug ) ) {\n\t\t\t\t\tadd_filter( 'plugin_action_links_' . $plugin['file_path'], array( $this, 'filter_plugin_action_links_update' ), 20 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Remove the 'Activate' link on the WP native plugins page if the plugin does not meet the\n\t\t * minimum version requirements.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $actions Action links.\n\t\t * @return array\n\t\t */\n\t\tpublic function filter_plugin_action_links_activate( $actions ) {\n\t\t\tunset( $actions['activate'] );\n\n\t\t\treturn $actions;\n\t\t}\n\n\t\t/**\n\t\t * Remove the 'Deactivate' link on the WP native plugins page if the plugin has been set to force activate.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $actions Action links.\n\t\t * @return array\n\t\t */\n\t\tpublic function filter_plugin_action_links_deactivate( $actions ) {\n\t\t\tunset( $actions['deactivate'] );\n\n\t\t\treturn $actions;\n\t\t}\n\n\t\t/**\n\t\t * Add a 'Requires update' link on the WP native plugins page if the plugin does not meet the\n\t\t * minimum version requirements.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $actions Action links.\n\t\t * @return array\n\t\t */\n\t\tpublic function filter_plugin_action_links_update( $actions ) {\n\t\t\t$actions['update'] = sprintf(\n\t\t\t\t'<a href=\"%1$s\" title=\"%2$s\" class=\"edit\">%3$s</a>',\n\t\t\t\tesc_url( $this->get_tgmpa_status_url( 'update' ) ),\n\t\t\t\tesc_attr__( 'This plugin needs to be updated to be compatible with your theme.', 'zues' ),\n\t\t\t\tesc_html__( 'Update Required', 'zues' )\n\t\t\t);\n\n\t\t\treturn $actions;\n\t\t}\n\n\t\t/**\n\t\t * Handles calls to show plugin information via links in the notices.\n\t\t *\n\t\t * We get the links in the admin notices to point to the TGMPA page, rather\n\t\t * than the typical plugin-install.php file, so we can prepare everything\n\t\t * beforehand.\n\t\t *\n\t\t * WP does not make it easy to show the plugin information in the thickbox -\n\t\t * here we have to require a file that includes a function that does the\n\t\t * main work of displaying it, enqueue some styles, set up some globals and\n\t\t * finally call that function before exiting.\n\t\t *\n\t\t * Down right easy once you know how...\n\t\t *\n\t\t * Returns early if not the TGMPA page.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @global string $tab Used as iframe div class names, helps with styling\n\t\t * @global string $body_id Used as the iframe body ID, helps with styling\n\t\t *\n\t\t * @return null Returns early if not the TGMPA page.\n\t\t */\n\t\tpublic function admin_init() {\n\t\t\tif ( ! $this->is_tgmpa_page() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isset( $_REQUEST['tab'] ) && 'plugin-information' === $_REQUEST['tab'] ) {\n\t\t\t\t// Needed for install_plugin_information().\n\t\t\t\trequire_once ABSPATH . 'wp-admin/includes/plugin-install.php';\n\n\t\t\t\twp_enqueue_style( 'plugin-install' );\n\n\t\t\t\tglobal $tab, $body_id;\n\t\t\t\t$body_id = 'plugin-information';\n\t\t\t\t// @codingStandardsIgnoreStart\n\t\t\t\t$tab     = 'plugin-information';\n\t\t\t\t// @codingStandardsIgnoreEnd\n\n\t\t\t\tinstall_plugin_information();\n\n\t\t\t\texit;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Enqueue thickbox scripts/styles for plugin info.\n\t\t *\n\t\t * Thickbox is not automatically included on all admin pages, so we must\n\t\t * manually enqueue it for those pages.\n\t\t *\n\t\t * Thickbox is only loaded if the user has not dismissed the admin\n\t\t * notice or if there are any plugins left to install and activate.\n\t\t *\n\t\t * @since 2.1.0\n\t\t */\n\t\tpublic function thickbox() {\n\t\t\tif ( ! get_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, true ) ) {\n\t\t\t\tadd_thickbox();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Adds submenu page if there are plugin actions to take.\n\t\t *\n\t\t * This method adds the submenu page letting users know that a required\n\t\t * plugin needs to be installed.\n\t\t *\n\t\t * This page disappears once the plugin has been installed and activated.\n\t\t *\n\t\t * @since 1.0.0\n\t\t *\n\t\t * @see TGM_Plugin_Activation::init()\n\t\t * @see TGM_Plugin_Activation::install_plugins_page()\n\t\t *\n\t\t * @return null Return early if user lacks capability to install a plugin.\n\t\t */\n\t\tpublic function admin_menu() {\n\t\t\t// Make sure privileges are correct to see the page.\n\t\t\tif ( ! current_user_can( 'install_plugins' ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$args = apply_filters(\n\t\t\t\t'tgmpa_admin_menu_args',\n\t\t\t\tarray(\n\t\t\t\t\t'menu_function' => $this->menu_function,                   // Menu location function.\n\t\t\t\t\t'page_title'    => $this->strings['page_title'],           // Page title.\n\t\t\t\t\t'menu_title'    => $this->strings['menu_title'],           // Menu title.\n\t\t\t\t\t'capability'    => $this->capability,                      // Capability.\n\t\t\t\t\t'menu_slug'     => $this->menu,                            // Menu slug.\n\t\t\t\t\t'function'      => array( $this, 'install_plugins_page' ), // Callback.\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t$this->add_admin_menu( $args );\n\t\t}\n\n\t\t/**\n\t\t * Add the menu item.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $args Menu item configuration.\n\t\t */\n\t\tprotected function add_admin_menu( array $args ) {\n\t\t\tif ( has_filter( 'tgmpa_admin_menu_use_add_theme_page' ) ) {\n\t\t\t\t_deprecated_function( 'The \"tgmpa_admin_menu_use_add_theme_page\" filter', '2.5.0', esc_html__( 'Set the menu_function config variable instead.', 'zues' ) );\n\t\t\t}\n\n\t\t\t$this->page_hook = $this->menu_location( $args['page_title'], $args['menu_title'], $args['capability'], $args['menu_slug'], $args['function'] );\n\t\t}\n\n\t\t/**\n\t\t * Echoes plugin installation form.\n\t\t *\n\t\t * This method is the callback for the admin_menu method function.\n\t\t * This displays the admin page and form area where the user can select to install and activate the plugin.\n\t\t * Aborts early if we're processing a plugin installation action.\n\t\t *\n\t\t * @since 1.0.0\n\t\t *\n\t\t * @return null Aborts early if we're processing a plugin installation action.\n\t\t */\n\t\tpublic function install_plugins_page() {\n\t\t\t// Store new instance of plugin table in object.\n\t\t\t$plugin_table = new TGMPA_List_Table;\n\n\t\t\t// Return early if processing a plugin installation action.\n\t\t\tif ( ( ( 'tgmpa-bulk-install' === $plugin_table->current_action() || 'tgmpa-bulk-update' === $plugin_table->current_action() ) && $plugin_table->process_bulk_actions() ) || $this->do_plugin_install() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Force refresh of available plugin information so we'll know about manual updates/deletes.\n\t\t\twp_clean_plugins_cache( false );\n\n\t\t\t?>\n\t\t\t<div class=\"tgmpa wrap\">\n\t\t\t\t<h2><?php echo esc_html( get_admin_page_title() ); ?></h2>\n\t\t\t\t<?php $plugin_table->prepare_items(); ?>\n\n\t\t\t\t<?php\n\t\t\t\tif ( ! empty( $this->message ) && is_string( $this->message ) ) {\n\t\t\t\t\techo wp_kses_post( $this->message );\n\t\t\t\t}\n\t\t\t\t?>\n\t\t\t\t<?php $plugin_table->views(); ?>\n\n\t\t\t\t<form id=\"tgmpa-plugins\" action=\"\" method=\"post\">\n\t\t\t\t\t<input type=\"hidden\" name=\"tgmpa-page\" value=\"<?php echo esc_attr( $this->menu ); ?>\" />\n\t\t\t\t\t<input type=\"hidden\" name=\"plugin_status\" value=\"<?php echo esc_attr( $plugin_table->view_context ); ?>\" />\n\t\t\t\t\t<?php $plugin_table->display(); ?>\n\t\t\t\t</form>\n\t\t\t</div>\n\t\t\t<?php\n\t\t}\n\n\t\t/**\n\t\t * Installs, updates or activates a plugin depending on the action link clicked by the user.\n\t\t *\n\t\t * Checks the $_GET variable to see which actions have been\n\t\t * passed and responds with the appropriate method.\n\t\t *\n\t\t * Uses WP_Filesystem to process and handle the plugin installation\n\t\t * method.\n\t\t *\n\t\t * @since 1.0.0\n\t\t *\n\t\t * @uses WP_Filesystem\n\t\t * @uses WP_Error\n\t\t * @uses WP_Upgrader\n\t\t * @uses Plugin_Upgrader\n\t\t * @uses Plugin_Installer_Skin\n\t\t * @uses Plugin_Upgrader_Skin\n\t\t *\n\t\t * @return boolean True on success, false on failure.\n\t\t */\n\t\tprotected function do_plugin_install() {\n\t\t\tif ( empty( $_GET['plugin'] ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// All plugin information will be stored in an array for processing.\n\t\t\t$slug = $this->sanitize_key( urldecode( $_GET['plugin'] ) );\n\n\t\t\tif ( ! isset( $this->plugins[ $slug ] ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Was an install or upgrade action link clicked?\n\t\t\tif ( ( isset( $_GET['tgmpa-install'] ) && 'install-plugin' === $_GET['tgmpa-install'] ) || ( isset( $_GET['tgmpa-update'] ) && 'update-plugin' === $_GET['tgmpa-update'] ) ) {\n\n\t\t\t\t$install_type = 'install';\n\t\t\t\tif ( isset( $_GET['tgmpa-update'] ) && 'update-plugin' === $_GET['tgmpa-update'] ) {\n\t\t\t\t\t$install_type = 'update';\n\t\t\t\t}\n\n\t\t\t\tcheck_admin_referer( 'tgmpa-' . $install_type, 'tgmpa-nonce' );\n\n\t\t\t\t// Pass necessary information via URL if WP_Filesystem is needed.\n\t\t\t\t$url = wp_nonce_url(\n\t\t\t\t\tadd_query_arg(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t'plugin'                 => urlencode( $slug ),\n\t\t\t\t\t\t\t'tgmpa-' . $install_type => $install_type . '-plugin',\n\t\t\t\t\t\t),\n\t\t\t\t\t\t$this->get_tgmpa_url()\n\t\t\t\t\t),\n\t\t\t\t\t'tgmpa-' . $install_type,\n\t\t\t\t\t'tgmpa-nonce'\n\t\t\t\t);\n\n\t\t\t\t$method = ''; // Leave blank so WP_Filesystem can populate it as necessary.\n\n\t\t\t\tif ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, array() ) ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tif ( ! WP_Filesystem( $creds ) ) {\n\t\t\t\t\trequest_filesystem_credentials( esc_url_raw( $url ), $method, true, false, array() ); // Setup WP_Filesystem.\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t/* If we arrive here, we have the filesystem. */\n\n\t\t\t\t// Prep variables for Plugin_Installer_Skin class.\n\t\t\t\t$extra         = array();\n\t\t\t\t$extra['slug'] = $slug; // Needed for potentially renaming of directory name.\n\t\t\t\t$source        = $this->get_download_url( $slug );\n\t\t\t\t$api           = ( 'repo' === $this->plugins[ $slug ]['source_type'] ) ? $this->get_plugins_api( $slug ) : null;\n\t\t\t\t$api           = ( false !== $api ) ? $api : null;\n\n\t\t\t\t$url = add_query_arg(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'action' => $install_type . '-plugin',\n\t\t\t\t\t\t'plugin' => urlencode( $slug ),\n\t\t\t\t\t),\n\t\t\t\t\t'update.php'\n\t\t\t\t);\n\n\t\t\t\tif ( ! class_exists( 'Plugin_Upgrader', false ) ) {\n\t\t\t\t\trequire_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';\n\t\t\t\t}\n\n\t\t\t\t$skin_args = array(\n\t\t\t\t\t'type'   => ( 'bundled' !== $this->plugins[ $slug ]['source_type'] ) ? 'web' : 'upload',\n\t\t\t\t\t'title'  => sprintf( $this->strings['installing'], $this->plugins[ $slug ]['name'] ),\n\t\t\t\t\t'url'    => esc_url_raw( $url ),\n\t\t\t\t\t'nonce'  => $install_type . '-plugin_' . $slug,\n\t\t\t\t\t'plugin' => '',\n\t\t\t\t\t'api'    => $api,\n\t\t\t\t\t'extra'  => $extra,\n\t\t\t\t);\n\n\t\t\t\tif ( 'update' === $install_type ) {\n\t\t\t\t\t$skin_args['plugin'] = $this->plugins[ $slug ]['file_path'];\n\t\t\t\t\t$skin                = new Plugin_Upgrader_Skin( $skin_args );\n\t\t\t\t} else {\n\t\t\t\t\t$skin = new Plugin_Installer_Skin( $skin_args );\n\t\t\t\t}\n\n\t\t\t\t// Create a new instance of Plugin_Upgrader.\n\t\t\t\t$upgrader = new Plugin_Upgrader( $skin );\n\n\t\t\t\t// Perform the action and install the plugin from the $source urldecode().\n\t\t\t\tadd_filter( 'upgrader_source_selection', array( $this, 'maybe_adjust_source_dir' ), 1, 3 );\n\n\t\t\t\tif ( 'update' === $install_type ) {\n\t\t\t\t\t// Inject our info into the update transient.\n\t\t\t\t\t$to_inject                    = array( $slug => $this->plugins[ $slug ] );\n\t\t\t\t\t$to_inject[ $slug ]['source'] = $source;\n\t\t\t\t\t$this->inject_update_info( $to_inject );\n\n\t\t\t\t\t$upgrader->upgrade( $this->plugins[ $slug ]['file_path'] );\n\t\t\t\t} else {\n\t\t\t\t\t$upgrader->install( $source );\n\t\t\t\t}\n\n\t\t\t\tremove_filter( 'upgrader_source_selection', array( $this, 'maybe_adjust_source_dir' ), 1, 3 );\n\n\t\t\t\t// Make sure we have the correct file path now the plugin is installed/updated.\n\t\t\t\t$this->populate_file_path( $slug );\n\n\t\t\t\t// Only activate plugins if the config option is set to true and the plugin isn't\n\t\t\t\t// already active (upgrade).\n\t\t\t\tif ( $this->is_automatic && ! $this->is_plugin_active( $slug ) ) {\n\t\t\t\t\t$plugin_activate = $upgrader->plugin_info(); // Grab the plugin info from the Plugin_Upgrader method.\n\t\t\t\t\tif ( false === $this->activate_single_plugin( $plugin_activate, $slug, true ) ) {\n\t\t\t\t\t\treturn true; // Finish execution of the function early as we encountered an error.\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t$this->show_tgmpa_version();\n\n\t\t\t\t// Display message based on if all plugins are now active or not.\n\t\t\t\tif ( $this->is_tgmpa_complete() ) {\n\t\t\t\t\techo '<p>', sprintf( esc_html( $this->strings['complete'] ), '<a href=\"' . esc_url( self_admin_url() ) . '\">' . esc_html__( 'Return to the Dashboard', 'zues' ) . '</a>' ), '</p>';\n\t\t\t\t\techo '<style type=\"text/css\">#adminmenu .wp-submenu li.current { display: none !important; }</style>';\n\t\t\t\t} else {\n\t\t\t\t\techo '<p><a href=\"', esc_url( $this->get_tgmpa_url() ), '\" target=\"_parent\">', esc_html( $this->strings['return'] ), '</a></p>';\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t} elseif ( isset( $this->plugins[ $slug ]['file_path'], $_GET['tgmpa-activate'] ) && 'activate-plugin' === $_GET['tgmpa-activate'] ) {\n\t\t\t\t// Activate action link was clicked.\n\t\t\t\tcheck_admin_referer( 'tgmpa-activate', 'tgmpa-nonce' );\n\n\t\t\t\tif ( false === $this->activate_single_plugin( $this->plugins[ $slug ]['file_path'], $slug ) ) {\n\t\t\t\t\treturn true; // Finish execution of the function early as we encountered an error.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Inject information into the 'update_plugins' site transient as WP checks that before running an update.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $plugins The plugin information for the plugins which are to be updated.\n\t\t */\n\t\tpublic function inject_update_info( $plugins ) {\n\t\t\t$repo_updates = get_site_transient( 'update_plugins' );\n\n\t\t\tif ( ! is_object( $repo_updates ) ) {\n\t\t\t\t$repo_updates = new stdClass;\n\t\t\t}\n\n\t\t\tforeach ( $plugins as $slug => $plugin ) {\n\t\t\t\t$file_path = $plugin['file_path'];\n\n\t\t\t\tif ( empty( $repo_updates->response[ $file_path ] ) ) {\n\t\t\t\t\t$repo_updates->response[ $file_path ] = new stdClass;\n\t\t\t\t}\n\n\t\t\t\t// We only really need to set package, but let's do all we can in case WP changes something.\n\t\t\t\t$repo_updates->response[ $file_path ]->slug        = $slug;\n\t\t\t\t$repo_updates->response[ $file_path ]->plugin      = $file_path;\n\t\t\t\t$repo_updates->response[ $file_path ]->new_version = $plugin['version'];\n\t\t\t\t$repo_updates->response[ $file_path ]->package     = $plugin['source'];\n\t\t\t\tif ( empty( $repo_updates->response[ $file_path ]->url ) && ! empty( $plugin['external_url'] ) ) {\n\t\t\t\t\t$repo_updates->response[ $file_path ]->url = $plugin['external_url'];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tset_site_transient( 'update_plugins', $repo_updates );\n\t\t}\n\n\t\t/**\n\t\t * Adjust the plugin directory name if necessary.\n\t\t *\n\t\t * The final destination directory of a plugin is based on the subdirectory name found in the\n\t\t * (un)zipped source. In some cases - most notably GitHub repository plugin downloads -, this\n\t\t * subdirectory name is not the same as the expected slug and the plugin will not be recognized\n\t\t * as installed. This is fixed by adjusting the temporary unzipped source subdirectory name to\n\t\t * the expected plugin slug.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string       $source        Path to upgrade/zip-file-name.tmp/subdirectory/.\n\t\t * @param string       $remote_source Path to upgrade/zip-file-name.tmp.\n\t\t * @param \\WP_Upgrader $upgrader      Instance of the upgrader which installs the plugin.\n\t\t * @return string $source\n\t\t */\n\t\tpublic function maybe_adjust_source_dir( $source, $remote_source, $upgrader ) {\n\t\t\tif ( ! $this->is_tgmpa_page() || ! is_object( $GLOBALS['wp_filesystem'] ) ) {\n\t\t\t\treturn $source;\n\t\t\t}\n\n\t\t\t// Check for single file plugins.\n\t\t\t$source_files = array_keys( $GLOBALS['wp_filesystem']->dirlist( $remote_source ) );\n\t\t\tif ( 1 === count( $source_files ) && false === $GLOBALS['wp_filesystem']->is_dir( $source ) ) {\n\t\t\t\treturn $source;\n\t\t\t}\n\n\t\t\t// Multi-file plugin, let's see if the directory is correctly named.\n\t\t\t$desired_slug = '';\n\n\t\t\t// Figure out what the slug is supposed to be.\n\t\t\tif ( false === $upgrader->bulk && ! empty( $upgrader->skin->options['extra']['slug'] ) ) {\n\t\t\t\t$desired_slug = $upgrader->skin->options['extra']['slug'];\n\t\t\t} else {\n\t\t\t\t// Bulk installer contains less info, so fall back on the info registered here.\n\t\t\t\tforeach ( $this->plugins as $slug => $plugin ) {\n\t\t\t\t\tif ( ! empty( $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) && $plugin['name'] === $upgrader->skin->plugin_names[ $upgrader->skin->i ] ) {\n\t\t\t\t\t\t$desired_slug = $slug;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset( $slug, $plugin );\n\t\t\t}\n\n\t\t\tif ( ! empty( $desired_slug ) ) {\n\t\t\t\t$subdir_name = untrailingslashit( str_replace( trailingslashit( $remote_source ), '', $source ) );\n\n\t\t\t\tif ( ! empty( $subdir_name ) && $subdir_name !== $desired_slug ) {\n\t\t\t\t\t$from = untrailingslashit( $source );\n\t\t\t\t\t$to   = trailingslashit( $remote_source ) . $desired_slug;\n\n\t\t\t\t\tif ( true === $GLOBALS['wp_filesystem']->move( $from, $to ) ) {\n\t\t\t\t\t\treturn trailingslashit( $to );\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn new WP_Error( 'rename_failed', esc_html__( 'The remote plugin package does not contain a folder with the desired slug and renaming did not work.', 'zues' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'zues' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) );\n\t\t\t\t\t}\n\t\t\t\t} elseif ( empty( $subdir_name ) ) {\n\t\t\t\t\treturn new WP_Error( 'packaged_wrong', esc_html__( 'The remote plugin package consists of more than one file, but the files are not packaged in a folder.', 'zues' ) . ' ' . esc_html__( 'Please contact the plugin provider and ask them to package their plugin according to the WordPress guidelines.', 'zues' ), array( 'found' => $subdir_name, 'expected' => $desired_slug ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $source;\n\t\t}\n\n\t\t/**\n\t\t * Activate a single plugin and send feedback about the result to the screen.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $file_path Path within wp-plugins/ to main plugin file.\n\t\t * @param string $slug      Plugin slug.\n\t\t * @param bool   $automatic Whether this is an automatic activation after an install. Defaults to false.\n\t\t *                          This determines the styling of the output messages.\n\t\t * @return bool False if an error was encountered, true otherwise.\n\t\t */\n\t\tprotected function activate_single_plugin( $file_path, $slug, $automatic = false ) {\n\t\t\tif ( $this->can_plugin_activate( $slug ) ) {\n\t\t\t\t$activate = activate_plugin( $file_path );\n\n\t\t\t\tif ( is_wp_error( $activate ) ) {\n\t\t\t\t\techo '<div id=\"message\" class=\"error\"><p>', wp_kses_post( $activate->get_error_message() ), '</p></div>',\n\t\t\t\t\t\t'<p><a href=\"', esc_url( $this->get_tgmpa_url() ), '\" target=\"_parent\">', esc_html( $this->strings['return'] ), '</a></p>';\n\n\t\t\t\t\treturn false; // End it here if there is an error with activation.\n\t\t\t\t} else {\n\t\t\t\t\tif ( ! $automatic ) {\n\t\t\t\t\t\t// Make sure message doesn't display again if bulk activation is performed\n\t\t\t\t\t\t// immediately after a single activation.\n\t\t\t\t\t\tif ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK.\n\t\t\t\t\t\t\techo '<div id=\"message\" class=\"updated\"><p>', esc_html( $this->strings['activated_successfully'] ), ' <strong>', esc_html( $this->plugins[ $slug ]['name'] ), '.</strong></p></div>';\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Simpler message layout for use on the plugin install page.\n\t\t\t\t\t\techo '<p>', esc_html( $this->strings['plugin_activated'] ), '</p>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} elseif ( $this->is_plugin_active( $slug ) ) {\n\t\t\t\t// No simpler message format provided as this message should never be encountered\n\t\t\t\t// on the plugin install page.\n\t\t\t\techo '<div id=\"message\" class=\"error\"><p>',\n\t\t\t\t\tsprintf(\n\t\t\t\t\t\tesc_html( $this->strings['plugin_already_active'] ),\n\t\t\t\t\t\t'<strong>' . esc_html( $this->plugins[ $slug ]['name'] ) . '</strong>'\n\t\t\t\t\t),\n\t\t\t\t\t'</p></div>';\n\t\t\t} elseif ( $this->does_plugin_require_update( $slug ) ) {\n\t\t\t\tif ( ! $automatic ) {\n\t\t\t\t\t// Make sure message doesn't display again if bulk activation is performed\n\t\t\t\t\t// immediately after a single activation.\n\t\t\t\t\tif ( ! isset( $_POST['action'] ) ) { // WPCS: CSRF OK.\n\t\t\t\t\t\techo '<div id=\"message\" class=\"error\"><p>',\n\t\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\t\tesc_html( $this->strings['plugin_needs_higher_version'] ),\n\t\t\t\t\t\t\t\t'<strong>' . esc_html( $this->plugins[ $slug ]['name'] ) . '</strong>'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t'</p></div>';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Simpler message layout for use on the plugin install page.\n\t\t\t\t\techo '<p>', sprintf( esc_html( $this->strings['plugin_needs_higher_version'] ), esc_html( $this->plugins[ $slug ]['name'] ) ), '</p>';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Echoes required plugin notice.\n\t\t *\n\t\t * Outputs a message telling users that a specific plugin is required for\n\t\t * their theme. If appropriate, it includes a link to the form page where\n\t\t * users can install and activate the plugin.\n\t\t *\n\t\t * Returns early if we're on the Install page.\n\t\t *\n\t\t * @since 1.0.0\n\t\t *\n\t\t * @global object $current_screen\n\t\t *\n\t\t * @return null Returns early if we're on the Install page.\n\t\t */\n\t\tpublic function notices() {\n\t\t\t// Remove nag on the install page / Return early if the nag message has been dismissed.\n\t\t\tif ( $this->is_tgmpa_page() || get_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, true ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Store for the plugin slugs by message type.\n\t\t\t$message = array();\n\n\t\t\t// Initialize counters used to determine plurality of action link texts.\n\t\t\t$install_link_count  = 0;\n\t\t\t$update_link_count   = 0;\n\t\t\t$activate_link_count = 0;\n\n\t\t\tforeach ( $this->plugins as $slug => $plugin ) {\n\t\t\t\tif ( $this->is_plugin_active( $slug ) && false === $this->does_plugin_have_update( $slug ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( ! $this->is_plugin_installed( $slug ) ) {\n\t\t\t\t\tif ( current_user_can( 'install_plugins' ) ) {\n\t\t\t\t\t\t$install_link_count++;\n\n\t\t\t\t\t\tif ( true === $plugin['required'] ) {\n\t\t\t\t\t\t\t$message['notice_can_install_required'][] = $slug;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$message['notice_can_install_recommended'][] = $slug;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Need higher privileges to install the plugin.\n\t\t\t\t\t\t$message['notice_cannot_install'][] = $slug;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif ( ! $this->is_plugin_active( $slug ) && $this->can_plugin_activate( $slug ) ) {\n\t\t\t\t\t\tif ( current_user_can( 'activate_plugins' ) ) {\n\t\t\t\t\t\t\t$activate_link_count++;\n\n\t\t\t\t\t\t\tif ( true === $plugin['required'] ) {\n\t\t\t\t\t\t\t\t$message['notice_can_activate_required'][] = $slug;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$message['notice_can_activate_recommended'][] = $slug;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Need higher privileges to activate the plugin.\n\t\t\t\t\t\t\t$message['notice_cannot_activate'][] = $slug;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( $this->does_plugin_require_update( $slug ) || false !== $this->does_plugin_have_update( $slug ) ) {\n\n\t\t\t\t\t\tif ( current_user_can( 'install_plugins' ) ) {\n\t\t\t\t\t\t\t$update_link_count++;\n\n\t\t\t\t\t\t\tif ( $this->does_plugin_require_update( $slug ) ) {\n\t\t\t\t\t\t\t\t$message['notice_ask_to_update'][] = $slug;\n\t\t\t\t\t\t\t} elseif ( false !== $this->does_plugin_have_update( $slug ) ) {\n\t\t\t\t\t\t\t\t$message['notice_ask_to_update_maybe'][] = $slug;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Need higher privileges to update the plugin.\n\t\t\t\t\t\t\t$message['notice_cannot_update'][] = $slug;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tunset( $slug, $plugin );\n\n\t\t\t// If we have notices to display, we move forward.\n\t\t\tif ( ! empty( $message ) ) {\n\t\t\t\tkrsort( $message ); // Sort messages.\n\t\t\t\t$rendered = '';\n\n\t\t\t\t// As add_settings_error() wraps the final message in a <p> and as the final message can't be\n\t\t\t\t// filtered, using <p>'s in our html would render invalid html output.\n\t\t\t\t$line_template = '<span style=\"display: block; margin: 0.5em 0.5em 0 0; clear: both;\">%s</span>' . \"\\n\";\n\n\t\t\t\t// If dismissable is false and a message is set, output it now.\n\t\t\t\tif ( ! $this->dismissable && ! empty( $this->dismiss_msg ) ) {\n\t\t\t\t\t$rendered .= sprintf( $line_template, wp_kses_post( $this->dismiss_msg ) );\n\t\t\t\t}\n\n\t\t\t\t// Render the individual message lines for the notice.\n\t\t\t\tforeach ( $message as $type => $plugin_group ) {\n\t\t\t\t\t$linked_plugins = array();\n\n\t\t\t\t\t// Get the external info link for a plugin if one is available.\n\t\t\t\t\tforeach ( $plugin_group as $plugin_slug ) {\n\t\t\t\t\t\t$linked_plugins[] = $this->get_info_link( $plugin_slug );\n\t\t\t\t\t}\n\t\t\t\t\tunset( $plugin_slug );\n\n\t\t\t\t\t$count          = count( $plugin_group );\n\t\t\t\t\t$linked_plugins = array_map( array( 'TGMPA_Utils', 'wrap_in_em' ), $linked_plugins );\n\t\t\t\t\t$last_plugin    = array_pop( $linked_plugins ); // Pop off last name to prep for readability.\n\t\t\t\t\t$imploded       = empty( $linked_plugins ) ? $last_plugin : ( implode( ', ', $linked_plugins ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'zues' ) . ' ' . $last_plugin );\n\n\t\t\t\t\t$rendered .= sprintf(\n\t\t\t\t\t\t$line_template,\n\t\t\t\t\t\tsprintf(\n\t\t\t\t\t\t\ttranslate_nooped_plural( $this->strings[ $type ], $count, 'zues' ),\n\t\t\t\t\t\t\t$imploded,\n\t\t\t\t\t\t\t$count\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( 0 === strpos( $type, 'notice_cannot' ) ) {\n\t\t\t\t\t\t$rendered .= $this->strings['contact_admin'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset( $type, $plugin_group, $linked_plugins, $count, $last_plugin, $imploded );\n\n\t\t\t\t// Setup action links.\n\t\t\t\t$action_links = array(\n\t\t\t\t\t'install'  => '',\n\t\t\t\t\t'update'   => '',\n\t\t\t\t\t'activate' => '',\n\t\t\t\t\t'dismiss'  => $this->dismissable ? '<a href=\"' . esc_url( add_query_arg( 'tgmpa-dismiss', 'dismiss_admin_notices' ) ) . '\" class=\"dismiss-notice\" target=\"_parent\">' . esc_html( $this->strings['dismiss'] ) . '</a>' : '',\n\t\t\t\t);\n\n\t\t\t\t$link_template = '<a href=\"%2$s\">%1$s</a>';\n\n\t\t\t\tif ( current_user_can( 'install_plugins' ) ) {\n\t\t\t\t\tif ( $install_link_count > 0 ) {\n\t\t\t\t\t\t$action_links['install'] = sprintf(\n\t\t\t\t\t\t\t$link_template,\n\t\t\t\t\t\t\ttranslate_nooped_plural( $this->strings['install_link'], $install_link_count, 'zues' ),\n\t\t\t\t\t\t\tesc_url( $this->get_tgmpa_status_url( 'install' ) )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif ( $update_link_count > 0 ) {\n\t\t\t\t\t\t$action_links['update'] = sprintf(\n\t\t\t\t\t\t\t$link_template,\n\t\t\t\t\t\t\ttranslate_nooped_plural( $this->strings['update_link'], $update_link_count, 'zues' ),\n\t\t\t\t\t\t\tesc_url( $this->get_tgmpa_status_url( 'update' ) )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( current_user_can( 'activate_plugins' ) && $activate_link_count > 0 ) {\n\t\t\t\t\t$action_links['activate'] = sprintf(\n\t\t\t\t\t\t$link_template,\n\t\t\t\t\t\ttranslate_nooped_plural( $this->strings['activate_link'], $activate_link_count, 'zues' ),\n\t\t\t\t\t\tesc_url( $this->get_tgmpa_status_url( 'activate' ) )\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t$action_links = apply_filters( 'tgmpa_notice_action_links', $action_links );\n\n\t\t\t\t$action_links = array_filter( (array) $action_links ); // Remove any empty array items.\n\n\t\t\t\tif ( ! empty( $action_links ) && is_array( $action_links ) ) {\n\t\t\t\t\t$action_links = sprintf( $line_template, implode( ' | ', $action_links ) );\n\t\t\t\t\t$rendered    .= apply_filters( 'tgmpa_notice_rendered_action_links', $action_links );\n\t\t\t\t}\n\n\t\t\t\t// Register the nag messages and prepare them to be processed.\n\t\t\t\tif ( ! empty( $this->strings['nag_type'] ) ) {\n\t\t\t\t\tadd_settings_error( 'zues', 'zues', $rendered, sanitize_html_class( strtolower( $this->strings['nag_type'] ) ) );\n\t\t\t\t} else {\n\t\t\t\t\t$nag_class = version_compare( $this->wp_version, '3.8', '<' ) ? 'updated' : 'update-nag';\n\t\t\t\t\tadd_settings_error( 'zues', 'zues', $rendered, $nag_class );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Admin options pages already output settings_errors, so this is to avoid duplication.\n\t\t\tif ( 'options-general' !== $GLOBALS['current_screen']->parent_base ) {\n\t\t\t\t$this->display_settings_errors();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Display settings errors and remove those which have been displayed to avoid duplicate messages showing\n\t\t *\n\t\t * @since 2.5.0\n\t\t */\n\t\tprotected function display_settings_errors() {\n\t\t\tglobal $wp_settings_errors;\n\n\t\t\tsettings_errors( 'zues' );\n\n\t\t\tforeach ( (array) $wp_settings_errors as $key => $details ) {\n\t\t\t\tif ( 'zues' === $details['setting'] ) {\n\t\t\t\t\tunset( $wp_settings_errors[ $key ] );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Add dismissable admin notices.\n\t\t *\n\t\t * Appends a link to the admin nag messages. If clicked, the admin notice disappears and no longer is visible to users.\n\t\t *\n\t\t * @since 2.1.0\n\t\t */\n\t\tpublic function dismiss() {\n\t\t\tif ( isset( $_GET['tgmpa-dismiss'] ) ) {\n\t\t\t\tupdate_user_meta( get_current_user_id(), 'tgmpa_dismissed_notice_' . $this->id, 1 );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Add individual plugin to our collection of plugins.\n\t\t *\n\t\t * If the required keys are not set or the plugin has already\n\t\t * been registered, the plugin is not added.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param array|null $plugin Array of plugin arguments or null if invalid argument.\n\t\t * @return null Return early if incorrect argument.\n\t\t */\n\t\tpublic function register( $plugin ) {\n\t\t\tif ( empty( $plugin['slug'] ) || empty( $plugin['name'] ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( empty( $plugin['slug'] ) || ! is_string( $plugin['slug'] ) || isset( $this->plugins[ $plugin['slug'] ] ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$defaults = array(\n\t\t\t\t'name'               => '',      // String\n\t\t\t\t'slug'               => '',      // String\n\t\t\t\t'source'             => 'repo',  // String\n\t\t\t\t'required'           => false,   // Boolean\n\t\t\t\t'version'            => '',      // String\n\t\t\t\t'force_activation'   => false,   // Boolean\n\t\t\t\t'force_deactivation' => false,   // Boolean\n\t\t\t\t'external_url'       => '',      // String\n\t\t\t\t'is_callable'        => '',      // String|Array.\n\t\t\t);\n\n\t\t\t// Prepare the received data.\n\t\t\t$plugin = wp_parse_args( $plugin, $defaults );\n\n\t\t\t// Standardize the received slug.\n\t\t\t$plugin['slug'] = $this->sanitize_key( $plugin['slug'] );\n\n\t\t\t// Forgive users for using string versions of booleans or floats for version number.\n\t\t\t$plugin['version']            = (string) $plugin['version'];\n\t\t\t$plugin['source']             = empty( $plugin['source'] ) ? 'repo' : $plugin['source'];\n\t\t\t$plugin['required']           = TGMPA_Utils::validate_bool( $plugin['required'] );\n\t\t\t$plugin['force_activation']   = TGMPA_Utils::validate_bool( $plugin['force_activation'] );\n\t\t\t$plugin['force_deactivation'] = TGMPA_Utils::validate_bool( $plugin['force_deactivation'] );\n\n\t\t\t// Enrich the received data.\n\t\t\t$plugin['file_path']   = $this->_get_plugin_basename_from_slug( $plugin['slug'] );\n\t\t\t$plugin['source_type'] = $this->get_plugin_source_type( $plugin['source'] );\n\n\t\t\t// Set the class properties.\n\t\t\t$this->plugins[ $plugin['slug'] ]    = $plugin;\n\t\t\t$this->sort_order[ $plugin['slug'] ] = $plugin['name'];\n\n\t\t\t// Should we add the force activation hook ?\n\t\t\tif ( true === $plugin['force_activation'] ) {\n\t\t\t\t$this->has_forced_activation = true;\n\t\t\t}\n\n\t\t\t// Should we add the force deactivation hook ?\n\t\t\tif ( true === $plugin['force_deactivation'] ) {\n\t\t\t\t$this->has_forced_deactivation = true;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Determine what type of source the plugin comes from.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $source The source of the plugin as provided, either empty (= WP repo), a file path\n\t\t *                       (= bundled) or an external URL.\n\t\t * @return string 'repo', 'external', or 'bundled'\n\t\t */\n\t\tprotected function get_plugin_source_type( $source ) {\n\t\t\tif ( 'repo' === $source || preg_match( self::WP_REPO_REGEX, $source ) ) {\n\t\t\t\treturn 'repo';\n\t\t\t} elseif ( preg_match( self::IS_URL_REGEX, $source ) ) {\n\t\t\t\treturn 'external';\n\t\t\t} else {\n\t\t\t\treturn 'bundled';\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Sanitizes a string key.\n\t\t *\n\t\t * Near duplicate of WP Core `sanitize_key()`. The difference is that uppercase characters *are*\n\t\t * allowed, so as not to break upgrade paths from non-standard bundled plugins using uppercase\n\t\t * characters in the plugin directory path/slug. Silly them.\n\t\t *\n\t\t * @see https://developer.wordpress.org/reference/hooks/sanitize_key/\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $key String key.\n\t\t * @return string Sanitized key\n\t\t */\n\t\tpublic function sanitize_key( $key ) {\n\t\t\t$raw_key = $key;\n\t\t\t$key     = preg_replace( '`[^A-Za-z0-9_-]`', '', $key );\n\n\t\t\t/**\n\t\t\t* Filter a sanitized key string.\n\t\t\t*\n\t\t\t* @since 3.0.0\n\t\t\t*\n\t\t\t* @param string $key     Sanitized key.\n\t\t\t* @param string $raw_key The key prior to sanitization.\n\t\t\t*/\n\t\t\treturn apply_filters( 'tgmpa_sanitize_key', $key, $raw_key );\n\t\t}\n\n\t\t/**\n\t\t * Amend default configuration settings.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param array $config Array of config options to pass as class properties.\n\t\t */\n\t\tpublic function config( $config ) {\n\t\t\t$keys = array(\n\t\t\t\t'id',\n\t\t\t\t'default_path',\n\t\t\t\t'has_notices',\n\t\t\t\t'dismissable',\n\t\t\t\t'dismiss_msg',\n\t\t\t\t'menu',\n\t\t\t\t'menu_function',\n\t\t\t\t'capability',\n\t\t\t\t'is_automatic',\n\t\t\t\t'message',\n\t\t\t\t'strings',\n\t\t\t);\n\n\t\t\tforeach ( $keys as $key ) {\n\t\t\t\tif ( isset( $config[ $key ] ) ) {\n\t\t\t\t\tif ( is_array( $config[ $key ] ) ) {\n\t\t\t\t\t\t$this->$key = array_merge( $this->$key, $config[ $key ] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this->$key = $config[ $key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Amend action link after plugin installation.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param array $install_actions Existing array of actions.\n\t\t * @return array Amended array of actions.\n\t\t */\n\t\tpublic function actions( $install_actions ) {\n\t\t\t// Remove action links on the TGMPA install page.\n\t\t\tif ( $this->is_tgmpa_page() ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn $install_actions;\n\t\t}\n\n\t\t/**\n\t\t * Flushes the plugins cache on theme switch to prevent stale entries\n\t\t * from remaining in the plugin table.\n\t\t *\n\t\t * @since 2.4.0\n\t\t *\n\t\t * @param bool $clear_update_cache Optional. Whether to clear the Plugin updates cache.\n\t\t *                                 Parameter added in v2.5.0.\n\t\t */\n\t\tpublic function flush_plugins_cache( $clear_update_cache = true ) {\n\t\t\twp_clean_plugins_cache( $clear_update_cache );\n\t\t}\n\n\t\t/**\n\t\t * Set file_path key for each installed plugin.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $plugin_slug Optional. If set, only (re-)populates the file path for that specific plugin.\n\t\t *                            Parameter added in v2.5.0.\n\t\t */\n\t\tpublic function populate_file_path( $plugin_slug = '' ) {\n\t\t\tif ( ! empty( $plugin_slug ) && is_string( $plugin_slug ) && isset( $this->plugins[ $plugin_slug ] ) ) {\n\t\t\t\t$this->plugins[ $plugin_slug ]['file_path'] = $this->_get_plugin_basename_from_slug( $plugin_slug );\n\t\t\t} else {\n\t\t\t\t// Add file_path key for all plugins.\n\t\t\t\tforeach ( $this->plugins as $slug => $values ) {\n\t\t\t\t\t$this->plugins[ $slug ]['file_path'] = $this->_get_plugin_basename_from_slug( $slug );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Helper function to extract the file path of the plugin file from the\n\t\t * plugin slug, if the plugin is installed.\n\t\t *\n\t\t * @since 2.0.0\n\t\t *\n\t\t * @param string $slug Plugin slug (typically folder name) as provided by the developer.\n\t\t * @return string Either file path for plugin if installed, or just the plugin slug.\n\t\t */\n\t\tprotected function _get_plugin_basename_from_slug( $slug ) {\n\t\t\t$keys = array_keys( $this->get_plugins() );\n\n\t\t\tforeach ( $keys as $key ) {\n\t\t\t\tif ( preg_match( '|^' . $slug . '/|', $key ) ) {\n\t\t\t\t\treturn $key;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $slug;\n\t\t}\n\n\t\t/**\n\t\t * Retrieve plugin data, given the plugin name.\n\t\t *\n\t\t * Loops through the registered plugins looking for $name. If it finds it,\n\t\t * it returns the $data from that plugin. Otherwise, returns false.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @param string $name Name of the plugin, as it was registered.\n\t\t * @param string $data Optional. Array key of plugin data to return. Default is slug.\n\t\t * @return string|boolean Plugin slug if found, false otherwise.\n\t\t */\n\t\tpublic function _get_plugin_data_from_name( $name, $data = 'slug' ) {\n\t\t\tforeach ( $this->plugins as $values ) {\n\t\t\t\tif ( $name === $values['name'] && isset( $values[ $data ] ) ) {\n\t\t\t\t\treturn $values[ $data ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Retrieve the download URL for a package.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return string Plugin download URL or path to local file or empty string if undetermined.\n\t\t */\n\t\tpublic function get_download_url( $slug ) {\n\t\t\t$dl_source = '';\n\n\t\t\tswitch ( $this->plugins[ $slug ]['source_type'] ) {\n\t\t\t\tcase 'repo':\n\t\t\t\t\treturn $this->get_wp_repo_download_url( $slug );\n\t\t\t\tcase 'external':\n\t\t\t\t\treturn $this->plugins[ $slug ]['source'];\n\t\t\t\tcase 'bundled':\n\t\t\t\t\treturn $this->default_path . $this->plugins[ $slug ]['source'];\n\t\t\t}\n\n\t\t\treturn $dl_source; // Should never happen.\n\t\t}\n\n\t\t/**\n\t\t * Retrieve the download URL for a WP repo package.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return string Plugin download URL.\n\t\t */\n\t\tprotected function get_wp_repo_download_url( $slug ) {\n\t\t\t$source = '';\n\t\t\t$api    = $this->get_plugins_api( $slug );\n\n\t\t\tif ( false !== $api && isset( $api->download_link ) ) {\n\t\t\t\t$source = $api->download_link;\n\t\t\t}\n\n\t\t\treturn $source;\n\t\t}\n\n\t\t/**\n\t\t * Try to grab information from WordPress API.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return object Plugins_api response object on success, WP_Error on failure.\n\t\t */\n\t\tprotected function get_plugins_api( $slug ) {\n\t\t\tstatic $api = array(); // Cache received responses.\n\n\t\t\tif ( ! isset( $api[ $slug ] ) ) {\n\t\t\t\tif ( ! function_exists( 'plugins_api' ) ) {\n\t\t\t\t\trequire_once ABSPATH . 'wp-admin/includes/plugin-install.php';\n\t\t\t\t}\n\n\t\t\t\t$response = plugins_api( 'plugin_information', array( 'slug' => $slug, 'fields' => array( 'sections' => false ) ) );\n\n\t\t\t\t$api[ $slug ] = false;\n\n\t\t\t\tif ( is_wp_error( $response ) ) {\n\t\t\t\t\twp_die( esc_html( $this->strings['oops'] ) );\n\t\t\t\t} else {\n\t\t\t\t\t$api[ $slug ] = $response;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $api[ $slug ];\n\t\t}\n\n\t\t/**\n\t\t * Retrieve a link to a plugin information page.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return string Fully formed html link to a plugin information page if available\n\t\t *                or the plugin name if not.\n\t\t */\n\t\tpublic function get_info_link( $slug ) {\n\t\t\tif ( ! empty( $this->plugins[ $slug ]['external_url'] ) && preg_match( self::IS_URL_REGEX, $this->plugins[ $slug ]['external_url'] ) ) {\n\t\t\t\t$link = sprintf(\n\t\t\t\t\t'<a href=\"%1$s\" target=\"_blank\">%2$s</a>',\n\t\t\t\t\tesc_url( $this->plugins[ $slug ]['external_url'] ),\n\t\t\t\t\tesc_html( $this->plugins[ $slug ]['name'] )\n\t\t\t\t);\n\t\t\t} elseif ( 'repo' === $this->plugins[ $slug ]['source_type'] ) {\n\t\t\t\t$url = add_query_arg(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'tab'       => 'plugin-information',\n\t\t\t\t\t\t'plugin'    => urlencode( $slug ),\n\t\t\t\t\t\t'TB_iframe' => 'true',\n\t\t\t\t\t\t'width'     => '640',\n\t\t\t\t\t\t'height'    => '500',\n\t\t\t\t\t),\n\t\t\t\t\tself_admin_url( 'plugin-install.php' )\n\t\t\t\t);\n\n\t\t\t\t$link = sprintf(\n\t\t\t\t\t'<a href=\"%1$s\" class=\"thickbox\">%2$s</a>',\n\t\t\t\t\tesc_url( $url ),\n\t\t\t\t\tesc_html( $this->plugins[ $slug ]['name'] )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t$link = esc_html( $this->plugins[ $slug ]['name'] ); // No hyperlink.\n\t\t\t}\n\n\t\t\treturn $link;\n\t\t}\n\n\t\t/**\n\t\t * Determine if we're on the TGMPA Install page.\n\t\t *\n\t\t * @since 2.1.0\n\t\t *\n\t\t * @return boolean True when on the TGMPA page, false otherwise.\n\t\t */\n\t\tprotected function is_tgmpa_page() {\n\t\t\treturn isset( $_GET['page'] ) && $this->menu === $_GET['page'];\n\t\t}\n\n\t\t/**\n\t\t * Retrieve the URL to the TGMPA Install page.\n\t\t *\n\t\t * I.e. depending on the config settings passed something along the lines of:\n\t\t * http://example.com/wp-admin/themes.php?page=tgmpa-install-plugins\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @return string Properly encoded URL (not escaped).\n\t\t */\n\t\tpublic function get_tgmpa_url() {\n\t\t\tstatic $url;\n\n\t\t\tif ( ! isset( $url ) ) {\n\t\t\t\t$parent = 'themes.php';\n\t\t\t\tif ( 'add_theme_page' !== $this->menu_function ) {\n\t\t\t\t\t$parent = 'admin.php';\n\t\t\t\t}\n\n\t\t\t\t$url = add_query_arg(\n\t\t\t\t\tarray(\n\t\t\t\t\t\t'page' => urlencode( $this->menu ),\n\t\t\t\t\t),\n\t\t\t\t\tself_admin_url( $parent )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn $url;\n\t\t}\n\n\t\t/**\n\t\t * Retrieve the URL to the TGMPA Install page for a specific plugin status (view).\n\t\t *\n\t\t * I.e. depending on the config settings passed something along the lines of:\n\t\t * http://example.com/wp-admin/themes.php?page=tgmpa-install-plugins&plugin_status=install\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $status Plugin status - either 'install', 'update' or 'activate'.\n\t\t * @return string Properly encoded URL (not escaped).\n\t\t */\n\t\tpublic function get_tgmpa_status_url( $status ) {\n\t\t\treturn add_query_arg(\n\t\t\t\tarray(\n\t\t\t\t\t'plugin_status' => urlencode( $status ),\n\t\t\t\t),\n\t\t\t\t$this->get_tgmpa_url()\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Determine whether there are open actions for plugins registered with TGMPA.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @return bool True if complete, i.e. no outstanding actions. False otherwise.\n\t\t */\n\t\tpublic function is_tgmpa_complete() {\n\t\t\t$complete = true;\n\t\t\tforeach ( $this->plugins as $slug => $plugin ) {\n\t\t\t\tif ( ! $this->is_plugin_active( $slug ) || false !== $this->does_plugin_have_update( $slug ) ) {\n\t\t\t\t\t$complete = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $complete;\n\t\t}\n\n\t\t/**\n\t\t * Check if a plugin is installed. Does not take must-use plugins into account.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return bool True if installed, false otherwise.\n\t\t */\n\t\tpublic function is_plugin_installed( $slug ) {\n\t\t\t$installed_plugins = $this->get_plugins(); // Retrieve a list of all installed plugins (WP cached).\n\n\t\t\treturn ( ! empty( $installed_plugins[ $this->plugins[ $slug ]['file_path'] ] ) );\n\t\t}\n\n\t\t/**\n\t\t * Check if a plugin is active.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return bool True if active, false otherwise.\n\t\t */\n\t\tpublic function is_plugin_active( $slug ) {\n\t\t\treturn ( ( ! empty( $this->plugins[ $slug ]['is_callable'] ) && is_callable( $this->plugins[ $slug ]['is_callable'] ) ) || is_plugin_active( $this->plugins[ $slug ]['file_path'] ) );\n\t\t}\n\n\t\t/**\n\t\t * Check if a plugin can be updated, i.e. if we have information on the minimum WP version required\n\t\t * available, check whether the current install meets them.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return bool True if OK to update, false otherwise.\n\t\t */\n\t\tpublic function can_plugin_update( $slug ) {\n\t\t\t// We currently can't get reliable info on non-WP-repo plugins - issue #380.\n\t\t\tif ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t$api = $this->get_plugins_api( $slug );\n\n\t\t\tif ( false !== $api && isset( $api->requires ) ) {\n\t\t\t\treturn version_compare( $GLOBALS['wp_version'], $api->requires, '>=' );\n\t\t\t}\n\n\t\t\t// No usable info received from the plugins API, presume we can update.\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Check if a plugin can be activated, i.e. is not currently active and meets the minimum\n\t\t * plugin version requirements set in TGMPA (if any).\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return bool True if OK to activate, false otherwise.\n\t\t */\n\t\tpublic function can_plugin_activate( $slug ) {\n\t\t\treturn ( ! $this->is_plugin_active( $slug ) && ! $this->does_plugin_require_update( $slug ) );\n\t\t}\n\n\t\t/**\n\t\t * Retrieve the version number of an installed plugin.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return string Version number as string or an empty string if the plugin is not installed\n\t\t *                or version unknown (plugins which don't comply with the plugin header standard).\n\t\t */\n\t\tpublic function get_installed_version( $slug ) {\n\t\t\t$installed_plugins = $this->get_plugins(); // Retrieve a list of all installed plugins (WP cached).\n\n\t\t\tif ( ! empty( $installed_plugins[ $this->plugins[ $slug ]['file_path'] ]['Version'] ) ) {\n\t\t\t\treturn $installed_plugins[ $this->plugins[ $slug ]['file_path'] ]['Version'];\n\t\t\t}\n\n\t\t\treturn '';\n\t\t}\n\n\t\t/**\n\t\t * Check whether a plugin complies with the minimum version requirements.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return bool True when a plugin needs to be updated, otherwise false.\n\t\t */\n\t\tpublic function does_plugin_require_update( $slug ) {\n\t\t\t$installed_version = $this->get_installed_version( $slug );\n\t\t\t$minimum_version   = $this->plugins[ $slug ]['version'];\n\n\t\t\treturn version_compare( $minimum_version, $installed_version, '>' );\n\t\t}\n\n\t\t/**\n\t\t * Check whether there is an update available for a plugin.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return false|string Version number string of the available update or false if no update available.\n\t\t */\n\t\tpublic function does_plugin_have_update( $slug ) {\n\t\t\t// Presume bundled and external plugins will point to a package which meets the minimum required version.\n\t\t\tif ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) {\n\t\t\t\tif ( $this->does_plugin_require_update( $slug ) ) {\n\t\t\t\t\treturn $this->plugins[ $slug ]['version'];\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t$repo_updates = get_site_transient( 'update_plugins' );\n\n\t\t\tif ( isset( $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->new_version ) ) {\n\t\t\t\treturn $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->new_version;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Retrieve potential upgrade notice for a plugin.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return string The upgrade notice or an empty string if no message was available or provided.\n\t\t */\n\t\tpublic function get_upgrade_notice( $slug ) {\n\t\t\t// We currently can't get reliable info on non-WP-repo plugins - issue #380.\n\t\t\tif ( 'repo' !== $this->plugins[ $slug ]['source_type'] ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t$repo_updates = get_site_transient( 'update_plugins' );\n\n\t\t\tif ( ! empty( $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->upgrade_notice ) ) {\n\t\t\t\treturn $repo_updates->response[ $this->plugins[ $slug ]['file_path'] ]->upgrade_notice;\n\t\t\t}\n\n\t\t\treturn '';\n\t\t}\n\n\t\t/**\n\t\t * Wrapper around the core WP get_plugins function, making sure it's actually available.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $plugin_folder Optional. Relative path to single plugin folder.\n\t\t * @return array Array of installed plugins with plugin information.\n\t\t */\n\t\tpublic function get_plugins( $plugin_folder = '' ) {\n\t\t\tif ( ! function_exists( 'get_plugins' ) ) {\n\t\t\t\trequire_once ABSPATH . 'wp-admin/includes/plugin.php';\n\t\t\t}\n\n\t\t\treturn get_plugins( $plugin_folder );\n\t\t}\n\n\t\t/**\n\t\t * Delete dismissable nag option when theme is switched.\n\t\t *\n\t\t * This ensures that the user(s) is/are again reminded via nag of required\n\t\t * and/or recommended plugins if they re-activate the theme.\n\t\t *\n\t\t * @since 2.1.1\n\t\t */\n\t\tpublic function update_dismiss() {\n\t\t\tdelete_metadata( 'user', null, 'tgmpa_dismissed_notice_' . $this->id, null, true );\n\t\t}\n\n\t\t/**\n\t\t * Forces plugin activation if the parameter 'force_activation' is\n\t\t * set to true.\n\t\t *\n\t\t * This allows theme authors to specify certain plugins that must be\n\t\t * active at all times while using the current theme.\n\t\t *\n\t\t * Please take special care when using this parameter as it has the\n\t\t * potential to be harmful if not used correctly. Setting this parameter\n\t\t * to true will not allow the specified plugin to be deactivated unless\n\t\t * the user switches themes.\n\t\t *\n\t\t * @since 2.2.0\n\t\t */\n\t\tpublic function force_activation() {\n\t\t\tforeach ( $this->plugins as $slug => $plugin ) {\n\t\t\t\tif ( true === $plugin['force_activation'] ) {\n\t\t\t\t\tif ( ! $this->is_plugin_installed( $slug ) ) {\n\t\t\t\t\t\t// Oops, plugin isn't there so iterate to next condition.\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} elseif ( $this->can_plugin_activate( $slug ) ) {\n\t\t\t\t\t\t// There we go, activate the plugin.\n\t\t\t\t\t\tactivate_plugin( $plugin['file_path'] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Forces plugin deactivation if the parameter 'force_deactivation'\n\t\t * is set to true.\n\t\t *\n\t\t * This allows theme authors to specify certain plugins that must be\n\t\t * deactivated upon switching from the current theme to another.\n\t\t *\n\t\t * Please take special care when using this parameter as it has the\n\t\t * potential to be harmful if not used correctly.\n\t\t *\n\t\t * @since 2.2.0\n\t\t */\n\t\tpublic function force_deactivation() {\n\t\t\tforeach ( $this->plugins as $slug => $plugin ) {\n\t\t\t\t// Only proceed forward if the parameter is set to true and plugin is active.\n\t\t\t\tif ( true === $plugin['force_deactivation'] && $this->is_plugin_active( $slug ) ) {\n\t\t\t\t\tdeactivate_plugins( $plugin['file_path'] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Echo the current TGMPA version number to the page.\n\t\t */\n\t\tpublic function show_tgmpa_version() {\n\t\t\techo '<p style=\"float: right; padding: 0em 1.5em 0.5em 0;\"><strong><small>',\n\t\t\t\tesc_html( sprintf( _x( 'TGMPA v%s', '%s = version number', 'zues' ), self::TGMPA_VERSION ) ),\n\t\t\t\t'</small></strong></p>';\n\t\t}\n\n\t\t/**\n\t\t * Returns the singleton instance of the class.\n\t\t *\n\t\t * @since 2.4.0\n\t\t *\n\t\t * @return object The TGM_Plugin_Activation object.\n\t\t */\n\t\tpublic static function get_instance() {\n\t\t\tif ( ! isset( self::$instance ) && ! ( self::$instance instanceof self ) ) {\n\t\t\t\tself::$instance = new self();\n\t\t\t}\n\n\t\t\treturn self::$instance;\n\t\t}\n\t}\n\n\tif ( ! function_exists( 'load_tgm_plugin_activation' ) ) {\n\t\t/**\n\t\t * Ensure only one instance of the class is ever invoked.\n\t\t */\n\t\tfunction load_tgm_plugin_activation() {\n\t\t\t$GLOBALS['zues'] = TGM_Plugin_Activation::get_instance();\n\t\t}\n\t}\n\n\tif ( did_action( 'plugins_loaded' ) ) {\n\t\tload_tgm_plugin_activation();\n\t} else {\n\t\tadd_action( 'plugins_loaded', 'load_tgm_plugin_activation' );\n\t}\n}\n\nif ( ! function_exists( 'zues' ) ) {\n\t/**\n\t * Helper function to register a collection of required plugins.\n\t *\n\t * @since 2.0.0\n\t * @api\n\t *\n\t * @param array $plugins An array of plugin arrays.\n\t * @param array $config  Optional. An array of configuration values.\n\t */\n\tfunction tgmpa( $plugins, $config = array() ) {\n\t\t$instance = call_user_func( array( get_class( $GLOBALS['zues'] ), 'get_instance' ) );\n\n\t\tforeach ( $plugins as $plugin ) {\n\t\t\tcall_user_func( array( $instance, 'register' ), $plugin );\n\t\t}\n\n\t\tif ( ! empty( $config ) && is_array( $config ) ) {\n\t\t\t// Send out notices for deprecated arguments passed.\n\t\t\tif ( isset( $config['notices'] ) ) {\n\t\t\t\t_deprecated_argument( __FUNCTION__, '2.2.0', 'The `notices` config parameter was renamed to `has_notices` in TGMPA 2.2.0. Please adjust your configuration.' );\n\t\t\t\tif ( ! isset( $config['has_notices'] ) ) {\n\t\t\t\t\t$config['has_notices'] = $config['notices'];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isset( $config['parent_menu_slug'] ) ) {\n\t\t\t\t_deprecated_argument( __FUNCTION__, '2.4.0', 'The `parent_menu_slug` config parameter was removed in TGMPA 2.4.0. In TGMPA 2.5.0 an alternative was (re-)introduced. Please adjust your configuration. For more information visit the website: http://tgmpluginactivation.com/configuration/#h-configuration-options.' );\n\t\t\t}\n\t\t\tif ( isset( $config['parent_url_slug'] ) ) {\n\t\t\t\t_deprecated_argument( __FUNCTION__, '2.4.0', 'The `parent_url_slug` config parameter was removed in TGMPA 2.4.0. In TGMPA 2.5.0 an alternative was (re-)introduced. Please adjust your configuration. For more information visit the website: http://tgmpluginactivation.com/configuration/#h-configuration-options.' );\n\t\t\t}\n\n\t\t\tcall_user_func( array( $instance, 'config' ), $config );\n\t\t}\n\t}\n}\n\n/**\n * WP_List_Table isn't always available. If it isn't available,\n * we load it here.\n *\n * @since 2.2.0\n */\nif ( ! class_exists( 'WP_List_Table' ) ) {\n\trequire_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';\n}\n\nif ( ! class_exists( 'TGMPA_List_Table' ) ) {\n\n\t/**\n\t * List table class for handling plugins.\n\t *\n\t * Extends the WP_List_Table class to provide a future-compatible\n\t * way of listing out all required/recommended plugins.\n\t *\n\t * Gives users an interface similar to the Plugin Administration\n\t * area with similar (albeit stripped down) capabilities.\n\t *\n\t * This class also allows for the bulk install of plugins.\n\t *\n\t * @since 2.2.0\n\t *\n\t * @package TGM-Plugin-Activation\n\t * @author  Thomas Griffin\n\t * @author  Gary Jones\n\t */\n\tclass TGMPA_List_Table extends WP_List_Table {\n\t\t/**\n\t\t * TGMPA instance.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @var object\n\t\t */\n\t\tprotected $tgmpa;\n\n\t\t/**\n\t\t * The currently chosen view.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @var string One of: 'all', 'install', 'update', 'activate'\n\t\t */\n\t\tpublic $view_context = 'all';\n\n\t\t/**\n\t\t * The plugin counts for the various views.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @var array\n\t\t */\n\t\tprotected $view_totals = array(\n\t\t\t'all'      => 0,\n\t\t\t'install'  => 0,\n\t\t\t'update'   => 0,\n\t\t\t'activate' => 0,\n\t\t);\n\n\t\t/**\n\t\t * References parent constructor and sets defaults for class.\n\t\t *\n\t\t * @since 2.2.0\n\t\t */\n\t\tpublic function __construct() {\n\t\t\t$this->tgmpa = call_user_func( array( get_class( $GLOBALS['zues'] ), 'get_instance' ) );\n\n\t\t\tparent::__construct(\n\t\t\t\tarray(\n\t\t\t\t\t'singular' => 'plugin',\n\t\t\t\t\t'plural'   => 'plugins',\n\t\t\t\t\t'ajax'     => false,\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tif ( isset( $_REQUEST['plugin_status'] ) && in_array( $_REQUEST['plugin_status'], array( 'install', 'update', 'activate' ), true ) ) {\n\t\t\t\t$this->view_context = sanitize_key( $_REQUEST['plugin_status'] );\n\t\t\t}\n\n\t\t\tadd_filter( 'tgmpa_table_data_items', array( $this, 'sort_table_items' ) );\n\t\t}\n\n\t\t/**\n\t\t * Get a list of CSS classes for the <table> tag.\n\t\t *\n\t\t * Overruled to prevent the 'plural' argument from being added.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @return array CSS classnames.\n\t\t */\n\t\tpublic function get_table_classes() {\n\t\t\treturn array( 'widefat', 'fixed' );\n\t\t}\n\n\t\t/**\n\t\t * Gathers and renames all of our plugin information to be used by WP_List_Table to create our table.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @return array $table_data Information for use in table.\n\t\t */\n\t\tprotected function _gather_plugin_data() {\n\t\t\t// Load thickbox for plugin links.\n\t\t\t$this->tgmpa->admin_init();\n\t\t\t$this->tgmpa->thickbox();\n\n\t\t\t// Categorize the plugins which have open actions.\n\t\t\t$plugins = $this->categorize_plugins_to_views();\n\n\t\t\t// Set the counts for the view links.\n\t\t\t$this->set_view_totals( $plugins );\n\n\t\t\t// Prep variables for use and grab list of all installed plugins.\n\t\t\t$table_data = array();\n\t\t\t$i          = 0;\n\n\t\t\t// Redirect to the 'all' view if no plugins were found for the selected view context.\n\t\t\tif ( empty( $plugins[ $this->view_context ] ) ) {\n\t\t\t\t$this->view_context = 'all';\n\t\t\t}\n\n\t\t\tforeach ( $plugins[ $this->view_context ] as $slug => $plugin ) {\n\t\t\t\t$table_data[ $i ]['sanitized_plugin']  = $plugin['name'];\n\t\t\t\t$table_data[ $i ]['slug']              = $slug;\n\t\t\t\t$table_data[ $i ]['plugin']            = '<strong>' . $this->tgmpa->get_info_link( $slug ) . '</strong>';\n\t\t\t\t$table_data[ $i ]['source']            = $this->get_plugin_source_type_text( $plugin['source_type'] );\n\t\t\t\t$table_data[ $i ]['type']              = $this->get_plugin_advise_type_text( $plugin['required'] );\n\t\t\t\t$table_data[ $i ]['status']            = $this->get_plugin_status_text( $slug );\n\t\t\t\t$table_data[ $i ]['installed_version'] = $this->tgmpa->get_installed_version( $slug );\n\t\t\t\t$table_data[ $i ]['minimum_version']   = $plugin['version'];\n\t\t\t\t$table_data[ $i ]['available_version'] = $this->tgmpa->does_plugin_have_update( $slug );\n\n\t\t\t\t// Prep the upgrade notice info.\n\t\t\t\t$upgrade_notice = $this->tgmpa->get_upgrade_notice( $slug );\n\t\t\t\tif ( ! empty( $upgrade_notice ) ) {\n\t\t\t\t\t$table_data[ $i ]['upgrade_notice'] = $upgrade_notice;\n\n\t\t\t\t\tadd_action( \"tgmpa_after_plugin_row_$slug\", array( $this, 'wp_plugin_update_row' ), 10, 2 );\n\t\t\t\t}\n\n\t\t\t\t$table_data[ $i ] = apply_filters( 'tgmpa_table_data_item', $table_data[ $i ], $plugin );\n\n\t\t\t\t$i++;\n\t\t\t}\n\n\t\t\treturn $table_data;\n\t\t}\n\n\t\t/**\n\t\t * Categorize the plugins which have open actions into views for the TGMPA page.\n\t\t *\n\t\t * @since 2.5.0\n\t\t */\n\t\tprotected function categorize_plugins_to_views() {\n\t\t\t$plugins = array(\n\t\t\t\t'all'      => array(), // Meaning: all plugins which still have open actions.\n\t\t\t\t'install'  => array(),\n\t\t\t\t'update'   => array(),\n\t\t\t\t'activate' => array(),\n\t\t\t);\n\n\t\t\tforeach ( $this->tgmpa->plugins as $slug => $plugin ) {\n\t\t\t\tif ( $this->tgmpa->is_plugin_active( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) {\n\t\t\t\t\t// No need to display plugins if they are installed, up-to-date and active.\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\t$plugins['all'][ $slug ] = $plugin;\n\n\t\t\t\t\tif ( ! $this->tgmpa->is_plugin_installed( $slug ) ) {\n\t\t\t\t\t\t$plugins['install'][ $slug ] = $plugin;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) {\n\t\t\t\t\t\t\t$plugins['update'][ $slug ] = $plugin;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( $this->tgmpa->can_plugin_activate( $slug ) ) {\n\t\t\t\t\t\t\t$plugins['activate'][ $slug ] = $plugin;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $plugins;\n\t\t}\n\n\t\t/**\n\t\t * Set the counts for the view links.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $plugins Plugins order by view.\n\t\t */\n\t\tprotected function set_view_totals( $plugins ) {\n\t\t\tforeach ( $plugins as $type => $list ) {\n\t\t\t\t$this->view_totals[ $type ] = count( $list );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Get the plugin required/recommended text string.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $required Plugin required setting.\n\t\t * @return string\n\t\t */\n\t\tprotected function get_plugin_advise_type_text( $required ) {\n\t\t\tif ( true === $required ) {\n\t\t\t\treturn __( 'Required', 'zues' );\n\t\t\t}\n\n\t\t\treturn __( 'Recommended', 'zues' );\n\t\t}\n\n\t\t/**\n\t\t * Get the plugin source type text string.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $type Plugin type.\n\t\t * @return string\n\t\t */\n\t\tprotected function get_plugin_source_type_text( $type ) {\n\t\t\t$string = '';\n\n\t\t\tswitch ( $type ) {\n\t\t\t\tcase 'repo':\n\t\t\t\t\t$string = __( 'WordPress Repository', 'zues' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'external':\n\t\t\t\t\t$string = __( 'External Source', 'zues' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'bundled':\n\t\t\t\t\t$string = __( 'Pre-Packaged', 'zues' );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn $string;\n\t\t}\n\n\t\t/**\n\t\t * Determine the plugin status message.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @return string\n\t\t */\n\t\tprotected function get_plugin_status_text( $slug ) {\n\t\t\tif ( ! $this->tgmpa->is_plugin_installed( $slug ) ) {\n\t\t\t\treturn __( 'Not Installed', 'zues' );\n\t\t\t}\n\n\t\t\tif ( ! $this->tgmpa->is_plugin_active( $slug ) ) {\n\t\t\t\t$install_status = __( 'Installed But Not Activated', 'zues' );\n\t\t\t} else {\n\t\t\t\t$install_status = __( 'Active', 'zues' );\n\t\t\t}\n\n\t\t\t$update_status = '';\n\n\t\t\tif ( $this->tgmpa->does_plugin_require_update( $slug ) && false === $this->tgmpa->does_plugin_have_update( $slug ) ) {\n\t\t\t\t$update_status = __( 'Required Update not Available', 'zues' );\n\n\t\t\t} elseif ( $this->tgmpa->does_plugin_require_update( $slug ) ) {\n\t\t\t\t$update_status = __( 'Requires Update', 'zues' );\n\n\t\t\t} elseif ( false !== $this->tgmpa->does_plugin_have_update( $slug ) ) {\n\t\t\t\t$update_status = __( 'Update recommended', 'zues' );\n\t\t\t}\n\n\t\t\tif ( '' === $update_status ) {\n\t\t\t\treturn $install_status;\n\t\t\t}\n\n\t\t\treturn sprintf(\n\t\t\t\t_x( '%1$s, %2$s', '%1$s = install status, %2$s = update status', 'zues' ),\n\t\t\t\t$install_status,\n\t\t\t\t$update_status\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Sort plugins by Required/Recommended type and by alphabetical plugin name within each type.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $items Prepared table items.\n\t\t * @return array Sorted table items.\n\t\t */\n\t\tpublic function sort_table_items( $items ) {\n\t\t\t$type = array();\n\t\t\t$name = array();\n\n\t\t\tforeach ( $items as $i => $plugin ) {\n\t\t\t\t$type[ $i ] = $plugin['type']; // Required / recommended.\n\t\t\t\t$name[ $i ] = $plugin['sanitized_plugin'];\n\t\t\t}\n\n\t\t\tarray_multisort( $type, SORT_DESC, $name, SORT_ASC, $items );\n\n\t\t\treturn $items;\n\t\t}\n\n\t\t/**\n\t\t * Get an associative array ( id => link ) of the views available on this table.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @return array\n\t\t */\n\t\tpublic function get_views() {\n\t\t\t$status_links = array();\n\n\t\t\tforeach ( $this->view_totals as $type => $count ) {\n\t\t\t\tif ( $count < 1 ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tswitch ( $type ) {\n\t\t\t\t\tcase 'all':\n\t\t\t\t\t\t$text = _nx( 'All <span class=\"count\">(%s)</span>', 'All <span class=\"count\">(%s)</span>', $count, 'plugins', 'zues' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'install':\n\t\t\t\t\t\t$text = _n( 'To Install <span class=\"count\">(%s)</span>', 'To Install <span class=\"count\">(%s)</span>', $count, 'zues' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t$text = _n( 'Update Available <span class=\"count\">(%s)</span>', 'Update Available <span class=\"count\">(%s)</span>', $count, 'zues' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'activate':\n\t\t\t\t\t\t$text = _n( 'To Activate <span class=\"count\">(%s)</span>', 'To Activate <span class=\"count\">(%s)</span>', $count, 'zues' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t$text = '';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( ! empty( $text ) ) {\n\n\t\t\t\t\t$status_links[ $type ] = sprintf(\n\t\t\t\t\t\t'<a href=\"%s\"%s>%s</a>',\n\t\t\t\t\t\tesc_url( $this->tgmpa->get_tgmpa_status_url( $type ) ),\n\t\t\t\t\t\t( $type === $this->view_context ) ? ' class=\"current\"' : '',\n\t\t\t\t\t\tsprintf( $text, number_format_i18n( $count ) )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $status_links;\n\t\t}\n\n\t\t/**\n\t\t * Create default columns to display important plugin information\n\t\t * like type, action and status.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @param array  $item        Array of item data.\n\t\t * @param string $column_name The name of the column.\n\t\t * @return string\n\t\t */\n\t\tpublic function column_default( $item, $column_name ) {\n\t\t\treturn $item[ $column_name ];\n\t\t}\n\n\t\t/**\n\t\t * Required for bulk installing.\n\t\t *\n\t\t * Adds a checkbox for each plugin.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @param array $item Array of item data.\n\t\t * @return string The input checkbox with all necessary info.\n\t\t */\n\t\tpublic function column_cb( $item ) {\n\t\t\treturn sprintf(\n\t\t\t\t'<input type=\"checkbox\" name=\"%1$s[]\" value=\"%2$s\" id=\"%3$s\" />',\n\t\t\t\tesc_attr( $this->_args['singular'] ),\n\t\t\t\tesc_attr( $item['slug'] ),\n\t\t\t\tesc_attr( $item['sanitized_plugin'] )\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Create default title column along with the action links.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @param array $item Array of item data.\n\t\t * @return string The plugin name and action links.\n\t\t */\n\t\tpublic function column_plugin( $item ) {\n\t\t\treturn sprintf(\n\t\t\t\t'%1$s %2$s',\n\t\t\t\t$item['plugin'],\n\t\t\t\t$this->row_actions( $this->get_row_actions( $item ), true )\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Create version information column.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $item Array of item data.\n\t\t * @return string HTML-formatted version information.\n\t\t */\n\t\tpublic function column_version( $item ) {\n\t\t\t$output = array();\n\n\t\t\tif ( $this->tgmpa->is_plugin_installed( $item['slug'] ) ) {\n\t\t\t\t$installed = ! empty( $item['installed_version'] ) ? $item['installed_version'] : _x( 'unknown', 'as in: \"version nr unknown\"', 'zues' );\n\n\t\t\t\t$color = '';\n\t\t\t\tif ( ! empty( $item['minimum_version'] ) && $this->tgmpa->does_plugin_require_update( $item['slug'] ) ) {\n\t\t\t\t\t$color = ' color: #ff0000; font-weight: bold;';\n\t\t\t\t}\n\n\t\t\t\t$output[] = sprintf(\n\t\t\t\t\t'<p><span style=\"min-width: 32px; text-align: right; float: right;%1$s\">%2$s</span>' . __( 'Installed version:', 'zues' ) . '</p>',\n\t\t\t\t\t$color,\n\t\t\t\t\t$installed\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif ( ! empty( $item['minimum_version'] ) ) {\n\t\t\t\t$output[] = sprintf(\n\t\t\t\t\t'<p><span style=\"min-width: 32px; text-align: right; float: right;\">%1$s</span>' . __( 'Minimum required version:', 'zues' ) . '</p>',\n\t\t\t\t\t$item['minimum_version']\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif ( ! empty( $item['available_version'] ) ) {\n\t\t\t\t$color = '';\n\t\t\t\tif ( ! empty( $item['minimum_version'] ) && version_compare( $item['available_version'], $item['minimum_version'], '>=' ) ) {\n\t\t\t\t\t$color = ' color: #71C671; font-weight: bold;';\n\t\t\t\t}\n\n\t\t\t\t$output[] = sprintf(\n\t\t\t\t\t'<p><span style=\"min-width: 32px; text-align: right; float: right;%1$s\">%2$s</span>' . __( 'Available version:', 'zues' ) . '</p>',\n\t\t\t\t\t$color,\n\t\t\t\t\t$item['available_version']\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif ( empty( $output ) ) {\n\t\t\t\treturn '&nbsp;'; // Let's not break the table layout.\n\t\t\t} else {\n\t\t\t\treturn implode( \"\\n\", $output );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Sets default message within the plugins table if no plugins\n\t\t * are left for interaction.\n\t\t *\n\t\t * Hides the menu item to prevent the user from clicking and\n\t\t * getting a permissions error.\n\t\t *\n\t\t * @since 2.2.0\n\t\t */\n\t\tpublic function no_items() {\n\t\t\tprintf( wp_kses_post( __( 'No plugins to install, update or activate. <a href=\"%1$s\">Return to the Dashboard</a>', 'zues' ) ), esc_url( self_admin_url() ) );\n\t\t\techo '<style type=\"text/css\">#adminmenu .wp-submenu li.current { display: none !important; }</style>';\n\t\t}\n\n\t\t/**\n\t\t * Output all the column information within the table.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @return array $columns The column names.\n\t\t */\n\t\tpublic function get_columns() {\n\t\t\t$columns = array(\n\t\t\t\t'cb'     => '<input type=\"checkbox\" />',\n\t\t\t\t'plugin' => __( 'Plugin', 'zues' ),\n\t\t\t\t'source' => __( 'Source', 'zues' ),\n\t\t\t\t'type'   => __( 'Type', 'zues' ),\n\t\t\t);\n\n\t\t\tif ( 'all' === $this->view_context || 'update' === $this->view_context ) {\n\t\t\t\t$columns['version'] = __( 'Version', 'zues' );\n\t\t\t\t$columns['status']  = __( 'Status', 'zues' );\n\t\t\t}\n\n\t\t\treturn apply_filters( 'tgmpa_table_columns', $columns );\n\t\t}\n\n\t\t/**\n\t\t * Get name of default primary column\n\t\t *\n\t\t * @since 2.5.0 / WP 4.3+ compatibility\n\t\t * @access protected\n\t\t *\n\t\t * @return string\n\t\t */\n\t\tprotected function get_default_primary_column_name() {\n\t\t\treturn 'plugin';\n\t\t}\n\n\t\t/**\n\t\t * Get the name of the primary column.\n\t\t *\n\t\t * @since 2.5.0 / WP 4.3+ compatibility\n\t\t * @access protected\n\t\t *\n\t\t * @return string The name of the primary column.\n\t\t */\n\t\tprotected function get_primary_column_name() {\n\t\t\tif ( method_exists( 'WP_List_Table', 'get_primary_column_name' ) ) {\n\t\t\t\treturn parent::get_primary_column_name();\n\t\t\t} else {\n\t\t\t\treturn $this->get_default_primary_column_name();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Get the actions which are relevant for a specific plugin row.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param array $item Array of item data.\n\t\t * @return array Array with relevant action links.\n\t\t */\n\t\tprotected function get_row_actions( $item ) {\n\t\t\t$actions      = array();\n\t\t\t$action_links = array();\n\n\t\t\t// Display the 'Install' action link if the plugin is not yet available.\n\t\t\tif ( ! $this->tgmpa->is_plugin_installed( $item['slug'] ) ) {\n\t\t\t\t$actions['install'] = _x( 'Install %2$s', '%2$s = plugin name in screen reader markup', 'zues' );\n\t\t\t} else {\n\t\t\t\t// Display the 'Update' action link if an update is available and WP complies with plugin minimum.\n\t\t\t\tif ( false !== $this->tgmpa->does_plugin_have_update( $item['slug'] ) && $this->tgmpa->can_plugin_update( $item['slug'] ) ) {\n\t\t\t\t\t$actions['update'] = _x( 'Update %2$s', '%2$s = plugin name in screen reader markup', 'zues' );\n\t\t\t\t}\n\n\t\t\t\t// Display the 'Activate' action link, but only if the plugin meets the minimum version.\n\t\t\t\tif ( $this->tgmpa->can_plugin_activate( $item['slug'] ) ) {\n\t\t\t\t\t$actions['activate'] = _x( 'Activate %2$s', '%2$s = plugin name in screen reader markup', 'zues' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create the actual links.\n\t\t\tforeach ( $actions as $action => $text ) {\n\t\t\t\t$nonce_url = wp_nonce_url(\n\t\t\t\t\tadd_query_arg(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t'plugin'           => urlencode( $item['slug'] ),\n\t\t\t\t\t\t\t'tgmpa-' . $action => $action . '-plugin',\n\t\t\t\t\t\t),\n\t\t\t\t\t\t$this->tgmpa->get_tgmpa_url()\n\t\t\t\t\t),\n\t\t\t\t\t'tgmpa-' . $action,\n\t\t\t\t\t'tgmpa-nonce'\n\t\t\t\t);\n\n\t\t\t\t$action_links[ $action ] = sprintf(\n\t\t\t\t\t'<a href=\"%1$s\">' . esc_html( $text ) . '</a>',\n\t\t\t\t\tesc_url( $nonce_url ),\n\t\t\t\t\t'<span class=\"screen-reader-text\">' . esc_html( $item['sanitized_plugin'] ) . '</span>'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t$prefix = ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN ) ? 'network_admin_' : '';\n\t\t\treturn apply_filters( \"tgmpa_{$prefix}plugin_action_links\", array_filter( $action_links ), $item['slug'], $item, $this->view_context );\n\t\t}\n\n\t\t/**\n\t\t * Generates content for a single row of the table.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param object $item The current item.\n\t\t */\n\t\tpublic function single_row( $item ) {\n\t\t\tparent::single_row( $item );\n\n\t\t\t/**\n\t\t\t * Fires after each specific row in the TGMPA Plugins list table.\n\t\t\t *\n\t\t\t * The dynamic portion of the hook name, `$item['slug']`, refers to the slug\n\t\t\t * for the plugin.\n\t\t\t *\n\t\t\t * @since 2.5.0\n\t\t\t */\n\t\t\tdo_action( \"tgmpa_after_plugin_row_{$item['slug']}\", $item['slug'], $item, $this->view_context );\n\t\t}\n\n\t\t/**\n\t\t * Show the upgrade notice below a plugin row if there is one.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @see /wp-admin/includes/update.php\n\t\t *\n\t\t * @param string $slug Plugin slug.\n\t\t * @param array  $item The information available in this table row.\n\t\t * @return null Return early if upgrade notice is empty.\n\t\t */\n\t\tpublic function wp_plugin_update_row( $slug, $item ) {\n\t\t\tif ( empty( $item['upgrade_notice'] ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\techo '\n\t\t\t\t<tr class=\"plugin-update-tr\">\n\t\t\t\t\t<td colspan=\"', absint( $this->get_column_count() ), '\" class=\"plugin-update colspanchange\">\n\t\t\t\t\t\t<div class=\"update-message\">',\n\t\t\t\t\t\t\tesc_html__( 'Upgrade message from the plugin author:', 'zues' ),\n\t\t\t\t\t\t\t' <strong>', wp_kses_data( $item['upgrade_notice'] ), '</strong>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>';\n\t\t}\n\n\t\t/**\n\t\t * Extra controls to be displayed between bulk actions and pagination.\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @param string $which 'top' or 'bottom' table navigation.\n\t\t */\n\t\tpublic function extra_tablenav( $which ) {\n\t\t\tif ( 'bottom' === $which ) {\n\t\t\t\t$this->tgmpa->show_tgmpa_version();\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Defines the bulk actions for handling registered plugins.\n\t\t *\n\t\t * @since 2.2.0\n\t\t *\n\t\t * @return array $actions The bulk actions for the plugin install table.\n\t\t */\n\t\tpublic function get_bulk_actions() {\n\n\t\t\t$actions = array();\n\n\t\t\tif ( 'update' !== $this->view_context && 'activate' !== $this->view_context ) {\n\t\t\t\tif ( current_user_can( 'install_plugins' ) ) {\n\t\t\t\t\t$actions['tgmpa-bulk-install'] = __( 'Install', 'zues' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( 'install' !== $this->view_context ) {\n\t\t\t\tif ( current_user_can( 'update_plugins' ) ) {\n\t\t\t\t\t$actions['tgmpa-bulk-update'] = __( 'Update', 'zues' );\n\t\t\t\t}\n\t\t\t\tif ( current_user_can( 'activate_plugins' ) ) {\n\t\t\t\t\t$actions['tgmpa-bulk-activate'] = __( 'Activate', 'zues' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $actions;\n\t\t}\n\n\t\t/**\n\t\t * Processes bulk installation and activation actions.\n\t\t *\n\t\t * The bulk installation process looks for the $_POST information and passes that\n\t\t * through if a user has to use WP_Filesystem to enter their credentials.\n\t\t *\n\t\t * @since 2.2.0\n\t\t */\n\t\tpublic function process_bulk_actions() {\n\t\t\t// Bulk installation process.\n\t\t\tif ( 'tgmpa-bulk-install' === $this->current_action() || 'tgmpa-bulk-update' === $this->current_action() ) {\n\n\t\t\t\tcheck_admin_referer( 'bulk-' . $this->_args['plural'] );\n\n\t\t\t\t$install_type = 'install';\n\t\t\t\tif ( 'tgmpa-bulk-update' === $this->current_action() ) {\n\t\t\t\t\t$install_type = 'update';\n\t\t\t\t}\n\n\t\t\t\t$plugins_to_install = array();\n\n\t\t\t\t// Did user actually select any plugins to install/update ?\n\t\t\t\tif ( empty( $_POST['plugin'] ) ) {\n\t\t\t\t\tif ( 'install' === $install_type ) {\n\t\t\t\t\t\t$message = __( 'No plugins were selected to be installed. No action taken.', 'zues' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$message = __( 'No plugins were selected to be updated. No action taken.', 'zues' );\n\t\t\t\t\t}\n\n\t\t\t\t\techo '<div id=\"message\" class=\"error\"><p>', esc_html( $message ), '</p></div>';\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif ( is_array( $_POST['plugin'] ) ) {\n\t\t\t\t\t$plugins_to_install = (array) $_POST['plugin'];\n\t\t\t\t} elseif ( is_string( $_POST['plugin'] ) ) {\n\t\t\t\t\t// Received via Filesystem page - un-flatten array (WP bug #19643).\n\t\t\t\t\t$plugins_to_install = explode( ',', $_POST['plugin'] );\n\t\t\t\t}\n\n\t\t\t\t// Sanitize the received input.\n\t\t\t\t$plugins_to_install = array_map( 'urldecode', $plugins_to_install );\n\t\t\t\t$plugins_to_install = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins_to_install );\n\n\t\t\t\t// Validate the received input.\n\t\t\t\tforeach ( $plugins_to_install as $key => $slug ) {\n\t\t\t\t\t// Check if the plugin was registered with TGMPA and remove if not.\n\t\t\t\t\tif ( ! isset( $this->tgmpa->plugins[ $slug ] ) ) {\n\t\t\t\t\t\tunset( $plugins_to_install[ $key ] );\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For updates: make sure this is a plugin we *can* update (update available and WP version ok).\n\t\t\t\t\tif ( 'update' === $install_type && ( $this->tgmpa->is_plugin_installed( $slug ) && ( false === $this->tgmpa->does_plugin_have_update( $slug ) || ! $this->tgmpa->can_plugin_update( $slug ) ) ) ) {\n\t\t\t\t\t\tunset( $plugins_to_install[ $key ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// No need to proceed further if we have no plugins to handle.\n\t\t\t\tif ( empty( $plugins_to_install ) ) {\n\t\t\t\t\tif ( 'install' === $install_type ) {\n\t\t\t\t\t\t$message = __( 'No plugins are available to be installed at this time.', 'zues' );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$message = __( 'No plugins are available to be updated at this time.', 'zues' );\n\t\t\t\t\t}\n\n\t\t\t\t\techo '<div id=\"message\" class=\"error\"><p>', esc_html( $message ), '</p></div>';\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Pass all necessary information if WP_Filesystem is needed.\n\t\t\t\t$url = wp_nonce_url(\n\t\t\t\t\t$this->tgmpa->get_tgmpa_url(),\n\t\t\t\t\t'bulk-' . $this->_args['plural']\n\t\t\t\t);\n\n\t\t\t\t// Give validated data back to $_POST which is the only place the filesystem looks for extra fields.\n\t\t\t\t$_POST['plugin'] = implode( ',', $plugins_to_install ); // Work around for WP bug #19643.\n\n\t\t\t\t$method = ''; // Leave blank so WP_Filesystem can populate it as necessary.\n\t\t\t\t$fields = array_keys( $_POST ); // Extra fields to pass to WP_Filesystem.\n\n\t\t\t\tif ( false === ( $creds = request_filesystem_credentials( esc_url_raw( $url ), $method, false, false, $fields ) ) ) {\n\t\t\t\t\treturn true; // Stop the normal page form from displaying, credential request form will be shown.\n\t\t\t\t}\n\n\t\t\t\t// Now we have some credentials, setup WP_Filesystem.\n\t\t\t\tif ( ! WP_Filesystem( $creds ) ) {\n\t\t\t\t\t// Our credentials were no good, ask the user for them again.\n\t\t\t\t\trequest_filesystem_credentials( esc_url_raw( $url ), $method, true, false, $fields );\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t/* If we arrive here, we have the filesystem */\n\n\t\t\t\t// Store all information in arrays since we are processing a bulk installation.\n\t\t\t\t$names      = array();\n\t\t\t\t$sources    = array(); // Needed for installs.\n\t\t\t\t$file_paths = array(); // Needed for upgrades.\n\t\t\t\t$to_inject  = array(); // Information to inject into the update_plugins transient.\n\n\t\t\t\t// Prepare the data for validated plugins for the install/upgrade.\n\t\t\t\tforeach ( $plugins_to_install as $slug ) {\n\t\t\t\t\t$name   = $this->tgmpa->plugins[ $slug ]['name'];\n\t\t\t\t\t$source = $this->tgmpa->get_download_url( $slug );\n\n\t\t\t\t\tif ( ! empty( $name ) && ! empty( $source ) ) {\n\t\t\t\t\t\t$names[] = $name;\n\n\t\t\t\t\t\tswitch ( $install_type ) {\n\n\t\t\t\t\t\t\tcase 'install':\n\t\t\t\t\t\t\t\t$sources[] = $source;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\t\t$file_paths[]                 = $this->tgmpa->plugins[ $slug ]['file_path'];\n\t\t\t\t\t\t\t\t$to_inject[ $slug ]           = $this->tgmpa->plugins[ $slug ];\n\t\t\t\t\t\t\t\t$to_inject[ $slug ]['source'] = $source;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset( $slug, $name, $source );\n\n\t\t\t\t// Create a new instance of TGMPA_Bulk_Installer.\n\t\t\t\t$installer = new TGMPA_Bulk_Installer(\n\t\t\t\t\tnew TGMPA_Bulk_Installer_Skin(\n\t\t\t\t\t\tarray(\n\t\t\t\t\t\t\t'url'          => esc_url_raw( $this->tgmpa->get_tgmpa_url() ),\n\t\t\t\t\t\t\t'nonce'        => 'bulk-' . $this->_args['plural'],\n\t\t\t\t\t\t\t'names'        => $names,\n\t\t\t\t\t\t\t'install_type' => $install_type,\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t\t// Wrap the install process with the appropriate HTML.\n\t\t\t\techo '<div class=\"tgmpa wrap\">',\n\t\t\t\t\t'<h2>', esc_html( get_admin_page_title() ), '</h2>';\n\n\t\t\t\t// Process the bulk installation submissions.\n\t\t\t\tadd_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1, 3 );\n\n\t\t\t\tif ( 'tgmpa-bulk-update' === $this->current_action() ) {\n\t\t\t\t\t// Inject our info into the update transient.\n\t\t\t\t\t$this->tgmpa->inject_update_info( $to_inject );\n\n\t\t\t\t\t$installer->bulk_upgrade( $file_paths );\n\t\t\t\t} else {\n\t\t\t\t\t$installer->bulk_install( $sources );\n\t\t\t\t}\n\n\t\t\t\tremove_filter( 'upgrader_source_selection', array( $this->tgmpa, 'maybe_adjust_source_dir' ), 1, 3 );\n\n\t\t\t\techo '</div>';\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Bulk activation process.\n\t\t\tif ( 'tgmpa-bulk-activate' === $this->current_action() ) {\n\t\t\t\tcheck_admin_referer( 'bulk-' . $this->_args['plural'] );\n\n\t\t\t\t// Did user actually select any plugins to activate ?\n\t\t\t\tif ( empty( $_POST['plugin'] ) ) {\n\t\t\t\t\techo '<div id=\"message\" class=\"error\"><p>', esc_html__( 'No plugins were selected to be activated. No action taken.', 'zues' ), '</p></div>';\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Grab plugin data from $_POST.\n\t\t\t\t$plugins = array();\n\t\t\t\tif ( isset( $_POST['plugin'] ) ) {\n\t\t\t\t\t$plugins = array_map( 'urldecode', (array) $_POST['plugin'] );\n\t\t\t\t\t$plugins = array_map( array( $this->tgmpa, 'sanitize_key' ), $plugins );\n\t\t\t\t}\n\n\t\t\t\t$plugins_to_activate = array();\n\t\t\t\t$plugin_names        = array();\n\n\t\t\t\t// Grab the file paths for the selected & inactive plugins from the registration array.\n\t\t\t\tforeach ( $plugins as $slug ) {\n\t\t\t\t\tif ( $this->tgmpa->can_plugin_activate( $slug ) ) {\n\t\t\t\t\t\t$plugins_to_activate[] = $this->tgmpa->plugins[ $slug ]['file_path'];\n\t\t\t\t\t\t$plugin_names[]        = $this->tgmpa->plugins[ $slug ]['name'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tunset( $slug );\n\n\t\t\t\t// Return early if there are no plugins to activate.\n\t\t\t\tif ( empty( $plugins_to_activate ) ) {\n\t\t\t\t\techo '<div id=\"message\" class=\"error\"><p>', esc_html__( 'No plugins are available to be activated at this time.', 'zues' ), '</p></div>';\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Now we are good to go - let's start activating plugins.\n\t\t\t\t$activate = activate_plugins( $plugins_to_activate );\n\n\t\t\t\tif ( is_wp_error( $activate ) ) {\n\t\t\t\t\techo '<div id=\"message\" class=\"error\"><p>', wp_kses_post( $activate->get_error_message() ), '</p></div>';\n\t\t\t\t} else {\n\t\t\t\t\t$count        = count( $plugin_names ); // Count so we can use _n function.\n\t\t\t\t\t$plugin_names = array_map( array( 'TGMPA_Utils', 'wrap_in_strong' ), $plugin_names );\n\t\t\t\t\t$last_plugin  = array_pop( $plugin_names ); // Pop off last name to prep for readability.\n\t\t\t\t\t$imploded     = empty( $plugin_names ) ? $last_plugin : ( implode( ', ', $plugin_names ) . ' ' . esc_html_x( 'and', 'plugin A *and* plugin B', 'zues' ) . ' ' . $last_plugin );\n\n\t\t\t\t\tprintf( // WPCS: xss ok.\n\t\t\t\t\t\t'<div id=\"message\" class=\"updated\"><p>%1$s %2$s.</p></div>',\n\t\t\t\t\t\tesc_html( _n( 'The following plugin was activated successfully:', 'The following plugins were activated successfully:', $count, 'zues' ) ),\n\t\t\t\t\t\t$imploded\n\t\t\t\t\t);\n\n\t\t\t\t\t// Update recently activated plugins option.\n\t\t\t\t\t$recent = (array) get_option( 'recently_activated' );\n\t\t\t\t\tforeach ( $plugins_to_activate as $plugin => $time ) {\n\t\t\t\t\t\tif ( isset( $recent[ $plugin ] ) ) {\n\t\t\t\t\t\t\tunset( $recent[ $plugin ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tupdate_option( 'recently_activated', $recent );\n\t\t\t\t}\n\n\t\t\t\tunset( $_POST ); // Reset the $_POST variable in case user wants to perform one action after another.\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/**\n\t\t * Prepares all of our information to be outputted into a usable table.\n\t\t *\n\t\t * @since 2.2.0\n\t\t */\n\t\tpublic function prepare_items() {\n\t\t\t$columns               = $this->get_columns(); // Get all necessary column information.\n\t\t\t$hidden                = array(); // No columns to hide, but we must set as an array.\n\t\t\t$sortable              = array(); // No reason to make sortable columns.\n\t\t\t$primary               = $this->get_primary_column_name(); // Column which has the row actions.\n\t\t\t$this->_column_headers = array( $columns, $hidden, $sortable, $primary ); // Get all necessary column headers.\n\n\t\t\t// Process our bulk activations here.\n\t\t\tif ( 'tgmpa-bulk-activate' === $this->current_action() ) {\n\t\t\t\t$this->process_bulk_actions();\n\t\t\t}\n\n\t\t\t// Store all of our plugin data into $items array so WP_List_Table can use it.\n\t\t\t$this->items = apply_filters( 'tgmpa_table_data_items', $this->_gather_plugin_data() );\n\t\t}\n\n\t\t/* *********** DEPRECATED METHODS *********** */\n\n\t\t/**\n\t\t * Retrieve plugin data, given the plugin name.\n\t\t *\n\t\t * @since      2.2.0\n\t\t * @deprecated 2.5.0 use {@see TGM_Plugin_Activation::_get_plugin_data_from_name()} instead.\n\t\t * @see        TGM_Plugin_Activation::_get_plugin_data_from_name()\n\t\t *\n\t\t * @param string $name Name of the plugin, as it was registered.\n\t\t * @param string $data Optional. Array key of plugin data to return. Default is slug.\n\t\t * @return string|boolean Plugin slug if found, false otherwise.\n\t\t */\n\t\tprotected function _get_plugin_data_from_name( $name, $data = 'slug' ) {\n\t\t\t_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'TGM_Plugin_Activation::_get_plugin_data_from_name()' );\n\n\t\t\treturn $this->tgmpa->_get_plugin_data_from_name( $name, $data );\n\t\t}\n\t}\n}\n\n\nif ( ! class_exists( 'TGM_Bulk_Installer' ) ) {\n\n\t/**\n\t * Hack: Prevent TGMPA v2.4.1- bulk installer class from being loaded if 2.4.1- is loaded after 2.5+.\n\t */\n\tclass TGM_Bulk_Installer {\n\t}\n}\nif ( ! class_exists( 'TGM_Bulk_Installer_Skin' ) ) {\n\n\t/**\n\t * Hack: Prevent TGMPA v2.4.1- bulk installer skin class from being loaded if 2.4.1- is loaded after 2.5+.\n\t */\n\tclass TGM_Bulk_Installer_Skin {\n\t}\n}\n\n/**\n * The WP_Upgrader file isn't always available. If it isn't available,\n * we load it here.\n *\n * We check to make sure no action or activation keys are set so that WordPress\n * does not try to re-include the class when processing upgrades or installs outside\n * of the class.\n *\n * @since 2.2.0\n */\nadd_action( 'admin_init', 'tgmpa_load_bulk_installer' );\nif ( ! function_exists( 'tgmpa_load_bulk_installer' ) ) {\n\t/**\n\t * Load bulk installer\n\t */\n\tfunction tgmpa_load_bulk_installer() {\n\t\t// Silently fail if 2.5+ is loaded *after* an older version.\n\t\tif ( ! isset( $GLOBALS['zues'] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Get TGMPA class instance.\n\t\t$tgmpa_instance = call_user_func( array( get_class( $GLOBALS['zues'] ), 'get_instance' ) );\n\n\t\tif ( isset( $_GET['page'] ) && $tgmpa_instance->menu === $_GET['page'] ) {\n\t\t\tif ( ! class_exists( 'Plugin_Upgrader', false ) ) {\n\t\t\t\trequire_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';\n\t\t\t}\n\n\t\t\tif ( ! class_exists( 'TGMPA_Bulk_Installer' ) ) {\n\n\t\t\t\t/**\n\t\t\t\t * Installer class to handle bulk plugin installations.\n\t\t\t\t *\n\t\t\t\t * Extends WP_Upgrader and customizes to suit the installation of multiple\n\t\t\t\t * plugins.\n\t\t\t\t *\n\t\t\t\t * @since 2.2.0\n\t\t\t\t *\n\t\t\t\t * @internal Since 2.5.0 the class is an extension of Plugin_Upgrader rather than WP_Upgrader\n\t\t\t\t * @internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer to TGMPA_Bulk_Installer.\n\t\t\t\t *           This was done to prevent backward compatibility issues with v2.3.6.\n\t\t\t\t *\n\t\t\t\t * @package TGM-Plugin-Activation\n\t\t\t\t * @author  Thomas Griffin\n\t\t\t\t * @author  Gary Jones\n\t\t\t\t */\n\t\t\t\tclass TGMPA_Bulk_Installer extends Plugin_Upgrader {\n\t\t\t\t\t/**\n\t\t\t\t\t * Holds result of bulk plugin installation.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @var string\n\t\t\t\t\t */\n\t\t\t\t\tpublic $result;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Flag to check if bulk installation is occurring or not.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @var boolean\n\t\t\t\t\t */\n\t\t\t\t\tpublic $bulk = false;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * TGMPA instance\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.5.0\n\t\t\t\t\t *\n\t\t\t\t\t * @var object\n\t\t\t\t\t */\n\t\t\t\t\tprotected $tgmpa;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Whether or not the destination directory needs to be cleared ( = on update).\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.5.0\n\t\t\t\t\t *\n\t\t\t\t\t * @var bool\n\t\t\t\t\t */\n\t\t\t\t\tprotected $clear_destination = false;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * References parent constructor and sets defaults for class.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param \\Bulk_Upgrader_Skin|null $skin Installer skin.\n\t\t\t\t\t */\n\t\t\t\t\tpublic function __construct( $skin = null ) {\n\t\t\t\t\t\t// Get TGMPA class instance.\n\t\t\t\t\t\t$this->tgmpa = call_user_func( array( get_class( $GLOBALS['zues'] ), 'get_instance' ) );\n\n\t\t\t\t\t\tparent::__construct( $skin );\n\n\t\t\t\t\t\tif ( isset( $this->skin->options['install_type'] ) && 'update' === $this->skin->options['install_type'] ) {\n\t\t\t\t\t\t\t$this->clear_destination = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( $this->tgmpa->is_automatic ) {\n\t\t\t\t\t\t\t$this->activate_strings();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tadd_action( 'upgrader_process_complete', array( $this->tgmpa, 'populate_file_path' ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Sets the correct activation strings for the installer skin to use.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t */\n\t\t\t\t\tpublic function activate_strings() {\n\t\t\t\t\t\t$this->strings['activation_failed']  = __( 'Plugin activation failed.', 'zues' );\n\t\t\t\t\t\t$this->strings['activation_success'] = __( 'Plugin activated successfully.', 'zues' );\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Performs the actual installation of each plugin.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @see WP_Upgrader::run()\n\t\t\t\t\t *\n\t\t\t\t\t * @param array $options The installation config options.\n\t\t\t\t\t * @return null|array Return early if error, array of installation data on success.\n\t\t\t\t\t */\n\t\t\t\t\tpublic function run( $options ) {\n\t\t\t\t\t\t$result = parent::run( $options );\n\n\t\t\t\t\t\t// Reset the strings in case we changed one during automatic activation.\n\t\t\t\t\t\tif ( $this->tgmpa->is_automatic ) {\n\t\t\t\t\t\t\tif ( 'update' === $this->skin->options['install_type'] ) {\n\t\t\t\t\t\t\t\t$this->upgrade_strings();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$this->install_strings();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn $result;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Processes the bulk installation of plugins.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @internal This is basically a near identical copy of the WP Core Plugin_Upgrader::bulk_upgrade()\n\t\t\t\t\t * method, with minor adjustments to deal with new installs instead of upgrades.\n\t\t\t\t\t * For ease of future synchronizations, the adjustments are clearly commented, but no other\n\t\t\t\t\t * comments are added. Code style has been made to comply.\n\t\t\t\t\t *\n\t\t\t\t\t * @see Plugin_Upgrader::bulk_upgrade()\n\t\t\t\t\t * @see https://core.trac.wordpress.org/browser/tags/4.2.1/src/wp-admin/includes/class-wp-upgrader.php#L838\n\t\t\t\t\t *\n\t\t\t\t\t * @param array $plugins The plugin sources needed for installation.\n\t\t\t\t\t * @param array $args    Arbitrary passed extra arguments.\n\t\t\t\t\t * @return string|bool Install confirmation messages on success, false on failure.\n\t\t\t\t\t */\n\t\t\t\t\tpublic function bulk_install( $plugins, $args = array() ) {\n\t\t\t\t\t\t// [TGMPA + ] Hook auto-activation in.\n\t\t\t\t\t\tadd_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );\n\n\t\t\t\t\t\t$defaults    = array(\n\t\t\t\t\t\t\t'clear_update_cache' => true,\n\t\t\t\t\t\t);\n\t\t\t\t\t\t$parsed_args = wp_parse_args( $args, $defaults );\n\n\t\t\t\t\t\t$this->init();\n\t\t\t\t\t\t$this->bulk = true;\n\n\t\t\t\t\t\t$this->install_strings(); // [TGMPA + ] adjusted.\n\n\t\t\t\t\t\t/* [TGMPA - ] $current = get_site_transient( 'update_plugins' ); */\n\n\t\t\t\t\t\t/* [TGMPA - ] add_filter('upgrader_clear_destination', array($this, 'delete_old_plugin'), 10, 4); */\n\n\t\t\t\t\t\t$this->skin->header();\n\n\t\t\t\t\t\t// Connect to the Filesystem first.\n\t\t\t\t\t\t$res = $this->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) );\n\t\t\t\t\t\tif ( ! $res ) {\n\t\t\t\t\t\t\t$this->skin->footer();\n\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this->skin->bulk_header();\n\n\t\t\t\t\t\t// Only start maintenance mode if:\n\t\t\t\t\t\t// - running Multisite and there are one or more plugins specified, OR\n\t\t\t\t\t\t// - a plugin with an update available is currently active.\n\t\t\t\t\t\t// @TODO: For multisite, maintenance mode should only kick in for individual sites if at all possible.\n\t\t\t\t\t\t$maintenance = ( is_multisite() && ! empty( $plugins ) );\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t[TGMPA - ]\n\t\t\t\t\t\tforeach ( $plugins as $plugin )\n\t\t\t\t\t\t\t$maintenance = $maintenance || ( is_plugin_active( $plugin ) && isset( $current->response[ $plugin] ) );\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tif ( $maintenance ) {\n\t\t\t\t\t\t\t$this->maintenance_mode( true );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$results = array();\n\n\t\t\t\t\t\t$this->update_count   = count( $plugins );\n\t\t\t\t\t\t$this->update_current = 0;\n\t\t\t\t\t\tforeach ( $plugins as $plugin ) {\n\t\t\t\t\t\t\t$this->update_current++;\n\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t[TGMPA - ]\n\t\t\t\t\t\t\t$this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true);\n\n\t\t\t\t\t\t\tif ( !isset( $current->response[ $plugin ] ) ) {\n\t\t\t\t\t\t\t\t$this->skin->set_result('up_to_date');\n\t\t\t\t\t\t\t\t$this->skin->before();\n\t\t\t\t\t\t\t\t$this->skin->feedback('up_to_date');\n\t\t\t\t\t\t\t\t$this->skin->after();\n\t\t\t\t\t\t\t\t$results[$plugin] = true;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Get the URL to the zip file\n\t\t\t\t\t\t\t$r = $current->response[ $plugin ];\n\n\t\t\t\t\t\t\t$this->skin->plugin_active = is_plugin_active($plugin);\n\t\t\t\t\t\t\t*/\n\n\t\t\t\t\t\t\t$result = $this->run( array(\n\t\t\t\t\t\t\t\t'package'           => $plugin, // [TGMPA + ] adjusted.\n\t\t\t\t\t\t\t\t'destination'       => WP_PLUGIN_DIR,\n\t\t\t\t\t\t\t\t'clear_destination' => false, // [TGMPA + ] adjusted.\n\t\t\t\t\t\t\t\t'clear_working'     => true,\n\t\t\t\t\t\t\t\t'is_multi'          => true,\n\t\t\t\t\t\t\t\t'hook_extra'        => array(\n\t\t\t\t\t\t\t\t\t'plugin' => $plugin,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t) );\n\n\t\t\t\t\t\t\t$results[ $plugin ] = $this->result;\n\n\t\t\t\t\t\t\t// Prevent credentials auth screen from displaying multiple times.\n\t\t\t\t\t\t\tif ( false === $result ) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} //end foreach $plugins\n\n\t\t\t\t\t\t$this->maintenance_mode( false );\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Fires when the bulk upgrader process is complete.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @since WP 3.6.0 / TGMPA 2.5.0\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @param Plugin_Upgrader $this Plugin_Upgrader instance. In other contexts, $this, might\n\t\t\t\t\t\t *                              be a Theme_Upgrader or Core_Upgrade instance.\n\t\t\t\t\t\t * @param array           $data {\n\t\t\t\t\t\t *     Array of bulk item update data.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t *     @type string $action   Type of action. Default 'update'.\n\t\t\t\t\t\t *     @type string $type     Type of update process. Accepts 'plugin', 'theme', or 'core'.\n\t\t\t\t\t\t *     @type bool   $bulk     Whether the update process is a bulk update. Default true.\n\t\t\t\t\t\t *     @type array  $packages Array of plugin, theme, or core packages to update.\n\t\t\t\t\t\t * }\n\t\t\t\t\t\t */\n\t\t\t\t\t\tdo_action( 'upgrader_process_complete', $this, array(\n\t\t\t\t\t\t\t'action'  => 'install', // [TGMPA + ] adjusted.\n\t\t\t\t\t\t\t'type'    => 'plugin',\n\t\t\t\t\t\t\t'bulk'    => true,\n\t\t\t\t\t\t\t'plugins' => $plugins,\n\t\t\t\t\t\t) );\n\n\t\t\t\t\t\t$this->skin->bulk_footer();\n\n\t\t\t\t\t\t$this->skin->footer();\n\n\t\t\t\t\t\t// Cleanup our hooks, in case something else does a upgrade on this connection.\n\t\t\t\t\t\t/* [TGMPA - ] remove_filter('upgrader_clear_destination', array($this, 'delete_old_plugin')); */\n\n\t\t\t\t\t\t// [TGMPA + ] Remove our auto-activation hook.\n\t\t\t\t\t\tremove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );\n\n\t\t\t\t\t\t// Force refresh of plugin update information.\n\t\t\t\t\t\twp_clean_plugins_cache( $parsed_args['clear_update_cache'] );\n\n\t\t\t\t\t\treturn $results;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Handle a bulk upgrade request.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.5.0\n\t\t\t\t\t *\n\t\t\t\t\t * @see Plugin_Upgrader::bulk_upgrade()\n\t\t\t\t\t *\n\t\t\t\t\t * @param array $plugins The local WP file_path's of the plugins which should be upgraded.\n\t\t\t\t\t * @param array $args    Arbitrary passed extra arguments.\n\t\t\t\t\t * @return string|bool Install confirmation messages on success, false on failure.\n\t\t\t\t\t */\n\t\t\t\t\tpublic function bulk_upgrade( $plugins, $args = array() ) {\n\n\t\t\t\t\t\tadd_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );\n\n\t\t\t\t\t\t$result = parent::bulk_upgrade( $plugins, $args );\n\n\t\t\t\t\t\tremove_filter( 'upgrader_post_install', array( $this, 'auto_activate' ), 10 );\n\n\t\t\t\t\t\treturn $result;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Abuse a filter to auto-activate plugins after installation.\n\t\t\t\t\t *\n\t\t\t\t\t * Hooked into the 'upgrader_post_install' filter hook.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.5.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param bool $bool The value we need to give back (true).\n\t\t\t\t\t * @return bool\n\t\t\t\t\t */\n\t\t\t\t\tpublic function auto_activate( $bool ) {\n\t\t\t\t\t\t// Only process the activation of installed plugins if the automatic flag is set to true.\n\t\t\t\t\t\tif ( $this->tgmpa->is_automatic ) {\n\t\t\t\t\t\t\t// Flush plugins cache so the headers of the newly installed plugins will be read correctly.\n\t\t\t\t\t\t\twp_clean_plugins_cache();\n\n\t\t\t\t\t\t\t// Get the installed plugin file.\n\t\t\t\t\t\t\t$plugin_info = $this->plugin_info();\n\n\t\t\t\t\t\t\t// Don't try to activate on upgrade of active plugin as WP will do this already.\n\t\t\t\t\t\t\tif ( ! is_plugin_active( $plugin_info ) ) {\n\t\t\t\t\t\t\t\t$activate = activate_plugin( $plugin_info );\n\n\t\t\t\t\t\t\t\t// Adjust the success string based on the activation result.\n\t\t\t\t\t\t\t\t$this->strings['process_success'] = $this->strings['process_success'] . \"<br />\\n\";\n\n\t\t\t\t\t\t\t\tif ( is_wp_error( $activate ) ) {\n\t\t\t\t\t\t\t\t\t$this->skin->error( $activate );\n\t\t\t\t\t\t\t\t\t$this->strings['process_success'] .= $this->strings['activation_failed'];\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$this->strings['process_success'] .= $this->strings['activation_success'];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn $bool;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( ! class_exists( 'TGMPA_Bulk_Installer_Skin' ) ) {\n\n\t\t\t\t/**\n\t\t\t\t * Installer skin to set strings for the bulk plugin installations..\n\t\t\t\t *\n\t\t\t\t * Extends Bulk_Upgrader_Skin and customizes to suit the installation of multiple\n\t\t\t\t * plugins.\n\t\t\t\t *\n\t\t\t\t * @since 2.2.0\n\t\t\t\t *\n\t\t\t\t * @internal Since 2.5.2 the class has been renamed from TGM_Bulk_Installer_Skin to\n\t\t\t\t *           TGMPA_Bulk_Installer_Skin.\n\t\t\t\t *           This was done to prevent backward compatibility issues with v2.3.6.\n\t\t\t\t *\n\t\t\t\t * @see https://core.trac.wordpress.org/browser/trunk/src/wp-admin/includes/class-wp-upgrader-skins.php\n\t\t\t\t *\n\t\t\t\t * @package TGM-Plugin-Activation\n\t\t\t\t * @author  Thomas Griffin\n\t\t\t\t * @author  Gary Jones\n\t\t\t\t */\n\t\t\t\tclass TGMPA_Bulk_Installer_Skin extends Bulk_Upgrader_Skin {\n\t\t\t\t\t/**\n\t\t\t\t\t * Holds plugin info for each individual plugin installation.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @var array\n\t\t\t\t\t */\n\t\t\t\t\tpublic $plugin_info = array();\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Holds names of plugins that are undergoing bulk installations.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @var array\n\t\t\t\t\t */\n\t\t\t\t\tpublic $plugin_names = array();\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Integer to use for iteration through each plugin installation.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @var integer\n\t\t\t\t\t */\n\t\t\t\t\tpublic $i = 0;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * TGMPA instance\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.5.0\n\t\t\t\t\t *\n\t\t\t\t\t * @var object\n\t\t\t\t\t */\n\t\t\t\t\tprotected $tgmpa;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Constructor. Parses default args with new ones and extracts them for use.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param array $args Arguments to pass for use within the class.\n\t\t\t\t\t */\n\t\t\t\t\tpublic function __construct( $args = array() ) {\n\t\t\t\t\t\t// Get TGMPA class instance.\n\t\t\t\t\t\t$this->tgmpa = call_user_func( array( get_class( $GLOBALS['zues'] ), 'get_instance' ) );\n\n\t\t\t\t\t\t// Parse default and new args.\n\t\t\t\t\t\t$defaults = array(\n\t\t\t\t\t\t\t'url'          => '',\n\t\t\t\t\t\t\t'nonce'        => '',\n\t\t\t\t\t\t\t'names'        => array(),\n\t\t\t\t\t\t\t'install_type' => 'install',\n\t\t\t\t\t\t);\n\t\t\t\t\t\t$args     = wp_parse_args( $args, $defaults );\n\n\t\t\t\t\t\t// Set plugin names to $this->plugin_names property.\n\t\t\t\t\t\t$this->plugin_names = $args['names'];\n\n\t\t\t\t\t\t// Extract the new args.\n\t\t\t\t\t\tparent::__construct( $args );\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Sets install skin strings for each individual plugin.\n\t\t\t\t\t *\n\t\t\t\t\t * Checks to see if the automatic activation flag is set and uses the\n\t\t\t\t\t * the proper strings accordingly.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t */\n\t\t\t\t\tpublic function add_strings() {\n\t\t\t\t\t\tif ( 'update' === $this->options['install_type'] ) {\n\t\t\t\t\t\t\tparent::add_strings();\n\t\t\t\t\t\t\t$this->upgrader->strings['skin_before_update_header'] = __( 'Updating Plugin %1$s (%2$d/%3$d)', 'zues' );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this->upgrader->strings['skin_update_failed_error'] = __( 'An error occurred while installing %1$s: <strong>%2$s</strong>.', 'zues' );\n\t\t\t\t\t\t\t$this->upgrader->strings['skin_update_failed']       = __( 'The installation of %1$s failed.', 'zues' );\n\n\t\t\t\t\t\t\tif ( $this->tgmpa->is_automatic ) {\n\t\t\t\t\t\t\t\t// Automatic activation strings.\n\t\t\t\t\t\t\t\t$this->upgrader->strings['skin_upgrade_start']        = __( 'The installation and activation process is starting. This process may take a while on some hosts, so please be patient.', 'zues' );\n\t\t\t\t\t\t\t\t$this->upgrader->strings['skin_update_successful']    = __( '%1$s installed and activated successfully.', 'zues' ) . ' <a href=\"#\" class=\"hide-if-no-js\" onclick=\"%2$s\"><span>' . esc_html__( 'Show Details', 'zues' ) . '</span><span class=\"hidden\">' . esc_html__( 'Hide Details', 'zues' ) . '</span>.</a>';\n\t\t\t\t\t\t\t\t$this->upgrader->strings['skin_upgrade_end']          = __( 'All installations and activations have been completed.', 'zues' );\n\t\t\t\t\t\t\t\t$this->upgrader->strings['skin_before_update_header'] = __( 'Installing and Activating Plugin %1$s (%2$d/%3$d)', 'zues' );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Default installation strings.\n\t\t\t\t\t\t\t\t$this->upgrader->strings['skin_upgrade_start']        = __( 'The installation process is starting. This process may take a while on some hosts, so please be patient.', 'zues' );\n\t\t\t\t\t\t\t\t$this->upgrader->strings['skin_update_successful']    = esc_html__( '%1$s installed successfully.', 'zues' ) . ' <a href=\"#\" class=\"hide-if-no-js\" onclick=\"%2$s\"><span>' . esc_html__( 'Show Details', 'zues' ) . '</span><span class=\"hidden\">' . esc_html__( 'Hide Details', 'zues' ) . '</span>.</a>';\n\t\t\t\t\t\t\t\t$this->upgrader->strings['skin_upgrade_end']          = __( 'All installations have been completed.', 'zues' );\n\t\t\t\t\t\t\t\t$this->upgrader->strings['skin_before_update_header'] = __( 'Installing Plugin %1$s (%2$d/%3$d)', 'zues' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Outputs the header strings and necessary JS before each plugin installation.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param string $title Unused in this implementation.\n\t\t\t\t\t */\n\t\t\t\t\tpublic function before( $title = '' ) {\n\t\t\t\t\t\tif ( empty( $title ) ) {\n\t\t\t\t\t\t\t$title = esc_html( $this->plugin_names[ $this->i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparent::before( $title );\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Outputs the footer strings and necessary JS after each plugin installation.\n\t\t\t\t\t *\n\t\t\t\t\t * Checks for any errors and outputs them if they exist, else output\n\t\t\t\t\t * success strings.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t *\n\t\t\t\t\t * @param string $title Unused in this implementation.\n\t\t\t\t\t */\n\t\t\t\t\tpublic function after( $title = '' ) {\n\t\t\t\t\t\tif ( empty( $title ) ) {\n\t\t\t\t\t\t\t$title = esc_html( $this->plugin_names[ $this->i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tparent::after( $title );\n\n\t\t\t\t\t\t$this->i++;\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Outputs links after bulk plugin installation is complete.\n\t\t\t\t\t *\n\t\t\t\t\t * @since 2.2.0\n\t\t\t\t\t */\n\t\t\t\t\tpublic function bulk_footer() {\n\t\t\t\t\t\t// Serve up the string to say installations (and possibly activations) are complete.\n\t\t\t\t\t\tparent::bulk_footer();\n\n\t\t\t\t\t\t// Flush plugins cache so we can make sure that the installed plugins list is always up to date.\n\t\t\t\t\t\twp_clean_plugins_cache();\n\n\t\t\t\t\t\t$this->tgmpa->show_tgmpa_version();\n\n\t\t\t\t\t\t// Display message based on if all plugins are now active or not.\n\t\t\t\t\t\t$update_actions = array();\n\n\t\t\t\t\t\tif ( $this->tgmpa->is_tgmpa_complete() ) {\n\t\t\t\t\t\t\t// All plugins are active, so we display the complete string and hide the menu to protect users.\n\t\t\t\t\t\t\techo '<style type=\"text/css\">#adminmenu .wp-submenu li.current { display: none !important; }</style>';\n\t\t\t\t\t\t\t$update_actions['dashboard'] = sprintf(\n\t\t\t\t\t\t\t\tesc_html( $this->tgmpa->strings['complete'] ),\n\t\t\t\t\t\t\t\t'<a href=\"' . esc_url( self_admin_url() ) . '\">' . esc_html__( 'Return to the Dashboard', 'zues' ) . '</a>'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$update_actions['tgmpa_page'] = '<a href=\"' . esc_url( $this->tgmpa->get_tgmpa_url() ) . '\" target=\"_parent\">' . esc_html( $this->tgmpa->strings['return'] ) . '</a>';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Filter the list of action links available following bulk plugin installs/updates.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @since 2.5.0\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * @param array $update_actions Array of plugin action links.\n\t\t\t\t\t\t * @param array $plugin_info    Array of information for the last-handled plugin.\n\t\t\t\t\t\t */\n\t\t\t\t\t\t$update_actions = apply_filters( 'tgmpa_update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info );\n\n\t\t\t\t\t\tif ( ! empty( $update_actions ) ) {\n\t\t\t\t\t\t\t$this->feedback( implode( ' | ', (array) $update_actions ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* *********** DEPRECATED METHODS *********** */\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Flush header output buffer.\n\t\t\t\t\t *\n\t\t\t\t\t * @since      2.2.0\n\t\t\t\t\t * @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead\n\t\t\t\t\t * @see        Bulk_Upgrader_Skin::flush_output()\n\t\t\t\t\t */\n\t\t\t\t\tpublic function before_flush_output() {\n\t\t\t\t\t\t_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' );\n\t\t\t\t\t\t$this->flush_output();\n\t\t\t\t\t}\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Flush footer output buffer and iterate $this->i to make sure the\n\t\t\t\t\t * installation strings reference the correct plugin.\n\t\t\t\t\t *\n\t\t\t\t\t * @since      2.2.0\n\t\t\t\t\t * @deprecated 2.5.0 use {@see Bulk_Upgrader_Skin::flush_output()} instead\n\t\t\t\t\t * @see        Bulk_Upgrader_Skin::flush_output()\n\t\t\t\t\t */\n\t\t\t\t\tpublic function after_flush_output() {\n\t\t\t\t\t\t_deprecated_function( __FUNCTION__, 'TGMPA 2.5.0', 'Bulk_Upgrader_Skin::flush_output()' );\n\t\t\t\t\t\t$this->flush_output();\n\t\t\t\t\t\t$this->i++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nif ( ! class_exists( 'TGMPA_Utils' ) ) {\n\n\t/**\n\t * Generic utilities for TGMPA.\n\t *\n\t * All methods are static, poor-dev name-spacing class wrapper.\n\t *\n\t * Class was called TGM_Utils in 2.5.0 but renamed TGMPA_Utils in 2.5.1 as this was conflicting with Soliloquy.\n\t *\n\t * @since 2.5.0\n\t *\n\t * @package TGM-Plugin-Activation\n\t * @author  Juliette Reinders Folmer\n\t */\n\tclass TGMPA_Utils {\n\t\t/**\n\t\t * Whether the PHP filter extension is enabled.\n\t\t *\n\t\t * @see http://php.net/book.filter\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @static\n\t\t *\n\t\t * @var bool $has_filters True is the extension is enabled.\n\t\t */\n\t\tpublic static $has_filters;\n\n\t\t/**\n\t\t * Wrap an arbitrary string in <em> tags. Meant to be used in combination with array_map().\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @static\n\t\t *\n\t\t * @param string $string Text to be wrapped.\n\t\t * @return string\n\t\t */\n\t\tpublic static function wrap_in_em( $string ) {\n\t\t\treturn '<em>' . wp_kses_post( $string ) . '</em>';\n\t\t}\n\n\t\t/**\n\t\t * Wrap an arbitrary string in <strong> tags. Meant to be used in combination with array_map().\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @static\n\t\t *\n\t\t * @param string $string Text to be wrapped.\n\t\t * @return string\n\t\t */\n\t\tpublic static function wrap_in_strong( $string ) {\n\t\t\treturn '<strong>' . wp_kses_post( $string ) . '</strong>';\n\t\t}\n\n\t\t/**\n\t\t * Helper function: Validate a value as boolean\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @static\n\t\t *\n\t\t * @param mixed $value Arbitrary value.\n\t\t * @return bool\n\t\t */\n\t\tpublic static function validate_bool( $value ) {\n\t\t\tif ( ! isset( self::$has_filters ) ) {\n\t\t\t\tself::$has_filters = extension_loaded( 'filter' );\n\t\t\t}\n\n\t\t\tif ( self::$has_filters ) {\n\t\t\t\treturn filter_var( $value, FILTER_VALIDATE_BOOLEAN );\n\t\t\t} else {\n\t\t\t\treturn self::emulate_filter_bool( $value );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Helper function: Cast a value to bool\n\t\t *\n\t\t * @since 2.5.0\n\t\t *\n\t\t * @static\n\t\t *\n\t\t * @param mixed $value Value to cast.\n\t\t * @return bool\n\t\t */\n\t\tprotected static function emulate_filter_bool( $value ) {\n\t\t\t// @codingStandardsIgnoreStart\n\t\t\tstatic $true  = array(\n\t\t\t\t'1',\n\t\t\t\t'true', 'True', 'TRUE',\n\t\t\t\t'y', 'Y',\n\t\t\t\t'yes', 'Yes', 'YES',\n\t\t\t\t'on', 'On', 'ON',\n\t\t\t);\n\t\t\tstatic $false = array(\n\t\t\t\t'0',\n\t\t\t\t'false', 'False', 'FALSE',\n\t\t\t\t'n', 'N',\n\t\t\t\t'no', 'No', 'NO',\n\t\t\t\t'off', 'Off', 'OFF',\n\t\t\t);\n\t\t\t// @codingStandardsIgnoreEnd\n\n\t\t\tif ( is_bool( $value ) ) {\n\t\t\t\treturn $value;\n\t\t\t} else if ( is_int( $value ) && ( 0 === $value || 1 === $value ) ) {\n\t\t\t\treturn (bool) $value;\n\t\t\t} else if ( ( is_float( $value ) && ! is_nan( $value ) ) && ( (float) 0 === $value || (float) 1 === $value ) ) {\n\t\t\t\treturn (bool) $value;\n\t\t\t} else if ( is_string( $value ) ) {\n\t\t\t\t$value = trim( $value );\n\t\t\t\tif ( in_array( $value, $true, true ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t} else if ( in_array( $value, $false, true ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t} // End of class TGMPA_Utils\n} // End of class_exists wrapper\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/README.md",
    "content": "# Customizer Library\n\nA helpful library for working with the WordPress customizer.\n\n## About\n\nThe customizer allows WordPress developers to add options for themes and plugins, but it should be easier to work with.  This library abstracts out some of the complexity.\n\nInstead of adding options to the $wp_customize object directly, developers can just define an array of controls and sections and pass it to the Customizer_Library class.\n\nTo see how this works in practice, please see the [Customizer Library Demo](https://github.com/devinsays/customizer-library-demo) theme.\n\nThe Customizer Library adds sections, settings and controls to the customizer based on the array that gets passed to it.  There is default sanitization for all options (though you're still welcome to pass a sanitize_callback).  All options are also saved by default as theme_mods (though look for a future update to make this more flexible).\n\nAt the moment there is only one custom control (for textarea), but look for additional controls as the library matures.\n\nThe Customizer Library includes additional classes and helper functions for creating inline styles and loading Google fonts.  These functions and classes were developed by [The Theme Foundry](https://thethemefoundry.com/) for their theme [Make](https://thethemefoundry.com/wordpress-themes/make/) and I've found them quite useful in my own projects.  However, I'm considering moving them into seperate modules in order to make the core library as focused as possible.  Feedback on this is welcome.\n\n## Installation\n\nThe [Customizer Library](https://github.com/devinsays/customizer-library) can be included in your own projects git submodule if you'd like to be able to pull down changes.  To include it in your own projects the same way, navigate to the directory and use:\n\n`git submodule add git@github.com:devinsays/customizer-library customizer-library`\n\n## Options\n\nThe Customizer Library currently supports these options:\n\n* Checkbox\n* Select\n* Radio\n* Upload\n* Image\n* Color\n* Text\n* URL\n* Range\n* Textarea\n* Select (Typography)\n\n### Sections\n\nSections are convenient ways to group controls in the customizer.\n\nCustomizer Sections can be defined like this:\n\n~~~php\n// Example Section\n\n$sections[] = array(\n\t'id' => 'example', // Required\n\t'title' => __( 'Example Section', 'zues' ), // Required\n\t'priority' => '30', // Optional\n\t'description' => 'Example description', // Optional\n\t'panel' => 'panel_id' // optional, and it requires WP >= 4.0\n);\n~~~\n\n### Panels\n\nPanels are a convenient way to group your different sections.\n\nHere's an example that adds a panel, a section to the panel, and then a text option to that section:\n\n~~~php\n// Panel Example\n$panel = 'panel';\n\n$panels[] = array(\n\t'id' => $panel,\n\t'title' => __( 'Panel Examples', 'zues' ),\n\t'priority' => '100'\n);\n\n$section = 'panel-section';\n\n$sections[] = array(\n\t'id' => $section,\n\t'title' => __( 'Panel Section', 'zues' ),\n\t'priority' => '10',\n\t'panel' => $panel\n);\n\n$options['example-panel-text'] = array(\n\t'id' => 'example-panel-text',\n\t'label'   => __( 'Example Text Input', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'text',\n);\n~~~\n\nThe Customizer_Library uses the core function `$wp_customize->add_panel( $id, $args );` to add panels, and all the same $args are available. See [codex](https://developer.wordpress.org/reference/classes/wp_customize_manager/add_panel/).\n\n### Text\n\n~~~php\n$options['example-text'] = array(\n\t'id' => 'example-text',\n\t'label'   => __( 'Example Text Input', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'text',\n);\n~~~\n\n### URL\n\n~~~php\n$options['example-url'] = array(\n\t'id' => 'example-url',\n\t'label'   => __( 'Example URL Input', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'url',\n);\n~~~\n\n### Checkbox\n\n~~~php\n$options['example-checkbox'] = array(\n\t'id' => 'example-checkbox',\n\t'label'   => __( 'Example Checkbox', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'checkbox',\n\t'default' => 0,\n);\n~~~\n\n### Select\n\n~~~php\n$choices = array(\n\t'choice-1' => 'Choice One',\n\t'choice-2' => 'Choice Two',\n\t'choice-3' => 'Choice Three'\n);\n\n$options['example-select'] = array(\n\t'id' => 'example-select',\n\t'label'   => __( 'Example Select', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'select',\n\t'choices' => $choices,\n\t'default' => 'choice-1'\n);\n~~~\n\n### Drop Down Pages\n\n$options['example-dropdown-pages'] = array(\n\t'id' => 'example-dropdown-pages',\n\t'label'   => __( 'Example Drop Down Pages', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'dropdown-pages',\n\t'default' => ''\n);\n~~~\n\n### Radio\n\n~~~php\n$choices = array(\n\t'choice-1' => 'Choice One',\n\t'choice-2' => 'Choice Two',\n\t'choice-3' => 'Choice Three'\n);\n\n$options['example-radio'] = array(\n\t'id' => 'example-radio',\n\t'label'   => __( 'Example Radio', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'radio',\n\t'choices' => $choices,\n\t'default' => 'choice-1'\n);\n~~~\n\n### Upload\n\n~~~php\n$options['example-upload'] = array(\n\t'id' => 'example-upload',\n\t'label'   => __( 'Example Upload', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'upload',\n\t'default' => '',\n);\n~~~\n\n### Color\n\n~~~php\n$options['example-color'] = array(\n\t'id' => 'example-color',\n\t'label'   => __( 'Example Color', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'color',\n\t'default' => $color // hex\n);\n~~~\n\n\n### Textarea\n\n~~~php\n$options['example-textarea'] = array(\n\t'id' => 'example-textarea',\n\t'label'   => __( 'Example Textarea', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'textarea',\n\t'default' => __( 'Example textarea text.', 'zues'),\n);\n~~~\n\n### Select (Typography)\n\n~~~php\n$options['example-font'] = array(\n\t'id' => 'example-font',\n\t'label'   => __( 'Example Font', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'select',\n\t'choices' => customizer_library_get_font_choices(),\n\t'default' => 'Monoton'\n);\n~~~\n\n### Range\n\n~~~php\n$options['example-range'] = array(\n\t'id' => 'example-range',\n\t'label'   => __( 'Example Range Input', 'zues' ),\n\t'section' => $section,\n\t'type'    => 'range',\n\t'input_attrs' => array(\n        'min'   => 0,\n        'max'   => 10,\n        'step'  => 1,\n        'style' => 'color: #0a0',\n\t)\n);\n~~~\n\n### Content\n\n~~~php\n$options['example-content'] = array(\n\t'id' => 'example-content',\n\t'label' => __( 'Example Content', 'zues' ),\n\t'section' => $section,\n\t'type' => 'content',\n\t'content' => '<p>' . __( 'Content to output. Use <a href=\"#\">HTML</a> if you like.', 'zues' ) . '</p>',\n\t'description' => __( 'Optional: Example Description.', 'zues' )\n);\n~~~\n\n### Pass $options to Customizer Library\n\nAfter all the options and sections are defined, load them with the Customizer Library:\n\n~~~php\n// Adds the sections to the $options array\n$options['sections'] = $sections;\n\n$customizer_library = Customizer_Library::Instance();\n$customizer_library->add_options( $options );\n~~~\n\n### Demo\n\nA full working example can be found here:\nhttps://github.com/devinsays/customizer-library-demo/blob/master/inc/customizer-options.php\n\n## Styles\n\nThe Customizer Library has a helper class to output inline styles.  This code was originally developed by [The Theme Foundry](https://thethemefoundry.com/) for use in [Make](https://thethemefoundry.com/wordpress-themes/make/).  To see how it works, see \"inc/styles.php\".\n\nCSS selector(s) and value are passed to Customizer_Library_Styles class like this:\n\n~~~php\nCustomizer_Library_Styles()->add( array(\n\t'selectors' => array(\n\t\t'.primary'\n\t),\n\t'declarations' => array(\n\t\t'color' => $color\n\t)\n) );\n~~~\n\n#### Media Queries\n\nMedia queries can also be be used with Customizer_Library_Styles.  Here's an example for outputting logo-image-2x on high resolution devices.\n\n~~~php\n$setting = 'logo-image-2x';\n$mod = get_theme_mod( $setting, false );\n\nif ( $mod ) {\n\n\tCustomizer_Library_Styles()->add( array(\n\t\t'selectors' => array(\n\t\t\t'.logo'\n\t\t),\n\t\t'declarations' => array(\n\t\t\t'background-image' => 'url(' . $mod . ')'\n\t\t),\n\t\t'media' => '(-webkit-min-device-pixel-ratio: 1.3),(-o-min-device-pixel-ratio: 2.6/2),(min--moz-device-pixel-ratio: 1.3),(min-device-pixel-ratio: 1.3),(min-resolution: 1.3dppx)'\n\t) );\n\n}\n~~~\n\n\n\n## Fonts\n\nThe Customizer Library has a helper functions to output font stacks and load inline fonts.  This code was also developed by [The Theme Foundry](https://thethemefoundry.com/) for use in [Make](https://thethemefoundry.com/wordpress-themes/make/).  You can see an example of font enqueing in \"inc/mods.php\":\n\n~~~php\nfunction demo_fonts() {\n\n\t// Font options\n\t$fonts = array(\n\t\tget_theme_mod( 'primary-font', customizer_library_get_default( 'primary-font' ) ),\n\t\tget_theme_mod( 'secondary-font', customizer_library_get_default( 'secondary-font' ) )\n\t);\n\n\t$font_uri = customizer_library_get_google_font_uri( $fonts );\n\n\t// Load Google Fonts\n\twp_enqueue_style( 'demo_fonts', $font_uri, array(), null, 'screen' );\n\n}\nadd_action( 'wp_enqueue_scripts', 'demo_fonts' );\n~~~\n\nFonts can be used in inline styles like this:\n\n~~~php\n// Primary Font\n$setting = 'primary-font';\n$mod = get_theme_mod( $setting, customizer_library_get_default( $setting ) );\n$stack = customizer_library_get_font_stack( $mod );\n\nif ( $mod != customizer_library_get_default( $setting ) ) {\n\n\tCustomizer_Library_Styles()->add( array(\n\t\t'selectors' => array(\n\t\t\t'.primary'\n\t\t),\n\t\t'declarations' => array(\n\t\t\t'font-family' => $stack\n\t\t)\n\t) );\n\n}\n~~~\n\n## Change Log\n\nDevelopment\n===\n\n* Enhancement: Content option (for help text, HTML output, etc.)\n\n1.3.0\n===\n\n* Enhancement: Add text input option\n* Enhancement: Sort system fonts and webfonts within dropdown\n* Enhancement: Add Panels Support, from WP 4.0\n* Enhancement: Add support for \"url\" type\n* Enhancement: Add support for \"range\" type\n* Enhancement: Add support for \"dropdown-pages\" type\n* Update: Change how setting parameters are added\n\n1.2.0\n===\n\n* Enhancement: Allow setting parameters\n* Update: Refactor interface loop\n\n1.1.0\n===\n\n* Bugfix: customizer.js enqueue relative to library\n* Enhancement: Use new textarea control from core\n\n1.0.0\n===\n\n* Public Release"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/custom-controls/content.php",
    "content": "<?php\n/**\n * Add controls for arbitrary heading, description, line\n *\n * @package Customizer_Library\n * @author  Devin Price\n */\n\nif ( ! class_exists( 'WP_Customize_Control' ) ) {\n\treturn null;\n}\n\n/**\n * Add controls for arbitrary heading, description, line\n */\nclass Customizer_Library_Content extends WP_Customize_Control {\n\n\t/**\n\t * Whitelist content parameter\n\t * @var string\n\t */\n\tpublic $content = '';\n\n\t/**\n\t * Render the control's content.\n\t *\n\t * Allows the content to be overriden without having to rewrite the wrapper.\n\t *\n\t * @since  1.0.0\n\t * @return void\n\t */\n\tpublic function render_content() {\n\n\t\tswitch ( $this->type ) {\n\n\t\t\tcase 'content' :\n\n\t\t\t\tif ( isset( $this->label ) ) {\n\t\t\t\t\techo '<span class=\"customize-control-title\">'. esc_html( $this->label ) .'</span>';\n\t\t\t\t}\n\n\t\t\t\tif ( isset( $this->content ) ) {\n\t\t\t\t\techo $this->content;\n\t\t\t\t}\n\n\t\t\t\tif ( isset( $this->description ) ) {\n\t\t\t\t\techo '<span class=\"description customize-control-description\">' . esc_html( $this->description ) . '</span>';\n\t\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/custom-controls/textarea.php",
    "content": "<?php\n/**\n * Customize for textarea, extend the WP customizer\n *\n * @package Customizer_Library\n * @author  Devin Price, The Theme Foundry\n */\n\nif ( ! class_exists( 'WP_Customize_Control' ) ) {\n\treturn null;\n}\n\n/**\n * Customize for textarea, extend the WP customizer\n */\nclass Customizer_Library_Textarea extends WP_Customize_Control {\n\n\t/**\n\t * Render the control's content.\n\t *\n\t * Allows the content to be overriden without having to rewrite the wrapper.\n\t *\n\t * @since  1.0.0\n\t * @return void\n\t */\n\tpublic function render_content() {\n\n\t\t?>\n     <label>\n      <span class=\"customize-control-title\"><?php echo esc_html( $this->label ); ?></span>\n      <textarea class=\"large-text\" cols=\"20\" rows=\"5\" <?php $this->link(); ?>>\n\t\t\t\t<?php echo esc_textarea( $this->value() ); ?>\n      </textarea>\n     </label>\n        <?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/customizer-library.php",
    "content": "<?php\n/**\n * Customizer Library\n *\n * @package Customizer_Library\n * @author  Devin Price, The Theme Foundry\n * @license GPL-2.0+\n * @version 1.3.0\n */\n\n// If this file is called directly, abort.\nif ( ! defined( 'WPINC' ) ) {\n\tdie;\n}\n\n// Continue if the Customizer_Library isn't already in use.\nif ( ! class_exists( 'Customizer_Library' ) ) :\n\n\t// Helper functions to output the customizer controls.\n\tinclude plugin_dir_path( __FILE__ ) . 'extensions/interface.php';\n\n\t// Helper functions for customizer sanitization.\n\tinclude plugin_dir_path( __FILE__ ) . 'extensions/sanitization.php';\n\n\t// Helper functions to build the inline CSS.\n\tinclude plugin_dir_path( __FILE__ ) . 'extensions/style-builder.php';\n\n\t// Helper functions for fonts.\n\tinclude plugin_dir_path( __FILE__ ) . 'extensions/fonts.php';\n\n\t// Utility functions for the customizer.\n\tinclude plugin_dir_path( __FILE__ ) . 'extensions/utilities.php';\n\n\t// Customizer preview functions.\n\tinclude plugin_dir_path( __FILE__ ) . 'extensions/preview.php';\n\n\t// Textarea control.\n\tif ( version_compare( $GLOBALS['wp_version'], '4.0', '<' ) ) {\n\t\tinclude plugin_dir_path( __FILE__ ) . 'custom-controls/textarea.php';\n\t}\n\n\t// Arbitrary content controls.\n\tinclude plugin_dir_path( __FILE__ ) . 'custom-controls/content.php';\n\n\t/**\n\t * Class wrapper with useful methods for interacting with the theme customizer.\n\t */\n\tclass Customizer_Library\n\t{\n\n\t\t/**\n\t\t * The one instance of Customizer_Library.\n\t\t *\n\t\t * @since 1.0.0.\n\t\t *\n\t\t * @var Customizer_Library_Styles    The one instance for the singleton.\n\t\t */\n\t\tprivate static $instance;\n\n\t\t/**\n\t\t * The array for storing $options.\n\t\t *\n\t\t * @since 1.0.0.\n\t\t *\n\t\t * @var array    Holds the options array.\n\t\t */\n\n\t\tpublic $options = array();\n\n\t\t/**\n\t\t * Instantiate or return the one Customizer_Library instance.\n\t\t *\n\t\t * @since 1.0.0.\n\t\t *\n\t\t * @return Customizer_Library\n\t\t */\n\t\tpublic static function instance() {\n\n\t\t\tif ( is_null( self::$instance ) ) {\n\t\t\t\tself::$instance = new self();\n\t\t\t}\n\n\t\t\treturn self::$instance;\n\t\t}\n\n\t\t/**\n\t\t * Add options to the array\n\t\t * @param array $options the options array.\n\t\t */\n\t\tpublic function add_options( $options = array() ) {\n\n\t\t\t$this->options = array_merge( $options, $this->options );\n\t\t}\n\n\t\t/**\n\t\t * Return the options array\n\t\t * @return array $options the options array.\n\t\t */\n\t\tpublic function get_options() {\n\n\t\t\treturn $this->options;\n\t\t}\n\t}\n\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/extensions/fonts.php",
    "content": "<?php\n/**\n * Theme Customizer Fonts\n *\n * @package \tCustomizer_Library\n * @author\t\tThe Theme Foundry\n */\n\nif ( ! function_exists( 'customizer_library_get_font_choices' ) ) :\n\t/**\n\t * Packages the font choices into value/label pairs for use with the customizer.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @return array    The fonts in value/label pairs.\n\t */\n\tfunction customizer_library_get_all_fonts() {\n\t\t$heading1       = array( 1 => array( 'label' => sprintf( '--- %s ---', __( 'Standard Fonts', 'zues' ) ) ) );\n\t\t$standard_fonts = customizer_library_get_standard_fonts();\n\t\t$heading2       = array( 2 => array( 'label' => sprintf( '--- %s ---', __( 'Google Fonts', 'zues' ) ) ) );\n\t\t$google_fonts   = customizer_library_get_google_fonts();\n\n\t\t/**\n\t * Allow for developers to modify the full list of fonts.\n\t *\n\t * @since 1.3.0.\n\t *\n\t * @param array    $fonts    The list of all fonts.\n\t */\n\t\treturn apply_filters( 'customizer_library_all_fonts', array_merge( $heading1, $standard_fonts, $heading2, $google_fonts ) );\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_get_font_choices' ) ) :\n\t/**\n\t * Packages the font choices into value/label pairs for use with the customizer.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @return array    The fonts in value/label pairs.\n\t */\n\tfunction customizer_library_get_font_choices() {\n\t\t$fonts   = customizer_library_get_all_fonts();\n\t\t$choices = array();\n\n\t\t// Repackage the fonts into value/label pairs.\n\t\tforeach ( $fonts as $key => $font ) {\n\t\t\t$choices[ $key ] = $font['label'];\n\t\t}\n\n\t\treturn $choices;\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_get_google_font_uri' ) ) :\n\t/**\n\t * Build the HTTP request URL for Google Fonts.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @param  array $fonts The fonts array.\n\t * @return string    The URL for including Google Fonts.\n\t */\n\tfunction customizer_library_get_google_font_uri( $fonts ) {\n\n\t\t// De-dupe the fonts.\n\t\t$fonts         = array_unique( $fonts );\n\t\t$allowed_fonts = customizer_library_get_google_fonts();\n\t\t$family        = array();\n\n\t\t// Validate each font and convert to URL format.\n\t\tforeach ( $fonts as $font ) {\n\t\t\t$font = trim( $font );\n\n\t\t\t// Verify that the font exists.\n\t\t\tif ( array_key_exists( $font, $allowed_fonts ) ) {\n\t\t\t\t// Build the family name and variant string (e.g., \"Open+Sans:regular,italic,700\").\n\t\t\t\t$family[] = urlencode( $font . ':' . join( ',', customizer_library_choose_google_font_variants( $font, $allowed_fonts[ $font ]['variants'] ) ) );\n\t\t\t}\n\t\t}\n\n\t\t// Convert from array to string.\n\t\tif ( empty( $family ) ) {\n\t\t\treturn '';\n\t\t} else {\n\t\t\t$request = '//fonts.googleapis.com/css?family=' . implode( '|', $family );\n\t\t}\n\n\t\t// Load the font subset.\n\t\t$subset = get_theme_mod( 'font-subset', customizer_library_get_default( 'font-subset' ) );\n\n\t\tif ( 'all' === $subset ) {\n\t\t\t$subsets_available = customizer_library_get_google_font_subsets();\n\n\t\t\t// Remove the all se.\n\t\t\tunset( $subsets_available['all'] );\n\n\t\t\t// Build the array.\n\t\t\t$subsets = array_keys( $subsets_available );\n\t\t} else {\n\t\t\t$subsets = array(\n\t\t\t'latin',\n\t\t\t$subset,\n\t\t\t);\n\t\t}\n\n\t\t// Append the subset string.\n\t\tif ( ! empty( $subsets ) ) {\n\t\t\t$request .= urlencode( '&subset=' . join( ',', $subsets ) );\n\t\t}\n\n\t\treturn esc_url( $request );\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_get_google_font_subsets' ) ) :\n\t/**\n\t * Retrieve the list of available Google font subsets.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @return array    The available subsets.\n\t */\n\tfunction customizer_library_get_google_font_subsets() {\n\t\treturn array(\n\t\t'all'          => __( 'All', 'zues' ),\n\t\t'cyrillic'     => __( 'Cyrillic', 'zues' ),\n\t\t'cyrillic-ext' => __( 'Cyrillic Extended', 'zues' ),\n\t\t'devanagari'   => __( 'Devanagari', 'zues' ),\n\t\t'greek'        => __( 'Greek', 'zues' ),\n\t\t'greek-ext'    => __( 'Greek Extended', 'zues' ),\n\t\t'khmer'        => __( 'Khmer', 'zues' ),\n\t\t'latin'        => __( 'Latin', 'zues' ),\n\t\t'latin-ext'    => __( 'Latin Extended', 'zues' ),\n\t\t'vietnamese'   => __( 'Vietnamese', 'zues' ),\n\t\t);\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_choose_google_font_variants' ) ) :\n\t/**\n\t * Given a font, chose the variants to load for the theme.\n\t *\n\t * Attempts to load regular, italic, and 700. If regular is not found, the first variant in the family is chosen. italic\n\t * and 700 are only loaded if found. No fallbacks are loaded for those fonts.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @param  string $font        The font to load variants for.\n\t * @param  array  $variants    The variants for the font.\n\t * @return array                  The chosen variants.\n\t */\n\tfunction customizer_library_choose_google_font_variants( $font, $variants = array() ) {\n\t\t$chosen_variants = array();\n\t\tif ( empty( $variants ) ) {\n\t\t\t$fonts = customizer_library_get_google_fonts();\n\n\t\t\tif ( array_key_exists( $font, $fonts ) ) {\n\t\t\t\t$variants = $fonts[ $font ]['variants'];\n\t\t\t}\n\t\t}\n\n\t\t// If a \"regular\" variant is not found, get the first variant.\n\t\tif ( ! in_array( 'regular', $variants ) ) {\n\t\t\t$chosen_variants[] = $variants[0];\n\t\t} else {\n\t\t\t$chosen_variants[] = 'regular';\n\t\t}\n\n\t\t// Only add \"italic\" if it exists.\n\t\tif ( in_array( 'italic', $variants ) ) {\n\t\t\t$chosen_variants[] = 'italic';\n\t\t}\n\n\t\t// Only add \"700\" if it exists.\n\t\tif ( in_array( '700', $variants ) ) {\n\t\t\t$chosen_variants[] = '700';\n\t\t}\n\n\t\treturn apply_filters( 'customizer_library_font_variants', array_unique( $chosen_variants ), $font, $variants );\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_get_standard_fonts' ) ) :\n\t/**\n\t * Return an array of standard websafe fonts.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @return array    Standard websafe fonts.\n\t */\n\tfunction customizer_library_get_standard_fonts() {\n\t\treturn array(\n\t\t'serif' => array(\n\t\t\t'label' => _x( 'Serif', 'font style', 'zues' ),\n\t\t\t'stack' => 'Georgia,Times,\"Times New Roman\",serif',\n\t\t),\n\t\t'sans-serif' => array(\n\t\t\t'label' => _x( 'Sans Serif', 'font style', 'zues' ),\n\t\t\t'stack' => '\"Helvetica Neue\",Helvetica,Arial,sans-serif',\n\t\t),\n\t\t'monospace' => array(\n\t\t\t'label' => _x( 'Monospaced', 'font style', 'zues' ),\n\t\t\t'stack' => 'Monaco,\"Lucida Sans Typewriter\",\"Lucida Typewriter\",\"Courier New\",Courier,monospace',\n\t\t),\n\t\t);\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_get_font_stack' ) ) :\n\t/**\n\t * Validate the font choice and get a font stack for it.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @param  string $font    The 1st font in the stack.\n\t * @return string             The full font stack.\n\t */\n\tfunction customizer_library_get_font_stack( $font ) {\n\n\t\t$all_fonts = customizer_library_get_all_fonts();\n\n\t\t// Sanitize font choice.\n\t\t$font = customizer_library_sanitize_font_choice( $font );\n\n\t\t$sans = '\"Helvetica Neue\",sans-serif';\n\t\t$serif = 'Georgia, serif';\n\n\t\t// Use stack if one is identified.\n\t\tif ( isset( $all_fonts[ $font ]['stack'] ) && ! empty( $all_fonts[ $font ]['stack'] ) ) {\n\t\t\t$stack = $all_fonts[ $font ]['stack'];\n\t\t} else {\n\t\t\t$stack = '\"' . $font . '\",' . $sans;\n\t\t}\n\n\t\treturn $stack;\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_sanitize_font_choice' ) ) :\n\t/**\n\t * Sanitize a font choice.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @param  string $value    The font choice.\n\t * @return string              The sanitized font choice.\n\t */\n\tfunction customizer_library_sanitize_font_choice( $value ) {\n\t\tif ( is_int( $value ) ) {\n\t\t\t// The array key is an integer, so the chosen option is a heading, not a real choice.\n\t\t\treturn '';\n\t\t} else if ( array_key_exists( $value, customizer_library_get_font_choices() ) ) {\n\t\t\treturn $value;\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_get_google_fonts' ) ) :\n\t/**\n\t * Return an array of all available Google Fonts.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @return array    All Google Fonts.\n\t */\n\tfunction customizer_library_get_google_fonts() {\n\t\treturn apply_filters( 'customizer_library_get_google_fonts', array(\n\t\t\t'ABeeZee' => array(\n\t\t\t'label'    => 'ABeeZee',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Abel' => array(\n\t\t\t'label'    => 'Abel',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Abril Fatface' => array(\n\t\t\t'label'    => 'Abril Fatface',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Aclonica' => array(\n\t\t\t'label'    => 'Aclonica',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Acme' => array(\n\t\t\t'label'    => 'Acme',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Actor' => array(\n\t\t\t'label'    => 'Actor',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Adamina' => array(\n\t\t\t'label'    => 'Adamina',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Advent Pro' => array(\n\t\t\t'label'    => 'Advent Pro',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'200',\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'500',\n\t\t\t\t'600',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Aguafina Script' => array(\n\t\t\t'label'    => 'Aguafina Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Akronim' => array(\n\t\t\t'label'    => 'Akronim',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Aladin' => array(\n\t\t\t'label'    => 'Aladin',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Aldrich' => array(\n\t\t\t'label'    => 'Aldrich',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alef' => array(\n\t\t\t'label'    => 'Alef',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alegreya' => array(\n\t\t\t'label'    => 'Alegreya',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alegreya SC' => array(\n\t\t\t'label'    => 'Alegreya SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alegreya Sans' => array(\n\t\t\t'label'    => 'Alegreya Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'100italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'800',\n\t\t\t\t'800italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alegreya Sans SC' => array(\n\t\t\t'label'    => 'Alegreya Sans SC',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'100italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'800',\n\t\t\t\t'800italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alex Brush' => array(\n\t\t\t'label'    => 'Alex Brush',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alfa Slab One' => array(\n\t\t\t'label'    => 'Alfa Slab One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alice' => array(\n\t\t\t'label'    => 'Alice',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alike' => array(\n\t\t\t'label'    => 'Alike',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Alike Angular' => array(\n\t\t\t'label'    => 'Alike Angular',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Allan' => array(\n\t\t\t'label'    => 'Allan',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Allerta' => array(\n\t\t\t'label'    => 'Allerta',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Allerta Stencil' => array(\n\t\t\t'label'    => 'Allerta Stencil',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Allura' => array(\n\t\t\t'label'    => 'Allura',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Almendra' => array(\n\t\t\t'label'    => 'Almendra',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Almendra Display' => array(\n\t\t\t'label'    => 'Almendra Display',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Almendra SC' => array(\n\t\t\t'label'    => 'Almendra SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Amarante' => array(\n\t\t\t'label'    => 'Amarante',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Amaranth' => array(\n\t\t\t'label'    => 'Amaranth',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Amatic SC' => array(\n\t\t\t'label'    => 'Amatic SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Amethysta' => array(\n\t\t\t'label'    => 'Amethysta',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Anaheim' => array(\n\t\t\t'label'    => 'Anaheim',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Andada' => array(\n\t\t\t'label'    => 'Andada',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Andika' => array(\n\t\t\t'label'    => 'Andika',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Angkor' => array(\n\t\t\t'label'    => 'Angkor',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Annie Use Your Telescope' => array(\n\t\t\t'label'    => 'Annie Use Your Telescope',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Anonymous Pro' => array(\n\t\t\t'label'    => 'Anonymous Pro',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Antic' => array(\n\t\t\t'label'    => 'Antic',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Antic Didone' => array(\n\t\t\t'label'    => 'Antic Didone',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Antic Slab' => array(\n\t\t\t'label'    => 'Antic Slab',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Anton' => array(\n\t\t\t'label'    => 'Anton',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Arapey' => array(\n\t\t\t'label'    => 'Arapey',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Arbutus' => array(\n\t\t\t'label'    => 'Arbutus',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Arbutus Slab' => array(\n\t\t\t'label'    => 'Arbutus Slab',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Architects Daughter' => array(\n\t\t\t'label'    => 'Architects Daughter',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Archivo Black' => array(\n\t\t\t'label'    => 'Archivo Black',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Archivo Narrow' => array(\n\t\t\t'label'    => 'Archivo Narrow',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Arimo' => array(\n\t\t\t'label'    => 'Arimo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Arizonia' => array(\n\t\t\t'label'    => 'Arizonia',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Armata' => array(\n\t\t\t'label'    => 'Armata',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Artifika' => array(\n\t\t\t'label'    => 'Artifika',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Arvo' => array(\n\t\t\t'label'    => 'Arvo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Asap' => array(\n\t\t\t'label'    => 'Asap',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Asset' => array(\n\t\t\t'label'    => 'Asset',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Astloch' => array(\n\t\t\t'label'    => 'Astloch',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Asul' => array(\n\t\t\t'label'    => 'Asul',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Atomic Age' => array(\n\t\t\t'label'    => 'Atomic Age',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Aubrey' => array(\n\t\t\t'label'    => 'Aubrey',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Audiowide' => array(\n\t\t\t'label'    => 'Audiowide',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Autour One' => array(\n\t\t\t'label'    => 'Autour One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Average' => array(\n\t\t\t'label'    => 'Average',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Average Sans' => array(\n\t\t\t'label'    => 'Average Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Averia Gruesa Libre' => array(\n\t\t\t'label'    => 'Averia Gruesa Libre',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Averia Libre' => array(\n\t\t\t'label'    => 'Averia Libre',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Averia Sans Libre' => array(\n\t\t\t'label'    => 'Averia Sans Libre',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Averia Serif Libre' => array(\n\t\t\t'label'    => 'Averia Serif Libre',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bad Script' => array(\n\t\t\t'label'    => 'Bad Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t),\n\t\t\t),\n\t\t\t'Balthazar' => array(\n\t\t\t'label'    => 'Balthazar',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bangers' => array(\n\t\t\t'label'    => 'Bangers',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Basic' => array(\n\t\t\t'label'    => 'Basic',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Battambang' => array(\n\t\t\t'label'    => 'Battambang',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Baumans' => array(\n\t\t\t'label'    => 'Baumans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bayon' => array(\n\t\t\t'label'    => 'Bayon',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Belgrano' => array(\n\t\t\t'label'    => 'Belgrano',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Belleza' => array(\n\t\t\t'label'    => 'Belleza',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'BenchNine' => array(\n\t\t\t'label'    => 'BenchNine',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bentham' => array(\n\t\t\t'label'    => 'Bentham',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Berkshire Swash' => array(\n\t\t\t'label'    => 'Berkshire Swash',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bevan' => array(\n\t\t\t'label'    => 'Bevan',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bigelow Rules' => array(\n\t\t\t'label'    => 'Bigelow Rules',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bigshot One' => array(\n\t\t\t'label'    => 'Bigshot One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bilbo' => array(\n\t\t\t'label'    => 'Bilbo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bilbo Swash Caps' => array(\n\t\t\t'label'    => 'Bilbo Swash Caps',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bitter' => array(\n\t\t\t'label'    => 'Bitter',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Black Ops One' => array(\n\t\t\t'label'    => 'Black Ops One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bokor' => array(\n\t\t\t'label'    => 'Bokor',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bonbon' => array(\n\t\t\t'label'    => 'Bonbon',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Boogaloo' => array(\n\t\t\t'label'    => 'Boogaloo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bowlby One' => array(\n\t\t\t'label'    => 'Bowlby One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bowlby One SC' => array(\n\t\t\t'label'    => 'Bowlby One SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Brawler' => array(\n\t\t\t'label'    => 'Brawler',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bree Serif' => array(\n\t\t\t'label'    => 'Bree Serif',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bubblegum Sans' => array(\n\t\t\t'label'    => 'Bubblegum Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Bubbler One' => array(\n\t\t\t'label'    => 'Bubbler One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Buda' => array(\n\t\t\t'label'    => 'Buda',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Buenard' => array(\n\t\t\t'label'    => 'Buenard',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Butcherman' => array(\n\t\t\t'label'    => 'Butcherman',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Butterfly Kids' => array(\n\t\t\t'label'    => 'Butterfly Kids',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cabin' => array(\n\t\t\t'label'    => 'Cabin',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cabin Condensed' => array(\n\t\t\t'label'    => 'Cabin Condensed',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'500',\n\t\t\t\t'600',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cabin Sketch' => array(\n\t\t\t'label'    => 'Cabin Sketch',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Caesar Dressing' => array(\n\t\t\t'label'    => 'Caesar Dressing',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cagliostro' => array(\n\t\t\t'label'    => 'Cagliostro',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Calligraffitti' => array(\n\t\t\t'label'    => 'Calligraffitti',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cambo' => array(\n\t\t\t'label'    => 'Cambo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Candal' => array(\n\t\t\t'label'    => 'Candal',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cantarell' => array(\n\t\t\t'label'    => 'Cantarell',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cantata One' => array(\n\t\t\t'label'    => 'Cantata One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cantora One' => array(\n\t\t\t'label'    => 'Cantora One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Capriola' => array(\n\t\t\t'label'    => 'Capriola',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cardo' => array(\n\t\t\t'label'    => 'Cardo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Carme' => array(\n\t\t\t'label'    => 'Carme',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Carrois Gothic' => array(\n\t\t\t'label'    => 'Carrois Gothic',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Carrois Gothic SC' => array(\n\t\t\t'label'    => 'Carrois Gothic SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Carter One' => array(\n\t\t\t'label'    => 'Carter One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Caudex' => array(\n\t\t\t'label'    => 'Caudex',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cedarville Cursive' => array(\n\t\t\t'label'    => 'Cedarville Cursive',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ceviche One' => array(\n\t\t\t'label'    => 'Ceviche One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Changa One' => array(\n\t\t\t'label'    => 'Changa One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Chango' => array(\n\t\t\t'label'    => 'Chango',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Chau Philomene One' => array(\n\t\t\t'label'    => 'Chau Philomene One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Chela One' => array(\n\t\t\t'label'    => 'Chela One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Chelsea Market' => array(\n\t\t\t'label'    => 'Chelsea Market',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Chenla' => array(\n\t\t\t'label'    => 'Chenla',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cherry Cream Soda' => array(\n\t\t\t'label'    => 'Cherry Cream Soda',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cherry Swash' => array(\n\t\t\t'label'    => 'Cherry Swash',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Chewy' => array(\n\t\t\t'label'    => 'Chewy',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Chicle' => array(\n\t\t\t'label'    => 'Chicle',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Chivo' => array(\n\t\t\t'label'    => 'Chivo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cinzel' => array(\n\t\t\t'label'    => 'Cinzel',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cinzel Decorative' => array(\n\t\t\t'label'    => 'Cinzel Decorative',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Clicker Script' => array(\n\t\t\t'label'    => 'Clicker Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Coda' => array(\n\t\t\t'label'    => 'Coda',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'800',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Coda Caption' => array(\n\t\t\t'label'    => 'Coda Caption',\n\t\t\t'variants' => array(\n\t\t\t\t'800',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Codystar' => array(\n\t\t\t'label'    => 'Codystar',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Combo' => array(\n\t\t\t'label'    => 'Combo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Comfortaa' => array(\n\t\t\t'label'    => 'Comfortaa',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Coming Soon' => array(\n\t\t\t'label'    => 'Coming Soon',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Concert One' => array(\n\t\t\t'label'    => 'Concert One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Condiment' => array(\n\t\t\t'label'    => 'Condiment',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Content' => array(\n\t\t\t'label'    => 'Content',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Contrail One' => array(\n\t\t\t'label'    => 'Contrail One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Convergence' => array(\n\t\t\t'label'    => 'Convergence',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cookie' => array(\n\t\t\t'label'    => 'Cookie',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Copse' => array(\n\t\t\t'label'    => 'Copse',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Corben' => array(\n\t\t\t'label'    => 'Corben',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Courgette' => array(\n\t\t\t'label'    => 'Courgette',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cousine' => array(\n\t\t\t'label'    => 'Cousine',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Coustard' => array(\n\t\t\t'label'    => 'Coustard',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Covered By Your Grace' => array(\n\t\t\t'label'    => 'Covered By Your Grace',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Crafty Girls' => array(\n\t\t\t'label'    => 'Crafty Girls',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Creepster' => array(\n\t\t\t'label'    => 'Creepster',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Crete Round' => array(\n\t\t\t'label'    => 'Crete Round',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Crimson Text' => array(\n\t\t\t'label'    => 'Crimson Text',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Croissant One' => array(\n\t\t\t'label'    => 'Croissant One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Crushed' => array(\n\t\t\t'label'    => 'Crushed',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cuprum' => array(\n\t\t\t'label'    => 'Cuprum',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cutive' => array(\n\t\t\t'label'    => 'Cutive',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Cutive Mono' => array(\n\t\t\t'label'    => 'Cutive Mono',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Damion' => array(\n\t\t\t'label'    => 'Damion',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Dancing Script' => array(\n\t\t\t'label'    => 'Dancing Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Dangrek' => array(\n\t\t\t'label'    => 'Dangrek',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Dawning of a New Day' => array(\n\t\t\t'label'    => 'Dawning of a New Day',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Days One' => array(\n\t\t\t'label'    => 'Days One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Delius' => array(\n\t\t\t'label'    => 'Delius',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Delius Swash Caps' => array(\n\t\t\t'label'    => 'Delius Swash Caps',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Delius Unicase' => array(\n\t\t\t'label'    => 'Delius Unicase',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Della Respira' => array(\n\t\t\t'label'    => 'Della Respira',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Denk One' => array(\n\t\t\t'label'    => 'Denk One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Devonshire' => array(\n\t\t\t'label'    => 'Devonshire',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Didact Gothic' => array(\n\t\t\t'label'    => 'Didact Gothic',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Diplomata' => array(\n\t\t\t'label'    => 'Diplomata',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Diplomata SC' => array(\n\t\t\t'label'    => 'Diplomata SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Domine' => array(\n\t\t\t'label'    => 'Domine',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Donegal One' => array(\n\t\t\t'label'    => 'Donegal One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Doppio One' => array(\n\t\t\t'label'    => 'Doppio One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Dorsa' => array(\n\t\t\t'label'    => 'Dorsa',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Dosis' => array(\n\t\t\t'label'    => 'Dosis',\n\t\t\t'variants' => array(\n\t\t\t\t'200',\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'500',\n\t\t\t\t'600',\n\t\t\t\t'700',\n\t\t\t\t'800',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Dr Sugiyama' => array(\n\t\t\t'label'    => 'Dr Sugiyama',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Droid Sans' => array(\n\t\t\t'label'    => 'Droid Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Droid Sans Mono' => array(\n\t\t\t'label'    => 'Droid Sans Mono',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Droid Serif' => array(\n\t\t\t'label'    => 'Droid Serif',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Duru Sans' => array(\n\t\t\t'label'    => 'Duru Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Dynalight' => array(\n\t\t\t'label'    => 'Dynalight',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'EB Garamond' => array(\n\t\t\t'label'    => 'EB Garamond',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Eagle Lake' => array(\n\t\t\t'label'    => 'Eagle Lake',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Eater' => array(\n\t\t\t'label'    => 'Eater',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Economica' => array(\n\t\t\t'label'    => 'Economica',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Electrolize' => array(\n\t\t\t'label'    => 'Electrolize',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Elsie' => array(\n\t\t\t'label'    => 'Elsie',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Elsie Swash Caps' => array(\n\t\t\t'label'    => 'Elsie Swash Caps',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Emblema One' => array(\n\t\t\t'label'    => 'Emblema One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Emilys Candy' => array(\n\t\t\t'label'    => 'Emilys Candy',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Engagement' => array(\n\t\t\t'label'    => 'Engagement',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Englebert' => array(\n\t\t\t'label'    => 'Englebert',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Enriqueta' => array(\n\t\t\t'label'    => 'Enriqueta',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Erica One' => array(\n\t\t\t'label'    => 'Erica One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Esteban' => array(\n\t\t\t'label'    => 'Esteban',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Euphoria Script' => array(\n\t\t\t'label'    => 'Euphoria Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ewert' => array(\n\t\t\t'label'    => 'Ewert',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Exo' => array(\n\t\t\t'label'    => 'Exo',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'100italic',\n\t\t\t\t'200',\n\t\t\t\t'200italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'800',\n\t\t\t\t'800italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Exo 2' => array(\n\t\t\t'label'    => 'Exo 2',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'100italic',\n\t\t\t\t'200',\n\t\t\t\t'200italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'800',\n\t\t\t\t'800italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Expletus Sans' => array(\n\t\t\t'label'    => 'Expletus Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fanwood Text' => array(\n\t\t\t'label'    => 'Fanwood Text',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fascinate' => array(\n\t\t\t'label'    => 'Fascinate',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fascinate Inline' => array(\n\t\t\t'label'    => 'Fascinate Inline',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Faster One' => array(\n\t\t\t'label'    => 'Faster One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fasthand' => array(\n\t\t\t'label'    => 'Fasthand',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fauna One' => array(\n\t\t\t'label'    => 'Fauna One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Federant' => array(\n\t\t\t'label'    => 'Federant',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Federo' => array(\n\t\t\t'label'    => 'Federo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Felipa' => array(\n\t\t\t'label'    => 'Felipa',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fenix' => array(\n\t\t\t'label'    => 'Fenix',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Finger Paint' => array(\n\t\t\t'label'    => 'Finger Paint',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fira Sans' => array(\n\t\t\t'label'    => 'Fira Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'400',\n\t\t\t\t'400italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fira Mono' => array(\n\t\t\t'label'    => 'Fira Mono',\n\t\t\t'variants' => array(\n\t\t\t\t'400',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fjalla One' => array(\n\t\t\t'label'    => 'Fjalla One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fjord One' => array(\n\t\t\t'label'    => 'Fjord One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Flamenco' => array(\n\t\t\t'label'    => 'Flamenco',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Flavors' => array(\n\t\t\t'label'    => 'Flavors',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fondamento' => array(\n\t\t\t'label'    => 'Fondamento',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fontdiner Swanky' => array(\n\t\t\t'label'    => 'Fontdiner Swanky',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Forum' => array(\n\t\t\t'label'    => 'Forum',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Francois One' => array(\n\t\t\t'label'    => 'Francois One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Freckle Face' => array(\n\t\t\t'label'    => 'Freckle Face',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fredericka the Great' => array(\n\t\t\t'label'    => 'Fredericka the Great',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fredoka One' => array(\n\t\t\t'label'    => 'Fredoka One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Freehand' => array(\n\t\t\t'label'    => 'Freehand',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fresca' => array(\n\t\t\t'label'    => 'Fresca',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Frijole' => array(\n\t\t\t'label'    => 'Frijole',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fruktur' => array(\n\t\t\t'label'    => 'Fruktur',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Fugaz One' => array(\n\t\t\t'label'    => 'Fugaz One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'GFS Didot' => array(\n\t\t\t'label'    => 'GFS Didot',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'greek',\n\t\t\t),\n\t\t\t),\n\t\t\t'GFS Neohellenic' => array(\n\t\t\t'label'    => 'GFS Neohellenic',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'greek',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gabriela' => array(\n\t\t\t'label'    => 'Gabriela',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gafata' => array(\n\t\t\t'label'    => 'Gafata',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Galdeano' => array(\n\t\t\t'label'    => 'Galdeano',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Galindo' => array(\n\t\t\t'label'    => 'Galindo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gentium Basic' => array(\n\t\t\t'label'    => 'Gentium Basic',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gentium Book Basic' => array(\n\t\t\t'label'    => 'Gentium Book Basic',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Geo' => array(\n\t\t\t'label'    => 'Geo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Geostar' => array(\n\t\t\t'label'    => 'Geostar',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Geostar Fill' => array(\n\t\t\t'label'    => 'Geostar Fill',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Germania One' => array(\n\t\t\t'label'    => 'Germania One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gilda Display' => array(\n\t\t\t'label'    => 'Gilda Display',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Give You Glory' => array(\n\t\t\t'label'    => 'Give You Glory',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Glass Antiqua' => array(\n\t\t\t'label'    => 'Glass Antiqua',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Glegoo' => array(\n\t\t\t'label'    => 'Glegoo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gloria Hallelujah' => array(\n\t\t\t'label'    => 'Gloria Hallelujah',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Goblin One' => array(\n\t\t\t'label'    => 'Goblin One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gochi Hand' => array(\n\t\t\t'label'    => 'Gochi Hand',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gorditas' => array(\n\t\t\t'label'    => 'Gorditas',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Goudy Bookletter 1911' => array(\n\t\t\t'label'    => 'Goudy Bookletter 1911',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Graduate' => array(\n\t\t\t'label'    => 'Graduate',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Grand Hotel' => array(\n\t\t\t'label'    => 'Grand Hotel',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gravitas One' => array(\n\t\t\t'label'    => 'Gravitas One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Great Vibes' => array(\n\t\t\t'label'    => 'Great Vibes',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Griffy' => array(\n\t\t\t'label'    => 'Griffy',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gruppo' => array(\n\t\t\t'label'    => 'Gruppo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Gudea' => array(\n\t\t\t'label'    => 'Gudea',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Habibi' => array(\n\t\t\t'label'    => 'Habibi',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Hammersmith One' => array(\n\t\t\t'label'    => 'Hammersmith One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Hanalei' => array(\n\t\t\t'label'    => 'Hanalei',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Hanalei Fill' => array(\n\t\t\t'label'    => 'Hanalei Fill',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Handlee' => array(\n\t\t\t'label'    => 'Handlee',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Hanuman' => array(\n\t\t\t'label'    => 'Hanuman',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Happy Monkey' => array(\n\t\t\t'label'    => 'Happy Monkey',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Headland One' => array(\n\t\t\t'label'    => 'Headland One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Henny Penny' => array(\n\t\t\t'label'    => 'Henny Penny',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Herr Von Muellerhoff' => array(\n\t\t\t'label'    => 'Herr Von Muellerhoff',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Holtwood One SC' => array(\n\t\t\t'label'    => 'Holtwood One SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Homemade Apple' => array(\n\t\t\t'label'    => 'Homemade Apple',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Homenaje' => array(\n\t\t\t'label'    => 'Homenaje',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell DW Pica' => array(\n\t\t\t'label'    => 'IM Fell DW Pica',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell DW Pica SC' => array(\n\t\t\t'label'    => 'IM Fell DW Pica SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell Double Pica' => array(\n\t\t\t'label'    => 'IM Fell Double Pica',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell Double Pica SC' => array(\n\t\t\t'label'    => 'IM Fell Double Pica SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell English' => array(\n\t\t\t'label'    => 'IM Fell English',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell English SC' => array(\n\t\t\t'label'    => 'IM Fell English SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell French Canon' => array(\n\t\t\t'label'    => 'IM Fell French Canon',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell French Canon SC' => array(\n\t\t\t'label'    => 'IM Fell French Canon SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell Great Primer' => array(\n\t\t\t'label'    => 'IM Fell Great Primer',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'IM Fell Great Primer SC' => array(\n\t\t\t'label'    => 'IM Fell Great Primer SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Iceberg' => array(\n\t\t\t'label'    => 'Iceberg',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Iceland' => array(\n\t\t\t'label'    => 'Iceland',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Imprima' => array(\n\t\t\t'label'    => 'Imprima',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Inconsolata' => array(\n\t\t\t'label'    => 'Inconsolata',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Inder' => array(\n\t\t\t'label'    => 'Inder',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Indie Flower' => array(\n\t\t\t'label'    => 'Indie Flower',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Inika' => array(\n\t\t\t'label'    => 'Inika',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Irish Grover' => array(\n\t\t\t'label'    => 'Irish Grover',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Istok Web' => array(\n\t\t\t'label'    => 'Istok Web',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Italiana' => array(\n\t\t\t'label'    => 'Italiana',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Italianno' => array(\n\t\t\t'label'    => 'Italianno',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Jacques Francois' => array(\n\t\t\t'label'    => 'Jacques Francois',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Jacques Francois Shadow' => array(\n\t\t\t'label'    => 'Jacques Francois Shadow',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Jim Nightshade' => array(\n\t\t\t'label'    => 'Jim Nightshade',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Jockey One' => array(\n\t\t\t'label'    => 'Jockey One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Jolly Lodger' => array(\n\t\t\t'label'    => 'Jolly Lodger',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Josefin Sans' => array(\n\t\t\t'label'    => 'Josefin Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'100italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Josefin Slab' => array(\n\t\t\t'label'    => 'Josefin Slab',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'100italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Joti One' => array(\n\t\t\t'label'    => 'Joti One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Judson' => array(\n\t\t\t'label'    => 'Judson',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Julee' => array(\n\t\t\t'label'    => 'Julee',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Julius Sans One' => array(\n\t\t\t'label'    => 'Julius Sans One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Junge' => array(\n\t\t\t'label'    => 'Junge',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Jura' => array(\n\t\t\t'label'    => 'Jura',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'500',\n\t\t\t\t'600',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Just Another Hand' => array(\n\t\t\t'label'    => 'Just Another Hand',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Just Me Again Down Here' => array(\n\t\t\t'label'    => 'Just Me Again Down Here',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kameron' => array(\n\t\t\t'label'    => 'Kameron',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kantumruy' => array(\n\t\t\t'label'    => 'Kantumruy',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Karla' => array(\n\t\t\t'label'    => 'Karla',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kaushan Script' => array(\n\t\t\t'label'    => 'Kaushan Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kavoon' => array(\n\t\t\t'label'    => 'Kavoon',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kdam Thmor' => array(\n\t\t\t'label'    => 'Kdam Thmor',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Keania One' => array(\n\t\t\t'label'    => 'Keania One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kelly Slab' => array(\n\t\t\t'label'    => 'Kelly Slab',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kenia' => array(\n\t\t\t'label'    => 'Kenia',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Khmer' => array(\n\t\t\t'label'    => 'Khmer',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kite One' => array(\n\t\t\t'label'    => 'Kite One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Knewave' => array(\n\t\t\t'label'    => 'Knewave',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kotta One' => array(\n\t\t\t'label'    => 'Kotta One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Koulen' => array(\n\t\t\t'label'    => 'Koulen',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kranky' => array(\n\t\t\t'label'    => 'Kranky',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kreon' => array(\n\t\t\t'label'    => 'Kreon',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Kristi' => array(\n\t\t\t'label'    => 'Kristi',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Krona One' => array(\n\t\t\t'label'    => 'Krona One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'La Belle Aurore' => array(\n\t\t\t'label'    => 'La Belle Aurore',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lancelot' => array(\n\t\t\t'label'    => 'Lancelot',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lato' => array(\n\t\t\t'label'    => 'Lato',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'100italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'League Script' => array(\n\t\t\t'label'    => 'League Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Leckerli One' => array(\n\t\t\t'label'    => 'Leckerli One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ledger' => array(\n\t\t\t'label'    => 'Ledger',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lekton' => array(\n\t\t\t'label'    => 'Lekton',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lemon' => array(\n\t\t\t'label'    => 'Lemon',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Libre Baskerville' => array(\n\t\t\t'label'    => 'Libre Baskerville',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Life Savers' => array(\n\t\t\t'label'    => 'Life Savers',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lilita One' => array(\n\t\t\t'label'    => 'Lilita One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lily Script One' => array(\n\t\t\t'label'    => 'Lily Script One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Limelight' => array(\n\t\t\t'label'    => 'Limelight',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Linden Hill' => array(\n\t\t\t'label'    => 'Linden Hill',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lobster' => array(\n\t\t\t'label'    => 'Lobster',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lobster Two' => array(\n\t\t\t'label'    => 'Lobster Two',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Londrina Outline' => array(\n\t\t\t'label'    => 'Londrina Outline',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Londrina Shadow' => array(\n\t\t\t'label'    => 'Londrina Shadow',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Londrina Sketch' => array(\n\t\t\t'label'    => 'Londrina Sketch',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Londrina Solid' => array(\n\t\t\t'label'    => 'Londrina Solid',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lora' => array(\n\t\t\t'label'    => 'Lora',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Love Ya Like A Sister' => array(\n\t\t\t'label'    => 'Love Ya Like A Sister',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Loved by the King' => array(\n\t\t\t'label'    => 'Loved by the King',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lovers Quarrel' => array(\n\t\t\t'label'    => 'Lovers Quarrel',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Luckiest Guy' => array(\n\t\t\t'label'    => 'Luckiest Guy',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lusitana' => array(\n\t\t\t'label'    => 'Lusitana',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Lustria' => array(\n\t\t\t'label'    => 'Lustria',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Macondo' => array(\n\t\t\t'label'    => 'Macondo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Macondo Swash Caps' => array(\n\t\t\t'label'    => 'Macondo Swash Caps',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Magra' => array(\n\t\t\t'label'    => 'Magra',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Maiden Orange' => array(\n\t\t\t'label'    => 'Maiden Orange',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mako' => array(\n\t\t\t'label'    => 'Mako',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Marcellus' => array(\n\t\t\t'label'    => 'Marcellus',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Marcellus SC' => array(\n\t\t\t'label'    => 'Marcellus SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Marck Script' => array(\n\t\t\t'label'    => 'Marck Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Margarine' => array(\n\t\t\t'label'    => 'Margarine',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Marko One' => array(\n\t\t\t'label'    => 'Marko One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Marmelad' => array(\n\t\t\t'label'    => 'Marmelad',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Marvel' => array(\n\t\t\t'label'    => 'Marvel',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mate' => array(\n\t\t\t'label'    => 'Mate',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mate SC' => array(\n\t\t\t'label'    => 'Mate SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Maven Pro' => array(\n\t\t\t'label'    => 'Maven Pro',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'500',\n\t\t\t\t'700',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'McLaren' => array(\n\t\t\t'label'    => 'McLaren',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Meddon' => array(\n\t\t\t'label'    => 'Meddon',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'MedievalSharp' => array(\n\t\t\t'label'    => 'MedievalSharp',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Medula One' => array(\n\t\t\t'label'    => 'Medula One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Megrim' => array(\n\t\t\t'label'    => 'Megrim',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Meie Script' => array(\n\t\t\t'label'    => 'Meie Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Merienda' => array(\n\t\t\t'label'    => 'Merienda',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Merienda One' => array(\n\t\t\t'label'    => 'Merienda One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Merriweather' => array(\n\t\t\t'label'    => 'Merriweather',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Merriweather Sans' => array(\n\t\t\t'label'    => 'Merriweather Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'800',\n\t\t\t\t'800italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Metal' => array(\n\t\t\t'label'    => 'Metal',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Metal Mania' => array(\n\t\t\t'label'    => 'Metal Mania',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Metamorphous' => array(\n\t\t\t'label'    => 'Metamorphous',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Metrophobic' => array(\n\t\t\t'label'    => 'Metrophobic',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Michroma' => array(\n\t\t\t'label'    => 'Michroma',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Milonga' => array(\n\t\t\t'label'    => 'Milonga',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Miltonian' => array(\n\t\t\t'label'    => 'Miltonian',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Miltonian Tattoo' => array(\n\t\t\t'label'    => 'Miltonian Tattoo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Miniver' => array(\n\t\t\t'label'    => 'Miniver',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Miss Fajardose' => array(\n\t\t\t'label'    => 'Miss Fajardose',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Modern Antiqua' => array(\n\t\t\t'label'    => 'Modern Antiqua',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Molengo' => array(\n\t\t\t'label'    => 'Molengo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Molle' => array(\n\t\t\t'label'    => 'Molle',\n\t\t\t'variants' => array(\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Monda' => array(\n\t\t\t'label'    => 'Monda',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Monofett' => array(\n\t\t\t'label'    => 'Monofett',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Monoton' => array(\n\t\t\t'label'    => 'Monoton',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Monsieur La Doulaise' => array(\n\t\t\t'label'    => 'Monsieur La Doulaise',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Montaga' => array(\n\t\t\t'label'    => 'Montaga',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Montez' => array(\n\t\t\t'label'    => 'Montez',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Montserrat' => array(\n\t\t\t'label'    => 'Montserrat',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Montserrat Alternates' => array(\n\t\t\t'label'    => 'Montserrat Alternates',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Montserrat Subrayada' => array(\n\t\t\t'label'    => 'Montserrat Subrayada',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Moul' => array(\n\t\t\t'label'    => 'Moul',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Moulpali' => array(\n\t\t\t'label'    => 'Moulpali',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mountains of Christmas' => array(\n\t\t\t'label'    => 'Mountains of Christmas',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mouse Memoirs' => array(\n\t\t\t'label'    => 'Mouse Memoirs',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mr Bedfort' => array(\n\t\t\t'label'    => 'Mr Bedfort',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mr Dafoe' => array(\n\t\t\t'label'    => 'Mr Dafoe',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mr De Haviland' => array(\n\t\t\t'label'    => 'Mr De Haviland',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mrs Saint Delafield' => array(\n\t\t\t'label'    => 'Mrs Saint Delafield',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mrs Sheppards' => array(\n\t\t\t'label'    => 'Mrs Sheppards',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Muli' => array(\n\t\t\t'label'    => 'Muli',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Mystery Quest' => array(\n\t\t\t'label'    => 'Mystery Quest',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Neucha' => array(\n\t\t\t'label'    => 'Neucha',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t),\n\t\t\t),\n\t\t\t'Neuton' => array(\n\t\t\t'label'    => 'Neuton',\n\t\t\t'variants' => array(\n\t\t\t\t'200',\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'800',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'New Rocker' => array(\n\t\t\t'label'    => 'New Rocker',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'News Cycle' => array(\n\t\t\t'label'    => 'News Cycle',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Niconne' => array(\n\t\t\t'label'    => 'Niconne',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nixie One' => array(\n\t\t\t'label'    => 'Nixie One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nobile' => array(\n\t\t\t'label'    => 'Nobile',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nokora' => array(\n\t\t\t'label'    => 'Nokora',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Norican' => array(\n\t\t\t'label'    => 'Norican',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nosifer' => array(\n\t\t\t'label'    => 'Nosifer',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nothing You Could Do' => array(\n\t\t\t'label'    => 'Nothing You Could Do',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Noticia Text' => array(\n\t\t\t'label'    => 'Noticia Text',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Noto Sans' => array(\n\t\t\t'label'    => 'Noto Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'devanagari',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Noto Serif' => array(\n\t\t\t'label'    => 'Noto Serif',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nova Cut' => array(\n\t\t\t'label'    => 'Nova Cut',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nova Flat' => array(\n\t\t\t'label'    => 'Nova Flat',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nova Mono' => array(\n\t\t\t'label'    => 'Nova Mono',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nova Oval' => array(\n\t\t\t'label'    => 'Nova Oval',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nova Round' => array(\n\t\t\t'label'    => 'Nova Round',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nova Script' => array(\n\t\t\t'label'    => 'Nova Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nova Slim' => array(\n\t\t\t'label'    => 'Nova Slim',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nova Square' => array(\n\t\t\t'label'    => 'Nova Square',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Numans' => array(\n\t\t\t'label'    => 'Numans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Nunito' => array(\n\t\t\t'label'    => 'Nunito',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Odor Mean Chey' => array(\n\t\t\t'label'    => 'Odor Mean Chey',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Offside' => array(\n\t\t\t'label'    => 'Offside',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Old Standard TT' => array(\n\t\t\t'label'    => 'Old Standard TT',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Oldenburg' => array(\n\t\t\t'label'    => 'Oldenburg',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Oleo Script' => array(\n\t\t\t'label'    => 'Oleo Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Oleo Script Swash Caps' => array(\n\t\t\t'label'    => 'Oleo Script Swash Caps',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Open Sans' => array(\n\t\t\t'label'    => 'Open Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'800',\n\t\t\t\t'800italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'devanagari',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Open Sans Condensed' => array(\n\t\t\t'label'    => 'Open Sans Condensed',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Oranienbaum' => array(\n\t\t\t'label'    => 'Oranienbaum',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Orbitron' => array(\n\t\t\t'label'    => 'Orbitron',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'500',\n\t\t\t\t'700',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Oregano' => array(\n\t\t\t'label'    => 'Oregano',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Orienta' => array(\n\t\t\t'label'    => 'Orienta',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Original Surfer' => array(\n\t\t\t'label'    => 'Original Surfer',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Oswald' => array(\n\t\t\t'label'    => 'Oswald',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Over the Rainbow' => array(\n\t\t\t'label'    => 'Over the Rainbow',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Overlock' => array(\n\t\t\t'label'    => 'Overlock',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Overlock SC' => array(\n\t\t\t'label'    => 'Overlock SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ovo' => array(\n\t\t\t'label'    => 'Ovo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Oxygen' => array(\n\t\t\t'label'    => 'Oxygen',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Oxygen Mono' => array(\n\t\t\t'label'    => 'Oxygen Mono',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'PT Mono' => array(\n\t\t\t'label'    => 'PT Mono',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'PT Sans' => array(\n\t\t\t'label'    => 'PT Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'PT Sans Caption' => array(\n\t\t\t'label'    => 'PT Sans Caption',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'PT Sans Narrow' => array(\n\t\t\t'label'    => 'PT Sans Narrow',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'PT Serif' => array(\n\t\t\t'label'    => 'PT Serif',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'PT Serif Caption' => array(\n\t\t\t'label'    => 'PT Serif Caption',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Pacifico' => array(\n\t\t\t'label'    => 'Pacifico',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Paprika' => array(\n\t\t\t'label'    => 'Paprika',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Parisienne' => array(\n\t\t\t'label'    => 'Parisienne',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Passero One' => array(\n\t\t\t'label'    => 'Passero One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Passion One' => array(\n\t\t\t'label'    => 'Passion One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Pathway Gothic One' => array(\n\t\t\t'label'    => 'Pathway Gothic One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Patrick Hand' => array(\n\t\t\t'label'    => 'Patrick Hand',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Patrick Hand SC' => array(\n\t\t\t'label'    => 'Patrick Hand SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Patua One' => array(\n\t\t\t'label'    => 'Patua One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Paytone One' => array(\n\t\t\t'label'    => 'Paytone One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Peralta' => array(\n\t\t\t'label'    => 'Peralta',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Permanent Marker' => array(\n\t\t\t'label'    => 'Permanent Marker',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Petit Formal Script' => array(\n\t\t\t'label'    => 'Petit Formal Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Petrona' => array(\n\t\t\t'label'    => 'Petrona',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Philosopher' => array(\n\t\t\t'label'    => 'Philosopher',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t),\n\t\t\t),\n\t\t\t'Piedra' => array(\n\t\t\t'label'    => 'Piedra',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Pinyon Script' => array(\n\t\t\t'label'    => 'Pinyon Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Pirata One' => array(\n\t\t\t'label'    => 'Pirata One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Plaster' => array(\n\t\t\t'label'    => 'Plaster',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Play' => array(\n\t\t\t'label'    => 'Play',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Playball' => array(\n\t\t\t'label'    => 'Playball',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Playfair Display' => array(\n\t\t\t'label'    => 'Playfair Display',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Playfair Display SC' => array(\n\t\t\t'label'    => 'Playfair Display SC',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Podkova' => array(\n\t\t\t'label'    => 'Podkova',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Poiret One' => array(\n\t\t\t'label'    => 'Poiret One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Poller One' => array(\n\t\t\t'label'    => 'Poller One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Poly' => array(\n\t\t\t'label'    => 'Poly',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Pompiere' => array(\n\t\t\t'label'    => 'Pompiere',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Pontano Sans' => array(\n\t\t\t'label'    => 'Pontano Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Port Lligat Sans' => array(\n\t\t\t'label'    => 'Port Lligat Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Port Lligat Slab' => array(\n\t\t\t'label'    => 'Port Lligat Slab',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Prata' => array(\n\t\t\t'label'    => 'Prata',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Preahvihear' => array(\n\t\t\t'label'    => 'Preahvihear',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Press Start 2P' => array(\n\t\t\t'label'    => 'Press Start 2P',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Princess Sofia' => array(\n\t\t\t'label'    => 'Princess Sofia',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Prociono' => array(\n\t\t\t'label'    => 'Prociono',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Prosto One' => array(\n\t\t\t'label'    => 'Prosto One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Puritan' => array(\n\t\t\t'label'    => 'Puritan',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Purple Purse' => array(\n\t\t\t'label'    => 'Purple Purse',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Quando' => array(\n\t\t\t'label'    => 'Quando',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Quantico' => array(\n\t\t\t'label'    => 'Quantico',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Quattrocento' => array(\n\t\t\t'label'    => 'Quattrocento',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Quattrocento Sans' => array(\n\t\t\t'label'    => 'Quattrocento Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Questrial' => array(\n\t\t\t'label'    => 'Questrial',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Quicksand' => array(\n\t\t\t'label'    => 'Quicksand',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Quintessential' => array(\n\t\t\t'label'    => 'Quintessential',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Qwigley' => array(\n\t\t\t'label'    => 'Qwigley',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Racing Sans One' => array(\n\t\t\t'label'    => 'Racing Sans One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Radley' => array(\n\t\t\t'label'    => 'Radley',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Raleway' => array(\n\t\t\t'label'    => 'Raleway',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'200',\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'500',\n\t\t\t\t'600',\n\t\t\t\t'700',\n\t\t\t\t'800',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Raleway Dots' => array(\n\t\t\t'label'    => 'Raleway Dots',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rambla' => array(\n\t\t\t'label'    => 'Rambla',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rammetto One' => array(\n\t\t\t'label'    => 'Rammetto One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ranchers' => array(\n\t\t\t'label'    => 'Ranchers',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rancho' => array(\n\t\t\t'label'    => 'Rancho',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rationale' => array(\n\t\t\t'label'    => 'Rationale',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Redressed' => array(\n\t\t\t'label'    => 'Redressed',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Reenie Beanie' => array(\n\t\t\t'label'    => 'Reenie Beanie',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Revalia' => array(\n\t\t\t'label'    => 'Revalia',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ribeye' => array(\n\t\t\t'label'    => 'Ribeye',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ribeye Marrow' => array(\n\t\t\t'label'    => 'Ribeye Marrow',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Righteous' => array(\n\t\t\t'label'    => 'Righteous',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Risque' => array(\n\t\t\t'label'    => 'Risque',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Roboto' => array(\n\t\t\t'label'    => 'Roboto',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'100italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Roboto Condensed' => array(\n\t\t\t'label'    => 'Roboto Condensed',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Roboto Slab' => array(\n\t\t\t'label'    => 'Roboto Slab',\n\t\t\t'variants' => array(\n\t\t\t\t'100',\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rochester' => array(\n\t\t\t'label'    => 'Rochester',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rock Salt' => array(\n\t\t\t'label'    => 'Rock Salt',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rokkitt' => array(\n\t\t\t'label'    => 'Rokkitt',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Romanesco' => array(\n\t\t\t'label'    => 'Romanesco',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ropa Sans' => array(\n\t\t\t'label'    => 'Ropa Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rosario' => array(\n\t\t\t'label'    => 'Rosario',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rosarivo' => array(\n\t\t\t'label'    => 'Rosarivo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rouge Script' => array(\n\t\t\t'label'    => 'Rouge Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ruda' => array(\n\t\t\t'label'    => 'Ruda',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rubik One' => array(\n\t\t\t'label'    => 'Rubik One',\n\t\t\t'variants' => array(\n\t\t\t\t'400',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rubik Mono One' => array(\n\t\t\t'label'    => 'Rubik Mono One',\n\t\t\t'variants' => array(\n\t\t\t\t'400',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rufina' => array(\n\t\t\t'label'    => 'Rufina',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ruge Boogie' => array(\n\t\t\t'label'    => 'Ruge Boogie',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ruluko' => array(\n\t\t\t'label'    => 'Ruluko',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rum Raisin' => array(\n\t\t\t'label'    => 'Rum Raisin',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ruslan Display' => array(\n\t\t\t'label'    => 'Ruslan Display',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Russo One' => array(\n\t\t\t'label'    => 'Russo One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ruthie' => array(\n\t\t\t'label'    => 'Ruthie',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Rye' => array(\n\t\t\t'label'    => 'Rye',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sacramento' => array(\n\t\t\t'label'    => 'Sacramento',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sail' => array(\n\t\t\t'label'    => 'Sail',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Salsa' => array(\n\t\t\t'label'    => 'Salsa',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sanchez' => array(\n\t\t\t'label'    => 'Sanchez',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sancreek' => array(\n\t\t\t'label'    => 'Sancreek',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sansita One' => array(\n\t\t\t'label'    => 'Sansita One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sarina' => array(\n\t\t\t'label'    => 'Sarina',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Satisfy' => array(\n\t\t\t'label'    => 'Satisfy',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Scada' => array(\n\t\t\t'label'    => 'Scada',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Schoolbell' => array(\n\t\t\t'label'    => 'Schoolbell',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Seaweed Script' => array(\n\t\t\t'label'    => 'Seaweed Script',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sevillana' => array(\n\t\t\t'label'    => 'Sevillana',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Seymour One' => array(\n\t\t\t'label'    => 'Seymour One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Shadows Into Light' => array(\n\t\t\t'label'    => 'Shadows Into Light',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Shadows Into Light Two' => array(\n\t\t\t'label'    => 'Shadows Into Light Two',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Shanti' => array(\n\t\t\t'label'    => 'Shanti',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Share' => array(\n\t\t\t'label'    => 'Share',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Share Tech' => array(\n\t\t\t'label'    => 'Share Tech',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Share Tech Mono' => array(\n\t\t\t'label'    => 'Share Tech Mono',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Shojumaru' => array(\n\t\t\t'label'    => 'Shojumaru',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Short Stack' => array(\n\t\t\t'label'    => 'Short Stack',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Siemreap' => array(\n\t\t\t'label'    => 'Siemreap',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sigmar One' => array(\n\t\t\t'label'    => 'Sigmar One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Signika' => array(\n\t\t\t'label'    => 'Signika',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'600',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Signika Negative' => array(\n\t\t\t'label'    => 'Signika Negative',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'600',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Simonetta' => array(\n\t\t\t'label'    => 'Simonetta',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sintony' => array(\n\t\t\t'label'    => 'Sintony',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sirin Stencil' => array(\n\t\t\t'label'    => 'Sirin Stencil',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Six Caps' => array(\n\t\t\t'label'    => 'Six Caps',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Skranji' => array(\n\t\t\t'label'    => 'Skranji',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Slackey' => array(\n\t\t\t'label'    => 'Slackey',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Smokum' => array(\n\t\t\t'label'    => 'Smokum',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Smythe' => array(\n\t\t\t'label'    => 'Smythe',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sniglet' => array(\n\t\t\t'label'    => 'Sniglet',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'800',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Snippet' => array(\n\t\t\t'label'    => 'Snippet',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Snowburst One' => array(\n\t\t\t'label'    => 'Snowburst One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sofadi One' => array(\n\t\t\t'label'    => 'Sofadi One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sofia' => array(\n\t\t\t'label'    => 'Sofia',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sonsie One' => array(\n\t\t\t'label'    => 'Sonsie One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sorts Mill Goudy' => array(\n\t\t\t'label'    => 'Sorts Mill Goudy',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Source Code Pro' => array(\n\t\t\t'label'    => 'Source Code Pro',\n\t\t\t'variants' => array(\n\t\t\t\t'200',\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'500',\n\t\t\t\t'600',\n\t\t\t\t'700',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Source Sans Pro' => array(\n\t\t\t'label'    => 'Source Sans Pro',\n\t\t\t'variants' => array(\n\t\t\t\t'200',\n\t\t\t\t'200italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t\t'900italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Source Serif Pro' => array(\n\t\t\t'label'    => 'Source Serif Pro',\n\t\t\t'variants' => array(\n\t\t\t\t'400',\n\t\t\t\t'600',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Special Elite' => array(\n\t\t\t'label'    => 'Special Elite',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Spicy Rice' => array(\n\t\t\t'label'    => 'Spicy Rice',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Spinnaker' => array(\n\t\t\t'label'    => 'Spinnaker',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Spirax' => array(\n\t\t\t'label'    => 'Spirax',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Squada One' => array(\n\t\t\t'label'    => 'Squada One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Stalemate' => array(\n\t\t\t'label'    => 'Stalemate',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Stalinist One' => array(\n\t\t\t'label'    => 'Stalinist One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Stardos Stencil' => array(\n\t\t\t'label'    => 'Stardos Stencil',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Stint Ultra Condensed' => array(\n\t\t\t'label'    => 'Stint Ultra Condensed',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Stint Ultra Expanded' => array(\n\t\t\t'label'    => 'Stint Ultra Expanded',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Stoke' => array(\n\t\t\t'label'    => 'Stoke',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Strait' => array(\n\t\t\t'label'    => 'Strait',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sue Ellen Francisco' => array(\n\t\t\t'label'    => 'Sue Ellen Francisco',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Sunshiney' => array(\n\t\t\t'label'    => 'Sunshiney',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Supermercado One' => array(\n\t\t\t'label'    => 'Supermercado One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Suwannaphum' => array(\n\t\t\t'label'    => 'Suwannaphum',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Swanky and Moo Moo' => array(\n\t\t\t'label'    => 'Swanky and Moo Moo',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Syncopate' => array(\n\t\t\t'label'    => 'Syncopate',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Tangerine' => array(\n\t\t\t'label'    => 'Tangerine',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Taprom' => array(\n\t\t\t'label'    => 'Taprom',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'khmer',\n\t\t\t),\n\t\t\t),\n\t\t\t'Tauri' => array(\n\t\t\t'label'    => 'Tauri',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Telex' => array(\n\t\t\t'label'    => 'Telex',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Tenor Sans' => array(\n\t\t\t'label'    => 'Tenor Sans',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Text Me One' => array(\n\t\t\t'label'    => 'Text Me One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'The Girl Next Door' => array(\n\t\t\t'label'    => 'The Girl Next Door',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Tienne' => array(\n\t\t\t'label'    => 'Tienne',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Tinos' => array(\n\t\t\t'label'    => 'Tinos',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'vietnamese',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Titan One' => array(\n\t\t\t'label'    => 'Titan One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Titillium Web' => array(\n\t\t\t'label'    => 'Titillium Web',\n\t\t\t'variants' => array(\n\t\t\t\t'200',\n\t\t\t\t'200italic',\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'600',\n\t\t\t\t'600italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t\t'900',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Trade Winds' => array(\n\t\t\t'label'    => 'Trade Winds',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Trocchi' => array(\n\t\t\t'label'    => 'Trocchi',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Trochut' => array(\n\t\t\t'label'    => 'Trochut',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Trykker' => array(\n\t\t\t'label'    => 'Trykker',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Tulpen One' => array(\n\t\t\t'label'    => 'Tulpen One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ubuntu' => array(\n\t\t\t'label'    => 'Ubuntu',\n\t\t\t'variants' => array(\n\t\t\t\t'300',\n\t\t\t\t'300italic',\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'500',\n\t\t\t\t'500italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ubuntu Condensed' => array(\n\t\t\t'label'    => 'Ubuntu Condensed',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ubuntu Mono' => array(\n\t\t\t'label'    => 'Ubuntu Mono',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'greek-ext',\n\t\t\t\t'cyrillic',\n\t\t\t\t'greek',\n\t\t\t\t'latin-ext',\n\t\t\t\t'cyrillic-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Ultra' => array(\n\t\t\t'label'    => 'Ultra',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Uncial Antiqua' => array(\n\t\t\t'label'    => 'Uncial Antiqua',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Underdog' => array(\n\t\t\t'label'    => 'Underdog',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Unica One' => array(\n\t\t\t'label'    => 'Unica One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'UnifrakturCook' => array(\n\t\t\t'label'    => 'UnifrakturCook',\n\t\t\t'variants' => array(\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'UnifrakturMaguntia' => array(\n\t\t\t'label'    => 'UnifrakturMaguntia',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Unkempt' => array(\n\t\t\t'label'    => 'Unkempt',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Unlock' => array(\n\t\t\t'label'    => 'Unlock',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Unna' => array(\n\t\t\t'label'    => 'Unna',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'VT323' => array(\n\t\t\t'label'    => 'VT323',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Vampiro One' => array(\n\t\t\t'label'    => 'Vampiro One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Varela' => array(\n\t\t\t'label'    => 'Varela',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Varela Round' => array(\n\t\t\t'label'    => 'Varela Round',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Vast Shadow' => array(\n\t\t\t'label'    => 'Vast Shadow',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Vibur' => array(\n\t\t\t'label'    => 'Vibur',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Vidaloka' => array(\n\t\t\t'label'    => 'Vidaloka',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Viga' => array(\n\t\t\t'label'    => 'Viga',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Voces' => array(\n\t\t\t'label'    => 'Voces',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Volkhov' => array(\n\t\t\t'label'    => 'Volkhov',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Vollkorn' => array(\n\t\t\t'label'    => 'Vollkorn',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t\t'italic',\n\t\t\t\t'700',\n\t\t\t\t'700italic',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Voltaire' => array(\n\t\t\t'label'    => 'Voltaire',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Waiting for the Sunrise' => array(\n\t\t\t'label'    => 'Waiting for the Sunrise',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Wallpoet' => array(\n\t\t\t'label'    => 'Wallpoet',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Walter Turncoat' => array(\n\t\t\t'label'    => 'Walter Turncoat',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Warnes' => array(\n\t\t\t'label'    => 'Warnes',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Wellfleet' => array(\n\t\t\t'label'    => 'Wellfleet',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Wendy One' => array(\n\t\t\t'label'    => 'Wendy One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Wire One' => array(\n\t\t\t'label'    => 'Wire One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Yanone Kaffeesatz' => array(\n\t\t\t'label'    => 'Yanone Kaffeesatz',\n\t\t\t'variants' => array(\n\t\t\t\t'200',\n\t\t\t\t'300',\n\t\t\t\t'regular',\n\t\t\t\t'700',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Yellowtail' => array(\n\t\t\t'label'    => 'Yellowtail',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Yeseva One' => array(\n\t\t\t'label'    => 'Yeseva One',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t\t'cyrillic',\n\t\t\t\t'latin-ext',\n\t\t\t),\n\t\t\t),\n\t\t\t'Yesteryear' => array(\n\t\t\t'label'    => 'Yesteryear',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t\t'Zeyada' => array(\n\t\t\t'label'    => 'Zeyada',\n\t\t\t'variants' => array(\n\t\t\t\t'regular',\n\t\t\t),\n\t\t\t'subsets' => array(\n\t\t\t\t'latin',\n\t\t\t),\n\t\t\t),\n\t\t) );\n\t}\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/extensions/interface.php",
    "content": "<?php\n/**\n * Builds out customizer options\n *\n * @package       Customizer_Library\n * @author        Devin Price\n */\n\nif ( ! function_exists( 'customizer_library_register' ) ) :\n\t/**\n\t * Configure settings and controls for the theme customizer.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @param  object $wp_customize The global customizer object.\n\t */\n\tfunction customizer_library_register( $wp_customize ) {\n\n\t\t$customizer_library = Customizer_Library::Instance();\n\n\t\t$options = $customizer_library->get_options();\n\n\t\t// Bail early if we don't have any options.\n\t\tif ( empty( $options ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add the sections.\n\t\tif ( isset( $options['sections'] ) ) {\n\t\t\tcustomizer_library_add_sections( $options['sections'], $wp_customize );\n\t\t}\n\n\t\t// Add the sections.\n\t\tif ( isset( $options['panels'] ) ) {\n\t\t\tcustomizer_library_add_panels( $options['panels'], $wp_customize );\n\t\t}\n\n\t\t// Sets the priority for each control added.\n\t\t$loop = 0;\n\n\t\t// Loops through each of the options.\n\t\tforeach ( $options as $option ) {\n\n\t\t\t// Set blank description if one isn't set.\n\t\t\tif ( ! isset( $option['description'] ) ) {\n\t\t\t\t$option['description'] = '';\n\t\t\t}\n\n\t\t\tif ( isset( $option['type'] ) ) {\n\n\t\t\t\t$loop ++;\n\n\t\t\t\t// Apply a default sanitization if one isn't set.\n\t\t\t\tif ( ! isset( $option['sanitize_callback'] ) ) {\n\t\t\t\t\t$option['sanitize_callback'] = customizer_library_get_sanitization( $option['type'] );\n\t\t\t\t}\n\n\t\t\t\t// Set blank active_callback if one isn't set.\n\t\t\t\tif ( ! isset( $option['active_callback'] ) ) {\n\t\t\t\t\t$option['active_callback'] = '';\n\t\t\t\t}\n\n\t\t\t\t// Add the setting.\n\t\t\t\tcustomizer_library_add_setting( $option, $wp_customize );\n\n\t\t\t\t// Priority for control.\n\t\t\t\tif ( ! isset( $option['priority'] ) ) {\n\t\t\t\t\t$option['priority'] = $loop;\n\t\t\t\t}\n\n\t\t\t\t// Adds control based on control type.\n\t\t\t\tswitch ( $option['type'] ) {\n\n\t\t\t\t\tcase 'text':\n\t\t\t\t\tcase 'url':\n\t\t\t\t\tcase 'select':\n\t\t\t\t\tcase 'radio':\n\t\t\t\t\tcase 'checkbox':\n\t\t\t\t\tcase 'range':\n\t\t\t\t\tcase 'dropdown-pages':\n\n\t\t\t\t\t\t$wp_customize->add_control(\n\t\t\t\t\t\t\t$option['id'], $option\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'color':\n\n\t\t\t\t\t\t$wp_customize->add_control(\n\t\t\t\t\t\t\tnew WP_Customize_Color_Control(\n\t\t\t\t\t\t\t\t$wp_customize, $option['id'], $option\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'image':\n\n\t\t\t\t\t\t$wp_customize->add_control(\n\t\t\t\t\t\t\tnew WP_Customize_Image_Control(\n\t\t\t\t\t\t\t\t$wp_customize,\n\t\t\t\t\t\t\t\t$option['id'], array(\n\t\t\t\t\t\t\t\t\t'label'             => $option['label'],\n\t\t\t\t\t\t\t\t\t'section'           => $option['section'],\n\t\t\t\t\t\t\t\t\t'sanitize_callback' => $option['sanitize_callback'],\n\t\t\t\t\t\t\t\t\t'priority'          => $option['priority'],\n\t\t\t\t\t\t\t\t\t'active_callback'   => $option['active_callback'],\n\t\t\t\t\t\t\t\t\t'description'      => $option['description'],\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'upload':\n\n\t\t\t\t\t\t$wp_customize->add_control(\n\t\t\t\t\t\t\tnew WP_Customize_Upload_Control(\n\t\t\t\t\t\t\t\t$wp_customize,\n\t\t\t\t\t\t\t\t$option['id'], array(\n\t\t\t\t\t\t\t\t\t'label'             => $option['label'],\n\t\t\t\t\t\t\t\t\t'section'           => $option['section'],\n\t\t\t\t\t\t\t\t\t'sanitize_callback' => $option['sanitize_callback'],\n\t\t\t\t\t\t\t\t\t'priority'          => $option['priority'],\n\t\t\t\t\t\t\t\t\t'active_callback'   => $option['active_callback'],\n\t\t\t\t\t\t\t\t\t'description'      => $option['description'],\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'textarea':\n\n\t\t\t\t\t\t// Custom control required before WordPress 4.0.\n\t\t\t\t\t\tif ( version_compare( $GLOBALS['wp_version'], '3.9.2', '<=' ) ) :\n\n\t\t\t\t\t\t\t$wp_customize->add_control(\n\t\t\t\t\t\t\t\tnew Customizer_Library_Textarea(\n\t\t\t\t\t\t\t\t\t$wp_customize, $option['id'], $option\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\telse :\n\n\t\t\t\t\t\t\t$wp_customize->add_control( 'setting_id', array(\n\t\t\t\t\t\t\t\t$wp_customize->add_control(\n\t\t\t\t\t\t\t\t\t$option['id'], $option\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) );\n\n\t\t\t\t\t\tendif;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'content':\n\t\t\t\t\tcase 'line':\n\n\t\t\t\t\t\t$wp_customize->add_control(\n\t\t\t\t\t\t\tnew Customizer_Library_Content(\n\t\t\t\t\t\t\t\t$wp_customize, $option['id'], $option\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\nendif;\n\nadd_action( 'customize_register', 'customizer_library_register', 100 );\n\n/**\n * Add the customizer sections\n *\n * @since  1.2.0.\n *\n * @param  array  $sections List of sections.\n * @param  object $wp_customize customize object.\n *\n * @return void\n */\nfunction customizer_library_add_sections( $sections, $wp_customize ) {\n\n\tforeach ( $sections as $section ) {\n\n\t\tif ( ! isset( $section['description'] ) ) {\n\t\t\t$section['description'] = false;\n\t\t}\n\n\t\t$wp_customize->add_section( $section['id'], $section );\n\t}\n\n}\n\n/**\n * Add the customizer panels\n *\n * @since  1.2.0.\n *\n * @param  array  $panels List of panels.\n * @param  object $wp_customize customize object.\n */\nfunction customizer_library_add_panels( $panels, $wp_customize ) {\n\n\tforeach ( $panels as $panel ) {\n\n\t\tif ( ! isset( $panel['description'] ) ) {\n\t\t\t$panel['description'] = false;\n\t\t}\n\n\t\t$wp_customize->add_panel( $panel['id'], $panel );\n\t}\n\n}\n\n\n/**\n * Add the setting and proper sanitization\n *\n * @since  1.2.0.\n *\n * @param  array  $option Settings array.\n * @param  object $wp_customize customize object.\n */\nfunction customizer_library_add_setting( $option, $wp_customize ) {\n\n\t$settings_default = array(\n\t\t'default'              => null,\n\t\t'option_type'          => 'theme_mod',\n\t\t'capability'           => 'edit_theme_options',\n\t\t'theme_supports'       => null,\n\t\t'transport'            => null,\n\t\t'sanitize_callback'    => 'wp_kses_post',\n\t\t'sanitize_js_callback' => null,\n\t);\n\n\t// Settings defaults.\n\t$settings = array_merge( $settings_default, $option );\n\n\t// Arguments for $wp_customize->add_setting.\n\t$wp_customize->add_setting( $option['id'], array(\n\t\t\t'default'              => $settings['default'],\n\t\t\t'type'                 => $settings['option_type'],\n\t\t\t'capability'           => $settings['capability'],\n\t\t\t'theme_supports'       => $settings['theme_supports'],\n\t\t\t'transport'            => $settings['transport'],\n\t\t\t'sanitize_callback'    => $settings['sanitize_callback'],\n\t\t\t'sanitize_js_callback' => $settings['sanitize_js_callback'],\n\t\t)\n\t);\n\n}\n\n/**\n * Get default sanitization function for option type\n *\n * @since  1.2.0.\n *\n * @param  string $type Option type.\n */\nfunction customizer_library_get_sanitization( $type ) {\n\n\tif ( 'select' === $type || 'radio' === $type ) {\n\t\treturn 'customizer_library_sanitize_choices';\n\t}\n\n\tif ( 'checkbox' === $type ) {\n\t\treturn 'customizer_library_sanitize_checkbox';\n\t}\n\n\tif ( 'color' === $type ) {\n\t\treturn 'sanitize_hex_color';\n\t}\n\n\tif ( 'upload' === $type || 'image' === $type ) {\n\t\treturn 'customizer_library_sanitize_file_url';\n\t}\n\n\tif ( 'text' === $type || 'textarea' === $type ) {\n\t\treturn 'customizer_library_sanitize_text';\n\t}\n\n\tif ( 'url' === $type ) {\n\t\treturn 'esc_url';\n\t}\n\n\tif ( 'range' === $type ) {\n\t\treturn 'customizer_library_sanitize_range';\n\t}\n\n\tif ( 'dropdown-pages' === $type ) {\n\t\treturn 'absint';\n\t}\n\n\t// If a custom option is being used, return false.\n\treturn false;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/extensions/preview.php",
    "content": "<?php\n/**\n * Customizer Utility Functions\n *\n * @package \tCustomizer_Library\n * @author\t\tDevin Price, The Theme Foundry\n */\n\n/**\n * Binds JS handlers to make Theme Customizer preview reload changes asynchronously.\n */\nfunction customizer_library_customize_preview_js() {\n\n\t$path = str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, dirname( dirname( __FILE__ ) ) );\n\n\twp_enqueue_script( 'customizer_library_customizer', $path . '/js/customizer.js', array( 'customize-preview' ), '1.0.0', true );\n\n}\nadd_action( 'customize_preview_init', 'customizer_library_customize_preview_js' );\n\n/**\n * Add postMessage support for site title and description for the Theme Customizer.\n *\n * @param WP_Customize_Manager $wp_customize Theme Customizer object.\n */\nfunction customizer_library_customize_register( $wp_customize ) {\n\t$wp_customize->get_setting( 'blogname' )->transport = 'postMessage';\n\t$wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage';\n}\nadd_action( 'customize_register', 'customizer_library_customize_register' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/extensions/sanitization.php",
    "content": "<?php\n/**\n * Customizer Sanization\n *\n * @package \tCustomizer_Library\n * @author\t\tDevin Price, The Theme Foundry\n */\n\nif ( ! function_exists( 'customizer_library_sanitize_text' ) ) :\n\t/**\n\t * Sanitize a string to allow only tags in the allowedtags array.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @param  string $string    The unsanitized string.\n\t * @return string               The sanitized string.\n\t */\n\tfunction customizer_library_sanitize_text( $string ) {\n\t\tglobal $allowedtags;\n\t\treturn wp_kses( $string , $allowedtags );\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_sanitize_checkbox' ) ) :\n\t/**\n\t * Sanitize a checkbox to only allow 0 or 1\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @param  boolean $value    The unsanitized value.\n\t * @return boolean\t\t\t\tThe sanitized boolean.\n\t */\n\tfunction customizer_library_sanitize_checkbox( $value ) {\n\t\tif ( 1 === $value ) {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_sanitize_choices' ) ) :\n\t/**\n\t * Sanitize a value from a list of allowed values.\n\t *\n\t * @since 1.0.0.\n\t *\n\t * @param  mixed $value      The value to sanitize.\n\t * @param  mixed $setting    The setting for which the sanitizing is occurring.\n\t * @return mixed                The sanitized value.\n\t */\n\tfunction customizer_library_sanitize_choices( $value, $setting ) {\n\t\tif ( is_object( $setting ) ) {\n\t\t\t$setting = $setting->id;\n\t\t}\n\n\t\t$choices = customizer_library_get_choices( $setting );\n\t\t$allowed_choices = array_keys( $choices );\n\n\t\tif ( ! in_array( $value, $allowed_choices ) ) {\n\t\t\t$value = customizer_library_get_default( $setting );\n\t\t}\n\n\t\treturn $value;\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_sanitize_file_url' ) ) :\n\t/**\n\t * Sanitize the url of uploaded media.\n\t *\n\t * @since 1.0.0.\n\t *\n\t * @param  string $value      The url to sanitize\n\t * @return string    $output     The sanitized url.\n\t */\n\tfunction customizer_library_sanitize_file_url( $url ) {\n\n\t\t$output = '';\n\n\t\t$filetype = wp_check_filetype( $url );\n\t\tif ( $filetype['ext'] ) {\n\t\t\t$output = esc_url_raw( $url );\n\t\t}\n\n\t\treturn $output;\n\t}\nendif;\n\nif ( ! function_exists( 'sanitize_hex_color' ) ) :\n\t/**\n\t * Sanitizes a hex color.\n\t *\n\t * Returns either '', a 3 or 6 digit hex color (with #), or null.\n\t * For sanitizing values without a #, see sanitize_hex_color_no_hash().\n\t *\n\t * @since 3.4.0\n\t *\n\t * @param string $color\n\t * @return string|null\n\t */\n\tfunction sanitize_hex_color( $color ) {\n\t\tif ( '' === $color ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t// 3 or 6 hex digits, or the empty string.\n\t\tif ( preg_match( '|^#([A-Fa-f0-9]{3}){1,2}$|', $color ) ) {\n\t\t\treturn $color;\n\t\t}\n\n\t\treturn null;\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_sanitize_range' ) ) :\n\t/**\n\t * Sanitizes a range value\n\t *\n\t * @since 1.3.0\n\t *\n\t * @param string $color\n\t * @return string|null\n\t */\n\tfunction customizer_library_sanitize_range( $value ) {\n\n\t\tif ( is_numeric( $value ) ) {\n\t\t\treturn $value;\n\t\t}\n\n\t\treturn 0;\n\t}\nendif;\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/extensions/style-builder.php",
    "content": "<?php\n/**\n * @package \tCustomizer_Library\n * @author\t\tThe Theme Foundry\n */\n\nif ( ! class_exists( 'Customizer_Library_Styles' ) ) :\n\t/**\n\t * Singleton to collect and print CSS based on user input.\n\t *\n\t * This class provides a mechanism to gather all of the CSS needed to implement theme options. It allows for handling\n\t * of conflicting rules and sorts out what the final CSS should be. The primary function is `add()`. It allows the\n\t * caller to add a new rule to be generated in the CSS.\n\t */\n\tclass Customizer_Library_Styles {\n\n\t\t/**\n\t\t * The one instance of Customizer_Library_Styles.\n\t\t *\n\t\t * @since 1.0.0.\n\t\t *\n\t\t * @var   Customizer_Library_Styles    The one instance for the singleton.\n\t\t */\n\t\tprivate static $instance;\n\n\t\t/**\n\t\t * The array for storing added CSS rule data.\n\t\t *\n\t\t * @since 1.0.0.\n\t\t *\n\t\t * @var   array    Holds the data to be printed out.\n\t\t */\n\n\t\tpublic $data = array();\n\n\t\t/**\n\t\t * Optional line ending character for debug mode.\n\t\t *\n\t\t * @since 1.0.0.\n\t\t *\n\t\t * @var   string    Line ending character used to better style the CSS.\n\t\t */\n\t\tprivate $line_ending = '';\n\n\t\t/**\n\t\t * Optional tab character for debug mode.\n\t\t *\n\t\t * @since 1.0.0.\n\t\t *\n\t\t * @var   string    Line ending character used to better style the CSS.\n\t\t */\n\t\tprivate $tab = '';\n\n\t\t/**\n\t\t * Instantiate or return the one Customizer_Library_Styles instance.\n\t\t *\n\t\t * @since  1.0.0.\n\t\t *\n\t\t * @return Customizer_Library_Styles\n\t\t */\n\t\tpublic static function instance() {\n\t\t\tif ( is_null( self::$instance ) ) {\n\t\t\t\tself::$instance = new self();\n\t\t\t}\n\n\t\t\treturn self::$instance;\n\t\t}\n\n\t\t/**\n\t\t * Initialize the object.\n\t\t *\n\t\t * @since  1.0.0.\n\t\t *\n\t\t * @return Customizer_Library_Styles\n\t\t */\n\t\tfunction __construct() {\n\t\t\t// Set line ending and tab\n\t\t\tif ( defined( 'SCRIPT_DEBUG' ) && true === SCRIPT_DEBUG ) {\n\t\t\t\t$this->line_ending = \"\\n\";\n\t\t\t\t$this->tab = \"\\t\";\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Add a new CSS rule to the array.\n\t\t *\n\t\t * Accepts data to eventually be turned into CSS. Usage:\n\t\t *\n\t\t * Customizer_Library_Styles()->add( array(\n\t\t *     'selectors'    => array( '.site-header-main' ),\n\t\t *     'declarations' => array(\n\t\t *         'background-color' => $header_background_color\n\t\t *     ),\n\t\t *     'media' => 'print',\n\t\t * ) );\n\t\t *\n\t\t * Selectors represent the CSS selectors; declarations are the CSS properties and values with keys being properties\n\t\t * and values being values. 'media' can also be declared to specify the media query.\n\t\t *\n\t\t * Note that data *must* be sanitized when adding to the data array. Because every piece of CSS data has special\n\t\t * sanitization concerns, it must be handled at the time of addition, not at the time of output. The theme handles\n\t\t * this in the the other helper files, i.e., the data is already sanitized when `add()` is called.\n\t\t *\n\t\t * @since  1.0.0.\n\t\t *\n\t\t * @param  array $data    The selectors and properties to add to the CSS.\n\t\t * @return void\n\t\t */\n\t\tpublic function add( $data ) {\n\t\t\tif ( ! isset( $data['selectors'] ) || ! isset( $data['declarations'] ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$entry = array();\n\n\t\t\t// Sanitize selectors\n\t\t\t$entry['selectors'] = array_map( 'trim', (array) $data['selectors'] );\n\t\t\t$entry['selectors'] = array_unique( $entry['selectors'] );\n\n\t\t\t// Sanitize declarations\n\t\t\t$entry['declarations'] = array_map( 'trim', (array) $data['declarations'] );\n\n\t\t\t// Check for media query\n\t\t\tif ( isset( $data['media'] ) ) {\n\t\t\t\t$media = $data['media'];\n\t\t\t} else {\n\t\t\t\t$media = 'all';\n\t\t\t}\n\n\t\t\t// Create new media query if it doesn't exist yet\n\t\t\tif ( ! isset( $this->data[ $media ] ) || ! is_array( $this->data[ $media ] ) ) {\n\t\t\t\t$this->data[ $media ] = array();\n\t\t\t}\n\n\t\t\t// Look for matching selector sets\n\t\t\t$match = false;\n\t\t\tforeach ( $this->data[ $media ] as $key => $rule ) {\n\t\t\t\t$diff1 = array_diff( $rule['selectors'], $entry['selectors'] );\n\t\t\t\t$diff2 = array_diff( $entry['selectors'], $rule['selectors'] );\n\t\t\t\tif ( empty( $diff1 ) && empty( $diff2 ) ) {\n\t\t\t\t\t$match = $key;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// No matching selector set, add a new entry\n\t\t\tif ( false === $match ) {\n\t\t\t\t$this->data[ $media ][] = $entry;\n\t\t\t} // Yes, matching selector set, merge declarations\n\t\t\telse {\n\t\t\t\t$this->data[ $media ][ $match ]['declarations'] = array_merge( $this->data[ $media ][ $match ]['declarations'], $entry['declarations'] );\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Compile the data array into standard CSS syntax\n\t\t *\n\t\t * @since  1.0.0.\n\t\t *\n\t\t * @return string    The CSS that is built from the data.\n\t\t */\n\t\tpublic function build() {\n\t\t\tif ( empty( $this->data ) ) {\n\t\t\t\treturn '';\n\t\t\t}\n\n\t\t\t$n = $this->line_ending;\n\n\t\t\t// Make sure the 'all' array is first\n\t\t\tif ( isset( $this->data['all'] ) && count( $this->data ) > 1 ) {\n\t\t\t\t$all = array( 'all' => $this->data['all'] );\n\t\t\t\tunset( $this->data['all'] );\n\t\t\t\t$this->data = array_merge( $all, $this->data );\n\t\t\t}\n\n\t\t\t$output = '';\n\n\t\t\tforeach ( $this->data as $query => $ruleset ) {\n\t\t\t\t$t = '';\n\n\t\t\t\tif ( 'all' !== $query ) {\n\t\t\t\t\t$output .= \"\\n@media \" . $query . '{' . $n;\n\t\t\t\t\t$t = $this->tab;\n\t\t\t\t}\n\n\t\t\t\t// Build each rule\n\t\t\t\tforeach ( $ruleset as $rule ) {\n\t\t\t\t\t$output .= $this->parse_selectors( $rule['selectors'], $t ) . '{' . $n;\n\t\t\t\t\t$output .= $this->parse_declarations( $rule['declarations'], $t );\n\t\t\t\t\t$output .= $t . '}' . $n;\n\t\t\t\t}\n\n\t\t\t\tif ( 'all' !== $query ) {\n\t\t\t\t\t$output .= '}' . $n;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn $output;\n\t\t}\n\n\t\t/**\n\t\t * Compile the selectors in a rule into a string.\n\t\t *\n\t\t * @since  1.0.0.\n\t\t *\n\t\t * @param  array  $selectors    Selectors to combine into single selector.\n\t\t * @param  string $tab          Tab character.\n\t\t * @return string                  Results of the selector combination.\n\t\t */\n\t\tprivate function parse_selectors( $selectors, $tab = '' ) {\n\t\t\t/**\n\t\t * Note that these selectors are hardcoded in the code base. They are never the result of user input and can\n\t\t * thus be trusted to be sane.\n\t\t */\n\t\t\t$n      = $this->line_ending;\n\t\t\t$output = $tab . implode( \",{$n}{$tab}\", $selectors );\n\t\t\treturn $output;\n\t\t}\n\n\t\t/**\n\t\t * Compile the declarations in a rule into a string.\n\t\t *\n\t\t * @since  1.0.0.\n\t\t *\n\t\t * @param  array  $declarations    Declarations for a selector.\n\t\t * @param  string $tab             Tab character.\n\t\t * @return string                     The combines declarations.\n\t\t */\n\t\tprivate function parse_declarations( $declarations, $tab = '' ) {\n\t\t\t$n = $this->line_ending;\n\t\t\t$t = $this->tab . $tab;\n\n\t\t\t$output = '';\n\n\t\t\t/**\n\t\t * Note that when this output is prepared, it is not escaped, sanitized or otherwise altered. The sanitization\n\t\t * routines are implemented when the developer calls `Customizer_Library_Styles()->add`. Because every property value has\n\t\t * special sanitization needs, it is handled at that point.\n\t\t */\n\t\t\tforeach ( $declarations as $property => $value ) {\n\t\t\t\t// Exception for px/rem font size\n\t\t\t\tif ( 'font-size-px' === $property || 'font-size-rem' === $property ) {\n\t\t\t\t\t$property = 'font-size';\n\t\t\t\t}\n\t\t\t\t$output .= \"{$t}{$property}:{$value};$n\";\n\t\t\t}\n\n\t\t\treturn $output;\n\t\t}\n\t}\nendif;\n\nif ( ! function_exists( 'customizer_library_styles' ) ) :\n\t/**\n\t * Return the one Customizer_Library_Styles object.\n\t *\n\t * @since  1.0.0.\n\t *\n\t * @return Customizer_Library_Styles\tThe Customizer_Library_Styles object.\n\t */\n\tfunction customizer_library_styles() {\n\t\treturn Customizer_Library_Styles::instance();\n\t}\nendif;\n\nadd_action( 'init', 'customizer_library_styles', 1 );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/extensions/utilities.php",
    "content": "<?php\n/**\n * Customizer Utility Functions\n *\n * @package \tCustomizer_Library\n * @author\t\tDevin Price, The Theme Foundry\n */\n\n/**\n * Helper function to return defaults\n *\n * @since  1.0.0\n *\n * @param string\n * @return mixed $default\n */\n\nfunction customizer_library_get_default( $setting ) {\n\n\t$customizer_library = Customizer_Library::Instance();\n\t$options = $customizer_library->get_options();\n\n\tif ( isset( $options[ $setting ]['default'] ) ) {\n\t\treturn $options[ $setting ]['default'];\n\t}\n\n}\n\n/**\n * Helper function to return choices\n *\n * @since  1.0.0\n *\n * @param string\n * @return mixed $default\n */\nfunction customizer_library_get_choices( $setting ) {\n\n\t$customizer_library = Customizer_Library::Instance();\n\t$options = $customizer_library->get_options();\n\n\tif ( isset( $options[ $setting ]['choices'] ) ) {\n\t\treturn $options[ $setting ]['choices'];\n\t}\n\n}\n\n/**\n * Converts a hex color to RGB.  Returns the RGB values as an array.\n *\n * @since  1.0.0\n *\n * @access public\n * @param  string $hex\n * @return array\n */\nfunction customizer_library_hex_to_rgb( $hex ) {\n\n\t// Remove \"#\" if it was added\n\t$color = trim( $hex, '#' );\n\n\t// Return empty array if invalid value was sent\n\tif ( ! ( 3 === strlen( $color ) ) && ! ( 6 === strlen( $color ) ) ) {\n\t\treturn array();\n\t}\n\n\t// If the color is three characters, convert it to six.\n\tif ( 3 === strlen( $color ) ) {\n\t\t$color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2];\n\t}\n\n\t// Get the red, green, and blue values\n\t$red   = hexdec( $color[0] . $color[1] );\n\t$green = hexdec( $color[2] . $color[3] );\n\t$blue  = hexdec( $color[4] . $color[5] );\n\n\t// Return the RGB colors as an array\n\treturn array( 'r' => $red, 'g' => $green, 'b' => $blue );\n}\n\n/**\n * Helper function to remove custom theme mods\n *\n * @since  1.0.0\n *\n * @param string\n * @return mixed $default\n */\nfunction customizer_library_remove_theme_mods() {\n\n\t$customizer_library = Customizer_Library::Instance();\n\t$options = $customizer_library->get_options();\n\n\tif ( $options ) {\n\t\tforeach ( $options as $option ) {\n\t\t\tif ( isset( $option['id'] ) ) {\n\t\t\t\tremove_theme_mod( $option['id'] );\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Helper function to return background-repeat choices\n *\n * @since  1.0.0\n *\n * @param string\n * @return array $choices\n */\nfunction customizer_library_get_repeat_choices() {\n\n\t$choices = array(\n\t\t'no-repeat' => 'No Repeat',\n\t\t'repeat-x' => 'Repeat Horizontally',\n\t\t'repeat-y' => 'Repeat Vertically',\n\t\t'repeat' => 'Repeat Both',\n\t\t);\n\n\treturn $choices;\n}\n\n/**\n * Helper function to return background-repeat choices\n *\n * @since  1.0.0\n *\n * @param string\n * @return array $choices\n */\nfunction customizer_library_replace_space( $font ) {\n\n\t$font = str_replace( ' ', '-', $font );\n\treturn $font;\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/libraries/customizer/js/customizer.js",
    "content": "/**\n * Theme Customizer enhancements for a better user experience.\n *\n * Contains handlers to make Theme Customizer preview reload changes asynchronously.\n */\n\n( function( $ ) {\n\n\t// Site title and description.\n\twp.customize( 'blogname', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( '.site-title a' ).text( to );\n\t\t} );\n\t} );\n\n\twp.customize( 'blogdescription', function( value ) {\n\t\tvalue.bind( function( to ) {\n\t\t\t$( '.site-description' ).text( to );\n\t\t} );\n\t} );\n\n} )( jQuery );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/comments.php",
    "content": "<?php\n/**\n * Template functions used for the site comments.\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_display_comments' ) ) {\n\t/**\n\t * Zues display comments\n\t */\n\tfunction zues_display_comments() {\n\n\t\t/*\n\t\t * Returns a template file for the comments\n\t\t *\n\t\t * Usage:\n\t\t * add_filter( 'zues_comments_template', 'my_callback' );\n\t\t * function my_callback(){\n\t\t *     return '/my-comments.php';\n\t\t * }\n\t\t */\n\t\t$template = apply_filters( 'zues_comments_template', '/comments.php' );\n\n\t\t// If comments are open or we have at least one comment, load up the comment template.\n\t\tif ( comments_open() || '0' !== get_comments_number() ) :\n\t\t    comments_template( $template );\n\t\tendif;\n\t}\n}\n\nif ( ! function_exists( 'zues_comment' ) ) {\n\t/**\n\t * Custom comment output\n\t *\n\t * @param object $comment The comment object.\n\t * @param array  $args Comment display args.\n\t * @param int    $depth Levels of comment depth to be shown.\n\t */\n\tfunction zues_comment( $comment, $args, $depth ) {\n\n\t\t$GLOBALS['comment'] = $comment; ?>\n\n\t<li <?php zues_attr( 'comment' ); ?>>\n\n\t    <article>\n\t        <header class=\"comment-meta\">\n\n\t            <div class=\"comment-author-avatar\">\n\t                <?php echo get_avatar( $comment->comment_author_email, 100 ); ?>\n\t            </div>\n\n\t            <?php printf( __( '<cite %s>%s</cite> - ', 'zues' ), zues_get_attr( 'comment-author' ), get_comment_author_link() ); ?>\n\n\t            <?php\n\t            // Check if author of comment is also author of post.\n\t            zues_bypostauthor( $comment ); ?>\n\n\t            <time <?php zues_attr( 'comment-published' ); ?>>\n\t                <?php printf( esc_html__( '%s ago', 'zues' ), human_time_diff( get_comment_time( 'U' ), current_time( 'timestamp' ) ) ); ?>\n\t            </time>\n\n\t            <?php edit_comment_link( '<i class=\"icon-edit\"></i>', '' ); ?>\n\n\t        </header><!-- .comment-meta -->\n\n\t        <div <?php zues_attr( 'comment-content' ); ?>>\n\t            <?php comment_text(); ?>\n\t        </div><!-- .comment-content -->\n\n\t        <?php comment_reply_link(); ?>\n\n\t        <?php if ( $comment->comment_approved === '0' ) : ?>\n\t            <em class=\"comment-awaiting-moderation\"><?php esc_html_e( 'Your comment is awaiting moderation.', 'zues' ); ?></em>\n\t        <?php endif; ?>\n\t    </article>\n\n\t    <?php\n\t}\n}\n\nif ( ! function_exists( 'zues_bypostauthor' ) ) {\n\t/**\n\t * Check if comment is by the author of the post\n\t */\n\tfunction zues_bypostauthor( $comment ) {\n\n\t\tglobal $post;\n\n\t\t// If current post author is also comment author, make it known visually.\n\t\t$visual = ( $comment->user_id === $post->post_author ? '<span>' . esc_html__( 'Post author', 'zues' ) . '</span>' : '');\n\t\techo $visual;\n\t}\n}\n\nif ( ! function_exists( 'zues_comments_nav' ) ) {\n\t/**\n\t * Output the comment navigation.\n\t *\n\t * Can be overwritten  by adding a file named entry-meta.php to /template-parts in your\n\t * theme or child theme.\n\t */\n\tfunction zues_comments_nav() {\n\n\t\t$priority = array(\n\t\t\t'template-parts/comments-nav.php',\n\t\t\t'zues-framework/structure/template-parts/comments-nav.php',\n\t\t);\n\n\t\tlocate_template( $priority, true );\n\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/filters.php",
    "content": "<?php\n/**\n * Filters used to modify theme output.\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_excerpt_more' ) ) {\n\t/**\n\t * Filter default more text.\n\t *\n\t * @param $string $more Default 'read more link' html.\n\t */\n\tfunction zues_excerpt_more( $more ) {\n\t\tglobal $post;\n\t\treturn '<p><a class=\"moretag\" href=\"'. get_permalink( $post->ID ) . '\">'.__( 'Continue Reading', 'zues' ).'&hellip;</a></p>';\n\t}\n}\nadd_filter( 'excerpt_more', 'zues_excerpt_more' );\n\n\n/**\n * Remove sidebar from full width page template.\n */\nfunction remove_sidebar_from_full_width_template() {\n\n\t// Remove sidebar from just this page-template.\n\tif ( is_page_template( 'page-templates/full-width.php' ) ) {\n\n\t\tremove_action( 'zues_content_sidebar_wrapper', 'zues_sidebar_primary', 20 );\n\n\t}\n\n}\nadd_action( 'zues_content_sidebar_wrapper','remove_sidebar_from_full_width_template' );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/footer.php",
    "content": "<?php\n/**\n * Filters used to modify theme output.\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_load_footer_template' ) ) {\n\n\t/**\n\t * Output the footer widget areas\n\t */\n\tfunction zues_load_footer_template() {\n\n\t\t$priority = array(\n\t\t\t'template-parts/footer.php',\n\t\t\t'zues-framework/structure/template-parts/footer.php',\n\t\t);\n\n\t\tlocate_template( $priority, true );\n\t}\n}\n\nif ( ! function_exists( 'zues_sub_footer' ) ) {\n\t/**\n\t * Output the subfooter\n\t */\n\tfunction zues_sub_footer() {\n\t\techo '<div class=\"sub-footer\">';\n\t\t\techo '<div class=\"wrap\">';\n\t\t\t\techo '<div class=\"sub-footer-inner\">';\n\t\t\t\t\t/**\n\t\t\t\t\t * Sub Footer Hook\n\t\t\t\t\t */\n\t\t\t\t\tdo_action( 'zues_sub_footer' );\n\t\t\t\techo '</div><!-- .sub-footer-inner -->';\n\t\t\techo '</div><!-- .wrap -->';\n\t\techo '</div><!-- .sub-footer -->';\n\t}\n}\n\nif ( ! function_exists( 'zues_footer_attribution' ) ) {\n\t/**\n\t * Output the footer attribution text, this can be overwritten using a filter (zues_footer_attribution).\n\t */\n\tfunction zues_footer_attribution() {\n\n\t\t$footer_attribution = __( 'Powered by the <a href=\"http://olympusthemes.com\">Zues Theme</a>.', 'zues' );\n\n\t\t/*\n\t\t * Returns footer attribution html\n\t\t *\n\t\t * Usage:\n\t\t * add_filter( 'zues_footer_attribution', 'my_callback' );\n\t\t * function my_callback(){\n\t\t *     return '<a href=\"http://mywebsite.com\">My Link</a>';\n\t\t * }\n\t\t */\n\t\t$filtered_footer_attribution = apply_filters( 'zues_footer_attribution', $footer_attribution );\n\n\t\techo '<span class=\"footer-attribution\">'.wp_kses_post( $filtered_footer_attribution ).'</span>';\n\n\t}\n}\n\nif ( ! function_exists( 'zues_footer_copyright' ) ) {\n\t/**\n\t * Output the footer copyright text, this can be overwritten using a filter (zues_footer_copyright).\n\t */\n\tfunction zues_footer_copyright() {\n\n\t\t$text = __( 'Copyright &copy; %1$s <a href=\"%2$s\">%3$s</a> &middot; All Rights Reserved.', 'zues' );\n\n\t\t$date = date( 'Y' );\n\t\t$url = esc_url( home_url() );\n\t\t$name = get_bloginfo( 'name' );\n\n\t\t$footer_copyright = sprintf( $text, $date, $url, $name );\n\n\t\t/*\n\t\t * Returns a footer copyright html\n\t\t *\n\t\t * Usage:\n\t\t * add_filter( 'zues_footer_copyright', 'my_callback' );\n\t\t * function my_callback(){\n\t\t *     return 'Copyright &copy; My Website';\n\t\t * }\n\t\t */\n\t\t$filtered_footer_copyright = apply_filters( 'zues_footer_copyright', $footer_copyright );\n\n\t\techo '<span class=\"footer-copyright\">'.wp_kses_post( $filtered_footer_copyright ).'</span>';\n\n\t}\n}\n\nif ( ! function_exists( 'zues_wpfooter' ) ) {\n\t/**\n\t * Output the wp_footer function, required for plugins.\n\t */\n\tfunction zues_wpfooter() {\n\n\t\twp_footer();\n\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/general.php",
    "content": "<?php\n\nif ( ! function_exists( 'zues_body_open_html' ) ) {\n\t/**\n\t * Output opening body HTML.\n\t */\n\tfunction zues_body_open_html() {\n\n\t\techo '<body '. zues_get_attr( 'body' ) .'>';\n\n\t}\n}\n\nif ( ! function_exists( 'zues_body_close_html' ) ) {\n\t/**\n\t * Output opening body HTML.\n\t */\n\tfunction zues_body_close_html() {\n\n\t\techo '</body>';\n\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/header.php",
    "content": "<?php\n/**\n * Functions used to build .site-header\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_head' ) ) {\n\t/**\n\t * Out put the website head.\n\t */\n\tfunction zues_head() {\n\n\t\t$priority = array(\n\t\t\t'template-parts/head.php',\n\t\t\t'zues-framework/structure/template-parts/head.php',\n\t\t);\n\n\t\tlocate_template( $priority, true );\n\n\t}\n}\n\nif ( ! function_exists( 'zues_load_header_template' ) ) {\n\t/**\n\t * Output the site title.\n\t */\n\tfunction zues_load_header_template() {\n\n\t\t$priority = array(\n\t\t\t'template-parts/header.php',\n\t\t\t'zues-framework/structure/template-parts/header.php',\n\t\t);\n\n\t\tlocate_template( $priority, true );\n\n\t}\n}\n\nif ( ! function_exists( 'zues_text_header' ) ) {\n\t/**\n\t * Output the site title.\n\t */\n\tfunction zues_text_header() {\n\n\t\tzues_site_title();\n\t\techo '<p '. zues_get_attr( 'site-description' ) . '>' . get_bloginfo( 'description' ) . '</p>';\n\t}\n}\n\nif ( ! function_exists( 'zues_image_header' ) ) {\n\t/**\n\t * Output the header image.\n\t */\n\tfunction zues_image_header() {\n\n\t\techo '<a href=\"'. esc_url( home_url( '/' ) ) .'\" rel=\"home\">';\n\t\t\techo '<img src=\"'.get_header_image().'\" width=\"'.esc_attr( get_custom_header()->width ) .'\" height=\"'.  esc_attr( get_custom_header()->height ) .'\" alt=\"\">';\n\t\t\tzues_site_title();\n\t\techo '</a>';\n\t}\n}\n\nif ( ! function_exists( 'zues_site_title' ) ) {\n\t/**\n\t * Check whether a h1 or h2 site title should be shown for SEO purposes.\n\t */\n\tfunction zues_site_title() {\n\n\t\t$home_url = esc_url( home_url( '/' ) );\n\t\t$blog_name = get_bloginfo( 'name' );\n\n\t\t$link = sprintf( '<a href=\"%1$s\">%2$s</a>', $home_url, $blog_name );\n\n\t\tif ( is_home() ) {\n\t\t\techo '<h1 '. zues_get_attr( 'site-title' ) . '>'. $link . '</h1>';\n\t\t} else {\n\t\t\techo '<h2 '. zues_get_attr( 'site-title' ) . '>'. $link . '</h2>';\n\t\t}\n\n\t}\n}\n\nif ( ! function_exists( 'zues_custom_header_setup' ) ) {\n\t/**\n\t * Set up the WordPress core custom header feature.\n\t *\n\t * @uses zues_header_style()\n\t * @uses zues_admin_header_style()\n\t * @uses zues_admin_header_image()\n\t */\n\tfunction zues_custom_header_setup() {\n\t\tadd_theme_support( 'custom-header', apply_filters( 'zues_custom_header_args', array(\n\t\t\t'default-image'          => '',\n\t\t\t'default-text-color'     => '000000',\n\t\t\t'width'                  => 1000,\n\t\t\t'height'                 => 250,\n\t\t\t'flex-height'            => true,\n\t\t\t'wp-head-callback'       => 'zues_header_style',\n\t\t\t'admin-head-callback'    => 'zues_admin_header_style',\n\t\t\t'admin-preview-callback' => 'zues_admin_header_image',\n\t\t) ) );\n\t}\n}\n\nadd_action( 'after_setup_theme', 'zues_custom_header_setup' );\n\nif ( ! function_exists( 'zues_header_style' ) ) {\n\t/**\n\t * Styles the header image and text displayed on the blog\n\t *\n\t * @see zues_custom_header_setup().\n\t */\n\tfunction zues_header_style() {\n\t\t$header_text_color = get_header_textcolor();\n\n\t\t// If no custom options for text are set, let's bail\n\t\t// get_header_textcolor() options: HEADER_TEXTCOLOR is default, hide text (returns 'blank') or any hex value.\n\t\tif ( HEADER_TEXTCOLOR === $header_text_color ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If we get this far, we have custom styles. Let's do this.\n\t\t?>\n\t\t<style type=\"text/css\">\n\t\t<?php\n\t\t// Has the text been hidden?\n\t\tif ( 'blank' === $header_text_color ) :\n\t?>\n\t\t.site-title,\n\t\t.site-description {\n\t\t\tposition: absolute;\n\t\t\tclip: rect(1px, 1px, 1px, 1px);\n\t\t}\n\t<?php\n\t\t// If the user has set a custom color for the text use that.\n\t\telse :\n\t?>\n\t\t.site-title a,\n\t\t.site-description {\n\t\t\tcolor: #<?php echo esc_attr( $header_text_color ); ?>;\n\t\t}\n\t<?php endif; ?>\n\t</style>\n\t<?php\n\t}\n}\n\nif ( ! function_exists( 'zues_admin_header_style' ) ) {\n\t/**\n\t * Styles the header image displayed on the Appearance > Header admin panel.\n\t *\n\t * @see zues_custom_header_setup().\n\t */\n\tfunction zues_admin_header_style() {\n\t?>\n\t<style type=\"text/css\">\n\t\t.appearance_page_custom-header #headimg {\n\t\t\tborder: none;\n\t\t}\n\t\t#headimg h1,\n\t\t#desc {\n\t\t}\n\t\t#headimg h1 {\n\t\t}\n\t\t#headimg h1 a {\n\t\t}\n\t\t#desc {\n\t\t}\n\t\t#headimg img {\n\t\t}\n\t</style>\n\t<?php\n\t}\n}\n\nif ( ! function_exists( 'zues_admin_header_image' ) ) {\n\t/**\n\t * Custom header image markup displayed on the Appearance > Header admin panel.\n\t *\n\t * @see zues_custom_header_setup().\n\t */\n\tfunction zues_admin_header_image() {\n\t?>\n\t<div id=\"headimg\">\n\t\t<h1 class=\"displaying-header-text\">\n\t\t\t<a id=\"name\" style=\"<?php echo esc_attr( 'color: #' . get_header_textcolor() ); ?>\" onclick=\"return false;\" href=\"<?php echo esc_url( home_url( '/' ) ); ?>\"><?php bloginfo( 'name' ); ?></a>\n\t\t</h1>\n\t\t<div class=\"displaying-header-text\" id=\"desc\" style=\"<?php echo esc_attr( 'color: #' . get_header_textcolor() ); ?>\"><?php bloginfo( 'description' ); ?></div>\n\t\t<?php if ( get_header_image() ) : ?>\n\t\t<img src=\"<?php header_image(); ?>\" alt=\"\">\n\t\t<?php endif; ?>\n\t</div><!-- #heading -->\n<?php\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/hooks.php",
    "content": "<?php\n/**\n * Build the layout using the hooks.\n *\n * @package zues\n */\n\n// Body hooks.\nadd_action( 'zues_body_open', 'zues_body_open_html', 10 );\nadd_action( 'zues_body_close', 'zues_body_close_html', 10 );\n\n// Head hooks.\nadd_action( 'zues_header', 'zues_load_header_template', 10 );\nadd_action( 'zues_header_after', 'zues_nav_primary', 10 );\n\n// Content hooks.\nadd_action( 'zues_content_sidebar_wrapper', 'zues_content_area', 10 );\nadd_action( 'zues_content_sidebar_wrapper', 'zues_sidebar_primary', 20 );\n\nadd_action( 'zues_content', 'zues_loop', 10 );\nadd_action( 'zues_content', 'zues_content_paging_nav', 20 );\n\n// Entry Header hooks.\nadd_action( 'zues_entry_header', 'zues_entry_title', 10 );\nadd_action( 'zues_entry_header', 'zues_entry_meta', 15 );\n\n\n// Loop Hooks.\nadd_action( 'zues_loop', 'zues_featured_image', 5 );\nadd_action( 'zues_loop', 'zues_entry_header', 10 );\nadd_action( 'zues_loop', 'zues_content', 20 );\nadd_action( 'zues_loop', 'zues_entry_footer', 30 );\nadd_action( 'zues_loop_after', 'zues_display_comments', 10 );\n add_action( 'zues_loop_after', 'zues_content_nav', 30 );\n\n// Archive Page Hooks.\nadd_action( 'zues_loop_before', 'zues_archive_header', 20 );\n\n// Search Page Hooks.\nadd_action( 'zues_loop_before', 'zues_search_header', 20 );\n\n// Sidebar Hooks.\nadd_action( 'zues_sidebar_primary', 'zues_build_sidebar', 10 );\n\n// Footer Hooks.\nadd_action( 'zues_footer', 'zues_load_footer_template', 10 );\nadd_action( 'zues_footer_after', 'zues_sub_footer', 10 );\nadd_action( 'zues_sub_footer', 'zues_footer_attribution', 15 );\nadd_action( 'zues_sub_footer', 'zues_footer_copyright', 20 );\nadd_action( 'zues_body_close_before', 'zues_wpfooter', 100 );\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/page.php",
    "content": "<?php\n/**\n * Functions used to build the page-*.php templates.\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_archive_header' ) ) {\n\t/**\n\t * Output the header for archive pages.\n\t */\n\tfunction zues_archive_header() {\n\n\t\t$priority = array(\n\t\t\t'template-parts/archive-header.php',\n\t\t\t'zues-framework/structure/template-parts/archive-header.php',\n\t\t);\n\n\t\tlocate_template( $priority, true );\n\n\t}\n}\n\nif ( ! function_exists( 'zues_search_header' ) ) {\n\t/**\n\t * Output the header for search pages.\n\t */\n\tfunction zues_search_header() {\n\n\t\t$priority = array(\n\t\t\t'template-parts/search-header.php',\n\t\t\t'zues-framework/structure/template-parts/search-header.php',\n\t\t);\n\n\t\tlocate_template( $priority, true );\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/post.php",
    "content": "<?php\n/**\n * Filters used to modify theme output.\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_content_area' ) ) {\n\t/**\n\t * Load the relevant page template (uses WordPress hierarchy).\n\t */\n\tfunction zues_content_area() {\n\n\t\t/**\n\t\t * Fires before the content (outside the loop)\n\t\t */\n\t\tdo_action( 'zues_content_before' );\n\n\t\techo '<main '. zues_get_attr( 'content' ).' >';\n\n\t\t\t/**\n\t\t\t * Content area hook\n\t\t\t *\n\t\t\t * @hooked zues_loop - 20\n\t\t\t */\n\t\t\tdo_action( 'zues_content' );\n\n\t\techo '</main><!-- .content -->';\n\n\t\t/**\n\t\t * Fires after the content (outside the loop)\n\t\t */\n\t\tdo_action( 'zues_content_after' );\n\n\t}\n}\n\nif ( ! function_exists( 'zues_loop' ) ) {\n\t/**\n\t * The standard Wordpress loop.\n\t */\n\tfunction zues_loop() {\n\n\t\tif ( have_posts() ) : while ( have_posts() ) : the_post();\n\n\t\t\t/**\n\t\t\t * Fires before the loop (within WordPress' loop)\n\t\t\t */\n\t\t\tdo_action( 'zues_loop_before' );\n\n\t\t\techo '<article ' . zues_get_attr( 'post' ) . '>'; // WPCS: XSS OK.\n\n\t\t\t\t/**\n\t\t\t\t * Loop hook\n\t\t\t\t *\n\t\t\t\t * @hooked zues_featured_image - 5\n\t\t\t\t * @hooked zues_content_header - 10\n\t\t\t\t * @hooked zues_content_meta - 15\n\t\t\t\t * @hooked zues_post_excerpt - 20\n\t\t\t\t * @hooked zues_content_paging_nav - 25\n\t\t\t\t * @hooked zues_content_footer - 25\n\t\t\t\t */\n\t\t\t\tdo_action( 'zues_loop' );\n\n\t\t\techo '</article><!-- .post-'.get_the_ID().' -->';\n\n\t\t\t/**\n\t\t\t * Fires after the loop (within WordPress' loop)\n\t\t\t */\n\t\t\tdo_action( 'zues_loop_after' );\n\n\t\tendwhile; else :\n\n\t\t\tzues_no_content();\n\n\t\t endif;\n\n\t}\n}\n\nif ( ! function_exists( 'zues_no_content' ) ) {\n\t/**\n\t * Displayed when no posts are found.\n\t */\n\tfunction zues_no_content() {\n\n\t\t$priority = array(\n\t\t\t'template-parts/content-none.php',\n\t\t\t'zues-framework/structure/template-parts/content-none.php',\n\t\t);\n\n\t\tlocate_template( $priority, true );\n\n\t}\n}\n\n\nif ( ! function_exists( 'zues_entry_header' ) ) {\n\t/**\n\t * Display the post header, with a link to the single post where required.\n\t */\n\tfunction zues_entry_header() {\n\n\t\t/**\n\t\t * Fires before the entry header\n\t\t */\n\t\tdo_action( 'zues_entry_header_before' );\n\n\t\techo '<header class=\"entry-header\">';\n\n\t\t\t/**\n\t\t\t * Entry header hook\n\t\t\t */\n\t\t\tdo_action( 'zues_entry_header' );\n\n\t\techo '</header><!-- .entry-header -->';\n\n\t\t/**\n\t\t * Fires after the entry header\n\t\t */\n\t\tdo_action( 'zues_entry_header_before' );\n\t}\n}\n\nif ( ! function_exists( 'zues_entry_title' ) ) {\n\t/**\n\t * Ouput the entry title.\n\t */\n\tfunction zues_entry_title() {\n\n\t\tif ( is_singular() ) {\n\t\t\tthe_title( '<h1 '.zues_get_attr( 'entry-title' ).'>', '</h1>' );\n\t\t} else {\n\t\t\tthe_title( sprintf( '<h2 %s><a href=\"%s\" rel=\"bookmark\">', zues_get_attr( 'entry-title' ), esc_url( get_permalink() ) ), '</a></h2>' );\n\t\t}\n\t}\n}\n\nif ( ! function_exists( 'zues_content' ) ) {\n\t/**\n\t * Ouput the post content.\n\t */\n\tfunction zues_content() {\n\n\t\techo '<div '.zues_get_attr( 'entry-content' ).'>'; // WPCS: XSS OK.\n\n\t\tthe_content(\n\t\t\tsprintf(\n\t\t\t\t__( 'Continue reading %s', 'zues' ),\n\t\t\t\t'<span class=\"screen-reader-text\">' . get_the_title() . '</span>'\n\t\t\t)\n\t\t);\n\t\twp_link_pages(\n\t\t\tarray(\n\t\t\t'before' => '<div class=\"page-links\">' . __( 'Pages:', 'zues' ),\n\t\t\t'after'  => '</div>',\n\t\t\t)\n\t\t);\n\n\t\techo '</div><!-- .entry-content -->';\n\n\t}\n}\n\nif ( ! function_exists( 'zues_content_excerpt' ) ) {\n\t/**\n\t * Output an excerpt of the post content.\n\t */\n\tfunction zues_content_excerpt() {\n\n\t\techo '<div '.zues_get_attr( 'entry-summary' ).'>'; // WPCS: XSS OK.\n\n\t\tthe_excerpt();\n\n\t\twp_link_pages(\n\t\t\tarray(\n\t\t\t'before' => '<div class=\"page-links\">' . __( 'Pages:', 'zues' ),\n\t\t\t'after'  => '</div>',\n\t\t\t)\n\t\t);\n\n\t\techo '</div><!-- .entry-summary -->';\n\n\t}\n}\n\nif ( ! function_exists( 'zues_entry_meta' ) ) {\n\t/**\n\t * Output the post info. Publish Date, Author and Comments link.\n\t *\n\t * Can be overwritten  by adding a file named entry-meta.php to /template-parts in your\n\t * theme or child theme.\n\t */\n\tfunction zues_entry_meta() {\n\n\t\tif ( is_page() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$posted_by = sprintf(\n\t\t\tesc_html_x( 'by %s', 'post author', 'zues' ),\n\t\t\t'<a class=\"url fn n\" href=\"' . esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ) . '\">' . esc_html( get_the_author() ) . '</a>'\n\t\t);\n\n\t\t$posted_on = sprintf(\n\t\t\tesc_html_x( 'Posted on %s | ', 'post date', 'zues' ),\n\t\t\t'<a href=\"' . esc_url( get_permalink() ) . '\" rel=\"bookmark\">' . get_the_date() . '</a>'\n\t\t);\n\n\t\t?>\n\n\t\t<div class=\"entry-meta\">\n\t\t\t<span <?php zues_attr( 'entry-author' ); ?>>\n\t\t\t\t<?php echo $posted_by; // WPCS: XSS OK. ?>\n\t\t\t</span><!-- .entry-author -->\n\t\t\t|\n\t\t\t<time <?php zues_attr( 'entry-published' ); ?>>\n\t\t\t\t<?php echo $posted_on; // WPCS: XSS OK. ?>\n\t\t\t</time><!-- .entry-published -->\n\n\t\t\t<?php comments_popup_link( esc_html__( 'Leave a comment', 'zues' ), esc_html__( '1 Comment', 'zues' ), esc_html__( '% Comments', 'zues' ) ); ?>\n\t\t</div><!-- .entry-meta -->\n\t<?php\n\n\t}\n}\n\nif ( ! function_exists( 'zues_content_paging_nav' ) ) {\n\t/**\n\t * Output the links to the previous/next page for paginated posts.\n\t */\n\tfunction zues_content_paging_nav() {\n\n\t\tglobal $wp_query;\n\n\t\tif ( is_single() ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$args = array(\n\t\t\t'type'         => 'list',\n\t\t\t'next_text' => _x( 'Next', 'Next post', 'zues' ) . ' &rarr;',\n\t\t\t'prev_text' => '&larr; ' . _x( 'Previous', 'Previous post', 'zues' ),\n\t\t);\n\n\t\tthe_posts_pagination( $args );\n\t}\n}\n\nif ( ! function_exists( 'zues_content_nav' ) ) {\n\t/**\n\t * Output the links to the previous/next posts.\n\t */\n\tfunction zues_content_nav() {\n\n\t\tif ( ! is_single( ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$args = array(\n\t\t'next_text' => '<span class=\"meta-nav\">Previous:</span> %title',\n\t\t'prev_text' => '<span class=\"meta-nav\">Next:</span> %title',\n\t\t);\n\t\tthe_post_navigation( $args );\n\t}\n}\n\nif ( ! function_exists( 'zues_entry_footer' ) ) {\n\t/**\n\t * Output the posts tags and categories.\n\t */\n\tfunction zues_entry_footer() {\n\n\t\t/* Hide category and tag text for pages on Search. */\n\t\tif ( 'post' === get_post_type() ) :\n\n\t\t\techo '<footer class=\"entry-footer\">';\n\n\t\t\t/* translators: used between list items, there is a space after the comma */\n\t\t\t$categories_list = get_the_category_list( __( ', ', 'zues' ) );\n\n\t\t\tif ( $categories_list && zues_categorized_blog() ) : ?>\n\n\t\t\t\t <span class=\"cat-links\">\n\t\t\t\t\t<?php\n\t\t\t\t\techo esc_html__( 'Categories: ', 'zues' );\n\t\t\t\t\techo wp_kses_post( $categories_list );\n\t\t\t\t\t?>\n\t\t\t\t</span><!-- .cat-links -->\n\n\t\t\t<?php endif;\n\n\t\t\t/* translators: used between list items, there is a space after the comma */\n\t\t\t$tags_list = get_the_tag_list( '', __( ', ', 'zues' ) );\n\n\t\t\tif ( $tags_list ) : ?>\n\n\t\t\t\t <span class=\"tag-links\">\n\n\t\t\t\t\t<?php\n\t\t\t\t\techo esc_html__( 'Tags: ', 'zues' );\n\t\t\t\t\techo wp_kses_post( $tags_list );\n\t\t\t\t\t?>\n\n\t\t\t\t</span><!-- .tag-links -->\n\n\t\t\t<?php endif; // End if $tags_list.\n\n\t\t\techo '</footer><!-- .entry-footer -->';\n\n\tendif; // End if 'post' == get_post_type().\n\n\t}\n}\n\nif ( ! function_exists( 'zues_categorized_blog' ) ) {\n\t/**\n\t * Check if blog has multiple categories.\n\t */\n\tfunction zues_categorized_blog() {\n\n\t\tif ( false === ( $all_the_cool_cats = get_transient( '_s_categories' ) ) ) {\n\n\t\t\t// Create an array of all the categories that are attached to posts.\n\t\t\t$all_the_cool_cats = get_categories(\n\t\t\t\tarray(\n\t\t\t\t'fields'     => 'ids',\n\t\t\t\t'hide_empty' => 1,\n\t\t\t\t// We only need to know if there is more than one category.\n\t\t\t\t'number'     => 2,\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// Count the number of categories that are attached to the posts.\n\t\t\t$all_the_cool_cats = count( $all_the_cool_cats );\n\t\t\tset_transient( '_s_categories', $all_the_cool_cats );\n\t\t}\n\n\t\tif ( $all_the_cool_cats > 1 ) {\n\t\t\t// This blog has more than 1 category so zues_categorized_blog should return true.\n\t\t\treturn true;\n\t\t} else {\n\t\t\t// This blog has only 1 category so zues_categorized_blog should return false.\n\t\t\treturn false;\n\t\t}\n\n\t}\n}\n\nif ( ! function_exists( 'zues_featured_image' ) ) {\n\t/**\n\t * Output featured image if one is set.\n\t */\n\tfunction zues_featured_image() {\n\n\t\tif ( ! has_post_thumbnail() ) {\n\t\t\treturn;\n\t\t}\n\n\t\techo '<div class=\"entry-thumbnail\">';\n\t\t\tthe_post_thumbnail( 'zues-blog-post' );\n\t\techo '</div><!-- .entry-thumbnail -->';\n\n\t}\n}\n\nif ( ! function_exists( 'zues_comments_link' ) ) {\n\t/**\n\t * Output comments link.\n\t */\n\tfunction zues_comments_link() {\n\n\t\tif ( ! comments_open() ) {\n\n\t\t\techo '<span class=\"\">Comments Closed</span>';\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! post_password_required() && ( comments_open() || get_comments_number() ) ) { ?>\n         <span class=\"comments-link\"><?php comments_popup_link( __( 'Leave a comment', 'zues' ), __( '1 Comment', 'zues' ), __( '% Comments', 'zues' ) ); ?></span><!-- .comments-link -->\n        <?php }\n\t}\n}\n\nif ( ! function_exists( 'zues_content_navigation' ) ) {\n\t/**\n\t * Output links to older/newer posts, for archive pages.\n\t */\n\tfunction zues_content_navigation() {\n\n\t\t$args = array(\n\t\t\t'prev_text'          => __( '&laquo; Older posts', 'zues' ),\n\t\t\t'next_text'          => __( 'Newer posts &raquo;', 'zues' ),\n\t\t);\n\n\t\techo get_the_posts_navigation( $args ); // WPCS: XSS OK.\n\t}\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/primary-nav.php",
    "content": "<?php\n/**\n * Outputs the primary navigation.\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_nav_primary' ) ) {\n\t/**\n\t * Outputs primary navigation.\n\t */\n\tfunction zues_nav_primary() {\n\n\t\t$priority = array(\n\t\t\t'template-parts/primary-nav.php',\n\t\t\t'zues-framework/structure/template-parts/primary-nav.php',\n\t\t);\n\n\t\tlocate_template( $priority, true );\n\n\t}\n}\n\n/**\n * Function for grabbing a WP nav menu theme location name.\n *\n * @since  2.0.0\n * @access public\n * @param  string $location\n * @return string\n */\nfunction zues_get_menu_location_name( $location ) {\n\t$locations = get_registered_nav_menus();\n\treturn isset( $locations[ $location ] ) ? $locations[ $location ] : '';\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/sidebar.php",
    "content": "<?php\n/**\n * Filters used to modify theme output.\n *\n * @package zues\n */\n\nif ( ! function_exists( 'zues_sidebar_primary' ) ) {\n\t/**\n\t * Output the primary sidebar and hooks.\n\t */\n\tfunction zues_sidebar_primary() {\n\n\t\techo '<aside '. zues_get_attr( 'sidebar', 'primary' ) . '\">';\n\n\t\t\t/**\n\t\t\t * Fires before the sidebar\n\t\t\t */\n\t\t\tdo_action( 'zues_sidebar_primary_before' );\n\n\t\t\t/**\n\t\t\t * Primary Sidebar Hook\n\t\t\t */\n\t\t\tdo_action( 'zues_sidebar_primary' );\n\n\t\t\t/**\n\t\t\t * Fires after the sidebar\n\t\t\t */\n\t\t\tdo_action( 'zues_sidebar_primary_after' );\n\n\t\techo '</aside><!-- .sidebar-primary -->';\n\n\t}\n}\n\nif ( ! function_exists( 'zues_build_sidebar' ) ) {\n\t/**\n\t * Output the primary sidebar.\n\t */\n\tfunction zues_build_sidebar() {\n\n\t\techo '<div class=\"sidebar-primary-inner\">';\n\t\t\tdynamic_sidebar( 'primary-sidebar' );\n\t\techo '</div><!-- .sidebar-primary-inner -->';\n\n\t}\n}\n\n\n/**\n * Function for grabbing a dynamic sidebar name.\n *\n * @since  2.0.0\n * @access public\n * @global array   $wp_registered_sidebars\n * @param  string $sidebar_id\n * @return string\n */\nfunction zues_get_sidebar_name( $sidebar_id ) {\n\tglobal $wp_registered_sidebars;\n\treturn isset( $wp_registered_sidebars[ $sidebar_id ] ) ? $wp_registered_sidebars[ $sidebar_id ]['name'] : '';\n}\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/archive-header.php",
    "content": "<?php\n/**\n * The template for displaying the archive header\n *\n * This can be overwitten by adding a file named archive-header.php to /template-parts\n *\n * @package zues\n */\n\nif ( ! is_archive() ) {\n\treturn;\n}\n\n?>\n\n<header <?php zues_attr( 'archive-header' ) ?>>\n\t<h1 <?php zues_attr( 'archive-title' ) ?>>\n\t\t<?php the_archive_title(); ?>\n\t</h1>\n\n\t<div <?php zues_attr( 'archive-description' ) ?>>\n\t\t<?php echo get_the_archive_description(); ?>\n\t</div><!-- .archive-description -->\n</header><!-- .archive-header -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/comment.php",
    "content": "<?php\n/**\n * Template used for the site comments.\n *\n * @package zues\n */\n?>\n\n<?php $GLOBALS['comment'] = $comment; ?>\n\n<li <?php zues_attr( 'comment' ); ?>>\n\n    <article>\n        <header class=\"comment-meta\">\n\n            <div class=\"comment-author-avatar\">\n                <?php echo get_avatar( $comment->comment_author_email, 100 ); ?>\n            </div><!-- .comment-author-avatar -->\n\n            <?php printf( __( '<cite %s>%s</cite>', 'zues' ), zues_get_attr( 'comment-author' ), get_comment_author_link() ); ?>\n\n            <?php\n\t\t\t// Check if author of comment is also author of post.\n\t\t\tzues_bypostauthor( $comment ); ?>\n\n            <time <?php zues_attr( 'comment-published' ); ?>>\n                <?php printf( esc_html__( '%s ago', 'zues' ), human_time_diff( get_comment_time( 'U' ), current_time( 'timestamp' ) ) ); ?>\n            </time>\n\n            <?php edit_comment_link( '<i class=\"icon-edit\"></i>', '' ); ?>\n\n        </header><!-- .comment-meta -->\n\n        <div <?php zues_attr( 'comment-content' ); ?>>\n            <?php comment_text(); ?>\n        </div><!-- .comment-content -->\n\n        <?php comment_reply_link(); ?>\n\n        <?php if ( $comment->comment_approved === '0' ) : ?>\n            <em class=\"comment-awaiting-moderation\"><?php esc_html_e( 'Your comment is awaiting moderation.', 'zues' ); ?></em>\n        <?php endif; ?>\n    </article>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/comments-nav.php",
    "content": "<?php\n/**\n * Template used for the comment navigation.\n *\n * @package zues\n */\n?>\n\n<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?>\n\n\t<nav id=\"comment-nav-above\" class=\"navigation comment-navigation\">\n\n\t\t<h2 class=\"screen-reader-text\"><?php esc_html_e( 'Comment navigation', 'zues' ); ?></h2>\n\n\t\t<div class=\"nav-links nav-links-comments clear\">\n\n\t\t\t<div class=\"nav-previous\">\n\t\t\t\t<?php previous_comments_link( esc_html__( '&larr; Older Comments', 'zues' ) ); ?>\n\t\t\t</div><!-- .nav-previous -->\n\n\t\t\t<div class=\"nav-next\">\n\t\t\t\t<?php next_comments_link( esc_html__( 'Newer Comments &rarr;', 'zues' ) ); ?>\n\t\t\t</div><!-- .nav-next -->\n\n\t\t</div><!-- .nav-links -->\n\n\t</nav><!-- #comment-nav-above -->\n\n<?php endif; // Check for comment navigation. ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/content-none.php",
    "content": "<?php\n/**\n * The template part for displaying a message that posts cannot be found.\n *\n * Learn more: http://codex.wordpress.org/Template_Hierarchy\n *\n * @package zues\n */\n\n/**\n * Fires before the 'no content' content\n */\ndo_action( 'zues_no_content_before' ); ?>\n\n<section class=\"no-results not-found\">\n\t<header class=\"entry-header\">\n\t\t<h1 class=\"entry-title\"><?php esc_html_e( 'Nothing Found', 'zues' ); ?></h1>\n\t</header><!-- .page-header -->\n\n\n    <?php if ( is_home() && current_user_can( 'publish_posts' ) ) : ?>\n\n\t\t<p><?php printf( wp_kses( __( 'Ready to publish your first post? <a href=\"%1$s\">Get started here</a>.', 'zues' ), array( 'a' => array( 'href' => array() ) ) ), esc_url( admin_url( 'post-new.php' ) ) ); ?></p>\n\n    <?php elseif ( is_search() ) : ?>\n\n\t\t<p><?php esc_html_e( 'Sorry, but nothing matched your search terms. Please try again with some different keywords.', 'zues' ); ?></p>\n\t\t<?php get_search_form(); ?>\n\n    <?php else : ?>\n\n\t\t<p><?php esc_html_e( 'It seems we can&rsquo;t find what you&rsquo;re looking for. Perhaps searching can help.', 'zues' ); ?></p>\n\t\t<?php get_search_form(); ?>\n\n    <?php endif; ?>\n\n</section><!-- .no-results -->\n\n<?php\n\n/**\n * Fires after the 'no content' content\n */\ndo_action( 'zues_no_content_after' ); ?>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/footer.php",
    "content": "<?php\n/**\n * The template for displaying the footer.\n *\n * @package zues\n */\n\nif ( ! is_active_sidebar( 'footer-1' )\n\t&& ! is_active_sidebar( 'footer-2' )\n\t&& ! is_active_sidebar( 'footer-3' )\n\t&& ! is_active_sidebar( 'footer-4' ) ) {\n\treturn;\n} ?>\n\n <div class=\"footer-widgets\">\n\t\t<?php zues_widget_area( 'footer-1' ); ?>\n\t\t<?php zues_widget_area( 'footer-2' ); ?>\n\t\t<?php zues_widget_area( 'footer-3' ); ?>\n\t\t<?php zues_widget_area( 'footer-4' ); ?>\n </div><!-- .footer-widgets -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/head.php",
    "content": "<?php\n/**\n * Standard WordPress <head>.\n *\n * @package zues\n */\n ?>\n\n<!DOCTYPE html>\n<html <?php echo get_language_attributes(); ?>>\n<head>\n<meta charset=\"<?php echo get_bloginfo( 'charset' ); ?>\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"profile\" href=\"http://gmpg.org/xfn/11\">\n<link rel=\"pingback\" href=\"<?php echo get_bloginfo( 'pingback_url' ) ?>\">\n\n<?php\n\n/**\n * Fires before wp_head\n */\n do_action( 'zues_head' );\n\n wp_head();\n\n ?>\n\n</head>\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/header.php",
    "content": "<?php\n/**\n * Template used for the site heaader.\n *\n * @package zues\n */\n\necho '<div ' . zues_get_attr( 'branding' ) . '>';\n\n\tif ( get_header_image() ) {\n\t\tzues_image_header();\n\t} else {\n\t\tzues_text_header();\n\t}\n\necho '</div><!-- .site-branding -->';\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/primary-nav.php",
    "content": "<?php\n/**\n * Outputs the primary navigation.\n *\n * @package zues\n */\n\n\n\techo '<nav '. zues_get_attr( 'menu', 'primary' ) .'\">';\n\n\t\t/**\n\t\t* Fires before the primary navigation\n\t\t*/\n\t\tdo_action( 'zues_primary_nav_before' );\n\n\t\techo '<div class=\"wrap\">';\n\t\t\twp_nav_menu(\n\t\t\tarray(\n\t\t\t\t'theme_location' => 'primary',\n\t\t\t\t'container' => false,\n\t\t\t\t)\n\t\t);\n\t\techo '</div>';\n\n\n\t\t/**\n\t\t * Fires after the primary navigation\n\t\t */\n\t\t do_action( 'zues_primary_nav_after' );\n\n\techo '</nav><!-- .menu-primary -->';\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/template-parts/search-header.php",
    "content": "<?php\n/**\n * Header for search results pages.\n *\n * @package zues\n */\n\nif ( ! is_search() ) {\n\treturn;\n} ?>\n\n<header <?php zues_attr( 'archive-header' ) ?>>\n\t<h1 <?php zues_attr( 'archive-title' ) ?>>\n\t\t<?php printf( esc_html__( 'Search Results for: %s', 'zues' ), '<span>' . get_search_query() . '</span>' ); ?>\n\t</h1>\n</header><!-- .archive-header -->\n"
  },
  {
    "path": "Docker/security/apparmor/wordpress/zues/zues-framework/structure/wrapper.php",
    "content": "<?php\n/**\n * The wrapper used to build all front-facing pages.\n *\n * @package zues\n */\n\nfunction zues() {\n\n\tzues_head();\n\n\t/**\n\t * Fires before the <body> tag\n\t */\n\t do_action( 'zues_body_open_before' );\n\n\t /**\n \t * The opening <body> tag.\n \t *\n \t * @hooked zues_body_open_html - 10\n \t */\n\t do_action( 'zues_body_open' );\n\n\t/**\n\t * Fires after the <body> tag before the site header\n\t */\n\tdo_action( 'zues_body_open_after' );\n\n\techo '<div class=\"site-wrapper\">';\n\n\t/**\n\t * Fires before the site-header\n\t */\n\tdo_action( 'zues_header_before' );\n\n\techo '<header '. zues_get_attr( 'header' ) .'\">';\n\n\t\tdo_action( 'zues_header_wrapper_before' );\n\n\n\t\techo '<div class=\"wrap\">';\n\n\t/**\n\t * Zues site-header hook\n\t *\n\t * @hooked zues_load_header_template - 10\n\t */\n\tdo_action( 'zues_header' );\n\n\techo '</div><!-- .wrap -->';\n\n\tdo_action( 'zues_header_wrapper_after' );\n\n\n\techo '</header><!-- .site-header -->';\n\t/**\n\t * Fires after the site-header\n\t *\n\t * @hooked zues_nav_primary - 10\n\t */\n\tdo_action( 'zues_header_after' );\n\n\tdo_action( 'zues_content_before' );\n\n\n\n\t\t\techo '<div class=\"site-content\">';\n\n\n\t\t\t\t/**\n\t\t\t\t * Fires before the site-content (content + sidebar)\n\t\t\t\t */\n\t\t\t\tdo_action( 'zues_content_sidebar_wrapper_before' );\n\t\t\t\techo '<div class=\"wrap\">';\n\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Content + Sidebar Hook\n\t\t\t\t\t */\n\t\t\t\t\t do_action( 'zues_content_sidebar_wrapper' );\n\n\t\t\t\techo '</div><!-- .wrap -->';\n\n\t\t\t\t/**\n\t\t\t\t * Fires after the site-content wrapper\n\t\t\t\t */\n\t\t\t\tdo_action( 'zues_content_sidebar_wrapper_after' );\n\n\t\t\techo '</div><!-- .site-content -->';\n\n\t\t\t do_action( 'zues_content_after' );\n\n\t\t\tdo_action( 'zues_footer_before' );\n\n\t\techo '<footer ' . zues_get_attr( 'footer' ) .'>';\n\n\t\t\t/**\n\t\t\t * Fires before the footer wrap\n\t\t\t */\n\t\t\tdo_action( 'zues_footer_wrapper_before' );\n\n\t\t\techo '<div class=\"wrap\">';\n\n\t\t\t\t/**\n\t\t\t\t * Zues footer hook\n\t\t\t\t *\n\t\t\t\t * @hooked zues_load_footer_template - 10\n\t\t\t\t */\n\t\t\t\tdo_action( 'zues_footer' );\n\n\t\t\techo '</div><!-- .wrap -->';\n\n\t\t\t/**\n\t\t\t * Fires after the footer wrap\n\t\t\t */\n\t\t\tdo_action( 'zues_footer_wrapper_after' );\n\n\t\techo '</footer><!-- .site-footer -->';\n\n\t\tdo_action( 'zues_footer_after' );\n\n\t\techo '</div><!-- .site-wrapper -->';\n\n\t/**\n\t * Fires before the closing </body> tag\n\t */\n\t do_action( 'zues_body_close_before' );\n\n\t /**\n \t * The closing </body> tag.\n \t *\n \t * @hooked zues_body_close_html - 10\n \t */\n\t do_action( 'zues_body_close' );\n\n\t/**\n\t * Fires after the closing </body> tag\n\t */\n\t do_action( 'zues_body_close_after' );\n\n\techo '</html>';\n\n}\n"
  },
  {
    "path": "Docker/security/capabilities/README.md",
    "content": "# Lab: Capabilities\n\n> **Difficulty**: Advanced\n\n> **Time**: Approximately 30 minutes\n\nIn this lab you'll learn the basics of capabilities in the Linux kernel. You'll learn how they work with Docker, some basic commands to view and manage them, as well as how to add and remove capabilities in new containers.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Introduction to capabilities](#cap_intro)\n- [Step 2 - Working with Docker and capabilities](#docker_cap)\n- [Step 3 - Testing Docker capabilities](#test_docker)\n- [Step 4 - Extra for experts](#extra)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker Host running Docker 1.13 or higher\n\n# <a name=\"cap_intro\"></a>Step 1: Introduction to capabilities\n\nIn this step you'll learn the basics of capabilities.\n\nThe Linux kernel is able to break down the privileges of the `root` user into distinct units referred to as **capabilities**. For example, the CAP_CHOWN capability is what allows the root use to make arbitrary changes to file UIDs and GIDs. The CAP_DAC_OVERRIDE capability allows the root user to bypass kernel permission checks on file read, write and execute operations. Almost all of the special powers associated with the Linux root user are broken down into individual capabilities.\n\nThis breaking down of root privileges into granular capabilities allows you to:\n\n1. Remove individual capabilities from the `root` user account, making it less powerful/dangerous.\n2. Add privileges to non-root users at a very granular level.\n\nCapabilities apply to both files and threads. File capabilities allow users to execute programs with higher privileges. This is similar to the way the `setuid` bit works. Thread capabilities keep track of the current state of capabilities in running programs.\n\nThe Linux kernel lets you set capability *bounding sets* that impose limits on the capabilities that a file/thread can gain.\n\nDocker imposes certain limitations that make working with capabilities much simpler. For example, file capabilities are stored within a file's extended attributes, and extended attributes are stripped out when Docker images are built. This means you will not normally have to concern yourself too much with file capabilities in containers.\n\n> It is of course possible to get file capabilities into containers at runtime, however this is not recommended.\n\nIn an environment without file based capabilities, it's not possible for applications to escalate their privileges beyond the *bounding set* (a set beyond which capabilities cannot grow). Docker sets the *bounding set* before starting a container. You can use Docker commands to add or remove capabilities to or from the *bounding set*.\n\nBy default, Docker drops all capabilities except [those needed](https://github.com/moby/moby/blob/master/oci/defaults_linux.go#L64-L79), using a whitelist approach.\n\n# <a name=\"docker_cap\"></a>Step 2: Working with Docker and capabilities\n\nIn this step you'll learn the basic approach to managing capabilities with Docker. You'll also learn the Docker commands used to manage capabilities for a container's root account.\n\nAs of Docker 1.12 you have 3 high level options for using capabilities:\n\n1. Run containers as root with a large set of capabilities and try to manage capabilities within your container manually.\n2. Run containers as root with limited capabilities and never change them within a container.\n3. Run containers as an unprivileged user with no capabilities.\n\nOption 2 as the most realistic as of Docker 1.12. Option 3 would be ideal but not realistic. Option 1 should be avoided wherever possible.\n\n> **Note:** Another option may be added in future versions of Docker that will allow you to run containers as a non-root user with added capabilities. The correct way of doing this requires *ambient capabilities* which was added to the Linux kernel in version 4.3. Whether it is possible for Docker to approximate this behavior in older kernels requires more research.\n\nIn the following commands, `$CAP` will be used to indicate one or more individual capabilities.\n\n1. To drop capabilities from the `root` account of a container.\n\n   ```\n   $sudo docker run --rm -it --cap-drop $CAP alpine sh\n   ```\n\n2. To add capabilities to the `root` account of a container.\n\n   ```\n   $ sudo docker run --rm -it --cap-add $CAP alpine sh\n   ```\n\n3. To drop all capabilities and then explicitly add individual capabilities to the `root` account of a container.\n\n   ```\n   $ sudo docker run --rm -it --cap-drop ALL --cap-add $CAP alpine sh\n   ```\n\nThe Linux kernel prefixes all capability constants with \"CAP_\". For example, CAP_CHOWN, CAP_NET_ADMIN, CAP_SETUID, CAP\\_SYSADMIN etc. Docker capability constants are not prefixed with \"CAP_\" but otherwise match the kernel's constants.\n\nFor more information on capabilities, including a full list, see the [capabilities man page](http://man7.org/linux/man-pages/man7/capabilities.7.html)\n\n# <a name=\"test_docker\"></a>Step 3: Testing Docker capabilities\n\nIn this step you will start various new containers. Each time you will use the commands learned in the previous step to tweak the capabilities associated with the account used to run the container.\n\n1. Start a new container and prove that the container's root account can change the ownership of files.\n\n   ```\n   $ docker container run --rm -it alpine chown nobody /\n   ```\n\n   The command gives no return code indicating that the operation succeeded. The command works because the default behavior is for new containers to be started with a root user. This root user has the CAP_CHOWN capability by default.\n\n2. Start another new container and drop all capabilities for the containers root account other than the CAP\\_CHOWN capability. Remember that Docker does not use the \"CAP_\" prefix when addressing capability constants.\n\n   ```\n   $ docker container run --rm -it --cap-drop ALL --cap-add CHOWN alpine chown nobody /\n   ```\n\n   This command also gives no return code, indicating a successful run. The operation succeeds because although you dropped all capabilities for the container's `root` account, you added the `chown` capability back. The `chown` capability is all that is needed to change the ownership of a file.\n\n3. Start another new container and drop only the `CHOWN` capability form its root account.\n\n   ```\n   $ docker container run --rm -it --cap-drop CHOWN alpine chown nobody /\n   chown: /: Operation not permitted\n   ```\n\n   This time the command returns an error code indicating it failed. This is because the container's root account does not have the `CHOWN` capability and therefore cannot change the ownership of a file or directory.\n\n4. Create another new container and try adding the `CHOWN` capability to the non-root user called `nobody`. As part of the same command try and change the ownership of a file or folder.\n\n   ```\n   $ docker container run --rm -it --cap-add chown -u nobody alpine chown nobody /\n   chown: /: Operation not permitted\n   ```\n\n   The above command fails because Docker does not yet support adding capabilities to non-root users.\n\nIn this step you have added and removed capabilities to a range of new containers. You have seen that capabilities can be added and removed from the root user of a container at a very granular level. You also learned that Docker does not currently support adding capabilities to non-root users.\n\n# <a name=\"extra\"></a>Step 4: Extra for experts\n\nThe remainder of this lab will show you additional tools for working with capabilities form the Linux shell.\n\nThere are two main sets of tools for managing capabilities:\n- **libcap** focuses on manipulating capabilities.\n- **libcap-ng** has some useful tools for auditing.\n\nBelow are some useful commands from both.\n\n> You may need to manually install the packages required for some of these commands.`sudo apt-get install libcap-dev`, `sudo apt-get install libcap-ng-dev`, `sudo apt-get install libcap-ng-utils`.\n\n## **libcap**\n\n* `capsh` - lets you perform capability testing and limited debugging\n* `setcap` - set capability bits on a file\n* `getcap` - get the capability bits from a file\n\n## **libcap-ng**\n\n* `pscap` - list the capabilities of running processes\n* `filecap` - list the capabilities of files\n* `captest` - test capabilities as well as list capabilities for current process\n\nThe remainder of this step will show you some examples of `libcap` and `libcap-ng`.\n\n### Listing all capabilities\n\nThe following command will start a new container using Alpine Linux, install the `libcap` package and then list capabilities.\n\n   ```\n   $ docker container run --rm -it alpine sh -c 'apk add -U libcap; capsh --print'\n\n   (1/1) Installing libcap (2.25-r0)\n   Executing busybox-1.24.2-r9.trigger\n   OK: 5 MiB in 12 packages\n   Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eip\n   Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap\n   Securebits: 00/0x0/1'b0\n    secure-noroot: no (unlocked)\n    secure-no-suid-fixup: no (unlocked)\n    secure-keep-caps: no (unlocked)\n   uid=0(root)\n   gid=0(root)\n   groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)\n   ```\n\nIn the output above, **Current** is multiple sets separated by spaces. Multiple capabilities within the same *set* are separated by commas `,`. The letters following the `+` at the end of each set are as follows:\n- `e` is effective\n- `i` is inheritable\n- `p` is permitted\n\nFor information on what these mean, see the [capabilities manpage](http://man7.org/linux/man-pages/man7/capabilities.7.html).\n\n### Experimenting with capabilities\n\nThe `capsh` command can be useful for experimenting with capabilities. `capsh --help` shows how to use the command:\n\n```\n$ sudo capsh --help\nusage: capsh [args ...]\n  --help         this message (or try 'man capsh')\n  --print        display capability relevant state\n  --decode=xxx   decode a hex string to a list of caps\n  --supports=xxx exit 1 if capability xxx unsupported\n  --drop=xxx     remove xxx,.. capabilities from bset\n  --caps=xxx     set caps as per cap_from_text()\n  --inh=xxx      set xxx,.. inheritiable set\n  --secbits=<n>  write a new value for securebits\n  --keep=<n>     set keep-capabability bit to <n>\n  --uid=<n>      set uid to <n> (hint: id <username>)\n  --gid=<n>      set gid to <n> (hint: id <username>)\n  --groups=g,... set the supplemental groups\n  --user=<name>  set uid,gid and groups to that of user\n  --chroot=path  chroot(2) to this path\n  --killit=<n>   send signal(n) to child\n  --forkfor=<n>  fork and make child sleep for <n> sec\n  ==             re-exec(capsh) with args as for --\n  --             remaing arguments are for /bin/bash\n                 (without -- [capsh] will simply exit(0))\n```\n\n> Warning:\n> `--drop` sounds like what you want to do, but it only affects the bounding set. This can be very confusing because it doesn't actually take away the capability from the effective or inheritable set. You almost always want to use `--caps`, `sudo apt-get install attr`.\n\n### Modifying capabilities\n\nLibcap and libcap-ng can both be used to modify capabilities.\n\n1. Use libcap to modify the capabilities on a file.\n\n   The command below shows how to set the CAP_NET_RAW capability as *effective* and *permitted* on the file represented by `$file`. The `setcap` command calls on libcap to do this.\n\n   ```\n   $ sudo setcap cap_net_raw=ep $file\n   ```\n\n2. Use libcap-ng to set the capabilities of a file.\n\n   The `filecap` command calls on libcap-ng.\n\n   ```\n   $ filecap /absolute/path net_raw\n   ```\n\n   **Note:** `filecap` requires absolute path names. Shortcuts like `./` are not permitted.\n\n### Auditing\n\nThere are multiple ways to read out the capabilities from a file.\n\n1. Using libcap:\n\n   ```\n   $ getcap $file\n\n   $file = cap_net_raw+ep\n   ```\n\n2. Using libcap-ng:\n\n   ```\n   $ filecap /absolue/path/to/file\n\n   file                     capabilities\n   /absolute/path/to/file        net_raw\n   ```\n\n3. Using extended attributes (attr package):\n\n   ```\n   $ getfattr -n security.capability $file\n   # file: $file\n   security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=\n   ```\n\n### Tips\n\nDocker images cannot have files with capability bits set. This reduces the risk of Docker containers using capabilities to escalate privileges. However, it is possible to mount volumes that contain files with capability bits set into containers. Therefore you should use caution if doing this.\n\n1. You can audit directories for capability bits with the following commands:\n\n```\n# with libcap\n$ getcap -r /\n\n# with libcap-ng\n$ filecap -a\n```\n\n2. To remove capability bits you can use.\n\n```\n# with libcap\n$ setcap -r $file\n\n# with libcap-ng\n$ filecap /path/to/file none\n```\n\n### Further reading:\n\n[This article](https://www.kernel.org/doc/ols/2008/ols2008v1-pages-163-172.pdf) explains capabilities in a lot of detail. It will help you understand how capability sets interact with each other, and is very useful if you plan to run privileged docker containers and manage capabilities manually inside of them.\n\n\n[This is the man page for capabilities](http://man7.org/linux/man-pages/man7/capabilities.7.html). Most of the complex interactions between capability sets don't affect Docker containers as long as there are no files with capability bits set.\n"
  },
  {
    "path": "Docker/security/cgroups/README.md",
    "content": "# Lab: Control Groups (cgroups)\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 15 minutes\n\nControl Groups (cgroups) are a feature of the Linux kernel that allow you to limit the access processes and containers have to system resources such as CPU, RAM, IOPS and network.\n\nIn this lab you will use **cgroups** to limit the resources available to Docker containers. You will see how to pin a container to specific CPU cores, limit the number of CPU shares a container has, as well as how to prevent a *fork bomb* from taking down a Docker Host.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - cgroups and the Docker CLI](#cli)\n- [Step 2 - Max-out two CPUs](#cpu_max)\n- [Step 3 - Set CPU affinity](#cpu_affinity)\n- [Step 4 - CPU share constraints](#cpu-share)\n- [Step 5 - Docker Compose and cgroups](#compose)\n- [Step 6 - Preventing a fork bomb](#fork_bomb)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker Host with at least two CPU cores\n- Docker 1.11 or higher\n- The `htop` tool installed on your Docker Host (`apt-get install htop` on Ubuntu hosts)\n- Root access on the Docker Host\n\n\n# <a name=\"cli\"></a>Step 1: cgroups and the Docker CLI\n\nThe `docker run` command provides many flags that allow you to apply cgroup limitations to new containers. The following flags are of note for this lab:\n\n   ```\n   $ docker run --help\n...\n  --cpu-shares                    CPU shares (relative weight)\n  ...\n  --cpuset-cpus                   CPUs in which to allow execution (0-3, 0,1)\n  ...\n  --pids-limit                    Tune container pids limit (set -1 for unlimited)\n   ```\n\nFor more information on cgroup related flags available to the `docker run` command, see the [docker run reference guide](https://docs.docker.com/engine/reference/run/#specifying-custom-cgroups).\n\n# <a name=\"cpu_max\"></a>Step 2: Max-out two CPUs\n\nIn this step you'll start a new container that will max out two CPU cores. You will need `htop` installed on your Docker Host, and you will need to be running a Docker Host that has two or more CPU cores. This step will still work if your Docker Host only has a single core. However, some of the `htop` outputs will be slightly different.\n\n1. If you haven't already done so, install `htop` on your Docker Host.\n\n  Ubuntu with `apt`.\n\n  ```\n  $ sudo apt-get install htop\n  ```\n\n  CentOS with `yum`.\n\n  ```\n  $ sudo yum install htop\n  ```\n\n2. Clone the lab's GitHub repo locally on your Docker Host and change into the `cgroups/cpu-stress` directory.\n\n   ```\n   $ sudo git clone https://github.com/docker/labs.git\n   Cloning into 'labs'...\n   remote: Counting objects: 1638, done.\n   Receiving objects: 100% (1638/1638), 8.84 MiB | 2.37 MiB/s, done.\n   Resolving deltas:  22% (33/148)   d 0 (delta 0), pack-reused 1638\n   Resolving deltas: 100% (148/148), done.\n   Checking connectivity... done.\n   Checking out files: 100% (1389/1389), done.\n\n   $ cd labs/security/cgroups/cpu-stress\n   ```\n\n3. Verify that the directory has a single `Dockerfile` and a single `docker-compose.yml` file.\n\n   ```\n   $ ls -l\n   -rw-r--r-- 1 root root 23 Jul 11 09:49 docker-compose.yml\n   -rw-r--r-- 1 root root 85 Jul 11 09:49 Dockerfile\n   ```\n\n4. Inspect the contents of the `Dockerfile`.\n\n   ```\n   $ cat Dockerfile\n   FROM ubuntu:latest\n\n   RUN apt-get update && apt-get install -y stress\n\n   CMD stress -c 2\n   ```\n\n  As you can see, the Dockerfile describes a simple Ubuntu-based container that runs a single command `stress -c 2`. This command spawns two processes - both spinning on `sqrt()`. The effect of this command is to stress two CPU cores.\n\n5. Build the image specified in the `Dockerfile`.\n\n   ```\n   $ sudo docker build -t cpu-stress .\n   Sending build context to Docker daemon 3.072 kB\n   Step 1 : FROM ubuntu:latest\n   latest: Pulling from library/ubuntu\n   90d6565b970a: Pull complete\n   40553bdb8474: Pull complete\n   <snip>\n   Step 3 : CMD stress -c 2\n    ---> Running in b90defcccbb8\n    ---> 9e6a3f316e91\n   Removing intermediate container b90defcccbb8\n   Successfully built 9e6a3f316e91\n   ```\n\n6. Run a new container called **stresser** based on the image built in the previous step.\n\n   ```\n   $ sudo docker run -d --name stresser cpu-stress\n   stress: info: [5] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd\n\n   ```\n\n   Be sure to run the container in the background with the `-d` flag so that you can run the `htop` command in the next step from the same terminal.\n\n7. View the impact of the container using the `htop` command.\n\n  ![](http://i.imgur.com/LB2yN0t.png)\n\n  The output above shows two stress processes (**stress -c 2**) maxing out two of the CPUs on the system (CPU 1 and CPU 4). Both `stress` processes are in the running state, and both consuming 100% of the CPU they are executing on.\n\n8. Stop and remove the **stresser** container.\n\n   ```\n   $ sudo docker stop stresser && sudo docker rm stresser\n\n   stresser\n   stresser\n   ```\n\nYou have seen how it is possible for a single container to max out CPU resources on a Docker Host. You would max out your entire Docker Host if you were to start a **stress** worker processes for each CPU core.\n\n# <a name=\"cpu_affinity\"></a>Step 3: Set CPU affinity\n\nDocker makes it possible to restrict containers to a particular CPU core, or set of CPU cores. In this step you'll see how to restrict a container to a single CPU core using `docker run` with the `--cpuset-cpus` flag.\n\n\n1. Run a new Docker container called **stresser** and restrict it to running on the first CPU on the system.\n\n   ```\n   $ sudo docker run -d --name stresser --cpuset-cpus 0 cpu-stress\n\n   0bfbf2d33516065bbcfa56bd8f9df24749312460141bca729f53d66a9b2dba6b\n   ```\n\n  The `--cpuset-cpus` flag indexes CPU cores starting at 0. Therefore, CPU 0 is the first CPU on the system. You can specify multiple CPU cores as `0-4`, `0,3` etc.\n\n2. Run the `htop` command to see the impact the container is having on the Docker Host.\n\n  ![](http://i.imgur.com/IJP31bP.png)\n\n  There are a few things worth noting about what you have just done:\n  - The container is based on the same **cpu-stress** image that spawns two stress worker processes.\n  - The two stress worker processes have been restricted to running against a single CPU core by the `--cpuset-cpus` flag.\n  - Each of the two stress processes is consuming ~50% of available time on the single CPU core they are executing on.\n  - `htop` indexes CPU cores starting at 1 whereas `--cpuset-cpus` indexes starting at 0.\n\nYou have seen how to lock a container to a executing on a single CPU core on the Docker Host. Feel free to experiment further with the `--cpuset-cpus` flag.\n\n# <a name=\"cpu_share\"></a>Step 4: Set CPU share constraints\n\nBy default, all containers get an equal share of time executing on the Docker Host's CPUs. This allocation of time can be modified by changing the container’s CPU share weighting relative to the weighting of all other running containers.\n\nThe `--cpu-shares` flag takes a value from 0-1024. The default value is 1024, and a value of 0 will also default to 1024. If three containers are running and one has 1024 shares, while the other two have 512, the first container will get 50% of processor time while the other two will each get 25%. However, these shares are only enforced when CPU intensive tasks are running. When a container is not busy, other containers can use the free CPU time.\n\nShares of CPU time are balanced across all cores on a multi-core Docker Host.\n\nIn this step you will use the `docker run` command with the `--cpu-shares` flag to influence the amount of CPU time containers get. You will start one container (**container-1**) with 768 shares, and another container (**container-2**) with 256 shares. Each container will be locked to the first CPU on the system, and each will be running the `stress -c 2` process.  **Container-1** will receive 75% of the CPU time whereas **container-2** will receive 25%.\n\n1. Start the first container with 768 CPU shares.\n\n   ```\n   $ sudo docker run -d --name container-1 --cpuset-cpus 0 --cpu-shares 768 cpu-stress\n   ```\n\n2. Start the second container with 256 CPU shares.\n\n   ```\n    $ sudo docker run -d --name container-2 --cpuset-cpus 0 --cpu-shares 256 cpu-stress\n   ```\n\n3. Verify that both containers are running with the `docker ps` command.\n\n   ```\n   $ sudo docker ps\n\n   CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES\n725dc16fac5a        cpu-stress          \"/bin/sh -c 'stress -\"   2 minutes ago       Up 2 minutes                            container-2\nf82f95757d3f        cpu-stress          \"/bin/sh -c 'stress -\"   2 minutes ago       Up 2 minutes                            container-1\n   ```\n\n4. View the output of `htop`.\n\n  ![](http://i.imgur.com/zRqkQHt.png)\n\n  Notice two things about the `htop` output. First, only a single CPU is being maxed out. Second, there are four `stress` processes running. The first two in the list equate to ~75% of CPU time, and the second two equate to ~25% of CPU time.\n\nIn this step you've seen how to use the `--cpu-shares` flag to influence the amount of CPU time containers get relative to other containers on the same Docker Host.\n\nFeel free to experiment further by running more containers with different relative weights.\n\n# <a name=\"compose\"></a>Step 5: Docker Compose and cgroups\n\nIn this step you'll see how to set CPU affinities via Docker Compose files.\n\nSee [this section](https://docs.docker.com/compose/compose-file/#cpu-shares-cpu-quota-cpuset-domainname-hostname-ipc-mac-address-mem-limit-memswap-limit-privileged-read-only-restart-shm-size-stdin-open-tty-user-working-dir) of the Docker Compose documentation for more information on leveraging other cgroup capabilities using Docker Compose.\n\nMake sure you are in the `dockercon-workshop/cgroups/cpu-stress` directory of the repo that you pulled in Step 2.\n\n1. Edit the `docker-compose.yml` file and add the `cpuset: '3'` line as shown below:\n\n   ```\n   cpu-stress:\n     build: .\n     cpuset: '3'\n\n   ```\n\n  The above `docker-compose.yml` file will ensure that containers based from it will run on CPU core #3. You will obviously need a Docker Host with at least 4 CPU cores for this to work.\n\n2. Bring the application up in the background.\n\n     ```\n     $ sudo docker-compose up -d\n\n     Creating cpustress_cpu-stress_1\n     ```\n\n3. Run `htop` to see the effect of the `cpuset` parameter.\n\n  ![](http://i.imgur.com/DsCOSSB.png)\n\n  The `htop` output above shows the container and it's two `stress` processes locked to CPU core 4 (`cpuset` in Docker Compose indexes CPU cores starting at 0 whereas `htop` indexes CPU cores starting at 1).\n\nIn this step you've seen how Docker Compose can set container CPU affinities. Remember that Docker Compose can also set CPU quotas and shares. See the [documentation](https://docs.docker.com/compose/compose-file/#cpu-shares-cpu-quota-cpuset-domainname-hostname-ipc-mac-address-mem-limit-memswap-limit-privileged-read-only-restart-shm-size-stdin-open-tty-user-working-dir) for more detail.\n\n\n# <a name=\"fork_bomb\"></a>Step 6: Preventing a fork bomb\n\nA *fork bomb* is a form of denial of service (DoS) attack where a process continually replicates itself with the goal of depleting system resources to the point where a system can no longer function.\n\nIn this step you will use the `--pids-limit` flag to limit the number of processes a container can fork at runtime. This will prevent a fork bomb from consuming the Docker Host's entire process table.\n\n1. Start a new container and limit the number of processes it can create to 200 with the following command.\n\n   ```\n   $ sudo docker run --rm -it --pids-limit 200 debian:jessie bash\n\n   Unable to find image 'debian:jessie' locally\n   jessie: Pulling from library/debian\n   5c90d4a2d1a8: Pull complete\n   Digest: sha256:8b1fc3a7a55c42e3445155b2f8f40c55de5f8bc8012992b26b570530c4bded9e\n   Status: Downloaded newer image for debian:jessie\n\n   root@c0eb76d2481c:/#\n   ```\n\n  **Do not proceed to the next step** if you receive the following warning about pids limit support - *\"WARNING: Your kernel does not support pids limit capabilities, pids limit discarded\"*. If you receive this warning, you can [watch the demo](https://asciinema.org/a/dewdpjlzom4zasdz0c0c46jt9) as a video instead.\n\n2.  Run the following command to create a fork bomb in the container you just started.\n\n  The previous command will have attached your terminal to the `bash` shell inside of the container created in the previous step.\n\n  **Do not complete this step if you received the error that your kernel does not support the pids limit feature...**\n\n   ```\n   root@c0eb76d2481c:/# :(){ :|: & };:\n\n   [1] 6\n   root@a3eeb655f301:/# bash: fork: retry: No child processes\n   bash: fork: retry: No child processes\n   bash: fork: retry: No child processes\n   bash: fork: retry: No child processes\n   bash: fork: retry: No child processes\n   bash: fork: retry: Resource temporarily unavailable\n   bash: fork: retry: No child processes\n   <snip>\n   bash: fork: retry: No child processes\n   bash: fork: retry: Resource temporarily unavailable\n   bash: fork: retry: No child processes\n   ^C\n   [1]+   Done                : | :\n   ```\n\n  > **Note:** The command above is `:(){ :|: & };:`.\n\n  You will need to press `Ctrl-C` to stop the process.\n\nIn this step you have seen how to set a process limits on a container that will prevent it from consuming all process table resources on the underlying Docker Host.\n\n# Summary\n\nCongratulations. You've seen how to use some of the **cgroups** features supported by Docker that allow you to limit and constrain a container's access to Docker Host system resources.\n\n# Additional Resources\n\nYou can refer to the following resources for more information and help:\n- Docker: http://www.docker.com\n"
  },
  {
    "path": "Docker/security/cgroups/cpu-stress/Dockerfile",
    "content": "FROM ubuntu:latest\n\nRUN apt-get update && apt-get install -y stress\n\nCMD stress -c 2\n"
  },
  {
    "path": "Docker/security/cgroups/cpu-stress/docker-compose.yml",
    "content": "cpu-stress:\n  build: .\n"
  },
  {
    "path": "Docker/security/networking/README.md",
    "content": "# Docker Networking Security Basics\n\n# Lab Meta\n\n> **Difficulty**: Beginner\n\n> **Time**: Approximately 10 minutes\n\nIn this lab you'll look some of the built-in network security technologies available in Swarm Mode.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Create an encrypted overlay network](#network_create)\n- [Step 2 - List networks](#list_networks)\n- [Step 3 - Deploy a service](#deploy_service)\n- [Step 4 - Clean-up](#clean)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- At least two Linux-based Docker Hosts running Docker 1.13 or higher and configured as part of the same Swarm\n- This lab assumes Swarm with at least one manager nodes and one worker node. In this lab, **node1** will be the manager and **node3** will be the worker. You may need to change these values if your lab is configured differently - the important thing is that one node is a manager and the other is a worker.\n- This lab was built and tested using Ubuntu 16.04 and Docker 17.03.0-ce\n\n# <a name=\"network_create\"></a>Step 1: Create an encrypted overlay network\n\nIn this step you will create two overlay networks. The first will only have the control plane traffic encrypted. The second will have control plane **and** data plane traffic encrypted.\n\nAll Docker overlay networks have control plane traffic encrypted by default. To encrypt data plane traffic you need to pass the `--opt encrypted` flag to the `docker network create command`.\n\nPerform all of the following commands from a *Manager node* in your lab. The examples in this lab guide will assume you are using **node1**. Your lab may be different.\n\n1. Create a new overlay network called **net1**\n\n   ```\n   $ docker network create -d overlay net1\n   xt3jwgsq20ob648uc5f8ow95q\n   ```\n\n2. Inspect the **net1** network to check for the **encrypted** flag\n\n   ```\n   $ docker network inspect net1\n   [\n    {\n        \"Name\": \"net1\",\n        \"Id\": \"xt3jwgsq20ob648uc5f8ow95q\",\n        \"Created\": \"0001-01-01T00:00:00Z\",\n        \"Scope\": \"swarm\",\n        \"Driver\": \"overlay\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": null,\n            \"Config\": []\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Containers\": null,\n        \"Options\": {\n            \"com.docker.network.driver.overlay.vxlanid_list\": \"4097\"\n        },\n        \"Labels\": null\n    }\n   ]\n   ```\n   Notice that there is no **encrypted** flag under the **Options** section of the output. This indicates that data plane traffic (application traffic) is not encrypted on this network. Control plane traffic (gossip etc) is encrypted by default for all overlay networks.\n\n3. Create another overlay network, but this time pass the `--opt encrypted` flag. Call this network **net2**.\n\n   ```\n   $ docker network create -d overlay --opt encrypted net2\n   uaaw8ljwidoc5is2qo362hd8n\n   ```\n\n4. Inspect the **net2** network to check for the **encrypted** flag\n\n   ```\n   $ docker network inspect net2\n   [\n    {\n        \"Name\": \"net2\",\n        \"Id\": \"uaaw8ljwidoc5is2qo362hd8n\",\n        \"Created\": \"0001-01-01T00:00:00Z\",\n        \"Scope\": \"swarm\",\n        \"Driver\": \"overlay\",\n        \"EnableIPv6\": false,\n        \"IPAM\": {\n            \"Driver\": \"default\",\n            \"Options\": null,\n            \"Config\": []\n        },\n        \"Internal\": false,\n        \"Attachable\": false,\n        \"Containers\": null,\n        \"Options\": {\n            \"com.docker.network.driver.overlay.vxlanid_list\": \"4098\",\n            \"encrypted\": \"\"\n        },\n        \"Labels\": null\n    }\n   ]\n   ```\n\n   Notice the presence of the **encrypted** flag below the VXLAN ID in the **Options** field. This indicates that data plane traffic (application traffic) on this network will be encrypted.\n\n\n# <a name=\"list_networks\"></a>Step 2: List networks\n\nIn this step you will list the networks visible on **node1** (*manager node*) and **node3** (*worker node*) in your lab.  The networks you created in the previous step will be visible on **node1** but not **node3**. This is because Docker takes a lazy approach when propagating networks to *worker nodes* - a *worker node* only gets to know about a network if it runs a container or service task that specifically requires that network. This reduces network control plane chatter which assists with scalability and security.\n\n>NOTE: All *manager nodes* know about all networks.\n\n1. Run the `docker network ls` command on **node1**\n\n   ```\n   node1$ docker network ls\n   NETWORK ID          NAME                DRIVER              SCOPE\n   70bd606f9f81        bridge              bridge              local\n   475a3b8f04de        docker_gwbridge     bridge              local\n   f94f673bfe7e        host                host                local\n   3ecc06xxyb7d        ingress             overlay             swarm\n   xt3jwgsq20ob        net1                overlay             swarm\n   uaaw8ljwidoc        net2                overlay             swarm\n   b535831c780f        none                null                local\n   ```\n\n   Notice that **net1** and **net2** are both present in the list. This is expected behavior because you created these networks on **node1** and it is also a *manager node*. *Worker nodes* in the Swarm should not be able to see these networks yet.\n\n2. Run the `docker network ls` command on **node3** (*worker node*)\n\n   ```\n   node3$ docker network ls\n   NETWORK ID          NAME                DRIVER              SCOPE\n   abe97d2963b3        bridge              bridge              local\n   42295053cd72        docker_gwbridge     bridge              local\n   ad4f60192aa0        host                host                local\n   3ecc06xxyb7d        ingress             overlay             swarm\n   1a85d1a0721f        none                null                local\n   ```\n\n   The **net1** and **net2** networks are not visible on this *worker node*. This is expected behavior because the node is not running a service task that is on that network. This proves that Docker does not extend newly created networks to all *worker nodes* in a Swarm - it delays this action until a node has a specific requirement to know about that network. This improves scalability and security.\n\n# <a name=\"deploy_service\"></a>Step 3: Deploy a service\n\nIn this step you will deploy a service on the **net2** overlay network. You will deploy the service with enough replica tasks so that at least one task will run on every node in your Swarm. This will force Docker to extend the **net2** network to all nodes in the Swarm.\n\n1. Deploy a new service to all nodes in your Swarm. When executing this command, be sure to use an adequate number of replica tasks so that all Swarm nodes will run a task. This example deploys 4 replica tasks.\n\n   ```\n   $ docker service create --name service1 \\\n   --network=net2 --replicas=4 \\\n   alpine:latest sleep 1d\n\n   ivfei61h3jvypuj7v0443ow84\n   ```\n2. Check that the service has deployed successfully\n\n   ```\n   $ docker service ls\n   ID            NAME      MODE        REPLICAS  IMAGE\n   ivfei61h3jvy  service1  replicated  4/4       alpine:latest\n   ```\n\n   As long as all replicas are up (`4/4` in the example above) you can proceed to the next command. It may take a minute for the service tasks to deploy while the image is downloaded to each node in your Swarm.\n\n3. Run the `docker network ls` command again from **node3**.\n\n   >NOTE: It is important that you run this step from a *worker node* that could previously not see the **net2** network.\n\n   ```\n   node3$ docker network ls\n   NETWORK ID          NAME                DRIVER              SCOPE\n   abe97d2963b3        bridge              bridge              local\n   42295053cd72        docker_gwbridge     bridge              local\n   ad4f60192aa0        host                host                local\n   3ecc06xxyb7d        ingress             overlay             swarm\n   uaaw8ljwidoc        net2                overlay             swarm\n   1a85d1a0721f        none                null                local\n   ```\n\n   The **net2** network is now visible on **node3**. This is because **node3** is running a task for the **service1** service which is using the **net2** network.\n\nCongratulations! You've created an encrypted network, deployed a service to it, and seen that new overlay networks are only made available to worker nodes in the Swarm as and when they runs service tasks on the network.\n\n# <a name=\"clean\"></a>Step 4: Clean-up\n\nIn this step you will clean-up the service and networks created in this lab.\n\nExecute all of the following commands from **node1** or another Swarm manager node.\n\n1. Remove the service you created in Step 3\n\n   ```\n   $ docker service rm service1\n   service1\n   ```\n   This will also remove the **net2** network from all worker nodes in the Swarm.\n\n2. Remove the **net1** and **net2** networks\n\n   ```\n   $ docker network rm net1 net2\n   net1\n   net2\n   ```\nCongratulations. You've completed this quick Docker Network Security lab. You've even cleaned up!\n"
  },
  {
    "path": "Docker/security/scanning/README.md",
    "content": "# Security Scanning with Docker Hub\n\n# Lab Meta\n\n> **Difficulty**: Beginner\n\n> **Time**: Approximately 10 minutes\n\nIn this lab you'll learn how to use Docker Security Scanning with Docker Hub\n*private repositories*.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Create a private Hub repo](#repo)\n- [Step 2 - Pull an image](#pull)\n- [Step 3 - Tag and push an image](#tag_push)\n- [Step 4 - View scan results](#results)\n- [Step 4 - Clean-up](#clean)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Docker host running **Docker 1.13** or higher\n- A **Docker ID** with at least one spare private repository on Docker Hub\n\n# <a name=\"pull\"></a>Step 1: Create a private Hub repo\n\nDocker Security Scanning is a service currently offered for images stored in\nDocker Hub private repositories. In this step you will create a new private\nrepository within your Docker Hub namespace.\n\n>NOTE: This step assumes that you have a DockerHub account that will allow you\nto create a new private repo. If you have used all of the private repos on your\naccount you will need to re-use one of them. If you do this you will need to\ntake care not to interfere with images you already have stored in the repo. The\nonly alternative is to upgrade to a plan that offers more private repos.\n\n1. Log in to Docker Hub with your Docker ID.\n\n2. Click the `Create Repository +` button.\n\n  ![](images/scan1.png)\n\n3. Give the repo a `name`, `short description`, and make sure that\n`Visibility=private` then click `Create`.\n\n  ![](images/scan2.png)\n\nNow that you have created a new **private** Docker Hub repo, you can proceed to\nthe next step.\n\n# <a name=\"pull\"></a>Step 2: Pull an image\n\nIn this step you'll pull an image that you will use in Step 3.\n\n1. Use the `docker pull` command to pull a copy of the `alpine:edge` image.\n\n  ```\n  node1$ docker image pull alpine:edge\n  edge: Pulling from library/alpine\n  71c5a0cc58e4: Pull complete\n  Digest: sha256:99588bc8883c955c157...0c223e6c7cabca5f600a3e9f8d5cd\n  Status: Downloaded newer image for alpine:edge\n  ```\n\n2. Confirm that the image was pulled successfully.\n\n  ```\n  node1$ docker image ls\n  REPOSITORY   TAG         IMAGE ID         CREATED         SIZE\n  alpine       edge        8914de95a28d     2 weeks ago     4 MB\n  ```\n\nYou will use this image in the next step.\n\n\n# <a name=\"tag_push\"></a>Step 3: Tag and push an image\n\nIn this step you'll `tag` the image that you pulled in the previous step so\nthat it is associated with the **private** Docker Hub repo you created in Step 1.\n\nBe sure to substitute `nigelpoulton` with your own Docker ID in the steps below.\n\n1. Tag the image so that it can be pushed to your newly created repo.\n\n  ```\n  node1$ docker image tag alpine:edge nigelpoulton/scan:v1\n  ```\n\n  This command has tagged the `alpine:edge` image so that it can be pushed to\n  the `nigelpoulton/scan` repo (remember to replace `nigelpoulton` with your\n  own Docker ID). It has also given it the `v1` tag.\n\n2. Verify that the new tag exists.\n\n   ```\n   node1$ docker image ls\n   REPOSITORY          TAG       IMAGE ID         CREATED         SIZE\n   alpine              edge      8914de95a28d     2 weeks ago     4 MB\n   nigelpoulton/scan   v1        8914de95a28d     2 weeks ago     4 MB\n   ```\n\n  Notice that both lines show the same `IMAGE ID` but have different values for\n  `REPOSITORY` and `TAG`. This is because the exact same image has been tagged\n  twice.\n\n3. From the CLI of your Docker host, login to Docker Hub with your Docker ID.\n\n  Be sure to use your own Docker ID.\n\n  ```\n  node1$ docker login\n  Username: nigelpoulton\n  Password:\n  Login Succeeded\n  ```\n\n4. Push the newly tagged image.\n\n  Be sure to substitute the image tag below with the correct image from your\n  own environment.\n\n  ```\n  node1$ docker image push nigelpoulton/scan:v1\n  The push refers to a repository [docker.io/nigelpoulton/scan]\n  ff7d0c6cd736: Mounted from library/alpine\n  v1: digest: sha256:99588bc8883c9...5f600a3e9f8d5cd size: 528\n  ```\n\nCongratualtions. In this step you tagged and pushed an image to your newly\ncreated *private repo* on Docker Hub.\n\n# <a name=\"results\"></a>Step 4: View scan results\n\nIn this step you'll log back in to Docker Hub and view the scan results of the\nimage you pushed in Step 3.\n\nIf you followed the exercise and used the `alpine:edge` image, the scanning\nmay have completed by the time you log back in to Docker Hub. If you used a\ndifferent image, especially a larger image, it might take longer for the image\nscan to complete.\n\n1. Log back in to Docker Hub from your web browser.\n\n2. Navigate to the repo you created in Step 1 and click the `Tags` tab.\n\n3. View the high-level scan results and feel free to click into them for more\ndetails.\n\n  If the scan is still in progress you may want to grab a coffee and refresh\n  the page in a couple of minutes. There are occasions when scan jobs can get\n  queued and take a while to complete. If your scan is taking a long time to\n  complete it might be worth searching Docker Hub for the `alpine:edge` image\n  and exploring the scan results of that image.\n\n**Congratulations**, you have completed this lab Security Scanning with Docker\nHub.\n\n# <a name=\"clean\"></a>Step 5: Clean-up\n\nIn this step you will remove all images and containers on the host and clean up any other artifacts created in this lab.\n\n\n1. Remove all images on the host.\n\n   This command will remove **all** images on your Docker host. Only perform this step if you know you will not use these images again.\n\n   ```\n   $ docker image rm $(docker image ls -aq)\n   <Snip>\n   ```\n2. Remove all containers on the host.\n\n   This command will remove **all** containers on your Docker host. Only perform this step if you know you know you do not need any of the containers running on your system.\n\n   ```\n   $ docker container rm $(docker container ls -q) -f\n   <Snip>\n   ```\n\n3. Log on to Docker Hub and delete the repository that you created for this demo.\n\n   `click on the repo` > `click on the Settings tabe of the repo` > `click Delete` and follow the instructions.\n"
  },
  {
    "path": "Docker/security/seccomp/README.md",
    "content": "# Lab: Seccomp\n\n> **Difficulty**: Advanced\n\n> **Time**: Approximately 20 minutes\n\nseccomp is a sandboxing facility in the Linux kernel that acts like a firewall for system calls (syscalls). It uses Berkeley Packet Filter (BPF) rules to filter syscalls and control how they are handled. These filters can significantly limit a containers access to the Docker Host's Linux kernel - especially for simple containers/applications.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Clone the labs GitHub repo](#clone)\n- [Step 2 - Test a seccomp profile](#test)\n- [Step 3 - Run a container with no seccomp profile](#no-default)\n- [Step 4 - Selectively remove syscalls](#chmod)\n- [Step 5 - Write a seccomp profile](#write)\n- [Step 6 - A few Gotchas](#gotchas)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker Host with seccomp enabled\n- Docker 1.10 or higher (preferably 1.12 or higher)\n- This lab was created using Ubuntu 16.04 and Docker 17.04.0-ce. If you are using older versions of Docker you may need to replace `docker container run` commands with `docker run` commands.\n\nThe following commands show you how to check if seccomp is enabled in your system's kernel:\n\n   Check from Docker 1.12 or higher\n   ```\n   $ docker info | grep seccomp\n   Security Options: apparmor seccomp\n   ```\n   If the above output does not return a line with `seccomp` then your system does not have seccomp enabled in its kernel.\n\n   Check from the Linux command line\n   ```\n   $ grep SECCOMP /boot/config-$(uname -r)\n   CONFIG_HAVE_ARCH_SECCOMP_FILTER=y\n   CONFIG_SECCOMP_FILTER=y\n   CONFIG_SECCOMP=y\n   ```\n\n### Seccomp and Docker\n\nDocker has used seccomp since version 1.10 of the Docker Engine.\n\nDocker uses seccomp in *filter mode* and has its own JSON-based DSL that allows you to define *profiles* that compile down to seccomp filters. When you run a container it gets the default seccomp profile unless you override this by passing the `--security-opt` flag to the `docker run` command.\n\nThe following example command starts an interactive container based off the Alpine image and starts a shell process. It also applies the seccomp profile described by `<profile>.json` to it.\n\n   ```\n   $ docker container run -it --rm --security-opt seccomp=<profile>.json alpine sh ...\n   ```\n\nThe above command sends the JSON file from the client to the daemon where it is compiled into a BPF program using a [thin Go wrapper around libseccomp](https://github.com/seccomp/libseccomp-golang).\n\nDocker seccomp profiles operate using a whitelist approach that specifies allowed syscalls. *Only* syscalls on the whitelist are permitted.\n\nDocker supports many security related technologies. It is possible for other security related technologies to interfere with your testing of seccomp profiles. For this reason, the best way to test the effect of seccomp profiles is to add all *capabilities* and disable *apparmor*. This gives you the confidence the behavior you see in the following steps is solely due to seccomp changes.\n\nThe following `docker run` flags add all *capabilities* and disable *apparmor*: `--cap-add ALL --security-opt apparmor=unconfined`.\n\n# <a name=\"clone\"></a>Step 1: Clone the labs GitHub repo\n\nIn this step you will clone the lab's GitHub repo so that you have the seccomp profiles that you will use for the remainder of this lab.\n\n1. Clone the labs GitHub repo.\n\n   ```\n   $ git clone https://github.com/docker/labs\n   ```\n\n2. Change into the `labs/security/seccomp` directory.\n\n   ```\n   $ cd labs/security/seccomp/seccomp-profiles\n   ```\n\nThe remaining steps in this lab will assume that you are running commands from this `labs/security/seccomp` directory. This will be important when referencing the seccomp profiles on the various `docker run` commands throughout the lab.\n\n# <a name=\"test\"></a>Step 2: Test a seccomp profile\n\nIn this step you will use the `deny.json` seccomp profile included the lab guides repo. This profile has an empty syscall whitelist meaning all syscalls will be blocked. As part of the demo you will add all *capabilities* and effectively disable *apparmor* so that you know that only your seccomp profile is preventing the syscalls.\n\n1. Use the `docker run` command to try to start a new container with all capabilities added, apparmor unconfined, and the `seccomp-profiles/deny.json` seccomp profile applied.\n\n   ```\n   $ docker container run --rm -it --cap-add ALL --security-opt apparmor=unconfined --security-opt seccomp=seccomp-profiles/deny.json alpine sh\n   docker: Error response from daemon: exit status 1: \"cannot start a container that has run and stopped\\n\".\n   ```\n\nIn this scenario, Docker doesn't actually have enough syscalls to start the container!\n\n2. Inspect the contents of the `seccomp-profiles/deny.json` profile.\n\n   ```\n   $ cat seccomp-profiles/deny.json\n   {\n        \"defaultAction\": \"SCMP_ACT_ERRNO\",\n        \"architectures\": [\n                \"SCMP_ARCH_X86_64\",\n                \"SCMP_ARCH_X86\",\n                \"SCMP_ARCH_X32\"\n        ],\n        \"syscalls\": [\n        ]\n   }\n   ```\n\n   Notice that there are no **syscalls** in the whitelist. This means that no syscalls will be allowed from containers started with this profile.\n\nIn this step you removed *capabilities* and *apparmor* from interfering, and started a new container with a seccomp profile that had no syscalls in its whitelist. You saw how this prevented all syscalls from within the container or to let it start in the first place.\n\n# <a name=\"no-default\"></a>Step 3: Run a container with no seccomp profile\n\nUnless you specify a different profile, Docker will apply the [default seccomp profile](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) to all new containers. In this step you will see how to force a new container to run without a seccomp profile.\n\n1. Start a new container with the `--security-opt seccomp=unconfined` flag so that no seccomp profile is applied to it.\n\n   ```\n   $ docker container run --rm -it --security-opt seccomp=unconfined debian:jessie sh\n   ```\n\n2. From the terminal of the container run a `whoami` command to confirm that the container works and can make syscalls back to the Docker Host.\n\n   ```\n   / # whoami\n   root\n   ```\n\n3. To prove that we are not running with the default seccomp profile, try running a `unshare` command, which creates a new namespace:\n  ```\n  / # unshare --map-root-user --user\n  / # whoami\n  root\n  ```\n   If you try running the above `unshare` command from a container with the default seccomp profile applied it will fail with an `Operation not permitted` error.\n\n4. Exit the container.\n\n5. Run the following `strace` command from your Docker Host to see a list of the syscalls used by the `whoami` program.\n\n   Your Docker Host will need the `strace` package installed.\n\n   ```\n   $ strace -c -f -S name whoami 2>&1 1>/dev/null | tail -n +3 | head -n -2 | awk '{print $(NF)}'\n   access\n   arch_prctl\n   brk\n   close\n   connect\n   execve\n   <SNIP>\n   socket\n   write\n   ```\n\n  You can also run the following simpler command and get a more verbose output.\n\n   ```\n   $ strace whoami\n   execve(\"/usr/bin/whoami\", [\"whoami\", \"-qq\"], [/* 21 vars */]) = 0\n   brk(0)                                  = 0x1980000\n   <SNIP>\n   ```\n\n   You can substitute **whoami** for any other program.\n\nIn this step you started a new container with no seccomp profile and verified that the `whoami` program could execute. You also used the `strace` program to list the syscalls made by a particular run of the `whoami` program.\n\n# <a name=\"chmod\"></a>Step 4: Selectively remove syscalls\n\nIn this step you will see how applying changes to the `default.json` profile can be a good way to fine-tune which syscalls are available to containers.\n\nThe `default-no-chmod.json` profile is a modification of the `default.json` profile with the `chmod()`, `fchmod()`, and `chmodat()` syscalls removed from its whitelist.\n\n1. Start a new container with the `default-no-chmod.json` profile and attempt to run the `chmod 777 / -v` command.\n\n   ```\n   $ docker container run --rm -it --security-opt seccomp=default-no-chmod.json alpine sh\n\n   / # chmod 777 / -v\n   chmod: /: Operation not permitted\n   ```\n\n  The command fails because the `chmod 777 / -v` command uses some of the `chmod()`, `fchmod()`, and `chmodat()` syscalls that have been removed from the whitelist of the `default-no-chmod.json` profile.\n\n2. Exit the container.\n\n3. Start another new container with the `default.json` profile and run the same `chmod 777 / -v`.\n\n   ```\n   $ docker container run --rm -it --security-opt seccomp=default.json alpine sh\n\n   / # chmod 777 / -v\n   mode of '/' changed to 0777 (rwxrwxrwx)\n   ```\n\n  The command succeeds this time because the `default.json` profile has the `chmod()`, `fchmod()`, and `chmodat` syscalls included in its whitelist.\n\n4. Exit the container.\n\n5. Check both profiles for the presence of the `chmod()`, `fchmod()`, and `chmodat()` syscalls.\n\n   Be sure to perform these commands from the command line of you Docker Host and not from inside of the container created in the previous step.\n\n   ```\n   $ cat ./seccomp-profiles/default.json | grep chmod\n   \"name\": \"chmod\",\n   \"name\": \"fchmod\",\n   \"name\": \"fchmodat\",\n\n   $ cat ./deccomp-profiles/default-no-chmod.json | grep chmod\n   ```\n\n   The output above shows that the `default-no-chmod.json` profile contains no **chmod** related syscalls in the whitelist.\n\nIn this step you saw how removing particular syscalls from the `default.json` profile can be a powerful way to start fine tuning the security of your containers.\n\n# <a name=\"write\"></a>Step 5: Write a seccomp profile\n\nIt is possible to write Docker seccomp profiles from scratch. You can also edit existing profiles. In this step you will learn about the syntax and behavior of Docker seccomp profiles.\n\nThe layout of a Docker seccomp profile looks like the following:\n\n```\n{\n    \"defaultAction\": \"SCMP_ACT_ERRNO\",\n    \"architectures\": [\n        \"SCMP_ARCH_X86_64\",\n        \"SCMP_ARCH_X86\",\n        \"SCMP_ARCH_X32\"\n    ],\n    \"syscalls\": [\n        {\n            \"name\": \"accept\",\n            \"action\": \"SCMP_ACT_ALLOW\",\n            \"args\": []\n        },\n        {\n            \"name\": \"accept4\",\n            \"action\": \"SCMP_ACT_ALLOW\",\n            \"args\": []\n        },\n        ...\n    ]\n}\n```\n\nThe most authoritative source for how to write Docker seccomp profiles is the structs used to deserialize the JSON.\n\n* https://github.com/docker/engine-api/blob/c15549e10366236b069e50ef26562fb24f5911d4/types/seccomp.go\n* https://github.com/opencontainers/runtime-spec/blob/master/specs-go/config.go#L357\n\nThe table below lists the possible *actions* in order of precedence. Higher actions overrule lower actions.\n\n| Action         | Description                                                              |\n|----------------|--------------------------------------------------------------------------|\n| SCMP_ACT_KILL  | Kill with a exit status of `0x80 + 31 (SIGSYS) = 159`                    |\n| SCMP_ACT_TRAP  | Send a `SIGSYS` signal without executing the system call                 |\n| SCMP_ACT_ERRNO | Set `errno` without executing the system call                            |\n| SCMP_ACT_TRACE | Invoke a ptracer to make a decision or set `errno` to `-ENOSYS`          |\n| SCMP_ACT_ALLOW | Allow                                                                    |\n\nThe most important actions for Docker users are `SCMP_ACT_ERRNO` and `SCMP_ACT_ALLOW`.\n\nProfiles can contain more granular filters based on the value of the arguments to the system call.\n\n```\n{\n    ...\n    \"syscalls\": [\n        {\n            \"name\": \"accept\",\n            \"action\": \"SCMP_ACT_ALLOW\",\n            \"args\": [\n                {\n                    \"index\": 0,\n                    \"op\": \"SCMP_CMP_MASKED_EQ\",\n                    \"value\": 2080505856,\n                    \"valueTwo\": 0\n                }\n            ]\n        }\n    ]\n}\n```\n\n* `index` is the index of the system call argument\n* `op` is the operation to perform on the argument. It can be one of:\n    * SCMP_CMP_NE - not equal\n    * SCMP_CMP_LT - less than\n    * SCMP_CMP_LE - less than or equal to\n    * SCMP_CMP_EQ - equal to\n    * SCMP_CMP_GE - greater than\n    * SCMP_CMP_GT - greater or equal to\n    * SCMP_CMP_MASKED_EQ - masked equal: true if `(value & arg == valueTwo)`\n* `value` is a parameter for the operation\n* `valueTwo` is used only for SCMP_CMP_MASKED_EQ\n\nThe rule only matches if **all** args match. Add multiple rules to achieve the effect of an OR.\n\n`strace` can be used to get a list of all system calls made by a program.\nIt's a very good starting point for writing seccomp policies.\nHere's an example of how we can list all system calls made by `ls`:\n\n```\n$ strace -c -f -S name ls 2>&1 1>/dev/null | tail -n +3 | head -n -2 | awk '{print $(NF)}'\naccess\narch_prctl\nbrk\nclose\nexecve\n<SNIP>\nstatfs\nwrite\n```\n\nThe output above shows the syscalls that will need to be enabled for a container running the `ls` program to work, in addition to the syscalls required to start a container.\n\nIn this step you learned the format and syntax of Docker seccomp profiles. You also learned the order of preference for actions, as well as how to determine the syscalls needed by an individual program.\n\n# <a name=\"test\"></a>Step 6: A few gotchas\n\nThe remainder of this lab will walk you through a few things that are easy to miss when using seccomp with Docker.\n\n#### Timing of a seccomp profile application\n\nIn versions of Docker prior to 1.12, seccomp polices tended to be applied very early in the container creation process. This resulted in you needing to add syscalls to your profile that were required for the container creation process but not required by your container. This was not ideal. See:\n\n- https://github.com/moby/moby/issues/22252\n- https://github.com/opencontainers/runc/pull/789\n\nA good way to avoid this issue in Docker 1.12+ can be to use the `--security-opt no-new-privileges` flag when starting your container. However, this will also prevent you from gaining privileges through `setuid` binaries.\n\n#### Truncation\n\nWhen writing a seccomp filter, there may be unused or randomly set bits on 32-bit arguments when using a 64-bit operating system after the filter has run.\n\n> When checking values from args against a blacklist, keep in mind that\n> arguments are often silently truncated before being processed, but\n> after the seccomp check.  For example, this happens if the i386 ABI\n> is used on an x86-64 kernel: although the kernel will normally not\n> look beyond the 32 lowest bits of the arguments, the values of the\n> full 64-bit registers will be present in the seccomp data.  A less\n> surprising example is that if the x86-64 ABI is used to perform a\n> system call that takes an argument of type int, the more-significant\n> half of the argument register is ignored by the system call, but\n> visible in the seccomp data.\n\nhttps://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt\n\n#### seccomp escapes\n\nSyscall numbers are architecture dependent. This limits the portability of BPF filters. Fortunately Docker profiles abstract this issue away, so you don't need to worry about it if using Docker seccomp profiles.\n\n`ptrace` is disabled by default and you should avoid enabling it. This is because it allows bypassing of seccomp. You can use [this script](https://gist.github.com/thejh/8346f47e359adecd1d53) to test for seccomp escapes through `ptrace`.\n\n#### Differences between Docker versions\n\n* Seccomp is supported as of Docker 1.10.\n\n* Using the `--privileged` flag when creating a container with `docker run` disables seccomp in all versions of docker - even if you explicitly specify a seccomp profile. In general you should avoid using the `--privileged` flag as it does too many things. You can achieve the same goal with `--cap-add ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined`. If you need access to devices use `--device`.\n\n* In docker 1.10-1.12 `docker exec --privileged` does not bypass seccomp. This may change in future versions https://github.com/moby/moby/issues/21984.\n\n* In docker 1.12 and later, adding a capability may enable some appropriate system calls in the default seccomp profile. However, it does not disable apparmor.\n\n### Using multiple filters\n\nThe only way to use multiple seccomp filters, as of Docker 1.12, is to load additional filters within your program at runtime. The kernel supports layering filters.\n\nWhen using multiple layered filters, all filters are always executed starting with the most recently added. The highest precedence action returned is taken. See the man page for all the details: http://man7.org/linux/man-pages/man2/seccomp.2.html\n\n### Misc\n\nYou can enable JITing of BPF filters (if it isn't already enabled) with the following command:\n\n```\n$ echo 1 > /proc/sys/net/core/bpf_jit_enable\n```\n\nThere is no easy way to use seccomp in a mode that reports errors without crashing the program. However, there are several round-about ways to accomplish this. One such way is to use SCMP_ACT_TRAP and write your code to handle SIGSYS and report the errors in a useful way. Here is some information on [how Firefox handles seccomp violations](https://wiki.mozilla.org/Security/Sandbox/Seccomp).\n\n### Further reading:\n\nVery comprehensive presentation about seccomp that goes into more detail than this document.\nhttps://lwn.net/Articles/656307/\nhttp://man7.org/conf/lpc2015/limiting_kernel_attack_surface_with_seccomp-LPC_2015-Kerrisk.pdf\n\nChrome's DSL for generating seccomp BPF programs:\nhttps://cs.chromium.org/chromium/src/sandbox/linux/bpf_dsl/bpf_dsl.h?sq=package:chromium&dr=CSs\n"
  },
  {
    "path": "Docker/security/seccomp/seccomp-profiles/allow.json",
    "content": "{\n\t\"defaultAction\": \"SCMP_ACT_ALLOW\",\n\t\"architectures\": [\n\t\t\"SCMP_ARCH_X86_64\",\n\t\t\"SCMP_ARCH_X86\",\n\t\t\"SCMP_ARCH_X32\"\n\t],\n\t\"syscalls\": [\n\t]\n}\n"
  },
  {
    "path": "Docker/security/seccomp/seccomp-profiles/default-no-chmod.json",
    "content": "{\n\t\"defaultAction\": \"SCMP_ACT_ERRNO\",\n\t\"architectures\": [\n\t\t\"SCMP_ARCH_X86_64\",\n\t\t\"SCMP_ARCH_X86\",\n\t\t\"SCMP_ARCH_X32\"\n\t],\n\t\"syscalls\": [\n\t\t{\n\t\t\t\"name\": \"accept\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"accept4\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"access\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"alarm\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"bind\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"brk\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"capget\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"capset\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chdir\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chown\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chown32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"clock_getres\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"clock_gettime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"clock_nanosleep\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"close\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"connect\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"copy_file_range\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"creat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"dup\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"dup2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"dup3\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_create\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_create1\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_ctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_ctl_old\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_pwait\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_wait\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_wait_old\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"eventfd\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"eventfd2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"execve\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"execveat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"exit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"exit_group\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"faccessat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fadvise64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fadvise64_64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fallocate\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fanotify_mark\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchdir\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchown\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchown32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchownat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fcntl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fcntl64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fdatasync\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fgetxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"flistxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"flock\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fork\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fremovexattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fsetxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstat64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstatat64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstatfs\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstatfs64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fsync\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ftruncate\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ftruncate64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"futex\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"futimesat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getcpu\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getcwd\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getdents\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getdents64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getegid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getegid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"geteuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"geteuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getgroups\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getgroups32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getitimer\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpeername\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpgrp\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getppid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpriority\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getrandom\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getresgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getresgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getresuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getresuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getrlimit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"get_robust_list\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getrusage\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getsid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getsockname\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getsockopt\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"get_thread_area\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"gettid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"gettimeofday\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"inotify_add_watch\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"inotify_init\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"inotify_init1\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"inotify_rm_watch\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_cancel\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ioctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_destroy\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_getevents\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ioprio_get\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ioprio_set\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_setup\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_submit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ipc\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"kill\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lchown\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lchown32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lgetxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"link\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"linkat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"listen\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"listxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"llistxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"_llseek\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lremovexattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lseek\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lsetxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lstat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lstat64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"madvise\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"memfd_create\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mincore\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mkdir\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mkdirat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mknod\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mknodat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mmap\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mmap2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mprotect\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_getsetattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_notify\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_open\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_timedreceive\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_timedsend\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_unlink\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mremap\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msgctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msgget\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msgrcv\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msgsnd\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msync\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"munlock\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"munlockall\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"munmap\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"nanosleep\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"newfstatat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"_newselect\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"open\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"openat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pause\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"personality\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": [\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\"value\": 0,\n\t\t\t\t\t\"valueTwo\": 0,\n\t\t\t\t\t\"op\": \"SCMP_CMP_EQ\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"personality\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": [\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\"value\": 8,\n\t\t\t\t\t\"valueTwo\": 0,\n\t\t\t\t\t\"op\": \"SCMP_CMP_EQ\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"personality\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": [\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\"value\": 4294967295,\n\t\t\t\t\t\"valueTwo\": 0,\n\t\t\t\t\t\"op\": \"SCMP_CMP_EQ\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pipe\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pipe2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"poll\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ppoll\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"prctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pread64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"preadv\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"prlimit64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pselect6\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pwrite64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pwritev\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"read\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"readahead\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"readlink\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"readlinkat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"readv\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"recv\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"recvfrom\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"recvmmsg\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"recvmsg\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"remap_file_pages\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"removexattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rename\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"renameat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"renameat2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"restart_syscall\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rmdir\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigaction\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigpending\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigprocmask\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigqueueinfo\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigreturn\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigsuspend\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigtimedwait\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_tgsigqueueinfo\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_getaffinity\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_getattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_getparam\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_get_priority_max\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_get_priority_min\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_getscheduler\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_rr_get_interval\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_setaffinity\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_setattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_setparam\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_setscheduler\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_yield\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"seccomp\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"select\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"semctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"semget\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"semop\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"semtimedop\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"send\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendfile\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendfile64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendmmsg\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendmsg\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendto\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setfsgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setfsgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setfsuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setfsuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setgroups\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setgroups32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setitimer\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setpgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setpriority\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setregid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setregid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setresgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setresgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setresuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setresuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setreuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setreuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setrlimit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"set_robust_list\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setsid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setsockopt\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"set_thread_area\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"set_tid_address\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shmat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shmctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shmdt\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shmget\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shutdown\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sigaltstack\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"signalfd\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"signalfd4\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sigreturn\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"socket\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"socketcall\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"socketpair\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"splice\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"stat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"stat64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"statfs\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"statfs64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"symlink\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"symlinkat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sync\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sync_file_range\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"syncfs\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sysinfo\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"syslog\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"tee\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"tgkill\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"time\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_create\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_delete\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timerfd_create\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timerfd_gettime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timerfd_settime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_getoverrun\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_gettime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_settime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"times\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"tkill\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"truncate\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"truncate64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ugetrlimit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"umask\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"uname\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"unlink\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"unlinkat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"utime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"utimensat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"utimes\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"vfork\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"vmsplice\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"wait4\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"waitid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"waitpid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"write\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"writev\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"arch_prctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"modify_ldt\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chroot\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"clone\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": [\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\"value\": 2080505856,\n\t\t\t\t\t\"valueTwo\": 0,\n\t\t\t\t\t\"op\": \"SCMP_CMP_MASKED_EQ\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "Docker/security/seccomp/seccomp-profiles/default.json",
    "content": "{\n\t\"defaultAction\": \"SCMP_ACT_ERRNO\",\n\t\"architectures\": [\n\t\t\"SCMP_ARCH_X86_64\",\n\t\t\"SCMP_ARCH_X86\",\n\t\t\"SCMP_ARCH_X32\"\n\t],\n\t\"syscalls\": [\n\t\t{\n\t\t\t\"name\": \"accept\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"accept4\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"access\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"alarm\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"bind\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"brk\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"capget\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"capset\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chdir\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chmod\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chown\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chown32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"clock_getres\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"clock_gettime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"clock_nanosleep\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"close\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"connect\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"copy_file_range\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"creat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"dup\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"dup2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"dup3\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_create\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_create1\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_ctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_ctl_old\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_pwait\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_wait\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"epoll_wait_old\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"eventfd\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"eventfd2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"execve\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"execveat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"exit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"exit_group\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"faccessat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fadvise64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fadvise64_64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fallocate\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fanotify_mark\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchdir\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchmod\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchmodat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchown\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchown32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fchownat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fcntl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fcntl64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fdatasync\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fgetxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"flistxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"flock\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fork\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fremovexattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fsetxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstat64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstatat64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstatfs\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fstatfs64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fsync\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ftruncate\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ftruncate64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"futex\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"futimesat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getcpu\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getcwd\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getdents\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getdents64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getegid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getegid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"geteuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"geteuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getgroups\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getgroups32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getitimer\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpeername\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpgrp\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getppid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getpriority\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getrandom\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getresgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getresgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getresuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getresuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getrlimit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"get_robust_list\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getrusage\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getsid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getsockname\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getsockopt\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"get_thread_area\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"gettid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"gettimeofday\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"getxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"inotify_add_watch\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"inotify_init\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"inotify_init1\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"inotify_rm_watch\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_cancel\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ioctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_destroy\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_getevents\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ioprio_get\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ioprio_set\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_setup\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"io_submit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ipc\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"kill\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lchown\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lchown32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lgetxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"link\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"linkat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"listen\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"listxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"llistxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"_llseek\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lremovexattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lseek\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lsetxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lstat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"lstat64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"madvise\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"memfd_create\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mincore\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mkdir\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mkdirat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mknod\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mknodat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mmap\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mmap2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mprotect\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_getsetattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_notify\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_open\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_timedreceive\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_timedsend\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mq_unlink\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mremap\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msgctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msgget\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msgrcv\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msgsnd\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"msync\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"munlock\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"munlockall\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"munmap\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"nanosleep\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"newfstatat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"_newselect\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"open\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"openat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pause\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"personality\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": [\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\"value\": 0,\n\t\t\t\t\t\"valueTwo\": 0,\n\t\t\t\t\t\"op\": \"SCMP_CMP_EQ\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"personality\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": [\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\"value\": 8,\n\t\t\t\t\t\"valueTwo\": 0,\n\t\t\t\t\t\"op\": \"SCMP_CMP_EQ\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"personality\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": [\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\"value\": 4294967295,\n\t\t\t\t\t\"valueTwo\": 0,\n\t\t\t\t\t\"op\": \"SCMP_CMP_EQ\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pipe\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pipe2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"poll\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ppoll\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"prctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pread64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"preadv\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"prlimit64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pselect6\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pwrite64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"pwritev\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"read\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"readahead\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"readlink\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"readlinkat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"readv\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"recv\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"recvfrom\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"recvmmsg\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"recvmsg\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"remap_file_pages\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"removexattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rename\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"renameat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"renameat2\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"restart_syscall\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rmdir\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigaction\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigpending\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigprocmask\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigqueueinfo\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigreturn\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigsuspend\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_sigtimedwait\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"rt_tgsigqueueinfo\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_getaffinity\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_getattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_getparam\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_get_priority_max\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_get_priority_min\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_getscheduler\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_rr_get_interval\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_setaffinity\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_setattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_setparam\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_setscheduler\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sched_yield\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"seccomp\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"select\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"semctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"semget\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"semop\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"semtimedop\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"send\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendfile\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendfile64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendmmsg\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendmsg\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sendto\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setfsgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setfsgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setfsuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setfsuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setgroups\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setgroups32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setitimer\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setpgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setpriority\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setregid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setregid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setresgid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setresgid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setresuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setresuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setreuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setreuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setrlimit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"set_robust_list\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setsid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setsockopt\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"set_thread_area\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"set_tid_address\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setuid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setuid32\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"setxattr\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shmat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shmctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shmdt\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shmget\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"shutdown\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sigaltstack\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"signalfd\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"signalfd4\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sigreturn\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"socket\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"socketcall\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"socketpair\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"splice\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"stat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"stat64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"statfs\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"statfs64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"symlink\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"symlinkat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sync\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sync_file_range\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"syncfs\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"sysinfo\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"syslog\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"tee\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"tgkill\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"time\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_create\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_delete\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timerfd_create\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timerfd_gettime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timerfd_settime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_getoverrun\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_gettime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"timer_settime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"times\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"tkill\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"truncate\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"truncate64\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"ugetrlimit\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"umask\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"uname\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"unlink\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"unlinkat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"utime\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"utimensat\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"utimes\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"vfork\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"vmsplice\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"wait4\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"waitid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"waitpid\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"write\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"writev\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"arch_prctl\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"modify_ldt\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"chroot\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": []\n\t\t},\n\t\t{\n\t\t\t\"name\": \"clone\",\n\t\t\t\"action\": \"SCMP_ACT_ALLOW\",\n\t\t\t\"args\": [\n\t\t\t\t{\n\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\"value\": 2080505856,\n\t\t\t\t\t\"valueTwo\": 0,\n\t\t\t\t\t\"op\": \"SCMP_CMP_MASKED_EQ\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "Docker/security/seccomp/seccomp-profiles/deny.json",
    "content": "{\n\t\"defaultAction\": \"SCMP_ACT_ERRNO\",\n\t\"architectures\": [\n\t\t\"SCMP_ARCH_X86_64\",\n\t\t\"SCMP_ARCH_X86\",\n\t\t\"SCMP_ARCH_X32\"\n\t],\n\t\"syscalls\": [\n\t]\n}\n"
  },
  {
    "path": "Docker/security/secrets/README.md",
    "content": "# Secrets\n\n# Lab Meta\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 15 minutes\n\nIn this lab you'll learn how to create and manage *secrets* with Docker.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Create a Secret](#create)\n- [Step 2 - Manage Secrets](#manage)\n- [Step 3 - Access the secret within an app](#use)\n- [Step 4 - Clean-up](#clean)\n\nIn this lab the terms *service task* and *container* are used interchangeably.\nIn all examples in the lab a *service tasks* is a container that is running as\npart of a service.\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Docker Swarm cluster running **Docker 1.13** or higher\n\n# <a name=\"create\"></a>Step 1: Create a Secret\n\nIn this step you'll use the `docker secret create` command to create a new\n*secret*.\n\nPerform the following command from a *manager* node in your Swarm. This lab will assume that you are using **node1** in your lab.\n\n1. Create a new text file containing the text you wish to use as your secret.\n\n  ```\n  node1$ echo \"secrets are important\" > sec.txt\n  ```\n\n  The command shown above will create a new file called `sec.txt` in your\n  working directory containing the string **secrets are important**. The text\n  string in the file is arbitrary but should be kept secure. You should follow\n  any existing corporate guidelines about keeping secrets safe.\n\n2. Confirm that the file was created.\n\n  ```\n  node1$ ls -l\n  total 4\n  -rw-r--r-- 1 root root 10 Mar 21 18:40 sec.txt\n  ```\n\n3. Use the `docker secret create` command to create a new secret using the file\ncreated in the previous step.\n\n  ```\n  node1$ docker secret create sec1 ./sec.txt\n  ftu76ghgsk7f9fmcrj3wx3xcd\n  ```\n\n  The return code of the command is the ID of the newly created secret.\n\nCongratulations. You have created a new secret called `sec1`.\n\nIf you created the secret from a remote Docker client, it would be sent to a\nmanager node in the Swarm over a mutual TLS Connection. Once the secret is\nreceived on the manager node it is securely stored in the Swarm's Raft store\nusing the Swarm's native encryption.\n\nYou can now delete the `sec.txt` file used to create the secret.\n\n# <a name=\"manage\"></a>Step 2: Manage Secrets\n\nIn this step you'll use the `docker secret` sub-command to list and inspect\nsecrets.\n\nBefore going any further it's important to note that once a secret is created\nit is securely stored in the Swarm's encrypted Raft store. This means that you\ncannot view it in plain text using the `docker secret` command.\n\nPerform all of the following commands from a Swarm *manager*.  The lab assumes you will be using **node1** in your lab.\n\n1. List existing secrets with the `docker secret ls` command.\n\n  ```\n  node1$ docker secret ls\n  ID                     NAME      CREATED             UPDATED\n  ftu76ghg...rj3wx3xcd   sec1      11 seconds ago      11 seconds ago\n  ```\n\n2. Inspect the **sec1** secret.\n\n  ```\n  node1$ docker secret inspect sec1\n  [\n    {\n        \"ID\": \"ftu76ghgsk7f9fmcrj3wx3xcd\",\n        \"Version\": {\n            \"Index\": 113\n        },\n        \"CreatedAt\": \"2017-03-21T18:41:08.790769302Z\",\n        \"UpdatedAt\": \"2017-03-21T18:41:08.790769302Z\",\n        \"Spec\": {\n            \"Name\": \"sec1\"\n        }\n    }\n  ]\n  ```\n\n  Notice that the `docker secret inspect` command does not display the\n  unencrypted contents of the secret.\n\nYou can use the `docker secret rm` command to delete secrets. To delete the\n**sec1** secret you would use the command `docker secret rm sec1`. **Do not\ndelete the sec1 secret as you will use it in the next section.**\n\n\n# <a name=\"use\"></a>Step 3: Access the secret within an app\n\nIn this step you'll deploy a service and grant it access to the secret. You'll\nthen `exec` on to a task in the service and view the unencrypted contents of the\n secret.\n\nPerform the following commands from a *manager* node in the Swarm and be sure\nto remember that the outputs of the commands might be different in your lab.\nE.g. service tasks in your lab might be scheduled on different nodes to those\nshown in the examples below.\n\n1. Create a new service and attach the `sec1` secret.\n\n  ```\n  node1$ docker service create --name sec-test --secret=\"sec1\" redis:alpine\n  p858ush7oeei8647na2xa12sc\n  ```\n\n  This command creates a new service called **sec-test**. The service has a\n  single task (container), is given access to the **sec1** secret and is based\n  on the `redis:alpine` image.\n\n2. Verify the service is running.\n\n  ```\n  node1$ docker service ls\n  ID             NAME       MODE         REPLICAS   IMAGE\n  p858ush7oeei   sec-test   replicated   1/1        redis:alpine\n  ```\n\n3. Inspect the `sec-test` service to verify that the secret is associated with\nit.\n\n  ```\n  node1$ docker service inspect sec-test\n  [\n    {\n        \"ID\": \"p858ush7oeei8647na2xa12sc\",\n        \"Version\": {\n            \"Index\": 116\n        },\n        \"CreatedAt\": \"2017-03-21T19:37:52.254797962Z\",\n        \"UpdatedAt\": \"2017-03-21T19:37:52.254797962Z\",\n        \"Spec\": {\n            \"Name\": \"sec-test\",\n            \"TaskTemplate\": {\n                \"ContainerSpec\": {\n                    \"Image\": \"redis:alpine@sha256:9cd405cd...fb4ec7bdc3ee7\",\n                    \"DNSConfig\": {},\n                    \"Secrets\": [\n                        {\n                            \"File\": {\n                                \"Name\": \"sec1\",\n                                \"UID\": \"0\",\n                                \"GID\": \"0\",\n                                \"Mode\": 292\n                            },\n                            \"SecretID\": \"ftu76ghgsk7f9fmcrj3wx3xcd\",\n                            \"SecretName\": \"sec1\"\n                            <Snip>\n  ```\n\n  The output above shows that the `sec1` secret (ID:ftu76ghgsk7f9fmcrj3wx3xcd)\n  is successfully associated with the `sec-test` service. This is important as\n  it is what ultimately grants tasks within the service access to the secret.\n\n4. Obtain the name of any of the tasks in the `sec-test` service (if you've been\nfollowing along there will only be one task running in the service).\n\n  ```\n  //Run the following docker service ps command to see which node\n  the service task is running on.\n\n  node1$ docker service ps sec-test\n  ID          NAME        IMAGE         NODE    DESIRED STATE  CURRENT STATE   \n  9qqp...htd  sec-test.1  redis:alpine  node1   Running        Running 8 mins..\n\n  //Log on to the node running the service task (node1 in this example, but\n    might be different in your lab) and run a docker ps command.\n\n  node1$ docker ps --filter name=sec-test\n  CONTAINER ID    IMAGE                     COMMAND                  CREATED   STATUS      PORTS      NAMES\n  5652c1688f40    redis@sha256:9cd..c3ee7   \"docker-entrypoint...\"   15 mins   Up 15 mins  6379/tcp   sec-test.1.9qqp...vu2aw\n  ```\n\n  You will use the `CONTAINER ID` from the output above in the next step.\n\n  > NOTE: The two commands above start out by listing all the tasks in the\n  `sec-test` service. Part of the output of the first command shows the `NODE`\n  that each task is running on - in the example above this was a single task\n  running on **node1**. The next command (`docker ps`) lists all running\n  containers on **node1** and filters the results to show just the containers\n  where the name starts with **sec-test** - this means that only containers\n  (tasks) that are part of the `sec-test` service are displayed.\n\n5. Use the `docker exec` command to get a shell prompt on to the `sec-test`\nservice task. Be sure to substitute the Container ID in the command below with\na the container ID form your environment (see output of previous step).\n\n  ```\n  node1$ docker exec -it 5652c1688f40 sh\n  data#\n  ```\n\n  The `data#` prompt is a shell prompt inside the service task.\n\n6. List the contents of the container's `/run/secrets` directory.\n\n  ```\n  node1$ ls -l /run/secrets\n  total 4\n  -r--r--r--  1   root   root     10 Mar 21 19:37 sec1\n  ```\n\n  Secrets are only shared to *service tasks/containers* that are granted access\n  to them, and the secrets are shared with the *service task* via the TLS\n  connections that already exists between nodes in the Swarm. Once a *node* has\n  a secret it mounts it as a regular file into an in-memory filesystem inside\n  the authorized service task (container). This file is mounted at\n  `/run/secrets` with the same name as the secret. In the example above, the\n  `sec1` secret is mounted as a file called **sec1**.\n\n7. View the unencrypted contents of the *secret*.\n\n  ```\n  node1$ cat /run/secrets/sec1\n  secrets are important\n  ```\n\nIt's important to note several things about this unencrypted secret.\n\n- The secret is only made available to services that have been specifically\ngranted access to it (in our example this was via the `docker service create`\n  command).\n- The secret is issued to the service task by a manager in the Swarm via a\nmutually authenticated TLS connection.\n- Service tasks and nodes cannot request a secret - secrets are always issued\nto the node/task by a manager as part of a service deployment or update.\n- Secrets are only ever mounted to in-memory filesystems inside of authorized\ncontainers/tasks and are never persisted to disk on worker nodes or containers.\n- Nodes do not have access to the unencrypted secret.\n- Other tasks and containers on the same node do not get access to the secret.\n- As soon as a node is no longer running a task for a service it will delete\nthe secret from memory.\n\n**Congratulations**, you have completed this lab on Secrets management.\n\n# <a name=\"clean\"></a>Step 5: Clean-up\n\nIn this step you will remove all secrets and services,as well as clean up any other artifacts created in this lab.\n\n\n1. Remove all services on the host.\n\n   This command will remove **all** services on your Docker host. Only perform this step if you know you know you do not need any of the services running on your system.\n\n   ```\n   $ docker service rm $(docker service ls -q)\n   <Snip>\n   ```\n2. Remove all secrets on the host.\n\n   This command will remove **all** secrets on your Docker host. Only perform this step if you know you will not use these secrets again.\n\n   ```\n   $ docker secret rm $(docker secret ls -q)\n   <Snip>\n   ```\n\n3. If you haven;t already done so, delete the file that you used as the source of the secret data in Step 1. The lab assumed this was **node1** in your lab.\n\n   ```\n   $ rm sec.txt\n   ```\n"
  },
  {
    "path": "Docker/security/secrets-ddc/README.md",
    "content": "# Secrets\n\n# Lab Meta\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 15 minutes\n\nIn this lab you'll learn how to use Docker Universal Control Plane (UCP) to\ncreate a *secret* and use it with an application.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Create a Secret](#secret)\n- [Step 2 - Deploy an App](#deploy)\n- [Step 3 - Test the App](#test)\n- [Step 4 - View the Secret](#view)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A UCP cluster comprising nodes running **Docker 1.13** or higher\n- The public IP or public DNS name of at least one of your UCP cluster nodes\n- An account in UCP with permission to create secrets and deploy applications\n\n\n# <a name=\"secret\"></a>Step 1: Create a Secret\n\nIn this step you'll use the UCP web UI to create a new *secret*.\n\n1. Login in to UCP (your lab instructor will provide you with account details).\n\n2. From within UCP click `Resources` > `Secrets` > `+ Create Secret`.\n\n3. In the **NAME** field give the secret a name. The name is arbitrary but must\nbe unique.\n\n4. Enter a text string as the **VALUE** of the secret.\n\n5. Leave all other options as their default values.\n\n  The screenshot below shows a secret called **wp-1** with some plain text as\n  the value of the secret.\n\n  ![](images/secret1.png)\n\nThe screenshot below shows the **DETAILS** of the secret including its `ID`,\n`Name`, and `Permissions Label`. Notice that you cannot view the value of the\nsecret from with in the UCP UI. This is because it is stored securely in the\ncluster store. You can also click on the **SERVICES** tab to see any\nservices/applications that are using the secret. Right now there will be no\nservices using the secret.\n\n![](images/secret2.png)\n\nCongratulations, you've created a secret. The next step will show you how to\ndeploy an application that will use it.\n\n\n# <a name=\"deploy\"></a>Step 2: Deploy the App\n\nIn this step we'll deploy a simple WordPress app. To do that we'll complete the\nfollowing high level tasks:\n\n- Create a network for application\n- Create a service for the front-end portion of the application\n- Create a service for the back-end portion of the application\n\nPerform all of the following actions from the UCP web UI.\n\n1. Click the `Resources` tab > `Networks` > `+ Create Network`.\n\n2. Name the network **wp-net** and leave everything else as defaults.\n\n3. Click `Create` to create the network.\n\n  The `wp-net` is now created and ready to be used by the app.\n\n4. Click `Services` from within the `Resources` tab and then click `Create a\nService`.\n\n5. Give the service the following values and leave all others as default:\n\n  - **Details tab\\SERVICE NAME**: wp-db\n  - **Details tab\\IMAGE NAME**: mysql:5.7\n  - **Resources tab\\NETWORKS**: wp-net\n  - **Environment tab\\SECRET NAME**: wp-1\n  - **Environment tab\\ENVIRONMENT VARIABLE NAME**: MYSQL_ROOT_PASSWORD_FILE\n  - **Environment tab\\ENVIRONMENT VARIABLE VALUE**: /run/secrets/wp-1  \n\n  Let's quickly cover the 6 values we've configured as per above. The service\n  name is arbitrary, but `wp-db` suggests it will be our WordPress database. We\n  are using the `mysql:5.7` image because we know this works with the demo. We\n  are attaching the service to the `wp-net` network and we are telling it to use\n  the `wp-1` secret we created in Step 1.\n\n  The application also needs to know where to find the secret that will give it\n  access to the database. It expects this value in an environment variable\n  called `MYSQL_ROOT_PASSWORD_FILE`. By default, Docker will mount secrets into\n  the container filesystem at `/run/secrets/<secret-name>`, so we tell the\n  application to expect the secret in the `/run/secrets/wp-1` file. This is\n  mounted as an in-memory read-only filesystem.\n\n6. Click `Deploy Now` to deploy the service.\n\n7. Deploy the front-end service by clicking `Services` from within the\n`Resources` tab and then click `Create a Service`.\n\n8. Give the service the following values and leave all others as default:\n\n  - **Details tab\\SERVICE NAME**: wp-fe\n  - **Details tab\\IMAGE NAME**: wordpress:latest\n  - **Resources tab\\Ports\\INTERNAL PORT**: 80\n  - **Resources tab\\Ports\\PUBLIC PORT**: 8000\n  - **Resources tab\\NETWORKS**: wp-net\n  - **Environment tab\\SECRET NAME**: wp-1\n  - **Environment tab\\ENVIRONMENT VARIABLE NAME**: WORDPRESS_DB_PASSWORD_FILE\n  - **Environment tab\\ENVIRONMENT VARIABLE VALUE**: /run/secrets/wp-1\n  - **Environment tab\\ENVIRONMENT VARIABLE NAME**: WORDPRESS_DB_HOST\n  - **Environment tab\\ENVIRONMENT VARIABLE VALUE**: wp-db:3306\n\n  We are calling this service `wp-fe` indicating it is the WorPress front-end.\n  We're telling it to use the `wordpress:latest` image and expose port `80` from\n  the service/container on port `8000` on the host - this will allow us to\n  connect to the service on port `8000` in a later step. We're attaching it to\n  the same `wp-net` network and mounting the same secret. This time we're\n  adding an additional environment variable `WORDPRESS_DB_HOST=wp-db:3306`.\n  This is telling the service that it can talk to the database backend via a\n  service called `wp-db` on port `3306`.\n\n9. Click `Deploy Now` to deploy the service\n\nThe application is now deployed!\n\nAs shown in the diagram below you have deployed two services. `wp-fe` is the\napplication's web front end, and `wp-db` is the application's database back-end.\nBoth services are deployed on the `wp-net` network and both have the `wp-1`\nsecret mounted to a file called `wp-1` in the `/run/secrets` in-memory\nfilesystem. You also inserted environment variables into each service telling\nthem things like where to find the database service and where to find the\nsecret.\n\n![](images/secret3.png)\n\nYou also published the web front end portion of the application (the `wp-fe`\n  service) on port `8000`. This means that you should be able to connect to the\n  application on port `8000` of any of the nodes in your DDC/UCP cluster.\n\n\n# <a name=\"test\"></a>Step 3: Test the Application\n\nIn this step you will use a web browser to connect to the application. You will\nknow the application is working correctly if the web page renders correctly and\nthere are no database related errors displayed.\n\n1. Open a web browser and point it to the public IP or DNS name of any of the\nnodes in your UCP cluster on port `8000`\n\n  > NOTE: Your lab instructor will be able to give you details of the public IP\nor public DNS of your UCP nodes.\n\n  ![](images/secret4.png)\n\n\n# <a name=\"view\"></a>Step 3: View the Secret\n\nIn this step you'll log on to the terminal of the container in the `web-fe`\nservice and verify that the secret is present.\n\nPerform all of the following steps from within the UCP web UI.\n\n1. Click the `Resources` tab > `Services` and click on the `web-fe` service.\n\n2. Click the `Tasks` tab.\n\n3. Click the running task (there will only be one).\n\n4. Click the `Console` tab for the task.\n\n5. Make sure that the command to run is showing as `sh` and then click `Run`.\n\n  You are now on the terminal of the `web-fe` service's container.\n\n6. Run the following command to verify that the secret file exists.\n\n    ```\n    # ls -l /run/secrets/\n    total 4\n    -r--r--r--  1  root  root  81 Mar 17 10:20   wp-1\n    ```\n\n  The `/run/secrets/` directory is mounted read-only as an in-memory\n  filesystem that is only mounted into this container and using reserved\n  memory on the Docker host. This ensures it's contents are secure.\n\n7. View the contents of the secret.\n\n    ```\n    # cat /run/secrets/wp-1\n    I want to be with those who know secret things or else alone - Rainer Maria Rilke\n    ```\n\n  The contents of the secret are visible as unencrypted plain text. This is so\n  that applications can use them as passwords. However, they are issued to the\n  container via a secure network and mounted as read-only in an in-memory\n  filesystem that is not accessible to the Docker host or other containers\n  (unless other containers have also been granted access to it).\n\n\n**Congratulations**, you have completed this lab on Secrets management.\n"
  },
  {
    "path": "Docker/security/swarm/README.md",
    "content": "# Swarm Mode Security\n\n# Lab Meta\n\n> **Difficulty**: Beginner\n\n> **Time**: Approximately 15 minutes\n\nIn this lab you'll build a new Swarm and view some of the built-in security\nfeatures of *Swarm mode*. These include *join tokens* and *client certificates*.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Create a new Swarm](#swarm_init)\n- [Step 2 - Add a new Manager](#add_mgr)\n- [Step 3 - Add a new Worker](#add_wrkr)\n- [Step 4 - Rotate Join Keys](#rotate_join)\n- [Step 5 - View certificates](#certs)\n- [Step 6 - Rotate certificates](#rotate_certs)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- Four Linux-based Docker hosts running **Docker 1.13** or higher and **not**\nconfigured for Swarm Mode. You should use **node1**, **node2**, **node3**, and\n**node4** from your lab.\n- This lab was built and tested using Ubuntu 16.04\n\n>NOTE: Things like IP addresses and Swarm *join tokens* will be different in\nyour lab. Remember to substitute the values shown here in the lab guide for the real values in your lab.\n\n# <a name=\"swarm_init\"></a>Step 1: Create a new Swarm\n\nIn this step you'll initialize a new Swarm and verify that the operation worked.\n\nFor this lab to work you will need your Docker hosts running in\n*single-engine mode* and not in *Swarm mode*.\n\n1. Execute the following command on **node1**.\n\n    ```\n    node1$ docker swarm init\n    Swarm initialized: current node (kgwuvt1oqhqjsht0qcsq67rvu) is now a\n    manager.\n\n    To add a worker to this swarm, run the following command:\n\n    docker swarm join \\\n    --token SWMTKN-1-4h5log5xpip966...y6gdy1-44v7nl9i0...k4fb8dlf21 \\\n    172.31.45.44:2377\n\n    To add a manager to this swarm, run 'docker swarm join-token manager' and\n    follow the instructions.\n\n    ```\n\n  The command above has created a brand new Swarm and made **node1** the first\n  *manager* of the Swarm. The first manager of any Swarm is automatically made\n  the *leader* and the *Certificate Authority (CA)* for the Swarm. If you\n  already have a CA and do not want Swarm to generate a new one, you can use\n  the `--external-ca` flag to specify an external CA.\n\n2. Verify that the Swarm was created successfully and that **node1** is the\nleader of the new Swarm with the following command.\n\n    ```\n    node1$ docker node ls\n    ID                       HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS\n    kgwuvt...0qcsq67rvu *    node1      Ready   Active        Leader\n    ```\n\n  The command above will list all nodes in the Swarm. Notice that the output\n  only lists one node and that the node is also the *leader*.\n\n3. Run a `docker info` command and view the Swarm related information.\n\n    ```\n    node1$ docker info\n    ...\n    <Snip>\n    Swarm: active\n      NodeID: kgwuvt1oqhqjsht0qcsq67rvu\n      Is Manager: true\n      ClusterID: ohgi9ctpbev24dl6daf7insou\n      Managers: 1\n      Nodes: 1\n      Orchestration:\n       Task History Retention Limit: 5\n      Raft:\n      Snapshot Interval: 10000\n      Number of Old Snapshots to Retain: 0\n      Heartbeat Tick: 1\n      Election Tick: 3\n     Dispatcher:\n      Heartbeat Period: 5 seconds\n     CA Configuration:\n      Expiry Duration: 3 months\n     ...\n    ```\n\n  The important things to note from the output above are; `nodeID`,\n  `ClusterID`, `CA Configuration`.\n\nIt is important to know that the `docker swarm init` command performs at least\ntwo important security related operations:\n- It creates a new CA (unless you specify `--external-ca`) and creates a\nkey-pair to secure communications within the Swarm\n- It creates two *join tokens* - one to join new *workers* to the Swarm, and the\nother to join new *managers* to the Swarm.\n\nWe will look at these in the following steps.\n\n# <a name=\"add_mgr\"></a>Step 2: Add a new Manager\n\nNow that you have a Swarm initialized, it's time to add another Manager.\n\nIn order to add a new Manager you must know the manager *join token* for the\nSwarm you wish to join it to. The process below will show you how to obtain the\nmanager *join token* and use it to add **node2** as a new manager in the Swarm.\n\n1. Use the `docker swarm join-token` command to get the *manager* join token.\n\n    ```\n    node1$ docker swarm join-token manager\n    To add a manager to this swarm, run the following command:\n\n    docker swarm join \\\n    --token SWMTKN-1-4h5log5xpip966c6c...z2cy6gdy1-7y6lqwu6...goyf26yyg2 \\\n    172.31.45.44:2377\n    ```\n  The output of the command gives you the full command, including the join\n  token, that you can run on any Docker node to join it as a manager.\n\n  > NOTE: The join token includes a digest of the root CA's certificate, as well as a\n  randomly generated secret. The format is as follows:\n  **SWMTKN-1-< digest-of-root-CA-cert>-< random-secret >**.\n\n2. Copy and paste the command in to **node2**. Remember to use the command and\njoin token for your lab, and not the value shown in this lab guide.\n\n    ```\n    node2$ docker swarm join \\\n    --token SWMTKN-1-4h5log5xpip966c6c...z2cy6gdy1-7y6lqwu6...goyf26yyg2 \\\n    172.31.45.44:2377\n\n    This node joined a swarm as a manager.\n    ```\n\n3. Run the `docker node ls` command from either **node1** or **node2** to list\nthe nodes in the Swarm.\n\n    ```\n    node1$ docker node ls\n    ID                      HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS\n    ax2cmh63...tvjp8trs4    node2      Ready   Active        Reachable\n    kgwuvt1o...qcsq67rvu *  node1      Ready   Active        Leader\n    ```\n\nThe *join token* used in the commands above will join any node to your Swarm as\na *manager*. This means it is vital that you keep the join tokens private -\nanyone in possession of it can join nodes to the Swarm as managers.\n\n# <a name=\"add_wrkr\"></a>Step 3: Add a new Worker\n\nAdding a worker is the same process as adding a manager. The only difference is\nthe token used. Every Swarm maintains one *manager* join token and one\n*worker* join token.\n\n1. Run a `docker swarm join-token` command from any of the managers in your\nSwarm to obtain the command and token required to add a new worker node.\n\n    ```\n    node1$ docker swarm join-token worker\n    To add a worker to this swarm, run the following command:\n\n    docker swarm join \\\n    --token SWMTKN-1-4h5log5xpip966c6c...z2cy6gdy1-44v7nl9...b8dlf21 \\\n    172.31.45.44:2377\n    ```\n  Notice that the join token for managers and workers share some of the same\n  values. Both start with \"SWMTKN-1\", and both share the same Swarm root CA\n  digest. It is only the last part of the token that determines if\n  the token is for a manager or worker.\n\n2. Switch to **node3** and paste in the command from the previous step.\n\n    ```\n    node3$ docker swarm join \\\n    --token SWMTKN-1-4h5log5xpip966c6c...z2cy6gdy1-44v7nl9...b8dlf21 \\\n    172.31.45.44:2377\n\n    This node joined a swarm as a worker.\n    ```\n\n3. Switch back to one of the manager nodes (**node1** or **node2**) and run a\n`docker node ls` command to verify the node was added as a worker.\n    ```\n    node1$ docker node ls\n    ID                   HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS\n    ax2cm...vjp8trs4     node2      Ready   Active        Reachable\n    kgwuv...csq67rvu *   node1      Ready   Active        Leader\n    mfg9d...inwonsjh     node3      Ready   Active\n    ```\n\n    The output above shows that **node3** was added to the Swarm and is\n    operating as a worker - the lack of a value in the **MANAGER STATUS**\n    column indicates that the node is a *worker*.\n\n# <a name=\"rotate_join\"></a>Step 4: Rotate Join Keys\n\nIn this step you will rotate the Swarms *worker* join-key. This will invalidate\nthe worker join-key used in previous steps. It will not affect the status of\nworkers already joined to the Swarm, this means all existing workers will\ncontinue to be valid workers in the Swarm.\n\nYou will test that the *rotate operation* succeeded by attempting to add a new\nworker with the old key. This operation will fail. You will then retry the\noperation with the new key. This time it will succeed.\n\n1. Rotate the existing worker key by execute the following command from either\nof the Swarm managers.\n\n    ```\n    node1$ docker swarm join-token --rotate worker\n    Successfully rotated worker join token.\n\n    To add a worker to this swarm, run the following command:\n\n      docker swarm join \\\n      --token SWMTKN-1-4h5log5xpip...cy6gdy1-55k4ywd...z5xtns4eq \\\n      172.31.45.44:2377\n    ```\n\n    Notice that the new join token still starts with `SWMTKN-1` and keeps the\n    same digest of the Swarms root CA `4h5log5...`. It is only the last part of\n    the token that has changed. This is because the new token is still a Swarm\n    join token for the same Swarm. The system has only rotated the *secret*\n    used to add new workers (the last portion).\n\n2. Log on to **node4** and attempt to join the Swarm using the **old** join\ntoken. You should be able to find the old join token in the terminal window of\n**node3** from a previous step.\n\n    ```\n    node4$ docker swarm join \\\n    --token SWMTKN-1-4h5log5xpi...duz2cy6gdy1-44v7nl9...4fb8dlf21 \\\n    172.31.45.44:2377\n\n    Error response from daemon: rpc error: code = 3 desc = A valid join token\n    is necessary to join this cluster\n    ```\n  The operation fails because the join token is no longer valid.\n\n3. Retry the previous operation using the new join token given as the output to\nthe `docker swarm join-token --rotate worker` command in a previous step.\n\n    ```\n    node4$ docker swarm join \\\n    --token SWMTKN-1-4h5log5...wzqlduz2cy6gdy1-55k4ywd...xtns4eq \\\n    172.31.45.44:2377\n\n    This node joined a swarm as a worker.\n    ```\n\nRotating join tokens is something that you will need to do if you suspect your\nexisting join tokens have been compromised. It is important that you manage\nyour join-tokens carefully. This is because unauthorized nodes joining the\nSwarm is a security risk.\n\n# <a name=\"certs\"></a>Step 5: View certificates\n\nEach time a new *manager* or *worker* joins the Swarm it is issued with a\n*client certificate*. This client certificate is used in conjunction with the\nexisting Swarm public key infrastructure (PKI) to authenticate the node and\nencrypt communications.\n\nThere are three important things to note about the *client certificate*:\n1. It specifies which Swarm the node is an authorized member of\n2. It contains the node ID\n3. It specifies the role the node is authorized to perform in the Swarm\n(*worker* or *manager*)\n\n\nExecute the following command from any node in your Swarm to view the nodes\n*client certificate*.\n\n\n    node1$ openssl x509 -in /var/lib/docker/swarm/certificates/swarm-node.crt -text\n\n    Certificate:\n      Data:\n          Version: 3 (0x2)\n          Serial Number:\n              59:53:84:47:3a:2d:15:5b:f0:39:46:93:dd:21:68:ad:70:62:40:d1\n      Signature Algorithm: ecdsa-with-SHA256\n          Issuer: CN=swarm-ca\n          Validity\n              Not Before: Mar 14 11:42:00 2017 GMT\n              Not After : Jun 12 12:42:00 2017 GMT\n          Subject: O=ohgi9...insou, OU=swarm-manager, CN=kgwuvt...csq67rvu\n          ...\n\nThe important things to note about the output above are the three fields on the\nbottom line:\n\n- The Organization (O) field contains the Swarm ID\n- The Organization Unit (OU) field contains the nodes *role*\n- The Common Name (CN) field contains the nodes ID\n\nThese three fields make sure the node operates in the correct Swarm, operates in\nthe correct role, and is the node it says it is.\n\nYou can use the `docker swarm update --cert-expiry <TIME PERIOD>` command to\nchange frequency at which the client certificates in the Swarm are renewed. The\ndefault is 90 days (3 months).\n\n# <a name=\"rotate_certs\"></a>Step 6: Rotate certificates\n\nIn this step you'll view the existing certificate rotation period for your\nSwarm, and then alter that period.\n\nPerform the following commands from a manager node in your Swarm.\n\n1. Use the `docker info` command to view the existing certificate rotation\nperiod enforced in your Swarm.\n\n```\nnode1$ docker info\nSwarm: active\n NodeID: kgwuvt1oqhqjsht0qcsq67rvu\n Is Manager: true\n ClusterID: ohgi9ctpbev24dl6daf7insou\n Managers: 2\n Nodes: 4\n Orchestration:\n  Task History Retention Limit: 5\n Raft:\n  Snapshot Interval: 10000\n  Number of Old Snapshots to Retain: 0\n  Heartbeat Tick: 1\n  Election Tick: 3\n Dispatcher:\n  Heartbeat Period: 5 seconds\n CA Configuration:\n  Expiry Duration: 3 months\n```  \n\n  The last two lines of the output above show that the current rotation period\n  (**Expiry Duration**) is **3 months**.\n\n2. Use the `docker swarm update` command to change the rotation period.\n\n```\nnode1$ docker swarm update --cert-expiry 168h\nSwarm updated.\n```\n\n  The `--cert-expiry` flag accepts time periods in the format `00h00m00s`,\n  where `h` is for hours, `m` is for minutes, and `s` is for seconds. The\n  example above sets the rotation period to 168 hours (7 days).\n\n3. Run another `docker info` to check that the value has changed.\n\n```\nnode1$ docker info\nSwarm: active\n NodeID: kgwuvt1oqhqjsht0qcsq67rvu\n Is Manager: true\n ClusterID: ohgi9ctpbev24dl6daf7insou\n Managers: 2\n Nodes: 4\n Orchestration:\n  Task History Retention Limit: 5\n Raft:\n  Snapshot Interval: 10000\n  Number of Old Snapshots to Retain: 0\n  Heartbeat Tick: 1\n  Election Tick: 3\n Dispatcher:\n  Heartbeat Period: 5 seconds\n CA Configuration:\n  Expiry Duration: 7 days\n```  \n\n**Congratulations**, you have completed this lab on basic Swarm security.\n"
  },
  {
    "path": "Docker/security/trust/README.md",
    "content": "# Lab: Distribution and Trust\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 30 minutes\n\nThis lab focuses on understanding and securing image distribution. We'll\nstart with a simple `docker pull` and build up to using Docker Content Trust (DCT).\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Pulling images by tag](#tag)\n- [Step 2 - Pulling images by digest](#digest)\n- [Step 3 - Docker Content Trust](#trust)\n- [Step 4 - Official Images](#official)\n- [Step 5 - Extra for experts](#extra)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Docker Host running Docker 1.10 or higher (preferably Docker 1.12 or higher).\n- This lab uses environment variables which can be clunky when working with `sudo`. Therefore none of the Docker commands in this particular lab are preceded with `sudo`.\n\n# <a name=\"tag\"></a>Step 1: Pulling images by tag\n\nThe most common and basic way to pull Docker images is by `tag`. The is where you specify an image name followed by an alphanumeric tag. The image name and tag are separated by a colon `:`. For example:\n\n   ```\n   $ docker pull alpine:edge\n   ```\n\nThis command will pull the Alpine image tagged as `edge`. The corresponding image can be found [here on Docker Store](https://store.docker.com/images/alpine).\n\nIf no tag is specified, Docker will pull the image with the `latest` tag.\n\n1. Pull the Alpine image with the `edge` tag.\n\n   ```\n   $ docker pull alpine:edge\n\n   edge: Pulling from library/alpine\n   e587fa4f6e1f: Pull complete\n   Digest: sha256:e5ab6f0941eb01c41595d35856f16215021a941e9893501d632ed4c0ee4e53a6\n   Status: Downloaded newer image for alpine:edge\n   ```\n\n2. Confirm that the pull was successful.\n\n   ```\n   $ docker images\n\n   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE\n   alpine              edge                3fc33d6d5e74        4 weeks ago         4.799 MB\n   ```\n\n3. Run a new container from the image and ping www.docker.com.\n\n   ```\n   $ docker run --rm -it alpine:edge sh\n\n   / # ping www.docker.com\n   PING www.docker.com (104.239.220.248): 56 data bytes\n   64 bytes from 104.239.220.248: seq=0 ttl=40 time=94.424 ms\n   64 bytes from 104.239.220.248: seq=1 ttl=40 time=94.549 ms\n   64 bytes from 104.239.220.248: seq=2 ttl=40 time=94.455 ms\n   ^C\n   ```\n\n4. Exit the container.\n\nIn this step you pulled an image by tag and verified the pull by running a container from it.\n\n# <a name=\"digest\"></a>Step 2: Pulling images by digest\n\nPulling by tag is easy and convenient. However, tags are mutable, and the same tag can refer to different images over time. For example, you can add updates to an image and push the updated image using the same tag as a previous version of the image. This scenario where a single tag points to multiple versions of an image can lead to bugs and vulnerabilities in your production environments.\n\nThis is why pulling by digest is such a powerful operation. Thanks to the content-addressable storage model used by Docker images, we can target pulls to specific image contents by pulling by digest. In this step you'll see how to pull by digest.\n\n1.  Pull the Alpine image with the `sha256:b7233dafbed64e3738630b69382a8b231726aa1014ccaabc1947c5308a8910a7` digest.\n\n   ```\n   $ docker pull alpine@sha256:b7233dafbed64e3738630b69382a8b231726aa1014ccaabc1947c5308a8910a7\n\n   sha256:b7233dafbed64e3738630b69382a8b231726aa1014ccaabc1947c5308a8910a7: Pulling from library/alpine\n   6589332ef57c: Pull complete\n   Digest: sha256:b7233dafbed64e3738630b69382a8b231726aa1014ccaabc1947c5308a8910a7\n   Status: Downloaded newer image for alpine@sha256:b7233dafbed64e3738630b69382a8b231726aa1014ccaabc1947c5308a8910a7\n   ```\n\n2. Check that the pull succeeded.\n\n   ```\n   $ docker images --digests alpine\n\n   REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE\n   alpine              edge                <none>                                                                    3fc33d6d5e74        4 weeks ago         4.799 MB\n   alpine              <none>              sha256:b7233dafbed64e3738630b69382a8b231726aa1014ccaabc1947c5308a8910a7   79c898d40088        7 weeks ago         4.799 MB\n   ```\n\n   Notice that there are now two Alpine images in the Docker Hosts local repository. One lists the `edge` tag. The other lists `<none>` as the tag along with the `b7233daf...` digest.\n\nThe content addressable storage model used by Docker images means that any changes made to an image will result in a new digest for the updated image. This means it is not possible for two images with different contents to have the same digest.\n\nIn this step you learned how to pull images by digest and list image digests using the `docker images` command. For more information about the `docker pull` command, see the [documentation](https://docs.docker.com/engine/reference/commandline/pull/).\n\n# <a name=\"trust\"></a>Step 3: Docker Content Trust\n\nIt's not easy to find the digest of a particular image tag. This is because it is computed from the hash of the image contents and stored in the image manifest. The image manifest is then stored in the Registry. This is why we needed a `docker pull` by tag to find digests previously. It would also be desirable to have additional security guarantees such as image freshness.\n\nEnter Docker Content Trust: a system currently in the Docker Engine that verifies the publisher of images without sacrificing usability. Docker Content Trust implements [The Update Framework](https://theupdateframework.github.io/) (TUF), an NSF-funded research project succeeding Thandy of the Tor project. TUF uses a key hierarchy to ensure recoverable key compromise and robust freshness guarantees.\n\nUnder the hood, Docker Content Trust handles name resolution from IMAGE tags to IMAGE digests by signing its own metadata -- when Content Trust is enabled, docker will verify the signatures and expiration dates in the metadata before rewriting a pull by tag command to a pull by digest.\n\nIn this step you will enable Docker Content Trust, sign images as you push them, and pull signed and unsigned images.\n\n1.  Enable Docker Content Trust by setting the DOCKER_CONTENT_TRUST environment variable.\n\n   ```\n   $ export DOCKER_CONTENT_TRUST=1\n   ```\n\n   > **Note:** If you are using `sudo` with your Docker commands, you will need to preceded the above command so that it looks like this`sudo export DOCKER_CONTENT_TRUST=1`\n\n   It is worth nothing that although Docker Content Trust is now enabled, all Docker commands remain the same. Docker Content Trust will work silently in the background.\n\n2. Pull the `riyaz/dockercon:trust` signed image.\n\n   ```\n   $ docker pull riyaz/dockercon:trust\n\n   Pull (1 of 1): riyaz/dockercon:trust@sha256:88a7163227a54bf0343aae9e7a4404fdcdcfef8cc777daf9686714f4376ede46\n   sha256:88a7163227a54bf0343aae9e7a4404fdcdcfef8cc777daf9686714f4376ede46: Pulling from riyaz/dockercon\n   fae91920dcd4: Pull complete\n   Digest: sha256:88a7163227a54bf0343aae9e7a4404fdcdcfef8cc777daf9686714f4376ede46\n   Status: Downloaded newer image for riyaz/dockercon@sha256:88a7163227a54bf0343aae9e7a4404fdcdcfef8cc777daf9686714f4376ede46\n   Tagging riyaz/dockercon@sha256:88a7163227a54bf0343aae9e7a4404fdcdcfef8cc777daf9686714f4376ede46 as riyaz/dockercon:trust\n   ```\n\n   Look closely at the output of the `docker pull` command and take particular notice of the name translation - how the command is translated to the digest as shown below:\n\n   ```\n   Pull (1 of 1): riyaz/dockercon:trust@sha256:88a7163227a54bf0343aae9e7a4404fdcdcfef8cc777daf9686714f4376ede46\n   ```\n\n3.  Pull and unsigned image.\n\n   ```\n   $ docker pull riyaz/dockercon:untrusted\n\n   No trust data for untrusted\n   ```\n\n   You cannot pull unsigned images with Docker Content Trust enabled. Once Docker Content Trust is enabled you can only pull, run, or build with trusted images.\n\n4.  Tag and push your own signed image with Docker Content Trust.\n\n   ```\n   $ docker tag alpine:edge <your-docker-id>/alpine:trusted\n   $ docker push <your-docker-id>/alpine:trusted\n\n   The push refers to a repository [docker.io/nigelpoulton/alpine]\n   4fe15f8d0ae6: Pushed\n   trusted: digest: sha256:dc89ce8401da81f24f7ba3f0ab2914ed9013608bdba0b7e7e5d964817067dc06 size: 528\n   Signing and pushing trust metadata\n   You are about to create a new root signing key passphrase. This passphrase\n   will be used to protect the most sensitive key in your signing system. Please\n   choose a long, complex passphrase and be careful to keep the password and the\n   key file itself secure and backed up. It is highly recommended that you use a\n   password manager to generate the passphrase and keep it safe. There will be no way to recover this key. You can find the key in your config directory.\n   Enter passphrase for new root key with ID fef644e:\n   Repeat passphrase for new root key with ID fef644e:\n   Enter passphrase for new repository key with ID b4fd76d (docker.io/nigelpoulton/alpine):\n   Repeat passphrase for new repository key with ID b4fd76d (docker.io/nigelpoulton/alpine):\n   Finished initializing \"docker.io/nigelpoulton/alpine\"\n   Successfully signed \"docker.io/nigelpoulton/alpine\":trusted\n   ```\n\n   This command will prompt you for passphrases. This is because\n   Docker Content Trust is generating a hierarchy of keys with different signing roles. Each key is encrypted with a passphrase, and it is best practice is to provide different passphrases for each key.\n\n   The **root key** is the most important key in TUF as it can rotate any other key in the system. The root key should be kept offline, ideally in hardware crypto device. It is stored in `~/.docker/trust/private/root_keys` by default.\n\n   The **tagging key** is the only local key required to push new tags to an existing repo, and is stored in `~/.docker/trust/private/tuf_keys` by default.\n\n   Feel free to explore the `~/.docker/trust` directory to view the internal metadata and key information that Docker Content Trust generates.\n\n5. Disable Docker Content Trust.\n\n   ```\n   $ export DOCKER_CONTENT_TRUST=0\n   ```\n\n6. Pull the image you just pushed in the previous step.\n\n   ```\n   $ docker pull <your-docker-id>/alpine:trusted\n\n   trusted: Pulling from nigelpoulton/alpine\n   Digest: sha256:dc89ce8401da81f24f7ba3f0ab2914ed9013608bdba0b7e7e5d964817067dc06\n   Status: Image is up to date for nigelpoulton/alpine:trusted\n   ```\n\n7. Enable Docker Content Trust.\n\n   ```\n   $ export DOCKER_CONTENT_TRUST=1\n   ```\n\n8. Pull the same image again.\n\n   ```\n   $ docker pull <your-docker-id>/alpine:trusted\n\n   Pull (1 of 1): nigelpoulton/alpine:trusted@sha256:dc89ce8401da81f24f7ba3f0ab2914ed9013608bdba0b7e7e5d964817067dc06\n   sha256:dc89ce8401da81f24f7ba3f0ab2914ed9013608bdba0b7e7e5d964817067dc06: Pulling from nigelpoulton/alpine\n   Digest: sha256:dc89ce8401da81f24f7ba3f0ab2914ed9013608bdba0b7e7e5d964817067dc06\n   Status: Downloaded newer image for nigelpoulton/alpine@sha256:dc89ce8401da81f24f7ba3f0ab2914ed9013608bdba0b7e7e5d964817067dc06\n   Tagging nigelpoulton/alpine@sha256:dc89ce8401da81f24f7ba3f0ab2914ed9013608bdba0b7e7e5d964817067dc06 as nigelpoulton/alpine:trusted\n   ```\n\n   Take note of the difference between the pull of a signed image with Docker Content Trust enabled and disabled. With Docker Content Trust enabled the image pull is converted from a tagged image pull to a digest image pull.\n\nIn this step you have seen how to enable and disable Docker Content Trust. You have also seen how to sign images that you push. For more information about Docker Content Trust, see [the documentation](https://docs.docker.com/engine/security/trust/).\n\n# <a name=\"official\"></a>Step 4: Official images\n\nAll images in Docker Hub under the `library` organization (currently viewable at: https://hub.docker.com/explore/)\nare deemed \"Official Images.\"  These images undergo a rigorous, [open-source](https://github.com/docker-library/official-images/)\nreview process to ensure they follow best practices. These best practices include signing, being lean, and having clearly written Dockerfiles. For these reasons, it is strongly recommended that you use official images whenever possible.\n\nOfficial images can be pulled with just their name and tag. You do not have to precede the image name with `library/` or any other repository name.\n\n\n# <a name=\"extra\"></a>Step 5: Extra for Experts\n\nDocker Content Trust is powered by [Notary](https://github.com/docker/notary), an open-source TUF-client and server that can operate over arbitrary trusted collections of data. Notary has its own CLI with robust features\nsuch as the ability to rotate keys and remove trust data. In this step you will play with the Notary CLI and a local instance of the Notary server instead of the one deployed alongside Docker Hub.\n\n1.  Get a notary client.\n\n   This can be done by downloading a binary directly from the [releases page](https://github.com/docker/notary/releases), or by cloning the notary repository into a valid Go repository structure (instructions at the end of the README) and building a client by running `make binaries`. If you build the notary binary yourself, it will be placed in the `bin` subdirectory within the notary git repo directory.\n\n2.  Use the notary client to inspect the existing Alpine repository on Docker Hub.\n\n```\n   $ notary -s https://notary.docker.io -d ~/.docker/trust list docker.io/library/alpine\n\n   NAME                                 DIGEST                                SIZE (BYTES)    ROLE\n------------------------------------------------------------------------------------------------------\n2.6      e9cec9aec697d8b9d450edd32860ecd363f2f3174c8338beb5f809422d182c63   1374           targets\n2.7      9f08005dff552038f0ad2f46b8e65ff3d25641747d3912e3ea8da6785046561a   1374           targets\n3.1      0796cca706c64170c29cfefbdd67f32e25dab2247fc31956c86773dae825800f   506            targets\n3.2      9c6c40abb6a9180603068a413deca450ef13c381974b392a25af948ca87c3c14   506            targets\n3.3      4fa633f4feff6a8f02acfc7424efd5cb3e76686ed3218abf4ca0fa4a2a358423   506            targets\n3.4      3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73a   506            targets\nedge     e5ab6f0941eb01c41595d35856f16215021a941e9893501d632ed4c0ee4e53a6   506            targets\nlatest   3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73a   506            targets\n```\n\n   Note that `docker.io/` must be prepended to the image name for hub images.  You should also try your own image you pushed to hub earlier!\n\n3.  If you haven't already, clone the [Notary](https://github.com/docker/notary) repository.\n\n   ```\n   $ git clone https://github.com/docker/notary.git\n\n   Cloning into 'notary'...\n   remote: Counting objects: 17156, done.\n   remote: Compressing objects: 100% (26/26), done.\n   remote: Total 17156 (delta 5), reused 0 (delta 0), pack-reused 17129\n   Receiving objects: 100% (17156/17156), 27.07 MiB | 11.20 MiB/s, done.\n   Resolving deltas: 100% (9734/9734), done.\n   Checking connectivity... done.\n   ```\n\n4. Bring up a local notary server and signer.\n\n   You will need to run this command from inside the root folder of the notary repository. The operation may take a minute or two to complete.\n\n   ```\n   $ docker-compose up -d\n   Pulling mysql (mariadb:10.1.10)...\n   10.1.10: Pulling from library/mariadb\n   03e1855d4f31: Pull complete\n   a3ed95caeb02: Pull complete\n   ea9cb3d7d346: Pull complete\n   e47839e262bb: Pull complete\n   f568a56c1fd0: Pull complete\n   cc98c1dfbf81: Pull complete\n   98a99d2efdc4: Pull complete\n   0b304232c8e6: Pull complete\n   d65a44f4573e: Pull complete\n   Digest: sha256:10d0179f08a4fb0c785142ca73367921f46a93c2ee7c84831ae3543522156a6c\n   Status: Downloaded newer image for mariadb:10.1.10\n   <SNIP>\n   Creating notary_mysql_1\n   Creating notary_signer_1\n   Creating notary_server_1\n   ```\n\n5.  Add `127.0.0.1 notary-server` to `/etc/hosts` (or if using `docker-machine`, add `$(docker-machine ip) notary-server)`.\n\n6. Copy the config and certificate required to talk to your local Notary server.\n\n   ```\n   $ mkdir -p ~/.notary && cp cmd/notary/config.json cmd/notary/root-ca.crt ~/.notary\n   ```\n\n7.  Initialize a new trusted collection on your local server\n\n   ```\n   $ notary init example.com/scripts\n\n   No root keys found. Generating a new root key...\nYou are about to create a new root signing key passphrase. This passphrase\nwill be used to protect the most sensitive key in your signing system. Please\nchoose a long, complex passphrase and be careful to keep the password and the\nkey file itself secure and backed up. It is highly recommended that you use a\npassword manager to generate the passphrase and keep it safe. There will be no\nway to recover this key. You can find the key in your config directory.\nEnter passphrase for new root key with ID 6f3b2d0:\nRepeat passphrase for new root key with ID 6f3b2d0:\nEnter passphrase for new targets key with ID 4bc290d (example.com/scripts):\nRepeat passphrase for new targets key with ID 4bc290d (example.com/scripts):\n   ```\n\n   You will be prompted for passphrases for the root and repository keys. This is for the same reasons as it was when you first pushed a repo with Docker Content Trust enabled.\n\n8.  Add content to your trusted collection by running a sequence of `notary add example.com/scripts <NAME> <FILE>`, `notary publish example.com/scripts`, and `notary list example.com/scripts`. This is a the sequence, in order:\n    - Stages adding a target with `notary add`\n    - Attempts to publish this target to the server with `notary publish`\n    - Fetches and displays all trust data for example.com (verifying output as it is downloaded)\n\nTo remove targets, you can make use of the `notary remove example.com/scripts <NAME>` command, followed by a `notary publish example.com/scripts`.\n\nPlease note that this `docker-compose` setup will persist notary's database data in a volume; if you'd like to wipe out all state when running this lab running multiple times, you will have to remove this volume in addition to restarting the notary server, signer, and database containers.\n\n### Key rotation with the notary client\n\nLet's look at key rotation with Notary.\n\nIn the event of key-compromise, it's a simple procedure to rotate keys with notary. Simply determine which key you wish to rotate, and run `notary key rotate`.\n\n1. List all of the keys in your notary repository\n\n   ```\n   $ notary key list\n   ROLE             GUN                                        KEY ID                                          LOCATION\n   ------------------------------------------------------------------------------------------------------------------------------------\n   root                             6f3b2d0269343cafafca59f05d738389a27c9408cbe1345188325913620a6b80   file (/root/.notary/private)\n   snapshot   example.com/scripts   7c9487f2d2a42d1f91020285483d15b5d85d8e22799c64141c5cafc87997795c   file (/root/.notary/private)\n   targets    example.com/scripts   4bc290d883fa33020a528abbce61accf78745f4f28be243f3cc9f44f11297258   file (/root/.notary/private)\n   ```\n\n2. Rotate a key.\n\n   In this example we'll rotate the `targets` key.  \n\n   ```\n   $ notary key rotate example.com/scripts targets\n\n   Enter passphrase for new targets key with ID a4413c0 (example.com/scripts):\n   Repeat passphrase for new targets key with ID a4413c0  (example.com/scripts):\n   Enter passphrase for root key with ID 6f3b2d0:\n   Enter passphrase for snapshot key with ID 7c9487f (example.com/scripts):\n   ```\n\n3. Confirm that the targets key ID has changed.\n\n   ```\n   $ notary key list\n\n   ROLE             GUN                                        KEY ID                                          LOCATION\n   ------------------------------------------------------------------------------------------------------------------------------------\n   root                             6f3b2d0269343cafafca59f05d738389a27c9408cbe1345188325913620a6b80   file (/root/.notary/private)\n   snapshot   example.com/scripts   7c9487f2d2a42d1f91020285483d15b5d85d8e22799c64141c5cafc87997795c   file (/root/.notary/private)\n   targets    example.com/scripts   a4413c080788746ac34db2077a0bcc41be84dfce34d8a7d2d55942d125e4c69f   file (/root/.notary/private)\n   ```\n\n   For more information about keys, please see the [this section of the Notary Service Architecture documentation](https://docs.docker.com/notary/service_architecture/#brief-overview-of-tuf-keys-and-roles)\n\n### Role delegation with notary\n\nNow we'll explore delegation roles in notary. Delegation roles are a subset of the targets role, and are ideal for assigning signing privileges to collaborators and CI systems because no private key sharing is required.  Here's a [demo of setting up delegation roles](https://asciinema.org/a/4nclzcuus3ubdcu88xmepz8u4) to illustrate the steps below:\n\n1. Rotate the snapshot key to the server.\n\n   This is done by default when creating new Content Trust repositories in Docker 1.10+.\n\n   ```\n   $ notary key rotate example.com/scripts snapshot -r\n   Enter passphrase for root key with ID 6f3b2d0:\n   ```\n\n   This is so that delegation roles will only require their own delegation's private key to publish to trusted collections.\n\n2. Have your delegate generate an x509 certificate + private key pair with openssl - [instructions here](https://docs.docker.com/engine/security/trust/trust_delegation/#generating-delegation-keys).  \n\n3. Retrieve their certificate, `delegation.crt`.\n\n4. Add their delegation role.\n\n   ```\n   $ notary delegation add example.com/scripts targets/releases delegation.crt --all-paths\n   ```\n\n   This command will allow the collaborator to push any target (from `--all-paths`) to the `targets/releases` role if they can sign with their private key `delegation.key` in order to produce a valid signature that can be verified by `delegation.crt`'s public key material.\n\n   Be aware that this commmand only stages the delegation role addition.\n\n5. Publish the addition of the delegation role\n\n   ```\n   $ notary publish example.com/scripts\n   ```\n\n6. Check that the delegation role was added.\n\n   ```\n   $ notary delegation list example.com/scripts\n   ```\n\nYour collaborator should now be able to publish content (`docker push`) with Docker Content Trust enabled, or with a `notary add example.com/scripts <NAME> <FILE> -r targets/releases`.  You can verify their pushes by running a `notary list example.com/scripts -r targets/releases`\n\nYou can add additional keys to the same role with additional `delegation add` commands, like so: `notary delegation add example.com/scripts targets/releases delegation2.crt delegation3.crt`, followed by a publish\n\nFor more commands over delegation roles, please consult the notary [advanced usage documentation](https://docs.docker.com/notary/advanced_usage/#work-with-delegation-roles).\n\n# Summary\n\nCongratulations. You now know the advantages of image digests over image tags. You have also seen how to enable Docker Content Trust and push signed images. Finally you have seen how to perform some advanced tasks using the notary server and client.\n"
  },
  {
    "path": "Docker/security/trust-basics/README.md",
    "content": "# Docker Content Trust Basics\n\n# Lab Meta\n\n> **Difficulty**: Beginner\n\n> **Time**: Approximately 10 minutes\n\nIn this lab you'll learn how to enable Docker Content Trust as well as perform some basic signing and verification operations.\n\nYou will complete the following steps as part of this lab.\n\n- [Step 1 - Enable Docker Content Trust](#enable_dct)\n- [Step 2 - Push and sign an image](#push)\n- [Step 4 - Clean-up](#clean)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- At least one Linux-based Docker hosts running Docker 1.13 or higher\n- The Docker host can be running in Swarm Mode\n- This lab was built and tested using Ubuntu 16.04 and Docker 17.04.0-ce\n\n# <a name=\"enable_dct\"></a>Step 1: Enable Docker Content Trust\n\nIn this step you will enable Docker Content Trust on a single node. You will test it by pulling an unsigned and a signed image.\n\nExecute all of the commands in this section form **node1** in your lab.\n\n1. Enable Docker Content Trust\n\n   ```\n   $ export DOCKER_CONTENT_TRUST=1\n   ```\n\n   Docker Content Trust is now enabled on this host and you will no longer be able to pull unsigned images.\n\n2. Try pulling an unsigned image (any unsigned image will do, you do not have to use the one in this demo)\n\n   ```\n   $ docker image pull nigelpoulton/tu-demo\n   Using default tag: latest\n   Error: remote trust data does not exist for docker.io/nigelpoulton/tu-demo: notary.docker.io does not have trust data for docker.io/nigelpoulton/tu-demo\n   ```\n\n   The operation fails because the image is not signed (no trust data for the image).\n\n3. Try pulling the official `alpine:latest` image\n\n   ```\n   $ docker image pull alpine:latest\n   Pull (1 of 1): alpine:latest@sha256:58e1a1bb75...3f105138f97eb53149673c4\n   sha256:58e1a1bb75...3f105138f97eb53149673c4: Pulling from library/alpine\n   627beaf3eaaf: Pull complete\n   Digest: sha256:58e1a1bb75...3f105138f97eb53149673c4\n   Status: Downloaded newer image for alpine@sha256:58e1a1bb75...3f105138f97eb53149673c4\n   Tagging alpine@sha256:58e1a1bb75...3f105138f97eb53149673c4 as alpine:latest\n   ```\n\n   This time the operation succeeds. This is because the image is signed - all **official** images are signed.\n\nIn this step you have seen how easy it is to enable Docker Content Trust (exporting the `DOCKER_CONTENT_TRUST` environment variable with a value of `1`). You have also proved that it is working by attempting to pull an unsigned image.\n\n\n# <a name=\"push\"></a>Step 2: Push and sign an image\n\nIn this step you will tag an image and push it to a new repository within your own namespace on Docker Cloud. You will perform this step from the host that you enabled Docker Content Trust on in the previous step. This will ensure that the image gets signed when you push it.\n\nTo complete this step you will need a Docker ID.\n\nExecute all of the following commands from **node1** (or whichever node you used for the previous step).\n\n1. Tag the `alpine:latest` image so that it can be pushed to a new repository in your namespace on Docker Cloud.\n\n   This command will add the following additional tag to the `alpine:latest` image: `nigelpoulton/sec-test:latest`. The format of the tag is **docker-id/repo-name/image-tag**. Be sure to replace the **docker-id** in the following command with your own Docker ID.\n\n   ```\n   $ docker image tag alpine:latest nigelpoulton/sec-test:latest\n   ```\n2. Verify the tagging operation worked\n\n   ```\n   $ docker image ls\n   REPOSITORY              TAG      IMAGE ID       CREATED        SIZE\n   alpine                  latest   4a415e366388   4 weeks ago    3.99MB\n   nigelpoulton/sec-test   latest   4a415e366388   4 weeks ago    3.99MB\n   ```\n   Look closely and see that the image with **IMAGE ID** `4a415e366388` has two **REPOSITORY** tags.\n\n3. Login to Docker Cloud with your own Docker ID\n\n   ```\n   $ docker login\n   Login with your Docker ID to push and pull images from Docker Store...\n   Username: <your-docker-id>\n   Password:\n   Login Succeeded\n   ```\n\n4. Push the image to a new repository in your Docker Cloud namespace. Remember to use the image tag you created earlier that includes your own Docker ID.\n\n   > NOTE: As part of this `push` operation you will be asked to enter two new keys:\n   - A new root key (this only happens the first time you push an image after enabling DCT)\n   - A repository signing key\n\n   ```\n   $ docker image push nigelpoulton/sec-test:latest\n   The push refers to a repository [docker.io/nigelpoulton/sec-test]\n   23b9c7b43573: Pushed\n   latest: digest: sha256:d0a670140...35edb294e4a7a152a size: 528\n   Signing and pushing trust metadata\n   You are about to create a new root signing key passphrase...\n   <Snip>\n   Enter passphrase for new root key with ID 66997be: <root key passphrase>\n   Repeat passphrase for new root key with ID 66997be: <root key passphrase>\n   Enter passphrase for new repository key with ID 7ccd1b4 (docker.io/nigelpoulton/sec-test): <repo key passphrase>\n   Repeat passphrase for new repository key with ID 7ccd1b4 (docker.io/nigelpoulton/sec-test): <repo key passphrase>\n   Finished initializing \"docker.io/nigelpoulton/sec-test\"\n   Successfully signed \"docker.io/nigelpoulton/sec-test\":latest\n   ```\n\n   The output above shows the image being signed as part of the normal `docker image push` command - no extra commands or steps are required to sign images with Docker Content Trust enabled.\n\nCongratulations. You have pushed and signed an image.\n\nBy default the root and repository keys are stored below `~/.docker/trust`.\n\nIn the real world you will need to generate strong passphrases for each key and store them in a secure password manager/vault.\n\n# <a name=\"clean\"></a>Step 3: Clean-up\n\nThe following commands will clean-up the artifacts from this lab.\n\n1. Delete the tagged image you created in Step 2\n\n   ```\n   $ docker image rm nigelpoulton/sec-test:latest\n   Untagged: nigelpoulton/sec-test:latest\n   Untagged: nigelpoulton/sec-test@sha256:d0a6701...4e4a7a152a\n   ```\n\n2. Delete the alpine:latest image\n\n   ```\n   $ docker image rm alpine:latest\n   Untagged: alpine:latest\n   Untagged: alpine@sha256:58e1a...38f97eb53149673c4\n   Deleted: sha256:4a415e366...718a4698e91ef2a526\n   Deleted: sha256:23b9c7b43...5f22803bcbe9ab24c2\n   ```\n3. Disable Docker Content Trust.\n\n   ```\n   $ export DOCKER_CONTENT_TRUST=\n   ```\n\n4. Login to Docker Cloud > Locate the repository you created with the `docker image push` command > Click Settings > Delete the repository.\n"
  },
  {
    "path": "Docker/security/userns/README.md",
    "content": "# Lab: User Namespaces\n\n> **Difficulty**: Intermediate\n\n> **Time**: Approximately 10 minutes\n\n\nBy default, the Docker daemon runs as *root*. This allows the daemon to create and work with the kernel structures required to start containers. However, it also presents potential security risks. This lab will walk you through implementing a more secure configuration utilizing *user namespaces*.\n\nYou will complete the following steps in this lab:\n\n- [Step 1 - Daemon and container defaults](#defaults)\n- [Step 2 - The `--user` flag](#user_flag)\n- [Step 3 - Enabling **user namespaces**](#userns)\n\n# Prerequisites\n\nYou will need all of the following to complete this lab:\n\n- A Linux-based Docker Host running Docker 1.10 or higher\n- Root access on the Docker Host\n\n> **Note:** The instructions in this lab are tailored to a Docker Host running Ubuntu 15.10. An [open documented issue](https://github.com/moby/moby/issues/22633) exists with Ubuntu 16.04 Xenial .\n\n# <a name=\"defaults\"></a>Step 1: Daemon and container defaults\n\nIn this step you'll verify that the Docker daemon, and containers, run by default as root. You will also force a single container to run under a different security context.\n\nYou must perform this step while logged in as the **ubuntu** user.\n\n1. Use the `ps` command to verify that the *Docker daemon* is currently running under the **root** user's security context.\n\n   ```\n   ubuntu@node:~$ ps aux | grep dockerd\n\n   root      8715  0.0  1.0 352332 38820 ?        Ssl  12:56   0:01 /usr/bin/dockerd -H fd://\n   ubuntu    8896  0.0  0.0   8216  2188 pts/0    S+   13:45   0:00 grep --color=auto dockerd\n   ```\n\n  The first line shows the Docker daemon (**dockerd**). The second line shows the `ps` command you just ran. The first column of the first line shows that the Docker daemon is running as **root**.\n\n  > **Note:** If you are using a Docker Engine earlier than 1.12 you will need to substitute `dockerd` with `docker`.\n\n2. Start a new container that runs the `id` command.\n\n   ```\n   ubuntu@node:~$ sudo docker run --rm alpine id\n\n   Unable to find image 'alpine:latest' locally\n   latest: Pulling from library/alpine\n   e110a4a17941: Pull complete\n   Digest: sha256:3dcdb92d7432d56604d4545cbd324b14e647b313626d99b889d0626de158f73a\n   Status: Downloaded newer image for alpine:latest\n   uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)\n   ```\n\n  The last line of the output above shows that the container is running as root - `uid=0(root)` and `gid=0(root)`.\n\nThis step has shown you that the Docker daemon runs as root by default. You have also seen that new containers also start as root.\n\n# <a name=\"user_flag\"></a>Step 2: The `--user` flag\n\nIn this step you will start a new container and force it to run under the security context of the user that you are logged in as.\n\nYou should be logged in as the **ubuntu** user.\n\n1. Issue the `id` command form the terminal of your Docker Host to determine the **uid** and **gid** of the user you are currently logged in as.\n\n   ```\n   ubuntu@node:~$ id\n\n   uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout)..<snip>\n   ```\n\n  The **uid** and **gid** in the above output are both \"1000\". Yours might be different. You will need your values in the next command.\n\n2. Use the `docker run` command with the `--user` flag to force a new container to start with the **uid** and **gid** of your current user.\n\n   ```\n   ubuntu@node:~$ sudo docker run --rm --user 1000:1000 alpine id\n\n   uid=1000 gid=1000\n   ```\n\n  The output shows that the container is running under **uid** 1000 and **gid** 1000. This proves that the container ran under the security context of a user and group that you specified.\n\nThere are many times when containers need to run under the root security context, while at the same time not having root access to the entire Docker Host. This is where user namespaces help!\n\n# <a name=\"userns\"></a>Step 3: User namespaces\n\nUser namespaces have been part of the Linux kernel for a while. They have been available in Docker since version 1.10 of the Linux Docker Engine. They allow the Docker daemon to create an isolated namespace that looks and feels like a root namespace. However, the `root` user inside of this namespace is mapped to a non-privileged **uid** on the Docker Host. This means that containers can effectively have root privilege inside of the user namespace, but have no privileges on the Docker Host.\n\nIn this step you'll see how to implement user namespaces.\n\n> **Note:** It is not recommended to switch the Docker daemon back and forth between having user namespace mode enabled, and user namespace mode disabled. Doing this can cause issues with image permissions and visibility.\n\n1. Stop the Docker Daemon\n\n   ```\n   ubuntu@node:~$ sudo systemctl stop docker\n   ```\n\n2. Start the Docker Daemon with user namespace support enabled.\n\n   ```\n   ubuntu@node:~$ sudo dockerd --userns-remap=default &\n   ```\n\n  If you are using a Docker 1.11 or earlier you will need to supplement `dockerd` with `docker daemon` in the previous command.\n\n  This will start the Docker Daemon in the background using the default user namespace mapping where the **dockermap** user and group are created and mapped to non-privileged **uid** and **gid** ranges in the `/etc/subuid` and `/etc/subgid` files.\n\n  The `/etc/subuid` and `/etc/subgid` files have a single-line entry for each user/group. Each line is formatted with three fields as follows -\n\n  - User or group name\n  - Subordinate user ID (uid) or group ID (gid)\n  - Number of subordinate ID's available\n\n3. Use the `docker info` command to verify that user namespace support is properly enabled.\n\n   ```\n   ubuntu@node:~$ sudo docker info\n\n   Containers: 3\n    Running: 1\n    Paused: 0\n    Stopped: 2\n   Images: 2\n   <snip>\n   Docker Root Dir: /var/lib/docker/231072.231072\n   <snip>\n   ```\n\n   The numbers at the end of the **Docker Root Dir** line indicate that the daemon is running inside of a user namespace. The numbers will match the subordinate user ID of the **dockermap** user as defined in the `/etc/subuid` file.\n\n4. Check which images are stored in the daemon's local store.\n\n   ```\n   ubuntu@node:~$ sudo docker images\n   REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE\n   ```\n\n   The Docker daemon's local store is empty! This is despite the fact that the **alpine** image was pulled locally in a previous step. This is because this instance of the Docker daemon is running inside of a brand new namespace and has no visibility of anything outside of that namespace.\n\n5. Now try running a new container in privileged mode.\n\n   ```\n   ubuntu@node:~$ sudo docker run --rm --privileged alpine id\n\n   docker: Error response from daemon: Privileged mode is incompatible with user namespaces.\n   See 'docker run --help'.\n   ```\n\n  As stated in the error response, *privileged* containers are not currently supported with user namespaces.\n\n6. Start a new container in interactive mode and mount the Docker Host's `/bin` directory as a volume.\n\n   ```\n   ubuntu@node:~$ sudo docker run -it --rm -v /bin:/host/bin busybox /bin/sh\n\n   Unable to find image 'busybox:latest' locally\n   latest: Pulling from library/busybox\n   8ddc19f16526: Pull complete\n   Digest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6\n   Status: Downloaded newer image for busybox:latest\n   ```\n\n7. Use the `id` command to verify the security context the container is running under.\n\n  The previous command should have attached you to the terminal of the newly created container. The following commands should be ran from inside of the container created in the previous step.\n\n   ```\n   / # id\n\n   uid=0(root) gid=0(root) groups=10(wheel)\n   ```\n\n   The output above shows that the container is running under the root user's security context. Remember that this is only root within the scope of the namespace that the container is running in.\n\n8. Try and delete a file that exists in the volume that you mounted from the Docker Host's filesystem into the container as a volume.\n\n   ```\n   / # rm host/bin/sh\n\n   rm: remove 'sh'? y\n   rm: can't remove 'sh': Permission denied\n   ```\n\n  The operation fails with a permission denied error. This is because the file you are trying to delete exists in the local filesystem of the Docker Host and the container does not have root access outside of the namespace that it exists in.\n\n  If you perform the same operation - start the same container and attempt the same `rm` command - without user namespace support enabled, the operation will succeed.\n\n# <a name=\"run_app\"></a>Step 2: Clean-up\n\nThe following commands will clean up the user namespace you've been working in and restart the Docker daemon without user namespace support enabled.\n\n   ```\n   ubuntu@node:~$ sudo docker rm -f $(docker ps -aq)\n   <snip>\n   ubuntu@node:~$ sudo docker rmi $(docker images -q)\n   <snip>\n\n   ubuntu@node:~$ sudo killall dockerd -v\n\n   ubuntu@node:~$ sudo systemctl start docker\n   ```\n\n> **Note:** If you are using a version of the Docker Engine prior to 1.12 you will have to substitute `dockerd` with `docker` in the previous `killall` command.\n\n# Summary\n\nIn this lab you learned how to start the Docker daemon with user namespace support enabled. This started the daemon in a new namespace and mapped the root user inside of the namespace to a non-privileged user outside of the user namespace. This meant that the root user within the user namespace had full access to processes and containers within that namespace, but did not have elevated permissions outside of the namespace.\n\nYou proved that the Docker daemon was running within a user namespace using the `docker info` command. You saw that the root user inside of a the user namespace was unable to delete files that existed outside of the namespace.\n\n# Additional Resources\n\nYou can refer to the following resources for more information and help:\n- Docker: http://www.docker.com\n"
  },
  {
    "path": "Docker/swarm-mode/README.md",
    "content": "# Docker Swarm Mode Tutorials\n\n[Docker Swarm Mode](https://docs.docker.com/engine/swarm/) is a feature of Docker. These tutorials are designed to help you quickly get started with orchestration using Swarm Mode.\n\n* [Docker Swarm Mode full tutorial](beginner-tutorial/README.md)\n\n"
  },
  {
    "path": "Docker/swarm-mode/beginner-tutorial/README.md",
    "content": "# Docker Swarm Tutorial\n> **Note:** This tutorial uses Docker Machine to simulate multiple machines on your desktop. There's an easier way to learn swarm mode, and that is using [Play with Docker](http://training.play-with-docker.com/swarm-mode-intro/). This tutorial is preserved for legacy reasons, and also in case you really want to learn to do this on your own machine.\n\nDocker includes swarm mode for natively managing a cluster of Docker Engines called a swarm. You can use the Docker CLI to create a swarm, deploy application services to a swarm, and manage swarm behavior. This tutorial uses [Docker Machine](https://docs.docker.com/machine/) to create multiple nodes on your desktop. If you prefer you can create those nodes in your own cloud or on multiple machines.\n\n> **Important Note**\nYou don't need to use the Docker CLI to perform these operations. You can use `docker stack deploy --compose-file STACKNAME.yml STACKNAME` instead. For an introduction to using a stack file in a compose file format to deploy an app, check out [Deploying an app to a Swarm](https://github.com/docker/labs/blob/master/beginner/chapters/votingapp.md).\n\n## Preparation\nYou need to have Docker and Docker Machine installed on your system. [Download Docker](https://docker.com/getdocker) for your platform and install it.\n\n> **Tips:**\n>\n* If you are using Docker for Mac or Docker for Windows, you already have Docker Machine, as it is installed with those applications. See [Download Docker for Mac](https://docs.docker.com/docker-for-mac/#/download-docker-for-mac) and [Download Docker for Windows](https://docs.docker.com/docker-for-windows/#/download-docker-for-windows) for install options and details on what gets installed.\n>\n* If you are using Docker for Windows you will need to use the Hyper-V driver for Docker Machine. That will require a bit more set-up. See the [Microsoft Hyper-V driver documentation](https://docs.docker.com/machine/drivers/hyper-v/) for directions on setting it up.\n>\n* If you are using Docker directly on a Linux system, you will need to [install Docker Machine](https://docs.docker.com/machine/install-machine/) (after installing [Docker Engine](https://docs.docker.com/engine/installation/linux/)).\n\n## Creating the nodes and Swarm\n[Docker Machine](https://docs.docker.com/machine/overview/) can be used to:\n* Install and run Docker on Mac or Windows\n* Provision and manage multiple remote Docker hosts\n* Provision Swarm clusters\n\nBut it can also be used to create multiple nodes on your local machine. There's a [bash script](https://github.com/docker/labs/blob/master/swarm-mode/beginner-tutorial/swarm-node-vbox-setup.sh) in this repository that does just that and creates a swarm. There's also [a powershell Hyper-V version](https://github.com/docker/labs/blob/master/swarm-mode/beginner-tutorial/swarm-node-hyperv-setup.ps1). On this page we're walking through the bash script, but the steps, aside from set-up, are a basically the same for the Hyper-V version.\n\nThis first step creates three machines, and names the machines manager1, manager2, and manager3\n```\n#!/bin/bash\n\n# Swarm mode using Docker Machine\n\n#This configures the number of workers and managers in the swarm\nmanagers=3\nworkers=3\n\n# This creates the manager machines\necho \"======> Creating $managers manager machines ...\";\nfor node in $(seq 1 $managers);\ndo\n\techo \"======> Creating manager$node machine ...\";\n\tdocker-machine create -d virtualbox manager$node;\ndone\n```\n\nThis second step creates three more machines, and names them worker1, worker2, and worker3\n```\n# This create worker machines\necho \"======> Creating $workers worker machines ...\";\nfor node in $(seq 1 $workers);\ndo\n\techo \"======> Creating worker$node machine ...\";\n\tdocker-machine create -d virtualbox worker$node;\ndone\n\n# This lists all machines created\ndocker-machine ls\n```\n\nNext you create a swarm by initializing it on the first manager. You do this by using `docker-machine ssh` to run `docker swarm init`\n```\n# initialize swarm mode and create a manager\necho \"======> Initializing first swarm manager ...\"\ndocker-machine ssh manager1 \"docker swarm init --listen-addr $(docker-machine ip manager1) --advertise-addr $(docker-machine ip manager1)\"\n```\nNext you get join tokens for managers and workers.\n\n```\n# get manager and worker tokens\nexport manager_token=`docker-machine ssh manager1 \"docker swarm join-token manager -q\"`\nexport worker_token=`docker-machine ssh manager1 \"docker swarm join-token worker -q\"`\n```\n\nThen join the other masters to the Swarm\n```\nfor node in $(seq 2 $managers);\ndo\n\techo \"======> manager$node joining swarm as manager ...\"\n\tdocker-machine ssh manager$node \\\n\t\t\"docker swarm join \\\n\t\t--token $manager_token \\\n\t\t--listen-addr $(docker-machine ip manager$node) \\\n\t\t--advertise-addr $(docker-machine ip manager$node) \\\n\t\t$(docker-machine ip manager1)\"\ndone\n```\n\nFinally, add the worker machines and join them to the swarm.\n```\n# workers join swarm\nfor node in $(seq 1 $workers);\ndo\n\techo \"======> worker$node joining swarm as worker ...\"\n\tdocker-machine ssh worker$node \\\n\t\"docker swarm join \\\n\t--token $worker_token \\\n\t--listen-addr $(docker-machine ip worker$node) \\\n\t--advertise-addr $(docker-machine ip worker$node) \\\n\t$(docker-machine ip manager1):2377\"\ndone\n\n# show members of swarm\ndocker-machine ssh manager1 \"docker node ls\"\n```\n\nThat last line will show you a list of all the nodes, something like this:\n\n```\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\n3cq6idpysa53n6a21nqe0924h    manager3  Ready   Active        Reachable\n64swze471iu5silg83ls0bdip *  manager1  Ready   Active        Leader\n7eljvvg0icxlw20od5f51oq8t    manager2  Ready   Active        Reachable\n8awcmkj3sd9nv1pi77i6mdb1i    worker1   Ready   Active        \navu80ol573rzepx8ov80ygzxz    worker2   Ready   Active        \nbxn1iivy8w7faeugpep76w50j    worker3   Ready   Active        \n```\nYou can also find all your machines by running\n```\n$ docker-machine ls\nNAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER      ERRORS\nmanager1   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.03.0-ce   \nmanager2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.03.0-ce \nmanager3   -        virtualbox   Running   tcp://192.168.99.102:2376           v17.03.0-ce\nworker1    -        virtualbox   Running   tcp://192.168.99.103:2376           v17.03.0-ce\nworker2    -        virtualbox   Running   tcp://192.168.99.104:2376           v17.03.0-ce\nworker3    -        virtualbox   Running   tcp://192.168.99.105:2376           v17.03.0-ce\n```\n\nThe next step is to create a service and list out the services. This creates a single service called `web` that runs the latest nginx:\n```\n$ docker-machine ssh manager1 \"docker service create -p 80:80 --name web nginx:latest\"\n$ docker-machine ssh manager1 \"docker service ls\"\nID            NAME  REPLICAS  IMAGE         COMMAND\n2x4jsk6313az  web   1/1       nginx:latest  \n```\nNow open the machine's IP address in your browser. You can see above manager1 had an IP address of 192.168.99.100\n![nginx in Chrome at 192.168.99.100](images/manager1-nginx.png)\n\nYou can actually load any of the node ip addresses and get the same result because of [Swarm Mode's Routing Mesh](https://docs.docker.com/engine/swarm/ingress/).\n![nginx in Chrome at 192.168.99.100](images/manager2-nginx.png)\n\nNext let's inspect the service\n```\n$ docker-machine ssh manager1 \"docker service inspect web\"\n[\n    {\n        \"ID\": \"2x4jsk6313azr6g1dwoi47z8u\",\n        \"Version\": {\n            \"Index\": 104\n        },\n        \"CreatedAt\": \"2016-08-23T22:43:23.573253682Z\",\n        \"UpdatedAt\": \"2016-08-23T22:43:23.576157266Z\",\n        \"Spec\": {\n            \"Name\": \"web\",\n            \"TaskTemplate\": {\n                \"ContainerSpec\": {\n                    \"Image\": \"nginx:latest\"\n                },\n                \"Resources\": {\n                    \"Limits\": {},\n                    \"Reservations\": {}\n                },\n                \"RestartPolicy\": {\n                    \"Condition\": \"any\",\n                    \"MaxAttempts\": 0\n                },\n                \"Placement\": {}\n            },\n            \"Mode\": {\n                \"Replicated\": {\n                    \"Replicas\": 1\n                }\n            },\n            \"UpdateConfig\": {\n                \"Parallelism\": 1,\n                \"FailureAction\": \"pause\"\n            },\n            \"EndpointSpec\": {\n                \"Mode\": \"vip\",\n                \"Ports\": [\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 80,\n                        \"PublishedPort\": 80\n                    }\n                ]\n            }\n        },\n        \"Endpoint\": {\n            \"Spec\": {\n                \"Mode\": \"vip\",\n                \"Ports\": [\n                    {\n                        \"Protocol\": \"tcp\",\n                        \"TargetPort\": 80,\n                        \"PublishedPort\": 80\n                    }\n                ]\n            },\n            \"Ports\": [\n                {\n                    \"Protocol\": \"tcp\",\n                    \"TargetPort\": 80,\n                    \"PublishedPort\": 80\n                }\n            ],\n            \"VirtualIPs\": [\n                {\n                    \"NetworkID\": \"24r1loluvdohuzltspkwbhsc8\",\n                    \"Addr\": \"10.255.0.9/16\"\n                }\n            ]\n        },\n        \"UpdateStatus\": {\n            \"StartedAt\": \"0001-01-01T00:00:00Z\",\n            \"CompletedAt\": \"0001-01-01T00:00:00Z\"\n        }\n    }\n]\n```\n\nThat's lots of info! Now, let's scale the service:\n```\n$ docker-machine ssh manager1 \"docker service scale web=15\"\nweb scaled to 15\n$ docker-machine ssh manager1 \"docker service ls\"\nID            NAME  REPLICAS  IMAGE         COMMAND\n2x4jsk6313az  web   15/15     nginx:latest  \n```\nDocker has spread the 15 services evenly over all of the nodes\n```\n$ docker-machine ssh manager1 \"docker service ps web\"\nID                         NAME    IMAGE         NODE      DESIRED STATE  CURRENT STATE           ERROR\n61wjx0zaovwtzywwbomnvjo4q  web.1   nginx:latest  worker3   Running        Running 13 minutes ago  \nbkkujhpbtqab8fyhah06apvca  web.2   nginx:latest  manager1  Running        Running 2 minutes ago   \n09zkslrkgrvbscv0vfqn2j5dw  web.3   nginx:latest  manager1  Running        Running 2 minutes ago   \n4dlmy8k72eoza9t4yp9c9pq0w  web.4   nginx:latest  manager2  Running        Running 2 minutes ago   \n6yqabr8kajx5em2auvfzvi8wi  web.5   nginx:latest  manager3  Running        Running 2 minutes ago   \n21x7sn82883e7oymz57j75q4q  web.6   nginx:latest  manager2  Running        Running 2 minutes ago   \n14555mvu3zee6aek4dwonxz3f  web.7   nginx:latest  worker1   Running        Running 2 minutes ago   \n1q8imt07i564bm90at3r2w198  web.8   nginx:latest  manager1  Running        Running 2 minutes ago   \nencwziari9h78ue32v5pjq9jv  web.9   nginx:latest  worker3   Running        Running 2 minutes ago   \naivwszsjhhpky43t3x7o8ezz9  web.10  nginx:latest  worker2   Running        Running 2 minutes ago   \n457fsqomatl1lgd9qbz2dcqsb  web.11  nginx:latest  worker1   Running        Running 2 minutes ago   \n7chhofuj4shhqdkwu67512h1b  web.12  nginx:latest  worker2   Running        Running 2 minutes ago   \n7dynic159wyouch05fyiskrd0  web.13  nginx:latest  worker1   Running        Running 2 minutes ago   \n7zg9eki4610maigr1xwrx7zqk  web.14  nginx:latest  manager3  Running        Running 2 minutes ago   \n4z2c9j20gwsasosvj7mkzlyhc  web.15  nginx:latest  manager2  Running        Running 2 minutes ago   \n```\n\nYou can also drain a particular node, that is remove all services from that node. The services will automatically be rescheduled on other nodes.\n```\n$ docker-machine ssh manager1 \"docker node update --availability drain worker1\"\nworker1\n$ docker-machine ssh manager1 \"docker service ps web\"\nID                         NAME        IMAGE         NODE      DESIRED STATE  CURRENT STATE           ERROR\n61wjx0zaovwtzywwbomnvjo4q  web.1       nginx:latest  worker3   Running        Running 15 minutes ago  \nbkkujhpbtqab8fyhah06apvca  web.2       nginx:latest  manager1  Running        Running 4 minutes ago   \n09zkslrkgrvbscv0vfqn2j5dw  web.3       nginx:latest  manager1  Running        Running 4 minutes ago   \n4dlmy8k72eoza9t4yp9c9pq0w  web.4       nginx:latest  manager2  Running        Running 4 minutes ago   \n6yqabr8kajx5em2auvfzvi8wi  web.5       nginx:latest  manager3  Running        Running 4 minutes ago   \n21x7sn82883e7oymz57j75q4q  web.6       nginx:latest  manager2  Running        Running 4 minutes ago   \n8so0xi55kqimch2jojfdr13qk  web.7       nginx:latest  worker3   Running        Running 3 seconds ago   \n14555mvu3zee6aek4dwonxz3f   \\_ web.7   nginx:latest  worker1   Shutdown       Shutdown 4 seconds ago  \n1q8imt07i564bm90at3r2w198  web.8       nginx:latest  manager1  Running        Running 4 minutes ago   \nencwziari9h78ue32v5pjq9jv  web.9       nginx:latest  worker3   Running        Running 4 minutes ago   \naivwszsjhhpky43t3x7o8ezz9  web.10      nginx:latest  worker2   Running        Running 4 minutes ago   \n738jlmoo6tvrkxxar4gbdogzf  web.11      nginx:latest  worker2   Running        Running 3 seconds ago   \n457fsqomatl1lgd9qbz2dcqsb   \\_ web.11  nginx:latest  worker1   Shutdown       Shutdown 3 seconds ago  \n7chhofuj4shhqdkwu67512h1b  web.12      nginx:latest  worker2   Running        Running 4 minutes ago   \n4h7zcsktbku7peh4o32mw4948  web.13      nginx:latest  manager3  Running        Running 3 seconds ago   \n7dynic159wyouch05fyiskrd0   \\_ web.13  nginx:latest  worker1   Shutdown       Shutdown 4 seconds ago  \n7zg9eki4610maigr1xwrx7zqk  web.14      nginx:latest  manager3  Running        Running 4 minutes ago   \n4z2c9j20gwsasosvj7mkzlyhc  web.15      nginx:latest  manager2  Running        Running 4 minutes ago   \n```\n\nYou can check out the nodes and see that `worker1` is still active but drained.\n```\n$ docker-machine ssh manager1 \"docker node ls\"\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\n3cq6idpysa53n6a21nqe0924h    manager3  Ready   Active        Reachable\n64swze471iu5silg83ls0bdip *  manager1  Ready   Active        Leader\n7eljvvg0icxlw20od5f51oq8t    manager2  Ready   Active        Reachable\n8awcmkj3sd9nv1pi77i6mdb1i    worker1   Ready   Drain         \navu80ol573rzepx8ov80ygzxz    worker2   Ready   Active        \nbxn1iivy8w7faeugpep76w50j    worker3   Ready   Active\n```\n\nYou can also scale down the service\n```\n$ docker-machine ssh manager1 \"docker service scale web=10\"\nweb scaled to 10\n$ docker-machine ssh manager1 \"docker service ps web\"\nID                         NAME        IMAGE         NODE      DESIRED STATE  CURRENT STATE            ERROR\n61wjx0zaovwtzywwbomnvjo4q  web.1       nginx:latest  worker3   Running        Running 22 minutes ago   \nbkkujhpbtqab8fyhah06apvca  web.2       nginx:latest  manager1  Shutdown       Shutdown 54 seconds ago  \n09zkslrkgrvbscv0vfqn2j5dw  web.3       nginx:latest  manager1  Running        Running 11 minutes ago   \n4dlmy8k72eoza9t4yp9c9pq0w  web.4       nginx:latest  manager2  Running        Running 11 minutes ago   \n6yqabr8kajx5em2auvfzvi8wi  web.5       nginx:latest  manager3  Running        Running 11 minutes ago   \n21x7sn82883e7oymz57j75q4q  web.6       nginx:latest  manager2  Running        Running 11 minutes ago   \n8so0xi55kqimch2jojfdr13qk  web.7       nginx:latest  worker3   Running        Running 7 minutes ago    \n14555mvu3zee6aek4dwonxz3f   \\_ web.7   nginx:latest  worker1   Shutdown       Shutdown 7 minutes ago   \n1q8imt07i564bm90at3r2w198  web.8       nginx:latest  manager1  Running        Running 11 minutes ago   \nencwziari9h78ue32v5pjq9jv  web.9       nginx:latest  worker3   Shutdown       Shutdown 54 seconds ago  \naivwszsjhhpky43t3x7o8ezz9  web.10      nginx:latest  worker2   Shutdown       Shutdown 54 seconds ago  \n738jlmoo6tvrkxxar4gbdogzf  web.11      nginx:latest  worker2   Running        Running 7 minutes ago    \n457fsqomatl1lgd9qbz2dcqsb   \\_ web.11  nginx:latest  worker1   Shutdown       Shutdown 7 minutes ago   \n7chhofuj4shhqdkwu67512h1b  web.12      nginx:latest  worker2   Running        Running 11 minutes ago   \n4h7zcsktbku7peh4o32mw4948  web.13      nginx:latest  manager3  Running        Running 7 minutes ago    \n7dynic159wyouch05fyiskrd0   \\_ web.13  nginx:latest  worker1   Shutdown       Shutdown 7 minutes ago   \n7zg9eki4610maigr1xwrx7zqk  web.14      nginx:latest  manager3  Shutdown       Shutdown 54 seconds ago  \n4z2c9j20gwsasosvj7mkzlyhc  web.15      nginx:latest  manager2  Shutdown       Shutdown 54 seconds ago  \n```\n\nNow bring `worker1` back online and show it's new availability\n```\n$ docker-machine ssh manager1 \"docker node update --availability active worker1\"\nworker1\n$ docker-machine ssh manager1 \"docker node inspect worker1 --pretty\"\nID:\t\t\t8awcmkj3sd9nv1pi77i6mdb1i\nHostname:\t\tworker1\nJoined at:\t\t2016-08-23 22:30:15.556517377 +0000 utc\nStatus:\n State:\t\t\tReady\n Availability:\t\tActive\nPlatform:\n Operating System:\tlinux\n Architecture:\t\tx86_64\nResources:\n CPUs:\t\t\t1\n Memory:\t\t995.9 MiB\nPlugins:\n  Network:\t\tbridge, host, null, overlay\n  Volume:\t\tlocal\nEngine Version:\t\t17.03.0-ce\nEngine Labels:\n - provider = virtualbox\n ```\n\nNow let's take the manager1 node, the leader, out of the Swarm\n```\n$ docker-machine ssh manager1 \"docker swarm leave --force\"\nNode left the swarm.\n```\n\nWait about 30 seconds just to be sure. The Swarm still functions, but must elect a new leader. This happens automatically.\n```\n$ docker-machine ssh manager2 \"docker node ls\"\nID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS\n3cq6idpysa53n6a21nqe0924h    manager3  Ready   Active        Reachable\n64swze471iu5silg83ls0bdip    manager1  Down    Active        Unreachable\n7eljvvg0icxlw20od5f51oq8t *  manager2  Ready   Active        Leader\n8awcmkj3sd9nv1pi77i6mdb1i    worker1   Ready   Active        \navu80ol573rzepx8ov80ygzxz    worker2   Ready   Active        \nbxn1iivy8w7faeugpep76w50j    worker3   Ready   Active\n```\nYou see that `manager1` is Down and Unreachable and `manager2` has been elected leader. It's also easy to remove a service:\n```\n$ docker-machine ssh manager2 \"docker service rm web\"\nweb\n```\n\n## Cleanup\nThere's also a [bash script](https://github.com/ManoMarks/labs/blob/master/swarm-mode/beginner-tutorial/swarm-node-vbox-teardown.sh) that will clean up your machine by removing all the Docker Machines.\n\n```\n$ ./swarm-node-vbox-teardown.sh\nStopping \"manager3\"...\nStopping \"manager2\"...\nStopping \"worker1\"...\nStopping \"manager1\"...\nStopping \"worker3\"...\nStopping \"worker2\"...\nMachine \"manager3\" was stopped.\nMachine \"manager1\" was stopped.\nMachine \"manager2\" was stopped.\nMachine \"worker2\" was stopped.\nMachine \"worker1\" was stopped.\nMachine \"worker3\" was stopped.\nAbout to remove worker1, worker2, worker3, manager1, manager2, manager3\nAre you sure? (y/n): y\nSuccessfully removed worker1\nSuccessfully removed worker2\nSuccessfully removed worker3\nSuccessfully removed manager1\nSuccessfully removed manager2\nSuccessfully removed manager3\n```  \n\n## Next steps\nCheck out the documentation on [Docker Swarm Mode](https://docs.docker.com/engine/swarm/) for more information.\n"
  },
  {
    "path": "Docker/swarm-mode/beginner-tutorial/swarm-node-hyperv-setup.ps1",
    "content": "# Swarm mode using Docker Machine\n\n$managers=3\n$workers=3\n\n# Change the SwitchName to the name of your virtual switch\n$SwitchName = \"New Virtual Switch\"\n\n# create manager machines\necho \"======> Creating manager machines ...\"\nfor ($node=1;$node -le $managers;$node++) {\n\techo \"======> Creating manager$node machine ...\"\n\tdocker-machine create -d hyperv --hyperv-virtual-switch $SwitchName ('manager'+$node)\n}\n\n# create worker machines\necho \"======> Creating worker machines ...\"\nfor ($node=1;$node -le $workers;$node++) {\n\techo \"======> Creating worker$node machine ...\"\n\tdocker-machine create -d hyperv --hyperv-virtual-switch $SwitchName ('worker'+$node)\n}\n\n# list all machines\ndocker-machine ls\necho \"======> Initializing first swarm manager ...\"\n$manager1ip = docker-machine ip manager1\n\ndocker-machine ssh manager1 \"docker swarm init --listen-addr $manager1ip --advertise-addr $manager1ip\"\n\n# get manager and worker tokens\n$managertoken = docker-machine ssh manager1 \"docker swarm join-token manager -q\"\n$workertoken = docker-machine ssh manager1 \"docker swarm join-token worker -q\"\n\n# other masters join swarm\nfor ($node=2;$node -le $managers;$node++) {\n\techo \"======> manager$node joining swarm as manager ...\"\n\t$nodeip = docker-machine ip manager$node\n\tdocker-machine ssh \"manager$node\" \"docker swarm join --token $managertoken --listen-addr $nodeip --advertise-addr $nodeip $manager1ip\"\n}\n# show members of swarm\ndocker-machine ssh manager1 \"docker node ls\"\n\n# workers join swarm\nfor ($node=1;$node -le $workers;$node++) {\n\techo \"======> worker$node joining swarm as worker ...\"\n\t$nodeip = docker-machine ip worker$node\n\tdocker-machine ssh \"worker$node\" \"docker swarm join --token $workertoken --listen-addr $nodeip --advertise-addr $nodeip $manager1ip\"\n}\n\n# show members of swarm\ndocker-machine ssh manager1 \"docker node ls\"\n"
  },
  {
    "path": "Docker/swarm-mode/beginner-tutorial/swarm-node-hyperv-teardown.ps1",
    "content": "### Warning: This will remove all docker machines running ###\ndocker-machine stop (docker-machine ls -q)\ndocker-machine rm --force (docker-machine ls -q)\n"
  },
  {
    "path": "Docker/swarm-mode/beginner-tutorial/swarm-node-vbox-setup.sh",
    "content": "#!/bin/bash\n\n# Swarm mode using Docker Machine\n\nmanagers=3\nworkers=3\n\n# create manager machines\necho \"======> Creating $managers manager machines ...\";\nfor node in $(seq 1 $managers);\ndo\n\techo \"======> Creating manager$node machine ...\";\n\tdocker-machine create -d virtualbox manager$node;\ndone\n\n# create worker machines\necho \"======> Creating $workers worker machines ...\";\nfor node in $(seq 1 $workers);\ndo\n\techo \"======> Creating worker$node machine ...\";\n\tdocker-machine create -d virtualbox worker$node;\ndone\n\n# list all machines\ndocker-machine ls\n\n# initialize swarm mode and create a manager\necho \"======> Initializing first swarm manager ...\"\ndocker-machine ssh manager1 \"docker swarm init --listen-addr $(docker-machine ip manager1) --advertise-addr $(docker-machine ip manager1)\"\n\n# get manager and worker tokens\nexport manager_token=`docker-machine ssh manager1 \"docker swarm join-token manager -q\"`\nexport worker_token=`docker-machine ssh manager1 \"docker swarm join-token worker -q\"`\n\necho \"manager_token: $manager_token\"\necho \"worker_token: $worker_token\"\n\n# other masters join swarm\nfor node in $(seq 2 $managers);\ndo\n\techo \"======> manager$node joining swarm as manager ...\"\n\tdocker-machine ssh manager$node \\\n\t\t\"docker swarm join \\\n\t\t--token $manager_token \\\n\t\t--listen-addr $(docker-machine ip manager$node) \\\n\t\t--advertise-addr $(docker-machine ip manager$node) \\\n\t\t$(docker-machine ip manager1)\"\ndone\n\n# show members of swarm\ndocker-machine ssh manager1 \"docker node ls\"\n\n# workers join swarm\nfor node in $(seq 1 $workers);\ndo\n\techo \"======> worker$node joining swarm as worker ...\"\n\tdocker-machine ssh worker$node \\\n\t\"docker swarm join \\\n\t--token $worker_token \\\n\t--listen-addr $(docker-machine ip worker$node) \\\n\t--advertise-addr $(docker-machine ip worker$node) \\\n\t$(docker-machine ip manager1)\"\ndone\n\n# show members of swarm\ndocker-machine ssh manager1 \"docker node ls\"\n\n"
  },
  {
    "path": "Docker/swarm-mode/beginner-tutorial/swarm-node-vbox-teardown.sh",
    "content": "#!/bin/bash\n### Warning: This will remove all docker machines running ###\n# Stop machines\ndocker-machine stop $(docker-machine ls -q)\n\n# remove machines\ndocker-machine rm $(docker-machine ls -q)\n"
  },
  {
    "path": "DockerCon/logging/getting-started.md",
    "content": "# Our First Logs\n\nLet's take a look at Docker Logging\n\n> **Tasks**:\n>\n>\n> * [Task 1: Log our first containers](#Task_1)\n> * [Task 2: Understanding the Docker Logs command](#Task_2)\n> * [Task 3: docker-compose logs](#Task_3)\n> * [Recap topics covered in this section](#Recap)\n\n## <a name=\"Task_1\"></a>Task 1: Start a Traefik Proxy to log\n\nNow that Docker is setup, it's time to get our hands dirty. In this section, you are going to run a reverse proxy called [Traefik](https://traefik.io/) container (a high-performance webserver, load-balancer, and proxy) on your system and get hands-on with the `docker logs` command.\n\n1. To get started, create a new directory `traefik` and change to the `traefik`directory\n\n   ``` \n   mkdir traefik\n   cd traefik\n   ``` \n\n2. Using your favorite editor create a new file named `traefik.toml`and add the below configuration to the newly created file.\n\n    ```\n    ################################################################\n    # API and dashboard configuration\n    ################################################################\n    123[api]\n    ################################################################\n    # Docker configuration backend\n    ################################################################\n    [docker]\n    domain = \"docker.local\"\n    watch = true\n    ################################################################\n    # Enable Access Logs\n    ################################################################\n    [accessLog]\n    ```\n\n3. Start the `Traefik` proxy. Ensure the `traefik.toml` is in your current working directory.\n\n  ```\n  docker run -d -p 8080:8080 -p 80:80 --name traefik \\\n  -v $PWD/traefik.toml:/etc/traefik/traefik.toml  \\\n  -v /var/run/docker.sock:/var/run/docker.sock traefik\n  ```\n\n\n4. Ensure the `Traefik` container is running by running the `ls` command with `-l` showing last container\n\n    ```\n     docker container ps -l\n   CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS       NAMES\n   0b2062765e41        traefik             \"/traefik\"          8 minutes ago       Exited (1) 8 minutes ago                  Traefik\n\n    ```\n\n    Uh oh, what happend?\n    We can actually use the `docker logs` command on stopped containers to troubleshoot. Great, let's do it.\n\n5. Check the logs of the `Traefik` container to see why the container didn't start\n\n    ```\n     docker container logs traefik\n     2019/04/25 15:11:51 Error reading TOML config file /etc/traefik/traefik.toml : \n     Near line 3 (last key parsed ''): bare keys cannot         contain '['\n    ```\n\n6. OK, remove the `Traefik` container\n\n    ```\n     docker container rm -f traefik\n    ```\n\n    > This is the forceful way to remove it. With great power comes great responsability. You are warned!\n\n7. Fix the `traefik.toml` configuration file line 4 removing `123` in front of the `[API]` block\n    ```\n    ################################################################\n    # API and dashboard configuration\n    ################################################################\n    [api]\n    ################################################################\n    # Docker configuration backend\n    ################################################################\n    [docker]\n    domain = \"docker.local\"\n    watch = true\n    ################################################################\n    # Enable Access Logs\n    ################################################################\n    [accessLog]\n    ``` \n\n8. Start `Traefik` with the fixed configuration file. Ensure the `traefik.toml` is in your current working directory.\n\n    ```\n    docker run -d -p 8080:8080 -p 80:80 --name traefik \\\n    -v $PWD/traefik.toml:/etc/traefik/traefik.toml  \\\n    -v /var/run/docker.sock:/var/run/docker.sock traefik\n    ```\n\n9. Ensure the `Traefik` container is running\n\n    ```\n     docker container ps -l\n    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                         NAMES\n    e72a26a2b752        traefik             \"/traefik\"          5 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp,0.0.0.0:8080->8080/tcp   traefik\n    ```\n\n10. Test the `Traefik` container with `curl` or open a browser tab and navigate to: `https://0.0.0.0`\n\n    ```\n     curl 0.0.0.0\n    ```\n\n    Go ahead and send a few curl/refresh request to the `Traefik` container.\n\n11. Check the logs\n\n    ```\n     docker container logs traefik\n    ```\n\n    > What do we see different? We should now see each curl/refresh we sent to the `Traefik` container\n\n\n    We should see a 404 error about no backends configured.\n\n\nNow, we will connect a `whoami` container to the `Traefik` proxy. This `whoami` container will register itself automatically with the proxy. The `Traefik` proxy routes traffic from `0.0.0.0`from the `Traefik` proxy to our new `whoami` application.\n\n`Traefik` watches the Docker daemon for new containers that join and start on thee server. When a new container starts it automatically registers it with `Traefik`\n\n12. Start the `whoami` container\n\n    ```\n    docker run -d --name whoami emilevauge/whoami\n    ```\n\n13. `curl` the whoami container using the Virtual Hostname `test.docker.local`configured in `Traefik`\n\n    ```\n     curl --header 'Host: whoami.docker.local' 'http://localhost:80/'\n    ```\n\nResponse\n    \n    ``` \n    Hostname: 299f3c36eb18\n    IP: 127.0.0.1\n    IP: 172.17.0.5\n    GET / HTTP/1.1\n    Host: test.docker.local\n    User-Agent: curl/7.47.0\n    Accept: */*\n    Accept-Encoding: gzip\n    X-Forwarded-For: 172.17.0.1\n    X-Forwarded-Host: test.docker.local\n    X-Forwarded-Port: 80\n    X-Forwarded-Proto: http\n    X-Forwarded-Server: 10744bcc8a7d\n    X-Real-Ip: 172.17.0.1\n    ```\n14. Finally, run the `docker container logs` command on the proxy to ensure everything is now working as expected\n\n    `docker container logs traefik`\n\n    > We now see the hostname which is queried and a `HTTP 200` success code\n    \n    ```\n    172.17.0.1 - - [25/Apr/2019:15:37:33 +0000] \"GET / HTTP/1.1\" 200 326 \"-\" \"curl/7.47.0\" 5 \"Host-whomai-docker-local-0\" \"http://172.17.0.5:80\" 1ms\n    172.17.0.1 - - [25/Apr/2019:15:37:36 +0000] \"GET / HTTP/1.1\" 200 326 \"-\" \"curl/7.47.0\" 6 \"Host-whoami-docker-local-0\" \"http://172.17.0.5:80\" 1ms\n    172.17.0.1 - - [25/Apr/2019:15:37:37 +0000] \"GET / HTTP/1.1\" 200 326 \"-\" \"curl/7.47.0\" 7 \"Host-whoami-docker-local-0\" \"http://172.17.0.5:80\" 0ms\n    ```\n\n\n### <a name=\"Task_2\"></a>Task 2: Understanding the Docker Logs Command\n\nThe `docker container logs` command is a powerful command and is used for troubleshooting, analyzing, and general information gathering. The command is useful to Developers to debug new applications as well as Operations for information gathering.\n\n1. Great! Let's now take a look at the `docker container logs` help to better understand how we can best use the command\n\n    ```\n     docker container logs --help\n\n    Usage:  docker logs [OPTIONS] CONTAINER\n\n    Fetch the logs of a container\n\n    Options:\n        --details        Show extra details provided to logs\n    -f, --follow         Follow log output\n        --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)\n        --tail string    Number of lines to show from the end of the logs (default \"all\")\n    -t, --timestamps     Show timestamps\n        --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)\n    ```\n\n2. Add timestamps to our logging output. This will help with narrowing down when events occured if no timestamp is created in the log message.\n\n    ```\n     docker container logs -t traefik\n    ```\n\n3. Tail the last `n` number of lines in the log file\n\n    This is extremely helpful when logs become very big. If you were to run a `docker logs` command on a large log it could over run your terminal winder\n\n\n    ```\n     docker container logs --tail 5 traefik\n    ```\n\n4. Follow the log for real-time updates.\n\n    ```\n     docker container logs -t -f traefik\n    ```\n    \n    Curl the `whoami` container a couple times to see the log update. Remember the IP address of the node you are on by looking at the command prompt `root@ip_address`. \n    \n    Switch to a different worker node and run the below command.\n    \n    ``` \n    curl --header 'Host: whoami.docker.local' 'http://<ip_address_host>:80/'\n    ``` \n\n5. Switch back to the original Worker and Restart the `Traefik` container\n\n     ```\n     docker container restart traefik\n    ```\n\n6. Check the logs again. What do you notice?\n\n    ```\n     docker container logs traefik\n    ```\n\n    > The logs still persist inside the container from our previous tests.\n\n7. Stop and remove the `Traefik` container\n\n    ```\n     docker container rm -f traefik\n    ```\n\n8. Start `Traefik` again\n\n    ```\n    docker run -d -p 8080:8080 -p 80:80 --name traefik \\\n    -v $PWD/traefik.toml:/etc/traefik/traefik.toml  \\\n    -v /var/run/docker.sock:/var/run/docker.sock traefik\n    ```\n\n9. Check the logs. What do you notice?\n\n    ```\n     docker container logs traefik\n    ```\n\n    > This time we removed the container and started a new container. It is important to notice now the logs didn't persist. This is why   it is important we persist logs outside of the containers.\n\n10. Cleanup running containers\n\n    ` docker container rm -f whoami traefik`\n\n\n### <a name=\"Task_3\"></a>Task 3: docker-compose and logging\n\nWe have now seen how logging works in a single container. Now, we want to see what logs look like when multiple containers are running in a compose file. In this example we will use the docker voting application. This stack contains 3 different containers running with one docker-compose file.\n\n1. In the `Setup`section we cloned the Repo. If you haven't done so please do it now\n\n    ```\n     git clone https://github.com/vegasbrianc/docker-compose-demo.git\n    ```\n\n2. Start the Compose demo with docker-compose.\n\n    ```\n     cd docker-compose-demo\n\n     docker-compose up -d\n    ```\n\n3. Once the voting application stack has started. Check the logs of the voting app stack.\n\n\n    ```\n     docker-compose logs\n    ```\n\n    What we notice is that Docker color codes the log based on container names. Since we have 3 different containers this makes it easier when viewing from a terminal window.\n\n4. Expanding the command to capture certain containers\n\n    ```\n     docker-compose logs reverse-proxy\n    ```\n\n5. Combing everything we learned follow and timestamp the logs\n\n    ```\n     docker-compose logs -f -t reverse-proxy\n    ```\n\n### Cleanup\n\n1. Time to stop and remove the running containers\n\n    ```\n     docker-compose rm -fs\n    ```\n\n\n## <a name=\"Terminology\"></a>Recap\n\nWhat did we learn in this section?\n\n* Running `docker container logs` on stopped containers\n* Troubleshooting containers\n* The `docker container logs`command is actually quite powerful and can be combined with other tools like the Linux `grep` command or others\n* Logs don't persist in containers once the container is removed\n* `docker-compose logs` works similarly to `docker container logs` but displays all containers in the compose stack\n\n## Next Steps, Docker Swarm & Logs\nFor the next step in the workshop, head over to [Docker Swarm & Logging](./log-drivers.md)\n"
  },
  {
    "path": "DockerCon/logging/log-drivers.md",
    "content": "# Docker Swarm & Logging\n\nIn the previous exercise we saw how to check out logs for running containers on a single host. In this section we'll be creating services across a Swarm and shipping those logs to a centralized location for easier storage and querying.\n\n> **Tasks**:\n>\n>\n> * [Task 1: Setup the logging stack](#Task_1)\n> * [Task 2: Configure services to log centrally](#Task_2)\n> * [Task 3: Querying logs in Kibana](#Task_3)\n> * [Task 3: Create a Dashboard](#Task_4)\n> * [Recap topics covered in this section](#Recap)\n\n## <a name=\"Task_1\"></a>Task 1: Setup the logging stack\n\nFor this exercise we're going to use the popular ELK logging stack:\n\n- [ElasticSearch](https://www.elastic.co/) (for storing and indexing large datasets)\n- [Logstash](https://www.elastic.co/products/logstash) (for ingesting raw logs and optionally transforming them before sending them to ElasticSearch)\n- [Kibana](https://www.elastic.co/products/kibana) (a web UI for querying into ElasticSearch)\n\n1. **Change to the Manager Node** \n\n2. To get started, let's run the following in our terminal:\n\n    ```\n    git clone https://github.com/deviantony/docker-elk.git\n    \n    Cloning into 'docker-elk'...\n    remote: Counting objects: 1238, done.\n    remote: Compressing objects: 100% (3/3), done.\n    remote: Total 1238 (delta 0), reused 1 (delta 0), pack-reused 1235\n    Receiving objects: 100% (1238/1238), 260.98 KiB | 7.68 MiB/s, done.\n    Resolving deltas: 100% (468/468), done.\n    ```\n\n> **Note:** The ELK stack we're using here is a Dockerized version created by [Anthony Lapenna](https://github.com/deviantony)\n\n2. Move into the `docker-elk` directory and switch to the `docker-stack` branch.\n\n    ```\n    cd docker-elk/ \n    ls\n\n    LICENSE           README.md         docker-stack.yml  elasticsearch     extensions        kibana\n\n    ```\n\n\n### Deploy the ELK stack file to the Swarm\n\n**Docker Desktop Users:** Before continuing, check your Docker for Desktop preferences -> Kubernetes\nIf \"Deploy Docker Stacks to Kubernetes by default\" is checked, uncheck. If left checked, the following command will fail.\n\n1. Now we have the stack downloaded, we can deploy it to the Swarm.\n\n    ```\n    docker stack deploy -c docker-stack.yml elk\n\n    Creating network elk_elk\n    Creating config elk_elastic_config\n    Creating config elk_kibana_config\n    Creating service elk_logstash\n    Creating service elk_kibana\n    Creating service elk_elasticsearch\n    ```\n\nWe can see that Docker created a lot of components on our Swarm.\n\n- `network elk_elk` : a new overlay network so that our services can talk to each other\n- `config elk_elastic_config` : configuration for ElasticSearch\n- `config elk_kibana_config` : configuration for Kibana\n- `service elk_logstash` : service for Logstash\n- `service elk_kibana` : service for Kibana\n- `service elk_elasticsearch` : service for ElasticSearch\n\n\n2. Let's `watch` the `docker service ls` command to make sure they all start without any errors:\n\n    ```\n     watch docker service ls\n\n    Every 2s: docker service ls                                2018-06-12 16:18:31\n\n    ID                  NAME                MODE                REPLICAS            IMAGE                                                     PORTS\n    q3qpjimjsom3        elk_elasticsearch   replicated          0/1                 docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.2   *:9200->9200/tcp,*:9300->9300/tcp\n    77hwcyksqdne        elk_kibana          replicated          0/1                 docker.elastic.co/kibana/kibana-oss:6.2.2                 *:5601->5601/tcp\n    8sbocpf7462e        elk_logstash        replicated          0/1                 docker.elastic.co/logstash/logstash-oss:6.2.2             *:12201->12201/udp\n    ```\n\n\n3. Once the services have all converged, let's check that we can access the Kibana web UI. \n\n**PWD**\nIf you're using PWD then open UCP -> Swarm -> Services -> elk_kibana. Open the endpoint URL in a browser tab. \n\n**Deployed locally**\nIf you deployed to a local cluster, you should visit the IP of one of your nodes on port `5601` or just http://localhost:5601\n\n* user: elastic\n* password: changeme\n\n\nYou should see the Kibana dashboard appear.\n\n![](kibananew.png)\n\n### <a name=\"Task_2\"></a>Task 2: Configure services to log centrally\n\nNow that we have our logging infrastructure setup, let's create a service that will send logs over to it.\n\n1. We have deployed Logstash and exposed port 12201 as an ingress port, which means we can hit any IP in our cluster on that port to send traffic to Logstash, regardless if it's running on that host or not. Let's grab the IP of the host we're on and use that.\n\n    ```\n    # Play-with-Docker users\n     LOGSTASH=localhost\n\n    # Mac users\n     LOGSTASH=0.0.0.0\n    ```\n\n2. Now let's start a new test service and pass some logging options so that Docker knows to ship our logs to Logstash.\n\n    ```\n     docker service create \\\n        --name logging-test1 \\\n        --mode global \\\n        --log-driver=gelf \\\n        --log-opt gelf-address=udp://${LOGSTASH}:12201 \\\n        --log-opt tag=\"LogTest1 - {{.Name}}/{{.ImageName}}\" \\\n        alpine \\\n        ping google.com\n\n    mhfj8gujc0ynej6u8ybo3car9\n    overall progress: 5 out of 5 tasks\n    kw9vz2dve3t9: running   [==================================================>]\n    0cjj9gwlbjkh: running   [==================================================>]\n    oy0quc1fh770: running   [==================================================>]\n    4mrklhm2r3vh: running   [==================================================>]\n    vu1dusztugvu: running   [==================================================>]\n    verify: Service converged\n    ```\n\nLet's run through some of the options here:\n\n- `--name logging-test1` : name of the service\n- `--mode global` : one container per Swarm host\n- `--log-driver=gelf` : we're going to use the GELF (Graylog Extended Log Format) driver\n- `--log-opt gelf-address=udp://${LOGSTASH}:12201` : telling Docker where to send our GELF-formatted logs\n- `--log-opt tag=\"LogTest1 - {{.Name}}/{{.ImageName}}\"` : adding a tag to our service for easier querying later\n- `alpine` : the image we want to run\n- `ping google.com` : the command our service is going to run\n\n> **Notes:**\n> - More information about GELF can be found in the Docker [docs here](https://docs.docker.com/config/containers/logging/gelf/)\n> - GELF is just one driver available for Docker, for more check out [this page](https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers)\n> - The `tag` logging option is useful as we can use Go's templated strings in there for additional metadata, a full list of the available templates is [here](https://docs.docker.com/config/containers/logging/log_tags/)\n\n3. Check the service is up:\n\n    ```\n     docker service ps logging-test1\n    ID                  NAME                                      IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR          PORTS\n    d9z4jarhh0bd        logging-test1.4mrklhm2r3vhoa6be3e47r50j   alpine:latest       manager1            Running             Running 3 minutes ago\n    6k6rlloh8rk9        logging-test1.kw9vz2dve3t9hz06rrrvun9uf   alpine:latest       manager2            Running             Running 3 minutes ago\n    xc5210kz8d6x        logging-test1.vu1dusztugvumrbu3bt3wnqtx   alpine:latest       worker1             Running             Running 3 minutes ago\n    a7p9pz88vgb3        logging-test1.0cjj9gwlbjkhev9m5ypu9hcl6   alpine:latest       manager3            Running             Running 3 minutes ago\n    crzpzqp93vcr        logging-test1.oy0quc1fh770f3phjd2dlir5y   alpine:latest       worker2             Running             Running 3 minutes ago\n\n    ```\n\n\n### <a name=\"Task_3\"></a>Task 3: Querying Logs in Kibana\n\nNow that we have our ELK stack setup, and a service logging to it, let's look in Kibana and review the logs.\n\n1. Before we can query logs in Kibana, we need to setup the _index_. This is pretty straightforward as long as we have some data in our ElasticSearch instance (which by now we should do!).\n\n    1. Open your Kibana tab (or re-open it if you closed it after we verified it was up earlier, it should be on port `5601`).\n\n    2. Click on the 'Setup Index Patterns' button on the top-right'.\n\n    ![](kibananew.png)\n\n    3. Enter `logstash-*` as the pattern and hit 'Next Step'.\n\n    ![](indexpattern.png)\n\n    4. Select `@timestamp` from the drop-down and choose 'Create Index Pattern'.\n\n    ![](timestamp.png)\n\n    5. Click 'Discover' on the left-hand menu bar.\n\n2. You should now be looking at the main querying interface of Kibana. Let's add some fields to make the viewing pane a little cleaner.\n\nHover over the `message` field on the left-hand field list, and hit the `add` button. Repeat for the `container_name` and `tag` fields.\n\n![](fields.png)\n\n3. We can see that Kibana shows us all the log messages (ping output) from every container in our Swarm, including some additional metadata.\n\nLet's filter on everything from a specific host.\n\n- Click on the `source_host` field in the left-hand field list and remember one of the host IP addresses.\n\n- Above the field list, click the `Add Filter` button and then choose `source_host` as the field, `is` as the operator, and type your chosen IP into the `Value` field.\n\n- The output should change and you will see only logs from that host.\n\n- Now let's run another service so we can query on the tag field.\n\n- Back on one of your manager nodes, run the following:\n\n     ```\n    docker service create \\\n    --name logging-test2 \\\n    --mode global \\\n    --log-driver=gelf \\\n    --log-opt gelf-address=udp://${LOGSTASH}:12201 \\\n    --log-opt tag=\"LogTest2 - {{.Name}}/{{.ImageName}}\" \\\n    alpine \\\n    ping facebook.com\n\n    l7spcatz359qqehuj2sd0rddm\n    overall progress: 1 out of 1 tasks\n    1/1: running   [==================================================>]\n    verify: Service converged\n    ```\n\n    - Once the service has converged head back to Kibana.\n\n5. Let's also query on the contents of the `tag` field.\n\nIn the search bar at the top of the UI, enter the following query:\n\n```\ntag: LogTest2*\n```\n\nYou should see the list of logs update to show only those from your new service.\n\n\n6. Feel free to play around with other services and tags, and construct different queries in the Kibana UI. Documentation on the Lucene syntax that ElasticSearch and Kibana use for querying can be [found here](https://www.elastic.co/guide/en/elasticsearch/reference/6.x/query-dsl-query-string-query.html#query-string-syntax).\n\n\n### <a name=\"Task_4\"></a>Task 4: Create a Dashboard\nIn this section we will create a simple dashboard based on the ping data we are receiving.\n\n1. Click `Visualize` on the left-hand menu bar.\n2. Click \"Create new Visualization\"\n3. Select the Data -> Metric visualization\n\n![](elk_visualization.png)\n\n4. On the left-hand menu select 'Count' as the aggregation type and fill in the custom label to name your visualization.\n5. Upper right hand of the ELK screen on the menu bar, select Save.\n6. Type in a name of the visualization\n\n\n**Next, we will create a pie graph**\n\n1. Click `Visualize` on the left-hand menu bar.\n2. Click \"Create new Visualization\" this time it is '+' symbol\n3. Select the Basic charts -> Pie visualization\n\n![](pie_chart.png)\n\n4. On the left-hand menu select `Count` as the aggregation type and fill in the custom label to name your visualization.\n5. Expand the Buckets section\n6. Select `Count` as the aggregation type\n7. Bucket -> Split Splices\n8. Aggregation Type -> Term\n7. Field -> host.keyword\n8. Order by -> metric: Count by host\n9. Order -> Decending -> 5\n10. Custom Label -> Hosts\n11. Upper right hand of the ELK screen on the menu bar, select Save.\n12. Type in a name of the visualization\n\n![](configs.png)\n\n**Finally, put the two new visualizations in a Dashboard**\n\n1. Click 'Dashboard' on the left-hand menu bar.\n2. Click 'Add' button either in the middle of the screen or upper right hand corner menu\n3. Click the names of the two visualizations that we named earlier.\n\n![](dashboard.png)\n\n### Clean Up\n\nRemove the ELK Swarm Stack and running services\n\n  ```\n  docker service rm logging-test1 logging-test2\n  docker stack rm elk\n  ```\n\n### Recap\nWhat did we learn in this section?\n\n* Setting up an ELK stack in our Swarm cluster\n* Configuring Docker services to ship logs to our central ELK stack\n* Filtering and querying on logs in Kibana\n* Create a simple dashboard\n\n\n## Next Steps\nFor the next step in the tutorial, head over to the [Docker Monitoring](../monitoring/stats.md) section.\n"
  },
  {
    "path": "DockerCon/logging/setup.md",
    "content": "## Setup\n\n### Prerequisites\nThere are no specific skills needed for this tutorial beyond a basic comfort with the command line and using a text editor. Prior experience in developing web applications will be helpful but is not required.\n\n### Play-with-Docker (PWD)\n\nLogin to Play-with-Docker [Play-with-Docker](https://dockr.ly/brian)\n\n### Setting up your computer\nGetting all the tooling setup on your computer can be a daunting task, but getting Docker up and running on your favorite OS has become very easy.\n\n**Ensure Docker Swarm is enabled**\n\n   ```\n   docker swarm init --advertise-addr <your_ip_address>\n   ```\n\nThe *getting started* guide on Docker has detailed instructions for setting up Docker on [Mac](https://docs.docker.com/docker-for-mac/), [Linux](https://docs.docker.com/engine/installation/linux/) and [Windows](https://docs.docker.com/docker-for-windows/).\n\n*If you're using Docker for Windows* make sure you have [shared your drive](https://docs.docker.com/docker-for-windows/#shared-drives).\n\n*All commands work in either bash or Powershell on Windows*\n\n\tOnce you are done installing Docker, test your Docker installation by running the following:\n\t\n\n\t```\n\tdocker container run hello-world\n\tUnable to find image 'hello-world:latest' locally\n\tlatest: Pulling from library/hello-world\n\t03f4658f8b78: Pull complete\n\ta3ed95caeb02: Pull complete\n\tDigest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7\n\tStatus: Downloaded newer image for hello-world:latest\n\t```\n\n\tHello from Docker.\n\tThis message shows that your installation appears to be working correctly.\n\t...\n\t\n### Start the Docker Pull & deploy\n\n``` \ngit clone https://github.com/vegasbrianc/docker-compose-demo.git && cd docker-compose-demo/ && docker-compose pull\n```\n\n## Next Steps\nFor the next step in the tutorial, head over to [Getting Started with Logging](getting-started.md)\n"
  },
  {
    "path": "DockerCon/monitoring/cadvisor.md",
    "content": "# Google cAdvisor (Container Asvisor)\n\n<img src=\"https://raw.githubusercontent.com/56kcloud/Training/master/img/cadvisor-logo.png\" alt=\"cAdvisor Logo\" width=\"150\" height=\"99\"> \n\n[cAdvisor](https://hub.docker.com/r/google/cadvisor/) is an amazing tool. It is an all-in-one tool for grabbing real-time metrics from all the containers running on a single host and exposing these metrics. The cAdvisor collects, aggregates, processes, and exports usage and performance information from running containers.\n\nIn this section we will deploy a cAdvisor container and walk through the UI, configurations, and take a look at the metrics which it exposes.\n\n> **Tasks**:\n>\n>\n> * [Task 1: Deploy cAdvisor](#Task_1)\n> * [Task 2: Tour the cAdvisor UI and configurations](#Task_2)\n> * [Task 3: cAdvisor Exposed Metrics](#Task_3)\n> * [Recap topics covered in this section](#Recap)\n\n## <a name=\"Task_1\"></a>Task 1: Deploy cAdvisor\n\nLet's get started with deploying cAdvisor. First, we will review the cAdvisor GitHub Repos. The repo contains a wealth of documentation from using the UI to configurations. Take some time and dive into the different aspects of cAdvisor.\n\n> We recommend using [Play-with-Docker](https://labs.play-with-docker.com/) for this exercise to alleviate any permissions issues or Windows issues with having to run sudo.\n\n\n1. Navigate to [cAdvisor GitHub Repo](https://github.com/google/cadvisor)\n\n\n2. Deploy cAdvisor:\n\n    **PWD USERS**\n    ```\n    sudo docker service create \\\n    --publish published=8081,target=8080 \\\n    --detach=true \\\n    --name=cadvisor \\\n    google/cadvisor:latest\n    ```\n  > Since we are using `PWD` we cannot don't have permissions to bind mount root directories. For normal deployments please review the [cAdvisor documentation](https://github.com/google/cadvisor)\n\n    **Docker for Desktop**\n\n    ```\n    sudo docker run \\\n    --volume=/:/rootfs:ro \\\n    --volume=/var/run:/var/run:ro \\\n    --volume=/sys:/sys:ro \\\n    --volume=/var/lib/docker/:/var/lib/docker:ro \\\n    --volume=/dev/disk/:/dev/disk:ro \\\n    --publish=8080:8080 \\\n    --detach=true \\\n    --name=cadvisor \\\n    google/cadvisor:latest\n    ```\n\n\n### <a name=\"Task_2\"></a>Task 2: Tour the cAdvisor UI and configurations\n\n1. Once the cAdvisor is running open the UCP -> Swarm -> Services -> cAdvisor link 8081 which is located at the top of the screen\n\nHave a look at the cAdvisor UI. What we see here is a host performance view. Scroll through the various screens to view Reservations, CPU, Memory, Network, and Storage.\n\n2. Scroll to the top of the screen and click `Docker Containers`\n\n> Here we see all the `Compose Demo Stack` containers. Choose one of the containers and view the specific resource consumption of just that particular container.\n\n\n### <a name=\"Task_3\"></a>Task 3: cAdvisor Exposed Metrics\n\nNow, we will have a look to see how cAdvisor exposes the metrics it is gathering from running containers. As default, cAdvisor exposes metrics in the [Prometheus format](https://prometheus.io/docs/instrumenting/writing_exporters/)\n\n## Cleanup\n\n  ```\n  docker stack rm vote\n  ```\n\n  ```\n  docker rm -f cadvisor\n  ``` \n\n## <a name=\"Terminology\"></a>Recap\n\nWhat did we learn in this section?\n\n* Google's Container advisor `cAdvisor`\n* Deploy cAdvisor UI and configurations\n* cAdvisor exposed metrics\n\n## Next Steps, Docker Networking\nFor the next step in the tutorial, head over to [Prometheus](./monitoring-stack.md)"
  },
  {
    "path": "DockerCon/monitoring/monitoring-stack.md",
    "content": "# Deploy the Promethues Monitoring Stack, understand the components, and monitor containers\n\n<img src=\"https://raw.githubusercontent.com/56kcloud/Training/master/img/prometheus.gif\" alt=\"Prometheus Logo\" width=\"150\" height=\"99\"> \n\nThe wait is finally over let's get monitoring.\n\n> **Tasks**:\n>\n>\n> * [Task 1: Deploy the monitoring stack](#Task_1)\n> * [Task 2: Prometheus Walkthrough](#Task_2)\n> * [Task 3: Getting familiar with Grafana](#Task_3)\n> * [Task 4: Monitoring containers with the Prom Stack](#Task_4)\n> * [Recap topics covered in this section](#Recap)\n\n\n## <a name=\"Task_1\"></a>Task 1: Deploy the monitoring stack\n\nWe will now deploy a complete monitoring stack based on the following services: Prometheus, node-exporter, alertmanager, cAdvisor, and Grafana. This monitoring stack is meant to be a kick start to help you get familiar with the tools and the setup. \n\nThis section we will walk through the various components and explain where and how to configure the docker Swarm stack for Prometheus.\n\n1. For those using PWD Login to a different [PWD](https://labs.play-with-docker.com/) and create a Docker account if you don't already have one.\n\n2. Clone the monitoring repository and change into the `prometheus` directory\n\n  ```\n  git clone https://github.com/vegasbrianc/prometheus.git\n  cd prometheus\n  ```\n\n3. Deploy the Prometheus monitoring stack\n \n ```\n docker stack deploy -c docker-stack.yml prom\n ``` \n4. Next, we will head over to the Prometheus stack project. Open [Prometheus Monitoring Stack](https://github.com/vegasbrianc/prometheus) in a new tab.\n\n5. Let's have a look at the different components deployed\n\n    **Prometheus:** An open-source monitoring and alerting application that stores time series data with a powerful query language. Prometheus is pull based collection of metrics.\n\n    **node-exporter:** A Prometheus Exporter for hardware and OS metrics for *NIX kernels.\n\n    **Alertmanager:** The Prometheus Alertmanager handles alerts sent by client applications and routes them to the proper receiver (email, SMS, Pager Duty, etc) \n\n    **cAdvisor:** The Container advisor collects metrics for all the running containers on each host which it runs.\n\n    **Grafana:** The open-source dashboard visualization tool\n\n6. Open the deployed components\n\n    **Prometheus:** `http://0.0.0.0:9090`\n\n    **node-exporter:** `http://0.0.0.0:9100/`\n\n    **Alertmanager:** `http://0.0.0.0:9093/`\n\n    **cAdvisor:** `http://0.0.0.0:8080/`\n\n    **Grafana:** `http://0.0.0.0:3000/` \n    \n    user - `admin`\n    password - `foobar`\n\n\n### <a name=\"Task_2\"></a>Task 2: Prometheus Walkthrough\nNow that we deployed the Prometheus Monitoring stack let's have a look at what is running:\n\n1. Configs CLI / UI: \n * In your Terminal Navigate to the `Prometheus/prometheus` directory and open the `prometheus.yml`. Here is where we can define which targets to scrape.\n * In your terminal\n * In the Prometheus UI Click the Status menu - > Command-Line Flags (Provides commands passed to Prometheus via the `docker-compose.yml` file)\n * In the Prometheus UI Click the Status menu - > Configuration (Provides scrape target configuration informaiton)\n\n2. Targets\n* Click the Status menu -> Targets (Provides health status of Targets)\n* Click the Status menu -> Service Discovery (Displays which services are being queried for Service Discovery)\n\n3. Alerts\n* In the Promethues UI Click the Alerts Menu and expand the alerts.\n\n4. Graph: \n* In the Prometheus UI Click the Graph Menu.\n* Select the last metric in the list `up` from the drop down list and click `Execute`\n* Click on the following link which runs several Prometheus Queries (For PWD users change 0.0.0.0 to your PWD URL) [http://0.0.0.0:9090/graph?g0.range_input=1h&g0.expr=up&g0.tab=0&g1.range_input=1h&g1.expr=container_cpu_load_average_10s%7Bcontainer_label_com_docker_swarm_node_id!%3D%22%22%7D&g1.tab=0&g2.range_input=1h&g2.expr=container_memory_usage_bytes%7Bcontainer_label_com_docker_swarm_node_id!%3D%22%22%7D&g2.tab=0](http://0.0.0.0:9090/graph?g0.range_input=1h&g0.expr=up&g0.tab=0&g1.range_input=1h&g1.expr=container_cpu_load_average_10s%7Bcontainer_label_com_docker_swarm_node_id!%3D%22%22%7D&g1.tab=0&g2.range_input=1h&g2.expr=container_memory_usage_bytes%7Bcontainer_label_com_docker_swarm_node_id!%3D%22%22%7D&g2.tab=0)\n\n> INFO: Prometheus does not contain Users and Roles Access Control (RBAC). It is recommended that you deploy a proxy in front of Prometheus in order to protect your deployment with users/passwords.\n\n### <a name=\"Task_3\"></a>Task 3: Getting Familiar with Grafana\n\nGrafana is an amazing tool which is easy to configure and use. Since Grafana version 5.0.0 enables us to easily provision Dashboards and Datasources (Woohoo!). We will walk through the configuration of Grafana and in the next section start building Dashboards.\n\n1. Configs / Provisioning\n* In your Terminal Navigate to the `Prometheus/grafana` directory\n* Open the `config.monitoring` file. Here is where we set the inital password for Grafana\n\n2. Data Sources - All files placed in the `Prometheus/grafana/provisioning/datasources` directory will be provisioned when running `docker stack deploy`. View the `YAML` file located in this directoy\n\n3. Dashboards - All files placed in the `Prometheus/grafana/provisioning/dashboards` directory will be provisioned when running `docker stack deploy` View the `YAML` file located in this directoy which is the Dashboard configuration and the `JSON` file is the dashoard itself.\n\n4. Login to Grafana `http://0.0.0.0:3000/` \n    \n    user - `admin`\n    password - `foobar`\n\n5. Click the gear icon (Settings) in the left bar -> Data Sources\n\n6. Open the Prometheus Datasource. Here we can see the settings provisoned from the `YAML` file above. Notice the URL to the Datasource is the DNS name of the container.\n\n1. At the bottom of the screen click the `Back` button \n\n8. In the Datasource Menu select the Plugins menu\n\n### <a name=\"Task_3\"></a>Task 4: Monitoring Containers / Hosts with the Prometheus Stack\n\nIn the final section we will build a Dashboard based on the Prometheus stack. We will create a simple Status Dashboard highlighting the Systems State, Containers performance, and Diskspace. Let's do this!\n\n### Create Single Stat Uptime\n1. In the Grafana UI click the + -> Create Dashboard menu\n2. Select Single Stat\n3. On the Panel Title click the Menu -> Edit button.\n4. Click the Datasource option -> Prometheus\n5. Add the `time() - avg(node_boot_time_seconds)` which takes the current time and subtracts it from the boot time to give us the average Uptime of all servers in the cluster\n6. Click the Options Tab -> Set the unit to Time -> Seconds\n7. Set the Decimal to 0\n8. Click the General Tab and Rename the Panel to Uptime\n9. Save Dashboard\n\n\n### Create Single Stat Targets Online\n1. At the top right of the screen click -> Add Panel(looks like a graph) -> Single Stat button and move it next to the Uptime panel\n2. Add a new Single Stat\n3. On the Panel Title click the Menu -> Edit button.\n4. Click the Datasource option -> Prometheus\n5. Add the query `sum(up)`\n6. Click the Options Tab\n7. Check the Background box (Invert the colors if the background is Red)\n8. Set the threshold to `0,3`\n9. Click the Value Mappings Menu\n10. Set the following Value Mappings:\n* 3 -> Up\n* 2 -> Down\n* 1 -> Down\n* 0 -> Down\n11. Click the General tab and rename the panel to `Targets Online`\n12. Save Dashboard\n\n### Create Memory Usage by Container Graph\n1. At the top right of the screen click -> Add Panel -> Graph button and move it below the single stat panels\n2. On the Panel Title click the Menu -> Edit button.\n3. Click the Datasource option -> Prometheus\n4. Add the Metric `topk(5, container_memory_usage_bytes{name=~\".+\"})`\n5. To make the container names more readable add `{{name}}`to the Legend Format field\n6. Select the Axes Tab\n7. Change the Unit on `Left Y` to Data (Metric) -> Bytes\n8. Switch to General Tab\n9. Rename panel to `Memory Usage by Container`\n10. Switch to the Display Tab\n11. Under Mode options select Fill = 5\n12. Save Dashboard\n\n### Create CPU Usage by Container Graph\n1. At the top right of the screen click -> Add Panel -> Graph button and move it below the single stat panels\n2. On the Panel Title click the Menu -> Edit button.\n3. Click the Datasource option -> Prometheus\n4. Add the Metric \n`container_cpu_load_average_10s{image!=\"\"}`\n5. To make the container names more readable add `{{name}}`to the Legend Format field\n6. Select the Axes Tab\n7. Change the Unit on `Left Y` to None -> Percent (0-1.0)\n8. Switch to General Tab\n9. Rename panel to `CPU Usage by Container`\n10. Switch to the Legend Tab\n11. Select values `Avg` and `Current`\n12. Under Options Select `Show` and `Table`\n13. Save Dashboard\n\n## Change the time range\n1. The upper right hand corner of Grafana, select the quick range `15 minutes`.\n\nHere is what the final Dashboard should look like:\n\n<img src=\"https://raw.githubusercontent.com/56kcloud/Training/master/img/dashboard.png\" alt=\"Dashboard Workshop Demo\" width=\"500\" height=\"250\"> \n\n### Import Dashboards\nIn the last section we can quickly import Dashboards from [Grafana Dashboards](https://grafana.com/dashboards)\n\n1. In the Grafana UI click the `+` -> Create Dashboard menu -> Import\n2. Type in the ID# 395 or ID#893 and Click the `Import`button\n3. Select Prometheus as the Datasource \nNew Dashboards Import Dashboard 395 & 893\n4. Now search [Grafana Dashboards](https://grafana.com/dashboards) for a Docker Dashboard. Select a dashboard and find the ID# of the dashboard\n5. Import the Dashboad using steps 1-3 above\n\n## <a name=\"Terminology\"></a>Recap\n\nWhat did we learn in this section?\n\n* Deploy Alertmanager, cAdvisor, Grafana, node-exporter, & Prometheus \n* Explore the components of the Prometheus stack\n* Familiarize with Grafana\n* Build Grafana Dashboards\n\n## Slides / Links / Resources \nFor the next step in the tutorial, head over to [Workshop Resources](../resources/links.md)"
  },
  {
    "path": "DockerCon/monitoring/stats.md",
    "content": "# Docker Stats, Top, and other built-in Monitoring Tools\n\nTime to dive into the world of monitoring. First, we will explore the various built-in tools offered by Docker\n\n> **Tasks**:\n>\n>\n> * [Task 1: Docker Stats](#Task_1)\n> * [Task 2: Docker System info, events, df](#Task_2)\n> * [Task 3: Docker Top](#Task_3)\n> * [Task 4: Recap](#Task_4)\n\n## <a name=\"Task_1\"></a>Task 1: Docker Stats\n\nFirst, we need to start some containers to monitor. Return back to the voting application directory we used in the logging section and start the Vote App stack. `docker stats` uses the same concept as most monitoring tools as it is querying the docker daemon directly for information. We can query ID's, Names, CPU, Memory, Network, storage, and processes.\n\n1. To get started, let's start the compose demo application stack again:\n\n    ```\n    cd docker-compose-demo\n\n    docker-compose up -d\n    ```\n\n2. Now, let's take a look at the `stats` of the individual containers running in the Vote App stack \n\n    ```\n    docker stats\n\n    CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS\n    d4bd451f0b68        demo3_worker_1      0.98%               21.77MiB / 1.952GiB   1.09%               466kB / 717kB       43MB / 0B           17\n    1aaa67a5a5a8        redis               0.46%               1.344MiB / 1.952GiB   0.07%               330kB / 153kB       2MB / 0B            4\n    d6d556507c0f        demo3_vote_1        0.40%               31.23MiB / 1.952GiB   1.56%               3.34kB / 0B         14.3MB / 0B         3\n    511eb5d3a5f4        db                  0.33%               8.641MiB / 1.952GiB   0.43%               432kB / 346kB       27.4MB / 119kB      8\n    7c726e569b7b        demo3_result_1      0.07%               38.05MiB / 1.952GiB   1.90%               154kB / 45.6kB      35.3MB / 12.3kB     20\n    ```\n\n    > Notice the screen refreshes automatically. We also notice that no limits have been set for Memory. Shame shame!\n\n3. We can also narrow the `stats` command to just a selected container\n\n    ``` \n    docker stats redis\n    CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS\n    1aaa67a5a5a8        redis               0.46%               1.344MiB / 1.952GiB   0.07%               657kB / 302kB       2MB / 0B            4\n    ``` \n\n### <a name=\"Task_2\"></a>Task 2: Docker System info and df\n\nDocker has some great built-in tools. We just have to know where to find them.\n\n1. The `docker system info` command provides an overview of the docker host indicating total available CPU, memory, storage, etc\n\n    `docker system info`\n\n    > Scroll through the output to see all the available information\n\n\n2. One of the most important commands in the Linux world to check storage is `df` (Display free disk space). Docker has tailored the `df` command for containers. Now we see storage information about Containers, Images, and Volumes.\n\n    ```\n    docker system df\n    TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE\n    Images              51                  14                  6.868GB             6.349GB (92%)\n    Containers          21                  5                   679.2kB             378.9kB (55%)\n    Local Volumes       19                  4                   116.4MB             79.21MB (68%)\n    Build Cache                                                 0B                  0B\n    ```\n\n### <a name=\"Task_3\"></a>Task 3: Docker Top\n\nBackground containers are how you'll run most applications. Here's a simple example using MySQL.\n\n1. You can check the processes which run in your containers : `docker container top`\n\n    Let's look at the running processes inside the container.\n\n    ```\n    docker container top redis\n    PID                 USER                TIME                COMMAND\n    8480                rpc                 0:00                redis-server\n    ```\n\n    You should see the redis demon (`redis-server`) is running. Note that the PID shown here is the PID for this process on your docker host. To see the same `redis-server` process running as the main process of the container (PID 1) try:\n\n    ```\n\tdocker container exec redis ps -ef\n\tPID   USER     TIME   COMMAND\n    1 redis      0:00 redis-server\n   12 root       0:00 ps -ef\n\t```\n\n## Clean up\nRemove the compose demo stack\n   ```\n   docker-compose rm -fs\n   ```\n## <a name=\"Terminology\"></a>Recap\n\nWhat did we learn in this section?\n\n* Real-time CLI monitoring with `docker stats`\n* `docker system info`provides Docker Host information\n* Display free disk space using `docker system df`\n* `docker-compose top` displays processes running inside the containers.\n\n## Next Steps, Google cAdvisor (Container Advisor)\nFor the next step in the tutorial, head over to [Google cAdvisor](./cadvisor.md)"
  },
  {
    "path": "DockerCon/readme.md",
    "content": "## Logging & Monitoring Workshop\n\n<img src=\"https://raw.githubusercontent.com/56kcloud/Training/master/img/56k.jpg\" alt=\"56K.Cloud Logo\" width=\"150\" height=\"99\"> \n\nWelcome to the Logging & Monitoring Workshop presented by [Brian Christner](https://twitter.com/idomyowntricks) from [56K.Cloud](https://www.56k.cloud)\n\nThis Docker tutorial consists of the following sections:\n\n## Logging\n\n* [Setup Docker or Play-with-Docker](./logging/setup.md)\n* [Docker Getting Started with Logging](./logging/getting-started.md)\n* [Docker Swarm & Logging Drivers](./logging/log-drivers.md)\n\n## Monitoring\n\n* [Docker Getting Started with Monitoring](./monitoring/stats.md)\n* [Google Container Advisor (cAdvisor)](./monitoring/cadvisor.md)\n* [Monitoring Containers with Prometheus Stack](./monitoring/monitoring-stack.md)\n\n## Resources\n* [Links](./resources/links.md)\n"
  },
  {
    "path": "DockerCon/resources/links.md",
    "content": "## DockerCon Monitoring & Logging Workshop Links\nHere are some of the links mentioned during the workshop:\n\n* [56K.Cloud](https://56K.Cloud)\n* [Awesome Docker Resources](https://awesome-docker.netlify.com)\n* [Prometheus](https://github.com/vegasbrianc/prometheus)\n* [ELK](https://github.com/deviantony/docker-elk) \n* [Labs](www.github.com/56kcloud/Training/tree/master/DockerCon)\n* [GitLab Dashboards](https://monitor.gitlab.net)\n* [Grafana Dashboards](https://grafana.com/dashboards)\n* **Workshop Presentation** - [DockerCon Monitoring & Logging Workshop](https://s3.eu-central-1.amazonaws.com/56k-share/DCSF19_Logginig_Monitoring_Workshop.pdf)\n"
  },
  {
    "path": "Kubernetes/README.md",
    "content": "# Kubernetes\n\nThis repo contains [Kubernetes](https://kubernetes.io) labs and tutorials authored both by Docker, Kubernetes, and by members of the community. We welcome contributions and want to grow the repo.\n\n#### Kubernetes Tutorials:\n\n* [Minikube Setup & Prerquisites](https://kubernetes.io/docs/tasks/tools/install-minikube/)\n* [Install Kubernetes MiniKube](https://kubernetes.io/docs/getting-started-guides/minikube/)\n* [Introduction to Kubernetes](https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/)\n* [kubectl for Docker Users](https://kubernetes.io/docs/reference/kubectl/docker-cli-to-kubectl/)\n* [Install & Test Helm](helm/quickstart-helm.md)\n* [kops, kubectl CLI overview](https://kubernetes.io/docs/user-guide/walkthrough/)\n* [Application Deployment (Scaling, labeling, health checks)](https://kubernetes.io/docs/user-guide/walkthrough/k8s201/)\n* [Kubernetes logging, monitoring and securing containers](https://kubernetes.io/docs/tasks/debug-application-cluster/core-metrics-pipeline/)\n* [Third-Party Implementation of Sponsors Tools and Services (CoScale)](quickstart-coscale.md)\n\n#### Additional Kubernetes Ressources\n\nBe sure to check out the additional Kubernetes ressources section aimed at Developers.\n\n* [Kubernetes Additional Ressources](additional-ressources/)\n\n\n#### Contributing\n\nWe want to see this repo grow, so if you have a tutorial to submit, or contributions to existing tutorials, please see this guide:\n\n[Guide to submitting your own tutorial](contribute.md)\n"
  },
  {
    "path": "Kubernetes/additional-ressources/README.md",
    "content": "# Additional Kubernetes Ressources\n\nThis repo contains [Kubernetes](https://kubernetes) labs and tutorials, useful links, newsletters, and general ressources. We welcome contributions and want to grow the repo.\n\n#### Useful Links\n\n* [Awesome Kubernetes](https://github.com/ramitsurana/awesome-kubernetes)\n* [Kubernetes Documentation](http://docs.docker.com)\n* [Kubernetes Labs](https://github.com/docker/labs)\n* [Play-with-K8](https://labs.play-with-docker.com)\n* [Helm](https://helm.sh/)\n* [Kubernetes Examples](https://github.com/kubernetes/examples)\n* [Istio - Service Mesh](https://istio.io/)\n* [Certified Kubernetes Offerings](https://www.cncf.io/certification/software-conformance/#logos)\n* [Kubernetes Cloud Controller Manager](https://kubernetes.io/docs/tasks/administer-cluster/running-cloud-controller/)\n\n\n\n#### Newsletters\n\n* [Kubernetes Newsletter]()\n* [5 for Friday](http://brianchristner.us3.list-manage.com/track/click?u=fc0e7be4fb674995b89251efb&id=7205e15ac9&e=f62a500248)\n* [Kube Weekly](http://us10.forward-to-friend.com/forward?u=3885586f8f1175194017967d6&id=e3cbd3a3a0&e=fa2e44186e)\n* [The New Stack](https://thenewstack.io/)\n* [Sysdig](https://sysdig.com/blog/)\n\n#### Useful Projects\n\n* [Cloud Native Foundation](https://www.cncf.io)\n* [Jess Frazzle]()\n* [Prometheus](prometheus.io)\n* [Traefik Proxy](https://traefik.io)\n* \n\n\n#### Docker Tutorials:\n* [Configuring developer tools and programming languages](developer-tools/README.md)\n  * Java\n    * [Live Debugging Java with Docker](developer-tools/java-debugging)\n    * [Docker for Java Developers](developer-tools/java/)\n  * Node.js\n    * [Live Debugging a Node.js application in Docker](developer-tools/nodejs-debugging)\n    * [Dockerizing a Node.js application](developer-tools/nodejs/porting/)\n* [Docker for ASP.NET and Windows containers](windows/readme.md)\n* [Building a 12 Factor app with Docker](12factor/README.md)\n* [Hands-on Labs from DockerCon US 2017](dockercon-us-2017/)\n"
  },
  {
    "path": "Kubernetes/additional-ressources/kops-howto.md",
    "content": "\n# Installing Kubernetes on AWS with kops\n\n\n###Overview\nThis quickstart shows you how to easily install a Kubernetes cluster on AWS. It uses a tool called kops.\n\nkops is an opinionated provisioning system:\n\nFully automated installation\nUses DNS to identify clusters\nSelf-healing: everything runs in Auto-Scaling Groups\nLimited OS support (Debian preferred, Ubuntu 16.04 supported, early support for CentOS & RHEL)\nHigh-Availability support\nCan directly provision, or generate terraform manifests\nIf your opinions differ from these you may prefer to build your own cluster using kubeadm as a building block. kops builds on the kubeadm work.\n\n###Creating a cluster\n(1/5) Install kops\nRequirements\nYou must have kubectl installed in order for kops to work.\n\n###Installation\nDownload kops from the releases page (it is also easy to build from source):\n\n#### On MacOS:\n\n\twget https://github.com/kubernetes/kops/releases/download/1.8.0/kops-darwin-amd64\n\tchmod +x kops-darwin-amd64\n\tmv kops-darwin-amd64 /usr/local/bin/kops\n\n\t#you can also install using Homebrew`\n\tbrew update && brew install kops\n\n#### On Linux:\n\n    wget https://github.com/kubernetes/kops/releases/download/1.8.0/kops-linux-amd64\n    chmod +x kops-linux-amd64\n    mv kops-linux-amd64 /usr/local/bin/kops\n    (2/5) Create a route53 domain for your cluster\n    kops uses DNS for discovery, both inside the cluster and so that you can reach the kubernetes API server from clients.\n\nkops has a strong opinion on the cluster name: it should be a valid DNS name. By doing so you will no longer get your clusters confused, you can share clusters with your colleagues unambiguously, and you can reach them without relying on remembering an IP address.\n\nYou can, and probably should, use subdomains to divide your clusters. As our example we will use useast1.dev.example.com. The API server endpoint will then be api.useast1.dev.example.com.\n\nA Route53 hosted zone can serve subdomains. Your hosted zone could be useast1.dev.example.com, but also dev.example.com or even example.com. kops works with any of these, so typically you choose for organization reasons (e.g. you are allowed to create records under dev.example.com, but not under example.com).\n\nLet’s assume you’re using dev.example.com as your hosted zone. You create that hosted zone using the normal process, or with a command such as aws route53 create-hosted-zone --name dev.example.com --caller-reference 1.\n\nYou must then set up your NS records in the parent domain, so that records in the domain will resolve. Here, you would create NS records in example.com for dev. If it is a root domain name you would configure the NS records at your domain registrar (e.g. example.com would need to be configured where you bought example.com).\n\nThis step is easy to mess up (it is the #1 cause of problems!) You can double-check that your cluster is configured correctly if you have the dig tool by running:\n\ndig NS dev.example.com\n\nYou should see the 4 NS records that Route53 assigned your hosted zone.\n\n(3/5) Create an S3 bucket to store your clusters state\nkops lets you manage your clusters even after installation. To do this, it must keep track of the clusters that you have created, along with their configuration, the keys they are using etc. This information is stored in an S3 bucket. S3 permissions are used to control access to the bucket.\n\nMultiple clusters can use the same S3 bucket, and you can share an S3 bucket between your colleagues that administer the same clusters - this is much easier than passing around kubecfg files. But anyone with access to the S3 bucket will have administrative access to all your clusters, so you don’t want to share it beyond the operations team.\n\nSo typically you have one S3 bucket for each ops team (and often the name will correspond to the name of the hosted zone above!)\n\nIn our example, we chose dev.example.com as our hosted zone, so let’s pick clusters.dev.example.com as the S3 bucket name.\n\nExport AWS_PROFILE (if you need to select a profile for the AWS CLI to work)\n\nCreate the S3 bucket using aws s3 mb s3://clusters.dev.example.com\n\nYou can export KOPS_STATE_STORE=s3://clusters.dev.example.com and then kops will use this location by default. We suggest putting this in your bash profile or similar.\n\n(4/5) Build your cluster configuration\nRun “kops create cluster” to create your cluster configuration:\n\nkops create cluster --zones=us-east-1c useast1.dev.example.com\n\nkops will create the configuration for your cluster. Note that it only creates the configuration, it does not actually create the cloud resources - you’ll do that in the next step with a kops update cluster. This give you an opportunity to review the configuration or change it.\n\nIt prints commands you can use to explore further:\n\nList your clusters with: kops get cluster\nEdit this cluster with: kops edit cluster useast1.dev.example.com\nEdit your node instance group: kops edit ig --name=useast1.dev.example.com nodes\nEdit your master instance group: kops edit ig --name=useast1.dev.example.com master-us-east-1c\nIf this is your first time using kops, do spend a few minutes to try those out! An instance group is a set of instances, which will be registered as kubernetes nodes. On AWS this is implemented via auto-scaling-groups. You can have several instance groups, for example if you wanted nodes that are a mix of spot and on-demand instances, or GPU and non-GPU instances.\n\n(5/5) Create the cluster in AWS\nRun “kops update cluster” to create your cluster in AWS:\n\nkops update cluster useast1.dev.example.com --yes\n\nThat takes a few seconds to run, but then your cluster will likely take a few minutes to actually be ready. kops update cluster will be the tool you’ll use whenever you change the configuration of your cluster; it applies the changes you have made to the configuration to your cluster - reconfiguring AWS or kubernetes as needed.\n\nFor example, after you kops edit ig nodes, then kops update cluster --yes to apply your configuration, and sometimes you will also have to kops rolling-update cluster to roll out the configuration immediately.\n\nWithout --yes, kops update cluster will show you a preview of what it is going to do. This is handy for production clusters!\n\n"
  },
  {
    "path": "Kubernetes/helm/quickstart-helm.md",
    "content": "# Helm Installation\n\nHelm is the Kubernetes Package manager. Helm allows users to search and share Helm `Charts`. Helm Charts is a collection of files that describe a related set of Kubernetes resources. A single chart might be used to deploy something simple, like a memcached pod, or something complex, like a full web app stack with HTTP servers, databases, caches, and so on. More info on [Charts](https://docs.helm.sh/developing_charts/#charts)\n\n## Install Helm\n\n1. [Install Helm for your OS](https://github.com/kubernetes/helm#install)\n\n## Test Helm and MiniKube\n\nNow that we have Minikube and Helm installed lets deploy the WordPress Helm Chart.\n\n1. Deploy [WordPress Helm Chart](https://github.com/kubernetes/charts/tree/master/stable/wordpress)\n\n"
  },
  {
    "path": "Kubernetes/jumpstart-downloadtools.md",
    "content": "# JumpStart Guide\nThis quick HOWTO is to support downloading the starting the K8s LAB and tools quickly while readly avaliable internet is possilbe\n\nExplaintions are not givien as this information is NOT to support How but to allos a user to Copy/Past the contnet this neeed to quickly get there enviroment setup effectivitly while access to a fest internet is possible\n\n## Tools\n - minikube\n - kubectl\n - kops\n - helm\n - Hypervisor (Virtualbox, KVM, ..)\n - nice to have:\n    - jq, zsh, zsh completion for kubectl\n\n## Requirements\nDepending on your local OS, this will vary and will require some searching for software packages that are required for your platform. We try to address the common three, but problems with this will forsure persue\n\nAt least 4GB of RAM avalaible, 2-Core Hyperthread, and 100GB of data\nLocal Administrator Rights, and/or Sudo\nFast internet, 50Mbits+ possible over WLAN, 500MB~1.GB of data to download. (takes 10mins)\n\n - A Hypervisor\n\n## Download and Install\n\n#### Requirements: \nWorking Hypervisor: virtualbox, KVM, Hyper-V\nLinux-Ubuntu: socat \"apt-get install socat\"\n\n### Links to Binaries\n\nLinux:\n\n\tcurl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/\n \n\tbrew update && brew install kops\n\nOSX:\n\n    brew cask install minikube\n    brew install kubernetes-cli\n\nWindows: https://storage.googleapis.com/minikube/releases/latest/minikube-windows-amd64.exe\n\nKops is not supported on Windows :(\n\n### Starting minikube\n\n\tcd/ into the DIR where minikube is (best in a new directory)\n    minikube start                                                   \n    Starting local Kubernetes v1.9.0 cluster...           \n    Starting VM...                                          \n    Downloading Minikube ISO                                                         \n     142.22 MB / 142.22 MB [============================================] 100.00% 0s\n    Getting VM IP address...                              \n    Moving files into cluster...                                                                    \n    Downloading localkube binary                                                              \n     162.41 MB / 162.41 MB [============================================] 100.00% 0s      \n     65 B / 65 B [======================================================] 100.00% 0s                         \n    Setting up certs...                                         \n    Connecting to cluster...                                        \n    Setting up kubeconfig...                                                    \n    Starting cluster components...                                                                           \n    Kubectl is now configured to use the cluster.                                      \n    Loading cached images from config file.        \n    >minikube start\n    >minikube status\n    minikube: Running\n    cluster: Running\n    kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100\n\n### Testing Minikube\nWe can quickly test minikube by running an image, \n\n\t>kubectl create namespace devclub\n\t># now we use that namespace\n\t>kubectl run nginx --image nginx --namespace devclub\n\t>kubectl get pod -n devclub \n\t# we should see the nginix pod\n\n## Execute tools\n\nIt's important to start the tools at lesat once so further packages and docker images can be downloaded, 'minikube start' will begin download an ISO and create a VM to host the docker machine\n\n\nkukubectl cluster-info\nKubernetes master is running at https://192.168.99.100:8443\n\nTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.\n\n"
  },
  {
    "path": "Kubernetes/kickstart/README.md",
    "content": "## Kubernetes Kickstarter\n\nThis tutorial consists of the following sections:\n\n* [Setup & Prerquisites](https://kubernetes.io/docs/tasks/tools/install-minikube/)\n* [Install Kubernetes MiniKube](https://kubernetes.io/docs/getting-started-guides/minikube/)\n* [Introduction to MiniKube](https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/)\n* [Kubectl CLI & Pods overview](https://kubernetes.io/docs/user-guide/walkthrough/)\n* [Deployment (Scaling, labeling, health checks)](https://kubernetes.io/docs/user-guide/walkthrough/k8s201/)\n* [Kubernetes logging, monitoring and securing containers](https://kubernetes.io/docs/tasks/debug-application-cluster/core-metrics-pipeline/)\n* [Implementation examples using Sponsors Services/tools]()\n"
  },
  {
    "path": "Kubernetes/minikube/minikube-quickstart.md",
    "content": "# Minikube Quickstart\n\nminikube is a local k8s enviroemnt for running and testing deployments, there are limitations, but not all k8s feactures are avalaibke. We will obtain a minikube binary for our OS and install the dependencies required to lanch K8s locally\n\n## What is minikube\n\nMinikube is great for having a local deployment of k8s to support testing and building the deployment of your application locally. It not 100% offline but allows for most K8s features to be tested locally\n\n\n# Download and Install minikube\nhttps://github.com/kubernetes/minikube#installation\n\n#### Requirements: \nWorking Hypervisor: virtualbox, KVM, Hyper-V\nLinux-Ubuntu: socat \"apt-get install socat\"\n\n### Links to Binaries\n\nLinux:\nOSX:\nWindows:\n\n### Starting minikube\n\n\tcd/ into the DIR where minikube is (best in a new directory)\n    minikube start                                                   \n    Starting local Kubernetes v1.9.0 cluster...           \n    Starting VM...                                          \n    Downloading Minikube ISO                                                         \n     142.22 MB / 142.22 MB [============================================] 100.00% 0s\n    Getting VM IP address...                              \n    Moving files into cluster...                                                                    \n    Downloading localkube binary                                                              \n     162.41 MB / 162.41 MB [============================================] 100.00% 0s      \n     65 B / 65 B [======================================================] 100.00% 0s                         \n    Setting up certs...                                         \n    Connecting to cluster...                                        \n    Setting up kubeconfig...                                                    \n    Starting cluster components...                                                                           \n    Kubectl is now configured to use the cluster.                                      \n    Loading cached images from config file.        \n    >minikube start\n    >minikube status\n    minikube: Running\n    cluster: Running\n    kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100\n\n### Testing Minikube\nWe can quickly test minikube by running an image, \n\n\t>kubectl create namespace devclube\n\t># now we use that namespace\n\t>kubectl run nginx --image nginx --namespace devclub\n\t>kubectl get pod -n devclub \n\t# we should see the nginix pod\n    \n### Connect to the Dashboard\n\n    # We can have minikube lanch a browerse connected to the kubernetest API\n    >minikube dashboard\n    ># Browser page should lanche\n    ># In the case you are using minikube on a remote systme, it is still possible to access the Dashboard using the kubectl proxy command\n    >kubectl proxy & should lanch in background a revser tunnel on ort 8001"
  },
  {
    "path": "Kubernetes/third-party-coscale/quickstart-coscale.md",
    "content": "# Getting Started with CoScale\n\n1. Register an account in CoScale: Link: [https://app.coscale.com/app/register/](https://app.coscale.com/app/register/)\n\n2. App name: “funnyname-devclub”\n\n3. Email: yourname+devclub@yourdomain.com\nExample: “darragh+devclub@56k.cloud”\n\n4. Once logged in, go to “Data Sources => Agents” on the left\n\n"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\n                       Version 2.0, January 2004\n                    http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n  \"License\" shall mean the terms and conditions for use, reproduction,\n  and distribution as defined by Sections 1 through 9 of this document.\n\n  \"Licensor\" shall mean the copyright owner or entity authorized by\n  the copyright owner that is granting the License.\n\n  \"Legal Entity\" shall mean the union of the acting entity and all\n  other entities that control, are controlled by, or are under common\n  control with that entity. For the purposes of this definition,\n  \"control\" means (i) the power, direct or indirect, to cause the\n  direction or management of such entity, whether by contract or\n  otherwise, or (ii) ownership of fifty percent (50%) or more of the\n  outstanding shares, or (iii) beneficial ownership of such entity.\n\n  \"You\" (or \"Your\") shall mean an individual or Legal Entity\n  exercising permissions granted by this License.\n\n  \"Source\" form shall mean the preferred form for making modifications,\n  including but not limited to software source code, documentation\n  source, and configuration files.\n\n  \"Object\" form shall mean any form resulting from mechanical\n  transformation or translation of a Source form, including but\n  not limited to compiled object code, generated documentation,\n  and conversions to other media types.\n\n  \"Work\" shall mean the work of authorship, whether in Source or\n  Object form, made available under the License, as indicated by a\n  copyright notice that is included in or attached to the work\n  (an example is provided in the Appendix below).\n\n  \"Derivative Works\" shall mean any work, whether in Source or Object\n  form, that is based on (or derived from) the Work and for which the\n  editorial revisions, annotations, elaborations, or other modifications\n  represent, as a whole, an original work of authorship. For the purposes\n  of this License, Derivative Works shall not include works that remain\n  separable from, or merely link (or bind by name) to the interfaces of,\n  the Work and Derivative Works thereof.\n\n  \"Contribution\" shall mean any work of authorship, including\n  the original version of the Work and any modifications or additions\n  to that Work or Derivative Works thereof, that is intentionally\n  submitted to Licensor for inclusion in the Work by the copyright owner\n  or by an individual or Legal Entity authorized to submit on behalf of\n  the copyright owner. For the purposes of this definition, \"submitted\"\n  means any form of electronic, verbal, or written communication sent\n  to the Licensor or its representatives, including but not limited to\n  communication on electronic mailing lists, source code control systems,\n  and issue tracking systems that are managed by, or on behalf of, the\n  Licensor for the purpose of discussing and improving the Work, but\n  excluding communication that is conspicuously marked or otherwise\n  designated in writing by the copyright owner as \"Not a Contribution.\"\n\n  \"Contributor\" shall mean Licensor and any individual or Legal Entity\n  on behalf of whom a Contribution has been received by Licensor and\n  subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n  this License, each Contributor hereby grants to You a perpetual,\n  worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n  copyright license to reproduce, prepare Derivative Works of,\n  publicly display, publicly perform, sublicense, and distribute the\n  Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n  this License, each Contributor hereby grants to You a perpetual,\n  worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n  (except as stated in this section) patent license to make, have made,\n  use, offer to sell, sell, import, and otherwise transfer the Work,\n  where such license applies only to those patent claims licensable\n  by such Contributor that are necessarily infringed by their\n  Contribution(s) alone or by combination of their Contribution(s)\n  with the Work to which such Contribution(s) was submitted. If You\n  institute patent litigation against any entity (including a\n  cross-claim or counterclaim in a lawsuit) alleging that the Work\n  or a Contribution incorporated within the Work constitutes direct\n  or contributory patent infringement, then any patent licenses\n  granted to You under this License for that Work shall terminate\n  as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n  Work or Derivative Works thereof in any medium, with or without\n  modifications, and in Source or Object form, provided that You\n  meet the following conditions:\n\n  (a) You must give any other recipients of the Work or\n      Derivative Works a copy of this License; and\n\n  (b) You must cause any modified files to carry prominent notices\n      stating that You changed the files; and\n\n  (c) You must retain, in the Source form of any Derivative Works\n      that You distribute, all copyright, patent, trademark, and\n      attribution notices from the Source form of the Work,\n      excluding those notices that do not pertain to any part of\n      the Derivative Works; and\n\n  (d) If the Work includes a \"NOTICE\" text file as part of its\n      distribution, then any Derivative Works that You distribute must\n      include a readable copy of the attribution notices contained\n      within such NOTICE file, excluding those notices that do not\n      pertain to any part of the Derivative Works, in at least one\n      of the following places: within a NOTICE text file distributed\n      as part of the Derivative Works; within the Source form or\n      documentation, if provided along with the Derivative Works; or,\n      within a display generated by the Derivative Works, if and\n      wherever such third-party notices normally appear. The contents\n      of the NOTICE file are for informational purposes only and\n      do not modify the License. You may add Your own attribution\n      notices within Derivative Works that You distribute, alongside\n      or as an addendum to the NOTICE text from the Work, provided\n      that such additional attribution notices cannot be construed\n      as modifying the License.\n\n  You may add Your own copyright statement to Your modifications and\n  may provide additional or different license terms and conditions\n  for use, reproduction, or distribution of Your modifications, or\n  for any such Derivative Works as a whole, provided Your use,\n  reproduction, and distribution of the Work otherwise complies with\n  the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n  any Contribution intentionally submitted for inclusion in the Work\n  by You to the Licensor shall be under the terms and conditions of\n  this License, without any additional terms or conditions.\n  Notwithstanding the above, nothing herein shall supersede or modify\n  the terms of any separate license agreement you may have executed\n  with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n  names, trademarks, service marks, or product names of the Licensor,\n  except as required for reasonable and customary use in describing the\n  origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n  agreed to in writing, Licensor provides the Work (and each\n  Contributor provides its Contributions) on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n  implied, including, without limitation, any warranties or conditions\n  of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n  PARTICULAR PURPOSE. You are solely responsible for determining the\n  appropriateness of using or redistributing the Work and assume any\n  risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n  whether in tort (including negligence), contract, or otherwise,\n  unless required by applicable law (such as deliberate and grossly\n  negligent acts) or agreed to in writing, shall any Contributor be\n  liable to You for damages, including any direct, indirect, special,\n  incidental, or consequential damages of any character arising as a\n  result of this License or out of the use or inability to use the\n  Work (including but not limited to damages for loss of goodwill,\n  work stoppage, computer failure or malfunction, or any and all\n  other commercial damages or losses), even if such Contributor\n  has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n  the Work or Derivative Works thereof, You may choose to offer,\n  and charge a fee for, acceptance of support, warranty, indemnity,\n  or other liability obligations and/or rights consistent with this\n  License. However, in accepting such obligations, You may act only\n  on Your own behalf and on Your sole responsibility, not on behalf\n  of any other Contributor, and only if You agree to indemnify,\n  defend, and hold each Contributor harmless for any liability\n  incurred by, or claims asserted against, such Contributor by reason\n  of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nCopyright 2016 Docker, Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# 56K.Cloud Container, Cloud & DevOps Tutorials and Labs\n\n<img src=\"./img/56k.jpg\" alt=\"56K.Cloud Logo\" width=\"150\" height=\"99\">\n\nWelcome to [56K.Cloud](https://www.56k.cloud) Training & Labs. This repo contains Docker, Kubernetes, Cloud, and DevOps Labs authored both by the respective companies or organizations, and by members of the community. We welcome contributions and want to grow the repo.\n\n#### Tutorials:\n* [Docker](Docker/README.md)\n* [Monitoring & Logging](DockerCon/readme.md)\n* [Kubernetes](Kubernetes/README.md)\n* [DevOps](DevOps/README.md)\n\n\n#### Contributing\n\nWe want to see this repo grow, so if you have a tutorial to submit, or contributions to existing tutorials, please see this guide:\n\n[Guide to submitting your own tutorial](contribute.md)\n"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-cayman\nexclude: [\n  'Kubernetes/website/',\n  'istio-workshop/'\n]\n"
  },
  {
    "path": "contribute.md",
    "content": "## Contributing to Tutorials ##\n\nThank you so much for your interest in contributing to [56K.Cloud Training](https://www.56k.cloud) tutorials. We want to give back to the Open Source community what we have learned and taught over the years. We offer training to companies, organizations, and individuals. 56K believes that everything should be Open Source and it is an integral part of our company including the training we offer.\n\nJust a few quick things to be aware of before you get started.\n\nWe welcome issues and pull requests for either adding a new tutorial, or fixing a problem with an existing tutorial. This is a repository for tutorials that uses the native componentes of Docker & Kubernetes based projects as much as possible. So if there’s a Docker or Kubernetes tool for what you’re describing, please use that.\n\nAnything you contribute will be under an Apache license. Anything posted here may be forked by anyone on GitHub.\n\nWe will be following the lightweight version of the Docker contribution policies and procedures as explained in\n\n"
  },
  {
    "path": "istio-workshop/.gitignore",
    "content": "*/**/install_istio.yaml\n*/**/target\n*/0_cluster/*.sh"
  },
  {
    "path": "istio-workshop/1_envoy/1_run_httpbin.sh",
    "content": "#!/bin/bash\n\necho\necho \"docker run -it --rm \\\\ \"\necho \"  --name httpbin \\\\ \"\necho \"  -p 8000:8000 \\\\ \"\necho \"  httpbin:latest \"\necho\necho\necho \"open http://localhost:8000\"\necho\n\ndocker run -it --rm \\\n  --name httpbin \\\n  -p 8000:8000 \\\n  httpbin:latest\n\n"
  },
  {
    "path": "istio-workshop/1_envoy/2_curl_httpbin.sh",
    "content": "#!/bin/bash\n\necho\necho \"docker run -it --rm \\\\ \"\necho \"  --link httpbin \\\\ \"\necho \"  tutum/curl \\\\ \"\necho \"  curl -X GET http://httpbin:8000/headers \"\necho\n\ndocker run -it --rm \\\n  --link httpbin \\\n  tutum/curl \\\n  curl -X GET http://httpbin:8000/headers\n"
  },
  {
    "path": "istio-workshop/1_envoy/3_envoyconfig.yaml",
    "content": "admin:\n  access_log_path: /tmp/admin_access.log\n  address:\n    socket_address: { address: 0.0.0.0, port_value: 15000 }\n\nstatic_resources:\n  listeners:\n  - name: httpbin-demo\n    address:\n      socket_address: { address: 0.0.0.0, port_value: 15001 }\n    filter_chains:\n    - filters:\n      - name: envoy.http_connection_manager\n        config:\n          stat_prefix: egress_http\n          route_config:\n            name: httpbin_local_route\n            virtual_hosts:\n            - name: httpbin_local_service\n              domains: [\"*\"]\n              routes:\n              - match: { prefix: \"/\" }\n                route:\n                  auto_host_rewrite: true\n                  cluster: httpbin_service\n                  retry_policy:\n                    retry_on: 5xx\n                    num_retries: 3\n          http_filters:\n          - name: envoy.router\n  clusters:\n    - name: httpbin_service\n      connect_timeout: 5s\n      type: LOGICAL_DNS\n      dns_lookup_family: V4_ONLY\n      lb_policy: ROUND_ROBIN\n      hosts: [{ socket_address: { address: httpbin, port_value: 8000 }}]"
  },
  {
    "path": "istio-workshop/1_envoy/3_run_envoy.sh",
    "content": "#!/bin/bash\n\necho\necho \"docker run -it --rm \\\\ \"\necho \"    --name sidecar_proxy \\\\ \"\necho \"    --link httpbin \\\\ \"\necho \"    envoyproxy/envoy:v1.8.0 envoy \"\necho\n\ndocker run -it --rm \\\n    --name sidecar_proxy \\\n    --link httpbin \\\n    envoyproxy/envoy:v1.8.0 envoy\n"
  },
  {
    "path": "istio-workshop/1_envoy/4_run_envoy_retries.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\nconfig_file=\"$script_dir\"/4_run_envoy_retries.yaml\n\ncat \"$config_file\"\n\necho\necho\nread -rp \"Press enter to run envoy\" continue\necho\necho\necho\necho \"docker run -it --rm \\\\ \"\necho \"  --name sidecar_proxy \\\\ \"\necho \"  --link httpbin \\\\ \"\necho \"  -v $config_file:/etc/envoyconfig.yaml \\\\ \"\necho \"  -p 15001:15001 \\\\ \"\necho \"  envoyproxy/envoy:v1.8.0 \\\\ \"\necho \"  envoy -c /etc/envoyconfig.yaml \"\necho\necho\necho\n\ndocker run -it --rm \\\n  --name sidecar_proxy \\\n  --link httpbin \\\n  -v \"$config_file\":/etc/envoyconfig.yaml \\\n  -p 15001:15001 \\\n  -p 15000:15000 \\\n  envoyproxy/envoy:v1.8.0 \\\n  envoy -c /etc/envoyconfig.yaml\n"
  },
  {
    "path": "istio-workshop/1_envoy/4_run_envoy_retries.yaml",
    "content": "admin:\n  access_log_path: /tmp/admin_access.log\n  address:\n    socket_address: { address: 0.0.0.0, port_value: 15000 }\n\nstatic_resources:\n  listeners:\n  - name: httpbin-demo\n    address:\n      socket_address: { address: 0.0.0.0, port_value: 15001 }\n    filter_chains:\n    - filters:\n      - name: envoy.http_connection_manager\n        config:\n          stat_prefix: egress_http\n          route_config:\n            name: httpbin_local_route\n            virtual_hosts:\n            - name: httpbin_local_service\n              domains: [\"*\"]\n              routes:\n              - match: { prefix: \"/\" }\n                route:\n                  auto_host_rewrite: true\n                  cluster: httpbin_service\n                  retry_policy:\n                    retry_on: 5xx\n                    num_retries: 3\n          http_filters:\n          - name: envoy.router\n  clusters:\n    - name: httpbin_service\n      connect_timeout: 5s\n      type: LOGICAL_DNS\n      # Comment out the following line to test on v6 networks\n      dns_lookup_family: V4_ONLY\n      lb_policy: ROUND_ROBIN\n      hosts: [{ socket_address: { address: httpbin, port_value: 8000 }}]"
  },
  {
    "path": "istio-workshop/1_envoy/5_query_thru_envoy.sh",
    "content": "#!/bin/bash\n\necho\necho \"docker run -it --rm \\\\ \"\necho \"  --link sidecar_proxy \\\\ \"\necho \"  tutum/curl \\\\ \"\necho \"  curl -X GET http://sidecar_proxy:15001/headers \"\necho\n\n# query the proxy\ndocker run -it --rm \\\n  --link sidecar_proxy \\\n  tutum/curl \\\n  curl -X GET http://sidecar_proxy:15001/headers\n"
  },
  {
    "path": "istio-workshop/1_envoy/6_fault_injection.sh",
    "content": "#!/bin/bash\n\n\necho\necho \"docker run -it --rm \\\\ \"\necho \"  --link sidecar_proxy \\\\ \"\necho \"  tutum/curl \\\\ \"\necho \"  curl -X GET -w \\\"%{http_code}\\\\n\\\" http://sidecar_proxy:15001/status/500 \"\necho\necho \">> endpoint will return 500\"\necho\n\n# create error\ndocker run -it --rm \\\n  --link sidecar_proxy \\\n  tutum/curl \\\n  curl -X GET -w \"%{http_code}\\\\n\" http://sidecar_proxy:15001/status/500\n"
  },
  {
    "path": "istio-workshop/1_envoy/7_metrics.sh",
    "content": "#!/bin/bash\n\necho\necho \"docker run -it --rm \\\\ \"\necho \"  --link sidecar_proxy \\\\ \"\necho \"  tutum/curl \\\\ \"\necho \"  curl -X GET http://sidecar_proxy:15000/stats | grep retry \"\necho\n\ndocker run -it --rm \\\n  --link sidecar_proxy \\\n  tutum/curl \\\n  curl -X GET http://sidecar_proxy:15000/stats | grep retry\n"
  },
  {
    "path": "istio-workshop/2_istio/1_crds.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\nkubectl apply -f \"$script_dir\"/1_crds.yaml\n"
  },
  {
    "path": "istio-workshop/2_istio/1_crds.yaml",
    "content": "# {{ if or .Values.global.crds (semverCompare \">=2.10.0-0\" .Capabilities.TillerVersion.SemVer) }}\n# these CRDs only make sense when pilot is enabled\n# {{- if .Values.pilot.enabled }}\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: virtualservices.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: VirtualService\n    listKind: VirtualServiceList\n    plural: virtualservices\n    singular: virtualservice\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: destinationrules.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: DestinationRule\n    listKind: DestinationRuleList\n    plural: destinationrules\n    singular: destinationrule\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: serviceentries.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: ServiceEntry\n    listKind: ServiceEntryList\n    plural: serviceentries\n    singular: serviceentry\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: gateways.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n    \"helm.sh/hook-weight\": \"-5\"\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: Gateway\n    plural: gateways\n    singular: gateway\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: envoyfilters.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: EnvoyFilter\n    plural: envoyfilters\n    singular: envoyfilter\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\n# {{- end }}\n\n# these CRDs only make sense when security is enabled\n# {{- if .Values.security.enabled }}\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: policies.authentication.istio.io\nspec:\n  group: authentication.istio.io\n  names:\n    kind: Policy\n    plural: policies\n    singular: policy\n    categories:\n    - istio-io\n    - authentication-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: meshpolicies.authentication.istio.io\nspec:\n  group: authentication.istio.io\n  names:\n    kind: MeshPolicy\n    listKind: MeshPolicyList\n    plural: meshpolicies\n    singular: meshpolicy\n    categories:\n    - istio-io\n    - authentication-istio-io\n  scope: Cluster\n  version: v1alpha1\n---\n# {{- end }}\n\n# {{- if .Values.mixer.enabled }}\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: httpapispecbindings.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: HTTPAPISpecBinding\n    plural: httpapispecbindings\n    singular: httpapispecbinding\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: httpapispecs.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: HTTPAPISpec\n    plural: httpapispecs\n    singular: httpapispec\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: quotaspecbindings.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: QuotaSpecBinding\n    plural: quotaspecbindings\n    singular: quotaspecbinding\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: quotaspecs.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: QuotaSpec\n    plural: quotaspecs\n    singular: quotaspec\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\n# Mixer CRDs\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rules.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: core\nspec:\n  group: config.istio.io\n  names:\n    kind: rule\n    plural: rules\n    singular: rule\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: attributemanifests.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: core\nspec:\n  group: config.istio.io\n  names:\n    kind: attributemanifest\n    plural: attributemanifests\n    singular: attributemanifest\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: bypasses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: bypass\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: bypass\n    plural: bypasses\n    singular: bypass\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: circonuses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: circonus\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: circonus\n    plural: circonuses\n    singular: circonus\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: deniers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: denier\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: denier\n    plural: deniers\n    singular: denier\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: fluentds.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: fluentd\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: fluentd\n    plural: fluentds\n    singular: fluentd\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: kubernetesenvs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: kubernetesenv\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: kubernetesenv\n    plural: kubernetesenvs\n    singular: kubernetesenv\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: listcheckers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: listchecker\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: listchecker\n    plural: listcheckers\n    singular: listchecker\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: memquotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: memquota\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: memquota\n    plural: memquotas\n    singular: memquota\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: noops.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: noop\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: noop\n    plural: noops\n    singular: noop\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: opas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: opa\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: opa\n    plural: opas\n    singular: opa\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: prometheuses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: prometheus\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: prometheus\n    plural: prometheuses\n    singular: prometheus\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rbacs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: rbac\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: rbac\n    plural: rbacs\n    singular: rbac\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: redisquotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    package: redisquota\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: redisquota\n    plural: redisquotas\n    singular: redisquota\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicecontrols.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: servicecontrol\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: servicecontrol\n    plural: servicecontrols\n    singular: servicecontrol\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: signalfxs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: signalfx\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: signalfx\n    plural: signalfxs\n    singular: signalfx\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: solarwindses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: solarwinds\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: solarwinds\n    plural: solarwindses\n    singular: solarwinds\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: stackdrivers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: stackdriver\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: stackdriver\n    plural: stackdrivers\n    singular: stackdriver\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: statsds.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: statsd\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: statsd\n    plural: statsds\n    singular: statsd\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: stdios.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: stdio\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: stdio\n    plural: stdios\n    singular: stdio\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: apikeys.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: apikey\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: apikey\n    plural: apikeys\n    singular: apikey\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: authorizations.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: authorization\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: authorization\n    plural: authorizations\n    singular: authorization\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: checknothings.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: checknothing\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: checknothing\n    plural: checknothings\n    singular: checknothing\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: kuberneteses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: adapter.template.kubernetes\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: kubernetes\n    plural: kuberneteses\n    singular: kubernetes\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: listentries.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: listentry\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: listentry\n    plural: listentries\n    singular: listentry\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: logentries.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: logentry\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: logentry\n    plural: logentries\n    singular: logentry\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: edges.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: edge\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: edge\n    plural: edges\n    singular: edge\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: metrics.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: metric\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: metric\n    plural: metrics\n    singular: metric\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: quotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: quota\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: quota\n    plural: quotas\n    singular: quota\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: reportnothings.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: reportnothing\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: reportnothing\n    plural: reportnothings\n    singular: reportnothing\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicecontrolreports.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: servicecontrolreport\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: servicecontrolreport\n    plural: servicecontrolreports\n    singular: servicecontrolreport\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: tracespans.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: tracespan\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: tracespan\n    plural: tracespans\n    singular: tracespan\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rbacconfigs.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: RbacConfig\n    plural: rbacconfigs\n    singular: rbacconfig\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: serviceroles.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: ServiceRole\n    plural: serviceroles\n    singular: servicerole\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicerolebindings.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: ServiceRoleBinding\n    plural: servicerolebindings\n    singular: servicerolebinding\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: adapters.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: adapter\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: adapter\n    plural: adapters\n    singular: adapter\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: instances.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: instance\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: instance\n    plural: instances\n    singular: instance\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: templates.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: template\n    istio: mixer-template\nspec:\n  group: config.istio.io\n  names:\n    kind: template\n    plural: templates\n    singular: template\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: handlers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: handler\n    istio: mixer-handler\nspec:\n  group: config.istio.io\n  names:\n    kind: handler\n    plural: handlers\n    singular: handler\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n# {{- end }}\n# {{ end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/2_gen_install_yaml.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\nISTIO_VERSION=\"1.0.4\"\n\nhelm template \"$script_dir/charts_$ISTIO_VERSION\" \\\n  --name istio \\\n  --namespace istio-system \\\n  --set global.crds=false \\\n  --set sidecarInjectorWebhook.enabled=true \\\n  --set prometheus.enabled=true \\\n  --set grafana.enabled=true \\\n  --set servicegraph.enabled=true \\\n  --set tracing.enabled=true \\\n  --set kiali.enabled=true \\\n  --set kiali.tag=v0.10.1 \\\n  --set mtls.enabled=true \\\n  > \"$script_dir\"/install_istio.yaml\n"
  },
  {
    "path": "istio-workshop/2_istio/3_install_istio.sh",
    "content": "#!/bin/bash\n\nkubectl create namespace istio-system\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\nkubectl apply -f \"$script_dir\"/install_istio.yaml\n\n# allow side-car injection\nkubectl label namespace default istio-injection=enabled\n"
  },
  {
    "path": "istio-workshop/2_istio/4_open_addons.sh",
    "content": "#!/bin/bash\n\nfunction get_pod_name {\n  name=\"$1\"\n  kubectl get pod -n istio-system -l app=\"$name\" -o jsonpath='{.items[0].metadata.name}'\n}\n\nfunction get_app_ports {\n  name=${1:?\"need a name\"}\n  ns=${2:-\"istio-system\"}\n  kubectl get -n \"$ns\" pod -l app=\"$1\" -o json | jq -r '.items[] | .spec.containers[] | .ports[]? | .containerPort'\n}\n\nfunction activate_addon {\n  name=${1:?\"need a name\"}\n  port=${2:-$(get_app_port \"$name\")}\n  ns=${3:-\"istio-system\"}\n\n  echo\n  echo \"port forwarding $name on port $port\"\n  echo\n  kubectl port-forward -n \"$ns\" \"$(get_pod_name $name)\" \"$port\":\"$port\" &\n  sleep 3\n  open http://localhost:\"$port\"\n}\n\nactivate_addon jaeger 16686\nactivate_addon grafana 3000\nactivate_addon prometheus 9090\nactivate_addon kiali 20001\n\n# kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 # GRAFANA\n# open http://localhost:3000/dashboard/db/istio-dashboard  # browser to graphana\n\n# kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 9090:9090 # PROMETHEUS\n# open http://localhost:9090/graph\n\n# kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=servicegraph -o jsonpath='{.items[0].metadata.name}') 8088:8088 # service graph\n# open http://localhost:8088/force/forcegraph.html # browser to service graph\n\n# kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=kiali -o jsonpath='{.items[0].metadata.name}') 20001:20001 # KIALI\n# Open http://localhost:20001 # admin/admin\n"
  },
  {
    "path": "istio-workshop/2_istio/99_remove.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\n## kill all port-forward\npkill kubectl\n\nkubectl delete -f \"$script_dir\"/install_istio.yaml\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/Chart.yaml",
    "content": "apiVersion: v1\nname: istio\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2-0\"\ndescription: Helm chart for all istio components\nkeywords:\n  - istio\n  - security\n  - sidecarInjectorWebhook\n  - mixer\n  - pilot\n  - galley\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/README.md",
    "content": "# Istio\n\n[Istio](https://istio.io/) is an open platform for providing a uniform way to integrate microservices, manage traffic flow across microservices, enforce policies and aggregate telemetry data.\n\n## Introduction\n\nThis chart bootstraps all istio [components](https://istio.io/docs/concepts/what-is-istio/overview.html) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.\n\n## Chart Details\n\nThis chart can install multiple istio components as subcharts:\n- ingress\n- ingressgateway\n- egressgateway\n- sidecarInjectorWebhook\n- galley\n- mixer\n- pilot\n- security(citadel)\n- grafana\n- prometheus\n- servicegraph\n- tracing(jaeger)\n- kiali\n\nTo enable or disable each component, change the corresponding `enabled` flag.\n\n## Prerequisites\n\n- Kubernetes 1.9 or newer cluster with RBAC (Role-Based Access Control) enabled is required\n- Helm 2.7.2 or newer or alternately the ability to modify RBAC rules is also required\n- If you want to enable automatic sidecar injection, Kubernetes 1.9+ with `admissionregistration` API is required, and `kube-apiserver` process must have the `admission-control` flag set with the `MutatingAdmissionWebhook` and `ValidatingAdmissionWebhook` admission controllers added and listed in the correct order.\n\n## Resources Required\n\nThe chart deploys pods that consume minimum resources as specified in the resources configuration parameter.\n\n## Installing the Chart\n\n1. If a service account has not already been installed for Tiller, install one:\n```\n$ kubectl apply -f install/kubernetes/helm/helm-service-account.yaml\n```\n\n2. Install Tiller on your cluster with the service account:\n```\n$ helm init --service-account tiller\n```\n\n3. Install Istio’s [Custom Resource Definitions](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions) via `kubectl apply`, and wait a few seconds for the CRDs to be committed in the kube-apiserver:\n   ```\n   $ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml\n   ```\n   **Note**: If you are enabling `certmanager`, you also need to install its CRDs and wait a few seconds for the CRDs to be committed in the kube-apiserver:\n   ```\n   $ kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml\n   ```\n\n4. To install the chart with the release name `istio` in namespace `istio-system`:\n    - With [automatic sidecar injection](https://istio.io/docs/setup/kubernetes/sidecar-injection/#automatic-sidecar-injection) (requires Kubernetes >=1.9.0):\n    ```\n    $ helm install install/kubernetes/helm/istio --name istio --namespace istio-system\n    ```\n\n    - Without the sidecar injection webhook:\n    ```\n    $ helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set sidecarInjectorWebhook.enabled=false\n    ```\n\n## Configuration\n\nThe Helm chart ships with reasonable defaults.  There may be circumstances in which defaults require overrides.\nTo override Helm values, use `--set key=value` argument during the `helm install` command.  Multiple `--set` operations may be used in the same Helm operation.\n\nHelm charts expose configuration options which are currently in alpha.  The currently exposed options are explained in the following table:\n\n| Parameter | Description | Values | Default |\n| --- | --- | --- | --- |\n| `global.hub` | Specifies the HUB for most images used by Istio | registry/namespace | `docker.io/istio` |\n| `global.tag` | Specifies the TAG for most images used by Istio | valid image tag | `0.8.latest` |\n| `global.proxy.image` | Specifies the proxy image name | valid proxy name | `proxyv2` |\n| `global.proxy.concurrency` | Specifies the number of proxy worker threads | number, 0 = auto | `0` |\n| `global.imagePullPolicy` | Specifies the image pull policy | valid image pull policy | `IfNotPresent` |\n| `global.controlPlaneSecurityEnabled` | Specifies whether control plane mTLS is enabled | true/false | `false` |\n| `global.mtls.enabled` | Specifies whether mTLS is enabled by default between services | true/false | `false` |\n| `global.rbacEnabled` | Specifies whether to create Istio RBAC rules or not | true/false | `true` |\n| `global.refreshInterval` | Specifies the mesh discovery refresh interval | integer followed by s | `10s` |\n| `global.arch.amd64` | Specifies the scheduling policy for `amd64` architectures | 0 = never, 1 = least preferred, 2 = no preference, 3 = most preferred | `2` |\n| `global.arch.s390x` | Specifies the scheduling policy for `s390x` architectures | 0 = never, 1 = least preferred, 2 = no preference, 3 = most preferred | `2` |\n| `global.arch.ppc64le` | Specifies the scheduling policy for `ppc64le` architectures | 0 = never, 1 = least preferred, 2 = no preference, 3 = most preferred | `2` |\n| `ingress.enabled` | Specifies whether Ingress should be installed | true/false | `true` |\n| `gateways.istio-ingressgateway.enabled` | Specifies whether Ingress gateway should be installed | true/false | `true` |\n| `gateways.istio-egressgateway.enabled` | Specifies whether Egress gateway should be installed | true/false | `true` |\n| `sidecarInjectorWebhook.enabled` | Specifies whether automatic sidecar-injector should be installed | `true` |\n| `galley.enabled` | Specifies whether Galley should be installed for server-side config validation | true/false | `true` |\n| `mixer.enabled` | Specifies whether Mixer should be installed | true/false | `true` |\n| `pilot.enabled` | Specifies whether Pilot should be installed | true/false | `true` |\n| `grafana.enabled` | Specifies whether Grafana addon should be installed | true/false | `false` |\n| `grafana.persist` | Specifies whether Grafana addon should persist config data | true/false | `false` |\n| `grafana.storageClassName` | If `grafana.persist` is true, specifies the [`StorageClass`](https://kubernetes.io/docs/concepts/storage/storage-classes/) to use for the `PersistentVolumeClaim` | `StorageClass` | \"\" |\n| `prometheus.enabled` | Specifies whether Prometheus addon should be installed | true/false | `true` |\n| `servicegraph.enabled` | Specifies whether Servicegraph addon should be installed | true/false | `false` |\n| `tracing.enabled` | Specifies whether Tracing(jaeger) addon should be installed | true/false | `false` |\n| `kiali.enabled` | Specifies whether Kiali addon should be installed | true/false | `false` |\n\n## Uninstalling the Chart\n\nTo uninstall/delete the `istio` release:\n```\n$ helm delete istio\n```\nThe command removes all the Kubernetes components associated with the chart and deletes the release.\n\nTo uninstall/delete the `istio` release completely and make its name free for later use:\n```\n$ helm delete istio --purge\n```\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/certmanager/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: certmanager\nversion: 1.0.1\nappVersion: 0.3.1\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/certmanager/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"certmanager.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"certmanager.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- $fullname := printf \"%s-%s\" $name .Release.Name -}}\n{{- default $fullname .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"certmanager.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/certmanager/templates/crds.yaml",
    "content": "apiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: clusterissuers.certmanager.k8s.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: certmanager\nspec:\n  group: certmanager.k8s.io\n  version: v1alpha1\n  names:\n    kind: ClusterIssuer\n    plural: clusterissuers\n  scope: Cluster\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: issuers.certmanager.k8s.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: certmanager\nspec:\n  group: certmanager.k8s.io\n  version: v1alpha1\n  names:\n    kind: Issuer\n    plural: issuers\n  scope: Namespaced\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: certificates.certmanager.k8s.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: certmanager\nspec:\n  group: certmanager.k8s.io\n  version: v1alpha1\n  scope: Namespaced\n  names:\n    kind: Certificate\n    plural: certificates\n    shortNames:\n      - cert\n      - certs\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/certmanager/templates/deployment.yaml",
    "content": "apiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  name: certmanager\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"certmanager.name\" . }}\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: certmanager\n  template:\n    metadata:\n      labels:\n        app: certmanager\n{{- if .Values.podLabels }}\n{{ toYaml .Values.podLabels | indent 8 }}\n{{- end }}\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n      {{- if .Values.podAnnotations }}\n{{ toYaml .Values.podAnnotations | indent 8 }}\n      {{- end }}\n    spec:\n      serviceAccountName: certmanager\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: certmanager\n          image: \"{{ .Values.hub }}/cert-manager-controller:{{ .Values.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n          - --cluster-resource-namespace=$(POD_NAMESPACE)\n          - --leader-election-namespace=$(POD_NAMESPACE)\n        {{- if .Values.extraArgs }}\n{{ toYaml .Values.extraArgs | indent 10 }}\n        {{- end }}\n          env:\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                fieldPath: metadata.namespace\n          resources:\n{{ toYaml .Values.resources | indent 12 }}\n    {{- with .Values.nodeSelector }}\n      nodeSelector:\n{{ toYaml . | indent 8 }}\n    {{- end }}\n    {{- with .Values.affinity }}\n      affinity:\n{{ toYaml . | indent 8 }}\n    {{- end }}\n    {{- with .Values.tolerations }}\n      tolerations:\n{{ toYaml . | indent 8 }}\n    {{- end }}\n{{- if .Values.podDnsPolicy }}\n      dnsPolicy: {{ .Values.podDnsPolicy }}\n{{- end }}\n{{- if .Values.podDnsConfig }}\n      dnsConfig:\n{{ toYaml .Values.podDnsConfig | indent 8 }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/certmanager/templates/issuer.yaml",
    "content": "---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-staging\n  namespace: {{ .Release.Namespace }}\nspec:\n  acme:\n    server: https://acme-staging-v02.api.letsencrypt.org/directory\n    email: {{ .Values.email }}\n    # Name of a secret used to store the ACME account private key\n    privateKeySecretRef:\n      name: letsencrypt-staging\n    http01: {}\n---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt\n  namespace: {{ .Release.Namespace }}\nspec:\n  acme:\n    server: https://acme-v02.api.letsencrypt.org/directory\n    email: {{ .Values.email }}\n    privateKeySecretRef:\n      name: letsencrypt\n    http01: {}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/certmanager/templates/rbac.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: certmanager\n  labels:\n    app: certmanager\nrules:\n  - apiGroups: [\"certmanager.k8s.io\"]\n    resources: [\"certificates\", \"issuers\", \"clusterissuers\"]\n    verbs: [\"*\"]\n  - apiGroups: [\"\"]\n    # TODO: remove endpoints once 0.4 is released. We include it here in case\n    # users use the 'master' version of the Helm chart with a 0.2.x release of\n    # certManager that still performs leader election with Endpoint resources.\n    # We advise users don't do this, but some will anyway and this will reduce\n    # friction.\n    resources: [\"endpoints\", \"configmaps\", \"secrets\", \"events\", \"services\", \"pods\"]\n    verbs: [\"*\"]\n  - apiGroups: [\"extensions\"]\n    resources: [\"ingresses\"]\n    verbs: [\"*\"]\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: certmanager\n  labels:\n    app: certmanager\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: certmanager\nsubjects:\n  - name: certmanager\n    namespace: {{ .Release.Namespace }}\n    kind: ServiceAccount\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/certmanager/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: certmanager\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: certmanager\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/Chart.yaml",
    "content": "apiVersion: v1\nname: galley\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for galley deployment\nkeywords:\n  - istio\n  - galley\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"galley.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"galley.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-galley-{{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"admissionregistration.k8s.io\"]\n  resources: [\"validatingwebhookconfigurations\"]\n  verbs: [\"*\"]\n- apiGroups: [\"config.istio.io\"] # istio mixer CRD watcher\n  resources: [\"*\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"*\"]\n  resources: [\"deployments\"]\n  resourceNames: [\"istio-galley\"]\n  verbs: [\"get\"]\n- apiGroups: [\"*\"]\n  resources: [\"endpoints\"]\n  resourceNames: [\"istio-galley\"]\n  verbs: [\"get\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-galley-admin-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-galley-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-galley-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-galley-configuration\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: mixer\ndata:\n  validatingwebhookconfiguration.yaml: |-\n    {{- include \"validatingwebhookconfiguration.yaml.tpl\" . | indent 4}}\n\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-galley\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"galley.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: galley\nspec:\n  replicas: {{ .Values.replicaCount }}\n  strategy:\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  template:\n    metadata:\n      labels:\n        istio: galley\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-galley-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: validator\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n          - containerPort: 443\n          - containerPort: 9093\n          command:\n          - /usr/local/bin/galley\n          - validator\n          - --deployment-namespace={{ .Release.Namespace }}\n          - --caCertFile=/etc/istio/certs/root-cert.pem\n          - --tlsCertFile=/etc/istio/certs/cert-chain.pem\n          - --tlsKeyFile=/etc/istio/certs/key.pem\n          - --healthCheckInterval=1s\n          - --healthCheckFile=/health\n          - --webhook-config-file\n          - /etc/istio/config/validatingwebhookconfiguration.yaml\n          volumeMounts:\n          - name: certs\n            mountPath: /etc/istio/certs\n            readOnly: true\n          - name: config\n            mountPath: /etc/istio/config\n            readOnly: true\n          livenessProbe:\n            exec:\n              command:\n                - /usr/local/bin/galley\n                - probe\n                - --probe-path=/health\n                - --interval=10s\n            initialDelaySeconds: 5\n            periodSeconds: 5\n          readinessProbe:\n            exec:\n              command:\n                - /usr/local/bin/galley\n                - probe\n                - --probe-path=/health\n                - --interval=10s\n            initialDelaySeconds: 5\n            periodSeconds: 5\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n      volumes:\n      - name: certs\n        secret:\n          secretName: istio.istio-galley-service-account\n      - name: config\n        configMap:\n          name: istio-galley-configuration\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: istio-galley\n  namespace: {{ .Release.Namespace }}\n  labels:\n    istio: galley\nspec:\n  ports:\n  - port: 443\n    name: https-validation\n  - port: 9093\n    name: http-monitoring\n  selector:\n    istio: galley\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-galley-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/galley/templates/validatingwehookconfiguration.yaml.tpl",
    "content": "{{ define \"validatingwebhookconfiguration.yaml.tpl\" }}\napiVersion: admissionregistration.k8s.io/v1beta1\nkind: ValidatingWebhookConfiguration\nmetadata:\n  name: istio-galley\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nwebhooks:\n{{- if .Values.global.configValidation }}\n  - name: pilot.validation.istio.io\n    clientConfig:\n      service:\n        name: istio-galley\n        namespace: {{ .Release.Namespace }}\n        path: \"/admitpilot\"\n      caBundle: \"\"\n    rules:\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - config.istio.io\n        apiVersions:\n        - v1alpha2\n        resources:\n        - httpapispecs\n        - httpapispecbindings\n        - quotaspecs\n        - quotaspecbindings\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - rbac.istio.io\n        apiVersions:\n        - \"*\"\n        resources:\n        - \"*\"\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - authentication.istio.io\n        apiVersions:\n        - \"*\"\n        resources:\n        - \"*\"\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - networking.istio.io\n        apiVersions:\n        - \"*\"\n        resources:\n        - destinationrules\n        - envoyfilters\n        - gateways\n        # disabled per @costinm's request\n        # - serviceentries\n        - virtualservices\n    failurePolicy: Fail\n  - name: mixer.validation.istio.io\n    clientConfig:\n      service:\n        name: istio-galley\n        namespace: {{ .Release.Namespace }}\n        path: \"/admitmixer\"\n      caBundle: \"\"\n    rules:\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - config.istio.io\n        apiVersions:\n        - v1alpha2\n        resources:\n        - rules\n        - attributemanifests\n        - circonuses\n        - deniers\n        - fluentds\n        - kubernetesenvs\n        - listcheckers\n        - memquotas\n        - noops\n        - opas\n        - prometheuses\n        - rbacs\n        - servicecontrols\n        - solarwindses\n        - stackdrivers\n        - statsds\n        - stdios\n        - apikeys\n        - authorizations\n        - checknothings\n        # - kuberneteses\n        - listentries\n        - logentries\n        - metrics\n        - quotas\n        - reportnothings\n        - servicecontrolreports\n        - tracespans\n    failurePolicy: Fail\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/gateways/Chart.yaml",
    "content": "apiVersion: v1\nname: gateways\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for deploying Istio gateways\nkeywords:\n  - istio\n  - ingressgateway\n  - egressgateway\n  - gateways\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/gateways/templates/autoscale.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if and $spec.enabled $spec.autoscaleMin }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n    name: {{ $key }}\n    namespace: {{ $spec.namespace | default $.Release.Namespace }}\nspec:\n    maxReplicas: {{ $spec.autoscaleMax }}\n    minReplicas: {{ $spec.autoscaleMin }}\n    scaleTargetRef:\n      apiVersion: apps/v1beta1\n      kind: Deployment\n      name: {{ $key }}\n    metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        targetAverageUtilization: {{ $spec.cpu.targetAverageUtilization }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/gateways/templates/clusterrole.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  labels:\n    app: {{ template \"istio.name\" $ }}\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version }}\n    heritage: {{ $.Release.Service }}\n    release: {{ $.Release.Name }}\n  name: {{ $key }}-{{ $.Release.Namespace }}\nrules:\n- apiGroups: [\"extensions\"]\n  resources: [\"thirdpartyresources\", \"virtualservices\", \"destinationrules\", \"gateways\"]\n  verbs: [\"get\", \"watch\", \"list\", \"update\"]\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/gateways/templates/clusterrolebindings.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: {{ $key }}-{{ $.Release.Namespace }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: {{ $key }}-{{ $.Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: {{ $key }}-service-account\n    namespace: {{ $.Release.Namespace }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/gateways/templates/deployment.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: {{ $key }}\n  namespace: {{ $spec.namespace | default $.Release.Namespace }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    heritage: {{ $.Release.Service }}\n    {{- range $key, $val := $spec.labels }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\nspec:\n  replicas: {{ $spec.replicaCount }}\n  template:\n    metadata:\n      labels:\n        {{- range $key, $val := $spec.labels }}\n        {{ $key }}: {{ $val }}\n        {{- end }}\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: {{ $key }}-service-account\n{{- if $.Values.global.priorityClassName }}\n      priorityClassName: \"{{ $.Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: istio-proxy\n          image: \"{{ $.Values.global.hub }}/proxyv2:{{ $.Values.global.tag }}\"\n          imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n          ports:\n            {{- range $key, $val := $spec.ports }}\n            - containerPort: {{ $val.port }}\n            {{- end }}\n          args:\n          - proxy\n          - router\n          - -v\n          - \"2\"\n          - --discoveryRefreshDelay\n          - '1s' #discoveryRefreshDelay\n          - --drainDuration\n          - '45s' #drainDuration\n          - --parentShutdownDuration\n          - '1m0s' #parentShutdownDuration\n          - --connectTimeout\n          - '10s' #connectTimeout\n          - --serviceCluster\n          - {{ $key }}\n          - --zipkinAddress\n        {{- if $.Values.global.istioNamespace }}\n          - zipkin.{{ $.Values.global.istioNamespace }}:9411\n        {{- else }}\n          - zipkin:9411\n        {{- end }}\n        {{- if $.Values.global.proxy.envoyStatsd.enabled }}\n          - --statsdUdpAddress\n          - {{ $.Values.global.proxy.envoyStatsd.host }}:{{ $.Values.global.proxy.envoyStatsd.port }}\n        {{- end }}\n          - --proxyAdminPort\n          - \"15000\"\n        {{- if $.Values.global.controlPlaneSecurityEnabled }}\n          - --controlPlaneAuthPolicy\n          - MUTUAL_TLS\n          - --discoveryAddress\n          {{- if $.Values.global.istioNamespace }}\n          - istio-pilot.{{ $.Values.global.istioNamespace }}:15005\n          {{- else }}\n          - istio-pilot:15005\n          {{- end }}\n        {{- else }}\n          - --controlPlaneAuthPolicy\n          - NONE\n          - --discoveryAddress\n          {{- if $.Values.global.istioNamespace }}\n          - istio-pilot.{{ $.Values.global.istioNamespace }}:8080\n          {{- else }}\n          - istio-pilot:8080\n          {{- end }}\n        {{- end }}\n          resources:\n{{- if $spec.resources }}\n{{ toYaml $spec.resources | indent 12 }}\n{{- else }}\n{{ toYaml $.Values.global.defaultResources | indent 12 }}\n{{- end }}\n          env:\n          - name: POD_NAME\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.name\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: INSTANCE_IP\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: status.podIP\n          - name: ISTIO_META_POD_NAME\n            valueFrom:\n              fieldRef:\n                fieldPath: metadata.name\n          volumeMounts:\n          - name: istio-certs\n            mountPath: /etc/certs\n            readOnly: true\n          {{- range $spec.secretVolumes }}\n          - name: {{ .name }}\n            mountPath: {{ .mountPath | quote }}\n            readOnly: true\n          {{- end }}\n{{- if $spec.additionalContainers }}\n{{ toYaml $spec.additionalContainers | indent 8 }}\n{{- end }}\n      volumes:\n      - name: istio-certs\n        secret:\n          secretName: istio.{{ $key }}-service-account\n          optional: true\n      {{- range $spec.secretVolumes }}\n      - name: {{ .name }}\n        secret:\n          secretName: {{ .secretName | quote }}\n          optional: true\n      {{- end }}\n      {{- range $spec.configVolumes }}\n      - name: {{ .name }}\n        configMap:\n          name: {{ .configMapName | quote }}\n          optional: true\n      {{- end }}\n      affinity:\n      {{- include \"nodeaffinity\" $ | indent 6 }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/gateways/templates/service.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ $key }}\n  namespace: {{ $spec.namespace | default $.Release.Namespace }}\n  annotations:\n    {{- range $key, $val := $spec.serviceAnnotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    heritage: {{ $.Release.Service }}\n    {{- range $key, $val := $spec.labels }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\nspec:\n{{- if $spec.loadBalancerIP }}\n  loadBalancerIP: \"{{ $spec.loadBalancerIP }}\"\n{{- end }}\n  type: {{ .type }}\n  selector:\n    {{- range $key, $val := $spec.labels }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  ports:\n    {{- range $key, $val := $spec.ports }}\n    -\n      {{- range $pkey, $pval := $val }}\n      {{ $pkey}}: {{ $pval }}\n      {{- end }}\n    {{- end }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/gateways/templates/serviceaccount.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: v1\nkind: ServiceAccount\n{{- if $.Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range $.Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: {{ $key }}-service-account\n  namespace: {{ $spec.namespace | default $.Release.Namespace }}\n  labels:\n    app: {{ $spec.labels.istio }}\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version }}\n    heritage: {{ $.Release.Service }}\n    release: {{ $.Release.Name }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: grafana\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"grafana.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"grafana.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-grafana-custom-resources\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: grafana\ndata:\n  custom-resources.yaml: |-\n    {{- include \"grafana-default.yaml.tpl\" . | indent 4}}\n  run.sh: |-\n    {{- include \"install-custom-resources.sh.tpl\" . | indent 4}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/templates/create-custom-resources-job.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: istio-grafana-post-install-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-grafana-post-install-{{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"authentication.istio.io\"] # needed to create default authn policy\n  resources: [\"*\"]\n  verbs: [\"*\"]\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-grafana-post-install-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-grafana-post-install-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-grafana-post-install-account\n    namespace: {{ .Release.Namespace }}\n---\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: istio-grafana-post-install\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-install\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  template:\n    metadata:\n      name: istio-grafana-post-install\n      labels:\n        app: istio-grafana\n        release: {{ .Release.Name }}\n    spec:\n      serviceAccountName: istio-grafana-post-install-account\n      containers:\n        - name: hyperkube\n          image: \"{{ .Values.global.hyperkube.hub }}/hyperkube:{{ .Values.global.hyperkube.tag }}\"\n          command: [ \"/bin/bash\", \"/tmp/grafana/run.sh\", \"/tmp/grafana/custom-resources.yaml\" ]\n          volumeMounts:\n            - mountPath: \"/tmp/grafana\"\n              name: tmp-configmap-grafana\n      volumes:\n        - name: tmp-configmap-grafana\n          configMap:\n            name: istio-grafana-custom-resources\n      restartPolicy: OnFailure\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: grafana\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"grafana.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        app: grafana\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: {{ .Chart.Name }}\n{{- if contains \"/\" .Values.image }}\n          image: \"{{ .Values.image }}\"\n{{- else }}\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n{{- end }}\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n            - containerPort: {{ .Values.service.internalPort }}\n          readinessProbe:\n            httpGet:\n              path: /login\n              port: {{ .Values.service.internalPort }}\n          env:\n          - name: GRAFANA_PORT\n            value: {{ .Values.service.internalPort | quote }}\n{{- if .Values.security.enabled }}\n          - name: GF_SECURITY_ADMIN_USER\n            valueFrom:\n              secretKeyRef:\n                name: grafana\n                key: username\n          - name: GF_SECURITY_ADMIN_PASSWORD\n            valueFrom:\n              secretKeyRef:\n                name: grafana\n                key: password\n          - name: GF_AUTH_BASIC_ENABLED\n            value: \"true\"\n          - name: GF_AUTH_ANONYMOUS_ENABLED\n            value: \"false\"\n          - name: GF_AUTH_DISABLE_LOGIN_FORM\n            value: \"false\"\n{{- else }}\n          - name: GF_AUTH_BASIC_ENABLED\n            value: \"false\"\n          - name: GF_AUTH_ANONYMOUS_ENABLED\n            value: \"true\"\n          - name: GF_AUTH_ANONYMOUS_ORG_ROLE\n            value: Admin\n{{- end }}\n          - name: GF_PATHS_DATA\n            value: /data/grafana\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          volumeMounts:\n          - name: data\n            mountPath: /data/grafana\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n      volumes:\n      - name: data\n{{- if .Values.persist }}\n        persistentVolumeClaim:\n          claimName: istio-grafana-pvc\n{{- else }}\n        emptyDir: {}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/templates/grafana-ports-mtls.yaml",
    "content": "{{ define \"grafana-default.yaml.tpl\" }}\napiVersion: authentication.istio.io/v1alpha1\nkind: Policy\nmetadata:\n  name: grafana-ports-mtls-disabled\n  namespace: {{ .Release.Namespace }}\nspec:\n  targets:\n  - name: grafana\n    ports:\n    - number: {{ .Values.service.externalPort }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/templates/pvc.yaml",
    "content": "{{- if .Values.persist }}\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: istio-grafana-pvc\n  labels:\n    app: {{ template \"grafana.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  storageClassName: {{ .Values.storageClassName }}\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 5Gi\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/templates/secret.yaml",
    "content": "\n{{- if .Values.security.enabled -}}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: grafana\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: grafana\ntype: Opaque\ndata:\n  username: {{ .Values.security.adminUser | b64enc | quote }}\n  password: {{ .Values.security.adminPassword | b64enc | quote }}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/grafana/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: grafana\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    {{- range $key, $val := .Values.service.annotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  labels:\n    app: {{ template \"grafana.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  type: {{ .Values.service.type }}\n  ports:\n    - port: {{ .Values.service.externalPort }}\n      targetPort: {{ .Values.service.internalPort }}\n      protocol: TCP\n      name: {{ .Values.service.name }}\n  selector:\n    app: grafana\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/ingress/Chart.yaml",
    "content": "apiVersion: v1\nname: ingress\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for ingress deployment\nkeywords:\n  - istio\n  - ingress\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/ingress/templates/autoscale.yaml",
    "content": "{{- if .Values.autoscaleMin }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n    name: istio-ingress\n    namespace: {{ .Release.Namespace }}\nspec:\n    maxReplicas: {{ .Values.autoscaleMax }}\n    minReplicas: {{ .Values.autoscaleMin }}\n    scaleTargetRef:\n      apiVersion: apps/v1beta1\n      kind: Deployment\n      name: istio-ingress\n    metrics:\n      - type: Resource\n        resource:\n          name: cpu\n          targetAverageUtilization: 80\n{{ end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/ingress/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: istio-ingress-{{ .Release.Namespace }}\nrules:\n- apiGroups: [\"extensions\"]\n  resources: [\"thirdpartyresources\", \"ingresses\"]\n  verbs: [\"get\", \"watch\", \"list\", \"update\"]\n- apiGroups: [\"\"]\n  resources: [\"configmaps\", \"pods\", \"endpoints\", \"services\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/ingress/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-ingress-{{ .Release.Namespace }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-pilot-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-ingress-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/ingress/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-ingress\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: ingress\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        istio: ingress\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-ingress-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: {{ template \"istio.name\" . }}\n          image: \"{{ .Values.global.hub }}/proxyv2:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n            - containerPort: 80\n            - containerPort: 443\n          args:\n          - proxy\n          - ingress\n          - -v\n          - \"2\"\n          - --discoveryRefreshDelay\n          - '1s' #discoveryRefreshDelay\n          - --drainDuration\n          - '45s' #drainDuration\n          - --parentShutdownDuration\n          - '1m0s' #parentShutdownDuration\n          - --connectTimeout\n          - '10s' #connectTimeout\n          - --serviceCluster\n          - istio-ingress\n          - --zipkinAddress\n          - zipkin:9411\n        {{- if .Values.global.proxy.envoyStatsd.enabled }}\n          - --statsdUdpAddress\n          - {{ .Values.global.proxy.envoyStatsd.host }}:{{ .Values.global.proxy.envoyStatsd.port }}\n        {{- end }}\n          - --proxyAdminPort\n          - \"15000\"\n        {{- if .Values.global.controlPlaneSecurityEnabled }}\n          - --controlPlaneAuthPolicy\n          - MUTUAL_TLS\n          - --discoveryAddress\n          - istio-pilot:15005\n        {{- else }}\n          - --controlPlaneAuthPolicy\n          - NONE\n          - --discoveryAddress\n          - istio-pilot:8080\n        {{- end }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          env:\n          - name: POD_NAME\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.name\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: INSTANCE_IP\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: status.podIP\n          volumeMounts:\n          - name: istio-certs\n            mountPath: /etc/certs\n            readOnly: true\n          - name: ingress-certs\n            mountPath: /etc/istio/ingress-certs\n            readOnly: true\n      volumes:\n      - name: istio-certs\n        secret:\n          secretName: istio.istio-ingress-service-account\n          optional: true\n      - name: ingress-certs\n        secret:\n          secretName: istio-ingress-certs\n          optional: true\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/ingress/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: istio-ingress\n  namespace: {{ .Release.Namespace }}\n  labels:\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: ingress\n  annotations:\n    {{- range $key, $val := .Values.service.annotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\nspec:\n{{- if .Values.service.loadBalancerIP }}\n  loadBalancerIP: \"{{ .Values.service.loadBalancerIP }}\"\n{{- end }}\n  type: {{ .Values.service.type }}\n  selector:\n    istio: ingress\n  ports:\n    {{- range $key, $val := .Values.service.ports }}\n    -\n      {{- range $pkey, $pval := $val }}\n      {{ $pkey}}: {{ $pval }}\n      {{- end }}\n    {{- end }}\n---\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/ingress/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-ingress-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/Chart.yaml",
    "content": "apiVersion: v1\ndescription: Kiali is an open source project for service mesh observability, refer to https://github.com/kiali/kiali for detail.\nname: kiali\nversion: 1.0.1\nappVersion: 0.6.0\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: kiali\n  labels:\n    app: kiali\n    version: master\nrules:\n- apiGroups: [\"\", \"apps\", \"autoscaling\", \"batch\"]\n  resources:\n  - configmaps\n  - namespaces\n  - nodes\n  - pods\n  - projects\n  - services\n  - endpoints\n  - deployments\n  - horizontalpodautoscalers\n  - replicasets\n  - statefulsets\n  - replicationcontrollers\n  - jobs\n  - cronjobs\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups: [\"config.istio.io\"]\n  resources:\n  - circonuses\n  - deniers\n  - fluentds\n  - kubernetesenvs\n  - listcheckers\n  - memquotas\n  - opas\n  - prometheuses\n  - rbacs\n  - servicecontrols\n  - solarwindses\n  - stackdrivers\n  - statsds\n  - stdios\n  - handlers\n  - apikeys\n  - authorizations\n  - checknothings\n  - kuberneteses\n  - listentries\n  - logentries\n  - metrics\n  - quotas\n  - reportnothings\n  - servicecontrolreports\n  - rules\n  - quotaspecs\n  - quotaspecbindings\n  verbs:\n  - get\n  - list\n  - watch\n  - delete\n- apiGroups: [\"networking.istio.io\"]\n  resources:\n  - virtualservices\n  - destinationrules\n  - serviceentries\n  - gateways\n  verbs:\n  - get\n  - list\n  - watch\n  - delete"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-kiali-admin-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: kiali\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: kiali\nsubjects:\n- kind: ServiceAccount\n  name: kiali-service-account\n  namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\ndata:\n  config.yaml: |\n    server:\n      port: 20001\n      static_content_root_directory: /opt/kiali/console\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  selector:\n    matchLabels:\n      app: kiali\n  template:\n    metadata:\n      name: kiali\n      labels:\n        app: kiali\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: kiali-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n      - image: \"{{ .Values.hub }}/kiali:{{ .Values.tag }}\"\n        name: kiali\n        command:\n        - \"/opt/kiali/kiali\"\n        - \"-config\"\n        - \"/kiali-configuration/config.yaml\"\n        - \"-v\"\n        - \"4\"\n        env:\n        - name: ACTIVE_NAMESPACE\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n        - name: SERVER_CREDENTIALS_USERNAME\n          valueFrom:\n            secretKeyRef:\n              name: kiali\n              key: username\n        - name: SERVER_CREDENTIALS_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: kiali\n              key: passphrase\n        - name: PROMETHEUS_SERVICE_URL\n          value: http://prometheus:9090\n{{- if .Values.dashboard.grafanaURL }}\n        - name: GRAFANA_URL\n          value: {{ .Values.dashboard.grafanaURL }}\n{{- end }}\n        - name: GRAFANA_DASHBOARD\n          value: istio-service-dashboard\n        - name: GRAFANA_VAR_SERVICE_SOURCE\n          value: var-service\n        - name: GRAFANA_VAR_SERVICE_DEST\n          value: var-service\n{{- if .Values.dashboard.jaegerURL }}\n        - name: JAEGER_URL\n          value: {{ .Values.dashboard.jaegerURL }}\n{{- end }}\n        volumeMounts:\n        - name: kiali-configuration\n          mountPath: \"/kiali-configuration\"\n        resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n      volumes:\n      - name: kiali-configuration\n        configMap:\n          name: kiali\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/templates/ingress.yaml",
    "content": "{{- if .Values.ingress.enabled -}}\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\n  annotations:\n    {{- range $key, $value := .Values.ingress.annotations }}\n      {{ $key }}: {{ $value | quote }}\n    {{- end }}\nspec:\n  rules:\n    {{- range $host := .Values.ingress.hosts }}\n    - host: {{ $host }}\n      http:\n        paths:\n          - path: /\n            backend:\n              serviceName: kiali\n              servicePort: 20001\n    {{- end -}}\n  {{- if .Values.ingress.tls }}\n  tls:\n{{ toYaml .Values.ingress.tls | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/templates/secrets.yaml",
    "content": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\n\ntype: Opaque\ndata:\n  username: {{ .Values.dashboard.username | b64enc | quote }}\n  passphrase: {{ .Values.dashboard.passphrase | b64enc | quote }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\nspec:\n  ports:\n  - name: tcp\n    protocol: TCP\n    port: 20001\n    name: http-kiali\n  selector:\n    app: kiali\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/kiali/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: kiali-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/Chart.yaml",
    "content": "apiVersion: v1\nname: mixer\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for mixer deployment\nkeywords:\n  - istio\n  - mixer\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"mixer.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"mixer.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/autoscale.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if or (eq $key \"istio-policy\") (eq $key \"istio-telemetry\") }}\n{{- if and $spec.autoscaleEnabled $spec.autoscaleMin }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n    name: {{ $key }}\n    namespace: {{ $.Release.Namespace }}\nspec:\n    maxReplicas: {{ $spec.autoscaleMax }}\n    minReplicas: {{ $spec.autoscaleMin }}\n    scaleTargetRef:\n      apiVersion: apps/v1beta1\n      kind: Deployment\n      name: {{ $key }}\n    metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        targetAverageUtilization: {{ $spec.cpu.targetAverageUtilization }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-mixer-{{ .Release.Namespace }}\n  labels:\n    app: {{ template \"mixer.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"config.istio.io\"] # istio CRD watcher\n  resources: [\"*\"]\n  verbs: [\"create\", \"get\", \"list\", \"watch\", \"patch\"]\n- apiGroups: [\"rbac.istio.io\"] # istio RBAC watcher\n  resources: [\"*\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"apiextensions.k8s.io\"]\n  resources: [\"customresourcedefinitions\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"\"]\n  resources: [\"configmaps\", \"endpoints\", \"pods\", \"services\", \"namespaces\", \"secrets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"extensions\"]\n  resources: [\"replicasets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"apps\"]\n  resources: [\"replicasets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-mixer-admin-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: {{ template \"mixer.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-mixer-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-mixer-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/config.yaml",
    "content": "apiVersion: \"config.istio.io/v1alpha2\"\nkind: attributemanifest\nmetadata:\n  name: istioproxy\n  namespace: {{ .Release.Namespace }}\nspec:\n  attributes:\n    origin.ip:\n      valueType: IP_ADDRESS\n    origin.uid:\n      valueType: STRING\n    origin.user:\n      valueType: STRING\n    request.headers:\n      valueType: STRING_MAP\n    request.id:\n      valueType: STRING\n    request.host:\n      valueType: STRING\n    request.method:\n      valueType: STRING\n    request.path:\n      valueType: STRING\n    request.reason:\n      valueType: STRING\n    request.referer:\n      valueType: STRING\n    request.scheme:\n      valueType: STRING\n    request.total_size:\n          valueType: INT64\n    request.size:\n      valueType: INT64\n    request.time:\n      valueType: TIMESTAMP\n    request.useragent:\n      valueType: STRING\n    response.code:\n      valueType: INT64\n    response.duration:\n      valueType: DURATION\n    response.headers:\n      valueType: STRING_MAP\n    response.total_size:\n          valueType: INT64\n    response.size:\n      valueType: INT64\n    response.time:\n      valueType: TIMESTAMP\n    source.uid:\n      valueType: STRING\n    source.user: # DEPRECATED\n      valueType: STRING\n    source.principal:\n      valueType: STRING\n    destination.uid:\n      valueType: STRING\n    destination.principal:\n      valueType: STRING\n    destination.port:\n      valueType: INT64\n    connection.event:\n      valueType: STRING\n    connection.id:\n      valueType: STRING\n    connection.received.bytes:\n      valueType: INT64\n    connection.received.bytes_total:\n      valueType: INT64\n    connection.sent.bytes:\n      valueType: INT64\n    connection.sent.bytes_total:\n      valueType: INT64\n    connection.duration:\n      valueType: DURATION\n    connection.mtls:\n      valueType: BOOL\n    connection.requested_server_name:\n      valueType: STRING\n    context.protocol:\n      valueType: STRING\n    context.timestamp:\n      valueType: TIMESTAMP\n    context.time:\n      valueType: TIMESTAMP\n    # Deprecated, kept for compatibility\n    context.reporter.local:\n      valueType: BOOL\n    context.reporter.kind:\n      valueType: STRING\n    context.reporter.uid:\n      valueType: STRING\n    api.service:\n      valueType: STRING\n    api.version:\n      valueType: STRING\n    api.operation:\n      valueType: STRING\n    api.protocol:\n      valueType: STRING\n    request.auth.principal:\n      valueType: STRING\n    request.auth.audiences:\n      valueType: STRING\n    request.auth.presenter:\n      valueType: STRING\n    request.auth.claims:\n      valueType: STRING_MAP\n    request.auth.raw_claims:\n      valueType: STRING\n    request.api_key:\n      valueType: STRING\n\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: attributemanifest\nmetadata:\n  name: kubernetes\n  namespace: {{ .Release.Namespace }}\nspec:\n  attributes:\n    source.ip:\n      valueType: IP_ADDRESS\n    source.labels:\n      valueType: STRING_MAP\n    source.metadata:\n      valueType: STRING_MAP\n    source.name:\n      valueType: STRING\n    source.namespace:\n      valueType: STRING\n    source.owner:\n      valueType: STRING\n    source.service:  # DEPRECATED\n      valueType: STRING\n    source.serviceAccount:\n      valueType: STRING\n    source.services:\n      valueType: STRING\n    source.workload.uid:\n      valueType: STRING\n    source.workload.name:\n      valueType: STRING\n    source.workload.namespace:\n      valueType: STRING\n    destination.ip:\n      valueType: IP_ADDRESS\n    destination.labels:\n      valueType: STRING_MAP\n    destination.metadata:\n      valueType: STRING_MAP\n    destination.owner:\n      valueType: STRING\n    destination.name:\n      valueType: STRING\n    destination.container.name:\n      valueType: STRING\n    destination.namespace:\n      valueType: STRING\n    destination.service: # DEPRECATED\n      valueType: STRING\n    destination.service.uid:\n      valueType: STRING\n    destination.service.name:\n      valueType: STRING\n    destination.service.namespace:\n      valueType: STRING\n    destination.service.host:\n      valueType: STRING\n    destination.serviceAccount:\n      valueType: STRING\n    destination.workload.uid:\n      valueType: STRING\n    destination.workload.name:\n      valueType: STRING\n    destination.workload.namespace:\n      valueType: STRING\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: stdio\nmetadata:\n  name: handler\n  namespace: {{ .Release.Namespace }}\nspec:\n  outputAsJson: true\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: logentry\nmetadata:\n  name: accesslog\n  namespace: {{ .Release.Namespace }}\nspec:\n  severity: '\"Info\"'\n  timestamp: request.time\n  variables:\n    sourceIp: source.ip | ip(\"0.0.0.0\")\n    sourceApp: source.labels[\"app\"] | \"\"\n    sourcePrincipal: source.principal | \"\"\n    sourceName: source.name | \"\"\n    sourceWorkload: source.workload.name | \"\"\n    sourceNamespace: source.namespace | \"\"\n    sourceOwner: source.owner | \"\"\n    destinationApp: destination.labels[\"app\"] | \"\"\n    destinationIp: destination.ip | ip(\"0.0.0.0\")\n    destinationServiceHost: destination.service.host | \"\"\n    destinationWorkload: destination.workload.name | \"\"\n    destinationName: destination.name | \"\"\n    destinationNamespace: destination.namespace | \"\"\n    destinationOwner: destination.owner | \"\"\n    destinationPrincipal: destination.principal | \"\"\n    apiClaims: request.auth.raw_claims | \"\"\n    apiKey: request.api_key | request.headers[\"x-api-key\"] | \"\"\n    protocol: request.scheme | context.protocol | \"http\"\n    method: request.method | \"\"\n    url: request.path | \"\"\n    responseCode: response.code | 0\n    responseSize: response.size | 0\n    requestSize: request.size | 0\n    requestId: request.headers[\"x-request-id\"] | \"\"\n    clientTraceId: request.headers[\"x-client-trace-id\"] | \"\"\n    latency: response.duration | \"0ms\"\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n    requestedServerName: connection.requested_server_name | \"\"\n    userAgent: request.useragent | \"\"\n    responseTimestamp: response.time\n    receivedBytes: request.total_size | 0\n    sentBytes: response.total_size | 0\n    referer: request.referer | \"\"\n    httpAuthority: request.headers[\":authority\"] | request.host | \"\"\n    xForwardedFor: request.headers[\"x-forwarded-for\"] | \"0.0.0.0\"\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n  monitored_resource_type: '\"global\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: logentry\nmetadata:\n  name: tcpaccesslog\n  namespace: {{ .Release.Namespace }}\nspec:\n  severity: '\"Info\"'\n  timestamp: context.time | timestamp(\"2017-01-01T00:00:00Z\")\n  variables:\n    connectionEvent: connection.event | \"\"\n    sourceIp: source.ip | ip(\"0.0.0.0\")\n    sourceApp: source.labels[\"app\"] | \"\"\n    sourcePrincipal: source.principal | \"\"\n    sourceName: source.name | \"\"\n    sourceWorkload: source.workload.name | \"\"\n    sourceNamespace: source.namespace | \"\"\n    sourceOwner: source.owner | \"\"\n    destinationApp: destination.labels[\"app\"] | \"\"\n    destinationIp: destination.ip | ip(\"0.0.0.0\")\n    destinationServiceHost: destination.service.host | \"\"\n    destinationWorkload: destination.workload.name | \"\"\n    destinationName: destination.name | \"\"\n    destinationNamespace: destination.namespace | \"\"\n    destinationOwner: destination.owner | \"\"\n    destinationPrincipal: destination.principal | \"\"\n    protocol: context.protocol | \"tcp\"\n    connectionDuration: connection.duration | \"0ms\"\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n    requestedServerName: connection.requested_server_name | \"\"\n    receivedBytes: connection.received.bytes | 0\n    sentBytes: connection.sent.bytes | 0\n    totalReceivedBytes: connection.received.bytes_total | 0\n    totalSentBytes: connection.sent.bytes_total | 0\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n  monitored_resource_type: '\"global\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: stdio\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"http\" || context.protocol == \"grpc\"\n  actions:\n  - handler: handler.stdio\n    instances:\n    - accesslog.logentry\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: stdiotcp\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"tcp\"\n  actions:\n  - handler: handler.stdio\n    instances:\n    - tcpaccesslog.logentry\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: requestcount\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: \"1\"\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.host | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    request_protocol: api.protocol | context.protocol | \"unknown\"\n    response_code: response.code | 200\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: requestduration\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: response.duration | \"0ms\"\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.host | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    request_protocol: api.protocol | context.protocol | \"unknown\"\n    response_code: response.code | 200\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: requestsize\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: request.size | 0\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.host | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    request_protocol: api.protocol | context.protocol | \"unknown\"\n    response_code: response.code | 200\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: responsesize\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: response.size | 0\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.host | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    request_protocol: api.protocol | context.protocol | \"unknown\"\n    response_code: response.code | 200\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: tcpbytesent\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: connection.sent.bytes | 0\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.name | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: tcpbytereceived\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: connection.received.bytes | 0\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.name | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: prometheus\nmetadata:\n  name: handler\n  namespace: {{ .Release.Namespace }}\nspec:\n  metrics:\n  - name: requests_total\n    instance_name: requestcount.metric.{{ .Release.Namespace }}\n    kind: COUNTER\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - request_protocol\n    - response_code\n    - connection_security_policy\n  - name: request_duration_seconds\n    instance_name: requestduration.metric.{{ .Release.Namespace }}\n    kind: DISTRIBUTION\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - request_protocol\n    - response_code\n    - connection_security_policy\n    buckets:\n      explicit_buckets:\n        bounds: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]\n  - name: request_bytes\n    instance_name: requestsize.metric.{{ .Release.Namespace }}\n    kind: DISTRIBUTION\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - request_protocol\n    - response_code\n    - connection_security_policy\n    buckets:\n      exponentialBuckets:\n        numFiniteBuckets: 8\n        scale: 1\n        growthFactor: 10\n  - name: response_bytes\n    instance_name: responsesize.metric.{{ .Release.Namespace }}\n    kind: DISTRIBUTION\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - request_protocol\n    - response_code\n    - connection_security_policy\n    buckets:\n      exponentialBuckets:\n        numFiniteBuckets: 8\n        scale: 1\n        growthFactor: 10\n  - name: tcp_sent_bytes_total\n    instance_name: tcpbytesent.metric.{{ .Release.Namespace }}\n    kind: COUNTER\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - connection_security_policy\n  - name: tcp_received_bytes_total\n    instance_name: tcpbytereceived.metric.{{ .Release.Namespace }}\n    kind: COUNTER\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - connection_security_policy\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: promhttp\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"http\" || context.protocol == \"grpc\"\n  actions:\n  - handler: handler.prometheus\n    instances:\n    - requestcount.metric\n    - requestduration.metric\n    - requestsize.metric\n    - responsesize.metric\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: promtcp\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"tcp\"\n  actions:\n  - handler: handler.prometheus\n    instances:\n    - tcpbytesent.metric\n    - tcpbytereceived.metric\n---\n\napiVersion: \"config.istio.io/v1alpha2\"\nkind: kubernetesenv\nmetadata:\n  name: handler\n  namespace: {{ .Release.Namespace }}\nspec:\n  # when running from mixer root, use the following config after adding a\n  # symbolic link to a kubernetes config file via:\n  #\n  # $ ln -s ~/.kube/config mixer/adapter/kubernetes/kubeconfig\n  #\n  # kubeconfig_path: \"mixer/adapter/kubernetes/kubeconfig\"\n\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: kubeattrgenrulerule\n  namespace: {{ .Release.Namespace }}\nspec:\n  actions:\n  - handler: handler.kubernetesenv\n    instances:\n    - attributes.kubernetes\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: tcpkubeattrgenrulerule\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"tcp\"\n  actions:\n  - handler: handler.kubernetesenv\n    instances:\n    - attributes.kubernetes\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: kubernetes\nmetadata:\n  name: attributes\n  namespace: {{ .Release.Namespace }}\nspec:\n  # Pass the required attribute data to the adapter\n  source_uid: source.uid | \"\"\n  source_ip: source.ip | ip(\"0.0.0.0\") # default to unspecified ip addr\n  destination_uid: destination.uid | \"\"\n  destination_port: destination.port | 0\n  attribute_bindings:\n    # Fill the new attributes from the adapter produced output.\n    # $out refers to an instance of OutputTemplate message\n    source.ip: $out.source_pod_ip | ip(\"0.0.0.0\")\n    source.uid: $out.source_pod_uid | \"unknown\"\n    source.labels: $out.source_labels | emptyStringMap()\n    source.name: $out.source_pod_name | \"unknown\"\n    source.namespace: $out.source_namespace | \"default\"\n    source.owner: $out.source_owner | \"unknown\"\n    source.serviceAccount: $out.source_service_account_name | \"unknown\"\n    source.workload.uid: $out.source_workload_uid | \"unknown\"\n    source.workload.name: $out.source_workload_name | \"unknown\"\n    source.workload.namespace: $out.source_workload_namespace | \"unknown\"\n    destination.ip: $out.destination_pod_ip | ip(\"0.0.0.0\")\n    destination.uid: $out.destination_pod_uid | \"unknown\"\n    destination.labels: $out.destination_labels | emptyStringMap()\n    destination.name: $out.destination_pod_name | \"unknown\"\n    destination.container.name: $out.destination_container_name | \"unknown\"\n    destination.namespace: $out.destination_namespace | \"default\"\n    destination.owner: $out.destination_owner | \"unknown\"\n    destination.serviceAccount: $out.destination_service_account_name | \"unknown\"\n    destination.workload.uid: $out.destination_workload_uid | \"unknown\"\n    destination.workload.name: $out.destination_workload_name | \"unknown\"\n    destination.workload.namespace: $out.destination_workload_namespace | \"unknown\"\n\n---\n# Configuration needed by Mixer.\n# Mixer cluster is delivered via CDS\n# Specify mixer cluster settings\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: istio-policy\n  namespace: {{ .Release.Namespace }}\nspec:\n  host: istio-policy.{{ .Release.Namespace }}.svc.cluster.local\n  trafficPolicy:\n    {{- if .Values.global.controlPlaneSecurityEnabled }}\n    portLevelSettings:\n    - port:\n        number: 15004\n      tls:\n        mode: ISTIO_MUTUAL\n    {{- end}}\n    connectionPool:\n      http:\n        http2MaxRequests: 10000\n        maxRequestsPerConnection: 10000\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: istio-telemetry\n  namespace: {{ .Release.Namespace }}\nspec:\n  host: istio-telemetry.{{ .Release.Namespace }}.svc.cluster.local\n  trafficPolicy:\n    {{- if .Values.global.controlPlaneSecurityEnabled }}\n    portLevelSettings:\n    - port:\n        number: 15004\n      tls:\n        mode: ISTIO_MUTUAL\n    {{- end}}\n    connectionPool:\n      http:\n        http2MaxRequests: 10000\n        maxRequestsPerConnection: 10000\n---\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-statsd-prom-bridge\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-statsd-prom-bridge\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: mixer\ndata:\n  mapping.conf: |-\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/deployment.yaml",
    "content": "{{- define \"policy_container\" }}\n    spec:\n      serviceAccountName: istio-mixer-service-account\n{{- if $.Values.global.priorityClassName }}\n      priorityClassName: \"{{ $.Values.global.priorityClassName }}\"\n{{- end }}\n      volumes:\n      - name: istio-certs\n        secret:\n          secretName: istio.istio-mixer-service-account\n          optional: true\n      - name: uds-socket\n        emptyDir: {}\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n      containers:\n      - name: mixer\n{{- if contains \"/\" .Values.image }}\n        image: \"{{ .Values.image }}\"\n{{- else }}\n        image: \"{{ $.Values.global.hub }}/{{ $.Values.image }}:{{ $.Values.global.tag }}\"\n{{- end }}\n        imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9093\n        - containerPort: 42422\n        args:\n          - --address\n          - unix:///sock/mixer.socket\n          - --configStoreURL=k8s://\n          - --configDefaultNamespace={{ $.Release.Namespace }}\n          - --trace_zipkin_url=http://zipkin:9411/api/v1/spans\n        resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: uds-socket\n          mountPath: /sock\n        livenessProbe:\n          httpGet:\n            path: /version\n            port: 9093\n          initialDelaySeconds: 5\n          periodSeconds: 5\n      - name: istio-proxy\n        image: \"{{ $.Values.global.hub }}/proxyv2:{{ $.Values.global.tag }}\"\n        imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9091\n        - containerPort: 15004\n        args:\n        - proxy\n        - --serviceCluster\n        - istio-policy\n        - --templateFile\n        - /etc/istio/proxy/envoy_policy.yaml.tmpl\n      {{- if $.Values.global.controlPlaneSecurityEnabled }}\n        - --controlPlaneAuthPolicy\n        - MUTUAL_TLS\n      {{- else }}\n        - --controlPlaneAuthPolicy\n        - NONE\n      {{- end }}\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        - name: INSTANCE_IP\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: status.podIP\n        resources:\n{{- if $.Values.global.proxy.resources }}\n{{ toYaml $.Values.global.proxy.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: istio-certs\n          mountPath: /etc/certs\n          readOnly: true\n        - name: uds-socket\n          mountPath: /sock\n{{- end }}\n\n{{- define \"telemetry_container\" }}\n    spec:\n      serviceAccountName: istio-mixer-service-account\n      volumes:\n      - name: istio-certs\n        secret:\n          secretName: istio.istio-mixer-service-account\n          optional: true\n      - name: uds-socket\n        emptyDir: {}\n    {{- if $.Values.nodeSelector }}\n      nodeSelector:\n{{ toYaml $.Values.nodeSelector | indent 8 }}\n    {{- end }}\n      containers:\n      - name: mixer\n{{- if contains \"/\" .Values.image }}\n        image: \"{{ .Values.image }}\"\n{{- else }}\n        image: \"{{ $.Values.global.hub }}/{{ $.Values.image }}:{{ $.Values.global.tag }}\"\n{{- end }}\n        imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9093\n        - containerPort: 42422\n        args:\n          - --address\n          - unix:///sock/mixer.socket\n          - --configStoreURL=k8s://\n          - --configDefaultNamespace={{ $.Release.Namespace }}\n          - --trace_zipkin_url=http://zipkin:9411/api/v1/spans\n        resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: uds-socket\n          mountPath: /sock\n        livenessProbe:\n          httpGet:\n            path: /version\n            port: 9093\n          initialDelaySeconds: 5\n          periodSeconds: 5\n      - name: istio-proxy\n        image: \"{{ $.Values.global.hub }}/proxyv2:{{ $.Values.global.tag }}\"\n        imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9091\n        - containerPort: 15004\n        args:\n        - proxy\n        - --serviceCluster\n        - istio-telemetry\n        - --templateFile\n        - /etc/istio/proxy/envoy_telemetry.yaml.tmpl\n      {{- if $.Values.global.controlPlaneSecurityEnabled }}\n        - --controlPlaneAuthPolicy\n        - MUTUAL_TLS\n      {{- else }}\n        - --controlPlaneAuthPolicy\n        - NONE\n      {{- end }}\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        - name: INSTANCE_IP\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: status.podIP\n        resources:\n{{- if $.Values.global.proxy.resources }}\n{{ toYaml $.Values.global.proxy.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: istio-certs\n          mountPath: /etc/certs\n          readOnly: true\n        - name: uds-socket\n          mountPath: /sock\n{{- end }}\n\n\n{{- $mixers := list \"policy\" \"telemetry\" }}\n{{- range $idx, $mname := $mixers }}\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-{{ $mname }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    istio: mixer\nspec:\n  replicas: {{ $.Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        app: {{ $mname }}\n        istio: mixer\n        istio-mixer-type: {{ $mname }}\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n{{- if eq $mname \"policy\"}}\n{{- template \"policy_container\" $ }}\n{{- else }}\n{{- template \"telemetry_container\" $ }}\n{{- end }}\n\n---\n{{- end }} {{/* range */}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/service.yaml",
    "content": "{{ $mixers := list \"policy\" \"telemetry\" }}\n{{- range $idx, $mname := $mixers }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: istio-{{ $mname }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    istio: mixer\nspec:\n  ports:\n  - name: grpc-mixer\n    port: 9091\n  - name: grpc-mixer-mtls\n    port: 15004\n  - name: http-monitoring\n    port: 9093\n{{- if eq $mname \"telemetry\" }}\n  - name: prometheus\n    port: 42422\n{{- end }}\n  selector:\n    istio: mixer\n    istio-mixer-type: {{ $mname }}\n---\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-mixer-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"mixer.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/mixer/templates/statsdtoprom.yaml",
    "content": "\n{{- $statsdname := \"statsd-prom-bridge\" }}\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: istio-{{ $statsdname }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    istio: {{ $statsdname }}\nspec:\n  ports:\n  - name: statsd-prom\n    port: 9102\n  - name: statsd-udp\n    port: 9125\n    protocol: UDP\n  selector:\n    istio: {{ $statsdname }}\n\n---\n\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-{{ $statsdname }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    istio: mixer\nspec:\n  template:\n    metadata:\n      labels:\n        istio: {{ $statsdname }}\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n    spec:\n      serviceAccountName: istio-mixer-service-account\n      volumes:\n      - name: config-volume\n        configMap:\n          name: istio-statsd-prom-bridge\n    {{- if $.Values.nodeSelector }}\n      nodeSelector:\n{{ toYaml $.Values.nodeSelector | indent 8 }}\n    {{- end }}\n      containers:\n      - name: {{ $statsdname }}\n        image: \"{{ $.Values.prometheusStatsdExporter.hub }}/statsd-exporter:{{ $.Values.prometheusStatsdExporter.tag }}\"\n        imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9102\n        - containerPort: 9125\n          protocol: UDP\n        args:\n        - '-statsd.mapping-config=/etc/statsd/mapping.conf'\n        resources:\n{{- if .Values.prometheusStatsdExporter.resources }}\n{{ toYaml .Values.prometheusStatsdExporter.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: config-volume\n          mountPath: /etc/statsd\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/Chart.yaml",
    "content": "apiVersion: v1\nname: pilot\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for pilot deployment\nkeywords:\n  - istio\n  - pilot\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/templates/autoscale.yaml",
    "content": "{{- if .Values.autoscaleMin }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n    name: istio-pilot\nspec:\n    maxReplicas: {{ .Values.autoscaleMax }}\n    minReplicas: {{ .Values.autoscaleMin }}\n    scaleTargetRef:\n      apiVersion: apps/v1beta1\n      kind: Deployment\n      name: istio-pilot\n    metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        targetAverageUtilization: {{ .Values.cpu.targetAverageUtilization }}\n---\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-pilot-{{ .Release.Namespace }}\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"config.istio.io\"]\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"rbac.istio.io\"]\n  resources: [\"*\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n- apiGroups: [\"networking.istio.io\"]\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"authentication.istio.io\"]\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"apiextensions.k8s.io\"]\n  resources: [\"customresourcedefinitions\"]\n  verbs: [\"*\"]\n- apiGroups: [\"extensions\"]\n  resources: [\"thirdpartyresources\", \"thirdpartyresources.extensions\", \"ingresses\", \"ingresses/status\"]\n  verbs: [\"*\"]\n- apiGroups: [\"\"]\n  resources: [\"configmaps\"]\n  verbs: [\"create\", \"get\", \"list\", \"watch\", \"update\"]\n- apiGroups: [\"\"]\n  resources: [\"endpoints\", \"pods\", \"services\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"\"]\n  resources: [\"namespaces\", \"nodes\", \"secrets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-pilot-{{ .Release.Namespace }}\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-pilot-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-pilot-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-pilot\n  namespace: {{ .Release.Namespace }}\n  # TODO: default template doesn't have this, which one is right ?\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: pilot\n  annotations:\n    checksum/config-volume: {{ template \"istio.configmap.checksum\" . }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        istio: pilot\n        app: pilot\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-pilot-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: discovery\n{{- if contains \"/\" .Values.image }}\n          image: \"{{ .Values.image }}\"\n{{- else }}\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n{{- end }}\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n          - \"discovery\"\n{{- if .Values.global.oneNamespace }}\n          - \"-a\"\n          - {{ .Release.Namespace }}\n{{- end }}\n{{- if not .Values.sidecar }}\n          - --secureGrpcAddr\n          - \":15011\"\n{{- end }}\n          ports:\n          - containerPort: 8080\n          - containerPort: 15010\n{{- if not .Values.sidecar }}\n          - containerPort: 15011\n{{- end }}\n          readinessProbe:\n            httpGet:\n              path: /ready\n              port: 8080\n            initialDelaySeconds: 5\n            periodSeconds: 30\n            timeoutSeconds: 5\n          env:\n          - name: POD_NAME\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.name\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: PILOT_CACHE_SQUASH\n            value: \"5\"\n          {{- if .Values.env }}\n          {{- range $key, $val := .Values.env }}\n          - name: {{ $key }}\n            value: \"{{ $val }}\"\n          {{- end }}\n          {{- end }}\n{{- if .Values.traceSampling }}\n          - name: PILOT_TRACE_SAMPLING\n            value: \"{{ .Values.traceSampling }}\"\n{{- end }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          volumeMounts:\n          - name: config-volume\n            mountPath: /etc/istio/config\n          - name: istio-certs\n            mountPath: /etc/certs\n            readOnly: true\n{{- if .Values.sidecar }}\n        - name: istio-proxy\n          image: \"{{ .Values.global.hub }}/proxyv2:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n          - containerPort: 15003\n          - containerPort: 15005\n          - containerPort: 15007\n          - containerPort: 15011\n          args:\n          - proxy\n          - --serviceCluster\n          - istio-pilot\n          - --templateFile\n          - /etc/istio/proxy/envoy_pilot.yaml.tmpl\n        {{- if $.Values.global.controlPlaneSecurityEnabled}}\n          - --controlPlaneAuthPolicy\n          - MUTUAL_TLS\n        {{- else }}\n          - --controlPlaneAuthPolicy\n          - NONE\n        {{- end }}\n          env:\n          - name: POD_NAME\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.name\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: INSTANCE_IP\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: status.podIP\n          resources:\n{{- if .Values.global.proxy.resources }}\n{{ toYaml .Values.global.proxy.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          volumeMounts:\n          - name: istio-certs\n            mountPath: /etc/certs\n            readOnly: true\n{{- end }}\n      volumes:\n      - name: config-volume\n        configMap:\n          name: istio\n      - name: istio-certs\n        secret:\n          secretName: istio.istio-pilot-service-account\n          optional: true   \n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/templates/gateway.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: istio-autogenerated-k8s-ingress\n  namespace: istio-system\nspec:\n  selector:\n    istio: {{ .Values.global.k8sIngressSelector }}\n  servers:\n  - port:\n      number: 80\n      protocol: HTTP2\n      name: http\n    hosts:\n    - \"*\"\n{{ if .Values.global.k8sIngressHttps }}\n  - port:\n      number: 443\n      protocol: HTTPS\n      name: https-default\n    tls:\n      mode: SIMPLE\n      serverCertificate: /etc/istio/ingress-certs/tls.crt\n      privateKey: /etc/istio/ingress-certs/tls.key\n    hosts:\n    - \"*\"\n{{ end }}\n---\n{{- if .Values.global.meshExpansion }}\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: meshexpansion-gateway\nspec:\n  selector:\n    istio: ingressgateway\n  servers:\n  - port:\n      number: 15011\n      protocol: TCP\n      name: tcp-pilot\n    hosts:\n    - \"*\"\n  - port:\n      number: 8060\n      protocol: TCP\n      name: tcp-citadel\n    hosts:\n    - \"*\"\n---\n{{- end }}\n\n{{- if .Values.global.meshExpansionILB }}\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: meshexpansion-ilb-gateway\nspec:\n  selector:\n    istio: ilbgateway\n  servers:\n  - port:\n      number: 15011\n      protocol: TCP\n      name: tcp-pilot\n    hosts:\n    - \"*\"\n  - port:\n      number: 8060\n      protocol: TCP\n      name: tcp-citadel\n    hosts:\n    - \"*\"\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/templates/meshexpansion.yaml",
    "content": "{{- if .Values.global.meshExpansion }}\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: meshexpansion-pilot\nspec:\n  hosts:\n  - \"pilot.istio-system\"\n  gateways:\n  - meshexpansion-gateway\n  tcp:\n  - match:\n    - port: 15011\n    route:\n    - destination:\n        host: istio-pilot.istio-system.svc.cluster.local\n        port:\n          number: 15011\n\n\n{{- end }}\n\n\n{{- if .Values.global.meshExpansionILB }}\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: ilb-meshexpansion-pilot\nspec:\n  hosts:\n  - \"meshexpansionilb.istio-system\"\n  gateways:\n  - meshexpansion-ilb-gateway\n  tcp:\n  - match:\n    - port: 15011\n    route:\n    - destination:\n        host: istio-pilot.istio-system.svc.cluster.local\n        port:\n          number: 15011\n  - match:\n    - port: 15010\n    route:\n    - destination:\n        host: istio-pilot.istio-system.svc.cluster.local\n        port:\n          number: 15010\n  - match:\n    - port: 5353\n    route:\n    - destination:\n        host: kube-dns.kube-system.svc.cluster.local\n        port:\n          number: 53\n\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: istio-pilot\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  ports:\n  - port: 15010\n    name: grpc-xds # direct\n  - port: 15011\n    name: https-xds # mTLS\n  - port: 8080\n    name: http-legacy-discovery # direct\n  - port: 9093\n    name: http-monitoring\n  selector:\n    istio: pilot\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/pilot/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-pilot-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/prometheus/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: prometheus\nversion: 1.0.1\nappVersion: 2.3.1\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/prometheus/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"prometheus.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"prometheus.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/prometheus/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: prometheus-{{ .Release.Namespace }}\nrules:\n- apiGroups: [\"\"]\n  resources:\n  - nodes\n  - services\n  - endpoints\n  - pods\n  - nodes/proxy\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"\"]\n  resources:\n  - configmaps\n  verbs: [\"get\"]\n- nonResourceURLs: [\"/metrics\"]\n  verbs: [\"get\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/prometheus/templates/clusterrolebindings.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: prometheus-{{ .Release.Namespace }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: prometheus-{{ .Release.Namespace }}\nsubjects:\n- kind: ServiceAccount\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/prometheus/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: prometheus\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\ndata:\n  prometheus.yml: |-\n    global:\n      scrape_interval: 15s\n    scrape_configs:\n\n    - job_name: 'istio-mesh'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-telemetry;prometheus\n\n    - job_name: 'envoy'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-statsd-prom-bridge;statsd-prom\n\n    - job_name: 'istio-policy'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-policy;http-monitoring\n\n    - job_name: 'istio-telemetry'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-telemetry;http-monitoring\n\n    - job_name: 'pilot'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-pilot;http-monitoring\n\n    - job_name: 'galley'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-galley;http-monitoring\n\n    # scrape config for API servers\n    - job_name: 'kubernetes-apiservers'\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - default\n      scheme: https\n      tls_config:\n        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt\n      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: kubernetes;https\n\n    # scrape config for nodes (kubelet)\n    - job_name: 'kubernetes-nodes'\n      scheme: https\n      tls_config:\n        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt\n      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token\n      kubernetes_sd_configs:\n      - role: node\n      relabel_configs:\n      - action: labelmap\n        regex: __meta_kubernetes_node_label_(.+)\n      - target_label: __address__\n        replacement: kubernetes.default.svc:443\n      - source_labels: [__meta_kubernetes_node_name]\n        regex: (.+)\n        target_label: __metrics_path__\n        replacement: /api/v1/nodes/${1}/proxy/metrics\n\n    # Scrape config for Kubelet cAdvisor.\n    #\n    # This is required for Kubernetes 1.7.3 and later, where cAdvisor metrics\n    # (those whose names begin with 'container_') have been removed from the\n    # Kubelet metrics endpoint.  This job scrapes the cAdvisor endpoint to\n    # retrieve those metrics.\n    #\n    # In Kubernetes 1.7.0-1.7.2, these metrics are only exposed on the cAdvisor\n    # HTTP endpoint; use \"replacement: /api/v1/nodes/${1}:4194/proxy/metrics\"\n    # in that case (and ensure cAdvisor's HTTP server hasn't been disabled with\n    # the --cadvisor-port=0 Kubelet flag).\n    #\n    # This job is not necessary and should be removed in Kubernetes 1.6 and\n    # earlier versions, or it will cause the metrics to be scraped twice.\n    - job_name: 'kubernetes-cadvisor'\n      scheme: https\n      tls_config:\n        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt\n      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token\n      kubernetes_sd_configs:\n      - role: node\n      relabel_configs:\n      - action: labelmap\n        regex: __meta_kubernetes_node_label_(.+)\n      - target_label: __address__\n        replacement: kubernetes.default.svc:443\n      - source_labels: [__meta_kubernetes_node_name]\n        regex: (.+)\n        target_label: __metrics_path__\n        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor\n\n    # scrape config for service endpoints.\n    - job_name: 'kubernetes-service-endpoints'\n      kubernetes_sd_configs:\n      - role: endpoints\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]\n        action: keep\n        regex: true\n      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]\n        action: replace\n        target_label: __scheme__\n        regex: (https?)\n      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]\n        action: replace\n        target_label: __metrics_path__\n        regex: (.+)\n      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]\n        action: replace\n        target_label: __address__\n        regex: ([^:]+)(?::\\d+)?;(\\d+)\n        replacement: $1:$2\n      - action: labelmap\n        regex: __meta_kubernetes_service_label_(.+)\n      - source_labels: [__meta_kubernetes_namespace]\n        action: replace\n        target_label: kubernetes_namespace\n      - source_labels: [__meta_kubernetes_service_name]\n        action: replace\n        target_label: kubernetes_name\n\n    # Example scrape config for pods\n    - job_name: 'kubernetes-pods'\n      kubernetes_sd_configs:\n      - role: pod\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]\n        action: keep\n        regex: true\n      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]\n        action: replace\n        target_label: __metrics_path__\n        regex: (.+)\n      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]\n        action: replace\n        regex: ([^:]+)(?::\\d+)?;(\\d+)\n        replacement: $1:$2\n        target_label: __address__\n      - action: labelmap\n        regex: __meta_kubernetes_pod_label_(.+)\n      - source_labels: [__meta_kubernetes_namespace]\n        action: replace\n        target_label: namespace\n      - source_labels: [__meta_kubernetes_pod_name]\n        action: replace\n        target_label: pod_name\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/prometheus/templates/deployment.yaml",
    "content": "# TODO: the original template has service account, roles, etc\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: prometheus\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  selector:\n    matchLabels:\n      app: prometheus\n  template:\n    metadata:\n      labels:\n        app: prometheus\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: prometheus\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: prometheus\n          image: \"{{ .Values.hub }}/prometheus:{{ .Values.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n            - '--storage.tsdb.retention=6h'\n            - '--config.file=/etc/prometheus/prometheus.yml'\n          ports:\n            - containerPort: 9090\n              name: http\n          livenessProbe:\n            httpGet:\n              path: /-/healthy\n              port: 9090\n          readinessProbe:\n            httpGet:\n              path: /-/ready\n              port: 9090\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          volumeMounts:\n          - name: config-volume\n            mountPath: /etc/prometheus\n      volumes:\n      - name: config-volume\n        configMap:\n          name: prometheus\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/prometheus/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    prometheus.io/scrape: 'true'\n    {{- range $key, $val := .Values.service.annotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  labels:\n    name: prometheus\nspec:\n  selector:\n    app: prometheus\n  ports:\n  - name: http-prometheus\n    protocol: TCP\n    port: 9090\n\n{{- if .Values.service.nodePort.enabled }}\n# Using separate ingress for nodeport, to avoid conflict with pilot e2e test configs.\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus-nodeport\n  namespace: {{ .Release.Namespace }}\n  labels:\n    name: prometheus\nspec:\n  type: NodePort\n  ports:\n  - port: 9090\n    nodePort: {{ .Values.service.nodePort.port }}\n    name: http-prometheus\n  selector:\n    app: prometheus\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/prometheus/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/Chart.yaml",
    "content": "apiVersion: v1\nname: security\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for istio authentication\nkeywords:\n  - istio\n  - security\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"security.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"security.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/cleanup-secrets.yaml",
    "content": "# The reason for creating a ServiceAccount and ClusterRole specifically for this\n# post-delete hooked job is because the citadel ServiceAccount is being deleted\n# before this hook is launched. On the other hand, running this hook before the\n# deletion of the citadel (e.g. pre-delete) won't delete the secrets because they\n# will be re-created immediately by the to-be-deleted citadel.\n#\n# It's also important that the ServiceAccount, ClusterRole and ClusterRoleBinding\n# will be ready before running the hooked Job therefore the hook weights.\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: istio-cleanup-secrets-service-account\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-delete\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n    \"helm.sh/hook-weight\": \"1\"\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-cleanup-secrets-{{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-delete\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n    \"helm.sh/hook-weight\": \"1\"\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"\"]\n  resources: [\"secrets\"]\n  verbs: [\"list\", \"delete\"]\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-cleanup-secrets-{{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-delete\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n    \"helm.sh/hook-weight\": \"2\"\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-cleanup-secrets-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-cleanup-secrets-service-account\n    namespace: {{ .Release.Namespace }}\n---\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: istio-cleanup-secrets\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-delete\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n    \"helm.sh/hook-weight\": \"3\"\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  template:\n    metadata:\n      name: istio-cleanup-secrets\n      labels:\n        app: {{ template \"security.name\" . }}\n        release: {{ .Release.Name }}\n    spec:\n      serviceAccountName: istio-cleanup-secrets-service-account\n      containers:\n        - name: hyperkube\n          image: \"{{ .Values.global.hyperkube.hub }}/hyperkube:{{ .Values.global.hyperkube.tag }}\"\n          command:\n          - /bin/bash\n          - -c\n          - >\n              kubectl get secret --all-namespaces | grep \"istio.io/key-and-cert\" |  while read -r entry; do\n                ns=$(echo $entry | awk '{print $1}');\n                name=$(echo $entry | awk '{print $2}');\n                kubectl delete secret $name -n $ns;\n              done\n      restartPolicy: OnFailure\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-citadel-{{ .Release.Namespace }}\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"\"]\n  resources: [\"secrets\"]\n  verbs: [\"create\", \"get\", \"watch\", \"list\", \"update\", \"delete\"]\n- apiGroups: [\"\"]\n  resources: [\"serviceaccounts\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n- apiGroups: [\"\"]\n  resources: [\"services\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-citadel-{{ .Release.Namespace }}\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-citadel-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-citadel-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-security-custom-resources\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: security\ndata:\n  custom-resources.yaml: |-\n    {{- if .Values.global.mtls.enabled }}\n      {{- include \"security-default.yaml.tpl\" . | indent 4}}\n    {{- end }}\n  run.sh: |-\n    {{- include \"install-custom-resources.sh.tpl\" . | indent 4}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/create-custom-resources-job.yaml",
    "content": "{{- if .Values.global.mtls.enabled }}\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: istio-security-post-install-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-security-post-install-{{ .Release.Namespace }}\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"authentication.istio.io\"] # needed to create default authn policy\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"networking.istio.io\"] # needed to create security destination rules\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"admissionregistration.k8s.io\"]\n  resources: [\"validatingwebhookconfigurations\"]\n  verbs: [\"get\"]\n- apiGroups: [\"extensions\"]\n  resources: [\"deployments\", \"replicasets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-security-post-install-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-security-post-install-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-security-post-install-account\n    namespace: {{ .Release.Namespace }}\n---\n\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: istio-security-post-install\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-install\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  template:\n    metadata:\n      name: istio-security-post-install\n      labels:\n        app: istio-security\n        release: {{ .Release.Name }}\n    spec:\n      serviceAccountName: istio-security-post-install-account\n      containers:\n        - name: hyperkube\n          image: \"{{ .Values.global.hyperkube.hub }}/hyperkube:{{ .Values.global.hyperkube.tag }}\"\n          command: [ \"/bin/bash\", \"/tmp/security/run.sh\", \"/tmp/security/custom-resources.yaml\" ]\n          volumeMounts:\n            - mountPath: \"/tmp/security\"\n              name: tmp-configmap-security\n      volumes:\n        - name: tmp-configmap-security\n          configMap:\n            name: istio-security-custom-resources\n      restartPolicy: OnFailure\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/deployment.yaml",
    "content": "# istio CA watching all namespaces\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-citadel\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: citadel\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        istio: citadel\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-citadel-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: citadel\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n            - --append-dns-names=true\n            - --grpc-port=8060\n            - --grpc-hostname=citadel\n            - --citadel-storage-namespace={{ .Release.Namespace }}\n            - --custom-dns-names=istio-pilot-service-account.{{ .Release.Namespace }}:istio-pilot.{{ .Release.Namespace }},istio-ingressgateway-service-account.{{ .Release.Namespace }}:istio-ingressgateway.{{ .Release.Namespace }}\n          {{- if .Values.selfSigned }}\n            - --self-signed-ca=true\n          {{- else }}\n            - --self-signed-ca=false\n            - --signing-cert=/etc/cacerts/ca-cert.pem\n            - --signing-key=/etc/cacerts/ca-key.pem\n            - --root-cert=/etc/cacerts/root-cert.pem\n            - --cert-chain=/etc/cacerts/cert-chain.pem\n          {{- end }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n{{- if not .Values.selfSigned }}\n          volumeMounts:\n          - name: cacerts\n            mountPath: /etc/cacerts\n            readOnly: true\n      volumes:\n      - name: cacerts\n        secret:\n         secretName: cacerts\n         optional: true\n{{- end }}\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/enable-mesh-mtls.yaml",
    "content": "{{ define \"security-default.yaml.tpl\" }}\n# These policy and destination rules effectively enable mTLS for all services in the mesh. For now,\n# they are added to Istio installation yaml for backward compatible. In future, they should be in\n# a separated yaml file so that customer can enable mTLS independent from installation.\n\n# Authentication policy to enable mutual TLS for all services (that have sidecar) in the mesh.\napiVersion: \"authentication.istio.io/v1alpha1\"\nkind: \"MeshPolicy\"\nmetadata:\n  name: \"default\"\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  peers:\n  - mtls: {}\n---\n# Corresponding destination rule to configure client side to use mutual TLS when talking to\n# any service (host) in the mesh.\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: \"default\"\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  host: \"*.local\"\n  trafficPolicy:\n    tls:\n      mode: ISTIO_MUTUAL\n---\n# Destination rule to dislabe (m)TLS when talking to API server, as API server doesn't have sidecar.\n# Customer should add similar destination rules for other services that dont' have sidecar.\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: \"api-server\"\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  host: \"kubernetes.default.svc.cluster.local\"\n  trafficPolicy:\n    tls:\n      mode: DISABLE\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/meshexpansion.yaml",
    "content": "{{- if .Values.global.meshExpansion }}\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: meshexpansion-citadel\nspec:\n  hosts:\n  - \"istio-citadel.istio-system\"\n  gateways:\n  - meshexpansion-gateway\n  tcp:\n  - match:\n    - port: 8060\n    route:\n    - destination:\n        host: istio-citadel.istio-system.svc.cluster.local\n        port:\n          number: 8060\n\n{{- end }}\n\n---\n\n{{- if .Values.global.meshExpansionILB }}\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: meshexpansion-ilb-citadel\nspec:\n  hosts:\n  - \"istio-citadel.istio-system\"\n  gateways:\n  - meshexpansion-ilb-gateway\n  tcp:\n  - match:\n    - port: 8060\n    route:\n    - destination:\n        host: istio-citadel.istio-system.svc.cluster.local\n        port:\n          number: 8060\n\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  # we use the normal name here (e.g. 'prometheus')\n  # as grafana is configured to use this as a data source\n  name: istio-citadel\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-citadel\nspec:\n  ports:\n    - name: grpc-citadel\n      port: 8060\n      targetPort: 8060\n      protocol: TCP\n    - name: http-monitoring\n      port: 9093\n  selector:\n    istio: citadel\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/security/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-citadel-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/servicegraph/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: servicegraph\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/servicegraph/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"servicegraph.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"servicegraph.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/servicegraph/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: servicegraph\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"servicegraph.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        app: servicegraph\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: servicegraph\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n            - containerPort: {{ .Values.service.internalPort }}\n          args:\n          - --prometheusAddr=http://prometheus:9090\n          livenessProbe:\n            httpGet:\n              path: /graph\n              port: {{ .Values.service.internalPort }}\n          readinessProbe:\n            httpGet:\n              path: /graph\n              port: {{ .Values.service.internalPort }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/servicegraph/templates/ingress.yaml",
    "content": "{{- if .Values.ingress.enabled -}}\n{{- $serviceName := include \"servicegraph.fullname\" . -}}\n{{- $servicePort := .Values.service.externalPort -}}\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: {{ template \"servicegraph.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"servicegraph.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n  annotations:\n    {{- range $key, $value := .Values.ingress.annotations }}\n      {{ $key }}: {{ $value | quote }}\n    {{- end }}\nspec:\n  rules:\n    {{- range $host := .Values.ingress.hosts }}\n    - host: {{ $host }}\n      http:\n        paths:\n          - path: /\n            backend:\n              serviceName: {{ $serviceName }}\n              servicePort: {{ $servicePort }}\n    {{- end -}}\n  {{- if .Values.ingress.tls }}\n  tls:\n{{ toYaml .Values.ingress.tls | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/servicegraph/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: servicegraph\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    {{- range $key, $val := .Values.service.annotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  labels:\n    app: servicegraph\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  type: {{ .Values.service.type }}\n  ports:\n    - port: {{ .Values.service.externalPort }}\n      targetPort: {{ .Values.service.internalPort }}\n      protocol: TCP\n      name: {{ .Values.service.name }}\n  selector:\n    app: servicegraph\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/sidecarInjectorWebhook/Chart.yaml",
    "content": "apiVersion: v1\nname: sidecarInjectorWebhook\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for sidecar injector webhook deployment\nkeywords:\n  - istio\n  - sidecarInjectorWebhook\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/sidecarInjectorWebhook/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"sidecar-injector.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"sidecar-injector.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/sidecarInjectorWebhook/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-sidecar-injector-{{ .Release.Namespace }}\n  labels:\n    app: istio-sidecar-injector\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"*\"]\n  resources: [\"configmaps\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"admissionregistration.k8s.io\"]\n  resources: [\"mutatingwebhookconfigurations\"]\n  verbs: [\"get\", \"list\", \"watch\", \"patch\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/sidecarInjectorWebhook/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-sidecar-injector-admin-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: istio-sidecar-injector\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-sidecar-injector-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-sidecar-injector-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/sidecarInjectorWebhook/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-sidecar-injector\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"sidecar-injector.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: sidecar-injector\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        istio: sidecar-injector\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-sidecar-injector-service-account\n {{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: sidecar-injector-webhook\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n            - --caCertFile=/etc/istio/certs/root-cert.pem\n            - --tlsCertFile=/etc/istio/certs/cert-chain.pem\n            - --tlsKeyFile=/etc/istio/certs/key.pem\n            - --injectConfig=/etc/istio/inject/config\n            - --meshConfig=/etc/istio/config/mesh\n            - --healthCheckInterval=2s\n            - --healthCheckFile=/health\n          volumeMounts:\n          - name: config-volume\n            mountPath: /etc/istio/config\n            readOnly: true\n          - name: certs\n            mountPath: /etc/istio/certs\n            readOnly: true\n          - name: inject-config\n            mountPath: /etc/istio/inject\n            readOnly: true\n          livenessProbe:\n            exec:\n              command:\n                - /usr/local/bin/sidecar-injector\n                - probe\n                - --probe-path=/health\n                - --interval=4s\n            initialDelaySeconds: 4\n            periodSeconds: 4\n          readinessProbe:\n            exec:\n              command:\n                - /usr/local/bin/sidecar-injector\n                - probe\n                - --probe-path=/health\n                - --interval=4s\n            initialDelaySeconds: 4\n            periodSeconds: 4\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n      volumes:\n      - name: config-volume\n        configMap:\n          name: istio\n      - name: certs\n        secret:\n          secretName: istio.istio-sidecar-injector-service-account\n      - name: inject-config\n        configMap:\n          name: istio-sidecar-injector\n          items:\n          - key: config\n            path: config\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/sidecarInjectorWebhook/templates/mutatingwebhook.yaml",
    "content": "apiVersion: admissionregistration.k8s.io/v1beta1\nkind: MutatingWebhookConfiguration\nmetadata:\n  name: istio-sidecar-injector\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-sidecar-injector\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nwebhooks:\n  - name: sidecar-injector.istio.io\n    clientConfig:\n      service:\n        name: istio-sidecar-injector\n        namespace: {{ .Release.Namespace }}\n        path: \"/inject\"\n      caBundle: \"\"\n    rules:\n      - operations: [ \"CREATE\" ]\n        apiGroups: [\"\"]\n        apiVersions: [\"v1\"]\n        resources: [\"pods\"]\n    failurePolicy: Fail\n    namespaceSelector:\n{{- if .Values.enableNamespacesByDefault }}\n      matchExpressions:\n      - key: istio-injection\n        operator: NotIn\n        values:\n        - disabled\n{{- else }}\n      matchLabels:\n        istio-injection: enabled\n{{- end }}\n\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/sidecarInjectorWebhook/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: istio-sidecar-injector\n  namespace: {{ .Release.Namespace }}\n  labels:\n    istio: sidecar-injector\nspec:\n  ports:\n  - port: 443\n  selector:\n    istio: sidecar-injector\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/sidecarInjectorWebhook/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-sidecar-injector-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-sidecar-injector\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/telemetry-gateway/Chart.yaml",
    "content": "apiVersion: v1\nname: telemetry-gateway\nversion: 1.0.1\nappVersion: 1.0.1\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for configuring a gateway for Istio telemetry addons\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/telemetry-gateway/templates/gateway.yaml",
    "content": "{{- if or (.Values.prometheusEnabled) (.Values.grafanaEnabled) }}\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: istio-telemetry-gateway\n  namespace: {{ .Release.Namespace }}\nspec:\n  selector:\n    istio: {{ .Values.gatewayName }}\n  servers:\n  {{- if .Values.prometheusEnabled }}\n  - port:\n      number: 15030\n      name: http2-prometheus\n      protocol: HTTP2\n    hosts:\n    - \"*\"\n  {{- end }}\n  {{- if .Values.grafanaEnabled }}\n  - port:\n      number: 15031\n      name: http2-grafana\n      protocol: HTTP2\n    hosts:\n    - \"*\"\n  {{- end }}\n{{- if .Values.grafanaEnabled }}\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: grafana\n  namespace: {{ .Release.Namespace }}\nspec:\n  host: grafana.{{ .Release.Namespace }}.svc.cluster.local\n  trafficPolicy:\n    tls:\n      mode: DISABLE\n{{- end }}\n{{- if .Values.prometheusEnabled }}\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\nspec:\n  host: prometheus.{{ .Release.Namespace }}.svc.cluster.local\n  trafficPolicy:\n    tls:\n      mode: DISABLE\n{{- end }}      \n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: telemetry-virtual-service\n  namespace: {{ .Release.Namespace }}\nspec:\n  hosts:\n  - \"*\"\n  gateways:\n  - istio-telemetry-gateway\n  http:\n  {{- if .Values.prometheusEnabled }}\n  - match:\n    - port: 15030\n    route:\n    - destination:\n        host: prometheus.{{ .Release.Namespace }}.svc.cluster.local\n        port:\n          number: 9090\n  {{- end }}\n  {{- if .Values.grafanaEnabled }}\n  - match:\n    - port: 15031\n    route:\n    - destination:\n        host: grafana.{{ .Release.Namespace }}.svc.cluster.local\n        port:\n          number: 3000\n  {{- end }}\n---\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/tracing/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: tracing\nversion: 1.0.1\nappVersion: 1.5.1\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/tracing/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"zipkin.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"zipkin.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/tracing/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-tracing\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-tracing\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        app: jaeger\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: jaeger\n          image: \"{{ .Values.jaeger.hub }}/all-in-one:{{ .Values.jaeger.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n            - containerPort: {{ .Values.service.internalPort }}\n            - containerPort: {{ .Values.jaeger.ui.port }}\n            - containerPort: 5775\n              protocol: UDP\n            - containerPort: 6831\n              protocol: UDP\n            - containerPort: 6832\n              protocol: UDP\n          env:\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: COLLECTOR_ZIPKIN_HTTP_PORT\n            value: \"{{ .Values.service.internalPort }}\"\n          - name: MEMORY_MAX_TRACES\n            value: \"{{ .Values.jaeger.memory.max_traces }}\"\n          livenessProbe:\n            httpGet:\n              path: /\n              port: {{ .Values.jaeger.ui.port }}\n          readinessProbe:\n            httpGet:\n              path: /\n              port: {{ .Values.jaeger.ui.port }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/tracing/templates/ingress-jaeger.yaml",
    "content": "{{ if (.Values.jaeger.ingress.enabled) and eq .Values.provider \"jaeger\" }}\n{{- $servicePort := .Values.jaeger.ui.port -}}\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: jaeger-query\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: jaeger\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n  annotations:\n    {{- range $key, $value := .Values.jaeger.ingress.annotations }}\n      {{ $key }}: {{ $value | quote }}\n    {{- end }}\nspec:\n  rules:\n    {{- range $host := .Values.jaeger.ingress.hosts }}\n    - host: {{ $host }}\n      http:\n        paths:\n          - path: /\n            backend:\n              serviceName: jaeger-query\n              servicePort: {{ $servicePort }}\n    {{- end -}}\n  {{- if .Values.jaeger.ingress.tls }}\n  tls:\n{{ toYaml .Values.jaeger.ingress.tls | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/tracing/templates/ingress.yaml",
    "content": "{{- if .Values.ingress.enabled -}}\n{{- $serviceName := \"zipkin\" -}}\n{{- $servicePort := .Values.service.externalPort -}}\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: {{ template \"zipkin.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"zipkin.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n  annotations:\n    {{- range $key, $value := .Values.ingress.annotations }}\n      {{ $key }}: {{ $value | quote }}\n    {{- end }}\nspec:\n  rules:\n    {{- range $host := .Values.ingress.hosts }}\n    - host: {{ $host }}\n      http:\n        paths:\n          - path: /\n            backend:\n              serviceName: {{ $serviceName }}\n              servicePort: {{ $servicePort }}\n    {{- end -}}\n  {{- if .Values.ingress.tls }}\n  tls:\n{{ toYaml .Values.ingress.tls | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/tracing/templates/service-jaeger.yaml",
    "content": "{{ if eq .Values.provider \"jaeger\" }}\n\napiVersion: v1\nkind: List\nitems:\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: jaeger-query\n    namespace: {{ .Release.Namespace }}\n    annotations:\n      {{- range $key, $val := .Values.service.annotations }}\n      {{ $key }}: {{ $val }}\n      {{- end }}\n    labels:\n      app: jaeger\n      jaeger-infra: jaeger-service\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    ports:\n      - name: query-http\n        port: {{ .Values.jaeger.ui.port }}\n        protocol: TCP\n        targetPort: {{ .Values.jaeger.ui.port }}\n    selector:\n      app: jaeger\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: jaeger-collector\n    namespace: {{ .Release.Namespace }}\n    labels:\n      app: jaeger\n      jaeger-infra: collector-service\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    ports:\n    - name: jaeger-collector-tchannel\n      port: 14267\n      protocol: TCP\n      targetPort: 14267\n    - name: jaeger-collector-http\n      port: 14268\n      targetPort: 14268\n      protocol: TCP\n    selector:\n      app: jaeger\n    type: ClusterIP\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: jaeger-agent\n    namespace: {{ .Release.Namespace }}\n    labels:\n      app: jaeger\n      jaeger-infra: agent-service\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    ports:\n    - name: agent-zipkin-thrift\n      port: 5775\n      protocol: UDP\n      targetPort: 5775\n    - name: agent-compact\n      port: 6831\n      protocol: UDP\n      targetPort: 6831\n    - name: agent-binary\n      port: 6832\n      protocol: UDP\n      targetPort: 6832\n    clusterIP: None\n    selector:\n      app: jaeger\n{{ end }}\n\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/charts/tracing/templates/service.yaml",
    "content": "apiVersion: v1\nkind: List\nitems:\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: zipkin\n    namespace: {{ .Release.Namespace }}\n    labels:\n      app: jaeger\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    type: {{ .Values.service.type }}\n    ports:\n      - port: {{ .Values.service.externalPort }}\n        targetPort: {{ .Values.service.internalPort }}\n        protocol: TCP\n        name: {{ .Values.service.name }}\n    selector:\n      app: jaeger\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: tracing\n    namespace: {{ .Release.Namespace }}\n    annotations:\n      {{- range $key, $val := .Values.service.annotations }}\n      {{ $key }}: {{ $val }}\n      {{- end }}\n    labels:\n      app: jaeger\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    ports:\n      - name: http-query\n        port: 80\n        protocol: TCP\n        targetPort: {{ .Values.jaeger.ui.port }}\n    selector:\n      app: jaeger\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/requirements.yaml",
    "content": "dependencies:\n  - name: sidecarInjectorWebhook\n    version: 1.0.1\n    condition: sidecarInjectorWebhook.enabled\n  - name: security\n    version: 1.0.1\n    condition: security.enabled\n  - name: ingress\n    version: 1.0.1\n    condition: ingress.enabled\n  - name: gateways\n    version: 1.0.1\n    condition: gateways.enabled\n  - name: mixer\n    version: 1.0.1\n    condition: mixer.enabled\n  - name: pilot\n    version: 1.0.1\n    condition: pilot.enabled\n  - name: grafana\n    version: 1.0.1\n    condition: grafana.enabled\n  - name: prometheus\n    version: 1.0.1\n    condition: prometheus.enabled\n  - name: servicegraph\n    version: 1.0.1\n    condition: servicegraph.enabled\n  - name: tracing\n    version: 1.0.1\n    condition: tracing.enabled\n  - name: galley\n    version: 1.0.1\n    condition: galley.enabled\n  - name: kiali\n    version: 1.0.1\n    condition: kiali.enabled\n  - name: certmanager\n    version: 1.0.1\n    condition: certmanager.enabled\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/templates/_affinity.tpl",
    "content": "{{/* affinity - https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ */}}\n\n{{- define \"nodeaffinity\" }}\n  nodeAffinity:\n    requiredDuringSchedulingIgnoredDuringExecution:\n    {{- include \"nodeAffinityRequiredDuringScheduling\" . }}\n    preferredDuringSchedulingIgnoredDuringExecution:\n    {{- include \"nodeAffinityPreferredDuringScheduling\" . }}\n{{- end }}\n\n{{- define \"nodeAffinityRequiredDuringScheduling\" }}\n      nodeSelectorTerms:\n      - matchExpressions:\n        - key: beta.kubernetes.io/arch\n          operator: In\n          values:\n        {{- range $key, $val := .Values.global.arch }}\n          {{- if gt ($val | int) 0 }}\n          - {{ $key }}\n          {{- end }}\n        {{- end }}\n{{- end }}\n\n{{- define \"nodeAffinityPreferredDuringScheduling\" }}\n  {{- range $key, $val := .Values.global.arch }}\n    {{- if gt ($val | int) 0 }}\n    - weight: {{ $val | int }}\n      preference:\n        matchExpressions:\n        - key: beta.kubernetes.io/arch\n          operator: In\n          values:\n          - {{ $key }}\n    {{- end }}\n  {{- end }}\n{{- end }}"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"istio.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"istio.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a fully qualified configmap name.\n*/}}\n{{- define \"istio.configmap.fullname\" -}}\n{{- printf \"%s-%s\" .Release.Name \"istio-mesh-config\" | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nConfigmap checksum.\n*/}}\n{{- define \"istio.configmap.checksum\" -}}\n{{- print $.Template.BasePath \"/configmap.yaml\" | sha256sum -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/templates/configmap.yaml",
    "content": "{{- if .Values.pilot.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\ndata:\n  mesh: |-\n    # Set the following variable to true to disable policy checks by the Mixer.\n    # Note that metrics will still be reported to the Mixer.\n    disablePolicyChecks: {{ .Values.global.disablePolicyChecks }}\n\n    # Set enableTracing to false to disable request tracing.\n    enableTracing: {{ .Values.global.enableTracing }}\n\n    # Set accessLogFile to empty string to disable access log.\n    accessLogFile: \"{{ .Values.global.proxy.accessLogFile }}\"\n    #\n    # Deprecated: mixer is using EDS\n    {{- if .Values.mixer.enabled }}\n    {{- if .Values.global.controlPlaneSecurityEnabled }}\n    mixerCheckServer: istio-policy.{{ .Release.Namespace }}.svc.cluster.local:15004\n    mixerReportServer: istio-telemetry.{{ .Release.Namespace }}.svc.cluster.local:15004\n    {{- else }}\n    mixerCheckServer: istio-policy.{{ .Release.Namespace }}.svc.cluster.local:9091\n    mixerReportServer: istio-telemetry.{{ .Release.Namespace }}.svc.cluster.local:9091\n    {{- end }}\n    {{- end }}\n\n    {{- if .Values.ingress.enabled }}\n    # This is the k8s ingress service name, update if you used a different name\n    ingressService: istio-{{ .Values.global.k8sIngressSelector }}\n    {{- end }}\n\n    # Unix Domain Socket through which envoy communicates with NodeAgent SDS to get\n    # key/cert for mTLS. Use secret-mount files instead of SDS if set to empty. \n    sdsUdsPath: \"\"\n    \n    # How frequently should Envoy fetch key/cert from NodeAgent.\n    sdsRefreshDelay: 15s\n\n    #\n    defaultConfig:\n      #\n      # TCP connection timeout between Envoy & the application, and between Envoys.\n      connectTimeout: 10s\n      #\n      ### ADVANCED SETTINGS #############\n      # Where should envoy's configuration be stored in the istio-proxy container\n      configPath: \"/etc/istio/proxy\"\n      binaryPath: \"/usr/local/bin/envoy\"\n      # The pseudo service name used for Envoy.\n      serviceCluster: istio-proxy\n      # These settings that determine how long an old Envoy\n      # process should be kept alive after an occasional reload.\n      drainDuration: 45s\n      parentShutdownDuration: 1m0s\n      #\n      # The mode used to redirect inbound connections to Envoy. This setting\n      # has no effect on outbound traffic: iptables REDIRECT is always used for\n      # outbound connections.\n      # If \"REDIRECT\", use iptables REDIRECT to NAT and redirect to Envoy.\n      # The \"REDIRECT\" mode loses source addresses during redirection.\n      # If \"TPROXY\", use iptables TPROXY to redirect to Envoy.\n      # The \"TPROXY\" mode preserves both the source and destination IP\n      # addresses and ports, so that they can be used for advanced filtering\n      # and manipulation.\n      # The \"TPROXY\" mode also configures the sidecar to run with the\n      # CAP_NET_ADMIN capability, which is required to use TPROXY.\n      #interceptionMode: REDIRECT\n      #\n      # Port where Envoy listens (on local host) for admin commands\n      # You can exec into the istio-proxy container in a pod and\n      # curl the admin port (curl http://localhost:15000/) to obtain\n      # diagnostic information from Envoy. See\n      # https://lyft.github.io/envoy/docs/operations/admin.html\n      # for more details\n      proxyAdminPort: 15000\n      #\n      # Set concurrency to a specific number to control the number of Proxy worker threads.\n      # If set to 0 (default), then start worker thread for each CPU thread/core.\n      concurrency: {{ .Values.global.proxy.concurrency }}\n      #\n      # Zipkin trace collector\n      zipkinAddress: zipkin.{{ .Release.Namespace }}:9411\n\n    {{- if .Values.global.proxy.envoyStatsd.enabled }}\n      #\n      # Statsd metrics collector converts statsd metrics into Prometheus metrics.\n      statsdUdpAddress: {{ .Values.global.proxy.envoyStatsd.host }}.{{ .Release.Namespace }}:{{ .Values.global.proxy.envoyStatsd.port }}\n    {{- end }}\n\n    {{- if .Values.global.controlPlaneSecurityEnabled }}\n      #\n      # Mutual TLS authentication between sidecars and istio control plane.\n      controlPlaneAuthPolicy: MUTUAL_TLS\n      #\n      # Address where istio Pilot service is running\n      discoveryAddress: istio-pilot.{{ .Release.Namespace }}:15005\n    {{- else }}\n      #\n      # Mutual TLS authentication between sidecars and istio control plane.\n      controlPlaneAuthPolicy: NONE\n      #\n      # Address where istio Pilot service is running\n      discoveryAddress: istio-pilot.{{ .Release.Namespace }}:15007\n    {{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/templates/crds.yaml",
    "content": "# {{ if or .Values.global.crds (semverCompare \">=2.10.0-0\" .Capabilities.TillerVersion.SemVer) }}\n# these CRDs only make sense when pilot is enabled\n# {{- if .Values.pilot.enabled }}\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: virtualservices.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: VirtualService\n    listKind: VirtualServiceList\n    plural: virtualservices\n    singular: virtualservice\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: destinationrules.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: DestinationRule\n    listKind: DestinationRuleList\n    plural: destinationrules\n    singular: destinationrule\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: serviceentries.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: ServiceEntry\n    listKind: ServiceEntryList\n    plural: serviceentries\n    singular: serviceentry\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: gateways.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n    \"helm.sh/hook-weight\": \"-5\"\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: Gateway\n    plural: gateways\n    singular: gateway\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3 \n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: envoyfilters.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: EnvoyFilter\n    plural: envoyfilters\n    singular: envoyfilter\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\n# {{- end }}\n\n# these CRDs only make sense when security is enabled\n# {{- if .Values.security.enabled }}\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: policies.authentication.istio.io\nspec:\n  group: authentication.istio.io\n  names:\n    kind: Policy\n    plural: policies\n    singular: policy\n    categories:\n    - istio-io\n    - authentication-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: meshpolicies.authentication.istio.io\nspec:\n  group: authentication.istio.io\n  names:\n    kind: MeshPolicy\n    listKind: MeshPolicyList\n    plural: meshpolicies\n    singular: meshpolicy\n    categories:\n    - istio-io\n    - authentication-istio-io\n  scope: Cluster\n  version: v1alpha1\n---\n# {{- end }}\n\n# {{- if .Values.mixer.enabled }}\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: httpapispecbindings.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: HTTPAPISpecBinding\n    plural: httpapispecbindings\n    singular: httpapispecbinding\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: httpapispecs.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: HTTPAPISpec\n    plural: httpapispecs\n    singular: httpapispec\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: quotaspecbindings.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: QuotaSpecBinding\n    plural: quotaspecbindings\n    singular: quotaspecbinding\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: quotaspecs.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: QuotaSpec\n    plural: quotaspecs\n    singular: quotaspec\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\n# Mixer CRDs\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rules.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: core\nspec:\n  group: config.istio.io\n  names:\n    kind: rule\n    plural: rules\n    singular: rule\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: attributemanifests.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: core\nspec:\n  group: config.istio.io\n  names:\n    kind: attributemanifest\n    plural: attributemanifests\n    singular: attributemanifest\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: bypasses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: bypass\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: bypass\n    plural: bypasses\n    singular: bypass\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: circonuses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: circonus\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: circonus\n    plural: circonuses\n    singular: circonus\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: deniers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: denier\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: denier\n    plural: deniers\n    singular: denier\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: fluentds.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: fluentd\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: fluentd\n    plural: fluentds\n    singular: fluentd\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: kubernetesenvs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: kubernetesenv\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: kubernetesenv\n    plural: kubernetesenvs\n    singular: kubernetesenv\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: listcheckers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: listchecker\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: listchecker\n    plural: listcheckers\n    singular: listchecker\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: memquotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: memquota\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: memquota\n    plural: memquotas\n    singular: memquota\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: noops.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: noop\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: noop\n    plural: noops\n    singular: noop\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: opas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: opa\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: opa\n    plural: opas\n    singular: opa\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: prometheuses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: prometheus\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: prometheus\n    plural: prometheuses\n    singular: prometheus\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rbacs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: rbac\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: rbac\n    plural: rbacs\n    singular: rbac\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: redisquotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    package: redisquota\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: redisquota\n    plural: redisquotas\n    singular: redisquota\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicecontrols.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: servicecontrol\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: servicecontrol\n    plural: servicecontrols\n    singular: servicecontrol\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: signalfxs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: signalfx\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: signalfx\n    plural: signalfxs\n    singular: signalfx\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: solarwindses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: solarwinds\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: solarwinds\n    plural: solarwindses\n    singular: solarwinds\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: stackdrivers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: stackdriver\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: stackdriver\n    plural: stackdrivers\n    singular: stackdriver\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: statsds.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: statsd\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: statsd\n    plural: statsds\n    singular: statsd\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: stdios.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: stdio\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: stdio\n    plural: stdios\n    singular: stdio\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: apikeys.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: apikey\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: apikey\n    plural: apikeys\n    singular: apikey\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: authorizations.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: authorization\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: authorization\n    plural: authorizations\n    singular: authorization\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: checknothings.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: checknothing\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: checknothing\n    plural: checknothings\n    singular: checknothing\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: kuberneteses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: adapter.template.kubernetes\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: kubernetes\n    plural: kuberneteses\n    singular: kubernetes\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: listentries.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: listentry\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: listentry\n    plural: listentries\n    singular: listentry\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: logentries.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: logentry\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: logentry\n    plural: logentries\n    singular: logentry\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: edges.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: edge\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: edge\n    plural: edges\n    singular: edge\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: metrics.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: metric\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: metric\n    plural: metrics\n    singular: metric\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: quotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: quota\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: quota\n    plural: quotas\n    singular: quota\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: reportnothings.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: reportnothing\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: reportnothing\n    plural: reportnothings\n    singular: reportnothing\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicecontrolreports.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: servicecontrolreport\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: servicecontrolreport\n    plural: servicecontrolreports\n    singular: servicecontrolreport\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: tracespans.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: tracespan\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: tracespan\n    plural: tracespans\n    singular: tracespan\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rbacconfigs.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: RbacConfig\n    plural: rbacconfigs\n    singular: rbacconfig\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: serviceroles.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: ServiceRole\n    plural: serviceroles\n    singular: servicerole\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicerolebindings.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: ServiceRoleBinding\n    plural: servicerolebindings\n    singular: servicerolebinding\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: adapters.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: adapter\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: adapter\n    plural: adapters\n    singular: adapter\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: instances.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: instance\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: instance\n    plural: instances\n    singular: instance\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: templates.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: template\n    istio: mixer-template\nspec:\n  group: config.istio.io\n  names:\n    kind: template\n    plural: templates\n    singular: template\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: handlers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: handler\n    istio: mixer-handler\nspec:\n  group: config.istio.io\n  names:\n    kind: handler\n    plural: handlers\n    singular: handler\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n# {{- end }}\n# {{ end }}"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/templates/install-custom-resources.sh.tpl",
    "content": "{{ define \"install-custom-resources.sh.tpl\" }}\n#!/bin/sh\n\nset -x\n\nif [ \"$#\" -ne \"1\" ]; then\n    echo \"first argument should be path to custom resource yaml\"\n    exit 1\nfi\n\npathToResourceYAML=${1}\n\n/kubectl get validatingwebhookconfiguration istio-galley 2>/dev/null\nif [ \"$?\" -eq 0 ]; then\n    echo \"istio-galley validatingwebhookconfiguration found - waiting for istio-galley deployment to be ready\"\n    while true; do\n        /kubectl -n {{ .Release.Namespace }} get deployment istio-galley 2>/dev/null\n        if [ \"$?\" -eq 0 ]; then\n            break\n        fi\n        sleep 1\n    done\n    /kubectl -n {{ .Release.Namespace }} rollout status deployment istio-galley\n    if [ \"$?\" -ne 0 ]; then\n        echo \"istio-galley deployment rollout status check failed\"\n        exit 1\n    fi\n    echo \"istio-galley deployment ready for configuration validation\"\nfi\nsleep 5\n/kubectl apply -f ${pathToResourceYAML}\n{{ end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/templates/sidecar-injector-configmap.yaml",
    "content": "{{- if not .Values.global.omitSidecarInjectorConfigMap }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-sidecar-injector\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: sidecar-injector\ndata:\n  config: |-\n    policy: {{ .Values.global.proxy.autoInject }}\n    template: |-\n      initContainers:\n      - name: istio-init\n{{- if contains \"/\" .Values.global.proxy_init.image }}\n        image: \"{{ .Values.global.proxy_init.image }}\"\n{{- else }}\n        image: \"{{ .Values.global.hub }}/{{ .Values.global.proxy_init.image }}:{{ .Values.global.tag }}\"\n{{- end }}\n        args:\n        - \"-p\"\n        - {{ \"[[ .MeshConfig.ProxyListenPort ]]\" }}\n        - \"-u\"\n        - 1337\n        - \"-m\"\n        - {{ \"[[ or (index .ObjectMeta.Annotations \\\"sidecar.istio.io/interceptionMode\\\") .ProxyConfig.InterceptionMode.String ]]\" }}\n        - \"-i\"\n        {{ \"[[ if (isset .ObjectMeta.Annotations \\\"traffic.sidecar.istio.io/includeOutboundIPRanges\\\") -]]\" }}\n        {{ \"- \\\"[[ index .ObjectMeta.Annotations \\\"traffic.sidecar.istio.io/includeOutboundIPRanges\\\"  ]]\\\"\" }}\n        {{ \"[[ else -]]\" }}\n        - \"{{ .Values.global.proxy.includeIPRanges }}\"\n        {{ \"[[ end -]]\" }}\n        - \"-x\"\n        {{ \"[[ if (isset .ObjectMeta.Annotations \\\"traffic.sidecar.istio.io/excludeOutboundIPRanges\\\") -]]\" }}\n        {{ \"- \\\"[[ index .ObjectMeta.Annotations \\\"traffic.sidecar.istio.io/excludeOutboundIPRanges\\\"  ]]\\\"\" }}\n        {{ \"[[ else -]]\" }}\n        - \"{{ .Values.global.proxy.excludeIPRanges }}\"\n        {{ \"[[ end -]]\" }}\n        - \"-b\"\n        {{ \"[[ if (isset .ObjectMeta.Annotations \\\"traffic.sidecar.istio.io/includeInboundPorts\\\") -]]\" }}\n        {{ \"- \\\"[[ index .ObjectMeta.Annotations \\\"traffic.sidecar.istio.io/includeInboundPorts\\\"  ]]\\\"\" }}\n        {{ \"[[ else -]]\" }}\n        - {{ \"[[ range .Spec.Containers -]][[ range .Ports -]][[ .ContainerPort -]], [[ end -]][[ end -]][[ end]]\" }}\n        - \"-d\"\n        {{ \"[[ if (isset .ObjectMeta.Annotations \\\"traffic.sidecar.istio.io/excludeInboundPorts\\\") -]]\" }}\n        {{ \"- \\\"[[ index .ObjectMeta.Annotations \\\"traffic.sidecar.istio.io/excludeInboundPorts\\\" ]]\\\"\" }}\n        {{ \"[[ else -]]\" }}\n        - \"{{ .Values.global.proxy.excludeInboundPorts }}\"\n        {{ \"[[ end -]]\" }}\n        imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n        securityContext:\n          capabilities:\n            add:\n            - NET_ADMIN\n          {{ if .Values.global.proxy.privileged }}\n          privileged: true\n          {{ end -}}\n        restartPolicy: Always\n      {{ if eq .Values.global.proxy.enableCoreDump true }}\n      - name: enable-core-dump\n        args:\n        - -c\n        - sysctl -w kernel.core_pattern=/etc/istio/proxy/core.%e.%p.%t && ulimit -c unlimited\n        command:\n          - /bin/sh\n        image: {{ .Values.global.hub }}/proxy_init:{{ .Values.global.tag }}\n        imagePullPolicy: IfNotPresent\n        resources: {}\n        securityContext:\n          privileged: true\n      {{ end }}\n      containers:\n      - name: istio-proxy\n        image: {{ \"[[ if (isset .ObjectMeta.Annotations \\\"sidecar.istio.io/proxyImage\\\") -]]\" }}\n        {{ \"\\\"[[ index .ObjectMeta.Annotations \\\"sidecar.istio.io/proxyImage\\\" ]]\\\"\" }}\n        {{ \"[[ else -]]\" }}\n        {{ .Values.global.hub }}/{{ .Values.global.proxy.image }}:{{ .Values.global.tag }}\n        {{ \"[[ end -]]\" }}\n        args:\n        - proxy\n        - sidecar\n        - --configPath\n        - {{ \"[[ .ProxyConfig.ConfigPath ]]\" }}\n        - --binaryPath\n        - {{ \"[[ .ProxyConfig.BinaryPath ]]\" }}\n        - --serviceCluster\n        {{ \"[[ if ne \\\"\\\" (index .ObjectMeta.Labels \\\"app\\\") -]]\" }}\n        - {{ \"[[ index .ObjectMeta.Labels \\\"app\\\" ]]\" }}\n        {{ \"[[ else -]]\" }}\n        - \"istio-proxy\"\n        {{ \"[[ end -]]\" }}\n        - --drainDuration\n        - {{ \"[[ formatDuration .ProxyConfig.DrainDuration ]]\" }}\n        - --parentShutdownDuration\n        - {{ \"[[ formatDuration .ProxyConfig.ParentShutdownDuration ]]\" }}\n        - --discoveryAddress\n        - {{ \"[[ .ProxyConfig.DiscoveryAddress ]]\" }}\n        - --discoveryRefreshDelay\n        - {{ \"[[ formatDuration .ProxyConfig.DiscoveryRefreshDelay ]]\" }}\n        - --zipkinAddress\n        - {{ \"[[ .ProxyConfig.ZipkinAddress ]]\" }}\n        - --connectTimeout\n        - {{ \"[[ formatDuration .ProxyConfig.ConnectTimeout ]]\" }}\n      {{- if .Values.global.proxy.envoyStatsd.enabled }}\n        - --statsdUdpAddress\n        - {{ \"[[ .ProxyConfig.StatsdUdpAddress ]]\" }}\n      {{- end }}\n        - --proxyAdminPort\n        - {{ \"[[ .ProxyConfig.ProxyAdminPort ]]\" }}\n        {{ \"[[ if gt .ProxyConfig.Concurrency 0 -]]\" }}\n        - --concurrency\n        - {{ \"[[ .ProxyConfig.Concurrency ]]\" }}\n        {{ \"[[ end -]]\" }}\n        - --controlPlaneAuthPolicy\n        - {{ \"[[ or (index .ObjectMeta.Annotations \\\"sidecar.istio.io/controlPlaneAuthPolicy\\\") .ProxyConfig.ControlPlaneAuthPolicy ]]\" }}\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n        - name: INSTANCE_IP\n          valueFrom:\n            fieldRef:\n              fieldPath: status.podIP\n        - name: ISTIO_META_POD_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.name\n        - name: ISTIO_META_INTERCEPTION_MODE\n          value: {{ \"[[ or (index .ObjectMeta.Annotations \\\"sidecar.istio.io/interceptionMode\\\") .ProxyConfig.InterceptionMode.String ]]\" }}\n        imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n        securityContext:\n          {{ if .Values.global.proxy.privileged }}\n          privileged: true\n          {{ end -}}\n          readOnlyRootFilesystem: true\n          {{ \"[[ if eq (or (index .ObjectMeta.Annotations \\\"sidecar.istio.io/interceptionMode\\\") .ProxyConfig.InterceptionMode.String) \\\"TPROXY\\\" -]]\" }}\n          capabilities:\n            add:\n            - NET_ADMIN\n          runAsGroup: 1337\n          {{ \"[[ else -]]\" }}\n          runAsUser: 1337\n          {{ \"[[ end -]]\" }}\n        restartPolicy: Always\n        resources:\n          {{ \"[[ if (isset .ObjectMeta.Annotations \\\"sidecar.istio.io/proxyCPU\\\") -]]\" }}\n          requests:\n            cpu: {{ \"\\\"[[ index .ObjectMeta.Annotations \\\"sidecar.istio.io/proxyCPU\\\" ]]\\\"\" }}\n            memory: {{ \"\\\"[[ index .ObjectMeta.Annotations \\\"sidecar.istio.io/proxyMemory\\\" ]]\\\"\" }}\n        {{ \"[[ else -]]\" }}\n{{- if .Values.global.proxy.resources }}\n{{ toYaml .Values.global.proxy.resources | indent 10 }}\n{{- end }}\n        {{ \"[[ end -]]\" }}\n        volumeMounts:\n        - mountPath: /etc/istio/proxy\n          name: istio-envoy\n        - mountPath: /etc/certs/\n          name: istio-certs\n          readOnly: true\n      volumes:\n      - emptyDir:\n          medium: Memory\n        name: istio-envoy\n      - name: istio-certs\n        secret:\n          optional: true\n          {{ \"[[ if eq .Spec.ServiceAccountName \\\"\\\" -]]\" }}\n          secretName: istio.default\n          {{ \"[[ else -]]\" }}\n          secretName: {{ \"[[ printf \\\"istio.%s\\\" .Spec.ServiceAccountName ]]\"  }}\n          {{ \"[[ end -]]\" }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-auth-galley.yaml",
    "content": "# This is used to generate istio.yaml\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nistiotesting:\n  oneNameSpace: false\n\nprometheus:\n  enabled: true\n\ngalley:\n  enabled: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-auth-multicluster.yaml",
    "content": "# This is used to generate istio-auth-multicluster.yaml, used for CI/CD.\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\n# In a multiple cluster environment, citadel uses the same root certificate in all the clusters\nsecurity:\n  selfSigned: false\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-auth.yaml",
    "content": "# This is used to generate istio-auth.yaml for automated CI/CD test, using v1/alpha1\n# or v2/alpha3 with 'gradual migration' (using env variable at inject time).\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-demo-auth.yaml",
    "content": "# This is used to generate istio-auth.yaml for minimal, demo mode with MTLS enabled.\n# It is shipped with the release, used for bookinfo or quick installation of istio.\n# Includes components used in the demo, defaults to alpha3 rules.\nglobal:\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\ningress:\n  # Ingress is used for migration, for alpha3 we expect ingressgateway\n  enabled: false\n\nprometheus:\n  enabled: true\n\nsidecarInjectorWebhook:\n  enabled: true\n  enableNamespacesByDefault: false\n\ngrafana:\n  enabled: true\n\ntracing:\n  enabled: true\n\nservicegraph:\n  enabled: true\n\ngalley:\n  enabled: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-demo.yaml",
    "content": "# This is used to generate istio.yaml for minimal, demo mode.\n# It is shipped with the release, used for bookinfo or quick installation of istio.\n# Includes components used in the demo, defaults to alpha3 rules.\n\n# If running in minikube you may add:\n# --set global.nodePort=true\n# --set ingressgateway.service.type=NodePort\nglobal:\n  nodePort: false\n\ningress:\n  # Ingress is used for migration, for alpha3 we expect ingressgateway\n  enabled: false\n\nprometheus:\n  enabled: true\n\nsidecarInjectorWebhook:\n  enabled: true\n  enableNamespacesByDefault: false\n\ngrafana:\n  enabled: true\n\ntracing:\n  enabled: true\n\nservicegraph:\n  enabled: true\n\ngalley:\n  enabled: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-galley.yaml",
    "content": "# This is used to generate istio.yaml\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: false\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: false\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nistiotesting:\n  oneNameSpace: false\n\nprometheus:\n  enabled: true\n\ngalley:\n  enabled: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-gateways.yaml",
    "content": "# Common settings.\nglobal:\n  # Include the crd definition when generating the template.\n  # For 'helm template' and helm install > 2.10 it should be true.\n  # For helm < 2.9, crds must be installed ahead of time with\n  # 'kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml\n  # and this options must be set off.\n  crds: false\n\n  # Omit the istio-sidecar-injector configmap when generate a\n  # standalone gateway. Gateways may be created in namespaces other\n  # than `istio-system` and we don't want to re-create the injector\n  # configmap in those.\n  omitSidecarInjectorConfigMap: true\n\n  # Istio control plane namespace: This specifies where the Istio control\n  # plane was installed earlier.  Modify this if you installed the control\n  # plane in a different namespace than istio-system.\n  istioNamespace: istio-system\n\n  proxy:\n    # Sets the destination Statsd in envoy (the value of the \"--statsdUdpAddress\" proxy argument\n    # would be <host>:<port>).\n    # Can also be disabled (e.g. when Mixer is not installed).\n    envoyStatsd:\n      enabled: true\n      host: istio-statsd-prom-bridge.istio-system\n      port: 9125\n\n#\n# Gateways Configuration\n# By default (if enabled) a pair of Ingress and Egress Gateways will be created for the mesh.\n# You can add more gateways in addition to the defaults but make sure those are uniquely named\n# and that NodePorts are not conflicting.\n# Disable specifc gateway by setting the `enabled` to false.\n#\ngateways:\n  enabled: true\n\n  custom-gateway:\n    enabled: true\n    labels:\n      app: custom-gateway\n    replicaCount: 1\n    autoscaleMin: 1\n    autoscaleMax: 5\n    resources: {}\n      # limits:\n      #  cpu: 100m\n      #  memory: 128Mi\n      #requests:\n      #  cpu: 1800m\n      #  memory: 256Mi\n\n    loadBalancerIP: \"\"\n    serviceAnnotations: {}\n    type: LoadBalancer #change to NodePort, ClusterIP or LoadBalancer if need be\n\n    ports:\n      ## You can add custom gateway ports\n    - port: 80\n      targetPort: 80\n      name: http2\n      # nodePort: 31380\n    - port: 443\n      name: https\n      # nodePort: 31390\n    - port: 31400\n      name: tcp\n      # nodePort: 31400\n    # Pilot and Citadel MTLS ports are enabled in gateway - but will only redirect\n    # to pilot/citadel if global.meshExpansion settings are enabled.\n    - port: 15011\n      targetPort: 15011\n      name: tcp-pilot-grpc-tls\n    - port: 8060\n      targetPort: 8060\n      name: tcp-citadel-grpc-tls\n    # Telemetry-related ports are enabled in gateway - but will only redirect if\n    # the gateway configration for the various components are enabled.\n    - port: 15030\n      targetPort: 15030\n      name: http2-prometheus\n    - port: 15031\n      targetPort: 15031\n      name: http2-grafana\n    secretVolumes:\n    - name: customgateway-certs\n      secretName: istio-customgateway-certs\n      mountPath: /etc/istio/customgateway-certs\n    - name: customgateway-ca-certs\n      secretName: istio-customgateway-ca-certs\n      mountPath: /etc/istio/customgateway-ca-certs\n\n# all other components are disabled except the gateways\ningress:\n  enabled: false\n\nsecurity:\n  enabled: false\n\nsidecarInjectorWebhook:\n  enabled: false\n\ngalley:\n  enabled: false\n\nmixer:\n  enabled: false\n\npilot:\n  enabled: false\n\ngrafana:\n  enabled: false\n\nprometheus:\n  enabled: false\n\nservicegraph:\n  enabled: false\n\ntracing:\n  enabled: false\n\nkiali:\n  enabled: false\n\ncertmanager:\n  enabled: false\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-multicluster.yaml",
    "content": "# This is used to generate istio-multicluster.yaml, used for CI/CD.\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: false\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: false\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nprometheus:\n  enabled: true\n\n# In a multiple cluster environment, citadel uses the same root certificate in all the clusters\nsecurity:\n  selfSigned: false\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-one-namespace-auth.yaml",
    "content": "# This is used to generate istio.yaml used for deprecated CI/CD testing.\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nistiotesting:\n  oneNameSpace: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio-one-namespace.yaml",
    "content": "# This is used to generate istio.yaml used for deprecated CI/CD testing.\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: false\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: false\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nistiotesting:\n  oneNameSpace: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values-istio.yaml",
    "content": "# This is used to generate istio.yaml for automated CI/CD test, using v1/alpha1\n# or v2/alpha3 with 'gradual migration' (using env variable at inject time).\nglobal:\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.2/values.yaml",
    "content": "# Common settings.\nglobal:\n  # Default hub for Istio images.\n  # Releases are published to docker hub under 'istio' project.\n  # Daily builds from prow are on gcr.io, and nightly builds from circle on docker.io/istionightly\n  hub: docker.io/istio\n\n  # Default tag for Istio images.\n  tag: 1.0.2\n\n  # Gateway used for legacy k8s Ingress resources. By default it is\n  # using 'istio:ingress', to match 0.8 config. It requires that\n  # ingress.enabled is set to true. You can also set it\n  # to ingressgateway, or any other gateway you define in the 'gateway'\n  # section.\n  k8sIngressSelector: ingress\n\n  # k8sIngressHttps will add port 443 on the ingress and ingressgateway.\n  # It REQUIRES that the certificates are installed  in the\n  # expected secrets - enabling this option without certificates\n  # will result in LDS rejection and the ingress will not work.\n  k8sIngressHttps: false\n\n  proxy:\n    image: proxyv2\n\n    # Resources for the sidecar.\n    resources:\n      requests:\n        cpu: 10m\n      #  memory: 128Mi\n      # limits:\n      #   cpu: 100m\n      #   memory: 128Mi\n\n    # Controls number of Proxy worker threads.\n    # If set to 0 (default), then start worker thread for each CPU thread/core.\n    concurrency: 0\n\n    # Configures the access log for each sidecar. Setting it to an empty string will\n    # disable access log for sidecar.\n    accessLogFile: \"/dev/stdout\"\n\n    #If set to true, istio-proxy container will have privileged securityContext\n    privileged: false\n\n    # If set, newly injected sidecars will have core dumps enabled.\n    enableCoreDump: false\n\n    # istio egress capture whitelist\n    # https://istio.io/docs/tasks/traffic-management/egress.html#calling-external-services-directly\n    # example: includeIPRanges: \"172.30.0.0/16,172.20.0.0/16\"\n    # would only capture egress traffic on those two IP Ranges, all other outbound traffic would\n    # be allowed by the sidecar\n    includeIPRanges: \"*\"\n    excludeIPRanges: \"\"\n\n    # istio ingress capture whitelist\n    # examples:\n    #     Redirect no inbound traffic to Envoy:    --includeInboundPorts=\"\"\n    #     Redirect all inbound traffic to Envoy:   --includeInboundPorts=\"*\"\n    #     Redirect only selected ports:            --includeInboundPorts=\"80,8080\"\n    includeInboundPorts: \"*\"\n    excludeInboundPorts: \"\"\n\n    # This controls the 'policy' in the sidecar injector.\n    autoInject: enabled\n\n    # Sets the destination Statsd in envoy (the value of the \"--statsdUdpAddress\" proxy argument\n    # would be <host>:<port>).\n    # Can also be disabled (e.g. when Mixer is not installed).\n    envoyStatsd:\n      enabled: true\n      host: istio-statsd-prom-bridge\n      port: 9125\n\n  proxy_init:\n    # Base name for the proxy_init container, used to configure iptables.\n    image: proxy_init\n\n  # imagePullPolicy is applied to istio control plane components.\n  # local tests require IfNotPresent, to avoid uploading to dockerhub.\n  # TODO: Switch to Always as default, and override in the local tests.\n  imagePullPolicy: IfNotPresent\n\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: false\n\n  # disablePolicyChecks disables mixer policy checks.\n  # Will set the value with same name in istio config map - pilot needs to be restarted to take effect.\n  disablePolicyChecks: false\n\n  # EnableTracing sets the value with same name in istio config map, requires pilot restart to take effect.\n  enableTracing: true\n\n  # Default mtls policy. If true, mtls between services will be enabled by default.\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: false\n\n  # ImagePullSecrets for all ServiceAccount, list of secrets in the same namespace\n  # to use for pulling any images in pods that reference this ServiceAccount.\n  # Must be set for any clustser configured with privte docker registry.\n  imagePullSecrets:\n    # - private-registry-key\n\n  # Specify pod scheduling arch(amd64, ppc64le, s390x) and weight as follows:\n  #   0 - Never scheduled\n  #   1 - Least preferred\n  #   2 - No preference\n  #   3 - Most preferred\n  arch:\n    amd64: 2\n    s390x: 2\n    ppc64le: 2\n\n  # Whether to restrict the applications namespace the controller manages;\n  # If not set, controller watches all namespaces\n  oneNamespace: false\n\n  # Whether to perform server-side validation of configuration.\n  configValidation: true\n\n  # If set to true, the pilot and citadel mtls will be exposed on the\n  # ingress gateway\n  meshExpansion: false\n\n  # If set to true, the pilot and citadel mtls and the plain text pilot ports\n  # will be exposed on an internal gateway\n  meshExpansionILB: false\n\n  # A minimal set of requested resources to applied to all deployments so that\n  # Horizontal Pod Autoscaler will be able to function (if set).\n  # Each component can overwrite these default values by adding its own resources\n  # block in the relevant section below and setting the desired resources values.\n  defaultResources:\n    requests:\n      cpu: 10m\n    #   memory: 128Mi\n    # limits:\n    #   cpu: 100m\n    #   memory: 128Mi\n\n  # Not recommended for user to configure this. Hyperkube image to use when creating custom resources\n  hyperkube:\n    hub: quay.io/coreos\n    tag: v1.7.6_coreos.0\n\n  # Kubernetes >=v1.11.0 will create two PriorityClass, including system-cluster-critical and\n  # system-node-critical, it is better to configure this in order to make sure your Istio pods\n  # will not be killed because of low prioroty class.\n  # Refer to https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\n  # for more detail.\n  priorityClassName: \"\"\n\n  # Include the crd definition when generating the template.\n  # For 'helm template' and helm install > 2.10 it should be true.\n  # For helm < 2.9, crds must be installed ahead of time with\n  # 'kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml\n  # and this options must be set off.\n  crds: true\n\n#\n# ingress configuration\n#\ningress:\n  enabled: false\n  replicaCount: 1\n  autoscaleMin: 1\n  autoscaleMax: 5\n  service:\n    annotations: {}\n    loadBalancerIP: \"\"\n    type: LoadBalancer #change to NodePort, ClusterIP or LoadBalancer if need be\n    ports:\n    - port: 80\n      name: http\n      nodePort: 32000\n    - port: 443\n      name: https\n    selector:\n      istio: ingress\n\n#\n# Gateways Configuration\n# By default (if enabled) a pair of Ingress and Egress Gateways will be created for the mesh.\n# You can add more gateways in addition to the defaults but make sure those are uniquely named\n# and that NodePorts are not conflicting.\n# Disable specifc gateway by setting the `enabled` to false.\n#\ngateways:\n  enabled: true\n\n  istio-ingressgateway:\n    enabled: true\n    labels:\n      app: istio-ingressgateway\n      istio: ingressgateway\n    replicaCount: 1\n    autoscaleMin: 1\n    autoscaleMax: 5\n    resources: {}\n      # limits:\n      #  cpu: 100m\n      #  memory: 128Mi\n      #requests:\n      #  cpu: 1800m\n      #  memory: 256Mi\n    cpu:\n      targetAverageUtilization: 80\n    loadBalancerIP: \"\"\n    serviceAnnotations: {}\n    type: LoadBalancer #change to NodePort, ClusterIP or LoadBalancer if need be\n\n    ports:\n      ## You can add custom gateway ports\n    - port: 80\n      targetPort: 80\n      name: http2\n      nodePort: 31380\n    - port: 443\n      name: https\n      nodePort: 31390\n    - port: 31400\n      name: tcp\n      nodePort: 31400\n    # Pilot and Citadel MTLS ports are enabled in gateway - but will only redirect\n    # to pilot/citadel if global.meshExpansion settings are enabled.\n    - port: 15011\n      targetPort: 15011\n      name: tcp-pilot-grpc-tls\n    - port: 8060\n      targetPort: 8060\n      name: tcp-citadel-grpc-tls\n    - port: 853\n      targetPort: 853\n      name: tcp-dns-tls\n    - port: 15030\n      targetPort: 15030\n      name: http2-prometheus\n    - port: 15031\n      targetPort: 15031\n      name: http2-grafana\n    secretVolumes:\n    - name: ingressgateway-certs\n      secretName: istio-ingressgateway-certs\n      mountPath: /etc/istio/ingressgateway-certs\n    - name: ingressgateway-ca-certs\n      secretName: istio-ingressgateway-ca-certs\n      mountPath: /etc/istio/ingressgateway-ca-certs\n\n  istio-egressgateway:\n    enabled: true\n    labels:\n      app: istio-egressgateway\n      istio: egressgateway\n    replicaCount: 1\n    autoscaleMin: 1\n    autoscaleMax: 5\n    cpu:\n      targetAverageUtilization: 80\n    serviceAnnotations: {}\n    type: ClusterIP #change to NodePort or LoadBalancer if need be\n    ports:\n      - port: 80\n        name: http2\n      - port: 443\n        name: https\n    secretVolumes:\n      - name: egressgateway-certs\n        secretName: istio-egressgateway-certs\n        mountPath: /etc/istio/egressgateway-certs\n      - name: egressgateway-ca-certs\n        secretName: istio-egressgateway-ca-certs\n        mountPath: /etc/istio/egressgateway-ca-certs\n\n  # Mesh ILB gateway creates a gateway of type InternalLoadBalancer,\n  # for mesh expansion. It exposes the mtls ports for Pilot,CA as well\n  # as non-mtls ports to support upgrades and gradual transition.\n  istio-ilbgateway:\n    enabled: false\n    labels:\n      app: istio-ilbgateway\n      istio: ilbgateway\n    replicaCount: 1\n    autoscaleMin: 1\n    autoscaleMax: 5\n    resources:\n      requests:\n        cpu: 800m\n        memory: 512Mi\n      #limits:\n      #  cpu: 1800m\n      #  memory: 256Mi\n    cpu:\n      targetAverageUtilization: 80      \n    loadBalancerIP: \"\"\n    serviceAnnotations:\n      cloud.google.com/load-balancer-type: \"internal\"\n    type: LoadBalancer\n    ports:\n    ## You can add custom gateway ports - google ILB default quota is 5 ports,\n    - port: 15011\n      name: grpc-pilot-mtls\n    # Insecure port - only for migration from 0.8. Will be removed in 1.1\n    - port: 15010\n      name: grpc-pilot\n    - port: 8060\n      targetPort: 8060\n      name: tcp-citadel-grpc-tls\n    # Port 853 is reserved for the kube-dns gateway\n    - port: 853\n      name: tcp-dns\n    secretVolumes:\n    - name: ilbgateway-certs\n      secretName: istio-ilbgateway-certs\n      mountPath: /etc/istio/ilbgateway-certs\n    - name: ilbgateway-ca-certs\n      secretName: istio-ilbgateway-ca-certs\n      mountPath: /etc/istio/ilbgateway-ca-certs\n\n#\n# sidecar-injector webhook configuration\n#\nsidecarInjectorWebhook:\n  enabled: true\n  replicaCount: 1\n  image: sidecar_injector\n  enableNamespacesByDefault: false\n\n#\n# galley configuration\n#\ngalley:\n  enabled: true\n  replicaCount: 1\n  image: galley\n\n#\n# mixer configuration\n#\nmixer:\n  enabled: true\n  replicaCount: 1\n  autoscaleMin: 1\n  autoscaleMax: 5\n  image: mixer\n\n  istio-policy:\n    autoscaleEnabled: true\n    autoscaleMin: 1\n    autoscaleMax: 5\n    cpu:\n      targetAverageUtilization: 80\n\n  istio-telemetry:\n    autoscaleEnabled: true\n    autoscaleMin: 1\n    autoscaleMax: 5\n    cpu:\n      targetAverageUtilization: 80\n\n  prometheusStatsdExporter:\n    hub: docker.io/prom\n    tag: v0.6.0\n\n#\n# pilot configuration\n#\npilot:\n  enabled: true\n  replicaCount: 1\n  autoscaleMin: 1\n  autoscaleMax: 5\n  image: pilot\n  sidecar: true\n  traceSampling: 100.0\n  # Resources for a small pilot install\n  resources:\n    requests:\n      cpu: 500m\n      memory: 2048Mi\n  env:\n    PILOT_PUSH_THROTTLE_COUNT: 100\n    GODEBUG: gctrace=2\n  cpu:\n    targetAverageUtilization: 80\n\n#\n# security configuration\n#\nsecurity:\n  replicaCount: 1\n  image: citadel\n  selfSigned: true # indicate if self-signed CA is used.\n\n#\n# addons configuration\n#\ntelemetry-gateway:\n  gatewayName: ingressgateway\n  grafanaEnabled: false\n  prometheusEnabled: false\n\ngrafana:\n  enabled: false\n  replicaCount: 1\n  image: grafana\n  persist: false\n  storageClassName: \"\"\n  security:\n    enabled: false\n    adminUser: admin\n    adminPassword: admin\n  service:\n    annotations: {}\n    name: http\n    type: ClusterIP\n    externalPort: 3000\n    internalPort: 3000\n\nprometheus:\n  enabled: true\n  replicaCount: 1\n  hub: docker.io/prom\n  tag: v2.3.1\n\n  service:\n    annotations: {}\n    nodePort:\n      enabled: false\n      port: 32090\n\nservicegraph:\n  enabled: false\n  replicaCount: 1\n  image: servicegraph\n  service:\n    annotations: {}\n    name: http\n    type: ClusterIP\n    externalPort: 8088\n    internalPort: 8088\n  ingress:\n    enabled: false\n    # Used to create an Ingress record.\n    hosts:\n      - servicegraph.local\n    annotations:\n      # kubernetes.io/ingress.class: nginx\n      # kubernetes.io/tls-acme: \"true\"\n    tls:\n      # Secrets must be manually created in the namespace.\n      # - secretName: servicegraph-tls\n      #   hosts:\n      #     - servicegraph.local\n  # prometheus addres\n  prometheusAddr: http://prometheus:9090\n\ntracing:\n  enabled: false\n  provider: jaeger\n  jaeger:\n    hub: docker.io/jaegertracing\n    tag: 1.5\n    memory:\n      max_traces: 50000\n    ui:\n      port: 16686\n    ingress:\n      enabled: false\n      # Used to create an Ingress record.\n      hosts:\n        - jaeger.local\n      annotations:\n        # kubernetes.io/ingress.class: nginx\n        # kubernetes.io/tls-acme: \"true\"\n      tls:\n        # Secrets must be manually created in the namespace.\n        # - secretName: jaeger-tls\n        #   hosts:\n        #     - jaeger.local\n  replicaCount: 1\n  service:\n    annotations: {}\n    name: http\n    type: ClusterIP\n    externalPort: 9411\n    internalPort: 9411\n  ingress:\n    enabled: false\n    # Used to create an Ingress record.\n    hosts:\n      - tracing.local\n    annotations:\n      # kubernetes.io/ingress.class: nginx\n      # kubernetes.io/tls-acme: \"true\"\n    tls:\n      # Secrets must be manually created in the namespace.\n      # - secretName: tracing-tls\n      #   hosts:\n      #     - tracing.local\n\nkiali:\n  enabled: false\n  replicaCount: 1\n  hub: docker.io/kiali\n  tag: istio-release-1.0\n  ingress:\n    enabled: false\n    ## Used to create an Ingress record.\n    # hosts:\n    #  - kiali.local\n    annotations:\n      # kubernetes.io/ingress.class: nginx\n      # kubernetes.io/tls-acme: \"true\"\n    tls:\n      # Secrets must be manually created in the namespace.\n      # - secretName: kiali-tls\n      #   hosts:\n      #     - kiali.local\n  dashboard:\n    username: admin\n    # Default admin passphrase for kiali. Must be set during setup, and\n    # changed by overriding the secret\n    passphrase: admin\n\n    # Override the automatically detected Grafana URL, usefull when Grafana service has no ExternalIPs\n    # grafanaURL:\n\n    # Override the automatically detected Jaeger URL, usefull when Jaeger service has no ExternalIPs\n    # jaegerURL:\n\n# Certmanager uses ACME to sign certificates. Since Istio gateways are\n# mounting the TLS secrets the Certificate CRDs must be created in the\n# istio-system namespace. Once the certificate has been created, the\n# gateway must be updated by adding 'secretVolumes'. After the gateway\n# restart, DestinationRules can be created using the ACME-signed certificates.\ncertmanager:\n  enabled: false\n  hub: quay.io/jetstack\n  tag: v0.3.1\n  resources: {}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/Chart.yaml",
    "content": "apiVersion: v1\nname: istio\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2-0\"\ndescription: Helm chart for all istio components\nkeywords:\n  - istio\n  - security\n  - sidecarInjectorWebhook\n  - mixer\n  - pilot\n  - galley\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/README.md",
    "content": "# Istio\n\n[Istio](https://istio.io/) is an open platform for providing a uniform way to integrate microservices, manage traffic flow across microservices, enforce policies and aggregate telemetry data.\n\n## Introduction\n\nThis chart bootstraps all istio [components](https://istio.io/docs/concepts/what-is-istio/overview.html) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.\n\n## Chart Details\n\nThis chart can install multiple istio components as subcharts:\n- ingress\n- ingressgateway\n- egressgateway\n- sidecarInjectorWebhook\n- galley\n- mixer\n- pilot\n- security(citadel)\n- grafana\n- prometheus\n- servicegraph\n- tracing(jaeger)\n- kiali\n\nTo enable or disable each component, change the corresponding `enabled` flag.\n\n## Prerequisites\n\n- Kubernetes 1.9 or newer cluster with RBAC (Role-Based Access Control) enabled is required\n- Helm 2.7.2 or newer or alternately the ability to modify RBAC rules is also required\n- If you want to enable automatic sidecar injection, Kubernetes 1.9+ with `admissionregistration` API is required, and `kube-apiserver` process must have the `admission-control` flag set with the `MutatingAdmissionWebhook` and `ValidatingAdmissionWebhook` admission controllers added and listed in the correct order.\n\n## Resources Required\n\nThe chart deploys pods that consume minimum resources as specified in the resources configuration parameter.\n\n## Installing the Chart\n\n1. If a service account has not already been installed for Tiller, install one:\n```\n$ kubectl apply -f install/kubernetes/helm/helm-service-account.yaml\n```\n\n2. Install Tiller on your cluster with the service account:\n```\n$ helm init --service-account tiller\n```\n\n3. Install Istio’s [Custom Resource Definitions](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions) via `kubectl apply`, and wait a few seconds for the CRDs to be committed in the kube-apiserver:\n   ```\n   $ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml\n   ```\n   **Note**: If you are enabling `certmanager`, you also need to install its CRDs and wait a few seconds for the CRDs to be committed in the kube-apiserver:\n   ```\n   $ kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml\n   ```\n\n4. To install the chart with the release name `istio` in namespace `istio-system`:\n    - With [automatic sidecar injection](https://istio.io/docs/setup/kubernetes/sidecar-injection/#automatic-sidecar-injection) (requires Kubernetes >=1.9.0):\n    ```\n    $ helm install install/kubernetes/helm/istio --name istio --namespace istio-system\n    ```\n\n    - Without the sidecar injection webhook:\n    ```\n    $ helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set sidecarInjectorWebhook.enabled=false\n    ```\n\n## Configuration\n\nThe Helm chart ships with reasonable defaults.  There may be circumstances in which defaults require overrides.\nTo override Helm values, use `--set key=value` argument during the `helm install` command.  Multiple `--set` operations may be used in the same Helm operation.\n\nHelm charts expose configuration options which are currently in alpha.  The currently exposed options are explained in the following table:\n\n| Parameter | Description | Values | Default |\n| --- | --- | --- | --- |\n| `global.hub` | Specifies the HUB for most images used by Istio | registry/namespace | `docker.io/istio` |\n| `global.tag` | Specifies the TAG for most images used by Istio | valid image tag | `0.8.latest` |\n| `global.proxy.image` | Specifies the proxy image name | valid proxy name | `proxyv2` |\n| `global.proxy.concurrency` | Specifies the number of proxy worker threads | number, 0 = auto | `0` |\n| `global.imagePullPolicy` | Specifies the image pull policy | valid image pull policy | `IfNotPresent` |\n| `global.controlPlaneSecurityEnabled` | Specifies whether control plane mTLS is enabled | true/false | `false` |\n| `global.mtls.enabled` | Specifies whether mTLS is enabled by default between services | true/false | `false` |\n| `global.rbacEnabled` | Specifies whether to create Istio RBAC rules or not | true/false | `true` |\n| `global.refreshInterval` | Specifies the mesh discovery refresh interval | integer followed by s | `10s` |\n| `global.arch.amd64` | Specifies the scheduling policy for `amd64` architectures | 0 = never, 1 = least preferred, 2 = no preference, 3 = most preferred | `2` |\n| `global.arch.s390x` | Specifies the scheduling policy for `s390x` architectures | 0 = never, 1 = least preferred, 2 = no preference, 3 = most preferred | `2` |\n| `global.arch.ppc64le` | Specifies the scheduling policy for `ppc64le` architectures | 0 = never, 1 = least preferred, 2 = no preference, 3 = most preferred | `2` |\n| `ingress.enabled` | Specifies whether Ingress should be installed | true/false | `true` |\n| `gateways.istio-ingressgateway.enabled` | Specifies whether Ingress gateway should be installed | true/false | `true` |\n| `gateways.istio-egressgateway.enabled` | Specifies whether Egress gateway should be installed | true/false | `true` |\n| `sidecarInjectorWebhook.enabled` | Specifies whether automatic sidecar-injector should be installed | `true` |\n| `galley.enabled` | Specifies whether Galley should be installed for server-side config validation | true/false | `true` |\n| `mixer.enabled` | Specifies whether Mixer should be installed | true/false | `true` |\n| `pilot.enabled` | Specifies whether Pilot should be installed | true/false | `true` |\n| `grafana.enabled` | Specifies whether Grafana addon should be installed | true/false | `false` |\n| `grafana.persist` | Specifies whether Grafana addon should persist config data | true/false | `false` |\n| `grafana.storageClassName` | If `grafana.persist` is true, specifies the [`StorageClass`](https://kubernetes.io/docs/concepts/storage/storage-classes/) to use for the `PersistentVolumeClaim` | `StorageClass` | \"\" |\n| `prometheus.enabled` | Specifies whether Prometheus addon should be installed | true/false | `true` |\n| `servicegraph.enabled` | Specifies whether Servicegraph addon should be installed | true/false | `false` |\n| `tracing.enabled` | Specifies whether Tracing(jaeger) addon should be installed | true/false | `false` |\n| `kiali.enabled` | Specifies whether Kiali addon should be installed | true/false | `false` |\n\n## Uninstalling the Chart\n\nTo uninstall/delete the `istio` release:\n```\n$ helm delete istio\n```\nThe command removes all the Kubernetes components associated with the chart and deletes the release.\n\nTo uninstall/delete the `istio` release completely and make its name free for later use:\n```\n$ helm delete istio --purge\n```\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/certmanager/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: certmanager\nversion: 1.0.4\nappVersion: 0.3.1\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/certmanager/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"certmanager.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"certmanager.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- $fullname := printf \"%s-%s\" $name .Release.Name -}}\n{{- default $fullname .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate chart name and version as used by the chart label.\n*/}}\n{{- define \"certmanager.chart\" -}}\n{{- printf \"%s-%s\" .Chart.Name .Chart.Version | replace \"+\" \"_\" | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/certmanager/templates/crds.yaml",
    "content": "apiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: clusterissuers.certmanager.k8s.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: certmanager\nspec:\n  group: certmanager.k8s.io\n  version: v1alpha1\n  names:\n    kind: ClusterIssuer\n    plural: clusterissuers\n  scope: Cluster\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: issuers.certmanager.k8s.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: certmanager\nspec:\n  group: certmanager.k8s.io\n  version: v1alpha1\n  names:\n    kind: Issuer\n    plural: issuers\n  scope: Namespaced\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: certificates.certmanager.k8s.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: certmanager\nspec:\n  group: certmanager.k8s.io\n  version: v1alpha1\n  scope: Namespaced\n  names:\n    kind: Certificate\n    plural: certificates\n    shortNames:\n      - cert\n      - certs\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/certmanager/templates/deployment.yaml",
    "content": "apiVersion: apps/v1beta1\nkind: Deployment\nmetadata:\n  name: certmanager\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"certmanager.name\" . }}\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: certmanager\n  template:\n    metadata:\n      labels:\n        app: certmanager\n{{- if .Values.podLabels }}\n{{ toYaml .Values.podLabels | indent 8 }}\n{{- end }}\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n      {{- if .Values.podAnnotations }}\n{{ toYaml .Values.podAnnotations | indent 8 }}\n      {{- end }}\n    spec:\n      serviceAccountName: certmanager\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: certmanager\n          image: \"{{ .Values.hub }}/cert-manager-controller:{{ .Values.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n          - --cluster-resource-namespace=$(POD_NAMESPACE)\n          - --leader-election-namespace=$(POD_NAMESPACE)\n        {{- if .Values.extraArgs }}\n{{ toYaml .Values.extraArgs | indent 10 }}\n        {{- end }}\n          env:\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                fieldPath: metadata.namespace\n          resources:\n{{ toYaml .Values.resources | indent 12 }}\n    {{- with .Values.nodeSelector }}\n      nodeSelector:\n{{ toYaml . | indent 8 }}\n    {{- end }}\n    {{- with .Values.affinity }}\n      affinity:\n{{ toYaml . | indent 8 }}\n    {{- end }}\n    {{- with .Values.tolerations }}\n      tolerations:\n{{ toYaml . | indent 8 }}\n    {{- end }}\n{{- if .Values.podDnsPolicy }}\n      dnsPolicy: {{ .Values.podDnsPolicy }}\n{{- end }}\n{{- if .Values.podDnsConfig }}\n      dnsConfig:\n{{ toYaml .Values.podDnsConfig | indent 8 }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/certmanager/templates/issuer.yaml",
    "content": "---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt-staging\n  namespace: {{ .Release.Namespace }}\nspec:\n  acme:\n    server: https://acme-staging-v02.api.letsencrypt.org/directory\n    email: {{ .Values.email }}\n    # Name of a secret used to store the ACME account private key\n    privateKeySecretRef:\n      name: letsencrypt-staging\n    http01: {}\n---\napiVersion: certmanager.k8s.io/v1alpha1\nkind: ClusterIssuer\nmetadata:\n  name: letsencrypt\n  namespace: {{ .Release.Namespace }}\nspec:\n  acme:\n    server: https://acme-v02.api.letsencrypt.org/directory\n    email: {{ .Values.email }}\n    privateKeySecretRef:\n      name: letsencrypt\n    http01: {}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/certmanager/templates/rbac.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: certmanager\n  labels:\n    app: certmanager\nrules:\n  - apiGroups: [\"certmanager.k8s.io\"]\n    resources: [\"certificates\", \"issuers\", \"clusterissuers\"]\n    verbs: [\"*\"]\n  - apiGroups: [\"\"]\n    # TODO: remove endpoints once 0.4 is released. We include it here in case\n    # users use the 'master' version of the Helm chart with a 0.2.x release of\n    # certManager that still performs leader election with Endpoint resources.\n    # We advise users don't do this, but some will anyway and this will reduce\n    # friction.\n    resources: [\"endpoints\", \"configmaps\", \"secrets\", \"events\", \"services\", \"pods\"]\n    verbs: [\"*\"]\n  - apiGroups: [\"extensions\"]\n    resources: [\"ingresses\"]\n    verbs: [\"*\"]\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: certmanager\n  labels:\n    app: certmanager\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: certmanager\nsubjects:\n  - name: certmanager\n    namespace: {{ .Release.Namespace }}\n    kind: ServiceAccount\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/certmanager/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: certmanager\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: certmanager\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/Chart.yaml",
    "content": "apiVersion: v1\nname: galley\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for galley deployment\nkeywords:\n  - istio\n  - galley\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"galley.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"galley.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-galley-{{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"admissionregistration.k8s.io\"]\n  resources: [\"validatingwebhookconfigurations\"]\n  verbs: [\"*\"]\n- apiGroups: [\"config.istio.io\"] # istio mixer CRD watcher\n  resources: [\"*\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"*\"]\n  resources: [\"deployments\"]\n  resourceNames: [\"istio-galley\"]\n  verbs: [\"get\"]\n- apiGroups: [\"*\"]\n  resources: [\"endpoints\"]\n  resourceNames: [\"istio-galley\"]\n  verbs: [\"get\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-galley-admin-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-galley-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-galley-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-galley-configuration\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: mixer\ndata:\n  validatingwebhookconfiguration.yaml: |-\n    {{- include \"validatingwebhookconfiguration.yaml.tpl\" . | indent 4}}\n\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-galley\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"galley.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: galley\nspec:\n  replicas: {{ .Values.replicaCount }}\n  strategy:\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  template:\n    metadata:\n      labels:\n        istio: galley\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-galley-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: validator\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n          - containerPort: 443\n          - containerPort: 9093\n          command:\n          - /usr/local/bin/galley\n          - validator\n          - --deployment-namespace={{ .Release.Namespace }}\n          - --caCertFile=/etc/istio/certs/root-cert.pem\n          - --tlsCertFile=/etc/istio/certs/cert-chain.pem\n          - --tlsKeyFile=/etc/istio/certs/key.pem\n          - --healthCheckInterval=1s\n          - --healthCheckFile=/health\n          - --webhook-config-file\n          - /etc/istio/config/validatingwebhookconfiguration.yaml\n          volumeMounts:\n          - name: certs\n            mountPath: /etc/istio/certs\n            readOnly: true\n          - name: config\n            mountPath: /etc/istio/config\n            readOnly: true\n          livenessProbe:\n            exec:\n              command:\n                - /usr/local/bin/galley\n                - probe\n                - --probe-path=/health\n                - --interval=10s\n            initialDelaySeconds: 5\n            periodSeconds: 5\n          readinessProbe:\n            exec:\n              command:\n                - /usr/local/bin/galley\n                - probe\n                - --probe-path=/health\n                - --interval=10s\n            initialDelaySeconds: 5\n            periodSeconds: 5\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n      volumes:\n      - name: certs\n        secret:\n          secretName: istio.istio-galley-service-account\n      - name: config\n        configMap:\n          name: istio-galley-configuration\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: istio-galley\n  namespace: {{ .Release.Namespace }}\n  labels:\n    istio: galley\nspec:\n  ports:\n  - port: 443\n    name: https-validation\n  - port: 9093\n    name: http-monitoring\n  selector:\n    istio: galley\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-galley-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/galley/templates/validatingwehookconfiguration.yaml.tpl",
    "content": "{{ define \"validatingwebhookconfiguration.yaml.tpl\" }}\napiVersion: admissionregistration.k8s.io/v1beta1\nkind: ValidatingWebhookConfiguration\nmetadata:\n  name: istio-galley\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-galley\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nwebhooks:\n{{- if .Values.global.configValidation }}\n  - name: pilot.validation.istio.io\n    clientConfig:\n      service:\n        name: istio-galley\n        namespace: {{ .Release.Namespace }}\n        path: \"/admitpilot\"\n      caBundle: \"\"\n    rules:\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - config.istio.io\n        apiVersions:\n        - v1alpha2\n        resources:\n        - httpapispecs\n        - httpapispecbindings\n        - quotaspecs\n        - quotaspecbindings\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - rbac.istio.io\n        apiVersions:\n        - \"*\"\n        resources:\n        - \"*\"\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - authentication.istio.io\n        apiVersions:\n        - \"*\"\n        resources:\n        - \"*\"\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - networking.istio.io\n        apiVersions:\n        - \"*\"\n        resources:\n        - destinationrules\n        - envoyfilters\n        - gateways\n        - serviceentries\n        - virtualservices\n    failurePolicy: Fail\n  - name: mixer.validation.istio.io\n    clientConfig:\n      service:\n        name: istio-galley\n        namespace: {{ .Release.Namespace }}\n        path: \"/admitmixer\"\n      caBundle: \"\"\n    rules:\n      - operations:\n        - CREATE\n        - UPDATE\n        apiGroups:\n        - config.istio.io\n        apiVersions:\n        - v1alpha2\n        resources:\n        - rules\n        - attributemanifests\n        - circonuses\n        - deniers\n        - fluentds\n        - kubernetesenvs\n        - listcheckers\n        - memquotas\n        - noops\n        - opas\n        - prometheuses\n        - rbacs\n        - servicecontrols\n        - solarwindses\n        - stackdrivers\n        - statsds\n        - stdios\n        - apikeys\n        - authorizations\n        - checknothings\n        # - kuberneteses\n        - listentries\n        - logentries\n        - metrics\n        - quotas\n        - reportnothings\n        - servicecontrolreports\n        - tracespans\n    failurePolicy: Fail\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/gateways/Chart.yaml",
    "content": "apiVersion: v1\nname: gateways\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for deploying Istio gateways\nkeywords:\n  - istio\n  - ingressgateway\n  - egressgateway\n  - gateways\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/gateways/templates/autoscale.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if and $spec.enabled $spec.autoscaleMin }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n    name: {{ $key }}\n    namespace: {{ $spec.namespace | default $.Release.Namespace }}\nspec:\n    maxReplicas: {{ $spec.autoscaleMax }}\n    minReplicas: {{ $spec.autoscaleMin }}\n    scaleTargetRef:\n      apiVersion: apps/v1beta1\n      kind: Deployment\n      name: {{ $key }}\n    metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        targetAverageUtilization: {{ $spec.cpu.targetAverageUtilization }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/gateways/templates/clusterrole.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  labels:\n    app: {{ template \"istio.name\" $ }}\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version }}\n    heritage: {{ $.Release.Service }}\n    release: {{ $.Release.Name }}\n  name: {{ $key }}-{{ $.Release.Namespace }}\nrules:\n- apiGroups: [\"extensions\"]\n  resources: [\"thirdpartyresources\", \"virtualservices\", \"destinationrules\", \"gateways\"]\n  verbs: [\"get\", \"watch\", \"list\", \"update\"]\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/gateways/templates/clusterrolebindings.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: {{ $key }}-{{ $.Release.Namespace }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: {{ $key }}-{{ $.Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: {{ $key }}-service-account\n    namespace: {{ $.Release.Namespace }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/gateways/templates/deployment.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: {{ $key }}\n  namespace: {{ $spec.namespace | default $.Release.Namespace }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    heritage: {{ $.Release.Service }}\n    {{- range $key, $val := $spec.labels }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\nspec:\n  replicas: {{ $spec.replicaCount }}\n  template:\n    metadata:\n      labels:\n        {{- range $key, $val := $spec.labels }}\n        {{ $key }}: {{ $val }}\n        {{- end }}\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: {{ $key }}-service-account\n{{- if $.Values.global.priorityClassName }}\n      priorityClassName: \"{{ $.Values.global.priorityClassName }}\"\n{{- end }}\n{{- if $.Values.global.proxy.enableCoreDump }}\n      initContainers:\n        - name: enable-core-dump\n{{- if contains \"/\" $.Values.global.proxy_init.image }}\n          image: \"{{ $.Values.global.proxy_init.image }}\"\n{{- else }}\n          image: \"{{ $.Values.global.hub }}/{{ $.Values.global.proxy_init.image }}:{{ $.Values.global.tag }}\"\n{{- end }}\n          imagePullPolicy: IfNotPresent\n          command:\n            - /bin/sh\n          args:\n            - -c\n            - sysctl -w kernel.core_pattern=/var/lib/istio/core.proxy && ulimit -c unlimited\n          securityContext:\n            privileged: true\n{{- end }}\n      containers:\n        - name: istio-proxy\n{{- if contains \"/\" $.Values.global.proxy.image }}\n          image: \"{{ $.Values.global.proxy.image }}\"\n{{- else }}\n          image: \"{{ $.Values.global.hub }}/{{ $.Values.global.proxy.image }}:{{ $.Values.global.tag }}\"\n{{- end }}\n          imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n          ports:\n            {{- range $key, $val := $spec.ports }}\n            - containerPort: {{ $val.port }}\n            {{- end }}\n{{ if ne $.Values.global.proxy.stats.prometheusPort 0. }}\n            - containerPort: {{ $.Values.global.proxy.stats.prometheusPort }}\n              protocol: TCP\n              name: http-envoy-prom\n{{ end }}\n          args:\n          - proxy\n          - router\n          - -v\n          - \"2\"\n          - --discoveryRefreshDelay\n          - '1s' #discoveryRefreshDelay\n          - --drainDuration\n          - '45s' #drainDuration\n          - --parentShutdownDuration\n          - '1m0s' #parentShutdownDuration\n          - --connectTimeout\n          - '10s' #connectTimeout\n          - --serviceCluster\n          - {{ $key }}\n          - --zipkinAddress\n        {{- if $.Values.global.istioNamespace }}\n          - zipkin.{{ $.Values.global.istioNamespace }}:9411\n        {{- else }}\n          - zipkin:9411\n        {{- end }}\n        {{- if $.Values.global.proxy.envoyStatsd.enabled }}\n          - --statsdUdpAddress\n          - {{ $.Values.global.proxy.envoyStatsd.host }}:{{ $.Values.global.proxy.envoyStatsd.port }}\n        {{- end }}\n          - --proxyAdminPort\n          - \"15000\"\n        {{- if $.Values.global.controlPlaneSecurityEnabled }}\n          - --controlPlaneAuthPolicy\n          - MUTUAL_TLS\n          - --discoveryAddress\n          {{- if $.Values.global.istioNamespace }}\n          - istio-pilot.{{ $.Values.global.istioNamespace }}:15005\n          {{- else }}\n          - istio-pilot:15005\n          {{- end }}\n        {{- else }}\n          - --controlPlaneAuthPolicy\n          - NONE\n          - --discoveryAddress\n          {{- if $.Values.global.istioNamespace }}\n          - istio-pilot.{{ $.Values.global.istioNamespace }}:8080\n          {{- else }}\n          - istio-pilot:8080\n          {{- end }}\n        {{- end }}\n          resources:\n{{- if $spec.resources }}\n{{ toYaml $spec.resources | indent 12 }}\n{{- else }}\n{{ toYaml $.Values.global.defaultResources | indent 12 }}\n{{- end }}\n          env:\n          - name: POD_NAME\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.name\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: INSTANCE_IP\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: status.podIP\n          - name: ISTIO_META_POD_NAME\n            valueFrom:\n              fieldRef:\n                fieldPath: metadata.name\n          volumeMounts:\n          - name: istio-certs\n            mountPath: /etc/certs\n            readOnly: true\n          {{- range $spec.secretVolumes }}\n          - name: {{ .name }}\n            mountPath: {{ .mountPath | quote }}\n            readOnly: true\n          {{- end }}\n{{- if $spec.additionalContainers }}\n{{ toYaml $spec.additionalContainers | indent 8 }}\n{{- end }}\n      volumes:\n      - name: istio-certs\n        secret:\n          secretName: istio.{{ $key }}-service-account\n          optional: true\n      {{- range $spec.secretVolumes }}\n      - name: {{ .name }}\n        secret:\n          secretName: {{ .secretName | quote }}\n          optional: true\n      {{- end }}\n      {{- range $spec.configVolumes }}\n      - name: {{ .name }}\n        configMap:\n          name: {{ .configMapName | quote }}\n          optional: true\n      {{- end }}\n      affinity:\n      {{- include \"nodeaffinity\" $ | indent 6 }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/gateways/templates/service.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ $key }}\n  namespace: {{ $spec.namespace | default $.Release.Namespace }}\n  annotations:\n    {{- range $key, $val := $spec.serviceAnnotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    heritage: {{ $.Release.Service }}\n    {{- range $key, $val := $spec.labels }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\nspec:\n{{- if $spec.loadBalancerIP }}\n  loadBalancerIP: \"{{ $spec.loadBalancerIP }}\"\n{{- end }}\n  type: {{ .type }}\n{{- if $spec.externalTrafficPolicy }}\n  externalTrafficPolicy: {{ $spec.externalTrafficPolicy }}\n{{- end }}\n  selector:\n    {{- range $key, $val := $spec.labels }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  ports:\n    {{- range $key, $val := $spec.ports }}\n    -\n      {{- range $pkey, $pval := $val }}\n      {{ $pkey}}: {{ $pval }}\n      {{- end }}\n    {{- end }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/gateways/templates/serviceaccount.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if and (ne $key \"global\") (ne $key \"enabled\") }}\n{{- if $spec.enabled }}\napiVersion: v1\nkind: ServiceAccount\n{{- if $.Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range $.Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: {{ $key }}-service-account\n  namespace: {{ $spec.namespace | default $.Release.Namespace }}\n  labels:\n    app: {{ $spec.labels.istio }}\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version }}\n    heritage: {{ $.Release.Service }}\n    release: {{ $.Release.Name }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: grafana\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/dashboards/galley-dashboard.json",
    "content": "{\n    \"__inputs\": [\n      {\n        \"name\": \"DS_PROMETHEUS\",\n        \"label\": \"Prometheus\",\n        \"description\": \"\",\n        \"type\": \"datasource\",\n        \"pluginId\": \"prometheus\",\n        \"pluginName\": \"Prometheus\"\n      }\n    ],\n    \"__requires\": [\n      {\n        \"type\": \"grafana\",\n        \"id\": \"grafana\",\n        \"name\": \"Grafana\",\n        \"version\": \"5.0.4\"\n      },\n      {\n        \"type\": \"panel\",\n        \"id\": \"graph\",\n        \"name\": \"Graph\",\n        \"version\": \"5.0.0\"\n      },\n      {\n        \"type\": \"datasource\",\n        \"id\": \"prometheus\",\n        \"name\": \"Prometheus\",\n        \"version\": \"5.0.0\"\n      }\n    ],\n    \"annotations\": {\n      \"list\": [\n        {\n          \"builtIn\": 1,\n          \"datasource\": \"-- Grafana --\",\n          \"enable\": true,\n          \"hide\": true,\n          \"iconColor\": \"rgba(0, 211, 255, 1)\",\n          \"name\": \"Annotations & Alerts\",\n          \"type\": \"dashboard\"\n        }\n      ]\n    },\n    \"editable\": false,\n    \"gnetId\": null,\n    \"graphTooltip\": 0,\n    \"id\": null,\n    \"links\": [],\n    \"panels\": [\n      {\n        \"aliasColors\": {},\n        \"bars\": false,\n        \"dashLength\": 10,\n        \"dashes\": false,\n        \"datasource\": \"Prometheus\",\n        \"fill\": 1,\n        \"gridPos\": {\n          \"h\": 6,\n          \"w\": 8,\n          \"x\": 0,\n          \"y\": 0\n        },\n        \"id\": 2,\n        \"legend\": {\n          \"avg\": false,\n          \"current\": false,\n          \"max\": false,\n          \"min\": false,\n          \"show\": true,\n          \"total\": false,\n          \"values\": false\n        },\n        \"lines\": true,\n        \"linewidth\": 1,\n        \"links\": [],\n        \"nullPointMode\": \"null\",\n        \"percentage\": false,\n        \"pointradius\": 5,\n        \"points\": false,\n        \"renderer\": \"flot\",\n        \"seriesOverrides\": [],\n        \"spaceLength\": 10,\n        \"stack\": false,\n        \"steppedLine\": false,\n        \"targets\": [\n          {\n            \"expr\": \"galley_validation_cert_key_updates{job=\\\"galley\\\"}\",\n            \"format\": \"time_series\",\n            \"intervalFactor\": 1,\n            \"legendFormat\": \"Key Updates\",\n            \"refId\": \"A\"\n          },\n          {\n            \"expr\": \"galley_validation_cert_key_update_errors{job=\\\"galley\\\"}\",\n            \"format\": \"time_series\",\n            \"intervalFactor\": 1,\n            \"legendFormat\": \"Key Update Errors: {{ error }}\",\n            \"refId\": \"B\"\n          }\n        ],\n        \"thresholds\": [],\n        \"timeFrom\": null,\n        \"timeShift\": null,\n        \"title\": \"Validation Webhook Certificate\",\n        \"tooltip\": {\n          \"shared\": true,\n          \"sort\": 0,\n          \"value_type\": \"individual\"\n        },\n        \"type\": \"graph\",\n        \"xaxis\": {\n          \"buckets\": null,\n          \"mode\": \"time\",\n          \"name\": null,\n          \"show\": true,\n          \"values\": []\n        },\n        \"yaxes\": [\n          {\n            \"format\": \"short\",\n            \"label\": null,\n            \"logBase\": 1,\n            \"max\": null,\n            \"min\": null,\n            \"show\": true\n          },\n          {\n            \"format\": \"short\",\n            \"label\": null,\n            \"logBase\": 1,\n            \"max\": null,\n            \"min\": null,\n            \"show\": true\n          }\n        ]\n      },\n      {\n        \"aliasColors\": {},\n        \"bars\": false,\n        \"dashLength\": 10,\n        \"dashes\": false,\n        \"datasource\": \"Prometheus\",\n        \"fill\": 1,\n        \"gridPos\": {\n          \"h\": 6,\n          \"w\": 8,\n          \"x\": 8,\n          \"y\": 0\n        },\n        \"id\": 3,\n        \"legend\": {\n          \"avg\": false,\n          \"current\": false,\n          \"max\": false,\n          \"min\": false,\n          \"show\": true,\n          \"total\": false,\n          \"values\": false\n        },\n        \"lines\": true,\n        \"linewidth\": 1,\n        \"links\": [],\n        \"nullPointMode\": \"null\",\n        \"percentage\": false,\n        \"pointradius\": 5,\n        \"points\": false,\n        \"renderer\": \"flot\",\n        \"seriesOverrides\": [],\n        \"spaceLength\": 10,\n        \"stack\": false,\n        \"steppedLine\": false,\n        \"targets\": [\n          {\n            \"expr\": \"sum(galley_validation_passed{job=\\\"galley\\\"}) by (group, version, resource)\",\n            \"format\": \"time_series\",\n            \"intervalFactor\": 1,\n            \"legendFormat\": \"Passed: {{ group }}/{{ version }}/{{resource}}\",\n            \"refId\": \"A\"\n          },\n          {\n            \"expr\": \"sum(galley_validation_failed{job=\\\"galley\\\"}) by (group, version, resource, reason)\",\n            \"format\": \"time_series\",\n            \"intervalFactor\": 1,\n            \"legendFormat\": \"Failed: {{ group }}/{{ version }}/{{resource}} ({{ reason}})\",\n            \"refId\": \"B\"\n          }\n        ],\n        \"thresholds\": [],\n        \"timeFrom\": null,\n        \"timeShift\": null,\n        \"title\": \"Resource Validation\",\n        \"tooltip\": {\n          \"shared\": true,\n          \"sort\": 0,\n          \"value_type\": \"individual\"\n        },\n        \"type\": \"graph\",\n        \"xaxis\": {\n          \"buckets\": null,\n          \"mode\": \"time\",\n          \"name\": null,\n          \"show\": true,\n          \"values\": []\n        },\n        \"yaxes\": [\n          {\n            \"format\": \"short\",\n            \"label\": null,\n            \"logBase\": 1,\n            \"max\": null,\n            \"min\": null,\n            \"show\": true\n          },\n          {\n            \"format\": \"short\",\n            \"label\": null,\n            \"logBase\": 1,\n            \"max\": null,\n            \"min\": null,\n            \"show\": true\n          }\n        ]\n      },\n      {\n        \"aliasColors\": {},\n        \"bars\": false,\n        \"dashLength\": 10,\n        \"dashes\": false,\n        \"datasource\": \"Prometheus\",\n        \"fill\": 1,\n        \"gridPos\": {\n          \"h\": 6,\n          \"w\": 8,\n          \"x\": 16,\n          \"y\": 0\n        },\n        \"id\": 4,\n        \"legend\": {\n          \"avg\": false,\n          \"current\": false,\n          \"max\": false,\n          \"min\": false,\n          \"show\": true,\n          \"total\": false,\n          \"values\": false\n        },\n        \"lines\": true,\n        \"linewidth\": 1,\n        \"links\": [],\n        \"nullPointMode\": \"null\",\n        \"percentage\": false,\n        \"pointradius\": 5,\n        \"points\": false,\n        \"renderer\": \"flot\",\n        \"seriesOverrides\": [],\n        \"spaceLength\": 10,\n        \"stack\": false,\n        \"steppedLine\": false,\n        \"targets\": [\n          {\n            \"expr\": \"sum(galley_validation_http_error{job=\\\"galley\\\"}) by (status)\",\n            \"format\": \"time_series\",\n            \"intervalFactor\": 1,\n            \"legendFormat\": \"{{ status }}\",\n            \"refId\": \"A\"\n          }\n        ],\n        \"thresholds\": [],\n        \"timeFrom\": null,\n        \"timeShift\": null,\n        \"title\": \"Validation HTTP Errors\",\n        \"tooltip\": {\n          \"shared\": true,\n          \"sort\": 0,\n          \"value_type\": \"individual\"\n        },\n        \"type\": \"graph\",\n        \"xaxis\": {\n          \"buckets\": null,\n          \"mode\": \"time\",\n          \"name\": null,\n          \"show\": true,\n          \"values\": []\n        },\n        \"yaxes\": [\n          {\n            \"format\": \"short\",\n            \"label\": null,\n            \"logBase\": 1,\n            \"max\": null,\n            \"min\": null,\n            \"show\": true\n          },\n          {\n            \"format\": \"short\",\n            \"label\": null,\n            \"logBase\": 1,\n            \"max\": null,\n            \"min\": null,\n            \"show\": true\n          }\n        ]\n      }\n    ],\n    \"schemaVersion\": 16,\n    \"style\": \"dark\",\n    \"tags\": [],\n    \"templating\": {\n      \"list\": []\n    },\n    \"time\": {\n      \"from\": \"now-6h\",\n      \"to\": \"now\"\n    },\n    \"timepicker\": {\n      \"refresh_intervals\": [\n        \"5s\",\n        \"10s\",\n        \"30s\",\n        \"1m\",\n        \"5m\",\n        \"15m\",\n        \"30m\",\n        \"1h\",\n        \"2h\",\n        \"1d\"\n      ],\n      \"time_options\": [\n        \"5m\",\n        \"15m\",\n        \"1h\",\n        \"6h\",\n        \"12h\",\n        \"24h\",\n        \"2d\",\n        \"7d\",\n        \"30d\"\n      ]\n    },\n    \"timezone\": \"\",\n    \"title\": \"Istio Galley Dashboard\",\n    \"uid\": \"DMXUJ6dmz\",\n    \"version\": 1\n  }\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/dashboards/istio-mesh-dashboard.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": false,\n  \"gnetId\": null,\n  \"graphTooltip\": 0,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"content\": \"<div>\\n  <div style=\\\"position: absolute; bottom: 0\\\">\\n    <a href=\\\"https://istio.io\\\" target=\\\"_blank\\\" style=\\\"font-size: 30px; text-decoration: none; color: inherit\\\"><img src=\\\"https://istio.io/img/istio-logo.svg\\\" style=\\\"height: 50px\\\"> Istio</a>\\n  </div>\\n  <div style=\\\"position: absolute; bottom: 0; right: 0; font-size: 15px\\\">\\n    Istio is an <a href=\\\"https://github.com/istio/istio\\\" target=\\\"_blank\\\">open platform</a> that provides a uniform way to connect,\\n    <a href=\\\"https://istio.io/docs/concepts/traffic-management/overview.html\\\" target=\\\"_blank\\\">manage</a>, and \\n    <a href=\\\"https://istio.io/docs/concepts/network-and-auth/auth.html\\\" target=\\\"_blank\\\">secure</a> microservices.\\n    <br>\\n    Need help? Join the <a href=\\\"https://istio.io/community/\\\" target=\\\"_blank\\\">Istio community</a>.\\n  </div>\\n</div>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"height\": \"50px\",\n      \"id\": 13,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"style\": {\n        \"font-size\": \"18pt\"\n      },\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"ops\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 3\n      },\n      \"id\": 20,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{reporter=\\\"destination\\\"}[1m])), 0.001)\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Global Request Volume\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"percentunit\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 80,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": false\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 3\n      },\n      \"id\": 21,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"destination\\\", response_code!~\\\"5.*\\\"}[1m])) / sum(rate(istio_requests_total{reporter=\\\"destination\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"thresholds\": \"95, 99, 99.5\",\n      \"title\": \"Global Success Rate (non-5xx responses)\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"ops\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 3\n      },\n      \"id\": 22,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_requests_total{reporter=\\\"destination\\\", response_code=~\\\"4.*\\\"}[1m])) \",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"4xxs\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"ops\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 3\n      },\n      \"id\": 23,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_requests_total{reporter=\\\"destination\\\", response_code=~\\\"5.*\\\"}[1m])) \",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"5xxs\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"columns\": [],\n      \"datasource\": \"Prometheus\",\n      \"fontSize\": \"100%\",\n      \"gridPos\": {\n        \"h\": 21,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 6\n      },\n      \"hideTimeOverride\": false,\n      \"id\": 73,\n      \"links\": [],\n      \"pageSize\": null,\n      \"repeat\": null,\n      \"repeatDirection\": \"v\",\n      \"scroll\": true,\n      \"showHeader\": true,\n      \"sort\": {\n        \"col\": 4,\n        \"desc\": true\n      },\n      \"styles\": [\n        {\n          \"alias\": \"Workload\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"link\": false,\n          \"linkTargetBlank\": false,\n          \"linkTooltip\": \"Workload dashboard\",\n          \"linkUrl\": \"/dashboard/db/istio-workload-dashboard?var-namespace=$__cell_2&var-workload=$__cell_\",\n          \"pattern\": \"destination_workload\",\n          \"preserveFormat\": false,\n          \"sanitize\": false,\n          \"thresholds\": [],\n          \"type\": \"hidden\",\n          \"unit\": \"short\"\n        },\n        {\n          \"alias\": \"\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Time\",\n          \"thresholds\": [],\n          \"type\": \"hidden\",\n          \"unit\": \"short\"\n        },\n        {\n          \"alias\": \"Requests\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Value #A\",\n          \"thresholds\": [],\n          \"type\": \"number\",\n          \"unit\": \"ops\"\n        },\n        {\n          \"alias\": \"P50 Latency\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Value #B\",\n          \"thresholds\": [],\n          \"type\": \"number\",\n          \"unit\": \"s\"\n        },\n        {\n          \"alias\": \"P90 Latency\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Value #D\",\n          \"thresholds\": [],\n          \"type\": \"number\",\n          \"unit\": \"s\"\n        },\n        {\n          \"alias\": \"P99 Latency\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Value #E\",\n          \"thresholds\": [],\n          \"type\": \"number\",\n          \"unit\": \"s\"\n        },\n        {\n          \"alias\": \"Success Rate\",\n          \"colorMode\": \"cell\",\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Value #F\",\n          \"thresholds\": [\n            \".95\",\n            \" 1.00\"\n          ],\n          \"type\": \"number\",\n          \"unit\": \"percentunit\"\n        },\n        {\n          \"alias\": \"Workload\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"link\": true,\n          \"linkTooltip\": \"$__cell dashboard\",\n          \"linkUrl\": \"/dashboard/db/istio-workload-dashboard?var-workload=$__cell_2&var-namespace=$__cell_3\",\n          \"pattern\": \"destination_workload_var\",\n          \"thresholds\": [],\n          \"type\": \"number\",\n          \"unit\": \"short\"\n        },\n        {\n          \"alias\": \"Service\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"link\": true,\n          \"linkTooltip\": \"$__cell dashboard\",\n          \"linkUrl\": \"/dashboard/db/istio-service-dashboard?var-service=$__cell\",\n          \"pattern\": \"destination_service\",\n          \"thresholds\": [],\n          \"type\": \"string\",\n          \"unit\": \"short\"\n        },\n        {\n          \"alias\": \"\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"destination_workload_namespace\",\n          \"thresholds\": [],\n          \"type\": \"hidden\",\n          \"unit\": \"short\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"expr\": \"label_join(sum(rate(istio_requests_total{reporter=\\\"destination\\\", response_code=\\\"200\\\"}[1m])) by (destination_workload, destination_workload_namespace, destination_service), \\\"destination_workload_var\\\", \\\".\\\", \\\"destination_workload\\\", \\\"destination_workload_namespace\\\")\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload}}.{{ destination_workload_namespace }}\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"label_join(histogram_quantile(0.50, sum(rate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\"}[1m])) by (le, destination_workload, destination_workload_namespace)), \\\"destination_workload_var\\\", \\\".\\\", \\\"destination_workload\\\", \\\"destination_workload_namespace\\\")\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload}}.{{ destination_workload_namespace }}\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"label_join(histogram_quantile(0.90, sum(rate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\"}[1m])) by (le, destination_workload, destination_workload_namespace)), \\\"destination_workload_var\\\", \\\".\\\", \\\"destination_workload\\\", \\\"destination_workload_namespace\\\")\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }}\",\n          \"refId\": \"D\"\n        },\n        {\n          \"expr\": \"label_join(histogram_quantile(0.99, sum(rate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\"}[1m])) by (le, destination_workload, destination_workload_namespace)), \\\"destination_workload_var\\\", \\\".\\\", \\\"destination_workload\\\", \\\"destination_workload_namespace\\\")\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }}\",\n          \"refId\": \"E\"\n        },\n        {\n          \"expr\": \"label_join((sum(rate(istio_requests_total{reporter=\\\"destination\\\", response_code!~\\\"5.*\\\"}[1m])) by (destination_workload, destination_workload_namespace) / sum(rate(istio_requests_total{reporter=\\\"destination\\\"}[1m])) by (destination_workload, destination_workload_namespace)), \\\"destination_workload_var\\\", \\\".\\\", \\\"destination_workload\\\", \\\"destination_workload_namespace\\\")\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }}\",\n          \"refId\": \"F\"\n        }\n      ],\n      \"timeFrom\": null,\n      \"title\": \"HTTP/GRPC Workloads\",\n      \"transform\": \"table\",\n      \"transparent\": false,\n      \"type\": \"table\"\n    },\n    {\n      \"columns\": [],\n      \"datasource\": \"Prometheus\",\n      \"fontSize\": \"100%\",\n      \"gridPos\": {\n        \"h\": 18,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 27\n      },\n      \"hideTimeOverride\": false,\n      \"id\": 109,\n      \"links\": [],\n      \"pageSize\": null,\n      \"repeatDirection\": \"v\",\n      \"scroll\": true,\n      \"showHeader\": true,\n      \"sort\": {\n        \"col\": 2,\n        \"desc\": true\n      },\n      \"styles\": [\n        {\n          \"alias\": \"Workload\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"link\": false,\n          \"linkTargetBlank\": false,\n          \"linkTooltip\": \"$__cell dashboard\",\n          \"linkUrl\": \"/dashboard/db/istio-tcp-workload-dashboard?var-namespace=$__cell_2&&var-workload=$__cell\",\n          \"pattern\": \"destination_workload\",\n          \"preserveFormat\": false,\n          \"sanitize\": false,\n          \"thresholds\": [],\n          \"type\": \"hidden\",\n          \"unit\": \"short\"\n        },\n        {\n          \"alias\": \"Bytes Sent\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Value #A\",\n          \"thresholds\": [\n            \"\"\n          ],\n          \"type\": \"number\",\n          \"unit\": \"Bps\"\n        },\n        {\n          \"alias\": \"Bytes Received\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Value #C\",\n          \"thresholds\": [],\n          \"type\": \"number\",\n          \"unit\": \"Bps\"\n        },\n        {\n          \"alias\": \"\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"Time\",\n          \"thresholds\": [],\n          \"type\": \"hidden\",\n          \"unit\": \"short\"\n        },\n        {\n          \"alias\": \"Workload\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"link\": true,\n          \"linkTooltip\": \"$__cell dashboard\",\n          \"linkUrl\": \"/dashboard/db/istio-workload-dashboard?var-namespace=$__cell_3&var-workload=$__cell_2\",\n          \"pattern\": \"destination_workload_var\",\n          \"thresholds\": [],\n          \"type\": \"string\",\n          \"unit\": \"short\"\n        },\n        {\n          \"alias\": \"\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"pattern\": \"destination_workload_namespace\",\n          \"thresholds\": [],\n          \"type\": \"hidden\",\n          \"unit\": \"short\"\n        },\n        {\n          \"alias\": \"Service\",\n          \"colorMode\": null,\n          \"colors\": [\n            \"rgba(245, 54, 54, 0.9)\",\n            \"rgba(237, 129, 40, 0.89)\",\n            \"rgba(50, 172, 45, 0.97)\"\n          ],\n          \"dateFormat\": \"YYYY-MM-DD HH:mm:ss\",\n          \"decimals\": 2,\n          \"link\": true,\n          \"linkTooltip\": \"$__cell dashboard\",\n          \"linkUrl\": \"/dashboard/db/istio-service-dashboard?var-service=$__cell\",\n          \"pattern\": \"destination_service\",\n          \"thresholds\": [],\n          \"type\": \"number\",\n          \"unit\": \"short\"\n        }\n      ],\n      \"targets\": [\n        {\n          \"expr\": \"label_join(sum(rate(istio_tcp_received_bytes_total{reporter=\\\"source\\\"}[1m])) by (destination_workload, destination_workload_namespace, destination_service), \\\"destination_workload_var\\\", \\\".\\\", \\\"destination_workload\\\", \\\"destination_workload_namespace\\\")\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"label_join(sum(rate(istio_tcp_sent_bytes_total{reporter=\\\"source\\\"}[1m])) by (destination_workload, destination_workload_namespace, destination_service), \\\"destination_workload_var\\\", \\\".\\\", \\\"destination_workload\\\", \\\"destination_workload_namespace\\\")\",\n          \"format\": \"table\",\n          \"hide\": false,\n          \"instant\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"timeFrom\": null,\n      \"title\": \"TCP Workloads\",\n      \"transform\": \"table\",\n      \"transparent\": false,\n      \"type\": \"table\"\n    }\n  ],\n  \"refresh\": \"5s\",\n  \"schemaVersion\": 16,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": []\n  },\n  \"time\": {\n    \"from\": \"now-5m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"Istio Mesh Dashboard\",\n  \"uid\": \"1\",\n  \"version\": 2\n}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/dashboards/istio-performance-dashboard.json",
    "content": "{\n  \"__inputs\": [\n    {\n      \"name\": \"DS_PROMETHEUS\",\n      \"label\": \"Prometheus\",\n      \"description\": \"\",\n      \"type\": \"datasource\",\n      \"pluginId\": \"prometheus\",\n      \"pluginName\": \"Prometheus\"\n    }\n  ],\n  \"__requires\": [\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"5.2.3\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"graph\",\n      \"name\": \"Graph\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"prometheus\",\n      \"name\": \"Prometheus\",\n      \"version\": \"5.0.0\"\n    }\n  ],\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"gnetId\": null,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 2,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{pod_name=~\\\"istio-telemetry-.*\\\"}[1m]))/ (round(sum(irate(istio_requests_total[1m])), 0.001)/1000)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-telemetry\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{pod_name=~\\\"istio-ingressgateway-.*\\\"}[1m])) / (round(sum(irate(istio_requests_total{source_workload=\\\"istio-ingressgateway\\\", reporter=\\\"source\\\"}[1m])), 0.001)/1000)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-ingressgateway\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{container_name=\\\"istio-proxy\\\"}[1m]))/ (round(sum(irate(istio_requests_total[1m])), 0.001)/1000)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-proxy\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{pod_name=~\\\"istio-policy-.*\\\"}[1m]))/ (round(sum(irate(istio_requests_total[1m])), 0.001)/1000)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-policy\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"vCPU / 1k rps\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 6,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{pod_name=~\\\"istio-telemetry-.*\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-telemetry\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{pod_name=~\\\"istio-ingressgateway-.*\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-ingressgateway\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{container_name=\\\"istio-proxy\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-proxy\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{pod_name=~\\\"istio-policy-.*\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-policy\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"vCPU\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 9\n      },\n      \"id\": 4,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(container_memory_usage_bytes{pod_name=~\\\"istio-telemetry-.*\\\"}) / (sum(irate(istio_requests_total[1m])) / 1000)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-telemetry / 1k rps\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"sum(container_memory_usage_bytes{pod_name=~\\\"istio-ingressgateway-.*\\\"}) / count(container_memory_usage_bytes{pod_name=~\\\"istio-ingressgateway-.*\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"per istio-ingressgateway\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"sum(container_memory_usage_bytes{container_name=\\\"istio-proxy\\\"}) / count(container_memory_usage_bytes{container_name=\\\"istio-proxy\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"per istio-proxy\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"sum(container_memory_usage_bytes{pod_name=~\\\"istio-policy-.*\\\"}) / (sum(irate(istio_requests_total[1m])) / 1000)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-policy / 1k rps\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Memory\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 9,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 9\n      },\n      \"id\": 5,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_response_bytes_sum{destination_workload=\\\"istio-telemetry\\\"}[1m])) + sum(irate(istio_request_bytes_sum{destination_workload=\\\"istio-telemetry\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-telemetry\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"sum(irate(istio_response_bytes_sum{source_workload=\\\"istio-ingressgateway\\\", reporter=\\\"source\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-ingressgateway\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"sum(irate(istio_response_bytes_sum{source_workload_namespace!=\\\"istio-system\\\", reporter=\\\"source\\\"}[1m])) + sum(irate(istio_response_bytes_sum{destination_workload_namespace!=\\\"istio-system\\\", reporter=\\\"destination\\\"}[1m])) + sum(irate(istio_request_bytes_sum{source_workload_namespace!=\\\"istio-system\\\", reporter=\\\"source\\\"}[1m])) + sum(irate(istio_request_bytes_sum{destination_workload_namespace!=\\\"istio-system\\\", reporter=\\\"destination\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-proxy\",\n          \"refId\": \"D\"\n        },\n        {\n          \"expr\": \"sum(irate(istio_response_bytes_sum{destination_workload=\\\"istio-policy\\\"}[1m])) + sum(irate(istio_request_bytes_sum{destination_workload=\\\"istio-policy\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"istio-policy\",\n          \"refId\": \"E\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes transferred / sec\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    }\n  ],\n  \"schemaVersion\": 16,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": []\n  },\n  \"time\": {\n    \"from\": \"now-5m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"\",\n  \"title\": \"Istio Performance Dashboard\",\n  \"uid\": \"t8BUIg1mz\",\n  \"version\": 5\n}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/dashboards/istio-service-dashboard.json",
    "content": "{\n  \"__inputs\": [\n    {\n      \"name\": \"DS_PROMETHEUS\",\n      \"label\": \"Prometheus\",\n      \"description\": \"\",\n      \"type\": \"datasource\",\n      \"pluginId\": \"prometheus\",\n      \"pluginName\": \"Prometheus\"\n    }\n  ],\n  \"__requires\": [\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"5.0.4\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"graph\",\n      \"name\": \"Graph\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"prometheus\",\n      \"name\": \"Prometheus\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"singlestat\",\n      \"name\": \"Singlestat\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"text\",\n      \"name\": \"Text\",\n      \"version\": \"5.0.0\"\n    }\n  ],\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"gnetId\": null,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1530559387240,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"content\": \"<div class=\\\"dashboard-header text-center\\\">\\n<span>SERVICE: $service</span>\\n</div>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 89,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"ops\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 3\n      },\n      \"id\": 12,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(rate(istio_requests_total{reporter=\\\"source\\\",destination_service=~\\\"$service\\\"}[30s])), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Client Request Volume\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"decimals\": null,\n      \"format\": \"percentunit\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 80,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": false\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 3\n      },\n      \"id\": 14,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_requests_total{reporter=\\\"source\\\",destination_service=~\\\"$service\\\",response_code!~\\\"5.*\\\"}[30s])) / sum(irate(istio_requests_total{reporter=\\\"source\\\",destination_service=~\\\"$service\\\"}[30s]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": \"95, 99, 99.5\",\n      \"title\": \"Client Success Rate (non-5xx responses)\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 3\n      },\n      \"id\": 87,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": false,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\",destination_service=~\\\"$service\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P50\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\",destination_service=~\\\"$service\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P90\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\",destination_service=~\\\"$service\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P99\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Client Request Duration\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"#299c46\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"#d44a3a\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"Bps\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 3\n      },\n      \"id\": 84,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_tcp_sent_bytes_total{reporter=\\\"source\\\", destination_service=~\\\"$service\\\"}[1m])) + sum(irate(istio_tcp_received_bytes_total{reporter=\\\"source\\\", destination_service=~\\\"$service\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Client TCP Bandwidth\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"ops\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 97,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(rate(istio_requests_total{reporter=\\\"destination\\\",destination_service=~\\\"$service\\\"}[30s])), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Server Request Volume\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"decimals\": null,\n      \"format\": \"percentunit\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 80,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": false\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 7\n      },\n      \"id\": 98,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_requests_total{reporter=\\\"destination\\\",destination_service=~\\\"$service\\\",response_code!~\\\"5.*\\\"}[30s])) / sum(irate(istio_requests_total{reporter=\\\"destination\\\",destination_service=~\\\"$service\\\"}[30s]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": \"95, 99, 99.5\",\n      \"title\": \"Server Success Rate (non-5xx responses)\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 7\n      },\n      \"id\": 99,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": false,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\",destination_service=~\\\"$service\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P50\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\",destination_service=~\\\"$service\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P90\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\",destination_service=~\\\"$service\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P99\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Server Request Duration\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"#299c46\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"#d44a3a\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"Bps\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 7\n      },\n      \"id\": 100,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_tcp_sent_bytes_total{reporter=\\\"destination\\\", destination_service=~\\\"$service\\\"}[1m])) + sum(irate(istio_tcp_received_bytes_total{reporter=\\\"destination\\\", destination_service=~\\\"$service\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Server TCP Bandwidth\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"content\": \"<div class=\\\"dashboard-header text-center\\\">\\n<span>CLIENT WORKLOADS</span>\\n</div>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 11\n      },\n      \"id\": 45,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 0,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 14\n      },\n      \"id\": 25,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null as zero\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{connection_security_policy=\\\"mutual_tls\\\",destination_service=~\\\"$service\\\",reporter=\\\"source\\\",source_workload=~\\\"$srcwl\\\",source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace, response_code), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace }} : {{ response_code }} (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", reporter=\\\"source\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace, response_code), 0.001)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace }} : {{ response_code }}\",\n          \"refId\": \"A\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Requests by Source And Response Code\",\n      \"tooltip\": {\n        \"shared\": false,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": [\n          \"total\"\n        ]\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 14\n      },\n      \"id\": 26,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\",response_code!~\\\"5.*\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace) / sum(rate(istio_requests_total{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace }} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\",response_code!~\\\"5.*\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace) / sum(rate(istio_requests_total{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace }}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Success Rate (non-5xx responses) By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"percentunit\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": \"1.01\",\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"description\": \"\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 27,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Request Duration by Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 20\n      },\n      \"id\": 28,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}}  P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}}  P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Request Size By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 20\n      },\n      \"id\": 68,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}}  P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}}  P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Response Size By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 26\n      },\n      \"id\": 80,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_received_bytes_total{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace}} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_received_bytes_total{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace}}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes Received from Incoming TCP Connection\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 26\n      },\n      \"id\": 82,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_sent_bytes_total{connection_security_policy=\\\"mutual_tls\\\", reporter=\\\"source\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace}} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_sent_bytes_total{connection_security_policy!=\\\"mutual_tls\\\", reporter=\\\"source\\\", destination_service=~\\\"$service\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace}}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes Sent to Incoming TCP Connection\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"content\": \"<div class=\\\"dashboard-header text-center\\\">\\n<span>SERVICE WORKLOADS</span>\\n</div>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 69,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 0,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 35\n      },\n      \"id\": 90,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null as zero\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{connection_security_policy=\\\"mutual_tls\\\",destination_service=~\\\"$service\\\",reporter=\\\"destination\\\",destination_workload=~\\\"$dstwl\\\",destination_workload_namespace=~\\\"$dstns\\\"}[30s])) by (destination_workload, destination_workload_namespace, response_code), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} : {{ response_code }} (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", reporter=\\\"destination\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[30s])) by (destination_workload, destination_workload_namespace, response_code), 0.001)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} : {{ response_code }}\",\n          \"refId\": \"A\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Requests by Destination And Response Code\",\n      \"tooltip\": {\n        \"shared\": false,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": [\n          \"total\"\n        ]\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 35\n      },\n      \"id\": 91,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\",response_code!~\\\"5.*\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[30s])) by (destination_workload, destination_workload_namespace) / sum(rate(istio_requests_total{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[30s])) by (destination_workload, destination_workload_namespace)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\",response_code!~\\\"5.*\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[30s])) by (destination_workload, destination_workload_namespace) / sum(rate(istio_requests_total{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[30s])) by (destination_workload, destination_workload_namespace)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Success Rate (non-5xx responses) By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"percentunit\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": \"1.01\",\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"description\": \"\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 41\n      },\n      \"id\": 94,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Request Duration by Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 41\n      },\n      \"id\": 95,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }}  P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }}  P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Request Size By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 41\n      },\n      \"id\": 96,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }}  P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }}  P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace }} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Response Size By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 47\n      },\n      \"id\": 92,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_received_bytes_total{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace}} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_received_bytes_total{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{ destination_workload_namespace}}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes Received from Incoming TCP Connection\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 47\n      },\n      \"id\": 93,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_sent_bytes_total{connection_security_policy=\\\"mutual_tls\\\", reporter=\\\"destination\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{destination_workload_namespace }} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_sent_bytes_total{connection_security_policy!=\\\"mutual_tls\\\", reporter=\\\"destination\\\", destination_service=~\\\"$service\\\", destination_workload=~\\\"$dstwl\\\", destination_workload_namespace=~\\\"$dstns\\\"}[1m])) by (destination_workload, destination_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_workload }}.{{destination_workload_namespace }}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes Sent to Incoming TCP Connection\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    }\n  ],\n  \"refresh\": \"10s\",\n  \"schemaVersion\": 16,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": [\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Service\",\n        \"multi\": false,\n        \"name\": \"service\",\n        \"options\": [],\n        \"query\": \"label_values(destination_service)\",\n        \"refresh\": 1,\n        \"regex\": \"\",\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Client Workload Namespace\",\n        \"multi\": true,\n        \"name\": \"srcns\",\n        \"options\": [],\n        \"query\": \"query_result( sum(istio_requests_total{reporter=\\\"destination\\\", destination_service=\\\"$service\\\"}) by (source_workload_namespace) or sum(istio_tcp_sent_bytes_total{reporter=\\\"destination\\\", destination_service=~\\\"$service\\\"}) by (source_workload_namespace))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*namespace=\\\"([^\\\"]*).*/\",\n        \"sort\": 2,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Client Workload\",\n        \"multi\": true,\n        \"name\": \"srcwl\",\n        \"options\": [],\n        \"query\": \"query_result( sum(istio_requests_total{reporter=\\\"destination\\\", destination_service=~\\\"$service\\\", source_workload_namespace=~\\\"$srcns\\\"}) by (source_workload) or sum(istio_tcp_sent_bytes_total{reporter=\\\"destination\\\", destination_service=~\\\"$service\\\", source_workload_namespace=~\\\"$srcns\\\"}) by (source_workload))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*workload=\\\"([^\\\"]*).*/\",\n        \"sort\": 3,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Service Workload Namespace\",\n        \"multi\": true,\n        \"name\": \"dstns\",\n        \"options\": [],\n        \"query\": \"query_result( sum(istio_requests_total{reporter=\\\"destination\\\", destination_service=\\\"$service\\\"}) by (destination_workload_namespace) or sum(istio_tcp_sent_bytes_total{reporter=\\\"destination\\\", destination_service=~\\\"$service\\\"}) by (destination_workload_namespace))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*namespace=\\\"([^\\\"]*).*/\",\n        \"sort\": 2,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Service Workload\",\n        \"multi\": true,\n        \"name\": \"dstwl\",\n        \"options\": [],\n        \"query\": \"query_result( sum(istio_requests_total{reporter=\\\"destination\\\", destination_service=~\\\"$service\\\", destination_workload_namespace=~\\\"$dstns\\\"}) by (destination_workload) or sum(istio_tcp_sent_bytes_total{reporter=\\\"destination\\\", destination_service=~\\\"$service\\\", destination_workload_namespace=~\\\"$dstns\\\"}) by (destination_workload))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*workload=\\\"([^\\\"]*).*/\",\n        \"sort\": 3,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-5m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"\",\n  \"title\": \"Istio Service Dashboard\",\n  \"uid\": \"LJ_uJAvmk\",\n  \"version\": 10\n}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/dashboards/istio-workload-dashboard.json",
    "content": "{\n  \"__inputs\": [\n    {\n      \"name\": \"DS_PROMETHEUS\",\n      \"label\": \"Prometheus\",\n      \"description\": \"\",\n      \"type\": \"datasource\",\n      \"pluginId\": \"prometheus\",\n      \"pluginName\": \"Prometheus\"\n    }\n  ],\n  \"__requires\": [\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"5.0.4\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"graph\",\n      \"name\": \"Graph\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"prometheus\",\n      \"name\": \"Prometheus\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"singlestat\",\n      \"name\": \"Singlestat\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"text\",\n      \"name\": \"Text\",\n      \"version\": \"5.0.0\"\n    }\n  ],\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": false,\n  \"gnetId\": null,\n  \"graphTooltip\": 0,\n  \"id\": null,\n  \"iteration\": 1531345461465,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"content\": \"<div class=\\\"dashboard-header text-center\\\">\\n<span>WORKLOAD: $workload.$namespace</span>\\n</div>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 89,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(245, 54, 54, 0.9)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(50, 172, 45, 0.97)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"ops\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 3\n      },\n      \"id\": 12,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(rate(istio_requests_total{reporter=\\\"destination\\\",destination_workload_namespace=~\\\"$namespace\\\",destination_workload=~\\\"$workload\\\"}[30s])), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"A\",\n          \"step\": 4\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"Incoming Request Volume\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"current\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"rgba(50, 172, 45, 0.97)\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"rgba(245, 54, 54, 0.9)\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"decimals\": null,\n      \"format\": \"percentunit\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 80,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": false\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 3\n      },\n      \"id\": 14,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_requests_total{reporter=\\\"destination\\\",destination_workload_namespace=~\\\"$namespace\\\",destination_workload=~\\\"$workload\\\",response_code!~\\\"5.*\\\"}[30s])) / sum(irate(istio_requests_total{reporter=\\\"destination\\\",destination_workload_namespace=~\\\"$namespace\\\",destination_workload=~\\\"$workload\\\"}[30s]))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": \"95, 99, 99.5\",\n      \"title\": \"Incoming Success Rate (non-5xx responses)\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 3\n      },\n      \"id\": 87,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": false,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": true,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\",destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"interval\": \"\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P50\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\",destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P90\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\",destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\"}[1m])) by (le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"P99\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Request Duration\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"#299c46\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"#d44a3a\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"Bps\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 7\n      },\n      \"id\": 84,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_tcp_sent_bytes_total{reporter=\\\"destination\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\"}[1m])) + sum(irate(istio_tcp_received_bytes_total{reporter=\\\"destination\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"TCP Server Traffic\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"cacheTimeout\": null,\n      \"colorBackground\": false,\n      \"colorValue\": false,\n      \"colors\": [\n        \"#299c46\",\n        \"rgba(237, 129, 40, 0.89)\",\n        \"#d44a3a\"\n      ],\n      \"datasource\": \"Prometheus\",\n      \"format\": \"Bps\",\n      \"gauge\": {\n        \"maxValue\": 100,\n        \"minValue\": 0,\n        \"show\": false,\n        \"thresholdLabels\": false,\n        \"thresholdMarkers\": true\n      },\n      \"gridPos\": {\n        \"h\": 4,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 7\n      },\n      \"id\": 85,\n      \"interval\": null,\n      \"links\": [],\n      \"mappingType\": 1,\n      \"mappingTypes\": [\n        {\n          \"name\": \"value to text\",\n          \"value\": 1\n        },\n        {\n          \"name\": \"range to text\",\n          \"value\": 2\n        }\n      ],\n      \"maxDataPoints\": 100,\n      \"nullPointMode\": \"connected\",\n      \"nullText\": null,\n      \"postfix\": \"\",\n      \"postfixFontSize\": \"50%\",\n      \"prefix\": \"\",\n      \"prefixFontSize\": \"50%\",\n      \"rangeMaps\": [\n        {\n          \"from\": \"null\",\n          \"text\": \"N/A\",\n          \"to\": \"null\"\n        }\n      ],\n      \"sparkline\": {\n        \"fillColor\": \"rgba(31, 118, 189, 0.18)\",\n        \"full\": true,\n        \"lineColor\": \"rgb(31, 120, 193)\",\n        \"show\": true\n      },\n      \"tableColumn\": \"\",\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(istio_tcp_sent_bytes_total{reporter=\\\"source\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\"}[1m])) + sum(irate(istio_tcp_received_bytes_total{reporter=\\\"source\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": \"\",\n      \"title\": \"TCP Client Traffic\",\n      \"transparent\": false,\n      \"type\": \"singlestat\",\n      \"valueFontSize\": \"80%\",\n      \"valueMaps\": [\n        {\n          \"op\": \"=\",\n          \"text\": \"N/A\",\n          \"value\": \"null\"\n        }\n      ],\n      \"valueName\": \"avg\"\n    },\n    {\n      \"content\": \"<div class=\\\"dashboard-header text-center\\\">\\n<span>INBOUND WORKLOADS</span>\\n</div>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 11\n      },\n      \"id\": 45,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 0,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 14\n      },\n      \"id\": 25,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null as zero\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{connection_security_policy=\\\"mutual_tls\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\", reporter=\\\"destination\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace, response_code), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace }} : {{ response_code }} (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{connection_security_policy!=\\\"mutual_tls\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\", reporter=\\\"destination\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace, response_code), 0.001)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace }} : {{ response_code }}\",\n          \"refId\": \"A\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Requests by Source And Response Code\",\n      \"tooltip\": {\n        \"shared\": false,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": [\n          \"total\"\n        ]\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 14\n      },\n      \"id\": 26,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\",response_code!~\\\"5.*\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace) / sum(rate(istio_requests_total{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace }} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\",response_code!~\\\"5.*\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace) / sum(rate(istio_requests_total{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[30s])) by (source_workload, source_workload_namespace)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace }}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Success Rate (non-5xx responses) By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"percentunit\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": \"1.01\",\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"description\": \"\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 20\n      },\n      \"id\": 27,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Request Duration by Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 20\n      },\n      \"id\": 28,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}}  P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}}  P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Request Size By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 20\n      },\n      \"id\": 68,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}}  P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}}  P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_response_bytes_bucket{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload=~\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{source_workload}}.{{source_workload_namespace}} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Response Size By Source\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 26\n      },\n      \"id\": 80,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_received_bytes_total{reporter=\\\"destination\\\", connection_security_policy=\\\"mutual_tls\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace}} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_received_bytes_total{reporter=\\\"destination\\\", connection_security_policy!=\\\"mutual_tls\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace}}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes Received from Incoming TCP Connection\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 26\n      },\n      \"id\": 82,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_sent_bytes_total{connection_security_policy=\\\"mutual_tls\\\", reporter=\\\"destination\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace}} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_sent_bytes_total{connection_security_policy!=\\\"mutual_tls\\\", reporter=\\\"destination\\\", destination_workload_namespace=~\\\"$namespace\\\", destination_workload=~\\\"$workload\\\", source_workload=~\\\"$srcwl\\\", source_workload_namespace=~\\\"$srcns\\\"}[1m])) by (source_workload, source_workload_namespace), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ source_workload }}.{{ source_workload_namespace}}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes Sent to Incoming TCP Connection\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"content\": \"<div class=\\\"dashboard-header text-center\\\">\\n<span>OUTBOUND SERVICES</span>\\n</div>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 32\n      },\n      \"id\": 69,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 0,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 35\n      },\n      \"id\": 70,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null as zero\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{connection_security_policy=\\\"mutual_tls\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\", reporter=\\\"source\\\", destination_service=~\\\"$dstsvc\\\"}[30s])) by (destination_service, response_code), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} : {{ response_code }} (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_requests_total{connection_security_policy!=\\\"mutual_tls\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\", reporter=\\\"source\\\", destination_service=~\\\"$dstsvc\\\"}[30s])) by (destination_service, response_code), 0.001)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} : {{ response_code }}\",\n          \"refId\": \"A\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Outgoing Requests by Destination And Response Code\",\n      \"tooltip\": {\n        \"shared\": false,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": [\n          \"total\"\n        ]\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 35\n      },\n      \"id\": 71,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\",response_code!~\\\"5.*\\\", destination_service=~\\\"$dstsvc\\\"}[30s])) by (destination_service) / sum(rate(istio_requests_total{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\", destination_service=~\\\"$dstsvc\\\"}[30s])) by (destination_service)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"sum(rate(istio_requests_total{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\",response_code!~\\\"5.*\\\", destination_service=~\\\"$dstsvc\\\"}[30s])) by (destination_service) / sum(rate(istio_requests_total{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\", destination_service=~\\\"$dstsvc\\\"}[30s])) by (destination_service)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{destination_service }}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Outgoing Success Rate (non-5xx responses) By Destination\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"percentunit\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": \"1.01\",\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"description\": \"\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 41\n      },\n      \"id\": 72,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"hideZero\": false,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_duration_seconds_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Outgoing Request Duration by Destination\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 41\n      },\n      \"id\": 73,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_request_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Outgoing Request Size By Destination\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 41\n      },\n      \"id\": 74,\n      \"legend\": {\n        \"alignAsTable\": false,\n        \"avg\": false,\n        \"current\": false,\n        \"hideEmpty\": true,\n        \"max\": false,\n        \"min\": false,\n        \"rightSide\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P50 (🔐mTLS)\",\n          \"refId\": \"D\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P90 (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P95 (🔐mTLS)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }}  P99 (🔐mTLS)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.50, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P50\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.90, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P90\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.95, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P95\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(istio_response_bytes_bucket{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service, le))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} P99\",\n          \"refId\": \"H\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Response Size By Destination\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"decbytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 47\n      },\n      \"id\": 76,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_sent_bytes_total{connection_security_policy=\\\"mutual_tls\\\", reporter=\\\"source\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_sent_bytes_total{connection_security_policy!=\\\"mutual_tls\\\", reporter=\\\"source\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes Sent on Outgoing TCP Connection\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 47\n      },\n      \"id\": 78,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_received_bytes_total{reporter=\\\"source\\\", connection_security_policy=\\\"mutual_tls\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }} (🔐mTLS)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"round(sum(irate(istio_tcp_received_bytes_total{reporter=\\\"source\\\", connection_security_policy!=\\\"mutual_tls\\\", source_workload_namespace=~\\\"$namespace\\\", source_workload=~\\\"$workload\\\", destination_service=~\\\"$dstsvc\\\"}[1m])) by (destination_service), 0.001)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ destination_service }}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Bytes Received from Outgoing TCP Connection\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"Bps\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": \"0\",\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ]\n    }\n  ],\n  \"refresh\": \"10s\",\n  \"schemaVersion\": 16,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": [\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Namespace\",\n        \"multi\": false,\n        \"name\": \"namespace\",\n        \"options\": [],\n        \"query\": \"query_result(sum(istio_requests_total) by (destination_workload_namespace) or sum(istio_tcp_sent_bytes_total) by (destination_workload_namespace))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*_namespace=\\\"([^\\\"]*).*/\",\n        \"sort\": 0,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": false,\n        \"label\": \"Workload\",\n        \"multi\": false,\n        \"name\": \"workload\",\n        \"options\": [],\n        \"query\": \"query_result((sum(istio_requests_total{destination_workload_namespace=~\\\"$namespace\\\"}) by (destination_workload) or sum(istio_requests_total{source_workload_namespace=~\\\"$namespace\\\"}) by (source_workload)) or (sum(istio_tcp_sent_bytes_total{destination_workload_namespace=~\\\"$namespace\\\"}) by (destination_workload) or sum(istio_tcp_sent_bytes_total{source_workload_namespace=~\\\"$namespace\\\"}) by (source_workload)))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*workload=\\\"([^\\\"]*).*/\",\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Inbound Workload Namespace\",\n        \"multi\": true,\n        \"name\": \"srcns\",\n        \"options\": [],\n        \"query\": \"query_result( sum(istio_requests_total{reporter=\\\"destination\\\", destination_workload=\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\"}) by (source_workload_namespace) or sum(istio_tcp_sent_bytes_total{reporter=\\\"destination\\\", destination_workload=\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\"}) by (source_workload_namespace))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*namespace=\\\"([^\\\"]*).*/\",\n        \"sort\": 2,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Inbound Workload\",\n        \"multi\": true,\n        \"name\": \"srcwl\",\n        \"options\": [],\n        \"query\": \"query_result( sum(istio_requests_total{reporter=\\\"destination\\\", destination_workload=\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload_namespace=~\\\"$srcns\\\"}) by (source_workload) or sum(istio_tcp_sent_bytes_total{reporter=\\\"destination\\\", destination_workload=\\\"$workload\\\", destination_workload_namespace=~\\\"$namespace\\\", source_workload_namespace=~\\\"$srcns\\\"}) by (source_workload))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*workload=\\\"([^\\\"]*).*/\",\n        \"sort\": 3,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      },\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Destination Service\",\n        \"multi\": true,\n        \"name\": \"dstsvc\",\n        \"options\": [],\n        \"query\": \"query_result( sum(istio_requests_total{reporter=\\\"source\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\"}) by (destination_service) or sum(istio_tcp_sent_bytes_total{reporter=\\\"source\\\", source_workload=~\\\"$workload\\\", source_workload_namespace=~\\\"$namespace\\\"}) by (destination_service))\",\n        \"refresh\": 1,\n        \"regex\": \"/.*destination_service=\\\"([^\\\"]*).*/\",\n        \"sort\": 4,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-5m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"\",\n  \"title\": \"Istio Workload Dashboard\",\n  \"uid\": \"UbsSZTDik\",\n  \"version\": 1\n}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/dashboards/mixer-dashboard.json",
    "content": "{\n  \"__inputs\": [\n    {\n      \"name\": \"DS_PROMETHEUS\",\n      \"label\": \"Prometheus\",\n      \"description\": \"\",\n      \"type\": \"datasource\",\n      \"pluginId\": \"prometheus\",\n      \"pluginName\": \"Prometheus\"\n    }\n  ],\n  \"__requires\": [\n    {\n      \"type\": \"grafana\",\n      \"id\": \"grafana\",\n      \"name\": \"Grafana\",\n      \"version\": \"5.2.2\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"graph\",\n      \"name\": \"Graph\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"datasource\",\n      \"id\": \"prometheus\",\n      \"name\": \"Prometheus\",\n      \"version\": \"5.0.0\"\n    },\n    {\n      \"type\": \"panel\",\n      \"id\": \"text\",\n      \"name\": \"Text\",\n      \"version\": \"5.0.0\"\n    }\n  ],\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": false,\n  \"gnetId\": null,\n  \"graphTooltip\": 1,\n  \"id\": null,\n  \"iteration\": 1535646398209,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"content\": \"<center><h2>Resource Usage</h2></center>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"height\": \"40\",\n      \"id\": 29,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 3\n      },\n      \"id\": 5,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(process_virtual_memory_bytes{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Virtual Memory ({{ job }})\",\n          \"refId\": \"I\"\n        },\n        {\n          \"expr\": \"sum(process_resident_memory_bytes{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Resident Memory ({{ job }})\",\n          \"refId\": \"H\"\n        },\n        {\n          \"expr\": \"sum(go_memstats_heap_sys_bytes{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"heap sys ({{ job }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"sum(go_memstats_heap_alloc_bytes{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"heap alloc ({{ job }})\",\n          \"refId\": \"D\"\n        },\n        {\n          \"expr\": \"sum(go_memstats_alloc_bytes{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Alloc ({{ job }})\",\n          \"refId\": \"F\"\n        },\n        {\n          \"expr\": \"sum(go_memstats_heap_inuse_bytes{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Heap in-use ({{ job }})\",\n          \"refId\": \"E\"\n        },\n        {\n          \"expr\": \"sum(go_memstats_stack_inuse_bytes{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Stack in-use ({{ job }})\",\n          \"refId\": \"G\"\n        },\n        {\n          \"expr\": \"sum(label_replace(container_memory_usage_bytes{container_name=~\\\"mixer|istio-proxy\\\", pod_name=~\\\"istio-telemetry-.*|istio-policy-.*\\\"}, \\\"service\\\", \\\"$1\\\" , \\\"pod_name\\\", \\\"(istio-telemetry|istio-policy)-.*\\\")) by (service)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ service }} total (k8s)\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"sum(label_replace(container_memory_usage_bytes{container_name=~\\\"mixer|istio-proxy\\\", pod_name=~\\\"istio-telemetry-.*|istio-policy-.*\\\"}, \\\"service\\\", \\\"$1\\\" , \\\"pod_name\\\", \\\"(istio-telemetry|istio-policy)-.*\\\")) by (container_name, service)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ service }} - {{ container_name }} (k8s)\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Memory\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 3\n      },\n      \"id\": 6,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"label_replace(sum(rate(container_cpu_usage_seconds_total{container_name=~\\\"mixer|istio-proxy\\\", pod_name=~\\\"istio-telemetry-.*|istio-policy-.*\\\"}[1m])) by (pod_name), \\\"service\\\", \\\"$1\\\" , \\\"pod_name\\\", \\\"(istio-telemetry|istio-policy)-.*\\\")\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ service }} total (k8s)\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"label_replace(sum(rate(container_cpu_usage_seconds_total{container_name=~\\\"mixer|istio-proxy\\\", pod_name=~\\\"istio-telemetry-.*|istio-policy-.*\\\"}[1m])) by (container_name, pod_name), \\\"service\\\", \\\"$1\\\" , \\\"pod_name\\\", \\\"(istio-telemetry|istio-policy)-.*\\\")\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ service }} - {{ container_name }} (k8s)\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"sum(irate(process_cpu_seconds_total{job=~\\\"istio-telemetry|istio-policy\\\"}[1m])) by (job)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ job }} (self-reported)\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"CPU\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 3\n      },\n      \"id\": 7,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(process_open_fds{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Open FDs ({{ job }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"sum(label_replace(container_fs_usage_bytes{container_name=~\\\"mixer|istio-proxy\\\", pod_name=~\\\"istio-telemetry-.*|istio-policy-.*\\\"}, \\\"service\\\", \\\"$1\\\" , \\\"pod_name\\\", \\\"(istio-telemetry|istio-policy)-.*\\\")) by (container_name, service)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ service }} - {{ container_name }}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Disk\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"decimals\": null,\n          \"format\": \"none\",\n          \"label\": \"\",\n          \"logBase\": 1024,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 3\n      },\n      \"id\": 4,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": false,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(go_goroutines{job=~\\\"istio-telemetry|istio-policy\\\"}) by (job)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Number of Goroutines ({{ job }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Goroutines\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"content\": \"<center><h2>Mixer Overview</h2></center>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"height\": \"40px\",\n      \"id\": 30,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 13\n      },\n      \"id\": 9,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(grpc_server_handled_total[1m]))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"mixer (Total)\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"sum(rate(grpc_server_handled_total[1m])) by (grpc_method)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"mixer ({{ grpc_method }})\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Incoming Requests\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 13\n      },\n      \"id\": 8,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [\n        {\n          \"alias\": \"{}\",\n          \"yaxis\": 1\n        }\n      ],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.5, sum(rate(grpc_server_handling_seconds_bucket{}[1m])) by (grpc_method, le)) * 1000\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ grpc_method }} 0.5\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.9, sum(rate(grpc_server_handling_seconds_bucket{}[1m])) by (grpc_method, le)) * 1000\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ grpc_method }} 0.9\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(rate(grpc_server_handling_seconds_bucket{}[1m])) by (grpc_method, le)) * 1000\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ grpc_method }} 0.99\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Response Durations\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ms\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 13\n      },\n      \"id\": 11,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(grpc_server_handled_total{grpc_code=~\\\"Unknown|Unimplemented|Internal|DataLoss\\\"}[1m])) by (grpc_method)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Mixer {{ grpc_method }}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Server Error Rate (5xx responses)\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 13\n      },\n      \"id\": 12,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(grpc_server_handled_total{grpc_code!=\\\"OK\\\",grpc_service=~\\\".*Mixer\\\"}[1m])) by (grpc_method)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Mixer {{ grpc_method }}\",\n          \"refId\": \"B\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Non-successes (4xxs)\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"content\": \"<center><h2>Adapters and Config</h2></center>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"id\": 28,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 22\n      },\n      \"id\": 13,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(mixer_runtime_dispatch_count{adapter=~\\\"$adapter\\\"}[1m])) by (adapter)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ adapter }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Adapter Dispatch Count\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 22\n      },\n      \"id\": 14,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"histogram_quantile(0.5, sum(irate(mixer_runtime_dispatch_duration_bucket{adapter=~\\\"$adapter\\\"}[1m])) by (adapter, le))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ adapter }} - p50\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.9, sum(irate(mixer_runtime_dispatch_duration_bucket{adapter=~\\\"$adapter\\\"}[1m])) by (adapter, le))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ adapter }} - p90 \",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"histogram_quantile(0.99, sum(irate(mixer_runtime_dispatch_duration_bucket{adapter=~\\\"$adapter\\\"}[1m])) by (adapter, le))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ adapter }} - p99\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Adapter Dispatch Duration\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 1,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 29\n      },\n      \"id\": 60,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"scalar(topk(1, max(mixer_config_rule_config_count) by (configID)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Rules\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"scalar(topk(1, max(mixer_config_rule_config_error_count) by (configID)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Config Errors\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"scalar(topk(1, max(mixer_config_rule_config_match_error_count) by (configID)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Match Errors\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"scalar(topk(1, max(mixer_config_unsatisfied_action_handler_count) by (configID)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Unsatisfied Actions\",\n          \"refId\": \"D\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Rules\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 29\n      },\n      \"id\": 56,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"scalar(topk(1, max(mixer_config_instance_config_count) by (configID)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Instances\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Instances in Latest Config\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 29\n      },\n      \"id\": 54,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"scalar(topk(1, max(mixer_config_handler_config_count) by (configID)))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Handlers\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Handlers in Latest Config\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 29\n      },\n      \"id\": 58,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"scalar(topk(1, max(mixer_config_attribute_count) by (configID)))\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Attributes\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Attributes in Latest Config\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"content\": \"<center><h2>Individual Adapters</h2></center>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 36\n      },\n      \"id\": 23,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"collapsed\": false,\n      \"gridPos\": {\n        \"h\": 1,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 39\n      },\n      \"id\": 46,\n      \"panels\": [],\n      \"repeat\": \"adapter\",\n      \"title\": \"$adapter Adapter\",\n      \"type\": \"row\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 40\n      },\n      \"id\": 17,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"label_replace(irate(mixer_runtime_dispatch_count{adapter=\\\"$adapter\\\"}[1m]),\\\"handler\\\", \\\"$1 ($3)\\\", \\\"handler\\\", \\\"(.*)\\\\\\\\.(.*)\\\\\\\\.(.*)\\\")\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ handler }} (error: {{  error }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Dispatch Count By Handler\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 40\n      },\n      \"id\": 18,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"label_replace(histogram_quantile(0.5, sum(rate(mixer_runtime_dispatch_duration_bucket{adapter=\\\"$adapter\\\"}[1m])) by (handler, error, le)),  \\\"handler_short\\\", \\\"$1 ($3)\\\", \\\"handler\\\", \\\"(.*)\\\\\\\\.(.*)\\\\\\\\.(.*)\\\")\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"p50 - {{ handler_short }} (error: {{ error }})\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"label_replace(histogram_quantile(0.9, sum(irate(mixer_runtime_dispatch_duration_bucket{adapter=\\\"$adapter\\\"}[1m])) by (handler, error, le)),  \\\"handler_short\\\", \\\"$1 ($3)\\\", \\\"handler\\\", \\\"(.*)\\\\\\\\.(.*)\\\\\\\\.(.*)\\\")\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"p90 - {{ handler_short }} (error: {{ error }})\",\n          \"refId\": \"D\"\n        },\n        {\n          \"expr\": \"label_replace(histogram_quantile(0.99, sum(irate(mixer_runtime_dispatch_duration_bucket{adapter=\\\"$adapter\\\"}[1m])) by (handler, error, le)),  \\\"handler_short\\\", \\\"$1 ($3)\\\", \\\"handler\\\", \\\"(.*)\\\\\\\\.(.*)\\\\\\\\.(.*)\\\")\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"p99 - {{ handler_short }} (error: {{ error }})\",\n          \"refId\": \"E\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Dispatch Duration By Handler\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"s\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    }\n  ],\n  \"refresh\": \"5s\",\n  \"schemaVersion\": 16,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": [\n      {\n        \"allValue\": null,\n        \"current\": {},\n        \"datasource\": \"Prometheus\",\n        \"hide\": 0,\n        \"includeAll\": true,\n        \"label\": \"Adapter\",\n        \"multi\": true,\n        \"name\": \"adapter\",\n        \"options\": [],\n        \"query\": \"label_values(adapter)\",\n        \"refresh\": 2,\n        \"regex\": \"\",\n        \"sort\": 1,\n        \"tagValuesQuery\": \"\",\n        \"tags\": [],\n        \"tagsQuery\": \"\",\n        \"type\": \"query\",\n        \"useTags\": false\n      }\n    ]\n  },\n  \"time\": {\n    \"from\": \"now-5m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"\",\n  \"title\": \"Mixer Dashboard\",\n  \"uid\": \"2\",\n  \"version\": 2\n}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/dashboards/pilot-dashboard.json",
    "content": "{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": \"-- Grafana --\",\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations & Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": false,\n  \"gnetId\": null,\n  \"graphTooltip\": 1,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"content\": \"<center><h2>Resource Usage</h2></center>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"height\": \"40\",\n      \"id\": 29,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 0,\n        \"y\": 3\n      },\n      \"id\": 5,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"process_virtual_memory_bytes{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Virtual Memory\",\n          \"refId\": \"I\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"process_resident_memory_bytes{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Resident Memory\",\n          \"refId\": \"H\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"go_memstats_heap_sys_bytes{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"heap sys\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"go_memstats_heap_alloc_bytes{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"heap alloc\",\n          \"refId\": \"D\"\n        },\n        {\n          \"expr\": \"go_memstats_alloc_bytes{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Alloc\",\n          \"refId\": \"F\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"go_memstats_heap_inuse_bytes{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Heap in-use\",\n          \"refId\": \"E\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"go_memstats_stack_inuse_bytes{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Stack in-use\",\n          \"refId\": \"G\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"sum(container_memory_usage_bytes{container_name=~\\\"discovery|istio-proxy\\\", pod_name=~\\\"istio-pilot-.*\\\"})\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Total (k8s)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"container_memory_usage_bytes{container_name=~\\\"discovery|istio-proxy\\\", pod_name=~\\\"istio-pilot-.*\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ container_name }} (k8s)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Memory\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 6,\n        \"y\": 3\n      },\n      \"id\": 6,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{container_name=~\\\"discovery|istio-proxy\\\", pod_name=~\\\"istio-pilot-.*\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Total (k8s)\",\n          \"refId\": \"A\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"sum(rate(container_cpu_usage_seconds_total{container_name=~\\\"discovery|istio-proxy\\\", pod_name=~\\\"istio-pilot-.*\\\"}[1m])) by (container_name)\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ container_name }} (k8s)\",\n          \"refId\": \"B\",\n          \"step\": 2\n        },\n        {\n          \"expr\": \"irate(process_cpu_seconds_total{job=\\\"pilot\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"pilot (self-reported)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"CPU\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 3\n      },\n      \"id\": 7,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"process_open_fds{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Open FDs (pilot)\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"container_fs_usage_bytes{container_name=~\\\"discovery|istio-proxy\\\", pod_name=~\\\"istio-pilot-.*\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"{{ container_name }}\",\n          \"refId\": \"B\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Disk\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"bytes\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"decimals\": null,\n          \"format\": \"none\",\n          \"label\": \"\",\n          \"logBase\": 1024,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 3\n      },\n      \"id\": 4,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": false,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"go_goroutines{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Number of Goroutines\",\n          \"refId\": \"A\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Goroutines\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": \"\",\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"content\": \"<center><h2>xDS</h2></center>\",\n      \"gridPos\": {\n        \"h\": 3,\n        \"w\": 24,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"id\": 28,\n      \"links\": [],\n      \"mode\": \"html\",\n      \"title\": \"\",\n      \"transparent\": true,\n      \"type\": \"text\"\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 13\n      },\n      \"id\": 40,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(irate(envoy_cluster_update_success{cluster_name=\\\"xds-grpc\\\"}[1m]))\",\n          \"format\": \"time_series\",\n          \"hide\": false,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"XDS GRPC Successes\",\n          \"refId\": \"C\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Updates\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 13\n      },\n      \"id\": 42,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"round(sum(rate(envoy_cluster_update_attempt{cluster_name=\\\"xds-grpc\\\"}[1m])) - sum(rate(envoy_cluster_update_success{cluster_name=\\\"xds-grpc\\\"}[1m])))\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"XDS GRPC \",\n          \"refId\": \"A\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Failures\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"ops\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": false\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 6,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 13\n      },\n      \"id\": 41,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(envoy_cluster_upstream_cx_active{cluster_name=\\\"xds-grpc\\\"})\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 2,\n          \"legendFormat\": \"Pilot (XDS GRPC)\",\n          \"refId\": \"C\",\n          \"step\": 2\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Active Connections\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 19\n      },\n      \"id\": 45,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"pilot_conflict_inbound_listener{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Inbound Listeners\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"pilot_conflict_outbound_listener_http_over_current_tcp{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Outbound Listeners (http over current tcp)\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"pilot_conflict_outbound_listener_tcp_over_current_tcp{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Outbound Listeners (tcp over current tcp)\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"pilot_conflict_outbound_listener_tcp_over_current_http{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Outbound Listeners (tcp over current http)\",\n          \"refId\": \"D\"\n        },\n        {\n          \"expr\": \"pilot_conf_filter_chains{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Filter Chains\",\n          \"refId\": \"E\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Conflicts\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 19\n      },\n      \"id\": 47,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"pilot_virt_services{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Virtual Services\",\n          \"refId\": \"A\"\n        },\n        {\n          \"expr\": \"pilot_services{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Services\",\n          \"refId\": \"B\"\n        },\n        {\n          \"expr\": \"label_replace(sum(pilot_xds_cds_reject{job=\\\"pilot\\\"}) by (node, err), \\\"node\\\", \\\"$1\\\", \\\"node\\\", \\\".*~.*~(.*)~.*\\\")\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Rejected CDS Configs - {{ node }}: {{ err }}\",\n          \"refId\": \"C\"\n        },\n        {\n          \"expr\": \"pilot_xds_eds_reject{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"hide\": true,\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Rejected EDS Configs\",\n          \"refId\": \"D\"\n        },\n        {\n          \"expr\": \"pilot_xds{job=\\\"pilot\\\"}\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Connected Endpoints\",\n          \"refId\": \"E\"\n        },\n        {\n          \"expr\": \"rate(pilot_xds_write_timeout{job=\\\"pilot\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Write Timeouts\",\n          \"refId\": \"F\"\n        },\n        {\n          \"expr\": \"rate(pilot_xds_push_timeout{job=\\\"pilot\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Push Timeouts\",\n          \"refId\": \"G\"\n        },\n        {\n          \"expr\": \"rate(pilot_xds_pushes{job=\\\"pilot\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Pushes ({{ type }})\",\n          \"refId\": \"H\"\n        },\n        {\n          \"expr\": \"rate(pilot_xds_push_errors{job=\\\"pilot\\\"}[1m])\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"Push Errors ({{ type }})\",\n          \"refId\": \"I\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"ADS Monitoring\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 19\n      },\n      \"id\": 49,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"label_replace(sum(pilot_xds_cds_reject{job=\\\"pilot\\\"}) by (node, err), \\\"node\\\", \\\"$1\\\", \\\"node\\\", \\\".*~.*~(.*)~.*\\\")\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ node }}  ({{ err }})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Rejected CDS Configs\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 27\n      },\n      \"id\": 52,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"label_replace(sum(pilot_xds_eds_reject{job=\\\"pilot\\\"}) by (node, err), \\\"node\\\", \\\"$1\\\", \\\"node\\\", \\\".*~.*~(.*)~.*\\\")\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ node }} ({{err}})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Rejected EDS Configs\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 8,\n        \"y\": 27\n      },\n      \"id\": 54,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"label_replace(sum(pilot_xds_lds_reject{job=\\\"pilot\\\"}) by (node, err), \\\"node\\\", \\\"$1\\\", \\\"node\\\", \\\".*~.*~(.*)~.*\\\")\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ node }} ({{err}})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Rejected LDS Configs\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {},\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 16,\n        \"y\": 27\n      },\n      \"id\": 53,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"label_replace(sum(pilot_xds_rds_reject{job=\\\"pilot\\\"}) by (node, err), \\\"node\\\", \\\"$1\\\", \\\"node\\\", \\\".*~.*~(.*)~.*\\\")\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ node }} ({{err}})\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"Rejected RDS Configs\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    },\n    {\n      \"aliasColors\": {\n        \"outbound|80||default-http-backend.kube-system.svc.cluster.local\": \"rgba(255, 255, 255, 0.97)\"\n      },\n      \"bars\": false,\n      \"dashLength\": 10,\n      \"dashes\": false,\n      \"datasource\": \"Prometheus\",\n      \"fill\": 1,\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 8,\n        \"x\": 0,\n        \"y\": 34\n      },\n      \"id\": 51,\n      \"legend\": {\n        \"avg\": false,\n        \"current\": false,\n        \"max\": false,\n        \"min\": false,\n        \"show\": true,\n        \"total\": false,\n        \"values\": false\n      },\n      \"lines\": true,\n      \"linewidth\": 1,\n      \"links\": [],\n      \"nullPointMode\": \"null\",\n      \"percentage\": false,\n      \"pointradius\": 5,\n      \"points\": false,\n      \"renderer\": \"flot\",\n      \"seriesOverrides\": [\n        {\n          \"alias\": \"outbound|80||default-http-backend.kube-system.svc.cluster.local\",\n          \"yaxis\": 1\n        }\n      ],\n      \"spaceLength\": 10,\n      \"stack\": false,\n      \"steppedLine\": false,\n      \"targets\": [\n        {\n          \"expr\": \"sum(pilot_xds_eds_instances{job=\\\"pilot\\\"}) by (cluster)\",\n          \"format\": \"time_series\",\n          \"intervalFactor\": 1,\n          \"legendFormat\": \"{{ cluster }}\",\n          \"refId\": \"A\"\n        }\n      ],\n      \"thresholds\": [],\n      \"timeFrom\": null,\n      \"timeShift\": null,\n      \"title\": \"EDS Instances\",\n      \"tooltip\": {\n        \"shared\": true,\n        \"sort\": 0,\n        \"value_type\": \"individual\"\n      },\n      \"type\": \"graph\",\n      \"xaxis\": {\n        \"buckets\": null,\n        \"mode\": \"time\",\n        \"name\": null,\n        \"show\": true,\n        \"values\": []\n      },\n      \"yaxes\": [\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        },\n        {\n          \"format\": \"short\",\n          \"label\": null,\n          \"logBase\": 1,\n          \"max\": null,\n          \"min\": null,\n          \"show\": true\n        }\n      ],\n      \"yaxis\": {\n        \"align\": false,\n        \"alignLevel\": null\n      }\n    }\n  ],\n  \"refresh\": \"5s\",\n  \"schemaVersion\": 16,\n  \"style\": \"dark\",\n  \"tags\": [],\n  \"templating\": {\n    \"list\": []\n  },\n  \"time\": {\n    \"from\": \"now-5m\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {\n    \"refresh_intervals\": [\n      \"5s\",\n      \"10s\",\n      \"30s\",\n      \"1m\",\n      \"5m\",\n      \"15m\",\n      \"30m\",\n      \"1h\",\n      \"2h\",\n      \"1d\"\n    ],\n    \"time_options\": [\n      \"5m\",\n      \"15m\",\n      \"1h\",\n      \"6h\",\n      \"12h\",\n      \"24h\",\n      \"2d\",\n      \"7d\",\n      \"30d\"\n    ]\n  },\n  \"timezone\": \"browser\",\n  \"title\": \"Pilot Dashboard\",\n  \"uid\": \"3\",\n  \"version\": 1\n}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"grafana.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"grafana.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/configmap-custom-resources.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-grafana-custom-resources\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: grafana\ndata:\n  custom-resources.yaml: |-\n    {{- include \"grafana-default.yaml.tpl\" . | indent 4}}\n  run.sh: |-\n    {{- include \"install-custom-resources.sh.tpl\" . | indent 4}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/configmap-dashboards.yaml",
    "content": "---\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-grafana-configuration-dashboards\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: grafana\n\ndata:\n  {{- $files := .Files }}\n  {{ range $path, $bytes := .Files.Glob \"dashboards/*.json\" }}\n  {{ base $path }}: '{{ $files.Get $path }}'\n  {{ end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-grafana\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: grafana\ndata:\n{{- if .Values.datasources }}\n  {{- range $key, $value := .Values.datasources }}\n  {{ $key }}: |\n{{ toYaml $value | indent 4 }}\n  {{- end -}}\n{{- end -}}\n\n{{- if .Values.dashboardProviders }}\n  {{- range $key, $value := .Values.dashboardProviders }}\n  {{ $key }}: |\n{{ toYaml $value | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/create-custom-resources-job.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: istio-grafana-post-install-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-grafana-post-install-{{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"authentication.istio.io\"] # needed to create default authn policy\n  resources: [\"*\"]\n  verbs: [\"*\"]\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-grafana-post-install-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-grafana-post-install-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-grafana-post-install-account\n    namespace: {{ .Release.Namespace }}\n---\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: istio-grafana-post-install\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-install\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  template:\n    metadata:\n      name: istio-grafana-post-install\n      labels:\n        app: istio-grafana\n        release: {{ .Release.Name }}\n    spec:\n      serviceAccountName: istio-grafana-post-install-account\n      containers:\n        - name: hyperkube\n          image: \"{{ .Values.global.hyperkube.hub }}/hyperkube:{{ .Values.global.hyperkube.tag }}\"\n          command: [ \"/bin/bash\", \"/tmp/grafana/run.sh\", \"/tmp/grafana/custom-resources.yaml\" ]\n          volumeMounts:\n            - mountPath: \"/tmp/grafana\"\n              name: tmp-configmap-grafana\n      volumes:\n        - name: tmp-configmap-grafana\n          configMap:\n            name: istio-grafana-custom-resources\n      restartPolicy: OnFailure\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: grafana\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        app: grafana\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: {{ .Chart.Name }}\n          image: \"{{ .Values.image.repository }}:{{ .Values.image.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n            - containerPort: {{ .Values.service.internalPort }}\n          readinessProbe:\n            httpGet:\n              path: /login\n              port: {{ .Values.service.internalPort }}\n          env:\n          - name: GRAFANA_PORT\n            value: {{ .Values.service.internalPort | quote }}\n{{- if .Values.security.enabled }}\n          - name: GF_SECURITY_ADMIN_USER\n            valueFrom:\n              secretKeyRef:\n                name: grafana\n                key: username\n          - name: GF_SECURITY_ADMIN_PASSWORD\n            valueFrom:\n              secretKeyRef:\n                name: grafana\n                key: password\n          - name: GF_AUTH_BASIC_ENABLED\n            value: \"true\"\n          - name: GF_AUTH_ANONYMOUS_ENABLED\n            value: \"false\"\n          - name: GF_AUTH_DISABLE_LOGIN_FORM\n            value: \"false\"\n{{- else }}\n          - name: GF_AUTH_BASIC_ENABLED\n            value: \"false\"\n          - name: GF_AUTH_ANONYMOUS_ENABLED\n            value: \"true\"\n          - name: GF_AUTH_ANONYMOUS_ORG_ROLE\n            value: Admin\n{{- end }}\n          - name: GF_PATHS_DATA\n            value: /data/grafana\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          volumeMounts:\n          - name: data\n            mountPath: /data/grafana\n          - name: dashboards-istio\n            mountPath: \"/var/lib/grafana/dashboards/istio\"\n          - name: config\n            mountPath: \"/etc/grafana/provisioning/datasources/datasources.yaml\"\n            subPath: datasources.yaml\n          - name: config\n            mountPath: \"/etc/grafana/provisioning/dashboards/dashboardproviders.yaml\"\n            subPath: dashboardproviders.yaml\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n      volumes:\n      - name: config\n        configMap:\n          name: istio-grafana\n      - name: data\n{{- if .Values.persist }}\n        persistentVolumeClaim:\n          claimName: istio-grafana-pvc\n{{- else }}\n        emptyDir: {}\n      - name: dashboards-istio\n        configMap:\n          name:  istio-grafana-configuration-dashboards\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/grafana-ports-mtls.yaml",
    "content": "{{ define \"grafana-default.yaml.tpl\" }}\napiVersion: authentication.istio.io/v1alpha1\nkind: Policy\nmetadata:\n  name: grafana-ports-mtls-disabled\n  namespace: {{ .Release.Namespace }}\nspec:\n  targets:\n  - name: grafana\n    ports:\n    - number: {{ .Values.service.externalPort }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/pvc.yaml",
    "content": "{{- if .Values.persist }}\nkind: PersistentVolumeClaim\napiVersion: v1\nmetadata:\n  name: istio-grafana-pvc\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  storageClassName: {{ .Values.storageClassName }}\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 5Gi\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/secret.yaml",
    "content": "\n{{- if .Values.security.enabled -}}\napiVersion: v1\nkind: Secret\nmetadata:\n  name: grafana\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: grafana\ntype: Opaque\ndata:\n  username: {{ .Values.security.adminUser | b64enc | quote }}\n  password: {{ .Values.security.adminPassword | b64enc | quote }}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: grafana\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    {{- range $key, $val := .Values.service.annotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  labels:\n    app: istio-grafana\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  type: {{ .Values.service.type }}\n  ports:\n    - port: {{ .Values.service.externalPort }}\n      targetPort: {{ .Values.service.internalPort }}\n      protocol: TCP\n      name: {{ .Values.service.name }}\n  selector:\n    app: grafana\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/grafana/values.yaml",
    "content": "datasources:\n  datasources.yaml:\n    apiVersion: 1\n    datasources:\n    - name: Prometheus\n      type: prometheus\n      orgId: 1\n      url: http://prometheus:9090\n      access: proxy\n      isDefault: true\n      jsonData:\n        timeInterval: 5s\n      editable: true\n\ndashboardProviders:\n  dashboardproviders.yaml:\n    apiVersion: 1\n    providers:\n    - name: 'istio'\n      orgId: 1\n      folder: 'istio'\n      type: file\n      disableDeletion: false\n      options:\n        path: /var/lib/grafana/dashboards/istio\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/ingress/Chart.yaml",
    "content": "apiVersion: v1\nname: ingress\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for ingress deployment\nkeywords:\n  - istio\n  - ingress\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/ingress/templates/autoscale.yaml",
    "content": "{{- if .Values.autoscaleMin }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n    name: istio-ingress\n    namespace: {{ .Release.Namespace }}\nspec:\n    maxReplicas: {{ .Values.autoscaleMax }}\n    minReplicas: {{ .Values.autoscaleMin }}\n    scaleTargetRef:\n      apiVersion: apps/v1beta1\n      kind: Deployment\n      name: istio-ingress\n    metrics:\n      - type: Resource\n        resource:\n          name: cpu\n          targetAverageUtilization: 80\n{{ end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/ingress/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n  name: istio-ingress-{{ .Release.Namespace }}\nrules:\n- apiGroups: [\"extensions\"]\n  resources: [\"thirdpartyresources\", \"ingresses\"]\n  verbs: [\"get\", \"watch\", \"list\", \"update\"]\n- apiGroups: [\"\"]\n  resources: [\"configmaps\", \"pods\", \"endpoints\", \"services\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/ingress/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-ingress-{{ .Release.Namespace }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-pilot-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-ingress-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/ingress/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-ingress\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: ingress\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        istio: ingress\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-ingress-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: {{ template \"istio.name\" . }}\n          image: \"{{ .Values.global.hub }}/proxyv2:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n            - containerPort: 80\n            - containerPort: 443\n          args:\n          - proxy\n          - ingress\n          - -v\n          - \"2\"\n          - --discoveryRefreshDelay\n          - '1s' #discoveryRefreshDelay\n          - --drainDuration\n          - '45s' #drainDuration\n          - --parentShutdownDuration\n          - '1m0s' #parentShutdownDuration\n          - --connectTimeout\n          - '10s' #connectTimeout\n          - --serviceCluster\n          - istio-ingress\n          - --zipkinAddress\n          - zipkin:9411\n        {{- if .Values.global.proxy.envoyStatsd.enabled }}\n          - --statsdUdpAddress\n          - {{ .Values.global.proxy.envoyStatsd.host }}:{{ .Values.global.proxy.envoyStatsd.port }}\n        {{- end }}\n          - --proxyAdminPort\n          - \"15000\"\n        {{- if .Values.global.controlPlaneSecurityEnabled }}\n          - --controlPlaneAuthPolicy\n          - MUTUAL_TLS\n          - --discoveryAddress\n          - istio-pilot:15005\n        {{- else }}\n          - --controlPlaneAuthPolicy\n          - NONE\n          - --discoveryAddress\n          - istio-pilot:8080\n        {{- end }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          env:\n          - name: POD_NAME\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.name\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: INSTANCE_IP\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: status.podIP\n          volumeMounts:\n          - name: istio-certs\n            mountPath: /etc/certs\n            readOnly: true\n          - name: ingress-certs\n            mountPath: /etc/istio/ingress-certs\n            readOnly: true\n      volumes:\n      - name: istio-certs\n        secret:\n          secretName: istio.istio-ingress-service-account\n          optional: true\n      - name: ingress-certs\n        secret:\n          secretName: istio-ingress-certs\n          optional: true\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/ingress/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: istio-ingress\n  namespace: {{ .Release.Namespace }}\n  labels:\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: ingress\n  annotations:\n    {{- range $key, $val := .Values.service.annotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\nspec:\n{{- if .Values.service.loadBalancerIP }}\n  loadBalancerIP: \"{{ .Values.service.loadBalancerIP }}\"\n{{- end }}\n  type: {{ .Values.service.type }}\n{{- if .Values.service.externalTrafficPolicy }}\n  externalTrafficPolicy: {{ .Values.service.externalTrafficPolicy }}\n{{- end }}\n  selector:\n    istio: ingress\n  ports:\n    {{- range $key, $val := .Values.service.ports }}\n    -\n      {{- range $pkey, $pval := $val }}\n      {{ $pkey}}: {{ $pval }}\n      {{- end }}\n    {{- end }}\n---\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/ingress/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-ingress-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/Chart.yaml",
    "content": "apiVersion: v1\ndescription: Kiali is an open source project for service mesh observability, refer to https://github.com/kiali/kiali for detail.\nname: kiali\nversion: 1.0.4\nappVersion: 0.9\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n  name: kiali\n  labels:\n    app: kiali\n    version: master\nrules:\n- apiGroups: [\"\", \"apps\", \"autoscaling\", \"batch\"]\n  resources:\n  - configmaps\n  - namespaces\n  - nodes\n  - pods\n  - projects\n  - services\n  - endpoints\n  - deployments\n  - horizontalpodautoscalers\n  - replicasets\n  - statefulsets\n  - replicationcontrollers\n  - jobs\n  - cronjobs\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups: [\"config.istio.io\"]\n  resources:\n  - rules\n  - circonuses\n  - deniers\n  - fluentds\n  - kubernetesenvs\n  - listcheckers\n  - memquotas\n  - opas\n  - prometheuses\n  - rbacs\n  - servicecontrols\n  - solarwindses\n  - stackdrivers\n  - statsds\n  - stdios\n  - apikeys\n  - authorizations\n  - checknothings\n  - kuberneteses\n  - listentries\n  - logentries\n  - metrics\n  - quotas\n  - reportnothings\n  - servicecontrolreports\n  - quotaspecs\n  - quotaspecbindings\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups: [\"networking.istio.io\"]\n  resources:\n  - virtualservices\n  - destinationrules\n  - serviceentries\n  - gateways\n  verbs:\n  - get\n  - list\n  - watch\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-kiali-admin-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: kiali\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: kiali\nsubjects:\n- kind: ServiceAccount\n  name: kiali-service-account\n  namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\ndata:\n  config.yaml: |\n    server:\n      port: 20001\n    external_services:\n      jaeger:\n        url: {{ .Values.dashboard.jaegerURL }}\n      grafana:\n        url: {{ .Values.dashboard.grafanaURL }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  selector:\n    matchLabels:\n      app: kiali\n  template:\n    metadata:\n      name: kiali\n      labels:\n        app: kiali\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: kiali-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n      - image: \"{{ .Values.hub }}/kiali:{{ .Values.tag }}\"\n        name: kiali\n        command:\n        - \"/opt/kiali/kiali\"\n        - \"-config\"\n        - \"/kiali-configuration/config.yaml\"\n        - \"-v\"\n        - \"4\"\n        env:\n        - name: ACTIVE_NAMESPACE\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n        - name: SERVER_CREDENTIALS_USERNAME\n          valueFrom:\n            secretKeyRef:\n              name: kiali\n              key: username\n        - name: SERVER_CREDENTIALS_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: kiali\n              key: passphrase\n        - name: PROMETHEUS_SERVICE_URL\n          value: http://prometheus:9090\n        volumeMounts:\n        - name: kiali-configuration\n          mountPath: \"/kiali-configuration\"\n        resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n      volumes:\n      - name: kiali-configuration\n        configMap:\n          name: kiali\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/templates/ingress.yaml",
    "content": "{{- if .Values.ingress.enabled -}}\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\n  annotations:\n    {{- range $key, $value := .Values.ingress.annotations }}\n      {{ $key }}: {{ $value | quote }}\n    {{- end }}\nspec:\n  rules:\n    {{- range $host := .Values.ingress.hosts }}\n    - host: {{ $host }}\n      http:\n        paths:\n          - path: /\n            backend:\n              serviceName: kiali\n              servicePort: 20001\n    {{- end -}}\n  {{- if .Values.ingress.tls }}\n  tls:\n{{ toYaml .Values.ingress.tls | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/templates/secrets.yaml",
    "content": "apiVersion: v1\nkind: Secret\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\n\ntype: Opaque\ndata:\n  username: {{ .Values.dashboard.username | b64enc | quote }}\n  passphrase: {{ .Values.dashboard.passphrase | b64enc | quote }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: kiali\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\nspec:\n  ports:\n  - name: tcp\n    protocol: TCP\n    port: 20001\n    name: http-kiali\n  selector:\n    app: kiali\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/kiali/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: kiali-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: kiali\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/Chart.yaml",
    "content": "apiVersion: v1\nname: mixer\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for mixer deployment\nkeywords:\n  - istio\n  - mixer\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"mixer.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"mixer.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/autoscale.yaml",
    "content": "{{- range $key, $spec := .Values }}\n{{- if or (eq $key \"istio-policy\") (eq $key \"istio-telemetry\") }}\n{{- if and $spec.autoscaleEnabled $spec.autoscaleMin }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n    name: {{ $key }}\n    namespace: {{ $.Release.Namespace }}\nspec:\n    maxReplicas: {{ $spec.autoscaleMax }}\n    minReplicas: {{ $spec.autoscaleMin }}\n    scaleTargetRef:\n      apiVersion: apps/v1beta1\n      kind: Deployment\n      name: {{ $key }}\n    metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        targetAverageUtilization: {{ $spec.cpu.targetAverageUtilization }}\n---\n{{- end }}\n{{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-mixer-{{ .Release.Namespace }}\n  labels:\n    app: {{ template \"mixer.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"config.istio.io\"] # istio CRD watcher\n  resources: [\"*\"]\n  verbs: [\"create\", \"get\", \"list\", \"watch\", \"patch\"]\n- apiGroups: [\"rbac.istio.io\"] # istio RBAC watcher\n  resources: [\"*\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"apiextensions.k8s.io\"]\n  resources: [\"customresourcedefinitions\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"\"]\n  resources: [\"configmaps\", \"endpoints\", \"pods\", \"services\", \"namespaces\", \"secrets\", \"replicationcontrollers\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"extensions\"]\n  resources: [\"replicasets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"apps\"]\n  resources: [\"replicasets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-mixer-admin-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: {{ template \"mixer.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-mixer-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-mixer-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/config.yaml",
    "content": "apiVersion: \"config.istio.io/v1alpha2\"\nkind: attributemanifest\nmetadata:\n  name: istioproxy\n  namespace: {{ .Release.Namespace }}\nspec:\n  attributes:\n    origin.ip:\n      valueType: IP_ADDRESS\n    origin.uid:\n      valueType: STRING\n    origin.user:\n      valueType: STRING\n    request.headers:\n      valueType: STRING_MAP\n    request.id:\n      valueType: STRING\n    request.host:\n      valueType: STRING\n    request.method:\n      valueType: STRING\n    request.path:\n      valueType: STRING\n    request.reason:\n      valueType: STRING\n    request.referer:\n      valueType: STRING\n    request.scheme:\n      valueType: STRING\n    request.total_size:\n          valueType: INT64\n    request.size:\n      valueType: INT64\n    request.time:\n      valueType: TIMESTAMP\n    request.useragent:\n      valueType: STRING\n    response.code:\n      valueType: INT64\n    response.duration:\n      valueType: DURATION\n    response.headers:\n      valueType: STRING_MAP\n    response.total_size:\n          valueType: INT64\n    response.size:\n      valueType: INT64\n    response.time:\n      valueType: TIMESTAMP\n    source.uid:\n      valueType: STRING\n    source.user: # DEPRECATED\n      valueType: STRING\n    source.principal:\n      valueType: STRING\n    destination.uid:\n      valueType: STRING\n    destination.principal:\n      valueType: STRING\n    destination.port:\n      valueType: INT64\n    connection.event:\n      valueType: STRING\n    connection.id:\n      valueType: STRING\n    connection.received.bytes:\n      valueType: INT64\n    connection.received.bytes_total:\n      valueType: INT64\n    connection.sent.bytes:\n      valueType: INT64\n    connection.sent.bytes_total:\n      valueType: INT64\n    connection.duration:\n      valueType: DURATION\n    connection.mtls:\n      valueType: BOOL\n    connection.requested_server_name:\n      valueType: STRING\n    context.protocol:\n      valueType: STRING\n    context.timestamp:\n      valueType: TIMESTAMP\n    context.time:\n      valueType: TIMESTAMP\n    # Deprecated, kept for compatibility\n    context.reporter.local:\n      valueType: BOOL\n    context.reporter.kind:\n      valueType: STRING\n    context.reporter.uid:\n      valueType: STRING\n    api.service:\n      valueType: STRING\n    api.version:\n      valueType: STRING\n    api.operation:\n      valueType: STRING\n    api.protocol:\n      valueType: STRING\n    request.auth.principal:\n      valueType: STRING\n    request.auth.audiences:\n      valueType: STRING\n    request.auth.presenter:\n      valueType: STRING\n    request.auth.claims:\n      valueType: STRING_MAP\n    request.auth.raw_claims:\n      valueType: STRING\n    request.api_key:\n      valueType: STRING\n\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: attributemanifest\nmetadata:\n  name: kubernetes\n  namespace: {{ .Release.Namespace }}\nspec:\n  attributes:\n    source.ip:\n      valueType: IP_ADDRESS\n    source.labels:\n      valueType: STRING_MAP\n    source.metadata:\n      valueType: STRING_MAP\n    source.name:\n      valueType: STRING\n    source.namespace:\n      valueType: STRING\n    source.owner:\n      valueType: STRING\n    source.service:  # DEPRECATED\n      valueType: STRING\n    source.serviceAccount:\n      valueType: STRING\n    source.services:\n      valueType: STRING\n    source.workload.uid:\n      valueType: STRING\n    source.workload.name:\n      valueType: STRING\n    source.workload.namespace:\n      valueType: STRING\n    destination.ip:\n      valueType: IP_ADDRESS\n    destination.labels:\n      valueType: STRING_MAP\n    destination.metadata:\n      valueType: STRING_MAP\n    destination.owner:\n      valueType: STRING\n    destination.name:\n      valueType: STRING\n    destination.container.name:\n      valueType: STRING\n    destination.namespace:\n      valueType: STRING\n    destination.service: # DEPRECATED\n      valueType: STRING\n    destination.service.uid:\n      valueType: STRING\n    destination.service.name:\n      valueType: STRING\n    destination.service.namespace:\n      valueType: STRING\n    destination.service.host:\n      valueType: STRING\n    destination.serviceAccount:\n      valueType: STRING\n    destination.workload.uid:\n      valueType: STRING\n    destination.workload.name:\n      valueType: STRING\n    destination.workload.namespace:\n      valueType: STRING\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: stdio\nmetadata:\n  name: handler\n  namespace: {{ .Release.Namespace }}\nspec:\n  outputAsJson: true\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: logentry\nmetadata:\n  name: accesslog\n  namespace: {{ .Release.Namespace }}\nspec:\n  severity: '\"Info\"'\n  timestamp: request.time\n  variables:\n    sourceIp: source.ip | ip(\"0.0.0.0\")\n    sourceApp: source.labels[\"app\"] | \"\"\n    sourcePrincipal: source.principal | \"\"\n    sourceName: source.name | \"\"\n    sourceWorkload: source.workload.name | \"\"\n    sourceNamespace: source.namespace | \"\"\n    sourceOwner: source.owner | \"\"\n    destinationApp: destination.labels[\"app\"] | \"\"\n    destinationIp: destination.ip | ip(\"0.0.0.0\")\n    destinationServiceHost: destination.service.host | \"\"\n    destinationWorkload: destination.workload.name | \"\"\n    destinationName: destination.name | \"\"\n    destinationNamespace: destination.namespace | \"\"\n    destinationOwner: destination.owner | \"\"\n    destinationPrincipal: destination.principal | \"\"\n    apiClaims: request.auth.raw_claims | \"\"\n    apiKey: request.api_key | request.headers[\"x-api-key\"] | \"\"\n    protocol: request.scheme | context.protocol | \"http\"\n    method: request.method | \"\"\n    url: request.path | \"\"\n    responseCode: response.code | 0\n    responseSize: response.size | 0\n    requestSize: request.size | 0\n    requestId: request.headers[\"x-request-id\"] | \"\"\n    clientTraceId: request.headers[\"x-client-trace-id\"] | \"\"\n    latency: response.duration | \"0ms\"\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n    requestedServerName: connection.requested_server_name | \"\"\n    userAgent: request.useragent | \"\"\n    responseTimestamp: response.time\n    receivedBytes: request.total_size | 0\n    sentBytes: response.total_size | 0\n    referer: request.referer | \"\"\n    httpAuthority: request.headers[\":authority\"] | request.host | \"\"\n    xForwardedFor: request.headers[\"x-forwarded-for\"] | \"0.0.0.0\"\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n  monitored_resource_type: '\"global\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: logentry\nmetadata:\n  name: tcpaccesslog\n  namespace: {{ .Release.Namespace }}\nspec:\n  severity: '\"Info\"'\n  timestamp: context.time | timestamp(\"2017-01-01T00:00:00Z\")\n  variables:\n    connectionEvent: connection.event | \"\"\n    sourceIp: source.ip | ip(\"0.0.0.0\")\n    sourceApp: source.labels[\"app\"] | \"\"\n    sourcePrincipal: source.principal | \"\"\n    sourceName: source.name | \"\"\n    sourceWorkload: source.workload.name | \"\"\n    sourceNamespace: source.namespace | \"\"\n    sourceOwner: source.owner | \"\"\n    destinationApp: destination.labels[\"app\"] | \"\"\n    destinationIp: destination.ip | ip(\"0.0.0.0\")\n    destinationServiceHost: destination.service.host | \"\"\n    destinationWorkload: destination.workload.name | \"\"\n    destinationName: destination.name | \"\"\n    destinationNamespace: destination.namespace | \"\"\n    destinationOwner: destination.owner | \"\"\n    destinationPrincipal: destination.principal | \"\"\n    protocol: context.protocol | \"tcp\"\n    connectionDuration: connection.duration | \"0ms\"\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n    requestedServerName: connection.requested_server_name | \"\"\n    receivedBytes: connection.received.bytes | 0\n    sentBytes: connection.sent.bytes | 0\n    totalReceivedBytes: connection.received.bytes_total | 0\n    totalSentBytes: connection.sent.bytes_total | 0\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n  monitored_resource_type: '\"global\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: stdio\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"http\" || context.protocol == \"grpc\"\n  actions:\n  - handler: handler.stdio\n    instances:\n    - accesslog.logentry\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: stdiotcp\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"tcp\"\n  actions:\n  - handler: handler.stdio\n    instances:\n    - tcpaccesslog.logentry\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: requestcount\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: \"1\"\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.host | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    request_protocol: api.protocol | context.protocol | \"unknown\"\n    response_code: response.code | 200\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: requestduration\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: response.duration | \"0ms\"\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.host | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    request_protocol: api.protocol | context.protocol | \"unknown\"\n    response_code: response.code | 200\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: requestsize\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: request.size | 0\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.host | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    request_protocol: api.protocol | context.protocol | \"unknown\"\n    response_code: response.code | 200\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: responsesize\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: response.size | 0\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.host | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    request_protocol: api.protocol | context.protocol | \"unknown\"\n    response_code: response.code | 200\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: tcpbytesent\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: connection.sent.bytes | 0\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.name | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: metric\nmetadata:\n  name: tcpbytereceived\n  namespace: {{ .Release.Namespace }}\nspec:\n  value: connection.received.bytes | 0\n  dimensions:\n    reporter: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"source\", \"destination\")\n    source_workload: source.workload.name | \"unknown\"\n    source_workload_namespace: source.workload.namespace | \"unknown\"\n    source_principal: source.principal | \"unknown\"\n    source_app: source.labels[\"app\"] | \"unknown\"\n    source_version: source.labels[\"version\"] | \"unknown\"\n    destination_workload: destination.workload.name | \"unknown\"\n    destination_workload_namespace: destination.workload.namespace | \"unknown\"\n    destination_principal: destination.principal | \"unknown\"\n    destination_app: destination.labels[\"app\"] | \"unknown\"\n    destination_version: destination.labels[\"version\"] | \"unknown\"\n    destination_service: destination.service.name | \"unknown\"\n    destination_service_name: destination.service.name | \"unknown\"\n    destination_service_namespace: destination.service.namespace | \"unknown\"\n    connection_security_policy: conditional((context.reporter.kind | \"inbound\") == \"outbound\", \"unknown\", conditional(connection.mtls | false, \"mutual_tls\", \"none\"))\n  monitored_resource_type: '\"UNSPECIFIED\"'\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: prometheus\nmetadata:\n  name: handler\n  namespace: {{ .Release.Namespace }}\nspec:\n  metrics:\n  - name: requests_total\n    instance_name: requestcount.metric.{{ .Release.Namespace }}\n    kind: COUNTER\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - request_protocol\n    - response_code\n    - connection_security_policy\n  - name: request_duration_seconds\n    instance_name: requestduration.metric.{{ .Release.Namespace }}\n    kind: DISTRIBUTION\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - request_protocol\n    - response_code\n    - connection_security_policy\n    buckets:\n      explicit_buckets:\n        bounds: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]\n  - name: request_bytes\n    instance_name: requestsize.metric.{{ .Release.Namespace }}\n    kind: DISTRIBUTION\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - request_protocol\n    - response_code\n    - connection_security_policy\n    buckets:\n      exponentialBuckets:\n        numFiniteBuckets: 8\n        scale: 1\n        growthFactor: 10\n  - name: response_bytes\n    instance_name: responsesize.metric.{{ .Release.Namespace }}\n    kind: DISTRIBUTION\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - request_protocol\n    - response_code\n    - connection_security_policy\n    buckets:\n      exponentialBuckets:\n        numFiniteBuckets: 8\n        scale: 1\n        growthFactor: 10\n  - name: tcp_sent_bytes_total\n    instance_name: tcpbytesent.metric.{{ .Release.Namespace }}\n    kind: COUNTER\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - connection_security_policy\n  - name: tcp_received_bytes_total\n    instance_name: tcpbytereceived.metric.{{ .Release.Namespace }}\n    kind: COUNTER\n    label_names:\n    - reporter\n    - source_app\n    - source_principal\n    - source_workload\n    - source_workload_namespace\n    - source_version\n    - destination_app\n    - destination_principal\n    - destination_workload\n    - destination_workload_namespace\n    - destination_version\n    - destination_service\n    - destination_service_name\n    - destination_service_namespace\n    - connection_security_policy\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: promhttp\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"http\" || context.protocol == \"grpc\"\n  actions:\n  - handler: handler.prometheus\n    instances:\n    - requestcount.metric\n    - requestduration.metric\n    - requestsize.metric\n    - responsesize.metric\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: promtcp\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"tcp\"\n  actions:\n  - handler: handler.prometheus\n    instances:\n    - tcpbytesent.metric\n    - tcpbytereceived.metric\n---\n\napiVersion: \"config.istio.io/v1alpha2\"\nkind: kubernetesenv\nmetadata:\n  name: handler\n  namespace: {{ .Release.Namespace }}\nspec:\n  # when running from mixer root, use the following config after adding a\n  # symbolic link to a kubernetes config file via:\n  #\n  # $ ln -s ~/.kube/config mixer/adapter/kubernetes/kubeconfig\n  #\n  # kubeconfig_path: \"mixer/adapter/kubernetes/kubeconfig\"\n\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: kubeattrgenrulerule\n  namespace: {{ .Release.Namespace }}\nspec:\n  actions:\n  - handler: handler.kubernetesenv\n    instances:\n    - attributes.kubernetes\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: rule\nmetadata:\n  name: tcpkubeattrgenrulerule\n  namespace: {{ .Release.Namespace }}\nspec:\n  match: context.protocol == \"tcp\"\n  actions:\n  - handler: handler.kubernetesenv\n    instances:\n    - attributes.kubernetes\n---\napiVersion: \"config.istio.io/v1alpha2\"\nkind: kubernetes\nmetadata:\n  name: attributes\n  namespace: {{ .Release.Namespace }}\nspec:\n  # Pass the required attribute data to the adapter\n  source_uid: source.uid | \"\"\n  source_ip: source.ip | ip(\"0.0.0.0\") # default to unspecified ip addr\n  destination_uid: destination.uid | \"\"\n  destination_port: destination.port | 0\n  attribute_bindings:\n    # Fill the new attributes from the adapter produced output.\n    # $out refers to an instance of OutputTemplate message\n    source.ip: $out.source_pod_ip | ip(\"0.0.0.0\")\n    source.uid: $out.source_pod_uid | \"unknown\"\n    source.labels: $out.source_labels | emptyStringMap()\n    source.name: $out.source_pod_name | \"unknown\"\n    source.namespace: $out.source_namespace | \"default\"\n    source.owner: $out.source_owner | \"unknown\"\n    source.serviceAccount: $out.source_service_account_name | \"unknown\"\n    source.workload.uid: $out.source_workload_uid | \"unknown\"\n    source.workload.name: $out.source_workload_name | \"unknown\"\n    source.workload.namespace: $out.source_workload_namespace | \"unknown\"\n    destination.ip: $out.destination_pod_ip | ip(\"0.0.0.0\")\n    destination.uid: $out.destination_pod_uid | \"unknown\"\n    destination.labels: $out.destination_labels | emptyStringMap()\n    destination.name: $out.destination_pod_name | \"unknown\"\n    destination.container.name: $out.destination_container_name | \"unknown\"\n    destination.namespace: $out.destination_namespace | \"default\"\n    destination.owner: $out.destination_owner | \"unknown\"\n    destination.serviceAccount: $out.destination_service_account_name | \"unknown\"\n    destination.workload.uid: $out.destination_workload_uid | \"unknown\"\n    destination.workload.name: $out.destination_workload_name | \"unknown\"\n    destination.workload.namespace: $out.destination_workload_namespace | \"unknown\"\n\n---\n# Configuration needed by Mixer.\n# Mixer cluster is delivered via CDS\n# Specify mixer cluster settings\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: istio-policy\n  namespace: {{ .Release.Namespace }}\nspec:\n  host: istio-policy.{{ .Release.Namespace }}.svc.cluster.local\n  trafficPolicy:\n    {{- if .Values.global.controlPlaneSecurityEnabled }}\n    portLevelSettings:\n    - port:\n        number: 15004\n      tls:\n        mode: ISTIO_MUTUAL\n    {{- end}}\n    connectionPool:\n      http:\n        http2MaxRequests: 10000\n        maxRequestsPerConnection: 10000\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: istio-telemetry\n  namespace: {{ .Release.Namespace }}\nspec:\n  host: istio-telemetry.{{ .Release.Namespace }}.svc.cluster.local\n  trafficPolicy:\n    {{- if .Values.global.controlPlaneSecurityEnabled }}\n    portLevelSettings:\n    - port:\n        number: 15004\n      tls:\n        mode: ISTIO_MUTUAL\n    {{- end}}\n    connectionPool:\n      http:\n        http2MaxRequests: 10000\n        maxRequestsPerConnection: 10000\n---\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-statsd-prom-bridge\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-statsd-prom-bridge\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: mixer\ndata:\n  mapping.conf: |-\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/deployment.yaml",
    "content": "{{- define \"policy_container\" }}\n    spec:\n      serviceAccountName: istio-mixer-service-account\n{{- if $.Values.global.priorityClassName }}\n      priorityClassName: \"{{ $.Values.global.priorityClassName }}\"\n{{- end }}\n      volumes:\n      - name: istio-certs\n        secret:\n          secretName: istio.istio-mixer-service-account\n          optional: true\n      - name: uds-socket\n        emptyDir: {}\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n      containers:\n      - name: mixer\n{{- if contains \"/\" .Values.image }}\n        image: \"{{ .Values.image }}\"\n{{- else }}\n        image: \"{{ $.Values.global.hub }}/{{ $.Values.image }}:{{ $.Values.global.tag }}\"\n{{- end }}\n        imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9093\n        - containerPort: 42422\n        args:\n          - --address\n          - unix:///sock/mixer.socket\n          - --configStoreURL=k8s://\n          - --configDefaultNamespace={{ $.Release.Namespace }}\n          - --trace_zipkin_url=http://zipkin:9411/api/v1/spans\n        {{- if .Values.env }}\n        env:\n        {{- range $key, $val := .Values.env }}\n        - name: {{ $key }}\n          value: \"{{ $val }}\"\n        {{- end }}\n        {{- end }}\n        resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: uds-socket\n          mountPath: /sock\n        livenessProbe:\n          httpGet:\n            path: /version\n            port: 9093\n          initialDelaySeconds: 5\n          periodSeconds: 5\n      - name: istio-proxy\n        image: \"{{ $.Values.global.hub }}/proxyv2:{{ $.Values.global.tag }}\"\n        imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9091\n        - containerPort: 15004\n{{ if ne .Values.global.proxy.stats.prometheusPort 0. }}\n        ports:\n        - containerPort: {{ .Values.global.proxy.stats.prometheusPort }}\n          protocol: TCP\n          name: http-envoy-prom\n{{ end }}\n        args:\n        - proxy\n        - --serviceCluster\n        - istio-policy\n        - --templateFile\n        - /etc/istio/proxy/envoy_policy.yaml.tmpl\n      {{- if $.Values.global.controlPlaneSecurityEnabled }}\n        - --controlPlaneAuthPolicy\n        - MUTUAL_TLS\n      {{- else }}\n        - --controlPlaneAuthPolicy\n        - NONE\n      {{- end }}\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        - name: INSTANCE_IP\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: status.podIP\n        resources:\n{{- if $.Values.global.proxy.resources }}\n{{ toYaml $.Values.global.proxy.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: istio-certs\n          mountPath: /etc/certs\n          readOnly: true\n        - name: uds-socket\n          mountPath: /sock\n{{- end }}\n\n{{- define \"telemetry_container\" }}\n    spec:\n      serviceAccountName: istio-mixer-service-account\n      volumes:\n      - name: istio-certs\n        secret:\n          secretName: istio.istio-mixer-service-account\n          optional: true\n      - name: uds-socket\n        emptyDir: {}\n    {{- if $.Values.nodeSelector }}\n      nodeSelector:\n{{ toYaml $.Values.nodeSelector | indent 8 }}\n    {{- end }}\n      containers:\n      - name: mixer\n{{- if contains \"/\" .Values.image }}\n        image: \"{{ .Values.image }}\"\n{{- else }}\n        image: \"{{ $.Values.global.hub }}/{{ $.Values.image }}:{{ $.Values.global.tag }}\"\n{{- end }}\n        imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9093\n        - containerPort: 42422\n        args:\n          - --address\n          - unix:///sock/mixer.socket\n          - --configStoreURL=k8s://\n          - --configDefaultNamespace={{ $.Release.Namespace }}\n          - --trace_zipkin_url=http://zipkin:9411/api/v1/spans\n        {{- if .Values.env }}\n        env:\n        {{- range $key, $val := .Values.env }}\n        - name: {{ $key }}\n          value: \"{{ $val }}\"\n        {{- end }}\n        {{- end }}\n        resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: uds-socket\n          mountPath: /sock\n        livenessProbe:\n          httpGet:\n            path: /version\n            port: 9093\n          initialDelaySeconds: 5\n          periodSeconds: 5\n      - name: istio-proxy\n        image: \"{{ $.Values.global.hub }}/proxyv2:{{ $.Values.global.tag }}\"\n        imagePullPolicy: {{ $.Values.global.imagePullPolicy }}\n        ports:\n        - containerPort: 9091\n        - containerPort: 15004\n{{ if ne .Values.global.proxy.stats.prometheusPort 0. }}\n        ports:\n        - containerPort: {{ .Values.global.proxy.stats.prometheusPort }}\n          protocol: TCP\n          name: http-envoy-prom\n{{ end }}\n        args:\n        - proxy\n        - --serviceCluster\n        - istio-telemetry\n        - --templateFile\n        - /etc/istio/proxy/envoy_telemetry.yaml.tmpl\n      {{- if $.Values.global.controlPlaneSecurityEnabled }}\n        - --controlPlaneAuthPolicy\n        - MUTUAL_TLS\n      {{- else }}\n        - --controlPlaneAuthPolicy\n        - NONE\n      {{- end }}\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: metadata.namespace\n        - name: INSTANCE_IP\n          valueFrom:\n            fieldRef:\n              apiVersion: v1\n              fieldPath: status.podIP\n        resources:\n{{- if $.Values.global.proxy.resources }}\n{{ toYaml $.Values.global.proxy.resources | indent 10 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 10 }}\n{{- end }}\n        volumeMounts:\n        - name: istio-certs\n          mountPath: /etc/certs\n          readOnly: true\n        - name: uds-socket\n          mountPath: /sock\n{{- end }}\n\n\n{{- $mixers := list \"policy\" \"telemetry\" }}\n{{- range $idx, $mname := $mixers }}\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-{{ $mname }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    istio: mixer\nspec:\n  replicas: {{ $.Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        app: {{ $mname }}\n        istio: mixer\n        istio-mixer-type: {{ $mname }}\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n{{- if eq $mname \"policy\"}}\n{{- template \"policy_container\" $ }}\n{{- else }}\n{{- template \"telemetry_container\" $ }}\n{{- end }}\n\n---\n{{- end }} {{/* range */}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/service.yaml",
    "content": "{{ $mixers := list \"policy\" \"telemetry\" }}\n{{- range $idx, $mname := $mixers }}\napiVersion: v1\nkind: Service\nmetadata:\n  name: istio-{{ $mname }}\n  namespace: {{ $.Release.Namespace }}\n  labels:\n    chart: {{ $.Chart.Name }}-{{ $.Chart.Version | replace \"+\" \"_\" }}\n    release: {{ $.Release.Name }}\n    istio: mixer\nspec:\n  ports:\n  - name: grpc-mixer\n    port: 9091\n  - name: grpc-mixer-mtls\n    port: 15004\n  - name: http-monitoring\n    port: 9093\n{{- if eq $mname \"telemetry\" }}\n  - name: prometheus\n    port: 42422\n{{- end }}\n  selector:\n    istio: mixer\n    istio-mixer-type: {{ $mname }}\n---\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/mixer/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-mixer-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"mixer.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/Chart.yaml",
    "content": "apiVersion: v1\nname: pilot\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for pilot deployment\nkeywords:\n  - istio\n  - pilot\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/templates/autoscale.yaml",
    "content": "{{- if .Values.autoscaleMin }}\napiVersion: autoscaling/v2beta1\nkind: HorizontalPodAutoscaler\nmetadata:\n    name: istio-pilot\n    namespace: {{ $.Release.Namespace }}\nspec:\n    maxReplicas: {{ .Values.autoscaleMax }}\n    minReplicas: {{ .Values.autoscaleMin }}\n    scaleTargetRef:\n      apiVersion: apps/v1beta1\n      kind: Deployment\n      name: istio-pilot\n    metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        targetAverageUtilization: {{ .Values.cpu.targetAverageUtilization }}\n---\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-pilot-{{ .Release.Namespace }}\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"config.istio.io\"]\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"rbac.istio.io\"]\n  resources: [\"*\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n- apiGroups: [\"networking.istio.io\"]\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"authentication.istio.io\"]\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"apiextensions.k8s.io\"]\n  resources: [\"customresourcedefinitions\"]\n  verbs: [\"*\"]\n- apiGroups: [\"extensions\"]\n  resources: [\"thirdpartyresources\", \"thirdpartyresources.extensions\", \"ingresses\", \"ingresses/status\"]\n  verbs: [\"*\"]\n- apiGroups: [\"\"]\n  resources: [\"configmaps\"]\n  verbs: [\"create\", \"get\", \"list\", \"watch\", \"update\"]\n- apiGroups: [\"\"]\n  resources: [\"endpoints\", \"pods\", \"services\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"\"]\n  resources: [\"namespaces\", \"nodes\", \"secrets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-pilot-{{ .Release.Namespace }}\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-pilot-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-pilot-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-pilot\n  namespace: {{ .Release.Namespace }}\n  # TODO: default template doesn't have this, which one is right ?\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: pilot\n  annotations:\n    checksum/config-volume: {{ template \"istio.configmap.checksum\" . }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        istio: pilot\n        app: pilot\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-pilot-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: discovery\n{{- if contains \"/\" .Values.image }}\n          image: \"{{ .Values.image }}\"\n{{- else }}\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n{{- end }}\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n          - \"discovery\"\n{{- if .Values.global.oneNamespace }}\n          - \"-a\"\n          - {{ .Release.Namespace }}\n{{- end }}\n{{- if not .Values.sidecar }}\n          - --secureGrpcAddr\n          - \":15011\"\n{{- end }}\n          ports:\n          - containerPort: 8080\n          - containerPort: 15010\n{{- if not .Values.sidecar }}\n          - containerPort: 15011\n{{- end }}\n          readinessProbe:\n            httpGet:\n              path: /ready\n              port: 8080\n            initialDelaySeconds: 5\n            periodSeconds: 30\n            timeoutSeconds: 5\n          env:\n          - name: POD_NAME\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.name\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: PILOT_CACHE_SQUASH\n            value: \"5\"\n          {{- if .Values.env }}\n          {{- range $key, $val := .Values.env }}\n          - name: {{ $key }}\n            value: \"{{ $val }}\"\n          {{- end }}\n          {{- end }}\n{{- if .Values.traceSampling }}\n          - name: PILOT_TRACE_SAMPLING\n            value: \"{{ .Values.traceSampling }}\"\n{{- end }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          volumeMounts:\n          - name: config-volume\n            mountPath: /etc/istio/config\n          - name: istio-certs\n            mountPath: /etc/certs\n            readOnly: true\n{{- if .Values.sidecar }}\n        - name: istio-proxy\n          image: \"{{ .Values.global.hub }}/proxyv2:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n          - containerPort: 15003\n          - containerPort: 15005\n          - containerPort: 15007\n          - containerPort: 15011\n          args:\n          - proxy\n          - --serviceCluster\n          - istio-pilot\n          - --templateFile\n          - /etc/istio/proxy/envoy_pilot.yaml.tmpl\n        {{- if $.Values.global.controlPlaneSecurityEnabled}}\n          - --controlPlaneAuthPolicy\n          - MUTUAL_TLS\n        {{- else }}\n          - --controlPlaneAuthPolicy\n          - NONE\n        {{- end }}\n          env:\n          - name: POD_NAME\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.name\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: INSTANCE_IP\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: status.podIP\n          resources:\n{{- if .Values.global.proxy.resources }}\n{{ toYaml .Values.global.proxy.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          volumeMounts:\n          - name: istio-certs\n            mountPath: /etc/certs\n            readOnly: true\n{{- end }}\n      volumes:\n      - name: config-volume\n        configMap:\n          name: istio\n      - name: istio-certs\n        secret:\n          secretName: istio.istio-pilot-service-account\n          optional: true   \n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/templates/gateway.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: istio-autogenerated-k8s-ingress\n  namespace: istio-system\nspec:\n  selector:\n    istio: {{ .Values.global.k8sIngressSelector }}\n  servers:\n  - port:\n      number: 80\n      protocol: HTTP2\n      name: http\n    hosts:\n    - \"*\"\n{{ if .Values.global.k8sIngressHttps }}\n  - port:\n      number: 443\n      protocol: HTTPS\n      name: https-default\n    tls:\n      mode: SIMPLE\n      serverCertificate: /etc/istio/ingress-certs/tls.crt\n      privateKey: /etc/istio/ingress-certs/tls.key\n    hosts:\n    - \"*\"\n{{ end }}\n---\n{{- if .Values.global.meshExpansion }}\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: meshexpansion-gateway\nspec:\n  selector:\n    istio: ingressgateway\n  servers:\n  - port:\n      number: 15011\n      protocol: TCP\n      name: tcp-pilot\n    hosts:\n    - \"*\"\n  - port:\n      number: 8060\n      protocol: TCP\n      name: tcp-citadel\n    hosts:\n    - \"*\"\n---\n{{- end }}\n\n{{- if .Values.global.meshExpansionILB }}\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: meshexpansion-ilb-gateway\nspec:\n  selector:\n    istio: ilbgateway\n  servers:\n  - port:\n      number: 15011\n      protocol: TCP\n      name: tcp-pilot\n    hosts:\n    - \"*\"\n  - port:\n      number: 8060\n      protocol: TCP\n      name: tcp-citadel\n    hosts:\n    - \"*\"\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/templates/meshexpansion.yaml",
    "content": "{{- if .Values.global.meshExpansion }}\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: meshexpansion-pilot\nspec:\n  hosts:\n  - \"pilot.istio-system\"\n  gateways:\n  - meshexpansion-gateway\n  tcp:\n  - match:\n    - port: 15011\n    route:\n    - destination:\n        host: istio-pilot.istio-system.svc.cluster.local\n        port:\n          number: 15011\n\n\n{{- end }}\n\n\n{{- if .Values.global.meshExpansionILB }}\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: ilb-meshexpansion-pilot\nspec:\n  hosts:\n  - \"meshexpansionilb.istio-system\"\n  gateways:\n  - meshexpansion-ilb-gateway\n  tcp:\n  - match:\n    - port: 15011\n    route:\n    - destination:\n        host: istio-pilot.istio-system.svc.cluster.local\n        port:\n          number: 15011\n  - match:\n    - port: 15010\n    route:\n    - destination:\n        host: istio-pilot.istio-system.svc.cluster.local\n        port:\n          number: 15010\n  - match:\n    - port: 5353\n    route:\n    - destination:\n        host: kube-dns.kube-system.svc.cluster.local\n        port:\n          number: 53\n\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: istio-pilot\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  ports:\n  - port: 15010\n    name: grpc-xds # direct\n  - port: 15011\n    name: https-xds # mTLS\n  - port: 8080\n    name: http-legacy-discovery # direct\n  - port: 9093\n    name: http-monitoring\n  selector:\n    istio: pilot\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/pilot/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-pilot-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-pilot\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/prometheus/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: prometheus\nversion: 1.0.4\nappVersion: 2.3.1\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/prometheus/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"prometheus.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"prometheus.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/prometheus/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: prometheus-{{ .Release.Namespace }}\nrules:\n- apiGroups: [\"\"]\n  resources:\n  - nodes\n  - services\n  - endpoints\n  - pods\n  - nodes/proxy\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"\"]\n  resources:\n  - configmaps\n  verbs: [\"get\"]\n- nonResourceURLs: [\"/metrics\"]\n  verbs: [\"get\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/prometheus/templates/clusterrolebindings.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: prometheus-{{ .Release.Namespace }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: prometheus-{{ .Release.Namespace }}\nsubjects:\n- kind: ServiceAccount\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/prometheus/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: prometheus\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\ndata:\n  prometheus.yml: |-\n    global:\n      scrape_interval: 15s\n    scrape_configs:\n\n    - job_name: 'istio-mesh'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-telemetry;prometheus\n\n{{ if ne .Values.global.proxy.stats.prometheusPort 0. }}\n    # Scrape config for envoy stats\n    - job_name: 'envoy-stats'\n      metrics_path: /stats/prometheus\n      kubernetes_sd_configs:\n      - role: pod\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_pod_container_port_name]\n        action: keep\n        regex: '.*-envoy-prom'\n      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]\n        action: replace\n        regex: ([^:]+)(?::\\d+)?;(\\d+)\n        replacement: $1:{{ .Values.global.proxy.stats.prometheusPort }}\n        target_label: __address__\n      - action: labelmap\n        regex: __meta_kubernetes_pod_label_(.+)\n      - source_labels: [__meta_kubernetes_namespace]\n        action: replace\n        target_label: namespace\n      - source_labels: [__meta_kubernetes_pod_name]\n        action: replace\n        target_label: pod_name\n\n      metric_relabel_configs:\n      # Exclude some of the envoy metrics that have massive cardinality\n      # This list may need to be pruned further moving forward, as informed\n      # by performance and scalability testing.\n      - source_labels: [ cluster_name ]\n        regex: '(outbound|inbound|prometheus_stats).*'\n        action: drop\n      - source_labels: [ tcp_prefix ]\n        regex: '(outbound|inbound|prometheus_stats).*'\n        action: drop\n      - source_labels: [ listener_address ]\n        regex: '(.+)'\n        action: drop\n      - source_labels: [ http_conn_manager_listener_prefix ]\n        regex: '(.+)'\n        action: drop\n      - source_labels: [ http_conn_manager_prefix ]\n        regex: '(.+)'\n        action: drop\n      - source_labels: [ __name__ ]\n        regex: 'envoy_tls.*'\n        action: drop\n      - source_labels: [ __name__ ]\n        regex: 'envoy_tcp_downstream.*'\n        action: drop\n      - source_labels: [ __name__ ]\n        regex: 'envoy_http_(stats|admin).*'\n        action: drop\n      - source_labels: [ __name__ ]\n        regex: 'envoy_cluster_(lb|retry|bind|internal|max|original).*'\n        action: drop\n{{ end}}\n\n    - job_name: 'istio-policy'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-policy;http-monitoring\n\n    - job_name: 'istio-telemetry'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-telemetry;http-monitoring\n\n    - job_name: 'pilot'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-pilot;http-monitoring\n\n    - job_name: 'galley'\n      # Override the global default and scrape targets from this job every 5 seconds.\n      scrape_interval: 5s\n      # metrics_path defaults to '/metrics'\n      # scheme defaults to 'http'.\n\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - {{ .Release.Namespace }}\n\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: istio-galley;http-monitoring\n\n    # scrape config for API servers\n    - job_name: 'kubernetes-apiservers'\n      kubernetes_sd_configs:\n      - role: endpoints\n        namespaces:\n          names:\n          - default\n      scheme: https\n      tls_config:\n        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt\n      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]\n        action: keep\n        regex: kubernetes;https\n\n    # scrape config for nodes (kubelet)\n    - job_name: 'kubernetes-nodes'\n      scheme: https\n      tls_config:\n        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt\n      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token\n      kubernetes_sd_configs:\n      - role: node\n      relabel_configs:\n      - action: labelmap\n        regex: __meta_kubernetes_node_label_(.+)\n      - target_label: __address__\n        replacement: kubernetes.default.svc:443\n      - source_labels: [__meta_kubernetes_node_name]\n        regex: (.+)\n        target_label: __metrics_path__\n        replacement: /api/v1/nodes/${1}/proxy/metrics\n\n    # Scrape config for Kubelet cAdvisor.\n    #\n    # This is required for Kubernetes 1.7.3 and later, where cAdvisor metrics\n    # (those whose names begin with 'container_') have been removed from the\n    # Kubelet metrics endpoint.  This job scrapes the cAdvisor endpoint to\n    # retrieve those metrics.\n    #\n    # In Kubernetes 1.7.0-1.7.2, these metrics are only exposed on the cAdvisor\n    # HTTP endpoint; use \"replacement: /api/v1/nodes/${1}:4194/proxy/metrics\"\n    # in that case (and ensure cAdvisor's HTTP server hasn't been disabled with\n    # the --cadvisor-port=0 Kubelet flag).\n    #\n    # This job is not necessary and should be removed in Kubernetes 1.6 and\n    # earlier versions, or it will cause the metrics to be scraped twice.\n    - job_name: 'kubernetes-cadvisor'\n      scheme: https\n      tls_config:\n        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt\n      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token\n      kubernetes_sd_configs:\n      - role: node\n      relabel_configs:\n      - action: labelmap\n        regex: __meta_kubernetes_node_label_(.+)\n      - target_label: __address__\n        replacement: kubernetes.default.svc:443\n      - source_labels: [__meta_kubernetes_node_name]\n        regex: (.+)\n        target_label: __metrics_path__\n        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor\n\n    # scrape config for service endpoints.\n    - job_name: 'kubernetes-service-endpoints'\n      kubernetes_sd_configs:\n      - role: endpoints\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]\n        action: keep\n        regex: true\n      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]\n        action: replace\n        target_label: __scheme__\n        regex: (https?)\n      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]\n        action: replace\n        target_label: __metrics_path__\n        regex: (.+)\n      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]\n        action: replace\n        target_label: __address__\n        regex: ([^:]+)(?::\\d+)?;(\\d+)\n        replacement: $1:$2\n      - action: labelmap\n        regex: __meta_kubernetes_service_label_(.+)\n      - source_labels: [__meta_kubernetes_namespace]\n        action: replace\n        target_label: kubernetes_namespace\n      - source_labels: [__meta_kubernetes_service_name]\n        action: replace\n        target_label: kubernetes_name\n\n    - job_name: 'kubernetes-pods'\n      kubernetes_sd_configs:\n      - role: pod\n      relabel_configs:  # If first two labels are present, pod should be scraped  by the istio-secure job.\n      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]\n        action: keep\n        regex: true\n      - source_labels: [__meta_kubernetes_pod_annotation_sidecar_istio_io_status]\n        action: drop\n        regex: (.+)\n      - source_labels: [__meta_kubernetes_pod_annotation_istio_mtls]\n        action: drop\n        regex: (true)\n      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]\n        action: replace\n        target_label: __metrics_path__\n        regex: (.+)\n      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]\n        action: replace\n        regex: ([^:]+)(?::\\d+)?;(\\d+)\n        replacement: $1:$2\n        target_label: __address__\n      - action: labelmap\n        regex: __meta_kubernetes_pod_label_(.+)\n      - source_labels: [__meta_kubernetes_namespace]\n        action: replace\n        target_label: namespace\n      - source_labels: [__meta_kubernetes_pod_name]\n        action: replace\n        target_label: pod_name\n\n    - job_name: 'kubernetes-pods-istio-secure'\n      scheme: https\n      tls_config:\n        ca_file: /etc/istio-certs/root-cert.pem\n        cert_file: /etc/istio-certs/cert-chain.pem\n        key_file: /etc/istio-certs/key.pem\n        insecure_skip_verify: true  # prometheus does not support secure naming.\n      kubernetes_sd_configs:\n      - role: pod\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]\n        action: keep\n        regex: true\n      # sidecar status annotation is added by sidecar injector and\n      # istio_workload_mtls_ability can be specifically placed on a pod to indicate its ability to receive mtls traffic.\n      - source_labels: [__meta_kubernetes_pod_annotation_sidecar_istio_io_status, __meta_kubernetes_pod_annotation_istio_mtls]\n        action: keep\n        regex: (([^;]+);([^;]*))|(([^;]*);(true))\n      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]\n        action: replace\n        target_label: __metrics_path__\n        regex: (.+)\n      - source_labels: [__address__]  # Only keep address that is host:port\n        action: keep    # otherwise an extra target with ':443' is added for https scheme\n        regex: ([^:]+):(\\d+)\n      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]\n        action: replace\n        regex: ([^:]+)(?::\\d+)?;(\\d+)\n        replacement: $1:$2\n        target_label: __address__\n      - action: labelmap\n        regex: __meta_kubernetes_pod_label_(.+)\n      - source_labels: [__meta_kubernetes_namespace]\n        action: replace\n        target_label: namespace\n      - source_labels: [__meta_kubernetes_pod_name]\n        action: replace\n        target_label: pod_name"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/prometheus/templates/deployment.yaml",
    "content": "# TODO: the original template has service account, roles, etc\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: prometheus\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  selector:\n    matchLabels:\n      app: prometheus\n  template:\n    metadata:\n      labels:\n        app: prometheus\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: prometheus\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: prometheus\n          image: \"{{ .Values.hub }}/prometheus:{{ .Values.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n            - '--storage.tsdb.retention=6h'\n            - '--config.file=/etc/prometheus/prometheus.yml'\n          ports:\n            - containerPort: 9090\n              name: http\n          livenessProbe:\n            httpGet:\n              path: /-/healthy\n              port: 9090\n          readinessProbe:\n            httpGet:\n              path: /-/ready\n              port: 9090\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n          volumeMounts:\n          - name: config-volume\n            mountPath: /etc/prometheus\n          - mountPath: /etc/istio-certs\n            name: istio-certs\n      volumes:\n      - name: config-volume\n        configMap:\n          name: prometheus\n      - name: istio-certs\n        secret:\n          defaultMode: 420\n          optional: true\n          secretName: istio.default\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/prometheus/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    prometheus.io/scrape: 'true'\n    {{- range $key, $val := .Values.service.annotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  labels:\n    name: prometheus\nspec:\n  selector:\n    app: prometheus\n  ports:\n  - name: http-prometheus\n    protocol: TCP\n    port: 9090\n\n{{- if .Values.service.nodePort.enabled }}\n# Using separate ingress for nodeport, to avoid conflict with pilot e2e test configs.\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: prometheus-nodeport\n  namespace: {{ .Release.Namespace }}\n  labels:\n    name: prometheus\nspec:\n  type: NodePort\n  ports:\n  - port: 9090\n    nodePort: {{ .Values.service.nodePort.port }}\n    name: http-prometheus\n  selector:\n    app: prometheus\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/prometheus/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/Chart.yaml",
    "content": "apiVersion: v1\nname: security\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for istio authentication\nkeywords:\n  - istio\n  - security\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"security.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"security.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/cleanup-secrets.yaml",
    "content": "# The reason for creating a ServiceAccount and ClusterRole specifically for this\n# post-delete hooked job is because the citadel ServiceAccount is being deleted\n# before this hook is launched. On the other hand, running this hook before the\n# deletion of the citadel (e.g. pre-delete) won't delete the secrets because they\n# will be re-created immediately by the to-be-deleted citadel.\n#\n# It's also important that the ServiceAccount, ClusterRole and ClusterRoleBinding\n# will be ready before running the hooked Job therefore the hook weights.\n\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: istio-cleanup-secrets-service-account\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-delete\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n    \"helm.sh/hook-weight\": \"1\"\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-cleanup-secrets-{{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-delete\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n    \"helm.sh/hook-weight\": \"1\"\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"\"]\n  resources: [\"secrets\"]\n  verbs: [\"list\", \"delete\"]\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-cleanup-secrets-{{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-delete\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n    \"helm.sh/hook-weight\": \"2\"\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-cleanup-secrets-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-cleanup-secrets-service-account\n    namespace: {{ .Release.Namespace }}\n---\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: istio-cleanup-secrets\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-delete\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n    \"helm.sh/hook-weight\": \"3\"\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  template:\n    metadata:\n      name: istio-cleanup-secrets\n      labels:\n        app: {{ template \"security.name\" . }}\n        release: {{ .Release.Name }}\n    spec:\n      serviceAccountName: istio-cleanup-secrets-service-account\n      containers:\n        - name: hyperkube\n          image: \"{{ .Values.global.hyperkube.hub }}/hyperkube:{{ .Values.global.hyperkube.tag }}\"\n          command:\n          - /bin/bash\n          - -c\n          - >\n              kubectl get secret --all-namespaces | grep \"istio.io/key-and-cert\" |  while read -r entry; do\n                ns=$(echo $entry | awk '{print $1}');\n                name=$(echo $entry | awk '{print $2}');\n                kubectl delete secret $name -n $ns;\n              done\n      restartPolicy: OnFailure\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-citadel-{{ .Release.Namespace }}\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"\"]\n  resources: [\"secrets\"]\n  verbs: [\"create\", \"get\", \"watch\", \"list\", \"update\", \"delete\"]\n- apiGroups: [\"\"]\n  resources: [\"serviceaccounts\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n- apiGroups: [\"\"]\n  resources: [\"services\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-citadel-{{ .Release.Namespace }}\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-citadel-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-citadel-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/configmap.yaml",
    "content": "apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-security-custom-resources\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: security\ndata:\n  custom-resources.yaml: |-\n    {{- if .Values.global.mtls.enabled }}\n      {{- include \"security-default.yaml.tpl\" . | indent 4}}\n    {{- else }}\n      {{- include \"security-permissive.yaml.tpl\" . | indent 4}}\n    {{- end }}\n  run.sh: |-\n    {{- include \"install-custom-resources.sh.tpl\" . | indent 4}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/create-custom-resources-job.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: istio-security-post-install-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-security-post-install-{{ .Release.Namespace }}\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"authentication.istio.io\"] # needed to create default authn policy\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"networking.istio.io\"] # needed to create security destination rules\n  resources: [\"*\"]\n  verbs: [\"*\"]\n- apiGroups: [\"admissionregistration.k8s.io\"]\n  resources: [\"validatingwebhookconfigurations\"]\n  verbs: [\"get\"]\n- apiGroups: [\"extensions\"]\n  resources: [\"deployments\", \"replicasets\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n---\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-security-post-install-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-security-post-install-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-security-post-install-account\n    namespace: {{ .Release.Namespace }}\n---\n\napiVersion: batch/v1\nkind: Job\nmetadata:\n  name: istio-security-post-install\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    \"helm.sh/hook\": post-install\n    \"helm.sh/hook-delete-policy\": hook-succeeded\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  template:\n    metadata:\n      name: istio-security-post-install\n      labels:\n        app: istio-security\n        release: {{ .Release.Name }}\n    spec:\n      serviceAccountName: istio-security-post-install-account\n      containers:\n        - name: hyperkube\n          image: \"{{ .Values.global.hyperkube.hub }}/hyperkube:{{ .Values.global.hyperkube.tag }}\"\n          command: [ \"/bin/bash\", \"/tmp/security/run.sh\", \"/tmp/security/custom-resources.yaml\" ]\n          volumeMounts:\n            - mountPath: \"/tmp/security\"\n              name: tmp-configmap-security\n      volumes:\n        - name: tmp-configmap-security\n          configMap:\n            name: istio-security-custom-resources\n      restartPolicy: OnFailure\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/deployment.yaml",
    "content": "# istio CA watching all namespaces\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-citadel\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: citadel\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        istio: citadel\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-citadel-service-account\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: citadel\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n            - --append-dns-names=true\n            - --grpc-port=8060\n            - --grpc-hostname=citadel\n            - --citadel-storage-namespace={{ .Release.Namespace }}\n            - --custom-dns-names=istio-pilot-service-account.{{ .Release.Namespace }}:istio-pilot.{{ .Release.Namespace }},istio-ingressgateway-service-account.{{ .Release.Namespace }}:istio-ingressgateway.{{ .Release.Namespace }}\n          {{- if .Values.selfSigned }}\n            - --self-signed-ca=true\n          {{- else }}\n            - --self-signed-ca=false\n            - --signing-cert=/etc/cacerts/ca-cert.pem\n            - --signing-key=/etc/cacerts/ca-key.pem\n            - --root-cert=/etc/cacerts/root-cert.pem\n            - --cert-chain=/etc/cacerts/cert-chain.pem\n          {{- end }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n{{- if not .Values.selfSigned }}\n          volumeMounts:\n          - name: cacerts\n            mountPath: /etc/cacerts\n            readOnly: true\n      volumes:\n      - name: cacerts\n        secret:\n         secretName: cacerts\n         optional: true\n{{- end }}\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/enable-mesh-mtls.yaml",
    "content": "{{ define \"security-default.yaml.tpl\" }}\n# These policy and destination rules effectively enable mTLS for all services in the mesh. For now,\n# they are added to Istio installation yaml for backward compatible. In future, they should be in\n# a separated yaml file so that customer can enable mTLS independent from installation.\n\n# Authentication policy to enable mutual TLS for all services (that have sidecar) in the mesh.\napiVersion: \"authentication.istio.io/v1alpha1\"\nkind: \"MeshPolicy\"\nmetadata:\n  name: \"default\"\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  peers:\n  - mtls: {}\n---\n# Corresponding destination rule to configure client side to use mutual TLS when talking to\n# any service (host) in the mesh.\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: \"default\"\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  host: \"*.local\"\n  trafficPolicy:\n    tls:\n      mode: ISTIO_MUTUAL\n---\n# Destination rule to dislabe (m)TLS when talking to API server, as API server doesn't have sidecar.\n# Customer should add similar destination rules for other services that dont' have sidecar.\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: \"api-server\"\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  host: \"kubernetes.default.svc.cluster.local\"\n  trafficPolicy:\n    tls:\n      mode: DISABLE\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/enable-mesh-permissive.yaml",
    "content": "{{ define \"security-permissive.yaml.tpl\" }}\n# Authentication policy to enable permissive mode for all services (that have sidecar) in the mesh.\napiVersion: \"authentication.istio.io/v1alpha1\"\nkind: \"MeshPolicy\"\nmetadata:\n  name: \"default\"\n  labels:\n    app: istio-security\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  peers:\n  - mtls:\n      mode: PERMISSIVE\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/meshexpansion.yaml",
    "content": "{{- if .Values.global.meshExpansion }}\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: meshexpansion-citadel\nspec:\n  hosts:\n  - \"istio-citadel.istio-system\"\n  gateways:\n  - meshexpansion-gateway\n  tcp:\n  - match:\n    - port: 8060\n    route:\n    - destination:\n        host: istio-citadel.istio-system.svc.cluster.local\n        port:\n          number: 8060\n\n{{- end }}\n\n---\n\n{{- if .Values.global.meshExpansionILB }}\n\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: meshexpansion-ilb-citadel\nspec:\n  hosts:\n  - \"istio-citadel.istio-system\"\n  gateways:\n  - meshexpansion-ilb-gateway\n  tcp:\n  - match:\n    - port: 8060\n    route:\n    - destination:\n        host: istio-citadel.istio-system.svc.cluster.local\n        port:\n          number: 8060\n\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  # we use the normal name here (e.g. 'prometheus')\n  # as grafana is configured to use this as a data source\n  name: istio-citadel\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-citadel\nspec:\n  ports:\n    - name: grpc-citadel\n      port: 8060\n      targetPort: 8060\n      protocol: TCP\n    - name: http-monitoring\n      port: 9093\n  selector:\n    istio: citadel\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/security/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-citadel-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"security.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/servicegraph/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: servicegraph\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/servicegraph/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"servicegraph.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"servicegraph.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/servicegraph/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: servicegraph\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"servicegraph.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        app: servicegraph\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: servicegraph\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n            - containerPort: {{ .Values.service.internalPort }}\n          args:\n          - --prometheusAddr=http://prometheus:9090\n          livenessProbe:\n            httpGet:\n              path: /graph\n              port: {{ .Values.service.internalPort }}\n          readinessProbe:\n            httpGet:\n              path: /graph\n              port: {{ .Values.service.internalPort }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/servicegraph/templates/ingress.yaml",
    "content": "{{- if .Values.ingress.enabled -}}\n{{- $serviceName := include \"servicegraph.fullname\" . -}}\n{{- $servicePort := .Values.service.externalPort -}}\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: {{ template \"servicegraph.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"servicegraph.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n  annotations:\n    {{- range $key, $value := .Values.ingress.annotations }}\n      {{ $key }}: {{ $value | quote }}\n    {{- end }}\nspec:\n  rules:\n    {{- range $host := .Values.ingress.hosts }}\n    - host: {{ $host }}\n      http:\n        paths:\n          - path: /\n            backend:\n              serviceName: {{ $serviceName }}\n              servicePort: {{ $servicePort }}\n    {{- end -}}\n  {{- if .Values.ingress.tls }}\n  tls:\n{{ toYaml .Values.ingress.tls | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/servicegraph/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: servicegraph\n  namespace: {{ .Release.Namespace }}\n  annotations:\n    {{- range $key, $val := .Values.service.annotations }}\n    {{ $key }}: {{ $val }}\n    {{- end }}\n  labels:\n    app: servicegraph\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  type: {{ .Values.service.type }}\n  ports:\n    - port: {{ .Values.service.externalPort }}\n      targetPort: {{ .Values.service.internalPort }}\n      protocol: TCP\n      name: {{ .Values.service.name }}\n  selector:\n    app: servicegraph\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/sidecarInjectorWebhook/Chart.yaml",
    "content": "apiVersion: v1\nname: sidecarInjectorWebhook\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for sidecar injector webhook deployment\nkeywords:\n  - istio\n  - sidecarInjectorWebhook\nsources:\n  - http://github.com/istio/istio\nengine: gotpl\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/sidecarInjectorWebhook/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"sidecar-injector.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"sidecar-injector.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/sidecarInjectorWebhook/templates/clusterrole.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRole\nmetadata:\n  name: istio-sidecar-injector-{{ .Release.Namespace }}\n  labels:\n    app: istio-sidecar-injector\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nrules:\n- apiGroups: [\"*\"]\n  resources: [\"configmaps\"]\n  verbs: [\"get\", \"list\", \"watch\"]\n- apiGroups: [\"admissionregistration.k8s.io\"]\n  resources: [\"mutatingwebhookconfigurations\"]\n  verbs: [\"get\", \"list\", \"watch\", \"patch\"]\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/sidecarInjectorWebhook/templates/clusterrolebinding.yaml",
    "content": "apiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: istio-sidecar-injector-admin-role-binding-{{ .Release.Namespace }}\n  labels:\n    app: istio-sidecar-injector\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: istio-sidecar-injector-{{ .Release.Namespace }}\nsubjects:\n  - kind: ServiceAccount\n    name: istio-sidecar-injector-service-account\n    namespace: {{ .Release.Namespace }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/sidecarInjectorWebhook/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-sidecar-injector\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"sidecar-injector.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: sidecar-injector\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        istio: sidecar-injector\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n      serviceAccountName: istio-sidecar-injector-service-account\n {{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: sidecar-injector-webhook\n          image: \"{{ .Values.global.hub }}/{{ .Values.image }}:{{ .Values.global.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          args:\n            - --caCertFile=/etc/istio/certs/root-cert.pem\n            - --tlsCertFile=/etc/istio/certs/cert-chain.pem\n            - --tlsKeyFile=/etc/istio/certs/key.pem\n            - --injectConfig=/etc/istio/inject/config\n            - --meshConfig=/etc/istio/config/mesh\n            - --healthCheckInterval=2s\n            - --healthCheckFile=/health\n          volumeMounts:\n          - name: config-volume\n            mountPath: /etc/istio/config\n            readOnly: true\n          - name: certs\n            mountPath: /etc/istio/certs\n            readOnly: true\n          - name: inject-config\n            mountPath: /etc/istio/inject\n            readOnly: true\n          livenessProbe:\n            exec:\n              command:\n                - /usr/local/bin/sidecar-injector\n                - probe\n                - --probe-path=/health\n                - --interval=4s\n            initialDelaySeconds: 4\n            periodSeconds: 4\n          readinessProbe:\n            exec:\n              command:\n                - /usr/local/bin/sidecar-injector\n                - probe\n                - --probe-path=/health\n                - --interval=4s\n            initialDelaySeconds: 4\n            periodSeconds: 4\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n      volumes:\n      - name: config-volume\n        configMap:\n          name: istio\n      - name: certs\n        secret:\n          secretName: istio.istio-sidecar-injector-service-account\n      - name: inject-config\n        configMap:\n          name: istio-sidecar-injector\n          items:\n          - key: config\n            path: config\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/sidecarInjectorWebhook/templates/mutatingwebhook.yaml",
    "content": "apiVersion: admissionregistration.k8s.io/v1beta1\nkind: MutatingWebhookConfiguration\nmetadata:\n  name: istio-sidecar-injector\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-sidecar-injector\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nwebhooks:\n  - name: sidecar-injector.istio.io\n    clientConfig:\n      service:\n        name: istio-sidecar-injector\n        namespace: {{ .Release.Namespace }}\n        path: \"/inject\"\n      caBundle: \"\"\n    rules:\n      - operations: [ \"CREATE\" ]\n        apiGroups: [\"\"]\n        apiVersions: [\"v1\"]\n        resources: [\"pods\"]\n    failurePolicy: Fail\n    namespaceSelector:\n{{- if .Values.enableNamespacesByDefault }}\n      matchExpressions:\n      - key: istio-injection\n        operator: NotIn\n        values:\n        - disabled\n{{- else }}\n      matchLabels:\n        istio-injection: enabled\n{{- end }}\n\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/sidecarInjectorWebhook/templates/service.yaml",
    "content": "apiVersion: v1\nkind: Service\nmetadata:\n  name: istio-sidecar-injector\n  namespace: {{ .Release.Namespace }}\n  labels:\n    istio: sidecar-injector\nspec:\n  ports:\n  - port: 443\n  selector:\n    istio: sidecar-injector\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/sidecarInjectorWebhook/templates/serviceaccount.yaml",
    "content": "apiVersion: v1\nkind: ServiceAccount\n{{- if .Values.global.imagePullSecrets }}\nimagePullSecrets:\n{{- range .Values.global.imagePullSecrets }}\n  - name: {{ . }}\n{{- end }}\n{{- end }}\nmetadata:\n  name: istio-sidecar-injector-service-account\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-sidecar-injector\n    chart: {{ .Chart.Name }}-{{ .Chart.Version }}\n    heritage: {{ .Release.Service }}\n    release: {{ .Release.Name }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/telemetry-gateway/Chart.yaml",
    "content": "apiVersion: v1\nname: telemetry-gateway\nversion: 1.0.4\nappVersion: 1.0.4\ntillerVersion: \">=2.7.2\"\ndescription: Helm chart for configuring a gateway for Istio telemetry addons\nicon: https://istio.io/favicons/android-192x192.png\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/telemetry-gateway/templates/gateway.yaml",
    "content": "{{- if or (.Values.prometheusEnabled) (.Values.grafanaEnabled) }}\napiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: istio-telemetry-gateway\n  namespace: {{ .Release.Namespace }}\nspec:\n  selector:\n    istio: {{ .Values.gatewayName }}\n  servers:\n  {{- if .Values.prometheusEnabled }}\n  - port:\n      number: 15030\n      name: http2-prometheus\n      protocol: HTTP2\n    hosts:\n    - \"*\"\n  {{- end }}\n  {{- if .Values.grafanaEnabled }}\n  - port:\n      number: 15031\n      name: http2-grafana\n      protocol: HTTP2\n    hosts:\n    - \"*\"\n  {{- end }}\n{{- if .Values.grafanaEnabled }}\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: grafana\n  namespace: {{ .Release.Namespace }}\nspec:\n  host: grafana.{{ .Release.Namespace }}.svc.cluster.local\n  trafficPolicy:\n    tls:\n      mode: DISABLE\n{{- end }}\n{{- if .Values.prometheusEnabled }}\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: prometheus\n  namespace: {{ .Release.Namespace }}\nspec:\n  host: prometheus.{{ .Release.Namespace }}.svc.cluster.local\n  trafficPolicy:\n    tls:\n      mode: DISABLE\n{{- end }}      \n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: telemetry-virtual-service\n  namespace: {{ .Release.Namespace }}\nspec:\n  hosts:\n  - \"*\"\n  gateways:\n  - istio-telemetry-gateway\n  http:\n  {{- if .Values.prometheusEnabled }}\n  - match:\n    - port: 15030\n    route:\n    - destination:\n        host: prometheus.{{ .Release.Namespace }}.svc.cluster.local\n        port:\n          number: 9090\n  {{- end }}\n  {{- if .Values.grafanaEnabled }}\n  - match:\n    - port: 15031\n    route:\n    - destination:\n        host: grafana.{{ .Release.Namespace }}.svc.cluster.local\n        port:\n          number: 3000\n  {{- end }}\n---\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/tracing/Chart.yaml",
    "content": "apiVersion: v1\ndescription: A Helm chart for Kubernetes\nname: tracing\nversion: 1.0.4\nappVersion: 1.5.1\ntillerVersion: \">=2.7.2\"\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/tracing/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"zipkin.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"zipkin.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/tracing/templates/deployment.yaml",
    "content": "apiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: istio-tracing\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: istio-tracing\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\nspec:\n  replicas: {{ .Values.replicaCount }}\n  template:\n    metadata:\n      labels:\n        app: jaeger\n      annotations:\n        sidecar.istio.io/inject: \"false\"\n        scheduler.alpha.kubernetes.io/critical-pod: \"\"\n    spec:\n{{- if .Values.global.priorityClassName }}\n      priorityClassName: \"{{ .Values.global.priorityClassName }}\"\n{{- end }}\n      containers:\n        - name: jaeger\n          image: \"{{ .Values.jaeger.hub }}/all-in-one:{{ .Values.jaeger.tag }}\"\n          imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n          ports:\n            - containerPort: {{ .Values.service.internalPort }}\n            - containerPort: {{ .Values.jaeger.ui.port }}\n            - containerPort: 5775\n              protocol: UDP\n            - containerPort: 6831\n              protocol: UDP\n            - containerPort: 6832\n              protocol: UDP\n          env:\n          - name: POD_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          - name: COLLECTOR_ZIPKIN_HTTP_PORT\n            value: \"{{ .Values.service.internalPort }}\"\n          - name: MEMORY_MAX_TRACES\n            value: \"{{ .Values.jaeger.memory.max_traces }}\"\n          livenessProbe:\n            httpGet:\n              path: /\n              port: {{ .Values.jaeger.ui.port }}\n          readinessProbe:\n            httpGet:\n              path: /\n              port: {{ .Values.jaeger.ui.port }}\n          resources:\n{{- if .Values.resources }}\n{{ toYaml .Values.resources | indent 12 }}\n{{- else }}\n{{ toYaml .Values.global.defaultResources | indent 12 }}\n{{- end }}\n      affinity:\n      {{- include \"nodeaffinity\" . | indent 6 }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/tracing/templates/ingress-jaeger.yaml",
    "content": "{{ if (.Values.jaeger.ingress.enabled) and eq .Values.provider \"jaeger\" }}\n{{- $servicePort := .Values.jaeger.ui.port -}}\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: jaeger-query\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: jaeger\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n  annotations:\n    {{- range $key, $value := .Values.jaeger.ingress.annotations }}\n      {{ $key }}: {{ $value | quote }}\n    {{- end }}\nspec:\n  rules:\n    {{- range $host := .Values.jaeger.ingress.hosts }}\n    - host: {{ $host }}\n      http:\n        paths:\n          - path: /\n            backend:\n              serviceName: jaeger-query\n              servicePort: {{ $servicePort }}\n    {{- end -}}\n  {{- if .Values.jaeger.ingress.tls }}\n  tls:\n{{ toYaml .Values.jaeger.ingress.tls | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/tracing/templates/ingress.yaml",
    "content": "{{- if .Values.ingress.enabled -}}\n{{- $serviceName := \"zipkin\" -}}\n{{- $servicePort := .Values.service.externalPort -}}\napiVersion: extensions/v1beta1\nkind: Ingress\nmetadata:\n  name: {{ template \"zipkin.fullname\" . }}\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"zipkin.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n  annotations:\n    {{- range $key, $value := .Values.ingress.annotations }}\n      {{ $key }}: {{ $value | quote }}\n    {{- end }}\nspec:\n  rules:\n    {{- range $host := .Values.ingress.hosts }}\n    - host: {{ $host }}\n      http:\n        paths:\n          - path: /\n            backend:\n              serviceName: {{ $serviceName }}\n              servicePort: {{ $servicePort }}\n    {{- end -}}\n  {{- if .Values.ingress.tls }}\n  tls:\n{{ toYaml .Values.ingress.tls | indent 4 }}\n  {{- end -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/tracing/templates/service-jaeger.yaml",
    "content": "{{ if eq .Values.provider \"jaeger\" }}\n\napiVersion: v1\nkind: List\nitems:\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: jaeger-query\n    namespace: {{ .Release.Namespace }}\n    annotations:\n      {{- range $key, $val := .Values.service.annotations }}\n      {{ $key }}: {{ $val }}\n      {{- end }}\n    labels:\n      app: jaeger\n      jaeger-infra: jaeger-service\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    ports:\n      - name: query-http\n        port: {{ .Values.jaeger.ui.port }}\n        protocol: TCP\n        targetPort: {{ .Values.jaeger.ui.port }}\n    selector:\n      app: jaeger\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: jaeger-collector\n    namespace: {{ .Release.Namespace }}\n    labels:\n      app: jaeger\n      jaeger-infra: collector-service\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    ports:\n    - name: jaeger-collector-tchannel\n      port: 14267\n      protocol: TCP\n      targetPort: 14267\n    - name: jaeger-collector-http\n      port: 14268\n      targetPort: 14268\n      protocol: TCP\n    selector:\n      app: jaeger\n    type: ClusterIP\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: jaeger-agent\n    namespace: {{ .Release.Namespace }}\n    labels:\n      app: jaeger\n      jaeger-infra: agent-service\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    ports:\n    - name: agent-zipkin-thrift\n      port: 5775\n      protocol: UDP\n      targetPort: 5775\n    - name: agent-compact\n      port: 6831\n      protocol: UDP\n      targetPort: 6831\n    - name: agent-binary\n      port: 6832\n      protocol: UDP\n      targetPort: 6832\n    clusterIP: None\n    selector:\n      app: jaeger\n{{ end }}\n\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/charts/tracing/templates/service.yaml",
    "content": "apiVersion: v1\nkind: List\nitems:\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: zipkin\n    namespace: {{ .Release.Namespace }}\n    labels:\n      app: jaeger\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    type: {{ .Values.service.type }}\n    ports:\n      - port: {{ .Values.service.externalPort }}\n        targetPort: {{ .Values.service.internalPort }}\n        protocol: TCP\n        name: {{ .Values.service.name }}\n    selector:\n      app: jaeger\n- apiVersion: v1\n  kind: Service\n  metadata:\n    name: tracing\n    namespace: {{ .Release.Namespace }}\n    annotations:\n      {{- range $key, $val := .Values.service.annotations }}\n      {{ $key }}: {{ $val }}\n      {{- end }}\n    labels:\n      app: jaeger\n      chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n      release: {{ .Release.Name }}\n      heritage: {{ .Release.Service }}\n  spec:\n    ports:\n      - name: http-query\n        port: 80\n        protocol: TCP\n        targetPort: {{ .Values.jaeger.ui.port }}\n    selector:\n      app: jaeger\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/requirements.yaml",
    "content": "dependencies:\n  - name: sidecarInjectorWebhook\n    version: 1.0.4\n    condition: sidecarInjectorWebhook.enabled\n  - name: security\n    version: 1.0.4\n    condition: security.enabled\n  - name: ingress\n    version: 1.0.4\n    condition: ingress.enabled\n  - name: gateways\n    version: 1.0.4\n    condition: gateways.enabled\n  - name: mixer\n    version: 1.0.4\n    condition: mixer.enabled\n  - name: pilot\n    version: 1.0.4\n    condition: pilot.enabled\n  - name: grafana\n    version: 1.0.4\n    condition: grafana.enabled\n  - name: prometheus\n    version: 1.0.4\n    condition: prometheus.enabled\n  - name: servicegraph\n    version: 1.0.4\n    condition: servicegraph.enabled\n  - name: tracing\n    version: 1.0.4\n    condition: tracing.enabled\n  - name: galley\n    version: 1.0.4\n    condition: galley.enabled\n  - name: kiali\n    version: 1.0.4\n    condition: kiali.enabled\n  - name: certmanager\n    version: 1.0.4\n    condition: certmanager.enabled\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/templates/_affinity.tpl",
    "content": "{{/* affinity - https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ */}}\n\n{{- define \"nodeaffinity\" }}\n  nodeAffinity:\n    requiredDuringSchedulingIgnoredDuringExecution:\n    {{- include \"nodeAffinityRequiredDuringScheduling\" . }}\n    preferredDuringSchedulingIgnoredDuringExecution:\n    {{- include \"nodeAffinityPreferredDuringScheduling\" . }}\n{{- end }}\n\n{{- define \"nodeAffinityRequiredDuringScheduling\" }}\n      nodeSelectorTerms:\n      - matchExpressions:\n        - key: beta.kubernetes.io/arch\n          operator: In\n          values:\n        {{- range $key, $val := .Values.global.arch }}\n          {{- if gt ($val | int) 0 }}\n          - {{ $key }}\n          {{- end }}\n        {{- end }}\n{{- end }}\n\n{{- define \"nodeAffinityPreferredDuringScheduling\" }}\n  {{- range $key, $val := .Values.global.arch }}\n    {{- if gt ($val | int) 0 }}\n    - weight: {{ $val | int }}\n      preference:\n        matchExpressions:\n        - key: beta.kubernetes.io/arch\n          operator: In\n          values:\n          - {{ $key }}\n    {{- end }}\n  {{- end }}\n{{- end }}"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/templates/_helpers.tpl",
    "content": "{{/* vim: set filetype=mustache: */}}\n{{/*\nExpand the name of the chart.\n*/}}\n{{- define \"istio.name\" -}}\n{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a default fully qualified app name.\nWe truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).\n*/}}\n{{- define \"istio.fullname\" -}}\n{{- $name := default .Chart.Name .Values.nameOverride -}}\n{{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nCreate a fully qualified configmap name.\n*/}}\n{{- define \"istio.configmap.fullname\" -}}\n{{- printf \"%s-%s\" .Release.Name \"istio-mesh-config\" | trunc 63 | trimSuffix \"-\" -}}\n{{- end -}}\n\n{{/*\nConfigmap checksum.\n*/}}\n{{- define \"istio.configmap.checksum\" -}}\n{{- print $.Template.BasePath \"/configmap.yaml\" | sha256sum -}}\n{{- end -}}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/templates/configmap.yaml",
    "content": "{{- if .Values.pilot.enabled }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\ndata:\n  mesh: |-\n    # Set the following variable to true to disable policy checks by the Mixer.\n    # Note that metrics will still be reported to the Mixer.\n    disablePolicyChecks: {{ .Values.global.disablePolicyChecks }}\n\n    # Set enableTracing to false to disable request tracing.\n    enableTracing: {{ .Values.global.enableTracing }}\n\n    # Set accessLogFile to empty string to disable access log.\n    accessLogFile: \"{{ .Values.global.proxy.accessLogFile }}\"\n    #\n    # Deprecated: mixer is using EDS\n    {{- if .Values.mixer.enabled }}\n    {{- if .Values.global.controlPlaneSecurityEnabled }}\n    mixerCheckServer: istio-policy.{{ .Release.Namespace }}.svc.cluster.local:15004\n    mixerReportServer: istio-telemetry.{{ .Release.Namespace }}.svc.cluster.local:15004\n    {{- else }}\n    mixerCheckServer: istio-policy.{{ .Release.Namespace }}.svc.cluster.local:9091\n    mixerReportServer: istio-telemetry.{{ .Release.Namespace }}.svc.cluster.local:9091\n    {{- end }}\n\n    # policyCheckFailOpen allows traffic in cases when the mixer policy service cannot be reached.\n    # Default is false which means the traffic is denied when the client is unable to connect to Mixer.\n    policyCheckFailOpen: {{ .Values.global.policyCheckFailOpen }}\n    {{- end }}\n\n    {{- if .Values.ingress.enabled }}\n    # This is the k8s ingress service name, update if you used a different name\n    ingressService: istio-{{ .Values.global.k8sIngressSelector }}\n    {{- end }}\n\n    # Unix Domain Socket through which envoy communicates with NodeAgent SDS to get\n    # key/cert for mTLS. Use secret-mount files instead of SDS if set to empty. \n    sdsUdsPath: \"\"\n    \n    # How frequently should Envoy fetch key/cert from NodeAgent.\n    sdsRefreshDelay: 15s\n\n    #\n    defaultConfig:\n      #\n      # TCP connection timeout between Envoy & the application, and between Envoys.\n      connectTimeout: 10s\n      #\n      ### ADVANCED SETTINGS #############\n      # Where should envoy's configuration be stored in the istio-proxy container\n      configPath: \"/etc/istio/proxy\"\n      binaryPath: \"/usr/local/bin/envoy\"\n      # The pseudo service name used for Envoy.\n      serviceCluster: istio-proxy\n      # These settings that determine how long an old Envoy\n      # process should be kept alive after an occasional reload.\n      drainDuration: 45s\n      parentShutdownDuration: 1m0s\n      #\n      # The mode used to redirect inbound connections to Envoy. This setting\n      # has no effect on outbound traffic: iptables REDIRECT is always used for\n      # outbound connections.\n      # If \"REDIRECT\", use iptables REDIRECT to NAT and redirect to Envoy.\n      # The \"REDIRECT\" mode loses source addresses during redirection.\n      # If \"TPROXY\", use iptables TPROXY to redirect to Envoy.\n      # The \"TPROXY\" mode preserves both the source and destination IP\n      # addresses and ports, so that they can be used for advanced filtering\n      # and manipulation.\n      # The \"TPROXY\" mode also configures the sidecar to run with the\n      # CAP_NET_ADMIN capability, which is required to use TPROXY.\n      #interceptionMode: REDIRECT\n      #\n      # Port where Envoy listens (on local host) for admin commands\n      # You can exec into the istio-proxy container in a pod and\n      # curl the admin port (curl http://localhost:15000/) to obtain\n      # diagnostic information from Envoy. See\n      # https://lyft.github.io/envoy/docs/operations/admin.html\n      # for more details\n      proxyAdminPort: 15000\n      #\n      # Set concurrency to a specific number to control the number of Proxy worker threads.\n      # If set to 0 (default), then start worker thread for each CPU thread/core.\n      concurrency: {{ .Values.global.proxy.concurrency }}\n      #\n      # Zipkin trace collector\n      zipkinAddress: zipkin.{{ .Release.Namespace }}:9411\n\n    {{- if .Values.global.proxy.envoyStatsd.enabled }}\n      #\n      # Statsd metrics collector converts statsd metrics into Prometheus metrics.\n      statsdUdpAddress: {{ .Values.global.proxy.envoyStatsd.host }}.{{ .Release.Namespace }}:{{ .Values.global.proxy.envoyStatsd.port }}\n    {{- end }}\n\n    {{- if .Values.global.controlPlaneSecurityEnabled }}\n      #\n      # Mutual TLS authentication between sidecars and istio control plane.\n      controlPlaneAuthPolicy: MUTUAL_TLS\n      #\n      # Address where istio Pilot service is running\n      discoveryAddress: istio-pilot.{{ .Release.Namespace }}:15005\n    {{- else }}\n      #\n      # Mutual TLS authentication between sidecars and istio control plane.\n      controlPlaneAuthPolicy: NONE\n      #\n      # Address where istio Pilot service is running\n      discoveryAddress: istio-pilot.{{ .Release.Namespace }}:15007\n    {{- end }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/templates/crds.yaml",
    "content": "# {{ if or .Values.global.crds (semverCompare \">=2.10.0-0\" .Capabilities.TillerVersion.SemVer) }}\n# these CRDs only make sense when pilot is enabled\n# {{- if .Values.pilot.enabled }}\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: virtualservices.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: VirtualService\n    listKind: VirtualServiceList\n    plural: virtualservices\n    singular: virtualservice\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: destinationrules.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: DestinationRule\n    listKind: DestinationRuleList\n    plural: destinationrules\n    singular: destinationrule\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: serviceentries.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: ServiceEntry\n    listKind: ServiceEntryList\n    plural: serviceentries\n    singular: serviceentry\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: gateways.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n    \"helm.sh/hook-weight\": \"-5\"\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: Gateway\n    plural: gateways\n    singular: gateway\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3 \n---\napiVersion: apiextensions.k8s.io/v1beta1\nkind: CustomResourceDefinition\nmetadata:\n  name: envoyfilters.networking.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: istio-pilot\nspec:\n  group: networking.istio.io\n  names:\n    kind: EnvoyFilter\n    plural: envoyfilters\n    singular: envoyfilter\n    categories:\n    - istio-io\n    - networking-istio-io\n  scope: Namespaced\n  version: v1alpha3\n---\n# {{- end }}\n\n# these CRDs only make sense when security is enabled\n# {{- if .Values.security.enabled }}\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: policies.authentication.istio.io\nspec:\n  group: authentication.istio.io\n  names:\n    kind: Policy\n    plural: policies\n    singular: policy\n    categories:\n    - istio-io\n    - authentication-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: meshpolicies.authentication.istio.io\nspec:\n  group: authentication.istio.io\n  names:\n    kind: MeshPolicy\n    listKind: MeshPolicyList\n    plural: meshpolicies\n    singular: meshpolicy\n    categories:\n    - istio-io\n    - authentication-istio-io\n  scope: Cluster\n  version: v1alpha1\n---\n# {{- end }}\n\n# {{- if .Values.mixer.enabled }}\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: httpapispecbindings.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: HTTPAPISpecBinding\n    plural: httpapispecbindings\n    singular: httpapispecbinding\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: httpapispecs.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: HTTPAPISpec\n    plural: httpapispecs\n    singular: httpapispec\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: quotaspecbindings.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: QuotaSpecBinding\n    plural: quotaspecbindings\n    singular: quotaspecbinding\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  annotations:\n    \"helm.sh/hook\": crd-install\n  name: quotaspecs.config.istio.io\nspec:\n  group: config.istio.io\n  names:\n    kind: QuotaSpec\n    plural: quotaspecs\n    singular: quotaspec\n    categories:\n    - istio-io\n    - apim-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\n# Mixer CRDs\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rules.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: core\nspec:\n  group: config.istio.io\n  names:\n    kind: rule\n    plural: rules\n    singular: rule\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: attributemanifests.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: core\nspec:\n  group: config.istio.io\n  names:\n    kind: attributemanifest\n    plural: attributemanifests\n    singular: attributemanifest\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: bypasses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: bypass\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: bypass\n    plural: bypasses\n    singular: bypass\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: circonuses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: circonus\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: circonus\n    plural: circonuses\n    singular: circonus\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: deniers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: denier\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: denier\n    plural: deniers\n    singular: denier\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: fluentds.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: fluentd\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: fluentd\n    plural: fluentds\n    singular: fluentd\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: kubernetesenvs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: kubernetesenv\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: kubernetesenv\n    plural: kubernetesenvs\n    singular: kubernetesenv\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: listcheckers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: listchecker\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: listchecker\n    plural: listcheckers\n    singular: listchecker\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: memquotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: memquota\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: memquota\n    plural: memquotas\n    singular: memquota\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: noops.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: noop\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: noop\n    plural: noops\n    singular: noop\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: opas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: opa\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: opa\n    plural: opas\n    singular: opa\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: prometheuses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: prometheus\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: prometheus\n    plural: prometheuses\n    singular: prometheus\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rbacs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: rbac\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: rbac\n    plural: rbacs\n    singular: rbac\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: redisquotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    package: redisquota\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: redisquota\n    plural: redisquotas\n    singular: redisquota\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicecontrols.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: servicecontrol\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: servicecontrol\n    plural: servicecontrols\n    singular: servicecontrol\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: signalfxs.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: signalfx\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: signalfx\n    plural: signalfxs\n    singular: signalfx\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: solarwindses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: solarwinds\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: solarwinds\n    plural: solarwindses\n    singular: solarwinds\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: stackdrivers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: stackdriver\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: stackdriver\n    plural: stackdrivers\n    singular: stackdriver\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: statsds.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: statsd\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: statsd\n    plural: statsds\n    singular: statsd\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: stdios.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: stdio\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: stdio\n    plural: stdios\n    singular: stdio\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: apikeys.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: apikey\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: apikey\n    plural: apikeys\n    singular: apikey\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: authorizations.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: authorization\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: authorization\n    plural: authorizations\n    singular: authorization\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: checknothings.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: checknothing\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: checknothing\n    plural: checknothings\n    singular: checknothing\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: kuberneteses.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: adapter.template.kubernetes\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: kubernetes\n    plural: kuberneteses\n    singular: kubernetes\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: listentries.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: listentry\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: listentry\n    plural: listentries\n    singular: listentry\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: logentries.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: logentry\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: logentry\n    plural: logentries\n    singular: logentry\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: edges.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: edge\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: edge\n    plural: edges\n    singular: edge\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: metrics.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: metric\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: metric\n    plural: metrics\n    singular: metric\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: quotas.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: quota\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: quota\n    plural: quotas\n    singular: quota\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: reportnothings.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: reportnothing\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: reportnothing\n    plural: reportnothings\n    singular: reportnothing\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicecontrolreports.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: servicecontrolreport\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: servicecontrolreport\n    plural: servicecontrolreports\n    singular: servicecontrolreport\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: tracespans.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: tracespan\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: tracespan\n    plural: tracespans\n    singular: tracespan\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: rbacconfigs.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: RbacConfig\n    plural: rbacconfigs\n    singular: rbacconfig\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: serviceroles.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: ServiceRole\n    plural: serviceroles\n    singular: servicerole\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\n\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: servicerolebindings.rbac.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: istio.io.mixer\n    istio: rbac\nspec:\n  group: rbac.istio.io\n  names:\n    kind: ServiceRoleBinding\n    plural: servicerolebindings\n    singular: servicerolebinding\n    categories:\n    - istio-io\n    - rbac-istio-io\n  scope: Namespaced\n  version: v1alpha1\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: adapters.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: adapter\n    istio: mixer-adapter\nspec:\n  group: config.istio.io\n  names:\n    kind: adapter\n    plural: adapters\n    singular: adapter\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: instances.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: instance\n    istio: mixer-instance\nspec:\n  group: config.istio.io\n  names:\n    kind: instance\n    plural: instances\n    singular: instance\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: templates.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: template\n    istio: mixer-template\nspec:\n  group: config.istio.io\n  names:\n    kind: template\n    plural: templates\n    singular: template\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\nkind: CustomResourceDefinition\napiVersion: apiextensions.k8s.io/v1beta1\nmetadata:\n  name: handlers.config.istio.io\n  annotations:\n    \"helm.sh/hook\": crd-install\n  labels:\n    app: mixer\n    package: handler\n    istio: mixer-handler\nspec:\n  group: config.istio.io\n  names:\n    kind: handler\n    plural: handlers\n    singular: handler\n    categories:\n    - istio-io\n    - policy-istio-io\n  scope: Namespaced\n  version: v1alpha2\n---\n# {{- end }}\n# {{ end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/templates/install-custom-resources.sh.tpl",
    "content": "{{ define \"install-custom-resources.sh.tpl\" }}\n#!/bin/sh\n\nset -x\n\nif [ \"$#\" -ne \"1\" ]; then\n    echo \"first argument should be path to custom resource yaml\"\n    exit 1\nfi\n\npathToResourceYAML=${1}\n\n/kubectl get validatingwebhookconfiguration istio-galley 2>/dev/null\nif [ \"$?\" -eq 0 ]; then\n    echo \"istio-galley validatingwebhookconfiguration found - waiting for istio-galley deployment to be ready\"\n    while true; do\n        /kubectl -n {{ .Release.Namespace }} get deployment istio-galley 2>/dev/null\n        if [ \"$?\" -eq 0 ]; then\n            break\n        fi\n        sleep 1\n    done\n    /kubectl -n {{ .Release.Namespace }} rollout status deployment istio-galley\n    if [ \"$?\" -ne 0 ]; then\n        echo \"istio-galley deployment rollout status check failed\"\n        exit 1\n    fi\n    echo \"istio-galley deployment ready for configuration validation\"\nfi\nsleep 5\n/kubectl apply -f ${pathToResourceYAML}\n{{ end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/templates/sidecar-injector-configmap.yaml",
    "content": "{{- if not .Values.global.omitSidecarInjectorConfigMap }}\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: istio-sidecar-injector\n  namespace: {{ .Release.Namespace }}\n  labels:\n    app: {{ template \"istio.name\" . }}\n    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace \"+\" \"_\" }}\n    release: {{ .Release.Name }}\n    heritage: {{ .Release.Service }}\n    istio: sidecar-injector\ndata:\n  config: |-\n    policy: {{ .Values.global.proxy.autoInject }}\n    template: |-\n      initContainers:\n      - name: istio-init\n{{- if contains \"/\" .Values.global.proxy_init.image }}\n        image: \"{{ .Values.global.proxy_init.image }}\"\n{{- else }}\n        image: \"{{ .Values.global.hub }}/{{ .Values.global.proxy_init.image }}:{{ .Values.global.tag }}\"\n{{- end }}\n        args:\n        - \"-p\"\n        - {{ \"[[ .MeshConfig.ProxyListenPort ]]\" }}\n        - \"-u\"\n        - 1337\n        - \"-m\"\n        - {{ \"[[ annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode ]]\" }}\n        - \"-i\"\n        - {{ \"\\\"[[ annotation .ObjectMeta `traffic.sidecar.istio.io/includeOutboundIPRanges` \" }} \"{{ .Values.global.proxy.includeIPRanges }}\" {{ \" ]]\\\"\" }}\n        - \"-x\"\n        - {{ \"\\\"[[ annotation .ObjectMeta `traffic.sidecar.istio.io/excludeOutboundIPRanges` \" }} \"{{ .Values.global.proxy.excludeIPRanges }}\" {{ \" ]]\\\"\" }}\n        - \"-b\"\n        - {{ \"\\\"[[ annotation .ObjectMeta `traffic.sidecar.istio.io/includeInboundPorts` (includeInboundPorts .Spec.Containers) ]]\\\"\" }}\n        - \"-d\"\n        - {{ \"\\\"[[ excludeInboundPort (annotation .ObjectMeta `status.sidecar.istio.io/port` \" }} {{ .Values.global.proxy.statusPort }} {{ \") (annotation .ObjectMeta `traffic.sidecar.istio.io/excludeInboundPorts` \" }} \"{{ .Values.global.proxy.excludeInboundPorts }}\" {{ \") ]]\\\"\" }}\n        imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n        securityContext:\n          capabilities:\n            add:\n            - NET_ADMIN\n          privileged: true\n        restartPolicy: Always\n      {{- if .Values.global.proxy.enableCoreDump }}\n      - args:\n        - -c\n        - sysctl -w kernel.core_pattern=/var/lib/istio/core.proxy && ulimit -c unlimited\n        command:\n          - /bin/sh\n        image: {{ .Values.global.hub }}/proxy_init:{{ .Values.global.tag }}\n        imagePullPolicy: IfNotPresent\n        name: enable-core-dump\n        resources: {}\n        securityContext:\n          privileged: true\n      {{ end }}\n      containers:\n      - name: istio-proxy\n{{- if contains \"/\" .Values.global.proxy.image }}\n        image: {{ \"[[ annotation .ObjectMeta `sidecar.istio.io/proxyImage` \" }} \"{{ .Values.global.proxy.image }}\" {{ \" ]]\" }}\n{{- else }}\n        image: {{ \"[[ annotation .ObjectMeta `sidecar.istio.io/proxyImage` \" }} \"{{ .Values.global.hub }}/{{ .Values.global.proxy.image }}:{{ .Values.global.tag }}\" {{ \" ]]\" }}\n{{- end }}\n{{ if ne .Values.global.proxy.stats.prometheusPort 0. }}\n        ports:\n        - containerPort: {{ .Values.global.proxy.stats.prometheusPort }}\n          protocol: TCP\n          name: http-envoy-prom\n{{ end }}\n        args:\n        - proxy\n        - sidecar\n        - --configPath\n        - {{ \"[[ .ProxyConfig.ConfigPath ]]\" }}\n        - --binaryPath\n        - {{ \"[[ .ProxyConfig.BinaryPath ]]\" }}\n        - --serviceCluster\n        {{ \"[[ if ne \\\"\\\" (index .ObjectMeta.Labels \\\"app\\\") -]]\" }}\n        - {{ \"[[ index .ObjectMeta.Labels \\\"app\\\" ]]\" }}\n        {{ \"[[ else -]]\" }}\n        - \"istio-proxy\"\n        {{ \"[[ end -]]\" }}\n        - --drainDuration\n        - {{ \"[[ formatDuration .ProxyConfig.DrainDuration ]]\" }}\n        - --parentShutdownDuration\n        - {{ \"[[ formatDuration .ProxyConfig.ParentShutdownDuration ]]\" }}\n        - --discoveryAddress\n        - {{ \"[[ annotation .ObjectMeta `sidecar.istio.io/discoveryAddress` .ProxyConfig.DiscoveryAddress ]]\" }}\n        - --discoveryRefreshDelay\n        - {{ \"[[ formatDuration .ProxyConfig.DiscoveryRefreshDelay ]]\" }}\n        - --zipkinAddress\n        - {{ \"[[ .ProxyConfig.ZipkinAddress ]]\" }}\n        - --connectTimeout\n        - {{ \"[[ formatDuration .ProxyConfig.ConnectTimeout ]]\" }}\n      {{- if .Values.global.proxy.envoyStatsd.enabled }}\n        - --statsdUdpAddress\n        - {{ \"[[ .ProxyConfig.StatsdUdpAddress ]]\" }}\n      {{- end }}\n        - --proxyAdminPort\n        - {{ \"[[ .ProxyConfig.ProxyAdminPort ]]\" }}\n        {{ \"[[ if gt .ProxyConfig.Concurrency 0 -]]\" }}\n        - --concurrency\n        - {{ \"[[ .ProxyConfig.Concurrency ]]\" }}\n        {{ \"[[ end -]]\" }}\n        - --controlPlaneAuthPolicy\n        - {{ \"[[ annotation .ObjectMeta `sidecar.istio.io/controlPlaneAuthPolicy` .ProxyConfig.ControlPlaneAuthPolicy ]]\" }}\n      {{ \"[[- if (ne (annotation .ObjectMeta `status.sidecar.istio.io/port` \" }} {{ .Values.global.proxy.statusPort }} {{ \") \\\"0\\\") ]]\" }}\n        - --statusPort\n        - {{ \"[[ annotation .ObjectMeta `status.sidecar.istio.io/port` \" }} {{ .Values.global.proxy.statusPort }} {{ \" ]]\" }}\n        - --applicationPorts\n        - {{ \"\\\"[[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/applicationPorts` (applicationPorts .Spec.Containers) ]]\\\"\" }}\n      {{ \"[[- end ]]\" }}\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n        - name: INSTANCE_IP\n          valueFrom:\n            fieldRef:\n              fieldPath: status.podIP\n        - name: ISTIO_META_POD_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.name\n        - name: ISTIO_META_INTERCEPTION_MODE\n          value: {{ \"[[ or (index .ObjectMeta.Annotations \\\"sidecar.istio.io/interceptionMode\\\") .ProxyConfig.InterceptionMode.String ]]\" }}\n        {{ \"[[ if .ObjectMeta.Annotations ]]\" }}\n        - name: ISTIO_METAJSON_ANNOTATIONS\n          value: |\n                 {{ \"[[ toJson .ObjectMeta.Annotations ]]\" }}\n        {{ \"[[ end ]]\" }}\n        {{ \"[[ if .ObjectMeta.Labels ]]\" }}\n        - name: ISTIO_METAJSON_LABELS\n          value: |\n                 {{ \"[[ toJson .ObjectMeta.Labels ]]\" }}\n        {{ \"[[ end ]]\" }}\n        imagePullPolicy: {{ .Values.global.imagePullPolicy }}\n        {{ \"[[ if (ne (annotation .ObjectMeta `status.sidecar.istio.io/port` \" }} {{ .Values.global.proxy.statusPort }} {{ \") \\\"0\\\") ]]\" }}\n        readinessProbe:\n          httpGet:\n            path: /healthz/ready\n            port: {{ \"[[ annotation .ObjectMeta `status.sidecar.istio.io/port` \" }} {{ .Values.global.proxy.statusPort }} {{ \" ]]\" }}\n          initialDelaySeconds: {{ \"[[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/initialDelaySeconds` \" }} {{ .Values.global.proxy.readinessInitialDelaySeconds }} {{ \" ]]\" }}\n          periodSeconds: {{ \"[[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/periodSeconds` \" }} {{ .Values.global.proxy.readinessPeriodSeconds }} {{ \" ]]\" }}\n          failureThreshold: {{ \"[[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/failureThreshold` \" }} {{ .Values.global.proxy.readinessFailureThreshold }} {{ \" ]]\" }}\n        {{ \"[[ end -]]\" -}}\n        securityContext:\n          {{ if .Values.global.proxy.privileged }}\n          privileged: true\n          {{ end -}}\n          {{- if ne .Values.global.proxy.enableCoreDump true }}\n          readOnlyRootFilesystem: true\n          {{- end }}\n          {{ \"[[ if eq (annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode) \\\"TPROXY\\\" -]]\" }}\n          capabilities:\n            add:\n            - NET_ADMIN\n          runAsGroup: 1337\n          {{ \"[[ else -]]\" }}\n          runAsUser: 1337\n          {{ \"[[ end -]]\" }}\n        restartPolicy: Always\n        resources:\n          {{ \"[[ if (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyCPU`) -]]\" }}\n          requests:\n            cpu: {{ \"\\\"[[ index .ObjectMeta.Annotations `sidecar.istio.io/proxyCPU` ]]\\\"\" }}\n            memory: {{ \"\\\"[[ index .ObjectMeta.Annotations `sidecar.istio.io/proxyMemory` ]]\\\"\" }}\n        {{ \"[[ else -]]\" }}\n{{- if .Values.global.proxy.resources }}\n{{ toYaml .Values.global.proxy.resources | indent 10 }}\n{{- end }}\n        {{ \"[[ end -]]\" }}\n        volumeMounts:\n        - mountPath: /etc/istio/proxy\n          name: istio-envoy\n        - mountPath: /etc/certs/\n          name: istio-certs\n          readOnly: true\n      volumes:\n      - emptyDir:\n          medium: Memory\n        name: istio-envoy\n      - name: istio-certs\n        secret:\n          optional: true\n          {{ \"[[ if eq .Spec.ServiceAccountName \\\"\\\" -]]\" }}\n          secretName: istio.default\n          {{ \"[[ else -]]\" }}\n          secretName: {{ \"[[ printf \\\"istio.%s\\\" .Spec.ServiceAccountName ]]\"  }}\n          {{ \"[[ end -]]\" }}\n{{- end }}\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-auth-galley.yaml",
    "content": "# This is used to generate istio.yaml\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nistiotesting:\n  oneNameSpace: false\n\nprometheus:\n  enabled: true\n\ngalley:\n  enabled: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-auth-multicluster.yaml",
    "content": "# This is used to generate istio-auth-multicluster.yaml, used for CI/CD.\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\n# In a multiple cluster environment, citadel uses the same root certificate in all the clusters\nsecurity:\n  selfSigned: false\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-auth.yaml",
    "content": "# This is used to generate istio-auth.yaml for automated CI/CD test, using v1/alpha1\n# or v2/alpha3 with 'gradual migration' (using env variable at inject time).\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-demo-auth.yaml",
    "content": "# This is used to generate istio-auth.yaml for minimal, demo mode with MTLS enabled.\n# It is shipped with the release, used for bookinfo or quick installation of istio.\n# Includes components used in the demo, defaults to alpha3 rules.\nglobal:\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\ningress:\n  # Ingress is used for migration, for alpha3 we expect ingressgateway\n  enabled: false\n\nprometheus:\n  enabled: true\n\npilot:\n  traceSampling: 100.0\n\nsidecarInjectorWebhook:\n  enabled: true\n  enableNamespacesByDefault: false\n\ngrafana:\n  enabled: true\n\ntracing:\n  enabled: true\n\nservicegraph:\n  enabled: true\n\ngalley:\n  enabled: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-demo.yaml",
    "content": "# This is used to generate istio.yaml for minimal, demo mode.\n# It is shipped with the release, used for bookinfo or quick installation of istio.\n# Includes components used in the demo, defaults to alpha3 rules.\n\n# If running in minikube you may add:\n# --set global.nodePort=true\n# --set ingressgateway.service.type=NodePort\nglobal:\n  nodePort: false\n\ningress:\n  # Ingress is used for migration, for alpha3 we expect ingressgateway\n  enabled: false\n\nprometheus:\n  enabled: true\n\npilot:\n  traceSampling: 100.0\n\nsidecarInjectorWebhook:\n  enabled: true\n  enableNamespacesByDefault: false\n\ngrafana:\n  enabled: true\n\ntracing:\n  enabled: true\n\nservicegraph:\n  enabled: true\n\ngalley:\n  enabled: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-galley.yaml",
    "content": "# This is used to generate istio.yaml\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: false\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: false\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nistiotesting:\n  oneNameSpace: false\n\nprometheus:\n  enabled: true\n\ngalley:\n  enabled: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-gateways.yaml",
    "content": "# Common settings.\nglobal:\n  # Include the crd definition when generating the template.\n  # For 'helm template' and helm install > 2.10 it should be true.\n  # For helm < 2.9, crds must be installed ahead of time with\n  # 'kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml\n  # and this options must be set off.\n  crds: false\n\n  # Omit the istio-sidecar-injector configmap when generate a\n  # standalone gateway. Gateways may be created in namespaces other\n  # than `istio-system` and we don't want to re-create the injector\n  # configmap in those.\n  omitSidecarInjectorConfigMap: true\n\n  # Istio control plane namespace: This specifies where the Istio control\n  # plane was installed earlier.  Modify this if you installed the control\n  # plane in a different namespace than istio-system.\n  istioNamespace: istio-system\n\n  proxy:\n    # Sets the destination Statsd in envoy (the value of the \"--statsdUdpAddress\" proxy argument\n    # would be <host>:<port>).\n    # Disabled by default.\n    # The istio-statsd-prom-bridge is deprecated and should not be used moving forward.\n    envoyStatsd:\n      # If enabled is set to true, host and port must also be provided. Istio no longer provides a statsd collector.\n      enabled: false\n      host: # example: statsd-svc\n      port: # example: 9125\n\n\n#\n# Gateways Configuration\n# By default (if enabled) a pair of Ingress and Egress Gateways will be created for the mesh.\n# You can add more gateways in addition to the defaults but make sure those are uniquely named\n# and that NodePorts are not conflicting.\n# Disable specifc gateway by setting the `enabled` to false.\n#\ngateways:\n  enabled: true\n\n  custom-gateway:\n    enabled: true\n    labels:\n      app: custom-gateway\n    replicaCount: 1\n    autoscaleMin: 1\n    autoscaleMax: 5\n    resources: {}\n      # limits:\n      #  cpu: 100m\n      #  memory: 128Mi\n      #requests:\n      #  cpu: 1800m\n      #  memory: 256Mi\n\n    loadBalancerIP: \"\"\n    serviceAnnotations: {}\n    type: LoadBalancer #change to NodePort, ClusterIP or LoadBalancer if need be\n    # Uncomment the following line to preserve client source ip.\n    # externalTrafficPolicy: Local\n\n    ports:\n      ## You can add custom gateway ports\n    - port: 80\n      targetPort: 80\n      name: http2\n      # nodePort: 31380\n    - port: 443\n      name: https\n      # nodePort: 31390\n    - port: 31400\n      name: tcp\n      # nodePort: 31400\n    # Pilot and Citadel MTLS ports are enabled in gateway - but will only redirect\n    # to pilot/citadel if global.meshExpansion settings are enabled.\n    - port: 15011\n      targetPort: 15011\n      name: tcp-pilot-grpc-tls\n    - port: 8060\n      targetPort: 8060\n      name: tcp-citadel-grpc-tls\n    # Telemetry-related ports are enabled in gateway - but will only redirect if\n    # the gateway configration for the various components are enabled.\n    - port: 15030\n      targetPort: 15030\n      name: http2-prometheus\n    - port: 15031\n      targetPort: 15031\n      name: http2-grafana\n    secretVolumes:\n    - name: customgateway-certs\n      secretName: istio-customgateway-certs\n      mountPath: /etc/istio/customgateway-certs\n    - name: customgateway-ca-certs\n      secretName: istio-customgateway-ca-certs\n      mountPath: /etc/istio/customgateway-ca-certs\n\n# all other components are disabled except the gateways\ningress:\n  enabled: false\n\nsecurity:\n  enabled: false\n\nsidecarInjectorWebhook:\n  enabled: false\n\ngalley:\n  enabled: false\n\nmixer:\n  enabled: false\n\npilot:\n  enabled: false\n\ngrafana:\n  enabled: false\n\nprometheus:\n  enabled: false\n\nservicegraph:\n  enabled: false\n\ntracing:\n  enabled: false\n\nkiali:\n  enabled: false\n\ncertmanager:\n  enabled: false\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-multicluster.yaml",
    "content": "# This is used to generate istio-multicluster.yaml, used for CI/CD.\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: false\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: false\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nprometheus:\n  enabled: true\n\n# In a multiple cluster environment, citadel uses the same root certificate in all the clusters\nsecurity:\n  selfSigned: false\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-one-namespace-auth.yaml",
    "content": "# This is used to generate istio.yaml used for deprecated CI/CD testing.\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: true\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: true\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nistiotesting:\n  oneNameSpace: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio-one-namespace.yaml",
    "content": "# This is used to generate istio.yaml used for deprecated CI/CD testing.\nglobal:\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: false\n\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: false\n\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n\nistiotesting:\n  oneNameSpace: true\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values-istio.yaml",
    "content": "# This is used to generate istio.yaml for automated CI/CD test, using v1/alpha1\n# or v2/alpha3 with 'gradual migration' (using env variable at inject time).\nglobal:\n  ## imagePullSecrets for all ServiceAccount. Must be set for any clustser configured with privte docker registry.\n  # imagePullSecrets:\n  #   - name: \"private-registry-key\"\n\n  # Default is 10s second\n  refreshInterval: 1s\n"
  },
  {
    "path": "istio-workshop/2_istio/charts_1.0.4/values.yaml",
    "content": "# Common settings.\nglobal:\n  # Default hub for Istio images.\n  # Releases are published to docker hub under 'istio' project.\n  # Daily builds from prow are on gcr.io, and nightly builds from circle on docker.io/istionightly\n  hub: docker.io/istio\n\n  # Default tag for Istio images.\n  tag: 1.0.4\n\n  # Gateway used for legacy k8s Ingress resources. By default it is\n  # using 'istio:ingress', to match 0.8 config. It requires that\n  # ingress.enabled is set to true. You can also set it\n  # to ingressgateway, or any other gateway you define in the 'gateway'\n  # section.\n  k8sIngressSelector: ingress\n\n  # k8sIngressHttps will add port 443 on the ingress and ingressgateway.\n  # It REQUIRES that the certificates are installed  in the\n  # expected secrets - enabling this option without certificates\n  # will result in LDS rejection and the ingress will not work.\n  k8sIngressHttps: false\n\n  proxy:\n    image: proxyv2\n\n    # Resources for the sidecar.\n    resources:\n      requests:\n        cpu: 10m\n      #  memory: 128Mi\n      # limits:\n      #   cpu: 100m\n      #   memory: 128Mi\n\n    # Controls number of Proxy worker threads.\n    # If set to 0 (default), then start worker thread for each CPU thread/core.\n    concurrency: 0\n\n    # Configures the access log for each sidecar. Setting it to an empty string will\n    # disable access log for sidecar.\n    accessLogFile: \"/dev/stdout\"\n\n    #If set to true, istio-proxy container will have privileged securityContext\n    privileged: false\n\n    # If set, newly injected sidecars will have core dumps enabled. Core dumps will always be written to the same\n    # file to prevent storage filling up indefinitely. Add a timestamp option to core_pattern to keep all cores:\n    # e.g. sysctl -w kernel.core_pattern=/var/lib/istio/core.%e.%p.%t\n    enableCoreDump: false\n\n    # Default port for Pilot agent health checks. A value of 0 will disable health checking.\n    # statusPort: 15020\n    statusPort: 0\n\n    # The initial delay for readiness probes in seconds.\n    readinessInitialDelaySeconds: 1\n\n    # The period between readiness probes.\n    readinessPeriodSeconds: 2\n\n    # The number of successive failed probes before indicating readiness failure.\n    readinessFailureThreshold: 30\n\n    # istio egress capture whitelist\n    # https://istio.io/docs/tasks/traffic-management/egress.html#calling-external-services-directly\n    # example: includeIPRanges: \"172.30.0.0/16,172.20.0.0/16\"\n    # would only capture egress traffic on those two IP Ranges, all other outbound traffic would\n    # be allowed by the sidecar\n    includeIPRanges: \"*\"\n    excludeIPRanges: \"\"\n\n    # istio ingress capture whitelist\n    # examples:\n    #     Redirect no inbound traffic to Envoy:    --includeInboundPorts=\"\"\n    #     Redirect all inbound traffic to Envoy:   --includeInboundPorts=\"*\"\n    #     Redirect only selected ports:            --includeInboundPorts=\"80,8080\"\n    includeInboundPorts: \"*\"\n    excludeInboundPorts: \"\"\n\n    # This controls the 'policy' in the sidecar injector.\n    autoInject: enabled\n\n    # Sets the destination Statsd in envoy (the value of the \"--statsdUdpAddress\" proxy argument\n    # would be <host>:<port>).\n    # Disabled by default.\n    # The istio-statsd-prom-bridge is deprecated and should not be used moving forward.\n    envoyStatsd:\n      # If enabled is set to true, host and port must also be provided. Istio no longer provides a statsd collector.\n      enabled: false\n      host: # example: statsd-svc\n      port: # example: 9125\n\n    # This controls the stats collection for proxies. To disable stats\n    # collection, set the prometheusPort to 0.\n    stats:\n      prometheusPort: 15090\n\n  proxy_init:\n    # Base name for the proxy_init container, used to configure iptables.\n    image: proxy_init\n\n  # imagePullPolicy is applied to istio control plane components.\n  # local tests require IfNotPresent, to avoid uploading to dockerhub.\n  # TODO: Switch to Always as default, and override in the local tests.\n  imagePullPolicy: IfNotPresent\n\n  # controlPlaneMtls enabled. Will result in delays starting the pods while secrets are\n  # propagated, not recommended for tests.\n  controlPlaneSecurityEnabled: false\n\n  # disablePolicyChecks disables mixer policy checks.\n  # Will set the value with same name in istio config map - pilot needs to be restarted to take effect.\n  disablePolicyChecks: false\n\n  # policyCheckFailOpen allows traffic in cases when the mixer policy service cannot be reached.\n  # Default is false which means the traffic is denied when the client is unable to connect to Mixer.\n  policyCheckFailOpen: false\n\n  # EnableTracing sets the value with same name in istio config map, requires pilot restart to take effect.\n  enableTracing: true\n\n  # Default mtls policy. If true, mtls between services will be enabled by default.\n  mtls:\n    # Default setting for service-to-service mtls. Can be set explicitly using\n    # destination rules or service annotations.\n    enabled: false\n\n  # ImagePullSecrets for all ServiceAccount, list of secrets in the same namespace\n  # to use for pulling any images in pods that reference this ServiceAccount.\n  # Must be set for any clustser configured with privte docker registry.\n  imagePullSecrets:\n    # - private-registry-key\n\n  # Specify pod scheduling arch(amd64, ppc64le, s390x) and weight as follows:\n  #   0 - Never scheduled\n  #   1 - Least preferred\n  #   2 - No preference\n  #   3 - Most preferred\n  arch:\n    amd64: 2\n    s390x: 2\n    ppc64le: 2\n\n  # Whether to restrict the applications namespace the controller manages;\n  # If not set, controller watches all namespaces\n  oneNamespace: false\n\n  # Whether to perform server-side validation of configuration.\n  configValidation: true\n\n  # If set to true, the pilot and citadel mtls will be exposed on the\n  # ingress gateway\n  meshExpansion: false\n\n  # If set to true, the pilot and citadel mtls and the plain text pilot ports\n  # will be exposed on an internal gateway\n  meshExpansionILB: false\n\n  # A minimal set of requested resources to applied to all deployments so that\n  # Horizontal Pod Autoscaler will be able to function (if set).\n  # Each component can overwrite these default values by adding its own resources\n  # block in the relevant section below and setting the desired resources values.\n  defaultResources:\n    requests:\n      cpu: 10m\n    #   memory: 128Mi\n    # limits:\n    #   cpu: 100m\n    #   memory: 128Mi\n\n  # Not recommended for user to configure this. Hyperkube image to use when creating custom resources\n  hyperkube:\n    hub: quay.io/coreos\n    tag: v1.7.6_coreos.0\n\n  # Kubernetes >=v1.11.0 will create two PriorityClass, including system-cluster-critical and\n  # system-node-critical, it is better to configure this in order to make sure your Istio pods\n  # will not be killed because of low prioroty class.\n  # Refer to https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\n  # for more detail.\n  priorityClassName: \"\"\n\n  # Include the crd definition when generating the template.\n  # For 'helm template' and helm install > 2.10 it should be true.\n  # For helm < 2.9, crds must be installed ahead of time with\n  # 'kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml\n  # and this options must be set off.\n  crds: true\n\n#\n# ingress configuration\n#\ningress:\n  enabled: false\n  replicaCount: 1\n  autoscaleMin: 1\n  autoscaleMax: 5\n  service:\n    annotations: {}\n    loadBalancerIP: \"\"\n    type: LoadBalancer #change to NodePort, ClusterIP or LoadBalancer if need be\n    # Uncomment the following line to preserve client source ip.\n    # externalTrafficPolicy: Local\n    ports:\n    - port: 80\n      name: http\n      nodePort: 32000\n    - port: 443\n      name: https\n    selector:\n      istio: ingress\n\n#\n# Gateways Configuration\n# By default (if enabled) a pair of Ingress and Egress Gateways will be created for the mesh.\n# You can add more gateways in addition to the defaults but make sure those are uniquely named\n# and that NodePorts are not conflicting.\n# Disable specifc gateway by setting the `enabled` to false.\n#\ngateways:\n  enabled: true\n\n  istio-ingressgateway:\n    enabled: true\n    labels:\n      app: istio-ingressgateway\n      istio: ingressgateway\n    replicaCount: 1\n    autoscaleMin: 1\n    autoscaleMax: 5\n    resources: {}\n      # limits:\n      #  cpu: 100m\n      #  memory: 128Mi\n      #requests:\n      #  cpu: 1800m\n      #  memory: 256Mi\n    cpu:\n      targetAverageUtilization: 80\n    loadBalancerIP: \"\"\n    serviceAnnotations: {}\n    type: LoadBalancer #change to NodePort, ClusterIP or LoadBalancer if need be\n    # Uncomment the following line to preserve client source ip.\n    # externalTrafficPolicy: Local\n\n    ports:\n      ## You can add custom gateway ports\n    - port: 80\n      targetPort: 80\n      name: http2\n      nodePort: 31380\n    - port: 443\n      name: https\n      nodePort: 31390\n    - port: 31400\n      name: tcp\n      nodePort: 31400\n    # Pilot and Citadel MTLS ports are enabled in gateway - but will only redirect\n    # to pilot/citadel if global.meshExpansion settings are enabled.\n    - port: 15011\n      targetPort: 15011\n      name: tcp-pilot-grpc-tls\n    - port: 8060\n      targetPort: 8060\n      name: tcp-citadel-grpc-tls\n    - port: 853\n      targetPort: 853\n      name: tcp-dns-tls\n    - port: 15030\n      targetPort: 15030\n      name: http2-prometheus\n    - port: 15031\n      targetPort: 15031\n      name: http2-grafana\n    secretVolumes:\n    - name: ingressgateway-certs\n      secretName: istio-ingressgateway-certs\n      mountPath: /etc/istio/ingressgateway-certs\n    - name: ingressgateway-ca-certs\n      secretName: istio-ingressgateway-ca-certs\n      mountPath: /etc/istio/ingressgateway-ca-certs\n\n  istio-egressgateway:\n    enabled: true\n    labels:\n      app: istio-egressgateway\n      istio: egressgateway\n    replicaCount: 1\n    autoscaleMin: 1\n    autoscaleMax: 5\n    cpu:\n      targetAverageUtilization: 80\n    serviceAnnotations: {}\n    type: ClusterIP #change to NodePort or LoadBalancer if need be\n    ports:\n      - port: 80\n        name: http2\n      - port: 443\n        name: https\n    secretVolumes:\n      - name: egressgateway-certs\n        secretName: istio-egressgateway-certs\n        mountPath: /etc/istio/egressgateway-certs\n      - name: egressgateway-ca-certs\n        secretName: istio-egressgateway-ca-certs\n        mountPath: /etc/istio/egressgateway-ca-certs\n\n  # Mesh ILB gateway creates a gateway of type InternalLoadBalancer,\n  # for mesh expansion. It exposes the mtls ports for Pilot,CA as well\n  # as non-mtls ports to support upgrades and gradual transition.\n  istio-ilbgateway:\n    enabled: false\n    labels:\n      app: istio-ilbgateway\n      istio: ilbgateway\n    replicaCount: 1\n    autoscaleMin: 1\n    autoscaleMax: 5\n    resources:\n      requests:\n        cpu: 800m\n        memory: 512Mi\n      #limits:\n      #  cpu: 1800m\n      #  memory: 256Mi\n    cpu:\n      targetAverageUtilization: 80      \n    loadBalancerIP: \"\"\n    serviceAnnotations:\n      cloud.google.com/load-balancer-type: \"internal\"\n    type: LoadBalancer\n    ports:\n    ## You can add custom gateway ports - google ILB default quota is 5 ports,\n    - port: 15011\n      name: grpc-pilot-mtls\n    # Insecure port - only for migration from 0.8. Will be removed in 1.1\n    - port: 15010\n      name: grpc-pilot\n    - port: 8060\n      targetPort: 8060\n      name: tcp-citadel-grpc-tls\n    # Port 853 is reserved for the kube-dns gateway\n    - port: 853\n      name: tcp-dns\n    secretVolumes:\n    - name: ilbgateway-certs\n      secretName: istio-ilbgateway-certs\n      mountPath: /etc/istio/ilbgateway-certs\n    - name: ilbgateway-ca-certs\n      secretName: istio-ilbgateway-ca-certs\n      mountPath: /etc/istio/ilbgateway-ca-certs\n\n#\n# sidecar-injector webhook configuration\n#\nsidecarInjectorWebhook:\n  enabled: true\n  replicaCount: 1\n  image: sidecar_injector\n  enableNamespacesByDefault: false\n\n#\n# galley configuration\n#\ngalley:\n  enabled: true\n  replicaCount: 1\n  image: galley\n\n#\n# mixer configuration\n#\nmixer:\n  enabled: true\n  replicaCount: 1\n  autoscaleMin: 1\n  autoscaleMax: 5\n  image: mixer\n\n  env:\n    GODEBUG: gctrace=2\n\n  istio-policy:\n    autoscaleEnabled: true\n    autoscaleMin: 1\n    autoscaleMax: 5\n    cpu:\n      targetAverageUtilization: 80\n\n  istio-telemetry:\n    autoscaleEnabled: true\n    autoscaleMin: 1\n    autoscaleMax: 5\n    cpu:\n      targetAverageUtilization: 80\n\n  prometheusStatsdExporter:\n    hub: docker.io/prom\n    tag: v0.6.0\n\n#\n# pilot configuration\n#\npilot:\n  enabled: true\n  replicaCount: 1\n  autoscaleMin: 1\n  autoscaleMax: 5\n  image: pilot\n  sidecar: true\n  traceSampling: 1.0\n  # Resources for a small pilot install\n  resources:\n    requests:\n      cpu: 500m\n      memory: 2048Mi\n  env:\n    PILOT_PUSH_THROTTLE_COUNT: 100\n    GODEBUG: gctrace=2\n  cpu:\n    targetAverageUtilization: 80\n\n#\n# security configuration\n#\nsecurity:\n  replicaCount: 1\n  image: citadel\n  selfSigned: true # indicate if self-signed CA is used.\n\n#\n# addons configuration\n#\ntelemetry-gateway:\n  gatewayName: ingressgateway\n  grafanaEnabled: false\n  prometheusEnabled: false\n\ngrafana:\n  enabled: false\n  replicaCount: 1\n  image:\n    repository: grafana/grafana\n    tag: 5.2.3\n  persist: false\n  storageClassName: \"\"\n  security:\n    enabled: false\n    adminUser: admin\n    adminPassword: admin\n  service:\n    annotations: {}\n    name: http\n    type: ClusterIP\n    externalPort: 3000\n    internalPort: 3000\n\nprometheus:\n  enabled: true\n  replicaCount: 1\n  hub: docker.io/prom\n  tag: v2.3.1\n\n  service:\n    annotations: {}\n    nodePort:\n      enabled: false\n      port: 32090\n\nservicegraph:\n  enabled: false\n  replicaCount: 1\n  image: servicegraph\n  service:\n    annotations: {}\n    name: http\n    type: ClusterIP\n    externalPort: 8088\n    internalPort: 8088\n  ingress:\n    enabled: false\n    # Used to create an Ingress record.\n    hosts:\n      - servicegraph.local\n    annotations:\n      # kubernetes.io/ingress.class: nginx\n      # kubernetes.io/tls-acme: \"true\"\n    tls:\n      # Secrets must be manually created in the namespace.\n      # - secretName: servicegraph-tls\n      #   hosts:\n      #     - servicegraph.local\n  # prometheus addres\n  prometheusAddr: http://prometheus:9090\n\ntracing:\n  enabled: false\n  provider: jaeger\n  jaeger:\n    hub: docker.io/jaegertracing\n    tag: 1.5\n    memory:\n      max_traces: 50000\n    ui:\n      port: 16686\n    ingress:\n      enabled: false\n      # Used to create an Ingress record.\n      hosts:\n        - jaeger.local\n      annotations:\n        # kubernetes.io/ingress.class: nginx\n        # kubernetes.io/tls-acme: \"true\"\n      tls:\n        # Secrets must be manually created in the namespace.\n        # - secretName: jaeger-tls\n        #   hosts:\n        #     - jaeger.local\n  replicaCount: 1\n  service:\n    annotations: {}\n    name: http\n    type: ClusterIP\n    externalPort: 9411\n    internalPort: 9411\n  ingress:\n    enabled: false\n    # Used to create an Ingress record.\n    hosts:\n      - tracing.local\n    annotations:\n      # kubernetes.io/ingress.class: nginx\n      # kubernetes.io/tls-acme: \"true\"\n    tls:\n      # Secrets must be manually created in the namespace.\n      # - secretName: tracing-tls\n      #   hosts:\n      #     - tracing.local\n\nkiali:\n  enabled: false\n  replicaCount: 1\n  hub: docker.io/kiali\n  tag: v0.9\n  ingress:\n    enabled: false\n    ## Used to create an Ingress record.\n    # hosts:\n    #  - kiali.local\n    annotations:\n      # kubernetes.io/ingress.class: nginx\n      # kubernetes.io/tls-acme: \"true\"\n    tls:\n      # Secrets must be manually created in the namespace.\n      # - secretName: kiali-tls\n      #   hosts:\n      #     - kiali.local\n  dashboard:\n    username: admin\n    # Default admin passphrase for kiali. Must be set during setup, and\n    # changed by overriding the secret\n    passphrase: admin\n\n    # Override the automatically detected Grafana URL, usefull when Grafana service has no ExternalIPs\n    # grafanaURL:\n\n    # Override the automatically detected Jaeger URL, usefull when Jaeger service has no ExternalIPs\n    # jaegerURL:\n\n# Certmanager uses ACME to sign certificates. Since Istio gateways are\n# mounting the TLS secrets the Certificate CRDs must be created in the\n# istio-system namespace. Once the certificate has been created, the\n# gateway must be updated by adding 'secretVolumes'. After the gateway\n# restart, DestinationRules can be created using the ACME-signed certificates.\ncertmanager:\n  enabled: false\n  hub: quay.io/jetstack\n  tag: v0.3.1\n  resources: {}\n"
  },
  {
    "path": "istio-workshop/3_application/1_bookinfo-gateway.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: Gateway\nmetadata:\n  name: bookinfo-gateway\nspec:\n  selector:\n    istio: ingressgateway # use istio default controller\n  servers:\n  - port:\n      number: 80\n      name: http\n      protocol: HTTP\n    hosts:\n    - \"*\"\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: bookinfo\nspec:\n  hosts:\n  - \"*\"\n  gateways:\n  - bookinfo-gateway\n  http:\n  - match:\n    - uri:\n        exact: /productpage\n    - uri:\n        exact: /login\n    - uri:\n        exact: /logout\n    - uri:\n        prefix: /api/v1/products\n    route:\n    - destination:\n        host: productpage\n        port:\n          number: 9080\n"
  },
  {
    "path": "istio-workshop/3_application/1_bookinfo.yaml",
    "content": "# Copyright 2017 Istio Authors\n#\n#   Licensed under the Apache License, Version 2.0 (the \"License\");\n#   you may not use this file except in compliance with the License.\n#   You may obtain a copy of the License at\n#\n#       http://www.apache.org/licenses/LICENSE-2.0\n#\n#   Unless required by applicable law or agreed to in writing, software\n#   distributed under the License is distributed on an \"AS IS\" BASIS,\n#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n#   See the License for the specific language governing permissions and\n#   limitations under the License.\n\n##################################################################################################\n# Details service\n##################################################################################################\napiVersion: v1\nkind: Service\nmetadata:\n  name: details\n  labels:\n    app: details\nspec:\n  ports:\n  - port: 9080\n    name: http\n  selector:\n    app: details\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: details-v1\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: details\n        version: v1\n    spec:\n      containers:\n      - name: details\n        image: istio/examples-bookinfo-details-v1:1.8.0\n        imagePullPolicy: IfNotPresent\n        ports:\n        - containerPort: 9080\n---\n##################################################################################################\n# Ratings service\n##################################################################################################\napiVersion: v1\nkind: Service\nmetadata:\n  name: ratings\n  labels:\n    app: ratings\nspec:\n  ports:\n  - port: 9080\n    name: http\n  selector:\n    app: ratings\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: ratings-v1\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: ratings\n        version: v1\n    spec:\n      containers:\n      - name: ratings\n        image: istio/examples-bookinfo-ratings-v1:1.8.0\n        imagePullPolicy: IfNotPresent\n        ports:\n        - containerPort: 9080\n---\n##################################################################################################\n# Reviews service\n##################################################################################################\napiVersion: v1\nkind: Service\nmetadata:\n  name: reviews\n  labels:\n    app: reviews\nspec:\n  ports:\n  - port: 9080\n    name: http\n  selector:\n    app: reviews\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: reviews-v1\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: reviews\n        version: v1\n    spec:\n      containers:\n      - name: reviews\n        image: istio/examples-bookinfo-reviews-v1:1.8.0\n        imagePullPolicy: IfNotPresent\n        ports:\n        - containerPort: 9080\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: reviews-v2\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: reviews\n        version: v2\n    spec:\n      containers:\n      - name: reviews\n        image: istio/examples-bookinfo-reviews-v2:1.8.0\n        imagePullPolicy: IfNotPresent\n        ports:\n        - containerPort: 9080\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: reviews-v3\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: reviews\n        version: v3\n    spec:\n      containers:\n      - name: reviews\n        image: istio/examples-bookinfo-reviews-v3:1.8.0\n        imagePullPolicy: IfNotPresent\n        ports:\n        - containerPort: 9080\n---\n##################################################################################################\n# Productpage services\n##################################################################################################\napiVersion: v1\nkind: Service\nmetadata:\n  name: productpage\n  labels:\n    app: productpage\nspec:\n  ports:\n  - port: 9080\n    name: http\n  selector:\n    app: productpage\n---\napiVersion: extensions/v1beta1\nkind: Deployment\nmetadata:\n  name: productpage-v1\nspec:\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: productpage\n        version: v1\n    spec:\n      containers:\n      - name: productpage\n        image: istio/examples-bookinfo-productpage-v1:1.8.0\n        imagePullPolicy: IfNotPresent\n        ports:\n        - containerPort: 9080\n---\n"
  },
  {
    "path": "istio-workshop/3_application/1_destination-rule-all-mtls.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: productpage\nspec:\n  host: productpage\n  trafficPolicy:\n    tls:\n      mode: ISTIO_MUTUAL\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: reviews\nspec:\n  host: reviews\n  trafficPolicy:\n    tls:\n      mode: ISTIO_MUTUAL\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n  - name: v2\n    labels:\n      version: v2\n  - name: v3\n    labels:\n      version: v3\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: ratings\nspec:\n  host: ratings\n  trafficPolicy:\n    tls:\n      mode: ISTIO_MUTUAL\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n  - name: v2\n    labels:\n      version: v2\n  - name: v2-mysql\n    labels:\n      version: v2-mysql\n  - name: v2-mysql-vm\n    labels:\n      version: v2-mysql-vm\n---\napiVersion: networking.istio.io/v1alpha3\nkind: DestinationRule\nmetadata:\n  name: details\nspec:\n  host: details\n  trafficPolicy:\n    tls:\n      mode: ISTIO_MUTUAL\n  subsets:\n  - name: v1\n    labels:\n      version: v1\n  - name: v2\n    labels:\n      version: v2\n---\n"
  },
  {
    "path": "istio-workshop/3_application/1_install_bookinfo.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\n# DEPLOY THE BOOKINFO APP\nkubectl apply -f \"$script_dir\"/1_bookinfo.yaml\n\n# Apply ingress gateway\nkubectl apply -f \"$script_dir\"/1_bookinfo-gateway.yaml\n\n# set routing rules\nkubectl apply -f \"$script_dir\"/1_destination-rule-all-mtls.yaml    # with mTLS\n"
  },
  {
    "path": "istio-workshop/3_application/99_remove.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\nkubectl delete -f \"$script_dir\"/1_bookinfo.yaml\n\nkubectl delete -f \"$script_dir\"/1_bookinfo-gateway.yaml\n\nkubectl delete -f 1_destination-rule-all-mtls.yaml            # with mTLS\n"
  },
  {
    "path": "istio-workshop/4_traffic/0_generate_traffic.sh",
    "content": "#!/bin/bash\n\nINGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\nexport INGRESS_HOST\nINGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name==\"http2\")].port}')\nexport INGRESS_PORT\n\n# export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name==\"https\")].port}')\n# export SECURE_INGRESS_PORT\n\nexport GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT\n\necho\necho \"The product page is :\"\necho \"http://$GATEWAY_URL/productpage\"\necho\n\n\n# GET SOME TRAFFIC\n#while true; do curl -o /dev/null -s -w \"%{http_code}\\n\" http://$GATEWAY_URL/productpage ; sleep 1; done;\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\n# Or use slapper\necho \"GET http://$GATEWAY_URL/productpage\" > \"$script_dir\"/target\n\nslapper -targets \"$script_dir\"/target -minY 1ms -maxY 1000ms -rate 50\n"
  },
  {
    "path": "istio-workshop/4_traffic/1_traffic_to_v1.sh",
    "content": "#!/bin/bash\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\necho\necho BEFORE\necho\nkubectl get virtualservices\necho\necho \"Switching all to v1\"\necho\nkubectl apply -f \"$script_dir\"/1_virtual-service-all-v1.yaml\n\necho\necho AFTER\necho\n\nkubectl get virtualservices\n"
  },
  {
    "path": "istio-workshop/4_traffic/1_virtual-service-all-v1.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: productpage\nspec:\n  hosts:\n  - productpage\n  http:\n  - route:\n    - destination:\n        host: productpage\n        subset: v1\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n  - reviews\n  http:\n  - route:\n    - destination:\n        host: reviews\n        subset: v1\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: ratings\nspec:\n  hosts:\n  - ratings\n  http:\n  - route:\n    - destination:\n        host: ratings\n        subset: v1\n---\napiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: details\nspec:\n  hosts:\n  - details\n  http:\n  - route:\n    - destination:\n        host: details\n        subset: v1\n---\n"
  },
  {
    "path": "istio-workshop/4_traffic/2_jason_uses_v2.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\n# set user jason to use V2\nkubectl apply -f \"$script_dir\"/2_virtual-service-reviews-test-v2.yaml\n\n"
  },
  {
    "path": "istio-workshop/4_traffic/2_virtual-service-reviews-test-v2.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n    - reviews\n  http:\n  - match:\n    - headers:\n        end-user:\n          exact: jason\n    route:\n    - destination:\n        host: reviews\n        subset: v2\n  - route:\n    - destination:\n        host: reviews\n        subset: v1\n"
  },
  {
    "path": "istio-workshop/4_traffic/3_default_to_v3.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\n# all v3 but user jason to v2\nkubectl apply -f \"$script_dir\"/3_virtual-service-reviews-jason-v2-v3.yaml\n\n"
  },
  {
    "path": "istio-workshop/4_traffic/3_virtual-service-reviews-jason-v2-v3.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: reviews\nspec:\n  hosts:\n  - reviews\n  http:\n  - match:\n    - headers:\n        end-user:\n          exact: jason\n    route:\n    - destination:\n        host: reviews\n        subset: v2\n  - route:\n    - destination:\n        host: reviews\n        subset: v3\n"
  },
  {
    "path": "istio-workshop/4_traffic/99_remove.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\nkubectl delete -f \"$script_dir\"/3_virtual-service-reviews-jason-v2-v3.yaml\nkubectl delete -f \"$script_dir\"/2_virtual-service-reviews-test-v2.yaml\nkubectl delete -f \"$script_dir\"/1_virtual-service-all-v1.yaml\n"
  },
  {
    "path": "istio-workshop/5_chaos/1_fault-injection.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\n# Introduce delay\nkubectl apply -f \"$script_dir\"/1_virtual-service-ratings-test-delay.yaml\n"
  },
  {
    "path": "istio-workshop/5_chaos/1_virtual-service-ratings-test-delay.yaml",
    "content": "apiVersion: networking.istio.io/v1alpha3\nkind: VirtualService\nmetadata:\n  name: ratings\nspec:\n  hosts:\n  - ratings\n  http:\n  - match:\n    - headers:\n        end-user:\n          exact: jason\n    fault:\n      delay:\n        percent: 100\n        fixedDelay: 7s\n    route:\n    - destination:\n        host: ratings\n        subset: v1\n  - route:\n    - destination:\n        host: ratings\n        subset: v1\n"
  },
  {
    "path": "istio-workshop/5_chaos/2_gw.sh",
    "content": "#!/bin/bash\n\necho\necho \"Open the file 2_gw.sh\"\necho\n\nexit 1\n\nfunction get_pod_name {\n  name=\"$1\"\n  ns=\"${2:-\"istio-system\"}\"\n  kubectl get pod -n \"$ns\" -l app=\"$name\" -o jsonpath='{.items[0].metadata.name}'\n}\n\n\nkubectl -n istio-system exec -it \"$(get_pod_name istio-ingressgateway istio-system)\" bash\n\ncurl localhost:15000/help\ncurl localhost:15000/stats\ncurl localhost:15000/listeners\ncurl localhost:15000/clusters\ncurl localhost:15000/server_info\n\n\n"
  },
  {
    "path": "istio-workshop/5_chaos/3_proxy.sh",
    "content": "#!/bin/bash\n\n\necho\necho \"Open the file 2_gw.sh\"\necho\n\nexit 1\n\n\nfunction get_pod_name {\n  name=\"$1\"\n  ns=\"${2:-\"default\"}\"\n  kubectl get pod -n \"$ns\" -l app=\"$name\" -o jsonpath='{.items[0].metadata.name}'\n}\n\nkubectl exec -it \"$(get_pod_name productpage default)\" -c istio-proxy sh\n\nps aux\n\ncat /etc/istio/proxy/envoy-rev0.json\n"
  },
  {
    "path": "istio-workshop/6_webhook/1_istio-sidecar-injector.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\nkubectl -n istio-system describe configmap istio-sidecar-injector\n\nkubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.config}' > \"$script_dir\"/inject-config.yaml\n\n"
  },
  {
    "path": "istio-workshop/6_webhook/2_busybox-injected.sh",
    "content": "#!/bin/bash\n\nscript_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n\nistioctl kube-inject -f \"$script_dir\"/busybox.yaml > \"$script_dir\"/busybox-injected.yaml\n\n# diff-so-fancy \"$script_dir\"/busybox.yaml \"$script_dir\"/busybox-injected.yaml\ndiff \"$script_dir\"/busybox.yaml \"$script_dir\"/busybox-injected.yaml\n"
  },
  {
    "path": "istio-workshop/6_webhook/busybox-injected.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  annotations:\n    sidecar.istio.io/status: '{\"version\":\"ebf16d3ea0236e4b5cb4d3fc0f01da62e2e6265d005e58f8f6bd43a4fb672fdd\",\"initContainers\":[\"istio-init\"],\"containers\":[\"istio-proxy\"],\"volumes\":[\"istio-envoy\",\"istio-certs\"],\"imagePullSecrets\":null}'\n  creationTimestamp: null\n  name: busybox-test\nspec:\n  containers:\n  - command:\n    - sh\n    - -c\n    - echo Hello Kubernetes! && sleep infinity\n    image: busybox\n    name: busybox-container\n    resources: {}\n  - args:\n    - proxy\n    - sidecar\n    - --configPath\n    - /etc/istio/proxy\n    - --binaryPath\n    - /usr/local/bin/envoy\n    - --serviceCluster\n    - istio-proxy\n    - --drainDuration\n    - 45s\n    - --parentShutdownDuration\n    - 1m0s\n    - --discoveryAddress\n    - istio-pilot.istio-system:15007\n    - --discoveryRefreshDelay\n    - 1s\n    - --zipkinAddress\n    - zipkin.istio-system:9411\n    - --connectTimeout\n    - 10s\n    - --proxyAdminPort\n    - \"15000\"\n    - --controlPlaneAuthPolicy\n    - NONE\n    env:\n    - name: POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: POD_NAMESPACE\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.namespace\n    - name: INSTANCE_IP\n      valueFrom:\n        fieldRef:\n          fieldPath: status.podIP\n    - name: ISTIO_META_POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: ISTIO_META_INTERCEPTION_MODE\n      value: REDIRECT\n    image: docker.io/istio/proxyv2:1.0.4\n    imagePullPolicy: IfNotPresent\n    name: istio-proxy\n    ports:\n    - containerPort: 15090\n      name: http-envoy-prom\n      protocol: TCP\n    resources:\n      requests:\n        cpu: 10m\n    securityContext:\n      readOnlyRootFilesystem: true\n      runAsUser: 1337\n    volumeMounts:\n    - mountPath: /etc/istio/proxy\n      name: istio-envoy\n    - mountPath: /etc/certs/\n      name: istio-certs\n      readOnly: true\n  initContainers:\n  - args:\n    - -p\n    - \"15001\"\n    - -u\n    - \"1337\"\n    - -m\n    - REDIRECT\n    - -i\n    - '*'\n    - -x\n    - \"\"\n    - -b\n    - \"\"\n    - -d\n    - \"\"\n    image: docker.io/istio/proxy_init:1.0.4\n    imagePullPolicy: IfNotPresent\n    name: istio-init\n    resources: {}\n    securityContext:\n      capabilities:\n        add:\n        - NET_ADMIN\n      privileged: true\n  volumes:\n  - emptyDir:\n      medium: Memory\n    name: istio-envoy\n  - name: istio-certs\n    secret:\n      optional: true\n      secretName: istio.default\nstatus: {}\n---\n"
  },
  {
    "path": "istio-workshop/6_webhook/busybox.yaml",
    "content": "apiVersion: v1\nkind: Pod\nmetadata:\n  name: busybox-test\nspec:\n  containers:\n  - name: busybox-container\n    image: busybox\n    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep infinity']"
  },
  {
    "path": "istio-workshop/6_webhook/inject-config.yaml",
    "content": "policy: enabled\ntemplate: |-\n  initContainers:\n  - name: istio-init\n    image: \"docker.io/istio/proxy_init:1.0.4\"\n    args:\n    - \"-p\"\n    - [[ .MeshConfig.ProxyListenPort ]]\n    - \"-u\"\n    - 1337\n    - \"-m\"\n    - [[ annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode ]]\n    - \"-i\"\n    - \"[[ annotation .ObjectMeta `traffic.sidecar.istio.io/includeOutboundIPRanges`  \"*\"  ]]\"\n    - \"-x\"\n    - \"[[ annotation .ObjectMeta `traffic.sidecar.istio.io/excludeOutboundIPRanges`  \"\"  ]]\"\n    - \"-b\"\n    - \"[[ annotation .ObjectMeta `traffic.sidecar.istio.io/includeInboundPorts` (includeInboundPorts .Spec.Containers) ]]\"\n    - \"-d\"\n    - \"[[ excludeInboundPort (annotation .ObjectMeta `status.sidecar.istio.io/port`  0 ) (annotation .ObjectMeta `traffic.sidecar.istio.io/excludeInboundPorts`  \"\" ) ]]\"\n    imagePullPolicy: IfNotPresent\n    securityContext:\n      capabilities:\n        add:\n        - NET_ADMIN\n      privileged: true\n    restartPolicy: Always\n  containers:\n  - name: istio-proxy\n    image: [[ annotation .ObjectMeta `sidecar.istio.io/proxyImage`  \"docker.io/istio/proxyv2:1.0.4\"  ]]\n\n    ports:\n    - containerPort: 15090\n      protocol: TCP\n      name: http-envoy-prom\n\n    args:\n    - proxy\n    - sidecar\n    - --configPath\n    - [[ .ProxyConfig.ConfigPath ]]\n    - --binaryPath\n    - [[ .ProxyConfig.BinaryPath ]]\n    - --serviceCluster\n    [[ if ne \"\" (index .ObjectMeta.Labels \"app\") -]]\n    - [[ index .ObjectMeta.Labels \"app\" ]]\n    [[ else -]]\n    - \"istio-proxy\"\n    [[ end -]]\n    - --drainDuration\n    - [[ formatDuration .ProxyConfig.DrainDuration ]]\n    - --parentShutdownDuration\n    - [[ formatDuration .ProxyConfig.ParentShutdownDuration ]]\n    - --discoveryAddress\n    - [[ annotation .ObjectMeta `sidecar.istio.io/discoveryAddress` .ProxyConfig.DiscoveryAddress ]]\n    - --discoveryRefreshDelay\n    - [[ formatDuration .ProxyConfig.DiscoveryRefreshDelay ]]\n    - --zipkinAddress\n    - [[ .ProxyConfig.ZipkinAddress ]]\n    - --connectTimeout\n    - [[ formatDuration .ProxyConfig.ConnectTimeout ]]\n    - --proxyAdminPort\n    - [[ .ProxyConfig.ProxyAdminPort ]]\n    [[ if gt .ProxyConfig.Concurrency 0 -]]\n    - --concurrency\n    - [[ .ProxyConfig.Concurrency ]]\n    [[ end -]]\n    - --controlPlaneAuthPolicy\n    - [[ annotation .ObjectMeta `sidecar.istio.io/controlPlaneAuthPolicy` .ProxyConfig.ControlPlaneAuthPolicy ]]\n  [[- if (ne (annotation .ObjectMeta `status.sidecar.istio.io/port`  0 ) \"0\") ]]\n    - --statusPort\n    - [[ annotation .ObjectMeta `status.sidecar.istio.io/port`  0  ]]\n    - --applicationPorts\n    - \"[[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/applicationPorts` (applicationPorts .Spec.Containers) ]]\"\n  [[- end ]]\n    env:\n    - name: POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: POD_NAMESPACE\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.namespace\n    - name: INSTANCE_IP\n      valueFrom:\n        fieldRef:\n          fieldPath: status.podIP\n    - name: ISTIO_META_POD_NAME\n      valueFrom:\n        fieldRef:\n          fieldPath: metadata.name\n    - name: ISTIO_META_INTERCEPTION_MODE\n      value: [[ or (index .ObjectMeta.Annotations \"sidecar.istio.io/interceptionMode\") .ProxyConfig.InterceptionMode.String ]]\n    [[ if .ObjectMeta.Annotations ]]\n    - name: ISTIO_METAJSON_ANNOTATIONS\n      value: |\n             [[ toJson .ObjectMeta.Annotations ]]\n    [[ end ]]\n    [[ if .ObjectMeta.Labels ]]\n    - name: ISTIO_METAJSON_LABELS\n      value: |\n             [[ toJson .ObjectMeta.Labels ]]\n    [[ end ]]\n    imagePullPolicy: IfNotPresent\n    [[ if (ne (annotation .ObjectMeta `status.sidecar.istio.io/port`  0 ) \"0\") ]]\n    readinessProbe:\n      httpGet:\n        path: /healthz/ready\n        port: [[ annotation .ObjectMeta `status.sidecar.istio.io/port`  0  ]]\n      initialDelaySeconds: [[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/initialDelaySeconds`  1  ]]\n      periodSeconds: [[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/periodSeconds`  2  ]]\n      failureThreshold: [[ annotation .ObjectMeta `readiness.status.sidecar.istio.io/failureThreshold`  30  ]]\n    [[ end -]]securityContext:\n      \n      readOnlyRootFilesystem: true\n      [[ if eq (annotation .ObjectMeta `sidecar.istio.io/interceptionMode` .ProxyConfig.InterceptionMode) \"TPROXY\" -]]\n      capabilities:\n        add:\n        - NET_ADMIN\n      runAsGroup: 1337\n      [[ else -]]\n      runAsUser: 1337\n      [[ end -]]\n    restartPolicy: Always\n    resources:\n      [[ if (isset .ObjectMeta.Annotations `sidecar.istio.io/proxyCPU`) -]]\n      requests:\n        cpu: \"[[ index .ObjectMeta.Annotations `sidecar.istio.io/proxyCPU` ]]\"\n        memory: \"[[ index .ObjectMeta.Annotations `sidecar.istio.io/proxyMemory` ]]\"\n    [[ else -]]\n      requests:\n        cpu: 10m\n      \n    [[ end -]]\n    volumeMounts:\n    - mountPath: /etc/istio/proxy\n      name: istio-envoy\n    - mountPath: /etc/certs/\n      name: istio-certs\n      readOnly: true\n  volumes:\n  - emptyDir:\n      medium: Memory\n    name: istio-envoy\n  - name: istio-certs\n    secret:\n      optional: true\n      [[ if eq .Spec.ServiceAccountName \"\" -]]\n      secretName: istio.default\n      [[ else -]]\n      secretName: [[ printf \"istio.%s\" .Spec.ServiceAccountName ]]\n      [[ end -]]"
  },
  {
    "path": "istio-workshop/7_network_policies/1_setup.sh",
    "content": "#!/bin/bash\n\nkubectl run nginx --image=nginx --replicas=2\n\n\nkubectl expose deployment nginx --port=80"
  },
  {
    "path": "istio-workshop/7_network_policies/tcpdump.sh",
    "content": "#!/bin/bash\n\nHOST_IP=35.228.232.253\nSSH_KEY=~/.ssh/google_compute_engine\n# ssh into host\nssh -i $SSH_KEY $HOST_IP\n\n# start the toolbox\ntoolbox\n\n# capture paquet\ntcpdump not dst port 22 -w /var/log/dump.pcap\n\n\nexit\n\nexit\n\nCONTAINER_NAME=julien-gcr.io_google-containers_toolbox-20180309-00\n\nscp -i $SSH_KEY $HOST_IP:/var/lib/toolbox/$CONTAINER_NAME/var/log/dump.pcap"
  },
  {
    "path": "istio-workshop/8_nodes/iptables.sh",
    "content": "#!/bin/bash\n\n# ssh -i ~/.ssh/google_compute_engine 35.228.232.253\n\n# toolbox\n\n# iptables --numeric --line-numbers --verbose --list --table nat\n\n"
  },
  {
    "path": "istio-workshop/8_nodes/proxy_init.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2017, 2018 Istio Authors. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#    http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n################################################################################\n#\n# Initialization script responsible for setting up port forwarding for Istio sidecar.\n\nfunction usage() {\n  echo \"${0} -p PORT -u UID -g GID [-m mode] [-b ports] [-d ports] [-i CIDR] [-x CIDR] [-h]\"\n  echo ''\n  # shellcheck disable=SC2016\n  echo '  -p: Specify the envoy port to which redirect all TCP traffic (default $ENVOY_PORT = 15001)'\n  echo '  -u: Specify the UID of the user for which the redirection is not'\n  echo '      applied. Typically, this is the UID of the proxy container'\n  # shellcheck disable=SC2016\n  echo '      (default to uid of $ENVOY_USER, uid of istio_proxy, or 1337)'\n  echo '  -g: Specify the GID of the user for which the redirection is not'\n  echo '      applied. (same default value as -u param)'\n  echo '  -m: The mode used to redirect inbound connections to Envoy, either \"REDIRECT\" or \"TPROXY\"'\n  # shellcheck disable=SC2016\n  echo '      (default to $ISTIO_INBOUND_INTERCEPTION_MODE)'\n  echo '  -b: Comma separated list of inbound ports for which traffic is to be redirected to Envoy (optional). The'\n  echo '      wildcard character \"*\" can be used to configure redirection for all ports. An empty list will disable'\n  # shellcheck disable=SC2016\n  echo '      all inbound redirection (default to $ISTIO_INBOUND_PORTS)'\n  echo '  -d: Comma separated list of inbound ports to be excluded from redirection to Envoy (optional). Only applies'\n  # shellcheck disable=SC2016\n  echo '      when all inbound traffic (i.e. \"*\") is being redirected (default to $ISTIO_LOCAL_EXCLUDE_PORTS)'\n  echo '  -i: Comma separated list of IP ranges in CIDR form to redirect to envoy (optional). The wildcard'\n  echo '      character \"*\" can be used to redirect all outbound traffic. An empty list will disable all outbound'\n  # shellcheck disable=SC2016\n  echo '      redirection (default to $ISTIO_SERVICE_CIDR)'\n  echo '  -x: Comma separated list of IP ranges in CIDR form to be excluded from redirection. Only applies when all '\n  # shellcheck disable=SC2016\n  echo '      outbound traffic (i.e. \"*\") is being redirected (default to $ISTIO_SERVICE_EXCLUDE_CIDR).'\n  echo ''\n  # shellcheck disable=SC2016\n  echo 'Using environment variables in $ISTIO_SIDECAR_CONFIG (default: /var/lib/istio/envoy/sidecar.env)'\n}\n\nfunction dump {\n    iptables-save\n}\n\ntrap dump EXIT\n\n# Use a comma as the separator for multi-value arguments.\nIFS=,\n\n# The cluster env can be used for common cluster settings, pushed to all VMs in the cluster.\n# This allows separating per-machine settings (the list of inbound ports, local path overrides) from cluster wide\n# settings (CIDR range)\nISTIO_CLUSTER_CONFIG=${ISTIO_CLUSTER_CONFIG:-/var/lib/istio/envoy/cluster.env}\nif [ -r \"${ISTIO_CLUSTER_CONFIG}\" ]; then\n  # shellcheck disable=SC1090\n  . \"${ISTIO_CLUSTER_CONFIG}\"\nfi\n\nISTIO_SIDECAR_CONFIG=${ISTIO_SIDECAR_CONFIG:-/var/lib/istio/envoy/sidecar.env}\nif [ -r \"${ISTIO_SIDECAR_CONFIG}\" ]; then\n  # shellcheck disable=SC1090\n  . \"${ISTIO_SIDECAR_CONFIG}\"\nfi\n\n# TODO: load all files from a directory, similar with ufw, to make it easier for automated install scripts\n# Ideally we should generate ufw (and similar) configs as well, in case user already has an iptables solution.\n\nPROXY_PORT=${ENVOY_PORT:-15001}\nPROXY_UID=\nPROXY_GID=\nINBOUND_INTERCEPTION_MODE=${ISTIO_INBOUND_INTERCEPTION_MODE}\nINBOUND_TPROXY_MARK=${ISTIO_INBOUND_TPROXY_MARK:-1337}\nINBOUND_TPROXY_ROUTE_TABLE=${ISTIO_INBOUND_TPROXY_ROUTE_TABLE:-133}\nINBOUND_PORTS_INCLUDE=${ISTIO_INBOUND_PORTS-}\nINBOUND_PORTS_EXCLUDE=${ISTIO_LOCAL_EXCLUDE_PORTS-}\nOUTBOUND_IP_RANGES_INCLUDE=${ISTIO_SERVICE_CIDR-}\nOUTBOUND_IP_RANGES_EXCLUDE=${ISTIO_SERVICE_EXCLUDE_CIDR-}\n\nwhile getopts \":p:u:g:m:b:d:i:x:h\" opt; do\n  case ${opt} in\n    p)\n      PROXY_PORT=${OPTARG}\n      ;;\n    u)\n      PROXY_UID=${OPTARG}\n      ;;\n    g)\n      PROXY_GID=${OPTARG}\n      ;;\n    m)\n      INBOUND_INTERCEPTION_MODE=${OPTARG}\n      ;;\n    b)\n      INBOUND_PORTS_INCLUDE=${OPTARG}\n      ;;\n    d)\n      INBOUND_PORTS_EXCLUDE=${OPTARG}\n      ;;\n    i)\n      OUTBOUND_IP_RANGES_INCLUDE=${OPTARG}\n      ;;\n    x)\n      OUTBOUND_IP_RANGES_EXCLUDE=${OPTARG}\n      ;;\n    h)\n      usage\n      exit 0\n      ;;\n    \\?)\n      echo \"Invalid option: -$OPTARG\" >&2\n      usage\n      exit 1\n      ;;\n  esac\ndone\n\n# TODO: more flexibility - maybe a whitelist of users to be captured for output instead of a blacklist.\nif [ -z \"${PROXY_UID}\" ]; then\n  # Default to the UID of ENVOY_USER and root\n  if ! PROXY_UID=$(id -u \"${ENVOY_USER:-istio-proxy}\"); then\n     PROXY_UID=\"1337\"\n  fi\n  # If ENVOY_UID is not explicitly defined (as it would be in k8s env), we add root to the list,\n  # for ca agent.\n  PROXY_UID=${PROXY_UID},0\nfi\n# for TPROXY as its uid and gid are same\nif [ -z \"${PROXY_GID}\" ]; then\nPROXY_GID=${PROXY_UID}\nfi\n\n\n# Remove the old chains, to generate new configs.\niptables -t nat -D PREROUTING -p tcp -j ISTIO_INBOUND 2>/dev/null\niptables -t mangle -D PREROUTING -p tcp -j ISTIO_INBOUND 2>/dev/null\niptables -t nat -D OUTPUT -p tcp -j ISTIO_OUTPUT 2>/dev/null\n\n# Flush and delete the istio chains.\niptables -t nat -F ISTIO_OUTPUT 2>/dev/null\niptables -t nat -X ISTIO_OUTPUT 2>/dev/null\niptables -t nat -F ISTIO_INBOUND 2>/dev/null\niptables -t nat -X ISTIO_INBOUND 2>/dev/null\niptables -t mangle -F ISTIO_INBOUND 2>/dev/null\niptables -t mangle -X ISTIO_INBOUND 2>/dev/null\niptables -t mangle -F ISTIO_DIVERT 2>/dev/null\niptables -t mangle -X ISTIO_DIVERT 2>/dev/null\niptables -t mangle -F ISTIO_TPROXY 2>/dev/null\niptables -t mangle -X ISTIO_TPROXY 2>/dev/null\n\n# Must be last, the others refer to it\niptables -t nat -F ISTIO_REDIRECT 2>/dev/null\niptables -t nat -X ISTIO_REDIRECT 2>/dev/null\niptables -t nat -F ISTIO_IN_REDIRECT 2>/dev/null\niptables -t nat -X ISTIO_IN_REDIRECT 2>/dev/null\n\nif [ \"${1:-}\" = \"clean\" ]; then\n  echo \"Only cleaning, no new rules added\"\n  exit 0\nfi\n\n# Dump out our environment for debugging purposes.\necho \"Environment:\"\necho \"------------\"\necho \"ENVOY_PORT=${ENVOY_PORT-}\"\necho \"ISTIO_INBOUND_INTERCEPTION_MODE=${ISTIO_INBOUND_INTERCEPTION_MODE-}\"\necho \"ISTIO_INBOUND_TPROXY_MARK=${ISTIO_INBOUND_TPROXY_MARK-}\"\necho \"ISTIO_INBOUND_TPROXY_ROUTE_TABLE=${ISTIO_INBOUND_TPROXY_ROUTE_TABLE-}\"\necho \"ISTIO_INBOUND_PORTS=${ISTIO_INBOUND_PORTS-}\"\necho \"ISTIO_LOCAL_EXCLUDE_PORTS=${ISTIO_LOCAL_EXCLUDE_PORTS-}\"\necho \"ISTIO_SERVICE_CIDR=${ISTIO_SERVICE_CIDR-}\"\necho \"ISTIO_SERVICE_EXCLUDE_CIDR=${ISTIO_SERVICE_EXCLUDE_CIDR-}\"\necho\necho \"Variables:\"\necho \"----------\"\necho \"PROXY_PORT=${PROXY_PORT}\"\necho \"INBOUND_CAPTURE_PORT=${INBOUND_CAPTURE_PORT:-$PROXY_PORT}\"\necho \"PROXY_UID=${PROXY_UID}\"\necho \"INBOUND_INTERCEPTION_MODE=${INBOUND_INTERCEPTION_MODE}\"\necho \"INBOUND_TPROXY_MARK=${INBOUND_TPROXY_MARK}\"\necho \"INBOUND_TPROXY_ROUTE_TABLE=${INBOUND_TPROXY_ROUTE_TABLE}\"\necho \"INBOUND_PORTS_INCLUDE=${INBOUND_PORTS_INCLUDE}\"\necho \"INBOUND_PORTS_EXCLUDE=${INBOUND_PORTS_EXCLUDE}\"\necho \"OUTBOUND_IP_RANGES_INCLUDE=${OUTBOUND_IP_RANGES_INCLUDE}\"\necho \"OUTBOUND_IP_RANGES_EXCLUDE=${OUTBOUND_IP_RANGES_EXCLUDE}\"\necho\n\nINBOUND_CAPTURE_PORT=${INBOUND_CAPTURE_PORT:-$PROXY_PORT}\n\nset -o errexit\nset -o nounset\nset -o pipefail\nset -x # echo on\n\n# Create a new chain for redirecting outbound traffic to the common Envoy port.\n# In both chains, '-j RETURN' bypasses Envoy and '-j ISTIO_REDIRECT'\n# redirects to Envoy.\niptables -t nat -N ISTIO_REDIRECT\niptables -t nat -A ISTIO_REDIRECT -p tcp -j REDIRECT --to-port \"${PROXY_PORT}\"\n\n# Use this chain also for redirecting inbound traffic to the common Envoy port\n# when not using TPROXY.\niptables -t nat -N ISTIO_IN_REDIRECT\niptables -t nat -A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-port \"${INBOUND_CAPTURE_PORT}\"\n\n# Handling of inbound ports. Traffic will be redirected to Envoy, which will process and forward\n# to the local service. If not set, no inbound port will be intercepted by istio iptables.\nif [ -n \"${INBOUND_PORTS_INCLUDE}\" ]; then\n  if [ \"${INBOUND_INTERCEPTION_MODE}\" = \"TPROXY\" ] ; then\n    # When using TPROXY, create a new chain for routing all inbound traffic to\n    # Envoy. Any packet entering this chain gets marked with the ${INBOUND_TPROXY_MARK} mark,\n    # so that they get routed to the loopback interface in order to get redirected to Envoy.\n    # In the ISTIO_INBOUND chain, '-j ISTIO_DIVERT' reroutes to the loopback\n    # interface.\n    # Mark all inbound packets.\n    iptables -t mangle -N ISTIO_DIVERT\n    iptables -t mangle -A ISTIO_DIVERT -j MARK --set-mark \"${INBOUND_TPROXY_MARK}\"\n    iptables -t mangle -A ISTIO_DIVERT -j ACCEPT\n\n    # Route all packets marked in chain ISTIO_DIVERT using routing table ${INBOUND_TPROXY_ROUTE_TABLE}.\n    ip -f inet rule add fwmark \"${INBOUND_TPROXY_MARK}\" lookup \"${INBOUND_TPROXY_ROUTE_TABLE}\"\n    # In routing table ${INBOUND_TPROXY_ROUTE_TABLE}, create a single default rule to route all traffic to\n    # the loopback interface.\n    ip -f inet route add local default dev lo table \"${INBOUND_TPROXY_ROUTE_TABLE}\" || ip route show table all\n\n    # Create a new chain for redirecting inbound traffic to the common Envoy\n    # port.\n    # In the ISTIO_INBOUND chain, '-j RETURN' bypasses Envoy and\n    # '-j ISTIO_TPROXY' redirects to Envoy.\n    iptables -t mangle -N ISTIO_TPROXY\n    iptables -t mangle -A ISTIO_TPROXY ! -d 127.0.0.1/32 -p tcp -j TPROXY --tproxy-mark \"${INBOUND_TPROXY_MARK}/0xffffffff\" --on-port \"${PROXY_PORT}\"\n\n    table=mangle\n  else\n    table=nat\n  fi\n  iptables -t ${table} -N ISTIO_INBOUND\n  iptables -t ${table} -A PREROUTING -p tcp -j ISTIO_INBOUND\n\n  if [ \"${INBOUND_PORTS_INCLUDE}\" == \"*\" ]; then\n    # Makes sure SSH is not redirected\n    iptables -t ${table} -A ISTIO_INBOUND -p tcp --dport 22 -j RETURN\n    # Apply any user-specified port exclusions.\n    if [ -n \"${INBOUND_PORTS_EXCLUDE}\" ]; then\n      for port in ${INBOUND_PORTS_EXCLUDE}; do\n        iptables -t ${table} -A ISTIO_INBOUND -p tcp --dport \"${port}\" -j RETURN\n      done\n    fi\n    # Redirect remaining inbound traffic to Envoy.\n    if [ \"${INBOUND_INTERCEPTION_MODE}\" = \"TPROXY\" ]; then\n      # If an inbound packet belongs to an established socket, route it to the\n      # loopback interface.\n      iptables -t mangle -A ISTIO_INBOUND -p tcp -m socket -j ISTIO_DIVERT || echo \"No socket match support\"\n      # Otherwise, it's a new connection. Redirect it using TPROXY.\n      iptables -t mangle -A ISTIO_INBOUND -p tcp -j ISTIO_TPROXY\n    else\n      iptables -t nat -A ISTIO_INBOUND -p tcp -j ISTIO_IN_REDIRECT\n    fi\n  else\n    # User has specified a non-empty list of ports to be redirected to Envoy.\n    for port in ${INBOUND_PORTS_INCLUDE}; do\n      if [ \"${INBOUND_INTERCEPTION_MODE}\" = \"TPROXY\" ]; then\n        iptables -t mangle -A ISTIO_INBOUND -p tcp --dport \"${port}\" -m socket -j ISTIO_DIVERT || echo \"No socket match support\"\n        iptables -t mangle -A ISTIO_INBOUND -p tcp --dport \"${port}\" -m socket -j ISTIO_DIVERT || echo \"No socket match support\"\n        iptables -t mangle -A ISTIO_INBOUND -p tcp --dport \"${port}\" -j ISTIO_TPROXY\n      else\n        iptables -t nat -A ISTIO_INBOUND -p tcp --dport \"${port}\" -j ISTIO_IN_REDIRECT\n      fi\n    done\n  fi\nfi\n\n# TODO: change the default behavior to not intercept any output - user may use http_proxy or another\n# iptables wrapper (like ufw). Current default is similar with 0.1\n\n# Create a new chain for selectively redirecting outbound packets to Envoy.\niptables -t nat -N ISTIO_OUTPUT\n\n# Jump to the ISTIO_OUTPUT chain from OUTPUT chain for all tcp traffic.\niptables -t nat -A OUTPUT -p tcp -j ISTIO_OUTPUT\n\n# Redirect app calls to back itself via Envoy when using the service VIP or endpoint\n# address, e.g. appN => Envoy (client) => Envoy (server) => appN.\niptables -t nat -A ISTIO_OUTPUT -o lo ! -d 127.0.0.1/32 -j ISTIO_REDIRECT\n\nfor uid in ${PROXY_UID}; do\n  # Avoid infinite loops. Don't redirect Envoy traffic directly back to\n  # Envoy for non-loopback traffic.\n  iptables -t nat -A ISTIO_OUTPUT -m owner --uid-owner ${uid} -j RETURN\ndone\n\nfor gid in ${PROXY_GID}; do\n  # Avoid infinite loops. Don't redirect Envoy traffic directly back to\n  # Envoy for non-loopback traffic.\n  iptables -t nat -A ISTIO_OUTPUT -m owner --gid-owner ${gid} -j RETURN\ndone\n\n# Skip redirection for Envoy-aware applications and\n# container-to-container traffic both of which explicitly use\n# localhost.\niptables -t nat -A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN\n\n# Apply outbound IP exclusions. Must be applied before inclusions.\nif [ -n \"${OUTBOUND_IP_RANGES_EXCLUDE}\" ]; then\n  for cidr in ${OUTBOUND_IP_RANGES_EXCLUDE}; do\n    iptables -t nat -A ISTIO_OUTPUT -d \"${cidr}\" -j RETURN\n  done\nfi\n\n# Apply outbound IP inclusions.\nif [ \"${OUTBOUND_IP_RANGES_INCLUDE}\" == \"*\" ]; then\n  # Wildcard specified. Redirect all remaining outbound traffic to Envoy.\n  iptables -t nat -A ISTIO_OUTPUT -j ISTIO_REDIRECT\nelif [ -n \"${OUTBOUND_IP_RANGES_INCLUDE}\" ]; then\n  # User has specified a non-empty list of cidrs to be redirected to Envoy.\n  for cidr in ${OUTBOUND_IP_RANGES_INCLUDE}; do\n    iptables -t nat -A ISTIO_OUTPUT -d \"${cidr}\" -j ISTIO_REDIRECT\n  done\n  # All other traffic is not redirected.\n  iptables -t nat -A ISTIO_OUTPUT -j RETURN\nfi\n\n# If ENABLE_INBOUND_IPV6 is unset (default unset), restrict IPv6 traffic.\nset +o nounset\nif [ -z \"${ENABLE_INBOUND_IPV6}\" ]; then\n  # Drop all inbound traffic except established connections.\n  # TODO: support receiving IPv6 traffic in the same way as IPv4.\n  ip6tables -F INPUT || true\n  ip6tables -A INPUT -m state --state ESTABLISHED -j ACCEPT || true\n  ip6tables -A INPUT -j REJECT || true\nfi"
  },
  {
    "path": "istio-workshop/README.md",
    "content": "# Istio Workshop\n\nWork in progress"
  },
  {
    "path": "istio-workshop/cleanup.sh",
    "content": "#!/bin/bash\n\n# script_dir=$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\n# find \"$script_dir\" -name '99_remove.sh' | xargs bash\n\nNAMESPACE=${1:-\"default\"}\n\nprotos=( destinationrules virtualservices gateways )\nfor proto in \"${protos[@]}\"; do\n  for resource in $(istioctl get -n \"${NAMESPACE}\" \"$proto\" | awk 'NR>1{print $1}'); do\n    istioctl delete -n \"${NAMESPACE}\" \"$proto\" \"$resource\";\n  done\ndone"
  },
  {
    "path": "istio-workshop/slides.md",
    "content": "---\ntheme : \"moon\"\ntransition: \"slide\"\nhighlightTheme: \"zenburn\"\n---\n\n# Automating\n\n# Chaos Engineering\n\n# with a service mesh\n\n---\n\n## PLAN\n\n- [  ] from code to service (mesh)\n- [  ] chaos engineering\n- [  ] automation with chaostoolkit\n\n---\n\n### Sylvain ( ChaosIQ )\n\n<img height=\"500\" src=\"/img/chaostoolkit.png\" style=\"border: none\" alt=\"Chaos toolkit\">\n\n\nhttps://chaostoolkit.org/\n\n---\n\n### Julien ( 56k.cloud )\n\n<img height=\"500\" src=\"/img/alps.jpg\" alt=\"docker pull alps\">\n\n---\n\n### How long\n\n### from monolith to microservices ?\n\n---\n\n### 8 fallacies of distributed computing\n\n1. The network is reliable. <!-- .element: class=\"fragment grow highlight-blue\" -->\n1. Latency is zero.\n1. Bandwidth is infinite.\n1. The network is secure.\n1. Topology doesn't change.\n1. There is one administrator.\n1. Transport cost is zero.\n1. The network is homogeneous.\n\n[source link](https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing)\n\n[RFC 1925](https://tools.ietf.org/html/rfc1925) ( 12 Networking Truths )\n\n---\n\n## containers concerns\n\n- Scaling up and down\n- Redundancy\n- Scheduling\n- Service Discovery\n\n\n- Resiliency\n- Rolling out and back\n- Health checks\n- Secret and config\n\n<br>\n<h3 class=\"fragment\"> 👉  &nbsp;&nbsp; kubernetes <h4 class=\"fragment\">but ... </h4></h3>\n\n---\n\n## Kubernetes concerns\n\n- Logging\n- Tracing\n- Metrics\n- Canary release\n- Service identity and Auth\n\n\n- Circuit breaking\n- Traffic flow and policies\n- Failover\n- Fault injection\n- ...\n\n<br>\n\n### 👉 &nbsp;&nbsp; use code?    <!-- .element: class=\"fragment fade-up\" -->\n\n---\n\n## Code drawbacks\n\n- combination language>framework>version>feature\n- maintain, patch, upgrade, migrate, retire\n- language / framework / version lock-in\n- code pollution and complexity (+ testing)\n- deployment / rolling update\n- debugging\n\n---\n\n## Extract code\n\n### remove concerns from the application\n\n### 👉 &nbsp;&nbsp; move it the infra  <!-- .element: class=\"fragment fade-up\" -->\n\n---\n\n## Sidecar proxy\n\n\n<img style=\"filter: invert(.9) brightness(1.4);width:60vh;\" alt=\"The overall architecture of an Istio-based application.\" src=\"/img/side-car-proxy.png\" title=\"Istio Architecture\">\n\n---\n\n<img width=\"50%\" src=\"/img/envoyproxy.png\" alt=\"envoy proxy\">\n\n> The network should be transparent to applications. <br>\n>When network and application problems do occur, it should be easy to determine the source of the problem.\n\n\n---\n\n### How to manage a fleet of proxy\n\n## 👉 service mesh <!-- .element: class=\"fragment fade-up\" -->\n\n---\n\n### What is a service mesh\n\n( What problems does it solve ) <!-- .element: class=\"fragment\" -->\n\n<br/>\n\n### Communication between services <!-- .element: class=\"fragment\" -->\n\n<br/>\n\n<h3 class=\"fragment\" style=\"font-style: italic\">A network for services, not bytes</h3>\n\n---\n\n# demo\n\n---\n\n<img src=\"/img/qa.png\" alt=\"use case\" style=\"border: none\">\n\n---\n\n<img src=\"/img/Ytho.gif\" alt=\"use case\">\n\n<!-- https://imgur.com/gallery/A1SeJ8d -->\n\n---\n\n<img height=\"300\" src=\"/img/define_sli_slo.jpg\" alt=\"define SLI and SLO\">\n\n[source: new relic blog](https://blog.newrelic.com/engineering/best-practices-for-setting-slos-and-slis-for-modern-complex-systems/)\n\n\n---\n"
  }
]